diff --git a/.gitignore b/.gitignore index 01d0ab170..1fac25c82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # *.pyc *.o +*.lo *.mod *.a *.exe diff --git a/jobs/JHAFS_ANALYSIS b/jobs/JHAFS_ANALYSIS new file mode 100755 index 000000000..039e54ec9 --- /dev/null +++ b/jobs/JHAFS_ANALYSIS @@ -0,0 +1,63 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use $HOMEhafs/sorc/hafs_gsi.fd/modulefiles + module load modulefile.ProdGSI.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export DATA=${WORKhafs}/analysis + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_analysis.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ANALYSIS_VR b/jobs/JHAFS_ANALYSIS_VR new file mode 100755 index 000000000..20ecb7977 --- /dev/null +++ b/jobs/JHAFS_ANALYSIS_VR @@ -0,0 +1,73 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use $HOMEhafs/sorc/hafs_gsi.fd/modulefiles + module load modulefile.ProdGSI.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} + +export ENSDA=${ENSDA:-NO} +export FGAT=${FGAT:-NO} +if [ ${ENSDA} = YES ]; then + export ENSID=${ENSID:-001} + export DATA=${WORKhafs}/analysis_vr_ens/mem${ENSID} +else + if [ ${FGAT} = YES ]; then + export DATA=${WORKhafs}/analysis_vr_${FGAT_HR:-00} + else + export DATA=${WORKhafs}/analysis_vr + fi +fi + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_analysis_vr.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ATM_IC b/jobs/JHAFS_ATM_IC new file mode 100755 index 000000000..08de1cd63 --- /dev/null +++ b/jobs/JHAFS_ATM_IC @@ -0,0 +1,73 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles + module load build.${machine}.intel + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +# Deterministic or ensemble +if [ ${ENSDA} != YES ]; then + export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres} + export DATA=${WORKhafs}/atm_ic +else + export ENSID=${ENSID:-001} + export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres_ens/mem${ENSID}} + export DATA=${WORKhafs}/atm_ic_ens/mem${ENSID} +fi + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $OUTDIR $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_atm_ic.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ATM_INIT b/jobs/JHAFS_ATM_INIT new file mode 100755 index 000000000..d5e162450 --- /dev/null +++ b/jobs/JHAFS_ATM_INIT @@ -0,0 +1,85 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_forecast.fd/modulefiles + module load ufs_${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +# Deterministic or ensemble +if [ "${ENSDA}" != YES ]; then + export FIXgrid=${FIXgrid:-${WORKhafs}/intercom/grid} + export INPdir=${INPdir:-${WORKhafs}/intercom/chgres} + export DATA=${WORKhafs}/atm_init + export RESTARTout=${COMhafs}/RESTART_init +else + export ENSID=${ENSID:-001} + export FIXgrid=${FIXgrid:-${WORKhafs}/intercom/grid_ens} + export INPdir=${INPdir:-${WORKhafs}/intercom/chgres_ens/mem${ENSID}} + export DATA=${WORKhafs}/atm_init_ens/mem${ENSID} + export RESTARTout=${COMhafs}/RESTART_init_ens/mem${ENSID} +fi + +#export NHRS=$(echo "${dt_atmos}/3600" | bc -l) +export NHRS=$(awk "BEGIN {print ${dt_atmos}/3600*2}") +export restart_interval="$(awk "BEGIN {print ${dt_atmos}/3600}") 6" +export warm_start_opt=0 +export RUN_GSI=NO +export RUN_GSI_VR=NO +export RUN_GSI_VR_ENS=NO +export RUN_ENKF=NO +export run_ocean=no + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_forecast.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ATM_LBC b/jobs/JHAFS_ATM_LBC new file mode 100755 index 000000000..98f4dae60 --- /dev/null +++ b/jobs/JHAFS_ATM_LBC @@ -0,0 +1,76 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles + module load build.${machine}.intel + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export BC_GROUPN=${BC_GROUPN:-6} +export BC_GROUPI=$( printf "%03d" "${BC_GROUPI:-001}" ) + +# Deterministic or ensemble +if [ ${ENSDA} != YES ]; then + export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres} + export DATA=${WORKhafs}/atm_lbc${BC_GROUPI} +else + export ENSID=${ENSID:-001} + export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres_ens/mem${ENSID}} + export DATA=${WORKhafs}/atm_lbc${BC_GROUPI}_ens/mem${ENSID} +fi + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $OUTDIR $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_atm_lbc.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ATM_POST b/jobs/JHAFS_ATM_POST new file mode 100755 index 000000000..e2fb38443 --- /dev/null +++ b/jobs/JHAFS_ATM_POST @@ -0,0 +1,80 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_post.fd/modulefiles + module load ${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +# Deterministic or ensemble +if [ ${ENSDA} = YES ]; then + export ENSID=${ENSID:-001} + export INPdir=${INPdir:-${WORKhafs}/forecast_ens/mem${ENSID}} + export DATA=${WORKhafs}/atm_post_ens/mem${ENSID} + export COMOUTpost=${COMhafs}/post_ens/mem${ENSID} + export intercom=${WORKhafs}/intercom/post_ens/mem${ENSID} +else + export INPdir=${INPdir:-${WORKhafs}/forecast} + export DATA=${WORKhafs}/atm_post + export COMOUTpost=${COMhafs} + export intercom=${WORKhafs}/intercom/post +fi + +export SENDCOM=${SENDCOM:-YES} +export SCRUBDATA=${SCRUBDATA:-YES} + +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA + rm -f $INPdir/postf??? + rm -rf ${intercom} +fi +mkdir -p ${COMOUTpost} +mkdir -p ${intercom} +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_atm_post.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ATM_PREP b/jobs/JHAFS_ATM_PREP new file mode 100755 index 000000000..19b074078 --- /dev/null +++ b/jobs/JHAFS_ATM_PREP @@ -0,0 +1,74 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles + module load build.${machine}.intel + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +# Deterministic or ensemble +if [ "${ENSDA}" != YES ]; then + export CASE=${CASE:-C768} + export CRES=`echo $CASE | cut -c 2-` + export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/grid/${CASE}} + export DATA=${WORKhafs}/atm_prep +else + export CASE=${CASE_ENS:-C768} + export CRES=`echo $CASE | cut -c 2-` + export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/grid_ens/${CASE}} + export DATA=${WORKhafs}/atm_prep_ens +fi + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $OUTDIR $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_atm_prep.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_CHGRES_BC b/jobs/JHAFS_CHGRES_BC deleted file mode 100755 index c16143275..000000000 --- a/jobs/JHAFS_CHGRES_BC +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/sh - -set -xe - -date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or stand alone regional -export ictype=${ictype:-gfsnemsio} # gfsnemsio -export bctype=${bctype:-gfsnemsio} # gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2_0p50, gfsgrib2_1p00 -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -if [ "${gtype}" != "regional" ]; then - echo "INFO: ${gtype} not a regional run." - echo "INFO: No need to run chgres_bc." - echo "INFO: Exitting." - exit -fi - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} -export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -export WGRIB2=${WGRIB2:-wgrib2} -export CHGRESCUBEEXEC=${EXEChafs}/hafs_chgres_cube.x - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.run.${machine} - if [ "$machine" = wcoss_dell_p3 ]; then - module unload NetCDF - module unload HDF5-serial - fi - #source ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles/build.${machine} - module use ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles - module load build.${machine}.intel - module list -fi - -##################################### -# Set up job node/core/run environment variables -##################################### -source ${USHhafs}/hafs_runcmd.sh.inc - -#################################### -# Run setpdy and initialize PDY variables -#################################### -#setpdy.sh -#. ./PDY - -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} - -##################################### -# Working directories -##################################### -export BC_GROUPN=${BC_GROUPN:-6} -export BC_GROUPI=$( printf "%03d" "${BC_GROUPI:-001}" ) - -export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres} -export DATA=${WORKhafs}/chgres_bc${BC_GROUPI} - -export SCRUBDATA=${SCRUBDATA:-YES} - -if [ "${SCRUBDATA}" = YES ]; then - rm -rf $DATA -fi - -mkdir -p $OUTDIR $DATA -cd $DATA - -##################################### -# Define COM directories -##################################### -#export COMROOT=${COMROOT:-/gpfs/hps/nco/ops/com} -#export COMgfs=${COMgfs:-/${COMROOT}/gfs/prod} -export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} -if [ $GFSVER = "PROD2021" ]; then - export INIDIR=${COMgfs}/gfs.$PDY/$cyc/atmos -elif [ $GFSVER = "PROD2019" ]; then - export INIDIR=${COMgfs}/gfs.$PDY/$cyc -else - export INIDIR=${COMgfs}/gfs.$PDY/$cyc -fi - -##################################### -# Generate the BCs -##################################### -export REGIONAL=2 - -export FHRB=$(( ${BC_GROUPI} * ${NBDYHRS} )) -export FHRI=$(( ${BC_GROUPN} * ${NBDYHRS} )) -export FHRE=${NHRS} - -##################################### -# Execute the script. -${HOMEhafs}/scripts/exhafs_chgres_bc.sh -export err=$? -##################################### - -exit diff --git a/jobs/JHAFS_CHGRES_IC b/jobs/JHAFS_CHGRES_IC deleted file mode 100755 index a39a36daa..000000000 --- a/jobs/JHAFS_CHGRES_IC +++ /dev/null @@ -1,125 +0,0 @@ -#!/bin/sh - -set -xe - -date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or stand alone regional -export ictype=${ictype:-gfsnemsio} # gfsnemsio -export bctype=${bctype:-gfsnemsio} # gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2_0p50, gfsgrib2_1p00 -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} -export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -export WGRIB2=${WGRIB2:-wgrib2} -export CHGRESCUBEEXEC=${EXEChafs}/hafs_chgres_cube.x - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.run.${machine} - if [ "$machine" = wcoss_dell_p3 ]; then - module unload NetCDF - module unload HDF5-serial - fi - #source ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles/build.${machine} - module use ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles - module load build.${machine}.intel - module list -fi - -##################################### -# Set up job node/core/run environment variables -##################################### -source ${USHhafs}/hafs_runcmd.sh.inc - -#################################### -# Run setpdy and initialize PDY variables -#################################### -#setpdy.sh -#. ./PDY - -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} - -##################################### -# Working directories -##################################### -export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres} -export DATA=${WORKhafs}/chgres_ic - -export SCRUBDATA=${SCRUBDATA:-YES} - -if [ "${SCRUBDATA}" = YES ]; then - rm -rf $DATA -fi - -mkdir -p $OUTDIR $DATA -cd $DATA - -##################################### -# Define COM directories -##################################### -#export COMROOT=${COMROOT:-/gpfs/hps/nco/ops/com} -#export COMgfs=${COMgfs:-/${COMROOT}/gfs/prod} -export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} -if [ $GFSVER = "PROD2021" ]; then - export INIDIR=${COMgfs}/gfs.$PDY/$cyc/atmos -elif [ $GFSVER = "PROD2019" ]; then - export INIDIR=${COMgfs}/gfs.$PDY/$cyc -else - export INIDIR=${COMgfs}/gfs.$PDY/$cyc -fi - -##################################### -# Generate the ICs and BC hour 0 -##################################### -if [ $gtype = regional ] ; then - export REGIONAL=1 - export HALO=4 -else -# -# for gtype = uniform, stretch, or nest -# - export REGIONAL=0 -fi - -##################################### -# Execute the script. -${HOMEhafs}/scripts/exhafs_chgres_ic.sh -export err=$? -##################################### - -exit $err diff --git a/jobs/JHAFS_EMCGRAPHICS b/jobs/JHAFS_EMCGRAPHICS index affb11ad9..a7c2274e5 100755 --- a/jobs/JHAFS_EMCGRAPHICS +++ b/jobs/JHAFS_EMCGRAPHICS @@ -1,96 +1,74 @@ #!/bin/sh -set -xe - date +export PS4='+ $SECONDS + ' +set -xue -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export NOUTHRS=${NOUTHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or regional -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} +export HOMEhafs=${HOMEhafs:?} export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} -export HOMEgraph=${HOMEgraph:-${HOMEhafs}/sorc/hafs_graphics.fd/emc_graphics} -export USHgraph=${USHgraph:-${HOMEgraph}/ush} -export WORKgraph=${WORKgraph:-${COMhafs}/../../../${YMDH}/${STORMID}/emc_graphics} -export COMgraph=${COMgraph:-${COMhafs}/emc_graphics} +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} -export ADECKgraph=${ADECKhafs:-/mnt/lfs4/HFIP/hwrf-data/hwrf-input/abdeck/aid} -export BDECKgraph=${BDECKhafs:-/mnt/lfs4/HFIP/hwrf-data/hwrf-input/abdeck/btk} -export SYNDAThafs=${SYNDAThafs:-/lfs4/HFIP/hwrf-data/hwrf-input/SYNDAT-PLUS} - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - module use ${HOMEgraph}/modulefiles +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_graphics.fd/emc_graphics/modulefiles module load modulefile.graphics.run.${machine} module list fi -##################################### -# Set up job node/core/run environment variables -##################################### source ${USHhafs}/hafs_runcmd.sh.inc -#################################### # Run setpdy and initialize PDY variables -#################################### #setpdy.sh #. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export HOMEgraph=${HOMEgraph:-${HOMEhafs}/sorc/hafs_graphics.fd/emc_graphics} +export USHgraph=${USHgraph:-${HOMEgraph}/ush} +export WORKgraph=${WORKgraph:-${COMhafs}/../../../${YMDH}/${STORMID}/emc_graphics} +export COMgraph=${COMgraph:-${COMhafs}/emc_graphics} + +export ADECKgraph=${ADECKhafs:?} +export BDECKgraph=${BDECKhafs:?} +export SYNDAThafs=${SYNDAThafs:?} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} -##################################### -# Working directories -##################################### +export DATA=${WORKgraph} export SENDCOM=${SENDCOM:-YES} export SCRUBDATA=${SCRUBDATA:-YES} if [ "${SCRUBDATA}" = YES ]; then - rm -rf ${WORKgraph} + rm -rf $DATA fi -mkdir -p ${WORKgraph} -cd ${WORKgraph} +mkdir -p $DATA +cd $DATA -##################################### -# Execute the script. +# Execute ex-script ${HOMEhafs}/scripts/exhafs_emcgraphics.sh export err=$? -##################################### - exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ENKF_HX b/jobs/JHAFS_ENKF_HX new file mode 100755 index 000000000..64af3ab0b --- /dev/null +++ b/jobs/JHAFS_ENKF_HX @@ -0,0 +1,72 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use $HOMEhafs/sorc/hafs_gsi.fd/modulefiles + module load modulefile.ProdGSI.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} +export HX_ENS=${HX_ENS:-NO} + +if [ ${HX_ENS:-NO} = YES ]; then + export ENSID=${ENSID:-001} + export MEMSTR="mem${ENSID}" +else + export ENSID="mean" + export MEMSTR="ensmean" +fi + +export DATA=${WORKhafs}/enkf_hx/${MEMSTR} + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_enkf_hx.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ENKF_MEAN b/jobs/JHAFS_ENKF_MEAN new file mode 100755 index 000000000..0bd923f67 --- /dev/null +++ b/jobs/JHAFS_ENKF_MEAN @@ -0,0 +1,63 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use $HOMEhafs/sorc/hafs_gsi.fd/modulefiles + module load modulefile.ProdGSI.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export DATA=${WORKhafs}/enkf_mean + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_enkf.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ENKF_RECENTER b/jobs/JHAFS_ENKF_RECENTER new file mode 100755 index 000000000..fde6af3db --- /dev/null +++ b/jobs/JHAFS_ENKF_RECENTER @@ -0,0 +1,63 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use $HOMEhafs/sorc/hafs_gsi.fd/modulefiles + module load modulefile.ProdGSI.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export DATA=${WORKhafs}/enkf_recenter + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_enkf.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_ENKF_UPDATE b/jobs/JHAFS_ENKF_UPDATE new file mode 100755 index 000000000..13f14a0af --- /dev/null +++ b/jobs/JHAFS_ENKF_UPDATE @@ -0,0 +1,63 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use $HOMEhafs/sorc/hafs_gsi.fd/modulefiles + module load modulefile.ProdGSI.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export DATA=${WORKhafs}/enkf_update + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_enkf.sh +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_FORECAST b/jobs/JHAFS_FORECAST index 36c2b326f..ffefe5cf4 100755 --- a/jobs/JHAFS_FORECAST +++ b/jobs/JHAFS_FORECAST @@ -1,148 +1,58 @@ #!/bin/sh -set -xe - date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or regional -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -export ccpp_suite_regional=${ccpp_suite_regional:-HAFS_v0_gfdlmp_nocp} -export ccpp_suite_glob=${ccpp_suite_glob:-HAFS_v0_gfdlmp} -export ccpp_suite_nest=${ccpp_suite_nest:-HAFS_v0_gfdlmp_nocp} +export PS4='+ $SECONDS + ' +set -xue -export dt_atmos=${dt_atmos:-90} -export restart_interval=${restart_interval:-6} -export quilting=${quilting:-.true.} -export write_groups=${write_groups:-3} -export write_tasks_per_group=${write_tasks_per_group:-72} - -export stretch_fac=${stretch_fac:-1.0001} -export target_lon=${target_lon:--62.0} -export target_lat=${target_lat:-22.0} -export refine_ratio=${refine_ratio:-4} - -export glob_layoutx=${glob_layoutx:-12} -export glob_layouty=${glob_layouty:-12} -export glob_npx=${glob_npx:-769} -export glob_npy=${glob_npy:-769} - -export layoutx=${layoutx:-40} -export layouty=${layouty:-30} -export npx=${npx:-2881} -export npy=${npy:-1921} -export npz=${npz:-64} - -export app_domain=${app_domain:-regional} -export output_grid=${output_grid:-rotated_latlon} -export output_grid_cen_lon=${output_grid_cen_lon:-${domlon}} -export output_grid_cen_lat=${output_grid_cen_lat:-${domlat}} -export output_grid_lon1=${output_grid_lon1:--35.0} -export output_grid_lat1=${output_grid_lat1:--30.0} -export output_grid_lon2=${output_grid_lon2:-35.0} -export output_grid_lat2=${output_grid_lat2:-30.0} -export output_grid_dlon=${output_grid_dlon:-0.025} -export output_grid_dlat=${output_grid_dlon:-0.025} - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} +export HOMEhafs=${HOMEhafs:?} export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} -export PARMforecast=${PARMforecast:-${PARMhafs}/forecast/regional} - -export HOMEgfs=${HOMEgfs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS/fv3gfs} -export EXECgfs=${EXECgfs:-${HOMEgfs}/exec} -export FIXgfs=${FIXgfs:-${HOMEgfs}/fix} -export USHgfs=${USHfv3:-${HOMEgfs}/ush} - -export FIXam=${FIXhafs}/fix_am -export FIXfv3=${FIXhafs}/fix_fv3 - -export FIXnew=${FIXhafs}/fix -export CO2DIR=${FIXam}/fix_co2_proj - -export FORECASTEXEC=${EXEChafs}/hafs_forecast.x - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.run.${machine} - #module purge - if [ "$machine" = wcoss_dell_p3 ]; then - module unload NetCDF - module unload HDF5-serial - fi - if [ "$machine" = wcoss_cray ]; then - module unload zlib-intel-haswell/1.2.7 - fi - if [ "$machine" = jet ]; then - module unload esmf/8.0.0 - module unload hdf5/1.10.4 - module unload netcdf/4.6.1 - module unload z/v1.2.6 - module unload png/v1.2.44 - module unload jasper/v1.900.1 - fi - module use ${HOMEhafs}/sorc/hafs_forecast.fd/modulefiles/${machine} - module load fv3 +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/sorc/hafs_forecast.fd/modulefiles + module load ufs_${machine} module list - export LD_LIBRARY_PATH="$HOMEhafs/sorc/hafs_forecast.fd/FV3/ccpp/lib::${LD_LIBRARY_PATH}" fi -##################################### -# Set up job node/core/run environment variables -##################################### source ${USHhafs}/hafs_runcmd.sh.inc -#################################### # Run setpdy and initialize PDY variables -#################################### #setpdy.sh #. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} -##################################### -# Working directories -##################################### -#export FIXgrid=${FIXhafs}/fix_fv3 -export FIXgrid=${FIXgrid:-${WORKhafs}/intercom/grid} -export INPdir=${INPdir:-${WORKhafs}/intercom/chgres} -export DATA=${WORKhafs}/forecast +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +# Deterministic or ensemble +if [ "${ENSDA}" != YES ]; then + export FIXgrid=${FIXgrid:-${WORKhafs}/intercom/grid} + export INPdir=${INPdir:-${WORKhafs}/intercom/chgres} + export DATA=${WORKhafs}/forecast +else + export ENSID=${ENSID:-001} + export FIXgrid=${FIXgrid:-${WORKhafs}/intercom/grid_ens} + export INPdir=${INPdir:-${WORKhafs}/intercom/chgres_ens/mem${ENSID}} + export DATA=${WORKhafs}/forecast_ens/mem${ENSID} +fi export SCRUBDATA=${SCRUBDATA:-YES} - if [ "${SCRUBDATA}" = YES ]; then rm -rf $DATA fi @@ -150,10 +60,14 @@ fi mkdir -p $DATA cd $DATA -##################################### -# Execute the script. +# Execute ex-script ${HOMEhafs}/scripts/exhafs_forecast.sh export err=$? -##################################### - exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_GRID b/jobs/JHAFS_GRID deleted file mode 100755 index 1c365794f..000000000 --- a/jobs/JHAFS_GRID +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/sh - -set -xe - -date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or stand alone regional -# If gridfixdir is specified and exists, use the grid fix files directly -export gridfixdir=${gridfixdir:-'/let/hafs_grid/generate/grid'} -# Otherwise, generate grid according to the following parameters -export stretch_fac=${stretch_fac:-1.0001} # stretching factor for the grid -export target_lon=${target_lon:--62.0} # center longitude of the highest resolution tile -export target_lat=${target_lat:-22.0} # center latitude of the highest resolution tile -# Need for grid types: nest and regional -export refine_ratio=${refine_ratio:-4} # specify the refinement ratio for nest grid -export istart_nest=${istart_nest:-46} -export jstart_nest=${jstart_nest:-238} -export iend_nest=${iend_nest:-1485} -export jend_nest=${jend_nest:-1287} -export halo=${halo:-3} # halo size to be used in the atmosphere cubic sphere model for the grid tile. -export halop1=${halop1:-4} # halo size that will be used for the orography and grid tile in chgres -export halo0=${halo0:-0} # no halo, used to shave the filtered orography for use in the model - -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} -export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -export FIXam=${FIXhafs}/fix_am -export FIXorog=${FIXhafs}/fix_orog -export FIXfv3=${FIXhafs}/fix_fv3 -export FIXsfc_climo=${FIXhafs}/fix_sfc_climo - -export MAKEHGRIDEXEC=${EXEChafs}/hafs_make_hgrid.x -export MAKEMOSAICEXEC=${EXEChafs}/hafs_make_solo_mosaic.x -export FILTERTOPOEXEC=${EXEChafs}/hafs_filter_topo.x -export FREGRIDEXEC=${EXEChafs}/hafs_fregrid.x -export OROGEXEC=${EXEChafs}/hafs_orog.x -export SHAVEEXEC=${EXEChafs}/hafs_shave.x -export SFCCLIMOEXEC=${EXEChafs}/hafs_sfc_climo_gen.x - -export MAKEGRIDSSH=${USHhafs}/hafs_make_grid.sh -export MAKEOROGSSH=${USHhafs}/hafs_make_orog.sh -export FILTERTOPOSSH=${USHhafs}/hafs_filter_topo.sh - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.run.${machine} - if [ "$machine" = wcoss_dell_p3 ]; then - module unload NetCDF - module unload HDF5-serial - fi - #source ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles/build.${machine} - module use ${HOMEhafs}/sorc/hafs_utils.fd/modulefiles - module load build.${machine}.intel - module list -fi - -##################################### -# Set up job node/core/run environment variables -##################################### -source ${USHhafs}/hafs_runcmd.sh.inc - -#################################### -# Run setpdy and initialize PDY variables -#################################### -#setpdy.sh -#. ./PDY - -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} - -##################################### -# Working directories -##################################### -export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/grid/${CASE}} -export DATA=${WORKhafs}/grid - -export SCRUBDATA=${SCRUBDATA:-YES} - -if [ "${SCRUBDATA}" = YES ]; then - rm -rf $DATA -fi - -mkdir -p $OUTDIR $DATA -cd $DATA - -##################################### -# Execute the script. -${HOMEhafs}/scripts/exhafs_grid.sh -export err=$? -##################################### - -exit $err diff --git a/jobs/JHAFS_HRDGRAPHICS b/jobs/JHAFS_HRDGRAPHICS index 3436164cd..8f87545bb 100755 --- a/jobs/JHAFS_HRDGRAPHICS +++ b/jobs/JHAFS_HRDGRAPHICS @@ -1,89 +1,56 @@ #!/bin/sh --login -set -xe - date +export PS4='+ $SECONDS + ' +set -xue -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -# GJA temporary variables -#export ADECKhafs="/lfs1/HFIP/hur-aoml/Ghassan.Alaka/adeck/NHC" -#export BDECKhafs="/lfs1/HFIP/hur-aoml/Ghassan.Alaka/bdeck" -#export SYNDAThafs="/lfs4/HFIP/hwrf-data/hwrf-input/SYNDAT-PLUS" - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export NOUTHRS=${NOUTHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or regional -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} +export HOMEhafs=${HOMEhafs:?} export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} -export GPLOThafs=${GPLOThafs:-${HOMEhafs}/sorc/hafs_graphics.fd/hrd_gplot} -export GPLOT_DIR=${GPLOThafs} -export HOMEgfs=${HOMEgfs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS/fv3gfs} -export EXECgfs=${EXECgfs:-${HOMEgfs}/exec} -export FIXgfs=${FIXgfs:-${HOMEgfs}/fix} -export USHgfs=${USHfv3:-${HOMEgfs}/ush} - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - source ${GPLOThafs}/modulefiles/modulefile.gplot.${machine} +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + source ${HOMEhafs}/sorc/hafs_graphics.fd/hrd_gplot/modulefiles/modulefile.gplot.${machine} module list fi -##################################### -# Set up job node/core/run environment variables -##################################### source ${USHhafs}/hafs_runcmd.sh.inc -#################################### # Run setpdy and initialize PDY variables -#################################### #setpdy.sh #. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export GPLOThafs=${GPLOThafs:-${HOMEhafs}/sorc/hafs_graphics.fd/hrd_gplot} +export GPLOT_DIR=${GPLOThafs} + +export ADECKgraph=${ADECKhafs:?} +export BDECKgraph=${BDECKhafs:?} +export SYNDAThafs=${SYNDAThafs:?} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} -##################################### -# Working directories -##################################### export INPdir=${INPdir:-${WORKhafs}/forecast} -export DATA=${WORKhafs}/graphics -export COMhafs=${COMhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} +export DATA=${WORKhafs}/hrd_graphics export SENDCOM=${SENDCOM:-YES} -export SCRUBDATA=${SCRUBDATA:-NO} +export SCRUBDATA=${SCRUBDATA:-YES} if [ "${SCRUBDATA}" = YES ]; then rm -rf $DATA @@ -93,10 +60,14 @@ fi mkdir -p $DATA cd $DATA -##################################### -# Execute the script. +# Execute ex-script ${HOMEhafs}/scripts/exhafs_hrdgraphics.sh export err=$? -##################################### - exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_HYCOMPOST b/jobs/JHAFS_HYCOMPOST deleted file mode 100755 index 3cc3a3b34..000000000 --- a/jobs/JHAFS_HYCOMPOST +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/sh - -set -xe - -date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} -export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -export HOMEgfs=${HOMEgfs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS/fv3gfs} -export EXECgfs=${EXECgfs:-${HOMEgfs}/exec} -export FIXgfs=${FIXgfs:-${HOMEgfs}/fix} -export USHgfs=${USHfv3:-${HOMEgfs}/ush} - -export MPISERIAL=${MPISERIAL:-/gpfs/hps/nco/ops/nwprod/mpiserial.v3.0.0/exec/mpiserial} -export NDATE=${NDATE:-/gpfs/hps/nco/ops/nwprod/prod_util.v1.0.32/exec/ndate} - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module purge - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.base.${machine} - #module load modulefile.hafs.run.${machine} - if [ "$machine" = wcoss_dell_p3 ]; then - module unload NetCDF - module unload HDF5-serial - fi - module use ${HOMEhafs}/sorc/hafs_hycom_utils.fd/modulefiles - module load modulefile.hycom_utils.${machine} - module list -fi - -##################################### -# Execute the script. -${HOMEhafs}/scripts/exhafs_hycompost.py -export err=$? -##################################### - -exit $err diff --git a/jobs/JHAFS_OCEAN_INIT b/jobs/JHAFS_OCEAN_INIT deleted file mode 100755 index 5827ee23f..000000000 --- a/jobs/JHAFS_OCEAN_INIT +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/sh - -set -xe - -date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or stand alone regional -export ictype=${ictype:-gfsnemsio} # gfsnemsio -export bctype=${bctype:-gfsnemsio} # gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2_0p50, gfsgrib2_1p00 -export LEVS=${LEVELS:-65} -export NTRAC=7 # output all gfdl mp tracers - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} -export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -export WGRIB2=${WGRIB2:-wgrib2} -export OCEAN_INIT_EXEC=${EXEChafs}/hafs_ocean_init.x - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, theia, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.run.${machine} - module list -fi - -##################################### -# Set up job node/core/run environment variables -##################################### -source ${USHhafs}/hafs_runcmd.sh.inc - -#################################### -# Run setpdy and initialize PDY variables -#################################### -#setpdy.sh -#. ./PDY - -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} - -##################################### -# Working directories -##################################### -export OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres} -##export OCEAN_INIT_DIR=${WORKhafs}/ocean_init -export OCEAN_INIT_TEMP_DIR=/scratch1/NCEPDEV/stmp2/Jili.Dong/hycom_temp -export OCEAN_INIT_DIR=${WORKhafs}/ocean_init - - - -export SCRUBDATA=${SCRUBDATA:-YES} - -if [ "${SCRUBDATA}" = YES ]; then - rm -rf $OCEAN_INIT_DIR -fi - -##mkdir -p $OUTDIR $DATA -##cd $DATA - -##################################### -# Define COM directories -##################################### -#export COMROOT=${COMROOT:-/gpfs/hps/nco/ops/com} -#export COMgfs=${COMgfs:-/${COMROOT}/gfs/prod} -export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} -export INIDIR=${COMgfs}/gfs.$PDY/$cyc - -##################################### -# Generate the ICs and BC hour 0 -##################################### -if [ $gtype = regional ] ; then - export REGIONAL=1 - export HALO=4 -else -# -# for gtype = uniform, stretch, or nest -# - export REGIONAL=0 -fi - -##################################### -# Execute the script. -${HOMEhafs}/scripts/exhafs_ocean_init.py -export err=$? -##################################### - -exit $err diff --git a/jobs/JHAFS_OCN_POST b/jobs/JHAFS_OCN_POST new file mode 100755 index 000000000..15881b465 --- /dev/null +++ b/jobs/JHAFS_OCN_POST @@ -0,0 +1,63 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/modulefiles + module load modulefile.hafs.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export DATA=${WORKhafs}/ocn_post + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_ocn_post.py +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_OCN_PREP b/jobs/JHAFS_OCN_PREP new file mode 100755 index 000000000..9e1060929 --- /dev/null +++ b/jobs/JHAFS_OCN_PREP @@ -0,0 +1,63 @@ +#!/bin/sh + +date +export PS4='+ $SECONDS + ' +set -xue + +export HOMEhafs=${HOMEhafs:?} +export USHhafs=${USHhafs:-${HOMEhafs}/ush} +export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} +export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} + +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/modulefiles + module load modulefile.hafs.${machine} + module list +fi + +source ${USHhafs}/hafs_runcmd.sh.inc + +# Run setpdy and initialize PDY variables +#setpdy.sh +#. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} + +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} + +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +export DATA=${WORKhafs}/ocn_prep + +export SCRUBDATA=${SCRUBDATA:-YES} +if [ "${SCRUBDATA}" = YES ]; then + rm -rf $DATA +fi + +mkdir -p $DATA +cd $DATA + +# Execute ex-script +${HOMEhafs}/scripts/exhafs_ocn_prep.py +export err=$? +exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/jobs/JHAFS_POST b/jobs/JHAFS_POST deleted file mode 100755 index 1bbd5d5b2..000000000 --- a/jobs/JHAFS_POST +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/sh - -set -xe - -date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} - -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export NOUTHRS=${NOUTHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or regional -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -export output_grid=${output_grid:-rotated_latlon} -export synop_gridspecs=${synop_gridspecs:-"latlon 246.6:4112:0.025 -2.4:1976:0.025"} -export trker_gridspecs=${trker_gridspecs:-"latlon 246.6:4112:0.025 -2.4:1976:0.025"} -export out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} -export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -export HOMEgfs=${HOMEgfs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS/fv3gfs} -export EXECgfs=${EXECgfs:-${HOMEgfs}/exec} -export FIXgfs=${FIXgfs:-${HOMEgfs}/fix} -export USHgfs=${USHfv3:-${HOMEgfs}/ush} - -export POSTEXEC=${EXEChafs}/hafs_post.x - -export MPISERIAL=${MPISERIAL:-/gpfs/hps/nco/ops/nwprod/mpiserial.v3.0.0/exec/mpiserial} -export NDATE=${NDATE:-/gpfs/hps/nco/ops/nwprod/prod_util.v1.0.32/exec/ndate} -#export WGRIB2=${WGRIB2:-/gpfs/hps/nco/ops/nwprod/grib_util.v1.1.0/exec/wgrib2} -export WGRIB2=${WGRIB2:-/u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8b9} -#export WGRIB2=/u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8 -#export WGRIB2=/u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8b9 -export GRB2INDEX=${GRB2INDEX:-/gpfs/hps/nco/ops/nwprod/grib_util.v1.1.0/exec/grb2index} - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module purge - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.base.${machine} - #module load modulefile.hafs.run.${machine} - if [ "$machine" = wcoss_dell_p3 ]; then - module unload NetCDF - module unload HDF5-serial - fi - if [ "$machine" = wcoss_cray ]; then - module unload zlib-intel-haswell/1.2.7 - module unload g2-intel/2.5.0 - module unload w3nco-intel/2.0.6 - module unload bacio-intel/2.0.1 - module unload sp-intel/2.0.2 - module unload w3emc-intel/2.2.0 - module unload nemsio-intel/2.2.2 - fi - module use ${HOMEhafs}/sorc/hafs_post.fd/modulefiles - module load ${machine} - module list -fi - -##################################### -# Set up job node/core/run environment variables -##################################### -source ${USHhafs}/hafs_runcmd.sh.inc - -#################################### -# Run setpdy and initialize PDY variables -#################################### -#setpdy.sh -#. ./PDY - -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} - -##################################### -# Working directories -##################################### -export INPdir=${INPdir:-${WORKhafs}/forecast} -export DATA=${WORKhafs}/post -export intercom=${WORKhafs}/intercom/post -export COMhafs=${COMhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} - -export SENDCOM=${SENDCOM:-YES} -export SCRUBDATA=${SCRUBDATA:-YES} - -if [ "${SCRUBDATA}" = YES ]; then - rm -rf $DATA - rm -f $INPdir/postf??? - rm -rf ${intercom} -fi - -mkdir -p $DATA -cd $DATA - -mkdir -p ${intercom} - -##################################### -# Execute the script. -${HOMEhafs}/scripts/exhafs_post.sh -export err=$? -##################################### - -exit $err diff --git a/jobs/JHAFS_PRODUCT b/jobs/JHAFS_PRODUCT index 1a84cea43..e33f59f15 100755 --- a/jobs/JHAFS_PRODUCT +++ b/jobs/JHAFS_PRODUCT @@ -1,93 +1,56 @@ #!/bin/sh -set -xe - date -source ${USHhafs}/hafs_pre_job.sh.inc -HOLDVARS=${HOLDVARS:-/can/not/find/storm1.holdvars.txt} -source ${HOLDVARS} - -export EXPT=${EXPT:-HAFS} -export SUBEXPT=${SUBEXPT:-${EXPT}} - -export CDATE=${CDATE:-${YMDH}} -export cyc=${cyc:-00} -export STORM=${STORM:-FAKE} -export STORMID=${STORMID:-00L} +export PS4='+ $SECONDS + ' +set -xue -export NHRS=${NHRS:-126} -export NBDYHRS=${NBDYHRS:-3} -export CASE=${CASE:-C768} -export CRES=`echo $CASE | cut -c 2-` -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or regional -export LEVS=${LEVS:-65} -export NTRAC=7 # output all gfdl mp tracers - -export NOUTHRS=${NOUTHRS:-3} -export out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} - -#################################### -# Specify Execution Areas -#################################### -export HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -export WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -export COMIN=${COMIN:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMOUT=${COMOUT:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} -export COMhafs=${COMhafs:-${COMOUT}} +export HOMEhafs=${HOMEhafs:?} export USHhafs=${USHhafs:-${HOMEhafs}/ush} -export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export EXEChafs=${EXEChafs:-${HOMEhafs}/exec} +export PARMhafs=${PARMhafs:-${HOMEhafs}/parm} export FIXhafs=${FIXhafs:-${HOMEhafs}/fix} -export HOMEgfs=${HOMEgfs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS/fv3gfs} -export EXECgfs=${EXECgfs:-${HOMEgfs}/exec} -export FIXgfs=${FIXgfs:-${HOMEgfs}/fix} -export USHgfs=${USHfv3:-${HOMEgfs}/ush} - -export GETTRKEXEC=${GETTRKEXEC:-${EXEChafs}/hafs_gettrk.x} -export TAVEEXEC=${GETTRKEXEC:-${EXEChafs}/hafs_tave.x} -export VINTEXEC=${VINTEXEC:-${EXEChafs}/hafs_vint.x} -export SUPVITEXEC=${SUPVITEXEC:-${EXEChafs}/hafs_supvit.x} - -export MPISERIAL=${MPISERIAL:-/gpfs/hps/nco/ops/nwprod/mpiserial.v3.0.0/exec/mpiserial} -export NDATE=${NDATE:-/gpfs/hps/nco/ops/nwprod/prod_util.v1.0.32/exec/ndate} -#export WGRIB2=${WGRIB2:-/gpfs/hps/nco/ops/nwprod/grib_util.v1.1.0/exec/wgrib2} -export WGRIB2=${WGRIB2:-/u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8b9} -#export WGRIB2=/u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8 -#export WGRIB2=/u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8b9 -export GRB2INDEX=${GRB2INDEX:-/gpfs/hps/nco/ops/nwprod/grib_util.v1.1.0/exec/grb2index} - -#################################### -# Load Modules if Needed -#################################### -export machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet -#export RUN_ENVIR=${RUN_ENVIR:-prod} -export RUN_ENVIR=${envir:-prod} -if [ "$RUN_ENVIR" = prod ]; then - #module use ${HOMEhafs}/modulefiles - #module load modulefile.hafs.run.${machine} +source ${USHhafs}/hafs_pre_job.sh.inc +source ${HOLDVARS:-storm1.holdvars.txt} + +export machine=${WHERE_AM_I:-wcoss_cray} +export envir=${envir:-prod} # prod, para, test +export RUN_ENVIR=${RUN_ENVIR:-dev} # nco or dev +if [ "${RUN_ENVIR^^}" != NCO ]; then + module use ${HOMEhafs}/modulefiles + module load modulefile.hafs.${machine} module list fi -##################################### -# Set up job node/core/run environment variables -##################################### source ${USHhafs}/hafs_runcmd.sh.inc -#################################### # Run setpdy and initialize PDY variables -#################################### #setpdy.sh #. ./PDY +export PDY=${PDY:-$(echo ${YMDH} | cut -c 1-8 )} -PDYtmp=$(echo ${YMDH} | cut -c 1-8 ) -export PDY=${PDY:-${PDYtmp}} +export WORKhafs=${WORKhafs:?} +export COMIN=${COMIN:?} +export COMOUT=${COMOUT:?} +export COMhafs=${COMhafs:-${COMOUT}} -##################################### -# Working directories -##################################### -export INPdir=${INPdir:-${WORKhafs}/intercom/post} -export DATA=${WORKhafs}/product +export CDATE=${CDATE:-${YMDH}} +export cyc=${cyc:?} +export STORM=${STORM:-FAKE} +export STORMID=${STORMID:-00L} +export ENSDA=${ENSDA:-NO} + +# Deterministic or ensemble +if [ ${ENSDA} = YES ]; then + export ENSID=${ENSID:-001} + export INPdir=${INPdir:-${WORKhafs}/intercom/post_ens/mem${ENSID}} + export DATA=${WORKhafs}/product_ens/mem${ENSID} + export COMOUTproduct=${COMhafs}/product_ens/mem${ENSID} +else + export INPdir=${INPdir:-${WORKhafs}/intercom/post} + export DATA=${WORKhafs}/product + export COMOUTproduct=${COMhafs} +fi export SENDCOM=${SENDCOM:-YES} export SCRUBDATA=${SCRUBDATA:-YES} @@ -96,13 +59,18 @@ if [ "${SCRUBDATA}" = YES ]; then rm -rf $DATA fi +mkdir -p ${COMOUTproduct} mkdir -p $DATA cd $DATA -##################################### -# Execute the script. +# Execute ex-script ${HOMEhafs}/scripts/exhafs_product.sh export err=$? -##################################### - exit $err + +export KEEPDATA=${KEEPDATA:-YES} +if [ "${KEEPDATA^^}" != YES ]; then + rm -rf $DATA +fi + +date diff --git a/modulefiles/modulefile.hafs.base.wcoss_cray b/modulefiles/modulefile.hafs.base.wcoss_cray deleted file mode 100644 index 4aa27521b..000000000 --- a/modulefiles/modulefile.hafs.base.wcoss_cray +++ /dev/null @@ -1,38 +0,0 @@ -#%Module##################################################### -## Module file for hafs -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling or running HAFS" -} -module-whatis " HAFS model prerequisites" - -set ver 1.0.0 - -module use /usrx/local/prod/modulefiles -module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles -module use /gpfs/hps/nco/ops/nwprod/modulefiles -module use /opt/cray/alt-modulefiles -module use /opt/cray/craype/default/alt-modulefiles -module use /opt/cray/ari/modulefiles -module use /opt/modulefiles - -#module available - -module load modules -module load switch -module load craype-network-aries -module load craype-haswell -module load xt-lsfhpc - -module load craype/2.3.0 -module load cray-mpich/7.2.0 -module load cfp-intel-sandybridge -module load PrgEnv-intel/5.2.56 -module load intel/15.0.3.187 -module load hpss - -# Load these last: -#module load ncep/1.0 # Careful this will set OMP_NUM_THREADS=1 -# Modules loaded by ncep/1.0 -module load eswrap - diff --git a/modulefiles/modulefile.hafs.hera b/modulefiles/modulefile.hafs.hera new file mode 100644 index 000000000..a0542030d --- /dev/null +++ b/modulefiles/modulefile.hafs.hera @@ -0,0 +1,65 @@ +#%Module##################################################### +## Module file for hafs +############################################################# +proc ModulesHelp { } { + puts stderr "Set environment veriables for compiling or running HAFS" +} +module-whatis " HAFS model prerequisites" + +module use /contrib/sutils/modulefiles +module load sutils +module load hpss + +module load cmake/3.16.1 +setenv CMAKE_C_COMPILER mpiicc +setenv CMAKE_CXX_COMPILER mpiicpc +setenv CMAKE_Fortran_COMPILER mpiifort +setenv CMAKE_Platform hera.intel + +module use /scratch2/NCEPDEV/nwprod/hpc-stack/libs/hpc-stack/modulefiles/stack +module load hpc/1.1.0 +module load hpc-intel/18.0.5.274 +module load hpc-impi/2018.0.4 + +module load jasper/2.0.22 +module load zlib/1.2.11 +module load png/1.6.35 + +module load hdf5/1.10.6 +module load netcdf/4.7.4 +module load pio/2.5.2 +module load esmf/8_1_1 + +module load bacio/2.4.1 +module load crtm/2.3.0 +module load g2/3.4.1 +module load g2tmpl/1.9.1 +module load ip/3.3.3 +module load nemsio/2.5.2 +module load sp/2.3.3 +module load w3emc/2.7.3 +module load w3nco/2.4.1 +module load upp/10.0.4 + +module load bufr/11.4.0 +module load gfsio/1.4.1 +module load landsfcutil/2.4.1 +module load nemsiogfs/2.5.3 +module load sfcio/1.4.1 +module load sigio/2.3.2 +module load szip/2.1.1 +module load wrf_io/1.1.1 + +module load prod_util/1.2.2 +module load grib_util/1.2.2 + +module load wgrib2/2.0.8 +setenv WGRIB2 /scratch2/NCEPDEV/nwprod/hpc-stack/libs/hpc-stack/intel-18.0.5.274/impi-2018.0.4/wgrib2/2.0.8/bin/wgrib2 + +module use /scratch2/NCEPDEV/nwprod/NCEPLIBS/modulefiles +module load nco/4.9.1 + +module use -a /scratch1/NCEPDEV/nems/emc.nemspara/soft/modulefiles +module load rocoto/1.3.3 + +module load intelpython/3.6.8 diff --git a/modulefiles/modulefile.hafs.jet b/modulefiles/modulefile.hafs.jet new file mode 100644 index 000000000..c376c09ae --- /dev/null +++ b/modulefiles/modulefile.hafs.jet @@ -0,0 +1,61 @@ +#%Module##################################################### +## Module file for hafs +############################################################# +proc ModulesHelp { } { + puts stderr "Set environment veriables for compiling or running HAFS" +} +module-whatis " HAFS model prerequisites" + +module use /contrib/sutils/modulefiles +module load sutils +module load hpss + +module load cmake/3.16.1 +setenv CMAKE_C_COMPILER mpiicc +setenv CMAKE_CXX_COMPILER mpiicpc +setenv CMAKE_Fortran_COMPILER mpiifort +setenv CMAKE_Platform jet.intel + +module use /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/modulefiles/stack +module load hpc/1.1.0 +module load hpc-intel/18.0.5.274 +module load hpc-impi/2018.4.274 + +module load jasper/2.0.22 +module load zlib/1.2.11 +module load png/1.6.35 + +module load hdf5/1.10.6 +module load netcdf/4.7.4 +module load pio/2.5.2 +module load esmf/8_1_1 + +module load bacio/2.4.1 +module load crtm/2.3.0 +module load g2/3.4.1 +module load g2tmpl/1.9.1 +module load ip/3.3.3 +module load nemsio/2.5.2 +module load sp/2.3.3 +module load w3emc/2.7.3 +module load w3nco/2.4.1 +module load upp/10.0.4 + +module load bufr/11.4.0 +module load gfsio/1.4.1 +module load landsfcutil/2.4.1 +module load nemsiogfs/2.5.3 +module load sfcio/1.4.1 +module load sigio/2.3.2 +module load szip/2.1.1 +module load wrf_io/1.1.1 + +module load prod_util/1.2.2 +module load grib_util/1.2.2 + +module load wgrib2/2.0.8 +setenv WGRIB2 /lfs4/HFIP/hfv3gfs/nwprod/hpc-stack/libs/intel-18.0.5.274/impi-2018.4.274/wgrib2/2.0.8/bin/wgrib2 +module load nco/4.9.1 +module load rocoto/1.3.3 + +module load intelpython/3.6.5 diff --git a/modulefiles/modulefile.hafs.orion b/modulefiles/modulefile.hafs.orion new file mode 100644 index 000000000..151c9f7fb --- /dev/null +++ b/modulefiles/modulefile.hafs.orion @@ -0,0 +1,61 @@ +#%Module##################################################### +## Module file for hafs +############################################################# +proc ModulesHelp { } { + puts stderr "Set environment veriables for compiling or running HAFS" +} +module-whatis " HAFS model prerequisites" + +module load contrib noaatools + +module load cmake/3.17.3 +setenv CMAKE_C_COMPILER mpiicc +setenv CMAKE_CXX_COMPILER mpiicpc +setenv CMAKE_Fortran_COMPILER mpiifort +setenv CMAKE_Platform orion.intel + +module use /apps/contrib/NCEP/libs/hpc-stack/modulefiles/stack +module load hpc/1.1.0 +module load hpc-intel/2018.4 +module load hpc-impi/2018.4 + +module load jasper/2.0.22 +module load zlib/1.2.11 +module load png/1.6.35 + +module load hdf5/1.10.6 +module load netcdf/4.7.4 +module load pio/2.5.2 +module load esmf/8_1_1 + +module load bacio/2.4.1 +module load crtm/2.3.0 +module load g2/3.4.1 +module load g2tmpl/1.9.1 +module load ip/3.3.3 +module load nemsio/2.5.2 +module load sp/2.3.3 +module load w3emc/2.7.3 +module load w3nco/2.4.1 +module load upp/10.0.4 + +module load bufr/11.4.0 +module load gfsio/1.4.1 +module load landsfcutil/2.4.1 +module load nemsiogfs/2.5.3 +module load sfcio/1.4.1 +module load sigio/2.3.2 +module load szip/2.1.1 +module load wrf_io/1.1.1 + +module load prod_util/1.2.2 +module load grib_util/1.2.2 + +module load wgrib2/2.0.8 +setenv WGRIB2 /apps/contrib/NCEP/libs/hpc-stack/intel-2018.4/impi-2018.4/wgrib2/2.0.8/bin/wgrib2 + +module load nco/4.9.3 + +module load rocoto/1.3.3 + +module load intelpython3/2020 diff --git a/modulefiles/modulefile.hafs.run.hera b/modulefiles/modulefile.hafs.run.hera deleted file mode 100644 index 7fd725cc4..000000000 --- a/modulefiles/modulefile.hafs.run.hera +++ /dev/null @@ -1,49 +0,0 @@ -#%Module##################################################### -## Module file for hafs -############################################################# - -module use /scratch2/NCEPDEV/nwprod/NCEPLIBS/modulefiles - -module load intel/18.0.5.274 -module load impi/2018.0.4 - -module load jasper/1.900.1 -module load png/1.2.44 -module load z/1.2.11 - -module load g2/3.1.1 -module load g2tmpl/1.5.1 -module load w3emc/2.3.1 -#module load w3emc/2.3.0 -module load w3nco/2.0.7 -module load sp/2.0.3 -#module load sp/2.0.2 -module load ip/3.0.2 -module load bufr/11.3.0 -module load bacio/2.0.3 -module load sigio/2.1.1 -module load sfcio/1.1.1 -module load gfsio/1.1.0 -module load nemsio/2.2.4 -module load nemsiogfs/2.2.1 -module load landsfcutil/2.1.1 - -module load szip/2.1 -module load hdf5/1.10.4 -module load netcdf/4.6.1 -module load hpss - -module load prod_util/1.1.0 -module load grib_util/1.1.1 -module load wgrib2/2.0.8 -#setenv WGRIB2 ${WGRIB2_ROOT}/bin/wgrib2 -#setenv WGRIB2 /apps/wgrib2/2.0.8/intel/18.0.3.222/bin/wgrib2 - setenv WGRIB2 /home/Wesley.Ebisuzaki/bin/wgrib.v2.0.8b3 -#setenv GRB2INDEX /scratch1/NCEPDEV/hwrf/save/Bin.Liu/hwrftrunk2019/nwport/util/exec/grb2index - -module use -a /scratch1/NCEPDEV/nems/emc.nemspara/soft/modulefiles -module load esmf/8.1.0bs19 - -module load rocoto/1.3.3 - -module load intelpython/3.6.8 diff --git a/modulefiles/modulefile.hafs.run.jet b/modulefiles/modulefile.hafs.run.jet deleted file mode 100644 index 846a923e8..000000000 --- a/modulefiles/modulefile.hafs.run.jet +++ /dev/null @@ -1,59 +0,0 @@ -#%Module##################################################### -## Module file for hafs -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling or running HAFS" -} -module-whatis " HAFS model prerequisites" - -set ver 1.0.0 - -setenv COREPATH /lfs4/HFIP/hfv3gfs/nwprod/NCEPLIBS/modulefiles -setenv NCEPLIBS /lfs4/HFIP/hfv3gfs/nwprod/NCEPLIBS/modulefiles -module use /lfs4/HFIP/hfv3gfs/nwprod/NCEPLIBS/modulefiles - -module load intel/18.0.5.274 -module load impi/2018.4.274 -module load szip/2.1 -module load hdf5/1.10.4 -module load netcdf/4.6.1 -module load w3nco/v2.0.6 -module load w3emc/v2.2.0 -module load sp/v2.0.2 -module load ip/v3.0.0 -module load bacio/v2.0.2 -module load sigio/v2.1.0 -module load sfcio/v1.0.0 -module load nemsio/v2.2.3 -module load nemsiogfs/v2.0.1 -module load gfsio/v1.1.0 -module load landsfcutil/v2.1.0 -module load g2/v3.1.0 - -module load bufr/v11.3.0 - -module load jasper/v1.900.1 -module load png/v1.2.44 -module load z/v1.2.6 - -module load prod_util/v1.0.18 -module load grib_util/v1.1.1 - -module use -a /lfs4/HFIP/hfv3gfs/software/modulefiles/intel-18.0.5.274/impi-2018.4.274 -module load esmf/8.0.0 - -#module use /lfs4/HFIP/hwrf-vd/soft/modulefiles -#module load prod_util -#module load grib_util -#module load mpiserial - -module load hpss - -setenv WGRIB2_ROOT /lfs4/HFIP/hwrfv3/Jili.Dong/wgrib2-2.0.8/grib2/lib -setenv WGRIB2 /lfs4/HFIP/hwrfv3/Jili.Dong/wgrib2-2.0.8/grib2/wgrib2/wgrib2 -setenv GRB2INDEX /lfs4/HFIP/hwrf-vd/Zhan.Zhang/H219_kjet/sorc/hwrf-utilities/exec/grb2index.exe -setenv NDATE /lfs4/HFIP/hwrfv3/Jili.Dong/fv3gfs_hafs/ndate.exe - -module load rocoto/1.3.3 - -module load intelpython/3.6.5 diff --git a/modulefiles/modulefile.hafs.run.orion b/modulefiles/modulefile.hafs.run.orion deleted file mode 100644 index ab4bc3c36..000000000 --- a/modulefiles/modulefile.hafs.run.orion +++ /dev/null @@ -1,64 +0,0 @@ -#%Module##################################################### -## Module file for vortextracker -############################################################# - -module load intel/2020 -module load impi/2020 -module load szip/2.1.1 - -#module load hdf5/1.10.5 -#module load netcdf/4.7.2 - -module use /apps/contrib/NCEPLIBS/lib/modulefiles -module load netcdfp/4.7.4 - -module use /apps/contrib/NCEPLIBS/orion/modulefiles - -#module load hdf5/1.10.1 -#module load netcdf/4.5.0 -#module load hdf5_parallel/1.12.0 -#module load netcdf_parallel/4.7.5 - -module load jasper/1.900.2 -module load png/1.2.44 -module load z/1.2.6 -module load g2/3.1.1 -module load g2tmpl/1.6.0 -module load w3emc/2.4.0 -module load w3nco/2.0.7 -module load sp/2.0.3 -module load ip/3.0.2 -#module load bufr/11.4.0 # hafs_tools.fd failed -module load bufr/11.2.0 -module load bacio/2.0.3 -module load sigio/2.2.0 -module load sfcio/1.2.0 -module load gfsio/1.2.0 -module load nemsio/2.2.4 -module load nemsiogfs/2.3.0 -module load landsfcutil/2.2.0 - -module load crtm/2.3.0 -module load prod_util/1.2.0 -module load grib_util/1.2.0 -#module load grib_util-intel-sandybridge/v1.1.1 - -module load wgrib/2.0.8 -setenv WGRIB2 /apps/wgrib-2.0.8/wgrib2/wgrib2 - -#module use /apps/contrib/NCEPLIBS/lib/modulefiles -#module load esmflocal/8.0.0.para -#module use -a /apps/contrib/NCEPLIBS/lib/modulefiles -#module load esmflocal/8_0_0r - -module load cmake/3.15.4 -setenv CMAKE_C_COMPILER mpiicc -setenv CMAKE_CXX_COMPILER mpiicpc -setenv CMAKE_Fortran_COMPILER mpiifort -setenv CMAKE_Platform orion.intel - -#module load contrib noaatools - -module load rocoto/1.3.3 - -module load intelpython3/2020 diff --git a/modulefiles/modulefile.hafs.run.wcoss_cray b/modulefiles/modulefile.hafs.run.wcoss_cray deleted file mode 100644 index ef497c076..000000000 --- a/modulefiles/modulefile.hafs.run.wcoss_cray +++ /dev/null @@ -1,77 +0,0 @@ -#%Module##################################################### -## Module file for hafs -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling or running HAFS" -} -module-whatis " HAFS model prerequisites" - -set ver 1.0.0 - -module use /usrx/local/prod/modulefiles -module use /gpfs/hps/nco/ops/nwprod/lib/modulefiles -module use /gpfs/hps/nco/ops/nwprod/modulefiles -module use /opt/cray/alt-modulefiles -module use /opt/cray/craype/default/alt-modulefiles -module use /opt/cray/ari/modulefiles -module use /opt/modulefiles - -#module available - -module load modules -module load switch -module load craype-network-aries -module load craype-haswell -module load xt-lsfhpc - -module load craype/2.3.0 -module load cray-mpich/7.2.0 -module load cfp-intel-sandybridge -module load PrgEnv-intel/5.2.56 -#These modules are loaded when loading PrgEnv-intel/5.2.56 on the front node but not all on the compute node -module load cray-libsci -module load udreg/2.3.2-1.0502.9889.2.20.ari -module load ugni/6.0-1.0502.10245.9.9.ari -module load pmi -module load dmapp/7.0.1-1.0502.10246.8.47.ari -module load gni-headers/4.0-1.0502.10317.9.2.ari -module load xpmem/0.1-2.0502.57015.1.15.ari -module load dvs -module load alps/5.2.3-2.0502.9295.14.14.ari -module load rca/1.0.0-2.0502.57212.2.56.ari -module load atp - -module load intel/15.0.3.187 -module load hpss - -module load NetCDF-intel-haswell/4.2 -module load HDF5-serial-intel-haswell/1.8.9 - -module load jasper-gnu-haswell/1.900.1 -module load png-intel-haswell/1.2.49 -module load zlib-intel-haswell/1.2.7 -module load bacio-intel/2.0.1 -module load w3emc-intel/2.2.0 -module load w3nco-intel/2.0.6 -module load sigio-intel/2.1.0 -module load sp-intel/2.0.2 -module load nemsio-intel/2.2.2 -module load nemsiogfs-intel/2.0.1 -module load g2-intel/2.5.0 - -module load grib_util/1.1.0 -#Use wgrib2 v2.0.8 -#setenv WGRIB2 /u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8b9 -setenv WGRIB2 /gpfs/hps3/emc/hwrf/noscrub/emc.hurpara/local/bin/wgrib2.v2.0.8b9 - -# Load these last: -#module load ncep/1.0 # Careful this will set OMP_NUM_THREADS=1 -# Modules loaded by ncep/1.0 -#module load eswrap - -# Need these for Rocoto: -#module use /gpfs/hps/usrx/local/emc_rocoto/modulefiles -#module load rocoto/1.2.4-RC3 -module use /usrx/local/emc_rocoto/modulefiles -module load rocoto/1.3.0rc2 -module load intelpython/3.6.8 diff --git a/modulefiles/modulefile.hafs.run.wcoss_dell_p3 b/modulefiles/modulefile.hafs.run.wcoss_dell_p3 deleted file mode 100644 index 97acc079d..000000000 --- a/modulefiles/modulefile.hafs.run.wcoss_dell_p3 +++ /dev/null @@ -1,49 +0,0 @@ -#%Module##################################################### -## Module file for hafs -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling or running HAFS" -} -module-whatis " HAFS model prerequisites" - -set ver 1.0.0 - -module load EnvVars/1.0.2 -module load lsf/10.1 -#module load lmod/7.7 -#module load settarg/7.7 - -module load ips/18.0.1.163 -module load impi/18.0.1 -module load CFP/2.0.1 -module load prod_envir/1.0.2 -module load grib_util/1.1.0 -#Use wgrib2 v2.0.8 -#setenv WGRIB2 /u/Wesley.Ebisuzaki/bin/wgrib2.v2.0.8 -setenv WGRIB2 /gpfs/dell2/emc/modeling/noscrub/emc.hurpara/local/bin/wgrib2.v2.0.8 -module load HPSS/5.0.2.5 - -module load jasper/1.900.1 -module load libpng/1.2.59 -module load zlib/1.2.11 - -module load g2/3.1.0 -module load w3emc/2.3.0 -module load w3nco/2.0.6 -module load sp/2.0.2 -module load ip/3.0.1 -module load bufr/11.2.0 -module load bacio/2.0.2 -module load sigio/2.1.0 -module load sfcio/1.0.0 -module load nemsio/2.2.3 -module load nemsiogfs/2.0.1 - -module load NetCDF/4.5.0 -module load HDF5-serial/1.10.1 - -module use /usrx/local/dev/emc_rocoto/modulefiles -module load ruby/2.5.1 -module load rocoto/1.3.0rc2 - -module load python/3.6.3 diff --git a/modulefiles/modulefile.hafs.wcoss_cray b/modulefiles/modulefile.hafs.wcoss_cray new file mode 100644 index 000000000..3cb30f7aa --- /dev/null +++ b/modulefiles/modulefile.hafs.wcoss_cray @@ -0,0 +1,92 @@ +#%Module##################################################### +## Module file for hafs +############################################################# +proc ModulesHelp { } { + puts stderr "Set environment veriables for compiling or running HAFS" +} +module-whatis " HAFS model prerequisites" + +module load PrgEnv-intel +module rm intel +module load intel/18.1.163 +module rm NetCDF-intel-sandybridge/4.2 +module load xt-lsfhpc/9.1.3 +module load craype-haswell +#module load python/3.6.3 + +module load hpss/4.1.0.3 +module load cfp-intel-sandybridge/2.0.1 +module load cray-mpich/7.2.0 + +module load cmake/3.16.2 +module load gcc/5.3.0 +# +module use /usrx/local/dev/modulefiles +module load HDF5-parallel-intel-sandybridge/1.10.6 +module load NetCDF-intel-sandybridge/4.7.4 + +module load jasper-gnu-sandybridge/1.900.1 +setenv Jasper_ROOT /usrx/local/prod/jasper/1.900.1/gnu/sandybridge +module load zlib-intel-sandybridge/1.2.7 +module load png-intel-sandybridge/1.2.49 +setenv PNG_ROOT /usrx/local/prod//png/1.2.49/intel/sandybridge + +module use /usrx/local/nceplibs/NCEPLIBS/cmake/install/NCEPLIBS-v1.3.0/modules +module load pio/2.5.2 +module load bacio/2.4.1 +module load crtm/2.3.0 +module load g2/3.4.1 +module load g2tmpl/1.9.1 +module load ip/3.3.3 +module load nemsio/2.5.2 +module load sp/2.3.3 +module load w3emc/2.7.3 +module load w3nco/2.4.1 +module load upp/10.0.4 + +module load bufr/11.4.0 +module load gfsio/1.4.1 +module load landsfcutil/2.4.1 +module load nemsiogfs/2.5.3 +module load sfcio/1.4.1 +module load sigio/2.3.2 +#module load szip/2.1.1 +module load wrf_io/1.1.1 + +#module load prod_util/1.2.2 +#module load grib_util/1.2.2 + +module load wgrib2/2.0.8 +#doesn't work setenv WGRIB2 /usrx/local/nceplibs/NCEPLIBS/cmake/install/NCEPLIBS-v1.3.0/wgrib2/wgrib2-2.0.8/bin/wgrib2 +setenv WGRIB2 /gpfs/hps3/emc/hwrf/noscrub/emc.hurpara/local/bin/wgrib2.v2.0.8b9 + +module use /gpfs/hps/usrx/local/nceplibs/NCEPLIBS/cmake/install/NCEPLIBS-v1.3.0 +module load esmf/811bs03 + +## WCOSS Cray execution prereqs: +module load rca +module load alps +module load xpmem +module load gni-headers +module load udreg +module load ugni +module swap pmi pmi/5.0.11 + +module use /gpfs/hps/nco/ops/nwprod/modulefiles +module load grib_util/1.1.0 +module load prod_util/1.1.3 + +module load nco-gnu-sandybridge/4.4.4 + +module use /usrx/local/emc_rocoto/modulefiles +module load rocoto/1.3.0rc2 + +module load intelpython/3.6.8 + +## +## load cmake +## +setenv CMAKE_C_COMPILER cc +setenv CMAKE_CXX_COMPILER CC +setenv CMAKE_Fortran_COMPILER ftn +setenv CMAKE_Platform wcoss_cray diff --git a/modulefiles/modulefile.hafs.wcoss_dell_p3 b/modulefiles/modulefile.hafs.wcoss_dell_p3 new file mode 100644 index 000000000..4ed541e4e --- /dev/null +++ b/modulefiles/modulefile.hafs.wcoss_dell_p3 @@ -0,0 +1,70 @@ +#%Module##################################################### +## Module file for hafs +############################################################# +proc ModulesHelp { } { + puts stderr "Set environment veriables for compiling or running HAFS" +} +module-whatis " HAFS model prerequisites" + +module load EnvVars/1.0.2 +module load ips/18.0.1.163 +module load impi/18.0.1 +module load lsf/10.1 +module load python/3.6.3 + +module load HPSS/5.0.2.5 +module load CFP/2.0.1 +module load prod_envir/1.0.2 + +module load cmake/3.16.2 +setenv CMAKE_C_COMPILER mpiicc +setenv CMAKE_CXX_COMPILER mpiicpc +setenv CMAKE_Fortran_COMPILER mpiifort +setenv CMAKE_Platform wcoss_dell_p3 + +module use /usrx/local/nceplibs/dev/hpc-stack/libs/hpc-stack/modulefiles/stack + +module load hpc/1.1.0 +module load hpc-ips/18.0.1.163 +module load hpc-impi/18.0.1 + +module load jasper/2.0.22 +module load zlib/1.2.11 +module load png/1.6.35 + +module load hdf5/1.10.6 +module load netcdf/4.7.4 +module load pio/2.5.2 +module load esmf/8_1_1 + +module load bacio/2.4.1 +module load crtm/2.3.0 +module load g2/3.4.1 +module load g2tmpl/1.9.1 +module load ip/3.3.3 +module load nemsio/2.5.2 +module load sp/2.3.3 +module load w3emc/2.7.3 +module load w3nco/2.4.1 +module load upp/10.0.4 + +module load bufr/11.4.0 +module load gfsio/1.4.1 +module load landsfcutil/2.4.1 +module load nemsiogfs/2.5.3 +module load sfcio/1.4.1 +module load sigio/2.3.2 +module load szip/2.1.1 +module load wrf_io/1.1.1 + +module load prod_util/1.2.2 +module load grib_util/1.2.2 + +module load wgrib2/2.0.8 +setenv WGRIB2 /gpfs/dell2/usrx/local/nceplibs/dev/hpc-stack/libs/hpc-stack/ips-18.0.1.163/impi-18.0.1/wgrib2/2.0.8/bin/wgrib2 + +module load NCO/4.7.0 + +module use /usrx/local/dev/emc_rocoto/modulefiles +module load ruby/2.5.1 +module load rocoto/1.3.0rc2 diff --git a/modulefiles/modulefile.tools.hera b/modulefiles/modulefile.tools.hera deleted file mode 120000 index 2e5d95e8e..000000000 --- a/modulefiles/modulefile.tools.hera +++ /dev/null @@ -1 +0,0 @@ -modulefile.hafs.run.hera \ No newline at end of file diff --git a/modulefiles/modulefile.tools.jet b/modulefiles/modulefile.tools.jet deleted file mode 120000 index 386fb63a5..000000000 --- a/modulefiles/modulefile.tools.jet +++ /dev/null @@ -1 +0,0 @@ -modulefile.vortextracker.jet \ No newline at end of file diff --git a/modulefiles/modulefile.tools.orion b/modulefiles/modulefile.tools.orion deleted file mode 120000 index 19f4c2947..000000000 --- a/modulefiles/modulefile.tools.orion +++ /dev/null @@ -1 +0,0 @@ -modulefile.vortextracker.orion \ No newline at end of file diff --git a/modulefiles/modulefile.tools.wcoss_cray b/modulefiles/modulefile.tools.wcoss_cray deleted file mode 120000 index 94b1e5409..000000000 --- a/modulefiles/modulefile.tools.wcoss_cray +++ /dev/null @@ -1 +0,0 @@ -modulefile.vortextracker.wcoss_cray \ No newline at end of file diff --git a/modulefiles/modulefile.tools.wcoss_cray_userlib b/modulefiles/modulefile.tools.wcoss_cray_userlib deleted file mode 120000 index 64ecdb4b9..000000000 --- a/modulefiles/modulefile.tools.wcoss_cray_userlib +++ /dev/null @@ -1 +0,0 @@ -modulefile.vortextracker.wcoss_cray_userlib \ No newline at end of file diff --git a/modulefiles/modulefile.tools.wcoss_dell_p3 b/modulefiles/modulefile.tools.wcoss_dell_p3 deleted file mode 120000 index 0246fb09b..000000000 --- a/modulefiles/modulefile.tools.wcoss_dell_p3 +++ /dev/null @@ -1 +0,0 @@ -modulefile.vortextracker.wcoss_dell_p3 \ No newline at end of file diff --git a/modulefiles/modulefile.vortextracker.hera b/modulefiles/modulefile.vortextracker.hera deleted file mode 120000 index 2e5d95e8e..000000000 --- a/modulefiles/modulefile.vortextracker.hera +++ /dev/null @@ -1 +0,0 @@ -modulefile.hafs.run.hera \ No newline at end of file diff --git a/modulefiles/modulefile.vortextracker.jet b/modulefiles/modulefile.vortextracker.jet deleted file mode 120000 index 525da7735..000000000 --- a/modulefiles/modulefile.vortextracker.jet +++ /dev/null @@ -1 +0,0 @@ -modulefile.hafs.run.jet \ No newline at end of file diff --git a/modulefiles/modulefile.vortextracker.orion b/modulefiles/modulefile.vortextracker.orion deleted file mode 120000 index af9ece283..000000000 --- a/modulefiles/modulefile.vortextracker.orion +++ /dev/null @@ -1 +0,0 @@ -modulefile.hafs.run.orion \ No newline at end of file diff --git a/modulefiles/modulefile.vortextracker.wcoss_cray b/modulefiles/modulefile.vortextracker.wcoss_cray deleted file mode 100644 index e12c3eaf1..000000000 --- a/modulefiles/modulefile.vortextracker.wcoss_cray +++ /dev/null @@ -1,28 +0,0 @@ -#%Module##################################################### -## Module file for vortextracker -############################################################# -module load craype-network-aries -module load craype-sandybridge -module load craype/2.3.0 -module load PrgEnv-intel/5.2.56 -module load intel/15.0.3.187 -module load cray-mpich/7.2.0 - -module load jasper-gnu-sandybridge/1.900.1 -module load png-intel-sandybridge/1.2.49 -module load zlib-intel-sandybridge/1.2.7 - -module load g2-intel/3.1.0 -module load w3emc-intel/2.2.0 -module load w3nco-intel/2.0.6 -module load sp-intel/2.0.2 -module load ip-intel/3.0.0 -module load bufr-intel/11.2.0 -module load bacio-intel/2.0.2 -module load sigio-intel/2.1.0 -module load sfcio-intel/1.0.0 -module load nemsio-intel/2.2.3 -module load nemsiogfs-intel/2.0.1 - -module load HDF5-serial-intel-sandybridge/1.8.9 -module load NetCDF-intel-sandybridge/4.2 diff --git a/modulefiles/modulefile.vortextracker.wcoss_cray_userlib b/modulefiles/modulefile.vortextracker.wcoss_cray_userlib deleted file mode 100644 index 802f0b815..000000000 --- a/modulefiles/modulefile.vortextracker.wcoss_cray_userlib +++ /dev/null @@ -1,31 +0,0 @@ -#%Module##################################################### -## Module file for vortextracker -############################################################# -module load craype-network-aries -module load craype-haswell -module load craype/2.3.0 -module load PrgEnv-intel/5.2.56 -module load intel/15.0.3.187 -module load cray-mpich/7.2.0 - -module unuse /gpfs/hps/nco/ops/nwprod/lib/modulefiles -module use -a $MOD_PATH - -module load jasper/v1.900.1 -module load png/v1.2.44 -module load z/v1.2.6 - -module load g2/v2.5.0 -module load w3emc/v2.2.0 -module load w3nco/v2.0.6 -module load sp/v2.0.2 -module load ip/v3.0.0 -module load bufr/v11.1.0 -module load bacio/v2.0.1 -module load sigio/v2.1.0 -module load sfcio/v1.0.0 -module load nemsio/v2.2.2 -module load nemsiogfs/v2.0.1 - -module load HDF5-serial-intel-haswell/1.8.9 -module load NetCDF-intel-haswell/4.2 diff --git a/modulefiles/modulefile.vortextracker.wcoss_dell_p3 b/modulefiles/modulefile.vortextracker.wcoss_dell_p3 deleted file mode 100644 index a34ad4efc..000000000 --- a/modulefiles/modulefile.vortextracker.wcoss_dell_p3 +++ /dev/null @@ -1,25 +0,0 @@ -#%Module##################################################### -## Module file for vortextracker -############################################################# - -module load ips/18.0.1.163 -module load impi/18.0.1 - -module load jasper/1.900.1 -module load libpng/1.2.59 -module load zlib/1.2.11 - -module load g2/3.1.0 -module load w3emc/2.3.0 -module load w3nco/2.0.6 -module load sp/2.0.2 -module load ip/3.0.1 -module load bufr/11.2.0 -module load bacio/2.0.2 -module load sigio/2.1.0 -module load sfcio/1.0.0 -module load nemsio/2.2.3 -module load nemsiogfs/2.0.1 - -module load NetCDF/4.5.0 -module load HDF5-serial/1.10.1 diff --git a/parm/analysis/gsi/atms_beamwidth.txt b/parm/analysis/gsi/atms_beamwidth.txt new file mode 100644 index 000000000..7bcd38032 --- /dev/null +++ b/parm/analysis/gsi/atms_beamwidth.txt @@ -0,0 +1,36 @@ +# LOC = data/preproc/atms_beamwidth.dat +# WMO Satellite ID +224 +# Version identifier +1 +# Sampling distance (deg) +1.11 +# Number of channels to modify +22 +# Channel, beam width, new width, cutoff, nxaverage, nyaverage, QC dist +# Note: to use FFT technique, set new width and cutoff as required and set +# nxaverage and nyaverage to 0. To use simple averaging set new width to 0.0 +# and use nxaverage and nyaverage (e.g. 3 3 for 3x3 averaging). +# QC Dist gives number of points around missing value to flag as missing. + 1 5.2 3.33 0.4 0 0 11 + 2 5.2 3.33 0.4 0 0 11 + 3 2.2 3.33 0.0 0 0 5 + 4 2.2 3.33 0.0 0 0 5 + 5 2.2 3.33 0.0 0 0 5 + 6 2.2 3.33 0.0 0 0 5 + 7 2.2 3.33 0.0 0 0 5 + 8 2.2 3.33 0.0 0 0 5 + 9 2.2 3.33 0.0 0 0 5 +10 2.2 3.33 0.0 0 0 5 +11 2.2 3.33 0.0 0 0 5 +12 2.2 3.33 0.0 0 0 5 +13 2.2 3.33 0.0 0 0 5 +14 2.2 3.33 0.0 0 0 5 +15 2.2 3.33 0.0 0 0 5 +16 2.2 3.33 0.0 0 0 5 +17 1.1 3.33 0.0 0 0 5 +18 1.1 3.33 0.0 0 0 5 +19 1.1 3.33 0.0 0 0 5 +20 1.1 3.33 0.0 0 0 5 +21 1.1 3.33 0.0 0 0 5 +22 1.1 3.33 0.0 0 0 5 diff --git a/parm/analysis/gsi/bufrinfo.json b/parm/analysis/gsi/bufrinfo.json new file mode 100644 index 000000000..3affef90f --- /dev/null +++ b/parm/analysis/gsi/bufrinfo.json @@ -0,0 +1,19 @@ +[ + { + "obs_type_mass": 138, + "obs_type_wind": 238, + "subset": "ADPUPA" + } +][ + { + "obs_type_mass": 138, + "obs_type_wind": 238, + "subset": "ADPUPA" + } +][ + { + "obs_type_mass": 138, + "obs_type_wind": 238, + "subset": "ADPUPA" + } +] \ No newline at end of file diff --git a/parm/analysis/gsi/bufrtab.012 b/parm/analysis/gsi/bufrtab.012 new file mode 100644 index 000000000..f3f83debf --- /dev/null +++ b/parm/analysis/gsi/bufrtab.012 @@ -0,0 +1,892 @@ +.------------------------------------------------------------------------------. +| ------------ USER DEFINITIONS FOR TABLE-A TABLE-B TABLE D -------------- | +|------------------------------------------------------------------------------| +| MNEMONIC | NUMBER | DESCRIPTION | +|----------|--------|----------------------------------------------------------| +| | | | +| NC012001 | A61201 | M TYPE 012-001 DMSP/SSM-I - Brightness Temperatures | +| NC012002 | A61202 | M TYPE 012-002 DMSP/SSM-I - Derived Products | +| NC012003 | A61203 | M TYPE 012-003 GPS - Integrated Precipitable Water | +* NC012004 | A61113 | M TYPE 012-004 DMSP/SSM-IS - Derived Products | +| NC012005 | A61205 | M TYPE 012-005 ERS/SAR | +* ** MESSAGE TYPE 012-005 NO LONGER PRODUCED AFTER JULY 2011 ** | +| NC012008 | A61208 | M TYPE 012-008 ERS/Scatterometer Winds | +* ** MESSAGE TYPE 012-008 NO LONGER PRODUCED AFTER JULY 2011 ** | +| NC012009 | A61209 | M TYPE 012-009 ERS/Radar Altimeter Data | +* ** MESSAGE TYPE 012-009 NO LONGER PRODUCED AFTER JULY 2011 ** | +| NC012010 | A61210 | M TYPE 012-010 NAVOCEANO/POES Low-Res. Sea Sfc Temp | +* ** MESSAGE TYPE 012-010 NO LONGER PRODUCED AFTER APPROX. SEPTEMBER 2001 ** | +| NC012011 | A61211 | M TYPE 012-011 NESDIS/POES SST & AVHRR Tb/Albedo | +| NC012012 | A61214 | M TYPE 012-012 NAVOCEANO/POES SST & AVHRR Tb/Albdo | +| NC012013 | A61226 | M TYPE 012-013 NASA/TRMM TMI microwave imager | +| NC012017 | A61198 | M TYPE 012-017 NAVOCEANO/POES physical SST retrievals | +| NC012018 | A61199 | M TYPE 012-018 NESDIS/POES physical SST retrievals | +| NC012022 | A61228 | M TYPE 012-022 NESDIS/GOES Sea Surface Temperatures | +* NC012023 | A61154 | M TYPE 012-023 NPP Sea Surface Temperatures - Future | +| NC012031 | A61250 | M TYPE 012-031 AQUA/AMSR-E Ocean Sfc Products(level 2) | +| NC012034 | A62221 | M TYPE 012-034 AQUA/AMSR-E Ocean Sfc Prod MISST(SWATH) | +| NC012103 | A61212 | M TYPE 012-103 DMSP/SSM/I - Neural Net 3 Products | +| NC012122 | A61156 | M TYPE 012-122 METOP 50 KM ASCAT scatterometer data | +| NC012123 | A61114 | M TYPE 012-123 METOP 25 KM ASCAT scatterometer data | +| NC012137 | A61213 | M TYPE 012-137 QuikSCAT scatterometer data | +* ** MESSAGE TYPE 012-137 NO LONGER PRODUCED AFTER NOVEMBER 2009 ** | +| NC012138 | A61180 | M TYPE 012-138 WindSat scatterometer data from FNMOC | +| NC012139 | A61206 | M TYPE 012-139 WindSat scatterometer data from NESDIS | +| NC012150 | A61111 | M TYPE 012-150 NASA Langley pixel-level cloud data | +| NC012255 | A12028 | M TYPE 012-255 OCEANSAT 50 KM OSCAT scatterometer data | +| | | | +| YYMMDD | 301011 | YEAR, MONTH, DAY | +| HHMMSS | 301013 | HOUR, MINUTE, SECOND | +| LTLONH | 301021 | LATITUDE/LONGITUDE (HIGH ACCURACY) | +| ASCATHDR | 301125 | ASCAT HEADER INFORMATION | +| | | | +| SPITSEQN | 310051 | SATELLITE POSITION AND INSTRUMENT TEMPERATURES SEQUENCE | +| SITPSEQN | 310052 | SATELLITE INSTRUMENT TYPE AND POSITION SEQUENCE | +| | | | +| ASCAT1BC | 312055 | ASCAT LEVEL 1B CELL INFORMATION | +| SCATWNDC | 312056 | SCATTEROMETER WIND CELL INFORMATION | +| AMBIGWND | 312057 | AMBIGUOUS WIND DATA | +| ASCAT1BD | 312058 | ASCAT LEVEL 1B DATA | +| SCATWNDD | 312059 | SCATTEROMETER WIND DATA | +| SCATSMST | 312060 | SCATTEROMETER SOIL MOISTURE DATA | +| ASCAT1B2 | 312061 | ASCAT LEVEL 1B AND LEVEL 2 DATA | +| | | | +| ASCATSG0 | 321030 | ASCAT SIGMA-0 INFORMATION | +| | | | +| INTMS | 350207 | SATELLITE INSTRUMENT TEMPERATURES | +| AVCSEQ | 350212 | AVHRR (GAC) CHANNEL SEQUENCE | +| | | | +| BID | 352001 | BULLETIN ID DATA | +| RCPTIM | 352003 | REPORT RECEIPT TIME DATA | +| | | | +| SLCA | 361155 | SSM/I LOCATION SEQUENCE | +| L2_OCEAN | 361190 | AMSR-E LEVEL-2 OCEAN DATA SEQUENCE | +| SPRD | 361216 | SSM/I PRODUCTS SEQUENCE | +| SBRT | 361217 | SSM/I BRIGHTNESS TEMPERATURE REPLICATED DATA SEQUENCE | +| SRDA | 361218 | SSM/I BRIGHTNESS TEMPERATURE DATA SEQUENCE | +| ESQ1 | 361219 | ERS SPECTRAL COEFFICIENT SEQUENCE | +| ESQ2 | 361220 | ERS SPECTRAL COEFFICIENT SEQUENCE | +| ESQ3 | 361251 | ERS RADAR ANGLES SEQUENCE | +| SNNP | 361252 | SSM/I NEURAL NET PRODUCTS SEQUENCE | +| SLCA85 | 361253 | SSM/I 85 GHz LOCATION SEQUENCE | +| SRDA85 | 361254 | SSM/I 85 GHz BRIGHTNESS TEMPERATURE DATA SEQUENCE | +| SBRT85 | 361255 | SSM/I 85 GHz BRIGHTNESS TEMP REPLICATED DATA SEQUENCE | +| | | | +| WSSEQ1 | 362248 | WINDSAT WIND & ERROR SEQUENCE | +| ISWVSEQ1 | 362249 | WINDSAT INDEX OF SELECTED WIND VECTOR SEQUENCE | +| | | | +| | | | +| SAID | 001007 | SATELLITE IDENTIFIER | +| DOMO | 001012 | DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM | +| SMMO | 001013 | SPEED OF MOTION OF MOVING OBSERVING PLATFORM | +| GNAP | 001032 | GENERATING APPLICATION | +| OGCE | 001033 | IDENTIFICATION OF ORIGINATING/GENERATING CENTER | +| GSES | 001034 | IDENTIFICATION OF ORIGINATING/GENERATING SUB-CENTER | +| PS00 | 001041 | ABSOLUTE PLATFORM VELOCITY - FIRST COMPONENT | +| PS90 | 001042 | ABSOLUTE PLATFORM VELOCITY - SECOND COMPONENT | +| PSNP | 001043 | ABSOLUTE PLATFORM VELOCITY - THIRD COMPONENT | +| RPID | 001198 | REPORT IDENTIFIER | +| | | | +| SIID | 002019 | SATELLITE INSTRUMENTS | +| SIDU | 002021 | SATELLITE INSTRUMENT DATA USED IN PROCESSING | +| CTRE | 002026 | CROSS TRACK RESOLUTION | +| ATRE | 002027 | ALONG TRACK RESOLUTION | +| SSIN | 002048 | SATELLITE SENSOR INDICATOR | +| ANPO | 002104 | ANTENNA POLARISATION | +| RAIA | 002111 | RADAR INCIDENCE ANGLE | +| RALA | 002112 | RADAR LOOK ANGLE | +| NOAL | 002113 | NUMBER OF AZIMUTH LOOKS | +| MEFR | 002121 | MEAN FREQUENCY | +| ANAZ | 002134 | ANTENNA BEAM AZIMUTH | +| SRBA | 002140 | SATELLITE RADAR BEAM AZIMUTH ANGLE | +| INCN | 002150 | TOVS/ATOVS/AVHRR INSTRUMENTATION CHANNEL NUMBER | +| RAID | 002151 | RADIOMETER IDENTIFIER | +| CTREC | 002226 | CROSS TRACK RESOLUTION (COARSE) | +| ATREC | 002227 | ALONG TRACK RESOLUTION (COARSE) | +| RAIAH | 002231 | RADAR INCIDENCE ANGLE (HIGH ACCURACY) | +| RALAH | 002232 | RADAR LOOK ANGLE (HIGH ACCURACY) | +| | | | +| YEAR | 004001 | YEAR | +| MNTH | 004002 | MONTH | +| DAYS | 004003 | DAY | +| HOUR | 004004 | HOUR | +| MINU | 004005 | MINUTE | +| SECO | 004006 | SECOND | +| RCYR | 004200 | YEAR - TIME OF RECEIPT | +| RCMO | 004201 | MONTH - TIME OF RECEIPT | +| RCDY | 004202 | DAY - TIME OF RECEIPT | +| RCHR | 004203 | HOUR - TIME OF RECEIPT | +| RCMI | 004204 | MINUTE - TIME OF RECEIPT | +| SECX | 004206 | SECOND (EXTENDED) | +| MSEC | 004208 | MILLISECOND (FRACTIONAL) | +| | | | +| CLATH | 005001 | LATITUDE (HIGH ACCURACY) | +| CLAT | 005002 | LATITUDE (COARSE ACCURACY) | +| BEARAZ | 005021 | BEARING OR AZIMUTH | +| SOLAZI | 005022 | SOLAR AZIMUTH | +| DRSP | 005030 | DIRECTION (SPECTRAL) | +| PSH1 | 005033 | PIXEL SIZE ON HORIZONTAL - 1 | +| ATRN | 005034 | ALONG TRACK ROW NUMBER | +| ORBN | 005040 | ORBIT NUMBER | +| SLNM | 005041 | SCAN LINE NUMBER | +| CHNM | 005042 | CHANNEL NUMBER | +| FOVN | 005043 | FIELD OF VIEW NUMBER | +| SCNN | 005201 | SCAN NUMBER | +| POSN | 005202 | POSITION NUMBER | +| CLAT85 | 005203 | LATITUDE FOR 85 GHz (COARSE ACCURACY) | +| CHNM85 | 005204 | CHANNEL NUMBER FOR 85 GHz | +| POSN85 | 005205 | POSITION NUMBER FOR 85 GHz | +| | | | +| CLONH | 006001 | LONGITUDE (HIGH ACCURACY) | +| CLON | 006002 | LONGITUDE (COARSE ACCURACY) | +| WNSP | 006030 | WAVE NUMBER (SPECTRAL) | +| CTCN | 006034 | CROSS TRACK CELL NUMBER | +| SSTYPE | 006193 | SST OBS TYPE | +| SSTSRC | 006194 | SST OBS SOURCE | +| CLON85 | 006203 | LONGITUDE FOR 85 GHz (COARSE ACCURACY) | +| | | | +| SELV | 007001 | HEIGHT OF STATION | +| SAZA | 007024 | SATELLITE ZENITH ANGLE | +| SOZA | 007025 | SOLAR ZENITH ANGLE | +| SSGA | 007192 | SATELLITE-SUN GLINT ANGLE | +| | | | +| METFET | 008011 | METEOROLOGICAL FEATURE | +| SLIT | 008018 | SEAWINDS LAND/ICE SURFACE TYPE | +| ACAV | 008022 | TOTAL NUMBER(WITH RESPECT TO ACCUMULATION OR AVERAGE) | +| TDQL | 008025 | TIME DIFFERENCE QUALIFIER | +| SSMS | 008060 | SAMPLE SCAN MODE SIGNIFICANCE | +| STKO | 008075 | ASCENDING / DESCENDING ORBIT FLAG | +| BEAMI | 008085 | BEAM IDENTIFIER | +| RCTS | 008202 | RECEIPT TIME SIGNIFICANCE | +| | | | +| PRES | 010004 | PRESSURE | +| PDNP | 010031 | PLATFORM DISTANCE TOWARDS NORTH POLE FROM EARTH'S CENTR | +| SDAL | 010050 | STANDARD DEVIATION ALTITUDE | +| HOAU | 010095 | HEIGHT OF ATMOSPHERE USED | +| | | | +| WSPD | 011002 | WIND SPEED (OCEAN SURFACE) | +| WD10 | 011011 | WIND DIRECTION AT 10 METERS | +| WS10 | 011012 | WIND SPEED AT 10 METERS | +| SDHS | 011050 | STANDARD DEVIATION OF HORIZONTAL WIND SPEED | +| FUWS | 011052 | FORMAL UNCERTAINTY IN WIND SPEED | +| FUWD | 011053 | FORMAL UNCERTAINTY IN WIND DIRECTION | +| MWD10 | 011081 | MODEL WIND DIRECTION AT 10 METERS | +| MWS10 | 011082 | MODEL WIND SPEED AT 10 METERS | +| WD10H | 011211 | WIND DIRECTION AT 10 M (HIGH ACCURACY) | +| WS10H | 011212 | WIND SPEED AT 10 M (HIGH ACCURACY) | +| | | | +| TMBRST | 012063 | BRIGHTNESS TEMPERATURE | +| TMINST | 012064 | INSTRUMENT TEMPERATURE | +| SDTB | 012065 | STANDARD DEVIATION BRIGHTNESS TEMPERATURE | +| TMDB | 012101 | TEMPERATURE/DRY BULB TEMPERATURE | +| TMSK | 012161 | SKIN TEMPERATURE | +| EBBTH | 012162 | EQUIVALENT BLACK BODY TEMPERATURE | +| TMBR | 012163 | BRIGHTNESS TEMPERATURE (HIGH ACCURACY) | +| TMBR85 | 012233 | BRIGHTNESS TEMPERATURE FOR 85 GHz | +| | | | +| REHU | 013003 | RELATIVE HUMIDITY | +| TOSD | 013013 | SNOW DEPTH | +| REQV | 013014 | RAINFALL/WATER EQUIVALENT OF SNOW (AVERAGE RATE) | +| TPWT | 013016 | TOTAL PRECIPITABLE WATER | +| PRAT | 013055 | PRECIPITATION INTENSITY | +| TCWV | 013095 | TOTAL COLUMN WATER VAPOR | +| MRWVC | 013096 | MWR WATER VAPOR CONTENT (TOTAL WATER VAPOR) | +| MRLWC | 013097 | MWR LIQUID WATER CONTENT (TOTAL CLOUD LIQUID WATER) | +| SMOI | 013197 | SOIL MOISTURE | +| TRRT | 013205 | TOTAL RAIN RATE | +| RCWA | 013207 | RAIN + CLOUD WATER | +| PCIA | 013208 | PRECIPITATION + CLOUD ICE | +| CRRT | 013215 | CONVECTIVE RAIN RATE | +| | | | +| ALBD | 014027 | ALBEDO | +| | | | +| LIED | 015011 | LOG_10 OF INTEGRATED ELECTRON DENSITY | +| MSCN | 015015 | MAXIMUM SPECTRAL COMPONENT BEFORE NORMALISATION | +| OPTH | 015193 | AEROSOL OPTICAL THICKNESS | +| | | | +| HOCB | 020013 | HEIGHT OF BASE OF CLOUD | +| HOCT | 020014 | HEIGHT OF TOP OF CLOUD | +| CDBP | 020015 | PRESSURE AT BASE OF CLOUD | +| CDTP | 020016 | PRESSURE AT TOP OF CLOUD | +| CLDP | 020056 | CLOUD PHASE | +| SNOC | 020065 | SNOW COVER | +| ICEP | 020095 | ICE PROBABILITY | +| ICEA | 020096 | ICE AGE ("A" PARAMETER) | +| ICON | 020208 | ICE CONCENTRATION | +| ICAG | 020209 | ICE AGE | +| ICED | 020210 | ICE EDGE | +| SFTP | 020216 | CALCULATED SURFACE TYPE | +| SFTG | 020217 | SURFACE TAG | +| SFTG85 | 020218 | SURFACE TAG FOR 85 GHz | +| WSST | 020219 | WINDSAT SURFACE TYPE | +| | | | +| VILWC | 021031 | VERTICALLY-INTEGRATED LIQUID WATER CONTENT | +| BKST | 021062 | BACKSCATTER | +| RARE | 021063 | RADIOMETRIC RESOLUTION (NOISE VALUE) | +| CLNE | 021064 | CLUTTER NOISE ESTIMATE | +| MPCN | 021065 | MISSING PACKET COUNTER | +| WSPC | 021066 | WAVE SCATTEROMETER PRODUCT CONFIDENCE | +| WSPC2 | 021067 | WIND SCATTEROMETER PRODUCT CONFIDENCE | +| RAPC | 021068 | RADAR ALTIMETER PRODUCT CONFIDENCE | +| PEAK | 021071 | PEAKINESS | +| SACS | 021072 | SATELLITE ALTIMETER CALIBRATION STATUS | +| SAIM | 021073 | SATELLITE ALTIMETER INSTRUMENT MODE | +| SPIN | 021075 | SPECTRAL INTENSITY | +| REIN | 021076 | REPRESENTATION OF INTENSITIES | +| ACIO | 021077 | ALTITUDE CORRECTION (IONOSPHERE) | +| ACDT | 021078 | ALTITUDE CORRECTION (DRY TROPOSPHERE) | +| ACWT | 021079 | ALTITUDE CORRECTION (WET TROPOSPHERE) | +| ACCC | 021080 | ALTITUDE CORRECTION (CALIBRATION CONSTANT) | +| OLCH | 021081 | OPEN LOOP CORRECTION (HEIGHT-TIME LOOP) | +| OLCA | 021082 | OPEN LOOP CORRECTION (AUTO GAIN CONTROL) | +| WBKS | 021088 | WET BACKSCATTER | +| NWVA | 021101 | NUMBER OF VECTOR AMBIGUITIES | +| ISWV | 021102 | INDEX OF SELECTED WIND VECTOR | +| TNSM | 021103 | TOTAL NUMBER OF SIGMA-0 MEASUREMENTS | +| LKCS | 021104 | LIKELIHOOD COMPUTED FOR SOLUTION | +| KVCA | 021106 | Kp VARIANCE COEFF (ALPHA) | +| KVCB | 021107 | Kp VARIANCE COEFF (BETA) | +| SWVQ | 021109 | SEAWINDS VECTOR CELL QUALITY MARK | +| NIBF | 021110 | NUMBER OF INNER-BEAM SIGMA-0 (FORWARD OF SATELLITE) | +| NOBF | 021111 | NUMBER OF OUTER-BEAM SIGMA-0 (FORWARD OF SATELLITE) | +| NIBA | 021112 | NUMBER OF INNER-BEAM SIGMA-0 (AFT OF SATELLITE) | +| NOBA | 021113 | NUMBER OF OUTER-BEAM SIGMA-0 (AFT OF SATELLITE) | +| KVCG | 021114 | Kp VARIANCE COEFF (GAMMA) | +| SSQU | 021115 | SEAWINDS SIGMA-0 QUALITY | +| SSMD | 021116 | SEAWINDS SIGMA-0 MODE | +| SVQC | 021117 | SIGMA-0 VARIANCE QUALITY CONTROL | +| ACRS | 021118 | ATTENUATION CORRECTION ON SIGMA-0 | +| WSGF | 021119 | WIND SCATTEROMETER GEOPHYSICAL MODEL FUNC | +| SPRR | 021120 | SEAWINDS PROBABILITY OF RAIN | +| SNRI | 021121 | SEAWINDS NOF RAIN INDEX | +| ACST | 021122 | ATTENUATION CORRECTION ON SIGMA-0 (FROM BRT. TEMP.) | +| SNRCS | 021123 | SEAWINDS NORMALIZED RADAR CROSS-SECTION | +| BEAMC | 021150 | BEAM COLLOCATION | +| EES40 | 021151 | ESTIMATED ERROR IN SIGMA-0 AT 40 DEG. INCIDENCE ANGLE | +| S40IA | 021152 | SLOPE AT 40 DEG. INCIDENCE ANGLE | +| EEL40 | 021153 | ESTIMATED ERROR IN SLOPE AT 40 DEG. INCIDENCE ANGLE | +| SMOS | 021154 | SOIL MOISTURE SENSITIVITY | +| WVCQ | 021155 | WIND VECTOR CELL QUALITY | +| BSCD | 021156 | BACKSCATTER DISTANCE | +| LULAU | 021157 | LOSS PER UNIT LENGTH OF ATMOSPHERE USED | +| AKPEQ | 021158 | ASCAT kp ESTIMATE QUALITY | +| ASGU | 021159 | ASCAT SIGMA-0 USABILITY | +| AUSY | 021160 | ASCAT USE OF SYNTHETIC DATA | +| ASDQ | 021161 | ASCAT SYNTHETIC DATA QUALITY | +| ASOAQ | 021162 | ASCAT SATELLITE ORBIT AND ATTITUDE QUALITY | +| ASARC | 021163 | ASCAT SOLAR ARRAY REFLECTION CONTAMINATION | +| ATPQ | 021164 | ASCAT TELEMETRY PRESENCE AND QUALITY | +| AERFP | 021165 | ASCAT EXTRAPOLATED REFERENCE FUNCTION PRESENCE | +| ALFR | 021166 | ASCAT LAND FRACTION | +| | | | +| SDWH | 022026 | STANDARD DEVIATION OF SIGNIFICANT WAVE HEIGHT | +| SST1 | 022043 | SEA SURFACE TEMPERATURE | +| SGWH | 022070 | SIGNIFICANT WAVE HEIGHT | +| MWLW | 022097 | MEAN WAVELENGTH FOR WAVELENGTH > 731 METERS | +| WSLW | 022098 | WAVELENGTH SPREAD FOR WAVELENGTH > 731 METERS | +| MDLW | 022099 | MEAN DIRECTION FOR WAVELENGTH > 731 METERS | +| DSLW | 022100 | DIRECTION SPREAD FOR WAVELENGTH > 731 METERS | +| TELW | 022101 | TOTAL ENERGY FOR WAVELENGTH > 731 METERS | +| IREL | 022227 | RELIABILITY OF SST RETRIEVAL (HIGHER IS MORE RELIABLE) | +| IRMS | 022228 | INTERNAL RMS ERROR OF SST RETRIEVAL | +| | | | +| CLTR | 025010 | CLUTTER TREATMENT | +| ACCO | 025014 | AZIMUTH CLUTTER CUTOFF | +| SWID | 025060 | SOFTWARE IDENTIFICATION | +| DBID | 025062 | DATABASE IDENTIFICATION | +| MJFC | 025070 | MAJOR FRAME COUNT | +| TDEL | 025220 | TOTAL DELAY | +| ETDL | 025221 | ERROR IN TOTAL DELAY | +| HSDL | 025222 | HYDROSTATIC DELAY | +| EHSD | 025223 | ERROR IN HYDROSTATIC DELAY | +| WMTM | 025224 | WEIGHTED MEAN TEMPERATURE | +| WDMF | 025225 | WET DELAY MAPPING FUNCTION | +| | | | +| PD00 | 027031 | PLATFORM DISTANCE TOWARDS LONG 0 FROM EARTH'S CENTER | +| | | | +| PD90 | 028031 | PLATFORM DISTANCE TOWARDS LONG 90 FROM EARTH'S CENTER | +| | | | +| COGT | 029002 | CO-ORDINATE GRID TYPE | +| | | | +| CHSQ | 033199 | CHI-SQUARED (OF THE WIND VECTOR RETRIEVAL) | +| WSEQC1 | 033200 | WINDSAT EDR QC FLAG #1 | +| PHER | 033201 | EST. ERROR COVARIANCE FOR WIND DIRECTION RETRIEVAL | +| CORN | 033215 | CORRECTED REPORT INDICATOR | +| RFLG | 033217 | RAIN FLAG (WIND QUALITY INDICATOR) | +| PRXF | 033232 | AMSR-E PROXIMITY FLAG | +| OSQC | 033233 | AMSR-E LEVEL 2 OCEAN SUMMARY QUALITY CODE | +| OPQF | 033234 | AMSR-E LEVEL 2 OCEAN PRODUCT QUALITY FLAG | +| SSTE | 033245 | EST. ERROR COVARIANCE FOR SEA SURFACE TEMP RETRIEVAL | +| SPDE | 033246 | EST. ERROR COVARIANCE FOR WIND SPEED RETRIEVAL | +| VPRE | 033247 | EST. ERROR COVARIANCE FOR TOTAL WATER VAPOR RETRIEVAL | +| CLDE | 033248 | EST. ERROR COVARIANCE FOR TOTAL CLD LIQUID WATER RETR. | +| | | | +| BUHD | 035021 | BULLETIN BEING MONITORED (TTAAii) | +| BULTIM | 035022 | BULLETIN BEING MONITORED (YYGGgg) | +| BORG | 035023 | BULLETIN BEING MONITORED (CCCC) | +| BBB | 035194 | BULLETIN BEING MONITORED (BBB) | +| SEQNUM | 035195 | CHANNEL SEQUENCE NUMBER | +| | | | +| SSOM | 040001 | SURFACE SOIL MOISTURE (MS) | +| EESSM | 040002 | ESTIMATED ERROR IN SURFACE SOIL MOISTURE | +| MSSM | 040003 | MEAN SURFACE SOIL MOISTURE | +| RFDT | 040004 | RAINFALL DETECTION | +| SMCF | 040005 | SOIL MOISTURE CORRECTION FLAG | +| SMPF | 040006 | SOIL MOISTURE PROCESSING FLAG | +| SMQL | 040007 | SOIL MOISTURE QUALITY | +| FLSF | 040008 | FROZEN LAND SURFACE FRACTION | +| IWFR | 040009 | INUNDATION AND WETLAND FRACTION | +| TPCX | 040010 | TOPOGRAPHIC COMPLEXITY | +| | | | +|------------------------------------------------------------------------------| +| MNEMONIC | SEQUENCE | +|----------|-------------------------------------------------------------------| +| | | +| NC012001 | SAID YEAR MNTH DAYS HOUR MINU SECO | +| NC012001 | ORBN SCNN {SLCA} {SBRT} {SLCA85} {SBRT85} | +| | | +| NC012002 | SAID YEAR MNTH DAYS HOUR MINU SECO | +| NC012002 | ORBN SCNN {SLCA} {SPRD} | +| | | +| NC012103 | SAID YEAR MNTH DAYS HOUR MINU SECO | +| NC012103 | ORBN SCNN {SLCA} {SNNP} | +| | | +| NC012003 | BID RPID RCPTIM CORN YEAR MNTH DAYS | +| NC012003 | HOUR MINU SECO CLAT CLON SELV PRES | +| NC012003 | TMDB REHU TDEL ETDL HSDL EHSD 202131 | +| NC012003 | 201138 TPWT 201000 202000 WMTM WDMF | +| | | +| NC012005 | SAID SWID OGCE GSES DOMO YEAR MNTH | +| NC012005 | DAYS HOUR MINU SECO MSEC PD00 PD90 | +| NC012005 | PDNP PS00 PS90 PSNP SIDU YEAR MNTH | +| NC012005 | DAYS HOUR MINU SECO MSEC CLAT CLON | +| NC012005 | ANPO MEFR NOAL CTRE ATRE RAIA SRBA | +| NC012005 | 202127 SMMO 202000 202126 SELV 202000 CLTR | +| NC012005 | CLNE MSCN COGT REIN "ESQ1"12 | +| NC012005 | WSPC SSMS ACAV SSMS ACAV ACCO TELW | +| NC012005 | MWLW WSLW MDLW DSLW | +| | | +* ** FINAL SUBSET STRUCTURE IN MSG TYPE 012-008, DISCONTINUED ~FEB 2001 ** | +| NC012008 | SAID SWID OGCE GSES DOMO YEAR MNTH | +| NC012008 | DAYS HOUR MINU SECO MSEC PD00 PD90 | +| NC012008 | PDNP PS00 PS90 PSNP SIDU YEAR MNTH | +| NC012008 | DAYS HOUR MINU SECO MSEC CLAT CLON | +| NC012008 | "ESQ3"3 | +| NC012008 | WS10 WD10 WSPC2 | +| | | +| NC012009 | SAID SWID OGCE GSES DOMO YEAR MNTH | +| NC012009 | DAYS HOUR MINU SECO MSEC PD00 PD90 | +| NC012009 | PDNP PS00 PS90 PSNP SIDU YEAR MNTH | +| NC012009 | DAYS HOUR MINU SECO MSEC CLAT CLON | +| NC012009 | ACAV WS10 SDHS SGWH SDWH | +| NC012009 | 202130 201141 SELV 201000 202000 SDAL RAPC | +| NC012009 | PEAK SACS SAIM ACIO ACDT ACWT ACCC | +| NC012009 | OLCH OLCA BKST LIED | +| | | +* ** FINAL SUBSET STRUCTURE IN MSG TYPE 012-010, DISCONTINUED ~SEP 2001 ** | +| NC012010 | YEAR MNTH DAYS HOUR MINU SECO SSTYPE SSTSRC CLAT CLON SST1 | +| | | +| NC012011 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SAID | +| NC012011 | SAZA SOZA SOLAZI SSTYPE SSTSRC IREL IRMS OPTH SST1 | +| NC012011 | "AVCSEQ"5 | +| | | +| NC012012 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SAID | +| NC012012 | SAZA SOZA SOLAZI SSTYPE SSTSRC IREL IRMS OPTH SST1 | +| NC012012 | "AVCSEQ"5 | +| | | +| NC012013 | SAID YEAR MNTH DAYS HOUR MINU SECO CLAT CLON TRRT CRRT | +| NC012013 | RCWA PCIA | +| | | +| NC012017 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SAID SSTYPE SST1 | +| | | +| NC012018 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SAID SSTYPE SST1 | +| | | +| NC012022 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SST1 ACAV | +| | | +| NC012031 | SPITSEQN SITPSEQN L2_OCEAN | +| | | +| NC012034 | YEAR MNTH DAYS HOUR MINU SECO CLATH CLONH STKO PRXF SST1 WS10 | +| | | +| NC012122 | ASCAT1B2 | +| | | +| NC012123 | ASCAT1B2 | +| | | +| NC012137 | SAID DOMO SSIN WSGF SWID CTREC ATREC ORBN | +| NC012137 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON | +| NC012137 | TDQL SECX ATRN CTCN SWVQ MWD10 MWS10 NWVA | +| NC012137 | ISWV TNSM SPRR SNRI PRAT ACST | +* * +| NC012137 | WS10H FUWS WD10H FUWD LKCS | +* ^^^^^^^^^^^^^^^view 1^^^^^^^^^^^^^^^ * +* * +| NC012137 | WS10H FUWS WD10H FUWD LKCS | +* ^^^^^^^^^^^^^^^view 2^^^^^^^^^^^^^^^ * +* * +| NC012137 | WS10H FUWS WD10H FUWD LKCS | +* ^^^^^^^^^^^^^^^view 3^^^^^^^^^^^^^^^ * +* * +| NC012137 | WS10H FUWS WD10H FUWD LKCS | +* ^^^^^^^^^^^^^^^view 4^^^^^^^^^^^^^^^ * +* * +| NC012137 | ANPO ACAV TMBRST SDTB ANPO ACAV TMBRST SDTB | +* ^^^^^^^^^^^^^^^^^brightness temperatures^^^^^^^^^^^^^^^^^^^^ * +* * +| NC012137 | NIBF CLAT CLON ACRS RALAH RAIAH ANPO SNRCS | +| NC012137 | KVCA KVCB KVCG SSQU SSMD SLIT SVQC | +* ^^^^^^^^^^inner-beam sigma-0 (forward of satellite)^^^^^^^^^^^ * +* * +| NC012137 | NOBF CLAT CLON ACRS RALAH RAIAH ANPO SNRCS | +| NC012137 | KVCA KVCB KVCG SSQU SSMD SLIT SVQC | +* ^^^^^^^^^^outer-beam sigma-0 (forward of satellite)^^^^^^^^^^^ * +* * +| NC012137 | NIBA CLAT CLON ACRS RALAH RAIAH ANPO SNRCS | +| NC012137 | KVCA KVCB KVCG SSQU SSMD SLIT SVQC | +* ^^^^^^^^^^^^inner-beam sigma-0 (aft of satellite)^^^^^^^^^^^^^ * +* * +| NC012137 | NOBA CLAT CLON ACRS RALAH RAIAH ANPO SNRCS | +| NC012137 | KVCA KVCB KVCG SSQU SSMD SLIT SVQC | +* ^^^^^^^^^^^^outer-beam sigma-0 (aft of satellite)^^^^^^^^^^^^^ * +| | | +* A note about the ISWV and wind values in WindSat data: | +* There are two replications of ISWV, the selected wind vector index | +* (generated in different ways) which point to which one of the four sets | +* of wind information should be chosen. The values can be either 0, 1, 2 | +* or 3 corresponding to wind set 1, 2, 3 or 4, respectively. The value in | +* the first replication is equal to the array index of the selected | +* ambiguity as specified in the original WindSat dataset from the Navy. | +* The value in the second replication is equal to the array index of the | +* selected ambiguity value based on the smallest calculated wind vector | +* error (here vs. the GFS model prior to 2006 and vs. the Navy NOGAPS | +* model in 2006). The model values used to calculate the wind vector | +* error are encoded here as MWD10 and MWS10. | +* | +| NC012138 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SAID WSST SSTE SPDE VPRE | +| NC012138 | CLDE SST1 MRWVC MRLWC REQV {ISWVSEQ1} {WSSEQ1} MWD10 MWS10 WSEQC1 | +| | | +| NC012139 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON SAID WSST SSTE SPDE VPRE | +| NC012139 | CLDE SST1 MRWVC MRLWC REQV {ISWVSEQ1} {WSSEQ1} MWD10 MWS10 WSEQC1 | +| | | +| NC012150 | YYMMDD HHMMSS LTLONH SAID | +| NC012150 | METFET CLDP 207001 HOCB HOCT 207000 CDBP CDTP | +| NC012150 | EBBTH 207004 VILWC 207000 METFET | +| | | +| NC012255 | SAID DOMO SSIN WSGF SWID | +| NC012255 | 202124 CTRE ATRE 202000 ORBN | +| NC012255 | YEAR MNTH DAYS HOUR MINU SECO CLAT CLON | +| NC012255 | TDQL 201136 SECO 201000 ATRN CTCN SWVQ MWD10 | +| NC012255 | MWS10 NWVA ISWV TNSM SPRR SNRI PRAT ACST | +* * +| NC012255 | 201130 202129 WS10 202000 201000 FUWS | +| NC012255 | 201135 202130 WD10 202000 201000 FUWD LKCS | +* ^^^^^^^^^^^^^^^view 1^^^^^^^^^^^^^^^ * +* * +| NC012255 | 201130 202129 WS10 202000 201000 FUWS | +| NC012255 | 201135 202130 WD10 202000 201000 FUWD LKCS | +* ^^^^^^^^^^^^^^^view 2^^^^^^^^^^^^^^^ * +* * +| NC012255 | 201130 202129 WS10 202000 201000 FUWS | +| NC012255 | 201135 202130 WD10 202000 201000 FUWD LKCS | +* ^^^^^^^^^^^^^^^view 3^^^^^^^^^^^^^^^ * +* * +| NC012255 | 201130 202129 WS10 202000 201000 FUWS | +| NC012255 | 201135 202130 WD10 202000 201000 FUWD LKCS | +* ^^^^^^^^^^^^^^^view 4^^^^^^^^^^^^^^^ * +* * +| NC012255 | ANPO ACAV TMBRST SDTB ANPO ACAV TMBRST SDTB | +* ^^^^^^^^^^^^^^^^^brightness temperatures^^^^^^^^^^^^^^^^^^^^ * +* * +| NC012255 | NIBF CLAT CLON ACRS | +| NC012255 | 202129 201132 RALA 201000 201131 RAIA 201000 202000 | +| NC012255 | ANPO SNRCS KVCA KVCB KVCG SSQU SSMD SLIT | +| NC012255 | SVQC | +* ^^^^^^^^^^inner-beam sigma-0 (forward of satellite)^^^^^^^^^^^ * +* * +| NC012255 | NOBF CLAT CLON ACRS | +| NC012255 | 202129 201132 RALA 201000 201131 RAIA 201000 202000 | +| NC012255 | ANPO SNRCS KVCA KVCB KVCG SSQU SSMD SLIT | +| NC012255 | SVQC | +* ^^^^^^^^^^inner-beam sigma-0 (forward of satellite)^^^^^^^^^^^ * +* * +| NC012255 | NIBA CLAT CLON ACRS | +| NC012255 | 202129 201132 RALA 201000 201131 RAIA 201000 202000 | +| NC012255 | ANPO SNRCS KVCA KVCB KVCG SSQU SSMD SLIT | +| NC012255 | SVQC | +* ^^^^^^^^^^^^inner-beam sigma-0 (aft of satellite)^^^^^^^^^^^^^ * +* * +| NC012255 | NOBA CLAT CLON ACRS | +| NC012255 | 202129 201132 RALA 201000 201131 RAIA 201000 202000 | +| NC012255 | ANPO SNRCS KVCA KVCB KVCG SSQU SSMD SLIT | +| NC012255 | SVQC | +* ^^^^^^^^^^^^outer-beam sigma-0 (aft of satellite)^^^^^^^^^^^^^ * +| SLCA | CLAT CLON SFTG POSN | +| | | +| SLCA85 | CLAT85 CLON85 SFTG85 POSN85 | +| | | +| SPRD | REQV WSPD SMOI 202129 201132 TPWT 201000 202000 | +| SPRD | METFET 202130 201133 VILWC 201000 202000 METFET | +| SPRD | 202129 201132 TOSD 201000 202000 TMSK ICON | +| SPRD | ICAG ICED SFTP RFLG | +| | | +| SNNP | WSPD 202129 201132 TPWT 201000 202000 METFET | +| SNNP | 202130 201133 VILWC 201000 202000 METFET SST1 | +| | | +| SBRT | "SRDA"7 | +| | | +| SRDA | CHNM TMBR | +| | | +| SBRT85 | "SRDA85"2 | +| | | +| SRDA85 | CHNM85 TMBR85 | +| | | +| BID | SEQNUM BUHD BORG BULTIM BBB | +| | | +| RCPTIM | RCTS RCYR RCMO RCDY RCHR RCMI | +| | | +| ESQ1 | 201129 WNSP 201000 "ESQ2"12 | +| | | +| ESQ2 | DRSP SPIN | +| | | +| ESQ3 | RAIA RALA BKST RARE MPCN | +| | | +| SPITSEQN | SAID ORBN 201133 SLNM 201000 | +| SPITSEQN | 201132 MJFC 201000 202126 SELV 202000 SOZA | +| SPITSEQN | SOLAZI "INTMS"9 | +| | | +| SITPSEQN | SIID YEAR MNTH DAYS HOUR MINU | +| SITPSEQN | 202131 201138 SECO 201000 202000 | +| SITPSEQN | CLATH CLONH SAZA BEARAZ FOVN | +| | | +| L2_OCEAN | OSQC OPQF SSGA | +| L2_OCEAN | 202123 CTRE 202000 SST1 | +| L2_OCEAN | 202123 CTRE 202000 SST1 WSPD | +| L2_OCEAN | 202123 CTRE 202000 WSPD TCWV | +| L2_OCEAN | 202123 CTRE 202000 | +| L2_OCEAN | METFET 202130 201133 VILWC 201000 202000 METFET | +| | | +| INTMS | RAID TMINST | +| | | +| AVCSEQ | INCN ALBD TMBR | +| | | +| WSSEQ1 | WD10 WS10 CHSQ PHER | +| | | +| ISWVSEQ1 | ISWV | +| | | +| ASCAT1BD | ASCATHDR YYMMDD HHMMSS LTLONH ASCAT1BC BEAMC "ASCATSG0"3 | +| | | +| ASCAT1B2 | ASCAT1BD SCATSMST SCATWNDD | +| | | +| SCATSMST | SWID DBID SSOM EESSM BKST EES40 S40IA EEL40 SMOS BKST WBKS MSSM | +| SCATSMST | RFDT SMCF SMPF SMQL SNOC FLSF IWFR TPCX | +| | | +| SCATWNDD | SCATWNDC {AMBIGWND} | +| | | +| ASCATSG0 | BEAMI 202129 201131 RAIA 201000 202000 ANAZ BKST RARE AKPEQ ASGU | +| ASCATSG0 | AUSY ASDQ ASOAQ ASARC ATPQ AERFP ALFR | +| | | +| ASCATHDR | OGCE GSES SWID SAID SIID DOMO | +| | | +| ASCAT1BC | PSH1 ORBN CTCN HOAU LULAU | +| | | +| SCATWNDC | SWID GNAP MWS10 MWD10 ICEP ICEA WVCQ | +| SCATWNDC | 201133 NWVA ISWV 201000 | +| | | +| AMBIGWND | 201130 202129 WS10 202000 201000 | +| AMBIGWND | 201131 202129 WD10 202000 201000 BSCD LKCS | +| | | +| YYMMDD | YEAR MNTH DAYS | +| | | +| HHMMSS | HOUR MINU SECO | +| | | +| LTLONH | CLATH CLONH | +| | | +|------------------------------------------------------------------------------| +| MNEMONIC | SCAL | REFERENCE | BIT | UNITS |-------------| +|----------|------|-------------|-----|--------------------------|-------------| +| | | | | |-------------| +| SAID | 0 | 0 | 10 | CODE TABLE |-------------| +| DOMO | 0 | 0 | 9 | DEGREES TRUE |-------------| +| | | | | |-------------| +| SMMO | 0 | 0 | 10 | METERS/SECOND |-------------| +* SMMO stored -1 * 0 | 10 * METERS/SECOND * +| | | | | |-------------| +| GNAP | 0 | 0 | 8 | CODE TABLE |-------------| +| OGCE | 0 | 0 | 8 | CODE TABLE |-------------| +| GSES | 0 | 0 | 8 | CODE TABLE |-------------| +| PS00 | 5 | -1073741824 | 31 | METERS/SECOND |-------------| +| PS90 | 5 | -1073741824 | 31 | METERS/SECOND |-------------| +| PSNP | 5 | -1073741824 | 31 | METERS/SECOND |-------------| +| RPID | 0 | 0 | 64 | CCITT IA5 |-------------| +| SIID | 0 | 0 | 11 | CODE TABLE |-------------| +| SIDU | 0 | 0 | 9 | FLAG TABLE |-------------| +| | | | | |-------------| +| CTRE | 2 | 0 | 12 | METERS |-------------| +* CTRE stored -3 * 0 * 12 * METERS (NC012031 only) * +* CTRE stored -2 * 0 * 12 * METERS (NC012255 only) * +| | | | | |-------------| +| ATRE | 2 | 0 | 12 | METERS |-------------| +* ATRE stored -2 * 0 | 12 * METERS (NC012255 only) * +| | | | | |-------------| +| SSIN | 0 | 0 | 4 | CODE TABLE |-------------| +| ANPO | 0 | 0 | 4 | CODE TABLE |-------------| +| | | | | |-------------| +| RAIA | 1 | 0 | 10 | DEGREES |-------------| +* RAIA stored 2 * 0 * 13 * DEGREES (NC012255 only) * +| | | | | |-------------| +| RALA | 1 | 0 | 12 | DEGREES |-------------| +* RALA stored 2 * 0 * 16 * DEGREES (NC012255 only) * +| | | | | |-------------| +| NOAL | 0 | 0 | 4 | NUMBER |-------------| +| MEFR | -8 | 0 | 7 | HZ |-------------| +| ANAZ | 2 | 0 | 16 | DEGREES |-------------| +| SRBA | 0 | 0 | 9 | DEGREES |-------------| +| INCN | 0 | 0 | 6 | CODE TABLE |-------------| +| RAID | 0 | 0 | 11 | CODE TABLE |-------------| +| CTREC | -2 | 0 | 12 | METERS |-------------| +| ATREC | -2 | 0 | 12 | METERS |-------------| +| RAIAH | 2 | 0 | 13 | DEGREES |-------------| +| RALAH | 2 | 0 | 16 | DEGREES |-------------| +| YEAR | 0 | 0 | 12 | YEAR |-------------| +| MNTH | 0 | 0 | 4 | MONTH |-------------| +| DAYS | 0 | 0 | 6 | DAY |-------------| +| HOUR | 0 | 0 | 5 | HOUR |-------------| +| MINU | 0 | 0 | 6 | MINUTE |-------------| +| | | | | |-------------| +| SECO | 0 | 0 | 6 | SECOND |-------------| +* SECO stored 3 * 0 * 16 * SECOND (NC012031 only) * +* SECO stored 0 * 0 * 14 * SECOND (NC012255 only) * +| | | | | |-------------| +| RCYR | 0 | 0 | 12 | YEAR |-------------| +| RCMO | 0 | 0 | 4 | MONTH |-------------| +| RCDY | 0 | 0 | 6 | DAY |-------------| +| RCHR | 0 | 0 | 5 | HOUR |-------------| +| RCMI | 0 | 0 | 6 | MINUTE |-------------| +| SECX | 0 | 0 | 14 | SECOND |-------------| +| MSEC | 0 | 0 | 10 | MILLISECOND |-------------| +| CLATH | 5 | -9000000 | 25 | DEGREES |-------------| +| CLAT | 2 | -9000 | 15 | DEGREES |-------------| +| BEARAZ | 2 | 0 | 16 | DEGREES TRUE |-------------| +| SOLAZI | 2 | 0 | 16 | DEGREES TRUE |-------------| +| DRSP | 0 | 0 | 12 | DEGREE |-------------| +| PSH1 | -1 | 0 | 16 | METERS |-------------| +| ATRN | 0 | 0 | 11 | NUMERIC |-------------| +| ORBN | 0 | 0 | 24 | NUMERIC |-------------| +| | | | | |-------------| +| SLNM | 0 | 0 | 8 | NUMERIC |-------------| +* SLNM stored 0 * 0 * 13 * NUMERIC * +| | | | | |-------------| +| CHNM | 0 | 0 | 6 | NUMERIC |-------------| +| FOVN | 0 | 0 | 8 | NUMERIC |-------------| +| SCNN | 0 | 0 | 14 | NUMERIC |-------------| +| POSN | 0 | 0 | 10 | NUMERIC |-------------| +| CLAT85 | 2 | -9000 | 15 | DEGREES |-------------| +| CHNM85 | 0 | 0 | 6 | NUMERIC |-------------| +| POSN85 | 0 | 0 | 10 | NUMERIC |-------------| +| CLONH | 5 | -18000000 | 26 | DEGREES |-------------| +| CLON | 2 | -18000 | 16 | DEGREES |-------------| +| | | | | |-------------| +| WNSP | 5 | 0 | 13 | RADS/METER |-------------| +* WNSP stored 5 * 0 * 14 * RADS/METER * +| | | | | |-------------| +| CTCN | 0 | 0 | 7 | NUMERIC |-------------| +| SSTYPE | 0 | 0 | 8 | CODE TABLE |-------------| +| SSTSRC | 0 | 0 | 7 | CODE TABLE |-------------| +| CLON85 | 2 | -18000 | 16 | DEGREES |-------------| +| | | | | |-------------| +| SELV | 0 | -400 | 15 | METERS |-------------| +* SELV stored -2 * -400 * 15 * METERS (NC012005,NC005031 only) * +* SELV stored 2 * -400 * 28 * METERS (NC012009 only) * +| | | | | |-------------| +| SAZA | 2 | -9000 | 15 | DEGREES |-------------| +| SOZA | 2 | -9000 | 15 | DEGREES |-------------| +| SSGA | 1 | 0 | 11 | DEGREES |-------------| +| METFET | 0 | 0 | 6 | CODE TABLE |-------------| +| SLIT | 0 | 0 | 17 | FLAG TABLE |-------------| +| ACAV | 0 | 0 | 16 | NUMERIC |-------------| +| TDQL | 0 | 0 | 4 | CODE TABLE |-------------| +| SSMS | 0 | 0 | 4 | CODE TABLE |-------------| +| STKO | 0 | 0 | 2 | CODE TABLE |-------------| +| BEAMI | 0 | 0 | 3 | CODE TABLE |-------------| +| RCTS | 0 | 0 | 6 | CODE TABLE |-------------| +| PRES | -1 | 0 | 14 | PASCALS |-------------| +| PDNP | 2 | -1073741824 | 31 | METERS |-------------| +| SDAL | 2 | 0 | 16 | METERS |-------------| +| HOAU | 0 | 0 | 16 | METERS |-------------| +| WSPD | 1 | 0 | 12 | METERS/SECOND |-------------| +| | | | | |-------------| +| WD10 | 0 | 0 | 9 | DEGREES TRUE |-------------| +* WD10 stored 2 * 0 * 16 * DEGREES TRUE (NC012255 only) * +| | | | | |-------------| +| WS10 | 1 | 0 | 12 | METERS/SECOND |-------------| +* WS10 stored 2 * 0 * 14 * METERS/SECOND (NC012255 only) * +| | | | | |-------------| +| SDHS | 1 | 0 | 12 | METERS/SECOND |-------------| +| FUWS | 2 | 0 | 13 | METERS/SECOND |-------------| +| FUWD | 2 | 0 | 15 | DEGREES TRUE |-------------| +| MWD10 | 2 | 0 | 16 | DEGREES TRUE |-------------| +| MWS10 | 2 | 0 | 14 | METERS/SECOND |-------------| +| WD10H | 2 | 0 | 16 | DEGREES TRUE |-------------| +| WS10H | 2 | 0 | 14 | METERS/SECOND |-------------| +| TMBRST | 1 | 0 | 12 | KELVIN |-------------| +| TMINST | 1 | 0 | 12 | KELVIN |-------------| +| SDTB | 1 | 0 | 12 | KELVIN |-------------| +| TMDB | 2 | 0 | 16 | KELVIN |-------------| +| TMSK | 2 | 0 | 16 | KELVIN |-------------| +| EBBTH | 2 | 0 | 16 | KELVIN |-------------| +| TMBR | 2 | 0 | 16 | KELVIN |-------------| +| TMBR85 | 2 | 0 | 16 | KELVIN |-------------| +| REHU | 0 | 0 | 7 | PERCENT |-------------| +| | | | | |-------------| +| TOSD | 2 | -2 | 16 | METERS |-------------| +* TOSD stored 3 * -2 * 20 * METERS * +| | | | | |-------------| +| REQV | 4 | 0 | 12 | KG/((METER**2)*SECOND) |-------------| +| | | | | |-------------| +| TPWT | 0 | 0 | 7 | KG/(METER**2) |-------------| +* TPWT stored 1 * 0 * 11 * KG/(METER**2) (NC012002,NC012103 only) * +* TPWT stored 3 * 0 * 17 * KG/(METER**2) (NC012003 only) * +| | | | | |-------------| +| PRAT | 4 | 0 | 8 | KG/((METER**2)*SECOND) |-------------| +| TCWV | 4 | 0 | 19 | KG/METER**2 |-------------| +| MRWVC | 2 | 0 | 14 | KG/METER**2 |-------------| +| MRLWC | 2 | 0 | 14 | KG/M**2 |-------------| +| SMOI | 3 | 0 | 8 | METERS |-------------| +| TRRT | 2 | 0 | 12 | MM/HOUR |-------------| +| RCWA | 2 | 0 | 12 | MM |-------------| +| PCIA | 2 | 0 | 12 | MM |-------------| +| CRRT | 2 | 0 | 12 | MM/HOUR |-------------| +| ALBD | 0 | 0 | 7 | % |-------------| +| LIED | 3 | 14000 | 13 | LOG METER**-2 |-------------| +| MSCN | 0 | 0 | 31 | NUMERIC |-------------| +| OPTH | 2 | -1000 | 16 | METERS |-------------| +| HOCB | -1 | -40 | 11 | METERS |-------------| +| HOCT | -1 | -40 | 11 | METERS |-------------| +| CDBP | -1 | 0 | 14 | PA |-------------| +| CDTP | -1 | 0 | 14 | PA |-------------| +| CLDP | 0 | 0 | 3 | CODE TABLE |-------------| +| SNOC | 0 | 0 | 7 | PERCENT |-------------| +| ICEP | 3 | 0 | 10 | NUMERIC |-------------| +| ICEA | 2 | -4096 | 13 | DECIBELS |-------------| +| ICON | 0 | 0 | 7 | PERCENT |-------------| +| ICAG | 0 | 0 | 2 | CODE TABLE |-------------| +| ICED | 0 | 0 | 2 | CODE TABLE |-------------| +| SFTP | 0 | 0 | 5 | CODE TABLE |-------------| +| SFTG | 0 | 0 | 3 | CODE TABLE |-------------| +| SFTG85 | 0 | 0 | 3 | CODE TABLE |-------------| +| WSST | 0 | 0 | 3 | CODE TABLE |-------------| +| | | | | |-------------| +| VILWC | 0 | 0 | 7 | KG/(METER**2) |-------------| +* VILWC stored 2 * 0 | 12 * KG/(METER**2) * +| | | | | |-------------| +| BKST | 2 | -5000 | 13 | DECIBELS |-------------| +| RARE | 1 | 0 | 10 | PERCENT |-------------| +| CLNE | 0 | 0 | 8 | NUMERIC |-------------| +| MPCN | 0 | -127 | 8 | NUMERIC |-------------| +| WSPC | 0 | 0 | 12 | FLAG TABLE |-------------| +| WSPC2 | 0 | 0 | 13 | FLAG TABLE |-------------| +| RAPC | 0 | 0 | 8 | FLAG TABLE |-------------| +| PEAK | 0 | 0 | 16 | NUMERIC |-------------| +| SACS | 0 | 0 | 4 | FLAG TABLE |-------------| +| SAIM | 0 | 0 | 9 | FLAG TABLE |-------------| +| SPIN | 0 | 0 | 8 | NUMERIC |-------------| +| REIN | 0 | 0 | 3 | CODE TABLE |-------------| +| ACIO | 3 | 0 | 14 | METERS |-------------| +| ACDT | 3 | 0 | 9 | METERS |-------------| +| ACWT | 3 | 2000 | 10 | METERS |-------------| +| ACCC | 3 | 0 | 11 | METERS |-------------| +| OLCH | 3 | 0 | 10 | METERS |-------------| +| OLCA | 3 | -3000 | 14 | DECIBELS |-------------| +| WBKS | 2 | -5000 | 13 | DECIBELS |-------------| +| NWVA | 0 | 0 | 3 | NUMERIC |-------------| +| ISWV | 0 | 0 | 3 | NUMERIC |-------------| +| TNSM | 0 | 0 | 5 | NUMERIC |-------------| +| LKCS | 3 | -30000 | 15 | NUMERIC |-------------| +| KVCA | 3 | 0 | 14 | NUMERIC |-------------| +| KVCB | 8 | 0 | 16 | NUMERIC |-------------| +| SWVQ | 0 | 0 | 17 | FLAG TABLE |-------------| +| NIBF | 0 | 0 | 6 | NUMERIC |-------------| +| NOBF | 0 | 0 | 6 | NUMERIC |-------------| +| NIBA | 0 | 0 | 6 | NUMERIC |-------------| +| NOBA | 0 | 0 | 6 | NUMERIC |-------------| +| KVCG | 3 | -140000 | 18 | DECIBLES |-------------| +| SSQU | 0 | 0 | 17 | FLAG TABLE |-------------| +| SSMD | 0 | 0 | 17 | FLAG TABLE |-------------| +| SVQC | 2 | 0 | 16 | NUMERIC |-------------| +| ACRS | 2 | -10000 | 14 | DECIBLES |-------------| +| WSGF | 0 | 0 | 6 | CODE TABLE |-------------| +| SPRR | 3 | 0 | 10 | NUMERIC |-------------| +| SNRI | 0 | 0 | 8 | NUMERIC |-------------| +| ACST | 2 | -10000 | 14 | DECIBLES |-------------| +| SNRCS | 2 | -30000 | 15 | DECIBLES |-------------| +| BEAMC | 0 | 0 | 2 | CODE TABLE |-------------| +| EES40 | 2 | 0 | 9 | DECIBLES |-------------| +| S40IA | 2 | -80 | 7 | DECIBLES/DEGREE |-------------| +| EEL40 | 2 | -40 | 6 | DECIBLES/DEGREE |-------------| +| SMOS | 2 | 0 | 12 | DECIBLES |-------------| +| WVCQ | 0 | 0 | 24 | FLAG TABLE |-------------| +| BSCD | 1 | -4096 | 13 | NUMERIC |-------------| +| LULAU | 10 | 0 | 22 | DECIBLES/METER |-------------| +| AKPEQ | 0 | 0 | 2 | CODE TABLE |-------------| +| ASGU | 0 | 0 | 2 | CODE TABLE |-------------| +| AUSY | 3 | 0 | 10 | NUMERIC |-------------| +| ASDQ | 3 | 0 | 10 | NUMERIC |-------------| +| ASOAQ | 3 | 0 | 10 | NUMERIC |-------------| +| ASARC | 3 | 0 | 10 | NUMERIC |-------------| +| ATPQ | 3 | 0 | 10 | NUMERIC |-------------| +| AERFP | 3 | 0 | 10 | NUMERIC |-------------| +| ALFR | 3 | 0 | 10 | NUMERIC |-------------| +| SDWH | 2 | 0 | 10 | METERS |-------------| +| SST1 | 2 | 0 | 15 | KELVIN |-------------| +| SGWH | 2 | 0 | 13 | METERS |-------------| +| MWLW | 0 | 0 | 14 | METERS |-------------| +| WSLW | 0 | 0 | 14 | METERS |-------------| +| MDLW | 0 | 0 | 9 | DEGREES TRUE |-------------| +| DSLW | 0 | 0 | 9 | DEGREES |-------------| +| TELW | 0 | 0 | 31 | NUMERIC |-------------| +| IREL | 0 | 0 | 15 | NUMERIC |-------------| +| IRMS | 0 | 0 | 15 | KELVIN |-------------| +| CLTR | 0 | 0 | 4 | CODE TABLE |-------------| +| ACCO | 0 | 0 | 12 | NUMERIC |-------------| +| SWID | 0 | 0 | 14 | NUMERIC |-------------| +| DBID | 0 | 0 | 14 | NUMERIC |-------------| +| | | | | |-------------| +| MJFC | 0 | 0 | 4 | NUMERIC |-------------| +* MJFC stored 0 * 0 | 8 * NUMERIC * +| | | | | |-------------| +| TDEL | 4 | 0 | 16 | METERS |-------------| +| ETDL | 4 | 0 | 9 | METERS |-------------| +| HSDL | 4 | 0 | 16 | METERS |-------------| +| EHSD | 4 | 0 | 9 | METERS |-------------| +| WMTM | 2 | 0 | 16 | KELVIN |-------------| +| WDMF | 3 | 0 | 13 | NUMERIC |-------------| +| PD00 | 2 | -1073741824 | 31 | METERS |-------------| +| PD90 | 2 | -1073741824 | 31 | METERS |-------------| +| COGT | 0 | 0 | 3 | CODE TABLE |-------------| +| CHSQ | 2 | 0 | 17 | NUMERIC |-------------| +| WSEQC1 | 0 | 0 | 31 | FLAG TABLE |-------------| +| PHER | 1 | 0 | 12 | DEGREES TRUE |-------------| +| CORN | 0 | 0 | 3 | CODE TABLE |-------------| +| RFLG | 0 | 0 | 3 | CODE TABLE |-------------| +| PRXF | 0 | 0 | 4 | CODE TABLE |-------------| +| OSQC | 0 | 0 | 3 | CODE TABLE |-------------| +| OPQF | 0 | 0 | 24 | FLAG TABLE |-------------| +| SSTE | 2 | 0 | 16 | KELVIN |-------------| +| SPDE | 2 | 0 | 15 | METERS/SECOND |-------------| +| VPRE | 2 | 0 | 14 | KG/METER**2 |-------------| +| CLDE | 3 | 0 | 14 | KG/METER**2 |-------------| +| BUHD | 0 | 0 | 48 | CCITT IA5 |-------------| +| BULTIM | 0 | 0 | 48 | CCITT IA5 |-------------| +| BORG | 0 | 0 | 32 | CCITT IA5 |-------------| +| BBB | 0 | 0 | 48 | CCITT IA5 |-------------| +| SEQNUM | 0 | 0 | 32 | CCITT IA5 |-------------| +| SSOM | 1 | 0 | 10 | PERCENT |-------------| +| EESSM | 1 | 0 | 10 | PERCENT |-------------| +| MSSM | 3 | 0 | 10 | NUMERIC |-------------| +| RFDT | 3 | 0 | 10 | NUMERIC |-------------| +| SMCF | 0 | 0 | 8 | FLAG TABLE |-------------| +| SMPF | 0 | 0 | 16 | FLAG TABLE |-------------| +| SMQL | 1 | 0 | 10 | PERCENT |-------------| +| FLSF | 1 | 0 | 10 | PERCENT |-------------| +| IWFR | 1 | 0 | 10 | PERCENT |-------------| +| TPCX | 1 | 0 | 10 | PERCENT |-------------| +| | | | | |-------------| +`------------------------------------------------------------------------------' diff --git a/parm/analysis/gsi/enkf.nml.tmp b/parm/analysis/gsi/enkf.nml.tmp new file mode 100644 index 000000000..a51613021 --- /dev/null +++ b/parm/analysis/gsi/enkf.nml.tmp @@ -0,0 +1,118 @@ +&nam_enkf + datestring="_datestring_",datapath="./", + analpertwtnh=0.85,analpertwtsh=0.85,analpertwttr=0.85, + covinflatemax=1.e2,covinflatemin=1,pseudo_rh=.true.,iassim_order=0, + corrlengthnh=400,corrlengthsh=400,corrlengthtr=400, + lnsigcutoffnh=0.5,lnsigcutoffsh=0.5,lnsigcutofftr=0.5, + lnsigcutoffpsnh=0.5,lnsigcutoffpssh=0.5,lnsigcutoffpstr=0.5, + lnsigcutoffsatnh=0.5,lnsigcutoffsatsh=0.5,lnsigcutoffsattr=0.5, + obtimelnh=1.e30,obtimelsh=1.e30,obtimeltr=1.e30, + saterrfact=1.0,numiter=1, + sprd_tol=1.e30,paoverpb_thresh=0.98, + nlons=_nlons_,nlats=_nlats_,nlevs=_nlevs_,nanals=_nanals_, + deterministic=.true.,sortinc=.true.,lupd_satbiasc=.false., + reducedgrid=.true.,readin_localization=.false., + use_gfs_nemsio=.false.,use_gfs_ncio=.false.,imp_physics=11,lupp=.false., + univaroz=.false.,adp_anglebc=.true.,angord=4,use_edges=.false.,emiss_bc=.true., + letkf_flag=.false.,nobsl_max=10000,denkf=.false.,getkf=.false., + nhr_anal=6,nhr_state=6,use_qsatensmean=.false., + lobsdiag_forenkf=.false., + write_spread_diag=.false., + modelspace_vloc=.false., + use_correlated_oberrs=.false., + netcdf_diag=_netcdf_diag_,cnvw_option=.false., + paranc=.false.,write_fv3_incr=.false., + incvars_to_zero='NONE', + smoothparm=-1, + ldo_enscalc_option=_ldo_enscalc_option_, +/ + +&satobs_enkf + sattypes_rad(1) = 'amsua_n15', dsis(1) = 'amsua_n15', + sattypes_rad(2) = 'amsua_n18', dsis(2) = 'amsua_n18', + sattypes_rad(3) = 'amsua_n19', dsis(3) = 'amsua_n19', + sattypes_rad(4) = 'amsub_n16', dsis(4) = 'amsub_n16', + sattypes_rad(5) = 'amsub_n17', dsis(5) = 'amsub_n17', + sattypes_rad(6) = 'amsua_aqua', dsis(6) = 'amsua_aqua', + sattypes_rad(7) = 'amsua_metop-a', dsis(7) = 'amsua_metop-a', + sattypes_rad(8) = 'airs_aqua', dsis(8) = 'airs_aqua', + sattypes_rad(9) = 'hirs3_n17', dsis(9) = 'hirs3_n17', + sattypes_rad(10)= 'hirs4_n19', dsis(10)= 'hirs4_n19', + sattypes_rad(11)= 'hirs4_metop-a', dsis(11)= 'hirs4_metop-a', + sattypes_rad(12)= 'mhs_n18', dsis(12)= 'mhs_n18', + sattypes_rad(13)= 'mhs_n19', dsis(13)= 'mhs_n19', + sattypes_rad(14)= 'mhs_metop-a', dsis(14)= 'mhs_metop-a', + sattypes_rad(15)= 'goes_img_g11', dsis(15)= 'imgr_g11', + sattypes_rad(16)= 'goes_img_g12', dsis(16)= 'imgr_g12', + sattypes_rad(17)= 'goes_img_g13', dsis(17)= 'imgr_g13', + sattypes_rad(18)= 'goes_img_g14', dsis(18)= 'imgr_g14', + sattypes_rad(19)= 'goes_img_g15', dsis(19)= 'imgr_g15', + sattypes_rad(20)= 'avhrr_n18', dsis(20)= 'avhrr3_n18', + sattypes_rad(21)= 'avhrr_metop-a', dsis(21)= 'avhrr3_metop-a', + sattypes_rad(22)= 'avhrr_n19', dsis(22)= 'avhrr3_n19', + sattypes_rad(23)= 'amsre_aqua', dsis(23)= 'amsre_aqua', + sattypes_rad(24)= 'ssmis_f16', dsis(24)= 'ssmis_f16', + sattypes_rad(25)= 'ssmis_f17', dsis(25)= 'ssmis_f17', + sattypes_rad(26)= 'ssmis_f18', dsis(26)= 'ssmis_f18', + sattypes_rad(27)= 'ssmis_f19', dsis(27)= 'ssmis_f19', + sattypes_rad(28)= 'ssmis_f20', dsis(28)= 'ssmis_f20', + sattypes_rad(29)= 'sndrd1_g11', dsis(29)= 'sndrD1_g11', + sattypes_rad(30)= 'sndrd2_g11', dsis(30)= 'sndrD2_g11', + sattypes_rad(31)= 'sndrd3_g11', dsis(31)= 'sndrD3_g11', + sattypes_rad(32)= 'sndrd4_g11', dsis(32)= 'sndrD4_g11', + sattypes_rad(33)= 'sndrd1_g12', dsis(33)= 'sndrD1_g12', + sattypes_rad(34)= 'sndrd2_g12', dsis(34)= 'sndrD2_g12', + sattypes_rad(35)= 'sndrd3_g12', dsis(35)= 'sndrD3_g12', + sattypes_rad(36)= 'sndrd4_g12', dsis(36)= 'sndrD4_g12', + sattypes_rad(37)= 'sndrd1_g13', dsis(37)= 'sndrD1_g13', + sattypes_rad(38)= 'sndrd2_g13', dsis(38)= 'sndrD2_g13', + sattypes_rad(39)= 'sndrd3_g13', dsis(39)= 'sndrD3_g13', + sattypes_rad(40)= 'sndrd4_g13', dsis(40)= 'sndrD4_g13', + sattypes_rad(41)= 'sndrd1_g14', dsis(41)= 'sndrD1_g14', + sattypes_rad(42)= 'sndrd2_g14', dsis(42)= 'sndrD2_g14', + sattypes_rad(43)= 'sndrd3_g14', dsis(43)= 'sndrD3_g14', + sattypes_rad(44)= 'sndrd4_g14', dsis(44)= 'sndrD4_g14', + sattypes_rad(45)= 'sndrd1_g15', dsis(45)= 'sndrD1_g15', + sattypes_rad(46)= 'sndrd2_g15', dsis(46)= 'sndrD2_g15', + sattypes_rad(47)= 'sndrd3_g15', dsis(47)= 'sndrD3_g15', + sattypes_rad(48)= 'sndrd4_g15', dsis(48)= 'sndrD4_g15', + sattypes_rad(49)= 'iasi_metop-a', dsis(49)= 'iasi_metop-a', + sattypes_rad(50)= 'seviri_m08', dsis(50)= 'seviri_m08', + sattypes_rad(51)= 'seviri_m09', dsis(51)= 'seviri_m09', + sattypes_rad(52)= 'seviri_m10', dsis(52)= 'seviri_m10', + sattypes_rad(53)= 'seviri_m11', dsis(53)= 'seviri_m11', + sattypes_rad(54)= 'amsua_metop-b', dsis(54)= 'amsua_metop-b', + sattypes_rad(55)= 'hirs4_metop-b', dsis(55)= 'hirs4_metop-b', + sattypes_rad(56)= 'mhs_metop-b', dsis(56)= 'mhs_metop-b', + sattypes_rad(57)= 'iasi_metop-b', dsis(57)= 'iasi_metop-b', + sattypes_rad(58)= 'avhrr_metop-b', dsis(58)= 'avhrr3_metop-b', + sattypes_rad(59)= 'atms_npp', dsis(59)= 'atms_npp', + sattypes_rad(60)= 'atms_n20', dsis(60)= 'atms_n20', + sattypes_rad(61)= 'cris_npp', dsis(61)= 'cris_npp', + sattypes_rad(62)= 'cris-fsr_npp', dsis(62)= 'cris-fsr_npp', + sattypes_rad(63)= 'cris-fsr_n20', dsis(63)= 'cris-fsr_n20', + sattypes_rad(64)= 'gmi_gpm', dsis(64)= 'gmi_gpm', + sattypes_rad(65)= 'saphir_meghat', dsis(65)= 'saphir_meghat', + sattypes_rad(66)= 'amsua_metop-c', dsis(66)= 'amsua_metop-c', + sattypes_rad(67)= 'mhs_metop-c', dsis(67)= 'mhs_metop-c', + sattypes_rad(68)= 'ahi_himawari8', dsis(68)= 'ahi_himawari8', + sattypes_rad(69)= 'abi_g16', dsis(69)= 'abi_g16', + sattypes_rad(70)= 'abi_g17', dsis(70)= 'abi_g17', +/ + +&ozobs_enkf + sattypes_oz(1) = 'sbuv2_n16', + sattypes_oz(2) = 'sbuv2_n17', + sattypes_oz(3) = 'sbuv2_n18', + sattypes_oz(4) = 'sbuv2_n19', + sattypes_oz(5) = 'omi_aura', + sattypes_oz(6) = 'gome_metop-a', + sattypes_oz(7) = 'gome_metop-b', + sattypes_oz(8) = 'mls30_aura', + sattypes_oz(9) = 'ompsnp_npp', + sattypes_oz(10) = 'ompstc8_npp', +/ + +&nam_fv3 + fv3fixpath="./",nx_res=_nx_res_,ny_res=_ny_res_,ntiles=1, +/ diff --git a/parm/analysis/gsi/global_ozinfo.txt b/parm/analysis/gsi/global_ozinfo.txt new file mode 100644 index 000000000..7fcb4203d --- /dev/null +++ b/parm/analysis/gsi/global_ozinfo.txt @@ -0,0 +1,298 @@ +! For mls data, pressure and obs errors are pulled from bufr, so not listed here +! sens/instr/sat lev use pressure gross obs b_oz pg_oz +! error error variational qc + sbuv6_n14 1 -1 0.240 1.000 1.000 10.000 0.000 + sbuv6_n14 2 -1 0.490 1.000 1.000 10.000 0.000 + sbuv6_n14 3 -1 0.980 1.000 1.000 10.000 0.000 + sbuv6_n14 4 -1 1.950 1.000 1.000 10.000 0.000 + sbuv6_n14 5 -1 3.900 2.000 1.000 10.000 0.000 + sbuv6_n14 6 -1 7.800 3.000 1.414 10.000 0.000 + sbuv6_n14 7 -1 15.600 5.000 1.225 10.000 0.000 + sbuv6_n14 8 -1 31.000 7.000 1.225 10.000 0.000 + sbuv6_n14 9 -1 62.000 7.000 1.871 10.000 0.000 + sbuv6_n14 10 -1 125.000 5.000 1.871 10.000 0.000 + sbuv6_n14 11 -1 250.000 3.000 1.732 10.000 0.000 + sbuv6_n14 12 -1 1000.000 3.000 1.414 10.000 0.000 + sbuv6_n14 13 -1 0.000 12.000 2.236 10.000 0.000 + sbuv6_n16 1 -1 0.240 1.000 1.000 10.000 0.000 + sbuv6_n16 2 -1 0.490 1.000 1.000 10.000 0.000 + sbuv6_n16 3 -1 0.980 1.000 1.000 10.000 0.000 + sbuv6_n16 4 -1 1.950 1.000 1.000 10.000 0.000 + sbuv6_n16 5 -1 3.900 2.000 1.000 10.000 0.000 + sbuv6_n16 6 -1 7.800 3.000 1.414 10.000 0.000 + sbuv6_n16 7 -1 15.600 5.000 1.225 10.000 0.000 + sbuv6_n16 8 -1 31.000 7.000 1.225 10.000 0.000 + sbuv6_n16 9 -1 62.000 7.000 1.871 10.000 0.000 + sbuv6_n16 10 -1 125.000 5.000 1.871 10.000 0.000 + sbuv6_n16 11 -1 250.000 3.000 1.732 10.000 0.000 + sbuv6_n16 12 -1 1000.000 3.000 1.414 10.000 0.000 + sbuv6_n16 13 -1 0.000 12.000 2.236 10.000 0.000 + sbuv6_n17 1 -1 0.240 1.000 1.000 10.000 0.000 + sbuv6_n17 2 -1 0.490 1.000 1.000 10.000 0.000 + sbuv6_n17 3 -1 0.980 1.000 1.000 10.000 0.000 + sbuv6_n17 4 -1 1.950 1.000 1.000 10.000 0.000 + sbuv6_n17 5 -1 3.900 2.000 1.000 10.000 0.000 + sbuv6_n17 6 -1 7.800 3.000 1.414 10.000 0.000 + sbuv6_n17 7 -1 15.600 5.000 1.225 10.000 0.000 + sbuv6_n17 8 -1 31.000 7.000 1.225 10.000 0.000 + sbuv6_n17 9 -1 62.000 7.000 1.871 10.000 0.000 + sbuv6_n17 10 -1 125.000 5.000 1.871 10.000 0.000 + sbuv6_n17 11 -1 250.000 3.000 1.732 10.000 0.000 + sbuv6_n17 12 -1 1000.000 3.000 1.414 10.000 0.000 + sbuv6_n17 13 -1 0.000 12.000 2.236 10.000 0.000 + sbuv6_n18 1 -1 0.240 1.000 1.000 10.000 0.000 + sbuv6_n18 2 -1 0.490 1.000 1.000 10.000 0.000 + sbuv6_n18 3 -1 0.980 1.000 1.000 10.000 0.000 + sbuv6_n18 4 -1 1.950 1.000 1.000 10.000 0.000 + sbuv6_n18 5 -1 3.900 2.000 1.000 10.000 0.000 + sbuv6_n18 6 -1 7.800 3.000 1.414 10.000 0.000 + sbuv6_n18 7 -1 15.600 5.000 1.225 10.000 0.000 + sbuv6_n18 8 -1 31.000 7.000 1.225 10.000 0.000 + sbuv6_n18 9 -1 62.000 7.000 1.871 10.000 0.000 + sbuv6_n18 10 -1 125.000 5.000 1.871 10.000 0.000 + sbuv6_n18 11 -1 250.000 3.000 1.732 10.000 0.000 + sbuv6_n18 12 -1 1000.000 3.000 1.414 10.000 0.000 + sbuv6_n18 13 -1 0.000 12.000 2.236 10.000 0.000 + sbuv8_n16 1 -1 0.100 1.000 0.040 10.000 0.000 + sbuv8_n16 2 -1 0.158 1.000 0.020 10.000 0.000 + sbuv8_n16 3 -1 0.251 1.000 0.015 10.000 0.000 + sbuv8_n16 4 -1 0.398 1.000 0.030 10.000 0.000 + sbuv8_n16 5 -1 0.631 1.000 0.150 10.000 0.000 + sbuv8_n16 6 -1 1.000 1.000 0.050 10.000 0.000 + sbuv8_n16 7 -1 1.580 1.000 0.125 10.000 0.000 + sbuv8_n16 8 -1 2.510 1.282 0.200 10.000 0.000 + sbuv8_n16 9 -1 3.980 2.051 0.500 10.000 0.000 + sbuv8_n16 10 -1 6.310 2.641 0.500 10.000 0.000 + sbuv8_n16 11 -1 10.000 3.590 0.750 10.000 0.000 + sbuv8_n16 12 -1 15.800 5.052 1.225 10.000 0.000 + sbuv8_n16 13 -1 25.100 6.273 1.225 10.000 0.000 + sbuv8_n16 14 -1 39.800 7.000 1.423 10.000 0.000 + sbuv8_n16 15 -1 63.100 6.940 1.871 10.000 0.000 + sbuv8_n16 16 -1 100.000 5.752 1.871 10.000 0.000 + sbuv8_n16 17 -1 158.000 4.422 1.831 10.000 0.000 + sbuv8_n16 18 -1 251.000 3.000 1.730 10.000 0.000 + sbuv8_n16 19 -1 398.000 3.000 1.667 10.000 0.000 + sbuv8_n16 20 -1 631.000 3.000 1.567 10.000 0.000 + sbuv8_n16 21 -1 1000.000 3.000 1.408 10.000 0.000 + sbuv8_n16 22 -1 0.000 12.000 2.236 10.000 0.000 + sbuv8_n17 1 -1 0.100 1.000 0.040 10.000 0.000 + sbuv8_n17 2 -1 0.158 1.000 0.020 10.000 0.000 + sbuv8_n17 3 -1 0.251 1.000 0.015 10.000 0.000 + sbuv8_n17 4 -1 0.398 1.000 0.030 10.000 0.000 + sbuv8_n17 5 -1 0.631 1.000 0.150 10.000 0.000 + sbuv8_n17 6 -1 1.000 1.000 0.050 10.000 0.000 + sbuv8_n17 7 -1 1.580 1.000 0.125 10.000 0.000 + sbuv8_n17 8 -1 2.510 1.282 0.200 10.000 0.000 + sbuv8_n17 9 -1 3.980 2.051 0.500 10.000 0.000 + sbuv8_n17 10 -1 6.310 2.641 0.500 10.000 0.000 + sbuv8_n17 11 -1 10.000 3.590 0.750 10.000 0.000 + sbuv8_n17 12 -1 15.800 5.052 1.225 10.000 0.000 + sbuv8_n17 13 -1 25.100 6.273 1.225 10.000 0.000 + sbuv8_n17 14 -1 39.800 7.000 1.423 10.000 0.000 + sbuv8_n17 15 -1 63.100 6.940 1.871 10.000 0.000 + sbuv8_n17 16 -1 100.000 5.752 1.871 10.000 0.000 + sbuv8_n17 17 -1 158.000 4.422 1.831 10.000 0.000 + sbuv8_n17 18 -1 251.000 3.000 1.730 10.000 0.000 + sbuv8_n17 19 -1 398.000 3.000 1.667 10.000 0.000 + sbuv8_n17 20 -1 631.000 3.000 1.567 10.000 0.000 + sbuv8_n17 21 -1 1000.000 3.000 1.408 10.000 0.000 + sbuv8_n17 22 -1 0.000 12.000 2.236 10.000 0.000 + sbuv8_n18 1 -1 0.100 1.000 0.040 10.000 0.000 + sbuv8_n18 2 -1 0.158 1.000 0.020 10.000 0.000 + sbuv8_n18 3 -1 0.251 1.000 0.015 10.000 0.000 + sbuv8_n18 4 -1 0.398 1.000 0.030 10.000 0.000 + sbuv8_n18 5 -1 0.631 1.000 0.150 10.000 0.000 + sbuv8_n18 6 -1 1.000 1.000 0.050 10.000 0.000 + sbuv8_n18 7 -1 1.580 1.000 0.125 10.000 0.000 + sbuv8_n18 8 -1 2.510 1.282 0.200 10.000 0.000 + sbuv8_n18 9 -1 3.980 2.051 0.500 10.000 0.000 + sbuv8_n18 10 -1 6.310 2.641 0.500 10.000 0.000 + sbuv8_n18 11 -1 10.000 3.590 0.750 10.000 0.000 + sbuv8_n18 12 -1 15.800 5.052 1.225 10.000 0.000 + sbuv8_n18 13 -1 25.100 6.273 1.225 10.000 0.000 + sbuv8_n18 14 -1 39.800 7.000 1.423 10.000 0.000 + sbuv8_n18 15 -1 63.100 6.940 1.871 10.000 0.000 + sbuv8_n18 16 -1 100.000 5.752 1.871 10.000 0.000 + sbuv8_n18 17 -1 158.000 4.422 1.831 10.000 0.000 + sbuv8_n18 18 -1 251.000 3.000 1.730 10.000 0.000 + sbuv8_n18 19 -1 398.000 3.000 1.667 10.000 0.000 + sbuv8_n18 20 -1 631.000 3.000 1.567 10.000 0.000 + sbuv8_n18 21 -1 1000.000 3.000 1.408 10.000 0.000 + sbuv8_n18 22 -1 0.000 12.000 2.236 10.000 0.000 + sbuv8_n19 1 -1 0.100 1.000 0.040 10.000 0.000 + sbuv8_n19 2 -1 0.158 1.000 0.020 10.000 0.000 + sbuv8_n19 3 -1 0.251 1.000 0.015 10.000 0.000 + sbuv8_n19 4 -1 0.398 1.000 0.030 10.000 0.000 + sbuv8_n19 5 -1 0.631 1.000 0.150 10.000 0.000 + sbuv8_n19 6 -1 1.000 1.000 0.050 10.000 0.000 + sbuv8_n19 7 -1 1.580 1.000 0.125 10.000 0.000 + sbuv8_n19 8 -1 2.510 1.282 0.200 10.000 0.000 + sbuv8_n19 9 -1 3.980 2.051 0.500 10.000 0.000 + sbuv8_n19 10 -1 6.310 2.641 0.500 10.000 0.000 + sbuv8_n19 11 -1 10.000 3.590 0.750 10.000 0.000 + sbuv8_n19 12 -1 15.800 5.052 1.225 10.000 0.000 + sbuv8_n19 13 -1 25.100 6.273 1.225 10.000 0.000 + sbuv8_n19 14 -1 39.800 7.000 1.423 10.000 0.000 + sbuv8_n19 15 -1 63.100 6.940 1.871 10.000 0.000 + sbuv8_n19 16 -1 100.000 5.752 1.871 10.000 0.000 + sbuv8_n19 17 -1 158.000 4.422 1.831 10.000 0.000 + sbuv8_n19 18 -1 251.000 3.000 1.730 10.000 0.000 + sbuv8_n19 19 -1 398.000 3.000 1.667 10.000 0.000 + sbuv8_n19 20 -1 631.000 3.000 1.567 10.000 0.000 + sbuv8_n19 21 -1 1000.000 3.000 1.408 10.000 0.000 + sbuv8_n19 22 -1 0.000 12.000 2.236 10.000 0.000 + ompsnp_npp 1 -1 0.100 1.000 0.040 10.000 0.000 + ompsnp_npp 2 -1 0.158 1.000 0.020 10.000 0.000 + ompsnp_npp 3 -1 0.251 1.000 0.015 10.000 0.000 + ompsnp_npp 4 -1 0.398 1.000 0.030 10.000 0.000 + ompsnp_npp 5 -1 0.631 1.000 0.150 10.000 0.000 + ompsnp_npp 6 1 1.000 1.000 0.056 10.000 0.000 + ompsnp_npp 7 1 1.580 1.000 0.125 10.000 0.000 + ompsnp_npp 8 1 2.510 1.282 0.200 10.000 0.000 + ompsnp_npp 9 1 3.980 2.051 0.299 10.000 0.000 + ompsnp_npp 10 1 6.310 2.641 0.587 10.000 0.000 + ompsnp_npp 11 1 10.000 3.590 0.864 10.000 0.000 + ompsnp_npp 12 1 15.800 5.052 1.547 10.000 0.000 + ompsnp_npp 13 1 25.100 6.273 2.718 10.000 0.000 + ompsnp_npp 14 1 39.800 7.000 3.893 10.000 0.000 + ompsnp_npp 15 1 63.100 6.940 4.353 10.000 0.000 + ompsnp_npp 16 1 100.000 5.752 3.971 10.000 0.000 + ompsnp_npp 17 1 158.000 4.422 4.407 10.000 0.000 + ompsnp_npp 18 1 251.000 4.000 4.428 10.000 0.000 + ompsnp_npp 19 1 398.000 3.000 3.312 10.000 0.000 + ompsnp_npp 20 1 631.000 3.000 2.198 10.000 0.000 + ompsnp_npp 21 1 1000.000 3.000 2.285 10.000 0.000 + ompsnp_npp 22 -1 0.000 12.000 7.236 10.000 0.000 + omi_aura 1 1 0.000 6.000 6.000 10.000 0.000 + gome_metop-a 1 -1 0.000 12.000 2.236 10.000 0.000 + gome_metop-b 1 -1 0.000 12.000 2.236 10.000 0.000 + mls22_aura 1 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 2 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 3 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 4 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 5 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 6 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 7 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 8 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 9 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 10 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 11 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 12 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 13 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 14 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 15 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 16 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 17 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 18 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 19 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 20 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 21 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 22 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 23 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 24 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 25 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 26 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 27 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 28 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 29 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 30 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 31 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 32 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 33 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 34 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 35 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 36 -1 999.999 9.999 9.999 10.000 0.000 + mls22_aura 37 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 1 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 2 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 3 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 4 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 5 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 6 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 7 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 8 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 9 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 10 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 11 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 12 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 13 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 14 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 15 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 16 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 17 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 18 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 19 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 20 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 21 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 22 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 23 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 24 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 25 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 26 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 27 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 28 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 29 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 30 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 31 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 32 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 33 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 34 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 35 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 36 -1 999.999 9.999 9.999 10.000 0.000 + mls20_aura 37 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 1 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 2 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 3 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 4 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 5 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 6 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 7 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 8 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 9 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 10 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 11 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 12 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 13 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 14 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 15 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 16 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 17 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 18 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 19 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 20 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 21 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 22 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 23 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 24 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 25 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 26 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 27 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 28 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 29 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 30 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 31 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 32 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 33 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 34 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 35 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 36 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 37 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 38 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 39 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 40 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 41 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 42 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 43 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 44 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 45 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 46 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 47 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 48 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 49 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 50 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 51 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 52 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 53 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 54 -1 999.999 9.999 9.999 10.000 0.000 + mls30_aura 55 -1 999.999 9.999 9.999 10.000 0.000 + ompstc8_npp 1 1 0.000 6.000 6.000 10.000 0.000 diff --git a/parm/analysis/gsi/global_scaninfo.txt b/parm/analysis/gsi/global_scaninfo.txt new file mode 100644 index 000000000..7c4ccd1ce --- /dev/null +++ b/parm/analysis/gsi/global_scaninfo.txt @@ -0,0 +1,48 @@ + hirs2_n14 -49.500 1.800 56 7 50 + hirs3_n16 -49.500 1.800 56 7 50 + hirs3_n17 -49.500 1.800 56 7 50 + hirs4_n18 -49.500 1.800 56 7 50 + hirs4_n19 -49.500 1.800 56 7 50 + amsua_n15 -48.333 3.333 30 4 27 + amsua_n16 -48.333 3.333 30 4 27 + amsua_n17 -48.333 3.333 30 4 27 + amsua_n18 -48.333 3.333 30 4 27 + amsua_n19 -48.333 3.333 30 4 27 + amsub_n15 -48.950 1.100 90 10 81 + amsub_n16 -48.950 1.100 90 10 81 + amsub_n17 -48.950 1.100 90 10 81 + atms_npp -52.725 1.110 96 7 90 + atms_n20 -52.725 1.110 96 7 90 + mhs_n18 -49.444 1.111 90 10 81 + mhs_n19 -49.444 1.111 90 10 81 + airs_aqua -48.900 1.100 90 10 81 + amsua_aqua -48.333 3.333 30 4 27 + hirs4_metop-a -49.500 1.800 56 7 50 + hirs4_metop-b -49.500 1.800 56 7 50 + amsua_metop-a -48.333 3.333 30 4 27 + amsua_metop-b -48.333 3.333 30 4 27 + amsua_metop-c -48.333 3.333 30 4 27 + mhs_metop-a -49.444 1.111 90 10 81 + mhs_metop-b -49.444 1.111 90 10 81 + mhs_metop-c -49.444 1.111 90 10 81 + iasi_metop-a -48.330 3.334 60 5 56 + iasi_metop-b -48.330 3.334 60 5 56 + iasi_metop-c -48.330 3.334 60 5 56 + msu_n14 -47.370 9.474 90 2 10 + ssu -35.000 10.000 90 2 7 + hsb -48.950 1.100 90 10 81 + seviri_m09 0.000 1.000 90 -1 -1 + seviri_m10 0.000 1.000 90 -1 -1 + cris_npp -48.330 3.3331 30 1 30 + cris-fsr_npp -48.330 3.3331 30 1 30 + cris-fsr_n20 -48.330 3.3331 30 1 30 + ssmis_f16 0.000 1.000 60 1 60 + ssmis_f17 0.000 1.000 60 1 60 + ssmis_f18 0.000 1.000 60 1 60 + avhrr3_n18 -52.612 1.182 90 1 90 + avhrr3_metop-a -52.612 1.182 90 1 90 + avhrr3_n19 -52.612 1.182 90 1 90 + avhrr3_metop-b -52.612 1.182 90 1 90 + avhrr3_metop-c -52.612 1.182 90 1 90 + saphir_meghat -42.960 0.666 130 1 130 +!sat_sis start step nstep edge1 edge2 diff --git a/parm/analysis/gsi/gsiparm.anl.tmp b/parm/analysis/gsi/gsiparm.anl.tmp new file mode 100644 index 000000000..3f0d40b21 --- /dev/null +++ b/parm/analysis/gsi/gsiparm.anl.tmp @@ -0,0 +1,257 @@ +&SETUP + miter=_MITER_, + niter(1)=_NITER_,niter(2)=_NITER_, + niter_no_qc(1)=20,niter_no_qc(2)=0, + write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true., + qoption=2, + gencode=78,deltim=1200, + factqmin=0.0,factqmax=0.0, + iguess=-1, + aircraft_recon=.true., + oneobtest=.false.,retrieval=.false.,l_foto=.false., + nhr_assimilation=6, + use_pbl=.true.,use_compress=.false.,nsig_ext=12,gpstop=50., + use_gfs_nemsio=_USE_GFS_NEMSIO_,use_gfs_ncio=_USE_GFS_NCIO_, + print_diag_pcg=.true.,l2rwthin=.false.,hurricane_radar=.true., + use_gfs_ozone=.false., + lrun_subdirs=.true., + netcdf_diag=_NETCDF_DIAG_,binary_diag=_BINARY_DIAG_, + newpc4pred=.true., adp_anglebc=.true., angord=4, + passive_bc=.false., use_edges=.false., emiss_bc=.true., + diag_precon=.true., step_start=1.e-3, upd_pred(1)=0, + upd_pred(2)=0,upd_pred(3)=0,upd_pred(4)=0, + upd_pred(5)=0,upd_pred(6)=0,upd_pred(7)=0, + upd_pred(8)=0,upd_pred(9)=0,upd_pred(10)=0, + upd_pred(11)=0,upd_pred(12)=0, + lread_obs_save=_LREAD_OBS_SAVE_, + lread_obs_skip=_LREAD_OBS_SKIP_, + ens_nstarthr=_ENS_NSTARTHR_, + lwrite_predterms=_LWRITE_PREDTERMS_,lwrite_peakwt=_LWRITE_PEAKWT_,reduce_diag=_REDUCE_DIAG_, +/ +&GRIDOPTS + fv3_regional=.true., + grid_ratio_fv3_regional=_GRID_RATIO_FV3_REGIONAL_, + nvege_type=20, +/ +&BKGERR + vs=1.0, + hzscl=0.2,0.4,0.8, + bw=0., + fstat=.false., +/ +&ANBKGERR + anisotropic=.false.,an_vs=1.0,ngauss=1, + an_flen_u=-5.,an_flen_t=3.,an_flen_z=-200., + ifilt_ord=2,npass=3,normal=-200,grid_ratio=4.,nord_f2a=4, +/ +&JCOPTS +/ +&STRONGOPTS + tlnmc_option=0,reg_tlnmc_type=1,nstrong=1,nvmodes_keep=8,period_max=6., + period_width=1.5,baldiag_full=.false.,baldiag_inc=.false., +/ +&OBSQC + dfact=0.75,dfact1=3.0,erradar_inflate=1.0,tdrerr_inflate=.true., + noiqc=.true.,c_varqc=0.03333,vadfile='prepbufr',njqc=.false.,vqc=.true.,vadwnd_l2rw_qc=.false., + q_doe_a_136=1.4, + q_doe_b_136=0.0003, + q_doe_a_137=1.0, + q_doe_b_137=0.0002, + t_doe_a_136=1.15, + t_doe_b_136=0.23, + t_doe_a_137=1.0, + t_doe_b_137=0.2, + uv_doe_a_236=0.75, + uv_doe_b_236=0.5, + uv_doe_a_237=0.75, + uv_doe_b_237=0.3, + uv_doe_a_213=1.0, + uv_doe_b_213=5.0, +/ +&OBS_INPUT + dmesh(1)=90.0,dmesh(2)=45.0,dmesh(3)=45.0,dmesh(4)=45.0,dmesh(5)=90,time_window_max=3.0,l_foreaft_thin=.false., +/ +OBS_INPUT:: +! dfile dtype dplat dsis dval dthin dsfcalc + prepbufr ps null ps 0.0 0 0 + prepbufr t null t 0.0 0 0 + prepbufr_profl t null t 0.0 0 0 + prepbufr q null q 0.0 0 0 + prepbufr_profl q null q 0.0 0 0 + prepbufr pw null pw 0.0 0 0 + prepbufr uv null uv 0.0 0 0 + prepbufr_profl uv null uv 0.0 0 0 + satwndbufr uv null uv 0.0 0 0 + prepbufr spd null spd 0.0 0 0 + prepbufr dw null dw 0.0 0 0 + radarbufr rw null rw 0.0 0 0 + prepbufr sst null sst 0.0 0 0 + tcvitl tcp null tcp 0.0 0 0 + tldplrbufr rw null rw 0.0 0 0 + l2rwbufr rw null l2rw 0.0 0 0 + hdobbufr uv null uv 0.0 0 0 + hdobbufr t null t 0.0 0 0 + hdobbufr q null q 0.0 0 0 + hdobbufr spd null spd 0.0 0 0 + gpsrobufr gps_bnd null gps 0.0 0 0 + ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 + tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 + sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 + sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 + sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 + hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 + hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 + gimgrbufr goes_img g11 imgr_g11 0.0 1 0 + gimgrbufr goes_img g12 imgr_g12 0.0 1 0 + airsbufr airs aqua airs_aqua 0.0 1 1 + amsuabufr amsua n15 amsua_n15 0.0 2 1 + amsuabufr amsua n18 amsua_n18 0.0 2 1 + amsuabufr amsua metop-a amsua_metop-a 0.0 2 1 + airsbufr amsua aqua amsua_aqua 0.0 2 1 + amsubbufr amsub n17 amsub_n17 0.0 3 1 + mhsbufr mhs n18 mhs_n18 0.0 3 1 + mhsbufr mhs metop-a mhs_metop-a 0.0 3 1 + ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 + amsrebufr amsre_low aqua amsre_aqua 0.0 4 0 + amsrebufr amsre_mid aqua amsre_aqua 0.0 4 0 + amsrebufr amsre_hig aqua amsre_aqua 0.0 4 0 + ssmisbufr ssmis f16 ssmis_f16 0.0 4 0 + ssmisbufr ssmis f17 ssmis_f17 0.0 4 0 + ssmisbufr ssmis f18 ssmis_f18 0.0 4 0 + ssmisbufr ssmis f19 ssmis_f19 0.0 4 0 + gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 5 0 + gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 5 0 + gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 5 0 + gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 5 0 + gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 5 0 + gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 5 0 + gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 5 0 + gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 5 0 + gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 5 0 + gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 5 0 + gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 5 0 + gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 5 0 + iasibufr iasi metop-a iasi_metop-a 0.0 1 1 + gomebufr gome metop-a gome_metop-a 0.0 2 0 + omibufr omi aura omi_aura 0.0 2 0 + sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 + hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 + amsuabufr amsua n19 amsua_n19 0.0 2 1 + mhsbufr mhs n19 mhs_n19 0.0 3 1 + seviribufr seviri m08 seviri_m08 0.0 1 0 + seviribufr seviri m09 seviri_m09 0.0 1 0 + seviribufr seviri m10 seviri_m10 0.0 1 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 + amsuabufr amsua metop-b amsua_metop-b 0.0 2 0 + mhsbufr mhs metop-b mhs_metop-b 0.0 3 0 + iasibufr iasi metop-b iasi_metop-b 0.0 1 0 + gomebufr gome metop-b gome_metop-b 0.0 2 0 + atmsbufr atms npp atms_npp 0.0 2 0 + crisbufr cris npp cris_npp 0.0 1 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 + crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 + gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 5 0 + gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 5 0 + gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 5 0 + gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 5 0 + gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 5 0 + gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 5 0 + gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 5 0 + gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 5 0 + oscatbufr uv null uv 0.0 0 0 + mlsbufr mls30 aura mls30_aura 0.0 0 0 + amsr2bufr amsr2 gcom-w1 amsr2_gcom-w1 0.0 3 0 + gmibufr gmi gpm gmi_gpm 0.0 3 0 + saphirbufr saphir meghat saphir_meghat 0.0 3 0 + ahibufr ahi himawari8 ahi_himawari8 0.0 3 0 +:: +&SUPEROB_RADAR + del_azimuth=5.,del_elev=.25,del_range=10000.,del_time=.1,elev_angle_max=5.,minnum=1,range_max=100000., + l2superob_only=.false.,radar_sites=.false., + radar_box=.true.,radar_rmesh=10,radar_zmesh=500, +/ +SUPEROB_RADAR:: + KBRO 1 + KCRP 1 + KEWX 1 + KGRX 1 + KDFX 1 + KHGX 1 + KLCH 1 + KLIX 1 + KPOE 1 + KSHV 1 + KDGX 1 + KMOB 1 + KEVX 1 + KEOX 1 + KMXX 1 + KBMX 1 + KTLH 1 + KTBW 1 + KBYX 1 + KAMX 1 + KMLB 1 + KJAX 1 + KVAX 1 + KJGX 1 + KFFC 1 + KCLX 1 + KCAE 1 + KGSP 1 + KLTX 1 + KMHX 1 + KRAX 1 + KAKQ 1 + KFCX 1 + KLWX 1 + KDOX 1 + KCCX 1 + KDIX 1 + KOKX 1 + KENX 1 + KBGM 1 + KCXX 1 + KBOX 1 + KGYX 1 + KCBW 1 + TJUA 1 + PHWA 1 + PHKI 1 + PHMO 1 + PHKM 1 +:: + / +&LAG_DATA +/ +&HYBRID_ENSEMBLE + l_hyb_ens=_L_HYB_ENS_, + n_ens=_N_ENS_, + uv_hyb_ens=T, + beta_s0=_BETA_S0_, + s_ens_h=300, + s_ens_v=-0.5, + readin_localization=F, + generate_ens=F, + regional_ensemble_option=_REGIONAL_ENSEMBLE_OPTION_, + grid_ratio_ens=_GRID_RATIO_ENS_, + pseudo_hybens=F, + merge_two_grid_ensperts=F, + pwgtflg=F, + aniso_a_en=F, + nlon_ens=387, + nlat_ens=777, + write_ens_sprd=F, +/ +&RAPIDREFRESH_CLDSURF + dfi_radar_latent_heat_time_period=30.0, +/ +&CHEM +/ +&SINGLEOB_TEST + maginnov=1.0,magoberr=0.8,oneob_type='t', + oblat=38.,oblon=279.,obpres=500.,obdattim=2019082900, + obhourset=0., +/ +&NST +/ diff --git a/parm/analysis/gsi/gsiparm.anl.tmp_vr b/parm/analysis/gsi/gsiparm.anl.tmp_vr new file mode 100644 index 000000000..f8d4974b8 --- /dev/null +++ b/parm/analysis/gsi/gsiparm.anl.tmp_vr @@ -0,0 +1,229 @@ +&SETUP + miter = 2, + niter(1) = 100, + niter(2) = 100, + niter_no_qc(1) = 20, + deltim = 1200, + offtime_data = F + write_diag(1) = T, + write_diag(2) = F, + write_diag(3) = T, + gencode = 78, + qoption = 2, + factqmin = 0.0, + factqmax = 0.0, + iguess = -1, + use_gfs_ozone = F, + oneobtest = F, + retrieval = F, + nhr_assimilation = 3, + l_foto = F, + use_pbl = F, + gpstop = 30., + use_gfs_nemsio = T, + print_diag_pcg = T, + newpc4pred = T, + adp_anglebc = T, + angord = 4, + passive_bc = T, + use_edges = F, + emiss_bc = T, + diag_precon = T, + step_start = 1.e-3, + upd_pred(1) = 0, + upd_pred(2) = 0, + upd_pred(3) = 0, + upd_pred(4) = 0, + upd_pred(5) = 0, + upd_pred(6) = 0, + upd_pred(7) = 0, + upd_pred(8) = 0, + upd_pred(9) = 0, + upd_pred(10) = 0, + upd_pred(11) = 0, + upd_pred(12) = 0, +/ +&GRIDOPTS + fv3_regional = T, + grid_ratio_fv3_regional = _GRID_RATIO_FV3_REGIONAL_, + nvege_type = 20, +/ +&BKGERR + hzscl = 0.2,0.4,0.8, + vs = 1.0, + bw = 0., + fstat = F, +/ +&ANBKGERR + anisotropic = F, + an_vs = 1.0, + ngauss = 1, + an_flen_u = -5.0, + an_flen_t = 3.0, + an_flen_z = -200.0, + ifilt_ord = 2, + npass = 3, + normal = -200, + grid_ratio = 4.0, + nord_f2a = 4, +/ +&JCOPTS +/ +&STRONGOPTS + tlnmc_option = 0, + reg_tlnmc_type = 1, + nstrong = 1, + nvmodes_keep = 8, + period_max = 6., + period_width = 1.5, + baldiag_full = F, + baldiag_inc = F, +/ +&OBSQC + dfact = 0.75, + dfact1 = 3.0, + erradar_inflate = 1.0 + tdrerr_inflate = T + noiqc = T, + c_varqc = 0.03333, + vadfile = 'prepbufr', + njqc = F, + vqc = T, +/ +&OBS_INPUT + dmesh(1) = 90.0, + dmesh(2) = 45.0 + dmesh(3) = 45.0 + dmesh(4) = 45.0 + dmesh(5) = 90.0 + time_window_max = 3.0, + l_foreaft_thin = F +/ +OBS_INPUT:: + prepbufr ps null ps 0.0 0 0 + prepbufr t null t 0.0 0 0 + prepbufr_profl t null t 0.0 0 0 + prepbufr q null q 0.0 0 0 + prepbufr_profl q null q 0.0 0 0 + prepbufr pw null pw 0.0 0 0 + prepbufr uv null uv 0.0 0 0 + prepbufr_profl uv null uv 0.0 0 0 + satwndbufr uv null uv 0.0 0 0 + prepbufr spd null spd 0.0 0 0 + prepbufr dw null dw 0.0 0 0 + radarbufr rw null rw 0.0 0 0 + prepbufr sst null sst 0.0 0 0 + tcvitl tcp null tcp 0.0 0 0 + tldplrbufr rw null rw 0.0 0 0 + hdobbufr uv null uv 0.0 0 0 + hdobbufr t null t 0.0 0 0 + hdobbufr q null q 0.0 0 0 + hdobbufr spd null spd 0.0 0 0 + gpsrobufr gps_bnd null gps 0.0 0 0 + ssmirrbufr pcp_ssmi dmsp pcp_ssmi 0.0 -1 0 + tmirrbufr pcp_tmi trmm pcp_tmi 0.0 -1 0 + sbuvbufr sbuv2 n16 sbuv8_n16 0.0 0 0 + sbuvbufr sbuv2 n17 sbuv8_n17 0.0 0 0 + sbuvbufr sbuv2 n18 sbuv8_n18 0.0 0 0 + hirs3bufr hirs3 n17 hirs3_n17 0.0 1 0 + hirs4bufr hirs4 metop-a hirs4_metop-a 0.0 1 1 + gimgrbufr goes_img g11 imgr_g11 0.0 1 0 + gimgrbufr goes_img g12 imgr_g12 0.0 1 0 + airsbufr airs aqua airs_aqua 0.0 1 1 + amsuabufr amsua n15 amsua_n15 0.0 2 1 + amsuabufr amsua n18 amsua_n18 0.0 2 1 + amsuabufr amsua metop-a amsua_metop-a 0.0 2 1 + airsbufr amsua aqua amsua_aqua 0.0 2 1 + amsubbufr amsub n17 amsub_n17 0.0 3 1 + mhsbufr mhs n18 mhs_n18 0.0 3 1 + mhsbufr mhs metop-a mhs_metop-a 0.0 3 1 + ssmitbufr ssmi f15 ssmi_f15 0.0 1 0 + amsrebufr amsre_low aqua amsre_aqua 0.0 4 0 + amsrebufr amsre_mid aqua amsre_aqua 0.0 4 0 + amsrebufr amsre_hig aqua amsre_aqua 0.0 4 0 + ssmisbufr ssmis f16 ssmis_f16 0.0 4 0 + ssmisbufr ssmis f17 ssmis_f17 0.0 4 0 + ssmisbufr ssmis f18 ssmis_f18 0.0 4 0 + ssmisbufr ssmis f19 ssmis_f19 0.0 4 0 + gsnd1bufr sndrd1 g12 sndrD1_g12 0.0 5 0 + gsnd1bufr sndrd2 g12 sndrD2_g12 0.0 5 0 + gsnd1bufr sndrd3 g12 sndrD3_g12 0.0 5 0 + gsnd1bufr sndrd4 g12 sndrD4_g12 0.0 5 0 + gsnd1bufr sndrd1 g11 sndrD1_g11 0.0 5 0 + gsnd1bufr sndrd2 g11 sndrD2_g11 0.0 5 0 + gsnd1bufr sndrd3 g11 sndrD3_g11 0.0 5 0 + gsnd1bufr sndrd4 g11 sndrD4_g11 0.0 5 0 + gsnd1bufr sndrd1 g13 sndrD1_g13 0.0 5 0 + gsnd1bufr sndrd2 g13 sndrD2_g13 0.0 5 0 + gsnd1bufr sndrd3 g13 sndrD3_g13 0.0 5 0 + gsnd1bufr sndrd4 g13 sndrD4_g13 0.0 5 0 + iasibufr iasi metop-a iasi_metop-a 0.0 1 1 + gomebufr gome metop-a gome_metop-a 0.0 2 0 + omibufr omi aura omi_aura 0.0 2 0 + sbuvbufr sbuv2 n19 sbuv8_n19 0.0 0 0 + hirs4bufr hirs4 n19 hirs4_n19 0.0 1 1 + amsuabufr amsua n19 amsua_n19 0.0 2 1 + mhsbufr mhs n19 mhs_n19 0.0 3 1 + seviribufr seviri m08 seviri_m08 0.0 1 0 + seviribufr seviri m09 seviri_m09 0.0 1 0 + seviribufr seviri m10 seviri_m10 0.0 1 0 + hirs4bufr hirs4 metop-b hirs4_metop-b 0.0 1 0 + amsuabufr amsua metop-b amsua_metop-b 0.0 2 0 + mhsbufr mhs metop-b mhs_metop-b 0.0 3 0 + iasibufr iasi metop-b iasi_metop-b 0.0 1 0 + gomebufr gome metop-b gome_metop-b 0.0 2 0 + atmsbufr atms npp atms_npp 0.0 2 0 + crisbufr cris npp cris_npp 0.0 1 0 + crisfsbufr cris-fsr npp cris-fsr_npp 0.0 1 0 + crisfsbufr cris-fsr n20 cris-fsr_n20 0.0 1 0 + gsnd1bufr sndrd1 g14 sndrD1_g14 0.0 5 0 + gsnd1bufr sndrd2 g14 sndrD2_g14 0.0 5 0 + gsnd1bufr sndrd3 g14 sndrD3_g14 0.0 5 0 + gsnd1bufr sndrd4 g14 sndrD4_g14 0.0 5 0 + gsnd1bufr sndrd1 g15 sndrD1_g15 0.0 5 0 + gsnd1bufr sndrd2 g15 sndrD2_g15 0.0 5 0 + gsnd1bufr sndrd3 g15 sndrD3_g15 0.0 5 0 + gsnd1bufr sndrd4 g15 sndrD4_g15 0.0 5 0 + oscatbufr uv null uv 0.0 0 0 + mlsbufr mls30 aura mls30_aura 0.0 0 0 + amsr2bufr amsr2 gcom-w1 amsr2_gcom-w1 0.0 3 0 + gmibufr gmi gpm gmi_gpm 0.0 3 0 + saphirbufr saphir meghat saphir_meghat 0.0 3 0 + ahibufr ahi himawari8 ahi_himawari8 0.0 3 0 + rapidscatbufr uv null uv 0.0 0 0 +:: +&SUPEROB_RADAR + del_azimuth = 5., + del_elev = 0.25, + del_range = 5000., + del_time = 0.5, + elev_angle_max = 5., + minnum = 50, + range_max = 100000., + l2superob_only = F, +/ +&LAG_DATA +/ +&HYBRID_ENSEMBLE + l_hyb_ens=_L_HYB_ENS_, + n_ens=_N_ENS_, + uv_hyb_ens = T, + beta_s0 = 0.2, + s_ens_h = 150.0, + s_ens_v = -0.5, + generate_ens = F, + regional_ensemble_option = 2, + readin_localization = F + aniso_a_en = F, + pwgtflg = F, + write_ens_sprd = F +/ +&RAPIDREFRESH_CLDSURF + dfi_radar_latent_heat_time_period = 30.0, +/ +&CHEM +/ +&SINGLEOB_TEST +/ +&NST +/ diff --git a/parm/analysis/gsi/hafs_anavinfo.tmp b/parm/analysis/gsi/hafs_anavinfo.tmp new file mode 100644 index 000000000..d55065363 --- /dev/null +++ b/parm/analysis/gsi/hafs_anavinfo.tmp @@ -0,0 +1,79 @@ +met_guess:: +!var level crtm_use desc orig_name + ps 1 -1 surface_pressure ps + z 1 -1 geopotential_height phis + u _LEV_ 2 zonal_wind u + v _LEV_ 2 meridional_wind v + tv _LEV_ 2 virtual_temperature t + q _LEV_ 2 specific_humidity sphum + oz _LEV_ 2 ozone o3mr + delp _LEV_ -1 fv3 del pressure delp +:: + +state_derivatives:: +!var level src + ps 1 met_guess + u _LEV_ met_guess + v _LEV_ met_guess + tv _LEV_ met_guess + q _LEV_ met_guess + oz _LEV_ met_guess + prse _LP1_ met_guess +:: + +state_tendencies:: +!var levels source + u _LEV_ met_guess + v _LEV_ met_guess + tv _LEV_ met_guess + q _LEV_ met_guess + oz _LEV_ met_guess + prse _LP1_ met_guess +:: + +state_vector:: +!var level itracer source funcof + u _LEV_ 0 met_guess u + v _LEV_ 0 met_guess v + tv _LEV_ 0 met_guess tv + tsen _LEV_ 0 met_guess tv,q + q _LEV_ 1 met_guess q + oz _LEV_ 1 met_guess oz + prse _LP1_ 0 met_guess prse + ps 1 0 met_guess ps + sst 1 0 met_guess sst +:: + +control_vector_enkf:: +!var level itracer as/tsfc_sdv an_amp0 source funcof + u _LEV_ 0 0.20 -1.0 state u,v + v _LEV_ 0 0.20 -1.0 state u,v +!w _LEV_ 0 0.50 -1.0 state w +!dz _LEV_ 0 0.50 -1.0 state dz + ps 1 0 0.30 -1.0 state prse + t _LEV_ 0 0.70 -1.0 state tv + delp _LEV_ 0 0.70 -1.0 state delp +!q _LEV_ 1 0.20 -1.0 state sphum + q _LEV_ 1 0.20 -1.0 state q + oz _LEV_ 1 0.10 -1.0 state oz +!liq_wat _LEV_ 1 0.70 -1.0 state liq_wat +!rainwat _LEV_ 1 0.70 -1.0 state rainwat +!ice_wat _LEV_ 1 0.70 -1.0 state ice_wat +!snowwat _LEV_ 1 0.70 -1.0 state snowwat +!graupel _LEV_ 1 0.70 -1.0 state graupel +!cld_amt _LEV_ 1 0.70 -1.0 state cld_amt +!cw _LEV_ 1 0.70 -1.0 state cw +:: + +control_vector:: +!var level itracer as/tsfc_sdv an_amp0 source funcof + sf _LEV_ 0 0.20 -1.0 state u,v + vp _LEV_ 0 0.20 -1.0 state u,v + ps 1 0 0.30 -1.0 state prse + t _LEV_ 0 0.70 -1.0 state tv + q _LEV_ 1 0.20 -1.0 state q + oz _LEV_ 1 0.10 -1.0 state oz + sst 1 0 1.00 -1.0 state sst + stl 1 0 1.00 -1.0 motley sst + sti 1 0 1.00 -1.0 motley sst +:: diff --git a/parm/analysis/gsi/hafs_anavinfo.tmp_enkf b/parm/analysis/gsi/hafs_anavinfo.tmp_enkf new file mode 100644 index 000000000..d55065363 --- /dev/null +++ b/parm/analysis/gsi/hafs_anavinfo.tmp_enkf @@ -0,0 +1,79 @@ +met_guess:: +!var level crtm_use desc orig_name + ps 1 -1 surface_pressure ps + z 1 -1 geopotential_height phis + u _LEV_ 2 zonal_wind u + v _LEV_ 2 meridional_wind v + tv _LEV_ 2 virtual_temperature t + q _LEV_ 2 specific_humidity sphum + oz _LEV_ 2 ozone o3mr + delp _LEV_ -1 fv3 del pressure delp +:: + +state_derivatives:: +!var level src + ps 1 met_guess + u _LEV_ met_guess + v _LEV_ met_guess + tv _LEV_ met_guess + q _LEV_ met_guess + oz _LEV_ met_guess + prse _LP1_ met_guess +:: + +state_tendencies:: +!var levels source + u _LEV_ met_guess + v _LEV_ met_guess + tv _LEV_ met_guess + q _LEV_ met_guess + oz _LEV_ met_guess + prse _LP1_ met_guess +:: + +state_vector:: +!var level itracer source funcof + u _LEV_ 0 met_guess u + v _LEV_ 0 met_guess v + tv _LEV_ 0 met_guess tv + tsen _LEV_ 0 met_guess tv,q + q _LEV_ 1 met_guess q + oz _LEV_ 1 met_guess oz + prse _LP1_ 0 met_guess prse + ps 1 0 met_guess ps + sst 1 0 met_guess sst +:: + +control_vector_enkf:: +!var level itracer as/tsfc_sdv an_amp0 source funcof + u _LEV_ 0 0.20 -1.0 state u,v + v _LEV_ 0 0.20 -1.0 state u,v +!w _LEV_ 0 0.50 -1.0 state w +!dz _LEV_ 0 0.50 -1.0 state dz + ps 1 0 0.30 -1.0 state prse + t _LEV_ 0 0.70 -1.0 state tv + delp _LEV_ 0 0.70 -1.0 state delp +!q _LEV_ 1 0.20 -1.0 state sphum + q _LEV_ 1 0.20 -1.0 state q + oz _LEV_ 1 0.10 -1.0 state oz +!liq_wat _LEV_ 1 0.70 -1.0 state liq_wat +!rainwat _LEV_ 1 0.70 -1.0 state rainwat +!ice_wat _LEV_ 1 0.70 -1.0 state ice_wat +!snowwat _LEV_ 1 0.70 -1.0 state snowwat +!graupel _LEV_ 1 0.70 -1.0 state graupel +!cld_amt _LEV_ 1 0.70 -1.0 state cld_amt +!cw _LEV_ 1 0.70 -1.0 state cw +:: + +control_vector:: +!var level itracer as/tsfc_sdv an_amp0 source funcof + sf _LEV_ 0 0.20 -1.0 state u,v + vp _LEV_ 0 0.20 -1.0 state u,v + ps 1 0 0.30 -1.0 state prse + t _LEV_ 0 0.70 -1.0 state tv + q _LEV_ 1 0.20 -1.0 state q + oz _LEV_ 1 0.10 -1.0 state oz + sst 1 0 1.00 -1.0 state sst + stl 1 0 1.00 -1.0 motley sst + sti 1 0 1.00 -1.0 motley sst +:: diff --git a/parm/analysis/gsi/hafs_convinfo.txt b/parm/analysis/gsi/hafs_convinfo.txt new file mode 100644 index 000000000..96e364d2c --- /dev/null +++ b/parm/analysis/gsi/hafs_convinfo.txt @@ -0,0 +1,231 @@ +! otype = observation type (a7, t, uv, q, etc.) +! type = prepbufr observation type (if available) +! sub = prepbufr subtype (not yet available) +! iuse = flag if to use/not use / monitor data +! = 1 use data +! = 0 do not use data +! = -1 monitor data +! twindow = time window (+/- hours) +! numgrp = cross validation parameter - number of groups +! ngroup = cross validation parameter - group to remove from data use +! nmiter = cross validation parameter - external iteration to introduce removed data +! gross = gross error parameter - gross error +! ermax = gross error parameter - max error +! ermin = gross error parameter - min error +! var_b = variational quality control parameter - b parameter +! var_pg ithin rmesh npred = variational quality control parameter - pg parameter +! pmot: the optione to keep thinned datai as monitored, 0: not to keep, other values: to keep +! ptime: time interval for thinning, 0, no temporal thinning, other values define time interval (less than 6) +!otype type sub iuse twindow numgrp ngroup nmiter gross ermax ermin var_b var_pg ithin rmesh pmesh npred pmot ptime + tcp 112 0 1 3.0 0 0 0 75.0 5.0 1.0 75.0 0.000000 0 0. 0. 0 0. 0. + ps 120 0 1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + ps 132 0 -1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + ps 180 0 1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + ps 180 01 1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + ps 181 0 1 3.0 0 0 0 3.6 3.0 1.0 3.6 0.000300 0 0. 0. 0 0. 0. + ps 182 0 1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + ps 183 0 -1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + ps 187 0 1 3.0 0 0 0 4.0 3.0 1.0 4.0 0.000300 0 0. 0. 0 0. 0. + t 120 0 1 3.0 0 0 0 8.0 5.6 1.3 8.0 0.000001 0 0. 0. 0 0. 0. + t 126 0 -1 3.0 0 0 0 8.0 5.6 1.3 8.0 0.001000 0 0. 0. 0 0. 0. + t 130 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.001000 0 0. 0. 0 0. 0. + t 131 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.001000 0 0. 0. 0 0. 0. + t 132 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.001000 0 0. 0. 0 0. 0. + t 133 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 134 0 -1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 135 0 -1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 136 0 1 3.0 0 0 0 2.0 5.6 1.3 10.0 0.000000 0 0. 0. 0 0. 0. + t 137 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.001000 0 0. 0. 0 0. 0. + t 180 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 180 01 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 181 0 -1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 182 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 183 0 -1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + t 187 0 -1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.004000 0 0. 0. 0 0. 0. + q 120 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000500 0 0. 0. 0 0. 0. + q 130 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 131 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 132 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 133 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 134 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 135 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 136 0 1 3.0 0 0 0 2.0 50.0 5.0 10.0 0.000000 0 0. 0. 0 0. 0. + q 137 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 180 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000500 0 0. 0. 0 0. 0. + q 180 01 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000500 0 0. 0. 0 0. 0. + q 181 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000500 0 0. 0. 0 0. 0. + q 182 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 183 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + q 187 0 -1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + pw 152 0 -1 3.0 0 0 0 10.0 8.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + pw 153 0 -1 3.0 0 0 0 5.0 5.0 2.0 5.0 0.000000 0 0. 0. 0 0. 0. + pw 156 0 -1 3.0 0 0 0 10.0 8.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + pw 157 0 -1 3.0 0 0 0 10.0 8.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + pw 158 0 -1 3.0 0 0 0 10.0 8.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + pw 159 0 -1 3.0 0 0 0 10.0 8.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + sst 181 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 182 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 183 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 184 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 185 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 186 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 187 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 188 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 189 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 190 0 -1 3.0 0 0 0 2.5 2.0 0.2 2.5 0.000000 0 0. 0. 0 0. 0. + sst 191 0 -1 3.0 0 0 0 3.0 2.0 0.2 3.0 0.000000 0 0. 0. 0 0. 0. + sst 192 0 -1 3.0 0 0 0 3.0 2.0 0.2 3.0 0.000000 0 0. 0. 0 0. 0. + sst 193 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 194 0 -1 3.0 0 0 0 3.0 2.0 0.2 3.0 0.000000 0 0. 0. 0 0. 0. + sst 195 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 196 0 -1 3.0 0 0 0 2.5 2.0 0.2 2.5 0.000000 0 0. 0. 0 0. 0. + sst 197 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 198 0 -1 3.0 0 0 0 2.5 2.0 0.2 2.5 0.000000 0 0. 0. 0 0. 0. + sst 199 0 -1 3.0 0 0 0 1.5 2.0 0.2 1.5 0.000000 0 0. 0. 0 0. 0. + sst 200 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 201 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + sst 202 0 -1 3.0 0 0 0 2.0 2.0 0.2 2.0 0.000000 0 0. 0. 0 0. 0. + uv 210 0 -1 3.0 0 0 0 8.0 6.1 1.4 8.0 0.000001 0 0. 0. 0 0. 0. + uv 220 0 1 3.0 0 0 0 8.0 6.1 1.4 8.0 0.000001 0 0. 0. 0 0. 0. + uv 221 0 1 3.0 0 0 0 8.0 6.1 1.4 8.0 0.000001 0 0. 0. 0 0. 0. + uv 223 0 1 3.0 0 0 0 7.5 6.1 1.4 7.5 0.000001 0 0. 0. 0 0. 0. + uv 224 0 1 3.0 0 0 0 6.5 6.1 1.4 6.5 0.000001 0 0. 0. 0 0. 0. + uv 228 0 -1 3.0 0 0 0 6.5 6.1 1.4 6.5 0.000001 0 0. 0. 0 0. 0. + uv 229 0 1 3.0 0 0 0 6.5 6.1 1.4 6.5 0.000001 0 0. 0. 0 0. 0. + uv 230 0 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000100 0 0. 0. 0 0. 0. + uv 231 0 1 3.0 0 0 0 6.5 6.1 1.4 6.5 0.000100 0 0. 0. 0 0. 0. + uv 232 0 1 3.0 0 0 0 7.0 6.1 1.4 7.0 0.000100 0 0. 0. 0 0. 0. + uv 233 0 1 3.0 0 0 0 7.5 6.1 1.4 7.5 0.000100 0 0. 0. 0 0. 0. + uv 234 0 1 3.0 0 0 0 7.5 6.1 1.4 7.5 0.000100 0 0. 0. 0 0. 0. + uv 235 0 1 3.0 0 0 0 7.5 6.1 1.4 7.5 0.000100 0 0. 0. 0 0. 0. + uv 236 0 1 3.0 0 0 0 2.0 6.1 1.4 10.0 0.000000 0 0. 0. 0 0. 0. + uv 237 0 1 3.0 0 0 0 7.0 6.1 1.4 7.0 0.000100 0 0. 0. 0 0. 0. + uv 240 0 -1 3.0 0 0 0 1.3 20.1 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 240 270 1 3.0 0 0 0 3.5 20.1 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 240 271 1 3.0 0 0 0 3.5 20.1 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 241 0 -1 3.0 0 0 0 1.3 20.1 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 242 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 242 171 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 242 172 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 242 173 1 3.0 0 0 0 2.5 15.0 1.4 2.5 0.055000 0 0. 0. 0 0. 0. + uv 243 0 -1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.005000 0 0. 0. 0 0. 0. + uv 243 54 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.005000 0 0. 0. 0 0. 0. + uv 243 55 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.005000 0 0. 0. 0 0. 0. + uv 243 56 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.005000 0 0. 0. 0 0. 0. + uv 243 57 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.005000 0 0. 0. 0 0. 0. + uv 243 70 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.005000 0 0. 0. 0 0. 0. + uv 244 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 244 3 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 244 4 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 244 206 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 244 207 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 244 209 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 244 223 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 245 0 -1 3.0 0 0 0 1.3 20.0 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 245 270 1 3.0 0 0 0 3.5 20.0 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 245 271 1 3.0 0 0 0 3.5 20.0 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 246 0 -1 3.0 0 0 0 1.3 20.0 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 246 270 1 3.0 0 0 0 3.5 20.0 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 246 271 1 3.0 0 0 0 3.5 20.0 1.4 1.3 0.005000 0 0. 0. 0 0. 0. + uv 247 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 247 270 1 3.0 0 0 0 3.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 247 271 1 3.0 0 0 0 3.5 20.0 1.4 2.5 0.005000 0 0. 0. 0 0. 0. + uv 248 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 249 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 250 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 250 171 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 250 172 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 250 173 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 251 0 -1 3.0 0 0 0 1.3 20.0 1.4 1.3 0.000500 0 0. 0. 0 0. 0. + uv 251 270 1 3.0 0 0 0 3.5 20.0 1.4 1.3 0.000050 0 0. 0. 0 0. 0. + uv 251 271 1 3.0 0 0 0 3.5 20.0 1.4 1.3 0.000050 0 0. 0. 0 0. 0. + uv 252 0 -1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000050 0 0. 0. 0 0. 0. + uv 252 171 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000050 0 0. 0. 0 0. 0. + uv 252 172 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000050 0 0. 0. 0 0. 0. + uv 252 173 1 3.0 0 0 0 2.5 20.0 1.4 2.5 0.000050 0 0. 0. 0 0. 2. + uv 253 0 -1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 253 54 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 253 55 -1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 253 56 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 253 57 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 253 70 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 254 0 -1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 254 54 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 254 55 -1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 0. + uv 254 56 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 2. + uv 254 57 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 2. + uv 254 70 1 3.0 0 0 0 1.5 20.0 1.4 1.5 0.000500 0 0. 0. 0 0. 2. + uv 256 0 -1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 257 0 -1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 257 783 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 257 784 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 258 0 -1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 258 783 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 258 784 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 259 0 -1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 259 783 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 259 784 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 260 0 -1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 260 224 1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 270 0 -1 3.0 0 0 0 2.5 20.1 1.4 2.5 0.000500 0 0. 0. 0 0. 0. + uv 280 0 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000500 0 0. 0. 0 0. 0. + uv 280 01 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.005500 0 0. 0. 0 0. 0. + uv 281 0 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000500 0 0. 0. 0 0. 0. + uv 282 0 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000500 0 0. 0. 0 0. 0. + uv 284 0 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000500 0 0. 0. 0 0. 0. + uv 285 0 -1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + uv 286 0 -1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000500 0 0. 0. 0 0. 0. + uv 287 0 1 3.0 0 0 0 6.0 6.1 1.4 6.0 0.000500 0 0. 0. 0 0. 0. + uv 289 0 1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + uv 290 4 1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + uv 290 3 1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + uv 290 5 1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + uv 291 0 -1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + uv 296 0 -1 3.0 0 0 0 5.0 6.1 1.4 5.0 0.000500 0 0. 0. 0 0. 0. + spd 283 0 -1 3.0 0 0 0 8.0 6.1 1.4 8.0 0.000000 0 0. 0. 0 0. 0. + spd 213 0 1 3.0 0 0 0 2.0 5.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + dw 999 0 -1 3.0 0 0 0 8.0 10.0 2.0 8.0 0.000000 0 0. 0. 0 0. 0. + dw 201 0 -1 3.0 0 0 0 8.0 10.0 2.0 8.0 0.000001 0 0. 0. 0 0. 0. + dw 202 0 -1 3.0 0 0 0 8.0 10.0 2.0 8.0 0.000001 0 0. 0. 0 0. 0. + dw 100 0 -1 3.0 0 0 0 4.0 5.0 2.0 8.0 0.000001 0 0. 0. 0 0. 0. + dw 101 0 -1 3.0 0 0 0 4.0 5.0 2.0 8.0 0.000001 0 0. 0. 0 0. 0. + srw 999 0 -1 2.5 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + rw 999 0 -1 2.5 0 0 0 10.0 10.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + rw 990 0 1 3.0 0 0 0 2.0 10.0 2.0 10.0 0.000000 1 9. 0. 0 0. 0. + rw 991 0 1 3.0 0 0 0 2.0 10.0 2.0 10.0 0.000000 1 9. 0. 0 0. 0. + rw 992 0 1 3.0 0 0 0 2.0 10.0 2.0 10.0 0.000000 1 9. 0. 0 0. 0. + rw 993 0 1 3.0 0 0 0 2.0 10.0 2.0 10.0 0.000000 1 9. 0. 0 0. 0. + rw 999 0 1 2.5 0 0 0 10.0 10.0 2.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 004 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 041 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 722 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 723 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 740 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 741 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 742 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 743 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 744 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 745 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 820 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 042 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 043 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 786 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 421 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 003 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 821 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 440 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + pm2_5 102 0 -1 1.0 0 0 0 100.0 1.5 0.75 10.0 0.000000 0 0. 0. 0 0. 0. + pm10 102 0 -1 1.0 0 0 0 150.0 1.5 0.75 10.0 0.000000 0 0. 0. 0 0. 0. + gps 750 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 751 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 752 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 753 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 754 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 755 0 1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 724 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 725 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 726 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 727 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 728 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 729 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. + gps 044 0 -1 3.0 0 0 0 10.0 10.0 1.0 10.0 0.000000 0 0. 0. 0 0. 0. diff --git a/parm/analysis/gsi/hafs_convinfo.txt_vr b/parm/analysis/gsi/hafs_convinfo.txt_vr new file mode 100644 index 000000000..f1cb1da86 --- /dev/null +++ b/parm/analysis/gsi/hafs_convinfo.txt_vr @@ -0,0 +1,23 @@ +! otype = observation type (a7, t, uv, q, etc.) +! type = prepbufr observation type (if available) +! sub = prepbufr subtype (not yet available) +! iuse = flag if to use/not use / monitor data +! = 1 use data +! = 0 do not use data +! = -1 monitor data +! twindow = time window (+/- hours) +! numgrp = cross validation parameter - number of groups +! ngroup = cross validation parameter - group to remove from data use +! nmiter = cross validation parameter - external iteration to introduce removed data +! gross = gross error parameter - gross error +! ermax = gross error parameter - max error +! ermin = gross error parameter - min error +! var_b = variational quality control parameter - b parameter +! var_pg ithin rmesh npred = variational quality control parameter - pg parameter +! pmot: the optione to keep thinned datai as monitored, 0: not to keep, other values: to keep +! ptime: time interval for thinning, 0, no temporal thinning, other values define time interval (less than 6) +!otype type sub iuse twindow numgrp ngroup nmiter gross ermax ermin var_b var_pg ithin rmesh pmesh npred pmot ptime + t 138 0 1 3.0 0 0 0 7.0 5.6 1.3 7.0 0.001000 0 0. 0. 0 0. 0. + q 138 0 1 3.0 0 0 0 8.0 100.0 10.0 8.0 0.000600 0 0. 0. 0 0. 0. + uv 238 0 1 3.0 0 0 0 7.0 6.1 1.4 7.0 0.000100 0 0. 0. 0 0. 0. + diff --git a/parm/analysis/gsi/hafs_nam_errtable.r3dv b/parm/analysis/gsi/hafs_nam_errtable.r3dv new file mode 100644 index 000000000..45b183121 --- /dev/null +++ b/parm/analysis/gsi/hafs_nam_errtable.r3dv @@ -0,0 +1,6800 @@ + 100 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 101 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 102 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 103 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 104 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 105 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 106 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 107 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 108 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 109 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 110 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 111 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 112 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 113 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 114 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 115 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 116 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 117 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 118 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 119 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 120 OBSERVATION TYPE + 0.11000E+04 0.12696E+01 0.60737E+00 0.10000E+10 0.76322E+00 0.10000E+10 + 0.10500E+04 0.13282E+01 0.66294E+00 0.10000E+10 0.76322E+00 0.10000E+10 + 0.10000E+04 0.13932E+01 0.74223E+00 0.10000E+10 0.76322E+00 0.10000E+10 + 0.95000E+03 0.14390E+01 0.83688E+00 0.10000E+10 0.79899E+00 0.10000E+10 + 0.90000E+03 0.14354E+01 0.94025E+00 0.10000E+10 0.83561E+00 0.10000E+10 + 0.85000E+03 0.13669E+01 0.10439E+01 0.10000E+10 0.87224E+00 0.10000E+10 + 0.80000E+03 0.12552E+01 0.11591E+01 0.10000E+10 0.89405E+00 0.10000E+10 + 0.75000E+03 0.11362E+01 0.12715E+01 0.10000E+10 0.91585E+00 0.10000E+10 + 0.70000E+03 0.10397E+01 0.13819E+01 0.10000E+10 0.93767E+00 0.10000E+10 + 0.65000E+03 0.98016E+00 0.14850E+01 0.10000E+10 0.10358E+01 0.10000E+10 + 0.60000E+03 0.94757E+00 0.15562E+01 0.10000E+10 0.11339E+01 0.10000E+10 + 0.55000E+03 0.92875E+00 0.15972E+01 0.10000E+10 0.12212E+01 0.10000E+10 + 0.50000E+03 0.91714E+00 0.16305E+01 0.10000E+10 0.13194E+01 0.10000E+10 + 0.45000E+03 0.91625E+00 0.16707E+01 0.10000E+10 0.14391E+01 0.10000E+10 + 0.40000E+03 0.93506E+00 0.17091E+01 0.10000E+10 0.16246E+01 0.10000E+10 + 0.35000E+03 0.98447E+00 0.17517E+01 0.10000E+10 0.17769E+01 0.10000E+10 + 0.30000E+03 0.10699E+01 0.18047E+01 0.10000E+10 0.20497E+01 0.10000E+10 + 0.25000E+03 0.11816E+01 0.18621E+01 0.10000E+10 0.27694E+01 0.10000E+10 + 0.20000E+03 0.12862E+01 0.19134E+01 0.10000E+10 0.30202E+01 0.10000E+10 + 0.15000E+03 0.13542E+01 0.19517E+01 0.10000E+10 0.35327E+01 0.10000E+10 + 0.10000E+03 0.13831E+01 0.19762E+01 0.10000E+10 0.42957E+01 0.10000E+10 + 0.75000E+02 0.13832E+01 0.19897E+01 0.10000E+10 0.54844E+01 0.10000E+10 + 0.50000E+02 0.13534E+01 0.19961E+01 0.10000E+10 0.64655E+01 0.10000E+10 + 0.40000E+02 0.13109E+01 0.19988E+01 0.10000E+10 0.64655E+01 0.10000E+10 + 0.30000E+02 0.13018E+01 0.19997E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.13414E+01 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.14017E+01 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.14471E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.14744E+01 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.14892E+01 0.19997E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.14964E+01 0.19992E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.14988E+01 0.19983E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.14962E+01 0.19974E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 121 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 122 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 123 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 124 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 125 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 126 OBSERVATION TYPE + 0.11000E+04 0.24296E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.24261E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.23798E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.23022E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.22627E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.22817E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.22826E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.21826E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.20092E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.18385E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.17169E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.16511E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.16306E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.16472E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.17005E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.17905E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.19016E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.19907E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.20094E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.19571E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.18864E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.18600E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.19104E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.20392E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.22324E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.24605E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.26741E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.28318E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.29263E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.29735E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.29931E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.29985E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.29924E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 127 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 128 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 129 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 130 OBSERVATION TYPE + 0.11000E+04 0.24308E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.23855E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.23123E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.22137E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.20999E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.19857E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.18857E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.18094E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.17590E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.17307E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.17174E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.17098E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.16958E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.16611E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.15936E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.14949E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.13923E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.13291E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.13180E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.13443E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.14054E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.14870E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.15663E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.16273E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.16658E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.16862E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.16954E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.16988E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.16997E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.16997E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.16993E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.16985E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.16977E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 131 OBSERVATION TYPE + 0.11000E+04 0.12923E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.12290E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.11192E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.95366E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.79785E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.70222E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.66381E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.65067E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.64137E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.62868E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.61072E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.59006E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.57525E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.57499E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.60083E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.66919E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.77804E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.89439E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.97993E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10119E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10156E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10113E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10067E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10035E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10016E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10006E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10001E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.99999E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.99994E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.99985E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.99958E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.99914E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.99869E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 132 OBSERVATION TYPE + 0.11000E+04 0.14032E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.16585E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.19508E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.20417E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.18822E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.15609E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.12397E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.96874E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.77522E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.64651E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.55432E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.50873E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.52317E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.57062E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.61104E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.58990E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.54826E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.54575E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.59013E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.64993E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.73039E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.81101E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.89186E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.98209E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10976E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12391E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.13689E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.14496E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.14857E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.14974E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.14998E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15002E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15005E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 133 OBSERVATION TYPE + 0.11000E+04 0.14088E+01 0.19455E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.13361E+01 0.19064E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.12395E+01 0.18488E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.11379E+01 0.17877E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.10505E+01 0.17342E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.98154E+00 0.16976E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.92451E+00 0.16777E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.87349E+00 0.16696E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.82829E+00 0.16605E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.79582E+00 0.16522E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.77562E+00 0.16637E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.75911E+00 0.17086E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.74080E+00 0.17791E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.72571E+00 0.18492E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.72719E+00 0.18996E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.75204E+00 0.19294E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.80129E+00 0.19447E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.86960E+00 0.19597E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.93292E+00 0.19748E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.96720E+00 0.19866E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.98310E+00 0.19941E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.99132E+00 0.19979E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.99603E+00 0.19994E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.99854E+00 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.99963E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.99997E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.99999E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.99995E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.99985E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.99958E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.99914E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.99869E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 134 OBSERVATION TYPE + 0.11000E+04 0.13806E+01 0.10178E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.12566E+01 0.90966E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.11252E+01 0.82655E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.10055E+01 0.78617E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.90851E+00 0.78063E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.83495E+00 0.79308E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.78541E+00 0.81070E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.75802E+00 0.82841E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.74540E+00 0.84912E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.74532E+00 0.88692E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.76976E+00 0.95913E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.83782E+00 0.10801E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.95649E+00 0.12459E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.11080E+01 0.14281E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.12625E+01 0.15959E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.13975E+01 0.17319E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.15033E+01 0.18320E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.15792E+01 0.19002E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.16299E+01 0.19437E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.16614E+01 0.19699E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.16799E+01 0.19847E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.16901E+01 0.19926E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.16953E+01 0.19966E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.16979E+01 0.19985E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.16991E+01 0.19993E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.16995E+01 0.19996E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.16997E+01 0.19997E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.16996E+01 0.19995E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.16993E+01 0.19992E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.16989E+01 0.19988E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.16984E+01 0.19981E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.16968E+01 0.19963E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.16914E+01 0.19899E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 135 OBSERVATION TYPE + 0.11000E+04 0.13936E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.13182E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.12074E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.10681E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.92494E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.81535E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.76759E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.76377E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.76276E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.74875E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.73171E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.71626E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.69923E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.68149E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.67424E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.69952E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.77848E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.91962E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.11097E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.12872E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.14243E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.15217E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.15886E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.16332E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.16617E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.16790E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.16889E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.16941E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.16965E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.16972E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.16966E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.16954E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.16941E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 136 OBSERVATION TYPE + 0.11000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 137 OBSERVATION TYPE + 0.11000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 138 OBSERVATION TYPE + 0.11000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.23000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.21000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.19000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 139 OBSERVATION TYPE + 0.11000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.23000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.21000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.19000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 140 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 141 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 142 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 143 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 144 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 145 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 146 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 147 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 148 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 149 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 150 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 151 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 152 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 153 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 154 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 155 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 156 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 157 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 158 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 159 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 160 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 161 OBSERVATION TYPE + 0.11000E+04 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.84250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.69500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.54750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 162 OBSERVATION TYPE + 0.11000E+04 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.45667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.44333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.43000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.41667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.40333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.39000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.39250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.39500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.39750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 163 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 164 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 165 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 166 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 167 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 168 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 169 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 170 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 171 OBSERVATION TYPE + 0.11000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.65667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.64333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.63000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.61667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.60333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.59000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.59250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.59500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.59750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 172 OBSERVATION TYPE + 0.11000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.65667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.64333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.63000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.61667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.60333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.59000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.59250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.59500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.59750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 173 OBSERVATION TYPE + 0.11000E+04 0.76000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.76000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.76000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.74333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.72667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.71000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.69333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.67667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.68000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.69000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.70000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.68750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.67500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.66250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 174 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 175 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 176 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 177 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 178 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 179 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 180 OBSERVATION TYPE + 0.11000E+04 0.92823E+00 0.34103E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.10500E+04 0.92797E+00 0.34093E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.10000E+04 0.92787E+00 0.34089E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.95000E+03 0.92789E+00 0.34090E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.90000E+03 0.92792E+00 0.34091E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.85000E+03 0.92794E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.80000E+03 0.92794E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.75000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.70000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.65000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.60000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.55000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.50000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.45000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.40000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.92794E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.92794E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.92792E+00 0.34091E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.92789E+00 0.34090E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.92787E+00 0.34089E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.92797E+00 0.34093E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.92823E+00 0.34103E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 181 OBSERVATION TYPE + 0.11000E+04 0.10383E+01 0.39136E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.10500E+04 0.10380E+01 0.39125E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.10000E+04 0.10379E+01 0.39121E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.95000E+03 0.10380E+01 0.39122E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.90000E+03 0.10380E+01 0.39123E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.85000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.80000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.75000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.70000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.65000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.60000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.55000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.50000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.45000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.40000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10380E+01 0.39123E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10380E+01 0.39122E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10379E+01 0.39121E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10380E+01 0.39125E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10383E+01 0.39136E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 182 OBSERVATION TYPE + 0.11000E+04 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.50000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.45000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.40000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 183 OBSERVATION TYPE + 0.11000E+04 0.14207E+01 0.43935E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.14203E+01 0.43923E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.14202E+01 0.43918E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.14202E+01 0.43919E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.14202E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.14202E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.14202E+01 0.43919E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.14202E+01 0.43918E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.14203E+01 0.43923E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.14207E+01 0.43935E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 184 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 185 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 186 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 187 OBSERVATION TYPE + 0.11000E+04 0.12595E+01 0.27059E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.10500E+04 0.12591E+01 0.27052E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.10000E+04 0.12590E+01 0.27049E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.95000E+03 0.12590E+01 0.27049E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.90000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.85000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.80000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.75000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.70000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.65000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.60000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.55000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.50000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.45000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.40000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.12590E+01 0.27049E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.12590E+01 0.27049E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.12591E+01 0.27052E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.12595E+01 0.27059E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 188 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 189 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 190 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 191 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 192 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 193 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 194 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 195 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 196 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 197 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 198 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 199 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 200 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 201 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 202 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 203 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 204 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 205 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 206 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 207 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 208 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 209 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 210 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17721E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20338E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22927E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24559E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25377E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25705E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25557E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25239E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24846E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24369E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24098E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24330E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25005E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25682E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25950E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26020E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26262E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26879E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.27566E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.27674E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.27115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26363E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25409E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.24103E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.22838E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21916E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21381E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21126E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21029E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21003E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21002E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.20998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20946E+01 0.10000E+10 0.10000E+10 + 211 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 212 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 213 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 214 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 215 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 216 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 217 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 218 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 219 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 220 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.18521E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20636E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22799E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24211E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.24934E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25155E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25027E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24785E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24533E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24381E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24381E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24579E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25012E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25738E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.26365E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26858E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.27667E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.28971E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.30477E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.31070E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.30218E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.27083E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.25520E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.24364E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.23654E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.23111E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.22438E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21753E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21299E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21085E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21007E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20960E+01 0.10000E+10 0.10000E+10 + 221 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.18156E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.23478E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.30234E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.35135E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.39520E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.43755E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.45618E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.46395E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.46279E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.44618E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.43013E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.43200E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.45484E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.48377E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.50325E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.52880E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.56677E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.62208E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.67917E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.68297E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.62789E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.57175E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.52745E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.47750E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.43958E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.41970E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.41218E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.41021E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.40994E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.40997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.40998E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.41003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.41013E+01 0.10000E+10 0.10000E+10 + 222 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 223 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.20709E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20871E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.21274E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.21725E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.21543E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.20491E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.18106E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.17484E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.17126E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.16884E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.16608E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.16293E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.16212E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.16574E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.17396E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.18581E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.19535E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.19550E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.19247E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20293E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.23144E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.27088E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.30926E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.33928E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.35920E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.37064E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.37635E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.37879E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.37964E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.37978E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.37967E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.37950E+01 0.10000E+10 0.10000E+10 + 224 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.26468E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.23729E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.20223E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.17602E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.16196E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.15671E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.15779E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.16540E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.17925E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.19566E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.20831E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21432E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.21710E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.22586E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.24993E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.29257E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.36394E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.48840E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.66118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.82544E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.94784E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10248E+02 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10671E+02 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10874E+02 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10959E+02 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10989E+02 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10998E+02 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10999E+02 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10999E+02 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10998E+02 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10995E+02 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10990E+02 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10986E+02 0.10000E+10 0.10000E+10 + 225 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17721E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20338E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22927E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24559E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25377E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25705E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25557E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25239E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24846E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24369E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24098E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24330E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25005E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25682E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25950E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26020E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26262E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26879E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.27566E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.27674E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.27115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26363E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25409E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.24103E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.22838E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21916E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21381E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21126E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21029E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21003E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21002E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.20998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20946E+01 0.10000E+10 0.10000E+10 + 226 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 227 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38103E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.39841E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.41510E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.42916E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.44065E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.44955E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.45569E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.45933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.46131E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.46279E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.46499E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.46891E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.47512E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.48365E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.49390E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.50472E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.51465E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.52217E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.52602E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.52538E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.52005E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.51050E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.49775E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.48327E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.46860E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.45512E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.44380E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.43505E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.42881E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.42468E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.42210E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.42036E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.41833E+01 0.10000E+10 0.10000E+10 + 228 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 229 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17721E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20338E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22927E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24559E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25377E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25705E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25557E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25239E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24846E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24369E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24098E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24330E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25005E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25682E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25950E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26020E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26262E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26879E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.27566E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.27674E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.27115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26363E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25409E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.24103E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.22838E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21916E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21381E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21126E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21029E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21003E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21002E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.20998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20946E+01 0.10000E+10 0.10000E+10 + 230 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.32962E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.32949E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.32950E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32947E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.32953E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.33049E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.33480E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.34735E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.37315E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.40816E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.43005E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.42018E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.38694E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.35619E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.33869E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33170E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.32976E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.32947E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.32950E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.32950E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.32949E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.32962E+01 0.10000E+10 0.10000E+10 + 231 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.52199E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.46110E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37830E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.31386E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.27941E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.26865E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.26998E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.27261E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27085E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26917E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.27300E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.28262E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.29487E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30644E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.31659E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.33051E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.35324E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.38834E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.43933E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.49706E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.53746E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.55709E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.56396E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.56557E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.56573E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.56568E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.56566E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.56566E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.56566E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.56565E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.56563E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.56569E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.56585E+01 0.10000E+10 0.10000E+10 + 232 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.33133E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.40029E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.47167E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.51420E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.51372E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.48225E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.43831E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.39783E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.37330E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.36483E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.36557E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.36653E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.36168E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.34788E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.32246E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.29305E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.27079E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26026E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.25883E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.26008E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.26158E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26346E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.26564E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.26754E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.26882E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.26953E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.26985E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.26995E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.26999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.27001E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.27005E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.26998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.26931E+01 0.10000E+10 0.10000E+10 + 233 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.23039E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.23172E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.23859E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.25156E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.26722E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.27919E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.28353E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.28030E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27272E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26731E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.26458E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.26225E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.26219E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.26936E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28748E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.31458E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.34075E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.35051E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33091E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.29037E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.25730E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.24007E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.23377E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.23223E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.23208E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.23213E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.23215E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.23215E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.23214E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.23213E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.23212E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.23215E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.23221E+01 0.10000E+10 0.10000E+10 + 234 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38901E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.37615E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37452E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38681E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.40863E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.43283E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.45455E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.47094E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.48036E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.48388E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.48463E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.48723E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.49327E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50201E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.51193E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.52166E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.53020E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.53703E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.54203E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.54540E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.54750E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.54872E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.54938E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.54971E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.54986E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.54992E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.54991E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.54986E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.54978E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.54965E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.54947E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.54897E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.54720E+01 0.10000E+10 0.10000E+10 + 235 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38063E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.36263E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.34252E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.32472E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.31006E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.30010E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.29572E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.29344E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28914E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.28211E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.27391E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.27145E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.28060E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30220E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.32790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.34732E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.36270E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.38549E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.42465E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.46381E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.49370E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.51411E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.52762E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.53649E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.54216E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.54564E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.54765E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.54870E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.54916E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.54922E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.54897E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.54853E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.54808E+01 0.10000E+10 0.10000E+10 + 236 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 237 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 238 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 239 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 240 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 241 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 242 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37976E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.37832E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37478E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.36853E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.36213E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.36231E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.36986E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.37867E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38626E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39310E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40266E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.42073E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.45532E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50836E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.56705E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.61651E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.65342E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.67857E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.69217E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.69783E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.69960E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.69998E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70001E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 243 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 244 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 245 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 246 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37998E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.37933E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37780E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.37506E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.37198E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.37144E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.37458E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38020E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38657E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39285E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.39967E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40617E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.40790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.39418E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.35966E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.33172E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.32205E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.32994E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.36465E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.44424E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55508E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63863E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68087E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69608E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 247 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 248 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 249 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 250 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 251 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 252 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38012E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38002E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37997E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.37999E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38010E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38056E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38193E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38491E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38969E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39541E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40287E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.41651E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.44196E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.47893E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.51697E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.55529E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.59769E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.64025E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.67255E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.69027E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.69748E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.69961E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70001E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 253 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 254 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 255 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 256 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 257 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38012E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38001E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37993E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.37975E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.37929E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.37848E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.37782E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.37860E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38159E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.38647E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.39515E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.41230E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.44550E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.49752E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.55724E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.61036E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.65063E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.67765E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.69197E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.69782E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.69961E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.69998E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70001E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 258 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 259 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 260 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 261 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 262 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 263 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 264 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 265 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 266 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 267 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 268 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 269 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 270 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 271 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 272 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 273 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 274 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 275 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 276 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 277 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 278 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 279 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 280 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 281 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 282 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 283 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 284 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 285 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 286 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 287 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 288 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 289 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 290 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.15000E+01 0.10000E+10 0.10000E+10 + 291 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 292 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 293 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 294 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 295 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 296 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 297 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 298 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 299 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 diff --git a/parm/analysis/gsi/hafs_nam_errtable.r3dv_vr b/parm/analysis/gsi/hafs_nam_errtable.r3dv_vr new file mode 100644 index 000000000..00f4ef3b2 --- /dev/null +++ b/parm/analysis/gsi/hafs_nam_errtable.r3dv_vr @@ -0,0 +1,6800 @@ + 100 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 101 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 102 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 103 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 104 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 105 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 106 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 107 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 108 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 109 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 110 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 111 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 112 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 113 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 114 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 115 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 116 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 117 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 118 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 119 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 120 OBSERVATION TYPE + 0.11000E+04 0.12696E+01 0.60737E+00 0.10000E+10 0.76322E+00 0.10000E+10 + 0.10500E+04 0.13282E+01 0.66294E+00 0.10000E+10 0.76322E+00 0.10000E+10 + 0.10000E+04 0.13932E+01 0.74223E+00 0.10000E+10 0.76322E+00 0.10000E+10 + 0.95000E+03 0.14390E+01 0.83688E+00 0.10000E+10 0.79899E+00 0.10000E+10 + 0.90000E+03 0.14354E+01 0.94025E+00 0.10000E+10 0.83561E+00 0.10000E+10 + 0.85000E+03 0.13669E+01 0.10439E+01 0.10000E+10 0.87224E+00 0.10000E+10 + 0.80000E+03 0.12552E+01 0.11591E+01 0.10000E+10 0.89405E+00 0.10000E+10 + 0.75000E+03 0.11362E+01 0.12715E+01 0.10000E+10 0.91585E+00 0.10000E+10 + 0.70000E+03 0.10397E+01 0.13819E+01 0.10000E+10 0.93767E+00 0.10000E+10 + 0.65000E+03 0.98016E+00 0.14850E+01 0.10000E+10 0.10358E+01 0.10000E+10 + 0.60000E+03 0.94757E+00 0.15562E+01 0.10000E+10 0.11339E+01 0.10000E+10 + 0.55000E+03 0.92875E+00 0.15972E+01 0.10000E+10 0.12212E+01 0.10000E+10 + 0.50000E+03 0.91714E+00 0.16305E+01 0.10000E+10 0.13194E+01 0.10000E+10 + 0.45000E+03 0.91625E+00 0.16707E+01 0.10000E+10 0.14391E+01 0.10000E+10 + 0.40000E+03 0.93506E+00 0.17091E+01 0.10000E+10 0.16246E+01 0.10000E+10 + 0.35000E+03 0.98447E+00 0.17517E+01 0.10000E+10 0.17769E+01 0.10000E+10 + 0.30000E+03 0.10699E+01 0.18047E+01 0.10000E+10 0.20497E+01 0.10000E+10 + 0.25000E+03 0.11816E+01 0.18621E+01 0.10000E+10 0.27694E+01 0.10000E+10 + 0.20000E+03 0.12862E+01 0.19134E+01 0.10000E+10 0.30202E+01 0.10000E+10 + 0.15000E+03 0.13542E+01 0.19517E+01 0.10000E+10 0.35327E+01 0.10000E+10 + 0.10000E+03 0.13831E+01 0.19762E+01 0.10000E+10 0.42957E+01 0.10000E+10 + 0.75000E+02 0.13832E+01 0.19897E+01 0.10000E+10 0.54844E+01 0.10000E+10 + 0.50000E+02 0.13534E+01 0.19961E+01 0.10000E+10 0.64655E+01 0.10000E+10 + 0.40000E+02 0.13109E+01 0.19988E+01 0.10000E+10 0.64655E+01 0.10000E+10 + 0.30000E+02 0.13018E+01 0.19997E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.13414E+01 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.14017E+01 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.14471E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.14744E+01 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.14892E+01 0.19997E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.14964E+01 0.19992E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.14988E+01 0.19983E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.14962E+01 0.19974E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 121 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 122 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 123 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 124 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 125 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 126 OBSERVATION TYPE + 0.11000E+04 0.24296E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.24261E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.23798E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.23022E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.22627E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.22817E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.22826E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.21826E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.20092E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.18385E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.17169E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.16511E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.16306E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.16472E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.17005E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.17905E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.19016E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.19907E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.20094E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.19571E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.18864E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.18600E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.19104E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.20392E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.22324E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.24605E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.26741E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.28318E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.29263E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.29735E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.29931E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.29985E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.29924E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 127 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 128 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 129 OBSERVATION TYPE + 0.11000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10500E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.10000E+04 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.95000E+03 0.11000E+01 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.90000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.85000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.80000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.75000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.70000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.65000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.60000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+01 0.10000E+10 + 0.55000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.80000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.90000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.95000E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12500E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 130 OBSERVATION TYPE + 0.11000E+04 0.24308E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.23855E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.23123E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.22137E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.20999E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.19857E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.18857E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.18094E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.17590E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.17307E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.17174E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.17098E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.16958E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.16611E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.15936E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.14949E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.13923E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.13291E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.13180E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.13443E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.14054E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.14870E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.15663E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.16273E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.16658E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.16862E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.16954E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.16988E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.16997E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.16997E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.16993E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.16985E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.16977E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 131 OBSERVATION TYPE + 0.11000E+04 0.12923E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.12290E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.11192E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.95366E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.79785E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.70222E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.66381E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.65067E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.64137E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.62868E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.61072E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.59006E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.57525E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.57499E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.60083E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.66919E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.77804E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.89439E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.97993E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10119E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10156E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10113E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10067E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10035E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10016E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10006E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10001E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.99999E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.99994E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.99985E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.99958E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.99914E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.99869E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 132 OBSERVATION TYPE + 0.11000E+04 0.14032E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.16585E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.19508E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.20417E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.18822E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.15609E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.12397E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.96874E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.77522E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.64651E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.55432E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.50873E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.52317E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.57062E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.61104E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.58990E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.54826E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.54575E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.59013E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.64993E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.73039E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.81101E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.89186E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.98209E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10976E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12391E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.13689E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.14496E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.14857E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.14974E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.14998E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.15002E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.15005E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 133 OBSERVATION TYPE + 0.11000E+04 0.14088E+01 0.19455E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.13361E+01 0.19064E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.12395E+01 0.18488E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.11379E+01 0.17877E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.10505E+01 0.17342E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.98154E+00 0.16976E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.92451E+00 0.16777E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.87349E+00 0.16696E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.82829E+00 0.16605E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.79582E+00 0.16522E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.77562E+00 0.16637E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.75911E+00 0.17086E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.74080E+00 0.17791E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.72571E+00 0.18492E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.72719E+00 0.18996E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.75204E+00 0.19294E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.80129E+00 0.19447E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.86960E+00 0.19597E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.93292E+00 0.19748E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.96720E+00 0.19866E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.98310E+00 0.19941E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.99132E+00 0.19979E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.99603E+00 0.19994E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.99854E+00 0.19999E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.99963E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.99997E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.99999E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.99995E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.99985E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.99958E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.99914E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.99869E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 134 OBSERVATION TYPE + 0.11000E+04 0.13806E+01 0.10178E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.12566E+01 0.90966E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.11252E+01 0.82655E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.10055E+01 0.78617E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.90851E+00 0.78063E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.83495E+00 0.79308E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.78541E+00 0.81070E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.75802E+00 0.82841E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.74540E+00 0.84912E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.74532E+00 0.88692E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.76976E+00 0.95913E+00 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.83782E+00 0.10801E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.95649E+00 0.12459E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.11080E+01 0.14281E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.12625E+01 0.15959E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.13975E+01 0.17319E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.15033E+01 0.18320E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.15792E+01 0.19002E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.16299E+01 0.19437E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.16614E+01 0.19699E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.16799E+01 0.19847E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.16901E+01 0.19926E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.16953E+01 0.19966E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.16979E+01 0.19985E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.16991E+01 0.19993E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.16995E+01 0.19996E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.16997E+01 0.19997E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.16996E+01 0.19995E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.16993E+01 0.19992E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.16989E+01 0.19988E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.16984E+01 0.19981E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.16968E+01 0.19963E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.16914E+01 0.19899E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 135 OBSERVATION TYPE + 0.11000E+04 0.13936E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.13182E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.12074E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.10681E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.92494E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.81535E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.76759E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.76377E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.76276E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.74875E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.73171E+00 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.71626E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.69923E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.68149E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.67424E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.69952E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.77848E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.91962E+00 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.11097E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.12872E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.14243E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.15217E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.15886E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.16332E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.16617E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.16790E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.16889E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.16941E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.16965E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.16972E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.16966E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.16954E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.16941E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 136 OBSERVATION TYPE + 0.11000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 137 OBSERVATION TYPE + 0.11000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.07500E+01 0.07000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 138 OBSERVATION TYPE + 0.11000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.23000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.21000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.19000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 139 OBSERVATION TYPE + 0.11000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.25000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.23000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.21000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.19000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.17000E+01 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 + 140 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 141 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 142 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 143 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 144 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 145 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 146 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 147 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 148 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 149 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.90000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 150 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 151 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 152 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 153 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.20000E+01 + 154 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 155 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 156 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 157 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 158 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.80000E+01 + 159 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 + 160 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 161 OBSERVATION TYPE + 0.11000E+04 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.99000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.84250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.69500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.54750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 162 OBSERVATION TYPE + 0.11000E+04 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.45667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.44333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.43000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.41667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.40333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.39000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.39250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.39500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.39750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.43750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.42500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.41250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 163 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 164 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 165 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 166 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 167 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 168 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 169 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 170 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 171 OBSERVATION TYPE + 0.11000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.65667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.64333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.63000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.61667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.60333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.59000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.59250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.59500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.59750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 172 OBSERVATION TYPE + 0.11000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.65667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.64333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.63000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.61667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.60333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.59000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.59250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.59500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.59750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.63750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.62500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.61250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.60000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 173 OBSERVATION TYPE + 0.11000E+04 0.76000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.76000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.76000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.74333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.72667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.71000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.69333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.67667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.66000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.67000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.68000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.69000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.70000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.68750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.67500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.66250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.65000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 174 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 175 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 176 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 177 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 178 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 179 OBSERVATION TYPE + 0.11000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.56000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.54333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.52667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.51000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.49333E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.47667E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.46000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.47000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.48000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.49000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.48750E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.47500E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.46250E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.45000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 180 OBSERVATION TYPE + 0.11000E+04 0.92823E+00 0.34103E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.10500E+04 0.92797E+00 0.34093E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.10000E+04 0.92787E+00 0.34089E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.95000E+03 0.92789E+00 0.34090E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.90000E+03 0.92792E+00 0.34091E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.85000E+03 0.92794E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.80000E+03 0.92794E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.75000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.70000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.65000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.60000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.55000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.50000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.45000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.53636E+00 0.10000E+10 + 0.40000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.92793E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.92794E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.92794E+00 0.34092E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.92792E+00 0.34091E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.92789E+00 0.34090E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.92787E+00 0.34089E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.92797E+00 0.34093E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.92823E+00 0.34103E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 181 OBSERVATION TYPE + 0.11000E+04 0.10383E+01 0.39136E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.10500E+04 0.10380E+01 0.39125E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.10000E+04 0.10379E+01 0.39121E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.95000E+03 0.10380E+01 0.39122E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.90000E+03 0.10380E+01 0.39123E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.85000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.80000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.75000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.70000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.65000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.60000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.55000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.50000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.45000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.79678E+00 0.10000E+10 + 0.40000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10380E+01 0.39124E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10380E+01 0.39123E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10380E+01 0.39122E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10379E+01 0.39121E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10380E+01 0.39125E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10383E+01 0.39136E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 182 OBSERVATION TYPE + 0.11000E+04 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.50000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.45000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.40000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10540E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 183 OBSERVATION TYPE + 0.11000E+04 0.14207E+01 0.43935E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.14203E+01 0.43923E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.14202E+01 0.43918E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.14202E+01 0.43919E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.14202E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.14203E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.14202E+01 0.43921E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.14202E+01 0.43919E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.14202E+01 0.43918E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.14203E+01 0.43923E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.14207E+01 0.43935E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 184 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 185 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 186 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 187 OBSERVATION TYPE + 0.11000E+04 0.12595E+01 0.27059E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.10500E+04 0.12591E+01 0.27052E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.10000E+04 0.12590E+01 0.27049E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.95000E+03 0.12590E+01 0.27049E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.90000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.85000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.80000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.75000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.70000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.65000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.60000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.55000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.50000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.45000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.54259E+00 0.10000E+10 + 0.40000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.12591E+01 0.27050E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.12590E+01 0.27049E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.12590E+01 0.27049E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.12591E+01 0.27052E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.12595E+01 0.27059E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 188 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.70000E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 189 OBSERVATION TYPE + 0.11000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10500E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.10000E+04 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.95000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.90000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.85000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.80000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.75000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.70000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.65000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.60000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.53890E+00 0.10000E+10 + 0.55000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.40000E+01 0.59120E+00 0.10000E+10 0.10000E+10 0.10000E+10 + 190 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 191 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.20000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 192 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 193 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 194 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 195 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 196 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 197 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 198 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 199 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 200 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 201 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 202 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 203 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 204 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 205 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 206 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 207 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 208 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 209 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 210 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17721E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20338E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22927E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24559E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25377E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25705E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25557E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25239E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24846E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24369E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24098E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24330E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25005E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25682E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25950E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26020E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26262E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26879E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.27566E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.27674E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.27115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26363E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25409E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.24103E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.22838E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21916E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21381E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21126E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21029E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21003E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21002E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.20998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20946E+01 0.10000E+10 0.10000E+10 + 211 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 212 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 213 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 214 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 215 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 216 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 217 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 218 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 219 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 220 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.18521E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20636E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22799E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24211E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.24934E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25155E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25027E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24785E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24533E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24381E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24381E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24579E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25012E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25738E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.26365E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26858E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.27667E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.28971E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.30477E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.31070E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.30218E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.27083E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.25520E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.24364E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.23654E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.23111E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.22438E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21753E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21299E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21085E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21007E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20960E+01 0.10000E+10 0.10000E+10 + 221 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.18156E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.23478E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.30234E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.35135E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.39520E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.43755E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.45618E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.46395E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.46279E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.44618E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.43013E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.43200E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.45484E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.48377E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.50325E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.52880E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.56677E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.62208E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.67917E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.68297E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.62789E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.57175E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.52745E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.47750E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.43958E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.41970E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.41218E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.41021E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.40994E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.40997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.40998E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.41003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.41013E+01 0.10000E+10 0.10000E+10 + 222 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 223 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.20709E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20871E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.21274E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.21725E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.21543E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.20491E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.18106E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.17484E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.17126E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.16884E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.16608E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.16293E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.16212E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.16574E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.17396E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.18581E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.19535E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.19550E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.19247E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20293E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.23144E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.27088E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.30926E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.33928E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.35920E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.37064E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.37635E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.37879E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.37964E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.37978E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.37967E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.37950E+01 0.10000E+10 0.10000E+10 + 224 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.26468E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.23729E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.20223E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.17602E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.16196E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.15671E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.15779E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.16540E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.17925E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.19566E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.20831E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21432E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.21710E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.22586E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.24993E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.29257E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.36394E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.48840E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.66118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.82544E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.94784E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10248E+02 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10671E+02 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10874E+02 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10959E+02 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10989E+02 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10998E+02 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10999E+02 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10999E+02 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10998E+02 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10995E+02 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10990E+02 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10986E+02 0.10000E+10 0.10000E+10 + 225 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17721E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20338E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22927E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24559E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25377E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25705E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25557E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25239E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24846E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24369E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24098E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24330E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25005E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25682E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25950E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26020E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26262E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26879E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.27566E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.27674E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.27115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26363E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25409E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.24103E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.22838E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21916E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21381E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21126E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21029E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21003E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21002E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.20998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20946E+01 0.10000E+10 0.10000E+10 + 226 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 227 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38103E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.39841E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.41510E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.42916E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.44065E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.44955E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.45569E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.45933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.46131E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.46279E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.46499E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.46891E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.47512E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.48365E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.49390E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.50472E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.51465E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.52217E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.52602E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.52538E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.52005E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.51050E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.49775E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.48327E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.46860E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.45512E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.44380E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.43505E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.42881E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.42468E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.42210E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.42036E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.41833E+01 0.10000E+10 0.10000E+10 + 228 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.14000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37369E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.23798E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.20756E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.33315E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22269E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.23933E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28554E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.23840E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.21478E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.21429E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.23791E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.32143E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25096E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25985E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.23328E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.22679E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33118E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.34675E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.20456E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25233E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33127E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.21000E+01 0.10000E+10 0.10000E+10 + 229 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17721E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.20338E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.22927E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.24559E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25377E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25705E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25557E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25239E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.24846E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.24369E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.24098E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.24330E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25005E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25682E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25950E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26020E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26262E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26879E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.27566E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.27674E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.27115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26363E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25409E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.24103E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.22838E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.21916E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.21381E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.21126E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.21029E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.21003E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.21002E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.20998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.20946E+01 0.10000E+10 0.10000E+10 + 230 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.32962E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.32949E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.32950E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32947E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.32953E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.33049E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.33480E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.34735E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.37315E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.40816E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.43005E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.42018E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.38694E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.35619E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.33869E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.33170E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.32976E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.32947E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.32950E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.32951E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.32950E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.32949E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.32952E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.32962E+01 0.10000E+10 0.10000E+10 + 231 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.52199E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.46110E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37830E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.31386E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.27941E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.26865E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.26998E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.27261E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27085E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26917E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.27300E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.28262E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.29487E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30644E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.31659E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.33051E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.35324E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.38834E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.43933E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.49706E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.53746E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.55709E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.56396E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.56557E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.56573E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.56568E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.56566E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.56566E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.56566E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.56565E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.56563E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.56569E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.56585E+01 0.10000E+10 0.10000E+10 + 232 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.33133E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.40029E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.47167E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.51420E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.51372E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.48225E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.43831E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.39783E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.37330E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.36483E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.36557E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.36653E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.36168E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.34788E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.32246E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.29305E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.27079E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26026E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.25883E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.26008E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.26158E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26346E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.26564E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.26754E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.26882E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.26953E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.26985E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.26995E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.26999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.27001E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.27005E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.26998E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.26931E+01 0.10000E+10 0.10000E+10 + 233 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.23039E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.23172E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.23859E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.25156E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.26722E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.27919E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.28353E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.28030E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27272E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26731E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.26458E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.26225E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.26219E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.26936E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28748E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.31458E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.34075E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.35051E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.33091E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.29037E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.25730E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.24007E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.23377E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.23223E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.23208E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.23213E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.23215E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.23215E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.23214E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.23213E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.23212E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.23215E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.23221E+01 0.10000E+10 0.10000E+10 + 234 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38901E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.37615E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37452E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38681E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.40863E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.43283E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.45455E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.47094E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.48036E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.48388E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.48463E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.48723E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.49327E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50201E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.51193E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.52166E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.53020E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.53703E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.54203E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.54540E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.54750E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.54872E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.54938E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.54971E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.54986E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.54992E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.54991E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.54986E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.54978E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.54965E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.54947E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.54897E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.54720E+01 0.10000E+10 0.10000E+10 + 235 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38063E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.36263E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.34252E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.32472E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.31006E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.30010E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.29572E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.29344E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.28914E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.28211E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.27391E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.27145E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.28060E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30220E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.32790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.34732E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.36270E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.38549E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.42465E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.46381E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.49370E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.51411E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.52762E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.53649E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.54216E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.54564E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.54765E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.54870E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.54916E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.54922E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.54897E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.54853E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.54808E+01 0.10000E+10 0.10000E+10 + 236 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 237 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.25000E+01 0.10000E+10 0.10000E+10 + 238 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 239 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.55000E+01 0.10000E+10 0.10000E+10 + 240 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 241 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 242 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37976E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.37832E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37478E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.36853E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.36213E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.36231E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.36986E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.37867E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38626E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39310E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40266E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.42073E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.45532E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50836E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.56705E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.61651E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.65342E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.67857E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.69217E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.69783E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.69960E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.69998E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70001E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 243 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 244 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 245 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 246 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37998E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.37933E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37780E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.37506E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.37198E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.37144E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.37458E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38020E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38657E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39285E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.39967E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40617E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.40790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.39418E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.35966E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.33172E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.32205E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.32994E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.36465E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.44424E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55508E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63863E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68087E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69608E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 247 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 248 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 249 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 250 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 251 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.37259E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.35492E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.31854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26714E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.22569E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.21068E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.22090E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.24574E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.27502E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30204E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.32221E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.33022E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.31829E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30004E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.28734E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.28432E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.28958E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30633E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.34963E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.43654E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.55198E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.63768E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.68067E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.69606E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69976E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70013E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70002E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 252 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38012E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38002E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37997E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.37999E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38010E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38056E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38193E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38491E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38969E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39541E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40287E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.41651E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.44196E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.47893E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.51697E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.55529E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.59769E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.64025E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.67255E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.69027E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.69748E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.69961E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70001E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 253 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 254 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 255 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.38000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.39000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 256 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 257 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.38012E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.38001E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.37993E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.37975E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.37929E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.37848E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.37782E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.37860E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.38159E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.38647E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.39515E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.41230E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.44550E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.49752E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.55724E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.61036E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.65063E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.67765E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.69197E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.69782E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.69961E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.69998E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70001E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.69999E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.69997E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.69995E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70003E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70022E+01 0.10000E+10 0.10000E+10 + 258 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 259 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.40000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.41000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.50000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.60000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.63000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.66000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.70000E+01 0.10000E+10 0.10000E+10 + 260 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 261 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 262 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 263 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 264 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 265 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 266 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 267 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 268 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 269 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 270 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 271 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 272 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 273 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 274 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 275 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 276 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 277 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 278 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 279 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 280 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 281 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.18854E+01 0.10000E+10 0.10000E+10 + 282 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 283 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 284 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.17610E+01 0.10000E+10 0.10000E+10 + 285 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.12115E+01 0.10000E+10 0.10000E+10 + 286 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10790E+01 0.10000E+10 0.10000E+10 + 287 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.19162E+01 0.10000E+10 0.10000E+10 + 288 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.30000E+01 0.10000E+10 0.10000E+10 + 289 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.19278E+01 0.10000E+10 0.10000E+10 + 290 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.26280E+01 0.10000E+10 0.10000E+10 + 291 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 292 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 293 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 294 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 295 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 296 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 297 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 298 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 299 OBSERVATION TYPE + 0.11000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10500E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+04 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.95000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.90000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.85000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.80000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.70000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.65000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.60000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.55000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.45000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.35000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.25000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.15000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+03 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.75000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+02 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.50000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.40000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.30000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.20000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.10000E+01 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 + 0.00000E+00 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 0.10000E+10 diff --git a/parm/analysis/gsi/hafs_satinfo.txt b/parm/analysis/gsi/hafs_satinfo.txt new file mode 100644 index 000000000..2019328c5 --- /dev/null +++ b/parm/analysis/gsi/hafs_satinfo.txt @@ -0,0 +1,3215 @@ +!sensor/instr/sat chan iuse error error_cld ermax var_b var_pg icld_det icloud iaerosol + amsua_n15 1 1 3.000 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n15 2 1 2.200 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n15 3 1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n15 4 1 0.600 3.000 2.500 10.000 0.000 -2 -1 -1 + amsua_n15 5 1 0.300 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_n15 6 -1 0.230 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_n15 7 1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_n15 8 1 0.275 0.275 2.000 10.000 0.000 -2 -1 -1 + amsua_n15 9 1 0.340 0.340 2.000 10.000 0.000 -2 -1 -1 + amsua_n15 10 1 0.400 0.400 2.000 10.000 0.000 -2 -1 -1 + amsua_n15 11 -1 0.600 0.600 2.500 10.000 0.000 -2 -1 -1 + amsua_n15 12 1 1.000 1.000 3.500 10.000 0.000 -2 -1 -1 + amsua_n15 13 1 1.500 1.500 4.500 10.000 0.000 -2 -1 -1 + amsua_n15 14 -1 2.000 2.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n15 15 1 3.500 18.000 4.500 10.000 0.000 -2 -1 -1 + hirs3_n17 1 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs3_n17 2 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs3_n17 3 -1 0.530 0.000 2.500 10.000 0.000 1 -1 -1 + hirs3_n17 4 -1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + hirs3_n17 5 -1 0.360 0.000 2.000 10.000 0.000 1 -1 -1 + hirs3_n17 6 -1 0.460 0.000 2.000 10.000 0.000 1 -1 -1 + hirs3_n17 7 -1 0.570 0.000 2.500 10.000 0.000 1 -1 -1 + hirs3_n17 8 -1 1.000 0.000 3.000 10.000 0.000 1 -1 -1 + hirs3_n17 9 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs3_n17 10 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs3_n17 11 -1 1.200 0.000 3.500 10.000 0.000 1 -1 -1 + hirs3_n17 12 -1 1.600 0.000 4.500 10.000 0.000 1 -1 -1 + hirs3_n17 13 -1 0.364 0.000 2.000 10.000 0.000 1 -1 -1 + hirs3_n17 14 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs3_n17 15 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs3_n17 16 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs3_n17 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs3_n17 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs3_n17 19 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + amsub_n17 1 -1 4.500 0.000 6.000 10.000 0.000 -2 -1 -1 + amsub_n17 2 -1 3.750 0.000 6.000 10.000 0.000 -2 -1 -1 + amsub_n17 3 -1 3.500 0.000 6.000 10.000 0.000 -2 -1 -1 + amsub_n17 4 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + amsub_n17 5 -1 2.800 0.000 6.000 10.000 0.000 -2 -1 -1 + amsua_n18 1 1 2.500 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n18 2 1 2.200 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n18 3 1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n18 4 1 0.550 3.000 2.500 10.000 0.000 -2 -1 -1 + amsua_n18 5 -1 0.300 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_n18 6 1 0.230 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_n18 7 1 0.230 0.230 2.000 10.000 0.000 -2 -1 -1 + amsua_n18 8 -1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_n18 9 -1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_n18 10 1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_n18 11 1 0.400 0.400 2.500 10.000 0.000 -2 -1 -1 + amsua_n18 12 1 0.550 0.550 3.500 10.000 0.000 -2 -1 -1 + amsua_n18 13 1 0.800 0.800 4.500 10.000 0.000 -2 -1 -1 + amsua_n18 14 1 3.000 3.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n18 15 1 3.500 18.000 4.500 10.000 0.000 -2 -1 -1 + mhs_n18 1 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n18 2 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n18 3 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n18 4 1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n18 5 1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + hirs4_metop-a 1 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_metop-a 2 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-a 3 -1 0.530 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-a 4 -1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 5 -1 0.360 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 6 -1 0.460 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 7 -1 0.570 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-a 8 -1 1.000 0.000 3.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 9 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs4_metop-a 10 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-a 11 -1 1.200 0.000 4.500 10.000 0.000 1 -1 -1 + hirs4_metop-a 12 -1 1.600 0.000 4.500 10.000 0.000 1 -1 -1 + hirs4_metop-a 13 -1 0.364 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 14 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 15 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-a 16 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs4_metop-a 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_metop-a 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_metop-a 19 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + amsua_metop-a 1 1 2.500 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 2 1 2.200 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 3 1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 4 1 0.550 3.000 2.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 5 1 0.300 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-a 6 1 0.230 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-a 7 -1 0.230 0.230 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-a 8 -1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-a 9 1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-a 10 1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-a 11 1 0.400 0.400 2.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 12 1 0.550 0.550 3.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 13 1 0.800 0.800 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 14 1 3.000 3.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-a 15 1 3.500 18.000 4.500 10.000 0.000 -2 -1 -1 + mhs_metop-a 1 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-a 2 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-a 3 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-a 4 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-a 5 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + iasi_metop-a 16 1 1.380 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 29 -1 0.810 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 32 -1 0.750 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 35 -1 0.790 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 38 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 41 -1 0.740 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 44 -1 0.680 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 47 -1 0.720 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 49 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 50 -1 0.650 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 51 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 53 -1 0.690 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 55 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 56 -1 0.640 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 57 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 59 1 0.670 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 61 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 62 -1 0.610 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 63 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 66 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 68 -1 0.590 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 70 1 0.760 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 72 1 1.220 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 74 1 0.780 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 76 -1 0.640 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 78 -1 0.620 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 79 1 0.610 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 81 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 82 -1 0.650 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 83 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 84 -1 0.610 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 85 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 86 -1 0.680 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 87 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 89 -1 0.680 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 92 -1 4.380 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 93 -1 3.050 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 95 -1 2.310 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 97 -1 1.560 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 99 -1 1.330 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 101 -1 1.580 0.000 3.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 103 -1 0.930 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 104 1 1.670 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 106 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 109 1 0.570 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 110 -1 0.580 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 111 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 113 1 0.680 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 116 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 119 1 0.680 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 122 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 125 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 128 1 0.580 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 131 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 133 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 135 1 0.580 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 138 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 141 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 144 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 146 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 148 1 0.820 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 150 -1 0.590 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 151 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 154 1 0.510 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 157 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 159 1 0.520 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 160 -1 0.510 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 161 1 0.510 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 163 1 0.760 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 167 1 0.520 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 170 1 0.570 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 173 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 176 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 179 -1 0.580 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 180 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 185 1 0.610 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 187 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 191 -1 0.640 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 193 1 0.760 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 197 -1 0.720 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 199 1 1.050 0.000 3.500 10.000 0.000 1 -1 -1 + iasi_metop-a 200 -1 0.750 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 202 -1 0.510 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 203 -1 0.650 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 205 1 1.300 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 207 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 210 1 0.930 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 212 1 1.490 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 213 -1 1.120 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 214 1 0.680 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 217 1 0.660 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 218 -1 0.670 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 219 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 222 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 224 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 225 -1 0.670 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 226 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 228 -1 0.620 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 230 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 231 -1 0.690 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 232 1 0.660 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 236 1 0.790 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 237 -1 0.780 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 239 1 0.740 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 243 1 0.880 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 246 1 0.770 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 249 1 0.880 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 252 1 0.860 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 254 1 1.000 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 259 -1 0.870 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 260 1 0.850 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 262 1 0.880 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 265 1 0.840 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 267 1 0.840 0.000 3.500 10.000 0.000 1 -1 -1 + iasi_metop-a 269 -1 0.840 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 275 1 0.800 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 279 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 282 1 0.870 0.000 3.500 10.000 0.000 1 -1 -1 + iasi_metop-a 285 -1 0.980 0.000 3.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 294 1 0.520 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 296 1 0.650 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 299 1 0.690 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 300 -1 0.610 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 303 1 0.600 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 306 1 0.670 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 309 -1 0.790 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 313 -1 0.620 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 320 -1 0.660 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 323 1 0.700 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-a 326 -1 0.650 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 327 1 0.620 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 329 1 0.610 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-a 332 -1 0.620 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 335 1 0.530 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 345 1 0.600 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-a 347 1 0.680 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 350 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 354 1 0.630 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 356 1 0.970 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 360 1 0.650 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 363 -1 0.980 0.000 3.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 366 1 0.580 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-a 371 1 0.730 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 372 -1 0.650 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 373 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 375 1 0.990 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 377 1 0.760 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 379 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 381 1 0.970 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 383 1 0.770 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-a 386 1 0.620 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 389 1 0.630 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-a 398 1 1.210 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 401 1 1.410 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-a 404 1 1.550 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-a 405 -1 1.780 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 407 1 1.350 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 408 -1 1.140 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 410 1 1.690 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-a 411 -1 1.790 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 414 1 1.460 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-a 416 1 1.630 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-a 418 -1 1.940 0.000 5.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 423 -1 2.010 0.000 5.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 426 1 1.240 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 428 1 1.760 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-a 432 1 1.260 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 433 -1 1.470 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 434 1 1.900 0.000 5.500 10.000 0.000 1 -1 -1 + iasi_metop-a 439 1 1.660 0.000 5.500 10.000 0.000 1 -1 -1 + iasi_metop-a 442 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 445 1 1.490 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-a 450 -1 1.520 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 457 1 1.550 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-a 459 -1 1.960 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 472 -1 2.310 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 477 -1 2.330 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 483 -1 2.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 509 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 515 1 2.330 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 546 1 2.230 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 552 1 2.330 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 559 1 1.840 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 566 1 2.290 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 571 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 573 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 578 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 584 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 594 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 625 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 646 1 2.270 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 662 1 2.240 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 668 1 2.230 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 705 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 739 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 756 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 797 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 867 1 2.300 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 906 1 2.150 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 921 1 2.310 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1027 1 2.370 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1046 1 2.270 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1090 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1098 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1121 1 2.230 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1133 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1173 -1 2.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1191 1 2.320 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1194 1 2.310 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1222 -1 2.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1271 1 2.320 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1283 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1338 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1409 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1414 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1420 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1424 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1427 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1430 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1434 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1440 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1442 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1445 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1450 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1454 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1460 -1 2.170 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1463 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1469 -1 2.170 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1474 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1479 1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1483 -1 2.160 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1487 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1494 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1496 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1502 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1505 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1509 1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1510 -1 2.110 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1513 1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1518 -1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1521 1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1526 -1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1529 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1532 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1536 1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1537 -1 2.010 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1541 -1 2.050 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1545 -1 2.030 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1548 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1553 -1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1560 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1568 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1574 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1579 1 1.700 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1583 -1 1.760 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1585 1 1.770 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1587 1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1606 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1626 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1639 1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1643 1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1652 1 2.070 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1658 1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1659 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1666 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1671 1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1675 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1681 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1694 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1697 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1710 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1786 1 1.980 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1791 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1805 1 2.180 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1839 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1884 1 2.210 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 1913 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1946 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1947 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 1991 1 2.250 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2019 1 1.800 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2094 1 2.240 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2119 1 1.730 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2213 1 1.730 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2239 1 2.270 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2271 1 1.670 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2289 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2321 1 1.720 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2333 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2346 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2349 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2352 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2359 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2367 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2374 -1 2.170 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2398 1 1.740 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2426 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2562 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2701 1 1.670 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-a 2741 -1 1.730 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2745 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2760 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2819 -1 1.730 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2889 1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2907 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2910 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2919 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2921 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2939 -1 1.710 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2944 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2945 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2948 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2951 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2958 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2971 -1 1.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2977 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2985 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2988 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2990 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2991 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 2993 1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3002 1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3008 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3014 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3027 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3029 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3030 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3036 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3047 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3049 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3052 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3053 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3055 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3058 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3064 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3069 -1 1.770 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3087 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3093 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3098 -1 1.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3105 1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3107 -1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3110 1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3116 -1 1.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3127 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3129 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3136 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3146 -1 1.970 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3151 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3160 -1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3165 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3168 -1 1.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3175 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3178 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3189 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3207 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3228 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3244 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3248 -1 1.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3252 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3256 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3263 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3281 -1 1.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3295 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3303 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3309 -1 1.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3312 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3322 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3326 -1 1.360 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3354 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3366 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3375 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3378 -1 1.680 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3411 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3416 -1 1.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3432 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3438 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3440 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3442 -1 1.410 0.000 5.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 3444 -1 1.160 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 3446 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3448 -1 1.250 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3450 -1 1.200 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3452 -1 1.650 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3454 -1 1.660 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3458 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3467 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3476 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3484 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3491 -1 1.250 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3497 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3499 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3504 -1 1.700 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3506 -1 0.990 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3509 -1 1.810 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3518 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3527 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3555 -1 1.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3575 -1 1.470 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 3577 -1 1.150 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3580 -1 1.580 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3582 -1 1.180 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-a 3586 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3589 -1 1.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3599 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3610 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3626 -1 1.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3638 -1 1.270 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3646 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3653 -1 1.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3658 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3661 -1 1.290 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3673 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3689 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3700 -1 1.230 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3710 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3726 -1 1.210 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3763 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3814 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3841 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 3888 -1 1.330 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4032 -1 1.750 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4059 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4068 -1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4082 -1 2.030 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4095 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4160 -1 1.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4234 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4257 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4411 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4498 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4520 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4552 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4567 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4608 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4646 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4698 -1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4808 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4849 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4920 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4939 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4947 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4967 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4991 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 4996 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5015 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5028 -1 1.770 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5056 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5128 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5130 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5144 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5170 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5178 -1 1.790 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5183 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5188 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5191 -1 2.330 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5368 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5371 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5379 -1 1.810 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5381 1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5383 -1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5397 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5399 1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5401 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5403 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5405 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5446 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5455 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5472 -1 2.160 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5480 1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5483 -1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5485 -1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5492 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5497 -1 1.750 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5502 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5507 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5509 -1 2.140 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5517 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5528 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5558 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5697 -1 2.110 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5714 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5749 -1 2.030 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5766 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5785 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5798 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5799 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5801 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5817 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5833 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5834 -1 2.330 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5836 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5849 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5851 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5852 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5865 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5869 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5881 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5884 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5897 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5900 -1 2.360 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5916 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5932 -1 2.350 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5948 -1 2.300 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5963 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5968 -1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5978 -1 2.050 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5988 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5992 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5994 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 5997 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6003 -1 1.970 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6008 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6023 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6026 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6039 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6053 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6056 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6067 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6071 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6082 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6085 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6098 -1 2.410 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6112 -1 2.340 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6126 -1 9.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6135 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6140 -1 2.380 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6149 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6154 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6158 -1 2.390 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6161 -1 2.110 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6168 -1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6174 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6182 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6187 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6205 -1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6209 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6213 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6317 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6339 -1 2.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6342 -1 1.540 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6366 -1 1.640 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6381 -1 1.510 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6391 -1 1.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6489 -1 2.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6962 -1 2.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6966 -1 2.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6970 -1 2.370 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6975 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6977 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6982 -1 1.720 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6985 -1 1.740 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6987 -1 1.790 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6989 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6991 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6993 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6995 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6997 -1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 6999 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7000 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7004 -1 2.160 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7008 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7013 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7016 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7021 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7024 -1 2.410 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7027 -1 2.390 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7029 -1 2.380 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7032 -1 2.400 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7038 -1 2.420 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7043 -1 2.410 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7046 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7049 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7069 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7072 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7076 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7081 -1 2.400 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7084 -1 2.440 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7089 -1 2.400 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7099 -1 2.420 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7209 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7222 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7231 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7235 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7247 -1 2.460 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7267 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7269 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7284 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7389 -1 2.510 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7419 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7423 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7424 -1 2.530 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7426 -1 2.460 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7428 -1 2.490 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7431 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7436 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7444 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7475 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7549 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7584 -1 2.540 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7665 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7666 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7831 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7836 -1 2.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7853 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7865 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7885 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7888 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7912 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7950 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7972 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7980 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 7995 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 8007 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 8015 -1 2.460 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 8055 -1 2.530 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-a 8078 -1 9.000 0.000 6.000 10.000 0.000 -1 -1 -1 + airs_aqua 1 -1 1.200 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 6 -1 1.200 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 7 1 1.500 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 10 -1 1.400 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 11 -1 1.400 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 15 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 16 -1 1.400 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 17 -1 1.400 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 20 1 1.250 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 21 1 1.250 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 22 1 1.200 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 24 -1 1.200 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 27 1 1.200 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 28 1 1.200 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 30 -1 1.200 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 36 -1 1.200 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 39 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 40 1 1.150 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 42 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 51 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 52 1 1.150 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 54 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 55 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 56 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 59 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 62 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 63 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 68 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 69 1 1.125 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 71 -1 1.050 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 72 1 1.050 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 73 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 74 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 75 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 76 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 77 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 78 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 79 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 80 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 82 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 83 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 84 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 86 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 92 1 0.950 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 93 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 98 1 0.950 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 99 1 0.950 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 101 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 104 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 105 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 108 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 110 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 111 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 113 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 116 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 117 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 123 1 0.950 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 124 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 128 1 0.950 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 129 1 1.000 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 138 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 139 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 144 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 145 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 150 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 151 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 156 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 157 1 0.800 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 159 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 162 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 165 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 168 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 169 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 170 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 172 1 1.000 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 173 1 1.150 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 174 1 1.000 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 175 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 177 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 179 1 1.200 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 180 1 1.000 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 182 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 185 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 186 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 190 1 1.000 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 192 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 198 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 201 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 204 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 207 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 210 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 215 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 216 1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 221 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 226 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 227 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 232 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 252 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 253 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 256 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 257 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 261 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 262 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 267 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 272 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 295 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 299 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 300 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 305 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 310 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 321 -1 1.150 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 325 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 333 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 338 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 355 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 362 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 375 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 453 -1 0.950 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 475 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 484 -1 0.950 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 497 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 528 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 587 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 672 1 0.925 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 787 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 791 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 843 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 870 1 0.900 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 914 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 950 1 0.800 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 1003 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1012 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1019 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1024 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1030 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1038 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1048 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1069 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1079 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1082 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1083 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1088 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1090 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1092 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1095 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1104 -1 0.950 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1111 -1 0.950 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1115 -1 0.950 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1116 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1119 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1120 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1123 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1130 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1138 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1142 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1178 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1199 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1206 -1 0.900 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1221 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1237 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1252 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1260 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1263 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1266 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1285 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 1301 1 0.800 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 1304 1 0.700 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 1329 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 1371 1 1.100 0.000 3.500 10.000 0.000 1 -1 -1 + airs_aqua 1382 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + airs_aqua 1415 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1424 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1449 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1455 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1466 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1477 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1500 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1519 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1538 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1545 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1565 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1574 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1583 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1593 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1614 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1627 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1636 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1644 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1652 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1669 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1674 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1681 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1694 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1708 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1717 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1723 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1740 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1748 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1751 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1756 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1763 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1766 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1771 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1777 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1780 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1783 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1794 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1800 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1803 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1806 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1812 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1826 1 2.500 0.000 4.500 10.000 0.000 1 -1 -1 + airs_aqua 1843 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1852 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + airs_aqua 1865 1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1866 1 0.650 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1868 1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1869 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1872 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1873 1 0.525 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1876 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1881 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1882 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1883 -1 0.550 0.000 2.500 10.000 0.000 -1 -1 -1 + airs_aqua 1911 1 0.555 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1917 1 0.575 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1918 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1924 1 0.650 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1928 1 0.700 0.000 2.500 10.000 0.000 1 -1 -1 + airs_aqua 1937 -1 1.500 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 1941 -1 1.500 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2099 -1 3.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2100 -1 3.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2101 -1 2.500 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2103 -1 2.500 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2104 -1 2.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2106 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2107 -1 1.500 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2108 -1 1.500 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2109 -1 1.800 0.000 3.500 10.000 0.000 -1 -1 -1 + airs_aqua 2110 -1 0.600 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2111 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2112 -1 0.650 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2113 -1 0.675 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2114 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2115 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2116 -1 0.775 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2117 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2118 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2119 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2120 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2121 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2122 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2123 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2128 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2134 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2141 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2145 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2149 -1 0.700 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2153 -1 0.725 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2164 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2189 -1 0.775 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2197 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2209 -1 0.825 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2226 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2234 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2280 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2318 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2321 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2325 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2328 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2333 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2339 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2348 -1 0.850 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2353 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2355 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2357 -1 2.500 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2363 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2370 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2371 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + airs_aqua 2377 -1 0.750 0.000 3.000 10.000 0.000 -1 -1 -1 + amsua_aqua 1 -1 2.500 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_aqua 2 -1 2.000 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_aqua 3 -1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_aqua 4 -1 0.500 3.000 3.000 10.000 0.000 -2 -1 -1 + amsua_aqua 5 -1 0.400 0.550 2.000 10.000 0.000 -2 -1 -1 + amsua_aqua 6 -1 0.400 0.400 2.000 10.000 0.000 -2 -1 -1 + amsua_aqua 7 -1 0.500 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_aqua 8 1 0.300 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_aqua 9 1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_aqua 10 1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_aqua 11 1 0.450 0.450 3.000 10.000 0.000 -2 -1 -1 + amsua_aqua 12 1 1.000 1.000 3.500 10.000 0.000 -2 -1 -1 + amsua_aqua 13 1 1.500 1.500 4.500 10.000 0.000 -2 -1 -1 + amsua_aqua 14 -1 2.500 2.500 4.500 10.000 0.000 -2 -1 -1 + amsua_aqua 15 -1 2.500 18.000 4.500 10.000 0.000 -2 -1 -1 + avhrr3_n18 3 1 0.600 0.000 6.000 10.000 0.000 1 -1 -1 + avhrr3_n18 4 1 0.680 0.000 6.000 10.000 0.000 1 -1 -1 + avhrr3_n18 5 1 0.720 0.000 6.000 10.000 0.000 1 -1 -1 + avhrr3_metop-a 3 1 0.600 0.000 6.000 10.000 0.000 1 -1 -1 + avhrr3_metop-a 4 1 0.680 0.000 6.000 10.000 0.000 1 -1 -1 + avhrr3_metop-a 5 1 0.720 0.000 6.000 10.000 0.000 1 -1 -1 + avhrr3_n19 3 1 0.600 0.000 6.000 10.000 0.000 -1 -1 -1 + avhrr3_n19 4 1 0.680 0.000 6.000 10.000 0.000 -1 -1 -1 + avhrr3_n19 5 1 0.720 0.000 6.000 10.000 0.000 -1 -1 -1 + ssmi_f15 1 -1 1.600 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmi_f15 2 -1 2.260 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmi_f15 3 -1 2.010 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmi_f15 4 -1 1.480 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmi_f15 5 -1 2.280 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmi_f15 6 -1 1.430 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmi_f15 7 -1 2.330 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 1 -1 1.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 2 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 3 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 4 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 5 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 6 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 7 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 8 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 9 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 10 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 11 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 12 -1 2.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 13 -1 1.270 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 14 -1 1.440 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 15 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 16 -1 1.340 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 17 -1 1.740 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 18 -1 3.750 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 19 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 20 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 21 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 22 -1 6.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 23 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f16 24 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 1 -1 0.626 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 2 -1 0.869 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 3 -1 0.728 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 4 -1 0.950 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 5 -1 0.922 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 6 -1 1.196 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 7 -1 1.169 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 8 -1 1.840 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 9 -1 0.843 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 10 -1 1.600 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 11 -1 1.955 0.000 6.000 10.000 0.000 -2 -1 -1 + amsre_aqua 12 -1 4.337 0.000 6.000 10.000 0.000 -2 -1 -1 + imgr_g11 2 -1 2.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g11 3 -1 1.400 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g11 4 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g11 5 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g12 2 -1 2.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g12 3 -1 1.400 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g12 4 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g12 5 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g13 2 -1 2.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g13 3 -1 1.400 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g13 4 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g13 5 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + sndrD1_g11 1 1 0.850 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 2 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 3 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 4 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 5 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 6 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 7 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g11 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD1_g11 9 1 0.650 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g11 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g11 11 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g11 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD1_g11 13 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 14 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g11 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g11 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD1_g11 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g11 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g11 1 1 0.850 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 2 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 3 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 4 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 5 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 6 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 7 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g11 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD2_g11 9 1 0.650 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g11 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g11 11 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g11 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD2_g11 13 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 14 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g11 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g11 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD2_g11 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g11 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g11 1 1 0.850 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 2 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 3 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 4 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 5 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 6 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 7 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g11 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD3_g11 9 1 0.650 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g11 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g11 11 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g11 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD3_g11 13 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 14 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g11 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g11 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD3_g11 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g11 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g11 1 1 0.850 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 2 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 3 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 4 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 5 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 6 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 7 1 0.550 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g11 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD4_g11 9 1 0.650 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g11 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g11 11 1 1.400 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g11 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD4_g11 13 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 14 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g11 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g11 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD4_g11 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g11 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g12 1 1 0.950 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 2 1 0.820 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 3 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 5 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 6 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 7 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g12 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD1_g12 9 1 0.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g12 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g12 11 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g12 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD1_g12 13 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 14 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g12 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g12 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD1_g12 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g12 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g12 1 1 0.950 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 2 1 0.820 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 3 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 5 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 6 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 7 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g12 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD2_g12 9 1 0.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g12 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g12 11 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g12 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD2_g12 13 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 14 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g12 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g12 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD2_g12 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g12 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g12 1 1 0.950 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 2 1 0.820 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 3 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 5 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 6 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 7 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g12 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD3_g12 9 1 0.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g12 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g12 11 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g12 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD3_g12 13 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 14 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g12 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g12 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD3_g12 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g12 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g12 1 1 0.950 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 2 1 0.820 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 3 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 5 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 6 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 7 1 0.500 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g12 8 1 0.500 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD4_g12 9 1 0.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g12 10 1 0.950 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g12 11 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g12 12 1 1.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD4_g12 13 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 14 1 0.250 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g12 15 1 1.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g12 16 -1 0.800 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD4_g12 17 -1 1.300 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g12 18 -1 1.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g13 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 6 -1 0.990 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g13 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD1_g13 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g13 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g13 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g13 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD1_g13 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g13 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g13 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD1_g13 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g13 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g13 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 6 -1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g13 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD2_g13 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g13 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g13 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g13 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD2_g13 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g13 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g13 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD2_g13 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g13 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g13 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 6 -1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g13 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD3_g13 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g13 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g13 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g13 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD3_g13 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g13 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g13 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD3_g13 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g13 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g13 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 6 -1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g13 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD4_g13 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g13 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g13 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g13 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD4_g13 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g13 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g13 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD4_g13 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g13 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_n19 1 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_n19 2 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_n19 3 -1 0.530 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_n19 4 -1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_n19 5 -1 0.360 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_n19 6 -1 0.460 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_n19 7 -1 0.570 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_n19 8 -1 1.000 0.000 3.000 10.000 0.000 1 -1 -1 + hirs4_n19 9 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs4_n19 10 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_n19 11 -1 1.200 0.000 4.500 10.000 0.000 1 -1 -1 + hirs4_n19 12 -1 1.600 0.000 4.500 10.000 0.000 1 -1 -1 + hirs4_n19 13 -1 0.364 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_n19 14 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_n19 15 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_n19 16 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs4_n19 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_n19 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_n19 19 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + amsua_n19 1 1 2.500 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n19 2 1 2.200 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n19 3 1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n19 4 1 0.550 3.000 2.500 10.000 0.000 -2 -1 -1 + amsua_n19 5 1 0.300 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_n19 6 1 0.230 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_n19 7 -1 0.230 0.230 2.000 10.000 0.000 -2 -1 -1 + amsua_n19 8 -1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_n19 9 1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_n19 10 1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_n19 11 1 0.400 0.400 2.500 10.000 0.000 -2 -1 -1 + amsua_n19 12 1 0.550 0.550 3.500 10.000 0.000 -2 -1 -1 + amsua_n19 13 1 0.800 0.800 4.500 10.000 0.000 -2 -1 -1 + amsua_n19 14 1 3.000 3.000 4.500 10.000 0.000 -2 -1 -1 + amsua_n19 15 1 3.500 18.000 4.500 10.000 0.000 -2 -1 -1 + mhs_n19 1 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n19 2 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n19 3 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n19 4 1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_n19 5 1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 1 1 1.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 2 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 3 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 4 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 5 1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 6 1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 7 1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 8 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 9 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 10 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 11 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 12 -1 2.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 13 -1 1.270 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 14 -1 1.440 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 15 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 16 -1 1.340 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 17 -1 1.740 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 18 -1 3.750 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 19 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 20 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 21 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 22 -1 6.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 23 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f17 24 1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 1 -1 1.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 2 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 3 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 4 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 5 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 6 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 7 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 8 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 9 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 10 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 11 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 12 -1 2.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 13 -1 1.270 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 14 -1 1.440 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 15 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 16 -1 1.340 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 17 -1 1.740 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 18 -1 3.750 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 19 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 20 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 21 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 22 -1 6.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 23 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f18 24 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 1 -1 1.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 2 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 3 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 4 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 5 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 6 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 7 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 8 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 9 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 10 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 11 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 12 -1 2.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 13 -1 1.270 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 14 -1 1.440 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 15 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 16 -1 1.340 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 17 -1 1.740 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 18 -1 3.750 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 19 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 20 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 21 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 22 -1 6.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 23 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f19 24 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 1 -1 1.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 2 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 3 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 4 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 5 -1 0.500 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 6 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 7 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 8 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 9 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 10 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 11 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 12 -1 2.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 13 -1 1.270 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 14 -1 1.440 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 15 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 16 -1 1.340 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 17 -1 1.740 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 18 -1 3.750 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 19 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 20 -1 3.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 21 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 22 -1 6.400 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 23 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + ssmis_f20 24 -1 1.000 0.000 6.000 10.000 0.000 -2 -1 -1 + imgr_g14 2 -1 2.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g14 3 -1 1.400 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g14 4 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g14 5 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g15 2 -1 2.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g15 3 -1 1.400 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g15 4 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + imgr_g15 5 -1 3.000 0.000 4.500 10.000 0.000 -2 -1 -1 + sndrD1_g14 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 6 -1 0.990 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g14 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD1_g14 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g14 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g14 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g14 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD1_g14 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g14 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g14 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD1_g14 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g14 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g14 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 6 -1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g14 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD2_g14 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g14 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g14 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g14 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD2_g14 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g14 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g14 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD2_g14 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g14 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g14 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 6 -1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g14 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD3_g14 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g14 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g14 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g14 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD3_g14 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g14 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g14 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD3_g14 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g14 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g14 1 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 2 -1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 3 -1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 4 -1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 5 -1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 6 -1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 7 -1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g14 8 -1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD4_g14 9 -1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g14 10 -1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g14 11 -1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g14 12 -1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD4_g14 13 -1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 14 -1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g14 15 -1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g14 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD4_g14 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g14 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g15 1 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 2 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 3 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 5 1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 6 1 0.990 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 7 1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g15 8 1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD1_g15 9 1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g15 10 1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD1_g15 11 1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g15 12 1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD1_g15 13 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 14 1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD1_g15 15 1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD1_g15 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD1_g15 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD1_g15 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g15 1 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 2 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 3 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 5 1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 6 1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 7 1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g15 8 1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD2_g15 9 1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g15 10 1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD2_g15 11 1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g15 12 1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD2_g15 13 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 14 1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD2_g15 15 1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD2_g15 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD2_g15 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD2_g15 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g15 1 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 2 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 3 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 5 1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 6 1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 7 1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g15 8 1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD3_g15 9 1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g15 10 1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD3_g15 11 1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g15 12 1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD3_g15 13 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 14 1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD3_g15 15 1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD3_g15 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD3_g15 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD3_g15 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g15 1 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 2 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 3 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 4 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 5 1 0.910 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 6 1 0.980 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 7 1 1.080 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g15 8 1 2.000 0.000 3.000 10.000 0.000 1 -1 -1 + sndrD4_g15 9 1 2.600 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g15 10 1 1.800 0.000 2.500 10.000 0.000 1 -1 -1 + sndrD4_g15 11 1 2.300 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g15 12 1 2.800 0.000 4.500 10.000 0.000 1 -1 -1 + sndrD4_g15 13 1 0.900 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 14 1 0.800 0.000 2.000 10.000 0.000 1 -1 -1 + sndrD4_g15 15 1 2.000 0.000 3.500 10.000 0.000 1 -1 -1 + sndrD4_g15 16 -1 1.080 0.000 2.500 10.000 0.000 -1 -1 -1 + sndrD4_g15 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + sndrD4_g15 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + seviri_m08 4 -1 1.800 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 5 1 2.500 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 6 1 2.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 7 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 8 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 9 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 10 -1 1.450 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m08 11 -1 1.250 0.000 3.000 10.000 0.000 -2 -1 -1 + seviri_m09 4 -1 1.800 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 5 -1 2.500 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 6 -1 2.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 7 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 8 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 9 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 10 -1 1.450 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m09 11 -1 1.250 0.000 3.000 10.000 0.000 -2 -1 -1 + seviri_m10 4 -1 0.750 0.000 2.000 10.000 0.000 -1 -1 -1 + seviri_m10 5 -1 2.500 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m10 6 -1 2.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m10 7 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m10 8 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m10 9 -1 0.750 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m10 10 -1 0.800 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m10 11 -1 1.250 0.000 3.000 10.000 0.000 -2 -1 -1 + seviri_m11 4 -1 0.750 0.000 2.000 10.000 0.000 -1 -1 -1 + seviri_m11 5 1 2.500 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m11 6 1 2.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m11 7 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m11 8 -1 1.250 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m11 9 -1 0.750 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m11 10 -1 0.800 0.000 2.000 10.000 0.000 -2 -1 -1 + seviri_m11 11 -1 1.250 0.000 3.000 10.000 0.000 -2 -1 -1 + atms_npp 1 1 4.500 20.000 4.500 10.000 0.000 -2 -1 -1 + atms_npp 2 1 4.500 25.000 4.500 10.000 0.000 -2 -1 -1 + atms_npp 3 1 4.500 12.000 3.000 10.000 0.000 -2 -1 -1 + atms_npp 4 1 2.500 7.000 3.000 10.000 0.000 -2 -1 -1 + atms_npp 5 1 0.550 3.500 1.000 10.000 0.000 -2 -1 -1 + atms_npp 6 1 0.300 3.000 1.000 10.000 0.000 -2 -1 -1 + atms_npp 7 1 0.300 0.800 1.000 10.000 0.000 -2 -1 -1 + atms_npp 8 1 0.400 0.400 1.000 10.000 0.000 -2 -1 -1 + atms_npp 9 1 0.400 0.400 1.000 10.000 0.000 -2 -1 -1 + atms_npp 10 1 0.400 0.400 1.000 10.000 0.000 -2 -1 -1 + atms_npp 11 1 0.450 0.450 1.000 10.000 0.000 -2 -1 -1 + atms_npp 12 1 0.450 0.450 1.000 10.000 0.000 -2 -1 -1 + atms_npp 13 1 0.550 0.550 1.000 10.000 0.000 -2 -1 -1 + atms_npp 14 1 0.800 0.800 2.000 10.000 0.000 -2 -1 -1 + atms_npp 15 1 3.000 3.000 4.500 10.000 0.000 -2 -1 -1 + atms_npp 16 1 4.000 19.000 4.500 10.000 0.000 -2 -1 -1 + atms_npp 17 1 4.000 30.000 2.000 10.000 0.000 -2 -1 -1 + atms_npp 18 1 3.500 25.000 2.000 10.000 0.000 -2 -1 -1 + atms_npp 19 1 3.000 16.500 2.000 10.000 0.000 -2 -1 -1 + atms_npp 20 1 3.000 12.000 2.000 10.000 0.000 -2 -1 -1 + atms_npp 21 1 3.000 9.000 2.000 10.000 0.000 -2 -1 -1 + atms_npp 22 1 3.000 6.500 2.000 10.000 0.000 -2 -1 -1 + cris-fsr_npp 19 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 24 1 0.700 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 26 1 0.700 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 27 -1 0.700 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 28 1 0.700 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 31 -1 1.359 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 32 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 33 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 37 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 39 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 42 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 44 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 47 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 49 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 50 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 51 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 52 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 53 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 54 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 55 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 56 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 57 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 58 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 59 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 60 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 61 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 62 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 63 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 64 -1 0.756 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 65 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 66 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 67 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 68 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 69 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 70 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 71 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 72 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 73 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 74 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 75 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 76 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 77 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 78 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 79 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 80 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 81 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 82 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 83 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 84 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 85 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 86 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 87 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 88 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 89 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 90 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 91 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 92 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 93 1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 94 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 95 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 96 -1 0.635 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 97 1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 98 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 99 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 100 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 101 -1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 102 -1 0.735 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 103 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 104 -1 0.878 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 105 1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 106 -1 0.696 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 107 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 108 -1 2.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 109 1 0.400 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 110 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 111 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 112 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 113 1 0.400 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 114 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 115 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 116 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 117 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 118 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 119 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 120 -1 0.701 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 121 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 122 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 123 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 124 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 125 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 126 -1 0.663 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 127 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 128 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 129 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 130 -1 1.083 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 131 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 132 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 133 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 134 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 135 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 136 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 137 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 138 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 139 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 140 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 141 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 142 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 143 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 144 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 145 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 146 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 147 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 148 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 149 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 150 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 151 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 152 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 153 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 154 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 155 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 156 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 157 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 158 -1 0.773 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 159 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 160 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 161 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 162 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 163 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 164 -1 0.813 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 165 -1 0.907 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 166 -1 0.802 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 167 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 168 -1 1.493 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 169 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 170 -1 0.856 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 171 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 172 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 173 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 174 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 175 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 176 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 177 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 178 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 179 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 180 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 181 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 182 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 183 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 184 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 185 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 186 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 187 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 188 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 189 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 190 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 191 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 192 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 193 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 194 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 195 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 196 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 197 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 198 -1 2.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 199 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 200 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 208 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 211 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 216 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 224 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 234 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 236 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 238 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 239 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 242 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 246 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 248 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 255 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 264 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 266 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 268 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 275 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 279 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 283 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 285 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 291 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 295 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 301 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 305 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 311 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 332 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 342 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 389 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 400 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 402 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 404 -1 2.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 406 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 410 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 427 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 439 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 440 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 441 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 445 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 449 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 455 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 458 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 461 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 464 1 1.000 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 467 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 470 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 473 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 475 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 482 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 486 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 487 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 490 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 493 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 496 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 499 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 501 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 503 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 505 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 511 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 513 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 514 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 518 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 519 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 520 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 522 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 529 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 534 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 563 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 568 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 575 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 592 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 594 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 596 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 598 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 600 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 602 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 604 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 611 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 614 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 616 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 618 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 620 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 622 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 626 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 631 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 638 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 646 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 648 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 652 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 659 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 673 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 675 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 678 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 684 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 688 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 694 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 700 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 707 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 710 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 713 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_npp 714 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 718 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 720 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 722 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 725 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 728 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 735 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 742 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 748 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 753 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 762 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 780 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 784 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 798 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 849 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 860 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 862 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 866 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 874 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 882 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 890 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 898 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 906 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 907 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 908 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 914 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 937 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 972 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 973 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 978 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 980 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 981 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 988 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 995 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 998 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1000 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1003 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1008 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1009 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1010 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1014 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1017 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1018 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1020 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1022 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1024 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1026 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1029 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1030 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1032 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1034 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1037 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1038 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1041 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1042 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1044 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1046 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1049 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1050 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1053 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1054 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1058 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1060 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1062 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1064 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1066 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1069 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1076 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1077 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1080 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1086 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1091 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1095 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1101 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1109 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1112 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1121 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1128 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1133 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1163 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1172 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1187 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1189 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1205 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1211 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1219 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1231 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1245 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1271 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1289 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1300 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1313 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1316 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1325 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1329 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1346 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1347 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1473 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1474 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1491 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1499 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1553 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1570 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1596 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1602 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1619 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1624 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1635 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1939 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1940 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1941 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1942 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1943 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1944 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1945 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1946 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1947 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1948 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1949 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1950 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1951 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1952 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1953 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1954 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1955 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1956 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1957 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1958 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1959 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1960 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1961 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1962 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1963 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1964 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1965 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1966 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1967 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1968 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1969 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1970 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1971 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1972 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1973 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1974 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1975 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1976 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1977 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1978 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1979 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1980 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1981 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1982 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1983 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1984 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1985 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1986 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 1987 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2119 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2140 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2143 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2147 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2153 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2158 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2161 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2168 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2171 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2175 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_npp 2182 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 19 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 24 1 0.700 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 26 1 0.700 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 27 -1 0.700 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 28 1 0.700 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 31 -1 1.359 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 32 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 33 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 37 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 39 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 42 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 44 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 47 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 49 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 50 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 51 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 52 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 53 1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 54 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 55 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 56 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 57 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 58 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 59 1 0.600 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 60 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 61 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 62 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 63 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 64 -1 0.756 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 65 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 66 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 67 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 68 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 69 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 70 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 71 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 72 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 73 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 74 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 75 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 76 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 77 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 78 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 79 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 80 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 81 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 82 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 83 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 84 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 85 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 86 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 87 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 88 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 89 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 90 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 91 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 92 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 93 1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 94 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 95 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 96 -1 0.635 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 97 1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 98 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 99 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 100 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 101 -1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 102 -1 0.735 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 103 1 0.450 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 104 -1 0.878 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 105 1 0.450 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 106 -1 0.696 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 107 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 108 -1 2.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 109 1 0.400 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 110 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 111 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 112 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 113 1 0.400 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 114 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 115 1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 116 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 117 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 118 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 119 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 120 -1 0.701 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 121 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 122 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 123 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 124 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 125 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 126 -1 0.663 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 127 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 128 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 129 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 130 -1 1.083 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 131 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 132 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 133 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 134 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 135 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 136 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 137 1 0.350 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 138 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 139 1 0.350 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 140 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 141 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 142 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 143 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 144 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 145 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 146 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 147 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 148 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 149 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 150 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 151 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 152 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 153 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 154 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 155 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 156 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 157 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 158 -1 0.773 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 159 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 160 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 161 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 162 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 163 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 164 -1 0.813 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 165 -1 0.907 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 166 -1 0.802 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 167 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 168 -1 1.493 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 169 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 170 -1 0.856 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 171 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 172 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 173 -1 0.600 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 174 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 175 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 176 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 177 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 178 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 179 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 180 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 181 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 182 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 183 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 184 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 185 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 186 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 187 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 188 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 189 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 190 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 191 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 192 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 193 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 194 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 195 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 196 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 197 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 198 -1 2.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 199 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 200 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 208 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 211 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 216 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 224 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 234 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 236 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 238 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 239 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 242 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 246 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 248 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 255 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 264 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 266 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 268 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 275 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 279 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 283 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 285 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 291 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 295 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 301 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 305 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 311 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 332 1 0.300 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 342 1 0.300 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 389 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 400 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 402 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 404 -1 2.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 406 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 410 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 427 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 439 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 440 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 441 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 445 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 449 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 455 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 458 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 461 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 464 1 1.000 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 467 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 470 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 473 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 475 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 482 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 486 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 487 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 490 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 493 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 496 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 499 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 501 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 503 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 505 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 511 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 513 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 514 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 518 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 519 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 520 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 522 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 529 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 534 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 563 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 568 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 575 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 592 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 594 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 596 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 598 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 600 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 602 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 604 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 611 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 614 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 616 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 618 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 620 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 622 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 626 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 631 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 638 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 646 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 648 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 652 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 659 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 673 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 675 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 678 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 684 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 688 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 694 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 700 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 707 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 710 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 713 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + cris-fsr_n20 714 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 718 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 720 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 722 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 725 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 728 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 735 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 742 1 0.500 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 748 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 753 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 762 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 780 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 784 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 798 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 849 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 860 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 862 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 866 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 874 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 882 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 890 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 898 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 906 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 907 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 908 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 914 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 937 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 972 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 973 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 978 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 980 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 981 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 988 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 995 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 998 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1000 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1003 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1008 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1009 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1010 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1014 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1017 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1018 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1020 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1022 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1024 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1026 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1029 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1030 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1032 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1034 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1037 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1038 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1041 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1042 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1044 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1046 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1049 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1050 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1053 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1054 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1058 1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1060 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1062 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1064 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1066 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1069 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1076 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1077 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1080 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1086 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1091 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1095 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1101 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1109 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1112 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1121 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1128 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1133 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1163 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1172 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1187 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1189 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1205 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1211 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1219 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1231 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1245 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1271 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1289 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1300 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1313 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1316 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1325 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1329 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1346 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1347 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1473 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1474 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1491 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1499 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1553 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1570 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1596 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1602 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1619 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1624 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1635 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1939 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1940 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1941 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1942 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1943 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1944 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1945 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1946 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1947 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1948 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1949 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1950 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1951 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1952 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1953 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1954 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1955 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1956 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1957 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1958 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1959 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1960 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1961 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1962 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1963 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1964 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1965 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1966 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1967 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1968 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1969 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1970 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1971 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1972 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1973 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1974 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1975 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1976 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1977 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1978 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1979 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1980 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1981 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1982 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1983 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1984 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1985 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1986 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 1987 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2119 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2140 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2143 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2147 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2153 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2158 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2161 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2168 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2171 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2175 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + cris-fsr_n20 2182 -1 1.000 0.000 2.000 10.000 0.000 -1 -1 -1 + hirs4_metop-b 1 -1 2.500 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_metop-b 2 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-b 3 -1 0.530 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-b 4 -1 0.400 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 5 -1 0.360 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 6 -1 0.460 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 7 -1 0.570 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-b 8 -1 1.000 0.000 3.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 9 -1 1.100 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs4_metop-b 10 -1 0.600 0.000 2.500 10.000 0.000 1 -1 -1 + hirs4_metop-b 11 -1 1.200 0.000 4.500 10.000 0.000 1 -1 -1 + hirs4_metop-b 12 -1 1.600 0.000 4.500 10.000 0.000 1 -1 -1 + hirs4_metop-b 13 -1 0.364 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 14 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 15 -1 0.260 0.000 2.000 10.000 0.000 1 -1 -1 + hirs4_metop-b 16 -1 1.000 0.000 3.500 10.000 0.000 -1 -1 -1 + hirs4_metop-b 17 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_metop-b 18 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + hirs4_metop-b 19 -1 2.000 0.000 4.500 10.000 0.000 -1 -1 -1 + amsua_metop-b 1 -1 2.500 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 2 -1 2.200 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 3 -1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 4 -1 0.550 3.000 2.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 5 -1 0.300 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-b 6 -1 0.230 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-b 7 -1 0.230 0.230 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-b 8 1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-b 9 1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-b 10 1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-b 11 1 0.400 0.400 2.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 12 1 0.550 0.550 3.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 13 1 0.800 0.800 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 14 -1 3.000 3.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-b 15 -1 3.500 18.000 4.500 10.000 0.000 -2 -1 -1 + mhs_metop-b 1 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-b 2 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-b 3 1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-b 4 1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-b 5 1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + iasi_metop-b 16 1 1.380 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 29 -1 0.810 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 32 -1 0.750 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 35 -1 0.790 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 38 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 41 -1 0.740 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 44 -1 0.680 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 47 -1 0.720 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 49 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 50 -1 0.650 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 51 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 53 -1 0.690 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 55 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 56 -1 0.640 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 57 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 59 1 0.670 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 61 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 62 -1 0.610 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 63 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 66 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 68 -1 0.590 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 70 1 0.760 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 72 1 1.220 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 74 1 0.780 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 76 -1 0.640 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 78 -1 0.620 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 79 1 0.610 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 81 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 82 -1 0.650 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 83 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 84 -1 0.610 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 85 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 86 -1 0.680 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 87 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 89 -1 0.680 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 92 -1 4.380 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 93 -1 3.050 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 95 -1 2.310 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 97 -1 1.560 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 99 -1 1.330 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 101 -1 1.580 0.000 3.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 103 -1 0.930 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 104 1 1.670 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 106 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 109 1 0.570 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 110 -1 0.580 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 111 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 113 1 0.680 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 116 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 119 1 0.680 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 122 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 125 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 128 1 0.580 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 131 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 133 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 135 1 0.580 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 138 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 141 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 144 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 146 1 0.500 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 148 1 0.820 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 150 -1 0.590 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 151 1 0.620 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 154 1 0.510 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 157 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 159 1 0.520 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 160 -1 0.510 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 161 1 0.510 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 163 1 0.760 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 167 1 0.520 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 170 1 0.570 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 173 1 0.550 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 176 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 179 -1 0.580 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 180 1 0.650 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 185 1 0.610 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 187 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 191 -1 0.640 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 193 1 0.760 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 197 -1 0.720 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 199 1 1.050 0.000 3.500 10.000 0.000 1 -1 -1 + iasi_metop-b 200 -1 0.750 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 202 -1 0.510 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 203 -1 0.650 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 205 1 1.300 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 207 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 210 1 0.930 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 212 1 1.490 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 213 -1 1.120 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 214 1 0.680 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 217 1 0.660 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 218 -1 0.670 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 219 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 222 1 0.590 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 224 1 0.690 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 225 -1 0.670 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 226 1 0.640 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 228 -1 0.620 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 230 1 0.720 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 231 -1 0.690 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 232 1 0.660 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 236 1 0.790 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 237 -1 0.780 0.000 2.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 239 1 0.740 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 243 1 0.880 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 246 1 0.770 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 249 1 0.880 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 252 1 0.860 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 254 1 1.000 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 259 -1 0.870 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 260 1 0.850 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 262 1 0.880 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 265 1 0.840 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 267 1 0.840 0.000 3.500 10.000 0.000 1 -1 -1 + iasi_metop-b 269 -1 0.840 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 275 1 0.800 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 279 -1 0.800 0.000 3.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 282 1 0.870 0.000 3.500 10.000 0.000 1 -1 -1 + iasi_metop-b 285 -1 0.980 0.000 3.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 294 1 0.520 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 296 1 0.650 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 299 1 0.690 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 300 -1 0.610 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 303 1 0.600 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 306 1 0.670 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 309 -1 0.790 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 313 -1 0.620 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 320 -1 0.660 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 323 1 0.700 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-b 326 -1 0.650 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 327 1 0.620 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 329 1 0.610 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-b 332 -1 0.620 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 335 1 0.530 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 345 1 0.600 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-b 347 1 0.680 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 350 1 0.950 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 354 1 0.630 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 356 1 0.970 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 360 1 0.650 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 363 -1 0.980 0.000 3.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 366 1 0.580 0.000 2.000 10.000 0.000 1 -1 -1 + iasi_metop-b 371 1 0.730 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 372 -1 0.650 0.000 2.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 373 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 375 1 0.990 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 377 1 0.760 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 379 1 0.850 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 381 1 0.970 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 383 1 0.770 0.000 3.000 10.000 0.000 1 -1 -1 + iasi_metop-b 386 1 0.620 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 389 1 0.630 0.000 2.500 10.000 0.000 1 -1 -1 + iasi_metop-b 398 1 1.210 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 401 1 1.410 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-b 404 1 1.550 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-b 405 -1 1.780 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 407 1 1.350 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 408 -1 1.140 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 410 1 1.690 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-b 411 -1 1.790 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 414 1 1.460 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-b 416 1 1.630 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-b 418 -1 1.940 0.000 5.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 423 -1 2.010 0.000 5.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 426 1 1.240 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 428 1 1.760 0.000 5.000 10.000 0.000 1 -1 -1 + iasi_metop-b 432 1 1.260 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 433 -1 1.470 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 434 1 1.900 0.000 5.500 10.000 0.000 1 -1 -1 + iasi_metop-b 439 1 1.660 0.000 5.500 10.000 0.000 1 -1 -1 + iasi_metop-b 442 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 445 1 1.490 0.000 4.500 10.000 0.000 1 -1 -1 + iasi_metop-b 450 -1 1.520 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 457 1 1.550 0.000 4.000 10.000 0.000 1 -1 -1 + iasi_metop-b 459 -1 1.960 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 472 -1 2.310 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 477 -1 2.330 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 483 -1 2.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 509 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 515 1 2.330 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 546 1 2.230 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 552 1 2.330 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 559 1 1.840 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 566 1 2.290 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 571 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 573 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 578 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 584 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 594 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 625 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 646 1 2.270 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 662 1 2.240 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 668 1 2.230 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 705 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 739 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 756 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 797 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 867 1 2.300 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 906 1 2.150 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 921 1 2.310 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1027 1 2.370 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1046 1 2.270 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1090 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1098 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1121 1 2.230 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1133 1 2.280 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1173 -1 2.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1191 1 2.320 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1194 1 2.310 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1222 -1 2.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1271 1 2.320 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1283 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1338 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1409 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1414 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1420 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1424 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1427 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1430 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1434 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1440 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1442 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1445 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1450 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1454 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1460 -1 2.170 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1463 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1469 -1 2.170 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1474 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1479 1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1483 -1 2.160 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1487 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1494 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1496 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1502 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1505 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1509 1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1510 -1 2.110 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1513 1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1518 -1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1521 1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1526 -1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1529 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1532 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1536 1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1537 -1 2.010 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1541 -1 2.050 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1545 -1 2.030 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1548 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1553 -1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1560 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1568 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1574 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1579 1 1.700 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1583 -1 1.760 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1585 1 1.770 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1587 1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1606 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1626 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1639 1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1643 1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1652 1 2.070 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1658 1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1659 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1666 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1671 1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1675 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1681 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1694 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1697 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1710 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1786 1 1.980 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1791 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1805 1 2.180 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1839 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1884 1 2.210 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 1913 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1946 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1947 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 1991 1 2.250 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2019 1 1.800 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2094 1 2.240 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2119 1 1.730 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2213 1 1.730 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2239 1 2.270 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2271 1 1.670 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2289 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2321 1 1.720 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2333 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2346 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2349 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2352 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2359 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2367 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2374 -1 2.170 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2398 1 1.740 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2426 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2562 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2701 1 1.670 0.000 6.000 10.000 0.000 1 -1 -1 + iasi_metop-b 2741 -1 1.730 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2745 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2760 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2819 -1 1.730 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2889 1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2907 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2910 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2919 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2921 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2939 -1 1.710 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2944 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2945 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2948 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2951 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2958 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2971 -1 1.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2977 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2985 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2988 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2990 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2991 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 2993 1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3002 1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3008 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3014 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3027 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3029 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3030 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3036 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3047 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3049 1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3052 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3053 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3055 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3058 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3064 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3069 -1 1.770 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3087 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3093 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3098 -1 1.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3105 1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3107 -1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3110 1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3116 -1 1.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3127 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3129 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3136 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3146 -1 1.970 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3151 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3160 -1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3165 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3168 -1 1.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3175 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3178 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3189 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3207 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3228 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3244 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3248 -1 1.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3252 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3256 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3263 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3281 -1 1.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3295 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3303 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3309 -1 1.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3312 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3322 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3326 -1 1.360 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3354 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3366 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3375 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3378 -1 1.680 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3411 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3416 -1 1.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3432 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3438 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3440 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3442 -1 1.410 0.000 5.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 3444 -1 1.160 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 3446 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3448 -1 1.250 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3450 -1 1.200 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3452 -1 1.650 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3454 -1 1.660 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3458 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3467 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3476 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3484 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3491 -1 1.250 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3497 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3499 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3504 -1 1.700 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3506 -1 0.990 0.000 4.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3509 -1 1.810 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3518 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3527 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3555 -1 1.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3575 -1 1.470 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 3577 -1 1.150 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3580 -1 1.580 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3582 -1 1.180 0.000 4.500 10.000 0.000 -1 -1 -1 + iasi_metop-b 3586 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3589 -1 1.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3599 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3610 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3626 -1 1.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3638 -1 1.270 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3646 -1 1.910 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3653 -1 1.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3658 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3661 -1 1.290 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3673 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3689 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3700 -1 1.230 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3710 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3726 -1 1.210 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3763 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3814 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3841 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 3888 -1 1.330 0.000 5.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4032 -1 1.750 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4059 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4068 -1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4082 -1 2.030 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4095 -1 1.830 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4160 -1 1.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4234 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4257 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4411 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4498 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4520 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4552 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4567 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4608 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4646 -1 1.950 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4698 -1 1.990 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4808 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4849 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4920 -1 1.960 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4939 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4947 -1 1.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4967 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4991 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 4996 -1 1.840 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5015 -1 1.870 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5028 -1 1.770 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5056 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5128 -1 1.890 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5130 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5144 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5170 -1 1.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5178 -1 1.790 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5183 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5188 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5191 -1 2.330 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5368 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5371 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5379 -1 1.810 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5381 1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5383 -1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5397 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5399 1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5401 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5403 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5405 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5446 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5455 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5472 -1 2.160 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5480 1 1.980 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5483 -1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5485 -1 1.800 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5492 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5497 -1 1.750 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5502 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5507 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5509 -1 2.140 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5517 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5528 -1 1.860 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5558 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5697 -1 2.110 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5714 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5749 -1 2.030 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5766 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5785 -1 2.190 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5798 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5799 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5801 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5817 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5833 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5834 -1 2.330 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5836 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5849 -1 2.210 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5851 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5852 -1 2.230 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5865 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5869 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5881 -1 1.880 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5884 -1 2.260 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5897 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5900 -1 2.360 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5916 -1 2.290 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5932 -1 2.350 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5948 -1 2.300 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5963 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5968 -1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5978 -1 2.050 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5988 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5992 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5994 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 5997 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6003 -1 1.970 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6008 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6023 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6026 -1 2.250 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6039 -1 2.310 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6053 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6056 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6067 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6071 -1 2.240 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6082 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6085 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6098 -1 2.410 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6112 -1 2.340 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6126 -1 9.320 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6135 -1 2.280 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6140 -1 2.380 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6149 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6154 -1 2.270 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6158 -1 2.390 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6161 -1 2.110 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6168 -1 2.090 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6174 -1 2.100 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6182 -1 2.060 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6187 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6205 -1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6209 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6213 -1 1.930 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6317 -1 2.020 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6339 -1 2.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6342 -1 1.540 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6366 -1 1.640 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6381 -1 1.510 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6391 -1 1.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6489 -1 2.820 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6962 -1 2.920 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6966 -1 2.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6970 -1 2.370 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6975 -1 1.850 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6977 -1 1.600 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6982 -1 1.720 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6985 -1 1.740 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6987 -1 1.790 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6989 -1 1.900 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6991 -1 1.940 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6993 -1 2.000 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6995 -1 2.040 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6997 -1 2.080 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 6999 -1 2.120 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7000 -1 2.130 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7004 -1 2.160 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7008 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7013 -1 2.180 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7016 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7021 -1 2.200 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7024 -1 2.410 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7027 -1 2.390 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7029 -1 2.380 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7032 -1 2.400 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7038 -1 2.420 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7043 -1 2.410 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7046 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7049 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7069 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7072 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7076 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7081 -1 2.400 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7084 -1 2.440 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7089 -1 2.400 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7099 -1 2.420 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7209 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7222 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7231 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7235 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7247 -1 2.460 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7267 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7269 -1 2.450 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7284 -1 2.430 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7389 -1 2.510 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7419 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7423 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7424 -1 2.530 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7426 -1 2.460 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7428 -1 2.490 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7431 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7436 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7444 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7475 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7549 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7584 -1 2.540 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7665 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7666 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7831 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7836 -1 2.550 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7853 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7865 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7885 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7888 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7912 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7950 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7972 -1 2.480 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7980 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 7995 -1 2.500 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 8007 -1 2.520 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 8015 -1 2.460 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 8055 -1 2.530 0.000 6.000 10.000 0.000 -1 -1 -1 + iasi_metop-b 8078 -1 9.000 0.000 6.000 10.000 0.000 -1 -1 -1 + avhrr3_metop-b 3 1 0.450 0.000 6.000 10.000 0.000 -1 -1 -1 + avhrr3_metop-b 4 1 0.550 0.000 6.000 10.000 0.000 -1 -1 -1 + avhrr3_metop-b 5 1 0.600 0.000 6.000 10.000 0.000 -1 -1 -1 + amsr2_gcom-w1 1 -1 1.100 6.300 2.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 2 -1 1.000 9.600 2.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 3 -1 1.100 6.400 2.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 4 -1 1.000 9.700 2.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 5 -1 1.250 6.200 3.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 6 -1 1.250 10.200 3.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 7 -1 1.500 6.700 3.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 8 -1 2.000 12.400 4.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 9 -1 2.000 6.200 5.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 10 -1 2.500 11.600 5.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 11 -1 1.750 7.700 5.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 12 -1 2.250 16.200 5.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 13 -1 2.100 6.900 5.000 10.000 0.000 -2 -1 -1 + amsr2_gcom-w1 14 -1 2.750 14.100 5.000 10.000 0.000 -2 -1 -1 + gmi_gpm 1 -1 0.950 5.900 3.000 10.000 0.000 -2 -1 -1 + gmi_gpm 2 -1 1.040 9.400 3.000 10.000 0.000 -2 -1 -1 + gmi_gpm 3 -1 1.150 6.800 3.000 10.000 0.000 -2 -1 -1 + gmi_gpm 4 -1 1.790 11.900 5.000 10.000 0.000 -2 -1 -1 + gmi_gpm 5 -1 1.620 6.200 5.000 10.000 0.000 -2 -1 -1 + gmi_gpm 6 -1 1.105 7.500 3.000 10.000 0.000 -2 -1 -1 + gmi_gpm 7 -1 1.985 14.800 5.000 10.000 0.000 -2 -1 -1 + gmi_gpm 8 -1 1.580 6.900 3.000 10.000 0.000 -2 -1 -1 + gmi_gpm 9 -1 4.000 13.700 6.000 10.000 0.000 -2 -1 -1 + gmi_gpm 10 -1 1.255 8.600 2.500 10.000 0.000 -2 -1 -1 + gmi_gpm 11 -1 1.870 10.400 2.500 10.000 0.000 -2 -1 -1 + gmi_gpm 12 -1 1.345 5.400 3.000 10.000 0.000 -2 -1 -1 + gmi_gpm 13 -1 1.230 6.900 3.000 10.000 0.000 -2 -1 -1 + saphir_meghat 1 1 1.750 6.000 3.000 10.000 0.000 -2 -1 -1 + saphir_meghat 2 1 1.410 6.000 3.000 10.000 0.000 -2 -1 -1 + saphir_meghat 3 1 1.240 6.000 3.000 10.000 0.000 -2 -1 -1 + saphir_meghat 4 1 1.130 6.000 3.000 10.000 0.000 -2 -1 -1 + saphir_meghat 5 1 1.070 6.000 3.000 10.000 0.000 -2 -1 -1 + saphir_meghat 6 1 1.010 6.000 3.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 7 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 8 1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 9 1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 10 1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 11 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 12 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 13 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 14 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 15 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + ahi_himawari8 16 -1 2.200 0.000 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 1 -1 2.500 20.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 2 -1 2.200 18.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 3 -1 2.000 12.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 4 -1 0.550 3.000 2.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 5 -1 0.300 0.500 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 6 -1 0.230 0.300 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 7 -1 0.230 0.230 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 8 -1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 9 -1 0.250 0.250 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 10 -1 0.350 0.350 2.000 10.000 0.000 -2 -1 -1 + amsua_metop-c 11 -1 0.400 0.400 2.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 12 -1 0.550 0.550 3.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 13 -1 0.800 0.800 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 14 -1 3.000 3.000 4.500 10.000 0.000 -2 -1 -1 + amsua_metop-c 15 -1 3.500 18.000 4.500 10.000 0.000 -2 -1 -1 + mhs_metop-c 1 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-c 2 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-c 3 -1 2.500 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-c 4 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 + mhs_metop-c 5 -1 2.000 0.000 6.000 10.000 0.000 -2 -1 -1 diff --git a/parm/analysis/gsi/nam_glb_berror.f77.gcv b/parm/analysis/gsi/nam_glb_berror.f77.gcv new file mode 100644 index 000000000..c5790f38a Binary files /dev/null and b/parm/analysis/gsi/nam_glb_berror.f77.gcv differ diff --git a/parm/analysis/gsi/nam_global_pcpinfo.txt b/parm/analysis/gsi/nam_global_pcpinfo.txt new file mode 100644 index 000000000..644c7f125 --- /dev/null +++ b/parm/analysis/gsi/nam_global_pcpinfo.txt @@ -0,0 +1,4 @@ +!satid use bias oberr gross b_pcp pg_pcp +! (mm/h) error variational qc + pcp_ssmi -1 0 0.500 3.000 10.000 0.000 !fnoc obs, 1 deg superob + pcp_tmi 1 0 0.500 3.000 10.000 0.000 !tmi obs, 1 deg superob diff --git a/parm/analysis/gsi/nam_global_satangbias.txt b/parm/analysis/gsi/nam_global_satangbias.txt new file mode 100644 index 000000000..82baa0ac2 --- /dev/null +++ b/parm/analysis/gsi/nam_global_satangbias.txt @@ -0,0 +1,29480 @@ + 1 amsua_n15 1 0.528768E-02 + 0.063 -0.200 -0.411 -0.588 -0.638 -0.523 -0.493 -0.466 -0.482 -0.475 + -0.666 -0.587 -0.593 -0.602 -0.766 -0.955 -1.080 -1.218 -1.149 -1.374 + -1.553 -1.635 -1.715 -1.783 -1.689 -1.507 -1.473 -1.244 -1.233 -1.259 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2 amsua_n15 2 0.290661E-02 + -2.769 -2.880 -2.583 -2.449 -2.218 -1.810 -1.536 -1.242 -0.882 -0.788 + -0.676 -0.697 -0.508 -0.464 -0.544 -0.790 -0.945 -1.108 -1.002 -1.364 + -1.404 -1.315 -1.318 -1.151 -0.826 -0.219 0.086 0.631 1.121 1.807 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 3 amsua_n15 3 0.174554E-01 + 1.349 1.645 1.828 1.952 2.091 2.273 2.465 2.596 2.755 2.961 + 3.122 3.378 3.484 3.576 3.703 3.727 3.713 3.604 3.477 3.312 + 3.071 2.867 2.599 2.417 2.166 1.886 1.582 1.272 1.007 0.461 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 4 amsua_n15 4 0.390677E-01 + -0.359 -0.411 -0.393 -0.371 -0.206 -0.093 0.019 0.136 0.263 0.422 + 0.475 0.567 0.656 0.700 0.728 0.747 0.728 0.659 0.557 0.453 + 0.319 0.201 0.064 -0.086 -0.263 -0.414 -0.690 -0.935 -1.188 -1.346 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 5 amsua_n15 5 0.496683E-01 + 0.337 0.153 -0.019 -0.113 -0.107 -0.107 -0.067 -0.013 0.071 0.141 + 0.197 0.235 0.255 0.284 0.268 0.266 0.289 0.282 0.269 0.204 + 0.148 0.065 -0.001 -0.075 -0.165 -0.328 -0.484 -0.508 -0.627 -0.544 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 6 amsua_n15 6 0.501461E-01 + 0.044 -0.281 -0.420 -0.607 -0.732 -0.829 -0.863 -0.902 -0.938 -0.968 + -1.004 -1.044 -1.077 -1.109 -1.133 -1.203 -1.219 -1.232 -1.234 -1.252 + -1.227 -1.253 -1.244 -1.265 -1.234 -1.237 -1.337 -1.360 -1.397 -1.318 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 7 amsua_n15 7 0.391649E-01 + 0.977 0.787 0.661 0.514 0.342 0.233 0.153 0.049 0.004 -0.106 + -0.199 -0.255 -0.290 -0.375 -0.371 -0.413 -0.440 -0.453 -0.408 -0.358 + -0.279 -0.162 -0.090 -0.037 0.004 0.088 0.021 -0.049 -0.019 0.048 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 8 amsua_n15 8 0.257209E-01 + 0.461 0.275 0.120 0.033 0.069 0.026 -0.019 -0.048 -0.062 -0.068 + -0.094 -0.097 -0.082 -0.090 -0.083 -0.044 -0.038 -0.046 -0.068 -0.057 + -0.045 -0.082 -0.084 -0.104 -0.148 -0.183 -0.260 -0.224 -0.181 -0.087 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 9 amsua_n15 9 -0.129654E-01 + 0.280 0.282 0.235 0.040 0.012 0.072 0.079 0.208 0.047 0.185 + 0.028 -0.039 0.163 0.037 -0.085 0.012 -0.051 -0.052 -0.237 -0.030 + -0.095 -0.178 -0.289 -0.244 -0.275 -0.275 -0.325 -0.441 -0.422 -0.343 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 10 amsua_n15 10 -0.301720E-01 + 0.526 0.457 0.382 0.302 0.235 0.199 0.163 0.145 0.139 0.128 + 0.118 0.113 0.108 0.111 0.099 0.047 0.024 -0.010 -0.053 -0.087 + -0.108 -0.119 -0.140 -0.140 -0.143 -0.158 -0.230 -0.263 -0.262 -0.219 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 11 amsua_n15 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 12 amsua_n15 12 -0.667220E-01 + -0.324 -0.238 -0.220 -0.258 -0.261 -0.238 -0.260 -0.250 -0.232 -0.189 + -0.184 -0.164 -0.130 -0.124 -0.138 -0.183 -0.205 -0.254 -0.321 -0.375 + -0.432 -0.487 -0.540 -0.556 -0.595 -0.635 -0.762 -0.874 -0.968 -1.044 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 13 amsua_n15 13 -0.913346E-01 + -1.940 -1.817 -1.751 -1.734 -1.727 -1.684 -1.662 -1.629 -1.606 -1.529 + -1.499 -1.458 -1.412 -1.401 -1.412 -1.465 -1.492 -1.535 -1.622 -1.700 + -1.752 -1.841 -1.932 -1.971 -2.018 -2.090 -2.248 -2.387 -2.520 -2.650 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 14 amsua_n15 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 15 amsua_n15 15 0.888067E-02 + 1.950 1.820 1.621 1.723 1.848 2.086 2.276 2.550 2.755 3.010 + 3.072 3.282 3.343 3.415 3.543 3.539 3.482 3.446 3.402 3.275 + 3.167 3.023 2.905 2.727 2.606 2.472 2.335 2.283 2.559 2.908 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 16 hirs3_n17 1 -0.417544E-01 + -4.579 -6.336 -6.119 -4.481 -3.784 -3.164 -3.135 -2.775 -3.026 -3.016 + -3.186 -2.998 -3.176 -2.999 -2.993 -2.779 -3.195 -2.886 -3.268 -3.006 + -3.535 -3.412 -3.435 -3.071 -3.191 -3.039 -3.394 -3.195 -3.535 -3.221 + -3.276 -2.885 -3.396 -3.037 -3.458 -3.275 -3.749 -3.508 -3.618 -3.272 + -3.688 -3.274 -3.865 -3.718 -3.885 -3.453 -3.607 -3.203 -3.534 -3.137 + -3.559 -3.384 -3.804 -3.684 -3.817 -3.553 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 17 hirs3_n17 2 -0.322123E-01 + -2.229 -2.455 -2.419 -2.164 -2.060 -1.994 -2.049 -1.942 -2.004 -1.919 + -2.026 -2.010 -2.043 -1.992 -2.092 -2.007 -2.060 -1.990 -2.080 -2.007 + -2.037 -2.011 -2.124 -2.052 -2.125 -1.996 -2.068 -2.085 -2.099 -2.099 + -2.132 -2.071 -2.078 -2.036 -2.106 -2.015 -2.057 -2.067 -2.102 -2.016 + -2.041 -1.956 -2.077 -2.024 -2.040 -2.026 -2.085 -2.057 -2.077 -2.001 + -2.094 -2.022 -2.083 -2.135 -2.249 -2.320 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 18 hirs3_n17 3 -0.106348E-01 + -1.546 -1.623 -1.563 -1.412 -1.372 -1.291 -1.335 -1.271 -1.322 -1.248 + -1.314 -1.269 -1.315 -1.236 -1.286 -1.221 -1.289 -1.252 -1.251 -1.253 + -1.259 -1.230 -1.304 -1.221 -1.287 -1.196 -1.236 -1.243 -1.261 -1.235 + -1.211 -1.202 -1.200 -1.210 -1.212 -1.169 -1.186 -1.213 -1.194 -1.175 + -1.170 -1.154 -1.220 -1.172 -1.175 -1.191 -1.192 -1.183 -1.200 -1.174 + -1.218 -1.200 -1.247 -1.281 -1.345 -1.383 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 19 hirs3_n17 4 0.236902E-01 + -0.359 -0.450 -0.372 -0.319 -0.215 -0.233 -0.155 -0.195 -0.094 -0.129 + -0.081 -0.131 -0.047 -0.111 -0.064 -0.107 -0.058 -0.070 -0.113 -0.079 + -0.070 -0.107 -0.059 -0.142 -0.049 -0.075 -0.083 -0.089 -0.057 -0.080 + -0.095 -0.074 -0.089 -0.054 -0.073 -0.084 -0.060 -0.050 -0.087 -0.054 + -0.064 -0.047 -0.053 -0.105 -0.090 -0.085 -0.115 -0.139 -0.157 -0.157 + -0.208 -0.228 -0.253 -0.279 -0.340 -0.352 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 20 hirs3_n17 5 0.409627E-01 + 0.464 0.374 0.468 0.417 0.458 0.454 0.474 0.463 0.461 0.489 + 0.526 0.456 0.444 0.450 0.508 0.448 0.446 0.402 0.435 0.429 + 0.463 0.452 0.506 0.402 0.467 0.456 0.471 0.460 0.466 0.441 + 0.434 0.438 0.462 0.404 0.485 0.440 0.487 0.423 0.460 0.410 + 0.492 0.545 0.441 0.500 0.552 0.446 0.507 0.461 0.494 0.470 + 0.501 0.491 0.515 0.537 0.582 0.664 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 21 hirs3_n17 6 0.460337E-01 + 0.618 0.500 0.631 0.508 0.521 0.564 0.553 0.564 0.505 0.597 + 0.624 0.546 0.474 0.546 0.596 0.545 0.502 0.447 0.663 0.532 + 0.559 0.662 0.585 0.622 0.551 0.565 0.619 0.552 0.559 0.527 + 0.625 0.539 0.625 0.489 0.620 0.624 0.575 0.513 0.671 0.491 + 0.567 0.936 0.528 0.611 0.773 0.520 0.739 0.557 0.598 0.557 + 0.642 0.625 0.657 0.711 0.814 0.977 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 22 hirs3_n17 7 0.397977E-01 + 0.938 0.806 1.048 0.744 0.699 0.883 0.803 0.863 0.662 1.013 + 0.945 0.934 0.606 0.907 0.908 0.879 0.703 0.588 1.240 0.756 + 0.884 1.144 0.933 1.162 0.847 0.990 1.092 0.902 0.863 0.816 + 1.123 0.830 1.116 0.680 1.039 1.031 0.907 0.691 1.143 0.596 + 0.810 1.764 0.641 0.897 1.405 0.644 1.476 0.721 0.859 0.712 + 0.941 0.831 0.881 0.965 1.091 1.285 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 23 hirs3_n17 8 0.932057E-02 + -0.306 -0.339 0.954 -0.282 -0.409 0.553 0.027 0.704 -0.250 1.648 + 1.171 1.434 -0.212 1.473 1.038 1.368 0.248 -0.010 2.579 0.495 + 1.376 2.428 1.444 2.409 0.882 1.984 2.439 1.512 0.996 1.046 + 2.219 0.830 2.634 0.192 2.004 2.109 1.663 0.101 2.234 -0.169 + 1.151 4.047 -0.178 1.418 3.068 -0.331 3.200 -0.268 0.065 -0.443 + 0.057 -0.413 -0.379 -0.465 -0.288 -0.196 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 24 hirs3_n17 9 -0.113027E-01 + -0.603 -0.710 -0.189 -0.761 -0.840 -0.461 -0.657 -0.415 -0.829 -0.100 + -0.194 -0.059 -0.816 -0.095 -0.265 -0.162 -0.571 -0.717 0.546 -0.451 + -0.044 0.350 0.024 0.374 -0.192 0.177 0.469 -0.016 -0.184 -0.232 + 0.325 -0.308 0.509 -0.591 0.250 0.222 0.010 -0.635 0.229 -0.795 + -0.302 1.117 -0.781 -0.100 0.668 -0.863 0.651 -0.791 -0.609 -0.833 + -0.562 -0.731 -0.692 -0.638 -0.502 -0.357 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 25 hirs3_n17 10 0.201644E-01 + 0.263 0.194 0.996 0.218 0.090 0.805 0.415 0.878 0.174 1.453 + 1.148 1.286 0.162 1.256 1.052 1.235 0.494 0.269 2.048 0.675 + 1.213 1.923 1.290 1.912 0.938 1.560 1.813 1.291 1.046 1.027 + 1.816 0.937 1.884 0.472 1.629 1.701 1.401 0.426 1.871 0.199 + 1.042 3.109 0.226 1.177 2.357 0.136 2.487 0.222 0.525 0.097 + 0.555 0.174 0.219 0.175 0.352 0.480 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 26 hirs3_n17 11 0.610442E-01 + 0.414 0.321 0.538 0.330 0.321 0.470 0.408 0.513 0.314 0.441 + 0.556 0.454 0.281 0.376 0.450 0.486 0.331 0.249 0.330 0.404 + 0.482 0.282 0.513 0.327 0.510 0.354 0.432 0.513 0.523 0.471 + 0.346 0.478 0.244 0.358 0.358 0.342 0.443 0.341 0.313 0.265 + 0.350 0.195 0.301 0.378 0.304 0.276 0.313 0.326 0.415 0.303 + 0.453 0.391 0.424 0.454 0.499 0.621 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 27 hirs3_n17 12 0.681002E-01 + 0.026 -0.136 0.036 0.118 0.197 0.086 0.141 0.039 0.129 -0.008 + 0.053 -0.066 0.062 -0.111 0.014 -0.118 -0.023 -0.074 -0.224 -0.084 + -0.076 -0.250 -0.076 -0.254 -0.030 -0.173 -0.176 -0.123 -0.038 -0.112 + -0.171 -0.071 -0.155 -0.070 -0.158 -0.188 -0.075 -0.075 -0.090 -0.039 + -0.043 -0.255 0.028 -0.083 -0.105 0.016 -0.146 0.070 0.108 0.110 + 0.174 0.167 0.231 0.191 0.277 0.296 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 28 hirs3_n17 13 0.329364E-01 + -0.985 -1.003 0.236 -0.975 -1.053 -0.217 -0.676 -0.033 -0.867 0.766 + 0.451 0.611 -0.813 0.611 0.338 0.532 -0.365 -0.623 1.392 -0.238 + 0.444 1.190 0.385 1.358 -0.073 0.889 1.208 0.506 0.031 0.092 + 1.113 -0.160 1.403 -0.712 0.889 1.032 0.611 -0.818 1.035 -1.005 + 0.183 2.392 -1.051 0.393 1.644 -1.166 1.752 -1.122 -0.939 -1.240 + -0.976 -1.223 -1.230 -1.223 -1.133 -0.983 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 29 hirs3_n17 14 0.441588E-01 + 0.053 -0.031 0.392 -0.130 -0.199 0.138 -0.078 0.177 -0.209 0.471 + 0.346 0.411 -0.236 0.425 0.286 0.390 -0.059 -0.184 0.808 0.012 + 0.345 0.669 0.336 0.736 0.116 0.534 0.686 0.366 0.157 0.189 + 0.672 0.093 0.746 -0.178 0.560 0.631 0.426 -0.199 0.618 -0.284 + 0.255 1.187 -0.289 0.342 0.838 -0.316 0.865 -0.265 -0.170 -0.299 + -0.146 -0.221 -0.192 -0.109 0.037 0.277 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 30 hirs3_n17 15 0.426750E-01 + -0.079 -0.170 0.074 -0.313 -0.397 -0.153 -0.359 -0.171 -0.477 0.021 + -0.114 -0.053 -0.540 -0.034 -0.186 -0.067 -0.433 -0.510 0.152 -0.368 + -0.162 0.083 -0.190 0.113 -0.338 -0.025 0.029 -0.150 -0.311 -0.269 + 0.032 -0.336 0.061 -0.531 -0.035 0.045 -0.120 -0.540 0.021 -0.588 + -0.214 0.402 -0.599 -0.124 0.181 -0.582 0.196 -0.533 -0.485 -0.527 + -0.441 -0.446 -0.422 -0.312 -0.194 0.057 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 31 hirs3_n17 16 0.406371E-01 + 1.625 1.556 1.300 1.409 1.366 1.238 1.342 1.222 1.291 1.207 + 1.176 1.182 1.245 1.208 1.156 1.157 1.195 1.214 1.233 1.199 + 1.094 1.154 1.120 1.160 1.168 1.131 1.166 1.106 1.133 1.145 + 1.132 1.161 1.231 1.179 1.147 1.248 1.105 1.213 1.182 1.211 + 1.085 1.453 1.214 1.205 1.345 1.263 1.448 1.294 1.245 1.313 + 1.322 1.402 1.407 1.575 1.698 2.020 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 32 hirs3_n17 17 0.241361E-01 + -0.631 -0.742 0.647 -0.748 -0.839 0.147 -0.431 0.321 -0.699 1.118 + 0.930 1.090 -0.678 1.077 0.700 0.878 -0.118 -0.472 1.880 0.008 + 0.901 1.581 0.866 1.792 0.359 1.341 1.737 0.962 0.484 0.565 + 1.739 0.300 2.002 -0.421 1.416 1.605 1.189 -0.531 1.720 -0.761 + 0.800 3.059 -0.768 0.980 2.362 -0.925 2.551 -0.894 -0.562 -1.000 + -0.603 -0.978 -0.882 -0.964 -0.733 -0.619 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 33 hirs3_n17 18 0.540608E-02 + -0.346 -0.362 1.289 -0.320 -0.408 0.712 0.063 0.899 -0.235 2.096 + 1.626 1.814 -0.179 2.005 1.334 1.528 0.391 0.078 3.199 0.560 + 1.700 2.541 1.605 2.735 0.995 2.391 2.941 1.874 1.204 1.280 + 2.737 1.003 3.074 0.165 2.332 2.613 2.178 0.030 3.192 -0.233 + 1.542 4.951 -0.236 2.108 3.804 -0.421 4.249 -0.352 -0.007 -0.490 + 0.014 -0.514 -0.418 -0.547 -0.336 -0.262 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 34 hirs3_n17 19 0.490168E-02 + -0.130 -0.142 1.733 -0.049 -0.187 1.039 0.330 1.139 -0.022 1.992 + 1.828 1.840 0.001 1.867 1.339 1.591 0.569 0.226 3.102 0.657 + 1.557 2.747 1.534 2.870 1.039 2.260 2.851 1.730 1.210 1.251 + 2.787 1.003 3.095 0.270 2.202 2.652 1.948 0.153 3.147 -0.077 + 1.342 4.223 -0.080 2.009 3.714 -0.266 3.916 -0.198 0.106 -0.332 + 0.115 -0.385 -0.325 -0.434 -0.282 -0.253 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 35 amsub_n17 1 0.802024E-02 + -2.884 -3.053 -2.869 -2.947 -2.748 -2.699 -2.445 -2.429 -2.277 -2.230 + -2.078 -1.944 -1.810 -1.722 -1.598 -1.471 -1.415 -1.322 -1.138 -1.117 + -1.017 -0.943 -0.819 -0.737 -0.696 -0.641 -0.570 -0.468 -0.414 -0.319 + -0.238 -0.047 -0.007 0.097 0.039 0.064 0.179 0.219 0.260 0.286 + 0.302 0.372 0.357 0.445 0.303 0.366 0.447 0.484 0.454 0.326 + 0.348 0.283 0.249 0.213 0.222 0.144 0.157 0.071 -0.059 -0.185 + -0.329 -0.333 -0.395 -0.510 -0.553 -0.764 -0.804 -0.891 -0.977 -1.076 + -1.233 -1.334 -1.458 -1.632 -1.739 -1.822 -1.987 -2.133 -2.225 -2.331 + -2.434 -2.636 -2.662 -2.792 -2.899 -2.968 -3.096 -3.087 -3.210 -2.971 + + 36 amsub_n17 2 0.151307E-01 + -1.296 -1.204 -1.099 -1.062 -0.999 -0.989 -0.869 -0.757 -0.729 -0.716 + -0.637 -0.541 -0.467 -0.449 -0.387 -0.288 -0.276 -0.250 -0.181 -0.136 + -0.092 -0.067 -0.028 0.007 0.004 0.032 0.056 0.167 0.138 0.175 + 0.160 0.297 0.275 0.280 0.291 0.247 0.301 0.278 0.302 0.312 + 0.389 0.376 0.346 0.380 0.306 0.340 0.402 0.402 0.363 0.322 + 0.302 0.318 0.309 0.321 0.338 0.332 0.387 0.266 0.281 0.234 + 0.185 0.202 0.228 0.208 0.186 0.025 0.038 0.041 0.077 0.017 + -0.028 -0.074 -0.100 -0.148 -0.183 -0.247 -0.296 -0.401 -0.394 -0.453 + -0.498 -0.592 -0.628 -0.692 -0.717 -0.819 -0.946 -0.981 -1.060 -1.217 + + 37 amsub_n17 3 0.749811E-01 + -0.018 0.057 0.048 0.056 0.077 0.056 0.055 0.081 0.103 0.105 + 0.155 0.159 0.126 0.129 0.122 0.155 0.157 0.162 0.166 0.167 + 0.255 0.275 0.173 0.217 0.278 0.232 0.155 0.146 0.192 0.229 + 0.187 0.268 0.208 0.224 0.212 0.234 0.249 0.202 0.218 0.266 + 0.277 0.252 0.180 0.214 0.264 0.280 0.285 0.262 0.296 0.227 + 0.245 0.124 0.164 0.190 0.157 0.223 0.151 0.176 0.137 0.179 + 0.180 0.148 0.159 0.148 0.185 0.072 0.175 0.097 0.097 0.104 + 0.088 0.099 0.045 0.052 0.043 -0.027 0.111 0.025 0.043 -0.032 + 0.030 -0.016 -0.031 -0.002 -0.043 0.004 -0.099 -0.105 -0.120 -0.112 + + 38 amsub_n17 4 0.551816E-01 + -0.236 -0.116 -0.154 -0.033 -0.043 -0.053 -0.035 -0.031 -0.024 -0.007 + -0.040 -0.006 -0.071 -0.108 -0.169 -0.204 -0.256 -0.286 -0.345 -0.432 + -0.399 -0.396 -0.496 -0.479 -0.500 -0.606 -0.583 -0.670 -0.634 -0.595 + -0.608 -0.605 -0.609 -0.529 -0.571 -0.553 -0.617 -0.648 -0.654 -0.708 + -0.735 -0.773 -0.925 -0.887 -0.932 -0.865 -0.874 -0.849 -0.822 -0.821 + -0.756 -0.816 -0.823 -0.787 -0.729 -0.634 -0.649 -0.560 -0.531 -0.400 + -0.379 -0.309 -0.292 -0.234 -0.156 -0.106 -0.010 -0.067 -0.013 0.016 + 0.026 0.030 -0.059 0.027 -0.019 -0.050 -0.014 -0.058 -0.083 -0.166 + -0.151 -0.179 -0.182 -0.187 -0.206 -0.166 -0.251 -0.291 -0.319 -0.265 + + 39 amsub_n17 5 0.352967E-01 + -0.571 -0.474 -0.523 -0.359 -0.471 -0.402 -0.391 -0.572 -0.679 -0.655 + -0.821 -0.626 -0.595 -0.672 -0.358 -0.606 -0.513 -0.281 -0.375 -0.377 + -0.203 -0.184 -0.166 -0.252 -0.234 -0.263 -0.206 -0.081 -0.089 0.162 + -0.246 -0.148 -0.357 -0.062 0.047 -0.130 -0.118 -0.282 -0.262 -0.326 + -0.085 0.003 -0.358 -0.621 -0.663 -0.193 -0.386 -0.448 -0.568 -0.441 + -0.483 -0.559 -0.433 -0.317 -0.275 -0.081 -0.137 -0.171 -0.164 0.168 + 0.094 0.134 0.011 0.138 0.252 0.279 0.413 0.075 0.397 0.261 + 0.195 0.121 0.132 0.042 0.068 0.180 -0.045 -0.010 -0.005 -0.183 + 0.352 -0.256 -0.195 -0.214 0.021 -0.042 -0.101 0.042 0.052 -0.252 + + 40 amsua_n18 1 0.538378E-02 + -3.297 -3.155 -3.005 -2.899 -2.837 -2.710 -2.652 -2.560 -2.477 -2.416 + -2.337 -2.354 -2.311 -2.246 -2.236 -2.235 -2.230 -2.241 -2.202 -2.213 + -2.239 -2.323 -2.485 -2.615 -2.620 -2.616 -2.600 -2.527 -2.479 -2.467 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 41 amsua_n18 2 0.292679E-02 + -1.128 -1.316 -1.448 -1.632 -1.751 -1.775 -1.778 -1.757 -1.713 -1.648 + -1.610 -1.565 -1.532 -1.518 -1.489 -1.505 -1.490 -1.536 -1.568 -1.564 + -1.572 -1.647 -1.716 -1.725 -1.681 -1.575 -1.412 -1.192 -0.926 -0.569 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 42 amsua_n18 3 0.175421E-01 + -0.635 0.224 0.295 0.610 1.063 1.235 1.540 1.576 1.732 1.967 + 1.942 2.263 2.353 2.458 2.411 2.465 2.372 2.214 1.912 1.891 + 1.666 1.386 1.040 0.651 0.254 -0.360 -0.958 -1.581 -2.133 -3.084 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 43 amsua_n18 4 0.391857E-01 + -2.331 -2.249 -2.048 -1.781 -1.370 -0.989 -0.699 -0.523 -0.346 -0.167 + -0.037 0.097 0.187 0.253 0.279 0.284 0.244 0.169 0.063 -0.050 + -0.199 -0.360 -0.542 -0.736 -1.021 -1.488 -2.016 -2.419 -2.705 -2.901 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 44 amsua_n18 5 0.495958E-01 + -1.581 -1.713 -1.596 -1.469 -1.225 -0.992 -0.849 -0.754 -0.680 -0.592 + -0.530 -0.486 -0.457 -0.436 -0.412 -0.423 -0.438 -0.477 -0.517 -0.567 + -0.633 -0.735 -0.830 -0.963 -1.148 -1.477 -1.833 -2.034 -2.150 -2.193 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 45 amsua_n18 6 0.498400E-01 + -1.806 -1.815 -1.719 -1.691 -1.608 -1.506 -1.389 -1.329 -1.301 -1.269 + -1.264 -1.242 -1.234 -1.216 -1.219 -1.220 -1.227 -1.226 -1.234 -1.243 + -1.273 -1.287 -1.322 -1.350 -1.449 -1.644 -1.986 -2.016 -2.118 -2.204 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 46 amsua_n18 7 0.397731E-01 + -1.905 -1.911 -1.900 -1.907 -1.836 -1.763 -1.691 -1.706 -1.707 -1.694 + -1.708 -1.697 -1.698 -1.709 -1.718 -1.706 -1.747 -1.738 -1.755 -1.748 + -1.743 -1.752 -1.785 -1.795 -1.876 -2.036 -2.308 -2.362 -2.437 -2.525 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 47 amsua_n18 8 0.247122E-01 + -1.527 -1.607 -1.573 -1.496 -1.254 -1.105 -1.038 -1.001 -0.990 -0.972 + -0.956 -0.942 -0.941 -0.934 -0.937 -0.934 -0.945 -0.950 -0.964 -0.974 + -0.982 -1.022 -1.050 -1.103 -1.211 -1.462 -1.809 -1.976 -2.103 -2.198 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 48 amsua_n18 9 -0.129263E-01 + -1.222 -1.200 -1.204 -1.250 -1.214 -1.160 -1.093 -1.084 -1.062 -1.041 + -1.055 -1.038 -1.038 -1.025 -1.039 -1.062 -1.083 -1.113 -1.137 -1.167 + -1.199 -1.238 -1.303 -1.331 -1.406 -1.545 -1.741 -1.854 -1.964 -2.060 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 49 amsua_n18 10 -0.309217E-01 + -0.918 -0.856 -0.892 -0.935 -0.928 -0.860 -0.818 -0.803 -0.782 -0.772 + -0.772 -0.764 -0.758 -0.756 -0.767 -0.789 -0.807 -0.841 -0.877 -0.916 + -0.962 -1.004 -1.062 -1.106 -1.174 -1.307 -1.487 -1.618 -1.709 -1.805 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 50 amsua_n18 11 -0.447586E-01 + -1.195 -1.104 -1.107 -1.131 -1.098 -1.015 -0.961 -0.929 -0.894 -0.863 + -0.851 -0.834 -0.820 -0.822 -0.826 -0.843 -0.873 -0.905 -0.961 -0.999 + -1.052 -1.113 -1.190 -1.251 -1.341 -1.489 -1.689 -1.869 -2.006 -2.138 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 51 amsua_n18 12 -0.701949E-01 + -1.756 -1.586 -1.536 -1.518 -1.441 -1.331 -1.247 -1.194 -1.138 -1.099 + -1.066 -1.039 -1.013 -1.001 -1.006 -1.030 -1.058 -1.107 -1.172 -1.223 + -1.294 -1.372 -1.468 -1.556 -1.676 -1.854 -2.099 -2.339 -2.540 -2.759 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 52 amsua_n18 13 -0.903327E-01 + -3.262 -3.048 -2.980 -2.924 -2.832 -2.680 -2.580 -2.514 -2.434 -2.383 + -2.328 -2.280 -2.249 -2.227 -2.240 -2.259 -2.287 -2.343 -2.426 -2.503 + -2.590 -2.695 -2.805 -2.914 -3.063 -3.270 -3.556 -3.819 -4.064 -4.329 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 53 amsua_n18 14 -0.579322E-01 + -3.337 -3.379 -3.464 -3.525 -3.523 -3.466 -3.422 -3.424 -3.381 -3.379 + -3.339 -3.327 -3.322 -3.290 -3.308 -3.332 -3.349 -3.400 -3.487 -3.518 + -3.595 -3.658 -3.725 -3.792 -3.861 -3.990 -4.189 -4.306 -4.371 -4.358 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 54 amsua_n18 15 0.897746E-02 + 1.923 1.717 1.499 1.440 1.488 1.650 1.774 1.886 1.984 2.035 + 2.096 2.087 2.059 2.077 2.024 1.962 1.907 1.819 1.752 1.724 + 1.608 1.542 1.419 1.397 1.342 1.276 1.292 1.217 1.417 1.648 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 55 mhs_n18 1 0.878217E-02 + -1.035 -1.275 -1.264 -1.193 -1.184 -1.151 -1.073 -1.018 -0.859 -0.805 + -0.691 -0.472 -0.357 -0.287 -0.184 -0.082 0.023 0.113 0.150 0.171 + 0.247 0.397 0.365 0.476 0.491 0.539 0.634 0.674 0.778 0.853 + 0.829 0.962 1.007 1.052 1.108 1.124 1.208 1.270 1.241 1.407 + 1.377 1.419 1.458 1.445 1.508 1.411 1.501 1.324 1.363 1.349 + 1.300 1.238 1.168 1.099 1.032 1.013 0.943 0.904 0.861 0.826 + 0.781 0.676 0.587 0.531 0.507 0.382 0.341 0.352 0.180 0.203 + 0.109 0.063 -0.062 -0.083 -0.173 -0.279 -0.377 -0.404 -0.578 -0.739 + -0.895 -0.930 -1.131 -1.181 -1.298 -1.374 -1.511 -1.555 -1.608 -1.320 + + 56 mhs_n18 2 0.183324E-01 + -0.629 -0.580 -0.540 -0.430 -0.392 -0.367 -0.298 -0.266 -0.192 -0.172 + -0.121 -0.096 -0.061 -0.004 0.000 0.030 0.066 0.126 0.144 0.126 + 0.190 0.245 0.250 0.326 0.340 0.289 0.320 0.400 0.388 0.441 + 0.455 0.482 0.459 0.582 0.514 0.582 0.578 0.647 0.650 0.709 + 0.669 0.773 0.752 0.770 0.807 0.759 0.779 0.702 0.727 0.738 + 0.703 0.676 0.669 0.586 0.606 0.581 0.511 0.560 0.521 0.476 + 0.496 0.475 0.459 0.441 0.401 0.405 0.385 0.334 0.338 0.294 + 0.296 0.287 0.233 0.214 0.168 0.143 0.125 0.127 0.050 -0.008 + -0.016 -0.067 -0.115 -0.157 -0.183 -0.265 -0.357 -0.441 -0.452 -0.505 + + 57 mhs_n18 3 0.752610E-01 + 0.228 0.229 0.249 0.258 0.266 0.217 0.340 0.280 0.296 0.351 + 0.314 0.315 0.346 0.333 0.327 0.351 0.337 0.413 0.353 0.407 + 0.379 0.401 0.393 0.436 0.383 0.376 0.347 0.391 0.376 0.350 + 0.397 0.391 0.369 0.405 0.404 0.401 0.418 0.406 0.407 0.389 + 0.384 0.343 0.399 0.355 0.343 0.380 0.337 0.370 0.347 0.347 + 0.344 0.363 0.354 0.304 0.341 0.381 0.287 0.351 0.351 0.309 + 0.279 0.349 0.346 0.337 0.298 0.355 0.313 0.354 0.297 0.269 + 0.297 0.306 0.252 0.299 0.280 0.231 0.266 0.211 0.193 0.154 + 0.169 0.111 0.107 0.064 0.056 -0.010 -0.019 -0.004 -0.070 -0.060 + + 58 mhs_n18 4 0.555729E-01 + -0.471 -0.472 -0.445 -0.409 -0.403 -0.412 -0.331 -0.378 -0.358 -0.314 + -0.315 -0.339 -0.306 -0.282 -0.297 -0.271 -0.273 -0.217 -0.289 -0.236 + -0.266 -0.266 -0.243 -0.221 -0.229 -0.243 -0.249 -0.227 -0.264 -0.281 + -0.232 -0.235 -0.257 -0.195 -0.254 -0.244 -0.243 -0.239 -0.205 -0.243 + -0.225 -0.232 -0.234 -0.284 -0.298 -0.238 -0.276 -0.261 -0.280 -0.256 + -0.301 -0.276 -0.271 -0.313 -0.257 -0.217 -0.321 -0.291 -0.282 -0.298 + -0.338 -0.268 -0.257 -0.288 -0.309 -0.258 -0.313 -0.283 -0.307 -0.344 + -0.338 -0.308 -0.360 -0.323 -0.347 -0.372 -0.361 -0.394 -0.417 -0.478 + -0.469 -0.505 -0.534 -0.570 -0.611 -0.647 -0.674 -0.689 -0.766 -0.793 + + 59 mhs_n18 5 0.380587E-01 + -0.671 -0.626 -0.590 -0.528 -0.505 -0.509 -0.443 -0.469 -0.432 -0.409 + -0.370 -0.405 -0.401 -0.348 -0.379 -0.335 -0.351 -0.300 -0.340 -0.324 + -0.342 -0.350 -0.342 -0.296 -0.297 -0.328 -0.373 -0.318 -0.352 -0.384 + -0.366 -0.352 -0.406 -0.308 -0.410 -0.354 -0.389 -0.398 -0.377 -0.372 + -0.390 -0.330 -0.390 -0.405 -0.417 -0.363 -0.431 -0.380 -0.399 -0.393 + -0.395 -0.391 -0.379 -0.427 -0.378 -0.344 -0.414 -0.388 -0.392 -0.380 + -0.386 -0.343 -0.291 -0.306 -0.328 -0.283 -0.302 -0.309 -0.294 -0.328 + -0.321 -0.307 -0.309 -0.333 -0.326 -0.341 -0.339 -0.351 -0.378 -0.435 + -0.419 -0.457 -0.490 -0.513 -0.545 -0.579 -0.637 -0.660 -0.712 -0.784 + + 60 hirs4_metop-a 1 -0.428165E-01 + -3.448 -3.364 -3.483 -3.248 -3.281 -3.359 -3.317 -3.239 -3.304 -3.129 + -3.247 -3.058 -3.206 -3.257 -3.342 -3.162 -3.257 -3.124 -3.284 -3.102 + -3.129 -3.156 -3.152 -3.092 -3.169 -2.976 -3.123 -2.956 -3.087 -3.182 + -3.287 -3.129 -3.165 -3.067 -3.274 -3.090 -3.099 -3.207 -3.257 -3.174 + -3.200 -3.062 -3.240 -3.063 -3.128 -3.280 -3.440 -3.274 -3.229 -3.218 + -3.446 -3.246 -3.203 -3.408 -3.502 -3.491 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 61 hirs4_metop-a 2 -0.335040E-01 + -0.929 -0.955 -0.905 -0.835 -0.852 -0.894 -0.820 -0.879 -0.890 -0.843 + -0.886 -0.896 -0.862 -0.855 -0.856 -0.863 -0.883 -0.901 -0.870 -0.843 + -0.868 -0.900 -0.828 -0.920 -0.942 -0.861 -0.905 -0.954 -0.927 -0.865 + -0.876 -0.895 -0.945 -0.897 -0.873 -0.868 -0.920 -0.872 -0.827 -0.931 + -0.981 -0.823 -0.907 -0.955 -0.946 -0.824 -0.874 -0.914 -0.961 -0.875 + -0.908 -0.904 -0.954 -0.925 -0.968 -1.139 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 62 hirs4_metop-a 3 -0.153444E-01 + -0.800 -0.815 -0.782 -0.817 -0.793 -0.785 -0.811 -0.808 -0.753 -0.811 + -0.808 -0.796 -0.789 -0.819 -0.768 -0.801 -0.783 -0.781 -0.767 -0.827 + -0.793 -0.787 -0.827 -0.836 -0.774 -0.831 -0.829 -0.825 -0.820 -0.846 + -0.799 -0.828 -0.809 -0.828 -0.783 -0.840 -0.815 -0.819 -0.832 -0.842 + -0.793 -0.854 -0.828 -0.833 -0.845 -0.873 -0.810 -0.852 -0.850 -0.861 + -0.812 -0.896 -0.899 -0.901 -0.944 -1.038 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 63 hirs4_metop-a 4 0.211717E-01 + -0.312 -0.362 -0.337 -0.330 -0.324 -0.348 -0.305 -0.296 -0.314 -0.287 + -0.261 -0.308 -0.287 -0.291 -0.305 -0.300 -0.295 -0.325 -0.305 -0.318 + -0.343 -0.371 -0.337 -0.350 -0.384 -0.358 -0.334 -0.390 -0.375 -0.364 + -0.377 -0.370 -0.352 -0.372 -0.354 -0.355 -0.358 -0.387 -0.344 -0.343 + -0.374 -0.346 -0.332 -0.373 -0.356 -0.360 -0.395 -0.382 -0.375 -0.414 + -0.420 -0.430 -0.458 -0.513 -0.519 -0.534 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 64 hirs4_metop-a 5 0.400027E-01 + 0.757 0.662 0.648 0.588 0.631 0.568 0.584 0.546 0.563 0.543 + 0.555 0.521 0.538 0.513 0.533 0.491 0.506 0.476 0.481 0.459 + 0.492 0.435 0.457 0.435 0.432 0.414 0.434 0.406 0.408 0.425 + 0.438 0.422 0.441 0.420 0.443 0.450 0.481 0.451 0.476 0.481 + 0.485 0.480 0.507 0.498 0.505 0.516 0.543 0.520 0.545 0.516 + 0.553 0.558 0.597 0.559 0.609 0.659 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 65 hirs4_metop-a 6 0.459337E-01 + 0.794 0.682 0.609 0.520 0.503 0.483 0.472 0.419 0.437 0.424 + 0.403 0.413 0.414 0.375 0.396 0.377 0.371 0.373 0.356 0.340 + 0.347 0.341 0.337 0.308 0.332 0.321 0.291 0.323 0.311 0.301 + 0.303 0.302 0.325 0.309 0.307 0.324 0.333 0.331 0.341 0.338 + 0.370 0.343 0.332 0.374 0.378 0.337 0.368 0.375 0.392 0.368 + 0.383 0.428 0.460 0.464 0.532 0.642 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 66 hirs4_metop-a 7 0.390220E-01 + 0.937 0.839 0.774 0.704 0.693 0.621 0.625 0.579 0.599 0.553 + 0.589 0.538 0.559 0.521 0.561 0.529 0.550 0.524 0.536 0.517 + 0.531 0.500 0.530 0.509 0.540 0.530 0.528 0.512 0.522 0.533 + 0.544 0.493 0.545 0.514 0.520 0.534 0.544 0.528 0.548 0.529 + 0.548 0.547 0.575 0.547 0.564 0.567 0.607 0.567 0.610 0.597 + 0.637 0.661 0.702 0.719 0.811 0.880 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 67 hirs4_metop-a 8 0.910199E-02 + -0.320 -0.245 -0.235 -0.232 -0.190 -0.189 -0.156 -0.144 -0.081 -0.120 + -0.032 -0.021 -0.018 0.009 0.065 0.080 0.100 0.129 0.155 0.125 + 0.152 0.157 0.162 0.200 0.232 0.203 0.201 0.215 0.186 0.256 + 0.215 0.142 0.215 0.160 0.143 0.179 0.157 0.132 0.079 0.062 + 0.066 0.020 0.033 -0.018 -0.045 -0.093 -0.083 -0.157 -0.155 -0.215 + -0.237 -0.297 -0.324 -0.364 -0.366 -0.425 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 68 hirs4_metop-a 9 -0.106425E-01 + -0.192 -0.233 -0.311 -0.360 -0.368 -0.408 -0.410 -0.444 -0.457 -0.466 + -0.434 -0.441 -0.450 -0.414 -0.400 -0.391 -0.395 -0.349 -0.377 -0.375 + -0.356 -0.339 -0.338 -0.352 -0.348 -0.328 -0.295 -0.321 -0.328 -0.308 + -0.321 -0.362 -0.317 -0.341 -0.358 -0.321 -0.345 -0.368 -0.386 -0.376 + -0.399 -0.405 -0.413 -0.415 -0.426 -0.457 -0.450 -0.467 -0.483 -0.453 + -0.436 -0.447 -0.410 -0.382 -0.355 -0.268 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 69 hirs4_metop-a 10 0.200746E-01 + 0.289 0.320 0.319 0.301 0.322 0.303 0.330 0.319 0.361 0.313 + 0.403 0.381 0.383 0.379 0.430 0.423 0.453 0.452 0.484 0.455 + 0.473 0.454 0.504 0.497 0.536 0.522 0.515 0.516 0.493 0.564 + 0.529 0.451 0.536 0.490 0.473 0.505 0.497 0.486 0.479 0.447 + 0.436 0.427 0.466 0.415 0.395 0.377 0.398 0.319 0.345 0.306 + 0.295 0.275 0.272 0.218 0.281 0.238 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 70 hirs4_metop-a 11 0.592654E-01 + 0.465 0.458 0.399 0.315 0.313 0.325 0.277 0.247 0.223 0.228 + 0.223 0.230 0.225 0.182 0.216 0.207 0.220 0.219 0.204 0.168 + 0.180 0.205 0.189 0.194 0.222 0.184 0.164 0.239 0.230 0.197 + 0.174 0.187 0.248 0.212 0.180 0.195 0.215 0.209 0.174 0.209 + 0.223 0.181 0.161 0.185 0.224 0.150 0.202 0.203 0.249 0.227 + 0.238 0.258 0.324 0.293 0.317 0.399 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 71 hirs4_metop-a 12 0.681334E-01 + 0.490 0.417 0.350 0.206 0.161 0.141 0.091 0.031 0.034 0.004 + -0.112 -0.063 -0.051 -0.112 -0.156 -0.152 -0.179 -0.163 -0.147 -0.224 + -0.246 -0.241 -0.237 -0.303 -0.233 -0.264 -0.363 -0.304 -0.253 -0.322 + -0.283 -0.241 -0.293 -0.241 -0.225 -0.271 -0.271 -0.275 -0.232 -0.222 + -0.207 -0.205 -0.245 -0.161 -0.127 -0.177 -0.104 -0.053 -0.093 -0.005 + 0.063 0.040 0.020 0.083 0.133 0.150 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 72 hirs4_metop-a 13 0.361863E-01 + 0.666 0.595 0.544 0.436 0.471 0.451 0.479 0.451 0.477 0.450 + 0.540 0.469 0.510 0.508 0.532 0.485 0.495 0.471 0.486 0.410 + 0.433 0.406 0.392 0.397 0.410 0.360 0.399 0.366 0.371 0.399 + 0.387 0.319 0.385 0.358 0.346 0.362 0.349 0.329 0.342 0.322 + 0.318 0.301 0.327 0.282 0.299 0.254 0.286 0.244 0.276 0.231 + 0.247 0.252 0.267 0.247 0.328 0.402 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 73 hirs4_metop-a 14 0.436112E-01 + 0.403 0.228 0.148 -0.011 -0.024 -0.081 -0.061 -0.126 -0.082 -0.142 + -0.073 -0.131 -0.092 -0.129 -0.085 -0.131 -0.113 -0.139 -0.106 -0.171 + -0.143 -0.164 -0.158 -0.188 -0.143 -0.207 -0.174 -0.199 -0.180 -0.189 + -0.177 -0.228 -0.166 -0.215 -0.196 -0.210 -0.195 -0.219 -0.193 -0.233 + -0.194 -0.238 -0.215 -0.246 -0.208 -0.276 -0.239 -0.275 -0.227 -0.299 + -0.259 -0.264 -0.217 -0.238 -0.132 -0.053 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 74 hirs4_metop-a 15 0.420040E-01 + 0.386 0.115 0.007 -0.215 -0.262 -0.348 -0.345 -0.447 -0.408 -0.475 + -0.411 -0.517 -0.464 -0.511 -0.479 -0.542 -0.522 -0.582 -0.528 -0.614 + -0.585 -0.619 -0.592 -0.655 -0.607 -0.669 -0.625 -0.688 -0.638 -0.659 + -0.638 -0.684 -0.622 -0.688 -0.636 -0.664 -0.641 -0.669 -0.612 -0.660 + -0.617 -0.647 -0.609 -0.647 -0.594 -0.647 -0.595 -0.628 -0.571 -0.651 + -0.569 -0.565 -0.514 -0.520 -0.368 -0.292 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 75 hirs4_metop-a 16 0.369580E-01 + 0.516 0.183 0.033 -0.227 -0.294 -0.469 -0.478 -0.639 -0.638 -0.749 + -0.679 -0.819 -0.747 -0.813 -0.782 -0.881 -0.848 -0.938 -0.882 -0.992 + -0.940 -1.018 -0.959 -1.049 -1.006 -1.090 -0.992 -1.103 -1.041 -1.048 + -1.022 -1.093 -1.005 -1.083 -1.022 -1.070 -1.012 -1.067 -0.969 -1.043 + -0.994 -1.013 -0.927 -0.983 -0.930 -0.958 -0.868 -0.905 -0.806 -0.853 + -0.739 -0.738 -0.631 -0.634 -0.443 -0.404 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 76 hirs4_metop-a 17 0.231714E-01 + 0.194 0.080 0.010 -0.116 -0.089 -0.143 -0.102 -0.111 -0.124 -0.171 + 0.001 -0.081 -0.052 -0.027 -0.002 -0.024 -0.005 -0.016 0.017 -0.031 + -0.013 -0.030 -0.053 -0.007 0.021 -0.047 0.011 -0.022 -0.004 0.004 + -0.003 -0.101 0.015 -0.065 -0.077 -0.025 -0.056 -0.102 -0.101 -0.116 + -0.137 -0.133 -0.122 -0.215 -0.166 -0.255 -0.205 -0.291 -0.249 -0.315 + -0.291 -0.321 -0.314 -0.349 -0.258 -0.215 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 77 hirs4_metop-a 18 0.523781E-02 + -0.095 -0.086 -0.107 -0.150 -0.070 -0.096 -0.038 -0.011 -0.017 -0.065 + 0.098 0.080 0.082 0.130 0.172 0.162 0.187 0.204 0.202 0.193 + 0.196 0.178 0.168 0.252 0.300 0.191 0.285 0.217 0.240 0.272 + 0.273 0.148 0.267 0.224 0.171 0.220 0.235 0.164 0.116 0.152 + 0.049 0.083 0.104 -0.026 0.039 -0.079 -0.037 -0.150 -0.089 -0.189 + -0.153 -0.283 -0.261 -0.339 -0.306 -0.396 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 78 hirs4_metop-a 19 0.503907E-02 + -0.029 0.054 0.067 0.040 0.112 0.103 0.150 0.186 0.200 0.123 + 0.304 0.276 0.251 0.317 0.326 0.351 0.350 0.340 0.359 0.351 + 0.351 0.310 0.328 0.364 0.391 0.336 0.405 0.366 0.341 0.364 + 0.391 0.257 0.401 0.336 0.298 0.305 0.318 0.260 0.236 0.241 + 0.172 0.188 0.191 0.098 0.158 0.039 0.087 -0.007 0.001 -0.061 + -0.029 -0.157 -0.158 -0.251 -0.247 -0.349 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 79 amsua_metop-a 1 0.544763E-02 + -3.599 -3.687 -3.579 -3.404 -3.215 -3.072 -2.892 -2.761 -2.652 -2.550 + -2.498 -2.433 -2.417 -2.372 -2.346 -2.355 -2.354 -2.336 -2.352 -2.410 + -2.477 -2.530 -2.737 -2.901 -2.918 -2.858 -2.822 -2.682 -2.577 -2.500 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 80 amsua_metop-a 2 0.294058E-02 + -1.996 -2.220 -2.237 -2.276 -2.252 -2.188 -2.080 -1.993 -1.903 -1.802 + -1.717 -1.616 -1.595 -1.540 -1.527 -1.533 -1.544 -1.578 -1.637 -1.694 + -1.776 -1.850 -1.959 -1.984 -1.969 -1.862 -1.684 -1.426 -1.130 -0.756 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 81 amsua_metop-a 3 0.175980E-01 + -1.742 -1.173 -0.789 -0.482 0.044 0.491 0.821 1.057 1.290 1.480 + 1.714 1.874 2.021 2.156 2.199 2.215 2.138 2.004 1.823 1.626 + 1.455 1.224 1.000 0.762 0.379 -0.142 -0.701 -1.221 -1.701 -2.458 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 82 amsua_metop-a 4 0.392856E-01 + -2.266 -2.175 -1.978 -1.725 -1.309 -0.952 -0.723 -0.553 -0.380 -0.234 + -0.075 0.046 0.132 0.205 0.244 0.253 0.202 0.119 0.030 -0.112 + -0.256 -0.436 -0.618 -0.804 -1.058 -1.474 -1.938 -2.328 -2.637 -2.873 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 83 amsua_metop-a 5 0.496861E-01 + -1.571 -1.648 -1.611 -1.498 -1.240 -1.035 -0.900 -0.822 -0.739 -0.665 + -0.605 -0.556 -0.522 -0.496 -0.484 -0.487 -0.500 -0.537 -0.575 -0.631 + -0.708 -0.795 -0.910 -1.019 -1.196 -1.476 -1.843 -2.054 -2.232 -2.355 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 84 amsua_metop-a 6 0.496222E-01 + -1.542 -1.503 -1.504 -1.521 -1.364 -1.233 -1.169 -1.141 -1.135 -1.124 + -1.084 -1.062 -1.046 -1.034 -1.045 -1.050 -1.052 -1.067 -1.086 -1.111 + -1.135 -1.186 -1.227 -1.290 -1.414 -1.643 -1.976 -2.198 -2.357 -2.471 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 85 amsua_metop-a 7 0.396478E-01 + -1.644 -1.657 -1.643 -1.625 -1.568 -1.457 -1.426 -1.412 -1.414 -1.433 + -1.419 -1.402 -1.403 -1.398 -1.395 -1.396 -1.400 -1.418 -1.433 -1.453 + -1.493 -1.521 -1.558 -1.634 -1.756 -1.974 -2.264 -2.487 -2.643 -2.719 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 86 amsua_metop-a 8 0.248453E-01 + -1.242 -1.309 -1.275 -1.241 -0.978 -0.843 -0.798 -0.796 -0.776 -0.782 + -0.742 -0.732 -0.730 -0.712 -0.716 -0.724 -0.727 -0.739 -0.748 -0.777 + -0.796 -0.835 -0.903 -0.920 -1.050 -1.257 -1.594 -1.817 -1.963 -2.078 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 87 amsua_metop-a 9 -0.128114E-01 + -0.954 -0.897 -0.918 -0.947 -0.849 -0.789 -0.771 -0.781 -0.762 -0.747 + -0.710 -0.690 -0.678 -0.664 -0.659 -0.663 -0.685 -0.703 -0.728 -0.764 + -0.808 -0.868 -0.955 -1.013 -1.101 -1.250 -1.457 -1.626 -1.750 -1.888 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 88 amsua_metop-a 10 -0.303968E-01 + -0.575 -0.529 -0.588 -0.617 -0.539 -0.491 -0.472 -0.475 -0.466 -0.433 + -0.409 -0.385 -0.359 -0.334 -0.330 -0.338 -0.355 -0.387 -0.432 -0.477 + -0.537 -0.596 -0.653 -0.707 -0.781 -0.920 -1.134 -1.285 -1.391 -1.517 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 89 amsua_metop-a 11 -0.444821E-01 + -0.852 -0.778 -0.780 -0.802 -0.705 -0.632 -0.594 -0.583 -0.565 -0.520 + -0.487 -0.445 -0.415 -0.387 -0.378 -0.384 -0.404 -0.438 -0.482 -0.546 + -0.608 -0.677 -0.756 -0.819 -0.909 -1.069 -1.317 -1.482 -1.626 -1.801 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 90 amsua_metop-a 12 -0.688216E-01 + -1.614 -1.446 -1.391 -1.359 -1.227 -1.116 -1.045 -1.005 -0.953 -0.894 + -0.858 -0.798 -0.749 -0.719 -0.705 -0.714 -0.734 -0.772 -0.830 -0.912 + -0.986 -1.072 -1.186 -1.278 -1.394 -1.600 -1.887 -2.111 -2.322 -2.579 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 91 amsua_metop-a 13 -0.897015E-01 + -3.611 -3.400 -3.317 -3.256 -3.096 -2.956 -2.861 -2.796 -2.718 -2.633 + -2.586 -2.502 -2.450 -2.413 -2.386 -2.399 -2.420 -2.469 -2.546 -2.641 + -2.728 -2.850 -2.980 -3.105 -3.252 -3.485 -3.799 -4.067 -4.317 -4.607 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 92 amsua_metop-a 14 -0.594650E-01 + -3.502 -3.525 -3.609 -3.676 -3.596 -3.554 -3.499 -3.496 -3.462 -3.426 + -3.389 -3.318 -3.294 -3.254 -3.225 -3.250 -3.255 -3.291 -3.369 -3.437 + -3.503 -3.601 -3.659 -3.751 -3.813 -3.979 -4.188 -4.341 -4.420 -4.458 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 93 amsua_metop-a 15 0.906193E-02 + 1.101 0.830 0.783 0.843 1.031 1.274 1.500 1.681 1.837 1.987 + 2.064 2.151 2.180 2.220 2.237 2.218 2.233 2.165 2.165 2.095 + 2.055 2.018 1.995 1.958 1.931 1.904 1.842 1.929 2.126 2.349 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 94 mhs_metop-a 1 0.879687E-02 + -0.853 -1.130 -1.030 -1.098 -1.048 -0.958 -0.898 -0.834 -0.781 -0.630 + -0.544 -0.427 -0.221 -0.135 -0.101 -0.040 0.109 0.114 0.256 0.262 + 0.303 0.387 0.461 0.571 0.592 0.769 0.830 0.894 0.870 0.960 + 1.018 1.100 1.112 1.221 1.221 1.277 1.301 1.368 1.424 1.566 + 1.515 1.528 1.574 1.632 1.632 1.680 1.576 1.637 1.662 1.582 + 1.500 1.481 1.378 1.291 1.398 1.304 1.238 1.129 1.133 0.949 + 0.873 0.789 0.748 0.679 0.621 0.567 0.460 0.391 0.299 0.238 + 0.279 0.168 0.051 -0.029 -0.082 -0.196 -0.235 -0.398 -0.563 -0.647 + -0.816 -0.898 -1.052 -1.119 -1.225 -1.373 -1.522 -1.571 -1.626 -1.435 + + 95 mhs_metop-a 2 0.183793E-01 + -0.469 -0.446 -0.337 -0.314 -0.317 -0.223 -0.175 -0.222 -0.165 -0.101 + -0.094 -0.043 0.027 0.002 0.031 0.086 0.099 0.131 0.196 0.189 + 0.207 0.253 0.359 0.329 0.356 0.431 0.436 0.479 0.499 0.547 + 0.500 0.512 0.532 0.580 0.566 0.597 0.576 0.641 0.674 0.691 + 0.736 0.718 0.779 0.800 0.797 0.816 0.755 0.805 0.782 0.792 + 0.759 0.739 0.699 0.700 0.717 0.703 0.706 0.637 0.577 0.534 + 0.502 0.507 0.441 0.400 0.411 0.356 0.346 0.366 0.277 0.245 + 0.273 0.216 0.182 0.149 0.117 0.070 0.069 0.040 0.002 0.033 + -0.010 -0.091 -0.123 -0.191 -0.232 -0.381 -0.412 -0.502 -0.588 -0.661 + + 96 mhs_metop-a 3 0.754637E-01 + 0.238 0.224 0.268 0.247 0.247 0.267 0.306 0.186 0.228 0.285 + 0.241 0.256 0.369 0.281 0.281 0.302 0.308 0.300 0.299 0.330 + 0.297 0.353 0.369 0.367 0.338 0.383 0.376 0.408 0.379 0.366 + 0.344 0.364 0.344 0.326 0.303 0.257 0.274 0.306 0.274 0.263 + 0.292 0.298 0.270 0.330 0.319 0.292 0.308 0.318 0.302 0.261 + 0.365 0.369 0.393 0.302 0.412 0.392 0.340 0.375 0.315 0.269 + 0.316 0.299 0.288 0.249 0.278 0.245 0.253 0.241 0.255 0.199 + 0.252 0.216 0.166 0.218 0.218 0.152 0.196 0.185 0.170 0.190 + 0.199 0.124 0.132 0.149 0.094 -0.020 -0.010 -0.071 -0.154 -0.156 + + 97 mhs_metop-a 4 0.559885E-01 + -0.251 -0.240 -0.193 -0.191 -0.200 -0.177 -0.127 -0.246 -0.199 -0.156 + -0.189 -0.166 -0.069 -0.139 -0.131 -0.115 -0.112 -0.108 -0.125 -0.097 + -0.128 -0.074 -0.018 -0.023 -0.045 -0.005 -0.016 -0.012 -0.013 -0.026 + -0.054 -0.064 -0.090 -0.098 -0.127 -0.168 -0.149 -0.125 -0.140 -0.157 + -0.118 -0.151 -0.118 -0.087 -0.115 -0.143 -0.113 -0.107 -0.137 -0.156 + -0.065 -0.065 -0.005 -0.098 -0.042 -0.017 -0.085 -0.048 -0.115 -0.160 + -0.083 -0.132 -0.125 -0.160 -0.135 -0.169 -0.161 -0.136 -0.141 -0.229 + -0.160 -0.170 -0.227 -0.187 -0.163 -0.227 -0.205 -0.198 -0.225 -0.209 + -0.212 -0.259 -0.269 -0.272 -0.346 -0.437 -0.451 -0.499 -0.581 -0.620 + + 98 mhs_metop-a 5 0.380180E-01 + -0.511 -0.443 -0.408 -0.365 -0.363 -0.348 -0.302 -0.358 -0.300 -0.272 + -0.310 -0.258 -0.225 -0.247 -0.218 -0.170 -0.228 -0.192 -0.223 -0.194 + -0.217 -0.195 -0.140 -0.169 -0.161 -0.134 -0.169 -0.176 -0.147 -0.154 + -0.209 -0.256 -0.261 -0.285 -0.307 -0.300 -0.324 -0.274 -0.322 -0.361 + -0.267 -0.339 -0.277 -0.279 -0.290 -0.336 -0.279 -0.296 -0.347 -0.338 + -0.292 -0.277 -0.214 -0.275 -0.250 -0.214 -0.250 -0.232 -0.298 -0.272 + -0.208 -0.223 -0.231 -0.254 -0.220 -0.254 -0.213 -0.200 -0.199 -0.274 + -0.233 -0.223 -0.255 -0.232 -0.208 -0.280 -0.267 -0.202 -0.243 -0.247 + -0.258 -0.273 -0.284 -0.332 -0.388 -0.472 -0.492 -0.537 -0.616 -0.696 + + 99 iasi_metop-a 16 -0.531173E-01 + -2.728 -2.651 -2.653 -2.713 -2.681 -2.705 -2.563 -2.628 -2.558 -2.580 + -2.613 -2.612 -2.536 -2.507 -2.468 -2.417 -2.539 -2.523 -2.547 -2.518 + -2.459 -2.495 -2.458 -2.423 -2.522 -2.433 -2.343 -2.524 -2.400 -2.354 + -2.406 -2.366 -2.381 -2.356 -2.374 -2.376 -2.481 -2.358 -2.357 -2.476 + -2.365 -2.465 -2.343 -2.384 -2.356 -2.287 -2.311 -2.274 -2.418 -2.287 + -2.328 -2.342 -2.316 -2.194 -2.338 -2.312 -2.293 -2.407 -2.244 -2.376 + -2.273 -2.240 -2.308 -2.254 -2.277 -2.293 -2.259 -2.333 -2.333 -2.312 + -2.280 -2.329 -2.243 -2.328 -2.160 -2.243 -2.210 -2.199 -2.272 -2.379 + -2.279 -2.350 -2.247 -2.194 -2.269 -2.344 -2.274 -2.331 -2.421 -2.308 + + 100 iasi_metop-a 29 -0.454867E-01 + -1.668 -1.629 -1.541 -1.650 -1.593 -1.571 -1.570 -1.672 -1.696 -1.557 + -1.601 -1.750 -1.662 -1.522 -1.630 -1.711 -1.728 -1.641 -1.685 -1.693 + -1.755 -1.697 -1.674 -1.802 -1.804 -1.736 -1.984 -2.148 -1.915 -1.848 + -1.228 -1.309 -1.240 -1.152 -1.169 -1.288 -1.298 -1.226 -1.259 -1.274 + -1.191 -1.218 -1.178 -1.245 -1.285 -1.197 -1.112 -1.207 -1.226 -1.100 + -1.225 -1.346 -1.152 -1.144 -1.178 -1.265 -1.113 -1.106 -1.172 -1.188 + -1.183 -1.100 -1.154 -1.258 -1.149 -1.089 -1.155 -1.336 -1.243 -1.208 + -1.071 -1.215 -1.163 -1.148 -1.096 -1.165 -1.144 -1.122 -1.150 -1.164 + -1.132 -1.165 -1.177 -1.234 -1.237 -1.189 -1.161 -1.253 -1.222 -1.102 + + 101 iasi_metop-a 32 -0.173928E-01 + -0.856 -0.912 -0.842 -0.853 -0.858 -0.837 -0.857 -0.896 -0.858 -0.892 + -0.925 -0.949 -0.972 -0.977 -0.957 -0.928 -0.971 -0.989 -0.977 -0.962 + -1.058 -1.062 -0.954 -0.998 -1.058 -1.059 -1.181 -1.193 -1.077 -1.154 + -0.606 -0.624 -0.598 -0.643 -0.606 -0.608 -0.649 -0.637 -0.565 -0.675 + -0.667 -0.707 -0.679 -0.683 -0.578 -0.590 -0.577 -0.682 -0.583 -0.688 + -0.640 -0.699 -0.619 -0.533 -0.747 -0.635 -0.607 -0.671 -0.610 -0.620 + -0.567 -0.553 -0.667 -0.669 -0.693 -0.513 -0.570 -0.725 -0.716 -0.582 + -0.710 -0.575 -0.589 -0.620 -0.511 -0.589 -0.593 -0.632 -0.571 -0.607 + -0.593 -0.599 -0.572 -0.615 -0.561 -0.540 -0.518 -0.556 -0.581 -0.598 + + 102 iasi_metop-a 35 -0.459734E-01 + -0.847 -0.784 -0.880 -0.789 -0.775 -0.793 -0.855 -0.808 -0.680 -0.838 + -0.750 -0.709 -0.683 -0.789 -0.742 -0.670 -0.624 -0.708 -0.673 -0.613 + -0.703 -0.691 -0.725 -0.713 -0.640 -0.646 -0.675 -0.671 -0.601 -0.664 + -1.236 -1.371 -1.212 -1.142 -1.199 -1.320 -1.333 -1.240 -1.234 -1.221 + -1.207 -1.204 -1.223 -1.241 -1.141 -1.138 -1.155 -1.213 -1.206 -1.189 + -1.182 -1.176 -1.114 -1.055 -1.126 -1.199 -1.289 -1.168 -1.118 -1.316 + -1.220 -1.148 -1.168 -1.270 -1.222 -1.152 -1.092 -1.268 -1.156 -1.138 + -1.065 -1.221 -1.119 -1.134 -1.148 -1.120 -1.266 -1.243 -1.196 -1.089 + -1.217 -1.079 -1.170 -1.175 -1.143 -1.169 -1.140 -1.239 -1.320 -1.239 + + 103 iasi_metop-a 38 -0.216160E-01 + -0.510 -0.586 -0.483 -0.477 -0.603 -0.534 -0.520 -0.547 -0.671 -0.646 + -0.682 -0.695 -0.777 -0.709 -0.711 -0.774 -0.833 -0.807 -0.772 -0.792 + -0.862 -0.805 -0.807 -0.815 -0.917 -0.919 -1.087 -1.124 -0.956 -0.991 + -0.324 -0.315 -0.314 -0.304 -0.256 -0.379 -0.398 -0.403 -0.366 -0.280 + -0.302 -0.315 -0.319 -0.380 -0.287 -0.374 -0.190 -0.360 -0.218 -0.318 + -0.284 -0.447 -0.388 -0.364 -0.250 -0.401 -0.354 -0.370 -0.291 -0.302 + -0.332 -0.250 -0.248 -0.398 -0.417 -0.358 -0.289 -0.378 -0.316 -0.393 + -0.442 -0.414 -0.268 -0.316 -0.303 -0.324 -0.426 -0.365 -0.260 -0.320 + -0.388 -0.300 -0.292 -0.386 -0.261 -0.276 -0.309 -0.315 -0.318 -0.251 + + 104 iasi_metop-a 41 -0.461350E-01 + -0.529 -0.565 -0.625 -0.657 -0.514 -0.574 -0.578 -0.490 -0.513 -0.519 + -0.448 -0.468 -0.391 -0.520 -0.361 -0.393 -0.343 -0.440 -0.448 -0.400 + -0.395 -0.414 -0.378 -0.400 -0.325 -0.344 -0.356 -0.349 -0.329 -0.372 + -1.166 -1.276 -1.266 -1.161 -1.124 -1.217 -1.233 -1.184 -1.154 -1.118 + -1.142 -1.154 -1.125 -1.167 -1.197 -1.128 -1.082 -1.077 -1.212 -1.105 + -1.129 -1.186 -1.055 -1.078 -1.139 -1.136 -1.160 -1.119 -1.081 -1.144 + -1.215 -1.017 -1.081 -1.121 -1.158 -1.098 -1.171 -1.153 -1.188 -1.123 + -1.046 -1.206 -1.152 -1.148 -1.126 -1.135 -1.140 -1.051 -1.199 -1.199 + -1.170 -1.123 -1.143 -1.184 -1.180 -1.097 -1.142 -1.125 -1.202 -1.142 + + 105 iasi_metop-a 44 -0.252579E-01 + -0.571 -0.602 -0.505 -0.580 -0.569 -0.558 -0.508 -0.659 -0.647 -0.616 + -0.651 -0.695 -0.704 -0.662 -0.676 -0.751 -0.790 -0.769 -0.752 -0.780 + -0.845 -0.754 -0.801 -0.821 -0.936 -0.887 -1.064 -1.096 -0.973 -0.950 + -0.284 -0.366 -0.383 -0.341 -0.292 -0.266 -0.372 -0.387 -0.261 -0.292 + -0.363 -0.378 -0.319 -0.338 -0.365 -0.317 -0.260 -0.324 -0.288 -0.361 + -0.412 -0.353 -0.338 -0.295 -0.386 -0.437 -0.308 -0.288 -0.271 -0.343 + -0.347 -0.396 -0.317 -0.443 -0.315 -0.226 -0.369 -0.395 -0.294 -0.332 + -0.426 -0.359 -0.379 -0.256 -0.332 -0.340 -0.316 -0.315 -0.311 -0.404 + -0.309 -0.252 -0.304 -0.438 -0.293 -0.336 -0.342 -0.283 -0.315 -0.234 + + 106 iasi_metop-a 47 -0.463927E-01 + -0.569 -0.576 -0.617 -0.650 -0.515 -0.596 -0.574 -0.482 -0.417 -0.508 + -0.459 -0.444 -0.435 -0.454 -0.447 -0.435 -0.397 -0.454 -0.451 -0.392 + -0.395 -0.430 -0.414 -0.390 -0.351 -0.413 -0.381 -0.392 -0.374 -0.402 + -1.082 -1.054 -1.056 -1.031 -1.056 -1.040 -1.063 -1.056 -1.097 -1.046 + -1.009 -1.050 -1.094 -1.054 -1.090 -0.992 -1.116 -0.925 -1.006 -0.935 + -1.113 -1.025 -0.941 -0.980 -0.979 -1.009 -1.035 -1.014 -0.953 -0.951 + -1.000 -1.030 -0.964 -0.989 -1.041 -0.989 -0.984 -1.086 -0.931 -1.010 + -0.990 -1.072 -1.041 -1.017 -0.968 -1.058 -1.010 -0.992 -1.076 -1.076 + -0.996 -0.944 -1.012 -1.007 -1.066 -1.115 -0.992 -1.041 -1.098 -1.047 + + 107 iasi_metop-a 49 -0.352385E-01 + -0.777 -0.813 -0.785 -0.773 -0.708 -0.795 -0.750 -0.808 -0.758 -0.772 + -0.806 -0.860 -0.826 -0.759 -0.793 -0.809 -0.797 -0.813 -0.803 -0.842 + -0.854 -0.800 -0.836 -0.831 -0.916 -0.871 -1.018 -1.067 -0.926 -0.865 + -0.423 -0.491 -0.385 -0.419 -0.409 -0.415 -0.450 -0.413 -0.378 -0.430 + -0.354 -0.458 -0.342 -0.392 -0.492 -0.348 -0.380 -0.388 -0.293 -0.291 + -0.433 -0.366 -0.271 -0.311 -0.341 -0.452 -0.367 -0.325 -0.422 -0.355 + -0.419 -0.406 -0.295 -0.420 -0.403 -0.430 -0.316 -0.408 -0.375 -0.386 + -0.408 -0.436 -0.311 -0.395 -0.379 -0.428 -0.331 -0.432 -0.396 -0.375 + -0.409 -0.406 -0.372 -0.430 -0.417 -0.381 -0.374 -0.492 -0.401 -0.435 + + 108 iasi_metop-a 50 -0.265880E-01 + -0.412 -0.478 -0.422 -0.433 -0.372 -0.426 -0.437 -0.433 -0.423 -0.469 + -0.438 -0.429 -0.409 -0.429 -0.441 -0.433 -0.471 -0.424 -0.474 -0.452 + -0.482 -0.457 -0.533 -0.522 -0.490 -0.541 -0.583 -0.673 -0.535 -0.576 + -0.370 -0.473 -0.402 -0.432 -0.429 -0.431 -0.493 -0.379 -0.380 -0.370 + -0.358 -0.371 -0.356 -0.388 -0.475 -0.449 -0.383 -0.391 -0.363 -0.322 + -0.474 -0.425 -0.329 -0.367 -0.401 -0.477 -0.381 -0.326 -0.536 -0.397 + -0.419 -0.469 -0.402 -0.459 -0.448 -0.398 -0.374 -0.440 -0.440 -0.422 + -0.425 -0.473 -0.371 -0.422 -0.423 -0.372 -0.355 -0.384 -0.441 -0.390 + -0.432 -0.393 -0.361 -0.392 -0.447 -0.395 -0.354 -0.453 -0.368 -0.416 + + 109 iasi_metop-a 51 -0.237071E-01 + -0.391 -0.442 -0.381 -0.361 -0.336 -0.367 -0.382 -0.375 -0.375 -0.427 + -0.374 -0.338 -0.333 -0.365 -0.315 -0.373 -0.370 -0.334 -0.367 -0.325 + -0.359 -0.366 -0.389 -0.365 -0.333 -0.415 -0.409 -0.456 -0.365 -0.411 + -0.266 -0.348 -0.321 -0.319 -0.284 -0.332 -0.359 -0.291 -0.277 -0.236 + -0.235 -0.220 -0.253 -0.266 -0.384 -0.362 -0.248 -0.238 -0.324 -0.226 + -0.395 -0.236 -0.303 -0.290 -0.353 -0.300 -0.286 -0.250 -0.422 -0.279 + -0.314 -0.383 -0.323 -0.362 -0.353 -0.311 -0.300 -0.347 -0.336 -0.327 + -0.288 -0.373 -0.300 -0.334 -0.307 -0.256 -0.251 -0.265 -0.318 -0.270 + -0.334 -0.364 -0.284 -0.311 -0.324 -0.296 -0.225 -0.320 -0.266 -0.279 + + 110 iasi_metop-a 53 -0.460757E-01 + -0.545 -0.538 -0.577 -0.552 -0.463 -0.556 -0.571 -0.464 -0.418 -0.530 + -0.454 -0.470 -0.478 -0.429 -0.423 -0.480 -0.442 -0.445 -0.430 -0.459 + -0.416 -0.436 -0.492 -0.472 -0.412 -0.456 -0.482 -0.509 -0.436 -0.454 + -0.993 -0.973 -0.966 -0.931 -0.902 -0.982 -1.042 -0.871 -0.943 -0.990 + -0.939 -0.970 -1.013 -0.926 -0.923 -0.961 -1.019 -0.915 -0.941 -0.928 + -0.960 -0.961 -0.852 -0.931 -0.944 -0.909 -0.906 -0.964 -0.907 -0.962 + -0.934 -0.962 -0.979 -1.004 -0.956 -0.934 -0.919 -0.921 -0.983 -1.027 + -0.851 -0.992 -0.892 -0.946 -0.909 -0.831 -0.935 -1.015 -0.862 -0.948 + -0.938 -1.017 -0.952 -0.927 -0.888 -1.001 -0.979 -0.921 -1.037 -0.930 + + 111 iasi_metop-a 55 -0.342279E-01 + -0.883 -0.902 -0.935 -0.935 -0.860 -0.849 -0.888 -0.974 -0.867 -0.841 + -0.867 -0.907 -0.852 -0.826 -0.845 -0.927 -0.859 -0.834 -0.902 -0.874 + -0.893 -0.837 -0.864 -0.955 -0.909 -0.930 -1.022 -1.073 -0.991 -0.940 + -0.579 -0.619 -0.532 -0.472 -0.518 -0.609 -0.581 -0.629 -0.458 -0.563 + -0.509 -0.493 -0.587 -0.563 -0.542 -0.522 -0.476 -0.578 -0.441 -0.502 + -0.541 -0.509 -0.462 -0.389 -0.502 -0.561 -0.523 -0.523 -0.512 -0.558 + -0.527 -0.544 -0.470 -0.630 -0.546 -0.532 -0.466 -0.551 -0.596 -0.556 + -0.476 -0.564 -0.480 -0.522 -0.517 -0.530 -0.593 -0.587 -0.521 -0.551 + -0.499 -0.479 -0.543 -0.561 -0.554 -0.497 -0.547 -0.586 -0.559 -0.494 + + 112 iasi_metop-a 56 -0.256606E-01 + -0.477 -0.505 -0.503 -0.504 -0.475 -0.477 -0.521 -0.551 -0.520 -0.535 + -0.491 -0.502 -0.511 -0.539 -0.548 -0.559 -0.565 -0.579 -0.600 -0.583 + -0.609 -0.608 -0.635 -0.647 -0.590 -0.646 -0.774 -0.787 -0.726 -0.747 + -0.375 -0.422 -0.413 -0.386 -0.341 -0.446 -0.496 -0.522 -0.372 -0.475 + -0.411 -0.340 -0.486 -0.478 -0.452 -0.438 -0.351 -0.441 -0.408 -0.459 + -0.449 -0.414 -0.427 -0.324 -0.462 -0.446 -0.461 -0.474 -0.361 -0.455 + -0.472 -0.503 -0.382 -0.519 -0.443 -0.442 -0.317 -0.446 -0.495 -0.465 + -0.479 -0.462 -0.375 -0.529 -0.439 -0.421 -0.467 -0.507 -0.442 -0.474 + -0.372 -0.397 -0.419 -0.503 -0.400 -0.333 -0.430 -0.451 -0.379 -0.370 + + 113 iasi_metop-a 57 -0.220208E-01 + -0.325 -0.400 -0.347 -0.342 -0.295 -0.319 -0.337 -0.366 -0.337 -0.348 + -0.330 -0.309 -0.331 -0.338 -0.353 -0.323 -0.364 -0.364 -0.371 -0.344 + -0.379 -0.385 -0.351 -0.361 -0.314 -0.389 -0.440 -0.468 -0.390 -0.465 + -0.240 -0.253 -0.289 -0.292 -0.223 -0.251 -0.382 -0.397 -0.234 -0.309 + -0.286 -0.252 -0.317 -0.291 -0.312 -0.368 -0.215 -0.200 -0.280 -0.361 + -0.289 -0.279 -0.339 -0.245 -0.319 -0.259 -0.296 -0.390 -0.213 -0.245 + -0.344 -0.377 -0.261 -0.362 -0.265 -0.363 -0.182 -0.265 -0.315 -0.360 + -0.342 -0.300 -0.246 -0.424 -0.273 -0.288 -0.319 -0.401 -0.319 -0.286 + -0.265 -0.321 -0.295 -0.369 -0.288 -0.266 -0.321 -0.242 -0.240 -0.278 + + 114 iasi_metop-a 59 -0.437066E-01 + -0.449 -0.456 -0.506 -0.514 -0.456 -0.453 -0.458 -0.431 -0.389 -0.435 + -0.412 -0.399 -0.412 -0.423 -0.421 -0.381 -0.385 -0.353 -0.412 -0.401 + -0.376 -0.391 -0.399 -0.404 -0.288 -0.363 -0.414 -0.455 -0.365 -0.383 + -0.839 -0.969 -0.923 -0.952 -0.866 -0.834 -0.875 -0.846 -0.876 -0.812 + -0.951 -0.859 -0.803 -0.843 -0.896 -0.830 -0.828 -0.793 -0.822 -0.801 + -0.798 -0.840 -0.886 -0.759 -0.904 -0.890 -0.777 -0.828 -0.738 -0.846 + -0.857 -0.801 -0.776 -0.852 -0.862 -0.888 -0.830 -0.883 -0.875 -0.828 + -0.693 -0.867 -0.826 -0.886 -0.805 -0.845 -0.914 -0.884 -0.830 -0.880 + -0.912 -0.837 -0.838 -0.970 -0.815 -0.890 -0.913 -0.837 -0.875 -0.873 + + 115 iasi_metop-a 61 -0.360940E-01 + -0.734 -0.718 -0.720 -0.782 -0.682 -0.646 -0.696 -0.748 -0.706 -0.683 + -0.706 -0.688 -0.698 -0.647 -0.707 -0.778 -0.730 -0.664 -0.757 -0.718 + -0.748 -0.684 -0.753 -0.762 -0.743 -0.710 -0.848 -0.934 -0.767 -0.805 + -0.393 -0.482 -0.353 -0.346 -0.360 -0.441 -0.361 -0.403 -0.341 -0.393 + -0.300 -0.324 -0.332 -0.387 -0.344 -0.276 -0.332 -0.356 -0.293 -0.306 + -0.310 -0.396 -0.371 -0.357 -0.355 -0.412 -0.387 -0.361 -0.358 -0.387 + -0.361 -0.392 -0.333 -0.319 -0.369 -0.329 -0.303 -0.413 -0.364 -0.334 + -0.310 -0.472 -0.356 -0.323 -0.286 -0.380 -0.411 -0.322 -0.383 -0.414 + -0.364 -0.383 -0.345 -0.397 -0.331 -0.374 -0.353 -0.380 -0.406 -0.314 + + 116 iasi_metop-a 62 -0.278717E-01 + -0.461 -0.448 -0.471 -0.482 -0.409 -0.423 -0.448 -0.460 -0.422 -0.457 + -0.419 -0.438 -0.444 -0.467 -0.456 -0.458 -0.449 -0.478 -0.496 -0.465 + -0.465 -0.499 -0.544 -0.547 -0.488 -0.529 -0.595 -0.627 -0.562 -0.584 + -0.472 -0.524 -0.459 -0.455 -0.387 -0.497 -0.453 -0.489 -0.391 -0.472 + -0.368 -0.473 -0.394 -0.484 -0.461 -0.466 -0.422 -0.496 -0.438 -0.403 + -0.466 -0.482 -0.395 -0.530 -0.434 -0.474 -0.500 -0.430 -0.424 -0.469 + -0.437 -0.521 -0.448 -0.450 -0.493 -0.431 -0.402 -0.487 -0.446 -0.439 + -0.400 -0.521 -0.455 -0.399 -0.371 -0.469 -0.501 -0.486 -0.424 -0.484 + -0.424 -0.467 -0.467 -0.466 -0.460 -0.458 -0.394 -0.408 -0.468 -0.386 + + 117 iasi_metop-a 63 -0.217266E-01 + -0.384 -0.412 -0.371 -0.392 -0.351 -0.402 -0.355 -0.417 -0.380 -0.392 + -0.356 -0.378 -0.376 -0.384 -0.380 -0.393 -0.400 -0.419 -0.417 -0.391 + -0.409 -0.406 -0.458 -0.437 -0.401 -0.453 -0.484 -0.502 -0.440 -0.486 + -0.365 -0.376 -0.388 -0.389 -0.297 -0.411 -0.378 -0.390 -0.371 -0.364 + -0.309 -0.379 -0.321 -0.352 -0.374 -0.509 -0.403 -0.435 -0.407 -0.415 + -0.388 -0.421 -0.313 -0.417 -0.386 -0.376 -0.441 -0.435 -0.357 -0.413 + -0.358 -0.439 -0.409 -0.395 -0.421 -0.391 -0.305 -0.464 -0.367 -0.341 + -0.358 -0.442 -0.375 -0.369 -0.342 -0.391 -0.444 -0.468 -0.361 -0.434 + -0.345 -0.413 -0.425 -0.402 -0.409 -0.445 -0.345 -0.322 -0.343 -0.388 + + 118 iasi_metop-a 66 -0.411871E-01 + -0.526 -0.595 -0.584 -0.575 -0.528 -0.578 -0.514 -0.513 -0.460 -0.550 + -0.435 -0.455 -0.472 -0.442 -0.431 -0.423 -0.419 -0.444 -0.439 -0.389 + -0.401 -0.413 -0.470 -0.429 -0.334 -0.388 -0.437 -0.425 -0.352 -0.420 + -1.484 -1.521 -1.516 -1.570 -1.451 -1.624 -1.744 -1.526 -1.603 -1.630 + -1.636 -1.573 -1.577 -1.588 -1.749 -1.504 -1.611 -1.668 -1.762 -1.598 + -1.755 -1.679 -1.683 -1.705 -1.628 -1.769 -1.719 -1.735 -1.624 -1.693 + -1.682 -1.564 -1.693 -1.758 -1.703 -1.592 -1.635 -1.693 -1.735 -1.785 + -1.638 -1.689 -1.623 -1.634 -1.515 -1.656 -1.688 -1.517 -1.520 -1.554 + -1.579 -1.504 -1.564 -1.600 -1.459 -1.511 -1.528 -1.602 -1.537 -1.411 + + 119 iasi_metop-a 68 -0.270868E-01 + -0.703 -0.685 -0.602 -0.713 -0.702 -0.643 -0.624 -0.744 -0.722 -0.745 + -0.800 -0.783 -0.764 -0.768 -0.760 -0.841 -0.838 -0.854 -0.795 -0.802 + -0.910 -0.867 -0.832 -0.805 -0.916 -0.903 -0.955 -0.993 -0.912 -0.936 + -0.395 -0.485 -0.441 -0.464 -0.454 -0.539 -0.600 -0.502 -0.425 -0.468 + -0.487 -0.511 -0.461 -0.470 -0.456 -0.442 -0.442 -0.477 -0.492 -0.512 + -0.460 -0.541 -0.436 -0.510 -0.531 -0.464 -0.474 -0.423 -0.515 -0.525 + -0.415 -0.431 -0.360 -0.491 -0.442 -0.478 -0.455 -0.528 -0.508 -0.514 + -0.344 -0.527 -0.477 -0.464 -0.431 -0.406 -0.441 -0.460 -0.369 -0.493 + -0.484 -0.502 -0.463 -0.516 -0.506 -0.428 -0.456 -0.471 -0.482 -0.454 + + 120 iasi_metop-a 70 -0.325050E-01 + -0.760 -0.700 -0.828 -0.797 -0.654 -0.763 -0.718 -0.668 -0.609 -0.704 + -0.619 -0.590 -0.596 -0.623 -0.679 -0.584 -0.567 -0.604 -0.615 -0.524 + -0.560 -0.572 -0.623 -0.580 -0.532 -0.606 -0.584 -0.570 -0.527 -0.593 + -1.004 -1.004 -0.999 -1.034 -0.926 -1.024 -1.065 -1.035 -0.905 -0.964 + -0.935 -1.090 -0.960 -0.959 -1.014 -0.999 -0.861 -0.941 -0.999 -0.993 + -0.979 -0.978 -0.948 -0.941 -0.942 -0.945 -0.987 -1.024 -0.949 -0.964 + -0.975 -0.893 -0.926 -0.907 -0.977 -0.977 -0.952 -0.913 -1.009 -1.031 + -0.898 -0.884 -0.906 -1.038 -0.857 -0.842 -0.857 -0.911 -0.824 -0.910 + -1.011 -0.931 -0.919 -0.924 -1.012 -0.945 -0.906 -0.943 -1.009 -0.962 + + 121 iasi_metop-a 72 -0.528418E-01 + -1.231 -1.220 -1.369 -1.377 -1.158 -1.286 -1.279 -1.258 -1.109 -1.250 + -1.169 -1.278 -1.130 -1.182 -1.250 -1.235 -1.154 -1.165 -1.235 -1.166 + -1.152 -1.158 -1.248 -1.242 -1.179 -1.193 -1.270 -1.279 -1.173 -1.154 + -2.009 -2.007 -1.924 -1.891 -1.914 -2.030 -1.938 -1.869 -1.926 -1.950 + -1.938 -1.923 -1.870 -1.880 -1.910 -1.831 -1.843 -1.889 -1.917 -1.728 + -1.962 -1.965 -1.795 -1.759 -1.870 -1.933 -1.853 -1.861 -1.750 -1.894 + -1.852 -1.753 -1.849 -1.794 -1.849 -1.730 -1.914 -1.856 -1.784 -1.814 + -1.866 -1.926 -1.807 -1.841 -1.774 -1.868 -1.749 -1.830 -1.832 -1.844 + -1.872 -1.859 -1.932 -1.864 -1.829 -1.933 -1.851 -1.958 -1.944 -1.835 + + 122 iasi_metop-a 74 -0.393777E-01 + -1.489 -1.544 -1.487 -1.503 -1.514 -1.440 -1.453 -1.598 -1.547 -1.496 + -1.497 -1.584 -1.528 -1.415 -1.543 -1.610 -1.601 -1.536 -1.554 -1.631 + -1.647 -1.549 -1.569 -1.662 -1.729 -1.611 -1.924 -2.025 -1.691 -1.732 + -0.939 -0.980 -0.929 -0.880 -0.906 -1.016 -0.919 -0.840 -0.891 -0.894 + -0.852 -0.918 -0.863 -0.947 -0.835 -0.801 -0.873 -0.865 -0.880 -0.814 + -0.931 -0.904 -0.899 -0.790 -0.857 -0.901 -0.882 -0.871 -0.775 -0.877 + -0.878 -0.790 -0.846 -0.901 -0.874 -0.788 -0.854 -0.955 -0.819 -0.831 + -0.884 -0.913 -0.816 -0.746 -0.753 -0.793 -0.872 -0.815 -0.866 -0.851 + -0.874 -0.820 -0.845 -0.887 -0.868 -0.877 -0.901 -0.953 -0.992 -0.848 + + 123 iasi_metop-a 76 -0.303677E-01 + -0.832 -0.850 -0.843 -0.839 -0.813 -0.854 -0.807 -0.829 -0.839 -0.844 + -0.783 -0.821 -0.864 -0.854 -0.872 -0.853 -0.909 -0.862 -0.871 -0.843 + -0.890 -0.884 -0.899 -0.901 -0.948 -0.943 -1.031 -1.030 -0.957 -0.957 + -0.569 -0.593 -0.591 -0.661 -0.588 -0.646 -0.652 -0.648 -0.578 -0.620 + -0.622 -0.616 -0.566 -0.622 -0.617 -0.590 -0.633 -0.552 -0.660 -0.554 + -0.575 -0.614 -0.584 -0.576 -0.650 -0.650 -0.553 -0.621 -0.551 -0.623 + -0.633 -0.596 -0.631 -0.704 -0.638 -0.611 -0.557 -0.688 -0.619 -0.627 + -0.606 -0.681 -0.601 -0.557 -0.522 -0.576 -0.605 -0.626 -0.652 -0.594 + -0.645 -0.631 -0.616 -0.615 -0.633 -0.708 -0.571 -0.656 -0.678 -0.578 + + 124 iasi_metop-a 78 -0.424775E-01 + -0.765 -0.752 -0.838 -0.804 -0.775 -0.751 -0.792 -0.771 -0.713 -0.765 + -0.729 -0.755 -0.729 -0.703 -0.791 -0.737 -0.728 -0.707 -0.767 -0.731 + -0.741 -0.734 -0.790 -0.765 -0.746 -0.756 -0.814 -0.867 -0.763 -0.789 + -0.879 -0.904 -0.844 -0.902 -0.840 -0.913 -0.923 -0.890 -0.854 -0.826 + -0.891 -0.821 -0.892 -0.835 -0.900 -0.843 -0.838 -0.771 -0.873 -0.837 + -0.870 -0.906 -0.822 -0.723 -0.829 -0.859 -0.824 -0.859 -0.804 -0.827 + -0.875 -0.745 -0.846 -0.825 -0.843 -0.802 -0.874 -0.861 -0.835 -0.857 + -0.807 -0.824 -0.810 -0.808 -0.832 -0.772 -0.828 -0.807 -0.850 -0.847 + -0.851 -0.850 -0.832 -0.837 -0.845 -0.879 -0.840 -0.887 -0.923 -0.870 + + 125 iasi_metop-a 79 -0.391146E-01 + -0.876 -0.834 -0.862 -0.878 -0.834 -0.799 -0.787 -0.851 -0.813 -0.775 + -0.814 -0.893 -0.845 -0.751 -0.859 -0.859 -0.835 -0.790 -0.843 -0.837 + -0.858 -0.796 -0.842 -0.873 -0.871 -0.847 -0.979 -1.027 -0.891 -0.904 + -0.610 -0.616 -0.506 -0.583 -0.553 -0.644 -0.684 -0.620 -0.591 -0.576 + -0.589 -0.561 -0.628 -0.565 -0.577 -0.545 -0.612 -0.518 -0.668 -0.560 + -0.648 -0.638 -0.565 -0.514 -0.568 -0.603 -0.525 -0.600 -0.568 -0.588 + -0.604 -0.561 -0.588 -0.596 -0.559 -0.554 -0.610 -0.601 -0.578 -0.617 + -0.564 -0.594 -0.581 -0.587 -0.546 -0.587 -0.580 -0.577 -0.638 -0.623 + -0.599 -0.603 -0.557 -0.671 -0.580 -0.654 -0.625 -0.656 -0.631 -0.598 + + 126 iasi_metop-a 81 -0.386903E-01 + -0.766 -0.760 -0.791 -0.772 -0.726 -0.719 -0.748 -0.739 -0.734 -0.704 + -0.728 -0.745 -0.724 -0.701 -0.719 -0.742 -0.728 -0.696 -0.700 -0.702 + -0.698 -0.706 -0.785 -0.758 -0.716 -0.725 -0.830 -0.830 -0.770 -0.804 + -0.742 -0.730 -0.709 -0.708 -0.682 -0.699 -0.775 -0.733 -0.629 -0.744 + -0.799 -0.766 -0.685 -0.685 -0.675 -0.646 -0.710 -0.600 -0.710 -0.609 + -0.765 -0.639 -0.679 -0.687 -0.699 -0.765 -0.656 -0.718 -0.679 -0.654 + -0.696 -0.606 -0.671 -0.667 -0.659 -0.686 -0.639 -0.710 -0.660 -0.668 + -0.600 -0.698 -0.672 -0.676 -0.605 -0.677 -0.673 -0.679 -0.732 -0.718 + -0.681 -0.730 -0.664 -0.713 -0.695 -0.724 -0.655 -0.750 -0.755 -0.676 + + 127 iasi_metop-a 82 -0.358180E-01 + -0.764 -0.785 -0.779 -0.802 -0.704 -0.733 -0.761 -0.791 -0.711 -0.752 + -0.750 -0.808 -0.739 -0.735 -0.771 -0.782 -0.787 -0.752 -0.772 -0.800 + -0.798 -0.807 -0.863 -0.844 -0.839 -0.849 -0.925 -0.904 -0.865 -0.893 + -0.662 -0.711 -0.573 -0.637 -0.618 -0.694 -0.657 -0.665 -0.589 -0.676 + -0.654 -0.596 -0.650 -0.659 -0.620 -0.623 -0.643 -0.565 -0.625 -0.507 + -0.654 -0.603 -0.620 -0.646 -0.674 -0.703 -0.595 -0.617 -0.590 -0.649 + -0.653 -0.594 -0.650 -0.667 -0.635 -0.643 -0.629 -0.666 -0.651 -0.628 + -0.574 -0.721 -0.636 -0.602 -0.584 -0.654 -0.574 -0.596 -0.616 -0.650 + -0.555 -0.657 -0.584 -0.637 -0.633 -0.637 -0.608 -0.687 -0.659 -0.599 + + 128 iasi_metop-a 83 -0.340356E-01 + -0.677 -0.657 -0.649 -0.637 -0.586 -0.616 -0.620 -0.647 -0.587 -0.642 + -0.615 -0.671 -0.596 -0.600 -0.629 -0.658 -0.632 -0.654 -0.646 -0.661 + -0.684 -0.644 -0.713 -0.708 -0.700 -0.709 -0.806 -0.818 -0.745 -0.772 + -0.513 -0.548 -0.435 -0.449 -0.411 -0.508 -0.518 -0.559 -0.435 -0.500 + -0.443 -0.436 -0.554 -0.477 -0.498 -0.476 -0.459 -0.416 -0.484 -0.363 + -0.414 -0.396 -0.463 -0.442 -0.519 -0.538 -0.435 -0.416 -0.472 -0.494 + -0.465 -0.485 -0.479 -0.474 -0.466 -0.508 -0.476 -0.473 -0.446 -0.475 + -0.418 -0.582 -0.451 -0.486 -0.418 -0.443 -0.446 -0.522 -0.455 -0.474 + -0.376 -0.516 -0.488 -0.452 -0.463 -0.484 -0.472 -0.486 -0.484 -0.463 + + 129 iasi_metop-a 84 -0.390012E-01 + -0.647 -0.647 -0.679 -0.670 -0.579 -0.605 -0.599 -0.611 -0.543 -0.619 + -0.581 -0.596 -0.553 -0.557 -0.593 -0.588 -0.529 -0.605 -0.571 -0.580 + -0.592 -0.551 -0.628 -0.637 -0.589 -0.624 -0.700 -0.714 -0.650 -0.652 + -0.595 -0.647 -0.540 -0.610 -0.504 -0.607 -0.593 -0.644 -0.525 -0.606 + -0.579 -0.556 -0.627 -0.573 -0.617 -0.610 -0.546 -0.505 -0.590 -0.518 + -0.503 -0.537 -0.581 -0.536 -0.609 -0.614 -0.510 -0.506 -0.547 -0.544 + -0.543 -0.609 -0.559 -0.550 -0.521 -0.646 -0.576 -0.538 -0.540 -0.523 + -0.503 -0.604 -0.588 -0.570 -0.563 -0.526 -0.592 -0.621 -0.590 -0.555 + -0.501 -0.571 -0.568 -0.547 -0.573 -0.611 -0.560 -0.608 -0.606 -0.594 + + 130 iasi_metop-a 85 -0.363047E-01 + -0.569 -0.607 -0.588 -0.605 -0.540 -0.528 -0.556 -0.596 -0.546 -0.545 + -0.553 -0.584 -0.549 -0.510 -0.602 -0.609 -0.561 -0.594 -0.612 -0.610 + -0.625 -0.581 -0.653 -0.695 -0.638 -0.646 -0.810 -0.835 -0.727 -0.724 + -0.416 -0.488 -0.357 -0.392 -0.378 -0.423 -0.398 -0.397 -0.333 -0.431 + -0.372 -0.332 -0.468 -0.448 -0.448 -0.445 -0.384 -0.359 -0.412 -0.371 + -0.363 -0.390 -0.395 -0.328 -0.453 -0.466 -0.345 -0.306 -0.368 -0.416 + -0.358 -0.473 -0.400 -0.374 -0.387 -0.433 -0.404 -0.358 -0.374 -0.375 + -0.387 -0.422 -0.424 -0.421 -0.438 -0.415 -0.453 -0.420 -0.465 -0.465 + -0.329 -0.382 -0.450 -0.464 -0.416 -0.451 -0.415 -0.459 -0.456 -0.365 + + 131 iasi_metop-a 86 -0.317946E-01 + -0.344 -0.403 -0.345 -0.360 -0.307 -0.349 -0.308 -0.359 -0.329 -0.353 + -0.349 -0.325 -0.368 -0.332 -0.378 -0.352 -0.375 -0.384 -0.412 -0.349 + -0.403 -0.395 -0.422 -0.443 -0.443 -0.456 -0.563 -0.589 -0.515 -0.515 + -0.148 -0.192 -0.135 -0.185 -0.128 -0.150 -0.216 -0.191 -0.092 -0.138 + -0.153 -0.111 -0.192 -0.190 -0.244 -0.232 -0.136 -0.110 -0.150 -0.193 + -0.168 -0.134 -0.237 -0.144 -0.171 -0.248 -0.110 -0.153 -0.165 -0.228 + -0.147 -0.307 -0.154 -0.169 -0.159 -0.238 -0.147 -0.167 -0.194 -0.187 + -0.206 -0.181 -0.207 -0.199 -0.168 -0.200 -0.252 -0.222 -0.235 -0.235 + -0.123 -0.163 -0.235 -0.240 -0.197 -0.231 -0.250 -0.163 -0.182 -0.163 + + 132 iasi_metop-a 87 -0.346245E-01 + -0.383 -0.396 -0.435 -0.410 -0.277 -0.359 -0.335 -0.288 -0.245 -0.326 + -0.268 -0.231 -0.239 -0.253 -0.251 -0.255 -0.246 -0.249 -0.297 -0.202 + -0.245 -0.232 -0.281 -0.288 -0.257 -0.276 -0.353 -0.383 -0.281 -0.290 + -0.288 -0.259 -0.286 -0.324 -0.262 -0.211 -0.383 -0.327 -0.295 -0.263 + -0.293 -0.265 -0.362 -0.263 -0.350 -0.308 -0.301 -0.212 -0.263 -0.317 + -0.279 -0.203 -0.353 -0.211 -0.276 -0.316 -0.255 -0.329 -0.316 -0.293 + -0.319 -0.393 -0.279 -0.279 -0.231 -0.370 -0.290 -0.299 -0.318 -0.328 + -0.273 -0.294 -0.294 -0.338 -0.266 -0.286 -0.357 -0.342 -0.321 -0.334 + -0.303 -0.301 -0.340 -0.310 -0.322 -0.351 -0.365 -0.279 -0.303 -0.309 + + 133 iasi_metop-a 89 -0.436421E-01 + -0.762 -0.696 -0.939 -0.910 -0.620 -0.755 -0.747 -0.664 -0.567 -0.670 + -0.624 -0.595 -0.542 -0.651 -0.615 -0.593 -0.594 -0.596 -0.626 -0.583 + -0.545 -0.554 -0.642 -0.628 -0.582 -0.545 -0.666 -0.709 -0.591 -0.593 + -1.417 -1.364 -1.305 -1.399 -1.353 -1.342 -1.359 -1.382 -1.291 -1.257 + -1.329 -1.371 -1.363 -1.261 -1.300 -1.293 -1.263 -1.240 -1.244 -1.266 + -1.306 -1.200 -1.219 -1.293 -1.265 -1.272 -1.234 -1.342 -1.263 -1.263 + -1.255 -1.293 -1.281 -1.257 -1.246 -1.339 -1.298 -1.285 -1.254 -1.334 + -1.243 -1.251 -1.279 -1.350 -1.324 -1.246 -1.332 -1.337 -1.310 -1.301 + -1.329 -1.373 -1.343 -1.263 -1.377 -1.412 -1.324 -1.329 -1.324 -1.376 + + 134 iasi_metop-a 92 -0.148899E-01 + -1.413 -1.408 -1.528 -1.507 -1.442 -1.424 -1.594 -1.489 -1.458 -1.509 + -1.550 -1.551 -1.518 -1.528 -1.602 -1.597 -1.527 -1.542 -1.647 -1.677 + -1.673 -1.570 -1.779 -1.744 -1.703 -1.673 -1.889 -1.909 -1.817 -1.795 + -3.820 -3.870 -3.743 -4.142 -3.841 -4.036 -4.339 -3.976 -4.122 -4.002 + -3.913 -4.331 -4.277 -3.933 -4.069 -4.281 -3.990 -3.926 -4.215 -3.992 + -4.324 -4.386 -4.006 -4.064 -4.314 -4.340 -4.416 -3.780 -4.323 -4.366 + -4.076 -4.053 -4.314 -4.487 -4.212 -3.930 -3.824 -4.586 -4.276 -4.163 + -4.218 -4.356 -3.982 -4.064 -4.078 -3.987 -4.168 -4.002 -4.265 -4.510 + -4.132 -4.027 -3.936 -4.174 -3.665 -3.924 -3.791 -3.883 -3.972 -3.522 + + 135 iasi_metop-a 93 -0.650288E-02 + -2.973 -3.147 -2.157 -2.427 -2.258 -2.572 -2.157 -2.612 -2.811 -2.681 + -2.278 -2.345 -1.625 -2.221 -2.265 -2.012 -2.274 -2.167 -1.146 -1.882 + -1.987 -1.695 -1.475 -1.536 -1.466 -2.018 -1.360 -1.693 -1.530 -1.451 + -0.023 0.176 0.116 -0.020 0.303 -0.053 0.130 0.077 0.096 -1.381 + 0.518 -0.042 -0.521 -0.216 -0.185 0.003 -0.216 -0.702 0.082 -0.298 + -0.179 -0.181 -0.204 -0.606 -0.059 -0.039 -0.676 -0.329 0.055 0.060 + -0.174 -0.397 -0.281 -0.628 -0.989 -0.094 0.135 -0.464 -0.004 -0.561 + -0.453 -0.566 0.078 -0.302 -0.274 -0.286 0.423 0.224 -0.158 -0.273 + -0.220 -0.170 -0.467 -0.354 -0.562 -0.148 -0.312 -0.017 -0.074 -0.161 + + 136 iasi_metop-a 95 -0.405472E-01 + -1.905 -1.523 -1.933 -1.653 -2.321 -2.316 -1.995 -2.196 -2.255 -2.284 + -2.001 -2.227 -2.312 -2.150 -2.104 -2.128 -2.217 -2.513 -2.007 -1.953 + -2.145 -2.071 -2.191 -2.120 -2.024 -1.992 -1.850 -1.463 -1.854 -1.832 + -3.930 -3.911 -3.800 -3.956 -3.668 -4.031 -4.153 -3.947 -4.061 -4.057 + -3.787 -4.096 -3.866 -3.760 -3.776 -3.950 -3.740 -3.755 -4.050 -3.763 + -4.263 -4.067 -3.683 -3.806 -4.032 -4.103 -4.027 -3.767 -4.030 -4.024 + -3.859 -3.765 -4.030 -4.139 -3.987 -3.750 -3.846 -4.157 -3.983 -3.774 + -3.799 -4.077 -3.827 -3.761 -3.839 -3.701 -3.923 -3.948 -3.974 -3.989 + -3.897 -3.891 -3.866 -4.018 -3.613 -4.036 -3.859 -3.881 -3.926 -3.755 + + 137 iasi_metop-a 97 -0.473214E-01 + -3.846 -3.837 -3.669 -3.640 -3.731 -3.773 -3.681 -3.707 -3.819 -3.666 + -3.649 -3.756 -3.598 -3.690 -3.636 -3.680 -3.652 -3.665 -3.455 -3.488 + -3.691 -3.462 -3.358 -3.368 -3.489 -3.461 -3.275 -3.187 -3.296 -3.266 + -3.456 -3.519 -3.396 -3.356 -3.351 -3.497 -3.464 -3.321 -3.423 -3.411 + -3.303 -3.341 -3.310 -3.250 -3.428 -3.310 -3.306 -3.127 -3.354 -3.215 + -3.488 -3.434 -3.205 -3.183 -3.364 -3.379 -3.349 -3.238 -3.384 -3.264 + -3.220 -3.108 -3.308 -3.417 -3.358 -3.164 -3.231 -3.407 -3.222 -3.179 + -3.115 -3.384 -3.322 -3.204 -3.214 -3.185 -3.317 -3.228 -3.369 -3.272 + -3.325 -3.346 -3.285 -3.355 -3.232 -3.389 -3.339 -3.425 -3.354 -3.397 + + 138 iasi_metop-a 99 -0.492694E-01 + -3.460 -3.411 -3.388 -3.365 -3.441 -3.469 -3.441 -3.480 -3.365 -3.413 + -3.376 -3.469 -3.324 -3.397 -3.422 -3.371 -3.321 -3.386 -3.307 -3.291 + -3.364 -3.220 -3.270 -3.258 -3.282 -3.307 -3.351 -3.355 -3.245 -3.208 + -2.966 -2.992 -2.865 -2.898 -2.838 -2.915 -2.824 -2.787 -2.755 -2.860 + -2.741 -2.759 -2.722 -2.728 -2.815 -2.757 -2.709 -2.619 -2.694 -2.624 + -2.772 -2.701 -2.640 -2.566 -2.720 -2.723 -2.684 -2.688 -2.620 -2.588 + -2.680 -2.606 -2.636 -2.756 -2.619 -2.639 -2.594 -2.743 -2.627 -2.673 + -2.567 -2.749 -2.714 -2.756 -2.579 -2.596 -2.717 -2.763 -2.726 -2.699 + -2.811 -2.784 -2.721 -2.805 -2.798 -2.860 -2.830 -2.870 -2.911 -2.837 + + 139 iasi_metop-a 101 -0.389827E-01 + -3.150 -3.170 -3.375 -3.267 -3.251 -3.204 -3.381 -3.265 -3.212 -3.279 + -3.331 -3.370 -3.322 -3.303 -3.405 -3.407 -3.267 -3.409 -3.451 -3.503 + -3.406 -3.395 -3.615 -3.562 -3.486 -3.490 -3.583 -3.561 -3.579 -3.527 + -4.254 -4.274 -4.203 -4.240 -4.105 -4.217 -4.360 -4.219 -4.182 -4.275 + -4.138 -4.170 -4.073 -4.104 -4.191 -4.161 -4.153 -4.056 -4.096 -4.012 + -4.335 -4.207 -3.993 -4.049 -4.254 -4.219 -4.165 -4.136 -4.258 -4.052 + -4.158 -4.022 -4.010 -4.292 -4.097 -4.065 -3.922 -4.181 -4.177 -4.102 + -3.871 -4.202 -4.138 -4.065 -3.939 -4.084 -4.188 -4.113 -4.047 -4.118 + -4.065 -4.051 -4.017 -4.150 -3.920 -4.055 -4.150 -4.249 -3.995 -4.110 + + 140 iasi_metop-a 103 -0.300717E-01 + -3.342 -3.332 -3.263 -3.351 -2.980 -2.974 -2.989 -3.190 -2.815 -2.733 + -2.906 -2.971 -2.609 -2.615 -2.713 -2.686 -2.610 -2.529 -2.631 -2.620 + -2.623 -2.470 -2.500 -2.547 -2.579 -2.644 -3.039 -3.177 -2.645 -2.599 + -1.722 -1.749 -1.675 -1.640 -1.686 -1.748 -1.624 -1.549 -1.576 -1.632 + -1.489 -1.561 -1.622 -1.557 -1.559 -1.540 -1.443 -1.434 -1.495 -1.403 + -1.557 -1.518 -1.490 -1.402 -1.517 -1.545 -1.422 -1.429 -1.483 -1.470 + -1.483 -1.391 -1.408 -1.462 -1.396 -1.429 -1.417 -1.479 -1.520 -1.452 + -1.328 -1.539 -1.498 -1.458 -1.416 -1.470 -1.553 -1.534 -1.524 -1.539 + -1.583 -1.580 -1.565 -1.512 -1.565 -1.591 -1.538 -1.642 -1.644 -1.661 + + 141 iasi_metop-a 104 -0.333354E-01 + -2.120 -2.065 -2.288 -2.276 -1.934 -1.950 -2.038 -2.039 -1.843 -1.852 + -1.995 -2.035 -1.861 -1.841 -1.967 -2.020 -1.923 -1.944 -2.063 -2.080 + -2.065 -1.984 -2.211 -2.203 -2.174 -2.153 -2.571 -2.600 -2.365 -2.334 + -1.202 -1.223 -1.235 -1.163 -1.161 -1.240 -1.108 -1.080 -1.068 -1.068 + -0.981 -1.039 -1.097 -1.031 -1.069 -1.063 -0.974 -0.958 -0.969 -0.943 + -1.042 -0.989 -1.002 -0.920 -0.981 -1.020 -0.933 -1.031 -0.992 -0.973 + -0.965 -0.939 -0.954 -0.966 -0.940 -0.978 -0.975 -1.005 -0.999 -0.961 + -0.906 -1.043 -0.958 -0.984 -0.928 -1.025 -1.051 -1.099 -1.052 -1.026 + -1.074 -1.097 -1.055 -1.090 -1.090 -1.092 -1.092 -1.146 -1.163 -1.178 + + 142 iasi_metop-a 106 -0.445753E-01 + -1.212 -1.220 -1.286 -1.332 -1.285 -1.253 -1.365 -1.427 -1.331 -1.360 + -1.451 -1.505 -1.459 -1.393 -1.592 -1.600 -1.534 -1.531 -1.748 -1.753 + -1.735 -1.677 -1.989 -1.998 -1.936 -1.854 -2.424 -2.462 -2.229 -2.177 + -1.277 -1.197 -1.253 -1.192 -1.231 -1.178 -1.315 -1.262 -1.185 -1.164 + -1.230 -1.196 -1.173 -1.134 -1.180 -1.089 -1.223 -1.096 -1.238 -1.061 + -1.144 -1.245 -1.159 -1.062 -1.128 -1.131 -1.208 -1.090 -1.168 -1.167 + -1.217 -1.093 -1.151 -1.244 -1.189 -1.127 -1.158 -1.265 -1.153 -1.164 + -1.099 -1.237 -1.152 -1.172 -1.143 -1.188 -1.218 -1.185 -1.123 -1.233 + -1.190 -1.142 -1.194 -1.177 -1.169 -1.147 -1.108 -1.264 -1.196 -1.192 + + 143 iasi_metop-a 109 -0.237413E-01 + -0.613 -0.649 -0.560 -0.626 -0.571 -0.514 -0.501 -0.660 -0.577 -0.572 + -0.566 -0.679 -0.621 -0.503 -0.563 -0.672 -0.681 -0.512 -0.602 -0.677 + -0.670 -0.601 -0.622 -0.699 -0.697 -0.642 -0.821 -0.910 -0.740 -0.616 + -0.333 -0.345 -0.322 -0.403 -0.301 -0.321 -0.421 -0.358 -0.247 -0.309 + -0.320 -0.358 -0.305 -0.396 -0.402 -0.350 -0.353 -0.288 -0.344 -0.290 + -0.379 -0.353 -0.342 -0.334 -0.288 -0.447 -0.354 -0.316 -0.296 -0.338 + -0.399 -0.330 -0.295 -0.453 -0.355 -0.289 -0.305 -0.379 -0.393 -0.399 + -0.295 -0.431 -0.357 -0.334 -0.304 -0.407 -0.335 -0.383 -0.283 -0.353 + -0.289 -0.342 -0.369 -0.380 -0.318 -0.317 -0.362 -0.360 -0.363 -0.321 + + 144 iasi_metop-a 110 -0.262741E-01 + -0.256 -0.280 -0.249 -0.241 -0.247 -0.210 -0.205 -0.214 -0.227 -0.258 + -0.228 -0.271 -0.237 -0.221 -0.241 -0.277 -0.240 -0.241 -0.264 -0.269 + -0.294 -0.306 -0.367 -0.349 -0.303 -0.333 -0.467 -0.489 -0.385 -0.395 + -0.128 -0.132 -0.085 -0.218 -0.112 -0.103 -0.237 -0.196 -0.090 -0.099 + -0.088 -0.189 -0.133 -0.173 -0.194 -0.165 -0.156 -0.053 -0.188 -0.168 + -0.222 -0.174 -0.204 -0.204 -0.100 -0.213 -0.151 -0.200 -0.148 -0.142 + -0.211 -0.225 -0.159 -0.197 -0.191 -0.174 -0.163 -0.229 -0.230 -0.235 + -0.165 -0.273 -0.136 -0.157 -0.165 -0.222 -0.153 -0.225 -0.162 -0.175 + -0.120 -0.180 -0.221 -0.233 -0.195 -0.147 -0.206 -0.131 -0.140 -0.115 + + 145 iasi_metop-a 111 -0.346959E-01 + -0.340 -0.385 -0.426 -0.406 -0.302 -0.339 -0.341 -0.226 -0.284 -0.318 + -0.238 -0.290 -0.249 -0.300 -0.259 -0.250 -0.231 -0.226 -0.231 -0.275 + -0.232 -0.242 -0.297 -0.277 -0.215 -0.250 -0.300 -0.327 -0.254 -0.261 + -0.703 -0.631 -0.597 -0.682 -0.591 -0.655 -0.660 -0.669 -0.528 -0.540 + -0.503 -0.651 -0.575 -0.571 -0.592 -0.572 -0.566 -0.501 -0.618 -0.577 + -0.658 -0.563 -0.556 -0.618 -0.547 -0.588 -0.569 -0.569 -0.592 -0.561 + -0.609 -0.638 -0.627 -0.514 -0.628 -0.615 -0.519 -0.617 -0.682 -0.629 + -0.556 -0.618 -0.576 -0.572 -0.527 -0.586 -0.548 -0.633 -0.615 -0.612 + -0.628 -0.618 -0.597 -0.657 -0.690 -0.686 -0.640 -0.585 -0.669 -0.642 + + 146 iasi_metop-a 113 -0.457801E-01 + -0.708 -0.773 -0.871 -0.805 -0.797 -0.804 -0.878 -0.794 -0.775 -0.795 + -0.808 -0.816 -0.796 -0.806 -0.839 -0.875 -0.846 -0.798 -0.882 -0.875 + -0.854 -0.827 -0.923 -0.959 -0.870 -0.894 -1.011 -1.012 -0.923 -0.925 + -1.228 -1.279 -1.292 -1.162 -1.141 -1.264 -1.263 -1.123 -1.179 -1.191 + -1.122 -1.197 -1.231 -1.210 -1.146 -1.106 -1.173 -1.084 -1.157 -1.049 + -1.144 -1.199 -1.088 -1.108 -1.164 -1.190 -1.151 -1.086 -1.127 -1.188 + -1.208 -1.060 -1.202 -1.159 -1.137 -1.116 -1.072 -1.244 -1.185 -1.073 + -1.102 -1.257 -1.162 -1.170 -1.060 -1.175 -1.196 -1.099 -1.098 -1.220 + -1.135 -1.081 -1.197 -1.164 -1.152 -1.196 -1.203 -1.247 -1.195 -1.177 + + 147 iasi_metop-a 116 -0.251236E-01 + -0.267 -0.336 -0.180 -0.239 -0.222 -0.264 -0.213 -0.349 -0.324 -0.305 + -0.319 -0.374 -0.365 -0.423 -0.324 -0.404 -0.487 -0.444 -0.498 -0.471 + -0.520 -0.484 -0.416 -0.473 -0.650 -0.571 -0.721 -0.772 -0.603 -0.634 + 0.038 -0.001 0.011 -0.051 -0.055 0.001 -0.079 -0.067 0.064 0.007 + -0.030 -0.070 -0.026 -0.022 -0.041 -0.131 -0.027 -0.091 -0.041 -0.001 + -0.069 -0.060 -0.080 -0.011 -0.098 -0.036 -0.058 -0.037 -0.001 -0.107 + -0.068 -0.104 -0.057 -0.099 -0.125 -0.131 -0.087 -0.162 -0.051 -0.106 + -0.060 -0.164 -0.048 -0.091 -0.111 -0.042 -0.112 -0.056 -0.071 -0.067 + 0.032 -0.019 -0.055 -0.101 -0.099 -0.070 -0.058 -0.009 0.000 -0.003 + + 148 iasi_metop-a 119 -0.473405E-01 + -0.213 -0.249 -0.302 -0.219 -0.151 -0.260 -0.231 -0.153 -0.139 -0.216 + -0.141 -0.094 -0.147 -0.152 -0.112 -0.141 -0.107 -0.167 -0.136 -0.119 + -0.138 -0.089 -0.170 -0.164 -0.083 -0.073 -0.174 -0.195 -0.114 -0.174 + -1.264 -1.327 -1.263 -1.218 -1.260 -1.328 -1.274 -1.166 -1.239 -1.190 + -1.194 -1.190 -1.218 -1.269 -1.292 -1.245 -1.138 -1.147 -1.207 -1.106 + -1.207 -1.291 -1.186 -1.162 -1.197 -1.300 -1.262 -1.180 -1.182 -1.267 + -1.276 -1.130 -1.227 -1.306 -1.218 -1.190 -1.239 -1.205 -1.201 -1.224 + -1.109 -1.268 -1.199 -1.234 -1.155 -1.197 -1.201 -1.230 -1.162 -1.270 + -1.205 -1.186 -1.219 -1.225 -1.212 -1.217 -1.199 -1.276 -1.262 -1.172 + + 149 iasi_metop-a 122 -0.242789E-01 + -0.357 -0.382 -0.319 -0.344 -0.351 -0.373 -0.271 -0.497 -0.498 -0.422 + -0.451 -0.523 -0.491 -0.455 -0.450 -0.547 -0.590 -0.576 -0.594 -0.608 + -0.692 -0.578 -0.538 -0.634 -0.720 -0.727 -0.790 -0.882 -0.728 -0.714 + -0.035 -0.090 -0.056 -0.121 -0.114 -0.016 -0.155 -0.217 -0.056 -0.152 + -0.071 -0.097 -0.136 -0.113 -0.217 -0.137 -0.127 -0.098 -0.136 -0.195 + -0.160 -0.136 -0.135 -0.157 -0.119 -0.156 -0.145 -0.163 -0.108 -0.138 + -0.115 -0.198 -0.162 -0.220 -0.161 -0.233 -0.139 -0.188 -0.191 -0.158 + -0.104 -0.197 -0.154 -0.200 -0.089 -0.173 -0.192 -0.164 -0.128 -0.121 + -0.090 -0.159 -0.184 -0.197 -0.124 -0.126 -0.163 -0.125 -0.141 -0.124 + + 150 iasi_metop-a 125 -0.480151E-01 + -0.267 -0.285 -0.271 -0.213 -0.168 -0.258 -0.268 -0.184 -0.138 -0.266 + -0.178 -0.147 -0.210 -0.213 -0.158 -0.141 -0.136 -0.179 -0.206 -0.103 + -0.151 -0.177 -0.225 -0.195 -0.130 -0.159 -0.210 -0.214 -0.169 -0.235 + -1.081 -1.088 -1.075 -1.107 -0.994 -1.123 -1.214 -1.024 -1.000 -1.093 + -1.205 -1.115 -1.159 -1.071 -1.235 -1.015 -1.065 -0.985 -1.006 -0.921 + -1.068 -1.088 -0.969 -0.979 -1.076 -1.166 -1.124 -0.943 -1.071 -1.013 + -1.092 -0.966 -1.059 -1.094 -1.058 -0.970 -1.043 -1.086 -1.125 -1.090 + -1.014 -1.106 -1.092 -1.099 -0.986 -1.039 -1.090 -1.047 -1.138 -1.128 + -1.048 -1.038 -1.037 -1.079 -1.081 -1.052 -1.038 -1.088 -1.070 -1.059 + + 151 iasi_metop-a 128 -0.240870E-01 + -0.295 -0.310 -0.248 -0.307 -0.288 -0.306 -0.227 -0.424 -0.355 -0.280 + -0.344 -0.407 -0.385 -0.310 -0.335 -0.429 -0.475 -0.422 -0.403 -0.385 + -0.496 -0.392 -0.306 -0.462 -0.503 -0.525 -0.589 -0.631 -0.553 -0.482 + -0.027 -0.125 -0.089 -0.077 -0.041 -0.099 -0.131 -0.086 -0.078 -0.126 + -0.132 -0.067 -0.107 -0.127 -0.137 -0.083 -0.081 -0.125 -0.059 -0.094 + -0.171 -0.099 -0.067 -0.013 -0.121 -0.160 -0.137 -0.093 -0.076 -0.179 + -0.139 -0.130 -0.096 -0.134 -0.103 -0.135 -0.124 -0.162 -0.125 -0.109 + -0.092 -0.202 -0.102 -0.058 -0.099 -0.154 -0.170 -0.137 -0.099 -0.100 + -0.075 -0.075 -0.170 -0.162 -0.134 -0.052 -0.112 -0.124 -0.106 -0.090 + + 152 iasi_metop-a 131 -0.415458E-01 + -0.168 -0.223 -0.123 -0.143 -0.107 -0.222 -0.176 -0.123 -0.138 -0.124 + -0.118 -0.119 -0.120 -0.159 -0.114 -0.085 -0.109 -0.127 -0.096 -0.084 + -0.127 -0.145 -0.180 -0.148 -0.096 -0.127 -0.196 -0.194 -0.119 -0.181 + -1.268 -1.061 -0.905 -1.362 -1.347 -0.819 -1.447 -1.378 -1.105 -1.195 + -1.239 -1.274 -1.037 -1.315 -0.710 -1.113 -1.399 -1.442 -0.961 -1.357 + -0.985 -1.012 -1.231 -1.327 -0.867 -1.231 -1.337 -1.268 -0.737 -1.410 + -1.203 -1.483 -1.434 -1.172 -1.248 -1.389 -1.306 -1.256 -1.047 -1.354 + -1.336 -1.169 -1.359 -1.433 -1.436 -1.343 -1.438 -1.305 -1.482 -1.425 + -1.435 -1.317 -1.395 -1.405 -1.166 -1.373 -1.314 -1.320 -1.353 -1.276 + + 153 iasi_metop-a 133 -0.339847E-01 + -1.094 -1.071 -1.101 -1.100 -1.072 -1.103 -1.049 -1.147 -1.116 -1.134 + -1.090 -1.197 -1.209 -1.129 -1.174 -1.133 -1.191 -1.133 -1.178 -1.169 + -1.223 -1.146 -1.141 -1.115 -1.210 -1.151 -1.149 -1.139 -1.164 -1.127 + -1.357 -1.394 -1.376 -1.363 -1.339 -1.388 -1.489 -1.399 -1.363 -1.496 + -1.456 -1.387 -1.473 -1.484 -1.548 -1.438 -1.457 -1.461 -1.586 -1.431 + -1.582 -1.517 -1.517 -1.444 -1.613 -1.598 -1.551 -1.451 -1.590 -1.476 + -1.545 -1.453 -1.531 -1.581 -1.546 -1.446 -1.428 -1.609 -1.583 -1.483 + -1.417 -1.571 -1.514 -1.469 -1.429 -1.538 -1.493 -1.441 -1.472 -1.478 + -1.438 -1.331 -1.371 -1.440 -1.338 -1.276 -1.403 -1.405 -1.311 -1.259 + + 154 iasi_metop-a 135 -0.240168E-01 + -0.346 -0.384 -0.283 -0.281 -0.364 -0.439 -0.363 -0.454 -0.484 -0.520 + -0.521 -0.606 -0.622 -0.545 -0.560 -0.603 -0.676 -0.689 -0.663 -0.635 + -0.729 -0.703 -0.673 -0.701 -0.765 -0.770 -0.882 -0.892 -0.803 -0.837 + -0.165 -0.121 -0.177 -0.146 -0.103 -0.119 -0.294 -0.229 -0.144 -0.129 + -0.253 -0.144 -0.168 -0.216 -0.192 -0.302 -0.173 -0.189 -0.208 -0.229 + -0.225 -0.185 -0.235 -0.184 -0.199 -0.241 -0.183 -0.198 -0.226 -0.220 + -0.234 -0.256 -0.202 -0.254 -0.250 -0.241 -0.227 -0.224 -0.244 -0.203 + -0.193 -0.242 -0.194 -0.225 -0.169 -0.129 -0.258 -0.225 -0.217 -0.199 + -0.216 -0.230 -0.194 -0.211 -0.160 -0.172 -0.254 -0.180 -0.147 -0.181 + + 155 iasi_metop-a 138 -0.473136E-01 + -0.219 -0.351 -0.273 -0.202 -0.239 -0.262 -0.236 -0.224 -0.210 -0.236 + -0.198 -0.206 -0.176 -0.227 -0.201 -0.229 -0.164 -0.175 -0.228 -0.142 + -0.182 -0.196 -0.205 -0.230 -0.119 -0.112 -0.179 -0.198 -0.132 -0.166 + -1.143 -1.140 -1.110 -1.084 -1.110 -1.156 -1.154 -1.135 -1.106 -1.031 + -1.069 -1.099 -1.108 -1.023 -1.092 -1.105 -1.073 -1.015 -1.130 -0.936 + -1.083 -1.058 -1.087 -1.020 -1.143 -1.099 -1.096 -1.084 -1.139 -1.021 + -1.069 -1.037 -1.054 -1.130 -1.071 -1.007 -1.013 -1.066 -1.129 -0.972 + -1.041 -1.097 -1.057 -1.033 -1.000 -1.001 -1.078 -1.146 -1.025 -1.106 + -1.051 -1.066 -1.024 -1.068 -1.048 -1.124 -1.104 -1.089 -1.044 -1.017 + + 156 iasi_metop-a 141 -0.212569E-01 + -0.379 -0.470 -0.298 -0.352 -0.349 -0.434 -0.300 -0.385 -0.500 -0.472 + -0.413 -0.551 -0.530 -0.490 -0.434 -0.515 -0.631 -0.541 -0.527 -0.529 + -0.589 -0.577 -0.478 -0.520 -0.685 -0.666 -0.616 -0.711 -0.635 -0.650 + -0.293 -0.315 -0.267 -0.332 -0.290 -0.345 -0.429 -0.398 -0.308 -0.292 + -0.348 -0.327 -0.387 -0.362 -0.389 -0.424 -0.332 -0.331 -0.345 -0.377 + -0.366 -0.321 -0.422 -0.401 -0.425 -0.409 -0.437 -0.356 -0.341 -0.385 + -0.425 -0.410 -0.373 -0.499 -0.399 -0.406 -0.349 -0.447 -0.466 -0.435 + -0.329 -0.404 -0.409 -0.345 -0.372 -0.371 -0.390 -0.419 -0.378 -0.313 + -0.376 -0.335 -0.360 -0.389 -0.354 -0.335 -0.355 -0.342 -0.296 -0.279 + + 157 iasi_metop-a 144 -0.448907E-01 + -0.419 -0.444 -0.413 -0.376 -0.378 -0.356 -0.427 -0.299 -0.304 -0.397 + -0.329 -0.288 -0.299 -0.289 -0.272 -0.306 -0.250 -0.290 -0.260 -0.239 + -0.266 -0.259 -0.265 -0.299 -0.256 -0.249 -0.291 -0.284 -0.224 -0.276 + -1.140 -1.177 -1.192 -1.127 -1.167 -0.535 -1.271 -1.160 -1.103 -0.965 + -1.153 -1.150 -1.149 -0.943 -1.067 -1.242 -1.116 -1.013 -0.921 -1.121 + -1.123 -1.133 -1.148 -1.092 -1.184 -1.115 -1.073 -1.175 -1.080 -1.118 + -1.073 -1.096 -1.035 -1.086 -1.054 -1.049 -1.122 -1.155 -1.064 -1.146 + -1.092 -1.191 -1.104 -1.126 -1.109 -1.039 -1.089 -1.154 -1.172 -1.079 + -1.160 -1.083 -1.170 -1.091 -1.057 -1.084 -1.074 -1.240 -1.121 -1.141 + + 158 iasi_metop-a 146 -0.286318E-01 + -0.857 -0.861 -0.853 -0.904 -0.793 -0.800 -0.767 -0.881 -0.800 -0.788 + -0.785 -0.912 -0.793 -0.733 -0.784 -0.804 -0.784 -0.757 -0.719 -0.791 + -0.828 -0.696 -0.725 -0.737 -0.750 -0.739 -0.811 -0.866 -0.711 -0.718 + -0.553 -0.620 -0.526 -0.516 -0.529 -0.567 -0.526 -0.500 -0.507 -0.530 + -0.537 -0.500 -0.487 -0.528 -0.553 -0.522 -0.507 -0.460 -0.494 -0.434 + -0.463 -0.502 -0.501 -0.422 -0.497 -0.504 -0.491 -0.512 -0.513 -0.561 + -0.501 -0.531 -0.499 -0.541 -0.501 -0.526 -0.440 -0.508 -0.470 -0.484 + -0.465 -0.577 -0.489 -0.468 -0.495 -0.471 -0.505 -0.511 -0.493 -0.517 + -0.499 -0.455 -0.507 -0.549 -0.465 -0.488 -0.567 -0.519 -0.515 -0.512 + + 159 iasi_metop-a 148 -0.233622E-01 + -0.413 -0.408 -0.376 -0.359 -0.374 -0.403 -0.380 -0.386 -0.370 -0.434 + -0.403 -0.429 -0.421 -0.437 -0.412 -0.452 -0.450 -0.493 -0.490 -0.479 + -0.541 -0.488 -0.543 -0.546 -0.525 -0.564 -0.716 -0.707 -0.649 -0.679 + -0.146 -0.122 -0.161 -0.185 -0.171 -0.140 -0.201 -0.148 -0.116 -0.120 + -0.132 -0.169 -0.137 -0.184 -0.205 -0.281 -0.185 -0.153 -0.193 -0.126 + -0.184 -0.143 -0.159 -0.169 -0.204 -0.175 -0.189 -0.296 -0.151 -0.205 + -0.190 -0.244 -0.171 -0.193 -0.181 -0.279 -0.137 -0.174 -0.189 -0.175 + -0.184 -0.220 -0.148 -0.165 -0.166 -0.138 -0.174 -0.217 -0.120 -0.175 + -0.087 -0.149 -0.116 -0.199 -0.184 -0.198 -0.217 -0.152 -0.161 -0.190 + + 160 iasi_metop-a 150 -0.447775E-01 + -0.181 -0.273 -0.296 -0.267 -0.244 -0.278 -0.305 -0.220 -0.204 -0.332 + -0.204 -0.258 -0.252 -0.244 -0.237 -0.237 -0.233 -0.253 -0.229 -0.260 + -0.253 -0.256 -0.274 -0.303 -0.249 -0.241 -0.306 -0.316 -0.292 -0.290 + -1.002 -1.027 -1.004 -1.040 -1.054 -0.977 -1.041 -1.061 -1.034 -1.001 + -1.021 -1.026 -1.010 -0.921 -1.113 -1.036 -0.948 -0.957 -0.994 -0.933 + -0.938 -0.935 -0.975 -0.922 -1.051 -0.987 -1.090 -1.060 -0.963 -0.940 + -0.966 -0.953 -0.930 -0.995 -0.914 -0.961 -0.961 -0.967 -0.951 -0.975 + -0.923 -1.019 -0.968 -1.009 -0.981 -0.953 -1.010 -1.055 -0.939 -0.973 + -0.952 -1.017 -0.993 -0.977 -0.971 -1.010 -0.995 -1.010 -1.028 -1.050 + + 161 iasi_metop-a 151 -0.369470E-01 + -1.088 -1.070 -1.111 -1.129 -1.129 -1.082 -1.071 -1.040 -1.113 -1.169 + -1.061 -1.075 -1.182 -1.105 -1.110 -1.176 -1.128 -1.168 -1.102 -1.134 + -1.159 -1.158 -1.128 -1.154 -1.118 -1.142 -1.091 -1.134 -1.149 -1.110 + -1.951 -1.743 -1.356 -2.040 -1.854 -1.459 -1.206 -1.900 -1.469 -1.277 + -2.072 -1.837 -1.786 -1.878 -1.146 -1.492 -1.897 -2.256 -1.293 -2.117 + -1.081 -1.569 -1.629 -2.062 -1.356 -1.705 -1.525 -1.416 -1.340 -2.138 + -2.276 -2.269 -1.865 -1.669 -1.605 -2.325 -2.351 -1.895 -1.055 -2.280 + -2.113 -2.390 -2.137 -2.304 -2.268 -2.268 -1.736 -2.229 -2.245 -2.175 + -2.068 -2.062 -2.061 -2.207 -1.915 -1.976 -2.150 -2.281 -1.900 -2.017 + + 162 iasi_metop-a 154 -0.177585E-01 + -0.295 -0.244 -0.225 -0.265 -0.238 -0.247 -0.237 -0.325 -0.277 -0.281 + -0.288 -0.325 -0.254 -0.263 -0.384 -0.365 -0.437 -0.306 -0.467 -0.382 + -0.440 -0.482 -0.429 -0.397 -0.563 -0.564 -0.528 -0.646 -0.527 -0.516 + -0.136 -0.202 -0.185 -0.204 -0.230 -0.140 -0.255 -0.222 -0.135 -0.217 + -0.170 -0.223 -0.153 -0.196 -0.191 -0.242 -0.156 -0.194 -0.188 -0.200 + -0.250 -0.204 -0.232 -0.251 -0.171 -0.253 -0.182 -0.273 -0.205 -0.242 + -0.235 -0.201 -0.138 -0.273 -0.268 -0.214 -0.233 -0.246 -0.248 -0.236 + -0.186 -0.228 -0.245 -0.230 -0.203 -0.195 -0.241 -0.236 -0.205 -0.204 + -0.227 -0.147 -0.161 -0.199 -0.178 -0.206 -0.198 -0.193 -0.129 -0.101 + + 163 iasi_metop-a 157 -0.433331E-01 + -0.186 -0.271 -0.206 -0.269 -0.205 -0.232 -0.271 -0.211 -0.184 -0.253 + -0.197 -0.198 -0.202 -0.262 -0.168 -0.210 -0.169 -0.202 -0.211 -0.190 + -0.194 -0.150 -0.279 -0.267 -0.203 -0.196 -0.278 -0.283 -0.228 -0.242 + -1.186 -1.224 -1.096 -1.200 -1.051 -1.095 -1.226 -1.219 -1.137 -1.190 + -1.162 -1.201 -1.189 -1.011 -1.117 -1.113 -1.140 -1.115 -1.174 -1.149 + -1.147 -1.085 -1.182 -1.095 -1.062 -1.223 -1.161 -1.140 -1.190 -1.185 + -1.146 -1.135 -1.168 -1.169 -1.056 -1.025 -1.147 -1.108 -1.176 -1.039 + -1.107 -1.148 -1.179 -1.070 -1.061 -1.065 -1.178 -1.134 -1.178 -1.197 + -1.093 -1.105 -1.131 -1.073 -1.111 -1.175 -1.072 -1.212 -1.157 -1.096 + + 164 iasi_metop-a 159 -0.204520E-01 + -1.262 -1.262 -1.256 -1.292 -1.154 -1.147 -1.181 -1.287 -1.147 -1.142 + -1.132 -1.196 -1.113 -1.069 -1.091 -1.122 -1.074 -1.004 -1.082 -1.070 + -1.067 -0.999 -0.962 -0.990 -0.974 -0.983 -0.974 -1.042 -0.962 -0.929 + -0.792 -0.839 -0.729 -0.732 -0.722 -0.826 -0.726 -0.770 -0.708 -0.701 + -0.692 -0.770 -0.677 -0.701 -0.751 -0.686 -0.673 -0.729 -0.721 -0.698 + -0.763 -0.792 -0.691 -0.630 -0.712 -0.743 -0.705 -0.730 -0.699 -0.750 + -0.670 -0.660 -0.621 -0.793 -0.731 -0.677 -0.656 -0.795 -0.690 -0.719 + -0.628 -0.763 -0.764 -0.739 -0.643 -0.695 -0.716 -0.706 -0.714 -0.750 + -0.693 -0.738 -0.768 -0.711 -0.704 -0.732 -0.680 -0.750 -0.758 -0.756 + + 165 iasi_metop-a 160 -0.139290E-01 + -0.478 -0.497 -0.401 -0.419 -0.471 -0.463 -0.458 -0.518 -0.528 -0.571 + -0.572 -0.562 -0.605 -0.555 -0.584 -0.617 -0.619 -0.640 -0.652 -0.681 + -0.731 -0.689 -0.740 -0.763 -0.823 -0.829 -1.004 -1.020 -0.902 -0.880 + -0.293 -0.247 -0.270 -0.268 -0.228 -0.327 -0.285 -0.365 -0.264 -0.267 + -0.256 -0.319 -0.256 -0.274 -0.312 -0.320 -0.221 -0.308 -0.360 -0.348 + -0.350 -0.403 -0.330 -0.241 -0.293 -0.352 -0.340 -0.351 -0.320 -0.348 + -0.306 -0.342 -0.266 -0.427 -0.338 -0.321 -0.264 -0.351 -0.329 -0.336 + -0.232 -0.369 -0.371 -0.328 -0.254 -0.262 -0.306 -0.302 -0.303 -0.373 + -0.308 -0.288 -0.314 -0.314 -0.251 -0.287 -0.269 -0.245 -0.267 -0.258 + + 166 iasi_metop-a 161 -0.172021E-01 + -0.288 -0.299 -0.273 -0.259 -0.246 -0.282 -0.260 -0.219 -0.215 -0.299 + -0.272 -0.242 -0.258 -0.242 -0.219 -0.250 -0.235 -0.236 -0.271 -0.197 + -0.241 -0.245 -0.274 -0.259 -0.234 -0.265 -0.297 -0.283 -0.254 -0.261 + -0.295 -0.249 -0.327 -0.295 -0.307 -0.277 -0.334 -0.367 -0.319 -0.271 + -0.300 -0.290 -0.278 -0.284 -0.305 -0.361 -0.277 -0.251 -0.362 -0.314 + -0.334 -0.356 -0.329 -0.259 -0.295 -0.367 -0.355 -0.384 -0.342 -0.298 + -0.275 -0.368 -0.343 -0.362 -0.338 -0.390 -0.289 -0.309 -0.299 -0.359 + -0.232 -0.362 -0.326 -0.337 -0.276 -0.240 -0.298 -0.328 -0.320 -0.331 + -0.306 -0.316 -0.302 -0.344 -0.294 -0.289 -0.296 -0.247 -0.267 -0.292 + + 167 iasi_metop-a 163 -0.400169E-01 + -0.351 -0.414 -0.466 -0.441 -0.392 -0.338 -0.446 -0.327 -0.320 -0.405 + -0.348 -0.370 -0.345 -0.302 -0.306 -0.353 -0.318 -0.287 -0.357 -0.303 + -0.297 -0.257 -0.394 -0.373 -0.289 -0.305 -0.353 -0.348 -0.299 -0.291 + -1.729 -1.808 -1.884 -1.850 -1.777 -1.785 -2.027 -1.877 -1.876 -1.827 + -2.004 -1.906 -1.886 -1.800 -2.052 -1.987 -1.908 -1.885 -1.993 -1.845 + -2.040 -1.844 -1.964 -1.887 -2.046 -1.993 -2.015 -1.987 -1.859 -1.930 + -1.931 -1.939 -1.906 -1.977 -2.057 -1.899 -1.901 -1.981 -1.890 -1.898 + -1.839 -1.898 -1.891 -1.992 -1.854 -1.923 -1.856 -1.848 -1.863 -1.835 + -1.803 -1.842 -1.827 -1.758 -1.775 -1.820 -1.795 -1.824 -1.783 -1.742 + + 168 iasi_metop-a 167 -0.867281E-02 + -0.467 -0.469 -0.423 -0.442 -0.446 -0.476 -0.387 -0.491 -0.623 -0.520 + -0.592 -0.701 -0.627 -0.682 -0.646 -0.663 -0.792 -0.701 -0.699 -0.766 + -0.839 -0.798 -0.669 -0.841 -0.869 -0.891 -0.974 -1.084 -0.928 -0.969 + -0.421 -0.432 -0.414 -0.457 -0.407 -0.391 -0.451 -0.370 -0.402 -0.339 + -0.479 -0.406 -0.402 -0.462 -0.488 -0.439 -0.407 -0.433 -0.405 -0.460 + -0.453 -0.483 -0.469 -0.428 -0.418 -0.443 -0.465 -0.503 -0.485 -0.368 + -0.440 -0.466 -0.434 -0.530 -0.486 -0.426 -0.403 -0.481 -0.470 -0.450 + -0.410 -0.450 -0.484 -0.417 -0.405 -0.384 -0.444 -0.373 -0.356 -0.417 + -0.414 -0.384 -0.398 -0.379 -0.450 -0.423 -0.410 -0.372 -0.373 -0.386 + + 169 iasi_metop-a 170 -0.372961E-01 + -0.399 -0.488 -0.465 -0.433 -0.425 -0.498 -0.445 -0.403 -0.395 -0.455 + -0.382 -0.401 -0.406 -0.430 -0.397 -0.398 -0.409 -0.443 -0.369 -0.357 + -0.341 -0.384 -0.371 -0.388 -0.340 -0.381 -0.394 -0.400 -0.346 -0.368 + -1.180 -1.208 -1.100 -1.186 -1.095 -1.244 -1.204 -1.060 -1.112 -1.099 + -1.251 -1.122 -1.127 -1.075 -1.125 -1.096 -1.077 -1.087 -1.130 -1.024 + -1.104 -1.174 -1.086 -1.110 -1.138 -1.236 -1.144 -1.104 -1.076 -1.136 + -1.079 -1.074 -1.164 -1.194 -1.069 -1.091 -1.077 -1.170 -1.098 -1.135 + -1.082 -1.187 -1.159 -1.122 -1.027 -1.117 -1.071 -1.125 -1.109 -1.138 + -1.114 -1.010 -1.178 -1.114 -1.148 -1.091 -1.132 -1.169 -1.122 -1.106 + + 170 iasi_metop-a 173 -0.120682E-02 + -0.629 -0.659 -0.569 -0.600 -0.700 -0.652 -0.638 -0.692 -0.743 -0.700 + -0.673 -0.742 -0.672 -0.744 -0.710 -0.719 -0.818 -0.790 -0.711 -0.813 + -0.865 -0.809 -0.732 -0.778 -0.828 -0.819 -0.821 -0.864 -0.804 -0.847 + -0.504 -0.530 -0.532 -0.539 -0.521 -0.555 -0.569 -0.602 -0.591 -0.580 + -0.571 -0.559 -0.550 -0.572 -0.602 -0.606 -0.539 -0.558 -0.613 -0.614 + -0.574 -0.545 -0.656 -0.596 -0.584 -0.585 -0.594 -0.610 -0.609 -0.550 + -0.587 -0.595 -0.521 -0.658 -0.623 -0.490 -0.524 -0.598 -0.581 -0.554 + -0.516 -0.560 -0.557 -0.458 -0.534 -0.576 -0.574 -0.541 -0.470 -0.558 + -0.511 -0.570 -0.470 -0.509 -0.505 -0.473 -0.533 -0.536 -0.538 -0.546 + + 171 iasi_metop-a 176 -0.346708E-01 + -0.524 -0.582 -0.561 -0.499 -0.531 -0.565 -0.550 -0.528 -0.450 -0.596 + -0.521 -0.499 -0.508 -0.562 -0.453 -0.474 -0.454 -0.500 -0.492 -0.496 + -0.461 -0.503 -0.510 -0.473 -0.450 -0.488 -0.474 -0.482 -0.447 -0.466 + -1.327 -1.402 -1.404 -1.395 -1.299 -1.336 -1.482 -1.345 -1.311 -1.332 + -1.335 -1.382 -1.358 -1.281 -1.334 -1.324 -1.331 -1.285 -1.293 -1.280 + -1.328 -1.421 -1.279 -1.228 -1.395 -1.383 -1.406 -1.383 -1.356 -1.357 + -1.273 -1.210 -1.314 -1.348 -1.348 -1.256 -1.240 -1.340 -1.310 -1.313 + -1.220 -1.318 -1.297 -1.287 -1.232 -1.282 -1.309 -1.296 -1.336 -1.325 + -1.272 -1.220 -1.323 -1.315 -1.301 -1.344 -1.339 -1.389 -1.336 -1.297 + + 172 iasi_metop-a 179 -0.749147E-03 + -0.985 -0.918 -0.913 -0.959 -0.956 -0.908 -0.837 -0.950 -0.985 -0.915 + -0.911 -1.027 -0.973 -0.926 -0.929 -0.973 -1.013 -0.925 -0.897 -0.937 + -1.014 -0.927 -0.872 -0.915 -0.968 -0.982 -0.945 -1.024 -0.902 -0.925 + -0.614 -0.712 -0.722 -0.680 -0.639 -0.691 -0.690 -0.690 -0.666 -0.707 + -0.740 -0.659 -0.675 -0.655 -0.721 -0.686 -0.613 -0.646 -0.715 -0.629 + -0.693 -0.727 -0.721 -0.685 -0.635 -0.703 -0.669 -0.679 -0.676 -0.625 + -0.668 -0.686 -0.691 -0.770 -0.701 -0.583 -0.602 -0.716 -0.648 -0.654 + -0.628 -0.683 -0.637 -0.610 -0.556 -0.634 -0.645 -0.635 -0.650 -0.658 + -0.691 -0.621 -0.634 -0.617 -0.621 -0.628 -0.603 -0.633 -0.597 -0.607 + + 173 iasi_metop-a 180 0.153316E-02 + -0.567 -0.591 -0.585 -0.575 -0.581 -0.595 -0.573 -0.594 -0.622 -0.633 + -0.602 -0.604 -0.625 -0.645 -0.656 -0.624 -0.634 -0.651 -0.622 -0.618 + -0.656 -0.675 -0.722 -0.670 -0.657 -0.724 -0.734 -0.717 -0.691 -0.712 + -0.673 -0.707 -0.772 -0.716 -0.705 -0.709 -0.752 -0.717 -0.725 -0.777 + -0.765 -0.722 -0.761 -0.737 -0.788 -0.746 -0.641 -0.742 -0.786 -0.671 + -0.764 -0.805 -0.767 -0.740 -0.736 -0.743 -0.739 -0.809 -0.745 -0.662 + -0.762 -0.808 -0.744 -0.885 -0.810 -0.607 -0.664 -0.758 -0.737 -0.709 + -0.663 -0.716 -0.740 -0.705 -0.644 -0.702 -0.687 -0.644 -0.644 -0.695 + -0.774 -0.666 -0.660 -0.667 -0.657 -0.634 -0.643 -0.677 -0.622 -0.630 + + 174 iasi_metop-a 185 0.444932E-02 + -0.904 -0.875 -0.943 -0.952 -0.816 -0.850 -0.800 -0.796 -0.754 -0.799 + -0.728 -0.721 -0.698 -0.738 -0.728 -0.698 -0.682 -0.697 -0.638 -0.638 + -0.648 -0.663 -0.645 -0.586 -0.572 -0.636 -0.529 -0.558 -0.567 -0.567 + -0.934 -0.947 -0.991 -0.830 -0.873 -0.987 -0.909 -0.872 -0.936 -0.935 + -0.897 -0.946 -0.858 -0.835 -0.852 -0.875 -0.824 -0.952 -0.891 -0.891 + -0.933 -0.926 -0.934 -0.897 -0.819 -0.887 -0.836 -0.888 -0.903 -0.789 + -0.900 -0.827 -0.812 -0.963 -0.916 -0.824 -0.801 -0.822 -0.863 -0.807 + -0.865 -0.810 -0.857 -0.793 -0.799 -0.818 -0.797 -0.781 -0.845 -0.859 + -0.797 -0.814 -0.781 -0.835 -0.818 -0.791 -0.762 -0.862 -0.891 -0.838 + + 175 iasi_metop-a 187 0.302890E-02 + -0.655 -0.714 -0.642 -0.620 -0.713 -0.688 -0.692 -0.675 -0.705 -0.760 + -0.774 -0.741 -0.740 -0.772 -0.774 -0.766 -0.809 -0.851 -0.809 -0.810 + -0.841 -0.850 -0.896 -0.883 -0.879 -0.927 -1.012 -1.025 -0.937 -0.981 + -0.654 -0.607 -0.697 -0.637 -0.724 -0.665 -0.627 -0.686 -0.684 -0.691 + -0.739 -0.692 -0.627 -0.656 -0.711 -0.693 -0.708 -0.676 -0.681 -0.657 + -0.754 -0.774 -0.715 -0.699 -0.707 -0.716 -0.738 -0.787 -0.765 -0.649 + -0.700 -0.737 -0.636 -0.674 -0.718 -0.642 -0.626 -0.681 -0.699 -0.659 + -0.584 -0.648 -0.678 -0.635 -0.647 -0.596 -0.620 -0.636 -0.595 -0.647 + -0.637 -0.642 -0.602 -0.574 -0.606 -0.606 -0.614 -0.632 -0.659 -0.617 + + 176 iasi_metop-a 191 -0.159199E-02 + -0.957 -0.962 -1.082 -1.045 -0.879 -0.927 -0.876 -0.813 -0.791 -0.838 + -0.772 -0.779 -0.724 -0.767 -0.729 -0.683 -0.688 -0.669 -0.672 -0.663 + -0.664 -0.667 -0.598 -0.632 -0.580 -0.589 -0.547 -0.563 -0.548 -0.537 + -1.025 -1.010 -1.032 -0.897 -0.953 -1.023 -0.978 -0.957 -0.916 -0.965 + -0.933 -0.933 -0.889 -0.942 -0.946 -0.938 -0.930 -0.871 -0.951 -0.863 + -0.946 -0.877 -0.937 -0.918 -0.885 -0.911 -0.884 -0.927 -0.911 -0.865 + -0.929 -0.943 -0.837 -0.917 -0.917 -0.803 -0.858 -0.970 -0.937 -0.872 + -0.824 -0.907 -0.930 -0.833 -0.870 -0.875 -0.904 -0.943 -0.866 -0.873 + -0.889 -0.921 -0.859 -0.868 -0.849 -0.893 -0.911 -0.935 -0.968 -0.935 + + 177 iasi_metop-a 193 0.169943E-01 + -0.732 -0.766 -0.729 -0.716 -0.835 -0.803 -0.806 -0.820 -0.837 -0.852 + -0.911 -0.925 -0.911 -0.885 -0.953 -0.988 -0.956 -0.996 -1.038 -1.049 + -1.074 -1.066 -1.181 -1.169 -1.174 -1.199 -1.435 -1.443 -1.320 -1.330 + -0.702 -0.720 -0.738 -0.671 -0.669 -0.744 -0.723 -0.744 -0.765 -0.723 + -0.744 -0.693 -0.693 -0.711 -0.726 -0.753 -0.742 -0.777 -0.759 -0.737 + -0.749 -0.784 -0.805 -0.777 -0.693 -0.739 -0.708 -0.705 -0.786 -0.635 + -0.722 -0.696 -0.639 -0.744 -0.762 -0.619 -0.706 -0.717 -0.753 -0.712 + -0.628 -0.681 -0.704 -0.640 -0.697 -0.636 -0.598 -0.618 -0.615 -0.757 + -0.646 -0.608 -0.613 -0.607 -0.598 -0.611 -0.627 -0.644 -0.612 -0.604 + + 178 iasi_metop-a 197 -0.839248E-02 + -0.701 -0.813 -1.126 -0.992 -0.633 -0.630 -0.623 -0.578 -0.574 -0.583 + -0.573 -0.564 -0.564 -0.588 -0.541 -0.568 -0.523 -0.563 -0.499 -0.501 + -0.491 -0.514 -0.480 -0.483 -0.501 -0.526 -0.481 -0.473 -0.459 -0.471 + -1.641 -1.730 -0.177 -1.084 -1.395 -0.592 -0.510 -0.812 -0.618 -0.633 + -0.666 -0.935 -0.565 -0.493 -0.333 -0.391 -0.183 -1.204 0.000 -0.636 + 0.000 -0.433 -0.272 -0.312 -0.149 -0.373 -0.263 -0.486 -0.136 -0.707 + -0.731 -1.356 -0.980 -0.527 -0.684 -1.018 -0.912 -0.263 -0.168 -0.620 + -1.355 -1.004 -0.281 -1.228 -1.470 -1.365 -0.835 -1.628 -0.776 -1.547 + -1.127 -1.922 -2.161 -1.720 -2.412 -3.333 -3.814 -1.263 -3.982 -3.918 + + 179 iasi_metop-a 199 0.295848E-01 + -0.571 -0.550 -0.552 -0.572 -0.638 -0.566 -0.582 -0.490 -0.681 -0.631 + -0.627 -0.655 -0.621 -0.595 -0.723 -0.696 -0.666 -0.715 -0.721 -0.710 + -0.845 -0.737 -0.933 -1.125 -1.154 -1.203 -3.093 -3.157 -2.153 -2.185 + -0.672 -0.684 -0.616 -0.619 -0.617 -0.742 -0.662 -0.675 -0.762 -0.748 + -0.683 -0.679 -0.605 -0.626 -0.692 -0.565 -0.692 -0.657 -0.764 -0.679 + -0.622 -0.726 -0.765 -0.692 -0.623 -0.719 -0.670 -0.705 -0.699 -0.603 + -0.671 -0.588 -0.647 -0.711 -0.651 -0.546 -0.616 -0.681 -0.669 -0.618 + -0.610 -0.631 -0.680 -0.551 -0.609 -0.606 -0.572 -0.569 -0.559 -0.620 + -0.587 -0.580 -0.538 -0.576 -0.518 -0.529 -0.501 -0.622 -0.549 -0.565 + + 180 iasi_metop-a 200 0.140102E-01 + -0.596 -0.596 -0.618 -0.585 -0.586 -0.612 -0.551 -0.501 -0.598 -0.593 + -0.568 -0.589 -0.581 -0.582 -0.546 -0.518 -0.584 -0.588 -0.524 -0.547 + -0.525 -0.507 -0.542 -0.531 -0.507 -0.565 -0.501 -0.470 -0.500 -0.502 + -0.636 -0.704 -0.630 -0.646 -0.648 -0.714 -0.706 -0.696 -0.699 -0.706 + -0.723 -0.706 -0.643 -0.684 -0.681 -0.642 -0.672 -0.663 -0.742 -0.629 + -0.668 -0.745 -0.761 -0.703 -0.622 -0.729 -0.693 -0.721 -0.712 -0.612 + -0.704 -0.633 -0.643 -0.754 -0.645 -0.590 -0.640 -0.694 -0.641 -0.618 + -0.619 -0.649 -0.724 -0.590 -0.623 -0.604 -0.618 -0.587 -0.600 -0.595 + -0.638 -0.590 -0.543 -0.598 -0.560 -0.550 -0.565 -0.641 -0.567 -0.579 + + 181 iasi_metop-a 202 -0.242702E-01 + -0.772 -0.810 -0.823 -0.796 -0.772 -0.783 -0.733 -0.652 -0.696 -0.760 + -0.680 -0.721 -0.693 -0.746 -0.701 -0.629 -0.678 -0.690 -0.632 -0.647 + -0.606 -0.646 -0.639 -0.624 -0.610 -0.657 -0.607 -0.584 -0.592 -0.580 + -1.223 -1.221 -1.242 -1.185 -1.197 -1.273 -1.253 -1.178 -1.161 -1.138 + -1.198 -1.191 -1.121 -1.124 -1.130 -1.138 -1.101 -1.108 -1.132 -0.996 + -1.165 -1.149 -1.099 -1.110 -1.146 -1.143 -1.104 -1.156 -1.140 -1.129 + -1.154 -1.025 -1.097 -1.126 -1.130 -1.066 -1.010 -1.174 -1.126 -1.100 + -1.063 -1.161 -1.144 -1.105 -1.091 -1.080 -1.149 -1.099 -1.131 -1.136 + -1.105 -1.117 -1.139 -1.116 -1.132 -1.180 -1.081 -1.195 -1.144 -1.173 + + 182 iasi_metop-a 203 -0.108542E-01 + -1.435 -1.428 -1.574 -1.497 -1.427 -1.449 -1.484 -1.407 -1.318 -1.406 + -1.372 -1.370 -1.309 -1.361 -1.349 -1.365 -1.307 -1.328 -1.313 -1.351 + -1.305 -1.313 -1.302 -1.318 -1.273 -1.247 -1.370 -1.384 -1.318 -1.300 + -1.256 -1.213 -1.167 -1.090 -1.128 -1.242 -1.155 -1.160 -1.103 -1.162 + -1.093 -1.151 -1.116 -1.081 -1.035 -1.073 -1.003 -1.033 -1.112 -0.993 + -1.064 -1.146 -1.072 -1.021 -1.056 -1.105 -1.072 -1.075 -1.014 -1.051 + -1.015 -0.993 -1.035 -1.047 -1.023 -0.969 -1.020 -1.049 -1.046 -1.011 + -0.981 -1.081 -1.095 -1.025 -0.949 -0.991 -1.082 -1.057 -1.031 -1.012 + -1.125 -1.074 -1.011 -1.098 -1.071 -1.132 -1.070 -1.101 -1.172 -1.097 + + 183 iasi_metop-a 205 0.350008E-01 + -0.877 -0.930 -0.853 -0.848 -1.001 -0.906 -0.962 -0.994 -0.996 -0.954 + -1.094 -1.124 -1.108 -1.062 -1.106 -1.204 -1.134 -1.178 -1.170 -1.300 + -1.293 -1.227 -1.342 -1.370 -1.380 -1.405 -1.701 -1.699 -1.530 -1.516 + -0.497 -0.452 -0.485 -0.464 -0.376 -0.585 -0.454 -0.520 -0.504 -0.461 + -0.556 -0.518 -0.404 -0.465 -0.432 -0.392 -0.446 -0.513 -0.566 -0.417 + -0.529 -0.471 -0.610 -0.563 -0.445 -0.558 -0.538 -0.501 -0.451 -0.507 + -0.486 -0.478 -0.489 -0.492 -0.460 -0.418 -0.487 -0.537 -0.458 -0.437 + -0.428 -0.483 -0.501 -0.395 -0.424 -0.453 -0.400 -0.392 -0.416 -0.512 + -0.451 -0.449 -0.357 -0.443 -0.376 -0.390 -0.384 -0.444 -0.476 -0.368 + + 184 iasi_metop-a 207 0.866431E-02 + -0.707 -0.677 -0.738 -0.701 -0.628 -0.684 -0.598 -0.563 -0.626 -0.636 + -0.624 -0.622 -0.637 -0.594 -0.555 -0.579 -0.554 -0.573 -0.552 -0.576 + -0.557 -0.556 -0.553 -0.536 -0.505 -0.529 -0.516 -0.475 -0.492 -0.526 + -0.732 -0.705 -0.753 -0.681 -0.656 -0.796 -0.676 -0.711 -0.766 -0.814 + -0.719 -0.713 -0.713 -0.724 -0.680 -0.656 -0.647 -0.728 -0.798 -0.686 + -0.731 -0.721 -0.787 -0.746 -0.651 -0.749 -0.736 -0.717 -0.720 -0.679 + -0.711 -0.697 -0.689 -0.649 -0.672 -0.696 -0.684 -0.675 -0.676 -0.666 + -0.666 -0.699 -0.736 -0.613 -0.638 -0.676 -0.704 -0.664 -0.625 -0.676 + -0.705 -0.697 -0.585 -0.680 -0.612 -0.637 -0.652 -0.672 -0.703 -0.621 + + 185 iasi_metop-a 210 0.127717E-01 + -0.902 -0.911 -0.982 -0.991 -0.805 -0.842 -0.801 -0.776 -0.711 -0.776 + -0.753 -0.756 -0.689 -0.720 -0.717 -0.719 -0.658 -0.704 -0.698 -0.708 + -0.676 -0.694 -0.704 -0.691 -0.679 -0.712 -0.745 -0.719 -0.682 -0.700 + -0.559 -0.578 -0.540 -0.541 -0.551 -0.548 -0.584 -0.579 -0.546 -0.555 + -0.553 -0.571 -0.506 -0.505 -0.502 -0.527 -0.517 -0.539 -0.533 -0.531 + -0.456 -0.412 -0.555 -0.551 -0.456 -0.511 -0.530 -0.546 -0.499 -0.481 + -0.505 -0.480 -0.530 -0.400 -0.462 -0.480 -0.497 -0.474 -0.497 -0.510 + -0.467 -0.532 -0.515 -0.479 -0.458 -0.481 -0.513 -0.562 -0.510 -0.482 + -0.520 -0.524 -0.499 -0.498 -0.430 -0.501 -0.472 -0.521 -0.571 -0.546 + + 186 iasi_metop-a 212 0.385609E-01 + -0.527 -0.534 -0.534 -0.545 -0.569 -0.557 -0.550 -0.579 -0.577 -0.542 + -0.655 -0.601 -0.579 -0.547 -0.680 -0.732 -0.605 -0.652 -0.771 -0.786 + -0.749 -0.725 -0.902 -0.913 -0.856 -0.813 -1.148 -1.115 -0.994 -1.015 + -0.484 -0.541 -0.492 -0.443 -0.412 -0.543 -0.423 -0.503 -0.557 -0.555 + -0.539 -0.466 -0.492 -0.482 -0.434 -0.405 -0.454 -0.590 -0.531 -0.481 + -0.430 -0.451 -0.586 -0.610 -0.425 -0.541 -0.518 -0.451 -0.494 -0.532 + -0.472 -0.469 -0.496 -0.584 -0.445 -0.389 -0.486 -0.489 -0.483 -0.500 + -0.521 -0.481 -0.539 -0.359 -0.426 -0.484 -0.401 -0.406 -0.433 -0.531 + -0.437 -0.402 -0.425 -0.425 -0.354 -0.334 -0.339 -0.483 -0.513 -0.383 + + 187 iasi_metop-a 213 0.286784E-01 + -0.574 -0.573 -0.585 -0.571 -0.570 -0.585 -0.520 -0.488 -0.564 -0.516 + -0.532 -0.468 -0.487 -0.470 -0.494 -0.471 -0.459 -0.514 -0.476 -0.514 + -0.455 -0.465 -0.479 -0.486 -0.411 -0.459 -0.459 -0.463 -0.449 -0.465 + -0.585 -0.649 -0.593 -0.561 -0.574 -0.656 -0.561 -0.649 -0.663 -0.679 + -0.642 -0.581 -0.605 -0.647 -0.568 -0.541 -0.539 -0.688 -0.654 -0.601 + -0.509 -0.618 -0.659 -0.646 -0.568 -0.651 -0.613 -0.581 -0.599 -0.614 + -0.593 -0.591 -0.558 -0.661 -0.603 -0.514 -0.562 -0.617 -0.586 -0.607 + -0.609 -0.615 -0.612 -0.532 -0.533 -0.588 -0.552 -0.527 -0.564 -0.675 + -0.563 -0.506 -0.526 -0.557 -0.527 -0.490 -0.522 -0.593 -0.614 -0.530 + + 188 iasi_metop-a 214 0.270726E-02 + -0.909 -0.909 -0.936 -0.910 -0.831 -0.852 -0.819 -0.777 -0.810 -0.817 + -0.772 -0.755 -0.754 -0.720 -0.765 -0.710 -0.708 -0.762 -0.746 -0.722 + -0.706 -0.701 -0.689 -0.720 -0.654 -0.703 -0.667 -0.652 -0.659 -0.676 + -0.843 -0.869 -0.850 -0.809 -0.852 -0.906 -0.858 -0.885 -0.834 -0.885 + -0.826 -0.818 -0.828 -0.874 -0.841 -0.805 -0.774 -0.882 -0.860 -0.827 + -0.769 -0.849 -0.880 -0.838 -0.791 -0.904 -0.808 -0.870 -0.811 -0.798 + -0.832 -0.766 -0.776 -0.904 -0.815 -0.750 -0.779 -0.840 -0.851 -0.837 + -0.764 -0.822 -0.834 -0.811 -0.752 -0.782 -0.819 -0.756 -0.810 -0.828 + -0.825 -0.779 -0.780 -0.788 -0.798 -0.803 -0.809 -0.813 -0.874 -0.826 + + 189 iasi_metop-a 217 0.315427E-01 + -0.566 -0.601 -0.588 -0.587 -0.571 -0.571 -0.597 -0.610 -0.623 -0.588 + -0.644 -0.659 -0.639 -0.586 -0.662 -0.679 -0.622 -0.683 -0.657 -0.697 + -0.717 -0.662 -0.739 -0.760 -0.762 -0.778 -0.917 -0.925 -0.815 -0.829 + -0.032 -0.045 -0.120 -0.035 -0.004 -0.053 -0.108 -0.125 -0.105 -0.103 + -0.101 -0.119 -0.044 -0.133 -0.080 -0.106 -0.146 -0.108 -0.137 -0.109 + -0.051 -0.035 -0.192 -0.114 -0.038 -0.079 -0.159 -0.083 -0.050 -0.126 + -0.134 -0.167 -0.122 0.011 -0.104 -0.158 -0.089 -0.141 -0.043 -0.165 + -0.125 -0.132 -0.139 -0.068 -0.061 -0.141 -0.075 -0.102 -0.095 -0.080 + -0.070 -0.080 -0.075 -0.090 -0.040 -0.102 -0.022 -0.115 -0.114 -0.136 + + 190 iasi_metop-a 218 0.429726E-01 + -0.134 -0.120 -0.155 -0.143 -0.121 -0.124 -0.144 -0.134 -0.108 -0.145 + -0.171 -0.174 -0.126 -0.101 -0.152 -0.160 -0.098 -0.158 -0.181 -0.225 + -0.184 -0.161 -0.250 -0.248 -0.214 -0.195 -0.378 -0.371 -0.277 -0.322 + -0.081 -0.112 -0.126 -0.036 -0.043 -0.073 -0.191 -0.110 -0.133 -0.147 + -0.150 -0.137 -0.133 -0.162 -0.147 -0.120 -0.155 -0.159 -0.216 -0.093 + -0.127 -0.156 -0.274 -0.191 -0.136 -0.218 -0.235 -0.113 -0.113 -0.241 + -0.194 -0.155 -0.201 -0.075 -0.140 -0.157 -0.143 -0.205 -0.085 -0.160 + -0.202 -0.127 -0.258 -0.099 -0.121 -0.214 -0.078 -0.093 -0.165 -0.159 + -0.103 -0.078 -0.089 -0.140 -0.031 -0.041 -0.066 -0.156 -0.099 -0.064 + + 191 iasi_metop-a 219 0.385229E-01 + -0.452 -0.425 -0.509 -0.488 -0.382 -0.431 -0.399 -0.356 -0.322 -0.393 + -0.337 -0.345 -0.317 -0.326 -0.336 -0.267 -0.249 -0.305 -0.328 -0.286 + -0.273 -0.276 -0.300 -0.279 -0.233 -0.245 -0.264 -0.244 -0.223 -0.297 + -0.665 -0.732 -0.655 -0.604 -0.661 -0.750 -0.813 -0.658 -0.691 -0.770 + -0.727 -0.697 -0.663 -0.755 -0.772 -0.670 -0.695 -0.696 -0.820 -0.634 + -0.714 -0.780 -0.815 -0.778 -0.758 -0.844 -0.800 -0.711 -0.697 -0.839 + -0.771 -0.684 -0.812 -0.738 -0.704 -0.749 -0.712 -0.799 -0.735 -0.676 + -0.783 -0.695 -0.819 -0.693 -0.692 -0.753 -0.698 -0.641 -0.715 -0.750 + -0.691 -0.650 -0.641 -0.753 -0.558 -0.627 -0.704 -0.718 -0.675 -0.568 + + 192 iasi_metop-a 222 0.740279E-02 + -0.825 -0.832 -0.901 -0.895 -0.765 -0.821 -0.745 -0.735 -0.704 -0.764 + -0.714 -0.708 -0.681 -0.670 -0.691 -0.649 -0.631 -0.717 -0.685 -0.675 + -0.664 -0.643 -0.701 -0.649 -0.624 -0.674 -0.695 -0.695 -0.636 -0.691 + -0.545 -0.559 -0.535 -0.538 -0.555 -0.555 -0.478 -0.538 -0.557 -0.536 + -0.538 -0.526 -0.488 -0.484 -0.501 -0.467 -0.542 -0.473 -0.492 -0.528 + -0.452 -0.492 -0.518 -0.427 -0.508 -0.520 -0.499 -0.527 -0.468 -0.527 + -0.504 -0.540 -0.525 -0.497 -0.493 -0.478 -0.518 -0.466 -0.526 -0.517 + -0.433 -0.506 -0.500 -0.529 -0.473 -0.447 -0.527 -0.496 -0.467 -0.479 + -0.494 -0.501 -0.481 -0.516 -0.472 -0.544 -0.512 -0.535 -0.564 -0.554 + + 193 iasi_metop-a 224 0.410616E-01 + -0.271 -0.300 -0.287 -0.299 -0.316 -0.331 -0.331 -0.376 -0.375 -0.378 + -0.421 -0.437 -0.417 -0.373 -0.478 -0.496 -0.449 -0.508 -0.518 -0.587 + -0.554 -0.531 -0.611 -0.654 -0.632 -0.669 -0.874 -0.866 -0.766 -0.786 + 0.078 0.060 0.073 0.065 0.092 0.095 0.067 0.014 0.004 0.035 + -0.001 0.017 0.037 0.048 0.016 0.050 0.036 0.033 -0.060 0.063 + 0.025 0.046 -0.119 0.021 -0.012 0.052 -0.054 0.037 0.080 0.007 + 0.018 -0.029 -0.038 0.016 0.021 -0.006 -0.020 -0.019 0.077 -0.040 + -0.044 0.024 -0.071 0.026 0.048 0.001 0.040 0.037 0.066 0.055 + 0.002 0.068 0.075 0.077 0.110 -0.011 0.071 0.088 0.057 0.061 + + 194 iasi_metop-a 225 0.419990E-01 + -0.392 -0.307 -0.477 -0.460 -0.244 -0.336 -0.291 -0.265 -0.201 -0.284 + -0.223 -0.228 -0.173 -0.162 -0.241 -0.181 -0.099 -0.182 -0.185 -0.146 + -0.144 -0.127 -0.190 -0.190 -0.105 -0.104 -0.176 -0.176 -0.122 -0.147 + -0.590 -0.625 -0.614 -0.587 -0.591 -0.647 -0.635 -0.668 -0.629 -0.632 + -0.671 -0.652 -0.634 -0.622 -0.664 -0.611 -0.613 -0.650 -0.692 -0.564 + -0.661 -0.660 -0.808 -0.573 -0.699 -0.666 -0.767 -0.616 -0.610 -0.688 + -0.652 -0.669 -0.697 -0.681 -0.674 -0.696 -0.645 -0.727 -0.605 -0.671 + -0.720 -0.664 -0.749 -0.652 -0.596 -0.694 -0.661 -0.665 -0.621 -0.624 + -0.602 -0.587 -0.600 -0.607 -0.557 -0.613 -0.608 -0.645 -0.645 -0.556 + + 195 iasi_metop-a 226 0.408554E-01 + -0.553 -0.519 -0.557 -0.559 -0.527 -0.519 -0.530 -0.548 -0.518 -0.540 + -0.562 -0.537 -0.513 -0.481 -0.584 -0.563 -0.504 -0.587 -0.538 -0.577 + -0.594 -0.531 -0.619 -0.600 -0.596 -0.622 -0.719 -0.741 -0.633 -0.696 + -0.272 -0.327 -0.304 -0.258 -0.253 -0.379 -0.325 -0.356 -0.341 -0.350 + -0.384 -0.325 -0.292 -0.346 -0.375 -0.312 -0.377 -0.390 -0.387 -0.292 + -0.328 -0.353 -0.504 -0.338 -0.331 -0.391 -0.426 -0.317 -0.303 -0.415 + -0.405 -0.360 -0.335 -0.384 -0.381 -0.334 -0.302 -0.374 -0.303 -0.364 + -0.368 -0.319 -0.410 -0.328 -0.264 -0.371 -0.335 -0.318 -0.291 -0.385 + -0.296 -0.272 -0.262 -0.303 -0.212 -0.280 -0.297 -0.361 -0.309 -0.262 + + 196 iasi_metop-a 228 0.744004E-02 + -0.863 -0.804 -1.025 -0.956 -0.695 -0.791 -0.753 -0.662 -0.609 -0.717 + -0.623 -0.617 -0.504 -0.573 -0.612 -0.541 -0.482 -0.554 -0.584 -0.522 + -0.519 -0.497 -0.569 -0.506 -0.482 -0.518 -0.535 -0.539 -0.481 -0.539 + -0.760 -0.779 -0.725 -0.704 -0.693 -0.742 -0.716 -0.692 -0.740 -0.739 + -0.744 -0.697 -0.660 -0.647 -0.642 -0.648 -0.732 -0.665 -0.614 -0.704 + -0.644 -0.638 -0.704 -0.673 -0.671 -0.637 -0.640 -0.690 -0.638 -0.656 + -0.616 -0.625 -0.666 -0.635 -0.628 -0.660 -0.615 -0.623 -0.617 -0.666 + -0.617 -0.588 -0.663 -0.638 -0.600 -0.651 -0.686 -0.682 -0.654 -0.650 + -0.709 -0.715 -0.651 -0.674 -0.651 -0.730 -0.638 -0.685 -0.753 -0.766 + + 197 iasi_metop-a 230 0.435210E-01 + -0.264 -0.278 -0.204 -0.238 -0.360 -0.324 -0.343 -0.417 -0.438 -0.403 + -0.504 -0.562 -0.549 -0.406 -0.581 -0.636 -0.585 -0.641 -0.699 -0.794 + -0.766 -0.662 -0.853 -0.875 -0.890 -0.874 -1.216 -1.237 -1.048 -1.078 + 0.239 0.155 0.233 0.207 0.264 0.211 0.137 0.168 0.158 0.145 + 0.133 0.097 0.194 0.234 0.206 0.135 0.167 0.183 0.154 0.124 + 0.196 0.240 0.114 0.112 0.114 0.179 0.090 0.141 0.140 0.082 + 0.183 0.127 0.074 0.204 0.199 0.105 0.096 0.131 0.221 0.172 + 0.099 0.202 0.069 0.134 0.208 0.131 0.169 0.153 0.176 0.178 + 0.206 0.165 0.175 0.219 0.258 0.139 0.254 0.187 0.230 0.223 + + 198 iasi_metop-a 231 0.404305E-01 + -0.173 -0.147 -0.251 -0.258 -0.103 -0.156 -0.129 -0.074 -0.041 -0.111 + -0.056 -0.064 -0.023 0.010 -0.050 -0.006 0.067 0.034 -0.025 0.005 + 0.009 0.006 -0.028 -0.020 0.026 0.039 0.039 0.013 0.066 0.026 + -0.358 -0.416 -0.399 -0.384 -0.312 -0.390 -0.446 -0.454 -0.439 -0.439 + -0.455 -0.483 -0.414 -0.358 -0.425 -0.463 -0.461 -0.417 -0.482 -0.436 + -0.425 -0.402 -0.478 -0.479 -0.402 -0.460 -0.488 -0.401 -0.463 -0.485 + -0.401 -0.486 -0.500 -0.385 -0.390 -0.475 -0.478 -0.495 -0.392 -0.399 + -0.464 -0.410 -0.538 -0.470 -0.394 -0.446 -0.413 -0.432 -0.470 -0.397 + -0.351 -0.406 -0.441 -0.409 -0.327 -0.416 -0.333 -0.442 -0.369 -0.349 + + 199 iasi_metop-a 232 0.426005E-01 + -0.328 -0.343 -0.356 -0.394 -0.360 -0.382 -0.365 -0.338 -0.318 -0.326 + -0.364 -0.379 -0.339 -0.281 -0.369 -0.384 -0.300 -0.381 -0.379 -0.404 + -0.394 -0.374 -0.431 -0.440 -0.443 -0.445 -0.520 -0.541 -0.437 -0.484 + -0.146 -0.161 -0.227 -0.150 -0.099 -0.205 -0.235 -0.268 -0.246 -0.213 + -0.281 -0.233 -0.222 -0.165 -0.241 -0.233 -0.226 -0.224 -0.295 -0.178 + -0.217 -0.225 -0.348 -0.250 -0.185 -0.231 -0.296 -0.206 -0.183 -0.284 + -0.241 -0.255 -0.267 -0.183 -0.229 -0.202 -0.247 -0.268 -0.169 -0.193 + -0.199 -0.201 -0.318 -0.229 -0.163 -0.244 -0.219 -0.212 -0.260 -0.229 + -0.201 -0.165 -0.187 -0.188 -0.104 -0.170 -0.084 -0.249 -0.157 -0.148 + + 200 iasi_metop-a 236 0.476507E-01 + 0.229 0.193 0.275 0.263 0.180 0.127 0.131 0.146 0.098 0.122 + 0.063 0.031 0.079 0.099 0.028 -0.018 0.088 -0.012 -0.006 -0.059 + -0.063 -0.034 -0.069 -0.116 -0.133 -0.123 -0.254 -0.265 -0.154 -0.198 + 0.647 0.593 0.614 0.536 0.646 0.642 0.575 0.510 0.555 0.540 + 0.520 0.442 0.579 0.624 0.487 0.487 0.537 0.484 0.519 0.579 + 0.553 0.601 0.348 0.529 0.542 0.533 0.413 0.572 0.586 0.499 + 0.539 0.488 0.526 0.540 0.511 0.445 0.523 0.477 0.545 0.496 + 0.482 0.565 0.438 0.503 0.525 0.492 0.522 0.499 0.533 0.588 + 0.568 0.572 0.549 0.562 0.547 0.487 0.608 0.600 0.520 0.537 + + 201 iasi_metop-a 237 0.467993E-01 + 0.411 0.409 0.379 0.368 0.477 0.384 0.371 0.454 0.477 0.402 + 0.429 0.420 0.489 0.461 0.426 0.435 0.549 0.510 0.433 0.449 + 0.481 0.471 0.451 0.419 0.510 0.461 0.485 0.442 0.502 0.453 + 0.327 0.289 0.353 0.260 0.350 0.296 0.259 0.245 0.243 0.178 + 0.193 0.148 0.274 0.300 0.190 0.182 0.200 0.127 0.181 0.255 + 0.193 0.215 0.095 0.235 0.203 0.177 0.095 0.256 0.255 0.153 + 0.209 0.191 0.189 0.188 0.221 0.190 0.147 0.105 0.281 0.230 + 0.166 0.222 0.115 0.212 0.217 0.158 0.267 0.249 0.225 0.279 + 0.285 0.266 0.223 0.234 0.279 0.249 0.313 0.273 0.229 0.296 + + 202 iasi_metop-a 239 0.491963E-01 + 0.009 0.009 -0.029 -0.053 0.056 0.014 0.024 0.088 0.152 0.048 + 0.088 0.078 0.175 0.116 0.105 0.139 0.213 0.185 0.141 0.154 + 0.152 0.146 0.143 0.145 0.201 0.158 0.195 0.168 0.202 0.147 + -0.007 -0.068 -0.019 -0.100 -0.031 -0.078 -0.136 -0.071 -0.180 -0.186 + -0.192 -0.113 -0.015 -0.057 -0.118 -0.134 -0.082 -0.129 -0.211 -0.048 + -0.095 -0.066 -0.282 -0.118 -0.096 -0.181 -0.266 -0.093 -0.096 -0.143 + -0.133 -0.162 -0.165 -0.120 -0.087 -0.123 -0.154 -0.185 -0.107 -0.080 + -0.158 -0.114 -0.200 -0.097 -0.038 -0.173 -0.017 -0.121 -0.124 -0.092 + -0.144 -0.022 -0.116 -0.071 -0.015 -0.084 0.003 -0.089 -0.147 -0.062 + + 203 iasi_metop-a 243 0.531497E-01 + 0.309 0.247 0.390 0.372 0.232 0.229 0.220 0.250 0.200 0.178 + 0.120 0.143 0.146 0.177 0.061 0.067 0.125 0.050 0.035 0.021 + -0.016 0.015 -0.026 -0.032 -0.016 -0.064 -0.178 -0.183 -0.103 -0.123 + 0.624 0.577 0.552 0.565 0.564 0.606 0.462 0.414 0.514 0.481 + 0.464 0.406 0.486 0.584 0.498 0.581 0.562 0.457 0.377 0.502 + 0.460 0.607 0.355 0.519 0.508 0.531 0.348 0.533 0.565 0.451 + 0.489 0.488 0.440 0.549 0.526 0.495 0.495 0.438 0.561 0.488 + 0.430 0.485 0.468 0.524 0.540 0.410 0.539 0.420 0.503 0.557 + 0.535 0.469 0.524 0.487 0.586 0.436 0.567 0.564 0.433 0.532 + + 204 iasi_metop-a 246 0.506413E-01 + 0.269 0.333 0.245 0.223 0.345 0.272 0.264 0.329 0.382 0.290 + 0.361 0.388 0.435 0.364 0.389 0.413 0.495 0.439 0.358 0.430 + 0.436 0.421 0.427 0.433 0.512 0.453 0.554 0.486 0.530 0.509 + 0.116 0.112 0.084 0.143 0.120 0.025 0.092 0.062 0.057 0.001 + 0.046 0.057 0.118 0.124 0.078 0.099 0.073 -0.055 -0.007 0.145 + 0.028 0.073 -0.092 0.106 0.022 0.007 -0.050 0.070 0.126 -0.041 + 0.072 0.094 0.022 0.068 0.086 0.088 0.034 -0.092 0.147 0.095 + 0.056 0.044 -0.010 0.110 0.115 -0.080 0.089 0.141 0.039 0.051 + 0.061 0.164 0.106 0.055 0.183 0.168 0.148 0.077 0.078 0.134 + + 205 iasi_metop-a 249 0.540027E-01 + 0.458 0.426 0.525 0.515 0.402 0.404 0.374 0.418 0.337 0.366 + 0.313 0.322 0.333 0.355 0.280 0.303 0.381 0.239 0.297 0.256 + 0.214 0.231 0.206 0.239 0.214 0.164 0.129 0.123 0.165 0.129 + 0.742 0.725 0.715 0.683 0.709 0.694 0.665 0.688 0.652 0.658 + 0.612 0.605 0.694 0.682 0.634 0.689 0.682 0.614 0.566 0.653 + 0.636 0.672 0.507 0.680 0.651 0.677 0.508 0.688 0.695 0.598 + 0.679 0.554 0.534 0.695 0.670 0.615 0.591 0.555 0.676 0.655 + 0.623 0.636 0.623 0.614 0.715 0.520 0.671 0.585 0.645 0.685 + 0.597 0.709 0.634 0.669 0.735 0.621 0.720 0.670 0.620 0.663 + + 206 iasi_metop-a 252 0.551186E-01 + 0.551 0.564 0.545 0.576 0.568 0.550 0.538 0.616 0.616 0.530 + 0.558 0.621 0.602 0.599 0.577 0.587 0.704 0.623 0.596 0.628 + 0.633 0.589 0.616 0.622 0.694 0.641 0.688 0.668 0.698 0.663 + 0.417 0.377 0.348 0.346 0.412 0.322 0.294 0.282 0.244 0.248 + 0.191 0.229 0.367 0.372 0.206 0.284 0.306 0.159 0.223 0.298 + 0.267 0.271 0.091 0.221 0.201 0.321 0.127 0.247 0.344 0.218 + 0.256 0.235 0.195 0.312 0.267 0.218 0.240 0.183 0.303 0.255 + 0.299 0.299 0.235 0.281 0.355 0.130 0.295 0.313 0.308 0.281 + 0.268 0.311 0.382 0.340 0.388 0.342 0.380 0.324 0.318 0.330 + + 207 iasi_metop-a 254 0.359402E-01 + -0.512 -0.482 -0.709 -0.645 -0.322 -0.394 -0.416 -0.199 -0.056 -0.262 + -0.149 -0.100 -0.005 -0.075 -0.094 0.032 0.144 0.094 -0.002 0.103 + 0.176 0.105 0.096 0.157 0.244 0.212 0.289 0.277 0.291 0.287 + -0.646 -0.661 -0.616 -0.599 -0.571 -0.610 -0.676 -0.644 -0.642 -0.607 + -0.655 -0.648 -0.573 -0.514 -0.625 -0.594 -0.606 -0.573 -0.562 -0.588 + -0.563 -0.558 -0.681 -0.529 -0.628 -0.573 -0.670 -0.579 -0.529 -0.647 + -0.600 -0.651 -0.640 -0.588 -0.561 -0.692 -0.603 -0.659 -0.606 -0.625 + -0.615 -0.621 -0.737 -0.681 -0.545 -0.683 -0.651 -0.749 -0.628 -0.576 + -0.619 -0.687 -0.677 -0.689 -0.631 -0.745 -0.603 -0.638 -0.846 -0.750 + + 208 iasi_metop-a 259 0.535658E-01 + -0.108 -0.075 0.037 -0.030 -0.206 -0.145 -0.235 -0.292 -0.286 -0.264 + -0.453 -0.448 -0.413 -0.309 -0.500 -0.601 -0.456 -0.531 -0.619 -0.753 + -0.735 -0.645 -0.836 -0.898 -0.879 -0.889 -1.302 -1.361 -1.072 -1.127 + 0.369 0.323 0.411 0.362 0.365 0.360 0.232 0.332 0.262 0.158 + 0.165 0.262 0.280 0.379 0.260 0.246 0.236 0.219 0.270 0.338 + 0.257 0.283 0.169 0.320 0.282 0.212 0.140 0.265 0.236 0.246 + 0.333 0.244 0.219 0.347 0.286 0.307 0.256 0.231 0.291 0.271 + 0.306 0.280 0.233 0.312 0.303 0.155 0.328 0.303 0.264 0.284 + 0.271 0.382 0.325 0.283 0.448 0.312 0.376 0.342 0.343 0.302 + + 209 iasi_metop-a 260 0.430370E-01 + -0.092 -0.046 -0.161 -0.146 0.106 0.001 0.030 0.115 0.213 0.122 + 0.079 0.187 0.236 0.217 0.165 0.257 0.367 0.243 0.199 0.266 + 0.292 0.233 0.305 0.293 0.363 0.318 0.360 0.372 0.368 0.343 + 0.143 0.127 0.201 0.173 0.160 0.156 0.120 0.155 0.058 0.017 + 0.019 0.100 0.108 0.171 0.136 0.111 0.069 -0.023 0.136 0.159 + 0.104 0.151 -0.005 0.132 0.052 0.106 0.015 0.120 0.123 0.068 + 0.122 0.092 0.006 0.178 0.178 0.135 0.065 -0.025 0.139 0.110 + 0.123 0.104 0.069 0.134 0.163 -0.024 0.142 0.107 0.048 0.146 + 0.129 0.176 0.119 0.066 0.244 0.081 0.148 0.099 0.069 0.079 + + 210 iasi_metop-a 262 0.529063E-01 + 0.292 0.309 0.378 0.310 0.260 0.283 0.257 0.254 0.235 0.240 + 0.089 0.159 0.174 0.206 0.107 0.101 0.205 0.087 0.023 -0.028 + 0.008 0.022 -0.102 -0.141 -0.066 -0.087 -0.359 -0.389 -0.251 -0.263 + 0.523 0.514 0.527 0.534 0.549 0.511 0.459 0.543 0.464 0.325 + 0.331 0.452 0.544 0.558 0.441 0.463 0.469 0.335 0.465 0.580 + 0.505 0.496 0.350 0.475 0.434 0.520 0.254 0.506 0.515 0.432 + 0.421 0.458 0.442 0.496 0.500 0.473 0.451 0.356 0.497 0.466 + 0.525 0.490 0.470 0.516 0.542 0.370 0.499 0.498 0.477 0.514 + 0.458 0.553 0.509 0.531 0.585 0.480 0.593 0.524 0.554 0.531 + + 211 iasi_metop-a 265 0.558155E-01 + 0.373 0.396 0.400 0.409 0.396 0.335 0.366 0.477 0.420 0.317 + 0.289 0.387 0.367 0.332 0.347 0.398 0.458 0.381 0.326 0.361 + 0.391 0.339 0.364 0.376 0.417 0.391 0.431 0.439 0.438 0.410 + 0.078 0.031 -0.019 -0.005 0.015 0.054 0.005 -0.027 -0.094 -0.096 + -0.095 -0.072 0.006 0.091 -0.059 -0.064 0.003 -0.138 -0.123 0.057 + 0.017 -0.004 -0.041 -0.074 -0.047 0.070 -0.177 -0.096 -0.060 -0.003 + -0.001 -0.088 -0.124 0.024 -0.038 -0.032 0.000 -0.051 -0.010 -0.082 + -0.034 -0.032 -0.092 0.029 0.032 -0.153 0.012 0.033 0.030 -0.014 + 0.045 0.028 0.013 0.019 0.086 0.014 0.082 0.071 0.117 -0.038 + + 212 iasi_metop-a 267 0.440307E-01 + -0.466 -0.457 -0.520 -0.482 -0.285 -0.452 -0.370 -0.234 -0.190 -0.305 + -0.294 -0.184 -0.130 -0.151 -0.166 -0.101 0.004 -0.049 -0.072 -0.010 + 0.021 -0.047 0.055 0.074 0.105 0.094 0.194 0.228 0.213 0.194 + -0.434 -0.444 -0.362 -0.455 -0.399 -0.414 -0.462 -0.436 -0.416 -0.504 + -0.371 -0.459 -0.361 -0.314 -0.447 -0.471 -0.450 -0.485 -0.423 -0.368 + -0.304 -0.327 -0.449 -0.322 -0.399 -0.366 -0.536 -0.418 -0.424 -0.458 + -0.435 -0.460 -0.426 -0.335 -0.380 -0.578 -0.356 -0.466 -0.443 -0.445 + -0.394 -0.452 -0.455 -0.467 -0.345 -0.465 -0.502 -0.446 -0.406 -0.386 + -0.424 -0.429 -0.470 -0.525 -0.313 -0.517 -0.402 -0.404 -0.538 -0.490 + + 213 iasi_metop-a 269 0.440360E-01 + -0.131 -0.085 -0.066 -0.123 -0.184 -0.170 -0.226 -0.289 -0.217 -0.208 + -0.359 -0.370 -0.290 -0.272 -0.386 -0.470 -0.319 -0.365 -0.496 -0.581 + -0.543 -0.469 -0.609 -0.655 -0.634 -0.675 -0.969 -0.993 -0.771 -0.843 + 0.250 0.195 0.162 0.227 0.231 0.188 0.190 0.155 0.096 0.074 + 0.131 0.179 0.226 0.230 0.151 0.203 0.124 0.054 0.130 0.228 + 0.136 0.143 0.026 0.121 0.163 0.201 0.032 0.172 0.178 0.133 + 0.140 0.160 0.149 0.179 0.195 0.159 0.194 0.107 0.221 0.113 + 0.177 0.185 0.148 0.221 0.196 0.100 0.160 0.167 0.175 0.151 + 0.195 0.227 0.214 0.183 0.253 0.195 0.285 0.204 0.211 0.208 + + 214 iasi_metop-a 275 0.523422E-01 + 0.263 0.299 0.343 0.312 0.278 0.248 0.266 0.304 0.291 0.242 + 0.184 0.256 0.283 0.294 0.208 0.202 0.341 0.234 0.215 0.190 + 0.199 0.204 0.215 0.204 0.264 0.205 0.165 0.148 0.232 0.208 + 0.408 0.284 0.381 0.452 0.319 0.349 0.303 0.352 0.303 0.289 + 0.341 0.343 0.379 0.402 0.308 0.420 0.301 0.154 0.267 0.433 + 0.384 0.367 0.267 0.374 0.302 0.410 0.227 0.422 0.453 0.239 + 0.282 0.297 0.301 0.373 0.381 0.328 0.357 0.189 0.417 0.354 + 0.398 0.241 0.330 0.343 0.380 0.167 0.345 0.348 0.284 0.345 + 0.340 0.347 0.358 0.317 0.435 0.314 0.389 0.378 0.268 0.418 + + 215 iasi_metop-a 279 0.512569E-01 + 0.765 0.790 0.825 0.769 0.691 0.697 0.596 0.657 0.568 0.600 + 0.502 0.538 0.506 0.602 0.548 0.548 0.583 0.470 0.460 0.469 + 0.496 0.416 0.466 0.466 0.419 0.418 0.439 0.420 0.467 0.420 + 0.649 0.634 0.629 0.675 0.652 0.604 0.641 0.547 0.570 0.558 + 0.531 0.606 0.624 0.669 0.562 0.577 0.501 0.454 0.584 0.738 + 0.643 0.504 0.548 0.621 0.453 0.599 0.398 0.720 0.520 0.454 + 0.586 0.597 0.501 0.642 0.576 0.548 0.602 0.491 0.604 0.541 + 0.647 0.528 0.594 0.681 0.612 0.552 0.531 0.687 0.632 0.482 + 0.585 0.694 0.615 0.560 0.662 0.659 0.694 0.729 0.560 0.681 + + 216 iasi_metop-a 282 0.425412E-01 + 0.407 0.439 0.445 0.460 0.556 0.425 0.521 0.544 0.619 0.465 + 0.512 0.632 0.554 0.541 0.581 0.636 0.714 0.595 0.639 0.682 + 0.695 0.620 0.804 0.812 0.801 0.802 0.978 0.990 0.908 0.879 + 0.286 0.241 0.283 0.262 0.253 0.268 0.183 0.200 0.120 0.165 + 0.147 0.211 0.215 0.245 0.217 0.195 0.143 0.121 0.246 0.216 + 0.189 0.217 0.030 0.097 0.221 0.214 0.074 0.163 0.157 0.173 + 0.179 0.142 0.105 0.221 0.216 0.122 0.215 0.070 0.269 0.189 + 0.237 0.237 0.184 0.212 0.162 0.067 0.198 0.258 0.134 0.195 + 0.166 0.262 0.206 0.200 0.290 0.231 0.295 0.265 0.277 0.163 + + 217 iasi_metop-a 285 0.474413E-01 + 0.673 0.731 0.835 0.766 0.586 0.665 0.589 0.574 0.490 0.552 + 0.378 0.464 0.453 0.502 0.439 0.437 0.487 0.447 0.414 0.347 + 0.375 0.358 0.419 0.350 0.351 0.378 0.323 0.297 0.389 0.365 + 0.713 0.757 0.708 0.746 0.728 0.603 0.790 0.513 0.719 0.703 + 0.593 0.578 0.725 0.769 0.663 0.565 0.565 0.536 0.581 0.684 + 0.709 0.540 0.499 0.567 0.436 0.599 0.406 0.755 0.520 0.503 + 0.650 0.527 0.486 0.662 0.573 0.544 0.625 0.523 0.755 0.385 + 0.693 0.578 0.563 0.783 0.758 0.533 0.684 0.790 0.684 0.568 + 0.620 0.803 0.657 0.618 0.713 0.769 0.785 0.895 0.643 0.710 + + 218 iasi_metop-a 294 0.477563E-01 + 0.358 0.425 0.404 0.337 0.432 0.373 0.422 0.406 0.487 0.399 + 0.425 0.478 0.440 0.451 0.453 0.493 0.544 0.524 0.521 0.557 + 0.577 0.531 0.655 0.683 0.691 0.740 0.939 0.949 0.839 0.843 + 0.110 0.038 0.092 0.123 0.111 0.050 0.067 0.094 0.059 -0.004 + 0.038 0.047 0.100 0.087 -0.032 0.068 0.009 -0.056 -0.010 0.103 + 0.072 -0.046 -0.050 0.075 0.013 -0.004 -0.031 0.061 0.055 -0.015 + -0.025 0.040 -0.031 0.048 0.038 0.076 0.091 -0.023 0.084 0.083 + 0.065 -0.040 0.018 0.118 0.058 -0.070 0.046 0.153 0.080 0.030 + 0.063 0.110 0.109 0.029 0.112 0.106 0.165 0.042 0.118 0.144 + + 219 iasi_metop-a 296 0.436341E-01 + -0.072 -0.067 -0.075 -0.021 -0.023 -0.075 -0.057 0.053 0.027 -0.046 + -0.036 0.050 0.030 -0.039 -0.007 0.055 0.070 0.003 -0.006 0.075 + 0.064 -0.025 0.046 0.081 0.084 0.048 0.161 0.193 0.165 0.104 + -0.294 -0.345 -0.356 -0.282 -0.264 -0.302 -0.319 -0.382 -0.377 -0.403 + -0.369 -0.389 -0.340 -0.350 -0.332 -0.364 -0.306 -0.377 -0.415 -0.292 + -0.357 -0.391 -0.446 -0.321 -0.374 -0.283 -0.418 -0.320 -0.354 -0.432 + -0.354 -0.364 -0.424 -0.338 -0.292 -0.371 -0.296 -0.427 -0.343 -0.332 + -0.386 -0.324 -0.384 -0.314 -0.317 -0.422 -0.320 -0.322 -0.346 -0.359 + -0.322 -0.342 -0.268 -0.290 -0.249 -0.286 -0.290 -0.351 -0.337 -0.318 + + 220 iasi_metop-a 299 0.168793E-01 + -0.759 -0.730 -0.897 -0.841 -0.584 -0.675 -0.619 -0.541 -0.525 -0.576 + -0.532 -0.523 -0.460 -0.473 -0.481 -0.397 -0.367 -0.400 -0.389 -0.367 + -0.355 -0.412 -0.365 -0.360 -0.345 -0.352 -0.269 -0.303 -0.267 -0.342 + -0.652 -0.654 -0.604 -0.634 -0.616 -0.750 -0.633 -0.677 -0.663 -0.693 + -0.662 -0.670 -0.591 -0.701 -0.597 -0.617 -0.631 -0.614 -0.659 -0.658 + -0.612 -0.667 -0.636 -0.629 -0.640 -0.646 -0.607 -0.656 -0.604 -0.613 + -0.679 -0.633 -0.648 -0.664 -0.569 -0.602 -0.558 -0.658 -0.584 -0.649 + -0.630 -0.634 -0.642 -0.616 -0.623 -0.592 -0.577 -0.633 -0.624 -0.650 + -0.629 -0.634 -0.591 -0.623 -0.548 -0.594 -0.580 -0.616 -0.628 -0.643 + + 221 iasi_metop-a 300 -0.223917E-02 + -0.793 -0.845 -0.938 -0.850 -0.857 -0.866 -0.859 -0.777 -0.822 -0.886 + -0.888 -0.881 -0.906 -0.878 -0.935 -0.920 -0.857 -0.897 -1.054 -1.006 + -0.953 -0.951 -1.121 -1.131 -1.036 -1.061 -1.305 -1.299 -1.196 -1.213 + -1.278 -1.296 -1.200 -1.200 -1.162 -1.300 -1.152 -1.223 -1.189 -1.162 + -1.179 -1.167 -1.119 -1.195 -1.115 -1.106 -1.133 -1.103 -1.086 -1.109 + -1.144 -1.147 -1.110 -1.070 -1.092 -1.100 -1.066 -1.094 -1.053 -1.003 + -1.123 -1.061 -1.088 -1.119 -1.093 -1.043 -1.011 -1.164 -1.066 -1.106 + -1.020 -1.079 -1.114 -1.158 -1.120 -1.003 -1.110 -1.154 -1.072 -1.114 + -1.143 -1.166 -1.121 -1.153 -1.131 -1.191 -1.110 -1.200 -1.231 -1.180 + + 222 iasi_metop-a 303 -0.269532E-01 + -1.291 -1.334 -1.501 -1.425 -1.392 -1.359 -1.472 -1.461 -1.358 -1.419 + -1.589 -1.594 -1.540 -1.493 -1.679 -1.736 -1.570 -1.626 -1.853 -1.866 + -1.781 -1.723 -2.139 -2.144 -2.012 -1.945 -2.460 -2.407 -2.248 -2.242 + -1.154 -2.039 -1.735 -1.699 -3.173 -1.077 -0.459 -1.567 -1.263 -1.205 + -1.829 -2.334 -1.545 -2.851 -1.345 -1.578 -3.159 -3.487 -2.058 -1.247 + -1.044 -1.830 -2.756 -1.263 -1.227 -1.692 -1.475 -1.188 -1.333 -2.625 + -2.515 -2.432 -1.744 -0.752 -1.309 -2.386 -2.501 -2.557 -0.430 -1.033 + -1.292 -2.290 -2.216 -3.551 -3.838 -2.509 -1.973 -1.653 -1.939 -2.376 + -1.793 -2.912 -1.833 -1.665 -2.215 -3.087 -2.695 -1.659 -2.229 -2.828 + + 223 iasi_metop-a 306 0.442374E-01 + -0.478 -0.491 -0.394 -0.359 -0.482 -0.564 -0.549 -0.461 -0.544 -0.601 + -0.540 -0.519 -0.543 -0.615 -0.521 -0.543 -0.571 -0.604 -0.553 -0.630 + -0.722 -0.738 -0.543 -0.630 -0.625 -0.900 -0.960 -1.129 -0.804 -0.987 + -0.456 -0.449 -0.527 -0.554 -0.478 -0.481 -0.578 -0.613 -0.543 -0.597 + -0.599 -0.666 -0.500 -0.481 -0.658 -0.622 -0.509 -0.656 -0.632 -0.592 + -0.567 -0.574 -0.756 -0.674 -0.577 -0.478 -0.707 -0.694 -0.573 -0.587 + -0.641 -0.653 -0.588 -0.496 -0.574 -0.575 -0.627 -0.594 -0.583 -0.679 + -0.555 -0.526 -0.624 -0.584 -0.469 -0.574 -0.530 -0.564 -0.569 -0.524 + -0.590 -0.488 -0.479 -0.425 -0.458 -0.538 -0.381 -0.439 -0.457 -0.553 + + 224 iasi_metop-a 309 0.496589E-01 + -0.282 -0.240 -0.214 -0.251 -0.305 -0.262 -0.344 -0.344 -0.314 -0.307 + -0.421 -0.415 -0.347 -0.305 -0.409 -0.380 -0.297 -0.329 -0.379 -0.436 + -0.354 -0.367 -0.373 -0.407 -0.359 -0.336 -0.367 -0.390 -0.333 -0.314 + -0.259 -0.202 -0.305 -0.232 -0.240 -0.305 -0.246 -0.407 -0.284 -0.345 + -0.437 -0.400 -0.276 -0.218 -0.303 -0.332 -0.348 -0.473 -0.356 -0.281 + -0.311 -0.400 -0.460 -0.370 -0.496 -0.358 -0.548 -0.230 -0.405 -0.408 + -0.311 -0.327 -0.426 -0.224 -0.428 -0.404 -0.385 -0.359 -0.270 -0.519 + -0.325 -0.361 -0.324 -0.244 -0.228 -0.367 -0.313 -0.248 -0.299 -0.306 + -0.300 -0.263 -0.265 -0.355 -0.233 -0.180 -0.167 -0.180 -0.299 -0.240 + + 225 iasi_metop-a 313 0.378204E-01 + 0.597 0.612 0.717 0.603 0.413 0.459 0.448 0.304 0.390 0.365 + 0.229 0.263 0.241 0.234 0.179 0.149 0.154 0.137 0.096 0.070 + 0.048 0.072 0.109 0.096 0.043 0.105 0.092 0.099 0.112 0.097 + 0.781 0.699 0.667 0.699 0.668 0.578 0.801 0.589 0.693 0.621 + 0.574 0.444 0.619 0.774 0.656 0.571 0.514 0.588 0.459 0.712 + 0.751 0.505 0.521 0.484 0.508 0.666 0.365 0.552 0.584 0.633 + 0.669 0.600 0.522 0.644 0.418 0.624 0.588 0.611 0.689 0.680 + 0.649 0.673 0.662 0.620 0.619 0.603 0.698 0.736 0.678 0.683 + 0.630 0.602 0.699 0.720 0.686 0.669 0.824 0.760 0.670 0.752 + + 226 iasi_metop-a 320 0.436288E-01 + 1.009 1.013 1.089 0.954 0.926 0.931 0.942 0.890 0.902 0.909 + 0.824 0.844 0.861 0.778 0.870 0.816 0.880 0.818 0.813 0.815 + 0.865 0.869 0.897 0.980 0.892 0.936 1.048 1.000 1.034 1.003 + 0.787 0.681 0.679 0.685 0.652 0.443 0.750 0.682 0.655 0.600 + 0.554 0.488 0.706 0.797 0.726 0.589 0.513 0.608 0.520 0.713 + 0.757 0.543 0.613 0.521 0.519 0.748 0.504 0.587 0.664 0.683 + 0.707 0.699 0.598 0.705 0.536 0.579 0.631 0.598 0.673 0.702 + 0.750 0.808 0.664 0.582 0.660 0.559 0.730 0.792 0.699 0.746 + 0.643 0.655 0.691 0.694 0.643 0.643 0.838 0.739 0.699 0.683 + + 227 iasi_metop-a 323 0.417622E-01 + 0.367 0.366 0.309 0.307 0.409 0.313 0.377 0.451 0.516 0.402 + 0.382 0.425 0.545 0.405 0.441 0.519 0.615 0.535 0.538 0.592 + 0.654 0.558 0.698 0.773 0.729 0.748 0.922 0.950 0.913 0.864 + 0.053 0.152 0.067 0.000 0.096 0.124 0.041 -0.110 -0.018 0.018 + -0.018 -0.052 0.037 0.138 -0.030 -0.039 -0.045 -0.090 -0.007 0.004 + 0.014 0.000 -0.085 -0.072 -0.121 0.041 -0.156 -0.005 -0.097 0.002 + -0.034 -0.117 -0.036 0.105 -0.012 -0.121 0.037 -0.046 0.007 -0.138 + 0.007 0.042 -0.067 -0.010 0.028 0.050 -0.028 0.060 0.059 0.070 + 0.001 0.030 0.011 0.007 0.125 0.014 0.114 0.154 0.074 -0.021 + + 228 iasi_metop-a 326 0.431676E-01 + 0.555 0.632 0.673 0.536 0.460 0.477 0.437 0.332 0.430 0.461 + 0.256 0.254 0.248 0.361 0.256 0.195 0.284 0.288 0.215 0.138 + 0.218 0.198 0.203 0.153 0.180 0.258 0.156 0.099 0.185 0.233 + 0.671 0.535 0.546 0.554 0.494 0.372 0.602 0.487 0.537 0.452 + 0.410 0.330 0.478 0.599 0.585 0.348 0.372 0.460 0.336 0.558 + 0.574 0.359 0.422 0.318 0.355 0.597 0.215 0.458 0.480 0.497 + 0.406 0.534 0.465 0.538 0.403 0.480 0.443 0.440 0.544 0.566 + 0.552 0.626 0.492 0.439 0.500 0.362 0.602 0.613 0.545 0.558 + 0.496 0.523 0.607 0.568 0.541 0.522 0.613 0.628 0.586 0.542 + + 229 iasi_metop-a 327 0.474208E-01 + 0.753 0.799 0.843 0.722 0.689 0.673 0.731 0.669 0.723 0.648 + 0.581 0.664 0.651 0.627 0.624 0.603 0.662 0.670 0.614 0.644 + 0.679 0.657 0.742 0.760 0.791 0.792 0.927 0.903 0.922 0.867 + 0.530 0.327 0.411 0.355 0.320 0.214 0.505 0.353 0.416 0.274 + 0.299 0.252 0.360 0.426 0.386 0.258 0.250 0.281 0.160 0.447 + 0.423 0.244 0.267 0.227 0.226 0.381 0.108 0.400 0.341 0.313 + 0.336 0.463 0.372 0.360 0.229 0.376 0.304 0.293 0.444 0.384 + 0.426 0.356 0.346 0.338 0.383 0.288 0.446 0.490 0.376 0.372 + 0.326 0.366 0.431 0.415 0.407 0.420 0.461 0.400 0.440 0.481 + + 230 iasi_metop-a 329 0.428536E-01 + 0.072 0.058 0.015 -0.019 0.125 0.065 0.088 0.129 0.178 0.086 + 0.121 0.166 0.229 0.082 0.133 0.286 0.308 0.206 0.236 0.357 + 0.354 0.250 0.370 0.435 0.451 0.396 0.619 0.644 0.583 0.499 + -0.256 -0.197 -0.153 -0.144 -0.203 -0.206 -0.148 -0.247 -0.172 -0.240 + -0.262 -0.222 -0.169 -0.149 -0.225 -0.181 -0.269 -0.255 -0.246 -0.196 + -0.161 -0.251 -0.247 -0.263 -0.300 -0.201 -0.393 -0.224 -0.333 -0.276 + -0.215 -0.148 -0.298 -0.165 -0.167 -0.270 -0.235 -0.248 -0.195 -0.248 + -0.167 -0.243 -0.201 -0.190 -0.213 -0.203 -0.125 -0.106 -0.162 -0.183 + -0.128 -0.100 -0.194 -0.222 -0.077 -0.130 -0.089 -0.126 -0.161 -0.162 + + 231 iasi_metop-a 332 0.429447E-01 + 0.361 0.433 0.519 0.388 0.223 0.236 0.261 0.172 0.226 0.200 + 0.069 0.104 0.031 0.097 0.062 0.024 0.051 0.024 -0.009 -0.042 + -0.036 -0.046 -0.029 -0.016 -0.066 -0.014 -0.066 -0.081 -0.048 -0.059 + 0.538 0.394 0.378 0.397 0.359 0.250 0.434 0.314 0.428 0.298 + 0.289 0.162 0.364 0.551 0.416 0.251 0.217 0.299 0.222 0.460 + 0.478 0.320 0.378 0.175 0.303 0.467 0.109 0.309 0.417 0.346 + 0.346 0.382 0.302 0.406 0.227 0.313 0.282 0.356 0.434 0.365 + 0.437 0.503 0.399 0.303 0.395 0.342 0.427 0.447 0.427 0.490 + 0.404 0.357 0.427 0.457 0.340 0.424 0.473 0.471 0.476 0.450 + + 232 iasi_metop-a 335 0.407919E-01 + 0.007 0.022 -0.056 -0.122 0.067 0.040 0.016 0.071 0.131 0.107 + 0.068 0.099 0.190 0.156 0.112 0.194 0.303 0.279 0.200 0.300 + 0.374 0.275 0.385 0.431 0.461 0.487 0.653 0.672 0.629 0.614 + -0.223 -0.268 -0.196 -0.183 -0.202 -0.196 -0.215 -0.319 -0.226 -0.251 + -0.267 -0.231 -0.225 -0.233 -0.291 -0.243 -0.288 -0.339 -0.283 -0.184 + -0.229 -0.346 -0.353 -0.250 -0.386 -0.340 -0.349 -0.210 -0.373 -0.339 + -0.238 -0.215 -0.331 -0.204 -0.264 -0.246 -0.234 -0.304 -0.216 -0.278 + -0.261 -0.313 -0.243 -0.188 -0.251 -0.283 -0.234 -0.199 -0.273 -0.225 + -0.225 -0.155 -0.223 -0.295 -0.125 -0.156 -0.164 -0.196 -0.162 -0.170 + + 233 iasi_metop-a 345 0.570331E-01 + 0.265 0.215 0.343 0.339 0.195 0.128 0.175 0.069 0.113 0.013 + 0.027 0.021 -0.008 0.062 -0.042 -0.011 -0.008 -0.043 -0.096 -0.094 + -0.109 -0.150 -0.081 -0.095 -0.121 -0.115 -0.146 -0.142 -0.112 -0.154 + 0.443 0.317 0.262 0.233 0.386 0.334 0.407 0.315 0.437 0.358 + 0.328 0.264 0.222 0.419 0.322 0.377 0.404 0.196 0.354 0.359 + 0.271 0.157 0.141 0.338 0.193 0.340 0.190 0.363 0.358 0.283 + 0.160 0.354 0.264 0.370 0.289 0.203 0.299 0.181 0.505 0.287 + 0.290 0.255 0.276 0.392 0.323 0.297 0.259 0.353 0.227 0.324 + 0.324 0.363 0.433 0.351 0.333 0.414 0.414 0.441 0.354 0.315 + + 234 iasi_metop-a 347 0.442256E-01 + -0.065 0.008 -0.119 -0.179 0.068 -0.020 0.054 -0.011 0.155 -0.006 + 0.085 0.006 0.175 0.170 0.178 0.230 0.257 0.204 0.242 0.227 + 0.287 0.228 0.342 0.339 0.392 0.400 0.642 0.612 0.594 0.515 + -0.283 -0.322 -0.221 -0.215 -0.394 -0.288 -0.279 -0.289 -0.333 -0.375 + -0.305 -0.228 -0.288 -0.283 -0.289 -0.232 -0.342 -0.502 -0.296 -0.245 + -0.265 -0.399 -0.394 -0.265 -0.457 -0.370 -0.424 -0.217 -0.419 -0.429 + -0.337 -0.261 -0.434 -0.350 -0.341 -0.384 -0.331 -0.421 -0.278 -0.345 + -0.307 -0.409 -0.279 -0.265 -0.309 -0.374 -0.263 -0.221 -0.304 -0.323 + -0.251 -0.200 -0.299 -0.387 -0.184 -0.247 -0.236 -0.249 -0.293 -0.280 + + 235 iasi_metop-a 350 0.482951E-01 + -0.026 0.019 0.067 0.054 -0.077 -0.085 -0.018 -0.050 -0.070 -0.177 + -0.208 -0.109 -0.228 -0.229 -0.179 -0.136 -0.166 -0.235 -0.224 -0.230 + -0.239 -0.343 -0.263 -0.213 -0.287 -0.306 -0.305 -0.271 -0.280 -0.356 + -0.041 0.104 -0.048 -0.099 0.007 -0.098 0.081 -0.228 -0.052 -0.034 + -0.126 -0.183 0.057 0.089 -0.023 -0.086 -0.157 -0.092 -0.162 -0.062 + -0.018 -0.110 -0.193 -0.169 -0.196 0.026 -0.291 -0.034 -0.089 -0.101 + -0.016 -0.163 -0.138 0.096 -0.187 -0.183 -0.073 -0.027 0.019 -0.444 + -0.017 -0.031 -0.115 0.044 0.038 -0.049 -0.057 0.020 0.032 0.053 + -0.092 -0.010 0.030 -0.030 -0.048 -0.010 0.095 0.189 -0.037 0.013 + + 236 iasi_metop-a 354 0.429181E-01 + -0.205 -0.107 -0.167 -0.247 -0.066 -0.182 -0.129 -0.087 -0.024 -0.119 + -0.098 -0.102 -0.048 -0.074 -0.107 -0.055 0.010 -0.016 -0.069 -0.012 + 0.056 -0.028 0.048 0.027 0.081 0.088 0.154 0.143 0.164 0.140 + -0.173 -0.103 -0.191 -0.254 -0.195 -0.103 -0.250 -0.290 -0.172 -0.159 + -0.201 -0.290 -0.136 -0.054 -0.270 -0.289 -0.233 -0.241 -0.203 -0.223 + -0.188 -0.224 -0.324 -0.229 -0.314 -0.107 -0.338 -0.214 -0.274 -0.217 + -0.147 -0.290 -0.281 -0.106 -0.208 -0.305 -0.205 -0.173 -0.209 -0.325 + -0.174 -0.128 -0.265 -0.214 -0.158 -0.177 -0.238 -0.212 -0.127 -0.083 + -0.197 -0.186 -0.192 -0.194 -0.109 -0.222 -0.088 -0.057 -0.145 -0.205 + + 237 iasi_metop-a 356 0.485200E-01 + 0.087 0.156 0.147 0.098 0.018 0.035 0.029 -0.028 0.046 -0.006 + -0.127 -0.084 -0.050 -0.019 -0.114 -0.095 -0.020 -0.088 -0.139 -0.202 + -0.143 -0.102 -0.181 -0.214 -0.160 -0.094 -0.251 -0.274 -0.159 -0.147 + 0.067 0.178 0.000 -0.010 0.059 -0.060 0.164 -0.181 0.060 0.094 + -0.083 -0.083 0.073 0.170 0.031 -0.037 -0.090 -0.034 -0.054 -0.021 + 0.052 -0.055 -0.113 -0.138 -0.089 0.152 -0.207 0.072 -0.009 0.006 + 0.065 -0.043 -0.131 0.160 -0.080 -0.099 -0.058 0.010 0.138 -0.394 + 0.070 0.025 -0.058 0.079 0.136 0.007 0.007 0.104 0.067 0.158 + -0.034 0.009 0.031 -0.014 0.053 0.090 0.148 0.278 -0.001 0.012 + + 238 iasi_metop-a 360 0.409661E-01 + -0.110 -0.080 -0.122 -0.220 -0.011 -0.082 -0.069 -0.107 0.051 -0.042 + -0.030 -0.044 0.022 0.027 -0.033 0.034 0.111 0.046 0.018 0.055 + 0.119 0.060 0.140 0.117 0.144 0.184 0.254 0.242 0.256 0.239 + -0.080 -0.072 -0.116 -0.178 -0.127 -0.069 -0.101 -0.255 -0.094 -0.162 + -0.207 -0.173 -0.042 -0.022 -0.224 -0.238 -0.108 -0.259 -0.188 -0.156 + -0.130 -0.166 -0.261 -0.175 -0.262 -0.113 -0.246 -0.201 -0.163 -0.168 + -0.129 -0.215 -0.199 -0.122 -0.162 -0.311 -0.154 -0.119 -0.181 -0.263 + -0.152 -0.113 -0.184 -0.129 -0.147 -0.093 -0.210 -0.129 -0.056 -0.084 + -0.098 -0.166 -0.125 -0.108 -0.097 -0.147 -0.044 -0.035 -0.083 -0.129 + + 239 iasi_metop-a 363 0.437924E-01 + 0.033 0.110 0.096 0.010 0.023 0.014 -0.004 -0.071 0.050 -0.028 + -0.123 -0.062 -0.103 -0.005 -0.111 -0.090 -0.007 -0.071 -0.151 -0.192 + -0.114 -0.099 -0.158 -0.170 -0.132 -0.090 -0.223 -0.226 -0.134 -0.151 + 0.007 0.022 -0.151 -0.031 -0.016 -0.227 0.122 -0.241 -0.002 -0.108 + -0.218 -0.188 -0.062 0.092 0.031 0.000 -0.261 -0.134 -0.157 0.008 + 0.016 -0.115 -0.201 -0.261 -0.169 -0.003 -0.332 -0.032 -0.151 -0.070 + 0.010 -0.041 -0.184 0.105 -0.282 -0.181 -0.082 -0.128 -0.009 -0.381 + 0.058 -0.137 -0.099 0.004 0.087 -0.174 -0.068 0.061 0.040 -0.017 + -0.084 -0.016 0.015 -0.001 -0.014 0.070 -0.003 0.155 -0.006 0.017 + + 240 iasi_metop-a 366 0.413952E-01 + -0.177 -0.161 -0.219 -0.289 -0.071 -0.183 -0.173 -0.136 -0.013 -0.095 + -0.159 -0.109 -0.023 -0.099 -0.129 -0.010 0.018 -0.042 -0.064 -0.039 + 0.045 -0.021 0.016 -0.017 0.071 0.028 0.071 0.096 0.157 0.085 + -0.114 -0.085 -0.117 -0.124 -0.103 -0.088 -0.083 -0.239 -0.126 -0.136 + -0.182 -0.194 -0.154 -0.032 -0.194 -0.156 -0.195 -0.177 -0.210 -0.139 + -0.102 -0.181 -0.220 -0.156 -0.231 -0.086 -0.272 -0.137 -0.207 -0.164 + -0.138 -0.155 -0.218 -0.089 -0.154 -0.300 -0.095 -0.119 -0.153 -0.242 + -0.132 -0.117 -0.186 -0.126 -0.121 -0.147 -0.162 -0.136 -0.100 -0.078 + -0.147 -0.074 -0.156 -0.151 -0.045 -0.097 -0.069 -0.002 -0.113 -0.125 + + 241 iasi_metop-a 371 0.482715E-01 + -0.062 0.023 -0.058 -0.099 -0.052 -0.052 -0.091 -0.129 -0.015 -0.048 + -0.137 -0.179 -0.105 -0.072 -0.191 -0.157 -0.088 -0.093 -0.205 -0.232 + -0.178 -0.171 -0.252 -0.252 -0.204 -0.154 -0.282 -0.308 -0.199 -0.194 + -0.210 -0.242 -0.198 -0.127 -0.203 -0.384 -0.150 -0.274 -0.259 -0.331 + -0.279 -0.298 -0.267 -0.255 -0.269 -0.201 -0.361 -0.441 -0.273 -0.088 + -0.215 -0.458 -0.324 -0.218 -0.377 -0.369 -0.379 -0.095 -0.308 -0.393 + -0.215 -0.182 -0.379 -0.243 -0.296 -0.296 -0.382 -0.347 -0.157 -0.381 + -0.217 -0.373 -0.266 -0.164 -0.235 -0.383 -0.215 -0.146 -0.194 -0.304 + -0.212 -0.147 -0.241 -0.384 -0.176 -0.098 -0.183 -0.172 -0.154 -0.137 + + 242 iasi_metop-a 372 0.450507E-01 + -0.210 -0.196 -0.214 -0.235 -0.120 -0.254 -0.195 -0.172 -0.100 -0.223 + -0.184 -0.127 -0.150 -0.171 -0.172 -0.063 -0.091 -0.171 -0.144 -0.084 + -0.096 -0.187 -0.042 -0.059 -0.089 -0.150 0.006 0.056 -0.038 -0.109 + -0.133 -0.044 -0.066 -0.078 -0.089 -0.098 -0.053 -0.194 -0.159 -0.154 + -0.174 -0.262 -0.149 -0.064 -0.157 -0.158 -0.194 -0.211 -0.135 -0.045 + -0.098 -0.206 -0.185 -0.167 -0.223 -0.088 -0.241 -0.089 -0.200 -0.175 + -0.123 -0.118 -0.193 -0.116 -0.136 -0.243 -0.149 -0.184 -0.073 -0.151 + -0.130 -0.137 -0.154 -0.143 -0.128 -0.159 -0.150 -0.117 -0.096 -0.057 + -0.073 -0.113 -0.137 -0.145 -0.042 -0.099 -0.074 0.004 -0.083 -0.078 + + 243 iasi_metop-a 373 0.485617E-01 + 0.085 0.125 0.167 0.161 0.082 0.057 0.084 0.052 0.051 0.008 + -0.020 0.025 -0.016 0.021 -0.024 0.000 0.021 -0.036 -0.060 -0.046 + -0.054 -0.115 -0.073 -0.087 -0.114 -0.083 -0.169 -0.169 -0.123 -0.141 + 0.158 0.344 0.206 0.107 0.238 0.249 0.160 -0.057 0.176 0.206 + 0.079 -0.091 0.174 0.318 0.119 0.037 0.067 0.081 0.076 0.095 + 0.222 0.120 -0.004 -0.035 0.069 0.296 -0.057 0.112 0.078 0.171 + 0.086 -0.022 0.069 0.282 0.105 -0.119 0.188 0.162 0.174 -0.076 + 0.225 0.217 0.056 0.043 0.182 0.204 0.109 0.051 0.224 0.270 + 0.131 0.099 0.208 0.204 0.202 0.087 0.252 0.453 0.109 0.078 + + 244 iasi_metop-a 375 0.452136E-01 + 0.324 0.408 0.337 0.250 0.349 0.290 0.263 0.174 0.364 0.293 + 0.138 0.179 0.218 0.284 0.150 0.181 0.277 0.259 0.175 0.130 + 0.238 0.209 0.209 0.177 0.261 0.393 0.259 0.209 0.317 0.347 + 0.006 0.140 -0.039 0.011 0.066 -0.050 0.136 -0.131 0.010 -0.011 + -0.037 -0.110 0.014 0.228 0.083 -0.026 -0.157 -0.055 0.024 0.117 + -0.023 0.001 -0.147 -0.163 -0.063 0.137 -0.301 0.069 -0.024 -0.010 + 0.117 0.022 -0.104 0.173 -0.162 -0.112 -0.014 -0.005 0.155 -0.405 + 0.055 -0.026 -0.028 0.090 0.095 -0.075 0.048 0.119 0.141 0.162 + 0.014 0.050 0.047 0.049 0.076 0.081 0.112 0.243 0.095 0.082 + + 245 iasi_metop-a 377 0.484231E-01 + 0.057 0.193 0.058 -0.078 0.143 0.041 0.045 0.014 0.124 0.067 + -0.004 -0.022 0.077 0.040 -0.029 0.026 0.077 0.081 0.003 0.010 + 0.100 0.073 0.119 0.081 0.153 0.184 0.222 0.213 0.280 0.246 + -0.231 -0.246 -0.239 -0.105 -0.233 -0.422 -0.130 -0.293 -0.234 -0.372 + -0.249 -0.279 -0.247 -0.282 -0.198 -0.241 -0.355 -0.439 -0.280 -0.131 + -0.250 -0.431 -0.373 -0.252 -0.352 -0.356 -0.443 -0.032 -0.310 -0.376 + -0.229 -0.194 -0.367 -0.272 -0.288 -0.229 -0.283 -0.391 -0.101 -0.435 + -0.191 -0.389 -0.291 -0.014 -0.236 -0.403 -0.202 -0.109 -0.241 -0.328 + -0.196 -0.119 -0.245 -0.389 -0.166 -0.065 -0.173 -0.201 -0.192 -0.184 + + 246 iasi_metop-a 379 0.480935E-01 + 0.084 0.030 0.143 0.130 0.072 -0.049 0.061 0.097 0.013 -0.037 + 0.035 0.081 -0.027 -0.068 -0.009 0.090 0.026 -0.116 0.003 0.060 + -0.025 -0.113 0.046 0.084 -0.007 -0.111 0.046 0.123 0.087 -0.051 + 0.174 0.366 0.150 0.145 0.175 0.272 0.199 0.005 0.126 0.237 + 0.100 -0.020 0.169 0.356 0.140 0.014 0.118 0.128 0.106 0.098 + 0.201 0.205 0.061 0.019 0.103 0.264 -0.057 0.181 0.016 0.154 + 0.131 0.024 -0.004 0.341 0.144 -0.023 0.263 0.235 0.154 -0.058 + 0.208 0.195 0.058 0.142 0.182 0.213 0.145 0.105 0.196 0.301 + 0.134 0.165 0.197 0.205 0.203 0.125 0.256 0.451 0.152 0.059 + + 247 iasi_metop-a 381 0.477830E-01 + 0.403 0.484 0.432 0.339 0.410 0.389 0.346 0.263 0.448 0.402 + 0.230 0.227 0.271 0.348 0.234 0.215 0.303 0.375 0.277 0.192 + 0.317 0.321 0.242 0.221 0.302 0.426 0.267 0.217 0.340 0.397 + 0.242 0.381 0.239 0.271 0.272 0.130 0.374 0.106 0.209 0.228 + 0.120 0.074 0.228 0.379 0.248 0.049 0.082 0.110 0.172 0.243 + 0.188 0.140 0.025 0.119 0.110 0.274 -0.059 0.352 0.129 0.124 + 0.177 0.223 0.159 0.258 0.074 0.115 0.158 0.144 0.327 -0.029 + 0.218 0.101 0.183 0.280 0.280 0.131 0.295 0.268 0.266 0.245 + 0.165 0.282 0.281 0.158 0.212 0.236 0.330 0.415 0.257 0.259 + + 248 iasi_metop-a 383 0.559023E-01 + 0.080 0.169 0.062 -0.050 0.196 0.089 0.099 0.049 0.168 0.073 + 0.009 0.035 0.089 0.082 0.039 0.112 0.167 0.135 0.113 0.084 + 0.246 0.142 0.218 0.217 0.244 0.318 0.377 0.369 0.384 0.363 + -0.186 -0.216 -0.229 -0.132 -0.206 -0.347 -0.189 -0.215 -0.281 -0.289 + -0.201 -0.188 -0.142 -0.178 -0.189 -0.056 -0.194 -0.408 -0.282 -0.075 + -0.176 -0.238 -0.232 -0.110 -0.290 -0.222 -0.326 0.001 -0.120 -0.266 + -0.146 -0.112 -0.292 -0.214 -0.082 -0.159 -0.189 -0.418 -0.033 -0.265 + -0.159 -0.385 -0.190 -0.113 -0.214 -0.292 -0.252 -0.084 -0.142 -0.248 + -0.218 -0.053 -0.182 -0.324 -0.170 -0.130 -0.144 -0.162 -0.217 -0.147 + + 249 iasi_metop-a 386 0.530214E-01 + 0.096 0.088 0.169 0.117 0.080 -0.052 0.061 0.056 0.033 -0.083 + 0.004 0.003 0.001 -0.011 -0.022 0.013 0.032 -0.112 -0.048 0.044 + -0.053 -0.124 0.033 0.001 -0.020 -0.051 -0.002 0.036 0.014 -0.051 + 0.281 0.233 0.263 0.175 0.193 0.191 0.199 0.196 0.195 0.150 + 0.153 0.184 0.333 0.276 0.204 0.230 0.208 0.094 0.223 0.232 + 0.271 0.200 0.181 0.258 0.206 0.270 0.058 0.259 0.214 0.170 + 0.262 0.202 0.174 0.268 0.223 0.216 0.265 0.242 0.351 0.184 + 0.250 0.214 0.209 0.218 0.283 0.187 0.176 0.293 0.180 0.216 + 0.215 0.238 0.227 0.223 0.300 0.230 0.296 0.244 0.203 0.232 + + 250 iasi_metop-a 389 0.479461E-01 + 0.027 0.043 -0.027 -0.019 0.101 -0.006 0.027 0.063 0.109 0.060 + 0.022 0.091 0.054 0.107 0.000 0.130 0.148 0.094 0.088 0.124 + 0.110 0.118 0.128 0.137 0.144 0.187 0.215 0.225 0.236 0.208 + -0.250 -0.202 -0.197 -0.189 -0.231 -0.262 -0.175 -0.264 -0.326 -0.295 + -0.355 -0.299 -0.214 -0.150 -0.314 -0.283 -0.339 -0.335 -0.273 -0.255 + -0.284 -0.350 -0.384 -0.338 -0.409 -0.288 -0.472 -0.202 -0.293 -0.386 + -0.276 -0.263 -0.377 -0.261 -0.286 -0.336 -0.343 -0.314 -0.243 -0.441 + -0.330 -0.350 -0.318 -0.215 -0.326 -0.290 -0.266 -0.209 -0.276 -0.239 + -0.268 -0.183 -0.329 -0.296 -0.183 -0.155 -0.184 -0.158 -0.270 -0.173 + + 251 iasi_metop-a 398 0.470839E-01 + 0.036 0.060 0.083 0.047 -0.006 -0.014 0.003 0.004 -0.032 -0.078 + -0.174 -0.051 -0.149 -0.132 -0.185 -0.123 -0.135 -0.178 -0.172 -0.206 + -0.209 -0.286 -0.171 -0.171 -0.240 -0.215 -0.194 -0.188 -0.184 -0.246 + 0.065 0.300 -0.001 0.039 -0.018 0.062 0.106 -0.192 -0.019 0.193 + 0.059 0.008 0.070 0.431 0.008 0.040 0.105 0.004 -0.087 0.034 + 0.122 0.076 -0.067 -0.101 -0.019 0.259 -0.221 0.115 0.044 0.050 + 0.105 -0.004 -0.165 0.232 -0.016 -0.059 0.089 0.100 0.144 -0.181 + 0.249 0.159 0.051 0.126 0.172 0.078 0.111 0.198 0.200 0.052 + 0.093 0.126 0.085 0.144 0.111 0.070 0.206 0.441 0.045 -0.047 + + 252 iasi_metop-a 401 0.504861E-01 + -0.046 0.088 -0.109 -0.220 0.125 -0.002 -0.004 -0.099 0.172 -0.028 + -0.085 -0.097 -0.023 0.038 -0.067 0.054 0.119 0.067 0.041 -0.014 + 0.110 0.031 0.135 0.021 0.148 0.212 0.166 0.157 0.274 0.295 + -0.405 -0.353 -0.565 -0.365 -0.365 -0.530 -0.564 -0.518 -0.542 -0.551 + -0.337 -0.540 -0.435 -0.302 -0.511 -0.319 -0.346 -0.735 -0.582 -0.397 + -0.505 -0.558 -0.510 -0.536 -0.600 -0.477 -0.803 -0.404 -0.538 -0.603 + -0.367 -0.498 -0.633 -0.450 -0.425 -0.453 -0.491 -0.813 -0.353 -0.708 + -0.360 -0.577 -0.542 -0.314 -0.520 -0.610 -0.400 -0.358 -0.292 -0.489 + -0.482 -0.311 -0.407 -0.583 -0.383 -0.264 -0.312 -0.221 -0.494 -0.410 + + 253 iasi_metop-a 404 0.375646E-01 + 0.057 0.127 0.114 0.092 0.097 -0.024 0.061 -0.032 0.091 -0.123 + -0.173 -0.059 -0.108 -0.157 -0.147 -0.051 -0.093 -0.230 -0.073 -0.060 + -0.191 -0.289 -0.119 -0.097 -0.221 -0.125 -0.196 -0.137 -0.077 -0.167 + 0.229 0.355 0.048 0.120 0.388 0.090 0.203 -0.165 0.272 0.256 + 0.081 -0.124 0.094 0.440 0.151 -0.046 -0.135 0.202 0.019 0.060 + 0.280 0.034 -0.074 -0.246 -0.081 0.310 -0.267 0.165 0.032 0.115 + 0.373 -0.140 -0.046 0.392 0.040 -0.022 0.146 0.224 0.221 -0.576 + 0.452 0.088 0.037 0.232 0.210 0.017 0.269 0.275 0.380 0.211 + 0.078 0.110 0.263 0.114 0.137 0.307 0.307 0.542 0.426 0.040 + + 254 iasi_metop-a 405 0.296677E-01 + 0.274 0.499 0.229 0.172 0.496 0.258 0.282 0.208 0.400 0.369 + 0.211 0.178 0.240 0.154 0.124 0.218 0.432 0.250 0.120 0.170 + 0.348 0.334 0.316 0.166 0.380 0.413 0.264 0.268 0.508 0.484 + 0.222 0.152 -0.135 0.076 0.195 -0.102 0.103 -0.261 0.171 0.092 + -0.108 -0.296 -0.054 0.441 0.020 -0.289 -0.305 -0.005 -0.060 0.044 + 0.317 -0.199 -0.229 -0.225 -0.256 0.280 -0.472 0.008 -0.257 -0.003 + 0.355 -0.008 -0.209 0.189 -0.070 0.014 -0.038 0.020 0.020 -0.521 + 0.397 0.036 -0.078 -0.046 0.075 -0.223 0.238 0.213 0.275 0.033 + -0.037 -0.019 0.184 0.155 0.025 0.208 0.106 0.376 0.205 0.000 + + 255 iasi_metop-a 407 0.399343E-01 + 0.226 0.352 0.226 0.051 0.340 0.216 0.169 0.051 0.272 0.189 + 0.058 0.090 0.126 0.093 0.016 0.125 0.274 0.123 -0.016 0.109 + 0.215 0.112 0.141 0.095 0.159 0.183 0.020 0.097 0.270 0.250 + -0.062 -0.096 -0.242 0.027 -0.026 -0.360 0.018 -0.263 -0.063 -0.139 + -0.223 -0.282 -0.251 -0.056 -0.097 -0.159 -0.329 -0.162 -0.171 -0.057 + -0.153 -0.267 -0.282 -0.272 -0.380 -0.135 -0.464 0.097 -0.291 -0.207 + 0.014 -0.134 -0.362 -0.101 -0.257 -0.077 -0.211 -0.235 -0.109 -0.637 + 0.082 -0.373 -0.170 0.127 -0.056 -0.416 -0.055 0.087 0.036 -0.153 + -0.175 0.011 -0.110 -0.269 -0.099 0.029 0.005 0.088 0.032 -0.044 + + 256 iasi_metop-a 408 0.480710E-01 + 0.104 0.264 0.130 0.102 0.258 0.094 0.111 0.102 0.199 0.056 + 0.030 0.053 0.084 0.035 -0.004 0.125 0.129 0.000 -0.012 0.085 + 0.146 -0.032 0.133 0.113 0.114 0.034 0.065 0.146 0.226 0.116 + -0.064 0.070 -0.021 0.028 0.081 -0.092 0.041 -0.157 -0.004 0.020 + -0.120 -0.182 0.019 0.039 -0.017 -0.072 -0.136 -0.123 -0.115 -0.019 + 0.093 -0.118 -0.220 -0.126 -0.246 -0.053 -0.255 0.150 -0.160 -0.193 + 0.071 -0.120 -0.195 0.031 -0.055 -0.079 -0.060 -0.135 -0.139 -0.277 + 0.099 -0.099 -0.062 0.118 -0.022 -0.220 -0.039 0.136 0.078 -0.153 + -0.082 0.119 -0.026 -0.165 0.043 0.161 0.071 0.209 -0.015 -0.035 + + 257 iasi_metop-a 410 0.366006E-01 + 0.260 0.311 0.230 0.220 0.301 0.177 0.209 0.224 0.350 0.141 + 0.079 0.266 0.171 0.092 0.139 0.216 0.218 0.100 0.126 0.177 + 0.164 0.055 0.199 0.205 0.211 0.180 0.168 0.245 0.246 0.182 + 0.179 0.294 -0.043 0.089 0.285 0.107 0.112 -0.231 0.318 0.191 + 0.116 -0.231 0.032 0.433 0.166 -0.197 -0.130 0.103 0.070 -0.054 + 0.320 0.035 -0.040 -0.385 -0.200 0.343 -0.301 0.174 -0.067 0.146 + 0.383 -0.091 -0.086 0.384 0.034 -0.097 0.048 0.131 0.099 -0.680 + 0.320 0.069 0.064 0.187 0.205 -0.125 0.173 0.267 0.358 0.134 + 0.000 0.159 0.112 0.049 0.124 0.300 0.275 0.573 0.232 -0.082 + + 258 iasi_metop-a 411 0.289924E-01 + 0.267 0.488 0.259 0.162 0.480 0.259 0.228 0.180 0.388 0.368 + 0.231 0.169 0.208 0.106 0.074 0.185 0.390 0.269 0.145 0.165 + 0.331 0.334 0.336 0.139 0.370 0.436 0.250 0.232 0.464 0.451 + 0.249 0.113 -0.182 0.116 0.174 -0.044 0.096 -0.248 0.103 -0.035 + -0.065 -0.318 -0.042 0.443 0.053 -0.283 -0.299 -0.020 -0.069 -0.019 + 0.247 -0.119 -0.133 -0.278 -0.270 0.274 -0.509 0.047 -0.199 0.081 + 0.318 0.080 -0.228 0.259 -0.092 -0.028 0.016 -0.077 0.134 -0.485 + 0.362 0.039 -0.044 0.002 0.059 -0.173 0.222 0.208 0.299 0.022 + -0.088 -0.020 0.148 0.183 -0.021 0.226 0.152 0.468 0.251 -0.075 + + 259 iasi_metop-a 414 0.476441E-01 + -0.165 -0.149 -0.341 -0.416 0.139 -0.147 -0.150 -0.196 0.052 -0.222 + -0.192 -0.178 -0.078 -0.269 -0.206 -0.160 0.002 -0.147 -0.323 -0.162 + -0.049 -0.089 -0.064 0.006 -0.008 -0.086 -0.119 -0.028 0.105 0.025 + -0.724 -0.447 -0.781 -0.621 -0.282 -0.747 -0.671 -0.708 -0.673 -0.772 + -0.540 -0.683 -0.703 -0.748 -0.795 -0.457 -0.668 -0.656 -0.924 -0.411 + -0.782 -0.530 -0.635 -0.696 -0.580 -0.737 -0.833 -0.698 -0.674 -0.642 + -0.441 -0.502 -0.817 -0.625 -0.542 -0.732 -0.690 -0.875 -0.611 -1.151 + -0.628 -0.791 -0.914 -0.597 -0.624 -0.675 -0.607 -0.624 -0.545 -0.693 + -0.650 -0.620 -0.546 -0.895 -0.565 -0.482 -0.516 -0.528 -0.552 -0.738 + + 260 iasi_metop-a 416 0.366446E-01 + -0.287 -0.190 -0.216 -0.185 -0.248 -0.310 -0.302 -0.372 -0.335 -0.284 + -0.558 -0.281 -0.410 -0.448 -0.366 -0.413 -0.447 -0.567 -0.400 -0.293 + -0.543 -0.464 -0.373 -0.447 -0.428 -0.401 -0.579 -0.540 -0.413 -0.514 + -0.086 0.078 -0.262 -0.216 0.027 -0.240 -0.166 -0.460 -0.102 -0.062 + -0.150 -0.406 -0.151 0.115 -0.094 -0.199 -0.278 -0.098 -0.305 -0.150 + -0.046 -0.127 -0.194 -0.456 -0.375 0.049 -0.428 -0.184 -0.186 -0.112 + 0.097 -0.359 -0.332 0.095 -0.083 -0.296 -0.104 -0.083 -0.190 -0.843 + 0.129 -0.056 -0.337 -0.092 0.038 -0.279 -0.010 0.039 0.169 -0.147 + -0.180 -0.096 -0.048 -0.291 -0.110 0.101 0.076 0.246 0.000 -0.350 + + 261 iasi_metop-a 418 0.277665E-01 + -0.005 0.277 0.030 -0.099 0.279 0.074 0.021 -0.108 0.152 0.133 + -0.085 -0.052 0.008 -0.022 -0.145 -0.099 0.057 -0.062 -0.128 -0.043 + 0.011 0.036 0.005 -0.195 0.009 0.120 -0.183 -0.168 0.118 0.080 + 0.169 0.010 -0.267 0.038 0.086 -0.116 -0.007 -0.336 -0.090 -0.236 + -0.094 -0.333 -0.190 0.225 -0.040 -0.268 -0.420 -0.208 -0.139 0.020 + 0.222 -0.380 -0.286 -0.333 -0.414 0.186 -0.514 -0.014 -0.238 -0.133 + 0.195 0.006 -0.329 0.087 -0.149 -0.098 -0.014 -0.139 -0.083 -0.556 + 0.274 -0.091 -0.147 -0.025 0.025 -0.431 0.265 0.211 0.204 -0.068 + -0.127 0.049 0.071 0.017 0.038 0.354 0.129 0.216 0.161 -0.189 + + 262 iasi_metop-a 423 0.226278E-01 + 0.192 0.334 0.218 0.105 0.354 0.133 0.199 0.153 0.329 0.117 + 0.014 0.171 0.100 -0.012 -0.021 0.097 0.330 -0.001 -0.074 0.152 + 0.173 0.113 0.138 0.090 0.217 0.145 -0.040 0.053 0.278 0.185 + 0.153 0.021 -0.339 0.079 0.169 -0.207 0.007 -0.379 0.011 -0.112 + -0.129 -0.411 0.004 0.344 -0.001 -0.292 -0.323 -0.170 -0.028 -0.063 + 0.354 -0.155 -0.179 -0.294 -0.383 0.250 -0.529 -0.101 -0.280 -0.051 + 0.135 0.132 -0.268 0.179 -0.154 -0.174 -0.054 -0.106 -0.028 -0.636 + 0.273 -0.032 -0.163 -0.051 -0.026 -0.326 0.335 0.259 0.348 0.042 + -0.121 -0.117 0.080 0.176 -0.008 0.154 0.146 0.522 0.154 -0.062 + + 263 iasi_metop-a 426 0.459740E-01 + 0.387 0.539 0.436 0.300 0.455 0.341 0.378 0.237 0.420 0.303 + 0.122 0.244 0.232 0.263 0.144 0.179 0.403 0.197 0.123 0.207 + 0.281 0.272 0.298 0.203 0.240 0.196 0.010 0.048 0.312 0.261 + 0.093 0.279 0.220 0.100 0.241 0.026 0.185 0.003 0.212 0.203 + 0.106 -0.009 0.166 0.279 0.108 0.104 -0.009 0.021 -0.007 0.126 + 0.219 0.073 -0.008 0.095 -0.079 0.183 -0.127 0.196 -0.026 0.047 + 0.216 0.065 -0.058 0.169 0.112 0.056 0.076 0.078 0.144 -0.241 + 0.288 0.035 0.128 0.221 0.183 -0.086 0.200 0.292 0.280 -0.008 + 0.049 0.185 0.021 -0.026 0.123 0.314 0.236 0.333 0.218 0.144 + + 264 iasi_metop-a 428 0.331689E-01 + 0.259 0.397 0.274 0.236 0.475 0.245 0.334 0.281 0.416 0.252 + 0.251 0.315 0.237 0.178 0.210 0.302 0.344 0.194 0.223 0.262 + 0.323 0.230 0.373 0.282 0.347 0.324 0.334 0.346 0.417 0.369 + 0.329 0.288 -0.080 0.144 0.270 0.105 0.061 -0.232 0.123 0.053 + 0.054 -0.205 -0.003 0.397 0.090 -0.218 -0.194 0.011 -0.175 0.075 + 0.195 -0.090 -0.127 -0.258 -0.208 0.236 -0.431 0.071 -0.098 -0.018 + 0.273 -0.058 -0.190 0.373 -0.025 -0.045 0.111 0.090 0.079 -0.558 + 0.489 0.048 -0.076 0.093 0.171 -0.241 0.244 0.169 0.362 0.174 + -0.089 0.127 0.101 0.172 0.073 0.267 0.342 0.602 0.386 -0.060 + + 265 iasi_metop-a 432 0.457504E-01 + 0.278 0.414 0.293 0.236 0.447 0.300 0.324 0.163 0.406 0.325 + 0.166 0.244 0.297 0.245 0.162 0.273 0.425 0.249 0.159 0.248 + 0.350 0.241 0.319 0.257 0.363 0.365 0.154 0.192 0.404 0.399 + 0.069 0.217 0.093 0.084 0.128 -0.028 0.140 -0.134 0.100 0.097 + -0.035 -0.198 0.076 0.163 -0.056 -0.069 -0.100 -0.113 -0.052 -0.024 + 0.013 -0.099 -0.136 -0.151 -0.254 0.043 -0.362 0.063 -0.223 -0.126 + 0.050 -0.143 -0.252 0.015 -0.102 -0.082 -0.126 -0.049 0.044 -0.527 + 0.075 -0.089 0.022 0.096 0.043 -0.261 0.113 0.173 0.123 -0.021 + -0.009 0.119 -0.018 -0.158 0.088 0.234 0.155 0.326 0.120 0.061 + + 266 iasi_metop-a 433 0.423237E-01 + 0.298 0.384 0.346 0.326 0.443 0.313 0.338 0.264 0.435 0.281 + 0.282 0.353 0.248 0.245 0.185 0.345 0.323 0.194 0.217 0.221 + 0.246 0.190 0.324 0.207 0.245 0.256 0.205 0.218 0.324 0.284 + 0.193 0.497 0.196 0.188 0.386 0.173 0.272 -0.024 0.344 0.388 + 0.115 -0.103 0.177 0.435 0.212 0.009 0.008 0.192 0.033 0.064 + 0.246 0.121 0.055 -0.187 -0.081 0.308 -0.194 0.178 -0.023 0.142 + 0.191 -0.001 -0.088 0.251 0.084 0.050 0.044 0.164 0.191 -0.435 + 0.288 0.103 0.084 0.229 0.232 0.001 0.312 0.323 0.363 0.159 + 0.175 0.236 0.127 0.048 0.229 0.394 0.356 0.637 0.308 0.213 + + 267 iasi_metop-a 434 0.316626E-01 + 0.283 0.516 0.312 0.267 0.554 0.343 0.399 0.287 0.526 0.348 + 0.330 0.335 0.339 0.301 0.253 0.323 0.402 0.297 0.238 0.254 + 0.358 0.332 0.367 0.178 0.379 0.384 0.305 0.288 0.422 0.444 + 0.108 0.226 -0.205 0.020 0.233 0.024 0.091 -0.323 0.107 0.025 + -0.023 -0.219 0.036 0.339 0.137 -0.124 -0.328 -0.143 -0.110 0.025 + 0.095 -0.184 -0.158 -0.399 -0.295 0.262 -0.360 0.090 -0.163 0.003 + 0.252 -0.179 -0.229 0.336 -0.121 -0.141 0.012 0.090 0.072 -0.493 + 0.385 -0.065 -0.064 0.085 0.083 -0.336 0.269 0.219 0.255 0.102 + -0.047 0.035 0.034 0.129 0.024 0.270 0.226 0.519 0.212 -0.090 + + 268 iasi_metop-a 439 0.512756E-01 + 0.242 0.367 0.250 0.219 0.494 0.195 0.281 0.255 0.371 0.140 + 0.214 0.173 0.259 0.138 0.119 0.263 0.414 0.192 0.160 0.204 + 0.303 0.225 0.336 0.297 0.360 0.256 0.140 0.209 0.423 0.358 + 0.085 0.259 0.024 0.070 0.151 0.098 0.010 -0.037 0.039 0.206 + 0.208 -0.147 0.062 0.382 0.041 0.141 0.078 -0.110 -0.161 0.099 + -0.052 0.150 -0.098 -0.162 -0.046 0.151 -0.418 0.022 0.009 -0.050 + 0.194 -0.023 -0.140 0.168 0.136 -0.212 0.044 -0.164 0.133 -0.343 + 0.153 0.056 -0.101 0.011 0.000 -0.059 0.016 0.074 0.212 0.159 + -0.006 0.234 0.095 -0.021 0.109 0.211 0.239 0.469 0.034 -0.040 + + 269 iasi_metop-a 442 0.240620E-01 + 0.187 0.393 0.223 0.133 0.318 0.301 0.222 0.161 0.387 0.239 + 0.017 0.143 0.182 0.127 0.082 0.138 0.276 0.210 0.250 0.199 + 0.123 0.171 0.198 0.106 0.242 0.431 0.228 0.175 0.340 0.321 + 0.208 0.057 -0.314 0.046 0.157 -0.160 0.083 -0.408 -0.057 -0.173 + -0.066 -0.427 -0.014 0.345 -0.064 -0.271 -0.395 -0.343 -0.203 0.024 + 0.100 -0.365 -0.296 -0.340 -0.371 0.242 -0.671 -0.068 -0.250 -0.163 + 0.139 0.013 -0.256 0.175 -0.139 -0.031 -0.031 -0.154 -0.099 -0.633 + 0.364 0.081 -0.082 -0.021 -0.032 -0.264 0.204 0.202 0.317 -0.076 + -0.161 -0.032 0.069 0.160 0.025 0.343 0.151 0.502 0.149 -0.113 + + 270 iasi_metop-a 445 0.413783E-01 + 0.455 0.517 0.485 0.361 0.543 0.400 0.371 0.373 0.425 0.320 + 0.193 0.360 0.331 0.267 0.200 0.393 0.428 0.249 0.156 0.315 + 0.273 0.258 0.357 0.305 0.270 0.214 0.023 0.087 0.389 0.285 + 0.273 0.556 0.179 0.211 0.398 0.174 0.189 -0.021 0.318 0.293 + 0.181 0.025 0.149 0.505 0.138 -0.001 0.093 0.122 0.009 0.064 + 0.189 0.131 -0.011 -0.110 0.045 0.338 -0.257 0.181 0.029 0.127 + 0.209 0.018 -0.077 0.304 0.044 0.064 0.095 0.190 0.188 -0.398 + 0.335 0.118 0.088 0.221 0.358 -0.041 0.265 0.309 0.376 0.148 + 0.124 0.273 0.069 0.165 0.264 0.374 0.409 0.610 0.417 0.203 + + 271 iasi_metop-a 450 0.383629E-01 + 0.342 0.486 0.309 0.188 0.524 0.332 0.352 0.229 0.534 0.360 + 0.279 0.329 0.356 0.347 0.239 0.369 0.439 0.340 0.255 0.319 + 0.394 0.327 0.392 0.270 0.453 0.446 0.330 0.324 0.505 0.481 + 0.028 0.222 0.025 0.019 0.207 -0.087 0.165 -0.165 0.078 0.067 + -0.043 -0.202 -0.145 0.192 0.011 -0.224 -0.206 -0.120 -0.074 -0.085 + -0.028 -0.191 -0.209 -0.281 -0.307 0.057 -0.456 0.025 -0.189 -0.147 + 0.041 -0.218 -0.336 0.076 -0.120 -0.174 -0.119 -0.070 0.002 -0.515 + 0.154 -0.193 -0.104 0.113 0.142 -0.347 0.069 0.120 0.167 0.019 + -0.127 0.028 -0.055 -0.054 0.085 0.167 0.131 0.278 0.207 -0.024 + + 272 iasi_metop-a 457 0.326838E-01 + 0.355 0.505 0.371 0.250 0.502 0.242 0.336 0.365 0.414 0.333 + 0.305 0.260 0.174 0.160 0.205 0.286 0.399 0.172 0.158 0.226 + 0.289 0.263 0.301 0.211 0.309 0.245 0.185 0.210 0.337 0.274 + 0.422 0.362 0.218 0.286 0.529 0.163 0.432 0.096 0.254 0.339 + 0.125 -0.130 0.320 0.594 0.360 -0.021 0.026 0.325 0.056 0.286 + 0.359 0.097 0.045 -0.066 0.072 0.463 -0.245 0.135 -0.021 0.334 + 0.249 0.297 -0.096 0.342 0.039 0.147 0.041 0.249 0.428 -0.084 + 0.435 0.401 0.193 0.118 0.314 0.144 0.421 0.434 0.496 0.324 + 0.138 0.124 0.265 0.436 0.218 0.305 0.406 0.604 0.526 0.222 + + 273 iasi_metop-a 459 0.169125E-01 + 0.378 0.540 0.326 0.275 0.626 0.391 0.321 0.465 0.428 0.391 + 0.318 0.356 0.377 0.289 0.232 0.228 0.523 0.390 0.252 0.317 + 0.390 0.484 0.414 0.324 0.472 0.443 0.302 0.296 0.513 0.570 + 0.154 -0.046 -0.037 -0.132 0.317 -0.236 0.180 -0.140 0.057 -0.195 + -0.185 -0.137 -0.001 0.253 0.089 -0.199 -0.381 -0.008 -0.166 0.019 + 0.169 -0.078 0.242 -0.237 -0.241 0.406 -0.501 -0.024 0.011 0.019 + 0.316 0.180 -0.423 0.054 -0.160 -0.039 -0.030 -0.162 0.316 -0.252 + 0.210 0.190 -0.075 -0.184 0.101 -0.282 0.288 0.279 0.346 0.348 + 0.115 -0.025 0.025 0.181 -0.222 0.019 0.046 0.494 0.172 0.005 + + 274 iasi_metop-a 472 0.153472E-01 + 0.058 0.236 0.039 -0.035 0.323 -0.038 0.066 0.146 0.154 -0.013 + -0.092 0.133 -0.037 0.044 0.056 -0.019 0.363 0.032 0.068 0.144 + 0.165 0.196 0.157 0.079 0.154 0.219 0.143 0.043 0.355 0.298 + -0.174 -0.359 -0.460 -0.445 0.105 -0.467 -0.115 -0.296 -0.277 -0.510 + -0.536 -0.400 -0.320 -0.061 -0.087 -0.417 -0.687 -0.274 -0.459 -0.343 + -0.027 -0.427 -0.096 -0.576 -0.540 0.048 -0.814 -0.344 -0.341 -0.339 + -0.091 0.036 -0.592 -0.179 -0.371 -0.360 -0.195 -0.425 0.053 -0.671 + -0.084 0.015 -0.347 -0.433 -0.166 -0.506 -0.032 0.035 0.140 0.043 + -0.131 -0.300 -0.372 -0.090 -0.464 -0.231 -0.194 0.250 -0.148 -0.327 + + 275 iasi_metop-a 477 0.138050E-01 + 0.034 0.157 -0.103 -0.115 0.246 -0.169 0.010 0.017 0.093 -0.126 + -0.209 0.038 -0.148 -0.117 -0.042 -0.168 0.259 -0.105 -0.016 0.001 + -0.061 0.011 -0.055 -0.160 -0.056 0.034 -0.167 -0.269 0.050 0.015 + -0.208 -0.161 -0.468 -0.414 0.160 -0.245 -0.231 -0.237 -0.163 -0.349 + -0.354 -0.551 -0.098 0.189 0.121 -0.372 -0.565 -0.083 -0.243 -0.139 + 0.107 -0.274 -0.187 -0.553 -0.519 0.184 -0.737 -0.191 -0.374 -0.117 + 0.235 0.081 -0.530 0.072 -0.317 -0.099 -0.131 -0.379 -0.100 -0.633 + 0.092 0.045 -0.298 -0.302 -0.112 -0.508 0.311 0.160 0.350 0.094 + -0.043 -0.172 -0.091 0.066 -0.317 -0.009 -0.118 0.366 0.083 -0.070 + + 276 iasi_metop-a 483 0.137343E-01 + 0.069 0.200 -0.008 -0.121 0.245 -0.075 0.010 0.004 0.036 -0.094 + -0.124 0.037 -0.092 0.013 0.010 -0.150 0.305 -0.102 -0.087 0.097 + 0.069 0.156 0.051 -0.109 0.045 0.114 -0.044 -0.188 0.218 0.174 + -0.120 -0.172 -0.529 -0.507 0.237 -0.271 -0.216 -0.282 -0.213 -0.371 + -0.413 -0.515 -0.106 0.255 0.041 -0.359 -0.549 -0.235 -0.256 -0.146 + 0.009 -0.371 -0.094 -0.562 -0.531 0.246 -0.864 -0.123 -0.477 -0.164 + 0.214 0.131 -0.501 0.025 -0.317 -0.188 -0.127 -0.387 0.052 -0.577 + 0.030 0.039 -0.278 -0.322 -0.062 -0.478 0.293 0.158 0.321 -0.017 + -0.073 -0.190 -0.213 -0.030 -0.439 -0.043 -0.043 0.244 0.042 -0.126 + + 277 iasi_metop-a 509 0.142385E-01 + -0.102 0.108 -0.117 -0.276 0.139 -0.171 -0.065 -0.147 -0.062 -0.149 + -0.232 -0.014 -0.135 -0.103 -0.014 -0.218 0.255 -0.157 -0.180 -0.021 + -0.001 0.084 -0.024 -0.160 -0.013 0.083 -0.141 -0.243 0.146 0.094 + -0.205 -0.291 -0.551 -0.567 0.020 -0.454 -0.282 -0.358 -0.329 -0.483 + -0.358 -0.646 -0.166 0.073 -0.015 -0.506 -0.669 -0.381 -0.402 -0.252 + 0.073 -0.419 -0.298 -0.627 -0.613 0.105 -0.946 -0.303 -0.490 -0.221 + 0.075 -0.024 -0.690 -0.083 -0.355 -0.297 -0.249 -0.541 0.083 -0.592 + -0.063 -0.074 -0.427 -0.475 -0.207 -0.652 0.138 0.095 0.201 -0.045 + -0.088 -0.347 -0.183 -0.127 -0.520 -0.164 -0.214 0.230 -0.148 -0.267 + + 278 iasi_metop-a 515 0.134929E-01 + -0.110 0.074 -0.228 -0.353 0.098 -0.258 -0.129 -0.205 -0.138 -0.278 + -0.307 -0.088 -0.233 -0.197 -0.137 -0.343 0.105 -0.248 -0.195 -0.112 + -0.097 -0.077 -0.102 -0.266 -0.129 -0.045 -0.276 -0.332 0.019 -0.029 + -0.288 -0.368 -0.676 -0.629 0.004 -0.557 -0.368 -0.394 -0.393 -0.575 + -0.465 -0.681 -0.247 -0.090 -0.043 -0.534 -0.732 -0.307 -0.481 -0.292 + -0.044 -0.478 -0.353 -0.777 -0.757 0.014 -1.023 -0.391 -0.553 -0.319 + -0.040 -0.101 -0.692 -0.140 -0.536 -0.339 -0.253 -0.513 -0.132 -0.676 + -0.169 -0.181 -0.471 -0.409 -0.252 -0.653 0.101 -0.079 0.123 -0.139 + -0.196 -0.383 -0.304 -0.266 -0.640 -0.263 -0.346 0.156 -0.168 -0.295 + + 279 iasi_metop-a 546 0.126859E-01 + -0.260 -0.070 -0.318 -0.349 0.000 -0.397 -0.210 -0.300 -0.153 -0.317 + -0.371 -0.138 -0.319 -0.282 -0.274 -0.414 0.021 -0.328 -0.317 -0.195 + -0.208 -0.097 -0.178 -0.336 -0.203 -0.143 -0.313 -0.427 -0.076 -0.180 + -0.350 -0.440 -0.648 -0.714 -0.087 -0.623 -0.328 -0.469 -0.419 -0.605 + -0.504 -0.511 -0.394 -0.130 -0.087 -0.566 -0.768 -0.418 -0.565 -0.397 + -0.100 -0.518 -0.378 -0.779 -0.680 -0.021 -1.073 -0.463 -0.501 -0.331 + -0.126 -0.141 -0.892 -0.131 -0.507 -0.328 -0.268 -0.484 -0.262 -0.705 + -0.240 -0.226 -0.519 -0.488 -0.291 -0.862 0.100 -0.026 0.088 -0.072 + -0.247 -0.467 -0.372 -0.249 -0.742 -0.295 -0.289 0.048 -0.254 -0.302 + + 280 iasi_metop-a 552 0.132767E-01 + -0.255 -0.135 -0.384 -0.455 -0.062 -0.374 -0.235 -0.357 -0.212 -0.380 + -0.447 -0.211 -0.365 -0.319 -0.250 -0.484 0.019 -0.364 -0.318 -0.240 + -0.246 -0.150 -0.204 -0.381 -0.248 -0.256 -0.414 -0.514 -0.139 -0.188 + -0.367 -0.438 -0.726 -0.726 -0.059 -0.644 -0.520 -0.451 -0.502 -0.660 + -0.578 -0.758 -0.318 -0.101 -0.148 -0.632 -0.805 -0.492 -0.560 -0.271 + -0.057 -0.582 -0.427 -0.771 -0.798 -0.050 -1.102 -0.422 -0.502 -0.343 + -0.273 -0.147 -0.812 -0.139 -0.572 -0.445 -0.259 -0.587 -0.200 -0.731 + -0.218 -0.251 -0.525 -0.631 -0.304 -0.800 0.075 -0.049 0.070 -0.092 + -0.333 -0.473 -0.277 -0.263 -0.683 -0.309 -0.253 0.029 -0.214 -0.411 + + 281 iasi_metop-a 559 0.422638E-01 + -0.136 -0.155 -0.172 -0.284 0.049 -0.102 -0.058 -0.270 -0.092 -0.245 + -0.315 -0.254 -0.277 -0.104 -0.358 -0.243 -0.076 -0.171 -0.197 -0.256 + -0.113 -0.250 -0.201 -0.192 -0.205 -0.332 -0.431 -0.452 -0.186 -0.232 + -0.539 -0.288 -0.348 -0.494 -0.424 -0.422 -0.251 -0.514 -0.453 -0.293 + -0.276 -0.652 -0.671 -0.146 -0.423 -0.390 -0.274 -0.725 -0.600 -0.351 + -0.550 -0.441 -0.438 -0.574 -0.517 -0.122 -0.951 -0.335 -0.490 -0.524 + -0.327 -0.399 -0.766 -0.268 -0.343 -0.424 -0.299 -0.679 -0.282 -0.953 + -0.211 -0.495 -0.446 -0.315 -0.542 -0.610 -0.352 -0.305 -0.195 -0.532 + -0.594 -0.231 -0.473 -0.562 -0.487 -0.188 -0.232 0.093 -0.385 -0.580 + + 282 iasi_metop-a 566 0.130046E-01 + -0.346 -0.134 -0.477 -0.486 0.011 -0.407 -0.306 -0.277 -0.112 -0.413 + -0.431 -0.328 -0.328 -0.392 -0.310 -0.229 -0.200 -0.424 -0.250 -0.185 + -0.340 -0.304 -0.221 -0.383 -0.280 -0.088 -0.432 -0.379 -0.128 -0.189 + -0.325 -0.463 -0.705 -0.642 -0.081 -0.664 -0.487 -0.453 -0.487 -0.610 + -0.559 -0.697 -0.324 -0.250 -0.178 -0.612 -0.818 -0.406 -0.521 -0.445 + -0.101 -0.584 -0.364 -0.834 -0.805 -0.080 -1.153 -0.469 -0.518 -0.419 + -0.234 -0.196 -0.833 -0.179 -0.534 -0.413 -0.432 -0.566 -0.283 -0.764 + -0.307 -0.249 -0.543 -0.552 -0.344 -0.735 0.008 -0.109 0.035 -0.193 + -0.273 -0.467 -0.397 -0.297 -0.760 -0.326 -0.355 0.031 -0.229 -0.469 + + 283 iasi_metop-a 571 0.126398E-01 + -0.283 -0.190 -0.433 -0.442 -0.099 -0.441 -0.282 -0.408 -0.273 -0.386 + -0.440 -0.224 -0.452 -0.350 -0.347 -0.510 -0.029 -0.425 -0.381 -0.268 + -0.262 -0.191 -0.296 -0.520 -0.370 -0.277 -0.484 -0.619 -0.237 -0.222 + -0.441 -0.478 -0.757 -0.638 -0.144 -0.617 -0.468 -0.503 -0.489 -0.642 + -0.606 -0.722 -0.321 -0.203 -0.141 -0.622 -0.748 -0.427 -0.587 -0.341 + -0.173 -0.571 -0.414 -0.745 -0.787 -0.004 -1.153 -0.462 -0.562 -0.385 + -0.213 -0.171 -0.902 -0.196 -0.551 -0.378 -0.379 -0.603 -0.347 -0.737 + -0.300 -0.271 -0.557 -0.517 -0.238 -0.730 -0.037 -0.073 0.047 -0.179 + -0.238 -0.574 -0.391 -0.274 -0.766 -0.313 -0.372 0.103 -0.157 -0.307 + + 284 iasi_metop-a 573 0.126512E-01 + -0.267 -0.154 -0.412 -0.406 -0.062 -0.454 -0.331 -0.411 -0.287 -0.340 + -0.501 -0.238 -0.445 -0.376 -0.304 -0.469 -0.055 -0.484 -0.415 -0.300 + -0.276 -0.197 -0.301 -0.428 -0.351 -0.309 -0.495 -0.564 -0.175 -0.268 + -0.424 -0.473 -0.766 -0.721 -0.106 -0.636 -0.361 -0.453 -0.492 -0.622 + -0.593 -0.572 -0.315 -0.178 -0.190 -0.617 -0.758 -0.412 -0.506 -0.358 + -0.260 -0.595 -0.326 -0.759 -0.716 0.010 -1.078 -0.473 -0.553 -0.418 + -0.117 -0.104 -0.896 -0.205 -0.528 -0.337 -0.370 -0.558 -0.333 -0.759 + -0.249 -0.275 -0.502 -0.454 -0.222 -0.795 -0.038 -0.038 0.070 -0.182 + -0.232 -0.519 -0.396 -0.278 -0.734 -0.315 -0.304 0.123 -0.198 -0.388 + + 285 iasi_metop-a 578 0.119045E-01 + -0.316 -0.203 -0.494 -0.511 -0.110 -0.493 -0.327 -0.402 -0.269 -0.451 + -0.555 -0.266 -0.446 -0.372 -0.353 -0.532 -0.040 -0.447 -0.422 -0.278 + -0.326 -0.152 -0.331 -0.502 -0.319 -0.307 -0.493 -0.585 -0.201 -0.255 + -0.450 -0.521 -0.789 -0.662 -0.194 -0.683 -0.378 -0.560 -0.465 -0.625 + -0.633 -0.659 -0.392 -0.208 -0.303 -0.670 -0.807 -0.369 -0.599 -0.303 + -0.318 -0.622 -0.380 -0.767 -0.766 -0.016 -1.031 -0.466 -0.565 -0.486 + -0.171 -0.162 -0.823 -0.242 -0.539 -0.436 -0.370 -0.606 -0.263 -0.729 + -0.192 -0.304 -0.561 -0.667 -0.352 -0.769 -0.131 -0.110 0.082 -0.114 + -0.247 -0.504 -0.475 -0.266 -0.698 -0.338 -0.367 0.020 -0.181 -0.361 + + 286 iasi_metop-a 584 0.123656E-01 + -0.363 -0.264 -0.544 -0.546 -0.164 -0.555 -0.403 -0.452 -0.300 -0.508 + -0.546 -0.298 -0.560 -0.407 -0.414 -0.601 -0.076 -0.510 -0.444 -0.339 + -0.389 -0.226 -0.414 -0.538 -0.412 -0.393 -0.587 -0.688 -0.297 -0.336 + -0.433 -0.554 -0.797 -0.768 -0.140 -0.742 -0.508 -0.638 -0.524 -0.720 + -0.644 -0.801 -0.384 -0.274 -0.221 -0.658 -0.892 -0.542 -0.617 -0.370 + -0.327 -0.666 -0.408 -0.772 -0.823 -0.060 -1.218 -0.519 -0.673 -0.458 + -0.145 -0.246 -0.927 -0.321 -0.580 -0.438 -0.420 -0.598 -0.379 -0.798 + -0.289 -0.335 -0.642 -0.674 -0.361 -0.808 -0.158 -0.149 0.012 -0.078 + -0.311 -0.560 -0.503 -0.305 -0.800 -0.392 -0.411 0.047 -0.370 -0.406 + + 287 iasi_metop-a 594 0.163864E-01 + -0.460 -0.344 -0.593 -0.740 -0.238 -0.545 -0.492 -0.585 -0.353 -0.530 + -0.639 -0.399 -0.611 -0.490 -0.493 -0.660 -0.179 -0.571 -0.559 -0.452 + -0.407 -0.367 -0.500 -0.625 -0.489 -0.480 -0.670 -0.759 -0.367 -0.464 + -0.591 -0.702 -1.045 -0.785 -0.335 -0.751 -0.693 -0.577 -0.725 -0.750 + -0.769 -0.948 -0.631 -0.331 -0.420 -0.811 -0.945 -0.662 -0.745 -0.466 + -0.218 -0.809 -0.799 -0.998 -1.015 -0.300 -1.247 -0.669 -0.787 -0.625 + -0.588 -0.389 -0.943 -0.329 -0.644 -0.604 -0.425 -0.940 -0.424 -1.062 + -0.337 -0.433 -0.733 -0.757 -0.536 -0.924 -0.134 -0.200 -0.180 -0.432 + -0.546 -0.728 -0.528 -0.437 -0.717 -0.422 -0.523 -0.044 -0.514 -0.657 + + 288 iasi_metop-a 625 0.123979E-01 + -0.574 -0.419 -0.695 -0.694 -0.246 -0.722 -0.623 -0.627 -0.557 -0.728 + -0.754 -0.513 -0.639 -0.650 -0.624 -0.742 -0.231 -0.589 -0.621 -0.463 + -0.532 -0.418 -0.564 -0.689 -0.557 -0.462 -0.740 -0.812 -0.417 -0.492 + -0.509 -0.644 -0.948 -0.932 -0.245 -0.773 -0.563 -0.584 -0.726 -0.795 + -0.775 -0.669 -0.615 -0.428 -0.300 -0.772 -0.895 -0.694 -0.775 -0.440 + -0.317 -0.789 -0.480 -0.882 -0.887 -0.164 -1.325 -0.603 -0.759 -0.646 + -0.295 -0.310 -0.968 -0.339 -0.692 -0.550 -0.505 -0.717 -0.461 -0.943 + -0.382 -0.433 -0.733 -0.733 -0.467 -1.038 -0.165 -0.260 -0.154 -0.188 + -0.395 -0.696 -0.549 -0.467 -0.827 -0.481 -0.512 -0.076 -0.439 -0.628 + + 289 iasi_metop-a 646 0.164751E-01 + -0.305 -0.274 -0.487 -0.596 -0.145 -0.460 -0.406 -0.515 -0.333 -0.507 + -0.619 -0.448 -0.609 -0.454 -0.484 -0.595 -0.194 -0.590 -0.515 -0.450 + -0.420 -0.435 -0.525 -0.600 -0.570 -0.574 -0.754 -0.842 -0.427 -0.491 + -0.399 -0.470 -0.858 -0.685 -0.199 -0.650 -0.498 -0.609 -0.509 -0.570 + -0.639 -0.838 -0.444 -0.209 -0.297 -0.639 -0.834 -0.505 -0.452 -0.437 + 0.025 -0.579 -0.533 -0.808 -0.767 -0.132 -1.039 -0.486 -0.576 -0.525 + -0.228 -0.292 -0.741 -0.230 -0.550 -0.479 -0.342 -0.655 -0.402 -0.863 + -0.332 -0.201 -0.573 -0.649 -0.397 -0.776 -0.054 -0.070 -0.018 -0.286 + -0.315 -0.428 -0.314 -0.338 -0.494 -0.269 -0.368 0.130 -0.268 -0.433 + + 290 iasi_metop-a 662 0.112191E-01 + -0.464 -0.270 -0.478 -0.525 -0.109 -0.517 -0.456 -0.473 -0.365 -0.508 + -0.563 -0.401 -0.437 -0.463 -0.463 -0.517 -0.037 -0.483 -0.474 -0.231 + -0.306 -0.239 -0.328 -0.462 -0.344 -0.239 -0.503 -0.579 -0.205 -0.280 + -0.503 -0.523 -0.853 -0.774 -0.178 -0.898 -0.521 -0.577 -0.579 -0.639 + -0.738 -0.696 -0.394 -0.254 -0.309 -0.795 -0.833 -0.569 -0.591 -0.541 + -0.459 -0.649 -0.364 -0.715 -0.665 -0.177 -1.160 -0.641 -0.641 -0.395 + -0.219 -0.207 -0.802 -0.246 -0.544 -0.494 -0.236 -0.560 -0.361 -0.766 + -0.306 -0.304 -0.695 -0.430 -0.277 -0.707 -0.106 -0.067 -0.043 -0.094 + -0.275 -0.532 -0.315 -0.517 -0.573 -0.358 -0.375 0.049 -0.358 -0.482 + + 291 iasi_metop-a 668 0.111081E-01 + -0.383 -0.363 -0.589 -0.566 -0.152 -0.592 -0.478 -0.510 -0.375 -0.558 + -0.712 -0.391 -0.542 -0.515 -0.458 -0.640 -0.116 -0.512 -0.411 -0.362 + -0.410 -0.299 -0.388 -0.585 -0.470 -0.402 -0.646 -0.695 -0.329 -0.370 + -0.522 -0.578 -0.831 -0.802 -0.163 -0.962 -0.536 -0.599 -0.599 -0.704 + -0.733 -0.782 -0.412 -0.363 -0.403 -0.867 -0.880 -0.602 -0.551 -0.559 + -0.482 -0.690 -0.456 -0.768 -0.721 -0.259 -0.952 -0.565 -0.674 -0.461 + -0.288 -0.298 -0.865 -0.249 -0.555 -0.447 -0.363 -0.556 -0.386 -0.857 + -0.316 -0.308 -0.662 -0.441 -0.304 -0.764 -0.077 -0.177 -0.143 -0.098 + -0.312 -0.579 -0.297 -0.505 -0.850 -0.399 -0.340 0.061 -0.352 -0.531 + + 292 iasi_metop-a 705 0.105228E-01 + -0.546 -0.435 -0.666 -0.675 -0.233 -0.664 -0.573 -0.522 -0.424 -0.616 + -0.766 -0.477 -0.567 -0.554 -0.549 -0.701 -0.111 -0.527 -0.520 -0.419 + -0.503 -0.343 -0.495 -0.588 -0.515 -0.420 -0.697 -0.746 -0.327 -0.502 + -0.622 -0.678 -0.796 -0.879 -0.183 -1.003 -0.612 -0.680 -0.706 -0.745 + -0.807 -0.835 -0.475 -0.427 -0.448 -0.928 -0.850 -0.724 -0.723 -0.576 + -0.537 -0.734 -0.498 -0.857 -0.813 -0.191 -1.158 -0.687 -0.703 -0.518 + -0.342 -0.329 -1.016 -0.328 -0.753 -0.535 -0.371 -0.611 -0.430 -0.938 + -0.338 -0.318 -0.743 -0.561 -0.339 -0.813 -0.113 -0.219 -0.101 -0.148 + -0.391 -0.665 -0.427 -0.491 -0.759 -0.532 -0.464 0.014 -0.429 -0.599 + + 293 iasi_metop-a 739 0.104782E-01 + -0.430 -0.397 -0.613 -0.555 -0.222 -0.624 -0.495 -0.531 -0.399 -0.606 + -0.721 -0.466 -0.552 -0.534 -0.544 -0.734 -0.173 -0.559 -0.546 -0.423 + -0.498 -0.435 -0.531 -0.670 -0.552 -0.532 -0.815 -0.908 -0.464 -0.563 + -0.568 -0.474 -0.820 -0.719 -0.156 -0.797 -0.476 -0.517 -0.541 -0.619 + -0.681 -0.681 -0.356 -0.280 -0.260 -0.746 -0.928 -0.463 -0.637 -0.482 + -0.340 -0.609 -0.299 -0.790 -0.691 -0.068 -0.985 -0.622 -0.682 -0.517 + -0.253 -0.219 -0.735 -0.191 -0.595 -0.332 -0.320 -0.531 -0.357 -0.932 + -0.299 -0.222 -0.607 -0.489 -0.238 -0.690 -0.023 -0.037 -0.003 -0.011 + -0.226 -0.524 -0.283 -0.395 -0.589 -0.328 -0.343 0.060 -0.328 -0.391 + + 294 iasi_metop-a 756 0.100219E-01 + -0.370 -0.322 -0.522 -0.526 -0.164 -0.512 -0.468 -0.440 -0.363 -0.525 + -0.607 -0.359 -0.540 -0.441 -0.415 -0.613 -0.094 -0.479 -0.448 -0.349 + -0.389 -0.307 -0.406 -0.555 -0.452 -0.388 -0.700 -0.759 -0.323 -0.465 + -0.552 -0.532 -0.742 -0.795 -0.062 -0.867 -0.441 -0.514 -0.551 -0.679 + -0.713 -0.743 -0.420 -0.256 -0.268 -0.814 -0.768 -0.558 -0.641 -0.504 + -0.349 -0.594 -0.502 -0.774 -0.749 -0.096 -1.108 -0.538 -0.649 -0.446 + -0.206 -0.129 -0.825 -0.226 -0.606 -0.374 -0.322 -0.459 -0.312 -0.815 + -0.321 -0.198 -0.612 -0.503 -0.346 -0.731 -0.039 -0.088 -0.002 -0.090 + -0.258 -0.549 -0.360 -0.433 -0.576 -0.344 -0.375 0.073 -0.409 -0.453 + + 295 iasi_metop-a 797 0.965128E-02 + -1.040 -0.758 -1.151 -1.145 -0.551 -0.973 -0.931 -0.808 -0.699 -0.910 + -0.908 -0.766 -0.867 -0.787 -0.776 -0.818 -0.344 -0.718 -0.628 -0.529 + -0.593 -0.556 -0.621 -0.788 -0.678 -0.503 -0.795 -0.856 -0.472 -0.525 + -1.312 -1.077 -1.440 -1.312 -0.707 -1.465 -0.878 -1.028 -1.141 -1.185 + -1.229 -1.266 -1.004 -0.831 -0.847 -1.326 -1.293 -1.116 -1.124 -0.973 + -0.878 -1.044 -0.979 -1.279 -1.234 -0.613 -1.605 -1.023 -1.174 -1.005 + -0.713 -0.706 -1.305 -0.712 -1.097 -0.822 -0.836 -0.933 -0.891 -1.456 + -0.814 -0.686 -1.109 -1.149 -0.815 -1.266 -0.564 -0.547 -0.603 -0.582 + -0.746 -1.085 -1.031 -0.808 -1.129 -1.052 -0.913 -0.522 -0.856 -1.105 + + 296 iasi_metop-a 867 0.917305E-02 + -0.744 -0.714 -0.920 -0.860 -0.570 -0.979 -0.862 -0.900 -0.674 -0.971 + -1.110 -0.800 -0.939 -0.901 -0.923 -1.139 -0.565 -0.983 -1.002 -0.863 + -0.994 -0.840 -1.042 -1.153 -1.120 -1.142 -1.444 -1.518 -1.046 -1.167 + -0.763 -0.512 -1.012 -0.881 -0.206 -0.935 -0.647 -0.629 -0.716 -0.780 + -0.690 -0.706 -0.656 -0.410 -0.326 -0.915 -0.932 -0.630 -0.739 -0.543 + -0.453 -0.678 -0.586 -0.872 -0.875 -0.184 -1.163 -0.689 -0.731 -0.669 + -0.290 -0.215 -0.896 -0.335 -0.596 -0.323 -0.490 -0.631 -0.515 -1.050 + -0.491 -0.247 -0.692 -0.656 -0.409 -0.904 -0.148 -0.114 -0.241 -0.149 + -0.328 -0.684 -0.540 -0.364 -0.699 -0.604 -0.546 -0.077 -0.407 -0.598 + + 297 iasi_metop-a 906 0.236667E-01 + -0.281 -0.390 -0.542 -0.641 -0.316 -0.458 -0.490 -0.570 -0.290 -0.518 + -0.705 -0.474 -0.560 -0.465 -0.524 -0.683 -0.240 -0.489 -0.595 -0.548 + -0.514 -0.483 -0.519 -0.636 -0.560 -0.579 -0.800 -0.898 -0.463 -0.547 + -0.389 -0.427 -0.738 -0.658 -0.565 -0.573 -0.513 -0.841 -0.584 -0.558 + -0.572 -0.959 -0.673 -0.243 -0.462 -0.794 -0.858 -0.886 -0.755 -0.374 + -0.416 -0.729 -0.693 -0.748 -0.884 -0.370 -1.178 -0.554 -0.810 -0.646 + -0.462 -0.532 -0.806 -0.237 -0.465 -0.556 -0.440 -0.628 -0.419 -1.090 + -0.191 -0.442 -0.538 -0.612 -0.589 -0.764 -0.380 -0.305 -0.220 -0.669 + -0.650 -0.376 -0.559 -0.310 -0.530 -0.208 -0.407 -0.020 -0.337 -0.750 + + 298 iasi_metop-a 921 0.878538E-02 + -0.837 -0.571 -0.758 -0.813 -0.358 -0.741 -0.651 -0.670 -0.484 -0.602 + -0.705 -0.526 -0.659 -0.694 -0.772 -0.537 -0.305 -0.629 -0.678 -0.417 + -0.585 -0.434 -0.620 -0.680 -0.632 -0.557 -0.780 -0.889 -0.493 -0.648 + -0.877 -0.628 -0.975 -0.981 -0.295 -1.057 -0.704 -0.589 -0.886 -0.813 + -0.806 -0.822 -0.762 -0.544 -0.446 -0.979 -1.053 -0.746 -0.913 -0.608 + -0.547 -0.732 -0.540 -0.934 -0.915 -0.283 -1.220 -0.735 -0.745 -0.614 + -0.468 -0.322 -1.072 -0.450 -0.671 -0.579 -0.596 -0.703 -0.396 -1.070 + -0.499 -0.283 -0.717 -0.804 -0.407 -0.959 -0.320 -0.212 -0.280 -0.150 + -0.473 -0.780 -0.733 -0.448 -0.758 -0.682 -0.643 -0.205 -0.527 -0.732 + + 299 iasi_metop-a 1027 0.803704E-02 + -0.636 -0.640 -0.852 -0.814 -0.400 -0.861 -0.721 -0.784 -0.577 -0.855 + -0.902 -0.606 -0.786 -0.665 -0.738 -0.796 -0.346 -0.743 -0.669 -0.643 + -0.742 -0.563 -0.814 -0.876 -0.821 -0.741 -0.992 -1.108 -0.727 -0.782 + -0.820 -0.446 -0.971 -0.912 -0.309 -0.826 -0.601 -0.638 -0.821 -0.734 + -0.721 -0.906 -0.723 -0.497 -0.445 -1.021 -0.986 -0.748 -0.858 -0.598 + -0.503 -0.693 -0.532 -0.938 -0.921 -0.315 -1.276 -0.688 -0.665 -0.674 + -0.471 -0.330 -1.026 -0.350 -0.665 -0.440 -0.512 -0.696 -0.369 -1.217 + -0.534 -0.391 -0.658 -0.693 -0.380 -0.951 -0.325 -0.169 -0.263 -0.155 + -0.391 -0.703 -0.680 -0.429 -0.683 -0.634 -0.536 -0.061 -0.466 -0.725 + + 300 iasi_metop-a 1046 0.134306E-01 + -0.625 -0.544 -0.890 -0.855 -0.427 -0.806 -0.698 -0.801 -0.581 -0.819 + -0.811 -0.514 -0.791 -0.664 -0.751 -0.808 -0.376 -0.718 -0.664 -0.651 + -0.656 -0.552 -0.799 -0.845 -0.774 -0.730 -1.011 -1.097 -0.722 -0.755 + -0.764 -0.729 -0.944 -0.770 -0.454 -0.849 -0.843 -0.700 -0.646 -0.730 + -0.783 -1.068 -0.750 -0.475 -0.488 -0.935 -0.925 -0.663 -0.802 -0.614 + -0.361 -0.797 -0.808 -0.937 -0.963 -0.400 -1.192 -0.744 -0.684 -0.671 + -0.675 -0.555 -1.061 -0.407 -0.549 -0.656 -0.587 -0.903 -0.631 -1.199 + -0.430 -0.634 -0.748 -0.705 -0.580 -0.990 -0.277 -0.235 -0.344 -0.399 + -0.554 -0.671 -0.640 -0.593 -0.747 -0.570 -0.509 -0.099 -0.576 -0.685 + + 301 iasi_metop-a 1090 0.778580E-02 + -1.079 -0.958 -1.231 -1.201 -0.669 -1.119 -1.004 -0.899 -0.793 -1.051 + -0.999 -0.828 -0.932 -0.880 -0.963 -0.908 -0.593 -0.908 -0.941 -0.739 + -0.769 -0.635 -0.943 -0.970 -0.873 -0.797 -1.048 -1.086 -0.815 -0.863 + -1.234 -0.840 -1.465 -1.290 -0.820 -1.165 -1.119 -1.023 -1.124 -1.113 + -1.065 -1.282 -1.151 -0.944 -0.773 -1.379 -1.437 -0.943 -1.283 -0.932 + -0.791 -1.071 -1.190 -1.282 -1.277 -0.685 -1.661 -1.043 -1.062 -1.047 + -0.791 -0.836 -1.339 -0.790 -0.996 -0.765 -0.885 -1.014 -0.821 -1.489 + -0.788 -0.735 -1.098 -1.087 -0.761 -1.293 -0.621 -0.687 -0.607 -0.509 + -0.775 -1.060 -0.999 -0.811 -1.092 -0.878 -0.953 -0.636 -0.915 -1.161 + + 302 iasi_metop-a 1098 0.771035E-02 + -1.215 -1.168 -1.487 -1.355 -0.942 -1.359 -1.252 -1.236 -1.038 -1.328 + -1.398 -1.070 -1.269 -1.197 -1.205 -1.319 -0.889 -1.277 -1.204 -1.135 + -1.246 -1.070 -1.345 -1.465 -1.365 -1.211 -1.613 -1.661 -1.308 -1.376 + -1.303 -0.934 -1.416 -1.327 -0.881 -1.256 -1.248 -1.041 -1.166 -1.182 + -1.135 -1.296 -1.191 -0.999 -0.845 -1.394 -1.449 -1.035 -1.375 -1.008 + -0.926 -1.172 -1.056 -1.366 -1.356 -0.710 -1.660 -1.104 -1.158 -1.065 + -0.821 -0.762 -1.344 -0.850 -1.108 -0.800 -1.010 -1.024 -0.858 -1.534 + -0.850 -0.734 -1.194 -1.212 -0.792 -1.413 -0.658 -0.738 -0.660 -0.580 + -0.820 -1.076 -1.041 -0.838 -1.160 -1.047 -0.951 -0.667 -0.908 -1.219 + + 303 iasi_metop-a 1121 0.186455E-01 + -0.790 -0.695 -1.044 -0.940 -0.733 -0.890 -0.935 -1.011 -0.776 -0.901 + -1.022 -0.834 -1.057 -0.906 -0.914 -1.121 -0.684 -0.971 -0.989 -1.035 + -0.989 -0.884 -1.127 -1.252 -1.287 -1.155 -1.537 -1.626 -1.181 -1.219 + -0.607 -0.663 -0.821 -0.736 -0.459 -0.797 -0.663 -0.665 -0.700 -0.535 + -0.645 -0.916 -0.716 -0.285 -0.433 -0.880 -0.714 -0.689 -0.669 -0.534 + -0.320 -0.681 -0.830 -0.765 -0.948 -0.302 -1.067 -0.683 -0.631 -0.537 + -0.625 -0.521 -0.907 -0.342 -0.557 -0.524 -0.435 -0.723 -0.432 -1.013 + -0.389 -0.372 -0.664 -0.840 -0.601 -0.942 -0.183 -0.138 -0.248 -0.485 + -0.534 -0.745 -0.727 -0.421 -0.642 -0.380 -0.463 -0.032 -0.442 -0.731 + + 304 iasi_metop-a 1133 0.734983E-02 + -1.231 -1.015 -1.247 -1.406 -0.736 -1.146 -1.085 -0.954 -0.836 -0.972 + -1.034 -0.830 -0.910 -0.986 -1.036 -0.875 -0.565 -0.931 -0.913 -0.671 + -0.871 -0.638 -0.920 -0.942 -0.860 -0.788 -1.046 -1.057 -0.774 -0.880 + -1.342 -0.975 -1.449 -1.349 -0.982 -1.281 -1.245 -1.081 -1.238 -1.176 + -1.156 -1.281 -1.185 -1.025 -0.864 -1.406 -1.445 -1.023 -1.371 -0.979 + -0.884 -1.141 -1.195 -1.358 -1.376 -0.853 -1.749 -1.126 -1.126 -1.113 + -0.943 -0.888 -1.405 -0.975 -1.025 -0.808 -1.059 -1.083 -0.948 -1.532 + -0.843 -0.712 -1.200 -1.280 -0.840 -1.507 -0.786 -0.570 -0.663 -0.574 + -0.849 -1.197 -1.087 -0.838 -1.177 -0.995 -0.996 -0.768 -1.040 -1.299 + + 305 iasi_metop-a 1173 0.738863E-02 + -0.794 -0.774 -0.944 -0.867 -0.723 -0.960 -0.871 -1.069 -0.814 -1.081 + -1.232 -0.888 -1.004 -0.978 -0.986 -1.163 -0.748 -1.133 -1.160 -1.043 + -1.072 -1.023 -1.247 -1.402 -1.349 -1.248 -1.693 -1.717 -1.394 -1.448 + -0.709 -0.293 -0.767 -0.719 -0.333 -0.654 -0.586 -0.455 -0.615 -0.568 + -0.598 -0.678 -0.595 -0.429 -0.304 -0.913 -0.853 -0.437 -0.771 -0.404 + -0.221 -0.537 -0.598 -0.813 -0.861 -0.182 -1.006 -0.532 -0.434 -0.551 + -0.340 -0.235 -0.798 -0.398 -0.502 -0.216 -0.490 -0.500 -0.330 -1.031 + -0.325 -0.105 -0.597 -0.686 -0.255 -0.823 -0.167 -0.016 -0.153 -0.070 + -0.288 -0.549 -0.551 -0.239 -0.617 -0.602 -0.318 -0.019 -0.309 -0.570 + + 306 iasi_metop-a 1191 0.104594E-01 + -0.450 -0.380 -0.667 -0.499 -0.248 -0.719 -0.544 -0.595 -0.423 -0.652 + -0.673 -0.325 -0.604 -0.572 -0.512 -0.581 -0.214 -0.547 -0.543 -0.418 + -0.586 -0.420 -0.587 -0.661 -0.594 -0.543 -0.774 -0.864 -0.587 -0.590 + -0.704 -0.342 -0.789 -0.688 -0.368 -0.754 -0.563 -0.476 -0.493 -0.500 + -0.572 -0.628 -0.522 -0.429 -0.239 -0.802 -0.846 -0.367 -0.472 -0.341 + -0.165 -0.605 -0.550 -0.762 -0.858 -0.205 -1.099 -0.605 -0.526 -0.391 + -0.383 -0.252 -0.776 -0.276 -0.456 -0.238 -0.438 -0.593 -0.313 -0.965 + -0.264 -0.200 -0.565 -0.571 -0.294 -0.894 -0.198 -0.010 -0.146 0.005 + -0.243 -0.499 -0.524 -0.293 -0.470 -0.463 -0.361 -0.128 -0.341 -0.560 + + 307 iasi_metop-a 1194 0.708388E-02 + -0.404 -0.427 -0.626 -0.584 -0.350 -0.658 -0.503 -0.459 -0.407 -0.651 + -0.701 -0.345 -0.538 -0.532 -0.479 -0.529 -0.211 -0.549 -0.514 -0.463 + -0.506 -0.359 -0.576 -0.673 -0.574 -0.540 -0.692 -0.735 -0.568 -0.509 + -0.699 -0.309 -0.744 -0.696 -0.356 -0.563 -0.553 -0.524 -0.573 -0.562 + -0.555 -0.677 -0.576 -0.418 -0.274 -0.836 -0.883 -0.510 -0.763 -0.402 + -0.356 -0.540 -0.366 -0.693 -0.815 -0.116 -1.143 -0.467 -0.441 -0.385 + -0.360 -0.243 -0.796 -0.332 -0.453 -0.248 -0.418 -0.521 -0.319 -0.951 + -0.335 -0.143 -0.577 -0.609 -0.254 -0.863 -0.194 0.079 -0.124 0.013 + -0.279 -0.533 -0.526 -0.185 -0.513 -0.553 -0.295 -0.194 -0.420 -0.655 + + 308 iasi_metop-a 1222 0.697131E-02 + -0.418 -0.506 -0.706 -0.639 -0.232 -0.737 -0.585 -0.596 -0.444 -0.732 + -0.751 -0.353 -0.675 -0.592 -0.556 -0.593 -0.270 -0.629 -0.535 -0.434 + -0.615 -0.406 -0.637 -0.700 -0.653 -0.512 -0.789 -0.865 -0.603 -0.611 + -0.736 -0.293 -0.856 -0.749 -0.237 -0.725 -0.537 -0.545 -0.594 -0.685 + -0.594 -0.639 -0.618 -0.389 -0.267 -0.944 -0.942 -0.677 -0.780 -0.441 + -0.295 -0.516 -0.670 -0.736 -0.888 -0.271 -1.115 -0.519 -0.537 -0.509 + -0.370 -0.417 -0.807 -0.324 -0.462 -0.264 -0.482 -0.570 -0.388 -1.030 + -0.431 -0.190 -0.650 -0.639 -0.322 -1.000 -0.222 -0.170 -0.186 -0.051 + -0.274 -0.582 -0.590 -0.280 -0.560 -0.608 -0.398 -0.232 -0.382 -0.759 + + 309 iasi_metop-a 1271 0.644612E-02 + -0.414 -0.434 -0.612 -0.582 -0.229 -0.664 -0.596 -0.593 -0.448 -0.698 + -0.759 -0.377 -0.583 -0.578 -0.497 -0.551 -0.255 -0.639 -0.585 -0.520 + -0.638 -0.468 -0.620 -0.695 -0.699 -0.575 -0.825 -0.926 -0.650 -0.649 + -0.712 -0.274 -0.805 -0.706 -0.175 -0.401 -0.571 -0.515 -0.609 -0.653 + -0.441 -0.524 -0.498 -0.294 -0.156 -0.822 -0.720 -0.583 -0.754 -0.339 + -0.110 -0.482 -0.404 -0.786 -0.795 -0.138 -1.060 -0.430 -0.529 -0.249 + -0.468 -0.304 -0.725 -0.280 -0.405 -0.279 -0.490 -0.479 -0.345 -0.859 + -0.330 -0.058 -0.502 -0.648 -0.265 -1.006 -0.144 0.017 -0.138 -0.169 + -0.266 -0.481 -0.491 -0.235 -0.453 -0.459 -0.307 -0.111 -0.383 -0.639 + + 310 iasi_metop-a 1283 0.694023E-02 + -0.418 -0.420 -0.720 -0.590 -0.177 -0.611 -0.561 -0.551 -0.380 -0.690 + -0.678 -0.345 -0.614 -0.502 -0.480 -0.509 -0.222 -0.569 -0.476 -0.478 + -0.559 -0.345 -0.598 -0.653 -0.656 -0.532 -0.728 -0.831 -0.611 -0.566 + -0.723 -0.353 -0.741 -0.685 -0.295 -0.546 -0.567 -0.501 -0.683 -0.670 + -0.525 -0.517 -0.552 -0.420 -0.208 -0.893 -0.907 -0.723 -0.744 -0.366 + -0.226 -0.560 -0.535 -0.751 -0.806 -0.209 -1.102 -0.502 -0.499 -0.392 + -0.350 -0.404 -0.750 -0.209 -0.499 -0.341 -0.533 -0.497 -0.382 -0.982 + -0.386 -0.137 -0.524 -0.654 -0.346 -0.952 -0.314 0.089 -0.171 -0.107 + -0.271 -0.565 -0.585 -0.277 -0.533 -0.505 -0.397 -0.207 -0.358 -0.643 + + 311 iasi_metop-a 1338 0.628476E-02 + -0.528 -0.438 -0.725 -0.605 -0.360 -0.659 -0.664 -0.573 -0.437 -0.726 + -0.705 -0.282 -0.626 -0.585 -0.516 -0.592 -0.297 -0.617 -0.525 -0.505 + -0.632 -0.406 -0.613 -0.639 -0.663 -0.534 -0.761 -0.913 -0.649 -0.637 + -0.723 -0.335 -0.743 -0.661 -0.334 -0.485 -0.507 -0.451 -0.702 -0.800 + -0.496 -0.483 -0.582 -0.498 -0.224 -0.965 -0.833 -0.705 -0.734 -0.420 + -0.237 -0.614 -0.589 -0.815 -0.858 -0.303 -1.174 -0.566 -0.566 -0.343 + -0.408 -0.446 -0.916 -0.310 -0.535 -0.287 -0.552 -0.571 -0.456 -0.953 + -0.258 -0.194 -0.551 -0.718 -0.485 -1.130 -0.346 0.027 -0.244 -0.263 + -0.292 -0.705 -0.688 -0.352 -0.564 -0.572 -0.434 -0.348 -0.368 -0.615 + + 312 iasi_metop-a 1409 0.485725E-03 + -0.557 -0.420 -0.762 -0.644 -0.433 -0.645 -0.661 -0.550 -0.453 -0.655 + -0.671 -0.343 -0.622 -0.515 -0.483 -0.592 -0.316 -0.541 -0.581 -0.509 + -0.629 -0.425 -0.583 -0.725 -0.676 -0.631 -0.824 -0.935 -0.675 -0.660 + -0.721 -0.386 -0.761 -0.647 -0.241 -0.580 -0.566 -0.573 -0.594 -0.718 + -0.518 -0.562 -0.612 -0.445 -0.180 -0.747 -0.720 -0.717 -0.709 -0.419 + -0.115 -0.593 -0.406 -0.912 -0.759 -0.491 -1.159 -0.496 -0.650 -0.383 + -0.428 -0.469 -0.907 -0.190 -0.514 -0.397 -0.419 -0.556 -0.363 -0.930 + -0.149 -0.430 -0.676 -0.845 -0.544 -1.142 -0.497 -0.079 -0.264 -0.409 + -0.406 -0.653 -0.717 -0.443 -0.661 -0.530 -0.627 -0.407 -0.379 -0.607 + + 313 iasi_metop-a 1414 0.225925E-03 + -0.567 -0.504 -0.822 -0.589 -0.330 -0.651 -0.752 -0.616 -0.543 -0.686 + -0.640 -0.464 -0.636 -0.571 -0.436 -0.612 -0.343 -0.649 -0.632 -0.517 + -0.625 -0.484 -0.616 -0.707 -0.694 -0.691 -0.857 -0.909 -0.782 -0.807 + -0.686 -0.331 -0.772 -0.611 -0.295 -0.737 -0.642 -0.622 -0.597 -0.538 + -0.614 -0.520 -0.596 -0.453 -0.123 -0.787 -0.740 -0.673 -0.722 -0.476 + -0.121 -0.655 -0.487 -0.933 -0.743 -0.310 -1.191 -0.519 -0.599 -0.382 + -0.346 -0.512 -0.928 -0.163 -0.480 -0.323 -0.431 -0.494 -0.431 -0.926 + -0.165 -0.349 -0.672 -0.821 -0.596 -1.103 -0.452 -0.073 -0.259 -0.473 + -0.417 -0.637 -0.726 -0.410 -0.683 -0.544 -0.560 -0.297 -0.388 -0.663 + + 314 iasi_metop-a 1420 -0.318939E-03 + -0.551 -0.473 -0.835 -0.563 -0.388 -0.718 -0.824 -0.619 -0.540 -0.693 + -0.670 -0.468 -0.607 -0.584 -0.464 -0.718 -0.385 -0.669 -0.633 -0.495 + -0.631 -0.454 -0.663 -0.705 -0.701 -0.611 -0.824 -0.940 -0.724 -0.761 + -0.699 -0.458 -0.738 -0.667 -0.295 -0.787 -0.602 -0.689 -0.609 -0.588 + -0.522 -0.600 -0.559 -0.597 -0.267 -0.825 -0.783 -0.819 -0.583 -0.438 + -0.166 -0.684 -0.616 -0.943 -0.740 -0.457 -1.196 -0.506 -0.621 -0.322 + -0.461 -0.549 -0.932 -0.245 -0.440 -0.404 -0.445 -0.560 -0.672 -0.975 + -0.162 -0.478 -0.715 -0.906 -0.612 -1.161 -0.467 -0.163 -0.209 -0.502 + -0.564 -0.713 -0.681 -0.406 -0.765 -0.622 -0.661 -0.400 -0.561 -0.715 + + 315 iasi_metop-a 1424 -0.479174E-04 + -0.584 -0.471 -0.887 -0.644 -0.373 -0.711 -0.842 -0.607 -0.556 -0.698 + -0.694 -0.489 -0.657 -0.609 -0.514 -0.778 -0.387 -0.735 -0.677 -0.546 + -0.658 -0.529 -0.664 -0.748 -0.739 -0.680 -0.885 -0.965 -0.779 -0.779 + -0.744 -0.413 -0.744 -0.729 -0.294 -0.791 -0.588 -0.669 -0.650 -0.623 + -0.617 -0.605 -0.644 -0.586 -0.238 -0.812 -0.767 -0.746 -0.670 -0.476 + -0.187 -0.750 -0.510 -0.971 -0.747 -0.566 -1.222 -0.525 -0.728 -0.369 + -0.395 -0.550 -0.936 -0.194 -0.494 -0.358 -0.477 -0.664 -0.634 -0.994 + -0.214 -0.486 -0.654 -0.863 -0.646 -1.135 -0.440 -0.157 -0.225 -0.398 + -0.502 -0.724 -0.770 -0.509 -0.699 -0.654 -0.651 -0.433 -0.458 -0.698 + + 316 iasi_metop-a 1427 0.177870E-02 + -0.618 -0.541 -0.818 -0.719 -0.414 -0.637 -0.833 -0.647 -0.528 -0.726 + -0.715 -0.484 -0.654 -0.591 -0.545 -0.786 -0.414 -0.719 -0.647 -0.570 + -0.617 -0.500 -0.642 -0.755 -0.735 -0.712 -0.944 -0.986 -0.807 -0.812 + -0.687 -0.422 -0.822 -0.654 -0.267 -0.679 -0.745 -0.525 -0.720 -0.709 + -0.659 -0.548 -0.628 -0.636 -0.182 -0.778 -0.774 -0.677 -0.734 -0.415 + -0.214 -0.638 -0.589 -0.983 -0.780 -0.406 -1.244 -0.543 -0.599 -0.409 + -0.457 -0.494 -0.945 -0.255 -0.511 -0.358 -0.438 -0.641 -0.547 -0.960 + -0.199 -0.358 -0.722 -0.840 -0.545 -1.158 -0.487 -0.087 -0.338 -0.384 + -0.508 -0.791 -0.772 -0.459 -0.675 -0.613 -0.590 -0.353 -0.374 -0.605 + + 317 iasi_metop-a 1430 -0.189982E-02 + -0.604 -0.498 -0.879 -0.656 -0.356 -0.689 -0.753 -0.602 -0.491 -0.707 + -0.686 -0.442 -0.676 -0.590 -0.486 -0.767 -0.346 -0.776 -0.647 -0.559 + -0.667 -0.538 -0.677 -0.797 -0.730 -0.709 -0.894 -0.966 -0.773 -0.832 + -0.791 -0.402 -0.746 -0.766 -0.200 -0.842 -0.549 -0.719 -0.674 -0.659 + -0.615 -0.547 -0.538 -0.570 -0.220 -0.848 -0.679 -0.776 -0.624 -0.468 + -0.136 -0.654 -0.522 -0.932 -0.774 -0.523 -1.186 -0.499 -0.720 -0.350 + -0.520 -0.516 -0.933 -0.252 -0.502 -0.430 -0.480 -0.697 -0.584 -1.066 + -0.159 -0.444 -0.577 -0.929 -0.683 -1.090 -0.475 -0.216 -0.249 -0.551 + -0.495 -0.699 -0.723 -0.537 -0.723 -0.614 -0.682 -0.499 -0.412 -0.685 + + 318 iasi_metop-a 1434 -0.766520E-03 + -0.541 -0.450 -0.825 -0.543 -0.337 -0.642 -0.808 -0.653 -0.515 -0.618 + -0.705 -0.544 -0.630 -0.593 -0.530 -0.718 -0.367 -0.730 -0.655 -0.558 + -0.649 -0.519 -0.636 -0.797 -0.756 -0.742 -0.950 -1.001 -0.798 -0.833 + -0.662 -0.398 -0.713 -0.590 -0.250 -0.703 -0.500 -0.624 -0.650 -0.653 + -0.656 -0.604 -0.513 -0.646 -0.201 -0.753 -0.725 -0.738 -0.607 -0.418 + -0.171 -0.660 -0.609 -0.905 -0.676 -0.512 -1.198 -0.533 -0.697 -0.349 + -0.448 -0.507 -0.901 -0.216 -0.439 -0.353 -0.460 -0.539 -0.552 -1.023 + -0.160 -0.482 -0.580 -0.775 -0.613 -1.072 -0.538 -0.071 -0.296 -0.475 + -0.625 -0.688 -0.766 -0.517 -0.708 -0.664 -0.617 -0.443 -0.393 -0.674 + + 319 iasi_metop-a 1440 -0.224404E-02 + -0.544 -0.445 -0.938 -0.612 -0.340 -0.633 -0.833 -0.642 -0.526 -0.628 + -0.669 -0.591 -0.617 -0.576 -0.575 -0.729 -0.423 -0.720 -0.684 -0.519 + -0.634 -0.491 -0.606 -0.741 -0.691 -0.706 -0.880 -0.936 -0.712 -0.797 + -0.796 -0.430 -0.736 -0.716 -0.318 -0.819 -0.546 -0.740 -0.642 -0.694 + -0.648 -0.766 -0.787 -0.639 -0.336 -0.874 -0.842 -0.788 -0.603 -0.542 + -0.200 -0.736 -0.552 -0.920 -0.757 -0.523 -1.146 -0.617 -0.706 -0.387 + -0.576 -0.579 -0.949 -0.332 -0.498 -0.476 -0.506 -0.756 -0.683 -0.988 + -0.342 -0.563 -0.642 -0.813 -0.732 -1.147 -0.530 -0.176 -0.282 -0.607 + -0.699 -0.720 -0.788 -0.640 -0.767 -0.774 -0.704 -0.447 -0.487 -0.678 + + 320 iasi_metop-a 1442 -0.110968E-02 + -0.603 -0.533 -0.877 -0.604 -0.443 -0.662 -0.893 -0.749 -0.568 -0.681 + -0.718 -0.555 -0.692 -0.664 -0.567 -0.793 -0.438 -0.746 -0.678 -0.566 + -0.661 -0.549 -0.656 -0.792 -0.729 -0.722 -0.964 -1.008 -0.771 -0.857 + -0.670 -0.356 -0.695 -0.704 -0.294 -0.691 -0.551 -0.598 -0.643 -0.722 + -0.555 -0.520 -0.648 -0.510 -0.206 -0.824 -0.709 -0.750 -0.593 -0.410 + -0.200 -0.664 -0.593 -0.930 -0.751 -0.414 -1.174 -0.467 -0.640 -0.328 + -0.447 -0.497 -0.896 -0.259 -0.492 -0.353 -0.429 -0.556 -0.592 -0.928 + -0.172 -0.407 -0.655 -0.773 -0.606 -1.128 -0.548 -0.085 -0.198 -0.544 + -0.625 -0.745 -0.760 -0.487 -0.738 -0.647 -0.676 -0.358 -0.503 -0.652 + + 321 iasi_metop-a 1445 -0.276703E-02 + -0.667 -0.543 -1.009 -0.683 -0.426 -0.700 -0.889 -0.723 -0.579 -0.693 + -0.729 -0.627 -0.674 -0.670 -0.591 -0.778 -0.401 -0.780 -0.685 -0.560 + -0.649 -0.553 -0.675 -0.791 -0.775 -0.755 -0.949 -0.977 -0.810 -0.900 + -0.785 -0.694 -0.762 -0.707 -0.368 -0.824 -0.664 -0.772 -0.768 -0.770 + -0.714 -0.833 -0.823 -0.799 -0.329 -0.871 -0.871 -0.845 -0.674 -0.582 + -0.298 -0.852 -0.644 -1.047 -0.832 -0.647 -1.271 -0.685 -0.835 -0.515 + -0.540 -0.641 -1.042 -0.436 -0.576 -0.514 -0.571 -0.701 -0.722 -1.036 + -0.368 -0.621 -0.699 -0.949 -0.655 -1.239 -0.673 -0.275 -0.396 -0.694 + -0.738 -0.843 -0.770 -0.689 -0.802 -0.798 -0.797 -0.501 -0.712 -0.783 + + 322 iasi_metop-a 1450 -0.454683E-02 + -0.389 -0.367 -0.753 -0.550 -0.308 -0.541 -0.696 -0.607 -0.429 -0.540 + -0.621 -0.568 -0.645 -0.514 -0.586 -0.808 -0.390 -0.733 -0.724 -0.623 + -0.631 -0.588 -0.645 -0.823 -0.818 -0.767 -0.978 -1.053 -0.824 -0.930 + -0.740 -0.587 -0.725 -0.567 -0.187 -0.694 -0.441 -0.673 -0.538 -0.640 + -0.582 -0.593 -0.495 -0.511 -0.298 -0.808 -0.699 -0.724 -0.504 -0.383 + -0.172 -0.699 -0.675 -0.868 -0.725 -0.489 -1.112 -0.469 -0.614 -0.334 + -0.433 -0.607 -0.872 -0.286 -0.383 -0.392 -0.595 -0.656 -0.619 -1.057 + -0.295 -0.543 -0.490 -0.803 -0.546 -1.049 -0.500 -0.130 -0.211 -0.562 + -0.580 -0.740 -0.617 -0.533 -0.594 -0.598 -0.583 -0.395 -0.462 -0.608 + + 323 iasi_metop-a 1454 -0.292055E-02 + -0.438 -0.361 -0.732 -0.479 -0.240 -0.429 -0.675 -0.495 -0.378 -0.443 + -0.551 -0.416 -0.532 -0.451 -0.441 -0.574 -0.264 -0.520 -0.504 -0.373 + -0.438 -0.283 -0.434 -0.520 -0.541 -0.461 -0.690 -0.734 -0.513 -0.609 + -0.753 -0.395 -0.711 -0.622 -0.349 -0.800 -0.501 -0.637 -0.602 -0.833 + -0.674 -0.665 -0.751 -0.537 -0.294 -0.759 -0.747 -0.801 -0.494 -0.508 + -0.184 -0.776 -0.562 -0.970 -0.749 -0.615 -1.118 -0.542 -0.740 -0.477 + -0.471 -0.588 -0.973 -0.431 -0.525 -0.480 -0.517 -0.663 -0.543 -1.101 + -0.301 -0.627 -0.596 -0.775 -0.647 -1.120 -0.546 -0.152 -0.268 -0.628 + -0.607 -0.725 -0.765 -0.511 -0.703 -0.570 -0.657 -0.432 -0.469 -0.547 + + 324 iasi_metop-a 1460 -0.153887E-02 + -0.482 -0.465 -0.828 -0.647 -0.377 -0.574 -0.699 -0.690 -0.471 -0.537 + -0.609 -0.500 -0.614 -0.515 -0.509 -0.633 -0.379 -0.616 -0.529 -0.453 + -0.525 -0.403 -0.467 -0.597 -0.588 -0.618 -0.712 -0.819 -0.529 -0.633 + -0.635 -0.511 -0.741 -0.586 -0.304 -0.690 -0.455 -0.670 -0.291 -0.574 + -0.675 -0.691 -0.309 -0.443 -0.248 -0.740 -0.540 -0.658 -0.373 -0.406 + -0.008 -0.549 -0.527 -0.811 -0.663 -0.301 -1.026 -0.478 -0.622 -0.361 + -0.245 -0.493 -0.665 -0.102 -0.097 -0.383 -0.528 -0.565 -0.446 -0.873 + -0.347 -0.480 -0.428 -0.740 -0.540 -0.926 -0.295 -0.128 -0.178 -0.614 + -0.623 -0.712 -0.678 -0.428 -0.643 -0.517 -0.511 -0.278 -0.472 -0.572 + + 325 iasi_metop-a 1463 -0.569409E-03 + -0.343 -0.240 -0.562 -0.549 -0.225 -0.366 -0.576 -0.528 -0.290 -0.399 + -0.534 -0.453 -0.540 -0.460 -0.569 -0.681 -0.291 -0.594 -0.628 -0.555 + -0.500 -0.436 -0.558 -0.725 -0.656 -0.652 -0.889 -0.934 -0.675 -0.683 + -0.640 -0.554 -0.752 -0.498 -0.266 -0.834 -0.535 -0.662 -0.540 -0.618 + -0.700 -0.605 -0.518 -0.544 -0.265 -0.764 -0.735 -0.769 -0.586 -0.383 + -0.211 -0.785 -0.705 -0.866 -0.738 -0.547 -1.144 -0.541 -0.745 -0.444 + -0.493 -0.562 -0.920 -0.329 -0.293 -0.469 -0.579 -0.711 -0.574 -1.126 + -0.358 -0.565 -0.551 -0.853 -0.688 -1.076 -0.393 -0.176 -0.232 -0.694 + -0.704 -0.761 -0.715 -0.466 -0.641 -0.538 -0.602 -0.441 -0.419 -0.545 + + 326 iasi_metop-a 1469 -0.725447E-02 + -0.485 -0.456 -0.757 -0.629 -0.327 -0.572 -0.697 -0.632 -0.368 -0.547 + -0.562 -0.473 -0.579 -0.511 -0.599 -0.627 -0.345 -0.570 -0.596 -0.420 + -0.485 -0.451 -0.464 -0.524 -0.573 -0.568 -0.680 -0.713 -0.478 -0.624 + -0.859 -0.678 -0.866 -0.718 -0.504 -0.909 -0.720 -0.815 -0.573 -0.773 + -0.815 -0.802 -0.614 -0.761 -0.419 -0.853 -0.756 -0.788 -0.618 -0.527 + -0.313 -0.873 -0.709 -0.892 -0.870 -0.656 -1.188 -0.585 -0.934 -0.536 + -0.517 -0.729 -0.940 -0.423 -0.541 -0.428 -0.796 -0.790 -0.663 -1.087 + -0.423 -0.810 -0.772 -0.914 -0.885 -1.161 -0.473 -0.230 -0.410 -0.842 + -0.832 -0.807 -0.746 -0.687 -0.820 -0.591 -0.724 -0.561 -0.640 -0.798 + + 327 iasi_metop-a 1474 -0.592455E-02 + -0.617 -0.585 -0.969 -0.796 -0.529 -0.709 -0.897 -0.739 -0.532 -0.639 + -0.763 -0.642 -0.663 -0.724 -0.790 -0.829 -0.439 -0.736 -0.734 -0.702 + -0.682 -0.521 -0.696 -0.818 -0.738 -0.720 -0.883 -0.943 -0.721 -0.808 + -0.896 -0.627 -0.882 -0.734 -0.418 -0.946 -0.639 -0.780 -0.551 -0.720 + -0.815 -0.736 -0.527 -0.626 -0.395 -0.967 -0.777 -0.777 -0.630 -0.542 + -0.188 -0.791 -0.772 -0.951 -0.849 -0.663 -1.250 -0.592 -0.819 -0.520 + -0.478 -0.676 -0.937 -0.507 -0.527 -0.502 -0.644 -0.777 -0.583 -1.130 + -0.301 -0.673 -0.723 -0.863 -0.778 -1.071 -0.563 -0.205 -0.464 -0.804 + -0.829 -0.845 -0.778 -0.724 -0.886 -0.766 -0.758 -0.563 -0.625 -0.745 + + 328 iasi_metop-a 1479 -0.353308E-03 + -0.340 -0.320 -0.482 -0.442 -0.293 -0.345 -0.617 -0.614 -0.277 -0.439 + -0.640 -0.449 -0.512 -0.512 -0.496 -0.734 -0.410 -0.627 -0.662 -0.684 + -0.590 -0.519 -0.592 -0.627 -0.719 -0.685 -0.989 -0.967 -0.723 -0.799 + -0.592 -0.404 -0.498 -0.509 -0.321 -0.665 -0.455 -0.605 -0.288 -0.358 + -0.568 -0.846 -0.785 -0.332 -0.387 -0.675 -0.706 -0.790 -0.601 -0.424 + -0.121 -0.573 -0.672 -0.730 -0.585 -0.478 -0.878 -0.421 -0.598 -0.390 + -0.431 -0.564 -0.797 -0.146 -0.284 -0.562 -0.419 -0.671 -0.398 -0.852 + -0.215 -0.504 -0.498 -0.688 -0.450 -0.638 -0.259 -0.375 -0.240 -0.666 + -0.663 -0.454 -0.686 -0.573 -0.406 -0.237 -0.412 -0.192 -0.378 -0.715 + + 329 iasi_metop-a 1483 -0.696302E-02 + -0.686 -0.532 -0.968 -0.888 -0.417 -0.666 -0.772 -0.721 -0.430 -0.587 + -0.611 -0.667 -0.560 -0.703 -0.668 -0.584 -0.299 -0.558 -0.787 -0.503 + -0.523 -0.493 -0.550 -0.581 -0.504 -0.478 -0.742 -0.736 -0.471 -0.600 + -0.987 -0.817 -1.027 -0.882 -0.488 -1.047 -0.629 -0.992 -0.736 -0.858 + -0.927 -1.013 -0.731 -0.776 -0.434 -0.983 -0.909 -0.911 -0.762 -0.573 + -0.386 -0.955 -0.821 -1.162 -0.933 -0.829 -1.297 -0.663 -0.937 -0.614 + -0.581 -0.898 -1.049 -0.555 -0.601 -0.546 -0.715 -0.819 -0.566 -1.265 + -0.412 -0.810 -0.807 -0.897 -0.911 -1.196 -0.632 -0.317 -0.503 -0.977 + -0.886 -0.998 -0.903 -0.775 -0.964 -0.885 -0.831 -0.587 -0.728 -0.956 + + 330 iasi_metop-a 1487 -0.808092E-02 + -0.413 -0.496 -0.736 -0.626 -0.497 -0.622 -0.829 -0.827 -0.490 -0.665 + -0.763 -0.714 -0.755 -0.753 -0.814 -0.955 -0.670 -0.879 -0.912 -0.900 + -0.806 -0.736 -0.883 -1.053 -1.076 -1.001 -1.262 -1.306 -1.059 -1.112 + -0.908 -0.693 -0.891 -0.752 -0.385 -0.997 -0.576 -0.904 -0.534 -0.741 + -0.971 -0.962 -0.707 -0.685 -0.413 -1.047 -0.788 -0.835 -0.578 -0.623 + -0.274 -0.871 -0.792 -1.099 -0.999 -0.665 -1.205 -0.697 -0.930 -0.524 + -0.632 -0.790 -0.982 -0.434 -0.478 -0.655 -0.828 -0.883 -0.615 -1.082 + -0.457 -0.924 -0.777 -0.934 -0.910 -1.110 -0.522 -0.318 -0.422 -0.940 + -0.839 -0.876 -0.943 -0.758 -0.833 -0.697 -0.757 -0.543 -0.746 -0.769 + + 331 iasi_metop-a 1494 -0.662252E-02 + -0.650 -0.599 -0.966 -0.913 -0.513 -0.698 -0.915 -0.841 -0.523 -0.639 + -0.633 -0.597 -0.774 -0.710 -0.728 -0.820 -0.380 -0.722 -0.785 -0.703 + -0.647 -0.488 -0.595 -0.755 -0.703 -0.730 -0.781 -0.852 -0.584 -0.723 + -0.793 -0.663 -0.916 -0.757 -0.453 -0.845 -0.580 -0.876 -0.542 -0.747 + -0.785 -0.981 -0.665 -0.806 -0.428 -0.918 -0.801 -0.790 -0.625 -0.638 + -0.261 -0.896 -0.844 -0.982 -0.913 -0.691 -1.146 -0.679 -0.930 -0.621 + -0.658 -0.828 -0.984 -0.382 -0.407 -0.650 -0.821 -0.777 -0.662 -1.072 + -0.442 -0.829 -0.745 -0.909 -0.766 -0.962 -0.536 -0.380 -0.386 -0.871 + -0.838 -0.900 -0.843 -0.668 -0.859 -0.665 -0.657 -0.597 -0.708 -0.860 + + 332 iasi_metop-a 1496 -0.970269E-02 + -0.532 -0.496 -0.766 -0.734 -0.469 -0.604 -0.869 -0.795 -0.449 -0.599 + -0.637 -0.632 -0.692 -0.668 -0.764 -0.870 -0.442 -0.724 -0.894 -0.767 + -0.700 -0.610 -0.712 -0.925 -0.867 -0.812 -1.131 -1.175 -0.883 -0.935 + -0.825 -0.656 -0.846 -0.655 -0.532 -1.002 -0.580 -0.808 -0.455 -0.700 + -0.845 -0.944 -0.560 -0.827 -0.361 -0.960 -0.623 -0.860 -0.448 -0.586 + -0.069 -0.774 -0.730 -0.926 -0.873 -0.629 -1.088 -0.562 -0.848 -0.477 + -0.559 -0.725 -0.912 -0.398 -0.381 -0.445 -0.772 -0.685 -0.640 -0.956 + -0.345 -0.779 -0.715 -0.853 -0.690 -0.991 -0.419 -0.431 -0.364 -0.800 + -0.804 -0.837 -0.756 -0.725 -0.782 -0.674 -0.615 -0.576 -0.678 -0.787 + + 333 iasi_metop-a 1502 -0.956706E-02 + -0.525 -0.454 -0.745 -0.700 -0.535 -0.631 -0.878 -0.921 -0.486 -0.647 + -0.728 -0.698 -0.715 -0.890 -0.813 -0.888 -0.564 -0.797 -0.961 -0.821 + -0.723 -0.735 -0.749 -0.893 -0.834 -0.807 -1.031 -1.009 -0.826 -0.929 + -1.180 -0.816 -1.075 -0.923 -0.684 -1.129 -0.769 -1.097 -0.679 -0.965 + -0.943 -1.184 -0.878 -1.039 -0.704 -1.232 -1.046 -1.068 -0.815 -0.803 + -0.330 -1.022 -1.015 -1.244 -1.077 -0.830 -1.190 -0.892 -1.112 -0.853 + -0.872 -1.005 -1.081 -0.666 -0.681 -0.776 -1.025 -0.916 -0.932 -1.287 + -0.743 -1.044 -0.920 -1.073 -1.100 -1.183 -0.713 -0.649 -0.576 -0.960 + -1.055 -1.068 -1.094 -0.899 -1.036 -0.847 -0.921 -0.795 -0.874 -0.978 + + 334 iasi_metop-a 1505 -0.957828E-02 + -0.678 -0.605 -0.921 -0.878 -0.682 -0.758 -1.009 -1.033 -0.688 -0.790 + -0.846 -0.856 -0.847 -0.856 -0.946 -1.008 -0.673 -0.946 -1.074 -0.928 + -0.859 -0.767 -0.807 -0.958 -0.891 -0.907 -1.012 -0.982 -0.825 -0.928 + -1.174 -0.809 -1.110 -1.010 -0.736 -1.139 -0.856 -1.072 -0.726 -1.019 + -0.994 -1.207 -0.992 -0.988 -0.840 -1.221 -0.998 -1.100 -0.894 -0.898 + -0.367 -1.020 -0.971 -1.173 -1.060 -0.946 -1.208 -0.785 -1.108 -0.811 + -0.763 -1.045 -1.178 -0.702 -0.588 -0.751 -0.956 -0.928 -0.968 -1.253 + -0.610 -1.026 -0.994 -1.083 -0.980 -1.234 -0.714 -0.583 -0.646 -1.097 + -1.021 -1.100 -1.007 -0.952 -0.968 -0.867 -0.915 -0.797 -0.962 -1.085 + + 335 iasi_metop-a 1509 -0.768152E-02 + -0.712 -0.667 -0.998 -0.951 -0.737 -0.870 -1.055 -1.008 -0.721 -0.860 + -0.896 -0.869 -0.915 -1.046 -1.014 -1.111 -0.717 -0.991 -1.149 -1.000 + -0.890 -0.845 -0.826 -1.046 -0.938 -0.968 -1.058 -1.066 -0.897 -1.088 + -1.290 -0.931 -1.230 -1.038 -0.838 -1.265 -0.896 -1.146 -0.797 -1.087 + -1.160 -1.285 -0.934 -1.173 -0.588 -1.324 -0.954 -1.163 -0.916 -0.831 + -0.453 -1.129 -1.064 -1.286 -1.210 -0.998 -1.522 -0.980 -1.188 -0.829 + -0.977 -1.069 -1.209 -0.791 -0.830 -0.828 -1.060 -1.099 -0.908 -1.369 + -0.752 -1.120 -1.087 -1.207 -1.082 -1.399 -0.839 -0.591 -0.791 -1.161 + -1.157 -1.130 -1.160 -1.125 -1.099 -1.018 -0.982 -1.003 -1.019 -1.176 + + 336 iasi_metop-a 1510 -0.920586E-02 + -0.784 -0.792 -1.054 -1.007 -0.778 -0.902 -1.073 -1.085 -0.759 -0.902 + -0.998 -0.963 -0.914 -1.063 -0.988 -1.119 -0.783 -1.021 -1.084 -1.096 + -0.954 -0.901 -0.880 -1.066 -1.000 -1.058 -1.151 -1.134 -0.919 -1.039 + -1.172 -0.828 -1.113 -1.008 -0.678 -1.162 -0.874 -1.113 -0.722 -0.985 + -1.098 -1.234 -1.012 -1.021 -0.634 -1.315 -0.951 -1.017 -0.809 -0.784 + -0.378 -1.029 -0.942 -1.129 -1.098 -0.942 -1.244 -0.911 -1.085 -0.797 + -0.772 -0.992 -1.215 -0.635 -0.723 -0.711 -1.032 -0.982 -0.866 -1.309 + -0.741 -1.029 -0.992 -1.173 -0.994 -1.258 -0.705 -0.523 -0.689 -1.055 + -0.990 -1.156 -1.035 -1.032 -0.979 -0.899 -0.905 -0.889 -0.842 -1.137 + + 337 iasi_metop-a 1513 -0.101121E-01 + -0.647 -0.657 -0.918 -0.812 -0.654 -0.758 -0.987 -0.990 -0.692 -0.719 + -0.867 -0.848 -0.797 -0.953 -0.903 -1.020 -0.703 -0.901 -1.039 -1.042 + -0.884 -0.801 -0.851 -1.013 -0.960 -0.972 -1.171 -1.203 -0.957 -1.084 + -1.051 -0.739 -0.852 -0.729 -0.557 -0.884 -0.769 -0.897 -0.521 -0.731 + -0.911 -1.034 -0.899 -0.843 -0.570 -1.056 -0.816 -0.867 -0.754 -0.667 + -0.187 -0.844 -0.957 -0.970 -0.905 -0.776 -1.110 -0.607 -0.889 -0.585 + -0.639 -0.788 -0.985 -0.569 -0.552 -0.606 -0.886 -0.738 -0.636 -1.063 + -0.495 -0.830 -0.830 -0.903 -0.870 -1.089 -0.522 -0.387 -0.473 -0.951 + -0.848 -0.914 -0.832 -0.812 -0.835 -0.786 -0.745 -0.645 -0.807 -0.911 + + 338 iasi_metop-a 1518 -0.108132E-01 + -0.780 -0.638 -1.039 -0.986 -0.749 -0.865 -1.053 -1.053 -0.676 -0.789 + -0.856 -0.830 -0.882 -0.966 -0.932 -0.937 -0.596 -0.897 -1.120 -0.877 + -0.809 -0.807 -0.805 -0.939 -0.861 -0.931 -1.040 -1.040 -0.813 -0.964 + -1.277 -0.930 -1.304 -1.057 -0.764 -1.156 -1.006 -1.013 -0.874 -1.044 + -1.023 -1.282 -1.061 -1.191 -0.861 -1.328 -1.037 -1.118 -1.035 -0.968 + -0.466 -1.096 -1.135 -1.241 -1.151 -0.959 -1.361 -0.862 -1.212 -0.839 + -0.856 -1.016 -1.142 -0.742 -0.799 -0.756 -1.106 -1.023 -0.977 -1.316 + -0.857 -1.123 -1.130 -1.148 -1.175 -1.320 -0.797 -0.811 -0.774 -1.095 + -1.099 -1.183 -1.105 -1.021 -1.070 -0.970 -1.063 -0.929 -0.913 -1.108 + + 339 iasi_metop-a 1521 -0.998232E-02 + -0.657 -0.622 -0.926 -0.861 -0.692 -0.768 -1.055 -1.014 -0.783 -0.807 + -0.950 -0.883 -0.887 -0.994 -1.010 -1.077 -0.784 -0.989 -1.124 -1.075 + -0.973 -0.895 -0.953 -1.087 -1.010 -1.097 -1.264 -1.234 -1.069 -1.166 + -1.217 -0.821 -1.015 -0.841 -0.638 -1.085 -0.839 -0.948 -0.653 -0.855 + -0.907 -1.104 -0.962 -0.992 -0.802 -1.224 -0.912 -1.043 -0.837 -0.815 + -0.191 -0.952 -1.029 -1.073 -1.005 -0.854 -1.226 -0.741 -1.061 -0.792 + -0.709 -0.910 -1.035 -0.641 -0.582 -0.765 -0.954 -0.817 -0.767 -1.175 + -0.721 -0.952 -0.873 -0.995 -1.071 -1.206 -0.642 -0.555 -0.600 -1.020 + -0.950 -0.969 -0.930 -0.894 -0.860 -0.955 -0.836 -0.773 -0.881 -1.038 + + 340 iasi_metop-a 1526 -0.965134E-02 + -0.874 -0.750 -1.106 -1.027 -0.844 -0.934 -1.137 -1.099 -0.753 -0.917 + -0.977 -0.850 -0.933 -1.024 -1.011 -1.074 -0.761 -0.995 -1.174 -0.925 + -0.845 -0.893 -0.827 -1.016 -0.925 -0.965 -1.016 -1.021 -0.846 -0.969 + -1.330 -0.979 -1.134 -1.115 -0.881 -1.236 -0.964 -1.108 -0.847 -1.080 + -1.164 -1.304 -1.071 -1.239 -0.839 -1.420 -1.103 -1.247 -1.018 -0.988 + -0.539 -1.112 -1.128 -1.414 -1.239 -1.018 -1.549 -0.917 -1.258 -0.914 + -1.019 -1.084 -1.257 -0.747 -0.824 -0.874 -1.197 -1.045 -0.980 -1.433 + -0.862 -1.100 -1.157 -1.186 -1.153 -1.317 -0.886 -0.655 -0.829 -1.138 + -1.160 -1.212 -1.148 -1.084 -1.102 -1.015 -1.058 -0.985 -1.046 -1.226 + + 341 iasi_metop-a 1529 -0.114242E-01 + -0.829 -0.832 -1.109 -1.028 -0.840 -0.927 -1.175 -1.196 -0.939 -0.951 + -1.093 -1.015 -0.994 -1.094 -1.089 -1.149 -0.936 -1.130 -1.225 -1.210 + -1.031 -0.961 -1.069 -1.187 -1.098 -1.158 -1.345 -1.299 -1.127 -1.209 + -1.340 -0.942 -1.144 -1.046 -0.767 -1.271 -0.915 -1.060 -0.911 -0.978 + -1.017 -1.256 -1.060 -1.195 -0.810 -1.358 -1.092 -1.216 -0.947 -0.910 + -0.383 -1.083 -1.059 -1.193 -1.105 -0.986 -1.305 -0.856 -1.114 -0.905 + -0.841 -1.068 -1.117 -0.779 -0.660 -0.833 -1.084 -0.975 -0.895 -1.279 + -0.861 -1.049 -1.083 -1.098 -1.072 -1.290 -0.811 -0.714 -0.725 -1.102 + -1.012 -1.053 -1.061 -1.037 -1.017 -1.062 -0.936 -0.865 -1.016 -1.185 + + 342 iasi_metop-a 1532 -0.767450E-02 + -0.954 -0.861 -1.251 -1.175 -0.920 -1.044 -1.234 -1.243 -0.868 -1.047 + -1.036 -1.007 -1.057 -1.214 -1.125 -1.134 -0.890 -1.097 -1.298 -1.036 + -1.053 -1.045 -0.986 -1.159 -1.098 -1.097 -1.273 -1.242 -1.066 -1.201 + -1.330 -1.191 -1.403 -1.170 -0.953 -1.480 -1.068 -1.302 -0.957 -1.241 + -1.341 -1.532 -1.175 -1.416 -0.910 -1.532 -1.294 -1.355 -1.100 -1.099 + -0.688 -1.298 -1.294 -1.424 -1.342 -1.174 -1.639 -1.128 -1.409 -1.082 + -1.079 -1.277 -1.337 -1.012 -0.928 -0.981 -1.312 -1.243 -1.241 -1.591 + -0.928 -1.239 -1.180 -1.396 -1.254 -1.511 -1.101 -0.893 -0.900 -1.353 + -1.271 -1.320 -1.240 -1.222 -1.247 -1.222 -1.178 -1.064 -1.124 -1.295 + + 343 iasi_metop-a 1536 -0.652334E-02 + -0.629 -0.641 -0.769 -0.783 -0.703 -0.771 -0.974 -1.064 -0.667 -0.790 + -1.023 -0.849 -0.857 -0.898 -0.901 -1.149 -0.692 -0.997 -1.065 -1.062 + -0.933 -0.924 -0.949 -1.114 -1.008 -1.119 -1.339 -1.337 -1.088 -1.167 + -0.674 -0.550 -0.538 -0.562 -0.301 -0.695 -0.373 -0.534 -0.254 -0.520 + -0.600 -0.797 -0.616 -0.575 -0.404 -0.819 -0.640 -0.778 -0.413 -0.389 + 0.021 -0.465 -0.529 -0.671 -0.606 -0.576 -0.909 -0.395 -0.680 -0.415 + -0.368 -0.612 -0.540 -0.092 -0.177 -0.501 -0.501 -0.610 -0.475 -0.934 + -0.334 -0.603 -0.434 -0.804 -0.551 -0.877 -0.368 -0.357 -0.231 -0.738 + -0.627 -0.586 -0.652 -0.691 -0.437 -0.510 -0.526 -0.310 -0.458 -0.643 + + 344 iasi_metop-a 1537 -0.107164E-01 + -0.637 -0.598 -0.844 -0.825 -0.510 -0.632 -0.771 -0.707 -0.490 -0.588 + -0.733 -0.600 -0.548 -0.798 -0.779 -0.715 -0.491 -0.627 -0.850 -0.693 + -0.509 -0.652 -0.605 -0.704 -0.627 -0.669 -0.855 -0.776 -0.547 -0.639 + -1.055 -0.647 -0.796 -0.767 -0.464 -0.827 -0.731 -0.753 -0.506 -0.717 + -0.694 -0.945 -0.917 -0.884 -0.656 -1.042 -0.799 -0.919 -0.543 -0.629 + -0.079 -0.678 -0.768 -0.804 -0.789 -0.752 -1.013 -0.622 -0.791 -0.580 + -0.539 -0.719 -0.775 -0.310 -0.367 -0.638 -0.687 -0.688 -0.645 -1.079 + -0.596 -0.708 -0.647 -0.966 -0.695 -0.951 -0.519 -0.493 -0.470 -0.829 + -0.753 -0.764 -0.878 -0.775 -0.603 -0.796 -0.719 -0.451 -0.741 -0.933 + + 345 iasi_metop-a 1541 -0.767374E-02 + -0.830 -0.772 -1.104 -1.077 -0.767 -0.882 -1.066 -1.074 -0.712 -0.840 + -0.928 -0.926 -0.849 -0.950 -0.941 -0.963 -0.657 -0.861 -1.146 -0.895 + -0.887 -0.906 -0.839 -1.032 -0.939 -0.974 -1.197 -1.160 -0.893 -1.106 + -1.260 -1.005 -1.148 -1.020 -0.838 -1.171 -0.914 -1.053 -0.854 -0.935 + -1.039 -1.330 -0.953 -1.087 -0.806 -1.254 -1.112 -1.153 -0.887 -0.904 + -0.451 -1.086 -1.042 -1.201 -1.163 -0.932 -1.348 -0.907 -1.113 -0.911 + -0.833 -0.964 -1.149 -0.679 -0.638 -0.897 -1.061 -1.089 -0.954 -1.353 + -0.940 -1.105 -0.940 -1.159 -1.078 -1.287 -0.807 -0.719 -0.777 -1.220 + -1.118 -1.157 -1.172 -1.057 -0.977 -1.068 -1.096 -0.880 -1.033 -1.060 + + 346 iasi_metop-a 1545 -0.135339E-01 + -0.959 -0.920 -1.210 -1.127 -0.972 -0.995 -1.143 -1.162 -0.835 -0.990 + -1.105 -1.062 -0.997 -1.139 -1.102 -1.172 -0.893 -1.125 -1.296 -1.187 + -1.088 -1.071 -1.096 -1.206 -1.159 -1.217 -1.411 -1.395 -1.202 -1.282 + -1.395 -0.940 -1.137 -1.078 -0.784 -1.185 -0.968 -1.094 -0.826 -0.926 + -1.065 -1.270 -1.135 -1.263 -0.929 -1.311 -1.070 -1.226 -0.935 -0.985 + -0.466 -1.099 -1.214 -1.185 -1.117 -1.104 -1.331 -0.870 -1.153 -0.931 + -0.820 -1.082 -1.179 -0.726 -0.652 -0.873 -1.028 -1.035 -0.882 -1.323 + -0.901 -1.065 -1.035 -1.169 -0.983 -1.204 -0.841 -0.745 -0.726 -1.155 + -1.072 -1.269 -1.092 -1.056 -0.984 -1.004 -1.010 -0.909 -0.998 -1.212 + + 347 iasi_metop-a 1548 -0.913688E-02 + -0.976 -0.923 -1.290 -1.201 -0.966 -1.122 -1.275 -1.210 -0.897 -1.055 + -1.066 -1.135 -1.062 -1.240 -1.202 -1.224 -0.871 -1.155 -1.378 -1.132 + -1.041 -1.101 -1.093 -1.272 -1.176 -1.215 -1.402 -1.391 -1.158 -1.338 + -1.313 -1.105 -1.273 -1.166 -0.893 -1.338 -1.005 -1.301 -0.949 -1.135 + -1.222 -1.352 -1.136 -1.316 -0.895 -1.554 -1.308 -1.257 -1.064 -1.088 + -0.637 -1.197 -1.244 -1.342 -1.322 -1.156 -1.555 -1.069 -1.322 -1.041 + -1.119 -1.191 -1.247 -0.820 -0.916 -0.964 -1.263 -1.094 -1.079 -1.510 + -0.928 -1.217 -1.187 -1.328 -1.163 -1.371 -0.990 -0.804 -0.865 -1.289 + -1.118 -1.280 -1.193 -1.202 -1.240 -1.103 -1.205 -1.041 -1.143 -1.307 + + 348 iasi_metop-a 1553 -0.155616E-01 + -1.125 -1.098 -1.415 -1.296 -1.078 -1.158 -1.318 -1.342 -0.980 -1.096 + -1.259 -1.169 -1.150 -1.305 -1.192 -1.284 -0.947 -1.175 -1.371 -1.243 + -1.090 -1.076 -1.187 -1.330 -1.223 -1.287 -1.483 -1.466 -1.252 -1.364 + -1.247 -0.920 -1.059 -0.944 -0.712 -1.212 -0.881 -0.881 -0.795 -0.952 + -0.941 -1.204 -0.944 -1.062 -0.879 -1.175 -1.021 -1.188 -0.736 -0.828 + -0.279 -0.943 -1.053 -1.088 -0.966 -0.862 -1.236 -0.758 -0.997 -0.769 + -0.803 -0.867 -1.048 -0.586 -0.552 -0.782 -0.926 -0.934 -0.722 -1.161 + -0.765 -0.969 -0.910 -1.084 -1.074 -1.147 -0.759 -0.636 -0.684 -1.014 + -0.986 -1.048 -1.023 -1.053 -0.933 -1.025 -0.910 -0.816 -0.986 -1.128 + + 349 iasi_metop-a 1560 -0.215177E-01 + -1.106 -1.005 -1.409 -1.347 -1.045 -1.115 -1.356 -1.320 -1.023 -1.140 + -1.173 -1.196 -1.206 -1.303 -1.303 -1.226 -0.963 -1.221 -1.440 -1.269 + -1.157 -1.232 -1.271 -1.382 -1.307 -1.332 -1.576 -1.571 -1.330 -1.450 + -1.395 -1.074 -1.094 -1.120 -0.909 -1.387 -1.147 -1.150 -0.993 -1.087 + -1.258 -1.253 -1.403 -1.262 -1.026 -1.329 -1.216 -1.277 -0.979 -0.975 + -0.513 -1.151 -1.157 -1.197 -1.290 -1.157 -1.295 -0.942 -1.172 -1.079 + -0.911 -1.079 -1.163 -0.823 -0.763 -0.984 -1.103 -1.181 -0.932 -1.295 + -0.989 -1.175 -1.120 -1.194 -1.222 -1.390 -0.961 -0.964 -0.830 -1.191 + -1.187 -1.092 -1.239 -1.175 -1.049 -1.184 -1.147 -0.946 -1.099 -1.351 + + 350 iasi_metop-a 1568 -0.192118E-01 + -0.979 -0.946 -1.181 -1.131 -1.028 -1.186 -1.281 -1.306 -1.065 -1.194 + -1.179 -1.188 -1.220 -1.303 -1.291 -1.278 -1.092 -1.300 -1.581 -1.287 + -1.323 -1.305 -1.355 -1.424 -1.383 -1.471 -1.639 -1.655 -1.394 -1.582 + -1.509 -1.064 -1.217 -1.195 -0.935 -1.338 -1.107 -1.216 -1.029 -1.176 + -1.141 -1.285 -1.377 -1.466 -1.004 -1.424 -1.234 -1.267 -1.189 -1.044 + -0.549 -1.190 -1.280 -1.306 -1.290 -1.209 -1.333 -1.010 -1.201 -1.141 + -1.063 -1.282 -1.240 -0.727 -0.900 -1.013 -1.310 -1.142 -1.031 -1.436 + -0.944 -1.126 -1.256 -1.305 -1.317 -1.399 -0.911 -0.978 -0.827 -1.225 + -1.203 -1.218 -1.195 -1.246 -1.079 -1.158 -0.994 -0.990 -1.075 -1.299 + + 351 iasi_metop-a 1574 -0.188687E-01 + -1.107 -1.094 -1.291 -1.267 -1.088 -1.219 -1.443 -1.438 -1.115 -1.223 + -1.310 -1.243 -1.226 -1.288 -1.252 -1.263 -1.004 -1.218 -1.431 -1.255 + -1.184 -1.203 -1.208 -1.300 -1.224 -1.229 -1.393 -1.375 -1.114 -1.236 + -1.546 -1.105 -1.221 -1.264 -1.006 -1.545 -1.288 -1.252 -1.159 -1.263 + -1.322 -1.440 -1.439 -1.453 -1.190 -1.503 -1.376 -1.364 -1.078 -1.124 + -0.621 -1.319 -1.302 -1.471 -1.383 -1.276 -1.508 -1.039 -1.319 -1.233 + -1.048 -1.286 -1.361 -1.065 -0.964 -1.038 -1.258 -1.279 -1.069 -1.543 + -1.129 -1.255 -1.275 -1.366 -1.480 -1.518 -1.070 -1.107 -1.025 -1.326 + -1.302 -1.215 -1.380 -1.340 -1.067 -1.263 -1.203 -1.195 -1.199 -1.453 + + 352 iasi_metop-a 1579 -0.208084E-01 + -1.148 -1.145 -1.208 -1.217 -1.153 -1.273 -1.348 -1.358 -1.238 -1.367 + -1.333 -1.243 -1.336 -1.460 -1.390 -1.368 -1.186 -1.409 -1.559 -1.361 + -1.394 -1.420 -1.391 -1.444 -1.421 -1.501 -1.574 -1.523 -1.333 -1.507 + -1.508 -1.249 -1.425 -1.456 -1.172 -1.554 -1.233 -1.385 -1.256 -1.409 + -1.476 -1.596 -1.569 -1.488 -1.309 -1.577 -1.497 -1.501 -1.312 -1.300 + -0.958 -1.472 -1.513 -1.622 -1.442 -1.354 -1.615 -1.293 -1.477 -1.243 + -1.252 -1.447 -1.461 -1.172 -1.225 -1.278 -1.320 -1.422 -1.403 -1.592 + -1.171 -1.498 -1.432 -1.726 -1.480 -1.680 -1.358 -1.317 -1.260 -1.404 + -1.487 -1.404 -1.672 -1.462 -1.240 -1.181 -1.260 -1.215 -1.265 -1.614 + + 353 iasi_metop-a 1583 -0.220033E-01 + -1.472 -1.418 -1.568 -1.554 -1.433 -1.558 -1.731 -1.612 -1.510 -1.612 + -1.601 -1.588 -1.572 -1.625 -1.605 -1.492 -1.393 -1.485 -1.689 -1.514 + -1.524 -1.500 -1.501 -1.563 -1.484 -1.468 -1.493 -1.491 -1.374 -1.454 + -2.116 -1.686 -1.838 -1.771 -1.629 -1.921 -1.659 -1.729 -1.775 -1.823 + -1.916 -2.008 -2.075 -2.000 -1.631 -2.057 -1.924 -1.863 -1.697 -1.683 + -1.298 -1.899 -1.811 -2.020 -1.923 -1.871 -2.003 -1.663 -1.889 -1.761 + -1.535 -1.828 -1.819 -1.618 -1.612 -1.559 -1.862 -1.782 -1.648 -2.014 + -1.540 -1.897 -1.874 -2.004 -1.937 -1.979 -1.697 -1.612 -1.578 -1.752 + -1.862 -1.677 -1.909 -1.780 -1.656 -1.793 -1.643 -1.668 -1.588 -1.890 + + 354 iasi_metop-a 1585 -0.198507E-01 + -1.555 -1.607 -1.658 -1.592 -1.668 -1.729 -1.954 -1.843 -1.696 -1.778 + -1.737 -1.693 -1.769 -1.831 -1.822 -1.810 -1.637 -1.776 -1.909 -1.777 + -1.819 -1.806 -1.739 -1.801 -1.800 -1.801 -1.854 -1.846 -1.692 -1.765 + -2.003 -1.676 -1.845 -1.859 -1.523 -1.990 -1.730 -1.752 -1.661 -1.768 + -1.903 -1.930 -2.073 -1.972 -1.599 -2.027 -1.844 -1.846 -1.686 -1.622 + -1.260 -1.833 -1.757 -1.916 -1.950 -1.776 -1.920 -1.665 -1.807 -1.608 + -1.612 -1.768 -1.776 -1.500 -1.545 -1.463 -1.784 -1.674 -1.713 -2.008 + -1.552 -1.816 -1.758 -2.017 -1.968 -1.929 -1.764 -1.485 -1.484 -1.774 + -1.856 -1.701 -1.913 -1.774 -1.601 -1.677 -1.624 -1.620 -1.555 -1.904 + + 355 iasi_metop-a 1587 -0.196676E-01 + -1.507 -1.508 -1.587 -1.524 -1.593 -1.663 -1.808 -1.752 -1.644 -1.702 + -1.641 -1.658 -1.594 -1.748 -1.696 -1.733 -1.573 -1.697 -1.818 -1.695 + -1.687 -1.720 -1.670 -1.725 -1.676 -1.705 -1.743 -1.724 -1.604 -1.652 + -1.879 -1.437 -1.650 -1.664 -1.397 -1.615 -1.506 -1.658 -1.492 -1.490 + -1.671 -1.749 -1.923 -1.718 -1.490 -1.767 -1.649 -1.627 -1.496 -1.518 + -1.142 -1.600 -1.656 -1.734 -1.683 -1.563 -1.764 -1.569 -1.630 -1.445 + -1.290 -1.596 -1.555 -1.193 -1.292 -1.379 -1.704 -1.489 -1.517 -1.808 + -1.309 -1.503 -1.606 -1.754 -1.707 -1.701 -1.451 -1.367 -1.333 -1.549 + -1.598 -1.550 -1.738 -1.536 -1.367 -1.460 -1.420 -1.455 -1.372 -1.720 + + 356 iasi_metop-a 1606 -0.100489E-01 + -1.391 -1.310 -1.641 -1.541 -1.417 -1.497 -1.745 -1.668 -1.468 -1.493 + -1.542 -1.574 -1.426 -1.555 -1.574 -1.628 -1.314 -1.507 -1.751 -1.557 + -1.586 -1.479 -1.539 -1.608 -1.538 -1.523 -1.603 -1.651 -1.425 -1.517 + -1.551 -1.292 -1.542 -1.362 -1.035 -1.584 -1.227 -1.438 -1.242 -1.372 + -1.363 -1.629 -1.238 -1.461 -1.111 -1.610 -1.341 -1.532 -1.369 -1.168 + -0.833 -1.452 -1.445 -1.448 -1.363 -1.381 -1.829 -1.277 -1.518 -1.252 + -1.214 -1.375 -1.509 -1.102 -1.145 -1.127 -1.354 -1.319 -1.386 -1.707 + -1.127 -1.372 -1.408 -1.596 -1.435 -1.687 -1.293 -0.992 -1.108 -1.520 + -1.448 -1.456 -1.374 -1.348 -1.419 -1.369 -1.431 -1.293 -1.312 -1.468 + + 357 iasi_metop-a 1626 -0.938606E-02 + -1.077 -1.022 -1.252 -1.153 -1.115 -1.178 -1.323 -1.390 -1.250 -1.276 + -1.386 -1.208 -1.307 -1.353 -1.323 -1.442 -1.163 -1.345 -1.460 -1.517 + -1.315 -1.341 -1.383 -1.499 -1.399 -1.509 -1.678 -1.660 -1.507 -1.562 + -1.462 -1.121 -1.264 -1.367 -0.999 -1.496 -1.210 -1.274 -1.023 -1.168 + -1.384 -1.510 -1.346 -1.263 -1.109 -1.441 -1.425 -1.498 -1.234 -1.144 + -0.724 -1.274 -1.346 -1.358 -1.324 -1.258 -1.488 -1.119 -1.260 -1.104 + -1.060 -1.327 -1.335 -0.872 -0.977 -1.255 -1.231 -1.280 -1.123 -1.577 + -1.028 -1.168 -1.326 -1.545 -1.397 -1.387 -1.007 -1.016 -0.882 -1.238 + -1.292 -1.194 -1.413 -1.261 -1.156 -1.193 -1.192 -1.018 -1.230 -1.461 + + 358 iasi_metop-a 1639 -0.126328E-01 + -0.970 -0.842 -1.130 -1.074 -0.982 -1.033 -1.216 -1.235 -1.005 -1.007 + -1.230 -1.132 -1.079 -1.210 -1.230 -1.164 -1.002 -1.202 -1.442 -1.201 + -1.145 -1.211 -1.147 -1.277 -1.213 -1.134 -1.384 -1.321 -1.141 -1.315 + -1.420 -0.861 -1.170 -0.970 -0.798 -1.355 -1.000 -1.122 -0.877 -1.030 + -1.169 -1.253 -1.373 -1.230 -0.942 -1.211 -1.120 -1.195 -0.970 -0.881 + -0.568 -1.083 -1.160 -1.157 -1.158 -1.197 -1.300 -0.868 -1.108 -0.916 + -1.023 -1.127 -1.066 -0.743 -0.838 -0.804 -1.133 -1.019 -0.928 -1.282 + -0.783 -1.108 -1.125 -1.234 -1.269 -1.300 -0.835 -0.660 -0.757 -1.109 + -1.085 -0.969 -1.187 -1.145 -1.009 -1.030 -1.009 -0.775 -0.945 -1.134 + + 359 iasi_metop-a 1643 -0.326757E-02 + -0.506 -0.501 -0.599 -0.645 -0.593 -0.614 -0.768 -0.787 -0.671 -0.655 + -0.897 -0.674 -0.714 -0.787 -0.797 -0.842 -0.701 -0.900 -1.077 -0.877 + -0.824 -0.892 -0.805 -0.868 -0.875 -0.949 -1.151 -1.095 -0.906 -1.023 + -0.831 -0.540 -0.479 -0.704 -0.269 -0.961 -0.652 -0.624 -0.351 -0.509 + -0.736 -0.830 -0.900 -0.729 -0.754 -0.821 -0.851 -0.983 -0.685 -0.581 + -0.331 -0.719 -0.715 -0.739 -0.746 -0.883 -1.024 -0.611 -0.893 -0.626 + -0.694 -0.842 -0.778 -0.431 -0.483 -0.665 -0.640 -0.841 -0.591 -1.092 + -0.528 -0.872 -0.730 -0.862 -0.778 -0.787 -0.539 -0.566 -0.220 -0.830 + -0.734 -0.574 -0.855 -0.757 -0.577 -0.515 -0.563 -0.426 -0.576 -0.796 + + 360 iasi_metop-a 1652 -0.120913E-01 + -0.553 -0.438 -0.838 -0.707 -0.495 -0.610 -0.774 -0.743 -0.455 -0.485 + -0.747 -0.652 -0.535 -0.684 -0.725 -0.553 -0.449 -0.602 -0.843 -0.589 + -0.576 -0.610 -0.623 -0.666 -0.553 -0.518 -0.731 -0.715 -0.547 -0.662 + -0.958 -0.592 -0.806 -0.718 -0.534 -0.988 -0.596 -0.841 -0.463 -0.593 + -0.785 -0.972 -0.911 -0.842 -0.511 -0.948 -0.812 -0.908 -0.689 -0.638 + -0.201 -0.790 -0.839 -0.951 -0.857 -0.797 -1.019 -0.601 -0.815 -0.577 + -0.636 -0.750 -0.820 -0.357 -0.383 -0.547 -0.868 -0.790 -0.650 -1.001 + -0.584 -0.697 -0.789 -0.961 -0.950 -0.955 -0.517 -0.528 -0.414 -0.784 + -0.774 -0.819 -0.808 -0.681 -0.789 -0.854 -0.781 -0.550 -0.716 -0.949 + + 361 iasi_metop-a 1658 -0.116617E-01 + -0.472 -0.380 -0.704 -0.532 -0.504 -0.543 -0.674 -0.675 -0.456 -0.570 + -0.709 -0.613 -0.625 -0.736 -0.702 -0.717 -0.492 -0.727 -0.836 -0.717 + -0.596 -0.638 -0.643 -0.769 -0.706 -0.714 -0.913 -0.889 -0.796 -0.777 + -0.963 -0.505 -0.644 -0.697 -0.403 -0.843 -0.448 -0.822 -0.405 -0.616 + -0.694 -0.891 -0.767 -0.779 -0.527 -0.853 -0.786 -0.956 -0.602 -0.567 + -0.151 -0.706 -0.734 -0.769 -0.855 -0.756 -0.948 -0.530 -0.722 -0.551 + -0.572 -0.755 -0.759 -0.240 -0.286 -0.625 -0.696 -0.759 -0.516 -0.975 + -0.420 -0.691 -0.657 -0.866 -0.750 -1.015 -0.514 -0.326 -0.304 -0.781 + -0.709 -0.686 -0.725 -0.730 -0.609 -0.803 -0.642 -0.452 -0.570 -0.826 + + 362 iasi_metop-a 1659 -0.125767E-01 + -0.484 -0.442 -0.744 -0.606 -0.468 -0.536 -0.724 -0.725 -0.447 -0.541 + -0.689 -0.571 -0.567 -0.713 -0.629 -0.612 -0.436 -0.656 -0.892 -0.642 + -0.529 -0.595 -0.546 -0.662 -0.628 -0.616 -0.749 -0.719 -0.554 -0.678 + -0.963 -0.624 -0.697 -0.747 -0.377 -0.869 -0.540 -0.782 -0.451 -0.646 + -0.700 -0.918 -0.761 -0.845 -0.562 -0.874 -0.819 -0.937 -0.654 -0.525 + -0.150 -0.732 -0.744 -0.794 -0.763 -0.804 -0.963 -0.574 -0.751 -0.591 + -0.590 -0.712 -0.785 -0.338 -0.392 -0.637 -0.760 -0.820 -0.570 -0.972 + -0.487 -0.710 -0.764 -0.922 -0.887 -0.977 -0.536 -0.337 -0.325 -0.804 + -0.785 -0.749 -0.770 -0.741 -0.662 -0.737 -0.676 -0.486 -0.555 -0.844 + + 363 iasi_metop-a 1666 -0.121015E-01 + -0.418 -0.444 -0.683 -0.555 -0.520 -0.512 -0.768 -0.678 -0.409 -0.548 + -0.699 -0.651 -0.648 -0.714 -0.683 -0.661 -0.471 -0.718 -0.948 -0.685 + -0.670 -0.630 -0.606 -0.731 -0.724 -0.725 -0.860 -0.893 -0.656 -0.825 + -0.847 -0.546 -0.771 -0.701 -0.440 -1.018 -0.663 -0.816 -0.509 -0.702 + -0.812 -0.961 -0.661 -0.671 -0.458 -0.954 -0.846 -0.844 -0.609 -0.581 + -0.154 -0.821 -0.798 -0.872 -0.871 -0.772 -1.110 -0.589 -0.857 -0.631 + -0.640 -0.757 -0.867 -0.408 -0.405 -0.558 -0.836 -0.825 -0.705 -1.066 + -0.556 -0.767 -0.792 -1.026 -1.022 -1.142 -0.582 -0.354 -0.338 -0.771 + -0.854 -0.761 -0.717 -0.760 -0.877 -0.806 -0.712 -0.618 -0.622 -0.898 + + 364 iasi_metop-a 1671 -0.113158E-01 + -0.587 -0.527 -0.836 -0.693 -0.589 -0.622 -0.801 -0.661 -0.445 -0.573 + -0.758 -0.600 -0.548 -0.674 -0.696 -0.702 -0.408 -0.672 -0.854 -0.599 + -0.556 -0.565 -0.532 -0.694 -0.557 -0.640 -0.776 -0.779 -0.531 -0.631 + -0.688 -0.456 -0.523 -0.560 -0.299 -0.695 -0.395 -0.423 -0.320 -0.424 + -0.594 -0.792 -0.502 -0.541 -0.270 -0.657 -0.695 -0.797 -0.385 -0.403 + -0.009 -0.497 -0.665 -0.590 -0.616 -0.415 -0.805 -0.372 -0.615 -0.420 + -0.342 -0.485 -0.567 -0.028 -0.152 -0.495 -0.517 -0.623 -0.480 -0.813 + -0.289 -0.473 -0.427 -0.940 -0.560 -0.790 -0.351 -0.155 -0.179 -0.565 + -0.578 -0.611 -0.790 -0.470 -0.498 -0.479 -0.515 -0.176 -0.528 -0.701 + + 365 iasi_metop-a 1675 -0.109677E-01 + -0.617 -0.470 -0.876 -0.802 -0.631 -0.659 -0.885 -0.662 -0.542 -0.656 + -0.696 -0.749 -0.712 -0.760 -0.857 -0.752 -0.497 -0.734 -0.995 -0.763 + -0.642 -0.647 -0.761 -0.821 -0.753 -0.774 -0.936 -0.999 -0.758 -0.831 + -1.068 -0.797 -0.886 -0.906 -0.589 -1.120 -0.809 -0.974 -0.733 -0.852 + -0.913 -1.068 -0.729 -0.940 -0.482 -0.930 -0.908 -0.980 -0.876 -0.675 + -0.426 -0.963 -0.853 -1.131 -0.967 -0.950 -1.287 -0.747 -1.015 -0.769 + -0.784 -0.920 -1.003 -0.489 -0.563 -0.655 -1.024 -0.924 -0.877 -1.207 + -0.726 -0.813 -0.891 -1.192 -1.098 -1.145 -0.765 -0.398 -0.502 -0.922 + -0.867 -0.953 -0.996 -0.868 -0.989 -0.726 -0.938 -0.735 -0.782 -1.036 + + 366 iasi_metop-a 1681 -0.319533E-02 + -0.726 -0.628 -1.031 -0.814 -0.747 -0.782 -0.973 -0.762 -0.741 -0.816 + -0.859 -0.825 -0.806 -0.907 -0.897 -0.904 -0.552 -0.878 -0.965 -0.908 + -0.853 -0.664 -0.854 -0.930 -0.813 -0.905 -1.040 -1.151 -0.935 -0.976 + -0.735 -0.406 -0.675 -0.717 -0.315 -0.887 -0.605 -0.691 -0.541 -0.608 + -0.779 -0.730 -0.740 -0.600 -0.270 -0.798 -0.821 -0.810 -0.551 -0.483 + -0.259 -0.707 -0.732 -0.851 -0.635 -0.679 -1.086 -0.644 -0.633 -0.541 + -0.621 -0.544 -0.934 -0.208 -0.519 -0.518 -0.668 -0.885 -0.700 -1.144 + -0.453 -0.585 -0.673 -1.035 -0.707 -1.301 -0.720 -0.320 -0.227 -0.556 + -0.501 -0.859 -0.867 -0.661 -0.954 -0.838 -0.803 -0.559 -0.529 -0.888 + + 367 iasi_metop-a 1694 0.965891E-03 + -0.713 -0.636 -1.007 -0.859 -0.664 -0.840 -1.039 -0.689 -0.657 -0.844 + -0.983 -0.732 -0.833 -0.825 -0.772 -0.850 -0.564 -0.834 -0.892 -0.751 + -0.768 -0.666 -0.733 -0.839 -0.856 -0.693 -0.949 -1.075 -0.811 -0.901 + -0.864 -0.396 -0.950 -0.937 -0.481 -0.961 -0.743 -0.659 -0.656 -0.758 + -0.799 -0.743 -0.923 -0.668 -0.490 -0.925 -0.927 -0.992 -0.796 -0.603 + -0.454 -0.759 -0.699 -1.037 -0.783 -0.900 -1.231 -0.676 -0.808 -0.781 + -0.800 -0.608 -1.064 -0.429 -0.839 -0.654 -0.718 -0.638 -0.756 -1.091 + -0.478 -0.557 -0.792 -1.270 -0.726 -1.481 -0.871 -0.244 -0.347 -0.534 + -0.543 -0.977 -0.873 -0.771 -0.788 -0.703 -0.927 -0.444 -0.622 -0.947 + + 368 iasi_metop-a 1697 0.543372E-02 + -0.741 -0.513 -1.069 -0.784 -0.616 -0.870 -0.932 -0.617 -0.637 -0.917 + -0.917 -0.755 -0.801 -0.798 -0.732 -0.883 -0.561 -0.841 -0.923 -0.715 + -0.891 -0.735 -0.801 -1.031 -0.910 -0.806 -1.047 -1.226 -0.913 -1.015 + -0.858 -0.443 -0.791 -0.917 -0.510 -0.866 -0.777 -0.740 -0.520 -0.715 + -0.721 -0.767 -0.806 -0.671 -0.356 -0.814 -0.901 -0.972 -0.726 -0.538 + -0.417 -0.781 -0.699 -1.034 -0.795 -0.935 -1.263 -0.653 -0.709 -0.585 + -0.779 -0.602 -1.031 -0.262 -0.647 -0.571 -0.765 -0.967 -0.640 -1.042 + -0.391 -0.646 -0.707 -1.137 -0.801 -1.344 -0.786 -0.277 -0.420 -0.403 + -0.546 -0.862 -0.968 -0.617 -0.799 -0.590 -0.864 -0.489 -0.550 -0.823 + + 369 iasi_metop-a 1710 0.804519E-02 + -0.889 -0.661 -1.132 -0.855 -0.728 -0.876 -1.062 -0.721 -0.749 -0.885 + -0.960 -0.825 -0.864 -0.802 -0.786 -0.893 -0.613 -0.904 -0.847 -0.745 + -0.823 -0.698 -0.772 -0.944 -0.887 -0.835 -0.982 -1.122 -0.988 -0.899 + -0.841 -0.573 -0.927 -1.073 -0.684 -1.130 -0.934 -0.674 -0.715 -0.831 + -0.838 -0.847 -0.889 -0.897 -0.565 -0.940 -0.996 -0.938 -0.888 -0.718 + -0.647 -0.736 -0.782 -1.158 -0.853 -0.869 -1.330 -0.762 -0.698 -0.786 + -0.879 -0.709 -1.191 -0.464 -0.816 -0.707 -0.906 -0.722 -0.794 -1.214 + -0.681 -0.691 -0.904 -1.250 -0.831 -1.494 -0.805 -0.365 -0.421 -0.541 + -0.664 -1.081 -0.986 -0.841 -0.840 -0.777 -0.997 -0.546 -0.639 -1.115 + + 370 iasi_metop-a 1786 0.217974E-01 + -0.933 -0.914 -1.209 -1.018 -0.862 -0.935 -1.002 -0.839 -0.697 -0.920 + -1.108 -0.899 -0.998 -0.988 -0.745 -1.005 -0.708 -0.831 -1.140 -0.859 + -0.897 -0.912 -0.889 -1.089 -0.974 -0.912 -1.130 -1.378 -1.028 -1.031 + -0.893 -0.846 -0.926 -1.074 -0.852 -1.206 -0.998 -0.983 -0.814 -0.830 + -0.923 -1.244 -1.209 -0.607 -0.761 -0.904 -1.079 -1.359 -1.206 -0.738 + -0.760 -0.875 -1.149 -1.261 -1.124 -0.853 -1.302 -1.013 -0.887 -1.032 + -0.862 -0.883 -1.149 -0.539 -0.787 -0.926 -0.868 -1.127 -0.996 -1.387 + -0.673 -0.749 -0.908 -1.356 -1.055 -1.214 -0.930 -0.731 -0.492 -1.048 + -0.895 -1.119 -1.107 -0.848 -1.054 -0.598 -0.961 -0.543 -0.746 -1.115 + + 371 iasi_metop-a 1791 0.404243E-02 + -1.256 -1.114 -1.327 -1.424 -0.985 -1.174 -1.282 -0.963 -1.013 -1.155 + -1.103 -1.104 -1.093 -1.178 -1.300 -0.999 -0.880 -1.040 -1.200 -0.873 + -1.120 -1.009 -1.152 -1.125 -1.175 -1.037 -1.274 -1.356 -1.116 -1.121 + -1.329 -0.889 -1.313 -1.393 -0.943 -1.197 -1.260 -1.018 -1.102 -1.092 + -1.212 -1.116 -1.214 -1.201 -0.743 -1.291 -1.414 -1.406 -1.283 -1.019 + -0.956 -1.144 -1.150 -1.386 -1.258 -1.138 -1.638 -0.968 -1.157 -1.054 + -1.343 -0.973 -1.507 -0.891 -1.215 -0.965 -1.151 -0.957 -1.096 -1.689 + -1.083 -0.964 -1.313 -1.586 -1.145 -1.764 -1.170 -0.599 -0.857 -0.960 + -0.872 -1.501 -1.233 -1.049 -1.169 -1.196 -1.326 -0.824 -1.057 -1.353 + + 372 iasi_metop-a 1805 0.374106E-02 + -1.460 -1.355 -1.772 -1.629 -1.306 -1.577 -1.659 -1.345 -1.228 -1.453 + -1.495 -1.370 -1.389 -1.402 -1.368 -1.407 -1.177 -1.478 -1.437 -1.284 + -1.486 -1.303 -1.429 -1.669 -1.552 -1.408 -1.737 -1.882 -1.598 -1.635 + -1.338 -1.049 -1.419 -1.441 -0.990 -1.443 -1.410 -1.071 -1.269 -1.345 + -1.350 -1.204 -1.310 -1.106 -0.878 -1.373 -1.400 -1.467 -1.439 -1.107 + -1.014 -1.181 -1.168 -1.479 -1.364 -1.133 -1.699 -1.071 -1.210 -1.118 + -1.374 -1.074 -1.561 -0.966 -1.163 -1.119 -1.241 -1.092 -1.215 -1.793 + -1.079 -1.041 -1.444 -1.763 -1.223 -1.847 -1.262 -0.760 -0.912 -0.880 + -0.985 -1.568 -1.243 -1.147 -1.291 -1.369 -1.433 -0.972 -1.200 -1.540 + + 373 iasi_metop-a 1839 0.418872E-02 + -1.598 -1.534 -1.871 -1.751 -1.389 -1.688 -1.778 -1.475 -1.394 -1.626 + -1.627 -1.548 -1.507 -1.528 -1.501 -1.540 -1.342 -1.640 -1.600 -1.540 + -1.629 -1.493 -1.625 -1.829 -1.698 -1.554 -1.850 -2.045 -1.772 -1.834 + -1.562 -1.247 -1.503 -1.619 -1.163 -1.437 -1.440 -1.255 -1.249 -1.428 + -1.413 -1.318 -1.553 -1.293 -0.957 -1.464 -1.572 -1.605 -1.460 -1.283 + -1.143 -1.315 -1.363 -1.594 -1.481 -1.301 -1.781 -1.213 -1.389 -1.305 + -1.522 -1.199 -1.672 -1.059 -1.473 -1.225 -1.345 -1.106 -1.275 -1.830 + -1.251 -1.086 -1.601 -1.796 -1.432 -1.906 -1.381 -0.879 -1.042 -1.078 + -1.079 -1.637 -1.417 -1.365 -1.329 -1.494 -1.544 -1.123 -1.301 -1.701 + + 374 iasi_metop-a 1884 0.384145E-02 + -1.539 -1.446 -1.843 -1.681 -1.403 -1.696 -1.721 -1.431 -1.270 -1.613 + -1.592 -1.491 -1.542 -1.503 -1.510 -1.596 -1.366 -1.659 -1.626 -1.558 + -1.702 -1.534 -1.684 -1.878 -1.771 -1.626 -1.968 -2.167 -1.849 -1.915 + -1.347 -0.962 -1.422 -1.497 -1.031 -1.407 -1.457 -1.064 -1.181 -1.259 + -1.350 -1.202 -1.428 -1.256 -0.846 -1.307 -1.360 -1.411 -1.356 -1.090 + -1.085 -1.136 -1.111 -1.487 -1.342 -1.139 -1.724 -1.026 -1.233 -1.058 + -1.437 -1.172 -1.549 -0.940 -1.291 -1.102 -1.267 -0.936 -0.998 -1.722 + -1.096 -0.945 -1.364 -1.603 -1.226 -1.885 -1.201 -0.842 -0.931 -0.870 + -1.015 -1.485 -1.266 -1.101 -1.312 -1.294 -1.415 -0.933 -1.145 -1.487 + + 375 iasi_metop-a 1913 0.441443E-02 + -1.354 -1.134 -1.606 -1.469 -1.226 -1.446 -1.513 -1.240 -1.136 -1.442 + -1.477 -1.318 -1.292 -1.329 -1.347 -1.414 -1.143 -1.424 -1.465 -1.346 + -1.568 -1.355 -1.460 -1.653 -1.559 -1.441 -1.735 -1.991 -1.649 -1.702 + -1.191 -0.804 -1.247 -1.299 -0.865 -1.358 -1.340 -0.936 -1.091 -1.182 + -1.096 -0.908 -1.237 -1.119 -0.725 -1.185 -1.278 -1.230 -1.168 -0.914 + -0.918 -1.019 -0.940 -1.347 -1.210 -1.065 -1.517 -0.893 -1.120 -0.912 + -1.120 -0.914 -1.403 -0.751 -1.104 -0.882 -1.130 -0.832 -0.979 -1.607 + -0.889 -0.850 -1.182 -1.446 -1.054 -1.792 -1.028 -0.622 -0.749 -0.754 + -0.740 -1.361 -1.098 -0.979 -1.091 -1.167 -1.252 -0.747 -0.948 -1.251 + + 376 iasi_metop-a 1946 0.290590E-02 + -1.114 -0.889 -1.323 -1.184 -1.000 -1.219 -1.324 -1.031 -0.878 -1.156 + -1.233 -1.019 -1.121 -1.052 -1.147 -1.138 -0.927 -1.216 -1.207 -1.108 + -1.300 -1.109 -1.192 -1.374 -1.319 -1.209 -1.439 -1.632 -1.359 -1.395 + -1.048 -0.493 -1.033 -1.174 -0.667 -0.980 -1.096 -0.802 -1.003 -0.836 + -0.964 -0.791 -0.963 -0.889 -0.548 -0.971 -1.096 -1.122 -0.963 -0.770 + -0.808 -0.779 -0.912 -1.183 -0.984 -0.824 -1.327 -0.726 -0.870 -0.904 + -1.007 -0.678 -1.212 -0.543 -1.007 -0.900 -0.949 -0.610 -0.821 -1.328 + -0.676 -0.610 -1.033 -1.350 -0.913 -1.604 -0.850 -0.377 -0.507 -0.720 + -0.775 -1.118 -0.993 -0.885 -0.845 -0.982 -1.044 -0.581 -0.754 -1.147 + + 377 iasi_metop-a 1947 0.351741E-02 + -1.131 -0.877 -1.259 -1.088 -0.885 -1.093 -1.202 -0.839 -0.766 -1.073 + -1.078 -0.949 -0.994 -0.952 -0.958 -1.019 -0.793 -1.135 -1.028 -0.931 + -1.113 -0.956 -0.959 -1.229 -1.088 -1.032 -1.172 -1.404 -1.140 -1.137 + -1.047 -0.502 -0.947 -1.143 -0.588 -0.979 -1.101 -0.799 -0.890 -0.830 + -0.945 -0.814 -1.052 -0.797 -0.533 -0.933 -1.185 -1.060 -0.980 -0.733 + -0.773 -0.807 -0.910 -1.198 -0.996 -0.867 -1.373 -0.792 -0.884 -0.763 + -1.001 -0.638 -1.241 -0.569 -0.966 -0.955 -0.910 -0.621 -0.759 -1.336 + -0.682 -0.513 -1.032 -1.368 -0.905 -1.601 -0.821 -0.230 -0.537 -0.749 + -0.744 -1.116 -1.008 -0.757 -0.853 -1.003 -1.050 -0.577 -0.760 -1.157 + + 378 iasi_metop-a 1991 0.481867E-02 + -1.083 -1.007 -1.260 -1.124 -0.899 -1.201 -1.235 -0.891 -0.801 -1.145 + -1.129 -0.973 -1.006 -1.005 -0.996 -1.035 -0.825 -1.167 -1.053 -0.917 + -1.140 -0.946 -0.968 -1.211 -1.096 -1.021 -1.219 -1.425 -1.175 -1.158 + -0.968 -0.561 -1.052 -1.172 -0.662 -1.152 -1.202 -0.796 -1.054 -0.885 + -1.024 -0.825 -1.080 -0.963 -0.575 -1.232 -1.125 -1.095 -1.007 -0.842 + -0.813 -0.854 -0.807 -1.193 -1.059 -0.835 -1.289 -0.841 -0.837 -0.807 + -1.027 -0.832 -1.164 -0.631 -0.965 -0.665 -0.998 -0.640 -0.832 -1.328 + -0.728 -0.605 -1.039 -1.286 -1.008 -1.579 -0.799 -0.343 -0.597 -0.608 + -0.746 -1.182 -0.970 -0.828 -0.951 -1.009 -1.058 -0.569 -0.804 -1.108 + + 379 iasi_metop-a 2019 0.309099E-01 + -0.860 -0.797 -0.987 -0.945 -0.674 -0.863 -0.919 -0.835 -0.722 -0.994 + -1.097 -0.915 -0.917 -0.865 -0.823 -0.974 -0.902 -0.879 -1.015 -0.897 + -0.987 -0.950 -0.892 -1.075 -0.999 -1.044 -1.236 -1.360 -1.074 -1.097 + -1.021 -0.750 -0.923 -0.948 -0.796 -1.069 -0.897 -1.036 -0.851 -0.695 + -0.890 -1.047 -1.207 -0.587 -0.782 -0.639 -0.956 -1.118 -1.027 -0.757 + -0.900 -0.972 -1.082 -1.132 -1.021 -0.566 -1.178 -0.861 -0.950 -0.923 + -0.844 -0.859 -1.090 -0.533 -0.733 -0.955 -0.856 -0.947 -0.841 -1.349 + -0.490 -0.850 -0.837 -1.079 -0.877 -1.385 -0.753 -0.790 -0.587 -0.804 + -0.970 -0.804 -1.124 -0.753 -0.917 -0.509 -0.712 -0.433 -0.822 -1.027 + + 380 iasi_metop-a 2094 0.504216E-02 + -1.215 -1.056 -1.465 -1.325 -0.870 -1.035 -1.181 -0.975 -0.796 -1.071 + -1.088 -1.039 -0.944 -1.157 -1.194 -0.823 -0.806 -0.991 -1.073 -0.819 + -0.950 -0.903 -0.943 -0.996 -0.959 -0.951 -1.203 -1.169 -0.893 -0.931 + -1.271 -0.804 -1.221 -1.289 -0.872 -1.232 -1.221 -0.922 -1.216 -1.019 + -1.120 -0.993 -1.218 -1.030 -0.748 -1.134 -1.229 -1.090 -1.093 -0.920 + -0.954 -0.923 -1.035 -1.346 -1.142 -1.092 -1.480 -1.048 -1.044 -0.988 + -1.023 -0.891 -1.320 -0.737 -1.078 -0.922 -1.134 -0.902 -0.935 -1.494 + -0.870 -0.784 -1.143 -1.699 -1.093 -1.702 -0.922 -0.543 -0.669 -0.818 + -0.784 -1.255 -1.118 -0.864 -1.138 -1.166 -1.179 -0.723 -0.916 -1.296 + + 381 iasi_metop-a 2119 0.566350E-01 + -0.373 -0.662 -0.565 -0.491 -0.385 -0.590 -0.569 -0.459 -0.447 -0.896 + -0.757 -0.645 -0.704 -0.569 -0.744 -0.796 -0.585 -0.829 -0.761 -0.947 + -1.052 -0.852 -0.794 -0.977 -0.987 -0.983 -1.308 -1.449 -1.222 -1.109 + -0.400 -0.539 -0.682 -0.522 -0.386 -0.336 -0.679 -0.682 -0.467 -0.466 + -0.359 -0.573 -0.616 -0.305 -0.477 -0.285 -0.385 -0.702 -0.622 -0.513 + -0.488 -0.332 -0.748 -0.582 -0.474 -0.232 -0.713 -0.463 -0.380 -0.522 + -0.508 -0.468 -0.705 -0.350 -0.315 -0.719 -0.490 -0.743 -0.473 -0.866 + -0.463 -0.458 -0.617 -0.515 -0.535 -0.672 -0.394 -0.653 -0.445 -0.445 + -0.440 -0.574 -0.442 -0.669 -0.425 -0.582 -0.417 -0.153 -0.647 -0.764 + + 382 iasi_metop-a 2213 0.425889E-01 + -0.408 -0.416 -0.613 -0.610 -0.243 -0.343 -0.424 -0.397 -0.288 -0.641 + -0.715 -0.567 -0.379 -0.437 -0.514 -0.325 -0.410 -0.477 -0.344 -0.275 + -0.499 -0.470 -0.408 -0.394 -0.411 -0.284 -0.502 -0.501 -0.361 -0.369 + -0.746 -0.643 -0.551 -0.723 -0.676 -0.784 -0.511 -0.762 -0.723 -0.579 + -0.476 -0.796 -0.967 -0.412 -0.471 -0.575 -0.588 -0.833 -0.851 -0.554 + -0.763 -0.649 -0.781 -0.856 -0.705 -0.404 -0.907 -0.618 -0.738 -0.647 + -0.717 -0.537 -0.883 -0.491 -0.421 -0.818 -0.646 -0.915 -0.512 -1.202 + -0.478 -0.664 -0.733 -0.734 -0.859 -0.874 -0.531 -0.629 -0.468 -0.760 + -0.744 -0.649 -0.777 -0.879 -0.649 -0.485 -0.530 -0.193 -0.679 -0.822 + + 383 iasi_metop-a 2239 0.593993E-02 + -0.926 -0.640 -1.048 -1.036 -0.552 -0.745 -0.789 -0.749 -0.550 -0.784 + -0.812 -0.712 -0.717 -0.812 -0.838 -0.550 -0.579 -0.762 -0.624 -0.506 + -0.764 -0.713 -0.612 -0.736 -0.692 -0.503 -0.732 -0.763 -0.650 -0.620 + -1.037 -0.606 -1.067 -1.103 -0.602 -1.040 -1.179 -0.768 -1.052 -0.877 + -0.919 -0.871 -1.044 -0.921 -0.456 -1.073 -1.086 -1.006 -1.039 -0.767 + -0.718 -0.856 -0.824 -1.167 -1.005 -0.775 -1.324 -0.794 -0.926 -0.797 + -1.052 -0.754 -1.227 -0.585 -0.828 -0.709 -1.069 -0.644 -0.903 -1.326 + -0.750 -0.609 -0.969 -1.401 -0.955 -1.615 -0.676 -0.398 -0.505 -0.663 + -0.673 -1.140 -0.963 -0.717 -0.885 -0.954 -1.012 -0.641 -0.747 -1.047 + + 384 iasi_metop-a 2271 0.444350E-01 + -0.610 -0.671 -0.729 -0.698 -0.501 -0.724 -0.616 -0.576 -0.563 -0.905 + -0.831 -0.730 -0.814 -0.662 -0.788 -0.765 -0.760 -0.783 -0.770 -0.887 + -0.890 -0.859 -0.800 -0.926 -0.881 -0.985 -1.258 -1.356 -1.038 -1.016 + -0.797 -0.791 -0.672 -0.767 -0.763 -0.825 -0.574 -0.814 -0.820 -0.655 + -0.598 -0.837 -0.946 -0.460 -0.638 -0.635 -0.695 -0.954 -0.875 -0.709 + -0.810 -0.755 -0.848 -0.888 -0.705 -0.508 -1.058 -0.730 -0.752 -0.730 + -0.818 -0.653 -0.908 -0.628 -0.635 -0.918 -0.607 -0.964 -0.642 -1.201 + -0.583 -0.745 -0.822 -0.844 -0.860 -0.936 -0.657 -0.729 -0.512 -0.930 + -0.908 -0.713 -0.808 -0.867 -0.741 -0.553 -0.554 -0.316 -0.747 -0.872 + + 385 iasi_metop-a 2289 0.101367E-01 + -0.866 -0.639 -1.071 -0.921 -0.526 -0.797 -0.882 -0.752 -0.606 -0.835 + -1.000 -0.783 -0.710 -0.834 -0.829 -0.702 -0.610 -0.814 -0.711 -0.597 + -0.793 -0.731 -0.710 -0.828 -0.729 -0.610 -0.816 -0.850 -0.657 -0.663 + -0.979 -0.617 -1.021 -1.134 -0.692 -1.200 -1.107 -0.814 -0.909 -0.771 + -1.005 -0.974 -0.939 -0.947 -0.484 -1.088 -1.091 -1.192 -0.944 -0.754 + -0.741 -0.888 -0.835 -1.110 -1.011 -0.845 -1.324 -0.897 -0.843 -0.859 + -0.930 -0.814 -1.283 -0.485 -0.991 -0.796 -0.933 -0.749 -0.906 -1.314 + -0.712 -0.782 -0.980 -1.333 -0.946 -1.529 -0.686 -0.506 -0.481 -0.669 + -0.628 -1.146 -1.009 -0.728 -1.045 -0.879 -1.037 -0.579 -0.619 -1.103 + + 386 iasi_metop-a 2321 0.582987E-01 + -0.345 -0.652 -0.571 -0.522 -0.375 -0.592 -0.553 -0.479 -0.334 -0.770 + -0.645 -0.599 -0.655 -0.471 -0.652 -0.594 -0.534 -0.665 -0.635 -0.811 + -0.748 -0.714 -0.650 -0.737 -0.790 -0.758 -1.010 -1.138 -0.905 -0.828 + -0.429 -0.581 -0.703 -0.534 -0.354 -0.405 -0.748 -0.655 -0.498 -0.550 + -0.420 -0.584 -0.664 -0.410 -0.564 -0.302 -0.383 -0.706 -0.726 -0.459 + -0.496 -0.327 -0.769 -0.520 -0.452 -0.276 -0.787 -0.473 -0.364 -0.596 + -0.548 -0.450 -0.704 -0.455 -0.359 -0.724 -0.580 -0.835 -0.492 -0.850 + -0.573 -0.489 -0.670 -0.456 -0.568 -0.706 -0.477 -0.578 -0.487 -0.447 + -0.580 -0.601 -0.433 -0.704 -0.455 -0.515 -0.418 -0.274 -0.686 -0.718 + + 387 iasi_metop-a 2333 0.893918E-02 + -0.756 -0.565 -0.927 -0.903 -0.418 -0.678 -0.773 -0.515 -0.509 -0.792 + -0.903 -0.654 -0.554 -0.620 -0.703 -0.418 -0.457 -0.718 -0.553 -0.306 + -0.646 -0.548 -0.516 -0.506 -0.528 -0.329 -0.596 -0.572 -0.473 -0.490 + -0.975 -0.617 -1.078 -1.086 -0.707 -1.132 -1.054 -0.777 -0.976 -0.831 + -0.944 -0.914 -0.882 -0.911 -0.413 -1.136 -1.087 -1.049 -0.898 -0.698 + -0.687 -0.845 -0.754 -1.127 -0.979 -0.873 -1.296 -0.908 -0.796 -0.771 + -0.905 -0.753 -1.213 -0.537 -0.952 -0.621 -0.966 -0.767 -0.800 -1.314 + -0.647 -0.741 -0.947 -1.380 -0.996 -1.534 -0.663 -0.437 -0.501 -0.538 + -0.611 -1.060 -1.016 -0.603 -1.064 -0.815 -0.947 -0.580 -0.646 -1.097 + + 388 iasi_metop-a 2346 0.698433E-02 + -1.031 -0.891 -1.166 -1.061 -0.850 -0.995 -1.096 -0.850 -0.825 -1.088 + -1.161 -0.811 -0.994 -0.976 -1.034 -0.997 -0.729 -0.964 -0.995 -0.911 + -1.053 -0.881 -0.965 -1.113 -1.010 -0.900 -1.185 -1.389 -1.088 -1.083 + -1.048 -0.605 -1.063 -1.078 -0.651 -1.008 -1.110 -0.825 -0.884 -0.858 + -0.928 -0.805 -0.867 -0.842 -0.482 -1.156 -1.103 -0.939 -1.000 -0.736 + -0.768 -0.837 -0.845 -1.129 -1.056 -0.806 -1.405 -0.823 -0.858 -0.635 + -0.864 -0.724 -1.187 -0.596 -0.861 -0.619 -1.071 -0.699 -0.831 -1.290 + -0.684 -0.543 -0.991 -1.324 -0.952 -1.522 -0.637 -0.390 -0.542 -0.564 + -0.754 -1.030 -0.981 -0.595 -1.007 -0.861 -0.924 -0.567 -0.790 -1.090 + + 389 iasi_metop-a 2349 0.725666E-02 + -1.018 -0.885 -1.187 -1.105 -0.883 -1.062 -1.105 -0.901 -0.864 -1.120 + -1.152 -0.908 -1.019 -0.995 -1.024 -1.053 -0.753 -0.958 -0.983 -0.963 + -1.095 -0.895 -0.998 -1.129 -1.019 -0.965 -1.207 -1.410 -1.090 -1.090 + -1.044 -0.611 -1.070 -1.066 -0.644 -1.003 -1.035 -0.830 -0.946 -0.864 + -0.934 -0.802 -0.920 -0.840 -0.486 -1.152 -1.170 -0.940 -1.047 -0.729 + -0.758 -0.838 -0.845 -1.026 -1.097 -0.780 -1.412 -0.817 -0.854 -0.644 + -0.848 -0.723 -1.191 -0.604 -0.907 -0.606 -1.059 -0.689 -0.819 -1.283 + -0.684 -0.537 -0.990 -1.309 -0.935 -1.595 -0.628 -0.384 -0.529 -0.564 + -0.751 -1.029 -0.968 -0.637 -0.993 -0.872 -0.909 -0.598 -0.757 -1.075 + + 390 iasi_metop-a 2352 0.107955E-01 + -0.851 -0.686 -1.205 -0.867 -0.799 -0.960 -0.971 -0.804 -0.822 -1.044 + -1.073 -0.814 -0.979 -0.870 -0.889 -0.972 -0.667 -0.900 -0.973 -0.878 + -1.006 -0.807 -0.951 -1.102 -0.979 -0.953 -1.169 -1.379 -1.051 -1.062 + -0.805 -0.467 -0.853 -0.876 -0.457 -0.990 -0.904 -0.651 -0.861 -0.647 + -0.897 -0.874 -0.788 -0.717 -0.349 -1.002 -0.935 -0.947 -0.752 -0.556 + -0.560 -0.684 -0.751 -0.814 -0.995 -0.676 -1.289 -0.770 -0.657 -0.611 + -0.774 -0.601 -1.095 -0.349 -0.788 -0.497 -0.849 -0.755 -0.748 -1.195 + -0.614 -0.518 -0.852 -1.111 -0.776 -1.400 -0.582 -0.301 -0.338 -0.445 + -0.617 -0.947 -0.925 -0.561 -0.881 -0.708 -0.809 -0.551 -0.516 -0.857 + + 391 iasi_metop-a 2359 0.734176E-02 + -0.999 -0.834 -1.150 -1.079 -0.811 -0.965 -1.038 -0.755 -0.751 -1.025 + -1.049 -0.776 -0.952 -0.943 -0.937 -0.910 -0.604 -0.888 -0.924 -0.864 + -1.003 -0.787 -0.917 -1.006 -0.890 -0.772 -1.012 -1.290 -0.968 -0.954 + -1.043 -0.632 -1.149 -1.087 -0.648 -0.969 -1.113 -0.826 -0.993 -0.923 + -0.973 -0.894 -0.917 -0.846 -0.498 -1.202 -1.165 -0.932 -1.023 -0.732 + -0.737 -0.843 -0.842 -1.111 -1.158 -0.747 -1.403 -0.817 -0.934 -0.684 + -0.885 -0.726 -1.232 -0.590 -0.894 -0.596 -1.022 -0.704 -0.734 -1.298 + -0.773 -0.571 -1.022 -1.270 -0.888 -1.572 -0.609 -0.424 -0.564 -0.566 + -0.706 -1.010 -1.039 -0.671 -0.952 -0.898 -0.923 -0.748 -0.760 -1.054 + + 392 iasi_metop-a 2367 0.253435E-01 + -0.798 -0.723 -1.139 -0.966 -0.800 -0.858 -0.956 -0.993 -0.794 -0.927 + -0.986 -0.914 -1.025 -0.887 -0.857 -1.026 -0.752 -0.883 -0.982 -0.949 + -0.979 -0.885 -0.935 -1.136 -1.031 -1.020 -1.163 -1.425 -1.005 -1.036 + -0.748 -0.852 -0.994 -0.861 -0.527 -1.115 -0.905 -0.741 -0.728 -0.738 + -0.958 -1.037 -0.896 -0.665 -0.608 -1.003 -1.095 -0.997 -0.849 -0.606 + -0.599 -0.888 -1.158 -0.982 -0.996 -0.763 -1.185 -0.886 -0.930 -0.718 + -0.826 -0.714 -1.085 -0.505 -0.657 -0.778 -0.687 -1.030 -0.797 -1.317 + -0.522 -0.732 -0.810 -1.167 -0.955 -1.188 -0.684 -0.590 -0.373 -0.858 + -0.873 -1.022 -1.055 -0.730 -0.842 -0.706 -0.796 -0.543 -0.501 -0.895 + + 393 iasi_metop-a 2374 0.161332E-01 + -1.245 -0.994 -1.356 -1.231 -0.860 -1.126 -1.164 -0.958 -0.930 -1.125 + -1.142 -0.986 -0.944 -1.033 -1.225 -1.030 -0.804 -1.018 -1.091 -0.816 + -0.983 -0.835 -0.927 -1.016 -0.990 -0.949 -1.148 -1.205 -0.959 -1.100 + -1.258 -1.136 -1.277 -1.282 -0.869 -1.421 -1.227 -1.020 -1.221 -1.196 + -1.226 -1.074 -1.208 -1.057 -0.695 -1.321 -1.251 -1.308 -1.109 -0.809 + -0.846 -1.185 -1.142 -1.353 -1.333 -1.035 -1.607 -1.173 -1.116 -0.946 + -1.047 -0.919 -1.430 -0.635 -1.020 -0.903 -0.928 -1.045 -0.964 -1.454 + -0.793 -0.967 -1.114 -1.346 -1.129 -1.716 -0.981 -0.688 -0.673 -0.788 + -0.997 -1.308 -1.240 -0.963 -1.208 -1.141 -1.113 -0.842 -0.825 -1.111 + + 394 iasi_metop-a 2398 0.601865E-01 + -0.277 -0.567 -0.499 -0.429 -0.306 -0.525 -0.493 -0.482 -0.342 -0.751 + -0.636 -0.665 -0.686 -0.526 -0.706 -0.688 -0.581 -0.710 -0.710 -0.856 + -0.815 -0.839 -0.762 -0.757 -0.911 -0.919 -1.194 -1.275 -1.033 -1.006 + -0.270 -0.359 -0.471 -0.314 -0.147 -0.143 -0.533 -0.489 -0.309 -0.314 + -0.191 -0.298 -0.376 -0.225 -0.322 -0.080 -0.110 -0.491 -0.505 -0.216 + -0.266 -0.058 -0.538 -0.289 -0.233 -0.006 -0.575 -0.295 -0.095 -0.388 + -0.328 -0.175 -0.440 -0.207 -0.134 -0.475 -0.382 -0.615 -0.207 -0.618 + -0.323 -0.285 -0.499 -0.183 -0.289 -0.460 -0.283 -0.469 -0.224 -0.228 + -0.392 -0.311 -0.209 -0.491 -0.253 -0.400 -0.199 -0.067 -0.519 -0.584 + + 395 iasi_metop-a 2426 0.287422E-01 + -0.425 -0.388 -0.672 -0.666 -0.238 -0.369 -0.535 -0.419 -0.294 -0.541 + -0.716 -0.535 -0.378 -0.418 -0.477 -0.309 -0.278 -0.431 -0.386 -0.193 + -0.471 -0.389 -0.319 -0.324 -0.322 -0.181 -0.442 -0.412 -0.232 -0.288 + -0.654 -0.686 -0.809 -0.705 -0.589 -0.838 -0.636 -0.891 -0.515 -0.659 + -0.687 -0.899 -1.055 -0.381 -0.623 -0.750 -0.876 -1.050 -0.695 -0.464 + -0.556 -0.783 -0.946 -0.960 -0.980 -0.398 -0.986 -0.726 -0.888 -0.735 + -0.592 -0.609 -0.877 -0.261 -0.338 -0.563 -0.521 -0.827 -0.555 -1.197 + -0.208 -0.440 -0.608 -0.830 -0.678 -0.944 -0.518 -0.517 -0.302 -0.793 + -0.727 -0.610 -0.819 -0.583 -0.565 -0.369 -0.490 -0.281 -0.470 -0.721 + + 396 iasi_metop-a 2562 0.272923E-01 + -1.206 -1.056 -1.421 -1.313 -0.826 -0.966 -1.094 -1.136 -0.765 -0.986 + -1.109 -1.032 -0.935 -1.057 -1.116 -0.888 -0.785 -1.047 -1.046 -0.792 + -0.820 -0.902 -0.915 -0.952 -0.868 -0.866 -1.119 -1.118 -0.776 -0.868 + -1.106 -1.333 -1.422 -1.361 -1.084 -1.391 -1.313 -1.376 -1.246 -1.225 + -1.329 -1.459 -1.431 -1.003 -1.198 -1.463 -1.423 -1.574 -1.337 -1.109 + -1.124 -1.307 -1.622 -1.334 -1.424 -0.949 -1.748 -1.255 -1.291 -1.255 + -1.082 -1.278 -1.528 -0.928 -1.082 -1.192 -1.018 -1.229 -1.211 -1.663 + -0.896 -0.992 -1.346 -1.393 -1.208 -1.436 -1.014 -1.115 -0.812 -1.305 + -1.325 -1.281 -1.337 -1.136 -1.240 -0.993 -1.035 -0.769 -1.185 -1.346 + + 397 iasi_metop-a 2701 0.772412E-01 + -0.803 -0.847 -0.821 -0.872 -0.766 -0.889 -0.871 -0.864 -0.764 -1.004 + -1.046 -0.976 -1.061 -0.962 -1.232 -1.045 -0.860 -1.106 -1.197 -1.166 + -1.278 -1.201 -1.252 -1.271 -1.257 -1.255 -1.633 -1.652 -1.373 -1.426 + -0.635 -0.886 -0.963 -0.755 -0.657 -0.584 -0.784 -1.122 -0.628 -0.913 + -0.725 -1.173 -0.877 -0.713 -0.708 -0.540 -0.608 -0.938 -0.781 -0.807 + -0.893 -0.525 -1.018 -0.706 -0.935 -0.469 -0.865 -0.797 -0.478 -1.043 + -0.717 -0.679 -0.694 -0.664 -0.611 -0.869 -0.825 -1.066 -0.759 -0.986 + -1.048 -0.815 -0.987 -0.767 -0.748 -0.971 -0.618 -0.890 -1.006 -0.539 + -0.719 -0.828 -0.681 -1.001 -0.715 -0.918 -0.540 -0.610 -0.938 -0.877 + + 398 iasi_metop-a 2741 0.570449E-01 + -0.479 -0.537 -0.569 -0.604 -0.359 -0.560 -0.625 -0.495 -0.427 -0.805 + -0.742 -0.740 -0.477 -0.394 -0.662 -0.389 -0.484 -0.699 -0.601 -0.512 + -0.742 -0.575 -0.538 -0.587 -0.597 -0.510 -0.755 -0.677 -0.559 -0.643 + -0.425 -0.521 -0.680 -0.547 -0.397 -0.357 -0.644 -0.642 -0.550 -0.459 + -0.385 -0.575 -0.662 -0.324 -0.513 -0.259 -0.390 -0.699 -0.703 -0.490 + -0.466 -0.262 -0.648 -0.474 -0.396 -0.217 -0.769 -0.567 -0.383 -0.503 + -0.506 -0.265 -0.717 -0.420 -0.293 -0.764 -0.510 -0.762 -0.433 -0.796 + -0.503 -0.441 -0.608 -0.457 -0.508 -0.627 -0.501 -0.689 -0.559 -0.373 + -0.497 -0.646 -0.453 -0.745 -0.448 -0.585 -0.452 -0.261 -0.744 -0.724 + + 399 iasi_metop-a 2745 0.285773E-01 + -0.569 -0.569 -0.672 -0.711 -0.366 -0.416 -0.616 -0.524 -0.409 -0.677 + -0.863 -0.660 -0.539 -0.544 -0.620 -0.487 -0.492 -0.659 -0.537 -0.351 + -0.642 -0.543 -0.516 -0.530 -0.522 -0.375 -0.599 -0.636 -0.475 -0.480 + -0.558 -0.764 -0.804 -0.738 -0.560 -0.906 -0.785 -0.942 -0.713 -0.657 + -0.693 -0.909 -0.905 -0.307 -0.738 -0.946 -0.932 -1.026 -0.732 -0.635 + -0.712 -0.811 -0.913 -1.009 -0.986 -0.331 -1.158 -0.613 -0.757 -0.795 + -0.594 -0.704 -1.086 -0.512 -0.558 -0.750 -0.532 -0.782 -0.657 -1.207 + -0.491 -0.565 -0.794 -0.747 -0.677 -1.000 -0.515 -0.569 -0.427 -0.779 + -0.807 -0.627 -0.837 -0.527 -0.834 -0.454 -0.532 -0.280 -0.653 -0.868 + + 400 iasi_metop-a 2760 0.361165E-01 + -0.397 -0.467 -0.418 -0.542 -0.309 -0.369 -0.388 -0.425 -0.279 -0.471 + -0.648 -0.572 -0.433 -0.495 -0.659 -0.482 -0.447 -0.528 -0.639 -0.512 + -0.615 -0.603 -0.595 -0.528 -0.659 -0.675 -0.951 -0.959 -0.591 -0.701 + -0.456 -0.278 -0.355 -0.377 -0.309 -0.342 -0.119 -0.332 -0.461 -0.250 + -0.083 -0.396 -0.533 0.179 -0.138 -0.343 -0.365 -0.491 -0.400 -0.336 + -0.551 -0.347 -0.362 -0.547 -0.282 0.108 -0.787 -0.269 -0.364 -0.307 + -0.335 -0.190 -0.546 -0.197 -0.120 -0.497 -0.219 -0.477 -0.183 -0.724 + -0.075 -0.330 -0.372 -0.237 -0.384 -0.445 -0.117 -0.377 -0.063 -0.439 + -0.420 -0.108 -0.397 -0.436 -0.391 -0.069 -0.275 0.153 -0.383 -0.486 + + 401 iasi_metop-a 2819 0.768197E-01 + -0.065 -0.129 -0.202 -0.175 -0.060 -0.144 -0.125 -0.188 -0.050 -0.270 + -0.386 -0.314 -0.209 -0.281 -0.404 -0.123 -0.237 -0.396 -0.263 -0.300 + -0.415 -0.447 -0.351 -0.438 -0.329 -0.367 -0.537 -0.591 -0.348 -0.380 + -0.233 -0.374 -0.525 -0.310 -0.196 -0.072 -0.257 -0.684 -0.249 -0.368 + -0.128 -0.784 -0.428 -0.254 -0.193 -0.069 -0.197 -0.454 -0.443 -0.256 + -0.464 -0.189 -0.531 -0.224 -0.451 -0.050 -0.424 -0.318 0.107 -0.485 + -0.248 -0.247 -0.213 -0.179 -0.100 -0.460 -0.341 -0.574 -0.334 -0.465 + -0.597 -0.214 -0.555 -0.285 -0.295 -0.470 -0.133 -0.452 -0.603 -0.139 + -0.209 -0.194 -0.188 -0.468 -0.254 -0.363 -0.035 -0.074 -0.451 -0.300 + + 402 iasi_metop-a 2889 0.442835E-01 + -0.254 -0.286 -0.368 -0.380 -0.187 -0.276 -0.206 -0.180 -0.150 -0.499 + -0.386 -0.424 -0.194 -0.085 -0.350 -0.007 -0.106 -0.251 -0.159 -0.083 + -0.234 -0.163 -0.040 -0.011 -0.079 -0.001 -0.157 -0.095 -0.005 -0.099 + -0.556 -0.495 -0.534 -0.645 -0.462 -0.462 -0.680 -0.534 -0.644 -0.378 + -0.514 -0.615 -0.760 -0.124 -0.566 -0.313 -0.439 -0.686 -0.736 -0.462 + -0.641 -0.454 -0.542 -0.545 -0.352 -0.291 -0.784 -0.411 -0.356 -0.592 + -0.598 -0.354 -0.650 -0.414 -0.228 -0.730 -0.513 -0.777 -0.433 -0.888 + -0.543 -0.466 -0.612 -0.494 -0.569 -0.753 -0.540 -0.630 -0.408 -0.614 + -0.561 -0.646 -0.473 -0.694 -0.535 -0.518 -0.485 -0.089 -0.767 -0.736 + + 403 iasi_metop-a 2907 0.531285E-01 + 0.096 -0.160 -0.055 -0.036 0.076 -0.096 -0.153 -0.071 -0.043 -0.379 + -0.291 -0.278 -0.149 -0.197 -0.366 -0.207 -0.219 -0.321 -0.149 -0.173 + -0.382 -0.463 -0.262 -0.263 -0.297 -0.202 -0.435 -0.404 -0.285 -0.317 + -0.078 0.109 -0.154 -0.095 0.211 0.112 -0.146 -0.092 -0.116 0.023 + 0.111 -0.050 -0.325 0.136 -0.008 0.376 0.118 -0.222 -0.199 0.056 + 0.044 0.087 -0.095 -0.012 0.166 0.398 -0.269 0.098 0.307 -0.295 + -0.057 0.309 -0.175 0.136 0.295 -0.168 0.246 -0.273 0.116 -0.250 + -0.083 0.147 0.008 -0.014 0.123 -0.104 -0.080 -0.271 -0.036 0.090 + 0.034 -0.226 0.077 -0.143 -0.010 0.020 0.090 0.342 -0.226 -0.101 + + 404 iasi_metop-a 2910 0.711847E-01 + 0.159 -0.048 -0.035 0.049 0.355 0.030 0.082 0.203 0.150 -0.134 + -0.247 -0.121 0.050 0.107 -0.118 0.104 0.144 -0.010 0.158 0.116 + -0.096 -0.056 0.131 0.153 0.118 0.319 0.094 0.140 0.168 0.174 + -0.100 -0.282 -0.521 -0.252 -0.081 0.031 -0.279 -0.357 -0.176 -0.210 + -0.184 -0.548 -0.280 -0.153 -0.063 0.021 0.036 -0.422 -0.318 -0.199 + -0.408 -0.055 -0.393 -0.148 -0.435 0.016 -0.507 -0.277 0.141 -0.337 + -0.185 0.029 -0.188 -0.116 -0.019 -0.357 -0.270 -0.469 -0.071 -0.387 + -0.378 -0.130 -0.350 -0.066 -0.075 -0.396 -0.090 -0.298 -0.454 -0.062 + -0.193 -0.260 -0.070 -0.366 -0.245 -0.220 0.060 -0.076 -0.296 -0.183 + + 405 iasi_metop-a 2919 0.840030E-01 + -0.282 -0.058 -0.316 -0.337 -0.102 -0.125 -0.339 -0.007 -0.079 -0.323 + -0.281 -0.400 -0.184 0.001 -0.249 -0.027 -0.009 -0.329 -0.046 -0.054 + -0.241 -0.128 -0.032 -0.040 -0.054 0.037 -0.100 0.041 0.014 -0.024 + -0.472 -0.783 -0.819 -0.429 -0.673 -0.530 -0.426 -0.849 -0.611 -0.648 + -0.507 -0.991 -0.579 -0.442 -0.568 -0.169 -0.481 -0.725 -0.763 -0.452 + -0.548 -0.295 -0.748 -0.600 -0.615 -0.503 -0.561 -0.548 -0.325 -0.822 + -0.537 -0.422 -0.412 -0.516 -0.383 -0.661 -0.575 -0.945 -0.490 -0.823 + -1.036 -0.507 -0.817 -0.472 -0.693 -0.725 -0.259 -0.663 -0.795 -0.256 + -0.450 -0.513 -0.456 -0.843 -0.297 -0.572 -0.212 -0.574 -0.681 -0.567 + + 406 iasi_metop-a 2921 0.787749E-01 + -0.250 -0.227 -0.252 -0.289 -0.350 -0.290 -0.297 -0.194 -0.189 -0.451 + -0.378 -0.445 -0.406 -0.151 -0.363 -0.199 -0.260 -0.610 -0.388 -0.221 + -0.355 -0.308 -0.264 -0.273 -0.271 -0.277 -0.326 -0.228 -0.188 -0.385 + -0.321 -0.506 -0.566 -0.174 -0.419 -0.276 -0.234 -0.709 -0.566 -0.490 + -0.461 -0.397 -0.494 -0.519 -0.559 -0.298 -0.433 -0.335 -0.596 -0.414 + -0.407 -0.321 -0.501 -0.520 -0.590 -0.299 -0.302 -0.565 -0.195 -0.717 + -0.417 -0.510 -0.276 -0.557 -0.289 -0.652 -0.447 -0.647 -0.512 -0.552 + -0.775 -0.402 -0.463 -0.321 -0.320 -0.556 -0.452 -0.384 -0.496 -0.306 + -0.304 -0.499 -0.244 -0.598 -0.175 -0.484 -0.142 -0.450 -0.640 -0.289 + + 407 iasi_metop-a 2939 0.724055E-01 + -0.277 -0.511 -0.533 -0.401 -0.284 -0.448 -0.293 -0.379 -0.208 -0.497 + -0.460 -0.388 -0.201 -0.204 -0.354 -0.131 -0.232 -0.386 -0.385 -0.276 + -0.306 -0.286 -0.181 -0.289 -0.181 -0.190 -0.205 -0.181 -0.094 -0.178 + -0.500 -0.601 -0.898 -0.512 -0.438 -0.398 -0.651 -0.815 -0.640 -0.626 + -0.538 -0.851 -0.672 -0.608 -0.497 -0.418 -0.431 -0.817 -0.781 -0.529 + -0.650 -0.432 -0.725 -0.530 -0.761 -0.299 -0.780 -0.629 -0.189 -0.640 + -0.473 -0.467 -0.609 -0.481 -0.346 -0.695 -0.672 -0.844 -0.526 -0.767 + -0.716 -0.562 -0.732 -0.466 -0.492 -0.731 -0.411 -0.667 -0.787 -0.422 + -0.499 -0.546 -0.491 -0.781 -0.539 -0.612 -0.361 -0.498 -0.723 -0.594 + + 408 iasi_metop-a 2944 0.459664E-01 + -0.205 -0.288 -0.250 -0.274 -0.087 -0.309 -0.278 -0.169 -0.202 -0.535 + -0.478 -0.467 -0.286 -0.164 -0.393 -0.170 -0.246 -0.442 -0.322 -0.201 + -0.470 -0.396 -0.193 -0.239 -0.329 -0.236 -0.468 -0.362 -0.297 -0.387 + -0.259 -0.169 -0.243 -0.351 -0.085 -0.140 -0.396 -0.244 -0.298 -0.009 + -0.136 -0.309 -0.475 0.207 -0.216 0.007 -0.179 -0.366 -0.413 -0.121 + -0.285 -0.086 -0.288 -0.225 -0.015 0.032 -0.486 -0.093 -0.091 -0.293 + -0.264 -0.002 -0.406 -0.122 0.112 -0.493 -0.199 -0.448 -0.076 -0.571 + -0.260 -0.147 -0.308 -0.161 -0.264 -0.381 -0.226 -0.382 -0.147 -0.264 + -0.236 -0.338 -0.177 -0.402 -0.256 -0.254 -0.218 0.143 -0.394 -0.488 + + 409 iasi_metop-a 2945 0.433125E-01 + -0.122 -0.227 -0.220 -0.267 -0.026 -0.095 -0.087 -0.119 0.022 -0.359 + -0.414 -0.280 -0.110 -0.181 -0.314 -0.137 -0.191 -0.287 -0.052 -0.065 + -0.271 -0.257 -0.124 -0.105 -0.134 -0.041 -0.227 -0.186 -0.072 -0.090 + -0.355 -0.386 -0.313 -0.480 -0.287 -0.266 -0.464 -0.375 -0.450 -0.192 + -0.351 -0.438 -0.661 0.055 -0.281 -0.234 -0.244 -0.444 -0.595 -0.270 + -0.519 -0.275 -0.390 -0.399 -0.132 -0.196 -0.589 -0.242 -0.221 -0.404 + -0.378 -0.098 -0.469 -0.187 -0.041 -0.564 -0.279 -0.535 -0.234 -0.723 + -0.407 -0.290 -0.439 -0.277 -0.431 -0.427 -0.336 -0.498 -0.270 -0.418 + -0.397 -0.285 -0.342 -0.562 -0.396 -0.294 -0.258 0.091 -0.514 -0.482 + + 410 iasi_metop-a 2948 0.494612E-01 + -0.070 -0.251 -0.241 -0.214 -0.047 -0.146 -0.101 -0.183 0.000 -0.390 + -0.412 -0.337 -0.168 -0.196 -0.344 -0.204 -0.234 -0.266 -0.137 -0.118 + -0.298 -0.337 -0.199 -0.182 -0.232 -0.140 -0.303 -0.314 -0.219 -0.201 + -0.169 -0.181 -0.305 -0.342 -0.158 -0.141 -0.471 -0.290 -0.362 -0.150 + -0.159 -0.275 -0.432 0.099 -0.214 0.061 -0.136 -0.391 -0.406 -0.148 + -0.348 -0.138 -0.309 -0.181 -0.017 0.013 -0.517 -0.119 -0.112 -0.365 + -0.233 -0.026 -0.461 -0.131 0.065 -0.426 -0.224 -0.451 -0.077 -0.556 + -0.247 -0.163 -0.303 -0.191 -0.283 -0.499 -0.316 -0.442 -0.192 -0.285 + -0.257 -0.396 -0.154 -0.451 -0.264 -0.312 -0.210 0.065 -0.486 -0.493 + + 411 iasi_metop-a 2951 0.463970E-01 + -0.010 -0.142 -0.146 -0.106 0.057 -0.045 -0.005 -0.003 0.136 -0.318 + -0.313 -0.209 -0.091 -0.080 -0.257 -0.079 -0.083 -0.254 0.002 -0.033 + -0.278 -0.213 -0.029 -0.027 -0.093 -0.020 -0.242 -0.204 -0.103 -0.120 + -0.125 -0.213 -0.162 -0.268 -0.091 -0.106 -0.360 -0.146 -0.235 0.015 + -0.095 -0.216 -0.416 0.237 -0.160 0.089 -0.087 -0.273 -0.373 -0.076 + -0.215 -0.040 -0.320 -0.159 0.058 0.092 -0.429 -0.030 -0.033 -0.289 + -0.193 0.005 -0.295 -0.059 0.159 -0.376 -0.137 -0.319 0.033 -0.528 + -0.177 -0.096 -0.258 -0.128 -0.187 -0.345 -0.194 -0.320 -0.090 -0.184 + -0.192 -0.225 -0.120 -0.392 -0.181 -0.217 -0.129 0.191 -0.363 -0.426 + + 412 iasi_metop-a 2958 0.477866E-01 + 0.179 -0.003 -0.028 -0.012 0.157 0.065 0.083 0.073 0.219 -0.187 + -0.248 -0.103 0.052 0.007 -0.164 0.017 0.029 -0.147 0.097 0.064 + -0.181 -0.178 0.021 0.043 0.006 0.095 -0.128 -0.101 -0.015 0.009 + 0.074 -0.003 -0.063 -0.120 0.166 0.105 -0.223 -0.130 -0.150 0.139 + 0.036 -0.128 -0.229 0.333 -0.052 0.249 0.060 -0.146 -0.171 0.092 + -0.056 0.083 -0.124 0.041 0.208 0.249 -0.257 0.037 0.119 -0.217 + -0.112 0.189 -0.197 0.022 0.283 -0.238 0.075 -0.255 0.103 -0.367 + -0.062 0.081 -0.068 0.089 -0.077 -0.276 -0.077 -0.213 -0.018 -0.023 + -0.040 -0.133 0.065 -0.253 -0.058 -0.075 -0.017 0.310 -0.281 -0.317 + + 413 iasi_metop-a 2971 0.746583E-01 + 0.623 0.619 0.608 0.573 0.468 0.564 0.505 0.605 0.628 0.386 + 0.262 0.375 0.342 0.487 0.360 0.343 0.445 0.122 0.417 0.462 + 0.131 0.275 0.294 0.323 0.319 0.409 0.165 0.143 0.293 0.284 + 0.615 0.633 0.618 0.720 0.645 0.723 0.803 0.426 0.606 0.580 + 0.571 0.652 0.522 0.529 0.594 0.750 0.584 0.669 0.569 0.663 + 0.693 0.721 0.606 0.530 0.484 0.715 0.759 0.561 0.879 0.345 + 0.627 0.554 0.734 0.524 0.695 0.370 0.610 0.489 0.592 0.462 + 0.311 0.596 0.654 0.700 0.673 0.489 0.551 0.668 0.570 0.628 + 0.716 0.567 0.712 0.470 0.739 0.567 0.812 0.661 0.429 0.801 + + 414 iasi_metop-a 2977 0.637415E-01 + 0.691 0.405 0.479 0.612 0.699 0.498 0.605 0.618 0.663 0.462 + 0.529 0.575 0.787 0.783 0.609 0.885 0.763 0.603 0.595 0.710 + 0.691 0.700 0.744 0.645 0.746 0.794 0.758 0.755 0.868 0.748 + 0.128 0.120 -0.182 0.139 0.324 0.321 0.040 -0.023 0.112 0.116 + 0.151 -0.090 0.020 0.073 0.236 0.317 0.379 -0.033 0.197 0.184 + -0.040 0.299 -0.066 0.211 -0.060 0.311 -0.177 0.155 0.412 0.005 + 0.271 0.305 0.053 0.147 0.397 -0.031 0.022 -0.138 0.278 -0.190 + -0.046 0.161 0.067 0.236 0.254 -0.102 0.112 -0.039 -0.135 0.275 + 0.111 -0.063 0.156 -0.096 0.094 0.034 0.334 0.287 0.033 0.034 + + 415 iasi_metop-a 2985 0.696744E-01 + 0.206 0.092 0.035 0.068 0.422 0.167 0.040 0.280 0.266 -0.038 + -0.080 0.036 0.160 0.329 0.004 0.279 0.327 0.121 0.313 0.332 + 0.017 0.170 0.312 0.328 0.323 0.389 0.270 0.397 0.389 0.342 + -0.114 -0.214 -0.364 -0.150 0.008 0.068 -0.190 -0.246 -0.128 -0.152 + -0.088 -0.375 -0.209 -0.074 0.082 0.107 0.269 -0.356 -0.175 -0.046 + -0.312 0.010 -0.234 -0.051 -0.350 0.156 -0.368 -0.157 0.187 -0.265 + -0.055 0.042 -0.143 -0.012 0.081 -0.280 -0.249 -0.375 0.055 -0.318 + -0.193 -0.089 -0.213 0.055 0.041 -0.357 -0.022 -0.259 -0.362 0.024 + -0.077 -0.196 -0.011 -0.243 -0.154 -0.161 0.120 -0.004 -0.221 -0.118 + + 416 iasi_metop-a 2988 0.570622E-01 + -0.006 -0.053 -0.129 -0.110 0.242 -0.109 -0.164 0.074 -0.026 -0.266 + -0.196 -0.226 -0.006 0.091 -0.148 0.111 0.101 -0.084 0.076 0.126 + -0.231 0.008 0.151 0.156 0.059 0.149 -0.031 0.105 0.175 0.079 + -0.209 -0.228 -0.549 -0.327 -0.054 -0.058 -0.402 -0.376 -0.392 -0.271 + -0.165 -0.307 -0.458 -0.207 -0.179 0.214 0.020 -0.391 -0.277 -0.180 + -0.287 -0.144 -0.448 -0.211 -0.254 0.087 -0.466 -0.214 0.008 -0.457 + -0.248 0.094 -0.294 -0.199 0.007 -0.381 -0.077 -0.527 -0.142 -0.557 + -0.426 -0.145 -0.320 -0.236 -0.079 -0.426 -0.325 -0.376 -0.416 -0.243 + -0.314 -0.457 -0.141 -0.430 -0.260 -0.295 -0.074 -0.044 -0.380 -0.297 + + 417 iasi_metop-a 2990 0.614392E-01 + 0.217 -0.050 0.045 0.135 0.257 0.028 0.011 0.170 0.045 -0.185 + -0.221 -0.151 0.042 0.091 -0.198 0.031 0.055 -0.114 0.066 0.068 + -0.259 -0.165 0.041 0.053 0.001 0.131 -0.099 -0.013 0.022 0.014 + 0.042 -0.001 -0.297 0.028 0.187 0.236 -0.089 -0.120 -0.053 -0.003 + 0.046 -0.117 -0.101 -0.049 0.085 0.284 0.245 -0.153 0.088 0.086 + 0.010 0.168 -0.151 0.087 -0.145 0.400 -0.256 0.078 0.301 -0.098 + 0.108 0.273 -0.102 0.020 0.281 -0.179 0.028 -0.244 0.169 -0.352 + -0.201 0.016 -0.050 0.055 0.115 -0.151 -0.043 0.049 -0.239 0.065 + -0.014 -0.213 0.065 -0.151 -0.063 -0.066 0.184 0.167 -0.084 -0.078 + + 418 iasi_metop-a 2991 0.612452E-01 + 0.054 -0.094 -0.119 -0.075 0.230 -0.006 -0.088 0.139 0.074 -0.181 + -0.243 -0.104 0.054 0.142 -0.118 0.153 0.155 -0.019 0.162 0.192 + -0.135 0.039 0.200 0.189 0.193 0.323 0.118 0.238 0.236 0.201 + -0.276 -0.322 -0.687 -0.293 -0.096 -0.097 -0.356 -0.386 -0.349 -0.289 + -0.264 -0.374 -0.399 -0.337 -0.185 -0.036 0.021 -0.458 -0.209 -0.225 + -0.307 -0.104 -0.515 -0.206 -0.365 0.048 -0.534 -0.209 -0.001 -0.388 + -0.180 -0.030 -0.346 -0.231 -0.047 -0.421 -0.240 -0.509 -0.152 -0.549 + -0.465 -0.222 -0.353 -0.165 -0.126 -0.456 -0.296 -0.239 -0.535 -0.248 + -0.297 -0.470 -0.218 -0.415 -0.309 -0.355 -0.088 -0.145 -0.367 -0.314 + + 419 iasi_metop-a 2993 0.669388E-01 + -0.087 -0.235 -0.254 -0.205 0.090 -0.144 -0.226 0.009 -0.107 -0.360 + -0.421 -0.350 -0.160 0.018 -0.349 -0.052 -0.084 -0.262 -0.088 -0.042 + -0.336 -0.230 -0.063 -0.096 -0.124 0.072 -0.179 -0.058 -0.057 -0.098 + -0.318 -0.428 -0.660 -0.367 -0.164 -0.146 -0.358 -0.491 -0.300 -0.405 + -0.371 -0.615 -0.426 -0.277 -0.221 -0.095 -0.047 -0.592 -0.374 -0.333 + -0.528 -0.246 -0.551 -0.251 -0.532 -0.153 -0.657 -0.343 -0.002 -0.502 + -0.280 -0.053 -0.337 -0.257 -0.107 -0.477 -0.391 -0.638 -0.224 -0.537 + -0.420 -0.264 -0.392 -0.249 -0.136 -0.535 -0.266 -0.354 -0.574 -0.224 + -0.319 -0.538 -0.252 -0.514 -0.380 -0.426 -0.079 -0.256 -0.434 -0.324 + + 420 iasi_metop-a 3002 0.872386E-01 + -0.198 -0.015 -0.281 -0.364 -0.131 -0.063 -0.356 -0.008 -0.128 -0.293 + -0.342 -0.434 -0.222 -0.017 -0.289 -0.137 -0.070 -0.373 -0.093 -0.113 + -0.375 -0.188 -0.085 -0.085 -0.118 -0.073 -0.229 -0.075 -0.086 -0.111 + -0.363 -0.517 -0.685 -0.165 -0.521 -0.370 -0.297 -0.779 -0.477 -0.535 + -0.355 -0.776 -0.377 -0.427 -0.437 -0.091 -0.365 -0.481 -0.625 -0.243 + -0.331 -0.224 -0.662 -0.444 -0.494 -0.453 -0.354 -0.425 -0.161 -0.712 + -0.383 -0.284 -0.145 -0.308 -0.259 -0.410 -0.455 -0.708 -0.281 -0.533 + -0.902 -0.350 -0.684 -0.311 -0.563 -0.510 -0.209 -0.444 -0.635 -0.043 + -0.399 -0.307 -0.328 -0.613 -0.205 -0.382 -0.103 -0.459 -0.556 -0.388 + + 421 iasi_metop-a 3008 0.727605E-01 + -0.286 -0.335 -0.411 -0.284 -0.245 -0.362 -0.296 -0.251 -0.231 -0.551 + -0.408 -0.419 -0.256 -0.118 -0.384 -0.063 -0.190 -0.416 -0.381 -0.177 + -0.312 -0.281 -0.150 -0.302 -0.229 -0.181 -0.173 -0.137 -0.042 -0.258 + -0.606 -0.785 -0.874 -0.628 -0.517 -0.333 -0.621 -0.813 -0.453 -0.616 + -0.534 -0.873 -0.701 -0.519 -0.553 -0.245 -0.330 -0.836 -0.765 -0.536 + -0.743 -0.406 -0.688 -0.430 -0.751 -0.207 -0.832 -0.588 -0.189 -0.672 + -0.484 -0.222 -0.478 -0.506 -0.466 -0.697 -0.644 -0.793 -0.505 -0.732 + -0.769 -0.552 -0.734 -0.515 -0.567 -0.757 -0.422 -0.558 -0.857 -0.386 + -0.554 -0.606 -0.432 -0.752 -0.611 -0.591 -0.304 -0.569 -0.627 -0.681 + + 422 iasi_metop-a 3014 0.817087E-01 + -0.410 -0.200 -0.482 -0.444 -0.251 -0.273 -0.514 -0.196 -0.294 -0.541 + -0.548 -0.634 -0.440 -0.228 -0.499 -0.331 -0.307 -0.603 -0.275 -0.286 + -0.552 -0.371 -0.286 -0.285 -0.374 -0.314 -0.431 -0.252 -0.305 -0.335 + -0.518 -0.738 -0.833 -0.457 -0.622 -0.409 -0.454 -0.935 -0.521 -0.725 + -0.395 -1.082 -0.581 -0.465 -0.469 -0.193 -0.494 -0.796 -0.794 -0.534 + -0.626 -0.317 -0.698 -0.561 -0.720 -0.407 -0.636 -0.766 -0.360 -0.794 + -0.433 -0.357 -0.469 -0.509 -0.357 -0.640 -0.614 -0.925 -0.457 -0.753 + -0.893 -0.563 -0.969 -0.484 -0.711 -0.710 -0.222 -0.496 -0.870 -0.306 + -0.497 -0.401 -0.439 -0.834 -0.349 -0.484 -0.247 -0.546 -0.554 -0.546 + + 423 iasi_metop-a 3027 0.592521E-01 + -0.160 -0.362 -0.304 -0.173 -0.132 -0.378 -0.261 -0.193 -0.221 -0.552 + -0.404 -0.384 -0.317 -0.063 -0.428 -0.148 -0.198 -0.476 -0.318 -0.148 + -0.365 -0.310 -0.109 -0.204 -0.213 -0.160 -0.337 -0.144 -0.152 -0.349 + -0.272 -0.207 -0.572 -0.319 -0.118 -0.111 -0.399 -0.426 -0.427 -0.270 + -0.199 -0.482 -0.423 -0.297 -0.238 -0.010 -0.044 -0.473 -0.263 -0.213 + -0.314 -0.108 -0.491 -0.261 -0.449 0.104 -0.545 -0.242 0.069 -0.455 + -0.303 0.037 -0.414 -0.238 -0.059 -0.476 -0.116 -0.534 -0.201 -0.573 + -0.437 -0.249 -0.357 -0.266 -0.068 -0.438 -0.397 -0.282 -0.493 -0.232 + -0.329 -0.568 -0.235 -0.415 -0.353 -0.384 -0.104 -0.132 -0.358 -0.338 + + 424 iasi_metop-a 3029 0.575892E-01 + 0.055 -0.148 -0.108 -0.048 0.136 -0.045 -0.126 0.043 -0.050 -0.263 + -0.314 -0.260 -0.062 0.040 -0.280 -0.008 -0.026 -0.187 0.002 0.014 + -0.327 -0.133 0.000 0.014 -0.064 0.114 -0.175 -0.056 0.003 -0.062 + -0.137 -0.069 -0.452 -0.224 0.022 0.043 -0.298 -0.313 -0.269 -0.142 + -0.067 -0.355 -0.332 -0.170 -0.105 0.255 0.071 -0.372 -0.166 -0.077 + -0.189 -0.009 -0.370 -0.160 -0.203 0.203 -0.377 -0.148 0.150 -0.331 + -0.221 0.129 -0.191 -0.144 0.053 -0.325 0.039 -0.426 -0.055 -0.459 + -0.349 -0.037 -0.212 -0.177 0.029 -0.303 -0.285 -0.242 -0.330 -0.120 + -0.218 -0.413 -0.040 -0.308 -0.199 -0.234 0.007 -0.017 -0.277 -0.218 + + 425 iasi_metop-a 3030 0.572536E-01 + 0.038 -0.134 -0.107 -0.026 0.195 -0.056 -0.100 0.110 0.018 -0.250 + -0.247 -0.221 -0.023 0.087 -0.197 0.016 0.044 -0.096 0.045 0.060 + -0.270 -0.082 0.074 0.103 0.028 0.190 -0.043 0.040 0.076 0.062 + -0.154 -0.093 -0.453 -0.273 -0.016 0.013 -0.321 -0.352 -0.287 -0.201 + -0.098 -0.241 -0.351 -0.103 -0.127 0.243 -0.009 -0.391 -0.195 -0.095 + -0.197 -0.083 -0.378 -0.185 -0.144 0.185 -0.421 -0.158 0.144 -0.385 + -0.182 0.179 -0.263 -0.159 0.046 -0.377 0.031 -0.434 -0.074 -0.499 + -0.363 -0.055 -0.243 -0.189 -0.010 -0.321 -0.297 -0.344 -0.377 -0.147 + -0.236 -0.419 -0.058 -0.328 -0.213 -0.244 0.004 -0.040 -0.307 -0.243 + + 426 iasi_metop-a 3036 0.681920E-01 + -0.152 -0.245 -0.282 -0.222 0.108 -0.124 -0.197 0.001 -0.091 -0.323 + -0.394 -0.326 -0.169 -0.018 -0.340 -0.079 -0.061 -0.207 -0.064 -0.080 + -0.320 -0.263 -0.034 -0.013 -0.017 0.115 -0.096 -0.025 0.035 0.018 + -0.432 -0.540 -0.701 -0.470 -0.291 -0.224 -0.484 -0.567 -0.430 -0.469 + -0.430 -0.681 -0.490 -0.276 -0.355 -0.153 -0.113 -0.612 -0.510 -0.383 + -0.582 -0.293 -0.573 -0.284 -0.571 -0.223 -0.710 -0.402 -0.006 -0.555 + -0.303 -0.114 -0.383 -0.313 -0.233 -0.529 -0.462 -0.705 -0.299 -0.578 + -0.521 -0.335 -0.464 -0.256 -0.228 -0.640 -0.306 -0.365 -0.637 -0.230 + -0.384 -0.568 -0.287 -0.530 -0.478 -0.434 -0.125 -0.346 -0.487 -0.427 + + 427 iasi_metop-a 3047 0.603675E-01 + 0.016 -0.145 -0.187 -0.116 0.127 -0.140 -0.247 -0.016 -0.101 -0.393 + -0.378 -0.309 -0.108 0.007 -0.332 -0.053 -0.069 -0.277 -0.127 -0.012 + -0.366 -0.208 -0.049 -0.043 -0.111 -0.068 -0.282 -0.096 -0.093 -0.141 + -0.171 -0.105 -0.480 -0.183 -0.057 0.022 -0.234 -0.313 -0.245 -0.153 + -0.038 -0.298 -0.297 -0.191 -0.007 0.006 0.133 -0.284 -0.085 -0.137 + -0.177 -0.020 -0.367 -0.102 -0.291 0.224 -0.445 -0.128 0.148 -0.259 + -0.157 0.163 -0.236 -0.115 0.071 -0.330 -0.180 -0.380 -0.051 -0.389 + -0.316 -0.124 -0.251 -0.085 0.010 -0.301 -0.201 -0.238 -0.429 -0.101 + -0.177 -0.408 -0.131 -0.311 -0.200 -0.247 0.032 -0.016 -0.194 -0.219 + + 428 iasi_metop-a 3049 0.563988E-01 + 0.167 0.000 0.034 0.073 0.325 0.054 0.005 0.216 0.075 -0.158 + -0.159 -0.120 0.084 0.179 -0.137 0.140 0.106 -0.084 0.117 0.165 + -0.167 0.004 0.157 0.130 0.071 0.239 -0.011 0.076 0.116 0.094 + 0.023 0.068 -0.161 -0.072 0.194 0.220 -0.036 -0.118 -0.064 0.059 + 0.148 -0.073 -0.209 0.118 0.089 0.455 0.220 -0.179 -0.036 0.093 + -0.015 0.102 -0.193 -0.002 0.096 0.351 -0.222 0.016 0.305 -0.192 + -0.012 0.276 -0.034 0.083 0.251 -0.146 0.078 -0.258 0.105 -0.312 + -0.153 0.124 -0.052 -0.004 0.088 -0.163 -0.113 -0.156 -0.108 0.010 + -0.021 -0.226 0.139 -0.149 -0.035 -0.086 0.126 0.239 -0.150 -0.089 + + 429 iasi_metop-a 3052 0.517222E-01 + 0.435 0.208 0.269 0.288 0.478 0.294 0.260 0.435 0.355 0.018 + 0.026 0.061 0.286 0.356 0.069 0.289 0.298 0.114 0.328 0.326 + 0.027 0.147 0.299 0.339 0.271 0.416 0.161 0.218 0.275 0.257 + 0.251 0.334 0.122 0.199 0.461 0.454 0.183 0.177 0.140 0.334 + 0.365 0.098 0.118 0.535 0.268 0.642 0.347 0.062 0.123 0.389 + 0.229 0.300 0.114 0.324 0.470 0.572 0.009 0.271 0.443 0.106 + 0.177 0.505 0.108 0.335 0.557 0.078 0.394 -0.014 0.436 -0.044 + 0.177 0.409 0.182 0.273 0.277 0.099 0.193 0.018 0.198 0.330 + 0.235 0.016 0.417 0.080 0.214 0.199 0.324 0.612 0.029 -0.040 + + 430 iasi_metop-a 3053 0.514748E-01 + 0.467 0.305 0.312 0.323 0.587 0.412 0.346 0.526 0.505 0.155 + 0.110 0.265 0.384 0.425 0.172 0.452 0.418 0.276 0.471 0.453 + 0.165 0.287 0.425 0.496 0.398 0.581 0.382 0.396 0.475 0.435 + 0.238 0.304 0.002 0.160 0.416 0.408 0.132 0.134 0.110 0.350 + 0.320 0.070 0.021 0.429 0.230 0.612 0.380 0.021 0.058 0.352 + 0.192 0.245 0.119 0.309 0.442 0.539 -0.028 0.254 0.423 0.043 + 0.145 0.480 0.086 0.302 0.520 0.043 0.362 -0.043 0.408 -0.066 + 0.164 0.377 0.143 0.270 0.253 0.064 0.167 0.024 0.175 0.254 + 0.239 -0.024 0.358 0.059 0.184 0.177 0.311 0.578 -0.003 -0.026 + + 431 iasi_metop-a 3055 0.574338E-01 + 0.667 0.444 0.519 0.535 0.727 0.517 0.438 0.648 0.610 0.279 + 0.161 0.370 0.434 0.478 0.280 0.518 0.475 0.308 0.536 0.512 + 0.212 0.301 0.457 0.510 0.404 0.589 0.370 0.383 0.474 0.423 + 0.444 0.475 0.178 0.301 0.634 0.601 0.368 0.330 0.366 0.429 + 0.543 0.296 0.196 0.474 0.469 0.807 0.652 0.308 0.378 0.486 + 0.402 0.501 0.200 0.467 0.465 0.721 0.141 0.407 0.676 0.218 + 0.377 0.690 0.315 0.459 0.662 0.207 0.450 0.195 0.542 0.132 + 0.215 0.498 0.316 0.391 0.538 0.240 0.262 0.215 0.224 0.448 + 0.387 0.211 0.570 0.205 0.380 0.351 0.546 0.644 0.224 0.252 + + 432 iasi_metop-a 3058 0.519749E-01 + 0.494 0.410 0.380 0.372 0.715 0.502 0.497 0.596 0.569 0.307 + 0.226 0.296 0.544 0.566 0.299 0.554 0.627 0.424 0.608 0.610 + 0.357 0.436 0.651 0.699 0.614 0.816 0.581 0.623 0.699 0.658 + 0.296 0.278 0.070 0.171 0.426 0.360 0.155 0.222 0.144 0.283 + 0.347 0.079 0.093 0.414 0.255 0.639 0.334 0.007 0.077 0.365 + 0.203 0.265 0.135 0.266 0.382 0.529 -0.059 0.241 0.405 0.007 + 0.178 0.491 0.085 0.285 0.542 0.084 0.360 -0.010 0.346 -0.058 + 0.155 0.324 0.194 0.304 0.243 0.023 0.183 0.004 0.165 0.257 + 0.204 -0.009 0.391 0.003 0.193 0.150 0.306 0.535 0.046 -0.051 + + 433 iasi_metop-a 3064 0.538072E-01 + 0.448 0.240 0.295 0.329 0.583 0.348 0.311 0.505 0.434 0.105 + 0.087 0.258 0.334 0.363 0.129 0.434 0.411 0.254 0.442 0.446 + 0.169 0.248 0.400 0.460 0.366 0.530 0.331 0.384 0.454 0.354 + 0.205 0.288 0.032 0.148 0.405 0.343 0.147 0.139 0.104 0.212 + 0.334 0.078 -0.016 0.266 0.263 0.640 0.382 0.041 0.141 0.355 + 0.161 0.273 0.064 0.183 0.364 0.540 -0.037 0.230 0.412 -0.080 + 0.197 0.422 0.103 0.221 0.477 0.026 0.250 -0.067 0.277 -0.070 + 0.005 0.262 0.158 0.217 0.225 0.016 0.074 -0.044 0.087 0.256 + 0.230 -0.002 0.329 0.033 0.190 0.118 0.299 0.504 -0.033 0.048 + + 434 iasi_metop-a 3069 0.811144E-01 + 0.199 0.225 0.126 0.187 0.363 0.254 0.166 0.409 0.277 0.059 + -0.072 0.079 0.200 0.247 0.016 0.284 0.359 0.000 0.315 0.213 + 0.040 0.132 0.242 0.318 0.262 0.431 0.288 0.316 0.335 0.317 + -0.054 -0.153 -0.233 -0.010 -0.073 0.081 -0.009 -0.531 -0.088 -0.144 + 0.031 -0.543 -0.159 -0.105 -0.054 0.123 -0.067 -0.181 -0.215 -0.117 + -0.266 0.062 -0.278 -0.007 -0.321 0.014 -0.139 -0.177 0.236 -0.327 + 0.012 -0.029 0.035 -0.022 0.139 -0.286 -0.144 -0.405 -0.063 -0.319 + -0.502 -0.096 -0.401 -0.073 -0.220 -0.182 0.173 -0.228 -0.382 0.148 + 0.019 -0.125 -0.003 -0.342 0.039 -0.190 0.175 0.043 -0.183 -0.194 + + 435 iasi_metop-a 3087 0.755459E-01 + 0.087 0.032 -0.082 -0.013 0.162 -0.040 0.013 0.096 0.118 -0.146 + -0.156 -0.132 0.024 0.268 -0.040 0.276 0.163 -0.058 0.045 0.103 + -0.022 0.055 0.183 0.116 0.137 0.217 0.108 0.155 0.192 0.120 + -0.291 -0.425 -0.553 -0.335 -0.196 0.015 -0.267 -0.467 -0.132 -0.302 + -0.145 -0.750 -0.363 -0.241 -0.125 0.069 0.032 -0.470 -0.286 -0.195 + -0.459 0.000 -0.409 -0.083 -0.445 0.070 -0.418 -0.252 0.148 -0.361 + -0.136 0.011 -0.123 -0.087 -0.115 -0.289 -0.337 -0.446 -0.048 -0.372 + -0.394 -0.254 -0.512 -0.089 -0.242 -0.417 -0.082 -0.218 -0.606 -0.115 + -0.199 -0.189 -0.070 -0.500 -0.238 -0.319 0.017 -0.195 -0.282 -0.345 + + 436 iasi_metop-a 3093 0.854099E-01 + 0.122 0.288 -0.021 0.006 0.147 0.150 -0.075 0.217 0.109 -0.121 + -0.055 -0.137 0.015 0.257 -0.018 0.110 0.155 -0.174 0.147 0.146 + -0.112 0.054 0.139 0.135 0.065 0.160 -0.040 0.148 0.124 0.090 + 0.069 -0.156 -0.174 0.138 -0.167 0.079 0.138 -0.337 -0.055 -0.193 + 0.152 -0.492 0.004 0.007 0.037 0.410 0.094 -0.136 -0.185 0.102 + -0.018 0.369 -0.153 -0.029 -0.025 0.022 0.032 0.001 0.174 -0.277 + 0.009 0.142 0.168 0.130 0.156 -0.095 -0.006 -0.349 0.161 -0.146 + -0.421 0.073 -0.297 0.105 -0.179 -0.158 0.298 -0.074 -0.263 0.421 + 0.127 0.072 0.108 -0.292 0.214 -0.012 0.356 0.014 -0.076 0.052 + + 437 iasi_metop-a 3098 0.564187E-01 + 0.265 0.263 0.324 0.356 0.187 0.161 0.327 0.293 0.204 0.037 + 0.193 0.106 0.192 0.390 0.166 0.362 0.217 0.022 0.143 0.439 + 0.172 0.294 0.323 0.296 0.250 0.263 0.280 0.350 0.371 0.223 + 0.163 0.148 0.178 0.225 0.238 0.178 0.101 0.033 0.132 0.044 + 0.127 0.303 0.073 0.120 0.155 0.252 0.032 0.075 0.166 0.164 + 0.216 0.464 0.157 0.143 0.073 0.264 0.137 0.022 0.519 0.258 + 0.103 0.175 0.364 0.032 0.088 0.109 0.232 0.054 -0.012 0.307 + 0.286 0.202 0.358 0.320 0.268 0.153 0.255 0.364 0.240 0.130 + 0.402 0.154 0.362 0.174 0.321 0.277 0.242 0.160 0.266 0.303 + + 438 iasi_metop-a 3105 0.788482E-01 + 0.198 0.060 0.032 0.237 0.253 0.187 0.161 0.231 0.195 0.175 + 0.184 0.135 0.229 0.392 0.231 0.313 0.212 0.139 0.258 0.102 + 0.254 0.224 0.191 0.179 0.280 0.318 0.269 0.261 0.253 0.322 + -0.300 -0.482 -0.569 -0.267 -0.318 -0.109 -0.209 -0.671 -0.231 -0.465 + -0.231 -0.769 -0.433 -0.279 -0.253 0.083 -0.111 -0.563 -0.425 -0.287 + -0.488 -0.087 -0.467 -0.215 -0.578 -0.144 -0.429 -0.404 -0.039 -0.537 + -0.164 -0.189 -0.209 -0.209 -0.151 -0.461 -0.392 -0.714 -0.234 -0.567 + -0.649 -0.286 -0.622 -0.268 -0.417 -0.461 -0.079 -0.401 -0.657 -0.098 + -0.264 -0.200 -0.110 -0.589 -0.197 -0.322 0.006 -0.356 -0.301 -0.438 + + 439 iasi_metop-a 3107 0.749579E-01 + 0.176 0.171 0.035 0.163 0.286 0.115 0.040 0.131 0.106 -0.168 + -0.130 -0.130 -0.034 0.273 -0.072 0.127 0.125 -0.197 0.045 0.074 + -0.131 -0.003 0.092 0.034 0.025 0.127 -0.096 0.094 0.097 -0.040 + -0.084 -0.186 -0.263 -0.061 0.090 0.264 0.035 -0.284 0.015 -0.133 + 0.133 -0.518 -0.163 0.078 0.084 0.332 0.183 -0.230 -0.062 0.017 + -0.208 0.214 -0.173 0.071 -0.209 0.306 -0.186 0.035 0.387 -0.174 + 0.064 0.287 0.126 0.041 0.069 -0.128 -0.104 -0.256 0.121 -0.212 + -0.239 -0.015 -0.295 0.072 -0.012 -0.218 0.166 -0.036 -0.372 0.188 + 0.053 0.115 0.113 -0.309 -0.015 -0.070 0.253 0.027 0.013 -0.257 + + 440 iasi_metop-a 3110 0.704658E-01 + 0.063 0.038 -0.109 -0.049 0.272 0.001 0.028 0.181 0.106 -0.180 + -0.137 -0.106 -0.010 0.296 -0.044 0.217 0.178 -0.059 0.176 0.318 + 0.013 0.068 0.227 0.266 0.233 0.288 0.180 0.338 0.312 0.243 + -0.436 -0.565 -0.676 -0.516 -0.301 -0.179 -0.393 -0.648 -0.274 -0.357 + -0.349 -0.669 -0.447 -0.232 -0.311 -0.013 -0.072 -0.568 -0.560 -0.306 + -0.583 -0.274 -0.452 -0.237 -0.606 -0.033 -0.636 -0.358 0.041 -0.482 + -0.222 -0.002 -0.280 -0.317 -0.123 -0.451 -0.423 -0.659 -0.297 -0.523 + -0.530 -0.299 -0.473 -0.260 -0.278 -0.595 -0.238 -0.376 -0.647 -0.157 + -0.407 -0.502 -0.261 -0.440 -0.373 -0.389 -0.087 -0.294 -0.330 -0.528 + + 441 iasi_metop-a 3116 0.763956E-01 + 0.017 0.123 0.006 -0.078 -0.064 -0.008 -0.138 0.093 -0.026 -0.145 + -0.206 -0.228 -0.147 0.102 -0.150 0.020 0.053 -0.309 -0.058 0.108 + -0.227 -0.047 -0.008 0.038 -0.026 -0.087 -0.149 -0.005 -0.016 -0.051 + -0.125 -0.240 -0.182 0.015 -0.214 0.007 0.041 -0.367 -0.192 -0.193 + -0.221 -0.034 -0.183 -0.267 -0.163 -0.048 -0.145 -0.119 -0.325 -0.147 + -0.141 -0.217 -0.128 -0.188 -0.355 0.007 -0.085 -0.187 0.040 -0.387 + -0.137 -0.154 -0.056 -0.327 -0.114 -0.314 -0.216 -0.332 -0.223 -0.234 + -0.462 -0.182 -0.095 0.033 -0.112 -0.212 -0.168 0.018 -0.175 -0.178 + 0.104 -0.121 -0.027 -0.203 -0.074 0.017 0.065 -0.076 -0.250 0.065 + + 442 iasi_metop-a 3127 0.626577E-01 + 0.092 -0.228 -0.118 0.043 0.089 -0.157 0.043 0.008 0.051 -0.139 + -0.058 0.008 0.119 0.135 0.072 0.257 0.175 -0.073 0.002 0.110 + 0.045 0.044 0.137 0.021 0.124 0.181 0.123 0.116 0.227 0.120 + -0.176 -0.253 -0.598 -0.203 0.022 -0.029 -0.306 -0.336 -0.243 -0.227 + -0.166 -0.399 -0.301 -0.244 -0.078 0.010 0.159 -0.401 -0.214 -0.193 + -0.214 -0.094 -0.377 -0.161 -0.366 0.056 -0.451 -0.118 0.088 -0.294 + -0.099 -0.028 -0.250 -0.144 0.011 -0.333 -0.242 -0.457 -0.113 -0.524 + -0.377 -0.112 -0.279 -0.081 0.013 -0.347 -0.173 -0.201 -0.454 -0.086 + -0.220 -0.394 -0.093 -0.337 -0.203 -0.266 0.024 -0.041 -0.253 -0.259 + + 443 iasi_metop-a 3129 0.612719E-01 + 0.052 -0.149 -0.154 -0.099 0.176 -0.067 -0.139 0.084 -0.032 -0.254 + -0.301 -0.240 -0.017 0.067 -0.287 0.039 0.022 -0.157 0.010 0.040 + -0.271 -0.099 0.095 0.046 -0.001 0.174 -0.048 0.036 0.059 -0.008 + -0.256 -0.287 -0.613 -0.251 -0.123 -0.076 -0.333 -0.385 -0.297 -0.266 + -0.227 -0.386 -0.390 -0.253 -0.151 -0.009 0.064 -0.398 -0.213 -0.218 + -0.294 -0.075 -0.475 -0.177 -0.338 0.136 -0.540 -0.203 0.002 -0.392 + -0.180 -0.009 -0.328 -0.213 -0.006 -0.401 -0.210 -0.482 -0.194 -0.507 + -0.417 -0.240 -0.342 -0.180 -0.030 -0.375 -0.297 -0.309 -0.515 -0.227 + -0.272 -0.455 -0.137 -0.407 -0.273 -0.328 -0.038 -0.108 -0.312 -0.282 + + 444 iasi_metop-a 3136 0.746233E-01 + -0.085 -0.111 -0.288 -0.164 0.147 -0.092 -0.210 0.027 -0.058 -0.333 + -0.398 -0.312 -0.154 0.038 -0.260 -0.036 -0.036 -0.253 -0.039 -0.058 + -0.332 -0.183 -0.073 -0.072 -0.082 0.104 -0.118 -0.007 -0.034 -0.049 + -0.462 -0.598 -0.669 -0.450 -0.306 -0.175 -0.367 -0.618 -0.320 -0.517 + -0.295 -0.794 -0.492 -0.249 -0.335 -0.038 -0.132 -0.644 -0.527 -0.309 + -0.599 -0.168 -0.547 -0.258 -0.614 -0.056 -0.572 -0.378 -0.005 -0.580 + -0.295 -0.142 -0.260 -0.299 -0.285 -0.422 -0.471 -0.669 -0.282 -0.526 + -0.704 -0.386 -0.579 -0.293 -0.348 -0.563 -0.236 -0.397 -0.785 -0.192 + -0.383 -0.371 -0.212 -0.631 -0.372 -0.433 -0.108 -0.378 -0.392 -0.533 + + 445 iasi_metop-a 3146 0.734042E-01 + 0.094 0.090 -0.048 0.057 0.249 0.033 -0.072 0.093 0.024 -0.272 + -0.239 -0.226 -0.030 0.201 -0.189 0.045 0.046 -0.210 0.001 0.035 + -0.218 -0.102 0.028 0.004 -0.056 -0.003 -0.158 0.001 -0.003 -0.094 + -0.051 -0.231 -0.296 -0.073 0.056 0.198 -0.062 -0.322 0.023 -0.040 + 0.083 -0.448 -0.111 0.068 0.134 0.302 0.227 -0.244 -0.153 0.003 + -0.234 0.147 -0.147 0.178 -0.229 0.337 -0.213 0.028 0.408 -0.157 + 0.084 0.213 0.095 0.071 0.071 -0.162 -0.093 -0.253 0.082 -0.174 + -0.243 0.002 -0.206 0.060 -0.012 -0.260 0.087 -0.028 -0.360 0.201 + 0.003 -0.053 0.120 -0.252 0.015 -0.062 0.285 0.058 -0.049 -0.167 + + 446 iasi_metop-a 3151 0.697349E-01 + 0.331 0.229 0.174 0.236 0.489 0.262 0.158 0.353 0.252 -0.016 + 0.018 0.031 0.166 0.417 0.063 0.363 0.332 0.145 0.263 0.346 + 0.067 0.209 0.348 0.338 0.272 0.325 0.190 0.363 0.368 0.296 + 0.100 -0.086 -0.138 0.030 0.175 0.240 -0.019 -0.075 0.154 0.002 + 0.079 -0.241 0.027 0.111 0.153 0.348 0.395 -0.130 -0.041 0.123 + -0.143 0.115 -0.128 0.179 -0.173 0.333 -0.253 0.022 0.454 -0.105 + 0.161 0.205 0.108 0.137 0.278 -0.116 -0.007 -0.179 0.123 -0.113 + -0.041 0.156 0.005 0.230 0.207 -0.190 0.189 0.029 -0.226 0.210 + 0.017 -0.071 0.175 -0.174 -0.002 -0.013 0.321 0.138 -0.031 0.009 + + 447 iasi_metop-a 3160 0.767027E-01 + 0.405 0.416 0.259 0.357 0.564 0.416 0.197 0.482 0.365 0.152 + 0.046 0.099 0.227 0.539 0.198 0.399 0.409 0.161 0.397 0.377 + 0.108 0.266 0.373 0.382 0.364 0.454 0.273 0.437 0.389 0.393 + 0.140 -0.013 -0.074 0.135 0.096 0.358 0.138 -0.134 0.187 0.073 + 0.306 -0.345 0.009 0.215 0.183 0.495 0.385 -0.066 0.006 0.148 + -0.100 0.403 -0.075 0.268 -0.185 0.517 -0.042 0.172 0.544 -0.153 + 0.195 0.273 0.259 0.243 0.254 -0.026 0.052 -0.142 0.300 -0.096 + -0.156 0.143 -0.097 0.185 0.118 -0.072 0.285 0.155 -0.263 0.320 + 0.164 0.230 0.309 -0.174 0.184 0.006 0.412 0.134 0.131 -0.018 + + 448 iasi_metop-a 3165 0.891140E-01 + 0.030 0.202 -0.036 -0.092 0.036 0.081 0.030 0.248 0.182 -0.050 + 0.016 -0.104 0.068 0.348 0.070 0.237 0.296 -0.077 0.245 0.364 + 0.158 0.260 0.317 0.332 0.305 0.354 0.278 0.475 0.406 0.283 + -0.368 -0.367 -0.526 -0.025 -0.353 -0.303 -0.124 -0.605 -0.467 -0.429 + -0.362 -0.340 -0.252 -0.516 -0.435 -0.036 -0.248 -0.278 -0.521 -0.245 + -0.186 -0.158 -0.475 -0.332 -0.499 -0.203 -0.144 -0.356 -0.214 -0.760 + -0.343 -0.458 -0.093 -0.408 -0.156 -0.505 -0.408 -0.588 -0.279 -0.390 + -0.740 -0.432 -0.432 -0.163 -0.277 -0.250 -0.313 -0.179 -0.254 -0.242 + -0.241 -0.278 -0.217 -0.489 -0.239 -0.292 0.027 -0.281 -0.681 -0.149 + + 449 iasi_metop-a 3168 0.485059E-01 + 0.313 0.307 0.465 0.487 0.160 0.146 0.317 0.240 0.185 0.041 + 0.057 0.160 0.204 0.205 0.149 0.285 0.125 -0.070 -0.089 0.311 + 0.000 0.125 0.107 0.073 0.029 0.009 0.007 0.007 0.127 -0.056 + 0.340 0.180 0.275 0.162 0.338 0.528 0.282 0.120 0.257 0.251 + 0.264 0.364 0.195 0.169 0.264 0.356 0.076 0.287 0.243 0.341 + 0.406 0.473 0.379 0.163 0.347 0.265 0.251 0.082 0.448 0.434 + 0.195 0.231 0.414 0.139 0.032 0.214 0.309 0.275 0.134 0.245 + 0.478 0.299 0.465 0.380 0.264 0.264 0.380 0.295 0.349 0.243 + 0.509 0.176 0.521 0.282 0.259 0.349 0.299 0.369 0.302 0.412 + + 450 iasi_metop-a 3175 0.776958E-01 + 0.168 0.042 0.027 0.102 0.226 0.161 0.130 0.220 0.211 0.176 + 0.112 0.198 0.181 0.416 0.275 0.342 0.279 0.224 0.372 0.219 + 0.318 0.316 0.337 0.327 0.436 0.515 0.475 0.428 0.451 0.511 + -0.536 -0.737 -0.827 -0.563 -0.539 -0.386 -0.551 -0.865 -0.592 -0.633 + -0.533 -1.028 -0.669 -0.525 -0.480 -0.262 -0.410 -0.830 -0.701 -0.545 + -0.710 -0.370 -0.703 -0.553 -0.856 -0.289 -0.740 -0.605 -0.211 -0.806 + -0.437 -0.391 -0.415 -0.471 -0.410 -0.668 -0.676 -0.873 -0.462 -0.788 + -0.928 -0.544 -0.945 -0.560 -0.608 -0.701 -0.382 -0.553 -0.935 -0.354 + -0.547 -0.454 -0.400 -0.773 -0.421 -0.660 -0.267 -0.559 -0.556 -0.712 + + 451 iasi_metop-a 3178 0.698084E-01 + -0.294 -0.319 -0.499 -0.337 -0.150 -0.378 -0.383 -0.292 -0.316 -0.616 + -0.542 -0.543 -0.416 -0.094 -0.549 -0.217 -0.273 -0.510 -0.388 -0.264 + -0.471 -0.413 -0.234 -0.293 -0.311 -0.236 -0.431 -0.241 -0.218 -0.375 + -0.503 -0.689 -0.854 -0.600 -0.427 -0.275 -0.601 -0.680 -0.460 -0.465 + -0.505 -0.837 -0.561 -0.343 -0.395 -0.209 -0.282 -0.680 -0.653 -0.473 + -0.779 -0.425 -0.681 -0.355 -0.757 -0.233 -0.756 -0.486 -0.084 -0.524 + -0.413 -0.240 -0.427 -0.448 -0.304 -0.532 -0.519 -0.767 -0.469 -0.674 + -0.645 -0.380 -0.592 -0.404 -0.322 -0.746 -0.406 -0.483 -0.773 -0.292 + -0.482 -0.650 -0.381 -0.654 -0.509 -0.571 -0.221 -0.428 -0.579 -0.618 + + 452 iasi_metop-a 3189 0.595511E-01 + 0.137 -0.011 0.009 0.024 0.246 0.013 -0.140 0.099 -0.022 -0.280 + -0.275 -0.267 -0.029 0.088 -0.238 -0.002 -0.008 -0.236 -0.075 0.000 + -0.332 -0.170 0.009 0.006 -0.110 -0.085 -0.287 -0.124 -0.103 -0.132 + 0.171 0.202 -0.058 0.095 0.315 0.315 0.060 -0.027 0.039 0.122 + 0.316 0.097 -0.020 0.178 0.305 0.478 0.396 0.049 0.178 0.240 + 0.141 0.279 -0.032 0.200 -0.030 0.509 -0.034 0.237 0.367 -0.016 + 0.193 0.468 0.043 0.198 0.379 -0.024 0.235 -0.060 0.238 -0.095 + -0.052 0.158 0.080 0.195 0.329 -0.069 0.042 0.010 -0.085 0.199 + 0.118 -0.032 0.309 -0.063 0.095 0.062 0.318 0.302 0.075 0.051 + + 453 iasi_metop-a 3207 0.821142E-01 + 0.154 0.198 0.042 0.042 0.267 0.237 0.014 0.295 0.234 0.027 + -0.060 -0.096 0.084 0.296 0.044 0.220 0.302 0.010 0.276 0.197 + 0.005 0.102 0.281 0.233 0.230 0.419 0.248 0.344 0.289 0.293 + -0.109 -0.325 -0.376 -0.157 -0.200 -0.062 -0.085 -0.557 -0.201 -0.381 + -0.108 -0.669 -0.222 -0.211 -0.136 0.112 -0.163 -0.443 -0.373 -0.115 + -0.306 -0.016 -0.408 -0.231 -0.408 -0.068 -0.153 -0.281 0.183 -0.562 + -0.150 -0.129 -0.104 -0.153 0.000 -0.325 -0.273 -0.522 -0.210 -0.478 + -0.528 -0.187 -0.495 -0.114 -0.293 -0.331 0.111 -0.282 -0.454 0.009 + -0.182 -0.165 -0.122 -0.494 -0.026 -0.225 0.109 -0.149 -0.238 -0.269 + + 454 iasi_metop-a 3228 0.810235E-01 + 0.136 0.172 0.048 0.102 0.196 0.118 0.055 0.125 0.195 -0.096 + -0.058 -0.102 -0.024 0.263 -0.007 0.224 0.197 -0.122 0.050 0.094 + -0.047 0.072 0.139 0.043 0.121 0.137 0.076 0.138 0.161 0.021 + 0.056 -0.138 -0.154 0.138 -0.022 0.131 0.087 -0.313 0.027 -0.126 + 0.265 -0.442 -0.098 0.001 0.111 0.352 0.015 -0.281 -0.056 0.079 + -0.159 0.212 -0.188 0.082 -0.239 0.139 0.011 -0.081 0.210 -0.288 + 0.131 0.244 0.054 0.042 0.208 -0.063 -0.054 -0.342 0.062 -0.234 + -0.261 -0.044 -0.301 0.149 -0.036 -0.139 0.279 -0.062 -0.270 0.163 + -0.010 0.067 0.156 -0.312 0.220 -0.026 0.324 0.077 -0.003 -0.001 + + 455 iasi_metop-a 3244 0.897827E-01 + 0.237 0.244 0.149 0.018 -0.021 0.102 0.113 0.280 0.228 0.089 + 0.103 0.008 0.101 0.338 0.141 0.316 0.308 -0.032 0.206 0.328 + 0.143 0.277 0.299 0.273 0.294 0.338 0.290 0.380 0.346 0.176 + -0.055 -0.172 -0.204 0.283 -0.132 -0.025 0.309 -0.286 -0.184 -0.051 + -0.102 0.024 0.004 -0.140 -0.131 0.189 0.028 0.062 -0.242 0.073 + 0.145 0.072 -0.142 -0.042 -0.205 0.168 0.175 0.132 0.150 -0.441 + -0.102 -0.001 0.113 -0.088 0.196 -0.223 -0.083 -0.334 -0.059 -0.098 + -0.467 -0.194 -0.032 0.151 -0.038 -0.047 0.020 0.151 -0.031 0.057 + 0.086 0.084 0.038 -0.147 0.194 -0.010 0.318 0.009 -0.298 0.169 + + 456 iasi_metop-a 3248 0.427352E-01 + 0.855 0.751 0.926 0.986 0.624 0.592 0.777 0.641 0.650 0.434 + 0.502 0.564 0.685 0.639 0.535 0.691 0.660 0.400 0.316 0.654 + 0.498 0.547 0.466 0.454 0.414 0.422 0.360 0.334 0.502 0.347 + 0.851 0.769 1.056 0.687 0.868 1.121 0.880 0.728 0.778 0.813 + 0.863 0.872 0.744 0.866 0.851 0.778 0.627 0.747 0.894 0.893 + 0.896 0.813 1.143 0.781 0.758 0.809 0.788 0.825 0.967 0.930 + 0.707 0.771 0.955 0.599 0.737 0.810 0.722 0.748 0.605 0.832 + 0.827 0.833 1.004 0.918 0.650 0.692 1.002 0.879 0.905 0.798 + 0.953 0.872 0.777 0.882 0.741 0.826 0.735 0.836 0.936 0.979 + + 457 iasi_metop-a 3252 0.869330E-01 + 0.479 0.503 0.424 0.480 0.448 0.496 0.530 0.629 0.560 0.629 + 0.623 0.655 0.666 0.821 0.676 0.720 0.677 0.561 0.750 0.718 + 0.721 0.701 0.700 0.778 0.781 0.853 0.926 0.854 0.804 0.895 + -0.142 -0.168 -0.059 0.267 -0.152 -0.112 0.132 -0.167 -0.099 -0.355 + -0.277 -0.055 -0.216 -0.350 -0.172 0.067 -0.132 -0.049 -0.443 -0.055 + -0.051 -0.006 -0.230 -0.127 -0.322 0.002 -0.136 -0.070 0.020 -0.520 + -0.025 -0.071 -0.058 -0.243 -0.023 -0.325 -0.192 -0.259 -0.055 -0.159 + -0.478 -0.182 -0.200 0.067 -0.068 -0.265 -0.098 0.056 -0.046 -0.130 + 0.143 -0.011 -0.010 -0.240 0.027 -0.040 0.035 -0.047 -0.368 0.002 + + 458 iasi_metop-a 3256 0.864272E-01 + 0.042 -0.046 -0.074 0.011 -0.180 -0.116 0.041 0.070 0.045 -0.006 + -0.086 -0.034 0.132 0.148 0.054 0.236 0.162 -0.176 -0.054 0.048 + 0.046 -0.006 0.011 -0.082 0.066 0.003 -0.017 0.007 0.077 -0.037 + -0.162 -0.283 -0.116 0.127 -0.137 -0.075 0.126 -0.322 -0.145 -0.359 + -0.222 -0.011 -0.300 -0.366 -0.345 0.147 -0.144 -0.135 -0.438 -0.182 + -0.064 0.010 -0.292 -0.165 -0.344 0.019 -0.099 -0.089 -0.090 -0.546 + -0.111 -0.121 -0.113 -0.214 -0.053 -0.304 -0.300 -0.302 -0.139 -0.288 + -0.570 -0.275 -0.170 0.006 -0.105 -0.225 -0.200 0.031 -0.116 -0.128 + 0.032 -0.101 -0.071 -0.382 0.016 -0.095 0.054 -0.132 -0.388 -0.012 + + 459 iasi_metop-a 3263 0.805941E-01 + -0.211 -0.250 -0.406 -0.189 -0.174 -0.266 -0.193 -0.154 -0.103 -0.344 + -0.274 -0.280 -0.048 -0.008 -0.137 0.120 -0.011 -0.297 -0.212 -0.126 + -0.120 -0.178 -0.150 -0.231 -0.107 -0.062 -0.070 -0.074 -0.015 -0.076 + -0.514 -0.777 -0.888 -0.660 -0.630 -0.442 -0.529 -0.998 -0.528 -0.699 + -0.552 -1.066 -0.717 -0.540 -0.559 -0.319 -0.455 -0.842 -0.762 -0.597 + -0.728 -0.359 -0.785 -0.595 -0.901 -0.373 -0.697 -0.753 -0.281 -0.850 + -0.453 -0.486 -0.434 -0.557 -0.452 -0.703 -0.649 -0.948 -0.575 -0.796 + -0.917 -0.565 -1.007 -0.569 -0.742 -0.783 -0.352 -0.636 -0.933 -0.419 + -0.534 -0.482 -0.458 -0.923 -0.445 -0.571 -0.279 -0.615 -0.608 -0.683 + + 460 iasi_metop-a 3281 0.563473E-01 + 0.171 0.173 0.131 0.197 -0.022 0.000 -0.005 0.093 -0.041 -0.168 + -0.151 -0.136 -0.153 0.102 -0.207 0.038 -0.126 -0.363 -0.193 0.032 + -0.231 -0.125 -0.075 -0.076 -0.169 -0.115 -0.294 -0.136 -0.108 -0.317 + 0.073 0.101 0.068 0.052 0.147 0.276 0.079 -0.145 0.024 0.019 + -0.022 0.255 -0.033 0.114 0.103 0.251 -0.199 0.065 0.026 -0.023 + 0.046 0.337 0.149 -0.060 -0.079 0.155 0.069 -0.170 0.320 0.102 + 0.007 -0.097 0.195 -0.081 0.013 -0.098 0.050 -0.031 -0.064 0.030 + 0.040 0.128 0.263 0.133 0.047 0.004 0.140 0.173 0.036 0.027 + 0.256 -0.018 0.258 0.126 0.246 0.153 0.207 0.149 0.081 0.206 + + 461 iasi_metop-a 3295 0.737308E-01 + 0.107 -0.104 -0.090 0.047 0.191 0.056 0.169 0.175 0.167 0.080 + 0.040 0.073 0.086 0.348 0.192 0.294 0.170 0.118 0.237 0.110 + 0.220 0.192 0.241 0.193 0.278 0.367 0.321 0.311 0.297 0.369 + -0.468 -0.593 -0.714 -0.492 -0.354 -0.188 -0.376 -0.725 -0.385 -0.522 + -0.334 -0.802 -0.540 -0.207 -0.292 -0.082 -0.149 -0.694 -0.518 -0.413 + -0.556 -0.267 -0.590 -0.248 -0.585 0.007 -0.584 -0.393 0.051 -0.488 + -0.265 -0.089 -0.265 -0.264 -0.295 -0.472 -0.483 -0.621 -0.282 -0.559 + -0.637 -0.367 -0.627 -0.324 -0.380 -0.606 -0.278 -0.374 -0.793 -0.253 + -0.392 -0.428 -0.273 -0.652 -0.333 -0.509 -0.151 -0.348 -0.428 -0.581 + + 462 iasi_metop-a 3303 0.841852E-01 + -0.318 -0.106 -0.431 -0.389 -0.187 -0.242 -0.406 -0.150 -0.164 -0.493 + -0.420 -0.516 -0.326 -0.082 -0.384 -0.216 -0.148 -0.546 -0.159 -0.157 + -0.384 -0.271 -0.163 -0.176 -0.241 -0.167 -0.306 -0.131 -0.173 -0.228 + -0.482 -0.681 -0.741 -0.401 -0.628 -0.470 -0.418 -0.838 -0.588 -0.666 + -0.427 -0.950 -0.578 -0.526 -0.546 -0.130 -0.429 -0.671 -0.749 -0.439 + -0.504 -0.324 -0.796 -0.656 -0.677 -0.482 -0.561 -0.567 -0.356 -0.745 + -0.485 -0.445 -0.378 -0.473 -0.320 -0.641 -0.586 -0.922 -0.509 -0.766 + -1.003 -0.382 -0.782 -0.465 -0.699 -0.687 -0.277 -0.616 -0.793 -0.225 + -0.467 -0.546 -0.416 -0.822 -0.287 -0.578 -0.165 -0.517 -0.594 -0.529 + + 463 iasi_metop-a 3309 0.546380E-01 + 0.280 0.241 0.351 0.335 0.121 0.126 0.160 0.253 0.161 -0.050 + 0.050 -0.006 -0.040 0.226 -0.066 0.147 0.079 -0.261 -0.079 0.172 + -0.050 0.031 0.050 0.045 -0.033 -0.063 -0.130 -0.053 -0.011 -0.165 + 0.310 0.290 0.495 0.311 0.363 0.437 0.229 0.095 0.297 0.236 + 0.205 0.535 0.282 0.250 0.342 0.411 0.089 0.282 0.392 0.440 + 0.292 0.548 0.491 0.216 0.217 0.370 0.339 0.109 0.629 0.391 + 0.175 0.220 0.460 0.168 0.207 0.210 0.290 0.252 0.140 0.352 + 0.374 0.311 0.546 0.439 0.397 0.265 0.428 0.488 0.346 0.288 + 0.547 0.249 0.530 0.300 0.459 0.408 0.397 0.394 0.347 0.489 + + 464 iasi_metop-a 3312 0.891619E-01 + 0.203 0.109 0.045 0.105 0.138 0.210 0.150 0.333 0.231 0.308 + 0.308 0.207 0.285 0.448 0.322 0.372 0.279 0.194 0.359 0.285 + 0.433 0.349 0.313 0.306 0.432 0.501 0.476 0.458 0.447 0.511 + -0.319 -0.473 -0.341 0.011 -0.499 -0.352 -0.165 -0.538 -0.468 -0.524 + -0.477 -0.223 -0.466 -0.588 -0.489 -0.138 -0.325 -0.289 -0.642 -0.448 + -0.276 -0.312 -0.538 -0.374 -0.647 -0.206 -0.258 -0.406 -0.225 -0.735 + -0.269 -0.389 -0.283 -0.397 -0.264 -0.657 -0.547 -0.537 -0.409 -0.472 + -0.772 -0.469 -0.377 -0.273 -0.210 -0.400 -0.470 -0.232 -0.336 -0.314 + -0.194 -0.327 -0.374 -0.531 -0.271 -0.338 -0.117 -0.364 -0.632 -0.320 + + 465 iasi_metop-a 3322 0.852203E-01 + -0.085 -0.117 -0.206 -0.130 -0.147 -0.150 -0.100 -0.021 -0.059 -0.272 + -0.215 -0.241 -0.013 -0.008 -0.127 0.081 -0.021 -0.339 -0.269 -0.156 + -0.188 -0.182 -0.177 -0.245 -0.148 -0.133 -0.221 -0.198 -0.074 -0.181 + -0.186 -0.359 -0.384 -0.068 -0.353 -0.169 -0.043 -0.451 -0.234 -0.336 + -0.084 -0.628 -0.215 -0.167 -0.193 0.231 -0.075 -0.317 -0.394 -0.045 + -0.213 0.047 -0.451 -0.207 -0.252 -0.192 -0.148 -0.196 -0.015 -0.462 + -0.107 -0.060 -0.043 -0.093 -0.094 -0.275 -0.211 -0.632 -0.032 -0.329 + -0.733 -0.147 -0.495 -0.035 -0.415 -0.348 0.051 -0.266 -0.459 0.171 + -0.082 -0.185 -0.150 -0.506 0.022 -0.234 0.126 -0.195 -0.296 -0.179 + + 466 iasi_metop-a 3326 0.671287E-01 + 0.172 0.092 0.155 0.184 -0.016 0.024 0.035 0.190 0.076 -0.069 + 0.067 -0.059 0.017 0.244 -0.033 0.208 0.106 -0.197 0.002 0.237 + -0.051 0.132 0.145 0.103 0.146 0.083 0.128 0.187 0.215 0.016 + -0.060 -0.016 -0.004 0.070 0.062 0.123 0.106 -0.212 -0.055 -0.014 + 0.036 0.165 0.033 -0.056 -0.082 0.139 -0.124 0.023 -0.069 -0.016 + -0.016 0.242 0.039 -0.123 -0.079 0.137 -0.029 -0.130 0.319 -0.006 + 0.002 -0.046 0.138 -0.168 0.084 -0.129 -0.072 -0.006 -0.078 -0.054 + -0.113 0.076 0.136 0.101 -0.036 -0.016 0.097 0.169 0.059 -0.058 + 0.264 -0.017 0.270 0.005 0.092 0.238 0.134 0.070 0.058 0.182 + + 467 iasi_metop-a 3354 0.698810E-01 + 0.595 0.288 0.437 0.507 0.572 0.408 0.442 0.375 0.370 0.347 + 0.285 0.309 0.410 0.549 0.354 0.462 0.372 0.228 0.399 0.295 + 0.388 0.286 0.345 0.264 0.353 0.416 0.291 0.277 0.353 0.382 + 0.531 0.418 0.189 0.519 0.599 0.723 0.424 0.456 0.696 0.472 + 0.615 0.308 0.458 0.511 0.760 0.809 0.828 0.391 0.493 0.623 + 0.335 0.567 0.413 0.685 0.283 0.816 0.301 0.521 0.868 0.325 + 0.614 0.660 0.593 0.700 0.723 0.327 0.485 0.281 0.711 0.320 + 0.345 0.625 0.513 0.687 0.640 0.230 0.578 0.322 0.234 0.672 + 0.517 0.361 0.669 0.299 0.507 0.413 0.774 0.658 0.413 0.428 + + 468 iasi_metop-a 3366 0.866489E-01 + 0.200 0.420 0.055 0.067 0.229 0.311 0.141 0.453 0.385 0.119 + 0.165 0.088 0.271 0.447 0.263 0.485 0.542 0.178 0.463 0.527 + 0.323 0.448 0.525 0.566 0.553 0.637 0.579 0.752 0.641 0.632 + -0.361 -0.505 -0.521 -0.126 -0.364 -0.340 -0.259 -0.635 -0.516 -0.473 + -0.249 -0.636 -0.248 -0.291 -0.326 -0.062 -0.305 -0.372 -0.497 -0.266 + -0.331 -0.091 -0.611 -0.381 -0.503 -0.348 -0.166 -0.391 -0.086 -0.629 + -0.296 -0.222 -0.111 -0.255 -0.127 -0.459 -0.346 -0.561 -0.308 -0.488 + -0.779 -0.318 -0.600 -0.233 -0.360 -0.448 -0.141 -0.352 -0.442 -0.027 + -0.295 -0.332 -0.243 -0.564 -0.191 -0.369 -0.020 -0.347 -0.489 -0.349 + + 469 iasi_metop-a 3375 0.865836E-01 + -0.248 -0.109 -0.404 -0.420 -0.297 -0.248 -0.282 -0.145 -0.138 -0.386 + -0.304 -0.426 -0.210 -0.096 -0.261 -0.051 -0.109 -0.439 -0.335 -0.129 + -0.221 -0.175 -0.081 -0.311 -0.166 -0.145 -0.142 -0.122 -0.060 -0.200 + -0.518 -0.695 -0.731 -0.221 -0.656 -0.546 -0.395 -0.798 -0.530 -0.641 + -0.373 -0.910 -0.536 -0.490 -0.527 -0.143 -0.453 -0.586 -0.680 -0.378 + -0.474 -0.213 -0.750 -0.553 -0.582 -0.596 -0.451 -0.461 -0.305 -0.785 + -0.491 -0.368 -0.294 -0.340 -0.273 -0.579 -0.591 -0.870 -0.475 -0.649 + -0.912 -0.437 -0.714 -0.417 -0.625 -0.675 -0.283 -0.546 -0.716 -0.167 + -0.559 -0.474 -0.362 -0.784 -0.373 -0.500 -0.213 -0.638 -0.605 -0.453 + + 470 iasi_metop-a 3378 0.839071E-01 + 0.029 0.094 0.088 -0.061 -0.216 -0.107 -0.115 0.011 -0.024 -0.176 + -0.172 -0.182 -0.098 0.097 -0.113 -0.024 -0.017 -0.398 -0.225 -0.044 + -0.203 -0.064 -0.050 -0.184 -0.166 -0.150 -0.119 -0.146 -0.058 -0.212 + 0.059 -0.099 0.037 0.297 -0.011 0.070 0.263 -0.027 0.001 -0.174 + -0.108 0.207 -0.059 -0.195 -0.091 0.283 0.059 0.123 -0.131 0.063 + 0.141 0.118 -0.064 0.032 -0.210 0.133 0.214 -0.076 0.210 -0.297 + 0.037 0.000 0.064 -0.088 0.120 -0.207 0.013 -0.145 0.040 -0.044 + -0.303 -0.031 -0.004 0.169 0.154 -0.013 -0.008 0.170 0.050 -0.023 + 0.184 0.106 0.156 -0.189 0.115 0.086 0.224 0.066 -0.216 0.200 + + 471 iasi_metop-a 3411 0.888569E-01 + 0.021 -0.064 -0.141 -0.109 -0.127 -0.033 0.036 0.116 0.061 -0.021 + 0.020 -0.011 0.146 0.137 0.157 0.304 0.237 -0.074 -0.002 0.102 + 0.152 0.090 0.127 0.063 0.163 0.207 0.160 0.209 0.244 0.178 + -0.432 -0.353 -0.609 0.029 -0.404 -0.281 -0.120 -0.665 -0.440 -0.555 + -0.283 -0.585 -0.328 -0.434 -0.379 -0.080 -0.276 -0.321 -0.508 -0.259 + -0.283 -0.170 -0.517 -0.374 -0.460 -0.240 -0.081 -0.347 -0.232 -0.753 + -0.363 -0.289 -0.085 -0.181 -0.020 -0.394 -0.529 -0.619 -0.167 -0.544 + -0.857 -0.383 -0.512 -0.236 -0.420 -0.395 -0.171 -0.270 -0.402 -0.041 + -0.320 -0.316 -0.207 -0.546 -0.136 -0.308 -0.015 -0.287 -0.488 -0.237 + + 472 iasi_metop-a 3416 0.539682E-01 + 0.285 0.282 0.315 0.360 0.078 0.136 0.202 0.211 0.203 -0.018 + 0.085 0.062 0.157 0.262 0.020 0.236 0.127 -0.132 -0.110 0.231 + -0.004 0.097 0.078 -0.051 0.022 0.019 -0.006 -0.033 0.156 -0.088 + 0.158 0.098 0.229 0.203 0.314 0.273 0.198 0.007 0.103 0.042 + 0.109 0.322 0.065 0.136 0.169 0.342 -0.054 0.142 0.159 0.219 + 0.089 0.489 0.167 0.003 0.069 0.278 0.131 -0.045 0.468 0.092 + 0.132 0.071 0.260 0.020 0.146 0.075 0.105 -0.001 -0.002 0.210 + 0.170 0.143 0.351 0.268 0.077 0.074 0.163 0.392 0.177 0.088 + 0.541 0.140 0.299 0.157 0.334 0.339 0.243 0.264 0.245 0.359 + + 473 iasi_metop-a 3432 0.841962E-01 + 0.197 0.083 0.106 0.083 0.214 0.190 0.158 0.229 0.285 0.194 + 0.240 0.156 0.216 0.386 0.341 0.413 0.317 0.109 0.354 0.215 + 0.358 0.332 0.359 0.297 0.367 0.434 0.452 0.408 0.410 0.447 + -0.225 -0.487 -0.475 -0.150 -0.430 -0.219 -0.138 -0.622 -0.320 -0.489 + -0.164 -0.745 -0.278 -0.269 -0.223 0.068 -0.178 -0.437 -0.564 -0.175 + -0.353 -0.047 -0.504 -0.372 -0.400 -0.289 -0.268 -0.319 -0.037 -0.544 + -0.318 -0.183 -0.111 -0.178 -0.084 -0.328 -0.353 -0.647 -0.204 -0.374 + -0.847 -0.128 -0.635 -0.225 -0.451 -0.468 -0.061 -0.324 -0.649 0.005 + -0.166 -0.254 -0.165 -0.570 -0.144 -0.338 0.008 -0.219 -0.378 -0.294 + + 474 iasi_metop-a 3438 0.894349E-01 + -0.186 -0.134 -0.175 -0.322 -0.295 -0.204 -0.174 -0.085 -0.097 -0.270 + -0.184 -0.300 -0.191 -0.043 -0.216 -0.067 -0.098 -0.345 -0.166 -0.047 + -0.169 -0.056 -0.011 -0.189 -0.051 -0.082 -0.072 -0.010 0.010 -0.172 + -0.465 -0.341 -0.586 0.067 -0.484 -0.297 -0.067 -0.628 -0.479 -0.580 + -0.340 -0.422 -0.232 -0.483 -0.493 -0.075 -0.239 -0.314 -0.504 -0.240 + -0.228 -0.169 -0.457 -0.351 -0.605 -0.170 -0.118 -0.342 -0.270 -0.799 + -0.394 -0.329 -0.083 -0.404 -0.083 -0.494 -0.457 -0.687 -0.325 -0.479 + -0.945 -0.413 -0.406 -0.182 -0.315 -0.388 -0.295 -0.252 -0.298 -0.108 + -0.313 -0.367 -0.208 -0.486 -0.228 -0.285 -0.028 -0.330 -0.717 -0.292 + + 475 iasi_metop-a 3440 0.885365E-01 + -0.193 -0.284 -0.339 -0.367 -0.333 -0.333 -0.285 -0.208 -0.200 -0.351 + -0.271 -0.347 -0.193 -0.090 -0.324 -0.071 -0.084 -0.479 -0.331 -0.141 + -0.250 -0.184 -0.177 -0.318 -0.169 -0.204 -0.146 -0.174 -0.079 -0.232 + -0.324 -0.558 -0.397 -0.072 -0.447 -0.443 -0.121 -0.454 -0.509 -0.644 + -0.599 -0.214 -0.361 -0.599 -0.504 -0.200 -0.301 -0.398 -0.663 -0.389 + -0.238 -0.151 -0.539 -0.408 -0.585 -0.224 -0.323 -0.456 -0.213 -0.777 + -0.360 -0.378 -0.234 -0.535 -0.285 -0.489 -0.520 -0.620 -0.356 -0.502 + -0.843 -0.534 -0.427 -0.250 -0.259 -0.555 -0.445 -0.149 -0.388 -0.291 + -0.187 -0.433 -0.355 -0.564 -0.298 -0.348 -0.101 -0.433 -0.696 -0.292 + + 476 iasi_metop-a 3442 0.659320E-01 + -0.433 -0.535 -0.531 -0.455 -0.531 -0.584 -0.456 -0.348 -0.411 -0.597 + -0.436 -0.388 -0.293 -0.363 -0.443 -0.092 -0.227 -0.567 -0.462 -0.237 + -0.313 -0.390 -0.325 -0.376 -0.309 -0.320 -0.283 -0.281 -0.195 -0.331 + -0.584 -0.720 -0.720 -0.399 -0.525 -0.552 -0.601 -0.717 -0.691 -0.626 + -0.777 -0.417 -0.626 -0.585 -0.584 -0.392 -0.663 -0.632 -0.773 -0.536 + -0.588 -0.374 -0.657 -0.717 -0.741 -0.492 -0.639 -0.662 -0.210 -0.561 + -0.629 -0.715 -0.422 -0.755 -0.696 -0.567 -0.480 -0.672 -0.805 -0.602 + -0.625 -0.449 -0.502 -0.457 -0.530 -0.641 -0.476 -0.388 -0.508 -0.559 + -0.384 -0.620 -0.254 -0.539 -0.376 -0.383 -0.397 -0.583 -0.477 -0.388 + + 477 iasi_metop-a 3444 0.445541E-01 + -0.093 -0.214 -0.124 -0.028 -0.105 -0.262 -0.172 -0.161 -0.269 -0.272 + -0.255 -0.241 -0.210 -0.177 -0.209 -0.184 -0.219 -0.396 -0.284 -0.205 + -0.219 -0.275 -0.279 -0.276 -0.282 -0.315 -0.352 -0.324 -0.255 -0.338 + -0.190 -0.179 -0.041 -0.159 -0.135 0.049 -0.162 -0.254 -0.201 -0.175 + -0.118 -0.089 -0.217 -0.120 -0.030 -0.054 -0.261 -0.118 -0.062 0.021 + -0.001 0.024 -0.007 -0.230 -0.225 -0.111 -0.139 -0.175 0.063 -0.024 + -0.168 -0.237 0.049 -0.202 -0.227 -0.239 -0.073 -0.082 -0.126 -0.108 + 0.068 -0.163 0.139 0.060 -0.100 -0.228 0.062 -0.028 -0.013 -0.055 + 0.202 -0.175 0.051 -0.092 -0.046 -0.028 -0.086 -0.179 -0.060 -0.007 + + 478 iasi_metop-a 3446 0.760885E-01 + -0.273 -0.362 -0.324 -0.305 -0.370 -0.334 -0.313 -0.104 -0.261 -0.205 + -0.177 -0.181 -0.256 -0.025 -0.230 -0.151 -0.192 -0.280 -0.127 -0.197 + -0.160 -0.099 -0.142 -0.085 -0.061 0.055 -0.020 -0.062 -0.076 0.011 + -0.622 -0.660 -0.570 -0.342 -0.626 -0.564 -0.445 -0.700 -0.728 -0.605 + -0.712 -0.334 -0.551 -0.625 -0.502 -0.374 -0.710 -0.651 -0.802 -0.414 + -0.567 -0.358 -0.603 -0.702 -0.771 -0.445 -0.677 -0.606 -0.110 -0.562 + -0.574 -0.514 -0.515 -0.730 -0.513 -0.609 -0.560 -0.617 -0.740 -0.453 + -0.674 -0.463 -0.542 -0.352 -0.542 -0.677 -0.283 -0.297 -0.501 -0.679 + -0.402 -0.521 -0.284 -0.497 -0.361 -0.299 -0.344 -0.457 -0.585 -0.281 + + 479 iasi_metop-a 3448 0.507029E-01 + -0.066 -0.297 -0.118 0.070 -0.214 -0.218 -0.187 -0.095 -0.234 -0.289 + -0.246 -0.215 -0.115 -0.120 -0.186 -0.105 -0.286 -0.399 -0.303 -0.181 + -0.142 -0.242 -0.237 -0.218 -0.229 -0.293 -0.396 -0.256 -0.229 -0.305 + -0.075 -0.170 -0.069 -0.162 -0.114 -0.053 -0.100 -0.277 -0.182 -0.127 + -0.035 -0.069 -0.050 -0.210 -0.116 0.004 -0.248 -0.284 -0.222 0.040 + 0.025 0.120 0.023 -0.229 -0.066 -0.147 -0.293 -0.127 -0.128 0.039 + -0.164 -0.115 -0.013 -0.315 -0.189 -0.072 -0.057 -0.169 -0.209 0.010 + 0.145 -0.097 0.169 0.147 -0.051 -0.206 0.167 0.004 -0.034 -0.039 + 0.154 -0.088 0.071 -0.002 0.031 0.078 -0.026 -0.044 -0.059 0.181 + + 480 iasi_metop-a 3450 0.492039E-01 + 0.498 0.370 0.494 0.476 0.337 0.271 0.291 0.323 0.247 0.266 + 0.204 0.305 0.218 0.350 0.231 0.313 0.181 0.084 0.259 0.273 + 0.220 0.238 0.188 0.288 0.201 0.198 0.174 0.175 0.146 0.217 + 0.371 0.409 0.460 0.372 0.448 0.574 0.429 0.385 0.331 0.308 + 0.464 0.514 0.283 0.298 0.471 0.467 0.167 0.384 0.416 0.436 + 0.541 0.554 0.666 0.325 0.420 0.446 0.445 0.302 0.703 0.478 + 0.405 0.417 0.580 0.274 0.404 0.339 0.380 0.358 0.232 0.484 + 0.547 0.445 0.655 0.589 0.414 0.324 0.565 0.565 0.489 0.461 + 0.611 0.375 0.555 0.412 0.466 0.524 0.455 0.464 0.405 0.659 + + 481 iasi_metop-a 3452 0.808219E-01 + 0.473 0.346 0.336 0.325 0.296 0.243 0.341 0.472 0.301 0.426 + 0.467 0.433 0.352 0.619 0.468 0.507 0.447 0.328 0.484 0.497 + 0.496 0.488 0.465 0.534 0.508 0.600 0.625 0.574 0.540 0.649 + -0.025 -0.020 0.018 0.225 -0.005 -0.008 0.167 -0.130 -0.126 -0.145 + -0.042 0.200 -0.165 -0.126 0.061 0.189 -0.066 -0.050 -0.076 -0.027 + 0.008 0.141 0.046 -0.105 -0.168 0.158 -0.027 -0.042 0.511 -0.171 + 0.054 0.003 0.035 -0.090 -0.001 -0.169 0.039 -0.052 -0.182 -0.048 + -0.237 0.017 0.124 0.173 -0.029 0.014 0.177 0.307 0.132 -0.094 + 0.255 0.090 0.217 -0.018 0.210 0.203 0.158 0.174 -0.062 0.258 + + 482 iasi_metop-a 3454 0.791577E-01 + 0.254 0.036 0.034 0.111 -0.013 0.024 0.146 0.170 0.137 0.038 + 0.130 0.109 0.222 0.371 0.160 0.325 0.254 -0.046 0.119 0.156 + 0.178 0.160 0.121 0.140 0.175 0.185 0.159 0.221 0.278 0.243 + -0.043 -0.232 -0.118 0.175 -0.007 -0.093 0.161 -0.177 -0.118 -0.248 + -0.135 0.096 -0.125 -0.237 -0.164 0.155 -0.138 -0.090 -0.255 -0.035 + -0.046 0.029 -0.164 -0.143 -0.235 0.087 -0.079 -0.036 0.301 -0.301 + -0.044 -0.079 -0.024 -0.193 -0.011 -0.225 -0.046 -0.173 -0.019 -0.109 + -0.296 -0.061 -0.067 0.079 -0.025 -0.080 0.054 0.268 0.032 -0.135 + 0.194 0.033 0.015 -0.151 0.084 0.051 0.098 0.017 -0.105 0.036 + + 483 iasi_metop-a 3458 0.885923E-01 + 0.322 0.190 0.225 0.229 0.133 0.165 0.284 0.278 0.242 0.253 + 0.194 0.196 0.283 0.371 0.298 0.370 0.353 0.019 0.186 0.199 + 0.254 0.155 0.189 0.119 0.226 0.207 0.155 0.180 0.268 0.191 + 0.205 0.225 0.229 0.576 0.205 0.307 0.550 0.092 0.190 0.196 + 0.271 0.276 0.279 0.157 0.207 0.568 0.332 0.334 0.159 0.367 + 0.345 0.607 0.202 0.302 0.100 0.480 0.491 0.328 0.511 -0.142 + 0.248 0.195 0.477 0.187 0.470 0.074 0.266 0.066 0.253 0.200 + -0.170 0.095 0.236 0.485 0.281 0.269 0.304 0.492 0.291 0.293 + 0.335 0.395 0.352 0.157 0.430 0.318 0.558 0.312 -0.060 0.439 + + 484 iasi_metop-a 3467 0.868875E-01 + 0.416 0.421 0.277 0.318 0.394 0.354 0.382 0.441 0.441 0.225 + 0.278 0.263 0.471 0.477 0.322 0.641 0.579 0.185 0.315 0.403 + 0.365 0.428 0.404 0.362 0.435 0.434 0.423 0.424 0.520 0.398 + 0.154 0.037 -0.032 0.420 -0.063 0.202 0.315 -0.172 0.103 0.016 + 0.347 -0.204 0.103 0.225 0.191 0.575 0.242 0.100 0.030 0.319 + 0.189 0.475 -0.030 0.194 0.095 0.118 0.233 0.227 0.485 -0.129 + 0.235 0.298 0.424 0.287 0.408 0.131 0.042 -0.173 0.222 0.058 + -0.222 0.216 -0.135 0.289 -0.009 0.016 0.421 0.164 -0.071 0.487 + 0.229 0.235 0.244 -0.121 0.249 0.099 0.497 0.082 0.082 0.120 + + 485 iasi_metop-a 3476 0.826516E-01 + 0.268 0.350 0.233 0.197 0.270 0.313 0.254 0.327 0.461 0.061 + 0.221 0.058 0.300 0.435 0.213 0.478 0.368 0.089 0.314 0.389 + 0.269 0.350 0.443 0.304 0.333 0.442 0.409 0.415 0.468 0.342 + 0.121 -0.239 -0.238 0.120 -0.040 0.175 0.194 -0.232 0.118 -0.121 + 0.200 -0.457 0.058 0.043 0.124 0.454 0.169 -0.103 -0.050 0.188 + 0.043 0.394 -0.092 0.074 -0.129 0.283 0.060 -0.117 0.301 -0.245 + 0.170 0.200 0.213 0.156 0.215 -0.053 0.040 -0.374 0.178 -0.143 + -0.303 0.106 -0.243 0.143 -0.129 -0.159 0.342 -0.014 -0.235 0.360 + 0.105 0.121 0.176 -0.245 0.280 0.025 0.415 0.104 0.072 0.067 + + 486 iasi_metop-a 3484 0.894477E-01 + 0.453 0.472 0.383 0.336 0.294 0.409 0.359 0.435 0.457 0.295 + 0.289 0.186 0.257 0.546 0.305 0.405 0.481 0.083 0.321 0.455 + 0.283 0.404 0.446 0.337 0.410 0.418 0.271 0.398 0.459 0.307 + 0.329 0.359 0.270 0.736 0.378 0.513 0.702 0.185 0.290 0.202 + 0.437 0.341 0.463 0.364 0.295 0.656 0.425 0.414 0.285 0.495 + 0.479 0.600 0.189 0.383 0.208 0.498 0.596 0.339 0.587 -0.056 + 0.384 0.538 0.657 0.399 0.648 0.284 0.316 0.129 0.400 0.318 + -0.009 0.299 0.382 0.577 0.389 0.343 0.507 0.467 0.392 0.636 + 0.466 0.458 0.453 0.247 0.569 0.354 0.702 0.464 0.107 0.438 + + 487 iasi_metop-a 3491 0.560640E-01 + 0.488 0.440 0.420 0.459 0.408 0.219 0.383 0.449 0.469 0.228 + 0.340 0.372 0.544 0.520 0.293 0.652 0.565 0.211 0.276 0.662 + 0.444 0.480 0.490 0.428 0.512 0.439 0.590 0.567 0.663 0.445 + 0.102 0.124 0.262 0.149 0.238 0.392 0.213 -0.010 0.184 0.035 + 0.090 0.224 0.029 0.085 0.321 0.274 -0.112 0.231 0.060 0.232 + 0.061 0.365 0.295 -0.015 0.131 0.178 0.183 0.022 0.512 0.175 + 0.255 0.114 0.389 0.012 0.108 0.067 0.154 0.088 0.025 0.196 + 0.196 0.233 0.343 0.259 0.181 0.101 0.289 0.346 0.214 0.152 + 0.508 0.089 0.356 0.213 0.266 0.256 0.202 0.185 0.300 0.302 + + 488 iasi_metop-a 3497 0.880671E-01 + 0.361 0.202 0.246 0.268 0.263 0.341 0.338 0.373 0.280 0.333 + 0.361 0.213 0.281 0.506 0.375 0.401 0.314 0.256 0.431 0.212 + 0.391 0.333 0.416 0.361 0.412 0.442 0.410 0.386 0.391 0.407 + -0.002 -0.028 -0.087 0.263 -0.139 0.011 0.226 -0.288 -0.026 -0.172 + 0.103 -0.279 0.029 -0.061 0.030 0.259 0.009 0.024 -0.252 0.135 + -0.033 0.330 -0.271 -0.028 -0.109 0.082 0.207 0.028 0.121 -0.319 + 0.012 0.088 0.253 0.097 0.260 -0.080 -0.176 -0.289 0.130 -0.171 + -0.444 0.107 -0.197 0.057 -0.137 -0.134 0.181 0.018 -0.062 0.278 + 0.033 0.044 0.112 -0.216 0.186 0.002 0.294 -0.081 -0.181 -0.001 + + 489 iasi_metop-a 3499 0.894047E-01 + 0.224 0.244 0.174 0.060 0.037 0.179 0.202 0.216 0.223 0.080 + 0.137 0.043 0.236 0.284 0.088 0.313 0.304 -0.015 0.118 0.291 + 0.129 0.248 0.234 0.088 0.239 0.265 0.285 0.290 0.371 0.179 + -0.043 0.023 -0.112 0.442 -0.009 0.105 0.251 -0.214 -0.133 -0.066 + 0.069 0.029 0.029 -0.085 -0.060 0.309 0.125 0.154 -0.040 0.166 + 0.131 0.269 -0.135 -0.046 -0.215 0.239 0.316 0.023 0.234 -0.401 + -0.018 0.052 0.237 0.014 0.318 -0.098 0.017 -0.182 0.007 -0.074 + -0.415 -0.098 -0.062 0.229 0.052 -0.062 0.050 0.197 0.109 0.229 + 0.114 0.102 0.098 -0.118 0.151 0.083 0.361 0.088 -0.295 0.136 + + 490 iasi_metop-a 3504 0.801436E-01 + 0.121 0.058 0.041 0.096 0.004 -0.032 0.103 0.115 0.133 -0.029 + 0.054 0.054 0.213 0.286 0.041 0.343 0.264 -0.046 0.036 0.202 + 0.081 0.259 0.201 0.109 0.242 0.243 0.286 0.238 0.337 0.188 + 0.181 -0.009 0.050 0.461 0.007 0.034 0.234 0.014 0.006 -0.071 + -0.077 0.355 0.054 -0.087 -0.001 0.325 0.022 -0.072 0.016 0.104 + 0.106 0.084 0.032 0.021 -0.070 0.290 0.081 -0.049 0.374 -0.119 + 0.127 0.005 0.125 -0.059 0.052 -0.024 0.098 -0.034 0.068 0.113 + -0.113 0.147 0.098 0.218 0.114 -0.065 0.075 0.317 0.150 0.016 + 0.258 0.192 0.226 0.028 0.292 0.246 0.231 0.068 -0.085 0.312 + + 491 iasi_metop-a 3506 0.406966E-01 + 1.544 1.263 1.544 1.690 1.163 1.239 1.209 1.225 1.189 1.025 + 0.988 1.042 1.068 1.147 0.948 1.112 0.932 0.738 0.745 0.906 + 0.874 0.789 0.719 0.697 0.702 0.662 0.392 0.430 0.623 0.535 + 1.570 1.561 1.676 1.504 1.601 1.753 1.587 1.450 1.558 1.545 + 1.569 1.592 1.528 1.432 1.630 1.426 1.379 1.529 1.634 1.597 + 1.601 1.599 1.640 1.354 1.469 1.566 1.563 1.492 1.607 1.447 + 1.313 1.347 1.552 1.356 1.424 1.382 1.412 1.399 1.453 1.471 + 1.532 1.490 1.851 1.630 1.446 1.416 1.533 1.468 1.471 1.515 + 1.679 1.459 1.614 1.534 1.556 1.477 1.443 1.473 1.577 1.597 + + 492 iasi_metop-a 3509 0.856369E-01 + 0.842 0.823 0.774 0.841 0.900 0.899 0.930 1.159 0.994 1.078 + 1.133 1.106 1.127 1.224 1.195 1.273 1.283 1.217 1.284 1.302 + 1.345 1.263 1.319 1.353 1.450 1.551 1.678 1.611 1.537 1.614 + -0.117 -0.215 -0.212 0.181 -0.105 -0.165 0.137 -0.262 -0.163 -0.357 + -0.373 -0.037 -0.184 -0.342 -0.173 0.039 -0.179 -0.294 -0.323 -0.127 + -0.124 -0.134 -0.267 -0.260 -0.434 0.071 -0.083 -0.132 0.079 -0.436 + -0.050 -0.216 -0.141 -0.302 -0.027 -0.322 -0.180 -0.247 -0.080 -0.095 + -0.382 -0.087 -0.165 -0.094 -0.075 -0.239 -0.190 0.094 -0.084 -0.140 + 0.101 -0.077 -0.025 -0.180 -0.052 -0.062 0.066 -0.121 -0.356 -0.094 + + 493 iasi_metop-a 3518 0.887848E-01 + 0.122 -0.070 -0.076 -0.017 -0.024 -0.024 0.076 0.055 0.124 -0.023 + -0.099 -0.090 0.209 0.134 0.098 0.192 0.124 -0.147 -0.116 -0.037 + 0.026 -0.015 -0.076 -0.116 0.000 -0.023 -0.147 -0.023 0.030 -0.022 + -0.099 -0.066 -0.246 0.223 -0.154 0.025 0.256 -0.329 -0.201 -0.275 + 0.038 -0.226 -0.050 -0.060 -0.172 0.175 -0.028 -0.151 -0.279 0.028 + -0.030 0.171 -0.299 -0.106 -0.283 0.050 0.231 -0.119 0.078 -0.511 + -0.091 -0.051 0.223 -0.081 0.199 -0.071 -0.227 -0.435 0.058 -0.204 + -0.559 -0.154 -0.283 0.083 -0.080 -0.173 0.117 0.020 -0.111 0.184 + -0.011 -0.055 0.020 -0.246 0.084 -0.079 0.263 -0.024 -0.307 -0.076 + + 494 iasi_metop-a 3527 0.887352E-01 + 0.303 0.233 0.232 0.127 0.146 0.172 0.207 0.271 0.280 0.061 + 0.140 0.050 0.238 0.265 0.103 0.344 0.307 -0.041 0.105 0.266 + 0.115 0.210 0.199 0.073 0.209 0.208 0.204 0.178 0.311 0.105 + 0.148 0.167 0.044 0.520 0.147 0.341 0.365 -0.093 0.109 0.053 + 0.334 -0.030 0.190 0.276 0.219 0.423 0.268 0.175 0.004 0.316 + 0.339 0.635 -0.055 0.205 0.089 0.334 0.470 0.206 0.434 -0.210 + 0.200 0.220 0.463 0.332 0.439 0.100 0.065 -0.126 0.321 0.151 + -0.245 0.279 0.088 0.334 0.086 0.190 0.402 0.284 0.093 0.424 + 0.252 0.194 0.280 0.085 0.398 0.136 0.509 0.184 0.043 0.183 + + 495 iasi_metop-a 3555 0.687806E-01 + 0.072 0.011 0.015 0.051 0.000 -0.034 0.066 0.140 0.138 -0.025 + 0.078 0.045 0.192 0.297 0.054 0.354 0.252 -0.080 0.057 0.295 + 0.151 0.283 0.285 0.197 0.272 0.309 0.352 0.359 0.472 0.250 + -0.189 -0.155 -0.184 0.079 -0.134 -0.075 -0.011 -0.286 -0.205 -0.171 + -0.241 0.113 -0.169 -0.193 -0.090 0.113 -0.296 -0.160 -0.215 -0.202 + -0.127 0.021 -0.112 -0.276 -0.275 0.093 -0.060 -0.249 0.313 -0.222 + -0.193 -0.230 0.029 -0.166 -0.060 -0.098 -0.100 -0.199 -0.330 0.003 + -0.296 0.001 -0.034 0.057 -0.122 -0.190 -0.027 0.183 -0.039 -0.115 + 0.120 -0.024 0.139 -0.100 0.050 0.017 0.009 -0.008 -0.074 0.120 + + 496 iasi_metop-a 3575 0.662966E-01 + 0.026 -0.275 -0.167 -0.039 -0.122 -0.155 -0.104 0.027 -0.106 -0.016 + -0.118 0.011 0.004 0.149 -0.091 0.080 -0.156 -0.164 -0.017 -0.040 + 0.039 -0.011 -0.066 -0.009 0.050 0.018 0.000 -0.008 0.054 0.008 + -0.190 -0.338 -0.446 -0.093 -0.171 -0.173 -0.074 -0.313 -0.200 -0.327 + -0.383 0.135 -0.252 -0.374 -0.242 0.002 -0.410 -0.259 -0.302 -0.126 + -0.120 -0.035 -0.036 -0.222 -0.160 -0.030 -0.229 -0.324 0.302 -0.216 + -0.194 -0.219 -0.065 -0.308 -0.053 -0.153 -0.145 -0.281 -0.228 -0.132 + -0.346 0.061 0.027 0.061 -0.202 -0.302 0.055 0.145 -0.124 -0.245 + -0.017 -0.171 0.105 -0.106 -0.044 0.122 0.013 -0.246 -0.130 0.060 + + 497 iasi_metop-a 3577 0.333818E-01 + 0.474 0.292 0.468 0.560 0.420 0.323 0.401 0.420 0.251 0.276 + 0.241 0.255 0.251 0.293 0.268 0.273 0.065 0.120 0.148 0.223 + 0.186 0.218 0.117 0.191 0.208 0.108 0.084 0.146 0.150 0.098 + 0.318 0.429 0.555 0.278 0.390 0.687 0.368 0.254 0.429 0.459 + 0.365 0.360 0.273 0.395 0.620 0.499 0.265 0.278 0.548 0.500 + 0.537 0.367 0.596 0.274 0.329 0.322 0.353 0.295 0.556 0.612 + 0.232 0.262 0.560 0.257 0.343 0.342 0.331 0.274 0.230 0.381 + 0.433 0.380 0.716 0.569 0.319 0.295 0.354 0.336 0.350 0.372 + 0.494 0.329 0.328 0.327 0.308 0.480 0.278 0.258 0.296 0.453 + + 498 iasi_metop-a 3580 0.713069E-01 + -0.220 -0.300 -0.378 -0.267 -0.186 -0.271 -0.264 -0.039 -0.076 -0.112 + -0.071 0.011 -0.011 0.083 0.058 0.083 0.011 -0.016 0.049 0.022 + 0.103 0.168 0.111 0.216 0.190 0.333 0.351 0.321 0.295 0.347 + -0.867 -0.957 -1.070 -0.750 -0.909 -0.897 -0.918 -1.162 -0.973 -1.087 + -1.010 -0.695 -0.925 -1.076 -0.846 -0.706 -1.131 -1.090 -1.039 -0.760 + -0.999 -0.839 -0.857 -0.981 -0.878 -0.833 -0.827 -0.996 -0.488 -0.771 + -0.962 -1.021 -0.607 -0.992 -0.918 -0.841 -0.897 -1.057 -1.152 -0.753 + -0.955 -0.619 -0.828 -0.548 -0.882 -0.978 -0.636 -0.630 -0.795 -0.923 + -0.716 -0.905 -0.493 -0.744 -0.602 -0.599 -0.638 -0.819 -0.792 -0.587 + + 499 iasi_metop-a 3582 0.401593E-01 + -0.077 -0.196 -0.087 0.089 -0.227 -0.281 -0.178 -0.194 -0.342 -0.279 + -0.336 -0.342 -0.394 -0.284 -0.340 -0.202 -0.447 -0.506 -0.462 -0.356 + -0.438 -0.398 -0.503 -0.349 -0.391 -0.502 -0.590 -0.512 -0.520 -0.529 + -0.097 0.048 0.014 -0.105 0.034 0.157 -0.113 -0.242 -0.132 -0.027 + -0.062 0.086 -0.264 -0.098 -0.066 0.111 -0.230 -0.083 0.077 0.036 + 0.025 -0.029 0.175 -0.149 -0.089 0.014 0.069 -0.142 0.143 0.037 + -0.011 -0.129 0.286 -0.265 -0.154 -0.035 0.003 -0.115 -0.237 0.026 + 0.108 -0.100 0.198 0.137 -0.080 -0.095 0.086 0.110 0.153 -0.027 + 0.108 -0.038 0.115 0.027 -0.052 0.089 -0.087 0.025 -0.024 0.088 + + 500 iasi_metop-a 3586 0.846345E-01 + 0.042 0.002 -0.020 -0.072 -0.147 -0.033 -0.007 0.055 -0.079 0.068 + 0.043 -0.024 -0.056 0.237 -0.008 0.035 0.004 -0.142 0.073 -0.053 + -0.024 0.100 -0.020 0.026 0.068 0.159 0.144 0.102 0.054 0.145 + -0.019 -0.108 -0.062 0.345 -0.048 -0.163 0.125 -0.229 -0.079 -0.244 + -0.307 0.122 -0.147 -0.216 0.018 0.061 -0.081 -0.120 -0.198 -0.005 + 0.001 -0.035 -0.125 -0.109 -0.181 0.060 -0.067 -0.104 0.224 -0.392 + -0.016 -0.085 0.013 -0.155 0.020 -0.147 -0.071 -0.149 -0.028 0.001 + -0.328 -0.109 -0.114 0.060 -0.018 -0.089 0.041 0.185 0.048 -0.061 + 0.233 0.063 0.151 -0.144 0.160 0.137 0.195 -0.034 -0.285 0.110 + + 501 iasi_metop-a 3589 0.369951E-01 + 0.627 0.458 0.671 0.694 0.446 0.365 0.585 0.512 0.453 0.345 + 0.290 0.390 0.456 0.477 0.377 0.490 0.379 0.221 0.099 0.395 + 0.321 0.297 0.198 0.305 0.266 0.181 0.106 0.124 0.252 0.120 + 0.432 0.549 0.505 0.435 0.494 0.728 0.350 0.311 0.524 0.496 + 0.518 0.517 0.379 0.401 0.413 0.453 0.317 0.435 0.553 0.485 + 0.573 0.502 0.628 0.414 0.364 0.402 0.462 0.392 0.565 0.637 + 0.287 0.475 0.666 0.249 0.374 0.374 0.516 0.413 0.291 0.600 + 0.659 0.444 0.672 0.560 0.490 0.243 0.662 0.359 0.469 0.438 + 0.563 0.414 0.457 0.406 0.425 0.530 0.409 0.395 0.453 0.494 + + 502 iasi_metop-a 3599 0.883654E-01 + 0.384 0.294 0.338 0.265 0.307 0.362 0.271 0.431 0.339 0.395 + 0.373 0.382 0.339 0.537 0.436 0.434 0.423 0.324 0.437 0.324 + 0.467 0.512 0.391 0.426 0.528 0.604 0.631 0.584 0.454 0.652 + -0.196 -0.203 -0.126 0.157 -0.171 -0.141 0.186 -0.272 -0.273 -0.270 + -0.090 0.013 -0.111 -0.298 -0.327 0.075 -0.019 -0.055 -0.309 -0.152 + 0.020 0.041 -0.130 -0.094 -0.281 0.027 0.065 -0.038 -0.052 -0.517 + -0.050 -0.084 0.077 -0.248 -0.014 -0.290 -0.181 -0.291 0.006 -0.230 + -0.536 -0.305 -0.200 0.042 -0.137 -0.164 -0.163 0.050 -0.066 -0.077 + 0.010 -0.058 -0.083 -0.360 -0.014 -0.060 0.150 -0.091 -0.353 -0.029 + + 503 iasi_metop-a 3610 0.819586E-01 + -0.151 -0.114 -0.238 -0.161 -0.090 -0.154 -0.088 -0.080 0.011 -0.292 + -0.136 -0.205 0.056 0.043 -0.069 0.197 0.082 -0.257 -0.148 -0.068 + -0.091 -0.050 -0.042 -0.142 -0.046 -0.016 0.036 0.006 0.067 0.003 + -0.315 -0.580 -0.692 -0.289 -0.431 -0.373 -0.321 -0.697 -0.416 -0.524 + -0.280 -0.832 -0.466 -0.375 -0.364 -0.003 -0.305 -0.561 -0.599 -0.331 + -0.406 -0.162 -0.573 -0.443 -0.556 -0.204 -0.412 -0.579 -0.097 -0.645 + -0.319 -0.286 -0.274 -0.278 -0.244 -0.480 -0.439 -0.809 -0.310 -0.552 + -0.761 -0.318 -0.723 -0.321 -0.612 -0.542 -0.074 -0.427 -0.717 -0.163 + -0.292 -0.362 -0.259 -0.655 -0.216 -0.485 -0.054 -0.373 -0.392 -0.454 + + 504 iasi_metop-a 3626 0.832163E-01 + -0.075 -0.074 -0.200 -0.164 -0.217 -0.094 -0.084 -0.121 -0.088 -0.370 + -0.288 -0.295 -0.280 0.014 -0.180 -0.066 -0.172 -0.387 -0.148 -0.092 + -0.265 -0.222 -0.054 -0.192 -0.060 -0.068 -0.171 -0.047 -0.044 -0.234 + -0.371 -0.384 -0.262 -0.035 -0.127 0.009 -0.256 -0.403 -0.036 -0.253 + 0.040 -0.348 -0.097 -0.011 -0.193 0.007 -0.014 -0.195 -0.266 -0.155 + -0.267 0.234 -0.162 -0.013 -0.277 -0.085 0.004 -0.276 0.080 -0.360 + -0.311 -0.192 0.101 0.176 -0.022 -0.195 -0.296 -0.525 0.015 -0.186 + -0.480 -0.284 -0.194 -0.062 -0.244 -0.287 0.086 -0.260 -0.416 0.242 + 0.067 -0.017 -0.156 -0.402 -0.094 -0.249 0.140 -0.120 -0.328 -0.157 + + 505 iasi_metop-a 3638 0.566396E-01 + 0.499 0.379 0.429 0.469 0.353 0.407 0.310 0.412 0.295 0.188 + 0.280 0.237 0.199 0.400 0.261 0.249 0.207 0.077 0.117 0.352 + 0.122 0.247 0.245 0.137 0.204 0.151 0.166 0.233 0.261 0.145 + 0.417 0.319 0.415 0.504 0.373 0.529 0.453 0.326 0.378 0.373 + 0.402 0.512 0.259 0.375 0.468 0.413 0.189 0.476 0.328 0.425 + 0.429 0.620 0.623 0.296 0.265 0.389 0.534 0.295 0.834 0.518 + 0.368 0.354 0.526 0.198 0.333 0.526 0.385 0.313 0.479 0.496 + 0.362 0.501 0.595 0.584 0.380 0.300 0.500 0.492 0.427 0.376 + 0.601 0.285 0.686 0.364 0.608 0.469 0.513 0.484 0.486 0.597 + + 506 iasi_metop-a 3646 0.885617E-01 + 0.423 0.253 0.245 0.221 0.221 0.357 0.362 0.377 0.388 0.435 + 0.401 0.321 0.384 0.548 0.452 0.500 0.453 0.306 0.439 0.396 + 0.506 0.487 0.461 0.413 0.477 0.593 0.527 0.528 0.502 0.623 + -0.209 -0.151 -0.228 0.164 -0.228 -0.094 0.207 -0.397 -0.321 -0.260 + -0.154 -0.159 -0.158 -0.214 -0.135 0.153 -0.154 0.022 -0.308 -0.003 + 0.059 0.006 -0.302 -0.138 -0.266 0.009 0.064 -0.060 -0.053 -0.616 + -0.168 -0.197 0.025 -0.203 0.108 -0.318 -0.234 -0.315 -0.177 -0.315 + -0.554 -0.224 -0.061 -0.006 -0.191 -0.195 -0.158 0.114 -0.066 -0.020 + 0.065 -0.124 -0.098 -0.226 0.091 -0.110 0.205 -0.145 -0.400 0.064 + + 507 iasi_metop-a 3653 0.609031E-01 + -0.345 -0.316 -0.307 -0.218 -0.386 -0.417 -0.176 -0.232 -0.247 -0.484 + -0.404 -0.316 -0.086 -0.110 -0.287 0.058 -0.079 -0.324 -0.323 0.033 + -0.139 -0.103 -0.101 -0.170 -0.078 -0.123 0.002 -0.036 0.015 -0.113 + -0.523 -0.663 -0.409 -0.442 -0.431 -0.475 -0.490 -0.589 -0.440 -0.793 + -0.554 -0.332 -0.562 -0.563 -0.537 -0.302 -0.702 -0.553 -0.452 -0.284 + -0.431 -0.254 -0.303 -0.540 -0.430 -0.453 -0.538 -0.713 -0.238 -0.429 + -0.463 -0.519 -0.236 -0.574 -0.441 -0.378 -0.452 -0.505 -0.680 -0.345 + -0.228 -0.396 -0.338 -0.229 -0.326 -0.537 -0.294 -0.247 -0.345 -0.555 + -0.310 -0.470 -0.217 -0.340 -0.292 -0.245 -0.280 -0.360 -0.344 -0.266 + + 508 iasi_metop-a 3658 0.738872E-01 + -0.495 -0.667 -0.547 -0.490 -0.547 -0.556 -0.492 -0.322 -0.443 -0.443 + -0.414 -0.535 -0.495 -0.303 -0.383 -0.335 -0.535 -0.563 -0.346 -0.489 + -0.340 -0.392 -0.429 -0.359 -0.298 -0.223 -0.277 -0.255 -0.295 -0.293 + -0.688 -0.733 -0.806 -0.430 -0.558 -0.648 -0.601 -0.823 -0.656 -0.843 + -0.755 -0.585 -0.680 -0.730 -0.654 -0.311 -0.740 -0.716 -0.774 -0.566 + -0.684 -0.439 -0.627 -0.837 -0.630 -0.521 -0.713 -0.770 -0.178 -0.590 + -0.785 -0.704 -0.436 -0.816 -0.635 -0.526 -0.565 -0.727 -0.753 -0.582 + -0.768 -0.528 -0.600 -0.470 -0.559 -0.667 -0.550 -0.465 -0.486 -0.695 + -0.406 -0.578 -0.187 -0.566 -0.373 -0.444 -0.253 -0.500 -0.597 -0.345 + + 509 iasi_metop-a 3661 0.452036E-01 + 0.212 0.077 0.204 0.253 0.027 -0.066 0.097 0.092 -0.021 -0.116 + -0.123 -0.006 -0.145 -0.036 -0.047 -0.043 -0.207 -0.285 -0.220 -0.117 + -0.170 -0.170 -0.244 -0.142 -0.182 -0.313 -0.398 -0.301 -0.244 -0.343 + 0.189 0.248 0.383 0.114 0.235 0.410 0.356 0.031 0.308 0.181 + 0.313 0.210 0.125 0.169 0.025 0.210 0.014 0.197 0.272 0.400 + 0.378 0.260 0.613 0.101 0.289 0.230 0.239 0.015 0.378 0.387 + 0.094 0.107 0.460 0.046 -0.004 0.153 0.250 0.187 0.076 0.350 + 0.304 0.200 0.592 0.480 0.167 0.120 0.299 0.348 0.377 0.155 + 0.309 0.222 0.300 0.272 0.272 0.316 0.243 0.168 0.286 0.336 + + 510 iasi_metop-a 3673 0.853309E-01 + 0.243 0.194 0.206 0.175 0.147 0.287 0.256 0.351 0.308 0.283 + 0.324 0.268 0.281 0.419 0.249 0.301 0.277 0.176 0.392 0.166 + 0.343 0.335 0.315 0.300 0.359 0.475 0.421 0.385 0.299 0.468 + 0.007 -0.236 -0.192 0.171 -0.256 0.012 0.124 -0.300 -0.069 -0.167 + 0.062 -0.417 0.014 -0.155 -0.055 0.416 0.090 -0.117 -0.313 0.116 + -0.029 0.264 -0.217 0.009 -0.072 -0.028 0.038 0.024 0.217 -0.326 + -0.009 0.046 0.163 0.084 0.204 -0.079 -0.158 -0.356 0.049 -0.163 + -0.478 0.091 -0.293 0.103 -0.128 -0.175 0.280 -0.085 -0.277 0.327 + 0.035 0.083 0.035 -0.320 0.163 -0.038 0.267 -0.062 -0.150 -0.065 + + 511 iasi_metop-a 3689 0.824888E-01 + 0.057 0.098 -0.081 -0.084 0.006 0.029 -0.010 0.063 0.146 -0.127 + -0.058 -0.144 -0.015 0.171 0.001 0.209 0.117 -0.185 0.104 0.122 + -0.037 0.036 0.181 0.094 0.082 0.117 0.173 0.186 0.178 0.074 + -0.145 -0.331 -0.429 -0.159 -0.325 -0.157 -0.138 -0.465 -0.221 -0.465 + -0.092 -0.644 -0.258 -0.225 -0.183 0.185 -0.089 -0.321 -0.419 -0.102 + -0.218 0.089 -0.342 -0.286 -0.403 -0.104 -0.261 -0.255 0.013 -0.472 + -0.114 -0.126 -0.074 -0.147 -0.039 -0.266 -0.216 -0.605 -0.173 -0.412 + -0.600 -0.113 -0.486 -0.126 -0.383 -0.340 0.071 -0.229 -0.558 0.075 + -0.141 -0.153 -0.119 -0.539 0.010 -0.268 0.148 -0.151 -0.263 -0.273 + + 512 iasi_metop-a 3700 0.454036E-01 + 0.026 0.004 0.103 0.131 -0.018 -0.096 -0.007 -0.015 -0.011 -0.200 + -0.133 -0.155 -0.106 0.159 -0.034 0.105 0.032 -0.228 -0.156 0.198 + -0.105 0.076 0.133 0.003 -0.012 0.010 0.029 0.067 0.175 -0.063 + -0.029 -0.119 0.049 -0.006 -0.067 0.068 -0.103 -0.209 -0.099 -0.191 + -0.136 0.027 -0.212 -0.090 -0.051 -0.041 -0.278 0.017 0.035 0.002 + -0.022 0.162 0.091 -0.175 -0.226 -0.064 -0.042 -0.175 0.185 -0.028 + -0.108 -0.167 0.120 -0.264 -0.046 -0.009 -0.127 -0.190 -0.146 0.058 + -0.007 0.000 0.129 -0.031 -0.089 -0.163 0.075 0.053 -0.006 0.007 + -0.005 -0.118 0.029 -0.015 0.014 0.073 0.007 0.045 0.010 0.131 + + 513 iasi_metop-a 3710 0.827257E-01 + -0.037 -0.094 -0.084 -0.093 -0.042 -0.019 -0.171 -0.013 0.003 -0.094 + -0.031 -0.091 -0.069 0.126 -0.003 0.042 0.032 -0.183 0.075 -0.111 + -0.052 -0.005 0.012 -0.047 0.027 0.137 0.096 0.121 -0.003 0.121 + -0.285 -0.620 -0.638 -0.297 -0.452 -0.336 -0.343 -0.714 -0.452 -0.586 + -0.276 -0.898 -0.385 -0.415 -0.403 -0.055 -0.274 -0.572 -0.616 -0.309 + -0.389 -0.211 -0.575 -0.443 -0.558 -0.317 -0.414 -0.512 -0.142 -0.642 + -0.326 -0.311 -0.211 -0.301 -0.201 -0.480 -0.378 -0.783 -0.294 -0.665 + -0.829 -0.319 -0.693 -0.381 -0.599 -0.537 -0.177 -0.427 -0.669 -0.040 + -0.360 -0.349 -0.310 -0.666 -0.157 -0.418 -0.022 -0.376 -0.434 -0.410 + + 514 iasi_metop-a 3726 0.310898E-01 + 0.266 0.277 0.458 0.426 0.263 0.168 0.273 0.167 0.194 -0.023 + 0.075 0.141 0.142 0.201 0.091 0.320 0.173 -0.135 -0.023 0.287 + -0.021 0.113 0.103 0.134 0.085 -0.018 -0.038 0.066 0.077 -0.060 + 0.314 0.665 0.575 0.183 0.454 0.677 0.137 0.214 0.342 0.385 + 0.504 0.355 0.398 0.261 0.413 0.239 0.269 0.375 0.481 0.463 + 0.411 0.484 0.462 0.153 0.345 0.319 0.513 0.182 0.593 0.584 + 0.318 0.185 0.406 0.186 0.147 0.312 0.474 0.463 0.320 0.247 + 0.390 0.292 0.656 0.422 0.281 0.271 0.440 0.248 0.400 0.322 + 0.517 0.135 0.457 0.352 0.291 0.363 0.222 0.280 0.196 0.356 + + 515 iasi_metop-a 3763 0.686018E-01 + 0.359 0.211 0.325 0.316 0.422 0.349 0.233 0.381 0.357 0.345 + 0.242 0.225 0.301 0.440 0.351 0.434 0.303 0.293 0.323 0.272 + 0.332 0.363 0.366 0.325 0.380 0.553 0.477 0.431 0.390 0.479 + 0.165 0.072 -0.086 0.147 0.307 0.350 0.181 0.003 0.253 0.059 + 0.238 -0.069 0.044 0.156 0.373 0.409 0.391 -0.049 0.099 0.193 + 0.101 0.356 0.027 0.295 -0.072 0.411 -0.145 0.178 0.475 -0.053 + 0.177 0.315 0.235 0.375 0.409 -0.031 0.115 -0.063 0.385 -0.110 + -0.087 0.228 0.115 0.218 0.303 -0.057 0.186 -0.053 -0.157 0.305 + 0.224 -0.145 0.220 -0.023 0.153 -0.026 0.406 0.307 -0.026 0.015 + + 516 iasi_metop-a 3814 0.665783E-01 + -0.077 -0.125 -0.287 -0.200 0.078 -0.101 -0.172 0.049 0.029 -0.276 + -0.283 -0.231 -0.054 0.088 -0.171 0.134 0.191 -0.051 0.120 0.177 + -0.089 0.035 0.207 0.224 0.220 0.232 0.117 0.234 0.278 0.203 + -0.524 -0.489 -0.786 -0.503 -0.327 -0.308 -0.576 -0.737 -0.451 -0.552 + -0.488 -0.674 -0.617 -0.427 -0.483 -0.274 -0.276 -0.648 -0.418 -0.345 + -0.631 -0.324 -0.637 -0.319 -0.711 -0.254 -0.768 -0.317 -0.156 -0.612 + -0.457 -0.266 -0.514 -0.269 -0.237 -0.729 -0.497 -0.743 -0.455 -0.734 + -0.705 -0.366 -0.559 -0.433 -0.314 -0.758 -0.593 -0.557 -0.738 -0.355 + -0.392 -0.706 -0.411 -0.691 -0.451 -0.644 -0.265 -0.315 -0.608 -0.625 + + 517 iasi_metop-a 3841 0.688807E-01 + -0.251 -0.348 -0.490 -0.374 -0.165 -0.343 -0.413 -0.206 -0.265 -0.552 + -0.613 -0.574 -0.355 -0.143 -0.578 -0.245 -0.281 -0.421 -0.347 -0.314 + -0.566 -0.457 -0.296 -0.300 -0.339 -0.250 -0.459 -0.325 -0.298 -0.338 + -0.433 -0.559 -0.668 -0.500 -0.401 -0.196 -0.385 -0.533 -0.370 -0.534 + -0.426 -0.491 -0.532 -0.374 -0.294 -0.108 -0.172 -0.572 -0.455 -0.343 + -0.566 -0.231 -0.488 -0.227 -0.627 -0.180 -0.663 -0.271 0.025 -0.562 + -0.320 -0.205 -0.356 -0.239 -0.217 -0.591 -0.454 -0.668 -0.353 -0.633 + -0.624 -0.372 -0.425 -0.336 -0.265 -0.636 -0.425 -0.447 -0.709 -0.261 + -0.349 -0.651 -0.350 -0.606 -0.571 -0.540 -0.164 -0.301 -0.500 -0.521 + + 518 iasi_metop-a 3888 0.311201E-01 + 0.331 0.371 0.363 0.349 0.302 0.248 0.222 0.226 0.254 -0.031 + -0.013 0.047 0.159 0.224 -0.002 0.109 0.024 -0.092 0.060 0.286 + -0.079 0.048 0.108 0.120 -0.026 -0.010 -0.153 -0.045 0.040 -0.064 + 0.176 0.419 0.596 0.250 0.445 0.723 0.461 0.359 0.405 0.372 + 0.577 0.498 0.230 0.359 0.543 0.277 0.156 0.299 0.643 0.428 + 0.696 0.477 0.629 0.297 0.362 0.486 0.594 0.161 0.651 0.490 + 0.139 0.430 0.603 0.201 0.208 0.358 0.206 0.340 0.434 0.356 + 0.572 0.316 0.687 0.408 0.457 0.414 0.218 0.162 0.449 0.346 + 0.554 0.365 0.460 0.367 0.325 0.487 0.360 0.198 0.384 0.414 + + 519 iasi_metop-a 4032 0.484514E-01 + -0.090 -0.089 -0.075 -0.108 0.122 -0.017 -0.107 0.004 0.015 0.091 + -0.040 0.079 -0.055 0.038 0.031 0.147 0.012 0.083 0.112 0.134 + 0.165 0.130 0.239 0.222 0.204 0.323 0.349 0.347 0.301 0.293 + -0.575 -0.447 -0.879 -0.725 -0.688 -0.493 -0.652 -0.744 -0.686 -0.558 + -0.194 -0.470 -0.524 -0.599 -0.583 -0.634 -0.462 -0.530 -0.591 -0.375 + -0.328 -0.652 -0.327 -0.744 -0.404 -0.506 -0.475 -0.934 -0.505 -0.379 + -0.897 -0.668 -0.343 -0.708 -0.690 -0.415 -0.615 -0.483 -0.425 -0.435 + -0.388 -0.491 -0.276 -0.405 -0.507 -0.422 -0.448 -0.560 -0.336 -0.411 + -0.577 -0.722 -0.311 -0.454 -0.500 -0.470 -0.379 -0.711 -0.480 -0.477 + + 520 iasi_metop-a 4059 0.802807E-01 + -0.195 -0.170 -0.132 -0.196 -0.231 -0.100 -0.334 -0.149 -0.226 -0.216 + -0.335 -0.438 -0.365 -0.074 -0.377 -0.245 -0.351 -0.345 -0.251 -0.538 + -0.346 -0.260 -0.380 -0.368 -0.328 -0.218 -0.413 -0.338 -0.426 -0.267 + -0.250 -0.578 -0.449 -0.052 -0.234 -0.085 -0.170 -0.472 -0.086 -0.313 + -0.186 -0.610 -0.268 -0.262 -0.085 0.155 0.042 -0.423 -0.362 -0.077 + -0.319 0.037 -0.298 -0.062 -0.489 -0.013 -0.219 -0.335 0.372 -0.448 + -0.082 -0.001 -0.064 0.089 -0.034 -0.208 -0.257 -0.554 -0.076 -0.321 + -0.448 -0.138 -0.493 -0.087 -0.237 -0.419 -0.006 -0.240 -0.563 0.090 + -0.135 -0.186 -0.027 -0.431 0.032 -0.264 0.207 -0.250 -0.191 -0.337 + + 521 iasi_metop-a 4068 0.887156E-01 + -0.030 0.095 -0.121 -0.176 -0.155 -0.004 -0.057 0.010 0.008 -0.137 + -0.169 -0.292 -0.158 0.163 -0.096 0.001 0.058 -0.255 -0.065 0.050 + -0.060 0.011 0.098 0.032 0.036 0.105 -0.096 0.085 0.073 -0.070 + -0.368 -0.296 -0.513 0.115 -0.228 -0.120 -0.098 -0.479 -0.374 -0.419 + -0.299 -0.439 -0.300 -0.414 -0.264 -0.042 -0.120 -0.253 -0.352 -0.167 + -0.228 -0.093 -0.480 -0.145 -0.590 -0.193 0.000 -0.234 -0.181 -0.716 + -0.344 -0.308 0.061 -0.107 -0.169 -0.260 -0.422 -0.548 -0.142 -0.325 + -0.832 -0.227 -0.335 -0.141 -0.417 -0.417 -0.234 -0.151 -0.222 0.043 + -0.211 -0.256 -0.181 -0.463 -0.115 -0.293 0.061 -0.219 -0.557 -0.214 + + 522 iasi_metop-a 4082 0.814645E-01 + 0.132 0.067 -0.049 -0.024 0.040 0.069 0.008 0.153 0.089 -0.115 + -0.160 -0.030 0.095 0.132 -0.083 0.243 0.062 -0.197 -0.113 0.073 + -0.084 -0.034 0.088 -0.100 0.039 0.092 0.035 0.009 0.112 -0.075 + 0.028 -0.239 -0.221 0.100 -0.171 0.138 0.114 -0.298 0.111 -0.073 + 0.063 -0.338 -0.118 -0.061 0.019 0.442 0.106 -0.188 -0.060 0.183 + -0.095 0.366 -0.089 0.062 -0.270 0.195 0.039 -0.054 0.395 -0.243 + 0.114 0.064 0.160 0.161 0.175 -0.127 -0.007 -0.380 0.193 -0.210 + -0.383 -0.005 -0.430 0.103 -0.133 -0.261 0.293 -0.083 -0.299 0.354 + 0.038 0.157 0.072 -0.319 0.264 -0.049 0.309 -0.028 -0.030 -0.014 + + 523 iasi_metop-a 4095 0.820635E-01 + 0.149 0.262 0.110 0.095 0.102 0.189 0.165 0.251 0.245 -0.045 + 0.023 0.042 0.094 0.376 0.133 0.258 0.290 -0.113 0.196 0.301 + 0.034 0.283 0.291 0.319 0.253 0.328 0.193 0.316 0.310 0.143 + 0.113 -0.108 0.109 0.366 0.009 0.074 0.237 -0.105 -0.012 -0.019 + -0.197 0.216 -0.042 -0.085 0.070 0.245 -0.066 0.187 0.166 0.018 + -0.051 0.117 -0.012 0.077 -0.061 0.231 0.181 0.007 0.520 -0.246 + 0.167 0.001 0.173 -0.097 0.006 -0.078 0.054 -0.001 0.174 0.034 + 0.055 0.043 0.197 0.208 0.128 0.047 0.215 0.225 0.289 0.023 + 0.319 0.184 0.328 0.010 0.369 0.107 0.288 -0.022 -0.144 0.296 + + 524 iasi_metop-a 4160 0.349683E-01 + 0.815 0.616 0.907 1.025 0.761 0.688 0.923 0.675 0.585 0.710 + 0.526 0.650 0.712 0.732 0.742 0.852 0.616 0.517 0.451 0.633 + 0.607 0.663 0.489 0.519 0.492 0.575 0.378 0.331 0.576 0.373 + 0.827 1.425 0.982 0.787 1.049 1.289 0.917 0.919 1.062 0.877 + 1.437 0.881 0.845 0.953 0.899 0.950 0.908 0.901 1.196 1.149 + 0.947 1.049 1.112 0.782 0.904 1.081 1.077 0.743 1.024 0.943 + 0.949 0.846 1.023 0.911 0.867 0.935 0.834 1.123 0.940 1.065 + 0.862 0.966 1.259 1.181 0.811 0.946 1.037 1.018 0.915 1.022 + 1.083 1.154 1.090 1.015 1.203 0.879 0.915 0.967 1.051 0.864 + + 525 iasi_metop-a 4234 0.879237E-01 + 0.416 0.655 0.350 0.415 0.507 0.532 0.523 0.754 0.614 0.556 + 0.592 0.565 0.603 0.724 0.836 0.725 0.760 0.723 0.802 0.654 + 0.739 0.819 0.768 0.700 0.847 1.043 0.935 0.893 0.830 0.942 + -0.753 -0.601 -0.707 -0.131 -0.680 -0.478 -0.319 -0.755 -0.380 -0.552 + -0.317 -0.800 -0.449 -0.537 -0.526 -0.176 -0.320 -0.428 -0.649 -0.397 + -0.481 -0.202 -0.663 -0.446 -0.550 -0.323 -0.341 -0.447 -0.327 -0.884 + -0.585 -0.369 -0.201 -0.310 -0.335 -0.565 -0.582 -0.740 -0.302 -0.700 + -0.940 -0.369 -0.689 -0.416 -0.639 -0.611 -0.195 -0.502 -0.658 -0.085 + -0.363 -0.438 -0.438 -0.745 -0.256 -0.523 -0.188 -0.475 -0.624 -0.589 + + 526 iasi_metop-a 4257 0.781171E-01 + -0.165 -0.203 -0.220 -0.201 -0.141 -0.188 -0.247 -0.180 -0.144 -0.403 + -0.412 -0.408 -0.208 -0.024 -0.318 -0.020 -0.229 -0.403 -0.414 -0.149 + -0.307 -0.244 -0.262 -0.337 -0.225 -0.160 -0.280 -0.343 -0.150 -0.373 + -0.268 -0.440 -0.407 -0.081 -0.241 0.049 -0.240 -0.639 -0.132 -0.428 + -0.139 -0.588 -0.316 -0.326 -0.008 0.243 -0.021 -0.510 -0.284 -0.071 + -0.329 -0.039 -0.273 -0.186 -0.460 0.096 -0.169 -0.288 0.261 -0.464 + -0.053 0.047 -0.006 -0.246 -0.032 -0.324 -0.241 -0.527 -0.097 -0.386 + -0.472 -0.177 -0.557 -0.139 -0.239 -0.436 -0.012 -0.258 -0.619 0.045 + -0.188 -0.027 -0.121 -0.481 -0.107 -0.389 0.060 -0.217 -0.184 -0.360 + + 527 iasi_metop-a 4411 0.855303E-01 + 0.150 0.141 0.032 -0.028 0.076 0.032 0.030 0.175 0.109 0.010 + -0.059 -0.125 -0.067 0.164 -0.065 0.140 0.090 -0.248 0.015 0.092 + -0.020 0.121 0.011 0.017 0.031 0.131 -0.077 0.105 0.071 -0.090 + -0.122 0.017 -0.327 0.221 -0.155 0.128 0.178 -0.302 -0.184 -0.066 + -0.091 0.040 -0.101 -0.050 -0.188 0.164 -0.010 0.056 -0.075 -0.085 + -0.011 0.225 -0.287 0.088 -0.193 0.234 0.309 -0.075 0.086 -0.418 + -0.041 -0.065 0.044 -0.005 0.210 -0.316 -0.115 -0.061 -0.027 -0.050 + -0.456 0.051 -0.093 0.126 -0.036 -0.036 -0.069 0.107 -0.001 0.213 + 0.028 0.146 -0.006 -0.080 0.123 0.024 0.262 0.063 -0.228 0.094 + + 528 iasi_metop-a 4498 0.793707E-01 + -0.018 -0.029 -0.139 -0.120 0.069 -0.026 0.015 0.104 0.182 -0.189 + -0.211 -0.130 0.048 0.226 -0.118 0.368 0.187 -0.131 -0.036 0.085 + 0.060 -0.016 0.077 0.020 0.134 0.153 0.170 0.060 0.246 0.119 + -0.447 -0.659 -0.789 -0.452 -0.444 -0.417 -0.306 -0.830 -0.492 -0.464 + -0.384 -0.831 -0.445 -0.406 -0.395 0.016 -0.208 -0.574 -0.499 -0.269 + -0.667 -0.206 -0.600 -0.446 -0.704 -0.163 -0.523 -0.489 -0.134 -0.592 + -0.209 -0.304 -0.258 -0.382 -0.168 -0.525 -0.465 -0.755 -0.173 -0.539 + -0.800 -0.410 -0.791 -0.406 -0.466 -0.578 -0.163 -0.450 -0.795 -0.138 + -0.397 -0.376 -0.273 -0.721 -0.291 -0.480 -0.139 -0.500 -0.432 -0.583 + + 529 iasi_metop-a 4520 0.822295E-01 + -0.175 -0.068 -0.280 -0.229 -0.166 -0.180 -0.260 -0.132 -0.113 -0.306 + -0.320 -0.537 -0.304 0.021 -0.297 -0.115 -0.218 -0.483 -0.112 -0.094 + -0.395 -0.211 -0.118 -0.103 -0.156 -0.123 -0.229 -0.089 -0.084 -0.235 + -0.307 -0.625 -0.684 -0.240 -0.383 -0.339 -0.280 -0.763 -0.320 -0.448 + -0.201 -0.857 -0.305 -0.340 -0.271 0.101 -0.213 -0.501 -0.492 -0.312 + -0.391 -0.266 -0.571 -0.524 -0.622 -0.374 -0.340 -0.574 -0.127 -0.585 + -0.385 -0.250 -0.156 -0.315 -0.084 -0.479 -0.358 -0.791 -0.246 -0.493 + -0.670 -0.232 -0.701 -0.227 -0.443 -0.556 -0.176 -0.507 -0.729 0.051 + -0.317 -0.313 -0.286 -0.638 -0.052 -0.504 0.015 -0.433 -0.394 -0.423 + + 530 iasi_metop-a 4552 0.637107E-01 + 0.064 -0.068 -0.056 0.059 0.152 -0.044 -0.072 0.008 -0.048 -0.261 + -0.205 -0.261 -0.097 0.147 -0.242 0.157 -0.022 -0.241 -0.145 0.064 + -0.204 -0.105 0.053 -0.126 -0.049 0.024 -0.106 0.002 0.030 -0.118 + -0.044 -0.071 -0.289 0.054 0.105 0.216 -0.178 -0.222 0.056 -0.077 + 0.003 -0.219 -0.205 -0.076 0.177 0.231 0.274 -0.288 -0.011 0.076 + -0.264 0.087 -0.188 0.090 -0.098 0.250 -0.347 0.084 0.243 -0.205 + 0.076 0.229 -0.043 0.028 0.201 -0.212 -0.050 -0.258 0.131 -0.387 + -0.226 0.068 -0.013 0.128 0.122 -0.204 -0.047 -0.217 -0.270 0.021 + -0.011 -0.258 0.069 -0.279 -0.092 -0.140 0.233 0.150 -0.112 -0.147 + + 531 iasi_metop-a 4567 0.593086E-01 + 0.218 0.048 0.028 0.055 0.326 0.195 -0.051 0.250 0.182 -0.132 + -0.156 -0.111 0.134 0.281 -0.119 0.192 0.182 0.048 0.158 0.190 + -0.060 0.081 0.140 0.179 0.127 0.298 0.101 0.191 0.217 0.140 + 0.154 0.010 -0.282 0.008 0.149 0.176 -0.108 -0.192 -0.088 0.113 + 0.191 -0.193 -0.144 -0.003 0.070 0.168 0.219 -0.137 0.086 0.090 + -0.007 0.133 -0.161 0.077 -0.202 0.331 -0.215 0.010 0.292 -0.146 + 0.058 0.391 -0.079 0.027 0.281 -0.179 0.232 -0.167 0.142 -0.395 + -0.214 0.028 -0.022 0.038 0.118 -0.191 -0.069 -0.159 -0.210 0.002 + -0.072 -0.210 0.071 -0.248 -0.046 -0.140 0.104 0.208 -0.260 -0.127 + + 532 iasi_metop-a 4608 0.794446E-01 + 0.096 0.101 -0.097 -0.047 0.202 0.084 -0.077 0.222 0.158 -0.085 + -0.239 -0.151 0.102 0.162 -0.122 0.106 0.137 -0.110 0.107 0.086 + -0.159 -0.008 0.039 0.109 0.070 0.213 0.035 0.126 0.126 0.070 + -0.152 -0.467 -0.437 -0.202 -0.225 -0.014 -0.120 -0.557 -0.162 -0.313 + -0.162 -0.651 -0.362 -0.295 -0.204 0.170 -0.151 -0.362 -0.339 -0.109 + -0.262 -0.175 -0.422 -0.142 -0.452 -0.096 -0.342 -0.274 0.117 -0.524 + -0.147 -0.126 -0.084 -0.227 -0.063 -0.420 -0.247 -0.607 -0.020 -0.378 + -0.591 -0.322 -0.509 -0.187 -0.278 -0.409 0.003 -0.403 -0.521 -0.005 + -0.176 -0.350 -0.090 -0.470 -0.009 -0.387 0.074 -0.157 -0.143 -0.276 + + 533 iasi_metop-a 4646 0.535650E-01 + 0.280 0.204 0.215 0.247 0.390 0.121 0.200 0.261 0.213 -0.019 + 0.175 -0.030 0.099 0.320 0.033 0.272 0.142 -0.042 0.163 0.241 + 0.040 0.118 0.309 0.207 0.167 0.234 0.051 0.155 0.234 0.047 + 0.329 0.465 0.211 0.249 0.579 0.427 0.282 0.174 0.321 0.534 + 0.429 0.114 0.192 0.436 0.348 0.647 0.507 0.312 0.236 0.185 + 0.281 0.275 0.238 0.326 0.359 0.632 0.056 0.380 0.549 0.062 + 0.252 0.431 0.139 0.481 0.536 0.112 0.473 0.151 0.430 0.027 + 0.206 0.491 0.354 0.330 0.464 0.165 0.134 0.064 0.182 0.336 + 0.303 0.138 0.431 0.106 0.239 0.050 0.460 0.711 0.011 0.179 + + 534 iasi_metop-a 4698 0.453302E-01 + 0.553 0.524 0.460 0.492 0.643 0.540 0.580 0.674 0.634 0.312 + 0.225 0.363 0.554 0.534 0.283 0.504 0.506 0.377 0.497 0.478 + 0.327 0.405 0.524 0.591 0.486 0.684 0.404 0.460 0.567 0.519 + 0.388 0.496 0.471 0.419 0.642 0.479 0.323 0.325 0.299 0.563 + 0.539 0.355 0.178 0.721 0.313 0.613 0.465 0.377 0.182 0.455 + 0.478 0.578 0.318 0.390 0.612 0.670 0.096 0.548 0.535 0.133 + 0.363 0.601 0.310 0.488 0.814 0.274 0.482 0.271 0.536 0.036 + 0.377 0.510 0.519 0.465 0.450 0.350 0.324 0.243 0.425 0.444 + 0.310 0.348 0.545 0.246 0.497 0.267 0.375 0.758 0.243 0.148 + + 535 iasi_metop-a 4808 0.682483E-01 + 0.449 0.248 0.226 0.235 0.647 0.337 0.265 0.392 0.545 0.215 + 0.057 0.202 0.421 0.373 0.120 0.392 0.447 0.309 0.456 0.434 + 0.203 0.171 0.392 0.425 0.437 0.518 0.363 0.364 0.525 0.426 + 0.027 -0.228 -0.510 -0.004 0.090 0.178 -0.164 -0.245 -0.012 -0.185 + 0.063 -0.302 -0.239 -0.086 0.049 0.321 0.344 -0.169 -0.009 0.085 + -0.225 0.151 -0.156 0.240 -0.213 0.147 -0.343 0.079 0.371 -0.153 + 0.010 0.142 0.057 -0.018 0.217 -0.150 0.041 -0.270 0.205 -0.377 + -0.173 -0.036 -0.002 0.136 0.113 -0.224 -0.059 0.011 -0.316 0.122 + -0.082 -0.187 -0.024 -0.194 -0.072 -0.189 0.219 0.132 -0.182 0.012 + + 536 iasi_metop-a 4849 0.400104E-01 + 0.176 0.198 0.058 0.078 0.243 0.168 0.089 0.298 0.132 -0.043 + -0.078 -0.062 0.199 0.281 0.047 0.278 0.263 0.023 0.161 0.271 + 0.033 0.197 0.285 0.361 0.202 0.284 0.075 0.264 0.330 0.200 + -0.143 -0.024 0.122 -0.056 0.196 -0.023 -0.063 -0.142 -0.064 0.037 + 0.201 -0.099 -0.337 0.371 0.055 0.190 0.087 -0.125 -0.244 -0.052 + -0.137 0.074 -0.157 -0.099 0.124 0.160 -0.321 0.111 0.075 -0.181 + -0.002 0.248 -0.234 -0.003 0.336 -0.150 0.119 -0.018 0.125 -0.294 + 0.095 0.155 -0.047 -0.002 -0.133 -0.049 0.102 -0.124 0.215 -0.180 + -0.127 0.035 0.021 -0.195 -0.031 0.161 0.112 0.248 -0.110 -0.145 + + 537 iasi_metop-a 4920 0.383913E-01 + 0.242 0.241 0.118 0.027 0.166 0.159 0.144 0.145 0.299 -0.046 + -0.039 -0.004 0.208 0.030 -0.026 0.104 0.118 0.019 0.166 0.099 + -0.066 -0.004 0.005 0.163 0.184 0.141 -0.083 -0.062 0.226 0.100 + -0.086 0.023 0.166 -0.058 0.131 0.088 0.030 -0.117 0.007 0.133 + 0.231 0.001 -0.250 0.328 0.041 0.187 0.036 -0.011 -0.131 0.013 + -0.109 -0.045 -0.081 -0.022 0.154 0.382 -0.216 0.148 0.005 -0.041 + 0.038 0.209 -0.149 0.049 0.332 -0.024 0.167 -0.050 0.159 -0.327 + 0.283 0.095 -0.087 0.037 -0.060 -0.011 0.190 -0.058 0.353 -0.167 + -0.194 0.116 0.083 -0.201 -0.083 0.171 0.191 0.366 -0.157 -0.122 + + 538 iasi_metop-a 4939 0.527687E-01 + 0.136 0.036 0.029 -0.023 0.182 0.050 0.040 0.013 0.285 -0.107 + -0.089 -0.150 0.155 0.006 -0.070 0.030 0.100 -0.017 0.096 0.204 + -0.026 -0.157 0.052 0.151 0.092 0.108 -0.085 -0.129 0.115 0.040 + -0.063 -0.138 -0.155 -0.006 -0.016 -0.087 -0.246 -0.191 -0.173 0.082 + -0.017 -0.173 -0.226 0.062 -0.216 0.175 0.010 -0.303 -0.219 -0.066 + -0.157 -0.098 -0.176 -0.047 0.051 0.141 -0.315 0.042 0.038 -0.400 + -0.159 0.117 -0.241 -0.073 0.283 -0.346 0.111 -0.311 0.144 -0.309 + 0.068 0.076 -0.061 -0.043 -0.042 -0.204 -0.113 -0.210 -0.069 -0.041 + -0.100 -0.215 -0.006 -0.250 -0.068 -0.162 -0.005 0.239 -0.345 -0.233 + + 539 iasi_metop-a 4947 0.331010E-01 + 0.146 0.010 -0.025 -0.143 0.107 0.007 -0.028 -0.013 0.206 -0.148 + -0.316 -0.111 0.035 0.025 -0.076 0.021 0.002 -0.115 0.067 0.044 + -0.133 -0.042 0.047 0.110 0.059 0.136 -0.080 -0.076 0.079 0.020 + -0.357 -0.290 -0.318 -0.312 -0.242 -0.191 -0.277 -0.444 -0.271 -0.038 + -0.044 -0.415 -0.493 0.122 -0.193 -0.173 -0.434 -0.376 -0.340 -0.174 + -0.285 -0.326 -0.407 -0.485 -0.301 0.191 -0.594 -0.096 -0.222 -0.238 + -0.283 -0.229 -0.562 -0.219 0.040 -0.349 -0.119 -0.225 -0.207 -0.610 + 0.111 -0.053 -0.325 -0.029 -0.219 -0.227 -0.112 -0.144 0.152 -0.246 + -0.314 -0.009 -0.193 -0.359 -0.184 -0.018 0.022 0.193 -0.337 -0.291 + + 540 iasi_metop-a 4967 0.416679E-01 + -0.165 -0.228 -0.332 -0.278 -0.165 -0.211 -0.153 -0.234 -0.064 -0.276 + -0.269 -0.375 -0.137 -0.329 -0.348 -0.097 -0.153 -0.271 -0.204 -0.123 + -0.216 -0.380 -0.164 -0.168 -0.160 -0.158 -0.407 -0.332 -0.098 -0.179 + -0.522 -0.485 -0.267 -0.468 -0.324 -0.361 -0.564 -0.561 -0.497 -0.282 + -0.368 -0.517 -0.646 0.012 -0.490 -0.325 -0.320 -0.521 -0.571 -0.503 + -0.440 -0.384 -0.437 -0.532 -0.421 -0.089 -0.649 -0.322 -0.345 -0.567 + -0.370 -0.276 -0.565 -0.250 -0.051 -0.654 -0.335 -0.473 -0.366 -0.743 + -0.377 -0.363 -0.485 -0.391 -0.430 -0.628 -0.396 -0.580 -0.187 -0.548 + -0.554 -0.440 -0.384 -0.606 -0.396 -0.496 -0.372 -0.110 -0.707 -0.561 + + 541 iasi_metop-a 4991 0.482104E-01 + -0.190 -0.291 -0.329 -0.368 -0.200 -0.260 -0.322 -0.237 -0.160 -0.493 + -0.512 -0.461 -0.241 -0.316 -0.449 -0.315 -0.319 -0.370 -0.181 -0.239 + -0.433 -0.480 -0.346 -0.228 -0.293 -0.225 -0.446 -0.374 -0.240 -0.335 + -0.378 -0.255 -0.325 -0.385 -0.255 -0.266 -0.552 -0.445 -0.486 -0.304 + -0.374 -0.519 -0.479 -0.201 -0.383 -0.234 -0.206 -0.562 -0.440 -0.338 + -0.293 -0.177 -0.450 -0.327 -0.185 -0.067 -0.511 -0.234 -0.190 -0.434 + -0.322 -0.179 -0.641 -0.196 0.001 -0.477 -0.227 -0.488 -0.251 -0.564 + -0.329 -0.231 -0.373 -0.259 -0.378 -0.554 -0.365 -0.585 -0.269 -0.351 + -0.273 -0.524 -0.161 -0.458 -0.286 -0.608 -0.290 -0.005 -0.563 -0.617 + + 542 iasi_metop-a 4996 0.551848E-01 + -0.233 -0.374 -0.424 -0.388 -0.157 -0.323 -0.375 -0.337 -0.132 -0.504 + -0.531 -0.465 -0.214 -0.338 -0.478 -0.306 -0.208 -0.411 -0.173 -0.231 + -0.452 -0.429 -0.256 -0.266 -0.290 -0.137 -0.351 -0.366 -0.250 -0.328 + -0.402 -0.352 -0.615 -0.501 -0.228 -0.381 -0.400 -0.552 -0.603 -0.437 + -0.365 -0.593 -0.520 -0.498 -0.503 -0.118 -0.245 -0.686 -0.519 -0.428 + -0.515 -0.248 -0.599 -0.376 -0.395 -0.153 -0.610 -0.374 -0.175 -0.484 + -0.457 -0.209 -0.612 -0.410 -0.014 -0.601 -0.249 -0.649 -0.399 -0.686 + -0.500 -0.242 -0.387 -0.349 -0.434 -0.474 -0.425 -0.606 -0.588 -0.416 + -0.455 -0.602 -0.307 -0.673 -0.340 -0.578 -0.251 -0.159 -0.605 -0.532 + + 543 iasi_metop-a 5015 0.331621E-01 + -0.223 -0.309 -0.313 -0.431 -0.128 -0.222 -0.276 -0.174 -0.183 -0.510 + -0.471 -0.465 -0.254 -0.268 -0.391 -0.333 -0.300 -0.426 -0.267 -0.206 + -0.448 -0.384 -0.310 -0.289 -0.366 -0.201 -0.457 -0.392 -0.268 -0.349 + -0.494 -0.407 -0.478 -0.381 -0.352 -0.415 -0.306 -0.581 -0.457 -0.170 + -0.235 -0.526 -0.740 -0.057 -0.182 -0.500 -0.493 -0.543 -0.538 -0.447 + -0.619 -0.579 -0.572 -0.625 -0.396 -0.078 -0.732 -0.346 -0.427 -0.385 + -0.446 -0.439 -0.648 -0.382 -0.209 -0.542 -0.210 -0.388 -0.379 -0.828 + -0.052 -0.235 -0.424 -0.212 -0.263 -0.514 -0.131 -0.292 -0.088 -0.523 + -0.565 -0.051 -0.331 -0.431 -0.289 -0.359 -0.145 -0.077 -0.500 -0.404 + + 544 iasi_metop-a 5028 0.487075E-01 + -0.182 -0.304 -0.388 -0.337 -0.120 -0.245 -0.228 -0.273 -0.103 -0.426 + -0.439 -0.395 -0.157 -0.389 -0.337 -0.322 -0.237 -0.353 -0.376 -0.187 + -0.350 -0.477 -0.331 -0.253 -0.313 -0.351 -0.513 -0.502 -0.207 -0.318 + -0.372 -0.448 -0.305 -0.432 -0.362 -0.375 -0.547 -0.555 -0.530 -0.288 + -0.277 -0.488 -0.619 -0.194 -0.541 -0.366 -0.379 -0.584 -0.522 -0.456 + -0.509 -0.278 -0.466 -0.590 -0.320 -0.161 -0.656 -0.409 -0.361 -0.589 + -0.270 -0.304 -0.587 -0.320 -0.049 -0.634 -0.516 -0.493 -0.302 -0.714 + -0.307 -0.319 -0.313 -0.381 -0.434 -0.427 -0.249 -0.459 -0.191 -0.539 + -0.578 -0.328 -0.315 -0.620 -0.290 -0.438 -0.168 -0.072 -0.531 -0.613 + + 545 iasi_metop-a 5056 0.563158E-01 + -0.229 -0.377 -0.396 -0.372 -0.106 -0.314 -0.303 -0.450 -0.127 -0.500 + -0.493 -0.519 -0.286 -0.299 -0.503 -0.382 -0.220 -0.333 -0.202 -0.194 + -0.382 -0.423 -0.230 -0.258 -0.301 -0.279 -0.406 -0.475 -0.282 -0.287 + -0.472 -0.427 -0.564 -0.551 -0.381 -0.172 -0.551 -0.547 -0.520 -0.316 + -0.333 -0.580 -0.589 -0.401 -0.424 -0.224 -0.143 -0.636 -0.434 -0.286 + -0.278 -0.375 -0.621 -0.237 -0.434 -0.232 -0.765 -0.381 -0.101 -0.588 + -0.449 -0.141 -0.540 -0.311 -0.076 -0.587 -0.213 -0.653 -0.401 -0.672 + -0.620 -0.208 -0.403 -0.414 -0.279 -0.591 -0.571 -0.689 -0.633 -0.382 + -0.456 -0.568 -0.352 -0.546 -0.515 -0.668 -0.236 -0.198 -0.690 -0.418 + + 546 iasi_metop-a 5128 0.356764E-01 + -0.259 -0.261 -0.218 -0.303 -0.080 -0.215 -0.250 -0.089 -0.220 -0.430 + -0.523 -0.396 -0.227 -0.179 -0.344 -0.244 -0.275 -0.405 -0.244 -0.212 + -0.405 -0.279 -0.285 -0.168 -0.284 -0.231 -0.329 -0.285 -0.228 -0.222 + -0.519 -0.456 -0.393 -0.396 -0.187 -0.326 -0.493 -0.494 -0.371 -0.226 + -0.046 -0.463 -0.593 0.005 -0.274 -0.186 -0.290 -0.540 -0.339 -0.321 + -0.483 -0.504 -0.373 -0.506 -0.392 0.002 -0.577 -0.354 -0.351 -0.413 + -0.218 -0.294 -0.462 -0.298 0.014 -0.430 -0.191 -0.436 -0.156 -0.673 + -0.003 -0.202 -0.298 -0.149 -0.345 -0.396 -0.074 -0.362 -0.036 -0.445 + -0.519 -0.072 -0.214 -0.471 -0.203 -0.099 -0.112 -0.002 -0.539 -0.433 + + 547 iasi_metop-a 5130 0.306491E-01 + -0.220 -0.246 -0.322 -0.335 -0.128 -0.123 -0.301 -0.405 -0.070 -0.363 + -0.443 -0.338 -0.193 -0.281 -0.348 -0.278 -0.222 -0.396 -0.258 -0.166 + -0.259 -0.406 -0.290 -0.268 -0.274 -0.241 -0.390 -0.523 -0.223 -0.207 + -0.499 -0.414 -0.475 -0.528 -0.299 -0.541 -0.407 -0.617 -0.481 -0.341 + -0.234 -0.464 -0.687 -0.171 -0.399 -0.376 -0.544 -0.519 -0.523 -0.302 + -0.525 -0.552 -0.686 -0.728 -0.580 -0.142 -0.675 -0.321 -0.558 -0.440 + -0.355 -0.602 -0.788 -0.345 -0.179 -0.422 -0.225 -0.558 -0.386 -0.818 + 0.046 -0.224 -0.458 -0.372 -0.471 -0.446 -0.097 -0.335 -0.041 -0.378 + -0.676 -0.126 -0.367 -0.349 -0.323 -0.183 -0.185 -0.030 -0.650 -0.387 + + 548 iasi_metop-a 5144 0.262870E-01 + -0.415 -0.503 -0.500 -0.528 -0.459 -0.381 -0.480 -0.492 -0.266 -0.478 + -0.643 -0.493 -0.461 -0.569 -0.508 -0.455 -0.418 -0.603 -0.532 -0.392 + -0.470 -0.602 -0.496 -0.463 -0.464 -0.458 -0.599 -0.613 -0.370 -0.408 + -0.782 -0.846 -0.813 -0.807 -0.605 -1.018 -0.810 -0.953 -0.677 -0.678 + -0.748 -0.936 -0.899 -0.566 -0.873 -0.905 -1.027 -0.930 -0.783 -0.612 + -0.720 -0.774 -0.921 -0.966 -1.153 -0.750 -1.088 -0.702 -0.852 -0.854 + -0.794 -0.811 -1.025 -0.630 -0.705 -0.797 -0.335 -0.980 -0.755 -1.191 + -0.497 -0.498 -0.817 -0.823 -0.571 -0.820 -0.524 -0.624 -0.452 -1.040 + -0.955 -0.552 -0.729 -0.647 -0.703 -0.367 -0.454 -0.336 -0.943 -0.878 + + 549 iasi_metop-a 5170 0.355478E-01 + -0.509 -0.576 -0.499 -0.573 -0.360 -0.503 -0.459 -0.633 -0.410 -0.664 + -0.572 -0.640 -0.483 -0.621 -0.745 -0.546 -0.563 -0.630 -0.622 -0.423 + -0.517 -0.605 -0.565 -0.576 -0.489 -0.607 -0.795 -0.832 -0.544 -0.562 + -0.802 -0.847 -0.880 -0.739 -0.583 -0.643 -0.589 -0.904 -0.721 -0.652 + -0.527 -0.787 -0.959 -0.472 -0.618 -0.721 -0.734 -0.933 -0.758 -0.715 + -0.836 -0.819 -0.842 -0.987 -0.637 -0.387 -1.066 -0.593 -0.696 -0.785 + -0.581 -0.702 -0.886 -0.706 -0.484 -0.835 -0.561 -0.681 -0.711 -1.122 + -0.361 -0.599 -0.840 -0.622 -0.730 -0.868 -0.525 -0.651 -0.444 -0.752 + -0.883 -0.491 -0.661 -0.654 -0.701 -0.483 -0.522 -0.348 -0.718 -0.680 + + 550 iasi_metop-a 5178 0.368890E-01 + -0.595 -0.669 -0.649 -0.681 -0.475 -0.554 -0.497 -0.644 -0.407 -0.800 + -0.660 -0.668 -0.435 -0.672 -0.665 -0.539 -0.639 -0.632 -0.615 -0.490 + -0.590 -0.714 -0.652 -0.632 -0.538 -0.568 -0.683 -0.656 -0.464 -0.460 + -0.827 -0.765 -0.864 -0.860 -0.782 -0.683 -0.846 -0.913 -0.752 -0.729 + -0.594 -0.837 -1.066 -0.476 -0.675 -0.871 -0.752 -0.923 -0.899 -0.875 + -0.895 -0.864 -0.858 -0.899 -0.739 -0.489 -1.066 -0.704 -0.814 -0.845 + -0.600 -0.592 -1.087 -0.608 -0.575 -0.935 -0.548 -0.771 -0.799 -1.067 + -0.457 -0.538 -0.748 -0.687 -0.858 -0.916 -0.449 -0.754 -0.392 -0.909 + -0.948 -0.664 -0.801 -0.930 -0.826 -0.752 -0.577 -0.431 -0.996 -0.892 + + 551 iasi_metop-a 5183 0.423996E-01 + -0.625 -0.642 -0.744 -0.715 -0.536 -0.638 -0.658 -0.641 -0.469 -0.846 + -0.780 -0.722 -0.546 -0.725 -0.736 -0.667 -0.628 -0.651 -0.706 -0.553 + -0.639 -0.823 -0.640 -0.617 -0.625 -0.587 -0.806 -0.793 -0.564 -0.633 + -0.697 -0.629 -0.548 -0.750 -0.558 -0.627 -0.923 -0.766 -0.828 -0.561 + -0.620 -0.751 -0.922 -0.188 -0.592 -0.611 -0.530 -0.847 -0.733 -0.766 + -0.699 -0.499 -0.643 -0.622 -0.552 -0.285 -0.956 -0.433 -0.446 -0.813 + -0.613 -0.443 -0.866 -0.506 -0.270 -0.810 -0.598 -0.760 -0.463 -0.802 + -0.609 -0.566 -0.576 -0.503 -0.707 -0.838 -0.316 -0.786 -0.639 -0.762 + -0.780 -0.841 -0.635 -0.826 -0.581 -0.693 -0.646 -0.307 -0.875 -0.745 + + 552 iasi_metop-a 5188 0.766968E-01 + -0.206 -0.405 -0.472 -0.421 -0.239 -0.414 -0.479 -0.536 -0.192 -0.498 + -0.647 -0.603 -0.400 -0.429 -0.604 -0.548 -0.495 -0.619 -0.409 -0.459 + -0.570 -0.783 -0.521 -0.571 -0.517 -0.478 -0.610 -0.692 -0.538 -0.494 + -0.385 -0.762 -0.635 -0.480 -0.202 -0.290 -0.360 -0.724 -0.227 -0.360 + -0.323 -0.644 -0.464 -0.385 -0.149 -0.068 -0.086 -0.490 -0.600 -0.248 + -0.415 -0.143 -0.426 -0.378 -0.689 -0.344 -0.482 -0.270 -0.078 -0.451 + -0.319 -0.118 -0.054 -0.267 -0.220 -0.544 -0.122 -0.632 0.186 -0.389 + -0.679 -0.406 -0.638 -0.287 -0.441 -0.689 -0.184 -0.258 -0.586 -0.222 + -0.380 -0.189 -0.188 -0.529 -0.461 -0.538 0.008 -0.406 -0.194 -0.286 + + 553 iasi_metop-a 5191 0.796248E-01 + 0.054 0.251 0.014 0.295 0.139 0.137 -0.027 0.222 0.182 -0.209 + -0.116 -0.247 -0.029 0.177 -0.069 0.310 0.112 -0.268 -0.013 0.135 + -0.046 0.059 0.044 0.052 -0.021 0.026 -0.085 0.050 0.094 -0.040 + 0.022 0.025 0.106 0.367 -0.083 0.154 0.261 -0.237 0.579 0.270 + 0.505 0.268 -0.111 0.519 0.398 0.751 -0.119 0.302 0.101 0.207 + 0.512 0.394 0.370 0.344 0.307 0.507 0.490 0.134 0.209 -0.040 + 0.503 0.232 0.384 0.214 0.523 0.240 0.297 -0.014 0.328 0.227 + 0.136 0.271 0.430 0.034 0.278 0.062 0.147 0.362 0.278 0.254 + 0.214 0.262 0.274 -0.113 0.331 -0.024 0.228 0.307 0.154 0.564 + + 554 iasi_metop-a 5368 0.291508E-01 + 0.126 0.122 -0.005 0.003 0.214 0.028 0.206 0.054 0.186 0.002 + 0.154 0.072 0.254 0.448 0.394 0.385 0.241 0.152 0.155 0.302 + 0.331 0.417 0.445 0.257 0.314 0.475 0.555 0.392 0.494 0.233 + -0.427 -0.456 -0.423 -0.277 -0.247 -0.525 -0.379 -0.587 -0.393 -0.296 + -0.224 -0.437 -0.673 -0.043 -0.372 -0.352 -0.481 -0.524 -0.435 -0.222 + -0.407 -0.587 -0.556 -0.653 -0.652 -0.266 -0.691 -0.257 -0.558 -0.507 + -0.323 -0.549 -0.661 -0.398 -0.203 -0.469 -0.177 -0.430 -0.298 -0.913 + -0.020 -0.214 -0.437 -0.302 -0.189 -0.575 -0.128 -0.189 -0.022 -0.627 + -0.597 -0.102 -0.428 -0.433 -0.334 -0.037 -0.087 -0.149 -0.489 -0.314 + + 555 iasi_metop-a 5371 0.427218E-01 + -0.180 -0.143 -0.242 -0.255 -0.147 -0.230 -0.163 -0.202 -0.041 -0.303 + -0.256 -0.333 -0.151 -0.325 -0.401 -0.179 -0.161 -0.291 -0.317 -0.161 + -0.244 -0.392 -0.231 -0.181 -0.191 -0.215 -0.504 -0.427 -0.163 -0.229 + -0.314 -0.335 -0.192 -0.224 -0.146 -0.392 -0.469 -0.281 -0.387 -0.208 + -0.317 -0.322 -0.589 -0.062 -0.424 -0.144 -0.198 -0.466 -0.445 -0.259 + -0.319 -0.270 -0.406 -0.293 -0.243 -0.101 -0.575 -0.096 -0.160 -0.593 + -0.235 -0.014 -0.456 -0.248 -0.022 -0.465 -0.157 -0.358 -0.261 -0.555 + -0.227 -0.218 -0.362 -0.214 -0.315 -0.465 -0.266 -0.334 -0.090 -0.456 + -0.438 -0.289 -0.199 -0.564 -0.289 -0.320 -0.244 -0.015 -0.456 -0.374 + + 556 iasi_metop-a 5379 0.369258E-01 + -0.194 -0.213 -0.285 -0.345 -0.130 -0.220 -0.252 -0.131 -0.071 -0.409 + -0.490 -0.327 -0.111 -0.303 -0.316 -0.243 -0.256 -0.321 -0.185 -0.123 + -0.353 -0.353 -0.282 -0.126 -0.195 -0.186 -0.395 -0.274 -0.177 -0.229 + -0.492 -0.368 -0.315 -0.418 -0.326 -0.375 -0.466 -0.514 -0.487 -0.238 + -0.174 -0.427 -0.743 -0.063 -0.376 -0.322 -0.320 -0.524 -0.559 -0.528 + -0.518 -0.449 -0.506 -0.554 -0.356 -0.052 -0.649 -0.324 -0.371 -0.398 + -0.294 -0.281 -0.552 -0.320 -0.124 -0.543 -0.267 -0.440 -0.268 -0.788 + -0.198 -0.304 -0.446 -0.376 -0.435 -0.483 -0.204 -0.472 -0.159 -0.590 + -0.545 -0.193 -0.406 -0.473 -0.401 -0.327 -0.286 -0.044 -0.532 -0.556 + + 557 iasi_metop-a 5381 0.356110E-01 + -0.345 -0.271 -0.403 -0.468 -0.259 -0.242 -0.344 -0.337 -0.187 -0.454 + -0.442 -0.432 -0.258 -0.417 -0.468 -0.363 -0.378 -0.452 -0.272 -0.305 + -0.466 -0.477 -0.358 -0.355 -0.336 -0.315 -0.472 -0.530 -0.309 -0.292 + -0.653 -0.547 -0.539 -0.539 -0.453 -0.511 -0.724 -0.570 -0.550 -0.364 + -0.364 -0.573 -0.758 -0.222 -0.606 -0.392 -0.460 -0.741 -0.655 -0.606 + -0.644 -0.603 -0.658 -0.714 -0.479 -0.205 -0.804 -0.438 -0.528 -0.541 + -0.476 -0.473 -0.714 -0.433 -0.295 -0.651 -0.366 -0.549 -0.436 -0.907 + -0.303 -0.539 -0.542 -0.359 -0.474 -0.638 -0.362 -0.475 -0.259 -0.656 + -0.765 -0.343 -0.525 -0.685 -0.536 -0.400 -0.347 -0.102 -0.679 -0.569 + + 558 iasi_metop-a 5383 0.383187E-01 + -0.468 -0.334 -0.450 -0.518 -0.331 -0.388 -0.431 -0.447 -0.265 -0.515 + -0.479 -0.545 -0.366 -0.527 -0.570 -0.426 -0.442 -0.544 -0.388 -0.372 + -0.465 -0.580 -0.472 -0.415 -0.424 -0.428 -0.617 -0.568 -0.377 -0.415 + -0.689 -0.546 -0.400 -0.464 -0.437 -0.593 -0.573 -0.595 -0.623 -0.554 + -0.515 -0.524 -0.827 -0.302 -0.587 -0.356 -0.427 -0.775 -0.660 -0.617 + -0.592 -0.606 -0.702 -0.695 -0.392 -0.256 -0.775 -0.409 -0.441 -0.605 + -0.504 -0.348 -0.657 -0.521 -0.282 -0.666 -0.403 -0.629 -0.522 -0.851 + -0.365 -0.520 -0.571 -0.516 -0.655 -0.725 -0.419 -0.552 -0.230 -0.673 + -0.687 -0.459 -0.495 -0.748 -0.614 -0.522 -0.385 -0.219 -0.845 -0.588 + + 559 iasi_metop-a 5397 0.356181E-01 + -0.101 -0.184 -0.238 -0.328 -0.078 -0.247 -0.284 -0.264 -0.067 -0.437 + -0.442 -0.329 -0.215 -0.385 -0.462 -0.300 -0.332 -0.485 -0.293 -0.246 + -0.404 -0.458 -0.454 -0.284 -0.388 -0.396 -0.580 -0.557 -0.302 -0.372 + -0.362 -0.146 -0.308 -0.256 -0.144 -0.216 -0.282 -0.403 -0.315 -0.064 + -0.014 -0.292 -0.542 0.120 -0.100 -0.181 -0.210 -0.244 -0.321 -0.292 + -0.353 -0.243 -0.267 -0.373 -0.311 0.070 -0.478 -0.080 -0.267 -0.172 + -0.148 -0.145 -0.386 -0.067 0.042 -0.330 -0.070 -0.158 -0.115 -0.568 + 0.095 -0.078 -0.282 -0.086 -0.265 -0.243 -0.018 -0.208 0.010 -0.224 + -0.383 -0.070 -0.227 -0.285 -0.194 -0.097 -0.056 0.147 -0.354 -0.333 + + 560 iasi_metop-a 5399 0.297239E-01 + -0.041 -0.053 -0.090 -0.153 0.040 -0.019 -0.085 -0.178 0.029 -0.145 + -0.212 -0.188 -0.084 -0.155 -0.167 -0.157 -0.168 -0.262 -0.066 -0.047 + -0.207 -0.202 -0.147 -0.191 -0.161 -0.089 -0.319 -0.345 -0.110 -0.088 + -0.308 -0.227 -0.209 -0.296 -0.134 -0.290 -0.271 -0.425 -0.241 -0.005 + -0.055 -0.330 -0.532 0.100 -0.165 -0.262 -0.353 -0.349 -0.225 -0.117 + -0.319 -0.323 -0.326 -0.505 -0.499 -0.024 -0.438 -0.154 -0.401 -0.262 + -0.201 -0.368 -0.569 -0.257 -0.004 -0.245 -0.023 -0.258 -0.023 -0.836 + 0.184 0.128 -0.241 -0.198 -0.183 -0.316 0.069 -0.116 0.057 -0.248 + -0.389 -0.046 -0.287 -0.192 -0.133 0.026 0.063 0.051 -0.258 -0.204 + + 561 iasi_metop-a 5401 0.264364E-01 + -0.097 -0.008 -0.193 -0.163 -0.020 -0.082 -0.151 -0.203 0.128 -0.079 + -0.245 -0.171 -0.077 -0.183 -0.211 -0.144 -0.025 -0.166 -0.165 -0.029 + -0.114 -0.214 -0.145 -0.210 -0.124 -0.078 -0.332 -0.387 -0.021 -0.080 + -0.420 -0.221 -0.364 -0.217 -0.055 -0.538 -0.305 -0.523 -0.225 -0.128 + -0.185 -0.500 -0.628 -0.083 -0.282 -0.414 -0.391 -0.388 -0.253 -0.156 + -0.201 -0.437 -0.445 -0.551 -0.580 -0.095 -0.525 -0.371 -0.418 -0.489 + -0.099 -0.311 -0.659 -0.280 -0.086 -0.232 -0.043 -0.329 -0.106 -0.825 + 0.009 0.028 -0.223 -0.367 -0.065 -0.364 0.024 -0.142 0.007 -0.589 + -0.414 -0.096 -0.321 -0.235 -0.128 0.049 0.046 0.106 -0.287 -0.247 + + 562 iasi_metop-a 5403 0.244118E-01 + -0.113 -0.044 -0.135 -0.251 -0.019 -0.045 -0.161 -0.209 0.059 -0.099 + -0.278 -0.204 -0.159 -0.207 -0.228 -0.150 -0.028 -0.245 -0.264 -0.074 + -0.158 -0.261 -0.134 -0.217 -0.159 -0.076 -0.373 -0.446 -0.040 -0.167 + -0.311 -0.223 -0.453 -0.220 -0.133 -0.561 -0.204 -0.532 -0.180 -0.169 + -0.254 -0.575 -0.576 -0.147 -0.358 -0.585 -0.410 -0.465 -0.160 -0.195 + -0.151 -0.353 -0.601 -0.504 -0.609 -0.130 -0.610 -0.284 -0.543 -0.359 + -0.249 -0.402 -0.540 -0.289 -0.064 -0.319 0.059 -0.345 -0.248 -0.825 + -0.085 0.039 -0.311 -0.530 -0.171 -0.436 -0.049 -0.255 0.033 -0.474 + -0.480 -0.196 -0.373 -0.250 -0.110 0.015 0.015 0.236 -0.220 -0.313 + + 563 iasi_metop-a 5405 0.225485E-01 + -0.188 -0.089 -0.130 -0.383 0.017 -0.071 -0.194 -0.251 0.031 -0.153 + -0.221 -0.237 -0.201 -0.206 -0.307 -0.148 -0.103 -0.247 -0.289 -0.122 + -0.181 -0.190 -0.180 -0.175 -0.184 -0.139 -0.382 -0.394 -0.046 -0.177 + -0.335 -0.314 -0.556 -0.235 -0.142 -0.723 -0.297 -0.630 -0.251 -0.267 + -0.410 -0.634 -0.611 -0.444 -0.489 -0.722 -0.624 -0.551 -0.196 -0.287 + -0.289 -0.375 -0.682 -0.440 -0.555 -0.244 -0.742 -0.336 -0.664 -0.526 + -0.253 -0.475 -0.605 -0.348 -0.170 -0.391 -0.121 -0.417 -0.370 -0.827 + -0.062 -0.001 -0.416 -0.611 -0.272 -0.470 -0.103 -0.386 0.083 -0.556 + -0.499 -0.428 -0.313 -0.326 -0.159 -0.018 -0.014 0.058 -0.169 -0.420 + + 564 iasi_metop-a 5446 0.159738E-01 + -0.447 -0.230 -0.471 -0.656 -0.084 -0.357 -0.404 -0.576 -0.190 -0.344 + -0.344 -0.395 -0.383 -0.420 -0.459 -0.455 -0.139 -0.376 -0.365 -0.252 + -0.329 -0.326 -0.251 -0.340 -0.234 -0.231 -0.426 -0.473 -0.152 -0.316 + -0.700 -0.639 -0.894 -0.538 -0.242 -0.929 -0.728 -0.579 -0.682 -0.437 + -0.728 -0.611 -0.652 -0.579 -0.519 -1.024 -0.650 -0.626 -0.391 -0.439 + -0.188 -0.650 -0.764 -0.742 -0.897 -0.546 -0.980 -0.643 -0.769 -0.599 + -0.570 -0.601 -0.812 -0.367 -0.374 -0.479 -0.431 -0.525 -0.734 -1.047 + -0.448 -0.489 -0.668 -0.810 -0.430 -0.705 -0.306 -0.402 -0.170 -0.512 + -0.714 -0.613 -0.555 -0.706 -0.601 -0.406 -0.562 -0.127 -0.522 -0.635 + + 565 iasi_metop-a 5455 0.260590E-01 + -0.158 -0.303 -0.247 -0.413 -0.099 -0.217 -0.425 -0.385 -0.214 -0.381 + -0.586 -0.295 -0.392 -0.214 -0.444 -0.511 -0.292 -0.341 -0.420 -0.306 + -0.324 -0.422 -0.417 -0.392 -0.455 -0.395 -0.704 -0.673 -0.372 -0.409 + -0.572 -0.377 -0.467 -0.259 -0.215 -0.698 -0.399 -0.573 -0.328 -0.256 + -0.292 -0.529 -0.675 -0.161 -0.448 -0.453 -0.570 -0.549 -0.422 -0.241 + -0.334 -0.466 -0.628 -0.616 -0.729 -0.209 -0.676 -0.315 -0.575 -0.593 + -0.209 -0.397 -0.760 -0.394 -0.152 -0.286 -0.018 -0.458 -0.222 -0.783 + -0.108 -0.017 -0.325 -0.477 -0.201 -0.490 -0.085 -0.129 -0.151 -0.627 + -0.502 -0.138 -0.315 -0.315 -0.294 0.104 -0.073 0.078 -0.314 -0.340 + + 566 iasi_metop-a 5472 0.169909E-01 + -0.518 -0.262 -0.635 -0.745 -0.227 -0.481 -0.517 -0.561 -0.269 -0.424 + -0.388 -0.468 -0.402 -0.496 -0.602 -0.368 -0.320 -0.504 -0.465 -0.261 + -0.384 -0.449 -0.362 -0.405 -0.304 -0.287 -0.571 -0.520 -0.214 -0.331 + -0.838 -0.859 -1.005 -0.802 -0.576 -1.135 -0.909 -0.735 -0.872 -0.604 + -0.922 -0.872 -0.799 -0.758 -0.736 -1.128 -0.814 -0.829 -0.597 -0.638 + -0.388 -0.868 -0.925 -0.844 -0.951 -0.744 -1.173 -0.791 -0.913 -0.775 + -0.707 -0.775 -0.899 -0.621 -0.635 -0.668 -0.511 -0.686 -0.815 -1.076 + -0.641 -0.620 -0.847 -0.880 -0.799 -0.802 -0.446 -0.566 -0.283 -0.830 + -0.948 -0.835 -0.752 -0.833 -0.705 -0.818 -0.654 -0.319 -0.739 -0.784 + + 567 iasi_metop-a 5480 0.246612E-01 + -0.486 -0.505 -0.500 -0.578 -0.381 -0.486 -0.603 -0.645 -0.452 -0.553 + -0.731 -0.552 -0.643 -0.564 -0.724 -0.759 -0.459 -0.633 -0.654 -0.528 + -0.603 -0.676 -0.652 -0.655 -0.707 -0.672 -0.877 -0.902 -0.595 -0.662 + -0.735 -0.727 -0.850 -0.534 -0.464 -1.010 -0.709 -0.876 -0.556 -0.517 + -0.611 -0.855 -0.953 -0.553 -0.723 -0.808 -0.780 -0.899 -0.627 -0.479 + -0.537 -0.792 -0.948 -0.800 -0.933 -0.495 -0.944 -0.613 -0.894 -0.764 + -0.566 -0.687 -0.920 -0.679 -0.468 -0.651 -0.304 -0.653 -0.570 -0.982 + -0.340 -0.360 -0.659 -0.808 -0.549 -0.773 -0.402 -0.562 -0.309 -0.969 + -0.817 -0.546 -0.693 -0.524 -0.487 -0.290 -0.305 -0.259 -0.617 -0.503 + + 568 iasi_metop-a 5483 0.306439E-01 + -0.340 -0.337 -0.350 -0.443 -0.176 -0.325 -0.341 -0.418 -0.296 -0.470 + -0.467 -0.502 -0.353 -0.403 -0.528 -0.409 -0.412 -0.480 -0.477 -0.390 + -0.422 -0.513 -0.426 -0.421 -0.441 -0.421 -0.701 -0.669 -0.366 -0.425 + -0.573 -0.503 -0.515 -0.477 -0.331 -0.546 -0.552 -0.628 -0.418 -0.378 + -0.267 -0.586 -0.763 -0.227 -0.506 -0.435 -0.596 -0.670 -0.573 -0.367 + -0.558 -0.610 -0.667 -0.697 -0.634 -0.251 -0.787 -0.355 -0.592 -0.591 + -0.533 -0.494 -0.751 -0.458 -0.302 -0.608 -0.283 -0.571 -0.453 -0.975 + -0.048 -0.324 -0.551 -0.285 -0.383 -0.660 -0.266 -0.358 -0.130 -0.620 + -0.652 -0.278 -0.484 -0.530 -0.467 -0.241 -0.215 -0.201 -0.602 -0.398 + + 569 iasi_metop-a 5485 0.396749E-01 + -0.312 -0.292 -0.364 -0.370 -0.271 -0.326 -0.215 -0.321 -0.189 -0.427 + -0.384 -0.424 -0.249 -0.392 -0.421 -0.307 -0.260 -0.368 -0.348 -0.255 + -0.327 -0.523 -0.346 -0.321 -0.272 -0.338 -0.568 -0.514 -0.283 -0.296 + -0.478 -0.452 -0.328 -0.342 -0.269 -0.479 -0.581 -0.440 -0.521 -0.321 + -0.356 -0.390 -0.732 -0.192 -0.506 -0.196 -0.291 -0.587 -0.587 -0.429 + -0.491 -0.487 -0.573 -0.475 -0.294 -0.123 -0.659 -0.207 -0.360 -0.610 + -0.362 -0.180 -0.641 -0.402 -0.174 -0.480 -0.344 -0.504 -0.333 -0.613 + -0.251 -0.469 -0.443 -0.320 -0.522 -0.555 -0.272 -0.522 -0.217 -0.623 + -0.621 -0.306 -0.351 -0.582 -0.477 -0.305 -0.238 -0.107 -0.515 -0.423 + + 570 iasi_metop-a 5492 0.445459E-01 + -0.099 -0.108 -0.238 -0.217 -0.123 -0.177 -0.214 -0.143 -0.008 -0.345 + -0.369 -0.282 -0.122 -0.220 -0.373 -0.191 -0.242 -0.298 -0.192 -0.143 + -0.359 -0.384 -0.252 -0.164 -0.206 -0.216 -0.412 -0.357 -0.213 -0.270 + -0.221 -0.166 -0.099 -0.085 -0.023 -0.184 -0.311 -0.103 -0.197 0.043 + -0.134 -0.144 -0.441 0.076 -0.226 0.104 0.008 -0.264 -0.363 -0.078 + -0.194 -0.116 -0.213 -0.144 0.052 0.075 -0.411 0.043 0.017 -0.382 + -0.152 0.169 -0.275 -0.045 0.208 -0.257 -0.133 -0.222 -0.091 -0.352 + -0.216 -0.093 -0.126 -0.029 -0.119 -0.309 -0.192 -0.173 -0.037 -0.175 + -0.195 -0.269 -0.061 -0.400 -0.119 -0.275 -0.084 0.198 -0.402 -0.284 + + 571 iasi_metop-a 5497 0.638761E-01 + -0.098 -0.333 -0.317 -0.225 -0.011 -0.231 -0.329 -0.139 -0.020 -0.425 + -0.459 -0.364 -0.065 -0.235 -0.376 -0.216 -0.127 -0.304 -0.095 -0.036 + -0.327 -0.339 -0.196 -0.100 -0.183 -0.078 -0.265 -0.196 -0.114 -0.224 + -0.405 -0.491 -0.569 -0.564 -0.345 -0.317 -0.505 -0.752 -0.509 -0.429 + -0.243 -0.743 -0.512 -0.512 -0.416 -0.286 -0.272 -0.606 -0.422 -0.506 + -0.476 -0.371 -0.510 -0.553 -0.533 -0.361 -0.571 -0.545 -0.230 -0.556 + -0.401 -0.451 -0.537 -0.368 -0.177 -0.669 -0.408 -0.680 -0.327 -0.772 + -0.609 -0.310 -0.413 -0.428 -0.357 -0.525 -0.381 -0.654 -0.619 -0.387 + -0.450 -0.665 -0.278 -0.600 -0.314 -0.684 -0.269 -0.218 -0.487 -0.568 + + 572 iasi_metop-a 5502 0.258862E-01 + -0.105 -0.077 -0.162 -0.279 -0.086 -0.131 -0.223 -0.180 -0.185 -0.299 + -0.440 -0.447 -0.229 -0.054 -0.282 -0.244 -0.204 -0.411 -0.209 -0.195 + -0.358 -0.274 -0.186 -0.293 -0.281 -0.132 -0.310 -0.399 -0.213 -0.203 + -0.190 -0.168 -0.246 -0.044 0.040 -0.349 -0.193 -0.350 -0.075 -0.065 + -0.089 -0.367 -0.463 -0.008 -0.261 -0.407 -0.362 -0.319 -0.114 -0.083 + -0.018 -0.253 -0.418 -0.333 -0.461 -0.011 -0.439 -0.153 -0.377 -0.438 + -0.121 -0.273 -0.491 -0.193 0.126 -0.105 0.180 -0.156 -0.034 -0.603 + 0.099 0.223 -0.201 -0.259 -0.023 -0.249 0.134 -0.048 0.101 -0.368 + -0.291 -0.057 -0.251 -0.100 -0.009 0.180 0.160 0.267 -0.037 -0.144 + + 573 iasi_metop-a 5507 0.195584E-01 + -0.151 0.045 -0.204 -0.304 0.104 -0.084 -0.118 -0.182 0.078 -0.104 + -0.120 -0.150 -0.108 -0.195 -0.267 -0.092 -0.041 -0.153 -0.139 -0.015 + -0.108 -0.091 -0.075 -0.101 -0.058 -0.056 -0.321 -0.308 0.009 -0.059 + -0.365 -0.379 -0.673 -0.300 -0.042 -0.701 -0.397 -0.575 -0.330 -0.241 + -0.571 -0.493 -0.524 -0.331 -0.271 -0.845 -0.519 -0.472 -0.224 -0.309 + -0.062 -0.408 -0.608 -0.450 -0.554 -0.414 -0.771 -0.438 -0.635 -0.303 + -0.355 -0.345 -0.575 -0.214 -0.202 -0.371 -0.153 -0.458 -0.522 -0.832 + -0.170 -0.240 -0.420 -0.686 -0.290 -0.456 -0.059 -0.217 0.119 -0.488 + -0.482 -0.405 -0.401 -0.446 -0.234 -0.353 -0.238 -0.039 -0.257 -0.369 + + 574 iasi_metop-a 5509 0.206040E-01 + -0.156 -0.159 -0.094 -0.383 0.018 -0.113 -0.280 -0.302 -0.225 -0.282 + -0.356 -0.275 -0.289 -0.276 -0.417 -0.390 -0.104 -0.245 -0.315 -0.172 + -0.250 -0.251 -0.212 -0.327 -0.244 -0.177 -0.424 -0.519 -0.167 -0.264 + -0.302 -0.490 -0.601 -0.243 -0.055 -0.654 -0.318 -0.564 -0.263 -0.163 + -0.550 -0.527 -0.520 -0.337 -0.429 -0.752 -0.534 -0.531 -0.262 -0.301 + -0.085 -0.444 -0.647 -0.432 -0.550 -0.328 -0.770 -0.408 -0.722 -0.457 + -0.385 -0.370 -0.554 -0.193 -0.193 -0.282 -0.042 -0.447 -0.510 -0.818 + -0.028 -0.226 -0.424 -0.602 -0.212 -0.469 -0.122 -0.257 0.027 -0.621 + -0.536 -0.358 -0.352 -0.418 -0.185 -0.262 -0.109 -0.017 -0.157 -0.378 + + 575 iasi_metop-a 5517 0.190175E-01 + -0.137 -0.091 -0.176 -0.426 0.041 -0.155 -0.299 -0.293 -0.083 -0.201 + -0.291 -0.196 -0.269 -0.266 -0.422 -0.301 -0.096 -0.230 -0.323 -0.106 + -0.225 -0.198 -0.196 -0.289 -0.198 -0.241 -0.419 -0.434 -0.137 -0.272 + -0.339 -0.417 -0.618 -0.325 -0.014 -0.622 -0.311 -0.544 -0.300 -0.199 + -0.514 -0.477 -0.433 -0.303 -0.240 -0.865 -0.481 -0.432 -0.255 -0.287 + -0.049 -0.297 -0.625 -0.418 -0.573 -0.299 -0.754 -0.413 -0.692 -0.415 + -0.317 -0.366 -0.567 -0.201 -0.162 -0.362 -0.196 -0.413 -0.460 -0.778 + -0.137 -0.161 -0.334 -0.583 -0.293 -0.428 0.005 -0.271 0.115 -0.356 + -0.477 -0.325 -0.425 -0.446 -0.209 -0.227 -0.147 0.004 -0.218 -0.338 + + 576 iasi_metop-a 5528 0.578624E-01 + 0.085 -0.148 -0.091 -0.145 0.240 -0.171 -0.178 -0.110 0.016 -0.287 + -0.222 -0.184 -0.076 -0.092 -0.463 -0.209 -0.002 -0.070 -0.125 -0.095 + -0.092 -0.194 -0.080 -0.162 -0.112 -0.140 -0.355 -0.400 -0.148 -0.195 + -0.268 -0.152 -0.231 -0.261 -0.046 0.029 -0.291 -0.437 -0.320 -0.200 + -0.107 -0.326 -0.373 -0.243 -0.207 -0.073 -0.035 -0.377 -0.414 -0.211 + -0.171 -0.063 -0.294 -0.214 -0.153 -0.037 -0.406 -0.164 -0.018 -0.422 + -0.240 0.112 -0.293 -0.177 0.128 -0.425 -0.090 -0.482 -0.055 -0.456 + -0.352 -0.106 -0.203 -0.163 -0.208 -0.243 -0.202 -0.346 -0.259 -0.107 + -0.233 -0.344 -0.101 -0.337 -0.173 -0.274 -0.081 0.106 -0.391 -0.444 + + 577 iasi_metop-a 5558 0.261629E-01 + -0.148 -0.141 -0.281 -0.449 -0.057 -0.103 -0.286 -0.172 -0.071 -0.250 + -0.412 -0.291 -0.201 -0.083 -0.239 -0.163 -0.097 -0.353 -0.103 -0.004 + -0.285 -0.156 -0.138 -0.140 -0.177 -0.015 -0.187 -0.208 -0.046 -0.110 + -0.538 -0.460 -0.607 -0.341 -0.258 -0.569 -0.386 -0.676 -0.335 -0.273 + -0.354 -0.629 -0.740 -0.413 -0.528 -0.728 -0.596 -0.584 -0.337 -0.298 + -0.169 -0.477 -0.750 -0.709 -0.769 -0.235 -0.749 -0.538 -0.710 -0.478 + -0.329 -0.449 -0.642 -0.378 -0.144 -0.429 -0.147 -0.469 -0.291 -1.095 + -0.177 -0.098 -0.417 -0.574 -0.322 -0.596 -0.272 -0.279 -0.190 -0.645 + -0.531 -0.370 -0.539 -0.326 -0.181 -0.200 -0.113 -0.030 -0.318 -0.483 + + 578 iasi_metop-a 5697 0.290540E-01 + -0.431 -0.537 -0.708 -0.761 -0.262 -0.534 -0.531 -0.663 -0.280 -0.630 + -0.450 -0.439 -0.346 -0.638 -0.510 -0.539 -0.266 -0.429 -0.597 -0.364 + -0.293 -0.403 -0.336 -0.420 -0.380 -0.396 -0.574 -0.602 -0.205 -0.351 + -0.735 -0.735 -0.801 -0.673 -0.434 -0.620 -0.656 -0.870 -0.346 -0.629 + -0.507 -0.878 -0.685 -0.674 -0.557 -1.214 -0.691 -0.692 -0.526 -0.746 + -0.118 -0.663 -0.817 -1.019 -1.092 -0.459 -0.741 -0.680 -0.926 -0.591 + -0.485 -0.834 -0.811 -0.448 -0.215 -0.822 -0.469 -0.499 -0.630 -1.356 + -0.386 -0.593 -0.467 -0.691 -0.570 -0.756 -0.250 -0.599 -0.185 -0.618 + -0.459 -0.809 -0.636 -0.744 -0.294 -0.707 -0.379 -0.303 -0.625 -0.939 + + 579 iasi_metop-a 5714 0.243659E-01 + -0.501 -0.619 -0.685 -0.798 -0.502 -0.549 -0.626 -0.791 -0.388 -0.585 + -0.630 -0.688 -0.683 -0.792 -0.603 -0.919 -0.462 -0.608 -0.823 -0.750 + -0.549 -0.602 -0.565 -0.874 -0.692 -0.813 -0.931 -1.108 -0.675 -0.803 + -0.585 -0.796 -0.852 -0.442 -0.416 -0.682 -0.614 -0.786 -0.392 -0.442 + -0.496 -0.621 -0.825 -0.498 -0.644 -0.807 -0.868 -0.749 -0.543 -0.488 + -0.108 -0.565 -0.869 -0.578 -0.935 -0.359 -0.979 -0.694 -0.796 -0.601 + -0.547 -0.490 -0.765 -0.367 -0.320 -0.586 -0.404 -0.574 -0.874 -1.156 + -0.340 -0.468 -0.423 -0.769 -0.442 -0.740 -0.403 -0.320 -0.150 -0.597 + -0.580 -0.612 -0.653 -0.653 -0.483 -0.498 -0.405 -0.241 -0.616 -0.626 + + 580 iasi_metop-a 5749 0.358218E-01 + 0.070 0.009 0.047 -0.075 0.095 -0.049 -0.052 -0.161 -0.040 -0.191 + -0.245 -0.154 -0.174 -0.170 -0.335 -0.467 -0.202 -0.254 -0.466 -0.344 + -0.265 -0.404 -0.263 -0.408 -0.438 -0.517 -0.852 -0.740 -0.413 -0.503 + -0.156 -0.088 -0.071 0.117 0.129 -0.048 -0.171 -0.176 0.212 0.183 + 0.098 -0.050 -0.139 0.113 -0.162 -0.113 -0.018 -0.247 -0.067 -0.038 + 0.260 0.014 -0.178 -0.378 -0.467 0.073 -0.359 0.085 -0.103 -0.169 + 0.023 -0.077 -0.280 0.075 0.272 -0.290 0.134 -0.027 -0.089 -0.677 + 0.281 0.062 -0.041 0.050 0.002 -0.211 0.120 -0.002 0.305 -0.184 + -0.208 0.033 -0.034 -0.117 0.026 0.056 0.239 0.397 0.013 -0.114 + + 581 iasi_metop-a 5766 0.194927E-01 + 0.246 0.326 0.108 0.095 0.365 0.170 0.204 0.104 0.430 0.256 + 0.249 0.238 0.133 0.177 0.070 0.101 0.360 0.202 0.088 0.379 + 0.309 0.263 0.279 0.217 0.240 0.134 0.075 0.049 0.371 0.184 + 0.250 0.438 0.146 0.469 0.694 0.243 0.254 0.103 0.737 0.441 + 0.466 0.314 0.332 0.419 0.321 -0.096 0.047 0.313 0.509 0.290 + 0.753 0.269 0.023 0.031 0.014 0.581 -0.078 0.189 0.104 0.354 + 0.183 0.273 -0.034 0.584 0.712 0.242 0.376 0.382 0.273 -0.297 + 0.561 0.481 0.417 0.241 0.363 0.083 0.377 0.536 0.641 0.423 + 0.317 0.152 0.374 0.375 0.294 0.372 0.460 0.624 0.262 0.199 + + 582 iasi_metop-a 5785 0.156269E-01 + 0.303 0.224 0.267 0.154 0.391 0.337 0.241 0.286 0.403 0.279 + 0.179 0.264 0.168 0.285 0.258 0.137 0.374 0.328 0.146 0.263 + 0.372 0.391 0.408 0.266 0.306 0.286 0.087 -0.011 0.373 0.197 + -0.022 -0.124 -0.212 0.104 0.286 -0.041 0.055 -0.235 0.082 0.199 + 0.040 -0.153 -0.198 0.194 -0.163 -0.383 -0.253 -0.210 0.024 0.065 + 0.357 0.094 -0.300 -0.121 -0.284 0.172 -0.411 -0.086 -0.336 -0.004 + -0.003 0.001 -0.185 0.274 0.266 -0.004 0.181 -0.021 -0.041 -0.469 + 0.157 0.209 -0.008 -0.169 0.033 -0.132 0.151 0.134 0.325 -0.222 + -0.092 -0.027 -0.081 0.121 0.131 0.057 0.235 0.362 0.157 -0.136 + + 583 iasi_metop-a 5798 0.102113E-01 + -0.160 0.014 -0.295 -0.323 0.129 -0.090 -0.191 -0.082 0.113 -0.039 + 0.020 -0.075 -0.047 -0.068 -0.272 -0.166 0.194 -0.035 -0.154 0.041 + 0.075 0.161 0.038 -0.003 0.135 0.094 -0.118 -0.116 0.160 0.115 + -0.368 -0.208 -0.701 -0.243 0.025 -0.573 -0.400 -0.314 -0.270 -0.398 + -0.460 -0.180 -0.330 -0.220 -0.333 -0.672 -0.431 -0.410 -0.204 -0.203 + -0.045 -0.412 -0.478 -0.532 -0.609 -0.284 -0.792 -0.416 -0.548 -0.266 + -0.460 -0.438 -0.563 -0.115 -0.098 -0.144 -0.163 -0.360 -0.611 -0.689 + -0.218 -0.147 -0.407 -0.431 -0.270 -0.554 -0.244 -0.088 -0.013 -0.383 + -0.419 -0.371 -0.437 -0.455 -0.364 -0.377 -0.372 -0.101 -0.346 -0.330 + + 584 iasi_metop-a 5799 0.113504E-01 + -0.111 -0.068 -0.259 -0.294 -0.004 -0.226 -0.350 -0.285 0.003 -0.241 + -0.278 -0.150 -0.266 -0.182 -0.328 -0.370 -0.011 -0.176 -0.352 -0.228 + -0.115 -0.088 -0.187 -0.307 -0.280 -0.188 -0.476 -0.533 -0.233 -0.240 + -0.142 -0.028 -0.429 -0.075 0.192 -0.133 -0.141 -0.081 -0.072 -0.166 + -0.251 0.048 -0.207 -0.115 -0.116 -0.592 -0.316 -0.154 0.023 0.022 + 0.412 -0.221 -0.407 -0.415 -0.473 0.032 -0.685 -0.190 -0.408 -0.159 + -0.407 -0.095 -0.493 0.156 0.071 -0.042 0.006 -0.170 -0.351 -0.648 + -0.108 -0.036 -0.295 -0.303 -0.028 -0.411 -0.220 0.204 0.102 -0.134 + -0.299 -0.207 -0.237 -0.267 -0.265 -0.188 -0.236 0.162 -0.264 -0.106 + + 585 iasi_metop-a 5801 0.168813E-01 + 0.332 0.261 0.195 0.158 0.322 0.155 0.057 0.159 0.332 0.092 + 0.014 0.242 0.046 0.060 0.121 -0.050 0.245 0.085 -0.015 0.138 + 0.196 0.075 0.160 0.010 -0.030 -0.017 -0.265 -0.276 0.120 -0.051 + 0.227 0.337 0.164 0.558 0.651 0.384 0.293 0.238 0.652 0.442 + 0.480 0.115 0.223 0.467 0.331 -0.015 0.121 0.096 0.445 0.365 + 0.790 0.331 0.013 -0.063 -0.039 0.554 -0.151 0.229 -0.054 0.327 + 0.338 0.143 -0.048 0.477 0.615 0.163 0.412 0.443 0.226 -0.438 + 0.413 0.469 0.543 0.059 0.304 0.156 0.360 0.408 0.613 0.317 + 0.290 0.109 0.441 0.453 0.321 0.404 0.406 0.819 0.299 0.211 + + 586 iasi_metop-a 5817 0.175513E-01 + 0.457 0.430 0.310 0.237 0.579 0.341 0.362 0.359 0.684 0.376 + 0.431 0.438 0.471 0.413 0.291 0.098 0.652 0.451 0.193 0.405 + 0.523 0.490 0.509 0.326 0.355 0.334 0.164 0.109 0.490 0.207 + 0.462 0.581 0.219 0.511 0.765 0.549 0.257 0.093 0.747 0.517 + 0.534 0.433 0.340 0.302 0.423 -0.148 0.255 0.244 0.711 0.429 + 0.810 0.388 0.079 0.032 0.008 0.552 -0.110 0.310 0.053 0.497 + 0.302 0.267 -0.008 0.652 0.701 0.309 0.435 0.363 0.292 -0.419 + 0.603 0.381 0.461 0.198 0.374 0.037 0.328 0.510 0.577 0.389 + 0.328 0.207 0.376 0.347 0.328 0.295 0.575 0.604 0.235 0.235 + + 587 iasi_metop-a 5833 0.132340E-01 + 0.359 0.369 0.189 0.186 0.428 0.224 0.192 0.344 0.409 0.403 + 0.320 0.272 0.288 0.268 0.199 0.037 0.504 0.410 0.142 0.287 + 0.434 0.487 0.428 0.211 0.291 0.250 0.081 -0.049 0.340 0.143 + 0.165 0.286 -0.046 0.272 0.573 0.225 -0.129 0.043 0.366 0.277 + 0.126 0.254 -0.016 0.157 0.149 -0.294 -0.066 0.004 0.324 0.314 + 0.598 -0.042 -0.195 -0.177 -0.251 0.288 -0.513 -0.013 -0.078 0.185 + 0.063 0.066 -0.179 0.414 0.447 0.205 0.211 0.109 -0.089 -0.409 + 0.225 0.213 0.156 -0.006 0.268 -0.252 0.129 0.354 0.345 0.179 + 0.049 -0.035 0.009 0.160 -0.009 0.112 0.071 0.511 0.042 0.105 + + 588 iasi_metop-a 5834 0.204702E-01 + 0.706 0.566 0.481 0.486 0.651 0.400 0.411 0.370 0.600 0.417 + 0.290 0.529 0.389 0.339 0.459 0.185 0.502 0.425 0.212 0.356 + 0.496 0.467 0.450 0.333 0.263 0.170 0.061 0.036 0.356 0.195 + 0.732 0.908 0.556 0.830 1.083 0.853 0.470 0.484 1.043 0.888 + 0.868 0.546 0.667 0.709 0.743 0.142 0.355 0.511 1.017 0.566 + 1.085 0.596 0.299 0.172 0.199 0.852 0.140 0.598 0.371 0.594 + 0.547 0.496 0.180 0.728 1.001 0.401 0.687 0.679 0.673 -0.005 + 0.973 0.647 0.816 0.486 0.730 0.447 0.564 0.650 0.882 0.562 + 0.615 0.596 0.749 0.631 0.486 0.479 0.745 0.985 0.545 0.480 + + 589 iasi_metop-a 5836 0.466908E-02 + 0.129 0.141 0.026 -0.014 0.339 0.062 0.133 0.328 0.463 0.281 + 0.382 0.280 0.354 0.300 0.295 0.160 0.515 0.448 0.116 0.400 + 0.522 0.570 0.510 0.394 0.483 0.441 0.281 0.201 0.445 0.367 + -0.156 -0.102 -0.590 -0.154 0.302 -0.236 -0.467 -0.125 -0.121 -0.193 + -0.372 0.016 -0.137 -0.154 -0.326 -0.641 -0.475 -0.403 -0.084 -0.079 + -0.081 -0.478 -0.259 -0.469 -0.564 -0.207 -0.749 -0.487 -0.403 -0.194 + -0.426 -0.296 -0.558 0.147 -0.279 -0.115 -0.256 -0.245 -0.513 -0.824 + 0.070 -0.186 -0.495 -0.440 -0.008 -0.691 -0.291 -0.049 -0.089 -0.243 + -0.525 -0.221 -0.426 -0.638 -0.296 -0.375 -0.499 -0.077 -0.273 -0.358 + + 590 iasi_metop-a 5849 0.837071E-02 + -0.185 -0.130 -0.424 -0.401 -0.039 -0.288 -0.387 -0.355 -0.107 -0.243 + -0.434 -0.229 -0.326 -0.218 -0.317 -0.563 -0.144 -0.251 -0.421 -0.309 + -0.287 -0.186 -0.270 -0.286 -0.398 -0.396 -0.610 -0.583 -0.287 -0.325 + -0.424 -0.432 -0.676 -0.163 0.041 -0.568 -0.413 -0.349 0.017 -0.314 + -0.374 -0.183 -0.345 -0.300 -0.317 -0.560 -0.458 -0.297 -0.111 -0.039 + 0.231 -0.517 -0.669 -0.327 -0.605 -0.090 -0.719 -0.315 -0.533 -0.215 + -0.439 -0.235 -0.540 -0.100 -0.054 -0.114 -0.291 -0.349 -0.431 -0.751 + -0.179 -0.181 -0.288 -0.337 -0.285 -0.524 -0.206 -0.159 0.074 -0.410 + -0.369 -0.350 -0.392 -0.399 -0.352 -0.249 -0.281 -0.117 -0.369 -0.183 + + 591 iasi_metop-a 5851 0.244260E-01 + 0.370 0.112 0.212 0.209 0.383 0.137 0.097 0.073 0.270 -0.039 + -0.059 0.235 0.128 0.010 0.037 -0.130 0.105 -0.005 -0.098 -0.004 + 0.192 -0.023 0.089 -0.011 -0.117 -0.222 -0.420 -0.291 -0.017 -0.198 + 0.177 0.219 0.303 0.393 0.530 0.291 0.242 0.042 0.647 0.456 + 0.471 0.185 0.180 0.393 0.232 -0.081 0.116 0.038 0.297 0.105 + 0.586 0.223 -0.040 -0.173 -0.141 0.431 -0.041 0.162 0.075 0.206 + 0.315 0.082 -0.014 0.425 0.508 -0.044 0.342 0.297 0.254 -0.547 + 0.463 0.187 0.422 0.134 0.307 0.137 0.418 0.217 0.494 0.187 + 0.356 0.145 0.324 0.142 0.291 0.247 0.457 0.620 0.442 0.028 + + 592 iasi_metop-a 5852 0.147287E-01 + 0.124 0.292 -0.054 -0.087 0.326 0.203 0.098 0.147 0.362 0.277 + 0.368 0.152 0.106 0.188 0.167 0.072 0.395 0.347 0.098 0.314 + 0.376 0.408 0.381 0.153 0.320 0.260 0.175 0.038 0.398 0.277 + -0.074 -0.101 -0.272 0.222 0.235 -0.099 -0.074 -0.092 0.266 0.200 + 0.033 -0.046 -0.059 0.044 -0.031 -0.364 -0.129 0.041 0.266 0.137 + 0.500 -0.013 -0.257 -0.199 -0.299 0.334 -0.407 -0.143 -0.320 0.079 + -0.046 0.007 -0.312 0.244 0.286 0.014 -0.024 0.095 -0.422 -0.406 + 0.261 0.127 -0.025 -0.136 0.036 -0.211 0.096 0.278 0.331 -0.009 + -0.093 -0.089 -0.013 0.018 0.082 -0.068 0.081 0.276 -0.060 -0.050 + + 593 iasi_metop-a 5865 0.760777E-02 + -0.195 -0.164 -0.268 -0.368 -0.055 -0.240 -0.282 -0.121 0.186 -0.121 + -0.238 -0.153 -0.082 -0.041 -0.240 -0.223 0.136 0.015 -0.318 0.027 + 0.067 0.092 -0.012 -0.032 -0.103 0.025 -0.338 -0.213 -0.014 -0.064 + -0.336 -0.070 -0.499 -0.274 0.298 -0.283 -0.598 -0.145 -0.223 -0.414 + -0.361 -0.018 -0.252 -0.314 -0.492 -0.693 -0.473 -0.449 -0.262 -0.023 + -0.237 -0.504 -0.222 -0.572 -0.658 -0.329 -0.943 -0.439 -0.652 -0.305 + -0.525 -0.243 -0.499 -0.002 -0.466 -0.144 -0.290 -0.415 -0.568 -0.771 + 0.025 -0.040 -0.554 -0.380 -0.100 -0.872 -0.343 -0.165 -0.122 -0.480 + -0.549 -0.421 -0.444 -0.746 -0.329 -0.429 -0.466 -0.219 -0.495 -0.350 + + 594 iasi_metop-a 5869 0.128020E-01 + -0.324 -0.175 -0.507 -0.472 -0.220 -0.280 -0.475 -0.307 -0.194 -0.455 + -0.505 -0.184 -0.285 -0.277 -0.332 -0.485 -0.146 -0.317 -0.388 -0.192 + -0.327 -0.162 -0.271 -0.394 -0.436 -0.403 -0.669 -0.551 -0.331 -0.482 + -0.133 0.004 -0.451 -0.155 0.264 -0.282 -0.484 -0.120 -0.118 -0.275 + -0.343 -0.042 -0.185 -0.115 -0.328 -0.663 -0.387 -0.310 -0.117 -0.027 + -0.036 -0.321 -0.313 -0.471 -0.575 -0.214 -0.748 -0.386 -0.548 -0.193 + -0.533 -0.198 -0.527 0.079 -0.200 -0.118 -0.263 -0.267 -0.579 -0.834 + -0.073 -0.154 -0.468 -0.316 -0.042 -0.692 -0.315 -0.094 -0.041 -0.324 + -0.474 -0.240 -0.317 -0.410 -0.280 -0.211 -0.410 0.028 -0.386 -0.363 + + 595 iasi_metop-a 5881 0.391279E-01 + 0.455 0.223 0.227 0.238 0.537 0.082 0.124 0.151 0.291 -0.123 + 0.002 0.113 0.155 0.061 0.037 -0.135 0.114 -0.064 -0.118 -0.051 + 0.011 -0.126 -0.024 0.083 -0.106 -0.239 -0.415 -0.327 -0.122 -0.249 + -0.023 -0.059 0.073 0.044 0.139 -0.057 -0.144 -0.215 0.019 0.059 + 0.296 -0.140 -0.189 0.022 -0.012 0.004 0.052 -0.171 -0.028 -0.217 + 0.007 0.030 -0.112 -0.316 -0.089 -0.057 -0.231 -0.042 -0.061 -0.248 + 0.076 -0.052 -0.234 0.025 0.306 -0.352 -0.008 -0.150 0.134 -0.525 + 0.002 0.030 -0.024 -0.045 -0.138 -0.024 0.090 -0.139 0.150 -0.120 + 0.012 -0.049 0.019 -0.305 0.184 -0.028 0.147 0.253 0.026 -0.300 + + 596 iasi_metop-a 5884 0.277290E-01 + 0.556 0.559 0.480 0.343 0.472 0.501 0.543 0.147 0.620 0.306 + 0.267 0.333 0.352 0.353 0.374 0.206 0.423 0.251 0.439 0.410 + 0.297 0.350 0.377 0.247 0.243 0.354 0.196 0.048 0.436 0.312 + 0.631 0.686 0.607 0.909 0.910 0.747 0.614 0.556 1.070 0.875 + 0.849 0.638 0.664 0.936 0.621 0.532 0.462 0.374 0.796 0.508 + 1.090 0.698 0.259 0.401 0.473 0.873 0.238 0.684 0.600 0.572 + 0.694 0.726 0.280 0.908 0.865 0.305 0.825 0.718 0.658 0.093 + 0.921 0.489 0.870 0.638 0.682 0.475 0.708 0.650 0.892 0.561 + 0.688 0.512 0.657 0.695 0.574 0.743 0.817 0.958 0.875 0.665 + + 597 iasi_metop-a 5897 -0.235258E-02 + 0.034 0.150 -0.077 -0.099 0.329 0.153 0.103 0.281 0.524 0.296 + 0.384 0.353 0.299 0.263 0.281 0.330 0.531 0.456 0.131 0.590 + 0.614 0.577 0.481 0.514 0.620 0.566 0.406 0.437 0.624 0.510 + -0.460 -0.222 -0.658 -0.411 0.053 -0.530 -0.600 -0.306 -0.310 -0.541 + -0.507 -0.320 -0.246 -0.348 -0.434 -0.782 -0.663 -0.630 -0.367 -0.331 + -0.309 -0.676 -0.504 -0.646 -0.688 -0.506 -0.876 -0.638 -0.750 -0.376 + -0.487 -0.465 -0.683 -0.202 -0.440 -0.333 -0.399 -0.440 -0.578 -0.962 + -0.384 -0.418 -0.590 -0.546 -0.257 -0.889 -0.494 -0.308 -0.246 -0.552 + -0.746 -0.519 -0.560 -0.648 -0.517 -0.570 -0.557 -0.336 -0.628 -0.665 + + 598 iasi_metop-a 5900 0.201086E-01 + 0.665 0.509 0.297 0.433 0.535 0.277 0.276 0.168 0.520 0.104 + -0.026 0.236 0.214 0.044 0.064 -0.204 0.275 0.046 -0.111 0.051 + 0.014 0.013 0.039 -0.117 -0.151 -0.277 -0.472 -0.473 -0.066 -0.233 + 0.867 1.071 0.794 1.044 1.255 1.309 0.584 0.585 1.299 0.839 + 0.976 0.701 0.991 0.915 0.611 0.264 0.475 0.648 1.085 0.701 + 1.212 0.712 0.363 0.348 0.402 1.000 0.250 0.806 0.366 0.725 + 0.633 0.588 0.448 0.953 1.069 0.589 0.733 0.819 0.661 -0.005 + 1.017 0.751 0.880 0.575 0.758 0.454 0.559 0.769 0.863 0.761 + 0.835 0.683 0.790 0.892 0.641 0.539 0.865 1.161 0.663 0.617 + + 599 iasi_metop-a 5916 0.185408E-01 + 0.776 0.768 0.693 0.614 0.872 0.685 0.690 0.682 0.945 0.799 + 0.854 0.918 0.704 0.776 0.753 0.550 0.987 0.793 0.492 0.679 + 0.846 0.901 0.860 0.613 0.735 0.638 0.545 0.480 0.831 0.590 + 0.604 0.746 0.582 0.862 0.888 0.771 0.439 0.377 0.986 0.704 + 0.723 0.439 0.673 0.830 0.558 0.173 0.247 0.364 0.760 0.519 + 0.959 0.486 0.146 0.167 0.242 0.730 0.061 0.613 0.249 0.516 + 0.456 0.460 0.177 0.764 0.880 0.296 0.629 0.726 0.477 -0.195 + 0.822 0.597 0.561 0.548 0.538 0.363 0.473 0.554 0.789 0.477 + 0.552 0.492 0.756 0.626 0.505 0.482 0.753 0.866 0.394 0.540 + + 600 iasi_metop-a 5932 0.172105E-01 + 0.820 0.630 0.595 0.635 0.870 0.555 0.650 0.705 0.910 0.700 + 0.685 0.747 0.647 0.595 0.636 0.435 0.823 0.651 0.370 0.703 + 0.793 0.759 0.800 0.580 0.641 0.459 0.405 0.379 0.707 0.399 + 0.728 0.905 0.595 1.026 1.164 1.046 0.591 0.346 1.106 0.808 + 0.802 0.606 0.740 0.836 0.399 0.031 0.392 0.406 0.995 0.512 + 1.108 0.449 0.229 0.087 0.239 0.803 0.064 0.654 0.173 0.675 + 0.379 0.410 0.219 0.933 1.019 0.440 0.522 0.806 0.575 -0.209 + 0.819 0.604 0.711 0.447 0.641 0.357 0.565 0.576 0.780 0.599 + 0.665 0.362 0.596 0.637 0.555 0.341 0.735 0.738 0.606 0.523 + + 601 iasi_metop-a 5948 0.218333E-01 + 0.664 0.688 0.473 0.526 0.772 0.405 0.546 0.700 0.839 0.606 + 0.591 0.668 0.558 0.564 0.591 0.338 0.838 0.644 0.382 0.575 + 0.727 0.863 0.772 0.494 0.658 0.496 0.455 0.322 0.723 0.443 + 0.632 0.795 0.345 0.849 1.029 0.738 0.341 0.311 0.971 0.665 + 0.599 0.548 0.433 0.629 0.309 -0.122 0.157 0.313 0.849 0.513 + 0.849 0.403 0.121 0.021 0.022 0.647 -0.123 0.321 0.198 0.471 + 0.444 0.385 0.098 0.801 0.798 0.370 0.643 0.504 0.165 -0.357 + 0.814 0.575 0.483 0.163 0.498 0.113 0.607 0.607 0.610 0.481 + 0.434 0.314 0.437 0.456 0.388 0.290 0.554 0.831 0.362 0.346 + + 602 iasi_metop-a 5963 0.309062E-01 + 0.607 0.554 0.471 0.397 0.604 0.401 0.460 0.427 0.545 0.415 + 0.398 0.426 0.421 0.450 0.468 0.260 0.614 0.529 0.369 0.364 + 0.478 0.553 0.541 0.344 0.435 0.301 0.257 0.117 0.529 0.317 + 0.400 0.291 0.238 0.547 0.602 0.568 0.213 0.171 0.736 0.459 + 0.438 0.217 0.263 0.512 0.277 -0.015 0.054 0.017 0.467 0.240 + 0.661 0.240 -0.060 0.028 -0.165 0.530 -0.181 0.213 0.103 0.375 + 0.355 0.166 0.060 0.479 0.672 0.073 0.428 0.503 0.335 -0.315 + 0.671 0.504 0.586 0.312 0.339 0.133 0.429 0.501 0.650 0.271 + 0.280 0.106 0.516 0.403 0.336 0.455 0.544 0.701 0.307 0.223 + + 603 iasi_metop-a 5968 0.277960E-01 + 0.229 0.124 0.111 0.084 0.291 0.203 0.146 0.115 0.315 0.254 + 0.122 0.205 0.194 0.181 0.094 -0.015 0.314 0.182 0.017 0.220 + 0.317 0.192 0.299 0.106 0.290 0.190 -0.028 -0.095 0.318 0.143 + -0.357 -0.234 -0.364 -0.050 -0.097 -0.427 -0.200 -0.392 -0.071 -0.025 + -0.168 -0.288 -0.440 0.035 -0.315 -0.287 -0.366 -0.317 -0.302 -0.027 + -0.125 -0.361 -0.610 -0.350 -0.525 -0.099 -0.570 -0.273 -0.378 -0.254 + -0.095 -0.207 -0.369 -0.177 0.054 -0.121 0.106 -0.129 -0.120 -0.624 + 0.062 0.078 -0.099 -0.247 -0.150 -0.314 -0.028 0.053 0.153 -0.387 + -0.328 -0.056 -0.174 -0.178 -0.020 0.179 0.097 0.210 -0.118 -0.146 + + 604 iasi_metop-a 5978 0.389876E-01 + 0.134 0.056 0.028 0.019 0.293 0.072 0.033 0.051 0.214 -0.061 + -0.068 -0.011 0.087 -0.061 -0.195 -0.036 0.069 -0.025 -0.044 0.118 + 0.036 -0.081 -0.028 0.030 0.025 -0.086 -0.318 -0.235 0.116 -0.041 + -0.319 -0.100 -0.196 -0.054 -0.034 -0.149 -0.184 -0.373 -0.067 0.120 + 0.054 -0.262 -0.443 -0.106 -0.170 -0.240 -0.075 -0.326 -0.147 -0.311 + -0.002 -0.243 -0.277 -0.458 -0.523 -0.142 -0.360 -0.160 -0.301 -0.158 + -0.019 -0.278 -0.456 -0.195 0.285 -0.460 0.132 -0.124 -0.139 -0.836 + 0.275 -0.084 -0.127 -0.117 -0.041 -0.412 0.191 -0.215 0.147 -0.320 + -0.332 -0.057 -0.174 -0.301 0.107 -0.035 0.194 0.219 -0.018 -0.247 + + 605 iasi_metop-a 5988 0.645769E-02 + -0.321 -0.130 -0.403 -0.567 0.046 -0.266 -0.162 -0.312 0.133 -0.247 + -0.211 -0.209 -0.023 -0.195 -0.180 -0.103 0.160 -0.145 -0.064 0.110 + 0.074 0.024 0.077 -0.015 0.021 -0.003 -0.083 -0.169 0.169 -0.006 + -0.409 -0.197 -0.476 -0.342 0.307 -0.499 -0.592 -0.333 -0.358 -0.444 + -0.483 -0.120 -0.366 -0.410 -0.510 -0.883 -0.452 -0.351 -0.334 -0.351 + -0.360 -0.599 -0.409 -0.724 -0.608 -0.317 -0.966 -0.738 -0.700 -0.283 + -0.601 -0.336 -0.546 -0.288 -0.562 -0.315 -0.356 -0.429 -0.689 -0.918 + -0.065 -0.085 -0.583 -0.594 -0.181 -0.847 -0.375 -0.069 -0.147 -0.488 + -0.757 -0.435 -0.451 -0.852 -0.560 -0.515 -0.467 -0.185 -0.566 -0.616 + + 606 iasi_metop-a 5992 0.503099E-02 + -0.552 -0.419 -0.750 -0.780 -0.322 -0.502 -0.635 -0.424 -0.118 -0.582 + -0.690 -0.439 -0.349 -0.387 -0.405 -0.547 -0.215 -0.449 -0.453 -0.400 + -0.416 -0.350 -0.414 -0.601 -0.634 -0.433 -0.759 -0.723 -0.496 -0.614 + -0.423 -0.239 -0.481 -0.495 0.318 -0.463 -0.605 -0.442 -0.339 -0.488 + -0.547 -0.084 -0.468 -0.488 -0.463 -0.904 -0.522 -0.448 -0.339 -0.379 + -0.433 -0.609 -0.380 -0.639 -0.644 -0.438 -0.980 -0.762 -0.772 -0.406 + -0.528 -0.379 -0.570 -0.292 -0.612 -0.314 -0.397 -0.478 -0.573 -0.887 + -0.300 -0.278 -0.679 -0.605 -0.295 -0.845 -0.552 -0.181 -0.172 -0.494 + -0.677 -0.422 -0.555 -0.937 -0.636 -0.738 -0.526 -0.154 -0.632 -0.668 + + 607 iasi_metop-a 5994 0.465690E-02 + -0.482 -0.386 -0.686 -0.744 -0.289 -0.573 -0.618 -0.425 -0.155 -0.573 + -0.630 -0.463 -0.391 -0.402 -0.390 -0.637 -0.211 -0.559 -0.393 -0.433 + -0.417 -0.357 -0.447 -0.633 -0.661 -0.479 -0.784 -0.803 -0.607 -0.597 + -0.321 -0.137 -0.480 -0.401 0.311 -0.300 -0.647 -0.331 -0.246 -0.440 + -0.488 -0.161 -0.418 -0.377 -0.450 -0.866 -0.407 -0.422 -0.267 -0.311 + -0.375 -0.551 -0.323 -0.604 -0.570 -0.491 -1.000 -0.706 -0.639 -0.356 + -0.573 -0.353 -0.537 -0.235 -0.496 -0.326 -0.414 -0.482 -0.589 -0.926 + -0.161 -0.241 -0.691 -0.745 -0.350 -0.828 -0.447 -0.173 -0.219 -0.465 + -0.769 -0.409 -0.573 -0.967 -0.611 -0.666 -0.497 -0.068 -0.579 -0.637 + + 608 iasi_metop-a 5997 0.612630E-02 + -0.477 -0.363 -0.662 -0.731 -0.264 -0.489 -0.568 -0.425 -0.208 -0.514 + -0.628 -0.418 -0.344 -0.388 -0.404 -0.609 -0.241 -0.584 -0.459 -0.470 + -0.438 -0.397 -0.422 -0.700 -0.686 -0.466 -0.822 -0.792 -0.553 -0.599 + -0.346 -0.183 -0.443 -0.385 0.366 -0.464 -0.509 -0.315 -0.326 -0.522 + -0.429 -0.149 -0.445 -0.375 -0.478 -0.814 -0.485 -0.369 -0.280 -0.319 + -0.400 -0.542 -0.283 -0.623 -0.448 -0.360 -0.936 -0.588 -0.736 -0.359 + -0.487 -0.298 -0.552 -0.269 -0.461 -0.310 -0.426 -0.438 -0.477 -0.847 + -0.313 0.065 -0.600 -0.674 -0.223 -0.787 -0.478 -0.156 -0.129 -0.380 + -0.676 -0.495 -0.467 -0.893 -0.506 -0.706 -0.474 -0.258 -0.626 -0.511 + + 609 iasi_metop-a 6003 0.351287E-01 + 0.030 -0.242 -0.203 -0.156 0.165 -0.188 -0.239 -0.236 -0.009 -0.394 + -0.398 -0.173 -0.157 -0.179 -0.253 -0.417 -0.247 -0.452 -0.269 -0.388 + -0.283 -0.400 -0.329 -0.491 -0.492 -0.587 -0.827 -0.698 -0.355 -0.415 + -0.385 -0.263 -0.404 -0.348 -0.248 -0.376 -0.496 -0.554 -0.195 -0.225 + -0.124 -0.549 -0.486 -0.233 -0.314 -0.463 -0.386 -0.348 -0.334 -0.438 + -0.273 -0.337 -0.333 -0.612 -0.537 -0.235 -0.456 -0.414 -0.436 -0.455 + -0.257 -0.539 -0.485 -0.316 0.044 -0.462 -0.219 -0.364 -0.148 -1.126 + 0.001 -0.184 -0.337 -0.334 -0.239 -0.508 -0.118 -0.282 -0.014 -0.530 + -0.447 -0.218 -0.346 -0.456 -0.066 -0.241 0.049 -0.001 -0.223 -0.466 + + 610 iasi_metop-a 6008 0.135588E-01 + -0.233 -0.067 -0.421 -0.564 -0.060 -0.140 -0.232 -0.369 0.069 -0.264 + -0.242 -0.241 -0.099 -0.299 -0.320 -0.273 0.016 -0.222 -0.218 -0.024 + -0.040 -0.125 -0.063 -0.252 -0.138 -0.087 -0.354 -0.439 -0.050 -0.152 + -0.193 -0.067 -0.424 -0.158 0.295 -0.176 -0.610 -0.119 -0.102 -0.220 + -0.416 -0.031 -0.155 -0.200 -0.207 -0.675 -0.337 -0.453 -0.074 -0.016 + 0.010 -0.403 -0.271 -0.478 -0.538 -0.181 -0.859 -0.379 -0.391 -0.181 + -0.493 -0.168 -0.516 0.151 -0.108 -0.034 -0.201 -0.202 -0.400 -0.692 + 0.054 -0.014 -0.421 -0.195 -0.179 -0.582 -0.267 0.035 0.046 -0.259 + -0.464 -0.258 -0.268 -0.359 -0.334 -0.367 -0.364 -0.006 -0.383 -0.338 + + 611 iasi_metop-a 6023 0.131415E-01 + -0.102 -0.052 -0.272 -0.272 -0.002 -0.145 -0.242 -0.105 0.051 -0.284 + -0.330 -0.018 -0.062 -0.095 -0.142 -0.309 0.121 -0.070 -0.160 -0.043 + -0.129 0.012 -0.134 -0.142 -0.260 -0.163 -0.435 -0.372 -0.161 -0.262 + -0.074 0.223 -0.161 0.072 0.546 -0.084 -0.338 0.069 0.060 -0.121 + -0.231 0.120 -0.090 -0.027 -0.222 -0.587 -0.361 -0.254 -0.019 0.182 + 0.043 -0.327 -0.295 -0.407 -0.394 -0.151 -0.700 -0.252 -0.397 -0.004 + -0.316 -0.083 -0.429 0.137 -0.289 -0.059 -0.144 -0.124 -0.397 -0.687 + 0.206 0.139 -0.422 -0.125 0.033 -0.512 -0.379 0.099 0.131 -0.121 + -0.334 -0.182 -0.248 -0.461 -0.297 -0.252 -0.354 0.068 -0.269 -0.255 + + 612 iasi_metop-a 6026 0.189370E-01 + 0.160 0.076 -0.148 -0.130 0.224 -0.025 -0.125 -0.011 0.035 -0.017 + -0.185 0.049 -0.022 -0.071 -0.129 -0.284 0.124 -0.079 -0.201 -0.069 + 0.000 0.086 -0.040 -0.137 -0.211 -0.209 -0.491 -0.392 -0.108 -0.215 + 0.076 0.051 -0.262 0.168 0.362 -0.317 -0.059 -0.027 0.293 0.053 + -0.108 0.062 0.063 0.228 -0.086 -0.422 -0.174 0.043 0.219 0.127 + 0.345 -0.105 -0.305 -0.328 -0.306 0.226 -0.569 -0.159 -0.156 0.038 + -0.182 -0.057 -0.304 0.186 0.190 -0.068 0.095 0.011 -0.197 -0.537 + 0.212 0.107 -0.076 -0.199 -0.096 -0.332 0.248 0.181 0.382 -0.007 + -0.108 -0.150 -0.055 -0.088 -0.035 -0.084 -0.032 0.399 0.041 0.041 + + 613 iasi_metop-a 6039 0.296631E-01 + 0.526 0.389 0.304 0.289 0.560 0.271 0.267 0.311 0.529 0.209 + 0.237 0.339 0.278 0.260 0.239 0.078 0.483 0.373 0.209 0.369 + 0.364 0.282 0.350 0.207 0.141 0.149 0.010 -0.080 0.294 0.087 + 0.632 0.721 0.350 0.795 0.906 0.906 0.307 0.218 0.851 0.615 + 0.610 0.392 0.453 0.513 0.420 -0.103 0.173 0.543 0.760 0.408 + 0.762 0.213 0.140 -0.063 0.045 0.593 -0.064 0.353 0.127 0.579 + 0.334 0.296 -0.021 0.708 0.798 0.259 0.440 0.573 0.383 -0.278 + 0.667 0.460 0.548 0.352 0.498 0.063 0.582 0.507 0.624 0.496 + 0.378 0.247 0.531 0.367 0.369 0.338 0.593 0.840 0.470 0.251 + + 614 iasi_metop-a 6053 0.207415E-01 + 0.285 0.405 0.231 0.129 0.397 0.351 0.285 0.265 0.498 0.391 + 0.360 0.360 0.337 0.422 0.262 0.087 0.542 0.401 0.286 0.338 + 0.461 0.530 0.475 0.296 0.393 0.329 0.231 0.093 0.471 0.224 + 0.282 0.307 -0.084 0.406 0.676 0.346 -0.054 0.248 0.482 0.149 + 0.130 0.309 0.111 0.421 -0.122 -0.249 -0.085 0.227 0.350 0.404 + 0.583 -0.063 -0.094 -0.185 -0.240 0.288 -0.583 0.202 -0.031 0.162 + -0.016 0.101 -0.149 0.403 0.333 0.306 0.278 0.150 -0.154 -0.444 + 0.355 0.131 -0.051 0.022 0.229 -0.346 0.173 0.414 0.358 0.159 + 0.036 0.099 -0.022 0.069 -0.041 0.054 -0.010 0.374 0.042 0.028 + + 615 iasi_metop-a 6056 0.128652E-01 + 0.106 0.043 -0.098 -0.106 0.213 -0.015 -0.051 0.091 0.267 0.096 + -0.061 0.177 0.149 0.114 0.005 -0.003 0.359 0.106 -0.045 0.204 + 0.196 0.279 0.156 0.148 -0.003 0.133 -0.177 -0.056 0.159 -0.002 + -0.007 0.244 -0.226 -0.093 0.496 0.047 -0.351 -0.023 0.112 -0.143 + -0.182 0.106 0.013 0.098 -0.171 -0.671 -0.353 -0.178 0.086 0.117 + 0.011 -0.293 -0.178 -0.373 -0.447 -0.159 -0.751 -0.268 -0.381 0.083 + -0.323 -0.119 -0.336 0.102 -0.113 0.007 -0.086 -0.260 -0.442 -0.597 + 0.141 0.151 -0.372 -0.279 -0.184 -0.502 -0.342 -0.035 0.058 -0.196 + -0.441 -0.125 -0.332 -0.412 -0.254 -0.176 -0.338 0.133 -0.217 -0.198 + + 616 iasi_metop-a 6067 0.307714E-01 + -0.158 -0.101 -0.346 -0.238 0.040 -0.109 -0.343 -0.261 -0.140 -0.324 + -0.428 -0.164 -0.224 -0.221 -0.255 -0.418 -0.195 -0.296 -0.219 -0.305 + -0.171 -0.119 -0.185 -0.422 -0.353 -0.292 -0.532 -0.511 -0.241 -0.238 + -0.514 -0.628 -0.627 -0.339 -0.338 -0.595 -0.682 -0.549 -0.390 -0.346 + -0.430 -0.611 -0.638 -0.502 -0.784 -0.610 -0.562 -0.813 -0.592 -0.348 + -0.264 -0.688 -0.807 -0.676 -0.901 -0.458 -0.858 -0.524 -0.725 -0.411 + -0.466 -0.510 -0.693 -0.418 -0.256 -0.381 -0.293 -0.403 -0.632 -1.132 + -0.248 -0.546 -0.553 -0.425 -0.396 -0.678 -0.220 -0.293 -0.147 -0.633 + -0.594 -0.516 -0.505 -0.702 -0.283 -0.390 -0.164 -0.325 -0.388 -0.484 + + 617 iasi_metop-a 6071 0.181151E-01 + -0.336 -0.202 -0.391 -0.445 -0.091 -0.298 -0.407 -0.420 -0.059 -0.306 + -0.230 -0.225 -0.213 -0.398 -0.455 -0.438 -0.095 -0.323 -0.484 -0.079 + -0.124 -0.244 -0.246 -0.253 -0.233 -0.281 -0.523 -0.440 -0.210 -0.380 + -0.214 -0.154 -0.425 -0.119 0.168 -0.304 -0.262 -0.184 -0.014 -0.084 + -0.191 -0.002 -0.169 -0.102 -0.253 -0.542 -0.325 -0.040 -0.052 0.067 + 0.302 -0.359 -0.408 -0.377 -0.467 -0.039 -0.673 -0.212 -0.374 -0.056 + -0.270 -0.071 -0.517 0.090 0.032 0.101 -0.029 -0.169 -0.438 -0.621 + 0.011 -0.033 -0.212 -0.202 -0.064 -0.433 -0.089 0.077 0.109 -0.229 + -0.320 -0.142 -0.260 -0.263 -0.265 -0.220 -0.167 0.087 -0.247 -0.156 + + 618 iasi_metop-a 6082 0.225511E-01 + 0.114 0.279 -0.022 0.002 0.251 0.060 -0.129 0.024 0.129 0.057 + -0.108 0.038 -0.041 0.054 -0.126 -0.276 0.165 0.031 -0.054 0.089 + 0.167 0.154 0.054 0.036 -0.068 0.004 -0.318 -0.276 0.043 -0.030 + 0.012 0.268 -0.154 0.430 0.508 0.308 -0.219 0.137 0.352 0.051 + 0.022 0.265 0.061 0.293 -0.093 -0.296 -0.197 0.115 0.265 0.278 + 0.504 -0.096 -0.204 -0.303 -0.356 0.222 -0.741 -0.006 -0.160 0.076 + -0.059 0.144 -0.250 0.247 0.293 0.254 0.142 -0.043 -0.163 -0.644 + 0.312 0.117 0.028 -0.093 0.102 -0.239 0.167 0.374 0.283 0.079 + -0.070 -0.055 -0.059 0.002 -0.175 -0.014 -0.088 0.276 -0.112 0.047 + + 619 iasi_metop-a 6085 0.182243E-01 + 0.252 0.280 0.065 0.045 0.258 0.160 0.030 0.237 0.250 0.100 + -0.009 0.300 0.179 0.124 0.016 0.020 0.302 0.164 -0.024 0.214 + 0.273 0.300 0.212 0.213 0.112 0.158 -0.173 -0.026 0.185 0.021 + 0.118 0.346 -0.076 0.333 0.691 0.288 0.106 0.169 0.307 0.153 + 0.166 0.423 0.138 0.377 -0.055 -0.403 -0.151 0.215 0.277 0.352 + 0.382 -0.059 -0.150 -0.227 -0.355 0.232 -0.611 -0.021 -0.148 0.133 + -0.016 0.079 -0.186 0.439 0.247 0.180 0.211 0.091 -0.088 -0.498 + 0.149 0.215 -0.084 -0.057 0.195 -0.338 0.046 0.359 0.320 0.043 + -0.053 -0.033 -0.057 -0.099 -0.002 -0.045 -0.123 0.291 -0.048 0.119 + + 620 iasi_metop-a 6098 0.346037E-01 + 0.943 0.821 0.719 0.738 0.848 0.598 0.664 0.609 0.830 0.516 + 0.495 0.588 0.604 0.584 0.588 0.363 0.757 0.601 0.405 0.554 + 0.617 0.558 0.602 0.497 0.327 0.293 0.148 0.167 0.504 0.313 + 0.921 1.226 0.907 1.189 1.353 1.612 0.711 0.722 1.419 1.053 + 1.170 0.781 1.158 1.253 0.695 0.370 0.613 0.996 1.135 0.756 + 1.291 0.895 0.442 0.394 0.375 1.004 0.332 0.758 0.590 0.935 + 0.775 0.707 0.465 1.125 1.243 0.637 0.902 1.134 0.835 0.122 + 1.171 0.722 1.050 0.733 0.877 0.601 0.899 0.800 1.065 0.889 + 0.880 0.773 0.892 0.895 0.913 0.691 0.982 1.278 0.948 0.764 + + 621 iasi_metop-a 6112 0.374435E-01 + 1.189 1.010 0.996 0.960 1.112 0.871 1.017 0.909 1.223 0.941 + 1.169 1.168 0.983 0.881 0.998 0.759 1.168 0.953 0.809 1.031 + 1.181 1.086 1.082 0.813 1.059 0.730 0.800 0.711 1.089 0.829 + 0.770 1.054 0.933 1.070 1.329 1.228 0.836 0.629 1.401 1.121 + 1.146 0.757 1.041 1.089 0.904 0.419 0.624 0.760 1.155 0.675 + 1.236 0.777 0.528 0.326 0.457 0.995 0.434 0.774 0.736 0.920 + 0.845 0.686 0.615 1.128 1.199 0.537 0.874 1.004 0.873 -0.002 + 1.151 0.795 1.014 0.851 0.820 0.665 0.844 0.723 1.224 0.841 + 0.950 0.756 0.977 0.904 0.815 0.786 1.080 1.376 0.815 0.671 + + 622 iasi_metop-a 6126 0.379419E-01 + 0.795 0.851 0.972 0.736 1.090 0.655 0.914 0.804 1.095 0.918 + 1.261 0.808 0.864 0.746 0.969 0.645 1.045 0.927 0.665 0.850 + 0.977 0.907 1.023 0.796 0.950 0.710 0.809 0.545 0.879 0.736 + 0.483 0.858 0.604 0.899 1.048 0.683 0.647 0.404 1.226 0.659 + 0.990 0.591 0.702 0.938 0.613 0.224 0.559 0.521 0.886 0.413 + 1.061 0.605 0.105 0.014 0.110 0.787 0.182 0.556 0.322 0.689 + 0.644 0.451 0.427 0.862 0.951 0.220 0.677 0.719 0.403 -0.155 + 0.872 0.632 0.834 0.619 0.718 0.452 0.599 0.563 0.974 0.578 + 0.794 0.445 0.458 0.715 0.607 0.499 0.718 1.042 0.666 0.400 + + 623 iasi_metop-a 6135 0.179898E-01 + -0.284 -0.131 -0.515 -0.427 -0.075 -0.018 -0.209 0.042 0.055 -0.014 + -0.046 0.076 0.082 0.135 -0.087 -0.238 0.366 0.092 -0.007 0.274 + 0.257 0.545 0.304 0.084 0.131 0.189 0.215 0.075 0.353 0.230 + -0.508 -0.180 -0.712 -0.299 0.105 -0.483 -0.507 -0.307 -0.273 -0.455 + -0.539 -0.303 -0.306 -0.303 -0.500 -0.798 -0.510 -0.272 -0.212 -0.094 + 0.009 -0.601 -0.540 -0.589 -0.691 -0.333 -0.998 -0.582 -0.584 -0.260 + -0.439 -0.343 -0.566 -0.028 -0.246 -0.141 -0.334 -0.344 -0.594 -0.907 + -0.034 -0.194 -0.618 -0.482 -0.330 -0.732 -0.446 -0.164 -0.149 -0.698 + -0.571 -0.468 -0.508 -0.631 -0.289 -0.435 -0.500 -0.174 -0.391 -0.432 + + 624 iasi_metop-a 6140 0.361405E-01 + 0.780 0.602 0.527 0.599 0.591 0.376 0.386 0.294 0.616 0.191 + 0.145 0.390 0.254 0.176 0.225 0.043 0.354 0.206 0.005 0.104 + 0.274 0.176 0.237 0.115 -0.124 -0.188 -0.371 -0.231 0.073 -0.044 + 0.864 1.147 0.841 0.991 1.268 1.179 0.756 0.646 1.304 0.917 + 1.104 0.749 1.036 1.176 0.607 0.423 0.624 0.799 1.124 0.707 + 1.242 0.759 0.320 0.394 0.393 0.852 0.326 0.752 0.689 0.831 + 0.668 0.649 0.356 1.041 0.989 0.411 0.912 0.965 0.709 0.134 + 1.135 0.615 0.812 0.767 0.878 0.521 0.653 0.816 1.081 0.790 + 0.903 0.611 0.789 0.753 0.751 0.615 0.986 1.371 0.936 0.666 + + 625 iasi_metop-a 6149 0.187108E-01 + 0.109 0.133 -0.121 -0.062 0.472 0.178 0.074 0.379 0.463 0.380 + 0.408 0.301 0.351 0.351 0.339 0.291 0.526 0.513 0.242 0.425 + 0.633 0.727 0.585 0.425 0.678 0.454 0.471 0.396 0.661 0.577 + -0.392 -0.352 -0.744 -0.262 0.010 -0.409 -0.500 -0.321 -0.270 -0.516 + -0.453 -0.173 -0.408 -0.427 -0.537 -0.720 -0.629 -0.429 -0.223 -0.170 + -0.014 -0.656 -0.662 -0.695 -0.750 -0.430 -0.962 -0.462 -0.580 -0.464 + -0.452 -0.432 -0.645 -0.029 -0.294 -0.293 -0.369 -0.364 -0.688 -0.923 + -0.131 -0.146 -0.545 -0.414 -0.297 -0.809 -0.457 -0.183 -0.147 -0.613 + -0.619 -0.308 -0.436 -0.606 -0.336 -0.438 -0.472 -0.235 -0.502 -0.432 + + 626 iasi_metop-a 6154 0.415524E-01 + 0.566 0.458 0.400 0.578 0.503 0.257 0.233 0.206 0.457 0.033 + 0.135 0.272 0.192 0.038 0.139 -0.146 0.278 0.084 -0.014 -0.033 + 0.231 0.070 0.114 0.003 -0.134 -0.248 -0.519 -0.351 -0.036 -0.195 + 0.367 0.725 0.723 0.750 1.072 0.712 0.633 0.389 0.995 0.765 + 0.766 0.553 0.725 0.724 0.499 0.253 0.461 0.434 0.836 0.481 + 0.961 0.430 0.150 0.138 0.132 0.687 0.177 0.625 0.409 0.545 + 0.484 0.507 0.301 0.800 0.875 0.316 0.581 0.579 0.667 -0.115 + 0.927 0.449 0.582 0.600 0.665 0.527 0.609 0.487 0.904 0.643 + 0.681 0.530 0.641 0.368 0.631 0.599 0.661 1.033 0.601 0.422 + + 627 iasi_metop-a 6158 0.250332E-01 + 0.124 0.241 -0.015 -0.015 0.370 0.115 0.100 0.151 0.386 0.276 + 0.426 0.290 0.201 0.348 0.252 0.139 0.451 0.376 0.199 0.391 + 0.468 0.599 0.528 0.351 0.514 0.276 0.433 0.303 0.581 0.366 + -0.510 -0.387 -0.741 -0.239 -0.107 -0.505 -0.563 -0.552 -0.308 -0.372 + -0.496 -0.120 -0.490 -0.514 -0.471 -0.723 -0.738 -0.417 -0.324 -0.244 + -0.112 -0.601 -0.597 -0.680 -0.809 -0.521 -0.923 -0.449 -0.786 -0.421 + -0.390 -0.359 -0.596 -0.080 0.031 -0.057 -0.471 -0.411 -0.775 -1.014 + -0.172 -0.312 -0.546 -0.369 -0.300 -0.659 -0.244 -0.049 -0.027 -0.547 + -0.538 -0.525 -0.591 -0.577 -0.385 -0.402 -0.360 -0.284 -0.489 -0.527 + + 628 iasi_metop-a 6161 0.371295E-01 + -0.241 -0.316 -0.346 -0.432 -0.107 -0.331 -0.479 -0.478 -0.273 -0.479 + -0.477 -0.274 -0.360 -0.448 -0.444 -0.608 -0.298 -0.392 -0.452 -0.467 + -0.287 -0.415 -0.271 -0.465 -0.426 -0.470 -0.590 -0.510 -0.284 -0.361 + -0.640 -0.468 -0.772 -0.466 -0.331 -0.693 -0.553 -0.543 -0.218 -0.273 + -0.517 -0.543 -0.655 -0.600 -0.567 -0.720 -0.714 -0.388 -0.571 -0.486 + -0.097 -0.685 -0.671 -0.950 -0.919 -0.464 -0.751 -0.445 -0.585 -0.317 + -0.526 -0.599 -0.542 -0.282 -0.135 -0.393 -0.265 -0.448 -0.561 -1.157 + -0.244 -0.422 -0.558 -0.558 -0.374 -0.632 -0.199 -0.366 -0.113 -0.735 + -0.487 -0.383 -0.473 -0.674 -0.426 -0.247 -0.153 -0.276 -0.434 -0.566 + + 629 iasi_metop-a 6168 0.492453E-01 + 0.067 0.167 0.232 0.162 0.288 0.062 0.063 -0.076 0.082 -0.042 + 0.047 -0.015 0.013 -0.114 -0.121 -0.287 0.029 -0.139 -0.195 -0.189 + -0.062 -0.216 -0.092 -0.226 -0.168 -0.315 -0.482 -0.380 -0.114 -0.155 + 0.237 0.161 0.280 0.434 0.324 0.312 -0.007 0.120 0.482 0.309 + 0.333 0.281 0.091 0.415 -0.079 0.131 0.153 -0.197 0.133 0.262 + 0.353 0.278 -0.021 -0.101 -0.225 0.161 -0.196 0.312 0.099 0.039 + 0.155 0.186 -0.186 0.202 0.455 -0.015 0.211 0.168 0.088 -0.149 + 0.386 0.247 0.125 0.404 0.094 0.083 0.156 0.132 0.447 0.111 + 0.059 0.315 0.348 0.093 0.157 0.334 0.356 0.652 0.290 0.203 + + 630 iasi_metop-a 6174 0.407008E-01 + -0.090 -0.104 -0.323 -0.229 0.063 -0.197 -0.157 -0.105 0.067 -0.084 + 0.001 0.106 -0.010 -0.011 -0.009 0.019 0.122 0.120 0.040 0.207 + 0.070 0.185 0.148 0.243 0.170 0.084 0.172 0.329 0.388 0.203 + -0.769 -0.672 -0.739 -0.631 -0.348 -0.786 -0.605 -0.854 -0.440 -0.488 + -0.582 -0.674 -0.688 -0.814 -0.531 -0.923 -0.656 -0.569 -0.511 -0.520 + -0.175 -0.834 -0.688 -1.048 -0.883 -0.628 -0.705 -0.445 -0.832 -0.445 + -0.536 -0.753 -0.684 -0.470 -0.190 -0.581 -0.432 -0.551 -0.567 -1.261 + -0.256 -0.518 -0.543 -0.527 -0.517 -0.802 -0.236 -0.539 -0.216 -0.682 + -0.384 -0.689 -0.607 -0.807 -0.407 -0.507 -0.264 -0.342 -0.453 -0.731 + + 631 iasi_metop-a 6182 0.469623E-01 + 0.212 -0.035 0.093 -0.007 0.379 -0.121 0.088 -0.208 0.081 -0.229 + -0.030 -0.079 -0.043 -0.292 -0.133 -0.405 -0.002 -0.270 -0.278 -0.248 + -0.047 -0.284 -0.057 -0.341 -0.176 -0.421 -0.379 -0.435 -0.185 -0.320 + 0.052 0.165 0.325 0.149 0.184 0.070 0.214 -0.082 0.349 0.247 + 0.403 -0.070 0.140 0.337 0.152 -0.172 0.026 -0.091 0.207 0.002 + 0.394 -0.013 0.041 -0.382 -0.258 0.142 -0.191 0.168 0.039 0.149 + 0.046 -0.176 -0.011 0.238 0.484 -0.166 0.210 0.154 0.250 -0.488 + 0.376 0.159 0.275 0.001 0.198 0.140 0.259 -0.109 0.439 0.180 + 0.341 -0.035 0.235 -0.013 0.265 0.124 0.409 0.601 0.227 -0.096 + + 632 iasi_metop-a 6187 0.377325E-01 + -0.067 -0.215 -0.268 -0.321 0.130 -0.328 0.025 -0.195 0.136 -0.162 + 0.160 -0.048 0.102 -0.053 0.175 -0.109 0.191 0.085 0.025 0.057 + 0.245 0.156 0.371 0.062 0.189 0.067 0.335 0.138 0.364 0.159 + -0.707 -0.413 -0.642 -0.662 -0.142 -0.467 -0.598 -0.840 -0.254 -0.438 + -0.402 -0.695 -0.422 -0.716 -0.386 -1.060 -0.655 -0.411 -0.320 -0.580 + -0.099 -0.737 -0.567 -1.012 -0.687 -0.429 -0.582 -0.586 -0.703 -0.301 + -0.405 -0.851 -0.628 -0.269 0.061 -0.507 -0.292 -0.343 -0.359 -1.212 + -0.288 -0.337 -0.376 -0.454 -0.402 -0.710 0.019 -0.411 -0.127 -0.575 + -0.248 -0.605 -0.465 -0.605 -0.253 -0.578 -0.081 -0.221 -0.386 -0.665 + + 633 iasi_metop-a 6205 0.396234E-01 + -0.538 -0.370 -0.626 -0.732 -0.278 -0.562 -0.525 -0.708 -0.379 -0.486 + -0.323 -0.587 -0.501 -0.621 -0.465 -0.784 -0.366 -0.437 -0.599 -0.654 + -0.387 -0.437 -0.308 -0.670 -0.472 -0.605 -0.525 -0.762 -0.351 -0.399 + -1.018 -0.654 -1.047 -0.530 -0.427 -0.685 -0.800 -0.631 -0.460 -0.615 + -0.665 -0.617 -0.704 -0.948 -0.808 -0.873 -0.759 -0.477 -0.561 -0.443 + -0.322 -0.863 -0.897 -0.774 -1.052 -0.634 -0.881 -0.306 -0.820 -0.454 + -0.780 -0.734 -0.689 -0.338 -0.339 -0.404 -0.519 -0.532 -0.740 -1.088 + -0.382 -0.531 -0.806 -0.366 -0.817 -0.844 -0.297 -0.332 -0.277 -0.777 + -0.565 -0.580 -0.722 -0.861 -0.596 -0.426 -0.385 -0.390 -0.673 -0.584 + + 634 iasi_metop-a 6209 0.433897E-01 + -0.491 -0.416 -0.605 -0.581 -0.250 -0.518 -0.645 -0.616 -0.474 -0.599 + -0.468 -0.449 -0.625 -0.628 -0.686 -0.588 -0.561 -0.544 -0.756 -0.513 + -0.558 -0.536 -0.496 -0.489 -0.622 -0.689 -0.783 -0.543 -0.528 -0.473 + -0.758 -0.565 -0.732 -0.362 -0.401 -0.684 -0.624 -0.651 -0.423 -0.557 + -0.613 -0.532 -0.522 -0.671 -0.658 -0.826 -0.580 -0.552 -0.559 -0.318 + -0.266 -0.797 -0.726 -0.832 -0.886 -0.526 -0.746 -0.352 -0.814 -0.383 + -0.552 -0.592 -0.662 -0.307 -0.253 -0.354 -0.604 -0.421 -0.573 -0.961 + -0.320 -0.458 -0.666 -0.357 -0.631 -0.611 -0.207 -0.401 -0.250 -0.608 + -0.536 -0.354 -0.487 -0.689 -0.526 -0.372 -0.266 -0.327 -0.656 -0.505 + + 635 iasi_metop-a 6213 0.446989E-01 + -0.457 -0.395 -0.558 -0.541 -0.311 -0.508 -0.517 -0.554 -0.465 -0.501 + -0.408 -0.385 -0.503 -0.510 -0.585 -0.541 -0.410 -0.462 -0.594 -0.525 + -0.461 -0.468 -0.427 -0.408 -0.531 -0.493 -0.586 -0.427 -0.407 -0.448 + -0.937 -0.562 -0.771 -0.584 -0.499 -0.651 -0.632 -0.721 -0.490 -0.564 + -0.633 -0.582 -0.626 -0.652 -0.808 -0.769 -0.674 -0.585 -0.620 -0.479 + -0.365 -0.669 -0.866 -0.896 -0.887 -0.538 -0.789 -0.423 -0.742 -0.476 + -0.678 -0.677 -0.805 -0.401 -0.405 -0.246 -0.665 -0.530 -0.649 -1.060 + -0.496 -0.441 -0.715 -0.503 -0.639 -0.733 -0.229 -0.405 -0.282 -0.633 + -0.450 -0.346 -0.595 -0.728 -0.504 -0.414 -0.260 -0.295 -0.634 -0.625 + + 636 iasi_metop-a 6317 0.425822E-01 + -0.547 -0.595 -0.638 -0.658 -0.384 -0.697 -0.669 -0.699 -0.429 -0.601 + -0.448 -0.460 -0.591 -0.595 -0.582 -0.673 -0.478 -0.572 -0.595 -0.517 + -0.585 -0.468 -0.487 -0.536 -0.562 -0.589 -0.599 -0.467 -0.291 -0.442 + -0.880 -0.767 -0.949 -0.792 -0.462 -0.959 -0.764 -0.826 -0.564 -0.673 + -0.674 -0.754 -0.865 -0.915 -0.690 -1.074 -0.907 -0.735 -0.550 -0.649 + -0.503 -0.986 -0.899 -1.113 -0.967 -0.566 -0.784 -0.666 -0.867 -0.551 + -0.643 -0.907 -0.810 -0.724 -0.373 -0.555 -0.673 -0.608 -0.632 -1.314 + -0.420 -0.589 -0.679 -0.731 -0.747 -0.852 -0.287 -0.557 -0.296 -0.823 + -0.699 -0.736 -0.619 -0.855 -0.500 -0.748 -0.321 -0.570 -0.631 -0.865 + + 637 iasi_metop-a 6339 0.310400E-01 + -1.490 -1.528 -1.569 -1.604 -0.281 -0.866 -1.074 -1.167 -0.439 -0.763 + -0.602 -0.735 -0.659 -0.874 -0.710 -0.874 -0.531 -0.833 -0.786 -0.634 + -0.575 -0.727 -0.481 -0.665 -0.550 -0.755 -0.691 -0.738 -0.479 -0.623 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 638 iasi_metop-a 6342 0.411258E-01 + -0.884 -1.160 -0.990 -0.969 -1.119 -1.459 -0.889 -0.984 -1.153 -1.595 + -0.972 -1.192 -0.996 -1.411 -1.115 -1.366 -0.963 -1.506 -0.920 -1.335 + -1.096 -1.413 -1.546 -1.840 -1.204 -1.536 -1.974 -2.419 -2.062 -2.295 + -1.330 -1.129 -1.307 -1.389 -1.070 -1.265 -1.196 -1.588 -1.189 -1.107 + -1.195 -1.454 -1.167 -1.009 -1.205 -1.556 -1.072 -1.378 -1.029 -1.511 + -1.050 -1.172 -1.337 -1.573 -1.437 -1.305 -1.294 -1.424 -1.323 -1.251 + -1.265 -1.427 -1.265 -1.143 -0.952 -1.408 -0.987 -1.240 -1.062 -1.510 + -1.055 -1.091 -1.274 -1.319 -1.382 -1.436 -1.072 -1.430 -1.045 -1.187 + -1.127 -1.252 -1.249 -1.125 -0.903 -1.368 -0.896 -1.056 -0.892 -1.530 + + 639 iasi_metop-a 6366 0.413954E-01 + -0.954 -1.065 -0.877 -1.047 -1.170 -1.226 -0.972 -1.087 -1.036 -1.382 + -0.996 -1.252 -0.942 -1.147 -1.027 -1.267 -0.951 -1.233 -0.945 -1.136 + -1.006 -1.065 -0.927 -1.218 -0.978 -1.129 -0.805 -0.983 -0.922 -0.881 + -1.256 -1.230 -0.938 -1.293 -1.098 -1.287 -0.904 -1.466 -1.033 -1.261 + -1.252 -1.394 -1.206 -1.092 -1.070 -1.805 -1.231 -1.284 -1.088 -1.327 + -1.091 -1.003 -1.410 -1.597 -1.297 -1.374 -1.073 -1.581 -1.270 -1.379 + -1.190 -1.458 -1.287 -1.287 -0.784 -1.620 -1.123 -1.232 -1.059 -1.415 + -1.243 -0.861 -1.046 -1.425 -1.450 -1.345 -1.060 -1.638 -1.149 -1.168 + -1.128 -1.448 -0.992 -1.059 -0.998 -1.347 -0.832 -0.910 -0.851 -1.485 + + 640 iasi_metop-a 6381 0.477295E-01 + -1.124 -0.824 -1.060 -1.106 -1.095 -0.931 -0.943 -1.047 -1.159 -0.934 + -1.045 -1.071 -1.117 -0.949 -1.013 -1.211 -1.002 -0.890 -0.917 -1.080 + -1.110 -0.935 -0.864 -1.001 -0.752 -0.892 -0.768 -0.932 -0.697 -0.731 + -1.360 -1.366 -1.328 -1.099 -1.366 -1.072 -1.335 -1.273 -1.248 -1.195 + -1.627 -0.964 -1.346 -1.076 -1.539 -1.272 -1.481 -1.431 -1.442 -1.086 + -1.173 -1.317 -1.664 -1.279 -1.548 -1.186 -1.536 -1.138 -1.464 -1.298 + -1.375 -0.890 -1.371 -1.315 -1.071 -1.262 -1.406 -1.313 -1.371 -1.160 + -1.315 -1.038 -1.572 -0.867 -1.303 -1.442 -1.457 -1.230 -1.073 -1.260 + -1.472 -0.949 -1.189 -1.170 -1.255 -0.912 -0.932 -1.096 -1.330 -1.211 + + 641 iasi_metop-a 6391 0.454923E-01 + -0.920 -0.970 -0.845 -0.786 -1.001 -1.156 -1.169 -0.750 -0.953 -1.118 + -1.009 -0.880 -1.045 -1.061 -1.103 -0.856 -0.859 -1.001 -1.004 -0.918 + -1.007 -0.848 -0.911 -0.772 -0.898 -0.937 -0.798 -0.595 -0.806 -0.883 + -1.159 -1.041 -1.058 -1.121 -0.853 -1.164 -1.124 -1.188 -1.085 -1.138 + -0.995 -1.122 -1.119 -1.037 -0.987 -1.296 -1.301 -1.331 -1.235 -1.069 + -1.164 -1.029 -1.059 -1.478 -1.089 -1.076 -1.099 -1.230 -1.108 -1.298 + -1.035 -1.087 -1.163 -1.181 -0.946 -1.238 -1.042 -1.243 -1.042 -1.168 + -1.108 -0.948 -1.102 -1.064 -1.093 -1.123 -0.881 -1.200 -0.992 -1.308 + -0.884 -1.103 -1.052 -0.861 -0.539 -0.950 -0.900 -0.914 -0.885 -1.085 + + 642 iasi_metop-a 6489 -0.609950E-02 + 0.473 0.507 0.983 0.830 0.212 0.407 0.396 -0.057 0.245 0.145 + 0.127 -0.115 -0.003 0.079 -0.170 -0.293 -0.188 -0.174 -0.103 -0.136 + -0.387 -0.172 -0.048 -0.261 -0.327 -0.304 -0.168 -0.333 -0.215 -0.272 + 2.614 2.885 2.410 2.107 2.457 2.087 2.269 2.359 2.186 2.056 + 2.449 2.356 1.975 1.987 1.974 2.210 2.467 2.308 2.099 1.959 + 2.168 2.737 2.070 2.479 1.962 1.928 2.381 2.183 1.653 2.428 + 2.085 2.065 1.914 2.375 2.287 2.227 1.900 2.201 2.052 2.344 + 2.060 2.144 2.222 2.039 2.296 2.328 2.324 1.940 2.239 2.179 + 2.517 2.124 2.220 2.535 2.764 2.338 2.161 2.316 2.038 1.761 + + 643 iasi_metop-a 6962 0.583118E-01 + 1.176 0.869 0.886 1.265 1.481 0.898 1.495 1.489 1.394 1.277 + 1.357 1.802 1.807 1.641 1.867 2.166 1.939 1.868 2.291 2.272 + 1.951 2.014 2.244 2.051 2.484 2.239 2.953 2.663 2.668 2.418 + -0.173 0.106 -0.512 -0.236 0.048 -0.424 -0.105 -0.555 0.079 -0.332 + -0.062 -0.477 -0.309 0.101 -0.261 -0.059 -0.461 -1.010 -0.326 -0.492 + -0.435 -0.757 0.095 -0.451 -0.415 -0.530 -0.344 -0.277 -0.796 -0.021 + -0.225 -0.058 -0.341 -0.085 -0.410 -0.164 -0.023 0.156 -0.596 -0.551 + -0.282 0.324 -0.105 -0.159 -0.084 -0.246 0.053 -0.100 -0.077 -0.151 + -0.501 -0.484 -0.002 -0.170 0.185 -0.264 0.151 -0.222 -0.546 -0.284 + + 644 iasi_metop-a 6966 0.667236E-01 + -0.521 -0.549 -0.258 -0.155 -0.433 -0.058 -0.104 0.043 -0.441 -0.368 + -0.410 -0.259 -0.129 -0.357 -0.440 -0.238 -0.099 -0.179 -0.289 -0.345 + -0.402 -0.271 -0.186 -0.446 -0.300 -0.227 -0.453 -0.725 -0.318 -0.108 + -0.858 -0.537 -0.671 -0.418 -0.504 -0.699 -1.172 -1.181 -0.740 -0.653 + -1.203 -0.573 -0.769 -1.244 -0.601 -0.969 -0.760 -0.930 -0.650 -0.728 + -0.984 -0.824 -0.983 -0.876 -0.841 -0.269 -0.794 -0.998 -0.112 -0.923 + -1.163 -1.075 -0.959 -0.802 -0.997 -0.705 -0.868 -0.456 -0.424 -0.842 + -0.769 -0.505 -0.805 -0.897 -0.661 -0.838 -0.643 -0.634 -0.979 -0.230 + -0.949 -1.117 -0.521 -0.562 -0.656 -0.829 -0.737 -0.915 -0.648 -0.925 + + 645 iasi_metop-a 6970 0.638624E-01 + -0.476 -0.650 -0.489 -0.303 -0.271 -0.490 -0.493 -0.457 -0.472 -0.696 + -0.360 -0.582 -0.630 -0.628 -0.439 -0.668 -0.484 -0.675 -0.521 -0.665 + -0.381 -0.742 -0.691 -0.586 -0.290 -0.510 -0.450 -0.460 -0.414 -0.392 + -0.462 -0.992 -0.676 -0.899 -0.269 -0.705 -0.503 -0.848 -0.574 -0.717 + -0.909 -0.744 -0.456 -0.314 -0.545 -1.267 -0.353 -1.365 -0.347 -0.729 + -0.795 -0.467 -0.458 -1.277 -0.901 -0.660 -0.479 -1.179 -0.790 -0.531 + -0.683 -1.244 -0.585 -0.643 -0.815 -1.199 -0.729 -0.785 -0.586 -1.243 + -0.633 -0.578 -0.473 -1.304 -0.722 -0.796 -0.666 -1.116 -0.558 -0.750 + -0.423 -0.940 -0.657 -0.569 -0.124 -0.912 -0.423 -0.668 -0.682 -0.707 + + 646 iasi_metop-a 6975 0.648313E-01 + -0.420 -0.687 -0.467 -0.750 -0.467 -0.866 -0.701 -0.793 -0.317 -0.698 + -0.391 -0.689 -0.776 -0.725 -0.647 -0.701 -0.423 -0.728 -0.383 -0.653 + -0.587 -0.459 -0.410 -0.540 -0.408 -0.696 -0.322 -0.610 -0.336 -0.454 + -0.785 -1.121 -0.787 -0.669 -0.877 -0.502 -1.282 -0.963 -0.824 -0.784 + -0.927 -1.048 -0.602 -0.804 -0.941 -1.117 -1.086 -1.264 -0.648 -0.734 + -1.037 -0.876 -0.887 -1.122 -1.113 -0.820 -0.871 -0.779 -0.636 -0.783 + -1.087 -1.079 -0.937 -1.077 -0.845 -0.701 -0.625 -0.647 -0.741 -1.062 + -0.833 -0.765 -1.096 -0.985 -1.200 -1.005 -0.608 -0.931 -0.917 -0.668 + -0.665 -0.937 -0.979 -1.010 -0.414 -0.933 -0.880 -0.725 -0.728 -0.942 + + 647 iasi_metop-a 6977 0.627702E-01 + -0.694 -0.544 -0.691 -0.415 -0.979 -0.652 -0.722 -0.721 -0.719 -0.686 + -0.680 -0.666 -0.826 -0.643 -0.828 -0.945 -0.628 -0.473 -0.653 -0.689 + -0.730 -0.433 -0.593 -0.619 -0.606 -0.699 -0.648 -0.707 -0.711 -0.600 + -0.848 -0.577 -0.758 -0.485 -0.503 -0.476 -0.906 -0.231 -0.552 -0.634 + -0.935 -0.406 -0.815 -0.642 -1.031 -0.498 -0.597 -0.894 -0.824 -0.484 + -0.514 -0.557 -0.977 -0.686 -0.919 -0.857 -1.072 -0.524 -0.926 -0.876 + -0.931 -0.515 -0.799 -0.527 -0.635 -0.674 -0.609 -0.700 -0.778 -0.808 + -0.640 -0.745 -0.930 -0.534 -0.693 -0.696 -0.819 -0.306 -0.830 -0.644 + -0.783 -0.454 -0.808 -0.711 -0.621 -0.293 -0.528 -0.698 -0.890 -0.441 + + 648 iasi_metop-a 6982 0.559717E-01 + -0.779 -0.786 -0.995 -0.677 -0.962 -0.829 -0.939 -0.578 -0.960 -0.730 + -0.951 -0.557 -0.855 -0.604 -0.986 -0.790 -0.729 -0.630 -0.786 -0.682 + -0.784 -0.603 -0.726 -0.462 -0.722 -0.643 -0.750 -0.425 -0.558 -0.280 + -0.925 -1.097 -1.128 -0.953 -1.068 -1.105 -1.141 -1.006 -0.914 -0.769 + -1.311 -0.906 -1.164 -1.013 -1.116 -1.432 -1.197 -1.201 -0.965 -0.952 + -1.006 -1.129 -1.274 -1.116 -1.355 -1.129 -1.235 -1.106 -1.324 -1.091 + -1.217 -1.252 -1.190 -0.972 -1.022 -1.181 -0.999 -1.070 -1.121 -1.503 + -1.100 -0.975 -1.079 -1.123 -1.084 -1.072 -1.096 -1.148 -0.949 -1.129 + -1.291 -1.158 -1.302 -1.186 -1.037 -0.977 -0.920 -0.822 -0.908 -1.074 + + 649 iasi_metop-a 6985 0.522913E-01 + -1.201 -1.114 -0.981 -1.109 -1.071 -1.157 -1.263 -0.971 -1.156 -1.224 + -1.057 -0.959 -1.014 -1.039 -1.244 -1.239 -1.002 -1.033 -1.134 -0.976 + -1.062 -1.006 -1.002 -1.041 -1.071 -1.061 -0.993 -0.955 -0.950 -0.899 + -1.173 -1.256 -1.058 -1.084 -1.073 -1.316 -1.255 -1.027 -1.059 -1.023 + -1.322 -1.250 -1.445 -1.074 -1.276 -1.473 -1.261 -1.454 -1.067 -1.244 + -0.999 -1.110 -1.592 -1.329 -1.267 -1.415 -1.488 -1.296 -1.436 -1.243 + -1.220 -1.210 -1.265 -1.216 -1.192 -1.248 -1.148 -1.111 -1.291 -1.577 + -1.172 -1.204 -1.299 -1.155 -1.223 -1.469 -0.969 -1.210 -0.977 -1.363 + -1.155 -1.112 -1.181 -1.273 -1.130 -1.126 -1.001 -1.022 -1.149 -1.333 + + 650 iasi_metop-a 6987 0.466420E-01 + -1.255 -1.140 -1.259 -1.253 -1.152 -1.279 -1.145 -1.237 -0.970 -1.105 + -1.052 -1.073 -1.080 -1.072 -1.172 -1.312 -1.004 -1.052 -1.094 -1.194 + -1.032 -0.972 -0.996 -1.053 -0.994 -1.007 -1.044 -0.970 -0.835 -0.904 + -0.404 -0.263 0.085 0.143 0.013 -0.024 0.191 0.174 0.484 0.190 + 0.380 0.595 0.321 0.409 0.528 0.244 0.319 0.558 0.810 0.803 + 0.763 0.624 0.470 0.699 0.633 0.810 0.415 0.759 0.713 0.783 + 0.408 0.545 0.825 0.721 0.831 0.451 0.627 0.584 0.364 0.167 + 0.484 0.724 0.295 0.433 0.418 0.332 0.256 0.365 0.501 0.148 + 0.203 0.080 0.126 -0.072 -0.104 -0.202 0.111 0.038 -0.472 -0.294 + + 651 iasi_metop-a 6989 0.463968E-01 + -0.889 -0.758 -1.154 -0.978 -0.886 -1.076 -1.154 -0.956 -0.926 -0.944 + -0.939 -1.056 -1.032 -1.063 -1.318 -1.321 -1.121 -0.993 -1.384 -1.466 + -1.292 -1.195 -1.329 -1.319 -1.323 -1.189 -1.426 -1.300 -1.184 -1.232 + -1.453 -1.446 -1.591 -1.511 -1.055 -1.603 -1.548 -1.268 -1.222 -1.440 + -1.613 -1.369 -1.403 -1.420 -1.520 -1.755 -1.469 -1.464 -1.276 -1.343 + -1.215 -1.330 -1.822 -1.559 -1.730 -1.467 -1.648 -1.224 -1.376 -1.364 + -1.507 -1.489 -1.513 -1.474 -1.122 -1.266 -1.425 -1.270 -1.414 -1.938 + -1.282 -1.231 -1.559 -1.282 -1.454 -1.679 -1.324 -1.135 -1.256 -1.335 + -1.352 -1.495 -1.358 -1.533 -1.308 -1.405 -1.232 -1.131 -1.396 -1.454 + + 652 iasi_metop-a 6991 0.441015E-01 + -1.454 -1.345 -1.572 -1.397 -1.397 -1.560 -1.576 -1.530 -1.400 -1.418 + -1.415 -1.420 -1.469 -1.433 -1.563 -1.639 -1.373 -1.385 -1.564 -1.447 + -1.415 -1.418 -1.408 -1.538 -1.522 -1.478 -1.544 -1.399 -1.332 -1.391 + -1.619 -1.309 -1.648 -1.169 -1.146 -1.617 -1.613 -1.353 -1.106 -1.419 + -1.611 -1.497 -1.498 -1.508 -1.536 -1.720 -1.448 -1.544 -1.437 -1.289 + -1.068 -1.644 -1.672 -1.631 -1.640 -1.334 -1.661 -1.374 -1.573 -1.344 + -1.587 -1.635 -1.533 -1.306 -1.019 -1.310 -1.392 -1.226 -1.531 -1.872 + -1.466 -1.161 -1.500 -1.125 -1.520 -1.590 -1.260 -1.230 -1.140 -1.345 + -1.419 -1.384 -1.355 -1.575 -1.251 -1.083 -1.060 -1.218 -1.472 -1.453 + + 653 iasi_metop-a 6993 0.421945E-01 + -1.423 -1.480 -1.659 -1.496 -1.375 -1.512 -1.673 -1.563 -1.349 -1.487 + -1.456 -1.428 -1.560 -1.646 -1.658 -1.607 -1.400 -1.444 -1.602 -1.500 + -1.669 -1.411 -1.467 -1.438 -1.547 -1.567 -1.620 -1.494 -1.432 -1.363 + -1.574 -1.697 -1.637 -1.294 -1.330 -1.491 -1.569 -1.592 -1.334 -1.506 + -1.690 -1.434 -1.823 -1.476 -1.489 -1.831 -1.687 -1.581 -1.535 -1.438 + -1.118 -1.617 -1.793 -1.731 -1.755 -1.490 -1.635 -1.349 -1.652 -1.461 + -1.580 -1.573 -1.542 -1.322 -1.157 -1.498 -1.472 -1.335 -1.557 -2.003 + -1.364 -1.391 -1.461 -1.355 -1.626 -1.781 -1.318 -1.162 -1.278 -1.583 + -1.405 -1.559 -1.514 -1.583 -1.513 -1.513 -1.181 -1.265 -1.695 -1.622 + + 654 iasi_metop-a 6995 0.408199E-01 + -1.499 -1.387 -1.622 -1.529 -1.293 -1.647 -1.695 -1.554 -1.387 -1.496 + -1.422 -1.445 -1.540 -1.593 -1.627 -1.664 -1.455 -1.504 -1.647 -1.638 + -1.539 -1.491 -1.521 -1.550 -1.634 -1.669 -1.708 -1.502 -1.438 -1.358 + -1.536 -1.307 -1.672 -1.347 -1.178 -1.404 -1.506 -1.388 -1.263 -1.371 + -1.678 -1.356 -1.503 -1.486 -1.497 -1.798 -1.572 -1.516 -1.312 -1.331 + -1.081 -1.588 -1.756 -1.670 -1.699 -1.411 -1.646 -1.318 -1.608 -1.259 + -1.417 -1.524 -1.502 -1.330 -1.175 -1.216 -1.651 -1.139 -1.766 -2.102 + -1.356 -1.273 -1.446 -1.264 -1.717 -1.716 -1.370 -1.269 -1.269 -1.721 + -1.560 -1.522 -1.671 -1.622 -1.324 -1.613 -1.183 -1.226 -1.628 -1.394 + + 655 iasi_metop-a 6997 0.395553E-01 + -1.505 -1.402 -1.629 -1.457 -1.411 -1.562 -1.625 -1.460 -1.398 -1.520 + -1.379 -1.558 -1.453 -1.476 -1.635 -1.633 -1.429 -1.349 -1.602 -1.664 + -1.578 -1.582 -1.473 -1.509 -1.536 -1.544 -1.662 -1.601 -1.452 -1.606 + -1.638 -1.434 -1.694 -1.332 -1.138 -1.609 -1.537 -1.415 -1.209 -1.340 + -1.442 -1.253 -1.528 -1.612 -1.460 -1.853 -1.613 -1.499 -1.317 -1.191 + -1.085 -1.431 -1.637 -1.823 -1.745 -1.181 -1.624 -1.198 -1.393 -1.351 + -1.404 -1.601 -1.369 -1.271 -1.170 -1.383 -1.445 -1.069 -1.636 -1.947 + -1.391 -1.403 -1.562 -1.036 -1.536 -1.561 -1.106 -1.133 -1.209 -1.341 + -1.500 -1.454 -1.239 -1.844 -1.196 -1.553 -1.253 -1.223 -1.622 -1.430 + + 656 iasi_metop-a 6999 0.385347E-01 + -1.432 -1.446 -1.558 -1.382 -1.421 -1.531 -1.596 -1.487 -1.270 -1.486 + -1.354 -1.461 -1.502 -1.489 -1.545 -1.653 -1.454 -1.402 -1.559 -1.552 + -1.507 -1.447 -1.410 -1.575 -1.593 -1.642 -1.654 -1.556 -1.357 -1.356 + -1.442 -1.398 -1.688 -1.200 -1.098 -1.355 -1.675 -1.517 -1.172 -1.419 + -1.285 -1.284 -1.553 -1.648 -1.474 -1.621 -1.553 -1.436 -1.079 -1.209 + -1.051 -1.457 -1.628 -1.501 -1.841 -1.469 -1.392 -1.252 -1.559 -1.268 + -1.587 -1.340 -1.386 -1.267 -0.943 -1.241 -1.293 -1.204 -1.768 -1.916 + -1.395 -1.209 -1.511 -1.246 -1.451 -1.729 -1.140 -1.242 -1.277 -1.311 + -1.330 -1.404 -1.307 -1.588 -1.216 -1.475 -1.338 -1.126 -1.764 -1.313 + + 657 iasi_metop-a 7000 0.381877E-01 + -1.475 -1.345 -1.506 -1.447 -1.281 -1.540 -1.660 -1.488 -1.414 -1.439 + -1.368 -1.340 -1.448 -1.479 -1.549 -1.609 -1.371 -1.443 -1.619 -1.452 + -1.405 -1.390 -1.285 -1.505 -1.468 -1.635 -1.663 -1.523 -1.359 -1.428 + -1.436 -1.341 -1.618 -1.146 -0.976 -1.304 -1.516 -1.536 -1.052 -1.441 + -1.211 -1.073 -1.549 -1.592 -1.434 -1.641 -1.356 -1.400 -1.168 -1.183 + -0.876 -1.366 -1.365 -1.431 -1.555 -1.347 -1.487 -1.283 -1.540 -1.278 + -1.449 -1.610 -1.061 -1.154 -0.931 -1.069 -1.324 -1.069 -1.570 -1.845 + -1.051 -1.314 -1.464 -1.055 -1.276 -1.525 -0.989 -1.101 -0.953 -1.249 + -1.510 -1.468 -1.214 -1.548 -1.327 -1.564 -1.150 -1.114 -1.535 -1.293 + + 658 iasi_metop-a 7004 0.367538E-01 + -1.363 -1.291 -1.482 -1.406 -1.256 -1.475 -1.532 -1.439 -1.286 -1.366 + -1.267 -1.356 -1.457 -1.475 -1.507 -1.549 -1.235 -1.332 -1.546 -1.585 + -1.321 -1.226 -1.296 -1.422 -1.293 -1.569 -1.614 -1.401 -1.283 -1.392 + -1.228 -1.410 -1.447 -1.230 -1.131 -1.242 -1.406 -1.272 -0.986 -1.112 + -1.308 -1.219 -1.314 -1.691 -1.234 -1.563 -1.332 -1.162 -0.898 -1.079 + -0.815 -1.428 -1.425 -1.646 -1.644 -1.302 -1.442 -1.224 -1.605 -1.219 + -1.396 -1.522 -1.321 -1.151 -0.765 -1.069 -1.176 -0.931 -1.433 -1.825 + -1.001 -1.150 -1.230 -0.987 -1.241 -1.702 -0.877 -0.964 -0.988 -1.458 + -1.206 -1.377 -1.348 -1.479 -1.226 -1.552 -1.015 -0.970 -1.416 -1.395 + + 659 iasi_metop-a 7008 0.356561E-01 + -1.250 -1.282 -1.395 -1.360 -0.982 -1.361 -1.443 -1.347 -1.063 -1.289 + -1.237 -1.331 -1.357 -1.333 -1.446 -1.444 -1.156 -1.278 -1.455 -1.466 + -1.252 -1.098 -1.190 -1.380 -1.436 -1.459 -1.527 -1.480 -1.318 -1.441 + -1.352 -1.202 -1.328 -1.103 -0.766 -1.095 -1.186 -1.180 -0.819 -0.921 + -1.279 -1.231 -1.543 -1.227 -1.295 -1.555 -1.307 -1.223 -1.048 -0.947 + -0.729 -1.278 -1.303 -1.385 -1.509 -1.302 -1.452 -1.139 -1.189 -1.036 + -1.300 -1.363 -1.101 -1.005 -0.881 -0.855 -1.039 -0.859 -1.455 -1.739 + -1.126 -0.892 -1.297 -1.016 -1.220 -1.500 -1.089 -0.827 -1.027 -1.276 + -1.296 -1.111 -1.313 -1.566 -1.381 -1.246 -0.937 -1.203 -1.110 -1.279 + + 660 iasi_metop-a 7013 0.343006E-01 + -1.283 -1.224 -1.363 -1.264 -1.001 -1.306 -1.425 -1.327 -1.072 -1.335 + -1.256 -1.199 -1.292 -1.411 -1.304 -1.588 -1.203 -1.190 -1.169 -1.416 + -1.212 -1.210 -1.214 -1.224 -1.316 -1.371 -1.396 -1.298 -1.299 -1.176 + -1.340 -1.370 -1.443 -1.097 -0.907 -1.048 -1.299 -1.256 -1.056 -1.267 + -1.173 -1.011 -1.225 -1.483 -1.231 -1.550 -1.155 -1.151 -1.058 -1.081 + -0.856 -1.367 -1.311 -1.580 -1.545 -1.121 -1.658 -1.236 -1.439 -1.213 + -1.326 -1.427 -1.217 -1.018 -0.792 -1.100 -1.244 -0.952 -1.475 -1.811 + -1.116 -1.267 -1.431 -1.140 -1.210 -1.456 -0.931 -0.913 -0.829 -1.422 + -1.378 -1.248 -1.443 -1.469 -1.338 -1.548 -1.007 -1.193 -1.573 -1.483 + + 661 iasi_metop-a 7016 0.336643E-01 + -1.203 -1.225 -1.339 -1.296 -1.079 -1.407 -1.425 -1.283 -1.182 -1.289 + -1.241 -1.230 -1.328 -1.401 -1.292 -1.519 -1.138 -1.321 -1.453 -1.355 + -1.153 -1.176 -1.277 -1.335 -1.286 -1.425 -1.481 -1.361 -1.302 -1.381 + -1.015 -0.966 -1.264 -0.792 -0.822 -0.956 -1.231 -1.215 -1.031 -1.028 + -1.055 -0.924 -1.097 -1.382 -1.183 -1.543 -0.892 -1.138 -1.112 -0.741 + -0.687 -1.134 -1.184 -1.494 -1.422 -1.016 -1.251 -1.110 -1.097 -0.861 + -1.409 -1.343 -1.259 -0.939 -0.707 -0.845 -1.222 -0.782 -1.520 -1.807 + -1.012 -1.113 -1.226 -0.868 -1.301 -1.493 -0.719 -0.813 -0.848 -1.144 + -1.150 -1.240 -1.102 -1.482 -1.021 -1.324 -0.873 -1.104 -1.365 -1.374 + + 662 iasi_metop-a 7021 0.325727E-01 + -1.114 -1.175 -1.316 -1.175 -0.801 -1.210 -1.329 -1.270 -1.108 -1.206 + -1.214 -1.127 -1.223 -1.300 -1.288 -1.493 -1.127 -1.134 -1.337 -1.344 + -1.103 -1.083 -1.165 -1.249 -1.274 -1.355 -1.413 -1.397 -1.384 -1.231 + -1.067 -0.942 -1.317 -0.958 -0.727 -1.178 -1.121 -1.062 -1.034 -1.251 + -1.145 -1.047 -1.166 -1.383 -1.249 -1.657 -1.106 -1.112 -0.904 -0.999 + -0.704 -1.090 -1.432 -1.413 -1.542 -1.167 -1.518 -1.147 -1.335 -1.144 + -1.309 -1.285 -1.175 -1.031 -0.927 -0.873 -1.169 -0.964 -1.448 -1.727 + -1.118 -1.030 -1.315 -0.895 -1.345 -1.540 -0.850 -0.935 -1.048 -1.412 + -1.403 -1.156 -1.316 -1.365 -1.140 -1.234 -1.100 -1.052 -1.349 -1.500 + + 663 iasi_metop-a 7024 0.291998E-01 + -1.080 -1.090 -1.291 -1.232 -0.665 -1.086 -1.441 -1.207 -1.041 -1.225 + -1.053 -1.121 -1.334 -1.284 -1.306 -1.386 -1.345 -1.208 -1.265 -1.309 + -1.140 -1.122 -1.262 -1.303 -1.349 -1.336 -1.384 -1.352 -1.279 -1.238 + -0.893 -1.048 -1.668 -0.760 0.101 -0.892 -0.666 -0.834 -0.508 -1.097 + -0.264 -0.575 -0.972 -1.077 -1.069 -1.187 -0.750 -0.694 0.202 -0.073 + 0.415 -0.841 -0.626 -1.029 -1.413 -0.332 -0.921 -0.529 -0.763 -0.321 + -0.400 -0.551 -0.600 -0.561 0.395 -0.309 -0.374 -0.012 -0.144 -1.018 + 0.200 0.131 -0.919 0.265 -0.916 -0.482 -0.689 -0.379 -0.365 0.009 + -0.228 -0.524 -0.717 -0.920 -0.125 -0.303 0.197 0.478 -0.894 -0.699 + + 664 iasi_metop-a 7027 0.286079E-01 + -0.703 -0.369 -0.696 -0.760 -0.505 -0.772 -1.022 -0.512 -0.634 -0.918 + -0.568 -0.311 -0.448 -0.444 -0.832 -1.027 -0.623 -0.603 -0.614 -0.931 + -0.255 -0.298 -0.619 -0.674 -0.586 -0.891 -1.205 -0.623 -0.550 -0.880 + -1.024 -1.176 -1.285 -0.859 -0.003 -1.068 -0.851 -1.110 -0.755 -1.445 + -0.676 -0.760 -0.732 -0.732 -1.442 -1.055 -0.759 -0.774 0.013 -0.503 + 0.445 -1.010 -0.468 -0.619 -1.319 -0.127 -0.973 -0.685 -1.129 -0.418 + -0.115 -1.096 -0.793 -0.331 0.455 -0.573 -0.514 -0.128 -0.219 -1.713 + 0.217 -0.019 -1.151 0.237 -0.625 -0.353 -0.395 -0.266 -0.197 -0.202 + -0.149 -0.601 -0.953 -0.685 -0.084 -0.748 -0.238 0.049 -0.922 -0.763 + + 665 iasi_metop-a 7029 0.282961E-01 + -0.721 -0.451 -0.975 -0.753 -0.432 -0.708 -1.134 -0.792 -0.622 -0.796 + -0.655 -0.060 -0.619 -0.486 -0.700 -1.096 -0.722 -0.418 -0.703 -0.809 + -0.242 -0.450 -0.502 -0.782 -0.690 -0.530 -0.951 -0.806 -0.607 -0.807 + -0.935 -1.180 -1.789 -0.743 -0.024 -0.634 -0.874 -0.628 -0.623 -1.155 + -0.874 -0.994 -0.283 -0.809 -1.047 -0.857 -0.441 -0.547 0.147 -0.408 + 0.623 -0.702 -0.666 -1.077 -0.980 -0.243 -0.934 -0.563 -0.688 -0.109 + -0.401 -0.667 -0.490 -0.432 0.380 -0.336 -0.488 -0.010 -0.180 -1.246 + 0.617 -0.015 -1.145 0.274 -0.726 -0.831 -0.009 -0.214 0.121 -0.218 + -0.322 -0.559 -0.707 -0.980 -0.164 -0.767 0.028 0.376 -1.009 -0.837 + + 666 iasi_metop-a 7032 0.278914E-01 + -0.633 -0.369 -0.667 -0.612 -0.083 -0.578 -0.892 -0.492 -0.303 -0.648 + -0.509 -0.324 -0.438 -0.373 -0.673 -0.745 -0.485 -0.423 -0.761 -0.691 + 0.009 -0.161 -0.468 -0.572 -0.438 -0.559 -0.856 -0.673 -0.427 -0.746 + -0.747 -0.792 -1.129 -0.542 0.282 -0.604 -0.388 -0.805 -0.424 -0.728 + -0.429 -0.450 -0.684 -0.850 -1.157 -1.020 -0.577 -0.189 -0.186 0.100 + 0.633 -0.596 -0.454 -0.621 -0.587 -0.287 -0.761 -0.305 -1.134 -0.398 + -0.130 -0.805 -0.711 -0.500 0.499 -0.239 -0.131 0.126 0.019 -1.327 + 0.684 0.024 -0.813 0.585 -1.003 -0.566 -0.204 -0.197 -0.092 -0.252 + -0.117 -0.348 -0.411 -0.830 -0.006 -0.703 -0.250 0.361 -0.990 -0.523 + + 667 iasi_metop-a 7038 0.269697E-01 + -0.543 -0.403 -0.700 -0.478 -0.130 -0.453 -0.812 -0.469 -0.243 -0.638 + -0.398 -0.148 -0.286 -0.324 -0.640 -0.637 -0.441 -0.374 -0.697 -0.657 + -0.193 -0.221 -0.499 -0.599 -0.526 -0.656 -0.768 -0.605 -0.409 -0.491 + -0.414 -0.688 -1.516 -0.539 0.072 -0.734 -0.638 -0.691 -0.314 -1.169 + -0.556 -0.562 -0.630 -0.085 -0.904 -1.466 -0.615 -0.328 0.106 -0.041 + 0.582 -0.211 -0.450 -0.957 -1.027 -0.001 -0.681 -0.149 -0.662 -0.125 + -0.137 -0.294 -0.305 -0.151 0.709 -0.129 -0.247 0.296 0.232 -1.114 + 0.477 0.183 -0.802 0.672 -0.544 -0.276 -0.270 -0.027 -0.019 0.422 + -0.088 0.131 -0.265 -0.794 -0.501 -0.658 -0.095 0.293 -0.551 -0.603 + + 668 iasi_metop-a 7043 0.263351E-01 + -0.409 -0.535 -0.508 -0.659 -0.090 -0.676 -0.949 -0.747 -0.121 -0.693 + -0.386 -0.017 -0.264 -0.422 -0.706 -0.853 -0.368 -0.242 -0.726 -0.641 + -0.036 -0.238 -0.156 -0.531 -0.740 -0.532 -0.730 -0.490 -0.362 -0.653 + -0.434 -0.733 -1.460 -0.650 0.231 -0.951 -0.314 -1.013 -0.287 -1.182 + -0.458 -0.537 -0.486 -1.001 -0.702 -0.824 -0.545 -0.151 0.206 0.024 + 0.550 -0.279 -0.238 -0.851 -0.898 -0.077 -0.798 -0.310 -0.821 -0.243 + -0.179 -0.760 -0.521 -0.505 0.422 -0.326 -0.179 0.253 0.206 -1.173 + 0.469 0.366 -0.453 0.255 -0.522 -0.264 -0.275 0.052 0.196 -0.004 + -0.162 -0.261 -0.484 -0.984 -0.123 -0.680 -0.059 0.122 -0.758 -0.494 + + 669 iasi_metop-a 7046 0.258738E-01 + -0.683 -0.333 -0.532 -0.466 0.004 -0.525 -1.055 -0.624 -0.084 -0.779 + -0.384 -0.162 -0.241 -0.269 -0.527 -0.750 -0.372 -0.299 -0.684 -0.651 + -0.064 -0.305 -0.288 -0.639 -0.534 -0.575 -0.694 -0.645 -0.384 -0.677 + -0.456 -0.795 -1.597 -0.540 0.440 -0.553 -0.626 -1.015 -0.771 -0.933 + -0.278 -0.355 -0.442 -0.601 -0.491 -0.886 -1.077 -0.149 0.121 -0.164 + 0.485 -0.623 -0.348 -0.686 -0.692 -0.249 -0.880 -0.335 -0.852 -0.033 + 0.321 -0.662 -0.281 -0.438 0.236 -0.262 -0.085 0.129 0.051 -1.305 + 0.610 0.056 -0.439 0.437 -0.716 -0.143 -0.160 -0.247 0.132 0.712 + -0.333 -0.271 -0.837 -0.618 0.168 -0.091 0.317 0.219 -0.866 -0.277 + + 670 iasi_metop-a 7049 0.259560E-01 + -0.437 -0.284 -0.557 -0.598 -0.128 -0.696 -0.889 -0.683 -0.206 -0.673 + -0.574 -0.239 -0.504 -0.088 -0.658 -0.961 -0.349 -0.164 -0.650 -0.785 + -0.013 -0.328 -0.556 -0.585 -0.639 -0.620 -0.851 -0.510 -0.239 -0.517 + -0.603 -0.840 -1.549 -0.672 0.142 -0.868 -0.299 -0.846 -0.426 -1.427 + -0.366 -0.361 -0.311 -0.941 -1.069 -0.991 -0.406 -0.124 -0.014 0.248 + 0.531 -0.559 0.103 -0.951 -1.105 -0.237 -1.076 -0.560 -0.693 -0.108 + -0.111 -0.857 -0.298 -0.138 0.753 -0.281 0.110 0.081 -0.158 -1.103 + -0.021 0.276 -0.734 0.381 -0.871 -0.432 -0.360 -0.051 0.364 -0.198 + -0.542 -0.290 -0.360 -0.666 -0.166 -0.271 -0.261 0.319 -0.681 -0.390 + + 671 iasi_metop-a 7069 0.233387E-01 + -0.686 -0.439 -0.509 -0.550 -0.045 -0.329 -0.940 -0.408 -0.268 -0.622 + -0.473 -0.135 -0.239 -0.274 -0.717 -0.635 -0.395 -0.189 -0.293 -0.606 + 0.063 -0.138 -0.189 -0.536 -0.567 -0.601 -0.655 -0.503 -0.295 -0.690 + -0.123 -0.592 -0.857 -0.570 0.117 -0.686 -0.014 -0.540 -0.027 -1.268 + -0.382 -0.068 -0.050 -1.071 -1.004 -0.621 -0.824 -0.039 0.109 0.187 + 0.610 -0.175 0.112 -0.257 -0.463 -0.167 -0.504 -0.423 -0.861 0.025 + -0.005 -0.498 0.358 0.228 0.557 -0.019 0.053 0.177 0.011 -1.290 + 0.771 0.212 -0.721 0.945 -0.247 -0.226 0.049 -0.260 -0.284 0.253 + -0.132 -0.318 -0.502 -1.007 0.033 -0.194 -0.107 0.840 -0.392 -0.351 + + 672 iasi_metop-a 7072 0.231324E-01 + -0.594 -0.250 -0.452 -0.702 -0.103 -0.378 -0.825 -0.344 -0.054 -0.431 + -0.348 -0.041 -0.152 -0.066 -0.383 -0.513 -0.243 -0.029 -0.456 -0.611 + 0.069 0.084 -0.112 -0.503 -0.171 -0.433 -0.611 -0.316 -0.169 -0.626 + -0.334 -0.703 -1.502 -1.037 0.448 -0.531 -0.444 -0.399 -0.610 -0.674 + -0.749 -0.121 -0.702 -0.735 -0.870 -1.144 -0.887 -0.113 0.037 0.141 + 0.423 -0.241 -0.224 -0.793 -0.649 -0.092 -1.042 -0.494 -0.924 0.293 + 0.056 -0.099 0.025 0.197 0.676 -0.719 0.107 0.213 0.033 -0.978 + 0.511 0.247 -0.280 0.903 -0.568 -0.274 -0.010 -0.235 0.287 -0.031 + -0.261 0.153 -0.223 -0.533 0.002 -0.300 0.076 0.742 -0.296 -0.334 + + 673 iasi_metop-a 7076 0.227261E-01 + -0.458 -0.386 -0.510 -0.719 0.086 -0.556 -0.908 -0.481 0.044 -0.718 + -0.634 0.115 -0.142 -0.265 -0.476 -0.601 -0.239 -0.225 -0.639 -0.774 + 0.068 -0.067 -0.229 -0.507 -0.274 -0.434 -0.681 -0.415 -0.413 -0.519 + -0.127 -0.794 -1.704 -0.520 0.506 -0.892 -0.268 -0.846 -0.518 -1.183 + -0.619 -0.635 -0.294 -0.395 -1.202 -1.393 -0.377 -0.172 0.041 -0.103 + 0.195 -0.415 -0.204 -0.628 -0.413 -0.425 -0.992 -0.201 -0.374 0.087 + -0.238 -0.572 0.022 -0.378 0.475 -0.469 -0.093 0.073 0.102 -1.385 + 0.672 0.893 -0.836 0.449 -0.720 -0.582 -0.144 -0.190 0.580 0.230 + -0.300 -0.075 -0.244 -0.449 0.128 -0.180 -0.121 0.432 -0.952 -0.413 + + 674 iasi_metop-a 7081 0.223183E-01 + -0.730 -0.146 -0.467 -0.635 -0.067 -0.280 -0.894 -0.433 0.062 -0.755 + -0.465 0.035 -0.100 -0.016 -0.610 -0.800 -0.171 -0.230 -0.355 -0.425 + -0.012 0.151 -0.353 -0.546 -0.416 -0.394 -0.652 -0.352 -0.259 -0.511 + 0.143 -0.692 -1.145 -0.575 0.391 -0.807 -0.254 -0.383 -0.369 -1.055 + -0.417 0.003 -0.352 -0.770 -0.726 -0.786 -0.673 -0.010 0.230 0.204 + 0.713 -0.273 -0.002 -0.327 -0.581 0.179 -0.706 -0.381 -0.447 0.350 + 0.061 0.104 0.105 -0.183 0.739 -0.279 0.102 0.278 0.244 -0.736 + 1.145 0.437 -0.419 0.670 -0.279 -0.194 -0.039 -0.221 0.276 0.188 + -0.201 0.016 0.084 -0.367 -0.102 -0.213 0.044 0.279 -0.072 -0.201 + + 675 iasi_metop-a 7084 0.222401E-01 + -0.577 -0.057 -0.516 -0.533 0.134 -0.374 -0.675 -0.339 0.043 -0.418 + -0.417 -0.129 -0.214 -0.153 -0.446 -0.688 -0.187 -0.108 -0.347 -0.555 + 0.149 -0.073 -0.379 -0.497 -0.125 -0.350 -0.659 -0.364 -0.081 -0.540 + 0.048 -0.804 -1.382 -0.640 0.163 -0.751 -0.350 -0.342 -0.229 -0.857 + -0.629 -0.158 -0.477 -1.421 -0.981 -0.938 -0.172 -0.018 0.183 0.466 + 0.603 -0.524 0.039 -0.320 -0.730 -0.087 -0.495 -1.044 -0.751 -0.153 + -0.221 -0.355 -0.054 -0.339 0.370 -0.427 0.212 0.176 0.137 -1.302 + 0.855 0.292 -0.583 0.543 -0.450 -0.664 0.059 -0.320 -0.157 -0.198 + -0.263 -0.532 -0.423 -0.436 0.142 -0.283 -0.344 0.747 -0.839 -0.472 + + 676 iasi_metop-a 7089 0.216671E-01 + -0.546 -0.186 -0.436 -0.570 0.052 -0.406 -0.841 -0.381 0.089 -0.488 + -0.242 0.207 0.065 -0.309 -0.395 -0.715 0.025 -0.154 -0.369 -0.478 + 0.023 0.073 -0.109 -0.552 -0.264 -0.250 -0.420 -0.230 -0.138 -0.307 + 0.021 -0.574 -1.086 -0.397 0.454 -0.483 -0.358 -0.659 -0.327 -0.698 + -0.573 0.098 0.053 -1.425 -1.002 -0.314 -0.507 -0.303 0.002 0.592 + 0.631 -0.273 0.207 0.031 -0.141 0.405 -0.459 -0.346 -0.327 0.464 + 0.344 -0.287 0.319 0.242 0.653 0.191 0.516 0.482 0.060 -1.134 + 1.052 0.147 -0.712 1.038 -0.608 -0.061 -0.467 0.069 0.437 0.093 + 0.143 0.490 0.015 -0.648 0.111 -0.206 0.104 0.521 -0.072 0.000 + + 677 iasi_metop-a 7099 0.212847E-01 + -0.516 -0.050 -0.255 -0.362 0.470 -0.195 -0.703 -0.282 0.077 -0.507 + -0.093 0.177 0.067 -0.117 -0.276 -0.544 0.030 -0.096 -0.407 -0.249 + 0.142 0.002 -0.263 -0.296 -0.124 -0.157 -0.398 -0.347 0.067 -0.519 + -0.103 -0.533 -1.221 -0.763 0.380 -1.054 -0.074 -0.392 0.144 -0.742 + -0.889 -0.041 -0.034 -0.070 -0.823 -1.317 -0.525 -0.100 0.170 0.384 + 0.656 -0.108 -0.189 -0.529 -0.430 -0.314 -0.883 -0.171 -0.664 0.178 + 0.010 -0.324 0.259 0.107 0.631 0.282 0.253 0.652 0.001 -0.908 + 0.810 0.352 -0.129 1.096 -0.343 -0.208 -0.087 0.255 0.427 0.494 + -0.138 -0.210 -0.072 -0.882 0.404 -0.118 -0.179 0.709 -0.371 -0.352 + + 678 iasi_metop-a 7209 0.156132E-01 + -0.290 0.171 -0.424 -0.382 0.308 -0.061 -0.469 0.285 0.506 -0.513 + -0.261 0.158 0.003 -0.010 -0.530 -0.362 0.075 0.046 -0.159 -0.144 + 0.352 0.149 -0.072 -0.316 -0.019 -0.186 -0.300 -0.011 0.113 -0.257 + -0.031 -0.299 -1.132 -0.902 0.880 -0.308 -0.189 0.135 -0.027 -0.006 + -0.482 0.061 0.094 -0.308 -0.889 -0.005 0.033 0.404 0.296 0.729 + 0.387 0.272 0.529 0.041 0.298 0.100 -0.177 -0.176 -0.527 0.576 + 0.186 0.115 0.404 0.076 0.653 0.142 1.335 0.913 0.638 -0.395 + 0.720 0.831 0.173 1.307 -0.232 0.301 -0.021 0.268 0.487 1.043 + -0.501 0.461 0.902 -0.524 0.059 -0.068 0.752 0.704 0.149 -0.508 + + 679 iasi_metop-a 7222 0.159940E-01 + -0.054 0.011 -0.198 -0.359 0.538 0.167 -0.419 -0.076 0.588 -0.279 + -0.027 0.109 0.292 0.391 0.230 -0.056 0.374 0.382 0.160 -0.090 + 0.412 0.286 0.240 -0.259 0.178 0.022 0.056 0.392 0.637 -0.148 + -0.279 -0.219 -1.208 -0.611 0.807 -0.460 -0.078 -0.566 0.121 0.121 + -0.802 0.343 -0.041 -0.272 -0.863 -0.623 -0.410 0.136 0.230 0.819 + 0.489 0.327 0.245 -0.011 -0.396 0.252 -0.459 -0.365 -0.238 0.920 + 1.001 -0.709 0.006 0.213 1.326 -0.135 1.395 0.230 0.920 -0.801 + 1.030 0.837 -0.131 0.738 -0.247 -0.326 -0.119 0.207 -0.006 1.216 + -0.435 0.304 0.811 -0.827 0.041 -0.257 0.268 0.936 -0.387 -0.534 + + 680 iasi_metop-a 7231 0.154528E-01 + 0.023 -0.084 -0.564 -0.346 0.073 0.054 -0.529 0.125 0.057 -0.120 + -0.292 0.585 0.253 0.406 -0.136 -0.019 0.171 0.381 0.066 0.026 + 0.481 0.131 0.432 -0.274 0.205 0.105 0.041 0.088 0.810 0.045 + -0.971 -0.181 -1.609 -0.756 0.881 -0.923 -0.016 -0.160 0.127 0.128 + -1.059 0.113 -0.097 -1.117 -0.930 -0.176 -0.119 0.410 0.409 0.422 + 0.493 0.157 0.018 -0.144 -0.055 -0.455 -0.310 -0.119 -0.906 0.558 + 0.405 -0.360 -0.325 -0.446 0.804 0.007 0.316 0.087 0.440 0.333 + 1.103 0.474 -0.094 0.390 -0.487 0.415 0.083 0.394 0.143 0.811 + -0.460 -0.173 0.672 -0.747 0.621 -0.013 0.747 1.351 -0.396 -0.390 + + 681 iasi_metop-a 7235 0.152161E-01 + -0.159 -0.068 -0.678 -0.254 0.310 0.121 -0.465 0.244 0.604 -0.614 + -0.192 0.207 0.137 -0.043 -0.158 -0.012 -0.041 0.242 -0.041 0.127 + 0.679 0.548 0.085 0.005 0.065 0.084 -0.132 0.283 0.616 -0.237 + -0.629 -0.170 -0.949 -0.674 1.021 -0.639 -0.652 -0.042 0.186 -0.730 + -1.245 0.264 -0.368 -0.495 -0.818 -0.313 -0.488 0.091 0.010 0.484 + 0.297 0.011 -0.017 -0.388 -0.150 0.300 -0.662 -0.223 -0.899 0.617 + 0.504 0.177 0.114 0.195 0.399 -0.400 0.901 0.515 0.782 -0.241 + 1.559 1.040 -0.139 1.140 -0.281 -0.079 0.583 0.271 0.378 0.979 + -0.413 0.187 1.008 -0.922 0.286 -0.090 0.290 0.882 -0.124 -0.114 + + 682 iasi_metop-a 7247 0.129610E-01 + -0.439 -0.136 -0.189 -0.567 0.282 -0.082 -0.647 -0.012 0.189 -0.467 + 0.016 -0.166 0.150 0.124 0.278 0.081 0.519 -0.052 0.055 -0.115 + 0.453 0.319 0.196 -0.287 0.316 0.117 -0.253 0.422 0.463 -0.159 + -0.329 -0.229 -1.231 -0.872 0.756 -0.650 -0.282 -0.094 0.151 -0.111 + -0.536 0.396 0.157 -0.552 -1.172 -0.204 0.308 0.563 0.244 0.598 + 0.661 0.488 0.314 -0.222 0.360 -0.266 -0.512 -0.118 -0.777 0.811 + 0.458 0.062 0.133 -0.087 1.091 0.158 1.198 0.739 0.719 -0.873 + 1.411 0.364 0.081 0.782 -0.207 0.108 0.161 0.616 -0.731 0.131 + -0.369 -0.386 0.409 -0.994 0.355 -0.239 0.617 0.845 -0.113 -0.010 + + 683 iasi_metop-a 7267 0.114345E-01 + -0.255 0.065 -0.211 -0.438 0.079 -0.162 -0.800 0.058 0.473 -0.323 + -0.598 -0.017 0.036 0.105 0.174 0.172 0.044 0.424 -0.033 -0.065 + 0.239 0.286 0.242 -0.389 0.130 0.070 -0.230 0.122 0.398 -0.414 + -0.487 -0.085 -0.961 -0.815 0.924 -0.552 -0.018 -0.148 0.502 -0.332 + -0.699 0.585 -0.222 -0.326 -1.028 0.541 0.479 0.579 0.308 0.521 + 0.649 0.458 0.727 -0.178 0.016 -0.070 -0.896 -0.211 -0.970 1.002 + 0.426 -0.236 -0.568 -0.299 0.684 0.117 1.078 0.939 0.111 -0.090 + 1.388 0.874 -0.212 0.340 -0.323 -0.290 -0.126 0.282 -0.455 0.118 + -0.177 0.171 1.055 -0.600 0.427 -0.323 0.077 0.452 -0.283 0.043 + + 684 iasi_metop-a 7269 0.111497E-01 + -0.097 -0.222 -0.530 -0.467 0.028 0.157 -0.455 -0.243 0.267 -0.660 + -0.002 -0.333 0.084 0.529 0.012 0.201 0.103 0.119 -0.182 -0.010 + 0.305 0.293 -0.020 -0.086 0.435 0.187 -0.306 0.302 0.427 -0.233 + -0.889 -0.107 -0.594 -0.735 0.722 -0.863 -0.391 0.052 0.650 -0.691 + -1.074 0.128 -0.308 -0.592 -0.616 0.145 -0.554 0.527 0.666 0.673 + 0.529 0.141 0.532 0.257 -0.720 -0.842 -0.478 -0.258 -0.860 0.658 + 0.461 -0.052 -0.530 -0.335 1.303 0.080 1.172 0.510 0.437 -0.284 + 1.027 0.349 0.268 0.245 -0.594 0.250 -0.643 0.428 -0.109 0.252 + -0.783 0.106 0.636 -1.318 0.227 -0.179 0.200 1.053 -0.136 -0.276 + + 685 iasi_metop-a 7284 0.113000E-01 + -0.068 0.089 -0.480 -0.288 -0.014 -0.283 -0.694 -0.228 0.260 -0.616 + -0.379 -0.081 0.186 0.451 0.111 0.293 0.169 0.270 -0.148 0.199 + 0.502 0.206 0.032 -0.145 0.084 0.305 -0.256 0.272 0.289 -0.248 + -0.303 -0.210 -0.792 -0.381 0.654 -0.739 0.155 -0.324 0.361 -0.575 + -0.448 0.582 0.184 -0.658 -0.831 0.026 0.648 0.384 0.276 0.506 + 1.072 0.403 0.313 -0.186 0.701 -0.128 -0.406 -0.249 -0.235 0.829 + 0.415 -0.216 -0.134 -0.328 0.945 0.388 1.043 0.746 0.553 -0.648 + 1.426 -0.080 -0.137 0.591 -0.608 0.196 -0.429 0.570 -0.050 0.581 + -0.774 -0.138 0.830 -0.548 0.444 -0.126 0.225 0.530 -0.471 -0.425 + + 686 iasi_metop-a 7389 0.648089E-02 + -0.417 0.096 -0.559 -0.420 0.408 -0.035 -0.357 0.037 0.211 -0.611 + -0.372 -0.047 0.004 0.419 0.276 0.483 0.145 0.288 -0.091 0.216 + 0.348 0.365 0.100 -0.060 0.126 0.239 -0.150 0.208 0.467 -0.654 + 0.107 -0.465 -0.689 0.089 0.713 -0.734 -0.267 -0.069 0.873 -0.712 + -0.770 0.064 0.131 -0.714 -0.780 0.376 0.090 0.229 0.601 1.014 + 0.910 1.086 0.350 0.134 -0.698 -0.027 -0.893 -0.010 -0.016 0.959 + 0.532 -0.074 0.305 -0.377 0.631 0.781 0.733 0.302 -0.119 -0.679 + 1.432 0.512 -0.224 -0.494 0.212 -0.209 -0.104 0.828 -0.340 0.212 + -0.400 0.589 0.702 -0.534 0.711 0.019 0.294 1.031 -0.374 0.150 + + 687 iasi_metop-a 7419 0.531394E-02 + -0.553 0.033 -0.538 -0.412 -0.202 0.067 -0.473 0.060 0.135 -0.383 + -0.466 -0.377 0.287 0.754 0.124 0.111 -0.012 0.114 0.308 0.085 + 0.255 0.071 -0.010 -0.304 -0.043 0.033 -0.316 0.197 -0.009 0.023 + 0.078 -0.474 -0.824 0.088 0.644 -0.673 -0.305 -0.025 -0.453 -0.502 + -0.045 -0.103 0.082 -0.311 -0.078 0.469 0.786 0.237 0.481 0.792 + 0.813 0.679 0.282 0.431 -0.288 0.027 -0.887 0.125 -0.852 1.080 + 0.746 0.021 0.304 0.233 0.998 0.212 0.554 0.906 0.091 -0.578 + 1.571 0.553 0.262 0.650 -0.303 0.445 -1.015 0.475 -0.440 0.595 + 0.299 -0.068 0.659 -0.063 0.770 -0.667 0.393 1.085 -0.179 -0.305 + + 688 iasi_metop-a 7423 0.504304E-02 + -0.324 0.038 -0.526 -0.681 0.109 0.017 -0.703 0.188 0.025 -0.756 + -0.172 -0.556 0.099 0.142 -0.227 0.273 0.144 -0.261 0.368 0.219 + 0.460 0.160 0.082 0.030 0.100 -0.373 -0.253 0.045 -0.022 0.130 + -0.085 -0.422 -0.608 0.027 0.768 -0.438 0.297 0.284 -0.281 -0.688 + -0.227 0.106 0.323 -1.613 -0.336 1.097 0.796 0.538 0.796 0.498 + 1.283 1.224 0.375 0.023 -0.478 0.429 -0.435 0.230 -0.496 0.814 + 0.609 0.348 1.302 -0.365 0.603 0.698 1.290 0.418 -0.279 -0.843 + 1.590 0.686 0.340 0.107 -0.286 0.233 -0.161 0.402 0.968 0.529 + 0.414 0.137 0.014 -0.528 0.389 0.526 0.856 1.036 0.320 -0.516 + + 689 iasi_metop-a 7424 0.501855E-02 + -0.425 -0.214 -0.612 -0.769 -0.070 0.050 -0.681 -0.156 -0.088 -0.541 + -0.337 -0.220 0.101 0.115 0.112 -0.434 -0.026 -0.046 -0.315 0.301 + 0.445 0.180 -0.112 -0.293 -0.090 -0.222 -0.013 0.136 0.092 0.141 + -0.230 -0.353 -0.631 0.227 0.792 -1.057 -0.097 0.253 -0.073 -0.843 + -0.420 -0.276 0.289 -0.695 -0.571 0.312 0.949 0.543 0.852 0.969 + 0.827 1.530 0.534 0.465 -0.477 0.183 -0.833 0.319 -0.019 0.716 + 0.644 0.276 0.587 -0.678 0.587 0.850 1.369 0.617 -0.074 -0.579 + 2.098 0.443 0.504 0.595 0.201 0.029 -0.032 0.701 0.516 0.862 + 0.012 0.136 0.089 -0.354 0.956 -0.218 0.042 0.501 -0.009 -0.361 + + 690 iasi_metop-a 7426 0.502596E-02 + -0.262 -0.129 -0.281 -0.593 -0.098 0.178 -0.731 0.082 0.070 -0.579 + -0.116 -0.461 -0.051 0.409 -0.138 -0.148 0.044 0.118 0.170 0.215 + 0.358 0.366 -0.295 0.146 -0.087 -0.416 -0.425 0.067 0.324 0.069 + 0.070 -0.331 -0.503 0.612 0.909 -0.317 0.623 0.751 0.258 -0.367 + -0.249 0.065 0.225 -0.834 -0.669 -0.008 0.674 1.138 0.800 1.074 + 1.211 1.362 0.170 0.019 0.022 0.342 -0.719 0.338 -0.548 1.295 + 0.860 -0.743 0.568 -0.279 0.676 1.020 0.347 0.159 -0.295 -0.497 + 2.043 0.519 0.523 0.373 -0.467 -0.670 -0.298 1.103 0.013 1.155 + -0.234 0.240 0.675 -0.494 0.322 -0.111 0.067 1.052 -0.423 0.434 + + 691 iasi_metop-a 7428 0.496363E-02 + -0.641 -0.200 -0.450 -0.563 0.044 0.099 -0.721 0.105 0.329 -0.450 + -0.226 -0.390 0.026 0.211 -0.154 -0.206 0.021 0.191 0.087 0.127 + 0.663 0.591 0.076 -0.107 -0.016 -0.216 -0.216 0.059 0.149 -0.051 + 0.121 -0.451 -0.526 0.052 0.961 -0.553 0.047 -0.182 0.011 -0.351 + -0.483 0.054 0.281 -1.461 -0.142 0.088 0.659 0.504 0.561 1.056 + 1.018 0.817 0.332 0.204 0.055 0.421 -1.043 0.523 -0.689 0.912 + 1.075 -0.222 0.463 -0.092 1.127 0.558 0.933 -0.361 -0.140 -0.161 + 2.133 1.104 -0.321 1.038 -0.735 0.229 -0.416 0.210 0.394 1.041 + 0.479 0.407 0.285 -0.086 1.029 0.192 0.388 0.967 -0.460 0.140 + + 692 iasi_metop-a 7431 0.526551E-02 + -0.248 0.014 -0.345 -0.552 0.336 0.270 -0.966 0.218 0.422 -0.250 + -0.235 -0.299 0.423 0.481 0.221 -0.188 -0.036 0.139 0.287 -0.044 + 0.536 0.545 -0.263 0.056 0.245 -0.317 -0.064 0.245 -0.027 0.120 + 0.461 -0.181 -0.410 0.385 0.966 -0.425 0.776 0.567 0.007 -0.147 + -0.568 0.467 -0.368 -1.143 -0.381 0.614 0.980 0.574 0.485 1.325 + 1.024 1.430 0.610 -0.060 0.425 -0.328 -0.959 0.118 -0.729 1.107 + 1.081 -0.552 0.328 0.308 0.916 0.199 1.265 0.288 0.054 -0.482 + 2.117 0.429 0.458 0.566 -0.386 -0.326 0.079 0.384 0.466 0.904 + 0.216 0.751 -0.003 -0.085 0.446 0.113 0.372 0.849 -0.626 -0.211 + + 693 iasi_metop-a 7436 0.491302E-02 + -0.178 0.002 -0.290 -0.534 -0.466 0.200 -0.600 -0.099 0.136 -0.324 + -0.460 -0.055 0.359 0.503 -0.221 0.029 -0.077 0.172 0.025 0.332 + 0.333 0.104 0.053 -0.113 0.095 -0.310 -0.331 -0.060 -0.054 0.210 + -0.248 -0.324 -0.402 -0.134 0.546 -0.827 0.136 -0.028 0.319 -0.383 + -0.406 -0.166 0.051 -0.864 -0.180 0.748 0.785 1.072 0.527 0.554 + 1.247 1.232 0.809 0.620 -0.395 0.351 -0.242 0.197 0.042 0.864 + 0.632 0.176 0.206 -0.236 0.951 0.402 0.830 0.586 -0.609 -0.894 + 0.372 0.535 0.045 0.386 -0.080 -0.190 -0.290 0.563 0.193 1.165 + 0.346 0.145 0.214 -0.480 0.679 -0.365 0.155 0.885 -0.517 -0.290 + + 694 iasi_metop-a 7444 0.472236E-02 + -0.230 0.005 -0.538 -0.743 0.051 0.015 -0.564 -0.156 -0.304 -0.456 + 0.020 -0.560 -0.428 0.210 -0.077 -0.226 -0.156 -0.148 0.100 0.148 + 0.420 0.018 -0.542 -0.250 -0.015 0.304 -0.219 -0.019 -0.100 0.081 + -0.099 0.183 -0.429 0.100 0.764 -0.715 0.239 0.109 0.110 -0.524 + -0.215 0.122 -0.276 -1.232 -0.026 0.607 0.646 0.097 0.304 0.553 + 0.334 1.090 -0.013 0.215 -0.637 0.243 -0.915 0.553 -0.807 1.092 + 1.148 0.025 -0.043 -0.057 0.557 0.875 -0.020 -0.106 -0.360 0.378 + 1.202 0.204 0.269 0.429 -0.158 0.189 -0.243 0.391 0.191 0.480 + 0.239 0.382 0.370 -0.139 0.371 0.463 -0.232 0.848 -0.414 -0.021 + + 695 iasi_metop-a 7475 0.412980E-02 + -0.285 0.143 -0.443 -0.415 0.146 0.045 -0.517 0.079 -0.229 -0.028 + -0.427 -0.269 -0.013 0.404 0.096 0.015 -0.352 0.272 0.325 -0.005 + 0.652 0.175 -0.307 -0.345 0.059 -0.365 -0.037 -0.124 -0.139 0.331 + 0.008 -0.568 -0.344 0.386 0.771 -0.391 0.354 0.389 0.276 -0.902 + -0.231 0.199 -0.052 -0.890 -0.078 0.654 1.060 0.639 0.322 0.720 + 0.548 0.879 1.014 0.683 0.302 0.107 -0.677 0.604 -0.161 1.130 + 0.641 -0.151 0.694 0.002 0.640 0.821 1.050 0.591 0.006 -1.174 + 1.694 0.732 0.300 0.295 0.289 -0.053 -0.346 0.753 0.104 1.394 + 0.248 0.019 0.439 0.083 0.978 -0.037 0.647 1.014 -0.606 -0.258 + + 696 iasi_metop-a 7549 0.558520E-02 + -0.077 -0.105 -0.538 -0.705 0.003 0.058 -0.733 0.013 -0.134 -0.439 + -0.337 -0.345 0.285 0.162 -0.294 -0.233 -0.181 0.278 0.368 0.117 + 0.862 0.060 -0.172 -0.410 -0.168 -0.130 0.129 0.220 0.270 -0.256 + 0.180 -0.064 -0.368 -0.038 0.812 -0.579 0.345 0.077 0.312 0.377 + -0.109 0.007 -0.055 -0.990 -0.187 0.364 0.904 0.347 0.615 0.932 + -0.061 1.521 0.046 0.202 0.083 -0.096 -1.050 -0.058 0.194 1.014 + 1.284 -0.132 1.020 0.136 1.422 0.797 -0.060 -0.003 -0.015 -0.577 + 1.217 0.395 -0.480 0.553 -0.650 -0.001 0.565 0.111 -0.226 0.817 + 0.084 0.163 -0.285 -0.098 0.745 0.210 -0.306 0.990 -0.543 0.204 + + 697 iasi_metop-a 7584 0.457723E-02 + -0.312 0.041 -0.344 -0.663 0.033 0.095 -0.658 0.237 -0.353 -0.390 + -0.503 -0.674 0.133 0.442 0.020 -0.343 0.033 -0.058 0.130 0.149 + 0.609 0.264 -0.184 -0.386 0.456 -0.098 -0.094 -0.247 0.121 0.168 + 0.300 -0.041 -0.113 0.195 1.337 -0.196 0.142 -0.089 0.055 -0.375 + -0.140 0.136 -0.286 -1.114 -0.742 0.371 1.085 0.381 0.511 0.755 + -0.164 0.511 0.932 0.308 -0.710 0.123 -0.575 0.225 -0.404 1.134 + 0.935 0.048 0.145 -0.097 0.980 0.610 0.158 0.464 -0.304 0.144 + 1.070 -0.106 -0.665 0.153 0.124 -0.308 0.237 0.407 -0.034 0.348 + 0.519 0.489 -0.088 -0.686 1.332 0.152 0.396 0.871 -0.664 0.008 + + 698 iasi_metop-a 7665 0.602464E-02 + -0.315 -0.120 -0.385 -0.453 -0.253 0.392 -0.828 0.249 -0.330 -0.341 + -0.241 -0.256 -0.015 0.039 -0.170 -0.318 -0.126 0.021 -0.009 0.274 + 0.144 0.351 -0.364 -0.320 -0.177 -0.436 -0.168 -0.209 0.190 0.029 + -0.208 -0.123 0.117 0.101 0.969 0.004 0.493 0.439 0.205 -0.801 + 0.135 0.061 -0.644 -1.240 0.045 -0.134 0.367 -0.143 0.605 0.860 + 0.571 0.480 0.989 0.194 -0.381 -0.052 -0.296 0.278 -0.448 1.188 + 0.914 -0.141 0.700 0.209 1.667 0.241 0.450 -0.083 0.078 -0.282 + 1.570 0.755 -0.391 0.355 -0.145 0.168 0.656 0.704 0.153 0.664 + 0.322 0.277 0.531 -0.085 0.711 0.176 -0.006 1.055 0.069 -0.320 + + 699 iasi_metop-a 7666 0.423068E-02 + -0.425 0.393 -0.700 -0.784 -0.130 0.098 -0.680 -0.109 -0.416 -0.061 + -0.271 -0.068 0.196 0.085 0.196 -0.012 -0.051 -0.026 0.078 -0.181 + 0.350 0.376 -0.270 -0.308 0.056 -0.181 -0.129 -0.057 0.319 0.034 + -0.545 -0.560 0.445 0.348 -0.081 -0.029 0.695 0.165 0.041 -0.051 + -0.191 0.000 0.461 -0.571 -0.266 -0.024 1.101 0.639 0.632 1.643 + 0.357 0.349 0.651 0.365 -0.272 -0.543 -0.371 0.737 -0.004 0.810 + 1.529 -0.333 0.130 0.377 1.824 0.471 0.303 -0.470 -0.580 -0.041 + 1.926 0.732 -0.409 1.162 -0.517 -0.133 0.416 0.173 0.385 0.839 + 0.520 0.562 0.776 -0.486 0.733 0.147 0.668 0.775 -0.345 -0.231 + + 700 iasi_metop-a 7831 0.188985E-02 + -0.011 0.122 -0.688 -0.430 -0.290 0.044 -0.797 0.051 -0.287 -0.084 + 0.026 -0.185 0.388 -0.243 -0.217 -0.258 -0.177 -0.142 -0.090 0.432 + 0.359 0.427 -0.327 -0.134 -0.081 -0.158 -0.213 -0.029 0.485 -0.464 + -0.390 -0.147 0.009 -0.218 1.087 -0.722 1.414 -0.177 -0.112 0.111 + 1.295 0.017 -0.450 -0.894 0.342 -0.301 1.358 0.400 0.532 0.799 + -0.103 0.309 1.832 0.085 0.668 0.087 -0.027 0.731 -0.034 0.750 + 0.470 -1.045 1.233 0.670 1.757 1.350 -0.388 0.302 0.563 0.147 + 0.569 0.058 0.356 -0.518 0.108 0.528 1.060 -0.199 0.926 0.555 + 0.204 0.687 0.775 -0.005 1.010 0.512 0.600 1.017 -0.262 0.630 + + 701 iasi_metop-a 7836 0.248706E-02 + -0.533 -0.074 -1.124 -0.564 0.034 -0.060 -0.761 -0.274 -0.495 -0.216 + -0.266 -0.714 0.147 0.136 -0.397 0.001 -0.309 0.008 -0.150 0.098 + 0.134 0.565 -0.041 -0.138 0.205 -0.096 -0.147 -0.191 0.206 -0.674 + -0.630 -0.452 -0.589 -0.012 0.070 0.101 0.227 0.344 -0.043 -0.904 + 0.718 0.230 0.021 -1.234 0.443 0.045 0.979 0.622 -0.237 0.653 + 0.237 0.192 0.589 0.099 0.704 -0.656 -0.148 0.901 0.101 0.804 + -0.094 -0.812 -0.427 -0.699 0.438 0.408 -0.059 -0.008 -0.106 -0.685 + 0.842 -0.143 0.040 -0.758 -0.902 -0.570 -0.034 0.315 1.429 0.507 + -0.981 1.178 -0.469 -0.842 1.043 -0.337 -0.097 0.800 -0.023 -0.853 + + 702 iasi_metop-a 7853 0.128245E-01 + 0.418 0.523 0.561 0.702 0.567 1.061 -0.198 0.930 0.367 0.989 + 0.298 -0.131 0.462 0.678 0.103 0.233 0.387 0.601 0.245 0.401 + 0.512 1.185 0.234 0.501 0.257 -0.052 0.062 -0.102 -0.031 0.225 + 0.235 1.010 0.627 0.820 1.504 0.834 0.974 1.365 1.354 0.867 + 1.208 1.799 1.358 0.114 0.887 1.268 1.481 2.003 1.238 1.712 + 1.754 1.280 1.562 1.164 0.968 0.249 0.569 1.024 0.654 1.939 + 1.202 0.561 0.598 0.907 2.043 1.303 0.720 1.411 0.834 1.044 + 1.791 1.874 1.128 2.512 1.812 0.642 0.866 1.512 1.170 2.025 + 0.782 0.543 1.107 0.461 1.995 1.635 0.839 1.806 1.397 1.568 + + 703 iasi_metop-a 7865 0.103580E-02 + 0.114 0.599 -0.459 -0.005 0.361 0.564 -0.058 -0.024 -0.101 0.353 + 0.359 1.041 0.662 0.563 0.640 0.727 0.393 0.852 0.061 0.775 + 1.475 1.855 -0.197 0.644 0.569 0.788 0.540 1.056 1.208 0.880 + -0.678 -0.514 -0.574 -0.368 1.377 -0.122 0.409 -0.131 -0.684 -0.208 + 0.704 -0.160 -0.410 -0.481 0.604 -0.214 0.963 0.393 0.706 0.829 + -0.204 -0.164 0.594 0.625 0.738 -0.303 1.215 0.553 0.074 1.348 + 1.142 -0.959 0.960 0.202 0.999 0.895 0.313 0.550 -0.900 0.536 + 0.750 0.754 0.547 0.454 0.037 -0.891 0.454 0.600 0.913 0.352 + 0.467 0.841 -0.720 -0.396 1.329 0.535 0.967 -0.274 -0.878 -0.159 + + 704 iasi_metop-a 7885 0.584126E-03 + -0.367 0.005 -0.976 -0.848 -0.384 -0.257 -0.703 -0.212 -0.299 -0.240 + -0.655 0.307 -0.240 0.054 -0.396 0.262 -0.550 -0.182 -0.349 -0.092 + 0.047 0.662 -0.245 -0.125 -0.117 -0.186 -0.097 0.002 -0.330 -0.345 + -0.670 -0.656 -0.442 -0.465 0.181 -0.016 0.819 0.257 0.115 0.183 + 0.672 0.110 -0.472 -1.092 0.513 -0.216 1.288 -0.031 0.741 0.569 + -0.512 0.150 0.431 0.160 0.787 0.364 0.319 0.915 0.315 1.179 + 0.451 -0.607 0.495 0.864 0.386 0.150 0.552 1.202 -0.304 0.598 + 0.411 0.358 0.812 -0.026 -0.486 0.454 0.195 -0.234 -0.648 0.097 + -0.292 0.457 -0.895 -0.469 0.030 0.380 0.402 0.326 -0.565 0.359 + + 705 iasi_metop-a 7888 0.590807E-03 + -0.516 0.375 -1.235 -0.506 0.147 -0.107 -0.587 -0.485 -0.487 -0.553 + -0.670 -0.522 0.012 0.055 -0.883 0.482 -0.073 0.066 -0.137 -0.191 + 0.471 0.762 -0.313 -0.025 0.248 -0.125 -0.417 -0.317 -0.172 -0.393 + -0.201 -0.198 -0.175 -0.570 0.818 0.624 0.937 0.273 -0.337 -0.234 + 0.819 0.211 -0.037 -1.366 0.258 0.012 1.103 0.305 -0.003 1.713 + 0.249 0.309 0.894 0.424 1.162 0.118 0.502 1.192 0.445 0.969 + 0.847 -0.784 0.583 0.214 0.489 -0.067 0.111 1.335 -0.590 0.194 + 1.495 0.807 0.499 -0.140 -0.217 0.508 0.855 -0.260 1.381 1.677 + 0.511 0.988 0.653 0.116 0.944 0.894 0.452 1.244 -0.634 -0.104 + + 706 iasi_metop-a 7912 0.146446E-01 + 0.936 1.051 0.701 0.214 0.988 0.901 0.034 0.979 0.979 0.747 + 0.130 0.227 0.910 1.159 0.666 0.282 0.674 0.380 0.251 0.155 + 0.668 1.408 0.170 0.252 0.807 0.336 0.342 0.767 0.611 -0.220 + 0.340 0.639 1.043 0.796 1.178 0.586 1.256 1.434 1.908 1.120 + 1.244 1.939 1.084 0.413 1.551 1.406 0.599 1.946 1.317 1.635 + 1.684 1.449 1.923 1.117 1.398 0.701 0.942 0.860 1.001 1.876 + 1.339 0.450 1.964 1.127 2.470 1.855 1.693 1.210 0.381 0.419 + 1.262 1.875 0.223 1.609 1.358 0.050 1.943 0.691 1.293 1.575 + 1.143 1.144 1.559 0.934 1.407 0.757 1.011 2.112 1.901 1.258 + + 707 iasi_metop-a 7950 0.103434E-02 + -0.042 0.392 -0.269 -0.065 0.280 0.295 0.044 0.278 0.322 0.322 + 0.394 0.452 0.745 1.382 0.704 0.537 0.735 0.873 0.399 0.698 + 1.166 1.593 0.287 1.152 0.868 0.486 0.877 1.131 1.347 1.057 + -0.341 -0.132 -0.231 -0.594 0.357 -0.463 -0.096 -0.064 -0.396 0.043 + 0.592 0.346 -1.130 -1.242 0.435 0.030 1.350 -0.125 0.231 0.926 + -0.071 0.455 1.055 0.688 0.866 -0.302 0.095 0.777 0.300 0.123 + 0.571 0.066 0.524 -0.504 1.038 0.382 0.147 1.141 -0.618 -0.449 + 0.563 0.865 0.293 -0.567 -0.358 -0.012 -0.073 0.434 0.233 0.339 + 0.344 0.172 -0.863 -0.766 0.353 -0.663 -0.920 0.541 -0.511 -0.173 + + 708 iasi_metop-a 7972 0.828234E-02 + -0.083 0.929 0.245 0.107 0.345 0.706 -0.204 0.223 0.544 0.224 + -0.123 0.242 0.676 -0.131 -0.043 0.509 -0.137 0.425 0.303 -0.229 + 0.388 0.656 0.192 0.050 0.642 0.250 0.110 0.306 -0.025 -0.349 + 0.188 0.503 0.052 0.370 1.293 1.366 1.504 1.264 1.298 -0.271 + 0.971 1.271 0.630 0.008 0.319 0.524 1.346 1.140 0.420 1.748 + 1.514 1.129 1.305 0.765 0.962 0.448 1.112 1.053 0.357 1.859 + 1.151 -0.420 1.187 0.600 2.687 1.039 -0.229 0.796 -0.162 0.837 + 1.184 1.438 0.722 0.573 0.179 0.645 0.184 0.781 0.970 1.300 + -0.056 0.468 1.164 0.170 1.542 0.857 0.853 1.879 1.050 1.090 + + 709 iasi_metop-a 7980 0.243604E-02 + -0.463 0.562 -0.735 -0.351 0.460 0.501 -0.511 0.217 -0.155 0.266 + -0.112 0.692 0.483 0.273 0.108 0.854 -0.207 0.029 0.278 0.870 + 1.063 1.123 -0.239 0.620 0.536 0.012 0.000 0.474 0.499 0.198 + -0.103 -0.578 -0.026 -0.353 0.363 0.311 1.012 0.420 -0.642 -0.292 + 0.023 0.857 -0.129 -1.182 0.464 1.045 1.675 0.804 -0.048 0.185 + 0.280 0.628 0.772 0.369 0.517 0.531 0.041 0.755 0.173 0.927 + 0.485 -0.808 0.299 0.628 0.974 0.588 0.418 1.211 -0.068 0.343 + 1.397 1.293 0.598 0.036 -0.865 1.078 0.150 -0.217 0.950 1.301 + -0.356 0.706 0.409 -1.006 0.212 1.209 0.325 0.799 -0.387 0.362 + + 710 iasi_metop-a 7995 0.200764E-02 + 0.000 0.498 -0.850 -0.541 0.199 0.023 -0.270 -0.157 -0.503 -0.289 + -0.649 -0.125 0.176 0.199 -0.281 0.667 -0.633 0.310 0.013 0.349 + 0.689 0.470 -0.187 -0.138 0.191 0.373 0.056 -0.188 0.082 0.123 + 0.203 -0.185 0.293 -0.438 0.234 -0.248 1.273 0.419 -0.062 -0.152 + 0.199 0.283 -0.534 -0.841 0.491 0.877 2.117 1.426 0.301 1.117 + -0.195 0.359 0.226 1.109 0.640 0.623 -0.387 0.691 0.633 1.188 + -0.408 -1.586 -0.449 0.254 0.475 0.744 0.405 0.526 -1.079 0.437 + 1.309 1.573 -0.514 -0.831 0.088 -0.226 -0.794 0.142 0.972 1.773 + -0.050 1.631 -0.436 0.189 -0.378 -0.498 0.501 0.494 -0.002 0.177 + + 711 iasi_metop-a 8007 0.100372E-02 + -0.509 0.490 -1.029 -0.546 -0.238 -0.303 -0.269 -0.406 -0.426 -0.389 + -0.201 -0.085 0.120 -0.211 -0.295 0.337 -0.289 -0.283 0.030 0.072 + 0.143 0.811 -0.260 -0.116 0.262 0.378 -0.470 0.053 0.382 -0.114 + -0.770 -0.201 -0.610 -0.635 0.435 -0.047 0.616 -0.294 0.189 -0.509 + 0.101 0.619 0.060 -0.554 0.449 -0.044 1.907 0.697 0.351 0.979 + 0.047 1.081 0.643 0.591 0.613 -0.128 0.494 0.525 0.813 1.312 + 0.073 -1.063 1.428 0.908 0.841 0.460 0.300 0.965 -0.014 0.340 + 0.421 1.224 0.043 0.318 -0.230 0.093 -0.476 0.343 0.382 0.823 + -0.605 0.727 -0.842 -0.329 0.311 0.832 0.084 0.754 -0.478 0.526 + + 712 iasi_metop-a 8015 0.200568E-02 + -0.253 0.392 -0.667 -0.704 0.075 0.120 -0.620 -0.431 -0.696 -0.439 + -0.493 -0.614 -0.409 0.204 -0.081 0.250 -0.043 0.300 -0.202 0.133 + 0.754 0.114 -0.370 -0.400 0.032 0.348 -0.165 -0.580 0.325 -0.389 + -0.553 -0.204 0.114 0.004 0.213 0.015 0.485 0.107 -0.438 -0.363 + 0.365 0.342 -0.744 -1.529 0.921 0.659 1.404 0.187 0.233 0.543 + 0.354 -0.006 0.182 0.680 0.467 0.677 0.126 0.626 -0.223 1.451 + 0.501 -1.028 -0.196 0.597 1.216 0.717 0.075 1.256 -0.229 0.658 + -0.166 -0.198 -0.480 -0.636 -0.696 1.128 0.384 1.040 0.833 0.997 + -0.025 1.096 0.401 -0.789 0.005 0.587 -0.224 0.334 -0.242 -0.469 + + 713 iasi_metop-a 8055 0.171605E-02 + -0.224 -0.121 -0.797 -0.107 0.026 -0.167 -0.299 -0.507 -0.408 -0.321 + -0.550 0.762 0.428 0.046 -0.224 0.358 0.119 0.026 -0.361 -0.132 + 0.413 0.375 -0.124 0.151 0.242 0.335 -0.409 -0.222 0.052 0.149 + -0.273 -0.302 0.035 -0.063 0.584 -0.328 0.942 0.596 0.390 0.130 + 0.523 0.667 -0.933 -0.592 0.315 1.093 1.589 0.741 0.364 0.821 + 0.232 0.413 1.600 0.534 0.940 -0.656 0.517 0.490 0.830 0.990 + 0.868 -0.652 1.039 0.122 0.736 0.786 0.378 0.841 -0.416 0.678 + 1.382 1.265 0.955 -0.088 -0.070 0.491 0.634 0.517 1.013 1.609 + 0.418 0.820 -0.276 -0.186 0.838 0.271 0.191 1.455 -0.381 -0.024 + + 714 iasi_metop-a 8078 0.209851E-02 + -0.065 1.279 -0.007 -0.153 -0.019 0.758 -0.041 -0.735 -0.513 -0.537 + -0.178 -0.061 0.526 0.921 -0.232 0.431 -0.187 -0.277 0.044 0.163 + 0.264 0.891 -0.100 -0.353 -0.011 -0.132 -0.325 -0.375 0.432 -0.076 + 0.027 0.090 0.371 -0.233 1.003 0.283 1.568 0.423 0.651 0.521 + 0.331 0.589 -0.023 -0.704 0.447 0.699 0.916 0.802 0.408 0.765 + 0.617 1.016 1.506 0.830 0.903 0.651 0.266 0.993 -0.060 1.066 + 0.357 0.920 0.056 0.679 0.255 0.337 0.254 1.105 0.485 0.382 + -0.608 0.806 -0.756 -0.111 -0.075 0.847 -0.314 1.815 0.435 0.830 + 0.411 0.637 -0.619 0.614 0.540 1.302 1.108 1.383 0.622 -0.316 + + 715 airs_aqua 1 -0.282562E-01 + -1.823 -1.756 -1.717 -1.662 -1.631 -1.583 -1.552 -1.525 -1.503 -1.460 + -1.445 -1.430 -1.413 -1.373 -1.373 -1.353 -1.328 -1.310 -1.298 -1.269 + -1.278 -1.228 -1.265 -1.223 -1.231 -1.200 -1.191 -1.190 -1.186 -1.167 + -1.164 -1.143 -1.141 -1.143 -1.146 -1.132 -1.122 -1.114 -1.119 -1.092 + -1.127 -1.119 -1.111 -1.088 -1.096 -1.099 -1.087 -1.107 -1.080 -1.120 + -1.114 -1.118 -1.095 -1.132 -1.114 -1.118 -1.117 -1.147 -1.131 -1.147 + -1.145 -1.161 -1.142 -1.170 -1.156 -1.186 -1.191 -1.199 -1.230 -1.224 + -1.235 -1.255 -1.280 -1.294 -1.306 -1.324 -1.334 -1.350 -1.364 -1.390 + -1.426 -1.449 -1.484 -1.503 -1.525 -1.587 -1.598 -1.656 -1.702 -1.772 + + 716 airs_aqua 6 -0.277355E-01 + -1.799 -1.766 -1.729 -1.691 -1.683 -1.678 -1.652 -1.639 -1.636 -1.607 + -1.590 -1.576 -1.581 -1.555 -1.554 -1.524 -1.529 -1.518 -1.531 -1.514 + -1.504 -1.481 -1.511 -1.485 -1.471 -1.462 -1.463 -1.468 -1.457 -1.456 + -1.436 -1.420 -1.419 -1.439 -1.441 -1.415 -1.424 -1.415 -1.412 -1.402 + -1.424 -1.410 -1.396 -1.406 -1.416 -1.404 -1.393 -1.408 -1.403 -1.396 + -1.381 -1.420 -1.404 -1.412 -1.410 -1.411 -1.419 -1.420 -1.426 -1.431 + -1.450 -1.449 -1.446 -1.451 -1.453 -1.454 -1.464 -1.468 -1.487 -1.487 + -1.486 -1.495 -1.512 -1.512 -1.528 -1.555 -1.549 -1.562 -1.571 -1.572 + -1.585 -1.601 -1.607 -1.622 -1.644 -1.674 -1.680 -1.706 -1.730 -1.766 + + 717 airs_aqua 7 -0.126020E-01 + -0.522 -0.490 -0.489 -0.467 -0.466 -0.447 -0.456 -0.444 -0.439 -0.435 + -0.446 -0.419 -0.422 -0.425 -0.422 -0.420 -0.403 -0.418 -0.409 -0.404 + -0.400 -0.399 -0.397 -0.381 -0.427 -0.402 -0.387 -0.391 -0.406 -0.407 + -0.417 -0.388 -0.396 -0.385 -0.409 -0.405 -0.393 -0.377 -0.387 -0.399 + -0.402 -0.393 -0.393 -0.373 -0.371 -0.396 -0.389 -0.390 -0.411 -0.386 + -0.380 -0.401 -0.401 -0.385 -0.404 -0.397 -0.382 -0.387 -0.413 -0.393 + -0.374 -0.406 -0.362 -0.385 -0.400 -0.375 -0.366 -0.405 -0.387 -0.365 + -0.375 -0.410 -0.390 -0.399 -0.402 -0.414 -0.396 -0.382 -0.385 -0.382 + -0.403 -0.416 -0.408 -0.410 -0.426 -0.419 -0.429 -0.439 -0.457 -0.483 + + 718 airs_aqua 10 -0.396074E-01 + -1.332 -1.303 -1.280 -1.255 -1.245 -1.217 -1.223 -1.205 -1.208 -1.195 + -1.179 -1.182 -1.167 -1.174 -1.175 -1.148 -1.133 -1.160 -1.149 -1.159 + -1.122 -1.134 -1.123 -1.113 -1.130 -1.115 -1.116 -1.107 -1.110 -1.114 + -1.088 -1.095 -1.097 -1.078 -1.089 -1.078 -1.094 -1.075 -1.067 -1.047 + -1.048 -1.062 -1.061 -1.053 -1.065 -1.064 -1.049 -1.056 -1.045 -1.064 + -1.057 -1.061 -1.067 -1.061 -1.056 -1.065 -1.080 -1.077 -1.082 -1.076 + -1.093 -1.097 -1.093 -1.092 -1.101 -1.101 -1.103 -1.121 -1.109 -1.127 + -1.108 -1.119 -1.138 -1.123 -1.137 -1.150 -1.153 -1.149 -1.139 -1.156 + -1.155 -1.174 -1.174 -1.180 -1.192 -1.191 -1.214 -1.235 -1.265 -1.280 + + 719 airs_aqua 11 -0.470032E-01 + -1.487 -1.459 -1.437 -1.415 -1.401 -1.372 -1.380 -1.364 -1.353 -1.347 + -1.324 -1.325 -1.330 -1.317 -1.310 -1.299 -1.296 -1.310 -1.296 -1.274 + -1.274 -1.271 -1.259 -1.250 -1.258 -1.246 -1.241 -1.238 -1.216 -1.215 + -1.223 -1.225 -1.219 -1.213 -1.235 -1.204 -1.215 -1.189 -1.181 -1.184 + -1.189 -1.188 -1.187 -1.180 -1.178 -1.196 -1.178 -1.201 -1.184 -1.201 + -1.194 -1.198 -1.184 -1.193 -1.199 -1.204 -1.199 -1.214 -1.221 -1.209 + -1.202 -1.234 -1.221 -1.229 -1.229 -1.250 -1.231 -1.255 -1.246 -1.245 + -1.232 -1.267 -1.273 -1.273 -1.288 -1.290 -1.306 -1.298 -1.298 -1.309 + -1.309 -1.317 -1.310 -1.336 -1.341 -1.353 -1.356 -1.381 -1.422 -1.434 + + 720 airs_aqua 15 -0.178932E-01 + -0.637 -0.624 -0.585 -0.568 -0.556 -0.547 -0.532 -0.532 -0.529 -0.500 + -0.493 -0.504 -0.482 -0.485 -0.460 -0.461 -0.478 -0.480 -0.465 -0.449 + -0.452 -0.442 -0.461 -0.438 -0.441 -0.448 -0.439 -0.412 -0.445 -0.424 + -0.442 -0.429 -0.431 -0.435 -0.428 -0.418 -0.432 -0.437 -0.426 -0.436 + -0.430 -0.442 -0.435 -0.430 -0.420 -0.421 -0.410 -0.431 -0.429 -0.426 + -0.425 -0.414 -0.427 -0.443 -0.416 -0.429 -0.424 -0.431 -0.415 -0.432 + -0.425 -0.433 -0.439 -0.419 -0.440 -0.444 -0.422 -0.441 -0.458 -0.437 + -0.438 -0.466 -0.444 -0.474 -0.474 -0.468 -0.469 -0.471 -0.483 -0.469 + -0.490 -0.514 -0.508 -0.519 -0.537 -0.529 -0.552 -0.557 -0.592 -0.612 + + 721 airs_aqua 16 -0.339881E-01 + -1.278 -1.245 -1.209 -1.170 -1.148 -1.130 -1.123 -1.099 -1.072 -1.074 + -1.059 -1.054 -1.029 -1.024 -1.000 -0.993 -0.977 -1.002 -0.983 -0.965 + -0.946 -0.950 -0.948 -0.927 -0.937 -0.916 -0.919 -0.895 -0.919 -0.871 + -0.884 -0.868 -0.871 -0.864 -0.876 -0.867 -0.859 -0.860 -0.853 -0.857 + -0.855 -0.841 -0.840 -0.834 -0.844 -0.835 -0.832 -0.839 -0.854 -0.858 + -0.859 -0.844 -0.857 -0.862 -0.859 -0.860 -0.860 -0.892 -0.882 -0.892 + -0.893 -0.908 -0.893 -0.899 -0.889 -0.923 -0.924 -0.933 -0.942 -0.950 + -0.940 -0.956 -0.950 -0.963 -0.987 -0.994 -1.008 -1.000 -1.020 -1.031 + -1.041 -1.064 -1.081 -1.089 -1.112 -1.112 -1.158 -1.173 -1.222 -1.242 + + 722 airs_aqua 17 -0.476388E-01 + -1.868 -1.849 -1.814 -1.796 -1.773 -1.756 -1.756 -1.749 -1.730 -1.718 + -1.718 -1.707 -1.687 -1.688 -1.690 -1.681 -1.657 -1.651 -1.664 -1.654 + -1.649 -1.640 -1.632 -1.623 -1.624 -1.601 -1.608 -1.602 -1.595 -1.583 + -1.583 -1.580 -1.569 -1.565 -1.571 -1.546 -1.560 -1.524 -1.545 -1.549 + -1.548 -1.540 -1.546 -1.537 -1.546 -1.535 -1.517 -1.540 -1.549 -1.552 + -1.545 -1.559 -1.546 -1.545 -1.551 -1.558 -1.571 -1.578 -1.581 -1.574 + -1.567 -1.598 -1.586 -1.594 -1.606 -1.608 -1.596 -1.620 -1.610 -1.635 + -1.631 -1.653 -1.643 -1.649 -1.652 -1.659 -1.668 -1.673 -1.677 -1.696 + -1.696 -1.703 -1.713 -1.717 -1.733 -1.747 -1.753 -1.777 -1.801 -1.818 + + 723 airs_aqua 20 -0.189043E-01 + -0.359 -0.346 -0.325 -0.307 -0.313 -0.298 -0.300 -0.291 -0.287 -0.280 + -0.290 -0.282 -0.288 -0.287 -0.283 -0.269 -0.281 -0.290 -0.275 -0.276 + -0.282 -0.287 -0.268 -0.264 -0.288 -0.275 -0.283 -0.286 -0.297 -0.282 + -0.296 -0.283 -0.293 -0.285 -0.281 -0.294 -0.285 -0.290 -0.302 -0.297 + -0.286 -0.284 -0.292 -0.284 -0.284 -0.281 -0.281 -0.304 -0.293 -0.288 + -0.277 -0.300 -0.279 -0.294 -0.271 -0.290 -0.280 -0.301 -0.268 -0.284 + -0.291 -0.295 -0.280 -0.279 -0.271 -0.296 -0.286 -0.287 -0.283 -0.290 + -0.272 -0.271 -0.282 -0.284 -0.283 -0.286 -0.268 -0.274 -0.277 -0.289 + -0.290 -0.287 -0.286 -0.288 -0.293 -0.298 -0.298 -0.296 -0.322 -0.327 + + 724 airs_aqua 21 -0.164768E-01 + -0.392 -0.367 -0.360 -0.336 -0.343 -0.323 -0.330 -0.327 -0.317 -0.320 + -0.317 -0.313 -0.300 -0.326 -0.297 -0.292 -0.327 -0.309 -0.327 -0.327 + -0.325 -0.287 -0.324 -0.312 -0.323 -0.305 -0.312 -0.298 -0.311 -0.327 + -0.321 -0.318 -0.317 -0.315 -0.314 -0.346 -0.326 -0.336 -0.331 -0.342 + -0.322 -0.342 -0.320 -0.311 -0.329 -0.318 -0.310 -0.334 -0.341 -0.349 + -0.332 -0.334 -0.336 -0.327 -0.326 -0.342 -0.309 -0.329 -0.338 -0.311 + -0.330 -0.322 -0.311 -0.313 -0.310 -0.326 -0.319 -0.321 -0.320 -0.335 + -0.305 -0.309 -0.321 -0.320 -0.328 -0.318 -0.325 -0.334 -0.329 -0.304 + -0.322 -0.311 -0.317 -0.330 -0.322 -0.333 -0.328 -0.338 -0.354 -0.365 + + 725 airs_aqua 22 -0.290687E-01 + -0.935 -0.912 -0.860 -0.849 -0.816 -0.796 -0.786 -0.753 -0.735 -0.724 + -0.710 -0.710 -0.689 -0.680 -0.655 -0.654 -0.654 -0.640 -0.633 -0.608 + -0.611 -0.594 -0.590 -0.580 -0.578 -0.566 -0.568 -0.557 -0.560 -0.542 + -0.546 -0.550 -0.519 -0.524 -0.516 -0.509 -0.514 -0.493 -0.509 -0.492 + -0.502 -0.514 -0.514 -0.479 -0.511 -0.485 -0.504 -0.512 -0.507 -0.501 + -0.495 -0.526 -0.512 -0.531 -0.507 -0.519 -0.543 -0.509 -0.529 -0.547 + -0.548 -0.550 -0.558 -0.568 -0.563 -0.575 -0.568 -0.591 -0.576 -0.591 + -0.599 -0.606 -0.632 -0.638 -0.656 -0.651 -0.651 -0.673 -0.674 -0.687 + -0.711 -0.721 -0.732 -0.755 -0.779 -0.788 -0.824 -0.840 -0.873 -0.912 + + 726 airs_aqua 24 -0.450934E-01 + -1.600 -1.571 -1.549 -1.521 -1.512 -1.500 -1.492 -1.464 -1.469 -1.467 + -1.452 -1.451 -1.444 -1.430 -1.427 -1.418 -1.409 -1.417 -1.413 -1.395 + -1.404 -1.394 -1.403 -1.385 -1.378 -1.386 -1.370 -1.376 -1.363 -1.359 + -1.344 -1.349 -1.344 -1.335 -1.337 -1.321 -1.336 -1.322 -1.324 -1.337 + -1.318 -1.322 -1.337 -1.338 -1.333 -1.325 -1.305 -1.329 -1.319 -1.331 + -1.320 -1.354 -1.329 -1.340 -1.339 -1.339 -1.339 -1.350 -1.364 -1.376 + -1.365 -1.373 -1.370 -1.372 -1.380 -1.385 -1.383 -1.410 -1.405 -1.412 + -1.392 -1.416 -1.408 -1.429 -1.433 -1.449 -1.437 -1.442 -1.443 -1.448 + -1.458 -1.468 -1.462 -1.485 -1.498 -1.504 -1.523 -1.533 -1.564 -1.571 + + 727 airs_aqua 27 -0.171682E-01 + -0.405 -0.403 -0.370 -0.356 -0.365 -0.349 -0.338 -0.347 -0.340 -0.343 + -0.334 -0.345 -0.350 -0.335 -0.338 -0.330 -0.348 -0.360 -0.337 -0.344 + -0.349 -0.344 -0.347 -0.343 -0.348 -0.324 -0.343 -0.350 -0.365 -0.352 + -0.355 -0.337 -0.337 -0.349 -0.343 -0.345 -0.358 -0.344 -0.358 -0.355 + -0.356 -0.353 -0.363 -0.340 -0.359 -0.370 -0.381 -0.341 -0.377 -0.349 + -0.333 -0.358 -0.372 -0.348 -0.359 -0.372 -0.336 -0.382 -0.350 -0.362 + -0.360 -0.351 -0.334 -0.334 -0.347 -0.364 -0.350 -0.354 -0.356 -0.339 + -0.340 -0.357 -0.345 -0.348 -0.337 -0.332 -0.340 -0.332 -0.342 -0.334 + -0.342 -0.350 -0.332 -0.345 -0.353 -0.357 -0.355 -0.360 -0.377 -0.389 + + 728 airs_aqua 28 -0.241280E-01 + -1.302 -1.252 -1.199 -1.155 -1.125 -1.096 -1.070 -1.047 -1.027 -1.010 + -0.976 -0.975 -0.953 -0.938 -0.916 -0.920 -0.914 -0.901 -0.894 -0.887 + -0.867 -0.863 -0.849 -0.844 -0.859 -0.844 -0.829 -0.825 -0.813 -0.815 + -0.801 -0.792 -0.797 -0.799 -0.802 -0.797 -0.789 -0.795 -0.794 -0.771 + -0.802 -0.791 -0.795 -0.781 -0.782 -0.765 -0.776 -0.801 -0.792 -0.794 + -0.786 -0.811 -0.795 -0.802 -0.803 -0.801 -0.799 -0.794 -0.805 -0.835 + -0.829 -0.829 -0.826 -0.830 -0.835 -0.848 -0.856 -0.874 -0.857 -0.883 + -0.881 -0.903 -0.901 -0.919 -0.924 -0.955 -0.942 -0.966 -0.971 -0.996 + -1.010 -1.022 -1.062 -1.081 -1.100 -1.133 -1.161 -1.195 -1.248 -1.297 + + 729 airs_aqua 30 -0.478214E-01 + -1.490 -1.466 -1.438 -1.410 -1.396 -1.383 -1.370 -1.367 -1.369 -1.363 + -1.354 -1.328 -1.322 -1.329 -1.318 -1.316 -1.313 -1.321 -1.309 -1.292 + -1.302 -1.299 -1.286 -1.285 -1.279 -1.272 -1.275 -1.260 -1.251 -1.252 + -1.238 -1.248 -1.246 -1.242 -1.249 -1.224 -1.234 -1.216 -1.224 -1.221 + -1.221 -1.215 -1.226 -1.205 -1.218 -1.224 -1.222 -1.226 -1.212 -1.233 + -1.215 -1.231 -1.234 -1.219 -1.229 -1.238 -1.236 -1.239 -1.247 -1.242 + -1.244 -1.264 -1.259 -1.262 -1.262 -1.281 -1.273 -1.277 -1.279 -1.298 + -1.290 -1.313 -1.314 -1.301 -1.312 -1.321 -1.312 -1.329 -1.325 -1.344 + -1.330 -1.347 -1.348 -1.355 -1.372 -1.380 -1.392 -1.406 -1.438 -1.449 + + 730 airs_aqua 36 -0.492729E-01 + -1.438 -1.416 -1.379 -1.360 -1.352 -1.332 -1.325 -1.313 -1.312 -1.308 + -1.301 -1.286 -1.291 -1.282 -1.279 -1.270 -1.265 -1.272 -1.262 -1.252 + -1.253 -1.244 -1.252 -1.242 -1.231 -1.237 -1.229 -1.230 -1.221 -1.224 + -1.216 -1.221 -1.195 -1.208 -1.215 -1.185 -1.178 -1.192 -1.189 -1.171 + -1.199 -1.187 -1.186 -1.187 -1.188 -1.184 -1.176 -1.190 -1.179 -1.193 + -1.186 -1.195 -1.203 -1.192 -1.210 -1.197 -1.202 -1.217 -1.205 -1.216 + -1.211 -1.227 -1.222 -1.223 -1.230 -1.234 -1.232 -1.248 -1.226 -1.242 + -1.238 -1.264 -1.271 -1.258 -1.262 -1.271 -1.276 -1.271 -1.255 -1.291 + -1.286 -1.291 -1.290 -1.299 -1.309 -1.319 -1.333 -1.355 -1.387 -1.399 + + 731 airs_aqua 39 -0.193767E-01 + -0.365 -0.351 -0.346 -0.319 -0.316 -0.313 -0.305 -0.316 -0.300 -0.299 + -0.293 -0.298 -0.291 -0.289 -0.288 -0.291 -0.287 -0.306 -0.313 -0.286 + -0.294 -0.280 -0.297 -0.287 -0.294 -0.288 -0.287 -0.284 -0.292 -0.291 + -0.300 -0.286 -0.280 -0.294 -0.281 -0.286 -0.281 -0.279 -0.285 -0.293 + -0.296 -0.294 -0.302 -0.286 -0.285 -0.295 -0.277 -0.285 -0.285 -0.288 + -0.298 -0.296 -0.297 -0.295 -0.300 -0.303 -0.294 -0.300 -0.281 -0.302 + -0.283 -0.303 -0.296 -0.310 -0.285 -0.293 -0.301 -0.301 -0.296 -0.292 + -0.296 -0.314 -0.299 -0.311 -0.300 -0.302 -0.300 -0.300 -0.294 -0.298 + -0.307 -0.303 -0.291 -0.317 -0.304 -0.323 -0.323 -0.324 -0.342 -0.350 + + 732 airs_aqua 40 -0.172037E-01 + -0.533 -0.508 -0.477 -0.477 -0.453 -0.444 -0.425 -0.417 -0.424 -0.411 + -0.412 -0.400 -0.386 -0.395 -0.389 -0.375 -0.383 -0.390 -0.385 -0.376 + -0.370 -0.358 -0.376 -0.372 -0.367 -0.361 -0.364 -0.355 -0.350 -0.354 + -0.349 -0.348 -0.373 -0.344 -0.364 -0.366 -0.368 -0.369 -0.352 -0.358 + -0.373 -0.356 -0.368 -0.342 -0.354 -0.359 -0.346 -0.364 -0.355 -0.351 + -0.354 -0.372 -0.367 -0.366 -0.360 -0.369 -0.349 -0.366 -0.363 -0.362 + -0.356 -0.371 -0.369 -0.360 -0.358 -0.392 -0.364 -0.389 -0.380 -0.385 + -0.380 -0.380 -0.384 -0.382 -0.389 -0.397 -0.394 -0.405 -0.396 -0.402 + -0.414 -0.416 -0.429 -0.429 -0.449 -0.450 -0.461 -0.484 -0.505 -0.525 + + 733 airs_aqua 42 -0.472953E-01 + -1.471 -1.451 -1.418 -1.408 -1.397 -1.389 -1.382 -1.374 -1.370 -1.376 + -1.354 -1.346 -1.354 -1.332 -1.333 -1.333 -1.333 -1.322 -1.326 -1.301 + -1.314 -1.317 -1.311 -1.299 -1.308 -1.297 -1.298 -1.281 -1.283 -1.273 + -1.269 -1.255 -1.258 -1.260 -1.252 -1.257 -1.254 -1.247 -1.245 -1.234 + -1.246 -1.243 -1.235 -1.225 -1.240 -1.241 -1.229 -1.248 -1.226 -1.239 + -1.239 -1.246 -1.248 -1.260 -1.256 -1.261 -1.264 -1.261 -1.262 -1.275 + -1.268 -1.273 -1.290 -1.274 -1.285 -1.298 -1.295 -1.301 -1.300 -1.309 + -1.314 -1.315 -1.325 -1.325 -1.325 -1.340 -1.333 -1.331 -1.329 -1.342 + -1.341 -1.345 -1.350 -1.359 -1.366 -1.371 -1.387 -1.403 -1.423 -1.433 + + 734 airs_aqua 51 -0.225619E-01 + -0.624 -0.612 -0.583 -0.569 -0.565 -0.561 -0.546 -0.548 -0.545 -0.536 + -0.533 -0.533 -0.531 -0.526 -0.531 -0.519 -0.522 -0.524 -0.527 -0.514 + -0.509 -0.510 -0.519 -0.497 -0.519 -0.513 -0.512 -0.512 -0.522 -0.518 + -0.517 -0.506 -0.522 -0.506 -0.510 -0.512 -0.501 -0.504 -0.512 -0.506 + -0.517 -0.512 -0.525 -0.495 -0.510 -0.517 -0.493 -0.508 -0.505 -0.514 + -0.496 -0.522 -0.512 -0.508 -0.521 -0.510 -0.500 -0.524 -0.498 -0.521 + -0.517 -0.518 -0.506 -0.506 -0.506 -0.519 -0.511 -0.523 -0.527 -0.527 + -0.499 -0.523 -0.530 -0.538 -0.519 -0.527 -0.528 -0.534 -0.527 -0.532 + -0.534 -0.526 -0.548 -0.533 -0.550 -0.554 -0.556 -0.576 -0.593 -0.610 + + 735 airs_aqua 52 -0.192671E-01 + -0.771 -0.757 -0.728 -0.707 -0.703 -0.700 -0.694 -0.674 -0.686 -0.671 + -0.658 -0.666 -0.668 -0.672 -0.655 -0.668 -0.659 -0.673 -0.663 -0.652 + -0.657 -0.642 -0.650 -0.643 -0.667 -0.655 -0.647 -0.658 -0.667 -0.669 + -0.640 -0.640 -0.649 -0.653 -0.660 -0.643 -0.660 -0.648 -0.659 -0.655 + -0.652 -0.648 -0.654 -0.641 -0.656 -0.650 -0.650 -0.654 -0.656 -0.666 + -0.649 -0.662 -0.658 -0.651 -0.647 -0.660 -0.653 -0.669 -0.659 -0.653 + -0.655 -0.658 -0.655 -0.658 -0.651 -0.657 -0.658 -0.652 -0.654 -0.657 + -0.649 -0.660 -0.662 -0.657 -0.660 -0.670 -0.657 -0.658 -0.653 -0.655 + -0.676 -0.679 -0.684 -0.674 -0.681 -0.692 -0.701 -0.710 -0.736 -0.746 + + 736 airs_aqua 54 -0.521763E-01 + -2.539 -2.507 -2.452 -2.400 -2.378 -2.328 -2.290 -2.283 -2.237 -2.204 + -2.180 -2.169 -2.152 -2.114 -2.122 -2.080 -2.054 -2.045 -2.029 -1.993 + -2.004 -1.990 -1.985 -1.971 -1.942 -1.928 -1.902 -1.881 -1.879 -1.854 + -1.850 -1.844 -1.830 -1.845 -1.832 -1.815 -1.812 -1.783 -1.795 -1.782 + -1.768 -1.776 -1.756 -1.779 -1.782 -1.792 -1.755 -1.786 -1.788 -1.782 + -1.796 -1.778 -1.776 -1.777 -1.799 -1.805 -1.804 -1.830 -1.844 -1.844 + -1.851 -1.859 -1.860 -1.876 -1.864 -1.889 -1.910 -1.938 -1.943 -1.960 + -1.968 -1.996 -2.008 -2.006 -2.033 -2.056 -2.060 -2.084 -2.099 -2.136 + -2.154 -2.173 -2.191 -2.229 -2.247 -2.268 -2.314 -2.354 -2.400 -2.445 + + 737 airs_aqua 55 -0.545214E-01 + -2.811 -2.770 -2.704 -2.653 -2.629 -2.575 -2.542 -2.524 -2.486 -2.440 + -2.413 -2.411 -2.371 -2.349 -2.338 -2.305 -2.271 -2.272 -2.243 -2.225 + -2.217 -2.189 -2.203 -2.184 -2.183 -2.135 -2.114 -2.105 -2.097 -2.073 + -2.083 -2.062 -2.060 -2.068 -2.053 -2.035 -2.040 -2.025 -2.013 -2.003 + -1.985 -2.018 -1.996 -2.002 -2.021 -2.004 -1.994 -2.026 -2.011 -2.012 + -2.016 -2.014 -2.009 -2.013 -2.027 -2.031 -2.043 -2.054 -2.066 -2.075 + -2.072 -2.101 -2.106 -2.100 -2.099 -2.145 -2.139 -2.178 -2.181 -2.199 + -2.191 -2.226 -2.260 -2.255 -2.282 -2.306 -2.315 -2.342 -2.353 -2.389 + -2.415 -2.436 -2.454 -2.491 -2.522 -2.559 -2.591 -2.637 -2.684 -2.737 + + 738 airs_aqua 56 -0.447812E-01 + -1.947 -1.902 -1.832 -1.792 -1.757 -1.711 -1.675 -1.643 -1.614 -1.580 + -1.557 -1.546 -1.524 -1.504 -1.486 -1.458 -1.437 -1.436 -1.404 -1.392 + -1.388 -1.378 -1.376 -1.335 -1.340 -1.313 -1.298 -1.285 -1.299 -1.274 + -1.269 -1.256 -1.253 -1.253 -1.248 -1.242 -1.241 -1.216 -1.220 -1.215 + -1.215 -1.215 -1.217 -1.204 -1.218 -1.237 -1.208 -1.215 -1.223 -1.212 + -1.232 -1.224 -1.219 -1.226 -1.238 -1.234 -1.245 -1.256 -1.256 -1.274 + -1.274 -1.285 -1.294 -1.290 -1.296 -1.308 -1.326 -1.344 -1.349 -1.375 + -1.368 -1.399 -1.407 -1.420 -1.432 -1.458 -1.470 -1.487 -1.512 -1.533 + -1.560 -1.580 -1.603 -1.642 -1.681 -1.707 -1.744 -1.792 -1.838 -1.889 + + 739 airs_aqua 59 -0.260218E-01 + -0.981 -0.956 -0.910 -0.891 -0.871 -0.852 -0.835 -0.828 -0.814 -0.807 + -0.785 -0.789 -0.782 -0.758 -0.751 -0.739 -0.742 -0.743 -0.732 -0.714 + -0.728 -0.717 -0.712 -0.716 -0.699 -0.689 -0.687 -0.679 -0.685 -0.684 + -0.689 -0.678 -0.676 -0.665 -0.670 -0.655 -0.675 -0.666 -0.661 -0.666 + -0.666 -0.660 -0.666 -0.658 -0.659 -0.657 -0.655 -0.675 -0.659 -0.663 + -0.656 -0.673 -0.669 -0.667 -0.657 -0.677 -0.675 -0.678 -0.677 -0.672 + -0.668 -0.683 -0.672 -0.687 -0.676 -0.700 -0.698 -0.710 -0.711 -0.717 + -0.709 -0.728 -0.727 -0.728 -0.732 -0.749 -0.751 -0.747 -0.764 -0.765 + -0.784 -0.799 -0.819 -0.826 -0.834 -0.847 -0.856 -0.885 -0.918 -0.934 + + 740 airs_aqua 62 -0.357013E-01 + -0.952 -0.925 -0.889 -0.867 -0.861 -0.832 -0.808 -0.810 -0.798 -0.790 + -0.784 -0.769 -0.759 -0.754 -0.745 -0.734 -0.741 -0.733 -0.723 -0.709 + -0.700 -0.703 -0.698 -0.682 -0.693 -0.681 -0.670 -0.677 -0.678 -0.655 + -0.657 -0.635 -0.645 -0.660 -0.636 -0.636 -0.645 -0.635 -0.627 -0.622 + -0.644 -0.635 -0.630 -0.621 -0.635 -0.632 -0.613 -0.618 -0.627 -0.616 + -0.618 -0.629 -0.625 -0.633 -0.635 -0.640 -0.634 -0.647 -0.646 -0.662 + -0.662 -0.670 -0.654 -0.656 -0.673 -0.677 -0.679 -0.693 -0.689 -0.703 + -0.697 -0.719 -0.718 -0.715 -0.729 -0.730 -0.739 -0.743 -0.741 -0.761 + -0.770 -0.777 -0.791 -0.800 -0.811 -0.824 -0.842 -0.864 -0.888 -0.907 + + 741 airs_aqua 63 -0.358166E-01 + -1.071 -1.036 -1.005 -0.975 -0.951 -0.919 -0.902 -0.894 -0.878 -0.847 + -0.831 -0.820 -0.807 -0.796 -0.796 -0.767 -0.770 -0.751 -0.761 -0.729 + -0.725 -0.717 -0.715 -0.711 -0.712 -0.691 -0.678 -0.679 -0.672 -0.652 + -0.652 -0.662 -0.638 -0.649 -0.647 -0.636 -0.634 -0.628 -0.624 -0.625 + -0.621 -0.618 -0.621 -0.614 -0.622 -0.622 -0.616 -0.618 -0.615 -0.612 + -0.615 -0.624 -0.615 -0.621 -0.630 -0.629 -0.629 -0.633 -0.634 -0.648 + -0.643 -0.660 -0.661 -0.669 -0.655 -0.673 -0.681 -0.701 -0.697 -0.713 + -0.701 -0.726 -0.746 -0.728 -0.741 -0.752 -0.770 -0.775 -0.792 -0.794 + -0.809 -0.826 -0.842 -0.860 -0.868 -0.902 -0.918 -0.951 -0.976 -1.007 + + 742 airs_aqua 68 -0.326760E-01 + -0.767 -0.748 -0.730 -0.722 -0.706 -0.702 -0.682 -0.684 -0.690 -0.689 + -0.686 -0.684 -0.672 -0.673 -0.676 -0.664 -0.675 -0.678 -0.669 -0.674 + -0.657 -0.674 -0.663 -0.636 -0.654 -0.659 -0.658 -0.675 -0.667 -0.659 + -0.658 -0.644 -0.644 -0.664 -0.646 -0.650 -0.648 -0.640 -0.644 -0.659 + -0.667 -0.656 -0.674 -0.650 -0.655 -0.654 -0.627 -0.657 -0.655 -0.648 + -0.635 -0.652 -0.653 -0.654 -0.651 -0.667 -0.650 -0.649 -0.666 -0.654 + -0.651 -0.664 -0.659 -0.657 -0.659 -0.659 -0.659 -0.672 -0.665 -0.669 + -0.660 -0.676 -0.676 -0.676 -0.674 -0.671 -0.689 -0.669 -0.668 -0.676 + -0.680 -0.678 -0.673 -0.680 -0.694 -0.705 -0.707 -0.721 -0.735 -0.744 + + 743 airs_aqua 69 -0.251890E-01 + -0.573 -0.553 -0.529 -0.526 -0.518 -0.515 -0.503 -0.498 -0.507 -0.509 + -0.497 -0.499 -0.506 -0.510 -0.496 -0.501 -0.505 -0.516 -0.510 -0.519 + -0.517 -0.510 -0.505 -0.507 -0.518 -0.524 -0.525 -0.529 -0.537 -0.524 + -0.527 -0.522 -0.533 -0.518 -0.532 -0.520 -0.530 -0.529 -0.537 -0.545 + -0.560 -0.542 -0.549 -0.538 -0.550 -0.546 -0.537 -0.535 -0.542 -0.544 + -0.515 -0.547 -0.542 -0.548 -0.530 -0.549 -0.527 -0.532 -0.529 -0.525 + -0.530 -0.525 -0.520 -0.523 -0.520 -0.514 -0.516 -0.521 -0.517 -0.507 + -0.496 -0.506 -0.494 -0.503 -0.507 -0.504 -0.505 -0.500 -0.501 -0.497 + -0.507 -0.496 -0.498 -0.494 -0.500 -0.508 -0.519 -0.534 -0.540 -0.542 + + 744 airs_aqua 71 -0.373211E-01 + -1.267 -1.231 -1.188 -1.158 -1.134 -1.098 -1.072 -1.059 -1.045 -1.033 + -1.014 -0.992 -0.987 -0.977 -0.962 -0.953 -0.948 -0.937 -0.936 -0.923 + -0.922 -0.896 -0.890 -0.881 -0.883 -0.872 -0.869 -0.873 -0.863 -0.852 + -0.842 -0.835 -0.834 -0.843 -0.837 -0.829 -0.814 -0.820 -0.816 -0.823 + -0.821 -0.823 -0.805 -0.803 -0.813 -0.818 -0.826 -0.819 -0.822 -0.812 + -0.797 -0.822 -0.826 -0.830 -0.827 -0.827 -0.836 -0.842 -0.850 -0.845 + -0.837 -0.845 -0.852 -0.858 -0.862 -0.874 -0.874 -0.882 -0.890 -0.899 + -0.916 -0.910 -0.919 -0.928 -0.945 -0.953 -0.973 -0.970 -0.976 -0.988 + -1.021 -1.025 -1.041 -1.056 -1.080 -1.112 -1.134 -1.163 -1.203 -1.241 + + 745 airs_aqua 72 -0.435201E-01 + -2.159 -2.118 -2.066 -2.030 -2.001 -1.959 -1.934 -1.917 -1.897 -1.883 + -1.859 -1.847 -1.832 -1.820 -1.808 -1.787 -1.786 -1.771 -1.751 -1.754 + -1.740 -1.727 -1.705 -1.700 -1.693 -1.697 -1.690 -1.670 -1.673 -1.665 + -1.648 -1.643 -1.642 -1.645 -1.636 -1.621 -1.611 -1.621 -1.615 -1.603 + -1.612 -1.611 -1.621 -1.603 -1.609 -1.621 -1.612 -1.602 -1.623 -1.612 + -1.603 -1.624 -1.622 -1.637 -1.627 -1.630 -1.637 -1.630 -1.631 -1.653 + -1.652 -1.669 -1.669 -1.672 -1.696 -1.689 -1.683 -1.708 -1.721 -1.725 + -1.726 -1.745 -1.753 -1.748 -1.781 -1.784 -1.805 -1.815 -1.827 -1.840 + -1.872 -1.890 -1.905 -1.931 -1.944 -1.989 -2.009 -2.051 -2.090 -2.132 + + 746 airs_aqua 73 -0.343534E-01 + -4.495 -4.528 -4.540 -4.576 -4.655 -4.696 -4.768 -4.849 -4.932 -5.024 + -5.109 -5.212 -5.334 -5.403 -5.516 -5.641 -5.735 -5.854 -5.955 -6.080 + -6.167 -6.305 -6.387 -6.501 -6.608 -6.662 -6.789 -6.892 -6.989 -7.105 + -7.154 -7.233 -7.318 -7.347 -7.424 -7.439 -7.526 -7.527 -7.603 -7.640 + -7.692 -7.700 -7.716 -7.670 -7.687 -7.716 -7.713 -7.668 -7.654 -7.648 + -7.577 -7.612 -7.563 -7.557 -7.474 -7.436 -7.370 -7.285 -7.231 -7.128 + -7.082 -6.974 -6.849 -6.800 -6.707 -6.599 -6.500 -6.383 -6.297 -6.175 + -6.065 -5.942 -5.853 -5.718 -5.618 -5.523 -5.412 -5.307 -5.182 -5.089 + -4.983 -4.888 -4.804 -4.744 -4.651 -4.582 -4.521 -4.478 -4.439 -4.393 + + 747 airs_aqua 74 -0.245988E-01 + -5.553 -5.550 -5.496 -5.463 -5.468 -5.440 -5.424 -5.404 -5.383 -5.365 + -5.346 -5.341 -5.334 -5.299 -5.304 -5.279 -5.247 -5.232 -5.229 -5.198 + -5.199 -5.189 -5.193 -5.179 -5.164 -5.118 -5.101 -5.109 -5.110 -5.069 + -5.044 -5.067 -5.056 -5.049 -5.046 -5.027 -5.030 -5.003 -4.986 -4.981 + -4.978 -4.985 -4.984 -4.965 -4.989 -4.966 -4.967 -5.003 -4.975 -4.990 + -5.001 -4.991 -4.990 -4.986 -5.025 -4.999 -5.042 -5.032 -5.031 -5.029 + -5.068 -5.086 -5.079 -5.104 -5.072 -5.119 -5.123 -5.151 -5.168 -5.175 + -5.156 -5.198 -5.218 -5.215 -5.238 -5.259 -5.278 -5.273 -5.288 -5.309 + -5.316 -5.349 -5.338 -5.365 -5.378 -5.400 -5.411 -5.439 -5.460 -5.493 + + 748 airs_aqua 75 -0.110139E-01 + -0.674 -0.841 -0.716 -0.758 -1.009 -0.973 -1.015 -1.274 -1.206 -1.298 + -1.539 -1.450 -1.509 -1.774 -1.647 -1.738 -1.918 -1.943 -1.991 -2.173 + -2.108 -2.231 -2.397 -2.447 -2.432 -2.506 -2.631 -2.660 -2.749 -2.771 + -2.787 -2.897 -2.919 -2.925 -2.953 -2.977 -3.001 -3.053 -3.019 -3.091 + -3.127 -3.081 -3.104 -3.093 -3.162 -3.126 -3.125 -3.101 -3.040 -3.095 + -3.048 -3.048 -3.056 -3.022 -2.991 -2.911 -2.942 -2.924 -2.911 -2.831 + -2.784 -2.724 -2.655 -2.603 -2.518 -2.509 -2.439 -2.421 -2.299 -2.148 + -2.175 -1.961 -1.994 -1.927 -1.745 -1.651 -1.813 -1.457 -1.304 -1.558 + -1.278 -1.155 -1.300 -1.013 -0.969 -1.049 -0.806 -0.730 -0.879 -0.718 + + 749 airs_aqua 76 -0.232564E-01 + -1.796 -1.954 -2.091 -2.214 -2.413 -2.584 -2.729 -2.845 -2.983 -3.151 + -3.252 -3.321 -3.458 -3.503 -3.604 -3.683 -3.755 -3.847 -3.922 -3.952 + -3.991 -4.049 -4.092 -4.162 -4.175 -4.175 -4.243 -4.317 -4.310 -4.350 + -4.325 -4.387 -4.399 -4.417 -4.387 -4.421 -4.434 -4.425 -4.419 -4.450 + -4.492 -4.469 -4.460 -4.444 -4.493 -4.464 -4.463 -4.492 -4.461 -4.452 + -4.437 -4.446 -4.454 -4.432 -4.420 -4.402 -4.412 -4.363 -4.365 -4.328 + -4.329 -4.267 -4.238 -4.247 -4.187 -4.206 -4.131 -4.103 -4.069 -4.024 + -3.937 -3.900 -3.836 -3.779 -3.699 -3.646 -3.563 -3.491 -3.337 -3.266 + -3.122 -3.042 -2.904 -2.737 -2.595 -2.446 -2.283 -2.041 -1.961 -1.836 + + 750 airs_aqua 77 -0.392670E-01 + -4.094 -4.118 -4.134 -4.197 -4.231 -4.261 -4.302 -4.330 -4.346 -4.395 + -4.394 -4.401 -4.444 -4.441 -4.448 -4.454 -4.452 -4.480 -4.496 -4.471 + -4.491 -4.491 -4.497 -4.514 -4.510 -4.464 -4.480 -4.499 -4.506 -4.483 + -4.488 -4.506 -4.505 -4.483 -4.483 -4.470 -4.506 -4.465 -4.464 -4.458 + -4.489 -4.499 -4.473 -4.469 -4.486 -4.488 -4.469 -4.495 -4.480 -4.503 + -4.473 -4.474 -4.475 -4.488 -4.473 -4.496 -4.518 -4.486 -4.491 -4.477 + -4.505 -4.493 -4.495 -4.506 -4.487 -4.508 -4.485 -4.494 -4.506 -4.497 + -4.477 -4.488 -4.480 -4.459 -4.439 -4.461 -4.433 -4.439 -4.423 -4.403 + -4.357 -4.350 -4.341 -4.326 -4.288 -4.255 -4.208 -4.192 -4.136 -4.085 + + 751 airs_aqua 78 -0.472384E-01 + -4.198 -4.160 -4.160 -4.187 -4.189 -4.179 -4.210 -4.216 -4.200 -4.229 + -4.220 -4.216 -4.227 -4.212 -4.223 -4.216 -4.200 -4.207 -4.215 -4.199 + -4.189 -4.204 -4.196 -4.181 -4.197 -4.158 -4.160 -4.154 -4.148 -4.154 + -4.134 -4.158 -4.146 -4.138 -4.137 -4.110 -4.118 -4.092 -4.107 -4.097 + -4.118 -4.116 -4.105 -4.103 -4.114 -4.104 -4.094 -4.111 -4.098 -4.107 + -4.105 -4.113 -4.118 -4.114 -4.113 -4.135 -4.138 -4.117 -4.132 -4.117 + -4.150 -4.148 -4.155 -4.181 -4.152 -4.184 -4.178 -4.190 -4.193 -4.211 + -4.184 -4.197 -4.216 -4.206 -4.204 -4.231 -4.226 -4.237 -4.217 -4.229 + -4.209 -4.215 -4.224 -4.230 -4.223 -4.209 -4.201 -4.203 -4.199 -4.190 + + 752 airs_aqua 79 -0.482244E-01 + -4.395 -4.349 -4.317 -4.319 -4.305 -4.282 -4.275 -4.259 -4.252 -4.250 + -4.226 -4.199 -4.208 -4.163 -4.165 -4.156 -4.128 -4.123 -4.108 -4.093 + -4.078 -4.069 -4.038 -4.044 -4.040 -4.008 -3.995 -3.993 -3.979 -3.969 + -3.952 -3.951 -3.950 -3.939 -3.927 -3.908 -3.905 -3.879 -3.888 -3.888 + -3.897 -3.898 -3.889 -3.890 -3.887 -3.889 -3.859 -3.908 -3.886 -3.881 + -3.889 -3.901 -3.903 -3.901 -3.924 -3.920 -3.943 -3.925 -3.961 -3.943 + -3.964 -3.964 -3.990 -4.003 -4.003 -4.034 -4.035 -4.065 -4.081 -4.085 + -4.087 -4.109 -4.123 -4.127 -4.145 -4.182 -4.187 -4.214 -4.198 -4.225 + -4.249 -4.248 -4.269 -4.295 -4.301 -4.311 -4.331 -4.339 -4.368 -4.367 + + 753 airs_aqua 80 -0.480102E-01 + -4.665 -4.600 -4.547 -4.515 -4.482 -4.427 -4.399 -4.372 -4.336 -4.307 + -4.280 -4.233 -4.221 -4.163 -4.139 -4.118 -4.084 -4.064 -4.037 -4.009 + -3.984 -3.973 -3.939 -3.916 -3.902 -3.875 -3.855 -3.845 -3.824 -3.808 + -3.781 -3.777 -3.762 -3.748 -3.735 -3.726 -3.727 -3.690 -3.676 -3.674 + -3.699 -3.692 -3.686 -3.680 -3.678 -3.680 -3.666 -3.687 -3.669 -3.690 + -3.669 -3.697 -3.712 -3.722 -3.723 -3.736 -3.759 -3.745 -3.769 -3.771 + -3.799 -3.816 -3.844 -3.861 -3.866 -3.905 -3.913 -3.947 -3.973 -3.991 + -4.003 -4.042 -4.068 -4.077 -4.120 -4.162 -4.178 -4.213 -4.244 -4.269 + -4.311 -4.337 -4.371 -4.425 -4.451 -4.492 -4.522 -4.573 -4.618 -4.644 + + 754 airs_aqua 82 -0.502726E-01 + -4.289 -4.210 -4.112 -4.054 -3.981 -3.917 -3.859 -3.812 -3.761 -3.713 + -3.667 -3.617 -3.586 -3.524 -3.491 -3.457 -3.405 -3.387 -3.347 -3.308 + -3.288 -3.265 -3.223 -3.199 -3.183 -3.151 -3.130 -3.103 -3.088 -3.068 + -3.038 -3.028 -3.012 -3.003 -2.991 -2.969 -2.965 -2.943 -2.926 -2.928 + -2.928 -2.924 -2.939 -2.919 -2.913 -2.920 -2.900 -2.919 -2.917 -2.933 + -2.918 -2.947 -2.939 -2.951 -2.970 -2.977 -2.995 -3.004 -3.022 -3.037 + -3.053 -3.079 -3.099 -3.122 -3.125 -3.167 -3.185 -3.225 -3.248 -3.271 + -3.303 -3.330 -3.374 -3.387 -3.435 -3.476 -3.523 -3.571 -3.604 -3.651 + -3.704 -3.756 -3.802 -3.865 -3.913 -3.983 -4.052 -4.124 -4.194 -4.257 + + 755 airs_aqua 83 -0.513542E-01 + -3.375 -3.313 -3.229 -3.170 -3.126 -3.069 -3.024 -2.974 -2.943 -2.896 + -2.851 -2.823 -2.793 -2.752 -2.726 -2.695 -2.655 -2.634 -2.608 -2.578 + -2.564 -2.533 -2.534 -2.498 -2.493 -2.460 -2.439 -2.421 -2.416 -2.381 + -2.361 -2.362 -2.348 -2.337 -2.323 -2.309 -2.307 -2.285 -2.281 -2.277 + -2.268 -2.267 -2.274 -2.272 -2.267 -2.274 -2.261 -2.272 -2.269 -2.272 + -2.285 -2.286 -2.282 -2.296 -2.315 -2.312 -2.336 -2.338 -2.351 -2.373 + -2.372 -2.396 -2.412 -2.425 -2.430 -2.466 -2.483 -2.516 -2.527 -2.541 + -2.564 -2.592 -2.623 -2.636 -2.672 -2.709 -2.737 -2.761 -2.784 -2.822 + -2.875 -2.906 -2.947 -2.993 -3.030 -3.090 -3.139 -3.201 -3.267 -3.323 + + 756 airs_aqua 84 -0.390287E-01 + -4.919 -4.749 -4.579 -4.462 -4.325 -4.212 -4.097 -3.987 -3.886 -3.810 + -3.716 -3.627 -3.558 -3.462 -3.397 -3.334 -3.268 -3.229 -3.167 -3.118 + -3.075 -3.018 -2.978 -2.938 -2.914 -2.867 -2.825 -2.799 -2.780 -2.744 + -2.717 -2.698 -2.684 -2.646 -2.617 -2.620 -2.604 -2.566 -2.575 -2.564 + -2.567 -2.556 -2.567 -2.550 -2.543 -2.554 -2.541 -2.560 -2.565 -2.560 + -2.568 -2.588 -2.592 -2.621 -2.622 -2.634 -2.655 -2.678 -2.700 -2.709 + -2.737 -2.774 -2.805 -2.837 -2.871 -2.909 -2.942 -3.002 -3.032 -3.072 + -3.106 -3.166 -3.236 -3.287 -3.344 -3.421 -3.489 -3.570 -3.629 -3.728 + -3.822 -3.910 -4.020 -4.120 -4.235 -4.368 -4.488 -4.627 -4.764 -4.915 + + 757 airs_aqua 86 -0.267714E-01 + -3.196 -3.033 -2.888 -2.779 -2.676 -2.573 -2.477 -2.398 -2.329 -2.264 + -2.195 -2.130 -2.088 -2.029 -1.974 -1.921 -1.889 -1.863 -1.824 -1.791 + -1.774 -1.721 -1.719 -1.676 -1.658 -1.631 -1.603 -1.593 -1.589 -1.564 + -1.538 -1.528 -1.512 -1.491 -1.494 -1.487 -1.481 -1.461 -1.453 -1.448 + -1.450 -1.455 -1.465 -1.449 -1.435 -1.449 -1.432 -1.439 -1.447 -1.461 + -1.451 -1.452 -1.468 -1.479 -1.472 -1.495 -1.497 -1.504 -1.509 -1.536 + -1.549 -1.577 -1.595 -1.599 -1.613 -1.655 -1.667 -1.703 -1.732 -1.758 + -1.778 -1.814 -1.841 -1.873 -1.921 -1.975 -2.014 -2.066 -2.110 -2.171 + -2.244 -2.301 -2.384 -2.469 -2.561 -2.663 -2.766 -2.895 -3.034 -3.179 + + 758 airs_aqua 92 -0.182908E-01 + -0.651 -0.645 -0.625 -0.628 -0.622 -0.627 -0.615 -0.621 -0.628 -0.632 + -0.626 -0.632 -0.637 -0.639 -0.639 -0.643 -0.649 -0.656 -0.665 -0.668 + -0.661 -0.665 -0.668 -0.667 -0.671 -0.681 -0.674 -0.688 -0.688 -0.706 + -0.697 -0.688 -0.692 -0.698 -0.707 -0.693 -0.706 -0.704 -0.699 -0.718 + -0.713 -0.712 -0.719 -0.709 -0.703 -0.714 -0.703 -0.705 -0.708 -0.699 + -0.690 -0.719 -0.708 -0.706 -0.691 -0.688 -0.682 -0.690 -0.683 -0.670 + -0.675 -0.665 -0.678 -0.665 -0.660 -0.670 -0.659 -0.654 -0.646 -0.635 + -0.632 -0.641 -0.630 -0.613 -0.633 -0.614 -0.616 -0.609 -0.607 -0.603 + -0.606 -0.601 -0.598 -0.595 -0.593 -0.591 -0.580 -0.591 -0.596 -0.602 + + 759 airs_aqua 93 -0.254236E-01 + -1.229 -1.192 -1.152 -1.128 -1.100 -1.065 -1.054 -1.031 -1.013 -0.998 + -0.991 -0.960 -0.950 -0.947 -0.924 -0.912 -0.918 -0.907 -0.914 -0.890 + -0.888 -0.868 -0.863 -0.854 -0.861 -0.859 -0.841 -0.848 -0.837 -0.831 + -0.822 -0.813 -0.812 -0.818 -0.813 -0.809 -0.811 -0.803 -0.799 -0.802 + -0.812 -0.812 -0.814 -0.787 -0.799 -0.803 -0.787 -0.798 -0.797 -0.802 + -0.790 -0.809 -0.800 -0.808 -0.804 -0.815 -0.802 -0.799 -0.804 -0.805 + -0.822 -0.813 -0.823 -0.827 -0.832 -0.839 -0.832 -0.848 -0.850 -0.847 + -0.856 -0.866 -0.877 -0.883 -0.888 -0.906 -0.910 -0.922 -0.930 -0.937 + -0.965 -0.971 -0.991 -1.011 -1.028 -1.049 -1.069 -1.102 -1.145 -1.172 + + 760 airs_aqua 98 -0.194629E-01 + -0.369 -0.353 -0.340 -0.327 -0.337 -0.316 -0.310 -0.309 -0.318 -0.328 + -0.308 -0.304 -0.302 -0.298 -0.298 -0.304 -0.304 -0.306 -0.305 -0.303 + -0.302 -0.293 -0.297 -0.289 -0.296 -0.297 -0.276 -0.297 -0.303 -0.300 + -0.290 -0.296 -0.297 -0.305 -0.304 -0.311 -0.294 -0.293 -0.291 -0.304 + -0.311 -0.299 -0.314 -0.291 -0.296 -0.304 -0.289 -0.297 -0.287 -0.286 + -0.282 -0.288 -0.279 -0.292 -0.275 -0.288 -0.274 -0.288 -0.291 -0.293 + -0.278 -0.280 -0.281 -0.278 -0.289 -0.284 -0.281 -0.273 -0.284 -0.283 + -0.271 -0.266 -0.286 -0.275 -0.277 -0.285 -0.282 -0.279 -0.282 -0.278 + -0.275 -0.274 -0.279 -0.272 -0.284 -0.286 -0.289 -0.293 -0.304 -0.321 + + 761 airs_aqua 99 -0.237299E-01 + -0.908 -0.866 -0.833 -0.814 -0.787 -0.765 -0.740 -0.730 -0.719 -0.713 + -0.694 -0.676 -0.671 -0.670 -0.649 -0.645 -0.634 -0.639 -0.617 -0.618 + -0.605 -0.596 -0.588 -0.589 -0.586 -0.580 -0.580 -0.579 -0.579 -0.566 + -0.560 -0.554 -0.553 -0.554 -0.555 -0.538 -0.553 -0.534 -0.526 -0.540 + -0.538 -0.543 -0.551 -0.535 -0.520 -0.527 -0.538 -0.524 -0.528 -0.541 + -0.521 -0.545 -0.534 -0.535 -0.524 -0.540 -0.534 -0.530 -0.530 -0.535 + -0.528 -0.539 -0.543 -0.547 -0.566 -0.565 -0.547 -0.568 -0.567 -0.579 + -0.572 -0.585 -0.583 -0.603 -0.605 -0.612 -0.623 -0.618 -0.628 -0.639 + -0.656 -0.666 -0.670 -0.692 -0.715 -0.729 -0.752 -0.779 -0.811 -0.847 + + 762 airs_aqua 101 -0.499865E-01 + -1.725 -1.697 -1.664 -1.647 -1.640 -1.617 -1.603 -1.591 -1.586 -1.576 + -1.575 -1.556 -1.554 -1.560 -1.540 -1.525 -1.533 -1.522 -1.512 -1.506 + -1.509 -1.494 -1.483 -1.484 -1.478 -1.470 -1.463 -1.461 -1.453 -1.443 + -1.426 -1.433 -1.416 -1.421 -1.417 -1.407 -1.402 -1.390 -1.388 -1.388 + -1.398 -1.393 -1.387 -1.374 -1.399 -1.378 -1.369 -1.384 -1.380 -1.390 + -1.380 -1.390 -1.395 -1.386 -1.384 -1.398 -1.405 -1.405 -1.405 -1.420 + -1.413 -1.416 -1.430 -1.437 -1.436 -1.442 -1.447 -1.463 -1.462 -1.467 + -1.465 -1.472 -1.484 -1.486 -1.484 -1.505 -1.500 -1.507 -1.505 -1.513 + -1.530 -1.533 -1.546 -1.551 -1.557 -1.573 -1.587 -1.609 -1.635 -1.650 + + 763 airs_aqua 104 -0.189087E-01 + -0.361 -0.349 -0.338 -0.337 -0.335 -0.322 -0.324 -0.323 -0.330 -0.336 + -0.329 -0.322 -0.337 -0.333 -0.325 -0.341 -0.353 -0.350 -0.350 -0.354 + -0.362 -0.362 -0.354 -0.356 -0.355 -0.351 -0.354 -0.365 -0.366 -0.388 + -0.359 -0.367 -0.368 -0.353 -0.378 -0.365 -0.382 -0.362 -0.367 -0.380 + -0.384 -0.370 -0.373 -0.374 -0.372 -0.372 -0.362 -0.363 -0.374 -0.368 + -0.349 -0.364 -0.365 -0.359 -0.357 -0.359 -0.344 -0.349 -0.352 -0.326 + -0.335 -0.329 -0.335 -0.342 -0.337 -0.323 -0.326 -0.324 -0.335 -0.316 + -0.308 -0.306 -0.302 -0.304 -0.311 -0.298 -0.299 -0.281 -0.282 -0.276 + -0.277 -0.293 -0.280 -0.278 -0.274 -0.269 -0.276 -0.279 -0.287 -0.294 + + 764 airs_aqua 105 -0.230299E-01 + -0.553 -0.535 -0.508 -0.488 -0.466 -0.453 -0.442 -0.427 -0.425 -0.421 + -0.414 -0.398 -0.382 -0.387 -0.371 -0.365 -0.377 -0.371 -0.365 -0.358 + -0.336 -0.346 -0.338 -0.334 -0.343 -0.354 -0.342 -0.340 -0.338 -0.319 + -0.315 -0.322 -0.314 -0.309 -0.319 -0.314 -0.305 -0.303 -0.307 -0.308 + -0.306 -0.306 -0.296 -0.299 -0.301 -0.290 -0.298 -0.287 -0.298 -0.286 + -0.282 -0.281 -0.288 -0.288 -0.298 -0.288 -0.285 -0.288 -0.293 -0.285 + -0.291 -0.299 -0.287 -0.281 -0.306 -0.294 -0.294 -0.300 -0.308 -0.301 + -0.310 -0.310 -0.311 -0.312 -0.326 -0.331 -0.330 -0.332 -0.320 -0.336 + -0.348 -0.355 -0.359 -0.376 -0.378 -0.395 -0.404 -0.420 -0.452 -0.470 + + 765 airs_aqua 108 -0.456785E-01 + -1.522 -1.485 -1.445 -1.417 -1.389 -1.371 -1.360 -1.334 -1.326 -1.316 + -1.302 -1.285 -1.282 -1.269 -1.262 -1.254 -1.238 -1.236 -1.216 -1.219 + -1.213 -1.200 -1.199 -1.178 -1.182 -1.182 -1.170 -1.159 -1.159 -1.145 + -1.144 -1.139 -1.123 -1.140 -1.126 -1.122 -1.109 -1.110 -1.112 -1.107 + -1.105 -1.100 -1.097 -1.095 -1.107 -1.104 -1.088 -1.109 -1.103 -1.098 + -1.108 -1.109 -1.110 -1.110 -1.122 -1.117 -1.121 -1.127 -1.130 -1.133 + -1.142 -1.161 -1.152 -1.158 -1.137 -1.170 -1.165 -1.181 -1.183 -1.189 + -1.193 -1.203 -1.213 -1.221 -1.226 -1.234 -1.242 -1.249 -1.254 -1.272 + -1.285 -1.292 -1.305 -1.323 -1.333 -1.356 -1.375 -1.410 -1.436 -1.469 + + 766 airs_aqua 110 -0.185134E-01 + -0.419 -0.406 -0.393 -0.380 -0.380 -0.376 -0.367 -0.365 -0.377 -0.371 + -0.369 -0.374 -0.384 -0.381 -0.377 -0.373 -0.390 -0.372 -0.388 -0.387 + -0.394 -0.382 -0.381 -0.394 -0.408 -0.413 -0.391 -0.406 -0.415 -0.404 + -0.394 -0.407 -0.398 -0.401 -0.403 -0.406 -0.399 -0.392 -0.393 -0.399 + -0.402 -0.404 -0.414 -0.394 -0.402 -0.397 -0.390 -0.392 -0.409 -0.393 + -0.375 -0.410 -0.395 -0.392 -0.380 -0.389 -0.379 -0.376 -0.371 -0.371 + -0.369 -0.368 -0.361 -0.366 -0.370 -0.358 -0.376 -0.360 -0.360 -0.357 + -0.350 -0.346 -0.342 -0.347 -0.339 -0.340 -0.338 -0.329 -0.330 -0.329 + -0.329 -0.322 -0.328 -0.320 -0.329 -0.319 -0.322 -0.331 -0.347 -0.345 + + 767 airs_aqua 111 -0.218244E-01 + -0.435 -0.425 -0.391 -0.396 -0.393 -0.383 -0.380 -0.370 -0.388 -0.382 + -0.382 -0.369 -0.390 -0.378 -0.370 -0.372 -0.388 -0.382 -0.389 -0.389 + -0.376 -0.382 -0.390 -0.385 -0.388 -0.395 -0.370 -0.391 -0.388 -0.392 + -0.384 -0.378 -0.380 -0.389 -0.402 -0.381 -0.385 -0.377 -0.399 -0.390 + -0.397 -0.400 -0.378 -0.393 -0.378 -0.379 -0.389 -0.371 -0.372 -0.377 + -0.359 -0.371 -0.377 -0.366 -0.362 -0.359 -0.368 -0.358 -0.354 -0.361 + -0.343 -0.337 -0.348 -0.335 -0.339 -0.351 -0.339 -0.333 -0.325 -0.310 + -0.313 -0.313 -0.316 -0.312 -0.323 -0.315 -0.307 -0.316 -0.305 -0.300 + -0.310 -0.306 -0.303 -0.303 -0.300 -0.302 -0.307 -0.319 -0.340 -0.338 + + 768 airs_aqua 113 -0.501004E-01 + -1.610 -1.587 -1.546 -1.530 -1.516 -1.499 -1.487 -1.478 -1.472 -1.460 + -1.457 -1.435 -1.451 -1.437 -1.423 -1.421 -1.413 -1.416 -1.415 -1.392 + -1.394 -1.388 -1.377 -1.381 -1.386 -1.376 -1.371 -1.358 -1.350 -1.340 + -1.338 -1.336 -1.332 -1.330 -1.327 -1.322 -1.309 -1.302 -1.307 -1.308 + -1.309 -1.297 -1.301 -1.294 -1.307 -1.305 -1.281 -1.297 -1.296 -1.298 + -1.298 -1.305 -1.294 -1.292 -1.303 -1.305 -1.313 -1.302 -1.300 -1.314 + -1.306 -1.326 -1.331 -1.323 -1.323 -1.337 -1.338 -1.344 -1.342 -1.358 + -1.350 -1.351 -1.367 -1.356 -1.364 -1.377 -1.374 -1.378 -1.379 -1.384 + -1.399 -1.398 -1.404 -1.415 -1.422 -1.438 -1.453 -1.476 -1.499 -1.517 + + 769 airs_aqua 116 -0.183507E-01 + -0.493 -0.467 -0.453 -0.445 -0.433 -0.429 -0.422 -0.409 -0.428 -0.427 + -0.417 -0.409 -0.431 -0.421 -0.401 -0.411 -0.426 -0.422 -0.418 -0.425 + -0.420 -0.412 -0.416 -0.428 -0.429 -0.425 -0.427 -0.424 -0.430 -0.426 + -0.424 -0.425 -0.416 -0.435 -0.422 -0.425 -0.433 -0.412 -0.426 -0.424 + -0.434 -0.446 -0.429 -0.420 -0.427 -0.427 -0.434 -0.424 -0.428 -0.423 + -0.401 -0.420 -0.423 -0.422 -0.412 -0.412 -0.397 -0.417 -0.403 -0.381 + -0.386 -0.397 -0.395 -0.397 -0.392 -0.393 -0.394 -0.377 -0.377 -0.389 + -0.371 -0.372 -0.368 -0.382 -0.368 -0.369 -0.356 -0.362 -0.357 -0.349 + -0.358 -0.341 -0.353 -0.363 -0.365 -0.374 -0.369 -0.386 -0.403 -0.405 + + 770 airs_aqua 117 -0.213575E-01 + -0.433 -0.426 -0.409 -0.402 -0.394 -0.388 -0.369 -0.377 -0.384 -0.387 + -0.381 -0.379 -0.387 -0.388 -0.367 -0.366 -0.388 -0.398 -0.394 -0.392 + -0.386 -0.398 -0.383 -0.380 -0.390 -0.382 -0.396 -0.399 -0.398 -0.394 + -0.383 -0.382 -0.388 -0.387 -0.403 -0.391 -0.385 -0.391 -0.378 -0.381 + -0.415 -0.382 -0.388 -0.372 -0.374 -0.371 -0.374 -0.363 -0.372 -0.371 + -0.347 -0.377 -0.364 -0.360 -0.356 -0.353 -0.348 -0.352 -0.359 -0.341 + -0.344 -0.340 -0.334 -0.327 -0.344 -0.327 -0.339 -0.326 -0.334 -0.324 + -0.314 -0.313 -0.314 -0.306 -0.308 -0.300 -0.303 -0.292 -0.302 -0.293 + -0.298 -0.287 -0.284 -0.285 -0.290 -0.296 -0.299 -0.303 -0.319 -0.325 + + 771 airs_aqua 123 -0.194144E-01 + -0.450 -0.433 -0.421 -0.418 -0.419 -0.408 -0.414 -0.419 -0.418 -0.417 + -0.426 -0.418 -0.431 -0.428 -0.430 -0.431 -0.432 -0.440 -0.438 -0.444 + -0.450 -0.439 -0.441 -0.451 -0.452 -0.458 -0.449 -0.451 -0.456 -0.471 + -0.444 -0.451 -0.466 -0.452 -0.459 -0.457 -0.464 -0.452 -0.450 -0.454 + -0.469 -0.452 -0.456 -0.462 -0.429 -0.449 -0.434 -0.433 -0.438 -0.434 + -0.416 -0.434 -0.429 -0.435 -0.429 -0.417 -0.413 -0.415 -0.411 -0.397 + -0.386 -0.389 -0.387 -0.387 -0.383 -0.385 -0.369 -0.366 -0.389 -0.365 + -0.354 -0.347 -0.336 -0.353 -0.339 -0.338 -0.347 -0.327 -0.331 -0.324 + -0.324 -0.315 -0.317 -0.308 -0.303 -0.314 -0.310 -0.315 -0.329 -0.334 + + 772 airs_aqua 124 -0.329318E-01 + -1.145 -1.110 -1.077 -1.055 -1.027 -1.000 -0.984 -0.970 -0.960 -0.946 + -0.941 -0.924 -0.931 -0.901 -0.895 -0.891 -0.880 -0.882 -0.855 -0.859 + -0.851 -0.840 -0.842 -0.820 -0.826 -0.819 -0.812 -0.806 -0.796 -0.791 + -0.771 -0.773 -0.771 -0.778 -0.761 -0.764 -0.745 -0.746 -0.739 -0.739 + -0.751 -0.738 -0.745 -0.741 -0.732 -0.722 -0.706 -0.726 -0.727 -0.717 + -0.709 -0.717 -0.715 -0.727 -0.714 -0.725 -0.722 -0.728 -0.727 -0.723 + -0.735 -0.726 -0.749 -0.736 -0.730 -0.750 -0.754 -0.759 -0.768 -0.758 + -0.766 -0.763 -0.779 -0.776 -0.793 -0.795 -0.795 -0.797 -0.814 -0.814 + -0.828 -0.841 -0.850 -0.870 -0.885 -0.908 -0.923 -0.948 -0.983 -1.020 + + 773 airs_aqua 128 -0.164977E-01 + -0.540 -0.512 -0.492 -0.482 -0.468 -0.451 -0.440 -0.442 -0.446 -0.449 + -0.436 -0.436 -0.439 -0.433 -0.414 -0.425 -0.431 -0.441 -0.436 -0.423 + -0.416 -0.419 -0.414 -0.426 -0.425 -0.427 -0.412 -0.411 -0.415 -0.424 + -0.427 -0.422 -0.414 -0.412 -0.411 -0.418 -0.413 -0.398 -0.410 -0.408 + -0.419 -0.398 -0.409 -0.394 -0.393 -0.405 -0.384 -0.387 -0.391 -0.393 + -0.367 -0.387 -0.381 -0.390 -0.372 -0.376 -0.365 -0.358 -0.360 -0.343 + -0.353 -0.352 -0.345 -0.342 -0.359 -0.348 -0.347 -0.344 -0.334 -0.344 + -0.324 -0.333 -0.335 -0.329 -0.338 -0.331 -0.328 -0.333 -0.340 -0.334 + -0.330 -0.337 -0.333 -0.348 -0.351 -0.353 -0.359 -0.374 -0.386 -0.405 + + 774 airs_aqua 129 -0.174822E-01 + -0.381 -0.371 -0.350 -0.354 -0.348 -0.348 -0.339 -0.343 -0.352 -0.362 + -0.357 -0.354 -0.368 -0.357 -0.351 -0.358 -0.374 -0.379 -0.368 -0.363 + -0.387 -0.370 -0.378 -0.380 -0.375 -0.378 -0.385 -0.379 -0.387 -0.396 + -0.385 -0.383 -0.383 -0.382 -0.380 -0.371 -0.393 -0.378 -0.385 -0.398 + -0.385 -0.388 -0.386 -0.375 -0.371 -0.375 -0.373 -0.355 -0.375 -0.356 + -0.338 -0.365 -0.356 -0.345 -0.341 -0.345 -0.340 -0.331 -0.337 -0.312 + -0.318 -0.322 -0.303 -0.294 -0.302 -0.300 -0.285 -0.289 -0.269 -0.273 + -0.268 -0.251 -0.261 -0.247 -0.254 -0.249 -0.247 -0.229 -0.227 -0.214 + -0.225 -0.213 -0.215 -0.208 -0.203 -0.210 -0.213 -0.209 -0.220 -0.229 + + 775 airs_aqua 138 -0.333261E-02 + -0.714 -0.677 -0.657 -0.643 -0.622 -0.601 -0.605 -0.587 -0.569 -0.566 + -0.557 -0.547 -0.551 -0.530 -0.523 -0.511 -0.517 -0.512 -0.516 -0.491 + -0.495 -0.488 -0.493 -0.485 -0.488 -0.476 -0.477 -0.470 -0.473 -0.471 + -0.465 -0.463 -0.469 -0.463 -0.472 -0.442 -0.453 -0.455 -0.454 -0.465 + -0.466 -0.464 -0.461 -0.451 -0.450 -0.440 -0.438 -0.440 -0.444 -0.460 + -0.441 -0.455 -0.440 -0.449 -0.440 -0.443 -0.444 -0.443 -0.443 -0.436 + -0.437 -0.450 -0.434 -0.439 -0.446 -0.443 -0.441 -0.440 -0.443 -0.449 + -0.435 -0.446 -0.464 -0.449 -0.465 -0.472 -0.462 -0.480 -0.480 -0.490 + -0.501 -0.507 -0.515 -0.530 -0.537 -0.552 -0.559 -0.579 -0.601 -0.630 + + 776 airs_aqua 139 -0.718529E-03 + -0.464 -0.445 -0.426 -0.426 -0.420 -0.404 -0.411 -0.407 -0.402 -0.413 + -0.406 -0.404 -0.411 -0.405 -0.389 -0.400 -0.407 -0.415 -0.414 -0.411 + -0.420 -0.404 -0.416 -0.410 -0.404 -0.417 -0.403 -0.423 -0.421 -0.437 + -0.425 -0.422 -0.422 -0.421 -0.428 -0.420 -0.415 -0.414 -0.422 -0.438 + -0.442 -0.432 -0.438 -0.420 -0.425 -0.421 -0.419 -0.410 -0.431 -0.418 + -0.402 -0.422 -0.420 -0.411 -0.410 -0.411 -0.406 -0.389 -0.389 -0.387 + -0.389 -0.380 -0.370 -0.378 -0.373 -0.380 -0.361 -0.371 -0.374 -0.358 + -0.349 -0.352 -0.362 -0.349 -0.350 -0.353 -0.341 -0.344 -0.352 -0.337 + -0.343 -0.355 -0.345 -0.356 -0.352 -0.351 -0.346 -0.365 -0.363 -0.383 + + 777 airs_aqua 144 0.622731E-02 + -0.746 -0.724 -0.715 -0.707 -0.705 -0.702 -0.701 -0.691 -0.692 -0.688 + -0.694 -0.692 -0.697 -0.701 -0.681 -0.696 -0.692 -0.699 -0.697 -0.694 + -0.710 -0.690 -0.707 -0.702 -0.711 -0.704 -0.699 -0.711 -0.721 -0.733 + -0.733 -0.725 -0.727 -0.720 -0.725 -0.736 -0.736 -0.732 -0.738 -0.751 + -0.745 -0.751 -0.747 -0.752 -0.729 -0.739 -0.733 -0.730 -0.729 -0.745 + -0.717 -0.730 -0.702 -0.730 -0.719 -0.720 -0.710 -0.710 -0.696 -0.705 + -0.691 -0.696 -0.681 -0.689 -0.672 -0.680 -0.673 -0.660 -0.669 -0.659 + -0.659 -0.650 -0.656 -0.647 -0.649 -0.636 -0.635 -0.632 -0.641 -0.642 + -0.639 -0.645 -0.640 -0.649 -0.643 -0.645 -0.652 -0.650 -0.656 -0.678 + + 778 airs_aqua 145 0.601222E-02 + -0.523 -0.505 -0.506 -0.501 -0.505 -0.518 -0.505 -0.507 -0.516 -0.508 + -0.517 -0.506 -0.519 -0.520 -0.503 -0.511 -0.518 -0.530 -0.532 -0.528 + -0.534 -0.528 -0.532 -0.528 -0.557 -0.539 -0.546 -0.547 -0.567 -0.578 + -0.575 -0.571 -0.570 -0.558 -0.575 -0.570 -0.563 -0.573 -0.572 -0.581 + -0.588 -0.586 -0.587 -0.583 -0.571 -0.585 -0.575 -0.573 -0.581 -0.582 + -0.548 -0.566 -0.560 -0.569 -0.544 -0.569 -0.537 -0.556 -0.546 -0.534 + -0.529 -0.534 -0.520 -0.513 -0.507 -0.518 -0.503 -0.497 -0.495 -0.484 + -0.485 -0.476 -0.477 -0.476 -0.470 -0.471 -0.464 -0.459 -0.455 -0.454 + -0.450 -0.455 -0.447 -0.459 -0.441 -0.445 -0.441 -0.438 -0.449 -0.454 + + 779 airs_aqua 150 0.103546E-01 + -0.729 -0.708 -0.703 -0.698 -0.684 -0.667 -0.663 -0.656 -0.655 -0.659 + -0.647 -0.648 -0.643 -0.638 -0.623 -0.618 -0.631 -0.629 -0.628 -0.624 + -0.634 -0.608 -0.621 -0.618 -0.632 -0.623 -0.637 -0.631 -0.622 -0.642 + -0.618 -0.630 -0.635 -0.630 -0.624 -0.619 -0.616 -0.614 -0.636 -0.640 + -0.634 -0.644 -0.643 -0.619 -0.627 -0.633 -0.625 -0.619 -0.614 -0.632 + -0.614 -0.615 -0.605 -0.607 -0.609 -0.607 -0.596 -0.593 -0.595 -0.585 + -0.589 -0.579 -0.573 -0.579 -0.569 -0.576 -0.561 -0.565 -0.567 -0.556 + -0.557 -0.555 -0.560 -0.555 -0.556 -0.558 -0.553 -0.559 -0.560 -0.561 + -0.572 -0.572 -0.584 -0.574 -0.586 -0.588 -0.597 -0.608 -0.612 -0.643 + + 780 airs_aqua 151 0.965825E-02 + -0.540 -0.528 -0.520 -0.528 -0.511 -0.510 -0.512 -0.520 -0.503 -0.512 + -0.519 -0.518 -0.516 -0.501 -0.513 -0.509 -0.516 -0.524 -0.525 -0.518 + -0.522 -0.516 -0.520 -0.530 -0.543 -0.546 -0.529 -0.530 -0.556 -0.547 + -0.547 -0.546 -0.546 -0.545 -0.559 -0.546 -0.544 -0.548 -0.541 -0.554 + -0.570 -0.549 -0.565 -0.553 -0.555 -0.566 -0.547 -0.551 -0.547 -0.565 + -0.531 -0.543 -0.541 -0.534 -0.535 -0.542 -0.518 -0.520 -0.518 -0.523 + -0.511 -0.516 -0.491 -0.506 -0.496 -0.497 -0.483 -0.479 -0.481 -0.473 + -0.468 -0.474 -0.469 -0.467 -0.463 -0.461 -0.455 -0.458 -0.453 -0.445 + -0.445 -0.453 -0.453 -0.449 -0.443 -0.439 -0.441 -0.446 -0.450 -0.459 + + 781 airs_aqua 156 0.214491E-01 + -0.419 -0.422 -0.417 -0.422 -0.413 -0.414 -0.419 -0.421 -0.423 -0.422 + -0.411 -0.421 -0.419 -0.421 -0.398 -0.418 -0.423 -0.422 -0.418 -0.416 + -0.431 -0.410 -0.432 -0.422 -0.434 -0.444 -0.434 -0.430 -0.444 -0.440 + -0.450 -0.440 -0.441 -0.445 -0.452 -0.451 -0.453 -0.458 -0.458 -0.458 + -0.462 -0.467 -0.469 -0.455 -0.463 -0.464 -0.453 -0.454 -0.447 -0.453 + -0.450 -0.432 -0.436 -0.440 -0.428 -0.427 -0.413 -0.413 -0.414 -0.409 + -0.396 -0.413 -0.387 -0.390 -0.387 -0.388 -0.366 -0.365 -0.370 -0.372 + -0.361 -0.355 -0.356 -0.350 -0.354 -0.346 -0.336 -0.339 -0.340 -0.338 + -0.343 -0.340 -0.329 -0.333 -0.329 -0.332 -0.319 -0.316 -0.322 -0.314 + + 782 airs_aqua 157 0.124688E-01 + -0.464 -0.452 -0.451 -0.444 -0.441 -0.430 -0.442 -0.439 -0.436 -0.436 + -0.436 -0.437 -0.433 -0.427 -0.423 -0.433 -0.447 -0.445 -0.439 -0.449 + -0.449 -0.428 -0.449 -0.442 -0.457 -0.445 -0.457 -0.460 -0.461 -0.481 + -0.469 -0.490 -0.474 -0.468 -0.479 -0.480 -0.476 -0.478 -0.489 -0.490 + -0.491 -0.491 -0.489 -0.485 -0.491 -0.489 -0.483 -0.490 -0.471 -0.491 + -0.475 -0.484 -0.485 -0.481 -0.478 -0.468 -0.459 -0.470 -0.451 -0.457 + -0.455 -0.452 -0.432 -0.434 -0.427 -0.428 -0.421 -0.421 -0.421 -0.417 + -0.412 -0.412 -0.413 -0.405 -0.396 -0.407 -0.401 -0.404 -0.398 -0.383 + -0.393 -0.398 -0.396 -0.396 -0.394 -0.393 -0.404 -0.391 -0.407 -0.404 + + 783 airs_aqua 159 -0.293953E-01 + -1.358 -1.330 -1.299 -1.281 -1.255 -1.236 -1.222 -1.204 -1.193 -1.193 + -1.168 -1.156 -1.160 -1.143 -1.131 -1.121 -1.113 -1.111 -1.104 -1.092 + -1.089 -1.075 -1.070 -1.061 -1.054 -1.053 -1.044 -1.027 -1.038 -1.025 + -1.014 -1.016 -1.000 -1.003 -0.996 -0.993 -0.993 -0.986 -0.977 -0.978 + -0.979 -0.965 -0.989 -0.969 -0.976 -0.969 -0.967 -0.980 -0.967 -0.970 + -0.965 -0.971 -0.973 -0.969 -0.971 -0.982 -0.977 -0.983 -0.987 -0.989 + -0.991 -1.000 -1.012 -1.001 -1.004 -1.022 -1.015 -1.029 -1.043 -1.036 + -1.038 -1.056 -1.055 -1.059 -1.072 -1.077 -1.083 -1.094 -1.101 -1.109 + -1.124 -1.137 -1.144 -1.163 -1.171 -1.184 -1.203 -1.224 -1.255 -1.292 + + 784 airs_aqua 162 0.248138E-01 + -0.487 -0.485 -0.484 -0.479 -0.480 -0.469 -0.472 -0.460 -0.474 -0.468 + -0.465 -0.466 -0.465 -0.469 -0.465 -0.467 -0.472 -0.483 -0.479 -0.467 + -0.484 -0.473 -0.485 -0.483 -0.489 -0.494 -0.508 -0.501 -0.511 -0.510 + -0.510 -0.505 -0.516 -0.524 -0.519 -0.519 -0.527 -0.538 -0.526 -0.547 + -0.561 -0.543 -0.553 -0.542 -0.539 -0.532 -0.534 -0.538 -0.537 -0.545 + -0.533 -0.535 -0.528 -0.514 -0.518 -0.515 -0.504 -0.502 -0.510 -0.492 + -0.496 -0.486 -0.474 -0.471 -0.473 -0.464 -0.461 -0.450 -0.458 -0.450 + -0.447 -0.447 -0.435 -0.438 -0.428 -0.420 -0.423 -0.416 -0.422 -0.421 + -0.424 -0.427 -0.413 -0.415 -0.410 -0.410 -0.416 -0.403 -0.411 -0.410 + + 785 airs_aqua 165 -0.228333E-01 + -1.852 -1.814 -1.781 -1.755 -1.727 -1.705 -1.696 -1.670 -1.658 -1.642 + -1.618 -1.607 -1.588 -1.583 -1.555 -1.541 -1.536 -1.529 -1.515 -1.494 + -1.499 -1.483 -1.471 -1.458 -1.454 -1.440 -1.436 -1.429 -1.427 -1.410 + -1.411 -1.400 -1.386 -1.381 -1.381 -1.361 -1.363 -1.359 -1.360 -1.361 + -1.356 -1.358 -1.363 -1.353 -1.345 -1.357 -1.334 -1.339 -1.340 -1.360 + -1.346 -1.353 -1.354 -1.354 -1.368 -1.356 -1.373 -1.365 -1.372 -1.386 + -1.383 -1.402 -1.404 -1.411 -1.407 -1.421 -1.425 -1.437 -1.453 -1.463 + -1.467 -1.477 -1.490 -1.498 -1.505 -1.515 -1.535 -1.545 -1.553 -1.574 + -1.593 -1.609 -1.616 -1.647 -1.663 -1.688 -1.703 -1.729 -1.762 -1.796 + + 786 airs_aqua 168 0.286230E-01 + -0.324 -0.319 -0.320 -0.302 -0.309 -0.303 -0.300 -0.286 -0.289 -0.276 + -0.272 -0.272 -0.261 -0.260 -0.262 -0.257 -0.277 -0.267 -0.246 -0.260 + -0.259 -0.249 -0.252 -0.258 -0.272 -0.274 -0.279 -0.272 -0.277 -0.268 + -0.292 -0.292 -0.286 -0.288 -0.298 -0.293 -0.294 -0.301 -0.304 -0.313 + -0.311 -0.311 -0.309 -0.311 -0.310 -0.317 -0.300 -0.305 -0.313 -0.312 + -0.304 -0.307 -0.293 -0.294 -0.295 -0.284 -0.284 -0.286 -0.280 -0.272 + -0.266 -0.260 -0.258 -0.258 -0.258 -0.251 -0.240 -0.246 -0.238 -0.244 + -0.233 -0.242 -0.239 -0.233 -0.231 -0.236 -0.234 -0.231 -0.236 -0.239 + -0.240 -0.246 -0.239 -0.251 -0.259 -0.254 -0.261 -0.261 -0.267 -0.257 + + 787 airs_aqua 169 0.204137E-01 + -0.599 -0.590 -0.579 -0.564 -0.567 -0.551 -0.545 -0.535 -0.534 -0.529 + -0.520 -0.520 -0.515 -0.505 -0.502 -0.497 -0.500 -0.496 -0.495 -0.494 + -0.489 -0.486 -0.497 -0.489 -0.500 -0.492 -0.494 -0.498 -0.492 -0.489 + -0.504 -0.505 -0.512 -0.503 -0.508 -0.501 -0.500 -0.509 -0.506 -0.509 + -0.518 -0.526 -0.505 -0.510 -0.522 -0.520 -0.514 -0.514 -0.511 -0.516 + -0.509 -0.512 -0.500 -0.501 -0.498 -0.493 -0.491 -0.496 -0.490 -0.495 + -0.482 -0.470 -0.483 -0.478 -0.473 -0.478 -0.469 -0.467 -0.471 -0.473 + -0.473 -0.470 -0.473 -0.468 -0.462 -0.471 -0.482 -0.475 -0.474 -0.482 + -0.483 -0.500 -0.494 -0.506 -0.502 -0.512 -0.520 -0.519 -0.534 -0.545 + + 788 airs_aqua 170 -0.553855E-02 + -1.184 -1.168 -1.139 -1.130 -1.106 -1.091 -1.080 -1.070 -1.060 -1.044 + -1.036 -1.030 -1.019 -1.006 -0.993 -0.990 -0.983 -0.978 -0.978 -0.958 + -0.960 -0.946 -0.942 -0.940 -0.934 -0.923 -0.930 -0.919 -0.913 -0.925 + -0.916 -0.904 -0.913 -0.893 -0.901 -0.901 -0.896 -0.885 -0.883 -0.884 + -0.903 -0.893 -0.888 -0.878 -0.885 -0.893 -0.869 -0.881 -0.882 -0.892 + -0.871 -0.889 -0.890 -0.875 -0.878 -0.885 -0.889 -0.888 -0.883 -0.891 + -0.889 -0.894 -0.900 -0.895 -0.897 -0.911 -0.914 -0.918 -0.915 -0.924 + -0.918 -0.942 -0.939 -0.940 -0.947 -0.961 -0.968 -0.971 -0.979 -0.995 + -1.011 -1.009 -1.021 -1.038 -1.035 -1.057 -1.071 -1.082 -1.100 -1.127 + + 789 airs_aqua 172 0.952365E-02 + -0.912 -0.874 -0.830 -0.786 -0.757 -0.722 -0.698 -0.672 -0.644 -0.620 + -0.596 -0.588 -0.563 -0.547 -0.544 -0.529 -0.512 -0.511 -0.490 -0.477 + -0.476 -0.460 -0.460 -0.456 -0.454 -0.439 -0.438 -0.430 -0.427 -0.422 + -0.422 -0.417 -0.420 -0.415 -0.410 -0.421 -0.411 -0.409 -0.414 -0.400 + -0.404 -0.404 -0.411 -0.409 -0.412 -0.404 -0.387 -0.403 -0.399 -0.411 + -0.419 -0.421 -0.397 -0.406 -0.392 -0.395 -0.404 -0.404 -0.416 -0.408 + -0.410 -0.408 -0.411 -0.407 -0.406 -0.412 -0.418 -0.424 -0.431 -0.437 + -0.444 -0.457 -0.469 -0.463 -0.480 -0.491 -0.511 -0.520 -0.529 -0.546 + -0.571 -0.587 -0.607 -0.639 -0.658 -0.680 -0.722 -0.749 -0.793 -0.846 + + 790 airs_aqua 173 0.307982E-01 + -0.256 -0.255 -0.239 -0.207 -0.199 -0.175 -0.160 -0.145 -0.136 -0.122 + -0.109 -0.103 -0.085 -0.079 -0.068 -0.072 -0.059 -0.046 -0.031 -0.025 + -0.027 -0.028 -0.026 -0.026 -0.023 -0.035 -0.029 -0.014 -0.027 -0.013 + -0.029 -0.032 -0.022 -0.027 -0.028 -0.022 -0.036 -0.037 -0.040 -0.041 + -0.031 -0.040 -0.039 -0.034 -0.050 -0.050 -0.041 -0.041 -0.032 -0.041 + -0.051 -0.034 -0.026 -0.029 -0.023 -0.017 -0.025 -0.028 -0.036 -0.024 + -0.010 -0.017 -0.013 -0.021 -0.010 -0.012 -0.020 -0.020 -0.014 -0.025 + -0.018 -0.030 -0.034 -0.042 -0.053 -0.051 -0.053 -0.064 -0.074 -0.074 + -0.095 -0.107 -0.107 -0.121 -0.144 -0.149 -0.169 -0.173 -0.184 -0.193 + + 791 airs_aqua 174 0.337862E-01 + -0.315 -0.314 -0.306 -0.288 -0.273 -0.269 -0.262 -0.246 -0.246 -0.235 + -0.223 -0.219 -0.205 -0.204 -0.205 -0.195 -0.194 -0.192 -0.189 -0.185 + -0.186 -0.176 -0.189 -0.187 -0.191 -0.190 -0.198 -0.197 -0.197 -0.202 + -0.204 -0.213 -0.217 -0.217 -0.220 -0.218 -0.230 -0.222 -0.224 -0.222 + -0.233 -0.235 -0.232 -0.244 -0.235 -0.237 -0.230 -0.227 -0.232 -0.235 + -0.237 -0.230 -0.217 -0.223 -0.213 -0.212 -0.202 -0.211 -0.214 -0.194 + -0.189 -0.196 -0.196 -0.181 -0.177 -0.177 -0.177 -0.192 -0.174 -0.177 + -0.162 -0.183 -0.176 -0.175 -0.180 -0.187 -0.190 -0.188 -0.189 -0.195 + -0.205 -0.219 -0.214 -0.231 -0.230 -0.234 -0.248 -0.247 -0.264 -0.261 + + 792 airs_aqua 175 0.251155E-01 + -0.680 -0.676 -0.664 -0.649 -0.636 -0.627 -0.616 -0.604 -0.594 -0.596 + -0.586 -0.581 -0.567 -0.566 -0.554 -0.570 -0.553 -0.554 -0.540 -0.538 + -0.544 -0.540 -0.545 -0.546 -0.547 -0.545 -0.557 -0.544 -0.547 -0.556 + -0.559 -0.563 -0.568 -0.555 -0.560 -0.559 -0.568 -0.564 -0.564 -0.573 + -0.563 -0.579 -0.575 -0.580 -0.579 -0.578 -0.561 -0.567 -0.570 -0.573 + -0.569 -0.560 -0.563 -0.558 -0.545 -0.548 -0.549 -0.549 -0.552 -0.543 + -0.533 -0.536 -0.533 -0.528 -0.514 -0.527 -0.523 -0.519 -0.525 -0.518 + -0.521 -0.523 -0.525 -0.519 -0.521 -0.530 -0.526 -0.522 -0.529 -0.549 + -0.544 -0.553 -0.563 -0.574 -0.575 -0.581 -0.592 -0.602 -0.611 -0.617 + + 793 airs_aqua 177 -0.292140E-02 + -1.388 -1.348 -1.301 -1.256 -1.231 -1.188 -1.172 -1.124 -1.102 -1.082 + -1.056 -1.034 -1.020 -0.996 -0.976 -0.955 -0.940 -0.933 -0.909 -0.895 + -0.888 -0.867 -0.871 -0.850 -0.845 -0.833 -0.828 -0.820 -0.810 -0.798 + -0.800 -0.788 -0.782 -0.784 -0.774 -0.775 -0.763 -0.770 -0.763 -0.761 + -0.748 -0.746 -0.750 -0.760 -0.745 -0.755 -0.744 -0.747 -0.738 -0.754 + -0.747 -0.753 -0.740 -0.758 -0.757 -0.754 -0.766 -0.769 -0.781 -0.771 + -0.789 -0.787 -0.807 -0.801 -0.807 -0.812 -0.824 -0.842 -0.838 -0.851 + -0.863 -0.891 -0.902 -0.905 -0.915 -0.941 -0.961 -0.967 -0.982 -1.008 + -1.042 -1.058 -1.082 -1.111 -1.135 -1.176 -1.206 -1.241 -1.286 -1.325 + + 794 airs_aqua 179 0.330917E-01 + -0.171 -0.178 -0.169 -0.148 -0.140 -0.129 -0.113 -0.106 -0.097 -0.084 + -0.084 -0.083 -0.072 -0.059 -0.064 -0.070 -0.066 -0.056 -0.059 -0.046 + -0.043 -0.049 -0.054 -0.048 -0.055 -0.066 -0.073 -0.064 -0.069 -0.053 + -0.072 -0.080 -0.079 -0.091 -0.093 -0.096 -0.109 -0.108 -0.110 -0.105 + -0.109 -0.113 -0.101 -0.111 -0.126 -0.114 -0.111 -0.116 -0.112 -0.115 + -0.116 -0.109 -0.095 -0.103 -0.095 -0.082 -0.084 -0.082 -0.088 -0.068 + -0.065 -0.060 -0.073 -0.057 -0.053 -0.041 -0.052 -0.053 -0.041 -0.044 + -0.028 -0.040 -0.048 -0.043 -0.033 -0.055 -0.051 -0.047 -0.042 -0.057 + -0.066 -0.071 -0.073 -0.086 -0.089 -0.090 -0.092 -0.105 -0.112 -0.110 + + 795 airs_aqua 180 0.357006E-01 + -0.406 -0.393 -0.379 -0.352 -0.328 -0.315 -0.302 -0.287 -0.273 -0.265 + -0.234 -0.230 -0.220 -0.216 -0.201 -0.200 -0.189 -0.189 -0.179 -0.177 + -0.182 -0.173 -0.173 -0.171 -0.180 -0.186 -0.182 -0.179 -0.184 -0.175 + -0.185 -0.191 -0.186 -0.193 -0.208 -0.192 -0.203 -0.203 -0.201 -0.203 + -0.204 -0.204 -0.211 -0.198 -0.213 -0.210 -0.207 -0.203 -0.202 -0.197 + -0.217 -0.205 -0.200 -0.192 -0.190 -0.186 -0.178 -0.178 -0.192 -0.183 + -0.177 -0.171 -0.180 -0.165 -0.166 -0.162 -0.169 -0.167 -0.165 -0.173 + -0.158 -0.174 -0.177 -0.179 -0.173 -0.181 -0.204 -0.198 -0.203 -0.213 + -0.235 -0.245 -0.250 -0.274 -0.285 -0.292 -0.308 -0.330 -0.342 -0.353 + + 796 airs_aqua 182 0.475957E-03 + -1.980 -1.916 -1.854 -1.792 -1.733 -1.691 -1.643 -1.594 -1.558 -1.521 + -1.485 -1.450 -1.420 -1.396 -1.373 -1.348 -1.330 -1.316 -1.282 -1.260 + -1.250 -1.220 -1.227 -1.201 -1.195 -1.176 -1.173 -1.162 -1.159 -1.154 + -1.136 -1.133 -1.135 -1.121 -1.116 -1.113 -1.111 -1.114 -1.108 -1.097 + -1.100 -1.104 -1.105 -1.102 -1.110 -1.099 -1.091 -1.090 -1.098 -1.109 + -1.105 -1.107 -1.099 -1.105 -1.105 -1.112 -1.108 -1.115 -1.135 -1.125 + -1.132 -1.147 -1.153 -1.151 -1.165 -1.176 -1.186 -1.201 -1.211 -1.226 + -1.230 -1.256 -1.281 -1.293 -1.312 -1.342 -1.372 -1.396 -1.418 -1.459 + -1.488 -1.525 -1.566 -1.608 -1.655 -1.701 -1.754 -1.814 -1.866 -1.938 + + 797 airs_aqua 185 0.322068E-01 + -0.275 -0.271 -0.261 -0.237 -0.221 -0.216 -0.195 -0.187 -0.179 -0.169 + -0.157 -0.151 -0.133 -0.141 -0.133 -0.126 -0.117 -0.123 -0.121 -0.115 + -0.125 -0.117 -0.122 -0.115 -0.118 -0.128 -0.128 -0.121 -0.129 -0.124 + -0.124 -0.144 -0.142 -0.144 -0.149 -0.151 -0.156 -0.148 -0.164 -0.165 + -0.153 -0.164 -0.155 -0.169 -0.168 -0.158 -0.154 -0.160 -0.154 -0.163 + -0.163 -0.157 -0.144 -0.157 -0.137 -0.129 -0.139 -0.138 -0.132 -0.120 + -0.118 -0.116 -0.117 -0.114 -0.099 -0.104 -0.104 -0.104 -0.096 -0.101 + -0.089 -0.104 -0.098 -0.096 -0.094 -0.104 -0.117 -0.112 -0.119 -0.116 + -0.133 -0.137 -0.140 -0.149 -0.162 -0.166 -0.178 -0.183 -0.202 -0.201 + + 798 airs_aqua 186 0.352290E-01 + -0.971 -0.956 -0.935 -0.895 -0.875 -0.849 -0.826 -0.791 -0.776 -0.751 + -0.731 -0.731 -0.708 -0.686 -0.682 -0.669 -0.652 -0.642 -0.632 -0.625 + -0.619 -0.612 -0.617 -0.598 -0.611 -0.612 -0.610 -0.599 -0.595 -0.585 + -0.583 -0.600 -0.605 -0.608 -0.611 -0.609 -0.605 -0.610 -0.610 -0.611 + -0.602 -0.604 -0.606 -0.607 -0.615 -0.609 -0.587 -0.600 -0.604 -0.612 + -0.612 -0.604 -0.597 -0.604 -0.596 -0.582 -0.595 -0.585 -0.605 -0.596 + -0.585 -0.582 -0.603 -0.582 -0.588 -0.589 -0.591 -0.607 -0.602 -0.608 + -0.600 -0.628 -0.631 -0.631 -0.630 -0.651 -0.676 -0.678 -0.682 -0.700 + -0.723 -0.740 -0.760 -0.785 -0.810 -0.824 -0.843 -0.865 -0.881 -0.899 + + 799 airs_aqua 190 0.467780E-01 + 0.363 0.327 0.337 0.345 0.339 0.346 0.354 0.363 0.376 0.379 + 0.398 0.397 0.412 0.423 0.423 0.429 0.431 0.452 0.454 0.461 + 0.458 0.451 0.457 0.450 0.450 0.434 0.438 0.448 0.432 0.446 + 0.440 0.425 0.416 0.410 0.403 0.408 0.401 0.388 0.396 0.384 + 0.402 0.385 0.404 0.396 0.374 0.384 0.388 0.388 0.393 0.394 + 0.398 0.402 0.402 0.395 0.405 0.410 0.421 0.427 0.424 0.429 + 0.430 0.442 0.440 0.453 0.451 0.455 0.449 0.455 0.465 0.463 + 0.459 0.463 0.455 0.448 0.449 0.439 0.439 0.425 0.428 0.417 + 0.401 0.396 0.405 0.378 0.371 0.382 0.375 0.382 0.382 0.409 + + 800 airs_aqua 192 0.453749E-01 + -0.140 -0.161 -0.147 -0.135 -0.136 -0.115 -0.105 -0.092 -0.081 -0.071 + -0.058 -0.042 -0.035 -0.014 -0.013 -0.014 -0.002 0.012 0.012 0.010 + 0.023 0.026 0.008 0.015 0.018 0.001 0.014 0.015 0.000 0.006 + 0.008 0.006 -0.002 -0.008 -0.021 -0.020 -0.025 -0.019 -0.040 -0.032 + -0.026 -0.031 -0.027 -0.029 -0.035 -0.037 -0.027 -0.022 -0.032 -0.026 + -0.034 -0.027 -0.011 -0.015 -0.023 -0.012 0.000 0.005 -0.002 0.007 + 0.011 0.008 0.010 0.025 0.015 0.019 0.017 0.022 0.034 0.024 + 0.029 0.018 0.018 0.008 0.014 0.003 -0.013 -0.026 -0.021 -0.031 + -0.052 -0.058 -0.064 -0.081 -0.095 -0.102 -0.108 -0.112 -0.118 -0.097 + + 801 airs_aqua 198 0.564941E-01 + 0.461 0.406 0.393 0.375 0.358 0.347 0.347 0.348 0.337 0.343 + 0.343 0.341 0.346 0.336 0.345 0.335 0.338 0.334 0.338 0.331 + 0.333 0.331 0.334 0.336 0.320 0.309 0.308 0.325 0.302 0.304 + 0.293 0.279 0.276 0.278 0.266 0.264 0.271 0.257 0.246 0.251 + 0.241 0.251 0.250 0.263 0.234 0.246 0.236 0.240 0.252 0.248 + 0.245 0.257 0.255 0.256 0.269 0.283 0.277 0.289 0.288 0.294 + 0.305 0.310 0.301 0.322 0.315 0.326 0.326 0.331 0.330 0.341 + 0.353 0.341 0.345 0.347 0.357 0.348 0.342 0.352 0.355 0.350 + 0.344 0.346 0.360 0.360 0.365 0.385 0.392 0.412 0.431 0.483 + + 802 airs_aqua 201 0.547073E-01 + 0.909 0.860 0.828 0.836 0.819 0.814 0.821 0.826 0.827 0.830 + 0.841 0.838 0.852 0.860 0.848 0.863 0.859 0.866 0.868 0.870 + 0.875 0.859 0.862 0.860 0.852 0.838 0.842 0.846 0.826 0.840 + 0.837 0.818 0.811 0.809 0.797 0.800 0.794 0.787 0.775 0.776 + 0.775 0.766 0.775 0.790 0.764 0.772 0.768 0.776 0.778 0.780 + 0.764 0.788 0.788 0.797 0.804 0.812 0.806 0.825 0.821 0.825 + 0.836 0.840 0.848 0.850 0.861 0.865 0.856 0.865 0.867 0.867 + 0.894 0.869 0.878 0.877 0.872 0.877 0.855 0.861 0.865 0.860 + 0.842 0.847 0.849 0.844 0.834 0.855 0.851 0.880 0.887 0.946 + + 803 airs_aqua 204 0.588265E-01 + 0.579 0.530 0.494 0.497 0.471 0.449 0.442 0.443 0.428 0.439 + 0.430 0.425 0.421 0.416 0.405 0.393 0.395 0.394 0.386 0.383 + 0.384 0.372 0.369 0.372 0.360 0.341 0.337 0.340 0.324 0.316 + 0.322 0.305 0.307 0.304 0.295 0.294 0.286 0.290 0.270 0.273 + 0.264 0.272 0.251 0.273 0.253 0.254 0.262 0.274 0.271 0.264 + 0.263 0.283 0.268 0.286 0.286 0.298 0.296 0.303 0.307 0.315 + 0.319 0.329 0.321 0.344 0.346 0.352 0.354 0.364 0.360 0.375 + 0.385 0.383 0.398 0.396 0.408 0.410 0.413 0.420 0.431 0.423 + 0.427 0.433 0.453 0.444 0.455 0.480 0.495 0.519 0.528 0.596 + + 804 airs_aqua 207 0.483532E-01 + 0.666 0.624 0.601 0.603 0.595 0.588 0.588 0.603 0.601 0.612 + 0.612 0.618 0.620 0.624 0.639 0.636 0.627 0.635 0.648 0.645 + 0.661 0.644 0.633 0.655 0.638 0.631 0.621 0.644 0.628 0.614 + 0.628 0.609 0.606 0.606 0.601 0.594 0.596 0.606 0.587 0.586 + 0.573 0.584 0.575 0.583 0.563 0.578 0.577 0.571 0.591 0.576 + 0.570 0.565 0.584 0.593 0.587 0.600 0.596 0.594 0.596 0.601 + 0.622 0.627 0.623 0.625 0.623 0.630 0.621 0.627 0.640 0.635 + 0.661 0.639 0.642 0.641 0.637 0.631 0.623 0.621 0.608 0.613 + 0.599 0.595 0.608 0.604 0.600 0.605 0.614 0.624 0.629 0.683 + + 805 airs_aqua 210 0.527041E-01 + 0.286 0.261 0.241 0.248 0.240 0.245 0.249 0.268 0.253 0.267 + 0.271 0.289 0.290 0.296 0.294 0.305 0.315 0.309 0.295 0.307 + 0.311 0.307 0.285 0.312 0.290 0.280 0.262 0.275 0.261 0.271 + 0.270 0.239 0.237 0.251 0.234 0.236 0.214 0.227 0.236 0.228 + 0.219 0.223 0.227 0.215 0.200 0.210 0.221 0.217 0.231 0.221 + 0.209 0.235 0.227 0.232 0.234 0.243 0.245 0.243 0.247 0.253 + 0.270 0.269 0.254 0.270 0.280 0.276 0.280 0.272 0.286 0.297 + 0.306 0.300 0.288 0.286 0.282 0.278 0.275 0.280 0.280 0.267 + 0.253 0.243 0.250 0.242 0.237 0.244 0.239 0.248 0.243 0.288 + + 806 airs_aqua 215 0.589936E-01 + 0.581 0.524 0.470 0.452 0.417 0.389 0.372 0.368 0.355 0.337 + 0.318 0.322 0.325 0.307 0.308 0.302 0.291 0.284 0.273 0.260 + 0.267 0.262 0.257 0.249 0.238 0.243 0.242 0.239 0.239 0.230 + 0.226 0.229 0.222 0.216 0.224 0.207 0.208 0.197 0.214 0.214 + 0.199 0.202 0.208 0.201 0.195 0.200 0.205 0.213 0.222 0.226 + 0.207 0.218 0.205 0.221 0.209 0.220 0.238 0.238 0.234 0.230 + 0.254 0.246 0.243 0.266 0.262 0.278 0.274 0.274 0.273 0.286 + 0.288 0.292 0.285 0.310 0.312 0.317 0.317 0.334 0.329 0.339 + 0.348 0.343 0.376 0.387 0.399 0.427 0.446 0.496 0.522 0.588 + + 807 airs_aqua 216 0.478462E-01 + -1.446 -1.450 -1.437 -1.404 -1.365 -1.354 -1.322 -1.254 -1.266 -1.238 + -1.205 -1.185 -1.154 -1.141 -1.133 -1.101 -1.107 -1.080 -1.073 -1.049 + -1.024 -1.025 -1.020 -1.023 -1.031 -1.044 -1.056 -1.008 -1.021 -0.997 + -1.016 -1.002 -1.021 -1.003 -1.047 -1.030 -1.072 -1.032 -1.017 -1.008 + -1.016 -1.030 -1.026 -1.002 -1.046 -1.011 -1.009 -1.018 -0.985 -1.013 + -1.035 -1.000 -1.018 -1.026 -1.008 -1.006 -1.039 -1.004 -0.986 -1.024 + -1.021 -0.982 -1.021 -1.026 -1.042 -1.013 -1.047 -1.051 -1.044 -1.056 + -1.011 -1.057 -1.077 -1.084 -1.095 -1.132 -1.134 -1.159 -1.169 -1.184 + -1.240 -1.274 -1.287 -1.301 -1.353 -1.353 -1.406 -1.410 -1.443 -1.445 + + 808 airs_aqua 221 0.532392E-01 + 1.006 0.948 0.909 0.886 0.848 0.829 0.799 0.795 0.787 0.776 + 0.769 0.767 0.766 0.752 0.738 0.749 0.740 0.745 0.726 0.709 + 0.732 0.713 0.698 0.704 0.698 0.694 0.685 0.676 0.662 0.671 + 0.664 0.659 0.647 0.652 0.643 0.640 0.635 0.621 0.653 0.641 + 0.618 0.609 0.635 0.635 0.600 0.615 0.636 0.629 0.642 0.630 + 0.615 0.648 0.630 0.635 0.637 0.642 0.657 0.659 0.664 0.657 + 0.679 0.681 0.664 0.685 0.685 0.695 0.688 0.693 0.710 0.708 + 0.704 0.727 0.740 0.746 0.727 0.753 0.736 0.729 0.751 0.762 + 0.760 0.775 0.789 0.797 0.811 0.826 0.866 0.911 0.930 0.989 + + 809 airs_aqua 226 0.485475E-01 + 1.259 1.191 1.142 1.119 1.060 1.037 1.005 0.992 0.981 0.962 + 0.943 0.945 0.916 0.916 0.891 0.896 0.893 0.885 0.869 0.841 + 0.858 0.854 0.830 0.843 0.822 0.827 0.811 0.807 0.788 0.785 + 0.774 0.800 0.771 0.781 0.772 0.760 0.769 0.752 0.782 0.778 + 0.762 0.746 0.760 0.758 0.744 0.754 0.777 0.758 0.774 0.766 + 0.761 0.791 0.782 0.771 0.795 0.793 0.805 0.803 0.813 0.805 + 0.810 0.812 0.834 0.842 0.827 0.860 0.840 0.847 0.862 0.873 + 0.882 0.901 0.896 0.924 0.923 0.947 0.930 0.941 0.949 0.969 + 0.987 0.993 1.027 1.039 1.067 1.093 1.119 1.181 1.203 1.282 + + 810 airs_aqua 227 0.509442E-01 + 1.152 1.088 1.044 1.024 0.980 0.944 0.920 0.909 0.885 0.862 + 0.847 0.834 0.828 0.805 0.793 0.777 0.767 0.760 0.735 0.726 + 0.735 0.705 0.688 0.695 0.673 0.671 0.669 0.660 0.633 0.654 + 0.646 0.651 0.629 0.629 0.627 0.614 0.602 0.594 0.612 0.619 + 0.598 0.598 0.605 0.620 0.589 0.597 0.619 0.601 0.615 0.606 + 0.589 0.613 0.594 0.616 0.619 0.626 0.621 0.630 0.619 0.625 + 0.648 0.632 0.638 0.671 0.651 0.683 0.669 0.682 0.688 0.703 + 0.712 0.727 0.735 0.750 0.749 0.776 0.778 0.792 0.808 0.823 + 0.832 0.854 0.867 0.901 0.918 0.941 0.984 1.029 1.059 1.128 + + 811 airs_aqua 232 0.460467E-01 + 1.440 1.370 1.334 1.304 1.245 1.220 1.198 1.180 1.162 1.138 + 1.117 1.120 1.107 1.077 1.070 1.067 1.061 1.047 1.035 1.004 + 1.036 1.003 0.986 0.991 0.973 0.962 0.951 0.940 0.929 0.930 + 0.923 0.937 0.896 0.911 0.902 0.900 0.887 0.879 0.926 0.914 + 0.861 0.879 0.901 0.898 0.871 0.890 0.908 0.880 0.895 0.890 + 0.887 0.901 0.889 0.896 0.921 0.901 0.926 0.932 0.930 0.934 + 0.935 0.957 0.954 0.990 0.968 1.000 0.979 0.985 1.001 1.015 + 1.014 1.050 1.045 1.074 1.056 1.070 1.090 1.102 1.098 1.131 + 1.142 1.142 1.171 1.199 1.207 1.247 1.291 1.342 1.349 1.442 + + 812 airs_aqua 252 0.490315E-01 + 0.182 0.140 0.129 0.115 0.078 0.076 0.061 0.046 0.056 0.047 + 0.032 0.037 0.036 0.034 0.024 0.024 0.021 0.006 -0.004 -0.026 + 0.000 -0.023 -0.037 -0.032 -0.042 -0.036 -0.056 -0.056 -0.081 -0.080 + -0.086 -0.080 -0.105 -0.104 -0.107 -0.120 -0.117 -0.129 -0.093 -0.110 + -0.126 -0.137 -0.120 -0.133 -0.134 -0.126 -0.093 -0.130 -0.117 -0.119 + -0.109 -0.099 -0.111 -0.101 -0.108 -0.093 -0.076 -0.067 -0.078 -0.074 + -0.063 -0.048 -0.046 -0.014 -0.037 -0.004 -0.014 -0.016 -0.009 0.001 + 0.004 0.022 0.023 0.045 0.052 0.047 0.042 0.052 0.056 0.067 + 0.071 0.069 0.081 0.095 0.093 0.112 0.136 0.153 0.146 0.203 + + 813 airs_aqua 253 0.484667E-01 + 0.072 0.027 0.016 -0.003 -0.041 -0.048 -0.057 -0.066 -0.061 -0.077 + -0.096 -0.087 -0.097 -0.104 -0.118 -0.129 -0.105 -0.143 -0.140 -0.160 + -0.156 -0.166 -0.177 -0.177 -0.191 -0.193 -0.221 -0.213 -0.237 -0.239 + -0.250 -0.240 -0.277 -0.260 -0.272 -0.272 -0.288 -0.308 -0.271 -0.284 + -0.302 -0.304 -0.299 -0.302 -0.320 -0.318 -0.287 -0.324 -0.304 -0.302 + -0.302 -0.280 -0.303 -0.291 -0.281 -0.279 -0.261 -0.259 -0.263 -0.256 + -0.246 -0.231 -0.240 -0.210 -0.219 -0.205 -0.213 -0.217 -0.192 -0.181 + -0.190 -0.159 -0.153 -0.149 -0.148 -0.127 -0.148 -0.128 -0.127 -0.118 + -0.105 -0.113 -0.097 -0.090 -0.077 -0.063 -0.037 -0.012 -0.008 0.047 + + 814 airs_aqua 256 0.363621E-01 + 1.063 1.006 0.994 0.978 0.931 0.912 0.900 0.887 0.884 0.866 + 0.840 0.849 0.834 0.820 0.798 0.796 0.792 0.778 0.766 0.738 + 0.751 0.724 0.696 0.716 0.680 0.687 0.657 0.655 0.639 0.636 + 0.615 0.636 0.608 0.600 0.588 0.584 0.575 0.557 0.609 0.588 + 0.563 0.560 0.597 0.566 0.568 0.546 0.598 0.565 0.578 0.565 + 0.585 0.604 0.583 0.588 0.609 0.607 0.626 0.642 0.638 0.640 + 0.648 0.670 0.654 0.708 0.674 0.703 0.700 0.701 0.726 0.742 + 0.748 0.778 0.772 0.797 0.800 0.816 0.807 0.835 0.818 0.860 + 0.864 0.870 0.867 0.896 0.910 0.924 0.967 0.996 0.968 1.051 + + 815 airs_aqua 257 0.355197E-01 + 0.910 0.851 0.843 0.828 0.781 0.781 0.753 0.740 0.737 0.711 + 0.695 0.705 0.688 0.676 0.661 0.658 0.649 0.638 0.624 0.597 + 0.616 0.591 0.572 0.571 0.556 0.560 0.538 0.538 0.508 0.514 + 0.498 0.508 0.484 0.483 0.479 0.465 0.467 0.449 0.488 0.482 + 0.452 0.438 0.455 0.452 0.454 0.441 0.494 0.443 0.460 0.456 + 0.479 0.481 0.460 0.483 0.474 0.495 0.501 0.512 0.507 0.510 + 0.517 0.538 0.531 0.573 0.542 0.573 0.568 0.568 0.590 0.604 + 0.596 0.631 0.620 0.644 0.647 0.662 0.660 0.676 0.667 0.691 + 0.705 0.714 0.720 0.737 0.758 0.765 0.807 0.837 0.812 0.898 + + 816 airs_aqua 261 0.399457E-01 + 1.287 1.226 1.212 1.207 1.136 1.124 1.100 1.083 1.083 1.058 + 1.020 1.019 1.005 0.987 0.966 0.958 0.963 0.932 0.903 0.872 + 0.902 0.865 0.849 0.854 0.831 0.835 0.802 0.807 0.787 0.794 + 0.770 0.803 0.763 0.767 0.762 0.749 0.752 0.721 0.782 0.757 + 0.737 0.724 0.761 0.742 0.737 0.737 0.782 0.740 0.757 0.737 + 0.752 0.777 0.748 0.774 0.758 0.775 0.784 0.795 0.788 0.786 + 0.801 0.816 0.812 0.854 0.821 0.862 0.859 0.849 0.863 0.894 + 0.890 0.926 0.932 0.955 0.963 0.972 0.970 0.992 1.000 1.025 + 1.042 1.057 1.069 1.113 1.117 1.137 1.194 1.209 1.189 1.278 + + 817 airs_aqua 262 0.428321E-01 + 1.041 0.992 0.976 0.964 0.919 0.900 0.876 0.862 0.855 0.835 + 0.806 0.809 0.799 0.776 0.757 0.748 0.755 0.725 0.719 0.682 + 0.708 0.660 0.668 0.683 0.646 0.656 0.618 0.628 0.609 0.608 + 0.594 0.620 0.568 0.594 0.574 0.572 0.573 0.548 0.601 0.590 + 0.560 0.548 0.584 0.565 0.560 0.557 0.600 0.557 0.580 0.561 + 0.572 0.594 0.565 0.583 0.590 0.581 0.597 0.609 0.595 0.608 + 0.606 0.624 0.626 0.652 0.619 0.659 0.660 0.641 0.658 0.691 + 0.679 0.720 0.714 0.744 0.735 0.752 0.747 0.773 0.774 0.783 + 0.810 0.812 0.829 0.857 0.876 0.889 0.938 0.965 0.938 1.023 + + 818 airs_aqua 267 0.425316E-01 + 1.002 0.937 0.929 0.905 0.849 0.840 0.802 0.795 0.791 0.762 + 0.732 0.736 0.739 0.705 0.680 0.678 0.678 0.657 0.633 0.612 + 0.623 0.596 0.573 0.582 0.555 0.565 0.538 0.540 0.526 0.516 + 0.495 0.526 0.480 0.504 0.481 0.482 0.484 0.462 0.505 0.485 + 0.460 0.466 0.485 0.461 0.458 0.469 0.503 0.463 0.470 0.465 + 0.488 0.497 0.483 0.494 0.490 0.488 0.500 0.527 0.509 0.509 + 0.532 0.531 0.534 0.577 0.541 0.575 0.569 0.573 0.595 0.606 + 0.602 0.639 0.631 0.654 0.663 0.674 0.677 0.705 0.701 0.720 + 0.740 0.754 0.771 0.804 0.811 0.823 0.875 0.903 0.882 0.979 + + 819 airs_aqua 272 0.417364E-01 + 0.892 0.832 0.826 0.797 0.744 0.736 0.700 0.689 0.685 0.658 + 0.623 0.625 0.604 0.588 0.574 0.564 0.554 0.541 0.513 0.488 + 0.504 0.466 0.451 0.466 0.430 0.451 0.419 0.412 0.389 0.391 + 0.382 0.398 0.363 0.383 0.374 0.358 0.363 0.345 0.385 0.379 + 0.337 0.349 0.369 0.353 0.341 0.352 0.389 0.345 0.373 0.354 + 0.372 0.383 0.368 0.374 0.377 0.381 0.377 0.410 0.388 0.396 + 0.410 0.424 0.416 0.449 0.415 0.462 0.456 0.441 0.458 0.484 + 0.468 0.506 0.519 0.542 0.538 0.554 0.557 0.594 0.585 0.598 + 0.628 0.650 0.664 0.698 0.714 0.723 0.775 0.804 0.774 0.863 + + 820 airs_aqua 295 0.449673E-01 + 0.534 0.469 0.475 0.467 0.411 0.400 0.378 0.370 0.377 0.351 + 0.318 0.338 0.332 0.316 0.281 0.281 0.277 0.269 0.250 0.243 + 0.243 0.215 0.212 0.219 0.202 0.191 0.187 0.174 0.179 0.165 + 0.157 0.171 0.157 0.175 0.157 0.138 0.124 0.111 0.177 0.151 + 0.126 0.116 0.162 0.151 0.142 0.139 0.186 0.137 0.142 0.132 + 0.143 0.175 0.155 0.168 0.161 0.165 0.161 0.188 0.177 0.163 + 0.177 0.203 0.188 0.205 0.198 0.228 0.215 0.207 0.221 0.244 + 0.228 0.262 0.260 0.278 0.278 0.296 0.295 0.301 0.295 0.313 + 0.339 0.331 0.346 0.378 0.390 0.396 0.439 0.469 0.444 0.521 + + 821 airs_aqua 299 0.445729E-01 + 0.540 0.497 0.481 0.474 0.434 0.427 0.404 0.394 0.402 0.382 + 0.359 0.362 0.353 0.347 0.317 0.327 0.332 0.299 0.299 0.276 + 0.288 0.266 0.253 0.273 0.244 0.250 0.232 0.220 0.218 0.221 + 0.184 0.213 0.190 0.200 0.182 0.169 0.174 0.152 0.210 0.192 + 0.184 0.159 0.194 0.176 0.162 0.176 0.199 0.179 0.191 0.174 + 0.183 0.207 0.191 0.202 0.199 0.205 0.221 0.228 0.208 0.221 + 0.233 0.239 0.242 0.271 0.236 0.282 0.277 0.259 0.274 0.295 + 0.281 0.313 0.311 0.341 0.320 0.348 0.340 0.359 0.361 0.370 + 0.384 0.388 0.391 0.423 0.430 0.436 0.475 0.484 0.464 0.535 + + 822 airs_aqua 300 0.442708E-01 + 0.210 0.258 0.374 0.387 0.328 0.444 0.381 0.356 0.373 0.446 + 0.385 0.344 0.305 0.384 0.361 0.337 0.351 0.335 0.334 0.348 + 0.267 0.224 0.253 0.331 0.298 0.279 0.211 0.216 0.265 0.179 + 0.167 0.202 0.128 0.241 0.193 0.161 0.149 0.158 0.187 0.207 + 0.217 0.186 0.208 0.156 0.197 0.186 0.281 0.237 0.124 0.201 + 0.247 0.183 0.203 0.244 0.246 0.180 0.241 0.178 0.127 0.195 + 0.256 0.233 0.268 0.274 0.247 0.252 0.246 0.242 0.353 0.275 + 0.293 0.289 0.322 0.396 0.377 0.315 0.377 0.312 0.340 0.373 + 0.324 0.341 0.344 0.344 0.346 0.344 0.312 0.341 0.242 0.233 + + 823 airs_aqua 305 0.442288E-01 + 0.424 0.363 0.354 0.350 0.297 0.279 0.267 0.249 0.244 0.240 + 0.210 0.207 0.205 0.176 0.178 0.162 0.176 0.141 0.118 0.102 + 0.115 0.075 0.082 0.092 0.065 0.070 0.055 0.056 0.047 0.023 + 0.004 0.022 0.014 -0.008 0.009 -0.006 -0.008 -0.012 0.026 0.019 + -0.014 -0.026 0.011 0.007 -0.009 -0.004 0.029 -0.002 0.003 -0.014 + 0.012 0.025 0.000 0.035 0.027 0.037 0.044 0.043 0.031 0.052 + 0.055 0.061 0.048 0.091 0.060 0.102 0.087 0.078 0.114 0.116 + 0.114 0.145 0.142 0.175 0.161 0.177 0.166 0.194 0.201 0.218 + 0.225 0.239 0.247 0.263 0.284 0.301 0.326 0.355 0.341 0.412 + + 824 airs_aqua 310 0.465641E-01 + 0.399 0.338 0.328 0.325 0.274 0.256 0.233 0.227 0.232 0.212 + 0.190 0.195 0.173 0.171 0.138 0.139 0.153 0.114 0.106 0.080 + 0.094 0.078 0.056 0.065 0.052 0.070 0.032 0.032 0.010 0.006 + -0.019 0.006 -0.015 -0.013 -0.016 -0.042 -0.023 -0.046 0.010 -0.019 + -0.041 -0.048 -0.023 -0.026 -0.026 -0.028 0.001 -0.029 -0.002 -0.040 + -0.021 0.006 -0.002 -0.001 -0.002 0.005 0.021 0.032 0.019 0.029 + 0.019 0.043 0.035 0.055 0.046 0.073 0.078 0.055 0.083 0.098 + 0.091 0.128 0.106 0.137 0.131 0.156 0.151 0.161 0.171 0.196 + 0.207 0.216 0.227 0.242 0.252 0.254 0.292 0.335 0.308 0.381 + + 825 airs_aqua 321 0.474605E-01 + 0.084 0.046 0.046 0.025 0.022 0.009 -0.003 -0.028 -0.056 -0.064 + -0.038 -0.068 -0.087 -0.073 -0.090 -0.078 -0.083 -0.102 -0.107 -0.128 + -0.117 -0.099 -0.109 -0.118 -0.111 -0.133 -0.129 -0.127 -0.118 -0.133 + -0.151 -0.166 -0.160 -0.145 -0.135 -0.163 -0.128 -0.138 -0.134 -0.134 + -0.144 -0.151 -0.127 -0.134 -0.157 -0.167 -0.154 -0.172 -0.125 -0.135 + -0.153 -0.132 -0.118 -0.127 -0.120 -0.149 -0.124 -0.125 -0.133 -0.137 + -0.155 -0.129 -0.130 -0.129 -0.149 -0.099 -0.124 -0.140 -0.109 -0.132 + -0.106 -0.131 -0.147 -0.128 -0.101 -0.075 -0.105 -0.083 -0.093 -0.063 + -0.069 -0.063 -0.042 -0.037 -0.031 -0.019 0.015 0.036 0.027 0.047 + + 826 airs_aqua 325 0.389081E-01 + 0.735 0.682 0.699 0.696 0.641 0.658 0.628 0.632 0.629 0.611 + 0.577 0.608 0.591 0.585 0.561 0.560 0.560 0.540 0.547 0.509 + 0.537 0.498 0.478 0.485 0.463 0.474 0.439 0.440 0.430 0.435 + 0.416 0.443 0.405 0.433 0.427 0.395 0.387 0.380 0.433 0.406 + 0.391 0.378 0.410 0.398 0.380 0.384 0.421 0.380 0.416 0.377 + 0.400 0.415 0.398 0.422 0.416 0.415 0.424 0.444 0.437 0.432 + 0.431 0.447 0.439 0.461 0.435 0.477 0.482 0.474 0.490 0.498 + 0.508 0.516 0.524 0.538 0.543 0.545 0.541 0.555 0.557 0.573 + 0.579 0.583 0.586 0.621 0.626 0.621 0.663 0.676 0.627 0.709 + + 827 airs_aqua 333 0.296473E-01 + 0.955 0.885 0.942 0.923 0.853 0.883 0.848 0.838 0.832 0.812 + 0.777 0.791 0.771 0.733 0.728 0.720 0.719 0.668 0.658 0.630 + 0.660 0.603 0.580 0.610 0.555 0.569 0.535 0.525 0.524 0.510 + 0.473 0.517 0.471 0.498 0.481 0.464 0.462 0.436 0.492 0.474 + 0.444 0.439 0.457 0.443 0.450 0.456 0.507 0.448 0.462 0.453 + 0.486 0.508 0.471 0.499 0.505 0.497 0.528 0.532 0.518 0.532 + 0.533 0.567 0.557 0.600 0.568 0.602 0.625 0.601 0.636 0.661 + 0.636 0.693 0.693 0.722 0.730 0.746 0.738 0.777 0.767 0.787 + 0.819 0.831 0.822 0.872 0.894 0.873 0.945 0.930 0.840 0.953 + + 828 airs_aqua 338 0.286442E-01 + 0.801 0.743 0.810 0.799 0.726 0.769 0.731 0.710 0.724 0.702 + 0.664 0.679 0.653 0.618 0.607 0.602 0.609 0.570 0.537 0.510 + 0.524 0.484 0.460 0.486 0.438 0.460 0.408 0.405 0.403 0.376 + 0.337 0.383 0.352 0.374 0.363 0.316 0.345 0.318 0.373 0.346 + 0.308 0.316 0.361 0.325 0.322 0.325 0.362 0.313 0.346 0.327 + 0.372 0.372 0.341 0.375 0.382 0.372 0.409 0.403 0.393 0.409 + 0.419 0.434 0.435 0.477 0.441 0.479 0.484 0.474 0.513 0.530 + 0.506 0.569 0.581 0.613 0.611 0.619 0.613 0.672 0.650 0.672 + 0.695 0.718 0.699 0.757 0.778 0.740 0.814 0.799 0.683 0.799 + + 829 airs_aqua 355 0.397777E-01 + 0.769 0.713 0.749 0.722 0.668 0.686 0.646 0.661 0.640 0.612 + 0.576 0.570 0.554 0.531 0.509 0.498 0.500 0.484 0.467 0.441 + 0.451 0.409 0.399 0.401 0.368 0.379 0.371 0.362 0.355 0.358 + 0.333 0.368 0.342 0.366 0.345 0.335 0.314 0.315 0.365 0.358 + 0.333 0.338 0.348 0.335 0.327 0.340 0.368 0.335 0.354 0.332 + 0.354 0.359 0.325 0.354 0.353 0.360 0.370 0.382 0.380 0.379 + 0.385 0.390 0.417 0.428 0.396 0.440 0.429 0.421 0.446 0.475 + 0.467 0.498 0.517 0.537 0.535 0.558 0.555 0.586 0.597 0.610 + 0.640 0.648 0.668 0.710 0.714 0.722 0.763 0.777 0.703 0.795 + + 830 airs_aqua 362 0.252127E-01 + 1.125 1.054 1.131 1.125 1.045 1.087 1.055 1.042 1.047 1.027 + 0.966 0.986 0.963 0.929 0.908 0.892 0.905 0.853 0.823 0.799 + 0.826 0.779 0.741 0.763 0.715 0.732 0.688 0.686 0.664 0.669 + 0.611 0.679 0.620 0.647 0.626 0.604 0.608 0.580 0.648 0.615 + 0.582 0.587 0.612 0.589 0.599 0.591 0.645 0.592 0.605 0.598 + 0.641 0.645 0.622 0.656 0.651 0.654 0.667 0.685 0.665 0.682 + 0.680 0.706 0.712 0.752 0.710 0.758 0.782 0.749 0.790 0.821 + 0.807 0.867 0.882 0.901 0.908 0.918 0.919 0.958 0.958 0.975 + 1.005 1.028 1.014 1.078 1.093 1.057 1.133 1.117 0.989 1.117 + + 831 airs_aqua 375 0.160952E-01 + 0.754 0.681 0.800 0.783 0.705 0.749 0.720 0.696 0.707 0.684 + 0.622 0.661 0.634 0.596 0.570 0.564 0.578 0.506 0.480 0.468 + 0.505 0.429 0.407 0.450 0.385 0.410 0.376 0.364 0.353 0.337 + 0.305 0.353 0.310 0.335 0.311 0.301 0.303 0.271 0.337 0.323 + 0.309 0.281 0.321 0.293 0.317 0.315 0.356 0.313 0.310 0.288 + 0.348 0.365 0.316 0.361 0.337 0.341 0.377 0.378 0.353 0.384 + 0.376 0.405 0.383 0.446 0.399 0.440 0.471 0.444 0.465 0.495 + 0.487 0.555 0.559 0.570 0.596 0.591 0.577 0.650 0.629 0.633 + 0.686 0.708 0.689 0.753 0.790 0.726 0.825 0.789 0.624 0.768 + + 832 airs_aqua 453 0.156662E-01 + 1.898 0.839 0.878 0.736 0.193 0.381 0.232 0.157 0.291 0.198 + -0.140 -0.015 -0.168 -0.038 -0.040 -0.203 -0.168 -0.208 -0.178 -0.376 + -0.352 -0.407 -0.570 -0.388 -0.593 -0.376 -0.478 -0.584 -0.511 -0.528 + -0.599 -0.477 -0.510 -0.619 -0.444 -0.467 -0.487 -0.515 -0.462 -0.584 + -0.658 -0.441 -0.608 -0.601 -0.584 -0.582 -0.519 -0.580 -0.561 -0.659 + -0.463 -0.521 -0.555 -0.520 -0.498 -0.446 -0.408 -0.529 -0.563 -0.444 + -0.449 -0.410 -0.296 -0.395 -0.319 -0.345 -0.397 -0.393 -0.246 -0.224 + -0.494 -0.330 -0.105 -0.054 -0.176 -0.127 -0.306 -0.009 0.030 -0.078 + 0.271 0.343 0.283 0.476 0.548 0.441 0.788 0.887 0.675 1.869 + + 833 airs_aqua 475 0.126475E-01 + 0.009 -0.054 0.112 0.110 0.060 0.132 0.095 0.093 0.110 0.115 + 0.067 0.117 0.107 0.071 0.065 0.061 0.085 0.004 0.004 -0.001 + 0.043 -0.029 -0.053 0.006 -0.061 -0.024 -0.059 -0.054 -0.070 -0.077 + -0.099 -0.053 -0.073 -0.037 -0.070 -0.079 -0.068 -0.108 -0.038 -0.055 + -0.067 -0.102 -0.046 -0.087 -0.047 -0.049 0.002 -0.045 -0.056 -0.066 + -0.025 -0.012 -0.039 0.000 -0.027 -0.032 0.016 -0.006 -0.014 0.017 + 0.006 0.012 0.015 0.056 0.019 0.044 0.081 0.032 0.055 0.084 + 0.067 0.138 0.142 0.147 0.158 0.140 0.131 0.188 0.157 0.160 + 0.202 0.219 0.177 0.239 0.253 0.169 0.262 0.188 -0.020 0.106 + + 834 airs_aqua 484 0.141339E-01 + 0.049 -0.014 0.149 0.143 0.081 0.159 0.146 0.132 0.157 0.155 + 0.124 0.171 0.139 0.118 0.086 0.094 0.119 0.035 0.031 0.023 + 0.076 -0.010 -0.014 0.046 -0.028 0.001 -0.024 -0.031 -0.035 -0.036 + -0.057 -0.010 -0.058 -0.020 -0.045 -0.056 -0.043 -0.066 -0.018 -0.026 + -0.054 -0.063 -0.026 -0.061 -0.020 -0.045 0.008 -0.033 -0.042 -0.046 + 0.005 0.010 -0.021 0.024 -0.003 -0.004 0.040 0.023 -0.008 0.044 + 0.032 0.039 0.034 0.075 0.032 0.076 0.088 0.057 0.069 0.108 + 0.084 0.151 0.154 0.157 0.166 0.162 0.139 0.207 0.172 0.174 + 0.210 0.224 0.188 0.243 0.256 0.171 0.258 0.195 -0.013 0.116 + + 835 airs_aqua 497 0.133332E-01 + -0.137 -0.197 -0.022 -0.024 -0.064 0.006 -0.009 0.001 0.019 0.026 + -0.018 0.036 0.023 -0.006 -0.012 -0.001 0.014 -0.050 -0.057 -0.075 + -0.014 -0.096 -0.102 -0.055 -0.117 -0.082 -0.113 -0.103 -0.107 -0.128 + -0.151 -0.097 -0.112 -0.084 -0.121 -0.129 -0.125 -0.138 -0.083 -0.102 + -0.120 -0.149 -0.098 -0.128 -0.097 -0.112 -0.052 -0.104 -0.117 -0.115 + -0.074 -0.068 -0.107 -0.068 -0.091 -0.083 -0.049 -0.063 -0.094 -0.054 + -0.066 -0.050 -0.066 -0.022 -0.071 -0.034 -0.008 -0.058 -0.025 0.006 + -0.025 0.035 0.038 0.024 0.041 0.019 0.012 0.061 0.039 0.021 + 0.049 0.063 0.023 0.072 0.082 -0.001 0.075 0.002 -0.206 -0.089 + + 836 airs_aqua 528 0.102044E-01 + -0.113 -0.177 -0.004 0.001 -0.043 0.034 -0.002 -0.003 0.023 0.020 + -0.021 0.053 0.004 -0.014 -0.030 -0.009 0.007 -0.059 -0.076 -0.090 + -0.027 -0.096 -0.134 -0.059 -0.126 -0.091 -0.126 -0.124 -0.132 -0.143 + -0.173 -0.136 -0.144 -0.120 -0.151 -0.151 -0.146 -0.194 -0.125 -0.134 + -0.147 -0.184 -0.137 -0.166 -0.110 -0.128 -0.100 -0.126 -0.150 -0.157 + -0.106 -0.123 -0.132 -0.098 -0.127 -0.114 -0.078 -0.086 -0.123 -0.089 + -0.099 -0.088 -0.104 -0.051 -0.094 -0.060 -0.025 -0.078 -0.060 -0.044 + -0.059 0.020 0.018 -0.008 0.022 0.011 -0.014 0.048 0.012 0.001 + 0.049 0.062 0.003 0.062 0.081 0.005 0.090 0.019 -0.210 -0.078 + + 837 airs_aqua 587 0.946100E-02 + -0.759 -0.790 -0.593 -0.574 -0.591 -0.507 -0.514 -0.497 -0.469 -0.428 + -0.482 -0.397 -0.413 -0.423 -0.422 -0.411 -0.397 -0.464 -0.453 -0.450 + -0.394 -0.468 -0.486 -0.414 -0.473 -0.439 -0.461 -0.480 -0.454 -0.479 + -0.501 -0.450 -0.464 -0.423 -0.451 -0.471 -0.449 -0.500 -0.435 -0.435 + -0.451 -0.473 -0.425 -0.469 -0.416 -0.427 -0.390 -0.435 -0.457 -0.459 + -0.412 -0.418 -0.445 -0.416 -0.423 -0.439 -0.395 -0.426 -0.452 -0.411 + -0.421 -0.422 -0.438 -0.405 -0.436 -0.407 -0.384 -0.429 -0.422 -0.416 + -0.443 -0.376 -0.377 -0.397 -0.377 -0.409 -0.442 -0.385 -0.428 -0.462 + -0.425 -0.423 -0.492 -0.447 -0.452 -0.556 -0.491 -0.589 -0.836 -0.730 + + 838 airs_aqua 672 0.225425E-01 + 0.186 0.167 0.314 0.319 0.284 0.367 0.346 0.357 0.376 0.373 + 0.340 0.381 0.347 0.324 0.326 0.321 0.350 0.297 0.291 0.253 + 0.293 0.241 0.225 0.254 0.234 0.221 0.196 0.202 0.182 0.196 + 0.147 0.211 0.160 0.200 0.192 0.147 0.151 0.134 0.173 0.182 + 0.141 0.147 0.170 0.138 0.160 0.159 0.197 0.131 0.180 0.134 + 0.184 0.176 0.172 0.175 0.192 0.187 0.195 0.214 0.178 0.183 + 0.190 0.208 0.223 0.231 0.176 0.243 0.241 0.208 0.254 0.261 + 0.242 0.286 0.303 0.320 0.322 0.322 0.281 0.313 0.310 0.305 + 0.323 0.324 0.279 0.333 0.333 0.257 0.314 0.238 0.048 0.151 + + 839 airs_aqua 787 0.752195E-02 + -0.804 -0.825 -0.621 -0.596 -0.602 -0.508 -0.511 -0.500 -0.456 -0.430 + -0.467 -0.387 -0.397 -0.411 -0.410 -0.395 -0.377 -0.444 -0.425 -0.435 + -0.379 -0.459 -0.451 -0.400 -0.461 -0.414 -0.445 -0.451 -0.435 -0.459 + -0.475 -0.437 -0.447 -0.422 -0.438 -0.447 -0.439 -0.483 -0.415 -0.417 + -0.446 -0.473 -0.428 -0.460 -0.411 -0.424 -0.392 -0.423 -0.452 -0.457 + -0.411 -0.425 -0.451 -0.412 -0.435 -0.442 -0.389 -0.428 -0.459 -0.421 + -0.428 -0.435 -0.459 -0.409 -0.454 -0.429 -0.405 -0.448 -0.447 -0.441 + -0.471 -0.404 -0.416 -0.439 -0.431 -0.457 -0.491 -0.443 -0.486 -0.528 + -0.497 -0.495 -0.568 -0.546 -0.545 -0.651 -0.600 -0.707 -0.945 -0.862 + + 840 airs_aqua 791 0.988161E-02 + -0.635 -0.661 -0.471 -0.453 -0.466 -0.373 -0.377 -0.369 -0.337 -0.314 + -0.352 -0.283 -0.296 -0.314 -0.314 -0.309 -0.290 -0.360 -0.344 -0.360 + -0.311 -0.379 -0.386 -0.336 -0.391 -0.359 -0.381 -0.386 -0.388 -0.405 + -0.427 -0.385 -0.393 -0.372 -0.394 -0.404 -0.402 -0.439 -0.380 -0.381 + -0.410 -0.427 -0.394 -0.421 -0.378 -0.393 -0.367 -0.394 -0.410 -0.426 + -0.375 -0.388 -0.405 -0.376 -0.392 -0.401 -0.351 -0.380 -0.413 -0.364 + -0.376 -0.379 -0.395 -0.356 -0.394 -0.360 -0.336 -0.376 -0.376 -0.363 + -0.390 -0.330 -0.330 -0.342 -0.333 -0.354 -0.383 -0.331 -0.369 -0.402 + -0.372 -0.365 -0.431 -0.405 -0.402 -0.497 -0.442 -0.540 -0.768 -0.680 + + 841 airs_aqua 843 0.709312E-02 + 0.020 -0.022 0.155 0.155 0.129 0.200 0.182 0.182 0.212 0.219 + 0.172 0.242 0.222 0.203 0.187 0.194 0.204 0.132 0.139 0.133 + 0.180 0.095 0.089 0.134 0.074 0.119 0.083 0.076 0.082 0.062 + 0.033 0.073 0.064 0.086 0.073 0.053 0.055 0.017 0.076 0.080 + 0.051 0.024 0.071 0.033 0.082 0.074 0.105 0.076 0.048 0.044 + 0.096 0.080 0.046 0.083 0.069 0.067 0.122 0.084 0.063 0.098 + 0.099 0.091 0.077 0.136 0.092 0.120 0.152 0.111 0.121 0.136 + 0.110 0.182 0.184 0.169 0.181 0.166 0.143 0.199 0.163 0.135 + 0.180 0.201 0.135 0.174 0.186 0.112 0.177 0.093 -0.117 -0.008 + + 842 airs_aqua 870 0.204433E-01 + 0.274 0.246 0.375 0.385 0.340 0.416 0.401 0.393 0.417 0.416 + 0.374 0.407 0.390 0.366 0.357 0.351 0.368 0.320 0.309 0.271 + 0.311 0.267 0.240 0.273 0.236 0.248 0.221 0.214 0.198 0.203 + 0.163 0.213 0.180 0.208 0.194 0.165 0.167 0.145 0.201 0.198 + 0.164 0.167 0.188 0.160 0.177 0.172 0.206 0.154 0.191 0.149 + 0.194 0.192 0.187 0.197 0.212 0.194 0.217 0.224 0.195 0.214 + 0.214 0.227 0.235 0.251 0.217 0.268 0.281 0.248 0.280 0.288 + 0.270 0.319 0.335 0.351 0.359 0.358 0.328 0.377 0.362 0.360 + 0.391 0.394 0.359 0.405 0.414 0.338 0.408 0.345 0.164 0.258 + + 843 airs_aqua 914 0.677307E-02 + 0.053 0.015 0.186 0.181 0.155 0.221 0.205 0.207 0.226 0.239 + 0.200 0.264 0.243 0.212 0.206 0.205 0.222 0.140 0.155 0.140 + 0.184 0.103 0.096 0.140 0.086 0.123 0.092 0.080 0.090 0.069 + 0.042 0.084 0.066 0.087 0.069 0.064 0.064 0.024 0.082 0.082 + 0.057 0.032 0.075 0.048 0.091 0.079 0.105 0.080 0.052 0.046 + 0.099 0.081 0.059 0.098 0.079 0.073 0.130 0.100 0.068 0.119 + 0.111 0.107 0.098 0.144 0.108 0.138 0.174 0.130 0.134 0.157 + 0.136 0.205 0.197 0.194 0.206 0.199 0.175 0.228 0.197 0.177 + 0.217 0.234 0.171 0.214 0.232 0.158 0.222 0.142 -0.062 0.042 + + 844 airs_aqua 950 0.611125E-02 + 0.021 -0.017 0.145 0.141 0.114 0.174 0.156 0.162 0.181 0.192 + 0.153 0.221 0.199 0.168 0.167 0.165 0.182 0.103 0.117 0.109 + 0.153 0.069 0.072 0.107 0.058 0.092 0.061 0.055 0.068 0.049 + 0.021 0.054 0.051 0.068 0.049 0.038 0.047 0.008 0.067 0.068 + 0.040 0.016 0.060 0.031 0.077 0.064 0.089 0.068 0.039 0.035 + 0.081 0.065 0.042 0.085 0.067 0.065 0.118 0.083 0.055 0.107 + 0.105 0.097 0.087 0.132 0.099 0.124 0.160 0.123 0.124 0.145 + 0.124 0.195 0.188 0.181 0.191 0.183 0.160 0.214 0.183 0.170 + 0.206 0.218 0.158 0.205 0.221 0.148 0.218 0.140 -0.056 0.050 + + 845 airs_aqua 1003 0.126853E-02 + -0.074 -0.117 0.026 0.012 -0.014 0.044 0.014 0.033 0.039 0.052 + 0.015 0.073 0.061 0.029 0.028 0.032 0.037 -0.017 -0.009 -0.016 + 0.027 -0.044 -0.052 -0.011 -0.051 -0.027 -0.061 -0.051 -0.043 -0.053 + -0.078 -0.049 -0.050 -0.036 -0.042 -0.060 -0.058 -0.085 -0.029 -0.029 + -0.052 -0.077 -0.033 -0.058 -0.032 -0.036 -0.004 -0.032 -0.054 -0.050 + -0.018 -0.025 -0.051 -0.015 -0.027 -0.029 0.020 -0.009 -0.031 0.006 + 0.006 0.004 -0.011 0.032 0.001 0.023 0.052 0.013 0.020 0.043 + 0.031 0.077 0.065 0.067 0.073 0.064 0.046 0.095 0.055 0.054 + 0.081 0.097 0.037 0.087 0.095 0.035 0.101 0.033 -0.135 -0.031 + + 846 airs_aqua 1012 -0.214887E-02 + -0.071 -0.119 0.002 -0.017 -0.046 -0.003 -0.036 -0.007 -0.011 -0.002 + -0.035 0.020 0.007 -0.019 -0.035 -0.021 -0.023 -0.067 -0.057 -0.064 + -0.021 -0.101 -0.093 -0.068 -0.100 -0.079 -0.116 -0.104 -0.089 -0.097 + -0.121 -0.102 -0.094 -0.090 -0.093 -0.103 -0.109 -0.128 -0.078 -0.077 + -0.098 -0.133 -0.082 -0.103 -0.076 -0.081 -0.050 -0.084 -0.099 -0.090 + -0.074 -0.071 -0.097 -0.070 -0.075 -0.072 -0.030 -0.054 -0.080 -0.044 + -0.047 -0.041 -0.061 -0.020 -0.049 -0.033 -0.005 -0.031 -0.028 -0.017 + -0.015 0.024 0.008 0.012 0.016 0.011 -0.008 0.041 -0.002 0.008 + 0.027 0.044 -0.008 0.039 0.055 0.005 0.070 0.012 -0.137 -0.028 + + 847 airs_aqua 1019 -0.354517E-02 + -0.079 -0.132 -0.024 -0.041 -0.076 -0.042 -0.072 -0.052 -0.059 -0.057 + -0.084 -0.040 -0.054 -0.084 -0.113 -0.102 -0.107 -0.150 -0.141 -0.157 + -0.122 -0.200 -0.197 -0.173 -0.205 -0.194 -0.235 -0.214 -0.203 -0.217 + -0.245 -0.217 -0.220 -0.224 -0.225 -0.237 -0.241 -0.262 -0.210 -0.214 + -0.233 -0.269 -0.223 -0.229 -0.212 -0.219 -0.188 -0.219 -0.233 -0.228 + -0.209 -0.205 -0.226 -0.199 -0.206 -0.197 -0.160 -0.172 -0.197 -0.167 + -0.162 -0.162 -0.173 -0.134 -0.158 -0.138 -0.113 -0.136 -0.132 -0.111 + -0.100 -0.067 -0.073 -0.057 -0.062 -0.061 -0.064 -0.025 -0.056 -0.037 + -0.026 -0.010 -0.052 0.003 0.023 -0.028 0.046 -0.013 -0.152 -0.039 + + 848 airs_aqua 1024 -0.414748E-03 + 0.017 -0.042 0.047 0.028 -0.027 0.006 -0.030 -0.014 -0.029 -0.037 + -0.056 -0.024 -0.056 -0.075 -0.099 -0.094 -0.090 -0.132 -0.128 -0.155 + -0.112 -0.174 -0.185 -0.157 -0.188 -0.178 -0.216 -0.193 -0.198 -0.196 + -0.232 -0.196 -0.208 -0.209 -0.205 -0.230 -0.233 -0.249 -0.196 -0.198 + -0.212 -0.248 -0.205 -0.213 -0.206 -0.213 -0.179 -0.215 -0.207 -0.218 + -0.206 -0.192 -0.205 -0.193 -0.193 -0.180 -0.157 -0.166 -0.192 -0.160 + -0.168 -0.157 -0.164 -0.130 -0.163 -0.137 -0.126 -0.134 -0.129 -0.111 + -0.101 -0.081 -0.080 -0.054 -0.062 -0.060 -0.069 -0.033 -0.055 -0.030 + -0.014 0.004 -0.029 0.026 0.047 0.007 0.088 0.053 -0.072 0.039 + + 849 airs_aqua 1030 -0.512737E-02 + 0.704 0.632 0.688 0.653 0.589 0.586 0.527 0.555 0.512 0.500 + 0.456 0.470 0.453 0.397 0.341 0.368 0.351 0.288 0.276 0.261 + 0.277 0.174 0.180 0.190 0.162 0.145 0.087 0.112 0.104 0.134 + 0.056 0.104 0.083 0.069 0.040 0.027 0.035 0.011 0.071 0.052 + 0.045 -0.007 0.050 0.041 0.034 0.035 0.080 0.043 0.038 0.062 + 0.047 0.067 0.044 0.084 0.074 0.093 0.121 0.140 0.125 0.139 + 0.151 0.172 0.165 0.208 0.193 0.220 0.234 0.225 0.242 0.280 + 0.329 0.362 0.347 0.394 0.381 0.395 0.427 0.451 0.446 0.531 + 0.512 0.548 0.520 0.616 0.649 0.614 0.724 0.680 0.593 0.744 + + 850 airs_aqua 1038 -0.839261E-02 + 0.076 -0.006 0.053 0.000 -0.065 -0.067 -0.121 -0.102 -0.141 -0.165 + -0.189 -0.160 -0.196 -0.221 -0.268 -0.256 -0.279 -0.308 -0.306 -0.329 + -0.290 -0.376 -0.362 -0.354 -0.367 -0.354 -0.412 -0.381 -0.383 -0.371 + -0.405 -0.382 -0.379 -0.396 -0.399 -0.405 -0.403 -0.422 -0.375 -0.376 + -0.384 -0.432 -0.378 -0.378 -0.375 -0.374 -0.341 -0.371 -0.397 -0.369 + -0.387 -0.370 -0.379 -0.373 -0.374 -0.362 -0.337 -0.328 -0.361 -0.334 + -0.343 -0.319 -0.349 -0.310 -0.333 -0.319 -0.308 -0.308 -0.314 -0.291 + -0.269 -0.252 -0.259 -0.226 -0.234 -0.232 -0.211 -0.184 -0.201 -0.145 + -0.151 -0.116 -0.135 -0.053 -0.017 -0.033 0.065 0.041 -0.039 0.109 + + 851 airs_aqua 1048 -0.104125E-01 + -0.229 -0.313 -0.256 -0.313 -0.387 -0.381 -0.439 -0.428 -0.456 -0.476 + -0.501 -0.474 -0.512 -0.523 -0.566 -0.557 -0.576 -0.599 -0.594 -0.618 + -0.569 -0.650 -0.638 -0.623 -0.633 -0.618 -0.676 -0.640 -0.633 -0.632 + -0.652 -0.636 -0.627 -0.658 -0.640 -0.651 -0.651 -0.672 -0.626 -0.621 + -0.624 -0.683 -0.625 -0.630 -0.625 -0.619 -0.586 -0.610 -0.640 -0.623 + -0.637 -0.619 -0.639 -0.633 -0.622 -0.607 -0.590 -0.587 -0.629 -0.595 + -0.599 -0.589 -0.619 -0.593 -0.602 -0.602 -0.596 -0.580 -0.602 -0.589 + -0.564 -0.554 -0.563 -0.533 -0.545 -0.541 -0.526 -0.496 -0.519 -0.468 + -0.469 -0.434 -0.459 -0.389 -0.343 -0.358 -0.265 -0.272 -0.337 -0.211 + + 852 airs_aqua 1069 -0.872178E-02 + -0.398 -0.444 -0.358 -0.382 -0.426 -0.403 -0.439 -0.419 -0.429 -0.434 + -0.455 -0.410 -0.439 -0.452 -0.482 -0.475 -0.472 -0.500 -0.502 -0.522 + -0.473 -0.535 -0.529 -0.515 -0.522 -0.511 -0.555 -0.526 -0.537 -0.524 + -0.551 -0.531 -0.525 -0.527 -0.533 -0.547 -0.537 -0.567 -0.511 -0.519 + -0.516 -0.557 -0.524 -0.518 -0.506 -0.509 -0.490 -0.522 -0.537 -0.512 + -0.532 -0.518 -0.522 -0.526 -0.523 -0.502 -0.478 -0.477 -0.518 -0.480 + -0.502 -0.481 -0.508 -0.483 -0.504 -0.490 -0.483 -0.484 -0.497 -0.483 + -0.468 -0.468 -0.478 -0.439 -0.461 -0.460 -0.456 -0.436 -0.459 -0.417 + -0.427 -0.415 -0.448 -0.400 -0.377 -0.418 -0.346 -0.377 -0.494 -0.400 + + 853 airs_aqua 1079 -0.177122E-01 + -0.734 -0.782 -0.720 -0.749 -0.794 -0.771 -0.806 -0.773 -0.778 -0.785 + -0.786 -0.752 -0.767 -0.769 -0.787 -0.773 -0.770 -0.786 -0.767 -0.785 + -0.745 -0.799 -0.789 -0.768 -0.760 -0.755 -0.793 -0.758 -0.752 -0.747 + -0.767 -0.744 -0.740 -0.745 -0.741 -0.753 -0.747 -0.767 -0.718 -0.731 + -0.715 -0.762 -0.717 -0.721 -0.708 -0.704 -0.690 -0.710 -0.739 -0.716 + -0.742 -0.726 -0.732 -0.736 -0.727 -0.715 -0.696 -0.697 -0.735 -0.711 + -0.720 -0.710 -0.739 -0.720 -0.741 -0.746 -0.742 -0.733 -0.762 -0.749 + -0.741 -0.745 -0.761 -0.747 -0.761 -0.770 -0.779 -0.760 -0.793 -0.757 + -0.786 -0.762 -0.808 -0.767 -0.744 -0.782 -0.724 -0.750 -0.828 -0.735 + + 854 airs_aqua 1082 -0.183004E-01 + -0.486 -0.540 -0.490 -0.534 -0.588 -0.577 -0.626 -0.611 -0.624 -0.634 + -0.653 -0.630 -0.657 -0.656 -0.690 -0.685 -0.694 -0.711 -0.700 -0.725 + -0.684 -0.741 -0.738 -0.720 -0.718 -0.709 -0.758 -0.726 -0.722 -0.719 + -0.739 -0.715 -0.710 -0.733 -0.720 -0.746 -0.738 -0.753 -0.706 -0.712 + -0.699 -0.753 -0.708 -0.706 -0.699 -0.703 -0.684 -0.708 -0.718 -0.699 + -0.732 -0.714 -0.720 -0.729 -0.710 -0.700 -0.686 -0.676 -0.718 -0.692 + -0.704 -0.697 -0.716 -0.705 -0.710 -0.714 -0.718 -0.696 -0.723 -0.709 + -0.682 -0.692 -0.698 -0.679 -0.684 -0.688 -0.690 -0.659 -0.687 -0.639 + -0.656 -0.631 -0.663 -0.610 -0.575 -0.600 -0.524 -0.538 -0.600 -0.501 + + 855 airs_aqua 1083 -0.187135E-01 + -0.683 -0.749 -0.713 -0.757 -0.810 -0.810 -0.858 -0.828 -0.852 -0.871 + -0.882 -0.851 -0.883 -0.878 -0.910 -0.913 -0.911 -0.925 -0.913 -0.941 + -0.902 -0.948 -0.944 -0.928 -0.928 -0.922 -0.960 -0.925 -0.925 -0.918 + -0.943 -0.930 -0.909 -0.939 -0.918 -0.930 -0.944 -0.956 -0.904 -0.913 + -0.901 -0.958 -0.905 -0.901 -0.905 -0.901 -0.878 -0.892 -0.919 -0.898 + -0.929 -0.905 -0.912 -0.921 -0.910 -0.904 -0.892 -0.885 -0.915 -0.892 + -0.915 -0.888 -0.925 -0.905 -0.918 -0.921 -0.923 -0.894 -0.928 -0.929 + -0.898 -0.908 -0.915 -0.888 -0.905 -0.904 -0.905 -0.878 -0.911 -0.866 + -0.880 -0.857 -0.883 -0.837 -0.797 -0.819 -0.747 -0.753 -0.808 -0.703 + + 856 airs_aqua 1088 -0.207405E-01 + -0.917 -0.972 -0.930 -0.974 -1.023 -1.001 -1.054 -1.031 -1.059 -1.082 + -1.087 -1.050 -1.088 -1.086 -1.110 -1.120 -1.137 -1.133 -1.130 -1.152 + -1.112 -1.146 -1.157 -1.137 -1.128 -1.133 -1.172 -1.142 -1.155 -1.138 + -1.171 -1.139 -1.135 -1.148 -1.143 -1.152 -1.153 -1.176 -1.134 -1.141 + -1.125 -1.170 -1.139 -1.133 -1.122 -1.131 -1.109 -1.133 -1.161 -1.142 + -1.162 -1.150 -1.143 -1.154 -1.141 -1.134 -1.122 -1.123 -1.158 -1.130 + -1.149 -1.119 -1.159 -1.139 -1.151 -1.160 -1.162 -1.128 -1.176 -1.168 + -1.145 -1.153 -1.153 -1.130 -1.136 -1.145 -1.144 -1.112 -1.139 -1.105 + -1.116 -1.091 -1.118 -1.081 -1.033 -1.060 -0.994 -0.998 -1.052 -0.972 + + 857 airs_aqua 1090 -0.213788E-01 + -1.087 -1.147 -1.105 -1.152 -1.206 -1.192 -1.261 -1.243 -1.259 -1.276 + -1.291 -1.267 -1.306 -1.287 -1.326 -1.334 -1.333 -1.346 -1.342 -1.371 + -1.339 -1.376 -1.380 -1.370 -1.350 -1.358 -1.394 -1.366 -1.375 -1.369 + -1.383 -1.369 -1.360 -1.387 -1.364 -1.388 -1.377 -1.406 -1.359 -1.370 + -1.350 -1.404 -1.364 -1.365 -1.350 -1.352 -1.339 -1.353 -1.381 -1.364 + -1.388 -1.377 -1.366 -1.391 -1.379 -1.364 -1.358 -1.339 -1.384 -1.368 + -1.372 -1.349 -1.391 -1.378 -1.370 -1.387 -1.381 -1.355 -1.386 -1.384 + -1.364 -1.369 -1.380 -1.347 -1.357 -1.359 -1.347 -1.328 -1.353 -1.313 + -1.315 -1.284 -1.312 -1.277 -1.221 -1.251 -1.178 -1.177 -1.234 -1.143 + + 858 airs_aqua 1092 -0.204653E-01 + -1.157 -1.223 -1.187 -1.225 -1.285 -1.270 -1.328 -1.321 -1.338 -1.344 + -1.367 -1.327 -1.383 -1.365 -1.396 -1.411 -1.406 -1.429 -1.411 -1.437 + -1.413 -1.445 -1.454 -1.442 -1.421 -1.424 -1.471 -1.432 -1.456 -1.442 + -1.468 -1.460 -1.438 -1.462 -1.437 -1.461 -1.458 -1.489 -1.445 -1.459 + -1.438 -1.480 -1.448 -1.456 -1.426 -1.441 -1.428 -1.441 -1.482 -1.447 + -1.470 -1.463 -1.454 -1.470 -1.447 -1.450 -1.423 -1.413 -1.467 -1.431 + -1.453 -1.436 -1.476 -1.454 -1.447 -1.459 -1.466 -1.437 -1.455 -1.454 + -1.441 -1.446 -1.450 -1.425 -1.429 -1.438 -1.424 -1.395 -1.424 -1.386 + -1.390 -1.370 -1.380 -1.360 -1.295 -1.328 -1.252 -1.262 -1.308 -1.223 + + 859 airs_aqua 1095 0.193837E-02 + -0.310 -0.344 -0.226 -0.215 -0.246 -0.183 -0.209 -0.180 -0.182 -0.169 + -0.195 -0.137 -0.155 -0.173 -0.180 -0.172 -0.173 -0.218 -0.204 -0.213 + -0.164 -0.229 -0.227 -0.195 -0.235 -0.208 -0.236 -0.236 -0.226 -0.228 + -0.256 -0.229 -0.221 -0.213 -0.225 -0.230 -0.227 -0.250 -0.201 -0.200 + -0.211 -0.236 -0.198 -0.211 -0.189 -0.207 -0.177 -0.198 -0.207 -0.205 + -0.177 -0.186 -0.194 -0.171 -0.181 -0.180 -0.129 -0.153 -0.172 -0.141 + -0.152 -0.144 -0.157 -0.127 -0.155 -0.126 -0.099 -0.134 -0.121 -0.111 + -0.118 -0.073 -0.079 -0.076 -0.074 -0.077 -0.099 -0.056 -0.095 -0.089 + -0.067 -0.057 -0.121 -0.078 -0.061 -0.130 -0.074 -0.139 -0.303 -0.208 + + 860 airs_aqua 1104 -0.173167E-01 + 0.474 0.418 0.445 0.412 0.367 0.360 0.310 0.351 0.311 0.281 + 0.284 0.290 0.265 0.251 0.212 0.219 0.195 0.216 0.206 0.165 + 0.205 0.149 0.165 0.160 0.155 0.174 0.119 0.155 0.125 0.164 + 0.141 0.145 0.154 0.132 0.135 0.140 0.138 0.109 0.158 0.163 + 0.166 0.105 0.166 0.183 0.158 0.172 0.183 0.175 0.167 0.167 + 0.112 0.156 0.157 0.136 0.154 0.174 0.162 0.197 0.170 0.169 + 0.165 0.194 0.154 0.174 0.162 0.157 0.156 0.178 0.150 0.173 + 0.223 0.205 0.169 0.227 0.202 0.207 0.242 0.237 0.232 0.296 + 0.252 0.280 0.264 0.320 0.346 0.319 0.393 0.377 0.333 0.419 + + 861 airs_aqua 1111 -0.121573E-01 + 0.450 0.389 0.402 0.361 0.302 0.286 0.216 0.228 0.201 0.168 + 0.145 0.163 0.129 0.111 0.065 0.069 0.064 0.047 0.026 0.002 + 0.039 -0.009 -0.015 0.001 -0.007 -0.005 -0.050 -0.014 -0.005 0.000 + -0.033 -0.006 0.009 -0.038 -0.025 -0.035 -0.036 -0.045 -0.006 -0.008 + -0.012 -0.049 -0.006 -0.002 -0.011 0.005 0.018 -0.010 -0.015 0.005 + -0.014 0.018 0.003 -0.014 0.011 0.038 0.032 0.062 0.029 0.046 + 0.040 0.059 0.027 0.052 0.050 0.055 0.054 0.083 0.065 0.078 + 0.116 0.114 0.097 0.138 0.141 0.142 0.165 0.181 0.175 0.239 + 0.232 0.269 0.254 0.319 0.359 0.355 0.445 0.444 0.389 0.506 + + 862 airs_aqua 1115 -0.127597E-01 + 0.348 0.267 0.278 0.207 0.128 0.110 0.028 0.052 0.014 -0.014 + -0.041 -0.023 -0.059 -0.078 -0.119 -0.117 -0.127 -0.155 -0.162 -0.187 + -0.152 -0.214 -0.210 -0.192 -0.208 -0.199 -0.253 -0.205 -0.207 -0.189 + -0.244 -0.213 -0.191 -0.240 -0.214 -0.237 -0.229 -0.242 -0.192 -0.205 + -0.205 -0.246 -0.202 -0.210 -0.213 -0.200 -0.165 -0.201 -0.205 -0.199 + -0.209 -0.170 -0.201 -0.198 -0.181 -0.154 -0.162 -0.142 -0.175 -0.152 + -0.152 -0.140 -0.165 -0.120 -0.135 -0.125 -0.124 -0.095 -0.118 -0.103 + -0.060 -0.055 -0.078 -0.033 -0.037 -0.025 -0.013 0.025 0.007 0.064 + 0.067 0.109 0.103 0.162 0.215 0.224 0.325 0.337 0.292 0.443 + + 863 airs_aqua 1116 -0.110238E-01 + 0.131 0.091 0.160 0.135 0.105 0.113 0.086 0.126 0.116 0.099 + 0.093 0.130 0.110 0.100 0.073 0.084 0.072 0.065 0.063 0.040 + 0.085 0.029 0.037 0.045 0.040 0.061 0.000 0.055 0.050 0.046 + 0.021 0.040 0.055 0.035 0.051 0.026 0.033 0.023 0.064 0.061 + 0.064 0.019 0.067 0.063 0.069 0.076 0.093 0.083 0.060 0.080 + 0.063 0.089 0.076 0.077 0.082 0.110 0.121 0.122 0.107 0.120 + 0.118 0.128 0.117 0.142 0.121 0.137 0.146 0.153 0.128 0.152 + 0.169 0.182 0.161 0.188 0.185 0.184 0.188 0.211 0.192 0.220 + 0.210 0.228 0.196 0.235 0.265 0.221 0.277 0.242 0.152 0.250 + + 864 airs_aqua 1119 -0.903365E-02 + 0.047 -0.011 0.068 0.044 -0.007 0.022 -0.031 0.007 -0.010 -0.016 + -0.040 0.007 -0.017 -0.035 -0.058 -0.051 -0.050 -0.073 -0.075 -0.084 + -0.040 -0.113 -0.106 -0.081 -0.107 -0.082 -0.126 -0.096 -0.091 -0.086 + -0.116 -0.096 -0.081 -0.096 -0.076 -0.096 -0.086 -0.107 -0.055 -0.055 + -0.067 -0.096 -0.054 -0.059 -0.052 -0.050 -0.022 -0.044 -0.057 -0.039 + -0.044 -0.029 -0.039 -0.024 -0.030 -0.014 0.002 0.000 -0.016 0.001 + 0.001 0.015 -0.003 0.029 0.013 0.025 0.028 0.028 0.016 0.033 + 0.062 0.077 0.058 0.086 0.079 0.082 0.071 0.110 0.079 0.120 + 0.111 0.134 0.104 0.158 0.178 0.149 0.219 0.185 0.084 0.202 + + 865 airs_aqua 1120 -0.870147E-02 + 0.107 0.042 0.117 0.091 0.034 0.056 0.016 0.053 0.026 0.035 + -0.004 0.039 0.026 0.004 -0.018 0.001 0.003 -0.021 -0.017 -0.032 + 0.011 -0.062 -0.059 -0.030 -0.068 -0.038 -0.070 -0.048 -0.026 -0.024 + -0.066 -0.032 -0.032 -0.033 -0.030 -0.040 -0.029 -0.048 -0.003 0.003 + -0.003 -0.059 0.005 0.007 0.023 0.015 0.045 0.009 -0.006 0.011 + 0.018 0.032 0.009 0.043 0.036 0.041 0.056 0.071 0.047 0.061 + 0.068 0.075 0.048 0.090 0.082 0.089 0.087 0.087 0.075 0.093 + 0.119 0.140 0.119 0.131 0.140 0.143 0.136 0.168 0.146 0.172 + 0.177 0.200 0.177 0.223 0.251 0.220 0.290 0.263 0.154 0.287 + + 866 airs_aqua 1123 -0.249048E-02 + -0.017 -0.080 0.022 -0.001 -0.039 -0.005 -0.045 -0.018 -0.024 -0.027 + -0.058 -0.008 -0.023 -0.048 -0.069 -0.053 -0.051 -0.089 -0.087 -0.097 + -0.057 -0.120 -0.120 -0.088 -0.123 -0.102 -0.132 -0.114 -0.106 -0.113 + -0.141 -0.106 -0.102 -0.102 -0.094 -0.109 -0.106 -0.127 -0.071 -0.070 + -0.082 -0.116 -0.068 -0.075 -0.059 -0.063 -0.028 -0.063 -0.059 -0.057 + -0.039 -0.039 -0.057 -0.026 -0.032 -0.018 0.002 0.002 -0.021 0.008 + 0.005 0.019 0.005 0.044 0.010 0.040 0.054 0.038 0.040 0.056 + 0.067 0.103 0.089 0.110 0.106 0.107 0.095 0.141 0.117 0.135 + 0.149 0.166 0.125 0.185 0.197 0.156 0.229 0.187 0.052 0.175 + + 867 airs_aqua 1130 0.155526E-02 + -0.087 -0.136 -0.019 -0.036 -0.072 -0.021 -0.055 -0.046 -0.036 -0.037 + -0.071 -0.006 -0.026 -0.055 -0.061 -0.065 -0.047 -0.103 -0.097 -0.097 + -0.062 -0.134 -0.131 -0.095 -0.141 -0.112 -0.142 -0.136 -0.115 -0.129 + -0.154 -0.123 -0.123 -0.107 -0.116 -0.121 -0.120 -0.140 -0.089 -0.086 + -0.108 -0.126 -0.082 -0.101 -0.070 -0.075 -0.046 -0.072 -0.086 -0.083 + -0.047 -0.055 -0.072 -0.029 -0.048 -0.040 0.003 -0.016 -0.038 0.001 + 0.001 0.007 -0.007 0.034 0.008 0.039 0.068 0.039 0.043 0.060 + 0.058 0.113 0.105 0.109 0.119 0.119 0.103 0.158 0.128 0.133 + 0.166 0.182 0.132 0.191 0.210 0.164 0.230 0.178 0.028 0.145 + + 868 airs_aqua 1138 0.861000E-02 + -0.182 -0.224 -0.080 -0.075 -0.109 -0.038 -0.067 -0.057 -0.040 -0.036 + -0.072 -0.016 -0.028 -0.053 -0.067 -0.061 -0.054 -0.111 -0.111 -0.117 + -0.072 -0.142 -0.144 -0.106 -0.159 -0.124 -0.150 -0.158 -0.154 -0.165 + -0.187 -0.153 -0.158 -0.136 -0.152 -0.160 -0.152 -0.181 -0.130 -0.121 + -0.142 -0.161 -0.128 -0.144 -0.110 -0.122 -0.089 -0.111 -0.124 -0.128 + -0.087 -0.100 -0.110 -0.069 -0.087 -0.088 -0.039 -0.054 -0.083 -0.034 + -0.043 -0.033 -0.033 -0.005 -0.029 0.005 0.034 0.003 0.014 0.032 + 0.021 0.082 0.076 0.080 0.097 0.092 0.070 0.128 0.105 0.092 + 0.130 0.144 0.087 0.139 0.151 0.084 0.153 0.081 -0.100 0.005 + + 869 airs_aqua 1142 0.183802E-01 + 0.170 0.133 0.241 0.237 0.185 0.254 0.227 0.215 0.234 0.216 + 0.195 0.223 0.192 0.173 0.159 0.157 0.171 0.123 0.127 0.088 + 0.135 0.079 0.061 0.093 0.064 0.073 0.047 0.053 0.039 0.046 + 0.001 0.055 0.034 0.060 0.045 0.036 0.025 0.025 0.062 0.070 + 0.040 0.039 0.062 0.046 0.063 0.060 0.094 0.050 0.079 0.056 + 0.098 0.088 0.092 0.104 0.110 0.102 0.124 0.123 0.107 0.136 + 0.131 0.143 0.157 0.166 0.141 0.189 0.201 0.175 0.212 0.210 + 0.202 0.248 0.256 0.274 0.289 0.289 0.262 0.314 0.306 0.303 + 0.340 0.347 0.316 0.364 0.383 0.320 0.393 0.340 0.187 0.289 + + 870 airs_aqua 1178 0.424570E-02 + -0.814 -0.836 -0.661 -0.656 -0.666 -0.584 -0.602 -0.585 -0.549 -0.530 + -0.559 -0.479 -0.483 -0.509 -0.514 -0.509 -0.476 -0.540 -0.524 -0.522 + -0.477 -0.549 -0.543 -0.500 -0.545 -0.502 -0.528 -0.533 -0.508 -0.531 + -0.547 -0.512 -0.512 -0.489 -0.503 -0.500 -0.501 -0.526 -0.475 -0.475 + -0.495 -0.510 -0.467 -0.491 -0.447 -0.462 -0.431 -0.460 -0.475 -0.480 + -0.436 -0.456 -0.465 -0.427 -0.451 -0.454 -0.398 -0.424 -0.459 -0.412 + -0.421 -0.422 -0.433 -0.405 -0.433 -0.397 -0.369 -0.420 -0.416 -0.402 + -0.427 -0.363 -0.380 -0.394 -0.386 -0.391 -0.423 -0.373 -0.411 -0.427 + -0.400 -0.393 -0.469 -0.423 -0.426 -0.502 -0.454 -0.540 -0.750 -0.656 + + 871 airs_aqua 1199 0.409394E-02 + -1.308 -1.311 -1.119 -1.093 -1.095 -0.996 -0.995 -0.973 -0.922 -0.894 + -0.924 -0.838 -0.839 -0.855 -0.843 -0.834 -0.807 -0.867 -0.836 -0.828 + -0.788 -0.849 -0.845 -0.800 -0.837 -0.782 -0.807 -0.809 -0.785 -0.814 + -0.823 -0.785 -0.776 -0.759 -0.765 -0.764 -0.761 -0.788 -0.737 -0.736 + -0.750 -0.765 -0.724 -0.746 -0.698 -0.721 -0.683 -0.704 -0.729 -0.731 + -0.690 -0.716 -0.729 -0.675 -0.710 -0.713 -0.662 -0.689 -0.724 -0.682 + -0.686 -0.696 -0.699 -0.679 -0.709 -0.678 -0.650 -0.698 -0.700 -0.694 + -0.726 -0.658 -0.682 -0.693 -0.688 -0.704 -0.747 -0.702 -0.742 -0.779 + -0.744 -0.753 -0.839 -0.800 -0.807 -0.900 -0.863 -0.969 -1.197 -1.121 + + 872 airs_aqua 1206 0.213150E-01 + -0.555 -0.551 -0.399 -0.385 -0.401 -0.305 -0.310 -0.308 -0.277 -0.266 + -0.280 -0.244 -0.260 -0.273 -0.274 -0.269 -0.256 -0.299 -0.284 -0.332 + -0.280 -0.309 -0.338 -0.305 -0.323 -0.324 -0.340 -0.331 -0.356 -0.339 + -0.379 -0.330 -0.354 -0.323 -0.330 -0.351 -0.363 -0.366 -0.322 -0.313 + -0.345 -0.338 -0.322 -0.351 -0.327 -0.326 -0.281 -0.338 -0.309 -0.341 + -0.288 -0.300 -0.299 -0.285 -0.273 -0.287 -0.266 -0.267 -0.289 -0.266 + -0.267 -0.254 -0.238 -0.232 -0.260 -0.225 -0.209 -0.236 -0.201 -0.211 + -0.229 -0.187 -0.178 -0.163 -0.152 -0.153 -0.193 -0.156 -0.168 -0.190 + -0.156 -0.168 -0.218 -0.187 -0.192 -0.277 -0.233 -0.299 -0.510 -0.443 + + 873 airs_aqua 1221 0.360485E-02 + -0.857 -0.874 -0.692 -0.684 -0.695 -0.609 -0.621 -0.602 -0.567 -0.546 + -0.579 -0.497 -0.499 -0.531 -0.524 -0.512 -0.492 -0.554 -0.525 -0.530 + -0.480 -0.550 -0.546 -0.501 -0.545 -0.502 -0.522 -0.532 -0.498 -0.521 + -0.543 -0.510 -0.496 -0.478 -0.485 -0.489 -0.486 -0.515 -0.461 -0.463 + -0.476 -0.493 -0.454 -0.472 -0.424 -0.448 -0.408 -0.436 -0.456 -0.458 + -0.408 -0.434 -0.446 -0.403 -0.419 -0.424 -0.374 -0.399 -0.436 -0.385 + -0.392 -0.392 -0.409 -0.380 -0.403 -0.365 -0.347 -0.388 -0.385 -0.376 + -0.400 -0.327 -0.355 -0.360 -0.351 -0.357 -0.398 -0.343 -0.378 -0.403 + -0.366 -0.362 -0.436 -0.394 -0.393 -0.471 -0.427 -0.512 -0.726 -0.632 + + 874 airs_aqua 1237 0.386926E-02 + -0.569 -0.603 -0.419 -0.419 -0.434 -0.368 -0.379 -0.357 -0.331 -0.313 + -0.347 -0.267 -0.289 -0.312 -0.312 -0.310 -0.289 -0.352 -0.322 -0.324 + -0.279 -0.353 -0.351 -0.314 -0.354 -0.301 -0.331 -0.342 -0.313 -0.343 + -0.356 -0.321 -0.319 -0.293 -0.310 -0.297 -0.302 -0.348 -0.274 -0.265 + -0.283 -0.313 -0.263 -0.291 -0.238 -0.266 -0.232 -0.252 -0.278 -0.265 + -0.233 -0.252 -0.256 -0.219 -0.241 -0.244 -0.186 -0.210 -0.251 -0.193 + -0.212 -0.209 -0.221 -0.184 -0.207 -0.167 -0.139 -0.191 -0.191 -0.175 + -0.193 -0.124 -0.145 -0.156 -0.130 -0.149 -0.167 -0.122 -0.149 -0.174 + -0.117 -0.131 -0.194 -0.156 -0.142 -0.210 -0.165 -0.237 -0.449 -0.344 + + 875 airs_aqua 1252 0.291412E-02 + -0.203 -0.242 -0.086 -0.089 -0.120 -0.047 -0.074 -0.069 -0.042 -0.030 + -0.075 0.007 -0.009 -0.044 -0.054 -0.052 -0.043 -0.108 -0.082 -0.086 + -0.044 -0.125 -0.112 -0.076 -0.131 -0.077 -0.101 -0.117 -0.092 -0.128 + -0.132 -0.111 -0.102 -0.074 -0.094 -0.083 -0.093 -0.115 -0.065 -0.062 + -0.083 -0.103 -0.058 -0.081 -0.024 -0.053 -0.006 -0.031 -0.061 -0.060 + -0.030 -0.045 -0.056 -0.001 -0.031 -0.026 0.017 -0.003 -0.039 0.010 + 0.014 0.006 0.007 0.034 0.012 0.040 0.076 0.030 0.030 0.043 + 0.034 0.099 0.086 0.080 0.089 0.102 0.061 0.126 0.091 0.072 + 0.122 0.134 0.065 0.121 0.134 0.075 0.134 0.063 -0.117 -0.017 + + 876 airs_aqua 1260 0.324888E-01 + 0.200 0.225 0.323 0.316 0.285 0.385 0.367 0.357 0.408 0.392 + 0.378 0.399 0.383 0.390 0.400 0.402 0.420 0.402 0.411 0.343 + 0.391 0.394 0.374 0.380 0.391 0.383 0.370 0.374 0.350 0.374 + 0.334 0.416 0.352 0.396 0.400 0.369 0.377 0.397 0.413 0.439 + 0.387 0.404 0.429 0.397 0.414 0.408 0.473 0.399 0.465 0.385 + 0.449 0.424 0.441 0.411 0.458 0.437 0.434 0.448 0.440 0.399 + 0.438 0.434 0.465 0.454 0.406 0.434 0.399 0.409 0.456 0.426 + 0.392 0.427 0.453 0.474 0.448 0.471 0.420 0.442 0.431 0.420 + 0.446 0.423 0.375 0.427 0.405 0.349 0.396 0.341 0.189 0.239 + + 877 airs_aqua 1263 0.111421E-01 + -0.293 -0.326 -0.163 -0.157 -0.182 -0.098 -0.122 -0.113 -0.089 -0.078 + -0.109 -0.059 -0.069 -0.096 -0.093 -0.096 -0.078 -0.148 -0.135 -0.153 + -0.105 -0.169 -0.177 -0.134 -0.185 -0.152 -0.182 -0.190 -0.182 -0.190 + -0.225 -0.181 -0.190 -0.170 -0.183 -0.201 -0.198 -0.228 -0.177 -0.176 + -0.198 -0.210 -0.181 -0.205 -0.169 -0.184 -0.154 -0.192 -0.197 -0.207 + -0.161 -0.180 -0.191 -0.159 -0.179 -0.180 -0.139 -0.156 -0.188 -0.145 + -0.161 -0.157 -0.166 -0.133 -0.167 -0.131 -0.106 -0.143 -0.133 -0.119 + -0.145 -0.079 -0.091 -0.089 -0.083 -0.094 -0.119 -0.068 -0.098 -0.115 + -0.078 -0.073 -0.127 -0.086 -0.082 -0.164 -0.099 -0.186 -0.386 -0.284 + + 878 airs_aqua 1266 0.389384E-01 + -0.053 -0.036 0.072 0.079 0.043 0.131 0.115 0.117 0.143 0.129 + 0.107 0.117 0.099 0.102 0.107 0.106 0.108 0.093 0.100 0.037 + 0.067 0.071 0.046 0.059 0.065 0.036 0.026 0.018 -0.003 0.010 + -0.033 0.041 -0.019 0.020 0.014 -0.025 -0.023 0.002 0.037 0.039 + -0.022 0.019 0.016 -0.007 0.011 0.003 0.055 -0.022 0.049 -0.014 + 0.039 0.004 0.029 0.000 0.057 0.038 0.035 0.034 0.031 0.000 + 0.035 0.033 0.073 0.053 0.020 0.061 0.041 0.040 0.105 0.065 + 0.026 0.079 0.111 0.125 0.114 0.146 0.099 0.114 0.130 0.111 + 0.135 0.127 0.079 0.141 0.119 0.057 0.103 0.051 -0.093 -0.049 + + 879 airs_aqua 1285 0.108496E-01 + -0.357 -0.385 -0.226 -0.219 -0.240 -0.167 -0.184 -0.178 -0.150 -0.137 + -0.172 -0.112 -0.119 -0.149 -0.144 -0.142 -0.122 -0.195 -0.177 -0.195 + -0.147 -0.213 -0.217 -0.171 -0.222 -0.185 -0.212 -0.221 -0.208 -0.223 + -0.249 -0.211 -0.214 -0.195 -0.210 -0.223 -0.218 -0.248 -0.196 -0.198 + -0.218 -0.232 -0.203 -0.223 -0.187 -0.202 -0.175 -0.208 -0.220 -0.227 + -0.183 -0.203 -0.218 -0.182 -0.202 -0.206 -0.161 -0.183 -0.218 -0.170 + -0.189 -0.186 -0.197 -0.165 -0.198 -0.168 -0.139 -0.178 -0.175 -0.161 + -0.189 -0.123 -0.139 -0.139 -0.132 -0.143 -0.175 -0.122 -0.152 -0.174 + -0.137 -0.131 -0.190 -0.153 -0.147 -0.226 -0.165 -0.248 -0.444 -0.348 + + 880 airs_aqua 1301 0.271170E-01 + 0.015 -0.011 0.106 0.109 0.073 0.130 0.111 0.118 0.120 0.127 + 0.099 0.127 0.111 0.086 0.079 0.074 0.077 0.029 0.025 -0.009 + 0.031 -0.010 -0.038 -0.001 -0.043 -0.032 -0.057 -0.062 -0.076 -0.080 + -0.123 -0.074 -0.097 -0.071 -0.083 -0.112 -0.109 -0.122 -0.080 -0.087 + -0.112 -0.117 -0.104 -0.110 -0.095 -0.097 -0.066 -0.119 -0.100 -0.118 + -0.082 -0.086 -0.083 -0.072 -0.070 -0.079 -0.041 -0.053 -0.082 -0.049 + -0.053 -0.043 -0.036 -0.019 -0.053 -0.009 0.013 -0.015 0.012 0.024 + 0.002 0.058 0.059 0.081 0.087 0.088 0.069 0.106 0.100 0.098 + 0.123 0.128 0.105 0.135 0.142 0.088 0.144 0.094 -0.070 0.032 + + 881 airs_aqua 1304 0.177531E-01 + -0.555 -0.587 -0.438 -0.429 -0.451 -0.383 -0.394 -0.385 -0.362 -0.345 + -0.379 -0.326 -0.331 -0.359 -0.351 -0.351 -0.332 -0.398 -0.385 -0.402 + -0.360 -0.418 -0.427 -0.384 -0.431 -0.399 -0.421 -0.430 -0.424 -0.438 + -0.465 -0.428 -0.435 -0.417 -0.433 -0.445 -0.442 -0.470 -0.418 -0.422 + -0.443 -0.454 -0.430 -0.447 -0.418 -0.429 -0.399 -0.434 -0.442 -0.451 + -0.408 -0.427 -0.435 -0.409 -0.423 -0.424 -0.382 -0.403 -0.434 -0.391 + -0.406 -0.403 -0.410 -0.381 -0.414 -0.382 -0.353 -0.390 -0.380 -0.370 + -0.401 -0.339 -0.349 -0.346 -0.343 -0.350 -0.374 -0.337 -0.361 -0.378 + -0.345 -0.344 -0.392 -0.363 -0.362 -0.432 -0.378 -0.450 -0.633 -0.542 + + 882 airs_aqua 1329 0.266378E-01 + 0.015 -0.006 0.116 0.119 0.081 0.157 0.144 0.139 0.166 0.168 + 0.142 0.170 0.150 0.136 0.139 0.127 0.144 0.101 0.102 0.057 + 0.101 0.064 0.036 0.069 0.038 0.043 0.019 0.017 -0.005 0.000 + -0.042 0.001 -0.032 0.003 -0.006 -0.041 -0.037 -0.048 -0.016 -0.014 + -0.043 -0.037 -0.028 -0.050 -0.031 -0.033 0.007 -0.046 -0.019 -0.053 + -0.008 -0.013 -0.011 -0.009 0.011 -0.002 0.021 0.023 -0.006 0.015 + 0.025 0.031 0.045 0.060 0.025 0.067 0.078 0.054 0.094 0.094 + 0.069 0.123 0.137 0.146 0.151 0.154 0.118 0.162 0.149 0.141 + 0.167 0.165 0.128 0.174 0.169 0.104 0.161 0.107 -0.063 0.028 + + 883 airs_aqua 1371 0.318514E-01 + -0.807 -0.803 -0.679 -0.664 -0.684 -0.593 -0.594 -0.592 -0.556 -0.543 + -0.555 -0.522 -0.537 -0.534 -0.534 -0.527 -0.508 -0.521 -0.525 -0.565 + -0.521 -0.533 -0.563 -0.523 -0.538 -0.542 -0.556 -0.554 -0.573 -0.556 + -0.599 -0.543 -0.584 -0.534 -0.541 -0.574 -0.570 -0.570 -0.534 -0.535 + -0.570 -0.560 -0.541 -0.566 -0.547 -0.557 -0.507 -0.582 -0.538 -0.574 + -0.536 -0.547 -0.538 -0.545 -0.513 -0.538 -0.529 -0.524 -0.550 -0.550 + -0.552 -0.537 -0.529 -0.523 -0.566 -0.533 -0.533 -0.562 -0.522 -0.540 + -0.574 -0.525 -0.518 -0.511 -0.513 -0.523 -0.566 -0.541 -0.555 -0.573 + -0.557 -0.571 -0.616 -0.586 -0.606 -0.675 -0.646 -0.707 -0.882 -0.813 + + 884 airs_aqua 1382 0.359513E-01 + -0.481 -0.506 -0.436 -0.434 -0.466 -0.422 -0.436 -0.431 -0.419 -0.418 + -0.434 -0.411 -0.421 -0.430 -0.434 -0.434 -0.418 -0.437 -0.451 -0.475 + -0.446 -0.462 -0.485 -0.447 -0.467 -0.464 -0.481 -0.479 -0.494 -0.484 + -0.517 -0.481 -0.505 -0.478 -0.482 -0.504 -0.499 -0.505 -0.477 -0.478 + -0.505 -0.498 -0.480 -0.495 -0.484 -0.496 -0.459 -0.508 -0.479 -0.509 + -0.482 -0.481 -0.479 -0.479 -0.467 -0.480 -0.469 -0.465 -0.484 -0.477 + -0.480 -0.468 -0.473 -0.453 -0.487 -0.457 -0.451 -0.483 -0.454 -0.450 + -0.482 -0.444 -0.437 -0.426 -0.425 -0.441 -0.461 -0.437 -0.446 -0.450 + -0.433 -0.434 -0.453 -0.428 -0.434 -0.468 -0.432 -0.463 -0.571 -0.490 + + 885 airs_aqua 1415 0.399963E-01 + -0.065 -0.099 -0.021 -0.024 -0.072 -0.022 -0.036 -0.031 -0.024 -0.024 + -0.028 -0.015 -0.023 -0.023 -0.037 -0.029 -0.018 -0.016 -0.030 -0.075 + -0.042 -0.049 -0.079 -0.039 -0.063 -0.066 -0.087 -0.078 -0.122 -0.086 + -0.142 -0.077 -0.135 -0.092 -0.090 -0.144 -0.122 -0.114 -0.084 -0.082 + -0.132 -0.115 -0.090 -0.107 -0.114 -0.126 -0.074 -0.158 -0.082 -0.121 + -0.101 -0.103 -0.084 -0.113 -0.064 -0.084 -0.088 -0.061 -0.093 -0.107 + -0.089 -0.075 -0.053 -0.049 -0.101 -0.061 -0.070 -0.097 -0.027 -0.057 + -0.077 -0.042 -0.036 -0.002 -0.037 -0.016 -0.046 -0.046 -0.036 -0.039 + -0.035 -0.051 -0.054 -0.033 -0.041 -0.085 -0.036 -0.066 -0.159 -0.088 + + 886 airs_aqua 1424 0.513717E-01 + -0.017 0.002 0.095 0.108 0.086 0.152 0.110 0.133 0.165 0.162 + 0.169 0.162 0.152 0.164 0.200 0.172 0.171 0.185 0.204 0.141 + 0.175 0.183 0.176 0.173 0.166 0.157 0.152 0.160 0.136 0.131 + 0.135 0.167 0.129 0.162 0.184 0.105 0.149 0.178 0.180 0.170 + 0.149 0.167 0.143 0.168 0.144 0.137 0.201 0.118 0.223 0.152 + 0.167 0.118 0.152 0.172 0.202 0.201 0.145 0.176 0.168 0.109 + 0.183 0.168 0.213 0.174 0.139 0.154 0.114 0.170 0.198 0.130 + 0.110 0.127 0.172 0.207 0.188 0.203 0.145 0.131 0.151 0.146 + 0.131 0.120 0.101 0.120 0.096 0.065 0.043 0.045 -0.052 -0.062 + + 887 airs_aqua 1449 0.300625E-01 + -0.087 -0.112 -0.013 -0.010 -0.058 0.021 0.007 0.007 0.033 0.032 + 0.016 0.044 0.026 0.010 0.010 0.015 0.030 0.023 0.004 -0.043 + -0.005 -0.017 -0.057 -0.011 -0.036 -0.035 -0.061 -0.052 -0.095 -0.057 + -0.125 -0.039 -0.105 -0.058 -0.055 -0.109 -0.095 -0.087 -0.050 -0.041 + -0.098 -0.082 -0.045 -0.079 -0.071 -0.088 -0.030 -0.116 -0.041 -0.093 + -0.057 -0.061 -0.050 -0.067 -0.023 -0.046 -0.049 -0.025 -0.062 -0.063 + -0.062 -0.044 -0.020 -0.001 -0.067 -0.022 -0.027 -0.067 0.009 -0.010 + -0.039 0.002 0.022 0.047 0.023 0.028 0.008 0.018 0.025 0.020 + 0.027 0.021 -0.011 0.025 0.012 -0.043 0.014 -0.031 -0.175 -0.097 + + 888 airs_aqua 1455 0.401681E-01 + 0.526 0.513 0.615 0.594 0.572 0.621 0.599 0.602 0.621 0.609 + 0.608 0.611 0.566 0.582 0.581 0.558 0.565 0.581 0.567 0.504 + 0.546 0.516 0.513 0.525 0.512 0.504 0.480 0.476 0.456 0.488 + 0.412 0.493 0.437 0.472 0.509 0.403 0.433 0.459 0.485 0.485 + 0.451 0.455 0.478 0.458 0.457 0.440 0.498 0.419 0.518 0.446 + 0.464 0.456 0.464 0.453 0.507 0.495 0.486 0.494 0.489 0.434 + 0.482 0.485 0.547 0.527 0.463 0.512 0.484 0.484 0.556 0.499 + 0.481 0.536 0.569 0.580 0.581 0.585 0.568 0.566 0.579 0.595 + 0.574 0.588 0.591 0.612 0.596 0.570 0.582 0.576 0.465 0.503 + + 889 airs_aqua 1466 0.815621E-01 + 0.283 0.284 0.299 0.298 0.269 0.265 0.239 0.213 0.236 0.218 + 0.201 0.203 0.221 0.151 0.183 0.199 0.127 0.163 0.155 0.130 + 0.174 0.155 0.136 0.102 0.132 0.105 0.087 0.096 0.075 0.071 + 0.093 0.101 0.057 0.059 0.049 0.080 0.107 0.065 0.067 0.058 + 0.048 0.072 0.096 0.079 0.076 0.092 0.066 0.091 0.041 0.065 + 0.055 0.054 0.039 0.045 0.108 0.106 0.085 0.104 0.108 0.097 + 0.111 0.118 0.074 0.098 0.092 0.099 0.124 0.150 0.136 0.153 + 0.148 0.117 0.126 0.183 0.182 0.205 0.186 0.205 0.234 0.206 + 0.218 0.235 0.213 0.264 0.300 0.265 0.280 0.291 0.282 0.283 + + 890 airs_aqua 1477 0.402623E-01 + 0.723 0.710 0.785 0.769 0.731 0.781 0.759 0.729 0.753 0.733 + 0.727 0.720 0.669 0.687 0.676 0.655 0.642 0.670 0.649 0.585 + 0.626 0.602 0.567 0.587 0.568 0.568 0.549 0.549 0.510 0.544 + 0.478 0.546 0.479 0.524 0.541 0.440 0.477 0.504 0.524 0.541 + 0.484 0.500 0.520 0.503 0.510 0.485 0.541 0.459 0.565 0.486 + 0.523 0.496 0.511 0.503 0.559 0.550 0.532 0.541 0.532 0.484 + 0.540 0.531 0.596 0.587 0.521 0.577 0.532 0.559 0.621 0.568 + 0.537 0.608 0.636 0.659 0.656 0.667 0.652 0.643 0.677 0.695 + 0.692 0.695 0.707 0.741 0.730 0.707 0.732 0.731 0.637 0.684 + + 891 airs_aqua 1500 0.469818E-01 + 0.544 0.552 0.630 0.624 0.598 0.661 0.617 0.614 0.655 0.644 + 0.626 0.617 0.611 0.614 0.639 0.596 0.626 0.636 0.649 0.556 + 0.602 0.609 0.595 0.579 0.589 0.584 0.564 0.583 0.547 0.555 + 0.545 0.583 0.545 0.564 0.593 0.494 0.550 0.577 0.590 0.576 + 0.556 0.567 0.570 0.557 0.542 0.523 0.609 0.524 0.642 0.530 + 0.580 0.522 0.557 0.566 0.590 0.606 0.546 0.600 0.572 0.511 + 0.596 0.580 0.625 0.599 0.567 0.568 0.527 0.582 0.614 0.553 + 0.528 0.553 0.620 0.630 0.625 0.646 0.600 0.597 0.617 0.612 + 0.617 0.592 0.597 0.627 0.618 0.585 0.579 0.585 0.487 0.507 + + 892 airs_aqua 1519 0.511792E-01 + 0.295 0.292 0.349 0.367 0.332 0.375 0.322 0.328 0.353 0.323 + 0.317 0.288 0.293 0.267 0.324 0.260 0.267 0.270 0.279 0.208 + 0.247 0.235 0.238 0.215 0.196 0.188 0.179 0.181 0.161 0.149 + 0.144 0.179 0.151 0.179 0.215 0.115 0.177 0.179 0.183 0.160 + 0.152 0.165 0.159 0.169 0.132 0.170 0.217 0.147 0.236 0.148 + 0.177 0.102 0.165 0.159 0.223 0.202 0.147 0.195 0.193 0.140 + 0.207 0.209 0.197 0.203 0.178 0.185 0.151 0.232 0.260 0.192 + 0.186 0.199 0.242 0.303 0.266 0.299 0.250 0.245 0.273 0.297 + 0.315 0.292 0.283 0.324 0.321 0.287 0.302 0.316 0.221 0.243 + + 893 airs_aqua 1538 0.596475E-01 + 0.134 0.129 0.175 0.175 0.155 0.180 0.129 0.148 0.142 0.145 + 0.125 0.100 0.127 0.081 0.142 0.074 0.079 0.078 0.076 0.024 + 0.053 0.043 0.046 0.042 0.000 0.014 0.022 0.012 -0.007 -0.035 + -0.008 -0.015 -0.026 -0.009 0.044 -0.027 0.009 0.015 -0.004 -0.035 + -0.004 -0.016 -0.021 -0.024 -0.045 -0.007 0.029 -0.025 0.049 -0.017 + 0.041 -0.070 -0.014 -0.005 0.041 0.042 -0.036 0.026 0.007 -0.034 + 0.021 0.036 0.026 0.000 0.014 0.014 -0.024 0.071 0.084 0.018 + 0.015 0.026 0.057 0.103 0.073 0.108 0.064 0.081 0.088 0.099 + 0.125 0.107 0.112 0.142 0.153 0.118 0.123 0.149 0.065 0.082 + + 894 airs_aqua 1545 0.477854E-01 + 0.403 0.412 0.485 0.488 0.467 0.513 0.461 0.471 0.511 0.475 + 0.478 0.469 0.455 0.442 0.502 0.434 0.471 0.478 0.478 0.403 + 0.462 0.454 0.442 0.423 0.419 0.410 0.405 0.413 0.402 0.371 + 0.393 0.440 0.402 0.430 0.455 0.354 0.421 0.421 0.442 0.423 + 0.410 0.419 0.414 0.416 0.384 0.384 0.461 0.393 0.500 0.400 + 0.415 0.359 0.399 0.412 0.464 0.441 0.389 0.437 0.416 0.354 + 0.440 0.422 0.452 0.443 0.421 0.404 0.364 0.426 0.456 0.387 + 0.371 0.409 0.441 0.483 0.452 0.487 0.432 0.421 0.440 0.448 + 0.470 0.433 0.429 0.470 0.463 0.429 0.429 0.442 0.342 0.363 + + 895 airs_aqua 1565 0.626086E-01 + 0.354 0.339 0.385 0.381 0.359 0.373 0.330 0.339 0.341 0.342 + 0.322 0.320 0.318 0.270 0.313 0.256 0.246 0.246 0.246 0.220 + 0.247 0.211 0.225 0.215 0.168 0.174 0.202 0.155 0.174 0.130 + 0.163 0.172 0.135 0.134 0.201 0.168 0.189 0.170 0.182 0.152 + 0.156 0.170 0.162 0.158 0.137 0.174 0.182 0.175 0.206 0.151 + 0.209 0.104 0.171 0.168 0.209 0.221 0.148 0.193 0.172 0.153 + 0.197 0.211 0.174 0.169 0.175 0.202 0.175 0.252 0.266 0.210 + 0.212 0.200 0.237 0.266 0.253 0.305 0.269 0.279 0.297 0.310 + 0.312 0.313 0.306 0.327 0.363 0.329 0.326 0.360 0.313 0.303 + + 896 airs_aqua 1574 0.748546E-01 + 0.007 0.000 0.022 0.017 -0.012 -0.022 -0.069 -0.073 -0.053 -0.058 + -0.101 -0.086 -0.098 -0.159 -0.132 -0.121 -0.182 -0.173 -0.189 -0.217 + -0.170 -0.187 -0.209 -0.231 -0.244 -0.253 -0.238 -0.262 -0.274 -0.288 + -0.272 -0.233 -0.293 -0.275 -0.269 -0.251 -0.259 -0.269 -0.306 -0.281 + -0.287 -0.254 -0.284 -0.269 -0.289 -0.251 -0.262 -0.248 -0.281 -0.275 + -0.289 -0.297 -0.297 -0.267 -0.237 -0.234 -0.266 -0.232 -0.239 -0.242 + -0.243 -0.220 -0.266 -0.251 -0.234 -0.227 -0.219 -0.178 -0.191 -0.184 + -0.192 -0.225 -0.208 -0.165 -0.156 -0.110 -0.142 -0.102 -0.087 -0.112 + -0.101 -0.070 -0.100 -0.043 -0.014 -0.044 -0.029 0.012 -0.018 -0.014 + + 897 airs_aqua 1583 0.601718E-01 + 0.310 0.304 0.352 0.345 0.319 0.343 0.293 0.313 0.303 0.306 + 0.286 0.277 0.289 0.238 0.287 0.226 0.217 0.221 0.221 0.186 + 0.217 0.175 0.202 0.196 0.153 0.156 0.172 0.145 0.151 0.113 + 0.146 0.157 0.117 0.114 0.188 0.139 0.169 0.156 0.154 0.136 + 0.149 0.137 0.144 0.136 0.112 0.148 0.157 0.155 0.190 0.127 + 0.200 0.078 0.146 0.155 0.191 0.198 0.119 0.167 0.145 0.121 + 0.178 0.192 0.159 0.153 0.169 0.172 0.147 0.220 0.242 0.184 + 0.185 0.166 0.214 0.243 0.220 0.274 0.232 0.254 0.271 0.274 + 0.289 0.285 0.271 0.298 0.320 0.291 0.289 0.319 0.269 0.262 + + 898 airs_aqua 1593 0.559639E-01 + 1.024 1.021 1.053 1.059 1.031 1.064 1.006 1.027 1.011 1.003 + 0.989 0.960 0.978 0.932 0.994 0.928 0.915 0.921 0.933 0.872 + 0.906 0.891 0.896 0.894 0.843 0.845 0.843 0.842 0.835 0.800 + 0.824 0.822 0.796 0.820 0.875 0.795 0.839 0.835 0.831 0.802 + 0.821 0.813 0.809 0.812 0.790 0.833 0.857 0.793 0.884 0.814 + 0.865 0.753 0.823 0.826 0.868 0.883 0.803 0.853 0.842 0.785 + 0.850 0.876 0.867 0.843 0.841 0.856 0.813 0.911 0.929 0.858 + 0.871 0.873 0.913 0.962 0.924 0.979 0.935 0.939 0.957 0.973 + 1.001 0.979 0.990 1.026 1.034 0.999 1.008 1.035 0.956 0.978 + + 899 airs_aqua 1614 0.672831E-01 + 0.365 0.340 0.370 0.360 0.329 0.316 0.290 0.250 0.264 0.247 + 0.221 0.216 0.233 0.180 0.194 0.194 0.145 0.183 0.144 0.138 + 0.146 0.111 0.101 0.069 0.072 0.073 0.046 0.062 0.029 0.039 + 0.014 -0.009 -0.004 -0.009 -0.040 -0.012 0.026 -0.003 -0.012 -0.021 + -0.032 -0.022 0.005 -0.038 -0.043 -0.001 -0.028 -0.019 0.018 0.003 + -0.035 -0.054 -0.021 -0.012 0.030 0.053 0.002 0.042 0.040 0.035 + 0.048 0.075 0.059 0.048 0.027 0.086 0.080 0.116 0.116 0.150 + 0.125 0.151 0.153 0.220 0.200 0.193 0.203 0.221 0.249 0.245 + 0.237 0.294 0.284 0.313 0.326 0.311 0.347 0.339 0.362 0.348 + + 900 airs_aqua 1627 0.645448E-01 + 0.404 0.394 0.428 0.422 0.396 0.414 0.358 0.368 0.369 0.365 + 0.355 0.365 0.358 0.297 0.355 0.295 0.292 0.284 0.284 0.243 + 0.297 0.262 0.279 0.252 0.212 0.211 0.226 0.201 0.226 0.184 + 0.217 0.227 0.175 0.181 0.242 0.213 0.238 0.214 0.219 0.217 + 0.203 0.209 0.216 0.208 0.182 0.224 0.221 0.234 0.231 0.194 + 0.245 0.144 0.213 0.210 0.257 0.254 0.209 0.257 0.220 0.199 + 0.235 0.254 0.219 0.213 0.225 0.231 0.236 0.296 0.287 0.260 + 0.263 0.226 0.269 0.298 0.267 0.342 0.319 0.326 0.333 0.346 + 0.358 0.356 0.338 0.367 0.411 0.363 0.363 0.414 0.360 0.355 + + 901 airs_aqua 1636 0.739690E-01 + 0.455 0.449 0.466 0.470 0.436 0.440 0.375 0.385 0.396 0.387 + 0.354 0.358 0.361 0.282 0.322 0.322 0.271 0.281 0.258 0.231 + 0.275 0.263 0.253 0.222 0.200 0.201 0.191 0.171 0.169 0.153 + 0.178 0.208 0.151 0.180 0.190 0.200 0.201 0.179 0.152 0.160 + 0.151 0.179 0.168 0.184 0.145 0.208 0.178 0.207 0.175 0.158 + 0.167 0.134 0.153 0.173 0.215 0.223 0.191 0.229 0.188 0.201 + 0.210 0.214 0.189 0.197 0.214 0.217 0.221 0.276 0.271 0.270 + 0.258 0.233 0.252 0.295 0.287 0.343 0.315 0.346 0.354 0.346 + 0.347 0.380 0.364 0.410 0.440 0.403 0.420 0.468 0.431 0.433 + + 902 airs_aqua 1644 0.669950E-01 + 0.036 0.025 0.061 0.044 0.020 0.014 -0.022 -0.064 -0.045 -0.073 + -0.086 -0.086 -0.088 -0.130 -0.110 -0.126 -0.179 -0.147 -0.162 -0.175 + -0.164 -0.195 -0.209 -0.237 -0.227 -0.253 -0.272 -0.265 -0.280 -0.291 + -0.305 -0.327 -0.313 -0.309 -0.345 -0.327 -0.291 -0.301 -0.323 -0.338 + -0.354 -0.340 -0.322 -0.335 -0.341 -0.313 -0.338 -0.334 -0.300 -0.313 + -0.349 -0.369 -0.344 -0.318 -0.287 -0.272 -0.299 -0.278 -0.280 -0.280 + -0.259 -0.238 -0.245 -0.263 -0.287 -0.240 -0.225 -0.195 -0.198 -0.177 + -0.190 -0.157 -0.158 -0.099 -0.115 -0.108 -0.105 -0.091 -0.051 -0.072 + -0.082 -0.016 -0.033 -0.001 0.000 -0.002 0.024 0.016 0.035 0.012 + + 903 airs_aqua 1652 0.634198E-01 + 0.784 0.778 0.810 0.801 0.777 0.793 0.736 0.755 0.753 0.748 + 0.736 0.727 0.731 0.682 0.734 0.664 0.660 0.659 0.660 0.633 + 0.667 0.633 0.650 0.634 0.585 0.596 0.617 0.591 0.595 0.569 + 0.597 0.609 0.556 0.563 0.629 0.592 0.615 0.602 0.606 0.606 + 0.594 0.592 0.594 0.597 0.571 0.604 0.608 0.611 0.633 0.576 + 0.641 0.532 0.612 0.597 0.647 0.649 0.587 0.631 0.609 0.587 + 0.629 0.639 0.612 0.600 0.612 0.623 0.607 0.688 0.692 0.641 + 0.637 0.625 0.659 0.684 0.662 0.729 0.700 0.704 0.713 0.730 + 0.727 0.733 0.725 0.754 0.800 0.757 0.749 0.788 0.747 0.742 + + 904 airs_aqua 1669 0.750432E-01 + 0.493 0.469 0.484 0.466 0.443 0.440 0.382 0.365 0.386 0.379 + 0.343 0.347 0.346 0.278 0.289 0.316 0.252 0.264 0.242 0.226 + 0.269 0.252 0.240 0.206 0.196 0.190 0.190 0.168 0.159 0.147 + 0.165 0.203 0.139 0.159 0.163 0.177 0.169 0.167 0.153 0.133 + 0.131 0.164 0.159 0.157 0.144 0.173 0.148 0.188 0.157 0.141 + 0.149 0.123 0.124 0.160 0.188 0.188 0.165 0.190 0.195 0.180 + 0.178 0.198 0.169 0.196 0.194 0.206 0.210 0.260 0.236 0.249 + 0.253 0.216 0.221 0.275 0.284 0.320 0.302 0.340 0.361 0.332 + 0.344 0.387 0.351 0.406 0.439 0.419 0.431 0.481 0.466 0.470 + + 905 airs_aqua 1674 0.606538E-01 + 0.541 0.534 0.572 0.560 0.551 0.541 0.526 0.493 0.509 0.509 + 0.487 0.487 0.495 0.463 0.472 0.468 0.446 0.474 0.419 0.450 + 0.436 0.401 0.411 0.389 0.376 0.393 0.386 0.375 0.342 0.373 + 0.336 0.305 0.317 0.315 0.293 0.292 0.332 0.342 0.332 0.316 + 0.301 0.296 0.321 0.287 0.289 0.306 0.302 0.296 0.354 0.335 + 0.297 0.284 0.315 0.314 0.325 0.366 0.316 0.340 0.337 0.340 + 0.348 0.370 0.350 0.357 0.322 0.381 0.356 0.409 0.403 0.419 + 0.386 0.415 0.441 0.470 0.448 0.446 0.448 0.470 0.481 0.454 + 0.454 0.507 0.491 0.506 0.490 0.493 0.521 0.496 0.506 0.481 + + 906 airs_aqua 1681 0.696856E-01 + 0.573 0.548 0.573 0.566 0.539 0.522 0.497 0.452 0.478 0.464 + 0.445 0.444 0.466 0.413 0.419 0.420 0.373 0.409 0.380 0.372 + 0.385 0.361 0.347 0.323 0.327 0.326 0.287 0.306 0.291 0.288 + 0.280 0.254 0.264 0.255 0.225 0.232 0.277 0.259 0.254 0.239 + 0.233 0.235 0.259 0.222 0.229 0.255 0.227 0.241 0.274 0.263 + 0.212 0.200 0.230 0.228 0.264 0.292 0.240 0.283 0.279 0.272 + 0.287 0.310 0.277 0.283 0.268 0.311 0.313 0.336 0.344 0.357 + 0.336 0.353 0.373 0.405 0.403 0.406 0.412 0.435 0.461 0.428 + 0.431 0.487 0.476 0.497 0.503 0.509 0.536 0.530 0.545 0.531 + + 907 airs_aqua 1694 0.745160E-01 + 1.495 1.464 1.471 1.465 1.417 1.410 1.356 1.344 1.348 1.343 + 1.324 1.305 1.310 1.231 1.252 1.274 1.208 1.217 1.191 1.183 + 1.219 1.196 1.185 1.148 1.119 1.124 1.125 1.106 1.097 1.098 + 1.110 1.137 1.071 1.103 1.101 1.111 1.127 1.099 1.078 1.068 + 1.069 1.110 1.092 1.109 1.061 1.122 1.090 1.127 1.088 1.090 + 1.078 1.059 1.060 1.101 1.131 1.137 1.109 1.143 1.124 1.134 + 1.134 1.136 1.115 1.125 1.138 1.149 1.152 1.211 1.204 1.212 + 1.214 1.161 1.179 1.225 1.230 1.284 1.264 1.301 1.313 1.323 + 1.305 1.346 1.338 1.381 1.425 1.404 1.419 1.473 1.460 1.480 + + 908 airs_aqua 1708 0.788212E-01 + 0.736 0.707 0.709 0.710 0.678 0.663 0.609 0.575 0.604 0.598 + 0.569 0.572 0.579 0.504 0.505 0.523 0.469 0.495 0.456 0.441 + 0.498 0.475 0.469 0.401 0.443 0.409 0.398 0.403 0.387 0.365 + 0.399 0.400 0.371 0.375 0.361 0.390 0.395 0.373 0.372 0.357 + 0.358 0.380 0.402 0.377 0.377 0.383 0.388 0.384 0.379 0.361 + 0.356 0.337 0.331 0.365 0.401 0.384 0.384 0.397 0.408 0.386 + 0.405 0.419 0.370 0.409 0.410 0.419 0.433 0.477 0.452 0.471 + 0.459 0.422 0.443 0.487 0.492 0.551 0.534 0.546 0.568 0.560 + 0.555 0.606 0.588 0.641 0.667 0.667 0.668 0.709 0.713 0.719 + + 909 airs_aqua 1717 0.623127E-01 + 0.489 0.464 0.486 0.480 0.449 0.451 0.420 0.375 0.392 0.377 + 0.373 0.354 0.365 0.327 0.328 0.333 0.299 0.327 0.284 0.286 + 0.289 0.258 0.255 0.241 0.231 0.230 0.214 0.212 0.198 0.204 + 0.190 0.155 0.171 0.170 0.140 0.140 0.195 0.169 0.172 0.152 + 0.145 0.135 0.164 0.134 0.132 0.166 0.142 0.142 0.181 0.168 + 0.138 0.112 0.141 0.155 0.164 0.197 0.153 0.186 0.197 0.177 + 0.202 0.213 0.183 0.203 0.176 0.237 0.231 0.250 0.249 0.265 + 0.250 0.266 0.288 0.323 0.314 0.307 0.321 0.341 0.366 0.332 + 0.340 0.400 0.390 0.406 0.406 0.423 0.448 0.440 0.461 0.452 + + 910 airs_aqua 1723 0.811001E-01 + 0.395 0.354 0.349 0.345 0.314 0.303 0.256 0.192 0.235 0.219 + 0.212 0.207 0.226 0.154 0.134 0.188 0.120 0.168 0.112 0.100 + 0.139 0.128 0.129 0.053 0.099 0.081 0.048 0.046 0.050 0.033 + 0.064 0.029 0.047 0.026 0.006 0.014 0.058 0.019 0.010 0.009 + 0.001 0.017 0.066 0.026 0.038 0.031 0.020 0.029 0.021 0.015 + -0.008 -0.012 -0.015 0.019 0.057 0.034 0.020 0.052 0.053 0.037 + 0.076 0.063 0.009 0.051 0.055 0.079 0.080 0.089 0.085 0.105 + 0.121 0.079 0.114 0.123 0.137 0.178 0.165 0.188 0.213 0.190 + 0.189 0.238 0.226 0.287 0.301 0.316 0.323 0.352 0.364 0.371 + + 911 airs_aqua 1740 0.811507E-01 + 1.051 1.012 0.995 0.989 0.963 0.947 0.902 0.849 0.880 0.859 + 0.844 0.846 0.862 0.781 0.769 0.817 0.746 0.777 0.734 0.721 + 0.766 0.751 0.760 0.667 0.725 0.693 0.667 0.658 0.659 0.653 + 0.679 0.671 0.664 0.646 0.627 0.643 0.670 0.639 0.619 0.629 + 0.625 0.636 0.682 0.648 0.651 0.650 0.641 0.662 0.629 0.643 + 0.615 0.606 0.600 0.626 0.671 0.642 0.641 0.669 0.668 0.657 + 0.694 0.683 0.626 0.670 0.675 0.699 0.699 0.712 0.720 0.728 + 0.745 0.705 0.727 0.746 0.766 0.815 0.801 0.825 0.852 0.831 + 0.824 0.886 0.873 0.922 0.956 0.966 0.973 1.004 1.024 1.031 + + 912 airs_aqua 1748 0.821181E-01 + 0.592 0.549 0.541 0.543 0.497 0.494 0.455 0.412 0.413 0.407 + 0.412 0.389 0.417 0.353 0.337 0.384 0.334 0.375 0.338 0.327 + 0.347 0.323 0.306 0.284 0.305 0.297 0.254 0.271 0.273 0.255 + 0.270 0.243 0.258 0.237 0.201 0.214 0.264 0.240 0.218 0.229 + 0.219 0.224 0.265 0.235 0.227 0.252 0.239 0.231 0.238 0.217 + 0.194 0.193 0.185 0.223 0.267 0.253 0.208 0.268 0.282 0.239 + 0.280 0.274 0.225 0.272 0.249 0.289 0.303 0.290 0.282 0.303 + 0.315 0.299 0.326 0.344 0.346 0.353 0.371 0.376 0.419 0.382 + 0.389 0.449 0.443 0.484 0.496 0.510 0.525 0.540 0.564 0.577 + + 913 airs_aqua 1751 0.499592E-01 + 1.007 0.997 1.028 1.026 1.009 1.016 1.004 0.965 0.992 0.992 + 0.991 0.977 0.988 0.968 0.971 0.977 0.964 0.971 0.943 0.965 + 0.953 0.931 0.926 0.929 0.913 0.928 0.932 0.913 0.898 0.928 + 0.887 0.867 0.874 0.884 0.860 0.855 0.895 0.904 0.891 0.890 + 0.871 0.859 0.897 0.856 0.855 0.888 0.875 0.842 0.906 0.913 + 0.878 0.858 0.883 0.883 0.878 0.916 0.877 0.887 0.886 0.887 + 0.915 0.908 0.908 0.913 0.886 0.927 0.897 0.937 0.921 0.946 + 0.931 0.938 0.957 0.989 0.971 0.953 0.962 0.973 0.984 0.966 + 0.958 0.998 0.986 0.978 0.973 0.982 1.008 0.978 0.996 0.980 + + 914 airs_aqua 1756 0.786395E-01 + 0.697 0.662 0.666 0.660 0.624 0.619 0.582 0.534 0.530 0.533 + 0.538 0.514 0.541 0.481 0.475 0.500 0.453 0.489 0.450 0.458 + 0.466 0.439 0.424 0.411 0.418 0.420 0.383 0.386 0.392 0.367 + 0.378 0.353 0.376 0.350 0.320 0.324 0.373 0.355 0.346 0.337 + 0.334 0.329 0.369 0.352 0.326 0.356 0.349 0.331 0.364 0.343 + 0.313 0.300 0.304 0.333 0.365 0.373 0.330 0.375 0.381 0.362 + 0.391 0.381 0.351 0.381 0.355 0.402 0.420 0.408 0.401 0.425 + 0.431 0.426 0.450 0.471 0.471 0.474 0.495 0.501 0.545 0.502 + 0.513 0.567 0.568 0.597 0.605 0.622 0.640 0.654 0.669 0.676 + + 915 airs_aqua 1763 0.512345E-01 + 0.313 0.300 0.334 0.318 0.300 0.303 0.281 0.244 0.274 0.260 + 0.265 0.255 0.252 0.235 0.234 0.246 0.232 0.236 0.193 0.218 + 0.206 0.178 0.193 0.182 0.167 0.176 0.184 0.162 0.152 0.160 + 0.131 0.110 0.118 0.130 0.098 0.099 0.136 0.136 0.141 0.119 + 0.104 0.099 0.128 0.094 0.089 0.129 0.111 0.086 0.145 0.145 + 0.118 0.089 0.112 0.116 0.123 0.158 0.114 0.127 0.140 0.137 + 0.151 0.152 0.144 0.148 0.120 0.170 0.150 0.176 0.160 0.189 + 0.172 0.184 0.210 0.238 0.217 0.199 0.211 0.228 0.232 0.211 + 0.207 0.260 0.243 0.245 0.234 0.240 0.272 0.241 0.269 0.245 + + 916 airs_aqua 1766 0.731215E-01 + 0.425 0.386 0.403 0.404 0.367 0.374 0.341 0.300 0.315 0.310 + 0.313 0.295 0.312 0.262 0.264 0.282 0.246 0.285 0.244 0.245 + 0.263 0.232 0.220 0.210 0.209 0.204 0.189 0.192 0.178 0.173 + 0.167 0.156 0.172 0.154 0.109 0.133 0.177 0.160 0.164 0.143 + 0.139 0.140 0.180 0.139 0.126 0.159 0.136 0.130 0.177 0.156 + 0.118 0.098 0.136 0.154 0.157 0.184 0.137 0.176 0.184 0.160 + 0.181 0.187 0.157 0.167 0.149 0.206 0.217 0.200 0.201 0.217 + 0.213 0.214 0.234 0.264 0.262 0.249 0.261 0.280 0.308 0.272 + 0.279 0.329 0.320 0.346 0.338 0.359 0.369 0.374 0.391 0.386 + + 917 airs_aqua 1771 0.793226E-01 + 0.334 0.311 0.296 0.297 0.255 0.247 0.199 0.147 0.188 0.171 + 0.147 0.148 0.169 0.101 0.086 0.126 0.055 0.091 0.039 0.031 + 0.080 0.068 0.063 -0.018 0.032 0.004 -0.028 -0.016 -0.019 -0.043 + -0.012 -0.012 -0.023 -0.039 -0.055 -0.039 -0.014 -0.041 -0.053 -0.058 + -0.062 -0.035 -0.009 -0.040 -0.040 -0.029 -0.042 -0.029 -0.042 -0.040 + -0.071 -0.066 -0.077 -0.059 -0.008 -0.037 -0.036 -0.023 -0.018 -0.026 + 0.012 -0.002 -0.052 -0.008 -0.008 0.000 0.015 0.047 0.038 0.042 + 0.056 0.022 0.043 0.057 0.067 0.121 0.105 0.124 0.156 0.134 + 0.125 0.179 0.169 0.215 0.252 0.249 0.262 0.296 0.302 0.312 + + 918 airs_aqua 1777 0.803611E-01 + 0.438 0.393 0.388 0.384 0.346 0.341 0.299 0.238 0.277 0.257 + 0.247 0.239 0.266 0.193 0.185 0.231 0.176 0.204 0.171 0.139 + 0.160 0.163 0.155 0.104 0.136 0.110 0.091 0.081 0.090 0.076 + 0.094 0.079 0.075 0.055 0.036 0.044 0.083 0.053 0.035 0.039 + 0.034 0.046 0.101 0.065 0.062 0.069 0.057 0.067 0.057 0.041 + 0.030 0.025 0.015 0.040 0.088 0.064 0.048 0.094 0.091 0.074 + 0.123 0.099 0.057 0.090 0.072 0.106 0.116 0.119 0.124 0.150 + 0.147 0.117 0.149 0.168 0.175 0.206 0.203 0.213 0.252 0.224 + 0.233 0.273 0.272 0.329 0.330 0.352 0.358 0.380 0.395 0.407 + + 919 airs_aqua 1780 0.625487E-01 + 0.429 0.405 0.432 0.422 0.397 0.395 0.373 0.324 0.343 0.339 + 0.326 0.319 0.318 0.296 0.299 0.303 0.265 0.295 0.252 0.262 + 0.262 0.238 0.233 0.227 0.209 0.209 0.210 0.198 0.188 0.181 + 0.173 0.144 0.167 0.165 0.120 0.123 0.175 0.158 0.164 0.146 + 0.145 0.132 0.155 0.138 0.120 0.162 0.131 0.131 0.177 0.157 + 0.137 0.107 0.133 0.150 0.150 0.190 0.147 0.172 0.180 0.164 + 0.188 0.197 0.170 0.182 0.147 0.206 0.203 0.227 0.211 0.240 + 0.223 0.240 0.252 0.292 0.280 0.268 0.281 0.301 0.324 0.291 + 0.292 0.342 0.339 0.344 0.347 0.357 0.388 0.373 0.391 0.372 + + 920 airs_aqua 1783 0.795344E-01 + 0.452 0.407 0.406 0.387 0.376 0.358 0.362 0.304 0.286 0.304 + 0.263 0.320 0.326 0.267 0.244 0.278 0.258 0.264 0.217 0.250 + 0.271 0.278 0.239 0.229 0.203 0.257 0.170 0.204 0.195 0.172 + 0.169 0.185 0.192 0.181 0.112 0.143 0.182 0.191 0.187 0.175 + 0.184 0.142 0.176 0.170 0.144 0.154 0.162 0.152 0.172 0.179 + 0.123 0.124 0.137 0.165 0.185 0.214 0.152 0.173 0.207 0.179 + 0.224 0.228 0.148 0.198 0.178 0.211 0.240 0.195 0.176 0.234 + 0.223 0.248 0.214 0.281 0.256 0.241 0.260 0.271 0.323 0.284 + 0.288 0.349 0.345 0.374 0.368 0.365 0.395 0.391 0.426 0.443 + + 921 airs_aqua 1794 0.805340E-01 + 0.384 0.336 0.329 0.330 0.279 0.276 0.245 0.190 0.214 0.201 + 0.201 0.181 0.220 0.140 0.132 0.186 0.125 0.168 0.123 0.110 + 0.131 0.123 0.111 0.072 0.089 0.080 0.057 0.061 0.062 0.041 + 0.063 0.046 0.045 0.022 0.010 0.017 0.071 0.039 0.015 0.015 + 0.012 0.034 0.068 0.035 0.021 0.050 0.032 0.038 0.035 0.015 + -0.005 -0.008 -0.012 0.011 0.059 0.039 0.009 0.062 0.078 0.041 + 0.074 0.070 0.020 0.063 0.038 0.078 0.083 0.092 0.082 0.102 + 0.109 0.085 0.117 0.121 0.135 0.152 0.160 0.160 0.205 0.172 + 0.173 0.228 0.220 0.272 0.269 0.297 0.309 0.317 0.342 0.351 + + 922 airs_aqua 1800 0.805298E-01 + 0.338 0.291 0.286 0.283 0.251 0.233 0.195 0.134 0.169 0.152 + 0.131 0.120 0.157 0.084 0.072 0.121 0.047 0.087 0.039 0.019 + 0.055 0.042 0.045 -0.017 0.017 0.002 -0.027 -0.023 -0.032 -0.047 + -0.010 -0.038 -0.045 -0.058 -0.090 -0.072 -0.032 -0.054 -0.075 -0.075 + -0.080 -0.054 -0.019 -0.054 -0.055 -0.045 -0.056 -0.054 -0.053 -0.074 + -0.088 -0.109 -0.091 -0.077 -0.030 -0.049 -0.074 -0.024 -0.025 -0.048 + -0.008 -0.024 -0.070 -0.029 -0.029 -0.017 -0.013 0.001 0.008 0.029 + 0.033 -0.003 0.037 0.049 0.062 0.096 0.090 0.103 0.147 0.107 + 0.116 0.165 0.166 0.215 0.226 0.244 0.249 0.269 0.290 0.303 + + 923 airs_aqua 1803 0.568858E-01 + 0.327 0.297 0.344 0.330 0.322 0.313 0.304 0.229 0.290 0.294 + 0.282 0.271 0.263 0.252 0.270 0.274 0.256 0.271 0.215 0.255 + 0.237 0.203 0.214 0.204 0.201 0.204 0.206 0.202 0.181 0.203 + 0.185 0.153 0.165 0.158 0.139 0.101 0.173 0.177 0.175 0.178 + 0.161 0.152 0.179 0.149 0.141 0.164 0.131 0.131 0.192 0.172 + 0.158 0.137 0.153 0.163 0.172 0.215 0.154 0.182 0.183 0.166 + 0.192 0.190 0.168 0.193 0.157 0.215 0.170 0.219 0.198 0.232 + 0.209 0.208 0.254 0.266 0.249 0.230 0.231 0.260 0.259 0.235 + 0.232 0.288 0.273 0.285 0.267 0.270 0.289 0.262 0.277 0.252 + + 924 airs_aqua 1806 0.808788E-01 + 0.344 0.307 0.305 0.292 0.258 0.244 0.194 0.126 0.176 0.154 + 0.144 0.141 0.161 0.093 0.081 0.122 0.049 0.088 0.033 0.024 + 0.075 0.068 0.057 -0.015 0.020 -0.002 -0.028 -0.028 -0.040 -0.033 + -0.008 -0.022 -0.020 -0.045 -0.070 -0.032 -0.022 -0.050 -0.050 -0.059 + -0.059 -0.042 0.000 -0.053 -0.037 -0.038 -0.037 -0.038 -0.046 -0.053 + -0.072 -0.074 -0.089 -0.058 -0.006 -0.045 -0.047 -0.013 -0.022 -0.031 + 0.001 0.002 -0.059 -0.014 -0.016 0.002 0.006 0.034 0.025 0.050 + 0.046 -0.002 0.027 0.044 0.065 0.113 0.091 0.124 0.143 0.119 + 0.124 0.173 0.155 0.216 0.236 0.256 0.265 0.298 0.309 0.313 + + 925 airs_aqua 1812 0.476671E-01 + 0.040 0.044 0.088 0.076 0.106 0.059 0.047 -0.040 0.038 0.059 + 0.068 0.065 0.048 0.039 0.065 0.082 0.040 0.034 0.002 0.042 + 0.057 -0.020 -0.015 -0.013 -0.040 0.003 -0.009 -0.035 -0.001 -0.043 + -0.056 -0.095 -0.071 -0.068 -0.107 -0.142 -0.033 -0.037 -0.064 -0.076 + -0.086 -0.102 -0.079 -0.096 -0.066 -0.051 -0.122 -0.177 -0.042 -0.051 + -0.046 -0.092 -0.047 -0.054 -0.055 -0.026 -0.071 -0.028 -0.065 -0.042 + -0.032 -0.044 -0.036 -0.047 -0.095 -0.025 -0.045 0.013 0.000 0.025 + -0.007 0.010 0.028 0.056 0.034 0.005 0.022 0.035 0.012 -0.007 + 0.028 0.041 0.034 0.001 0.014 -0.006 0.028 -0.028 -0.002 -0.041 + + 926 airs_aqua 1826 0.691264E-01 + 0.718 0.676 0.708 0.719 0.681 0.693 0.636 0.641 0.664 0.670 + 0.661 0.652 0.655 0.594 0.640 0.645 0.603 0.604 0.599 0.568 + 0.625 0.601 0.611 0.586 0.551 0.563 0.563 0.539 0.551 0.544 + 0.570 0.590 0.525 0.552 0.585 0.569 0.599 0.584 0.567 0.564 + 0.574 0.576 0.584 0.583 0.533 0.572 0.573 0.588 0.575 0.562 + 0.588 0.515 0.578 0.570 0.597 0.619 0.581 0.634 0.560 0.579 + 0.593 0.595 0.551 0.573 0.567 0.574 0.570 0.638 0.628 0.604 + 0.594 0.565 0.584 0.616 0.584 0.654 0.628 0.652 0.635 0.648 + 0.634 0.650 0.625 0.661 0.691 0.647 0.657 0.695 0.661 0.685 + + 927 airs_aqua 1843 0.678777E-01 + 0.047 0.015 0.050 0.063 0.031 0.039 -0.016 0.011 0.030 0.033 + 0.012 0.017 0.017 -0.041 0.034 0.003 -0.009 -0.016 -0.022 -0.059 + 0.007 -0.027 -0.015 -0.020 -0.062 -0.065 -0.059 -0.070 -0.054 -0.074 + -0.039 -0.035 -0.075 -0.067 -0.022 -0.041 -0.018 -0.019 -0.045 -0.045 + -0.030 -0.027 -0.019 -0.029 -0.079 -0.030 -0.024 -0.013 -0.032 -0.050 + -0.012 -0.099 -0.033 -0.042 0.000 0.006 -0.039 0.012 -0.050 -0.035 + -0.018 -0.026 -0.080 -0.043 -0.054 -0.044 -0.048 0.008 0.007 -0.017 + -0.025 -0.060 -0.037 -0.016 -0.041 0.020 -0.013 -0.001 0.004 -0.004 + -0.011 0.009 -0.020 0.006 0.040 -0.014 -0.010 0.042 -0.015 0.000 + + 928 airs_aqua 1852 0.701924E-01 + 0.060 0.024 0.057 0.064 0.030 0.045 -0.014 -0.010 0.018 0.017 + -0.005 0.004 0.001 -0.053 -0.013 -0.023 -0.051 -0.054 -0.072 -0.089 + -0.032 -0.051 -0.063 -0.081 -0.119 -0.090 -0.098 -0.127 -0.115 -0.115 + -0.090 -0.074 -0.117 -0.108 -0.093 -0.096 -0.073 -0.075 -0.100 -0.107 + -0.098 -0.075 -0.084 -0.083 -0.129 -0.069 -0.095 -0.072 -0.077 -0.109 + -0.086 -0.146 -0.101 -0.088 -0.070 -0.050 -0.101 -0.035 -0.091 -0.071 + -0.069 -0.059 -0.107 -0.084 -0.088 -0.082 -0.081 -0.020 -0.029 -0.053 + -0.059 -0.101 -0.089 -0.046 -0.065 -0.013 -0.033 -0.010 -0.005 -0.016 + -0.025 -0.006 -0.022 0.005 0.040 -0.009 0.010 0.039 -0.001 0.021 + + 929 airs_aqua 1865 0.274503E-01 + -0.060 -0.090 0.004 0.002 -0.004 0.046 0.037 0.035 0.059 0.076 + 0.055 0.102 0.115 0.088 0.107 0.114 0.119 0.089 0.110 0.091 + 0.131 0.082 0.074 0.099 0.071 0.138 0.071 0.065 0.078 0.048 + 0.023 0.076 0.036 0.053 0.019 0.008 -0.005 -0.036 -0.010 -0.015 + -0.052 -0.066 -0.062 -0.077 -0.062 -0.079 -0.072 -0.112 -0.112 -0.132 + -0.100 -0.129 -0.121 -0.115 -0.130 -0.139 -0.102 -0.124 -0.154 -0.115 + -0.122 -0.133 -0.120 -0.120 -0.134 -0.100 -0.082 -0.110 -0.096 -0.101 + -0.118 -0.061 -0.069 -0.052 -0.056 -0.042 -0.067 -0.028 -0.036 -0.054 + -0.011 -0.014 -0.038 -0.005 0.004 -0.049 -0.003 -0.037 -0.160 -0.078 + + 930 airs_aqua 1866 0.305080E-01 + 0.359 0.314 0.399 0.398 0.383 0.419 0.403 0.414 0.428 0.437 + 0.417 0.464 0.493 0.450 0.475 0.473 0.479 0.446 0.461 0.457 + 0.496 0.436 0.426 0.447 0.421 0.485 0.416 0.409 0.418 0.374 + 0.365 0.406 0.350 0.381 0.346 0.337 0.313 0.290 0.313 0.297 + 0.251 0.253 0.245 0.250 0.259 0.233 0.245 0.209 0.202 0.183 + 0.218 0.186 0.198 0.211 0.194 0.193 0.243 0.216 0.184 0.223 + 0.224 0.212 0.224 0.236 0.222 0.264 0.288 0.256 0.272 0.268 + 0.241 0.310 0.291 0.321 0.313 0.332 0.310 0.342 0.337 0.312 + 0.367 0.371 0.336 0.369 0.386 0.336 0.392 0.364 0.258 0.354 + + 931 airs_aqua 1868 0.331968E-01 + 0.401 0.349 0.411 0.404 0.380 0.406 0.393 0.390 0.402 0.404 + 0.385 0.419 0.437 0.397 0.413 0.407 0.414 0.383 0.393 0.379 + 0.411 0.357 0.350 0.365 0.346 0.393 0.335 0.323 0.332 0.297 + 0.287 0.322 0.272 0.297 0.262 0.256 0.233 0.211 0.236 0.223 + 0.183 0.189 0.179 0.187 0.193 0.170 0.183 0.156 0.149 0.126 + 0.165 0.136 0.144 0.161 0.147 0.146 0.189 0.172 0.145 0.183 + 0.181 0.174 0.186 0.196 0.183 0.227 0.245 0.218 0.240 0.239 + 0.212 0.281 0.265 0.291 0.285 0.309 0.295 0.324 0.321 0.303 + 0.354 0.357 0.333 0.366 0.383 0.344 0.400 0.379 0.295 0.389 + + 932 airs_aqua 1869 0.340007E-01 + 0.358 0.300 0.349 0.342 0.302 0.329 0.315 0.295 0.309 0.300 + 0.279 0.297 0.304 0.265 0.272 0.262 0.271 0.236 0.245 0.219 + 0.246 0.204 0.192 0.209 0.183 0.227 0.183 0.168 0.169 0.149 + 0.136 0.170 0.133 0.144 0.123 0.113 0.089 0.071 0.099 0.093 + 0.056 0.057 0.068 0.056 0.060 0.051 0.058 0.033 0.040 0.014 + 0.046 0.024 0.029 0.043 0.031 0.025 0.062 0.049 0.028 0.058 + 0.054 0.052 0.063 0.075 0.061 0.097 0.110 0.091 0.114 0.113 + 0.094 0.150 0.143 0.170 0.166 0.185 0.182 0.215 0.211 0.204 + 0.256 0.262 0.249 0.285 0.305 0.274 0.334 0.317 0.243 0.338 + + 933 airs_aqua 1872 0.373724E-01 + 0.305 0.249 0.288 0.276 0.243 0.263 0.249 0.230 0.245 0.242 + 0.221 0.242 0.249 0.217 0.227 0.220 0.223 0.191 0.200 0.179 + 0.205 0.165 0.153 0.170 0.145 0.186 0.139 0.125 0.134 0.103 + 0.089 0.123 0.088 0.100 0.076 0.066 0.050 0.027 0.054 0.043 + 0.010 0.013 0.014 0.009 0.016 0.003 0.013 -0.011 -0.010 -0.031 + -0.001 -0.021 -0.011 0.001 -0.012 -0.013 0.025 0.011 -0.011 0.026 + 0.024 0.019 0.028 0.039 0.030 0.066 0.084 0.065 0.083 0.082 + 0.064 0.117 0.112 0.132 0.132 0.151 0.138 0.172 0.167 0.156 + 0.204 0.207 0.195 0.226 0.242 0.217 0.272 0.264 0.198 0.289 + + 934 airs_aqua 1873 0.360905E-01 + 0.194 0.140 0.180 0.170 0.143 0.163 0.146 0.135 0.151 0.155 + 0.130 0.164 0.177 0.147 0.160 0.156 0.160 0.132 0.146 0.131 + 0.163 0.117 0.112 0.126 0.105 0.156 0.101 0.090 0.106 0.068 + 0.055 0.087 0.051 0.063 0.039 0.031 0.014 -0.015 0.012 0.002 + -0.035 -0.036 -0.037 -0.043 -0.032 -0.050 -0.042 -0.064 -0.070 -0.084 + -0.057 -0.082 -0.074 -0.062 -0.078 -0.077 -0.036 -0.057 -0.085 -0.043 + -0.047 -0.054 -0.045 -0.038 -0.045 -0.012 0.006 -0.014 -0.004 -0.004 + -0.026 0.032 0.019 0.039 0.036 0.053 0.039 0.069 0.062 0.049 + 0.096 0.099 0.084 0.113 0.129 0.107 0.157 0.150 0.083 0.175 + + 935 airs_aqua 1876 0.323904E-01 + 0.039 -0.016 0.034 0.031 0.008 0.032 0.025 0.017 0.037 0.045 + 0.026 0.063 0.080 0.047 0.067 0.068 0.075 0.044 0.068 0.048 + 0.081 0.030 0.029 0.044 0.022 0.079 0.019 0.011 0.027 -0.005 + -0.023 0.013 -0.025 -0.014 -0.044 -0.047 -0.072 -0.096 -0.072 -0.078 + -0.115 -0.124 -0.119 -0.129 -0.121 -0.137 -0.130 -0.159 -0.159 -0.175 + -0.152 -0.177 -0.168 -0.155 -0.174 -0.175 -0.137 -0.154 -0.179 -0.142 + -0.147 -0.152 -0.145 -0.139 -0.144 -0.110 -0.095 -0.120 -0.106 -0.107 + -0.123 -0.072 -0.084 -0.067 -0.075 -0.055 -0.069 -0.037 -0.048 -0.061 + -0.023 -0.019 -0.038 -0.006 0.005 -0.027 0.020 0.008 -0.066 0.021 + + 936 airs_aqua 1881 0.423722E-01 + 0.095 0.038 0.046 0.033 0.001 0.001 -0.014 -0.032 -0.018 -0.023 + -0.050 -0.033 -0.027 -0.055 -0.050 -0.060 -0.060 -0.086 -0.078 -0.101 + -0.082 -0.110 -0.122 -0.112 -0.128 -0.103 -0.135 -0.148 -0.142 -0.174 + -0.177 -0.159 -0.186 -0.176 -0.194 -0.199 -0.215 -0.233 -0.210 -0.220 + -0.247 -0.242 -0.239 -0.239 -0.237 -0.246 -0.238 -0.256 -0.255 -0.267 + -0.246 -0.264 -0.252 -0.241 -0.251 -0.249 -0.218 -0.229 -0.249 -0.218 + -0.216 -0.220 -0.211 -0.203 -0.203 -0.176 -0.161 -0.175 -0.163 -0.164 + -0.183 -0.133 -0.142 -0.117 -0.121 -0.102 -0.111 -0.087 -0.091 -0.093 + -0.055 -0.048 -0.057 -0.034 -0.017 -0.026 0.020 0.028 -0.005 0.076 + + 937 airs_aqua 1882 0.428162E-01 + 0.116 0.058 0.062 0.050 0.015 0.016 0.001 -0.014 -0.005 -0.008 + -0.032 -0.018 -0.013 -0.040 -0.033 -0.046 -0.045 -0.072 -0.064 -0.086 + -0.070 -0.097 -0.111 -0.102 -0.122 -0.098 -0.127 -0.139 -0.132 -0.166 + -0.170 -0.153 -0.177 -0.170 -0.185 -0.190 -0.203 -0.224 -0.202 -0.212 + -0.237 -0.231 -0.229 -0.231 -0.226 -0.233 -0.223 -0.244 -0.238 -0.254 + -0.231 -0.249 -0.238 -0.226 -0.234 -0.231 -0.203 -0.216 -0.230 -0.202 + -0.196 -0.200 -0.191 -0.184 -0.186 -0.156 -0.139 -0.154 -0.139 -0.140 + -0.158 -0.111 -0.118 -0.094 -0.099 -0.077 -0.085 -0.064 -0.067 -0.072 + -0.036 -0.033 -0.034 -0.015 -0.002 -0.008 0.035 0.047 0.018 0.099 + + 938 airs_aqua 1883 0.429596E-01 + 0.060 0.002 0.004 -0.010 -0.042 -0.042 -0.053 -0.073 -0.063 -0.065 + -0.086 -0.071 -0.070 -0.094 -0.087 -0.097 -0.094 -0.120 -0.114 -0.134 + -0.116 -0.145 -0.156 -0.148 -0.164 -0.143 -0.172 -0.185 -0.180 -0.207 + -0.216 -0.200 -0.221 -0.218 -0.231 -0.233 -0.249 -0.271 -0.245 -0.253 + -0.278 -0.275 -0.270 -0.275 -0.273 -0.276 -0.270 -0.287 -0.284 -0.295 + -0.274 -0.288 -0.278 -0.267 -0.279 -0.274 -0.244 -0.255 -0.268 -0.239 + -0.239 -0.239 -0.231 -0.224 -0.224 -0.197 -0.183 -0.196 -0.184 -0.180 + -0.198 -0.154 -0.155 -0.138 -0.145 -0.129 -0.138 -0.113 -0.118 -0.125 + -0.090 -0.089 -0.093 -0.073 -0.058 -0.063 -0.021 -0.011 -0.040 0.040 + + 939 airs_aqua 1911 0.416192E-01 + -0.004 -0.068 -0.061 -0.075 -0.108 -0.105 -0.117 -0.136 -0.128 -0.126 + -0.150 -0.132 -0.126 -0.153 -0.146 -0.150 -0.149 -0.174 -0.163 -0.186 + -0.170 -0.202 -0.210 -0.199 -0.218 -0.184 -0.219 -0.234 -0.224 -0.256 + -0.259 -0.242 -0.265 -0.262 -0.280 -0.283 -0.299 -0.326 -0.299 -0.305 + -0.333 -0.335 -0.325 -0.336 -0.331 -0.338 -0.331 -0.349 -0.345 -0.361 + -0.342 -0.357 -0.347 -0.333 -0.346 -0.344 -0.313 -0.326 -0.343 -0.309 + -0.313 -0.312 -0.306 -0.299 -0.299 -0.275 -0.258 -0.273 -0.258 -0.260 + -0.278 -0.234 -0.238 -0.220 -0.226 -0.207 -0.215 -0.187 -0.195 -0.200 + -0.160 -0.159 -0.166 -0.138 -0.126 -0.131 -0.086 -0.083 -0.111 -0.026 + + 940 airs_aqua 1917 0.444438E-01 + -0.413 -0.471 -0.513 -0.533 -0.572 -0.600 -0.611 -0.642 -0.641 -0.654 + -0.671 -0.679 -0.685 -0.698 -0.695 -0.708 -0.708 -0.716 -0.724 -0.743 + -0.734 -0.732 -0.757 -0.757 -0.768 -0.761 -0.775 -0.776 -0.784 -0.806 + -0.799 -0.800 -0.817 -0.809 -0.823 -0.822 -0.843 -0.844 -0.829 -0.831 + -0.844 -0.839 -0.833 -0.834 -0.845 -0.836 -0.832 -0.846 -0.835 -0.844 + -0.836 -0.836 -0.820 -0.823 -0.821 -0.816 -0.803 -0.805 -0.810 -0.795 + -0.792 -0.793 -0.786 -0.779 -0.772 -0.756 -0.753 -0.752 -0.738 -0.741 + -0.761 -0.731 -0.733 -0.723 -0.718 -0.704 -0.711 -0.696 -0.684 -0.688 + -0.659 -0.662 -0.644 -0.631 -0.607 -0.594 -0.547 -0.515 -0.501 -0.436 + + 941 airs_aqua 1918 0.439809E-01 + -0.500 -0.548 -0.574 -0.599 -0.629 -0.653 -0.657 -0.688 -0.678 -0.685 + -0.701 -0.706 -0.703 -0.710 -0.706 -0.728 -0.718 -0.729 -0.735 -0.757 + -0.753 -0.749 -0.777 -0.765 -0.773 -0.769 -0.785 -0.796 -0.798 -0.823 + -0.825 -0.827 -0.833 -0.834 -0.846 -0.845 -0.864 -0.874 -0.862 -0.877 + -0.883 -0.875 -0.875 -0.883 -0.886 -0.878 -0.876 -0.884 -0.885 -0.883 + -0.874 -0.877 -0.864 -0.862 -0.859 -0.858 -0.836 -0.846 -0.841 -0.825 + -0.817 -0.814 -0.804 -0.799 -0.792 -0.776 -0.774 -0.775 -0.758 -0.756 + -0.783 -0.750 -0.748 -0.742 -0.738 -0.728 -0.737 -0.722 -0.719 -0.726 + -0.697 -0.703 -0.689 -0.684 -0.666 -0.647 -0.617 -0.589 -0.578 -0.525 + + 942 airs_aqua 1924 0.438055E-01 + -0.522 -0.577 -0.602 -0.631 -0.671 -0.699 -0.706 -0.734 -0.725 -0.743 + -0.762 -0.771 -0.778 -0.783 -0.781 -0.808 -0.799 -0.817 -0.835 -0.846 + -0.847 -0.849 -0.879 -0.863 -0.878 -0.878 -0.891 -0.902 -0.899 -0.926 + -0.935 -0.937 -0.942 -0.936 -0.947 -0.944 -0.962 -0.966 -0.964 -0.985 + -0.974 -0.978 -0.975 -0.979 -0.989 -0.978 -0.978 -0.988 -0.987 -0.988 + -0.973 -0.982 -0.964 -0.968 -0.963 -0.958 -0.933 -0.949 -0.946 -0.931 + -0.918 -0.927 -0.908 -0.905 -0.894 -0.879 -0.872 -0.866 -0.852 -0.845 + -0.874 -0.848 -0.840 -0.829 -0.816 -0.807 -0.814 -0.793 -0.783 -0.783 + -0.762 -0.761 -0.741 -0.732 -0.712 -0.694 -0.655 -0.624 -0.610 -0.554 + + 943 airs_aqua 1928 0.421038E-01 + -0.381 -0.446 -0.470 -0.496 -0.531 -0.569 -0.567 -0.605 -0.594 -0.612 + -0.630 -0.631 -0.635 -0.650 -0.652 -0.672 -0.664 -0.683 -0.698 -0.719 + -0.712 -0.718 -0.745 -0.739 -0.749 -0.733 -0.763 -0.769 -0.771 -0.801 + -0.800 -0.810 -0.814 -0.813 -0.819 -0.824 -0.838 -0.852 -0.841 -0.852 + -0.861 -0.857 -0.854 -0.854 -0.865 -0.857 -0.852 -0.867 -0.863 -0.864 + -0.852 -0.853 -0.845 -0.835 -0.836 -0.826 -0.806 -0.819 -0.812 -0.801 + -0.796 -0.791 -0.781 -0.770 -0.755 -0.748 -0.739 -0.739 -0.722 -0.711 + -0.742 -0.712 -0.705 -0.691 -0.696 -0.668 -0.680 -0.663 -0.653 -0.655 + -0.627 -0.623 -0.613 -0.603 -0.581 -0.558 -0.522 -0.493 -0.479 -0.420 + + 944 airs_aqua 1937 0.409952E-01 + -0.522 -0.581 -0.580 -0.626 -0.661 -0.671 -0.688 -0.721 -0.717 -0.747 + -0.757 -0.771 -0.772 -0.792 -0.793 -0.812 -0.818 -0.851 -0.853 -0.891 + -0.879 -0.892 -0.929 -0.913 -0.931 -0.913 -0.953 -0.956 -0.954 -0.988 + -0.991 -0.988 -1.007 -0.999 -1.000 -1.005 -1.024 -1.046 -1.039 -1.052 + -1.041 -1.040 -1.042 -1.054 -1.058 -1.066 -1.057 -1.061 -1.072 -1.056 + -1.051 -1.052 -1.043 -1.036 -1.030 -1.029 -0.992 -1.011 -1.013 -0.997 + -0.981 -0.976 -0.970 -0.956 -0.954 -0.944 -0.923 -0.920 -0.893 -0.886 + -0.915 -0.890 -0.881 -0.860 -0.857 -0.830 -0.836 -0.812 -0.810 -0.800 + -0.788 -0.775 -0.761 -0.750 -0.727 -0.703 -0.656 -0.646 -0.644 -0.591 + + 945 airs_aqua 1941 0.375243E-01 + -0.274 -0.386 -0.409 -0.495 -0.549 -0.582 -0.596 -0.656 -0.645 -0.692 + -0.718 -0.727 -0.746 -0.777 -0.775 -0.814 -0.819 -0.866 -0.903 -0.937 + -0.932 -0.942 -0.990 -0.969 -0.999 -0.973 -1.018 -1.054 -1.039 -1.083 + -1.093 -1.086 -1.099 -1.080 -1.097 -1.093 -1.125 -1.132 -1.138 -1.154 + -1.152 -1.132 -1.149 -1.149 -1.152 -1.163 -1.154 -1.146 -1.179 -1.147 + -1.150 -1.146 -1.143 -1.135 -1.136 -1.129 -1.084 -1.109 -1.110 -1.087 + -1.069 -1.082 -1.056 -1.040 -1.028 -1.016 -0.991 -0.982 -0.948 -0.931 + -0.959 -0.932 -0.921 -0.881 -0.889 -0.842 -0.845 -0.803 -0.795 -0.781 + -0.761 -0.727 -0.705 -0.680 -0.644 -0.616 -0.546 -0.506 -0.460 -0.384 + + 946 airs_aqua 2099 -0.299826E-01 + 2.160 1.779 2.335 2.546 2.597 2.714 2.810 2.910 2.934 2.875 + 3.176 3.005 3.051 3.347 3.014 3.048 3.464 3.067 3.109 3.479 + 3.201 2.925 3.464 2.945 3.017 3.640 2.974 3.133 3.597 3.240 + 2.958 3.756 3.015 3.259 3.647 3.139 2.961 3.586 3.133 3.186 + 3.569 3.009 3.128 3.686 3.109 3.065 3.710 3.174 2.950 3.564 + 3.048 3.178 3.577 3.050 3.011 3.491 3.110 3.040 3.468 3.005 + 3.019 3.490 3.013 3.065 3.386 3.086 3.187 3.239 2.973 2.986 + 3.308 3.028 2.908 3.248 2.905 2.909 3.033 2.816 2.838 2.978 + 2.577 2.739 2.667 2.730 2.598 2.750 2.337 2.005 1.446 1.804 + + 947 airs_aqua 2100 -0.200706E-01 + -1.887 -1.845 -1.458 -1.229 -1.231 -0.860 -0.784 -0.683 -0.381 -0.269 + -0.313 0.008 0.162 0.124 0.290 0.471 0.452 0.610 0.712 0.667 + 0.876 0.884 0.858 1.009 1.128 1.205 1.103 1.210 1.249 1.390 + 1.255 1.426 1.404 1.464 1.399 1.485 1.504 1.416 1.563 1.615 + 1.512 1.462 1.566 1.555 1.550 1.547 1.557 1.525 1.504 1.467 + 1.461 1.548 1.436 1.436 1.438 1.301 1.315 1.386 1.230 1.203 + 1.227 1.200 1.111 1.050 0.938 0.987 0.876 0.751 0.716 0.662 + 0.540 0.551 0.358 0.315 0.219 0.094 -0.102 -0.142 -0.240 -0.504 + -0.609 -0.730 -1.041 -0.908 -1.169 -1.484 -1.576 -1.793 -2.385 -2.365 + + 948 airs_aqua 2101 -0.101323E-01 + 1.455 1.151 1.741 2.015 2.023 2.298 2.493 2.360 2.681 2.748 + 2.565 2.938 2.917 2.804 3.080 3.071 2.769 2.967 3.096 2.668 + 3.084 2.951 2.458 2.792 2.819 2.808 2.652 2.738 2.544 2.982 + 2.592 2.689 2.697 2.859 2.395 2.813 2.649 2.301 2.796 2.785 + 2.343 2.507 2.666 2.408 2.569 2.648 2.499 2.621 2.475 2.288 + 2.596 2.556 2.195 2.543 2.507 2.370 2.647 2.572 2.308 2.568 + 2.737 2.398 2.608 2.589 2.312 2.666 2.633 2.290 2.571 2.553 + 2.395 2.750 2.544 2.524 2.563 2.629 2.249 2.502 2.484 2.192 + 2.216 2.365 1.907 2.299 2.124 1.651 1.839 1.407 0.738 0.901 + + 949 airs_aqua 2103 0.135202E-01 + -11.024-10.309 -9.608 -8.989 -8.514 -7.861 -7.440 -6.975 -6.518 -6.190 + -5.837 -5.414 -5.098 -4.930 -4.649 -4.437 -4.197 -4.055 -3.858 -3.715 + -3.582 -3.539 -3.387 -3.249 -3.112 -2.902 -2.975 -2.889 -2.774 -2.711 + -2.676 -2.477 -2.505 -2.398 -2.446 -2.340 -2.374 -2.347 -2.248 -2.211 + -2.217 -2.235 -2.211 -2.132 -2.192 -2.199 -2.240 -2.215 -2.287 -2.199 + -2.285 -2.262 -2.308 -2.334 -2.407 -2.434 -2.411 -2.441 -2.578 -2.630 + -2.649 -2.831 -2.888 -2.956 -3.107 -3.179 -3.282 -3.440 -3.499 -3.626 + -3.825 -4.026 -4.259 -4.347 -4.644 -4.851 -5.068 -5.383 -5.651 -5.944 + -6.350 -6.806 -7.206 -7.539 -8.073 -8.639 -9.192 -9.783-10.501-11.245 + + 950 airs_aqua 2104 0.265440E-01 + -9.297 -8.643 -7.943 -7.281 -6.894 -6.331 -5.905 -5.541 -5.119 -4.788 + -4.540 -4.186 -3.950 -3.791 -3.560 -3.332 -3.128 -3.032 -2.846 -2.736 + -2.570 -2.560 -2.427 -2.319 -2.185 -2.057 -2.099 -2.039 -1.957 -1.848 + -1.846 -1.732 -1.722 -1.646 -1.690 -1.615 -1.628 -1.618 -1.544 -1.516 + -1.488 -1.532 -1.500 -1.456 -1.509 -1.497 -1.508 -1.477 -1.536 -1.501 + -1.538 -1.544 -1.594 -1.596 -1.626 -1.656 -1.634 -1.677 -1.778 -1.793 + -1.843 -1.932 -1.995 -2.080 -2.196 -2.198 -2.334 -2.450 -2.499 -2.614 + -2.738 -2.893 -3.097 -3.199 -3.448 -3.656 -3.800 -4.068 -4.337 -4.587 + -4.997 -5.296 -5.692 -5.975 -6.482 -6.950 -7.463 -8.165 -8.812 -9.487 + + 951 airs_aqua 2106 0.500200E-01 + -0.538 -0.504 -0.405 -0.353 -0.330 -0.278 -0.212 -0.173 -0.150 -0.114 + -0.097 -0.062 -0.041 -0.044 -0.005 -0.005 0.008 0.018 0.001 0.009 + 0.028 -0.007 -0.009 0.006 0.015 0.029 -0.016 -0.012 -0.016 -0.011 + -0.033 -0.025 -0.039 -0.031 -0.040 -0.033 -0.071 -0.069 -0.075 -0.091 + -0.075 -0.088 -0.090 -0.083 -0.094 -0.100 -0.093 -0.080 -0.115 -0.078 + -0.092 -0.086 -0.088 -0.072 -0.083 -0.068 -0.041 -0.040 -0.049 -0.047 + -0.027 -0.036 -0.033 -0.030 -0.028 -0.004 -0.015 -0.017 -0.002 0.018 + -0.022 -0.020 -0.033 -0.026 -0.052 -0.057 -0.072 -0.086 -0.105 -0.132 + -0.173 -0.194 -0.229 -0.252 -0.306 -0.352 -0.404 -0.474 -0.562 -0.608 + + 952 airs_aqua 2107 0.575348E-01 + 0.081 0.035 0.040 0.027 -0.001 -0.001 0.013 0.011 0.035 0.032 + 0.021 0.026 0.050 0.041 0.042 0.052 0.046 0.045 0.040 0.033 + 0.051 0.028 0.027 0.029 0.035 0.025 0.002 -0.014 -0.020 0.010 + -0.024 -0.022 -0.036 -0.018 -0.034 -0.052 -0.058 -0.071 -0.062 -0.078 + -0.078 -0.081 -0.083 -0.074 -0.093 -0.082 -0.112 -0.087 -0.093 -0.076 + -0.077 -0.072 -0.071 -0.075 -0.056 -0.064 -0.044 -0.047 -0.041 -0.035 + -0.023 -0.021 -0.002 -0.004 0.004 0.017 0.018 0.011 0.031 0.042 + 0.016 0.029 0.019 0.033 0.020 0.016 0.008 0.006 0.003 -0.010 + -0.021 -0.007 -0.012 -0.022 -0.024 -0.028 0.003 0.008 -0.018 0.021 + + 953 airs_aqua 2108 0.620511E-01 + 0.038 -0.014 -0.037 -0.052 -0.078 -0.102 -0.092 -0.091 -0.084 -0.094 + -0.098 -0.104 -0.094 -0.101 -0.104 -0.095 -0.089 -0.098 -0.114 -0.116 + -0.107 -0.122 -0.127 -0.128 -0.130 -0.130 -0.145 -0.157 -0.156 -0.152 + -0.164 -0.156 -0.179 -0.176 -0.175 -0.182 -0.198 -0.200 -0.197 -0.199 + -0.198 -0.203 -0.190 -0.196 -0.206 -0.218 -0.206 -0.212 -0.206 -0.190 + -0.211 -0.202 -0.199 -0.208 -0.189 -0.209 -0.186 -0.185 -0.187 -0.173 + -0.162 -0.167 -0.160 -0.147 -0.154 -0.145 -0.134 -0.144 -0.141 -0.122 + -0.140 -0.127 -0.129 -0.109 -0.124 -0.111 -0.136 -0.124 -0.120 -0.112 + -0.117 -0.120 -0.124 -0.116 -0.119 -0.113 -0.076 -0.079 -0.073 -0.024 + + 954 airs_aqua 2109 0.627320E-01 + -0.038 -0.086 -0.111 -0.131 -0.156 -0.179 -0.173 -0.185 -0.175 -0.177 + -0.181 -0.174 -0.167 -0.179 -0.171 -0.171 -0.158 -0.165 -0.176 -0.183 + -0.176 -0.188 -0.200 -0.197 -0.190 -0.195 -0.211 -0.225 -0.231 -0.227 + -0.241 -0.241 -0.256 -0.258 -0.262 -0.270 -0.275 -0.287 -0.280 -0.282 + -0.294 -0.299 -0.288 -0.289 -0.304 -0.305 -0.306 -0.309 -0.306 -0.295 + -0.294 -0.299 -0.285 -0.294 -0.283 -0.280 -0.262 -0.260 -0.256 -0.253 + -0.246 -0.232 -0.236 -0.220 -0.228 -0.212 -0.199 -0.214 -0.201 -0.189 + -0.210 -0.193 -0.201 -0.194 -0.205 -0.193 -0.200 -0.204 -0.203 -0.198 + -0.210 -0.217 -0.216 -0.208 -0.203 -0.209 -0.176 -0.166 -0.157 -0.110 + + 955 airs_aqua 2110 0.605728E-01 + -0.187 -0.239 -0.255 -0.279 -0.306 -0.327 -0.332 -0.321 -0.330 -0.330 + -0.336 -0.335 -0.331 -0.344 -0.343 -0.341 -0.340 -0.348 -0.351 -0.364 + -0.354 -0.372 -0.375 -0.381 -0.375 -0.381 -0.392 -0.402 -0.408 -0.403 + -0.411 -0.406 -0.423 -0.419 -0.425 -0.433 -0.438 -0.453 -0.424 -0.430 + -0.445 -0.456 -0.432 -0.432 -0.452 -0.446 -0.449 -0.456 -0.447 -0.440 + -0.448 -0.445 -0.439 -0.433 -0.440 -0.434 -0.424 -0.410 -0.421 -0.417 + -0.413 -0.397 -0.399 -0.393 -0.403 -0.384 -0.379 -0.394 -0.374 -0.370 + -0.388 -0.366 -0.373 -0.350 -0.364 -0.358 -0.356 -0.356 -0.357 -0.345 + -0.351 -0.348 -0.354 -0.339 -0.342 -0.334 -0.313 -0.297 -0.297 -0.235 + + 956 airs_aqua 2111 0.561995E-01 + -0.326 -0.399 -0.420 -0.444 -0.480 -0.497 -0.509 -0.504 -0.507 -0.504 + -0.511 -0.507 -0.493 -0.514 -0.503 -0.502 -0.493 -0.501 -0.507 -0.518 + -0.508 -0.529 -0.533 -0.530 -0.532 -0.537 -0.550 -0.566 -0.573 -0.560 + -0.587 -0.574 -0.599 -0.597 -0.614 -0.620 -0.629 -0.645 -0.618 -0.618 + -0.641 -0.660 -0.630 -0.643 -0.646 -0.658 -0.651 -0.664 -0.644 -0.645 + -0.638 -0.648 -0.633 -0.627 -0.629 -0.624 -0.603 -0.599 -0.605 -0.586 + -0.589 -0.567 -0.570 -0.562 -0.568 -0.544 -0.543 -0.555 -0.534 -0.532 + -0.549 -0.527 -0.533 -0.512 -0.533 -0.535 -0.531 -0.531 -0.534 -0.530 + -0.529 -0.533 -0.537 -0.517 -0.516 -0.516 -0.485 -0.467 -0.463 -0.384 + + 957 airs_aqua 2112 0.510602E-01 + -0.543 -0.621 -0.631 -0.654 -0.691 -0.698 -0.711 -0.711 -0.709 -0.707 + -0.719 -0.706 -0.689 -0.714 -0.700 -0.702 -0.687 -0.702 -0.696 -0.715 + -0.699 -0.726 -0.730 -0.721 -0.730 -0.723 -0.740 -0.749 -0.751 -0.752 + -0.772 -0.757 -0.773 -0.784 -0.796 -0.803 -0.811 -0.831 -0.805 -0.810 + -0.827 -0.851 -0.818 -0.835 -0.838 -0.845 -0.837 -0.852 -0.833 -0.842 + -0.830 -0.843 -0.834 -0.822 -0.830 -0.831 -0.805 -0.801 -0.813 -0.788 + -0.797 -0.780 -0.783 -0.770 -0.776 -0.753 -0.750 -0.765 -0.745 -0.748 + -0.767 -0.741 -0.744 -0.727 -0.747 -0.748 -0.741 -0.739 -0.746 -0.745 + -0.732 -0.736 -0.746 -0.726 -0.720 -0.725 -0.696 -0.678 -0.681 -0.600 + + 958 airs_aqua 2113 0.460380E-01 + -0.767 -0.843 -0.847 -0.865 -0.892 -0.888 -0.896 -0.893 -0.878 -0.869 + -0.875 -0.852 -0.831 -0.857 -0.838 -0.831 -0.818 -0.834 -0.816 -0.834 + -0.814 -0.850 -0.847 -0.836 -0.844 -0.825 -0.851 -0.865 -0.857 -0.869 + -0.893 -0.867 -0.888 -0.894 -0.921 -0.918 -0.935 -0.961 -0.931 -0.941 + -0.960 -0.982 -0.958 -0.972 -0.971 -0.982 -0.977 -0.997 -0.977 -0.993 + -0.976 -0.994 -0.982 -0.963 -0.976 -0.982 -0.950 -0.947 -0.965 -0.934 + -0.942 -0.930 -0.933 -0.925 -0.922 -0.902 -0.891 -0.916 -0.891 -0.902 + -0.923 -0.885 -0.897 -0.877 -0.903 -0.898 -0.901 -0.895 -0.906 -0.918 + -0.899 -0.908 -0.927 -0.910 -0.906 -0.921 -0.893 -0.884 -0.903 -0.815 + + 959 airs_aqua 2114 0.420995E-01 + -0.892 -0.969 -0.966 -0.976 -1.015 -0.996 -1.003 -1.005 -0.997 -0.973 + -0.982 -0.960 -0.936 -0.967 -0.936 -0.930 -0.910 -0.925 -0.901 -0.929 + -0.898 -0.933 -0.933 -0.912 -0.925 -0.881 -0.929 -0.932 -0.921 -0.935 + -0.965 -0.923 -0.952 -0.962 -0.982 -0.988 -0.990 -1.026 -1.002 -0.997 + -1.036 -1.057 -1.028 -1.054 -1.042 -1.058 -1.061 -1.070 -1.060 -1.077 + -1.060 -1.080 -1.065 -1.053 -1.068 -1.074 -1.050 -1.047 -1.084 -1.039 + -1.045 -1.049 -1.044 -1.040 -1.045 -1.026 -1.006 -1.041 -1.017 -1.026 + -1.048 -1.008 -1.021 -1.006 -1.033 -1.027 -1.024 -1.011 -1.017 -1.037 + -1.020 -1.026 -1.049 -1.026 -1.015 -1.035 -1.008 -0.996 -1.027 -0.935 + + 960 airs_aqua 2115 0.393321E-01 + -0.934 -1.007 -0.997 -1.003 -1.027 -1.008 -1.013 -1.018 -0.994 -0.976 + -0.988 -0.946 -0.924 -0.947 -0.918 -0.910 -0.894 -0.907 -0.877 -0.898 + -0.862 -0.904 -0.896 -0.885 -0.891 -0.851 -0.891 -0.898 -0.881 -0.905 + -0.924 -0.884 -0.916 -0.916 -0.950 -0.948 -0.973 -0.998 -0.974 -0.983 + -1.008 -1.033 -1.017 -1.034 -1.032 -1.043 -1.038 -1.063 -1.055 -1.076 + -1.056 -1.084 -1.066 -1.056 -1.072 -1.080 -1.047 -1.058 -1.083 -1.044 + -1.058 -1.061 -1.054 -1.055 -1.047 -1.026 -1.021 -1.044 -1.026 -1.041 + -1.063 -1.023 -1.039 -1.017 -1.043 -1.034 -1.041 -1.027 -1.040 -1.060 + -1.028 -1.038 -1.062 -1.039 -1.030 -1.056 -1.023 -1.020 -1.058 -0.968 + + 961 airs_aqua 2116 0.374861E-01 + -0.962 -1.034 -1.018 -1.022 -1.038 -1.016 -1.019 -1.021 -0.993 -0.969 + -0.979 -0.939 -0.911 -0.939 -0.904 -0.891 -0.877 -0.890 -0.852 -0.871 + -0.832 -0.880 -0.871 -0.857 -0.864 -0.811 -0.867 -0.863 -0.850 -0.879 + -0.892 -0.851 -0.890 -0.882 -0.917 -0.921 -0.944 -0.976 -0.950 -0.960 + -0.993 -1.016 -1.003 -1.021 -1.014 -1.030 -1.028 -1.050 -1.045 -1.067 + -1.049 -1.083 -1.060 -1.052 -1.067 -1.076 -1.046 -1.061 -1.090 -1.044 + -1.059 -1.063 -1.058 -1.060 -1.052 -1.029 -1.021 -1.051 -1.030 -1.048 + -1.071 -1.030 -1.046 -1.026 -1.048 -1.044 -1.052 -1.032 -1.046 -1.074 + -1.035 -1.045 -1.073 -1.051 -1.040 -1.071 -1.042 -1.037 -1.082 -0.992 + + 962 airs_aqua 2117 0.361424E-01 + -0.970 -1.039 -1.018 -1.015 -1.028 -1.007 -1.012 -1.006 -0.979 -0.950 + -0.957 -0.911 -0.885 -0.908 -0.868 -0.859 -0.841 -0.853 -0.817 -0.828 + -0.790 -0.835 -0.828 -0.817 -0.824 -0.766 -0.824 -0.825 -0.806 -0.837 + -0.855 -0.807 -0.851 -0.841 -0.885 -0.886 -0.912 -0.944 -0.917 -0.929 + -0.960 -0.988 -0.976 -0.997 -0.990 -1.007 -1.005 -1.027 -1.025 -1.050 + -1.032 -1.064 -1.044 -1.030 -1.058 -1.060 -1.029 -1.043 -1.070 -1.031 + -1.043 -1.049 -1.042 -1.044 -1.037 -1.013 -1.005 -1.035 -1.018 -1.034 + -1.057 -1.014 -1.033 -1.011 -1.038 -1.025 -1.040 -1.020 -1.038 -1.060 + -1.029 -1.037 -1.060 -1.040 -1.028 -1.068 -1.038 -1.036 -1.087 -0.997 + + 963 airs_aqua 2118 0.350331E-01 + -0.951 -1.015 -0.995 -0.991 -1.006 -0.972 -0.973 -0.972 -0.939 -0.912 + -0.917 -0.870 -0.839 -0.860 -0.818 -0.806 -0.787 -0.803 -0.761 -0.773 + -0.732 -0.783 -0.771 -0.757 -0.769 -0.712 -0.767 -0.767 -0.751 -0.785 + -0.800 -0.752 -0.795 -0.783 -0.827 -0.831 -0.860 -0.890 -0.870 -0.878 + -0.912 -0.940 -0.932 -0.952 -0.942 -0.963 -0.963 -0.985 -0.984 -1.012 + -0.992 -1.022 -1.008 -0.992 -1.015 -1.027 -0.990 -1.007 -1.034 -0.994 + -1.005 -1.013 -1.008 -1.012 -1.001 -0.978 -0.970 -0.996 -0.981 -0.998 + -1.024 -0.978 -0.995 -0.977 -0.999 -0.992 -1.006 -0.983 -1.002 -1.026 + -0.987 -1.002 -1.031 -1.015 -0.999 -1.038 -1.011 -1.010 -1.062 -0.975 + + 964 airs_aqua 2119 0.340060E-01 + -0.946 -1.011 -0.984 -0.978 -0.987 -0.955 -0.956 -0.954 -0.920 -0.889 + -0.893 -0.844 -0.810 -0.829 -0.791 -0.774 -0.755 -0.767 -0.724 -0.734 + -0.693 -0.748 -0.735 -0.720 -0.732 -0.668 -0.734 -0.727 -0.709 -0.749 + -0.764 -0.714 -0.757 -0.749 -0.790 -0.795 -0.825 -0.858 -0.835 -0.844 + -0.883 -0.908 -0.904 -0.925 -0.913 -0.933 -0.937 -0.961 -0.962 -0.989 + -0.966 -0.997 -0.983 -0.971 -0.993 -1.004 -0.968 -0.988 -1.016 -0.976 + -0.986 -1.000 -0.987 -0.993 -0.981 -0.957 -0.949 -0.983 -0.960 -0.984 + -1.009 -0.962 -0.981 -0.958 -0.985 -0.974 -0.990 -0.963 -0.983 -1.012 + -0.973 -0.987 -1.014 -0.994 -0.984 -1.025 -0.996 -0.997 -1.052 -0.968 + + 965 airs_aqua 2120 0.331146E-01 + -0.960 -1.018 -0.991 -0.983 -0.992 -0.953 -0.954 -0.949 -0.916 -0.883 + -0.887 -0.832 -0.797 -0.817 -0.771 -0.756 -0.736 -0.750 -0.703 -0.712 + -0.670 -0.729 -0.715 -0.697 -0.710 -0.651 -0.714 -0.705 -0.683 -0.721 + -0.740 -0.691 -0.731 -0.723 -0.769 -0.773 -0.804 -0.831 -0.812 -0.826 + -0.860 -0.894 -0.885 -0.906 -0.900 -0.923 -0.925 -0.951 -0.951 -0.978 + -0.958 -0.990 -0.973 -0.962 -0.984 -0.994 -0.960 -0.978 -1.009 -0.970 + -0.978 -0.994 -0.982 -0.985 -0.974 -0.954 -0.944 -0.972 -0.956 -0.981 + -0.999 -0.956 -0.976 -0.955 -0.984 -0.969 -0.984 -0.964 -0.981 -1.016 + -0.971 -0.988 -1.013 -0.997 -0.984 -1.030 -1.002 -1.004 -1.064 -0.978 + + 966 airs_aqua 2121 0.323085E-01 + -0.934 -0.993 -0.962 -0.952 -0.961 -0.925 -0.922 -0.918 -0.880 -0.844 + -0.850 -0.793 -0.751 -0.773 -0.727 -0.712 -0.692 -0.703 -0.653 -0.665 + -0.622 -0.680 -0.666 -0.650 -0.661 -0.596 -0.669 -0.663 -0.645 -0.676 + -0.699 -0.644 -0.688 -0.678 -0.726 -0.728 -0.755 -0.789 -0.772 -0.784 + -0.821 -0.852 -0.847 -0.869 -0.864 -0.883 -0.887 -0.914 -0.915 -0.944 + -0.925 -0.959 -0.943 -0.930 -0.954 -0.964 -0.928 -0.947 -0.979 -0.938 + -0.948 -0.963 -0.952 -0.958 -0.944 -0.923 -0.918 -0.944 -0.926 -0.949 + -0.973 -0.922 -0.940 -0.928 -0.954 -0.938 -0.955 -0.935 -0.952 -0.982 + -0.938 -0.957 -0.985 -0.967 -0.957 -1.000 -0.971 -0.978 -1.032 -0.951 + + 967 airs_aqua 2122 0.311233E-01 + -0.719 -0.823 -0.768 -0.776 -0.799 -0.767 -0.778 -0.813 -0.783 -0.770 + -0.817 -0.770 -0.774 -0.814 -0.772 -0.776 -0.799 -0.829 -0.783 -0.826 + -0.801 -0.832 -0.842 -0.841 -0.847 -0.826 -0.835 -0.839 -0.846 -0.873 + -0.880 -0.845 -0.863 -0.869 -0.894 -0.893 -0.898 -0.912 -0.893 -0.906 + -0.907 -0.937 -0.926 -0.917 -0.904 -0.916 -0.908 -0.932 -0.921 -0.944 + -0.896 -0.937 -0.913 -0.900 -0.918 -0.940 -0.885 -0.905 -0.913 -0.891 + -0.878 -0.918 -0.913 -0.901 -0.884 -0.846 -0.835 -0.861 -0.838 -0.877 + -0.875 -0.852 -0.871 -0.854 -0.858 -0.848 -0.856 -0.822 -0.834 -0.878 + -0.811 -0.816 -0.851 -0.810 -0.795 -0.840 -0.793 -0.816 -0.876 -0.770 + + 968 airs_aqua 2123 0.304179E-01 + -0.688 -0.789 -0.737 -0.752 -0.768 -0.732 -0.742 -0.787 -0.750 -0.741 + -0.785 -0.736 -0.733 -0.776 -0.735 -0.747 -0.761 -0.793 -0.758 -0.793 + -0.778 -0.808 -0.815 -0.815 -0.818 -0.802 -0.809 -0.810 -0.819 -0.841 + -0.856 -0.823 -0.833 -0.831 -0.873 -0.867 -0.868 -0.890 -0.866 -0.884 + -0.878 -0.912 -0.907 -0.902 -0.879 -0.890 -0.880 -0.910 -0.897 -0.919 + -0.873 -0.914 -0.886 -0.871 -0.889 -0.916 -0.852 -0.875 -0.883 -0.858 + -0.845 -0.896 -0.886 -0.884 -0.857 -0.827 -0.813 -0.829 -0.816 -0.845 + -0.853 -0.819 -0.847 -0.834 -0.829 -0.824 -0.825 -0.790 -0.805 -0.847 + -0.780 -0.783 -0.814 -0.778 -0.767 -0.803 -0.755 -0.788 -0.841 -0.742 + + 969 airs_aqua 2128 0.275931E-01 + -0.691 -0.789 -0.726 -0.735 -0.758 -0.717 -0.725 -0.770 -0.728 -0.712 + -0.760 -0.705 -0.711 -0.751 -0.711 -0.716 -0.743 -0.766 -0.719 -0.757 + -0.731 -0.773 -0.775 -0.775 -0.775 -0.757 -0.773 -0.777 -0.777 -0.802 + -0.805 -0.780 -0.785 -0.793 -0.819 -0.825 -0.829 -0.840 -0.818 -0.832 + -0.831 -0.865 -0.848 -0.852 -0.830 -0.838 -0.826 -0.863 -0.844 -0.875 + -0.832 -0.858 -0.831 -0.829 -0.844 -0.863 -0.815 -0.834 -0.843 -0.820 + -0.811 -0.850 -0.842 -0.832 -0.815 -0.783 -0.768 -0.789 -0.774 -0.811 + -0.817 -0.783 -0.813 -0.795 -0.795 -0.786 -0.793 -0.753 -0.771 -0.823 + -0.751 -0.753 -0.792 -0.746 -0.736 -0.785 -0.733 -0.765 -0.836 -0.733 + + 970 airs_aqua 2134 0.247456E-01 + -0.651 -0.745 -0.673 -0.677 -0.696 -0.656 -0.660 -0.705 -0.662 -0.648 + -0.698 -0.648 -0.643 -0.682 -0.649 -0.651 -0.681 -0.700 -0.654 -0.695 + -0.662 -0.700 -0.707 -0.714 -0.710 -0.687 -0.698 -0.702 -0.709 -0.737 + -0.731 -0.705 -0.714 -0.723 -0.749 -0.762 -0.759 -0.767 -0.745 -0.768 + -0.754 -0.787 -0.773 -0.778 -0.755 -0.762 -0.747 -0.793 -0.777 -0.805 + -0.759 -0.781 -0.764 -0.752 -0.768 -0.791 -0.738 -0.760 -0.772 -0.749 + -0.737 -0.779 -0.772 -0.769 -0.748 -0.712 -0.692 -0.721 -0.704 -0.742 + -0.747 -0.714 -0.744 -0.727 -0.724 -0.721 -0.734 -0.682 -0.700 -0.756 + -0.682 -0.691 -0.720 -0.679 -0.671 -0.718 -0.669 -0.707 -0.785 -0.686 + + 971 airs_aqua 2141 0.224300E-01 + -0.610 -0.699 -0.630 -0.630 -0.643 -0.599 -0.608 -0.647 -0.602 -0.586 + -0.639 -0.578 -0.577 -0.621 -0.587 -0.585 -0.615 -0.633 -0.598 -0.629 + -0.596 -0.642 -0.641 -0.642 -0.646 -0.620 -0.631 -0.636 -0.643 -0.663 + -0.663 -0.640 -0.638 -0.653 -0.676 -0.694 -0.693 -0.694 -0.678 -0.694 + -0.694 -0.718 -0.698 -0.716 -0.686 -0.691 -0.684 -0.727 -0.704 -0.739 + -0.689 -0.710 -0.694 -0.688 -0.699 -0.721 -0.669 -0.692 -0.706 -0.682 + -0.666 -0.713 -0.703 -0.703 -0.679 -0.640 -0.620 -0.653 -0.633 -0.677 + -0.680 -0.641 -0.677 -0.661 -0.656 -0.652 -0.671 -0.618 -0.640 -0.695 + -0.619 -0.626 -0.654 -0.619 -0.609 -0.667 -0.615 -0.655 -0.740 -0.641 + + 972 airs_aqua 2145 0.175892E-01 + -0.465 -0.528 -0.456 -0.445 -0.460 -0.417 -0.433 -0.466 -0.420 -0.411 + -0.444 -0.386 -0.398 -0.434 -0.401 -0.406 -0.426 -0.453 -0.421 -0.446 + -0.409 -0.453 -0.446 -0.466 -0.469 -0.426 -0.441 -0.445 -0.463 -0.466 + -0.464 -0.442 -0.441 -0.460 -0.479 -0.494 -0.492 -0.486 -0.474 -0.489 + -0.495 -0.515 -0.496 -0.512 -0.480 -0.488 -0.478 -0.520 -0.506 -0.541 + -0.487 -0.505 -0.498 -0.493 -0.497 -0.525 -0.467 -0.502 -0.515 -0.482 + -0.467 -0.514 -0.510 -0.505 -0.489 -0.449 -0.432 -0.454 -0.447 -0.485 + -0.488 -0.451 -0.488 -0.452 -0.462 -0.453 -0.469 -0.427 -0.438 -0.486 + -0.421 -0.432 -0.446 -0.422 -0.415 -0.470 -0.413 -0.456 -0.560 -0.478 + + 973 airs_aqua 2149 0.168638E-01 + -0.469 -0.531 -0.458 -0.449 -0.463 -0.409 -0.427 -0.461 -0.411 -0.410 + -0.442 -0.377 -0.389 -0.430 -0.390 -0.395 -0.425 -0.448 -0.420 -0.441 + -0.404 -0.447 -0.432 -0.458 -0.456 -0.423 -0.433 -0.432 -0.454 -0.453 + -0.452 -0.433 -0.435 -0.451 -0.476 -0.487 -0.480 -0.480 -0.469 -0.477 + -0.487 -0.505 -0.491 -0.500 -0.469 -0.481 -0.462 -0.514 -0.489 -0.529 + -0.481 -0.498 -0.493 -0.486 -0.490 -0.511 -0.453 -0.486 -0.504 -0.480 + -0.461 -0.505 -0.497 -0.495 -0.486 -0.438 -0.425 -0.444 -0.429 -0.476 + -0.485 -0.447 -0.487 -0.451 -0.456 -0.441 -0.462 -0.417 -0.433 -0.481 + -0.414 -0.426 -0.438 -0.417 -0.410 -0.465 -0.410 -0.454 -0.563 -0.479 + + 974 airs_aqua 2153 0.153216E-01 + -0.562 -0.621 -0.543 -0.533 -0.540 -0.485 -0.502 -0.536 -0.484 -0.472 + -0.510 -0.446 -0.449 -0.492 -0.449 -0.462 -0.487 -0.501 -0.468 -0.495 + -0.453 -0.499 -0.486 -0.514 -0.505 -0.469 -0.478 -0.483 -0.507 -0.505 + -0.507 -0.480 -0.482 -0.495 -0.512 -0.535 -0.521 -0.531 -0.516 -0.510 + -0.536 -0.551 -0.536 -0.545 -0.513 -0.524 -0.508 -0.553 -0.541 -0.581 + -0.517 -0.545 -0.538 -0.527 -0.531 -0.556 -0.499 -0.546 -0.555 -0.527 + -0.503 -0.553 -0.547 -0.545 -0.538 -0.496 -0.473 -0.502 -0.490 -0.528 + -0.544 -0.491 -0.543 -0.506 -0.515 -0.502 -0.521 -0.479 -0.501 -0.544 + -0.481 -0.501 -0.512 -0.487 -0.481 -0.536 -0.490 -0.539 -0.650 -0.569 + + 975 airs_aqua 2164 0.125064E-01 + -0.618 -0.669 -0.586 -0.556 -0.562 -0.504 -0.519 -0.558 -0.502 -0.482 + -0.517 -0.448 -0.456 -0.487 -0.452 -0.460 -0.483 -0.495 -0.466 -0.488 + -0.448 -0.491 -0.477 -0.504 -0.496 -0.459 -0.469 -0.470 -0.489 -0.491 + -0.489 -0.458 -0.463 -0.484 -0.490 -0.516 -0.505 -0.503 -0.492 -0.495 + -0.520 -0.525 -0.507 -0.528 -0.488 -0.497 -0.483 -0.528 -0.514 -0.555 + -0.498 -0.518 -0.515 -0.507 -0.509 -0.536 -0.476 -0.518 -0.530 -0.516 + -0.488 -0.544 -0.528 -0.531 -0.523 -0.479 -0.465 -0.482 -0.477 -0.514 + -0.531 -0.483 -0.537 -0.506 -0.508 -0.496 -0.517 -0.477 -0.500 -0.550 + -0.485 -0.498 -0.524 -0.498 -0.497 -0.555 -0.514 -0.567 -0.698 -0.617 + + 976 airs_aqua 2189 0.721694E-02 + -0.754 -0.779 -0.687 -0.640 -0.638 -0.580 -0.592 -0.632 -0.551 -0.526 + -0.573 -0.490 -0.496 -0.513 -0.497 -0.488 -0.514 -0.523 -0.487 -0.514 + -0.467 -0.506 -0.493 -0.509 -0.504 -0.465 -0.487 -0.479 -0.493 -0.502 + -0.479 -0.456 -0.464 -0.471 -0.484 -0.516 -0.492 -0.496 -0.489 -0.487 + -0.504 -0.512 -0.493 -0.517 -0.473 -0.488 -0.461 -0.520 -0.504 -0.538 + -0.492 -0.507 -0.515 -0.493 -0.502 -0.529 -0.463 -0.507 -0.526 -0.507 + -0.486 -0.531 -0.520 -0.533 -0.518 -0.478 -0.467 -0.490 -0.493 -0.536 + -0.546 -0.494 -0.560 -0.520 -0.535 -0.516 -0.550 -0.506 -0.524 -0.590 + -0.518 -0.541 -0.573 -0.556 -0.553 -0.622 -0.580 -0.652 -0.804 -0.728 + + 977 airs_aqua 2197 0.560238E-02 + -0.811 -0.830 -0.727 -0.677 -0.683 -0.620 -0.632 -0.664 -0.576 -0.560 + -0.596 -0.514 -0.514 -0.532 -0.510 -0.504 -0.532 -0.541 -0.504 -0.520 + -0.481 -0.523 -0.514 -0.524 -0.525 -0.467 -0.496 -0.495 -0.505 -0.506 + -0.488 -0.473 -0.473 -0.480 -0.497 -0.531 -0.508 -0.507 -0.505 -0.494 + -0.511 -0.521 -0.508 -0.523 -0.488 -0.497 -0.469 -0.529 -0.523 -0.550 + -0.499 -0.511 -0.529 -0.507 -0.508 -0.534 -0.474 -0.513 -0.540 -0.520 + -0.495 -0.542 -0.532 -0.541 -0.527 -0.488 -0.477 -0.504 -0.505 -0.555 + -0.557 -0.501 -0.575 -0.528 -0.560 -0.532 -0.570 -0.522 -0.545 -0.614 + -0.540 -0.567 -0.597 -0.581 -0.587 -0.655 -0.614 -0.689 -0.852 -0.777 + + 978 airs_aqua 2209 0.488770E-02 + -0.851 -0.867 -0.771 -0.704 -0.714 -0.652 -0.659 -0.672 -0.603 -0.574 + -0.608 -0.536 -0.527 -0.548 -0.520 -0.527 -0.549 -0.552 -0.508 -0.530 + -0.498 -0.534 -0.518 -0.532 -0.532 -0.471 -0.505 -0.507 -0.517 -0.520 + -0.501 -0.487 -0.492 -0.480 -0.499 -0.543 -0.506 -0.500 -0.503 -0.498 + -0.516 -0.532 -0.509 -0.525 -0.498 -0.493 -0.487 -0.537 -0.514 -0.556 + -0.512 -0.520 -0.530 -0.512 -0.524 -0.534 -0.480 -0.523 -0.548 -0.527 + -0.500 -0.556 -0.536 -0.550 -0.541 -0.509 -0.493 -0.516 -0.504 -0.558 + -0.565 -0.512 -0.595 -0.539 -0.569 -0.540 -0.578 -0.534 -0.563 -0.632 + -0.551 -0.583 -0.620 -0.601 -0.609 -0.674 -0.638 -0.721 -0.886 -0.813 + + 979 airs_aqua 2226 0.513566E-02 + -0.861 -0.880 -0.772 -0.707 -0.715 -0.659 -0.658 -0.684 -0.607 -0.585 + -0.621 -0.539 -0.528 -0.549 -0.537 -0.533 -0.557 -0.565 -0.524 -0.539 + -0.500 -0.545 -0.530 -0.539 -0.528 -0.484 -0.506 -0.512 -0.524 -0.516 + -0.500 -0.491 -0.472 -0.499 -0.507 -0.553 -0.532 -0.513 -0.504 -0.507 + -0.526 -0.533 -0.532 -0.540 -0.495 -0.490 -0.497 -0.548 -0.530 -0.564 + -0.520 -0.534 -0.549 -0.524 -0.523 -0.540 -0.492 -0.536 -0.561 -0.539 + -0.510 -0.550 -0.547 -0.551 -0.545 -0.509 -0.510 -0.521 -0.519 -0.570 + -0.589 -0.515 -0.601 -0.560 -0.586 -0.557 -0.596 -0.544 -0.583 -0.633 + -0.569 -0.588 -0.633 -0.613 -0.616 -0.691 -0.646 -0.739 -0.899 -0.826 + + 980 airs_aqua 2234 0.711476E-02 + -0.834 -0.853 -0.752 -0.696 -0.700 -0.645 -0.646 -0.670 -0.589 -0.578 + -0.611 -0.528 -0.518 -0.545 -0.541 -0.525 -0.548 -0.575 -0.522 -0.542 + -0.506 -0.551 -0.530 -0.537 -0.530 -0.497 -0.505 -0.513 -0.531 -0.526 + -0.508 -0.494 -0.484 -0.503 -0.514 -0.540 -0.525 -0.513 -0.512 -0.509 + -0.530 -0.536 -0.523 -0.542 -0.490 -0.494 -0.496 -0.542 -0.539 -0.567 + -0.529 -0.524 -0.555 -0.529 -0.528 -0.553 -0.491 -0.534 -0.570 -0.543 + -0.511 -0.557 -0.550 -0.564 -0.550 -0.514 -0.510 -0.518 -0.529 -0.575 + -0.583 -0.519 -0.597 -0.572 -0.588 -0.561 -0.600 -0.545 -0.583 -0.638 + -0.573 -0.601 -0.631 -0.606 -0.606 -0.690 -0.630 -0.719 -0.877 -0.803 + + 981 airs_aqua 2280 0.612109E-02 + -0.869 -0.879 -0.778 -0.705 -0.710 -0.658 -0.647 -0.677 -0.605 -0.581 + -0.613 -0.537 -0.525 -0.542 -0.532 -0.533 -0.549 -0.559 -0.514 -0.537 + -0.501 -0.550 -0.525 -0.532 -0.521 -0.484 -0.501 -0.516 -0.551 -0.513 + -0.513 -0.496 -0.484 -0.509 -0.527 -0.556 -0.541 -0.537 -0.521 -0.526 + -0.550 -0.562 -0.535 -0.564 -0.523 -0.516 -0.511 -0.556 -0.540 -0.579 + -0.529 -0.553 -0.561 -0.540 -0.549 -0.568 -0.500 -0.557 -0.578 -0.547 + -0.523 -0.564 -0.562 -0.585 -0.566 -0.528 -0.514 -0.538 -0.543 -0.581 + -0.605 -0.541 -0.626 -0.603 -0.614 -0.581 -0.622 -0.590 -0.610 -0.665 + -0.617 -0.653 -0.686 -0.663 -0.680 -0.768 -0.717 -0.808 -0.981 -0.910 + + 982 airs_aqua 2318 0.556809E-02 + -0.695 -0.717 -0.591 -0.523 -0.526 -0.460 -0.466 -0.469 -0.416 -0.397 + -0.412 -0.338 -0.328 -0.357 -0.347 -0.342 -0.349 -0.366 -0.342 -0.347 + -0.325 -0.356 -0.360 -0.360 -0.342 -0.315 -0.332 -0.343 -0.373 -0.342 + -0.346 -0.331 -0.330 -0.358 -0.335 -0.385 -0.379 -0.363 -0.362 -0.364 + -0.385 -0.397 -0.379 -0.392 -0.374 -0.351 -0.352 -0.409 -0.379 -0.405 + -0.383 -0.387 -0.393 -0.380 -0.390 -0.396 -0.343 -0.396 -0.416 -0.390 + -0.373 -0.400 -0.408 -0.401 -0.397 -0.358 -0.354 -0.364 -0.369 -0.411 + -0.437 -0.359 -0.437 -0.414 -0.435 -0.403 -0.444 -0.408 -0.439 -0.484 + -0.423 -0.454 -0.501 -0.493 -0.486 -0.572 -0.539 -0.628 -0.817 -0.749 + + 983 airs_aqua 2321 0.252574E-02 + -0.943 -0.938 -0.810 -0.742 -0.728 -0.668 -0.670 -0.669 -0.598 -0.586 + -0.596 -0.529 -0.503 -0.522 -0.518 -0.518 -0.523 -0.525 -0.495 -0.503 + -0.478 -0.506 -0.493 -0.503 -0.487 -0.456 -0.466 -0.475 -0.508 -0.463 + -0.480 -0.462 -0.441 -0.476 -0.474 -0.514 -0.502 -0.491 -0.485 -0.490 + -0.503 -0.530 -0.510 -0.512 -0.486 -0.466 -0.469 -0.525 -0.499 -0.537 + -0.493 -0.513 -0.526 -0.503 -0.513 -0.515 -0.474 -0.523 -0.555 -0.503 + -0.513 -0.533 -0.529 -0.536 -0.545 -0.498 -0.489 -0.507 -0.511 -0.563 + -0.574 -0.510 -0.597 -0.571 -0.601 -0.574 -0.600 -0.569 -0.603 -0.673 + -0.613 -0.645 -0.703 -0.684 -0.696 -0.801 -0.751 -0.846 -1.037 -0.987 + + 984 airs_aqua 2325 0.108450E-01 + -0.009 -0.030 0.076 0.147 0.120 0.194 0.151 0.180 0.187 0.194 + 0.233 0.265 0.245 0.225 0.211 0.218 0.211 0.190 0.200 0.181 + 0.206 0.183 0.134 0.171 0.155 0.213 0.162 0.142 0.110 0.145 + 0.116 0.131 0.127 0.116 0.135 0.073 0.100 0.076 0.114 0.094 + 0.061 0.048 0.096 0.056 0.076 0.110 0.104 0.040 0.071 0.058 + 0.080 0.078 0.067 0.100 0.069 0.074 0.125 0.083 0.067 0.081 + 0.107 0.087 0.098 0.121 0.087 0.123 0.133 0.114 0.133 0.143 + 0.091 0.177 0.128 0.151 0.153 0.155 0.119 0.171 0.128 0.140 + 0.167 0.175 0.116 0.116 0.169 0.057 0.130 0.058 -0.155 -0.072 + + 985 airs_aqua 2328 0.166165E-02 + -0.922 -0.916 -0.789 -0.708 -0.695 -0.637 -0.638 -0.633 -0.567 -0.549 + -0.571 -0.498 -0.458 -0.489 -0.468 -0.475 -0.481 -0.498 -0.461 -0.472 + -0.444 -0.461 -0.458 -0.474 -0.454 -0.424 -0.432 -0.438 -0.475 -0.429 + -0.447 -0.422 -0.420 -0.451 -0.431 -0.487 -0.467 -0.468 -0.456 -0.450 + -0.472 -0.490 -0.482 -0.483 -0.462 -0.443 -0.445 -0.493 -0.474 -0.505 + -0.466 -0.475 -0.483 -0.475 -0.474 -0.496 -0.437 -0.493 -0.512 -0.479 + -0.469 -0.500 -0.496 -0.501 -0.502 -0.471 -0.458 -0.474 -0.475 -0.515 + -0.551 -0.478 -0.560 -0.532 -0.563 -0.536 -0.563 -0.538 -0.577 -0.636 + -0.579 -0.607 -0.662 -0.650 -0.662 -0.760 -0.723 -0.834 -1.018 -0.968 + + 986 airs_aqua 2333 0.822694E-03 + -0.981 -0.969 -0.838 -0.759 -0.740 -0.672 -0.684 -0.672 -0.593 -0.579 + -0.599 -0.521 -0.492 -0.520 -0.500 -0.496 -0.512 -0.521 -0.474 -0.490 + -0.470 -0.493 -0.481 -0.488 -0.462 -0.436 -0.457 -0.456 -0.490 -0.448 + -0.466 -0.447 -0.434 -0.457 -0.451 -0.504 -0.475 -0.473 -0.478 -0.472 + -0.489 -0.510 -0.500 -0.487 -0.477 -0.458 -0.463 -0.511 -0.481 -0.509 + -0.490 -0.493 -0.495 -0.498 -0.499 -0.509 -0.454 -0.514 -0.536 -0.498 + -0.496 -0.526 -0.516 -0.527 -0.529 -0.491 -0.470 -0.493 -0.506 -0.551 + -0.579 -0.503 -0.593 -0.571 -0.604 -0.561 -0.590 -0.577 -0.604 -0.664 + -0.612 -0.652 -0.706 -0.693 -0.714 -0.806 -0.765 -0.874 -1.064 -1.019 + + 987 airs_aqua 2339 0.118031E-01 + 0.083 0.065 0.171 0.233 0.219 0.273 0.252 0.257 0.263 0.294 + 0.308 0.344 0.331 0.309 0.291 0.294 0.292 0.254 0.267 0.240 + 0.284 0.250 0.202 0.240 0.235 0.266 0.237 0.218 0.180 0.201 + 0.181 0.205 0.193 0.173 0.192 0.132 0.163 0.152 0.168 0.145 + 0.133 0.107 0.152 0.128 0.140 0.176 0.153 0.094 0.132 0.121 + 0.140 0.129 0.120 0.146 0.143 0.145 0.181 0.161 0.119 0.136 + 0.162 0.149 0.166 0.171 0.161 0.182 0.199 0.176 0.190 0.212 + 0.159 0.248 0.199 0.212 0.226 0.233 0.196 0.242 0.196 0.216 + 0.250 0.252 0.199 0.196 0.251 0.156 0.215 0.157 -0.059 0.020 + + 988 airs_aqua 2348 0.213117E-02 + -0.941 -0.932 -0.800 -0.729 -0.713 -0.647 -0.663 -0.662 -0.583 -0.559 + -0.573 -0.505 -0.475 -0.511 -0.495 -0.495 -0.510 -0.514 -0.470 -0.478 + -0.444 -0.489 -0.468 -0.480 -0.462 -0.443 -0.438 -0.437 -0.488 -0.448 + -0.453 -0.433 -0.427 -0.452 -0.450 -0.490 -0.461 -0.474 -0.460 -0.475 + -0.486 -0.512 -0.490 -0.492 -0.463 -0.441 -0.466 -0.510 -0.479 -0.526 + -0.480 -0.493 -0.509 -0.497 -0.488 -0.517 -0.467 -0.504 -0.538 -0.506 + -0.495 -0.520 -0.517 -0.536 -0.520 -0.493 -0.473 -0.487 -0.502 -0.539 + -0.568 -0.494 -0.577 -0.553 -0.589 -0.555 -0.584 -0.563 -0.596 -0.657 + -0.601 -0.625 -0.691 -0.669 -0.681 -0.778 -0.739 -0.846 -1.033 -0.977 + + 989 airs_aqua 2353 0.125926E-01 + 0.178 0.168 0.281 0.332 0.315 0.376 0.347 0.360 0.366 0.392 + 0.409 0.445 0.432 0.410 0.393 0.389 0.383 0.363 0.367 0.348 + 0.379 0.344 0.307 0.350 0.322 0.363 0.331 0.316 0.265 0.313 + 0.280 0.311 0.295 0.277 0.290 0.238 0.270 0.249 0.279 0.263 + 0.229 0.201 0.254 0.223 0.231 0.263 0.249 0.192 0.240 0.216 + 0.239 0.250 0.221 0.253 0.247 0.237 0.282 0.252 0.221 0.237 + 0.266 0.240 0.264 0.276 0.254 0.278 0.299 0.281 0.307 0.306 + 0.264 0.346 0.306 0.311 0.322 0.327 0.300 0.346 0.300 0.311 + 0.350 0.342 0.289 0.283 0.333 0.240 0.313 0.247 0.028 0.115 + + 990 airs_aqua 2355 0.378958E-02 + -0.687 -0.695 -0.554 -0.489 -0.484 -0.416 -0.430 -0.421 -0.360 -0.344 + -0.359 -0.273 -0.269 -0.296 -0.287 -0.288 -0.299 -0.305 -0.272 -0.291 + -0.262 -0.288 -0.298 -0.279 -0.281 -0.245 -0.264 -0.257 -0.307 -0.269 + -0.294 -0.266 -0.262 -0.287 -0.270 -0.330 -0.300 -0.299 -0.293 -0.308 + -0.324 -0.336 -0.310 -0.334 -0.302 -0.288 -0.298 -0.342 -0.315 -0.349 + -0.313 -0.320 -0.329 -0.320 -0.322 -0.345 -0.287 -0.333 -0.370 -0.321 + -0.322 -0.346 -0.341 -0.351 -0.349 -0.318 -0.292 -0.306 -0.318 -0.353 + -0.380 -0.307 -0.391 -0.361 -0.383 -0.352 -0.394 -0.361 -0.394 -0.445 + -0.391 -0.422 -0.466 -0.470 -0.459 -0.552 -0.518 -0.611 -0.805 -0.740 + + 991 airs_aqua 2357 0.826303E-02 + -0.353 -0.408 -0.252 -0.261 -0.176 -0.080 -0.106 -0.129 -0.138 -0.031 + 0.060 0.215 0.009 0.016 0.092 0.040 0.104 0.001 0.089 0.017 + 0.067 -0.062 0.021 0.054 -0.002 0.113 0.076 -0.057 0.022 0.102 + 0.071 0.228 -0.042 0.026 -0.023 -0.134 -0.028 -0.026 0.030 0.011 + 0.070 -0.081 -0.120 0.074 -0.020 0.046 -0.079 -0.034 -0.022 -0.043 + -0.100 -0.034 0.039 0.090 0.055 -0.158 -0.035 -0.030 -0.113 -0.062 + -0.060 -0.070 0.008 -0.091 -0.066 -0.075 -0.029 0.056 0.046 0.048 + -0.153 0.046 -0.042 -0.069 -0.012 -0.030 -0.175 -0.096 -0.005 -0.225 + 0.040 -0.080 -0.187 -0.124 -0.017 -0.238 -0.164 -0.290 -0.489 -0.428 + + 992 airs_aqua 2363 0.682664E-02 + -0.449 -0.468 -0.334 -0.256 -0.256 -0.186 -0.207 -0.196 -0.147 -0.138 + -0.136 -0.069 -0.077 -0.100 -0.083 -0.090 -0.092 -0.098 -0.085 -0.094 + -0.077 -0.106 -0.120 -0.098 -0.107 -0.075 -0.088 -0.089 -0.139 -0.106 + -0.129 -0.098 -0.097 -0.121 -0.115 -0.169 -0.141 -0.146 -0.127 -0.135 + -0.152 -0.181 -0.151 -0.171 -0.151 -0.123 -0.125 -0.196 -0.156 -0.167 + -0.154 -0.156 -0.166 -0.150 -0.155 -0.177 -0.123 -0.165 -0.188 -0.161 + -0.147 -0.175 -0.173 -0.168 -0.169 -0.143 -0.117 -0.135 -0.129 -0.155 + -0.185 -0.109 -0.167 -0.157 -0.175 -0.141 -0.187 -0.145 -0.184 -0.222 + -0.165 -0.193 -0.237 -0.228 -0.218 -0.310 -0.264 -0.356 -0.559 -0.493 + + 993 airs_aqua 2370 0.801402E-02 + -0.333 -0.351 -0.219 -0.154 -0.163 -0.102 -0.110 -0.110 -0.064 -0.057 + -0.061 0.011 -0.004 -0.028 -0.021 -0.013 -0.026 -0.046 -0.022 -0.046 + -0.012 -0.047 -0.072 -0.042 -0.056 -0.018 -0.037 -0.037 -0.080 -0.049 + -0.078 -0.051 -0.058 -0.083 -0.065 -0.119 -0.087 -0.100 -0.077 -0.107 + -0.114 -0.142 -0.107 -0.135 -0.111 -0.089 -0.086 -0.136 -0.110 -0.132 + -0.114 -0.107 -0.133 -0.111 -0.119 -0.131 -0.080 -0.118 -0.150 -0.122 + -0.108 -0.132 -0.111 -0.117 -0.123 -0.098 -0.068 -0.082 -0.084 -0.102 + -0.138 -0.055 -0.114 -0.094 -0.115 -0.085 -0.129 -0.089 -0.120 -0.146 + -0.095 -0.116 -0.165 -0.156 -0.137 -0.227 -0.179 -0.256 -0.458 -0.391 + + 994 airs_aqua 2371 0.629497E-02 + -0.447 -0.464 -0.329 -0.261 -0.267 -0.195 -0.209 -0.201 -0.157 -0.151 + -0.141 -0.084 -0.085 -0.113 -0.098 -0.097 -0.108 -0.119 -0.103 -0.113 + -0.101 -0.117 -0.144 -0.121 -0.125 -0.080 -0.102 -0.101 -0.152 -0.120 + -0.143 -0.115 -0.116 -0.138 -0.125 -0.170 -0.152 -0.160 -0.148 -0.158 + -0.173 -0.192 -0.174 -0.188 -0.164 -0.134 -0.154 -0.205 -0.162 -0.200 + -0.167 -0.175 -0.183 -0.165 -0.178 -0.189 -0.136 -0.182 -0.208 -0.183 + -0.164 -0.201 -0.185 -0.195 -0.198 -0.155 -0.125 -0.147 -0.156 -0.174 + -0.200 -0.123 -0.195 -0.178 -0.193 -0.162 -0.195 -0.161 -0.208 -0.235 + -0.173 -0.207 -0.252 -0.248 -0.236 -0.323 -0.272 -0.358 -0.558 -0.491 + + 995 airs_aqua 2377 0.645234E-02 + -0.412 -0.428 -0.289 -0.226 -0.215 -0.158 -0.173 -0.158 -0.101 -0.097 + -0.083 -0.027 -0.041 -0.070 -0.050 -0.046 -0.051 -0.079 -0.040 -0.062 + -0.043 -0.061 -0.084 -0.059 -0.056 -0.025 -0.050 -0.054 -0.093 -0.061 + -0.082 -0.054 -0.056 -0.092 -0.073 -0.122 -0.099 -0.100 -0.089 -0.096 + -0.129 -0.144 -0.112 -0.136 -0.107 -0.088 -0.092 -0.141 -0.114 -0.142 + -0.113 -0.124 -0.136 -0.118 -0.125 -0.136 -0.097 -0.125 -0.167 -0.128 + -0.117 -0.145 -0.132 -0.133 -0.140 -0.107 -0.074 -0.102 -0.098 -0.123 + -0.163 -0.069 -0.146 -0.139 -0.143 -0.119 -0.153 -0.129 -0.161 -0.190 + -0.144 -0.173 -0.224 -0.213 -0.194 -0.284 -0.241 -0.324 -0.525 -0.456 + + 996 amsua_aqua 1 0.524094E-02 + -3.987 -4.015 -3.992 -3.955 -3.776 -3.744 -3.634 -3.556 -3.542 -3.430 + -3.382 -3.293 -3.163 -3.020 -2.988 -2.967 -2.977 -2.965 -3.023 -3.070 + -3.090 -3.278 -3.483 -3.843 -4.087 -4.114 -4.165 -4.173 -4.007 -3.926 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 997 amsua_aqua 2 0.283729E-02 + -1.638 -1.909 -2.093 -2.302 -2.380 -2.391 -2.400 -2.314 -2.302 -2.196 + -2.136 -2.106 -1.960 -1.930 -1.823 -1.845 -1.804 -1.821 -1.916 -1.974 + -2.009 -2.194 -2.386 -2.607 -2.742 -2.811 -2.810 -2.789 -2.611 -2.364 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 998 amsua_aqua 3 0.171295E-01 + -0.580 -0.087 0.347 0.753 1.168 1.332 1.569 1.683 1.975 2.153 + 2.362 2.228 2.366 2.305 2.373 2.358 2.279 2.155 1.988 1.836 + 1.555 1.267 1.072 0.801 0.484 0.139 -0.259 -0.894 -1.470 -2.466 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 999 amsua_aqua 4 0.382441E-01 + -2.370 -2.394 -2.159 -1.776 -1.314 -0.987 -0.706 -0.515 -0.345 -0.150 + 0.035 0.167 0.274 0.389 0.405 0.392 0.371 0.259 0.135 0.025 + -0.178 -0.436 -0.620 -0.883 -1.165 -1.601 -2.167 -2.701 -3.080 -3.285 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1000 amsua_aqua 5 0.483379E-01 + -1.709 -1.746 -1.656 -1.438 -1.162 -0.998 -0.904 -0.805 -0.721 -0.658 + -0.591 -0.517 -0.489 -0.466 -0.465 -0.466 -0.482 -0.502 -0.552 -0.607 + -0.668 -0.754 -0.853 -0.996 -1.121 -1.375 -1.755 -2.120 -2.348 -2.513 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1001 amsua_aqua 6 0.488233E-01 + -1.073 -1.057 -1.031 -0.984 -0.842 -0.793 -0.782 -0.742 -0.738 -0.732 + -0.728 -0.687 -0.703 -0.721 -0.759 -0.779 -0.802 -0.836 -0.844 -0.895 + -0.898 -0.987 -1.035 -1.132 -1.221 -1.395 -1.665 -1.932 -2.152 -2.292 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1002 amsua_aqua 7 0.385469E-01 + -1.410 -1.414 -1.446 -1.376 -1.286 -1.228 -1.218 -1.207 -1.203 -1.208 + -1.206 -1.219 -1.215 -1.248 -1.264 -1.286 -1.294 -1.320 -1.349 -1.354 + -1.422 -1.463 -1.491 -1.570 -1.674 -1.808 -2.056 -2.269 -2.447 -2.573 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1003 amsua_aqua 8 0.247199E-01 + -1.359 -1.417 -1.354 -1.199 -0.981 -0.884 -0.852 -0.857 -0.781 -0.774 + -0.756 -0.817 -0.756 -0.835 -0.841 -0.861 -0.887 -0.906 -0.911 -0.872 + -0.946 -1.003 -0.987 -1.078 -1.137 -1.326 -1.511 -1.857 -2.054 -2.382 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1004 amsua_aqua 9 -0.129174E-01 + -0.766 -0.714 -0.762 -0.651 -0.591 -0.584 -0.601 -0.594 -0.521 -0.510 + -0.445 -0.498 -0.508 -0.614 -0.589 -0.601 -0.649 -0.687 -0.702 -0.761 + -0.815 -0.893 -0.947 -1.023 -1.092 -1.166 -1.322 -1.548 -1.659 -1.867 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1005 amsua_aqua 10 -0.305115E-01 + -0.600 -0.555 -0.574 -0.527 -0.449 -0.413 -0.407 -0.400 -0.374 -0.340 + -0.328 -0.303 -0.299 -0.294 -0.296 -0.308 -0.336 -0.376 -0.417 -0.469 + -0.541 -0.600 -0.669 -0.743 -0.816 -0.904 -1.101 -1.335 -1.483 -1.618 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1006 amsua_aqua 11 -0.453832E-01 + -0.712 -0.631 -0.625 -0.556 -0.460 -0.412 -0.382 -0.357 -0.316 -0.277 + -0.240 -0.213 -0.204 -0.187 -0.192 -0.205 -0.229 -0.270 -0.325 -0.382 + -0.464 -0.542 -0.624 -0.713 -0.810 -0.910 -1.123 -1.377 -1.554 -1.746 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1007 amsua_aqua 12 -0.699151E-01 + -1.458 -1.308 -1.250 -1.128 -0.992 -0.916 -0.862 -0.808 -0.748 -0.686 + -0.637 -0.594 -0.569 -0.550 -0.550 -0.571 -0.593 -0.646 -0.717 -0.789 + -0.883 -0.984 -1.097 -1.207 -1.326 -1.460 -1.709 -2.032 -2.260 -2.534 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1008 amsua_aqua 13 -0.923337E-01 + -2.880 -2.691 -2.607 -2.448 -2.289 -2.192 -2.112 -2.035 -1.956 -1.870 + -1.804 -1.746 -1.701 -1.683 -1.683 -1.694 -1.727 -1.789 -1.877 -1.963 + -2.076 -2.203 -2.341 -2.473 -2.614 -2.783 -3.061 -3.430 -3.702 -4.008 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1009 amsua_aqua 14 -0.581326E-01 + -3.183 -3.206 -3.275 -3.242 -3.175 -3.156 -3.134 -3.111 -3.074 -3.024 + -2.974 -2.938 -2.917 -2.900 -2.908 -2.914 -2.945 -2.998 -3.079 -3.147 + -3.231 -3.335 -3.425 -3.520 -3.588 -3.697 -3.889 -4.151 -4.288 -4.389 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1010 amsua_aqua 15 0.857854E-02 + 1.645 1.331 1.233 1.289 1.506 1.680 1.944 2.105 2.201 2.361 + 2.399 2.427 2.531 2.610 2.675 2.612 2.604 2.511 2.429 2.265 + 2.332 2.194 2.139 2.019 1.914 1.819 1.704 1.643 1.846 2.233 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1011 avhrr3_n18 3 0.000000E+00 + -0.077 -0.059 -0.042 -0.028 -0.022 -0.015 -0.004 0.001 0.011 0.011 + 0.017 0.016 0.020 0.022 0.023 0.029 0.024 0.022 0.013 0.029 + 0.029 0.025 0.032 0.030 0.022 0.026 0.029 0.016 0.003 0.001 + 0.040 0.040 0.039 0.037 0.045 0.038 0.036 0.039 0.045 0.039 + 0.044 0.041 0.033 0.039 0.037 0.039 0.033 0.037 0.043 0.040 + 0.036 0.041 0.040 0.035 0.038 0.043 0.040 0.040 0.044 0.034 + 0.039 0.037 0.040 0.029 0.036 0.033 0.034 0.032 0.040 0.033 + 0.033 0.035 0.032 0.035 0.034 0.028 0.025 0.022 0.027 0.016 + 0.018 0.011 0.011 0.006 -0.003 -0.011 -0.022 -0.028 -0.038 -0.067 + + 1012 avhrr3_n18 4 0.000000E+00 + 0.024 0.033 0.035 0.045 0.043 0.046 0.055 0.054 0.066 0.057 + 0.069 0.058 0.064 0.071 0.064 0.066 0.063 0.066 0.029 0.065 + 0.065 0.056 0.063 0.053 0.049 0.055 0.072 0.052 0.008 0.000 + 0.068 0.069 0.067 0.064 0.074 0.074 0.066 0.072 0.071 0.066 + 0.075 0.070 0.071 0.070 0.067 0.064 0.069 0.071 0.070 0.075 + 0.068 0.070 0.068 0.069 0.069 0.069 0.076 0.075 0.070 0.067 + 0.080 0.070 0.068 0.071 0.080 0.072 0.066 0.073 0.075 0.076 + 0.074 0.077 0.073 0.075 0.080 0.077 0.082 0.082 0.080 0.082 + 0.082 0.076 0.082 0.075 0.073 0.076 0.072 0.074 0.067 0.054 + + 1013 avhrr3_n18 5 0.000000E+00 + 0.021 0.029 0.030 0.042 0.039 0.038 0.047 0.047 0.052 0.048 + 0.057 0.052 0.052 0.059 0.061 0.053 0.054 0.057 0.017 0.056 + 0.057 0.044 0.055 0.050 0.042 0.046 0.060 0.047 0.007 0.000 + 0.057 0.058 0.049 0.055 0.060 0.061 0.053 0.061 0.058 0.051 + 0.061 0.060 0.053 0.055 0.056 0.055 0.055 0.053 0.055 0.056 + 0.051 0.055 0.054 0.059 0.056 0.051 0.065 0.065 0.061 0.055 + 0.068 0.056 0.059 0.060 0.061 0.064 0.058 0.063 0.061 0.066 + 0.063 0.075 0.064 0.064 0.071 0.068 0.074 0.073 0.078 0.078 + 0.074 0.072 0.077 0.074 0.073 0.073 0.071 0.078 0.068 0.053 + + 1014 avhrr3_metop-a 3 0.000000E+00 + -0.083 -0.065 -0.051 -0.039 -0.038 -0.026 -0.013 -0.009 0.000 0.004 + 0.009 0.009 0.011 0.012 0.012 0.015 0.016 0.019 0.004 0.021 + 0.021 0.018 0.021 0.027 0.016 0.019 0.035 0.013 0.000 0.000 + 0.033 0.035 0.036 0.034 0.035 0.028 0.032 0.031 0.041 0.031 + 0.040 0.044 0.035 0.032 0.035 0.031 0.033 0.035 0.038 0.035 + 0.031 0.040 0.031 0.032 0.034 0.032 0.039 0.033 0.039 0.022 + 0.028 0.032 0.032 0.031 0.038 0.038 0.032 0.025 0.022 0.031 + 0.026 0.029 0.029 0.024 0.026 0.019 0.019 0.016 0.015 0.016 + 0.011 0.005 -0.001 -0.005 -0.010 -0.021 -0.029 -0.038 -0.048 -0.072 + + 1015 avhrr3_metop-a 4 0.000000E+00 + 0.030 0.039 0.046 0.046 0.055 0.054 0.063 0.062 0.071 0.070 + 0.074 0.068 0.074 0.076 0.068 0.066 0.060 0.066 0.030 0.066 + 0.070 0.060 0.065 0.061 0.059 0.053 0.083 0.042 0.003 0.001 + 0.069 0.070 0.072 0.075 0.073 0.069 0.071 0.070 0.069 0.073 + 0.079 0.079 0.074 0.070 0.077 0.068 0.074 0.078 0.075 0.078 + 0.075 0.073 0.075 0.073 0.078 0.074 0.078 0.078 0.075 0.072 + 0.075 0.077 0.077 0.078 0.076 0.076 0.073 0.071 0.078 0.080 + 0.078 0.081 0.077 0.072 0.076 0.072 0.078 0.077 0.075 0.073 + 0.077 0.073 0.073 0.074 0.075 0.072 0.072 0.072 0.063 0.061 + + 1016 avhrr3_metop-a 5 0.000000E+00 + 0.022 0.027 0.035 0.039 0.046 0.043 0.053 0.047 0.056 0.056 + 0.063 0.058 0.058 0.061 0.057 0.051 0.050 0.053 0.009 0.058 + 0.062 0.048 0.053 0.046 0.049 0.027 0.066 0.034 0.001 0.001 + 0.050 0.048 0.053 0.058 0.057 0.052 0.055 0.049 0.048 0.054 + 0.054 0.061 0.058 0.051 0.058 0.053 0.055 0.055 0.057 0.058 + 0.058 0.052 0.058 0.058 0.064 0.060 0.056 0.058 0.059 0.054 + 0.062 0.060 0.064 0.062 0.059 0.060 0.063 0.055 0.070 0.061 + 0.065 0.063 0.060 0.056 0.068 0.059 0.061 0.063 0.064 0.058 + 0.062 0.063 0.060 0.064 0.068 0.059 0.065 0.062 0.058 0.050 + + 1017 avhrr3_n19 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1018 avhrr3_n19 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1019 avhrr3_n19 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1020 ssmi_f15 1 0.320266E-02 + -2.715 -2.611 -2.634 -2.605 -2.494 -2.468 -2.543 -2.562 -2.527 -2.493 + -2.491 -2.563 -2.558 -2.540 -2.452 -2.467 -2.511 -2.512 -2.491 -2.431 + -2.441 -2.450 -2.475 -2.474 -2.386 -2.398 -2.371 -2.417 -2.436 -2.388 + -2.390 -2.451 -2.445 -2.426 -2.320 -2.376 -2.362 -2.427 -2.418 -2.414 + -2.404 -2.435 -2.436 -2.426 -2.349 -2.341 -2.377 -2.436 -2.456 -2.406 + -2.425 -2.393 -2.413 -2.389 -2.337 -2.331 -2.391 -2.510 -2.564 -2.538 + -2.610 -2.698 -2.877 -3.082 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1021 ssmi_f15 2 0.309105E-02 + -2.282 -2.178 -2.190 -2.135 -2.093 -2.092 -2.155 -2.201 -2.121 -2.082 + -2.112 -2.099 -2.124 -2.119 -2.099 -2.131 -2.144 -2.130 -2.070 -2.159 + -2.086 -2.117 -2.132 -2.119 -2.075 -2.119 -2.093 -2.113 -2.129 -2.140 + -2.142 -2.198 -2.138 -2.182 -2.126 -2.171 -2.168 -2.178 -2.200 -2.203 + -2.213 -2.268 -2.207 -2.203 -2.197 -2.226 -2.231 -2.224 -2.225 -2.256 + -2.314 -2.310 -2.264 -2.268 -2.272 -2.222 -2.287 -2.387 -2.420 -2.391 + -2.470 -2.574 -2.637 -2.786 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1022 ssmi_f15 3 0.970669E-02 + 3.605 4.757 5.749 6.333 6.726 7.168 7.317 7.569 7.818 8.427 + 8.366 8.605 8.557 8.928 8.881 9.261 9.162 8.941 9.062 9.225 + 9.477 9.271 9.465 9.415 9.657 9.372 9.263 8.878 8.567 8.125 + 7.685 7.257 6.843 6.344 6.043 5.843 5.450 4.820 4.295 4.026 + 3.613 3.139 3.046 2.756 2.677 2.453 2.432 2.287 2.145 2.050 + 1.984 1.851 1.825 1.734 1.635 1.577 1.362 1.232 1.178 1.072 + 0.887 0.708 0.441 0.004 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1023 ssmi_f15 4 0.483776E-02 + -2.666 -2.463 -2.436 -2.431 -2.354 -2.378 -2.410 -2.409 -2.419 -2.454 + -2.435 -2.387 -2.337 -2.326 -2.341 -2.322 -2.343 -2.350 -2.302 -2.280 + -2.289 -2.305 -2.263 -2.289 -2.273 -2.291 -2.277 -2.250 -2.261 -2.252 + -2.233 -2.281 -2.244 -2.234 -2.183 -2.252 -2.242 -2.247 -2.182 -2.233 + -2.253 -2.257 -2.238 -2.262 -2.275 -2.277 -2.242 -2.248 -2.322 -2.363 + -2.325 -2.298 -2.300 -2.290 -2.350 -2.371 -2.355 -2.389 -2.454 -2.430 + -2.521 -2.606 -2.752 -3.027 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1024 ssmi_f15 5 0.483638E-02 + 0.734 1.150 1.178 1.157 1.193 1.172 1.065 1.127 1.120 1.100 + 1.148 1.204 1.258 1.236 1.171 1.207 1.201 1.224 1.265 1.286 + 1.263 1.277 1.299 1.280 1.278 1.289 1.268 1.300 1.341 1.328 + 1.314 1.335 1.289 1.307 1.294 1.284 1.266 1.247 1.254 1.238 + 1.258 1.217 1.248 1.255 1.222 1.249 1.282 1.206 1.194 1.150 + 1.212 1.192 1.215 1.311 1.224 1.266 1.231 1.100 1.139 1.126 + 1.108 1.109 0.998 0.558 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1025 ssmi_f15 6 0.121063E-01 + -1.755 -1.603 -1.560 -1.542 -1.525 -1.489 -1.517 -1.491 -1.474 -1.476 + -1.444 -1.448 -1.444 -1.434 -1.430 -1.440 -1.404 -1.387 -1.378 -1.434 + -1.440 -1.399 -1.377 -1.411 -1.393 -1.405 -1.405 -1.372 -1.374 -1.369 + -1.376 -1.387 -1.382 -1.365 -1.377 -1.412 -1.405 -1.434 -1.424 -1.414 + -1.411 -1.432 -1.439 -1.445 -1.403 -1.417 -1.413 -1.426 -1.463 -1.444 + -1.480 -1.474 -1.495 -1.463 -1.500 -1.535 -1.613 -1.633 -1.701 -1.766 + -1.848 -1.971 -2.096 -2.469 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1026 ssmi_f15 7 0.119934E-01 + 2.197 2.367 2.464 2.444 2.433 2.484 2.391 2.467 2.466 2.460 + 2.512 2.533 2.597 2.587 2.549 2.498 2.567 2.717 2.639 2.540 + 2.586 2.655 2.654 2.574 2.539 2.620 2.522 2.571 2.682 2.616 + 2.649 2.577 2.573 2.579 2.503 2.488 2.493 2.501 2.459 2.482 + 2.440 2.439 2.458 2.444 2.502 2.436 2.504 2.422 2.429 2.396 + 2.364 2.334 2.406 2.427 2.294 2.284 2.212 2.250 2.148 2.216 + 2.015 1.980 1.833 1.358 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1027 ssmis_f16 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1028 ssmis_f16 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1029 ssmis_f16 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1030 ssmis_f16 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1031 ssmis_f16 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1032 ssmis_f16 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1033 ssmis_f16 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1034 ssmis_f16 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1035 ssmis_f16 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1036 ssmis_f16 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1037 ssmis_f16 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1038 ssmis_f16 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1039 ssmis_f16 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1040 ssmis_f16 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1041 ssmis_f16 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1042 ssmis_f16 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1043 ssmis_f16 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1044 ssmis_f16 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1045 ssmis_f16 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1046 ssmis_f16 20 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1047 ssmis_f16 21 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1048 ssmis_f16 22 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1049 ssmis_f16 23 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1050 ssmis_f16 24 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1051 amsre_aqua 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1052 amsre_aqua 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1053 amsre_aqua 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1054 amsre_aqua 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1055 amsre_aqua 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1056 amsre_aqua 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1057 amsre_aqua 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1058 amsre_aqua 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1059 amsre_aqua 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1060 amsre_aqua 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1061 amsre_aqua 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1062 amsre_aqua 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1063 imgr_g11 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1064 imgr_g11 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1065 imgr_g11 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1066 imgr_g11 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1067 imgr_g12 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1068 imgr_g12 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1069 imgr_g12 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1070 imgr_g12 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1071 imgr_g13 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1072 imgr_g13 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1073 imgr_g13 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1074 imgr_g13 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1075 sndrD1_g11 1 -0.285696E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.868 -0.985 -1.065 -1.121 + -1.070 -1.117 -1.090 -1.083 -1.127 -1.118 -1.125 -1.109 -1.111 -1.150 + -1.148 -1.174 -1.172 -1.179 -1.197 -1.217 -1.215 -1.219 -1.240 -1.239 + -1.253 -1.255 -1.287 -1.296 -1.284 -1.299 -1.281 -1.325 -1.318 -1.314 + -1.310 -1.318 -1.355 -1.365 -1.364 -1.360 -1.401 -1.397 -1.412 -1.410 + -1.415 -1.420 -1.429 -1.441 -1.480 -1.489 -1.472 -1.486 -1.551 -1.511 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1076 sndrD1_g11 2 0.460280E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.364 -0.429 -0.466 -0.527 + -0.482 -0.473 -0.515 -0.495 -0.538 -0.495 -0.486 -0.472 -0.443 -0.440 + -0.502 -0.504 -0.493 -0.513 -0.504 -0.546 -0.532 -0.573 -0.548 -0.571 + -0.581 -0.591 -0.613 -0.633 -0.617 -0.646 -0.645 -0.688 -0.676 -0.692 + -0.698 -0.728 -0.758 -0.784 -0.800 -0.805 -0.845 -0.841 -0.884 -0.901 + -0.923 -0.945 -0.981 -0.994 -1.043 -1.023 -1.015 -1.046 -1.090 -1.099 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1077 sndrD1_g11 3 0.474065E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.834 0.784 0.819 0.830 + 0.827 0.822 0.791 0.842 0.821 0.820 0.849 0.840 0.861 0.842 + 0.847 0.885 0.860 0.885 0.864 0.869 0.849 0.859 0.861 0.856 + 0.868 0.857 0.854 0.879 0.850 0.860 0.857 0.847 0.849 0.835 + 0.844 0.808 0.814 0.809 0.789 0.797 0.767 0.759 0.679 0.670 + 0.610 0.543 0.544 0.431 0.326 0.304 0.274 0.232 0.201 0.130 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1078 sndrD1_g11 4 0.513580E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.124 0.131 0.046 0.213 + 0.154 0.122 0.069 0.091 0.033 0.047 0.060 0.062 0.058 0.068 + 0.117 0.126 0.154 0.147 0.170 0.139 0.121 0.128 0.139 0.142 + 0.159 0.156 0.138 0.154 0.129 0.151 0.157 0.156 0.151 0.167 + 0.202 0.183 0.220 0.221 0.269 0.260 0.265 0.282 0.242 0.276 + 0.202 0.142 0.158 0.094 0.070 -0.051 0.107 0.083 0.023 0.036 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1079 sndrD1_g11 5 0.439086E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.354 0.822 0.749 1.319 + 1.331 1.228 1.152 1.203 1.092 1.129 1.173 1.108 1.130 1.097 + 1.157 1.155 1.203 1.200 1.192 1.132 1.101 1.095 1.140 1.126 + 1.162 1.158 1.157 1.196 1.189 1.204 1.245 1.248 1.242 1.291 + 1.325 1.306 1.330 1.394 1.424 1.428 1.390 1.408 1.363 1.329 + 1.243 1.150 1.131 0.878 0.763 0.571 0.771 0.854 0.796 0.834 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1080 sndrD1_g11 6 0.214709E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.883 1.082 0.821 1.150 + 0.998 0.845 0.735 0.758 0.574 0.563 0.597 0.500 0.538 0.508 + 0.570 0.547 0.570 0.590 0.484 0.390 0.317 0.285 0.326 0.279 + 0.352 0.295 0.277 0.329 0.327 0.314 0.371 0.384 0.345 0.391 + 0.468 0.441 0.476 0.584 0.619 0.624 0.525 0.509 0.434 0.328 + 0.089 -0.086 -0.306 -0.703 -0.932 -1.232 -0.886 -0.639 -0.587 -0.490 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1081 sndrD1_g11 7 0.137315E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.746 0.677 0.584 0.766 + 0.753 0.526 0.451 0.430 0.254 0.207 0.254 0.162 0.191 0.134 + 0.210 0.167 0.190 0.183 0.060 -0.001 -0.075 -0.104 -0.059 -0.124 + -0.051 -0.117 -0.123 -0.077 -0.090 -0.090 -0.038 -0.019 -0.068 -0.036 + 0.041 0.018 0.045 0.133 0.130 0.108 0.041 -0.009 -0.064 -0.163 + -0.398 -0.562 -0.845 -1.305 -1.477 -1.928 -1.483 -1.170 -1.074 -0.907 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1082 sndrD1_g11 8 0.102447E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.613 0.510 0.441 0.567 + 0.539 0.341 0.299 0.275 0.123 0.090 0.127 0.027 0.046 -0.014 + 0.047 0.018 0.038 0.001 -0.130 -0.164 -0.217 -0.262 -0.240 -0.295 + -0.252 -0.320 -0.332 -0.287 -0.304 -0.305 -0.271 -0.268 -0.304 -0.285 + -0.225 -0.258 -0.240 -0.156 -0.165 -0.192 -0.277 -0.341 -0.388 -0.500 + -0.739 -0.965 -1.320 -1.720 -1.969 -2.482 -2.061 -1.753 -1.602 -1.382 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1083 sndrD1_g11 9 -0.957399E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.235 0.164 0.100 0.159 + 0.137 0.042 0.038 0.019 -0.063 -0.126 -0.076 -0.123 -0.140 -0.178 + -0.107 -0.117 -0.098 -0.127 -0.203 -0.249 -0.343 -0.354 -0.397 -0.396 + -0.340 -0.378 -0.359 -0.276 -0.306 -0.276 -0.214 -0.235 -0.218 -0.187 + -0.146 -0.177 -0.138 -0.163 -0.140 -0.132 -0.172 -0.202 -0.136 -0.177 + -0.367 -0.416 -0.644 -0.802 -0.751 -1.225 -0.927 -0.939 -1.104 -0.905 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1084 sndrD1_g11 10 0.563132E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.022 0.350 0.107 0.420 + 0.273 0.204 0.150 0.228 0.098 0.165 0.226 0.187 0.143 0.223 + 0.220 0.345 0.283 0.306 0.288 0.183 0.147 0.084 0.171 0.185 + 0.258 0.246 0.212 0.262 0.287 0.334 0.390 0.344 0.294 0.403 + 0.449 0.462 0.437 0.586 0.637 0.662 0.597 0.588 0.587 0.523 + 0.428 0.275 0.092 0.138 -0.004 -0.145 -0.116 -0.016 0.150 -0.128 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1085 sndrD1_g11 11 0.759207E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.180 0.549 0.516 0.702 + 0.738 0.431 0.412 0.560 0.494 0.572 0.737 0.661 0.618 0.807 + 0.823 0.942 0.722 0.699 0.811 0.669 0.676 0.634 0.729 0.778 + 0.798 0.784 0.738 0.807 0.736 0.868 0.870 0.910 0.846 0.914 + 0.914 0.944 0.998 1.042 1.010 1.030 0.999 1.076 0.993 1.045 + 0.979 0.931 0.956 1.121 1.327 1.201 1.212 1.464 1.695 1.324 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1086 sndrD1_g11 12 0.763748E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.020 0.057 0.129 0.312 + 0.198 0.214 0.176 0.397 0.261 0.293 0.357 0.359 0.300 0.545 + 0.628 0.573 0.362 0.405 0.520 0.369 0.310 0.364 0.352 0.378 + 0.396 0.427 0.402 0.485 0.428 0.464 0.401 0.513 0.404 0.424 + 0.423 0.451 0.479 0.541 0.538 0.551 0.512 0.545 0.599 0.558 + 0.514 0.442 0.364 0.451 0.602 0.568 0.647 0.744 0.919 0.702 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1087 sndrD1_g11 13 0.403562E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.446 -0.620 -0.666 -0.681 + -0.734 -0.789 -0.793 -0.785 -0.817 -0.815 -0.751 -0.784 -0.794 -0.821 + -0.791 -0.805 -0.760 -0.810 -0.799 -0.806 -0.804 -0.803 -0.806 -0.792 + -0.787 -0.793 -0.791 -0.763 -0.788 -0.778 -0.790 -0.775 -0.810 -0.821 + -0.814 -0.803 -0.835 -0.818 -0.819 -0.849 -0.891 -0.878 -0.913 -0.908 + -0.933 -1.053 -1.157 -1.089 -1.098 -1.168 -1.088 -0.988 -0.895 -0.822 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1088 sndrD1_g11 14 0.485477E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.811 -0.840 -0.972 -0.967 + -0.979 -1.047 -1.072 -1.066 -1.070 -1.074 -1.045 -1.042 -1.065 -1.076 + -1.055 -1.047 -1.010 -1.026 -1.022 -1.016 -1.012 -1.015 -0.994 -0.975 + -0.974 -0.974 -0.972 -0.957 -0.964 -0.948 -0.953 -0.950 -0.959 -0.948 + -0.941 -0.936 -0.957 -0.947 -0.936 -0.972 -0.996 -0.986 -0.989 -1.002 + -0.985 -1.017 -1.060 -0.945 -0.973 -0.857 -0.775 -0.718 -0.739 -0.605 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1089 sndrD1_g11 15 0.418650E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.913 + -7.936 -7.190 -7.868 -7.884 -7.801 -7.672 -7.689 -7.691 -7.578 -7.468 + -7.582 -7.552 -7.487 -7.488 -7.448 -7.395 -7.345 -7.277 -7.191 -7.110 + -7.079 -6.924 -6.850 -6.852 -6.772 -6.629 -6.371 -6.213 -5.946 -5.908 + -5.343 -5.200 -5.329 -4.522 -3.469 -3.798 -3.113 -2.771 -2.580 -2.674 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1090 sndrD1_g11 16 0.230111E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.204 -0.928 -0.908 -0.994 + -1.004 -1.079 -0.865 -0.968 -0.993 -1.006 -0.949 -0.950 -0.961 -0.958 + -1.020 -1.019 -0.935 -1.022 -0.913 -0.952 -0.905 -0.887 -0.884 -0.850 + -0.872 -0.814 -0.776 -0.802 -0.814 -0.762 -0.757 -0.769 -0.791 -0.806 + -0.838 -0.832 -0.919 -0.905 -0.927 -0.939 -0.998 -0.957 -0.987 -0.979 + -0.993 -0.993 -1.255 -1.289 -1.252 -1.357 -0.937 -0.763 -0.421 -0.144 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1091 sndrD1_g11 17 0.574195E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.272 -0.670 -0.658 -0.810 + -0.813 -0.891 -0.625 -0.751 -0.779 -0.793 -0.728 -0.743 -0.745 -0.769 + -0.817 -0.830 -0.739 -0.837 -0.708 -0.744 -0.686 -0.668 -0.678 -0.636 + -0.678 -0.611 -0.566 -0.588 -0.595 -0.552 -0.544 -0.562 -0.604 -0.610 + -0.649 -0.642 -0.753 -0.744 -0.782 -0.822 -0.883 -0.839 -0.912 -0.898 + -0.946 -1.033 -1.346 -1.535 -1.755 -1.956 -1.421 -1.168 -0.601 -0.353 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1092 sndrD1_g11 18 0.651413E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.064 -0.164 -0.179 -0.266 + -0.252 -0.393 -0.140 -0.270 -0.321 -0.323 -0.271 -0.307 -0.285 -0.312 + -0.350 -0.345 -0.247 -0.325 -0.283 -0.306 -0.254 -0.254 -0.242 -0.207 + -0.239 -0.218 -0.181 -0.176 -0.170 -0.144 -0.127 -0.135 -0.189 -0.177 + -0.195 -0.192 -0.268 -0.239 -0.289 -0.340 -0.424 -0.420 -0.481 -0.495 + -0.583 -0.725 -1.067 -1.384 -1.736 -2.061 -1.488 -1.200 -0.690 -0.375 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1093 sndrD2_g11 1 -0.287743E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.863 -0.866 -0.904 -0.929 + -0.908 -0.913 -0.888 -0.933 -0.931 -0.946 -0.929 -0.923 -0.934 -0.924 + -0.949 -0.974 -0.960 -0.988 -1.004 -0.990 -0.992 -0.997 -1.027 -1.021 + -1.025 -1.043 -1.045 -1.054 -1.050 -1.069 -1.061 -1.070 -1.074 -1.094 + -1.101 -1.096 -1.134 -1.156 -1.171 -1.186 -1.191 -1.210 -1.219 -1.236 + -1.215 -1.211 -1.234 -1.237 -1.240 -1.197 -1.258 -1.302 -1.333 -1.340 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1094 sndrD2_g11 2 0.440734E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.440 -0.484 -0.518 -0.520 + -0.508 -0.513 -0.506 -0.504 -0.510 -0.508 -0.490 -0.496 -0.502 -0.454 + -0.523 -0.524 -0.510 -0.529 -0.523 -0.540 -0.525 -0.553 -0.560 -0.559 + -0.578 -0.584 -0.598 -0.608 -0.609 -0.625 -0.630 -0.648 -0.659 -0.687 + -0.694 -0.720 -0.742 -0.762 -0.771 -0.796 -0.807 -0.846 -0.862 -0.877 + -0.911 -0.905 -0.932 -0.948 -0.965 -0.943 -1.012 -1.040 -1.066 -1.105 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1095 sndrD2_g11 3 0.483756E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.786 0.798 0.823 0.832 + 0.830 0.835 0.817 0.888 0.845 0.866 0.915 0.896 0.905 0.888 + 0.893 0.918 0.884 0.922 0.893 0.876 0.876 0.869 0.883 0.865 + 0.891 0.870 0.893 0.895 0.877 0.879 0.873 0.865 0.867 0.856 + 0.859 0.834 0.831 0.833 0.826 0.813 0.781 0.758 0.675 0.655 + 0.578 0.557 0.501 0.405 0.332 0.339 0.268 0.165 0.126 0.030 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1096 sndrD2_g11 4 0.517983E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.126 0.203 0.194 0.228 + 0.177 0.167 0.106 0.172 0.089 0.153 0.162 0.174 0.170 0.117 + 0.136 0.169 0.177 0.163 0.145 0.147 0.137 0.110 0.151 0.160 + 0.169 0.169 0.155 0.179 0.149 0.173 0.174 0.175 0.171 0.190 + 0.230 0.208 0.233 0.257 0.294 0.285 0.316 0.268 0.283 0.289 + 0.250 0.164 0.174 0.108 -0.013 0.110 -0.038 0.150 0.064 -0.003 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1097 sndrD2_g11 5 0.441504E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.923 0.598 0.509 1.304 + 1.284 1.251 1.221 1.250 1.168 1.223 1.234 1.232 1.223 1.166 + 1.140 1.154 1.153 1.154 1.123 1.115 1.046 1.020 1.092 1.075 + 1.115 1.111 1.135 1.169 1.146 1.178 1.198 1.213 1.202 1.275 + 1.323 1.290 1.322 1.396 1.433 1.402 1.440 1.394 1.427 1.347 + 1.273 1.209 1.151 0.913 0.768 0.754 0.684 0.701 0.568 0.044 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1098 sndrD2_g11 6 0.217394E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.795 1.107 1.105 1.183 + 1.155 0.895 0.905 0.909 0.715 0.813 0.849 0.813 0.796 0.658 + 0.615 0.634 0.607 0.579 0.500 0.450 0.333 0.282 0.383 0.325 + 0.360 0.365 0.360 0.397 0.371 0.376 0.418 0.458 0.431 0.528 + 0.626 0.552 0.599 0.693 0.805 0.713 0.745 0.675 0.623 0.561 + 0.321 0.205 -0.066 -0.446 -0.583 -0.730 -0.824 -0.386 -0.184 0.004 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1099 sndrD2_g11 7 0.140525E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.658 0.841 0.880 0.956 + 1.005 0.686 0.715 0.707 0.491 0.549 0.593 0.562 0.570 0.380 + 0.332 0.367 0.300 0.280 0.201 0.149 0.037 -0.013 0.084 0.040 + 0.088 0.061 0.066 0.090 0.086 0.081 0.128 0.174 0.135 0.212 + 0.301 0.229 0.274 0.348 0.406 0.325 0.325 0.272 0.265 0.183 + 0.023 -0.177 -0.438 -0.831 -0.949 -1.117 -1.131 -0.669 -0.371 -0.018 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1100 sndrD2_g11 8 0.105487E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.496 0.624 0.673 0.642 + 0.710 0.432 0.457 0.455 0.290 0.321 0.359 0.332 0.331 0.172 + 0.131 0.147 0.056 0.027 -0.046 -0.094 -0.175 -0.237 -0.170 -0.213 + -0.171 -0.221 -0.224 -0.192 -0.193 -0.201 -0.179 -0.130 -0.177 -0.126 + -0.050 -0.121 -0.066 -0.023 0.019 -0.034 -0.077 -0.102 -0.135 -0.206 + -0.386 -0.646 -0.907 -1.271 -1.358 -1.593 -1.656 -1.110 -0.650 -0.066 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1101 sndrD2_g11 9 -0.954866E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.106 0.203 0.173 0.180 + 0.205 0.088 0.086 0.076 -0.004 0.011 -0.001 -0.041 -0.011 -0.108 + -0.078 -0.097 -0.103 -0.141 -0.207 -0.267 -0.340 -0.384 -0.388 -0.406 + -0.307 -0.345 -0.322 -0.275 -0.275 -0.254 -0.182 -0.219 -0.226 -0.146 + -0.170 -0.162 -0.170 -0.102 -0.162 -0.120 -0.094 -0.096 -0.153 -0.101 + -0.189 -0.319 -0.425 -0.345 -0.711 -0.378 -0.639 -0.252 -0.465 -0.023 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1102 sndrD2_g11 10 0.564734E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.045 0.377 0.314 0.382 + 0.285 0.328 0.214 0.400 0.228 0.393 0.403 0.399 0.422 0.326 + 0.276 0.366 0.373 0.337 0.345 0.205 0.172 0.109 0.206 0.191 + 0.259 0.247 0.229 0.305 0.287 0.357 0.355 0.419 0.323 0.460 + 0.510 0.495 0.517 0.737 0.675 0.704 0.654 0.633 0.619 0.661 + 0.495 0.383 0.211 0.378 0.146 -0.065 -0.362 -0.187 0.314 0.214 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1103 sndrD2_g11 11 0.764548E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.206 0.477 0.557 0.668 + 0.647 0.587 0.570 0.803 0.646 0.731 0.922 0.845 0.881 0.876 + 0.917 0.934 0.764 0.821 0.856 0.660 0.737 0.611 0.676 0.771 + 0.770 0.770 0.770 0.805 0.732 0.871 0.795 0.936 0.837 0.850 + 0.856 0.934 1.016 1.038 1.060 1.001 1.029 0.961 0.894 1.027 + 0.930 0.972 0.854 0.866 0.849 1.067 0.831 1.401 1.448 1.253 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1104 sndrD2_g11 12 0.784383E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.187 -0.007 0.181 0.149 + 0.197 0.263 0.237 0.261 0.370 0.274 0.402 0.466 0.553 0.718 + 0.622 0.481 0.375 0.490 0.591 0.358 0.424 0.329 0.356 0.497 + 0.440 0.447 0.443 0.535 0.438 0.488 0.425 0.574 0.480 0.418 + 0.469 0.439 0.488 0.597 0.639 0.616 0.562 0.655 0.620 0.669 + 0.570 0.568 0.438 0.426 0.526 0.538 0.606 0.660 0.982 0.494 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1105 sndrD2_g11 13 0.406323E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.598 -0.542 -0.597 -0.733 + -0.762 -0.796 -0.809 -0.791 -0.814 -0.809 -0.774 -0.804 -0.796 -0.844 + -0.841 -0.847 -0.846 -0.877 -0.868 -0.868 -0.872 -0.885 -0.865 -0.835 + -0.856 -0.851 -0.848 -0.809 -0.796 -0.819 -0.812 -0.796 -0.827 -0.852 + -0.825 -0.817 -0.824 -0.820 -0.840 -0.837 -0.838 -0.870 -0.904 -0.871 + -0.845 -0.997 -1.058 -1.103 -1.017 -0.886 -1.113 -0.584 -0.360 -0.029 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1106 sndrD2_g11 14 0.488063E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.166 -0.106 -0.135 -0.275 + -0.234 -0.283 -0.336 -0.265 -0.320 -0.332 -0.270 -0.259 -0.261 -0.326 + -0.299 -0.245 -0.238 -0.272 -0.262 -0.194 -0.224 -0.239 -0.185 -0.178 + -0.176 -0.163 -0.134 -0.118 -0.163 -0.087 -0.071 -0.053 -0.065 -0.088 + -0.060 -0.025 -0.017 -0.078 -0.128 -0.100 -0.132 -0.157 -0.097 -0.182 + -0.004 -0.189 -0.108 0.179 0.462 0.961 0.618 0.503 0.329 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1107 sndrD2_g11 15 0.440498E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -6.618 0.000 -7.251 -6.879 -7.205 -7.359 -7.272 + -7.271 -7.075 -7.237 -7.345 -7.210 -7.275 -7.064 -6.990 -6.954 -6.898 + -6.871 -6.941 -6.840 -6.699 -6.554 -6.407 -6.164 -6.162 -5.982 -5.882 + -5.720 -5.588 -5.747 -5.483 -5.234 -5.197 -4.912 -4.949 -4.122 -3.962 + -3.316 -3.379 -2.823 -1.974 -1.556 -0.678 -1.114 -0.147 -0.215 -0.366 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1108 sndrD2_g11 16 0.228467E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.743 -0.644 -0.915 -0.973 + -0.903 -0.898 -0.963 -0.839 -0.922 -0.976 -0.914 -0.947 -0.899 -0.929 + -0.975 -0.961 -0.969 -0.988 -0.907 -0.928 -0.932 -0.906 -0.892 -0.807 + -0.836 -0.856 -0.793 -0.802 -0.776 -0.775 -0.780 -0.731 -0.783 -0.865 + -0.849 -0.798 -0.848 -0.912 -0.935 -0.909 -0.926 -0.950 -0.954 -0.933 + -0.855 -1.027 -0.995 -0.825 -0.899 -0.805 -0.654 -0.101 -0.055 -0.032 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1109 sndrD2_g11 17 0.570127E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.526 -0.418 -0.638 -0.731 + -0.643 -0.625 -0.681 -0.538 -0.627 -0.717 -0.625 -0.651 -0.637 -0.645 + -0.716 -0.710 -0.687 -0.727 -0.652 -0.675 -0.654 -0.623 -0.650 -0.529 + -0.538 -0.569 -0.510 -0.526 -0.465 -0.499 -0.510 -0.458 -0.511 -0.613 + -0.572 -0.549 -0.605 -0.697 -0.739 -0.728 -0.736 -0.797 -0.819 -0.740 + -0.729 -1.034 -0.977 -0.904 -1.079 -0.903 -0.831 -0.089 -0.038 -0.098 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1110 sndrD2_g11 18 0.661280E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.162 -0.067 -0.106 -0.221 + -0.116 -0.173 -0.209 -0.054 -0.203 -0.240 -0.138 -0.211 -0.137 -0.209 + -0.251 -0.251 -0.245 -0.266 -0.294 -0.244 -0.262 -0.227 -0.213 -0.154 + -0.174 -0.180 -0.140 -0.133 -0.100 -0.118 -0.106 -0.068 -0.112 -0.172 + -0.122 -0.101 -0.138 -0.192 -0.232 -0.286 -0.287 -0.370 -0.378 -0.333 + -0.446 -0.668 -0.699 -0.654 -1.007 -0.922 -0.888 -0.144 -0.063 -0.122 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1111 sndrD3_g11 1 -0.288189E-01 + 0.000 0.000 0.000 0.000 0.000 -0.110 -0.810 -0.877 -0.859 -0.886 + -0.878 -0.861 -0.881 -0.878 -0.868 -0.890 -0.881 -0.875 -0.909 -0.898 + -0.896 -0.925 -0.934 -0.941 -0.935 -0.948 -0.954 -0.974 -0.989 -0.982 + -0.983 -0.997 -1.017 -1.013 -1.012 -1.026 -1.043 -1.060 -1.053 -1.064 + -1.069 -1.080 -1.117 -1.135 -1.159 -1.168 -1.191 -1.198 -1.202 -1.237 + -1.241 -1.207 -1.221 -1.229 -1.224 -1.226 -1.274 -1.347 -1.358 -1.364 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1112 sndrD3_g11 2 0.502600E-02 + 0.000 0.000 0.000 0.000 0.000 -0.014 -0.491 -0.529 -0.524 -0.525 + -0.521 -0.507 -0.541 -0.517 -0.516 -0.509 -0.488 -0.480 -0.483 -0.480 + -0.489 -0.508 -0.510 -0.511 -0.524 -0.541 -0.539 -0.558 -0.570 -0.566 + -0.560 -0.581 -0.596 -0.605 -0.607 -0.618 -0.637 -0.654 -0.657 -0.682 + -0.692 -0.714 -0.741 -0.756 -0.777 -0.796 -0.832 -0.842 -0.866 -0.895 + -0.917 -0.913 -0.936 -0.957 -0.963 -0.970 -1.013 -1.073 -1.087 -1.095 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1113 sndrD3_g11 3 0.483269E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.772 0.757 0.780 0.817 + 0.798 0.811 0.817 0.811 0.804 0.830 0.839 0.849 0.845 0.842 + 0.819 0.853 0.867 0.888 0.879 0.852 0.864 0.850 0.864 0.852 + 0.882 0.872 0.876 0.889 0.865 0.872 0.865 0.862 0.860 0.855 + 0.843 0.835 0.840 0.832 0.833 0.822 0.777 0.759 0.704 0.676 + 0.635 0.580 0.588 0.496 0.434 0.336 0.307 0.248 0.148 0.124 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1114 sndrD3_g11 4 0.517895E-01 + 0.000 0.000 0.000 0.000 0.000 0.025 0.153 0.094 0.079 0.232 + 0.152 0.094 0.105 0.072 0.047 0.073 0.063 0.079 0.068 0.051 + 0.033 0.070 0.161 0.126 0.171 0.137 0.164 0.139 0.154 0.154 + 0.198 0.178 0.161 0.197 0.170 0.184 0.197 0.179 0.198 0.209 + 0.235 0.251 0.249 0.293 0.321 0.344 0.322 0.321 0.315 0.309 + 0.261 0.208 0.209 0.130 0.165 0.035 0.048 0.133 0.147 0.104 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1115 sndrD3_g11 5 0.442519E-01 + 0.000 0.000 0.000 0.000 0.000 0.026 0.802 0.797 0.904 1.365 + 1.271 1.203 1.176 1.200 1.123 1.136 1.131 1.120 1.132 1.084 + 1.024 1.087 1.176 1.132 1.191 1.119 1.148 1.117 1.132 1.141 + 1.214 1.178 1.191 1.240 1.201 1.264 1.267 1.276 1.259 1.328 + 1.352 1.381 1.365 1.452 1.513 1.507 1.443 1.459 1.469 1.421 + 1.345 1.271 1.246 0.915 1.028 0.697 0.813 0.996 1.097 0.294 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1116 sndrD3_g11 6 0.219180E-01 + 0.000 0.000 0.000 0.000 0.000 0.016 0.655 0.922 0.809 1.066 + 1.006 0.758 0.724 0.686 0.593 0.592 0.597 0.517 0.564 0.448 + 0.339 0.423 0.581 0.432 0.503 0.372 0.411 0.341 0.365 0.298 + 0.453 0.361 0.344 0.429 0.369 0.413 0.447 0.464 0.400 0.495 + 0.557 0.582 0.574 0.714 0.790 0.772 0.655 0.612 0.620 0.542 + 0.288 0.130 0.002 -0.639 -0.486 -0.883 -0.610 -0.293 -0.255 0.001 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1117 sndrD3_g11 7 0.141650E-01 + 0.000 0.000 0.000 0.000 0.000 0.122 0.675 0.655 0.690 0.801 + 0.791 0.515 0.489 0.457 0.348 0.322 0.322 0.260 0.299 0.157 + 0.056 0.143 0.285 0.107 0.188 0.063 0.078 0.025 0.060 -0.019 + 0.138 0.037 0.026 0.104 0.042 0.090 0.113 0.126 0.062 0.136 + 0.202 0.211 0.204 0.324 0.350 0.318 0.230 0.175 0.190 0.123 + -0.081 -0.249 -0.442 -1.097 -0.966 -1.332 -1.068 -0.715 -0.715 -0.146 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1118 sndrD3_g11 8 0.105820E-01 + 0.000 0.000 0.000 0.000 0.000 0.086 0.422 0.307 0.365 0.398 + 0.372 0.156 0.129 0.127 0.013 -0.020 -0.013 -0.074 -0.041 -0.167 + -0.257 -0.193 -0.085 -0.256 -0.193 -0.296 -0.294 -0.349 -0.322 -0.406 + -0.270 -0.377 -0.373 -0.308 -0.374 -0.347 -0.334 -0.319 -0.388 -0.332 + -0.273 -0.285 -0.278 -0.173 -0.173 -0.210 -0.295 -0.347 -0.327 -0.410 + -0.620 -0.824 -1.027 -1.674 -1.591 -2.033 -1.807 -1.425 -1.432 -0.362 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1119 sndrD3_g11 9 -0.952801E-02 + 0.000 0.000 0.000 0.000 0.000 0.017 0.111 0.061 0.090 0.056 + 0.063 -0.039 -0.070 -0.051 -0.134 -0.185 -0.189 -0.222 -0.182 -0.245 + -0.270 -0.229 -0.153 -0.297 -0.270 -0.331 -0.386 -0.389 -0.459 -0.479 + -0.361 -0.396 -0.357 -0.298 -0.347 -0.280 -0.248 -0.240 -0.285 -0.253 + -0.222 -0.198 -0.185 -0.196 -0.242 -0.184 -0.149 -0.184 -0.199 -0.194 + -0.362 -0.310 -0.339 -0.613 -0.596 -0.834 -1.157 -0.918 -1.013 -0.149 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1120 sndrD3_g11 10 0.566853E-01 + 0.000 0.000 0.000 0.000 0.000 -0.038 0.236 0.170 -0.092 0.257 + 0.215 0.029 0.124 0.129 0.128 0.078 0.114 0.059 0.089 0.039 + 0.030 0.126 0.296 0.171 0.225 0.107 0.173 0.133 0.129 0.161 + 0.256 0.211 0.231 0.238 0.276 0.306 0.344 0.344 0.297 0.433 + 0.443 0.488 0.454 0.611 0.680 0.702 0.597 0.613 0.579 0.537 + 0.458 0.282 0.273 0.314 0.027 0.013 0.033 0.445 0.496 0.173 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1121 sndrD3_g11 11 0.764410E-01 + 0.000 0.000 0.000 0.000 0.000 -0.088 0.468 0.402 0.151 0.524 + 0.537 0.319 0.497 0.388 0.608 0.495 0.593 0.544 0.524 0.607 + 0.542 0.752 0.859 0.589 0.784 0.628 0.663 0.690 0.759 0.705 + 0.847 0.747 0.785 0.799 0.809 0.814 0.862 0.917 0.823 0.900 + 0.892 0.957 1.011 1.018 1.055 1.077 1.005 1.036 1.016 1.029 + 0.942 0.967 1.062 1.203 1.084 1.348 1.294 1.677 1.671 1.682 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1122 sndrD3_g11 12 0.771385E-01 + 0.000 0.000 0.000 0.000 0.000 0.235 0.105 0.065 -0.054 0.092 + 0.308 0.193 0.421 0.123 0.315 0.324 0.347 0.399 0.369 0.483 + 0.468 0.541 0.513 0.431 0.563 0.348 0.416 0.378 0.429 0.484 + 0.518 0.406 0.499 0.546 0.494 0.480 0.520 0.540 0.436 0.512 + 0.470 0.479 0.597 0.554 0.596 0.601 0.578 0.626 0.646 0.624 + 0.499 0.470 0.534 0.563 0.570 0.736 0.827 0.949 1.112 0.742 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1123 sndrD3_g11 13 0.405406E-01 + 0.000 0.000 0.000 0.000 0.000 -0.049 -0.582 -0.723 -0.720 -0.743 + -0.804 -0.833 -0.840 -0.815 -0.862 -0.843 -0.827 -0.845 -0.848 -0.879 + -0.893 -0.901 -0.818 -0.893 -0.832 -0.815 -0.823 -0.830 -0.830 -0.821 + -0.803 -0.811 -0.789 -0.777 -0.782 -0.781 -0.791 -0.775 -0.811 -0.801 + -0.805 -0.789 -0.810 -0.819 -0.815 -0.815 -0.826 -0.831 -0.833 -0.851 + -0.828 -0.912 -0.954 -1.011 -1.041 -1.037 -0.875 -0.736 -0.646 -0.135 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1124 sndrD3_g11 14 0.489606E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.788 -0.942 -0.970 -0.976 + -1.008 -1.047 -1.060 -1.042 -1.077 -1.057 -1.046 -1.043 -1.034 -1.073 + -1.083 -1.070 -0.991 -1.042 -1.001 -0.981 -0.981 -0.980 -0.974 -0.959 + -0.944 -0.952 -0.945 -0.930 -0.921 -0.916 -0.916 -0.920 -0.928 -0.905 + -0.913 -0.892 -0.929 -0.958 -0.943 -0.921 -0.959 -0.931 -0.920 -0.918 + -0.835 -0.931 -0.896 -0.864 -0.875 -0.765 -0.686 -0.607 -0.494 -0.105 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1125 sndrD3_g11 15 0.423867E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -7.792 -0.581 -7.739 -7.613 -7.579 -7.607 -7.493 -7.444 + -7.450 -7.460 -7.450 -7.365 -7.345 -7.288 -7.199 -7.213 -7.166 -7.067 + -7.012 -6.800 -6.782 -6.695 -6.618 -6.536 -6.324 -6.133 -5.847 -5.648 + -5.489 -4.987 -4.941 -4.263 -3.921 -3.376 -3.257 -2.944 -2.711 -2.573 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1126 sndrD3_g11 16 0.226114E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.844 -0.953 -0.955 -1.016 + -1.083 -1.075 -1.029 -1.001 -1.023 -1.062 -0.987 -1.034 -1.009 -1.014 + -1.010 -1.052 -1.005 -1.041 -1.037 -0.944 -0.976 -0.923 -0.934 -0.849 + -0.903 -0.884 -0.809 -0.837 -0.825 -0.777 -0.802 -0.786 -0.816 -0.848 + -0.863 -0.869 -0.908 -0.930 -0.997 -0.932 -0.959 -0.984 -0.949 -0.973 + -0.989 -0.989 -1.083 -1.064 -1.121 -1.025 -0.810 -0.423 -0.269 -0.135 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1127 sndrD3_g11 17 0.563422E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.584 -0.685 -0.674 -0.774 + -0.823 -0.806 -0.758 -0.684 -0.729 -0.802 -0.691 -0.767 -0.713 -0.731 + -0.726 -0.783 -0.733 -0.788 -0.786 -0.665 -0.728 -0.665 -0.679 -0.587 + -0.642 -0.605 -0.544 -0.563 -0.559 -0.503 -0.524 -0.510 -0.561 -0.590 + -0.610 -0.640 -0.691 -0.702 -0.810 -0.742 -0.786 -0.836 -0.795 -0.806 + -0.853 -0.940 -1.121 -1.468 -1.380 -1.371 -1.040 -0.565 -0.421 -0.234 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1128 sndrD3_g11 18 0.659215E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.057 -0.205 -0.229 -0.268 + -0.329 -0.348 -0.289 -0.242 -0.306 -0.355 -0.263 -0.361 -0.282 -0.305 + -0.352 -0.376 -0.306 -0.389 -0.333 -0.275 -0.301 -0.276 -0.268 -0.232 + -0.223 -0.221 -0.171 -0.164 -0.163 -0.122 -0.128 -0.110 -0.169 -0.152 + -0.173 -0.171 -0.244 -0.212 -0.298 -0.286 -0.339 -0.396 -0.381 -0.401 + -0.455 -0.640 -0.838 -1.361 -1.305 -1.431 -1.113 -0.607 -0.403 -0.261 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1129 sndrD4_g11 1 -0.291236E-01 + 0.000 0.000 0.000 0.000 0.000 -0.699 -0.861 -0.872 -0.903 -0.909 + -0.880 -0.894 -0.886 -0.909 -0.919 -0.932 -0.951 -0.938 -0.935 -0.945 + -0.939 -0.951 -0.954 -0.970 -0.969 -0.983 -0.979 -0.993 -0.993 -0.990 + -1.003 -1.008 -1.030 -1.023 -1.030 -1.019 -1.040 -1.052 -1.060 -1.070 + -1.077 -1.070 -1.112 -1.117 -1.149 -1.164 -1.156 -1.180 -1.182 -1.205 + -1.196 -1.183 -1.219 -1.215 -1.212 -1.232 -1.304 -1.316 -1.354 -1.310 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1130 sndrD4_g11 2 0.447478E-02 + 0.000 0.000 0.000 0.000 0.000 -0.232 -0.406 -0.404 -0.430 -0.474 + -0.416 -0.424 -0.439 -0.439 -0.437 -0.409 -0.477 -0.428 -0.405 -0.437 + -0.438 -0.442 -0.452 -0.443 -0.430 -0.450 -0.461 -0.482 -0.480 -0.509 + -0.494 -0.516 -0.524 -0.550 -0.551 -0.560 -0.578 -0.594 -0.615 -0.639 + -0.646 -0.662 -0.691 -0.696 -0.735 -0.762 -0.775 -0.800 -0.830 -0.852 + -0.878 -0.879 -0.913 -0.931 -0.949 -0.962 -1.029 -1.067 -1.085 -1.097 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1131 sndrD4_g11 3 0.483161E-01 + 0.000 0.000 0.000 0.000 0.000 0.108 0.731 0.717 0.731 0.723 + 0.746 0.733 0.745 0.764 0.735 0.787 0.755 0.761 0.783 0.769 + 0.733 0.782 0.818 0.860 0.825 0.798 0.818 0.793 0.814 0.824 + 0.832 0.814 0.831 0.857 0.824 0.830 0.828 0.815 0.821 0.802 + 0.808 0.797 0.798 0.794 0.789 0.783 0.745 0.694 0.665 0.670 + 0.565 0.528 0.529 0.482 0.337 0.331 0.255 0.183 0.174 0.192 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1132 sndrD4_g11 4 0.516648E-01 + 0.000 0.000 0.000 0.000 0.000 0.062 0.228 0.146 0.192 0.140 + 0.081 0.068 0.055 0.045 -0.025 0.059 0.015 0.021 0.029 0.038 + -0.020 0.022 0.122 0.153 0.098 0.112 0.118 0.089 0.124 0.130 + 0.167 0.137 0.132 0.165 0.128 0.162 0.172 0.161 0.176 0.171 + 0.207 0.202 0.229 0.254 0.279 0.307 0.306 0.311 0.293 0.341 + 0.246 0.236 0.247 0.241 0.044 0.066 0.009 0.063 0.049 0.135 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1133 sndrD4_g11 5 0.440513E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.136 0.039 1.027 + 0.483 1.371 1.467 1.482 1.347 1.469 1.452 1.387 1.419 1.395 + 1.320 1.343 1.478 1.530 1.430 1.419 1.435 1.387 1.437 1.429 + 1.490 1.455 1.485 1.512 1.487 1.541 1.583 1.560 1.584 1.615 + 1.634 1.639 1.649 1.760 1.767 1.758 1.806 1.777 1.785 1.807 + 1.676 1.700 1.586 1.453 1.139 1.068 1.026 1.171 1.224 0.855 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1134 sndrD4_g11 6 0.217272E-01 + 0.000 0.000 0.000 0.000 0.000 0.083 1.000 1.044 1.056 1.238 + 1.104 0.915 0.876 0.806 0.541 0.699 0.740 0.534 0.586 0.529 + 0.339 0.386 0.584 0.672 0.454 0.444 0.397 0.322 0.367 0.309 + 0.410 0.331 0.352 0.399 0.328 0.387 0.471 0.412 0.444 0.479 + 0.514 0.494 0.535 0.695 0.722 0.694 0.699 0.639 0.631 0.623 + 0.339 0.317 0.101 -0.343 -0.568 -0.690 -0.539 -0.303 -0.251 -0.291 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1135 sndrD4_g11 7 0.139899E-01 + 0.000 0.000 0.000 0.000 0.000 0.206 0.928 0.976 0.975 0.991 + 0.926 0.703 0.619 0.556 0.349 0.443 0.514 0.290 0.345 0.235 + 0.059 0.133 0.276 0.338 0.141 0.130 0.100 0.016 0.076 -0.012 + 0.093 0.014 0.041 0.089 0.029 0.074 0.146 0.103 0.119 0.154 + 0.197 0.150 0.176 0.350 0.304 0.278 0.255 0.215 0.198 0.221 + -0.038 -0.074 -0.360 -0.777 -0.907 -1.050 -0.988 -0.667 -0.649 -0.603 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1136 sndrD4_g11 8 0.104171E-01 + 0.000 0.000 0.000 0.000 0.000 0.167 0.643 0.637 0.620 0.608 + 0.572 0.358 0.279 0.226 0.042 0.101 0.185 -0.022 0.040 -0.091 + -0.227 -0.190 -0.087 -0.072 -0.230 -0.253 -0.277 -0.347 -0.323 -0.412 + -0.317 -0.399 -0.386 -0.336 -0.404 -0.379 -0.335 -0.356 -0.362 -0.351 + -0.303 -0.359 -0.319 -0.167 -0.217 -0.251 -0.283 -0.323 -0.355 -0.342 + -0.599 -0.713 -0.971 -1.345 -1.586 -1.763 -1.783 -1.364 -1.337 -1.217 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1137 sndrD4_g11 9 -0.956945E-02 + 0.000 0.000 0.000 0.000 0.000 0.048 0.217 0.225 0.202 0.125 + 0.126 0.009 -0.004 -0.050 -0.168 -0.167 -0.119 -0.239 -0.185 -0.284 + -0.306 -0.281 -0.211 -0.238 -0.368 -0.430 -0.406 -0.483 -0.530 -0.526 + -0.470 -0.461 -0.423 -0.371 -0.455 -0.369 -0.342 -0.321 -0.340 -0.344 + -0.287 -0.293 -0.274 -0.238 -0.268 -0.273 -0.216 -0.235 -0.280 -0.230 + -0.372 -0.265 -0.475 -0.419 -0.735 -0.767 -1.102 -0.993 -0.713 -0.349 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1138 sndrD4_g11 10 0.566531E-01 + 0.000 0.000 0.000 0.000 0.000 -0.287 0.102 0.006 0.113 0.148 + 0.131 0.136 0.122 0.169 0.052 0.093 0.103 0.078 0.117 0.085 + -0.068 0.052 0.318 0.329 0.137 0.086 0.091 -0.011 0.115 0.067 + 0.164 0.120 0.170 0.175 0.178 0.228 0.280 0.264 0.253 0.309 + 0.389 0.379 0.407 0.486 0.561 0.606 0.637 0.540 0.571 0.598 + 0.301 0.255 0.354 0.346 -0.079 -0.268 0.070 0.041 0.361 0.222 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1139 sndrD4_g11 11 0.764518E-01 + 0.000 0.000 0.000 0.000 0.000 0.004 0.330 0.218 0.378 0.374 + 0.474 0.344 0.548 0.403 0.444 0.460 0.589 0.514 0.565 0.556 + 0.397 0.569 0.744 0.714 0.600 0.571 0.606 0.525 0.611 0.603 + 0.694 0.626 0.615 0.695 0.655 0.693 0.759 0.727 0.745 0.773 + 0.789 0.781 0.877 0.924 0.950 0.945 0.945 0.940 0.928 1.036 + 0.845 0.843 0.849 0.934 1.063 1.268 1.042 1.554 1.676 1.007 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1140 sndrD4_g11 12 0.774063E-01 + 0.000 0.000 0.000 0.000 0.000 0.342 0.307 0.128 0.092 0.045 + 0.038 0.266 0.326 0.302 0.282 0.201 0.297 0.433 0.490 0.432 + 0.402 0.533 0.484 0.445 0.411 0.267 0.392 0.364 0.428 0.418 + 0.489 0.388 0.414 0.457 0.432 0.415 0.392 0.456 0.488 0.436 + 0.406 0.414 0.479 0.522 0.546 0.568 0.553 0.530 0.582 0.759 + 0.442 0.411 0.372 0.498 0.613 0.713 0.613 0.904 0.943 1.141 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1141 sndrD4_g11 13 0.404856E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.230 -0.799 -0.780 -0.989 + -1.059 -1.107 -1.112 -1.128 -1.171 -1.138 -1.109 -1.161 -1.168 -1.203 + -1.249 -1.240 -1.176 -1.193 -1.219 -1.216 -1.208 -1.216 -1.203 -1.204 + -1.202 -1.218 -1.194 -1.162 -1.190 -1.198 -1.187 -1.178 -1.216 -1.227 + -1.226 -1.212 -1.235 -1.217 -1.245 -1.214 -1.250 -1.217 -1.247 -1.270 + -1.230 -1.278 -1.325 -1.334 -1.365 -1.303 -1.381 -1.043 -1.072 -0.809 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1142 sndrD4_g11 14 0.488768E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 -0.824 -0.904 -0.914 -0.998 + -1.079 -1.102 -1.128 -1.138 -1.159 -1.134 -1.098 -1.144 -1.138 -1.162 + -1.207 -1.169 -1.125 -1.114 -1.155 -1.147 -1.128 -1.115 -1.088 -1.088 + -1.098 -1.096 -1.080 -1.051 -1.067 -1.064 -1.053 -1.042 -1.066 -1.059 + -1.058 -1.035 -1.062 -1.042 -1.076 -1.038 -1.072 -1.033 -1.041 -1.051 + -0.986 -1.012 -1.011 -0.858 -0.927 -0.833 -0.883 -0.545 -0.651 -0.319 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1143 sndrD4_g11 15 0.426942E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -7.758 -7.748 -7.760 -7.694 -7.610 -7.554 -7.479 -7.421 + -7.443 -7.423 -7.430 -7.304 -7.313 -7.280 -7.215 -7.172 -7.109 -7.038 + -6.975 -6.737 -6.750 -6.664 -6.593 -6.378 -6.200 -5.939 -5.822 -5.630 + -5.145 -4.796 -4.721 -4.061 -3.401 -3.211 -3.008 -2.759 -2.437 -2.234 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1144 sndrD4_g11 16 0.226329E-01 + 0.000 0.000 0.000 0.000 0.000 -0.040 -0.716 -0.580 -0.871 -0.962 + -0.963 -1.048 -0.976 -0.951 -1.026 -0.983 -0.950 -1.021 -0.990 -1.023 + -1.048 -1.032 -1.061 -1.075 -1.014 -1.008 -0.997 -0.968 -0.986 -0.890 + -0.968 -0.910 -0.856 -0.836 -0.862 -0.850 -0.864 -0.840 -0.891 -0.887 + -0.902 -0.899 -0.935 -0.958 -1.013 -0.931 -1.015 -0.995 -1.022 -1.030 + -0.935 -0.982 -0.947 -1.093 -0.961 -0.833 -0.886 -0.465 -0.348 -0.389 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1145 sndrD4_g11 17 0.563436E-02 + 0.000 0.000 0.000 0.000 0.000 -0.030 -0.409 -0.320 -0.585 -0.688 + -0.681 -0.768 -0.670 -0.631 -0.743 -0.694 -0.637 -0.728 -0.694 -0.740 + -0.768 -0.763 -0.802 -0.791 -0.752 -0.754 -0.725 -0.688 -0.710 -0.615 + -0.694 -0.631 -0.567 -0.547 -0.587 -0.561 -0.576 -0.553 -0.627 -0.619 + -0.639 -0.645 -0.700 -0.724 -0.805 -0.723 -0.834 -0.841 -0.859 -0.848 + -0.803 -0.947 -0.929 -1.215 -1.124 -0.956 -0.923 -0.506 -0.535 -0.418 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1146 sndrD4_g11 18 0.652246E-02 + 0.000 0.000 0.000 0.000 0.000 -0.010 -0.039 -0.044 -0.049 -0.206 + -0.162 -0.314 -0.239 -0.190 -0.330 -0.262 -0.233 -0.322 -0.272 -0.331 + -0.398 -0.378 -0.345 -0.357 -0.355 -0.349 -0.319 -0.324 -0.322 -0.278 + -0.298 -0.292 -0.228 -0.193 -0.225 -0.202 -0.187 -0.178 -0.230 -0.231 + -0.233 -0.221 -0.283 -0.252 -0.345 -0.310 -0.381 -0.434 -0.472 -0.405 + -0.465 -0.605 -0.685 -1.072 -1.165 -1.106 -0.910 -0.460 -0.548 -0.373 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1147 sndrD1_g12 1 -0.302705E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.678 -0.757 -0.791 -0.814 -0.825 -0.858 -0.810 + -0.816 -0.824 -0.855 -0.818 -0.839 -0.854 -0.861 -0.877 -0.882 -0.910 + -0.896 -0.894 -0.873 -0.890 -0.889 -0.882 -0.887 -0.909 -0.892 -0.907 + -0.890 -0.917 -0.891 -0.925 -0.928 -0.915 -0.916 -0.922 -0.916 -0.941 + -0.966 -0.940 -0.956 -0.920 -0.968 -0.970 -0.927 -1.049 -1.071 -1.096 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1148 sndrD1_g12 2 0.936010E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.490 -0.508 -0.494 -0.512 -0.500 -0.524 -0.521 + -0.519 -0.501 -0.514 -0.508 -0.519 -0.540 -0.551 -0.558 -0.557 -0.574 + -0.582 -0.574 -0.579 -0.584 -0.601 -0.603 -0.609 -0.619 -0.636 -0.653 + -0.655 -0.663 -0.664 -0.694 -0.707 -0.688 -0.708 -0.717 -0.713 -0.753 + -0.764 -0.764 -0.764 -0.770 -0.820 -0.805 -0.765 -0.862 -0.868 -0.951 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1149 sndrD1_g12 3 0.503977E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.609 0.635 0.684 0.703 0.719 0.729 0.725 + 0.737 0.744 0.732 0.758 0.757 0.749 0.757 0.769 0.774 0.781 + 0.783 0.783 0.779 0.805 0.788 0.763 0.757 0.748 0.739 0.702 + 0.733 0.686 0.709 0.683 0.702 0.682 0.674 0.674 0.638 0.592 + 0.601 0.594 0.573 0.584 0.536 0.437 0.496 0.527 0.582 0.528 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1150 sndrD1_g12 4 0.518413E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.407 0.425 0.463 0.531 0.565 0.575 0.550 + 0.551 0.562 0.578 0.614 0.614 0.568 0.593 0.552 0.559 0.542 + 0.545 0.538 0.549 0.535 0.529 0.534 0.500 0.525 0.545 0.511 + 0.536 0.533 0.545 0.528 0.569 0.550 0.527 0.535 0.526 0.508 + 0.522 0.478 0.499 0.528 0.463 0.423 0.460 0.557 0.631 0.766 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1151 sndrD1_g12 5 0.417850E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -1.472 -1.412 -1.367 -1.242 -1.211 -1.171 -1.238 + -1.240 -1.252 -1.255 -1.183 -1.164 -1.252 -1.231 -1.274 -1.298 -1.269 + -1.275 -1.246 -1.281 -1.262 -1.283 -1.285 -1.350 -1.316 -1.309 -1.342 + -1.294 -1.323 -1.317 -1.316 -1.297 -1.311 -1.317 -1.330 -1.350 -1.340 + -1.365 -1.400 -1.498 -1.414 -1.590 -1.801 -1.688 -1.584 -1.599 -1.482 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1152 sndrD1_g12 6 0.206582E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.660 0.699 0.837 0.957 1.001 1.058 1.001 + 1.054 1.017 1.042 1.115 1.142 1.031 1.033 0.961 0.918 0.947 + 0.937 0.920 0.872 0.857 0.809 0.813 0.752 0.773 0.773 0.719 + 0.738 0.711 0.699 0.698 0.713 0.644 0.618 0.562 0.519 0.464 + 0.385 0.266 0.000 0.198 -0.065 -0.488 -0.437 -0.155 -0.333 -0.115 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1153 sndrD1_g12 7 0.131591E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.228 0.244 0.439 0.500 0.542 0.603 0.562 + 0.649 0.601 0.674 0.708 0.740 0.656 0.655 0.638 0.633 0.670 + 0.655 0.632 0.602 0.596 0.519 0.546 0.477 0.465 0.448 0.375 + 0.386 0.354 0.332 0.326 0.316 0.243 0.213 0.157 0.118 0.086 + -0.035 -0.133 -0.440 -0.304 -0.507 -0.802 -0.780 -0.716 -0.886 -0.531 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1154 sndrD1_g12 8 0.949616E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.038 0.018 0.167 0.201 0.205 0.256 0.228 + 0.347 0.300 0.391 0.368 0.410 0.364 0.352 0.377 0.391 0.424 + 0.391 0.338 0.305 0.281 0.206 0.212 0.142 0.091 0.048 -0.016 + -0.040 -0.067 -0.100 -0.133 -0.165 -0.252 -0.302 -0.392 -0.445 -0.467 + -0.628 -0.723 -0.976 -0.988 -1.112 -1.193 -1.249 -1.406 -1.565 -1.176 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1155 sndrD1_g12 9 -0.941833E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.096 0.072 0.170 0.169 0.115 0.162 0.143 + 0.240 0.203 0.253 0.210 0.234 0.237 0.235 0.278 0.291 0.268 + 0.284 0.231 0.204 0.218 0.172 0.157 0.123 0.052 0.048 0.055 + 0.030 0.002 -0.013 -0.015 -0.049 -0.119 -0.134 -0.208 -0.215 -0.143 + -0.412 -0.408 -0.449 -0.483 -0.489 -0.346 -0.564 -0.580 -0.313 -0.281 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1156 sndrD1_g12 10 0.549791E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.717 0.772 0.956 1.066 1.095 1.145 0.961 + 0.898 0.867 0.816 0.909 0.913 0.800 0.878 0.813 0.773 0.791 + 0.773 0.836 0.766 0.807 0.819 0.824 0.758 0.817 0.850 0.814 + 0.794 0.840 0.792 0.781 0.865 0.843 0.818 0.857 0.763 0.773 + 0.841 0.737 0.614 0.680 0.560 0.256 0.195 0.595 0.786 0.510 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1157 sndrD1_g12 11 0.738103E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.885 1.134 1.243 1.322 1.355 1.533 1.232 + 1.178 1.090 1.069 1.087 1.111 0.975 1.041 0.943 0.970 0.994 + 0.996 1.042 1.028 1.050 1.108 1.140 1.059 1.074 1.224 1.115 + 1.181 1.176 1.177 1.175 1.337 1.287 1.379 1.389 1.339 1.293 + 1.322 1.332 1.257 1.359 1.295 1.220 1.169 1.448 1.568 1.704 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1158 sndrD1_g12 12 0.797702E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.772 1.008 1.086 1.279 1.163 1.265 0.916 + 0.976 0.896 0.689 0.683 0.685 0.581 0.550 0.456 0.475 0.491 + 0.487 0.560 0.469 0.487 0.579 0.517 0.499 0.522 0.692 0.596 + 0.707 0.720 0.784 0.783 0.884 0.897 0.820 0.868 0.835 0.731 + 0.754 0.760 0.625 0.768 0.769 0.723 0.860 1.019 1.097 1.308 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1159 sndrD1_g12 13 0.386426E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.377 0.343 0.468 0.476 0.440 0.447 0.491 + 0.574 0.590 0.654 0.600 0.651 0.672 0.696 0.765 0.805 0.817 + 0.826 0.779 0.775 0.794 0.762 0.773 0.766 0.720 0.692 0.674 + 0.655 0.672 0.640 0.635 0.625 0.598 0.566 0.503 0.497 0.534 + 0.448 0.473 0.371 0.368 0.419 0.521 0.466 0.332 0.267 0.602 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1160 sndrD1_g12 14 0.491883E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.177 0.189 0.240 0.286 0.282 0.314 0.316 + 0.378 0.406 0.443 0.452 0.452 0.480 0.486 0.547 0.556 0.581 + 0.603 0.593 0.618 0.634 0.599 0.626 0.630 0.623 0.619 0.629 + 0.599 0.647 0.628 0.622 0.627 0.613 0.630 0.602 0.629 0.665 + 0.644 0.655 0.645 0.610 0.605 0.808 0.816 0.702 0.861 0.924 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1161 sndrD1_g12 15 0.448110E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -7.214 -7.130 -7.110 -7.139 -7.091 -7.012 -7.093 + -6.976 -6.937 -6.899 -6.914 -6.837 -6.793 -6.780 -6.694 -6.667 -6.644 + -6.599 -6.448 -6.384 -6.360 -6.296 -6.223 -6.079 -5.995 -5.855 -5.721 + -5.616 -5.559 -5.474 -5.327 -5.286 -5.217 -5.060 -4.938 -4.827 -4.468 + -4.387 -4.265 -4.245 -4.391 -4.155 -3.080 -3.681 -3.689 -3.768 -3.827 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1162 sndrD1_g12 16 0.232860E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.186 -0.358 -0.240 -0.334 -0.422 -0.442 -0.341 + -0.218 -0.181 -0.189 -0.257 -0.254 -0.145 -0.134 0.004 0.089 0.138 + 0.092 0.069 0.064 0.120 0.050 0.050 0.068 -0.025 -0.034 -0.085 + -0.182 -0.093 -0.148 -0.177 -0.268 -0.297 -0.363 -0.439 -0.394 -0.298 + -0.436 -0.422 -0.541 -0.622 -0.413 0.014 -0.118 -0.630 -0.618 -0.186 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1163 sndrD1_g12 17 0.567372E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.007 -0.137 0.006 -0.106 -0.227 -0.242 -0.128 + 0.014 0.064 0.052 -0.039 -0.033 0.087 0.105 0.283 0.392 0.439 + 0.382 0.350 0.359 0.434 0.320 0.311 0.340 0.210 0.205 0.130 + 0.011 0.127 0.031 -0.006 -0.165 -0.191 -0.283 -0.386 -0.322 -0.206 + -0.414 -0.384 -0.607 -0.731 -0.456 0.157 -0.085 -1.051 -1.010 -0.480 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1164 sndrD1_g12 18 0.583744E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.304 0.230 0.408 0.340 0.239 0.215 0.312 + 0.429 0.475 0.480 0.411 0.425 0.518 0.538 0.683 0.782 0.828 + 0.778 0.759 0.773 0.828 0.724 0.736 0.752 0.652 0.632 0.583 + 0.439 0.552 0.493 0.453 0.318 0.276 0.216 0.099 0.149 0.230 + 0.060 0.042 -0.184 -0.261 -0.160 0.346 0.054 -0.638 -0.767 -0.233 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1165 sndrD2_g12 1 -0.302785E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.662 -0.664 -0.743 -0.767 -0.756 -0.749 -0.744 + -0.731 -0.751 -0.765 -0.752 -0.803 -0.792 -0.808 -0.811 -0.807 -0.828 + -0.829 -0.821 -0.831 -0.829 -0.838 -0.841 -0.845 -0.842 -0.839 -0.849 + -0.849 -0.855 -0.855 -0.873 -0.869 -0.856 -0.874 -0.872 -0.874 -0.877 + -0.922 -0.935 -0.952 -0.931 -0.927 -0.988 -0.955 -0.977 -0.967 -1.008 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1166 sndrD2_g12 2 0.102221E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.522 -0.529 -0.551 -0.570 -0.556 -0.567 -0.585 + -0.538 -0.573 -0.568 -0.560 -0.580 -0.560 -0.578 -0.578 -0.571 -0.581 + -0.588 -0.605 -0.596 -0.592 -0.613 -0.605 -0.615 -0.636 -0.626 -0.634 + -0.643 -0.638 -0.640 -0.676 -0.657 -0.669 -0.690 -0.699 -0.687 -0.703 + -0.741 -0.739 -0.751 -0.750 -0.747 -0.783 -0.783 -0.807 -0.836 -0.837 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1167 sndrD2_g12 3 0.503275E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.521 0.563 0.565 0.587 0.622 0.622 0.595 + 0.608 0.613 0.627 0.636 0.627 0.635 0.632 0.644 0.651 0.651 + 0.646 0.650 0.651 0.651 0.644 0.635 0.617 0.604 0.611 0.583 + 0.582 0.573 0.569 0.541 0.545 0.546 0.526 0.509 0.503 0.481 + 0.484 0.455 0.459 0.452 0.434 0.330 0.330 0.389 0.373 0.423 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1168 sndrD2_g12 4 0.517530E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.444 0.493 0.518 0.555 0.585 0.603 0.577 + 0.582 0.572 0.622 0.628 0.629 0.604 0.612 0.586 0.571 0.567 + 0.551 0.550 0.544 0.532 0.529 0.523 0.506 0.502 0.515 0.504 + 0.512 0.515 0.514 0.501 0.531 0.516 0.503 0.493 0.499 0.469 + 0.444 0.446 0.450 0.442 0.440 0.344 0.444 0.469 0.567 0.549 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1169 sndrD2_g12 5 0.416268E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -1.653 -1.572 -1.507 -1.439 -1.390 -1.382 -1.434 + -1.434 -1.469 -1.403 -1.376 -1.382 -1.413 -1.412 -1.447 -1.477 -1.452 + -1.475 -1.470 -1.487 -1.493 -1.502 -1.509 -1.557 -1.547 -1.547 -1.586 + -1.574 -1.578 -1.589 -1.571 -1.552 -1.576 -1.574 -1.611 -1.602 -1.675 + -1.672 -1.677 -1.784 -1.897 -1.897 -2.051 -1.914 -2.035 -1.927 -1.777 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1170 sndrD2_g12 6 0.204529E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.594 0.666 0.796 0.917 0.938 0.996 0.938 + 0.955 0.922 1.032 1.023 1.023 0.965 0.968 0.906 0.842 0.857 + 0.827 0.794 0.771 0.725 0.692 0.686 0.634 0.641 0.611 0.581 + 0.533 0.561 0.533 0.540 0.537 0.478 0.444 0.345 0.309 0.212 + 0.148 0.022 -0.110 -0.431 -0.332 -0.764 -0.640 -0.790 -0.537 -0.239 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1171 sndrD2_g12 7 0.129669E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.165 0.260 0.408 0.482 0.521 0.542 0.512 + 0.568 0.539 0.663 0.641 0.645 0.631 0.615 0.594 0.561 0.590 + 0.560 0.530 0.507 0.477 0.416 0.442 0.368 0.343 0.277 0.248 + 0.197 0.215 0.180 0.180 0.151 0.098 0.060 -0.039 -0.093 -0.162 + -0.264 -0.345 -0.586 -0.960 -0.791 -1.146 -1.038 -1.350 -1.134 -0.811 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1172 sndrD2_g12 8 0.935361E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.074 0.002 0.126 0.171 0.173 0.197 0.182 + 0.260 0.234 0.356 0.296 0.310 0.328 0.310 0.314 0.296 0.320 + 0.284 0.235 0.210 0.173 0.102 0.126 0.038 0.010 -0.079 -0.133 + -0.169 -0.160 -0.204 -0.229 -0.282 -0.333 -0.394 -0.507 -0.573 -0.652 + -0.755 -0.816 -1.106 -1.500 -1.357 -1.503 -1.584 -1.980 -1.796 -1.403 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1173 sndrD2_g12 9 -0.947345E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.017 0.083 0.159 0.144 0.108 0.146 0.110 + 0.183 0.183 0.237 0.153 0.178 0.220 0.216 0.213 0.216 0.213 + 0.208 0.139 0.146 0.143 0.104 0.093 0.026 -0.003 -0.070 -0.063 + -0.050 -0.050 -0.113 -0.108 -0.119 -0.134 -0.177 -0.257 -0.302 -0.330 + -0.429 -0.424 -0.513 -0.689 -0.609 -0.681 -0.655 -0.806 -0.668 -0.531 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1174 sndrD2_g12 10 0.548775E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.540 0.666 0.805 0.939 0.945 0.978 0.817 + 0.703 0.719 0.743 0.779 0.776 0.677 0.745 0.662 0.635 0.624 + 0.613 0.640 0.608 0.636 0.644 0.644 0.619 0.656 0.657 0.630 + 0.612 0.632 0.585 0.586 0.652 0.652 0.604 0.588 0.612 0.449 + 0.586 0.425 0.465 0.433 0.314 0.124 0.106 0.344 0.500 0.259 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1175 sndrD2_g12 11 0.738658E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.821 1.097 1.177 1.344 1.286 1.370 1.138 + 1.021 1.010 1.018 1.019 1.027 0.879 0.950 0.883 0.880 0.904 + 0.884 0.914 0.941 0.995 1.025 1.030 0.981 1.030 1.078 1.014 + 1.078 1.019 1.051 1.030 1.205 1.141 1.212 1.171 1.224 1.120 + 1.236 1.080 1.235 1.267 0.994 1.048 1.067 1.223 1.488 1.432 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1176 sndrD2_g12 12 0.800446E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.782 1.003 1.053 1.194 1.127 1.066 0.909 + 0.818 0.791 0.667 0.623 0.634 0.553 0.475 0.382 0.415 0.371 + 0.372 0.360 0.423 0.407 0.530 0.467 0.421 0.459 0.535 0.490 + 0.624 0.569 0.651 0.606 0.758 0.745 0.774 0.703 0.777 0.648 + 0.724 0.666 0.714 0.780 0.653 0.720 0.868 0.708 1.090 1.058 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1177 sndrD2_g12 13 0.386235E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.364 0.338 0.437 0.421 0.383 0.428 0.427 + 0.532 0.540 0.587 0.567 0.586 0.640 0.642 0.680 0.698 0.736 + 0.725 0.675 0.686 0.671 0.625 0.679 0.667 0.654 0.614 0.586 + 0.578 0.599 0.611 0.551 0.555 0.535 0.469 0.423 0.434 0.403 + 0.372 0.357 0.272 0.092 0.135 0.114 0.140 -0.033 0.031 0.360 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1178 sndrD2_g12 14 0.492304E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.149 0.159 0.196 0.199 0.224 0.295 0.263 + 0.342 0.362 0.382 0.411 0.423 0.424 0.460 0.487 0.482 0.542 + 0.555 0.535 0.532 0.529 0.531 0.542 0.525 0.535 0.537 0.540 + 0.556 0.584 0.558 0.579 0.540 0.555 0.529 0.530 0.555 0.502 + 0.550 0.598 0.591 0.581 0.454 0.687 0.608 0.596 0.605 0.282 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1179 sndrD2_g12 15 0.452854E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -6.439 -6.792 -6.775 -6.888 -6.736 -6.714 -6.740 + -6.623 -6.567 -6.600 -6.490 -6.438 -6.523 -6.474 -6.338 -6.289 -6.310 + -6.182 -5.925 -5.955 -5.945 -5.777 -5.744 -5.625 -5.514 -5.406 -5.338 + -5.208 -5.091 -4.975 -4.793 -4.772 -4.704 -4.571 -4.475 -4.307 -4.035 + -3.806 -3.595 -3.564 -3.379 -3.319 -2.457 -2.664 -3.631 -3.183 -3.209 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1180 sndrD2_g12 16 0.232287E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.210 -0.254 -0.264 -0.354 -0.466 -0.453 -0.353 + -0.244 -0.245 -0.224 -0.294 -0.246 -0.188 -0.127 -0.062 -0.013 0.058 + -0.007 -0.034 -0.013 0.008 -0.067 -0.027 -0.071 -0.121 -0.232 -0.196 + -0.208 -0.163 -0.251 -0.318 -0.359 -0.393 -0.485 -0.540 -0.488 -0.517 + -0.562 -0.535 -0.685 -0.819 -0.563 -0.468 -0.549 -0.978 -0.808 -0.439 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1181 sndrD2_g12 17 0.565316E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.068 -0.129 0.006 -0.131 -0.241 -0.200 -0.112 + 0.021 0.017 0.043 -0.036 -0.042 0.080 0.093 0.203 0.309 0.360 + 0.289 0.271 0.293 0.320 0.231 0.254 0.225 0.153 -0.002 -0.001 + -0.027 0.045 -0.062 -0.163 -0.200 -0.273 -0.398 -0.463 -0.445 -0.387 + -0.498 -0.411 -0.737 -1.109 -0.741 -0.349 -0.722 -1.360 -1.130 -0.721 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1182 sndrD2_g12 18 0.576025E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.235 0.242 0.369 0.281 0.166 0.213 0.283 + 0.416 0.417 0.422 0.353 0.387 0.470 0.506 0.594 0.680 0.713 + 0.683 0.662 0.670 0.682 0.608 0.640 0.593 0.539 0.409 0.445 + 0.417 0.466 0.359 0.257 0.242 0.154 0.106 0.029 0.009 0.021 + -0.119 -0.040 -0.402 -0.849 -0.402 -0.282 -0.536 -1.080 -0.725 -0.675 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1183 sndrD3_g12 1 -0.298424E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.225 -0.627 -0.643 -0.687 -0.726 -0.739 -0.730 -0.716 + -0.726 -0.741 -0.730 -0.753 -0.777 -0.763 -0.775 -0.795 -0.788 -0.825 + -0.814 -0.805 -0.827 -0.823 -0.815 -0.831 -0.832 -0.830 -0.831 -0.820 + -0.831 -0.836 -0.829 -0.833 -0.840 -0.842 -0.867 -0.856 -0.847 -0.874 + -0.887 -0.891 -0.907 -0.893 -0.891 -0.988 -0.949 -0.939 -0.975 -0.946 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1184 sndrD3_g12 2 0.101800E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.152 -0.548 -0.533 -0.544 -0.566 -0.564 -0.572 -0.552 + -0.548 -0.553 -0.542 -0.573 -0.552 -0.542 -0.551 -0.569 -0.567 -0.579 + -0.588 -0.591 -0.591 -0.581 -0.591 -0.596 -0.604 -0.602 -0.611 -0.597 + -0.626 -0.618 -0.625 -0.649 -0.647 -0.644 -0.673 -0.683 -0.682 -0.703 + -0.706 -0.712 -0.738 -0.738 -0.716 -0.793 -0.784 -0.810 -0.844 -0.851 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1185 sndrD3_g12 3 0.504779E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.043 0.567 0.603 0.631 0.653 0.676 0.683 0.676 + 0.666 0.683 0.681 0.703 0.686 0.713 0.717 0.716 0.717 0.724 + 0.727 0.741 0.729 0.738 0.743 0.728 0.731 0.708 0.705 0.694 + 0.682 0.685 0.684 0.660 0.661 0.677 0.635 0.644 0.619 0.600 + 0.587 0.594 0.575 0.573 0.565 0.436 0.446 0.486 0.528 0.526 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1186 sndrD3_g12 4 0.518548E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.035 0.419 0.454 0.487 0.590 0.582 0.602 0.574 + 0.606 0.596 0.621 0.636 0.647 0.611 0.621 0.589 0.586 0.592 + 0.582 0.585 0.573 0.573 0.579 0.576 0.548 0.574 0.588 0.598 + 0.559 0.575 0.571 0.594 0.599 0.605 0.570 0.580 0.554 0.561 + 0.560 0.557 0.597 0.519 0.626 0.409 0.412 0.503 0.636 0.809 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1187 sndrD3_g12 5 0.418051E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -1.466 -1.422 -1.356 -1.227 -1.235 -1.207 -1.263 + -1.225 -1.280 -1.225 -1.183 -1.194 -1.245 -1.236 -1.276 -1.270 -1.236 + -1.277 -1.243 -1.268 -1.261 -1.271 -1.275 -1.328 -1.310 -1.297 -1.293 + -1.323 -1.318 -1.318 -1.316 -1.302 -1.321 -1.308 -1.305 -1.335 -1.349 + -1.332 -1.385 -1.415 -1.636 -1.485 -1.759 -1.771 -1.749 -1.585 -1.085 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1188 sndrD3_g12 6 0.207158E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.030 0.671 0.713 0.830 0.987 0.983 1.021 1.002 + 1.063 0.997 1.070 1.128 1.101 1.038 1.048 0.954 0.946 0.968 + 0.926 0.941 0.870 0.856 0.821 0.822 0.761 0.778 0.769 0.757 + 0.709 0.677 0.676 0.677 0.655 0.644 0.588 0.585 0.523 0.413 + 0.381 0.266 0.196 -0.161 -0.063 -0.439 -0.463 -0.405 -0.310 0.242 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1189 sndrD3_g12 7 0.131452E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.079 0.278 0.300 0.438 0.566 0.559 0.594 0.581 + 0.707 0.626 0.731 0.755 0.739 0.711 0.705 0.657 0.685 0.721 + 0.673 0.680 0.626 0.622 0.559 0.580 0.532 0.505 0.472 0.432 + 0.390 0.370 0.357 0.331 0.311 0.275 0.221 0.206 0.147 0.074 + 0.003 -0.103 -0.231 -0.691 -0.411 -0.700 -0.769 -0.935 -0.807 -0.228 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1190 sndrD3_g12 8 0.949354E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.085 0.042 0.036 0.145 0.223 0.196 0.228 0.228 + 0.372 0.300 0.418 0.395 0.392 0.406 0.368 0.383 0.404 0.431 + 0.380 0.352 0.300 0.297 0.209 0.229 0.174 0.112 0.057 -0.006 + -0.032 -0.069 -0.091 -0.132 -0.181 -0.232 -0.306 -0.338 -0.401 -0.462 + -0.564 -0.697 -0.806 -1.309 -0.975 -1.191 -1.271 -1.686 -1.462 -0.825 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1191 sndrD3_g12 9 -0.942103E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.009 -0.017 -0.004 0.057 0.086 0.039 0.053 0.064 + 0.179 0.132 0.198 0.147 0.150 0.202 0.172 0.190 0.206 0.200 + 0.199 0.131 0.148 0.138 0.088 0.077 0.061 -0.022 -0.039 -0.028 + -0.044 -0.044 -0.113 -0.089 -0.118 -0.178 -0.214 -0.241 -0.266 -0.246 + -0.332 -0.491 -0.267 -0.620 -0.386 -0.581 -0.883 -0.952 -0.556 -0.131 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1192 sndrD3_g12 10 0.549588E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.130 0.672 0.800 0.885 1.062 1.026 1.053 0.924 + 0.899 0.829 0.827 0.864 0.866 0.785 0.841 0.782 0.766 0.806 + 0.768 0.798 0.755 0.790 0.818 0.807 0.828 0.831 0.875 0.859 + 0.795 0.792 0.757 0.769 0.839 0.853 0.790 0.830 0.834 0.771 + 0.746 0.666 0.723 0.506 0.672 0.185 0.308 0.470 0.770 0.810 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1193 sndrD3_g12 11 0.738135E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.159 0.821 1.178 1.185 1.380 1.278 1.342 1.152 + 1.131 1.067 1.011 0.994 1.044 0.907 0.963 0.874 0.880 0.920 + 0.898 0.989 0.936 0.990 1.050 1.040 1.079 1.035 1.154 1.102 + 1.174 1.105 1.122 1.115 1.216 1.222 1.237 1.332 1.267 1.277 + 1.291 1.250 1.180 1.274 1.323 1.152 1.125 1.375 1.619 1.738 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1194 sndrD3_g12 12 0.799418E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.276 0.727 0.997 0.946 1.177 1.104 1.137 0.942 + 0.953 0.855 0.674 0.642 0.616 0.519 0.519 0.372 0.411 0.437 + 0.409 0.420 0.430 0.456 0.489 0.432 0.531 0.493 0.619 0.623 + 0.621 0.656 0.725 0.660 0.800 0.684 0.723 0.801 0.798 0.762 + 0.704 0.674 0.675 0.711 0.780 0.594 0.821 0.844 1.276 1.405 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1195 sndrD3_g12 13 0.386359E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.026 0.337 0.338 0.408 0.410 0.377 0.393 0.450 + 0.534 0.548 0.611 0.581 0.588 0.647 0.653 0.732 0.759 0.777 + 0.789 0.742 0.732 0.740 0.705 0.721 0.722 0.679 0.630 0.627 + 0.622 0.615 0.595 0.600 0.580 0.542 0.515 0.502 0.474 0.462 + 0.407 0.404 0.428 0.209 0.392 0.418 0.354 0.187 0.386 0.335 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1196 sndrD3_g12 14 0.492117E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.001 0.008 -0.011 0.021 0.086 0.078 0.092 0.121 + 0.190 0.212 0.230 0.230 0.255 0.252 0.284 0.327 0.343 0.367 + 0.389 0.375 0.375 0.390 0.380 0.406 0.422 0.398 0.389 0.383 + 0.380 0.404 0.376 0.401 0.417 0.388 0.386 0.388 0.381 0.409 + 0.348 0.410 0.425 0.387 0.478 0.492 0.429 0.574 0.595 0.299 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1197 sndrD3_g12 15 0.449803E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -7.030 -7.021 -6.940 -6.918 -6.927 -6.842 -6.809 + -6.822 -6.662 -6.741 -6.690 -6.657 -6.600 -6.594 -6.503 -6.497 -6.511 + -6.418 -6.331 -6.253 -6.169 -6.132 -5.973 -5.888 -5.826 -5.694 -5.627 + -5.527 -5.347 -5.278 -5.149 -4.969 -4.875 -4.756 -4.702 -4.390 -4.279 + -4.192 -3.981 -4.038 -3.930 -3.609 -2.918 -3.368 -3.324 -3.517 -3.487 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1198 sndrD3_g12 16 0.231982E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.273 -0.391 -0.334 -0.427 -0.508 -0.494 -0.369 + -0.290 -0.282 -0.245 -0.294 -0.326 -0.238 -0.196 -0.065 -0.017 0.081 + 0.018 -0.022 -0.030 0.057 -0.052 -0.025 0.009 -0.096 -0.187 -0.225 + -0.202 -0.245 -0.261 -0.302 -0.385 -0.368 -0.454 -0.521 -0.450 -0.447 + -0.485 -0.431 -0.542 -0.748 -0.367 -0.193 -0.379 -0.659 -0.531 -0.196 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1199 sndrD3_g12 17 0.565000E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 -0.065 -0.177 -0.075 -0.174 -0.301 -0.276 -0.127 + -0.014 -0.011 0.019 -0.063 -0.093 0.022 0.071 0.221 0.294 0.409 + 0.329 0.288 0.294 0.380 0.231 0.281 0.317 0.179 0.053 0.000 + 0.033 -0.059 -0.008 -0.103 -0.230 -0.215 -0.332 -0.464 -0.347 -0.342 + -0.425 -0.340 -0.529 -0.882 -0.425 -0.087 -0.496 -1.004 -0.828 -0.387 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1200 sndrD3_g12 18 0.583311E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.244 0.187 0.310 0.250 0.141 0.165 0.277 + 0.405 0.383 0.429 0.378 0.367 0.431 0.488 0.610 0.683 0.771 + 0.713 0.688 0.679 0.770 0.627 0.685 0.699 0.586 0.478 0.442 + 0.471 0.362 0.389 0.330 0.239 0.229 0.142 0.026 0.087 0.080 + 0.017 0.034 -0.116 -0.469 -0.115 0.003 -0.329 -0.726 -0.606 -0.141 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1201 sndrD4_g12 1 -0.296068E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.363 -0.679 -0.673 -0.698 -0.709 -0.684 -0.697 -0.717 + -0.706 -0.710 -0.715 -0.741 -0.753 -0.740 -0.752 -0.751 -0.760 -0.762 + -0.784 -0.774 -0.781 -0.785 -0.792 -0.792 -0.798 -0.804 -0.802 -0.788 + -0.817 -0.800 -0.811 -0.813 -0.834 -0.824 -0.842 -0.836 -0.855 -0.841 + -0.866 -0.891 -0.898 -0.887 -0.880 -0.943 -0.935 -0.980 -0.944 -0.932 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1202 sndrD4_g12 2 0.111163E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.311 -0.487 -0.481 -0.499 -0.510 -0.498 -0.506 -0.507 + -0.502 -0.510 -0.500 -0.514 -0.530 -0.509 -0.520 -0.521 -0.529 -0.526 + -0.547 -0.538 -0.553 -0.554 -0.562 -0.571 -0.582 -0.593 -0.585 -0.588 + -0.618 -0.614 -0.620 -0.633 -0.644 -0.649 -0.665 -0.676 -0.687 -0.686 + -0.692 -0.721 -0.735 -0.749 -0.754 -0.776 -0.783 -0.851 -0.841 -0.843 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1203 sndrD4_g12 3 0.503854E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.705 0.666 0.699 0.707 0.714 0.740 0.743 0.740 + 0.747 0.733 0.758 0.777 0.764 0.785 0.778 0.780 0.790 0.793 + 0.785 0.791 0.778 0.784 0.779 0.768 0.751 0.747 0.739 0.717 + 0.717 0.696 0.688 0.685 0.679 0.664 0.654 0.652 0.649 0.613 + 0.598 0.599 0.576 0.585 0.563 0.413 0.415 0.492 0.491 0.425 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1204 sndrD4_g12 4 0.519221E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.479 0.370 0.426 0.440 0.493 0.503 0.538 0.495 + 0.519 0.520 0.542 0.566 0.537 0.548 0.547 0.517 0.514 0.515 + 0.498 0.517 0.489 0.481 0.476 0.475 0.449 0.474 0.486 0.481 + 0.462 0.459 0.471 0.476 0.488 0.473 0.482 0.468 0.458 0.460 + 0.437 0.455 0.492 0.496 0.463 0.369 0.358 0.511 0.587 0.526 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1205 sndrD4_g12 5 0.419129E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -1.503 -1.548 -1.503 -1.435 -1.366 -1.347 -1.322 -1.390 + -1.343 -1.389 -1.343 -1.300 -1.333 -1.342 -1.348 -1.418 -1.399 -1.365 + -1.415 -1.374 -1.405 -1.414 -1.431 -1.441 -1.489 -1.451 -1.473 -1.489 + -1.483 -1.487 -1.492 -1.503 -1.451 -1.514 -1.490 -1.492 -1.492 -1.509 + -1.570 -1.555 -1.573 -1.636 -1.776 -1.808 -1.970 -1.736 -1.599 -1.658 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1206 sndrD4_g12 6 0.207328E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.615 0.666 0.726 0.831 0.915 0.933 1.004 0.951 + 1.037 0.964 1.057 1.084 1.043 1.033 1.007 0.920 0.906 0.930 + 0.876 0.875 0.825 0.799 0.746 0.737 0.683 0.710 0.690 0.647 + 0.647 0.628 0.617 0.573 0.603 0.544 0.523 0.488 0.438 0.329 + 0.250 0.216 0.108 -0.048 -0.231 -0.449 -0.547 -0.339 -0.158 -0.203 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1207 sndrD4_g12 7 0.131851E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.087 0.109 0.162 0.305 0.349 0.352 0.402 0.370 + 0.494 0.439 0.549 0.554 0.523 0.536 0.511 0.472 0.491 0.523 + 0.460 0.471 0.422 0.409 0.318 0.337 0.279 0.274 0.226 0.167 + 0.154 0.164 0.131 0.052 0.090 0.025 -0.023 -0.052 -0.099 -0.173 + -0.277 -0.348 -0.476 -0.643 -0.809 -0.873 -1.068 -1.034 -0.854 -0.928 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1208 sndrD4_g12 8 0.955995E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.073 0.067 0.089 0.214 0.228 0.215 0.258 0.238 + 0.377 0.328 0.436 0.400 0.381 0.425 0.388 0.381 0.415 0.437 + 0.361 0.348 0.300 0.282 0.173 0.188 0.124 0.089 0.035 -0.038 + -0.055 -0.050 -0.102 -0.181 -0.162 -0.244 -0.341 -0.373 -0.445 -0.536 + -0.647 -0.750 -0.892 -1.134 -1.189 -1.201 -1.424 -1.545 -1.354 -1.408 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1209 sndrD4_g12 9 -0.938692E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.026 -0.036 -0.015 0.055 0.078 0.015 0.017 0.005 + 0.136 0.100 0.146 0.085 0.088 0.161 0.120 0.147 0.155 0.154 + 0.122 0.119 0.071 0.097 0.024 -0.010 -0.040 -0.116 -0.116 -0.141 + -0.107 -0.114 -0.181 -0.180 -0.180 -0.243 -0.312 -0.341 -0.357 -0.434 + -0.487 -0.549 -0.621 -0.695 -0.617 -0.650 -0.812 -0.529 -0.617 -0.742 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1210 sndrD4_g12 10 0.550482E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.657 0.601 0.711 0.882 0.947 0.960 1.014 0.861 + 0.840 0.769 0.732 0.835 0.820 0.735 0.746 0.650 0.688 0.692 + 0.640 0.716 0.668 0.681 0.720 0.674 0.647 0.690 0.729 0.741 + 0.701 0.719 0.657 0.707 0.744 0.729 0.700 0.739 0.668 0.635 + 0.689 0.590 0.488 0.528 0.415 0.154 0.214 0.489 0.431 0.526 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1211 sndrD4_g12 11 0.739372E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.878 0.788 1.054 1.269 1.244 1.243 1.332 1.095 + 1.037 0.991 0.925 1.014 0.999 0.898 0.906 0.811 0.845 0.877 + 0.825 0.908 0.881 0.941 0.959 0.952 0.924 0.951 1.027 1.050 + 1.013 1.079 1.010 1.071 1.087 1.139 1.111 1.204 1.115 1.175 + 1.133 1.221 1.072 1.144 1.035 0.930 1.134 1.100 1.340 1.206 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1212 sndrD4_g12 12 0.800009E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.985 0.809 0.952 1.081 1.206 1.067 1.275 0.842 + 0.931 0.819 0.672 0.632 0.658 0.552 0.521 0.374 0.398 0.473 + 0.406 0.449 0.417 0.459 0.435 0.443 0.380 0.440 0.541 0.575 + 0.604 0.604 0.590 0.624 0.661 0.645 0.626 0.590 0.609 0.584 + 0.472 0.582 0.516 0.654 0.602 0.433 0.641 0.584 0.880 0.962 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1213 sndrD4_g12 13 0.386854E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.048 0.047 0.063 0.148 0.118 0.082 0.101 0.151 + 0.243 0.255 0.302 0.265 0.266 0.333 0.343 0.401 0.457 0.452 + 0.454 0.421 0.394 0.410 0.359 0.374 0.369 0.328 0.304 0.270 + 0.256 0.308 0.239 0.225 0.206 0.199 0.130 0.106 0.079 0.102 + 0.045 0.017 -0.016 -0.153 -0.053 0.106 -0.015 -0.027 0.060 -0.021 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1214 sndrD4_g12 14 0.492655E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.043 -0.017 -0.014 0.021 0.059 0.060 0.081 0.117 + 0.172 0.149 0.190 0.177 0.187 0.221 0.244 0.272 0.298 0.312 + 0.328 0.315 0.307 0.335 0.306 0.322 0.330 0.316 0.325 0.330 + 0.328 0.343 0.335 0.320 0.320 0.316 0.295 0.318 0.275 0.301 + 0.313 0.334 0.350 0.258 0.337 0.374 0.435 0.338 0.383 0.543 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1215 sndrD4_g12 15 0.448752E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -5.604 -6.893 -6.807 -6.772 -6.724 -6.656 -6.624 -6.650 + -6.518 -6.548 -6.469 -6.445 -6.475 -6.408 -6.315 -6.300 -6.313 -6.224 + -6.225 -6.078 -6.012 -5.917 -5.927 -5.854 -5.779 -5.608 -5.536 -5.391 + -5.282 -5.215 -5.062 -4.980 -4.988 -4.764 -4.692 -4.556 -4.408 -4.189 + -4.236 -3.974 -3.957 -3.871 -3.648 -2.867 -3.286 -3.826 -3.513 -3.581 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1216 sndrD4_g12 16 0.231900E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.047 -0.277 -0.376 -0.270 -0.382 -0.505 -0.498 -0.324 + -0.231 -0.238 -0.219 -0.265 -0.310 -0.225 -0.172 -0.046 0.068 0.079 + 0.021 -0.001 0.003 0.082 -0.054 0.007 0.009 -0.092 -0.139 -0.212 + -0.233 -0.122 -0.234 -0.284 -0.348 -0.333 -0.423 -0.489 -0.482 -0.498 + -0.455 -0.510 -0.603 -0.748 -0.453 -0.121 -0.334 -0.599 -0.480 -0.464 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1217 sndrD4_g12 17 0.565014E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 -0.031 -0.067 -0.133 -0.008 -0.139 -0.276 -0.270 -0.085 + 0.056 0.043 0.034 -0.019 -0.050 0.041 0.104 0.260 0.425 0.421 + 0.366 0.334 0.343 0.439 0.261 0.334 0.333 0.205 0.119 0.028 + 0.026 0.201 0.026 -0.075 -0.182 -0.163 -0.297 -0.389 -0.342 -0.391 + -0.340 -0.436 -0.549 -0.841 -0.489 0.122 -0.315 -0.854 -0.699 -0.749 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1218 sndrD4_g12 18 0.586564E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.010 0.261 0.238 0.388 0.292 0.182 0.181 0.317 + 0.473 0.440 0.457 0.430 0.385 0.481 0.535 0.655 0.793 0.796 + 0.756 0.731 0.735 0.822 0.649 0.727 0.732 0.623 0.551 0.491 + 0.436 0.628 0.436 0.374 0.296 0.306 0.196 0.080 0.119 0.060 + 0.101 0.004 -0.160 -0.439 -0.189 0.293 -0.128 -0.560 -0.346 -0.464 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1219 sndrD1_g13 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1220 sndrD1_g13 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1221 sndrD1_g13 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1222 sndrD1_g13 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1223 sndrD1_g13 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1224 sndrD1_g13 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1225 sndrD1_g13 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1226 sndrD1_g13 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1227 sndrD1_g13 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1228 sndrD1_g13 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1229 sndrD1_g13 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1230 sndrD1_g13 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1231 sndrD1_g13 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1232 sndrD1_g13 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1233 sndrD1_g13 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1234 sndrD1_g13 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1235 sndrD1_g13 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1236 sndrD1_g13 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1237 sndrD2_g13 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1238 sndrD2_g13 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1239 sndrD2_g13 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1240 sndrD2_g13 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1241 sndrD2_g13 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1242 sndrD2_g13 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1243 sndrD2_g13 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1244 sndrD2_g13 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1245 sndrD2_g13 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1246 sndrD2_g13 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1247 sndrD2_g13 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1248 sndrD2_g13 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1249 sndrD2_g13 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1250 sndrD2_g13 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1251 sndrD2_g13 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1252 sndrD2_g13 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1253 sndrD2_g13 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1254 sndrD2_g13 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1255 sndrD3_g13 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1256 sndrD3_g13 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1257 sndrD3_g13 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1258 sndrD3_g13 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1259 sndrD3_g13 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1260 sndrD3_g13 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1261 sndrD3_g13 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1262 sndrD3_g13 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1263 sndrD3_g13 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1264 sndrD3_g13 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1265 sndrD3_g13 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1266 sndrD3_g13 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1267 sndrD3_g13 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1268 sndrD3_g13 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1269 sndrD3_g13 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1270 sndrD3_g13 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1271 sndrD3_g13 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1272 sndrD3_g13 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1273 sndrD4_g13 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1274 sndrD4_g13 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1275 sndrD4_g13 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1276 sndrD4_g13 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1277 sndrD4_g13 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1278 sndrD4_g13 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1279 sndrD4_g13 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1280 sndrD4_g13 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1281 sndrD4_g13 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1282 sndrD4_g13 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1283 sndrD4_g13 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1284 sndrD4_g13 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1285 sndrD4_g13 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1286 sndrD4_g13 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1287 sndrD4_g13 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1288 sndrD4_g13 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1289 sndrD4_g13 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1290 sndrD4_g13 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1291 hirs4_n19 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1292 hirs4_n19 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1293 hirs4_n19 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1294 hirs4_n19 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1295 hirs4_n19 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1296 hirs4_n19 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1297 hirs4_n19 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1298 hirs4_n19 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1299 hirs4_n19 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1300 hirs4_n19 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1301 hirs4_n19 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1302 hirs4_n19 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1303 hirs4_n19 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1304 hirs4_n19 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1305 hirs4_n19 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1306 hirs4_n19 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1307 hirs4_n19 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1308 hirs4_n19 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1309 hirs4_n19 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1310 amsua_n19 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1311 amsua_n19 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1312 amsua_n19 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1313 amsua_n19 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1314 amsua_n19 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1315 amsua_n19 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1316 amsua_n19 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1317 amsua_n19 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1318 amsua_n19 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1319 amsua_n19 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1320 amsua_n19 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1321 amsua_n19 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1322 amsua_n19 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1323 amsua_n19 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1324 amsua_n19 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1325 mhs_n19 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1326 mhs_n19 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1327 mhs_n19 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1328 mhs_n19 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1329 mhs_n19 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1330 ssmis_f17 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1331 ssmis_f17 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1332 ssmis_f17 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1333 ssmis_f17 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1334 ssmis_f17 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1335 ssmis_f17 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1336 ssmis_f17 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1337 ssmis_f17 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1338 ssmis_f17 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1339 ssmis_f17 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1340 ssmis_f17 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1341 ssmis_f17 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1342 ssmis_f17 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1343 ssmis_f17 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1344 ssmis_f17 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1345 ssmis_f17 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1346 ssmis_f17 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1347 ssmis_f17 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1348 ssmis_f17 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1349 ssmis_f17 20 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1350 ssmis_f17 21 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1351 ssmis_f17 22 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1352 ssmis_f17 23 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1353 ssmis_f17 24 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1354 ssmis_f18 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1355 ssmis_f18 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1356 ssmis_f18 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1357 ssmis_f18 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1358 ssmis_f18 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1359 ssmis_f18 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1360 ssmis_f18 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1361 ssmis_f18 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1362 ssmis_f18 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1363 ssmis_f18 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1364 ssmis_f18 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1365 ssmis_f18 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1366 ssmis_f18 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1367 ssmis_f18 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1368 ssmis_f18 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1369 ssmis_f18 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1370 ssmis_f18 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1371 ssmis_f18 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1372 ssmis_f18 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1373 ssmis_f18 20 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1374 ssmis_f18 21 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1375 ssmis_f18 22 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1376 ssmis_f18 23 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1377 ssmis_f18 24 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1378 ssmis_f19 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1379 ssmis_f19 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1380 ssmis_f19 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1381 ssmis_f19 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1382 ssmis_f19 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1383 ssmis_f19 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1384 ssmis_f19 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1385 ssmis_f19 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1386 ssmis_f19 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1387 ssmis_f19 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1388 ssmis_f19 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1389 ssmis_f19 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1390 ssmis_f19 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1391 ssmis_f19 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1392 ssmis_f19 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1393 ssmis_f19 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1394 ssmis_f19 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1395 ssmis_f19 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1396 ssmis_f19 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1397 ssmis_f19 20 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1398 ssmis_f19 21 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1399 ssmis_f19 22 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1400 ssmis_f19 23 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1401 ssmis_f19 24 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1402 ssmis_f20 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1403 ssmis_f20 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1404 ssmis_f20 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1405 ssmis_f20 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1406 ssmis_f20 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1407 ssmis_f20 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1408 ssmis_f20 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1409 ssmis_f20 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1410 ssmis_f20 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1411 ssmis_f20 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1412 ssmis_f20 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1413 ssmis_f20 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1414 ssmis_f20 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1415 ssmis_f20 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1416 ssmis_f20 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1417 ssmis_f20 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1418 ssmis_f20 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1419 ssmis_f20 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1420 ssmis_f20 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1421 ssmis_f20 20 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1422 ssmis_f20 21 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1423 ssmis_f20 22 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1424 ssmis_f20 23 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1425 ssmis_f20 24 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1426 imgr_g14 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1427 imgr_g14 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1428 imgr_g14 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1429 imgr_g14 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1430 imgr_g15 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1431 imgr_g15 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1432 imgr_g15 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1433 imgr_g15 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1434 sndrD1_g14 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1435 sndrD1_g14 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1436 sndrD1_g14 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1437 sndrD1_g14 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1438 sndrD1_g14 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1439 sndrD1_g14 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1440 sndrD1_g14 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1441 sndrD1_g14 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1442 sndrD1_g14 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1443 sndrD1_g14 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1444 sndrD1_g14 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1445 sndrD1_g14 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1446 sndrD1_g14 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1447 sndrD1_g14 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1448 sndrD1_g14 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1449 sndrD1_g14 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1450 sndrD1_g14 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1451 sndrD1_g14 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1452 sndrD2_g14 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1453 sndrD2_g14 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1454 sndrD2_g14 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1455 sndrD2_g14 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1456 sndrD2_g14 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1457 sndrD2_g14 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1458 sndrD2_g14 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1459 sndrD2_g14 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1460 sndrD2_g14 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1461 sndrD2_g14 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1462 sndrD2_g14 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1463 sndrD2_g14 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1464 sndrD2_g14 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1465 sndrD2_g14 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1466 sndrD2_g14 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1467 sndrD2_g14 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1468 sndrD2_g14 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1469 sndrD2_g14 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1470 sndrD3_g14 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1471 sndrD3_g14 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1472 sndrD3_g14 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1473 sndrD3_g14 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1474 sndrD3_g14 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1475 sndrD3_g14 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1476 sndrD3_g14 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1477 sndrD3_g14 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1478 sndrD3_g14 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1479 sndrD3_g14 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1480 sndrD3_g14 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1481 sndrD3_g14 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1482 sndrD3_g14 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1483 sndrD3_g14 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1484 sndrD3_g14 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1485 sndrD3_g14 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1486 sndrD3_g14 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1487 sndrD3_g14 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1488 sndrD4_g14 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1489 sndrD4_g14 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1490 sndrD4_g14 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1491 sndrD4_g14 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1492 sndrD4_g14 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1493 sndrD4_g14 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1494 sndrD4_g14 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1495 sndrD4_g14 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1496 sndrD4_g14 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1497 sndrD4_g14 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1498 sndrD4_g14 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1499 sndrD4_g14 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1500 sndrD4_g14 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1501 sndrD4_g14 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1502 sndrD4_g14 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1503 sndrD4_g14 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1504 sndrD4_g14 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1505 sndrD4_g14 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1506 sndrD1_g15 1 -0.280696E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.055 + 0.103 0.048 0.096 0.123 0.105 0.111 0.123 0.105 0.117 0.108 + 0.115 0.114 0.071 0.075 0.087 0.092 0.078 0.072 0.081 0.064 + 0.064 0.054 0.053 0.053 0.041 0.048 0.027 0.021 0.020 0.012 + 0.029 0.002 0.006 0.006 -0.005 -0.003 -0.014 -0.021 -0.054 -0.042 + -0.061 -0.071 -0.093 -0.084 -0.143 -0.139 -0.171 -0.183 -0.199 -0.220 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1507 sndrD1_g15 2 0.491156E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.158 + -0.212 -0.209 -0.162 -0.167 -0.115 -0.147 -0.173 -0.163 -0.169 -0.165 + -0.168 -0.157 -0.161 -0.178 -0.180 -0.176 -0.168 -0.164 -0.163 -0.166 + -0.155 -0.167 -0.169 -0.151 -0.168 -0.157 -0.162 -0.159 -0.162 -0.156 + -0.149 -0.146 -0.152 -0.159 -0.153 -0.145 -0.148 -0.147 -0.149 -0.126 + -0.137 -0.146 -0.158 -0.139 -0.146 -0.137 -0.145 -0.174 -0.165 -0.192 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1508 sndrD1_g15 3 0.481448E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.197 + 0.093 0.085 0.090 0.099 0.097 0.069 0.039 0.048 0.037 0.048 + 0.037 0.076 0.047 0.020 0.014 -0.022 -0.020 -0.010 -0.005 -0.014 + -0.002 -0.009 -0.020 -0.021 -0.031 -0.032 -0.030 -0.045 -0.049 -0.046 + -0.041 -0.053 -0.059 -0.072 -0.078 -0.078 -0.085 -0.059 -0.068 -0.050 + -0.062 -0.059 -0.064 -0.038 -0.018 -0.022 -0.017 -0.017 -0.008 -0.022 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1509 sndrD1_g15 4 0.491367E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.273 + 0.214 0.185 0.238 0.201 0.172 0.129 0.084 0.106 0.114 0.106 + 0.076 0.132 0.125 0.051 0.061 0.025 -0.005 0.021 0.004 -0.004 + 0.007 0.007 -0.005 -0.015 -0.022 -0.022 -0.025 -0.042 -0.046 -0.038 + -0.039 -0.040 -0.051 -0.059 -0.063 -0.077 -0.083 -0.100 -0.120 -0.102 + -0.143 -0.145 -0.143 -0.124 -0.166 -0.150 -0.137 -0.098 -0.129 -0.155 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1510 sndrD1_g15 5 0.415202E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.034 + -0.126 -0.195 -0.147 -0.173 -0.224 -0.283 -0.356 -0.348 -0.369 -0.358 + -0.427 -0.347 -0.376 -0.473 -0.454 -0.505 -0.533 -0.514 -0.528 -0.543 + -0.541 -0.557 -0.589 -0.606 -0.621 -0.626 -0.634 -0.679 -0.677 -0.694 + -0.700 -0.704 -0.702 -0.689 -0.690 -0.748 -0.766 -0.853 -0.897 -0.905 + -0.980 -1.037 -1.092 -1.097 -1.220 -1.217 -1.200 -1.216 -1.167 -1.208 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1511 sndrD1_g15 6 0.191573E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.041 + 0.074 -0.106 0.042 -0.024 -0.048 -0.096 -0.213 -0.303 -0.233 -0.248 + -0.322 -0.306 -0.300 -0.402 -0.364 -0.429 -0.467 -0.476 -0.487 -0.486 + -0.491 -0.492 -0.515 -0.583 -0.593 -0.614 -0.631 -0.694 -0.712 -0.722 + -0.772 -0.723 -0.686 -0.607 -0.603 -0.721 -0.702 -0.872 -0.956 -1.017 + -1.016 -1.069 -1.158 -1.208 -1.405 -1.381 -1.374 -1.374 -1.361 -1.388 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1512 sndrD1_g15 7 0.118072E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.203 + -0.094 -0.194 -0.100 -0.180 -0.235 -0.253 -0.397 -0.484 -0.490 -0.432 + -0.545 -0.501 -0.547 -0.640 -0.577 -0.638 -0.685 -0.708 -0.708 -0.702 + -0.687 -0.674 -0.717 -0.765 -0.785 -0.804 -0.825 -0.885 -0.894 -0.933 + -0.980 -0.925 -0.899 -0.827 -0.823 -0.958 -0.959 -1.189 -1.313 -1.383 + -1.351 -1.453 -1.524 -1.592 -1.825 -1.788 -1.810 -1.704 -1.735 -1.666 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1513 sndrD1_g15 8 0.830446E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.319 + -0.154 -0.269 -0.199 -0.280 -0.280 -0.347 -0.491 -0.587 -0.611 -0.534 + -0.624 -0.610 -0.648 -0.668 -0.679 -0.721 -0.779 -0.825 -0.812 -0.810 + -0.791 -0.779 -0.804 -0.861 -0.858 -0.874 -0.880 -0.948 -0.940 -1.002 + -1.033 -1.001 -0.966 -0.906 -0.950 -1.098 -1.119 -1.378 -1.548 -1.705 + -1.808 -1.982 -2.006 -2.051 -2.215 -2.116 -2.145 -1.895 -1.959 -1.720 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1514 sndrD1_g15 9 -0.694848E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.595 + -0.460 -0.516 -0.467 -0.515 -0.496 -0.521 -0.623 -0.691 -0.702 -0.672 + -0.693 -0.718 -0.775 -0.780 -0.864 -1.018 -1.069 -1.097 -1.084 -1.082 + -1.017 -0.995 -1.011 -0.984 -0.982 -0.968 -0.944 -0.973 -0.968 -1.002 + -1.010 -0.987 -0.896 -0.841 -0.856 -0.894 -0.903 -1.028 -1.082 -1.175 + -1.265 -1.339 -1.395 -1.452 -1.550 -1.530 -1.543 -1.466 -1.534 -1.463 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1515 sndrD1_g15 10 0.552203E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.643 + 0.461 0.428 0.412 0.622 0.596 0.461 0.455 0.436 0.565 0.504 + 0.528 0.597 0.557 0.445 0.429 0.265 0.228 0.190 0.116 0.076 + 0.097 0.049 0.082 0.020 0.029 0.007 0.008 -0.015 -0.022 -0.012 + -0.013 -0.045 -0.011 -0.027 -0.006 -0.082 -0.073 -0.104 -0.097 -0.015 + -0.063 -0.060 -0.135 -0.125 -0.180 -0.263 -0.269 -0.338 -0.255 -0.391 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1516 sndrD1_g15 11 0.763308E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.242 + 1.221 1.027 1.131 1.173 1.131 0.866 1.080 1.093 1.242 1.226 + 1.291 1.213 1.252 1.073 1.073 0.932 0.921 0.803 0.797 0.707 + 0.820 0.723 0.818 0.769 0.778 0.792 0.784 0.797 0.849 0.881 + 0.915 0.930 0.981 0.899 0.899 0.842 0.874 0.891 0.876 0.956 + 1.012 1.049 1.010 1.011 1.059 0.984 0.988 0.891 1.012 0.888 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1517 sndrD1_g15 12 0.786536E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.981 + 1.076 1.250 1.079 1.051 1.138 0.903 0.990 0.817 0.982 1.019 + 1.163 1.051 1.055 1.059 1.042 0.862 0.810 0.642 0.552 0.521 + 0.605 0.553 0.553 0.557 0.525 0.525 0.510 0.512 0.597 0.595 + 0.620 0.628 0.680 0.683 0.714 0.680 0.696 0.680 0.673 0.731 + 0.737 0.728 0.743 0.637 0.729 0.688 0.850 0.799 0.833 0.820 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1518 sndrD1_g15 13 0.366318E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.372 + 0.524 0.445 0.553 0.467 0.476 0.495 0.421 0.317 0.330 0.369 + 0.364 0.342 0.303 0.332 0.293 0.214 0.181 0.167 0.171 0.169 + 0.197 0.207 0.217 0.205 0.201 0.192 0.216 0.181 0.190 0.156 + 0.177 0.160 0.176 0.172 0.151 0.102 0.098 -0.026 -0.053 -0.112 + -0.145 -0.187 -0.228 -0.265 -0.275 -0.263 -0.243 -0.044 0.014 0.037 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1519 sndrD1_g15 14 0.462414E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.555 + -0.566 -0.611 -0.609 -0.615 -0.667 -0.686 -0.746 -0.778 -0.765 -0.769 + -0.749 -0.770 -0.769 -0.757 -0.769 -0.742 -0.713 -0.682 -0.697 -0.700 + -0.666 -0.673 -0.679 -0.671 -0.675 -0.656 -0.662 -0.680 -0.673 -0.687 + -0.681 -0.667 -0.627 -0.632 -0.650 -0.669 -0.710 -0.723 -0.757 -0.750 + -0.812 -0.808 -0.821 -0.825 -0.921 -0.842 -0.840 -0.965 -1.003 -1.023 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1520 sndrD1_g15 15 0.405018E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.636 + -0.910 -0.954 -1.033 -1.002 -1.048 -1.057 -1.189 -1.187 -1.231 -1.228 + -1.218 -1.223 -1.226 -1.150 -1.107 -0.913 -0.789 -0.771 -0.800 -0.820 + -0.773 -0.810 -0.847 -0.851 -0.842 -0.813 -0.841 -0.856 -0.833 -0.804 + -0.855 -0.760 -0.707 -0.670 -0.636 -0.675 -0.682 -0.601 -0.732 -0.632 + -0.766 -0.736 -0.715 -0.714 -0.971 -0.700 -0.706 -1.154 -1.188 -1.224 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1521 sndrD1_g15 16 0.239123E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.238 + -0.999 -1.111 -1.013 -1.145 -1.071 -1.087 -1.183 -1.309 -1.359 -1.275 + -1.237 -1.231 -1.380 -1.332 -1.381 -1.372 -1.344 -1.343 -1.317 -1.287 + -1.277 -1.233 -1.209 -1.231 -1.221 -1.221 -1.219 -1.248 -1.219 -1.267 + -1.227 -1.240 -1.243 -1.261 -1.297 -1.351 -1.358 -1.478 -1.547 -1.609 + -1.667 -1.761 -1.808 -1.858 -1.793 -1.735 -1.658 -1.500 -1.618 -1.384 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1522 sndrD1_g15 17 0.572683E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.056 + -0.740 -0.919 -0.669 -0.829 -0.727 -0.739 -0.917 -1.106 -1.101 -1.075 + -0.964 -1.040 -1.215 -1.040 -1.159 -1.108 -1.098 -1.056 -1.015 -1.013 + -0.988 -0.937 -0.927 -0.930 -0.959 -0.942 -0.933 -0.991 -0.964 -1.048 + -0.989 -1.065 -1.026 -1.058 -1.120 -1.200 -1.217 -1.446 -1.554 -1.639 + -1.768 -1.979 -2.046 -2.234 -2.292 -2.284 -2.241 -1.965 -2.119 -2.161 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1523 sndrD1_g15 18 0.550201E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.612 + -0.312 -0.478 -0.286 -0.412 -0.322 -0.359 -0.529 -0.689 -0.696 -0.653 + -0.533 -0.619 -0.750 -0.610 -0.718 -0.678 -0.717 -0.678 -0.668 -0.709 + -0.696 -0.672 -0.692 -0.722 -0.754 -0.736 -0.736 -0.795 -0.762 -0.849 + -0.811 -0.878 -0.816 -0.821 -0.882 -0.966 -1.007 -1.252 -1.368 -1.436 + -1.603 -1.873 -1.970 -2.143 -2.308 -2.322 -2.311 -2.133 -2.257 -2.293 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1524 sndrD2_g15 1 -0.282176E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.006 + 0.071 0.043 0.050 0.139 0.091 0.065 0.044 0.062 0.139 0.101 + 0.100 0.076 0.073 0.070 0.045 0.066 0.089 0.068 0.061 0.061 + 0.076 0.049 0.064 0.043 0.056 0.040 0.041 0.030 0.030 0.028 + 0.039 0.026 0.004 -0.004 -0.005 0.003 -0.012 -0.008 -0.017 -0.037 + -0.049 -0.064 -0.051 -0.078 -0.116 -0.093 -0.112 -0.144 -0.174 -0.214 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1525 sndrD2_g15 2 0.440963E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.097 + -0.147 -0.132 -0.075 -0.131 -0.113 -0.116 -0.125 -0.136 -0.102 -0.132 + -0.116 -0.121 -0.112 -0.146 -0.144 -0.137 -0.127 -0.130 -0.130 -0.105 + -0.113 -0.109 -0.093 -0.110 -0.102 -0.125 -0.110 -0.117 -0.111 -0.104 + -0.102 -0.104 -0.110 -0.128 -0.120 -0.114 -0.110 -0.105 -0.109 -0.090 + -0.093 -0.113 -0.093 -0.088 -0.080 -0.052 -0.071 -0.103 -0.095 -0.095 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1526 sndrD2_g15 3 0.481307E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.343 + 0.266 0.277 0.250 0.244 0.257 0.204 0.188 0.174 0.212 0.198 + 0.180 0.207 0.194 0.165 0.158 0.153 0.142 0.165 0.154 0.151 + 0.168 0.165 0.162 0.149 0.145 0.132 0.144 0.129 0.124 0.118 + 0.119 0.125 0.101 0.091 0.076 0.082 0.082 0.083 0.091 0.100 + 0.075 0.075 0.087 0.107 0.102 0.123 0.104 0.132 0.088 0.136 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1527 sndrD2_g15 4 0.491664E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.245 + 0.209 0.195 0.173 0.175 0.160 0.118 0.076 0.067 0.105 0.092 + 0.066 0.100 0.103 0.044 0.009 -0.005 0.004 0.001 -0.005 0.002 + -0.005 0.006 0.001 -0.021 -0.017 -0.022 -0.023 -0.041 -0.035 -0.044 + -0.042 -0.034 -0.060 -0.064 -0.067 -0.088 -0.092 -0.102 -0.110 -0.107 + -0.152 -0.170 -0.196 -0.152 -0.158 -0.146 -0.150 -0.105 -0.118 -0.084 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1528 sndrD2_g15 5 0.413898E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.226 + -0.270 -0.271 -0.326 -0.323 -0.352 -0.416 -0.476 -0.516 -0.486 -0.490 + -0.552 -0.500 -0.517 -0.564 -0.644 -0.660 -0.664 -0.650 -0.680 -0.674 + -0.702 -0.690 -0.713 -0.741 -0.752 -0.759 -0.774 -0.810 -0.827 -0.847 + -0.862 -0.846 -0.865 -0.846 -0.852 -0.908 -0.952 -0.980 -1.053 -1.084 + -1.159 -1.204 -1.270 -1.278 -1.310 -1.324 -1.327 -1.313 -1.321 -1.318 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1529 sndrD2_g15 6 0.191570E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.068 + 0.019 -0.039 -0.005 -0.040 -0.083 -0.132 -0.199 -0.275 -0.239 -0.291 + -0.350 -0.317 -0.340 -0.366 -0.443 -0.481 -0.489 -0.513 -0.502 -0.475 + -0.514 -0.512 -0.515 -0.573 -0.571 -0.601 -0.625 -0.653 -0.697 -0.760 + -0.798 -0.715 -0.707 -0.623 -0.627 -0.754 -0.789 -0.857 -1.026 -1.033 + -1.173 -1.178 -1.262 -1.295 -1.338 -1.412 -1.393 -1.415 -1.314 -1.303 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1530 sndrD2_g15 7 0.118336E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.295 + -0.181 -0.262 -0.233 -0.258 -0.292 -0.367 -0.440 -0.514 -0.495 -0.505 + -0.617 -0.604 -0.622 -0.630 -0.705 -0.729 -0.731 -0.757 -0.741 -0.712 + -0.744 -0.722 -0.736 -0.782 -0.791 -0.815 -0.846 -0.871 -0.908 -1.003 + -1.043 -0.959 -0.951 -0.850 -0.880 -1.023 -1.111 -1.173 -1.427 -1.420 + -1.556 -1.591 -1.673 -1.690 -1.763 -1.870 -1.850 -1.731 -1.689 -1.682 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1531 sndrD2_g15 8 0.833460E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.223 + -0.064 -0.140 -0.129 -0.180 -0.175 -0.225 -0.313 -0.419 -0.380 -0.428 + -0.535 -0.545 -0.546 -0.574 -0.664 -0.673 -0.704 -0.725 -0.710 -0.684 + -0.711 -0.670 -0.714 -0.725 -0.737 -0.747 -0.779 -0.811 -0.849 -0.959 + -0.968 -0.912 -0.910 -0.810 -0.859 -1.012 -1.142 -1.253 -1.564 -1.660 + -1.894 -1.907 -2.053 -2.066 -2.129 -2.187 -2.155 -1.912 -1.898 -1.830 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1532 sndrD2_g15 9 -0.695979E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.665 + -0.542 -0.592 -0.568 -0.574 -0.546 -0.585 -0.630 -0.743 -0.708 -0.711 + -0.773 -0.800 -0.846 -0.846 -1.023 -1.084 -1.162 -1.161 -1.130 -1.140 + -1.097 -1.056 -1.076 -1.052 -1.039 -1.030 -1.028 -1.035 -1.038 -1.115 + -1.098 -1.076 -0.995 -0.945 -0.945 -1.003 -1.052 -1.107 -1.242 -1.311 + -1.402 -1.477 -1.600 -1.596 -1.654 -1.579 -1.615 -1.566 -1.602 -1.717 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1533 sndrD2_g15 10 0.552566E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.615 + 0.643 0.517 0.475 0.568 0.646 0.467 0.438 0.463 0.592 0.536 + 0.595 0.554 0.521 0.491 0.447 0.235 0.249 0.201 0.121 0.104 + 0.100 0.070 0.073 0.036 0.052 0.026 0.031 -0.011 -0.018 -0.032 + -0.031 -0.036 -0.049 -0.019 -0.042 -0.083 -0.093 -0.097 -0.080 -0.060 + -0.121 -0.137 -0.248 -0.170 -0.255 -0.316 -0.391 -0.346 -0.324 -0.297 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1534 sndrD2_g15 11 0.764067E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.272 + 1.198 1.164 1.229 0.894 1.184 0.950 1.077 1.214 1.275 1.229 + 1.367 1.250 1.217 1.146 1.083 0.867 0.929 0.868 0.787 0.755 + 0.836 0.726 0.783 0.716 0.779 0.759 0.770 0.772 0.810 0.809 + 0.859 0.874 0.863 0.836 0.844 0.771 0.824 0.835 0.854 0.851 + 0.925 0.941 0.877 0.976 0.921 0.898 0.882 0.822 0.881 1.119 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1535 sndrD2_g15 12 0.787169E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.056 + 1.213 1.250 1.311 0.933 1.098 1.046 0.953 1.018 0.984 1.062 + 1.178 1.114 1.064 1.101 1.166 0.869 0.852 0.725 0.599 0.556 + 0.657 0.546 0.590 0.541 0.552 0.553 0.536 0.555 0.576 0.628 + 0.633 0.611 0.660 0.663 0.668 0.684 0.718 0.649 0.710 0.703 + 0.705 0.756 0.673 0.676 0.679 0.721 0.793 0.837 0.803 0.950 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1536 sndrD2_g15 13 0.366534E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.091 + 0.212 0.120 0.140 0.110 0.128 0.098 0.037 -0.082 -0.071 -0.056 + -0.075 -0.108 -0.115 -0.083 -0.162 -0.117 -0.089 -0.101 -0.101 -0.091 + -0.101 -0.073 -0.086 -0.076 -0.080 -0.079 -0.088 -0.096 -0.100 -0.143 + -0.152 -0.131 -0.119 -0.099 -0.112 -0.172 -0.233 -0.295 -0.402 -0.449 + -0.542 -0.590 -0.668 -0.710 -0.763 -0.691 -0.718 -0.615 -0.648 -0.770 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1537 sndrD2_g15 14 0.462157E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.533 + -0.469 -0.520 -0.473 -0.508 -0.479 -0.475 -0.533 -0.610 -0.584 -0.595 + -0.623 -0.634 -0.632 -0.652 -0.696 -0.729 -0.720 -0.755 -0.748 -0.742 + -0.742 -0.717 -0.720 -0.717 -0.716 -0.732 -0.729 -0.741 -0.735 -0.757 + -0.744 -0.768 -0.794 -0.802 -0.815 -0.849 -0.865 -0.884 -0.925 -0.935 + -0.970 -0.931 -1.007 -0.943 -0.843 -0.904 -0.832 -0.607 -0.517 -0.530 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1538 sndrD2_g15 15 0.402054E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.118 + 0.090 0.237 0.305 0.337 0.293 0.339 0.301 0.347 0.460 0.420 + 0.340 0.317 0.339 0.350 0.246 0.089 -0.034 -0.041 -0.105 -0.081 + -0.095 -0.058 -0.051 -0.056 -0.035 -0.069 -0.033 -0.045 -0.057 -0.107 + -0.003 -0.065 -0.129 -0.166 -0.094 -0.179 -0.086 -0.052 -0.031 0.106 + 0.034 0.186 0.212 0.301 0.511 0.381 0.542 0.952 0.879 1.128 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1539 sndrD2_g15 16 0.238716E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.324 + -1.195 -1.172 -1.248 -1.199 -1.274 -1.274 -1.308 -1.479 -1.494 -1.446 + -1.476 -1.553 -1.523 -1.493 -1.567 -1.512 -1.472 -1.439 -1.413 -1.413 + -1.409 -1.350 -1.360 -1.343 -1.345 -1.339 -1.353 -1.352 -1.357 -1.424 + -1.390 -1.403 -1.413 -1.404 -1.411 -1.498 -1.571 -1.626 -1.740 -1.813 + -1.895 -1.899 -2.036 -1.980 -1.967 -1.885 -1.848 -1.758 -1.783 -1.956 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1540 sndrD2_g15 17 0.572569E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.293 + -1.023 -1.107 -0.965 -1.000 -0.978 -0.980 -1.121 -1.402 -1.316 -1.270 + -1.212 -1.334 -1.411 -1.218 -1.347 -1.287 -1.221 -1.191 -1.168 -1.218 + -1.224 -1.127 -1.157 -1.134 -1.155 -1.123 -1.141 -1.159 -1.185 -1.307 + -1.278 -1.290 -1.246 -1.260 -1.265 -1.380 -1.470 -1.591 -1.781 -1.940 + -2.133 -2.138 -2.439 -2.457 -2.606 -2.386 -2.474 -2.330 -2.374 -2.628 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1541 sndrD2_g15 18 0.551773E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.648 + -0.351 -0.431 -0.304 -0.341 -0.309 -0.297 -0.443 -0.686 -0.613 -0.582 + -0.556 -0.626 -0.716 -0.560 -0.705 -0.692 -0.639 -0.651 -0.676 -0.713 + -0.729 -0.658 -0.697 -0.693 -0.713 -0.694 -0.717 -0.719 -0.777 -0.893 + -0.866 -0.884 -0.857 -0.864 -0.847 -0.994 -1.090 -1.200 -1.389 -1.506 + -1.750 -1.763 -2.098 -2.123 -2.280 -2.062 -2.180 -1.946 -2.029 -2.287 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1542 sndrD3_g15 1 -0.280670E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.007 0.047 + 0.108 0.074 0.141 0.091 0.148 0.099 0.112 0.123 0.146 0.119 + 0.099 0.084 0.097 0.108 0.067 0.098 0.080 0.082 0.099 0.094 + 0.086 0.074 0.086 0.074 0.072 0.058 0.060 0.056 0.056 0.039 + 0.046 0.058 0.041 0.029 0.029 0.018 0.006 0.003 -0.009 -0.016 + -0.009 -0.079 -0.039 -0.033 -0.052 -0.090 -0.071 -0.132 -0.137 -0.097 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1543 sndrD3_g15 2 0.436166E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.004 -0.070 + -0.057 -0.084 -0.071 -0.125 -0.019 -0.113 -0.094 -0.078 -0.084 -0.081 + -0.084 -0.131 -0.075 -0.083 -0.105 -0.106 -0.117 -0.105 -0.076 -0.077 + -0.092 -0.084 -0.083 -0.088 -0.084 -0.090 -0.085 -0.089 -0.084 -0.083 + -0.079 -0.077 -0.082 -0.090 -0.085 -0.100 -0.100 -0.092 -0.091 -0.079 + -0.091 -0.106 -0.076 -0.076 -0.071 -0.098 -0.068 -0.115 -0.108 -0.097 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1544 sndrD3_g15 3 0.479789E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.021 0.493 + 0.336 0.370 0.330 0.354 0.329 0.318 0.328 0.300 0.314 0.322 + 0.326 0.321 0.297 0.290 0.273 0.248 0.248 0.261 0.264 0.267 + 0.268 0.266 0.260 0.260 0.252 0.247 0.255 0.236 0.234 0.229 + 0.232 0.238 0.217 0.191 0.181 0.171 0.168 0.196 0.193 0.190 + 0.196 0.176 0.175 0.179 0.198 0.179 0.191 0.182 0.145 0.183 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1545 sndrD3_g15 4 0.490799E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.021 0.292 + 0.192 0.198 0.146 0.156 0.162 0.140 0.140 0.095 0.106 0.092 + 0.102 0.112 0.113 0.046 0.049 0.017 0.001 0.023 0.008 0.022 + 0.022 0.023 0.007 0.008 0.016 0.003 0.004 -0.011 -0.012 -0.016 + -0.025 -0.007 -0.019 -0.038 -0.052 -0.066 -0.073 -0.060 -0.074 -0.082 + -0.093 -0.108 -0.163 -0.115 -0.103 -0.110 -0.076 -0.078 -0.059 -0.022 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1546 sndrD3_g15 5 0.412971E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.019 -0.128 + -0.246 -0.242 -0.303 -0.297 -0.317 -0.356 -0.367 -0.440 -0.463 -0.448 + -0.455 -0.459 -0.481 -0.557 -0.580 -0.597 -0.625 -0.619 -0.640 -0.637 + -0.658 -0.655 -0.687 -0.702 -0.688 -0.717 -0.728 -0.749 -0.763 -0.796 + -0.835 -0.794 -0.787 -0.794 -0.822 -0.851 -0.913 -0.928 -0.972 -1.039 + -1.088 -1.155 -1.215 -1.233 -1.272 -1.281 -1.285 -1.270 -1.282 -1.238 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1547 sndrD3_g15 6 0.191260E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.017 0.056 + -0.011 0.016 -0.015 -0.016 -0.045 -0.055 -0.122 -0.247 -0.221 -0.263 + -0.271 -0.320 -0.309 -0.394 -0.402 -0.443 -0.476 -0.469 -0.488 -0.463 + -0.492 -0.465 -0.517 -0.543 -0.533 -0.546 -0.584 -0.601 -0.660 -0.705 + -0.785 -0.708 -0.644 -0.595 -0.652 -0.703 -0.775 -0.821 -0.912 -1.037 + -1.049 -1.174 -1.224 -1.296 -1.360 -1.378 -1.411 -1.307 -1.308 -1.256 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1548 sndrD3_g15 7 0.118197E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.025 -0.200 + -0.100 -0.140 -0.201 -0.165 -0.246 -0.218 -0.287 -0.445 -0.446 -0.425 + -0.479 -0.547 -0.546 -0.626 -0.637 -0.656 -0.693 -0.683 -0.680 -0.661 + -0.674 -0.646 -0.703 -0.719 -0.701 -0.736 -0.771 -0.785 -0.821 -0.908 + -0.983 -0.916 -0.841 -0.818 -0.878 -0.953 -1.065 -1.125 -1.262 -1.442 + -1.437 -1.553 -1.641 -1.694 -1.761 -1.792 -1.818 -1.624 -1.667 -1.616 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1549 sndrD3_g15 8 0.830643E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.021 -0.224 + -0.106 -0.138 -0.181 -0.246 -0.227 -0.200 -0.319 -0.437 -0.470 -0.453 + -0.495 -0.535 -0.575 -0.631 -0.666 -0.720 -0.722 -0.689 -0.729 -0.706 + -0.704 -0.669 -0.720 -0.750 -0.701 -0.741 -0.757 -0.783 -0.812 -0.919 + -0.987 -0.950 -0.862 -0.846 -0.927 -1.004 -1.176 -1.277 -1.467 -1.708 + -1.809 -2.001 -2.073 -2.142 -2.182 -2.142 -2.129 -1.892 -1.950 -1.895 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1550 sndrD3_g15 9 -0.691376E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.024 -0.604 + -0.524 -0.545 -0.545 -0.579 -0.547 -0.518 -0.633 -0.690 -0.703 -0.689 + -0.706 -0.789 -0.812 -0.853 -0.963 -1.115 -1.152 -1.095 -1.115 -1.086 + -1.038 -1.011 -1.038 -1.018 -0.951 -0.975 -0.936 -0.964 -0.954 -1.035 + -1.081 -0.998 -0.906 -0.891 -0.910 -0.917 -1.016 -1.038 -1.119 -1.257 + -1.315 -1.435 -1.517 -1.533 -1.520 -1.570 -1.555 -1.506 -1.558 -1.498 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1551 sndrD3_g15 10 0.552627E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.633 + 0.519 0.434 0.383 0.645 0.542 0.430 0.588 0.440 0.537 0.490 + 0.593 0.615 0.569 0.477 0.419 0.272 0.235 0.176 0.090 0.105 + 0.075 0.076 0.062 0.035 0.079 0.025 0.026 0.026 -0.010 0.002 + -0.019 -0.013 -0.015 -0.001 -0.015 -0.049 -0.055 -0.051 -0.011 -0.051 + -0.045 -0.016 -0.218 -0.134 -0.235 -0.244 -0.321 -0.352 -0.234 -0.338 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1552 sndrD3_g15 11 0.764217E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.031 1.224 + 1.082 0.960 1.005 1.135 0.955 0.890 1.125 1.121 1.162 1.260 + 1.352 1.192 1.223 1.046 1.093 0.879 0.866 0.779 0.722 0.722 + 0.759 0.740 0.772 0.742 0.790 0.776 0.746 0.789 0.826 0.851 + 0.861 0.904 0.912 0.895 0.865 0.821 0.908 0.871 0.964 0.905 + 0.905 1.052 0.953 1.030 0.959 0.973 0.971 0.833 1.034 0.949 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1553 sndrD3_g15 12 0.785636E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.004 0.911 + 1.258 1.112 1.032 0.999 0.958 0.902 0.914 0.923 0.955 1.111 + 1.121 0.977 1.081 0.918 1.002 0.757 0.791 0.609 0.508 0.534 + 0.540 0.538 0.579 0.485 0.510 0.529 0.474 0.512 0.557 0.592 + 0.603 0.643 0.637 0.674 0.676 0.624 0.676 0.702 0.659 0.705 + 0.642 0.747 0.692 0.695 0.632 0.703 0.780 0.789 0.837 0.708 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1554 sndrD3_g15 13 0.365994E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.026 0.267 + 0.382 0.364 0.360 0.340 0.360 0.407 0.314 0.218 0.248 0.253 + 0.245 0.171 0.176 0.170 0.147 0.049 0.061 0.063 0.031 0.070 + 0.068 0.087 0.068 0.077 0.110 0.082 0.097 0.087 0.087 0.020 + 0.010 0.021 0.059 0.014 -0.013 -0.037 -0.112 -0.147 -0.204 -0.295 + -0.323 -0.383 -0.464 -0.429 -0.428 -0.371 -0.333 -0.118 -0.073 -0.070 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1555 sndrD3_g15 14 0.462067E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.036 -0.625 + -0.668 -0.681 -0.706 -0.757 -0.755 -0.780 -0.798 -0.893 -0.845 -0.872 + -0.852 -0.896 -0.869 -0.882 -0.874 -0.838 -0.803 -0.784 -0.791 -0.783 + -0.783 -0.785 -0.792 -0.782 -0.758 -0.765 -0.772 -0.789 -0.765 -0.784 + -0.814 -0.782 -0.760 -0.761 -0.772 -0.793 -0.842 -0.845 -0.891 -0.921 + -0.934 -0.973 -0.996 -1.045 -0.991 -0.935 -0.979 -1.180 -1.173 -1.090 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1556 sndrD3_g15 15 0.406556E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.048 -0.731 + -1.031 -1.132 -1.118 -1.217 -1.150 -1.260 -1.336 -1.346 -1.417 -1.408 + -1.350 -1.313 -1.339 -1.316 -1.276 -0.961 -0.935 -0.846 -0.883 -0.911 + -0.929 -0.914 -0.934 -0.957 -0.939 -0.906 -0.929 -0.971 -0.913 -0.878 + -0.961 -0.847 -0.823 -0.715 -0.682 -0.702 -0.737 -0.697 -0.667 -0.653 + -0.734 -0.778 -0.758 -0.796 -0.669 -0.760 -0.605 -0.972 -1.099 -1.328 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1557 sndrD3_g15 16 0.238981E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.238 + -1.090 -1.098 -1.090 -1.084 -1.164 -1.065 -1.183 -1.349 -1.214 -1.308 + -1.263 -1.357 -1.396 -1.364 -1.398 -1.426 -1.404 -1.318 -1.367 -1.302 + -1.300 -1.267 -1.252 -1.250 -1.242 -1.234 -1.243 -1.255 -1.224 -1.298 + -1.309 -1.320 -1.295 -1.336 -1.362 -1.396 -1.475 -1.516 -1.617 -1.721 + -1.741 -1.830 -1.916 -1.899 -1.858 -1.776 -1.722 -1.561 -1.461 -1.635 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1558 sndrD3_g15 17 0.572636E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.095 + -0.857 -0.879 -0.868 -0.780 -0.816 -0.745 -0.912 -1.086 -0.989 -1.054 + -1.007 -1.178 -1.261 -1.142 -1.134 -1.230 -1.108 -1.084 -1.085 -1.000 + -1.005 -0.942 -0.986 -0.951 -0.929 -0.956 -0.929 -0.958 -0.901 -1.073 + -1.122 -1.083 -1.045 -1.154 -1.183 -1.245 -1.397 -1.441 -1.592 -1.801 + -1.869 -2.106 -2.283 -2.324 -2.381 -2.361 -2.294 -2.060 -2.006 -2.143 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1559 sndrD3_g15 18 0.552543E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.636 + -0.473 -0.497 -0.448 -0.390 -0.421 -0.371 -0.543 -0.752 -0.599 -0.642 + -0.601 -0.764 -0.823 -0.726 -0.716 -0.810 -0.724 -0.713 -0.749 -0.695 + -0.739 -0.698 -0.773 -0.774 -0.738 -0.770 -0.758 -0.770 -0.734 -0.895 + -0.973 -0.927 -0.853 -0.914 -0.966 -1.030 -1.181 -1.253 -1.396 -1.621 + -1.696 -1.963 -2.192 -2.287 -2.402 -2.415 -2.357 -2.269 -2.227 -2.346 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1560 sndrD4_g15 1 -0.281317E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.025 + 0.037 0.069 0.043 0.054 0.055 0.077 0.074 0.093 0.078 0.047 + 0.022 0.072 0.061 0.059 0.046 0.060 0.055 0.063 0.054 0.047 + 0.045 0.048 0.051 0.035 0.046 0.032 0.022 0.011 0.011 0.007 + 0.025 0.001 -0.000 -0.011 -0.010 -0.010 -0.008 -0.019 -0.026 -0.034 + -0.063 -0.061 -0.072 -0.054 -0.101 -0.096 -0.092 -0.149 -0.174 -0.169 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1561 sndrD4_g15 2 0.473448E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.137 + -0.096 -0.110 -0.138 -0.115 -0.119 -0.157 -0.095 -0.153 -0.141 -0.186 + -0.170 -0.172 -0.190 -0.165 -0.155 -0.155 -0.162 -0.148 -0.146 -0.139 + -0.140 -0.135 -0.124 -0.141 -0.125 -0.123 -0.132 -0.139 -0.137 -0.126 + -0.106 -0.119 -0.119 -0.136 -0.125 -0.123 -0.124 -0.101 -0.114 -0.118 + -0.123 -0.107 -0.105 -0.097 -0.089 -0.075 -0.051 -0.066 -0.095 -0.105 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1562 sndrD4_g15 3 0.480634E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.547 + 0.513 0.503 0.445 0.467 0.458 0.458 0.462 0.407 0.427 0.426 + 0.427 0.431 0.419 0.404 0.361 0.363 0.375 0.377 0.355 0.380 + 0.379 0.377 0.363 0.356 0.360 0.356 0.342 0.329 0.329 0.323 + 0.322 0.320 0.298 0.280 0.282 0.281 0.276 0.278 0.287 0.267 + 0.258 0.248 0.243 0.260 0.250 0.247 0.250 0.231 0.214 0.253 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1563 sndrD4_g15 4 0.491183E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.252 + 0.228 0.204 0.182 0.159 0.154 0.138 0.137 0.075 0.101 0.067 + 0.091 0.070 0.079 0.048 0.002 -0.035 -0.024 -0.002 -0.019 -0.011 + -0.020 -0.011 -0.017 -0.040 -0.033 -0.036 -0.039 -0.059 -0.051 -0.041 + -0.056 -0.051 -0.065 -0.085 -0.082 -0.093 -0.106 -0.111 -0.109 -0.145 + -0.154 -0.153 -0.173 -0.149 -0.143 -0.153 -0.106 -0.112 -0.077 -0.069 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1564 sndrD4_g15 5 0.413015E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.128 + -0.207 -0.177 -0.236 -0.286 -0.290 -0.303 -0.339 -0.397 -0.425 -0.421 + -0.438 -0.435 -0.435 -0.502 -0.562 -0.579 -0.588 -0.552 -0.585 -0.593 + -0.619 -0.615 -0.649 -0.657 -0.673 -0.698 -0.705 -0.741 -0.739 -0.748 + -0.782 -0.772 -0.774 -0.771 -0.792 -0.809 -0.856 -0.926 -0.947 -1.015 + -1.051 -1.108 -1.176 -1.183 -1.228 -1.256 -1.227 -1.269 -1.236 -1.176 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1565 sndrD4_g15 6 0.191897E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.063 + 0.049 0.037 -0.022 -0.021 -0.091 -0.090 -0.122 -0.216 -0.216 -0.263 + -0.297 -0.352 -0.342 -0.374 -0.467 -0.441 -0.489 -0.450 -0.451 -0.466 + -0.499 -0.483 -0.514 -0.537 -0.561 -0.612 -0.627 -0.664 -0.676 -0.703 + -0.792 -0.720 -0.668 -0.608 -0.670 -0.697 -0.775 -0.920 -0.946 -1.085 + -1.057 -1.168 -1.260 -1.272 -1.356 -1.453 -1.431 -1.405 -1.422 -1.367 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1566 sndrD4_g15 7 0.118074E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.200 + -0.123 -0.133 -0.202 -0.230 -0.305 -0.274 -0.336 -0.425 -0.458 -0.464 + -0.547 -0.564 -0.578 -0.625 -0.728 -0.688 -0.722 -0.676 -0.678 -0.683 + -0.701 -0.680 -0.710 -0.728 -0.762 -0.815 -0.815 -0.851 -0.864 -0.921 + -0.999 -0.937 -0.868 -0.832 -0.904 -0.954 -1.057 -1.245 -1.302 -1.462 + -1.429 -1.579 -1.659 -1.687 -1.767 -1.865 -1.803 -1.783 -1.742 -1.698 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1567 sndrD4_g15 8 0.833140E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.249 + -0.124 -0.149 -0.256 -0.295 -0.362 -0.280 -0.394 -0.471 -0.544 -0.537 + -0.613 -0.620 -0.641 -0.701 -0.778 -0.776 -0.790 -0.749 -0.779 -0.755 + -0.764 -0.724 -0.759 -0.785 -0.792 -0.846 -0.847 -0.874 -0.882 -0.952 + -1.017 -0.980 -0.906 -0.887 -0.983 -1.034 -1.151 -1.411 -1.540 -1.764 + -1.796 -1.985 -2.094 -2.112 -2.175 -2.231 -2.105 -1.963 -2.011 -2.012 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1568 sndrD4_g15 9 -0.693227E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.621 + -0.512 -0.552 -0.624 -0.599 -0.658 -0.569 -0.657 -0.710 -0.757 -0.737 + -0.777 -0.803 -0.842 -0.912 -1.027 -1.170 -1.163 -1.135 -1.136 -1.126 + -1.094 -1.050 -1.059 -1.044 -1.026 -1.013 -0.996 -1.020 -1.011 -1.064 + -1.077 -1.034 -0.956 -0.930 -0.979 -0.964 -1.024 -1.120 -1.199 -1.304 + -1.359 -1.450 -1.520 -1.526 -1.563 -1.577 -1.562 -1.599 -1.648 -1.504 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1569 sndrD4_g15 10 0.553318E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.607 + 0.543 0.434 0.449 0.537 0.603 0.440 0.444 0.381 0.495 0.413 + 0.603 0.522 0.587 0.447 0.392 0.288 0.231 0.152 0.116 0.099 + 0.040 0.052 0.067 0.018 0.041 0.017 -0.006 -0.031 -0.031 -0.019 + -0.040 -0.056 -0.042 -0.025 -0.053 -0.073 -0.097 -0.121 -0.077 -0.082 + -0.078 -0.096 -0.173 -0.148 -0.255 -0.296 -0.314 -0.329 -0.261 -0.343 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1570 sndrD4_g15 11 0.764634E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.216 + 1.271 0.892 1.126 1.046 1.141 0.912 1.014 1.066 1.195 1.218 + 1.372 1.177 1.249 1.008 1.130 0.923 0.919 0.812 0.796 0.779 + 0.778 0.729 0.809 0.782 0.783 0.800 0.772 0.765 0.823 0.866 + 0.878 0.897 0.901 0.879 0.835 0.839 0.823 0.860 0.931 0.865 + 0.957 0.973 1.005 1.017 0.941 0.983 0.934 0.951 1.093 1.012 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1571 sndrD4_g15 12 0.787168E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.924 + 1.098 1.165 1.183 0.974 1.160 0.865 0.902 0.840 0.955 1.071 + 1.111 1.012 1.055 0.961 0.884 0.778 0.730 0.588 0.590 0.547 + 0.534 0.529 0.543 0.504 0.498 0.504 0.467 0.489 0.528 0.582 + 0.578 0.605 0.583 0.671 0.595 0.614 0.620 0.624 0.679 0.630 + 0.623 0.765 0.691 0.688 0.618 0.678 0.771 0.807 0.914 0.778 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1572 sndrD4_g15 13 0.366422E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.121 + -0.040 -0.098 -0.143 -0.169 -0.203 -0.136 -0.221 -0.288 -0.353 -0.342 + -0.352 -0.358 -0.361 -0.387 -0.402 -0.381 -0.348 -0.320 -0.355 -0.327 + -0.333 -0.322 -0.328 -0.317 -0.327 -0.336 -0.327 -0.349 -0.339 -0.371 + -0.388 -0.363 -0.334 -0.359 -0.394 -0.413 -0.472 -0.588 -0.632 -0.732 + -0.759 -0.831 -0.894 -0.931 -0.945 -0.885 -0.869 -0.934 -0.919 -0.784 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1573 sndrD4_g15 14 0.461712E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.566 + -0.528 -0.526 -0.538 -0.541 -0.542 -0.478 -0.557 -0.597 -0.630 -0.638 + -0.648 -0.670 -0.672 -0.735 -0.740 -0.772 -0.782 -0.776 -0.788 -0.785 + -0.781 -0.766 -0.762 -0.750 -0.751 -0.779 -0.767 -0.778 -0.780 -0.796 + -0.772 -0.805 -0.824 -0.862 -0.877 -0.885 -0.897 -0.942 -0.918 -0.983 + -0.954 -0.981 -0.989 -0.916 -0.878 -0.859 -0.767 -0.632 -0.538 -0.478 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1574 sndrD4_g15 15 0.402863E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.173 + -0.003 0.022 0.129 0.076 0.162 0.227 0.132 0.176 0.220 0.301 + 0.208 0.191 0.184 0.155 0.022 -0.201 -0.250 -0.346 -0.348 -0.355 + -0.363 -0.336 -0.292 -0.325 -0.269 -0.302 -0.298 -0.274 -0.344 -0.298 + -0.246 -0.327 -0.390 -0.449 -0.426 -0.389 -0.305 -0.326 -0.236 -0.243 + -0.059 -0.107 0.016 0.221 0.311 0.186 0.455 1.025 1.180 0.926 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1575 sndrD4_g15 16 0.238461E-01 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.388 + -1.197 -1.235 -1.253 -1.327 -1.320 -1.285 -1.299 -1.480 -1.500 -1.477 + -1.558 -1.519 -1.608 -1.589 -1.631 -1.580 -1.447 -1.424 -1.458 -1.417 + -1.390 -1.358 -1.355 -1.346 -1.362 -1.349 -1.346 -1.369 -1.350 -1.398 + -1.374 -1.399 -1.363 -1.439 -1.472 -1.483 -1.540 -1.654 -1.719 -1.814 + -1.863 -1.941 -1.964 -2.008 -1.927 -1.893 -1.849 -1.832 -1.787 -1.889 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1576 sndrD4_g15 17 0.571770E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -1.301 + -0.869 -1.109 -1.028 -1.092 -1.129 -1.061 -1.151 -1.327 -1.388 -1.349 + -1.316 -1.302 -1.384 -1.401 -1.382 -1.462 -1.271 -1.202 -1.235 -1.215 + -1.188 -1.150 -1.163 -1.175 -1.171 -1.161 -1.170 -1.182 -1.197 -1.250 + -1.249 -1.280 -1.210 -1.334 -1.362 -1.366 -1.464 -1.685 -1.758 -1.988 + -2.058 -2.246 -2.372 -2.493 -2.516 -2.453 -2.432 -2.377 -2.422 -2.344 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1577 sndrD4_g15 18 0.552484E-02 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -0.639 + -0.256 -0.436 -0.377 -0.415 -0.433 -0.370 -0.463 -0.636 -0.689 -0.670 + -0.643 -0.631 -0.709 -0.742 -0.753 -0.836 -0.703 -0.674 -0.719 -0.700 + -0.711 -0.668 -0.706 -0.720 -0.721 -0.741 -0.738 -0.749 -0.777 -0.827 + -0.848 -0.883 -0.820 -0.928 -0.961 -0.992 -1.071 -1.323 -1.356 -1.597 + -1.665 -1.885 -2.052 -2.193 -2.243 -2.164 -2.193 -2.036 -2.113 -1.961 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1578 seviri_m08 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1579 seviri_m08 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1580 seviri_m08 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1581 seviri_m08 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1582 seviri_m08 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1583 seviri_m08 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1584 seviri_m08 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1585 seviri_m08 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1586 seviri_m09 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1587 seviri_m09 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1588 seviri_m09 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1589 seviri_m09 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1590 seviri_m09 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1591 seviri_m09 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1592 seviri_m09 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1593 seviri_m09 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1594 seviri_m10 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1595 seviri_m10 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1596 seviri_m10 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1597 seviri_m10 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1598 seviri_m10 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1599 seviri_m10 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1600 seviri_m10 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1601 seviri_m10 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1602 atms_npp 1 0.526480E-02 + 0.020 -0.235 0.020 0.316 -0.409 -0.386 -0.086 -0.275 -0.629 -0.431 + -0.558 -0.565 -0.980 -0.968 -0.932 -0.515 -0.676 -0.828 -1.113 -1.008 + -0.869 -0.777 -0.644 -0.744 -1.177 -1.043 -1.123 -1.151 -1.065 -1.173 + -1.059 -0.844 -1.141 -1.181 -1.363 -1.194 -1.147 -1.250 -1.147 -1.211 + -1.152 -0.994 -1.377 -1.470 -1.210 -1.239 -1.446 -1.119 -1.403 -1.579 + -1.192 -1.807 -1.128 -0.966 -1.127 -0.944 -1.378 -1.247 -1.011 -1.213 + -1.107 -1.313 -1.407 -1.336 -1.360 -1.255 -1.378 -1.203 -1.180 -1.248 + -1.225 -1.221 -1.669 -1.394 -1.353 -1.573 -1.493 -1.308 -1.558 -1.413 + -1.338 -1.347 -0.892 -1.321 -1.406 -1.149 -1.029 -1.142 -1.431 -1.319 + + 1603 atms_npp 2 0.293992E-02 + 0.505 0.400 0.434 0.570 0.114 0.098 0.073 -0.249 -0.416 -0.291 + -0.361 -0.497 -0.621 -0.475 -0.523 -0.515 -0.627 -0.788 -0.632 -0.694 + -0.668 -0.519 -0.329 -0.613 -0.724 -0.650 -0.632 -0.672 -0.761 -0.886 + -0.836 -0.604 -0.923 -0.760 -0.877 -1.097 -0.767 -0.964 -0.798 -0.794 + -0.828 -0.619 -0.831 -0.879 -0.933 -0.723 -1.022 -0.767 -0.907 -1.103 + -0.590 -0.912 -0.916 -0.756 -0.743 -0.708 -0.944 -0.653 -0.795 -0.878 + -0.786 -1.037 -1.066 -1.106 -1.154 -1.170 -0.974 -0.990 -1.117 -1.230 + -0.964 -1.075 -1.300 -1.330 -1.354 -1.341 -1.146 -1.299 -1.508 -1.374 + -1.209 -1.267 -1.080 -1.277 -1.275 -1.147 -0.932 -1.015 -1.291 -0.758 + + 1604 atms_npp 3 0.181496E-01 + -1.237 -1.034 -0.543 -0.164 -0.068 0.277 0.477 0.440 0.752 1.117 + 1.136 1.353 1.247 1.654 1.783 1.703 1.853 1.966 2.142 2.218 + 2.184 2.163 2.345 2.370 2.438 2.232 2.375 2.437 2.183 2.407 + 2.355 2.602 2.391 2.241 2.432 2.285 2.503 2.310 2.524 2.516 + 2.356 2.594 2.576 2.073 2.489 2.644 2.236 2.518 2.331 2.421 + 2.759 2.523 2.410 2.427 2.827 2.522 2.346 2.587 2.830 2.655 + 2.642 2.725 2.644 2.418 2.469 2.373 2.460 2.695 2.380 2.304 + 2.349 2.391 2.225 2.252 2.032 1.791 1.903 1.875 1.563 1.492 + 1.412 1.169 1.095 0.701 0.579 0.178 0.133 -0.359 -0.741 -0.917 + + 1605 atms_npp 4 0.271860E-01 + -1.802 -1.653 -1.448 -1.262 -1.155 -0.906 -0.756 -0.695 -0.467 -0.132 + -0.184 -0.046 0.089 0.335 0.488 0.457 0.633 0.721 0.828 0.933 + 1.015 0.901 1.211 1.093 1.240 1.212 1.265 1.356 1.233 1.445 + 1.365 1.458 1.327 1.341 1.514 1.322 1.347 1.516 1.552 1.532 + 1.409 1.573 1.705 1.402 1.548 1.743 1.458 1.698 1.548 1.516 + 1.842 1.570 1.391 1.568 1.801 1.583 1.435 1.661 1.797 1.484 + 1.556 1.651 1.609 1.395 1.394 1.325 1.374 1.460 1.245 1.145 + 1.088 1.113 1.001 0.912 0.681 0.445 0.492 0.466 0.169 0.028 + -0.122 -0.288 -0.386 -0.746 -0.836 -1.055 -1.247 -1.508 -1.772 -1.901 + + 1606 atms_npp 5 0.409449E-01 + -1.107 -1.104 -1.093 -1.054 -1.051 -0.994 -0.959 -0.945 -0.884 -0.730 + -0.739 -0.692 -0.605 -0.545 -0.478 -0.460 -0.328 -0.330 -0.227 -0.181 + -0.163 -0.211 -0.033 0.022 0.050 0.033 0.101 0.124 0.057 0.300 + 0.204 0.194 0.214 0.230 0.310 0.195 0.316 0.419 0.421 0.294 + 0.284 0.459 0.406 0.350 0.428 0.572 0.481 0.504 0.437 0.440 + 0.507 0.381 0.289 0.386 0.573 0.411 0.331 0.403 0.465 0.165 + 0.292 0.358 0.241 0.131 0.131 0.083 0.044 0.041 -0.072 -0.136 + -0.139 -0.172 -0.246 -0.311 -0.459 -0.532 -0.541 -0.586 -0.764 -0.806 + -0.903 -0.937 -1.054 -1.130 -1.191 -1.272 -1.339 -1.390 -1.460 -1.498 + + 1607 atms_npp 6 0.514006E-01 + -0.152 -0.170 -0.208 -0.210 -0.225 -0.249 -0.259 -0.271 -0.278 -0.248 + -0.263 -0.276 -0.261 -0.261 -0.252 -0.255 -0.232 -0.217 -0.207 -0.197 + -0.200 -0.204 -0.173 -0.154 -0.155 -0.167 -0.120 -0.140 -0.147 -0.083 + -0.080 -0.106 -0.086 -0.085 -0.056 -0.080 -0.042 -0.053 -0.035 -0.059 + -0.044 -0.033 -0.041 -0.054 -0.038 -0.001 -0.045 -0.006 -0.022 -0.027 + -0.007 -0.021 -0.097 -0.043 0.013 -0.045 -0.067 -0.078 -0.063 -0.138 + -0.123 -0.122 -0.126 -0.192 -0.188 -0.216 -0.248 -0.233 -0.278 -0.289 + -0.311 -0.333 -0.333 -0.342 -0.404 -0.419 -0.433 -0.454 -0.500 -0.521 + -0.540 -0.541 -0.588 -0.611 -0.628 -0.644 -0.664 -0.694 -0.716 -0.739 + + 1608 atms_npp 7 0.540347E-01 + -0.223 -0.241 -0.255 -0.233 -0.265 -0.288 -0.286 -0.259 -0.285 -0.248 + -0.255 -0.271 -0.255 -0.244 -0.251 -0.250 -0.239 -0.225 -0.225 -0.219 + -0.219 -0.229 -0.194 -0.187 -0.209 -0.213 -0.178 -0.188 -0.177 -0.158 + -0.152 -0.174 -0.150 -0.145 -0.154 -0.152 -0.147 -0.157 -0.144 -0.132 + -0.155 -0.146 -0.165 -0.138 -0.152 -0.150 -0.141 -0.157 -0.156 -0.167 + -0.153 -0.172 -0.188 -0.168 -0.171 -0.180 -0.192 -0.190 -0.212 -0.224 + -0.230 -0.226 -0.247 -0.270 -0.267 -0.283 -0.307 -0.311 -0.345 -0.350 + -0.373 -0.359 -0.388 -0.405 -0.448 -0.439 -0.444 -0.462 -0.487 -0.526 + -0.540 -0.550 -0.566 -0.609 -0.605 -0.645 -0.665 -0.685 -0.713 -0.725 + + 1609 atms_npp 8 0.374770E-01 + -0.538 -0.539 -0.552 -0.564 -0.583 -0.590 -0.588 -0.594 -0.598 -0.589 + -0.588 -0.589 -0.580 -0.581 -0.576 -0.583 -0.581 -0.576 -0.578 -0.574 + -0.578 -0.561 -0.576 -0.565 -0.561 -0.573 -0.566 -0.559 -0.546 -0.548 + -0.540 -0.539 -0.539 -0.536 -0.539 -0.526 -0.528 -0.528 -0.533 -0.527 + -0.529 -0.516 -0.537 -0.538 -0.537 -0.549 -0.532 -0.541 -0.528 -0.543 + -0.536 -0.554 -0.560 -0.545 -0.562 -0.557 -0.561 -0.579 -0.567 -0.594 + -0.597 -0.605 -0.625 -0.625 -0.626 -0.640 -0.661 -0.672 -0.685 -0.689 + -0.709 -0.720 -0.720 -0.738 -0.757 -0.757 -0.765 -0.777 -0.799 -0.819 + -0.838 -0.838 -0.849 -0.867 -0.885 -0.898 -0.912 -0.918 -0.934 -0.949 + + 1610 atms_npp 9 0.214001E-01 + -0.674 -0.670 -0.674 -0.690 -0.699 -0.704 -0.707 -0.709 -0.715 -0.702 + -0.694 -0.684 -0.687 -0.679 -0.686 -0.666 -0.667 -0.673 -0.660 -0.669 + -0.664 -0.663 -0.662 -0.663 -0.671 -0.660 -0.651 -0.647 -0.634 -0.670 + -0.635 -0.635 -0.626 -0.632 -0.631 -0.637 -0.618 -0.610 -0.618 -0.614 + -0.623 -0.625 -0.632 -0.634 -0.617 -0.627 -0.618 -0.629 -0.626 -0.631 + -0.644 -0.633 -0.644 -0.631 -0.639 -0.648 -0.663 -0.670 -0.668 -0.670 + -0.679 -0.678 -0.684 -0.700 -0.720 -0.728 -0.740 -0.759 -0.776 -0.782 + -0.774 -0.783 -0.787 -0.801 -0.834 -0.823 -0.838 -0.847 -0.868 -0.885 + -0.882 -0.899 -0.924 -0.940 -0.948 -0.958 -0.964 -0.973 -1.004 -1.003 + + 1611 atms_npp 10 -0.150859E-01 + -0.121 -0.113 -0.134 -0.127 -0.134 -0.156 -0.136 -0.147 -0.131 -0.132 + -0.123 -0.114 -0.119 -0.112 -0.112 -0.117 -0.105 -0.115 -0.105 -0.105 + -0.091 -0.110 -0.118 -0.089 -0.087 -0.091 -0.101 -0.074 -0.075 -0.094 + -0.070 -0.080 -0.063 -0.065 -0.065 -0.067 -0.074 -0.072 -0.067 -0.065 + -0.060 -0.060 -0.073 -0.052 -0.082 -0.056 -0.055 -0.051 -0.051 -0.067 + -0.064 -0.053 -0.074 -0.059 -0.083 -0.080 -0.080 -0.086 -0.080 -0.076 + -0.096 -0.121 -0.097 -0.131 -0.126 -0.122 -0.136 -0.128 -0.137 -0.151 + -0.161 -0.157 -0.161 -0.173 -0.184 -0.178 -0.189 -0.199 -0.198 -0.220 + -0.221 -0.235 -0.245 -0.238 -0.251 -0.253 -0.263 -0.267 -0.270 -0.272 + + 1612 atms_npp 11 -0.284901E-01 + -0.202 -0.212 -0.215 -0.204 -0.207 -0.227 -0.205 -0.202 -0.202 -0.194 + -0.189 -0.178 -0.181 -0.162 -0.168 -0.182 -0.156 -0.151 -0.135 -0.116 + -0.130 -0.155 -0.132 -0.114 -0.110 -0.109 -0.118 -0.093 -0.100 -0.121 + -0.083 -0.065 -0.071 -0.069 -0.066 -0.049 -0.072 -0.080 -0.057 -0.033 + -0.058 -0.060 -0.069 -0.063 -0.072 -0.062 -0.036 -0.041 -0.052 -0.051 + -0.032 -0.079 -0.069 -0.042 -0.054 -0.072 -0.069 -0.077 -0.081 -0.085 + -0.086 -0.102 -0.092 -0.111 -0.080 -0.108 -0.126 -0.154 -0.147 -0.148 + -0.141 -0.136 -0.154 -0.164 -0.180 -0.167 -0.206 -0.187 -0.201 -0.225 + -0.208 -0.247 -0.262 -0.254 -0.273 -0.272 -0.277 -0.278 -0.283 -0.303 + + 1613 atms_npp 12 -0.393897E-01 + -0.067 -0.080 -0.092 -0.080 -0.095 -0.095 -0.076 -0.085 -0.064 -0.076 + -0.053 -0.067 -0.063 -0.054 -0.059 -0.062 -0.041 -0.015 -0.036 -0.014 + -0.038 -0.012 -0.008 0.002 -0.011 -0.005 -0.008 0.022 0.015 0.010 + 0.032 0.024 0.052 0.037 0.012 0.022 0.040 0.030 0.054 0.034 + 0.039 0.039 0.044 0.066 0.052 0.048 0.055 0.027 0.043 0.052 + 0.041 0.073 0.047 0.054 0.054 0.043 0.054 0.041 0.010 0.036 + 0.028 0.023 0.035 -0.005 0.003 -0.004 -0.002 0.004 -0.014 -0.023 + -0.005 -0.028 -0.014 -0.027 -0.066 -0.031 -0.038 -0.051 -0.058 -0.063 + -0.062 -0.073 -0.091 -0.072 -0.084 -0.105 -0.093 -0.100 -0.116 -0.107 + + 1614 atms_npp 13 -0.574728E-01 + -0.055 -0.029 -0.071 -0.085 -0.067 -0.055 -0.090 -0.073 -0.077 -0.044 + -0.075 -0.054 -0.068 -0.026 -0.055 -0.072 -0.017 -0.079 -0.029 -0.032 + -0.008 -0.046 -0.013 0.000 -0.038 0.006 -0.006 -0.003 -0.006 0.020 + 0.003 0.013 0.052 0.032 -0.022 -0.009 0.031 0.006 0.040 0.052 + 0.032 0.035 -0.011 0.025 0.036 0.041 0.050 0.052 0.039 0.039 + 0.037 0.043 0.011 0.042 0.058 0.050 0.052 0.023 0.056 0.048 + 0.074 0.047 0.054 0.001 -0.015 -0.002 -0.002 0.000 -0.025 -0.029 + -0.014 -0.025 0.023 -0.020 -0.032 -0.029 -0.002 -0.057 -0.047 -0.061 + -0.036 -0.065 -0.083 -0.062 -0.080 -0.062 -0.091 -0.094 -0.092 -0.079 + + 1615 atms_npp 14 -0.768403E-01 + 0.301 0.323 0.320 0.279 0.311 0.319 0.225 0.263 0.245 0.292 + 0.227 0.248 0.192 0.270 0.263 0.269 0.220 0.266 0.232 0.302 + 0.290 0.297 0.230 0.234 0.220 0.257 0.254 0.224 0.253 0.297 + 0.279 0.321 0.291 0.283 0.223 0.250 0.285 0.312 0.272 0.292 + 0.285 0.297 0.337 0.294 0.281 0.291 0.293 0.303 0.286 0.332 + 0.272 0.285 0.279 0.293 0.306 0.273 0.329 0.306 0.272 0.326 + 0.296 0.289 0.316 0.293 0.269 0.236 0.222 0.284 0.259 0.242 + 0.234 0.256 0.209 0.261 0.272 0.262 0.260 0.259 0.301 0.263 + 0.256 0.265 0.274 0.240 0.270 0.259 0.250 0.242 0.265 0.266 + + 1616 atms_npp 15 -0.544455E-01 + 1.102 1.121 1.146 1.091 1.135 1.071 1.051 1.044 1.028 1.080 + 1.013 1.068 0.880 1.012 1.028 1.013 0.932 0.810 0.938 1.087 + 0.993 1.003 0.923 0.971 0.938 0.898 1.021 0.856 0.931 0.914 + 1.046 0.908 0.972 0.854 1.041 0.949 0.913 0.949 1.127 0.987 + 1.000 0.977 0.891 1.036 1.069 1.064 0.981 1.109 0.874 1.033 + 0.889 0.945 0.966 0.954 0.984 0.918 1.003 0.977 0.992 0.997 + 0.997 1.025 0.982 1.018 1.006 0.959 0.860 0.997 0.951 1.126 + 0.951 1.005 0.917 0.969 0.970 0.956 1.012 1.023 0.944 1.015 + 0.941 0.964 0.904 0.890 1.062 0.967 0.920 0.969 1.001 1.019 + + 1617 atms_npp 16 0.880854E-02 + 0.059 0.465 0.821 0.654 0.579 0.820 0.639 0.759 1.103 1.400 + 0.911 0.874 0.874 1.061 1.571 1.182 1.471 1.477 1.238 1.345 + 1.822 1.436 1.790 1.754 1.733 1.801 1.815 2.100 1.567 1.792 + 1.850 1.764 1.859 1.941 2.000 2.022 1.603 2.278 2.261 2.382 + 2.221 2.496 2.612 2.327 2.554 2.288 2.137 2.107 2.154 2.221 + 2.750 2.122 2.403 1.636 2.515 2.287 1.994 2.030 2.306 2.351 + 2.050 1.977 1.888 1.508 1.636 1.977 1.573 1.176 1.229 1.282 + 1.237 1.112 1.013 1.105 0.849 0.589 0.629 0.772 0.317 0.218 + 0.350 0.414 -0.137 0.113 0.206 -0.254 -0.123 -0.153 -0.688 -0.461 + + 1618 atms_npp 17 0.235463E-01 + -1.750 -1.821 -1.694 -1.481 -1.460 -1.241 -1.139 -1.168 -1.039 -0.927 + -0.986 -0.845 -0.572 -0.595 -0.552 -0.702 -0.476 -0.529 -0.100 -0.531 + -0.149 -0.512 -0.259 -0.366 0.042 0.007 -0.226 0.245 -0.185 -0.100 + -0.094 0.135 0.290 0.245 -0.012 0.120 0.154 0.097 0.236 0.127 + 0.014 0.351 0.304 0.141 0.253 -0.024 0.233 0.294 0.135 0.143 + 0.430 0.106 0.312 -0.185 0.284 0.110 0.088 0.144 0.236 -0.001 + 0.036 -0.069 0.093 0.060 0.022 0.179 -0.071 -0.145 -0.036 -0.153 + -0.334 -0.172 -0.312 -0.485 -0.658 -0.536 -0.484 -0.619 -1.014 -1.046 + -0.857 -0.847 -1.153 -1.452 -1.447 -1.362 -1.598 -1.751 -1.770 -1.879 + + 1619 atms_npp 18 0.374950E-01 + -1.358 -1.360 -1.327 -1.265 -1.362 -1.272 -1.171 -1.266 -1.278 -1.152 + -1.219 -1.059 -0.955 -1.124 -1.033 -1.047 -0.976 -0.879 -1.003 -0.994 + -0.947 -0.948 -0.843 -0.935 -0.808 -1.009 -0.892 -0.812 -0.844 -0.675 + -0.839 -0.797 -0.870 -0.767 -0.778 -0.693 -0.863 -0.727 -0.802 -0.800 + -0.820 -0.885 -0.711 -0.706 -0.683 -0.838 -0.697 -0.761 -0.792 -0.813 + -0.742 -0.899 -0.890 -0.821 -0.703 -0.817 -0.753 -0.815 -0.775 -0.890 + -0.878 -0.658 -0.919 -0.839 -0.763 -0.821 -0.957 -0.999 -0.895 -0.962 + -1.013 -0.831 -0.952 -0.973 -1.000 -1.132 -1.073 -1.080 -1.111 -1.154 + -1.204 -1.258 -1.201 -1.284 -1.317 -1.391 -1.317 -1.330 -1.405 -1.384 + + 1620 atms_npp 19 0.481224E-01 + -0.697 -0.790 -0.748 -0.663 -0.916 -0.774 -0.736 -0.776 -0.695 -0.726 + -0.723 -0.578 -0.628 -0.684 -0.595 -0.715 -0.570 -0.477 -0.541 -0.545 + -0.567 -0.488 -0.546 -0.576 -0.468 -0.663 -0.552 -0.440 -0.518 -0.462 + -0.531 -0.516 -0.501 -0.452 -0.393 -0.459 -0.494 -0.495 -0.414 -0.485 + -0.495 -0.524 -0.361 -0.471 -0.401 -0.520 -0.461 -0.494 -0.463 -0.488 + -0.421 -0.481 -0.563 -0.533 -0.367 -0.508 -0.414 -0.563 -0.436 -0.550 + -0.605 -0.380 -0.566 -0.500 -0.431 -0.477 -0.533 -0.678 -0.627 -0.562 + -0.701 -0.435 -0.548 -0.561 -0.607 -0.627 -0.559 -0.634 -0.668 -0.694 + -0.757 -0.727 -0.762 -0.684 -0.829 -0.838 -0.757 -0.728 -0.814 -0.810 + + 1621 atms_npp 20 0.587870E-01 + -0.461 -0.632 -0.488 -0.514 -0.695 -0.618 -0.480 -0.597 -0.564 -0.509 + -0.471 -0.408 -0.492 -0.438 -0.467 -0.428 -0.372 -0.325 -0.431 -0.373 + -0.327 -0.309 -0.403 -0.397 -0.341 -0.421 -0.367 -0.222 -0.280 -0.349 + -0.341 -0.384 -0.261 -0.196 -0.312 -0.309 -0.325 -0.302 -0.226 -0.388 + -0.349 -0.342 -0.156 -0.272 -0.206 -0.265 -0.178 -0.336 -0.322 -0.377 + -0.220 -0.377 -0.347 -0.391 -0.206 -0.277 -0.257 -0.463 -0.291 -0.413 + -0.420 -0.276 -0.439 -0.374 -0.262 -0.283 -0.415 -0.520 -0.418 -0.416 + -0.402 -0.205 -0.373 -0.374 -0.469 -0.407 -0.348 -0.432 -0.479 -0.518 + -0.569 -0.481 -0.610 -0.485 -0.638 -0.622 -0.571 -0.585 -0.606 -0.624 + + 1622 atms_npp 21 0.714763E-01 + -0.067 -0.255 -0.097 -0.145 -0.294 -0.200 -0.036 -0.268 -0.240 -0.135 + -0.147 -0.099 -0.066 -0.139 -0.129 -0.139 0.032 0.024 -0.084 -0.079 + 0.004 0.068 0.021 -0.027 0.034 -0.059 0.012 0.055 0.106 0.009 + 0.077 -0.013 0.047 0.149 -0.044 0.038 -0.003 0.046 0.175 -0.085 + 0.017 -0.019 0.127 0.089 0.115 0.039 0.074 0.010 -0.021 0.031 + 0.100 -0.100 -0.042 -0.060 0.155 0.090 0.008 -0.144 0.075 -0.120 + -0.078 0.037 -0.046 -0.046 0.085 0.008 -0.103 -0.209 -0.122 -0.107 + -0.040 0.167 -0.061 -0.049 -0.151 -0.005 0.056 -0.082 -0.199 -0.253 + -0.221 -0.182 -0.294 -0.151 -0.295 -0.235 -0.251 -0.271 -0.313 -0.323 + + 1623 atms_npp 22 0.810301E-01 + 0.663 0.514 0.624 0.537 0.467 0.570 0.646 0.500 0.514 0.584 + 0.540 0.598 0.678 0.580 0.557 0.612 0.812 0.700 0.611 0.650 + 0.704 0.747 0.634 0.674 0.734 0.678 0.663 0.821 0.780 0.756 + 0.734 0.686 0.691 0.889 0.629 0.809 0.674 0.702 0.796 0.518 + 0.800 0.701 0.778 0.705 0.851 0.735 0.764 0.731 0.610 0.703 + 0.830 0.584 0.672 0.737 0.778 0.826 0.706 0.523 0.818 0.611 + 0.664 0.723 0.617 0.634 0.800 0.738 0.515 0.509 0.639 0.621 + 0.723 0.830 0.596 0.580 0.554 0.746 0.737 0.651 0.506 0.513 + 0.547 0.585 0.439 0.597 0.446 0.503 0.507 0.461 0.447 0.388 + + 1624 cris_npp 27 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1625 cris_npp 28 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1626 cris_npp 31 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1627 cris_npp 32 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1628 cris_npp 33 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1629 cris_npp 37 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1630 cris_npp 49 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1631 cris_npp 51 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1632 cris_npp 53 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1633 cris_npp 59 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1634 cris_npp 61 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1635 cris_npp 63 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1636 cris_npp 64 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1637 cris_npp 65 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1638 cris_npp 67 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1639 cris_npp 69 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1640 cris_npp 71 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1641 cris_npp 73 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1642 cris_npp 75 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1643 cris_npp 79 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1644 cris_npp 80 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1645 cris_npp 81 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1646 cris_npp 83 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1647 cris_npp 85 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1648 cris_npp 87 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1649 cris_npp 88 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1650 cris_npp 89 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1651 cris_npp 93 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1652 cris_npp 95 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1653 cris_npp 96 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1654 cris_npp 99 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1655 cris_npp 101 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1656 cris_npp 102 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1657 cris_npp 104 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1658 cris_npp 106 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1659 cris_npp 107 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1660 cris_npp 111 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1661 cris_npp 113 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1662 cris_npp 116 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1663 cris_npp 120 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1664 cris_npp 123 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1665 cris_npp 124 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1666 cris_npp 125 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1667 cris_npp 126 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1668 cris_npp 130 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1669 cris_npp 132 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1670 cris_npp 133 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1671 cris_npp 136 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1672 cris_npp 137 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1673 cris_npp 138 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1674 cris_npp 142 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1675 cris_npp 143 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1676 cris_npp 144 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1677 cris_npp 145 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1678 cris_npp 147 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1679 cris_npp 148 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1680 cris_npp 150 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1681 cris_npp 151 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1682 cris_npp 153 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1683 cris_npp 154 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1684 cris_npp 155 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1685 cris_npp 157 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1686 cris_npp 158 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1687 cris_npp 159 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1688 cris_npp 160 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1689 cris_npp 161 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1690 cris_npp 162 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1691 cris_npp 163 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1692 cris_npp 164 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1693 cris_npp 165 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1694 cris_npp 166 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1695 cris_npp 168 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1696 cris_npp 170 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1697 cris_npp 171 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1698 cris_npp 173 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1699 cris_npp 175 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1700 cris_npp 181 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1701 cris_npp 183 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1702 cris_npp 198 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1703 cris_npp 208 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1704 cris_npp 211 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1705 cris_npp 216 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1706 cris_npp 224 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1707 cris_npp 228 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1708 cris_npp 236 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1709 cris_npp 238 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1710 cris_npp 242 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1711 cris_npp 248 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1712 cris_npp 266 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1713 cris_npp 268 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1714 cris_npp 279 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1715 cris_npp 283 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1716 cris_npp 311 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1717 cris_npp 317 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1718 cris_npp 330 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1719 cris_npp 333 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1720 cris_npp 334 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1721 cris_npp 338 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1722 cris_npp 340 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1723 cris_npp 341 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1724 cris_npp 342 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1725 cris_npp 349 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1726 cris_npp 352 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1727 cris_npp 358 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1728 cris_npp 361 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1729 cris_npp 364 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1730 cris_npp 366 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1731 cris_npp 367 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1732 cris_npp 368 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1733 cris_npp 378 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1734 cris_npp 390 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1735 cris_npp 391 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1736 cris_npp 392 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1737 cris_npp 394 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1738 cris_npp 395 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1739 cris_npp 396 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1740 cris_npp 397 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1741 cris_npp 398 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1742 cris_npp 399 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1743 cris_npp 404 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1744 cris_npp 427 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1745 cris_npp 447 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1746 cris_npp 464 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1747 cris_npp 473 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1748 cris_npp 482 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1749 cris_npp 484 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1750 cris_npp 501 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1751 cris_npp 529 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1752 cris_npp 556 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1753 cris_npp 557 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1754 cris_npp 558 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1755 cris_npp 560 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1756 cris_npp 561 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1757 cris_npp 562 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1758 cris_npp 564 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1759 cris_npp 565 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1760 cris_npp 566 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1761 cris_npp 569 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1762 cris_npp 573 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1763 cris_npp 574 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1764 cris_npp 577 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1765 cris_npp 580 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1766 cris_npp 581 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1767 cris_npp 584 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1768 cris_npp 585 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1769 cris_npp 587 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1770 cris_npp 590 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1771 cris_npp 591 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1772 cris_npp 594 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1773 cris_npp 597 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1774 cris_npp 598 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1775 cris_npp 601 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1776 cris_npp 604 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1777 cris_npp 607 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1778 cris_npp 611 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1779 cris_npp 614 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1780 cris_npp 616 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1781 cris_npp 617 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1782 cris_npp 619 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1783 cris_npp 622 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1784 cris_npp 626 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1785 cris_npp 628 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1786 cris_npp 634 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1787 cris_npp 637 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1788 cris_npp 638 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1789 cris_npp 640 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1790 cris_npp 641 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1791 cris_npp 642 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1792 cris_npp 644 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1793 cris_npp 646 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1794 cris_npp 647 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1795 cris_npp 650 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1796 cris_npp 651 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1797 cris_npp 652 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1798 cris_npp 654 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1799 cris_npp 655 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1800 cris_npp 657 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1801 cris_npp 659 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1802 cris_npp 663 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1803 cris_npp 667 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1804 cris_npp 670 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1805 cris_npp 707 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1806 cris_npp 710 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1807 cris_npp 713 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1808 cris_npp 716 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1809 cris_npp 730 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1810 cris_npp 735 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1811 cris_npp 736 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1812 cris_npp 739 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1813 cris_npp 743 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1814 cris_npp 744 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1815 cris_npp 746 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1816 cris_npp 748 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1817 cris_npp 751 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1818 cris_npp 754 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1819 cris_npp 755 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1820 cris_npp 756 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1821 cris_npp 757 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1822 cris_npp 758 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1823 cris_npp 760 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1824 cris_npp 761 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1825 cris_npp 762 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1826 cris_npp 763 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1827 cris_npp 766 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1828 cris_npp 767 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1829 cris_npp 768 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1830 cris_npp 771 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1831 cris_npp 772 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1832 cris_npp 773 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1833 cris_npp 776 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1834 cris_npp 777 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1835 cris_npp 778 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1836 cris_npp 779 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1837 cris_npp 780 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1838 cris_npp 782 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1839 cris_npp 783 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1840 cris_npp 784 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1841 cris_npp 785 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1842 cris_npp 786 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1843 cris_npp 787 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1844 cris_npp 788 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1845 cris_npp 789 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1846 cris_npp 790 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1847 cris_npp 791 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1848 cris_npp 792 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1849 cris_npp 794 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1850 cris_npp 796 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1851 cris_npp 798 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1852 cris_npp 800 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1853 cris_npp 802 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1854 cris_npp 803 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1855 cris_npp 804 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1856 cris_npp 806 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1857 cris_npp 807 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1858 cris_npp 808 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1859 cris_npp 809 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1860 cris_npp 811 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1861 cris_npp 812 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1862 cris_npp 814 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1863 cris_npp 816 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1864 cris_npp 819 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1865 cris_npp 820 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1866 cris_npp 821 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1867 cris_npp 822 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1868 cris_npp 823 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1869 cris_npp 824 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1870 cris_npp 825 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1871 cris_npp 826 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1872 cris_npp 827 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1873 cris_npp 828 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1874 cris_npp 829 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1875 cris_npp 830 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1876 cris_npp 831 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1877 cris_npp 832 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1878 cris_npp 833 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1879 cris_npp 834 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1880 cris_npp 835 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1881 cris_npp 836 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1882 cris_npp 838 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1883 cris_npp 839 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1884 cris_npp 840 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1885 cris_npp 842 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1886 cris_npp 843 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1887 cris_npp 844 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1888 cris_npp 845 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1889 cris_npp 846 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1890 cris_npp 847 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1891 cris_npp 848 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1892 cris_npp 849 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1893 cris_npp 850 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1894 cris_npp 851 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1895 cris_npp 852 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1896 cris_npp 853 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1897 cris_npp 854 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1898 cris_npp 856 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1899 cris_npp 861 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1900 cris_npp 862 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1901 cris_npp 864 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1902 cris_npp 865 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1903 cris_npp 866 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1904 cris_npp 867 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1905 cris_npp 869 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1906 cris_npp 871 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1907 cris_npp 872 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1908 cris_npp 874 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1909 cris_npp 876 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1910 cris_npp 878 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1911 cris_npp 879 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1912 cris_npp 880 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1913 cris_npp 884 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1914 cris_npp 886 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1915 cris_npp 887 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1916 cris_npp 888 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1917 cris_npp 889 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1918 cris_npp 890 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1919 cris_npp 900 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1920 cris_npp 921 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1921 cris_npp 924 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1922 cris_npp 927 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1923 cris_npp 945 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1924 cris_npp 991 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1925 cris_npp 994 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1926 cris_npp 1007 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1927 cris_npp 1015 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1928 cris_npp 1030 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1929 cris_npp 1094 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1930 cris_npp 1106 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1931 cris_npp 1130 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1932 cris_npp 1132 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1933 cris_npp 1133 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1934 cris_npp 1135 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1935 cris_npp 1142 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1936 cris_npp 1147 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1937 cris_npp 1148 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1938 cris_npp 1149 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1939 cris_npp 1150 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1940 cris_npp 1151 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1941 cris_npp 1152 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1942 cris_npp 1153 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1943 cris_npp 1154 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1944 cris_npp 1155 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1945 cris_npp 1156 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1946 cris_npp 1157 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1947 cris_npp 1158 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1948 cris_npp 1159 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1949 cris_npp 1160 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1950 cris_npp 1161 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1951 cris_npp 1162 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1952 cris_npp 1163 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1953 cris_npp 1164 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1954 cris_npp 1165 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1955 cris_npp 1166 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1956 cris_npp 1167 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1957 cris_npp 1168 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1958 cris_npp 1169 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1959 cris_npp 1170 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1960 cris_npp 1171 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1961 cris_npp 1172 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1962 cris_npp 1173 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1963 cris_npp 1174 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1964 cris_npp 1175 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1965 cris_npp 1177 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1966 cris_npp 1178 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1967 cris_npp 1179 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1968 cris_npp 1180 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1969 cris_npp 1181 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1970 cris_npp 1187 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1971 cris_npp 1189 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1972 cris_npp 1190 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1973 cris_npp 1192 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1974 cris_npp 1193 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1975 cris_npp 1194 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1976 cris_npp 1196 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1977 cris_npp 1197 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1978 cris_npp 1198 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1979 cris_npp 1199 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1980 cris_npp 1200 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1981 cris_npp 1202 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1982 cris_npp 1203 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1983 cris_npp 1204 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1984 cris_npp 1206 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1985 cris_npp 1207 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1986 cris_npp 1208 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1987 cris_npp 1210 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1988 cris_npp 1212 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1989 cris_npp 1214 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1990 cris_npp 1215 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1991 cris_npp 1217 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1992 cris_npp 1218 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1993 cris_npp 1220 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1994 cris_npp 1222 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1995 cris_npp 1224 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1996 cris_npp 1226 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1997 cris_npp 1228 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1998 cris_npp 1229 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 1999 cris_npp 1231 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2000 cris_npp 1232 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2001 cris_npp 1234 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2002 cris_npp 1235 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2003 cris_npp 1236 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2004 cris_npp 1237 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2005 cris_npp 1238 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2006 cris_npp 1239 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2007 cris_npp 1241 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2008 cris_npp 1242 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2009 cris_npp 1243 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2010 cris_npp 1244 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2011 cris_npp 1245 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2012 cris_npp 1247 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2013 cris_npp 1250 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2014 cris_npp 1270 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2015 cris_npp 1271 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2016 cris_npp 1282 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2017 cris_npp 1285 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2018 cris_npp 1288 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2019 cris_npp 1290 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2020 cris_npp 1293 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2021 cris_npp 1298 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2022 cris_npp 1301 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2023 hirs4_metop-b 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2024 hirs4_metop-b 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2025 hirs4_metop-b 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2026 hirs4_metop-b 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2027 hirs4_metop-b 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2028 hirs4_metop-b 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2029 hirs4_metop-b 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2030 hirs4_metop-b 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2031 hirs4_metop-b 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2032 hirs4_metop-b 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2033 hirs4_metop-b 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2034 hirs4_metop-b 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2035 hirs4_metop-b 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2036 hirs4_metop-b 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2037 hirs4_metop-b 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2038 hirs4_metop-b 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2039 hirs4_metop-b 17 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2040 hirs4_metop-b 18 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2041 hirs4_metop-b 19 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2042 amsua_metop-b 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2043 amsua_metop-b 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2044 amsua_metop-b 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2045 amsua_metop-b 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2046 amsua_metop-b 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2047 amsua_metop-b 6 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2048 amsua_metop-b 7 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2049 amsua_metop-b 8 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2050 amsua_metop-b 9 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2051 amsua_metop-b 10 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2052 amsua_metop-b 11 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2053 amsua_metop-b 12 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2054 amsua_metop-b 13 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2055 amsua_metop-b 14 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2056 amsua_metop-b 15 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2057 mhs_metop-b 1 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2058 mhs_metop-b 2 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2059 mhs_metop-b 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2060 mhs_metop-b 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2061 mhs_metop-b 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2062 iasi_metop-b 16 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2063 iasi_metop-b 29 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2064 iasi_metop-b 32 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2065 iasi_metop-b 35 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2066 iasi_metop-b 38 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2067 iasi_metop-b 41 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2068 iasi_metop-b 44 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2069 iasi_metop-b 47 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2070 iasi_metop-b 49 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2071 iasi_metop-b 50 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2072 iasi_metop-b 51 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2073 iasi_metop-b 53 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2074 iasi_metop-b 55 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2075 iasi_metop-b 56 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2076 iasi_metop-b 57 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2077 iasi_metop-b 59 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2078 iasi_metop-b 61 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2079 iasi_metop-b 62 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2080 iasi_metop-b 63 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2081 iasi_metop-b 66 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2082 iasi_metop-b 68 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2083 iasi_metop-b 70 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2084 iasi_metop-b 72 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2085 iasi_metop-b 74 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2086 iasi_metop-b 76 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2087 iasi_metop-b 78 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2088 iasi_metop-b 79 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2089 iasi_metop-b 81 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2090 iasi_metop-b 82 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2091 iasi_metop-b 83 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2092 iasi_metop-b 84 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2093 iasi_metop-b 85 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2094 iasi_metop-b 86 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2095 iasi_metop-b 87 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2096 iasi_metop-b 89 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2097 iasi_metop-b 92 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2098 iasi_metop-b 93 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2099 iasi_metop-b 95 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2100 iasi_metop-b 97 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2101 iasi_metop-b 99 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2102 iasi_metop-b 101 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2103 iasi_metop-b 103 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2104 iasi_metop-b 104 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2105 iasi_metop-b 106 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2106 iasi_metop-b 109 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2107 iasi_metop-b 110 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2108 iasi_metop-b 111 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2109 iasi_metop-b 113 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2110 iasi_metop-b 116 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2111 iasi_metop-b 119 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2112 iasi_metop-b 122 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2113 iasi_metop-b 125 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2114 iasi_metop-b 128 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2115 iasi_metop-b 131 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2116 iasi_metop-b 133 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2117 iasi_metop-b 135 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2118 iasi_metop-b 138 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2119 iasi_metop-b 141 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2120 iasi_metop-b 144 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2121 iasi_metop-b 146 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2122 iasi_metop-b 148 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2123 iasi_metop-b 150 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2124 iasi_metop-b 151 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2125 iasi_metop-b 154 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2126 iasi_metop-b 157 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2127 iasi_metop-b 159 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2128 iasi_metop-b 160 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2129 iasi_metop-b 161 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2130 iasi_metop-b 163 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2131 iasi_metop-b 167 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2132 iasi_metop-b 170 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2133 iasi_metop-b 173 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2134 iasi_metop-b 176 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2135 iasi_metop-b 179 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2136 iasi_metop-b 180 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2137 iasi_metop-b 185 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2138 iasi_metop-b 187 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2139 iasi_metop-b 191 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2140 iasi_metop-b 193 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2141 iasi_metop-b 197 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2142 iasi_metop-b 199 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2143 iasi_metop-b 200 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2144 iasi_metop-b 202 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2145 iasi_metop-b 203 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2146 iasi_metop-b 205 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2147 iasi_metop-b 207 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2148 iasi_metop-b 210 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2149 iasi_metop-b 212 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2150 iasi_metop-b 213 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2151 iasi_metop-b 214 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2152 iasi_metop-b 217 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2153 iasi_metop-b 218 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2154 iasi_metop-b 219 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2155 iasi_metop-b 222 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2156 iasi_metop-b 224 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2157 iasi_metop-b 225 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2158 iasi_metop-b 226 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2159 iasi_metop-b 228 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2160 iasi_metop-b 230 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2161 iasi_metop-b 231 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2162 iasi_metop-b 232 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2163 iasi_metop-b 236 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2164 iasi_metop-b 237 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2165 iasi_metop-b 239 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2166 iasi_metop-b 243 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2167 iasi_metop-b 246 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2168 iasi_metop-b 249 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2169 iasi_metop-b 252 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2170 iasi_metop-b 254 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2171 iasi_metop-b 259 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2172 iasi_metop-b 260 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2173 iasi_metop-b 262 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2174 iasi_metop-b 265 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2175 iasi_metop-b 267 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2176 iasi_metop-b 269 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2177 iasi_metop-b 275 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2178 iasi_metop-b 279 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2179 iasi_metop-b 282 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2180 iasi_metop-b 285 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2181 iasi_metop-b 294 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2182 iasi_metop-b 296 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2183 iasi_metop-b 299 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2184 iasi_metop-b 300 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2185 iasi_metop-b 303 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2186 iasi_metop-b 306 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2187 iasi_metop-b 309 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2188 iasi_metop-b 313 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2189 iasi_metop-b 320 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2190 iasi_metop-b 323 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2191 iasi_metop-b 326 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2192 iasi_metop-b 327 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2193 iasi_metop-b 329 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2194 iasi_metop-b 332 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2195 iasi_metop-b 335 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2196 iasi_metop-b 345 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2197 iasi_metop-b 347 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2198 iasi_metop-b 350 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2199 iasi_metop-b 354 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2200 iasi_metop-b 356 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2201 iasi_metop-b 360 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2202 iasi_metop-b 363 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2203 iasi_metop-b 366 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2204 iasi_metop-b 371 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2205 iasi_metop-b 372 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2206 iasi_metop-b 373 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2207 iasi_metop-b 375 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2208 iasi_metop-b 377 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2209 iasi_metop-b 379 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2210 iasi_metop-b 381 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2211 iasi_metop-b 383 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2212 iasi_metop-b 386 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2213 iasi_metop-b 389 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2214 iasi_metop-b 398 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2215 iasi_metop-b 401 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2216 iasi_metop-b 404 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2217 iasi_metop-b 405 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2218 iasi_metop-b 407 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2219 iasi_metop-b 408 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2220 iasi_metop-b 410 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2221 iasi_metop-b 411 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2222 iasi_metop-b 414 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2223 iasi_metop-b 416 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2224 iasi_metop-b 418 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2225 iasi_metop-b 423 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2226 iasi_metop-b 426 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2227 iasi_metop-b 428 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2228 iasi_metop-b 432 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2229 iasi_metop-b 433 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2230 iasi_metop-b 434 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2231 iasi_metop-b 439 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2232 iasi_metop-b 442 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2233 iasi_metop-b 445 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2234 iasi_metop-b 450 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2235 iasi_metop-b 457 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2236 iasi_metop-b 459 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2237 iasi_metop-b 472 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2238 iasi_metop-b 477 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2239 iasi_metop-b 483 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2240 iasi_metop-b 509 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2241 iasi_metop-b 515 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2242 iasi_metop-b 546 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2243 iasi_metop-b 552 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2244 iasi_metop-b 559 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2245 iasi_metop-b 566 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2246 iasi_metop-b 571 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2247 iasi_metop-b 573 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2248 iasi_metop-b 578 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2249 iasi_metop-b 584 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2250 iasi_metop-b 594 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2251 iasi_metop-b 625 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2252 iasi_metop-b 646 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2253 iasi_metop-b 662 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2254 iasi_metop-b 668 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2255 iasi_metop-b 705 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2256 iasi_metop-b 739 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2257 iasi_metop-b 756 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2258 iasi_metop-b 797 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2259 iasi_metop-b 867 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2260 iasi_metop-b 906 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2261 iasi_metop-b 921 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2262 iasi_metop-b 1027 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2263 iasi_metop-b 1046 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2264 iasi_metop-b 1090 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2265 iasi_metop-b 1098 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2266 iasi_metop-b 1121 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2267 iasi_metop-b 1133 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2268 iasi_metop-b 1173 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2269 iasi_metop-b 1191 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2270 iasi_metop-b 1194 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2271 iasi_metop-b 1222 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2272 iasi_metop-b 1271 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2273 iasi_metop-b 1283 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2274 iasi_metop-b 1338 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2275 iasi_metop-b 1409 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2276 iasi_metop-b 1414 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2277 iasi_metop-b 1420 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2278 iasi_metop-b 1424 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2279 iasi_metop-b 1427 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2280 iasi_metop-b 1430 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2281 iasi_metop-b 1434 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2282 iasi_metop-b 1440 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2283 iasi_metop-b 1442 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2284 iasi_metop-b 1445 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2285 iasi_metop-b 1450 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2286 iasi_metop-b 1454 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2287 iasi_metop-b 1460 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2288 iasi_metop-b 1463 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2289 iasi_metop-b 1469 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2290 iasi_metop-b 1474 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2291 iasi_metop-b 1479 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2292 iasi_metop-b 1483 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2293 iasi_metop-b 1487 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2294 iasi_metop-b 1494 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2295 iasi_metop-b 1496 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2296 iasi_metop-b 1502 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2297 iasi_metop-b 1505 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2298 iasi_metop-b 1509 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2299 iasi_metop-b 1510 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2300 iasi_metop-b 1513 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2301 iasi_metop-b 1518 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2302 iasi_metop-b 1521 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2303 iasi_metop-b 1526 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2304 iasi_metop-b 1529 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2305 iasi_metop-b 1532 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2306 iasi_metop-b 1536 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2307 iasi_metop-b 1537 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2308 iasi_metop-b 1541 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2309 iasi_metop-b 1545 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2310 iasi_metop-b 1548 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2311 iasi_metop-b 1553 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2312 iasi_metop-b 1560 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2313 iasi_metop-b 1568 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2314 iasi_metop-b 1574 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2315 iasi_metop-b 1579 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2316 iasi_metop-b 1583 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2317 iasi_metop-b 1585 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2318 iasi_metop-b 1587 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2319 iasi_metop-b 1606 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2320 iasi_metop-b 1626 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2321 iasi_metop-b 1639 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2322 iasi_metop-b 1643 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2323 iasi_metop-b 1652 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2324 iasi_metop-b 1658 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2325 iasi_metop-b 1659 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2326 iasi_metop-b 1666 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2327 iasi_metop-b 1671 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2328 iasi_metop-b 1675 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2329 iasi_metop-b 1681 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2330 iasi_metop-b 1694 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2331 iasi_metop-b 1697 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2332 iasi_metop-b 1710 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2333 iasi_metop-b 1786 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2334 iasi_metop-b 1791 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2335 iasi_metop-b 1805 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2336 iasi_metop-b 1839 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2337 iasi_metop-b 1884 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2338 iasi_metop-b 1913 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2339 iasi_metop-b 1946 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2340 iasi_metop-b 1947 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2341 iasi_metop-b 1991 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2342 iasi_metop-b 2019 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2343 iasi_metop-b 2094 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2344 iasi_metop-b 2119 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2345 iasi_metop-b 2213 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2346 iasi_metop-b 2239 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2347 iasi_metop-b 2271 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2348 iasi_metop-b 2289 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2349 iasi_metop-b 2321 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2350 iasi_metop-b 2333 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2351 iasi_metop-b 2346 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2352 iasi_metop-b 2349 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2353 iasi_metop-b 2352 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2354 iasi_metop-b 2359 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2355 iasi_metop-b 2367 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2356 iasi_metop-b 2374 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2357 iasi_metop-b 2398 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2358 iasi_metop-b 2426 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2359 iasi_metop-b 2562 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2360 iasi_metop-b 2701 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2361 iasi_metop-b 2741 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2362 iasi_metop-b 2745 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2363 iasi_metop-b 2760 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2364 iasi_metop-b 2819 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2365 iasi_metop-b 2889 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2366 iasi_metop-b 2907 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2367 iasi_metop-b 2910 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2368 iasi_metop-b 2919 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2369 iasi_metop-b 2921 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2370 iasi_metop-b 2939 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2371 iasi_metop-b 2944 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2372 iasi_metop-b 2945 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2373 iasi_metop-b 2948 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2374 iasi_metop-b 2951 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2375 iasi_metop-b 2958 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2376 iasi_metop-b 2971 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2377 iasi_metop-b 2977 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2378 iasi_metop-b 2985 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2379 iasi_metop-b 2988 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2380 iasi_metop-b 2990 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2381 iasi_metop-b 2991 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2382 iasi_metop-b 2993 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2383 iasi_metop-b 3002 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2384 iasi_metop-b 3008 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2385 iasi_metop-b 3014 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2386 iasi_metop-b 3027 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2387 iasi_metop-b 3029 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2388 iasi_metop-b 3030 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2389 iasi_metop-b 3036 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2390 iasi_metop-b 3047 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2391 iasi_metop-b 3049 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2392 iasi_metop-b 3052 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2393 iasi_metop-b 3053 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2394 iasi_metop-b 3055 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2395 iasi_metop-b 3058 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2396 iasi_metop-b 3064 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2397 iasi_metop-b 3069 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2398 iasi_metop-b 3087 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2399 iasi_metop-b 3093 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2400 iasi_metop-b 3098 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2401 iasi_metop-b 3105 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2402 iasi_metop-b 3107 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2403 iasi_metop-b 3110 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2404 iasi_metop-b 3116 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2405 iasi_metop-b 3127 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2406 iasi_metop-b 3129 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2407 iasi_metop-b 3136 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2408 iasi_metop-b 3146 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2409 iasi_metop-b 3151 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2410 iasi_metop-b 3160 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2411 iasi_metop-b 3165 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2412 iasi_metop-b 3168 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2413 iasi_metop-b 3175 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2414 iasi_metop-b 3178 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2415 iasi_metop-b 3189 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2416 iasi_metop-b 3207 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2417 iasi_metop-b 3228 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2418 iasi_metop-b 3244 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2419 iasi_metop-b 3248 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2420 iasi_metop-b 3252 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2421 iasi_metop-b 3256 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2422 iasi_metop-b 3263 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2423 iasi_metop-b 3281 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2424 iasi_metop-b 3295 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2425 iasi_metop-b 3303 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2426 iasi_metop-b 3309 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2427 iasi_metop-b 3312 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2428 iasi_metop-b 3322 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2429 iasi_metop-b 3326 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2430 iasi_metop-b 3354 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2431 iasi_metop-b 3366 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2432 iasi_metop-b 3375 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2433 iasi_metop-b 3378 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2434 iasi_metop-b 3411 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2435 iasi_metop-b 3416 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2436 iasi_metop-b 3432 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2437 iasi_metop-b 3438 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2438 iasi_metop-b 3440 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2439 iasi_metop-b 3442 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2440 iasi_metop-b 3444 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2441 iasi_metop-b 3446 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2442 iasi_metop-b 3448 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2443 iasi_metop-b 3450 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2444 iasi_metop-b 3452 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2445 iasi_metop-b 3454 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2446 iasi_metop-b 3458 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2447 iasi_metop-b 3467 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2448 iasi_metop-b 3476 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2449 iasi_metop-b 3484 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2450 iasi_metop-b 3491 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2451 iasi_metop-b 3497 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2452 iasi_metop-b 3499 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2453 iasi_metop-b 3504 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2454 iasi_metop-b 3506 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2455 iasi_metop-b 3509 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2456 iasi_metop-b 3518 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2457 iasi_metop-b 3527 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2458 iasi_metop-b 3555 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2459 iasi_metop-b 3575 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2460 iasi_metop-b 3577 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2461 iasi_metop-b 3580 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2462 iasi_metop-b 3582 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2463 iasi_metop-b 3586 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2464 iasi_metop-b 3589 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2465 iasi_metop-b 3599 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2466 iasi_metop-b 3610 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2467 iasi_metop-b 3626 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2468 iasi_metop-b 3638 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2469 iasi_metop-b 3646 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2470 iasi_metop-b 3653 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2471 iasi_metop-b 3658 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2472 iasi_metop-b 3661 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2473 iasi_metop-b 3673 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2474 iasi_metop-b 3689 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2475 iasi_metop-b 3700 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2476 iasi_metop-b 3710 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2477 iasi_metop-b 3726 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2478 iasi_metop-b 3763 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2479 iasi_metop-b 3814 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2480 iasi_metop-b 3841 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2481 iasi_metop-b 3888 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2482 iasi_metop-b 4032 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2483 iasi_metop-b 4059 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2484 iasi_metop-b 4068 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2485 iasi_metop-b 4082 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2486 iasi_metop-b 4095 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2487 iasi_metop-b 4160 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2488 iasi_metop-b 4234 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2489 iasi_metop-b 4257 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2490 iasi_metop-b 4411 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2491 iasi_metop-b 4498 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2492 iasi_metop-b 4520 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2493 iasi_metop-b 4552 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2494 iasi_metop-b 4567 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2495 iasi_metop-b 4608 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2496 iasi_metop-b 4646 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2497 iasi_metop-b 4698 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2498 iasi_metop-b 4808 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2499 iasi_metop-b 4849 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2500 iasi_metop-b 4920 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2501 iasi_metop-b 4939 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2502 iasi_metop-b 4947 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2503 iasi_metop-b 4967 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2504 iasi_metop-b 4991 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2505 iasi_metop-b 4996 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2506 iasi_metop-b 5015 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2507 iasi_metop-b 5028 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2508 iasi_metop-b 5056 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2509 iasi_metop-b 5128 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2510 iasi_metop-b 5130 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2511 iasi_metop-b 5144 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2512 iasi_metop-b 5170 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2513 iasi_metop-b 5178 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2514 iasi_metop-b 5183 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2515 iasi_metop-b 5188 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2516 iasi_metop-b 5191 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2517 iasi_metop-b 5368 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2518 iasi_metop-b 5371 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2519 iasi_metop-b 5379 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2520 iasi_metop-b 5381 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2521 iasi_metop-b 5383 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2522 iasi_metop-b 5397 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2523 iasi_metop-b 5399 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2524 iasi_metop-b 5401 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2525 iasi_metop-b 5403 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2526 iasi_metop-b 5405 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2527 iasi_metop-b 5446 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2528 iasi_metop-b 5455 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2529 iasi_metop-b 5472 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2530 iasi_metop-b 5480 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2531 iasi_metop-b 5483 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2532 iasi_metop-b 5485 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2533 iasi_metop-b 5492 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2534 iasi_metop-b 5497 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2535 iasi_metop-b 5502 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2536 iasi_metop-b 5507 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2537 iasi_metop-b 5509 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2538 iasi_metop-b 5517 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2539 iasi_metop-b 5528 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2540 iasi_metop-b 5558 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2541 iasi_metop-b 5697 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2542 iasi_metop-b 5714 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2543 iasi_metop-b 5749 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2544 iasi_metop-b 5766 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2545 iasi_metop-b 5785 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2546 iasi_metop-b 5798 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2547 iasi_metop-b 5799 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2548 iasi_metop-b 5801 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2549 iasi_metop-b 5817 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2550 iasi_metop-b 5833 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2551 iasi_metop-b 5834 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2552 iasi_metop-b 5836 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2553 iasi_metop-b 5849 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2554 iasi_metop-b 5851 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2555 iasi_metop-b 5852 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2556 iasi_metop-b 5865 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2557 iasi_metop-b 5869 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2558 iasi_metop-b 5881 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2559 iasi_metop-b 5884 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2560 iasi_metop-b 5897 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2561 iasi_metop-b 5900 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2562 iasi_metop-b 5916 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2563 iasi_metop-b 5932 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2564 iasi_metop-b 5948 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2565 iasi_metop-b 5963 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2566 iasi_metop-b 5968 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2567 iasi_metop-b 5978 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2568 iasi_metop-b 5988 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2569 iasi_metop-b 5992 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2570 iasi_metop-b 5994 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2571 iasi_metop-b 5997 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2572 iasi_metop-b 6003 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2573 iasi_metop-b 6008 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2574 iasi_metop-b 6023 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2575 iasi_metop-b 6026 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2576 iasi_metop-b 6039 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2577 iasi_metop-b 6053 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2578 iasi_metop-b 6056 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2579 iasi_metop-b 6067 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2580 iasi_metop-b 6071 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2581 iasi_metop-b 6082 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2582 iasi_metop-b 6085 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2583 iasi_metop-b 6098 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2584 iasi_metop-b 6112 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2585 iasi_metop-b 6126 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2586 iasi_metop-b 6135 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2587 iasi_metop-b 6140 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2588 iasi_metop-b 6149 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2589 iasi_metop-b 6154 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2590 iasi_metop-b 6158 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2591 iasi_metop-b 6161 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2592 iasi_metop-b 6168 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2593 iasi_metop-b 6174 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2594 iasi_metop-b 6182 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2595 iasi_metop-b 6187 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2596 iasi_metop-b 6205 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2597 iasi_metop-b 6209 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2598 iasi_metop-b 6213 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2599 iasi_metop-b 6317 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2600 iasi_metop-b 6339 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2601 iasi_metop-b 6342 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2602 iasi_metop-b 6366 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2603 iasi_metop-b 6381 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2604 iasi_metop-b 6391 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2605 iasi_metop-b 6489 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2606 iasi_metop-b 6962 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2607 iasi_metop-b 6966 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2608 iasi_metop-b 6970 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2609 iasi_metop-b 6975 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2610 iasi_metop-b 6977 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2611 iasi_metop-b 6982 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2612 iasi_metop-b 6985 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2613 iasi_metop-b 6987 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2614 iasi_metop-b 6989 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2615 iasi_metop-b 6991 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2616 iasi_metop-b 6993 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2617 iasi_metop-b 6995 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2618 iasi_metop-b 6997 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2619 iasi_metop-b 6999 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2620 iasi_metop-b 7000 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2621 iasi_metop-b 7004 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2622 iasi_metop-b 7008 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2623 iasi_metop-b 7013 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2624 iasi_metop-b 7016 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2625 iasi_metop-b 7021 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2626 iasi_metop-b 7024 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2627 iasi_metop-b 7027 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2628 iasi_metop-b 7029 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2629 iasi_metop-b 7032 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2630 iasi_metop-b 7038 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2631 iasi_metop-b 7043 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2632 iasi_metop-b 7046 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2633 iasi_metop-b 7049 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2634 iasi_metop-b 7069 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2635 iasi_metop-b 7072 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2636 iasi_metop-b 7076 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2637 iasi_metop-b 7081 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2638 iasi_metop-b 7084 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2639 iasi_metop-b 7089 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2640 iasi_metop-b 7099 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2641 iasi_metop-b 7209 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2642 iasi_metop-b 7222 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2643 iasi_metop-b 7231 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2644 iasi_metop-b 7235 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2645 iasi_metop-b 7247 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2646 iasi_metop-b 7267 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2647 iasi_metop-b 7269 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2648 iasi_metop-b 7284 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2649 iasi_metop-b 7389 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2650 iasi_metop-b 7419 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2651 iasi_metop-b 7423 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2652 iasi_metop-b 7424 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2653 iasi_metop-b 7426 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2654 iasi_metop-b 7428 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2655 iasi_metop-b 7431 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2656 iasi_metop-b 7436 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2657 iasi_metop-b 7444 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2658 iasi_metop-b 7475 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2659 iasi_metop-b 7549 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2660 iasi_metop-b 7584 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2661 iasi_metop-b 7665 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2662 iasi_metop-b 7666 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2663 iasi_metop-b 7831 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2664 iasi_metop-b 7836 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2665 iasi_metop-b 7853 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2666 iasi_metop-b 7865 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2667 iasi_metop-b 7885 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2668 iasi_metop-b 7888 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2669 iasi_metop-b 7912 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2670 iasi_metop-b 7950 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2671 iasi_metop-b 7972 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2672 iasi_metop-b 7980 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2673 iasi_metop-b 7995 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2674 iasi_metop-b 8007 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2675 iasi_metop-b 8015 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2676 iasi_metop-b 8055 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2677 iasi_metop-b 8078 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2078 avhrr3_metop-b 3 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2079 avhrr3_metop-b 4 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + + 2680 avhrr3_metop-b 5 0.000000E+00 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 + diff --git a/parm/analysis/gsi/obs-preproc.input.tmp b/parm/analysis/gsi/obs-preproc.input.tmp new file mode 100644 index 000000000..e790ecd1c --- /dev/null +++ b/parm/analysis/gsi/obs-preproc.input.tmp @@ -0,0 +1,39 @@ +&share +analdate = "_analdate_" !"YYYY-MM-DD_HH:00:00" +datapath = "./" +debug = T +is_fcst_model = T +/ +&bufrio +bufr_filepath = "synobs_vr.prepbufr" +bufr_info_filepath = "bufrinfo.json" +bufr_tblpath = "prepobs_prep.bufrtable" +mask_land = T +mask_ocean = F +/ +&fcst_mdl +fv3_dyns_filename = "fv3_dynvars" +fv3_gridspec_filename = "fv3_grid_spec" +fv3_orog_filename = "fv3_oro_data" +fv3_static_filename = "fv3_atmos_static" +fv3_tracer_filename = "fv3_tracer" +grid_ratio = _grid_ratio_ +is_fv3 = T +is_regional = T +is_rotate_winds = T +sample_radius = 9000.0 +sample_nindex = 1 +/ +&recon +/ +&sonde +tempdrop_normalize = F +tempdrop_write_nc_skewt = T +/ +&tc +is_relocate = T +tc_radius = 600000.0 +tcinfo_filename = "synobs_vr.info" +/ +&wmm +/ diff --git a/parm/analysis/gsi/prepobs_prep.bufrtable b/parm/analysis/gsi/prepobs_prep.bufrtable new file mode 100644 index 000000000..32d08bcf5 --- /dev/null +++ b/parm/analysis/gsi/prepobs_prep.bufrtable @@ -0,0 +1,1071 @@ +.------------------------------------------------------------------------------. +| ------------ USER DEFINITIONS FOR TABLE-A TABLE-B TABLE D -------------- | +|------------------------------------------------------------------------------| +| MNEMONIC | NUMBER | DESCRIPTION | +|----------|--------|----------------------------------------------------------| +* | +* | +* THE FOLLOWING ARE TABLE A ENTRIES FOR PREPBUFR MESSAGE TYPES | +* | +| ADPUPA | A48102 | UPPER-AIR (RAOB, PIBAL, RECCO, DROPS) REPORTS | +| AIRCAR | A48103 | MDCRS ACARS AIRCRAFT REPORTS | +| AIRCFT | A48104 | AIREP/PIREP,AMDAR(ASDAR/ACARS), E-ADAS(AMDAR BUFR) ACFT | +| SATWND | A48105 | SATELLITE-DERIVED WIND REPORTS | +| PROFLR | A48106 | WIND PROFILER REPORTS | +| VADWND | A48107 | VAD (NEXRAD) WIND REPORTS | +| SATEMP | A48108 | TOVS SATELLITE DATA (SOUNDINGS, RETRIEVALS, RADIANCES) | +| ADPSFC | A48109 | SURFACE LAND (SYNOPTIC, METAR) REPORTS | +| SFCSHP | A48110 | SURFACE MARINE (SHIP, BUOY, C-MAN PLATFORM) REPORTS | +| SFCBOG | A48111 | MEAN SEA-LEVEL PRESSURE BOGUS REPORTS | +| SPSSMI | A48112 | SSM/I RETRIEVAL PRODUCTS (REPROCESSED WIND SPEED, TPW) | +| SYNDAT | A48113 | SYNTHETIC TROPICAL CYCLONE BOGUS REPORTS | +| ERS1DA | A48114 | ERS SCATTEROMETER DATA (REPROCESSED WIND SPEED) | +| GOESND | A48115 | GOES SATELLITE DATA (SOUNDINGS, RETRIEVALS, RADIANCES) | +| QKSWND | A48116 | QUIKSCAT SCATTEROMETER DATA (REPROCESSED) | +| MSONET | A48117 | MESONET SURFACE REPORTS (COOPERATIVE NETWORKS) | +| GPSIPW | A48118 | GLOBAL POSITIONING SATELLITE-INTEGRATED PRECIP. WATER | +| RASSDA | A48119 | RADIO ACOUSTIC SOUNDING SYSTEM (RASS) TEMP PROFILE RPTS | +| WDSATR | A48120 | WINDSAT SCATTEROMETER DATA (REPROCESSED) | +| ASCATW | A48121 | ASCAT SCATTEROMETER DATA (REPROCESSED) | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR SEQUENCES DEFINED IN TABLE A ENTRIES | +* | +| HEADR | 348001 | REPORT HEADER SEQUENCE | +| PRSLEVEL | 348002 | PRESSURE LEVEL SEQUENCE (ALL TYPES EXCEPT GOESND) | +| PMSL_SEQ | 348003 | MEAN SEA LEVEL PRESSURE SEQUENCE | +| BTMPLEVL | 348004 | BRIGHTNESS TEMPERATURE "LEVEL" SEQUENCE | +| ALTIMSEQ | 348005 | ALTIMETER SETTING SEQUENCE | +| TURB1SEQ | 348006 | TURBULENCE SEQUENCE # 1 | +| TURB2SEQ | 348007 | TURBULENCE SEQUENCE # 2 | +| ACFT_SEQ | 348008 | AIRCRAFT SUPPLEMENTARY DATA SEQUENCE | +| PCCF_SEQ | 348009 | SATELLITE WIND PERCENT CONFIDENCE SEQUENCE | +| WSPD_SEQ | 348010 | WIND SPEED SEQUENCE | +| PRSLEVLG | 348011 | GOESND PRESSURE LEVEL SEQUENCE | +| TOPC_SEQ | 348012 | TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT SEQUENCE | +| PREWXSEQ | 348013 | PRESENT WEATHER SEQUENCE | +| CLOUDSEQ | 348014 | OBSERVED CLOUD SEQUENCE # 1 | +| HOCT_SEQ | 348015 | HEIGHT OF TOP OF CLOUD SEQUENCE | +| TMXMNSEQ | 348016 | MAXIMUM/MINIMUM TEMPERATURE SEQUENCE | +| SWELLSEQ | 348017 | SWELL WAVE SEQUENCE | +| DBSS_SEQ | 348018 | DEPTH BELOW SEA SURFACE SEQUENCE | +| VISB1SEQ | 348019 | VISIBILITY SEQUENCE # 1 | +| VISB2SEQ | 348020 | VISIBILITY SEQUENCE # 2 | +| VTVI_SEQ | 348021 | VERTICAL VISIBILITY SEQUENCE | +| PSTWXSEQ | 348022 | PAST WEATHER SEQUENCE | +| PKWNDSEQ | 348023 | PEAK WIND SEQUENCE | +| GUST1SEQ | 348024 | MAXIMUM WIND GUST SEQUENCE # 1 | +| GUST2SEQ | 348025 | MAXIMUM WIND GUST SEQUENCE # 2 | +| TPRECSEQ | 348026 | TOTAL PRECIPITATION SEQUENCE | +| TP12_SEQ | 348027 | TOTAL PRECIPITATION PAST 12 HOURS SEQUENCE | +| SUNSHSEQ | 348028 | TOTAL SUNSHINE SEQUENCE | +| CLOU2SEQ | 348029 | OBSERVED CLOUD SEQUENCE # 2 | +| XWSPDSEQ | 348030 | EXTRAPOLATED WIND SPEED SEQUENCE | +| SWINDSEQ | 348031 | SURFACE WIND SEQUENCE | +| SNOW_SEQ | 348032 | SNOW DEPTH SEQUENCE | +| WAVE_SEQ | 348033 | WAVE SEQUENCE | +| SHIP_SEQ | 348034 | SHIP DIRECTION/SPEED SEQUENCE | +| PTENDSEQ | 348035 | PRESSURE TENDENCY SEQUENCE | +| PTE24SEQ | 348036 | 24 HOUR PRESSURE TENDENCY SEQUENCE | +| ACID_SEQ | 348037 | AIRCRAFT FLIGHT NUMBER SEQUENCE | +| AFIC_SEQ | 348038 | AIRCRAFT ICING SEQUENCE | +| TURB3SEQ | 348039 | TURBULENCE SEQUENCE # 3 | +| PRSLEVLA | 348040 | AIRCRAFT (AIRCFT/AIRCAR) PRESSURE LEVEL SEQUENCE | +| NRLQMSEQ | 348041 | NRL AIRCRAFT QUALITY MARK SEQUENCE | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR SEQUENCES IN REPORT HEADER | +* | +| RSRD_SEQ | 348081 | RESTRICTIONS ON REDISTRIBUTION SEQUENCE | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR DATA "INFORMATION" SEQUENCES | +* | +| P___INFO | 348141 | PRESSURE INFORMATION | +| Q___INFO | 348142 | SPECIFIC HUMIDITY INFORMATION | +| T___INFO | 348143 | TEMPERATURE INFORMATION | +| Z___INFO | 348144 | HEIGHT INFORMATION | +| W___INFO | 348145 | WIND INFORMATION | +| PW__INFO | 348146 | PRECIPITABLE WATER INFORMATION | +| PWT_INFO | 348147 | TOTAL PRECIPITABLE WATER INFORMATION | +| PWL_INFO | 348148 | LAYER PRECIPITABLE WATER INFORMATION | +| PW1_INFO | 348149 | 1.0 TO 0.9 SIGMA LAYER PRECIPITABLE WATER INFORMATION | +| PW2_INFO | 348150 | 0.9 TO 0.7 SIGMA LAYER PRECIPITABLE WATER INFORMATION | +| PW3_INFO | 348151 | 0.7 TO 0.3 SIGMA LAYER PRECIPITABLE WATER INFORMATION | +| PW4_INFO | 348152 | 0.3 TO 0.0 SIGMA LAYER PRECIPITABLE WATER INFORMATION | +| BTMPINFO | 348153 | TOVS OR GOES BRIGHTNESS TEMPERATURE INFORMATION | +| SCATINFO | 348154 | SCATTEROMETER DATA INFORMATION | +| DRFTINFO | 348155 | PROFILE LEVEL TIME/LOCATION INFORMATION | +| RRT_INFO | 348156 | RAIN RATE INFORMATION | +| CTP_INFO | 348157 | CLOUD TOP INFORMATION | +| SST_INFO | 348158 | SEA TEMPERATURE INFORMATION | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR DATA "EVENT" SEQUENCES | +* | +| P__EVENT | 348171 | PRESSURE EVENT SEQUENCE | +| Q__EVENT | 348172 | SPECIFIC HUMIDITY EVENT SEQUENCE | +| T__EVENT | 348173 | TEMPERATURE EVENT SEQUENCE | +| Z__EVENT | 348174 | HEIGHT EVENT SEQUENCE | +| W__EVENT | 348175 | WIND EVENT SEQUENCE | +| DF_EVENT | 348176 | WIND (DIRECTION/SPEED) EVENT SEQUENCE | +| PWTEVENT | 348177 | TOTAL PRECIPITABLE WATER EVENT SEQUENCE | +| PW1EVENT | 348178 | 1.0 TO 0.9 PRECIPITABLE WATER EVENT SEQUENCE | +| PW2EVENT | 348179 | 0.9 TO 0.7 PRECIPITABLE WATER EVENT SEQUENCE | +| PW3EVENT | 348180 | 0.7 TO 0.3 PRECIPITABLE WATER EVENT SEQUENCE | +| PW4EVENT | 348181 | 0.3 TO 0.0 PRECIPITABLE WATER EVENT SEQUENCE | +| RRTEVENT | 348182 | RATE RATE EVENT SEQUENCE | +| CTPEVENT | 348183 | CLOUD TOP PRESSURE EVENT SEQUENCE | +| SSTEVENT | 348184 | SEA TEMPERATURE EVENT SEQUENCE | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR DATA "BACKGROUND" SEQUENCES | +* | +| P__BACKG | 348191 | PRESSURE BACKGROUND SEQUENCE | +| Q__BACKG | 348192 | SPECIFIC HUMIDITY BACKGROUND SEQUENCE | +| T__BACKG | 348193 | TEMPERATURE BACKGROUND SEQUENCE | +| Z__BACKG | 348194 | HEIGHT BACKGROUND SEQUENCE | +| W__BACKG | 348195 | WIND BACKGROUND SEQUENCE | +| PWTBACKG | 348196 | TOTAL PRECIPITABLE WATER BACKGROUND SEQUENCE | +| PW1BACKG | 348197 | 1.0 TO 0.9 SIGMA LAYER PRECIP WATER BACKGROUND SEQUENCE | +| PW2BACKG | 348198 | 0.9 TO 0.7 SIGMA LAYER PRECIP WATER BACKGROUND SEQUENCE | +| PW3BACKG | 348199 | 0.7 TO 0.3 SIGMA LAYER PRECIP WATER BACKGROUND SEQUENCE | +| PW4BACKG | 348200 | 0.3 TO 0.0 SIGMA LAYER PRECIP WATER BACKGROUND SEQUENCE | +| RRTBACKG | 348201 | RAIN RATE BACKGROUND SEQUENCE | +| CTPBACKG | 348202 | CLOUD TOP PRESSURE BACKGROUND SEQUENCE | +| SSTBACKG | 348203 | SEA TEMPERATURE BACKGROUND SEQUENCE | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR DATA "POSTPROCESSING" SEQUENCES | +* | +| P__POSTP | 348211 | PRESSURE POSTPROCESSING SEQUENCE | +| Q__POSTP | 348212 | SPECIFIC HUMIDITY POSTPROCESSING SEQUENCE | +| T__POSTP | 348213 | TEMPERATURE POSTPROCESSING SEQUENCE | +| Z__POSTP | 348214 | HEIGHT POSTPROCESSING SEQUENCE | +| W__POSTP | 348215 | WIND POSTPROCESSING SEQUENCE | +| PWTPOSTP | 348216 | TOTAL PRECIPITABLE WATER POSTPROCESSING SEQUENCE | +| PW1POSTP | 348217 | 1.0 TO 0.9 SIGMA LAYER PRECIP WATER POSTPROCESSING SEQ. | +| PW2POSTP | 348218 | 0.9 TO 0.7 SIGMA LAYER PRECIP WATER POSTPROCESSING SEQ. | +| PW3POSTP | 348219 | 0.7 TO 0.3 SIGMA LAYER PRECIP WATER POSTPROCESSING SEQ. | +| PW4POSTP | 348220 | 0.3 TO 0.0 SIGMA LAYER PRECIP WATER POSTPROCESSING SEQ. | +| RRTPOSTP | 348221 | RAIN RATE POSTPROCESSING SEQUENCE | +| CTPPOSTP | 348222 | CLOUD TOP PRESSURE POSTPROCESSING SEQUENCE | +| SSTPOSTP | 348223 | SEA TEMPERATURE POSTPROCESSING SEQUENCE | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR DATA "CLIMATOLOGY" SEQUENCES | +* | +| PCLIMATO | 348231 | PRESSURE CLIMATOLOGY SEQUENCE | +| QCLIMATO | 348232 | SPECIFIC HUMIDITY CLIMATOLOGY SEQUENCE | +| TCLIMATO | 348233 | TEMPERATURE CLIMATOLOGY SEQUENCE | +| ZCLIMATO | 348234 | HEIGHT CLIMATOLOGY SEQUENCE | +| WCLIMATO | 348235 | WIND CLIMATOLOGY SEQUENCE | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR TEMPRY CURRENT MODEL GUESS SEQUENCES | +* | +| PFC__MSQ | 348241 | MODEL PRESSURE FORECAST SEQUENCE | +| QFC__MSQ | 348242 | MODEL SPECIFIC HUMIDITY FORECAST SEQUENCE | +| TFC__MSQ | 348243 | MODEL TEMPERATURE FORECAST SEQUENCE | +| ZFC__MSQ | 348244 | MODEL HEIGHT FORECAST SEQUENCE | +| WFC__MSQ | 348245 | MODEL WIND FORECAST SEQUENCE | +| PWF__MSQ | 348246 | MODEL TOTAL PRECIPITABLE WATER FORECAST SEQUENCE | +| PW1F_MSQ | 348247 | MODEL 1.0 TO 0.9 SIGMA LAYER PRECIP WATER FORECAST SEQ. | +| PW2F_MSQ | 348248 | MODEL 0.9 TO 0.7 SIGMA LAYER PRECIP WATER FORECAST SEQ. | +| PW3F_MSQ | 348249 | MODEL 0.7 TO 0.3 SIGMA LAYER PRECIP WATER FORECAST SEQ. | +| PW4F_MSQ | 348250 | MODEL 0.3 TO 0.0 SIGMA LAYER PRECIP WATER FORECAST SEQ. | +* | +* | +* THE FOLLOWING ARE TABLE D ENTRIES FOR EVENTS CODES FOR THE VARIOUS | +* PREPBUFR PROCESSING "STEPS" (PROGRAMS OR SUBROUTINES WITHIN PROGRAMS) | +* THE LAST THREE DIGITS OF THE DESCRIPTOR NUMBER BECOMES THE "PROGRAM CODE" | +* | +| PREPRO | 363001 | INITIAL PREPBUFR PROCESSING STEP | +* | | (PREPDATA PROGRAM, PRIOR TO PREVENTS PROGRAM OR VTPEVN | +* SUBR. IN SUBR. GBLEVENTS) | +| SYNDATA | 363002 | SYNTHETIC TROPICAL CYCLONE BOGUS PROCESSING STEP | +* | | (SYNDATA PROGRAM, PRIOR TO PREVENTS PROGRAM OR VTPEVN | +* SUBR. IN SUBR. GBLEVENTS) | +| CLIMO | 363003 | CLIMOTOLOGICAL PROCESSING STEP | +* (NOT YET AVAILABLE) | +| PREVENT | 363004 | PRE-EVENTS BACKGROUND/OBSERVATION ERROR PROCESSING STEP | +* | | (PREVENTS PROGRAM OR GBLEVENTS SUBROUTINE IN PREPDATA | +* OR SYNDATA PROGRAM) | +| CQCHT | 363005 | RAWINSONDE HEIGHT/TEMP COMPLEX QUALITY CONTROL STEP | +* | | (CQCBUFR PROGRAM) | +| RADCOR | 363006 | RAWINSONDE HEIGHT/TEMP INTERSONDE(RADIATION) CORR. STEP | +* | | (RADEVN SUBROUTINE IN CQCBUFR PROGRAM) | +| PREPACQC | 363007 | AIRCRAFT QUALITY CONTROL STEP (NOT INCL. MDCRS ACARS) | +* | | (PREPACQC PROGRAM) | +| VIRTMP | 363008 | VIRTUAL TEMPERATURE/SPECIFIC HUMIDITY PROCESSING STEP | +* | | (PREVENTS PROGRAM OR VTPEVN SUBR. IN SUBR. GBLEVENTS IN | +* PREPDATA PROGRAM FOR ALL OBS. TYPES EXCEPT RAOBS/DROPS;| +* VTPEVN SUBR. IN CQCBUFR PROGRAM FOR RAOBS/DROPS) | +| CQCPROF | 363009 | WIND PROFILER QUALITY CONTROL STEP | +* | | (PROFCQC PROGRAM) | +| OIQC | 363010 | OI-QUALITY MULTI-PLATFROM CONTROL STEP | +* | | (OIQCBUFR PROGRAM) | +| SSI | 363011 | SSI GLOBAL ANALYSIS STEP | +* | | (SSIANL PROGRAM) | +| CQCVAD | 363012 | VAD WIND QUALITY CONTROL STEP | +* | | (CQCVAD PROGRAM) | +| R3DVAR | 363013 | 3DVAR REGIONAL ANALYSIS STEP | +* | | (R3DVAR PROGRAM) | +| ACARSQC | 363014 | MDCRS ACARS AIRCRAFT QUALITY CONTROL STEP | +* | | (ACARSQC PROGRAM) | +| NRLACQC | 363015 | NRL AIRCRAFT QUALITY CONTROL STEP | +* | | (NRLACQC PROGRAM) | +| GSI | 363016 | GSI ANALYSIS STEP | +* | | (GLOBAL_GSI AND NAM_GSI PROGRAMS) | +| DEFAULT | 363099 | NON-DEFINED STEP (DEFAULT) | +* | +* | +* THE FOLLOWING ARE TABLE B ENTRIES FOR THE REPORT HEADER | +* | +| ACID | 001006 | AIRCRAFT FLIGHT NUMBER | +| SAID | 001007 | SATELLITE IDENTIFIER (SATELLITE REPORTS ONLY) | +| SID | 001194 | STATION IDENTIFICATION | +| | | | +| SIRC | 002013 | RAWINSONDE SOLAR & INFRARED RADIATION CORR. INDICATOR | +| MSST | 002038 | METHOD OF SEA SURFACE TEMPERATURE MEASUREMENT | +| ITP | 002195 | INSTRUMENT TYPE | +| ROLF | 002199 | AIRCRAFT ROLL ANGLE FLAG | +| | | | +| RPT | 004214 | REPORTED OBSERVATION TIME | +| DHR | 004215 | OBSERVATION TIME MINUS CYCLE TIME | +| TCOR | 004216 | INDICATOR WHETHER OBS. TIME IN "DHR" WAS CORRECTED | +| RCT | 004217 | RECEIPT TIME | +| | | | +| YOB | 005002 | LATITUDE | +| ATRN | 005034 | ALONG TRACK ROW NUMBER (QUIKSCAT REPORTS ONLY) | +| | | | +| CTCN | 006034 | CROSS TRACK CELL NUMBER (QUIKSCAT & ASCAT REPORTS ONLY) | +| XOB | 006240 | LONGITUDE | +| | | | +| VSSO | 008002 | VERT. SIGNIFICANCE (SFC OBSERVATION) | +| ACAV | 008022 | TOTAL NUMBER WITH RESPECT TO ACCUMULATION OR AVERAGE | +| | | | +| IALR | 010082 | INSTANTANEOUS ALTITUDE RATE | +| ELV | 010199 | STATION ELEVATION | +| | | | +| SPRR | 021120 | SEAWINDS PROBABILITY OF RAIN (QUIKSCAT REPORTS ONLY) | +| | | | +| NRLQM | 033249 | NRL AIRCRAFT QUALITY CNTRL MARK (ADDED BY PGM NRLACQC) | +| | | | +| RSRD | 035200 | RESTRICTIONS ON REDISTRIBUTION | +| EXPRSRD | 035201 | EXPIRATION OF RESTRICTIONS ON REDISTRIBUTION | +| | | | +| SQN | 050001 | REPORT SEQUENCE NUMBER | +| PROCN | 050003 | PROCESS NUMBER FOR THIS MPI RUN (OBTAINED FROM SCRIPT) | +| | | | +| TYP | 055007 | PREPBUFR REPORT TYPE | +| T29 | 055008 | DATA DUMP REPORT TYPE | +| TSB | 055009 | REPORT SUBTYPE (HAS VARIOUS MEANINGS DEPENDING ON TYPE) | +| | | | +| PRVSTG | 058009 | MESONET PROVIDER ID STRING | +| SPRVSTG | 058010 | MESONET SUBPROVIDER ID STRING | +* | +* | +* THE FOLLOWING ARE TABLE B ENTRIES FOR THE REPORT LEVEL DATA | +* | +| TDMP | 001193 | TRUE DIRECTION OF SHIP DURING PAST 3 HOURS | +| ASMP | 001200 | AVG SPD OF SHIP DURING PAST 3 HOURS | +| | | | +| PCAT | 002005 | PRECISION OF TEMPERATURE OBSERVATION | +| AFIC | 020041 | AIRFRAME ICING | +| HBOI | 020194 | HEIGHT OF BASE OF ICING | +| HTOI | 020195 | HEIGHT OF TOP OF ICING | +| | | | +| .DTH.... | 004031 | DURATION OF TIME IN HOURS RELATED TO FOLLOWING VALUE | +| .DTM.... | 004032 | DURATION OF TIME IN MINS RELATED TO FOLLOWING VALUE | +| HRDR | 004218 | PROFILE LVL TIME-CYCLE (FOR RAOB/PIBAL, BASED ON B DFT) | +| | | | +| CHNM | 005042 | CHANNEL NUMBER | +| YDR | 005241 | PROFILE LEVEL LAT (FOR RAOB/PIBAL BASED ON BALLOON DFT) | +| | | | +| XDR | 006241 | PROFILE LEVEL LON (FOR RAOB/PIBAL BASED ON BALLOON DFT) | +| | | | +| ELEV | 007021 | SATELLITE ELEVATION (ZENITH ANGLE) | +| SOEL | 007022 | SOLAR ELEVATION (ZENITH ANGLE) | +| DBSS | 007062 | DEPTH BELOW SEA SURFACE | +| POB | 007245 | PRESSURE OBSERVATION | +| PQM | 007246 | PRESSURE (QUALITY) MARKER | +| PPC | 007247 | PRESSURE EVENT PROGRAM CODE | +| PRC | 007248 | PRESSURE EVENT REASON CODE | +| PFC | 007249 | FORECAST (BACKGROUND) PRESSURE VALUE | +| POE | 007250 | PRESSURE OBSERVATION ERROR | +| PAN | 007251 | ANALYZED PRESSURE VALUE | +| PCL | 007252 | CLIMATOLOGICAL PRESSURE VALUE | +| PCS | 007253 | STANDARD DEVIATION OF CLIMATOLOGICAL PRESSURE VALUE | +| POETU | 007254 | ANALYSIS-TUNED PRESSURE OBSERVATION ERROR | +| | | | +| POAF | 008004 | PHASE OF AIRCRAFT FLIGHT | +| CAT | 008193 | PREPBUFR DATA LEVEL CATEGORY | +| .RE.... | 008201 | RELATIONSHIP TO THE FOLLOWING VALUE | +| | | | +| ZOB | 010007 | HEIGHT OBSERVATION | +| ALSE | 010052 | ALTIMETER SETTING OBSERVATION | +| 3HPC | 010061 | 3 HOUR PRESSURE CHANGE | +| 24PC | 010062 | 24 HOUR PRESSURE CHANGE | +| CHPT | 010063 | CHARACTERISTIC OF PRESSURE TENDENCY | +| PRSS | 010195 | SURFACE PRESSURE OBSERVATION | +| PMO | 010243 | MEAN SEA-LEVEL PRESSURE OBSERVATION | +| PMQ | 010244 | MEAN SEA-LVL PRESSURE (QUALITY) MARKER | +| ZQM | 010246 | HEIGHT (QUALITY) MARKER | +| ZPC | 010247 | HEIGHT EVENT PROGRAM CODE | +| ZRC | 010248 | HEIGHT EVENT REASON CODE | +| ZFC | 010249 | FORECAST (BACKGROUND) HEIGHT VALUE | +| ZOE | 010250 | HEIGHT OBSERVATION ERROR | +| ZAN | 010251 | ANALYZED HEIGHT VALUE | +| ZCL | 010252 | CLIMATOLOGICAL HEIGHT VALUE | +| ZCS | 010253 | STANDARD DEVIATION OF CLIMATOLOGICAL HEIGHT VALUE | +| | | | +| DDO | 011001 | WIND DIRECTION OBSERVATION (NOT ASSIMILATED) | +* | | (AFTER "PREPACQC" STEP ONLY - SUBSEQUENT CODES DO NOT | +* | | PROCESS) | +| SOB | 011002 | WIND SPEED OBSERVATION | +* | | (STORED WHEN DIRECTION IS MISSING; E.G. METARS) | +| UOB | 011003 | U-COMPONENT WIND OBSERVATION | +| VOB | 011004 | V-COMPONENT WIND OBSERVATION | +| DGOT | 011031 | DEGREE OF TURBULENCE | +| HBOT | 011032 | HEIGHT OF BASE OF TURBULENCE | +| HTOT | 011033 | HEIGHT OF TOP OF TURBULENCE | +| MXGS | 011041 | MAXIMUM WIND SPEED (GUSTS) | +| MXGD | 011043 | MAXIMUM WIND GUST DIRECTION | +| MWD10 | 011081 | MODEL WIND DIRECTION AT 10 M | +| MWS10 | 011082 | MODEL WIND SPEED AT 10 M | +| WDIR1 | 011200 | SURFACE WIND DIRECTION | +| WSPD1 | 011201 | SURFACE WIND SPEED | +| PKWDDR | 011202 | PEAK WIND DIRECTION | +| PKWDSP | 011203 | PEAK WIND SPEED | +| SQM | 011217 | WIND SPEED (SOB) (QUALITY) MARKER | +* | | (STORED WHEN DIRECTION IS MISSING; E.G. METARS) | +| DFQ | 011218 | WIND DIRECTION/SPEED (DDO/FFO) (QUALITY) MARKER | +| DFP | 011219 | WIND DIRECTION/SPEED (DDO/FFO) EVENT PROGRAM CODE | +| DFR | 011220 | WIND DIRECTION/SPEED (DDO/FFO) EVENT REASON CODE | +| XS10 | 011223 | 10 METER EXTRAPOLATED WIND SPEED | +| XS20 | 011224 | 20 METER EXTRAPOLATED WIND SPEED | +| RF10M | 011225 | 10 METER WIND REDUCTION FACTOR | +| TRBX | 011235 | TURBULENCE INDEX | +| TRBX10 | 011236 | TURBULENCE INDEX FOR PERIOD (TOB-1 MIN) -> TOB | +| TRBX21 | 011237 | TURBULENCE INDEX FOR PERIOD (TOB-2 MIN) -> (TOB-1 MIN) | +| TRBX32 | 011238 | TURBULENCE INDEX FOR PERIOD (TOB-3 MIN) -> (TOB-2 MIN) | +| TRBX43 | 011239 | TURBULENCE INDEX FOR PERIOD (TOB-4 MIN) -> (TOB-3 MIN) | +| WQM | 011240 | U-, V-COMPONENT WIND (UOB/VOB) (QUALITY) MARKER | +| WPC | 011241 | U-, V-COMPONENT WIND (UOB/VOB) EVENT PROGRAM CODE | +| WRC | 011242 | U-, V-COMPONENT WIND (UOB/VOB) EVENT REASON CODE | +| UFC | 011243 | FORECAST (BACKGROUND) U-COMPONENT WIND VALUE | +| VFC | 011244 | FORECAST (BACKGROUND) V-COMPONENT WIND VALUE | +| WOE | 011245 | WIND OBSERVATION ERROR | +| UAN | 011246 | ANALYZED U-COMPONENT WIND VALUE | +| VAN | 011247 | ANALYZED V-COMPONENT WIND VALUE | +| UCL | 011248 | CLIMATOLOGICAL U-COMPONENT WIND VALUE | +| VCL | 011249 | CLIMATOLOGICAL V-COMPONENT WIND VALUE | +| UCS | 011250 | STANDARD DEVIATION OF CLIMATOLOGICAL U-COMP WIND VALUE | +| VCS | 011251 | STANDARD DEVIATION OF CLIMATOLOGICAL V-COMP WIND VALUE | +| FFO | 011252 | WIND SPEED OBSERVATION (NOT ASSIMILATED) | +* | | (AFTER "PREPACQC" STEP ONLY - SUBSEQUENT CODES DO NOT | +* | | PROCESS) | +| WOETU | 011253 | ANALYSIS-TUNED WIND OBSERVATION ERROR | +| | | | +| MXTM | 012111 | MAXIMUM TEMPERATURE | +| MITM | 012112 | MINIMUM TEMPERATURE | +| TMSK | 012161 | SKIN TEMPERATURE | +| TMBR | 012163 | BRIGHTNESS TEMPERATURE | +| GCDTT | 012210 | GOES CLOUD TOP TEMPERATURE OBSERVATION | +| TVO | 012243 | NON-Q. CONTROLLED VIRTUAL TEMP OBS (NOT ASSIMILATED) | +* | | (AFTER "PREPRO" STEP ONLY - SUBSEQUENT CODES DO NOT | +* | | PROCESS) | +| TDO | 012244 | DEWPOINT TEMPERATURE OBSERVATION (NOT ASSIMILATED) | +* | | (AFTER "VIRTMP" STEP ONLY - SUBSEQUENT CODES DO NOT | +* | | PROCESS) | +| TOB | 012245 | TEMPERATURE OBSERVATION | +* | | {AFTER "PREPRO" STEP - REPORTED TEMP, EITHER SENSIBLE | +* | | OR VIRTUAL DEPENDING UPON DATA TYPE; | +* | | AFTER "VIRTMP" STEP - VIRTUAL TEMPERATURE IF MOISTURE | +* | | AVAILABLE AND TEMPERATURE AFTER "PREPRO" STEP IS | +* | | SENSIBLE (EXCEPT FOR AIRCRAFT), OTHERWISE AS DEFINED | +* | | AFTER "PREPRO" STEP} | +| TQM | 012246 | TEMPERATURE (QUALITY) MARKER | +| TPC | 012247 | TEMPERATURE EVENT PROGRAM CODE | +| TRC | 012248 | TEMPERATURE EVENT REASON CODE | +| TFC | 012249 | FORECAST (BACKGROUND) TEMPERATURE VALUE | +| TOE | 012250 | TEMPERATURE OBSERVATION ERROR | +| TAN | 012251 | ANALYZED TEMPERATURE VALUE | +| TCL | 012252 | CLIMATOLOGICAL TEMPERATURE VALUE | +| TCS | 012253 | STANDARD DEVIATION OF CLIMATOLOGICAL TEMPERATURE VALUE | +| TOETU | 012254 | ANALYSIS-TUNED TEMPERATURE OBSERVATION ERROR | +| | | | +| TOPC | 013011 | TOTAL PRECIPITATION/TOTAL WATER EQUIVALENT | +| DOFS | 013012 | DEPTH OF FRESH SNOW | +| TOSD | 013013 | TOTAL SNOW DEPTH | +| REQV | 013014 | RAINFALL (AVERAGE RATE) OBSERVATION | +| TP01 | 013019 | TOTAL PRECIPITATION PAST 1 HOUR | +| TP03 | 013020 | TOTAL PRECIPITATION PAST 3 HOURS | +| TP06 | 013021 | TOTAL PRECIPITATION PAST 6 HOURS | +| TP12 | 013022 | TOTAL PRECIPITATION PAST 12 HOURS | +| TP24 | 013023 | TOTAL PRECIPITATION PAST 24 HOURS | +| MRWVC | 013096 | MWR WATER VAPOR CONTENT (TOTAL WATER VAPOR) | +| MRLWC | 013097 | MWR LIQUID WATER CONTENT (TOTAL CLOUD LIQUID WATER) | +| PWO | 013193 | TOTAL PRECIPITABLE WATER OBSERVATION | +| PW1O | 013202 | 1.0 TO 0.9 SIGMA LAYER PRECIPITABLE WATER OBSERVATION | +| PW2O | 013203 | 0.9 TO 0.7 SIGMA LAYER PRECIPITABLE WATER OBSERVATION | +| PW3O | 013204 | 0.7 TO 0.3 SIGMA LAYER PRECIPITABLE WATER OBSERVATION | +| QOB | 013245 | SPECIFIC HUMIDITY OBSERVATION | +* | | (AFTER "VIRTMP" STEP - ALWAYS RECALCULATED FROM QUALITY | +* | | CONTROLLED VIRTUAL TEMPERATURE DATA) | +| ESBAK | 013242 | FORECAST(BACKGROUND) SATURATION SPECIFIC HUMIDITY VALUE | +| QQM | 013246 | SPECIFIC HUMIDITY (QUALITY) MARKER | +| QPC | 013247 | SPECIFIC HUMIDITY EVENT PROGRAM CODE | +| QRC | 013248 | SPECIFIC HUMIDITY EVENT REASON CODE | +| QFC | 013249 | FORECAST (BACKGROUND) SPECIFIC HUMIDITY VALUE | +| QOE | 013250 | RELATIVE HUMIDITY OBSERVATION ERROR | +| QAN | 013251 | ANALYZED SPECIFIC HUMIDITY VALUE | +| QCL | 013252 | CLIMATOLOGICAL SPECIFIC HUMIDITY VALUE | +| QCS | 013253 | STANDARD DEV OF CLIMATOLOGICAL SPECIFIC HUMIDITY VALUE | +| QOETU | 013254 | ANALYSIS-TUNED RELATIVE HUMIDITY OBSERVATION ERROR | +| | | | +| TOSS | 014031 | TOTAL SUNSHINE | +| | | | +| OZON | 015001 | OZONE | +| | | | +| HOVI | 020001 | HORIZONTAL VISIBILITY | +| VTVI | 020002 | VERTICAL VISIBILITY | +| PRWE | 020003 | PRESENT WEATHER | +| PSW1 | 020004 | PAST WEATHER (1) | +| PSW2 | 020005 | PAST WEATHER (2) | +| TOCC | 020010 | CLOUD COVER (TOTAL) | +| CLAM | 020011 | CLOUD AMOUNT | +| CLTP | 020012 | CLOUD TYPE | +| HOCB | 020013 | HEIGHT OF BASE OF CLOUD | +| HOCT | 020014 | HEIGHT OF TOP OF CLOUD | +| CDTP | 020016 | CLOUD TOP PRESSURE OBSERVATION | +| HBLCS | 020201 | HEIGHT ABOVE SURFACE OF BASE OF LOWEST CLOUD SEEN | +| WSST | 020219 | WINDSAT SURFACE TYPE | +| CTPQM | 020246 | CLOUD TOP PRESSURE (QUALITY) MARKER | +| CTPPC | 020247 | CLOUD TOP PRESSURE EVENT PROGRAM CODE | +| CTPRC | 020248 | CLOUD TOP PRESSURE EVENT REASON CODE | +| CTPFC | 020249 | FORECAST (BACKGROUND) CLOUD TOP PRESSURE VALUE | +| CTPOE | 020250 | CLOUD TOP PRESSURE OBSERVATION ERROR | +| CTPAN | 020251 | ANALYZED CLOUD TOP PRESSURE VALUE | +| | | | +| LKCS | 021104 | LIKELIHOOD COMPUTED FOR SOLUTION (ASCAT REPORTS ONLY) | +| WVCQ | 021155 | WIND VECTOR CELL QUALITY (ASCAT REPORTS ONLY) | +| BSCD | 021156 | BACKSCATTER DISTANCE (ASCAT REPORTS ONLY) | +| A1 | 021226 | ERS INCIDENT ANGLE NUMBER 1 | +| A2 | 021227 | ERS INCIDENT ANGLE NUMBER 2 | +| A3 | 021228 | ERS INCIDENT ANGLE NUMBER 3 | +| B1 | 021231 | ERS AZIMUTH ANGLE NUMBER 1 | +| B2 | 021232 | ERS AZIMUTH ANGLE NUMBER 2 | +| B3 | 021233 | ERS AZIMUTH ANGLE NUMBER 3 | +| S1 | 021236 | ERS BACKSCATTER NUMBER 1 | +| S2 | 021237 | ERS BACKSCATTER NUMBER 2 | +| S3 | 021238 | ERS BACKSCATTER NUMBER 3 | +| E1 | 021241 | ERS ERROR ESTIMATE NUMBER 1 | +| E2 | 021242 | ERS ERROR ESTIMATE NUMBER 2 | +| E3 | 021243 | ERS ERROR ESTIMATE NUMBER 3 | +| | | | +| DOSW | 022003 | DIRECTION OF SWELL WAVES | +| POWV | 022011 | PERIOD OF WAVES | +| POWW | 022012 | PERIOD OF WIND WAVES | +| POSW | 022013 | PERIOD OF SWELL WAVES | +| HOWV | 022021 | HEIGHT OF WAVES | +| HOWW | 022022 | HEIGHT OF WIND WAVES | +| HOSW | 022023 | HEIGHT OF SWELL WAVES | +| SST1 | 022043 | SEA TEMPERATURE | +| SSTQM | 022246 | SEA TEMPERATURE (QUALITY) MARKER | +| SSTPC | 022247 | SEA TEMPERATURE EVENT PROGRAM CODE | +| SSTRC | 022248 | SEA TEMPERATURE EVENT REASON CODE | +| SSTFC | 022249 | FORECAST (BACKGROUND) SEA TEMPERATURE VALUE | +| SSTOE | 022250 | SEA TEMPERATURE OBSERVATION ERROR | +| SSTAN | 022251 | ANALYZED SEA TEMPERATURE VALUE | +| | | | +| MSTQ | 033026 | MOISTURE QUALITY | +| RFFL | 033196 | PERCENT CONFIDENCE BASED ON NESDIS RECURSIVE FILTER FCN | +| QIFY | 033197 | PERCENT CONFIDENCE BASED ON EUMETSAT QUAL INDX W/ FCST | +| QIFN | 033198 | PERCENT CONFIDENCE BASED ON EUMETSAT QUAL INDX W/O FCST | +| CHSQ | 033199 | CHI-SQUARED (OF THE WIND VECTOR RETRIEVAL) | +| WSEQC1 | 033200 | WINDSAT EDR QC FLAG #1 | +| PHER | 033201 | EST. ERROR COVARIANCE FOR WIND DIRECTION RETRIEVAL | +| EEQF | 033203 | PERCENT CONFIDENCE BASED ON NESDIS EXPECTED ERROR | +| PVWTG | 033204 | ANAL VARIATIONAL QC WEIGHT ON PRESS. OBS BASED ON GUESS | +| PVWTA | 033205 | ANAL VARIATIONAL QC WEIGHT ON PRESS. OBS BASED ON ANAL | +| TVWTG | 033206 | ANAL VARIATIONAL QC WEIGHT ON TEMP. OBS BASED ON GUESS | +| TVWTA | 033209 | ANAL VARIATIONAL QC WEIGHT ON TEMP. OBS BASED ON ANAL | +| QVWTG | 033210 | ANAL VARIATIONAL QC WEIGHT ON MOIST. OBS BASED ON GUESS | +| QVWTA | 033211 | ANAL VARIATIONAL QC WEIGHT ON MOIST. OBS BASED ON ANAL | +| WVWTG | 033212 | ANAL VARIATIONAL QC WEIGHT ON WIND OBS BASED ON GUESS | +| WVWTA | 033213 | ANAL VARIATIONAL QC WEIGHT ON WIND OBS BASED ON ANAL | +| PWTVWTG | 033214 | ANAL VARIAT. QC WGHT ON TOT PREC. WTR OBS BASED ON GESS | +| PWTVWTA | 033228 | ANAL VARIAT. QC WGHT ON TOT PREC. WTR OBS BASED ON ANAL | +| SSTE | 033245 | EST. ERROR COVARIANCE FOR SEA SURFACE TEMP RETRIEVAL | +| SPDE | 033246 | EST. ERROR COVARIANCE FOR WIND SPEED RETRIEVAL | +| VPRE | 033247 | EST. ERROR COVARIANCE FOR TOTAL WATER VAPOR RETRIEVAL | +| CLDE | 033248 | EST. ERROR COVARIANCE FOR TOTAL CLD LIQUID WATER RETR. | +| | | | +| RRTQM | 051001 | RAINFALL (AVERAGE RATE) (QUALITY) MARKER | +| RRTPC | 051002 | RAINFALL (AVERAGE RATE) EVENT PROGRAM CODE | +| RRTRC | 051003 | RAINFALL (AVERAGE RATE) EVENT REASON CODE | +| RRTFC | 051004 | FORECAST (BACKGROUND) RAINFALL (AVERAGE RATE) VALUE | +| RRTOE | 051005 | RAINFALL (AVERAGE RATE) OBSERVATION ERROR | +| RRTAN | 051006 | ANALYZED RAINFALL (AVERAGE RATE) VALUE | +| PWQ | 051021 | TOTAL PRECIPITABLE WATER (QUALITY) MARKER | +| PWP | 051022 | TOTAL PRECIPITABLE WATER EVENT PROGRAM CODE | +| PWR | 051023 | TOTAL PRECIPITABLE WATER EVENT REASON CODE | +| PWF | 051024 | FORECAST (BACKGROUND) TOTAL PRECIPITABLE WATER VALUE | +| PWE | 051025 | TOTAL PRECIPITABLE WATER OBSERVATION ERROR | +| PWA | 051026 | ANALYZED TOTAL PRECIPITABLE WATER VALUE | +| PWETU | 051027 | ANALYSIS-TUNED TOTAL PRECIPITABLE WATER OBS ERROR | +| PW1Q | 051032 | 1.0 TO 0.9 SIGMA LAYER PRECIP. WATER (QUALITY) MARKER | +| PW1P | 051033 | 1.0 TO 0.9 SIGMA LAYER PRECIP. WATER EVENT PROGRAM CODE | +| PW1R | 051034 | 1.0 TO 0.9 SIGMA LAYER PRECIP. WATER EVENT REASON CODE | +| PW1F | 051035 | FCST(BACKGRND) 1.0 TO 0.9 SIGMA LYR PRECIP. WATER VALUE | +| PW1E | 051036 | 1.0 TO 0.9 SIGMA LAYER PRECIP. WATER OBSERVATION ERROR | +| PW1A | 051037 | ANALYZED 1.0 TO 0.9 SIGMA LAYER PRECIP. WATER VALUE | +| PW2Q | 051042 | 0.9 TO 0.7 SIGMA LAYER PRECIP. WATER (QUALITY) MARKER | +| PW2P | 051043 | 0.9 TO 0.7 SIGMA LAYER PRECIP. WATER EVENT PROGRAM CODE | +| PW2R | 051044 | 0.9 TO 0.7 SIGMA LAYER PRECIP. WATER EVENT REASON CODE | +| PW2F | 051045 | FCST(BACKGRND) 0.9 TO 0.7 SIGMA LYR PRECIP. WATER VALUE | +| PW2E | 051046 | 0.9 TO 0.7 SIGMA LAYER PRECIP. WATER OBSERVATION ERROR | +| PW2A | 051047 | ANALYZED 0.9 TO 0.7 SIGMA LAYER PRECIP. WATER VALUE | +| PW3Q | 051052 | 0.7 TO 0.3 SIGMA LAYER PRECIP. WATER (QUALITY) MARKER | +| PW3P | 051053 | 0.7 TO 0.3 SIGMA LAYER PRECIP. WATER EVENT PROGRAM CODE | +| PW3R | 051054 | 0.7 TO 0.3 SIGMA LAYER PRECIP. WATER EVENT REASON CODE | +| PW3F | 051055 | FCST(BACKGRND) 0.7 TO 0.3 SIGMA LYR PRECIP. WATER VALUE | +| PW3E | 051056 | 0.7 TO 0.3 SIGMA LAYER PRECIP. WATER OBSERVATION ERROR | +| PW3A | 051057 | ANALYZED 0.7 TO 0.3 SIGMA LAYER PRECIP. WATER VALUE | +| PW4O | 051061 | 0.3 TO 0.0 SIGMA LAYER PRECIPITABLE WATER OBSERVATION | +| PW4Q | 051062 | 0.3 TO 0.0 SIGMA LAYER PRECIP. WATER (QUALITY) MARKER | +| PW4P | 051063 | 0.3 TO 0.0 SIGMA LAYER PRECIP. WATER EVENT PROGRAM CODE | +| PW4R | 051064 | 0.3 TO 0.0 SIGMA LAYER PRECIP. WATER EVENT REASON CODE | +| PW4F | 051065 | FCST(BACKGRND) 0.3 TO 0.0 SIGMA LYR PRECIP. WATER VALUE | +| PW4E | 051066 | 0.3 TO 0.0 SIGMA LAYER PRECIP. WATER OBSERVATION ERROR | +| PW4A | 051067 | ANALYZED 0.3 TO 0.0 SIGMA LAYER PRECIP. WATER VALUE | +| | | | +* The following are added temporarily until PFC, ZFC, etc. contain current | +* model guess instead of Global guess (applies for all models except Global) | +| | | | +| PFCMOD | 007255 | MODEL PRESSURE FORECAST VALUE (GLOBAL MODEL SEE PFC) | +| ZFCMOD | 010255 | MODEL HEIGHT FORECAST VALUE (GLOBAL MODEL SEE ZFC) | +| UFCMOD | 011254 | MODEL U-COMPONENT FORECAST VALUE (GLOBAL MODEL SEE UFC) | +| VFCMOD | 011255 | MODEL V-COMPONENT FORECAST VALUE (GLOBAL MODEL SEE VFC) | +| TFCMOD | 012255 | MODEL TEMPERATURE FORECAST VALUE (GLOBAL MODEL SEE TFC) | +| QFCMOD | 013255 | MODEL S. HUMIDITY FORECAST VALUE (GLOBAL MODEL SEE QFC) | +| PWFMOD | 051030 | MODEL TOTAL PWATER FORECAST VALUE(GLOBAL MODEL SEE PWC) | +| PW1FMOD | 051040 | MODEL 1.-.9 SIG. LYR PWATER FCST(GLOBAL MODEL SEE PW1F) | +| PW2FMOD | 051050 | MODEL .9-.7 SIG. LYR PWATER FCST(GLOBAL MODEL SEE PW2F) | +| PW3FMOD | 051060 | MODEL .7-.3 SIG. LYR PWATER FCST(GLOBAL MODEL SEE PW3F) | +| PW4FMOD | 051070 | MODEL .3-0. SIG. LYR PWATER FCST(GLOBAL MODEL SEE PW4F) | +| | | | +|------------------------------------------------------------------------------| +| MNEMONIC | SEQUENCE | +|----------|-------------------------------------------------------------------| +| | | +| ADPUPA | HEADR SIRC {PRSLEVEL} {CLOUDSEQ} | +| ADPUPA | | +| | | +| AIRCAR | HEADR ACID {PRSLEVLA} | +| | | +| AIRCFT | HEADR {PRSLEVLA} | +| | | +| SATWND | HEADR SAID PRSLEVEL | +| | | +| PROFLR | HEADR {PRSLEVEL} | +| | | +| VADWND | HEADR {PRSLEVEL} | +| | | +| SATEMP | HEADR SAID {PRSLEVEL} {BTMPLEVL} | +| | | +| GOESND | HEADR SAID ACAV {PRSLEVLG} {BTMPLEVL} | +| | | +| ADPSFC | HEADR PRSLEVEL | +| ADPSFC | {PREWXSEQ} {CLOUDSEQ} {TMXMNSEQ} {SWELLSEQ} | +| ADPSFC | | +| ADPSFC | | +| | | +| SFCSHP | HEADR PRSLEVEL {CLOUDSEQ} | +| SFCSHP | {SWELLSEQ} | +| SFCSHP | | +| | | +| SFCBOG | HEADR PRSLEVEL | +| | | +| SPSSMI | HEADR CAT SAID | +| SPSSMI | {BTMPLEVL} | +| | | +| SYNDAT | HEADR {PRSLEVEL} | +| | | +| ERS1DA | HEADR CAT SAID | +| | | +| QKSWND | HEADR CAT SAID CTCN ATRN SPRR | +| | | +| MSONET | HEADR PRVSTG SPRVSTG PRSLEVEL {TOPC_SEQ} | +| MSONET | | +| | | +| GPSIPW | HEADR CAT PW__INFO | +| | | +| RASSDA | HEADR {PRSLEVEL} | +| | | +| WDSATR | HEADR CAT SAID ACAV REQV SST1 | +| WDSATR | MWD10 MWS10 MRWVC MRLWC WSST CHSQ | +| WDSATR | WSEQC1 PHER SSTE SPDE VPRE CLDE | +| | | +| ASCATW | HEADR CAT SAID CTCN WVCQ BSCD LKCS | +| | | +| HEADR | SID XOB YOB DHR ELV TYP T29 TSB ITP SQN | +| HEADR | PROCN RPT TCOR | +| | | +| PRSLEVEL | CAT | +| PRSLEVEL | | +| | | +| PRSLEVLG | CAT | +| PRSLEVLG | | +| | | +| PRSLEVLA | RCT ROLF MSTQ IALR | +| PRSLEVLA | CAT | +| PRSLEVLA | | +| PRSLEVLA | {TURB3SEQ} {PREWXSEQ} {CLOUDSEQ} {AFIC_SEQ} {NRLQMSEQ} | +| | | +| BTMPLEVL | CHNM TMBR | +| | | +| P___INFO | [P__EVENT] | +| Q___INFO | [Q__EVENT] TDO | +| T___INFO | [T__EVENT] TVO | +| Z___INFO | [Z__EVENT] | +| W___INFO | [W__EVENT] [DF_EVENT] | +| PW__INFO | PRSS | +| PWT_INFO | [PWTEVENT] | +| PWL_INFO | | +| PW1_INFO | [PW1EVENT] | +| PW2_INFO | [PW2EVENT] | +| PW3_INFO | [PW3EVENT] | +| PW4_INFO | [PW4EVENT] | +| RRT_INFO | [RRTEVENT] | +| CTP_INFO | [CTPEVENT] TOCC GCDTT | +| SST_INFO | [SSTEVENT] MSST | +| BTMPINFO | ELEV SOEL OZON TMSK CLAM | +| DRFTINFO | XDR YDR HRDR | +| SCATINFO | A1 A2 A3 B1 B2 B3 S1 S2 S3 E1 E2 E3 | +| | | +| TURB1SEQ | TRBX | +| TURB2SEQ | TRBX10 TRBX21 TRBX32 TRBX43 | +| PCCF_SEQ | RFFL QIFY QIFN EEQF | +| ACFT_SEQ | PCAT POAF | +| RSRD_SEQ | RSRD EXPRSRD | +| PMSL_SEQ | PMO PMQ | +| ALTIMSEQ | ALSE | +| WSPD_SEQ | SOB SQM | +| TOPC_SEQ | .DTHTOPC TOPC | +| PREWXSEQ | PRWE | +| CLOUDSEQ | VSSO CLAM CLTP HOCB | +| HOCT_SEQ | HOCT | +| TMXMNSEQ | .DTHMXTM MXTM .DTHMITM MITM | +| SWELLSEQ | DOSW HOSW POSW | +| DBSS_SEQ | DBSS | +| VISB1SEQ | .REHOVI HOVI | +| VISB2SEQ | HOVI | +| VTVI_SEQ | VTVI | +| PSTWXSEQ | PSW1 PSW2 | +| PKWNDSEQ | PKWDSP PKWDDR | +| GUST1SEQ | .DTMMXGS MXGS | +| GUST2SEQ | MXGS MXGD | +| TPRECSEQ | TP01 TP03 TP06 TP24 | +| TP12_SEQ | TP12 | +| SUNSHSEQ | TOSS | +| CLOU2SEQ | TOCC HBLCS | +| XWSPDSEQ | XS10 XS20 | +| SWINDSEQ | WDIR1 WSPD1 | +| SNOW_SEQ | .DTHDOFS DOFS TOSD | +| WAVE_SEQ | HOWV POWV HOWW POWW | +| SHIP_SEQ | TDMP ASMP | +| PTENDSEQ | CHPT 3HPC | +| PTE24SEQ | 24PC | +| ACID_SEQ | ACID | +| AFIC_SEQ | AFIC HBOI HTOI | +| TURB3SEQ | DGOT HBOT HTOT | +| NRLQMSEQ | NRLQM | +| | | +| P__EVENT | POB PQM PPC PRC | +| Q__EVENT | QOB QQM QPC QRC | +| T__EVENT | TOB TQM TPC TRC | +| Z__EVENT | ZOB ZQM ZPC ZRC | +| W__EVENT | UOB VOB WQM WPC WRC | +| DF_EVENT | DDO FFO DFQ DFP DFR | +| PWTEVENT | PWO PWQ PWP PWR | +| PW1EVENT | PW1O PW1Q PW1P PW1R | +| PW2EVENT | PW2O PW2Q PW2P PW2R | +| PW3EVENT | PW3O PW3Q PW3P PW3R | +| PW4EVENT | PW4O PW4Q PW4P PW4R | +| RRTEVENT | 202130 201134 REQV 201000 202000 RRTQM RRTPC RRTRC | +| CTPEVENT | CDTP CTPQM CTPPC CTPRC | +| SSTEVENT | SST1 SSTQM SSTPC SSTRC | +| | | +| P__BACKG | POE PFC | +| Q__BACKG | QOE QFC | +| T__BACKG | TOE TFC | +| Z__BACKG | ZFC | +| W__BACKG | WOE UFC VFC | +| PWTBACKG | PWE PWF | +| PW1BACKG | PW1E PW1F | +| PW2BACKG | PW2E PW2F | +| PW3BACKG | PW3E PW3F | +| PW4BACKG | PW4E PW4F | +| RRTBACKG | RRTOE RRTFC | +| CTPBACKG | CTPOE CTPFC | +| SSTBACKG | SSTOE SSTFC | +| | | +| P__POSTP | PAN POETU PVWTG PVWTA | +| Q__POSTP | QAN QOETU QVWTG QVWTA ESBAK | +| T__POSTP | TAN TOETU TVWTG TVWTA | +| Z__POSTP | ZAN | +| W__POSTP | UAN VAN WOETU WVWTG WVWTA RF10M | +| PWTPOSTP | PWA PWETU PWTVWTG PWTVWTA | +| PW1POSTP | PW1A | +| PW2POSTP | PW2A | +| PW3POSTP | PW3A | +| PW4POSTP | PW4A | +| RRTPOSTP | RRTAN | +| CTPPOSTP | CTPAN | +| SSTPOSTP | SSTAN | +| | | +| PCLIMATO | PCL PCS | +| QCLIMATO | QCL QCS | +| TCLIMATO | TCL TCS | +| ZCLIMATO | ZCL ZCS | +| WCLIMATO | UCL UCS VCL VCS | +| | | +| PFC__MSQ | PFCMOD | +| QFC__MSQ | QFCMOD | +| TFC__MSQ | TFCMOD | +| ZFC__MSQ | ZFCMOD | +| WFC__MSQ | UFCMOD VFCMOD | +| PWF__MSQ | PWFMOD | +| PW1F_MSQ | PW1FMOD | +| PW2F_MSQ | PW2FMOD | +| PW3F_MSQ | PW3FMOD | +| PW4F_MSQ | PW4FMOD | +| | | +|------------------------------------------------------------------------------| +| MNEMONIC | SCAL | REFERENCE | BIT | UNITS |-------------| +|----------|------|-------------|-----|--------------------------|-------------| +| | | | | |-------------| +| ACID | 0 | 0 | 64 | CCITT IA5 |-------------| +| SAID | 0 | 0 | 10 | CODE TABLE |-------------| +| SID | 0 | 0 | 64 | CCITT IA5 |-------------| +| | | | | |-------------| +| SIRC | 0 | 0 | 4 | CODE TABLE |-------------| +| MSST | 0 | 0 | 3 | CODE TABLE |-------------| +| ITP | 0 | 0 | 8 | CODE TABLE |-------------| +| ROLF | 0 | 0 | 3 | CODE TABLE |-------------| +| | | | | |-------------| +| RPT | 5 | 0 | 22 | HOURS |-------------| +| DHR | 5 | -2400000 | 23 | HOURS |-------------| +| TCOR | 0 | 0 | 3 | CODE TABLE |-------------| +| RCT | 2 | 0 | 12 | HOURS |-------------| +| | | | | |-------------| +| YOB | 2 | -9000 | 15 | DEG N |-------------| +| ATRN | 0 | 0 | 11 | NUMERIC |-------------| +| | | | | |-------------| +| CTCN | 0 | 0 | 7 | NUMERIC |-------------| +* IMPORTANT: XOB IS A LOCAL DESCRIPTOR HERE EVEN THOUGH IT HAS THE SAME * +* ATTRIBUTES AS CLON (0-06-002) - THIS IS BECAUSE IT IS CODED HERE * +* WITH THE RANGE 0 TO 360 DEGREES EAST UNLIKE CLON WHICH HAS THE * +* RANGE -180 TO +180 DEGREES, WHERE EAST IS + AND WEST IS - * +* (IT CAN STILL BE HELD HERE IN 16 BITS) * +| XOB | 2 | -18000 | 16 | DEG E |-------------| +| | | | | |-------------| +| VSSO | 0 | 0 | 6 | CODE TABLE |-------------| +| ACAV | 0 | 0 | 16 | NUMERIC |-------------| +| | | | | |-------------| +| IALR | 3 | -65536 | 17 | M/S |-------------| +| ELV | 0 | -1000 | 17 | METER |-------------| +| | | | | |-------------| +| SPRR | 3 | 0 | 10 | NUMERIC |-------------| +| | | | | |-------------| +| NRLQM | 0 | 0 | 8 | CCITT IA5 |-------------| +| | | | | |-------------| +| RSRD | 0 | 0 | 9 | FLAG TABLE |-------------| +| EXPRSRD | 0 | 0 | 8 | HOURS |-------------| +| | | | | |-------------| +| SQN | 0 | 0 | 19 | NUMERIC |-------------| +| | | | | |-------------| +| PROCN | 0 | 0 | 7 | NUMERIC |-------------| +| | | | | |-------------| +| TYP | 0 | 0 | 10 | CODE TABLE |-------------| +| T29 | 0 | 0 | 10 | CODE TABLE |-------------| +| TSB | 0 | 0 | 10 | CODE TABLE |-------------| +| | | | | |-------------| +| PRVSTG | 0 | 0 | 64 | CCITT IA5 |-------------| +| SPRVSTG | 0 | 0 | 64 | CCITT IA5 |-------------| +| | | | | |-------------| +| | | | | |-------------| +| TDMP | 0 | 0 | 4 | CODE TABLE |-------------| +| ASMP | 0 | 0 | 4 | CODE TABLE |-------------| +| | | | | |-------------| +| PCAT | 2 | 0 | 7 | KELVIN |-------------| +| AFIC | 0 | 0 | 4 | CODE TABLE |-------------| +| HBOI | -1 | -40 | 16 | METER |-------------| +| HTOI | -1 | -40 | 16 | METER |-------------| +| | | | | |-------------| +| .DTH.... | 0 | 0 | 8 | HOURS |-------------| +| .DTM.... | 0 | 0 | 6 | MINUTES |-------------| +| HRDR | 5 | -2400000 | 23 | HOURS |-------------| +| | | | | |-------------| +| CHNM | 0 | 0 | 6 | NUMERIC |-------------| +| YDR | 2 | -9000 | 15 | DEG N |-------------| +| | | | | |-------------| +| XDR | 2 | -18000 | 16 | DEG E |-------------| +| | | | | |-------------| +| ELEV | 2 | -9000 | 15 | DEGREE |-------------| +| SOEL | 2 | -9000 | 15 | DEGREE |-------------| +| DBSS | 1 | 0 | 17 | METER |-------------| +| POB | 1 | 0 | 14 | MB |-------------| +| PQM | 0 | 0 | 5 | CODE TABLE |-------------| +| PPC | 0 | 0 | 5 | CODE TABLE |-------------| +| PRC | 0 | 0 | 10 | CODE TABLE |-------------| +| PFC | 1 | 0 | 14 | MB |-------------| +| POE | 2 | 0 | 14 | MB |-------------| +| PAN | 1 | 0 | 14 | MB |-------------| +| PCL | 1 | 0 | 14 | MB |-------------| +| PCS | 1 | 0 | 14 | MB |-------------| +| POETU | 2 | 0 | 14 | MB |-------------| +| | | | | |-------------| +| POAF | 0 | 0 | 3 | CODE TABLE |-------------| +| CAT | 0 | 0 | 6 | CODE TABLE |-------------| +| .RE.... | 0 | 0 | 3 | CODE TABLE |-------------| +| | | | | |-------------| +| ZOB | 0 | -1000 | 17 | METER |-------------| +| ALSE | -1 | 0 | 14 | PASCALS |-------------| +| 3HPC | -1 | -500 | 10 | PASCALS |-------------| +| 24PC | -1 | -1000 | 11 | PASCALS |-------------| +| CHPT | 0 | 0 | 4 | CODE TABLE |-------------| +| PRSS | -1 | 0 | 14 | PASCALS |-------------| +| PMO | 1 | 0 | 14 | MB |-------------| +| PMQ | 0 | 0 | 5 | CODE TABLE |-------------| +| ZQM | 0 | 0 | 5 | CODE TABLE |-------------| +| ZPC | 0 | 0 | 5 | CODE TABLE |-------------| +| ZRC | 0 | 0 | 10 | CODE TABLE |-------------| +| ZFC | 0 | -1000 | 17 | METER |-------------| +| ZOE | 0 | 0 | 10 | METER |-------------| +| ZAN | 0 | -1000 | 17 | METER |-------------| +| ZCL | 0 | -1000 | 17 | METER |-------------| +| ZCS | 0 | 0 | 10 | METER |-------------| +| | | | | |-------------| +| DDO | 0 | 0 | 9 | DEGREES TRUE |-------------| +| SOB | 1 | 0 | 12 | M/S |-------------| +| UOB | 1 | -4096 | 13 | M/S |-------------| +| VOB | 1 | -4096 | 13 | M/S |-------------| +| DGOT | 0 | 0 | 4 | CODE TABLE |-------------| +| HBOT | -1 | -40 | 16 | METERS |-------------| +| HTOT | -1 | -40 | 16 | METERS |-------------| +| MXGS | 1 | 0 | 12 | M/S |-------------| +| MXGD | 0 | 0 | 9 | DEGREES TRUE |-------------| +| MWD10 | 2 | 0 | 16 | DEGREES TRUE |-------------| +| MWS10 | 2 | 0 | 14 | M/S |-------------| +| WDIR1 | 0 | 0 | 9 | DEGREES TRUE |-------------| +| WSPD1 | 1 | 0 | 12 | M/S |-------------| +| PKWDDR | 0 | 0 | 9 | DEGREES TRUE |-------------| +| PKWDSP | 1 | 0 | 12 | M/S |-------------| +| SQM | 0 | 0 | 5 | CODE TABLE |-------------| +| DFQ | 0 | 0 | 5 | CODE TABLE |-------------| +| DFP | 0 | 0 | 5 | CODE TABLE |-------------| +| DFR | 0 | 0 | 10 | CODE TABLE |-------------| +| XS10 | 1 | 0 | 12 | M/S |-------------| +| XS20 | 1 | 0 | 12 | M/S |-------------| +| RF10M | 4 | 0 | 16 | NUMERIC |-------------| +| TRBX | 0 | 0 | 6 | CODE TABLE |-------------| +| TRBX10 | 0 | 0 | 6 | CODE TABLE |-------------| +| TRBX21 | 0 | 0 | 6 | CODE TABLE |-------------| +| TRBX32 | 0 | 0 | 6 | CODE TABLE |-------------| +| TRBX43 | 0 | 0 | 6 | CODE TABLE |-------------| +| WQM | 0 | 0 | 5 | CODE TABLE |-------------| +| WPC | 0 | 0 | 5 | CODE TABLE |-------------| +| WRC | 0 | 0 | 10 | CODE TABLE |-------------| +| UFC | 1 | -4096 | 13 | M/S |-------------| +| VFC | 1 | -4096 | 13 | M/S |-------------| +| WOE | 1 | 0 | 10 | M/S |-------------| +| UAN | 1 | -4096 | 13 | M/S |-------------| +| VAN | 1 | -4096 | 13 | M/S |-------------| +| UCL | 1 | -4096 | 13 | M/S |-------------| +| VCL | 1 | -4096 | 13 | M/S |-------------| +| UCS | 1 | 0 | 10 | M/S |-------------| +| VCS | 1 | 0 | 10 | M/S |-------------| +| FFO | 0 | 0 | 9 | KNOTS |-------------| +| WOETU | 1 | 0 | 10 | M/S |-------------| +| | | | | |-------------| +| MXTM | 2 | 0 | 16 | KELVIN |-------------| +| MITM | 2 | 0 | 16 | KELVIN |-------------| +| TMSK | 2 | 0 | 16 | KELVIN |-------------| +| TMBR | 2 | 0 | 16 | KELVIN |-------------| +| GCDTT | 2 | 0 | 16 | KELVIN |-------------| +| TVO | 1 | -2732 | 14 | DEG C |-------------| +| TDO | 1 | -2732 | 14 | DEG C |-------------| +| TOB | 1 | -2732 | 14 | DEG C |-------------| +| TQM | 0 | 0 | 5 | CODE TABLE |-------------| +| TPC | 0 | 0 | 5 | CODE TABLE |-------------| +| TRC | 0 | 0 | 10 | CODE TABLE |-------------| +| TFC | 1 | -2732 | 14 | DEG C |-------------| +| TOE | 1 | 0 | 10 | DEG C |-------------| +| TAN | 1 | -2732 | 14 | DEG C |-------------| +| TCL | 1 | -2732 | 14 | DEG C |-------------| +| TCS | 1 | 0 | 10 | DEG C |-------------| +| TOETU | 1 | 0 | 10 | DEG C |-------------| +| | | | | |-------------| +| PWO | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW1O | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW2O | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW3O | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| TOPC | 1 | -1 | 14 | KG/M**2 |-------------| +| DOFS | 2 | -2 | 12 | METER |-------------| +| TOSD | 2 | -2 | 16 | METER |-------------| +* REQV STORED AT A HIGHER PRECISION THAN STANDARD VIA OPERATIOR DESCRIPTORS * +* FOR MESSAGE TYPE SPSSMI (SCALE=6, BIT WIDTH=18) * +| REQV | 4 | 0 | 12 | KG/((METER**2)*SECOND) |-------------| +| TP01 | 1 | -1 | 14 | KG/M**2 |-------------| +| TP03 | 1 | -1 | 14 | KG/M**2 |-------------| +| TP06 | 1 | -1 | 14 | KG/M**2 |-------------| +| TP12 | 1 | -1 | 14 | KG/M**2 |-------------| +| TP24 | 1 | -1 | 14 | KG/M**2 |-------------| +| MRWVC | 2 | 0 | 14 | KG/M**2 |-------------| +| MRLWC | 2 | 0 | 14 | KG/M**2 |-------------| +| QOB | 0 | 0 | 16 | MG/KG |-------------| +| ESBAK | 0 | 0 | 16 | MG/KG |-------------| +| QQM | 0 | 0 | 5 | CODE TABLE |-------------| +| QPC | 0 | 0 | 5 | CODE TABLE |-------------| +| QRC | 0 | 0 | 10 | CODE TABLE |-------------| +| QFC | 0 | 0 | 16 | MG/KG |-------------| +| QOE | 1 | 0 | 10 | PERCENT DIVIDED BY 10 |-------------| +| QAN | 0 | 0 | 16 | MG/KG |-------------| +| QCL | 0 | 0 | 16 | MG/KG |-------------| +| QCS | 0 | 0 | 16 | MG/KG |-------------| +| QOETU | 1 | 0 | 10 | PERCENT DIVIDED BY 10 |-------------| +| | | | | |-------------| +| TOSS | 0 | 0 | 11 | MINUTE |-------------| +| | | | | |-------------| +| OZON | 0 | 0 | 10 | DOBSON UNITS |-------------| +| | | | | |-------------| +| HOVI | -1 | 0 | 13 | METER |-------------| +| VTVI | -1 | 0 | 7 | METER |-------------| +| PRWE | 0 | 0 | 9 | CODE TABLE |-------------| +| PSW1 | 0 | 0 | 5 | CODE TABLE |-------------| +| PSW2 | 0 | 0 | 5 | CODE TABLE |-------------| +| TOCC | 0 | 0 | 7 | PERCENT |-------------| +| CLAM | 0 | 0 | 4 | CODE TABLE |-------------| +| CLTP | 0 | 0 | 6 | CODE TABLE |-------------| +| HOCB | -1 | -40 | 11 | METER |-------------| +| HOCT | -1 | -40 | 11 | METER |-------------| +| CDTP | -1 | 0 | 14 | PASCALS |-------------| +| HBLCS | 0 | 0 | 4 | CODE TABLE |-------------| +| WSST | 0 | 0 | 3 | CODE TABLE |-------------| +| CTPQM | 0 | 0 | 5 | CODE TABLE |-------------| +| CTPPC | 0 | 0 | 5 | CODE TABLE |-------------| +| CTPRC | 0 | 0 | 10 | CODE TABLE |-------------| +| CTPFC | -1 | 0 | 14 | PASCALS |-------------| +| CTPOE | -1 | 0 | 10 | PASCALS |-------------| +| CTPAN | -1 | 0 | 14 | PASCALS |-------------| +| | | | | |-------------| +| LKCS | 3 | -30000 | 15 | NUMERIC |-------------| +| WVCQ | 0 | 0 | 24 | FLAG TABLE |-------------| +| BSCD | 1 | -4096 | 13 | NUMERIC |-------------| +| A1 | 1 | 0 | 12 | DEGREE |-------------| +| A2 | 1 | 0 | 12 | DEGREE |-------------| +| A3 | 1 | 0 | 12 | DEGREE |-------------| +| B1 | 1 | 0 | 12 | DEGREE |-------------| +| B2 | 1 | 0 | 12 | DEGREE |-------------| +| B3 | 1 | 0 | 12 | DEGREE |-------------| +| S1 | 2 | -5000 | 13 | DECIBEL |-------------| +| S2 | 2 | -5000 | 13 | DECIBEL |-------------| +| S3 | 2 | -5000 | 13 | DECIBEL |-------------| +| E1 | 0 | 0 | 7 | PERCENT |-------------| +| E2 | 0 | 0 | 7 | PERCENT |-------------| +| E3 | 0 | 0 | 7 | PERCENT |-------------| +| | | | | |-------------| +| DOSW | 0 | 0 | 9 | DEGREES TRUE |-------------| +| POWV | 0 | 0 | 6 | SECONDS |-------------| +| POWW | 0 | 0 | 6 | SECONDS |-------------| +| POSW | 0 | 0 | 6 | SECONDS |-------------| +| HOWV | 1 | 0 | 10 | METER |-------------| +| HOWW | 1 | 0 | 10 | METER |-------------| +| HOSW | 1 | 0 | 10 | METER |-------------| +| SST1 | 2 | 0 | 15 | KELVIN |-------------| +| SSTQM | 0 | 0 | 5 | CODE TABLE |-------------| +| SSTPC | 0 | 0 | 5 | CODE TABLE |-------------| +| SSTRC | 0 | 0 | 10 | CODE TABLE |-------------| +| SSTFC | 2 | 0 | 15 | KELVIN |-------------| +| SSTOE | 1 | 0 | 10 | KELVIN |-------------| +| SSTAN | 2 | 0 | 15 | KELVIN |-------------| +| | | | | |-------------| +| MSTQ | 0 | 0 | 6 | CODE TABLE |-------------| +| RFFL | 0 | 0 | 8 | PERCENT |-------------| +| QIFY | 0 | 0 | 8 | PERCENT |-------------| +| QIFN | 0 | 0 | 8 | PERCENT |-------------| +| CHSQ | 2 | 0 | 17 | NUMERIC |-------------| +| WSEQC1 | 0 | 0 | 31 | FLAG TABLE |-------------| +| PHER | 1 | 0 | 12 | DEGREES TRUE |-------------| +| EEQF | 0 | 0 | 8 | PERCENT |-------------| +| PVWTG | 0 | 0 | 7 | PERCENT |-------------| +| PVWTA | 0 | 0 | 7 | PERCENT |-------------| +| TVWTG | 0 | 0 | 7 | PERCENT |-------------| +| TVWTA | 0 | 0 | 7 | PERCENT |-------------| +| QVWTG | 0 | 0 | 7 | PERCENT |-------------| +| QVWTA | 0 | 0 | 7 | PERCENT |-------------| +| WVWTG | 0 | 0 | 7 | PERCENT |-------------| +| WVWTA | 0 | 0 | 7 | PERCENT |-------------| +| PWTVWTG | 0 | 0 | 7 | PERCENT |-------------| +| PWTVWTA | 0 | 0 | 7 | PERCENT |-------------| +| SSTE | 2 | 0 | 16 | KELVIN |-------------| +| SPDE | 2 | 0 | 15 | M/S |-------------| +| VPRE | 2 | 0 | 14 | KG/M**2 |-------------| +| CLDE | 3 | 0 | 14 | KG/M**2 |-------------| +| | | | | |-------------| +| RRTQM | 0 | 0 | 5 | CODE TABLE |-------------| +| RRTPC | 0 | 0 | 5 | CODE TABLE |-------------| +| RRTRC | 0 | 0 | 10 | CODE TABLE |-------------| +| RRTFC | 6 | 0 | 18 | KG/((M**2)*S) (or MM/S) |-------------| +| RRTOE | 6 | 0 | 18 | KG/((M**2)*S) (or MM/S) |-------------| +| RRTAN | 6 | 0 | 18 | KG/((M**2)*S) (or MM/S) |-------------| +| PWQ | 0 | 0 | 5 | CODE TABLE |-------------| +| PWP | 0 | 0 | 5 | CODE TABLE |-------------| +| PWR | 0 | 0 | 10 | CODE TABLE |-------------| +| PWF | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PWE | 1 | 0 | 10 | KG/M**2 (or MM) |-------------| +| PWA | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PWETU | 1 | 0 | 10 | KG/M**2 (or MM) |-------------| +| PW1Q | 0 | 0 | 5 | CODE TABLE |-------------| +| PW1P | 0 | 0 | 5 | CODE TABLE |-------------| +| PW1R | 0 | 0 | 10 | CODE TABLE |-------------| +| PW1F | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW1E | 1 | 0 | 10 | KG/M**2 (or MM) |-------------| +| PW1A | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW2Q | 0 | 0 | 5 | CODE TABLE |-------------| +| PW2P | 0 | 0 | 5 | CODE TABLE |-------------| +| PW2R | 0 | 0 | 10 | CODE TABLE |-------------| +| PW2F | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW2E | 1 | 0 | 10 | KG/M**2 (or MM) |-------------| +| PW2A | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW3Q | 0 | 0 | 5 | CODE TABLE |-------------| +| PW3P | 0 | 0 | 5 | CODE TABLE |-------------| +| PW3R | 0 | 0 | 10 | CODE TABLE |-------------| +| PW3F | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW3E | 1 | 0 | 10 | KG/M**2 (or MM) |-------------| +| PW3A | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW4O | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW4Q | 0 | 0 | 5 | CODE TABLE |-------------| +| PW4P | 0 | 0 | 5 | CODE TABLE |-------------| +| PW4R | 0 | 0 | 10 | CODE TABLE |-------------| +| PW4F | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW4E | 1 | 0 | 10 | KG/M**2 (or MM) |-------------| +| PW4A | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| | | | | |-------------| +| | | | | |-------------| +| PFCMOD | 1 | 0 | 14 | MB |-------------| +| ZFCMOD | 0 | -1000 | 17 | METER |-------------| +| UFCMOD | 1 | -4096 | 13 | M/S |-------------| +| VFCMOD | 1 | -4096 | 13 | M/S |-------------| +| TFCMOD | 1 | -2732 | 14 | DEG C |-------------| +| QFCMOD | 0 | 0 | 16 | MG/KG |-------------| +| PWFMOD | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW1FMOD | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW2FMOD | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW3FMOD | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +| PW4FMOD | 1 | 0 | 11 | KG/M**2 (or MM) |-------------| +`------------------------------------------------------------------------------' diff --git a/parm/forecast/globnest/field_table b/parm/forecast/globnest/field_table index 7719eb2e0..1f61d0054 100644 --- a/parm/forecast/globnest/field_table +++ b/parm/forecast/globnest/field_table @@ -30,6 +30,11 @@ "longname", "ozone mixing ratio" "units", "kg/kg" "profile_type", "fixed", "surface_value=1.e30" / +# prognostic subgrid scale turbulent kinetic energy + "TRACER", "atmos_mod", "sgs_tke" + "longname", "subgrid scale turbulent kinetic energy" + "units", "m2/s2" + "profile_type", "fixed", "surface_value=1.e30" / # non-prognostic cloud amount "TRACER", "atmos_mod", "cld_amt" "longname", "cloud amount" diff --git a/parm/forecast/globnest/input.nml.tmp b/parm/forecast/globnest/input.nml.tmp index 1bb7d4fd6..a23ef84ec 100644 --- a/parm/forecast/globnest/input.nml.tmp +++ b/parm/forecast/globnest/input.nml.tmp @@ -1,27 +1,36 @@ &amip_interp_nml - interp_oi_sst = .true. - use_ncep_sst = .true. - use_ncep_ice = .false. - no_anom_sst = .false. - data_set = 'reynolds_oi' - date_out_of_range = 'climo' + interp_oi_sst = .true. + use_ncep_sst = .true. + use_ncep_ice = .false. + no_anom_sst = .false. + data_set = 'reynolds_oi' + date_out_of_range = 'climo' / &atmos_model_nml - blocksize = 32 - chksum_debug = .false. - dycore_only = .false. - fdiag = 3 - avg_max_length = 3600. - fhmax = _fhmax_ - fhout = 3 - fhmaxhf = 0 - fhouthf = 3 - ccpp_suite = '_ccpp_suite_' + blocksize = 40 + chksum_debug = .false. + dycore_only = .false. + fdiag = 3 + avg_max_length = 3600. + fhmax = _fhmax_ + fhout = 3 + fhmaxhf = 0 + fhouthf = 3 + ccpp_suite = '_ccpp_suite_' +/ + + &diag_manager_nml + prepend_date = .false. / -&diag_manager_nml - prepend_date = .false. + &mpp_io_nml + header_buffer_val = 16384, + global_field_on_root_pe = .true., + io_clocks_on = .false., + shuffle = 0, + deflate_level = _deflate_level_, + cf_compliance = .false. / &fms_io_nml @@ -71,10 +80,10 @@ beta = 0. a_imp = 1. p_fac = 0.1 - k_split = 1 - n_split = 7 + k_split = _k_split_ + n_split = _n_split_ nwat = 6 - na_init = 1 + na_init = _na_init_ d_ext = 0.0 dnats = 1 fv_sg_adj = 300 @@ -86,11 +95,11 @@ delt_max = 0.002 ke_bg = 0. do_vort_damp = .T. - external_ic = .T. + external_ic = _external_ic_ external_eta = .T. gfs_phil = .false. - nggps_ic = .T. - mountain = .F. + nggps_ic = _nggps_ic_ + mountain = _mountain_ ncep_ic = .F. d_con = 1.0 hord_mt = 5 @@ -105,7 +114,7 @@ fill = .T. dwind_2d = .F. print_freq = 3 - warm_start = .F. + warm_start = _warm_start_ no_dycore = .false. z_tracer = .T. agrid_vel_rst = .true. @@ -164,8 +173,8 @@ ncld = 5 imp_physics = 11 pdfcld = .false. - fhswr = 1800. - fhlwr = 1800. + fhswr = 900. + fhlwr = 900. ialb = 1 iems = 1 iaer = 111 @@ -180,10 +189,11 @@ cal_pre = .false. redrag = .true. dspheat = .true. - hybedmf = .true. + hybedmf = .false. hurr_pbl = .T. ! HWRF moninedmf moninq_fac = -1.0 ! HWRF_moninedmf - satmedmf = .false. + satmedmf = .true. + isatmedmf = 1 random_clds = .false. trans_trac = .true. cnvcld = .true. @@ -347,9 +357,11 @@ FSNOS = 99999, FSICS = 99999, / -&nam_stochy + + &nam_stochy / -&nam_sfcperts + + &nam_sfcperts / &cires_ugwp_nml diff --git a/parm/forecast/globnest/input_nest02.nml.tmp b/parm/forecast/globnest/input_nest02.nml.tmp index 47a26dc36..6cad24000 100644 --- a/parm/forecast/globnest/input_nest02.nml.tmp +++ b/parm/forecast/globnest/input_nest02.nml.tmp @@ -1,27 +1,36 @@ &amip_interp_nml - interp_oi_sst = .true. - use_ncep_sst = .true. - use_ncep_ice = .false. - no_anom_sst = .false. - data_set = 'reynolds_oi' - date_out_of_range = 'climo' + interp_oi_sst = .true. + use_ncep_sst = .true. + use_ncep_ice = .false. + no_anom_sst = .false. + data_set = 'reynolds_oi' + date_out_of_range = 'climo' / &atmos_model_nml - blocksize = 32 - chksum_debug = .false. - dycore_only = .false. - fdiag = 3 - avg_max_length = 3600. - fhmax = _fhmax_ - fhout = 3 - fhmaxhf = 0 - fhouthf = 3 - ccpp_suite = '_ccpp_suite_' + blocksize = 40 + chksum_debug = .false. + dycore_only = .false. + fdiag = 3 + avg_max_length = 3600. + fhmax = _fhmax_ + fhout = 3 + fhmaxhf = 0 + fhouthf = 3 + ccpp_suite = '_ccpp_suite_' +/ + + &diag_manager_nml + prepend_date = .false. / -&diag_manager_nml - prepend_date = .false. + &mpp_io_nml + header_buffer_val = 16384, + global_field_on_root_pe = .true., + io_clocks_on = .false., + shuffle = 0, + deflate_level = _deflate_level_, + cf_compliance = .false. / &fms_io_nml @@ -71,10 +80,10 @@ beta = 0. a_imp = 1. p_fac = 0.1 - k_split = 4 - n_split = 5 + k_split = _k_split_ + n_split = _n_split_ nwat = 6 - na_init = 1 + na_init = _na_init_ d_ext = 0.0 dnats = 1 fv_sg_adj = 300 @@ -86,11 +95,11 @@ delt_max = 0.008 ke_bg = 0. do_vort_damp = .T. - external_ic = .T. + external_ic = _external_ic_ external_eta = .T. gfs_phil = .false. - nggps_ic = .T. - mountain = .F. + nggps_ic = _nggps_ic_ + mountain = _mountain_ ncep_ic = .F. d_con = 1.0 hord_mt = 6 @@ -105,7 +114,7 @@ fill = .T. dwind_2d = .F. print_freq = 3 - warm_start = .F. + warm_start = _warm_start_ no_dycore = .false. z_tracer = .T. agrid_vel_rst = .true. @@ -153,8 +162,8 @@ ncld = 5 imp_physics = 11 pdfcld = .false. - fhswr = 1800. - fhlwr = 1800. + fhswr = 900. + fhlwr = 900. ialb = 1 iems = 1 iaer = 111 @@ -169,10 +178,11 @@ cal_pre = .false. redrag = .true. dspheat = .true. - hybedmf = .true. + hybedmf = .false. hurr_pbl = .T. ! HWRF moninedmf moninq_fac = -1.0 ! HWRF_moninedmf - satmedmf = .false. + satmedmf = .true. + isatmedmf = 1 random_clds = .false. trans_trac = .true. cnvcld = .true. @@ -336,9 +346,11 @@ FSNOS = 99999, FSICS = 99999, / -&nam_stochy + + &nam_stochy / -&nam_sfcperts + + &nam_sfcperts / &cires_ugwp_nml diff --git a/parm/forecast/globnest_hwrf/input.nml.tmp b/parm/forecast/globnest_hwrf/input.nml.tmp index e169bd631..a6b5440a2 100644 --- a/parm/forecast/globnest_hwrf/input.nml.tmp +++ b/parm/forecast/globnest_hwrf/input.nml.tmp @@ -1,27 +1,36 @@ &amip_interp_nml - interp_oi_sst = .true. - use_ncep_sst = .true. - use_ncep_ice = .false. - no_anom_sst = .false. - data_set = 'reynolds_oi' - date_out_of_range = 'climo' + interp_oi_sst = .true. + use_ncep_sst = .true. + use_ncep_ice = .false. + no_anom_sst = .false. + data_set = 'reynolds_oi' + date_out_of_range = 'climo' / &atmos_model_nml - blocksize = 32 - chksum_debug = .false. - dycore_only = .false. - fdiag = 3 - avg_max_length = 3600. - fhmax = _fhmax_ - fhout = 3 - fhmaxhf = 0 - fhouthf = 3 - ccpp_suite = '_ccpp_suite_' + blocksize = 40 + chksum_debug = .false. + dycore_only = .false. + fdiag = 3 + avg_max_length = 3600. + fhmax = _fhmax_ + fhout = 3 + fhmaxhf = 0 + fhouthf = 3 + ccpp_suite = '_ccpp_suite_' +/ + + &diag_manager_nml + prepend_date = .false. / -&diag_manager_nml - prepend_date = .false. + &mpp_io_nml + header_buffer_val = 16384, + global_field_on_root_pe = .true., + io_clocks_on = .false., + shuffle = 0, + deflate_level = _deflate_level_, + cf_compliance = .false. / &fms_io_nml @@ -71,10 +80,10 @@ beta = 0. a_imp = 1. p_fac = 0.1 - k_split = 1 - n_split = 7 + k_split = _k_split_ + n_split = _n_split_ nwat = 4 - na_init = 1 + na_init = _na_init_ d_ext = 0.0 dnats = 1 fv_sg_adj = 300 @@ -86,11 +95,11 @@ delt_max = 0.002 ke_bg = 0. do_vort_damp = .T. - external_ic = .T. + external_ic = _external_ic_ external_eta = .T. gfs_phil = .false. - nggps_ic = .T. - mountain = .F. + nggps_ic = _nggps_ic_ + mountain = _mountain_ ncep_ic = .F. d_con = 1.0 hord_mt = 5 @@ -104,7 +113,7 @@ fill = .T. dwind_2d = .F. print_freq = 3 - warm_start = .F. + warm_start = _warm_start_ no_dycore = .false. z_tracer = .T. agrid_vel_rst = .true. @@ -174,8 +183,8 @@ hurr_pbl = .T. ! HWRF moninedmf moninq_fac = -1.0 ! HWRF moninedmf pdfcld = .false. - fhswr = 1800. - fhlwr = 1800. + fhswr = 900. + fhlwr = 900. ialb = 1 iems = 1 iaer = 111 @@ -355,9 +364,11 @@ FSNOS = 99999, FSICS = 99999, / -&nam_stochy + + &nam_stochy / -&nam_sfcperts + + &nam_sfcperts / &cires_ugwp_nml diff --git a/parm/forecast/globnest_hwrf/input_nest02.nml.tmp b/parm/forecast/globnest_hwrf/input_nest02.nml.tmp index 987d1c9eb..93951ca0b 100644 --- a/parm/forecast/globnest_hwrf/input_nest02.nml.tmp +++ b/parm/forecast/globnest_hwrf/input_nest02.nml.tmp @@ -1,27 +1,36 @@ &amip_interp_nml - interp_oi_sst = .true. - use_ncep_sst = .true. - use_ncep_ice = .false. - no_anom_sst = .false. - data_set = 'reynolds_oi' - date_out_of_range = 'climo' + interp_oi_sst = .true. + use_ncep_sst = .true. + use_ncep_ice = .false. + no_anom_sst = .false. + data_set = 'reynolds_oi' + date_out_of_range = 'climo' / &atmos_model_nml - blocksize = 32 - chksum_debug = .false. - dycore_only = .false. - fdiag = 3 - avg_max_length = 3600. - fhmax = _fhmax_ - fhout = 3 - fhmaxhf = 0 - fhouthf = 3 - ccpp_suite = '_ccpp_suite_' + blocksize = 40 + chksum_debug = .false. + dycore_only = .false. + fdiag = 3 + avg_max_length = 3600. + fhmax = _fhmax_ + fhout = 3 + fhmaxhf = 0 + fhouthf = 3 + ccpp_suite = '_ccpp_suite_' +/ + + &diag_manager_nml + prepend_date = .false. / -&diag_manager_nml - prepend_date = .false. + &mpp_io_nml + header_buffer_val = 16384, + global_field_on_root_pe = .true., + io_clocks_on = .false., + shuffle = 0, + deflate_level = _deflate_level_, + cf_compliance = .false. / &fms_io_nml @@ -71,10 +80,10 @@ beta = 0. a_imp = 1. p_fac = 0.1 - k_split = 4 - n_split = 5 + k_split = _k_split_ + n_split = _n_split_ nwat = 4 - na_init = 1 + na_init = _na_init_ d_ext = 0.0 dnats = 1 fv_sg_adj = 300 @@ -86,11 +95,11 @@ delt_max = 0.008 ke_bg = 0. do_vort_damp = .T. - external_ic = .T. + external_ic = _external_ic_ external_eta = .T. gfs_phil = .false. - nggps_ic = .T. - mountain = .F. + nggps_ic = _nggps_ic_ + mountain = _mountain_ ncep_ic = .F. d_con = 1.0 hord_mt = 6 @@ -105,7 +114,7 @@ fill = .T. dwind_2d = .F. print_freq = 3 - warm_start = .F. + warm_start = _warm_start_ no_dycore = .false. z_tracer = .T. agrid_vel_rst = .true. @@ -164,8 +173,8 @@ hurr_pbl = .T. ! HWRF moninedmf moninq_fac = -1.0 ! HWRF moninedmf pdfcld = .false. - fhswr = 1800. - fhlwr = 1800. + fhswr = 900. + fhlwr = 900. ialb = 1 iems = 1 iaer = 111 @@ -187,7 +196,7 @@ cnvcld = .true. imfshalcnv = 2 imfdeepcnv = 2 - cdmbgwd = 3.5, 0.01 + cdmbgwd = 0.88, 0.04 sfc_z0_type = 4 !HWRF prslrd0 = 0. ivegsrc = 1 @@ -345,9 +354,11 @@ FSNOS = 99999, FSICS = 99999, / -&nam_stochy + + &nam_stochy / -&nam_sfcperts + + &nam_sfcperts / &cires_ugwp_nml diff --git a/parm/forecast/globnest_hwrf/nems.configure.atmonly b/parm/forecast/globnest_hwrf/nems.configure.atmonly index 88633a425..fe59cc645 100644 --- a/parm/forecast/globnest_hwrf/nems.configure.atmonly +++ b/parm/forecast/globnest_hwrf/nems.configure.atmonly @@ -1,5 +1,18 @@ EARTH_component_list: ATM + ATM_model: fv3 + runSeq:: ATM :: + +ATM_attributes:: +:: + +DRIVER_attributes:: + start_type = startup +:: + +ALLCOMP_attributes:: + mediator_read_restart = false +:: diff --git a/parm/forecast/regional/field_table b/parm/forecast/regional/field_table index 7719eb2e0..1f61d0054 100644 --- a/parm/forecast/regional/field_table +++ b/parm/forecast/regional/field_table @@ -30,6 +30,11 @@ "longname", "ozone mixing ratio" "units", "kg/kg" "profile_type", "fixed", "surface_value=1.e30" / +# prognostic subgrid scale turbulent kinetic energy + "TRACER", "atmos_mod", "sgs_tke" + "longname", "subgrid scale turbulent kinetic energy" + "units", "m2/s2" + "profile_type", "fixed", "surface_value=1.e30" / # non-prognostic cloud amount "TRACER", "atmos_mod", "cld_amt" "longname", "cloud amount" diff --git a/parm/forecast/regional/input.nml.tmp b/parm/forecast/regional/input.nml.tmp index 0f6bc6aeb..84f17b854 100644 --- a/parm/forecast/regional/input.nml.tmp +++ b/parm/forecast/regional/input.nml.tmp @@ -1,28 +1,37 @@ &amip_interp_nml - interp_oi_sst = .true. - use_ncep_sst = .true. - use_ncep_ice = .false. - no_anom_sst = .false. - data_set = 'reynolds_oi' - date_out_of_range = 'climo' + interp_oi_sst = .true. + use_ncep_sst = .true. + use_ncep_ice = .false. + no_anom_sst = .false. + data_set = 'reynolds_oi' + date_out_of_range = 'climo' / &atmos_model_nml - blocksize = 60 - chksum_debug = .false. - dycore_only = .false. - fdiag = 3 - avg_max_length = 3600. - fhmax = _fhmax_ - fhout = 3 - fhmaxhf = 0 - fhouthf = 3 - ccpp_suite = '_ccpp_suite_' - merge_import = _merge_import_ + blocksize = 40 + chksum_debug = .false. + dycore_only = .false. + fdiag = 3 + avg_max_length = 3600. + fhmax = _fhmax_ + fhout = 3 + fhmaxhf = 0 + fhouthf = 3 + ccpp_suite = '_ccpp_suite_' + merge_import = _merge_import_ +/ + + &diag_manager_nml + prepend_date = .false. / -&diag_manager_nml - prepend_date = .false. + &mpp_io_nml + header_buffer_val = 16384, + global_field_on_root_pe = .true., + io_clocks_on = .false., + shuffle = 0, + deflate_level = _deflate_level_, + cf_compliance = .false. / &fms_io_nml @@ -72,10 +81,10 @@ beta = 0. a_imp = 1. p_fac = 0.1 - k_split = 4 - n_split = 5 + k_split = _k_split_ + n_split = _n_split_ nwat = 6 - na_init = 1 + na_init = _na_init_ d_ext = 0.0 dnats = 1 fv_sg_adj = 300 @@ -87,11 +96,11 @@ delt_max = 0.008 ke_bg = 0. do_vort_damp = .T. - external_ic = .T. + external_ic = _external_ic_ external_eta = .T. gfs_phil = .false. - nggps_ic = .T. - mountain = .F. + nggps_ic = _nggps_ic_ + mountain = _mountain_ ncep_ic = .F. d_con = 1.0 hord_mt = 6 @@ -106,7 +115,7 @@ fill = .T. dwind_2d = .F. print_freq = 3 - warm_start = .F. + warm_start = _warm_start_ no_dycore = .false. z_tracer = .T. agrid_vel_rst = .true. @@ -158,8 +167,8 @@ ncld = 5 imp_physics = 11 pdfcld = .false. - fhswr = 1800. - fhlwr = 1800. + fhswr = 900. + fhlwr = 900. ialb = 1 iems = 1 iaer = 111 @@ -174,10 +183,11 @@ cal_pre = .false. redrag = .true. dspheat = .true. - hybedmf = .true. + hybedmf = .false. hurr_pbl = .T. ! HWRF moninedmf moninq_fac = -1.0 ! HWRF_moninedmf - satmedmf = .false. + satmedmf = .true. + isatmedmf = 1 random_clds = .false. trans_trac = .true. cnvcld = .true. @@ -341,9 +351,11 @@ FSNOS = 99999, FSICS = 99999, / -&nam_stochy + + &nam_stochy / -&nam_sfcperts + + &nam_sfcperts / &cires_ugwp_nml diff --git a/parm/forecast/regional_hwrf/input.nml.tmp b/parm/forecast/regional_hwrf/input.nml.tmp index dedcd886f..ab71b9795 100644 --- a/parm/forecast/regional_hwrf/input.nml.tmp +++ b/parm/forecast/regional_hwrf/input.nml.tmp @@ -1,28 +1,37 @@ &amip_interp_nml - interp_oi_sst = .true. - use_ncep_sst = .true. - use_ncep_ice = .false. - no_anom_sst = .false. - data_set = 'reynolds_oi' - date_out_of_range = 'climo' + interp_oi_sst = .true. + use_ncep_sst = .true. + use_ncep_ice = .false. + no_anom_sst = .false. + data_set = 'reynolds_oi' + date_out_of_range = 'climo' / &atmos_model_nml - blocksize = 32 - chksum_debug = .false. - dycore_only = .false. - fdiag = 3 - avg_max_length = 3600. - fhmax = _fhmax_ - fhout = 3 - fhmaxhf = 0 - fhouthf = 3 - ccpp_suite = '_ccpp_suite_' - merge_import = _merge_import_ + blocksize = 40 + chksum_debug = .false. + dycore_only = .false. + fdiag = 3 + avg_max_length = 3600. + fhmax = _fhmax_ + fhout = 3 + fhmaxhf = 0 + fhouthf = 3 + ccpp_suite = '_ccpp_suite_' + merge_import = _merge_import_ +/ + + &diag_manager_nml + prepend_date = .false. / -&diag_manager_nml - prepend_date = .false. + &mpp_io_nml + header_buffer_val = 16384, + global_field_on_root_pe = .true., + io_clocks_on = .false., + shuffle = 0, + deflate_level = _deflate_level_, + cf_compliance = .false. / &fms_io_nml @@ -72,10 +81,10 @@ beta = 0. a_imp = 1. p_fac = 0.1 - k_split = 4 - n_split = 5 + k_split = _k_split_ + n_split = _n_split_ nwat = 4 - na_init = 1 + na_init = _na_init_ d_ext = 0.0 dnats = 1 fv_sg_adj = 300 @@ -87,11 +96,11 @@ delt_max = 0.008 ke_bg = 0. do_vort_damp = .T. - external_ic = .T. + external_ic = _external_ic_ external_eta = .T. gfs_phil = .false. - nggps_ic = .T. - mountain = .F. + nggps_ic = _nggps_ic_ + mountain = _mountain_ ncep_ic = .F. d_con = 1.0 hord_mt = 6 @@ -106,7 +115,7 @@ fill = .T. dwind_2d = .F. print_freq = 3 - warm_start = .F. + warm_start = _warm_start_ no_dycore = .false. z_tracer = .T. agrid_vel_rst = .true. @@ -169,8 +178,8 @@ hurr_pbl = .T. ! HWRF moninedmf moninq_fac = -1.0 ! HWRF moninedmf pdfcld = .false. - fhswr = 3600. - fhlwr = 3600. + fhswr = 900. + fhlwr = 900. ialb = 1 iems = 1 iaer = 111 @@ -192,7 +201,7 @@ cnvcld = .true. imfshalcnv = 2 imfdeepcnv = 2 - cdmbgwd = 3.5, 0.01 + cdmbgwd = 0.88, 0.04 sfc_z0_type = 4 !HWRF prslrd0 = 0. ivegsrc = 1 @@ -216,18 +225,43 @@ nst_anl = .true. nstf_name = _nstf_n1_,_nstf_n2_,_nstf_n3_,_nstf_n4_,_nstf_n5_ cplflx = _cplflx_ + cplwav = .false. + cplwav2atm = .false. psautco = 0.0008, 0.0005 prautco = 0.00015, 0.00015 iau_delthrs = 6 iaufhrs = 30 iau_inc_files = '' + iau_drymassfixer = .false. do_deep = .true. lgfdlmprad = .true. effr_in = .true. do_sppt = .F. do_shum = .F. do_skeb = .F. - do_sfcperts = .F. + lndp_type = 0 + n_var_lndp = 0 + do_ca = .false. + ca_sgs = .false. + nca = 1 + ncells = 5 + nlives = 30 + nseed = 1000000 + nfracseed = 0.5 + nthresh = 0. + ca_trigger = .true. + ca_entr = .false. + ca_closure = .false. + ca_global = .false. + nca_g = 1 + ncells_g = 1 + nlives_g = 100 + nseed_g = 100 + ca_smooth = .false. + nspinup = 100 + iseed_ca = 1 + nsmooth = 1 + ca_amplitude = 0.5 / &gfdl_cloud_microphysics_nml @@ -325,9 +359,11 @@ FSNOS = 99999, FSICS = 99999, / -&nam_stochy + + &nam_stochy / -&nam_sfcperts + + &nam_sfcperts / &cires_ugwp_nml diff --git a/parm/forecast/regional_hwrf/model_configure.tmp b/parm/forecast/regional_hwrf/model_configure.tmp index dae3d8612..29e188091 100644 --- a/parm/forecast/regional_hwrf/model_configure.tmp +++ b/parm/forecast/regional_hwrf/model_configure.tmp @@ -26,7 +26,14 @@ write_groups: _write_groups_ write_tasks_per_group: _write_tasks_per_group_ num_files: 2 filename_base: 'dyn' 'phy' -output_file: 'netcdf' +output_file: 'netcdf_parallel' 'netcdf_parallel' +ichunk2d: -1 +jchunk2d: -1 +ichunk3d: -1 +jchunk3d: -1 +kchunk3d: -1 +ideflate: 1 +nbits: 0 write_nemsioflip: .false. write_fsyncflag: .false. diff --git a/parm/forecast/regional_hwrf/nems.configure.atm_ocn.tmp b/parm/forecast/regional_hwrf/nems.configure.atm_ocn.tmp index a2ec3fb4f..40cf8c3cd 100644 --- a/parm/forecast/regional_hwrf/nems.configure.atm_ocn.tmp +++ b/parm/forecast/regional_hwrf/nems.configure.atm_ocn.tmp @@ -12,10 +12,7 @@ _OCN_petlist_bounds_ # run sequence runSeq:: @_cpl_dt_ - _runSeq_OCN2ATM_ - _runSeq_ATM2OCN_ - _runSeq_ATM_ - _runSeq_OCN_ + _runSeq_ALL_ @ :: @@ -36,7 +33,7 @@ OCN_attributes:: base_dtg = _base_dtg_ merge_import = _merge_import_ skip_first_import = .true. - hycom_arche_output = .true. + hycom_arche_output = .false. hyc_esmf_exp_output = .true. hyc_esmf_imp_output = .true. hyc_impexp_file = dummy_file @@ -49,3 +46,35 @@ OCN_attributes:: end_min = 0 end_sec = 0 :: + +DRIVER_attributes:: + start_type = startup +:: + +ALLCOMP_attributes:: + mediator_read_restart = false +# ScalarFieldCount = 3 +# ScalarFieldIdxGridNX = 1 +# ScalarFieldIdxGridNY = 2 +# ScalarFieldIdxNextSwCday = 3 +# ScalarFieldName = cpl_scalars +:: + +ocn_export_fields:: + 'sst' 'sea_surface_temperature' 'K' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' +# 'mask' 'So_omask' '1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' +:: + +ocn_import_fields:: + 'u10' 'inst_zonal_wind_height10m' 'm_s-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'v10' 'inst_merid_wind_height10m' 'm_s-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'taux10' 'mean_zonal_moment_flx_atm' 'N_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'tauy10' 'mean_merid_moment_flx_atm' 'N_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'airtmp' 'inst_temp_height2m' 'K' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'airhum' 'inst_spec_humid_height2m' 'kg_kg-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'prcp' 'mean_prec_rate' 'kg_m-2_s-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'swflxd' 'mean_net_sw_flx' 'W_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'lwflxd' 'mean_net_lw_flx' 'W_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'mslprs' 'inst_pres_height_surface' 'Pa' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'gt' 'inst_temp_height_surface' 'K' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' +:: diff --git a/parm/forecast/regional_hwrf/nems.configure.atm_ocn_cmeps.tmp b/parm/forecast/regional_hwrf/nems.configure.atm_ocn_cmeps.tmp new file mode 100644 index 000000000..048d65a39 --- /dev/null +++ b/parm/forecast/regional_hwrf/nems.configure.atm_ocn_cmeps.tmp @@ -0,0 +1,98 @@ +# component list +EARTH_component_list: ATM OCN MED + +# component models +ATM_model: fv3 +OCN_model: hycom +MED_model: nems + +# component petLists +_ATM_petlist_bounds_ +_OCN_petlist_bounds_ +_MED_petlist_bounds_ + +# run sequence +runSeq:: + @_cpl_dt_ + _runSeq_ALL_ + @ +:: + +# component attributes + +ATM_attributes:: + Verbosity = 1 + Diagnostic = 0 +:: + +OCN_attributes:: + Verbosity = 1 + Diagnostic = 0 + cdf_impexp_freq = 3 + cpl_hour = 0 + cpl_min = 0 + cpl_sec = _cpl_dt_ + base_dtg = _base_dtg_ + merge_import = _merge_import_ + skip_first_import = .true. + hycom_arche_output = .false. + hyc_esmf_exp_output = .true. + hyc_esmf_imp_output = .true. + hyc_impexp_file = nems.configure + espc_show_impexp_minmax = .true. + ocean_start_dtg = _ocean_start_dtg_ + start_hour = 0 + start_min = 0 + start_sec = 0 + end_hour = _end_hour_ + end_min = 0 + end_sec = 0 +:: + +MED_attributes:: + Verbosity = 1 + Diagnostic = 0 + coupling_mode = hafs + system_type = ufs + normalization = none + merge_type = copy + ATM_model = fv3 + OCN_model = hycom + history_ymd = -999 + ScalarFieldCount = 0 + ScalarFieldIdxGridNX = 0 + ScalarFieldIdxGridNY = 0 + ScalarFieldName = cpl_scalars +:: + +DRIVER_attributes:: + start_type = startup +:: + +ALLCOMP_attributes:: + mediator_read_restart = false +# ScalarFieldCount = 3 +# ScalarFieldIdxGridNX = 1 +# ScalarFieldIdxGridNY = 2 +# ScalarFieldIdxNextSwCday = 3 +# ScalarFieldName = cpl_scalars +:: + +ocn_export_fields:: + 'sst' 'sea_surface_temperature' 'K' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'mask' 'So_omask' '1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' +:: + +ocn_import_fields:: + 'u10' 'inst_zonal_wind_height10m' 'm_s-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'v10' 'inst_merid_wind_height10m' 'm_s-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'taux10' 'mean_zonal_moment_flx_atm' 'N_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'tauy10' 'mean_merid_moment_flx_atm' 'N_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'airtmp' 'inst_temp_height2m' 'K' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'airhum' 'inst_spec_humid_height2m' 'kg_kg-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'prcp' 'mean_prec_rate' 'kg_m-2_s-1' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'swflxd' 'mean_net_sw_flx' 'W_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'lwflxd' 'mean_net_lw_flx' 'W_m-2' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'mslprs' 'inst_pres_height_surface' 'Pa' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' + 'gt' 'inst_temp_height_surface' 'K' '.TRUE.' 'FLD_REMAP_BILINR' 'FLD_MASK_NNE' '1' +:: diff --git a/parm/forecast/regional_hwrf/nems.configure.atmonly b/parm/forecast/regional_hwrf/nems.configure.atmonly index 88633a425..fe59cc645 100644 --- a/parm/forecast/regional_hwrf/nems.configure.atmonly +++ b/parm/forecast/regional_hwrf/nems.configure.atmonly @@ -1,5 +1,18 @@ EARTH_component_list: ATM + ATM_model: fv3 + runSeq:: ATM :: + +ATM_attributes:: +:: + +DRIVER_attributes:: + start_type = startup +:: + +ALLCOMP_attributes:: + mediator_read_restart = false +:: diff --git a/parm/hafs.conf b/parm/hafs.conf index 8c476f3bb..0cac7f303 100644 --- a/parm/hafs.conf +++ b/parm/hafs.conf @@ -67,6 +67,13 @@ tar=tar ;; GNU Tar htar=htar ;; HTAR tape archiving program hsi=hsi ;; hsi tape manipulation program +wgrib2={ENV[WGRIB2]} +cnvgrib={ENV[CNVGRIB]} +wgrib={ENV[WGRIB]} +grbindex={ENV[GRIBINDEX]} +copygb2={ENV[COPYGB2]} +grb2index={ENV[GRB2INDEX]} + # hafs_forecast forecast={EXEChafs}/hafs_forecast.x @@ -139,11 +146,27 @@ halo=3 ;; halo size to be used in the atmosphere cubic sphere mode halop1=4 ;; halo size that will be used for the orography and grid tile in chgres halo0=0 ;; no halo, used to shave the filtered orography for use in the model +[grid_ens] +CASE_ENS={grid/CASE} ;; FV3 resolution +LEVS_ENS={grid/LEVS} ;; Model vertical levels: 65 +gtype_ens={grid/gtype} ;; grid type: uniform, stretch, nest, or regional +gridfixdir_ens={grid/gridfixdir} +stretch_fac_ens={grid/stretch_fac} ;; Stretching factor for the grid +target_lon_ens={grid/target_lon} ;; center longitude of the highest resolution tile +target_lat_ens={grid/target_lat} ;; center latitude of the highest resolution tile +refine_ratio_ens={grid/refine_ratio} ;; Specify the refinement ratio for nest grid +istart_nest_ens={grid/istart_nest} +jstart_nest_ens={grid/jstart_nest} +iend_nest_ens={grid/iend_nest} +jend_nest_ens={grid/jend_nest} + [input] -[chgres_ic] +[atm_ic] + +[atm_lbc] -[chgres_bc] +[chgres] [vortexinit] @@ -151,7 +174,10 @@ halo0=0 ;; no halo, used to shave the filtered orography for use in [fgat] +[gsi_vr] + [gsi] +use_bufr_nr=no ;; use non-restricted version of observational bufr files [enkf] @@ -159,9 +185,9 @@ halo0=0 ;; no halo, used to shave the filtered orography for use in [forecast] # ccpp suites -ccpp_suite_regional=HAFS_v0_gfdlmp -ccpp_suite_glob=HAFS_v0_gfdlmp -ccpp_suite_nest=HAFS_v0_gfdlmp +ccpp_suite_regional=HAFS_v0_gfdlmp_tedmf +ccpp_suite_glob=HAFS_v0_gfdlmp_tedmf +ccpp_suite_nest=HAFS_v0_gfdlmp_tedmf # nsst related namelist options # Choose nstf_name=2,0,0,0,0 when nemsio type ictype @@ -176,11 +202,15 @@ nstf_n5=0 dt_atmos=90 ;; FV3 time step restart_interval=0 ;; FV3 restart interval in hours # For the global domain if it exists in the model configuration +glob_k_split=1 +glob_n_split=7 glob_layoutx=8 glob_layouty=8 glob_npx=769 glob_npy=769 # For the nested or regional standalone domain +k_split=4 +n_split=5 layoutx=40 layouty=30 npx=2561 @@ -231,8 +261,47 @@ ocean_tasks=60 ;; Number of PEs for the OCN component ocean_start_dtg=auto ;; epoch day since hycom_epoch=datetime.datetime(1900,12,31,0,0,0), e.g., 43340.00000 merge_import=.true. -[post] -# Grid definition for post and tracker, used by wgrib2 +[forecast_ens] +# ccpp suites +ccpp_suite_regional_ens={forecast/ccpp_suite_regional} +ccpp_suite_glob_ens={forecast/ccpp_suite_glob} +ccpp_suite_nest_ens={forecast/ccpp_suite_nest} + +# Some options for FV3 model_configure +dt_atmos_ens={forecast/dt_atmos} +restart_interval_ens={forecast/restart_interval} +# For the global domain if it exists in the model configuration +glob_k_split_ens={forecast/glob_k_split} +glob_n_split_ens={forecast/glob_n_split} +glob_layoutx_ens={forecast/glob_layoutx} +glob_layouty_ens={forecast/glob_layouty} +glob_npx_ens={forecast/glob_npx} +glob_npy_ens={forecast/glob_npy} +# For the nested or regional standalone domain +k_split_ens={forecast/k_split} +n_split_ens={forecast/n_split} +layoutx_ens={forecast/layoutx} +layouty_ens={forecast/layouty} +npx_ens={forecast/npx} +npy_ens={forecast/npy} +npz_ens={forecast/npz} + +# The write_grid_component related options +quilting_ens={forecast/quilting} +write_groups_ens={forecast/write_groups} +write_tasks_per_group_ens={forecast/write_tasks_per_group} + +# Placeholders currently, not implemented yet +output_grid_ens={forecast/output_grid_ens} +output_grid_cen_lon_ens={forecast/output_grid_cen_lon_ens} +output_grid_cen_lat_ens={forecast/output_grid_cen_lat_ens} +output_grid_lon_span_ens={forecast/output_grid_lon_span_ens} +output_grid_lat_span_ens={forecast/output_grid_lat_span_ens} +output_grid_dlon_ens={forecast/output_grid_dlon_ens} +output_grid_dlat_ens={forecast/output_grid_dlat_ens} + +[atm_post] +# Grid definition for atm_post and tracker, used by wgrib2 # Example: # synop_gridspecs="latlon 246.6:4112:0.025 -2.4:1976:0.025" # latlon lon0:nlon:dlon lat0:nlat:dlat @@ -256,6 +325,10 @@ merge_import=.true. synop_gridspecs=auto trker_gridspecs={synop_gridspecs} ;; Currently a placeholder, and the traker uses the same grid as the output grid +[atm_post_ens] +synop_gridspecs_ens=auto +trker_gridspecs_ens={synop_gridspecs_ens} ;; Currently a placeholder, and the traker uses the same grid as the output grid + [product] [tracker] @@ -289,7 +362,14 @@ GFSVER={config/GFSVER} ;; Version of GFS input data, e.g., PROD2019 # Variables to set as boolean values when parsing the hafs_workflow.xml.in. # They'll be changed to YES or NO. This section is only used by the rocoto-based workflow. [rocotobool] +RUN_GSI_VR={run_gsi_vr} ;; Do we run GSI based vortex relocation? +RUN_GSI_VR_FGAT={run_gsi_vr_fgat} ;; Do we run GSI based vortex relocation for FGAT? +RUN_GSI_VR_ENS={run_gsi_vr_ens} ;; Do we run GSI based vortex relocation for ensda members? RUN_GSI={run_gsi} ;; Do we run GSI? +RUN_FGAT={run_fgat} ;; Do we run DA with FGAT? +RUN_ENVAR={run_envar} ;; Do we run hybrid EnVar with either GDAS ensembles or regional ensembles? +RUN_ENSDA={run_ensda} ;; Do we run the ensda system? +RUN_ENKF={run_enkf} ;; Do we run the self-cycled ensda system with EnKF analysis RUN_OCEAN={run_ocean} ;; Do we run with ocean coupling? RUN_WAVE={run_wave} ;; Do we run with wave coupling? RUN_VORTEXINIT={run_vortexinit} ;; Do we enable vortex initialization? diff --git a/parm/hafs_basic.conf b/parm/hafs_basic.conf index 14c2f9269..2b12b3d0c 100644 --- a/parm/hafs_basic.conf +++ b/parm/hafs_basic.conf @@ -19,22 +19,43 @@ global_stormlabel=storm{global_storm_num} cycling_interval=6.0 ;; Cycling interval in hours NHRS=126 ;; Length of the forecast in hours NBDYHRS=3 ;; Interval in hours of the input lateral boundary conditions +NHRS_ENS=6 ;; Length of the forecast in hours for ensda members +NBDYHRS_ENS=6 ;; Interval in hours of the input lateral boundary conditions for ensda members + +ENS_SIZE=4 ;; The ensemble size for the ensda system +GRID_RATIO_ENS=1 ;; Grid resolution ratio of the ensda system to the high-resolution deterministic system, to be used by GSI GFSVER=PROD2021 ;; GFS version ictype=gfsnetcdf ;; Input initial condition type: gfsnetcdf, gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2ab_0p25, gfsgrib2_0p50, gfsgrib2_1p00 bctype=gfsgrib2ab_0p25 ;; Input boundary condition type: gfsnetcdf, gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2ab_0p25, gfsgrib2_0p50, gfsgrib2_1p00 -vcoord_file_target_grid={PARMhafs}/chgres/hafs_hyblev.l{LEVS}.txt ;; Vertical level distributions with ak, bk values +ictype_ens=gfsnetcdf ;; Input initial condition type for ensembles: gfsnetcdf, gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2ab_0p25, gfsgrib2_0p50, gfsgrib2_1p00 +bctype_ens=gfsnetcdf ;; Input boundary condition type for ensembles: gfsnetcdf, gfsnemsio, gfsgrib2_master, gfsgrib2_0p25, gfsgrib2ab_0p25, gfsgrib2_0p50, gfsgrib2_1p00 + +vcoord_file_target_grid={PARMhafs}/levels/hafs_hyblev.l{LEVS}.txt ;; Vertical level distributions with ak, bk values halo_blend=10 ;; Number of rows for lateral boundary blending for the regional configuration # Enable or disable parts of the workflow run_vortexinit=no ;; vortex initialization +run_gsi_vr=no ;; GSI based vortex relocation +run_gsi_vr_fgat=no ;; GSI based vortex relocation for FGAT +run_gsi_vr_ens=no ;; GSI based vortex relocation for ensda members run_gsi=no ;; GSI and FGAT initialization +run_fgat=no ;; Enable FGAT in DA +run_envar=no ;; Run GSI with hybrid EnVar with either GDAS ensembles or regional ensembles +run_ensda=no ;; Run ensemble data assimilation system +run_enkf=no ;; Run self-cycled ensemble data assimilation system with EnKF analysis run_wave=no ;; Wave coupling (placeholder) run_ocean=no ;; Ocean coupling ocean_model=hycom run_hrdgraphics=no ;; Run HRD graphics run_emcgraphics=no ;; Run EMC graphics +# warm_start_opt: 0, coldstart from chgres; 1, warmstart from init; 2, +# warmstart from prior cycle's restart files; 3, warmstart from vortex +# initialization; 4, warmstart from DA based vortex relocation; 5, warmstart +# from DA analysis. Note: currently, this option will be overwritten by the run_vortexinit, run_gsi_vr, run_gsi options, if incompatible. +warm_start_opt=0 ;; Warm start option + # Scrub options scrub=no ;; do we delete temporary files? (placeholder) scrub_com=yes ;; Do we scrub the com directory? diff --git a/parm/hafs_holdvars.conf b/parm/hafs_holdvars.conf index bcee3deae..f90b1206e 100644 --- a/parm/hafs_holdvars.conf +++ b/parm/hafs_holdvars.conf @@ -12,8 +12,15 @@ [holdvars] COMIN={com} ;; Input com directory COMOUT={com} ;; output com directory +RUN_GSI_VR={cap_run_gsi_vr} ;; Do we run GSI based vortex relocation? +RUN_GSI_VR_FGAT={cap_run_gsi_vr_fgat} ;; Do we run GSI based vortex relocation for FGAT? +RUN_GSI_VR_ENS={cap_run_gsi_vr_ens} ;; Do we run GSI based vortex relocation for ensda members? RUN_GSI={cap_run_gsi} ;; Do we run GSI? -RUN_VORTEXINIT={cap_run_vortexinit} ;; Do we run vortex initialization? +RUN_FGAT={cap_run_fgat} ;; Do we run DA with FGAT? +RUN_ENVAR={cap_run_envar} ;; Do we run hybrid EnVar with either GDAS ensembles or regional ensembles? +RUN_ENSDA={cap_run_ensda} ;; Do we run the ensda system? +RUN_ENKF={cap_run_enkf} ;; Do we run the self-cycled ensda system with EnKF analysis? +RUN_VORTEXINIT={cap_run_vortexinit} ;; Do we run vortex initialization? RUN_HRDGRAPHICS={cap_run_hrdgraphics} ;; Do we run HRD graphics? GSID01={cap_run_gsi} ;; Do we run GSI for domain 1? GSID02={cap_run_gsi} ;; Do we run GSI for domain 2? @@ -27,10 +34,6 @@ ENVEQUIV={WHERE_AM_I} ;; Present cluster name #JET_NAME={ENV[JET_NAME]} #WHERE_AM_I={ENV[ENVEQUIV]} -ccpp_suite_regional={forecast/ccpp_suite_regional} -ccpp_suite_glob={forecast/ccpp_suite_glob} -ccpp_suite_nest={forecast/ccpp_suite_nest} - nstf_n1={forecast/nstf_n1} nstf_n2={forecast/nstf_n2} nstf_n3={forecast/nstf_n3} @@ -53,17 +56,66 @@ halo={grid/halo} halop1={grid/halop1} halo0={grid/halo0} +# ENSDA related items +CASE_ENS={grid_ens/CASE_ENS} +LEVS_ENS={grid_ens/LEVS_ENS} +gtype_ens={grid_ens/gtype_ens} +gridfixdir_ens={grid_ens/gridfixdir_ens} +stretch_fac_ens={grid_ens/stretch_fac_ens} +target_lon_ens={grid_ens/target_lon_ens} +target_lat_ens={grid_ens/target_lat_ens} +refine_ratio_ens={grid_ens/refine_ratio_ens} +istart_nest_ens={grid_ens/istart_nest_ens} +jstart_nest_ens={grid_ens/jstart_nest_ens} +iend_nest_ens={grid_ens/iend_nest_ens} +jend_nest_ens={grid_ens/jend_nest_ens} + +ccpp_suite_regional_ens={forecast_ens/ccpp_suite_regional_ens} +ccpp_suite_glob_ens={forecast_ens/ccpp_suite_glob_ens} +ccpp_suite_nest_ens={forecast_ens/ccpp_suite_nest_ens} + +dt_atmos_ens={forecast_ens/dt_atmos_ens} +restart_interval_ens={forecast_ens/restart_interval_ens} +quilting_ens={forecast_ens/quilting_ens} +write_groups_ens={forecast_ens/write_groups_ens} +write_tasks_per_group_ens={forecast_ens/write_tasks_per_group_ens} + +glob_k_split_ens={forecast_ens/glob_k_split_ens} +glob_n_split_ens={forecast_ens/glob_n_split_ens} +glob_layoutx_ens={forecast_ens/glob_layoutx_ens} +glob_layouty_ens={forecast_ens/glob_layouty_ens} +glob_npx_ens={forecast_ens/glob_npx_ens} +glob_npy_ens={forecast_ens/glob_npy_ens} + +k_split_ens={forecast_ens/k_split_ens} +n_split_ens={forecast_ens/n_split_ens} +layoutx_ens={forecast_ens/layoutx_ens} +layouty_ens={forecast_ens/layouty_ens} +npx_ens={forecast_ens/npx_ens} +npy_ens={forecast_ens/npy_ens} +npz_ens={forecast_ens/npz_ens} + +use_bufr_nr={gsi/use_bufr_nr} + +ccpp_suite_regional={forecast/ccpp_suite_regional} +ccpp_suite_glob={forecast/ccpp_suite_glob} +ccpp_suite_nest={forecast/ccpp_suite_nest} + dt_atmos={forecast/dt_atmos} restart_interval={forecast/restart_interval} quilting={forecast/quilting} write_groups={forecast/write_groups} write_tasks_per_group={forecast/write_tasks_per_group} +glob_k_split={forecast/glob_k_split} +glob_n_split={forecast/glob_n_split} glob_layoutx={forecast/glob_layoutx} glob_layouty={forecast/glob_layouty} glob_npx={forecast/glob_npx} glob_npy={forecast/glob_npy} +k_split={forecast/k_split} +n_split={forecast/n_split} layoutx={forecast/layoutx} layouty={forecast/layouty} npx={forecast/npx} @@ -81,8 +133,41 @@ output_grid_lat2={forecast/output_grid_lat2} output_grid_dlon={forecast/output_grid_dlon} output_grid_dlat={forecast/output_grid_dlon} -synop_gridspecs={synop_gridspecs} -trker_gridspecs={trker_gridspecs} +synop_gridspecs={atm_post/synop_gridspecs} +trker_gridspecs={atm_post/trker_gridspecs} + +# ENSDA related items +CASE_ENS={grid_ens/CASE_ENS} +LEVS_ENS={grid_ens/LEVS_ENS} +gtype_ens={grid_ens/gtype_ens} +gridfixdir_ens={grid_ens/gridfixdir_ens} +stretch_fac_ens={grid_ens/stretch_fac_ens} +target_lon_ens={grid_ens/target_lon_ens} +target_lat_ens={grid_ens/target_lat_ens} +refine_ratio_ens={grid_ens/refine_ratio_ens} +istart_nest_ens={grid_ens/istart_nest_ens} +jstart_nest_ens={grid_ens/jstart_nest_ens} +iend_nest_ens={grid_ens/iend_nest_ens} +jend_nest_ens={grid_ens/jend_nest_ens} +ccpp_suite_regional_ens={forecast_ens/ccpp_suite_regional_ens} +ccpp_suite_glob_ens={forecast_ens/ccpp_suite_glob_ens} +ccpp_suite_nest_ens={forecast_ens/ccpp_suite_nest_ens} +dt_atmos_ens={forecast_ens/dt_atmos_ens} +restart_interval_ens={forecast_ens/restart_interval_ens} +quilting_ens={forecast_ens/quilting_ens} +write_groups_ens={forecast_ens/write_groups_ens} +write_tasks_per_group_ens={forecast_ens/write_tasks_per_group_ens} +glob_layoutx_ens={forecast_ens/glob_layoutx_ens} +glob_layouty_ens={forecast_ens/glob_layouty_ens} +glob_npx_ens={forecast_ens/glob_npx_ens} +glob_npy_ens={forecast_ens/glob_npy_ens} +layoutx_ens={forecast_ens/layoutx_ens} +layouty_ens={forecast_ens/layouty_ens} +npx_ens={forecast_ens/npx_ens} +npy_ens={forecast_ens/npy_ens} +npz_ens={forecast_ens/npz_ens} +synop_gridspecs_ens={atm_post_ens/synop_gridspecs_ens} +trker_gridspecs_ens={atm_post_ens/trker_gridspecs_ens} cpl_dt={forecast/cpl_dt} cpl_ocean={forecast/cpl_ocean} diff --git a/parm/hafs_holdvars.txt b/parm/hafs_holdvars.txt index 935d57ca4..3a4f69c5b 100644 --- a/parm/hafs_holdvars.txt +++ b/parm/hafs_holdvars.txt @@ -8,7 +8,14 @@ export envir={ENV[envir|-prod]} export storm_num={storm_num} export RUN_HRDGRAPHICS={RUN_HRDGRAPHICS} export RUN_VORTEXINIT={RUN_VORTEXINIT} +export RUN_GSI_VR={RUN_GSI_VR} +export RUN_GSI_VR_FGAT={RUN_GSI_VR_FGAT} +export RUN_GSI_VR_ENS={RUN_GSI_VR_ENS} export RUN_GSI={RUN_GSI} +export RUN_FGAT={RUN_FGAT} +export RUN_ENVAR={RUN_ENVAR} +export RUN_ENSDA={RUN_ENSDA} +export RUN_ENKF={RUN_ENKF} export GSID01={GSID01} export GSID02={GSID02} export GSID03={GSID03} @@ -16,6 +23,8 @@ export FGATSTR={FGATSTR} export FGATINV={FGATINV} export FGATEND={FGATEND} +export warm_start_opt={warm_start_opt} + export utilexec={utilexec} export HOMEhafs={HOMEhafs} @@ -49,12 +58,10 @@ export NBDYHRS={NBDYHRS} export GFSVER={GFSVER} export ictype={ictype} export bctype={bctype} +export ictype_ens={ictype_ens} +export bctype_ens={bctype_ens} export halo_blend={halo_blend} -export ccpp_suite_regional={ccpp_suite_regional} -export ccpp_suite_glob={ccpp_suite_glob} -export ccpp_suite_nest={ccpp_suite_nest} - export nstf_n1={nstf_n1} export nstf_n2={nstf_n2} export nstf_n3={nstf_n3} @@ -79,17 +86,27 @@ export halo0={halo0} export vcoord_file_target_grid={vcoord_file_target_grid} +export use_bufr_nr={use_bufr_nr} + +export ccpp_suite_regional={ccpp_suite_regional} +export ccpp_suite_glob={ccpp_suite_glob} +export ccpp_suite_nest={ccpp_suite_nest} + export dt_atmos={dt_atmos} export restart_interval={restart_interval} export quilting={quilting} export write_groups={write_groups} export write_tasks_per_group={write_tasks_per_group} +export glob_k_split={glob_k_split} +export glob_n_split={glob_n_split} export glob_layoutx={glob_layoutx} export glob_layouty={glob_layouty} export glob_npx={glob_npx} export glob_npy={glob_npy} +export k_split={k_split} +export n_split={n_split} export layoutx={layoutx} export layouty={layouty} export npx={npx} @@ -112,6 +129,45 @@ export out_prefix_nodate={out_prefix_nodate} export synop_gridspecs={synop_gridspecs} export trker_gridspecs={trker_gridspecs} +# ENSDA related items +export ENS_SIZE={ENS_SIZE} +export GRID_RATIO_ENS={GRID_RATIO_ENS} +export NHRS_ENS={NHRS_ENS} +export NBDYHRS_ENS={NBDYHRS_ENS} +export CASE_ENS={CASE_ENS} +export LEVS_ENS={LEVS_ENS} +export gtype_ens={gtype_ens} +export gridfixdir_ens={gridfixdir_ens} +export stretch_fac_ens={stretch_fac_ens} +export target_lon_ens={target_lon_ens} +export target_lat_ens={target_lat_ens} +export refine_ratio_ens={refine_ratio_ens} +export istart_nest_ens={istart_nest_ens} +export jstart_nest_ens={jstart_nest_ens} +export iend_nest_ens={iend_nest_ens} +export jend_nest_ens={jend_nest_ens} +export ccpp_suite_regional_ens={ccpp_suite_regional_ens} +export ccpp_suite_glob_ens={ccpp_suite_glob_ens} +export ccpp_suite_nest_ens={ccpp_suite_nest_ens} +export dt_atmos_ens={dt_atmos_ens} +export restart_interval_ens={restart_interval_ens} +export quilting_ens={quilting_ens} +export write_groups_ens={write_groups_ens} +export write_tasks_per_group_ens={write_tasks_per_group_ens} +export k_split_ens={k_split_ens} +export n_split_ens={n_split_ens} +export glob_layoutx_ens={glob_layoutx_ens} +export glob_layouty_ens={glob_layouty_ens} +export glob_npx_ens={glob_npx_ens} +export glob_npy_ens={glob_npy_ens} +export layoutx_ens={layoutx_ens} +export layouty_ens={layouty_ens} +export npx_ens={npx_ens} +export npy_ens={npy_ens} +export npz_ens={npz_ens} +export synop_gridspecs_ens={synop_gridspecs_ens} +export trker_gridspecs_ens={trker_gridspecs_ens} + export run_ocean={run_ocean} export ocean_model={ocean_model} export cpl_dt={cpl_dt} @@ -130,7 +186,6 @@ export CENLO={domlon} export CENLA={domlat} if [[ "$RUN_ENVIR" != "NCO" && "$RUN_ENVIR" != "nco" ]] ; then - export NWPROD={HOMEhafs}/nwport export EXPT={EXPT} export SUBEXPT={SUBEXPT} export WHERE_AM_I={ENVEQUIV} diff --git a/parm/hafs_hycom.conf b/parm/hafs_hycom.conf index 03d95ee30..2c492fe25 100644 --- a/parm/hafs_hycom.conf +++ b/parm/hafs_hycom.conf @@ -15,7 +15,7 @@ CASE_ROOT={config/case_root} [forecast] # Turn off nsst -ccpp_suite_regional=HAFS_v0_gfdlmp_nonsst +ccpp_suite_regional=HAFS_v0_gfdlmp_tedmf_nonsst # Choose nstf_name=0,0,0,0,0 nstf_n1=0 nstf_n2=0 @@ -36,19 +36,15 @@ ocean_tasks=60 ;; Number of PEs for the OCN component ocean_start_dtg=auto ;; epoch day since hycom_epoch=datetime.datetime(1900,12,31,0,0,0), e.g., 43340.00000 merge_import=.true. +[forecast_ens] +ccpp_suite_regional_ens=HAFS_v0_gfdlmp_tedmf_nonsst + +# [rocotostr] FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_ocn{forecast/ocean_tasks}_omp2 +FORECAST_ENS_RESOURCES=FORECAST_ENS_RESOURCES_regional_{forecast_ens/layoutx_ens}x{forecast_ens/layouty_ens}io{forecast_ens/write_groups_ens}x{forecast_ens/write_tasks_per_group_ens}_ocn{forecast/ocean_tasks}_omp2 [exe] -wgrib2={ENV[WGRIB2]} -cnvgrib={ENV[CNVGRIB]} - -wgrib={ENV[WGRIB]} -grbindex={ENV[GRIBINDEX]} - -copygb2={ENV[COPYGB2]} -grb2index={ENV[GRB2INDEX]} - hafs_get_rtofs={EXEChafs}/hafs_get_rtofs.x hafs_rtofs_subregion={EXEChafs}/hafs_rtofs_subregion.x hafs_gfs2ofs2={EXEChafs}/hafs_gfs2ofs2.x diff --git a/parm/hafs_regional_da_C96s1n4_320x312.conf b/parm/hafs_regional_da_C96s1n4_320x312.conf new file mode 100644 index 000000000..18d30d992 --- /dev/null +++ b/parm/hafs_regional_da_C96s1n4_320x312.conf @@ -0,0 +1,93 @@ +# This is a UNIX conf file that contains ALL information relating to +# the HAFS C96 regional configuration. +# Note: These are just example settings. Of course, when model resoltion +# changes, one should also modify the model time step and other related +# dynamics and physics options, so that they work fine for the desired model +# resolution. +[config] +# Specify the domain center Latitude and Longitude +domlat=22.0 +domlon=-62.0 +# Same as domlat and domlon but vitals formatted +vitalsdomlat=220N +vitalsdomlon=620W + +# HAFS launcher requires vitals and a storm. +# This is a default minimum vitals file for a fake storm. +# The format of the missing value fields was based on the log +# output returned when running the launcher after the vitals have +# been "cleaned" up. That is, if you enter the fields as all -999 values, +# the "cleaned" output is returned. In essence I'm treating the vitals +# module as a factory in the sense that it knows the correct format. +# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M +# fakestormid is a config option set in the launcher and is the +# last storm id in the list of storms. +fakestormid=00L +fakestormname=NATL +fakestormorg=NHC +fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M + +[dir] +PARMforecast={PARMhafs}/forecast/regional + +[grid] +CASE=C96 ;; FV3 resolution +LEVS=65 ;; Model vertical levels: 65 +gtype=regional ;; grid type: uniform, stretch, nest, or regional +# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir +#gridfixdir={FIXhafs}/fix_fv3/{CASE} +gridfixdir=/let/hafs_grid/generate/grid +# Otherwise, will generate the model grid according to the following grid parameters +# Need for grid types: stretch, nest and regional +stretch_fac=1.0001 ;; Stretching factor for the grid +target_lon={domlon} ;; center longitude of the highest resolution tile +target_lat={domlat} ;; center latitude of the highest resolution tile +# Need for grid types: nest and regional +refine_ratio=4 ;; Specify the refinement ratio for nest grid +istart_nest=16 +jstart_nest=18 +iend_nest=175 +jend_nest=173 + +[grid_ens] +CASE_ENS=C96 ;; FV3 resolution +LEVS_ENS=65 ;; Model vertical levels: 65 +gtype_ens=regional ;; grid type: uniform, stretch, nest, or regional +gridfixdir_ens=/let/hafs_grid/generate/grid_ens +stretch_fac_ens=1.0001 ;; Stretching factor for the grid +target_lon_ens={domlon} ;; center longitude of the highest resolution tile +target_lat_ens={domlat} ;; center latitude of the highest resolution tile +refine_ratio_ens=4 ;; Specify the refinement ratio for nest grid +istart_nest_ens=16 +jstart_nest_ens=18 +iend_nest_ens=175 +jend_nest_ens=173 + +[forecast] +ccpp_suite_regional=HAFS_v0_gfdlmp + +restart_interval="3 4 5 6 7 8 9" ;; restart interval in hours for the forecast + +layoutx=10 +layouty=6 +npx=321 +npy=313 +npz=64 + +write_groups=1 +write_tasks_per_group=20 + +output_grid=regional_latlon +output_grid_cen_lon=-62.0 ;; central longitude +output_grid_cen_lat=22.0 ;; central latitude +output_grid_lon_span=120.0 ;; output domain span for longitude in regular latlon coordinate system (in degrees) +output_grid_lat_span=80.0 ;; output domain span for latitude in regular latlon coordinate system (in degrees) +output_grid_dlon=0.25 ;; output grid spacing dlon . . . . +output_grid_dlat=0.25 ;; output grid spacing dlat . . . . + +[forecast_ens] +restart_interval_ens="3 4 5 6 7 8 9" ;; restart interval in hours for the ensda member forecast + +[rocotostr] +FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 + diff --git a/parm/hafs_regional_da_C96s1n4_dualres.conf b/parm/hafs_regional_da_C96s1n4_dualres.conf new file mode 100644 index 000000000..96c19ee97 --- /dev/null +++ b/parm/hafs_regional_da_C96s1n4_dualres.conf @@ -0,0 +1,105 @@ +# This is a UNIX conf file that contains ALL information relating to +# the HAFS C96 regional configuration. +# Note: These are just example settings. Of course, when model resoltion +# changes, one should also modify the model time step and other related +# dynamics and physics options, so that they work fine for the desired model +# resolution. +[config] +# Specify the domain center Latitude and Longitude +domlat=22.0 +domlon=-62.0 +# Same as domlat and domlon but vitals formatted +vitalsdomlat=220N +vitalsdomlon=620W + +# HAFS launcher requires vitals and a storm. +# This is a default minimum vitals file for a fake storm. +# The format of the missing value fields was based on the log +# output returned when running the launcher after the vitals have +# been "cleaned" up. That is, if you enter the fields as all -999 values, +# the "cleaned" output is returned. In essence I'm treating the vitals +# module as a factory in the sense that it knows the correct format. +# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M +# fakestormid is a config option set in the launcher and is the +# last storm id in the list of storms. +fakestormid=00L +fakestormname=NATL +fakestormorg=NHC +fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M + +[dir] +PARMforecast={PARMhafs}/forecast/regional + +[grid] +CASE=C96 ;; FV3 resolution +LEVS=65 ;; Model vertical levels: 65 +gtype=regional ;; grid type: uniform, stretch, nest, or regional +# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir +#gridfixdir={FIXhafs}/fix_fv3/{CASE} +gridfixdir=/let/hafs_grid/generate/grid +# Otherwise, will generate the model grid according to the following grid parameters +# Need for grid types: stretch, nest and regional +stretch_fac=1.0001 ;; Stretching factor for the grid +target_lon={domlon} ;; center longitude of the highest resolution tile +target_lat={domlat} ;; center latitude of the highest resolution tile +# Need for grid types: nest and regional +refine_ratio=4 ;; Specify the refinement ratio for nest grid +istart_nest=16 +jstart_nest=18 +iend_nest=175 +jend_nest=173 + +[grid_ens] +CASE_ENS=C96 ;; FV3 resolution +LEVS_ENS=65 ;; Model vertical levels: 65 +gtype_ens=regional ;; grid type: uniform, stretch, nest, or regional +gridfixdir_ens=/let/hafs_grid/generate/grid_ens +stretch_fac_ens=1.0001 ;; Stretching factor for the grid +target_lon_ens={domlon} ;; center longitude of the highest resolution tile +target_lat_ens={domlat} ;; center latitude of the highest resolution tile +refine_ratio_ens=2 ;; Specify the refinement ratio for nest grid +istart_nest_ens=16 +jstart_nest_ens=18 +iend_nest_ens=175 +jend_nest_ens=173 + +[forecast] +ccpp_suite_regional=HAFS_v0_gfdlmp + +restart_interval="3 6 9" ;; restart interval in hours for the forecast + +layoutx=10 +layouty=6 +npx=321 +npy=313 +npz=64 + +write_groups=1 +write_tasks_per_group=20 + +output_grid=regional_latlon +output_grid_cen_lon=-62.0 ;; central longitude +output_grid_cen_lat=22.0 ;; central latitude +output_grid_lon_span=120.0 ;; output domain span for longitude in regular latlon coordinate system (in degrees) +output_grid_lat_span=80.0 ;; output domain span for latitude in regular latlon coordinate system (in degrees) +output_grid_dlon=0.25 ;; output grid spacing dlon . . . . +output_grid_dlat=0.25 ;; output grid spacing dlat . . . . + +[forecast_ens] +ccpp_suite_regional_ens=HAFS_v0_gfdlmp + +restart_interval_ens="6 12" ;; restart interval in hours for the ensda member forecast + +layoutx_ens=10 +layouty_ens=6 +npx_ens=161 +npy_ens=157 +npz_ens=64 + +write_groups_ens=1 +write_tasks_per_group_ens=20 + +[rocotostr] +FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 +#FORECAST_RESOURCES_ENS=FORECAST_RESOURCES_regional_{forecast_ens/layoutx_ens}x{forecast_ens/layouty_ens}io{forecast_ens/write_groups_ens}x{forecast_ens/write_tasks_per_group_ens}_omp2 + diff --git a/parm/hafsv0p1aL64_da_AL.conf b/parm/hafsv0p1aL64_da_AL.conf new file mode 100644 index 000000000..a520cba51 --- /dev/null +++ b/parm/hafsv0p1aL64_da_AL.conf @@ -0,0 +1,95 @@ +# This is a UNIX conf file that contains ALL information relating to +# the HAFS basin-focused standalone regional configuration. +# +[config] +# Specify the domain center Latitude and Longitude +domlat=22.0 +domlon=-62.0 +# Same as domlat and domlon but vitals formatted +vitalsdomlat=220N +vitalsdomlon=620W + +# HAFS launcher requires vitals and a storm. +# This is a default minimum vitals file for a fake storm. +# The format of the missing value fields was based on the log +# output returned when running the launcher after the vitals have +# been "cleaned" up. That is, if you enter the fields as all -999 values, +# the "cleaned" output is returned. In essence I'm treating the vitals +# module as a factory in the sense that it knows the correct format. +# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M +# fakestormid is a config option set in the launcher and is the +# last storm id in the list of storms. +fakestormid=00L +fakestormname=NATL +fakestormorg=NHC +fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M + +[dir] +PARMforecast={PARMhafs}/forecast/regional + +[grid] +CASE=C768 ;; FV3 resolution +LEVS=65 ;; Model vertical levels: 65, 128, 76, 86, and 97 +gtype=regional ;; grid type: uniform, stretch, nest, or regional +# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir +gridfixdir=/let/hafs_grid/generate/grid +# Otherwise, will generate the model grid according to the following grid parameters +# Need for grid types: stretch, nest and regional +stretch_fac=1.0001 ;; Stretching factor for the grid +target_lon={domlon} ;; center longitude of the highest resolution tile +target_lat={domlat} ;; center latitude of the highest resolution tile +# Need for grid types: nest and regional +refine_ratio=4 ;; Specify the refinement ratio for nest grid +istart_nest=46 +jstart_nest=168 +iend_nest=1485 +jend_nest=1367 + +[grid_ens] +CASE_ENS=C768 ;; FV3 resolution +LEVS_ENS=65 ;; Model vertical levels: 65 +gtype_ens=regional ;; grid type: uniform, stretch, nest, or regional +gridfixdir_ens=/let/hafs_grid/generate/grid_ens +stretch_fac_ens=1.0001 ;; Stretching factor for the grid +target_lon_ens={domlon} ;; center longitude of the highest resolution tile +target_lat_ens={domlat} ;; center latitude of the highest resolution tile +refine_ratio_ens=2 ;; Specify the refinement ratio for nest grid +istart_nest_ens=46 +jstart_nest_ens=168 +iend_nest_ens=1485 +jend_nest_ens=1367 + +[forecast] +ccpp_suite_regional=HAFS_v0_gfdlmp + +restart_interval="3 6 9" ;; restart interval in hours for the forecast + +layoutx=40 +layouty=30 +npx=2881 +npy=2401 +npz=64 + +output_grid=regional_latlon +output_grid_cen_lon=-62.0 ;; central longitude +output_grid_cen_lat=22.0 ;; central latitude +output_grid_lon_span=109.8 ;; output domain span for longitude in regular latlon coordinate system (in degrees) +output_grid_lat_span=72.9 ;; output domain span for latitude in regular latlon coordinate system (in degrees) +output_grid_dlon=0.03 ;; output grid spacing dlon . . . . +output_grid_dlat=0.03 ;; output grid spacing dlat . . . . + +[forecast_ens] +ccpp_suite_regional_ens=HAFS_v0_gfdlmp + +restart_interval_ens="6 12" ;; restart interval in hours for the ensda member forecast + +layoutx_ens=40 +layouty_ens=30 +npx_ens=1441 +npy_ens=1201 +npz_ens=64 + +[rocotostr] +FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 +#FORECAST_RESOURCES_ENS=FORECAST_RESOURCES_regional_{forecast_ens/layoutx_ens}x{forecast_ens/layouty_ens}io{forecast_ens/write_groups_ens}x{forecast_ens/write_tasks_per_group_ens}_omp2 + diff --git a/parm/hafsv0p1aL91_EP.conf b/parm/hafsv0p1aL91_EP.conf index 27537b18a..ba94e4579 100644 --- a/parm/hafsv0p1aL91_EP.conf +++ b/parm/hafsv0p1aL91_EP.conf @@ -26,7 +26,6 @@ fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {v ictype=gfsnetcdf bctype=gfsgrib2ab_0p25 -vcoord_file_target_grid={PARMhafs}/chgres/hafs_hyblev.l{LEVS}.txt halo_blend=10 [dir] diff --git a/parm/hafsv0p1aL91_da_AL.conf b/parm/hafsv0p1aL91_da_AL.conf new file mode 100644 index 000000000..04cd25c2a --- /dev/null +++ b/parm/hafsv0p1aL91_da_AL.conf @@ -0,0 +1,96 @@ +# This is a UNIX conf file that contains ALL information relating to +# the HAFS basin-focused standalone regional configuration. +# +[config] +# Specify the domain center Latitude and Longitude +domlat=22.0 +domlon=-62.0 +# Same as domlat and domlon but vitals formatted +vitalsdomlat=220N +vitalsdomlon=620W + +# HAFS launcher requires vitals and a storm. +# This is a default minimum vitals file for a fake storm. +# The format of the missing value fields was based on the log +# output returned when running the launcher after the vitals have +# been "cleaned" up. That is, if you enter the fields as all -999 values, +# the "cleaned" output is returned. In essence I'm treating the vitals +# module as a factory in the sense that it knows the correct format. +# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M +# fakestormid is a config option set in the launcher and is the +# last storm id in the list of storms. +fakestormid=00L +fakestormname=NATL +fakestormorg=NHC +fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M + +[dir] +PARMforecast={PARMhafs}/forecast/regional + +[grid] +CASE=C768 ;; FV3 resolution +LEVS=92 ;; Model vertical levels: 65, 128, 76, 86, and 97 +gtype=regional ;; grid type: uniform, stretch, nest, or regional +# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir +#gridfixdir={FIXhafs}/fix_fv3/{CASE}_hafsv0p1aL91_AL +gridfixdir=/let/hafs_grid/generate/grid +# Otherwise, will generate the model grid according to the following grid parameters +# Need for grid types: stretch, nest and regional +stretch_fac=1.0001 ;; Stretching factor for the grid +target_lon={domlon} ;; center longitude of the highest resolution tile +target_lat={domlat} ;; center latitude of the highest resolution tile +# Need for grid types: nest and regional +refine_ratio=4 ;; Specify the refinement ratio for nest grid +istart_nest=46 +jstart_nest=168 +iend_nest=1485 +jend_nest=1367 + +[grid_ens] +CASE_ENS=C768 ;; FV3 resolution +LEVS_ENS=92 ;; Model vertical levels: 65 +gtype_ens=regional ;; grid type: uniform, stretch, nest, or regional +gridfixdir_ens=/let/hafs_grid/generate/grid_ens +stretch_fac_ens=1.0001 ;; Stretching factor for the grid +target_lon_ens={domlon} ;; center longitude of the highest resolution tile +target_lat_ens={domlat} ;; center latitude of the highest resolution tile +refine_ratio_ens=2 ;; Specify the refinement ratio for nest grid +istart_nest_ens=46 +jstart_nest_ens=168 +iend_nest_ens=1485 +jend_nest_ens=1367 + +[forecast] +ccpp_suite_regional=HAFS_v0_gfdlmp + +restart_interval="3 6 9" ;; restart interval in hours for the forecast + +layoutx=48 +layouty=40 +npx=2881 +npy=2401 +npz=91 + +output_grid=regional_latlon +output_grid_cen_lon=-62.0 ;; central longitude +output_grid_cen_lat=22.0 ;; central latitude +output_grid_lon_span=109.8 ;; output domain span for longitude in regular latlon coordinate system (in degrees) +output_grid_lat_span=72.9 ;; output domain span for latitude in regular latlon coordinate system (in degrees) +output_grid_dlon=0.03 ;; output grid spacing dlon . . . . +output_grid_dlat=0.03 ;; output grid spacing dlat . . . . + +[forecast_ens] +ccpp_suite_regional_ens=HAFS_v0_gfdlmp + +restart_interval_ens="6 12" ;; restart interval in hours for the ensda member forecast + +layoutx_ens=48 +layouty_ens=40 +npx_ens=1441 +npy_ens=1201 +npz_ens=91 + +[rocotostr] +FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 +#FORECAST_RESOURCES_ENS=FORECAST_RESOURCES_regional_{forecast_ens/layoutx_ens}x{forecast_ens/layouty_ens}io{forecast_ens/write_groups_ens}x{forecast_ens/write_tasks_per_group_ens}_omp2 + diff --git a/parm/hafsv0p2a_baseline_AL.conf b/parm/hafsv0p2a_baseline_AL.conf deleted file mode 100644 index a96565d57..000000000 --- a/parm/hafsv0p2a_baseline_AL.conf +++ /dev/null @@ -1,65 +0,0 @@ -# This is a UNIX conf file that contains ALL information relating to -# the HAFS basin-focused standalone regional configuration. -# -[config] -# Specify the domain center Latitude and Longitude -domlat=25.0 -domlon=-62.0 -# Same as domlat and domlon but vitals formatted -vitalsdomlat=250N -vitalsdomlon=620W - -# HAFS launcher requires vitals and a storm. -# This is a default minimum vitals file for a fake storm. -# The format of the missing value fields was based on the log -# output returned when running the launcher after the vitals have -# been "cleaned" up. That is, if you enter the fields as all -999 values, -# the "cleaned" output is returned. In essence I'm treating the vitals -# module as a factory in the sense that it knows the correct format. -# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M -# fakestormid is a config option set in the launcher and is the -# last storm id in the list of storms. -fakestormid=00L -fakestormname=NATL -fakestormorg=NHC -fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M - -[dir] -PARMforecast={PARMhafs}/forecast/regional - -[grid] -CASE=C3201 ;; FV3 resolution -LEVS=92 ;; Model vertical levels: 65, 128, 76, 86, and 97 -gtype=regional ;; grid type: uniform, stretch, nest, or regional -# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir -#gridfixdir=/let/hafs_grid/generate/grid -gridfixdir={HOMEhafs}/fix/fix_fv3/ESG_C3201_62W25N_3200x2400 -# Otherwise, will generate the model grid according to the following grid parameters -# Need for grid types: stretch, nest and regional -stretch_fac=1.0001 ;; Stretching factor for the grid -target_lon={domlon} ;; center longitude of the highest resolution tile -target_lat={domlat} ;; center latitude of the highest resolution tile -# Need for grid types: nest and regional -refine_ratio=4 ;; Specify the refinement ratio for nest grid -istart_nest=46 -jstart_nest=168 -iend_nest=1485 -jend_nest=1367 - -[forecast] -layoutx=48 -layouty=40 -npx=3201 -npy=2401 -npz=91 - -output_grid=regional_latlon -output_grid_cen_lon=-62.0 ;; central longitude -output_grid_cen_lat=23.15 ;; central latitude -output_grid_lon_span=109.5 ;; output domain span for longitude in regular latlon coordinate system (in degrees) -output_grid_lat_span=73.5 ;; output domain span for latitude in regular latlon coordinate system (in degrees) -output_grid_dlon=0.03 ;; output grid spacing dlon . . . . -output_grid_dlat=0.03 ;; output grid spacing dlat . . . . - -[rocotostr] -FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 diff --git a/parm/hafsv0p2a_da_AL.conf b/parm/hafsv0p2a_da_AL.conf new file mode 100644 index 000000000..f1c62b255 --- /dev/null +++ b/parm/hafsv0p2a_da_AL.conf @@ -0,0 +1,103 @@ +# This is a UNIX conf file that contains ALL information relating to +# the HAFS basin-focused standalone regional configuration. +# +[config] +# Specify the domain center Latitude and Longitude +domlat=24.0 +domlon=-62.0 +# Same as domlat and domlon but vitals formatted +vitalsdomlat=240N +vitalsdomlon=620W + +# HAFS launcher requires vitals and a storm. +# This is a default minimum vitals file for a fake storm. +# The format of the missing value fields was based on the log +# output returned when running the launcher after the vitals have +# been "cleaned" up. That is, if you enter the fields as all -999 values, +# the "cleaned" output is returned. In essence I'm treating the vitals +# module as a factory in the sense that it knows the correct format. +# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M +# fakestormid is a config option set in the launcher and is the +# last storm id in the list of storms. +fakestormid=00L +fakestormname=NATL +fakestormorg=NHC +fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M + +# Dual-resolution ensemble members +GRID_RATIO_ENS=2 + +[dir] +PARMforecast={PARMhafs}/forecast/regional + +[grid] +CASE=C3099 ;; FV3 resolution +LEVS=92 ;; Model vertical levels: 65, 128, 76, 86, and 97 +gtype=regional ;; grid type: uniform, stretch, nest, or regional +# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir +#gridfixdir=/let/hafs_grid/generate/grid +gridfixdir={HOMEhafs}/fix/fix_fv3/ESG_C3099_62W24N_3120x2400 +# Otherwise, will generate the model grid according to the following grid parameters +# Need for grid types: stretch, nest and regional +stretch_fac=1.0001 ;; Stretching factor for the grid +target_lon={domlon} ;; center longitude of the highest resolution tile +target_lat={domlat} ;; center latitude of the highest resolution tile +# Need for grid types: nest and regional +refine_ratio=4 ;; Specify the refinement ratio for nest grid +istart_nest=46 +jstart_nest=168 +iend_nest=1485 +jend_nest=1367 + +[grid_ens] +CASE_ENS=C1550 ;; FV3 resolution +LEVS_ENS=92 ;; Model vertical levels: 65 +gtype_ens=regional ;; grid type: uniform, stretch, nest, or regional +#gridfixdir_ens=/let/hafs_grid/generate/grid_ens +gridfixdir_ens={HOMEhafs}/fix/fix_fv3/ESG_C1550_62W24N_1560x1200 +stretch_fac_ens=1.0001 ;; Stretching factor for the grid +target_lon_ens={domlon} ;; center longitude of the highest resolution tile +target_lat_ens={domlat} ;; center latitude of the highest resolution tile +refine_ratio_ens=2 ;; Specify the refinement ratio for nest grid +istart_nest_ens=46 +jstart_nest_ens=168 +iend_nest_ens=1485 +jend_nest_ens=1376 + + +[forecast] +k_split=3 +n_split=5 +layoutx=48 +layouty=30 +npx=3121 +npy=2401 +npz=91 + +restart_interval="3 6 9" ;; restart interval in hours for the forecast + +output_grid=regional_latlon +output_grid_cen_lon=-62.0 ;; central longitude +output_grid_cen_lat=24.00 ;; central latitude +output_grid_lon_span=109.5 ;; output domain span for longitude in regular latlon coordinate system (in degrees) +output_grid_lat_span=71.7 ;; output domain span for latitude in regular latlon coordinate system (in degrees) +output_grid_dlon=0.03 ;; output grid spacing dlon . . . . +output_grid_dlat=0.03 ;; output grid spacing dlat . . . . + +[forecast_ens] +k_split_ens=2 +n_split_ens=5 +layoutx_ens=20 +layouty_ens=15 +npx_ens=1561 +npy_ens=1201 +npz_ens=91 + +restart_interval_ens="6 12" ;; restart interval in hours for the ensda member forecast +# place holder not yet working, currently using the same output grid as the deterministic forecast +output_grid_dlon_ens=0.06 ;; output grid spacing dlon . . . . +output_grid_dlat_ens=0.06 ;; output grid spacing dlat . . . . + +[rocotostr] +FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 +FORECAST_ENS_RESOURCES=FORECAST_ENS_RESOURCES_regional_{forecast_ens/layoutx_ens}x{forecast_ens/layouty_ens}io{forecast_ens/write_groups_ens}x{forecast_ens/write_tasks_per_group_ens}_omp2 diff --git a/parm/hafsv0p2a_phase2_AL.conf b/parm/hafsv0p2a_phase2_AL.conf new file mode 100644 index 000000000..5d1fc3c81 --- /dev/null +++ b/parm/hafsv0p2a_phase2_AL.conf @@ -0,0 +1,67 @@ +# This is a UNIX conf file that contains ALL information relating to +# the HAFS basin-focused standalone regional configuration. +# +[config] +# Specify the domain center Latitude and Longitude +domlat=24.0 +domlon=-62.0 +# Same as domlat and domlon but vitals formatted +vitalsdomlat=240N +vitalsdomlon=620W + +# HAFS launcher requires vitals and a storm. +# This is a default minimum vitals file for a fake storm. +# The format of the missing value fields was based on the log +# output returned when running the launcher after the vitals have +# been "cleaned" up. That is, if you enter the fields as all -999 values, +# the "cleaned" output is returned. In essence I'm treating the vitals +# module as a factory in the sense that it knows the correct format. +# NHC 00L FAKE 20120710 0000 250N 0800W -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M +# fakestormid is a config option set in the launcher and is the +# last storm id in the list of storms. +fakestormid=00L +fakestormname=NATL +fakestormorg=NHC +fakestorm_vitals={fakestormorg} {fakestormid} {fakestormname} {YMD} {HH}{min} {vitalsdomlat} {vitalsdomlon} -99 -99 -999 -999 -099 -9 -99 -999 -999 -999 -999 M + +[dir] +PARMforecast={PARMhafs}/forecast/regional + +[grid] +CASE=C3099 ;; FV3 resolution +LEVS=92 ;; Model vertical levels: 65, 128, 76, 86, and 97 +gtype=regional ;; grid type: uniform, stretch, nest, or regional +# If gridfixdir is provided and the dir exists, then use the pre-generated static grid fix files under gridfixdir +#gridfixdir=/let/hafs_grid/generate/grid +gridfixdir={HOMEhafs}/fix/fix_fv3/ESG_C3099_62W24N_3120x2400 +# Otherwise, will generate the model grid according to the following grid parameters +# Need for grid types: stretch, nest and regional +stretch_fac=1.0001 ;; Stretching factor for the grid +target_lon={domlon} ;; center longitude of the highest resolution tile +target_lat={domlat} ;; center latitude of the highest resolution tile +# Need for grid types: nest and regional +refine_ratio=4 ;; Specify the refinement ratio for nest grid +istart_nest=46 +jstart_nest=168 +iend_nest=1485 +jend_nest=1367 + +[forecast] +k_split=3 +n_split=5 +layoutx=48 +layouty=30 +npx=3121 +npy=2401 +npz=91 + +output_grid=regional_latlon +output_grid_cen_lon=-62.0 ;; central longitude +output_grid_cen_lat=24.00 ;; central latitude +output_grid_lon_span=109.5 ;; output domain span for longitude in regular latlon coordinate system (in degrees) +output_grid_lat_span=71.7 ;; output domain span for latitude in regular latlon coordinate system (in degrees) +output_grid_dlon=0.03 ;; output grid spacing dlon . . . . +output_grid_dlat=0.03 ;; output grid spacing dlat . . . . + +[rocotostr] +FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 diff --git a/parm/chgres/hafs_hyblev.l102.txt b/parm/levels/hafs_hyblev.l102.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l102.txt rename to parm/levels/hafs_hyblev.l102.txt diff --git a/parm/chgres/hafs_hyblev.l109.txt b/parm/levels/hafs_hyblev.l109.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l109.txt rename to parm/levels/hafs_hyblev.l109.txt diff --git a/parm/chgres/hafs_hyblev.l128.txt b/parm/levels/hafs_hyblev.l128.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l128.txt rename to parm/levels/hafs_hyblev.l128.txt diff --git a/parm/chgres/hafs_hyblev.l65.txt b/parm/levels/hafs_hyblev.l65.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l65.txt rename to parm/levels/hafs_hyblev.l65.txt diff --git a/parm/chgres/hafs_hyblev.l75.txt b/parm/levels/hafs_hyblev.l75.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l75.txt rename to parm/levels/hafs_hyblev.l75.txt diff --git a/parm/chgres/hafs_hyblev.l76.txt b/parm/levels/hafs_hyblev.l76.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l76.txt rename to parm/levels/hafs_hyblev.l76.txt diff --git a/parm/levels/hafs_hyblev.l82.txt b/parm/levels/hafs_hyblev.l82.txt new file mode 100644 index 000000000..b6f5a170d --- /dev/null +++ b/parm/levels/hafs_hyblev.l82.txt @@ -0,0 +1,84 @@ + 2 82 + 0.000 1.00000000 + 0.000 0.99752820 + 59.676 0.99424753 + 124.670 0.99067358 + 195.381 0.98678414 + 272.329 0.98255037 + 355.978 0.97794633 + 446.902 0.97294003 + 545.619 0.96750241 + 652.719 0.96160031 + 768.839 0.95519796 + 894.624 0.94825887 + 1030.663 0.94074954 + 1177.680 0.93262882 + 1336.308 0.92386022 + 1507.230 0.91440429 + 1691.079 0.90422395 + 1888.458 0.89328344 + 2100.017 0.88154391 + 2326.228 0.86897578 + 2567.598 0.85554708 + 2824.479 0.84123363 + 3097.147 0.82601488 + 3385.736 0.80987717 + 3690.245 0.79281359 + 4010.496 0.77482590 + 4346.116 0.75592593 + 4696.528 0.73613552 + 5060.923 0.71548843 + 5438.269 0.69402976 + 5827.294 0.67181676 + 6226.492 0.64891867 + 6634.107 0.62541795 + 7048.178 0.60140747 + 7466.551 0.57699045 + 7886.904 0.55227914 + 8306.906 0.52738590 + 8724.221 0.50242313 + 9136.516 0.47750321 + 9541.466 0.45273843 + 9936.768 0.42824085 + 10320.245 0.40411659 + 10690.589 0.38041802 + 11047.081 0.35715815 + 11388.932 0.33435069 + 11715.272 0.31201017 + 12025.136 0.29015200 + 12317.453 0.26879271 + 12591.023 0.24795004 + 12844.499 0.22764320 + 13076.362 0.20789312 + 13284.887 0.18872273 + 13468.107 0.17015738 + 13623.766 0.15222525 + 13749.262 0.13495794 + 13841.574 0.11839119 + 13897.174 0.10256573 + 13911.914 0.08752844 + 13880.880 0.07333372 + 13798.210 0.06004535 + 13656.849 0.04773888 + 13448.237 0.03650471 + 13161.884 0.02645230 + 12784.803 0.01771573 + 12300.730 0.01046143 + 11689.041 0.00489888 + 10923.213 0.00129576 + 9968.592 0.00000000 + 8928.278 0.00000000 + 7934.164 0.00000000 + 6986.850 0.00000000 + 6086.936 0.00000000 + 5235.022 0.00000000 + 4431.708 0.00000000 + 3677.594 0.00000000 + 2973.280 0.00000000 + 2319.366 0.00000000 + 1716.452 0.00000000 + 1165.137 0.00000000 + 750.000 0.00000000 + 450.000 0.00000000 + 200.000 0.00000000 + 0.000 0.00000000 diff --git a/parm/chgres/hafs_hyblev.l86.txt b/parm/levels/hafs_hyblev.l86.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l86.txt rename to parm/levels/hafs_hyblev.l86.txt diff --git a/parm/chgres/hafs_hyblev.l86a.txt b/parm/levels/hafs_hyblev.l86a.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l86a.txt rename to parm/levels/hafs_hyblev.l86a.txt diff --git a/parm/chgres/hafs_hyblev.l86b.txt b/parm/levels/hafs_hyblev.l86b.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l86b.txt rename to parm/levels/hafs_hyblev.l86b.txt diff --git a/parm/chgres/hafs_hyblev.l92.txt b/parm/levels/hafs_hyblev.l92.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l92.txt rename to parm/levels/hafs_hyblev.l92.txt diff --git a/parm/chgres/hafs_hyblev.l95.txt b/parm/levels/hafs_hyblev.l95.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l95.txt rename to parm/levels/hafs_hyblev.l95.txt diff --git a/parm/levels/hafs_hyblev.l96.txt b/parm/levels/hafs_hyblev.l96.txt new file mode 100644 index 000000000..df0b02ac5 --- /dev/null +++ b/parm/levels/hafs_hyblev.l96.txt @@ -0,0 +1,98 @@ + 2 96 + 0.000 1.00000000 + 0.000 0.99752820 + 59.197 0.99432345 + 121.921 0.99092694 + 188.358 0.98732843 + 258.698 0.98351737 + 333.146 0.97948255 + 411.908 0.97521256 + 495.199 0.97069543 + 583.241 0.96591888 + 676.261 0.96087023 + 774.491 0.95553653 + 878.164 0.94990468 + 987.522 0.94396115 + 1102.804 0.93769231 + 1224.253 0.93108440 + 1352.112 0.92412355 + 1486.618 0.91679603 + 1628.010 0.90908801 + 1776.519 0.90098593 + 1932.369 0.89247650 + 2095.775 0.88354671 + 2266.941 0.87418418 + 2446.057 0.86437695 + 2633.290 0.85411415 + 2828.795 0.84338544 + 3032.699 0.83218173 + 3245.103 0.82049505 + 3466.077 0.80831893 + 3695.662 0.79564825 + 3933.855 0.78247979 + 4180.620 0.76881199 + 4435.873 0.75464546 + 4699.484 0.73998294 + 4971.271 0.72482951 + 5250.999 0.70919280 + 5538.379 0.69308287 + 5833.061 0.67651265 + 6134.635 0.65949769 + 6442.630 0.64205643 + 6756.507 0.62421024 + 7075.671 0.60598316 + 7399.456 0.58740213 + 7727.136 0.56849690 + 8057.921 0.54929981 + 8390.963 0.52984561 + 8725.354 0.51017150 + 9060.132 0.49031671 + 9394.283 0.47032244 + 9726.744 0.45023144 + 10056.410 0.43008786 + 10382.133 0.40993687 + 10702.732 0.38982441 + 11017.404 0.36977045 + 11325.496 0.34978143 + 11626.256 0.32986476 + 11918.812 0.31002907 + 12201.782 0.29031033 + 12473.479 0.27075941 + 12732.122 0.25142765 + 12975.824 0.23236680 + 13202.583 0.21362873 + 13410.259 0.19526550 + 13596.557 0.17732930 + 13758.994 0.15987257 + 13894.862 0.14294820 + 14001.187 0.12660973 + 14074.661 0.11091199 + 14111.575 0.09591167 + 14107.716 0.08166823 + 14058.249 0.06824504 + 13957.556 0.05571091 + 13799.035 0.04414230 + 13574.843 0.03362645 + 13275.496 0.02426288 + 12889.463 0.01617132 + 12402.599 0.00949729 + 11797.385 0.00441960 + 11051.895 0.00116057 + 10138.380 0.00000000 + 9152.469 0.00000000 + 8212.358 0.00000000 + 7318.648 0.00000000 + 6471.937 0.00000000 + 5672.827 0.00000000 + 4921.916 0.00000000 + 4219.805 0.00000000 + 3567.095 0.00000000 + 2964.384 0.00000000 + 2412.274 0.00000000 + 1911.363 0.00000000 + 1462.253 0.00000000 + 1065.542 0.00000000 + 721.831 0.00000000 + 431.721 0.00000000 + 200.000 0.00000000 + 0.000 0.00000000 diff --git a/parm/chgres/hafs_hyblev.l97.txt b/parm/levels/hafs_hyblev.l97.txt similarity index 100% rename from parm/chgres/hafs_hyblev.l97.txt rename to parm/levels/hafs_hyblev.l97.txt diff --git a/parm/system.conf.jet b/parm/system.conf.jet index c499f4a35..1b5d00dc9 100644 --- a/parm/system.conf.jet +++ b/parm/system.conf.jet @@ -45,8 +45,8 @@ WHERE_AM_I=jet ;; Which cluster? (For setting up environment.) WHICH_JET=x ;; Which part of Jet? [forecast] -write_groups=2 -write_tasks_per_group=48 +write_groups=1 +write_tasks_per_group=96 [rocotostr] FORECAST_RESOURCES=FORECAST_RESOURCES_regional_{forecast/layoutx}x{forecast/layouty}io{forecast/write_groups}x{forecast/write_tasks_per_group}_omp2 diff --git a/parm/system.conf.wcoss_cray b/parm/system.conf.wcoss_cray index ddba72d2f..dd227de34 100644 --- a/parm/system.conf.wcoss_cray +++ b/parm/system.conf.wcoss_cray @@ -7,7 +7,8 @@ tape_project=emc-hwrf ## CPU account name for submitting jobs to the batch system. cpu_account=HUR-T2O ## Archive path -archive=hpss:/NCEPDEV/{tape_project}/5year/{ENV[USER]}/{SUBEXPT}/{out_prefix}.tar +#archive=hpss:/NCEPDEV/{tape_project}/5year/{ENV[USER]}/{SUBEXPT}/{out_prefix}.tar +archive=disk:/gpfs/hps3/ptmp/{ENV[USER]}/{SUBEXPT}_archive/{out_prefix}.tar ## Specify input sources for HISTORY mode. input_sources=wcoss_sources_{GFSVER} ## Specify the DataCatalog for FORECAST mode runs. diff --git a/rocoto/cronjob_hafs_regional_da.sh b/rocoto/cronjob_hafs_regional_da.sh new file mode 100755 index 000000000..ec647f370 --- /dev/null +++ b/rocoto/cronjob_hafs_regional_da.sh @@ -0,0 +1,190 @@ +#!/bin/sh +set -x +date + +# NOAA WCOSS Dell Phase3 +#HOMEhafs=/gpfs/dell2/emc/modeling/noscrub/${USER}/save/HAFS +#dev="-s sites/wcoss_dell_p3.ent -f" +#PYTHON3=/usrx/local/prod/packages/python/3.6.3/bin/python3 + +# NOAA WCOSS Cray +#HOMEhafs=/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS +#dev="-s sites/wcoss_cray.ent -f" +#PYTHON3=/opt/intel/intelpython3/bin/python3 + +# NOAA RDHPCS Jet +#HOMEhafs=/mnt/lfs1/HFIP/hwrfv3/${USER}/HAFS +#dev="-s sites/xjet.ent -f" +#dev="-s sites/xjet_hafsv0p1a.ent -f" +#PYTHON3=/apps/intel/intelpython3/bin/python3 + +# MSU Orion + HOMEhafs=/work/noaa/hwrf/save/${USER}/HAFS + dev="-s sites/orion.ent -f" + PYTHON3=/apps/intel-2020/intel-2020/intelpython3/bin/python3 + +# NOAA RDHPCS Hera +#HOMEhafs=/scratch1/NCEPDEV/hwrf/save/${USER}/HAFS +#dev="-s sites/hera.ent -f" +#PYTHON3=/apps/intel/intelpython3/bin/python3 + +cd ${HOMEhafs}/rocoto + +EXPT=$(basename ${HOMEhafs}) +scrubopt="config.scrub_work=no config.scrub_com=no" + +#=============================================================================== + + # Cold-start from GFS analysis without DA + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_noda \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # Warm-start from prior HAFS forecast without DA + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_noda_cycling \ + config.warm_start_opt=2 \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # Simple 3DVar DA + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_3dvar \ + config.run_gsi=yes config.run_envar=no \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # 3DEnVar with GDAS ensembles + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_3denvar \ + config.run_gsi=yes config.run_envar=yes \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSI-based Vortex Relocation (GSIVR) + 3DEnVar with GDAS ensembles + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_gsivr_3denvar \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=no config.run_envar=yes \ + config.run_ensda=no config.ENS_SIZE=0 \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # 3DEnVar with GDAS ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_3denvar_fgat \ + config.run_gsi_vr=no config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=no config.ENS_SIZE=0 \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # 3DEnVar with HAFS ensembles (cold-start from GDAS ensembles) + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_3densda \ + config.run_gsi_vr=no config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=no config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # 3DEnVar with HAFS ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_3densda_fgat \ + config.run_gsi_vr=no config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSIVR + 3DEnVar with HAFS ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_gsivr_3densda_fgat \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSIVR + GSIVR_FGAT + 3DEnVar with HAFS ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_gsivrfgat_3densda_fgat \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 config.run_enkf=no \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSIVR + GSIVR_FGAT + GSIVR_ENS + 3DEnVar with HAFS ensembles (self-cycled through GSIVR_ENS) + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_gsivrfgatens_3densda_fgat \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=yes \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 config.run_enkf=no \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # 3DEnVar with self-cycled HAFS enkf ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_3densda_enkf_fgat \ + config.run_gsi_vr=no config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 config.run_enkf=yes \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSIVR + GSIVR_FGAT + 3DEnVar with self-cycled HAFS enkf ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_gsivrfgat_3densda_enkf_fgat \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=4 config.run_enkf=yes \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSIVR + GSIVR_FGAT + GSIVR_ENS + 3DEnVar with self-cycled HAFS enkf ensembles + 3hourly FGAT + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_C96s1n4_gsivrfgatens_3densda_enkf_fgat \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=yes \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=10 config.run_enkf=yes \ + config.NHRS=12 ${scrubopt} \ + ../parm/hafs_regional_da_C96s1n4_320x312.conf + + # GSIVR + GSIVR_FGAT + GSIVR_ENS + 3DEnVar with self-cycled dual-resolution HAFS enkf ensembles + 3hourly FGAT + # On top of the hafsv0p1aL64 configuration without ocean coupling + # Dual-resolution ENSDA system, 3-km deterministic, 6-km ensembles, same domain coverage + # Notes: + # * need to increase the number of cores (from 200 to 800) to run the analysis jobs + ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ + config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_hafsv0p1aL64_full_3densda_dualres \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=yes \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=10 config.run_enkf=yes \ + config.GRID_RATIO_ENS=2 \ + gsi.use_bufr_nr=yes \ + ../parm/hafsv0p1aL64_da_AL.conf \ + config.NHRS=12 ${scrubopt} + +## GSIVR + GSIVR_FGAT + GSIVR_ENS + 3DEnVar with self-cycled dual-resolution HAFS enkf ensembles + 3hourly FGAT + ocean coupling +## On top of the hafsv0p1aL64 configuration with ocean coupling; +## Dual-resolution ENSDA system, 3-km deterministic, 6-km ensembles, same domain coverage +## Notes: +## * need to increase the number of cores (from 200 to 800) to run the analysis jobs +#${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY \ +# config.EXPT=${EXPT} config.SUBEXPT=${EXPT}_hafsv0p1acplL64_full_3densda_dualres \ +# config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=yes \ +# config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ +# config.run_ensda=yes config.ENS_SIZE=10 config.run_enkf=yes \ +# config.GRID_RATIO_ENS=2 \ +# gsi.use_bufr_nr=yes \ +# ../parm/hafsv0p1aL64_da_AL.conf \ +# ../parm/hafs_hycom.conf \ +# config.NHRS=12 ${scrubopt} + +#=============================================================================== + +date + +echo 'cronjob done' diff --git a/rocoto/cronjob_hafsv0p2a_baseline.sh b/rocoto/cronjob_hafsv0p2a_baseline.sh deleted file mode 100755 index 5c8ff3e9e..000000000 --- a/rocoto/cronjob_hafsv0p2a_baseline.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh -set -x -date - -# NOAA WCOSS Dell Phase3 -#HOMEhafs=/gpfs/dell2/emc/modeling/noscrub/${USER}/save/HAFS -#dev="-s sites/wcoss_dell_p3.ent -f" -#PYTHON3=/usrx/local/prod/packages/python/3.6.3/bin/python3 - -# NOAA WCOSS Cray -#HOMEhafs=/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS -#dev="-s sites/wcoss_cray.ent -f" -#PYTHON3=/opt/intel/intelpython3/bin/python3 - -# NOAA RDHPCS Jet -#HOMEhafs=/mnt/lfs4/HFIP/hwrfv3/${USER}/HAFS -##dev="-s sites/xjet.ent -f" -#dev="-s sites/xjet_hafsv0p2a.ent -f" -#PYTHON3=/apps/intel/intelpython3/bin/python3 - -# MSU Orion - HOMEhafs=/work/noaa/hwrf/save/${USER}/HAFS - dev="-s sites/orion.ent -f" - PYTHON3=/apps/intel-2020/intel-2020/intelpython3/bin/python3 - -# NOAA RDHPCS Hera -#HOMEhafs=/scratch1/NCEPDEV/hwrf/save/${USER}/HAFS -#dev="-s sites/hera.ent -f" -#PYTHON3=/apps/intel/intelpython3/bin/python3 - -cd ${HOMEhafs}/rocoto - -EXPT=$(basename ${HOMEhafs}) - -#=============================================================================== - - # hafsv0p2a baseline - confopts="config.EXPT=${EXPT} config.SUBEXPT=hafsv0p2a_baseline \ - ../parm/hafsv0p2a_baseline_AL.conf \ - ../parm/hafs_hycom.conf" - - # Technical test for 2020082506-2020082512 13L2020 - ${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY ${confopts} \ - config.run_emcgraphics=yes \ - config.scrub_work=no config.scrub_com=no - -## 2020 NATL storm slots -#${PYTHON3} ./run_hafs.py -t ${dev} 2020060112-2020060812 00L HISTORY ${confopts} # Slot 1.0: 03L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020062112-2020062406 00L HISTORY ${confopts} # Slot 1.1: 04L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020070400-2020070612 00L HISTORY ${confopts} # Slot 1.2: 05L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020070912-2020071100 00L HISTORY ${confopts} # Slot 1.3: 06L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020072112-2020072618 00L HISTORY ${confopts} # Slot 1.4: 07L, 08L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020072806-2020080500 00L HISTORY ${confopts} # Slot 2: 09L, 10L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020081100-2020081612 00L HISTORY ${confopts} # Slot 3: 11L, 12L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020081918-2020082718 00L HISTORY ${confopts} # Slot 4: 13L, 14L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020083112-2020090512 00L HISTORY ${confopts} # Slot 5: 15L, 16L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020090612-2020091118 00L HISTORY ${confopts} # Slot 6: 17Lp1, 18Lp1 -#${PYTHON3} ./run_hafs.py -t ${dev} 2020091200-2020092300 00L HISTORY ${confopts} # Slot 7: 17Lp2, 18Lp2, 19-24L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020100212-2020101018 00L HISTORY ${confopts} # Slot 8: 25L, 26L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020101618-2020102912 00L HISTORY ${confopts} # Slot 9: 27L, 28L -#${PYTHON3} ./run_hafs.py -t ${dev} 2020101618-2020102912 00L HISTORY ${confopts} # Slot 10: 29-31L # No GFSv16 version input data - -#=============================================================================== - -date - -echo 'cronjob done' diff --git a/rocoto/cronjob_hafsv0p2a_da.sh b/rocoto/cronjob_hafsv0p2a_da.sh new file mode 100755 index 000000000..f43f6832c --- /dev/null +++ b/rocoto/cronjob_hafsv0p2a_da.sh @@ -0,0 +1,104 @@ +#!/bin/sh +set -x +date + +# NOAA WCOSS Dell Phase3 +#HOMEhafs=/gpfs/dell2/emc/modeling/noscrub/${USER}/save/HAFS +#dev="-s sites/wcoss_dell_p3.ent -f" +#PYTHON3=/usrx/local/prod/packages/python/3.6.3/bin/python3 + +# NOAA WCOSS Cray +#HOMEhafs=/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS +#dev="-s sites/wcoss_cray.ent -f" +#PYTHON3=/opt/intel/intelpython3/bin/python3 + +# NOAA RDHPCS Jet +#HOMEhafs=/mnt/lfs4/HFIP/hwrfv3/${USER}/HAFS +##dev="-s sites/xjet.ent -f" +#dev="-s sites/xjet_hafsv0p2a.ent -f" +#PYTHON3=/apps/intel/intelpython3/bin/python3 + +# MSU Orion + HOMEhafs=/work/noaa/hwrf/save/${USER}/HAFS + dev="-s sites/orion.ent -f" + PYTHON3=/apps/intel-2020/intel-2020/intelpython3/bin/python3 + +# NOAA RDHPCS Hera +#HOMEhafs=/scratch1/NCEPDEV/hwrf/save/${USER}/HAFS +#dev="-s sites/hera.ent -f" +#PYTHON3=/apps/intel/intelpython3/bin/python3 + +cd ${HOMEhafs}/rocoto + +EXPT=$(basename ${HOMEhafs}) + +#=============================================================================== + + # h2db: hafsv0p2a with fgat+3denvar + confh2db="config.EXPT=${EXPT} config.SUBEXPT=hafs_h2db \ + config.run_gsi_vr=no config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=no config.ENS_SIZE=40 config.run_enkf=no \ + config.GRID_RATIO_ENS=2 \ + gsi.use_bufr_nr=yes \ + ../parm/hafsv0p2a_da_AL.conf \ + ../parm/hafs_hycom.conf" + + # h2dc: hafsv0p2a with fgat+3denvar+enkf + confh2dc="config.EXPT=${EXPT} config.SUBEXPT=hafs_h2dc \ + config.run_gsi_vr=no config.run_gsi_vr_fgat=no config.run_gsi_vr_ens=no \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=40 config.run_enkf=yes \ + config.GRID_RATIO_ENS=2 \ + gsi.use_bufr_nr=yes \ + ../parm/hafsv0p2a_da_AL.conf \ + ../parm/hafs_hycom.conf" + + # h2dd: hafsv0p2a with gsi_vr+fgat+3denvar+enkf + confh2dd="config.EXPT=${EXPT} config.SUBEXPT=hafs_h2dd \ + config.run_gsi_vr=yes config.run_gsi_vr_fgat=yes config.run_gsi_vr_ens=yes \ + config.run_gsi=yes config.run_fgat=yes config.run_envar=yes \ + config.run_ensda=yes config.ENS_SIZE=40 config.run_enkf=yes \ + config.GRID_RATIO_ENS=2 \ + gsi.use_bufr_nr=yes \ + ../parm/hafsv0p2a_da_AL.conf \ + ../parm/hafs_hycom.conf" + + # On Orion use 40x30 PEs for FV3ATM to reduce the forecast job hanging while + # writing restart files + confopts="${confh2db} forecast.layoutx=40 forecast.layouty=30" +#confopts="${confh2dc} forecast.layoutx=40 forecast.layouty=30" +## On other platforms, use 48x30 PEs for FV3ATM +#confopts=${confh2db} +#confopts=${confh2dc} + +## Technical test for 2020082506-2020082512 13L2020 +#${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY ${confopts} \ +# config.run_emcgraphics=no \ +# config.scrub_work=no config.scrub_com=no + +## 2020 NATL storm slots +#${PYTHON3} ./run_hafs.py -t ${dev} 2020060112-2020060812 00L HISTORY ${confopts} # Slot 1.0: 03L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020062112-2020062406 00L HISTORY ${confopts} # Slot 1.1: 04L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020070400-2020070612 00L HISTORY ${confopts} # Slot 1.2: 05L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020070912-2020071100 00L HISTORY ${confopts} # Slot 1.3: 06L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020072112-2020072618 00L HISTORY ${confopts} # Slot 1.4: 07L, 08L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020072806-2020080500 00L HISTORY ${confopts} # Slot 2: 09L, 10L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020081100-2020081612 00L HISTORY ${confopts} # Slot 3: 11L, 12L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020081918-2020082718 00L HISTORY ${confopts} # Slot 4: 13L, 14L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020083112-2020090512 00L HISTORY ${confopts} # Slot 5: 15L, 16L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020090612-2020091118 00L HISTORY ${confopts} # Slot 6: 17Lp1, 18Lp1 +#${PYTHON3} ./run_hafs.py -t ${dev} 2020091200-2020092300 00L HISTORY ${confopts} # Slot 7: 17Lp2, 18Lp2, 19-24L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020100212-2020101018 00L HISTORY ${confopts} # Slot 8: 25L, 26L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020101618-2020102912 00L HISTORY ${confopts} # Slot 9: 27L, 28L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020101618-2020102912 00L HISTORY ${confopts} # Slot 10: 29-31L # No GFSv16 version input data + +## 2019 NATL storm slots +#${PYTHON3} ./run_hafs.py -t ${dev} 2019082406-2019091006 00L HISTORY ${confopts} # Slot 5: 05-08L +#${PYTHON3} ./run_hafs.py -t ${dev} 2019091212-2019092712 00L HISTORY ${confopts} # Slot 6: 09-12L + +#=============================================================================== + +date + +echo 'cronjob done' diff --git a/rocoto/cronjob_hafsv0p2a_phase2.sh b/rocoto/cronjob_hafsv0p2a_phase2.sh new file mode 100755 index 000000000..c532aef7d --- /dev/null +++ b/rocoto/cronjob_hafsv0p2a_phase2.sh @@ -0,0 +1,71 @@ +#!/bin/sh +set -x +date + +# NOAA WCOSS Dell Phase3 +#HOMEhafs=/gpfs/dell2/emc/modeling/noscrub/${USER}/save/HAFS +#dev="-s sites/wcoss_dell_p3.ent -f" +#PYTHON3=/usrx/local/prod/packages/python/3.6.3/bin/python3 + +# NOAA WCOSS Cray +#HOMEhafs=/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS +#dev="-s sites/wcoss_cray.ent -f" +#PYTHON3=/opt/intel/intelpython3/bin/python3 + +# NOAA RDHPCS Jet +#HOMEhafs=/mnt/lfs4/HFIP/hwrfv3/${USER}/HAFS +##dev="-s sites/xjet.ent -f" +#dev="-s sites/xjet_hafsv0p2a.ent -f" +#PYTHON3=/apps/intel/intelpython3/bin/python3 + +# MSU Orion + HOMEhafs=/work/noaa/hwrf/save/${USER}/HAFS + dev="-s sites/orion.ent -f" + PYTHON3=/apps/intel-2020/intel-2020/intelpython3/bin/python3 + +# NOAA RDHPCS Hera +#HOMEhafs=/scratch1/NCEPDEV/hwrf/save/${USER}/HAFS +#dev="-s sites/hera.ent -f" +#PYTHON3=/apps/intel/intelpython3/bin/python3 + +cd ${HOMEhafs}/rocoto + +EXPT=$(basename ${HOMEhafs}) + +#=============================================================================== + + # hafsv0p2a phase2 + confopts="config.EXPT=${EXPT} config.SUBEXPT=hafsv0p2a_phase2 \ + ../parm/hafsv0p2a_phase2_AL.conf \ + ../parm/hafs_hycom.conf" + +## Technical test for 2020082506-2020082512 13L2020 +#${PYTHON3} ./run_hafs.py -t ${dev} 2020082506-2020082512 00L HISTORY ${confopts} \ +# config.run_emcgraphics=no \ +# config.scrub_work=no config.scrub_com=no + +## 2020 NATL storm slots +#${PYTHON3} ./run_hafs.py -t ${dev} 2020060112-2020060812 00L HISTORY ${confopts} # Slot 1.0: 03L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020062112-2020062406 00L HISTORY ${confopts} # Slot 1.1: 04L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020070400-2020070612 00L HISTORY ${confopts} # Slot 1.2: 05L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020070912-2020071100 00L HISTORY ${confopts} # Slot 1.3: 06L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020072112-2020072618 00L HISTORY ${confopts} # Slot 1.4: 07L, 08L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020072806-2020080500 00L HISTORY ${confopts} # Slot 2: 09L, 10L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020081100-2020081612 00L HISTORY ${confopts} # Slot 3: 11L, 12L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020081918-2020082718 00L HISTORY ${confopts} # Slot 4: 13L, 14L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020083112-2020090512 00L HISTORY ${confopts} # Slot 5: 15L, 16L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020090612-2020091118 00L HISTORY ${confopts} # Slot 6: 17Lp1, 18Lp1 +#${PYTHON3} ./run_hafs.py -t ${dev} 2020091200-2020092300 00L HISTORY ${confopts} # Slot 7: 17Lp2, 18Lp2, 19-24L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020100212-2020101018 00L HISTORY ${confopts} # Slot 8: 25L, 26L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020101618-2020102912 00L HISTORY ${confopts} # Slot 9: 27L, 28L +#${PYTHON3} ./run_hafs.py -t ${dev} 2020101618-2020102912 00L HISTORY ${confopts} # Slot 10: 29-31L # No GFSv16 version input data + +## 2019 NATL storm slots +#${PYTHON3} ./run_hafs.py -t ${dev} 2019082406-2019091006 00L HISTORY ${confopts} # Slot 5: 05-08L +#${PYTHON3} ./run_hafs.py -t ${dev} 2019091212-2019092712 00L HISTORY ${confopts} # Slot 6: 09-12L + +#=============================================================================== + +date + +echo 'cronjob done' diff --git a/rocoto/env_vars.ent b/rocoto/env_vars.ent index be506443f..47816882b 100644 --- a/rocoto/env_vars.ent +++ b/rocoto/env_vars.ent @@ -8,10 +8,6 @@ envir prod - - PARAFLAG - YES - WHERE_AM_I &WHERE_AM_I; @@ -44,10 +40,6 @@ HOLDVARS &HOLDVARS; - - HAFS_FORCE_TMPDIR - &WORKhafs;/tmpdir - jlogfile &LOGhafs;/jlogfile diff --git a/rocoto/hafs_workflow.xml.in b/rocoto/hafs_workflow.xml.in index 3c98be0d1..a222f434a 100644 --- a/rocoto/hafs_workflow.xml.in +++ b/rocoto/hafs_workflow.xml.in @@ -7,12 +7,12 @@ - + - + @@ -62,16 +62,27 @@ + + + + + + + + + + + @@ -186,15 +197,15 @@ - - &JOBhafs;/JHAFS_GRID - hafs_grid_&SID;_@Y@m@d@H - &WORKhafs;/hafs_grid.log + + &JOBhafs;/JHAFS_ATM_PREP + hafs_atm_prep_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_prep.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &GRID_RESOURCES; + &ATM_PREP_RESOURCES; &ENV_VARS; @@ -204,20 +215,20 @@ - - &JOBhafs;/JHAFS_CHGRES_IC - hafs_chgres_ic_&SID;_@Y@m@d@H - &WORKhafs;/hafs_chgres_ic.log + + &JOBhafs;/JHAFS_ATM_IC + hafs_atm_ic_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_ic.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &CHGRES_IC_RESOURCES; + &ATM_IC_RESOURCES; &ENV_VARS; - + &FETCH_INPUT;YES @@ -240,24 +251,24 @@ @** if gtype==regional - + 001 002 003 004 005 006 - - &JOBhafs;/JHAFS_CHGRES_BC - hafs_chgres_bc#group#_&SID;_@Y@m@d@H - &WORKhafs;/hafs_chgres_bc#group#.log + + &JOBhafs;/JHAFS_ATM_LBC + hafs_atm_lbc#group#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_lbc#group#.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &CHGRES_BC_RESOURCES; + &ATM_LBC_RESOURCES; &ENV_VARS; BC_GROUPN6 BC_GROUPI#group# - + &FETCH_INPUT;YES @@ -281,21 +292,20 @@ @** if RUN_OCEAN==YES - - - &PRE; &EXhafs;/exhafs_hycominit1.py - hafs_hycominit1_&SID;_@Y@m@d@H - &WORKhafs;/hafs_hycominit1.log + + &JOBhafs;/JHAFS_OCN_PREP + hafs_ocn_prep_&SID;_@Y@m@d@H + &WORKhafs;/hafs_ocn_prep.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &HYCOMINIT_RESOURCES; + &OCN_PREP_RESOURCES; &ENV_VARS; - + &FETCH_INPUT;YES @@ -322,47 +332,144 @@ &COMrtofs;/rtofs.@Y@m@d/rtofs_glo.t00z.f@H.archv.a.tgz +@** if GFSVER==PROD2019 + &COMgfs;/gfs.@Y@m@d/@H/gfs.t@Hz.pgrb2.0p25.f129 +@** endif +@** if GFSVER==PROD2021 + &COMgfs;/gfs.@Y@m@d/@H/atmos/gfs.t@Hz.pgrb2.0p25.f129 +@** endif +@** endif - - - &PRE; &EXhafs;/exhafs_hycominit2.py - hafs_hycominit2_&SID;_@Y@m@d@H - &WORKhafs;/hafs_hycominit2.log +@** if RUN_GSI_VR==YES + + &JOBhafs;/JHAFS_ANALYSIS_VR + hafs_analysis_vr_&SID;_@Y@m@d@H + &WORKhafs;/hafs_analysis_vr.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &HYCOMINIT_RESOURCES; + &ANALYSIS_RESOURCES; &ENV_VARS; - - - - &FETCH_INPUT;YES + + &RUN_GSI_VR;YES + + + + &COMhafs;/RESTART/@Y@m@d.@H0000.fv_core.res.tile1.nc + &COMhafs;/RESTART/grid_spec.nc + if [[ $(/bin/ls -l &COMhafs;/*&sidlc;.@Y@m@d@H.trak.hafs.atcfunix.all | wc -l) -ge 1 ]]; then exit 0; else exit 1; fi + - - @Y@m@d@H@M@S - + + + +@** endif + +@** if RUN_GSI_VR_FGAT==YES + + 03 09 + + &JOBhafs;/JHAFS_ANALYSIS_VR + hafs_analysis_vr_fgat#FGAT_HR#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_analysis_vr_fgat#FGAT_HR#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ANALYSIS_RESOURCES; + &ENV_VARS; + FGATYES + FGAT_HR#FGAT_HR# + -@** if GFSVER==PROD2019 - &COMgfs;/gfs.@Y@m@d/@H/gfs.t@Hz.pgrb2.0p25.f129 + + &RUN_GSI_VR_FGAT;YES + + + + &COMhafs;/RESTART/@Y@m@d.@H0000.fv_core.res.tile1.nc + &COMhafs;/RESTART/grid_spec.nc + if [[ $(/bin/ls -l &COMhafs;/*&sidlc;.@Y@m@d@H.trak.hafs.atcfunix.all | wc -l) -ge 1 ]]; then exit 0; else exit 1; fi + + + + + + @** endif -@** if GFSVER==PROD2021 - &COMgfs;/gfs.@Y@m@d/@H/atmos/gfs.t@Hz.pgrb2.0p25.f129 + +@** if RUN_GSI==YES + + &JOBhafs;/JHAFS_ANALYSIS + hafs_analysis_&SID;_@Y@m@d@H + &WORKhafs;/hafs_analysis.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ANALYSIS_RESOURCES; + &ENV_VARS; + + + + &RUN_GSI;YES +@** if RUN_GSI_VR==YES + + &RUN_GSI_VR;YES + + @** endif - +@** if RUN_GSI_VR_FGAT==YES + + &RUN_GSI_VR_FGAT;YES + + +@** endif + + + + &COMhafs;/RESTART/@Y@m@d.@H0000.fv_core.res.tile1.nc + &COMhafs;/RESTART/grid_spec.nc +@** if RUN_ENSDA==YES + if [[ $(/bin/ls -l &COMhafs;/RESTART_ens/mem*/@Y@m@d.@H0000.fv_core.res.tile1.nc | wc -l) -ge &ENS_SIZE; ]]; then exit 0; else exit 1; fi +@** endif + + - @** endif +@** endif + +@** if RUN_ATM_INIT==YES + + &JOBhafs;/JHAFS_ATM_INIT + hafs_atm_init_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_init.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ATM_INIT_RESOURCES; + &ENV_VARS; + + + +@** if gtype==regional + +@** endif + + + @** endif @@ -378,31 +485,37 @@ - + @** if gtype==regional - + @** if RUN_OCEAN==YES - - + +@** endif +@** if RUN_GSI==YES + +@** endif +@** if RUN_GSI_VR==YES + @** endif + @** endif - - &JOBhafs;/JHAFS_POST - hafs_post_&SID;_@Y@m@d@H - &WORKhafs;/hafs_post.log + + &JOBhafs;/JHAFS_ATM_POST + hafs_atm_post_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_post.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &POST_RESOURCES; + &ATM_POST_RESOURCES; &ENV_VARS; - @@ -412,20 +525,19 @@ @** if RUN_OCEAN==YES - - - &JOBhafs;/JHAFS_HYCOMPOST - hafs_hycompost_&SID;_@Y@m@d@H - &WORKhafs;/hafs_hycompost.log + + &JOBhafs;/JHAFS_OCN_POST + hafs_ocn_post_&SID;_@Y@m@d@H + &WORKhafs;/hafs_ocn_post.log &ACCOUNT; &RESERVATION; &QUEUE_PE; &PE_EXTRA; - &HYCOMPOST_RESOURCES; + &OCN_POST_RESOURCES; &ENV_VARS; - @@ -447,15 +559,373 @@ &ENV_VARS; - - - + + +@** if RUN_ENSDA==YES + + &JOBhafs;/JHAFS_ATM_PREP + hafs_atm_prep_ens_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_prep_ens.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ATM_PREP_RESOURCES; + &ENV_VARS; + ENSDAYES + + + + + + + + + + + + + + + &ENSIDS; + + &JOBhafs;/JHAFS_ATM_IC + hafs_atm_ic_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_ic_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ATM_IC_ENS_RESOURCES; + &ENV_VARS; + ENSDAYES + ENSID#MEM# + + + + + + + &FETCH_INPUT;YES + + + @Y@m@d@H@M@S + + +@** if GFSVER==PROD2019 + &COMgfs;/enkfgdas.@Y@m@d/@H/mem#MEM#/gdas.t@Hz.atmf006.nemsio + &COMgfs;/enkfgdas.@Y@m@d/@H/mem#MEM#/gdas.t@Hz.sfcf006.nemsio +@** endif +@** if GFSVER==PROD2021 + &COMgfs;/enkfgdas.@Y@m@d/@H/atmos/mem#MEM#/gdas.t@Hz.atmf006.nc + &COMgfs;/enkfgdas.@Y@m@d/@H/atmos/mem#MEM#/gdas.t@Hz.sfcf006.nc +@** endif + + + + + + +@** if gtype==regional + + &ENSIDS; + + 001 + + &JOBhafs;/JHAFS_ATM_LBC + hafs_atm_lbc#group#_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_lbc#group#_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ATM_LBC_ENS_RESOURCES; + &ENV_VARS; + ENSDAYES + ENSID#MEM# + BC_GROUPN1 + BC_GROUPI#group# + + + + + + + &FETCH_INPUT;YES + + + @Y@m@d@H@M@S + + +@** if GFSVER==PROD2019 + &COMgfs;/enkfgdas.@Y@m@d/@H/mem#MEM#/gdas.t@Hz.atmf006.nemsio +@** endif +@** if GFSVER==PROD2021 + &COMgfs;/enkfgdas.@Y@m@d/@H/atmos/mem#MEM#/gdas.t@Hz.atmf006.nc +@** endif + + + + + + +@** endif + +@** if RUN_GSI_VR_ENS==YES + + &ENSIDS; + + &JOBhafs;/JHAFS_ANALYSIS_VR + hafs_analysis_vr_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_analysis_vr_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ANALYSIS_RESOURCES; + &ENV_VARS; + ENSDAYES + ENSID#MEM# + + + + + &RUN_GSI_VR_ENS;YES + + + + &COMhafs;/RESTART_ens/mem#MEM#/@Y@m@d.@H0000.fv_core.res.tile1.nc + &COMhafs;/RESTART_ens/mem#MEM#/grid_spec.nc + if [[ $(/bin/ls -l &COMhafs;/product_ens/mem#MEM#/*&sidlc;.@Y@m@d@H.trak.hafs.atcfunix.all | wc -l) -ge 1 ]]; then exit 0; else exit 1; fi + + + + + + +@** endif + +@** if RUN_ENKF==YES + + &JOBhafs;/JHAFS_ENKF_MEAN + hafs_enkf_mean_&SID;_@Y@m@d@H + &WORKhafs;/hafs_enkf_mean.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ENKF_ENKF_RESOURCES; + &ENV_VARS; + ENSDAYES + ldo_enscalc_option1 + + + + + + &RUN_ENKF;YES + if [[ $(/bin/ls -l &COMhafs;/RESTART_ens/mem*/@Y@m@d.@H0000.fv_core.res.tile1.nc | wc -l) -ge &ENS_SIZE; ]]; then exit 0; else exit 1; fi +@** if RUN_GSI_VR_ENS==YES + + &RUN_GSI_VR_ENS;YES + + +@** endif + + + + + + &JOBhafs;/JHAFS_ENKF_HX + hafs_enkf_hx_mean_&SID;_@Y@m@d@H + &WORKhafs;/hafs_enkf_hx_mean.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ENKF_GSI_RESOURCES; + &ENV_VARS; + ENSDAYES + + + + + + + + + + + + + + &ENSIDS; + + &JOBhafs;/JHAFS_ENKF_HX + hafs_enkf_hx_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_enkf_hx_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ENKF_GSI_RESOURCES; + &ENV_VARS; + ENSDAYES + HX_ENSYES + ENSID#MEM# + + + + + + + + + &JOBhafs;/JHAFS_ENKF_UPDATE + hafs_enkf_update_&SID;_@Y@m@d@H + &WORKhafs;/hafs_enkf_update.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ENKF_ENKF_RESOURCES; + &ENV_VARS; + ENSDAYES + ldo_enscalc_option0 + + + + + + + + + + + &JOBhafs;/JHAFS_ENKF_RECENTER + hafs_enkf_recenter_&SID;_@Y@m@d@H + &WORKhafs;/hafs_enkf_recenter.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ENKF_ENKF_RESOURCES; + &ENV_VARS; + ENSDAYES + ldo_enscalc_option2 + + + + + + + + +@** endif + + + &ENSIDS; + + &JOBhafs;/JHAFS_FORECAST + hafs_forecast_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_forecast_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &FORECAST_ENS_RESOURCES; + &ENV_VARS; + ENSDAYES + ENSID#MEM# + + + + +@** if gtype==regional + +@** if RUN_OCEAN==YES + +@** endif +@** if RUN_GSI_VR_ENS==YES + + + + +@** endif +@** if RUN_ENKF==YES + + + + +@** endif +@** endif + + + + + + + &ENSIDS; + + &JOBhafs;/JHAFS_ATM_POST + hafs_atm_post_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_atm_post_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &ATM_POST_RESOURCES; + &ENV_VARS; + ENSDAYES + ENSID#MEM# + + + + + + + + + + + + + &ENSIDS; + + &JOBhafs;/JHAFS_PRODUCT + hafs_product_ens#MEM#_&SID;_@Y@m@d@H + &WORKhafs;/hafs_product_ens#MEM#.log + &ACCOUNT; + &RESERVATION; + &QUEUE_PE; + &PE_EXTRA; + &PRODUCT_RESOURCES; + &ENV_VARS; + ENSDAYES + ENSID#MEM# + + + + + + + + + + + +@** endif + + @** if RUN_HRDGRAPHICS==YES &JOBhafs;/JHAFS_HRDGRAPHICS @@ -522,9 +992,9 @@ - + @** if RUN_OCEAN==YES - + @** endif @** if RUN_HRDGRAPHICS==YES @@ -532,6 +1002,9 @@ @** endif @** if RUN_EMCGRAPHICS==YES +@** endif +@** if RUN_ENSDA==YES + @** endif @@ -556,9 +1029,9 @@ - + @** if RUN_OCEAN==YES - + @** endif @** if RUN_HRDGRAPHICS==YES @@ -566,6 +1039,9 @@ @** endif @** if RUN_EMCGRAPHICS==YES +@** endif +@** if RUN_ENSDA==YES + @** endif @@ -692,7 +1168,7 @@ - + diff --git a/rocoto/rocoto_util.sh b/rocoto/rocoto_util.sh new file mode 100755 index 000000000..d0365506c --- /dev/null +++ b/rocoto/rocoto_util.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# A rocoto util script to check status for all/active/failed tasks, and +# if requested can also rewind the failed tasks. + +nopts=$# +if [ $nopts -lt 1 ]; then + echo Usage: + echo " ./rocoto_utils.sh [-a | -f | -r | -s] # Loop over all *.xml files" + echo " ./rocoto_utils.sh [-a | -f | -r | -s] hafs # Loop over hafs*.xml files" + echo " -a: check all active (SUBMITTING|QUEUED|RUNNING|DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks" + echo " -f: check all failed (DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks" + echo " -r: check and rewind all failed (DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks" + echo " -s: check status for all tasks" + exit 1 +fi + +if [ Q$(which rocotostat) = 'Q' ]; then + echo "Error: Make sure rocotostat and rocotorewind in the path" + exit 1 +fi + +cmdopt=${1:--a} + +for file in ${2:-''}*.xml +do + echo ${file} + fd=$(echo $file | rev | cut -d. -f2- | rev) + if [ $cmdopt = '-a' ]; then + # Check all active (SUBMITTING|QUEUED|RUNNING|DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks + echo $fd active tasks: + rocotostat -w $file -d ${fd}.db -c all | grep -E 'SUBMITTING|QUEUED|RUNNING|DEAD|UNKNOWN|FAILED|UNAVAILABLE' + elif [ $cmdopt = '-f' ]; then + # Checking failed tasks + echo $fd failed tasks: + rocotostat -w $file -d ${fd}.db -c all | grep -E 'DEAD|UNKNOWN|FAILED|UNAVAILABLE' + elif [ $cmdopt = '-r' ]; then + # Deal with failed tasks + >temp_deadlist.dat + rocotostat -w $file -d ${fd}.db -c all | grep -E 'DEAD|UNKNOWN|FAILED|UNAVAILABLE' > temp_deadlist.dat + ll=$(cat temp_deadlist.dat |wc -l) + if [ $ll -ne 0 ] ; then + while read line + do + cc=$(echo $line | awk '{print $1}') + tt=$(echo $line | awk '{print $2}') + echo "rewinding $file $cc $tt" + rocotorewind -w $file -d ${fd}.db -c $cc -t $tt + done < temp_deadlist.dat + fi + rm -f temp_deadlist.dat + elif [ $cmdopt = '-s' ]; then + # Check status for all tasks + echo $fd all tasks: + rocotostat -w $file -d ${fd}.db -c all + else + echo "Error: unknown commandline option" + echo "Usage:" + echo " ./rocoto_utils.sh [-a | -f | -r | -s] # Loop over all *.xml files" + echo " ./rocoto_utils.sh [-a | -f | -r | -s] hafs # Loop over hafs*.xml files" + echo " -a: check all active (SUBMITTING|QUEUED|RUNNING|DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks" + echo " -f: check all failed (DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks" + echo " -r: check and rewind all failed (DEAD|UNKNOWN|FAILED|UNAVAILABLE) tasks" + echo " -s: check status for all tasks" + exit 1 + fi +done + diff --git a/rocoto/run_hafs.py b/rocoto/run_hafs.py index 64144bdd4..5bd1e7c32 100755 --- a/rocoto/run_hafs.py +++ b/rocoto/run_hafs.py @@ -503,6 +503,7 @@ def check_test_vitals(vl): # Create the list of variables to send to the ATParser VARS=dict(os.environ) + if cycleset: VARS['CYCLE_LIST']=tcutil.rocoto.cycles_as_entity(cycleset) for line in VARS['CYCLE_LIST'].splitlines(): @@ -553,6 +554,14 @@ def yesno(b): for (key,val) in conf.items('rocotobool'): VARS[key]=yesno(conf.getbool('rocotobool',key)) +if conf.getbool('config','run_ensda',False): + ens_size=conf.getint('config','ENS_SIZE',40) + assert(ens_size>=1) + ensids=' '.join([ '%03d'%(i+1) for i in range(ens_size) ]) + VARS.update(ENS_SIZE='%d'%ens_size,ENSIDS=ensids) +else: + VARS.update(ENS_SIZE='000',ENSIDS='000') + bad=False for k,v in VARS.items(): if not isinstance(v,str): diff --git a/rocoto/sites/hera.ent b/rocoto/sites/hera.ent index c62a5c0f2..bc7d97c09 100644 --- a/rocoto/sites/hera.ent +++ b/rocoto/sites/hera.ent @@ -14,12 +14,18 @@ 1G"> - 6:ppn=2:tpp=6TOTAL_TASKS12NCTSK2OMP_THREADS600:30:0024G"> - 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> - 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> - 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK40OMP_THREADS100:30:00"> + 6:ppn=2:tpp=6TOTAL_TASKS12NCTSK2OMP_THREADS600:30:0024G"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> + 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK40OMP_THREADS100:30:00"> - 06:00:00"> + 80:ppn=10:tpp=1TOTAL_TASKS800NCTSK10OMP_THREADS103:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 1:ppn=20:tpp=1TOTAL_TASKS20NCTSK20OMP_THREADS102:00:00"> + + 07:59:00"> OMP_THREADS2"> @@ -31,11 +37,18 @@ 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=2TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> @@ -44,8 +57,26 @@ 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> - 6:ppn=40:tpp=1TOTAL_TASKS240NCTSK40OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=2TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=2TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=2TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=2TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=2TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + + 4:ppn=40:tpp=1TOTAL_TASKS160NCTSK40OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK1OMP_THREADS107:59:00"> diff --git a/rocoto/sites/kjet.ent b/rocoto/sites/kjet.ent index 385bc05f4..f2cb72529 100644 --- a/rocoto/sites/kjet.ent +++ b/rocoto/sites/kjet.ent @@ -14,10 +14,16 @@ 1G"> - 6:ppn=2:tpp=6TOTAL_TASKS12NCTSK2OMP_THREADS600:30:0024G"> - 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> - 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> - 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK40OMP_THREADS100:30:00"> + 6:ppn=2:tpp=6TOTAL_TASKS12NCTSK2OMP_THREADS600:30:0024G"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> + 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK40OMP_THREADS100:30:00"> + + 80:ppn=10:tpp=1TOTAL_TASKS800NCTSK10OMP_THREADS103:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 1:ppn=20:tpp=1TOTAL_TASKS20NCTSK20OMP_THREADS102:00:00"> 07:59:00"> OMP_THREADS2"> @@ -31,11 +37,18 @@ 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=2TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> @@ -44,8 +57,26 @@ 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> - 6:ppn=40:tpp=1TOTAL_TASKS240NCTSK40OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=2TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=2TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=2TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=2TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=2TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + + 6:ppn=40:tpp=1TOTAL_TASKS240NCTSK40OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK1OMP_THREADS107:59:00"> diff --git a/rocoto/sites/orion.ent b/rocoto/sites/orion.ent index c90228545..a86bba72d 100644 --- a/rocoto/sites/orion.ent +++ b/rocoto/sites/orion.ent @@ -14,12 +14,18 @@ 1G"> - 6:ppn=2:tpp=6TOTAL_TASKS12NCTSK2OMP_THREADS600:30:0024G"> - 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> - 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> - 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK40OMP_THREADS100:30:00"> + 6:ppn=2:tpp=6TOTAL_TASKS12NCTSK2OMP_THREADS600:30:0024G"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS100:30:00"> + 6:ppn=20:tpp=1TOTAL_TASKS120NCTSK20OMP_THREADS101:00:00"> + 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK40OMP_THREADS100:30:00"> - 06:00:00"> + 80:ppn=10:tpp=1TOTAL_TASKS800NCTSK10OMP_THREADS103:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 1:ppn=20:tpp=1TOTAL_TASKS20NCTSK20OMP_THREADS102:00:00"> + + 07:59:00"> OMP_THREADS2"> @@ -31,11 +37,20 @@ 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=2TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> @@ -44,8 +59,26 @@ 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> - 6:ppn=40:tpp=1TOTAL_TASKS240NCTSK40OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=2TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=2TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=2TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=2TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=2TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + + 4:ppn=40:tpp=1TOTAL_TASKS160NCTSK40OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=40:tpp=1TOTAL_TASKS40NCTSK1OMP_THREADS107:59:00"> diff --git a/rocoto/sites/wcoss_cray.ent b/rocoto/sites/wcoss_cray.ent index c4c3d37b7..a6acf186e 100644 --- a/rocoto/sites/wcoss_cray.ent +++ b/rocoto/sites/wcoss_cray.ent @@ -14,12 +14,18 @@ 1G"> - 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS100:30:00"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> - 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> + 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> + 30:ppn=12:tpp=1TOTAL_TASKS360NCTSK12OMP_THREADS100:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS100:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> + 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> - 06:00:00"> + 60:ppn=12:tpp=1TOTAL_TASKS720NCTSK12OMP_THREADS102:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS102:00:00"> + + 07:59:00"> OMP_THREADS2"> @@ -31,11 +37,18 @@ 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=2TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> @@ -44,8 +57,26 @@ 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=2TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=2TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=2TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=2TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=2TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:002G"> 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS107:59:00"> diff --git a/rocoto/sites/wcoss_dell_p3.ent b/rocoto/sites/wcoss_dell_p3.ent index cda8e2a5a..ce1e4be20 100644 --- a/rocoto/sites/wcoss_dell_p3.ent +++ b/rocoto/sites/wcoss_dell_p3.ent @@ -15,12 +15,18 @@ 1G"> - 1:ppn=6:tpp=1TOTAL_TASKS6NCTSK6OMP_THREADS4-R affinity[core\(4\):distribute=balance]00:30:00"> - 3:ppn=24:tpp=1TOTAL_TASKS72NCTSK24OMP_THREADS100:30:00"> - 2:ppn=24:tpp=1TOTAL_TASKS48NCTSK24OMP_THREADS103:30:00"> - 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> + 1:ppn=6:tpp=1TOTAL_TASKS6NCTSK6OMP_THREADS4-R affinity[core\(4\):distribute=balance]00:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS101:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS101:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> + 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> - 06:00:00"> + 60:ppn=12:tpp=1TOTAL_TASKS720NCTSK12OMP_THREADS102:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS102:00:00"> + + 07:59:00"> OMP_THREADS2-R affinity[core\(2\):distribute=balance]"> @@ -29,24 +35,49 @@ 108:ppn=12:tpp=1TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> 168:ppn=12:tpp=1TOTAL_TASKS2016NCTSK12&FORECAST_EXTRA;"> - 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> - 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=1TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 100:ppn=20:tpp=1TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + + 6:ppn=12:tpp=1TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=1TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 43:ppn=12:tpp=1TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=1TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=1TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=1TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> - 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> - 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=1TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=1TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=1TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> + 103:ppn=20:tpp=1TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> 52:ppn=12:tpp=1TOTAL_TASKS624NCTSK12&FORECAST_EXTRA;"> 140:ppn=12:tpp=1TOTAL_TASKS1680NCTSK12&FORECAST_EXTRA;"> 148:ppn=12:tpp=1TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> - 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> + 88:ppn=20:tpp=1TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> + + + 6:ppn=12:tpp=1TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=1TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=1TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=1TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=1TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=1TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=1TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=1TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=1TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=1TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=1TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=1TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=1TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=1TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=1TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=1TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS107:59:00"> diff --git a/rocoto/sites/xjet.ent b/rocoto/sites/xjet.ent index 7a0024977..5916a0bc8 100644 --- a/rocoto/sites/xjet.ent +++ b/rocoto/sites/xjet.ent @@ -14,10 +14,16 @@ 1G"> - 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS100:30:00"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> - 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> + 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS101:30:00"> + 8:ppn=12:tpp=1TOTAL_TASKS96NCTSK12OMP_THREADS103:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS100:30:00"> + 8:ppn=12:tpp=1TOTAL_TASKS96NCTSK12OMP_THREADS103:30:00"> + 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> + + 80:ppn=6:tpp=1TOTAL_TASKS480NCTSK6OMP_THREADS102:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 2:ppn=12:tpp=1TOTAL_TASKS24NCTSK12OMP_THREADS102:00:00"> 07:59:00"> OMP_THREADS2"> @@ -28,24 +34,69 @@ 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> 168:ppn=12:tpp=2TOTAL_TASKS2016NCTSK12&FORECAST_EXTRA;"> + 20:ppn=12:tpp=2TOTAL_TASKS240NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 168:ppn=12:tpp=2TOTAL_TASKS2016NCTSK12&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> + 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=2TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> 52:ppn=12:tpp=2TOTAL_TASKS624NCTSK12&FORECAST_EXTRA;"> 140:ppn=12:tpp=2TOTAL_TASKS1680NCTSK12&FORECAST_EXTRA;"> 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> + 52:ppn=12:tpp=2TOTAL_TASKS624NCTSK12&FORECAST_EXTRA;"> + 140:ppn=12:tpp=2TOTAL_TASKS1680NCTSK12&FORECAST_EXTRA;"> + 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=2TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=2TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=2TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=2TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=2TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS107:59:00"> diff --git a/rocoto/sites/xjet_hafsv0p1a.ent b/rocoto/sites/xjet_hafsv0p1a.ent index a00405257..9d27aeca4 100644 --- a/rocoto/sites/xjet_hafsv0p1a.ent +++ b/rocoto/sites/xjet_hafsv0p1a.ent @@ -14,10 +14,14 @@ 1G"> - 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> - 6:ppn=24:tpp=1TOTAL_TASKS144NCTSK24OMP_THREADS100:30:00"> - 6:ppn=24:tpp=1TOTAL_TASKS144NCTSK24OMP_THREADS103:30:00"> - 1:ppn=6:tpp=1TOTAL_TASKS6NCTSK6OMP_THREADS100:30:008G"> + 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> + 6:ppn=24:tpp=1TOTAL_TASKS144NCTSK24OMP_THREADS100:30:00"> + 6:ppn=24:tpp=1TOTAL_TASKS144NCTSK24OMP_THREADS103:30:00"> + 1:ppn=6:tpp=1TOTAL_TASKS6NCTSK6OMP_THREADS100:30:008G"> + + 40:ppn=24:tpp=1TOTAL_TASKS960NCTSK24OMP_THREADS101:00:00"> + 10:ppn=24:tpp=1TOTAL_TASKS240NCTSK24OMP_THREADS101:00:00"> + 10:ppn=24:tpp=1TOTAL_TASKS240NCTSK24OMP_THREADS101:00:00"> 07:59:00"> OMP_THREADS2"> @@ -78,8 +82,8 @@ 170:ppn=12:tpp=2TOTAL_TASKS2040NCTSK12&FORECAST_EXTRA;"> - 5:ppn=24:tpp=1TOTAL_TASKS120NCTSK24OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + 5:ppn=24:tpp=1TOTAL_TASKS120NCTSK24OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS107:59:00"> diff --git a/rocoto/sites/xjet_hafsv0p2a.ent b/rocoto/sites/xjet_hafsv0p2a.ent index d3a046ad2..bfee78029 100644 --- a/rocoto/sites/xjet_hafsv0p2a.ent +++ b/rocoto/sites/xjet_hafsv0p2a.ent @@ -14,10 +14,16 @@ 1G"> - 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> - 30:ppn=24:tpp=1TOTAL_TASKS720NCTSK24OMP_THREADS100:30:00"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS103:30:00"> - 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> + 3:ppn=4:tpp=6TOTAL_TASKS12NCTSK4OMP_THREADS600:30:00"> + 30:ppn=24:tpp=1TOTAL_TASKS720NCTSK24OMP_THREADS101:30:00"> + 8:ppn=12:tpp=1TOTAL_TASKS96NCTSK12OMP_THREADS103:30:00"> + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS100:30:00"> + 8:ppn=12:tpp=1TOTAL_TASKS96NCTSK12OMP_THREADS103:30:00"> + 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS100:30:00"> + + 80:ppn=6:tpp=1TOTAL_TASKS480NCTSK6OMP_THREADS102:00:00"> + 60:ppn=1:tpp=1TOTAL_TASKS60NCTSK1OMP_THREADS102:00:00"> + 2:ppn=12:tpp=1TOTAL_TASKS24NCTSK12OMP_THREADS102:00:00"> 07:59:00"> OMP_THREADS2"> @@ -28,24 +34,69 @@ 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> 168:ppn=12:tpp=2TOTAL_TASKS2016NCTSK12&FORECAST_EXTRA;"> + 20:ppn=12:tpp=2TOTAL_TASKS240NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 168:ppn=12:tpp=2TOTAL_TASKS2016NCTSK12&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> 100:ppn=20:tpp=2TOTAL_TASKS2000NCTSK20&FORECAST_EXTRA;"> + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + 133:ppn=12:tpp=2TOTAL_TASKS1596NCTSK12&FORECAST_EXTRA;"> + 173:ppn=12:tpp=2TOTAL_TASKS2076NCTSK12&FORECAST_EXTRA;"> + + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + 79:ppn=20:tpp=2TOTAL_TASKS1580NCTSK20&FORECAST_EXTRA;"> 103:ppn=20:tpp=2TOTAL_TASKS2060NCTSK20&FORECAST_EXTRA;"> 52:ppn=12:tpp=2TOTAL_TASKS624NCTSK12&FORECAST_EXTRA;"> 140:ppn=12:tpp=2TOTAL_TASKS1680NCTSK12&FORECAST_EXTRA;"> 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> + 52:ppn=12:tpp=2TOTAL_TASKS624NCTSK12&FORECAST_EXTRA;"> + 140:ppn=12:tpp=2TOTAL_TASKS1680NCTSK12&FORECAST_EXTRA;"> + 148:ppn=12:tpp=2TOTAL_TASKS1776NCTSK12&FORECAST_EXTRA;"> 88:ppn=20:tpp=2TOTAL_TASKS1760NCTSK20&FORECAST_EXTRA;"> - 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> - 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> + + 6:ppn=12:tpp=2TOTAL_TASKS72NCTSK12&FORECAST_EXTRA;"> + 11:ppn=12:tpp=2TOTAL_TASKS132NCTSK12&FORECAST_EXTRA;"> + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + + 38:ppn=12:tpp=2TOTAL_TASKS456NCTSK12&FORECAST_EXTRA;"> + 43:ppn=12:tpp=2TOTAL_TASKS516NCTSK12&FORECAST_EXTRA;"> + 48:ppn=12:tpp=2TOTAL_TASKS576NCTSK12&FORECAST_EXTRA;"> + 53:ppn=12:tpp=2TOTAL_TASKS636NCTSK12&FORECAST_EXTRA;"> + 108:ppn=12:tpp=2TOTAL_TASKS1296NCTSK12&FORECAST_EXTRA;"> + 113:ppn=12:tpp=2TOTAL_TASKS1356NCTSK12&FORECAST_EXTRA;"> + + 4:ppn=20:tpp=2TOTAL_TASKS80NCTSK20&FORECAST_EXTRA;"> + 7:ppn=20:tpp=2TOTAL_TASKS140NCTSK20&FORECAST_EXTRA;"> + 19:ppn=20:tpp=2TOTAL_TASKS380NCTSK20&FORECAST_EXTRA;"> + 22:ppn=20:tpp=2TOTAL_TASKS440NCTSK20&FORECAST_EXTRA;"> + 28:ppn=20:tpp=2TOTAL_TASKS560NCTSK20&FORECAST_EXTRA;"> + 31:ppn=20:tpp=2TOTAL_TASKS620NCTSK20&FORECAST_EXTRA;"> + 64:ppn=20:tpp=2TOTAL_TASKS1280NCTSK20&FORECAST_EXTRA;"> + 67:ppn=20:tpp=2TOTAL_TASKS1340NCTSK20&FORECAST_EXTRA;"> + + 8:ppn=24:tpp=1TOTAL_TASKS192NCTSK24OMP_THREADS107:59:00"> + 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:00"> 1:ppn=1:tpp=1TOTAL_TASKS1NCTSK1OMP_THREADS107:59:0024G"> 1:ppn=24:tpp=1TOTAL_TASKS24NCTSK24OMP_THREADS107:59:00"> diff --git a/scripts/exhafs_analysis.sh b/scripts/exhafs_analysis.sh new file mode 100755 index 000000000..5e085a4c0 --- /dev/null +++ b/scripts/exhafs_analysis.sh @@ -0,0 +1,724 @@ +#!/bin/sh + +set -xe + +export PARMgsi=${PARMgsi:-${PARMhafs}/analysis/gsi} +export FIXcrtm=${FIXcrtm:-${FIXhafs}/hwrf-crtm-2.2.6} +export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} +export COMINhafs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} +export DONST=${DONST:-"NO"} +export LEVS=${LEVS:-65} +export use_bufr_nr=${use_bufr_nr:-no} +export out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} + +export RUN_GSI_VR=${RUN_GSI_VR:-NO} +export RUN_GSI_VR_FGAT=${RUN_GSI_VR_FGAT:-NO} +export RUN_GSI_VR_ENS=${RUN_GSI_VR_ENS:-NO} +export RUN_GSI=${RUN_GSI:-NO} +export RUN_FGAT=${RUN_FGAT:-NO} +export FGAT=${FGAT:-NO} +export RUN_ENVAR=${RUN_ENVAR:-NO} +export RUN_ENSDA=${RUN_ENSDA:-NO} +export ENSDA=${ENSDA:-NO} +export GRID_RATIO_ENS=${GRID_RATIO_ENS:-1} + +TOTAL_TASKS=${TOTAL_TASKS:-2016} +NCTSK=${NCTSK:-12} +NCNODE=${NCNODE:-24} +OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} +APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} + +# Utilities +NDATE=${NDATE:-ndate} +export NCP=${NCP:-"/bin/cp"} +export NMV=${NMV:-"/bin/mv"} +export NLN=${NLN:-"/bin/ln -sf"} +export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} +export CATEXEC=${CATEXEC:-${EXEChafs}/hafs_ncdiag_cat.x} +export MPISERIAL=${MPISERIAL:-${EXEChafs}/hafs_mpiserial.x} +export COMPRESS=${COMPRESS:-gzip} +export UNCOMPRESS=${UNCOMPRESS:-gunzip} + +if [ $GFSVER = PROD2021 ]; then + export atmos="atmos/" + export USE_GFS_NEMSIO=.false. + export USE_GFS_NCIO=.true. + GSUFFIX=${GSUFFIX:-.nc} +elif [ $GFSVER = PROD2019 ]; then + export atmos="" + export USE_GFS_NEMSIO=.true. + export USE_GFS_NCIO=.false. + GSUFFIX=${GSUFFIX:-.nemsio} +else + export atmos="" + export USE_GFS_NEMSIO=.true. + export USE_GFS_NCIO=.false. + GSUFFIX=${GSUFFIX:-.nemsio} +fi + +# Diagnostic files options +export netcdf_diag=${netcdf_diag:-".true."} +export binary_diag=${binary_diag:-".false."} + +yr=`echo $CDATE | cut -c1-4` +mn=`echo $CDATE | cut -c5-6` +dy=`echo $CDATE | cut -c7-8` + +CDATEprior=`${NDATE} -6 $CDATE` +yrprior=`echo ${CDATEprior} | cut -c1-4` +mnprior=`echo ${CDATEprior} | cut -c5-6` +dyprior=`echo ${CDATEprior} | cut -c7-8` +hhprior=`echo ${CDATEprior} | cut -c9-10` +cycprior=`echo ${CDATEprior} | cut -c9-10` +PDYprior=`echo ${CDATEprior} | cut -c1-8` + +if [ ${RUN_FGAT} = YES ]; then + CDATEtm03=`${NDATE} -3 $CDATE` + PDYtm03=`echo ${CDATEtm03} | cut -c1-8` + cyctm03=`echo ${CDATEtm03} | cut -c9-10` + CDATEtm02=`${NDATE} -2 $CDATE` + PDYtm02=`echo ${CDATEtm02} | cut -c1-8` + cyctm02=`echo ${CDATEtm02} | cut -c9-10` + CDATEtm01=`${NDATE} -1 $CDATE` + PDYtm01=`echo ${CDATEtm01} | cut -c1-8` + cyctm01=`echo ${CDATEtm01} | cut -c9-10` + CDATEtp03=`${NDATE} +3 $CDATE` + PDYtp03=`echo ${CDATEtp03} | cut -c1-8` + cyctp03=`echo ${CDATEtp03} | cut -c9-10` + CDATEtp02=`${NDATE} +2 $CDATE` + PDYtp02=`echo ${CDATEtp02} | cut -c1-8` + cyctp02=`echo ${CDATEtp02} | cut -c9-10` + CDATEtp01=`${NDATE} +1 $CDATE` + PDYtp01=`echo ${CDATEtp01} | cut -c1-8` + cyctp01=`echo ${CDATEtp01} | cut -c9-10` +fi + +export COMhafsprior=${COMhafsprior:-${COMhafs}/../../${CDATEprior}/${STORMID}} +export WORKhafsprior=${WORKhafsprior:-${WORKhafs}/../../${CDATEprior}/${STORMID}} + +if [ ! ${RUN_GSI} = "YES" ]; then + echo "RUN_GSI: ${RUN_GSI} is not YES" + echo "Do nothing. Exiting" + exit +fi + +if [ ! -s ${COMhafsprior}/storm1.holdvars.txt ] && [ ! -s ${COMhafsprior}/RESTART/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + echo "Prior cycle does not exist. No need to run gsi for the first cycle." + echo "Do nothing. Exiting" + exit +fi + +# Copy the first guess files +if [ ${RUN_GSI_VR} = "YES" ]; then + RESTARTinp=${COMhafs}/RESTART_analysis_vr +else + RESTARTinp=${COMhafsprior}/RESTART +fi + +export RESTARTanl=${RESTARTanl:-${COMhafs}/RESTART_analysis} +mkdir -p ${RESTARTanl} + +# We should already be in $DATA, but extra cd to be sure. +cd $DATA + +if [ ${RUN_FGAT} = "YES" ]; then + if [ ${RUN_GSI_VR_FGAT} = "YES" ]; then + RESTARTinp_fgat=${COMhafs}/RESTART_analysis_vr + else + RESTARTinp_fgat=${COMhafsprior}/RESTART + fi + ${NLN} ${RESTARTinp_fgat}/${PDYtm03}.${cyctm03}0000.coupler.res ./coupler.res_03 + ${NLN} ${RESTARTinp_fgat}/${PDYtm03}.${cyctm03}0000.fv_core.res.nc ./fv3_akbk_03 + ${NLN} ${RESTARTinp_fgat}/${PDYtm03}.${cyctm03}0000.sfc_data.nc ./fv3_sfcdata_03 + ${NLN} ${RESTARTinp_fgat}/${PDYtm03}.${cyctm03}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd_03 + ${NLN} ${RESTARTinp_fgat}/${PDYtm03}.${cyctm03}0000.fv_core.res.tile1.nc ./fv3_dynvars_03 + ${NLN} ${RESTARTinp_fgat}/${PDYtm03}.${cyctm03}0000.fv_tracer.res.tile1.nc ./fv3_tracer_03 + ${NLN} ${RESTARTinp_fgat}/${PDYtp03}.${cyctp03}0000.coupler.res ./coupler.res_09 + ${NLN} ${RESTARTinp_fgat}/${PDYtp03}.${cyctp03}0000.fv_core.res.nc ./fv3_akbk_09 + ${NLN} ${RESTARTinp_fgat}/${PDYtp03}.${cyctp03}0000.sfc_data.nc ./fv3_sfcdata_09 + ${NLN} ${RESTARTinp_fgat}/${PDYtp03}.${cyctp03}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd_09 + ${NLN} ${RESTARTinp_fgat}/${PDYtp03}.${cyctp03}0000.fv_core.res.tile1.nc ./fv3_dynvars_09 + ${NLN} ${RESTARTinp_fgat}/${PDYtp03}.${cyctp03}0000.fv_tracer.res.tile1.nc ./fv3_tracer_09 +fi + +if [ ${RUN_ENVAR} = "YES" ]; then + +export L_HYB_ENS=.true. +if [ ${RUN_ENSDA} = "YES" ]; then + export N_ENS=${ENS_SIZE:-2} + export BETA_S0=${BETA_S0:-0.0} + export GRID_RATIO_ENS=${GRID_RATIO_ENS} + export REGIONAL_ENSEMBLE_OPTION=5 + for mem in $(seq -f '%03g' 1 ${N_ENS}) + do + #if [ ${RUN_GSI_VR_ENS} = "YES" ]; then + # RESTARTens=${COMhafs}/RESTART_analysis_vr_ens/mem${mem} + # RESTARTens=${WORKhafs}/intercom/RESTART_analysis_vr_ens/mem${mem} + #else + RESTARTens=${COMhafsprior}/RESTART_ens/mem${mem} + #fi + ${NLN} ${RESTARTens}/${PDY}.${cyc}0000.coupler.res ./fv3SAR06_ens_mem${mem}-coupler.res + ${NLN} ${RESTARTens}/${PDY}.${cyc}0000.fv_core.res.nc ./fv3SAR06_ens_mem${mem}-fv3_akbk + ${NLN} ${RESTARTens}/${PDY}.${cyc}0000.sfc_data.nc ./fv3SAR06_ens_mem${mem}-fv3_sfcdata + ${NLN} ${RESTARTens}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ./fv3SAR06_ens_mem${mem}-fv3_srfwnd + ${NLN} ${RESTARTens}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ./fv3SAR06_ens_mem${mem}-fv3_dynvars + ${NLN} ${RESTARTens}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ./fv3SAR06_ens_mem${mem}-fv3_tracer + if [ ! -s ./fv3_ens_grid_spec ]; then + ${NLN} ${RESTARTens}/grid_spec.nc ./fv3_ens_grid_spec + fi + done +else + export N_ENS=80 + export BETA_S0=${BETA_S0:-0.2} + export GRID_RATIO_ENS=1 + export REGIONAL_ENSEMBLE_OPTION=1 +# Link ensemble members + mkdir -p ensemble_data + ENKF_SUFFIX="s" + GSUFFIX=${GSUFFIX:-.nemsio} + fhrs="06" + for fhh in $fhrs; do + rm -f filelist${fhh} + for mem in $(seq -f '%03g' 1 ${N_ENS}); do + if [ $USE_GFS_NEMSIO = .true. ]; then + if [ -s ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}s${GSUFFIX:-.nemsio} ]; then + ${NLN} ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}s${GSUFFIX:-.nemsio} ./ensemble_data/enkfgdas.${PDYprior}${hhprior}.atmf0${fhh}_ens_${mem} + elif [ -s ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}${GSUFFIX:-.nemsio} ]; then + ${NLN} ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}${GSUFFIX:-.nemsio} ./ensemble_data/enkfgdas.${PDYprior}${hhprior}.atmf0${fhh}_ens_${mem} + fi + fi + if [ $USE_GFS_NCIO = .true. ]; then + if [ -s ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/atmos/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}s${GSUFFIX:-.nc} ]; then + ${NLN} ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/atmos/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}s${GSUFFIX:-.nc} ./ensemble_data/enkfgdas.${PDYprior}${hhprior}.atmf0${fhh}_ens_${mem} + elif [ -s ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/atmos/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}${GSUFFIX:-.nc} ]; then + ${NLN} ${COMgfs}/enkfgdas.${PDYprior}/${hhprior}/atmos/mem${mem}/gdas.t${hhprior}z.atmf0${fhh}${GSUFFIX:-.nc} ./ensemble_data/enkfgdas.${PDYprior}${hhprior}.atmf0${fhh}_ens_${mem} + fi + fi + echo "./ensemble_data/enkfgdas.${PDYprior}${hhprior}.atmf0${fhh}_ens_${mem}" >> filelist${fhh} + done + done +fi + +fi # endif ${RUN_ENVAR} + +# Copy first guess files +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.coupler.res ./coupler.res +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.nc ./fv3_akbk +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.sfc_data.nc ./fv3_sfcdata +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ./fv3_dynvars +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ./fv3_tracer + +${NCP} ${RESTARTinp}/oro_data.nc ./fv3_oro_data +${NCP} ${RESTARTinp}/atmos_static.nc ./fv3_atmos_static +${NCP} ${RESTARTinp}/grid_spec.nc ./fv3_grid_spec + +# Stat files +RADSTAT=${RADSTAT:-${RESTARTanl}/analysis.radstat} +GSISTAT=${GSISTAT:-${RESTARTanl}/analysis.gsistat} +PCPSTAT=${PCPSTAT:-${RESTARTanl}/analysis.pcpstat} +CNVSTAT=${CNVSTAT:-${RESTARTanl}/analysis.cnvstat} +OZNSTAT=${OZNSTAT:-${RESTARTanl}/analysis.oznstat} +GSISOUT=${GSISOUT:-${RESTARTanl}/analysis.gsisout} + +# Obs diag +RUN_SELECT=${RUN_SELECT:-"NO"} +USE_SELECT=${USE_SELECT:-"NO"} +USE_RADSTAT=${USE_RADSTAT:-"NO"} +SELECT_OBS=${SELECT_OBS:-${COMhafs}/obsinput.tar} +GENDIAG=${GENDIAG:-"YES"} +DIAG_SUFFIX=${DIAG_SUFFIX:-""} +if [ $netcdf_diag = ".true." ] ; then + DIAG_SUFFIX="${DIAG_SUFFIX}.nc4" +fi +DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} +DIAG_TARBALL=${DIAG_TARBALL:-"YES"} +USE_MPISERIAL=${USE_MPISERIAL:-"YES"} +USE_CFP=${USE_CFP:-"NO"} +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi + +export DIAG_DIR=${DIAG_DIR:-./analysis_diags} +REMOVE_DIAG_DIR=${REMOVE_DIAG_DIR:-"NO"} + +# Set script / GSI control parameters +lrun_subdirs=${lrun_subdirs:-".true."} + +#---------------------------------------------- +# Link all the necessary fix files +#---------------------------------------------- +${NLN} ${PARMgsi}/nam_glb_berror.f77.gcv ./berror_stats +#${NLN} ${PARMgsi}/nam_global_satangbias.txt ./satbias_angle +${NLN} ${PARMgsi}/hafs_satinfo.txt ./satinfo +#checkgfs $NLN $RADCLOUDINFO cloudy_radiance_info.txt +${NLN} ${PARMgsi}/atms_beamwidth.txt ./atms_beamwidth.txt +anavinfo=${PARMgsi}/hafs_anavinfo.tmp +sed -e "s/_LEV_/${npz:-64}/g" \ + -e "s/_LP1_/${LEVS:-65}/g" \ + ${anavinfo} > ./anavinfo +${NLN} ${PARMgsi}/hafs_convinfo.txt ./convinfo +#checkgfs $NLN $vqcdat vqctp001.dat +#checkgfs $NLN $INSITUINFO insituinfo +${NLN} ${PARMgsi}/global_ozinfo.txt ./ozinfo +${NLN} ${PARMgsi}/nam_global_pcpinfo.txt ./pcpinfo +#checkgfs $NLN $AEROINFO aeroinfo +${NLN} ${PARMgsi}/global_scaninfo.txt ./scaninfo +#checkgfs $NLN $HYBENSINFO hybens_info +${NLN} ${PARMgsi}/hafs_nam_errtable.r3dv ./errtable + +${NLN} ${PARMgsi}/prepobs_prep.bufrtable ./prepobs_prep.bufrtable +${NLN} ${PARMgsi}/bufrtab.012 ./bftab_sstphr + +# Link CRTM coefficient files based on entries in satinfo file +for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do + ${NLN} ${FIXcrtm}/fix-4-hwrf/${file}.SpcCoeff.bin ./ + ${NLN} ${FIXcrtm}/fix-4-hwrf/${file}.TauCoeff.bin ./ +done + +${NLN} ${FIXcrtm}/EmisCoeff/IR_Water/Big_Endian/Nalli.IRwater.EmisCoeff.bin ./Nalli.IRwater.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/IR_Ice/SEcategory/Big_Endian/NPOESS.IRice.EmisCoeff.bin ./NPOESS.IRice.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/IR_Snow/SEcategory/Big_Endian/NPOESS.IRsnow.EmisCoeff.bin ./NPOESS.IRsnow.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/IR_Land/SEcategory/Big_Endian/NPOESS.IRland.EmisCoeff.bin ./NPOESS.IRland.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Ice/SEcategory/Big_Endian/NPOESS.VISice.EmisCoeff.bin ./NPOESS.VISice.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Land/SEcategory/Big_Endian/NPOESS.VISland.EmisCoeff.bin ./NPOESS.VISland.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Snow/SEcategory/Big_Endian/NPOESS.VISsnow.EmisCoeff.bin ./NPOESS.VISsnow.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Water/SEcategory/Big_Endian/NPOESS.VISwater.EmisCoeff.bin ./NPOESS.VISwater.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/MW_Water/Big_Endian/FASTEM6.MWwater.EmisCoeff.bin ./FASTEM6.MWwater.EmisCoeff.bin +${NLN} ${FIXcrtm}/AerosolCoeff/Big_Endian/AerosolCoeff.bin ./AerosolCoeff.bin +${NLN} ${FIXcrtm}/CloudCoeff/Big_Endian/CloudCoeff.bin ./CloudCoeff.bin + +# If requested, link (and if tarred, de-tar obsinput.tar) into obs_input.* files +if [ ${USE_SELECT:-NO} = "YES" ]; then + rm -f obs_input.* + nl=$(file $SELECT_OBS | cut -d: -f2 | grep tar | wc -l) + if [ $nl -eq 1 ]; then + rm -f obsinput.tar + $NLN $SELECT_OBS obsinput.tar + tar -xvf obsinput.tar + rm -f obsinput.tar + else + for filetop in $(ls $SELECT_OBS/obs_input.*); do + fileloc=$(basename $filetop) + $NLN $filetop $fileloc + done + fi +fi + +if [ ${USE_SELECT:-NO} != "YES" ]; then #regular run + +# Link GFS/GDAS input and observation files +COMIN_OBS=${COMIN_OBS:-${COMgfs}/gfs.$PDY/$cyc/${atmos}} +OPREFIX=${OPREFIX:-"gfs.t${cyc}z."} +OSUFFIX=${OSUFFIX:-""} +PREPQC=${PREPQC:-${COMIN_OBS}/${OPREFIX}prepbufr${OSUFFIX}} +PREPQCPF=${PREPQCPF:-${COMIN_OBS}/${OPREFIX}prepbufr.acft_profiles${OSUFFIX}} +NSSTBF=${NSSTBF:-${COMIN_OBS}/${OPREFIX}nsstbufr${OSUFFIX}} +SATWND=${SATWND:-${COMIN_OBS}/${OPREFIX}satwnd.tm00.bufr_d${OSUFFIX}} +OSCATBF=${OSCATBF:-${COMIN_OBS}/${OPREFIX}oscatw.tm00.bufr_d${OSUFFIX}} +RAPIDSCATBF=${RAPIDSCATBF:-${COMIN_OBS}/${OPREFIX}rapidscatw.tm00.bufr_d${OSUFFIX}} +GSNDBF=${GSNDBF:-${COMIN_OBS}/${OPREFIX}goesnd.tm00.bufr_d${OSUFFIX}} +GSNDBF1=${GSNDBF1:-${COMIN_OBS}/${OPREFIX}goesfv.tm00.bufr_d${OSUFFIX}} +B1HRS2=${B1HRS2:-${COMIN_OBS}/${OPREFIX}1bhrs2.tm00.bufr_d${OSUFFIX}} +B1MSU=${B1MSU:-${COMIN_OBS}/${OPREFIX}1bmsu.tm00.bufr_d${OSUFFIX}} +B1HRS3=${B1HRS3:-${COMIN_OBS}/${OPREFIX}1bhrs3.tm00.bufr_d${OSUFFIX}} +B1HRS4=${B1HRS4:-${COMIN_OBS}/${OPREFIX}1bhrs4.tm00.bufr_d${OSUFFIX}} +B1AMUA=${B1AMUA:-${COMIN_OBS}/${OPREFIX}1bamua.tm00.bufr_d${OSUFFIX}} +B1AMUB=${B1AMUB:-${COMIN_OBS}/${OPREFIX}1bamub.tm00.bufr_d${OSUFFIX}} +B1MHS=${B1MHS:-${COMIN_OBS}/${OPREFIX}1bmhs.tm00.bufr_d${OSUFFIX}} +ESHRS3=${ESHRS3:-${COMIN_OBS}/${OPREFIX}eshrs3.tm00.bufr_d${OSUFFIX}} +ESAMUA=${ESAMUA:-${COMIN_OBS}/${OPREFIX}esamua.tm00.bufr_d${OSUFFIX}} +ESAMUB=${ESAMUB:-${COMIN_OBS}/${OPREFIX}esamub.tm00.bufr_d${OSUFFIX}} +ESMHS=${ESMHS:-${COMIN_OBS}/${OPREFIX}esmhs.tm00.bufr_d${OSUFFIX}} +HRS3DB=${HRS3DB:-${COMIN_OBS}/${OPREFIX}hrs3db.tm00.bufr_d${OSUFFIX}} +AMUADB=${AMUADB:-${COMIN_OBS}/${OPREFIX}amuadb.tm00.bufr_d${OSUFFIX}} +AMUBDB=${AMUBDB:-${COMIN_OBS}/${OPREFIX}amubdb.tm00.bufr_d${OSUFFIX}} +MHSDB=${MHSDB:-${COMIN_OBS}/${OPREFIX}mhsdb.tm00.bufr_d${OSUFFIX}} +AIRSBF=${AIRSBF:-${COMIN_OBS}/${OPREFIX}airsev.tm00.bufr_d${OSUFFIX}} +IASIBF=${IASIBF:-${COMIN_OBS}/${OPREFIX}mtiasi.tm00.bufr_d${OSUFFIX}} +ESIASI=${ESIASI:-${COMIN_OBS}/${OPREFIX}esiasi.tm00.bufr_d${OSUFFIX}} +IASIDB=${IASIDB:-${COMIN_OBS}/${OPREFIX}iasidb.tm00.bufr_d${OSUFFIX}} +AMSREBF=${AMSREBF:-${COMIN_OBS}/${OPREFIX}amsre.tm00.bufr_d${OSUFFIX}} +AMSR2BF=${AMSR2BF:-${COMIN_OBS}/${OPREFIX}amsr2.tm00.bufr_d${OSUFFIX}} +GMI1CRBF=${GMI1CRBF:-${COMIN_OBS}/${OPREFIX}gmi1cr.tm00.bufr_d${OSUFFIX}} +SAPHIRBF=${SAPHIRBF:-${COMIN_OBS}/${OPREFIX}saphir.tm00.bufr_d${OSUFFIX}} +SEVIRIBF=${SEVIRIBF:-${COMIN_OBS}/${OPREFIX}sevcsr.tm00.bufr_d${OSUFFIX}} +AHIBF=${AHIBF:-${COMIN_OBS}/${OPREFIX}ahicsr.tm00.bufr_d${OSUFFIX}} +ABIBF=${ABIBF:-${COMIN_OBS}/${OPREFIX}gsrcsr.tm00.bufr_d${OSUFFIX}} +CRISBF=${CRISBF:-${COMIN_OBS}/${OPREFIX}cris.tm00.bufr_d${OSUFFIX}} +ESCRIS=${ESCRIS:-${COMIN_OBS}/${OPREFIX}escris.tm00.bufr_d${OSUFFIX}} +CRISDB=${CRISDB:-${COMIN_OBS}/${OPREFIX}crisdb.tm00.bufr_d${OSUFFIX}} +CRISFSBF=${CRISFSBF:-${COMIN_OBS}/${OPREFIX}crisf4.tm00.bufr_d${OSUFFIX}} +ESCRISFS=${ESCRISFS:-${COMIN_OBS}/${OPREFIX}escrsf.tm00.bufr_d${OSUFFIX}} +CRISFSDB=${CRISFSDB:-${COMIN_OBS}/${OPREFIX}crsfdb.tm00.bufr_d${OSUFFIX}} +ATMSBF=${ATMSBF:-${COMIN_OBS}/${OPREFIX}atms.tm00.bufr_d${OSUFFIX}} +ESATMS=${ESATMS:-${COMIN_OBS}/${OPREFIX}esatms.tm00.bufr_d${OSUFFIX}} +ATMSDB=${ATMSDB:-${COMIN_OBS}/${OPREFIX}atmsdb.tm00.bufr_d${OSUFFIX}} +SSMITBF=${SSMITBF:-${COMIN_OBS}/${OPREFIX}ssmit.tm00.bufr_d${OSUFFIX}} +SSMISBF=${SSMISBF:-${COMIN_OBS}/${OPREFIX}ssmisu.tm00.bufr_d${OSUFFIX}} +SBUVBF=${SBUVBF:-${COMIN_OBS}/${OPREFIX}osbuv8.tm00.bufr_d${OSUFFIX}} +OMPSNPBF=${OMPSNPBF:-${COMIN_OBS}/${OPREFIX}ompsn8.tm00.bufr_d${OSUFFIX}} +OMPSTCBF=${OMPSTCBF:-${COMIN_OBS}/${OPREFIX}ompst8.tm00.bufr_d${OSUFFIX}} +GOMEBF=${GOMEBF:-${COMIN_OBS}/${OPREFIX}gome.tm00.bufr_d${OSUFFIX}} +OMIBF=${OMIBF:-${COMIN_OBS}/${OPREFIX}omi.tm00.bufr_d${OSUFFIX}} +MLSBF=${MLSBF:-${COMIN_OBS}/${OPREFIX}mls.tm00.bufr_d${OSUFFIX}} +OMPSLPBF=${OMPSLPBF:-${COMIN_OBS}/${OPREFIX}ompslp.tm00.bufr_d${OSUFFIX}} +SMIPCP=${SMIPCP:-${COMIN_OBS}/${OPREFIX}spssmi.tm00.bufr_d${OSUFFIX}} +TMIPCP=${TMIPCP:-${COMIN_OBS}/${OPREFIX}sptrmm.tm00.bufr_d${OSUFFIX}} +GPSROBF=${GPSROBF:-${COMIN_OBS}/${OPREFIX}gpsro.tm00.bufr_d${OSUFFIX}} +TCVITL=${TCVITL:-${COMIN_OBS}/${OPREFIX}syndata.tcvitals.tm00} +B1AVHAM=${B1AVHAM:-${COMIN_OBS}/${OPREFIX}avcsam.tm00.bufr_d${OSUFFIX}} +B1AVHPM=${B1AVHPM:-${COMIN_OBS}/${OPREFIX}avcspm.tm00.bufr_d${OSUFFIX}} +##HDOB=${HDOB:-${COMIN_OBS}/${OPREFIX}hdob.tm00.bufr_d${OSUFFIX}} + +# Observational data +$NLN $PREPQC prepbufr +##$NLN $PREPQCPF prepbufr_profl +$NLN $SATWND satwndbufr +##$NLN $OSCATBF oscatbufr +##$NLN $RAPIDSCATBF rapidscatbufr +##$NLN $GSNDBF gsndrbufr +$NLN $GSNDBF1 gsnd1bufr +##$NLN $B1HRS2 hirs2bufr +##$NLN $B1MSU msubufr +$NLN $B1HRS3 hirs3bufr +$NLN $B1HRS4 hirs4bufr +$NLN $B1AMUA amsuabufr +##$NLN $B1AMUB amsubbufr +$NLN $B1MHS mhsbufr +$NLN $ESHRS3 hirs3bufrears +$NLN $ESAMUA amsuabufrears +##$NLN $ESAMUB amsubbufrears +#$NLN $ESMHS mhsbufrears +$NLN $HRS3DB hirs3bufr_db +##$NLN $AMUADB amsuabufr_db +##$NLN $AMUBDB amsubbufr_db +#$NLN $MHSDB mhsbufr_db +$NLN $SBUVBF sbuvbufr +$NLN $OMPSNPBF ompsnpbufr +$NLN $OMPSTCBF ompstcbufr +$NLN $GOMEBF gomebufr +$NLN $OMIBF omibufr +$NLN $MLSBF mlsbufr +##$NLN $SMIPCP ssmirrbufr +##$NLN $TMIPCP tmirrbufr +$NLN $AIRSBF airsbufr +$NLN $IASIBF iasibufr +$NLN $ESIASI iasibufrears +$NLN $IASIDB iasibufr_db +##$NLN $AMSREBF amsrebufr +$NLN $AMSR2BF amsr2bufr +$NLN $GMI1CRBF gmibufr +$NLN $SAPHIRBF saphirbufr +$NLN $SEVIRIBF seviribufr +$NLN $CRISBF crisbufr +$NLN $ESCRIS crisbufrears +$NLN $CRISDB crisbufr_db +$NLN $CRISFSBF crisfsbufr +$NLN $ESCRISFS crisfsbufrears +$NLN $CRISFSDB crisfsbufr_db +$NLN $ATMSBF atmsbufr +$NLN $ESATMS atmsbufrears +$NLN $ATMSDB atmsbufr_db +##$NLN $SSMITBF ssmitbufr +$NLN $SSMISBF ssmisbufr +$NLN $GPSROBF gpsrobufr +$NLN $TCVITL tcvitl +$NLN $B1AVHAM avhambufr +$NLN $B1AVHPM avhpmbufr +##$NLN $AHIBF ahibufr +##$NLN $ABIBF abibufr +##$NLN $HDOB hdobbufr + +##[[ $DONST = "YES" ]] && $NLN $NSSTBF nsstbufr + +if [[ ${use_bufr_nr:-no} = "yes" ]]; then + $NLN ${PREPQC}.nr prepbufr + $NLN ${SAPHIRBF}.nr saphirbufr +##[[ $DONST = "YES" ]] && $NLN /dev/null nsstbufr +fi + +# HAFS specific observations +COMINhafs_obs=${COMINhafs_obs:-${COMINhafs}/hafs.$PDY/$cyc/${atmos}} +${NLN} ${COMINhafs_obs}/hafs.t${cyc}z.hdob.tm00.bufr_d hdobbufr +${NLN} ${COMINhafs_obs}/hafs.t${cyc}z.nexrad.tm00.bufr_d l2rwbufr +${NLN} ${COMINhafs_obs}/hafs.t${cyc}z.tldplr.tm00.bufr_d tldplrbufr + +fi #USE_SELECT + +# +${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias satbias_in +${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias_pc satbias_pc +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias_air satbias_air + +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.atmf003.nemsio gfs_sigf03 +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.atmf006.nemsio gfs_sigf06 +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.atmf009.nemsio gfs_sigf09 + +# Diagnostic files +# if requested, link GSI diagnostic file directories for use later +if [ ${GENDIAG:-YES} = "YES" ] ; then + if [ ${lrun_subdirs:-.true.} = ".true." ] ; then + if [ -d $DIAG_DIR ]; then + rm -rf $DIAG_DIR + fi + npe_m1="$(($TOTAL_TASKS-1))" + for pe in $(seq 0 1 $npe_m1); do + pedir="dir."$(printf %04i $pe) + mkdir -p $DIAG_DIR/$pedir + $NLN $DIAG_DIR/$pedir $pedir + done + else + echo "FATAL ERROR: lrun_subdirs must be true. lrun_subdirs=$lrun_subdirs" + exit 2 + fi +fi + +#---------------------------------------------- +# Prepare gsiparm.anl +#---------------------------------------------- +${NCP} ${PARMgsi}/gsiparm.anl.tmp ./ + +sed -e "s/_MITER_/${MITER:-2}/g" \ + -e "s/_NITER_/${NITER:-50}/g" \ + -e "s/_USE_GFS_NEMSIO_/${USE_GFS_NEMSIO:-.true.}/g" \ + -e "s/_USE_GFS_NCIO_/${USE_GFS_NCIO:-.false.}/g" \ + -e "s/_NETCDF_DIAG_/${netcdf_diag:-.true.}/g" \ + -e "s/_BINARY_DIAG_/${binary_diag:-.false.}/g" \ + -e "s/_LREAD_OBS_SAVE_/${LREAD_OBS_SAVE:-.false.}/g" \ + -e "s/_LREAD_OBS_SKIP_/${LREAD_OBS_SKIP:-.false.}/g" \ + -e "s/_ENS_NSTARTHR_/${ENS_NSTARTHR:-6}/g" \ + -e "s/_LWRITE_PREDTERMS_/${LWRITE_PREDTERMS:-.false.}/g" \ + -e "s/_LWRITE_PEAKWT_/${LWRITE_PEAKWT:-.false.}/g" \ + -e "s/_REDUCE_DIAG_/${REDUCE_DIAG:-.false.}/g" \ + -e "s/_L_HYB_ENS_/${L_HYB_ENS:-.false.}/g" \ + -e "s/_N_ENS_/${N_ENS:-80}/g" \ + -e "s/_BETA_S0_/${BETA_S0:-0.2}/g" \ + -e "s/_GRID_RATIO_ENS_/${GRID_RATIO_ENS:-1}/g" \ + -e "s/_REGIONAL_ENSEMBLE_OPTION_/${REGIONAL_ENSEMBLE_OPTION:-1}/g" \ + -e "s/_GRID_RATIO_FV3_REGIONAL_/${refine_ratio:-4}/g" \ + gsiparm.anl.tmp > gsiparm.anl + +#------------------------------------------------------------------- +# Link the executable and run the analysis +#------------------------------------------------------------------- +ANALYSISEXEC=${ANALYSISEXEC:-${EXEChafs}/hafs_gsi.x} +${NCP} -p ${ANALYSISEXEC} ./hafs_gsi.x + +${APRUNC} ./hafs_gsi.x 1> stdout 2>&1 +cat stdout + +${NCP} -p ./stdout ${GSISOUT} + +# Cat runtime output files. +cat fort.2* > ${GSISTAT} + +# If requested, create obsinput tarball from obs_input.* files +if [ ${RUN_SELECT:-NO} = "YES" ]; then + echo $(date) START tar obs_input + rm -f ./obsinput.tar + ${NLN} $SELECT_OBS ./obsinput.tar + tar -cvf obsinput.tar obs_input.* + echo $(date) END tar obs_input +fi + +if [ ${HX_ONLY:-NO} != "YES" ]; then + +${NCP} ./fv3_oro_data ${RESTARTanl}/oro_data.nc +${NCP} ./fv3_atmos_static ${RESTARTanl}/atmos_static.nc +${NCP} ./fv3_grid_spec ${RESTARTanl}/grid_spec.nc + +${NCP} ./coupler.res ${RESTARTanl}/${PDY}.${cyc}0000.coupler.res +${NCP} ./fv3_akbk ${RESTARTanl}/${PDY}.${cyc}0000.fv_core.res.nc +${NCP} ./fv3_sfcdata ${RESTARTanl}/${PDY}.${cyc}0000.sfc_data.nc +${NCP} ./fv3_srfwnd ${RESTARTanl}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc +${NCP} ./fv3_dynvars ${RESTARTanl}/${PDY}.${cyc}0000.fv_core.res.tile1.nc +${NCP} ./fv3_tracer ${RESTARTanl}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + +fi + +# If requested, generate diagnostic files +if [ $GENDIAG = "YES" ] ; then + + # Set up lists and variables for various types of diagnostic files. + ntype=3 + + diagtype[0]="conv conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_tcp conv_uv conv_spd" + diagtype[1]="pcp_ssmi_dmsp pcp_tmi_trmm" + diagtype[2]="sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a gome_metop-b omi_aura mls30_aura ompsnp_npp ompstc8_npp gome_metop-c" + diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_metop-b avhrr_n18 avhrr_n19 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8 abi_g16 abi_g17 amsua_metop-c mhs_metop-c iasi_metop-c avhrr_metop-c" + + diaglist[0]=listcnv + diaglist[1]=listpcp + diaglist[2]=listozn + diaglist[3]=listrad + + diagfile[0]=$CNVSTAT + diagfile[1]=$PCPSTAT + diagfile[2]=$OZNSTAT + diagfile[3]=$RADSTAT + + numfile[0]=0 + numfile[1]=0 + numfile[2]=0 + numfile[3]=0 + + # Set diagnostic file prefix based on lrun_subdirs variable + if [ $lrun_subdirs = ".true." ]; then + prefix=" dir.*/" + else + prefix="pe*" + fi + + if [ $USE_CFP = "YES" -o $USE_MPISERIAL = "YES" ]; then + [[ -f ./diag.sh ]] && rm ./diag.sh + [[ -f ./mp_diag.sh ]] && rm ./mp_diag.sh + cat > ./diag.sh << EOFdiag +#!/bin/sh +lrun_subdirs=\$1 +binary_diag=\$2 +type=\$3 +loop=\$4 +string=\$5 +CDATE=\$6 +DIAG_COMPRESS=\$7 +DIAG_SUFFIX=\$8 +if [ \$lrun_subdirs = ".true." ]; then + prefix=" dir.*/" +else + prefix="pe*" +fi +file=diag_\${type}_\${string}.\${CDATE}\${DIAG_SUFFIX} +if [ \$binary_diag = ".true." ]; then + cat \${prefix}\${type}_\${loop}* > \$file +else + $CATEXEC -o \$file \${prefix}\${type}_\${loop}* +fi +if [ \$DIAG_COMPRESS = "YES" ]; then + $COMPRESS \$file +fi +EOFdiag + chmod 755 ./diag.sh + fi + + # Collect diagnostic files as a function of loop and type. + # Loop over first and last outer loops to generate innovation + # diagnostic files for indicated observation types (groups) + # + # NOTE: Since we set miter=2 in GSI namelist SETUP, outer + # loop 03 will contain innovations with respect to + # the analysis. Creation of o-a innovation files + # is triggered by write_diag(3)=.true. The setting + # write_diag(1)=.true. turns on creation of o-g + # innovation files. + + loops="01 03" + for loop in $loops; do + case $loop in + 01) string=ges;; + 03) string=anl;; + *) string=$loop;; + esac + echo $(date) START loop $string >&2 + n=-1 + while [ $((n+=1)) -le $ntype ] ;do + for type in $(echo ${diagtype[n]}); do + count=$(ls ${prefix}${type}_${loop}* 2>/dev/null | wc -l) + if [ $count -gt 1 ]; then + if [ $USE_CFP = "YES" ]; then + echo "$nm ./diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a ./mp_diag.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi + elif [ $USE_MPISERIAL = "YES" ]; then + echo "$nm ./diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a ./mp_diag.sh + else + if [ $binary_diag = ".true." ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + else + $CATEXEC -o diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} ${prefix}${type}_${loop}* + fi + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) + elif [ $count -eq 1 ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + if [ $DIAG_COMPRESS = "YES" ]; then + $COMPRESS diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) + fi + done + done + echo $(date) END loop $string >&2 + done + + # We should already be in $DATA, but extra cd to be sure. + cd $DATA + + # If requested, compress diagnostic files + if [ $DIAG_COMPRESS = "YES" -a $USE_CFP = "NO" -a $USE_MPISERIAL = "NO" ]; then + echo $(date) START $COMPRESS diagnostic files >&2 + for file in $(ls diag_*${CDATE}${DIAG_SUFFIX}); do + $COMPRESS $file + done + echo $(date) END $COMPRESS diagnostic files >&2 + fi + + if [ $USE_CFP = "YES" ] ; then + chmod 755 ./mp_diag.sh + ncmd=$(cat ./mp_diag.sh | wc -l) + if [ $ncmd -gt 0 ]; then + ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) + APRUNCFP_DIAG=$(eval echo $APRUNCFP) + $APRUNCFP_DIAG ./mp_diag.sh + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 3 + fi + fi + + if [ $USE_MPISERIAL = "YES" ] ; then + chmod 755 ./mp_diag.sh + ${APRUNC} ${MPISERIAL} -m ./mp_diag.sh + fi + + # If requested, create diagnostic file tarballs + if [ $DIAG_TARBALL = "YES" ]; then + echo $(date) START tar diagnostic files >&2 + n=-1 + while [ $((n+=1)) -le $ntype ] ;do + TAROPTS="-uvf" + if [ ! -s ${diagfile[n]} ]; then + TAROPTS="-cvf" + fi + if [ ${numfile[n]} -gt 0 ]; then + tar $TAROPTS ${diagfile[n]} $(cat ${diaglist[n]}) + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 4 + fi + done + + # Restrict CNVSTAT + #chmod 750 $CNVSTAT + #${CHGRP_CMD} $CNVSTAT + + # Restrict RADSTAT + #chmod 750 $RADSTAT + #${CHGRP_CMD} $RADSTAT + + echo $(date) END tar diagnostic files >&2 + fi +fi # End diagnostic file generation block - if [ $GENDIAG = "YES" ] + +# If no processing error, remove $DIAG_DIR +if [[ "$REMOVE_DIAG_DIR" = "YES" && "$err" = "0" ]]; then + rm -rf $DIAG_DIR +fi + +exit + diff --git a/scripts/exhafs_analysis_vr.sh b/scripts/exhafs_analysis_vr.sh new file mode 100755 index 000000000..31d13085f --- /dev/null +++ b/scripts/exhafs_analysis_vr.sh @@ -0,0 +1,566 @@ +#!/bin/sh + +set -xe + +if [ ${ENSDA} = YES ]; then + export NHRS=${NHRS_ENS:-126} + export NBDYHRS=${NBDYHRS_ENS:-3} + export NOUTHRS=${NOUTHRS_ENS:-3} + export CASE=${CASE_ENS:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype_ens:-regional} + export LEVS=${LEVS_ENS:-65} +else + export NHRS=${NHRS:-126} + export NBDYHRS=${NBDYHRS:-3} + export NOUTHRS=${NOUTHRS:-3} + export CASE=${CASE:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype:-regional} + export LEVS=${LEVS:-65} +fi + +export PARMgsi=${PARMgsi:-${PARMhafs}/analysis/gsi} +export FIXcrtm=${FIXcrtm:-${FIXhafs}/hwrf-crtm-2.2.6} +export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} +export COMINhafs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} +export DONST=${DONST:-"NO"} +export use_bufr_nr=${use_bufr_nr:-no} +export out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} + +export RUN_GSI_VR=${RUN_GSI_VR:-NO} +export RUN_GSI_VR_FGAT=${RUN_GSI_VR_FGAT:-NO} +export RUN_GSI_VR_ENS=${RUN_GSI_VR_ENS:-NO} +export RUN_GSI=${RUN_GSI:-NO} +export RUN_FGAT=${RUN_FGAT:-NO} +export FGAT=${FGAT:-NO} +export RUN_ENVAR=${RUN_ENVAR:-NO} +export RUN_ENSDA=${RUN_ENSDA:-NO} +export ENSDA=${ENSDA:-NO} +export GRID_RATIO_ENS=${GRID_RATIO_ENS:-1} + +export RUN_ENVAR=NO +#export RUN_ENSDA=NO + +TOTAL_TASKS=${TOTAL_TASKS:-2016} +NCTSK=${NCTSK:-12} +NCNODE=${NCNODE:-24} +OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} +APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} + +# Utilities +NDATE=${NDATE:-ndate} +export NCP=${NCP:-"/bin/cp"} +export NMV=${NMV:-"/bin/mv"} +export NLN=${NLN:-"/bin/ln -sf"} +export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} +export CATEXEC=${CATEXEC:-${EXEChafs}/hafs_ncdiag_cat.x} +export MPISERIAL=${MPISERIAL:-${EXEChafs}/hafs_mpiserial.x} +export COMPRESS=${COMPRESS:-gzip} +export UNCOMPRESS=${UNCOMPRESS:-gunzip} + +if [ $GFSVER = PROD2021 ]; then + export atmos="atmos/" + export USE_GFS_NEMSIO=.false. + export USE_GFS_NCIO=.true. + GSUFFIX=${GSUFFIX:-.nc} +elif [ $GFSVER = PROD2019 ]; then + export atmos="" + export USE_GFS_NEMSIO=.true. + export USE_GFS_NCIO=.false. + GSUFFIX=${GSUFFIX:-.nemsio} +else + export atmos="" + export USE_GFS_NEMSIO=.true. + export USE_GFS_NCIO=.false. + GSUFFIX=${GSUFFIX:-.nemsio} +fi + +# Diagnostic files options +export netcdf_diag=${netcdf_diag:-".true."} +export binary_diag=${binary_diag:-".false."} + +yr=`echo $CDATE | cut -c1-4` +mn=`echo $CDATE | cut -c5-6` +dy=`echo $CDATE | cut -c7-8` + +CDATEprior=`${NDATE} -6 $CDATE` +yrprior=`echo ${CDATEprior} | cut -c1-4` +mnprior=`echo ${CDATEprior} | cut -c5-6` +dyprior=`echo ${CDATEprior} | cut -c7-8` +hhprior=`echo ${CDATEprior} | cut -c9-10` +cycprior=`echo ${CDATEprior} | cut -c9-10` +PDYprior=`echo ${CDATEprior} | cut -c1-8` + +if [ ${FGAT} = "YES" ]; then + CDATEtm06=`${NDATE} -6 $CDATE` + CDATEtp06=`${NDATE} +6 $CDATE` + if [ ${FGAT_HR} = "03" ]; then + CDATEfgat=`${NDATE} -3 $CDATE` + fi + if [ ${FGAT_HR} = "09" ]; then + CDATEfgat=`${NDATE} +3 $CDATE` + fi + PDYfgat=`echo ${CDATEfgat} | cut -c1-8` + cycfgat=`echo ${CDATEfgat} | cut -c9-10` +fi + +export COMhafsprior=${COMhafsprior:-${COMhafs}/../../${CDATEprior}/${STORMID}} +export WORKhafsprior=${WORKhafsprior:-${WORKhafs}/../../${CDATEprior}/${STORMID}} + +if [ ${RUN_GSI_VR} = "NO" ] && [ ${RUN_GSI_VR_FGAT} = "NO" ] && [ ${RUN_GSI_VR_ENS} = "NO" ]; then + echo "None of RUN_GSI_VR, RUN_GSI_VR_FGAT, RUN_GSI_VR_ENS is YES" + echo "$RUN_GSI_VR, $RUN_GSI_VR_FGAT, $RUN_GSI_VR_ENS" + echo "Do nothing. Exiting" + exit +fi + +if [ ${RUN_GSI_VR_ENS} = "YES" ] && [ "${ENSDA}" = YES ]; then + if [ ! -s ${COMhafsprior}/storm1.holdvars.txt ] && [ ! -s ${COMhafsprior}/RESTART_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + echo "Prior cycle does not exist. No need to run gsi_vr for the first cycle." + echo "Do nothing. Exiting" + exit + fi +elif [ ${RUN_GSI_VR_FGAT} = "YES" ] && [ ${FGAT} = YES ]; then + if [ ! -s ${COMhafsprior}/storm1.holdvars.txt ] && [ ! -s ${COMhafsprior}/RESTART/${PDYfgat}.${cycfgat}0000.fv_core.res.tile1.nc ]; then + echo "Prior cycle FGAT files does not exist. No need to run gsi_vr for the first cycle." + echo "Do nothing. Exiting" + exit + fi +else + if [ ! -s ${COMhafsprior}/storm1.holdvars.txt ] && [ ! -s ${COMhafsprior}/RESTART/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + echo "Prior cycle does not exist. No need to run gsi_vr for the first cycle." + echo "Do nothing. Exiting" + exit + fi +fi + +#---------------------------------------------- +# Sample the synthetic data around the storm from the previous cycle's model forecast +# And relcoate the synthetic data according to the observed (tcvitals) storm location +#---------------------------------------------- + +# Copy the input first guess files +if [ "${ENSDA}" = "YES" ]; then + export RESTARTinp=${RESTARTinp:-${COMhafsprior}/RESTART_ens/mem${ENSID}} + ${NCP} ${RESTARTinp}/oro_data.nc ./fv3_oro_data + ${NCP} ${RESTARTinp}/atmos_static.nc ./fv3_atmos_static + ${NCP} ${RESTARTinp}/grid_spec.nc ./fv3_grid_spec + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.coupler.res ./coupler.res + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.nc ./fv3_akbk + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.sfc_data.nc ./fv3_sfcdata + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ./fv3_dynvars + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ./fv3_tracer + ${NLN} ${COMhafsprior}/product_ens/mem${ENSID}/${STORM,,}${STORMID,,}.${CDATEprior}.trak.hafs.atcfunix.all ./hafs.atcfunix_prior + grep ", HAFS, 006," ./hafs.atcfunix_prior | grep ", 34, NEQ," > ./hafs.atcfunix + export RESTARTanl=${RESTARTanl:-${COMhafs}/RESTART_analysis_vr_ens/mem${ENSID}} +else + export RESTARTinp=${RESTARTinp:-${COMhafsprior}/RESTART} + ${NCP} ${RESTARTinp}/oro_data.nc ./fv3_oro_data + ${NCP} ${RESTARTinp}/atmos_static.nc ./fv3_atmos_static + ${NCP} ${RESTARTinp}/grid_spec.nc ./fv3_grid_spec + if [ ${FGAT} = "YES" ]; then + ${NCP} ${RESTARTinp}/${PDYfgat}.${cycfgat}0000.coupler.res ./coupler.res + ${NCP} ${RESTARTinp}/${PDYfgat}.${cycfgat}0000.fv_core.res.nc ./fv3_akbk + ${NCP} ${RESTARTinp}/${PDYfgat}.${cycfgat}0000.sfc_data.nc ./fv3_sfcdata + ${NCP} ${RESTARTinp}/${PDYfgat}.${cycfgat}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd + ${NCP} ${RESTARTinp}/${PDYfgat}.${cycfgat}0000.fv_core.res.tile1.nc ./fv3_dynvars + ${NCP} ${RESTARTinp}/${PDYfgat}.${cycfgat}0000.fv_tracer.res.tile1.nc ./fv3_tracer + ${NLN} ${COMhafsprior}/${STORM,,}${STORMID,,}.${CDATEprior}.trak.hafs.atcfunix.all ./hafs.atcfunix_prior + grep ", HAFS, 0${FGAT_HR}," ./hafs.atcfunix_prior | grep ", 34, NEQ," > ./hafs.atcfunix + else + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.coupler.res ./coupler.res + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.nc ./fv3_akbk + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.sfc_data.nc ./fv3_sfcdata + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ./fv3_dynvars + ${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ./fv3_tracer +# Extract the 6-hr forecast atcf records from the prior cycle + ${NLN} ${COMhafsprior}/${STORM,,}${STORMID,,}.${CDATEprior}.trak.hafs.atcfunix.all ./hafs.atcfunix_prior + grep ", HAFS, 006," ./hafs.atcfunix_prior | grep ", 34, NEQ," > ./hafs.atcfunix + fi + export RESTARTanl=${RESTARTanl:-${COMhafs}/RESTART_analysis_vr} +fi +cat ./hafs.atcfunix + +# Find and sort active storms for this cycle from known tcvitals file +# This can potentially provide multiple tcvital messages to the tracker, +# so that it can track multiple storms simultaneously. +# *** Currently, tcutil_multistorm_sort.py searches the tcvitals files +# specified in the script. Need to modify it to be able to deal with storm +# message files/dirs, as well as passing in tcvitals files. +if [ ${FGAT} = "YES" ]; then + ${USHhafs}/tcutil_multistorm_sort.py ${CDATEtm06} | cut -c1-96 > allvit_pre + ${USHhafs}/tcutil_multistorm_sort.py ${CDATE} | cut -c1-96 > allvit_aft + if [ ${FGAT_HR} = "03" ]; then + ${USHhafs}/tcutil_interpolate.py allvit_pre allvit_aft 0 | cut -c1-96 > allvit + else + ${USHhafs}/tcutil_interpolate.py allvit_pre allvit_aft 1 | cut -c1-96 > allvit + fi +else + ${USHhafs}/tcutil_multistorm_sort.py ${CDATE} | cut -c1-96 > allvit +fi +${USHhafs}/hafs_opptcv_format.py --ncep_trkr_filename ./hafs.atcfunix --tcv_filename ./allvit --output_filename ./synobs_vr.info + +cat synobs_vr.info + +# Proceed with the GSI based vortex relocation if synobs_vr.info is non-empty. +if [ -s ./synobs_vr.info ]; then + +# Link the neede files +${NLN} ${PARMgsi}/prepobs_prep.bufrtable ./ +${NLN} ${PARMgsi}/bufrinfo.json ./ + +# Prepare the namelist +${NCP} ${PARMgsi}/obs-preproc.input.tmp ./ +analdate="${yr}-${mn}-${dy}_${cyc}:00:00" + +sed -e "s/_analdate_/${analdate}/g" \ + -e "s/_grid_ratio_/${refine_ratio:-4}/g" \ + obs-preproc.input.tmp > obs-preproc.input + +#------------------------------------------------------------------- +# Link and run the executable +#------------------------------------------------------------------- +OBSPREPROCEXEC=${OBSPREPROCEXEC:-${EXEChafs}/hafs_obs_preproc.x} +${NCP} -p ${OBSPREPROCEXEC} ./hafs_obs_preproc.x + +${APRUNS} ./hafs_obs_preproc.x 1> ./hafs_obs_preproc.out 2>&1 + +#---------------------------------------------- +# Run GSI to assimilate the relocated synthetic data to produce the analysis +#---------------------------------------------- + +mkdir -p ${RESTARTanl} + +# Stat files +if [ ${FGAT} = "YES" ]; then + RADSTAT=${RADSTAT:-${RESTARTanl}/${PDYfgat}.${cycfgat}0000.analysis.radstat} + GSISTAT=${GSISTAT:-${RESTARTanl}/${PDYfgat}.${cycfgat}0000.analysis.gsistat} + PCPSTAT=${PCPSTAT:-${RESTARTanl}/${PDYfgat}.${cycfgat}0000.analysis.pcpstat} + CNVSTAT=${CNVSTAT:-${RESTARTanl}/${PDYfgat}.${cycfgat}0000.analysis.cnvstat} + OZNSTAT=${OZNSTAT:-${RESTARTanl}/${PDYfgat}.${cycfgat}0000.analysis.oznstat} + GSISOUT=${GSISOUT:-${RESTARTanl}/${PDYfgat}.${cycfgat}0000.analysis.gsisout} +else + RADSTAT=${RADSTAT:-${RESTARTanl}/${PDY}.${cyc}0000.analysis.radstat} + GSISTAT=${GSISTAT:-${RESTARTanl}/${PDY}.${cyc}0000.analysis.gsistat} + PCPSTAT=${PCPSTAT:-${RESTARTanl}/${PDY}.${cyc}0000.analysis.pcpstat} + CNVSTAT=${CNVSTAT:-${RESTARTanl}/${PDY}.${cyc}0000.analysis.cnvstat} + OZNSTAT=${OZNSTAT:-${RESTARTanl}/${PDY}.${cyc}0000.analysis.oznstat} + GSISOUT=${GSISOUT:-${RESTARTanl}/${PDY}.${cyc}0000.analysis.gsisout} +fi + +# Obs diag +RUN_SELECT=${RUN_SELECT:-"NO"} +USE_SELECT=${USE_SELECT:-"NO"} +USE_RADSTAT=${USE_RADSTAT:-"NO"} +SELECT_OBS=${SELECT_OBS:-${COMhafs}/obsinput.tar} +#GENDIAG=${GENDIAG:-"YES"} +GENDIAG=${GENDIAG:-"NO"} +DIAG_SUFFIX=${DIAG_SUFFIX:-""} +if [ $netcdf_diag = ".true." ] ; then + DIAG_SUFFIX="${DIAG_SUFFIX}.nc4" +fi +DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} +DIAG_TARBALL=${DIAG_TARBALL:-"YES"} +USE_MPISERIAL=${USE_MPISERIAL:-"YES"} +USE_CFP=${USE_CFP:-"NO"} +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi + +export DIAG_DIR=${DIAG_DIR:-./analysis_diags} +REMOVE_DIAG_DIR=${REMOVE_DIAG_DIR:-"NO"} + +# Set script / GSI control parameters +lrun_subdirs=${lrun_subdirs:-".true."} + +#---------------------------------------------- +# Link all the necessary fix files +#---------------------------------------------- +anavinfo=${PARMgsi}/hafs_anavinfo.tmp +sed -e "s/_LEV_/${npz:-64}/g" \ + -e "s/_LP1_/${LEVS:-65}/g" \ + ${anavinfo} > ./anavinfo +${NLN} ${PARMgsi}/hafs_convinfo.txt_vr ./convinfo +${NLN} ${PARMgsi}/nam_glb_berror.f77.gcv ./berror_stats +${NLN} ${PARMgsi}/hafs_nam_errtable.r3dv_vr ./errtable + +# Link GFS/GDAS input and observation files +${NLN} ./synobs_vr.prepbufr ./prepbufr + +# Diagnostic files +# if requested, link GSI diagnostic file directories for use later +if [ ${GENDIAG:-YES} = "YES" ] ; then + if [ ${lrun_subdirs:-.true.} = ".true." ] ; then + if [ -d $DIAG_DIR ]; then + rm -rf $DIAG_DIR + fi + npe_m1="$(($TOTAL_TASKS-1))" + for pe in $(seq 0 1 $npe_m1); do + pedir="dir."$(printf %04i $pe) + mkdir -p $DIAG_DIR/$pedir + $NLN $DIAG_DIR/$pedir $pedir + done + else + echo "FATAL ERROR: lrun_subdirs must be true. lrun_subdirs=$lrun_subdirs" + exit 2 + fi +fi + +#---------------------------------------------- +# Prepare gsiparm.anl +#---------------------------------------------- +${NCP} ${PARMgsi}/gsiparm.anl.tmp ./ + +sed -e "s/_MITER_/${MITER:-2}/g" \ + -e "s/_NITER_/${NITER:-50}/g" \ + -e "s/_USE_GFS_NEMSIO_/${USE_GFS_NEMSIO:-.true.}/g" \ + -e "s/_USE_GFS_NCIO_/${USE_GFS_NCIO:-.false.}/g" \ + -e "s/_NETCDF_DIAG_/${netcdf_diag:-.true.}/g" \ + -e "s/_BINARY_DIAG_/${binary_diag:-.false.}/g" \ + -e "s/_LREAD_OBS_SAVE_/${LREAD_OBS_SAVE:-.false.}/g" \ + -e "s/_LREAD_OBS_SKIP_/${LREAD_OBS_SKIP:-.false.}/g" \ + -e "s/_ENS_NSTARTHR_/${ENS_NSTARTHR:-6}/g" \ + -e "s/_LWRITE_PREDTERMS_/${LWRITE_PREDTERMS:-.false.}/g" \ + -e "s/_LWRITE_PEAKWT_/${LWRITE_PEAKWT:-.false.}/g" \ + -e "s/_REDUCE_DIAG_/${REDUCE_DIAG:-.false.}/g" \ + -e "s/_L_HYB_ENS_/${L_HYB_ENS:-.false.}/g" \ + -e "s/_N_ENS_/${N_ENS:-80}/g" \ + -e "s/_BETA_S0_/${BETA_S0:-0.2}/g" \ + -e "s/_GRID_RATIO_ENS_/${GRID_RATIO_ENS:-1}/g" \ + -e "s/_REGIONAL_ENSEMBLE_OPTION_/${REGIONAL_ENSEMBLE_OPTION:-1}/g" \ + -e "s/_GRID_RATIO_FV3_REGIONAL_/${refine_ratio:-4}/g" \ + gsiparm.anl.tmp > gsiparm.anl + +#------------------------------------------------------------------- +# Link the executable and run the analysis +#------------------------------------------------------------------- +ANALYSISEXEC=${ANALYSISEXEC:-${EXEChafs}/hafs_gsi.x} +${NCP} -p ${ANALYSISEXEC} ./hafs_gsi.x + +${APRUNC} ./hafs_gsi.x 1> stdout 2>&1 +cat stdout + +${NCP} -p ./stdout ${GSISOUT} + +# Cat runtime output files. +cat fort.2* > ${GSISTAT} + +# If requested, create obsinput tarball from obs_input.* files +if [ ${RUN_SELECT:-NO} = "YES" ]; then + echo $(date) START tar obs_input + rm -f ./obsinput.tar + ${NLN} $SELECT_OBS ./obsinput.tar + tar -cvf obsinput.tar obs_input.* + echo $(date) END tar obs_input +fi + +# If requested, generate diagnostic files +if [ $GENDIAG = "YES" ] ; then + + # Set up lists and variables for various types of diagnostic files. + ntype=3 + + diagtype[0]="conv conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_tcp conv_uv conv_spd" + diagtype[1]="pcp_ssmi_dmsp pcp_tmi_trmm" + diagtype[2]="sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a gome_metop-b omi_aura mls30_aura ompsnp_npp ompstc8_npp gome_metop-c" + diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_metop-b avhrr_n18 avhrr_n19 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8 abi_g16 abi_g17 amsua_metop-c mhs_metop-c iasi_metop-c avhrr_metop-c" + + diaglist[0]=listcnv + diaglist[1]=listpcp + diaglist[2]=listozn + diaglist[3]=listrad + + diagfile[0]=$CNVSTAT + diagfile[1]=$PCPSTAT + diagfile[2]=$OZNSTAT + diagfile[3]=$RADSTAT + + numfile[0]=0 + numfile[1]=0 + numfile[2]=0 + numfile[3]=0 + + # Set diagnostic file prefix based on lrun_subdirs variable + if [ $lrun_subdirs = ".true." ]; then + prefix=" dir.*/" + else + prefix="pe*" + fi + + if [ $USE_CFP = "YES" -o $USE_MPISERIAL = "YES" ]; then + [[ -f ./diag.sh ]] && rm ./diag.sh + [[ -f ./mp_diag.sh ]] && rm ./mp_diag.sh + cat > ./diag.sh << EOFdiag +#!/bin/sh +lrun_subdirs=\$1 +binary_diag=\$2 +type=\$3 +loop=\$4 +string=\$5 +CDATE=\$6 +DIAG_COMPRESS=\$7 +DIAG_SUFFIX=\$8 +if [ \$lrun_subdirs = ".true." ]; then + prefix=" dir.*/" +else + prefix="pe*" +fi +file=diag_\${type}_\${string}.\${CDATE}\${DIAG_SUFFIX} +if [ \$binary_diag = ".true." ]; then + cat \${prefix}\${type}_\${loop}* > \$file +else + $CATEXEC -o \$file \${prefix}\${type}_\${loop}* +fi +if [ \$DIAG_COMPRESS = "YES" ]; then + $COMPRESS \$file +fi +EOFdiag + chmod 755 ./diag.sh + fi + + # Collect diagnostic files as a function of loop and type. + # Loop over first and last outer loops to generate innovation + # diagnostic files for indicated observation types (groups) + # + # NOTE: Since we set miter=2 in GSI namelist SETUP, outer + # loop 03 will contain innovations with respect to + # the analysis. Creation of o-a innovation files + # is triggered by write_diag(3)=.true. The setting + # write_diag(1)=.true. turns on creation of o-g + # innovation files. + + loops="01 03" + for loop in $loops; do + case $loop in + 01) string=ges;; + 03) string=anl;; + *) string=$loop;; + esac + echo $(date) START loop $string >&2 + n=-1 + while [ $((n+=1)) -le $ntype ] ;do + for type in $(echo ${diagtype[n]}); do + count=$(ls ${prefix}${type}_${loop}* 2>/dev/null | wc -l) + if [ $count -gt 1 ]; then + if [ $USE_CFP = "YES" ]; then + echo "$nm ./diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a ./mp_diag.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi + elif [ $USE_MPISERIAL = "YES" ]; then + echo "$nm ./diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a ./mp_diag.sh + else + if [ $binary_diag = ".true." ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + else + $CATEXEC -o diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} ${prefix}${type}_${loop}* + fi + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) + elif [ $count -eq 1 ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + if [ $DIAG_COMPRESS = "YES" ]; then + $COMPRESS diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) + fi + done + done + echo $(date) END loop $string >&2 + done + + # We should already be in $DATA, but extra cd to be sure. + cd $DATA + + # If requested, compress diagnostic files + if [ $DIAG_COMPRESS = "YES" -a $USE_CFP = "NO" -a $USE_MPISERIAL = "NO" ]; then + echo $(date) START $COMPRESS diagnostic files >&2 + for file in $(ls diag_*${CDATE}${DIAG_SUFFIX}); do + $COMPRESS $file + done + echo $(date) END $COMPRESS diagnostic files >&2 + fi + + if [ $USE_CFP = "YES" ] ; then + chmod 755 ./mp_diag.sh + ncmd=$(cat ./mp_diag.sh | wc -l) + if [ $ncmd -gt 0 ]; then + ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) + APRUNCFP_DIAG=$(eval echo $APRUNCFP) + $APRUNCFP_DIAG ./mp_diag.sh + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 3 + fi + fi + + if [ $USE_MPISERIAL = "YES" ] ; then + chmod 755 ./mp_diag.sh + ${APRUNC} ${MPISERIAL} -m ./mp_diag.sh + fi + + # If requested, create diagnostic file tarballs + if [ $DIAG_TARBALL = "YES" ]; then + echo $(date) START tar diagnostic files >&2 + n=-1 + while [ $((n+=1)) -le $ntype ] ;do + TAROPTS="-uvf" + if [ ! -s ${diagfile[n]} ]; then + TAROPTS="-cvf" + fi + if [ ${numfile[n]} -gt 0 ]; then + tar $TAROPTS ${diagfile[n]} $(cat ${diaglist[n]}) + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 4 + fi + done + + # Restrict CNVSTAT + #chmod 750 $CNVSTAT + #${CHGRP_CMD} $CNVSTAT + + # Restrict RADSTAT + #chmod 750 $RADSTAT + #${CHGRP_CMD} $RADSTAT + + echo $(date) END tar diagnostic files >&2 + fi +fi # End diagnostic file generation block - if [ $GENDIAG = "YES" ] + +# If no processing error, remove $DIAG_DIR +if [[ "$REMOVE_DIAG_DIR" = "YES" && "$err" = "0" ]]; then + rm -rf $DIAG_DIR +fi + +fi # end if [ -s ./synobs_vr.info ]; then + +${NCP} ./fv3_oro_data ${RESTARTanl}/oro_data.nc +${NCP} ./fv3_atmos_static ${RESTARTanl}/atmos_static.nc +${NCP} ./fv3_grid_spec ${RESTARTanl}/grid_spec.nc + +if [ ${FGAT} = "YES" ]; then + ${NCP} ./coupler.res ${RESTARTanl}/${PDYfgat}.${cycfgat}0000.coupler.res + ${NCP} ./fv3_akbk ${RESTARTanl}/${PDYfgat}.${cycfgat}0000.fv_core.res.nc + ${NCP} ./fv3_sfcdata ${RESTARTanl}/${PDYfgat}.${cycfgat}0000.sfc_data.nc + ${NCP} ./fv3_srfwnd ${RESTARTanl}/${PDYfgat}.${cycfgat}0000.fv_srf_wnd.res.tile1.nc + ${NCP} ./fv3_dynvars ${RESTARTanl}/${PDYfgat}.${cycfgat}0000.fv_core.res.tile1.nc + ${NCP} ./fv3_tracer ${RESTARTanl}/${PDYfgat}.${cycfgat}0000.fv_tracer.res.tile1.nc +else + ${NCP} ./coupler.res ${RESTARTanl}/${PDY}.${cyc}0000.coupler.res + ${NCP} ./fv3_akbk ${RESTARTanl}/${PDY}.${cyc}0000.fv_core.res.nc + ${NCP} ./fv3_sfcdata ${RESTARTanl}/${PDY}.${cyc}0000.sfc_data.nc + ${NCP} ./fv3_srfwnd ${RESTARTanl}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc + ${NCP} ./fv3_dynvars ${RESTARTanl}/${PDY}.${cyc}0000.fv_core.res.tile1.nc + ${NCP} ./fv3_tracer ${RESTARTanl}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc +fi + +exit + diff --git a/scripts/exhafs_atm_ic.sh b/scripts/exhafs_atm_ic.sh new file mode 100755 index 000000000..21e5544f9 --- /dev/null +++ b/scripts/exhafs_atm_ic.sh @@ -0,0 +1,403 @@ +#!/bin/sh + +set -xe + +NCP=${NCP:-'/bin/cp'} +NLN=${NLN:-'/bin/ln -sf'} +NDATE=${NDATE:-ndate} + +TOTAL_TASKS=${TOTAL_TASKS:-2016} +NCTSK=${NCTSK:-12} +NCNODE=${NCNODE:-24} +OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} +APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} + +CDATE=${CDATE:-${YMDH}} +cyc=${cyc:-00} +STORM=${STORM:-FAKE} +STORMID=${STORMID:-00L} + +ymd=`echo $CDATE | cut -c 1-8` +month=`echo $CDATE | cut -c 5-6` +day=`echo $CDATE | cut -c 7-8` +hour=`echo $CDATE | cut -c 9-10` +CDATEprior=`${NDATE} -6 $CDATE` +PDY_prior=`echo ${CDATEprior} | cut -c1-8` +cyc_prior=`echo ${CDATEprior} | cut -c9-10` + +WGRIB2=${WGRIB2:-wgrib2} +CHGRESCUBEEXEC=${CHGRESCUBEEXEC:-${EXEChafs}/hafs_chgres_cube.x} + +ENSDA=${ENSDA:-NO} + +# Set options specific to the deterministic/ensemble forecast +if [ ${ENSDA} != YES ]; then + NBDYHRS=${NBDYHRS:-3} + CASE=${CASE:-C768} + CRES=`echo $CASE | cut -c 2-` + gtype=${gtype:-regional} + ictype=${ictype:-gfsnemsio} + bctype=${bctype:-gfsnemsio} + LEVS=${LEVS:-65} + GRID_intercom=${WORKhafs}/intercom/grid +else + NBDYHRS=${NBDYHRS_ENS:-3} + CASE=${CASE_ENS:-C768} + CRES=`echo $CASE | cut -c 2-` + gtype=${gtype_ens:-regional} + ictype=${ictype_ens:-gfsnemsio} + bctype=${bctype_ens:-gfsnemsio} + LEVS=${LEVS_ENS:-65} + GRID_intercom=${WORKhafs}/intercom/grid_ens +fi + +# Generate the ICs and BC hour 0 +if [ $gtype = regional ] ; then + export REGIONAL=1 + export HALO=4 +else +# for gtype = uniform, stretch, or nest + export REGIONAL=0 +fi + +export NTRAC=7 +halo_blend=${halo_blend:-0} +vcoord_file_target_grid=${vcoord_file_target_grid:-${FIXhafs}/fix_am/global_hyblev.l${LEVS}.txt} + +if [ $GFSVER = "PROD2021" ]; then + if [ ${ENSDA} = YES ]; then + export INIDIR=${COMgfs}/enkfgdas.${PDY_prior}/${cyc_prior}/atmos/mem${ENSID} + else + export INIDIR=${COMgfs}/gfs.$PDY/$cyc/atmos + fi +elif [ $GFSVER = "PROD2019" ]; then + if [ ${ENSDA} = YES ]; then + export INIDIR=${COMgfs}/enkfgdas.${PDY_prior}/${cyc_prior}/mem${ENSID} + else + export INIDIR=${COMgfs}/gfs.$PDY/$cyc + fi +else + export INIDIR=${COMgfs}/gfs.$PDY/$cyc +fi + +OUTDIR=${OUTDIR:-${WORKhafs}/intercom/chgres} +DATA=${DATA:-${WORKhafs}/atm_ic} +mkdir -p ${OUTDIR} ${DATA} + +FIXDIR=${DATA}/grid +FIXCASE=${DATA}/grid/${CASE} +mkdir -p $DATA ${FIXDIR} ${FIXCASE} + +cd $FIXDIR/${CASE} +ln -sf ${GRID_intercom}/${CASE}/* ./ + +cd $DATA + +FHR3="000" +CDUMP=gfs # gfs or gdas + +# Use gfs netcdf files from GFSv16 +if [ $ictype = "gfsnetcdf" ]; then + if [ ${ENSDA} = YES ]; then + atm_files_input_grid=gdas.t${cyc_prior}z.atmf006.nc + sfc_files_input_grid=gdas.t${cyc_prior}z.sfcf006.nc + else + atm_files_input_grid=${CDUMP}.t${cyc}z.atmanl.nc + sfc_files_input_grid=${CDUMP}.t${cyc}z.sfcanl.nc + fi + grib2_file_input_grid="" + input_type="gaussian_netcdf" + varmap_file="" + fixed_files_dir_input_grid="" + tracers='"sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel"' + tracers_input='"spfh","clwmr","o3mr","icmr","rwmr","snmr","grle"' +# Use gfs nemsio files from 2019 GFS (fv3gfs) +elif [ $ictype = "gfsnemsio" ]; then + if [ ${ENSDA} = YES ]; then + atm_files_input_grid=gdas.t${cyc_prior}z.atmf006.nemsio + sfc_files_input_grid=gdas.t${cyc_prior}z.sfcf006.nemsio + else + atm_files_input_grid=${CDUMP}.t${cyc}z.atmanl.nemsio + sfc_files_input_grid=${CDUMP}.t${cyc}z.sfcanl.nemsio + fi + grib2_file_input_grid="" + input_type="gaussian_nemsio" + varmap_file="" + fixed_files_dir_input_grid="" + tracers='"sphum","liq_wat","o3mr","ice_wat","rainwat","snowwat","graupel"' + tracers_input='"spfh","clwmr","o3mr","icmr","rwmr","snmr","grle"' +# Use gfs master grib2 files +elif [ $ictype = "gfsgrib2_master" ]; then + atm_files_input_grid=${CDUMP}.t${cyc}z.master.pgrb2f${FHR3} + sfc_files_input_grid=${CDUMP}.t${cyc}z.master.pgrb2f${FHR3} + grib2_file_input_grid=${CDUMP}.t${cyc}z.master.pgrb2f${FHR3} + input_type="grib2" + varmap_file="${HOMEhafs}/sorc/hafs_utils.fd/parm/varmap_tables/GFSphys_var_map.txt" + fixed_files_dir_input_grid="${HOMEhafs}/sorc/hafs_utils.fd/fix/fix_chgres" + tracers='"sphum","liq_wat","o3mr"' + tracers_input='"spfh","clwmr","o3mr"' +# Use gfs 0.25 degree grib2 files +elif [ $ictype = "gfsgrib2_0p25" ]; then + atm_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} + sfc_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} + grib2_file_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} + input_type="grib2" + varmap_file="${HOMEhafs}/sorc/hafs_utils.fd/parm/varmap_tables/GFSphys_var_map.txt" + fixed_files_dir_input_grid="${HOMEhafs}/sorc/hafs_utils.fd/fix/fix_chgres" + tracers='"sphum","liq_wat","o3mr"' + tracers_input='"spfh","clwmr","o3mr"' +# Use gfs 0.25 degree grib2 a and b files +elif [ $ictype = "gfsgrib2ab_0p25" ]; then + atm_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} + sfc_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} + grib2_file_input_grid=${CDUMP}.t${cyc}z.pgrb2ab.0p25.f${FHR3} + input_type="grib2" + varmap_file="${HOMEhafs}/sorc/hafs_utils.fd/parm/varmap_tables/GFSphys_var_map.txt" + fixed_files_dir_input_grid="${HOMEhafs}/sorc/hafs_utils.fd/fix/fix_chgres" + tracers='"sphum","liq_wat","o3mr"' + tracers_input='"spfh","clwmr","o3mr"' +# Use gfs 0.50 degree grib2 files +elif [ $ictype = "gfsgrib2_0p50" ]; then + atm_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p50.f${FHR3} + sfc_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p50.f${FHR3} + grib2_file_input_grid=${CDUMP}.t${cyc}z.pgrb2.0p50.f${FHR3} + input_type="grib2" + varmap_file="${HOMEhafs}/sorc/hafs_utils.fd/parm/varmap_tables/GFSphys_var_map.txt" + fixed_files_dir_input_grid="${HOMEhafs}/sorc/hafs_utils.fd/fix/fix_chgres" + tracers='"sphum","liq_wat","o3mr"' + tracers_input='"spfh","clwmr","o3mr"' +# Use gfs 1.00 degree grib2 files +elif [ $ictype = "gfsgrib2_1p00" ]; then + atm_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.1p00.f${FHR3} + sfc_files_input_grid=${CDUMP}.t${cyc}z.pgrb2.1p00.f${FHR3} + grib2_file_input_grid=${CDUMP}.t${cyc}z.pgrb2.1p00.f${FHR3} + input_type="grib2" + varmap_file="${HOMEhafs}/sorc/hafs_utils.fd/parm/varmap_tables/GFSphys_var_map.txt" + fixed_files_dir_input_grid="${HOMEhafs}/sorc/hafs_utils.fd/fix/fix_chgres" + tracers='"sphum","liq_wat","o3mr"' + tracers_input='"spfh","clwmr","o3mr"' +else + echo "FATAL ERROR: unsupportted input data type yet." + exit 1 +fi + +if [ $input_type = "grib2" ]; then + if [ $ictype = gfsgrib2ab_0p25 ]; then + # Use both ${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} and ${CDUMP}.t${cyc}z.pgrb2b.0p25.f${FHR3} files + cat ${INIDIR}/${CDUMP}.t${cyc}z.pgrb2.0p25.f${FHR3} ${INIDIR}/${CDUMP}.t${cyc}z.pgrb2b.0p25.f${FHR3} > ./${grib2_file_input_grid}_tmp + ${WGRIB2} ${grib2_file_input_grid}_tmp -submsg 1 | ${USHhafs}/hafs_grib2_unique.pl | ${WGRIB2} -i ./${grib2_file_input_grid}_tmp -GRIB ./${grib2_file_input_grid} + #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv + else + ln -sf ${INIDIR}/${grib2_file_input_grid} ./ + #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv + fi + INPDIR="./" +else + if [ ${ENSDA} = YES ]; then + ln -sf ${INIDIR}/${atm_files_input_grid} ./ + ln -sf ${INIDIR}/${sfc_files_input_grid} ./ + INPDIR="./" + else + INPDIR=${INIDIR} + fi +fi + +if [ $gtype = uniform ] || [ $gtype = stretch ] || [ $gtype = nest ]; then + + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}*.nc $FIXDIR/$CASE/. + if [ $gtype = nest ]; then + ln -sf $FIXDIR/$CASE/${CASE}_coarse_mosaic.nc $FIXDIR/$CASE/${CASE}_mosaic.nc + fi + mosaic_file_target_grid="$FIXDIR/$CASE/${CASE}_mosaic.nc" + orog_files_target_grid='"'${CASE}'_oro_data.tile1.nc","'${CASE}'_oro_data.tile2.nc","'${CASE}'_oro_data.tile3.nc","'${CASE}'_oro_data.tile4.nc","'${CASE}'_oro_data.tile5.nc","'${CASE}'_oro_data.tile6.nc"' + convert_atm=.true. + convert_sfc=.true. + if [ $input_type = "grib2" ]; then + convert_nst=.false. + else + convert_nst=.true. + fi + regional=0 + halo_bndy=0 + halo_blend=0 + +elif [ $gtype = regional ]; then +# set the links to use the 4 halo grid and orog files +# these are necessary for creating the boundary data +# + ln -sf $FIXDIR/$CASE/${CASE}_grid.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_grid.tile7.nc + ln -sf $FIXDIR/$CASE/${CASE}_oro_data.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_oro_data.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_greenness.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_greenness.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.soil_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.soil_type.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.slope_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.slope_type.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.substrate_temperature.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.substrate_temperature.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.facsf.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.facsf.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.maximum_snow_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.maximum_snow_albedo.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.snowfree_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.snowfree_albedo.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_type.tile7.nc + + mosaic_file_target_grid="$FIXDIR/$CASE/${CASE}_mosaic.nc" + orog_files_target_grid='"'${CASE}'_oro_data.tile7.halo4.nc"' + convert_atm=.true. + if [ $REGIONAL -eq 1 ]; then + regional=1 + convert_sfc=.true. + if [ $input_type = "grib2" ]; then + convert_nst=.false. + else + convert_nst=.true. + fi + elif [ $REGIONAL -eq 2 ]; then + regional=2 + convert_sfc=.false. + convert_nst=.false. + else + echo "WARNING: Wrong gtype: $gtype REGIONAL: $REGIONAL combination" + fi + halo_bndy=4 + halo_blend=${halo_blend} +else + echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest, or regional" + exit 9 +fi + +# create namelist and run chgres_cube +# +cat>./fort.41<./fort.41< ./${grib2_file_input_grid}_tmp + ${WGRIB2} ${grib2_file_input_grid}_tmp -submsg 1 | ${USHhafs}/hafs_grib2_unique.pl | ${WGRIB2} -i ./${grib2_file_input_grid}_tmp -GRIB ./${grib2_file_input_grid} + #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv + else + ln -sf ${INIDIR}/${grib2_file_input_grid} ./ + #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv + fi + INPDIR="./" +else + if [ ${ENSDA} = YES ]; then + ln -sf ${INIDIR}/${atm_files_input_grid} ./ + ln -sf ${INIDIR}/${sfc_files_input_grid} ./ + INPDIR="./" + else + INPDIR=${INIDIR} + fi +fi + +if [ $gtype = regional ]; then +# set the links to use the 4 halo grid and orog files +# these are necessary for creating the boundary data +# + ln -sf $FIXDIR/$CASE/${CASE}_grid.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_grid.tile7.nc + ln -sf $FIXDIR/$CASE/${CASE}_oro_data.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_oro_data.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_greenness.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_greenness.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.soil_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.soil_type.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.slope_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.slope_type.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.substrate_temperature.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.substrate_temperature.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.facsf.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.facsf.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.maximum_snow_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.maximum_snow_albedo.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.snowfree_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.snowfree_albedo.tile7.nc + ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_type.tile7.nc + + mosaic_file_target_grid="$FIXDIR/$CASE/${CASE}_mosaic.nc" + orog_files_target_grid='"'${CASE}'_oro_data.tile7.halo4.nc"' + convert_atm=.true. + + if [ $REGIONAL -eq 1 ]; then + regional=1 + convert_sfc=.true. + convert_nst=.true. + elif [ $REGIONAL -eq 2 ]; then + regional=2 + convert_sfc=.false. + convert_nst=.false. + else + echo "WARNING: Wrong gtype: $gtype REGIONAL: $REGIONAL combination" + fi + halo_bndy=4 + halo_blend=${halo_blend:-0} +else + echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest, or regional" + exit 9 +fi + +# create namelist and run chgres_cube +# +cat>./fort.41<itag< outpost_${NEWDATE} + +mv HURPRS.GrbF${FHR2} ${synop_grb2post} + +if [ "$output_grid" = rotated_latlon ]; then + +# For rotated_latlon output grid +# Convert from rotate lat-lon grib2 to regular lat-lon grib2 +#${WGRIB2} ${synop_grb2post} -set_bitmap 1 -set_grib_type c3 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor -new_grid ${synop_gridspecs} ${synop_grb2file} +# Parallelize this section to speed up wgrib2 +#opts='-set_bitmap 1 -set_grib_type c3 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' +opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' +rm -f cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":2 mb:|:5 mb:|:7 mb:|:10 mb:|:20 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part00 > cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":30 mb:|:50 mb:|:70 mb:|:100 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part01 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":125 mb:|:150 mb:|:175 mb:|:200 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part02 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":225 mb:|:250 mb:|:275 mb:|:300 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part03 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":325 mb:|:350 mb:|:375 mb:|:400 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part04 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":425 mb:|:450 mb:|:475 mb:|:500 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part05 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":525 mb:|:550 mb:|:575 mb:|:600 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part06 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":625 mb:|:650 mb:|:675 mb:|:700 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part07 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":725 mb:|:750 mb:|:775 mb:|:800 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part08 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":825 mb:|:850 mb:|:875 mb:|:900 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part09 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -match '":925 mb:|:950 mb:|:975 mb:|:1000 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part10 >> cmdfile +echo ${WGRIB2} ${synop_grb2post} -not '" mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part11 >> cmdfile +chmod +x cmdfile +${APRUNC} ${MPISERIAL} -m cmdfile +# Cat the temporary files together +cat ${synop_grb2post}.part?? > ${synop_grb2file} +# clean up the temporary files +rm -f ${synop_grb2post}.part?? + +elif [ "$output_grid" = regional_latlon ]; then + +# For regional_latlon output grid, no need to convert +mv ${synop_grb2post} ${synop_grb2file} + +## Alternatively, can use wgrib2 to convert from c3 to c2 packing, which can reduce the filesize by ~30%. +#opts='-set_grib_type c2 -grib_out' + +else + + echo "ERROR: output grid: ${output_grid} not supported exitting" + exit 1 + +fi + +# Generate the grib2 index file +${WGRIB2} -s ${synop_grb2file} > ${synop_grb2indx} + +# Extract hafstrk grib2 files for the tracker +# From HMON +#PARMlist=':UGRD:500 mb|:VGRD:500 mb|:HGT:700 mb:|:UGRD:700 mb:|:VGRD:700 mb:|:ABSV:700 mb:|:HGT:850 mb:|:UGRD:850 mb:|:VGRD:850 mb:|:ABSV:850 mb:|:MSLET:|:UGRD:10 m above|:VGRD:10 m above' +# From HWRF +#PARMlist='HGT:925|HGT:850|HGT:700|UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m |VGRD:10 m |ABSV:850|ABSV:700|PRMSL|HGT:900|HGT:800|HGT:750|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|HGT:250|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250' +# From ens_tracker for GFS +#PARMlist='UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300' + +PARMlist='UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200' + +#PARMlist='UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|PRMSL|HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200' + +${APRUNS} ${WGRIB2} ${synop_grb2file} -match "${PARMlist}" -grib ${hafstrk_grb2file} + +# Generate the index file for the tracker +${GRB2INDEX} ${hafstrk_grb2file} ${hafstrk_grb2indx} + +# Deliver to COMOUTpost +if [ $SENDCOM = YES ]; then + mkdir -p ${COMOUTpost} + mv ${synop_grb2file} ${COMOUTpost}/ + mv ${synop_grb2indx} ${COMOUTpost}/ +fi + +# Deliver to intercom +mkdir -p ${intercom} +mv ${hafstrk_grb2file} ${intercom}/ +mv ${hafstrk_grb2indx} ${intercom}/ + +# Write out the postdone message file +echo 'done' > ${INPdir}/postf${FHR3} + +cd ${DATA} + +fi +# End if for checking if post has processed this forecast hour previously + +IFHR=`expr $IFHR + 1` +FHR=`expr $FHR + $NOUTHRS` +FHR2=$( printf "%02d" "$FHR" ) +FHR3=$( printf "%03d" "$FHR" ) + +done +# End loop for forecast hours + +echo "post job done" + +exit diff --git a/scripts/exhafs_atm_prep.sh b/scripts/exhafs_atm_prep.sh new file mode 100755 index 000000000..21e5e2493 --- /dev/null +++ b/scripts/exhafs_atm_prep.sh @@ -0,0 +1,464 @@ +#!/bin/sh + +set -xe + +NCP=${NCP:-'/bin/cp'} +NLN=${NLN:-'/bin/ln -sf'} +NDATE=${NDATE:-ndate} + +TOTAL_TASKS=${TOTAL_TASKS:-2016} +NCTSK=${NCTSK:-12} +NCNODE=${NCNODE:-24} +OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} +OMP_STACKSIZE=${OMP_STACKSIZE:-2048m} +APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} +export APRUN=time + +CDATE=${CDATE:-${YMDH}} +cyc=${cyc:-00} +STORM=${STORM:-FAKE} +STORMID=${STORMID:-00L} + +export ENSDA=${ENSDA:-NO} +if [ ${ENSDA} != YES ]; then + export CASE=${CASE:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype:-regional} + export gridfixdir=${gridfixdir:-'/let/hafs_grid/generate/grid'} + export LEVS=${LEVS:-65} + export istart_nest=${istart_nest:-46} + export jstart_nest=${jstart_nest:-238} + export iend_nest=${iend_nest:-1485} + export jend_nest=${jend_nest:-1287} + export stretch_fac=${stretch_fac:-1.0001} + export target_lon=${target_lon:--62.0} + export target_lat=${target_lat:-22.0} + export refine_ratio=${refine_ratio:-4} +else + export CASE=${CASE_ENS:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype_ens:-regional} + export gridfixdir=${gridfixdir_ens:-'/let/hafs_grid/generate/grid_ens'} + export LEVS=${LEVS_ENS:-65} + export istart_nest=${istart_nest_ens:-46} + export jstart_nest=${jstart_nest_ens:-238} + export iend_nest=${iend_nest_ens:-1485} + export jend_nest=${jend_nest_ens:-1287} + export stretch_fac=${stretch_fac_ens:-1.0001} + export target_lon=${target_lon_ens:--62.0} + export target_lat=${target_lat_ens:-22.0} + export refine_ratio=${refine_ratio_ens:-4} +fi +export res=${res:-$CRES} +export halo=${halo:-3} +export halop1=${halop1:-4} +export halo0=${halo0:-0} +export NTRAC=7 + +export FIXam=${FIXhafs}/fix_am +export FIXorog=${FIXhafs}/fix_orog +export FIXfv3=${FIXhafs}/fix_fv3 +export FIXsfc_climo=${FIXhafs}/fix_sfc_climo + +export MAKEHGRIDEXEC=${EXEChafs}/hafs_make_hgrid.x +export MAKEMOSAICEXEC=${EXEChafs}/hafs_make_solo_mosaic.x +export FILTERTOPOEXEC=${EXEChafs}/hafs_filter_topo.x +export FREGRIDEXEC=${EXEChafs}/hafs_fregrid.x +export OROGEXEC=${EXEChafs}/hafs_orog.x +export SHAVEEXEC=${EXEChafs}/hafs_shave.x +export SFCCLIMOEXEC=${EXEChafs}/hafs_sfc_climo_gen.x + +export MAKEGRIDSSH=${USHhafs}/hafs_make_grid.sh +export MAKEOROGSSH=${USHhafs}/hafs_make_orog.sh +export FILTERTOPOSSH=${USHhafs}/hafs_filter_topo.sh + +export gridfixdir=${gridfixdir:-'/let/hafs_grid/generate/grid'} +export script_dir=${USHhafs} +export exec_dir=${EXEChafs} +export out_dir=${OUTDIR:-${WORKhafs}/intercom/grid} +export DATA=${DATA:-${WORKhafs}/atm_prep} + +# If gridfixdir is specified and exists, use the grid fix files directly +if [ -d $gridfixdir ]; then + echo "$gridfixdir is specified and exists." + echo "Copy the grid fix files directly." + cp -rp $gridfixdir/* ${out_dir}/ + ls ${out_dir} + exit +fi + +# Otherwise, generate grid according to the following parameters +#---------------------------------------------------------------- +if [ $gtype = uniform ]; then + echo "creating uniform ICs" +elif [ $gtype = stretch ]; then + export stretch_fac=${stretch_fac:-1.5} # Stretching factor for the grid + export target_lon=${target_lon:--97.5} # center longitude of the highest resolution tile + export target_lat=${target_lat:-35.5} # center latitude of the highest resolution tile + echo "creating stretched grid" +elif [ $gtype = nest ] || [ $gtype = regional ]; then + export stretch_fac=${stretch_fac:-1.0001} # Stretching factor for the grid + export target_lon=${target_lon:--62.0} # center longitude of the highest resolution tile + export target_lat=${target_lat:-22.0} # center latitude of the highest resolution tile + # Need for grid types: nest and regional + export refine_ratio=${refine_ratio:-4} # Specify the refinement ratio for nest grid + export istart_nest=${istart_nest:-46} + export jstart_nest=${jstart_nest:-238} + export iend_nest=${iend_nest:-1485} + export jend_nest=${jend_nest:-1287} + export halo=${halo:-3} # halo size to be used in the atmosphere cubic sphere model for the grid tile. + export halop1=${halop1:-4} # halo size that will be used for the orography and grid tile in chgres + export halo0=${halo0:-0} # no halo, used to shave the filtered orography for use in the model + if [ $gtype = nest ];then + echo "creating nested grid" + else + echo "creating regional grid" + fi +else + echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest or regional" + exit 1 +fi + +#---------------------------------------------------------------- +# Make grid and orography + +export grid_dir=$DATA/grid +export orog_dir=$DATA/orog +if [ $gtype = uniform ] || [ $gtype = stretch ] ; then + export filter_dir=$DATA/filter_topo +elif [ $gtype = nest ] || [ $gtype = regional ] ; then + export filter_dir=$DATA/filter_topo + export filter_dir=$orog_dir # nested grid topography will be filtered online +fi +mkdir -p $grid_dir $orog_dir $filter_dir + +if [ $gtype = uniform ] || [ $gtype = stretch ] ; then + export ntiles=6 + date + echo "............ execute $MAKEGRIDSSH ................." + if [ $gtype = uniform ]; then + ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $script_dir + elif [ $gtype = stretch ]; then + ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $stretch_fac $target_lon $target_lat $script_dir + fi + date + echo "............ execute $MAKEOROGSSH ................." + # Run multiple tiles simulatneously for the orography + + echo "${APRUNO} $MAKEOROGSSH $CRES 1 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 2 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 3 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 4 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 5 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 6 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 +if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then + echo 'wait' >> orog.file1 +fi + chmod u+x $DATA/orog.file1 + #aprun -j 1 -n 4 -N 4 -d 6 -cc depth cfp $DATA/orog.file1 + ${APRUNF} $DATA/orog.file1 + wait + #rm $DATA/orog.file1 + date + echo "............ execute $FILTERTOPOSSH .............." + $FILTERTOPOSSH $CRES $grid_dir $orog_dir $filter_dir + echo "Grid and orography files are now prepared" +elif [ $gtype = nest ]; then + export ntiles=7 + date + echo "............ execute $MAKEGRIDSSH ................." + ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $stretch_fac $target_lon $target_lat $refine_ratio $istart_nest $jstart_nest $iend_nest $jend_nest $halo $script_dir + date + echo "............ execute $MAKEOROGSSH ................." + # Run multiple tiles simulatneously for the orography + echo "${APRUNO} $MAKEOROGSSH $CRES 1 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 2 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 3 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 4 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 5 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 6 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 7 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 +if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then + echo 'wait' >> orog.file1 +fi + chmod u+x $DATA/orog.file1 + #aprun -j 1 -n 4 -N 4 -d 6 -cc depth cfp $DATA/orog.file1 + ${APRUNF} $DATA/orog.file1 + wait + #rm $DATA/orog.file1 + date + echo "Grid and orography files are now prepared" +elif [ $gtype = regional ]; then + # We are now creating only 1 tile and it is tile 7 + export ntiles=1 + tile=7 + + # number of parent points + nptsx=`expr $iend_nest - $istart_nest + 1` + nptsy=`expr $jend_nest - $jstart_nest + 1` + # number of compute grid points + npts_cgx=`expr $nptsx \* $refine_ratio / 2` + npts_cgy=`expr $nptsy \* $refine_ratio / 2` + + # figure out how many columns/rows to add in each direction so we have at least 5 halo points + # for make_hgrid and the orography program + index=0 + add_subtract_value=0 + while (test "$index" -le "0") + do + add_subtract_value=`expr $add_subtract_value + 1` + iend_nest_halo=`expr $iend_nest + $add_subtract_value` + istart_nest_halo=`expr $istart_nest - $add_subtract_value` + newpoints_i=`expr $iend_nest_halo - $istart_nest_halo + 1` + newpoints_cg_i=`expr $newpoints_i \* $refine_ratio / 2` + diff=`expr $newpoints_cg_i - $npts_cgx` + if [ $diff -ge 10 ]; then + index=`expr $index + 1` + fi + done + jend_nest_halo=`expr $jend_nest + $add_subtract_value` + jstart_nest_halo=`expr $jstart_nest - $add_subtract_value` + + echo "================================================================================== " + echo "For refine_ratio= $refine_ratio" + echo " iend_nest= $iend_nest iend_nest_halo= $iend_nest_halo istart_nest= $istart_nest istart_nest_halo= $istart_nest_halo" + echo " jend_nest= $jend_nest jend_nest_halo= $jend_nest_halo jstart_nest= $jstart_nest jstart_nest_halo= $jstart_nest_halo" + echo "================================================================================== " + + echo "............ execute $MAKEGRIDSSH ................." + ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $stretch_fac $target_lon $target_lat $refine_ratio $istart_nest_halo $jstart_nest_halo $iend_nest_halo $jend_nest_halo $halo $script_dir + + date + echo "............ execute $MAKEOROGSSH ................." + #echo "$MAKEOROGSSH $CRES 7 $grid_dir $orog_dir $script_dir $FIXorog $DATA " >>$DATA/orog.file1 + echo "${APRUNO} $MAKEOROGSSH $CRES 7 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 +if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then + echo 'wait' >> orog.file1 +fi + chmod u+x $DATA/orog.file1 + #aprun -j 1 -n 4 -N 4 -d 6 -cc depth cfp $DATA/orog.file1 + ${APRUNF} $DATA/orog.file1 + wait + #rm $DATA/orog.file1 + + date + echo "............ execute $FILTERTOPOSSH .............." + ${APRUNS} $FILTERTOPOSSH $CRES $grid_dir $orog_dir $filter_dir + + echo "............ execute shave to reduce grid and orography files to required compute size .............." + cd $filter_dir + # shave the orography file and then the grid file, the echo creates the input file that contains the number of required points + # in x and y and the input and output file names.This first run of shave uses a halo of 4. This is necessary so that chgres will create BC's + # with 4 rows/columns which is necessary for pt. + echo $npts_cgx $npts_cgy $halop1 \'$filter_dir/oro.${CASE}.tile${tile}.nc\' \'$filter_dir/oro.${CASE}.tile${tile}.shave.nc\' >input.shave.orog + echo $npts_cgx $npts_cgy $halop1 \'$filter_dir/${CASE}_grid.tile${tile}.nc\' \'$filter_dir/${CASE}_grid.tile${tile}.shave.nc\' >input.shave.grid + + #aprun -n 1 -N 1 -j 1 -d 1 -cc depth $exec_dir/shave.x input.shave.orog.halo${halo} + echo $npts_cgx $npts_cgy $halo \'$filter_dir/${CASE}_grid.tile${tile}.nc\' \'$filter_dir/${CASE}_grid.tile${tile}.shave.nc\' >input.shave.grid.halo${halo} + ${APRUNS} ${SHAVEEXEC} < input.shave.orog.halo${halo} + ${APRUNS} ${SHAVEEXEC} < input.shave.grid.halo${halo} + + # Copy the shaved files with the halo of 3 + cp $filter_dir/oro.${CASE}.tile${tile}.shave.nc $out_dir/${CASE}_oro_data.tile${tile}.halo${halo}.nc + cp $filter_dir/${CASE}_grid.tile${tile}.shave.nc $out_dir/${CASE}_grid.tile${tile}.halo${halo}.nc + + # Now shave the orography file and then the grid file with a halo of 0. This is handy for running chgres. + echo $npts_cgx $npts_cgy $halo0 \'$filter_dir/oro.${CASE}.tile${tile}.nc\' \'$filter_dir/oro.${CASE}.tile${tile}.shave.nc\' >input.shave.orog.halo${halo0} + echo $npts_cgx $npts_cgy $halo0 \'$filter_dir/${CASE}_grid.tile${tile}.nc\' \'$filter_dir/${CASE}_grid.tile${tile}.shave.nc\' >input.shave.grid.halo${halo0} + + ${APRUNS} ${SHAVEEXEC} < input.shave.orog.halo${halo0} + ${APRUNS} ${SHAVEEXEC} < input.shave.grid.halo${halo0} + + # Copy the shaved files with the halo of 0 + cp $filter_dir/oro.${CASE}.tile${tile}.shave.nc $out_dir/${CASE}_oro_data.tile${tile}.halo${halo0}.nc + cp $filter_dir/${CASE}_grid.tile${tile}.shave.nc $out_dir/${CASE}_grid.tile${tile}.halo${halo0}.nc + + echo "Grid and orography files are now prepared" + +fi +#---------------------------------------------------------------- + +# For non-regional grids, copy grid and orography files to output directory. +if [ $gtype != regional ]; then + echo "Copy grid and orography files to output directory" + tile=1 + while [ $tile -le $ntiles ]; do + cp $filter_dir/oro.${CASE}.tile${tile}.nc $out_dir/${CASE}_oro_data.tile${tile}.nc + cp $grid_dir/${CASE}_grid.tile${tile}.nc $out_dir/${CASE}_grid.tile${tile}.nc + tile=`expr $tile + 1 ` + done +fi + +# Copy mosaic file(s) to output directory. +cp $grid_dir/${CASE}_*mosaic.nc $out_dir/ + +#---------------------------------------------------------------- +# Make surface static fields - vegetation type, soil type, etc. +# +# For global grids with a nest, the program is run twice. First +# to create the fields for the six global tiles. Then to create +# the fields on the high-res nest. This is done because the +# ESMF libraries can not interpolate to seven tiles at once. +# Note: +# Stand-alone regional grids may be run with any number of +# tasks. All other configurations must be run with a +# MULTIPLE OF SIX MPI TASKS. + +date +input_sfc_climo_dir=${FIXhafs}/fix_sfc_climo +sfc_climo_workdir=$DATA/sfc_climo +sfc_climo_savedir=$out_dir/fix_sfc +mkdir -p $sfc_climo_workdir $sfc_climo_savedir +cd ${sfc_climo_workdir} + +if [ $gtype = uniform ] || [ $gtype = stretch ]; then + GRIDTYPE=NULL + HALO=${HALO:-0} + mosaic_file=${out_dir}/${CASE}_mosaic.nc + the_orog_files='"'${CASE}'_oro_data.tile1.nc","'${CASE}'_oro_data.tile2.nc","'${CASE}'_oro_data.tile3.nc","'${CASE}'_oro_data.tile4.nc","'${CASE}'_oro_data.tile5.nc","'${CASE}'_oro_data.tile6.nc"' +elif [ $gtype = nest ]; then + # First pass for global-nesting configuration will run the 6 global tiles + GRIDTYPE=NULL + HALO=${HALO:-0} + mosaic_file=$out_dir/${CASE}_coarse_mosaic.nc + the_orog_files='"'${CASE}'_oro_data.tile1.nc","'${CASE}'_oro_data.tile2.nc","'${CASE}'_oro_data.tile3.nc","'${CASE}'_oro_data.tile4.nc","'${CASE}'_oro_data.tile5.nc","'${CASE}'_oro_data.tile6.nc"' +elif [ $gtype = regional ]; then + GRIDTYPE=regional + tile=7 + HALO=$halop1 + ln -fs $out_dir/${CASE}_grid.tile${tile}.halo${HALO}.nc $out_dir/${CASE}_grid.tile${tile}.nc + ln -fs $out_dir/${CASE}_oro_data.tile${tile}.halo${HALO}.nc $out_dir/${CASE}_oro_data.tile${tile}.nc + mosaic_file=${out_dir}/${CASE}_mosaic.nc + the_orog_files='"'${CASE}'_oro_data.tile'${tile}'.nc"' +else + echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest or regional" + exit 1 +fi + +cat>./fort.41<./fort.41< ./${grib2_file_input_grid}_tmp - ${WGRIB2} ${grib2_file_input_grid}_tmp -submsg 1 | ${USHhafs}/hafs_grib2_unique.pl | ${WGRIB2} -i ./${grib2_file_input_grid}_tmp -GRIB ./${grib2_file_input_grid} - #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv - else - ln -sf ${INIDIR}/${grib2_file_input_grid} ./ - #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv - fi - INPDIR="./" -else - INPDIR=${INIDIR} -fi - -if [ $gtype = regional ]; then -# set the links to use the 4 halo grid and orog files -# these are necessary for creating the boundary data -# - ln -sf $FIXDIR/$CASE/${CASE}_grid.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_grid.tile7.nc - ln -sf $FIXDIR/$CASE/${CASE}_oro_data.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_oro_data.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_greenness.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_greenness.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.soil_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.soil_type.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.slope_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.slope_type.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.substrate_temperature.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.substrate_temperature.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.facsf.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.facsf.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.maximum_snow_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.maximum_snow_albedo.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.snowfree_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.snowfree_albedo.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_type.tile7.nc - - mosaic_file_target_grid="$FIXDIR/$CASE/${CASE}_mosaic.nc" - orog_files_target_grid='"'${CASE}'_oro_data.tile7.halo4.nc"' - convert_atm=.true. - - if [ $REGIONAL -eq 1 ]; then - regional=1 - convert_sfc=.true. - convert_nst=.true. - elif [ $REGIONAL -eq 2 ]; then - regional=2 - convert_sfc=.false. - convert_nst=.false. - else - echo "WARNING: Wrong gtype: $gtype REGIONAL: $REGIONAL combination" - fi - halo_bndy=4 - halo_blend=${halo_blend:-0} -else - echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest, or regional" - exit 9 -fi - -# create namelist and run chgres_cube -# -cat>./fort.41< ./${grib2_file_input_grid}_tmp - ${WGRIB2} ${grib2_file_input_grid}_tmp -submsg 1 | ${USHhafs}/hafs_grib2_unique.pl | ${WGRIB2} -i ./${grib2_file_input_grid}_tmp -GRIB ./${grib2_file_input_grid} - #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv - else - ln -sf ${INIDIR}/${grib2_file_input_grid} ./ - #${WGRIB2} ${grib2_file_input_grid} -inv ./chgres.inv - fi - INPDIR="./" -else - INPDIR=${INIDIR} -fi - -if [ $gtype = uniform ] || [ $gtype = stretch ] || [ $gtype = nest ]; then - - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}*.nc $FIXDIR/$CASE/. - if [ $gtype = nest ]; then - ln -sf $FIXDIR/$CASE/${CASE}_coarse_mosaic.nc $FIXDIR/$CASE/${CASE}_mosaic.nc - fi - mosaic_file_target_grid="$FIXDIR/$CASE/${CASE}_mosaic.nc" - orog_files_target_grid='"'${CASE}'_oro_data.tile1.nc","'${CASE}'_oro_data.tile2.nc","'${CASE}'_oro_data.tile3.nc","'${CASE}'_oro_data.tile4.nc","'${CASE}'_oro_data.tile5.nc","'${CASE}'_oro_data.tile6.nc"' - convert_atm=.true. - convert_sfc=.true. - if [ $input_type = "grib2" ]; then - convert_nst=.false. - else - convert_nst=.true. - fi - regional=0 - halo_bndy=0 - halo_blend=0 - -elif [ $gtype = regional ]; then -# set the links to use the 4 halo grid and orog files -# these are necessary for creating the boundary data -# - ln -sf $FIXDIR/$CASE/${CASE}_grid.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_grid.tile7.nc - ln -sf $FIXDIR/$CASE/${CASE}_oro_data.tile7.halo4.nc $FIXDIR/$CASE/${CASE}_oro_data.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_greenness.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_greenness.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.soil_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.soil_type.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.slope_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.slope_type.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.substrate_temperature.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.substrate_temperature.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.facsf.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.facsf.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.maximum_snow_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.maximum_snow_albedo.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.snowfree_albedo.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.snowfree_albedo.tile7.nc - ln -sf $FIXDIR/$CASE/fix_sfc/${CASE}.vegetation_type.tile7.halo4.nc $FIXDIR/$CASE/${CASE}.vegetation_type.tile7.nc - - mosaic_file_target_grid="$FIXDIR/$CASE/${CASE}_mosaic.nc" - orog_files_target_grid='"'${CASE}'_oro_data.tile7.halo4.nc"' - convert_atm=.true. - if [ $REGIONAL -eq 1 ]; then - regional=1 - convert_sfc=.true. - if [ $input_type = "grib2" ]; then - convert_nst=.false. - else - convert_nst=.true. - fi - elif [ $REGIONAL -eq 2 ]; then - regional=2 - convert_sfc=.false. - convert_nst=.false. - else - echo "WARNING: Wrong gtype: $gtype REGIONAL: $REGIONAL combination" - fi - halo_bndy=4 - halo_blend=${halo_blend} -else - echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest, or regional" - exit 9 -fi - -# create namelist and run chgres_cube -# -cat>./fort.41<./fort.41< ./prep_dynvartracer_ens${memstr}.sh << EOFprep +#!/bin/sh +set -x + cp ${RESTARTens_inp}/${memstr}/${PDY}.${cyc}0000.fv_core.res.tile1.nc fv3sar_tile1_${memstr}_dynvars + cp ${RESTARTens_inp}/${memstr}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc fv3sar_tile1_${memstr}_tracer + ncrename -d yaxis_1,yaxis_2 -v yaxis_1,yaxis_2 fv3sar_tile1_${memstr}_tracer + # somehow the yaxis_2 get default values, the following line is a temporary workaround + ncks --no-abc -A -v yaxis_2 fv3sar_tile1_${memstr}_dynvars fv3sar_tile1_${memstr}_tracer + ncks -A -v $tracer_list fv3sar_tile1_${memstr}_tracer fv3sar_tile1_${memstr}_dynvars + mv fv3sar_tile1_${memstr}_dynvars fv3sar_tile1_${memstr}_dynvartracer + rm -f fv3sar_tile1_${memstr}_tracer +EOFprep + chmod +x ./prep_dynvartracer_ens${memstr}.sh + echo "./prep_dynvartracer_ens${memstr}.sh" >> cmdfile_prep_dynvartracer_ens + done + chmod +x cmdfile_prep_dynvartracer_ens + ${APRUNC} ${MPISERIAL} -m cmdfile_prep_dynvartracer_ens +else # enkf_recenter + ${NCP} ${RESTARTens_anl}/ensmean/grid_spec.nc fv3sar_tile1_grid_spec.nc + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.fv_core.res.nc fv3sar_tile1_akbk.nc + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.coupler.res coupler.res + ${NCP} ${COMhafs}/RESTART_analysis/${PDY}.${cyc}0000.fv_core.res.tile1.nc fv3_dynvars + ${NCP} ${COMhafs}/RESTART_analysis/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc fv3_tracer + #dynvar_list="delp,DZ,phis,T,u,ua,v,va,W" + dynvar_list=$(ncks --trd -m fv3_dynvars | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort | grep -v 'Time' | grep -v 'axis' | paste -sd "," -) + #tracer_list="cld_amt,graupel,ice_wat,liq_wat,o3mr,rainwat,snowwat,sphum" + tracer_list=$(ncks --trd -m fv3_tracer | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort | grep -v 'Time' | grep -v 'axis' | paste -sd "," -) + ncrename -d yaxis_1,yaxis_2 -v yaxis_1,yaxis_2 fv3_tracer + # somehow the yaxis_2 get default values, the following line is a temporary workaround + ncks --no-abc -A -v yaxis_2 fv3_dynvars fv3_tracer + ncks -A -v ${tracer_list} fv3_tracer fv3_dynvars + # mem001 from deterministic EnVar analysis + # The assumption is that the deterministic and ensemble domains are identical but with different grid resolutions + # Also, the grid spacing ratio between the deterministic and ensemble domains is 1:GRID_RATIO_ENS, where GRID_RATIO_ENS can be 1, 2, 3, 4, 5, etc. + if [ ${GRID_RATIO_ENS:-1} -eq 1 ]; then + # the deterministic and ensemble domains are identical and with the same grid resolution + mv fv3_dynvars fv3sar_tile1_mem001_dynvartracer + else + # subset every GRID_RATIO_ENS grid points to obtain the deterministic EnVar analysis in ensemble resolution + ncks -d xaxis_1,,,${GRID_RATIO_ENS} -d xaxis_2,,,${GRID_RATIO_ENS} \ + -d yaxis_1,,,${GRID_RATIO_ENS} -d yaxis_2,,,${GRID_RATIO_ENS} \ + fv3_dynvars fv3sar_tile1_mem001_dynvartracer + fi + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.fv_dynvartracer fv3sar_tile1_ensmean_dynvartracer + # copy ensemble member files + rm -f cmdfile + let "nens0 = $nens" + let "nens = $nens + 1" + for imem in $(seq 1 $nens0) + do + memchar="mem"$(printf %03i $imem) + let "memin = $imem + 1" + meminchar="mem"$(printf %03i $memin) + echo "${NCP} ${RESTARTens_anl}/${memchar}/anl_dynvartracer_${PDY}.${cyc}0000.fv_core.res.tile1.nc fv3sar_tile1_${meminchar}_dynvartracer" >> cmdfile + done + chmod +x cmdfile + ${APRUNC} ${MPISERIAL} -m cmdfile +fi + +if [ $ldo_enscalc_option -eq 0 ]; then # enkf_update + rm -f cmdfile + memstr="ensmean" + RADSTAT=${RESTARTens_anl}/${memstr}/analysis.radstat + CNVSTAT=${RESTARTens_anl}/${memstr}/analysis.cnvstat + echo "tar -xvf $RADSTAT" >> cmdfile + echo "tar -xvf $CNVSTAT" >> cmdfile + + for memstr in $(seq -f "mem%03g" 1 $nens) + do + RADSTAT=${RESTARTens_anl}/${memstr}/analysis.radstat + CNVSTAT=${RESTARTens_anl}/${memstr}/analysis.cnvstat + echo "tar -xvf $RADSTAT" >> cmdfile + echo "tar -xvf $CNVSTAT" >> cmdfile + done + + chmod +x cmdfile + ${APRUNC} ${MPISERIAL} -m cmdfile + + rm -f cmdfile + for gzfile in $(/bin/ls diag*ges*.gz) + do + echo "gzip -d $gzfile && rm -f $gzfile" >> cmdfile + done + chmod +x cmdfile + ${APRUNC} ${MPISERIAL} -m cmdfile +fi + +${NLN} ${PARMgsi}/nam_glb_berror.f77.gcv ./berror_stats +#checkgfs $NLN $RADCLOUDINFO cloudy_radiance_info.txt +${NLN} ${PARMgsi}/atms_beamwidth.txt ./atms_beamwidth.txt +#checkgfs $NLN $vqcdat vqctp001.dat +#checkgfs $NLN $INSITUINFO insituinfo +${NLN} ${PARMgsi}/nam_global_pcpinfo.txt ./pcpinfo +#checkgfs $NLN $AEROINFO aeroinfo +#checkgfs $NLN $HYBENSINFO hybens_info +${NLN} ${PARMgsi}/hafs_nam_errtable.r3dv ./errtable + +if [ $ldo_enscalc_option -eq 1 -o $ldo_enscalc_option -eq 2 ]; then # enkf_mean or enkf_recenter + anavinfo=${PARMgsi}/hafs_anavinfo.tmp_enkf +else # enkf_update + anavinfo=${PARMgsi}/hafs_anavinfo.tmp_enkf +fi +#${NCP} ${anavinfo} ./anavinfo +sed -e "s/_LEV_/${npz:-64}/g" \ + -e "s/_LP1_/${LEVS:-65}/g" \ + ${anavinfo} > ./anavinfo + +${NLN} ${PARMgsi}/hafs_satinfo.txt ./satinfo +${NLN} ${PARMgsi}/global_scaninfo.txt ./scaninfo +#${NLN} ${PARMgsi}/nam_global_satangbias.txt ./satbias_angle +${NLN} ${PARMgsi}/global_ozinfo.txt ./ozinfo +${NLN} ${PARMgsi}/hafs_convinfo.txt ./convinfo + +${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias satbias_in +${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias_pc satbias_pc +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias_air satbias_air + +# Make enkf namelist +${NCP} ${PARMgsi}/enkf.nml.tmp ./ + +sed -e "s/_datestring_/${CDATE}/g" \ + -e "s/_nlons_/$((${npx_ens:-$npx}-1))/g" \ + -e "s/_nlats_/$((${npy_ens:-$npy}-1))/g" \ + -e "s/_nlevs_/${npz_ens:-$npz}/g" \ + -e "s/_nanals_/${nens}/g" \ + -e "s/_netcdf_diag_/${netcdf_diag}/g" \ + -e "s/_ldo_enscalc_option_/${ldo_enscalc_option}/g" \ + -e "s/_nx_res_/$((${npx_ens:-$npx}-1))/g" \ + -e "s/_ny_res_/$((${npy_ens:-$npy}-1))/g" \ + enkf.nml.tmp > ./enkf.nml + +ENKFEXEC=${ENKFEXEC:-$HOMEhafs/exec/hafs_enkf.x} +cp -p $ENKFEXEC ./enkf.x + +# In case there are memory issues to run enkf_mean/enkf_recenter for all +# variables, can consider separating the enkf control variables into three +# parts +#if [ $ldo_enscalc_option -ne 0 ]; then # enkf_mean or enkf_recenter +# let i=1 +# #for infile in $(/bin/ls ${anavinfo}_p*) +# for infile in $(/bin/ls ${anavinfo}) +# do +# #${NCP} $infile anavinfo +# sed -e "s/_LEV_/${npz:-64}/g" \ +# -e "s/_LP1_/${LEVS:-65}/g" \ +# ${infile} > ./anavinfo +# ${APRUNC} ./enkf.x < enkf.nml > stdout_p${i} 2>&1 +# let i=i+1 +# done +#else +# ${APRUNC} ./enkf.x < enkf.nml > stdout 2>&1 +#fi + +${APRUNC} ./enkf.x < enkf.nml > stdout 2>&1 + +if [ $ldo_enscalc_option -eq 0 ]; then # enkf_update + rm -f cmdfile + for memstr in $(seq -f "mem%03g" 1 $nens) + do + mkdir -p ${RESTARTens_anl}/${memstr} + echo "${NCP} fv3sar_tile1_${memstr}_dynvartracer ${RESTARTens_anl}/${memstr}/anl_dynvartracer_${PDY}.${cyc}0000.fv_core.res.tile1.nc" >> cmdfile + done + chmod +x cmdfile + ${APRUNC} ${MPISERIAL} -m cmdfile +elif [ $ldo_enscalc_option -eq 1 ]; then # enkf_mean + memstr="ensmean" + mkdir -p ${RESTARTens_anl}/${memstr} + ${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.fv_core.res.tile1.nc ${RESTARTens_anl}/${memstr}/ + ncks -A -v $dynvar_list fv3sar_tile1_mem001_dynvartracer ${RESTARTens_anl}/${memstr}/${PDY}.${cyc}0000.fv_core.res.tile1.nc + ${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ${RESTARTens_anl}/${memstr}/ + ncks -A -v $tracer_list fv3sar_tile1_mem001_dynvartracer ${RESTARTens_anl}/${memstr}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + ncks --no-abc -O -x -v yaxis_2 ${RESTARTens_anl}/${memstr}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ${RESTARTens_anl}/${memstr}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + ${NCP} fv3sar_tile1_mem001_dynvartracer ${RESTARTens_anl}/${memstr}/${PDY}.${cyc}0000.fv_dynvartracer # used by recenter + ${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.coupler.res ${RESTARTens_anl}/${memstr}/ + ${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.fv_core.res.nc ${RESTARTens_anl}/${memstr}/ + ${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ${RESTARTens_anl}/${memstr}/ + #${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.phy_data.nc ${RESTARTens_anl}/${memstr}/ + ${NCP} ${RESTARTens_inp}/mem001/${PDY}.${cyc}0000.sfc_data.nc ${RESTARTens_anl}/${memstr}/ + ${NCP} ${RESTARTens_inp}/mem001/grid_spec.nc ${RESTARTens_anl}/${memstr}/ + ${NCP} ${RESTARTens_inp}/mem001/oro_data.nc ${RESTARTens_anl}/${memstr}/ + ${NCP} ${RESTARTens_inp}/mem001/atmos_static.nc ${RESTARTens_anl}/${memstr}/ +elif [ $ldo_enscalc_option -eq 2 ]; then # enkf_recenter + mkdir -p ${RESTARTens_anl}/anlmean + cp ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.fv_core.res.tile1.nc ${RESTARTens_anl}/anlmean/${PDY}.${cyc}0000.fv_core.res.tile1.nc + ncks -A -v $dynvar_list fv3sar_tile1_mem001_dynvartracer ${RESTARTens_anl}/anlmean/${PDY}.${cyc}0000.fv_core.res.tile1.nc + cp ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ${RESTARTens_anl}/anlmean/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + ncks -A -v $tracer_list fv3sar_tile1_mem001_dynvartracer ${RESTARTens_anl}/anlmean/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + ncks --no_abc -O -x -v yaxis_2 ${RESTARTens_anl}/anlmean/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ${RESTARTens_anl}/anlmean/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + #cp ${COMhafs}/RESTART_analysis/{*grid_spec.nc,*sfc_data.nc,*coupler.res,gfs_ctrl.nc,fv_core.res.nc,*bndy*} ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.coupler.res ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.fv_core.res.nc ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/${PDY}.${cyc}0000.sfc_data.nc ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/grid_spec.nc ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/oro_data.nc ${RESTARTens_anl}/anlmean/ + ${NCP} ${RESTARTens_anl}/ensmean/atmos_static.nc ${RESTARTens_anl}/anlmean/ + + rm -f cmdfile_post_dynvartracer_ens + for imem in $(seq 2 $nens) + do + memstr="mem"$(printf %03i $imem) + memout="mem"$(printf %03i $(($imem-1))) + mkdir -p ${RESTARTens_anl}/${memout} + cat > ./post_dynvartracer_ens${memout}.sh << EOFpost +#!/bin/sh +set -x + cp ${RESTARTens_inp}/${memout}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ${RESTARTens_anl}/${memout}/${PDY}.${cyc}0000.fv_core.res.tile1.nc + ncks -A -v $dynvar_list fv3sar_tile1_${memstr}_dynvartracer ${RESTARTens_anl}/${memout}/${PDY}.${cyc}0000.fv_core.res.tile1.nc + cp ${RESTARTens_inp}/${memout}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ${RESTARTens_anl}/${memout}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + ncks -A -v $tracer_list fv3sar_tile1_${memstr}_dynvartracer ${RESTARTens_anl}/${memout}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + ncks --no_abc -O -x -v yaxis_2 ${RESTARTens_anl}/${memout}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ${RESTARTens_anl}/${memout}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + #cp ${COMhafs}/RESTART_analysis/{*grid_spec.nc,*sfc_data.nc,*coupler.res,gfs_ctrl.nc,fv_core.res.nc,*bndy*} ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/${PDY}.${cyc}0000.coupler.res ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/${PDY}.${cyc}0000.fv_core.res.nc ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/${PDY}.${cyc}0000.sfc_data.nc ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/grid_spec.nc ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/oro_data.nc ${RESTARTens_anl}/${memout}/ + ${NCP} ${RESTARTens_inp}/${memout}/atmos_static.nc ${RESTARTens_anl}/${memout}/ +EOFpost + chmod +x ./post_dynvartracer_ens${memout}.sh + echo "./post_dynvartracer_ens${memout}.sh" >> cmdfile_post_dynvartracer_ens + done + chmod +x cmdfile_post_dynvartracer_ens + ${APRUNC} ${MPISERIAL} -m cmdfile_post_dynvartracer_ens +else + echo "Wrong ldo_enscalc_option: $ldo_enscalc_option" +fi + +exit diff --git a/scripts/exhafs_enkf_hx.sh b/scripts/exhafs_enkf_hx.sh new file mode 100755 index 000000000..2b7b3fd63 --- /dev/null +++ b/scripts/exhafs_enkf_hx.sh @@ -0,0 +1,693 @@ +#!/bin/sh +# exhafs_enkf_hx.sh: Run the GSI forward operator performs mapping from model +# space to observation space for the ensemble mean or ensemble members. + +set -xe + +export PARMgsi=${PARMgsi:-${PARMhafs}/analysis/gsi} +export FIXcrtm=${FIXcrtm:-${FIXhafs}/hwrf-crtm-2.2.6} +export COMgfs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} +export COMINhafs=${COMgfs:-/gpfs/dell1/nco/ops/com/gfs/para} +export DONST=${DONST:-"NO"} +export use_bufr_nr=${use_bufr_nr:-no} +export out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} + +if [ ${ENSDA} = YES ]; then + export NHRS=${NHRS_ENS:-126} + export NBDYHRS=${NBDYHRS_ENS:-3} + export NOUTHRS=${NOUTHRS_ENS:-3} + export CASE=${CASE_ENS:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype_ens:-regional} + export LEVS=${LEVS_ENS:-65} +else + export NHRS=${NHRS:-126} + export NBDYHRS=${NBDYHRS:-3} + export NOUTHRS=${NOUTHRS:-3} + export CASE=${CASE:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype:-regional} + export LEVS=${LEVS:-65} +fi + +export RUN_GSI_VR_ENS=${RUN_GSI_VR_ENS:-NO} +export GRID_RATIO_ENS=${GRID_RATIO_ENS:-1} + +TOTAL_TASKS=${TOTAL_TASKS:-2016} +NCTSK=${NCTSK:-12} +NCNODE=${NCNODE:-24} +OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} +APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} + +# Utilities +NDATE=${NDATE:-ndate} +export NCP=${NCP:-"/bin/cp"} +export NMV=${NMV:-"/bin/mv"} +export NLN=${NLN:-"/bin/ln -sf"} +export CHGRP_CMD=${CHGRP_CMD:-"chgrp ${group_name:-rstprod}"} +export ANALYSISEXEC=${ANALYSISEXEC:-${EXEChafs}/hafs_gsi.x} +export CATEXEC=${CATEXEC:-${EXEChafs}/hafs_ncdiag_cat.x} +export MPISERIAL=${MPISERIAL:-${EXEChafs}/hafs_mpiserial.x} +export COMPRESS=${COMPRESS:-gzip} +export UNCOMPRESS=${UNCOMPRESS:-gunzip} + +if [ $GFSVER = PROD2021 ]; then + export atmos="atmos/" + export USE_GFS_NEMSIO=.false. + export USE_GFS_NCIO=.true. + GSUFFIX=${GSUFFIX:-.nc} +elif [ $GFSVER = PROD2019 ]; then + export atmos="" + export USE_GFS_NEMSIO=.true. + export USE_GFS_NCIO=.false. + GSUFFIX=${GSUFFIX:-.nemsio} +else + export atmos="" + export USE_GFS_NEMSIO=.true. + export USE_GFS_NCIO=.false. + GSUFFIX=${GSUFFIX:-.nemsio} +fi + +# Diagnostic files options +export netcdf_diag=${netcdf_diag:-".true."} +export binary_diag=${binary_diag:-".false."} + +yr=`echo $CDATE | cut -c1-4` +mn=`echo $CDATE | cut -c5-6` +dy=`echo $CDATE | cut -c7-8` + +CDATEprior=`${NDATE} -6 $CDATE` +yrprior=`echo ${CDATEprior} | cut -c1-4` +mnprior=`echo ${CDATEprior} | cut -c5-6` +dyprior=`echo ${CDATEprior} | cut -c7-8` +hhprior=`echo ${CDATEprior} | cut -c9-10` +cycprior=`echo ${CDATEprior} | cut -c9-10` +PDYprior=`echo ${CDATEprior} | cut -c1-8` + +if [ ${RUN_FGAT} = YES ]; then + CDATEtm03=`${NDATE} -3 $CDATE` + PDYtm03=`echo ${CDATEtm03} | cut -c1-8` + cyctm03=`echo ${CDATEtm03} | cut -c9-10` + CDATEtm02=`${NDATE} -2 $CDATE` + PDYtm02=`echo ${CDATEtm02} | cut -c1-8` + cyctm02=`echo ${CDATEtm02} | cut -c9-10` + CDATEtm01=`${NDATE} -1 $CDATE` + PDYtm01=`echo ${CDATEtm01} | cut -c1-8` + cyctm01=`echo ${CDATEtm01} | cut -c9-10` + CDATEtp03=`${NDATE} +3 $CDATE` + PDYtp03=`echo ${CDATEtp03} | cut -c1-8` + cyctp03=`echo ${CDATEtp03} | cut -c9-10` + CDATEtp02=`${NDATE} +2 $CDATE` + PDYtp02=`echo ${CDATEtp02} | cut -c1-8` + cyctp02=`echo ${CDATEtp02} | cut -c9-10` + CDATEtp01=`${NDATE} +1 $CDATE` + PDYtp01=`echo ${CDATEtp01} | cut -c1-8` + cyctp01=`echo ${CDATEtp01} | cut -c9-10` +fi + +export COMhafsprior=${COMhafsprior:-${COMhafs}/../../${CDATEprior}/${STORMID}} +export WORKhafsprior=${WORKhafsprior:-${WORKhafs}/../../${CDATEprior}/${STORMID}} + +export HX_ONLY=${HY_ONLY:-YES} +export HX_ENS=${HX_ENS:-NO} + +if [ ${HX_ONLY} = "YES" ]; then + +# Deal with ensemble mean +if [ ${HX_ENS} != "YES" ]; then + export USE_SELECT=NO + export RUN_SELECT=YES + export MEMSTR=${MEMSTR:-"ensmean"} + export LREAD_OBS_SAVE=".true." + export LREAD_OBS_SKIP=".false." +# Deal with ensemble member +else + export USE_SELECT=YES + export RUN_SELECT=NO + export MEMSTR=${MEMSTR:-"mem${ENSID}"} + export LREAD_OBS_SAVE=".false." + export LREAD_OBS_SKIP=".true." +fi + +export MITER=0 +export NITER=1 +export LWRITE_PREDTERMS=".true." +export LWRITE_PEAKWT=".true." +export REDUCE_DIAG=".true." + +if [ ${RUN_GSI_VR_ENS} = YES ]; then + if [ ${HX_ENS} != YES ]; then + #export RESTARTens_inp=${COMhafs}/RESTART_analysis_ens/${MEMSTR} + export RESTARTens_inp=${WORKhafs}/intercom/RESTART_analysis_ens/${MEMSTR} + else + #export RESTARTens_inp=${COMhafs}/RESTART_analysis_vr_ens/${MEMSTR} + export RESTARTens_inp=${WORKhafs}/intercom/RESTART_analysis_vr_ens/${MEMSTR} + fi +else + if [ ${HX_ENS} != YES ]; then + #export RESTARTens_inp=${COMhafs}/RESTART_analysis_ens/${MEMSTR} + export RESTARTens_inp=${WORKhafs}/intercom/RESTART_analysis_ens/${MEMSTR} + else + export RESTARTens_inp=${COMhafsprior}/RESTART_ens/${MEMSTR} + fi +fi + +#export RESTARTens_anl=${COMhafs}/RESTART_analysis_ens/${MEMSTR} +export RESTARTens_anl=${WORKhafs}/intercom/RESTART_analysis_ens/${MEMSTR} + +RESTARTinp=${RESTARTinp:-${RESTARTens_inp}} +RESTARTanl=${RESTARTanl:-${RESTARTens_anl}} +mkdir -p ${RESTARTanl} + +## ObsInput file from ensemble mean +export SELECT_OBS=${SELECT_OBS:-${RESTARTanl}/../ensmean/obsinput.tar} + +# Stat files +DIAG_SUFFIX="_${MEMSTR}" + +fi # HX_ONLY + +# We should already be in $DATA, but extra cd to be sure. +cd $DATA + +# Copy first guess files +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.coupler.res ./coupler.res +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.nc ./fv3_akbk +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.sfc_data.nc ./fv3_sfcdata +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ./fv3_srfwnd +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ./fv3_dynvars +${NCP} ${RESTARTinp}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ./fv3_tracer + +${NCP} ${RESTARTinp}/oro_data.nc ./fv3_oro_data +${NCP} ${RESTARTinp}/atmos_static.nc ./fv3_atmos_static +${NCP} ${RESTARTinp}/grid_spec.nc ./fv3_grid_spec + +# Stat files +RADSTAT=${RADSTAT:-${RESTARTanl}/analysis.radstat} +GSISTAT=${GSISTAT:-${RESTARTanl}/analysis.gsistat} +PCPSTAT=${PCPSTAT:-${RESTARTanl}/analysis.pcpstat} +CNVSTAT=${CNVSTAT:-${RESTARTanl}/analysis.cnvstat} +OZNSTAT=${OZNSTAT:-${RESTARTanl}/analysis.oznstat} +GSISOUT=${GSISOUT:-${RESTARTanl}/analysis.gsisout} + +# Obs diag +RUN_SELECT=${RUN_SELECT:-"NO"} +USE_SELECT=${USE_SELECT:-"NO"} +USE_RADSTAT=${USE_RADSTAT:-"NO"} +SELECT_OBS=${SELECT_OBS:-${COMhafs}/obsinput.tar} +GENDIAG=${GENDIAG:-"YES"} +DIAG_SUFFIX=${DIAG_SUFFIX:-""} +if [ $netcdf_diag = ".true." ] ; then + DIAG_SUFFIX="${DIAG_SUFFIX}.nc4" +fi +DIAG_COMPRESS=${DIAG_COMPRESS:-"YES"} +DIAG_TARBALL=${DIAG_TARBALL:-"YES"} +USE_MPISERIAL=${USE_MPISERIAL:-"YES"} +USE_CFP=${USE_CFP:-"NO"} +CFP_MP=${CFP_MP:-"NO"} +nm="" +if [ $CFP_MP = "YES" ]; then + nm=0 +fi + +export DIAG_DIR=${DIAG_DIR:-./analysis_diags} +REMOVE_DIAG_DIR=${REMOVE_DIAG_DIR:-"NO"} + +# Set script / GSI control parameters +lrun_subdirs=${lrun_subdirs:-".true."} + +#---------------------------------------------- +# Link all the necessary fix files +#---------------------------------------------- +${NLN} ${PARMgsi}/nam_glb_berror.f77.gcv ./berror_stats +#${NLN} ${PARMgsi}/nam_global_satangbias.txt ./satbias_angle +${NLN} ${PARMgsi}/hafs_satinfo.txt ./satinfo +#checkgfs $NLN $RADCLOUDINFO cloudy_radiance_info.txt +${NLN} ${PARMgsi}/atms_beamwidth.txt ./atms_beamwidth.txt +anavinfo=${PARMgsi}/hafs_anavinfo.tmp +sed -e "s/_LEV_/${npz:-64}/g" \ + -e "s/_LP1_/${LEVS:-65}/g" \ + ${anavinfo} > ./anavinfo +${NLN} ${PARMgsi}/hafs_convinfo.txt ./convinfo +#checkgfs $NLN $vqcdat vqctp001.dat +#checkgfs $NLN $INSITUINFO insituinfo +${NLN} ${PARMgsi}/global_ozinfo.txt ./ozinfo +${NLN} ${PARMgsi}/nam_global_pcpinfo.txt ./pcpinfo +#checkgfs $NLN $AEROINFO aeroinfo +${NLN} ${PARMgsi}/global_scaninfo.txt ./scaninfo +#checkgfs $NLN $HYBENSINFO hybens_info +${NLN} ${PARMgsi}/hafs_nam_errtable.r3dv ./errtable + +${NLN} ${PARMgsi}/prepobs_prep.bufrtable ./prepobs_prep.bufrtable +${NLN} ${PARMgsi}/bufrtab.012 ./bftab_sstphr + +# Link CRTM coefficient files based on entries in satinfo file +for file in `awk '{if($1!~"!"){print $1}}' ./satinfo | sort | uniq` ;do + ${NLN} ${FIXcrtm}/fix-4-hwrf/${file}.SpcCoeff.bin ./ + ${NLN} ${FIXcrtm}/fix-4-hwrf/${file}.TauCoeff.bin ./ +done + +${NLN} ${FIXcrtm}/EmisCoeff/IR_Water/Big_Endian/Nalli.IRwater.EmisCoeff.bin ./Nalli.IRwater.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/IR_Ice/SEcategory/Big_Endian/NPOESS.IRice.EmisCoeff.bin ./NPOESS.IRice.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/IR_Snow/SEcategory/Big_Endian/NPOESS.IRsnow.EmisCoeff.bin ./NPOESS.IRsnow.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/IR_Land/SEcategory/Big_Endian/NPOESS.IRland.EmisCoeff.bin ./NPOESS.IRland.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Ice/SEcategory/Big_Endian/NPOESS.VISice.EmisCoeff.bin ./NPOESS.VISice.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Land/SEcategory/Big_Endian/NPOESS.VISland.EmisCoeff.bin ./NPOESS.VISland.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Snow/SEcategory/Big_Endian/NPOESS.VISsnow.EmisCoeff.bin ./NPOESS.VISsnow.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/VIS_Water/SEcategory/Big_Endian/NPOESS.VISwater.EmisCoeff.bin ./NPOESS.VISwater.EmisCoeff.bin +${NLN} ${FIXcrtm}/EmisCoeff/MW_Water/Big_Endian/FASTEM6.MWwater.EmisCoeff.bin ./FASTEM6.MWwater.EmisCoeff.bin +${NLN} ${FIXcrtm}/AerosolCoeff/Big_Endian/AerosolCoeff.bin ./AerosolCoeff.bin +${NLN} ${FIXcrtm}/CloudCoeff/Big_Endian/CloudCoeff.bin ./CloudCoeff.bin + +# If requested, link (and if tarred, de-tar obsinput.tar) into obs_input.* files +if [ ${USE_SELECT:-NO} = "YES" ]; then + rm -f obs_input.* + nl=$(file $SELECT_OBS | cut -d: -f2 | grep tar | wc -l) + if [ $nl -eq 1 ]; then + rm -f obsinput.tar + $NLN $SELECT_OBS obsinput.tar + tar -xvf obsinput.tar + rm -f obsinput.tar + else + for filetop in $(ls $SELECT_OBS/obs_input.*); do + fileloc=$(basename $filetop) + $NLN $filetop $fileloc + done + fi +fi + +if [ ${USE_SELECT:-NO} != "YES" ]; then #regular run + +# Link GFS/GDAS input and observation files +COMIN_OBS=${COMIN_OBS:-${COMgfs}/gfs.$PDY/$cyc/${atmos}} +OPREFIX=${OPREFIX:-"gfs.t${cyc}z."} +OSUFFIX=${OSUFFIX:-""} +PREPQC=${PREPQC:-${COMIN_OBS}/${OPREFIX}prepbufr${OSUFFIX}} +PREPQCPF=${PREPQCPF:-${COMIN_OBS}/${OPREFIX}prepbufr.acft_profiles${OSUFFIX}} +NSSTBF=${NSSTBF:-${COMIN_OBS}/${OPREFIX}nsstbufr${OSUFFIX}} +SATWND=${SATWND:-${COMIN_OBS}/${OPREFIX}satwnd.tm00.bufr_d${OSUFFIX}} +OSCATBF=${OSCATBF:-${COMIN_OBS}/${OPREFIX}oscatw.tm00.bufr_d${OSUFFIX}} +RAPIDSCATBF=${RAPIDSCATBF:-${COMIN_OBS}/${OPREFIX}rapidscatw.tm00.bufr_d${OSUFFIX}} +GSNDBF=${GSNDBF:-${COMIN_OBS}/${OPREFIX}goesnd.tm00.bufr_d${OSUFFIX}} +GSNDBF1=${GSNDBF1:-${COMIN_OBS}/${OPREFIX}goesfv.tm00.bufr_d${OSUFFIX}} +B1HRS2=${B1HRS2:-${COMIN_OBS}/${OPREFIX}1bhrs2.tm00.bufr_d${OSUFFIX}} +B1MSU=${B1MSU:-${COMIN_OBS}/${OPREFIX}1bmsu.tm00.bufr_d${OSUFFIX}} +B1HRS3=${B1HRS3:-${COMIN_OBS}/${OPREFIX}1bhrs3.tm00.bufr_d${OSUFFIX}} +B1HRS4=${B1HRS4:-${COMIN_OBS}/${OPREFIX}1bhrs4.tm00.bufr_d${OSUFFIX}} +B1AMUA=${B1AMUA:-${COMIN_OBS}/${OPREFIX}1bamua.tm00.bufr_d${OSUFFIX}} +B1AMUB=${B1AMUB:-${COMIN_OBS}/${OPREFIX}1bamub.tm00.bufr_d${OSUFFIX}} +B1MHS=${B1MHS:-${COMIN_OBS}/${OPREFIX}1bmhs.tm00.bufr_d${OSUFFIX}} +ESHRS3=${ESHRS3:-${COMIN_OBS}/${OPREFIX}eshrs3.tm00.bufr_d${OSUFFIX}} +ESAMUA=${ESAMUA:-${COMIN_OBS}/${OPREFIX}esamua.tm00.bufr_d${OSUFFIX}} +ESAMUB=${ESAMUB:-${COMIN_OBS}/${OPREFIX}esamub.tm00.bufr_d${OSUFFIX}} +ESMHS=${ESMHS:-${COMIN_OBS}/${OPREFIX}esmhs.tm00.bufr_d${OSUFFIX}} +HRS3DB=${HRS3DB:-${COMIN_OBS}/${OPREFIX}hrs3db.tm00.bufr_d${OSUFFIX}} +AMUADB=${AMUADB:-${COMIN_OBS}/${OPREFIX}amuadb.tm00.bufr_d${OSUFFIX}} +AMUBDB=${AMUBDB:-${COMIN_OBS}/${OPREFIX}amubdb.tm00.bufr_d${OSUFFIX}} +MHSDB=${MHSDB:-${COMIN_OBS}/${OPREFIX}mhsdb.tm00.bufr_d${OSUFFIX}} +AIRSBF=${AIRSBF:-${COMIN_OBS}/${OPREFIX}airsev.tm00.bufr_d${OSUFFIX}} +IASIBF=${IASIBF:-${COMIN_OBS}/${OPREFIX}mtiasi.tm00.bufr_d${OSUFFIX}} +ESIASI=${ESIASI:-${COMIN_OBS}/${OPREFIX}esiasi.tm00.bufr_d${OSUFFIX}} +IASIDB=${IASIDB:-${COMIN_OBS}/${OPREFIX}iasidb.tm00.bufr_d${OSUFFIX}} +AMSREBF=${AMSREBF:-${COMIN_OBS}/${OPREFIX}amsre.tm00.bufr_d${OSUFFIX}} +AMSR2BF=${AMSR2BF:-${COMIN_OBS}/${OPREFIX}amsr2.tm00.bufr_d${OSUFFIX}} +GMI1CRBF=${GMI1CRBF:-${COMIN_OBS}/${OPREFIX}gmi1cr.tm00.bufr_d${OSUFFIX}} +SAPHIRBF=${SAPHIRBF:-${COMIN_OBS}/${OPREFIX}saphir.tm00.bufr_d${OSUFFIX}} +SEVIRIBF=${SEVIRIBF:-${COMIN_OBS}/${OPREFIX}sevcsr.tm00.bufr_d${OSUFFIX}} +AHIBF=${AHIBF:-${COMIN_OBS}/${OPREFIX}ahicsr.tm00.bufr_d${OSUFFIX}} +ABIBF=${ABIBF:-${COMIN_OBS}/${OPREFIX}gsrcsr.tm00.bufr_d${OSUFFIX}} +CRISBF=${CRISBF:-${COMIN_OBS}/${OPREFIX}cris.tm00.bufr_d${OSUFFIX}} +ESCRIS=${ESCRIS:-${COMIN_OBS}/${OPREFIX}escris.tm00.bufr_d${OSUFFIX}} +CRISDB=${CRISDB:-${COMIN_OBS}/${OPREFIX}crisdb.tm00.bufr_d${OSUFFIX}} +CRISFSBF=${CRISFSBF:-${COMIN_OBS}/${OPREFIX}crisf4.tm00.bufr_d${OSUFFIX}} +ESCRISFS=${ESCRISFS:-${COMIN_OBS}/${OPREFIX}escrsf.tm00.bufr_d${OSUFFIX}} +CRISFSDB=${CRISFSDB:-${COMIN_OBS}/${OPREFIX}crsfdb.tm00.bufr_d${OSUFFIX}} +ATMSBF=${ATMSBF:-${COMIN_OBS}/${OPREFIX}atms.tm00.bufr_d${OSUFFIX}} +ESATMS=${ESATMS:-${COMIN_OBS}/${OPREFIX}esatms.tm00.bufr_d${OSUFFIX}} +ATMSDB=${ATMSDB:-${COMIN_OBS}/${OPREFIX}atmsdb.tm00.bufr_d${OSUFFIX}} +SSMITBF=${SSMITBF:-${COMIN_OBS}/${OPREFIX}ssmit.tm00.bufr_d${OSUFFIX}} +SSMISBF=${SSMISBF:-${COMIN_OBS}/${OPREFIX}ssmisu.tm00.bufr_d${OSUFFIX}} +SBUVBF=${SBUVBF:-${COMIN_OBS}/${OPREFIX}osbuv8.tm00.bufr_d${OSUFFIX}} +OMPSNPBF=${OMPSNPBF:-${COMIN_OBS}/${OPREFIX}ompsn8.tm00.bufr_d${OSUFFIX}} +OMPSTCBF=${OMPSTCBF:-${COMIN_OBS}/${OPREFIX}ompst8.tm00.bufr_d${OSUFFIX}} +GOMEBF=${GOMEBF:-${COMIN_OBS}/${OPREFIX}gome.tm00.bufr_d${OSUFFIX}} +OMIBF=${OMIBF:-${COMIN_OBS}/${OPREFIX}omi.tm00.bufr_d${OSUFFIX}} +MLSBF=${MLSBF:-${COMIN_OBS}/${OPREFIX}mls.tm00.bufr_d${OSUFFIX}} +OMPSLPBF=${OMPSLPBF:-${COMIN_OBS}/${OPREFIX}ompslp.tm00.bufr_d${OSUFFIX}} +SMIPCP=${SMIPCP:-${COMIN_OBS}/${OPREFIX}spssmi.tm00.bufr_d${OSUFFIX}} +TMIPCP=${TMIPCP:-${COMIN_OBS}/${OPREFIX}sptrmm.tm00.bufr_d${OSUFFIX}} +GPSROBF=${GPSROBF:-${COMIN_OBS}/${OPREFIX}gpsro.tm00.bufr_d${OSUFFIX}} +TCVITL=${TCVITL:-${COMIN_OBS}/${OPREFIX}syndata.tcvitals.tm00} +B1AVHAM=${B1AVHAM:-${COMIN_OBS}/${OPREFIX}avcsam.tm00.bufr_d${OSUFFIX}} +B1AVHPM=${B1AVHPM:-${COMIN_OBS}/${OPREFIX}avcspm.tm00.bufr_d${OSUFFIX}} +##HDOB=${HDOB:-${COMIN_OBS}/${OPREFIX}hdob.tm00.bufr_d${OSUFFIX}} + +# Observational data +$NLN $PREPQC prepbufr +##$NLN $PREPQCPF prepbufr_profl +$NLN $SATWND satwndbufr +##$NLN $OSCATBF oscatbufr +##$NLN $RAPIDSCATBF rapidscatbufr +##$NLN $GSNDBF gsndrbufr +$NLN $GSNDBF1 gsnd1bufr +##$NLN $B1HRS2 hirs2bufr +##$NLN $B1MSU msubufr +$NLN $B1HRS3 hirs3bufr +$NLN $B1HRS4 hirs4bufr +$NLN $B1AMUA amsuabufr +##$NLN $B1AMUB amsubbufr +$NLN $B1MHS mhsbufr +$NLN $ESHRS3 hirs3bufrears +$NLN $ESAMUA amsuabufrears +##$NLN $ESAMUB amsubbufrears +#$NLN $ESMHS mhsbufrears +$NLN $HRS3DB hirs3bufr_db +##$NLN $AMUADB amsuabufr_db +##$NLN $AMUBDB amsubbufr_db +#$NLN $MHSDB mhsbufr_db +$NLN $SBUVBF sbuvbufr +$NLN $OMPSNPBF ompsnpbufr +$NLN $OMPSTCBF ompstcbufr +$NLN $GOMEBF gomebufr +$NLN $OMIBF omibufr +$NLN $MLSBF mlsbufr +##$NLN $SMIPCP ssmirrbufr +##$NLN $TMIPCP tmirrbufr +$NLN $AIRSBF airsbufr +$NLN $IASIBF iasibufr +$NLN $ESIASI iasibufrears +$NLN $IASIDB iasibufr_db +##$NLN $AMSREBF amsrebufr +$NLN $AMSR2BF amsr2bufr +$NLN $GMI1CRBF gmibufr +$NLN $SAPHIRBF saphirbufr +$NLN $SEVIRIBF seviribufr +$NLN $CRISBF crisbufr +$NLN $ESCRIS crisbufrears +$NLN $CRISDB crisbufr_db +$NLN $CRISFSBF crisfsbufr +$NLN $ESCRISFS crisfsbufrears +$NLN $CRISFSDB crisfsbufr_db +$NLN $ATMSBF atmsbufr +$NLN $ESATMS atmsbufrears +$NLN $ATMSDB atmsbufr_db +##$NLN $SSMITBF ssmitbufr +$NLN $SSMISBF ssmisbufr +$NLN $GPSROBF gpsrobufr +$NLN $TCVITL tcvitl +$NLN $B1AVHAM avhambufr +$NLN $B1AVHPM avhpmbufr +##$NLN $AHIBF ahibufr +##$NLN $ABIBF abibufr +##$NLN $HDOB hdobbufr + +##[[ $DONST = "YES" ]] && $NLN $NSSTBF nsstbufr + +if [[ ${use_bufr_nr:-no} = "yes" ]]; then + $NLN ${PREPQC}.nr prepbufr + $NLN ${SAPHIRBF}.nr saphirbufr +##[[ $DONST = "YES" ]] && $NLN /dev/null nsstbufr +fi + +# HAFS specific observations +COMINhafs_obs=${COMINhafs_obs:-${COMINhafs}/hafs.$PDY/$cyc/${atmos}} +${NLN} ${COMINhafs_obs}/hafs.t${cyc}z.hdob.tm00.bufr_d hdobbufr +${NLN} ${COMINhafs_obs}/hafs.t${cyc}z.nexrad.tm00.bufr_d l2rwbufr +${NLN} ${COMINhafs_obs}/hafs.t${cyc}z.tldplr.tm00.bufr_d tldplrbufr + +fi #USE_SELECT + +# +${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias satbias_in +${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias_pc satbias_pc +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.abias_air satbias_air + +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.atmf003.nemsio gfs_sigf03 +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.atmf006.nemsio gfs_sigf06 +#${NLN} ${COMgfs}/gdas.$PDYprior/${hhprior}/${atmos}gdas.t${hhprior}z.atmf009.nemsio gfs_sigf09 + +# Diagnostic files +# if requested, link GSI diagnostic file directories for use later +if [ ${GENDIAG:-YES} = "YES" ] ; then + if [ ${lrun_subdirs:-.true.} = ".true." ] ; then + if [ -d $DIAG_DIR ]; then + rm -rf $DIAG_DIR + fi + npe_m1="$(($TOTAL_TASKS-1))" + for pe in $(seq 0 1 $npe_m1); do + pedir="dir."$(printf %04i $pe) + mkdir -p $DIAG_DIR/$pedir + $NLN $DIAG_DIR/$pedir $pedir + done + else + echo "FATAL ERROR: lrun_subdirs must be true. lrun_subdirs=$lrun_subdirs" + exit 2 + fi +fi + +#---------------------------------------------- +# Prepare gsiparm.anl +#---------------------------------------------- +${NCP} ${PARMgsi}/gsiparm.anl.tmp ./ + +sed -e "s/_MITER_/${MITER:-2}/g" \ + -e "s/_NITER_/${NITER:-50}/g" \ + -e "s/_USE_GFS_NEMSIO_/${USE_GFS_NEMSIO:-.true.}/g" \ + -e "s/_USE_GFS_NCIO_/${USE_GFS_NCIO:-.false.}/g" \ + -e "s/_NETCDF_DIAG_/${netcdf_diag:-.true.}/g" \ + -e "s/_BINARY_DIAG_/${binary_diag:-.false.}/g" \ + -e "s/_LREAD_OBS_SAVE_/${LREAD_OBS_SAVE:-.false.}/g" \ + -e "s/_LREAD_OBS_SKIP_/${LREAD_OBS_SKIP:-.false.}/g" \ + -e "s/_ENS_NSTARTHR_/${ENS_NSTARTHR:-6}/g" \ + -e "s/_LWRITE_PREDTERMS_/${LWRITE_PREDTERMS:-.false.}/g" \ + -e "s/_LWRITE_PEAKWT_/${LWRITE_PEAKWT:-.false.}/g" \ + -e "s/_REDUCE_DIAG_/${REDUCE_DIAG:-.false.}/g" \ + -e "s/_L_HYB_ENS_/${L_HYB_ENS:-.false.}/g" \ + -e "s/_N_ENS_/${N_ENS:-80}/g" \ + -e "s/_BETA_S0_/${BETA_S0:-0.2}/g" \ + -e "s/_GRID_RATIO_ENS_/${GRID_RATIO_ENS:-1}/g" \ + -e "s/_REGIONAL_ENSEMBLE_OPTION_/${REGIONAL_ENSEMBLE_OPTION:-1}/g" \ + -e "s/_GRID_RATIO_FV3_REGIONAL_/${refine_ratio:-4}/g" \ + gsiparm.anl.tmp > gsiparm.anl + +#------------------------------------------------------------------- +# Link the executable and run the analysis +#------------------------------------------------------------------- +ANALYSISEXEC=${ANALYSISEXEC:-${EXEChafs}/hafs_gsi.x} +${NCP} -p ${ANALYSISEXEC} ./hafs_gsi.x + +${APRUNC} ./hafs_gsi.x 1> stdout 2>&1 +cat stdout + +${NCP} -p ./stdout ${GSISOUT} + +# Cat runtime output files. +cat fort.2* > ${GSISTAT} + +# If requested, create obsinput tarball from obs_input.* files +if [ ${RUN_SELECT:-NO} = "YES" ]; then + echo $(date) START tar obs_input + rm -f ./obsinput.tar + ${NLN} $SELECT_OBS ./obsinput.tar + tar -cvf obsinput.tar obs_input.* + echo $(date) END tar obs_input +fi + +if [ ${HX_ONLY:-NO} != "YES" ]; then + +${NCP} ./fv3_oro_data ${RESTARTanl}/oro_data.nc +${NCP} ./fv3_atmos_static ${RESTARTanl}/atmos_static.nc +${NCP} ./fv3_grid_spec ${RESTARTanl}/grid_spec.nc + +${NCP} ./coupler.res ${RESTARTanl}/${PDY}.${cyc}0000.coupler.res +${NCP} ./fv3_akbk ${RESTARTanl}/${PDY}.${cyc}0000.fv_core.res.nc +${NCP} ./fv3_sfcdata ${RESTARTanl}/${PDY}.${cyc}0000.sfc_data.nc +${NCP} ./fv3_srfwnd ${RESTARTanl}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc +${NCP} ./fv3_dynvars ${RESTARTanl}/${PDY}.${cyc}0000.fv_core.res.tile1.nc +${NCP} ./fv3_tracer ${RESTARTanl}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc + +fi + +# If requested, generate diagnostic files +if [ $GENDIAG = "YES" ] ; then + + # Set up lists and variables for various types of diagnostic files. + ntype=3 + + diagtype[0]="conv conv_gps conv_ps conv_pw conv_q conv_sst conv_t conv_tcp conv_uv conv_spd" + diagtype[1]="pcp_ssmi_dmsp pcp_tmi_trmm" + diagtype[2]="sbuv2_n16 sbuv2_n17 sbuv2_n18 sbuv2_n19 gome_metop-a gome_metop-b omi_aura mls30_aura ompsnp_npp ompstc8_npp gome_metop-c" + diagtype[3]="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 imgr_g14 imgr_g15 ssmi_f13 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_f16 ssmis_f17 ssmis_f18 ssmis_f19 ssmis_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19 seviri_m08 seviri_m09 seviri_m10 seviri_m11 cris_npp cris-fsr_npp cris-fsr_n20 atms_npp atms_n20 hirs4_metop-b amsua_metop-b mhs_metop-b iasi_metop-b avhrr_metop-b avhrr_n18 avhrr_n19 avhrr_metop-a amsr2_gcom-w1 gmi_gpm saphir_meghat ahi_himawari8 abi_g16 abi_g17 amsua_metop-c mhs_metop-c iasi_metop-c avhrr_metop-c" + + diaglist[0]=listcnv + diaglist[1]=listpcp + diaglist[2]=listozn + diaglist[3]=listrad + + diagfile[0]=$CNVSTAT + diagfile[1]=$PCPSTAT + diagfile[2]=$OZNSTAT + diagfile[3]=$RADSTAT + + numfile[0]=0 + numfile[1]=0 + numfile[2]=0 + numfile[3]=0 + + # Set diagnostic file prefix based on lrun_subdirs variable + if [ $lrun_subdirs = ".true." ]; then + prefix=" dir.*/" + else + prefix="pe*" + fi + + if [ $USE_CFP = "YES" -o $USE_MPISERIAL = "YES" ]; then + [[ -f ./diag.sh ]] && rm ./diag.sh + [[ -f ./mp_diag.sh ]] && rm ./mp_diag.sh + cat > ./diag.sh << EOFdiag +#!/bin/sh +lrun_subdirs=\$1 +binary_diag=\$2 +type=\$3 +loop=\$4 +string=\$5 +CDATE=\$6 +DIAG_COMPRESS=\$7 +DIAG_SUFFIX=\$8 +if [ \$lrun_subdirs = ".true." ]; then + prefix=" dir.*/" +else + prefix="pe*" +fi +file=diag_\${type}_\${string}.\${CDATE}\${DIAG_SUFFIX} +if [ \$binary_diag = ".true." ]; then + cat \${prefix}\${type}_\${loop}* > \$file +else + $CATEXEC -o \$file \${prefix}\${type}_\${loop}* +fi +if [ \$DIAG_COMPRESS = "YES" ]; then + $COMPRESS \$file +fi +EOFdiag + chmod 755 ./diag.sh + fi + + # Collect diagnostic files as a function of loop and type. + # Loop over first and last outer loops to generate innovation + # diagnostic files for indicated observation types (groups) + # + # NOTE: Since we set miter=2 in GSI namelist SETUP, outer + # loop 03 will contain innovations with respect to + # the analysis. Creation of o-a innovation files + # is triggered by write_diag(3)=.true. The setting + # write_diag(1)=.true. turns on creation of o-g + # innovation files. + + loops="01 03" + for loop in $loops; do + case $loop in + 01) string=ges;; + 03) string=anl;; + *) string=$loop;; + esac + echo $(date) START loop $string >&2 + n=-1 + while [ $((n+=1)) -le $ntype ] ;do + for type in $(echo ${diagtype[n]}); do + count=$(ls ${prefix}${type}_${loop}* 2>/dev/null | wc -l) + if [ $count -gt 1 ]; then + if [ $USE_CFP = "YES" ]; then + echo "$nm ./diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a ./mp_diag.sh + if [ ${CFP_MP:-"NO"} = "YES" ]; then + nm=$((nm+1)) + fi + elif [ $USE_MPISERIAL = "YES" ]; then + echo "$nm ./diag.sh $lrun_subdirs $binary_diag $type $loop $string $CDATE $DIAG_COMPRESS $DIAG_SUFFIX" | tee -a ./mp_diag.sh + else + if [ $binary_diag = ".true." ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + else + $CATEXEC -o diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} ${prefix}${type}_${loop}* + fi + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) + elif [ $count -eq 1 ]; then + cat ${prefix}${type}_${loop}* > diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + if [ $DIAG_COMPRESS = "YES" ]; then + $COMPRESS diag_${type}_${string}.${CDATE}${DIAG_SUFFIX} + fi + echo "diag_${type}_${string}.${CDATE}*" >> ${diaglist[n]} + numfile[n]=$(expr ${numfile[n]} + 1) + fi + done + done + echo $(date) END loop $string >&2 + done + + # We should already be in $DATA, but extra cd to be sure. + cd $DATA + + # If requested, compress diagnostic files + if [ $DIAG_COMPRESS = "YES" -a $USE_CFP = "NO" -a $USE_MPISERIAL = "NO" ]; then + echo $(date) START $COMPRESS diagnostic files >&2 + for file in $(ls diag_*${CDATE}${DIAG_SUFFIX}); do + $COMPRESS $file + done + echo $(date) END $COMPRESS diagnostic files >&2 + fi + + if [ $USE_CFP = "YES" ] ; then + chmod 755 ./mp_diag.sh + ncmd=$(cat ./mp_diag.sh | wc -l) + if [ $ncmd -gt 0 ]; then + ncmd_max=$((ncmd < npe_node_max ? ncmd : npe_node_max)) + APRUNCFP_DIAG=$(eval echo $APRUNCFP) + $APRUNCFP_DIAG ./mp_diag.sh + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 3 + fi + fi + + if [ $USE_MPISERIAL = "YES" ] ; then + chmod 755 ./mp_diag.sh + ${APRUNC} ${MPISERIAL} -m ./mp_diag.sh + fi + + # If requested, create diagnostic file tarballs + if [ $DIAG_TARBALL = "YES" ]; then + echo $(date) START tar diagnostic files >&2 + n=-1 + while [ $((n+=1)) -le $ntype ] ;do + TAROPTS="-uvf" + if [ ! -s ${diagfile[n]} ]; then + TAROPTS="-cvf" + fi + if [ ${numfile[n]} -gt 0 ]; then + tar $TAROPTS ${diagfile[n]} $(cat ${diaglist[n]}) + export ERR=$? + export err=$ERR + $ERRSCRIPT || exit 4 + fi + done + + # Restrict CNVSTAT + #chmod 750 $CNVSTAT + #${CHGRP_CMD} $CNVSTAT + + # Restrict RADSTAT + #chmod 750 $RADSTAT + #${CHGRP_CMD} $RADSTAT + + echo $(date) END tar diagnostic files >&2 + fi +fi # End diagnostic file generation block - if [ $GENDIAG = "YES" ] + +# If no processing error, remove $DIAG_DIR +if [[ "$REMOVE_DIAG_DIR" = "YES" && "$err" = "0" ]]; then + rm -rf $DIAG_DIR +fi + +exit + diff --git a/scripts/exhafs_forecast.sh b/scripts/exhafs_forecast.sh index dca4e82eb..95d42e6eb 100755 --- a/scripts/exhafs_forecast.sh +++ b/scripts/exhafs_forecast.sh @@ -1,66 +1,218 @@ -#!/bin/ksh +#!/bin/sh set -xe -ulimit -s unlimited -ulimit -a - -export PARMhycom=${PARMhycom:-${PARMhafs}/hycom/regional} -export FIXhycom=${FIXhycom:-${FIXhafs}/fix_hycom} - -export gtype=${gtype:-regional} -export halo_blend=${halo_blend:-0} -export nstf_n1=${nstf_n1:-2} -export nstf_n2=${nstf_n2:-0} -export nstf_n3=${nstf_n3:-0} -export nstf_n4=${nstf_n4:-0} -export nstf_n5=${nstf_n5:-0} - -export dt_atmos=${dt_atmos:-90} -export restart_interval=${restart_interval:-6} -export quilting=${quilting:-.true.} -export write_groups=${write_groups:-3} -export write_tasks_per_group=${write_tasks_per_group:-72} - -export stretch_fac=${stretch_fac:-1.0001} -export target_lon=${target_lon:--62.0} -export target_lat=${target_lat:-22.0} -export refine_ratio=${refine_ratio:-4} - -export glob_layoutx=${glob_layoutx:-12} -export glob_layouty=${glob_layouty:-12} -export glob_npx=${glob_npx:-769} -export glob_npy=${glob_npy:-769} - -export layoutx=${layoutx:-40} -export layouty=${layouty:-30} -export npx=${npx:-2881} -export npy=${npy:-1921} -export npz=${npz:-64} - -export app_domain=${app_domain:-regional} -export output_grid=${output_grid:-rotated_latlon} -export output_grid_cen_lon=${output_grid_cen_lon:-${domlon}} -export output_grid_cen_lat=${output_grid_cen_lat:-${domlat}} -export output_grid_lon1=${output_grid_lon1:--35.0} -export output_grid_lat1=${output_grid_lat1:--30.0} -export output_grid_lon2=${output_grid_lon2:-35.0} -export output_grid_lat2=${output_grid_lat2:-30.0} -export output_grid_dlon=${output_grid_dlon:-0.025} -export output_grid_dlat=${output_grid_dlon:-0.025} - -export out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} - -export ccpp_suite_regional=${ccpp_suite_regional:-HAFS_v0_gfdlmp_nocp} -export ccpp_suite_glob=${ccpp_suite_glob:-HAFS_v0_gfdlmp} -export ccpp_suite_nest=${ccpp_suite_nest:-HAFS_v0_gfdlmp_nocp} - -export run_ocean=${run_ocean:-no} -export ocean_model=${ocean_model:-hycom} -export cpl_ocean=${cpl_ocean:-0} -export ocean_tasks=${ocean_tasks:-120} -export cplflx=${cplflx:-.false.} -export cpl_dt=${cpl_dt:-360} +NCP=${NCP:-'/bin/cp'} +NLN=${NLN:-'/bin/ln -sf'} +NDATE=${NDATE:-ndate} + +TOTAL_TASKS=${TOTAL_TASKS:-2016} +NCTSK=${NCTSK:-12} +NCNODE=${NCNODE:-24} +OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} +APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} + +CDATE=${CDATE:-${YMDH}} +cyc=${cyc:-00} +STORM=${STORM:-FAKE} +STORMID=${STORMID:-00L} + +CDATEprior=`${NDATE} -6 $CDATE` +COMhafsprior=${COMhafsprior:-${COMhafs}/../../${CDATEprior}/${STORMID}} +WORKhafsprior=${WORKhafsprior:-${WORKhafs}/../../${CDATEprior}/${STORMID}} + +PARMforecast=${PARMforecast:-${PARMhafs}/forecast/regional} +PARMhycom=${PARMhycom:-${PARMhafs}/hycom/regional} +FIXam=${FIXam:-${FIXhafs}/fix_am} +FIXhycom=${FIXhycom:-${FIXhafs}/fix_hycom} +FORECASTEXEC=${FORECASTEXEC:-${EXEChafs}/hafs_forecast.x} + +ENSDA=${ENSDA:-NO} + +# Set options specific to the deterministic/ensemble forecast +if [ "${ENSDA}" != YES ]; then + NHRS=${NHRS:-126} + NBDYHRS=${NBDYHRS:-3} + CASE=${CASE:-C768} + CRES=$(echo $CASE | cut -c 2-) + gtype=${gtype:-regional} + LEVS=${LEVS:-65} + stretch_fac=${stretch_fac:-1.0001} + target_lon=${target_lon:--62.0} + target_lat=${target_lat:-22.0} + refine_ratio=${refine_ratio:-4} + deflate_level=${deflate_level:--1} + ccpp_suite_regional=${ccpp_suite_regional:-HAFS_v0_gfdlmp} + ccpp_suite_glob=${ccpp_suite_glob:-HAFS_v0_gfdlmp} + ccpp_suite_nest=${ccpp_suite_nest:-HAFS_v0_gfdlmp} + dt_atmos=${dt_atmos:-90} + restart_interval=${restart_interval:-6} + quilting=${quilting:-.true.} + write_groups=${write_groups:-3} + write_tasks_per_group=${write_tasks_per_group:-72} + glob_k_split=${glob_k_split:-1} + glob_n_split=${glob_n_split:-7} + glob_layoutx=${glob_layoutx:-12} + glob_layouty=${glob_layouty:-12} + glob_npx=${glob_npx:-769} + glob_npy=${glob_npy:-769} + k_split=${k_split:-4} + n_split=${n_split:-5} + layoutx=${layoutx:-40} + layouty=${layouty:-30} + npx=${npx:-2881} + npy=${npy:-1921} + npz=${npz:-64} + output_grid_dlon=${output_grid_dlon:-0.025} + output_grid_dlat=${output_grid_dlon:-0.025} +else + NHRS=${NHRS_ENS:-6} + NBDYHRS=${NBDYHRS_ENS:-3} + CASE=${CASE_ENS:-C768} + CRES=$(echo $CASE | cut -c 2-) + gtype=${gtype_ens:-regional} + LEVS=${LEVS_ENS:-65} + stretch_fac=${stretch_fac_ens:-1.0001} + target_lon=${target_lon_ens:--62.0} + target_lat=${target_lat_ens:-22.0} + refine_ratio=${refine_ratio_ens:-4} + deflate_level=${deflate_level:-1} + ccpp_suite_regional=${ccpp_suite_regional_ens:-HAFS_v0_gfdlmp} + ccpp_suite_glob=${ccpp_suite_glob_ens:-HAFS_v0_gfdlmp} + ccpp_suite_nest=${ccpp_suite_nest_ens:-HAFS_v0_gfdlmp} + dt_atmos=${dt_atmos_ens:-90} + restart_interval=${restart_interval_ens:-6} + quilting=${quilting_ens:-.true.} + write_groups=${write_groups_ens:-3} + write_tasks_per_group=${write_tasks_per_group_ens:-72} + glob_k_split=${glob_k_split_ens:-1} + glob_n_split=${glob_n_split_ens:-7} + glob_layoutx=${glob_layoutx_ens:-12} + glob_layouty=${glob_layouty_ens:-12} + glob_npx=${glob_npx_ens:-769} + glob_npy=${glob_npy_ens:-769} + k_split=${k_split_ens:-4} + n_split=${n_split_ens:-5} + layoutx=${layoutx_ens:-40} + layouty=${layouty_ens:-30} + npx=${npx_ens:-2881} + npy=${npy_ens:-1921} + npz=${npz_ens:-64} + output_grid_dlon_ens=${output_grid_dlon_ens:-$(awk "BEGIN {print ${output_grid_dlon:-0.025}*${GRID_RATIO_ENS:-1}}")} + output_grid_dlat_ens=${output_grid_dlat_ens:-$(awk "BEGIN {print ${output_grid_dlat:-0.025}*${GRID_RATIO_ENS:-1}}")} + output_grid_dlon=${output_grid_dlon_ens} + output_grid_dlat=${output_grid_dlat_ens} +fi + +app_domain=${app_domain:-regional} +output_grid=${output_grid:-rotated_latlon} +output_grid_cen_lon=${output_grid_cen_lon:-${domlon}} +output_grid_cen_lat=${output_grid_cen_lat:-${domlat}} +output_grid_lon1=${output_grid_lon1:--35.0} +output_grid_lat1=${output_grid_lat1:--30.0} +output_grid_lon2=${output_grid_lon2:-35.0} +output_grid_lat2=${output_grid_lat2:-30.0} + +halo_blend=${halo_blend:-0} +nstf_n1=${nstf_n1:-2} +nstf_n2=${nstf_n2:-0} +nstf_n3=${nstf_n3:-0} +nstf_n4=${nstf_n4:-0} +nstf_n5=${nstf_n5:-0} + +# Set options for cold-start or warm-start +# Default is cold start from chgres_ic generated ic/bc +na_init=${na_init:-1} +external_ic=${external_ic:-.true.} +nggps_ic=${nggps_ic:-.true.} +mountain=${mountain:-.false.} +warm_start=${warm_start:-.false.} +warm_start_opt=${warm_start_opt:-0} +warmstart_from_restart=${warmstart_from_restart:-no} +RESTARTinp=${RESTARTinp:-"UNNEEDED"} + +if [ ${warm_start_opt} -eq 0 ]; then + warmstart_from_restart=no + RESTARTinp="UNNEEDED" +fi + +# Different warm_start_opt options for determinist/ensemble forecast +if [ ${ENSDA} != "YES" ]; then # for deterministic forecast + +if [ ${warm_start_opt} -eq 1 ] && [ -s ${COMhafs}/RESTART_init/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafs}/RESTART_init +fi +if [ ${warm_start_opt} -eq 2 ] && [ -s ${COMhafsprior}/RESTART/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafsprior}/RESTART +fi +if [ ${warm_start_opt} -eq 3 ] && [ -s ${COMhafs}/RESTART_vi/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafs}/RESTART_vi +fi +if [ ${RUN_GSI_VR} = YES ] && [ -s ${COMhafs}/RESTART_analysis_vr/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafs}/RESTART_analysis_vr + warm_start_opt=4 +fi +if [ ${RUN_GSI} = YES ] && [ -s ${COMhafs}/RESTART_analysis/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafs}/RESTART_analysis + warm_start_opt=5 +fi + +else # for ENSDA member forecast + +if [ ${warm_start_opt} -eq 1 ] && [ -s ${COMhafs}/RESTART_init_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafs}/RESTART_init_ens/mem${ENSID} +fi +if [ ${warm_start_opt} -eq 2 ] && [ -s ${COMhafsprior}/RESTART_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafsprior}/RESTART_ens/mem${ENSID} +fi +if [ ${warm_start_opt} -eq 3 ] && [ -s ${COMhafs}/RESTART_vi_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + RESTARTinp=${COMhafs}/RESTART_vi_ens/mem${ENSID} +fi +#if [ ${RUN_GSI_VR_ENS} = YES ] && [ -s ${COMhafs}/RESTART_analysis_vr_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then +if [ ${RUN_GSI_VR_ENS} = YES ] && [ -s ${WORKhafs}/intercom/RESTART_analysis_vr_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + #RESTARTinp=${COMhafs}/RESTART_analysis_vr_ens/mem${ENSID} + RESTARTinp=${WORKhafs}/intercom/RESTART_analysis_vr_ens/mem${ENSID} + warm_start_opt=4 +fi +#if [ ${RUN_ENKF} = YES ] && [ -s ${COMhafs}/RESTART_analysis_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then +if [ ${RUN_ENKF} = YES ] && [ -s ${WORKhafs}/intercom/RESTART_analysis_ens/mem${ENSID}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ]; then + warmstart_from_restart=yes + #RESTARTinp=${COMhafs}/RESTART_analysis_ens/mem${ENSID} + RESTARTinp=${WORKhafs}/intercom/RESTART_analysis_ens/mem${ENSID} + warm_start_opt=5 +fi + +fi # ${ENSDA} != "YES" + +# For warm start from restart files +if [ ${warmstart_from_restart} = yes ]; then + na_init=0 + external_ic=.false. + nggps_ic=.false. + mountain=.true. + warm_start=.true. +fi + +# Ocean coupling related settings +run_ocean=${run_ocean:-no} +ocean_model=${ocean_model:-hycom} +cpl_ocean=${cpl_ocean:-0} +ocean_tasks=${ocean_tasks:-120} +cplflx=${cplflx:-.false.} +cpl_dt=${cpl_dt:-360} +ocean_start_dtg=${ocean_start_dtg:-43340.00000} +#base_dtg=${CDATE:-2019082900} +#end_hour=${NHRS:-126} +merge_import=${merge_import:-.false.} if [ $gtype = regional ]; then if [ $quilting = .true. ]; then @@ -75,152 +227,137 @@ elif [ $gtype = nest ]; then ATM_tasks=$((6*$glob_layoutx*$glob_layouty+$layoutx*$layouty)) fi else - echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest, or regional" + echo "FATAL ERROR: Unsupported gtype of ${gtype}. Currently onnly support gtype of nest or regional." exit 9 fi -export ATM_petlist_bounds=$(printf "ATM_petlist_bounds: %04d %04d" 0 $(($ATM_tasks-1))) +ATM_petlist_bounds=$(printf "ATM_petlist_bounds: %04d %04d" 0 $(($ATM_tasks-1))) # run ocean model side by side (no coupling) if [ ${run_ocean} = yes ] && [ $cpl_ocean -eq 0 ]; then - export cplflx=.false. - export OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) - export MED_petlist_bounds="" - export runSeq_ALL="ATM\n OCN" + cplflx=.false. + OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) + MED_petlist_bounds="" + runSeq_ALL="ATM\n OCN" fi # direct coupling through the nearest point regridding method if [ ${run_ocean} = yes ] && [ $cpl_ocean -eq 1 ]; then - export cplflx=.true. - export runSeq_ALL="OCN -> ATM :remapMethod=nearest_stod:srcmaskvalues=0\n ATM -> OCN :remapMethod=nearest_stod:srcmaskvalues=1:dstmaskvalues=0\n ATM\n OCN" - export OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) - export MED_petlist_bounds="" + cplflx=.true. + runSeq_ALL="OCN -> ATM :remapMethod=nearest_stod:srcmaskvalues=0\n ATM -> OCN :remapMethod=nearest_stod:srcmaskvalues=1:dstmaskvalues=0\n ATM\n OCN" + OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) + MED_petlist_bounds="" fi # direct coupling through the bilinear regridding method if [ ${run_ocean} = yes ] && [ $cpl_ocean -eq 2 ]; then - export cplflx=.true. - export OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) - export MED_petlist_bounds="" - export runSeq_ALL="OCN -> ATM :remapMethod=bilinear:unmappedaction=ignore:zeroregion=select:srcmaskvalues=0\n ATM -> OCN :remapMethod=bilinear:unmappedaction=ignore:zeroregion=select:srcmaskvalues=1:dstmaskvalues=0\n ATM\n OCN" + cplflx=.true. + OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) + MED_petlist_bounds="" + runSeq_ALL="OCN -> ATM :remapMethod=bilinear:unmappedaction=ignore:zeroregion=select:srcmaskvalues=0\n ATM -> OCN :remapMethod=bilinear:unmappedaction=ignore:zeroregion=select:srcmaskvalues=1:dstmaskvalues=0\n ATM\n OCN" fi # CMEPS based coupling through the bilinear regridding method if [ ${run_ocean} = yes ] && [ $cpl_ocean -eq 3 ]; then - export cplflx=.true. - export OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) - export MED_petlist_bounds=$(printf "MED_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) - export runSeq_ALL="ATM -> MED :remapMethod=redist\n MED med_phases_post_atm\n OCN -> MED :remapMethod=redist\n MED med_phases_post_ocn\n MED med_phases_prep_atm\n MED med_phases_prep_ocn_accum\n MED med_phases_prep_ocn_avg\n MED -> ATM :remapMethod=redist\n MED -> OCN :remapMethod=redist\n ATM\n OCN" + cplflx=.true. + OCN_petlist_bounds=$(printf "OCN_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) + MED_petlist_bounds=$(printf "MED_petlist_bounds: %04d %04d" $ATM_tasks $(($ATM_tasks+$ocean_tasks-1))) + runSeq_ALL="ATM -> MED :remapMethod=redist\n MED med_phases_post_atm\n OCN -> MED :remapMethod=redist\n MED med_phases_post_ocn\n MED med_phases_prep_atm\n MED med_phases_prep_ocn_accum\n MED med_phases_prep_ocn_avg\n MED -> ATM :remapMethod=redist\n MED -> OCN :remapMethod=redist\n ATM\n OCN" fi -export ocean_start_dtg=${ocean_start_dtg:-43340.00000} -#export base_dtg=${CDATE:-2019082900} -#export end_hour=${NHRS:-126} -export merge_import=${merge_import:-.false.} - -if [ $gtype = uniform ]; then - export ntiles=6 -elif [ $gtype = stretch ]; then - export ntiles=6 -elif [ $gtype = nest ]; then - export ntiles=7 -elif [ $gtype = regional ]; then - export ntiles=1 +# Prepare the output RESTART dir +if [ ${ENSDA} = YES ]; then + RESTARTout=${RESTARTout:-${COMhafs}/RESTART_ens/mem${ENSID}} + mkdir -p ${RESTARTout} + ${NLN} ${RESTARTout} RESTART +elif [ ${RUN_GSI} = YES ] || [ ${RUN_GSI_VR} = YES ]; then + RESTARTout=${RESTARTout:-${COMhafs}/RESTART} + mkdir -p ${RESTARTout} + ${NLN} ${RESTARTout} RESTART else - echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest, or regional" - exit 9 + RESTARTout=${RESTARTout:-./RESTART} + mkdir -p ${RESTARTout} fi -TOTAL_TASKS=${TOTAL_TASKS:-2016} -NCTSK=${NCTSK:-12} -NCNODE=${NCNODE:-24} -OMP_NUM_THREADS=${OMP_NUM_THREADS:-2} -APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} - -yr=`echo $CDATE | cut -c1-4` -mn=`echo $CDATE | cut -c5-6` -dy=`echo $CDATE | cut -c7-8` - +# Link the input IC and/or LBC files into the INPUT dir if [ ! -d $INPdir ]; then - echo Cannot find $INPdir ... exit - exit 1 + echo "FATAL ERROR: Input data dir does not exist: $INPdir" + exit 9 fi - -mkdir -p INPUT RESTART -ln -sf ${INPdir}/*.nc INPUT/ -#cp ${INPdir}/*.nc INPUT/ -#rsync ${INPdir}/*.nc INPUT/ - -#---------------------------------------------- -# Copy all the necessary fix files -#---------------------------------------------- -cp $FIXam/global_solarconstant_noaa_an.txt solarconstant_noaa_an.txt -cp $FIXam/ozprdlos_2015_new_sbuvO3_tclm15_nuchem.f77 global_o3prdlos.f77 -cp $FIXam/global_h2o_pltc.f77 global_h2oprdlos.f77 -cp $FIXam/global_sfc_emissivity_idx.txt sfc_emissivity_idx.txt -cp $FIXam/global_co2historicaldata_glob.txt co2historicaldata_glob.txt -cp $FIXam/co2monthlycyc.txt co2monthlycyc.txt -cp $FIXam/global_climaeropac_global.txt aerosol.dat - -cp $FIXam/global_glacier.2x2.grb . -cp $FIXam/global_maxice.2x2.grb . -cp $FIXam/RTGSST.1982.2012.monthly.clim.grb . -cp $FIXam/global_snoclim.1.875.grb . -cp $FIXam/global_snowfree_albedo.bosu.t1534.3072.1536.rg.grb . -cp $FIXam/global_albedo4.1x1.grb . -cp $FIXam/CFSR.SEAICE.1982.2012.monthly.clim.grb . -cp $FIXam/global_tg3clim.2.6x1.5.grb . -cp $FIXam/global_vegfrac.0.144.decpercent.grb . -cp $FIXam/global_vegtype.igbp.t1534.3072.1536.rg.grb . -cp $FIXam/global_soiltype.statsgo.t1534.3072.1536.rg.grb . -cp $FIXam/global_soilmgldas.t1534.3072.1536.grb . -cp $FIXam/seaice_newland.grb . -cp $FIXam/global_shdmin.0.144x0.144.grb . -cp $FIXam/global_shdmax.0.144x0.144.grb . -cp $FIXam/global_slope.1x1.grb . -cp $FIXam/global_mxsnoalb.uariz.t1534.3072.1536.rg.grb . - -for file in `ls $CO2DIR/global_co2historicaldata* ` ; do - cp $file $(echo $(basename $file) |sed -e "s/global_//g") +mkdir -p INPUT +${NLN} ${INPdir}/*.nc INPUT/ + +# Copy fix files +${NCP} $FIXam/global_solarconstant_noaa_an.txt solarconstant_noaa_an.txt +${NCP} $FIXam/ozprdlos_2015_new_sbuvO3_tclm15_nuchem.f77 global_o3prdlos.f77 +${NCP} $FIXam/global_h2o_pltc.f77 global_h2oprdlos.f77 +${NCP} $FIXam/global_sfc_emissivity_idx.txt sfc_emissivity_idx.txt +${NCP} $FIXam/global_co2historicaldata_glob.txt co2historicaldata_glob.txt +${NCP} $FIXam/co2monthlycyc.txt co2monthlycyc.txt +${NCP} $FIXam/global_climaeropac_global.txt aerosol.dat +${NCP} $FIXam/global_glacier.2x2.grb . +${NCP} $FIXam/global_maxice.2x2.grb . +${NCP} $FIXam/RTGSST.1982.2012.monthly.clim.grb . +${NCP} $FIXam/global_snoclim.1.875.grb . +${NCP} $FIXam/global_snowfree_albedo.bosu.t1534.3072.1536.rg.grb . +${NCP} $FIXam/global_albedo4.1x1.grb . +${NCP} $FIXam/CFSR.SEAICE.1982.2012.monthly.clim.grb . +${NCP} $FIXam/global_tg3clim.2.6x1.5.grb . +${NCP} $FIXam/global_vegfrac.0.144.decpercent.grb . +${NCP} $FIXam/global_vegtype.igbp.t1534.3072.1536.rg.grb . +${NCP} $FIXam/global_soiltype.statsgo.t1534.3072.1536.rg.grb . +${NCP} $FIXam/global_soilmgldas.t1534.3072.1536.grb . +${NCP} $FIXam/seaice_newland.grb . +${NCP} $FIXam/global_shdmin.0.144x0.144.grb . +${NCP} $FIXam/global_shdmax.0.144x0.144.grb . +${NCP} $FIXam/global_slope.1x1.grb . +${NCP} $FIXam/global_mxsnoalb.uariz.t1534.3072.1536.rg.grb . + +for file in $(ls ${FIXam}/fix_co2_proj/global_co2historicaldata*); do + ${NCP} $file $(echo $(basename $file) |sed -e "s/global_//g") done -# Copy the fix files needed by the hwrf ccpp physics suite -cp ${PARMhafs}/forecast/hwrf_physics_fix/* . +# If needed, copy fix files needed by the hwrf ccpp physics suite +if [[ ${ccpp_suite_regional} == *"hwrf"* ]] || [[ ${ccpp_suite_glob} == *"hwrf"* ]] || [[ ${ccpp_suite_nest} == *"hwrf"* ]]; then + ${NCP} ${PARMhafs}/forecast/hwrf_physics_fix/* . +fi if [ $gtype = nest ]; then + ntiles=7 +elif [ $gtype = regional ]; then + ntiles=1 +elif [ $gtype = uniform ] || [ $gtype = stretch ]; then + ntiles=6 +else + echo "FATAL ERROR: Unsupported gtype of ${gtype}." + exit 9 +fi -#---------------------------------------------- -# Copy tile data and orography -#---------------------------------------------- +if [ $gtype = nest ]; then + +# Copy grid and orography tile=1 while [ $tile -le $ntiles ]; do - cp $FIXgrid/${CASE}/${CASE}_oro_data.tile${tile}.nc INPUT/oro_data.tile${tile}.nc - cp $FIXgrid/${CASE}/${CASE}_grid.tile${tile}.nc INPUT/${CASE}_grid.tile${tile}.nc + ${NCP} $FIXgrid/${CASE}/${CASE}_oro_data.tile${tile}.nc INPUT/oro_data.tile${tile}.nc + ${NCP} $FIXgrid/${CASE}/${CASE}_grid.tile${tile}.nc INPUT/${CASE}_grid.tile${tile}.nc let tile=tile+1 done -cp $FIXgrid/${CASE}/${CASE}_mosaic.nc INPUT/grid_spec.nc +${NCP} $FIXgrid/${CASE}/${CASE}_mosaic.nc INPUT/grid_spec.nc -# The next 4 links are a hack GFDL requires for running a nest - cd ./INPUT -#ln -sf ${CASE}_grid.tile7.nc ${CASE}_grid.nest02.tile7.nc -ln -sf ${CASE}_grid.tile7.nc grid.nest02.tile7.nc -ln -sf oro_data.tile7.nc oro_data.nest02.tile7.nc -ln -sf gfs_data.tile7.nc gfs_data.nest02.tile7.nc -ln -sf sfc_data.tile7.nc sfc_data.nest02.tile7.nc +#${NLN} ${CASE}_grid.tile7.nc ${CASE}_grid.nest02.tile7.nc +${NLN} ${CASE}_grid.tile7.nc grid.nest02.tile7.nc +${NLN} oro_data.tile7.nc oro_data.nest02.tile7.nc +${NLN} gfs_data.tile7.nc gfs_data.nest02.tile7.nc +${NLN} sfc_data.tile7.nc sfc_data.nest02.tile7.nc cd .. -#------------------------------------------------------------------- -# Copy or set up files data_table, diag_table, field_table, -# input.nml, input_nest02.nml, model_configure, and nems.configure -#------------------------------------------------------------------- -cp ${PARMforecast}/data_table . -cp ${PARMforecast}/diag_table.tmp . -cp ${PARMforecast}/field_table . -cp ${PARMforecast}/input.nml.tmp . -cp ${PARMforecast}/input_nest02.nml.tmp . -cp ${PARMforecast}/model_configure.tmp . -cp ${PARMforecast}/nems.configure.atmonly ./nems.configure - -ccpp_suite_glob_xml="${HOMEhafs}/sorc/hafs_forecast.fd/FV3/ccpp/suites/suite_${ccpp_suite_glob}.xml" -cp ${ccpp_suite_glob_xml} . +# Prepare data_table, diag_table, field_table, input.nml, input_nest02.nml, +# model_configure, and nems.configure +${NCP} ${PARMforecast}/data_table . +${NCP} ${PARMforecast}/diag_table.tmp . +${NCP} ${PARMforecast}/field_table . +${NCP} ${PARMforecast}/input.nml.tmp . +${NCP} ${PARMforecast}/input_nest02.nml.tmp . +${NCP} ${PARMforecast}/model_configure.tmp . +${NCP} ${PARMforecast}/nems.configure.atmonly ./nems.configure glob_pes=$(( ${glob_layoutx} * ${glob_layouty} * 6 )) nest_pes=$(( ${layoutx} * ${layouty} )) @@ -229,11 +366,19 @@ joffset=$(( (jstart_nest-1)/2 + 1)) sed -e "s/_fhmax_/${NHRS}/g" \ -e "s/_ccpp_suite_/${ccpp_suite_glob}/g" \ + -e "s/_deflate_level_/${deflate_level:--1}/g" \ -e "s/_layoutx_/${glob_layoutx}/g" \ -e "s/_layouty_/${glob_layouty}/g" \ -e "s/_npx_/${glob_npx}/g" \ -e "s/_npy_/${glob_npy}/g" \ -e "s/_npz_/${npz}/g" \ + -e "s/_k_split_/${glob_k_split}/g" \ + -e "s/_n_split_/${glob_n_split}/g" \ + -e "s/_na_init_/${na_init}/g" \ + -e "s/_external_ic_/${external_ic}/g" \ + -e "s/_nggps_ic_/${nggps_ic}/g" \ + -e "s/_mountain_/${mountain}/g" \ + -e "s/_warm_start_/${warm_start}/g" \ -e "s/_target_lat_/${target_lat}/g" \ -e "s/_target_lon_/${target_lon}/g" \ -e "s/_stretch_fac_/${stretch_fac}/g" \ @@ -252,16 +397,21 @@ sed -e "s/_fhmax_/${NHRS}/g" \ -e "s/_merge_import_/${merge_import:-.false.}/g" \ input.nml.tmp > input.nml -ccpp_suite_nest_xml="${HOMEhafs}/sorc/hafs_forecast.fd/FV3/ccpp/suites/suite_${ccpp_suite_nest}.xml" -cp ${ccpp_suite_nest_xml} . - sed -e "s/_fhmax_/${NHRS}/g" \ -e "s/_ccpp_suite_/${ccpp_suite_nest}/g" \ + -e "s/_deflate_level_/${deflate_level:--1}/g" \ -e "s/_layoutx_/${layoutx}/g" \ -e "s/_layouty_/${layouty}/g" \ -e "s/_npx_/${npx}/g" \ -e "s/_npy_/${npy}/g" \ -e "s/_npz_/${npz}/g" \ + -e "s/_k_split_/${k_split}/g" \ + -e "s/_n_split_/${n_split}/g" \ + -e "s/_na_init_/${na_init}/g" \ + -e "s/_external_ic_/${external_ic}/g" \ + -e "s/_nggps_ic_/${nggps_ic}/g" \ + -e "s/_mountain_/${mountain}/g" \ + -e "s/_warm_start_/${warm_start}/g" \ -e "s/_target_lat_/${target_lat}/g" \ -e "s/_target_lon_/${target_lon}/g" \ -e "s/_stretch_fac_/${stretch_fac}/g" \ @@ -282,41 +432,47 @@ sed -e "s/_fhmax_/${NHRS}/g" \ elif [ $gtype = regional ]; then -#---------------------------------------------- -# Copy tile data and orography for regional -#---------------------------------------------- +# Prepare tile data and orography for regional tile=7 # Copy grid and orog files (halo[034]) -cp $FIXgrid/${CASE}/${CASE}_grid.tile${tile}.halo?.nc INPUT/. -cp $FIXgrid/${CASE}/${CASE}_oro_data.tile${tile}.halo?.nc INPUT/. -cp $FIXgrid/${CASE}/${CASE}_mosaic.nc INPUT/. +${NCP} $FIXgrid/${CASE}/${CASE}_grid.tile${tile}.halo?.nc INPUT/. +${NCP} $FIXgrid/${CASE}/${CASE}_oro_data.tile${tile}.halo?.nc INPUT/. +${NCP} $FIXgrid/${CASE}/${CASE}_mosaic.nc INPUT/. cd INPUT -ln -sf ${CASE}_mosaic.nc grid_spec.nc -ln -sf ${CASE}_grid.tile7.halo0.nc grid.tile7.halo0.nc -ln -sf ${CASE}_grid.tile7.halo3.nc ${CASE}_grid.tile7.nc -ln -sf ${CASE}_grid.tile7.halo4.nc grid.tile7.halo4.nc -ln -sf ${CASE}_oro_data.tile7.halo0.nc oro_data.nc -ln -sf ${CASE}_oro_data.tile7.halo4.nc oro_data.tile7.halo4.nc -ln -sf sfc_data.tile7.nc sfc_data.nc -ln -sf gfs_data.tile7.nc gfs_data.nc +${NLN} ${CASE}_mosaic.nc grid_spec.nc +${NLN} ${CASE}_grid.tile7.halo0.nc grid.tile7.halo0.nc +${NLN} ${CASE}_grid.tile7.halo3.nc ${CASE}_grid.tile7.nc +${NLN} ${CASE}_grid.tile7.halo4.nc grid.tile7.halo4.nc +${NLN} ${CASE}_oro_data.tile7.halo0.nc oro_data.nc +${NLN} ${CASE}_oro_data.tile7.halo4.nc oro_data.tile7.halo4.nc +${NLN} sfc_data.tile7.nc sfc_data.nc +${NLN} gfs_data.tile7.nc gfs_data.nc + +# For warm start from restart files (either before or after analysis) +if [ ${warmstart_from_restart} = yes ]; then + ${NLN} ${RESTARTinp}/${PDY}.${cyc}0000.coupler.res ./coupler.res + ${NLN} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.nc ./fv_core.res.nc + ${NLN} ${RESTARTinp}/${PDY}.${cyc}0000.fv_srf_wnd.res.tile1.nc ./fv_srf_wnd.res.tile1.nc + ${NLN} ${RESTARTinp}/${PDY}.${cyc}0000.fv_core.res.tile1.nc ./fv_core.res.tile1.nc + ${NLN} ${RESTARTinp}/${PDY}.${cyc}0000.fv_tracer.res.tile1.nc ./fv_tracer.res.tile1.nc +fi + cd .. -#------------------------------------------------------------------- -# Copy or set up files data_table, diag_table, field_table, -# input.nml, input_nest02.nml, model_configure, and nems.configure -#------------------------------------------------------------------- -cp ${PARMforecast}/data_table . -cp ${PARMforecast}/diag_table.tmp . -cp ${PARMforecast}/field_table . -cp ${PARMforecast}/input.nml.tmp . -cp ${PARMforecast}/model_configure.tmp . +# Prepare data_table, diag_table, field_table, input.nml, input_nest02.nml, +# model_configure, and nems.configure +${NCP} ${PARMforecast}/data_table . +${NCP} ${PARMforecast}/diag_table.tmp . +${NCP} ${PARMforecast}/field_table . +${NCP} ${PARMforecast}/input.nml.tmp . +${NCP} ${PARMforecast}/model_configure.tmp . if [ ${run_ocean} = yes ]; then if [[ ${cpl_ocean} -eq 3 ]]; then - cp ${PARMforecast}/nems.configure.atm_ocn_cmeps.tmp ./nems.configure.tmp + ${NCP} ${PARMforecast}/nems.configure.atm_ocn_cmeps.tmp ./nems.configure.tmp else - cp ${PARMforecast}/nems.configure.atm_ocn.tmp ./nems.configure.tmp + ${NCP} ${PARMforecast}/nems.configure.atm_ocn.tmp ./nems.configure.tmp fi sed -e "s/_ATM_petlist_bounds_/${ATM_petlist_bounds}/g" \ -e "s/_OCN_petlist_bounds_/${OCN_petlist_bounds}/g" \ @@ -329,22 +485,27 @@ if [ ${run_ocean} = yes ]; then -e "s/_merge_import_/${merge_import:-.false.}/g" \ nems.configure.tmp > nems.configure elif [ ${run_ocean} = no ]; then - cp ${PARMforecast}/nems.configure.atmonly ./nems.configure + ${NCP} ${PARMforecast}/nems.configure.atmonly ./nems.configure else - echo "Error: unknown run_ocean option: ${run_ocean}" + echo "FATAL ERROR: Unknown run_ocean option: ${run_ocean}" exit 9 fi -ccpp_suite_regional_xml="${HOMEhafs}/sorc/hafs_forecast.fd/FV3/ccpp/suites/suite_${ccpp_suite_regional}.xml" -cp ${ccpp_suite_regional_xml} . - sed -e "s/_fhmax_/${NHRS}/g" \ -e "s/_ccpp_suite_/${ccpp_suite_regional}/g" \ + -e "s/_deflate_level_/${deflate_level:--1}/g" \ -e "s/_layoutx_/${layoutx}/g" \ -e "s/_layouty_/${layouty}/g" \ -e "s/_npx_/${npx}/g" \ -e "s/_npy_/${npy}/g" \ -e "s/_npz_/${npz}/g" \ + -e "s/_k_split_/${k_split}/g" \ + -e "s/_n_split_/${n_split}/g" \ + -e "s/_na_init_/${na_init}/g" \ + -e "s/_external_ic_/${external_ic}/g" \ + -e "s/_nggps_ic_/${nggps_ic}/g" \ + -e "s/_mountain_/${mountain}/g" \ + -e "s/_warm_start_/${warm_start}/g" \ -e "s/_target_lat_/${target_lat}/g" \ -e "s/_target_lon_/${target_lon}/g" \ -e "s/_stretch_fac_/${stretch_fac}/g" \ @@ -361,65 +522,78 @@ sed -e "s/_fhmax_/${NHRS}/g" \ input.nml.tmp > input.nml if [ ${run_ocean} = yes ]; then - -# Copy hycom related files - -cp ${WORKhafs}/intercom/hycominit/hycom_settings hycom_settings -export hycom_basin=$(grep RUNmodIDout ./hycom_settings | cut -c20-) - -# copy IC/BC -cp ${WORKhafs}/intercom/hycominit/restart_out.a restart_in.a -cp ${WORKhafs}/intercom/hycominit/restart_out.b restart_in.b - -# copy forcing -cp ${WORKhafs}/intercom/hycominit/forcing* . -ln -sf forcing.presur.a forcing.mslprs.a -ln -sf forcing.presur.b forcing.mslprs.b - -# copy fix -cp ${FIXhycom}/hafs_${hycom_basin}.basin.regional.depth.a regional.depth.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.regional.depth.b regional.depth.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.regional.grid.a regional.grid.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.regional.grid.b regional.grid.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.forcing.chl.a forcing.chl.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.forcing.chl.b forcing.chl.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.iso.sigma.a iso.sigma.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.iso.sigma.b iso.sigma.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.relax.ssh.a relax.ssh.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.relax.ssh.b relax.ssh.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.tbaric.a tbaric.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.tbaric.b tbaric.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.thkdf4.a thkdf4.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.thkdf4.b thkdf4.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.veldf2.a veldf2.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.veldf2.b veldf2.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.veldf4.a veldf4.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.veldf4.b veldf4.b -cp ${FIXhycom}/hafs_${hycom_basin}.basin.relax.rmu.a relax.rmu.a -cp ${FIXhycom}/hafs_${hycom_basin}.basin.relax.rmu.b relax.rmu.b - -# copy parms -cp ${PARMhycom}/hafs_${hycom_basin}.basin.fcst.blkdat.input blkdat.input -cp ${PARMhycom}/hafs_${hycom_basin}.basin.ports.input ports.input -cp ${PARMhycom}/hafs_${hycom_basin}.basin.patch.input.${ocean_tasks} patch.input - -# create hycom limits -${USHhafs}/hafs_hycom_limits.py ${yr}${mn}${dy}${cyc} - + # Copy hycom related files + ${NCP} ${WORKhafs}/intercom/hycominit/hycom_settings hycom_settings + hycom_basin=$(grep RUNmodIDout ./hycom_settings | cut -c20-) + # copy IC/BC + ${NCP} ${WORKhafs}/intercom/hycominit/restart_out.a restart_in.a + ${NCP} ${WORKhafs}/intercom/hycominit/restart_out.b restart_in.b + # copy forcing + ${NCP} ${WORKhafs}/intercom/hycominit/forcing* . + ${NLN} forcing.presur.a forcing.mslprs.a + ${NLN} forcing.presur.b forcing.mslprs.b + # copy fix + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.regional.depth.a regional.depth.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.regional.depth.b regional.depth.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.regional.grid.a regional.grid.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.regional.grid.b regional.grid.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.forcing.chl.a forcing.chl.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.forcing.chl.b forcing.chl.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.iso.sigma.a iso.sigma.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.iso.sigma.b iso.sigma.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.relax.ssh.a relax.ssh.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.relax.ssh.b relax.ssh.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.tbaric.a tbaric.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.tbaric.b tbaric.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.thkdf4.a thkdf4.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.thkdf4.b thkdf4.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.veldf2.a veldf2.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.veldf2.b veldf2.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.veldf4.a veldf4.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.veldf4.b veldf4.b + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.relax.rmu.a relax.rmu.a + ${NCP} ${FIXhycom}/hafs_${hycom_basin}.basin.relax.rmu.b relax.rmu.b + # copy parms + ${NCP} ${PARMhycom}/hafs_${hycom_basin}.basin.fcst.blkdat.input blkdat.input + ${NCP} ${PARMhycom}/hafs_${hycom_basin}.basin.ports.input ports.input + ${NCP} ${PARMhycom}/hafs_${hycom_basin}.basin.patch.input.${ocean_tasks} patch.input + # create hycom limits + ${USHhafs}/hafs_hycom_limits.py ${CDATE} +fi #if [ ${run_ocean} = yes ]; then + +# Pass along the grid_spec.nc, atmos_static.nc, oro_data.nc from the prior cycle if exist +if [ ${ENSDA} = YES ]; then + if [ -s ${COMhafsprior}/RESTART_ens/mem${ENSID}/grid_spec.nc ]; then + ${NCP} -p ${COMhafsprior}/RESTART_ens/mem${ENSID}/grid_spec.nc RESTART/ + fi + if [ -s ${COMhafsprior}/RESTART_ens/mem${ENSID}/atmos_static.nc ]; then + ${NCP} -p ${COMhafsprior}/RESTART_ens/mem${ENSID}/atmos_static.nc RESTART/ + fi + if [ -s ${COMhafsprior}/RESTART_ens/mem${ENSID}/oro_data.nc ]; then + ${NCP} -p ${COMhafsprior}/RESTART_ens/mem${ENSID}/oro_data.nc RESTART/ + fi +else + if [ -s ${COMhafsprior}/RESTART/grid_spec.nc ]; then + ${NCP} -p ${COMhafsprior}/RESTART/grid_spec.nc RESTART/ + fi + if [ -s ${COMhafsprior}/RESTART/atmos_static.nc ]; then + ${NCP} -p ${COMhafsprior}/RESTART/atmos_static.nc RESTART/ + fi + if [ -s ${COMhafsprior}/RESTART/oro_data.nc ]; then + ${NCP} -p ${COMhafsprior}/RESTART/oro_data.nc RESTART/ + fi fi -fi - -#------------------------------------------------------------------- +fi #if [ $gtype = nest ]; then + # Generate diag_table, model_configure from their tempelates -#------------------------------------------------------------------- -echo ${yr}${mn}${dy}.${cyc}Z.${CASE}.32bit.non-hydro -echo $yr $mn $dy $cyc 0 0 +yr=$(echo $CDATE | cut -c1-4) +mn=$(echo $CDATE | cut -c5-6) +dy=$(echo $CDATE | cut -c7-8) cat > temp << EOF ${yr}${mn}${dy}.${cyc}Z.${CASE}.32bit.non-hydro $yr $mn $dy $cyc 0 0 EOF - cat temp diag_table.tmp > diag_table sed -e "s/NTASKS/${TOTAL_TASKS}/g" -e "s/YR/$yr/g" \ @@ -444,24 +618,44 @@ sed -e "s/NTASKS/${TOTAL_TASKS}/g" -e "s/YR/$yr/g" \ -e "s/_cpl_/${cplflx:-.false.}/g" \ model_configure.tmp > model_configure -#------------------------------------------------------------------- # Copy the fd_nems.yaml file -#------------------------------------------------------------------- -cp ${HOMEhafs}/sorc/hafs_forecast.fd/CMEPS-interface/CMEPS/mediator/fd_nems.yaml ./ +${NCP} ${HOMEhafs}/sorc/hafs_forecast.fd/CMEPS-interface/CMEPS/mediator/fd_nems.yaml ./ -#------------------------------------------------------------------- -# Link the executable and run the forecast -#------------------------------------------------------------------- -#cp ${EXEChafs}/hafs_forecast.x hafs_forecast.x +# Copy the executable and run the forecast FORECASTEXEC=${FORECASTEXEC:-${EXEChafs}/hafs_forecast.x} -cp -p ${FORECASTEXEC} ./hafs_forecast.x +${NCP} -p ${FORECASTEXEC} ./hafs_forecast.x +${APRUNC} ./hafs_forecast.x 1>out.forecast 2>err.forecast -${APRUNC} ./hafs_forecast.x 1>out.$CRES 2>err.$CRES -export err=$? +# Cat out and err into job log +cat ./out.forecast +cat ./err.forecast -#------------------------------------------------------------------- -# Deliver files to COM -#------------------------------------------------------------------- +if [ $gtype = regional ]; then + +# Rename the restart files with a proper convention if needed +cd RESTART +CDATEnhrs=`${NDATE} +${NHRS} $CDATE` +PDYnhrs=`echo ${CDATEnhrs} | cut -c1-8` +cycnhrs=`echo ${CDATEnhrs} | cut -c9-10` +if [ -s fv_core.res.nc ]; then + for file in $(/bin/ls -1 fv*.nc phy_data.nc sfc_data.nc coupler.res) + do + mv ${file} ${PDYnhrs}.${cycnhrs}0000.${file} + done +fi +cd ${DATA} + +# Pass over the grid_spec.nc, atmos_static.nc, oro_data.nc if not yet exist +if [ ! -s RESTART/grid_spec.nc ]; then + ${NCP} -p grid_spec.nc RESTART/ +fi +if [ ! -s RESTART/atmos_static.nc ]; then + ${NCP} -p atmos_static.nc RESTART/ +fi +if [ ! -s RESTART/oro_data.nc ]; then + ${NCP} -pL INPUT/oro_data.nc RESTART/ +fi -exit $err +fi # if [ $gtype = regional ]; then +exit diff --git a/scripts/exhafs_grid.sh b/scripts/exhafs_grid.sh deleted file mode 100755 index 472f2ad98..000000000 --- a/scripts/exhafs_grid.sh +++ /dev/null @@ -1,440 +0,0 @@ -#!/bin/ksh - -set -xe - -TOTAL_TASKS=${TOTAL_TASKS:-4} -NCTSK=${NCTSK:-4} -NCNODE=${NCNODE:-24} -OMP_NUM_THREADS=${OMP_NUM_THREADS:-6} -OMP_STACKSIZE=${OMP_STACKSIZE:-2048m} -KMP_STACKSIZE=${KMP_STACKSIZE:-1024m} -APRUNS=${APRUNS:-"aprun -b -j1 -n1 -N1 -d1 -cc depth"} -APRUNF=${APRUNF:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth cfp"} -APRUNC=${APRUNC:-"aprun -b -j1 -n${TOTAL_TASKS} -N${NCTSK} -d${OMP_NUM_THREADS} -cc depth"} -export APRUN=time - -CDATE=${CDATE:-${YMDH}} -CASE=${CASE:-C768} -CRES=`echo $CASE | cut -c 2-` -export res=${res:-$CRES} -export gtype=${gtype:-regional} # grid type = uniform, stretch, nest, or stand alone regional - -HOMEhafs=${HOMEhafs:-/gpfs/hps3/emc/hwrf/noscrub/${USER}/save/HAFS} -WORKhafs=${WORKhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/${CDATE}/${STORMID}} -COMhafs=${COMhafs:-${COMOUT}} -USHhafs=${USHhafs:-${HOMEhafs}/ush} -PARMhafs=${PARMhafs:-${HOMEhafs}/parm} -EXEChafs=${EXEChafs:-${HOMEhafs}/exec} -FIXhafs=${FIXhafs:-${HOMEhafs}/fix} - -FIXam=${FIXhafs}/fix_am -FIXorog=${FIXhafs}/fix_orog -FIXfv3=${FIXhafs}/fix_fv3 -FIXsfc_climo=${FIXhafs}/fix_sfc_climo - -export script_dir=${USHhafs} -export exec_dir=${EXEChafs} -export out_dir=${OUTDIR:-${WORKhafs}/intercom/grid} -export DATA=${DATA:-${WORKhafs}/grid} - -export MAKEHGRIDEXEC=${EXEChafs}/hafs_make_hgrid.x -export MAKEMOSAICEXEC=${EXEChafs}/hafs_make_solo_mosaic.x -export FILTERTOPOEXEC=${EXEChafs}/hafs_filter_topo.x -export FREGRIDEXEC=${EXEChafs}/hafs_fregrid.x -export OROGEXEC=${EXEChafs}/hafs_orog.x -export SHAVEEXEC=${EXEChafs}/hafs_shave.x -export SFCCLIMOEXEC=${EXEChafs}/hafs_sfc_climo_gen.x - -export MAKEGRIDSSH=${USHhafs}/hafs_make_grid.sh -export MAKEOROGSSH=${USHhafs}/hafs_make_orog.sh -export FILTERTOPOSSH=${USHhafs}/hafs_filter_topo.sh - -machine=${WHERE_AM_I:-wcoss_cray} # platforms: wcoss_cray, wcoss_dell_p3, hera, orion, jet - -date - -export gridfixdir=${gridfixdir:-'/let/hafs_grid/generate/grid'} -# If gridfixdir is specified and exists, use the grid fix files directly -if [ -d $gridfixdir ]; then - echo "$gridfixdir is specified and exists." - echo "Copy the grid fix files directly." - cp -rp $gridfixdir/* ${out_dir}/ - ls ${out_dir} - exit 0 -fi - -# Otherwise, generate grid according to the following parameters -#---------------------------------------------------------------- -if [ $gtype = uniform ]; then - echo "creating uniform ICs" -elif [ $gtype = stretch ]; then - export stretch_fac=${stretch_fac:-1.5} # Stretching factor for the grid - export target_lon=${target_lon:--97.5} # center longitude of the highest resolution tile - export target_lat=${target_lat:-35.5} # center latitude of the highest resolution tile - echo "creating stretched grid" -elif [ $gtype = nest ] || [ $gtype = regional ]; then - export stretch_fac=${stretch_fac:-1.0001} # Stretching factor for the grid - export target_lon=${target_lon:--62.0} # center longitude of the highest resolution tile - export target_lat=${target_lat:-22.0} # center latitude of the highest resolution tile - # Need for grid types: nest and regional - export refine_ratio=${refine_ratio:-4} # Specify the refinement ratio for nest grid - export istart_nest=${istart_nest:-46} - export jstart_nest=${jstart_nest:-238} - export iend_nest=${iend_nest:-1485} - export jend_nest=${jend_nest:-1287} - export halo=${halo:-3} # halo size to be used in the atmosphere cubic sphere model for the grid tile. - export halop1=${halop1:-4} # halo size that will be used for the orography and grid tile in chgres - export halo0=${halo0:-0} # no halo, used to shave the filtered orography for use in the model - if [ $gtype = nest ];then - echo "creating nested grid" - else - echo "creating regional grid" - fi -else - echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest or regional" - exit 1 -fi - -#---------------------------------------------------------------- -# Make grid and orography - -export grid_dir=$DATA/grid -export orog_dir=$DATA/orog -if [ $gtype = uniform ] || [ $gtype = stretch ] ; then - export filter_dir=$DATA/filter_topo -elif [ $gtype = nest ] || [ $gtype = regional ] ; then - export filter_dir=$DATA/filter_topo - export filter_dir=$orog_dir # nested grid topography will be filtered online -fi -mkdir -p $grid_dir $orog_dir $filter_dir - -if [ $gtype = uniform ] || [ $gtype = stretch ] ; then - export ntiles=6 - date - echo "............ execute $MAKEGRIDSSH ................." - if [ $gtype = uniform ]; then - ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $script_dir - elif [ $gtype = stretch ]; then - ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $stretch_fac $target_lon $target_lat $script_dir - fi - date - echo "............ execute $MAKEOROGSSH ................." - # Run multiple tiles simulatneously for the orography - - echo "${APRUNO} $MAKEOROGSSH $CRES 1 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 2 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 3 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 4 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 5 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 6 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 -if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then - echo 'wait' >> orog.file1 -fi - chmod u+x $DATA/orog.file1 - #aprun -j 1 -n 4 -N 4 -d 6 -cc depth cfp $DATA/orog.file1 - ${APRUNF} $DATA/orog.file1 - wait - #rm $DATA/orog.file1 - date - echo "............ execute $FILTERTOPOSSH .............." - $FILTERTOPOSSH $CRES $grid_dir $orog_dir $filter_dir - echo "Grid and orography files are now prepared" -elif [ $gtype = nest ]; then - export ntiles=7 - date - echo "............ execute $MAKEGRIDSSH ................." - ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $stretch_fac $target_lon $target_lat $refine_ratio $istart_nest $jstart_nest $iend_nest $jend_nest $halo $script_dir - date - echo "............ execute $MAKEOROGSSH ................." - # Run multiple tiles simulatneously for the orography - echo "${APRUNO} $MAKEOROGSSH $CRES 1 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 2 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 3 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 4 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 5 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 6 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 7 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 -if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then - echo 'wait' >> orog.file1 -fi - chmod u+x $DATA/orog.file1 - #aprun -j 1 -n 4 -N 4 -d 6 -cc depth cfp $DATA/orog.file1 - ${APRUNF} $DATA/orog.file1 - wait - #rm $DATA/orog.file1 - date - echo "Grid and orography files are now prepared" -elif [ $gtype = regional ]; then - # We are now creating only 1 tile and it is tile 7 - export ntiles=1 - tile=7 - - # number of parent points - nptsx=`expr $iend_nest - $istart_nest + 1` - nptsy=`expr $jend_nest - $jstart_nest + 1` - # number of compute grid points - npts_cgx=`expr $nptsx \* $refine_ratio / 2` - npts_cgy=`expr $nptsy \* $refine_ratio / 2` - - # figure out how many columns/rows to add in each direction so we have at least 5 halo points - # for make_hgrid and the orography program - index=0 - add_subtract_value=0 - while (test "$index" -le "0") - do - add_subtract_value=`expr $add_subtract_value + 1` - iend_nest_halo=`expr $iend_nest + $add_subtract_value` - istart_nest_halo=`expr $istart_nest - $add_subtract_value` - newpoints_i=`expr $iend_nest_halo - $istart_nest_halo + 1` - newpoints_cg_i=`expr $newpoints_i \* $refine_ratio / 2` - diff=`expr $newpoints_cg_i - $npts_cgx` - if [ $diff -ge 10 ]; then - index=`expr $index + 1` - fi - done - jend_nest_halo=`expr $jend_nest + $add_subtract_value` - jstart_nest_halo=`expr $jstart_nest - $add_subtract_value` - - echo "================================================================================== " - echo "For refine_ratio= $refine_ratio" - echo " iend_nest= $iend_nest iend_nest_halo= $iend_nest_halo istart_nest= $istart_nest istart_nest_halo= $istart_nest_halo" - echo " jend_nest= $jend_nest jend_nest_halo= $jend_nest_halo jstart_nest= $jstart_nest jstart_nest_halo= $jstart_nest_halo" - echo "================================================================================== " - - echo "............ execute $MAKEGRIDSSH ................." - ${APRUNS} $MAKEGRIDSSH $CRES $grid_dir $stretch_fac $target_lon $target_lat $refine_ratio $istart_nest_halo $jstart_nest_halo $iend_nest_halo $jend_nest_halo $halo $script_dir - - date - echo "............ execute $MAKEOROGSSH ................." - #echo "$MAKEOROGSSH $CRES 7 $grid_dir $orog_dir $script_dir $FIXorog $DATA " >>$DATA/orog.file1 - echo "${APRUNO} $MAKEOROGSSH $CRES 7 $grid_dir $orog_dir $script_dir $FIXorog $DATA ${BACKGROUND}" >>$DATA/orog.file1 -if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then - echo 'wait' >> orog.file1 -fi - chmod u+x $DATA/orog.file1 - #aprun -j 1 -n 4 -N 4 -d 6 -cc depth cfp $DATA/orog.file1 - ${APRUNF} $DATA/orog.file1 - wait - #rm $DATA/orog.file1 - - date - echo "............ execute $FILTERTOPOSSH .............." - ${APRUNS} $FILTERTOPOSSH $CRES $grid_dir $orog_dir $filter_dir - - echo "............ execute shave to reduce grid and orography files to required compute size .............." - cd $filter_dir - # shave the orography file and then the grid file, the echo creates the input file that contains the number of required points - # in x and y and the input and output file names.This first run of shave uses a halo of 4. This is necessary so that chgres will create BC's - # with 4 rows/columns which is necessary for pt. - echo $npts_cgx $npts_cgy $halop1 \'$filter_dir/oro.${CASE}.tile${tile}.nc\' \'$filter_dir/oro.${CASE}.tile${tile}.shave.nc\' >input.shave.orog - echo $npts_cgx $npts_cgy $halop1 \'$filter_dir/${CASE}_grid.tile${tile}.nc\' \'$filter_dir/${CASE}_grid.tile${tile}.shave.nc\' >input.shave.grid - - #aprun -n 1 -N 1 -j 1 -d 1 -cc depth $exec_dir/shave.x input.shave.orog.halo${halo} - echo $npts_cgx $npts_cgy $halo \'$filter_dir/${CASE}_grid.tile${tile}.nc\' \'$filter_dir/${CASE}_grid.tile${tile}.shave.nc\' >input.shave.grid.halo${halo} - ${APRUNS} ${SHAVEEXEC} < input.shave.orog.halo${halo} - ${APRUNS} ${SHAVEEXEC} < input.shave.grid.halo${halo} - - # Copy the shaved files with the halo of 3 - cp $filter_dir/oro.${CASE}.tile${tile}.shave.nc $out_dir/${CASE}_oro_data.tile${tile}.halo${halo}.nc - cp $filter_dir/${CASE}_grid.tile${tile}.shave.nc $out_dir/${CASE}_grid.tile${tile}.halo${halo}.nc - - # Now shave the orography file and then the grid file with a halo of 0. This is handy for running chgres. - echo $npts_cgx $npts_cgy $halo0 \'$filter_dir/oro.${CASE}.tile${tile}.nc\' \'$filter_dir/oro.${CASE}.tile${tile}.shave.nc\' >input.shave.orog.halo${halo0} - echo $npts_cgx $npts_cgy $halo0 \'$filter_dir/${CASE}_grid.tile${tile}.nc\' \'$filter_dir/${CASE}_grid.tile${tile}.shave.nc\' >input.shave.grid.halo${halo0} - - ${APRUNS} ${SHAVEEXEC} < input.shave.orog.halo${halo0} - ${APRUNS} ${SHAVEEXEC} < input.shave.grid.halo${halo0} - - # Copy the shaved files with the halo of 0 - cp $filter_dir/oro.${CASE}.tile${tile}.shave.nc $out_dir/${CASE}_oro_data.tile${tile}.halo${halo0}.nc - cp $filter_dir/${CASE}_grid.tile${tile}.shave.nc $out_dir/${CASE}_grid.tile${tile}.halo${halo0}.nc - - echo "Grid and orography files are now prepared" - -fi -#---------------------------------------------------------------- - -# For non-regional grids, copy grid and orography files to output directory. -if [ $gtype != regional ]; then - echo "Copy grid and orography files to output directory" - tile=1 - while [ $tile -le $ntiles ]; do - cp $filter_dir/oro.${CASE}.tile${tile}.nc $out_dir/${CASE}_oro_data.tile${tile}.nc - cp $grid_dir/${CASE}_grid.tile${tile}.nc $out_dir/${CASE}_grid.tile${tile}.nc - tile=`expr $tile + 1 ` - done -fi - -# Copy mosaic file(s) to output directory. -cp $grid_dir/${CASE}_*mosaic.nc $out_dir/ - -#---------------------------------------------------------------- -# Make surface static fields - vegetation type, soil type, etc. -# -# For global grids with a nest, the program is run twice. First -# to create the fields for the six global tiles. Then to create -# the fields on the high-res nest. This is done because the -# ESMF libraries can not interpolate to seven tiles at once. -# Note: -# Stand-alone regional grids may be run with any number of -# tasks. All other configurations must be run with a -# MULTIPLE OF SIX MPI TASKS. - -date -input_sfc_climo_dir=${FIXhafs}/fix_sfc_climo -sfc_climo_workdir=$DATA/sfc_climo -sfc_climo_savedir=$out_dir/fix_sfc -mkdir -p $sfc_climo_workdir $sfc_climo_savedir -cd ${sfc_climo_workdir} - -if [ $gtype = uniform ] || [ $gtype = stretch ]; then - GRIDTYPE=NULL - HALO=${HALO:-0} - mosaic_file=${out_dir}/${CASE}_mosaic.nc - the_orog_files='"'${CASE}'_oro_data.tile1.nc","'${CASE}'_oro_data.tile2.nc","'${CASE}'_oro_data.tile3.nc","'${CASE}'_oro_data.tile4.nc","'${CASE}'_oro_data.tile5.nc","'${CASE}'_oro_data.tile6.nc"' -elif [ $gtype = nest ]; then - # First pass for global-nesting configuration will run the 6 global tiles - GRIDTYPE=NULL - HALO=${HALO:-0} - mosaic_file=$out_dir/${CASE}_coarse_mosaic.nc - the_orog_files='"'${CASE}'_oro_data.tile1.nc","'${CASE}'_oro_data.tile2.nc","'${CASE}'_oro_data.tile3.nc","'${CASE}'_oro_data.tile4.nc","'${CASE}'_oro_data.tile5.nc","'${CASE}'_oro_data.tile6.nc"' -elif [ $gtype = regional ]; then - GRIDTYPE=regional - tile=7 - HALO=$halop1 - ln -fs $out_dir/${CASE}_grid.tile${tile}.halo${HALO}.nc $out_dir/${CASE}_grid.tile${tile}.nc - ln -fs $out_dir/${CASE}_oro_data.tile${tile}.halo${HALO}.nc $out_dir/${CASE}_oro_data.tile${tile}.nc - mosaic_file=${out_dir}/${CASE}_mosaic.nc - the_orog_files='"'${CASE}'_oro_data.tile'${tile}'.nc"' -else - echo "Error: please specify grid type with 'gtype' as uniform, stretch, nest or regional" - exit 1 -fi - -cat>./fort.41<./fort.41<itag< outpost_${NEWDATE} - -mv HURPRS.GrbF${FHR2} ${synop_grb2post} - -if [ "$output_grid" = rotated_latlon ]; then - -# For rotated_latlon output grid -# Convert from rotate lat-lon grib2 to regular lat-lon grib2 -#${APRUNS} ${WGRIB2} ${synop_grb2post} -set_bitmap 1 -set_grib_type c3 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor -new_grid ${synop_gridspecs} ${synop_grb2file} -# Parallelize this section to speed up wgrib2 -#opts='-set_bitmap 1 -set_grib_type c3 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' -opts='-set_grib_type c2 -new_grid_winds grid -new_grid_vectors "UGRD:VGRD" -new_grid_interpolation neighbor' -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":2 mb:|:5 mb:|:7 mb:|:10 mb:|:20 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part00 ${BACKGROUND} > cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":30 mb:|:50 mb:|:70 mb:|:100 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part01 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":125 mb:|:150 mb:|:175 mb:|:200 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part02 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":225 mb:|:250 mb:|:275 mb:|:300 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part03 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":325 mb:|:350 mb:|:375 mb:|:400 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part04 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":425 mb:|:450 mb:|:475 mb:|:500 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part05 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":525 mb:|:550 mb:|:575 mb:|:600 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part06 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":625 mb:|:650 mb:|:675 mb:|:700 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part07 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":725 mb:|:750 mb:|:775 mb:|:800 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part08 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":825 mb:|:850 mb:|:875 mb:|:900 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part09 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":925 mb:|:950 mb:|:975 mb:|:1000 mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part10 ${BACKGROUND} >> cmdfile -echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -not '" mb:"' ${opts} -new_grid ${synop_gridspecs} ${synop_grb2post}.part11 ${BACKGROUND} >> cmdfile -if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then - echo 'wait' >> cmdfile -fi -chmod u+x ./cmdfile -${APRUNF} ./cmdfile -wait - -# Cat the temporary files together -cat ${synop_grb2post}.part?? > ${synop_grb2file} -# clean up the temporary files -rm -f ${synop_grb2post}.part?? - -elif [ "$output_grid" = regional_latlon ]; then - -# For regional_latlon output grid, no need to convert -mv ${synop_grb2post} ${synop_grb2file} - -## Alternatively, can use wgrib2 to convert from c3 to c2 packing, which can reduce the filesize by ~30%. -#opts='-set_grib_type c2 -grib_out' -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":2 mb:|:5 mb:|:7 mb:|:10 mb:|:20 mb:"' ${opts} ${synop_grb2post}.part00 ${BACKGROUND} > cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":30 mb:|:50 mb:|:70 mb:|:100 mb:"' ${opts} ${synop_grb2post}.part01 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":125 mb:|:150 mb:|:175 mb:|:200 mb:"' ${opts} ${synop_grb2post}.part02 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":225 mb:|:250 mb:|:275 mb:|:300 mb:"' ${opts} ${synop_grb2post}.part03 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":325 mb:|:350 mb:|:375 mb:|:400 mb:"' ${opts} ${synop_grb2post}.part04 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":425 mb:|:450 mb:|:475 mb:|:500 mb:"' ${opts} ${synop_grb2post}.part05 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":525 mb:|:550 mb:|:575 mb:|:600 mb:"' ${opts} ${synop_grb2post}.part06 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":625 mb:|:650 mb:|:675 mb:|:700 mb:"' ${opts} ${synop_grb2post}.part07 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":725 mb:|:750 mb:|:775 mb:|:800 mb:"' ${opts} ${synop_grb2post}.part08 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":825 mb:|:850 mb:|:875 mb:|:900 mb:"' ${opts} ${synop_grb2post}.part09 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -match '":925 mb:|:950 mb:|:975 mb:|:1000 mb:"' ${opts} ${synop_grb2post}.part10 ${BACKGROUND} >> cmdfile -#echo ${APRUNO} ${WGRIB2} ${synop_grb2post} -not '" mb:"' ${opts} ${synop_grb2post}.part11 ${BACKGROUND} >> cmdfile -#if [ "$machine" = hera ] || [ "$machine" = orion ] || [ "$machine" = jet ]; then -# echo 'wait' >> cmdfile -#fi -#chmod u+x ./cmdfile -#${APRUNF} ./cmdfile -#wait -# -## Cat the temporary files together -#cat ${synop_grb2post}.part?? > ${synop_grb2file} -## clean up the temporary files -#rm -f ${synop_grb2post}.part?? - -else - - echo "ERROR: output grid: ${output_grid} not supported exitting" - exit 1 - -fi - -# Generate the grib2 index file -${WGRIB2} -s ${synop_grb2file} > ${synop_grb2indx} - -# Extract hafstrk grib2 files for the tracker -# From HMON -#PARMlist=':UGRD:500 mb|:VGRD:500 mb|:HGT:700 mb:|:UGRD:700 mb:|:VGRD:700 mb:|:ABSV:700 mb:|:HGT:850 mb:|:UGRD:850 mb:|:VGRD:850 mb:|:ABSV:850 mb:|:MSLET:|:UGRD:10 m above|:VGRD:10 m above' -# From HWRF -#PARMlist='HGT:925|HGT:850|HGT:700|UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m |VGRD:10 m |ABSV:850|ABSV:700|PRMSL|HGT:900|HGT:800|HGT:750|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|HGT:250|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250' -# From ens_tracker for GFS -#PARMlist='UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300' - -PARMlist='UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|MSLET|HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200' - -#PARMlist='UGRD:850|UGRD:700|UGRD:500|VGRD:850|VGRD:700|VGRD:500|UGRD:10 m a|VGRD:10 m a|ABSV:850|ABSV:700|PRMSL|HGT:900|HGT:850|HGT:800|HGT:750|HGT:700|HGT:650|HGT:600|HGT:550|HGT:500|HGT:450|HGT:400|HGT:350|HGT:300|HGT:250|HGT:200|TMP:500|TMP:450|TMP:400|TMP:350|TMP:300|TMP:250|TMP:200' - -${APRUNS} ${WGRIB2} ${synop_grb2file} -match "${PARMlist}" -grib ${hafstrk_grb2file} - -# Generate the index file for the tracker -${GRB2INDEX} ${hafstrk_grb2file} ${hafstrk_grb2indx} - -# Deliver to COMhafs -if [ $SENDCOM = YES ]; then - mv ${synop_grb2file} ${COMhafs}/ - mv ${synop_grb2indx} ${COMhafs}/ -fi - -# Check if the products are missing -if [ ! -s ${COMhafs}/${synop_grb2file} ]; then - echo "ERROR: product ${COMhafs}/${synop_grb2file} not exist" - echo "ERROR: post for hour ${FHR3} valid at ${NEWDATE} exitting" - exit 1 -fi -if [ ! -s ${COMhafs}/${synop_grb2indx} ] ; then - echo "ERROR: product ${COMhafs}/${synop_grb2indx} not exist" - echo "ERROR: post for hour ${FHR3} valid at ${NEWDATE} exitting" - exit 1 -fi - -# Deliver to intercom -mkdir -p ${intercom} -mv ${hafstrk_grb2file} ${intercom}/ -mv ${hafstrk_grb2indx} ${intercom}/ - -# Check if the products are missing -if [ ! -s ${intercom}/${hafstrk_grb2file} ]; then - echo "ERROR: intercom product ${intercom}/${hafstrk_grb2file} not exist" - echo "ERROR: post for hour ${FHR3} valid at ${NEWDATE} exitting" - exit 1 -fi -if [ ! -s ${intercom}/${hafstrk_grb2indx} ] ; then - echo "ERROR: intercom product ${intercom}/${hafstrk_grb2indx} not exist" - echo "ERROR: post for hour ${FHR3} valid at ${NEWDATE} exitting" - exit 1 -fi - -# Write out the postdone message file -echo 'done' > ${INPdir}/postf${FHR3} - -cd ${DATA} - -fi -# End if for checking if post has processed this forecast hour previously - -IFHR=`expr $IFHR + 1` -FHR=`expr $FHR + $NOUTHRS` -FHR2=$( printf "%02d" "$FHR" ) -FHR3=$( printf "%03d" "$FHR" ) - -done -# End loop for forecast hours - -echo "post job done" - -exit diff --git a/scripts/exhafs_product.sh b/scripts/exhafs_product.sh index 935317d41..d0ce9f052 100755 --- a/scripts/exhafs_product.sh +++ b/scripts/exhafs_product.sh @@ -2,6 +2,24 @@ set -xe +if [ ${ENSDA} = YES ]; then + export NHRS=${NHRS_ENS:-126} + export NBDYHRS=${NBDYHRS_ENS:-3} + export NOUTHRS=${NOUTHRS_ENS:-3} + export CASE=${CASE_ENS:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype_ens:-regional} + export LEVS=${LEVS_ENS:-65} +else + export NHRS=${NHRS:-126} + export NBDYHRS=${NBDYHRS:-3} + export NOUTHRS=${NOUTHRS:-3} + export CASE=${CASE:-C768} + export CRES=`echo $CASE | cut -c 2-` + export gtype=${gtype:-regional} + export LEVS=${LEVS:-65} +fi + TOTAL_TASKS=${TOTAL_TASKS:-1} NCTSK=${NCTSK:-1} NCNODE=${NCNODE:-24} @@ -27,6 +45,8 @@ INPdir=${INPdir:-${WORKhafs}/intercom/post} DATA=${DATA:-${WORKhafs}/product} COMhafs=${COMhafs:-/gpfs/hps3/ptmp/${USER}/${SUBEXPT}/com/${CDATE}/${STORMID}} +COMOUTproduct=${COMOUTproduct:-${COMhafs}} + out_prefix=${out_prefix:-$(echo "${STORM}${STORMID}.${YMDH}" | tr '[A-Z]' '[a-z]')} trk_atcfunix=${out_prefix}.trak.hafs.atcfunix all_atcfunix=${out_prefix}.trak.hafs.atcfunix.all @@ -106,8 +126,8 @@ ln -sf output.ike fort.74 ln -sf output.pdfwind fort.76 # The product atcf track file -touch ${COMhafs}/${all_atcfunix} -ln -sf ${COMhafs}/${all_atcfunix} output.atcfunix +touch ${COMOUTproduct}/${all_atcfunix} +ln -sf ${COMOUTproduct}/${all_atcfunix} output.atcfunix # Prepare the input namelist CC=`echo $CDATE | cut -c 1-2` @@ -132,18 +152,20 @@ ${APRUNC} ./hafs_gettrk.x < namelist.gettrk # Extract the tracking records for tmpvit STORMNUM=$(echo ${STORMID} | cut -c1-2) STORMBS1=$(echo ${STORMID} | cut -c3) -cp ${COMhafs}/${all_atcfunix} ${COMhafs}/${all_atcfunix}.orig +cp ${COMOUTproduct}/${all_atcfunix} ${COMOUTproduct}/${all_atcfunix}.orig if [ $STORMNUM == "00" ] ; then -norig=`cat ${COMhafs}/${all_atcfunix}.orig |wc -l ` +norig=`cat ${COMOUTproduct}/${all_atcfunix}.orig |wc -l ` if [ $norig -eq 1 ] ; then -> ${COMhafs}/${all_atcfunix} +> ${COMOUTproduct}/${all_atcfunix} else -grep -v "^.., ${STORMNUM}," ${COMhafs}/${all_atcfunix}.orig > ${COMhafs}/${all_atcfunix} +grep -v "^.., ${STORMNUM}," ${COMOUTproduct}/${all_atcfunix}.orig > ${COMOUTproduct}/${all_atcfunix} fi else -grep "^.., ${STORMNUM}," ${COMhafs}/${all_atcfunix} | grep -E "^${STORMBS1}.,|^.${STORMBS1}," > ${COMhafs}/${trk_atcfunix} +grep "^.., ${STORMNUM}," ${COMOUTproduct}/${all_atcfunix} | grep -E "^${STORMBS1}.,|^.${STORMBS1}," > ${COMOUTproduct}/${trk_atcfunix} fi +if [ ${ENSDA} != YES ]; then + # Deliver track file to NOSCRUB: mkdir -p ${CDNOSCRUB}/${SUBEXPT} cp -p ${COMhafs}/${all_atcfunix}.orig ${CDNOSCRUB}/${SUBEXPT}/. @@ -152,6 +174,8 @@ cp -p ${COMhafs}/${all_atcfunix} ${CDNOSCRUB}/${SUBEXPT}/. fi if [ -s ${COMhafs}/${trk_atcfunix} ] && [ $STORMNUM != "00" ] ; then cp -p ${COMhafs}/${trk_atcfunix} ${CDNOSCRUB}/${SUBEXPT}/. +fi + fi #=============================================================================== diff --git a/sorc/build_all.sh b/sorc/build_all.sh index 73eab50f4..5dc64c7c5 100755 --- a/sorc/build_all.sh +++ b/sorc/build_all.sh @@ -4,7 +4,7 @@ set -eux # USER DEFINED STUFF: # # USE_PREINST_LIBS: set to "true" to use preinstalled libraries. -# Anything other than "true" will use libraries locally. +# Anything other than "true" will use libraries locally. #------------------------------------ export USE_PREINST_LIBS="true" @@ -15,19 +15,11 @@ export USE_PREINST_LIBS="true" build_dir=`pwd` logs_dir=$build_dir/logs -if [ ! -d $logs_dir ]; then - echo "Creating logs folder" - mkdir $logs_dir -fi - -# Check final exec folder exists -if [ ! -d "../exec" ]; then - echo "Creating ../exec folder" - mkdir ../exec -fi +mkdir -p $logs_dir +mkdir -p ../exec #------------------------------------ -# INCLUDE PARTIAL BUILD +# INCLUDE PARTIAL BUILD #------------------------------------ . ./partial_build.sh @@ -74,7 +66,7 @@ echo " .... Building utils .... " } #------------------------------------ -# build tools +# build tools #------------------------------------ $Build_tools && { echo " .... Building tools .... " @@ -90,14 +82,13 @@ echo " .... Building gsi .... " } #------------------------------------ -# build hycom_utils +# build hycom_utils #------------------------------------ $Build_hycom_utils && { echo " .... Building hycom_utils .... " ./build_hycom_utils.sh > $logs_dir/build_hycom_utils.log 2>&1 } - echo;echo " .... Build system finished .... " -exit 0 +exit diff --git a/sorc/build_forecast.sh b/sorc/build_forecast.sh index 76760d14c..eba30d59a 100755 --- a/sorc/build_forecast.sh +++ b/sorc/build_forecast.sh @@ -1,27 +1,14 @@ -#! /usr/bin/env bash +#!/bin/sh set -eux - source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch3/NCEPDEV/nwprod/lib/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - -# Check final exec folder exists -if [ ! -d "../exec" ]; then - mkdir ../exec -fi - if [ $target = hera ]; then target=hera.intel ; fi if [ $target = orion ]; then target=orion.intel ; fi if [ $target = jet ]; then target=jet.intel ; fi -#if [ $target = wcoss_cray ]; then module load python/2.7.14; fi -cd hafs_forecast.fd/ -cd tests/ -./compile.sh "$target" "APP=HAFS CCPP=Y STATIC=Y SUITES=HAFS_v0_gfdlmp_nocpnsst,HAFS_v0_gfdlmp_nonsst,HAFS_v0_gfdlmp_nocp,HAFS_v0_gfdlmp,HAFS_v0_hwrf_thompson,HAFS_v0_hwrf 32BIT=Y" 32bit YES NO +cd hafs_forecast.fd/tests + +./compile.sh "$target" "APP=HAFS CCPP=Y STATIC=Y SUITES=HAFS_v0_gfdlmp_tedmf_nonsst,HAFS_v0_gfdlmp_tedmf,HAFS_v0_gfdlmp_nocpnsst,HAFS_v0_gfdlmp_nonsst,HAFS_v0_gfdlmp_nocp,HAFS_v0_gfdlmp,HAFS_v0_hwrf_thompson,HAFS_v0_hwrf 32BIT=Y" 32bit YES NO +exit diff --git a/sorc/build_gsi.sh b/sorc/build_gsi.sh index 740e35d3e..b2491a28d 100755 --- a/sorc/build_gsi.sh +++ b/sorc/build_gsi.sh @@ -1,26 +1,11 @@ -#! /usr/bin/env bash +#!/bin/sh set -eux - source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch3/NCEPDEV/nwprod/lib/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - -gsitarget=$target -[[ "$target" == wcoss_cray ]] && gsitarget=cray - -# Check final exec folder exists -if [ ! -d "../exec" ]; then - mkdir ../exec -fi - cd hafs_gsi.fd/ush/ -./build_all_cmake.sh "PRODUCTION" "$cwd/hafs_gsi.fd" -exit +#./build_all_cmake.sh "PRODUCTION" "$cwd/hafs_gsi.fd" +./build_all_cmake.sh "BUILD_FV3reg" "$cwd/hafs_gsi.fd" +exit diff --git a/sorc/build_hycom_utils.sh b/sorc/build_hycom_utils.sh index f52311f2b..2e67ed291 100755 --- a/sorc/build_hycom_utils.sh +++ b/sorc/build_hycom_utils.sh @@ -1,53 +1,44 @@ -#! /bin/sh - +#!/bin/sh set -eux - source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` -# Check final exec folder exists -if [ ! -d "../exec" ]; then - mkdir ../exec -fi - -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch2/NCEPDEV/nwprod/NCEPLIBS/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - if [ $target = wcoss_cray ]; then export DM_FC="ftn -static" export DM_F90="ftn -free -static" export DM_CC="cc -static" fi -module use hafs_hycom_utils.fd/modulefiles -module load modulefile.hycom_utils.$target +module use ../modulefiles +module load modulefile.hafs.$target module list -#export NETCDF_INCLUDE=${NETCDF_INCLUDE:-"-I${NETCDF}/include"} -#export NETCDF_LDFLAGS=${NETCDF_LDFLAGS:-"-L${NETCDF}/lib -lnetcdf -lnetcdff"} - export NETCDF_INCLUDE="-I${NETCDF}/include" - export NETCDF_LDFLAGS="-L${NETCDF}/lib -lnetcdff -lnetcdf" - -export HDF5_INCLUDE=${HDF5_INCLUDE:-"-I${HDF5}/include"} -#export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5}/lib -lhdf5_hl -lhdf5hl_fortran -lhdf5 -lhdf5_fortran"} -export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5}/lib -lhdf5_hl -lhdf5"} - -#export HDF5_LDFLAGS="-L${HDF5}/lib -lhdf5_hl -lhdf5hl_fortran -lhdf5 -lhdf5_fortran -lz"; -#export NETCDF_LDFLAGS="-L${NETCDF}/lib -lnetcdff -lnetcdf -lz ${HDF5_LDFLAGS}"; - -cd hafs_hycom_utils.fd - -# Ensure a clean compile: -make -i clean -#find . -name '*.o' -o -name '*.a' -o -name '*.mod' | xargs rm -f -#rm -f ./exec/* +cd hafs_hycom_utils.fd/libs +if [ -d "build" ]; then + rm -rf build +fi +mkdir build +cd build +if [ $target = wcoss_cray ]; then + cmake .. -DCMAKE_Fortran_COMPILER=ftn -DCMAKE_C_COMPILER=cc +else + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc +fi +make -j 8 VERBOSE=1 -# Compile hycom_utils -make -i -f makefile all +cd ${cwd}/hafs_hycom_utils.fd +if [ -d "build" ]; then + rm -rf build +fi +mkdir build +cd build +if [ $target = wcoss_cray ]; then + cmake .. -DCMAKE_Fortran_COMPILER=ftn -DCMAKE_C_COMPILER=cc +else + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc +fi +make -j 8 VERBOSE=1 +make install cd ../ diff --git a/sorc/build_post.sh b/sorc/build_post.sh index 5d58cbff9..f39d06f8d 100755 --- a/sorc/build_post.sh +++ b/sorc/build_post.sh @@ -1,20 +1,9 @@ -#! /usr/bin/env bash +#!/bin/sh set -eux - source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch3/NCEPDEV/nwprod/lib/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - -# Check final exec folder exists -if [ ! -d "../exec" ]; then - mkdir ../exec -fi - cd hafs_post.fd/tests -sh compile_upp.sh +./compile_upp.sh + +exit diff --git a/sorc/build_tools.sh b/sorc/build_tools.sh index a849786e2..3d1f5ae9f 100755 --- a/sorc/build_tools.sh +++ b/sorc/build_tools.sh @@ -1,133 +1,63 @@ -#! /usr/bin/env bash -#set -eux -set -x - +#!/bin/sh +set -eux source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch3/NCEPDEV/nwprod/lib/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch3/NCEPDEV/nwprod/lib/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - -if [ $target = wcoss ]; then - - echo "Does not support wcoss phase 1/2." - exit 1 - -elif [ $target = hera ]; then - - targetx=hera - #source ../modulefiles/modulefile.tools.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.$target - module list - - export FC=ifort - export F90=ifort - export CC=icc - -elif [ $target = orion ]; then - - targetx=orion - #source ../modulefiles/modulefile.tools.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.$target - module list - - export FC=ifort - export F90=ifort - export CC=icc - -elif [ $target = jet ]; then - - targetx=jet - #source ../modulefiles/modulefile.tools.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.$target - module list - - export FC=ifort - export F90=ifort - export CC=icc +export target=${target} +module use ../modulefiles +module load modulefile.hafs.${target} +module list +if [ $target = hera ] || [ $target = orion ] || [ $target = jet ]; then + export FC=ifort + export F90=ifort + export CC=icc + export MPIFC=mpif90 elif [ $target = wcoss_cray ]; then - - targetx=cray - if [ $USE_PREINST_LIBS = true ]; then - #source ../modulefiles/modulefile.tools.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.$target - else - #source ../modulefiles/modulefile.tools.${target}_userlib > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.${target}_userlib - fi - module load cmake/3.3.2 - module list - - export FC="ftn -static" - export F90="ftn -free -static" - export CC=icc - export DM_FC="ftn -static" - export DM_F90="ftn -free -static" - export DM_CC="cc -static" - + export FC="ftn -static" + export F90="ftn -free -static" + export CC=icc + export DM_FC="ftn -static" + export DM_F90="ftn -free -static" + export DM_CC="cc -static" elif [ $target = wcoss_dell_p3 ]; then - - targetx=wcoss_dell_p3 - if [ $USE_PREINST_LIBS = true ]; then - #source ../modulefiles/modulefile.tools.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.$target - else - #source ../modulefiles/modulefile.tools.${target}_userlib > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.tools.${target}_userlib - fi - module load cmake/3.10.0 - module list - - export FC=ifort - export F90=ifort - export CC=icc - + export FC=ifort + export F90=ifort + export CC=icc else - - echo "Unknown machine = $target" - exit 1 + echo "Unknown machine = $target" + exit 1 fi #export NETCDF_INCLUDE=${NETCDF_INCLUDE:-"-I${NETCDF}/include"} #export NETCDF_LDFLAGS=${NETCDF_LDFLAGS:-"-L${NETCDF}/lib -lnetcdf -lnetcdff"} export NETCDF_INCLUDE="-I${NETCDF}/include" export NETCDF_LDFLAGS="-L${NETCDF}/lib -lnetcdff -lnetcdf" -export HDF5_INCLUDE=${HDF5_INCLUDE:-"-I${HDF5}/include"} +export HDF5_INCLUDE=${HDF5_INCLUDE:-"-I${HDF5_INCLUDES:-"-I${HDF5}/include"}}"} #export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5}/lib -lhdf5_hl -lhdf5hl_fortran -lhdf5 -lhdf5_fortran"} -export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5}/lib -lhdf5_hl -lhdf5"} +export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5_LIBRARIES:-"${HDF5}/lib"} -lhdf5_hl -lhdf5"} export BUFR_LDFLAGS="${BUFR_LIBd}" TOOLS_PATH=${cwd}/hafs_tools.fd - -# Build the libraries in the tools -cd ${TOOLS_PATH}/libsrc -./build_libs_cmake.sh - -# Build the tools programs export TOOLS_INC=${TOOLS_PATH}/include export TOOLS_INCLUDE="-I${TOOLS_PATH}/include" export TOOLS_LIBDIR=${TOOLS_PATH}/lib +if [ -d "${TOOLS_PATH}/build" ]; then + rm -rf ${TOOLS_PATH}/build +fi +mkdir ${TOOLS_PATH}/build +cd ${TOOLS_PATH}/build +if [ $target = wcoss_cray ]; then + cmake .. -DCMAKE_Fortran_COMPILER=ftn -DCMAKE_C_COMPILER=cc +else + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc +fi +#make -j 8 +make -j 8 VERBOSE=1 +make install + cd ${TOOLS_PATH}/sorc -make clean -make + +./build_hafs_utils.sh exit diff --git a/sorc/build_utils.sh b/sorc/build_utils.sh index a2f4a82ca..8504b1209 100755 --- a/sorc/build_utils.sh +++ b/sorc/build_utils.sh @@ -1,23 +1,9 @@ #!/bin/sh set -eux - -export USE_PREINST_LIBS="true" - -#------------------------------------ -# END USER DEFINED STUFF -#------------------------------------ - -build_dir=`pwd` -logs_dir=$build_dir/logs -if [ ! -d $logs_dir ]; then - echo "Creating logs folder" - mkdir $logs_dir -fi +cwd=`pwd` cd hafs_utils.fd ./build_all.sh -cd $build_dir - -echo 'Building utils done' +exit diff --git a/sorc/build_vortextracker.sh b/sorc/build_vortextracker.sh index 56e0669a0..2103761e3 100755 --- a/sorc/build_vortextracker.sh +++ b/sorc/build_vortextracker.sh @@ -1,135 +1,68 @@ -#! /bin/sh - +#!/bin/sh set -eux - source ./machine-setup.sh > /dev/null 2>&1 cwd=`pwd` -# Check final exec folder exists -if [ ! -d "../exec" ]; then - mkdir ../exec -fi - -USE_PREINST_LIBS=${USE_PREINST_LIBS:-"true"} -if [ $USE_PREINST_LIBS = true ]; then - export MOD_PATH=/scratch2/NCEPDEV/nwprod/NCEPLIBS/modulefiles -else - export MOD_PATH=${cwd}/lib/modulefiles -fi - -if [ $target = wcoss ]; then - - echo "Does not support wcoss phase 1/2." - exit 1 - -elif [ $target = hera ]; then - - targetx=hera - #source ../modulefiles/modulefile.vortextracker.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.$target - module list - - export FC=ifort - export F90=ifort - export CC=icc +module use ../modulefiles +module load modulefile.hafs.$target +module list +if [ $target = hera ]; then + export FC=ifort + export F90=ifort + export CC=icc + export hwrf_g2_inc=/scratch1/NCEPDEV/hwrf/save/Bin.Liu/hwrf-utilities/libs/mods/g2 + export hwrf_g2_lib=/scratch1/NCEPDEV/hwrf/save/Bin.Liu/hwrf-utilities/libs/libg2.a elif [ $target = orion ]; then - - targetx=orion - #source ../modulefiles/modulefile.vortextracker.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.$target - module list - - export FC=ifort - export F90=ifort - export CC=icc - + export FC=ifort + export F90=ifort + export CC=icc + export hwrf_g2_inc=/work/noaa/hwrf/noscrub/bthomas/H220/sorc/hwrf-utilities/libs/mods/g2 + export hwrf_g2_lib=/work/noaa/hwrf/noscrub/bthomas/H220/sorc/hwrf-utilities/libs/libg2.a elif [ $target = jet ]; then - - targetx=jet - #source ../modulefiles/modulefile.vortextracker.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.$target - module list - - export FC=ifort - export F90=ifort - export CC=icc - + export FC=ifort + export F90=ifort + export CC=icc + export hwrf_g2_inc=/lfs4/HFIP/hwrf-vd/Zhan.Zhang/H219_kjet/sorc/hwrf-utilities/libs/mods/g2 + export hwrf_g2_lib=/lfs4/HFIP/hwrf-vd/Zhan.Zhang/H219_kjet/sorc/hwrf-utilities/libs/libg2.a elif [ $target = wcoss_cray ]; then - - targetx=cray - if [ $USE_PREINST_LIBS = true ]; then - #source ../modulefiles/modulefile.vortextracker.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.$target - else - #source ../modulefiles/modulefile.vortextracker.${target}_userlib > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.${target}_userlib - fi - module list - - export FC=ftn - export F90=ftn - export CC=icc - + export FC=ftn + export F90=ftn + export CC=icc + export hwrf_g2_inc=/gpfs/hps3/emc/hwrf/noscrub/Bin.Liu/save/H221final/sorc/hwrf-utilities/libs/mods/g2 + export hwrf_g2_lib=/gpfs/hps3/emc/hwrf/noscrub/Bin.Liu/save/H221final/sorc/hwrf-utilities/libs/libg2.a elif [ $target = wcoss_dell_p3 ]; then - - targetx=wcoss_dell_p3 - if [ $USE_PREINST_LIBS = true ]; then - #source ../modulefiles/modulefile.vortextracker.$target > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.$target - else - #source ../modulefiles/modulefile.vortextracker.${target}_userlib > /dev/null 2>&1 - module use ../modulefiles - module load modulefile.vortextracker.${target}_userlib - fi - module list - - export FC=ifort - export F90=ifort - export CC=icc - + export FC=ifort + export F90=ifort + export CC=icc + export hwrf_g2_inc=/gpfs/dell2/emc/modeling/noscrub/Biju.Thomas/save/trunk_20210420/sorc/hwrf-utilities/libs/mods/g2 + export hwrf_g2_lib=/gpfs/dell2/emc/modeling/noscrub/Biju.Thomas/save/trunk_20210420/sorc/hwrf-utilities/libs/libg2.a else - - echo "Unknown machine = $target" - exit 1 + echo "Unknown machine = $target" + exit 1 fi -#export NETCDF_INCLUDE=${NETCDF_INCLUDE:-"-I${NETCDF}/include"} -#export NETCDF_LDFLAGS=${NETCDF_LDFLAGS:-"-L${NETCDF}/lib -lnetcdf -lnetcdff"} - export NETCDF_INCLUDE="-I${NETCDF}/include" - export NETCDF_LDFLAGS="-L${NETCDF}/lib -lnetcdff -lnetcdf" - -export HDF5_INCLUDE=${HDF5_INCLUDE:-"-I${HDF5}/include"} -#export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5}/lib -lhdf5_hl -lhdf5hl_fortran -lhdf5 -lhdf5_fortran"} -export HDF5_LDFLAGS=${HDF5_LDFLAGS:-"-L${HDF5}/lib -lhdf5_hl -lhdf5"} - -export INC="-I${W3EMC_INCd} -I${G2_INCd} -I${SIGIO_INC4}" -export LIBS="${W3EMC_LIBd} ${W3NCO_LIBd} ${BACIO_LIB4} ${G2_LIBd} ${PNG_LIB} ${JASPER_LIB} ${Z_LIB}" - -export INC_GETTRK="-I${W3EMC_INCd} -I${G2_INCd} -I${SIGIO_INC4} ${NETCDF_INCLUDE} ${HDF5_INCLUDE}" -export LIBS_GETTRK="${W3EMC_LIBd} ${W3NCO_LIBd} ${BACIO_LIB4} ${G2_LIBd} ${NETCDF_LDFLAGS} ${HDF5_LDFLAGS} ${PNG_LIB} ${JASPER_LIB} ${Z_LIB}" - -# The following is a temporary fix to enable running the tracker on Hera and Orion. +cd hafs_vortextracker.fd +if [ -d "build" ]; then + rm -rf build +fi +mkdir build +cd build if [ $target = hera ]; then - HWRF_UTIL_LIB=/scratch1/NCEPDEV/hwrf/save/Bin.Liu/hwrf-utilities/libs - export INC_GETTRK="-I${HWRF_UTIL_LIB}/mods/bacio_8 -I${HWRF_UTIL_LIB}/mods/g2 -I${W3EMC_INCd} ${NETCDF_INCLUDE} ${HDF5_INCLUDE}" - export LIBS_GETTRK="-L${HWRF_UTIL_LIB} -lbacio -lg2 ${W3EMC_LIBd} ${W3NCO_LIBd} ${NETCDF_LDFLAGS} ${HDF5_LDFLAGS} -L/usr/lib64 -lz -lpng -ljasper" + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc -Dhwrf_g2_lib=$hwrf_g2_lib -Dhwrf_g2_inc=$hwrf_g2_inc elif [ $target = orion ]; then - HWRF_UTIL_LIB=/work/noaa/hwrf/noscrub/bthomas/H220/sorc/hwrf-utilities/libs - LIBS_GETTRK="-L${HWRF_UTIL_LIB} -lbacio -lg2 -lz -lpng ${W3EMC_LIBd} ${W3NCO_LIBd} ${NETCDF_LDFLAGS} ${HDF5_LDFLAGS} ${JASPER_LIB}" - INC_GETTRK="-I${HWRF_UTIL_LIB}/mods/bacio_8 -I${HWRF_UTIL_LIB}/mods/g2 -I${W3EMC_INCd} ${NETCDF_INCLUDE} ${HDF5_INCLUDE}" + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc -Dhwrf_g2_lib=$hwrf_g2_lib -Dhwrf_g2_inc=$hwrf_g2_inc +elif [ $target = jet ]; then + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc -Dhwrf_g2_lib=$hwrf_g2_lib -Dhwrf_g2_inc=$hwrf_g2_inc +elif [ $target = wcoss_cray ]; then + cmake .. -DCMAKE_Fortran_COMPILER=ftn -DCMAKE_C_COMPILER=cc -Dhwrf_g2_lib=$hwrf_g2_lib -Dhwrf_g2_inc=$hwrf_g2_inc +elif [ $target = wcoss_dell_p3 ]; then + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc -Dhwrf_g2_lib=$hwrf_g2_lib -Dhwrf_g2_inc=$hwrf_g2_inc +else + cmake .. -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc fi - -cd hafs_vortextracker.fd - make clean - make FC=${FC} F90=${F90} CC=${CC} -f Makefile -# make install +make -j 8 VERBOSE=1 +make install cd ../ diff --git a/sorc/hafs_build.cfg b/sorc/hafs_build.cfg index 28d6baaea..9dc1393dd 100644 --- a/sorc/hafs_build.cfg +++ b/sorc/hafs_build.cfg @@ -7,9 +7,8 @@ Building vortextracker (vortextracker) ................ yes Building utils (utils) ................................ yes Building tools (tools) ................................ yes - Building gsi (gsi) .................................... no + Building gsi (gsi) .................................... yes Building hycom_utils (hycom_utils) .................... yes - # -- END -- diff --git a/sorc/hafs_forecast.fd b/sorc/hafs_forecast.fd index f8a4f798a..d37472911 160000 --- a/sorc/hafs_forecast.fd +++ b/sorc/hafs_forecast.fd @@ -1 +1 @@ -Subproject commit f8a4f798a8ade705eb5df98879c630f60b0f2140 +Subproject commit d37472911f379c41aa971bfc07f434393275e24f diff --git a/sorc/hafs_gsi.fd b/sorc/hafs_gsi.fd index 4362613cd..498e58477 160000 --- a/sorc/hafs_gsi.fd +++ b/sorc/hafs_gsi.fd @@ -1 +1 @@ -Subproject commit 4362613cd74727a6fc64b7df83de58a7bf8674b2 +Subproject commit 498e5847763a3b691d395f9db6656df90ddbc16c diff --git a/sorc/hafs_hycom_utils.fd/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/CMakeLists.txt new file mode 100644 index 000000000..d4332c1e8 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/CMakeLists.txt @@ -0,0 +1,40 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +cmake_minimum_required(VERSION 3.15) +project( + HYCOM_UTILS + LANGUAGES C Fortran) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") +set (HAFS_TOOLS_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_Fortran_COMPILER_ID}") +endif() + +if(NOT CMAKE_C_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_C_COMPILER_ID}") +endif() + +find_package(NetCDF REQUIRED C Fortran) +find_package(HDF5 REQUIRED) +find_package(ZLIB REQUIRED) +find_package(bacio REQUIRED) +find_package(w3nco REQUIRED) +find_package(w3emc REQUIRED) +find_package(MPI REQUIRED) +find_package(PNG REQUIRED) +find_package(Jasper REQUIRED) +find_package(g2 REQUIRED) + +add_subdirectory(post/hafs_ab2data) +add_subdirectory(init/hafs_archv2restart) +add_subdirectory(init/hafs_subregion) +add_subdirectory(init/hafs_gfs2ofs2) +add_subdirectory(init/hafs_timeinterp_forcing) +add_subdirectory(init/hafs_restart2restart) +add_subdirectory(init/hafs_get_rtofs) diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/FindHDF5.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/FindHDF5.cmake new file mode 100644 index 000000000..4a72f2078 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/FindHDF5.cmake @@ -0,0 +1,25 @@ +# This extends CMake's FindHDF5.cmake to add support to include MPI include +# paths and libraries in the HDF5 ones if HDF5_IS_PARALLEL is ON +# (BUG #0014363). + +# include the default FindHDF5.cmake. +#if(CMAKE_VERSION VERSION_LESS 3.6.1) +if(CMAKE_VERSION VERSION_GREATER 3.0 ) + include(${CMAKE_CURRENT_LIST_DIR}/NewCMake/FindHDF5.cmake) +else() + include(${CMAKE_ROOT}/Modules/FindHDF5.cmake) +endif() +#endif() + +if(HDF5_FOUND AND (HDF5_IS_PARALLEL OR HDF5_ENABLE_PARALLEL)) + # include(vtkMPI) + if(MPI_C_INCLUDE_PATH) + list(APPEND HDF5_INCLUDE_DIRS ${MPI_C_INCLUDE_PATH}) + endif() + if(MPI_C_LIBRARIES) + list(APPEND HDF5_LIBRARIES ${MPI_C_LIBRARIES}) + endif() + if(MPI_CXX_LIBRARIES) + list(APPEND HDF5_LIBRARIES ${MPI_CXX_LIBRARIES}) + endif() +endif() diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/FindNetCDF.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/FindNetCDF.cmake new file mode 100644 index 000000000..1439ae848 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/FindNetCDF.cmake @@ -0,0 +1,337 @@ +# (C) Copyright 2011- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation nor +# does it submit to any jurisdiction. + +# Try to find NetCDF includes and library. +# Supports static and shared libaries and allows each component to be found in sepearte prefixes. +# +# This module defines +# +# - NetCDF_FOUND - System has NetCDF +# - NetCDF_INCLUDE_DIRS - the NetCDF include directories +# - NetCDF_VERSION - the version of NetCDF +# - NetCDF_CONFIG_EXECUTABLE - the netcdf-config executable if found +# - NetCDF_PARALLEL - Boolean True if NetCDF4 has parallel IO support via hdf5 and/or pnetcdf +# - NetCDF_HAS_PNETCDF - Boolean True if NetCDF4 has pnetcdf support +# +# Deprecated Defines +# - NetCDF_LIBRARIES - [Deprecated] Use NetCDF::NetCDF_ targets instead. +# +# +# Following components are available: +# +# - C - C interface to NetCDF (netcdf) +# - CXX - CXX4 interface to NetCDF (netcdf_c++4) +# - Fortran - Fortran interface to NetCDF (netcdff) +# +# For each component the following are defined: +# +# - NetCDF__FOUND - whether the component is found +# - NetCDF__LIBRARIES - the libraries for the component +# - NetCDF__LIBRARY_SHARED - Boolean is true if libraries for component are shared +# - NetCDF__INCLUDE_DIRS - the include directories for specified component +# - NetCDF::NetCDF_ - target of component to be used with target_link_libraries() +# +# The following paths will be searched in order if set in CMake (first priority) or environment (second priority) +# +# - NetCDF_ROOT - root of NetCDF installation +# - NetCDF_PATH - root of NetCDF installation +# +# The search process begins with locating NetCDF Include headers. If these are in a non-standard location, +# set one of the following CMake or environment variables to point to the location: +# +# - NetCDF_INCLUDE_DIR or NetCDF_${comp}_INCLUDE_DIR +# - NetCDF_INCLUDE_DIRS or NetCDF_${comp}_INCLUDE_DIR +# +# Notes: +# +# - Use "NetCDF::NetCDF_" targets only. NetCDF_LIBRARIES exists for backwards compatibility and should not be used. +# - These targets have all the knowledge of include directories and library search directories, and a single +# call to target_link_libraries will provide all these transitive properties to your target. Normally all that is +# needed to build and link against NetCDF is, e.g.: +# target_link_libraries(my_c_tgt PUBLIC NetCDF::NetCDF_C) +# - "NetCDF" is always the preferred naming for this package, its targets, variables, and environment variables +# - For compatibility, some variables are also set/checked using alternate names NetCDF4, NETCDF, or NETCDF4 +# - Environments relying on these older environment variable names should move to using a "NetCDF_ROOT" environment variable +# - Preferred component capitalization follows the CMake LANGUAGES variables: i.e., C, Fortran, CXX +# - For compatibility, alternate capitalizations are supported but should not be used. +# - If no components are defined, all components will be searched +# + +list( APPEND _possible_components C CXX Fortran ) + +## Include names for each component +set( NetCDF_C_INCLUDE_NAME netcdf.h ) +set( NetCDF_CXX_INCLUDE_NAME netcdf ) +set( NetCDF_Fortran_INCLUDE_NAME netcdf.mod ) + +## Library names for each component +set( NetCDF_C_LIBRARY_NAME netcdf ) +set( NetCDF_CXX_LIBRARY_NAME netcdf_c++4 ) +set( NetCDF_Fortran_LIBRARY_NAME netcdff ) + +## Enumerate search components +foreach( _comp ${_possible_components} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_${_COMP} ${_comp} ) + set( _name_${_COMP} ${_comp} ) +endforeach() + +set( _search_components C) +foreach( _comp ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_${_COMP} ${_comp} ) + list( APPEND _search_components ${_name_${_COMP}} ) + if( NOT _name_${_COMP} ) + message(SEND_ERROR "Find${CMAKE_FIND_PACKAGE_NAME}: COMPONENT ${_comp} is not a valid component. Valid components: ${_possible_components}" ) + endif() +endforeach() +list( REMOVE_DUPLICATES _search_components ) + +## Search hints for finding include directories and libraries +foreach( _comp IN ITEMS "_" "_C_" "_Fortran_" "_CXX_" ) + foreach( _name IN ITEMS NetCDF4 NetCDF NETCDF4 NETCDF ) + foreach( _var IN ITEMS ROOT PATH ) + list(APPEND _search_hints ${${_name}${_comp}${_var}} $ENV{${_name}${_comp}${_var}} ) + list(APPEND _include_search_hints + ${${_name}${_comp}INCLUDE_DIR} $ENV{${_name}${_comp}INCLUDE_DIR} + ${${_name}${_comp}INCLUDE_DIRS} $ENV{${_name}${_comp}INCLUDE_DIRS} ) + endforeach() + endforeach() +endforeach() +#Old-school HPC module env variable names +foreach( _name IN ITEMS NetCDF4 NetCDF NETCDF4 NETCDF ) + foreach( _comp IN ITEMS "_C" "_Fortran" "_CXX" ) + list(APPEND _search_hints ${${_name}} $ENV{${_name}}) + list(APPEND _search_hints ${${_name}${_comp}} $ENV{${_name}${_comp}}) + endforeach() +endforeach() + +## Find headers for each component +set(NetCDF_INCLUDE_DIRS) +set(_new_search_components) +foreach( _comp IN LISTS _search_components ) + if(NOT ${PROJECT_NAME}_NetCDF_${_comp}_FOUND) + list(APPEND _new_search_components ${_comp}) + endif() + find_file(NetCDF_${_comp}_INCLUDE_FILE + NAMES ${NetCDF_${_comp}_INCLUDE_NAME} + DOC "NetCDF ${_comp} include directory" + HINTS ${_include_search_hints} ${_search_hints} + PATH_SUFFIXES include include/netcdf + ) + mark_as_advanced(NetCDF_${_comp}_INCLUDE_FILE) + message(DEBUG "NetCDF_${_comp}_INCLUDE_FILE: ${NetCDF_${_comp}_INCLUDE_FILE}") + if( NetCDF_${_comp}_INCLUDE_FILE ) + get_filename_component(NetCDF_${_comp}_INCLUDE_FILE ${NetCDF_${_comp}_INCLUDE_FILE} ABSOLUTE) + get_filename_component(NetCDF_${_comp}_INCLUDE_DIR ${NetCDF_${_comp}_INCLUDE_FILE} DIRECTORY) + list(APPEND NetCDF_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIR}) + endif() +endforeach() +if(NetCDF_INCLUDE_DIRS) + list(REMOVE_DUPLICATES NetCDF_INCLUDE_DIRS) +endif() +set(NetCDF_INCLUDE_DIRS "${NetCDF_INCLUDE_DIRS}" CACHE STRING "NetCDF Include directory paths" FORCE) + +## Find n*-config executables for search components +foreach( _comp IN LISTS _search_components ) + if( _comp MATCHES "^(C)$" ) + set(_conf "c") + elseif( _comp MATCHES "^(Fortran)$" ) + set(_conf "f") + elseif( _comp MATCHES "^(CXX)$" ) + set(_conf "cxx4") + endif() + find_program( NetCDF_${_comp}_CONFIG_EXECUTABLE + NAMES n${_conf}-config + HINTS ${NetCDF_INCLUDE_DIRS} ${_include_search_hints} ${_search_hints} + PATH_SUFFIXES bin Bin ../bin ../../bin + DOC "NetCDF n${_conf}-config helper" ) + message(DEBUG "NetCDF_${_comp}_CONFIG_EXECUTABLE: ${NetCDF_${_comp}_CONFIG_EXECUTABLE}") +endforeach() + +set(_C_libs_flag --libs) +set(_Fortran_libs_flag --flibs) +set(_CXX_libs_flag --libs) +set(_C_includes_flag --includedir) +set(_Fortran_includes_flag --includedir) +set(_CXX_includes_flag --includedir) +function(netcdf_config exec flag output_var) + set(${output_var} False PARENT_SCOPE) + if( exec ) + execute_process( COMMAND ${exec} ${flag} RESULT_VARIABLE _ret OUTPUT_VARIABLE _val) + if( _ret EQUAL 0 ) + string( STRIP ${_val} _val ) + set( ${output_var} ${_val} PARENT_SCOPE ) + endif() + endif() +endfunction() + +## Find libraries for each component +set( NetCDF_LIBRARIES ) +foreach( _comp IN LISTS _search_components ) + string( TOUPPER "${_comp}" _COMP ) + + find_library( NetCDF_${_comp}_LIBRARY + NAMES ${NetCDF_${_comp}_LIBRARY_NAME} + DOC "NetCDF ${_comp} library" + HINTS ${NetCDF_${_comp}_INCLUDE_DIRS} ${_search_hints} + PATH_SUFFIXES lib64 lib ../lib64 ../lib ../../lib64 ../../lib ) + mark_as_advanced( NetCDF_${_comp}_LIBRARY ) + get_filename_component(NetCDF_${_comp}_LIBRARY ${NetCDF_${_comp}_LIBRARY} ABSOLUTE) + set(NetCDF_${_comp}_LIBRARY ${NetCDF_${_comp}_LIBRARY} CACHE STRING "NetCDF ${_comp} library" FORCE) + message(DEBUG "NetCDF_${_comp}_LIBRARY: ${NetCDF_${_comp}_LIBRARY}") + + if( NetCDF_${_comp}_LIBRARY ) + if( NetCDF_${_comp}_LIBRARY MATCHES ".a$" ) + set( NetCDF_${_comp}_LIBRARY_SHARED FALSE ) + set( _library_type STATIC) + else() + list( APPEND NetCDF_LIBRARIES ${NetCDF_${_comp}_LIBRARY} ) + set( NetCDF_${_comp}_LIBRARY_SHARED TRUE ) + set( _library_type SHARED) + endif() + endif() + + #Use nc-config to set per-component LIBRARIES variable if possible + netcdf_config( ${NetCDF_${_comp}_CONFIG_EXECUTABLE} ${_${_comp}_libs_flag} _val ) + if( _val ) + set( NetCDF_${_comp}_LIBRARIES ${_val} ) + if(NOT NetCDF_${_comp}_LIBRARY_SHARED AND NOT NetCDF_${_comp}_FOUND) #Static targets should use nc_config to get a proper link line with all necessary static targets. + list( APPEND NetCDF_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + endif() + else() + set( NetCDF_${_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARY} ) + if(NOT NetCDF_${_comp}_LIBRARY_SHARED) + message(SEND_ERROR "Unable to properly find NetCDF. Found static libraries at: ${NetCDF_${_comp}_LIBRARY} but could not run nc-config: ${NetCDF_CONFIG_EXECUTABLE}") + endif() + endif() + + #Use nc-config to set per-component INCLUDE_DIRS variable if possible + netcdf_config( ${NetCDF_${_comp}_CONFIG_EXECUTABLE} ${_${_comp}_includes_flag} _val ) + if( _val ) + string( REPLACE " " ";" _val ${_val} ) + set( NetCDF_${_comp}_INCLUDE_DIRS ${_val} ) + else() + set( NetCDF_${_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIR} ) + endif() + + if( NetCDF_${_comp}_LIBRARIES AND NetCDF_${_comp}_INCLUDE_DIRS ) + set( ${CMAKE_FIND_PACKAGE_NAME}_${_arg_${_COMP}}_FOUND TRUE ) + if (NOT TARGET NetCDF::NetCDF_${_comp}) + add_library(NetCDF::NetCDF_${_comp} ${_library_type} IMPORTED) + set_target_properties(NetCDF::NetCDF_${_comp} PROPERTIES + IMPORTED_LOCATION ${NetCDF_${_comp}_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_${_comp}_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + endif() + endif() +endforeach() +if(NetCDF_LIBRARIES AND NetCDF_${_comp}_LIBRARY_SHARED) + list(REMOVE_DUPLICATES NetCDF_LIBRARIES) +endif() +set(NetCDF_LIBRARIES "${NetCDF_LIBRARIES}" CACHE STRING "NetCDF library targets" FORCE) + +## Find version via netcdf-config if possible +if (NetCDF_INCLUDE_DIRS) + if( NetCDF_C_CONFIG_EXECUTABLE ) + netcdf_config( ${NetCDF_C_CONFIG_EXECUTABLE} --version _vers ) + if( _vers ) + string(REGEX REPLACE ".* ((([0-9]+)\\.)+([0-9]+)).*" "\\1" NetCDF_VERSION "${_vers}" ) + endif() + else() + foreach( _dir IN LISTS NetCDF_INCLUDE_DIRS) + if( EXISTS "${_dir}/netcdf_meta.h" ) + file(STRINGS "${_dir}/netcdf_meta.h" _netcdf_version_lines + REGEX "#define[ \t]+NC_VERSION_(MAJOR|MINOR|PATCH|NOTE)") + string(REGEX REPLACE ".*NC_VERSION_MAJOR *\([0-9]*\).*" "\\1" _netcdf_version_major "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_MINOR *\([0-9]*\).*" "\\1" _netcdf_version_minor "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_PATCH *\([0-9]*\).*" "\\1" _netcdf_version_patch "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_NOTE *\"\([^\"]*\)\".*" "\\1" _netcdf_version_note "${_netcdf_version_lines}") + set(NetCDF_VERSION "${_netcdf_version_major}.${_netcdf_version_minor}.${_netcdf_version_patch}${_netcdf_version_note}") + unset(_netcdf_version_major) + unset(_netcdf_version_minor) + unset(_netcdf_version_patch) + unset(_netcdf_version_note) + unset(_netcdf_version_lines) + endif() + endforeach() + endif() +endif () + +## Detect additional package properties +netcdf_config(${NetCDF_C_CONFIG_EXECUTABLE} --has-parallel4 _val) +if( NOT _val MATCHES "^(yes|no)$" ) + netcdf_config(${NetCDF_C_CONFIG_EXECUTABLE} --has-parallel _val) +endif() +if( _val MATCHES "^(yes)$" ) + set(NetCDF_PARALLEL TRUE CACHE STRING "NetCDF has parallel IO capability via pnetcdf or hdf5." FORCE) +else() + set(NetCDF_PARALLEL FALSE CACHE STRING "NetCDF has no parallel IO capability." FORCE) +endif() + +## Finalize find_package +include(FindPackageHandleStandardArgs) + +if(NOT NetCDF_FOUND OR _new_search_components) + find_package_handle_standard_args( ${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS NetCDF_INCLUDE_DIRS NetCDF_LIBRARIES + VERSION_VAR NetCDF_VERSION + HANDLE_COMPONENTS ) +endif() + +foreach( _comp IN LISTS _search_components ) + if( NetCDF_${_comp}_FOUND ) + #Record found components to avoid duplication in NetCDF_LIBRARIES for static libraries + set(NetCDF_${_comp}_FOUND ${NetCDF_${_comp}_FOUND} CACHE BOOL "NetCDF ${_comp} Found" FORCE) + #Set a per-package, per-component found variable to communicate between multiple calls to find_package() + set(${PROJECT_NAME}_NetCDF_${_comp}_FOUND True) + endif() +endforeach() + +if( ${CMAKE_FIND_PACKAGE_NAME}_FOUND AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY AND _new_search_components) + message( STATUS "Find${CMAKE_FIND_PACKAGE_NAME} defines targets:" ) + message( STATUS " - NetCDF_VERSION [${NetCDF_VERSION}]") + message( STATUS " - NetCDF_PARALLEL [${NetCDF_PARALLEL}]") + foreach( _comp IN LISTS _new_search_components ) + string( TOUPPER "${_comp}" _COMP ) + message( STATUS " - NetCDF_${_comp}_CONFIG_EXECUTABLE [${NetCDF_${_comp}_CONFIG_EXECUTABLE}]") + if( ${CMAKE_FIND_PACKAGE_NAME}_${_arg_${_COMP}}_FOUND ) + get_filename_component(_root ${NetCDF_${_comp}_INCLUDE_DIR}/.. ABSOLUTE) + if( NetCDF_${_comp}_LIBRARY_SHARED ) + message( STATUS " - NetCDF::NetCDF_${_comp} [SHARED] [Root: ${_root}] Lib: ${NetCDF_${_comp}_LIBRARY} ") + else() + message( STATUS " - NetCDF::NetCDF_${_comp} [STATIC] [Root: ${_root}] Lib: ${NetCDF_${_comp}_LIBRARY} ") + endif() + endif() + endforeach() +endif() + +foreach( _prefix NetCDF NetCDF4 NETCDF NETCDF4 ${CMAKE_FIND_PACKAGE_NAME} ) + set( ${_prefix}_INCLUDE_DIRS ${NetCDF_INCLUDE_DIRS} ) + set( ${_prefix}_LIBRARIES ${NetCDF_LIBRARIES}) + set( ${_prefix}_VERSION ${NetCDF_VERSION} ) + set( ${_prefix}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_FOUND} ) + set( ${_prefix}_CONFIG_EXECUTABLE ${NetCDF_CONFIG_EXECUTABLE} ) + set( ${_prefix}_PARALLEL ${NetCDF_PARALLEL} ) + + foreach( _comp ${_search_components} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_comp ${_arg_${_COMP}} ) + set( ${_prefix}_${_comp}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + set( ${_prefix}_${_COMP}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + set( ${_prefix}_${_arg_comp}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + + set( ${_prefix}_${_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + set( ${_prefix}_${_COMP}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + set( ${_prefix}_${_arg_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + + set( ${_prefix}_${_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + set( ${_prefix}_${_COMP}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + set( ${_prefix}_${_arg_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + endforeach() +endforeach() diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/CMakeParseArguments.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/CMakeParseArguments.cmake new file mode 100644 index 000000000..7ee2bbace --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/CMakeParseArguments.cmake @@ -0,0 +1,11 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# CMakeParseArguments +# ------------------- +# +# This module once implemented the :command:`cmake_parse_arguments` command +# that is now implemented natively by CMake. It is now an empty placeholder +# for compatibility with projects that include it to get the command from +# CMake 3.4 and lower. diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindHDF5.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindHDF5.cmake new file mode 100644 index 000000000..fd8891cf2 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindHDF5.cmake @@ -0,0 +1,934 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindHDF5 +# -------- +# +# Find HDF5, a library for reading and writing self describing array data. +# +# +# +# This module invokes the HDF5 wrapper compiler that should be installed +# alongside HDF5. Depending upon the HDF5 Configuration, the wrapper +# compiler is called either h5cc or h5pcc. If this succeeds, the module +# will then call the compiler with the -show argument to see what flags +# are used when compiling an HDF5 client application. +# +# The module will optionally accept the COMPONENTS argument. If no +# COMPONENTS are specified, then the find module will default to finding +# only the HDF5 C library. If one or more COMPONENTS are specified, the +# module will attempt to find the language bindings for the specified +# components. The only valid components are C, CXX, Fortran, HL, and +# Fortran_HL. If the COMPONENTS argument is not given, the module will +# attempt to find only the C bindings. +# +# This module will read the variable +# HDF5_USE_STATIC_LIBRARIES to determine whether or not to prefer a +# static link to a dynamic link for HDF5 and all of it's dependencies. +# To use this feature, make sure that the HDF5_USE_STATIC_LIBRARIES +# variable is set before the call to find_package. +# +# To provide the module with a hint about where to find your HDF5 +# installation, you can set the environment variable HDF5_ROOT. The +# Find module will then look in this path when searching for HDF5 +# executables, paths, and libraries. +# +# Both the serial and parallel HDF5 wrappers are considered and the first +# directory to contain either one will be used. In the event that both appear +# in the same directory the serial version is preferentially selected. This +# behavior can be reversed by setting the variable HDF5_PREFER_PARALLEL to +# true. +# +# In addition to finding the includes and libraries required to compile +# an HDF5 client application, this module also makes an effort to find +# tools that come with the HDF5 distribution that may be useful for +# regression testing. +# +# This module will define the following variables: +# +# :: +# +# HDF5_FOUND - true if HDF5 was found on the system +# HDF5_VERSION - HDF5 version in format Major.Minor.Release +# HDF5_INCLUDE_DIRS - Location of the hdf5 includes +# HDF5_INCLUDE_DIR - Location of the hdf5 includes (deprecated) +# HDF5_DEFINITIONS - Required compiler definitions for HDF5 +# HDF5_LIBRARIES - Required libraries for all requested bindings +# HDF5_HL_LIBRARIES - Required libraries for the HDF5 high level API for all +# bindings, if the HL component is enabled +# +# Available components are: C CXX Fortran and HL. For each enabled language +# binding, a corresponding HDF5_${LANG}_LIBRARIES variable, and potentially +# HDF5_${LANG}_DEFINITIONS, will be defined. +# If the HL component is enabled, then an HDF5_${LANG}_HL_LIBRARIES will +# also be defined. With all components enabled, the following variables will be defined: +# +# :: +# +# HDF5_C_DEFINITIONS -- Required compiler definitions for HDF5 C bindings +# HDF5_CXX_DEFINITIONS -- Required compiler definitions for HDF5 C++ bindings +# HDF5_Fortran_DEFINITIONS -- Required compiler definitions for HDF5 Fortran bindings +# HDF5_C_INCLUDE_DIRS -- Required include directories for HDF5 C bindings +# HDF5_CXX_INCLUDE_DIRS -- Required include directories for HDF5 C++ bindings +# HDF5_Fortran_INCLUDE_DIRS -- Required include directories for HDF5 Fortran bindings +# HDF5_C_LIBRARIES - Required libraries for the HDF5 C bindings +# HDF5_CXX_LIBRARIES - Required libraries for the HDF5 C++ bindings +# HDF5_Fortran_LIBRARIES - Required libraries for the HDF5 Fortran bindings +# HDF5_C_HL_LIBRARIES - Required libraries for the high level C bindings +# HDF5_CXX_HL_LIBRARIES - Required libraries for the high level C++ bindings +# HDF5_Fortran_HL_LIBRARIES - Required libraries for the high level Fortran +# bindings. +# +# HDF5_IS_PARALLEL - Whether or not HDF5 was found with parallel IO support +# HDF5_C_COMPILER_EXECUTABLE - the path to the HDF5 C wrapper compiler +# HDF5_CXX_COMPILER_EXECUTABLE - the path to the HDF5 C++ wrapper compiler +# HDF5_Fortran_COMPILER_EXECUTABLE - the path to the HDF5 Fortran wrapper compiler +# HDF5_C_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary C compiler +# which is also the HDF5 wrapper +# HDF5_CXX_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary C++ +# compiler which is also +# the HDF5 wrapper +# HDF5_Fortran_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary +# Fortran compiler which +# is also the HDF5 wrapper +# HDF5_DIFF_EXECUTABLE - the path to the HDF5 dataset comparison tool +# +# The following variable can be set to guide the search for HDF5 libraries and includes: +# +# ``HDF5_ROOT`` +# Specify the path to the HDF5 installation to use. +# +# ``HDF5_FIND_DEBUG`` +# Set to a true value to get some extra debugging output. +# +# ``HDF5_NO_FIND_PACKAGE_CONFIG_FILE`` +# Set to a true value to skip trying to find ``hdf5-config.cmake``. + +# This module is maintained by Will Dicharry . + +include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# List of the valid HDF5 components +set(HDF5_VALID_LANGUAGE_BINDINGS C CXX Fortran) + +# Validate the list of find components. +if(NOT HDF5_FIND_COMPONENTS) + set(HDF5_LANGUAGE_BINDINGS "C") +else() + set(HDF5_LANGUAGE_BINDINGS) + # add the extra specified components, ensuring that they are valid. + set(FIND_HL OFF) + foreach(component IN LISTS HDF5_FIND_COMPONENTS) + list(FIND HDF5_VALID_LANGUAGE_BINDINGS ${component} component_location) + if(NOT component_location EQUAL -1) + list(APPEND HDF5_LANGUAGE_BINDINGS ${component}) + elseif(component STREQUAL "HL") + set(FIND_HL ON) + elseif(component STREQUAL "Fortran_HL") # only for compatibility + list(APPEND HDF5_LANGUAGE_BINDINGS Fortran) + set(FIND_HL ON) + set(HDF5_FIND_REQUIRED_Fortran_HL False) + set(HDF5_FIND_REQUIRED_Fortran True) + set(HDF5_FIND_REQUIRED_HL True) + else() + message(FATAL_ERROR "${component} is not a valid HDF5 component.") + endif() + endforeach() + if(NOT HDF5_LANGUAGE_BINDINGS) + get_property(__langs GLOBAL PROPERTY ENABLED_LANGUAGES) + foreach(__lang IN LISTS __langs) + if(__lang MATCHES "^(C|CXX|Fortran)$") + list(APPEND HDF5_LANGUAGE_BINDINGS ${__lang}) + endif() + endforeach() + endif() + list(REMOVE_ITEM HDF5_FIND_COMPONENTS Fortran_HL) # replaced by Fortran and HL + list(REMOVE_DUPLICATES HDF5_LANGUAGE_BINDINGS) +endif() + +# Determine whether to search for serial or parallel executable first +if(HDF5_PREFER_PARALLEL) + set(HDF5_C_COMPILER_NAMES h5pcc h5cc) + set(HDF5_CXX_COMPILER_NAMES h5pc++ h5c++) + set(HDF5_Fortran_COMPILER_NAMES h5pfc h5fc) +else() + set(HDF5_C_COMPILER_NAMES h5cc h5pcc) + set(HDF5_CXX_COMPILER_NAMES h5c++ h5pc++) + set(HDF5_Fortran_COMPILER_NAMES h5fc h5pfc) +endif() + +# We may have picked up some duplicates in various lists during the above +# process for the language bindings (both the C and C++ bindings depend on +# libz for example). Remove the duplicates. It appears that the default +# CMake behavior is to remove duplicates from the end of a list. However, +# for link lines, this is incorrect since unresolved symbols are searched +# for down the link line. Therefore, we reverse the list, remove the +# duplicates, and then reverse it again to get the duplicates removed from +# the beginning. +macro(_HDF5_remove_duplicates_from_beginning _list_name) + if(${_list_name}) + list(REVERSE ${_list_name}) + list(REMOVE_DUPLICATES ${_list_name}) + list(REVERSE ${_list_name}) + endif() +endmacro() + + +# Test first if the current compilers automatically wrap HDF5 + +function(_HDF5_test_regular_compiler_C success version is_parallel) + set(scratch_directory + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if(NOT ${success} OR + NOT EXISTS ${scratch_directory}/compiler_has_h5_c) + set(test_file ${scratch_directory}/cmake_hdf5_test.c) + file(WRITE ${test_file} + "#include \n" + "#include \n" + "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" + "#ifdef H5_HAVE_PARALLEL\n" + "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" + "#endif\n" + "int main(int argc, char **argv) {\n" + " int require = 0;\n" + " require += info_ver[argc];\n" + "#ifdef H5_HAVE_PARALLEL\n" + " require += info_parallel[argc];\n" + "#endif\n" + " hid_t fid;\n" + " fid = H5Fcreate(\"foo.h5\",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);\n" + " return 0;\n" + "}") + try_compile(${success} ${scratch_directory} ${test_file} + COPY_FILE ${scratch_directory}/compiler_has_h5_c + ) + endif() + if(${success}) + file(STRINGS ${scratch_directory}/compiler_has_h5_c INFO_STRINGS + REGEX "^INFO:" + ) + string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?" + INFO_VER "${INFO_STRINGS}" + ) + set(${version} ${CMAKE_MATCH_1}) + if(CMAKE_MATCH_3) + set(${version} ${HDF5_C_VERSION}.${CMAKE_MATCH_3}) + endif() + set(${version} ${${version}} PARENT_SCOPE) + + if(INFO_STRINGS MATCHES "INFO:PARALLEL") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() +endfunction() + +function(_HDF5_test_regular_compiler_CXX success version is_parallel) + set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if(NOT ${success} OR + NOT EXISTS ${scratch_directory}/compiler_has_h5_cxx) + set(test_file ${scratch_directory}/cmake_hdf5_test.cxx) + file(WRITE ${test_file} + "#include \n" + "#ifndef H5_NO_NAMESPACE\n" + "using namespace H5;\n" + "#endif\n" + "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" + "#ifdef H5_HAVE_PARALLEL\n" + "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" + "#endif\n" + "int main(int argc, char **argv) {\n" + " int require = 0;\n" + " require += info_ver[argc];\n" + "#ifdef H5_HAVE_PARALLEL\n" + " require += info_parallel[argc];\n" + "#endif\n" + " H5File file(\"foo.h5\", H5F_ACC_TRUNC);\n" + " return 0;\n" + "}") + try_compile(${success} ${scratch_directory} ${test_file} + COPY_FILE ${scratch_directory}/compiler_has_h5_cxx + ) + endif() + if(${success}) + file(STRINGS ${scratch_directory}/compiler_has_h5_cxx INFO_STRINGS + REGEX "^INFO:" + ) + string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?" + INFO_VER "${INFO_STRINGS}" + ) + set(${version} ${CMAKE_MATCH_1}) + if(CMAKE_MATCH_3) + set(${version} ${HDF5_CXX_VERSION}.${CMAKE_MATCH_3}) + endif() + set(${version} ${${version}} PARENT_SCOPE) + + if(INFO_STRINGS MATCHES "INFO:PARALLEL") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() +endfunction() + +function(_HDF5_test_regular_compiler_Fortran success is_parallel) + if(NOT ${success}) + set(scratch_directory + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + set(test_file ${scratch_directory}/cmake_hdf5_test.f90) + file(WRITE ${test_file} + "program hdf5_hello\n" + " use hdf5\n" + " use h5lt\n" + " use h5ds\n" + " integer error\n" + " call h5open_f(error)\n" + " call h5close_f(error)\n" + "end\n") + try_compile(${success} ${scratch_directory} ${test_file}) + if(${success}) + execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -showconfig + OUTPUT_VARIABLE config_output + ERROR_VARIABLE config_error + RESULT_VARIABLE config_result + ) + if(config_output MATCHES "Parallel HDF5: yes") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + +# Invoke the HDF5 wrapper compiler. The compiler return value is stored to the +# return_value argument, the text output is stored to the output variable. +macro( _HDF5_invoke_compiler language output return_value version is_parallel) + set(${version}) + if(HDF5_USE_STATIC_LIBRARIES) + set(lib_type_args -noshlib) + else() + set(lib_type_args -shlib) + endif() + set(scratch_dir ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if("${language}" STREQUAL "C") + set(test_file ${scratch_dir}/cmake_hdf5_test.c) + elseif("${language}" STREQUAL "CXX") + set(test_file ${scratch_dir}/cmake_hdf5_test.cxx) + elseif("${language}" STREQUAL "Fortran") + set(test_file ${scratch_dir}/cmake_hdf5_test.f90) + endif() + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -show ${lib_type_args} ${test_file} + OUTPUT_VARIABLE ${output} + RETURN_VALUE ${return_value} + ) + if(NOT ${${return_value}} EQUAL 0) + message(STATUS + "Unable to determine HDF5 ${language} flags from HDF5 wrapper.") + endif() + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -showconfig + OUTPUT_VARIABLE config_output + RETURN_VALUE config_return + ) + if(NOT ${return_value} EQUAL 0) + message( STATUS + "Unable to determine HDF5 ${language} version from HDF5 wrapper.") + endif() + string(REGEX MATCH "HDF5 Version: ([a-zA-Z0-9\\.\\-]*)" version_match "${config_output}") + if(version_match) + string(REPLACE "HDF5 Version: " "" ${version} "${version_match}") + string(REPLACE "-patch" "." ${version} "${${version}}") + endif() + if(config_output MATCHES "Parallel HDF5: yes") + set(${is_parallel} TRUE) + else() + set(${is_parallel} FALSE) + endif() +endmacro() + +# Parse a compile line for definitions, includes, library paths, and libraries. +macro( _HDF5_parse_compile_line + compile_line_var + include_paths + definitions + library_paths + libraries + libraries_hl) + + separate_arguments(_HDF5_COMPILE_ARGS UNIX_COMMAND "${${compile_line_var}}") + + foreach(arg IN LISTS _HDF5_COMPILE_ARGS) + if("${arg}" MATCHES "^-I(.*)$") + # include directory + list(APPEND ${include_paths} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-D(.*)$") + # compile definition + list(APPEND ${definitions} "-D${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-L(.*)$") + # library search path + list(APPEND ${library_paths} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-l(hdf5.*hl.*)$") + # library name (hl) + list(APPEND ${libraries_hl} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-l(.*)$") + # library name + list(APPEND ${libraries} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^(.:)?[/\\].*\\.(a|so|dylib|sl|lib)$") + # library file + if(NOT EXISTS "${arg}") + continue() + endif() + get_filename_component(_HDF5_LPATH "${arg}" DIRECTORY) + get_filename_component(_HDF5_LNAME "${arg}" NAME_WE) + string(REGEX REPLACE "^lib" "" _HDF5_LNAME "${_HDF5_LNAME}") + list(APPEND ${library_paths} "${_HDF5_LPATH}") + if(_HDF5_LNAME MATCHES "hdf5.*hl") + list(APPEND ${libraries_hl} "${_HDF5_LNAME}") + else() + list(APPEND ${libraries} "${_HDF5_LNAME}") + endif() + endif() + endforeach() +endmacro() + +# Select a preferred imported configuration from a target +function(_HDF5_select_imported_config target imported_conf) + # We will first assign the value to a local variable _imported_conf, then assign + # it to the function argument at the end. + get_target_property(_imported_conf ${target} MAP_IMPORTED_CONFIG_${CMAKE_BUILD_TYPE}) + if (NOT _imported_conf) + # Get available imported configurations by examining target properties + get_target_property(_imported_conf ${target} IMPORTED_CONFIGURATIONS) + if(HDF5_FIND_DEBUG) + message(STATUS "Found imported configurations: ${_imported_conf}") + endif() + # Find the imported configuration that we prefer. + # We do this by making list of configurations in order of preference, + # starting with ${CMAKE_BUILD_TYPE} and ending with the first imported_conf + set(_preferred_confs ${CMAKE_BUILD_TYPE}) + list(GET _imported_conf 0 _fallback_conf) + list(APPEND _preferred_confs RELWITHDEBINFO RELEASE DEBUG ${_fallback_conf}) + if(HDF5_FIND_DEBUG) + message(STATUS "Start search through imported configurations in the following order: ${_preferred_confs}") + endif() + # Now find the first of these that is present in imported_conf + cmake_policy(PUSH) + cmake_policy(SET CMP0057 NEW) # support IN_LISTS + foreach (_conf IN LISTS _preferred_confs) + if (${_conf} IN_LIST _imported_conf) + set(_imported_conf ${_conf}) + break() + endif() + endforeach() + cmake_policy(POP) + endif() + if(HDF5_FIND_DEBUG) + message(STATUS "Selected imported configuration: ${_imported_conf}") + endif() + # assign value to function argument + set(${imported_conf} ${_imported_conf} PARENT_SCOPE) +endfunction() + + +if(NOT HDF5_ROOT) + set(HDF5_ROOT $ENV{HDF5_ROOT}) +endif() +if(HDF5_ROOT) + set(_HDF5_SEARCH_OPTS NO_DEFAULT_PATH) +else() + set(_HDF5_SEARCH_OPTS) +endif() + +# Try to find HDF5 using an installed hdf5-config.cmake +if(NOT HDF5_FOUND AND NOT HDF5_NO_FIND_PACKAGE_CONFIG_FILE) + find_package(HDF5 QUIET NO_MODULE + HINTS ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS} + ) + if( HDF5_FOUND) + if(HDF5_FIND_DEBUG) + message(STATUS "Found HDF5 at ${HDF5_DIR} via NO_MODULE. Now trying to extract locations etc.") + endif() + set(HDF5_IS_PARALLEL ${HDF5_ENABLE_PARALLEL}) + set(HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) + set(HDF5_LIBRARIES) + if (NOT TARGET hdf5 AND NOT TARGET hdf5-static AND NOT TARGET hdf5-shared) + # Some HDF5 versions (e.g. 1.8.18) used hdf5::hdf5 etc + set(_target_prefix "hdf5::") + endif() + set(HDF5_C_TARGET ${_target_prefix}hdf5) + set(HDF5_C_HL_TARGET ${_target_prefix}hdf5_hl) + set(HDF5_CXX_TARGET ${_target_prefix}hdf5_cpp) + set(HDF5_CXX_HL_TARGET ${_target_prefix}hdf5_hl_cpp) + set(HDF5_Fortran_TARGET ${_target_prefix}hdf5_fortran) + set(HDF5_Fortran_HL_TARGET ${_target_prefix}hdf5_hl_fortran) + set(HDF5_DEFINITIONS "") + if(HDF5_USE_STATIC_LIBRARIES) + set(_suffix "-static") + else() + set(_suffix "-shared") + endif() + foreach(_lang ${HDF5_LANGUAGE_BINDINGS}) + + #Older versions of hdf5 don't have a static/shared suffix so + #if we detect that occurrence clear the suffix + if(_suffix AND NOT TARGET ${HDF5_${_lang}_TARGET}${_suffix}) + if(NOT TARGET ${HDF5_${_lang}_TARGET}) + #cant find this component with or without the suffix + #so bail out, and let the following locate HDF5 + set(HDF5_FOUND FALSE) + break() + endif() + set(_suffix "") + endif() + + if(HDF5_FIND_DEBUG) + message(STATUS "Trying to get properties of target ${HDF5_${_lang}_TARGET}${_suffix}") + endif() + # Find library for this target. Complicated as on Windows with a DLL, we need to search for the import-lib. + _HDF5_select_imported_config(${HDF5_${_lang}_TARGET}${_suffix} _hdf5_imported_conf) + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} ) + if (NOT _hdf5_lang_location) + # no import lib, just try LOCATION + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf}) + if (NOT _hdf5_lang_location) + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} LOCATION) + endif() + endif() + if( _hdf5_lang_location ) + set(HDF5_${_lang}_LIBRARY ${_hdf5_lang_location}) + list(APPEND HDF5_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix}) + set(HDF5_${_lang}_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix}) + set(HDF5_${_lang}_FOUND True) + endif() + if(FIND_HL) + get_target_property(__lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} ) + if (NOT _hdf5_lang_hl_location) + get_target_property(_hdf5_lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf}) + if (NOT _hdf5_hl_lang_location) + get_target_property(_hdf5_hl_lang_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION) + endif() + endif() + if( _hdf5_lang_hl_location ) + set(HDF5_${_lang}_HL_LIBRARY ${_hdf5_lang_hl_location}) + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix}) + set(HDF5_${_lang}_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix}) + set(HDF5_HL_FOUND True) + endif() + unset(_hdf5_lang_hl_location) + endif() + unset(_hdf5_imported_conf) + unset(_hdf5_lang_location) + endforeach() + endif() +endif() + +if(NOT HDF5_FOUND) + set(_HDF5_NEED_TO_SEARCH False) + set(HDF5_COMPILER_NO_INTERROGATE True) + # Only search for languages we've enabled + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + # First check to see if our regular compiler is one of wrappers + if(__lang STREQUAL "C") + _HDF5_test_regular_compiler_C( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_VERSION + HDF5_${__lang}_IS_PARALLEL) + elseif(__lang STREQUAL "CXX") + _HDF5_test_regular_compiler_CXX( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_VERSION + HDF5_${__lang}_IS_PARALLEL) + elseif(__lang STREQUAL "Fortran") + _HDF5_test_regular_compiler_Fortran( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_IS_PARALLEL) + else() + continue() + endif() + if(HDF5_${__lang}_COMPILER_NO_INTERROGATE) + message(STATUS "HDF5: Using hdf5 compiler wrapper for all ${__lang} compiling") + set(HDF5_${__lang}_FOUND True) + set(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE + "${CMAKE_${__lang}_COMPILER}" + CACHE FILEPATH "HDF5 ${__lang} compiler wrapper") + set(HDF5_${__lang}_DEFINITIONS) + set(HDF5_${__lang}_INCLUDE_DIRS) + set(HDF5_${__lang}_LIBRARIES) + set(HDF5_${__lang}_HL_LIBRARIES) + + mark_as_advanced(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE) + + set(HDF5_${__lang}_FOUND True) + set(HDF5_HL_FOUND True) + else() + set(HDF5_COMPILER_NO_INTERROGATE False) + # If this language isn't using the wrapper, then try to seed the + # search options with the wrapper + find_program(HDF5_${__lang}_COMPILER_EXECUTABLE + NAMES ${HDF5_${__lang}_COMPILER_NAMES} NAMES_PER_DIR + HINTS ${HDF5_ROOT} + PATH_SUFFIXES bin Bin + DOC "HDF5 ${__lang} Wrapper compiler. Used only to detect HDF5 compile flags." + ${_HDF5_SEARCH_OPTS} + ) + mark_as_advanced( HDF5_${__lang}_COMPILER_EXECUTABLE ) + unset(HDF5_${__lang}_COMPILER_NAMES) + + if(HDF5_${__lang}_COMPILER_EXECUTABLE) + _HDF5_invoke_compiler(${__lang} HDF5_${__lang}_COMPILE_LINE + HDF5_${__lang}_RETURN_VALUE HDF5_${__lang}_VERSION HDF5_${__lang}_IS_PARALLEL) + if(HDF5_${__lang}_RETURN_VALUE EQUAL 0) + message(STATUS "HDF5: Using hdf5 compiler wrapper to determine ${__lang} configuration") + _HDF5_parse_compile_line( HDF5_${__lang}_COMPILE_LINE + HDF5_${__lang}_INCLUDE_DIRS + HDF5_${__lang}_DEFINITIONS + HDF5_${__lang}_LIBRARY_DIRS + HDF5_${__lang}_LIBRARY_NAMES + HDF5_${__lang}_HL_LIBRARY_NAMES + ) + set(HDF5_${__lang}_LIBRARIES) + + foreach(L IN LISTS HDF5_${__lang}_LIBRARY_NAMES) + set(_HDF5_SEARCH_NAMES_LOCAL) + if("x${L}" MATCHES "hdf5") + # hdf5 library + set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS}) + if(HDF5_USE_STATIC_LIBRARIES) + if(WIN32) + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}) + else() + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a) + endif() + endif() + else() + # external library + set(_HDF5_SEARCH_OPTS_LOCAL) + endif() + find_library(HDF5_${__lang}_LIBRARY_${L} + NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR + HINTS ${HDF5_${__lang}_LIBRARY_DIRS} + ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS_LOCAL} + ) + unset(_HDF5_SEARCH_OPTS_LOCAL) + unset(_HDF5_SEARCH_NAMES_LOCAL) + if(HDF5_${__lang}_LIBRARY_${L}) + list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}}) + else() + list(APPEND HDF5_${__lang}_LIBRARIES ${L}) + endif() + endforeach() + if(FIND_HL) + set(HDF5_${__lang}_HL_LIBRARIES) + foreach(L IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES) + set(_HDF5_SEARCH_NAMES_LOCAL) + if("x${L}" MATCHES "hdf5") + # hdf5 library + set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS}) + if(HDF5_USE_STATIC_LIBRARIES) + if(WIN32) + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}) + else() + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a) + endif() + endif() + else() + # external library + set(_HDF5_SEARCH_OPTS_LOCAL) + endif() + find_library(HDF5_${__lang}_LIBRARY_${L} + NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR + HINTS ${HDF5_${__lang}_LIBRARY_DIRS} + ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS_LOCAL} + ) + unset(_HDF5_SEARCH_OPTS_LOCAL) + unset(_HDF5_SEARCH_NAMES_LOCAL) + if(HDF5_${__lang}_LIBRARY_${L}) + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}}) + else() + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${L}) + endif() + endforeach() + set(HDF5_HL_FOUND True) + endif() + + set(HDF5_${__lang}_FOUND True) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_HL_LIBRARIES) + else() + set(_HDF5_NEED_TO_SEARCH True) + endif() + else() + set(_HDF5_NEED_TO_SEARCH True) + endif() + endif() + if(HDF5_${__lang}_VERSION) + if(NOT HDF5_VERSION) + set(HDF5_VERSION ${HDF5_${__lang}_VERSION}) + elseif(NOT HDF5_VERSION VERSION_EQUAL HDF5_${__lang}_VERSION) + message(WARNING "HDF5 Version found for language ${__lang}, ${HDF5_${__lang}_VERSION} is different than previously found version ${HDF5_VERSION}") + endif() + endif() + if(DEFINED HDF5_${__lang}_IS_PARALLEL) + if(NOT DEFINED HDF5_IS_PARALLEL) + set(HDF5_IS_PARALLEL ${HDF5_${__lang}_IS_PARALLEL}) + elseif(NOT HDF5_IS_PARALLEL AND HDF5_${__lang}_IS_PARALLEL) + message(WARNING "HDF5 found for language ${__lang} is parallel but previously found language is not parallel.") + elseif(HDF5_IS_PARALLEL AND NOT HDF5_${__lang}_IS_PARALLEL) + message(WARNING "HDF5 found for language ${__lang} is not parallel but previously found language is parallel.") + endif() + endif() + endforeach() +else() + set(_HDF5_NEED_TO_SEARCH True) +endif() + +if(NOT HDF5_FOUND AND HDF5_COMPILER_NO_INTERROGATE) + # No arguments necessary, all languages can use the compiler wrappers + set(HDF5_FOUND True) + set(HDF5_METHOD "Included by compiler wrappers") + set(HDF5_REQUIRED_VARS HDF5_METHOD) +elseif(NOT HDF5_FOUND AND NOT _HDF5_NEED_TO_SEARCH) + # Compiler wrappers aren't being used by the build but were found and used + # to determine necessary include and library flags + set(HDF5_INCLUDE_DIRS) + set(HDF5_LIBRARIES) + set(HDF5_HL_LIBRARIES) + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + if(HDF5_${__lang}_FOUND) + if(NOT HDF5_${__lang}_COMPILER_NO_INTERROGATE) + list(APPEND HDF5_DEFINITIONS ${HDF5_${__lang}_DEFINITIONS}) + list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIRS}) + list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES}) + if(FIND_HL) + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES}) + endif() + endif() + endif() + endforeach() + _HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES) + set(HDF5_FOUND True) + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES) + if(FIND_HL) + list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES) + endif() +endif() + +find_program( HDF5_DIFF_EXECUTABLE + NAMES h5diff + HINTS ${HDF5_ROOT} + PATH_SUFFIXES bin Bin + ${_HDF5_SEARCH_OPTS} + DOC "HDF5 file differencing tool." ) +mark_as_advanced( HDF5_DIFF_EXECUTABLE ) + +if( NOT HDF5_FOUND ) + # seed the initial lists of libraries to find with items we know we need + set(HDF5_C_LIBRARY_NAMES hdf5) + set(HDF5_C_HL_LIBRARY_NAMES hdf5_hl) + + set(HDF5_CXX_LIBRARY_NAMES hdf5_cpp ${HDF5_C_LIBRARY_NAMES}) + set(HDF5_CXX_HL_LIBRARY_NAMES hdf5_hl_cpp ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_CXX_LIBRARY_NAMES}) + + set(HDF5_Fortran_LIBRARY_NAMES hdf5_fortran ${HDF5_C_LIBRARY_NAMES}) + set(HDF5_Fortran_HL_LIBRARY_NAMES hdf5hl_fortran ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_Fortran_LIBRARY_NAMES}) + + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + # find the HDF5 include directories + if("${__lang}" STREQUAL "Fortran") + set(HDF5_INCLUDE_FILENAME hdf5.mod) + elseif("${__lang}" STREQUAL "CXX") + set(HDF5_INCLUDE_FILENAME H5Cpp.h) + else() + set(HDF5_INCLUDE_FILENAME hdf5.h) + endif() + + find_path(HDF5_${__lang}_INCLUDE_DIR ${HDF5_INCLUDE_FILENAME} + HINTS ${HDF5_ROOT} + PATHS $ENV{HOME}/.local/include + PATH_SUFFIXES include Include + ${_HDF5_SEARCH_OPTS} + ) + mark_as_advanced(HDF5_${__lang}_INCLUDE_DIR) + # set the _DIRS variable as this is what the user will normally use + set(HDF5_${__lang}_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR}) + list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR}) + + # find the HDF5 libraries + foreach(LIB IN LISTS HDF5_${__lang}_LIBRARY_NAMES) + if(HDF5_USE_STATIC_LIBRARIES) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See https://gitlab.kitware.com/cmake/cmake/issues/1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG + lib${LIB}d.a lib${LIB}_debug.a lib${LIB}d lib${LIB}_D lib${LIB}_debug + lib${LIB}d-static.a lib${LIB}_debug-static.a ${LIB}d-static ${LIB}_D-static ${LIB}_debug-static ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a lib${LIB} lib${LIB}-static.a ${LIB}-static) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ${LIB}_D ${LIB}_debug ${LIB}d-shared ${LIB}_D-shared ${LIB}_debug-shared) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ${LIB}-shared) + if(WIN32) + list(APPEND HDF5_DEFINITIONS "-DH5_BUILT_AS_DYNAMIC_LIB") + endif() + endif() + find_library(HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + if(HDF5_${__lang}_LIBRARIES) + set(HDF5_${__lang}_FOUND True) + endif() + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES}) + + if(FIND_HL) + foreach(LIB IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES) + if(HDF5_USE_STATIC_LIBRARIES) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See https://gitlab.kitware.com/cmake/cmake/issues/1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG + lib${LIB}d.a lib${LIB}_debug.a lib${LIB}d lib${LIB}_D lib${LIB}_debug + lib${LIB}d-static.a lib${LIB}_debug-static.a lib${LIB}d-static lib${LIB}_D-static lib${LIB}_debug-static ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a ${LIB} lib${LIB}-static.a lib${LIB}-static) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ${LIB}_D ${LIB}_debug ${LIB}d-shared ${LIB}_D-shared ${LIB}_debug-shared) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ${LIB}-shared) + endif() + find_library(HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES}) + endif() + endforeach() + if(FIND_HL AND HDF5_HL_LIBRARIES) + set(HDF5_HL_FOUND True) + endif() + + _HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES) + + # If the HDF5 include directory was found, open H5pubconf.h to determine if + # HDF5 was compiled with parallel IO support + set( HDF5_IS_PARALLEL FALSE ) + set( HDF5_VERSION "" ) + foreach( _dir IN LISTS HDF5_INCLUDE_DIRS ) + foreach(_hdr "${_dir}/H5pubconf.h" "${_dir}/H5pubconf-64.h" "${_dir}/H5pubconf-32.h") + if( EXISTS "${_hdr}" ) + file( STRINGS "${_hdr}" + HDF5_HAVE_PARALLEL_DEFINE + REGEX "HAVE_PARALLEL 1" ) + if( HDF5_HAVE_PARALLEL_DEFINE ) + set( HDF5_IS_PARALLEL TRUE ) + endif() + unset(HDF5_HAVE_PARALLEL_DEFINE) + + file( STRINGS "${_hdr}" + HDF5_VERSION_DEFINE + REGEX "^[ \t]*#[ \t]*define[ \t]+H5_VERSION[ \t]+" ) + if( "${HDF5_VERSION_DEFINE}" MATCHES + "H5_VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?\"" ) + set( HDF5_VERSION "${CMAKE_MATCH_1}" ) + if( CMAKE_MATCH_3 ) + set( HDF5_VERSION ${HDF5_VERSION}.${CMAKE_MATCH_3}) + endif() + endif() + unset(HDF5_VERSION_DEFINE) + endif() + endforeach() + endforeach() + set( HDF5_IS_PARALLEL ${HDF5_IS_PARALLEL} CACHE BOOL + "HDF5 library compiled with parallel IO support" ) + mark_as_advanced( HDF5_IS_PARALLEL ) + + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS) + if(FIND_HL) + list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES) + endif() +endif() + +# For backwards compatibility we set HDF5_INCLUDE_DIR to the value of +# HDF5_INCLUDE_DIRS +if( HDF5_INCLUDE_DIRS ) + set( HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIRS}" ) +endif() + +# If HDF5_REQUIRED_VARS is empty at this point, then it's likely that +# something external is trying to explicitly pass already found +# locations +if(NOT HDF5_REQUIRED_VARS) + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS) +endif() + +find_package_handle_standard_args(HDF5 + REQUIRED_VARS ${HDF5_REQUIRED_VARS} + VERSION_VAR HDF5_VERSION + HANDLE_COMPONENTS +) + +unset(_HDF5_SEARCH_OPTS) + +if( HDF5_FOUND AND NOT HDF5_DIR) + # hide HDF5_DIR for the non-advanced user to avoid confusion with + # HDF5_DIR-NOT_FOUND while HDF5 was found. + mark_as_advanced(HDF5_DIR) +endif() + +if (HDF5_FIND_DEBUG) + message(STATUS "HDF5_DIR: ${HDF5_DIR}") + message(STATUS "HDF5_DEFINITIONS: ${HDF5_DEFINITIONS}") + message(STATUS "HDF5_INCLUDE_DIRS: ${HDF5_INCLUDE_DIRS}") + message(STATUS "HDF5_LIBRARIES: ${HDF5_LIBRARIES}") + message(STATUS "HDF5_HL_LIBRARIES: ${HDF5_HL_LIBRARIES}") + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + message(STATUS "HDF5_${__lang}_DEFINITIONS: ${HDF5_${__lang}_DEFINITIONS}") + message(STATUS "HDF5_${__lang}_INCLUDE_DIR: ${HDF5_${__lang}_INCLUDE_DIR}") + message(STATUS "HDF5_${__lang}_INCLUDE_DIRS: ${HDF5_${__lang}_INCLUDE_DIRS}") + message(STATUS "HDF5_${__lang}_LIBRARY: ${HDF5_${__lang}_LIBRARY}") + message(STATUS "HDF5_${__lang}_LIBRARIES: ${HDF5_${__lang}_LIBRARIES}") + message(STATUS "HDF5_${__lang}_HL_LIBRARY: ${HDF5_${__lang}_HL_LIBRARY}") + message(STATUS "HDF5_${__lang}_HL_LIBRARIES: ${HDF5_${__lang}_HL_LIBRARIES}") + endforeach() +endif() diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI.cmake new file mode 100644 index 000000000..5cd2a2afe --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI.cmake @@ -0,0 +1,1514 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindMPI +# ------- +# +# Find a Message Passing Interface (MPI) implementation. +# +# The Message Passing Interface (MPI) is a library used to write +# high-performance distributed-memory parallel applications, and is +# typically deployed on a cluster. MPI is a standard interface (defined +# by the MPI forum) for which many implementations are available. +# +# Variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module exposes the components ``C``, ``CXX``, ``MPICXX`` and ``Fortran``. +# Each of these controls the various MPI languages to search for. +# The difference between ``CXX`` and ``MPICXX`` is that ``CXX`` refers to the +# MPI C API being usable from C++, whereas ``MPICXX`` refers to the MPI-2 C++ API +# that was removed again in MPI-3. +# +# Depending on the enabled components the following variables will be set: +# +# ``MPI_FOUND`` +# Variable indicating that MPI settings for all requested languages have been found. +# If no components are specified, this is true if MPI settings for all enabled languages +# were detected. Note that the ``MPICXX`` component does not affect this variable. +# ``MPI_VERSION`` +# Minimal version of MPI detected among the requested languages, or all enabled languages +# if no components were specified. +# +# This module will set the following variables per language in your +# project, where ```` is one of C, CXX, or Fortran: +# +# ``MPI__FOUND`` +# Variable indicating the MPI settings for ```` were found and that +# simple MPI test programs compile with the provided settings. +# ``MPI__COMPILER`` +# MPI compiler for ```` if such a program exists. +# ``MPI__COMPILE_OPTIONS`` +# Compilation options for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__COMPILE_DEFINITIONS`` +# Compilation definitions for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__INCLUDE_DIRS`` +# Include path(s) for MPI header. +# ``MPI__LINK_FLAGS`` +# Linker flags for MPI programs. +# ``MPI__LIBRARIES`` +# All libraries to link MPI programs against. +# +# Additionally, the following :prop_tgt:`IMPORTED` targets are defined: +# +# ``MPI::MPI_`` +# Target for using MPI from ````. +# +# The following variables indicating which bindings are present will be defined: +# +# ``MPI_MPICXX_FOUND`` +# Variable indicating whether the MPI-2 C++ bindings are present (introduced in MPI-2, removed with MPI-3). +# ``MPI_Fortran_HAVE_F77_HEADER`` +# True if the Fortran 77 header ``mpif.h`` is available. +# ``MPI_Fortran_HAVE_F90_MODULE`` +# True if the Fortran 90 module ``mpi`` can be used for accessing MPI (MPI-2 and higher only). +# ``MPI_Fortran_HAVE_F08_MODULE`` +# True if the Fortran 2008 ``mpi_f08`` is available to MPI programs (MPI-3 and higher only). +# +# If possible, the MPI version will be determined by this module. The facilities to detect the MPI version +# were introduced with MPI-1.2, and therefore cannot be found for older MPI versions. +# +# ``MPI__VERSION_MAJOR`` +# Major version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION_MINOR`` +# Minor version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION`` +# MPI version implemented for ```` by the MPI distribution. +# +# Note that there's no variable for the C bindings being accessible through ``mpi.h``, since the MPI standards +# always have required this binding to work in both C and C++ code. +# +# For running MPI programs, the module sets the following variables +# +# ``MPIEXEC_EXECUTABLE`` +# Executable for running MPI programs, if such exists. +# ``MPIEXEC_NUMPROC_FLAG`` +# Flag to pass to ``mpiexec`` before giving it the number of processors to run on. +# ``MPIEXEC_MAX_NUMPROCS`` +# Number of MPI processors to utilize. Defaults to the number +# of processors detected on the host system. +# ``MPIEXEC_PREFLAGS`` +# Flags to pass to ``mpiexec`` directly before the executable to run. +# ``MPIEXEC_POSTFLAGS`` +# Flags to pass to ``mpiexec`` after other flags. +# +# Variables for locating MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# This module performs a three step search for an MPI implementation: +# +# 1. Check if the compiler has MPI support built-in. This is the case if the user passed a +# compiler wrapper as ``CMAKE__COMPILER`` or if they're on a Cray system. +# 2. Attempt to find an MPI compiler wrapper and determine the compiler information from it. +# 3. Try to find an MPI implementation that does not ship such a wrapper by guessing settings. +# Currently, only Microsoft MPI and MPICH2 on Windows are supported. +# +# For controlling the second step, the following variables may be set: +# +# ``MPI__COMPILER`` +# Search for the specified compiler wrapper and use it. +# ``MPI__COMPILER_FLAGS`` +# Flags to pass to the MPI compiler wrapper during interrogation. Some compiler wrappers +# support linking debug or tracing libraries if a specific flag is passed and this variable +# may be used to obtain them. +# ``MPI_COMPILER_FLAGS`` +# Used to initialize ``MPI__COMPILER_FLAGS`` if no language specific flag has been given. +# Empty by default. +# ``MPI_EXECUTABLE_SUFFIX`` +# A suffix which is appended to all names that are being looked for. For instance you may set this +# to ``.mpich`` or ``.openmpi`` to prefer the one or the other on Debian and its derivatives. +# +# In order to control the guessing step, the following variable may be set: +# +# ``MPI_GUESS_LIBRARY_NAME`` +# Valid values are ``MSMPI`` and ``MPICH2``. If set, only the given library will be searched for. +# By default, ``MSMPI`` will be preferred over ``MPICH2`` if both are available. +# This also sets ``MPI_SKIP_COMPILER_WRAPPER`` to ``true``, which may be overridden. +# +# Each of the search steps may be skipped with the following control variables: +# +# ``MPI_ASSUME_NO_BUILTIN_MPI`` +# If true, the module assumes that the compiler itself does not provide an MPI implementation and +# skips to step 2. +# ``MPI_SKIP_COMPILER_WRAPPER`` +# If true, no compiler wrapper will be searched for. +# ``MPI_SKIP_GUESSING`` +# If true, the guessing step will be skipped. +# +# Additionally, the following control variable is available to change search behavior: +# +# ``MPI_CXX_SKIP_MPICXX`` +# Add some definitions that will disable the MPI-2 C++ bindings. +# Currently supported are MPICH, Open MPI, Platform MPI and derivatives thereof, +# for example MVAPICH or Intel MPI. +# +# If the find procedure fails for a variable ``MPI__WORKS``, then the settings detected by or passed to +# the module did not work and even a simple MPI test program failed to compile. +# +# If all of these parameters were not sufficient to find the right MPI implementation, a user may +# disable the entire autodetection process by specifying both a list of libraries in ``MPI__LIBRARIES`` +# and a list of include directories in ``MPI__ADDITIONAL_INCLUDE_DIRS``. +# Any other variable may be set in addition to these two. The module will then validate the MPI settings and store the +# settings in the cache. +# +# Cache variables for MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The variable ``MPI__INCLUDE_DIRS`` will be assembled from the following variables. +# For C and CXX: +# +# ``MPI__HEADER_DIR`` +# Location of the ``mpi.h`` header on disk. +# +# For Fortran: +# +# ``MPI_Fortran_F77_HEADER_DIR`` +# Location of the Fortran 77 header ``mpif.h``, if it exists. +# ``MPI_Fortran_MODULE_DIR`` +# Location of the ``mpi`` or ``mpi_f08`` modules, if available. +# +# For all languages the following variables are additionally considered: +# +# ``MPI__ADDITIONAL_INCLUDE_DIRS`` +# A :ref:`;-list ` of paths needed in addition to the normal include directories. +# ``MPI__INCLUDE_DIR`` +# Path variables for include folders referred to by ````. +# ``MPI__ADDITIONAL_INCLUDE_VARS`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# The variable ``MPI__LIBRARIES`` will be assembled from the following variables: +# +# ``MPI__LIBRARY`` +# The location of a library called ```` for use with MPI. +# ``MPI__LIB_NAMES`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# Usage of mpiexec +# ^^^^^^^^^^^^^^^^ +# +# When using ``MPIEXEC_EXECUTABLE`` to execute MPI applications, you should typically +# use all of the ``MPIEXEC_EXECUTABLE`` flags as follows: +# +# :: +# +# ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} +# ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS +# +# where ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to +# pass to the MPI program. +# +# Advanced variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module can perform some advanced feature detections upon explicit request. +# +# **Important notice:** The following checks cannot be performed without *executing* an MPI test program. +# Consider the special considerations for the behavior of :command:`try_run` during cross compilation. +# Moreover, running an MPI program can cause additional issues, like a firewall notification on some systems. +# You should only enable these detections if you absolutely need the information. +# +# If the following variables are set to true, the respective search will be performed: +# +# ``MPI_DETERMINE_Fortran_CAPABILITIES`` +# Determine for all available Fortran bindings what the values of ``MPI_SUBARRAYS_SUPPORTED`` and +# ``MPI_ASYNC_PROTECTS_NONBLOCKING`` are and make their values available as ``MPI_Fortran__SUBARRAYS`` +# and ``MPI_Fortran__ASYNCPROT``, where ```` is one of ``F77_HEADER``, ``F90_MODULE`` and +# ``F08_MODULE``. +# ``MPI_DETERMINE_LIBRARY_VERSION`` +# For each language, find the output of ``MPI_Get_library_version`` and make it available as ``MPI__LIBRARY_VERSION``. +# This information is usually tied to the runtime component of an MPI implementation and might differ depending on ````. +# Note that the return value is entirely implementation defined. This information might be used to identify +# the MPI vendor and for example pick the correct one of multiple third party binaries that matches the MPI vendor. +# +# Backward Compatibility +# ^^^^^^^^^^^^^^^^^^^^^^ +# +# For backward compatibility with older versions of FindMPI, these +# variables are set, but deprecated: +# +# :: +# +# MPI_COMPILER MPI_LIBRARY MPI_EXTRA_LIBRARY +# MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_LINK_FLAGS +# MPI_LIBRARIES +# +# In new projects, please use the ``MPI__XXX`` equivalents. +# Additionally, the following variables are deprecated: +# +# ``MPI__COMPILE_FLAGS`` +# Use ``MPI__COMPILE_OPTIONS`` and ``MPI__COMPILE_DEFINITIONS`` instead. +# ``MPI__INCLUDE_PATH`` +# For consumption use ``MPI__INCLUDE_DIRS`` and for specifying folders use ``MPI__ADDITIONAL_INCLUDE_DIRS`` instead. +# ``MPIEXEC`` +# Use ``MPIEXEC_EXECUTABLE`` instead. + +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) # if IN_LIST + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# Generic compiler names +set(_MPI_C_GENERIC_COMPILER_NAMES mpicc mpcc mpicc_r mpcc_r) +set(_MPI_CXX_GENERIC_COMPILER_NAMES mpicxx mpiCC mpcxx mpCC mpic++ mpc++ + mpicxx_r mpiCC_r mpcxx_r mpCC_r mpic++_r mpc++_r) +set(_MPI_Fortran_GENERIC_COMPILER_NAMES mpif95 mpif95_r mpf95 mpf95_r + mpif90 mpif90_r mpf90 mpf90_r + mpif77 mpif77_r mpf77 mpf77_r + mpifc) + +# GNU compiler names +set(_MPI_GNU_C_COMPILER_NAMES mpigcc mpgcc mpigcc_r mpgcc_r) +set(_MPI_GNU_CXX_COMPILER_NAMES mpig++ mpg++ mpig++_r mpg++_r mpigxx) +set(_MPI_GNU_Fortran_COMPILER_NAMES mpigfortran mpgfortran mpigfortran_r mpgfortran_r + mpig77 mpig77_r mpg77 mpg77_r) + +# Intel MPI compiler names on Windows +if(WIN32) + list(APPEND _MPI_C_GENERIC_COMPILER_NAMES mpicc.bat) + list(APPEND _MPI_CXX_GENERIC_COMPILER_NAMES mpicxx.bat) + list(APPEND _MPI_Fortran_GENERIC_COMPILER_NAMES mpifc.bat) + + # Intel MPI compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc.bat) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc.bat) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort.bat mpif77.bat mpif90.bat) + + # Intel MPI compiler names for MSMPI + set(_MPI_MSVC_C_COMPILER_NAMES mpicl.bat) + set(_MPI_MSVC_CXX_COMPILER_NAMES mpicl.bat) +else() + # Intel compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc mpiicxx mpiic++) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort mpiif95 mpiif90 mpiif77) +endif() + +# PGI compiler names +set(_MPI_PGI_C_COMPILER_NAMES mpipgcc mppgcc) +set(_MPI_PGI_CXX_COMPILER_NAMES mpipgCC mppgCC) +set(_MPI_PGI_Fortran_COMPILER_NAMES mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77) + +# XLC MPI Compiler names +set(_MPI_XL_C_COMPILER_NAMES mpxlc mpxlc_r mpixlc mpixlc_r) +set(_MPI_XL_CXX_COMPILER_NAMES mpixlcxx mpixlC mpixlc++ mpxlcxx mpxlc++ mpixlc++ mpxlCC + mpixlcxx_r mpixlC_r mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r) +set(_MPI_XL_Fortran_COMPILER_NAMES mpixlf95 mpixlf95_r mpxlf95 mpxlf95_r + mpixlf90 mpixlf90_r mpxlf90 mpxlf90_r + mpixlf77 mpixlf77_r mpxlf77 mpxlf77_r + mpixlf mpixlf_r mpxlf mpxlf_r) + +# Prepend vendor-specific compiler wrappers to the list. If we don't know the compiler, +# attempt all of them. +# By attempting vendor-specific compiler names first, we should avoid situations where the compiler wrapper +# stems from a proprietary MPI and won't know which compiler it's being used for. For instance, Intel MPI +# controls its settings via the I_MPI_CC environment variables if the generic name is being used. +# If we know which compiler we're working with, we can use the most specialized wrapper there is in order to +# pick up the right settings for it. +foreach (LANG IN ITEMS C CXX Fortran) + set(_MPI_${LANG}_COMPILER_NAMES "") + foreach (id IN ITEMS GNU Intel MSVC PGI XL) + if (NOT CMAKE_${LANG}_COMPILER_ID OR CMAKE_${LANG}_COMPILER_ID STREQUAL id) + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${id}_${LANG}_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + endif() + unset(_MPI_${id}_${LANG}_COMPILER_NAMES) + endforeach() + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${LANG}_GENERIC_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + unset(_MPI_${LANG}_GENERIC_COMPILER_NAMES) +endforeach() + +# Names to try for mpiexec +# Only mpiexec commands are guaranteed to behave as described in the standard, +# mpirun commands are not covered by the standard in any way whatsoever. +# lamexec is the executable for LAM/MPI, srun is for SLURM or Open MPI with SLURM support. +# srun -n X is however a valid command, so it behaves 'like' mpiexec. +set(_MPIEXEC_NAMES_BASE mpiexec mpiexec.hydra mpiexec.mpd mpirun lamexec srun) + +unset(_MPIEXEC_NAMES) +foreach(_MPIEXEC_NAME IN LISTS _MPIEXEC_NAMES_BASE) + list(APPEND _MPIEXEC_NAMES "${_MPIEXEC_NAME}${MPI_EXECUTABLE_SUFFIX}") +endforeach() +unset(_MPIEXEC_NAMES_BASE) + +function (_MPI_check_compiler LANG QUERY_FLAG OUTPUT_VARIABLE RESULT_VARIABLE) + if(DEFINED MPI_${LANG}_COMPILER_FLAGS) +# separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_${LANG}_COMPILER_FLAGS}") + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS "${MPI_${LANG}_COMPILER_FLAGS}") + else() + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_COMPILER_FLAGS}") + endif() + execute_process( + COMMAND ${MPI_${LANG}_COMPILER} ${_MPI_COMPILER_WRAPPER_OPTIONS} ${QUERY_FLAG} + OUTPUT_VARIABLE WRAPPER_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE WRAPPER_OUTPUT ERROR_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE WRAPPER_RETURN) + # Some compiler wrappers will yield spurious zero return values, for example + # Intel MPI tolerates unknown arguments and if the MPI wrappers loads a shared + # library that has invalid or missing version information there would be warning + # messages emitted by ld.so in the compiler output. In either case, we'll treat + # the output as invalid. + if("${WRAPPER_OUTPUT}" MATCHES "undefined reference|unrecognized|need to set|no version information available") + set(WRAPPER_RETURN 255) + endif() + # Ensure that no error output might be passed upwards. + if(NOT WRAPPER_RETURN EQUAL 0) + unset(WRAPPER_OUTPUT) + endif() + set(${OUTPUT_VARIABLE} "${WRAPPER_OUTPUT}" PARENT_SCOPE) + set(${RESULT_VARIABLE} "${WRAPPER_RETURN}" PARENT_SCOPE) +endfunction() + +function (_MPI_interrogate_compiler lang) + unset(MPI_COMPILE_CMDLINE) + unset(MPI_LINK_CMDLINE) + + unset(MPI_COMPILE_OPTIONS_WORK) + unset(MPI_COMPILE_DEFINITIONS_WORK) + unset(MPI_INCLUDE_DIRS_WORK) + unset(MPI_LINK_FLAGS_WORK) + unset(MPI_LIB_NAMES_WORK) + unset(MPI_LIB_FULLPATHS_WORK) + + # Check whether the -showme:compile option works. This indicates that we have either Open MPI + # or a newer version of LAM/MPI, and implies that -showme:link will also work. + # Open MPI also supports -show, but separates linker and compiler information + _MPI_check_compiler(${LANG} "-showme:compile" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme:link" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + + # MPICH and MVAPICH offer -compile-info and -link-info. + # For modern versions, both do the same as -show. However, for old versions, they do differ + # when called for mpicxx and mpif90 and it's necessary to use them over -show in order to find the + # removed MPI C++ bindings. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-compile-info" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-link-info" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + endif() + + # MPICH, MVAPICH2 and Intel MPI just use "-show". Open MPI also offers this, but the + # -showme commands are more specialized. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-show" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + # Older versions of LAM/MPI have "-showme". Open MPI also supports this. + # Unknown to MPICH, MVAPICH and Intel MPI. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + if (NOT (MPI_COMPILER_RETURN EQUAL 0) OR NOT (DEFINED MPI_COMPILE_CMDLINE)) + # Cannot interrogate this compiler, so exit. + set(MPI_${LANG}_WRAPPER_FOUND FALSE PARENT_SCOPE) + return() + endif() + unset(MPI_COMPILER_RETURN) + + # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE + # into MPI_LINK_CMDLINE, if we didn't find the link line. + if (NOT DEFINED MPI_LINK_CMDLINE) + set(MPI_LINK_CMDLINE "${MPI_COMPILE_CMDLINE}") + endif() + + # At this point, we obtained some output from a compiler wrapper that works. + # We'll now try to parse it into variables with meaning to us. + if("${LANG}" STREQUAL "Fortran") + # Some MPICH-1 and MVAPICH-1 versions return a three command answer for Fortran, consisting + # out of a symlink command for mpif.h, the actual compiler command and a deletion of the + # created symlink. We need to detect that case, remember the include path and drop the + # symlink/deletion operation to obtain the link/compile lines we'd usually expect. + if("${MPI_COMPILE_CMDLINE}" MATCHES "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h") + get_filename_component(MPI_INCLUDE_DIRS_WORK "${CMAKE_MATCH_1}" DIRECTORY) + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + endif() + + # The Intel MPI wrapper on Linux will emit some objcopy commands after its compile command + # if -static_mpi was passed to the wrapper. To avoid spurious matches, we need to drop these lines. + if(UNIX) + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + + # Extract compile options from the compile command line. + string(REGEX MATCHALL "(^| )-f([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_OPTIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_OPTION IN LISTS MPI_ALL_COMPILE_OPTIONS) + string(REGEX REPLACE "^ " "" _MPI_COMPILE_OPTION "${_MPI_COMPILE_OPTION}") + # Ignore -fstack-protector directives: These occur on MPICH and MVAPICH when the libraries + # themselves were built with this flag. However, this flag is unrelated to using MPI, and + # we won't match the accompanying --param-ssp-size and -Wp,-D_FORTIFY_SOURCE flags and therefore + # produce inconsistent results with the regularly flags. + # Similarly, aliasing flags do not belong into our flag array. + if(NOT "${_MPI_COMPILE_OPTION}" MATCHES "^-f(stack-protector|(no-|)strict-aliasing|PI[CE]|pi[ce])") + list(APPEND MPI_COMPILE_OPTIONS_WORK "${_MPI_COMPILE_OPTION}") + endif() + endforeach() + + # Same deal, with the definitions. We also treat arguments passed to the preprocessor directly. + string(REGEX MATCHALL "(^| )(-Wp,|-Xpreprocessor |)[-/]D([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_DEFINITIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_DEFINITION IN LISTS MPI_ALL_COMPILE_DEFINITIONS) + string(REGEX REPLACE "^ ?(-Wp,|-Xpreprocessor )?[-/]D" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + string(REPLACE "\"" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + if(NOT "${_MPI_COMPILE_DEFINITION}" MATCHES "^_FORTIFY_SOURCE.*") + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${_MPI_COMPILE_DEFINITION}") + endif() + endforeach() + + # Extract include paths from compile command line + string(REGEX MATCHALL "(^| )[-/]I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:incdirs. + if (NOT MPI_ALL_INCLUDE_PATHS) + _MPI_check_compiler(${LANG} "-showme:incdirs" MPI_INCDIRS_CMDLINE MPI_INCDIRS_COMPILER_RETURN) + if(MPI_INCDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_INCLUDE_PATHS NATIVE_COMMAND "${MPI_INCDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_INCLUDE_PATH IN LISTS MPI_ALL_INCLUDE_PATHS) + string(REGEX REPLACE "^ ?[-/]I" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + string(REPLACE "\"" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + get_filename_component(_MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}" REALPATH) + list(APPEND MPI_INCLUDE_DIRS_WORK "${_MPI_INCLUDE_PATH}") + endforeach() + + # Extract linker paths from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker |)(-L|[/-]LIBPATH:|[/-]libpath:)([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:libdirs. + if (NOT MPI_ALL_LINK_PATHS) + _MPI_check_compiler(${LANG} "-showme:libdirs" MPI_LIBDIRS_CMDLINE MPI_LIBDIRS_COMPILER_RETURN) + if(MPI_LIBDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_LINK_PATHS NATIVE_COMMAND "${MPI_LIBDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_LPATH IN LISTS MPI_ALL_LINK_PATHS) + string(REGEX REPLACE "^ ?(-Wl,|-Xlinker )?(-L|[/-]LIBPATH:|[/-]libpath:)" "" _MPI_LPATH "${_MPI_LPATH}") + string(REPLACE "\"" "" _MPI_LPATH "${_MPI_LPATH}") + get_filename_component(_MPI_LPATH "${_MPI_LPATH}" REALPATH) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${_MPI_LPATH}") + endforeach() + + # Extract linker flags from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker )([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LINK_FLAG IN LISTS MPI_ALL_LINK_FLAGS) + string(STRIP "${_MPI_LINK_FLAG}" _MPI_LINK_FLAG) + # MPI might be marked to build with non-executable stacks but this should not propagate. + if (NOT "${_MPI_LINK_FLAG}" MATCHES "(-Wl,|-Xlinker )-z,noexecstack") + if (MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " ${_MPI_LINK_FLAG}") + else() + set(MPI_LINK_FLAGS_WORK "${_MPI_LINK_FLAG}") + endif() + endif() + endforeach() + + # Extract the set of libraries to link against from the link command + # line + string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ ?-l" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + + if(WIN32) + # A compiler wrapper on Windows will just have the name of the + # library to link on its link line, potentially with a full path + string(REGEX MATCHALL "(^| )([^\" ]+\\.lib|\"[^\"]+\\.lib\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + else() + # On UNIX platforms, archive libraries can be given with full path. + string(REGEX MATCHALL "(^| )([^\" ]+\\.a|\"[^\"]+\\.a\")" MPI_LIBFULLPATHS "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBFULLPATHS) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + endif() + + # An MPI compiler wrapper could have its MPI libraries in the implictly + # linked directories of the compiler itself. + if(DEFINED CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}") + endif() + + # Determine full path names for all of the libraries that one needs + # to link against in an MPI program + unset(MPI_PLAIN_LIB_NAMES_WORK) + foreach(_MPI_LIB_NAME IN LISTS MPI_LIB_NAMES_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_NAME}" NAME_WE) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${MPI_LINK_DIRECTORIES_WORK} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + + # Deal with the libraries given with full path next + unset(MPI_DIRECT_LIB_NAMES_WORK) + foreach(_MPI_LIB_FULLPATH IN LISTS MPI_LIB_FULLPATHS_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME) + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_FULLPATH}" DIRECTORY) + list(APPEND MPI_DIRECT_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_PATH} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + if(MPI_DIRECT_LIB_NAMES_WORK) + set(MPI_PLAIN_LIB_NAMES_WORK "${MPI_DIRECT_LIB_NAMES_WORK};${MPI_PLAIN_LIB_NAMES_WORK}") + endif() + + # MPI might require pthread to work. The above mechanism wouldn't detect it, but we need to + # link it in that case. -lpthread is covered by the normal library treatment on the other hand. + if("${MPI_COMPILE_CMDLINE}" MATCHES "-pthread") + list(APPEND MPI_COMPILE_OPTIONS_WORK "-pthread") + if(MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " -pthread") + else() + set(MPI_LINK_FLAGS_WORK "-pthread") + endif() + endif() + + if(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS}") + endif() + if(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + list(APPEND MPI_COMPILE_OPTIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_EXTRA_LIB_NAMES) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${MPI_${LANG}_EXTRA_LIB_NAMES}") + endif() + + # If we found MPI, set up all of the appropriate cache entries + if(NOT MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_COMPILE_OPTIONS_WORK} CACHE STRING "MPI ${LANG} compilation options" FORCE) + endif() + if(NOT MPI_${LANG}_COMPILE_DEFINITIONS) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_COMPILE_DEFINITIONS_WORK} CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_INCLUDE_DIRS_WORK} CACHE STRING "MPI ${LANG} additional include directories" FORCE) + endif() + if(NOT MPI_${LANG}_LINK_FLAGS) + set(MPI_${LANG}_LINK_FLAGS ${MPI_LINK_FLAGS_WORK} CACHE STRING "MPI ${LANG} linker flags" FORCE) + endif() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES ${MPI_PLAIN_LIB_NAMES_WORK} CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + set(MPI_${LANG}_WRAPPER_FOUND TRUE PARENT_SCOPE) +endfunction() + +function(_MPI_guess_settings LANG) + set(MPI_GUESS_FOUND FALSE) + # Currently only MSMPI and MPICH2 on Windows are supported, so we can skip this search if we're not targeting that. + if(WIN32) + # MSMPI + + # The environment variables MSMPI_INC and MSMPILIB32/64 are the only ways of locating the MSMPI_SDK, + # which is installed separately from the runtime. Thus it's possible to have mpiexec but not MPI headers + # or import libraries and vice versa. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MSMPI") + # We first attempt to locate the msmpi.lib. Should be find it, we'll assume that the MPI present is indeed + # Microsoft MPI. + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB64}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x64") + else() + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB32}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x86") + endif() + + find_library(MPI_msmpi_LIBRARY + NAMES msmpi + HINTS ${MPI_MSMPI_LIB_PATH} + DOC "Location of the msmpi library for Microsoft MPI") + mark_as_advanced(MPI_msmpi_LIBRARY) + + if(MPI_msmpi_LIBRARY) + # Next, we attempt to locate the MPI header. Note that for Fortran we know that mpif.h is a way + # MSMPI can be used and therefore that header has to be present. + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + get_filename_component(MPI_MSMPI_INC_DIR "$ENV{MSMPI_INC}" REALPATH) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MSMPI_INC_DIR}" CACHE STRING "MPI ${LANG} additional include directories" FORCE) + unset(MPI_MSMPI_INC_DIR) + endif() + + # For MSMPI, one can compile the MPI module by building the mpi.f90 shipped with the MSMPI SDK, + # thus it might be present or provided by the user. Figuring out which is supported is done later on. + # The PGI Fortran compiler for instance ships a prebuilt set of modules in its own include folder. + # Should a user be employing PGI or have built its own set and provided it via cache variables, the + # splitting routine would have located the module files. + + # For C and C++, we're done here (MSMPI does not ship the MPI-2 C++ bindings) - however, for Fortran + # we need some extra library to glue Fortran support together: + # MSMPI ships 2-4 Fortran libraries, each for different Fortran compiler behaviors. The library names + # ending with a c are using the cdecl calling convention, whereas those ending with an s are for Fortran + # implementations using stdcall. Therefore, the 64-bit MSMPI only ships those ending in 'c', whereas the 32-bit + # has both variants available. + # The second difference is the last but one letter, if it's an e(nd), the length of a string argument is + # passed by the Fortran compiler after all other arguments on the parameter list, if it's an m(ixed), + # it's passed immediately after the string address. + + # To summarize: + # - msmpifec: CHARACTER length passed after the parameter list and using cdecl calling convention + # - msmpifmc: CHARACTER length passed directly after string address and using cdecl calling convention + # - msmpifes: CHARACTER length passed after the parameter list and using stdcall calling convention + # - msmpifms: CHARACTER length passed directly after string address and using stdcall calling convention + # 32-bit MSMPI ships all four libraries, 64-bit MSMPI ships only the first two. + + # As is, Intel Fortran and PGI Fortran both use the 'ec' variant of the calling convention, whereas + # the old Compaq Visual Fortran compiler defaulted to the 'ms' version. It's possible to make Intel Fortran + # use the CVF calling convention using /iface:cvf, but we assume - and this is also assumed in FortranCInterface - + # this isn't the case. It's also possible to make CVF use the 'ec' variant, using /iface=(cref,nomixed_str_len_arg). + + # Our strategy is now to locate all libraries, but enter msmpifec into the LIB_NAMES array. + # Should this not be adequate it's a straightforward way for a user to change the LIB_NAMES array and + # have his library found. Still, this should not be necessary outside of exceptional cases, as reasoned. + if ("${LANG}" STREQUAL "Fortran") + set(MPI_MSMPI_CALLINGCONVS c) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 4) + list(APPEND MPI_MSMPI_CALLINGCONVS s) + endif() + foreach(mpistrlenpos IN ITEMS e m) + foreach(mpicallingconv IN LISTS MPI_MSMPI_CALLINGCONVS) + find_library(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY + NAMES msmpif${mpistrlenpos}${mpicallingconv} + HINTS "${MPI_MSMPI_LIB_PATH}" + DOC "Location of the msmpi${mpistrlenpos}${mpicallingconv} library for Microsoft MPI") + mark_as_advanced(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY) + endforeach() + endforeach() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi;msmpifec" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + + # At this point we're *not* done. MSMPI requires an additional include file for Fortran giving the value + # of MPI_AINT. This file is called mpifptr.h located in the x64 and x86 subfolders, respectively. + find_path(MPI_mpifptr_INCLUDE_DIR + NAMES "mpifptr.h" + HINTS "${MPI_MSMPI_INC_PATH_EXTRA}" + DOC "Location of the mpifptr.h extra header for Microsoft MPI") + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS "mpifptr" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + mark_as_advanced(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS MPI_mpifptr_INCLUDE_DIR) + else() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + endif() + mark_as_advanced(MPI_${LANG}_LIB_NAMES) + set(MPI_GUESS_FOUND TRUE) + endif() + endif() + + # At this point there's not many MPIs that we could still consider. + # OpenMPI 1.6.x and below supported Windows, but these ship compiler wrappers that still work. + # The only other relevant MPI implementation without a wrapper is MPICH2, which had Windows support in 1.4.1p1 and older. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MPICH2") + set(MPI_MPICH_PREFIX_PATHS + "$ENV{ProgramW6432}/MPICH2/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH\\SMPD;binary]/../lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH2;Path]/lib" + ) + + # All of C, C++ and Fortran will need mpi.lib, so we'll look for this first + find_library(MPI_mpi_LIBRARY + NAMES mpi + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_mpi_LIBRARY) + # If we found mpi.lib, we detect the rest of MPICH2 + if(MPI_mpi_LIBRARY) + set(MPI_MPICH_LIB_NAMES "mpi") + # If MPI-2 C++ bindings are requested, we need to locate cxx.lib as well. + # Otherwise, MPICH_SKIP_MPICXX will be defined and these bindings aren't needed. + if("${LANG}" STREQUAL "CXX" AND NOT MPI_CXX_SKIP_MPICXX) + find_library(MPI_cxx_LIBRARY + NAMES cxx + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_cxx_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "cxx") + # For Fortran, MPICH2 provides three different libraries: + # fmpich2.lib which uses uppercase symbols and cdecl, + # fmpich2s.lib which uses uppercase symbols and stdcall (32-bit only), + # fmpich2g.lib which uses lowercase symbols with double underscores and cdecl. + # fmpich2s.lib would be useful for Compaq Visual Fortran, fmpich2g.lib has to be used with GNU g77 and is also + # provided in the form of an .a archive for MinGW and Cygwin. From our perspective, fmpich2.lib is the only one + # we need to try, and if it doesn't work with the given Fortran compiler we'd find out later on during validation + elseif("${LANG}" STREQUAL "Fortran") + find_library(MPI_fmpich2_LIBRARY + NAMES fmpich2 + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2s_LIBRARY + NAMES fmpich2s + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2g_LIBRARY + NAMES fmpich2g + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_fmpich2_LIBRARY MPI_fmpich2s_LIBRARY MPI_fmpich2g_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "fmpich2") + endif() + + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "${MPI_MPICH_LIB_NAMES}" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + unset(MPI_MPICH_LIB_NAMES) + + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + # For MPICH2, the include folder would be in ../include relative to the library folder. + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_mpi_LIBRARY}" DIRECTORY) + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_MPICH_ROOT_DIR}" DIRECTORY) + if(IS_DIRECTORY "${MPI_MPICH_ROOT_DIR}/include") + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MPICH_ROOT_DIR}/include" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + unset(MPI_MPICH_ROOT_DIR) + endif() + set(MPI_GUESS_FOUND TRUE) + endif() + unset(MPI_MPICH_PREFIX_PATHS) + endif() + endif() + set(MPI_${LANG}_GUESS_FOUND "${MPI_GUESS_FOUND}" PARENT_SCOPE) +endfunction() + +function(_MPI_adjust_compile_definitions LANG) + if("${LANG}" STREQUAL "CXX") + # To disable the C++ bindings, we need to pass some definitions since the mpi.h header has to deal with both C and C++ + # bindings in MPI-2. + if(MPI_CXX_SKIP_MPICXX AND NOT MPI_${LANG}_COMPILE_DEFINITIONS MATCHES "SKIP_MPICXX") + # MPICH_SKIP_MPICXX is being used in MPICH and derivatives like MVAPICH or Intel MPI + # OMPI_SKIP_MPICXX is being used in Open MPI + # _MPICC_H is being used for IBM Platform MPI + list(APPEND MPI_${LANG}_COMPILE_DEFINITIONS "MPICH_SKIP_MPICXX" "OMPI_SKIP_MPICXX" "_MPICC_H") + set(MPI_${LANG}_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}" CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + endif() +endfunction() + +macro(_MPI_assemble_libraries LANG) + set(MPI_${LANG}_LIBRARIES "") + # Only for libraries do we need to check whether the compiler's linking stage is separate. + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS_IMPLICIT) + foreach(mpilib IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_LIBRARIES ${MPI_${mpilib}_LIBRARY}) + endforeach() + endif() +endmacro() + +macro(_MPI_assemble_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_${LANG}_INCLUDE_DIRS "") + else() + set(MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS}") + if("${LANG}" MATCHES "(C|CXX)") + if(MPI_${LANG}_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + else() # Fortran + if(MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_F77_HEADER_DIR}") + endif() + if(MPI_${LANG}_MODULE_DIR AND NOT "${MPI_${LANG}_MODULE_DIR}" IN_LIST MPI_${LANG}_INCLUDE_DIRS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_MODULE_DIR}") + endif() + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(MPI_ADDITIONAL_INC_DIR IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${MPI_ADDITIONAL_INC_DIR}_INCLUDE_DIR}") + endforeach() + endif() + endif() +endmacro() + +function(_MPI_split_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + return() + endif() + # Backwards compatibility: Search INCLUDE_PATH if given. + if(MPI_${LANG}_INCLUDE_PATH) + list(APPEND MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_INCLUDE_PATH}") + endif() + + # We try to find the headers/modules among those paths (and system paths) + # For C/C++, we just need to have a look for mpi.h. + if("${LANG}" MATCHES "(C|CXX)") + find_path(MPI_${LANG}_HEADER_DIR "mpi.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + mark_as_advanced(MPI_${LANG}_HEADER_DIR) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + # Fortran is more complicated here: An implementation could provide + # any of the Fortran 77/90/2008 APIs for MPI. For example, MSMPI + # only provides Fortran 77 and - if mpi.f90 is built - potentially + # a Fortran 90 module. + elseif("${LANG}" STREQUAL "Fortran") + find_path(MPI_${LANG}_F77_HEADER_DIR "mpif.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + find_path(MPI_${LANG}_MODULE_DIR + NAMES "mpi.mod" "mpi_f08.mod" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS + "${MPI_${LANG}_F77_HEADER_DIR}" + "${MPI_${LANG}_MODULE_DIR}" + ) + endif() + mark_as_advanced(MPI_${LANG}_F77_HEADER_DIR MPI_${LANG}_MODULE_DIR) + endif() + # Remove duplicates and default system directories from the list. + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_DUPLICATES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + foreach(MPI_IMPLICIT_INC_DIR IN LISTS CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_IMPLICIT_INC_DIR}) + endforeach() + endif() + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories" FORCE) +endfunction() + +macro(_MPI_create_imported_target LANG) + if(NOT TARGET MPI::MPI_${LANG}) + add_library(MPI::MPI_${LANG} INTERFACE IMPORTED) + endif() + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}") + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}") + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_LINK_LIBRARIES "") + if(MPI_${LANG}_LINK_FLAGS) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LINK_FLAGS}") + endif() + # If the compiler links MPI implicitly, no libraries will be found as they're contained within + # CMAKE__IMPLICIT_LINK_LIBRARIES already. + if(MPI_${LANG}_LIBRARIES) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LIBRARIES}") + endif() + # Given the new design of FindMPI, INCLUDE_DIRS will always be located, even under implicit linking. + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${MPI_${LANG}_INCLUDE_DIRS}") +endmacro() + +function(_MPI_try_staged_settings LANG MPI_TEST_FILE_NAME MODE RUN_BINARY) + set(WORK_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI") + set(SRC_DIR "${CMAKE_CURRENT_LIST_DIR}/FindMPI") + set(BIN_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI/${MPI_TEST_FILE_NAME}_${LANG}.bin") + unset(MPI_TEST_COMPILE_DEFINITIONS) + if("${LANG}" STREQUAL "Fortran") + if("${MODE}" STREQUAL "F90_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi\n implicit none") + elseif("${MODE}" STREQUAL "F08_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi_f08\n implicit none") + else() # F77 header + set(MPI_Fortran_INCLUDE_LINE "implicit none\n include 'mpif.h'") + endif() + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.f90.in" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90" @ONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90") + elseif("${LANG}" STREQUAL "CXX") + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.c" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp" COPYONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp") + if("${MODE}" STREQUAL "TEST_MPICXX") + set(MPI_TEST_COMPILE_DEFINITIONS TEST_MPI_MPICXX) + endif() + else() # C + set(MPI_TEST_SOURCE_FILE "${SRC_DIR}/${MPI_TEST_FILE_NAME}.c") + endif() + if(RUN_BINARY) + try_run(MPI_RUN_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + RUN_OUTPUT_VARIABLE MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}) + set(MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} "${MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}}" PARENT_SCOPE) + else() + try_compile(MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + COPY_FILE "${BIN_FILE}") + endif() +endfunction() + +macro(_MPI_check_lang_works LANG) + # For Fortran we may have by the MPI-3 standard an implementation that provides: + # - the mpi_f08 module + # - *both*, the mpi module and 'mpif.h' + # Since older MPI standards (MPI-1) did not define anything but 'mpif.h', we need to check all three individually. + if( NOT MPI_${LANG}_WORKS ) + if("${LANG}" STREQUAL "Fortran") + set(MPI_Fortran_INTEGER_LINE "(kind=MPI_INTEGER_KIND)") + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F90_MODULE FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F08_MODULE FALSE) + + set(MPI_${LANG}_WORKS FALSE) + + foreach(mpimethod IN ITEMS F77_HEADER F08_MODULE F90_MODULE) + if(MPI_RESULT_${LANG}_test_mpi_${mpimethod}) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_${mpimethod} TRUE) + else() + set(MPI_${LANG}_HAVE_${mpimethod} FALSE) + endif() + endforeach() + # MPI-1 versions had no MPI_INTGER_KIND defined, so we need to try without it. + # However, MPI-1 also did not define the Fortran 90 and 08 modules, so we only try the F77 header. + unset(MPI_Fortran_INTEGER_LINE) + if(NOT MPI_${LANG}_WORKS) + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER_NOKIND FALSE) + if(MPI_RESULT_${LANG}_test_mpi_F77_HEADER_NOKIND) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_F77_HEADER TRUE) + endif() + endif() + else() + _MPI_try_staged_settings(${LANG} test_mpi normal FALSE) + # If 'test_mpi' built correctly, we've found valid MPI settings. There might not be MPI-2 C++ support, but there can't + # be MPI-2 C++ support without the C bindings being present, so checking for them is sufficient. + set(MPI_${LANG}_WORKS "${MPI_RESULT_${LANG}_test_mpi_normal}") + endif() + endif() +endmacro() + +# Some systems install various MPI implementations in separate folders in some MPI prefix +# This macro enumerates all such subfolders and adds them to the list of hints that will be searched. +macro(MPI_search_mpi_prefix_folder PREFIX_FOLDER) + if(EXISTS "${PREFIX_FOLDER}") + file(GLOB _MPI_folder_children RELATIVE "${PREFIX_FOLDER}" "${PREFIX_FOLDER}/*") + foreach(_MPI_folder_child IN LISTS _MPI_folder_children) + if(IS_DIRECTORY "${PREFIX_FOLDER}/${_MPI_folder_child}") + list(APPEND MPI_HINT_DIRS "${PREFIX_FOLDER}/${_MPI_folder_child}") + endif() + endforeach() + endif() +endmacro() + +set(MPI_HINT_DIRS ${MPI_HOME} $ENV{MPI_ROOT} $ENV{MPI_HOME} $ENV{I_MPI_ROOT}) +if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux") + # SUSE Linux Enterprise Server stores its MPI implementations under /usr/lib64/mpi/gcc/ + # We enumerate the subfolders and append each as a prefix + MPI_search_mpi_prefix_folder("/usr/lib64/mpi/gcc") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # MSMPI stores its runtime in a special folder, this adds the possible locations to the hints. + list(APPEND MPI_HINT_DIRS $ENV{MSMPI_BIN} "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MPI;InstallRoot]") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "FreeBSD") + # FreeBSD ships mpich under the normal system paths - but available openmpi implementations + # will be found in /usr/local/mpi/ + MPI_search_mpi_prefix_folder("/usr/local/mpi") +endif() + +# Most MPI distributions have some form of mpiexec or mpirun which gives us something we can look for. +# The MPI standard does not mandate the existence of either, but instead only makes requirements if a distribution +# ships an mpiexec program (mpirun executables are not regulated by the standard). +find_program(MPIEXEC_EXECUTABLE + NAMES ${_MPIEXEC_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${MPI_HINT_DIRS} + DOC "Executable for running MPI programs.") + +# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin). +# This gives us a fairly reliable base directory to search for /bin /lib and /include from. +get_filename_component(_MPI_BASE_DIR "${MPIEXEC_EXECUTABLE}" PATH) +get_filename_component(_MPI_BASE_DIR "${_MPI_BASE_DIR}" PATH) + +# According to the MPI standard, section 8.8 -n is a guaranteed, and the only guaranteed way to +# launch an MPI process using mpiexec if such a program exists. +set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "Flag used by MPI to specify the number of processes for mpiexec; the next option will be the number of processes.") +set(MPIEXEC_PREFLAGS "" CACHE STRING "These flags will be directly before the executable that is being run by mpiexec.") +set(MPIEXEC_POSTFLAGS "" CACHE STRING "These flags will be placed after all flags passed to mpiexec.") + +# Set the number of processes to the physical processor count +cmake_host_system_information(RESULT _MPIEXEC_NUMPROCS QUERY NUMBER_OF_PHYSICAL_CORES) +set(MPIEXEC_MAX_NUMPROCS "${_MPIEXEC_NUMPROCS}" CACHE STRING "Maximum number of processors available to run MPI applications.") +unset(_MPIEXEC_NUMPROCS) +mark_as_advanced(MPIEXEC_EXECUTABLE MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS) + +#============================================================================= +# Backward compatibility input hacks. Propagate the FindMPI hints to C and +# CXX if the respective new versions are not defined. Translate the old +# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${LANG}_LIBRARIES. +# +# Once we find the new variables, we translate them back into their old +# equivalents below. +if(NOT MPI_IGNORE_LEGACY_VARIABLES) + foreach (LANG IN ITEMS C CXX) + # Old input variables. + set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS) + + # Set new vars based on their old equivalents, if the new versions are not already set. + foreach (var ${_MPI_OLD_INPUT_VARS}) + if (NOT MPI_${LANG}_${var} AND MPI_${var}) + set(MPI_${LANG}_${var} "${MPI_${var}}") + endif() + endforeach() + + # Chop the old compile flags into options and definitions + + unset(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + unset(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + if(MPI_${LANG}_COMPILE_FLAGS) + separate_arguments(MPI_SEPARATE_FLAGS NATIVE_COMMAND "${MPI_${LANG}_COMPILE_FLAGS}") + foreach(_MPI_FLAG IN LISTS MPI_SEPARATE_FLAGS) + if("${_MPI_FLAG}" MATCHES "^ *[-/D]([^ ]+)") + list(APPEND MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS "${CMAKE_MATCH_1}") + else() + list(APPEND MPI_${LANG}_EXTRA_COMPILE_OPTIONS "${_MPI_FLAG}") + endif() + endforeach() + unset(MPI_SEPARATE_FLAGS) + endif() + + # If a list of libraries was given, we'll split it into new-style cache variables + unset(MPI_${LANG}_EXTRA_LIB_NAMES) + if(NOT MPI_${LANG}_LIB_NAMES) + foreach(_MPI_LIB IN LISTS MPI_${LANG}_LIBRARIES MPI_LIBRARY MPI_EXTRA_LIBRARY) + if(_MPI_LIB) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB}" NAME) + get_filename_component(_MPI_LIB_DIR "${_MPI_LIB}" DIRECTORY) + list(APPEND MPI_${LANG}_EXTRA_LIB_NAMES "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_DIR} $ENV{MPI_LIB} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endif() + endforeach() + endif() + endforeach() +endif() +#============================================================================= + +unset(MPI_VERSION) +unset(MPI_VERSION_MAJOR) +unset(MPI_VERSION_MINOR) + +unset(_MPI_MIN_VERSION) + +# If the user specified a library name we assume they prefer that library over a wrapper. If not, they can disable skipping manually. +if(NOT DEFINED MPI_SKIP_COMPILER_WRAPPER AND MPI_GUESS_LIBRARY_NAME) + set(MPI_SKIP_COMPILER_WRAPPER TRUE) +endif() + +# This loop finds the compilers and sends them off for interrogation. +foreach(LANG IN ITEMS C CXX Fortran) + if(CMAKE_${LANG}_COMPILER_LOADED) + if(NOT MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} IN_LIST MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} STREQUAL CXX AND NOT MPI_CXX_SKIP_MPICXX AND MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(_MPI_FIND_${LANG} TRUE) + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + if(_MPI_FIND_${LANG}) + if( ${LANG} STREQUAL CXX AND NOT MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(MPI_CXX_SKIP_MPICXX FALSE CACHE BOOL "If true, the MPI-2 C++ bindings are disabled using definitions.") + mark_as_advanced(MPI_CXX_SKIP_MPICXX) + endif() + if(NOT (MPI_${LANG}_LIB_NAMES AND (MPI_${LANG}_INCLUDE_PATH OR MPI_${LANG}_INCLUDE_DIRS OR MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS))) + set(MPI_${LANG}_TRIED_IMPLICIT FALSE) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + if(NOT MPI_${LANG}_COMPILER AND NOT MPI_ASSUME_NO_BUILTIN_MPI) + # Should the imported targets be empty, we effectively try whether the compiler supports MPI on its own, which is the case on e.g. + # Cray PrgEnv. + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + + # If the compiler can build MPI code on its own, it functions as an MPI compiler and we'll set the variable to point to it. + if(MPI_${LANG}_WORKS) + set(MPI_${LANG}_COMPILER "${CMAKE_${LANG}_COMPILER}" CACHE FILEPATH "MPI compiler for ${LANG}" FORCE) + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + set(MPI_${LANG}_TRIED_IMPLICIT TRUE) + endif() + + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WRAPPER_FOUND FALSE) + set(MPI_PINNED_COMPILER FALSE) + + if(NOT MPI_SKIP_COMPILER_WRAPPER) + if(MPI_${LANG}_COMPILER) + # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler. + if (NOT IS_ABSOLUTE "${MPI_${LANG}_COMPILER}") + # Get rid of our default list of names and just search for the name the user wants. + set(_MPI_${LANG}_COMPILER_NAMES "${MPI_${LANG}_COMPILER}") + unset(MPI_${LANG}_COMPILER CACHE) + endif() + # If the user specifies a compiler, we don't want to try to search libraries either. + set(MPI_PINNED_COMPILER TRUE) + endif() + + # If we have an MPI base directory, we'll try all compiler names in that one first. + # This should prevent mixing different MPI environments + if(_MPI_BASE_DIR) + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${_MPI_BASE_DIR} + NO_DEFAULT_PATH + DOC "MPI compiler for ${LANG}" + ) + endif() + + # If the base directory did not help (for example because the mpiexec isn't in the same directory as the compilers), + # we shall try searching in the default paths. + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + DOC "MPI compiler for ${LANG}" + ) + + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_PINNED_COMPILER TRUE) + + # If we haven't made the implicit compiler test yet, perform it now. + if(NOT MPI_${LANG}_TRIED_IMPLICIT) + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + endif() + + # Should the MPI compiler not work implicitly for MPI, still interrogate it. + # Otherwise, MPI compilers for which CMake has separate linking stages, e.g. Intel MPI on Windows where link.exe is being used + # directly during linkage instead of CMAKE__COMPILER will not work. + if(NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + _MPI_interrogate_compiler(${LANG}) + else() + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + elseif(MPI_${LANG}_COMPILER) + _MPI_interrogate_compiler(${LANG}) + endif() + endif() + + if(NOT MPI_SKIP_GUESSING AND NOT MPI_${LANG}_WRAPPER_FOUND AND NOT MPI_PINNED_COMPILER) + # For C++, we may use the settings for C. Should a given compiler wrapper for C++ not exist, but one for C does, we copy over the + # settings for C. An MPI distribution that is in this situation would be IBM Platform MPI. + if("${LANG}" STREQUAL "CXX" AND MPI_C_WRAPPER_FOUND) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_C_COMPILE_OPTIONS} CACHE STRING "MPI ${LANG} compilation options" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS} CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_C_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS ${MPI_C_LINK_FLAGS} CACHE STRING "MPI ${LANG} linker flags" ) + set(MPI_${LANG}_LIB_NAMES ${MPI_C_LIB_NAMES} CACHE STRING "MPI ${LANG} libraries to link against" ) + else() + _MPI_guess_settings(${LANG}) + endif() + endif() + endif() + endif() + + _MPI_split_include_dirs(${LANG}) + _MPI_assemble_include_dirs(${LANG}) + _MPI_assemble_libraries(${LANG}) + + _MPI_adjust_compile_definitions(${LANG}) + # We always create imported targets even if they're empty + _MPI_create_imported_target(${LANG}) + + if(NOT MPI_${LANG}_WORKS) + _MPI_check_lang_works(${LANG}) + endif() + + # Next, we'll initialize the MPI variables that have not been previously set. + set(MPI_${LANG}_COMPILE_OPTIONS "" CACHE STRING "MPI ${LANG} compilation flags" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS "" CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "" CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS "" CACHE STRING "MPI ${LANG} linker flags" ) + if(NOT MPI_${LANG}_COMPILER STREQUAL CMAKE_${LANG}_COMPILER) + set(MPI_${LANG}_LIB_NAMES "" CACHE STRING "MPI ${LANG} libraries to link against" ) + endif() + mark_as_advanced(MPI_${LANG}_COMPILE_OPTIONS MPI_${LANG}_COMPILE_DEFINITIONS MPI_${LANG}_LINK_FLAGS + MPI_${LANG}_LIB_NAMES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS MPI_${LANG}_COMPILER) + + # If we've found MPI, then we'll perform additional analysis: Determine the MPI version, MPI library version, supported + # MPI APIs (i.e. MPI-2 C++ bindings). For Fortran we also need to find specific parameters if we're under MPI-3. + if(MPI_${LANG}_WORKS) + if("${LANG}" STREQUAL "CXX" AND NOT DEFINED MPI_MPICXX_FOUND) + if(NOT MPI_CXX_SKIP_MPICXX AND NOT MPI_CXX_VALIDATE_SKIP_MPICXX) + _MPI_try_staged_settings(${LANG} test_mpi MPICXX FALSE) + if(MPI_RESULT_${LANG}_test_mpi_MPICXX) + set(MPI_MPICXX_FOUND TRUE) + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + endif() + + # At this point, we know the bindings present but not the MPI version or anything else. + if(NOT DEFINED MPI_${LANG}_VERSION) + unset(MPI_${LANG}_VERSION_MAJOR) + unset(MPI_${LANG}_VERSION_MINOR) + endif() + set(MPI_BIN_FOLDER ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI) + + # For Fortran, we'll want to use the most modern MPI binding to test capabilities other than the + # Fortran parameters, since those depend on the method of consumption. + # For C++, we can always use the C bindings, and should do so, since the C++ bindings do not exist in MPI-3 + # whereas the C bindings do, and the C++ bindings never offered any feature advantage over their C counterparts. + if("${LANG}" STREQUAL "Fortran") + if(MPI_${LANG}_HAVE_F08_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F08_MODULE) + elseif(MPI_${LANG}_HAVE_F90_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F90_MODULE) + else() + set(MPI_${LANG}_HIGHEST_METHOD F77_HEADER) + endif() + + # Another difference between C and Fortran is that we can't use the preprocessor to determine whether MPI_VERSION + # and MPI_SUBVERSION are provided. These defines did not exist in MPI 1.0 and 1.1 and therefore might not + # exist. For C/C++, test_mpi.c will handle the MPI_VERSION extraction, but for Fortran, we need mpiver.f90. + if(NOT DEFINED MPI_${LANG}_VERSION) + _MPI_try_staged_settings(${LANG} mpiver ${MPI_${LANG}_HIGHEST_METHOD} FALSE) + if(MPI_RESULT_${LANG}_mpiver_${MPI_${LANG}_HIGHEST_METHOD}) + file(STRINGS ${MPI_BIN_FOLDER}/mpiver_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + # Finally, we want to find out which capabilities a given interface supports, compare the MPI-3 standard. + # This is determined by interface specific parameters MPI_SUBARRAYS_SUPPORTED and MPI_ASYNC_PROTECTS_NONBLOCKING + # and might vary between the different methods of consumption. + if(MPI_DETERMINE_Fortran_CAPABILITIES AND NOT MPI_Fortran_CAPABILITIES_DETERMINED) + foreach(mpimethod IN ITEMS F08_MODULE F90_MODULE F77_HEADER) + if(MPI_${LANG}_HAVE_${mpimethod}) + set(MPI_${LANG}_${mpimethod}_SUBARRAYS FALSE) + set(MPI_${LANG}_${mpimethod}_ASYNCPROT FALSE) + _MPI_try_staged_settings(${LANG} fortranparam_mpi ${mpimethod} TRUE) + if(MPI_RESULT_${LANG}_fortranparam_mpi_${mpimethod} AND + NOT "${MPI_RUN_RESULT_${LANG}_fortranparam_mpi_${mpimethod}}" STREQUAL "FAILED_TO_RUN") + if("${MPI_RUN_OUTPUT_${LANG}_fortranparam_mpi_${mpimethod}}" MATCHES + ".*INFO:SUBARRAYS\\[ *([TF]) *\\]-ASYNCPROT\\[ *([TF]) *\\].*") + if("${CMAKE_MATCH_1}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_SUBARRAYS TRUE) + endif() + if("${CMAKE_MATCH_2}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_ASYNCPROT TRUE) + endif() + endif() + endif() + endif() + endforeach() + set(MPI_Fortran_CAPABILITIES_DETERMINED TRUE) + endif() + else() + set(MPI_${LANG}_HIGHEST_METHOD normal) + + # By the MPI-2 standard, MPI_VERSION and MPI_SUBVERSION are valid for both C and C++ bindings. + if(NOT DEFINED MPI_${LANG}_VERSION) + file(STRINGS ${MPI_BIN_FOLDER}/test_mpi_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + unset(MPI_BIN_FOLDER) + + # At this point, we have dealt with determining the MPI version and parameters for each Fortran method available. + # The one remaining issue is to determine which MPI library is installed. + # Determining the version and vendor of the MPI library is only possible via MPI_Get_library_version() at runtime, + # and therefore we cannot do this while cross-compiling (a user may still define MPI__LIBRARY_VERSION_STRING + # themselves and we'll attempt splitting it, which is equivalent to provide the try_run output). + # It's also worth noting that the installed version string can depend on the language, or on the system the binary + # runs on if MPI is not statically linked. + if(MPI_DETERMINE_LIBRARY_VERSION AND NOT MPI_${LANG}_LIBRARY_VERSION_STRING) + _MPI_try_staged_settings(${LANG} libver_mpi ${MPI_${LANG}_HIGHEST_METHOD} TRUE) + if(MPI_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD} AND + "${MPI_RUN_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" EQUAL "0") + string(STRIP "${MPI_RUN_OUTPUT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" + MPI_${LANG}_LIBRARY_VERSION_STRING) + else() + set(MPI_${LANG}_LIBRARY_VERSION_STRING "NOTFOUND") + endif() + endif() + endif() + + set(MPI_${LANG}_FIND_QUIETLY ${MPI_FIND_QUIETLY}) + set(MPI_${LANG}_FIND_VERSION ${MPI_FIND_VERSION}) + set(MPI_${LANG}_FIND_VERSION_EXACT ${MPI_FIND_VERSION_EXACT}) + + unset(MPI_${LANG}_REQUIRED_VARS) + if (NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + foreach(mpilibname IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpilibname}_LIBRARY") + endforeach() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_LIB_NAMES") + if("${LANG}" STREQUAL "Fortran") + # For Fortran we only need one of the module or header directories to have *some* support for MPI. + if(NOT MPI_${LANG}_MODULE_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_F77_HEADER_DIR") + endif() + if(NOT MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_MODULE_DIR") + endif() + else() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_HEADER_DIR") + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(mpiincvar IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpiincvar}_INCLUDE_DIR") + endforeach() + endif() + # Append the works variable now. If the settings did not work, this will show up properly. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + else() + # If the compiler worked implicitly, use its path as output. + # Should the compiler variable be set, we also require it to work. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_COMPILER") + if(MPI_${LANG}_COMPILER) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + endif() + endif() + find_package_handle_standard_args(MPI_${LANG} REQUIRED_VARS ${MPI_${LANG}_REQUIRED_VARS} + VERSION_VAR MPI_${LANG}_VERSION) + + if(DEFINED MPI_${LANG}_VERSION) + if(NOT _MPI_MIN_VERSION OR _MPI_MIN_VERSION VERSION_GREATER MPI_${LANG}_VERSION) + set(_MPI_MIN_VERSION MPI_${LANG}_VERSION) + endif() + endif() + endif() +endforeach() + +unset(_MPI_REQ_VARS) +foreach(LANG IN ITEMS C CXX Fortran) + if((NOT MPI_FIND_COMPONENTS AND CMAKE_${LANG}_COMPILER_LOADED) OR LANG IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_${LANG}_FOUND") + endif() +endforeach() + +if(MPICXX IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_MPICXX_FOUND") +endif() + +find_package_handle_standard_args(MPI + REQUIRED_VARS ${_MPI_REQ_VARS} + VERSION_VAR ${_MPI_MIN_VERSION} + HANDLE_COMPONENTS) + +#============================================================================= +# More backward compatibility stuff + +# For compatibility reasons, we also define MPIEXEC +set(MPIEXEC "${MPIEXEC_EXECUTABLE}") + +# Copy over MPI__INCLUDE_PATH from the assembled INCLUDE_DIRS. +foreach(LANG IN ITEMS C CXX Fortran) + if(MPI_${LANG}_FOUND) + set(MPI_${LANG}_INCLUDE_PATH "${MPI_${LANG}_INCLUDE_DIRS}") + unset(MPI_${LANG}_COMPILE_FLAGS) + if(MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_FLAGS "${MPI_${LANG}_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_COMPILE_DEFINITIONS) + foreach(_MPI_DEF IN LISTS MPI_${LANG}_COMPILE_DEFINITIONS) + string(APPEND MPI_${LANG}_COMPILE_FLAGS " -D${_MPI_DEF}") + endforeach() + endif() + endif() +endforeach() + +# Bare MPI sans ${LANG} vars are set to CXX then C, depending on what was found. +# This mimics the behavior of the old language-oblivious FindMPI. +set(_MPI_OLD_VARS COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES) +if (MPI_CXX_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_CXX_${var}}) + endforeach() +elseif (MPI_C_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_C_${var}}) + endforeach() +endif() + +# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache. +if (MPI_LIBRARIES) + list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK) + set(MPI_LIBRARY "${MPI_LIBRARY_WORK}") + unset(MPI_LIBRARY_WORK) +else() + set(MPI_LIBRARY "MPI_LIBRARY-NOTFOUND") +endif() + +list(LENGTH MPI_LIBRARIES MPI_NUMLIBS) +if (MPI_NUMLIBS GREATER 1) + set(MPI_EXTRA_LIBRARY_WORK "${MPI_LIBRARIES}") + list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0) + set(MPI_EXTRA_LIBRARY "${MPI_EXTRA_LIBRARY_WORK}") + unset(MPI_EXTRA_LIBRARY_WORK) +else() + set(MPI_EXTRA_LIBRARY "MPI_EXTRA_LIBRARY-NOTFOUND") +endif() +set(MPI_IGNORE_LEGACY_VARIABLES TRUE) +#============================================================================= + +# unset these vars to cleanup namespace +unset(_MPI_OLD_VARS) +unset(_MPI_PREFIX_PATH) +unset(_MPI_BASE_DIR) +foreach (lang C CXX Fortran) + unset(_MPI_${LANG}_COMPILER_NAMES) +endforeach() + +cmake_policy(POP) diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in new file mode 100644 index 000000000..30f912c62 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in @@ -0,0 +1,4 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + print *, 'INFO:SUBARRAYS[', MPI_SUBARRAYS_SUPPORTED, ']-ASYNCPROT[', MPI_ASYNC_PROTECTS_NONBLOCKING, ']' + end program mpi_ver diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.c b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.c new file mode 100644 index 000000000..be9d19d43 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.c @@ -0,0 +1,19 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +int main(int argc, char* argv[]) +{ + char mpilibver_str[MPI_MAX_LIBRARY_VERSION_STRING]; + int mpilibver_len; + MPI_Get_library_version(mpilibver_str, &mpilibver_len); +#ifdef __cplusplus + std::puts(mpilibver_str); +#else + puts(mpilibver_str); +#endif +} diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in new file mode 100644 index 000000000..793858716 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in @@ -0,0 +1,7 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: mpilibver_str + integer(kind=MPI_INTEGER_KIND) :: ierror, reslen + call MPI_GET_LIBRARY_VERSION(mpilibver_str, reslen, ierror) + print *, mpilibver_str + end program mpi_ver diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in new file mode 100644 index 000000000..a25452385 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in @@ -0,0 +1,10 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + integer(kind=kind(MPI_VERSION)), parameter :: zero = ichar('0') + character, dimension(17), parameter :: mpiver_str =& + (/ 'I', 'N', 'F', 'O', ':', 'M', 'P', 'I', '-', 'V', 'E', 'R', '[', & + char(zero + MPI_VERSION), & + '.', & + char(zero + MPI_SUBVERSION), ']' /) + print *, mpiver_str + end program mpi_ver diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.c b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.c new file mode 100644 index 000000000..b8a308a4b --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.c @@ -0,0 +1,37 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +const char mpiver_str[] = { 'I', 'N', + 'F', 'O', + ':', 'M', + 'P', 'I', + '-', 'V', + 'E', 'R', + '[', ('0' + MPI_VERSION), + '.', ('0' + MPI_SUBVERSION), + ']', '\0' }; +#endif + +int main(int argc, char* argv[]) +{ +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +#ifdef __cplusplus + std::puts(mpiver_str); +#else + puts(mpiver_str); +#endif +#endif +#ifdef TEST_MPI_MPICXX + MPI::MPI_Init(&argc, &argv); + MPI::MPI_Finalize(); +#else + MPI_Init(&argc, &argv); + MPI_Finalize(); +#endif +} diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in new file mode 100644 index 000000000..4d43a04d6 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in @@ -0,0 +1,6 @@ + program hello + @MPI_Fortran_INCLUDE_LINE@ + integer@MPI_Fortran_INTEGER_LINE@ ierror + call MPI_INIT(ierror) + call MPI_FINALIZE(ierror) + end program diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake new file mode 100644 index 000000000..67f6bd6f2 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,386 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageHandleStandardArgs +----------------------------- + +This module provides a function intended to be used in :ref:`Find Modules` +implementing :command:`find_package()` calls. It handles the +``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``. +It also sets the ``_FOUND`` variable. The package is +considered found if all variables listed contain valid results, e.g. +valid filepaths. + +.. command:: find_package_handle_standard_args + + There are two signatures:: + + find_package_handle_standard_args( + (DEFAULT_MSG|) + ... + ) + + find_package_handle_standard_args( + [FOUND_VAR ] + [REQUIRED_VARS ...] + [VERSION_VAR ] + [HANDLE_COMPONENTS] + [CONFIG_MODE] + [FAIL_MESSAGE ] + ) + + The ``_FOUND`` variable will be set to ``TRUE`` if all + the variables ``...`` are valid and any optional + constraints are satisfied, and ``FALSE`` otherwise. A success or + failure message may be displayed based on the results and on + whether the ``REQUIRED`` and/or ``QUIET`` option was given to + the :command:`find_package` call. + + The options are: + + ``(DEFAULT_MSG|)`` + In the simple signature this specifies the failure message. + Use ``DEFAULT_MSG`` to ask for a default message to be computed + (recommended). Not valid in the full signature. + + ``FOUND_VAR `` + Obsolete. Specifies either ``_FOUND`` or + ``_FOUND`` as the result variable. This exists only + for compatibility with older versions of CMake and is now ignored. + Result variables of both names are always set for compatibility. + + ``REQUIRED_VARS ...`` + Specify the variables which are required for this package. + These may be named in the generated failure message asking the + user to set the missing variable values. Therefore these should + typically be cache entries such as ``FOO_LIBRARY`` and not output + variables like ``FOO_LIBRARIES``. + + ``VERSION_VAR `` + Specify the name of a variable that holds the version of the package + that has been found. This version will be checked against the + (potentially) specified required version given to the + :command:`find_package` call, including its ``EXACT`` option. + The default messages include information about the required + version and the version which has been actually found, both + if the version is ok or not. + + ``HANDLE_COMPONENTS`` + Enable handling of package components. In this case, the command + will report which components have been found and which are missing, + and the ``_FOUND`` variable will be set to ``FALSE`` + if any of the required components (i.e. not the ones listed after + the ``OPTIONAL_COMPONENTS`` option of :command:`find_package`) are + missing. + + ``CONFIG_MODE`` + Specify that the calling find module is a wrapper around a + call to ``find_package( NO_MODULE)``. This implies + a ``VERSION_VAR`` value of ``_VERSION``. The command + will automatically check whether the package configuration file + was found. + + ``FAIL_MESSAGE `` + Specify a custom failure message instead of using the default + generated message. Not recommended. + +Example for the simple signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibXml2 DEFAULT_MSG + LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) + +The ``LibXml2`` package is considered to be found if both +``LIBXML2_LIBRARY`` and ``LIBXML2_INCLUDE_DIR`` are valid. +Then also ``LibXml2_FOUND`` is set to ``TRUE``. If it is not found +and ``REQUIRED`` was used, it fails with a +:command:`message(FATAL_ERROR)`, independent whether ``QUIET`` was +used or not. If it is found, success will be reported, including +the content of the first ````. On repeated CMake runs, +the same message will not be printed again. + +Example for the full signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibArchive + REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR + VERSION_VAR LibArchive_VERSION) + +In this case, the ``LibArchive`` package is considered to be found if +both ``LibArchive_LIBRARY`` and ``LibArchive_INCLUDE_DIR`` are valid. +Also the version of ``LibArchive`` will be checked by using the version +contained in ``LibArchive_VERSION``. Since no ``FAIL_MESSAGE`` is given, +the default messages will be printed. + +Another example for the full signature: + +.. code-block:: cmake + + find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) + find_package_handle_standard_args(Automoc4 CONFIG_MODE) + +In this case, a ``FindAutmoc4.cmake`` module wraps a call to +``find_package(Automoc4 NO_MODULE)`` and adds an additional search +directory for ``automoc4``. Then the call to +``find_package_handle_standard_args`` produces a proper success/failure +message. +#]=======================================================================] + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${_msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${_msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing:${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + string(APPEND configsText " ${filename} (version ${version})\n") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + string(APPEND configsText " Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + +# Set up the arguments for `cmake_parse_arguments`. + set(options CONFIG_MODE HANDLE_COMPONENTS) + set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + +# Check whether we are in 'simple' or 'extended' mode: + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + cmake_parse_arguments(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + endif() + +# now that we collected all arguments, process them + + if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$") + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + set(FPHSA_FOUND_${_NAME} TRUE) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(FPHSA_FOUND_${_NAME} FALSE) + string(APPEND MISSING_VARS " ${_CURRENT_VAR}") + else() + string(APPEND DETAILS "[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(FPHSA_FOUND_${_NAME}) + set(${_NAME}_FOUND TRUE) + set(${_NAME_UPPER}_FOUND TRUE) + else() + set(${_NAME}_FOUND FALSE) + set(${_NAME_UPPER}_FOUND FALSE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components: ") + endif() + string(APPEND FOUND_COMPONENTS_MSG " ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components: ") + endif() + string(APPEND MISSING_COMPONENTS_MSG " ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + string(APPEND MISSING_VARS " ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + string(APPEND DETAILS "[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + + # check with DEFINED here as the requested or found version may be "0" + if (DEFINED ${_NAME}_FIND_VERSION) + if(DEFINED ${FPHSA_VERSION_VAR}) + set(_FOUND_VERSION ${${FPHSA_VERSION_VAR}}) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + # count the dots in the version string + string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${_FOUND_VERSION}") + # add one dot because there is one dot more than there are components + string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS) + if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT) + # Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT + # is at most 4 here. Therefore a simple lookup table is used. + if (${_NAME}_FIND_VERSION_COUNT EQUAL 1) + set(_VERSION_REGEX "[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2) + set(_VERSION_REGEX "[^.]*\\.[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3) + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*") + else () + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*") + endif () + string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${_FOUND_VERSION}") + unset(_VERSION_REGEX) + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + unset(_VERSION_HEAD) + else () + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + endif () + unset(_VERSION_DOTS) + + else() # minimum version specified: + if (${_NAME}_FIND_VERSION VERSION_GREATER _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${_FOUND_VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + # Check with DEFINED as the found version may be 0. + if(DEFINED ${FPHSA_VERSION_VAR}) + set(VERSION_MSG "(found version \"${${FPHSA_VERSION_VAR}}\")") + endif() + endif () + + if(VERSION_OK) + string(APPEND DETAILS "[v${${FPHSA_VERSION_VAR}}(${${_NAME}_FIND_VERSION})]") + else() + set(${_NAME}_FOUND FALSE) + endif() + + + # print the result: + if (${_NAME}_FOUND) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_NAME}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) + set(${_NAME_UPPER}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) +endfunction() diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindPackageMessage.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindPackageMessage.cmake new file mode 100644 index 000000000..6821cee4f --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/FindPackageMessage.cmake @@ -0,0 +1,47 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindPackageMessage +# ------------------ +# +# +# +# FIND_PACKAGE_MESSAGE( "message for user" "find result details") +# +# This macro is intended to be used in FindXXX.cmake modules files. It +# will print a message once for each unique find result. This is useful +# for telling the user where a package was found. The first argument +# specifies the name (XXX) of the package. The second argument +# specifies the message to display. The third argument lists details +# about the find result so that if they change the message will be +# displayed again. The macro also obeys the QUIET argument to the +# find_package command. +# +# Example: +# +# :: +# +# if(X11_FOUND) +# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}" +# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") +# else() +# ... +# endif() + +function(FIND_PACKAGE_MESSAGE pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REPLACE "\n" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake new file mode 100644 index 000000000..dce6f9926 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake @@ -0,0 +1,70 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# SelectLibraryConfigurations +# --------------------------- +# +# +# +# select_library_configurations( basename ) +# +# This macro takes a library base name as an argument, and will choose +# good values for basename_LIBRARY, basename_LIBRARIES, +# basename_LIBRARY_DEBUG, and basename_LIBRARY_RELEASE depending on what +# has been found and set. If only basename_LIBRARY_RELEASE is defined, +# basename_LIBRARY will be set to the release value, and +# basename_LIBRARY_DEBUG will be set to basename_LIBRARY_DEBUG-NOTFOUND. +# If only basename_LIBRARY_DEBUG is defined, then basename_LIBRARY will +# take the debug value, and basename_LIBRARY_RELEASE will be set to +# basename_LIBRARY_RELEASE-NOTFOUND. +# +# If the generator supports configuration types, then basename_LIBRARY +# and basename_LIBRARIES will be set with debug and optimized flags +# specifying the library to be used for the given configuration. If no +# build type has been set or the generator in use does not support +# configuration types, then basename_LIBRARY and basename_LIBRARIES will +# take only the release value, or the debug value if the release one is +# not set. + +# This macro was adapted from the FindQt4 CMake module and is maintained by Will +# Dicharry . + +macro( select_library_configurations basename ) + if(NOT ${basename}_LIBRARY_RELEASE) + set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + if(NOT ${basename}_LIBRARY_DEBUG) + set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + + if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND + NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND + ( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) ) + # if the generator supports configuration types or CMAKE_BUILD_TYPE + # is set, then set optimized and debug options. + set( ${basename}_LIBRARY "" ) + foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE ) + list( APPEND ${basename}_LIBRARY optimized "${_libname}" ) + endforeach() + foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG ) + list( APPEND ${basename}_LIBRARY debug "${_libname}" ) + endforeach() + elseif( ${basename}_LIBRARY_RELEASE ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} ) + elseif( ${basename}_LIBRARY_DEBUG ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} ) + else() + set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND") + endif() + + set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" ) + + if( ${basename}_LIBRARY ) + set( ${basename}_FOUND TRUE ) + endif() + + mark_as_advanced( ${basename}_LIBRARY_RELEASE + ${basename}_LIBRARY_DEBUG + ) +endmacro() diff --git a/sorc/hafs_hycom_utils.fd/init/hafs_archv2restart/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/init/hafs_archv2restart/CMakeLists.txt new file mode 100644 index 000000000..3ddfcc1a4 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/init/hafs_archv2restart/CMakeLists.txt @@ -0,0 +1,43 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fortran_srcs + zh.F + mod_xc.F + mod_za.F + mod_zb.F + mod_plot.F + mod_restart.F + wtime.F + archv2restart.f + bigrid.f + blkin.f + extrct.f + extrot.f + fordate.f + getdat.f + getdtm.f + getdepth.f + putdat.f + indxi.f + indxj.f + pakk.f + zebra.f + dum_gks.f) + +set(exe_name hafs_archv2restart) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_executable(${exe_name} ${fortran_srcs}) + +add_definitions( -DLITTLE_ENDIAN -DWRF -DLINUX -DMPI -DSERIAL_IO -DNAN2003 -DTIMER -DRELO ) + +install(TARGETS ${exe_name} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_hycom_utils.fd/init/hafs_get_rtofs/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/init/hafs_get_rtofs/CMakeLists.txt new file mode 100644 index 000000000..0d8e2a79e --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/init/hafs_get_rtofs/CMakeLists.txt @@ -0,0 +1,33 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fortran_srcs + module_get_rtofs.f90 + get_rtofs.f90) + +set(ilib_dir ${CMAKE_SOURCE_DIR}/libs/build/src) +set(exe_name hafs_get_rtofs) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_executable(${exe_name} ${fortran_srcs}) + +target_include_directories( + ${exe_name} PUBLIC + ${ilib_dir}/ofs_mods + ${ilib_dir}/libsia) + +target_link_libraries( + ${exe_name} + ${ilib_dir}/ofs_mods/libofs_mods.a + ${ilib_dir}/libsia/libsia.a + MPI::MPI_Fortran) + +install(TARGETS ${exe_name} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_hycom_utils.fd/init/hafs_gfs2ofs2/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/init/hafs_gfs2ofs2/CMakeLists.txt new file mode 100644 index 000000000..b02a51d3d --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/init/hafs_gfs2ofs2/CMakeLists.txt @@ -0,0 +1,46 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fortran_srcs + flush.f90 + constants.f90 + horiz_interp.f90 + mod_hytime.f90 + mod_flags.f90 + mod_hycomio1.f90 + mod_dump.f90 + mod_grib2io.f90 + mod_geom.f90 + intp.f90 + cd.f90) + +set(ilib_dir ${CMAKE_SOURCE_DIR}/libs/build/src) +set(exe_name hafs_gfs2ofs2) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_executable(${exe_name} ${fortran_srcs}) + +target_include_directories( + ${exe_name} PUBLIC + ${ilib_dir}/ofs_mods) + +target_link_libraries( + ${exe_name} + ${ilib_dir}/ofs_mods/libofs_mods.a + w3nco::w3nco_4 + bacio::bacio_4 + NetCDF::NetCDF_Fortran + NetCDF::NetCDF_C + g2::g2_4 + w3emc::w3emc_4 + MPI::MPI_Fortran) + +install(TARGETS ${exe_name} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_hycom_utils.fd/init/hafs_restart2restart/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/init/hafs_restart2restart/CMakeLists.txt new file mode 100644 index 000000000..0a1553652 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/init/hafs_restart2restart/CMakeLists.txt @@ -0,0 +1,27 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fc_srcs + hycom_subset.F + hycom_subset.F + parse.c) + +set(exe_name hafs_restart2restart) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() +if(CMAKE_C_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -cc=icc -O0") +endif() + +add_executable(${exe_name} ${fc_srcs}) + +add_definitions( -DUNDERSCORE -Dfunder -DFortranByte=char -DFortranInt=int -DFortranLlong="long long" -DLITTLE_ENDIAN -DWRF -DLINUX -DMPI -DSERIAL_IO -DNAN2003 -DTIMER -DRELO ) + +install(TARGETS ${exe_name} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_hycom_utils.fd/init/hafs_subregion/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/init/hafs_subregion/CMakeLists.txt new file mode 100644 index 000000000..5a42c0051 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/init/hafs_subregion/CMakeLists.txt @@ -0,0 +1,27 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fortran_srcs + zh.F + mod_xc.F + mod_za.F + mod_zb.F + wtime.F + subregion.f) + +set(exe_name hafs_rtofs_subregion) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_executable(${exe_name} ${fortran_srcs}) + +add_definitions(-DLITTLE_ENDIAN -DWRF -DLINUX -DSERIAL_IO) + +install(TARGETS ${exe_name} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_hycom_utils.fd/init/hafs_timeinterp_forcing/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/init/hafs_timeinterp_forcing/CMakeLists.txt new file mode 100644 index 000000000..551ee27e0 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/init/hafs_timeinterp_forcing/CMakeLists.txt @@ -0,0 +1,33 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= +#/mnt/lfs4/HFIP/hwrfv3/Biju.Thomas/hafs_couplehycom/sorc/hafs_hycom_utils.fd/build/libs/src/ofs_mods/libofs_mods.a +# ${ilib_dir}/ofs_mods/libofs_mods.a + +set(fortran_srcs + get_abfld1.f + timeinterp_forcing.f90) + +set(ilib_dir ${CMAKE_SOURCE_DIR}/libs/build/src) +set(exe_name hafs_timeinterp_forcing) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_executable(${exe_name} ${fortran_srcs}) + +target_include_directories( + ${exe_name} PUBLIC + ${ilib_dir}/ofs_mods) + +target_link_libraries( + ${exe_name} + ${ilib_dir}/ofs_mods/libofs_mods.a + MPI::MPI_Fortran) + +install(TARGETS ${exe_name} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_hycom_utils.fd/libs/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/libs/CMakeLists.txt new file mode 100644 index 000000000..35398047a --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/CMakeLists.txt @@ -0,0 +1,26 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +cmake_minimum_required(VERSION 3.15) +project( + HYCOM_UTILS + LANGUAGES C Fortran) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") +set (HAFS_TOOLS_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_Fortran_COMPILER_ID}") +endif() + +if(NOT CMAKE_C_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_C_COMPILER_ID}") +endif() + +find_package(MPI REQUIRED) + +add_subdirectory(src/ofs_mods) +add_subdirectory(src/libsia) diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI.cmake b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI.cmake new file mode 100644 index 000000000..5cd2a2afe --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI.cmake @@ -0,0 +1,1514 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindMPI +# ------- +# +# Find a Message Passing Interface (MPI) implementation. +# +# The Message Passing Interface (MPI) is a library used to write +# high-performance distributed-memory parallel applications, and is +# typically deployed on a cluster. MPI is a standard interface (defined +# by the MPI forum) for which many implementations are available. +# +# Variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module exposes the components ``C``, ``CXX``, ``MPICXX`` and ``Fortran``. +# Each of these controls the various MPI languages to search for. +# The difference between ``CXX`` and ``MPICXX`` is that ``CXX`` refers to the +# MPI C API being usable from C++, whereas ``MPICXX`` refers to the MPI-2 C++ API +# that was removed again in MPI-3. +# +# Depending on the enabled components the following variables will be set: +# +# ``MPI_FOUND`` +# Variable indicating that MPI settings for all requested languages have been found. +# If no components are specified, this is true if MPI settings for all enabled languages +# were detected. Note that the ``MPICXX`` component does not affect this variable. +# ``MPI_VERSION`` +# Minimal version of MPI detected among the requested languages, or all enabled languages +# if no components were specified. +# +# This module will set the following variables per language in your +# project, where ```` is one of C, CXX, or Fortran: +# +# ``MPI__FOUND`` +# Variable indicating the MPI settings for ```` were found and that +# simple MPI test programs compile with the provided settings. +# ``MPI__COMPILER`` +# MPI compiler for ```` if such a program exists. +# ``MPI__COMPILE_OPTIONS`` +# Compilation options for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__COMPILE_DEFINITIONS`` +# Compilation definitions for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__INCLUDE_DIRS`` +# Include path(s) for MPI header. +# ``MPI__LINK_FLAGS`` +# Linker flags for MPI programs. +# ``MPI__LIBRARIES`` +# All libraries to link MPI programs against. +# +# Additionally, the following :prop_tgt:`IMPORTED` targets are defined: +# +# ``MPI::MPI_`` +# Target for using MPI from ````. +# +# The following variables indicating which bindings are present will be defined: +# +# ``MPI_MPICXX_FOUND`` +# Variable indicating whether the MPI-2 C++ bindings are present (introduced in MPI-2, removed with MPI-3). +# ``MPI_Fortran_HAVE_F77_HEADER`` +# True if the Fortran 77 header ``mpif.h`` is available. +# ``MPI_Fortran_HAVE_F90_MODULE`` +# True if the Fortran 90 module ``mpi`` can be used for accessing MPI (MPI-2 and higher only). +# ``MPI_Fortran_HAVE_F08_MODULE`` +# True if the Fortran 2008 ``mpi_f08`` is available to MPI programs (MPI-3 and higher only). +# +# If possible, the MPI version will be determined by this module. The facilities to detect the MPI version +# were introduced with MPI-1.2, and therefore cannot be found for older MPI versions. +# +# ``MPI__VERSION_MAJOR`` +# Major version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION_MINOR`` +# Minor version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION`` +# MPI version implemented for ```` by the MPI distribution. +# +# Note that there's no variable for the C bindings being accessible through ``mpi.h``, since the MPI standards +# always have required this binding to work in both C and C++ code. +# +# For running MPI programs, the module sets the following variables +# +# ``MPIEXEC_EXECUTABLE`` +# Executable for running MPI programs, if such exists. +# ``MPIEXEC_NUMPROC_FLAG`` +# Flag to pass to ``mpiexec`` before giving it the number of processors to run on. +# ``MPIEXEC_MAX_NUMPROCS`` +# Number of MPI processors to utilize. Defaults to the number +# of processors detected on the host system. +# ``MPIEXEC_PREFLAGS`` +# Flags to pass to ``mpiexec`` directly before the executable to run. +# ``MPIEXEC_POSTFLAGS`` +# Flags to pass to ``mpiexec`` after other flags. +# +# Variables for locating MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# This module performs a three step search for an MPI implementation: +# +# 1. Check if the compiler has MPI support built-in. This is the case if the user passed a +# compiler wrapper as ``CMAKE__COMPILER`` or if they're on a Cray system. +# 2. Attempt to find an MPI compiler wrapper and determine the compiler information from it. +# 3. Try to find an MPI implementation that does not ship such a wrapper by guessing settings. +# Currently, only Microsoft MPI and MPICH2 on Windows are supported. +# +# For controlling the second step, the following variables may be set: +# +# ``MPI__COMPILER`` +# Search for the specified compiler wrapper and use it. +# ``MPI__COMPILER_FLAGS`` +# Flags to pass to the MPI compiler wrapper during interrogation. Some compiler wrappers +# support linking debug or tracing libraries if a specific flag is passed and this variable +# may be used to obtain them. +# ``MPI_COMPILER_FLAGS`` +# Used to initialize ``MPI__COMPILER_FLAGS`` if no language specific flag has been given. +# Empty by default. +# ``MPI_EXECUTABLE_SUFFIX`` +# A suffix which is appended to all names that are being looked for. For instance you may set this +# to ``.mpich`` or ``.openmpi`` to prefer the one or the other on Debian and its derivatives. +# +# In order to control the guessing step, the following variable may be set: +# +# ``MPI_GUESS_LIBRARY_NAME`` +# Valid values are ``MSMPI`` and ``MPICH2``. If set, only the given library will be searched for. +# By default, ``MSMPI`` will be preferred over ``MPICH2`` if both are available. +# This also sets ``MPI_SKIP_COMPILER_WRAPPER`` to ``true``, which may be overridden. +# +# Each of the search steps may be skipped with the following control variables: +# +# ``MPI_ASSUME_NO_BUILTIN_MPI`` +# If true, the module assumes that the compiler itself does not provide an MPI implementation and +# skips to step 2. +# ``MPI_SKIP_COMPILER_WRAPPER`` +# If true, no compiler wrapper will be searched for. +# ``MPI_SKIP_GUESSING`` +# If true, the guessing step will be skipped. +# +# Additionally, the following control variable is available to change search behavior: +# +# ``MPI_CXX_SKIP_MPICXX`` +# Add some definitions that will disable the MPI-2 C++ bindings. +# Currently supported are MPICH, Open MPI, Platform MPI and derivatives thereof, +# for example MVAPICH or Intel MPI. +# +# If the find procedure fails for a variable ``MPI__WORKS``, then the settings detected by or passed to +# the module did not work and even a simple MPI test program failed to compile. +# +# If all of these parameters were not sufficient to find the right MPI implementation, a user may +# disable the entire autodetection process by specifying both a list of libraries in ``MPI__LIBRARIES`` +# and a list of include directories in ``MPI__ADDITIONAL_INCLUDE_DIRS``. +# Any other variable may be set in addition to these two. The module will then validate the MPI settings and store the +# settings in the cache. +# +# Cache variables for MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The variable ``MPI__INCLUDE_DIRS`` will be assembled from the following variables. +# For C and CXX: +# +# ``MPI__HEADER_DIR`` +# Location of the ``mpi.h`` header on disk. +# +# For Fortran: +# +# ``MPI_Fortran_F77_HEADER_DIR`` +# Location of the Fortran 77 header ``mpif.h``, if it exists. +# ``MPI_Fortran_MODULE_DIR`` +# Location of the ``mpi`` or ``mpi_f08`` modules, if available. +# +# For all languages the following variables are additionally considered: +# +# ``MPI__ADDITIONAL_INCLUDE_DIRS`` +# A :ref:`;-list ` of paths needed in addition to the normal include directories. +# ``MPI__INCLUDE_DIR`` +# Path variables for include folders referred to by ````. +# ``MPI__ADDITIONAL_INCLUDE_VARS`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# The variable ``MPI__LIBRARIES`` will be assembled from the following variables: +# +# ``MPI__LIBRARY`` +# The location of a library called ```` for use with MPI. +# ``MPI__LIB_NAMES`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# Usage of mpiexec +# ^^^^^^^^^^^^^^^^ +# +# When using ``MPIEXEC_EXECUTABLE`` to execute MPI applications, you should typically +# use all of the ``MPIEXEC_EXECUTABLE`` flags as follows: +# +# :: +# +# ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} +# ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS +# +# where ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to +# pass to the MPI program. +# +# Advanced variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module can perform some advanced feature detections upon explicit request. +# +# **Important notice:** The following checks cannot be performed without *executing* an MPI test program. +# Consider the special considerations for the behavior of :command:`try_run` during cross compilation. +# Moreover, running an MPI program can cause additional issues, like a firewall notification on some systems. +# You should only enable these detections if you absolutely need the information. +# +# If the following variables are set to true, the respective search will be performed: +# +# ``MPI_DETERMINE_Fortran_CAPABILITIES`` +# Determine for all available Fortran bindings what the values of ``MPI_SUBARRAYS_SUPPORTED`` and +# ``MPI_ASYNC_PROTECTS_NONBLOCKING`` are and make their values available as ``MPI_Fortran__SUBARRAYS`` +# and ``MPI_Fortran__ASYNCPROT``, where ```` is one of ``F77_HEADER``, ``F90_MODULE`` and +# ``F08_MODULE``. +# ``MPI_DETERMINE_LIBRARY_VERSION`` +# For each language, find the output of ``MPI_Get_library_version`` and make it available as ``MPI__LIBRARY_VERSION``. +# This information is usually tied to the runtime component of an MPI implementation and might differ depending on ````. +# Note that the return value is entirely implementation defined. This information might be used to identify +# the MPI vendor and for example pick the correct one of multiple third party binaries that matches the MPI vendor. +# +# Backward Compatibility +# ^^^^^^^^^^^^^^^^^^^^^^ +# +# For backward compatibility with older versions of FindMPI, these +# variables are set, but deprecated: +# +# :: +# +# MPI_COMPILER MPI_LIBRARY MPI_EXTRA_LIBRARY +# MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_LINK_FLAGS +# MPI_LIBRARIES +# +# In new projects, please use the ``MPI__XXX`` equivalents. +# Additionally, the following variables are deprecated: +# +# ``MPI__COMPILE_FLAGS`` +# Use ``MPI__COMPILE_OPTIONS`` and ``MPI__COMPILE_DEFINITIONS`` instead. +# ``MPI__INCLUDE_PATH`` +# For consumption use ``MPI__INCLUDE_DIRS`` and for specifying folders use ``MPI__ADDITIONAL_INCLUDE_DIRS`` instead. +# ``MPIEXEC`` +# Use ``MPIEXEC_EXECUTABLE`` instead. + +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) # if IN_LIST + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# Generic compiler names +set(_MPI_C_GENERIC_COMPILER_NAMES mpicc mpcc mpicc_r mpcc_r) +set(_MPI_CXX_GENERIC_COMPILER_NAMES mpicxx mpiCC mpcxx mpCC mpic++ mpc++ + mpicxx_r mpiCC_r mpcxx_r mpCC_r mpic++_r mpc++_r) +set(_MPI_Fortran_GENERIC_COMPILER_NAMES mpif95 mpif95_r mpf95 mpf95_r + mpif90 mpif90_r mpf90 mpf90_r + mpif77 mpif77_r mpf77 mpf77_r + mpifc) + +# GNU compiler names +set(_MPI_GNU_C_COMPILER_NAMES mpigcc mpgcc mpigcc_r mpgcc_r) +set(_MPI_GNU_CXX_COMPILER_NAMES mpig++ mpg++ mpig++_r mpg++_r mpigxx) +set(_MPI_GNU_Fortran_COMPILER_NAMES mpigfortran mpgfortran mpigfortran_r mpgfortran_r + mpig77 mpig77_r mpg77 mpg77_r) + +# Intel MPI compiler names on Windows +if(WIN32) + list(APPEND _MPI_C_GENERIC_COMPILER_NAMES mpicc.bat) + list(APPEND _MPI_CXX_GENERIC_COMPILER_NAMES mpicxx.bat) + list(APPEND _MPI_Fortran_GENERIC_COMPILER_NAMES mpifc.bat) + + # Intel MPI compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc.bat) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc.bat) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort.bat mpif77.bat mpif90.bat) + + # Intel MPI compiler names for MSMPI + set(_MPI_MSVC_C_COMPILER_NAMES mpicl.bat) + set(_MPI_MSVC_CXX_COMPILER_NAMES mpicl.bat) +else() + # Intel compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc mpiicxx mpiic++) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort mpiif95 mpiif90 mpiif77) +endif() + +# PGI compiler names +set(_MPI_PGI_C_COMPILER_NAMES mpipgcc mppgcc) +set(_MPI_PGI_CXX_COMPILER_NAMES mpipgCC mppgCC) +set(_MPI_PGI_Fortran_COMPILER_NAMES mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77) + +# XLC MPI Compiler names +set(_MPI_XL_C_COMPILER_NAMES mpxlc mpxlc_r mpixlc mpixlc_r) +set(_MPI_XL_CXX_COMPILER_NAMES mpixlcxx mpixlC mpixlc++ mpxlcxx mpxlc++ mpixlc++ mpxlCC + mpixlcxx_r mpixlC_r mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r) +set(_MPI_XL_Fortran_COMPILER_NAMES mpixlf95 mpixlf95_r mpxlf95 mpxlf95_r + mpixlf90 mpixlf90_r mpxlf90 mpxlf90_r + mpixlf77 mpixlf77_r mpxlf77 mpxlf77_r + mpixlf mpixlf_r mpxlf mpxlf_r) + +# Prepend vendor-specific compiler wrappers to the list. If we don't know the compiler, +# attempt all of them. +# By attempting vendor-specific compiler names first, we should avoid situations where the compiler wrapper +# stems from a proprietary MPI and won't know which compiler it's being used for. For instance, Intel MPI +# controls its settings via the I_MPI_CC environment variables if the generic name is being used. +# If we know which compiler we're working with, we can use the most specialized wrapper there is in order to +# pick up the right settings for it. +foreach (LANG IN ITEMS C CXX Fortran) + set(_MPI_${LANG}_COMPILER_NAMES "") + foreach (id IN ITEMS GNU Intel MSVC PGI XL) + if (NOT CMAKE_${LANG}_COMPILER_ID OR CMAKE_${LANG}_COMPILER_ID STREQUAL id) + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${id}_${LANG}_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + endif() + unset(_MPI_${id}_${LANG}_COMPILER_NAMES) + endforeach() + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${LANG}_GENERIC_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + unset(_MPI_${LANG}_GENERIC_COMPILER_NAMES) +endforeach() + +# Names to try for mpiexec +# Only mpiexec commands are guaranteed to behave as described in the standard, +# mpirun commands are not covered by the standard in any way whatsoever. +# lamexec is the executable for LAM/MPI, srun is for SLURM or Open MPI with SLURM support. +# srun -n X is however a valid command, so it behaves 'like' mpiexec. +set(_MPIEXEC_NAMES_BASE mpiexec mpiexec.hydra mpiexec.mpd mpirun lamexec srun) + +unset(_MPIEXEC_NAMES) +foreach(_MPIEXEC_NAME IN LISTS _MPIEXEC_NAMES_BASE) + list(APPEND _MPIEXEC_NAMES "${_MPIEXEC_NAME}${MPI_EXECUTABLE_SUFFIX}") +endforeach() +unset(_MPIEXEC_NAMES_BASE) + +function (_MPI_check_compiler LANG QUERY_FLAG OUTPUT_VARIABLE RESULT_VARIABLE) + if(DEFINED MPI_${LANG}_COMPILER_FLAGS) +# separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_${LANG}_COMPILER_FLAGS}") + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS "${MPI_${LANG}_COMPILER_FLAGS}") + else() + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_COMPILER_FLAGS}") + endif() + execute_process( + COMMAND ${MPI_${LANG}_COMPILER} ${_MPI_COMPILER_WRAPPER_OPTIONS} ${QUERY_FLAG} + OUTPUT_VARIABLE WRAPPER_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE WRAPPER_OUTPUT ERROR_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE WRAPPER_RETURN) + # Some compiler wrappers will yield spurious zero return values, for example + # Intel MPI tolerates unknown arguments and if the MPI wrappers loads a shared + # library that has invalid or missing version information there would be warning + # messages emitted by ld.so in the compiler output. In either case, we'll treat + # the output as invalid. + if("${WRAPPER_OUTPUT}" MATCHES "undefined reference|unrecognized|need to set|no version information available") + set(WRAPPER_RETURN 255) + endif() + # Ensure that no error output might be passed upwards. + if(NOT WRAPPER_RETURN EQUAL 0) + unset(WRAPPER_OUTPUT) + endif() + set(${OUTPUT_VARIABLE} "${WRAPPER_OUTPUT}" PARENT_SCOPE) + set(${RESULT_VARIABLE} "${WRAPPER_RETURN}" PARENT_SCOPE) +endfunction() + +function (_MPI_interrogate_compiler lang) + unset(MPI_COMPILE_CMDLINE) + unset(MPI_LINK_CMDLINE) + + unset(MPI_COMPILE_OPTIONS_WORK) + unset(MPI_COMPILE_DEFINITIONS_WORK) + unset(MPI_INCLUDE_DIRS_WORK) + unset(MPI_LINK_FLAGS_WORK) + unset(MPI_LIB_NAMES_WORK) + unset(MPI_LIB_FULLPATHS_WORK) + + # Check whether the -showme:compile option works. This indicates that we have either Open MPI + # or a newer version of LAM/MPI, and implies that -showme:link will also work. + # Open MPI also supports -show, but separates linker and compiler information + _MPI_check_compiler(${LANG} "-showme:compile" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme:link" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + + # MPICH and MVAPICH offer -compile-info and -link-info. + # For modern versions, both do the same as -show. However, for old versions, they do differ + # when called for mpicxx and mpif90 and it's necessary to use them over -show in order to find the + # removed MPI C++ bindings. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-compile-info" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-link-info" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + endif() + + # MPICH, MVAPICH2 and Intel MPI just use "-show". Open MPI also offers this, but the + # -showme commands are more specialized. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-show" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + # Older versions of LAM/MPI have "-showme". Open MPI also supports this. + # Unknown to MPICH, MVAPICH and Intel MPI. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + if (NOT (MPI_COMPILER_RETURN EQUAL 0) OR NOT (DEFINED MPI_COMPILE_CMDLINE)) + # Cannot interrogate this compiler, so exit. + set(MPI_${LANG}_WRAPPER_FOUND FALSE PARENT_SCOPE) + return() + endif() + unset(MPI_COMPILER_RETURN) + + # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE + # into MPI_LINK_CMDLINE, if we didn't find the link line. + if (NOT DEFINED MPI_LINK_CMDLINE) + set(MPI_LINK_CMDLINE "${MPI_COMPILE_CMDLINE}") + endif() + + # At this point, we obtained some output from a compiler wrapper that works. + # We'll now try to parse it into variables with meaning to us. + if("${LANG}" STREQUAL "Fortran") + # Some MPICH-1 and MVAPICH-1 versions return a three command answer for Fortran, consisting + # out of a symlink command for mpif.h, the actual compiler command and a deletion of the + # created symlink. We need to detect that case, remember the include path and drop the + # symlink/deletion operation to obtain the link/compile lines we'd usually expect. + if("${MPI_COMPILE_CMDLINE}" MATCHES "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h") + get_filename_component(MPI_INCLUDE_DIRS_WORK "${CMAKE_MATCH_1}" DIRECTORY) + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + endif() + + # The Intel MPI wrapper on Linux will emit some objcopy commands after its compile command + # if -static_mpi was passed to the wrapper. To avoid spurious matches, we need to drop these lines. + if(UNIX) + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + + # Extract compile options from the compile command line. + string(REGEX MATCHALL "(^| )-f([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_OPTIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_OPTION IN LISTS MPI_ALL_COMPILE_OPTIONS) + string(REGEX REPLACE "^ " "" _MPI_COMPILE_OPTION "${_MPI_COMPILE_OPTION}") + # Ignore -fstack-protector directives: These occur on MPICH and MVAPICH when the libraries + # themselves were built with this flag. However, this flag is unrelated to using MPI, and + # we won't match the accompanying --param-ssp-size and -Wp,-D_FORTIFY_SOURCE flags and therefore + # produce inconsistent results with the regularly flags. + # Similarly, aliasing flags do not belong into our flag array. + if(NOT "${_MPI_COMPILE_OPTION}" MATCHES "^-f(stack-protector|(no-|)strict-aliasing|PI[CE]|pi[ce])") + list(APPEND MPI_COMPILE_OPTIONS_WORK "${_MPI_COMPILE_OPTION}") + endif() + endforeach() + + # Same deal, with the definitions. We also treat arguments passed to the preprocessor directly. + string(REGEX MATCHALL "(^| )(-Wp,|-Xpreprocessor |)[-/]D([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_DEFINITIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_DEFINITION IN LISTS MPI_ALL_COMPILE_DEFINITIONS) + string(REGEX REPLACE "^ ?(-Wp,|-Xpreprocessor )?[-/]D" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + string(REPLACE "\"" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + if(NOT "${_MPI_COMPILE_DEFINITION}" MATCHES "^_FORTIFY_SOURCE.*") + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${_MPI_COMPILE_DEFINITION}") + endif() + endforeach() + + # Extract include paths from compile command line + string(REGEX MATCHALL "(^| )[-/]I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:incdirs. + if (NOT MPI_ALL_INCLUDE_PATHS) + _MPI_check_compiler(${LANG} "-showme:incdirs" MPI_INCDIRS_CMDLINE MPI_INCDIRS_COMPILER_RETURN) + if(MPI_INCDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_INCLUDE_PATHS NATIVE_COMMAND "${MPI_INCDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_INCLUDE_PATH IN LISTS MPI_ALL_INCLUDE_PATHS) + string(REGEX REPLACE "^ ?[-/]I" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + string(REPLACE "\"" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + get_filename_component(_MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}" REALPATH) + list(APPEND MPI_INCLUDE_DIRS_WORK "${_MPI_INCLUDE_PATH}") + endforeach() + + # Extract linker paths from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker |)(-L|[/-]LIBPATH:|[/-]libpath:)([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:libdirs. + if (NOT MPI_ALL_LINK_PATHS) + _MPI_check_compiler(${LANG} "-showme:libdirs" MPI_LIBDIRS_CMDLINE MPI_LIBDIRS_COMPILER_RETURN) + if(MPI_LIBDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_LINK_PATHS NATIVE_COMMAND "${MPI_LIBDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_LPATH IN LISTS MPI_ALL_LINK_PATHS) + string(REGEX REPLACE "^ ?(-Wl,|-Xlinker )?(-L|[/-]LIBPATH:|[/-]libpath:)" "" _MPI_LPATH "${_MPI_LPATH}") + string(REPLACE "\"" "" _MPI_LPATH "${_MPI_LPATH}") + get_filename_component(_MPI_LPATH "${_MPI_LPATH}" REALPATH) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${_MPI_LPATH}") + endforeach() + + # Extract linker flags from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker )([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LINK_FLAG IN LISTS MPI_ALL_LINK_FLAGS) + string(STRIP "${_MPI_LINK_FLAG}" _MPI_LINK_FLAG) + # MPI might be marked to build with non-executable stacks but this should not propagate. + if (NOT "${_MPI_LINK_FLAG}" MATCHES "(-Wl,|-Xlinker )-z,noexecstack") + if (MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " ${_MPI_LINK_FLAG}") + else() + set(MPI_LINK_FLAGS_WORK "${_MPI_LINK_FLAG}") + endif() + endif() + endforeach() + + # Extract the set of libraries to link against from the link command + # line + string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ ?-l" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + + if(WIN32) + # A compiler wrapper on Windows will just have the name of the + # library to link on its link line, potentially with a full path + string(REGEX MATCHALL "(^| )([^\" ]+\\.lib|\"[^\"]+\\.lib\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + else() + # On UNIX platforms, archive libraries can be given with full path. + string(REGEX MATCHALL "(^| )([^\" ]+\\.a|\"[^\"]+\\.a\")" MPI_LIBFULLPATHS "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBFULLPATHS) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + endif() + + # An MPI compiler wrapper could have its MPI libraries in the implictly + # linked directories of the compiler itself. + if(DEFINED CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}") + endif() + + # Determine full path names for all of the libraries that one needs + # to link against in an MPI program + unset(MPI_PLAIN_LIB_NAMES_WORK) + foreach(_MPI_LIB_NAME IN LISTS MPI_LIB_NAMES_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_NAME}" NAME_WE) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${MPI_LINK_DIRECTORIES_WORK} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + + # Deal with the libraries given with full path next + unset(MPI_DIRECT_LIB_NAMES_WORK) + foreach(_MPI_LIB_FULLPATH IN LISTS MPI_LIB_FULLPATHS_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME) + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_FULLPATH}" DIRECTORY) + list(APPEND MPI_DIRECT_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_PATH} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + if(MPI_DIRECT_LIB_NAMES_WORK) + set(MPI_PLAIN_LIB_NAMES_WORK "${MPI_DIRECT_LIB_NAMES_WORK};${MPI_PLAIN_LIB_NAMES_WORK}") + endif() + + # MPI might require pthread to work. The above mechanism wouldn't detect it, but we need to + # link it in that case. -lpthread is covered by the normal library treatment on the other hand. + if("${MPI_COMPILE_CMDLINE}" MATCHES "-pthread") + list(APPEND MPI_COMPILE_OPTIONS_WORK "-pthread") + if(MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " -pthread") + else() + set(MPI_LINK_FLAGS_WORK "-pthread") + endif() + endif() + + if(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS}") + endif() + if(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + list(APPEND MPI_COMPILE_OPTIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_EXTRA_LIB_NAMES) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${MPI_${LANG}_EXTRA_LIB_NAMES}") + endif() + + # If we found MPI, set up all of the appropriate cache entries + if(NOT MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_COMPILE_OPTIONS_WORK} CACHE STRING "MPI ${LANG} compilation options" FORCE) + endif() + if(NOT MPI_${LANG}_COMPILE_DEFINITIONS) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_COMPILE_DEFINITIONS_WORK} CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_INCLUDE_DIRS_WORK} CACHE STRING "MPI ${LANG} additional include directories" FORCE) + endif() + if(NOT MPI_${LANG}_LINK_FLAGS) + set(MPI_${LANG}_LINK_FLAGS ${MPI_LINK_FLAGS_WORK} CACHE STRING "MPI ${LANG} linker flags" FORCE) + endif() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES ${MPI_PLAIN_LIB_NAMES_WORK} CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + set(MPI_${LANG}_WRAPPER_FOUND TRUE PARENT_SCOPE) +endfunction() + +function(_MPI_guess_settings LANG) + set(MPI_GUESS_FOUND FALSE) + # Currently only MSMPI and MPICH2 on Windows are supported, so we can skip this search if we're not targeting that. + if(WIN32) + # MSMPI + + # The environment variables MSMPI_INC and MSMPILIB32/64 are the only ways of locating the MSMPI_SDK, + # which is installed separately from the runtime. Thus it's possible to have mpiexec but not MPI headers + # or import libraries and vice versa. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MSMPI") + # We first attempt to locate the msmpi.lib. Should be find it, we'll assume that the MPI present is indeed + # Microsoft MPI. + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB64}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x64") + else() + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB32}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x86") + endif() + + find_library(MPI_msmpi_LIBRARY + NAMES msmpi + HINTS ${MPI_MSMPI_LIB_PATH} + DOC "Location of the msmpi library for Microsoft MPI") + mark_as_advanced(MPI_msmpi_LIBRARY) + + if(MPI_msmpi_LIBRARY) + # Next, we attempt to locate the MPI header. Note that for Fortran we know that mpif.h is a way + # MSMPI can be used and therefore that header has to be present. + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + get_filename_component(MPI_MSMPI_INC_DIR "$ENV{MSMPI_INC}" REALPATH) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MSMPI_INC_DIR}" CACHE STRING "MPI ${LANG} additional include directories" FORCE) + unset(MPI_MSMPI_INC_DIR) + endif() + + # For MSMPI, one can compile the MPI module by building the mpi.f90 shipped with the MSMPI SDK, + # thus it might be present or provided by the user. Figuring out which is supported is done later on. + # The PGI Fortran compiler for instance ships a prebuilt set of modules in its own include folder. + # Should a user be employing PGI or have built its own set and provided it via cache variables, the + # splitting routine would have located the module files. + + # For C and C++, we're done here (MSMPI does not ship the MPI-2 C++ bindings) - however, for Fortran + # we need some extra library to glue Fortran support together: + # MSMPI ships 2-4 Fortran libraries, each for different Fortran compiler behaviors. The library names + # ending with a c are using the cdecl calling convention, whereas those ending with an s are for Fortran + # implementations using stdcall. Therefore, the 64-bit MSMPI only ships those ending in 'c', whereas the 32-bit + # has both variants available. + # The second difference is the last but one letter, if it's an e(nd), the length of a string argument is + # passed by the Fortran compiler after all other arguments on the parameter list, if it's an m(ixed), + # it's passed immediately after the string address. + + # To summarize: + # - msmpifec: CHARACTER length passed after the parameter list and using cdecl calling convention + # - msmpifmc: CHARACTER length passed directly after string address and using cdecl calling convention + # - msmpifes: CHARACTER length passed after the parameter list and using stdcall calling convention + # - msmpifms: CHARACTER length passed directly after string address and using stdcall calling convention + # 32-bit MSMPI ships all four libraries, 64-bit MSMPI ships only the first two. + + # As is, Intel Fortran and PGI Fortran both use the 'ec' variant of the calling convention, whereas + # the old Compaq Visual Fortran compiler defaulted to the 'ms' version. It's possible to make Intel Fortran + # use the CVF calling convention using /iface:cvf, but we assume - and this is also assumed in FortranCInterface - + # this isn't the case. It's also possible to make CVF use the 'ec' variant, using /iface=(cref,nomixed_str_len_arg). + + # Our strategy is now to locate all libraries, but enter msmpifec into the LIB_NAMES array. + # Should this not be adequate it's a straightforward way for a user to change the LIB_NAMES array and + # have his library found. Still, this should not be necessary outside of exceptional cases, as reasoned. + if ("${LANG}" STREQUAL "Fortran") + set(MPI_MSMPI_CALLINGCONVS c) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 4) + list(APPEND MPI_MSMPI_CALLINGCONVS s) + endif() + foreach(mpistrlenpos IN ITEMS e m) + foreach(mpicallingconv IN LISTS MPI_MSMPI_CALLINGCONVS) + find_library(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY + NAMES msmpif${mpistrlenpos}${mpicallingconv} + HINTS "${MPI_MSMPI_LIB_PATH}" + DOC "Location of the msmpi${mpistrlenpos}${mpicallingconv} library for Microsoft MPI") + mark_as_advanced(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY) + endforeach() + endforeach() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi;msmpifec" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + + # At this point we're *not* done. MSMPI requires an additional include file for Fortran giving the value + # of MPI_AINT. This file is called mpifptr.h located in the x64 and x86 subfolders, respectively. + find_path(MPI_mpifptr_INCLUDE_DIR + NAMES "mpifptr.h" + HINTS "${MPI_MSMPI_INC_PATH_EXTRA}" + DOC "Location of the mpifptr.h extra header for Microsoft MPI") + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS "mpifptr" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + mark_as_advanced(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS MPI_mpifptr_INCLUDE_DIR) + else() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + endif() + mark_as_advanced(MPI_${LANG}_LIB_NAMES) + set(MPI_GUESS_FOUND TRUE) + endif() + endif() + + # At this point there's not many MPIs that we could still consider. + # OpenMPI 1.6.x and below supported Windows, but these ship compiler wrappers that still work. + # The only other relevant MPI implementation without a wrapper is MPICH2, which had Windows support in 1.4.1p1 and older. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MPICH2") + set(MPI_MPICH_PREFIX_PATHS + "$ENV{ProgramW6432}/MPICH2/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH\\SMPD;binary]/../lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH2;Path]/lib" + ) + + # All of C, C++ and Fortran will need mpi.lib, so we'll look for this first + find_library(MPI_mpi_LIBRARY + NAMES mpi + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_mpi_LIBRARY) + # If we found mpi.lib, we detect the rest of MPICH2 + if(MPI_mpi_LIBRARY) + set(MPI_MPICH_LIB_NAMES "mpi") + # If MPI-2 C++ bindings are requested, we need to locate cxx.lib as well. + # Otherwise, MPICH_SKIP_MPICXX will be defined and these bindings aren't needed. + if("${LANG}" STREQUAL "CXX" AND NOT MPI_CXX_SKIP_MPICXX) + find_library(MPI_cxx_LIBRARY + NAMES cxx + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_cxx_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "cxx") + # For Fortran, MPICH2 provides three different libraries: + # fmpich2.lib which uses uppercase symbols and cdecl, + # fmpich2s.lib which uses uppercase symbols and stdcall (32-bit only), + # fmpich2g.lib which uses lowercase symbols with double underscores and cdecl. + # fmpich2s.lib would be useful for Compaq Visual Fortran, fmpich2g.lib has to be used with GNU g77 and is also + # provided in the form of an .a archive for MinGW and Cygwin. From our perspective, fmpich2.lib is the only one + # we need to try, and if it doesn't work with the given Fortran compiler we'd find out later on during validation + elseif("${LANG}" STREQUAL "Fortran") + find_library(MPI_fmpich2_LIBRARY + NAMES fmpich2 + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2s_LIBRARY + NAMES fmpich2s + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2g_LIBRARY + NAMES fmpich2g + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_fmpich2_LIBRARY MPI_fmpich2s_LIBRARY MPI_fmpich2g_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "fmpich2") + endif() + + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "${MPI_MPICH_LIB_NAMES}" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + unset(MPI_MPICH_LIB_NAMES) + + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + # For MPICH2, the include folder would be in ../include relative to the library folder. + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_mpi_LIBRARY}" DIRECTORY) + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_MPICH_ROOT_DIR}" DIRECTORY) + if(IS_DIRECTORY "${MPI_MPICH_ROOT_DIR}/include") + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MPICH_ROOT_DIR}/include" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + unset(MPI_MPICH_ROOT_DIR) + endif() + set(MPI_GUESS_FOUND TRUE) + endif() + unset(MPI_MPICH_PREFIX_PATHS) + endif() + endif() + set(MPI_${LANG}_GUESS_FOUND "${MPI_GUESS_FOUND}" PARENT_SCOPE) +endfunction() + +function(_MPI_adjust_compile_definitions LANG) + if("${LANG}" STREQUAL "CXX") + # To disable the C++ bindings, we need to pass some definitions since the mpi.h header has to deal with both C and C++ + # bindings in MPI-2. + if(MPI_CXX_SKIP_MPICXX AND NOT MPI_${LANG}_COMPILE_DEFINITIONS MATCHES "SKIP_MPICXX") + # MPICH_SKIP_MPICXX is being used in MPICH and derivatives like MVAPICH or Intel MPI + # OMPI_SKIP_MPICXX is being used in Open MPI + # _MPICC_H is being used for IBM Platform MPI + list(APPEND MPI_${LANG}_COMPILE_DEFINITIONS "MPICH_SKIP_MPICXX" "OMPI_SKIP_MPICXX" "_MPICC_H") + set(MPI_${LANG}_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}" CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + endif() +endfunction() + +macro(_MPI_assemble_libraries LANG) + set(MPI_${LANG}_LIBRARIES "") + # Only for libraries do we need to check whether the compiler's linking stage is separate. + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS_IMPLICIT) + foreach(mpilib IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_LIBRARIES ${MPI_${mpilib}_LIBRARY}) + endforeach() + endif() +endmacro() + +macro(_MPI_assemble_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_${LANG}_INCLUDE_DIRS "") + else() + set(MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS}") + if("${LANG}" MATCHES "(C|CXX)") + if(MPI_${LANG}_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + else() # Fortran + if(MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_F77_HEADER_DIR}") + endif() + if(MPI_${LANG}_MODULE_DIR AND NOT "${MPI_${LANG}_MODULE_DIR}" IN_LIST MPI_${LANG}_INCLUDE_DIRS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_MODULE_DIR}") + endif() + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(MPI_ADDITIONAL_INC_DIR IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${MPI_ADDITIONAL_INC_DIR}_INCLUDE_DIR}") + endforeach() + endif() + endif() +endmacro() + +function(_MPI_split_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + return() + endif() + # Backwards compatibility: Search INCLUDE_PATH if given. + if(MPI_${LANG}_INCLUDE_PATH) + list(APPEND MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_INCLUDE_PATH}") + endif() + + # We try to find the headers/modules among those paths (and system paths) + # For C/C++, we just need to have a look for mpi.h. + if("${LANG}" MATCHES "(C|CXX)") + find_path(MPI_${LANG}_HEADER_DIR "mpi.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + mark_as_advanced(MPI_${LANG}_HEADER_DIR) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + # Fortran is more complicated here: An implementation could provide + # any of the Fortran 77/90/2008 APIs for MPI. For example, MSMPI + # only provides Fortran 77 and - if mpi.f90 is built - potentially + # a Fortran 90 module. + elseif("${LANG}" STREQUAL "Fortran") + find_path(MPI_${LANG}_F77_HEADER_DIR "mpif.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + find_path(MPI_${LANG}_MODULE_DIR + NAMES "mpi.mod" "mpi_f08.mod" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS + "${MPI_${LANG}_F77_HEADER_DIR}" + "${MPI_${LANG}_MODULE_DIR}" + ) + endif() + mark_as_advanced(MPI_${LANG}_F77_HEADER_DIR MPI_${LANG}_MODULE_DIR) + endif() + # Remove duplicates and default system directories from the list. + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_DUPLICATES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + foreach(MPI_IMPLICIT_INC_DIR IN LISTS CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_IMPLICIT_INC_DIR}) + endforeach() + endif() + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories" FORCE) +endfunction() + +macro(_MPI_create_imported_target LANG) + if(NOT TARGET MPI::MPI_${LANG}) + add_library(MPI::MPI_${LANG} INTERFACE IMPORTED) + endif() + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}") + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}") + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_LINK_LIBRARIES "") + if(MPI_${LANG}_LINK_FLAGS) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LINK_FLAGS}") + endif() + # If the compiler links MPI implicitly, no libraries will be found as they're contained within + # CMAKE__IMPLICIT_LINK_LIBRARIES already. + if(MPI_${LANG}_LIBRARIES) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LIBRARIES}") + endif() + # Given the new design of FindMPI, INCLUDE_DIRS will always be located, even under implicit linking. + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${MPI_${LANG}_INCLUDE_DIRS}") +endmacro() + +function(_MPI_try_staged_settings LANG MPI_TEST_FILE_NAME MODE RUN_BINARY) + set(WORK_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI") + set(SRC_DIR "${CMAKE_CURRENT_LIST_DIR}/FindMPI") + set(BIN_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI/${MPI_TEST_FILE_NAME}_${LANG}.bin") + unset(MPI_TEST_COMPILE_DEFINITIONS) + if("${LANG}" STREQUAL "Fortran") + if("${MODE}" STREQUAL "F90_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi\n implicit none") + elseif("${MODE}" STREQUAL "F08_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi_f08\n implicit none") + else() # F77 header + set(MPI_Fortran_INCLUDE_LINE "implicit none\n include 'mpif.h'") + endif() + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.f90.in" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90" @ONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90") + elseif("${LANG}" STREQUAL "CXX") + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.c" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp" COPYONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp") + if("${MODE}" STREQUAL "TEST_MPICXX") + set(MPI_TEST_COMPILE_DEFINITIONS TEST_MPI_MPICXX) + endif() + else() # C + set(MPI_TEST_SOURCE_FILE "${SRC_DIR}/${MPI_TEST_FILE_NAME}.c") + endif() + if(RUN_BINARY) + try_run(MPI_RUN_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + RUN_OUTPUT_VARIABLE MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}) + set(MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} "${MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}}" PARENT_SCOPE) + else() + try_compile(MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + COPY_FILE "${BIN_FILE}") + endif() +endfunction() + +macro(_MPI_check_lang_works LANG) + # For Fortran we may have by the MPI-3 standard an implementation that provides: + # - the mpi_f08 module + # - *both*, the mpi module and 'mpif.h' + # Since older MPI standards (MPI-1) did not define anything but 'mpif.h', we need to check all three individually. + if( NOT MPI_${LANG}_WORKS ) + if("${LANG}" STREQUAL "Fortran") + set(MPI_Fortran_INTEGER_LINE "(kind=MPI_INTEGER_KIND)") + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F90_MODULE FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F08_MODULE FALSE) + + set(MPI_${LANG}_WORKS FALSE) + + foreach(mpimethod IN ITEMS F77_HEADER F08_MODULE F90_MODULE) + if(MPI_RESULT_${LANG}_test_mpi_${mpimethod}) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_${mpimethod} TRUE) + else() + set(MPI_${LANG}_HAVE_${mpimethod} FALSE) + endif() + endforeach() + # MPI-1 versions had no MPI_INTGER_KIND defined, so we need to try without it. + # However, MPI-1 also did not define the Fortran 90 and 08 modules, so we only try the F77 header. + unset(MPI_Fortran_INTEGER_LINE) + if(NOT MPI_${LANG}_WORKS) + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER_NOKIND FALSE) + if(MPI_RESULT_${LANG}_test_mpi_F77_HEADER_NOKIND) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_F77_HEADER TRUE) + endif() + endif() + else() + _MPI_try_staged_settings(${LANG} test_mpi normal FALSE) + # If 'test_mpi' built correctly, we've found valid MPI settings. There might not be MPI-2 C++ support, but there can't + # be MPI-2 C++ support without the C bindings being present, so checking for them is sufficient. + set(MPI_${LANG}_WORKS "${MPI_RESULT_${LANG}_test_mpi_normal}") + endif() + endif() +endmacro() + +# Some systems install various MPI implementations in separate folders in some MPI prefix +# This macro enumerates all such subfolders and adds them to the list of hints that will be searched. +macro(MPI_search_mpi_prefix_folder PREFIX_FOLDER) + if(EXISTS "${PREFIX_FOLDER}") + file(GLOB _MPI_folder_children RELATIVE "${PREFIX_FOLDER}" "${PREFIX_FOLDER}/*") + foreach(_MPI_folder_child IN LISTS _MPI_folder_children) + if(IS_DIRECTORY "${PREFIX_FOLDER}/${_MPI_folder_child}") + list(APPEND MPI_HINT_DIRS "${PREFIX_FOLDER}/${_MPI_folder_child}") + endif() + endforeach() + endif() +endmacro() + +set(MPI_HINT_DIRS ${MPI_HOME} $ENV{MPI_ROOT} $ENV{MPI_HOME} $ENV{I_MPI_ROOT}) +if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux") + # SUSE Linux Enterprise Server stores its MPI implementations under /usr/lib64/mpi/gcc/ + # We enumerate the subfolders and append each as a prefix + MPI_search_mpi_prefix_folder("/usr/lib64/mpi/gcc") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # MSMPI stores its runtime in a special folder, this adds the possible locations to the hints. + list(APPEND MPI_HINT_DIRS $ENV{MSMPI_BIN} "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MPI;InstallRoot]") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "FreeBSD") + # FreeBSD ships mpich under the normal system paths - but available openmpi implementations + # will be found in /usr/local/mpi/ + MPI_search_mpi_prefix_folder("/usr/local/mpi") +endif() + +# Most MPI distributions have some form of mpiexec or mpirun which gives us something we can look for. +# The MPI standard does not mandate the existence of either, but instead only makes requirements if a distribution +# ships an mpiexec program (mpirun executables are not regulated by the standard). +find_program(MPIEXEC_EXECUTABLE + NAMES ${_MPIEXEC_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${MPI_HINT_DIRS} + DOC "Executable for running MPI programs.") + +# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin). +# This gives us a fairly reliable base directory to search for /bin /lib and /include from. +get_filename_component(_MPI_BASE_DIR "${MPIEXEC_EXECUTABLE}" PATH) +get_filename_component(_MPI_BASE_DIR "${_MPI_BASE_DIR}" PATH) + +# According to the MPI standard, section 8.8 -n is a guaranteed, and the only guaranteed way to +# launch an MPI process using mpiexec if such a program exists. +set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "Flag used by MPI to specify the number of processes for mpiexec; the next option will be the number of processes.") +set(MPIEXEC_PREFLAGS "" CACHE STRING "These flags will be directly before the executable that is being run by mpiexec.") +set(MPIEXEC_POSTFLAGS "" CACHE STRING "These flags will be placed after all flags passed to mpiexec.") + +# Set the number of processes to the physical processor count +cmake_host_system_information(RESULT _MPIEXEC_NUMPROCS QUERY NUMBER_OF_PHYSICAL_CORES) +set(MPIEXEC_MAX_NUMPROCS "${_MPIEXEC_NUMPROCS}" CACHE STRING "Maximum number of processors available to run MPI applications.") +unset(_MPIEXEC_NUMPROCS) +mark_as_advanced(MPIEXEC_EXECUTABLE MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS) + +#============================================================================= +# Backward compatibility input hacks. Propagate the FindMPI hints to C and +# CXX if the respective new versions are not defined. Translate the old +# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${LANG}_LIBRARIES. +# +# Once we find the new variables, we translate them back into their old +# equivalents below. +if(NOT MPI_IGNORE_LEGACY_VARIABLES) + foreach (LANG IN ITEMS C CXX) + # Old input variables. + set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS) + + # Set new vars based on their old equivalents, if the new versions are not already set. + foreach (var ${_MPI_OLD_INPUT_VARS}) + if (NOT MPI_${LANG}_${var} AND MPI_${var}) + set(MPI_${LANG}_${var} "${MPI_${var}}") + endif() + endforeach() + + # Chop the old compile flags into options and definitions + + unset(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + unset(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + if(MPI_${LANG}_COMPILE_FLAGS) + separate_arguments(MPI_SEPARATE_FLAGS NATIVE_COMMAND "${MPI_${LANG}_COMPILE_FLAGS}") + foreach(_MPI_FLAG IN LISTS MPI_SEPARATE_FLAGS) + if("${_MPI_FLAG}" MATCHES "^ *[-/D]([^ ]+)") + list(APPEND MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS "${CMAKE_MATCH_1}") + else() + list(APPEND MPI_${LANG}_EXTRA_COMPILE_OPTIONS "${_MPI_FLAG}") + endif() + endforeach() + unset(MPI_SEPARATE_FLAGS) + endif() + + # If a list of libraries was given, we'll split it into new-style cache variables + unset(MPI_${LANG}_EXTRA_LIB_NAMES) + if(NOT MPI_${LANG}_LIB_NAMES) + foreach(_MPI_LIB IN LISTS MPI_${LANG}_LIBRARIES MPI_LIBRARY MPI_EXTRA_LIBRARY) + if(_MPI_LIB) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB}" NAME) + get_filename_component(_MPI_LIB_DIR "${_MPI_LIB}" DIRECTORY) + list(APPEND MPI_${LANG}_EXTRA_LIB_NAMES "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_DIR} $ENV{MPI_LIB} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endif() + endforeach() + endif() + endforeach() +endif() +#============================================================================= + +unset(MPI_VERSION) +unset(MPI_VERSION_MAJOR) +unset(MPI_VERSION_MINOR) + +unset(_MPI_MIN_VERSION) + +# If the user specified a library name we assume they prefer that library over a wrapper. If not, they can disable skipping manually. +if(NOT DEFINED MPI_SKIP_COMPILER_WRAPPER AND MPI_GUESS_LIBRARY_NAME) + set(MPI_SKIP_COMPILER_WRAPPER TRUE) +endif() + +# This loop finds the compilers and sends them off for interrogation. +foreach(LANG IN ITEMS C CXX Fortran) + if(CMAKE_${LANG}_COMPILER_LOADED) + if(NOT MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} IN_LIST MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} STREQUAL CXX AND NOT MPI_CXX_SKIP_MPICXX AND MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(_MPI_FIND_${LANG} TRUE) + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + if(_MPI_FIND_${LANG}) + if( ${LANG} STREQUAL CXX AND NOT MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(MPI_CXX_SKIP_MPICXX FALSE CACHE BOOL "If true, the MPI-2 C++ bindings are disabled using definitions.") + mark_as_advanced(MPI_CXX_SKIP_MPICXX) + endif() + if(NOT (MPI_${LANG}_LIB_NAMES AND (MPI_${LANG}_INCLUDE_PATH OR MPI_${LANG}_INCLUDE_DIRS OR MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS))) + set(MPI_${LANG}_TRIED_IMPLICIT FALSE) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + if(NOT MPI_${LANG}_COMPILER AND NOT MPI_ASSUME_NO_BUILTIN_MPI) + # Should the imported targets be empty, we effectively try whether the compiler supports MPI on its own, which is the case on e.g. + # Cray PrgEnv. + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + + # If the compiler can build MPI code on its own, it functions as an MPI compiler and we'll set the variable to point to it. + if(MPI_${LANG}_WORKS) + set(MPI_${LANG}_COMPILER "${CMAKE_${LANG}_COMPILER}" CACHE FILEPATH "MPI compiler for ${LANG}" FORCE) + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + set(MPI_${LANG}_TRIED_IMPLICIT TRUE) + endif() + + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WRAPPER_FOUND FALSE) + set(MPI_PINNED_COMPILER FALSE) + + if(NOT MPI_SKIP_COMPILER_WRAPPER) + if(MPI_${LANG}_COMPILER) + # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler. + if (NOT IS_ABSOLUTE "${MPI_${LANG}_COMPILER}") + # Get rid of our default list of names and just search for the name the user wants. + set(_MPI_${LANG}_COMPILER_NAMES "${MPI_${LANG}_COMPILER}") + unset(MPI_${LANG}_COMPILER CACHE) + endif() + # If the user specifies a compiler, we don't want to try to search libraries either. + set(MPI_PINNED_COMPILER TRUE) + endif() + + # If we have an MPI base directory, we'll try all compiler names in that one first. + # This should prevent mixing different MPI environments + if(_MPI_BASE_DIR) + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${_MPI_BASE_DIR} + NO_DEFAULT_PATH + DOC "MPI compiler for ${LANG}" + ) + endif() + + # If the base directory did not help (for example because the mpiexec isn't in the same directory as the compilers), + # we shall try searching in the default paths. + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + DOC "MPI compiler for ${LANG}" + ) + + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_PINNED_COMPILER TRUE) + + # If we haven't made the implicit compiler test yet, perform it now. + if(NOT MPI_${LANG}_TRIED_IMPLICIT) + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + endif() + + # Should the MPI compiler not work implicitly for MPI, still interrogate it. + # Otherwise, MPI compilers for which CMake has separate linking stages, e.g. Intel MPI on Windows where link.exe is being used + # directly during linkage instead of CMAKE__COMPILER will not work. + if(NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + _MPI_interrogate_compiler(${LANG}) + else() + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + elseif(MPI_${LANG}_COMPILER) + _MPI_interrogate_compiler(${LANG}) + endif() + endif() + + if(NOT MPI_SKIP_GUESSING AND NOT MPI_${LANG}_WRAPPER_FOUND AND NOT MPI_PINNED_COMPILER) + # For C++, we may use the settings for C. Should a given compiler wrapper for C++ not exist, but one for C does, we copy over the + # settings for C. An MPI distribution that is in this situation would be IBM Platform MPI. + if("${LANG}" STREQUAL "CXX" AND MPI_C_WRAPPER_FOUND) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_C_COMPILE_OPTIONS} CACHE STRING "MPI ${LANG} compilation options" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS} CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_C_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS ${MPI_C_LINK_FLAGS} CACHE STRING "MPI ${LANG} linker flags" ) + set(MPI_${LANG}_LIB_NAMES ${MPI_C_LIB_NAMES} CACHE STRING "MPI ${LANG} libraries to link against" ) + else() + _MPI_guess_settings(${LANG}) + endif() + endif() + endif() + endif() + + _MPI_split_include_dirs(${LANG}) + _MPI_assemble_include_dirs(${LANG}) + _MPI_assemble_libraries(${LANG}) + + _MPI_adjust_compile_definitions(${LANG}) + # We always create imported targets even if they're empty + _MPI_create_imported_target(${LANG}) + + if(NOT MPI_${LANG}_WORKS) + _MPI_check_lang_works(${LANG}) + endif() + + # Next, we'll initialize the MPI variables that have not been previously set. + set(MPI_${LANG}_COMPILE_OPTIONS "" CACHE STRING "MPI ${LANG} compilation flags" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS "" CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "" CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS "" CACHE STRING "MPI ${LANG} linker flags" ) + if(NOT MPI_${LANG}_COMPILER STREQUAL CMAKE_${LANG}_COMPILER) + set(MPI_${LANG}_LIB_NAMES "" CACHE STRING "MPI ${LANG} libraries to link against" ) + endif() + mark_as_advanced(MPI_${LANG}_COMPILE_OPTIONS MPI_${LANG}_COMPILE_DEFINITIONS MPI_${LANG}_LINK_FLAGS + MPI_${LANG}_LIB_NAMES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS MPI_${LANG}_COMPILER) + + # If we've found MPI, then we'll perform additional analysis: Determine the MPI version, MPI library version, supported + # MPI APIs (i.e. MPI-2 C++ bindings). For Fortran we also need to find specific parameters if we're under MPI-3. + if(MPI_${LANG}_WORKS) + if("${LANG}" STREQUAL "CXX" AND NOT DEFINED MPI_MPICXX_FOUND) + if(NOT MPI_CXX_SKIP_MPICXX AND NOT MPI_CXX_VALIDATE_SKIP_MPICXX) + _MPI_try_staged_settings(${LANG} test_mpi MPICXX FALSE) + if(MPI_RESULT_${LANG}_test_mpi_MPICXX) + set(MPI_MPICXX_FOUND TRUE) + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + endif() + + # At this point, we know the bindings present but not the MPI version or anything else. + if(NOT DEFINED MPI_${LANG}_VERSION) + unset(MPI_${LANG}_VERSION_MAJOR) + unset(MPI_${LANG}_VERSION_MINOR) + endif() + set(MPI_BIN_FOLDER ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI) + + # For Fortran, we'll want to use the most modern MPI binding to test capabilities other than the + # Fortran parameters, since those depend on the method of consumption. + # For C++, we can always use the C bindings, and should do so, since the C++ bindings do not exist in MPI-3 + # whereas the C bindings do, and the C++ bindings never offered any feature advantage over their C counterparts. + if("${LANG}" STREQUAL "Fortran") + if(MPI_${LANG}_HAVE_F08_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F08_MODULE) + elseif(MPI_${LANG}_HAVE_F90_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F90_MODULE) + else() + set(MPI_${LANG}_HIGHEST_METHOD F77_HEADER) + endif() + + # Another difference between C and Fortran is that we can't use the preprocessor to determine whether MPI_VERSION + # and MPI_SUBVERSION are provided. These defines did not exist in MPI 1.0 and 1.1 and therefore might not + # exist. For C/C++, test_mpi.c will handle the MPI_VERSION extraction, but for Fortran, we need mpiver.f90. + if(NOT DEFINED MPI_${LANG}_VERSION) + _MPI_try_staged_settings(${LANG} mpiver ${MPI_${LANG}_HIGHEST_METHOD} FALSE) + if(MPI_RESULT_${LANG}_mpiver_${MPI_${LANG}_HIGHEST_METHOD}) + file(STRINGS ${MPI_BIN_FOLDER}/mpiver_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + # Finally, we want to find out which capabilities a given interface supports, compare the MPI-3 standard. + # This is determined by interface specific parameters MPI_SUBARRAYS_SUPPORTED and MPI_ASYNC_PROTECTS_NONBLOCKING + # and might vary between the different methods of consumption. + if(MPI_DETERMINE_Fortran_CAPABILITIES AND NOT MPI_Fortran_CAPABILITIES_DETERMINED) + foreach(mpimethod IN ITEMS F08_MODULE F90_MODULE F77_HEADER) + if(MPI_${LANG}_HAVE_${mpimethod}) + set(MPI_${LANG}_${mpimethod}_SUBARRAYS FALSE) + set(MPI_${LANG}_${mpimethod}_ASYNCPROT FALSE) + _MPI_try_staged_settings(${LANG} fortranparam_mpi ${mpimethod} TRUE) + if(MPI_RESULT_${LANG}_fortranparam_mpi_${mpimethod} AND + NOT "${MPI_RUN_RESULT_${LANG}_fortranparam_mpi_${mpimethod}}" STREQUAL "FAILED_TO_RUN") + if("${MPI_RUN_OUTPUT_${LANG}_fortranparam_mpi_${mpimethod}}" MATCHES + ".*INFO:SUBARRAYS\\[ *([TF]) *\\]-ASYNCPROT\\[ *([TF]) *\\].*") + if("${CMAKE_MATCH_1}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_SUBARRAYS TRUE) + endif() + if("${CMAKE_MATCH_2}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_ASYNCPROT TRUE) + endif() + endif() + endif() + endif() + endforeach() + set(MPI_Fortran_CAPABILITIES_DETERMINED TRUE) + endif() + else() + set(MPI_${LANG}_HIGHEST_METHOD normal) + + # By the MPI-2 standard, MPI_VERSION and MPI_SUBVERSION are valid for both C and C++ bindings. + if(NOT DEFINED MPI_${LANG}_VERSION) + file(STRINGS ${MPI_BIN_FOLDER}/test_mpi_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + unset(MPI_BIN_FOLDER) + + # At this point, we have dealt with determining the MPI version and parameters for each Fortran method available. + # The one remaining issue is to determine which MPI library is installed. + # Determining the version and vendor of the MPI library is only possible via MPI_Get_library_version() at runtime, + # and therefore we cannot do this while cross-compiling (a user may still define MPI__LIBRARY_VERSION_STRING + # themselves and we'll attempt splitting it, which is equivalent to provide the try_run output). + # It's also worth noting that the installed version string can depend on the language, or on the system the binary + # runs on if MPI is not statically linked. + if(MPI_DETERMINE_LIBRARY_VERSION AND NOT MPI_${LANG}_LIBRARY_VERSION_STRING) + _MPI_try_staged_settings(${LANG} libver_mpi ${MPI_${LANG}_HIGHEST_METHOD} TRUE) + if(MPI_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD} AND + "${MPI_RUN_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" EQUAL "0") + string(STRIP "${MPI_RUN_OUTPUT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" + MPI_${LANG}_LIBRARY_VERSION_STRING) + else() + set(MPI_${LANG}_LIBRARY_VERSION_STRING "NOTFOUND") + endif() + endif() + endif() + + set(MPI_${LANG}_FIND_QUIETLY ${MPI_FIND_QUIETLY}) + set(MPI_${LANG}_FIND_VERSION ${MPI_FIND_VERSION}) + set(MPI_${LANG}_FIND_VERSION_EXACT ${MPI_FIND_VERSION_EXACT}) + + unset(MPI_${LANG}_REQUIRED_VARS) + if (NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + foreach(mpilibname IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpilibname}_LIBRARY") + endforeach() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_LIB_NAMES") + if("${LANG}" STREQUAL "Fortran") + # For Fortran we only need one of the module or header directories to have *some* support for MPI. + if(NOT MPI_${LANG}_MODULE_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_F77_HEADER_DIR") + endif() + if(NOT MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_MODULE_DIR") + endif() + else() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_HEADER_DIR") + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(mpiincvar IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpiincvar}_INCLUDE_DIR") + endforeach() + endif() + # Append the works variable now. If the settings did not work, this will show up properly. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + else() + # If the compiler worked implicitly, use its path as output. + # Should the compiler variable be set, we also require it to work. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_COMPILER") + if(MPI_${LANG}_COMPILER) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + endif() + endif() + find_package_handle_standard_args(MPI_${LANG} REQUIRED_VARS ${MPI_${LANG}_REQUIRED_VARS} + VERSION_VAR MPI_${LANG}_VERSION) + + if(DEFINED MPI_${LANG}_VERSION) + if(NOT _MPI_MIN_VERSION OR _MPI_MIN_VERSION VERSION_GREATER MPI_${LANG}_VERSION) + set(_MPI_MIN_VERSION MPI_${LANG}_VERSION) + endif() + endif() + endif() +endforeach() + +unset(_MPI_REQ_VARS) +foreach(LANG IN ITEMS C CXX Fortran) + if((NOT MPI_FIND_COMPONENTS AND CMAKE_${LANG}_COMPILER_LOADED) OR LANG IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_${LANG}_FOUND") + endif() +endforeach() + +if(MPICXX IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_MPICXX_FOUND") +endif() + +find_package_handle_standard_args(MPI + REQUIRED_VARS ${_MPI_REQ_VARS} + VERSION_VAR ${_MPI_MIN_VERSION} + HANDLE_COMPONENTS) + +#============================================================================= +# More backward compatibility stuff + +# For compatibility reasons, we also define MPIEXEC +set(MPIEXEC "${MPIEXEC_EXECUTABLE}") + +# Copy over MPI__INCLUDE_PATH from the assembled INCLUDE_DIRS. +foreach(LANG IN ITEMS C CXX Fortran) + if(MPI_${LANG}_FOUND) + set(MPI_${LANG}_INCLUDE_PATH "${MPI_${LANG}_INCLUDE_DIRS}") + unset(MPI_${LANG}_COMPILE_FLAGS) + if(MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_FLAGS "${MPI_${LANG}_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_COMPILE_DEFINITIONS) + foreach(_MPI_DEF IN LISTS MPI_${LANG}_COMPILE_DEFINITIONS) + string(APPEND MPI_${LANG}_COMPILE_FLAGS " -D${_MPI_DEF}") + endforeach() + endif() + endif() +endforeach() + +# Bare MPI sans ${LANG} vars are set to CXX then C, depending on what was found. +# This mimics the behavior of the old language-oblivious FindMPI. +set(_MPI_OLD_VARS COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES) +if (MPI_CXX_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_CXX_${var}}) + endforeach() +elseif (MPI_C_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_C_${var}}) + endforeach() +endif() + +# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache. +if (MPI_LIBRARIES) + list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK) + set(MPI_LIBRARY "${MPI_LIBRARY_WORK}") + unset(MPI_LIBRARY_WORK) +else() + set(MPI_LIBRARY "MPI_LIBRARY-NOTFOUND") +endif() + +list(LENGTH MPI_LIBRARIES MPI_NUMLIBS) +if (MPI_NUMLIBS GREATER 1) + set(MPI_EXTRA_LIBRARY_WORK "${MPI_LIBRARIES}") + list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0) + set(MPI_EXTRA_LIBRARY "${MPI_EXTRA_LIBRARY_WORK}") + unset(MPI_EXTRA_LIBRARY_WORK) +else() + set(MPI_EXTRA_LIBRARY "MPI_EXTRA_LIBRARY-NOTFOUND") +endif() +set(MPI_IGNORE_LEGACY_VARIABLES TRUE) +#============================================================================= + +# unset these vars to cleanup namespace +unset(_MPI_OLD_VARS) +unset(_MPI_PREFIX_PATH) +unset(_MPI_BASE_DIR) +foreach (lang C CXX Fortran) + unset(_MPI_${LANG}_COMPILER_NAMES) +endforeach() + +cmake_policy(POP) diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in new file mode 100644 index 000000000..30f912c62 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in @@ -0,0 +1,4 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + print *, 'INFO:SUBARRAYS[', MPI_SUBARRAYS_SUPPORTED, ']-ASYNCPROT[', MPI_ASYNC_PROTECTS_NONBLOCKING, ']' + end program mpi_ver diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/libver_mpi.c b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/libver_mpi.c new file mode 100644 index 000000000..be9d19d43 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/libver_mpi.c @@ -0,0 +1,19 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +int main(int argc, char* argv[]) +{ + char mpilibver_str[MPI_MAX_LIBRARY_VERSION_STRING]; + int mpilibver_len; + MPI_Get_library_version(mpilibver_str, &mpilibver_len); +#ifdef __cplusplus + std::puts(mpilibver_str); +#else + puts(mpilibver_str); +#endif +} diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in new file mode 100644 index 000000000..793858716 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in @@ -0,0 +1,7 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: mpilibver_str + integer(kind=MPI_INTEGER_KIND) :: ierror, reslen + call MPI_GET_LIBRARY_VERSION(mpilibver_str, reslen, ierror) + print *, mpilibver_str + end program mpi_ver diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in new file mode 100644 index 000000000..a25452385 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in @@ -0,0 +1,10 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + integer(kind=kind(MPI_VERSION)), parameter :: zero = ichar('0') + character, dimension(17), parameter :: mpiver_str =& + (/ 'I', 'N', 'F', 'O', ':', 'M', 'P', 'I', '-', 'V', 'E', 'R', '[', & + char(zero + MPI_VERSION), & + '.', & + char(zero + MPI_SUBVERSION), ']' /) + print *, mpiver_str + end program mpi_ver diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/test_mpi.c b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/test_mpi.c new file mode 100644 index 000000000..b8a308a4b --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/test_mpi.c @@ -0,0 +1,37 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +const char mpiver_str[] = { 'I', 'N', + 'F', 'O', + ':', 'M', + 'P', 'I', + '-', 'V', + 'E', 'R', + '[', ('0' + MPI_VERSION), + '.', ('0' + MPI_SUBVERSION), + ']', '\0' }; +#endif + +int main(int argc, char* argv[]) +{ +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +#ifdef __cplusplus + std::puts(mpiver_str); +#else + puts(mpiver_str); +#endif +#endif +#ifdef TEST_MPI_MPICXX + MPI::MPI_Init(&argc, &argv); + MPI::MPI_Finalize(); +#else + MPI_Init(&argc, &argv); + MPI_Finalize(); +#endif +} diff --git a/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in new file mode 100644 index 000000000..4d43a04d6 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in @@ -0,0 +1,6 @@ + program hello + @MPI_Fortran_INCLUDE_LINE@ + integer@MPI_Fortran_INTEGER_LINE@ ierror + call MPI_INIT(ierror) + call MPI_FINALIZE(ierror) + end program diff --git a/sorc/hafs_hycom_utils.fd/libs/src/libsia/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/libs/src/libsia/CMakeLists.txt new file mode 100644 index 000000000..6c58251d4 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/src/libsia/CMakeLists.txt @@ -0,0 +1,39 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fc_srcs + sia_cmdarg.f90 + sia_const.f90 + sia_dir.f90 + sia_fileop.f90 + sia_glob.f90 + sia_stat.f90 + sia_subprocess.f90 + sia_time.f90 + sia_treewalk.f90 + sia_mpi_worklist.f90 + sia_usrgrp.f90 + sia_c_dir.c + sia_c_fileop.c + sia_c_glob.c + sia_c_stat.c + sia_c_subprocess.c + sia_c_time.c + sia_c_usrgrp.c) + +set(lib_name sia) +set(lib_dir ${CMAKE_SOURCE_DIR}/libs) + +if(CMAKE_CXX_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -free -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_library(${lib_name} STATIC ${fc_srcs}) +target_link_libraries( + ${lib_name} + MPI::MPI_Fortran) + +install(TARGETS ${lib_name} DESTINATION ${lib_dir}) diff --git a/sorc/hafs_hycom_utils.fd/libs/src/ofs_mods/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/libs/src/ofs_mods/CMakeLists.txt new file mode 100644 index 000000000..3cb030bd2 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/libs/src/ofs_mods/CMakeLists.txt @@ -0,0 +1,26 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fortran_srcs + zh.F + mod_xc.F + mod_za.F + mod_zb.F + wtime.F) + +set(lib_name ofs_mods) +set(lib_dir ${CMAKE_SOURCE_DIR}/libs) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl -integer-size 32 -real-size 32") +endif() + +add_library(${lib_name} STATIC ${fortran_srcs}) +#add_definitions( -DLITTLE_ENDIAN -DWRF -DLINUX -DMPI -DSERIAL_IO -DNAN2003 -DTIMER -DRELO ) + +#target_include_directories(${lib_name} PUBLIC ${CMAKE_SOURCE_DIR}/libs/src/ofs_mods) + +install(TARGETS ${lib_name} DESTINATION ${lib_dir}) diff --git a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.hera b/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.hera deleted file mode 100644 index 11d24aca5..000000000 --- a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.hera +++ /dev/null @@ -1,40 +0,0 @@ -#%Module##################################################### -## Module file for hafs_hycom_utils -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling hycom_utils" -} -module-whatis "hycom_utils prerequisites" - -module use /scratch2/NCEPDEV/nwprod/NCEPLIBS/modulefiles - -module load intel/18.0.5.274 -module load impi/2018.0.4 - -module load jasper/1.900.1 -module load png/1.2.44 -module load z/1.2.11 - -module load g2/3.1.1 -module load g2tmpl/1.6.0 -module load w3emc/2.3.1 -#module load w3emc/2.3.0 -module load w3nco/2.0.7 -module load sp/2.0.3 -#module load sp/2.0.2 -module load ip/3.0.2 -module load bufr/11.3.0 -module load bacio/2.0.3 -module load sigio/2.1.1 -module load sfcio/1.1.1 -module load gfsio/1.1.0 -module load nemsio/2.2.4 -module load nemsiogfs/2.2.1 -module load landsfcutil/2.1.1 - -module load szip/2.1 -module load hdf5_parallel/1.10.6 -module load netcdf_parallel/4.7.4 - -#module use -a /scratch1/NCEPDEV/nems/emc.nemspara/soft/modulefiles -#module load esmf/8.1.0bs19_ParallelNetCDF diff --git a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.jet b/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.jet deleted file mode 100644 index ff473494e..000000000 --- a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.jet +++ /dev/null @@ -1,35 +0,0 @@ -#%Module##################################################### -## Module file for hafs_hycom_utils -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling hycom_utils" -} -module-whatis "hycom_utils prerequisites" - -setenv COREPATH /lfs4/HFIP/hfv3gfs/nwprod/NCEPLIBS/modulefiles -setenv NCEPLIBS /lfs4/HFIP/hfv3gfs/nwprod/NCEPLIBS/modulefiles -module use /lfs4/HFIP/hfv3gfs/nwprod/NCEPLIBS/modulefiles - -module load intel/18.0.5.274 -module load impi/2018.4.274 -module load szip/2.1 -#module load hdf5/1.10.4 -#module load netcdf/4.6.1 -module load hdf5_parallel/1.10.6 -module load netcdf_parallel/4.7.4 -module load w3nco/v2.0.6 -module load w3emc/v2.2.0 -module load sp/v2.0.2 -module load ip/v3.0.0 -module load bacio/v2.0.2 -module load sigio/v2.1.0 -module load sfcio/v1.0.0 -module load nemsio/v2.2.3 -module load nemsiogfs/v2.0.1 -module load gfsio/v1.1.0 -module load landsfcutil/v2.1.0 -module load g2/v3.1.0 - -module load jasper/v1.900.1 -module load png/v1.2.44 -module load z/v1.2.6 diff --git a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.orion b/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.orion deleted file mode 100644 index 7e75835d8..000000000 --- a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.orion +++ /dev/null @@ -1,46 +0,0 @@ -#%Module##################################################### -## Module file for hafs_hycom_utils -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling hycom_utils" -} -module-whatis "hycom_utils prerequisites" - -module load intel/2020 -module load impi/2020 -module load szip/2.1.1 - -#module load hdf5/1.10.5 -#module load netcdf/4.7.2 - -module use /apps/contrib/NCEPLIBS/orion/modulefiles - -#module load hdf5/1.10.1 -#module load netcdf/4.5.0 -#module load hdf5_parallel/1.12.0 -#module load netcdf_parallel/4.7.5 - -module load jasper/1.900.2 -module load png/1.2.44 -module load z/1.2.6 -module load g2/3.1.1 -module load g2tmpl/1.6.0 -module load w3emc/2.4.0 -module load w3nco/2.0.7 -module load sp/2.0.3 -module load ip/3.0.2 -#module load bufr/11.4.0 # hafs_tools.fd failed -module load bufr/11.2.0 -module load bacio/2.0.3 -module load sigio/2.2.0 -module load sfcio/1.2.0 -module load gfsio/1.2.0 -module load nemsio/2.2.4 -module load nemsiogfs/2.3.0 -module load landsfcutil/2.2.0 -module load crtm/2.3.0 - -module use /apps/contrib/NCEPLIBS/lib/modulefiles -module load netcdfp/4.7.4 -#module load esmflocal/8.1.0.19bs - diff --git a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.wcoss_cray b/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.wcoss_cray deleted file mode 100644 index 4746d2c91..000000000 --- a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.wcoss_cray +++ /dev/null @@ -1,33 +0,0 @@ -#%Module##################################################### -## Module file for hafs_hycom_utils -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling hycom_utils" -} -module-whatis "hycom_utils prerequisites" - -module load craype-network-aries -module load craype-sandybridge -module load craype/2.3.0 -module load PrgEnv-intel/5.2.56 -module load intel/15.0.3.187 -module load cray-mpich/7.2.0 - -module load jasper-gnu-sandybridge/1.900.1 -module load png-intel-sandybridge/1.2.49 -module load zlib-intel-sandybridge/1.2.7 - -module load g2-intel/3.1.0 -module load w3emc-intel/2.2.0 -module load w3nco-intel/2.0.6 -module load sp-intel/2.0.2 -module load ip-intel/3.0.0 -module load bufr-intel/11.2.0 -module load bacio-intel/2.0.2 -module load sigio-intel/2.1.0 -module load sfcio-intel/1.0.0 -module load nemsio-intel/2.2.3 -module load nemsiogfs-intel/2.0.1 - -module load HDF5-serial-intel-sandybridge/1.8.9 -module load NetCDF-intel-sandybridge/4.2 diff --git a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.wcoss_dell_p3 b/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.wcoss_dell_p3 deleted file mode 100644 index 1b6aff1d0..000000000 --- a/sorc/hafs_hycom_utils.fd/modulefiles/modulefile.hycom_utils.wcoss_dell_p3 +++ /dev/null @@ -1,29 +0,0 @@ -#%Module##################################################### -## Module file for hafs_hycom_utils -############################################################# -proc ModulesHelp { } { - puts stderr "Set environment veriables for compiling hycom_utils" -} -module-whatis "hycom_utils prerequisites" - -module load ips/18.0.1.163 -module load impi/18.0.1 - -module load jasper/1.900.1 -module load libpng/1.2.59 -module load zlib/1.2.11 - -module load g2/3.1.0 -module load w3emc/2.3.0 -module load w3nco/2.0.6 -module load sp/2.0.2 -module load ip/3.0.1 -module load bufr/11.2.0 -module load bacio/2.0.2 -module load sigio/2.1.0 -module load sfcio/1.0.0 -module load nemsio/2.2.3 -module load nemsiogfs/2.0.1 - -module load NetCDF/4.5.0 -module load HDF5-serial/1.10.1 diff --git a/sorc/hafs_hycom_utils.fd/post/hafs_ab2data/CMakeLists.txt b/sorc/hafs_hycom_utils.fd/post/hafs_ab2data/CMakeLists.txt new file mode 100644 index 000000000..64d5d8e21 --- /dev/null +++ b/sorc/hafs_hycom_utils.fd/post/hafs_ab2data/CMakeLists.txt @@ -0,0 +1,101 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(fortran_srcs + zh.F + mod_xc.F + mod_za.F + mod_zb.F + mod_plot.F + bigrid.f + bigrd1.f + blkin.f + dum_gks.f + extrct.f + extrot.f + fordate.f + getdat4rtofs.f + getdat.f + getdepth.f + getdtm.f + horout_nc.f + indxi.f + indxj.f + layer2z.f + pakk.f + poisnd.f + psmoo.f + ab2grib.f + sbmerg.f + wtime.F + zebra.f + horout_nc.f + layer2z.f + ab2grib.f + gribit.f + grib_maps.f + pot2pot0.f) + +set(fortran_srcs1 ${fortran_srcs} archv2data2d.f) +set(fortran_srcs2 ${fortran_srcs} archv2data3z.f) +set(fortran_srcs3 ${fortran_srcs} archv3z2nc.f) + +set(ilib_dir ${CMAKE_SOURCE_DIR}/libs/build/src) +set(exe_name1 hafs_archv2data2d) +set(exe_name2 hafs_archv2data3z) +set(exe_name3 hafs_archv3z2nc) + +set(exe_dir ${CMAKE_SOURCE_DIR}/exec) + +if(CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel)$") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -convert big_endian -DLINUX -fp-model precise -assume byterecl") +endif() + +add_executable(${exe_name1} ${fortran_srcs1}) +add_executable(${exe_name2} ${fortran_srcs2}) +add_executable(${exe_name3} ${fortran_srcs3}) + +add_definitions(-DLITTLE_ENDIAN -DWRF -DLINUX -DMPI -DSERIAL_IO -DNAN2003 -DTIMER -DRELO) + +target_include_directories(${exe_name1} PUBLIC + ${ilib_dir}/ofs_mods + ${CMAKE_SOURCE_DIR}/post/hafs_ab2data) +target_include_directories(${exe_name2} PUBLIC + ${ilib_dir}/ofs_mods + ${CMAKE_SOURCE_DIR}/post/hafs_ab2data) +target_include_directories(${exe_name3} PUBLIC + ${ilib_dir}/ofs_mods + ${CMAKE_SOURCE_DIR}/post/hafs_ab2data) + +target_link_libraries( + ${exe_name1} + ${ilib_dir}/ofs_mods/libofs_mods.a + NetCDF::NetCDF_Fortran + NetCDF::NetCDF_C + w3nco::w3nco_4 + w3emc::w3emc_4 + bacio::bacio_4) +target_link_libraries( + ${exe_name2} + ${ilib_dir}/ofs_mods/libofs_mods.a + NetCDF::NetCDF_Fortran + NetCDF::NetCDF_C + w3nco::w3nco_4 + w3emc::w3emc_4 + bacio::bacio_4) +target_link_libraries( + ${exe_name3} + ${ilib_dir}/ofs_mods/libofs_mods.a + NetCDF::NetCDF_Fortran + NetCDF::NetCDF_C + w3nco::w3nco_4 + w3emc::w3emc_4 + bacio::bacio_4) + + +install(TARGETS ${exe_name1} DESTINATION ${exe_dir}) +install(TARGETS ${exe_name2} DESTINATION ${exe_dir}) +install(TARGETS ${exe_name3} DESTINATION ${exe_dir}) diff --git a/sorc/hafs_post.fd b/sorc/hafs_post.fd index 5a9a888ef..227e6e67c 160000 --- a/sorc/hafs_post.fd +++ b/sorc/hafs_post.fd @@ -1 +1 @@ -Subproject commit 5a9a888ef9dd101bb3fc2169d2465ceb872e55f3 +Subproject commit 227e6e67ca74ae5ab19637114ac80b65b184c7f8 diff --git a/sorc/hafs_tools.fd/CMakeLists.txt b/sorc/hafs_tools.fd/CMakeLists.txt new file mode 100644 index 000000000..281f3c9d0 --- /dev/null +++ b/sorc/hafs_tools.fd/CMakeLists.txt @@ -0,0 +1,28 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +cmake_minimum_required(VERSION 3.15) +project( + HAFS_TOOLS + LANGUAGES C Fortran) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/") +set (HAFS_TOOLS_BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_Fortran_COMPILER_ID}") +endif() + +if(NOT CMAKE_C_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_C_COMPILER_ID}") +endif() + +find_package(NetCDF REQUIRED C Fortran) +find_package(HDF5 REQUIRED) +find_package(ZLIB REQUIRED) +find_package(MPI REQUIRED) + +add_subdirectory(sorc/mpiserial) diff --git a/sorc/hafs_tools.fd/cmake/Modules/FindESMF.cmake b/sorc/hafs_tools.fd/cmake/Modules/FindESMF.cmake new file mode 100644 index 000000000..de6e88909 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/FindESMF.cmake @@ -0,0 +1,105 @@ +# - Try to find ESMF +# +# Requires setting ESMFMKFILE to the filepath of esmf.mk. If this is NOT set, +# then ESMF_FOUND will always be FALSE. If ESMFMKFILE exists, then ESMF_FOUND=TRUE +# and all ESMF makefile variables will be set in the global scope. Optionally, +# set ESMF_MKGLOBALS to a string list to filter makefile variables. For example, +# to globally scope only ESMF_LIBSDIR and ESMF_APPSDIR variables, use this CMake +# command in CMakeLists.txt: +# +# set(ESMF_MKGLOBALS "LIBSDIR" "APPSDIR") + + +# Add the ESMFMKFILE path to the cache if defined as system env variable +if (DEFINED ENV{ESMFMKFILE} AND NOT DEFINED ESMFMKFILE) + set(ESMFMKFILE $ENV{ESMFMKFILE} CACHE FILEPATH "Path to ESMF mk file") +endif () + +# Found the mk file and ESMF exists on the system +if (EXISTS ${ESMFMKFILE}) + set(ESMF_FOUND TRUE CACHE BOOL "ESMF mk file found" FORCE) + # Did not find the ESMF mk file +else() + set(ESMF_FOUND FALSE CACHE BOOL "ESMF mk file NOT found" FORCE) + # Best to warn users that without the mk file there is no way to find ESMF + if (NOT DEFINED ESMFMKFILE) + message(WARNING "ESMFMKFILE not defined. This is the path to esmf.mk file. \ +Without this filepath, ESMF_FOUND will always be FALSE.") + endif () +endif() + +# Only parse the mk file if it is found +if (ESMF_FOUND) + # Read the mk file + file(STRINGS "${ESMFMKFILE}" esmfmkfile_contents) + # Parse each line in the mk file + foreach(str ${esmfmkfile_contents}) + # Only consider uncommented lines + string(REGEX MATCH "^[^#]" def ${str}) + # Line is not commented + if (def) + # Extract the variable name + string(REGEX MATCH "^[^=]+" esmf_varname ${str}) + # Extract the variable's value + string(REGEX MATCH "=.+$" esmf_vardef ${str}) + # Only for variables with a defined value + if (esmf_vardef) + # Get rid of the assignment string + string(SUBSTRING ${esmf_vardef} 1 -1 esmf_vardef) + # Remove whitespace + string(STRIP ${esmf_vardef} esmf_vardef) + # A string or single-valued list + if(NOT DEFINED ESMF_MKGLOBALS) + # Set in global scope + set(${esmf_varname} ${esmf_vardef}) + # Don't display by default in GUI + mark_as_advanced(esmf_varname) + else() # Need to filter global promotion + foreach(m ${ESMF_MKGLOBALS}) + string(FIND ${esmf_varname} ${m} match) + # Found the string + if(NOT ${match} EQUAL -1) + # Promote to global scope + set(${esmf_varname} ${esmf_vardef}) + # Don't display by default in the GUI + mark_as_advanced (esmf_varname) + # No need to search for the current string filter + break() + endif() + endforeach() + endif() + endif() + endif() + endforeach() + + separate_arguments(ESMF_F90COMPILEPATHS NATIVE_COMMAND ${ESMF_F90COMPILEPATHS}) + foreach (ITEM ${ESMF_F90COMPILEPATHS}) + string(REGEX REPLACE "^-I" "" ITEM "${ITEM}") + list(APPEND tmp ${ITEM}) + endforeach() + set(ESMF_F90COMPILEPATHS ${tmp}) + + add_library(esmf UNKNOWN IMPORTED) + # Look for static library, if not found try dynamic library + find_library(esmf_lib NAMES libesmf.a PATHS ${ESMF_LIBSDIR}) + if(esmf_lib MATCHES "esmf_lib-NOTFOUND") + message(STATUS "Static ESMF library not found, searching for dynamic library instead") + find_library(esmf_lib NAMES esmf_fullylinked PATHS ${ESMF_LIBSDIR}) + if(esmf_lib MATCHES "esmf_lib-NOTFOUND") + message(WARNING "Neither the dynamic nor the static ESMF library was found") + else() + message(STATUS "Found ESMF library: ${esmf_lib}") + endif() + set(ESMF_INTERFACE_LINK_LIBRARIES "") + else() + # When linking the static library, also need the ESMF linker flags; strip any leading/trailing whitespaces + string(STRIP "${ESMF_F90ESMFLINKRPATHS} ${ESMF_F90ESMFLINKPATHS} ${ESMF_F90LINKLIBS} ${ESMF_F90LINKOPTS}" ESMF_INTERFACE_LINK_LIBRARIES) + message(STATUS "Found ESMF library: ${esmf_lib}") + endif() + + set_target_properties(esmf PROPERTIES + IMPORTED_LOCATION ${esmf_lib} + INTERFACE_INCLUDE_DIRECTORIES "${ESMF_F90COMPILEPATHS}" + INTERFACE_LINK_LIBRARIES "${ESMF_INTERFACE_LINK_LIBRARIES}") + +endif() diff --git a/sorc/hafs_tools.fd/cmake/Modules/FindNetCDF.cmake b/sorc/hafs_tools.fd/cmake/Modules/FindNetCDF.cmake new file mode 100644 index 000000000..1439ae848 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/FindNetCDF.cmake @@ -0,0 +1,337 @@ +# (C) Copyright 2011- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation nor +# does it submit to any jurisdiction. + +# Try to find NetCDF includes and library. +# Supports static and shared libaries and allows each component to be found in sepearte prefixes. +# +# This module defines +# +# - NetCDF_FOUND - System has NetCDF +# - NetCDF_INCLUDE_DIRS - the NetCDF include directories +# - NetCDF_VERSION - the version of NetCDF +# - NetCDF_CONFIG_EXECUTABLE - the netcdf-config executable if found +# - NetCDF_PARALLEL - Boolean True if NetCDF4 has parallel IO support via hdf5 and/or pnetcdf +# - NetCDF_HAS_PNETCDF - Boolean True if NetCDF4 has pnetcdf support +# +# Deprecated Defines +# - NetCDF_LIBRARIES - [Deprecated] Use NetCDF::NetCDF_ targets instead. +# +# +# Following components are available: +# +# - C - C interface to NetCDF (netcdf) +# - CXX - CXX4 interface to NetCDF (netcdf_c++4) +# - Fortran - Fortran interface to NetCDF (netcdff) +# +# For each component the following are defined: +# +# - NetCDF__FOUND - whether the component is found +# - NetCDF__LIBRARIES - the libraries for the component +# - NetCDF__LIBRARY_SHARED - Boolean is true if libraries for component are shared +# - NetCDF__INCLUDE_DIRS - the include directories for specified component +# - NetCDF::NetCDF_ - target of component to be used with target_link_libraries() +# +# The following paths will be searched in order if set in CMake (first priority) or environment (second priority) +# +# - NetCDF_ROOT - root of NetCDF installation +# - NetCDF_PATH - root of NetCDF installation +# +# The search process begins with locating NetCDF Include headers. If these are in a non-standard location, +# set one of the following CMake or environment variables to point to the location: +# +# - NetCDF_INCLUDE_DIR or NetCDF_${comp}_INCLUDE_DIR +# - NetCDF_INCLUDE_DIRS or NetCDF_${comp}_INCLUDE_DIR +# +# Notes: +# +# - Use "NetCDF::NetCDF_" targets only. NetCDF_LIBRARIES exists for backwards compatibility and should not be used. +# - These targets have all the knowledge of include directories and library search directories, and a single +# call to target_link_libraries will provide all these transitive properties to your target. Normally all that is +# needed to build and link against NetCDF is, e.g.: +# target_link_libraries(my_c_tgt PUBLIC NetCDF::NetCDF_C) +# - "NetCDF" is always the preferred naming for this package, its targets, variables, and environment variables +# - For compatibility, some variables are also set/checked using alternate names NetCDF4, NETCDF, or NETCDF4 +# - Environments relying on these older environment variable names should move to using a "NetCDF_ROOT" environment variable +# - Preferred component capitalization follows the CMake LANGUAGES variables: i.e., C, Fortran, CXX +# - For compatibility, alternate capitalizations are supported but should not be used. +# - If no components are defined, all components will be searched +# + +list( APPEND _possible_components C CXX Fortran ) + +## Include names for each component +set( NetCDF_C_INCLUDE_NAME netcdf.h ) +set( NetCDF_CXX_INCLUDE_NAME netcdf ) +set( NetCDF_Fortran_INCLUDE_NAME netcdf.mod ) + +## Library names for each component +set( NetCDF_C_LIBRARY_NAME netcdf ) +set( NetCDF_CXX_LIBRARY_NAME netcdf_c++4 ) +set( NetCDF_Fortran_LIBRARY_NAME netcdff ) + +## Enumerate search components +foreach( _comp ${_possible_components} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_${_COMP} ${_comp} ) + set( _name_${_COMP} ${_comp} ) +endforeach() + +set( _search_components C) +foreach( _comp ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_${_COMP} ${_comp} ) + list( APPEND _search_components ${_name_${_COMP}} ) + if( NOT _name_${_COMP} ) + message(SEND_ERROR "Find${CMAKE_FIND_PACKAGE_NAME}: COMPONENT ${_comp} is not a valid component. Valid components: ${_possible_components}" ) + endif() +endforeach() +list( REMOVE_DUPLICATES _search_components ) + +## Search hints for finding include directories and libraries +foreach( _comp IN ITEMS "_" "_C_" "_Fortran_" "_CXX_" ) + foreach( _name IN ITEMS NetCDF4 NetCDF NETCDF4 NETCDF ) + foreach( _var IN ITEMS ROOT PATH ) + list(APPEND _search_hints ${${_name}${_comp}${_var}} $ENV{${_name}${_comp}${_var}} ) + list(APPEND _include_search_hints + ${${_name}${_comp}INCLUDE_DIR} $ENV{${_name}${_comp}INCLUDE_DIR} + ${${_name}${_comp}INCLUDE_DIRS} $ENV{${_name}${_comp}INCLUDE_DIRS} ) + endforeach() + endforeach() +endforeach() +#Old-school HPC module env variable names +foreach( _name IN ITEMS NetCDF4 NetCDF NETCDF4 NETCDF ) + foreach( _comp IN ITEMS "_C" "_Fortran" "_CXX" ) + list(APPEND _search_hints ${${_name}} $ENV{${_name}}) + list(APPEND _search_hints ${${_name}${_comp}} $ENV{${_name}${_comp}}) + endforeach() +endforeach() + +## Find headers for each component +set(NetCDF_INCLUDE_DIRS) +set(_new_search_components) +foreach( _comp IN LISTS _search_components ) + if(NOT ${PROJECT_NAME}_NetCDF_${_comp}_FOUND) + list(APPEND _new_search_components ${_comp}) + endif() + find_file(NetCDF_${_comp}_INCLUDE_FILE + NAMES ${NetCDF_${_comp}_INCLUDE_NAME} + DOC "NetCDF ${_comp} include directory" + HINTS ${_include_search_hints} ${_search_hints} + PATH_SUFFIXES include include/netcdf + ) + mark_as_advanced(NetCDF_${_comp}_INCLUDE_FILE) + message(DEBUG "NetCDF_${_comp}_INCLUDE_FILE: ${NetCDF_${_comp}_INCLUDE_FILE}") + if( NetCDF_${_comp}_INCLUDE_FILE ) + get_filename_component(NetCDF_${_comp}_INCLUDE_FILE ${NetCDF_${_comp}_INCLUDE_FILE} ABSOLUTE) + get_filename_component(NetCDF_${_comp}_INCLUDE_DIR ${NetCDF_${_comp}_INCLUDE_FILE} DIRECTORY) + list(APPEND NetCDF_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIR}) + endif() +endforeach() +if(NetCDF_INCLUDE_DIRS) + list(REMOVE_DUPLICATES NetCDF_INCLUDE_DIRS) +endif() +set(NetCDF_INCLUDE_DIRS "${NetCDF_INCLUDE_DIRS}" CACHE STRING "NetCDF Include directory paths" FORCE) + +## Find n*-config executables for search components +foreach( _comp IN LISTS _search_components ) + if( _comp MATCHES "^(C)$" ) + set(_conf "c") + elseif( _comp MATCHES "^(Fortran)$" ) + set(_conf "f") + elseif( _comp MATCHES "^(CXX)$" ) + set(_conf "cxx4") + endif() + find_program( NetCDF_${_comp}_CONFIG_EXECUTABLE + NAMES n${_conf}-config + HINTS ${NetCDF_INCLUDE_DIRS} ${_include_search_hints} ${_search_hints} + PATH_SUFFIXES bin Bin ../bin ../../bin + DOC "NetCDF n${_conf}-config helper" ) + message(DEBUG "NetCDF_${_comp}_CONFIG_EXECUTABLE: ${NetCDF_${_comp}_CONFIG_EXECUTABLE}") +endforeach() + +set(_C_libs_flag --libs) +set(_Fortran_libs_flag --flibs) +set(_CXX_libs_flag --libs) +set(_C_includes_flag --includedir) +set(_Fortran_includes_flag --includedir) +set(_CXX_includes_flag --includedir) +function(netcdf_config exec flag output_var) + set(${output_var} False PARENT_SCOPE) + if( exec ) + execute_process( COMMAND ${exec} ${flag} RESULT_VARIABLE _ret OUTPUT_VARIABLE _val) + if( _ret EQUAL 0 ) + string( STRIP ${_val} _val ) + set( ${output_var} ${_val} PARENT_SCOPE ) + endif() + endif() +endfunction() + +## Find libraries for each component +set( NetCDF_LIBRARIES ) +foreach( _comp IN LISTS _search_components ) + string( TOUPPER "${_comp}" _COMP ) + + find_library( NetCDF_${_comp}_LIBRARY + NAMES ${NetCDF_${_comp}_LIBRARY_NAME} + DOC "NetCDF ${_comp} library" + HINTS ${NetCDF_${_comp}_INCLUDE_DIRS} ${_search_hints} + PATH_SUFFIXES lib64 lib ../lib64 ../lib ../../lib64 ../../lib ) + mark_as_advanced( NetCDF_${_comp}_LIBRARY ) + get_filename_component(NetCDF_${_comp}_LIBRARY ${NetCDF_${_comp}_LIBRARY} ABSOLUTE) + set(NetCDF_${_comp}_LIBRARY ${NetCDF_${_comp}_LIBRARY} CACHE STRING "NetCDF ${_comp} library" FORCE) + message(DEBUG "NetCDF_${_comp}_LIBRARY: ${NetCDF_${_comp}_LIBRARY}") + + if( NetCDF_${_comp}_LIBRARY ) + if( NetCDF_${_comp}_LIBRARY MATCHES ".a$" ) + set( NetCDF_${_comp}_LIBRARY_SHARED FALSE ) + set( _library_type STATIC) + else() + list( APPEND NetCDF_LIBRARIES ${NetCDF_${_comp}_LIBRARY} ) + set( NetCDF_${_comp}_LIBRARY_SHARED TRUE ) + set( _library_type SHARED) + endif() + endif() + + #Use nc-config to set per-component LIBRARIES variable if possible + netcdf_config( ${NetCDF_${_comp}_CONFIG_EXECUTABLE} ${_${_comp}_libs_flag} _val ) + if( _val ) + set( NetCDF_${_comp}_LIBRARIES ${_val} ) + if(NOT NetCDF_${_comp}_LIBRARY_SHARED AND NOT NetCDF_${_comp}_FOUND) #Static targets should use nc_config to get a proper link line with all necessary static targets. + list( APPEND NetCDF_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + endif() + else() + set( NetCDF_${_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARY} ) + if(NOT NetCDF_${_comp}_LIBRARY_SHARED) + message(SEND_ERROR "Unable to properly find NetCDF. Found static libraries at: ${NetCDF_${_comp}_LIBRARY} but could not run nc-config: ${NetCDF_CONFIG_EXECUTABLE}") + endif() + endif() + + #Use nc-config to set per-component INCLUDE_DIRS variable if possible + netcdf_config( ${NetCDF_${_comp}_CONFIG_EXECUTABLE} ${_${_comp}_includes_flag} _val ) + if( _val ) + string( REPLACE " " ";" _val ${_val} ) + set( NetCDF_${_comp}_INCLUDE_DIRS ${_val} ) + else() + set( NetCDF_${_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIR} ) + endif() + + if( NetCDF_${_comp}_LIBRARIES AND NetCDF_${_comp}_INCLUDE_DIRS ) + set( ${CMAKE_FIND_PACKAGE_NAME}_${_arg_${_COMP}}_FOUND TRUE ) + if (NOT TARGET NetCDF::NetCDF_${_comp}) + add_library(NetCDF::NetCDF_${_comp} ${_library_type} IMPORTED) + set_target_properties(NetCDF::NetCDF_${_comp} PROPERTIES + IMPORTED_LOCATION ${NetCDF_${_comp}_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_${_comp}_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + endif() + endif() +endforeach() +if(NetCDF_LIBRARIES AND NetCDF_${_comp}_LIBRARY_SHARED) + list(REMOVE_DUPLICATES NetCDF_LIBRARIES) +endif() +set(NetCDF_LIBRARIES "${NetCDF_LIBRARIES}" CACHE STRING "NetCDF library targets" FORCE) + +## Find version via netcdf-config if possible +if (NetCDF_INCLUDE_DIRS) + if( NetCDF_C_CONFIG_EXECUTABLE ) + netcdf_config( ${NetCDF_C_CONFIG_EXECUTABLE} --version _vers ) + if( _vers ) + string(REGEX REPLACE ".* ((([0-9]+)\\.)+([0-9]+)).*" "\\1" NetCDF_VERSION "${_vers}" ) + endif() + else() + foreach( _dir IN LISTS NetCDF_INCLUDE_DIRS) + if( EXISTS "${_dir}/netcdf_meta.h" ) + file(STRINGS "${_dir}/netcdf_meta.h" _netcdf_version_lines + REGEX "#define[ \t]+NC_VERSION_(MAJOR|MINOR|PATCH|NOTE)") + string(REGEX REPLACE ".*NC_VERSION_MAJOR *\([0-9]*\).*" "\\1" _netcdf_version_major "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_MINOR *\([0-9]*\).*" "\\1" _netcdf_version_minor "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_PATCH *\([0-9]*\).*" "\\1" _netcdf_version_patch "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_NOTE *\"\([^\"]*\)\".*" "\\1" _netcdf_version_note "${_netcdf_version_lines}") + set(NetCDF_VERSION "${_netcdf_version_major}.${_netcdf_version_minor}.${_netcdf_version_patch}${_netcdf_version_note}") + unset(_netcdf_version_major) + unset(_netcdf_version_minor) + unset(_netcdf_version_patch) + unset(_netcdf_version_note) + unset(_netcdf_version_lines) + endif() + endforeach() + endif() +endif () + +## Detect additional package properties +netcdf_config(${NetCDF_C_CONFIG_EXECUTABLE} --has-parallel4 _val) +if( NOT _val MATCHES "^(yes|no)$" ) + netcdf_config(${NetCDF_C_CONFIG_EXECUTABLE} --has-parallel _val) +endif() +if( _val MATCHES "^(yes)$" ) + set(NetCDF_PARALLEL TRUE CACHE STRING "NetCDF has parallel IO capability via pnetcdf or hdf5." FORCE) +else() + set(NetCDF_PARALLEL FALSE CACHE STRING "NetCDF has no parallel IO capability." FORCE) +endif() + +## Finalize find_package +include(FindPackageHandleStandardArgs) + +if(NOT NetCDF_FOUND OR _new_search_components) + find_package_handle_standard_args( ${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS NetCDF_INCLUDE_DIRS NetCDF_LIBRARIES + VERSION_VAR NetCDF_VERSION + HANDLE_COMPONENTS ) +endif() + +foreach( _comp IN LISTS _search_components ) + if( NetCDF_${_comp}_FOUND ) + #Record found components to avoid duplication in NetCDF_LIBRARIES for static libraries + set(NetCDF_${_comp}_FOUND ${NetCDF_${_comp}_FOUND} CACHE BOOL "NetCDF ${_comp} Found" FORCE) + #Set a per-package, per-component found variable to communicate between multiple calls to find_package() + set(${PROJECT_NAME}_NetCDF_${_comp}_FOUND True) + endif() +endforeach() + +if( ${CMAKE_FIND_PACKAGE_NAME}_FOUND AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY AND _new_search_components) + message( STATUS "Find${CMAKE_FIND_PACKAGE_NAME} defines targets:" ) + message( STATUS " - NetCDF_VERSION [${NetCDF_VERSION}]") + message( STATUS " - NetCDF_PARALLEL [${NetCDF_PARALLEL}]") + foreach( _comp IN LISTS _new_search_components ) + string( TOUPPER "${_comp}" _COMP ) + message( STATUS " - NetCDF_${_comp}_CONFIG_EXECUTABLE [${NetCDF_${_comp}_CONFIG_EXECUTABLE}]") + if( ${CMAKE_FIND_PACKAGE_NAME}_${_arg_${_COMP}}_FOUND ) + get_filename_component(_root ${NetCDF_${_comp}_INCLUDE_DIR}/.. ABSOLUTE) + if( NetCDF_${_comp}_LIBRARY_SHARED ) + message( STATUS " - NetCDF::NetCDF_${_comp} [SHARED] [Root: ${_root}] Lib: ${NetCDF_${_comp}_LIBRARY} ") + else() + message( STATUS " - NetCDF::NetCDF_${_comp} [STATIC] [Root: ${_root}] Lib: ${NetCDF_${_comp}_LIBRARY} ") + endif() + endif() + endforeach() +endif() + +foreach( _prefix NetCDF NetCDF4 NETCDF NETCDF4 ${CMAKE_FIND_PACKAGE_NAME} ) + set( ${_prefix}_INCLUDE_DIRS ${NetCDF_INCLUDE_DIRS} ) + set( ${_prefix}_LIBRARIES ${NetCDF_LIBRARIES}) + set( ${_prefix}_VERSION ${NetCDF_VERSION} ) + set( ${_prefix}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_FOUND} ) + set( ${_prefix}_CONFIG_EXECUTABLE ${NetCDF_CONFIG_EXECUTABLE} ) + set( ${_prefix}_PARALLEL ${NetCDF_PARALLEL} ) + + foreach( _comp ${_search_components} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_comp ${_arg_${_COMP}} ) + set( ${_prefix}_${_comp}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + set( ${_prefix}_${_COMP}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + set( ${_prefix}_${_arg_comp}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + + set( ${_prefix}_${_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + set( ${_prefix}_${_COMP}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + set( ${_prefix}_${_arg_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + + set( ${_prefix}_${_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + set( ${_prefix}_${_COMP}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + set( ${_prefix}_${_arg_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + endforeach() +endforeach() diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/CMakeParseArguments.cmake b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/CMakeParseArguments.cmake new file mode 100644 index 000000000..7ee2bbace --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/CMakeParseArguments.cmake @@ -0,0 +1,11 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# CMakeParseArguments +# ------------------- +# +# This module once implemented the :command:`cmake_parse_arguments` command +# that is now implemented natively by CMake. It is now an empty placeholder +# for compatibility with projects that include it to get the command from +# CMake 3.4 and lower. diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindHDF5.cmake b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindHDF5.cmake new file mode 100644 index 000000000..fd8891cf2 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindHDF5.cmake @@ -0,0 +1,934 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindHDF5 +# -------- +# +# Find HDF5, a library for reading and writing self describing array data. +# +# +# +# This module invokes the HDF5 wrapper compiler that should be installed +# alongside HDF5. Depending upon the HDF5 Configuration, the wrapper +# compiler is called either h5cc or h5pcc. If this succeeds, the module +# will then call the compiler with the -show argument to see what flags +# are used when compiling an HDF5 client application. +# +# The module will optionally accept the COMPONENTS argument. If no +# COMPONENTS are specified, then the find module will default to finding +# only the HDF5 C library. If one or more COMPONENTS are specified, the +# module will attempt to find the language bindings for the specified +# components. The only valid components are C, CXX, Fortran, HL, and +# Fortran_HL. If the COMPONENTS argument is not given, the module will +# attempt to find only the C bindings. +# +# This module will read the variable +# HDF5_USE_STATIC_LIBRARIES to determine whether or not to prefer a +# static link to a dynamic link for HDF5 and all of it's dependencies. +# To use this feature, make sure that the HDF5_USE_STATIC_LIBRARIES +# variable is set before the call to find_package. +# +# To provide the module with a hint about where to find your HDF5 +# installation, you can set the environment variable HDF5_ROOT. The +# Find module will then look in this path when searching for HDF5 +# executables, paths, and libraries. +# +# Both the serial and parallel HDF5 wrappers are considered and the first +# directory to contain either one will be used. In the event that both appear +# in the same directory the serial version is preferentially selected. This +# behavior can be reversed by setting the variable HDF5_PREFER_PARALLEL to +# true. +# +# In addition to finding the includes and libraries required to compile +# an HDF5 client application, this module also makes an effort to find +# tools that come with the HDF5 distribution that may be useful for +# regression testing. +# +# This module will define the following variables: +# +# :: +# +# HDF5_FOUND - true if HDF5 was found on the system +# HDF5_VERSION - HDF5 version in format Major.Minor.Release +# HDF5_INCLUDE_DIRS - Location of the hdf5 includes +# HDF5_INCLUDE_DIR - Location of the hdf5 includes (deprecated) +# HDF5_DEFINITIONS - Required compiler definitions for HDF5 +# HDF5_LIBRARIES - Required libraries for all requested bindings +# HDF5_HL_LIBRARIES - Required libraries for the HDF5 high level API for all +# bindings, if the HL component is enabled +# +# Available components are: C CXX Fortran and HL. For each enabled language +# binding, a corresponding HDF5_${LANG}_LIBRARIES variable, and potentially +# HDF5_${LANG}_DEFINITIONS, will be defined. +# If the HL component is enabled, then an HDF5_${LANG}_HL_LIBRARIES will +# also be defined. With all components enabled, the following variables will be defined: +# +# :: +# +# HDF5_C_DEFINITIONS -- Required compiler definitions for HDF5 C bindings +# HDF5_CXX_DEFINITIONS -- Required compiler definitions for HDF5 C++ bindings +# HDF5_Fortran_DEFINITIONS -- Required compiler definitions for HDF5 Fortran bindings +# HDF5_C_INCLUDE_DIRS -- Required include directories for HDF5 C bindings +# HDF5_CXX_INCLUDE_DIRS -- Required include directories for HDF5 C++ bindings +# HDF5_Fortran_INCLUDE_DIRS -- Required include directories for HDF5 Fortran bindings +# HDF5_C_LIBRARIES - Required libraries for the HDF5 C bindings +# HDF5_CXX_LIBRARIES - Required libraries for the HDF5 C++ bindings +# HDF5_Fortran_LIBRARIES - Required libraries for the HDF5 Fortran bindings +# HDF5_C_HL_LIBRARIES - Required libraries for the high level C bindings +# HDF5_CXX_HL_LIBRARIES - Required libraries for the high level C++ bindings +# HDF5_Fortran_HL_LIBRARIES - Required libraries for the high level Fortran +# bindings. +# +# HDF5_IS_PARALLEL - Whether or not HDF5 was found with parallel IO support +# HDF5_C_COMPILER_EXECUTABLE - the path to the HDF5 C wrapper compiler +# HDF5_CXX_COMPILER_EXECUTABLE - the path to the HDF5 C++ wrapper compiler +# HDF5_Fortran_COMPILER_EXECUTABLE - the path to the HDF5 Fortran wrapper compiler +# HDF5_C_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary C compiler +# which is also the HDF5 wrapper +# HDF5_CXX_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary C++ +# compiler which is also +# the HDF5 wrapper +# HDF5_Fortran_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary +# Fortran compiler which +# is also the HDF5 wrapper +# HDF5_DIFF_EXECUTABLE - the path to the HDF5 dataset comparison tool +# +# The following variable can be set to guide the search for HDF5 libraries and includes: +# +# ``HDF5_ROOT`` +# Specify the path to the HDF5 installation to use. +# +# ``HDF5_FIND_DEBUG`` +# Set to a true value to get some extra debugging output. +# +# ``HDF5_NO_FIND_PACKAGE_CONFIG_FILE`` +# Set to a true value to skip trying to find ``hdf5-config.cmake``. + +# This module is maintained by Will Dicharry . + +include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# List of the valid HDF5 components +set(HDF5_VALID_LANGUAGE_BINDINGS C CXX Fortran) + +# Validate the list of find components. +if(NOT HDF5_FIND_COMPONENTS) + set(HDF5_LANGUAGE_BINDINGS "C") +else() + set(HDF5_LANGUAGE_BINDINGS) + # add the extra specified components, ensuring that they are valid. + set(FIND_HL OFF) + foreach(component IN LISTS HDF5_FIND_COMPONENTS) + list(FIND HDF5_VALID_LANGUAGE_BINDINGS ${component} component_location) + if(NOT component_location EQUAL -1) + list(APPEND HDF5_LANGUAGE_BINDINGS ${component}) + elseif(component STREQUAL "HL") + set(FIND_HL ON) + elseif(component STREQUAL "Fortran_HL") # only for compatibility + list(APPEND HDF5_LANGUAGE_BINDINGS Fortran) + set(FIND_HL ON) + set(HDF5_FIND_REQUIRED_Fortran_HL False) + set(HDF5_FIND_REQUIRED_Fortran True) + set(HDF5_FIND_REQUIRED_HL True) + else() + message(FATAL_ERROR "${component} is not a valid HDF5 component.") + endif() + endforeach() + if(NOT HDF5_LANGUAGE_BINDINGS) + get_property(__langs GLOBAL PROPERTY ENABLED_LANGUAGES) + foreach(__lang IN LISTS __langs) + if(__lang MATCHES "^(C|CXX|Fortran)$") + list(APPEND HDF5_LANGUAGE_BINDINGS ${__lang}) + endif() + endforeach() + endif() + list(REMOVE_ITEM HDF5_FIND_COMPONENTS Fortran_HL) # replaced by Fortran and HL + list(REMOVE_DUPLICATES HDF5_LANGUAGE_BINDINGS) +endif() + +# Determine whether to search for serial or parallel executable first +if(HDF5_PREFER_PARALLEL) + set(HDF5_C_COMPILER_NAMES h5pcc h5cc) + set(HDF5_CXX_COMPILER_NAMES h5pc++ h5c++) + set(HDF5_Fortran_COMPILER_NAMES h5pfc h5fc) +else() + set(HDF5_C_COMPILER_NAMES h5cc h5pcc) + set(HDF5_CXX_COMPILER_NAMES h5c++ h5pc++) + set(HDF5_Fortran_COMPILER_NAMES h5fc h5pfc) +endif() + +# We may have picked up some duplicates in various lists during the above +# process for the language bindings (both the C and C++ bindings depend on +# libz for example). Remove the duplicates. It appears that the default +# CMake behavior is to remove duplicates from the end of a list. However, +# for link lines, this is incorrect since unresolved symbols are searched +# for down the link line. Therefore, we reverse the list, remove the +# duplicates, and then reverse it again to get the duplicates removed from +# the beginning. +macro(_HDF5_remove_duplicates_from_beginning _list_name) + if(${_list_name}) + list(REVERSE ${_list_name}) + list(REMOVE_DUPLICATES ${_list_name}) + list(REVERSE ${_list_name}) + endif() +endmacro() + + +# Test first if the current compilers automatically wrap HDF5 + +function(_HDF5_test_regular_compiler_C success version is_parallel) + set(scratch_directory + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if(NOT ${success} OR + NOT EXISTS ${scratch_directory}/compiler_has_h5_c) + set(test_file ${scratch_directory}/cmake_hdf5_test.c) + file(WRITE ${test_file} + "#include \n" + "#include \n" + "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" + "#ifdef H5_HAVE_PARALLEL\n" + "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" + "#endif\n" + "int main(int argc, char **argv) {\n" + " int require = 0;\n" + " require += info_ver[argc];\n" + "#ifdef H5_HAVE_PARALLEL\n" + " require += info_parallel[argc];\n" + "#endif\n" + " hid_t fid;\n" + " fid = H5Fcreate(\"foo.h5\",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);\n" + " return 0;\n" + "}") + try_compile(${success} ${scratch_directory} ${test_file} + COPY_FILE ${scratch_directory}/compiler_has_h5_c + ) + endif() + if(${success}) + file(STRINGS ${scratch_directory}/compiler_has_h5_c INFO_STRINGS + REGEX "^INFO:" + ) + string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?" + INFO_VER "${INFO_STRINGS}" + ) + set(${version} ${CMAKE_MATCH_1}) + if(CMAKE_MATCH_3) + set(${version} ${HDF5_C_VERSION}.${CMAKE_MATCH_3}) + endif() + set(${version} ${${version}} PARENT_SCOPE) + + if(INFO_STRINGS MATCHES "INFO:PARALLEL") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() +endfunction() + +function(_HDF5_test_regular_compiler_CXX success version is_parallel) + set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if(NOT ${success} OR + NOT EXISTS ${scratch_directory}/compiler_has_h5_cxx) + set(test_file ${scratch_directory}/cmake_hdf5_test.cxx) + file(WRITE ${test_file} + "#include \n" + "#ifndef H5_NO_NAMESPACE\n" + "using namespace H5;\n" + "#endif\n" + "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" + "#ifdef H5_HAVE_PARALLEL\n" + "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" + "#endif\n" + "int main(int argc, char **argv) {\n" + " int require = 0;\n" + " require += info_ver[argc];\n" + "#ifdef H5_HAVE_PARALLEL\n" + " require += info_parallel[argc];\n" + "#endif\n" + " H5File file(\"foo.h5\", H5F_ACC_TRUNC);\n" + " return 0;\n" + "}") + try_compile(${success} ${scratch_directory} ${test_file} + COPY_FILE ${scratch_directory}/compiler_has_h5_cxx + ) + endif() + if(${success}) + file(STRINGS ${scratch_directory}/compiler_has_h5_cxx INFO_STRINGS + REGEX "^INFO:" + ) + string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?" + INFO_VER "${INFO_STRINGS}" + ) + set(${version} ${CMAKE_MATCH_1}) + if(CMAKE_MATCH_3) + set(${version} ${HDF5_CXX_VERSION}.${CMAKE_MATCH_3}) + endif() + set(${version} ${${version}} PARENT_SCOPE) + + if(INFO_STRINGS MATCHES "INFO:PARALLEL") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() +endfunction() + +function(_HDF5_test_regular_compiler_Fortran success is_parallel) + if(NOT ${success}) + set(scratch_directory + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + set(test_file ${scratch_directory}/cmake_hdf5_test.f90) + file(WRITE ${test_file} + "program hdf5_hello\n" + " use hdf5\n" + " use h5lt\n" + " use h5ds\n" + " integer error\n" + " call h5open_f(error)\n" + " call h5close_f(error)\n" + "end\n") + try_compile(${success} ${scratch_directory} ${test_file}) + if(${success}) + execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -showconfig + OUTPUT_VARIABLE config_output + ERROR_VARIABLE config_error + RESULT_VARIABLE config_result + ) + if(config_output MATCHES "Parallel HDF5: yes") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + +# Invoke the HDF5 wrapper compiler. The compiler return value is stored to the +# return_value argument, the text output is stored to the output variable. +macro( _HDF5_invoke_compiler language output return_value version is_parallel) + set(${version}) + if(HDF5_USE_STATIC_LIBRARIES) + set(lib_type_args -noshlib) + else() + set(lib_type_args -shlib) + endif() + set(scratch_dir ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if("${language}" STREQUAL "C") + set(test_file ${scratch_dir}/cmake_hdf5_test.c) + elseif("${language}" STREQUAL "CXX") + set(test_file ${scratch_dir}/cmake_hdf5_test.cxx) + elseif("${language}" STREQUAL "Fortran") + set(test_file ${scratch_dir}/cmake_hdf5_test.f90) + endif() + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -show ${lib_type_args} ${test_file} + OUTPUT_VARIABLE ${output} + RETURN_VALUE ${return_value} + ) + if(NOT ${${return_value}} EQUAL 0) + message(STATUS + "Unable to determine HDF5 ${language} flags from HDF5 wrapper.") + endif() + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -showconfig + OUTPUT_VARIABLE config_output + RETURN_VALUE config_return + ) + if(NOT ${return_value} EQUAL 0) + message( STATUS + "Unable to determine HDF5 ${language} version from HDF5 wrapper.") + endif() + string(REGEX MATCH "HDF5 Version: ([a-zA-Z0-9\\.\\-]*)" version_match "${config_output}") + if(version_match) + string(REPLACE "HDF5 Version: " "" ${version} "${version_match}") + string(REPLACE "-patch" "." ${version} "${${version}}") + endif() + if(config_output MATCHES "Parallel HDF5: yes") + set(${is_parallel} TRUE) + else() + set(${is_parallel} FALSE) + endif() +endmacro() + +# Parse a compile line for definitions, includes, library paths, and libraries. +macro( _HDF5_parse_compile_line + compile_line_var + include_paths + definitions + library_paths + libraries + libraries_hl) + + separate_arguments(_HDF5_COMPILE_ARGS UNIX_COMMAND "${${compile_line_var}}") + + foreach(arg IN LISTS _HDF5_COMPILE_ARGS) + if("${arg}" MATCHES "^-I(.*)$") + # include directory + list(APPEND ${include_paths} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-D(.*)$") + # compile definition + list(APPEND ${definitions} "-D${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-L(.*)$") + # library search path + list(APPEND ${library_paths} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-l(hdf5.*hl.*)$") + # library name (hl) + list(APPEND ${libraries_hl} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-l(.*)$") + # library name + list(APPEND ${libraries} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^(.:)?[/\\].*\\.(a|so|dylib|sl|lib)$") + # library file + if(NOT EXISTS "${arg}") + continue() + endif() + get_filename_component(_HDF5_LPATH "${arg}" DIRECTORY) + get_filename_component(_HDF5_LNAME "${arg}" NAME_WE) + string(REGEX REPLACE "^lib" "" _HDF5_LNAME "${_HDF5_LNAME}") + list(APPEND ${library_paths} "${_HDF5_LPATH}") + if(_HDF5_LNAME MATCHES "hdf5.*hl") + list(APPEND ${libraries_hl} "${_HDF5_LNAME}") + else() + list(APPEND ${libraries} "${_HDF5_LNAME}") + endif() + endif() + endforeach() +endmacro() + +# Select a preferred imported configuration from a target +function(_HDF5_select_imported_config target imported_conf) + # We will first assign the value to a local variable _imported_conf, then assign + # it to the function argument at the end. + get_target_property(_imported_conf ${target} MAP_IMPORTED_CONFIG_${CMAKE_BUILD_TYPE}) + if (NOT _imported_conf) + # Get available imported configurations by examining target properties + get_target_property(_imported_conf ${target} IMPORTED_CONFIGURATIONS) + if(HDF5_FIND_DEBUG) + message(STATUS "Found imported configurations: ${_imported_conf}") + endif() + # Find the imported configuration that we prefer. + # We do this by making list of configurations in order of preference, + # starting with ${CMAKE_BUILD_TYPE} and ending with the first imported_conf + set(_preferred_confs ${CMAKE_BUILD_TYPE}) + list(GET _imported_conf 0 _fallback_conf) + list(APPEND _preferred_confs RELWITHDEBINFO RELEASE DEBUG ${_fallback_conf}) + if(HDF5_FIND_DEBUG) + message(STATUS "Start search through imported configurations in the following order: ${_preferred_confs}") + endif() + # Now find the first of these that is present in imported_conf + cmake_policy(PUSH) + cmake_policy(SET CMP0057 NEW) # support IN_LISTS + foreach (_conf IN LISTS _preferred_confs) + if (${_conf} IN_LIST _imported_conf) + set(_imported_conf ${_conf}) + break() + endif() + endforeach() + cmake_policy(POP) + endif() + if(HDF5_FIND_DEBUG) + message(STATUS "Selected imported configuration: ${_imported_conf}") + endif() + # assign value to function argument + set(${imported_conf} ${_imported_conf} PARENT_SCOPE) +endfunction() + + +if(NOT HDF5_ROOT) + set(HDF5_ROOT $ENV{HDF5_ROOT}) +endif() +if(HDF5_ROOT) + set(_HDF5_SEARCH_OPTS NO_DEFAULT_PATH) +else() + set(_HDF5_SEARCH_OPTS) +endif() + +# Try to find HDF5 using an installed hdf5-config.cmake +if(NOT HDF5_FOUND AND NOT HDF5_NO_FIND_PACKAGE_CONFIG_FILE) + find_package(HDF5 QUIET NO_MODULE + HINTS ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS} + ) + if( HDF5_FOUND) + if(HDF5_FIND_DEBUG) + message(STATUS "Found HDF5 at ${HDF5_DIR} via NO_MODULE. Now trying to extract locations etc.") + endif() + set(HDF5_IS_PARALLEL ${HDF5_ENABLE_PARALLEL}) + set(HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) + set(HDF5_LIBRARIES) + if (NOT TARGET hdf5 AND NOT TARGET hdf5-static AND NOT TARGET hdf5-shared) + # Some HDF5 versions (e.g. 1.8.18) used hdf5::hdf5 etc + set(_target_prefix "hdf5::") + endif() + set(HDF5_C_TARGET ${_target_prefix}hdf5) + set(HDF5_C_HL_TARGET ${_target_prefix}hdf5_hl) + set(HDF5_CXX_TARGET ${_target_prefix}hdf5_cpp) + set(HDF5_CXX_HL_TARGET ${_target_prefix}hdf5_hl_cpp) + set(HDF5_Fortran_TARGET ${_target_prefix}hdf5_fortran) + set(HDF5_Fortran_HL_TARGET ${_target_prefix}hdf5_hl_fortran) + set(HDF5_DEFINITIONS "") + if(HDF5_USE_STATIC_LIBRARIES) + set(_suffix "-static") + else() + set(_suffix "-shared") + endif() + foreach(_lang ${HDF5_LANGUAGE_BINDINGS}) + + #Older versions of hdf5 don't have a static/shared suffix so + #if we detect that occurrence clear the suffix + if(_suffix AND NOT TARGET ${HDF5_${_lang}_TARGET}${_suffix}) + if(NOT TARGET ${HDF5_${_lang}_TARGET}) + #cant find this component with or without the suffix + #so bail out, and let the following locate HDF5 + set(HDF5_FOUND FALSE) + break() + endif() + set(_suffix "") + endif() + + if(HDF5_FIND_DEBUG) + message(STATUS "Trying to get properties of target ${HDF5_${_lang}_TARGET}${_suffix}") + endif() + # Find library for this target. Complicated as on Windows with a DLL, we need to search for the import-lib. + _HDF5_select_imported_config(${HDF5_${_lang}_TARGET}${_suffix} _hdf5_imported_conf) + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} ) + if (NOT _hdf5_lang_location) + # no import lib, just try LOCATION + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf}) + if (NOT _hdf5_lang_location) + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} LOCATION) + endif() + endif() + if( _hdf5_lang_location ) + set(HDF5_${_lang}_LIBRARY ${_hdf5_lang_location}) + list(APPEND HDF5_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix}) + set(HDF5_${_lang}_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix}) + set(HDF5_${_lang}_FOUND True) + endif() + if(FIND_HL) + get_target_property(__lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} ) + if (NOT _hdf5_lang_hl_location) + get_target_property(_hdf5_lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf}) + if (NOT _hdf5_hl_lang_location) + get_target_property(_hdf5_hl_lang_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION) + endif() + endif() + if( _hdf5_lang_hl_location ) + set(HDF5_${_lang}_HL_LIBRARY ${_hdf5_lang_hl_location}) + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix}) + set(HDF5_${_lang}_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix}) + set(HDF5_HL_FOUND True) + endif() + unset(_hdf5_lang_hl_location) + endif() + unset(_hdf5_imported_conf) + unset(_hdf5_lang_location) + endforeach() + endif() +endif() + +if(NOT HDF5_FOUND) + set(_HDF5_NEED_TO_SEARCH False) + set(HDF5_COMPILER_NO_INTERROGATE True) + # Only search for languages we've enabled + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + # First check to see if our regular compiler is one of wrappers + if(__lang STREQUAL "C") + _HDF5_test_regular_compiler_C( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_VERSION + HDF5_${__lang}_IS_PARALLEL) + elseif(__lang STREQUAL "CXX") + _HDF5_test_regular_compiler_CXX( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_VERSION + HDF5_${__lang}_IS_PARALLEL) + elseif(__lang STREQUAL "Fortran") + _HDF5_test_regular_compiler_Fortran( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_IS_PARALLEL) + else() + continue() + endif() + if(HDF5_${__lang}_COMPILER_NO_INTERROGATE) + message(STATUS "HDF5: Using hdf5 compiler wrapper for all ${__lang} compiling") + set(HDF5_${__lang}_FOUND True) + set(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE + "${CMAKE_${__lang}_COMPILER}" + CACHE FILEPATH "HDF5 ${__lang} compiler wrapper") + set(HDF5_${__lang}_DEFINITIONS) + set(HDF5_${__lang}_INCLUDE_DIRS) + set(HDF5_${__lang}_LIBRARIES) + set(HDF5_${__lang}_HL_LIBRARIES) + + mark_as_advanced(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE) + + set(HDF5_${__lang}_FOUND True) + set(HDF5_HL_FOUND True) + else() + set(HDF5_COMPILER_NO_INTERROGATE False) + # If this language isn't using the wrapper, then try to seed the + # search options with the wrapper + find_program(HDF5_${__lang}_COMPILER_EXECUTABLE + NAMES ${HDF5_${__lang}_COMPILER_NAMES} NAMES_PER_DIR + HINTS ${HDF5_ROOT} + PATH_SUFFIXES bin Bin + DOC "HDF5 ${__lang} Wrapper compiler. Used only to detect HDF5 compile flags." + ${_HDF5_SEARCH_OPTS} + ) + mark_as_advanced( HDF5_${__lang}_COMPILER_EXECUTABLE ) + unset(HDF5_${__lang}_COMPILER_NAMES) + + if(HDF5_${__lang}_COMPILER_EXECUTABLE) + _HDF5_invoke_compiler(${__lang} HDF5_${__lang}_COMPILE_LINE + HDF5_${__lang}_RETURN_VALUE HDF5_${__lang}_VERSION HDF5_${__lang}_IS_PARALLEL) + if(HDF5_${__lang}_RETURN_VALUE EQUAL 0) + message(STATUS "HDF5: Using hdf5 compiler wrapper to determine ${__lang} configuration") + _HDF5_parse_compile_line( HDF5_${__lang}_COMPILE_LINE + HDF5_${__lang}_INCLUDE_DIRS + HDF5_${__lang}_DEFINITIONS + HDF5_${__lang}_LIBRARY_DIRS + HDF5_${__lang}_LIBRARY_NAMES + HDF5_${__lang}_HL_LIBRARY_NAMES + ) + set(HDF5_${__lang}_LIBRARIES) + + foreach(L IN LISTS HDF5_${__lang}_LIBRARY_NAMES) + set(_HDF5_SEARCH_NAMES_LOCAL) + if("x${L}" MATCHES "hdf5") + # hdf5 library + set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS}) + if(HDF5_USE_STATIC_LIBRARIES) + if(WIN32) + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}) + else() + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a) + endif() + endif() + else() + # external library + set(_HDF5_SEARCH_OPTS_LOCAL) + endif() + find_library(HDF5_${__lang}_LIBRARY_${L} + NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR + HINTS ${HDF5_${__lang}_LIBRARY_DIRS} + ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS_LOCAL} + ) + unset(_HDF5_SEARCH_OPTS_LOCAL) + unset(_HDF5_SEARCH_NAMES_LOCAL) + if(HDF5_${__lang}_LIBRARY_${L}) + list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}}) + else() + list(APPEND HDF5_${__lang}_LIBRARIES ${L}) + endif() + endforeach() + if(FIND_HL) + set(HDF5_${__lang}_HL_LIBRARIES) + foreach(L IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES) + set(_HDF5_SEARCH_NAMES_LOCAL) + if("x${L}" MATCHES "hdf5") + # hdf5 library + set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS}) + if(HDF5_USE_STATIC_LIBRARIES) + if(WIN32) + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}) + else() + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a) + endif() + endif() + else() + # external library + set(_HDF5_SEARCH_OPTS_LOCAL) + endif() + find_library(HDF5_${__lang}_LIBRARY_${L} + NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR + HINTS ${HDF5_${__lang}_LIBRARY_DIRS} + ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS_LOCAL} + ) + unset(_HDF5_SEARCH_OPTS_LOCAL) + unset(_HDF5_SEARCH_NAMES_LOCAL) + if(HDF5_${__lang}_LIBRARY_${L}) + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}}) + else() + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${L}) + endif() + endforeach() + set(HDF5_HL_FOUND True) + endif() + + set(HDF5_${__lang}_FOUND True) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_HL_LIBRARIES) + else() + set(_HDF5_NEED_TO_SEARCH True) + endif() + else() + set(_HDF5_NEED_TO_SEARCH True) + endif() + endif() + if(HDF5_${__lang}_VERSION) + if(NOT HDF5_VERSION) + set(HDF5_VERSION ${HDF5_${__lang}_VERSION}) + elseif(NOT HDF5_VERSION VERSION_EQUAL HDF5_${__lang}_VERSION) + message(WARNING "HDF5 Version found for language ${__lang}, ${HDF5_${__lang}_VERSION} is different than previously found version ${HDF5_VERSION}") + endif() + endif() + if(DEFINED HDF5_${__lang}_IS_PARALLEL) + if(NOT DEFINED HDF5_IS_PARALLEL) + set(HDF5_IS_PARALLEL ${HDF5_${__lang}_IS_PARALLEL}) + elseif(NOT HDF5_IS_PARALLEL AND HDF5_${__lang}_IS_PARALLEL) + message(WARNING "HDF5 found for language ${__lang} is parallel but previously found language is not parallel.") + elseif(HDF5_IS_PARALLEL AND NOT HDF5_${__lang}_IS_PARALLEL) + message(WARNING "HDF5 found for language ${__lang} is not parallel but previously found language is parallel.") + endif() + endif() + endforeach() +else() + set(_HDF5_NEED_TO_SEARCH True) +endif() + +if(NOT HDF5_FOUND AND HDF5_COMPILER_NO_INTERROGATE) + # No arguments necessary, all languages can use the compiler wrappers + set(HDF5_FOUND True) + set(HDF5_METHOD "Included by compiler wrappers") + set(HDF5_REQUIRED_VARS HDF5_METHOD) +elseif(NOT HDF5_FOUND AND NOT _HDF5_NEED_TO_SEARCH) + # Compiler wrappers aren't being used by the build but were found and used + # to determine necessary include and library flags + set(HDF5_INCLUDE_DIRS) + set(HDF5_LIBRARIES) + set(HDF5_HL_LIBRARIES) + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + if(HDF5_${__lang}_FOUND) + if(NOT HDF5_${__lang}_COMPILER_NO_INTERROGATE) + list(APPEND HDF5_DEFINITIONS ${HDF5_${__lang}_DEFINITIONS}) + list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIRS}) + list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES}) + if(FIND_HL) + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES}) + endif() + endif() + endif() + endforeach() + _HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES) + set(HDF5_FOUND True) + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES) + if(FIND_HL) + list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES) + endif() +endif() + +find_program( HDF5_DIFF_EXECUTABLE + NAMES h5diff + HINTS ${HDF5_ROOT} + PATH_SUFFIXES bin Bin + ${_HDF5_SEARCH_OPTS} + DOC "HDF5 file differencing tool." ) +mark_as_advanced( HDF5_DIFF_EXECUTABLE ) + +if( NOT HDF5_FOUND ) + # seed the initial lists of libraries to find with items we know we need + set(HDF5_C_LIBRARY_NAMES hdf5) + set(HDF5_C_HL_LIBRARY_NAMES hdf5_hl) + + set(HDF5_CXX_LIBRARY_NAMES hdf5_cpp ${HDF5_C_LIBRARY_NAMES}) + set(HDF5_CXX_HL_LIBRARY_NAMES hdf5_hl_cpp ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_CXX_LIBRARY_NAMES}) + + set(HDF5_Fortran_LIBRARY_NAMES hdf5_fortran ${HDF5_C_LIBRARY_NAMES}) + set(HDF5_Fortran_HL_LIBRARY_NAMES hdf5hl_fortran ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_Fortran_LIBRARY_NAMES}) + + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + # find the HDF5 include directories + if("${__lang}" STREQUAL "Fortran") + set(HDF5_INCLUDE_FILENAME hdf5.mod) + elseif("${__lang}" STREQUAL "CXX") + set(HDF5_INCLUDE_FILENAME H5Cpp.h) + else() + set(HDF5_INCLUDE_FILENAME hdf5.h) + endif() + + find_path(HDF5_${__lang}_INCLUDE_DIR ${HDF5_INCLUDE_FILENAME} + HINTS ${HDF5_ROOT} + PATHS $ENV{HOME}/.local/include + PATH_SUFFIXES include Include + ${_HDF5_SEARCH_OPTS} + ) + mark_as_advanced(HDF5_${__lang}_INCLUDE_DIR) + # set the _DIRS variable as this is what the user will normally use + set(HDF5_${__lang}_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR}) + list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR}) + + # find the HDF5 libraries + foreach(LIB IN LISTS HDF5_${__lang}_LIBRARY_NAMES) + if(HDF5_USE_STATIC_LIBRARIES) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See https://gitlab.kitware.com/cmake/cmake/issues/1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG + lib${LIB}d.a lib${LIB}_debug.a lib${LIB}d lib${LIB}_D lib${LIB}_debug + lib${LIB}d-static.a lib${LIB}_debug-static.a ${LIB}d-static ${LIB}_D-static ${LIB}_debug-static ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a lib${LIB} lib${LIB}-static.a ${LIB}-static) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ${LIB}_D ${LIB}_debug ${LIB}d-shared ${LIB}_D-shared ${LIB}_debug-shared) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ${LIB}-shared) + if(WIN32) + list(APPEND HDF5_DEFINITIONS "-DH5_BUILT_AS_DYNAMIC_LIB") + endif() + endif() + find_library(HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + if(HDF5_${__lang}_LIBRARIES) + set(HDF5_${__lang}_FOUND True) + endif() + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES}) + + if(FIND_HL) + foreach(LIB IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES) + if(HDF5_USE_STATIC_LIBRARIES) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See https://gitlab.kitware.com/cmake/cmake/issues/1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG + lib${LIB}d.a lib${LIB}_debug.a lib${LIB}d lib${LIB}_D lib${LIB}_debug + lib${LIB}d-static.a lib${LIB}_debug-static.a lib${LIB}d-static lib${LIB}_D-static lib${LIB}_debug-static ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a ${LIB} lib${LIB}-static.a lib${LIB}-static) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ${LIB}_D ${LIB}_debug ${LIB}d-shared ${LIB}_D-shared ${LIB}_debug-shared) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ${LIB}-shared) + endif() + find_library(HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES}) + endif() + endforeach() + if(FIND_HL AND HDF5_HL_LIBRARIES) + set(HDF5_HL_FOUND True) + endif() + + _HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES) + + # If the HDF5 include directory was found, open H5pubconf.h to determine if + # HDF5 was compiled with parallel IO support + set( HDF5_IS_PARALLEL FALSE ) + set( HDF5_VERSION "" ) + foreach( _dir IN LISTS HDF5_INCLUDE_DIRS ) + foreach(_hdr "${_dir}/H5pubconf.h" "${_dir}/H5pubconf-64.h" "${_dir}/H5pubconf-32.h") + if( EXISTS "${_hdr}" ) + file( STRINGS "${_hdr}" + HDF5_HAVE_PARALLEL_DEFINE + REGEX "HAVE_PARALLEL 1" ) + if( HDF5_HAVE_PARALLEL_DEFINE ) + set( HDF5_IS_PARALLEL TRUE ) + endif() + unset(HDF5_HAVE_PARALLEL_DEFINE) + + file( STRINGS "${_hdr}" + HDF5_VERSION_DEFINE + REGEX "^[ \t]*#[ \t]*define[ \t]+H5_VERSION[ \t]+" ) + if( "${HDF5_VERSION_DEFINE}" MATCHES + "H5_VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?\"" ) + set( HDF5_VERSION "${CMAKE_MATCH_1}" ) + if( CMAKE_MATCH_3 ) + set( HDF5_VERSION ${HDF5_VERSION}.${CMAKE_MATCH_3}) + endif() + endif() + unset(HDF5_VERSION_DEFINE) + endif() + endforeach() + endforeach() + set( HDF5_IS_PARALLEL ${HDF5_IS_PARALLEL} CACHE BOOL + "HDF5 library compiled with parallel IO support" ) + mark_as_advanced( HDF5_IS_PARALLEL ) + + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS) + if(FIND_HL) + list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES) + endif() +endif() + +# For backwards compatibility we set HDF5_INCLUDE_DIR to the value of +# HDF5_INCLUDE_DIRS +if( HDF5_INCLUDE_DIRS ) + set( HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIRS}" ) +endif() + +# If HDF5_REQUIRED_VARS is empty at this point, then it's likely that +# something external is trying to explicitly pass already found +# locations +if(NOT HDF5_REQUIRED_VARS) + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS) +endif() + +find_package_handle_standard_args(HDF5 + REQUIRED_VARS ${HDF5_REQUIRED_VARS} + VERSION_VAR HDF5_VERSION + HANDLE_COMPONENTS +) + +unset(_HDF5_SEARCH_OPTS) + +if( HDF5_FOUND AND NOT HDF5_DIR) + # hide HDF5_DIR for the non-advanced user to avoid confusion with + # HDF5_DIR-NOT_FOUND while HDF5 was found. + mark_as_advanced(HDF5_DIR) +endif() + +if (HDF5_FIND_DEBUG) + message(STATUS "HDF5_DIR: ${HDF5_DIR}") + message(STATUS "HDF5_DEFINITIONS: ${HDF5_DEFINITIONS}") + message(STATUS "HDF5_INCLUDE_DIRS: ${HDF5_INCLUDE_DIRS}") + message(STATUS "HDF5_LIBRARIES: ${HDF5_LIBRARIES}") + message(STATUS "HDF5_HL_LIBRARIES: ${HDF5_HL_LIBRARIES}") + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + message(STATUS "HDF5_${__lang}_DEFINITIONS: ${HDF5_${__lang}_DEFINITIONS}") + message(STATUS "HDF5_${__lang}_INCLUDE_DIR: ${HDF5_${__lang}_INCLUDE_DIR}") + message(STATUS "HDF5_${__lang}_INCLUDE_DIRS: ${HDF5_${__lang}_INCLUDE_DIRS}") + message(STATUS "HDF5_${__lang}_LIBRARY: ${HDF5_${__lang}_LIBRARY}") + message(STATUS "HDF5_${__lang}_LIBRARIES: ${HDF5_${__lang}_LIBRARIES}") + message(STATUS "HDF5_${__lang}_HL_LIBRARY: ${HDF5_${__lang}_HL_LIBRARY}") + message(STATUS "HDF5_${__lang}_HL_LIBRARIES: ${HDF5_${__lang}_HL_LIBRARIES}") + endforeach() +endif() diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI.cmake b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI.cmake new file mode 100644 index 000000000..5cd2a2afe --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI.cmake @@ -0,0 +1,1514 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindMPI +# ------- +# +# Find a Message Passing Interface (MPI) implementation. +# +# The Message Passing Interface (MPI) is a library used to write +# high-performance distributed-memory parallel applications, and is +# typically deployed on a cluster. MPI is a standard interface (defined +# by the MPI forum) for which many implementations are available. +# +# Variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module exposes the components ``C``, ``CXX``, ``MPICXX`` and ``Fortran``. +# Each of these controls the various MPI languages to search for. +# The difference between ``CXX`` and ``MPICXX`` is that ``CXX`` refers to the +# MPI C API being usable from C++, whereas ``MPICXX`` refers to the MPI-2 C++ API +# that was removed again in MPI-3. +# +# Depending on the enabled components the following variables will be set: +# +# ``MPI_FOUND`` +# Variable indicating that MPI settings for all requested languages have been found. +# If no components are specified, this is true if MPI settings for all enabled languages +# were detected. Note that the ``MPICXX`` component does not affect this variable. +# ``MPI_VERSION`` +# Minimal version of MPI detected among the requested languages, or all enabled languages +# if no components were specified. +# +# This module will set the following variables per language in your +# project, where ```` is one of C, CXX, or Fortran: +# +# ``MPI__FOUND`` +# Variable indicating the MPI settings for ```` were found and that +# simple MPI test programs compile with the provided settings. +# ``MPI__COMPILER`` +# MPI compiler for ```` if such a program exists. +# ``MPI__COMPILE_OPTIONS`` +# Compilation options for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__COMPILE_DEFINITIONS`` +# Compilation definitions for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__INCLUDE_DIRS`` +# Include path(s) for MPI header. +# ``MPI__LINK_FLAGS`` +# Linker flags for MPI programs. +# ``MPI__LIBRARIES`` +# All libraries to link MPI programs against. +# +# Additionally, the following :prop_tgt:`IMPORTED` targets are defined: +# +# ``MPI::MPI_`` +# Target for using MPI from ````. +# +# The following variables indicating which bindings are present will be defined: +# +# ``MPI_MPICXX_FOUND`` +# Variable indicating whether the MPI-2 C++ bindings are present (introduced in MPI-2, removed with MPI-3). +# ``MPI_Fortran_HAVE_F77_HEADER`` +# True if the Fortran 77 header ``mpif.h`` is available. +# ``MPI_Fortran_HAVE_F90_MODULE`` +# True if the Fortran 90 module ``mpi`` can be used for accessing MPI (MPI-2 and higher only). +# ``MPI_Fortran_HAVE_F08_MODULE`` +# True if the Fortran 2008 ``mpi_f08`` is available to MPI programs (MPI-3 and higher only). +# +# If possible, the MPI version will be determined by this module. The facilities to detect the MPI version +# were introduced with MPI-1.2, and therefore cannot be found for older MPI versions. +# +# ``MPI__VERSION_MAJOR`` +# Major version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION_MINOR`` +# Minor version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION`` +# MPI version implemented for ```` by the MPI distribution. +# +# Note that there's no variable for the C bindings being accessible through ``mpi.h``, since the MPI standards +# always have required this binding to work in both C and C++ code. +# +# For running MPI programs, the module sets the following variables +# +# ``MPIEXEC_EXECUTABLE`` +# Executable for running MPI programs, if such exists. +# ``MPIEXEC_NUMPROC_FLAG`` +# Flag to pass to ``mpiexec`` before giving it the number of processors to run on. +# ``MPIEXEC_MAX_NUMPROCS`` +# Number of MPI processors to utilize. Defaults to the number +# of processors detected on the host system. +# ``MPIEXEC_PREFLAGS`` +# Flags to pass to ``mpiexec`` directly before the executable to run. +# ``MPIEXEC_POSTFLAGS`` +# Flags to pass to ``mpiexec`` after other flags. +# +# Variables for locating MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# This module performs a three step search for an MPI implementation: +# +# 1. Check if the compiler has MPI support built-in. This is the case if the user passed a +# compiler wrapper as ``CMAKE__COMPILER`` or if they're on a Cray system. +# 2. Attempt to find an MPI compiler wrapper and determine the compiler information from it. +# 3. Try to find an MPI implementation that does not ship such a wrapper by guessing settings. +# Currently, only Microsoft MPI and MPICH2 on Windows are supported. +# +# For controlling the second step, the following variables may be set: +# +# ``MPI__COMPILER`` +# Search for the specified compiler wrapper and use it. +# ``MPI__COMPILER_FLAGS`` +# Flags to pass to the MPI compiler wrapper during interrogation. Some compiler wrappers +# support linking debug or tracing libraries if a specific flag is passed and this variable +# may be used to obtain them. +# ``MPI_COMPILER_FLAGS`` +# Used to initialize ``MPI__COMPILER_FLAGS`` if no language specific flag has been given. +# Empty by default. +# ``MPI_EXECUTABLE_SUFFIX`` +# A suffix which is appended to all names that are being looked for. For instance you may set this +# to ``.mpich`` or ``.openmpi`` to prefer the one or the other on Debian and its derivatives. +# +# In order to control the guessing step, the following variable may be set: +# +# ``MPI_GUESS_LIBRARY_NAME`` +# Valid values are ``MSMPI`` and ``MPICH2``. If set, only the given library will be searched for. +# By default, ``MSMPI`` will be preferred over ``MPICH2`` if both are available. +# This also sets ``MPI_SKIP_COMPILER_WRAPPER`` to ``true``, which may be overridden. +# +# Each of the search steps may be skipped with the following control variables: +# +# ``MPI_ASSUME_NO_BUILTIN_MPI`` +# If true, the module assumes that the compiler itself does not provide an MPI implementation and +# skips to step 2. +# ``MPI_SKIP_COMPILER_WRAPPER`` +# If true, no compiler wrapper will be searched for. +# ``MPI_SKIP_GUESSING`` +# If true, the guessing step will be skipped. +# +# Additionally, the following control variable is available to change search behavior: +# +# ``MPI_CXX_SKIP_MPICXX`` +# Add some definitions that will disable the MPI-2 C++ bindings. +# Currently supported are MPICH, Open MPI, Platform MPI and derivatives thereof, +# for example MVAPICH or Intel MPI. +# +# If the find procedure fails for a variable ``MPI__WORKS``, then the settings detected by or passed to +# the module did not work and even a simple MPI test program failed to compile. +# +# If all of these parameters were not sufficient to find the right MPI implementation, a user may +# disable the entire autodetection process by specifying both a list of libraries in ``MPI__LIBRARIES`` +# and a list of include directories in ``MPI__ADDITIONAL_INCLUDE_DIRS``. +# Any other variable may be set in addition to these two. The module will then validate the MPI settings and store the +# settings in the cache. +# +# Cache variables for MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The variable ``MPI__INCLUDE_DIRS`` will be assembled from the following variables. +# For C and CXX: +# +# ``MPI__HEADER_DIR`` +# Location of the ``mpi.h`` header on disk. +# +# For Fortran: +# +# ``MPI_Fortran_F77_HEADER_DIR`` +# Location of the Fortran 77 header ``mpif.h``, if it exists. +# ``MPI_Fortran_MODULE_DIR`` +# Location of the ``mpi`` or ``mpi_f08`` modules, if available. +# +# For all languages the following variables are additionally considered: +# +# ``MPI__ADDITIONAL_INCLUDE_DIRS`` +# A :ref:`;-list ` of paths needed in addition to the normal include directories. +# ``MPI__INCLUDE_DIR`` +# Path variables for include folders referred to by ````. +# ``MPI__ADDITIONAL_INCLUDE_VARS`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# The variable ``MPI__LIBRARIES`` will be assembled from the following variables: +# +# ``MPI__LIBRARY`` +# The location of a library called ```` for use with MPI. +# ``MPI__LIB_NAMES`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# Usage of mpiexec +# ^^^^^^^^^^^^^^^^ +# +# When using ``MPIEXEC_EXECUTABLE`` to execute MPI applications, you should typically +# use all of the ``MPIEXEC_EXECUTABLE`` flags as follows: +# +# :: +# +# ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} +# ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS +# +# where ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to +# pass to the MPI program. +# +# Advanced variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module can perform some advanced feature detections upon explicit request. +# +# **Important notice:** The following checks cannot be performed without *executing* an MPI test program. +# Consider the special considerations for the behavior of :command:`try_run` during cross compilation. +# Moreover, running an MPI program can cause additional issues, like a firewall notification on some systems. +# You should only enable these detections if you absolutely need the information. +# +# If the following variables are set to true, the respective search will be performed: +# +# ``MPI_DETERMINE_Fortran_CAPABILITIES`` +# Determine for all available Fortran bindings what the values of ``MPI_SUBARRAYS_SUPPORTED`` and +# ``MPI_ASYNC_PROTECTS_NONBLOCKING`` are and make their values available as ``MPI_Fortran__SUBARRAYS`` +# and ``MPI_Fortran__ASYNCPROT``, where ```` is one of ``F77_HEADER``, ``F90_MODULE`` and +# ``F08_MODULE``. +# ``MPI_DETERMINE_LIBRARY_VERSION`` +# For each language, find the output of ``MPI_Get_library_version`` and make it available as ``MPI__LIBRARY_VERSION``. +# This information is usually tied to the runtime component of an MPI implementation and might differ depending on ````. +# Note that the return value is entirely implementation defined. This information might be used to identify +# the MPI vendor and for example pick the correct one of multiple third party binaries that matches the MPI vendor. +# +# Backward Compatibility +# ^^^^^^^^^^^^^^^^^^^^^^ +# +# For backward compatibility with older versions of FindMPI, these +# variables are set, but deprecated: +# +# :: +# +# MPI_COMPILER MPI_LIBRARY MPI_EXTRA_LIBRARY +# MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_LINK_FLAGS +# MPI_LIBRARIES +# +# In new projects, please use the ``MPI__XXX`` equivalents. +# Additionally, the following variables are deprecated: +# +# ``MPI__COMPILE_FLAGS`` +# Use ``MPI__COMPILE_OPTIONS`` and ``MPI__COMPILE_DEFINITIONS`` instead. +# ``MPI__INCLUDE_PATH`` +# For consumption use ``MPI__INCLUDE_DIRS`` and for specifying folders use ``MPI__ADDITIONAL_INCLUDE_DIRS`` instead. +# ``MPIEXEC`` +# Use ``MPIEXEC_EXECUTABLE`` instead. + +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) # if IN_LIST + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# Generic compiler names +set(_MPI_C_GENERIC_COMPILER_NAMES mpicc mpcc mpicc_r mpcc_r) +set(_MPI_CXX_GENERIC_COMPILER_NAMES mpicxx mpiCC mpcxx mpCC mpic++ mpc++ + mpicxx_r mpiCC_r mpcxx_r mpCC_r mpic++_r mpc++_r) +set(_MPI_Fortran_GENERIC_COMPILER_NAMES mpif95 mpif95_r mpf95 mpf95_r + mpif90 mpif90_r mpf90 mpf90_r + mpif77 mpif77_r mpf77 mpf77_r + mpifc) + +# GNU compiler names +set(_MPI_GNU_C_COMPILER_NAMES mpigcc mpgcc mpigcc_r mpgcc_r) +set(_MPI_GNU_CXX_COMPILER_NAMES mpig++ mpg++ mpig++_r mpg++_r mpigxx) +set(_MPI_GNU_Fortran_COMPILER_NAMES mpigfortran mpgfortran mpigfortran_r mpgfortran_r + mpig77 mpig77_r mpg77 mpg77_r) + +# Intel MPI compiler names on Windows +if(WIN32) + list(APPEND _MPI_C_GENERIC_COMPILER_NAMES mpicc.bat) + list(APPEND _MPI_CXX_GENERIC_COMPILER_NAMES mpicxx.bat) + list(APPEND _MPI_Fortran_GENERIC_COMPILER_NAMES mpifc.bat) + + # Intel MPI compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc.bat) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc.bat) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort.bat mpif77.bat mpif90.bat) + + # Intel MPI compiler names for MSMPI + set(_MPI_MSVC_C_COMPILER_NAMES mpicl.bat) + set(_MPI_MSVC_CXX_COMPILER_NAMES mpicl.bat) +else() + # Intel compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc mpiicxx mpiic++) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort mpiif95 mpiif90 mpiif77) +endif() + +# PGI compiler names +set(_MPI_PGI_C_COMPILER_NAMES mpipgcc mppgcc) +set(_MPI_PGI_CXX_COMPILER_NAMES mpipgCC mppgCC) +set(_MPI_PGI_Fortran_COMPILER_NAMES mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77) + +# XLC MPI Compiler names +set(_MPI_XL_C_COMPILER_NAMES mpxlc mpxlc_r mpixlc mpixlc_r) +set(_MPI_XL_CXX_COMPILER_NAMES mpixlcxx mpixlC mpixlc++ mpxlcxx mpxlc++ mpixlc++ mpxlCC + mpixlcxx_r mpixlC_r mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r) +set(_MPI_XL_Fortran_COMPILER_NAMES mpixlf95 mpixlf95_r mpxlf95 mpxlf95_r + mpixlf90 mpixlf90_r mpxlf90 mpxlf90_r + mpixlf77 mpixlf77_r mpxlf77 mpxlf77_r + mpixlf mpixlf_r mpxlf mpxlf_r) + +# Prepend vendor-specific compiler wrappers to the list. If we don't know the compiler, +# attempt all of them. +# By attempting vendor-specific compiler names first, we should avoid situations where the compiler wrapper +# stems from a proprietary MPI and won't know which compiler it's being used for. For instance, Intel MPI +# controls its settings via the I_MPI_CC environment variables if the generic name is being used. +# If we know which compiler we're working with, we can use the most specialized wrapper there is in order to +# pick up the right settings for it. +foreach (LANG IN ITEMS C CXX Fortran) + set(_MPI_${LANG}_COMPILER_NAMES "") + foreach (id IN ITEMS GNU Intel MSVC PGI XL) + if (NOT CMAKE_${LANG}_COMPILER_ID OR CMAKE_${LANG}_COMPILER_ID STREQUAL id) + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${id}_${LANG}_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + endif() + unset(_MPI_${id}_${LANG}_COMPILER_NAMES) + endforeach() + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${LANG}_GENERIC_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + unset(_MPI_${LANG}_GENERIC_COMPILER_NAMES) +endforeach() + +# Names to try for mpiexec +# Only mpiexec commands are guaranteed to behave as described in the standard, +# mpirun commands are not covered by the standard in any way whatsoever. +# lamexec is the executable for LAM/MPI, srun is for SLURM or Open MPI with SLURM support. +# srun -n X is however a valid command, so it behaves 'like' mpiexec. +set(_MPIEXEC_NAMES_BASE mpiexec mpiexec.hydra mpiexec.mpd mpirun lamexec srun) + +unset(_MPIEXEC_NAMES) +foreach(_MPIEXEC_NAME IN LISTS _MPIEXEC_NAMES_BASE) + list(APPEND _MPIEXEC_NAMES "${_MPIEXEC_NAME}${MPI_EXECUTABLE_SUFFIX}") +endforeach() +unset(_MPIEXEC_NAMES_BASE) + +function (_MPI_check_compiler LANG QUERY_FLAG OUTPUT_VARIABLE RESULT_VARIABLE) + if(DEFINED MPI_${LANG}_COMPILER_FLAGS) +# separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_${LANG}_COMPILER_FLAGS}") + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS "${MPI_${LANG}_COMPILER_FLAGS}") + else() + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_COMPILER_FLAGS}") + endif() + execute_process( + COMMAND ${MPI_${LANG}_COMPILER} ${_MPI_COMPILER_WRAPPER_OPTIONS} ${QUERY_FLAG} + OUTPUT_VARIABLE WRAPPER_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE WRAPPER_OUTPUT ERROR_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE WRAPPER_RETURN) + # Some compiler wrappers will yield spurious zero return values, for example + # Intel MPI tolerates unknown arguments and if the MPI wrappers loads a shared + # library that has invalid or missing version information there would be warning + # messages emitted by ld.so in the compiler output. In either case, we'll treat + # the output as invalid. + if("${WRAPPER_OUTPUT}" MATCHES "undefined reference|unrecognized|need to set|no version information available") + set(WRAPPER_RETURN 255) + endif() + # Ensure that no error output might be passed upwards. + if(NOT WRAPPER_RETURN EQUAL 0) + unset(WRAPPER_OUTPUT) + endif() + set(${OUTPUT_VARIABLE} "${WRAPPER_OUTPUT}" PARENT_SCOPE) + set(${RESULT_VARIABLE} "${WRAPPER_RETURN}" PARENT_SCOPE) +endfunction() + +function (_MPI_interrogate_compiler lang) + unset(MPI_COMPILE_CMDLINE) + unset(MPI_LINK_CMDLINE) + + unset(MPI_COMPILE_OPTIONS_WORK) + unset(MPI_COMPILE_DEFINITIONS_WORK) + unset(MPI_INCLUDE_DIRS_WORK) + unset(MPI_LINK_FLAGS_WORK) + unset(MPI_LIB_NAMES_WORK) + unset(MPI_LIB_FULLPATHS_WORK) + + # Check whether the -showme:compile option works. This indicates that we have either Open MPI + # or a newer version of LAM/MPI, and implies that -showme:link will also work. + # Open MPI also supports -show, but separates linker and compiler information + _MPI_check_compiler(${LANG} "-showme:compile" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme:link" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + + # MPICH and MVAPICH offer -compile-info and -link-info. + # For modern versions, both do the same as -show. However, for old versions, they do differ + # when called for mpicxx and mpif90 and it's necessary to use them over -show in order to find the + # removed MPI C++ bindings. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-compile-info" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-link-info" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + endif() + + # MPICH, MVAPICH2 and Intel MPI just use "-show". Open MPI also offers this, but the + # -showme commands are more specialized. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-show" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + # Older versions of LAM/MPI have "-showme". Open MPI also supports this. + # Unknown to MPICH, MVAPICH and Intel MPI. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + if (NOT (MPI_COMPILER_RETURN EQUAL 0) OR NOT (DEFINED MPI_COMPILE_CMDLINE)) + # Cannot interrogate this compiler, so exit. + set(MPI_${LANG}_WRAPPER_FOUND FALSE PARENT_SCOPE) + return() + endif() + unset(MPI_COMPILER_RETURN) + + # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE + # into MPI_LINK_CMDLINE, if we didn't find the link line. + if (NOT DEFINED MPI_LINK_CMDLINE) + set(MPI_LINK_CMDLINE "${MPI_COMPILE_CMDLINE}") + endif() + + # At this point, we obtained some output from a compiler wrapper that works. + # We'll now try to parse it into variables with meaning to us. + if("${LANG}" STREQUAL "Fortran") + # Some MPICH-1 and MVAPICH-1 versions return a three command answer for Fortran, consisting + # out of a symlink command for mpif.h, the actual compiler command and a deletion of the + # created symlink. We need to detect that case, remember the include path and drop the + # symlink/deletion operation to obtain the link/compile lines we'd usually expect. + if("${MPI_COMPILE_CMDLINE}" MATCHES "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h") + get_filename_component(MPI_INCLUDE_DIRS_WORK "${CMAKE_MATCH_1}" DIRECTORY) + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + endif() + + # The Intel MPI wrapper on Linux will emit some objcopy commands after its compile command + # if -static_mpi was passed to the wrapper. To avoid spurious matches, we need to drop these lines. + if(UNIX) + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + + # Extract compile options from the compile command line. + string(REGEX MATCHALL "(^| )-f([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_OPTIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_OPTION IN LISTS MPI_ALL_COMPILE_OPTIONS) + string(REGEX REPLACE "^ " "" _MPI_COMPILE_OPTION "${_MPI_COMPILE_OPTION}") + # Ignore -fstack-protector directives: These occur on MPICH and MVAPICH when the libraries + # themselves were built with this flag. However, this flag is unrelated to using MPI, and + # we won't match the accompanying --param-ssp-size and -Wp,-D_FORTIFY_SOURCE flags and therefore + # produce inconsistent results with the regularly flags. + # Similarly, aliasing flags do not belong into our flag array. + if(NOT "${_MPI_COMPILE_OPTION}" MATCHES "^-f(stack-protector|(no-|)strict-aliasing|PI[CE]|pi[ce])") + list(APPEND MPI_COMPILE_OPTIONS_WORK "${_MPI_COMPILE_OPTION}") + endif() + endforeach() + + # Same deal, with the definitions. We also treat arguments passed to the preprocessor directly. + string(REGEX MATCHALL "(^| )(-Wp,|-Xpreprocessor |)[-/]D([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_DEFINITIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_DEFINITION IN LISTS MPI_ALL_COMPILE_DEFINITIONS) + string(REGEX REPLACE "^ ?(-Wp,|-Xpreprocessor )?[-/]D" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + string(REPLACE "\"" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + if(NOT "${_MPI_COMPILE_DEFINITION}" MATCHES "^_FORTIFY_SOURCE.*") + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${_MPI_COMPILE_DEFINITION}") + endif() + endforeach() + + # Extract include paths from compile command line + string(REGEX MATCHALL "(^| )[-/]I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:incdirs. + if (NOT MPI_ALL_INCLUDE_PATHS) + _MPI_check_compiler(${LANG} "-showme:incdirs" MPI_INCDIRS_CMDLINE MPI_INCDIRS_COMPILER_RETURN) + if(MPI_INCDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_INCLUDE_PATHS NATIVE_COMMAND "${MPI_INCDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_INCLUDE_PATH IN LISTS MPI_ALL_INCLUDE_PATHS) + string(REGEX REPLACE "^ ?[-/]I" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + string(REPLACE "\"" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + get_filename_component(_MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}" REALPATH) + list(APPEND MPI_INCLUDE_DIRS_WORK "${_MPI_INCLUDE_PATH}") + endforeach() + + # Extract linker paths from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker |)(-L|[/-]LIBPATH:|[/-]libpath:)([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:libdirs. + if (NOT MPI_ALL_LINK_PATHS) + _MPI_check_compiler(${LANG} "-showme:libdirs" MPI_LIBDIRS_CMDLINE MPI_LIBDIRS_COMPILER_RETURN) + if(MPI_LIBDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_LINK_PATHS NATIVE_COMMAND "${MPI_LIBDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_LPATH IN LISTS MPI_ALL_LINK_PATHS) + string(REGEX REPLACE "^ ?(-Wl,|-Xlinker )?(-L|[/-]LIBPATH:|[/-]libpath:)" "" _MPI_LPATH "${_MPI_LPATH}") + string(REPLACE "\"" "" _MPI_LPATH "${_MPI_LPATH}") + get_filename_component(_MPI_LPATH "${_MPI_LPATH}" REALPATH) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${_MPI_LPATH}") + endforeach() + + # Extract linker flags from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker )([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LINK_FLAG IN LISTS MPI_ALL_LINK_FLAGS) + string(STRIP "${_MPI_LINK_FLAG}" _MPI_LINK_FLAG) + # MPI might be marked to build with non-executable stacks but this should not propagate. + if (NOT "${_MPI_LINK_FLAG}" MATCHES "(-Wl,|-Xlinker )-z,noexecstack") + if (MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " ${_MPI_LINK_FLAG}") + else() + set(MPI_LINK_FLAGS_WORK "${_MPI_LINK_FLAG}") + endif() + endif() + endforeach() + + # Extract the set of libraries to link against from the link command + # line + string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ ?-l" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + + if(WIN32) + # A compiler wrapper on Windows will just have the name of the + # library to link on its link line, potentially with a full path + string(REGEX MATCHALL "(^| )([^\" ]+\\.lib|\"[^\"]+\\.lib\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + else() + # On UNIX platforms, archive libraries can be given with full path. + string(REGEX MATCHALL "(^| )([^\" ]+\\.a|\"[^\"]+\\.a\")" MPI_LIBFULLPATHS "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBFULLPATHS) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + endif() + + # An MPI compiler wrapper could have its MPI libraries in the implictly + # linked directories of the compiler itself. + if(DEFINED CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}") + endif() + + # Determine full path names for all of the libraries that one needs + # to link against in an MPI program + unset(MPI_PLAIN_LIB_NAMES_WORK) + foreach(_MPI_LIB_NAME IN LISTS MPI_LIB_NAMES_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_NAME}" NAME_WE) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${MPI_LINK_DIRECTORIES_WORK} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + + # Deal with the libraries given with full path next + unset(MPI_DIRECT_LIB_NAMES_WORK) + foreach(_MPI_LIB_FULLPATH IN LISTS MPI_LIB_FULLPATHS_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME) + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_FULLPATH}" DIRECTORY) + list(APPEND MPI_DIRECT_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_PATH} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + if(MPI_DIRECT_LIB_NAMES_WORK) + set(MPI_PLAIN_LIB_NAMES_WORK "${MPI_DIRECT_LIB_NAMES_WORK};${MPI_PLAIN_LIB_NAMES_WORK}") + endif() + + # MPI might require pthread to work. The above mechanism wouldn't detect it, but we need to + # link it in that case. -lpthread is covered by the normal library treatment on the other hand. + if("${MPI_COMPILE_CMDLINE}" MATCHES "-pthread") + list(APPEND MPI_COMPILE_OPTIONS_WORK "-pthread") + if(MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " -pthread") + else() + set(MPI_LINK_FLAGS_WORK "-pthread") + endif() + endif() + + if(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS}") + endif() + if(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + list(APPEND MPI_COMPILE_OPTIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_EXTRA_LIB_NAMES) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${MPI_${LANG}_EXTRA_LIB_NAMES}") + endif() + + # If we found MPI, set up all of the appropriate cache entries + if(NOT MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_COMPILE_OPTIONS_WORK} CACHE STRING "MPI ${LANG} compilation options" FORCE) + endif() + if(NOT MPI_${LANG}_COMPILE_DEFINITIONS) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_COMPILE_DEFINITIONS_WORK} CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_INCLUDE_DIRS_WORK} CACHE STRING "MPI ${LANG} additional include directories" FORCE) + endif() + if(NOT MPI_${LANG}_LINK_FLAGS) + set(MPI_${LANG}_LINK_FLAGS ${MPI_LINK_FLAGS_WORK} CACHE STRING "MPI ${LANG} linker flags" FORCE) + endif() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES ${MPI_PLAIN_LIB_NAMES_WORK} CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + set(MPI_${LANG}_WRAPPER_FOUND TRUE PARENT_SCOPE) +endfunction() + +function(_MPI_guess_settings LANG) + set(MPI_GUESS_FOUND FALSE) + # Currently only MSMPI and MPICH2 on Windows are supported, so we can skip this search if we're not targeting that. + if(WIN32) + # MSMPI + + # The environment variables MSMPI_INC and MSMPILIB32/64 are the only ways of locating the MSMPI_SDK, + # which is installed separately from the runtime. Thus it's possible to have mpiexec but not MPI headers + # or import libraries and vice versa. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MSMPI") + # We first attempt to locate the msmpi.lib. Should be find it, we'll assume that the MPI present is indeed + # Microsoft MPI. + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB64}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x64") + else() + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB32}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x86") + endif() + + find_library(MPI_msmpi_LIBRARY + NAMES msmpi + HINTS ${MPI_MSMPI_LIB_PATH} + DOC "Location of the msmpi library for Microsoft MPI") + mark_as_advanced(MPI_msmpi_LIBRARY) + + if(MPI_msmpi_LIBRARY) + # Next, we attempt to locate the MPI header. Note that for Fortran we know that mpif.h is a way + # MSMPI can be used and therefore that header has to be present. + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + get_filename_component(MPI_MSMPI_INC_DIR "$ENV{MSMPI_INC}" REALPATH) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MSMPI_INC_DIR}" CACHE STRING "MPI ${LANG} additional include directories" FORCE) + unset(MPI_MSMPI_INC_DIR) + endif() + + # For MSMPI, one can compile the MPI module by building the mpi.f90 shipped with the MSMPI SDK, + # thus it might be present or provided by the user. Figuring out which is supported is done later on. + # The PGI Fortran compiler for instance ships a prebuilt set of modules in its own include folder. + # Should a user be employing PGI or have built its own set and provided it via cache variables, the + # splitting routine would have located the module files. + + # For C and C++, we're done here (MSMPI does not ship the MPI-2 C++ bindings) - however, for Fortran + # we need some extra library to glue Fortran support together: + # MSMPI ships 2-4 Fortran libraries, each for different Fortran compiler behaviors. The library names + # ending with a c are using the cdecl calling convention, whereas those ending with an s are for Fortran + # implementations using stdcall. Therefore, the 64-bit MSMPI only ships those ending in 'c', whereas the 32-bit + # has both variants available. + # The second difference is the last but one letter, if it's an e(nd), the length of a string argument is + # passed by the Fortran compiler after all other arguments on the parameter list, if it's an m(ixed), + # it's passed immediately after the string address. + + # To summarize: + # - msmpifec: CHARACTER length passed after the parameter list and using cdecl calling convention + # - msmpifmc: CHARACTER length passed directly after string address and using cdecl calling convention + # - msmpifes: CHARACTER length passed after the parameter list and using stdcall calling convention + # - msmpifms: CHARACTER length passed directly after string address and using stdcall calling convention + # 32-bit MSMPI ships all four libraries, 64-bit MSMPI ships only the first two. + + # As is, Intel Fortran and PGI Fortran both use the 'ec' variant of the calling convention, whereas + # the old Compaq Visual Fortran compiler defaulted to the 'ms' version. It's possible to make Intel Fortran + # use the CVF calling convention using /iface:cvf, but we assume - and this is also assumed in FortranCInterface - + # this isn't the case. It's also possible to make CVF use the 'ec' variant, using /iface=(cref,nomixed_str_len_arg). + + # Our strategy is now to locate all libraries, but enter msmpifec into the LIB_NAMES array. + # Should this not be adequate it's a straightforward way for a user to change the LIB_NAMES array and + # have his library found. Still, this should not be necessary outside of exceptional cases, as reasoned. + if ("${LANG}" STREQUAL "Fortran") + set(MPI_MSMPI_CALLINGCONVS c) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 4) + list(APPEND MPI_MSMPI_CALLINGCONVS s) + endif() + foreach(mpistrlenpos IN ITEMS e m) + foreach(mpicallingconv IN LISTS MPI_MSMPI_CALLINGCONVS) + find_library(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY + NAMES msmpif${mpistrlenpos}${mpicallingconv} + HINTS "${MPI_MSMPI_LIB_PATH}" + DOC "Location of the msmpi${mpistrlenpos}${mpicallingconv} library for Microsoft MPI") + mark_as_advanced(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY) + endforeach() + endforeach() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi;msmpifec" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + + # At this point we're *not* done. MSMPI requires an additional include file for Fortran giving the value + # of MPI_AINT. This file is called mpifptr.h located in the x64 and x86 subfolders, respectively. + find_path(MPI_mpifptr_INCLUDE_DIR + NAMES "mpifptr.h" + HINTS "${MPI_MSMPI_INC_PATH_EXTRA}" + DOC "Location of the mpifptr.h extra header for Microsoft MPI") + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS "mpifptr" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + mark_as_advanced(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS MPI_mpifptr_INCLUDE_DIR) + else() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + endif() + mark_as_advanced(MPI_${LANG}_LIB_NAMES) + set(MPI_GUESS_FOUND TRUE) + endif() + endif() + + # At this point there's not many MPIs that we could still consider. + # OpenMPI 1.6.x and below supported Windows, but these ship compiler wrappers that still work. + # The only other relevant MPI implementation without a wrapper is MPICH2, which had Windows support in 1.4.1p1 and older. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MPICH2") + set(MPI_MPICH_PREFIX_PATHS + "$ENV{ProgramW6432}/MPICH2/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH\\SMPD;binary]/../lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH2;Path]/lib" + ) + + # All of C, C++ and Fortran will need mpi.lib, so we'll look for this first + find_library(MPI_mpi_LIBRARY + NAMES mpi + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_mpi_LIBRARY) + # If we found mpi.lib, we detect the rest of MPICH2 + if(MPI_mpi_LIBRARY) + set(MPI_MPICH_LIB_NAMES "mpi") + # If MPI-2 C++ bindings are requested, we need to locate cxx.lib as well. + # Otherwise, MPICH_SKIP_MPICXX will be defined and these bindings aren't needed. + if("${LANG}" STREQUAL "CXX" AND NOT MPI_CXX_SKIP_MPICXX) + find_library(MPI_cxx_LIBRARY + NAMES cxx + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_cxx_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "cxx") + # For Fortran, MPICH2 provides three different libraries: + # fmpich2.lib which uses uppercase symbols and cdecl, + # fmpich2s.lib which uses uppercase symbols and stdcall (32-bit only), + # fmpich2g.lib which uses lowercase symbols with double underscores and cdecl. + # fmpich2s.lib would be useful for Compaq Visual Fortran, fmpich2g.lib has to be used with GNU g77 and is also + # provided in the form of an .a archive for MinGW and Cygwin. From our perspective, fmpich2.lib is the only one + # we need to try, and if it doesn't work with the given Fortran compiler we'd find out later on during validation + elseif("${LANG}" STREQUAL "Fortran") + find_library(MPI_fmpich2_LIBRARY + NAMES fmpich2 + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2s_LIBRARY + NAMES fmpich2s + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2g_LIBRARY + NAMES fmpich2g + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_fmpich2_LIBRARY MPI_fmpich2s_LIBRARY MPI_fmpich2g_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "fmpich2") + endif() + + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "${MPI_MPICH_LIB_NAMES}" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + unset(MPI_MPICH_LIB_NAMES) + + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + # For MPICH2, the include folder would be in ../include relative to the library folder. + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_mpi_LIBRARY}" DIRECTORY) + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_MPICH_ROOT_DIR}" DIRECTORY) + if(IS_DIRECTORY "${MPI_MPICH_ROOT_DIR}/include") + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MPICH_ROOT_DIR}/include" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + unset(MPI_MPICH_ROOT_DIR) + endif() + set(MPI_GUESS_FOUND TRUE) + endif() + unset(MPI_MPICH_PREFIX_PATHS) + endif() + endif() + set(MPI_${LANG}_GUESS_FOUND "${MPI_GUESS_FOUND}" PARENT_SCOPE) +endfunction() + +function(_MPI_adjust_compile_definitions LANG) + if("${LANG}" STREQUAL "CXX") + # To disable the C++ bindings, we need to pass some definitions since the mpi.h header has to deal with both C and C++ + # bindings in MPI-2. + if(MPI_CXX_SKIP_MPICXX AND NOT MPI_${LANG}_COMPILE_DEFINITIONS MATCHES "SKIP_MPICXX") + # MPICH_SKIP_MPICXX is being used in MPICH and derivatives like MVAPICH or Intel MPI + # OMPI_SKIP_MPICXX is being used in Open MPI + # _MPICC_H is being used for IBM Platform MPI + list(APPEND MPI_${LANG}_COMPILE_DEFINITIONS "MPICH_SKIP_MPICXX" "OMPI_SKIP_MPICXX" "_MPICC_H") + set(MPI_${LANG}_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}" CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + endif() +endfunction() + +macro(_MPI_assemble_libraries LANG) + set(MPI_${LANG}_LIBRARIES "") + # Only for libraries do we need to check whether the compiler's linking stage is separate. + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS_IMPLICIT) + foreach(mpilib IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_LIBRARIES ${MPI_${mpilib}_LIBRARY}) + endforeach() + endif() +endmacro() + +macro(_MPI_assemble_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_${LANG}_INCLUDE_DIRS "") + else() + set(MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS}") + if("${LANG}" MATCHES "(C|CXX)") + if(MPI_${LANG}_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + else() # Fortran + if(MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_F77_HEADER_DIR}") + endif() + if(MPI_${LANG}_MODULE_DIR AND NOT "${MPI_${LANG}_MODULE_DIR}" IN_LIST MPI_${LANG}_INCLUDE_DIRS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_MODULE_DIR}") + endif() + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(MPI_ADDITIONAL_INC_DIR IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${MPI_ADDITIONAL_INC_DIR}_INCLUDE_DIR}") + endforeach() + endif() + endif() +endmacro() + +function(_MPI_split_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + return() + endif() + # Backwards compatibility: Search INCLUDE_PATH if given. + if(MPI_${LANG}_INCLUDE_PATH) + list(APPEND MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_INCLUDE_PATH}") + endif() + + # We try to find the headers/modules among those paths (and system paths) + # For C/C++, we just need to have a look for mpi.h. + if("${LANG}" MATCHES "(C|CXX)") + find_path(MPI_${LANG}_HEADER_DIR "mpi.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + mark_as_advanced(MPI_${LANG}_HEADER_DIR) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + # Fortran is more complicated here: An implementation could provide + # any of the Fortran 77/90/2008 APIs for MPI. For example, MSMPI + # only provides Fortran 77 and - if mpi.f90 is built - potentially + # a Fortran 90 module. + elseif("${LANG}" STREQUAL "Fortran") + find_path(MPI_${LANG}_F77_HEADER_DIR "mpif.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + find_path(MPI_${LANG}_MODULE_DIR + NAMES "mpi.mod" "mpi_f08.mod" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS + "${MPI_${LANG}_F77_HEADER_DIR}" + "${MPI_${LANG}_MODULE_DIR}" + ) + endif() + mark_as_advanced(MPI_${LANG}_F77_HEADER_DIR MPI_${LANG}_MODULE_DIR) + endif() + # Remove duplicates and default system directories from the list. + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_DUPLICATES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + foreach(MPI_IMPLICIT_INC_DIR IN LISTS CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_IMPLICIT_INC_DIR}) + endforeach() + endif() + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories" FORCE) +endfunction() + +macro(_MPI_create_imported_target LANG) + if(NOT TARGET MPI::MPI_${LANG}) + add_library(MPI::MPI_${LANG} INTERFACE IMPORTED) + endif() + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}") + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}") + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_LINK_LIBRARIES "") + if(MPI_${LANG}_LINK_FLAGS) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LINK_FLAGS}") + endif() + # If the compiler links MPI implicitly, no libraries will be found as they're contained within + # CMAKE__IMPLICIT_LINK_LIBRARIES already. + if(MPI_${LANG}_LIBRARIES) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LIBRARIES}") + endif() + # Given the new design of FindMPI, INCLUDE_DIRS will always be located, even under implicit linking. + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${MPI_${LANG}_INCLUDE_DIRS}") +endmacro() + +function(_MPI_try_staged_settings LANG MPI_TEST_FILE_NAME MODE RUN_BINARY) + set(WORK_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI") + set(SRC_DIR "${CMAKE_CURRENT_LIST_DIR}/FindMPI") + set(BIN_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI/${MPI_TEST_FILE_NAME}_${LANG}.bin") + unset(MPI_TEST_COMPILE_DEFINITIONS) + if("${LANG}" STREQUAL "Fortran") + if("${MODE}" STREQUAL "F90_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi\n implicit none") + elseif("${MODE}" STREQUAL "F08_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi_f08\n implicit none") + else() # F77 header + set(MPI_Fortran_INCLUDE_LINE "implicit none\n include 'mpif.h'") + endif() + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.f90.in" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90" @ONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90") + elseif("${LANG}" STREQUAL "CXX") + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.c" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp" COPYONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp") + if("${MODE}" STREQUAL "TEST_MPICXX") + set(MPI_TEST_COMPILE_DEFINITIONS TEST_MPI_MPICXX) + endif() + else() # C + set(MPI_TEST_SOURCE_FILE "${SRC_DIR}/${MPI_TEST_FILE_NAME}.c") + endif() + if(RUN_BINARY) + try_run(MPI_RUN_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + RUN_OUTPUT_VARIABLE MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}) + set(MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} "${MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}}" PARENT_SCOPE) + else() + try_compile(MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + COPY_FILE "${BIN_FILE}") + endif() +endfunction() + +macro(_MPI_check_lang_works LANG) + # For Fortran we may have by the MPI-3 standard an implementation that provides: + # - the mpi_f08 module + # - *both*, the mpi module and 'mpif.h' + # Since older MPI standards (MPI-1) did not define anything but 'mpif.h', we need to check all three individually. + if( NOT MPI_${LANG}_WORKS ) + if("${LANG}" STREQUAL "Fortran") + set(MPI_Fortran_INTEGER_LINE "(kind=MPI_INTEGER_KIND)") + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F90_MODULE FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F08_MODULE FALSE) + + set(MPI_${LANG}_WORKS FALSE) + + foreach(mpimethod IN ITEMS F77_HEADER F08_MODULE F90_MODULE) + if(MPI_RESULT_${LANG}_test_mpi_${mpimethod}) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_${mpimethod} TRUE) + else() + set(MPI_${LANG}_HAVE_${mpimethod} FALSE) + endif() + endforeach() + # MPI-1 versions had no MPI_INTGER_KIND defined, so we need to try without it. + # However, MPI-1 also did not define the Fortran 90 and 08 modules, so we only try the F77 header. + unset(MPI_Fortran_INTEGER_LINE) + if(NOT MPI_${LANG}_WORKS) + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER_NOKIND FALSE) + if(MPI_RESULT_${LANG}_test_mpi_F77_HEADER_NOKIND) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_F77_HEADER TRUE) + endif() + endif() + else() + _MPI_try_staged_settings(${LANG} test_mpi normal FALSE) + # If 'test_mpi' built correctly, we've found valid MPI settings. There might not be MPI-2 C++ support, but there can't + # be MPI-2 C++ support without the C bindings being present, so checking for them is sufficient. + set(MPI_${LANG}_WORKS "${MPI_RESULT_${LANG}_test_mpi_normal}") + endif() + endif() +endmacro() + +# Some systems install various MPI implementations in separate folders in some MPI prefix +# This macro enumerates all such subfolders and adds them to the list of hints that will be searched. +macro(MPI_search_mpi_prefix_folder PREFIX_FOLDER) + if(EXISTS "${PREFIX_FOLDER}") + file(GLOB _MPI_folder_children RELATIVE "${PREFIX_FOLDER}" "${PREFIX_FOLDER}/*") + foreach(_MPI_folder_child IN LISTS _MPI_folder_children) + if(IS_DIRECTORY "${PREFIX_FOLDER}/${_MPI_folder_child}") + list(APPEND MPI_HINT_DIRS "${PREFIX_FOLDER}/${_MPI_folder_child}") + endif() + endforeach() + endif() +endmacro() + +set(MPI_HINT_DIRS ${MPI_HOME} $ENV{MPI_ROOT} $ENV{MPI_HOME} $ENV{I_MPI_ROOT}) +if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux") + # SUSE Linux Enterprise Server stores its MPI implementations under /usr/lib64/mpi/gcc/ + # We enumerate the subfolders and append each as a prefix + MPI_search_mpi_prefix_folder("/usr/lib64/mpi/gcc") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # MSMPI stores its runtime in a special folder, this adds the possible locations to the hints. + list(APPEND MPI_HINT_DIRS $ENV{MSMPI_BIN} "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MPI;InstallRoot]") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "FreeBSD") + # FreeBSD ships mpich under the normal system paths - but available openmpi implementations + # will be found in /usr/local/mpi/ + MPI_search_mpi_prefix_folder("/usr/local/mpi") +endif() + +# Most MPI distributions have some form of mpiexec or mpirun which gives us something we can look for. +# The MPI standard does not mandate the existence of either, but instead only makes requirements if a distribution +# ships an mpiexec program (mpirun executables are not regulated by the standard). +find_program(MPIEXEC_EXECUTABLE + NAMES ${_MPIEXEC_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${MPI_HINT_DIRS} + DOC "Executable for running MPI programs.") + +# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin). +# This gives us a fairly reliable base directory to search for /bin /lib and /include from. +get_filename_component(_MPI_BASE_DIR "${MPIEXEC_EXECUTABLE}" PATH) +get_filename_component(_MPI_BASE_DIR "${_MPI_BASE_DIR}" PATH) + +# According to the MPI standard, section 8.8 -n is a guaranteed, and the only guaranteed way to +# launch an MPI process using mpiexec if such a program exists. +set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "Flag used by MPI to specify the number of processes for mpiexec; the next option will be the number of processes.") +set(MPIEXEC_PREFLAGS "" CACHE STRING "These flags will be directly before the executable that is being run by mpiexec.") +set(MPIEXEC_POSTFLAGS "" CACHE STRING "These flags will be placed after all flags passed to mpiexec.") + +# Set the number of processes to the physical processor count +cmake_host_system_information(RESULT _MPIEXEC_NUMPROCS QUERY NUMBER_OF_PHYSICAL_CORES) +set(MPIEXEC_MAX_NUMPROCS "${_MPIEXEC_NUMPROCS}" CACHE STRING "Maximum number of processors available to run MPI applications.") +unset(_MPIEXEC_NUMPROCS) +mark_as_advanced(MPIEXEC_EXECUTABLE MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS) + +#============================================================================= +# Backward compatibility input hacks. Propagate the FindMPI hints to C and +# CXX if the respective new versions are not defined. Translate the old +# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${LANG}_LIBRARIES. +# +# Once we find the new variables, we translate them back into their old +# equivalents below. +if(NOT MPI_IGNORE_LEGACY_VARIABLES) + foreach (LANG IN ITEMS C CXX) + # Old input variables. + set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS) + + # Set new vars based on their old equivalents, if the new versions are not already set. + foreach (var ${_MPI_OLD_INPUT_VARS}) + if (NOT MPI_${LANG}_${var} AND MPI_${var}) + set(MPI_${LANG}_${var} "${MPI_${var}}") + endif() + endforeach() + + # Chop the old compile flags into options and definitions + + unset(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + unset(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + if(MPI_${LANG}_COMPILE_FLAGS) + separate_arguments(MPI_SEPARATE_FLAGS NATIVE_COMMAND "${MPI_${LANG}_COMPILE_FLAGS}") + foreach(_MPI_FLAG IN LISTS MPI_SEPARATE_FLAGS) + if("${_MPI_FLAG}" MATCHES "^ *[-/D]([^ ]+)") + list(APPEND MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS "${CMAKE_MATCH_1}") + else() + list(APPEND MPI_${LANG}_EXTRA_COMPILE_OPTIONS "${_MPI_FLAG}") + endif() + endforeach() + unset(MPI_SEPARATE_FLAGS) + endif() + + # If a list of libraries was given, we'll split it into new-style cache variables + unset(MPI_${LANG}_EXTRA_LIB_NAMES) + if(NOT MPI_${LANG}_LIB_NAMES) + foreach(_MPI_LIB IN LISTS MPI_${LANG}_LIBRARIES MPI_LIBRARY MPI_EXTRA_LIBRARY) + if(_MPI_LIB) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB}" NAME) + get_filename_component(_MPI_LIB_DIR "${_MPI_LIB}" DIRECTORY) + list(APPEND MPI_${LANG}_EXTRA_LIB_NAMES "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_DIR} $ENV{MPI_LIB} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endif() + endforeach() + endif() + endforeach() +endif() +#============================================================================= + +unset(MPI_VERSION) +unset(MPI_VERSION_MAJOR) +unset(MPI_VERSION_MINOR) + +unset(_MPI_MIN_VERSION) + +# If the user specified a library name we assume they prefer that library over a wrapper. If not, they can disable skipping manually. +if(NOT DEFINED MPI_SKIP_COMPILER_WRAPPER AND MPI_GUESS_LIBRARY_NAME) + set(MPI_SKIP_COMPILER_WRAPPER TRUE) +endif() + +# This loop finds the compilers and sends them off for interrogation. +foreach(LANG IN ITEMS C CXX Fortran) + if(CMAKE_${LANG}_COMPILER_LOADED) + if(NOT MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} IN_LIST MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} STREQUAL CXX AND NOT MPI_CXX_SKIP_MPICXX AND MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(_MPI_FIND_${LANG} TRUE) + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + if(_MPI_FIND_${LANG}) + if( ${LANG} STREQUAL CXX AND NOT MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(MPI_CXX_SKIP_MPICXX FALSE CACHE BOOL "If true, the MPI-2 C++ bindings are disabled using definitions.") + mark_as_advanced(MPI_CXX_SKIP_MPICXX) + endif() + if(NOT (MPI_${LANG}_LIB_NAMES AND (MPI_${LANG}_INCLUDE_PATH OR MPI_${LANG}_INCLUDE_DIRS OR MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS))) + set(MPI_${LANG}_TRIED_IMPLICIT FALSE) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + if(NOT MPI_${LANG}_COMPILER AND NOT MPI_ASSUME_NO_BUILTIN_MPI) + # Should the imported targets be empty, we effectively try whether the compiler supports MPI on its own, which is the case on e.g. + # Cray PrgEnv. + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + + # If the compiler can build MPI code on its own, it functions as an MPI compiler and we'll set the variable to point to it. + if(MPI_${LANG}_WORKS) + set(MPI_${LANG}_COMPILER "${CMAKE_${LANG}_COMPILER}" CACHE FILEPATH "MPI compiler for ${LANG}" FORCE) + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + set(MPI_${LANG}_TRIED_IMPLICIT TRUE) + endif() + + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WRAPPER_FOUND FALSE) + set(MPI_PINNED_COMPILER FALSE) + + if(NOT MPI_SKIP_COMPILER_WRAPPER) + if(MPI_${LANG}_COMPILER) + # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler. + if (NOT IS_ABSOLUTE "${MPI_${LANG}_COMPILER}") + # Get rid of our default list of names and just search for the name the user wants. + set(_MPI_${LANG}_COMPILER_NAMES "${MPI_${LANG}_COMPILER}") + unset(MPI_${LANG}_COMPILER CACHE) + endif() + # If the user specifies a compiler, we don't want to try to search libraries either. + set(MPI_PINNED_COMPILER TRUE) + endif() + + # If we have an MPI base directory, we'll try all compiler names in that one first. + # This should prevent mixing different MPI environments + if(_MPI_BASE_DIR) + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${_MPI_BASE_DIR} + NO_DEFAULT_PATH + DOC "MPI compiler for ${LANG}" + ) + endif() + + # If the base directory did not help (for example because the mpiexec isn't in the same directory as the compilers), + # we shall try searching in the default paths. + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + DOC "MPI compiler for ${LANG}" + ) + + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_PINNED_COMPILER TRUE) + + # If we haven't made the implicit compiler test yet, perform it now. + if(NOT MPI_${LANG}_TRIED_IMPLICIT) + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + endif() + + # Should the MPI compiler not work implicitly for MPI, still interrogate it. + # Otherwise, MPI compilers for which CMake has separate linking stages, e.g. Intel MPI on Windows where link.exe is being used + # directly during linkage instead of CMAKE__COMPILER will not work. + if(NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + _MPI_interrogate_compiler(${LANG}) + else() + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + elseif(MPI_${LANG}_COMPILER) + _MPI_interrogate_compiler(${LANG}) + endif() + endif() + + if(NOT MPI_SKIP_GUESSING AND NOT MPI_${LANG}_WRAPPER_FOUND AND NOT MPI_PINNED_COMPILER) + # For C++, we may use the settings for C. Should a given compiler wrapper for C++ not exist, but one for C does, we copy over the + # settings for C. An MPI distribution that is in this situation would be IBM Platform MPI. + if("${LANG}" STREQUAL "CXX" AND MPI_C_WRAPPER_FOUND) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_C_COMPILE_OPTIONS} CACHE STRING "MPI ${LANG} compilation options" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS} CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_C_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS ${MPI_C_LINK_FLAGS} CACHE STRING "MPI ${LANG} linker flags" ) + set(MPI_${LANG}_LIB_NAMES ${MPI_C_LIB_NAMES} CACHE STRING "MPI ${LANG} libraries to link against" ) + else() + _MPI_guess_settings(${LANG}) + endif() + endif() + endif() + endif() + + _MPI_split_include_dirs(${LANG}) + _MPI_assemble_include_dirs(${LANG}) + _MPI_assemble_libraries(${LANG}) + + _MPI_adjust_compile_definitions(${LANG}) + # We always create imported targets even if they're empty + _MPI_create_imported_target(${LANG}) + + if(NOT MPI_${LANG}_WORKS) + _MPI_check_lang_works(${LANG}) + endif() + + # Next, we'll initialize the MPI variables that have not been previously set. + set(MPI_${LANG}_COMPILE_OPTIONS "" CACHE STRING "MPI ${LANG} compilation flags" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS "" CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "" CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS "" CACHE STRING "MPI ${LANG} linker flags" ) + if(NOT MPI_${LANG}_COMPILER STREQUAL CMAKE_${LANG}_COMPILER) + set(MPI_${LANG}_LIB_NAMES "" CACHE STRING "MPI ${LANG} libraries to link against" ) + endif() + mark_as_advanced(MPI_${LANG}_COMPILE_OPTIONS MPI_${LANG}_COMPILE_DEFINITIONS MPI_${LANG}_LINK_FLAGS + MPI_${LANG}_LIB_NAMES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS MPI_${LANG}_COMPILER) + + # If we've found MPI, then we'll perform additional analysis: Determine the MPI version, MPI library version, supported + # MPI APIs (i.e. MPI-2 C++ bindings). For Fortran we also need to find specific parameters if we're under MPI-3. + if(MPI_${LANG}_WORKS) + if("${LANG}" STREQUAL "CXX" AND NOT DEFINED MPI_MPICXX_FOUND) + if(NOT MPI_CXX_SKIP_MPICXX AND NOT MPI_CXX_VALIDATE_SKIP_MPICXX) + _MPI_try_staged_settings(${LANG} test_mpi MPICXX FALSE) + if(MPI_RESULT_${LANG}_test_mpi_MPICXX) + set(MPI_MPICXX_FOUND TRUE) + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + endif() + + # At this point, we know the bindings present but not the MPI version or anything else. + if(NOT DEFINED MPI_${LANG}_VERSION) + unset(MPI_${LANG}_VERSION_MAJOR) + unset(MPI_${LANG}_VERSION_MINOR) + endif() + set(MPI_BIN_FOLDER ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI) + + # For Fortran, we'll want to use the most modern MPI binding to test capabilities other than the + # Fortran parameters, since those depend on the method of consumption. + # For C++, we can always use the C bindings, and should do so, since the C++ bindings do not exist in MPI-3 + # whereas the C bindings do, and the C++ bindings never offered any feature advantage over their C counterparts. + if("${LANG}" STREQUAL "Fortran") + if(MPI_${LANG}_HAVE_F08_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F08_MODULE) + elseif(MPI_${LANG}_HAVE_F90_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F90_MODULE) + else() + set(MPI_${LANG}_HIGHEST_METHOD F77_HEADER) + endif() + + # Another difference between C and Fortran is that we can't use the preprocessor to determine whether MPI_VERSION + # and MPI_SUBVERSION are provided. These defines did not exist in MPI 1.0 and 1.1 and therefore might not + # exist. For C/C++, test_mpi.c will handle the MPI_VERSION extraction, but for Fortran, we need mpiver.f90. + if(NOT DEFINED MPI_${LANG}_VERSION) + _MPI_try_staged_settings(${LANG} mpiver ${MPI_${LANG}_HIGHEST_METHOD} FALSE) + if(MPI_RESULT_${LANG}_mpiver_${MPI_${LANG}_HIGHEST_METHOD}) + file(STRINGS ${MPI_BIN_FOLDER}/mpiver_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + # Finally, we want to find out which capabilities a given interface supports, compare the MPI-3 standard. + # This is determined by interface specific parameters MPI_SUBARRAYS_SUPPORTED and MPI_ASYNC_PROTECTS_NONBLOCKING + # and might vary between the different methods of consumption. + if(MPI_DETERMINE_Fortran_CAPABILITIES AND NOT MPI_Fortran_CAPABILITIES_DETERMINED) + foreach(mpimethod IN ITEMS F08_MODULE F90_MODULE F77_HEADER) + if(MPI_${LANG}_HAVE_${mpimethod}) + set(MPI_${LANG}_${mpimethod}_SUBARRAYS FALSE) + set(MPI_${LANG}_${mpimethod}_ASYNCPROT FALSE) + _MPI_try_staged_settings(${LANG} fortranparam_mpi ${mpimethod} TRUE) + if(MPI_RESULT_${LANG}_fortranparam_mpi_${mpimethod} AND + NOT "${MPI_RUN_RESULT_${LANG}_fortranparam_mpi_${mpimethod}}" STREQUAL "FAILED_TO_RUN") + if("${MPI_RUN_OUTPUT_${LANG}_fortranparam_mpi_${mpimethod}}" MATCHES + ".*INFO:SUBARRAYS\\[ *([TF]) *\\]-ASYNCPROT\\[ *([TF]) *\\].*") + if("${CMAKE_MATCH_1}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_SUBARRAYS TRUE) + endif() + if("${CMAKE_MATCH_2}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_ASYNCPROT TRUE) + endif() + endif() + endif() + endif() + endforeach() + set(MPI_Fortran_CAPABILITIES_DETERMINED TRUE) + endif() + else() + set(MPI_${LANG}_HIGHEST_METHOD normal) + + # By the MPI-2 standard, MPI_VERSION and MPI_SUBVERSION are valid for both C and C++ bindings. + if(NOT DEFINED MPI_${LANG}_VERSION) + file(STRINGS ${MPI_BIN_FOLDER}/test_mpi_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + unset(MPI_BIN_FOLDER) + + # At this point, we have dealt with determining the MPI version and parameters for each Fortran method available. + # The one remaining issue is to determine which MPI library is installed. + # Determining the version and vendor of the MPI library is only possible via MPI_Get_library_version() at runtime, + # and therefore we cannot do this while cross-compiling (a user may still define MPI__LIBRARY_VERSION_STRING + # themselves and we'll attempt splitting it, which is equivalent to provide the try_run output). + # It's also worth noting that the installed version string can depend on the language, or on the system the binary + # runs on if MPI is not statically linked. + if(MPI_DETERMINE_LIBRARY_VERSION AND NOT MPI_${LANG}_LIBRARY_VERSION_STRING) + _MPI_try_staged_settings(${LANG} libver_mpi ${MPI_${LANG}_HIGHEST_METHOD} TRUE) + if(MPI_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD} AND + "${MPI_RUN_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" EQUAL "0") + string(STRIP "${MPI_RUN_OUTPUT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" + MPI_${LANG}_LIBRARY_VERSION_STRING) + else() + set(MPI_${LANG}_LIBRARY_VERSION_STRING "NOTFOUND") + endif() + endif() + endif() + + set(MPI_${LANG}_FIND_QUIETLY ${MPI_FIND_QUIETLY}) + set(MPI_${LANG}_FIND_VERSION ${MPI_FIND_VERSION}) + set(MPI_${LANG}_FIND_VERSION_EXACT ${MPI_FIND_VERSION_EXACT}) + + unset(MPI_${LANG}_REQUIRED_VARS) + if (NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + foreach(mpilibname IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpilibname}_LIBRARY") + endforeach() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_LIB_NAMES") + if("${LANG}" STREQUAL "Fortran") + # For Fortran we only need one of the module or header directories to have *some* support for MPI. + if(NOT MPI_${LANG}_MODULE_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_F77_HEADER_DIR") + endif() + if(NOT MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_MODULE_DIR") + endif() + else() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_HEADER_DIR") + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(mpiincvar IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpiincvar}_INCLUDE_DIR") + endforeach() + endif() + # Append the works variable now. If the settings did not work, this will show up properly. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + else() + # If the compiler worked implicitly, use its path as output. + # Should the compiler variable be set, we also require it to work. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_COMPILER") + if(MPI_${LANG}_COMPILER) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + endif() + endif() + find_package_handle_standard_args(MPI_${LANG} REQUIRED_VARS ${MPI_${LANG}_REQUIRED_VARS} + VERSION_VAR MPI_${LANG}_VERSION) + + if(DEFINED MPI_${LANG}_VERSION) + if(NOT _MPI_MIN_VERSION OR _MPI_MIN_VERSION VERSION_GREATER MPI_${LANG}_VERSION) + set(_MPI_MIN_VERSION MPI_${LANG}_VERSION) + endif() + endif() + endif() +endforeach() + +unset(_MPI_REQ_VARS) +foreach(LANG IN ITEMS C CXX Fortran) + if((NOT MPI_FIND_COMPONENTS AND CMAKE_${LANG}_COMPILER_LOADED) OR LANG IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_${LANG}_FOUND") + endif() +endforeach() + +if(MPICXX IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_MPICXX_FOUND") +endif() + +find_package_handle_standard_args(MPI + REQUIRED_VARS ${_MPI_REQ_VARS} + VERSION_VAR ${_MPI_MIN_VERSION} + HANDLE_COMPONENTS) + +#============================================================================= +# More backward compatibility stuff + +# For compatibility reasons, we also define MPIEXEC +set(MPIEXEC "${MPIEXEC_EXECUTABLE}") + +# Copy over MPI__INCLUDE_PATH from the assembled INCLUDE_DIRS. +foreach(LANG IN ITEMS C CXX Fortran) + if(MPI_${LANG}_FOUND) + set(MPI_${LANG}_INCLUDE_PATH "${MPI_${LANG}_INCLUDE_DIRS}") + unset(MPI_${LANG}_COMPILE_FLAGS) + if(MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_FLAGS "${MPI_${LANG}_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_COMPILE_DEFINITIONS) + foreach(_MPI_DEF IN LISTS MPI_${LANG}_COMPILE_DEFINITIONS) + string(APPEND MPI_${LANG}_COMPILE_FLAGS " -D${_MPI_DEF}") + endforeach() + endif() + endif() +endforeach() + +# Bare MPI sans ${LANG} vars are set to CXX then C, depending on what was found. +# This mimics the behavior of the old language-oblivious FindMPI. +set(_MPI_OLD_VARS COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES) +if (MPI_CXX_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_CXX_${var}}) + endforeach() +elseif (MPI_C_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_C_${var}}) + endforeach() +endif() + +# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache. +if (MPI_LIBRARIES) + list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK) + set(MPI_LIBRARY "${MPI_LIBRARY_WORK}") + unset(MPI_LIBRARY_WORK) +else() + set(MPI_LIBRARY "MPI_LIBRARY-NOTFOUND") +endif() + +list(LENGTH MPI_LIBRARIES MPI_NUMLIBS) +if (MPI_NUMLIBS GREATER 1) + set(MPI_EXTRA_LIBRARY_WORK "${MPI_LIBRARIES}") + list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0) + set(MPI_EXTRA_LIBRARY "${MPI_EXTRA_LIBRARY_WORK}") + unset(MPI_EXTRA_LIBRARY_WORK) +else() + set(MPI_EXTRA_LIBRARY "MPI_EXTRA_LIBRARY-NOTFOUND") +endif() +set(MPI_IGNORE_LEGACY_VARIABLES TRUE) +#============================================================================= + +# unset these vars to cleanup namespace +unset(_MPI_OLD_VARS) +unset(_MPI_PREFIX_PATH) +unset(_MPI_BASE_DIR) +foreach (lang C CXX Fortran) + unset(_MPI_${LANG}_COMPILER_NAMES) +endforeach() + +cmake_policy(POP) diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in new file mode 100644 index 000000000..30f912c62 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in @@ -0,0 +1,4 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + print *, 'INFO:SUBARRAYS[', MPI_SUBARRAYS_SUPPORTED, ']-ASYNCPROT[', MPI_ASYNC_PROTECTS_NONBLOCKING, ']' + end program mpi_ver diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.c b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.c new file mode 100644 index 000000000..be9d19d43 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.c @@ -0,0 +1,19 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +int main(int argc, char* argv[]) +{ + char mpilibver_str[MPI_MAX_LIBRARY_VERSION_STRING]; + int mpilibver_len; + MPI_Get_library_version(mpilibver_str, &mpilibver_len); +#ifdef __cplusplus + std::puts(mpilibver_str); +#else + puts(mpilibver_str); +#endif +} diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in new file mode 100644 index 000000000..793858716 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in @@ -0,0 +1,7 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: mpilibver_str + integer(kind=MPI_INTEGER_KIND) :: ierror, reslen + call MPI_GET_LIBRARY_VERSION(mpilibver_str, reslen, ierror) + print *, mpilibver_str + end program mpi_ver diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in new file mode 100644 index 000000000..a25452385 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in @@ -0,0 +1,10 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + integer(kind=kind(MPI_VERSION)), parameter :: zero = ichar('0') + character, dimension(17), parameter :: mpiver_str =& + (/ 'I', 'N', 'F', 'O', ':', 'M', 'P', 'I', '-', 'V', 'E', 'R', '[', & + char(zero + MPI_VERSION), & + '.', & + char(zero + MPI_SUBVERSION), ']' /) + print *, mpiver_str + end program mpi_ver diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.c b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.c new file mode 100644 index 000000000..b8a308a4b --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.c @@ -0,0 +1,37 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +const char mpiver_str[] = { 'I', 'N', + 'F', 'O', + ':', 'M', + 'P', 'I', + '-', 'V', + 'E', 'R', + '[', ('0' + MPI_VERSION), + '.', ('0' + MPI_SUBVERSION), + ']', '\0' }; +#endif + +int main(int argc, char* argv[]) +{ +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +#ifdef __cplusplus + std::puts(mpiver_str); +#else + puts(mpiver_str); +#endif +#endif +#ifdef TEST_MPI_MPICXX + MPI::MPI_Init(&argc, &argv); + MPI::MPI_Finalize(); +#else + MPI_Init(&argc, &argv); + MPI_Finalize(); +#endif +} diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in new file mode 100644 index 000000000..4d43a04d6 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in @@ -0,0 +1,6 @@ + program hello + @MPI_Fortran_INCLUDE_LINE@ + integer@MPI_Fortran_INTEGER_LINE@ ierror + call MPI_INIT(ierror) + call MPI_FINALIZE(ierror) + end program diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake new file mode 100644 index 000000000..67f6bd6f2 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,386 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageHandleStandardArgs +----------------------------- + +This module provides a function intended to be used in :ref:`Find Modules` +implementing :command:`find_package()` calls. It handles the +``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``. +It also sets the ``_FOUND`` variable. The package is +considered found if all variables listed contain valid results, e.g. +valid filepaths. + +.. command:: find_package_handle_standard_args + + There are two signatures:: + + find_package_handle_standard_args( + (DEFAULT_MSG|) + ... + ) + + find_package_handle_standard_args( + [FOUND_VAR ] + [REQUIRED_VARS ...] + [VERSION_VAR ] + [HANDLE_COMPONENTS] + [CONFIG_MODE] + [FAIL_MESSAGE ] + ) + + The ``_FOUND`` variable will be set to ``TRUE`` if all + the variables ``...`` are valid and any optional + constraints are satisfied, and ``FALSE`` otherwise. A success or + failure message may be displayed based on the results and on + whether the ``REQUIRED`` and/or ``QUIET`` option was given to + the :command:`find_package` call. + + The options are: + + ``(DEFAULT_MSG|)`` + In the simple signature this specifies the failure message. + Use ``DEFAULT_MSG`` to ask for a default message to be computed + (recommended). Not valid in the full signature. + + ``FOUND_VAR `` + Obsolete. Specifies either ``_FOUND`` or + ``_FOUND`` as the result variable. This exists only + for compatibility with older versions of CMake and is now ignored. + Result variables of both names are always set for compatibility. + + ``REQUIRED_VARS ...`` + Specify the variables which are required for this package. + These may be named in the generated failure message asking the + user to set the missing variable values. Therefore these should + typically be cache entries such as ``FOO_LIBRARY`` and not output + variables like ``FOO_LIBRARIES``. + + ``VERSION_VAR `` + Specify the name of a variable that holds the version of the package + that has been found. This version will be checked against the + (potentially) specified required version given to the + :command:`find_package` call, including its ``EXACT`` option. + The default messages include information about the required + version and the version which has been actually found, both + if the version is ok or not. + + ``HANDLE_COMPONENTS`` + Enable handling of package components. In this case, the command + will report which components have been found and which are missing, + and the ``_FOUND`` variable will be set to ``FALSE`` + if any of the required components (i.e. not the ones listed after + the ``OPTIONAL_COMPONENTS`` option of :command:`find_package`) are + missing. + + ``CONFIG_MODE`` + Specify that the calling find module is a wrapper around a + call to ``find_package( NO_MODULE)``. This implies + a ``VERSION_VAR`` value of ``_VERSION``. The command + will automatically check whether the package configuration file + was found. + + ``FAIL_MESSAGE `` + Specify a custom failure message instead of using the default + generated message. Not recommended. + +Example for the simple signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibXml2 DEFAULT_MSG + LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) + +The ``LibXml2`` package is considered to be found if both +``LIBXML2_LIBRARY`` and ``LIBXML2_INCLUDE_DIR`` are valid. +Then also ``LibXml2_FOUND`` is set to ``TRUE``. If it is not found +and ``REQUIRED`` was used, it fails with a +:command:`message(FATAL_ERROR)`, independent whether ``QUIET`` was +used or not. If it is found, success will be reported, including +the content of the first ````. On repeated CMake runs, +the same message will not be printed again. + +Example for the full signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibArchive + REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR + VERSION_VAR LibArchive_VERSION) + +In this case, the ``LibArchive`` package is considered to be found if +both ``LibArchive_LIBRARY`` and ``LibArchive_INCLUDE_DIR`` are valid. +Also the version of ``LibArchive`` will be checked by using the version +contained in ``LibArchive_VERSION``. Since no ``FAIL_MESSAGE`` is given, +the default messages will be printed. + +Another example for the full signature: + +.. code-block:: cmake + + find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) + find_package_handle_standard_args(Automoc4 CONFIG_MODE) + +In this case, a ``FindAutmoc4.cmake`` module wraps a call to +``find_package(Automoc4 NO_MODULE)`` and adds an additional search +directory for ``automoc4``. Then the call to +``find_package_handle_standard_args`` produces a proper success/failure +message. +#]=======================================================================] + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${_msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${_msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing:${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + string(APPEND configsText " ${filename} (version ${version})\n") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + string(APPEND configsText " Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + +# Set up the arguments for `cmake_parse_arguments`. + set(options CONFIG_MODE HANDLE_COMPONENTS) + set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + +# Check whether we are in 'simple' or 'extended' mode: + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + cmake_parse_arguments(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + endif() + +# now that we collected all arguments, process them + + if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$") + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + set(FPHSA_FOUND_${_NAME} TRUE) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(FPHSA_FOUND_${_NAME} FALSE) + string(APPEND MISSING_VARS " ${_CURRENT_VAR}") + else() + string(APPEND DETAILS "[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(FPHSA_FOUND_${_NAME}) + set(${_NAME}_FOUND TRUE) + set(${_NAME_UPPER}_FOUND TRUE) + else() + set(${_NAME}_FOUND FALSE) + set(${_NAME_UPPER}_FOUND FALSE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components: ") + endif() + string(APPEND FOUND_COMPONENTS_MSG " ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components: ") + endif() + string(APPEND MISSING_COMPONENTS_MSG " ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + string(APPEND MISSING_VARS " ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + string(APPEND DETAILS "[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + + # check with DEFINED here as the requested or found version may be "0" + if (DEFINED ${_NAME}_FIND_VERSION) + if(DEFINED ${FPHSA_VERSION_VAR}) + set(_FOUND_VERSION ${${FPHSA_VERSION_VAR}}) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + # count the dots in the version string + string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${_FOUND_VERSION}") + # add one dot because there is one dot more than there are components + string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS) + if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT) + # Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT + # is at most 4 here. Therefore a simple lookup table is used. + if (${_NAME}_FIND_VERSION_COUNT EQUAL 1) + set(_VERSION_REGEX "[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2) + set(_VERSION_REGEX "[^.]*\\.[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3) + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*") + else () + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*") + endif () + string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${_FOUND_VERSION}") + unset(_VERSION_REGEX) + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + unset(_VERSION_HEAD) + else () + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + endif () + unset(_VERSION_DOTS) + + else() # minimum version specified: + if (${_NAME}_FIND_VERSION VERSION_GREATER _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${_FOUND_VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + # Check with DEFINED as the found version may be 0. + if(DEFINED ${FPHSA_VERSION_VAR}) + set(VERSION_MSG "(found version \"${${FPHSA_VERSION_VAR}}\")") + endif() + endif () + + if(VERSION_OK) + string(APPEND DETAILS "[v${${FPHSA_VERSION_VAR}}(${${_NAME}_FIND_VERSION})]") + else() + set(${_NAME}_FOUND FALSE) + endif() + + + # print the result: + if (${_NAME}_FOUND) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_NAME}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) + set(${_NAME_UPPER}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) +endfunction() diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindPackageMessage.cmake b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindPackageMessage.cmake new file mode 100644 index 000000000..6821cee4f --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/FindPackageMessage.cmake @@ -0,0 +1,47 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindPackageMessage +# ------------------ +# +# +# +# FIND_PACKAGE_MESSAGE( "message for user" "find result details") +# +# This macro is intended to be used in FindXXX.cmake modules files. It +# will print a message once for each unique find result. This is useful +# for telling the user where a package was found. The first argument +# specifies the name (XXX) of the package. The second argument +# specifies the message to display. The third argument lists details +# about the find result so that if they change the message will be +# displayed again. The macro also obeys the QUIET argument to the +# find_package command. +# +# Example: +# +# :: +# +# if(X11_FOUND) +# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}" +# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") +# else() +# ... +# endif() + +function(FIND_PACKAGE_MESSAGE pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REPLACE "\n" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/sorc/hafs_tools.fd/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake new file mode 100644 index 000000000..dce6f9926 --- /dev/null +++ b/sorc/hafs_tools.fd/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake @@ -0,0 +1,70 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# SelectLibraryConfigurations +# --------------------------- +# +# +# +# select_library_configurations( basename ) +# +# This macro takes a library base name as an argument, and will choose +# good values for basename_LIBRARY, basename_LIBRARIES, +# basename_LIBRARY_DEBUG, and basename_LIBRARY_RELEASE depending on what +# has been found and set. If only basename_LIBRARY_RELEASE is defined, +# basename_LIBRARY will be set to the release value, and +# basename_LIBRARY_DEBUG will be set to basename_LIBRARY_DEBUG-NOTFOUND. +# If only basename_LIBRARY_DEBUG is defined, then basename_LIBRARY will +# take the debug value, and basename_LIBRARY_RELEASE will be set to +# basename_LIBRARY_RELEASE-NOTFOUND. +# +# If the generator supports configuration types, then basename_LIBRARY +# and basename_LIBRARIES will be set with debug and optimized flags +# specifying the library to be used for the given configuration. If no +# build type has been set or the generator in use does not support +# configuration types, then basename_LIBRARY and basename_LIBRARIES will +# take only the release value, or the debug value if the release one is +# not set. + +# This macro was adapted from the FindQt4 CMake module and is maintained by Will +# Dicharry . + +macro( select_library_configurations basename ) + if(NOT ${basename}_LIBRARY_RELEASE) + set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + if(NOT ${basename}_LIBRARY_DEBUG) + set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + + if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND + NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND + ( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) ) + # if the generator supports configuration types or CMAKE_BUILD_TYPE + # is set, then set optimized and debug options. + set( ${basename}_LIBRARY "" ) + foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE ) + list( APPEND ${basename}_LIBRARY optimized "${_libname}" ) + endforeach() + foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG ) + list( APPEND ${basename}_LIBRARY debug "${_libname}" ) + endforeach() + elseif( ${basename}_LIBRARY_RELEASE ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} ) + elseif( ${basename}_LIBRARY_DEBUG ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} ) + else() + set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND") + endif() + + set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" ) + + if( ${basename}_LIBRARY ) + set( ${basename}_FOUND TRUE ) + endif() + + mark_as_advanced( ${basename}_LIBRARY_RELEASE + ${basename}_LIBRARY_DEBUG + ) +endmacro() diff --git a/sorc/hafs_tools.fd/lib/.gitignore b/sorc/hafs_tools.fd/lib/.gitignore deleted file mode 100644 index efadbd837..000000000 --- a/sorc/hafs_tools.fd/lib/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# git does not allow empty directories. -# Yet, we need to add this empty directory on git. -# To achieve that, we created this .gitignore file, so that the directory will not be empty thus enabling us to commit it. -# Since we want all generated files/folders in this directory to be ignored by git, we add a rule for this. -* -# And then add an exception for this specifc file (so that we can commit it). -!.gitignore diff --git a/sorc/hafs_tools.fd/libsrc/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/CMakeLists.txt deleted file mode 100644 index 1486f4f6c..000000000 --- a/sorc/hafs_tools.fd/libsrc/CMakeLists.txt +++ /dev/null @@ -1,55 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -cmake_minimum_required (VERSION 2.6) -project (NWP_LIBS) -enable_language (Fortran C) - -# CMake build module and library directories - -set (CMAKE_Fortran_MODULE_DIRECTORY ${NWP_LIBS_SOURCE_DIR}/../include) -set (INSTALL_PATH ${NWP_LIBS_SOURCE_DIR}/../lib) - -# CMake library build instructions - -add_subdirectory (src/diagsread) -add_subdirectory (src/fson) -add_subdirectory (src/gridprojs) -add_subdirectory (src/kdtree) -add_subdirectory (src/slatec) -add_subdirectory (src/slint) -add_subdirectory (src/sondelib) -add_subdirectory (src/spherepack) -add_subdirectory (src/spline) - -# CMake directory permissions and information - -set (DIRECTORY_PERMISSIONS "OWNER_WRITE" "OWNER_READ" "OWNER_EXECUTE" "GROUP_READ" "GROUP_EXECUTE" "WORLD_READ" "WORLD_EXECUTE") -install (DIRECTORY DESTINATION ${INSTALL_PATH} DIRECTORY_PERMISSIONS ${DIRECTORY_PERMISSIONS}) diff --git a/sorc/hafs_tools.fd/libsrc/build_libs_cmake.sh b/sorc/hafs_tools.fd/libsrc/build_libs_cmake.sh deleted file mode 100755 index 722321478..000000000 --- a/sorc/hafs_tools.fd/libsrc/build_libs_cmake.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -set -ex - -cd .. -pwd=$(pwd) - -dir_root=${1:-$pwd} - -rm -rf $dir_root/libsrc/build -mkdir -p ${dir_root}/libsrc/build -cd ${dir_root}/libsrc/build -cmake ../ -make -j 8 -make install diff --git a/sorc/hafs_tools.fd/libsrc/src/diagsread/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/diagsread/CMakeLists.txt deleted file mode 100644 index 43b3b512b..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/diagsread/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/diagsread) -set (LLIBS "m") -set (TARGET "diagsread") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.F90) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/diagsread/diagsread_interface.F90 b/sorc/hafs_tools.fd/libsrc/src/diagsread/diagsread_interface.F90 deleted file mode 100644 index 901680c18..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/diagsread/diagsread_interface.F90 +++ /dev/null @@ -1,1751 +0,0 @@ -module diagsread_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! diagsread :: diagsread_interface - ! Copyright (C) 2019 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: diags_convinfo_struct - public :: diags_obsinfo_struct - public :: diags_spval - public :: diagsread_conv_count - public :: diagsread_conv_data - - ! Define local variables - - type diags_convinfo_struct - character(len=500) :: filename - integer :: nobs_dw(2) - integer :: nobs_gps(2) - integer :: nobs_ps(2) - integer :: nobs_pw(2) - integer :: nobs_q(2) - integer :: nobs_rw(2) - integer :: nobs_spd(2) - integer :: nobs_srw(2) - integer :: nobs_sst(2) - integer :: nobs_t(2) - integer :: nobs_tcp(2) - integer :: nobs_tcx(2) - integer :: nobs_tcy(2) - integer :: nobs_tcz(2) - integer :: nobs_uv(2) - integer :: idate - integer :: ntotal_obs - end type diags_convinfo_struct ! type diags_convinfo_struct - type diags_obsinfo_struct - character(len=20) :: x_type - real(r_single) :: h_x_ensmean - real(r_single) :: h_x_nobc - real(r_single) :: x_err - real(r_single) :: x_errorig - real(r_single) :: x_lat - real(r_single) :: x_lon - real(r_single) :: x_obs - real(r_single) :: x_press - real(r_single) :: x_time - integer :: x_code - end type diags_obsinfo_struct ! type diags_obsinfo_struct - character(len=8), dimension(:), allocatable :: cdiagbuf - logical :: initpass = .true. - real(r_single), dimension(:,:), allocatable :: rdiagbuf - real(r_kind), parameter :: errorlimit = 1._r_kind/sqrt(1.e9_r_kind) - real(r_kind), parameter :: errorlimit2_obs = 1._r_kind/sqrt(1.e-6_r_kind) - real(r_kind), parameter :: errorlimit2_bnd = 1.e3_r_kind*errorlimit2_obs - real(r_single), parameter :: diags_spval = huge(1.0) - integer, parameter :: diagsread_iunit = 7 - integer :: nchar - integer :: nreal - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! diagsread_conv_count.f90 - - ! DESCRIPTION: - - ! This subroutine parses a user specified GSI diag-formatted file - ! containing conventional-type observations and determines the total - ! number of observations read, the total number of observations kept - ! (e.g., those passing the error threshold tests), and the total - ! number of each conventional observation type. - - ! INPUT VARIABLES: - - ! * diags_convinfo; a FORTRAN diags_convinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_convinfo; a FORTRAN diags_convinfo_struct variable - ! containing the total number of observations read, the total - ! number of observations kept (e.g., those passing the error - ! threshold tests), and the total number of each conventional - ! observation type. - - !----------------------------------------------------------------------- - - subroutine diagsread_conv_count(diags_convinfo) - - ! Define variables passed to routine - - type(diags_convinfo_struct) :: diags_convinfo - - ! Define variables computed within routine - - character(len=3) :: obstype - real(r_kind) :: error - real(r_kind) :: errorlimit2 - real(r_kind) :: obsmax - real(r_kind) :: pres - integer :: nn(2) - integer :: ii - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - call init_convinfo(diags_convinfo) - open(diagsread_iunit,file=trim(adjustl(diags_convinfo%filename)), & - & form='unformatted') - - ! Check local variable and proceed accordingly - - if(initpass) then - - ! Define local variables - - read(diagsread_iunit) diags_convinfo%idate - initpass = .false. - - end if ! if(initpass) - - ! Define local variables - -10 continue - read(diagsread_iunit,err=20,end=30) obstype, nchar, nreal, ii - errorlimit2 = errorlimit2_obs - - ! Allocate memory for local variables - - if(.not. allocated(cdiagbuf)) allocate(cdiagbuf(ii)) - if(.not. allocated(rdiagbuf)) allocate(rdiagbuf(nreal,ii)) - - ! Define local variables - - read(diagsread_iunit) cdiagbuf(1:ii), rdiagbuf(:,1:ii) - nn = 0 - - ! Loop through local variable - - do i = 1, ii - - ! Check local variable and proceed accordingly - - if((trim(adjustl(obstype)) .eq. 'tcx') .or. & - & (trim(adjustl(obstype)) .eq. 'tcy') .or. & - & (trim(adjustl(obstype)) .eq. 'tcz')) then - - ! Define local variables - - error = rdiagbuf(6,i) - pres = rdiagbuf(4,i) - obsmax = abs(rdiagbuf(7,i)) - - else ! if((trim(adjustl(obstype)) .eq. 'tcx') - ! .or. (trim(adjustl(obstype)) .eq. 'tcy') - ! .or. (trim(adjustl(obstype)) .eq. 'tcz')) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(12,i) .lt. 0.0) cycle - if(trim(adjustl(obstype)) .eq. 'q') then - - ! Define local variables - - error = rdiagbuf(20,i)*rdiagbuf(16,i) - pres = rdiagbuf(6,i) - obsmax = abs(rdiagbuf(17,i)/rdiagbuf(20,i)) - - else ! if(trim(adjustl(obstype)) .eq. 'q') - - ! Check local variable and proceed accordingly - - if((trim(adjustl(obstype)) .eq. 'ps') .or. & - & (trim(adjustl(obstype)) .eq. 'tcp')) then - - ! Define local variables - - pres = rdiagbuf(17,i) - - else ! if((trim(adjustl(obstype)) .eq. 'ps') - ! .or. (trim(adjustl(obstype)) .eq. 'tcp')) - - ! Define local variables - - pres = rdiagbuf(6,i) - - end if ! if((trim(adjustl(obstype)) .eq. 'ps') - ! .or. (trim(adjustl(obstype)) .eq. 'tcp')) - - ! Define local variables - - error = rdiagbuf(16,i) - obsmax = abs(rdiagbuf(17,i)) - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'uv') then - - ! Define local variables - - obsmax = max(obsmax,abs(rdiagbuf(20,i))) - - end if ! if(trim(adjustl(obstype)) .eq. 'uv') - - end if ! if(trim(adjustl(obstype)) .eq. 'q') - - end if ! if((trim(adjustl(obstype)) .eq. 'tcx') - ! .or. (trim(adjustl(obstype)) .eq. 'tcy') - ! .or. (trim(adjustl(obstype)) .eq. 'tcz')) - - ! Define local variables - - nn(1) = nn(1) + 1 - - ! Check local variable and proceed accordingly - - if((error .gt. errorlimit) .and. (error .lt. errorlimit2) .and. & - & (abs(obsmax) .le. 1.e9_r_kind) .and. (pres .ge. & - & 0.001_r_kind) .and. (pres .le. 1200._r_kind)) then - - ! Define local variables - - nn(2) = nn(2) + 1 - - end if ! if((error .gt. errorlimit) .and. (error - ! .lt. errorlimit2) .and. (abs(obsmax) .le. 1.e9_r_kind) - ! .and. (pres .ge. 0.001_r_kind) .and. (pres - ! .le. 1200._r_kind)) - - end do ! do i = 1, ii - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 't') then - - ! Define local variables - - diags_convinfo%nobs_t = diags_convinfo%nobs_t + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'uv') then - - ! Define local variables - - diags_convinfo%nobs_uv = diags_convinfo%nobs_uv + 2*nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + 2*nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'ps') then - - ! Define local variables - - diags_convinfo%nobs_ps = diags_convinfo%nobs_ps + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'q') then - - ! Define local variables - - diags_convinfo%nobs_q = diags_convinfo%nobs_q + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'spd') then - - ! Define local variables - - diags_convinfo%nobs_spd = diags_convinfo%nobs_spd + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'sst') then - - ! Define local variables - - diags_convinfo%nobs_sst = diags_convinfo%nobs_sst + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'srw') then - - ! Define local variables - - diags_convinfo%nobs_srw = diags_convinfo%nobs_srw + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'rw') then - - ! Define local variables - - diags_convinfo%nobs_rw = diags_convinfo%nobs_rw + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'gps') then - - ! Define local variables - - diags_convinfo%nobs_gps = diags_convinfo%nobs_gps + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'dw') then - - ! Define local variables - - diags_convinfo%nobs_dw = diags_convinfo%nobs_dw + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'pw') then - - ! Define local variables - - diags_convinfo%nobs_pw = diags_convinfo%nobs_pw + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'tcp') then - - ! Define local variables - - diags_convinfo%nobs_tcp = diags_convinfo%nobs_tcp + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'tcx') then - - ! Define local variables - - diags_convinfo%nobs_tcx = diags_convinfo%nobs_tcx + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'tcy') then - - ! Define local variables - - diags_convinfo%nobs_tcy = diags_convinfo%nobs_tcy + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - elseif(trim(adjustl(obstype)) .eq. 'tcz') then - - ! Define local variables - - diags_convinfo%nobs_tcz = diags_convinfo%nobs_tcz + nn - diags_convinfo%ntotal_obs = diags_convinfo%ntotal_obs + nn(2) - - else ! if(trim(adjustl(obstype)) .eq. t) - - ! Define local variables - - write(6,500) trim(adjustl(obstype)) - - end if ! if(trim(adjustl(obstype)) .eq. t) - - ! Deallocate memory for local variables - - if(allocated(cdiagbuf)) deallocate(cdiagbuf) - if(allocated(rdiagbuf)) deallocate(rdiagbuf) - - ! Define local variables - - goto 10 -20 continue - write(6,501) trim(adjustl(diags_convinfo%filename)) - stop -30 continue - - ! Define local variables - - close(diagsread_iunit) - initpass = .true. -500 format('WARNING: Unknown observation type ',a,'.') -501 format('ERROR: Unable to read file ',a,'. Aborting!!!') - - !===================================================================== - - end subroutine diagsread_conv_count - - !======================================================================= - - ! SUBROUTINE: - - ! diagsread_conv_data.f90 - - ! DESCRIPTION: - - ! This subroutine reads the user specified GSI diags-formatted file - ! and returns the observation diagnostic attributes (e.g., location, - ! time, observations, etc.). - - ! INPUT VARIABLES: - - ! * diags_convinfo; a FORTRAN diags_convinfo_struct variable - ! containing (at minimum) both the GSI diags-formatted file name - ! path and the total number of observations within the respective - ! file. - - ! * diags_obsinfo; an array of FORTRAN diags_obsinfo_struct - ! variables of dimension diags_convinfo%ntotal_obs. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; an array of FORTRAN diags_obsinfo_struct - ! variables of dimension diags_convinfo%ntotal_obs containing the - ! GSI diags-formatted file information for all relevant - ! observation types. - - !----------------------------------------------------------------------- - - subroutine diagsread_conv_data(diags_convinfo,diags_obsinfo) - - ! Define variables passed to routine - - type(diags_convinfo_struct) :: diags_convinfo - type(diags_obsinfo_struct) :: diags_obsinfo(diags_convinfo%ntotal_obs) - - ! Define variables computed within routine - - character(len=3) :: obstype - logical :: qc_pass - real(r_kind) :: errorlimit2 - integer :: nobs - integer :: ii - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Loop through local variable - - do i = 1, diags_convinfo%ntotal_obs - - ! Define local variables - - call init_obsinfo(diags_obsinfo(i)) - - end do ! do i = 1, diags_convinfo%ntotal_obs - - ! Define local variables - - open(diagsread_iunit,file=trim(adjustl(diags_convinfo%filename)), & - & form='unformatted') - nobs = 0 - - ! Check local variable and proceed accordingly - - if(initpass) then - - ! Define local variables - - read(diagsread_iunit) diags_convinfo%idate - initpass = .false. - - end if ! if(initpass) - - ! Define local variables - -10 continue - read(diagsread_iunit,err=20,end=30) obstype, nchar, nreal, ii - - ! Allocate memory for local variables - - if(.not. allocated(cdiagbuf)) allocate(cdiagbuf(ii)) - if(.not. allocated(rdiagbuf)) allocate(rdiagbuf(nreal,ii)) - - ! Define local variables - - read(diagsread_iunit) cdiagbuf(1:ii), rdiagbuf(:,1:ii) - errorlimit2 = errorlimit2_obs - - ! Loop through local variable - - do i = 1, ii - - ! Define local variables - - call quality_control_check(nreal,rdiagbuf(1:nreal,i),errorlimit2, & - & qc_pass) - if(.not. qc_pass) cycle - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'dw') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_dw(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'dw') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'gps') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_gps(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'gps') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'ps') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_ps(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'ps') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'pw') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_pw(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'pw') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'q') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_q(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'q') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'rw') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_rw(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'rw') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'spd') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_spd(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'spd') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 't') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_t(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 't') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'tcp') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_tcp(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'tcp') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(obstype)) .eq. 'uv') then - - ! Define local variables - - nobs = nobs + 1 - call read_diag_u(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - nobs = nobs + 1 - call read_diag_v(nreal,cdiagbuf(i),rdiagbuf(1:nreal,i), & - & diags_obsinfo(nobs)) - - end if ! if(trim(adjustl(obstype)) .eq. 'uv') - - end do ! do i = 1, ii - - ! Deallocate memory for local variables - - if(allocated(cdiagbuf)) deallocate(cdiagbuf) - if(allocated(rdiagbuf)) deallocate(rdiagbuf) - - ! Define local variables - - goto 10 -20 continue - write(6,501) trim(adjustl(diags_convinfo%filename)) - stop -30 continue - - ! Define local variables - - close(diagsread_iunit) - initpass = .true. -500 format('WARNING: Unknown observation type ',a,'.') -501 format('ERROR: Unable to read file ',a,'. Aborting!!!') - - !===================================================================== - - end subroutine diagsread_conv_data - - !======================================================================= - - ! SUBROUTINE: - - ! init_convgrid.f90 - - ! DESCRIPTION: - - ! This subroutine initializes all variables within a user specified - ! FORTRAN diags_convinfo_struct variable. - - ! NOTE: - - ! The first element of each array is the total number of values - ! read; the second element is the total number of values kept (e.g., - ! passing the observation error quality control). - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN diags_convinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTAN diags_convinfo_struct variable where all - ! applicable variables within have been initialized. - - !----------------------------------------------------------------------- - - subroutine init_convinfo(grid) - - ! Define variables passed to routine - - type(diags_convinfo_struct) :: grid - - !===================================================================== - - ! Define local variables - - grid%nobs_dw(:) = 0 - grid%nobs_gps(:) = 0 - grid%nobs_ps(:) = 0 - grid%nobs_pw(:) = 0 - grid%nobs_q(:) = 0 - grid%nobs_rw(:) = 0 - grid%nobs_spd(:) = 0 - grid%nobs_srw(:) = 0 - grid%nobs_sst(:) = 0 - grid%nobs_t(:) = 0 - grid%nobs_tcp(:) = 0 - grid%nobs_tcx(:) = 0 - grid%nobs_tcy(:) = 0 - grid%nobs_tcz(:) = 0 - grid%nobs_uv(:) = 0 - grid%ntotal_obs = 0 - - !===================================================================== - - end subroutine init_convinfo - - !======================================================================= - - ! SUBROUTINE: - - ! init_obsinfo.f90 - - ! DESCRIPTION: - - ! This subroutine initializes all variables within a user specified - ! FORTRAN diags_obsinfo_struct variable. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTAN diags_obsinfo_struct variable where all - ! applicable variables within have been initialized. - - !----------------------------------------------------------------------- - - subroutine init_obsinfo(grid) - - ! Define variables passed to routine - - type(diags_obsinfo_struct) :: grid - - !===================================================================== - - ! Define local variables - - grid%x_type = 'XXX' - grid%x_code = -999 - grid%x_time = diags_spval - call set_missing_obsinfo(grid) - - !===================================================================== - - end subroutine init_obsinfo - - !======================================================================= - - ! SUBROUTINE: - - ! quality_control_check.f90 - - ! DESCRIPTION: - - ! This subroutine returns a FORTRAN boolean value indicating whether - ! a given GSI diag-formatted record passes the imposed quality - ! control checks. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * errorlimit2; a FORTRAN real-valued variable specifying the user - ! imposed error threshold. - - ! OUTPUT VARIABLES: - - ! * qc_pass; a FORTRAN boolean variable containing specifying - ! whether the GSI diag-formatted record passes the imposed quality - ! control checks. - - !----------------------------------------------------------------------- - - subroutine quality_control_check(nreal,rdiagbuf,errorlimit2,qc_pass) - - ! Define variables passed to routine - - logical :: qc_pass - integer :: nreal - real(r_kind) :: rdiagbuf(nreal) - real(r_kind) :: errorlimit2 - - !===================================================================== - - ! Define local variables - - qc_pass = .true. - - ! Check local variable and proceed accordingly - - if((rdiagbuf(12) .lt. 0.0) .or. (rdiagbuf(16) .lt. errorlimit) .or. & - & (rdiagbuf(16) .gt. errorlimit2) .or. (abs(rdiagbuf(17)) .gt. & - & 1.e9_r_kind) .or. (rdiagbuf(6) .lt. 0.001_r_kind) .or. & - & (rdiagbuf(6) .gt. 1200._r_kind)) then - - ! Define local variables - - qc_pass = .false. - - end if ! if((rdiagbuf(12) .lt. 0.0) .or. (rdiagbuf(16) - ! .lt. errorlimit) .or. (rdiagbuf(16) .gt. errorlimit2) - ! .or. (abs(rdiagbuf(17)) .gt. 1.e9_r_kind) - ! .or. (rdiagbuf(6) .lt. 0.001_r_kind) .or. (rdiagbuf(6) - ! .gt. 1200._r_kind)) - - !===================================================================== - - end subroutine quality_control_check - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_dw.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for Doppler wind observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_dw(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'dw' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_dw - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_gps.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for global-positioning system - ! (GPS) observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_gps(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'gps' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_gps - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_pw.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for precipital water - ! observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_pw(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'pw' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_pw - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_ps.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for surface pressure - ! observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_ps(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'ps' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(17) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_ps - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_q.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for specific humidity - ! observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_q(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'q' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = (rdiagbuf(17) - rdiagbuf(18))/ & - & rdiagbuf(20) - diags_obsinfo%x_err = (1.0/(rdiagbuf(20)*rdiagbuf(16)))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17)/rdiagbuf(20) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/(rdiagbuf(20)*rdiagbuf(14)))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_q - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_rw.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for radial wind observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_rw(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'rw' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_rw - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_spd.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for wind speed observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_spd(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'spd' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_spd - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_t.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for temperature observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_t(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 't' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(6) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_t - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_tcp.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for tropical-cyclone (TC) - ! central pressure (TCP) observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_tcp(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_type = 'ps' - diags_obsinfo%x_time = rdiagbuf(8) - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_press = rdiagbuf(17) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_tcp - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_u.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for u-wind observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_u(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_time = rdiagbuf(8) - diags_obsinfo%x_type = 'u' - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_press = rdiagbuf(6) - diags_obsinfo%x_obs = rdiagbuf(17) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%h_x_ensmean = rdiagbuf(18) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_u - - !======================================================================= - - ! SUBROUTINE: - - ! read_diag_v.f90 - - ! DESCRIPTION: - - ! This subroutine defines the observation information contained in - ! the GSI diags-formatted file record for v-wind observations. - - ! INPUT VARIABLES: - - ! * nreal; a FORTRAN integer specifying the number of observation - ! records. - - ! * cdiagbuf; a FORTRAN character string containing the GSI - ! diags-formatted file record containing the character string - ! observation information. - - ! * rdiagbuf; a FORTRAN real-valued array of dimension nreal - ! containing the GSI diags-formatted file record observation - ! statistics. - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable - ! containing the observation statistics; if the error threshold - ! values are not met, all observation statistic values are set to - ! the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine read_diag_v(nreal,cdiagbuf,rdiagbuf,diags_obsinfo) - - ! Define variables passed to routine - - integer :: nreal - type(diags_obsinfo_struct) :: diags_obsinfo - character(len=8) :: cdiagbuf - real(r_kind) :: rdiagbuf(nreal) - - !===================================================================== - - ! Define local variables - - diags_obsinfo%x_code = rdiagbuf(1) - diags_obsinfo%x_time = rdiagbuf(8) - diags_obsinfo%x_type = 'v' - call set_missing_obsinfo(diags_obsinfo) - diags_obsinfo%x_lat = rdiagbuf(3) - diags_obsinfo%x_lon = rdiagbuf(4) - diags_obsinfo%x_press = rdiagbuf(6) - diags_obsinfo%x_obs = rdiagbuf(20) - diags_obsinfo%x_err = (1.0/rdiagbuf(16))**2.0 - diags_obsinfo%h_x_ensmean = rdiagbuf(21) - - ! Check local variable and proceed accordingly - - if(rdiagbuf(14) .gt. 1.e-5_r_kind) then - - ! Define local variables - - diags_obsinfo%x_errorig = (1.0/rdiagbuf(14))**2.0 - - else ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - ! Define local variables - - diags_obsinfo%x_errorig = 1.e10_r_kind - - end if ! if(rdiagbuf(14) .gt. 1.e-5_r_kind) - - !===================================================================== - - end subroutine read_diag_v - - !======================================================================= - - ! SUBROUTINE: - - ! set_missing_obsinfo.f90 - - ! DESCRIPTION: - - ! This subroutine sets all observation statistic values within the - ! FORTRAN diags_obsinfo_struct variable to the diags_spval value. - - ! INPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable. - - ! OUTPUT VARIABLES: - - ! * diags_obsinfo; a FORTRAN diags_obsinfo_struct variable with all - ! observation statistic values set to the diags_spval value. - - !----------------------------------------------------------------------- - - subroutine set_missing_obsinfo(diags_obsinfo) - - ! Define variables passed to routine - - type(diags_obsinfo_struct) :: diags_obsinfo - - !===================================================================== - - ! Define local variables - - diags_obsinfo%h_x_ensmean = diags_spval - diags_obsinfo%h_x_nobc = diags_spval - diags_obsinfo%x_err = diags_spval - diags_obsinfo%x_errorig = diags_spval - diags_obsinfo%x_lat = diags_spval - diags_obsinfo%x_lon = diags_spval - diags_obsinfo%x_obs = diags_spval - diags_obsinfo%x_press = diags_spval - - !===================================================================== - - end subroutine set_missing_obsinfo - - !======================================================================= - -end module diagsread_interface diff --git a/sorc/hafs_tools.fd/libsrc/src/diagsread/kinds_interface.F90 b/sorc/hafs_tools.fd/libsrc/src/diagsread/kinds_interface.F90 deleted file mode 100644 index 47bf002ce..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/diagsread/kinds_interface.F90 +++ /dev/null @@ -1,119 +0,0 @@ -module kinds_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! diagsread :: kinds_interface - ! Copyright (C) 2019 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: default_integer - public :: default_real - public :: i_byte - public :: i_kind - public :: i_llong - public :: i_long - public :: i_short - public :: num_bytes_for_i_byte - public :: num_bytes_for_i_kind - public :: num_bytes_for_i_llong - public :: num_bytes_for_i_long - public :: num_bytes_for_i_short - public :: num_bytes_for_r_double - public :: num_bytes_for_r_quad - public :: num_bytes_for_r_kind - public :: num_bytes_for_r_single - public :: r_double - public :: r_kind - public :: r_quad - public :: r_single - - !----------------------------------------------------------------------- - - ! Define local variables - - integer, parameter :: & - & default_integer = 3 - integer, parameter :: & - & default_real = 1 - integer, parameter :: & - & llong_t = selected_int_kind(16) - integer, parameter :: & - & num_bytes_for_i_byte = 1 - integer, parameter :: & - & num_bytes_for_i_short = 2 - integer, parameter :: & - & num_bytes_for_i_long = 4 - integer, parameter :: & - & num_bytes_for_i_llong = 8 - integer, parameter :: & - & num_i_kinds = 4 - integer, dimension(num_i_kinds), parameter :: & - & integer_byte_sizes = & - & (/num_bytes_for_i_byte,num_bytes_for_i_short, & - & num_bytes_for_i_long,num_bytes_for_i_llong/) - integer, parameter :: & - & num_bytes_for_i_kind = integer_byte_sizes(default_integer) - integer, parameter :: & - & i_byte = selected_int_kind(1) - integer, parameter :: & - & i_short = selected_int_kind(4) - integer, parameter :: & - & i_long = selected_int_kind(8) - integer, parameter :: & - & i_llong = max(llong_t,i_long) - integer, dimension(num_i_kinds), parameter :: & - & integer_types = (/i_byte,i_short,i_long,i_llong/) - integer, parameter :: & - & i_kind = integer_byte_sizes(default_integer) - integer, parameter :: & - & num_r_kinds = 3 - integer, parameter :: & - & r_single = selected_real_kind(6) - integer, parameter :: & - & r_double = selected_real_kind(15) - integer, parameter :: & - & quad_t = selected_real_kind(20) - integer, parameter :: & - & r_quad = max(quad_t,r_double) - integer, parameter :: & - & num_bytes_for_r_single = 4 - integer, parameter :: & - & num_bytes_for_r_double = 8 - integer, parameter :: & - & num_bytes_for_r_quad = 16 - integer, dimension(num_r_kinds), parameter :: & - & real_kinds = (/r_single,r_double,r_quad/) - integer, dimension(num_r_kinds), parameter :: & - & real_byte_sizes = (/num_bytes_for_r_single, & - & num_bytes_for_r_double,num_bytes_for_r_quad/) - integer, parameter :: & - & r_kind = real_kinds(default_real) - integer, parameter :: & - & num_bytes_for_r_kind = real_byte_sizes(default_real) - - !======================================================================= - -end module kinds_interface diff --git a/sorc/hafs_tools.fd/libsrc/src/fson/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/fson/CMakeLists.txt deleted file mode 100644 index 16d549828..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/fson/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/fson) -set (LLIBS "m") -set (TARGET "fson") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.f90) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/gridprojs/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/gridprojs/CMakeLists.txt deleted file mode 100644 index b243b7955..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/gridprojs/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/gridprojs) -set (LLIBS "m") -set (TARGET "gridprojs") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.F90 *.f) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/kdtree/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/kdtree/CMakeLists.txt deleted file mode 100644 index b357c57a0..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/kdtree/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/kdtree) -set (LLIBS "m") -set (TARGET "kdtree") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.F90) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/slatec/CMakeLists.txt deleted file mode 100644 index ca33f6bf6..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/slatec/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/slatec) -set (LLIBS "m") -set (TARGET "slatec") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.f) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/slint/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/slint/CMakeLists.txt deleted file mode 100644 index 8ddf5af7d..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/slint/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/slint) -set (LLIBS "m") -set (TARGET "slint") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.F90) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/sondelib/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/sondelib/CMakeLists.txt deleted file mode 100644 index 26ab59744..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/sondelib/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/sondelib) -set (LLIBS "m") -set (TARGET "sondelib") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.F90 *.f) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/spherepack/CMakeLists.txt deleted file mode 100644 index 80b45498c..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/spherepack) -set (LLIBS "m") -set (TARGET "spherepack") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.f90 *.f) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/advec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/advec.f deleted file mode 100755 index f09b2f7f4..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/advec.f +++ /dev/null @@ -1,410 +0,0 @@ -c -c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -c . . -c . copyright (c) 1998 by UCAR . -c . . -c . University Corporation for Atmospheric Research . -c . . -c . all rights reserved . -c . . -c . . -c . SPHEREPACK . -c . . -c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -c -c -c -c ... file advec.f -c -c program advec solves the time-dependent linear advection -c equation for geopotential phi using the SPHEREPACK software -c -c d(phi)/dt = -(u,v) DOT gradient(phi) -c -c = -(u*gdphl + v*gdpht) -c -c ... required files -c -c gradgc.f,shagc.f,shsgc.f,vhsgc.f,sphcom.f hrfft.f,gaqd.f -c -c -c definitions: -c -c -c nlat number of gaussian latitudes excluding poles -c nlon number of distinct longitudes -c omega rotation rate of earth in radians per second -c alpha angle between axis of rotation and the coordinate -c axis -c beta latitude of the cosine bell -c aa radius of earth in meters -c ncycle cycle number -c time model time in seconds -c dt time step -c lambda longitude -c theta latitude -c -c the first dimension of the following two dimensional arrays -c corresponds to the latitude index with values i=1,...,nlat -c where i=1 is the northern most gaussian point thetag(i) -c and i=nlat is the southern most gaussian point thetag(nlat). -c the second dimension is longitude with values j=1,...,nlon -c where j=1 corresponds to zero longitude and j=nlon corresponds -c to 2pi minus 2pi/nlon. -c -c -c thetag(i) vector of gaussian points on the full sphere which -c have north to south orientation as i=1,...,nlat -c -c u(i,j) east longitudinal velocity component -c v(i,j) latitudinal velocity component -c -c phi(i,j) the geopotential at t = time -c -c phnew(i,j) the geopotential at t=time+dt -c -c phold(i,j) the geopotential at t=time-dt -c -c gdphl(i,j) the longitudinal derivative component of -c the gradient of phi -c -c gdphl = 1/(cos(theta))*d(phi)/dlambda - -c -c gdpht(i,j) the latitudinal derivative component of -c the gradient of phi -c -c gdpht = d(phi)/dtheta - -c -c the following two dimensional arrays are nonzero in the triangle -c n=1,...,nlat and m less than or equal to n. -c -c ar(m,n),br(m,n) spectral coefficients of phi -c - program advec -c -c set grid size with parameter statements -c - integer nnlat,nnlon,nn15,llwork,lldwork,llvhsgc,llshagc - integer nlat,nlon,lwork,ldwork,lvhsgc,lshagc - -c parameter (nnlat=12,nnlon=23,ddt=1200.) - parameter (nnlat=23,nnlon=45,ddt=600.) -c parameter (nnlat=45,nnlon=90,ddt=300.) -c -c set saved and unsaved work space lengths in terms of nnlat,nnlon -c (see documentation for shagc,vhsgc,vhsgci,gradgc for estimates) -c - parameter (nn15=nnlon+15) - parameter(llwork=4*nnlat*nnlon+2*nnlat*(nnlat+1)) - parameter (lldwork = 2*nnlat*(nnlat+1)+1 ) - parameter (llvhsgc = 7*nnlat*nnlat+nnlon+15) - parameter (llshagc = 5*nnlat*nnlat + nnlon+15) -c -c dimension arrays -c - real u(nnlat,nnlon),v(nnlat,nnlon) - real phold(nnlat,nnlon),phnew(nnlat,nnlon),phi(nnlat,nnlon) - real pexact(nnlat,nnlon) - real dpdt(nnlat,nnlon) - real gdphl(nnlat,nnlon),gdpht(nnlat,nnlon), work(llwork) - double precision dwork(lldwork) - real wshagc(llshagc),wvhsgc(llvhsgc),wshsgc(llshagc) - real ar(nnlat,nnlat),br(nnlat,nnlat) - real thetag(nnlat),colat(nnlat) - double precision dtheta(nnlat),dwts(nnlat) -c -c set constants -c - pi = 4.0*atan(1.0) - omega = (pi+pi)/(12.*24.*3600.) - p0 = 1000. - re = 1.0/3.0 - hzero = 1000. - alphad = 60. - alpha = pi*alphad/180. - beta = pi/6. -c -c set one array and no equatorial symmetry -c - nt = 1 - isym = 0 -c -c set time step depending on resolution -c - dt = ddt - tdt = dt+dt -c -c set work space length arguments -c - lwork = llwork - ldwork = lldwork - lshagc = llshagc - lvhsgc = llvhsgc -c -c set grid size arguments -c - nlat = nnlat - nlon = nnlon -c -c compute nlat latitudinal gaussian points in thetag with -c north to south orientation using gaqd from SPHEREPACK -c - call gaqd(nlat,dtheta,dwts,DWORK,ldwork,ier) - do i=1,nlat - thetag(i) = 0.5*pi- dtheta(i) - colat(i) = dtheta(i) - end do -c -c preset saved work spaces for gradgc and shagc and shsgc -c - call vhsgci(nlat,nlon,wvhsgc,lvhsgc,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,10) ierror - 10 format(' error in vsgci = ',i5) - call shagci(nlat,nlon,wshagc,lshagc,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,20) ierror - 20 format(' error in shagci = ',i5) - call shsgci(nlat,nlon,wshsgc,lshagc,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,21) ierror - 21 format(' error in shsgci = ',i5) -c -c set vector velocities and cosine bell in geopotential -c - ca = cos(alpha) - sa = sin(alpha) - dlon = (pi+pi)/nlon - do j=1,nlon - xlm = (j-1)*dlon - sl = sin(xlm) - cl = cos(xlm) - do i=1,nlat - st = cos(colat(i)) - ct = sin(colat(I)) - sth = ca*st+sa*ct*cl - cthclh = ca*ct*cl-sa*st - cthslh = ct*sl - xlhat = atanxy(cthclh,cthslh) - clh = cos(xlhat) - slh = sin(xlhat) - cth = clh*cthclh+slh*cthslh - uhat = omega*cth - u(i,j) = (ca*sl*slh+cl*clh)*uhat - v(i,j) = (ca*st*cl*slh-st*sl*clh+sa*ct*slh)*uhat - end do - end do -c -c compute geopotential at t=-dt in phold and at t=0.0 in phi -c to start up leapfrog scheme -c - call gpot(-dt,alpha,beta,omega,hzero,re,nlat,nlon, - + nlat,colat,phold) - call gpot(0.,alpha,beta,omega,hzero,re,nlat,nlon, - + nlat,colat,phi) -c -c smooth geopotential at t=-dt and t=0. by synthesizing after analysis -c - call shagc(nlat,nlon,isym,nt,phold,nlat,nlon,ar,br,nlat, - + nlat,wshagc,lshagc,work,lwork,ierror) - if (ierror .ne.0) write(*,26) ierror - call shsgc(nlat,nlon,isym,nt,phold,nlat,nlon,ar,br,nlat, - + nlat,wshsgc,lshagc,work,lwork,ierror) - if (ierror .ne.0) write(*,28) ierror - call shagc(nlat,nlon,isym,nt,phi,nlat,nlon,ar,br,nlat, - + nlat,wshagc,lshagc,work,lwork,ierror) - if (ierror .ne.0) write(*,26) ierror - call shsgc(nlat,nlon,isym,nt,phi,nlat,nlon,ar,br,nlat, - + nlat,wshsgc,lshagc,work,lwork,ierror) - if (ierror .ne.0) write(*,28) ierror - 28 format(' ierror in shsgc = ',i5) -c -c compute l2 and max norms of geopotential at t=0. -c - p2 = 0.0 - pmax = 0.0 - do j=1,nlon - do i=1,nlat - pmax = amax1(abs(phi(i,j)),pmax) - p2 = p2 + phi(i,j)**2 - end do - end do - p2 = sqrt(p2) -c -c set number of time steps for 12 days -c (time to circumvent the earth) -c - ntime = int((12.*24.*3600.)/dt+0.5) - mprint = ntime/12 - time = 0.0 - ncycle = 0 - do k=1,ntime+1 -c -c compute harmonic coefficients for phi at current time -c - call shagc(nlat,nlon,isym,nt,phi,nlat,nlon,ar,br,nlat, - + nlat,wshagc,lshagc,work,lwork,ierror) - if (ierror .ne.0) write(*,26) ierror - 26 format(' ierror in shagc = ',i5) -c -c compute gradient of phi at current time -c - call gradgc(nlat,nlon,isym,nt,gdpht,gdphl,nlat,nlon,ar,br, - + nlat,nlat,wvhsgc,lvhsgc,work,lwork,ierror) - if (ierror .ne.0) write(*,27) ierror - 27 format(' ierror in gradgc = ',i5) -c -c compute the time derivative of phi, note that the sign -c of the last term is positive because the gradient is -C computed with respect to colatitude rather than latitude. -c - do j=1,nlon - do i=1,nlat - dpdt(i,j) = -u(i,j)*gdphl(i,j) + v(i,j)*gdpht(i,j) - end do - end do -c - if (mod(ncycle,mprint) .eq. 0) then -c -c write variables -c - err2 = 0.0 - errm = 0.0 - call gpot(time,alpha,beta,omega,hzero,re,nlat,nlon,nlat, - + colat,pexact) - do j=1,nlon - do i=1,nlat - err2 = err2 + (pexact(i,j)-phi(i,j))**2 - errm = amax1(abs(pexact(i,j)-phi(i,j)),errm) - end do - end do - errm = errm/pmax - err2 = sqrt(err2)/p2 - htime = time/3600. - write(*,390) ncycle,htime,dt,nlat,nlon,omega,hzero, - 1 alphad,errm,err2 - 390 format(//' advecting cosine bell, test case 2',/ - 1 ,' cycle number ',i10 - 2 ,' model time in hours ',f10.2/ - 3 ,' time step in seconds ',f10.0 - 4 ,' number of latitudes ',i10/ - 5 ,' number of longitudes ',i10 - 6 ,' rotation rate ',1pe15.6/ - 7 ,' mean height ',1pe15.6 - 8 ,' tilt angle ',0pf10.2/ - 9 ,' max geopot. error ',1pe15.6 - 1 ,' RMS geopot. error ',1pe15.6) - - end if - time = time + dt - ncycle = ncycle+1 -c -c update phold,phi for next time step -c - do j=1,nlon - do i=1,nlat - phnew(i,j) = phold(i,j) + tdt*dpdt(i,j) - phold(i,j) = phi(i,j) - phi(i,j) = phnew(i,j) - end do - end do -c -c end of time loop -c - end do - end - subroutine gpot(t,alpha,beta,omega,hzero,re,nlat,nlon,idim, - + colat,h) -c -c computes advecting cosine bell on a tilted grid a time t. -c -c input parameters -c -c t time in seconds -c -c alpha tilt angle in radians -c -c beta colatitude of cosine bell in untilted coordinate -c system in radians -c -c omega angular velocity in radians per second -c -c hzero maximum value of cosine bell -c -c re radius of support for cosine bell in radians -c -c nlat number of latitudes including the poles -c -c nlon number of distinct longitude lines -c -c idim first dimension of output array h -c -c colat vector of Gauss colatitude grid points -c -c output parameter -c -c h an nlat by nlon array containing the geopotential -c -c on a tilted grid -c - dimension h(idim,nlon),colat(nlat) - real lambda,lambdc,lhat - lambdc = omega*t - call stoc(1.,beta,lambdc,xc,yc,zc) - ca = cos(alpha) - sa = sin(alpha) - pi = 4.*atan(1.) - tpi = pi+pi - dlon = tpi/nlon - do 10 j=1,nlon - lambda = (j-1)*dlon - cl = cos(lambda) - sl = sin(lambda) - do 10 i=1,nlat - theta = colat(i) - st = cos(theta) - ct = sin(theta) - sth = ca*st+sa*ct*cl - cthclh = ca*ct*cl-sa*st - cthslh = ct*sl - lhat = atanxy(cthclh,cthslh) - clh = cos(lhat) - slh = sin(lhat) - cth = clh*cthclh+slh*cthslh - that = atanxy(sth,cth) - call stoc(1.,that,lhat,x1,y1,z1) - dist = sqrt((x1-xc)**2+(y1-yc)**2 - 1 +(z1-zc)**2) - h(i,j) = 0. - if(dist .ge. re) go to 10 - r = 2.*asin(dist/2.) - if(r .ge. re) go to 10 - h(i,j) = hzero*.5*(cos(r*pi/re)+1.) - 10 continue - return - end - function atanxy(x,y) - atanxy = 0. - if(x.eq.0. .and. y.eq.0.) return - atanxy = atan2(y,x) - return - end - subroutine ctos(x,y,z,r,theta,phi) - r1 = x*x+y*y - if(r1 .ne. 0.) go to 10 - phi = 0. - theta = 0. - if(z .lt. 0.) theta = 4.*atan(1.) - return - 10 r = sqrt(r1+z*z) - r1 = sqrt(r1) - phi = atan2(y,x) - theta = atan2(r1,z) - return - end - subroutine stoc(r,theta,phi,x,y,z) - st = sin(theta) - x = r*st*cos(phi) - y = r*st*sin(phi) - z = r*cos(theta) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/alf.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/alf.f deleted file mode 100755 index 9d46b60d9..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/alf.f +++ /dev/null @@ -1,698 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c file alf.f contains subroutines alfk,lfim,lfim1,lfin,lfin1,lfpt -c for computing normalized associated legendre polynomials -c -c subroutine alfk (n,m,cp) -c -c dimension of real cp(n/2 + 1) -c arguments -c -c purpose routine alfk computes single precision fourier -c coefficients in the trigonometric series -c representation of the normalized associated -c legendre function pbar(n,m,theta) for use by -c routines lfp and lfpt in calculating single -c precision pbar(n,m,theta). -c -c first define the normalized associated -c legendre functions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative of -c (x**2-1)**n with respect to x=cos(theta) -c -c where theta is colatitude. -c -c then subroutine alfk computes the coefficients -c cp(k) in the following trigonometric -c expansion of pbar(m,n,theta). -c -c 1) for n even and m even, pbar(m,n,theta) = -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k+1)*cos(2*k*th) -c -c 2) for n even and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*th) -c -c 3) for n odd and m even, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*th) -c -c 4) for n odd and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*th) -c -c -c usage call alfk(n,m,cp) -c -c arguments -c -c on input n -c nonnegative integer specifying the degree of -c pbar(n,m,theta) -c -c m -c is the order of pbar(n,m,theta). m can be -c any integer however cp is computed such that -c pbar(n,m,theta) = 0 if abs(m) is greater -c than n and pbar(n,m,theta) = (-1)**m* -c pbar(n,-m,theta) for negative m. -c -c on output cp -c single precision array of length (n/2)+1 -c which contains the fourier coefficients in -c the trigonometric series representation of -c pbar(n,m,theta) -c -c -c special conditions none -c -c precision single -c -c algorithm the highest order coefficient is determined in -c closed form and the remainig coefficients are -c determined as the solution of a backward -c recurrence relation. -c -c accuracy comparison between routines alfk and double -c precision dalfk on the cray1 indicates -c greater accuracy for smaller values -c of input parameter n. agreement to 14 -c places was obtained for n=10 and to 13 -c places for n=100. -c - subroutine alfk (n,m,cp) - dimension cp(n/2+1) - parameter (sc10=1024.) - parameter (sc20=sc10*sc10) - parameter (sc40=sc20*sc20) -c - cp(1) = 0. - ma = iabs(m) - if(ma .gt. n) return - if(n-1) 2,3,5 - 2 cp(1) = sqrt(2.) - return - 3 if(ma .ne. 0) go to 4 - cp(1) = sqrt(1.5) - return - 4 cp(1) = sqrt(.75) - if(m .eq. -1) cp(1) = -cp(1) - return - 5 if(mod(n+ma,2) .ne. 0) go to 10 - nmms2 = (n-ma)/2 - fnum = n+ma+1 - fnmh = n-ma+1 - pm1 = 1. - go to 15 - 10 nmms2 = (n-ma-1)/2 - fnum = n+ma+2 - fnmh = n-ma+2 - pm1 = -1. - 15 t1 = 1./sc20 - nex = 20 - fden = 2. - if(nmms2 .lt. 1) go to 20 - do 18 i=1,nmms2 - t1 = fnum*t1/fden - if(t1 .gt. sc20) then - t1 = t1/sc40 - nex = nex+40 - end if - fnum = fnum+2. - fden = fden+2. - 18 continue - 20 t1 = t1/2.**(n-1-nex) - if(mod(ma/2,2) .ne. 0) t1 = -t1 - t2 = 1. - if(ma .eq. 0) go to 26 - do 25 i=1,ma - t2 = fnmh*t2/(fnmh+pm1) - fnmh = fnmh+2. - 25 continue - 26 cp2 = t1*sqrt((n+.5)*t2) - fnnp1 = n*(n+1) - fnmsq = fnnp1-2.*ma*ma - l = (n+1)/2 - if(mod(n,2) .eq. 0 .and. mod(ma,2) .eq. 0) l = l+1 - cp(l) = cp2 - if(m .ge. 0) go to 29 - if(mod(ma,2) .ne. 0) cp(l) = -cp(l) - 29 if(l .le. 1) return - fk = n - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = 2.*(fk*fk-fnmsq) - cp(l-1) = b1*cp(l)/a1 - 30 l = l-1 - if(l .le. 1) return - fk = fk-2. - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = -2.*(fk*fk-fnmsq) - c1 = (fk+1.)*(fk+2.)-fnnp1 - cp(l-1) = -(b1*cp(l)+c1*cp(l+1))/a1 - go to 30 - end -c subroutine lfim (init,theta,l,n,nm,pb,id,wlfim) -c -c dimension of theta(l), pb(id,nm+1), wlfim(4*l*(nm+1)) -c arguments -c -c purpose given n and l, routine lfim calculates -c the normalized associated legendre functions -c pbar(n,m,theta) for m=0,...,n and theta(i) -c for i=1,...,l where -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative of -c (x**2-1)**n with respect to x=cos(theta) -c -c usage call lfim (init,theta,l,n,nm,pb,id,wlfim) -c -c arguments -c on input init -c = 0 -c initialization only - using parameters -c l, nm and array theta, subroutine lfim -c initializes array wlfim for subsequent -c use in the computation of the associated -c legendre functions pb. initialization -c does not have to be repeated unless -c l, nm, or array theta are changed. -c = 1 -c subroutine lfim uses the array wlfim that -c was computed with init = 0 to compute pb. -c -c theta -c an array that contains the colatitudes -c at which the associated legendre functions -c will be computed. the colatitudes must be -c specified in radians. -c -c l -c the length of the theta array. lfim is -c vectorized with vector length l. -c -c n -c nonnegative integer, less than nm, specifying -c degree of pbar(n,m,theta). subroutine lfim -c must be called starting with n=0. n must be -c incremented by one in subsequent calls and -c must not exceed nm. -c -c nm -c the maximum value of n and m -c -c id -c the first dimension of the two dimensional -c array pb as it appears in the program that -c calls lfim. (see output parameter pb) -c -c wlfim -c an array with length 4*l*(nm+1) which -c must be initialized by calling lfim -c with init=0 (see parameter init) it -c must not be altered between calls to -c lfim. -c -c -c on output pb -c a two dimensional array with first -c dimension id in the program that calls -c lfim. the second dimension of pb must -c be at least nm+1. starting with n=0 -c lfim is called repeatedly with n being -c increased by one between calls. on each -c call, subroutine lfim computes -c = pbar(m,n,theta(i)) for m=0,...,n and -c i=1,...l. -c -c wlfim -c array containing values which must not -c be altered unless l, nm or the array theta -c are changed in which case lfim must be -c called with init=0 to reinitialize the -c wlfim array. -c -c special conditions n must be increased by one between calls -c of lfim in which n is not zero. -c -c precision single -c -c -c algorithm routine lfim calculates pbar(n,m,theta) using -c a four term recurrence relation. (unpublished -c notes by paul n. swarztrauber) -c - subroutine lfim (init,theta,l,n,nm,pb,id,wlfim) - dimension pb(1) ,wlfim(1) -c -c total length of wlfim is 4*l*(nm+1) -c - lnx = l*(nm+1) - iw1 = lnx+1 - iw2 = iw1+lnx - iw3 = iw2+lnx - call lfim1(init,theta,l,n,nm,id,pb,wlfim,wlfim(iw1), - 1 wlfim(iw2),wlfim(iw3),wlfim(iw2)) - return - end - subroutine lfim1(init,theta,l,n,nm,id,p3,phz,ph1,p1,p2,cp) - dimension p1(l,*) ,p2(l,*) ,p3(id,*) ,phz(l,*) , - 1 ph1(l,*) ,cp(*) ,theta(*) - nmp1 = nm+1 - if(init .ne. 0) go to 5 - ssqrt2 = 1./sqrt(2.) - do 10 i=1,l - phz(i,1) = ssqrt2 - 10 continue - do 15 np1=2,nmp1 - nh = np1-1 - call alfk(nh,0,cp) - do 16 i=1,l - call lfpt(nh,0,theta(i),cp,phz(i,np1)) - 16 continue - call alfk(nh,1,cp) - do 17 i=1,l - call lfpt(nh,1,theta(i),cp,ph1(i,np1)) - 17 continue - 15 continue - return - 5 if(n .gt. 2) go to 60 - if(n-1)25,30,35 - 25 do 45 i=1,l - p3(i,1)=phz(i,1) - 45 continue - return - 30 do 50 i=1,l - p3(i,1) = phz(i,2) - p3(i,2) = ph1(i,2) - 50 continue - return - 35 sq5s6 = sqrt(5./6.) - sq1s6 = sqrt(1./6.) - do 55 i=1,l - p3(i,1) = phz(i,3) - p3(i,2) = ph1(i,3) - p3(i,3) = sq5s6*phz(i,1)-sq1s6*p3(i,1) - p1(i,1) = phz(i,2) - p1(i,2) = ph1(i,2) - p2(i,1) = phz(i,3) - p2(i,2) = ph1(i,3) - p2(i,3) = p3(i,3) - 55 continue - return - 60 nm1 = n-1 - np1 = n+1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - do 65 i=1,l - p3(i,1) = phz(i,np1) - p3(i,2) = ph1(i,np1) - 65 continue - if(nm1 .lt. 3) go to 71 - do 70 mp1=3,nm1 - m = mp1-1 - fm = float(m) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - dd = sqrt(cn*fnmm*(fnmm-1.)/temp) - ee = sqrt((fnmm+1.)*(fnmm+2.)/temp) - do 70 i=1,l - p3(i,mp1) = cc*p1(i,mp1-2)+dd*p1(i,mp1)-ee*p3(i,mp1-2) - 70 continue - 71 fnpm = fn+fn-1. - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - ee = sqrt(6./temp) - do 75 i=1,l - p3(i,n) = cc*p1(i,n-2)-ee*p3(i,n-2) - 75 continue - fnpm = fn+fn - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - ee = sqrt(2./temp) - do 80 i=1,l - p3(i,n+1) = cc*p1(i,n-1)-ee*p3(i,n-1) - 80 continue - do 90 mp1=1,np1 - do 90 i=1,l - p1(i,mp1) = p2(i,mp1) - p2(i,mp1) = p3(i,mp1) - 90 continue - return - end -c subroutine lfin (init,theta,l,m,nm,pb,id,wlfin) -c -c dimension of theta(l), pb(id,nm+1), wlfin(4*l*(nm+1)) -c arguments -c -c purpose given m and l, routine lfin calculates -c the normalized associated legendre functions -c pbar(n,m,theta) for n=m,...,nm and theta(i) -c for i=1,...,l where -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative of -c (x**2-1)**n with respect to x=cos(theta) -c -c usage call lfin (init,theta,l,m,nm,pb,id,wlfin) -c -c arguments -c on input init -c = 0 -c initialization only - using parameters -c l, nm and the array theta, subroutine lfin -c initializes the array wlfin for subsequent -c use in the computation of the associated -c legendre functions pb. initialization does -c not have to be repeated unless l, nm or -c the array theta are changed. -c = 1 -c subroutine lfin uses the array wlfin that -c was computed with init = 0 to compute pb -c -c theta -c an array that contains the colatitudes -c at which the associated legendre functions -c will be computed. the colatitudes must be -c specified in radians. -c -c l -c the length of the theta array. lfin is -c vectorized with vector length l. -c -c m -c nonnegative integer, less than nm, specifying -c degree of pbar(n,m,theta). subroutine lfin -c must be called starting with n=0. n must be -c incremented by one in subsequent calls and -c must not exceed nm. -c -c nm -c the maximum value of n and m -c -c id -c the first dimension of the two dimensional -c array pb as it appears in the program that -c calls lfin. (see output parameter pb) -c -c wlfin -c an array with length 4*l*(nm+1) which -c must be initialized by calling lfin -c with init=0 (see parameter init) it -c must not be altered between calls to -c lfin. -c -c -c on output pb -c a two dimensional array with first -c dimension id in the program that calls -c lfin. the second dimension of pb must -c be at least nm+1. starting with m=0 -c lfin is called repeatedly with m being -c increased by one between calls. on each -c call, subroutine lfin computes pb(i,n+1) -c = pbar(m,n,theta(i)) for n=m,...,nm and -c i=1,...l. -c -c wlfin -c array containing values which must not -c be altered unless l, nm or the array theta -c are changed in which case lfin must be -c called with init=0 to reinitialize the -c wlfin array. -c -c special conditions m must be increased by one between calls -c of lfin in which m is not zero. -c -c precision single -c -c algorithm routine lfin calculates pbar(n,m,theta) using -c a four term recurrence relation. (unpublished -c notes by paul n. swarztrauber) -c - subroutine lfin (init,theta,l,m,nm,pb,id,wlfin) - dimension pb(1) ,wlfin(1) -c -c total length of wlfin is 4*l*(nm+1) -c - lnx = l*(nm+1) - iw1 = lnx+1 - iw2 = iw1+lnx - iw3 = iw2+lnx - call lfin1(init,theta,l,m,nm,id,pb,wlfin,wlfin(iw1), - 1 wlfin(iw2),wlfin(iw3),wlfin(iw2)) - return - end - subroutine lfin1(init,theta,l,m,nm,id,p3,phz,ph1,p1,p2,cp) - dimension p1(l,1) ,p2(l,1) ,p3(id,1) ,phz(l,1) , - 1 ph1(l,1) ,cp(1) ,theta(1) - nmp1 = nm+1 - if(init .ne. 0) go to 5 - ssqrt2 = 1./sqrt(2.) - do 10 i=1,l - phz(i,1) = ssqrt2 - 10 continue - do 15 np1=2,nmp1 - nh = np1-1 - call alfk(nh,0,cp) - do 16 i=1,l - call lfpt(nh,0,theta(i),cp,phz(i,np1)) - 16 continue - call alfk(nh,1,cp) - do 17 i=1,l - call lfpt(nh,1,theta(i),cp,ph1(i,np1)) - 17 continue - 15 continue - return - 5 mp1 = m+1 - fm = float(m) - tm = fm+fm - if(m-1)25,30,35 - 25 do 45 np1=1,nmp1 - do 45 i=1,l - p3(i,np1) = phz(i,np1) - p1(i,np1) = phz(i,np1) - 45 continue - return - 30 do 50 np1=2,nmp1 - do 50 i=1,l - p3(i,np1) = ph1(i,np1) - p2(i,np1) = ph1(i,np1) - 50 continue - return - 35 temp = tm*(tm-1.) - cc = sqrt((tm+1.)*(tm-2.)/temp) - ee = sqrt(2./temp) - do 85 i=1,l - p3(i,m+1) = cc*p1(i,m-1)-ee*p1(i,m+1) - 85 continue - if(m .eq. nm) return - temp = tm*(tm+1.) - cc = sqrt((tm+3.)*(tm-2.)/temp) - ee = sqrt(6./temp) - do 70 i=1,l - p3(i,m+2) = cc*p1(i,m)-ee*p1(i,m+2) - 70 continue - mp3 = m+3 - if(nmp1 .lt. mp3) go to 80 - do 75 np1=mp3,nmp1 - n = np1-1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - dd = sqrt(cn*fnmm*(fnmm-1.)/temp) - ee = sqrt((fnmm+1.)*(fnmm+2.)/temp) - do 75 i=1,l - p3(i,np1) = cc*p1(i,np1-2)+dd*p3(i,np1-2)-ee*p1(i,np1) - 75 continue - 80 do 90 np1=m,nmp1 - do 90 i=1,l - p1(i,np1) = p2(i,np1) - p2(i,np1) = p3(i,np1) - 90 continue - return - end -c subroutine lfpt (n,m,theta,cp,pb) -c -c dimension of -c arguments -c cp((n/2)+1) -c -c purpose routine lfpt uses coefficients computed by -c routine alfk to compute the single precision -c normalized associated legendre function pbar(n, -c m,theta) at colatitude theta. -c -c usage call lfpt(n,m,theta,cp,pb) -c -c arguments -c -c on input n -c nonnegative integer specifying the degree of -c pbar(n,m,theta) -c m -c is the order of pbar(n,m,theta). m can be -c any integer however pbar(n,m,theta) = 0 -c if abs(m) is greater than n and -c pbar(n,m,theta) = (-1)**m*pbar(n,-m,theta) -c for negative m. -c -c theta -c single precision colatitude in radians -c -c cp -c single precision array of length (n/2)+1 -c containing coefficients computed by routine -c alfk -c -c on output pb -c single precision variable containing -c pbar(n,m,theta) -c -c special conditions calls to routine lfpt must be preceded by an -c appropriate call to routine alfk. -c -c precision single -c -c algorithm the trigonometric series formula used by -c routine lfpt to calculate pbar(n,m,th) at -c colatitude th depends on m and n as follows: -c -c 1) for n even and m even, the formula is -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k)*cos(2*k*th) -c 2) for n even and m odd. the formula is -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*th) -c 3) for n odd and m even, the formula is -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*th) -c 4) for n odd and m odd, the formula is -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*th) -c -c accuracy comparison between routines lfpt and double -c precision dlfpt on the cray1 indicates greater -c accuracy for greater values on input parameter -c n. agreement to 13 places was obtained for -c n=10 and to 12 places for n=100. -c -c timing time per call to routine lfpt is dependent on -c the input parameter n. -c - subroutine lfpt (n,m,theta,cp,pb) - dimension cp(1) -c - pb = 0. - ma = iabs(m) - if(ma .gt. n) return - if (n) 10, 10, 30 - 10 if (ma) 20, 20, 30 - 20 pb= sqrt(.5) - go to 140 - 30 np1 = n+1 - nmod = mod(n,2) - mmod = mod(ma,2) - if (nmod) 40, 40, 90 - 40 if (mmod) 50, 50, 70 - 50 kdo = n/2+1 - cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = 1. - st = 0. - sum = .5*cp(1) - do 60 kp1=2,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(kp1)*ct - 60 continue - pb= sum - go to 140 - 70 kdo = n/2 - cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = 1. - st = 0. - sum = 0. - do 80 k=1,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(k)*st - 80 continue - pb= sum - go to 140 - 90 kdo = (n+1)/2 - if (mmod) 100,100,120 - 100 cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = cos(theta) - st = -sin(theta) - sum = 0. - do 110 k=1,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(k)*ct - 110 continue - pb= sum - go to 140 - 120 cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = cos(theta) - st = -sin(theta) - sum = 0. - do 130 k=1,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(k)*st - 130 continue - pb= sum - 140 return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/divec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/divec.f deleted file mode 100755 index 6297028fa..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/divec.f +++ /dev/null @@ -1,345 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file divec.f -c -c this file includes documentation and code for -c subroutine divec i -c -c ... files which must be loaded with divec.f -c -c sphcom.f, hrfft.f, vhaec.f,shsec.f -c -c -c subroutine divec(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, -c + wshsec,lshsec,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br and bi, precomputed -c by subroutine vhaec for a vector field (v,w), subroutine divec -c computes the divergence of the vector field in the scalar array dv. -c dv(i,j) is the divergence at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e. -c -c dv(i,j) = 1/sint*[ d(sint*v(i,j))/dtheta + d(w(i,j))/dlambda ] -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi were precomputed. required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine dives. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the divergence is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c divergence is neither symmetric nor antisymmetric about -c the equator. the divergence is computed on the entire -c sphere. i.e., in the array dv(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case the divergence is antisymmetyric about -c the equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array dv(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array dv(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the divergence is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array dv(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array dv(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the divergence for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the array dv as it appears in -c the program that calls divec. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the array dv as it appears in -c the program that calls divec. jdv must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaec. -c *** br and bi must be computed by vhaec prior to calling -c divec. -c -c mdb the first dimension of the arrays br and bi as it -c appears in the program that calls divec. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it -c appears in the program that calls divec. ndb must be at -c least nlat. -c -c -c wshsec an array which must be initialized by subroutine shseci. -c once initialized, -c wshsec can be used repeatedly by divec as long as nlon -c and nlat remain unchanged. wshsec must not be altered -c between calls of divec. -c -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls divec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls divec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c dv a two or three dimensional array (see input parameter nt) -c that contains the divergence of the vector field (v,w) -c whose coefficients br,bi where computed by subroutine -c vhaec. dv(i,j) is the divergence at the colatitude point -c theta(i) = (i-1)*pi/(nlat-1) and longitude point -c lambda(j) = (j-1)*2*pi/nlon. the index ranges are defined -c above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsec -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine divec(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - + wshsec,lshsec,work,lwork,ierror) - - dimension dv(idv,jdv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshsec(lshsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - 1 (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space (same as shsec) -c - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwmin = lzz1+labc+nlon+15 - - if(lshsec .lt. lwmin) return -c -c verify unsaved work space (add to what shec requires) -c - ierror = 10 - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsec) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt -c if(lwork .lt. nln+max0(ls*nlon,3*nlat*imid)+2*mn+nlat) return - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - if (isym .eq. 0) then - lwkmin = nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call divec1(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshsec,lshsec,work(iwk),lwk, - +ierror) - return - end - - subroutine divec1(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - + a,b,mab,sqnn,wshsec,lshsec,wk,lwk,ierror) - dimension dv(idv,jdv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wshsec(lshsec),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = -sqnn(n)*br(1,n,k) - b(1,n,k) = -sqnn(n)*bi(1,n,k) - 5 continue -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = -sqnn(n)*br(m,n,k) - b(m,n,k) = -sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into dv -c - call shsec(nlat,nlon,isym,nt,dv,idv,jdv,a,b, - + mab,nlat,wshsec,lshsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/dives.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/dives.f deleted file mode 100755 index c2dc32f1b..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/dives.f +++ /dev/null @@ -1,336 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file dives.f -c -c this file includes documentation and code for -c subroutine dives i -c -c ... files which must be loaded with dives.f -c -c sphcom.f, hrfft.f, vhaes.f,shses.f -c -c -c subroutine dives(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, -c + wshses,lshses,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br and bi, precomputed -c by subroutine vhaes for a vector field (v,w), subroutine dives -c computes the divergence of the vector field in the scalar array dv. -c dv(i,j) is the divergence at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e. -c -c dv(i,j) = 1/sint*[ d(sint*v(i,j))/dtheta + d(w(i,j))/dlambda ] -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi were precomputed. required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine divec. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the divergence is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c divergence is neither symmetric nor antisymmetric about -c the equator. the divergence is computed on the entire -c sphere. i.e., in the array dv(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case the divergence is antisymmetyric about -c the equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array dv(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array dv(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the divergence is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array dv(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array dv(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the divergence for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the array dv as it appears in -c the program that calls dives. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the array dv as it appears in -c the program that calls dives. jdv must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaes. -c *** br and bi must be computed by vhaes prior to calling -c dives. -c -c mdb the first dimension of the arrays br and bi as it -c appears in the program that calls dives. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it -c appears in the program that calls dives. ndb must be at -c least nlat. -c -c -c wshses an array which must be initialized by subroutine shsesi -c once initialized, -c wshses can be used repeatedly by dives as long as nlon -c and nlat remain unchanged. wshses must not be altered -c between calls of dives. wdives is identical to the saved -c work space initialized by subroutine shsesi and can be -c set by calling that subroutine instead of divesi. -c -c -c lshses the dimension of the array wshses as it appears in the -c program that calls dives. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls dives. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*((nt+1)*nlon+2*nt*l1+1) -c -c if isym > 0 then lwork must be at least -c -c (nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c dv a two or three dimensional array (see input parameter nt) -c that contains the divergence of the vector field (v,w) -c whose coefficients br,bi where computed by subroutine -c vhaes. dv(i,j) is the divergence at the colatitude point -c theta(i) = (i-1)*pi/(nlat-1) and longitude point -c lambda(j) = (j-1)*2*pi/nlon. the index ranges are defined -c above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshses -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine dives(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - + wshses,lshses,work,lwork,ierror) - - dimension dv(idv,jdv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshses(lshses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - 1 (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 -c -c verify save work space (same as shes, file f3) -c - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 10 -c -c verify unsaved work space (add to what shses requires, file f3) -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - if(lwork.lt. nln+ls*nlon+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call dives1(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshses,lshses,work(iwk),lwk, - +ierror) - return - end - - subroutine dives1(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - + a,b,mab,sqnn,wshses,lshses,wk,lwk,ierror) - dimension dv(idv,jdv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wshses(lshses),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = -sqnn(n)*br(1,n,k) - b(1,n,k) = -sqnn(n)*bi(1,n,k) - 5 continue -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = -sqnn(n)*br(m,n,k) - b(m,n,k) = -sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into dv -c - call shses(nlat,nlon,isym,nt,dv,idv,jdv,a,b, - + mab,nlat,wshses,lshses,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/divgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/divgc.f deleted file mode 100755 index 99102566d..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/divgc.f +++ /dev/null @@ -1,344 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file divgc.f -c -c this file includes documentation and code for -c subroutine divgc i -c -c ... files which must be loaded with divgc.f -c -c sphcom.f, hrfft.f, vhagc.f, shsgc.f, gaqd.f -c -c -c subroutine divgc(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, -c + wshsgc,lshsgc,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br and bi, precomputed -c by subroutine vhagc for a vector field (v,w), subroutine divgc -c computes the divergence of the vector field in the scalar array dv. -c dv(i,j) is the divergence at the gaussian colatitude point theta(i) -c (see nlat as input parameter) and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e. -c -c dv(i,j) = 1/sint*[ d(sint*v(i,j))/dtheta + d(w(i,j))/dlambda ] -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi were precomputed. required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine divgs. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the divergence is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c divergence is neither symmetric nor antisymmetric about -c the equator. the divergence is computed on the entire -c sphere. i.e., in the array dv(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case the divergence is antisymmetyric about -c the equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array dv(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array dv(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the divergence is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array dv(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array dv(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c in the program that calls divgc, the arrays br,bi, and dv -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the divergence for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the array dv as it appears in -c the program that calls divgc. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the array dv as it appears in -c the program that calls divgc. jdv must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhagc. -c *** br and bi must be computed by vhagc prior to calling -c divgc. -c -c mdb the first dimension of the arrays br and bi as it -c appears in the program that calls divgc. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it -c appears in the program that calls divgc. ndb must be at -c least nlat. -c -c -c wshsgc an array which must be initialized by subroutine shsgci -c once initialized, wshsgc can be used repeatedly by divgc -c as long as nlon and nlat remain unchanged. wshsgc must -c not be altered between calls of divgc. -c -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls divgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls divgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c -c if isym is zero then lwork must be at least -c -c nlat*(nlon*nt+max0(3*l2,nlon) + 2*nt*l1+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nlon*nt+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c dv a two or three dimensional array (see input parameter nt) -c that contains the divergence of the vector field (v,w) -c whose coefficients br,bi where computed by subroutine -c vhagc. dv(i,j) is the divergence at the gaussian colatitude -c point theta(i) and longitude point lambda(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine divgc(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - + wshsgc,lshsgc,work,lwork,ierror) - - dimension dv(idv,jdv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshsgc(lshsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - 1 (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 -c check permanent work space length - l2 = (nlat+1)/2 - l1 = min0((nlon+2)/2,nlat) - if (lshsgc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 10 -c -c verify unsaved work space (add to what shsgc requires) -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsgc) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt -c if(lwork.lt. nln+ls*nlon+2*mn+nlat) return - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - if (isym .eq. 0) then - lwkmin = nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - - - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call divgc1(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshsgc,lshsgc,work(iwk),lwk, - +ierror) - return - end - - subroutine divgc1(nlat,nlon,isym,nt,dv,idv,jdv,br,bi,mdb,ndb, - + a,b,mab,sqnn,wshsgc,lshsgc,wk,lwk,ierror) - dimension dv(idv,jdv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wshsgc(lshsgc),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = -sqnn(n)*br(1,n,k) - b(1,n,k) = -sqnn(n)*bi(1,n,k) - 5 continue -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = -sqnn(n)*br(m,n,k) - b(m,n,k) = -sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into dv -c - call shsgc(nlat,nlon,isym,nt,dv,idv,jdv,a,b, - + mab,nlat,wshsgc,lshsgc,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/divgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/divgs.f deleted file mode 100755 index 0bb900802..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/divgs.f +++ /dev/null @@ -1,335 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file divgs.f -c -c this file includes documentation and code for -c subroutine divgs i -c -c ... files which must be loaded with divgs.f -c -c sphcom.f, hrfft.f, vhags.f, shsgs.f, gaqd.f -c -c -c subroutine divgs(nlat,nlon,isym,nt,divg,idiv,jdiv,br,bi,mdb,ndb, -c + wshsgs,lshsgs,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br and bi, precomputed -c by subroutine vhags for a vector field (v,w), subroutine divgs -c computes the divergence of the vector field in the scalar array divg. -c divg(i,j) is the divergence at the gaussian colatitude point theta(i) -c (see nlat as input parameter) and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e. -c -c dv(i,j) = 1/sint*[ d(sint*v(i,j))/dtheta + d(w(i,j))/dlambda ] -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi were precomputed -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the divergence is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c divergence is neither symmetric nor antisymmetric about -c the equator. the divergence is computed on the entire -c sphere. i.e., in the array divg(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case the divergence is antisymmetyric about -c the equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array divg(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array divg(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the divergence is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the divergence is computed -c in the array divg(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the divergence is computed -c in the array divg(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c in the program that calls divgs, the arrays br,bi, and divg -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the divergence for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idiv the first dimension of the array divg as it appears in -c the program that calls divgs. if isym = 0 then idiv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idiv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idiv must be at least (nlat+1)/2. -c -c jdiv the second dimension of the array divg as it appears in -c the program that calls divgs. jdiv must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhags. -c *** br and bi must be computed by vhags prior to calling -c divgs. -c -c mdb the first dimension of the arrays br and bi as it -c appears in the program that calls divgs. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it -c appears in the program that calls divgs. ndb must be at -c least nlat. -c -c -c wshsgs an array which must be intialized by subroutine shsgsi. -c once initialized, -c wshsgs can be used repeatedly by divgs as long as nlon -c and nlat remain unchanged. wshsgs must not be altered -c between calls of divgs. -c -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls divgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls divgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*((nt+1)*nlon+2*nt*l1+1) -c -c if isym > 0 then lwork must be at least -c -c (nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c divg a two or three dimensional array (see input parameter nt) -c that contains the divergence of the vector field (v,w) -c whose coefficients br,bi where computed by subroutine -c vhags. divg(i,j) is the divergence at the gaussian colatitude -c point theta(i) and longitude point lambda(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idiv -c = 6 error in the specification of jdiv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine divgs(nlat,nlon,isym,nt,divg,idiv,jdiv,br,bi,mdb,ndb, - + wshsgs,lshsgs,work,lwork,ierror) - - dimension divg(idiv,jdiv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshsgs(lshsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idiv.lt.nlat) .or. - 1 (isym.gt.0 .and. idiv.lt.imid)) return - ierror = 6 - if(jdiv .lt. nlon) return - ierror = 7 - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 -c check permanent work space length - l2 = (nlat+1)/2 - l1 = min0((nlon+2)/2,nlat) - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return - ierror = 10 -c -c verify unsaved work space (add to what shses requires, file f3) -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - if(lwork.lt. nln+ls*nlon+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call divgs1(nlat,nlon,isym,nt,divg,idiv,jdiv,br,bi,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshsgs,lshsgs,work(iwk),lwk, - +ierror) - return - end - - subroutine divgs1(nlat,nlon,isym,nt,divg,idiv,jdiv,br,bi,mdb,ndb, - + a,b,mab,sqnn,wshsgs,lshsgs,wk,lwk,ierror) - dimension divg(idiv,jdiv,nt),br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wshsgs(lshsgs),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = -sqnn(n)*br(1,n,k) - b(1,n,k) = -sqnn(n)*bi(1,n,k) - 5 continue -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = -sqnn(n)*br(m,n,k) - b(m,n,k) = -sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into divg -c - call shsgs(nlat,nlon,isym,nt,divg,idiv,jdiv,a,b, - + mab,nlat,wshsgs,lshsgs,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/gaqd.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/gaqd.f deleted file mode 100755 index fb4d1ab10..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/gaqd.f +++ /dev/null @@ -1,318 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c This version of gaqd implements the method presented in: -c P. N. swarztrauber, Computing the points and weights for -c Gauss-Legendre quadrature, SIAM J. Sci. Comput., -c 24(2002) pp. 945-954. -c -c The w and lwork arrays are dummy and included only to -c permit a simple pluggable exchange with the -c old gaqd in previous versions of SPHEREPACK -c -c -c - subroutine gaqd(nlat,theta,wts,w,lwork,ierror) -c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . -c -c gauss points and weights are computed using the fourier-newton -c described in "on computing the points and weights for -c gauss-legendre quadrature", paul n. swarztrauber, siam journal -c on scientific computing that has been accepted for publication. -c This routine is faster and more accurate than older program -c with the same name. -c -c subroutine gaqd computes the nlat gaussian colatitudes and weights -c in double precision. the colatitudes are in radians and lie in the -c in the interval (0,pi). -c -c input parameters -c -c nlat the number of gaussian colatitudes in the interval (0,pi) -c (between the two poles). nlat must be greater than zero. -c -c w unused double precision variable that permits a simple -c exchange with the old routine with the same name -c in spherepack. -c -c lwork unused variable that permits a simple exchange with the -c old routine with the same name in spherepack. -c -c output parameters -c -c theta a double precision array with length nlat -c containing the gaussian colatitudes in -c increasing radians on the interval (0,pi). -c -c wts a double precision array with lenght nlat -c containing the gaussian weights. -c -c ierror = 0 no errors -c = 1 if nlat.le.0 -c -c ***************************************************************** -c - double precision theta(nlat),wts(nlat),w, - 1 x,pi,pis2,dtheta,dthalf,cmax,zprev,zlast,zero, - 2 zhold,pb,dpb,dcor,sum,cz -c -c check work space length -c - ierror = 1 - if (nlat.le.0) return - ierror = 0 -c -c compute weights and points analytically when nlat=1,2 -c - if (nlat.eq.1) then - theta(1) = dacos(0.0d0) - wts(1) = 2.0d0 - return - end if - if (nlat.eq.2) then - x = dsqrt(1.0d0/3.0d0) - theta(1) = dacos(x) - theta(2) = dacos(-x) - wts(1) = 1.0d0 - wts(2) = 1.0d0 - return - end if - eps = sqrt(dzeps(1.0d0)) - eps = eps*sqrt(eps) - pis2 = 2.0d0*datan(1.0d0) - pi = pis2+pis2 - mnlat = mod(nlat,2) - ns2 = nlat/2 - nhalf = (nlat+1)/2 - idx = ns2+2 -c - call cpdp (nlat,cz,theta(ns2+1),wts(ns2+1)) -c - dtheta = pis2/nhalf - dthalf = dtheta/2.0d0 - cmax = .2d0*dtheta -c -c estimate first point next to theta = pi/2 -c - if(mnlat.ne.0) then - zero = pis2-dtheta - zprev = pis2 - nix = nhalf-1 - else - zero = pis2-dthalf - nix = nhalf - end if - 9 it = 0 - 10 it = it+1 - zlast = zero -c -c newton iterations -c - call tpdp (nlat,zero,cz,theta(ns2+1),wts(ns2+1),pb,dpb) - dcor = pb/dpb - sgnd = 1.0 - if(dcor .ne. 0.0d0) sgnd = dcor/dabs(dcor) - dcor = sgnd*min(dabs(dcor),cmax) - zero = zero-dcor - if(dabs(zero-zlast).gt.eps*dabs(zero)) go to 10 - theta(nix) = zero - zhold = zero -c wts(nix) = (nlat+nlat+1)/(dpb*dpb) -c -c yakimiw's formula permits using old pb and dpb -c - wts(nix) = (nlat+nlat+1)/(dpb+pb*dcos(zlast)/dsin(zlast))**2 - nix = nix-1 - if(nix.eq.0) go to 30 - if(nix.eq.nhalf-1) zero = 3.0*zero-pi - if(nix.lt.nhalf-1) zero = zero+zero-zprev - zprev = zhold - go to 9 -c -c extend points and weights via symmetries -c - 30 if(mnlat.ne.0) then - theta(nhalf) = pis2 - call tpdp (nlat,pis2,cz,theta(ns2+1),wts(ns2+1),pb,dpb) - wts(nhalf) = (nlat+nlat+1)/(dpb*dpb) - end if - do i=1,ns2 - wts(nlat-i+1) = wts(i) - theta(nlat-i+1) = pi-theta(i) - end do - sum = 0.0d0 - do i=1,nlat - sum = sum+wts(i) - end do - do i=1,nlat - wts(i) = 2.0d0*wts(i)/sum - end do - return - end - subroutine cpdp(n,cz,cp,dcp) -c -c computes the fourier coefficients of the legendre -c polynomial p_n^0 and its derivative. -c n is the degree and n/2 or (n+1)/2 -c coefficients are returned in cp depending on whether -c n is even or odd. The same number of coefficients -c are returned in dcp. For n even the constant -c coefficient is returned in cz. -c - double precision cp(n/2+1),dcp(n/2+1), - 1 t1,t2,t3,t4,cz - ncp = (n+1)/2 - t1 = -1.0d0 - t2 = n+1.0d0 - t3 = 0.0d0 - t4 = n+n+1.0d0 - if(mod(n,2).eq.0) then - cp(ncp) = 1.0d0 - do j = ncp,2,-1 - t1 = t1+2.0d0 - t2 = t2-1.0d0 - t3 = t3+1.0d0 - t4 = t4-2.0d0 - cp(j-1) = (t1*t2)/(t3*t4)*cp(j) - end do - t1 = t1+2.0d0 - t2 = t2-1.0d0 - t3 = t3+1.0d0 - t4 = t4-2.0d0 - cz = (t1*t2)/(t3*t4)*cp(1) - do j=1,ncp - dcp(j) = (j+j)*cp(j) - end do - else - cp(ncp) = 1.0d0 - do j = ncp-1,1,-1 - t1 = t1+2.0d0 - t2 = t2-1.0d0 - t3 = t3+1.0d0 - t4 = t4-2.0d0 - cp(j) = (t1*t2)/(t3*t4)*cp(j+1) - end do - do j=1,ncp - dcp(j) = (j+j-1)*cp(j) - end do - end if - return - end - subroutine tpdp (n,theta,cz,cp,dcp,pb,dpb) -c -c computes pn(theta) and its derivative dpb(theta) with -c respect to theta -c - double precision cp(n/2+1),dcp(n/2+1),cz, - 1 pb,dpb,fn,theta,cdt,sdt,cth,sth,chh -c - fn = n - cdt = dcos(theta+theta) - sdt = dsin(theta+theta) - if(mod(n,2) .eq.0) then -c -c n even -c - kdo = n/2 - pb = .5d0*cz - dpb = 0.0d0 - if(n .gt. 0) then - cth = cdt - sth = sdt - do 170 k=1,kdo -c pb = pb+cp(k)*cos(2*k*theta) - pb = pb+cp(k)*cth -c dpb = dpb-(k+k)*cp(k)*sin(2*k*theta) - dpb = dpb-dcp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 170 continue - end if - else -c -c n odd -c - kdo = (n+1)/2 - pb = 0.0d0 - dpb = 0.0d0 - cth = dcos(theta) - sth = dsin(theta) - do 190 k=1,kdo -c pb = pb+cp(k)*cos((2*k-1)*theta) - pb = pb+cp(k)*cth -c dpb = dpb-(k+k-1)*cp(k)*sin((2*k-1)*theta) - dpb = dpb-dcp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 190 continue - end if - return - end - real function dzeps (x) - double precision x -c -c estimate unit roundoff in quantities of size x. -c - double precision a,b,c,eps -c -c this program should function properly on all systems -c satisfying the following two assumptions, -c 1. the base used in representing floating point -c numbers is not a power of three. -c 2. the quantity a in statement 10 is represented to -c the accuracy used in floating point variables -c that are stored in memory. -c the statement number 10 and the go to 10 are intended to -c force optimizing compilers to generate code satisfying -c assumption 2. -c under these assumptions, it should be true that, -c a is not exactly equal to four-thirds, -c b has a zero for its last bit or digit, -c c is not exactly equal to one, -c eps measures the separation of 1.0 from -c the next larger floating point number. -c the developers of eispack would appreciate being informed -c about any systems where these assumptions do not hold. -c -c this version dated 4/6/83. -c - a = 4.0d0/3.0d0 - 10 b = a - 1.0d0 - c = b + b + b - eps = abs(c-1.0d0) - if (eps .eq. 0.0d0) go to 10 - dzeps = eps*dabs(x) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/geo2math.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/geo2math.f deleted file mode 100755 index 7cc3baecc..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/geo2math.f +++ /dev/null @@ -1,416 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... geo2math.f -c -c file geo2math.f contains subroutines for converting scalar and -c vector fields between geophysical and mathematical spherical -c coordinates. The latter is required when using most spherepack -c software. The four main subroutines in geo2math.f are described -c as follows: -c -c (1) subroutine geo2maths(ig,nlon,nlat,sg,sm,work) -c -c converts the nlon by nlat scalar field sg given in -c geophysical coordinates to the nlat by nlon scalar -c field sm given in mathematical coordinates. sg and sm -c can be identical in the program calling geo2maths. -c -c (2) subroutine math2geos(ig,nlat,nlon,sm,sg,work) -c -c converts the nlat by nlon scalar field sm given in -c mathematical coordinates to the nlon by nlat scalar -c field sg given in geophysical coordinates. sm and -c sg can be identical in the program calling math2geos. -c -c (3) subroutine geo2mathv(ig,nlon,nlat,ug,vg,vm,wm,work) -c -c converts the nlon by nlat vector field (ug,vg) given -c in geophysical coordinates to the nlat by nlon vector -c field (vm,wm) in mathematical coordinates. ug and wm -c can be identical in the program calling geo2mathv. vg -c and vm can be identical in the program calling geo2mathv. -c -c (4) subroutine math2geov(ig,nlat,nlon,vm,wm,ug,vg,work) -c -c converts the nlat by nlon vector field (vm,wm) given -c in mathematical coordinates to the nlon by nlat vector -c field (ug,vg) in spherical coordinates. vm and vg can -c be identical in the program calling math2geov. wm and -c ug can be identical in the program calling math2geov. -c -c *** (1),(2),(3),(4) argument description. -c -c ... ig -c -c = 0 if the latitude values in the geophysical arrays sg,ug,vg are -c ordered south to north with increasing latitude subscript -c i=1,2,...,nlat. -c -c = 1 if the latitude values in the geophysical arrays sg,ug,vg are -c ordered north to south with increasing latitude subscript -c i=1,2,...,nlat. -c -c ... nlon -c -c the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. nlon is the first -c dimension of the geophysical arrays sg,ug,vg and the second -c dimension of the mathematical arrays sm,vm,wm. The longitude -c grid is given by phi(j) = (j-1)*2*pi/nlon j=1,...,nlon. -c -c ... nlat -c -c the number of distinct latitude and colatitude points and the -c first dimension of sm,vm,wm and second dimension of sg,ug,vg. -c If the (co)latitude grid is equally spaced then the grid increment -c is dlat=pi/(nlat-1). In this case the south to north latitude grid -c underlying is -c -c lat(i) = -0.5*pi + (i-1)*dlat (i=1,...,nlat) -c -c and the north to south colatitude grid underlying sm,vm,wm is -c -c colat(i) = (i-1)*dlat (i=1,...,nlat) -c -c If the grid is Gaussian let thetag(i) be the north to south colatitude -c grid (as computed by the spherepack routine gaqd). In this case -c -c colat(i) = thetag(i) (i=1,...,nlat) -c -c and -c -c lat(i) = -0.5*pi + thetag(i) (i=1,...,nlat) -c -c In either case lat(i) = colat(nlat-i+1) for all i. -c If nlat is odd the equator is located at the (nlat+1)/2 -c latitude or colatitude point. If nlat is even the equator is -c half way between the nlat/2 and nlat/2+1 latitude or colatitude -c points. The equally spaced (co)latitude grid includes the poles. -c The Gaussian grid excludes the poles. -c -c ... sg,sm -c -c In (1),(2) sg is a nlon by nlat array containing the scalar field -c in geophysical coordinates. Latitude values in sg are ordered from -c the southern to the northern hemisphere with increasing latitude -c subscript if ig = 0 or ordered from the northern hemisphere to the -c southern hemisphere if ig = 1. sm is a nlat by nlon array containing -c the scalar field in mathematical coordinates. Colatitude values in sm -c are ordered from the north to the south hemisphere with increasing -c colatitude subscript (i=1,...,nlat). The (co)latitude grid for sg and -c sm can be equally spaced or Gaussian. sg and sm can be equivalenced or -c be identical in the routine calling geo2maths or math2geos. sg and -c sm are related by -c -c sm(nlat-i+1,j) = sg(j,i) (if ig = 0) -c -c or -c -c sm(i,j) = sg(j,i) (if ig = 1) -c -c for i=1,...,nlat and j=1,...,nlon. This formula is not used because -c the two arrays can be equivalenced or identical arguments in the -c program calling geo2maths or math2geos. -c -c ... ug,vg,vm,wm -c -c In (3),(4) ug is a nlon by nlat array containing the longitudinal -c vector component. vg is a nlon by nlat array containing the -c latitudinal vector component. Values in (ug,vg) are ordered -c from the southern to the northern hemisphere with increasing -c latitude subscript if ig = 0 or from the northern to southern -c hemisphere if ig = 1. vm is a nlat by nlon array containing the -c the colatitudinal vector component. wm is a nlat by nlon array -c containing the east longitudinal vector component. Values in -c (vm,wm) are ordered from the northern to the southern hemisphere -c with increasing colatitude subscript. The (co)latitude grid for -c both vector fields can be equally spaced or Gaussian. ug,wm and -c vg,vm can be equivalenced or be identical in the program calling -c geo2mathv or math2geov. They are related by -c -c ug(j,nlat-i+1) = wm(i,j) -c (ig = 0) -c vg(j,nlat-i+1) = -vm(i,j) -c -c or -c -c ug(j,i) = wm(i,j) -c (ig = 1) -c vg(j,i) = -vm(i,j) -c -c -c for i=1,...,nlat and j=1,...,nlon. These formulas are not -c used because ug,wm and vg,vm can be equivalenced or identical -c arguments in the program calling math2geov or geo2mathv. -c -c Let ib = nlat-i+1 for i=1,...,nlat. Summarizing: -c sg(j,i) or ug(j,i),vg(j,i) are values at (phi(j),lat(i)) if ig = 0 -c sg(j,i) or ug(j,i),vg(j,i) are values at (phi(j),lat(ib)) if ig = 1 -c sm(i,j) or vm(i,j),wm(i,j) are values at (colat(i),phi(j)) -c -c ... work is an unsaved real work space of length at least nlon*nlat -c in the routine calling (1),(2),(3), or (4). It is used to simplify -c a nonsquare array transposition in case it is required. -c -c *** example (1) -c -c suppose you wish to compute the divergence of (ug,vg) on a Gaussian -c grid in geophysical coordinates using the stored Legendre polynomial -c routines of SPHEREPACK -c -c (1) call geo2mathv to set vm,wm from ug,vg -c -c (2) call vhags to compute the vector harmonic coefficients of vm,wm -c -c (3) call divgs with the coefficients from (2) to compute the divergence -c dv in mathematical spherical coordinates on the UNIT sphere. -c -c (4) call math2geos to convert the scalar divergence dv back to -c geophysical spherical coordinates. -c -c (5) divide dv by R (the radius of the earth) to compute divergence -c on the earth (scaling from unit sphere computation in (3)). -c -c *** example (2) -c -c suppose you wish to compute a vector field (ug,vg) corresponding -c to a given divergence dvg and vorticity vtg (all in geophysical -c coordinates) on an equally spaced (co)latitude grid using the -c computed Legendre polynomial software. -c -c (1) call geo2maths to set dvm from dvg -c -c (2) call geo2maths to set vtm from vts -c -c (3) call shaec to compute the scalar harmonic coefficients of dvm -c -c (4) call shaec to compute the scalar harmonic coefficients of vtm -c -c (5) call idvtec to compute (vm,wm) using the coefficients from (3),(4). -c -c (6) call math2geov to set (ug,vg) from (vm,wm) -c -c (7) multiply (ug,vg) by the earth's radius R for scaling -c from the unit sphere computation in (5) -c -c *** END OF DOCUMENTATION ... CODE FOLLOWS: -c -c - subroutine geo2maths(ig,nlon,nlat,sg,sm,work) - implicit none - integer ig,nlon,nlat,i,j,ij - real sg(nlon,nlat),sm(nlat,nlon),work(*) -c -c transpose sg into sm and reverse colatitude subscript order -c if necessary -c - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = sg(j,i) - end do - end do - if (ig.eq.0) then - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - sm(nlat-i+1,j) = work(ij) - end do - end do - else - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - sm(i,j) = work(ij) - end do - end do - end if - return - end - - subroutine math2geos(ig,nlat,nlon,sm,sg,work) - implicit none - integer ig,nlon,nlat,i,j,ij - real sm(nlat,nlon),sg(nlon,nlat),work(*) -c -c transpose sm into sg and reverse colatitude subscript order -c if necessary -c - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = sm(i,j) - end do - end do - if (ig.eq.0) then - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - sg(j,nlat-i+1) = work(ij) - end do - end do - else - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - sg(j,i) = work(ij) - end do - end do - end if - return - end - - subroutine geo2mathv(ig,nlon,nlat,ug,vg,vm,wm,work) - implicit none - integer ig,nlon,nlat,i,j,ij - real ug(nlon,nlat),vg(nlon,nlat),work(*) - real vm(nlat,nlon),wm(nlat,nlon) -c -c convert vg to vm, ug to wm -c - if (ig.eq.0) then - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = vg(j,i) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - vm(nlat-i+1,j) = -work(ij) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = ug(j,i) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - wm(nlat-i+1,j) = work(ij) - end do - end do - else - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = vg(j,i) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - vm(i,j) = -work(ij) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = ug(j,i) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - wm(i,j) = work(ij) - end do - end do - end if - return - end - - subroutine math2geov(ig,nlat,nlon,vm,wm,ug,vg,work) - implicit none - integer ig,nlon,nlat,i,j,ij - real vm(nlat,nlon),wm(nlat,nlon),work(*) - real ug(nlon,nlat),vg(nlon,nlat) -c -c convert vm to vg, wm to ug -c - if (ig.eq.0) then - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = vm(i,j) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - vg(j,nlat-i+1) = -work(ij) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = wm(i,j) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - ug(j,nlat-i+1) = work(ij) - end do - end do - else - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = vm(i,j) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - vg(j,i) = -work(ij) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - work(ij) = wm(i,j) - end do - end do - do i=1,nlat - do j=1,nlon - ij = (j-1)*nlat+i - ug(j,i) = work(ij) - end do - end do - end if - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/gradec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/gradec.f deleted file mode 100755 index 8341939ca..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/gradec.f +++ /dev/null @@ -1,360 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file gradec.f -c -c this file includes documentation and code for -c subroutine gradec i -c -c ... files which must be loaded with gradec.f -c -c sphcom.f, hrfft.f, shaec.f,vhsec.f -c -c subroutine gradec(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsec,lvhsec,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaec for a scalar field sf, subroutine gradec computes -c an irrotational vector field (v,w) such that -c -c gradient(sf) = (v,w). -c -c v is the colatitudinal and w is the east longitudinal component -c of the gradient. i.e., -c -c v(i,j) = d(sf(i,j))/dtheta -c -c and -c -c w(i,j) = 1/sint*d(sf(i,j))/dlambda -c -c at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon. -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine grades. this -c saves storage (compare wvhsec here and wvhses in grades) but increases -c computational requirements. -c -c -c input parameters -c -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shaec to compute the arrays a and b from the -c scalar field sf. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c sf is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c sf is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c sf is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional corresponding -c to an indexed multiple array sf. in this case, multiple -c vector synthesis will be performed to compute each vector -c field. the third index for a,b,v, and w is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that a,b,v, -c and w are two dimensional arrays. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls gradec. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls gradec. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field array sf as computed by subroutine shaec. -c *** a,b must be computed by shaec prior to calling gradec. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls gradec (and shaec). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls gradec (and shaec). ndab must be at -c least nlat. -c -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized, -c wvhsec can be used repeatedly by gradec as long as nlon -c and nlat remain unchanged. wvhsec must not be altered -c between calls of gradec. -c -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls gradec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c then lvhsec must be greater than or equal to -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls gradec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(2*l1*nt+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*l1*nt+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field such that the gradient of -c the scalar field sf is (v,w). w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at colatitude theta(i) = (i-1)*pi/(nlat-1) and longitude -c lambda(j) = (j-1)*2*pi/nlon. the indices for v and w are defined -c at the input parameter isym. the vorticity of (v,w) is zero. -c note that any nonzero vector field on the sphere will be -c multiple valued at the poles [reference swarztrauber]. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsec -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine gradec(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - +wvhsec,lvhsec,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsec(lvhsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c verify minimum saved work space length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 - if(lvhsec .lt. lwmin) return - ierror = 10 -c -c verify minimum unsaved work space length -c - mn = mmax*nlat*nt - if (isym .eq. 0) then - lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(2*l1*nt+1) - else - lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*l1*nt+1) - end if - if (lwork .lt. lwkmin) return - - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call gradec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - +mmax,work(is),mdab,ndab,a,b,wvhsec,lvhsec,work(iwk),liwk, - +ierror) - return - end - - subroutine gradec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wvhsec,lvhsec,wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsec(lvhsec),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = sqnn(n)*a(1,n,k) - bi(1,n,k) = sqnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = sqnn(n)*a(m,n,k) - bi(m,n,k) = sqnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c set ityp for irrotational vector synthesis to compute gradient -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into (v,w) (cr,ci are dummy variables) -c - call vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsec,lvhsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/grades.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/grades.f deleted file mode 100755 index cf7a9cc79..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/grades.f +++ /dev/null @@ -1,352 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file gradges.f -c -c this file includes documentation and code for -c subroutine grades i -c -c ... files which must be loaded with gradges.f -c -c sphcom.f, hrfft.f, shaes.f,vhses.f -c -c subroutine grades(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhses,lvhses,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaes for a scalar field sf, subroutine grades computes -c an irrotational vector field (v,w) such that -c -c gradient(sf) = (v,w). -c -c v is the colatitudinal and w is the east longitudinal component -c of the gradient. i.e., -c -c v(i,j) = d(sf(i,j))/dtheta -c -c and -c -c w(i,j) = 1/sint*d(sf(i,j))/dlambda -c -c at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon. -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine gradec -c -c -c input parameters -c -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shaes to compute the arrays a and b from the -c scalar field sf. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c sf is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c sf is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c sf is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional corresponding -c to an indexed multiple array sf. in this case, multiple -c vector synthesis will be performed to compute each vector -c field. the third index for a,b,v, and w is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that a,b,v, -c and w are two dimensional arrays. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls grades. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls grades. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field array sf as computed by subroutine shaes. -c *** a,b must be computed by shaes prior to calling grades. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls grades (and shaes). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls grades (and shaes). ndab must be at -c least nlat. -c -c -c wvhses an array which must be initialized by subroutine gradesi -c (or equivalently by subroutine vhsesi). once initialized, -c wsav can be used repeatedly by grades as long as nlon -c and nlat remain unchanged. wvhses must not be altered -c between calls of grades. -c -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls grades. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c then lvhses must be greater than or equal to -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls grades. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0, lwork must be greater than or equal to -c -c nlat*((2*nt+1)*nlon+2*l1*nt+1). -c -c if isym = 1 or 2, lwork must be greater than or equal to -c -c (2*nt+1)*l2*nlon+nlat*(2*l1*nt+1). -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field such that the gradient of -c the scalar field sf is (v,w). w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at colatitude theta(i) = (i-1)*pi/(nlat-1) and longitude -c lambda(j) = (j-1)*2*pi/nlon. the indices for v and w are defined -c at the input parameter isym. the vorticity of (v,w) is zero. -c note that any nonzero vector field on the sphere will be -c multiple valued at the poles [reference swarztrauber]. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhses -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine grades(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - +wvhses,lvhses,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhses(lvhses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c verify minimum saved work space length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lgdmin = lzimn+lzimn+nlon+15 - if(lvhses .lt. lgdmin) return - ierror = 10 -c -c verify minimum unsaved work space length -c - mn = mmax*nlat*nt - idv = nlat - if (isym.ne.0) idv = imid - lnl = nt*idv*nlon - lwkmin = lnl+lnl+idv*nlon+2*mn+nlat - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call grades1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - +mmax,work(is),mdab,ndab,a,b,wvhses,lvhses,work(iwk),liwk, - +ierror) - return - end - - subroutine grades1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wvhses,lvhses,wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhses(lvhses),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = sqnn(n)*a(1,n,k) - bi(1,n,k) = sqnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = sqnn(n)*a(m,n,k) - bi(m,n,k) = sqnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c set ityp for irrotational vector synthesis to compute gradient -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into (v,w) (cr,ci are dummy variables) -c - call vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhses,lvhses,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/gradgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/gradgc.f deleted file mode 100755 index b863b5157..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/gradgc.f +++ /dev/null @@ -1,350 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file gradgc.f -c -c this file includes documentation and code for -c subroutine gradgc i -c -c ... files which must be loaded with gradgc.f -c -c sphcom.f, hrfft.f, shagc.f,vhsgc.f -c -c subroutine gradgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsgc,lvhsgc,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shagc for a scalar field sf, subroutine gradgc computes -c an irrotational vector field (v,w) such that -c -c gradient(sf) = (v,w). -c -c v is the colatitudinal and w is the east longitudinal component -c of the gradient. i.e., -c -c v(i,j) = d(sf(i,j))/dtheta -c -c and -c -c w(i,j) = 1/sint*d(sf(i,j))/dlambda -c -c at the gaussian colatitude point theta(i) (see nlat as input -c parameter) and longitude lambda(j) = (j-1)*2*pi/nlon where -c where sint = sin(theta(i)). required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine gradgs. this -c saves storage (compare lsav with lsav in gradgs) but increases -c computational requirements. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shagc to compute the arrays a and b from the -c scalar field sf. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c sf is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c sf is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c sf is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional corresponding -c to an indexed multiple array sf. in this case, multiple -c vector synthesis will be performed to compute each vector -c field. the third index for a,b,v, and w is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that a,b,v, -c and w are two dimensional arrays. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls gradgc. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls gradgc. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field array sf as computed by subroutine shagc. -c *** a,b must be computed by shagc prior to calling gradgc. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls gradgc (and shagc). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls gradgc (and shagc). ndab must be at -c least nlat. -c -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized, -c wvhsgc can be used repeatedly by gradgc as long as nlon -c and nlat remain unchanged. wvhsgc must not be altered -c between calls of gradgc. -c -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls gradgc. Let -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls gradgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(2*l1*nt+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*l1*nt+1) -c -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field such that the gradient of -c the scalar field sf is (v,w). w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at gaussian colatitude and longitude lambda(j) = (j-1)*2*pi/nlon -c the indices for v and w are defined at the input parameter -c isym. the vorticity of (v,w) is zero. note that any nonzero -c vector field on the sphere will be multiple valued at the poles -c [reference swarztrauber]. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine gradgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - +wvhsgc,lvhsgc,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgc(lvhsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c verify minimum saved work space length -c - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 - if (lvhsgc .lt. lwmin) return - ierror = 10 -c -c verify minimum unsaved work space length -c - if (isym .eq. 0) then - lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*l1*nt+1) - else - lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*l1*nt+1) - end if - if (lwork .lt. lwkmin) return - - ierror = 0 -c -c set work space pointers -c - mn = mmax*nlat*nt - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call gradgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - +mmax,work(is),mdab,ndab,a,b,wvhsgc,lvhsgc,work(iwk),liwk, - +ierror) - return - end - subroutine gradgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wvhsgc,lvhsgc,wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgc(lvhsgc),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = sqnn(n)*a(1,n,k) - bi(1,n,k) = sqnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = sqnn(n)*a(m,n,k) - bi(m,n,k) = sqnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c set ityp for irrotational vector synthesis to compute gradient -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into (v,w) (cr,ci are dummy variables) -c - call vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsgc,lvhsgc,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/gradgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/gradgs.f deleted file mode 100755 index 920f95acd..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/gradgs.f +++ /dev/null @@ -1,345 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file gradgs.f -c -c this file includes documentation and code for -c subroutine gradgs i -c -c ... files which must be loaded with gradgec.f -c -c sphcom.f, hrfft.f, shags.f,vhsgs.f -c -c subroutine gradgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsgs,lvhsgs,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shags for a scalar field sf, subroutine gradgs computes -c an irrotational vector field (v,w) such that -c -c gradient(sf) = (v,w). -c -c v is the colatitudinal and w is the east longitudinal component -c of the gradient. i.e., -c -c v(i,j) = d(sf(i,j))/dtheta -c -c and -c -c w(i,j) = 1/sint*d(sf(i,j))/dlambda -c -c at the gaussian colatitude point theta(i) (see nlat as input -c parameter) and longitude lambda(j) = (j-1)*2*pi/nlon where -c sint = sin(theta(i)). -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shags to compute the arrays a and b from the -c scalar field sf. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c sf is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c sf is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c sf is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional corresponding -c to an indexed multiple array sf. in this case, multiple -c vector synthesis will be performed to compute each vector -c field. the third index for a,b,v, and w is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that a,b,v, -c and w are two dimensional arrays. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls gradgs. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls gradgs. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field array sf as computed by subroutine shags. -c *** a,b must be computed by shags prior to calling gradgs. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls gradgs (and shags). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls gradgs (and shags). ndab must be at -c least nlat. -c -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c once initialized, -c wvhsgs can be used repeatedly by gradgs as long as nlon -c and nlat remain unchanged. wvhsgs must not be altered -c between calls of gradgs. -c -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls grradgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls gradgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0, lwork must be greater than or equal to -c -c nlat*((2*nt+1)*nlon+2*l1*nt+1). -c -c if isym = 1 or 2, lwork must be greater than or equal to -c -c (2*nt+1)*l2*nlon+nlat*(2*l1*nt+1). -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field such that the gradient of -c the scalar field sf is (v,w). w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at gaussian colatitude and longitude lambda(j) = (j-1)*2*pi/nlon -c the indices for v and w are defined at the input parameter -c isym. the vorticity of (v,w) is zero. note that any nonzero -c vector field on the sphere will be multiple valued at the poles -c [reference swarztrauber]. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine gradgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - +wvhsgs,lvhsgs,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgs(lvhsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c verify minimum saved work space length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lgdmin = lzimn+lzimn+nlon+15 - if(lvhsgs .lt. lgdmin) return - ierror = 10 -c -c verify minimum unsaved work space length -c - mn = mmax*nlat*nt - idv = nlat - if (isym.ne.0) idv = imid - lnl = nt*idv*nlon - lwkmin = lnl+lnl+idv*nlon+2*mn+nlat - if(lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call gradgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - +mmax,work(is),mdab,ndab,a,b,wvhsgs,lvhsgs,work(iwk),liwk, - +ierror) - return - end - - subroutine gradgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wvhsgs,lvhsgs,wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgs(lvhsgs),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = sqnn(n)*a(1,n,k) - bi(1,n,k) = sqnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = sqnn(n)*a(m,n,k) - bi(m,n,k) = sqnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c set ityp for irrotational vector synthesis to compute gradient -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into (v,w) (cr,ci are dummy variables) -c - call vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsgs,lvhsgs,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/helmsph.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/helmsph.f deleted file mode 100755 index 845043af5..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/helmsph.f +++ /dev/null @@ -1,208 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file helmsph.f -c -c this file contains a program for solving the Helmholtz -c equation with constant 1.0 on a ten degree grid on the full sphere -c -c ... required spherepack files -c -c islapec.f, shaec.f, shsec.f, sphcom.f, hrfft.f -c -c ... description -c -c let theta be latitude and phi be east longitude in radians. -c and let -c -c -c x = cos(theta)*sin(phi) -c y = cos(theta)*cos(phi) -c z = sint(theta) -c -c be the cartesian coordinates corresponding to theta and phi. -c on the unit sphere. The exact solution -c -c ue(theta,phi) = (1.+x*y)*exp(z) -c -c is used to set the right hand side and compute error. -c -c -c ********************************************************************** -C -c OUTPUT FROM EXECUTING THE PROGRAM BELOW -c WITH 32 AND 64 BIT FLOATING POINT ARITHMETIC -c -c Helmholtz approximation on a ten degree grid -c nlat = 19 nlon = 36 -c xlmbda = 1.00 pertrb = 0.000E+00 -c maximum error = 0.715E-06 *** (32 BIT) -c maximum error = 0.114E-12 *** (64 BIT) -c -c *********************************************** -c *********************************************** - program helmsph -c -c set grid size with parameter statements -c - implicit none - integer nnlat,nnlon,nn15,llsave,llwork,lldwork - parameter (nnlat=19,nnlon=36) -c -c set saved and unsaved work space lengths in terms of nnlat,nnlon -c (see documentation for shaec,shsec,islapec) -c - parameter (nn15=nnlon+15) - parameter (llsave=nnlat*(nnlat+1)+3*((nnlat-2)*(nnlat-1)+nn15)) - parameter (llwork=nnlat*(2*nnlon+3*(nnlat+1)+2*nnlat+1)) -c -c set double precision work space length for initializations -c - parameter (lldwork = nnlat+1) -c -c dimension arrays -c - real u(nnlat,nnlon),r(nnlat,nnlon) - real sint(nnlat),cost(nnlat),sinp(nnlon),cosp(nnlon) - real work(llwork),wshaec(llsave),wshsec(llsave) - double precision dwork(lldwork) - real a(nnlat,nnlat),b(nnlat,nnlat) - integer nlat,nlon,i,j,lshaec,lshsec,lwork,ierror,isym,nt - integer ldwork - real pi,x,y,z,dlat,dlon,theta,phi,xlmbda,pertrb,ez,ue,errm - pi = 4.0*atan(1.0) -c -c set helmholtz constant -c - xlmbda = 1.0 -c -c set work space length arguments -c - lwork = llwork - ldwork = lldwork - lshaec = llsave - lshsec = llsave -c -c set grid size arguments -c - nlat = nnlat - nlon = nnlon -c -c set sine and cosine vectors -c - dlat = pi/(nlat-1) - dlon = (pi+pi)/nlon - do i=1,nlat - theta = -0.5*pi+(i-1)*dlat - sint(i) = sin(theta) - cost(i) = cos(theta) - end do - do j=1,nlon - phi = (j-1)*dlon - sinp(j) = sin(phi) - cosp(j) = cos(phi) - end do -c -c set right hand side as helmholtz operator -c applied to ue = (1.+x*y)*exp(z) -c - do j=1,nlon - do i=1,nlat - x = cost(i)*cosp(j) - y = cost(i)*sinp(j) - z = sint(i) - r(i,j) = -(x*y*(z*z+6.*(z+1.))+z*(z+2.))*exp(z) - end do - end do -c -c initialize saved work space arrays for scalar harmonic -c analysis and Helmholtz inversion of r -c - CALL SHAECI(NLAT,NLON,WSHAEC,LSHAEC,DWORK,LDWORK,IERROR) - if (ierror .gt. 0) then - write (6,200) ierror - 200 format(' shaeci, ierror = ',i2) - call exit(0) - end if - CALL SHSECI(NLAT,NLON,WSHSEC,LSHSEC,DWORK,LDWORK,IERROR) - if (ierror .gt. 0) then - write (6,201) ierror - 201 format(' shseci, ierror = ',i2) - call exit(0) - end if -c -c set no symmetry and one array -c - isym = 0 - nt = 1 -c -c compute coefficients of r for input to islapec -c - call shaec(nlat,nlon,isym,nt,r,nlat,nlon,a,b,nlat,nlat, - + wshaec,lshaec,work,lwork,ierror) - if (ierror .gt. 0) then - write(*,202) ierror - 202 format(' shaec , ierror = ',i2) - call exit(0) - end if -c -c solve Helmholtz equation on the sphere in u -c - write (6,100) nlat,nlon - 100 format(' helmholtz approximation on a ten degree grid' - + /' nlat = ',i3,2x,' nlon = ', i3) - call islapec(nlat,nlon,isym,nt,xlmbda,u,nlat,nlon,a,b,nlat,nlat, - + wshsec,lshsec,work,lwork,pertrb,ierror) - if (ierror .ne. 0) then - write (6,103) ierror - 103 format(' islapec, ierror = ',i2) - if (ierror .gt. 0) call exit(0) - end if -c -c compute and print maximum error in u -c - errm = 0.0 - do j=1,nlon - do i=1,nlat - x = cost(i)*cosp(j) - y = cost(i)*sinp(j) - z = sint(i) - ez = exp(z) - ue = (1.+x*y)*ez - errm = amax1(errm,abs(u(i,j)-ue)) - end do - end do - write(*,204) xlmbda,pertrb,errm - 204 format(' xlmbda = ',f5.2,2x, ' pertrb = ' ,e10.3, - + /' maximum error = ',e10.3) - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/hrfft.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/hrfft.f deleted file mode 100755 index e2d78dc07..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/hrfft.f +++ /dev/null @@ -1,1385 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file hrfft.f -c -c this file contains a multiple fft package for spherepack. it -c includes code and documentation for performing fast fourier -c transforms (see subroutines hrffti,hrfftf and hrfftb) -c -c ********************************************************************** -c -c subroutine hrffti(n,wsave) -c -c subroutine hrffti initializes the array wsave which is used in -c both hrfftf and hrfftb. the prime factorization of n together -c with a tabulation of the trigonometric functions are computed and -c stored in wsave. -c -c input parameter -c -c n the length of the sequence to be transformed. -c -c output parameter -c -c wsave a work array which must be dimensioned at least 2*n+15. -c the same work array can be used for both hrfftf and -c hrfftb as long as n remains unchanged. different wsave -c arrays are required for different values of n. the -c contents of wsave must not be changed between calls -c of hrfftf or hrfftb. -c -c ********************************************************************** -c -c subroutine hrfftf(m,n,r,mdimr,wsave,work) -c -c subroutine hrfftf computes the fourier coefficients of m real -c perodic sequences (fourier analysis); i.e. hrfftf computes the -c real fft of m sequences each with length n. the transform is -c defined below at output parameter r. -c -c input parameters -c -c m the number of sequences. -c -c n the length of all m sequences. the method is most -c efficient when n is a product of small primes. n may -c change as long as different work arrays are provided -c -c r r(m,n) is a two dimensional real array that contains m -c sequences each with length n. -c -c mdimr the first dimension of the r array as it appears -c in the program that calls hrfftf. mdimr must be -c greater than or equal to m. -c -c -c wsave a work array with at least least 2*n+15 locations -c in the program that calls hrfftf. the wsave array must be -c initialized by calling subroutine hrffti(n,wsave) and a -c different wsave array must be used for each different -c value of n. this initialization does not have to be -c repeated so long as n remains unchanged thus subsequent -c transforms can be obtained faster than the first. -c the same wsave array can be used by hrfftf and hrfftb. -c -c work a real work array with m*n locations. -c -c -c output parameters -c -c r for all j=1,...,m -c -c r(j,1) = the sum from i=1 to i=n of r(j,i) -c -c if n is even set l =n/2 , if n is odd set l = (n+1)/2 -c -c then for k = 2,...,l -c -c r(j,2*k-2) = the sum from i = 1 to i = n of -c -c r(j,i)*cos((k-1)*(i-1)*2*pi/n) -c -c r(j,2*k-1) = the sum from i = 1 to i = n of -c -c -r(j,i)*sin((k-1)*(i-1)*2*pi/n) -c -c if n is even -c -c r(j,n) = the sum from i = 1 to i = n of -c -c (-1)**(i-1)*r(j,i) -c -c ***** note -c this transform is unnormalized since a call of hrfftf -c followed by a call of hrfftb will multiply the input -c sequence by n. -c -c wsave contains results which must not be destroyed between -c calls of hrfftf or hrfftb. -c -c work a real work array with m*n locations that does -c not have to be saved. -c -c ********************************************************************** -c -c subroutine hrfftb(m,n,r,mdimr,wsave,work) -c -c subroutine hrfftb computes the real perodic sequence of m -c sequences from their fourier coefficients (fourier synthesis). -c the transform is defined below at output parameter r. -c -c input parameters -c -c m the number of sequences. -c -c n the length of all m sequences. the method is most -c efficient when n is a product of small primes. n may -c change as long as different work arrays are provided -c -c r r(m,n) is a two dimensional real array that contains -c the fourier coefficients of m sequences each with -c length n. -c -c mdimr the first dimension of the r array as it appears -c in the program that calls hrfftb. mdimr must be -c greater than or equal to m. -c -c wsave a work array which must be dimensioned at least 2*n+15. -c in the program that calls hrfftb. the wsave array must be -c initialized by calling subroutine hrffti(n,wsave) and a -c different wsave array must be used for each different -c value of n. this initialization does not have to be -c repeated so long as n remains unchanged thus subsequent -c transforms can be obtained faster than the first. -c the same wsave array can be used by hrfftf and hrfftb. -c -c work a real work array with m*n locations. -c -c -c output parameters -c -c r for all j=1,...,m -c -c for n even and for i = 1,...,n -c -c r(j,i) = r(j,1)+(-1)**(i-1)*r(j,n) -c -c plus the sum from k=2 to k=n/2 of -c -c 2.*r(j,2*k-2)*cos((k-1)*(i-1)*2*pi/n) -c -c -2.*r(j,2*k-1)*sin((k-1)*(i-1)*2*pi/n) -c -c for n odd and for i = 1,...,n -c -c r(j,i) = r(j,1) plus the sum from k=2 to k=(n+1)/2 of -c -c 2.*r(j,2*k-2)*cos((k-1)*(i-1)*2*pi/n) -c -c -2.*r(j,2*k-1)*sin((k-1)*(i-1)*2*pi/n) -c -c ***** note -c this transform is unnormalized since a call of hrfftf -c followed by a call of hrfftb will multiply the input -c sequence by n. -c -c wsave contains results which must not be destroyed between -c calls of hrfftb or hrfftf. -c -c work a real work array with m*n locations that does not -c have to be saved -c -c ********************************************************************** -c -c -c - subroutine hrffti (n,wsave) - dimension wsave(n+15) - common /hrf/ tfft - tfft = 0. - if (n .eq. 1) return - call hrfti1 (n,wsave(1),wsave(n+1)) - return - end - subroutine hrfti1 (n,wa,fac) -c -c a multiple fft package for spherepack -c - dimension wa(n) ,fac(15) ,ntryh(4) - double precision tpi,argh,argld,arg - data ntryh(1),ntryh(2),ntryh(3),ntryh(4)/4,2,3,5/ - nl = n - nf = 0 - j = 0 - 101 j = j+1 - if (j-4) 102,102,103 - 102 ntry = ntryh(j) - go to 104 - 103 ntry = ntry+2 - 104 nq = nl/ntry - nr = nl-ntry*nq - if (nr) 101,105,101 - 105 nf = nf+1 - fac(nf+2) = ntry - nl = nq - if (ntry .ne. 2) go to 107 - if (nf .eq. 1) go to 107 - do 106 i=2,nf - ib = nf-i+2 - fac(ib+2) = fac(ib+1) - 106 continue - fac(3) = 2 - 107 if (nl .ne. 1) go to 104 - fac(1) = n - fac(2) = nf - tpi = 8.d0*datan(1.d0) - argh = tpi/float(n) - is = 0 - nfm1 = nf-1 - l1 = 1 - if (nfm1 .eq. 0) return - do 110 k1=1,nfm1 - ip = fac(k1+2) - ld = 0 - l2 = l1*ip - ido = n/l2 - ipm = ip-1 - do 109 j=1,ipm - ld = ld+l1 - i = is - argld = float(ld)*argh - fi = 0. - do 108 ii=3,ido,2 - i = i+2 - fi = fi+1. - arg = fi*argld - wa(i-1) = dcos(arg) - wa(i) = dsin(arg) - 108 continue - is = is+ido - 109 continue - l1 = l2 - 110 continue - return - end - subroutine hrfftf (m,n,r,mdimr,whrfft,work) -c -c a multiple fft package for spherepack -c - dimension r(mdimr,n) ,work(1) ,whrfft(n+15) - common /hrf/ tfft - if (n .eq. 1) return -c tstart = second(dum) - call hrftf1 (m,n,r,mdimr,work,whrfft,whrfft(n+1)) -c tfft = tfft+second(dum)-tstart - return - end - subroutine hrftf1 (m,n,c,mdimc,ch,wa,fac) -c -c a multiple fft package for spherepack -c - dimension ch(m,n) ,c(mdimc,n) ,wa(n) ,fac(15) - nf = fac(2) - na = 1 - l2 = n - iw = n - do 111 k1=1,nf - kh = nf-k1 - ip = fac(kh+3) - l1 = l2/ip - ido = n/l2 - idl1 = ido*l1 - iw = iw-(ip-1)*ido - na = 1-na - if (ip .ne. 4) go to 102 - ix2 = iw+ido - ix3 = ix2+ido - if (na .ne. 0) go to 101 - call hradf4 (m,ido,l1,c,mdimc,ch,m,wa(iw),wa(ix2),wa(ix3)) - go to 110 - 101 call hradf4 (m,ido,l1,ch,m,c,mdimc,wa(iw),wa(ix2),wa(ix3)) - go to 110 - 102 if (ip .ne. 2) go to 104 - if (na .ne. 0) go to 103 - call hradf2 (m,ido,l1,c,mdimc,ch,m,wa(iw)) - go to 110 - 103 call hradf2 (m,ido,l1,ch,m,c,mdimc,wa(iw)) - go to 110 - 104 if (ip .ne. 3) go to 106 - ix2 = iw+ido - if (na .ne. 0) go to 105 - call hradf3 (m,ido,l1,c,mdimc,ch,m,wa(iw),wa(ix2)) - go to 110 - 105 call hradf3 (m,ido,l1,ch,m,c,mdimc,wa(iw),wa(ix2)) - go to 110 - 106 if (ip .ne. 5) go to 108 - ix2 = iw+ido - ix3 = ix2+ido - ix4 = ix3+ido - if (na .ne. 0) go to 107 - call hradf5(m,ido,l1,c,mdimc,ch,m,wa(iw),wa(ix2),wa(ix3),wa(ix4)) - go to 110 - 107 call hradf5(m,ido,l1,ch,m,c,mdimc,wa(iw),wa(ix2),wa(ix3),wa(ix4)) - go to 110 - 108 if (ido .eq. 1) na = 1-na - if (na .ne. 0) go to 109 - call hradfg (m,ido,ip,l1,idl1,c,c,c,mdimc,ch,ch,m,wa(iw)) - na = 1 - go to 110 - 109 call hradfg (m,ido,ip,l1,idl1,ch,ch,ch,m,c,c,mdimc,wa(iw)) - na = 0 - 110 l2 = l1 - 111 continue - if (na .eq. 1) return - do 112 j=1,n - do 112 i=1,m - c(i,j) = ch(i,j) - 112 continue - return - end - subroutine hradf4 (mp,ido,l1,cc,mdimcc,ch,mdimch,wa1,wa2,wa3) -c -c a multiple fft package for spherepack -c - dimension cc(mdimcc,ido,l1,4) ,ch(mdimch,ido,4,l1) , - 1 wa1(ido) ,wa2(ido) ,wa3(ido) - hsqt2=sqrt(2.)/2. - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,1,k) = (cc(m,1,k,2)+cc(m,1,k,4)) - 1 +(cc(m,1,k,1)+cc(m,1,k,3)) - ch(m,ido,4,k) = (cc(m,1,k,1)+cc(m,1,k,3)) - 1 -(cc(m,1,k,2)+cc(m,1,k,4)) - ch(m,ido,2,k) = cc(m,1,k,1)-cc(m,1,k,3) - ch(m,1,3,k) = cc(m,1,k,4)-cc(m,1,k,2) - 1001 continue - 101 continue - if (ido-2) 107,105,102 - 102 idp2 = ido+2 - do 104 k=1,l1 - do 103 i=3,ido,2 - ic = idp2-i - do 1003 m=1,mp - ch(m,i-1,1,k) = ((wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2))+(wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4)))+(cc(m,i-1,k,1)+(wa2(i-2)*cc(m,i-1,k,3)+ - 1 wa2(i-1)*cc(m,i,k,3))) - ch(m,ic-1,4,k) = (cc(m,i-1,k,1)+(wa2(i-2)*cc(m,i-1,k,3)+ - 1 wa2(i-1)*cc(m,i,k,3)))-((wa1(i-2)*cc(m,i-1,k,2)+ - 1 wa1(i-1)*cc(m,i,k,2))+(wa3(i-2)*cc(m,i-1,k,4)+ - 1 wa3(i-1)*cc(m,i,k,4))) - ch(m,i,1,k) = ((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))+(cc(m,i,k,1)+(wa2(i-2)*cc(m,i,k,3)- - 1 wa2(i-1)*cc(m,i-1,k,3))) - ch(m,ic,4,k) = ((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))-(cc(m,i,k,1)+(wa2(i-2)*cc(m,i,k,3)- - 1 wa2(i-1)*cc(m,i-1,k,3))) - ch(m,i-1,3,k) = ((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))+(cc(m,i-1,k,1)-(wa2(i-2)*cc(m,i-1,k,3)+ - 1 wa2(i-1)*cc(m,i,k,3))) - ch(m,ic-1,2,k) = (cc(m,i-1,k,1)-(wa2(i-2)*cc(m,i-1,k,3)+ - 1 wa2(i-1)*cc(m,i,k,3)))-((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4))) - ch(m,i,3,k) = ((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))+(cc(m,i,k,1)-(wa2(i-2)*cc(m,i,k,3)- - 1 wa2(i-1)*cc(m,i-1,k,3))) - ch(m,ic,2,k) = ((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))-(cc(m,i,k,1)-(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))) - 1003 continue - 103 continue - 104 continue - if (mod(ido,2) .eq. 1) return - 105 continue - do 106 k=1,l1 - do 1006 m=1,mp - ch(m,ido,1,k) = (hsqt2*(cc(m,ido,k,2)-cc(m,ido,k,4)))+ - 1 cc(m,ido,k,1) - ch(m,ido,3,k) = cc(m,ido,k,1)-(hsqt2*(cc(m,ido,k,2)- - 1 cc(m,ido,k,4))) - ch(m,1,2,k) = (-hsqt2*(cc(m,ido,k,2)+cc(m,ido,k,4)))- - 1 cc(m,ido,k,3) - ch(m,1,4,k) = (-hsqt2*(cc(m,ido,k,2)+cc(m,ido,k,4)))+ - 1 cc(m,ido,k,3) - 1006 continue - 106 continue - 107 return - end - subroutine hradf2 (mp,ido,l1,cc,mdimcc,ch,mdimch,wa1) -c -c a multiple fft package for spherepack -c - dimension ch(mdimch,ido,2,l1) ,cc(mdimcc,ido,l1,2) , - 1 wa1(ido) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,1,k) = cc(m,1,k,1)+cc(m,1,k,2) - ch(m,ido,2,k) = cc(m,1,k,1)-cc(m,1,k,2) - 1001 continue - 101 continue - if (ido-2) 107,105,102 - 102 idp2 = ido+2 - do 104 k=1,l1 - do 103 i=3,ido,2 - ic = idp2-i - do 1003 m=1,mp - ch(m,i,1,k) = cc(m,i,k,1)+(wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2)) - ch(m,ic,2,k) = (wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))-cc(m,i,k,1) - ch(m,i-1,1,k) = cc(m,i-1,k,1)+(wa1(i-2)*cc(m,i-1,k,2)+ - 1 wa1(i-1)*cc(m,i,k,2)) - ch(m,ic-1,2,k) = cc(m,i-1,k,1)-(wa1(i-2)*cc(m,i-1,k,2)+ - 1 wa1(i-1)*cc(m,i,k,2)) - 1003 continue - 103 continue - 104 continue - if (mod(ido,2) .eq. 1) return - 105 do 106 k=1,l1 - do 1006 m=1,mp - ch(m,1,2,k) = -cc(m,ido,k,2) - ch(m,ido,1,k) = cc(m,ido,k,1) - 1006 continue - 106 continue - 107 return - end - subroutine hradf3 (mp,ido,l1,cc,mdimcc,ch,mdimch,wa1,wa2) -c -c a multiple fft package for spherepack -c - dimension ch(mdimch,ido,3,l1) ,cc(mdimcc,ido,l1,3) , - 1 wa1(ido) ,wa2(ido) - arg=2.*pimach()/3. - taur=cos(arg) - taui=sin(arg) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,1,k) = cc(m,1,k,1)+(cc(m,1,k,2)+cc(m,1,k,3)) - ch(m,1,3,k) = taui*(cc(m,1,k,3)-cc(m,1,k,2)) - ch(m,ido,2,k) = cc(m,1,k,1)+taur* - 1 (cc(m,1,k,2)+cc(m,1,k,3)) - 1001 continue - 101 continue - if (ido .eq. 1) return - idp2 = ido+2 - do 103 k=1,l1 - do 102 i=3,ido,2 - ic = idp2-i - do 1002 m=1,mp - ch(m,i-1,1,k) = cc(m,i-1,k,1)+((wa1(i-2)*cc(m,i-1,k,2)+ - 1 wa1(i-1)*cc(m,i,k,2))+(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3))) - ch(m,i,1,k) = cc(m,i,k,1)+((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))+(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))) - ch(m,i-1,3,k) = (cc(m,i-1,k,1)+taur*((wa1(i-2)* - 1 cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa2(i-2)* - 1 cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))))+(taui*((wa1(i-2)* - 1 cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa2(i-2)* - 1 cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3)))) - ch(m,ic-1,2,k) = (cc(m,i-1,k,1)+taur*((wa1(i-2)* - 1 cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa2(i-2)* - 1 cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))))-(taui*((wa1(i-2)* - 1 cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa2(i-2)* - 1 cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3)))) - ch(m,i,3,k) = (cc(m,i,k,1)+taur*((wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2))+(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))))+(taui*((wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))) - ch(m,ic,2,k) = (taui*((wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2))))-(cc(m,i,k,1)+taur*((wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2))+(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3)))) - 1002 continue - 102 continue - 103 continue - return - end - subroutine hradf5 (mp,ido,l1,cc,mdimcc,ch,mdimch, - 1 wa1,wa2,wa3,wa4) -c -c a multiple fft package for spherepack -c - dimension cc(mdimcc,ido,l1,5) ,ch(mdimch,ido,5,l1) , - 1 wa1(ido) ,wa2(ido) ,wa3(ido) ,wa4(ido) - arg=2.*pimach()/5. - tr11=cos(arg) - ti11=sin(arg) - tr12=cos(2.*arg) - ti12=sin(2.*arg) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,1,k) = cc(m,1,k,1)+(cc(m,1,k,5)+cc(m,1,k,2))+ - 1 (cc(m,1,k,4)+cc(m,1,k,3)) - ch(m,ido,2,k) = cc(m,1,k,1)+tr11*(cc(m,1,k,5)+cc(m,1,k,2))+ - 1 tr12*(cc(m,1,k,4)+cc(m,1,k,3)) - ch(m,1,3,k) = ti11*(cc(m,1,k,5)-cc(m,1,k,2))+ti12* - 1 (cc(m,1,k,4)-cc(m,1,k,3)) - ch(m,ido,4,k) = cc(m,1,k,1)+tr12*(cc(m,1,k,5)+cc(m,1,k,2))+ - 1 tr11*(cc(m,1,k,4)+cc(m,1,k,3)) - ch(m,1,5,k) = ti12*(cc(m,1,k,5)-cc(m,1,k,2))-ti11* - 1 (cc(m,1,k,4)-cc(m,1,k,3)) - 1001 continue - 101 continue - if (ido .eq. 1) return - idp2 = ido+2 - do 103 k=1,l1 - do 102 i=3,ido,2 - ic = idp2-i - do 1002 m=1,mp - ch(m,i-1,1,k) = cc(m,i-1,k,1)+((wa1(i-2)*cc(m,i-1,k,2)+ - 1 wa1(i-1)*cc(m,i,k,2))+(wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)* - 1 cc(m,i,k,5)))+((wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3))+(wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))) - ch(m,i,1,k) = cc(m,i,k,1)+((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* - 1 cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* - 1 cc(m,i-1,k,5)))+((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4))) - ch(m,i-1,3,k) = cc(m,i-1,k,1)+tr11* - 1 ( wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2) - 1 +wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5))+tr12* - 1 ( wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3) - 1 +wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))+ti11* - 1 ( wa1(i-2)*cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2) - 1 -(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)*cc(m,i-1,k,5)))+ti12* - 1 ( wa2(i-2)*cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3) - 1 -(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)*cc(m,i-1,k,4))) - ch(m,ic-1,2,k) = cc(m,i-1,k,1)+tr11* - 1 ( wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2) - 1 +wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5))+tr12* - 1 ( wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3) - 1 +wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))-(ti11* - 1 ( wa1(i-2)*cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2) - 1 -(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)*cc(m,i-1,k,5)))+ti12* - 1 ( wa2(i-2)*cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3) - 1 -(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)*cc(m,i-1,k,4)))) - ch(m,i,3,k) = (cc(m,i,k,1)+tr11*((wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* - 1 cc(m,i-1,k,5)))+tr12*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4))))+(ti11*((wa4(i-2)*cc(m,i-1,k,5)+ - 1 wa4(i-1)*cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))+ti12*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3)))) - ch(m,ic,2,k) = (ti11*((wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)* - 1 cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))+ti12*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3))))-(cc(m,i,k,1)+tr11*((wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* - 1 cc(m,i-1,k,5)))+tr12*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))) - ch(m,i-1,5,k) = (cc(m,i-1,k,1)+tr12*((wa1(i-2)* - 1 cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa4(i-2)* - 1 cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5)))+tr11*((wa2(i-2)* - 1 cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))+(wa3(i-2)* - 1 cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))))+(ti12*((wa1(i-2)* - 1 cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa4(i-2)*cc(m,i,k,5)- - 1 wa4(i-1)*cc(m,i-1,k,5)))-ti11*((wa2(i-2)*cc(m,i,k,3)- - 1 wa2(i-1)*cc(m,i-1,k,3))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))) - ch(m,ic-1,4,k) = (cc(m,i-1,k,1)+tr12*((wa1(i-2)* - 1 cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa4(i-2)* - 1 cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5)))+tr11*((wa2(i-2)* - 1 cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))+(wa3(i-2)* - 1 cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))))-(ti12*((wa1(i-2)* - 1 cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa4(i-2)*cc(m,i,k,5)- - 1 wa4(i-1)*cc(m,i-1,k,5)))-ti11*((wa2(i-2)*cc(m,i,k,3)- - 1 wa2(i-1)*cc(m,i-1,k,3))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))) - ch(m,i,5,k) = (cc(m,i,k,1)+tr12*((wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* - 1 cc(m,i-1,k,5)))+tr11*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4))))+(ti12*((wa4(i-2)*cc(m,i-1,k,5)+ - 1 wa4(i-1)*cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))-ti11*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3)))) - ch(m,ic,4,k) = (ti12*((wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)* - 1 cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* - 1 cc(m,i,k,2)))-ti11*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* - 1 cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* - 1 cc(m,i,k,3))))-(cc(m,i,k,1)+tr12*((wa1(i-2)*cc(m,i,k,2)- - 1 wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* - 1 cc(m,i-1,k,5)))+tr11*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* - 1 cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* - 1 cc(m,i-1,k,4)))) - 1002 continue - 102 continue - 103 continue - return - end - subroutine hradfg (mp,ido,ip,l1,idl1,cc,c1,c2,mdimcc, - 1 ch,ch2,mdimch,wa) -c -c a multiple fft package for spherepack -c - dimension ch(mdimch,ido,l1,ip) ,cc(mdimcc,ido,ip,l1) , - 1 c1(mdimcc,ido,l1,ip) ,c2(mdimcc,idl1,ip), - 2 ch2(mdimch,idl1,ip) ,wa(ido) - tpi=2.*pimach() - arg = tpi/float(ip) - dcp = cos(arg) - dsp = sin(arg) - ipph = (ip+1)/2 - ipp2 = ip+2 - idp2 = ido+2 - nbd = (ido-1)/2 - if (ido .eq. 1) go to 119 - do 101 ik=1,idl1 - do 1001 m=1,mp - ch2(m,ik,1) = c2(m,ik,1) - 1001 continue - 101 continue - do 103 j=2,ip - do 102 k=1,l1 - do 1002 m=1,mp - ch(m,1,k,j) = c1(m,1,k,j) - 1002 continue - 102 continue - 103 continue - if (nbd .gt. l1) go to 107 - is = -ido - do 106 j=2,ip - is = is+ido - idij = is - do 105 i=3,ido,2 - idij = idij+2 - do 104 k=1,l1 - do 1004 m=1,mp - ch(m,i-1,k,j) = wa(idij-1)*c1(m,i-1,k,j)+wa(idij) - 1 *c1(m,i,k,j) - ch(m,i,k,j) = wa(idij-1)*c1(m,i,k,j)-wa(idij) - 1 *c1(m,i-1,k,j) - 1004 continue - 104 continue - 105 continue - 106 continue - go to 111 - 107 is = -ido - do 110 j=2,ip - is = is+ido - do 109 k=1,l1 - idij = is - do 108 i=3,ido,2 - idij = idij+2 - do 1008 m=1,mp - ch(m,i-1,k,j) = wa(idij-1)*c1(m,i-1,k,j)+wa(idij) - 1 *c1(m,i,k,j) - ch(m,i,k,j) = wa(idij-1)*c1(m,i,k,j)-wa(idij) - 1 *c1(m,i-1,k,j) - 1008 continue - 108 continue - 109 continue - 110 continue - 111 if (nbd .lt. l1) go to 115 - do 114 j=2,ipph - jc = ipp2-j - do 113 k=1,l1 - do 112 i=3,ido,2 - do 1012 m=1,mp - c1(m,i-1,k,j) = ch(m,i-1,k,j)+ch(m,i-1,k,jc) - c1(m,i-1,k,jc) = ch(m,i,k,j)-ch(m,i,k,jc) - c1(m,i,k,j) = ch(m,i,k,j)+ch(m,i,k,jc) - c1(m,i,k,jc) = ch(m,i-1,k,jc)-ch(m,i-1,k,j) - 1012 continue - 112 continue - 113 continue - 114 continue - go to 121 - 115 do 118 j=2,ipph - jc = ipp2-j - do 117 i=3,ido,2 - do 116 k=1,l1 - do 1016 m=1,mp - c1(m,i-1,k,j) = ch(m,i-1,k,j)+ch(m,i-1,k,jc) - c1(m,i-1,k,jc) = ch(m,i,k,j)-ch(m,i,k,jc) - c1(m,i,k,j) = ch(m,i,k,j)+ch(m,i,k,jc) - c1(m,i,k,jc) = ch(m,i-1,k,jc)-ch(m,i-1,k,j) - 1016 continue - 116 continue - 117 continue - 118 continue - go to 121 - 119 do 120 ik=1,idl1 - do 1020 m=1,mp - c2(m,ik,1) = ch2(m,ik,1) - 1020 continue - 120 continue - 121 do 123 j=2,ipph - jc = ipp2-j - do 122 k=1,l1 - do 1022 m=1,mp - c1(m,1,k,j) = ch(m,1,k,j)+ch(m,1,k,jc) - c1(m,1,k,jc) = ch(m,1,k,jc)-ch(m,1,k,j) - 1022 continue - 122 continue - 123 continue -c - ar1 = 1. - ai1 = 0. - do 127 l=2,ipph - lc = ipp2-l - ar1h = dcp*ar1-dsp*ai1 - ai1 = dcp*ai1+dsp*ar1 - ar1 = ar1h - do 124 ik=1,idl1 - do 1024 m=1,mp - ch2(m,ik,l) = c2(m,ik,1)+ar1*c2(m,ik,2) - ch2(m,ik,lc) = ai1*c2(m,ik,ip) - 1024 continue - 124 continue - dc2 = ar1 - ds2 = ai1 - ar2 = ar1 - ai2 = ai1 - do 126 j=3,ipph - jc = ipp2-j - ar2h = dc2*ar2-ds2*ai2 - ai2 = dc2*ai2+ds2*ar2 - ar2 = ar2h - do 125 ik=1,idl1 - do 1025 m=1,mp - ch2(m,ik,l) = ch2(m,ik,l)+ar2*c2(m,ik,j) - ch2(m,ik,lc) = ch2(m,ik,lc)+ai2*c2(m,ik,jc) - 1025 continue - 125 continue - 126 continue - 127 continue - do 129 j=2,ipph - do 128 ik=1,idl1 - do 1028 m=1,mp - ch2(m,ik,1) = ch2(m,ik,1)+c2(m,ik,j) - 1028 continue - 128 continue - 129 continue -c - if (ido .lt. l1) go to 132 - do 131 k=1,l1 - do 130 i=1,ido - do 1030 m=1,mp - cc(m,i,1,k) = ch(m,i,k,1) - 1030 continue - 130 continue - 131 continue - go to 135 - 132 do 134 i=1,ido - do 133 k=1,l1 - do 1033 m=1,mp - cc(m,i,1,k) = ch(m,i,k,1) - 1033 continue - 133 continue - 134 continue - 135 do 137 j=2,ipph - jc = ipp2-j - j2 = j+j - do 136 k=1,l1 - do 1036 m=1,mp - cc(m,ido,j2-2,k) = ch(m,1,k,j) - cc(m,1,j2-1,k) = ch(m,1,k,jc) - 1036 continue - 136 continue - 137 continue - if (ido .eq. 1) return - if (nbd .lt. l1) go to 141 - do 140 j=2,ipph - jc = ipp2-j - j2 = j+j - do 139 k=1,l1 - do 138 i=3,ido,2 - ic = idp2-i - do 1038 m=1,mp - cc(m,i-1,j2-1,k) = ch(m,i-1,k,j)+ch(m,i-1,k,jc) - cc(m,ic-1,j2-2,k) = ch(m,i-1,k,j)-ch(m,i-1,k,jc) - cc(m,i,j2-1,k) = ch(m,i,k,j)+ch(m,i,k,jc) - cc(m,ic,j2-2,k) = ch(m,i,k,jc)-ch(m,i,k,j) - 1038 continue - 138 continue - 139 continue - 140 continue - return - 141 do 144 j=2,ipph - jc = ipp2-j - j2 = j+j - do 143 i=3,ido,2 - ic = idp2-i - do 142 k=1,l1 - do 1042 m=1,mp - cc(m,i-1,j2-1,k) = ch(m,i-1,k,j)+ch(m,i-1,k,jc) - cc(m,ic-1,j2-2,k) = ch(m,i-1,k,j)-ch(m,i-1,k,jc) - cc(m,i,j2-1,k) = ch(m,i,k,j)+ch(m,i,k,jc) - cc(m,ic,j2-2,k) = ch(m,i,k,jc)-ch(m,i,k,j) - 1042 continue - 142 continue - 143 continue - 144 continue - return - end - function pimach() - pimach=3.14159265358979 - return - end - subroutine hrfftb(m,n,r,mdimr,whrfft,work) -c -c a multiple fft package for spherepack -c - dimension r(mdimr,n) ,work(1) ,whrfft(n+15) - common /hrf/ tfft - if (n .eq. 1) return -c tstart = second(dum) - call hrftb1 (m,n,r,mdimr,work,whrfft,whrfft(n+1)) -c tfft = tfft+second(dum)-tstart - return - end - subroutine hrftb1 (m,n,c,mdimc,ch,wa,fac) -c -c a multiple fft package for spherepack -c - dimension ch(m,n), c(mdimc,n), wa(n) ,fac(15) - nf = fac(2) - na = 0 - l1 = 1 - iw = 1 - do 116 k1=1,nf - ip = fac(k1+2) - l2 = ip*l1 - ido = n/l2 - idl1 = ido*l1 - if (ip .ne. 4) go to 103 - ix2 = iw+ido - ix3 = ix2+ido - if (na .ne. 0) go to 101 - call hradb4 (m,ido,l1,c,mdimc,ch,m,wa(iw),wa(ix2),wa(ix3)) - go to 102 - 101 call hradb4 (m,ido,l1,ch,m,c,mdimc,wa(iw),wa(ix2),wa(ix3)) - 102 na = 1-na - go to 115 - 103 if (ip .ne. 2) go to 106 - if (na .ne. 0) go to 104 - call hradb2 (m,ido,l1,c,mdimc,ch,m,wa(iw)) - go to 105 - 104 call hradb2 (m,ido,l1,ch,m,c,mdimc,wa(iw)) - 105 na = 1-na - go to 115 - 106 if (ip .ne. 3) go to 109 - ix2 = iw+ido - if (na .ne. 0) go to 107 - call hradb3 (m,ido,l1,c,mdimc,ch,m,wa(iw),wa(ix2)) - go to 108 - 107 call hradb3 (m,ido,l1,ch,m,c,mdimc,wa(iw),wa(ix2)) - 108 na = 1-na - go to 115 - 109 if (ip .ne. 5) go to 112 - ix2 = iw+ido - ix3 = ix2+ido - ix4 = ix3+ido - if (na .ne. 0) go to 110 - call hradb5 (m,ido,l1,c,mdimc,ch,m,wa(iw),wa(ix2),wa(ix3),wa(ix4)) - go to 111 - 110 call hradb5 (m,ido,l1,ch,m,c,mdimc,wa(iw),wa(ix2),wa(ix3),wa(ix4)) - 111 na = 1-na - go to 115 - 112 if (na .ne. 0) go to 113 - call hradbg (m,ido,ip,l1,idl1,c,c,c,mdimc,ch,ch,m,wa(iw)) - go to 114 - 113 call hradbg (m,ido,ip,l1,idl1,ch,ch,ch,m,c,c,mdimc,wa(iw)) - 114 if (ido .eq. 1) na = 1-na - 115 l1 = l2 - iw = iw+(ip-1)*ido - 116 continue - if (na .eq. 0) return - do 117 j=1,n - do 117 i=1,m - c(i,j) = ch(i,j) - 117 continue - return - end - subroutine hradbg (mp,ido,ip,l1,idl1,cc,c1,c2,mdimcc, - 1 ch,ch2,mdimch,wa) -c -c a multiple fft package for spherepack -c - dimension ch(mdimch,ido,l1,ip) ,cc(mdimcc,ido,ip,l1) , - 1 c1(mdimcc,ido,l1,ip) ,c2(mdimcc,idl1,ip), - 2 ch2(mdimch,idl1,ip) ,wa(ido) - tpi=2.*pimach() - arg = tpi/float(ip) - dcp = cos(arg) - dsp = sin(arg) - idp2 = ido+2 - nbd = (ido-1)/2 - ipp2 = ip+2 - ipph = (ip+1)/2 - if (ido .lt. l1) go to 103 - do 102 k=1,l1 - do 101 i=1,ido - do 1001 m=1,mp - ch(m,i,k,1) = cc(m,i,1,k) - 1001 continue - 101 continue - 102 continue - go to 106 - 103 do 105 i=1,ido - do 104 k=1,l1 - do 1004 m=1,mp - ch(m,i,k,1) = cc(m,i,1,k) - 1004 continue - 104 continue - 105 continue - 106 do 108 j=2,ipph - jc = ipp2-j - j2 = j+j - do 107 k=1,l1 - do 1007 m=1,mp - ch(m,1,k,j) = cc(m,ido,j2-2,k)+cc(m,ido,j2-2,k) - ch(m,1,k,jc) = cc(m,1,j2-1,k)+cc(m,1,j2-1,k) - 1007 continue - 107 continue - 108 continue - if (ido .eq. 1) go to 116 - if (nbd .lt. l1) go to 112 - do 111 j=2,ipph - jc = ipp2-j - do 110 k=1,l1 - do 109 i=3,ido,2 - ic = idp2-i - do 1009 m=1,mp - ch(m,i-1,k,j) = cc(m,i-1,2*j-1,k)+cc(m,ic-1,2*j-2,k) - ch(m,i-1,k,jc) = cc(m,i-1,2*j-1,k)-cc(m,ic-1,2*j-2,k) - ch(m,i,k,j) = cc(m,i,2*j-1,k)-cc(m,ic,2*j-2,k) - ch(m,i,k,jc) = cc(m,i,2*j-1,k)+cc(m,ic,2*j-2,k) - 1009 continue - 109 continue - 110 continue - 111 continue - go to 116 - 112 do 115 j=2,ipph - jc = ipp2-j - do 114 i=3,ido,2 - ic = idp2-i - do 113 k=1,l1 - do 1013 m=1,mp - ch(m,i-1,k,j) = cc(m,i-1,2*j-1,k)+cc(m,ic-1,2*j-2,k) - ch(m,i-1,k,jc) = cc(m,i-1,2*j-1,k)-cc(m,ic-1,2*j-2,k) - ch(m,i,k,j) = cc(m,i,2*j-1,k)-cc(m,ic,2*j-2,k) - ch(m,i,k,jc) = cc(m,i,2*j-1,k)+cc(m,ic,2*j-2,k) - 1013 continue - 113 continue - 114 continue - 115 continue - 116 ar1 = 1. - ai1 = 0. - do 120 l=2,ipph - lc = ipp2-l - ar1h = dcp*ar1-dsp*ai1 - ai1 = dcp*ai1+dsp*ar1 - ar1 = ar1h - do 117 ik=1,idl1 - do 1017 m=1,mp - c2(m,ik,l) = ch2(m,ik,1)+ar1*ch2(m,ik,2) - c2(m,ik,lc) = ai1*ch2(m,ik,ip) - 1017 continue - 117 continue - dc2 = ar1 - ds2 = ai1 - ar2 = ar1 - ai2 = ai1 - do 119 j=3,ipph - jc = ipp2-j - ar2h = dc2*ar2-ds2*ai2 - ai2 = dc2*ai2+ds2*ar2 - ar2 = ar2h - do 118 ik=1,idl1 - do 1018 m=1,mp - c2(m,ik,l) = c2(m,ik,l)+ar2*ch2(m,ik,j) - c2(m,ik,lc) = c2(m,ik,lc)+ai2*ch2(m,ik,jc) - 1018 continue - 118 continue - 119 continue - 120 continue - do 122 j=2,ipph - do 121 ik=1,idl1 - do 1021 m=1,mp - ch2(m,ik,1) = ch2(m,ik,1)+ch2(m,ik,j) - 1021 continue - 121 continue - 122 continue - do 124 j=2,ipph - jc = ipp2-j - do 123 k=1,l1 - do 1023 m=1,mp - ch(m,1,k,j) = c1(m,1,k,j)-c1(m,1,k,jc) - ch(m,1,k,jc) = c1(m,1,k,j)+c1(m,1,k,jc) - 1023 continue - 123 continue - 124 continue - if (ido .eq. 1) go to 132 - if (nbd .lt. l1) go to 128 - do 127 j=2,ipph - jc = ipp2-j - do 126 k=1,l1 - do 125 i=3,ido,2 - do 1025 m=1,mp - ch(m,i-1,k,j) = c1(m,i-1,k,j)-c1(m,i,k,jc) - ch(m,i-1,k,jc) = c1(m,i-1,k,j)+c1(m,i,k,jc) - ch(m,i,k,j) = c1(m,i,k,j)+c1(m,i-1,k,jc) - ch(m,i,k,jc) = c1(m,i,k,j)-c1(m,i-1,k,jc) - 1025 continue - 125 continue - 126 continue - 127 continue - go to 132 - 128 do 131 j=2,ipph - jc = ipp2-j - do 130 i=3,ido,2 - do 129 k=1,l1 - do 1029 m=1,mp - ch(m,i-1,k,j) = c1(m,i-1,k,j)-c1(m,i,k,jc) - ch(m,i-1,k,jc) = c1(m,i-1,k,j)+c1(m,i,k,jc) - ch(m,i,k,j) = c1(m,i,k,j)+c1(m,i-1,k,jc) - ch(m,i,k,jc) = c1(m,i,k,j)-c1(m,i-1,k,jc) - 1029 continue - 129 continue - 130 continue - 131 continue - 132 continue - if (ido .eq. 1) return - do 133 ik=1,idl1 - do 1033 m=1,mp - c2(m,ik,1) = ch2(m,ik,1) - 1033 continue - 133 continue - do 135 j=2,ip - do 134 k=1,l1 - do 1034 m=1,mp - c1(m,1,k,j) = ch(m,1,k,j) - 1034 continue - 134 continue - 135 continue - if (nbd .gt. l1) go to 139 - is = -ido - do 138 j=2,ip - is = is+ido - idij = is - do 137 i=3,ido,2 - idij = idij+2 - do 136 k=1,l1 - do 1036 m=1,mp - c1(m,i-1,k,j) = wa(idij-1)*ch(m,i-1,k,j)-wa(idij)* - 1 ch(m,i,k,j) - c1(m,i,k,j) = wa(idij-1)*ch(m,i,k,j)+wa(idij)* - 1 ch(m,i-1,k,j) - 1036 continue - 136 continue - 137 continue - 138 continue - go to 143 - 139 is = -ido - do 142 j=2,ip - is = is+ido - do 141 k=1,l1 - idij = is - do 140 i=3,ido,2 - idij = idij+2 - do 1040 m=1,mp - c1(m,i-1,k,j) = wa(idij-1)*ch(m,i-1,k,j)-wa(idij)* - 1 ch(m,i,k,j) - c1(m,i,k,j) = wa(idij-1)*ch(m,i,k,j)+wa(idij)* - 1 ch(m,i-1,k,j) - 1040 continue - 140 continue - 141 continue - 142 continue - 143 return - end - subroutine hradb4 (mp,ido,l1,cc,mdimcc,ch,mdimch,wa1,wa2,wa3) -c -c a multiple fft package for spherepack -c - dimension cc(mdimcc,ido,4,l1) ,ch(mdimch,ido,l1,4) , - 1 wa1(ido) ,wa2(ido) ,wa3(ido) - sqrt2=sqrt(2.) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,k,3) = (cc(m,1,1,k)+cc(m,ido,4,k)) - 1 -(cc(m,ido,2,k)+cc(m,ido,2,k)) - ch(m,1,k,1) = (cc(m,1,1,k)+cc(m,ido,4,k)) - 1 +(cc(m,ido,2,k)+cc(m,ido,2,k)) - ch(m,1,k,4) = (cc(m,1,1,k)-cc(m,ido,4,k)) - 1 +(cc(m,1,3,k)+cc(m,1,3,k)) - ch(m,1,k,2) = (cc(m,1,1,k)-cc(m,ido,4,k)) - 1 -(cc(m,1,3,k)+cc(m,1,3,k)) - 1001 continue - 101 continue - if (ido-2) 107,105,102 - 102 idp2 = ido+2 - do 104 k=1,l1 - do 103 i=3,ido,2 - ic = idp2-i - do 1002 m=1,mp - ch(m,i-1,k,1) = (cc(m,i-1,1,k)+cc(m,ic-1,4,k)) - 1 +(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - ch(m,i,k,1) = (cc(m,i,1,k)-cc(m,ic,4,k)) - 1 +(cc(m,i,3,k)-cc(m,ic,2,k)) - ch(m,i-1,k,2)=wa1(i-2)*((cc(m,i-1,1,k)-cc(m,ic-1,4,k)) - 1 -(cc(m,i,3,k)+cc(m,ic,2,k)))-wa1(i-1) - 1 *((cc(m,i,1,k)+cc(m,ic,4,k))+(cc(m,i-1,3,k)-cc(m,ic-1,2,k))) - ch(m,i,k,2)=wa1(i-2)*((cc(m,i,1,k)+cc(m,ic,4,k)) - 1 +(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))+wa1(i-1) - 1 *((cc(m,i-1,1,k)-cc(m,ic-1,4,k))-(cc(m,i,3,k)+cc(m,ic,2,k))) - ch(m,i-1,k,3)=wa2(i-2)*((cc(m,i-1,1,k)+cc(m,ic-1,4,k)) - 1 -(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))-wa2(i-1) - 1 *((cc(m,i,1,k)-cc(m,ic,4,k))-(cc(m,i,3,k)-cc(m,ic,2,k))) - ch(m,i,k,3)=wa2(i-2)*((cc(m,i,1,k)-cc(m,ic,4,k)) - 1 -(cc(m,i,3,k)-cc(m,ic,2,k)))+wa2(i-1) - 1 *((cc(m,i-1,1,k)+cc(m,ic-1,4,k))-(cc(m,i-1,3,k) - 1 +cc(m,ic-1,2,k))) - ch(m,i-1,k,4)=wa3(i-2)*((cc(m,i-1,1,k)-cc(m,ic-1,4,k)) - 1 +(cc(m,i,3,k)+cc(m,ic,2,k)))-wa3(i-1) - 1 *((cc(m,i,1,k)+cc(m,ic,4,k))-(cc(m,i-1,3,k)-cc(m,ic-1,2,k))) - ch(m,i,k,4)=wa3(i-2)*((cc(m,i,1,k)+cc(m,ic,4,k)) - 1 -(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))+wa3(i-1) - 1 *((cc(m,i-1,1,k)-cc(m,ic-1,4,k))+(cc(m,i,3,k)+cc(m,ic,2,k))) - 1002 continue - 103 continue - 104 continue - if (mod(ido,2) .eq. 1) return - 105 continue - do 106 k=1,l1 - do 1003 m=1,mp - ch(m,ido,k,1) = (cc(m,ido,1,k)+cc(m,ido,3,k)) - 1 +(cc(m,ido,1,k)+cc(m,ido,3,k)) - ch(m,ido,k,2) = sqrt2*((cc(m,ido,1,k)-cc(m,ido,3,k)) - 1 -(cc(m,1,2,k)+cc(m,1,4,k))) - ch(m,ido,k,3) = (cc(m,1,4,k)-cc(m,1,2,k)) - 1 +(cc(m,1,4,k)-cc(m,1,2,k)) - ch(m,ido,k,4) = -sqrt2*((cc(m,ido,1,k)-cc(m,ido,3,k)) - 1 +(cc(m,1,2,k)+cc(m,1,4,k))) - 1003 continue - 106 continue - 107 return - end - subroutine hradb2 (mp,ido,l1,cc,mdimcc,ch,mdimch,wa1) -c -c a multiple fft package for spherepack -c - dimension cc(mdimcc,ido,2,l1) ,ch(mdimch,ido,l1,2), - 1 wa1(ido) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,k,1) = cc(m,1,1,k)+cc(m,ido,2,k) - ch(m,1,k,2) = cc(m,1,1,k)-cc(m,ido,2,k) - 1001 continue - 101 continue - if (ido-2) 107,105,102 - 102 idp2 = ido+2 - do 104 k=1,l1 - do 103 i=3,ido,2 - ic = idp2-i - do 1002 m=1,mp - ch(m,i-1,k,1) = cc(m,i-1,1,k)+cc(m,ic-1,2,k) - ch(m,i,k,1) = cc(m,i,1,k)-cc(m,ic,2,k) - ch(m,i-1,k,2) = wa1(i-2)*(cc(m,i-1,1,k)-cc(m,ic-1,2,k)) - 1 -wa1(i-1)*(cc(m,i,1,k)+cc(m,ic,2,k)) - ch(m,i,k,2) = wa1(i-2)*(cc(m,i,1,k)+cc(m,ic,2,k))+wa1(i-1) - 1 *(cc(m,i-1,1,k)-cc(m,ic-1,2,k)) - 1002 continue - 103 continue - 104 continue - if (mod(ido,2) .eq. 1) return - 105 do 106 k=1,l1 - do 1003 m=1,mp - ch(m,ido,k,1) = cc(m,ido,1,k)+cc(m,ido,1,k) - ch(m,ido,k,2) = -(cc(m,1,2,k)+cc(m,1,2,k)) - 1003 continue - 106 continue - 107 return - end - subroutine hradb3 (mp,ido,l1,cc,mdimcc,ch,mdimch,wa1,wa2) -c -c a multiple fft package for spherepack -c - dimension cc(mdimcc,ido,3,l1) ,ch(mdimch,ido,l1,3), - 1 wa1(ido) ,wa2(ido) - arg=2.*pimach()/3. - taur=cos(arg) - taui=sin(arg) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,k,1) = cc(m,1,1,k)+2.*cc(m,ido,2,k) - ch(m,1,k,2) = cc(m,1,1,k)+(2.*taur)*cc(m,ido,2,k) - 1 -(2.*taui)*cc(m,1,3,k) - ch(m,1,k,3) = cc(m,1,1,k)+(2.*taur)*cc(m,ido,2,k) - 1 +2.*taui*cc(m,1,3,k) - 1001 continue - 101 continue - if (ido .eq. 1) return - idp2 = ido+2 - do 103 k=1,l1 - do 102 i=3,ido,2 - ic = idp2-i - do 1002 m=1,mp - ch(m,i-1,k,1) = cc(m,i-1,1,k)+(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - ch(m,i,k,1) = cc(m,i,1,k)+(cc(m,i,3,k)-cc(m,ic,2,k)) - ch(m,i-1,k,2) = wa1(i-2)* - 1 ((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))- - * (taui*(cc(m,i,3,k)+cc(m,ic,2,k)))) - 2 -wa1(i-1)* - 3 ((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))+ - * (taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))) - ch(m,i,k,2) = wa1(i-2)* - 4 ((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))+ - 8 (taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))) - 5 +wa1(i-1)* - 6 ((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))- - 8 (taui*(cc(m,i,3,k)+cc(m,ic,2,k)))) - ch(m,i-1,k,3) = wa2(i-2)* - 7 ((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))+ - 8 (taui*(cc(m,i,3,k)+cc(m,ic,2,k)))) - 8 -wa2(i-1)* - 9 ((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))- - 8 (taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))) - ch(m,i,k,3) = wa2(i-2)* - 1 ((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))- - 8 (taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))) - 2 +wa2(i-1)* - 3 ((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))+ - 8 (taui*(cc(m,i,3,k)+cc(m,ic,2,k)))) - 1002 continue - 102 continue - 103 continue - return - end - subroutine hradb5 (mp,ido,l1,cc,mdimcc,ch,mdimch, - 1 wa1,wa2,wa3,wa4) -c -c a multiple fft package for spherepack -c - dimension cc(mdimcc,ido,5,l1) ,ch(mdimch,ido,l1,5), - 1 wa1(ido) ,wa2(ido) ,wa3(ido) ,wa4(ido) - arg=2.*pimach()/5. - tr11=cos(arg) - ti11=sin(arg) - tr12=cos(2.*arg) - ti12=sin(2.*arg) - do 101 k=1,l1 - do 1001 m=1,mp - ch(m,1,k,1) = cc(m,1,1,k)+2.*cc(m,ido,2,k)+2.*cc(m,ido,4,k) - ch(m,1,k,2) = (cc(m,1,1,k)+tr11*2.*cc(m,ido,2,k) - 1 +tr12*2.*cc(m,ido,4,k))-(ti11*2.*cc(m,1,3,k) - 1 +ti12*2.*cc(m,1,5,k)) - ch(m,1,k,3) = (cc(m,1,1,k)+tr12*2.*cc(m,ido,2,k) - 1 +tr11*2.*cc(m,ido,4,k))-(ti12*2.*cc(m,1,3,k) - 1 -ti11*2.*cc(m,1,5,k)) - ch(m,1,k,4) = (cc(m,1,1,k)+tr12*2.*cc(m,ido,2,k) - 1 +tr11*2.*cc(m,ido,4,k))+(ti12*2.*cc(m,1,3,k) - 1 -ti11*2.*cc(m,1,5,k)) - ch(m,1,k,5) = (cc(m,1,1,k)+tr11*2.*cc(m,ido,2,k) - 1 +tr12*2.*cc(m,ido,4,k))+(ti11*2.*cc(m,1,3,k) - 1 +ti12*2.*cc(m,1,5,k)) - 1001 continue - 101 continue - if (ido .eq. 1) return - idp2 = ido+2 - do 103 k=1,l1 - do 102 i=3,ido,2 - ic = idp2-i - do 1002 m=1,mp - ch(m,i-1,k,1) = cc(m,i-1,1,k)+(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +(cc(m,i-1,5,k)+cc(m,ic-1,4,k)) - ch(m,i,k,1) = cc(m,i,1,k)+(cc(m,i,3,k)-cc(m,ic,2,k)) - 1 +(cc(m,i,5,k)-cc(m,ic,4,k)) - ch(m,i-1,k,2) = wa1(i-2)*((cc(m,i-1,1,k)+tr11* - 1 (cc(m,i-1,3,k)+cc(m,ic-1,2,k))+tr12 - 1 *(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))-(ti11*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))+ti12*(cc(m,i,5,k)+cc(m,ic,4,k)))) - 1 -wa1(i-1)*((cc(m,i,1,k)+tr11*(cc(m,i,3,k)-cc(m,ic,2,k)) - 1 +tr12*(cc(m,i,5,k)-cc(m,ic,4,k)))+(ti11*(cc(m,i-1,3,k) - 1 -cc(m,ic-1,2,k))+ti12*(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - ch(m,i,k,2) = wa1(i-2)*((cc(m,i,1,k)+tr11*(cc(m,i,3,k) - 1 -cc(m,ic,2,k))+tr12*(cc(m,i,5,k)-cc(m,ic,4,k))) - 1 +(ti11*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))+ti12 - 1 *(cc(m,i-1,5,k)-cc(m,ic-1,4,k))))+wa1(i-1) - 1 *((cc(m,i-1,1,k)+tr11*(cc(m,i-1,3,k) - 1 +cc(m,ic-1,2,k))+tr12*(cc(m,i-1,5,k)+cc(m,ic-1,4,k))) - 1 -(ti11*(cc(m,i,3,k)+cc(m,ic,2,k))+ti12 - 1 *(cc(m,i,5,k)+cc(m,ic,4,k)))) - ch(m,i-1,k,3) = wa2(i-2) - 1 *((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))-(ti12*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k)))) - 1 -wa2(i-1) - 1 *((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- - 1 cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) - 1 +(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 - 1 *(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - ch(m,i,k,3) = wa2(i-2) - 1 *((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- - 1 cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) - 1 +(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 - 1 *(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - 1 +wa2(i-1) - 1 *((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))-(ti12*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k)))) - ch(m,i-1,k,4) = wa3(i-2) - 1 *((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti12*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k)))) - 1 -wa3(i-1) - 1 *((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- - 1 cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) - 1 -(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 - 1 *(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - ch(m,i,k,4) = wa3(i-2) - 1 *((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- - 1 cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) - 1 -(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 - 1 *(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - 1 +wa3(i-1) - 1 *((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti12*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k)))) - ch(m,i-1,k,5) = wa4(i-2) - 1 *((cc(m,i-1,1,k)+tr11*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +tr12*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti11*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))+ti12*(cc(m,i,5,k)+cc(m,ic,4,k)))) - 1 -wa4(i-1) - 1 *((cc(m,i,1,k)+tr11*(cc(m,i,3,k)-cc(m,ic,2,k)) - 1 +tr12*(cc(m,i,5,k)-cc(m,ic,4,k)))-(ti11*(cc(m,i-1,3,k) - 1 -cc(m,ic-1,2,k))+ti12*(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - ch(m,i,k,5) = wa4(i-2) - 1 *((cc(m,i,1,k)+tr11*(cc(m,i,3,k)-cc(m,ic,2,k)) - 1 +tr12*(cc(m,i,5,k)-cc(m,ic,4,k)))-(ti11*(cc(m,i-1,3,k) - 1 -cc(m,ic-1,2,k))+ti12*(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) - 1 +wa4(i-1) - 1 *((cc(m,i-1,1,k)+tr11*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) - 1 +tr12*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti11*(cc(m,i,3,k) - 1 +cc(m,ic,2,k))+ti12*(cc(m,i,5,k)+cc(m,ic,4,k)))) - 1002 continue - 102 continue - 103 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idivec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idivec.f deleted file mode 100755 index d7be0e8b2..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idivec.f +++ /dev/null @@ -1,378 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idivec.f -c -c this file includes documentation and code for -c subroutine idivec i -c -c ... files which must be loaded with idivec.f -c -c sphcom.f, hrfft.f, vhsec.f,shaec.f -c -c -c -c subroutine idivec(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsec,lvhsec,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaec for a scalar array dv, subroutine idivec computes -c an irrotational vector field (v,w) whose divergence is dv - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from dv for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to dv. the vorticity of (v,w), as computed by -c vortec, is the zero scalar field. v(i,j) and w(i,j) are the -c velocity components at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon. -c -c the -c -c divergence[v(i,j),w(i,j)] -c -c = [d(w(i,j)/dlambda + d(sint*v(i,j))/dtheta]/sint -c -c = dv(i,j) - pertrb -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [dv/dlambda - d(sint*w)/dtheta]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine idives. -c -c input parameters -c -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shaec to compute the arrays a and b from the -c scalar field dv. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c dv is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c dv is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c dv is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of divergence and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional and pertrb -c can be one dimensional corresponding to an indexed multiple -c array dv. in this case, multiple vector synthesis will be -c performed to compute each vector field. the third index for -c a,b,v,w and first for pertrb is the synthesis index which -c assumes the values k = 1,...,nt. for a single synthesis set -c nt = 1. the description of the remaining parameters is -c simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idivec. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idivec. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array dv as computed by subroutine shaec. -c *** a,b must be computed by shaec prior to calling idivec. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls idivec (and shaec). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls idivec (and shaec). ndab must be at -c least nlat. -c -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized, -c wvhsec can be used repeatedly by idivec as long as nlon -c and nlat remain unchanged. wvhsec must not be altered -c between calls of idivec. -c -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls idivec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idivec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon) + 2*nt*l1 + 1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*l1*nt+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field whose divergence is -c dv-pertrb at the colatitude point theta(i)=(i-1)*pi/(nlat-1) -c and longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for w and v are defined at the input parameter isym. -c the curl or vorticity of (v,w) is the zero vector field. note -c that any nonzero vector field on the sphere will be multiple -c valued at the poles [reference swarztrauber]. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). dv - pertrb is a scalar -c field which can be the divergence of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of dv (computed by shaec) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c -c -c the unperturbed scalar field dv can be the divergence of a -c vector field only if a(1,1) is zero. if a(1,1) is nonzero -c (flagged by pertrb nonzero) then subtracting pertrb from -c dv yields a scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsec -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idivec(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhsec,lvhsec,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsec(lvhsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin=4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 - if(lvhsec .lt. lwmin) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call idvec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - + mmax,work(is),mdab,ndab,a,b,wvhsec,lvhsec,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine idvec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wvhsec,lvhsec,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsec(lvhsec),wk(lwk) -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -a(1,n,k)/sqnn(n) - bi(1,n,k) = -b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -a(m,n,k)/sqnn(n) - bi(m,n,k) = -b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with curl=0 -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into irrotational (v,w) -c - call vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsec,lvhsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idives.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idives.f deleted file mode 100755 index beca22fb0..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idives.f +++ /dev/null @@ -1,375 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idives.f -c -c this file includes documentation and code for -c subroutine idives i -c -c ... files which must be loaded with idivec.f -c -c sphcom.f, hrfft.f, vhses.f,shaes.f -c -c -c subroutine idives(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhses,lvhses,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaes for a scalar array dv, subroutine idives computes -c an irrotational vector field (v,w) whose divergence is dv - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from dv for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to dv. the vorticity of (v,w), as computed by -c vortes, is the zero scalar field. i.e., v(i,j) and w(i,j) are the -c velocity components at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon. -c -c the -c -c divergence[v(i,j),w(i,j)] -c -c = [d(w(i,j)/dlambda + d(sint*v(i,j))/dtheta]/sint -c -c = dv(i,j) - pertrb -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [dv/dlambda - d(sint*w)/dtheta]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine idivec. -c -c input parameters -c -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shaes to compute the arrays a and b from the -c scalar field dv. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c dv is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c dv is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c dv is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of divergence and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional and pertrb -c can be one dimensional corresponding to an indexed multiple -c array dv. in this case, multiple vector synthesis will be -c performed to compute each vector field. the third index for -c a,b,v,w and first for pertrb is the synthesis index which -c assumes the values k = 1,...,nt. for a single synthesis set -c nt = 1. the description of the remaining parameters is -c simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idives. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idives. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array dv as computed by subroutine shaes. -c *** a,b must be computed by shaes prior to calling idives. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls idives (and shaes). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls idives (and shaes). ndab must be at -c least nlat. -c -c -c wvhses an array which must be initialized by subroutine vhesesi. -c once initialized, -c wvhses can be used repeatedly by idives as long as nlon -c and nlat remain unchanged. wvhses must not be altered -c between calls of idives. -c -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls idives. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhses must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idives. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*((2*nt+1)*nlon+2*nt*l1+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field whose divergence is -c dv-pertrb at the colatitude point theta(i)=(i-1)*pi/(nlat-1) -c and longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for w and v are defined at the input parameter isym. -c the curl or vorticity of (v,w) is the zero vector field. note -c that any nonzero vector field on the sphere will be multiple -c valued at the poles [reference swarztrauber]. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). dv - pertrb is a scalar -c field which can be the divergence of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of dv (computed by shaes) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c -c -c the unperturbed scalar field dv can be the divergence of a -c vector field only if a(1,1) is zero. if a(1,1) is nonzero -c (flagged by pertrb nonzero) then subtracting pertrb from -c dv yields a scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhses -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idives(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhses,lvhses,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhses(lvhses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhses .lt. lzimn+lzimn+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call idves1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - + mmax,work(is),mdab,ndab,a,b,wvhses,lvhses,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine idves1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wsav,lwsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lwsav),wk(lwk) -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -a(1,n,k)/sqnn(n) - bi(1,n,k) = -b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -a(m,n,k)/sqnn(n) - bi(m,n,k) = -b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with curl=0 -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into irrotational (v,w) -c - call vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idivgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idivgc.f deleted file mode 100755 index 8cc49c745..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idivgc.f +++ /dev/null @@ -1,371 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idivgc.f -c -c this file includes documentation and code for -c subroutine idivgc i -c -c ... files which must be loaded with idivec.f -c -c sphcom.f, hrfft.f, vhsgc.f,shagc.f -c -c subroutine idivgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsgc,lvhsgc,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shagc for a scalar array dv, subroutine idivgc computes -c an irrotational vector field (v,w) whose divergence is dv - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from dv for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to dv. the vorticity of (v,w) is the zero scalar -c field. v(i,j) and w(i,j) are the velocity components at the gaussian -c colatitude theta(i) (see nlat) and longitude lambda(j)=(j-1)*2*pi/nlon. -c the -c -c divergence[v(i,j),w(i,j)] -c -c = [d(w(i,j)/dlambda + d(sint*v(i,j))/dtheta]/sint -c -c = dv(i,j) - pertrb -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [dv/dlambda - d(sint*w)/dtheta]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). -c -c input parameters -c -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shagc to compute the arrays a and b from the -c scalar field dv. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c dv is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c dv is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c dv is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of divergence and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional and pertrb -c can be one dimensional corresponding to an indexed multiple -c array dv. in this case, multiple vector synthesis will be -c performed to compute each vector field. the third index for -c a,b,v,w and first for pertrb is the synthesis index which -c assumes the values k = 1,...,nt. for a single synthesis set -c nt = 1. the description of the remaining parameters is -c simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idivgc. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idivgc. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array dv as computed by subroutine shagc. -c *** a,b must be computed by shagc prior to calling idivgc. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls idivgc (and shagc). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls idivgc (and shagc). ndab must be at -c least nlat. -c -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized, -c wvhsgc can be used repeatedly by idivgc as long as nlon -c and nlat remain unchanged. wvhsgc must not be altered -c between calls of idivgc. -c -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls idivgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idivgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon) + 2*nt*l1 + 1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field whose divergence is -c dv-pertrb at the guassian colatitude point theta(i) and -c longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for w and v are defined at the input parameter isym. -c the curl or vorticity of (v,w) is the zero vector field. note -c that any nonzero vector field on the sphere will be multiple -c valued at the poles [reference swarztrauber]. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). dv - pertrb is a scalar -c field which can be the divergence of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of dv (computed by shagc) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c -c -c the unperturbed scalar field dv can be the divergence of a -c vector field only if a(1,1) is zero. if a(1,1) is nonzero -c (flagged by pertrb nonzero) then subtracting pertrb from -c dv yields a scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idivgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhsgc,lvhsgc,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgc(lvhsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 - if(lvhsgc .lt. lwmin) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call idvgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - + mmax,work(is),mdab,ndab,a,b,wvhsgc,lvhsgc,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine idvgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wsav,lwsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lwsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -a(1,n,k)/sqnn(n) - bi(1,n,k) = -b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -a(m,n,k)/sqnn(n) - bi(m,n,k) = -b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with curl=0 -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into irrotational (v,w) -c - call vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idivgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idivgs.f deleted file mode 100755 index 073711276..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idivgs.f +++ /dev/null @@ -1,371 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idivec.f -c -c this file includes documentation and code for -c subroutine idivgs i -c -c ... files which must be loaded with idivgs.f -c -c sphcom.f, hrfft.f, vhsgs.f,shags.f -c -c -c subroutine idivgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsgs,lvhsgs,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shags for a scalar array divg, subroutine idivgs computes -c an irrotational vector field (v,w) whose divergence is divg - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from divg for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to divg. the vorticity of (v,w) is the zero scalar -c field. v(i,j) and w(i,j) are the velocity components at the gaussian -c colatitude theta(i) (see nlat) and longitude lambda(j)=(j-1)*2*pi/nlon. -c the -c -c divergence[v(i,j),w(i,j)] -c -c = [d(w(i,j)/dlambda + d(sint*v(i,j))/dtheta]/sint -c -c = divg(i,j) - pertrb -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [dv/dlambda - d(sint*w)/dtheta]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). -c -c input parameters -c -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shags to compute the arrays a and b from the -c scalar field divg. isym determines whether (v,w) are -c computed on the full or half sphere as follows: -c -c = 0 -c -c divg is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c divg is antisymmetric about the equator. in this case w is -c antisymmetric and v is symmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c divg is symmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of divergence and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays a,b,v, and w can be three dimensional and pertrb -c can be one dimensional corresponding to an indexed multiple -c array divg. in this case, multiple vector synthesis will be -c performed to compute each vector field. the third index for -c a,b,v,w and first for pertrb is the synthesis index which -c assumes the values k = 1,...,nt. for a single synthesis set -c nt = 1. the description of the remaining parameters is -c simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idivgs. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idivgs. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array divg as computed by subroutine shags. -c *** a,b must be computed by shags prior to calling idivgs. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls idivgs (and shags). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls idivgs (and shags). ndab must be at -c least nlat. -c -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c once initialized, -c wvhsgs can be used repeatedly by idivgs as long as nlon -c and nlat remain unchanged. wvhsgs must not be altered -c between calls of idivgs. -c -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls idivgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idivgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c (2*nt+1)*nlat*nlon + nlat*(2*nt*l1+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon + nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain an irrotational vector field whose divergence is -c divg-pertrb at the guassian colatitude point theta(i) and -c longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for w and v are defined at the input parameter isym. -c the curl or vorticity of (v,w) is the zero vector field. note -c that any nonzero vector field on the sphere will be multiple -c valued at the poles [reference swarztrauber]. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). divg - pertrb is a scalar -c field which can be the divergence of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of divg (computed by shags) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c -c -c the unperturbed scalar field divg can be the divergence of a -c vector field only if a(1,1) is zero. if a(1,1) is nonzero -c (flagged by pertrb nonzero) then subtracting pertrb from -c divg yields a scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idivgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhsgs,lvhsgs,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgs(lvhsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = l1*l2*(nlat+nlat-l1+1)+nlon+15 - if(lvhsgs .lt. lwmin) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr + mn - is = ibi + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call idvgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr),work(ibi), - + mmax,work(is),mdab,ndab,a,b,wvhsgs,lvhsgs,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine idvgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi,mmax, - +sqnn,mdab,ndab,a,b,wsav,lwsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lwsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -a(1,n,k)/sqnn(n) - bi(1,n,k) = -b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -a(m,n,k)/sqnn(n) - bi(m,n,k) = -b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with curl=0 -c - if (isym.eq.0) then - ityp = 1 - else if (isym.eq.1) then - ityp = 4 - else if (isym.eq.2) then - ityp = 7 - end if -c -c vector sythesize br,bi into irrotational (v,w) -c - call vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtec.f deleted file mode 100755 index 8f8d9a5b4..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtec.f +++ /dev/null @@ -1,407 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idvtec.f -c -c this file includes documentation and code for -c subroutine idvtec i -c -c ... files which must be loaded with idvtec.f -c -c sphcom.f, hrfft.f, vhsec.f,shaec.f -c -c -c subroutine idvtec(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, -c +mdab,ndab,wvhsec,lvhsec,work,lwork,pertbd,pertbv,ierror) -c -c given the scalar spherical harmonic coefficients ad,bd precomputed -c by subroutine shaec for the scalar field divg and coefficients av,bv -c precomputed by subroutine shaec for the scalar field vort, subroutine -c idvtec computes a vector field (v,w) whose divergence is divg - pertbd -c and whose vorticity is vort - pertbv. w the is east longitude component -c and v is the colatitudinal component of the velocity. if nt=1 (see nt -c below) pertrbd and pertbv are constants which must be subtracted from -c divg and vort for (v,w) to exist (see the description of pertbd and -c pertrbv below). usually pertbd and pertbv are zero or small relative -c to divg and vort. w(i,j) and v(i,j) are the velocity components at -c colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c the -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = divg(i,j) - pertbd -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertbv -c -c where -c -c sint = cos(theta(i)). -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym isym determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c divg,vort are neither pairwise symmetric/antisymmetric nor -c antisymmetric/symmetric about the equator as described for -c isym = 1 or isym = 2 below. in this case, the vector field -c (v,w) is computed on the entire sphere. i.e., in the arrays -c w(i,j) and v(i,j) i=1,...,nlat and j=1,...,nlon. -c -c = 1 -c -c divg is antisymmetric and vort is symmetric about the equator. -c in this case w is antisymmetric and v is symmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c divg is symmetric and vort is antisymmetric about the equator. -c in this case w is symmetric and v is antisymmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls idvtec, nt is the number of scalar -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays ad,bd,av,bv,u, and v can be -c three dimensional and pertbd,pertbv can be one dimensional -c corresponding to indexed multiple arrays divg, vort. in this -c case, multiple synthesis will be performed to compute each -c vector field. the third index for ad,bd,av,bv,v,w and first -c pertrbd,pertbv is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description of -c remaining parameters is simplified by assuming that nt=1 or that -c ad,bd,av,bv,v,w are two dimensional and pertbd,pertbv are -c constants. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idvtec. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idvtec. jdvw must be at least nlon. -c -c ad,bd two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array divg as computed by subroutine shaec. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vort as computed by subroutine shaec. -c *** ad,bd,av,bv must be computed by shaec prior to calling idvtec. -c -c mdab the first dimension of the arrays ad,bd,av,bv as it appears -c in the program that calls idvtec (and shaec). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays ad,bd,av,bv as it appears in -c the program that calls idvtec (and shaec). ndab must be at -c least nlat. -c -c wvhsec an array which must be initialized by subroutine vhseci. -c wvhsec can be used repeatedly by idvtec as long as nlon -c and nlat remain unchanged. wvhsec must not be altered -c between calls of idvtec. -c -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls idvtec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idvtec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(4*l1*nt+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(4*l1*nt+1) -c -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose divergence is divg - pertbd and -c whose vorticity is vort - pertbv. w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at the colatitude theta(i) = (i-1)*pi/(nlat-1) and longitude -c lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat and j=1,...,nlon. -c -c pertbd a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). divg - pertbd is a scalar -c field which can be the divergence of a vector field (v,w). -c pertbd is related to the scalar harmonic coefficients ad,bd -c of divg (computed by shaec) by the formula -c -c pertbd = ad(1,1)/(2.*sqrt(2.)) -c -c an unperturbed divg can be the divergence of a vector field -c only if ad(1,1) is zero. if ad(1,1) is nonzero (flagged by -c pertbd nonzero) then subtracting pertbd from divg yields a -c scalar field for which ad(1,1) is zero. usually pertbd is -c zero or small relative to divg. -c -c pertbv a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vort - pertbv is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertbv is related to the scalar harmonic coefficients av,bv -c of vort (computed by shaec) by the formula -c -c pertbv = av(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vort can be the vorticity of a vector field -c only if av(1,1) is zero. if av(1,1) is nonzero (flagged by -c pertbv nonzero) then subtracting pertbv from vort yields a -c scalar field for which av(1,1) is zero. usually pertbv is -c zero or small relative to vort. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsec -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idvtec(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, - +mdab,ndab,wvhsec,lvhsec,work,lwork,pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt),pertbd(nt),pertbv(nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhsec(lvhsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+4*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-4*mn-nlat - call idvtec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(is),mdab,ndab,ad,bd, - +av,bv,wvhsec,lvhsec,work(iwk),liwk,pertbd,pertbv,ierror) - return - end - - subroutine idvtec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi, - +cr,ci,mmax,sqnn,mdab,ndab,ad,bd,av,bv,wvhsec,lvhsec,wk,lwk, - +pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhsec(lvhsec),wk(lwk) - dimension pertbd(nt),pertbv(nt) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence,vorticity perturbation constants -c - pertbd(k) = ad(1,1,k)/(2.*sqrt(2.)) - pertbv(k) = av(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi,cr,ci to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -ad(1,n,k)/sqnn(n) - bi(1,n,k) = -bd(1,n,k)/sqnn(n) - cr(1,n,k) = av(1,n,k)/sqnn(n) - ci(1,n,k) = bv(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -ad(m,n,k)/sqnn(n) - bi(m,n,k) = -bd(m,n,k)/sqnn(n) - cr(m,n,k) = av(m,n,k)/sqnn(n) - ci(m,n,k) = bv(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis without assuming div=0 or curl=0 -c - if (isym.eq.0) then - ityp = 0 - else if (isym.eq.1) then - ityp = 3 - else if (isym.eq.2) then - ityp = 6 - end if -c -c sythesize br,bi,cr,ci into the vector field (v,w) -c - call vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsec,lvhsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtes.f deleted file mode 100755 index 6fd50d367..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtes.f +++ /dev/null @@ -1,401 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idvtes.f -c -c this file includes documentation and code for -c subroutine idvtes i -c -c ... files which must be loaded with idvtes.f -c -c sphcom.f, hrfft.f, vhses.f,shaes.f -c -c -c subroutine idvtes(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, -c +mdab,ndab,wvhses,lvhses,work,lwork,pertbd,pertbv,ierror) -c -c given the scalar spherical harmonic coefficients ad,bd precomputed -c by subroutine shaes for the scalar field divg and coefficients av,bv -c precomputed by subroutine shaes for the scalar field vort, subroutine -c idvtes computes a vector field (v,w) whose divergence is divg - pertbd -c and whose vorticity is vort - pertbv. w the is east longitude component -c and v is the colatitudinal component of the velocity. if nt=1 (see nt -c below) pertrbd and pertbv are constants which must be subtracted from -c divg and vort for (v,w) to exist (see the description of pertbd and -c pertrbv below). usually pertbd and pertbv are zero or small relative -c to divg and vort. w(i,j) and v(i,j) are the velocity components at -c colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c the -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = divg(i,j) - pertbd -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertbv -c -c where -c -c sint = cos(theta(i)). -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym isym determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c divg,vort are neither pairwise symmetric/antisymmetric nor -c antisymmetric/symmetric about the equator as described for -c isym = 1 or isym = 2 below. in this case, the vector field -c (v,w) is computed on the entire sphere. i.e., in the arrays -c w(i,j) and v(i,j) i=1,...,nlat and j=1,...,nlon. -c -c = 1 -c -c divg is antisymmetric and vort is symmetric about the equator. -c in this case w is antisymmetric and v is symmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c divg is symmetric and vort is antisymmetric about the equator. -c in this case w is symmetric and v is antisymmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls idvtes, nt is the number of scalar -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays ad,bd,av,bv,u, and v can be -c three dimensional and pertbd,pertbv can be one dimensional -c corresponding to indexed multiple arrays divg, vort. in this -c case, multiple synthesis will be performed to compute each -c vector field. the third index for ad,bd,av,bv,v,w and first -c pertrbd,pertbv is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description of -c remaining parameters is simplified by assuming that nt=1 or that -c ad,bd,av,bv,v,w are two dimensional and pertbd,pertbv are -c constants. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idvtes. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idvtes. jdvw must be at least nlon. -c -c ad,bd two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array divg as computed by subroutine shaes. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vort as computed by subroutine shaes. -c *** ad,bd,av,bv must be computed by shaes prior to calling idvtes. -c -c mdab the first dimension of the arrays ad,bd,av,bv as it appears -c in the program that calls idvtes (and shaes). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays ad,bd,av,bv as it appears in -c the program that calls idvtes (and shaes). ndab must be at -c least nlat. -c -c wvhses an array which must be initialized by subroutine vhsesi. -c wvhses can be used repeatedly by idvtes as long as nlon -c and nlat remain unchanged. wvhses must not be altered -c between calls of idvtes. -c -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls idvtes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idvtes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*((2*nt+1)*nlon+4*nt*l1+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon+nlat*(4*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose divergence is divg - pertbd and -c whose vorticity is vort - pertbv. w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at the colatitude theta(i) = (i-1)*pi/(nlat-1) and longitude -c lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat and j=1,...,nlon. -c -c pertbd a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). divg - pertbd is a scalar -c field which can be the divergence of a vector field (v,w). -c pertbd is related to the scalar harmonic coefficients ad,bd -c of divg (computed by shaes) by the formula -c -c pertbd = ad(1,1)/(2.*sqrt(2.)) -c -c an unperturbed divg can be the divergence of a vector field -c only if ad(1,1) is zero. if ad(1,1) is nonzero (flagged by -c pertbd nonzero) then subtracting pertbd from divg yields a -c scalar field for which ad(1,1) is zero. usually pertbd is -c zero or small relative to divg. -c -c pertbv a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vort - pertbv is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertbv is related to the scalar harmonic coefficients av,bv -c of vort (computed by shaes) by the formula -c -c pertbv = av(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vort can be the vorticity of a vector field -c only if av(1,1) is zero. if av(1,1) is nonzero (flagged by -c pertbv nonzero) then subtracting pertbv from vort yields a -c scalar field for which av(1,1) is zero. usually pertbv is -c zero or small relative to vort. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhses -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idvtes(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, - +mdab,ndab,wvhses,lvhses,work,lwork,pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt),pertbd(nt),pertbv(nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhses(lvhses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhses .lt. lzimn+lzimn+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+4*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-4*mn-nlat - call idvtes1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(is),mdab,ndab,ad,bd, - +av,bv,wvhses,lvhses,work(iwk),liwk,pertbd,pertbv,ierror) - return - end - - subroutine idvtes1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi, - +cr,ci,mmax,sqnn,mdab,ndab,ad,bd,av,bv,widvtes,lidvtes,wk,lwk, - +pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension widvtes(lidvtes),wk(lwk) - dimension pertbd(nt),pertbv(nt) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence,vorticity perturbation constants -c - pertbd(k) = ad(1,1,k)/(2.*sqrt(2.)) - pertbv(k) = av(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi,cr,ci to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -ad(1,n,k)/sqnn(n) - bi(1,n,k) = -bd(1,n,k)/sqnn(n) - cr(1,n,k) = av(1,n,k)/sqnn(n) - ci(1,n,k) = bv(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -ad(m,n,k)/sqnn(n) - bi(m,n,k) = -bd(m,n,k)/sqnn(n) - cr(m,n,k) = av(m,n,k)/sqnn(n) - ci(m,n,k) = bv(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis without assuming div=0 or curl=0 -c - if (isym.eq.0) then - ityp = 0 - else if (isym.eq.1) then - ityp = 3 - else if (isym.eq.2) then - ityp = 6 - end if -c -c sythesize br,bi,cr,ci into the vector field (v,w) -c - call vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,widvtes,lidvtes,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtgc.f deleted file mode 100755 index 5b75cfc62..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtgc.f +++ /dev/null @@ -1,398 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idvtgc.f -c -c this file includes documentation and code for -c subroutine idvtgc i -c -c ... files which must be loaded with idvtgc.f -c -c sphcom.f, hrfft.f, vhsgc.f,shagc.f, gaqd.f -c -c -c subroutine idvtgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, -c +mdab,ndab,wvhsgc,lvhsgc,work,lwork,pertbd,pertbv,ierror) -c -c given the scalar spherical harmonic coefficients ad,bd precomputed -c by subroutine shagc for the scalar field divg and coefficients av,bv -c precomputed by subroutine shagc for the scalar field vort, subroutine -c idvtgc computes a vector field (v,w) whose divergence is divg - pertbd -c and whose vorticity is vort - pertbv. w the is east longitude component -c and v is the colatitudinal component of the velocity. if nt=1 (see nt -c below) pertrbd and pertbv are constants which must be subtracted from -c divg and vort for (v,w) to exist (see the description of pertbd and -c pertrbv below). usually pertbd and pertbv are zero or small relative -c to divg and vort. w(i,j) and v(i,j) are the velocity components at -c gaussian colatitude theta(i) (see nlat as input argument) and longitude -c lambda(j) = (j-1)*2*pi/nlon -c -c the -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = divg(i,j) - pertbd -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertbv -c -c where -c -c sint = cos(theta(i)). -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym isym determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c divg,vort are neither pairwise symmetric/antisymmetric nor -c antisymmetric/symmetric about the equator as described for -c isym = 1 or isym = 2 below. in this case, the vector field -c (v,w) is computed on the entire sphere. i.e., in the arrays -c w(i,j) and v(i,j) i=1,...,nlat and j=1,...,nlon. -c -c = 1 -c -c divg is antisymmetric and vort is symmetric about the equator. -c in this case w is antisymmetric and v is symmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c divg is symmetric and vort is antisymmetric about the equator. -c in this case w is symmetric and v is antisymmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls idvtgc, nt is the number of scalar -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays ad,bd,av,bv,u, and v can be -c three dimensional and pertbd,pertbv can be one dimensional -c corresponding to indexed multiple arrays divg, vort. in this -c case, multiple synthesis will be performed to compute each -c vector field. the third index for ad,bd,av,bv,v,w and first -c pertrbd,pertbv is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description of -c remaining parameters is simplified by assuming that nt=1 or that -c ad,bd,av,bv,v,w are two dimensional and pertbd,pertbv are -c constants. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idvtgc. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idvtgc. jdvw must be at least nlon. -c -c ad,bd two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array divg as computed by subroutine shagc. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vort as computed by subroutine shagc. -c *** ad,bd,av,bv must be computed by shagc prior to calling idvtgc. -c -c mdab the first dimension of the arrays ad,bd,av,bv as it appears -c in the program that calls idvtgc (and shagc). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays ad,bd,av,bv as it appears in -c the program that calls idvtgc (and shagc). ndab must be at -c least nlat. -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c wvhsgc can be used repeatedly by idvtgc as long as nlon -c and nlat remain unchanged. wvhsgc must not be altered -c between calls of idvtgc. -c -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls idvtgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idvtgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c -c if isym = 0 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(4*nt*l1+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)+4*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose divergence is divg - pertbd and -c whose vorticity is vort - pertbv. w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at the colatitude theta(i) = (i-1)*pi/(nlat-1) and longitude -c lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat and j=1,...,nlon. -c -c pertbd a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). divg - pertbd is a scalar -c field which can be the divergence of a vector field (v,w). -c pertbd is related to the scalar harmonic coefficients ad,bd -c of divg (computed by shagc) by the formula -c -c pertbd = ad(1,1)/(2.*sqrt(2.)) -c -c an unperturbed divg can be the divergence of a vector field -c only if ad(1,1) is zero. if ad(1,1) is nonzero (flagged by -c pertbd nonzero) then subtracting pertbd from divg yields a -c scalar field for which ad(1,1) is zero. usually pertbd is -c zero or small relative to divg. -c -c pertbv a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vort - pertbv is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertbv is related to the scalar harmonic coefficients av,bv -c of vort (computed by shagc) by the formula -c -c pertbv = av(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vort can be the vorticity of a vector field -c only if av(1,1) is zero. if av(1,1) is nonzero (flagged by -c pertbv nonzero) then subtracting pertbv from vort yields a -c scalar field for which av(1,1) is zero. usually pertbv is -c zero or small relative to vort. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idvtgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, - +mdab,ndab,wvhsgc,lvhsgc,work,lwork,pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt),pertbd(nt),pertbv(nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhsgc(lvhsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsgc .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+4*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-4*mn-nlat - call idvtgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(is),mdab,ndab,ad,bd, - +av,bv,wvhsgc,lvhsgc,work(iwk),liwk,pertbd,pertbv,ierror) - return - end - - subroutine idvtgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi, - +cr,ci,mmax,sqnn,mdab,ndab,ad,bd,av,bv,wvhsgc,lvhsgc,wk,lwk, - +pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhsgc(lvhsgc),wk(lwk) - dimension pertbd(nt),pertbv(nt) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence,vorticity perturbation constants -c - pertbd(k) = ad(1,1,k)/(2.*sqrt(2.)) - pertbv(k) = av(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi,cr,ci to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -ad(1,n,k)/sqnn(n) - bi(1,n,k) = -bd(1,n,k)/sqnn(n) - cr(1,n,k) = av(1,n,k)/sqnn(n) - ci(1,n,k) = bv(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -ad(m,n,k)/sqnn(n) - bi(m,n,k) = -bd(m,n,k)/sqnn(n) - cr(m,n,k) = av(m,n,k)/sqnn(n) - ci(m,n,k) = bv(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis without assuming div=0 or curl=0 -c - if (isym.eq.0) then - ityp = 0 - else if (isym.eq.1) then - ityp = 3 - else if (isym.eq.2) then - ityp = 6 - end if -c -c sythesize br,bi,cr,ci into the vector field (v,w) -c - call vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsgc,lvhsgc,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtgs.f deleted file mode 100755 index 046935846..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/idvtgs.f +++ /dev/null @@ -1,397 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file idvtgs.f -c -c this file includes documentation and code for -c subroutine idvtgs i -c -c ... files which must be loaded with idvtgs.f -c -c sphcom.f, hrfft.f, vhsgs.f,shags.f, gaqd.f -c -c -c subroutine idvtgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, -c +mdab,ndab,wvhsgs,lvhsgs,work,lwork,pertbd,pertbv,ierror) -c -c given the scalar spherical harmonic coefficients ad,bd precomputed -c by subroutine shags for the scalar field divg and coefficients av,bv -c precomputed by subroutine shags for the scalar field vort, subroutine -c idvtgs computes a vector field (v,w) whose divergence is divg - pertbd -c and whose vorticity is vort - pertbv. w the is east longitude component -c and v is the colatitudinal component of the velocity. if nt=1 (see nt -c below) pertrbd and pertbv are constants which must be subtracted from -c divg and vort for (v,w) to exist (see the description of pertbd and -c pertrbv below). usually pertbd and pertbv are zero or small relative -c to divg and vort. w(i,j) and v(i,j) are the velocity components at -c gaussian colatitude theta(i) (see nlat as input argument) and longitude -c lambda(j) = (j-1)*2*pi/nlon -c -c the -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = divg(i,j) - pertbd -c -c and -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertbv -c -c where -c -c sint = cos(theta(i)). -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym isym determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c divg,vort are neither pairwise symmetric/antisymmetric nor -c antisymmetric/symmetric about the equator as described for -c isym = 1 or isym = 2 below. in this case, the vector field -c (v,w) is computed on the entire sphere. i.e., in the arrays -c w(i,j) and v(i,j) i=1,...,nlat and j=1,...,nlon. -c -c = 1 -c -c divg is antisymmetric and vort is symmetric about the equator. -c in this case w is antisymmetric and v is symmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c divg is symmetric and vort is antisymmetric about the equator. -c in this case w is symmetric and v is antisymmetric about the -c equator. w and v are computed on the northern hemisphere only. -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls idvtgs, nt is the number of scalar -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays ad,bd,av,bv,u, and v can be -c three dimensional and pertbd,pertbv can be one dimensional -c corresponding to indexed multiple arrays divg, vort. in this -c case, multiple synthesis will be performed to compute each -c vector field. the third index for ad,bd,av,bv,v,w and first -c pertrbd,pertbv is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description of -c remaining parameters is simplified by assuming that nt=1 or that -c ad,bd,av,bv,v,w are two dimensional and pertbd,pertbv are -c constants. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls idvtgs. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls idvtgs. jdvw must be at least nlon. -c -c ad,bd two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the divergence array divg as computed by subroutine shags. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vort as computed by subroutine shags. -c *** ad,bd,av,bv must be computed by shags prior to calling idvtgs. -c -c mdab the first dimension of the arrays ad,bd,av,bv as it appears -c in the program that calls idvtgs (and shags). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays ad,bd,av,bv as it appears in -c the program that calls idvtgs (and shags). ndab must be at -c least nlat. -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c wvhsgs can be used repeatedly by idvtgs as long as nlon -c and nlat remain unchanged. wvhsgs must not be altered -c between calls of idvtgs. -c -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls idvtgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls idvtgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min(nlat,nlon/2+1) if nlon is even or -c l1 = min(nlat,(nlon+1)/2) if nlon is odd -c -c -c if isym = 0 then lwork must be at least -c -c nlat*((2*nt+1)*nlon+4*nt*l1+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon+nlat*(4*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose divergence is divg - pertbd and -c whose vorticity is vort - pertbv. w(i,j) is the east longitude -c component and v(i,j) is the colatitudinal component of velocity -c at the colatitude theta(i) = (i-1)*pi/(nlat-1) and longitude -c lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat and j=1,...,nlon. -c -c pertbd a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). divg - pertbd is a scalar -c field which can be the divergence of a vector field (v,w). -c pertbd is related to the scalar harmonic coefficients ad,bd -c of divg (computed by shags) by the formula -c -c pertbd = ad(1,1)/(2.*sqrt(2.)) -c -c an unperturbed divg can be the divergence of a vector field -c only if ad(1,1) is zero. if ad(1,1) is nonzero (flagged by -c pertbd nonzero) then subtracting pertbd from divg yields a -c scalar field for which ad(1,1) is zero. usually pertbd is -c zero or small relative to divg. -c -c pertbv a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vort - pertbv is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertbv is related to the scalar harmonic coefficients av,bv -c of vort (computed by shags) by the formula -c -c pertbv = av(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vort can be the vorticity of a vector field -c only if av(1,1) is zero. if av(1,1) is nonzero (flagged by -c pertbv nonzero) then subtracting pertbv from vort yields a -c scalar field for which av(1,1) is zero. usually pertbv is -c zero or small relative to vort. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine idvtgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,ad,bd,av,bv, - +mdab,ndab,wvhsgs,lvhsgs,work,lwork,pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt),pertbd(nt),pertbv(nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhsgs(lvhsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhsgs .lt. lzimn+lzimn+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +(2*nt+1)*imid*nlon+4*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +(2*nt+1)*nlat*nlon+4*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-4*mn-nlat - call idvtgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(is),mdab,ndab,ad,bd, - +av,bv,wvhsgs,lvhsgs,work(iwk),liwk,pertbd,pertbv,ierror) - return - end - - subroutine idvtgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,br,bi, - +cr,ci,mmax,sqnn,mdab,ndab,ad,bd,av,bv,wvhsgs,lvhsgs,wk,lwk, - +pertbd,pertbv,ierror) - dimension w(idvw,jdvw,nt),v(idvw,jdvw,nt) - dimension br(mmax,nlat,nt),bi(mmax,nlat,nt),sqnn(nlat) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt) - dimension ad(mdab,ndab,nt),bd(mdab,ndab,nt) - dimension av(mdab,ndab,nt),bv(mdab,ndab,nt) - dimension wvhsgs(lvhsgs),wk(lwk) - dimension pertbd(nt),pertbv(nt) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set divergence,vorticity perturbation constants -c - pertbd(k) = ad(1,1,k)/(2.*sqrt(2.)) - pertbv(k) = av(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi,cr,ci to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - br(1,n,k) = -ad(1,n,k)/sqnn(n) - bi(1,n,k) = -bd(1,n,k)/sqnn(n) - cr(1,n,k) = av(1,n,k)/sqnn(n) - ci(1,n,k) = bv(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - br(m,n,k) = -ad(m,n,k)/sqnn(n) - bi(m,n,k) = -bd(m,n,k)/sqnn(n) - cr(m,n,k) = av(m,n,k)/sqnn(n) - ci(m,n,k) = bv(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis without assuming div=0 or curl=0 -c - if (isym.eq.0) then - ityp = 0 - else if (isym.eq.1) then - ityp = 3 - else if (isym.eq.2) then - ityp = 6 - end if -c -c sythesize br,bi,cr,ci into the vector field (v,w) -c - call vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wvhsgs,lvhsgs,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/igradec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/igradec.f deleted file mode 100755 index 71bbda19a..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/igradec.f +++ /dev/null @@ -1,360 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file igradec.f -c -c this file includes documentation and code for -c subroutine igradec i -c -c ... files which must be loaded with igradec.f -c -c sphcom.f, hrfft.f, shsec.f,vhaec.f -c -c subroutine igradec(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, -c + wshsec,lshsec,work,lwork,ierror) -c -c let br,bi,cr,ci be the vector spherical harmonic coefficients -c precomputed by vhaec for a vector field (v,w). let (v',w') be -c the irrotational component of (v,w) (i.e., (v',w') is generated -c by assuming cr,ci are zero and synthesizing br,bi with vhsec). -c then subroutine igradec computes a scalar field sf such that -c -c gradient(sf) = (v',w'). -c -c i.e., -c -c v'(i,j) = d(sf(i,j))/dtheta (colatitudinal component of -c the gradient) -c and -c -c w'(i,j) = 1/sint*d(sf(i,j))/dlambda (east longitudinal component -c of the gradient) -c -c at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine igrades. this -c saves storage (compare lshsec and lshses in igrades) but increases -c computational requirements. -c -c note: for an irrotational vector field (v,w), subroutine igradec -c computes a scalar field whose gradient is (v,w). in ay case, -c subroutine igradec "inverts" the gradient subroutine gradec. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the scalar field sf is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case sf -c is neither symmetric nor antisymmetric about the equator. -c sf is computed on the entire sphere. i.e., in the array -c sf(i,j) for i=1,...,nlat and j=1,...,nlon -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is antisymmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is symmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays br,bi, and sf can be three dimensional corresponding -c to an indexed multiple vector field (v,w). in this case, -c multiple scalar synthesis will be performed to compute each -c scalar field. the third index for br,bi, and sf is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that br,bi, -c and sf are two dimensional arrays. -c -c isf the first dimension of the array sf as it appears in -c the program that calls igradec. if isym = 0 then isf -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then isf must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then isf must be at least (nlat+1)/2. -c -c jsf the second dimension of the array sf as it appears in -c the program that calls igradec. jsf must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaec. -c *** br,bi must be computed by vhaec prior to calling igradec. -c -c mdb the first dimension of the arrays br and bi as it appears in -c the program that calls igradec (and vhaec). mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it appears in -c the program that calls igradec (and vhaec). ndb must be at -c least nlat. -c -c -c wshsec an array which must be initialized by subroutine shseci. -c once initialized, -c wshsec can be used repeatedly by igradec as long as nlon -c and nlat remain unchanged. wshsec must not be altered -c between calls of igradec. -c -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls igradec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c -c then lshsec must be greater than or equal to -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls igradec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym is zero then lwork must be at least -c -c nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon))+nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional array (see input parameter nt) that -c contain a scalar field whose gradient is the irrotational -c component of the vector field (v,w). the vector spherical -c harmonic coefficients br,bi were precomputed by subroutine -c vhaec. sf(i,j) is given at the gaussian colatitude theta(i) -c and longitude lambda(j) = (j-1)*2*pi/nlon. the index ranges -c are defined at input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of isf -c = 6 error in the specification of jsf -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsec -c = 10 error in the specification of lwork -c -c ********************************************************************** -c - subroutine igradec(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, - +wshsec,lshsec,work,lwork,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshsec(lshsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. isf.lt.nlat) .or. - + (isym.ne.0 .and. isf.lt.imid)) return - ierror = 6 - if(jsf .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 -c -c verify saved work space length -c - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - lwkmin=2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 - if (lshsec .lt. lwkmin) return - ierror = 10 -c -c set minimum and verify unsaved work space -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsec) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt -c lwkmin = nln+ls*nlon+2*mn+nlat - if (isym .eq. 0) then - lwkmin = nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(nt*nlon+max0(3*nlat,nlon))+nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia + mn - is = ib + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call igrdec1(nlat,nlon,isym,nt,sf,isf,jsf,work(ia),work(ib),mab, - +work(is),mdb,ndb,br,bi,wshsec,lshsec,work(iwk),liwk,ierror) - return - end - - subroutine igrdec1(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab, - +sqnn,mdb,ndb,br,bi,wshsec,lshsec,wk,lwk,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt),sqnn(nlat) - dimension a(mab,nlat,nt),b(mab,nlat,nt) - dimension wshsec(lshsec),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = 1.0/sqrt(fn*(fn+1.)) - 1 continue -c -c set upper limit for vector m subscript -c - mmax = min0(nlat,(nlon+1)/2) -c -c compute multiple scalar field coefficients -c - do 2 k=1,nt -c -c preset to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = br(1,n,k)*sqnn(n) - b(1,n,k)= bi(1,n,k)*sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*br(m,n,k) - b(m,n,k) = sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c scalar sythesize a,b into sf -c - call shsec(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab,nlat, - +wshsec,lshsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/igrades.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/igrades.f deleted file mode 100755 index ee2b91d36..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/igrades.f +++ /dev/null @@ -1,351 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file igrades.f -c -c this file includes documentation and code for -c subroutine igrades i -c -c ... files which must be loaded with igradec.f -c -c sphcom.f, hrfft.f, shses.f,vhaes.f -c -c subroutine igrades(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, -c + wshses,lshses,work,lwork,ierror) -c -c let br,bi,cr,ci be the vector spherical harmonic coefficients -c precomputed by vhaes for a vector field (v,w). let (v',w') be -c the irrotational component of (v,w) (i.e., (v',w') is generated -c by assuming cr,ci are zero and synthesizing br,bi with vhses). -c then subroutine igrades computes a scalar field sf such that -c -c gradient(sf) = (v',w'). -c -c i.e., -c -c v'(i,j) = d(sf(i,j))/dtheta (colatitudinal component of -c the gradient) -c and -c -c w'(i,j) = 1/sint*d(sf(i,j))/dlambda (east longitudinal component -c of the gradient) -c -c at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine igradec. -c -c note: for an irrotational vector field (v,w), subroutine igrades -c computes a scalar field whose gradient is (v,w). in ay case, -c subroutine igrades "inverts" the gradient subroutine grades. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the scalar field sf is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case sf -c is neither symmetric nor antisymmetric about the equator. -c sf is computed on the entire sphere. i.e., in the array -c sf(i,j) for i=1,...,nlat and j=1,...,nlon -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is antisymmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is symmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays br,bi, and sf can be three dimensional corresponding -c to an indexed multiple vector field (v,w). in this case, -c multiple scalar synthesis will be performed to compute each -c scalar field. the third index for br,bi, and sf is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that br,bi, -c and sf are two dimensional arrays. -c -c isf the first dimension of the array sf as it appears in -c the program that calls igrades. if isym = 0 then isf -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then isf must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then isf must be at least (nlat+1)/2. -c -c jsf the second dimension of the array sf as it appears in -c the program that calls igrades. jsf must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaes. -c *** br,bi must be computed by vhaes prior to calling igrades. -c -c mdb the first dimension of the arrays br and bi as it appears in -c the program that calls igrades (and vhaes). mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it appears in -c the program that calls igrades (and vhaes). ndb must be at -c least nlat. -c -c -c wshses an array which must be initialized by subroutine igradesi -c (or equivalently by subroutine shsesi). once initialized, -c wshses can be used repeatedly by igrades as long as nlon -c and nlat remain unchanged. wshses must not be altered -c between calls of igrades. -c -c -c lshses the dimension of the array wshses as it appears in the -c program that calls igrades. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c -c then lshses must be greater than or equal to -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls igrades. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 lwork must be greater than or equal to -c -c nlat*((nt+1)*nlon+2*nt*l1+1) -c -c if isym > 0 lwork must be greater than or equal to -c -c (nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional array (see input parameter nt) that -c contain a scalar field whose gradient is the irrotational -c component of the vector field (v,w). the vector spherical -c harmonic coefficients br,bi were precomputed by subroutine -c vhaes. sf(i,j) is given at the gaussian colatitude theta(i) -c and longitude lambda(j) = (j-1)*2*pi/nlon. the index ranges -c are defined at input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of isf -c = 6 error in the specification of jsf -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshses -c = 10 error in the specification of lwork -c -c ********************************************************************** -c - subroutine igrades(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, - +wshses,lshses,work,lwork,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshses(lshses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. isf.lt.nlat) .or. - + (isym.ne.0 .and. isf.lt.imid)) return - ierror = 6 - if(jsf .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space length -c - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 10 -c -c set minimum and verify unsaved work space -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - lwkmin = nln+ls*nlon+2*mn+nlat - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia + mn - is = ib + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call igrdes1(nlat,nlon,isym,nt,sf,isf,jsf,work(ia),work(ib),mab, - +work(is),mdb,ndb,br,bi,wshses,lshses,work(iwk),liwk,ierror) - return - end - - subroutine igrdes1(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab, - +sqnn,mdb,ndb,br,bi,wshses,lshses,wk,lwk,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt),sqnn(nlat) - dimension a(mab,nlat,nt),b(mab,nlat,nt) - dimension wshses(lshses),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = 1.0/sqrt(fn*(fn+1.)) - 1 continue -c -c set upper limit for vector m subscript -c - mmax = min0(nlat,(nlon+1)/2) -c -c compute multiple scalar field coefficients -c - do 2 k=1,nt -c -c preset to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = br(1,n,k)*sqnn(n) - b(1,n,k)= bi(1,n,k)*sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*br(m,n,k) - b(m,n,k) = sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c scalar sythesize a,b into sf -c - call shses(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab,nlat, - +wshses,lshses,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/igradgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/igradgc.f deleted file mode 100755 index 4efa1d3d7..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/igradgc.f +++ /dev/null @@ -1,349 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file igradgc.f -c -c this file includes documentation and code for -c subroutine igradgc i -c -c ... files which must be loaded with igradgc.f -c -c sphcom.f, hrfft.f, shsgc.f,vhagc.f -c -c subroutine igradgc(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, -c + wshsgc,lshsgc,work,lwork,ierror) -c -c let br,bi,cr,ci be the vector spherical harmonic coefficients -c precomputed by vhagc for a vector field (v,w). let (v',w') be -c the irrotational component of (v,w) (i.e., (v',w') is generated -c by assuming cr,ci are zero and synthesizing br,bi with vhsgs). -c then subroutine igradgc computes a scalar field sf such that -c -c gradient(sf) = (v',w'). -c -c i.e., -c -c v'(i,j) = d(sf(i,j))/dtheta (colatitudinal component of -c the gradient) -c and -c -c w'(i,j) = 1/sint*d(sf(i,j))/dlambda (east longitudinal component -c of the gradient) -c -c at the gaussian colatitude theta(i) (see nlat as input parameter) -c and longitude lambda(j) = (j-1)*2*pi/nlon where sint = sin(theta(i)). -c -c note: for an irrotational vector field (v,w), subroutine igradgc -c computes a scalar field whose gradient is (v,w). in ay case, -c subroutine igradgc "inverts" the gradient subroutine gradgc. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the scalar field sf is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case sf -c is neither symmetric nor antisymmetric about the equator. -c sf is computed on the entire sphere. i.e., in the array -c sf(i,j) for i=1,...,nlat and j=1,...,nlon -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is antisymmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is symmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays br,bi, and sf can be three dimensional corresponding -c to an indexed multiple vector field (v,w). in this case, -c multiple scalar synthesis will be performed to compute each -c scalar field. the third index for br,bi, and sf is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that br,bi, -c and sf are two dimensional arrays. -c -c isf the first dimension of the array sf as it appears in -c the program that calls igradgc. if isym = 0 then isf -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then isf must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then isf must be at least (nlat+1)/2. -c -c jsf the second dimension of the array sf as it appears in -c the program that calls igradgc. jsf must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhagc. -c *** br,bi must be computed by vhagc prior to calling igradgc. -c -c mdb the first dimension of the arrays br and bi as it appears in -c the program that calls igradgc (and vhagc). mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it appears in -c the program that calls igradgc (and vhagc). ndb must be at -c least nlat. -c -c -c wshsgc an array which must be initialized by subroutine shsgci. -c once initialized, -c wshsgc can be used repeatedly by igradgc as long as nlon -c and nlat remain unchanged. wshsgc must not be altered -c between calls of igradgc. -c -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls igradgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls igradgc define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd - -c if isym is zero then lwork must be at least -c -c nlat*(nlon*nt+max0(3*l2,nlon)+2*nt*l1+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nlon*nt+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional array (see input parameter nt) that -c contain a scalar field whose gradient is the irrotational -c component of the vector field (v,w). the vector spherical -c harmonic coefficients br,bi were precomputed by subroutine -c vhagc. sf(i,j) is given at the gaussian colatitude theta(i) -c and longitude lambda(j) = (j-1)*2*pi/nlon. the index ranges -c are defined at input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of isf -c = 6 error in the specification of jsf -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsgc -c = 10 error in the specification of lwork -c -c ********************************************************************** -c - subroutine igradgc(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, - +wshsgc,lshsgc,work,lwork,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshsgc(lshsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. isf.lt.nlat) .or. - + (isym.ne.0 .and. isf.lt.imid)) return - ierror = 6 - if(jsf .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space length -c - l2 = (nlat+mod(nlat,2))/2 - l1 = min0((nlon+2)/2,nlat) - if (lshsgc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 10 -c -c set minimum and verify unsaved work space -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsgc) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt -c lwkmin = nln+ls*nlon+2*mn+nlat - if (isym .eq. 0) then - lwkmin = nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(nt*nlon+max0(3*nlat,nlon))+nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia + mn - is = ib + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call igrdgc1(nlat,nlon,isym,nt,sf,isf,jsf,work(ia),work(ib),mab, - +work(is),mdb,ndb,br,bi,wshsgc,lshsgc,work(iwk),liwk,ierror) - return - end - - subroutine igrdgc1(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab, - +sqnn,mdb,ndb,br,bi,wsav,lsav,wk,lwk,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt),sqnn(nlat) - dimension a(mab,nlat,nt),b(mab,nlat,nt) - dimension wsav(lsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = 1.0/sqrt(fn*(fn+1.)) - 1 continue -c -c set upper limit for vector m subscript -c - mmax = min0(nlat,(nlon+1)/2) -c -c compute multiple scalar field coefficients -c - do 2 k=1,nt -c -c preset to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = br(1,n,k)*sqnn(n) - b(1,n,k)= bi(1,n,k)*sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*br(m,n,k) - b(m,n,k) = sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c scalar sythesize a,b into sf -c - call shsgc(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab,nlat,wsav, - + lsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/igradgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/igradgs.f deleted file mode 100755 index d4295b6a8..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/igradgs.f +++ /dev/null @@ -1,345 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file igradgs.f -c -c this file includes documentation and code for -c subroutine igradgs i -c -c ... files which must be loaded with igradgs.f -c -c sphcom.f, hrfft.f, shsgs.f,vhags.f -c -c subroutine igradgs(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, -c + wshsgs,lshsgs,work,lwork,ierror) -c -c let br,bi,cr,ci be the vector spherical harmonic coefficients -c precomputed by vhags for a vector field (v,w). let (v',w') be -c the irrotational component of (v,w) (i.e., (v',w') is generated -c by assuming cr,ci are zero and synthesizing br,bi with vhsgs). -c then subroutine igradgs computes a scalar field sf such that -c -c gradient(sf) = (v',w'). -c -c i.e., -c -c v'(i,j) = d(sf(i,j))/dtheta (colatitudinal component of -c the gradient) -c and -c -c w'(i,j) = 1/sint*d(sf(i,j))/dlambda (east longitudinal component -c of the gradient) -c -c at the gaussian colatitude theta(i) (see nlat as input parameter) -c and longitude lambda(j) = (j-1)*2*pi/nlon where sint = sin(theta(i)). -c -c note: for an irrotational vector field (v,w), subroutine igradgs -c computes a scalar field whose gradient is (v,w). in ay case, -c subroutine igradgs "inverts" the gradient subroutine gradgs. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the scalar field sf is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case sf -c is neither symmetric nor antisymmetric about the equator. -c sf is computed on the entire sphere. i.e., in the array -c sf(i,j) for i=1,...,nlat and j=1,...,nlon -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is antisymmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is symmetyric about the equator and -c is computed for the northern hemisphere only. i.e., -c if nlat is odd sf is computed in the array sf(i,j) for -c i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is even -c sf is computed in the array sf(i,j) for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c the arrays br,bi, and sf can be three dimensional corresponding -c to an indexed multiple vector field (v,w). in this case, -c multiple scalar synthesis will be performed to compute each -c scalar field. the third index for br,bi, and sf is the synthesis -c index which assumes the values k = 1,...,nt. for a single -c synthesis set nt = 1. the description of the remaining -c parameters is simplified by assuming that nt=1 or that br,bi, -c and sf are two dimensional arrays. -c -c isf the first dimension of the array sf as it appears in -c the program that calls igradgs. if isym = 0 then isf -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then isf must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then isf must be at least (nlat+1)/2. -c -c jsf the second dimension of the array sf as it appears in -c the program that calls igradgs. jsf must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhags. -c *** br,bi must be computed by vhags prior to calling igradgs. -c -c mdb the first dimension of the arrays br and bi as it appears in -c the program that calls igradgs (and vhags). mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br and bi as it appears in -c the program that calls igradgs (and vhags). ndb must be at -c least nlat. -c -c -c wshsgs an array which must be initialized by subroutine igradgsi -c (or equivalently by subroutine shsesi). once initialized, -c wshsgs can be used repeatedly by igradgs as long as nlon -c and nlat remain unchanged. wshsgs must not be altered -c between calls of igradgs. -c -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls igradgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c -c then lshsgs must be greater than or equal to -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls igradgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 lwork must be greater than or equal to -c -c nlat*((nt+1)*nlon+2*nt*l1+1) -c -c if isym > 0 lwork must be greater than or equal to -c -c (nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional array (see input parameter nt) that -c contain a scalar field whose gradient is the irrotational -c component of the vector field (v,w). the vector spherical -c harmonic coefficients br,bi were precomputed by subroutine -c vhags. sf(i,j) is given at the gaussian colatitude theta(i) -c and longitude lambda(j) = (j-1)*2*pi/nlon. the index ranges -c are defined at input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of isf -c = 6 error in the specification of jsf -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsgs -c = 10 error in the specification of lwork -c -c ********************************************************************** -c - subroutine igradgs(nlat,nlon,isym,nt,sf,isf,jsf,br,bi,mdb,ndb, - +wshsgs,lshsgs,work,lwork,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension wshsgs(lshsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. isf.lt.nlat) .or. - + (isym.ne.0 .and. isf.lt.imid)) return - ierror = 6 - if(jsf .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if(ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space length -c - l2 = (nlat+mod(nlat,2))/2 - l1 = min0((nlon+2)/2,nlat) - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return - ierror = 10 -c -c set minimum and verify unsaved work space -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - lwkmin = nln+ls*nlon+2*mn+nlat - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia + mn - is = ib + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call igrdgs1(nlat,nlon,isym,nt,sf,isf,jsf,work(ia),work(ib),mab, - +work(is),mdb,ndb,br,bi,wshsgs,lshsgs,work(iwk),liwk,ierror) - return - end - - subroutine igrdgs1(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab, - +sqnn,mdb,ndb,br,bi,wsav,lsav,wk,lwk,ierror) - dimension sf(isf,jsf,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt),sqnn(nlat) - dimension a(mab,nlat,nt),b(mab,nlat,nt) - dimension wsav(lsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = 1.0/sqrt(fn*(fn+1.)) - 1 continue -c -c set upper limit for vector m subscript -c - mmax = min0(nlat,(nlon+1)/2) -c -c compute multiple scalar field coefficients -c - do 2 k=1,nt -c -c preset to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = br(1,n,k)*sqnn(n) - b(1,n,k)= bi(1,n,k)*sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*br(m,n,k) - b(m,n,k) = sqnn(n)*bi(m,n,k) - 7 continue - 6 continue - 2 continue -c -c scalar sythesize a,b into sf -c - call shsgs(nlat,nlon,isym,nt,sf,isf,jsf,a,b,mab,nlat,wsav, - + lsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ihgeod.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ihgeod.f deleted file mode 100755 index a1cc9fce1..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ihgeod.f +++ /dev/null @@ -1,167 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c - subroutine ihgeod(m,idp,jdp,x,y,z) - dimension x(idp,jdp,5),y(idp,jdp,5),z(idp,jdp,5) -c -c m is the number of points on the edge of a -c single geodesic triangle -c -c x,y,z the coordinates of the geodesic points on -c the sphere are x(i,j,k), y(i,j,k), z(i,j,k) -c where i=1,...,m+m-1; j=1,...,m; and k=1,...,5. -c the indices are defined on the unfolded -c icosahedron as follows for the case m=3 -c -c north pole -c -c (5,1) 0 l -c i (4,1) (5,2) a (repeated for -c (3,1) (4,2) (5,3) theta1 t k=2,3,4,5 in -c (2,1) (3,2) (4,3) i --> -c (1,1) (2,2) (3,3) theta2 t the longitudinal -c (1,2) (2,3) u direction) -c (1,3) pi d -c j e -c south pole -c -c total number of points is 10*(m-1)**2+2 -c total number of triangles is 20*(m-1)**2 -c total number of edges is 30*(m-1)**2 -c - pi = 4.*atan(1.) - dphi = .4*pi - beta = cos(dphi) - theta1 = acos(beta/(1.-beta)) - theta2 = pi-theta1 - hdphi = dphi/2. - tdphi = 3.*hdphi - do k=1,5 - phi = (k-1)*dphi - call stoc(1.,theta2,phi,x1,y1,z1) - call stoc(1.,pi,phi+hdphi,x2,y2,z2) - call stoc(1.,theta2,phi+dphi,x3,y3,z3) - dxi = (x2-x1)/(m-1) - dyi = (y2-y1)/(m-1) - dzi = (z2-z1)/(m-1) - dxj = (x3-x2)/(m-1) - dyj = (y3-y2)/(m-1) - dzj = (z3-z2)/(m-1) - do i=1,m - xs = x1 + (i-1)*dxi - ys = y1 + (i-1)*dyi - zs = z1 + (i-1)*dzi - do j=1,i - x(j,i,k) = xs + (j-1)*dxj - y(j,i,k) = ys + (j-1)*dyj - z(j,i,k) = zs + (j-1)*dzj - end do - end do - call stoc(1.,theta1,phi+hdphi,x4,y4,z4) - dxi = (x3-x4)/(m-1) - dyi = (y3-y4)/(m-1) - dzi = (z3-z4)/(m-1) - dxj = (x4-x1)/(m-1) - dyj = (y4-y1)/(m-1) - dzj = (z4-z1)/(m-1) - do j=1,m - xs = x1 + (j-1)*dxj - ys = y1 + (j-1)*dyj - zs = z1 + (j-1)*dzj - do i=1,j - x(j,i,k) = xs + (i-1)*dxi - y(j,i,k) = ys + (i-1)*dyi - z(j,i,k) = zs + (i-1)*dzi - end do - end do - call stoc(1.,theta1,phi+tdphi,x5,y5,z5) - dxj = (x5-x3)/(m-1) - dyj = (y5-y3)/(m-1) - dzj = (z5-z3)/(m-1) - do i=1,m - xs = x4 + (i-1)*dxi - ys = y4 + (i-1)*dyi - zs = z4 + (i-1)*dzi - do j=1,i - x(j+m-1,i,k) = xs + (j-1)*dxj - y(j+m-1,i,k) = ys + (j-1)*dyj - z(j+m-1,i,k) = zs + (j-1)*dzj - end do - end do - call stoc(1.,0.,phi+dphi,x6,y6,z6) - dxi = (x5-x6)/(m-1) - dyi = (y5-y6)/(m-1) - dzi = (z5-z6)/(m-1) - dxj = (x6-x4)/(m-1) - dyj = (y6-y4)/(m-1) - dzj = (z6-z4)/(m-1) - do j=1,m - xs = x4 + (j-1)*dxj - ys = y4 + (j-1)*dyj - zs = z4 + (j-1)*dzj - do i=1,j - x(j+m-1,i,k) = xs + (i-1)*dxi - y(j+m-1,i,k) = ys + (i-1)*dyi - z(j+m-1,i,k) = zs + (i-1)*dzi - end do - end do - end do - do k=1,5 - do j=1,m+m-1 - do i=1,m - call ctos(x(j,i,k),y(j,i,k),z(j,i,k),rad,theta,phi) - call stoc(1.,theta,phi,x(j,i,k),y(j,i,k),z(j,i,k)) - end do - end do - end do - return - end - subroutine ctos(x,y,z,r,theta,phi) - r1 = x*x+y*y - if(r1 .ne. 0.) go to 10 - phi = 0. - theta = 0. - if(z .lt. 0.) theta = 4.*atan(1.) - return - 10 r = sqrt(r1+z*z) - r1 = sqrt(r1) - phi = atan2(y,x) - theta = atan2(r1,z) - return - end - subroutine stoc(r,theta,phi,x,y,z) - st = sin(theta) - x = r*st*cos(phi) - y = r*st*sin(phi) - z = r*cos(theta) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpec.f deleted file mode 100755 index c08b44635..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpec.f +++ /dev/null @@ -1,366 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file isfvpec.f -c -c this file includes documentation and code for -c subroutine isfvpec i -c -c ... files which must be loaded with isfvpec.f -c -c sphcom.f, hrfft.f, vhsec.f,shaec.f -c -c -c subroutine isfvpec(nlat,nlon,isym,nt,sf,vp,idv,jdv,as,bs,av,bv, -c + mdb,ndb,wvhsec,lvhsec,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients as,bs precomputed -c by shaec for the scalar stream function sf and av,bv precomputed by -c shaec for the scalar velocity potenital vp, subroutine isfvpec computes -c the vector field (v,w) corresponding to sf and vp. w is the east -c longitudinal and v is the colatitudinal component of the vector field. -c (v,w) is expressed in terms of sf,vp by the helmholtz relations (in -c mathematical spherical coordinates): -c -c v = -1/sin(theta)*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sin(theta)*d(st)/dlambda + d(vp)/dtheta -c -c required legendre functions are recomputed rather than stored as -c they are in subroutine isfvpes. v(i,j) and w(i,j) are given at -c colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere (pi=4.0*atan(1.0)). -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vector field is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in sf,vp about the equator. in this case v -c and w are not necessarily symmetric or antisymmetric about -c equator. v and w are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vp is antisymmetric and sf is symmetric about the equator. -c in this case v is symmetric and w antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c vp is symmetric and sf is antisymmetric about the equator. -c in this case v is antisymmetric and w symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute (v,w) for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays v,w as it appears in -c the program that calls isfvpec. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays v,w as it appears in -c the program that calls isfvpec. jdv must be at least nlon. -c -c as,bs two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field sf as computed by subroutine shaec. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field vp as computed by subroutine shaec. -c -c mdb the first dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpec. mdb must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpec. ndb must be at -c least nlat. -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized, wvhsec can be used repeatedly by isfvpec -c as long as nlon and nlat remain unchanged. wvhsec must -c not bel altered between calls of isfvpec. -c -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls isfvpec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsec must be at least -c -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls isfvpec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)+4*l1*nt+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(4*l1*nt+1) -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contains the vector field corresponding to the stream -c function sf and velocity potential vp whose coefficients, -c as,bs (for sf) and av,bv (for vp), were precomputed by -c subroutine shaec. v(i,j) and w(i,j) are given at the -c colatitude point -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude point -c -c lambda(j) = (j-1)*2*pi/nlon -c -c the index ranges are defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lvhsec -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine isfvpec(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - + mdb,ndb,wvhsec,lvhsec,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lvhsec,lwork,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real wvhsec(lvhsec),work(lwork) - integer mmax,l1,l2,lzz1,labc,mn,is,lwk,iwk,lwmin - integer ibr,ibi,icr,ici -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - l2 = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.l2)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - l1 = min0(nlat,(nlon+1)/2) - if (mdb .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*l2 - labc = 3*(max0(l1-2,0)*(nlat+nlat-l1-1))/2 - if (lvhsec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 - if (isym .eq. 0) then - lwmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+4*l1*nt+1) - else - lwmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(4*l1*nt+1) - end if - if (lwork .lt. lwmin) return -c -c set first dimension for br,bi,cr,ci (as requried by vhsec) -c - mmax = min0(nlat,(nlon+1)/2) - mn = mmax*nlat*nt - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - is = ici+mn - iwk = is+nlat - lwk = lwork-4*mn-nlat - call isfvpec1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv,mdb, - +ndb,work(ibr),work(ibi),work(icr),work(ici),l1,work(is), - +wvhsec,lvhsec,work(iwk),lwk,ierror) - return - end - - subroutine isfvpec1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - +mdb,ndb,br,bi,cr,ci,mab,fnn,wvhsec,lvhsec,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lvhsec,lwk,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real br(mab,nlat,nt),bi(mab,nlat,nt) - real cr(mab,nlat,nt),ci(mab,nlat,nt) - real wvhsec(lvhsec),wk(lwk),fnn(nlat) - integer n,m,mmax,k,ityp -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = -sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute (v,w) coefficients from as,bs,av,bv -c - do k=1,nt - do n=1,nlat - do m=1,mab - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - br(1,n,k) = -fnn(n)*av(1,n,k) - bi(1,n,k) = -fnn(n)*bv(1,n,k) - cr(1,n,k) = fnn(n)*as(1,n,k) - ci(1,n,k) = fnn(n)*bs(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - br(m,n,k) = -fnn(n)*av(m,n,k) - bi(m,n,k) = -fnn(n)*bv(m,n,k) - cr(m,n,k) = fnn(n)*as(m,n,k) - ci(m,n,k) = fnn(n)*bs(m,n,k) - end do - end do - end do -c -c synthesize br,bi,cr,ci into (v,w) -c - if (isym .eq.0) then - ityp = 0 - else if (isym .eq.1) then - ityp = 3 - else if (isym .eq.2) then - ityp = 6 - end if - call vhsec(nlat,nlon,ityp,nt,v,w,idv,jdv,br,bi,cr,ci, - + mab,nlat,wvhsec,lvhsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpes.f deleted file mode 100755 index fb229d1e6..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpes.f +++ /dev/null @@ -1,363 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file isfvpes.f -c -c this file includes documentation and code for -c subroutine isfvpes i -c -c ... files which must be loaded with isfvpes.f -c -c sphcom.f, hrfft.f, vhses.f,shaes.f -c -c -c subroutine isfvpes(nlat,nlon,isym,nt,sf,vp,idv,jdv,as,bs,av,bv, -c + mdb,ndb,wvhses,lvhses,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients as,bs precomputed -c by shaes for the scalar stream function sf and av,bv precomputed by -c shaes for the scalar velocity potenital vp, subroutine isfvpes computes -c the vector field (v,w) corresponding to sf and vp. w is the east -c longitudinal and v is the colatitudinal component of the vector field. -c (v,w) is expressed in terms of sf,vp by the helmholtz relations (in -c mathematical spherical coordinates): -c -c v = -1/sin(theta)*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sin(theta)*d(st)/dlambda + d(vp)/dtheta -c -c required legendre functions are stored rather than recomputed as -c they are in subroutine isfvpes. v(i,j) and w(i,j) are given at -c colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere (pi=4.0*atan(1.0)). -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vector field is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in sf,vp about the equator. in this case v -c and w are not necessarily symmetric or antisymmetric about -c equator. v and w are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vp is antisymmetric and sf is symmetric about the equator. -c in this case v is symmetric and w antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c vp is symmetric and sf is antisymmetric about the equator. -c in this case v is antisymmetric and w symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute (v,w) for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays v,w as it appears in -c the program that calls isfvpes. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays v,w as it appears in -c the program that calls isfvpes. jdv must be at least nlon. -c -c as,bs two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field sf as computed by subroutine shaes. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field vp as computed by subroutine shaes. -c -c mdb the first dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpes. mdb must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpes. ndb must be at -c least nlat. -c -c wvhses an array which must be initialized by subroutine vhsesi. -c once initialized, wvhses can be used repeatedly by isfvpes -c as long as nlon and nlat remain unchanged. wvhses must -c not bel altered between calls of isfvpes. -c -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls isfvpes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhses must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls isfvpes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym=0 then lwork must be at least -c -c nlat*((2*nt+1)*nlon + 4*l1*nt + 1) -c -c if isym=1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon + nlat*(4*l1*nt + 1) -c -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contains the vector field corresponding to the stream -c function sf and velocity potential vp whose coefficients, -c as,bs (for sf) and av,bv (for vp), were precomputed by -c subroutine shaes. v(i,j) and w(i,j) are given at the -c colatitude point -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude point -c -c lambda(j) = (j-1)*2*pi/nlon -c -c the index ranges are defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lvhses -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine isfvpes(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - + mdb,ndb,wvhses,lvhses,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lvhses,lwork,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real wvhses(lvhses),work(lwork) - integer l1,l2,mn,is,lwk,iwk - integer ibr,ibi,icr,ici -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - l2 = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.l2)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - l1 = min0(nlat,(nlon+1)/2) - if (mdb .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 - l1 = min0(nlat,(nlon+2)/2) - if (lvhses .lt. l1*l2*(nlat+nlat-l1+1)+nlon+15) return - ierror = 10 - if (isym.eq.0) then - if (lwork .lt. nlat*((2*nt+1)*nlon+4*l1*nt+1)) return - else - if (lwork .lt. (2*nt+1)*nlon+nlat*(4*l1*nt+1)) return - end if -c -c set first dimension for br,bi,cr,ci (as requried by vhses) -c - mn = l1*nlat*nt - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - is = ici+mn - iwk = is+nlat - lwk = lwork-4*mn-nlat - call isfvpes1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv,mdb, - +ndb,work(ibr),work(ibi),work(icr),work(ici),l1,work(is), - +wvhses,lvhses,work(iwk),lwk,ierror) - return - end - - subroutine isfvpes1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - +mdb,ndb,br,bi,cr,ci,mab,fnn,wvhses,lvhses,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lvhses,lwk,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real br(mab,nlat,nt),bi(mab,nlat,nt) - real cr(mab,nlat,nt),ci(mab,nlat,nt) - real wvhses(lvhses),wk(lwk),fnn(nlat) - integer n,m,mmax,k,ityp -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = -sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute (v,w) coefficients from as,bs,av,bv -c - do k=1,nt - do n=1,nlat - do m=1,mab - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - br(1,n,k) = -fnn(n)*av(1,n,k) - bi(1,n,k) = -fnn(n)*bv(1,n,k) - cr(1,n,k) = fnn(n)*as(1,n,k) - ci(1,n,k) = fnn(n)*bs(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - br(m,n,k) = -fnn(n)*av(m,n,k) - bi(m,n,k) = -fnn(n)*bv(m,n,k) - cr(m,n,k) = fnn(n)*as(m,n,k) - ci(m,n,k) = fnn(n)*bs(m,n,k) - end do - end do - end do -c -c synthesize br,bi,cr,ci into (v,w) -c - if (isym .eq.0) then - ityp = 0 - else if (isym .eq.1) then - ityp = 3 - else if (isym .eq.2) then - ityp = 6 - end if - call vhses(nlat,nlon,ityp,nt,v,w,idv,jdv,br,bi,cr,ci, - + mab,nlat,wvhses,lvhses,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpgc.f deleted file mode 100755 index 7e219bb21..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpgc.f +++ /dev/null @@ -1,350 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file isfvpgc.f -c -c this file includes documentation and code for -c subroutine isfvpgc i -c -c ... files which must be loaded with isfvpgc.f -c -c sphcom.f, hrfft.f, vhsgc.f, shagc.f, gaqd.f -c -c -c subroutine isfvpgc(nlat,nlon,isym,nt,sf,vp,idv,jdv,as,bs,av,bv, -c + mdb,ndb,wvhsgc,lvhsgc,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients as,bs precomputed -c by shagc for the scalar stream function sf and av,bv precomputed by -c shagc for the scalar velocity potenital vp, subroutine isfvpgc computes -c the vector field (v,w) corresponding to sf and vp. w is the east -c longitudinal and v is the colatitudinal component of the vector field. -c (v,w) is expressed in terms of sf,vp by the helmholtz relations (in -c mathematical spherical coordinates): -c -c v = -1/sin(theta)*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sin(theta)*d(st)/dlambda + d(vp)/dtheta -c -c required legendre functions are recomputed rather than stored as -c they are in subroutine isfvpgs. v(i,j) and w(i,j) are given at -c the i(th) gaussian colatitude point (see gaqd) theta(i) and east -c longitude lambda(j) = (j-1)*2.*pi/nlon on the sphere. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vector field is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in sf,vp about the equator. in this case v -c and w are not necessarily symmetric or antisymmetric about -c equator. v and w are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vp is antisymmetric and sf is symmetric about the equator. -c in this case v is symmetric and w antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c vp is symmetric and sf is antisymmetric about the equator. -c in this case v is antisymmetric and w symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute (v,w) for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays v,w as it appears in -c the program that calls isfvpgc. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays v,w as it appears in -c the program that calls isfvpgc. jdv must be at least nlon. -c -c as,bs two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field sf as computed by subroutine shagc. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field vp as computed by subroutine shagc. -c -c mdb the first dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpgc. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpgc. ndb must be at -c least nlat. -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized, wvhsgc can be used repeatedly by isfvpgc -c as long as nlon and nlat remain unchanged. wvhsgc must -c not bel altered between calls of isfvpgc. -c -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls isfvpgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc must be at least -c -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls isfvpgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)+4*l1*nt+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(4*l1*nt+1) -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contains the vector field corresponding to the stream -c function sf and velocity potential vp whose coefficients, -c as,bs (for sf) and av,bv (for vp), were precomputed by -c subroutine shagc. v(i,j) and w(i,j) are given at the -c i(th) gaussian colatitude point theta(i) and east longitude -c point lambda(j) = (j-1)*2*pi/nlon. the index ranges are -c defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lvhsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine isfvpgc(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - + mdb,ndb,wvhsgc,lvhsgc,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lvhsgc,lwork,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real wvhsgc(lvhsgc),work(lwork) - integer l1,l2,mn,is,lwk,iwk,lwmin - integer ibr,ibi,icr,ici -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - l2 = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.l2)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - l1 = min0(nlat,(nlon+1)/2) - if (mdb .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1+1)+nlon+15 - if (lvhsgc .lt. lwmin) return - ierror = 10 - if (isym .eq. 0) then - lwmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+4*l1*nt+1) - else - lwmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(4*l1*nt+1) - end if - if (lwork .lt. lwmin) return -c -c set first dimension for br,bi,cr,ci (as requried by vhsgc) -c - mn = l1*nlat*nt - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - is = ici+mn - iwk = is+nlat - lwk = lwork-4*mn-nlat - call isfvpgc1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv,mdb, - +ndb,work(ibr),work(ibi),work(icr),work(ici),l1,work(is), - +wvhsgc,lvhsgc,work(iwk),lwk,ierror) - return - end - - subroutine isfvpgc1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - +mdb,ndb,br,bi,cr,ci,mab,fnn,wvhsgc,lvhsgc,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lvhsgc,lwk,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real br(mab,nlat,nt),bi(mab,nlat,nt) - real cr(mab,nlat,nt),ci(mab,nlat,nt) - real wvhsgc(lvhsgc),wk(lwk),fnn(nlat) - integer n,m,mmax,k,ityp -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = -sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute (v,w) coefficients from as,bs,av,bv -c - do k=1,nt - do n=1,nlat - do m=1,mab - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - br(1,n,k) = -fnn(n)*av(1,n,k) - bi(1,n,k) = -fnn(n)*bv(1,n,k) - cr(1,n,k) = fnn(n)*as(1,n,k) - ci(1,n,k) = fnn(n)*bs(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - br(m,n,k) = -fnn(n)*av(m,n,k) - bi(m,n,k) = -fnn(n)*bv(m,n,k) - cr(m,n,k) = fnn(n)*as(m,n,k) - ci(m,n,k) = fnn(n)*bs(m,n,k) - end do - end do - end do -c -c synthesize br,bi,cr,ci into (v,w) -c - if (isym .eq.0) then - ityp = 0 - else if (isym .eq.1) then - ityp = 3 - else if (isym .eq.2) then - ityp = 6 - end if - call vhsgc(nlat,nlon,ityp,nt,v,w,idv,jdv,br,bi,cr,ci, - + mab,nlat,wvhsgc,lvhsgc,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpgs.f deleted file mode 100755 index 0cdf66c3e..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/isfvpgs.f +++ /dev/null @@ -1,349 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file isfvpgs.f -c -c this file includes documentation and code for -c subroutine isfvpgs i -c -c ... files which must be loaded with isfvpgs.f -c -c sphcom.f, hrfft.f, vhsgs.f, shags.f, gaqd.f -c -c -c subroutine isfvpgs(nlat,nlon,isym,nt,sf,vp,idv,jdv,as,bs,av,bv, -c + mdb,ndb,wvhsgs,lvhsgs,work,lwork,ierror) -c -c given the scalar spherical harmonic coefficients as,bs precomputed -c by shags for the scalar stream function sf and av,bv precomputed by -c shags for the scalar velocity potenital vp, subroutine isfvpgs computes -c the vector field (v,w) corresponding to sf and vp. w is the east -c longitudinal and v is the colatitudinal component of the vector field. -c (v,w) is expressed in terms of sf,vp by the helmholtz relations (in -c mathematical spherical coordinates): -c -c v = -1/sin(theta)*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sin(theta)*d(st)/dlambda + d(vp)/dtheta -c -c required legendre functions are stored rather than recomputed as -c they are in subroutine isfvpgc. v(i,j) and w(i,j) are given at -c the i(th) gaussian colatitude point (see gaqd) theta(i) and east -c longitude lambda(j) = (j-1)*2.*pi/nlon on the sphere. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vector field is -c computed on the full or half sphere as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in sf,vp about the equator. in this case v -c and w are not necessarily symmetric or antisymmetric about -c equator. v and w are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vp is antisymmetric and sf is symmetric about the equator. -c in this case v is symmetric and w antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c vp is symmetric and sf is antisymmetric about the equator. -c in this case v is antisymmetric and w symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the v(i,j),w(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then v(i,j),w(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute (v,w) for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays v,w as it appears in -c the program that calls isfvpgs. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays v,w as it appears in -c the program that calls isfvpgs. jdv must be at least nlon. -c -c as,bs two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field sf as computed by subroutine shags. -c -c av,bv two or three dimensional arrays (see input parameter nt) -c that contain the spherical harmonic coefficients of -c the scalar field vp as computed by subroutine shags. -c -c mdb the first dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpgs. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays as,bs,av,bv as it -c appears in the program that calls isfvpgs. ndb must be at -c least nlat. -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c once initialized, wvhsgs can be used repeatedly by isfvpgs -c as long as nlon and nlat remain unchanged. wvhsgs must -c not bel altered between calls of isfvpgs. -c -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls isfvpgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls isfvpgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*((2*nt+1)*nlon + 4*l1*nt + 1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon + nlat*(4*l1*nt+1) -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contains the vector field corresponding to the stream -c function sf and velocity potential vp whose coefficients, -c as,bs (for sf) and av,bv (for vp), were precomputed by -c subroutine shags. v(i,j) and w(i,j) are given at the -c i(th) gaussian colatitude point theta(i) and east longitude -c point lambda(j) = (j-1)*2*pi/nlon. the index ranges are -c defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lvhsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine isfvpgs(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - + mdb,ndb,wvhsgs,lvhsgs,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lvhsgs,lwork,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real wvhsgs(lvhsgs),work(lwork) - integer l1,l2,mn,is,lwk,iwk,lwmin - integer ibr,ibi,icr,ici -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - l2 = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.l2)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - l1 = min0(nlat,(nlon+1)/2) - if (mdb .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 - lwmin = l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat - if (lvhsgs .lt. lwmin) return - ierror = 10 - if (isym .eq. 0) then - lwmin = nlat*((2*nt+1)*nlon+4*l1*nt+1) - else - lwmin = (2*nt+1)*l2*nlon + nlat*(4*l1*nt+1) - end if - if (lwork .lt. lwmin) return -c -c set first dimension for br,bi,cr,ci (as requried by vhsgs) -c - mn = l1*nlat*nt - ierror = 0 -c -c set work space pointers -c - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - is = ici+mn - iwk = is+nlat - lwk = lwork-4*mn-nlat - call isfvpgs1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv,mdb, - +ndb,work(ibr),work(ibi),work(icr),work(ici),l1,work(is), - +wvhsgs,lvhsgs,work(iwk),lwk,ierror) - return - end - - subroutine isfvpgs1(nlat,nlon,isym,nt,v,w,idv,jdv,as,bs,av,bv, - +mdb,ndb,br,bi,cr,ci,mab,fnn,wvhsgs,lvhsgs,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lvhsgs,lwk,ierror - real v(idv,jdv,nt),w(idv,jdv,nt) - real as(mdb,ndb,nt),bs(mdb,ndb,nt) - real av(mdb,ndb,nt),bv(mdb,ndb,nt) - real br(mab,nlat,nt),bi(mab,nlat,nt) - real cr(mab,nlat,nt),ci(mab,nlat,nt) - real wvhsgs(lvhsgs),wk(lwk),fnn(nlat) - integer n,m,mmax,k,ityp -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = -sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute (v,w) coefficients from as,bs,av,bv -c - do k=1,nt - do n=1,nlat - do m=1,mab - br(m,n,k) = 0.0 - bi(m,n,k) = 0.0 - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - br(1,n,k) = -fnn(n)*av(1,n,k) - bi(1,n,k) = -fnn(n)*bv(1,n,k) - cr(1,n,k) = fnn(n)*as(1,n,k) - ci(1,n,k) = fnn(n)*bs(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - br(m,n,k) = -fnn(n)*av(m,n,k) - bi(m,n,k) = -fnn(n)*bv(m,n,k) - cr(m,n,k) = fnn(n)*as(m,n,k) - ci(m,n,k) = fnn(n)*bs(m,n,k) - end do - end do - end do -c -c synthesize br,bi,cr,ci into (v,w) -c - if (isym .eq.0) then - ityp = 0 - else if (isym .eq.1) then - ityp = 3 - else if (isym .eq.2) then - ityp = 6 - end if - call vhsgs(nlat,nlon,ityp,nt,v,w,idv,jdv,br,bi,cr,ci, - + mab,nlat,wvhsgs,lvhsgs,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/islapec.f deleted file mode 100755 index 8d457c9ea..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapec.f +++ /dev/null @@ -1,396 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file islapec.f -c -c this file includes documentation and code for -c subroutine islapec i -c -c ... files which must be loaded with islapec.f -c -c sphcom.f, hrfft.f, shaec.f, shsec.f -c -c subroutine islapec(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, -c +mdab,ndab,wshsec,lshsec,work,lwork,pertrb,ierror) -c -c islapec inverts the laplace or helmholz operator on an equally -c spaced latitudinal grid using o(n**2) storage. given the -c spherical harmonic coefficients a(m,n) and b(m,n) of the right -c hand side slap(i,j), islapec computes a solution sf(i,j) to -c the following helmhotz equation : -c -c 2 2 -c [d(sf(i,j))/dlambda /sint + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c - xlmbda * sf(i,j) = slap(i,j) -c -c where sf(i,j) is computed at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shaec to compute the coefficients a and b for the scalar field -c slap. isym is set as follows: -c -c = 0 no symmetries exist in slap about the equator. scalar -c synthesis is used to compute sf on the entire sphere. -c i.e., in the array sf(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of solutions. in the program that calls islapec -c the arrays sf,a, and b can be three dimensional in which -c case multiple solutions are computed. the third index -c is the solution index with values k=1,...,nt. -c for a single solution set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c and sf,a,b are two dimensional. -c -c xlmbda a one dimensional array with nt elements. if xlmbda is -c is identically zero islapec solves poisson's equation. -c if xlmbda > 0.0 islapec solves the helmholtz equation. -c if xlmbda < 0.0 the nonfatal error flag ierror=-1 is -c returned. negative xlambda could result in a division -c by zero. -c -c ids the first dimension of the array sf as it appears in the -c program that calls islapec. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array sf as it appears in the -c program that calls islapec. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field slap. a,b must be computed by shaec -c prior to calling islapec. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls islapec. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls islapec. ndab must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shaec to -c compute the coefficients a and b. -c -c -c wshsec an array which must be initialized by subroutine shseci. -c once initialized, wshsec can be used repeatedly by -c islapec as long as nlat and nlon remain unchanged. -c wshsec must not be altered between calls of islapec. -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls islapec. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lsave must be greater than or equal to -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls islapec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 let -c -c lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1). -c -c if isym > 0 let -c -c lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) -c -c -c then lwork must be greater than or equal to lwkmin (see ierror=10) -c -c ************************************************************** -c -c output parameters -c -c -c sf two or three dimensional arrays (see input parameter nt) -c that contain the solution to either the helmholtz -c (xlmbda>0.0) or poisson's equation. sf(i,j) is computed -c at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c pertrb a one dimensional array with nt elements (see input -c parameter nt). in the discription that follows we assume -c that nt=1. if xlmbda > 0.0 then pertrb=0.0 is always -c returned because the helmholtz operator is invertible. -c if xlmbda = 0.0 then a solution exists only if a(1,1) -c is zero. islapec sets a(1,1) to zero. the resulting -c solution sf(i,j) solves poisson's equation with -c pertrb = a(1,1)/(2.*sqrt(2.)) subtracted from the -c right side slap(i,j). -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c =-1 xlmbda is input negative (nonfatal error) -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lsave -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for islapec -c -c ********************************************************************** -c - - - subroutine islapec(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,wshsec,lshsec,work,lwork,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshsec(lshsec),work(lwork),pertrb(nt),xlmbda(nt) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c -c - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - lwmin = 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 - if(lshsec .lt. lwmin) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym .eq. 0) then - lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c check sign of xlmbda -c - do k=1,nt - if (xlmbda(k).lt.0.0) then - ierror = -1 - end if - end do -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call islpec1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshsec,lshsec,work(iwk),lwk, - +pertrb,ierror) - return - end - - subroutine islpec1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,as,bs,mmax,fnn,wshsec,lshsec,wk,lwk,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension as(mmax,nlat,nt),bs(mmax,nlat,nt),fnn(nlat) - dimension wshsec(lshsec),wk(lwk),pertrb(nt),xlmbda(nt) -c -c set multipliers and preset synthesis coefficients to zero -c - do n=1,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.0) - do m=1,mmax - do k=1,nt - as(m,n,k) = 0.0 - bs(m,n,k) = 0.0 - end do - end do - end do - - do k=1,nt -c -c compute synthesis coefficients for xlmbda zero or nonzero -c - if (xlmbda(k) .eq. 0.0) then - do n=2,nlat - as(1,n,k) = -a(1,n,k)/fnn(n) - bs(1,n,k) = -b(1,n,k)/fnn(n) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/fnn(n) - bs(m,n,k) = -b(m,n,k)/fnn(n) - end do - end do - else -c -c xlmbda nonzero so operator invertible unless -c -n*(n-1) = xlmbda(k) < 0.0 for some n -c - pertrb(k) = 0.0 - do n=1,nlat - as(1,n,k) = -a(1,n,k)/(fnn(n)+xlmbda(k)) - bs(1,n,k) = -b(1,n,k)/(fnn(n)+xlmbda(k)) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/(fnn(n)+xlmbda(k)) - bs(m,n,k) = -b(m,n,k)/(fnn(n)+xlmbda(k)) - end do - end do - end if - end do -c -c synthesize as,bs into sf -c - call shsec(nlat,nlon,isym,nt,sf,ids,jds,as,bs,mmax,nlat, - + wshsec,lshsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/islapes.f deleted file mode 100755 index d841191b1..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapes.f +++ /dev/null @@ -1,383 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file islapes.f -c -c this file includes documentation and code for -c subroutine islapes i -c -c ... files which must be loaded with islapes.f -c -c sphcom.f, hrfft.f, shaes.f, shses.f -c -c subroutine islapes(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, -c +mdab,ndab,wshses,lshses,work,lwork,pertrb,ierror) -c -c islapes inverts the laplace or helmholz operator on an equally -c spaced latitudinal grid using o(n**3) storage. given the -c spherical harmonic coefficients a(m,n) and b(m,n) of the right -c hand side slap(i,j), islapes computes a solution sf(i,j) to -c the following helmhotz equation : -c -c 2 2 -c [d(sf(i,j))/dlambda /sint + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c - xlmbda * sf(i,j) = slap(i,j) -c -c where sf(i,j) is computed at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shaes to compute the coefficients a and b for the scalar field -c slap. isym is set as follows: -c -c = 0 no symmetries exist in slap about the equator. scalar -c synthesis is used to compute sf on the entire sphere. -c i.e., in the array sf(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of solutions. in the program that calls islapes -c the arrays sf,a, and b can be three dimensional in which -c case multiple solutions are computed. the third index -c is the solution index with values k=1,...,nt. -c for a single solution set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c and sf,a,b are two dimensional. -c -c xlmbda a one dimensional array with nt elements. if xlmbda is -c is identically zero islapes solves poisson's equation. -c if xlmbda > 0.0 islapes solves the helmholtz equation. -c if xlmbda < 0.0 the nonfatal error flag ierror=-1 is -c returned. negative xlambda could result in a division -c by zero. -c -c ids the first dimension of the array sf as it appears in the -c program that calls islapes. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array sf as it appears in the -c program that calls islapes. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field slap. a,b must be computed by shaes -c prior to calling islapes. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls islapes. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls islapes. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shaes to -c compute the coefficients a and b. -c -c -c wshses an array which must be initialized by subroutine shsesi. -c once initialized, wshses can be used repeatedly by -c islapes as long as nlat and nlon remain unchanged. -c wshses must not be altered between calls of islapes. -c -c lshses the dimension of the array wshses as it appears in the -c program that calls islapes. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls islapes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym is zero then lwork must be at least -c -c (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) -c -c if isym is nonzero lwork must be at least -c -c (nt+1)*l2*nlon + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional arrays (see input parameter nt) that -c inverts the scalar laplacian in slap - pertrb. sf(i,j) is given -c at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c pertrb a one dimensional array with nt elements (see input -c parameter nt). in the discription that follows we assume -c that nt=1. if xlmbda > 0.0 then pertrb=0.0 is always -c returned because the helmholtz operator is invertible. -c if xlmbda = 0.0 then a solution exists only if a(1,1) -c is zero. islapec sets a(1,1) to zero. the resulting -c solution sf(i,j) solves poisson's equation with -c pertrb = a(1,1)/(2.*sqrt(2.)) subtracted from the -c right side slap(i,j). -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshses -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for islapes -c -c ********************************************************************** -c - subroutine islapes(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,wshses,lshses,work,lwork,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshses(lshses),work(lwork),xlmbda(nt),pertrb(nt) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwkmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwkmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym.eq.0) then - lwkmin = (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) - else - lwkmin = (nt+1)*l2*nlon + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c check sign of xlmbda -c - do k=1,nt - if (xlmbda(k).lt.0.0) then - ierror = -1 - end if - end do -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call islpes1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshses,lshses,work(iwk),lwk, - +pertrb,ierror) - return - end - - subroutine islpes1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,as,bs,mmax,fnn,wshses,lshses,wk,lwk,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension as(mmax,nlat,nt),bs(mmax,nlat,nt),fnn(nlat) - dimension wshses(lshses),wk(lwk),pertrb(nt),xlmbda(nt) -c -c set multipliers and preset synthesis coefficients to zero -c - do n=1,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.0) - do m=1,mmax - do k=1,nt - as(m,n,k) = 0.0 - bs(m,n,k) = 0.0 - end do - end do - end do - do k=1,nt -c -c compute synthesis coefficients for xlmbda zero or nonzero -c - if (xlmbda(k) .eq. 0.0) then - do n=2,nlat - as(1,n,k) = -a(1,n,k)/fnn(n) - bs(1,n,k) = -b(1,n,k)/fnn(n) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/fnn(n) - bs(m,n,k) = -b(m,n,k)/fnn(n) - end do - end do - else -c -c xlmbda nonzero so operator invertible unless -c -n*(n-1) = xlmbda(k) < 0.0 for some n -c - pertrb(k) = 0.0 - do n=1,nlat - as(1,n,k) = -a(1,n,k)/(fnn(n)+xlmbda(k)) - bs(1,n,k) = -b(1,n,k)/(fnn(n)+xlmbda(k)) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/(fnn(n)+xlmbda(k)) - bs(m,n,k) = -b(m,n,k)/(fnn(n)+xlmbda(k)) - end do - end do - end if - end do -c -c synthesize as,bs into sf -c - call shses(nlat,nlon,isym,nt,sf,ids,jds,as,bs,mmax,nlat, - + wshses,lshses,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/islapgc.f deleted file mode 100755 index 14b37adb4..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapgc.f +++ /dev/null @@ -1,385 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file islapgc.f -c -c this file includes documentation and code for -c subroutine islapgc i -c -c ... files which must be loaded with islapgc.f -c -c sphcom.f, hrfft.f, shagc.f, shsgc.f -c -c subroutine islapgc(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, -c +mdab,ndab,wshsgc,lshsgc,work,lwork,pertrb,ierror) -c -c islapgc inverts the laplace or helmholz operator on a Gaussian -c grid using o(n**2) storage. given the -c spherical harmonic coefficients a(m,n) and b(m,n) of the right -c hand side slap(i,j), islapgc computes a solution sf(i,j) to -c the following helmhotz equation : -c -c 2 2 -c [d(sf(i,j))/dlambda /sint + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c - xlmbda * sf(i,j) = slap(i,j) -c -c where sf(i,j) is computed at the Gaussian colatitude point theta(i) -c (see nlat as an input argument) and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shagc to compute the coefficients a and b for the scalar field -c slap. isym is set as follows: -c -c = 0 no symmetries exist in slap about the equator. scalar -c synthesis is used to compute sf on the entire sphere. -c i.e., in the array sf(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of solutions. in the program that calls islapgc -c the arrays sf,a, and b can be three dimensional in which -c case multiple solutions are computed. the third index -c is the solution index with values k=1,...,nt. -c for a single solution set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c and sf,a,b are two dimensional. -c -c xlmbda a one dimensional array with nt elements. if xlmbda is -c is identically zero islapgc solves poisson's equation. -c if xlmbda > 0.0 islapgc solves the helmholtz equation. -c if xlmbda < 0.0 the nonfatal error flag ierror=-1 is -c returned. negative xlambda could result in a division -c by zero. -c -c ids the first dimension of the array sf as it appears in the -c program that calls islapgc. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array sf as it appears in the -c program that calls islapgc. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field slap. a,b must be computed by shagc -c prior to calling islapgc. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls islapgc. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls islapgc. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shagc to -c compute the coefficients a and b. -c -c wshsgc an array which must be initialized by subroutine shsgci -c once initialized, wshsgc can be used repeatedly by islapgc -c as long as nlon and nlat remain unchanged. wshsgc must -c not be altered between calls of islapgc. -c -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls islapgc. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls islapgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 let -c -c lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1). -c -c if isym > 0 let -c -c lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) -c -c -c then lwork must be greater than or equal to lwkmin (see ierror=10) -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional arrays (see input parameter nt) that -c inverts the scalar laplacian in slap. sf(i,j) is given at -c the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c pertrb a one dimensional array with nt elements (see input -c parameter nt). in the discription that follows we assume -c that nt=1. if xlmbda > 0.0 then pertrb=0.0 is always -c returned because the helmholtz operator is invertible. -c if xlmbda = 0.0 then a solution exists only if a(1,1) -c is zero. islapgc sets a(1,1) to zero. the resulting -c solution sf(i,j) solves poisson's equation with -c pertrb = a(1,1)/(2.*sqrt(2.)) subtracted from the -c right side slap(i,j). -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshsgc -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for islapgc -c -c ********************************************************************** -c - subroutine islapgc(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,wshsgc,lshsgc,work,lwork,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshsgc(lshsgc),work(lwork),xlmbda(nt),pertrb(nt) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c -c - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - lwmin = nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 - if(lshsgc .lt. lwmin) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwmin) return - if (isym .eq. 0) then - lwmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*l1*nt+1) - else - lwmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*l1*nt+1) - end if - if (lwork .lt. lwmin) return - ierror = 0 -c -c check sign of xlmbda -c - do k=1,nt - if (xlmbda(k).lt.0.0) then - ierror = -1 - end if - end do -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call islpgc1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshsgc,lshsgc,work(iwk),lwk, - +pertrb,ierror) - return - end - - subroutine islpgc1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,as,bs,mmax,fnn,wsav,lsav,wk,lwk,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension as(mmax,nlat,nt),bs(mmax,nlat,nt),fnn(nlat) - dimension wsav(lsav),wk(lwk),xlmbda(nt),pertrb(nt) -c -c set multipliers and preset synthesis coefficients to zero -c - do n=1,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.0) - do m=1,mmax - do k=1,nt - as(m,n,k) = 0.0 - bs(m,n,k) = 0.0 - end do - end do - end do - - do k=1,nt -c -c compute synthesis coefficients for xlmbda zero or nonzero -c - if (xlmbda(k) .eq. 0.0) then - do n=2,nlat - as(1,n,k) = -a(1,n,k)/fnn(n) - bs(1,n,k) = -b(1,n,k)/fnn(n) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/fnn(n) - bs(m,n,k) = -b(m,n,k)/fnn(n) - end do - end do - else -c -c xlmbda nonzero so operator invertible unless -c -n*(n-1) = xlmbda(k) < 0.0 for some n -c - pertrb(k) = 0.0 - do n=1,nlat - as(1,n,k) = -a(1,n,k)/(fnn(n)+xlmbda(k)) - bs(1,n,k) = -b(1,n,k)/(fnn(n)+xlmbda(k)) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/(fnn(n)+xlmbda(k)) - bs(m,n,k) = -b(m,n,k)/(fnn(n)+xlmbda(k)) - end do - end do - end if - end do -c -c synthesize as,bs into sf -c - call shsgc(nlat,nlon,isym,nt,sf,ids,jds,as,bs,mmax,nlat, - + wsav,lsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/islapgs.f deleted file mode 100755 index bed4a92b4..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/islapgs.f +++ /dev/null @@ -1,387 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file islapgs.f -c -c this file includes documentation and code for -c subroutine islapgs i -c -c ... files which must be loaded with islapec.f -c -c sphcom.f, hrfft.f, shags.f, shsgs.f -c -c subroutine islapgs(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, -c +mdab,ndab,wshsgs,lshsgs,work,lwork,pertrb,ierror) -c -c islapgs inverts the laplace or helmholz operator on a Gaussian grid. -c Given the spherical harmonic coefficients a(m,n) and b(m,n) of the -c right hand side slap(i,j), islapgc computes a solution sf(i,j) to -c the following helmhotz equation : -c -c 2 2 -c [d(sf(i,j))/dlambda /sint + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c - xlmbda * sf(i,j) = slap(i,j) -c -c where sf(i,j) is computed at the Gaussian colatitude point theta(i) -c (see nlat as an input argument) and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shags to compute the coefficients a and b for the scalar field -c slap. isym is set as follows: -c -c = 0 no symmetries exist in slap about the equator. scalar -c synthesis is used to compute sf on the entire sphere. -c i.e., in the array sf(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute sf is performed on the -c northern hemisphere only. if nlat is odd, sf(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, sf(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of analyses. in the program that calls islapgs -c the arrays sf,a, and b can be three dimensional in which -c case multiple synthesis will be performed. the third index -c is the synthesis index which assumes the values k=1,...,nt. -c k is also the index for the perturbation array pertrb. -c for a single analysis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c or that sf,a,b are two dimensional and pertrb is a constant. -c -c xlmbda a one dimensional array with nt elements. if xlmbda is -c is identically zero islapgc solves poisson's equation. -c if xlmbda > 0.0 islapgc solves the helmholtz equation. -c if xlmbda < 0.0 the nonfatal error flag ierror=-1 is -c returned. negative xlambda could result in a division -c by zero. -c -c ids the first dimension of the array sf as it appears in the -c program that calls islapgs. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array sf as it appears in the -c program that calls islapgs. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field slap as computed by subroutine shags. -c *** a,b must be computed by shags prior to calling islapgs. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls islapgs. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls islapgs. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shags to -c compute the coefficients a and b. -c -c -c wshsgs an array which must be initialized by subroutine islapgsi -c (or equivalently by shsesi). once initialized, wshsgs -c can be used repeatedly by islapgs as long as nlat and nlon -c remain unchanged. wshsgs must not be altered between calls -c of islapgs. -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls islapgs. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls islapgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym is zero then lwork must be at least -c -c (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) -c -c if isym is nonzero lwork must be at least -c -c (nt+1)*l2*nlon + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c sf a two or three dimensional arrays (see input parameter nt) that -c inverts the scalar laplacian in slap. sf(i,j) is given at -c the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c pertrb a one dimensional array with nt elements (see input -c parameter nt). in the discription that follows we assume -c that nt=1. if xlmbda > 0.0 then pertrb=0.0 is always -c returned because the helmholtz operator is invertible. -c if xlmbda = 0.0 then a solution exists only if a(1,1) -c is zero. islapec sets a(1,1) to zero. the resulting -c solution sf(i,j) solves poisson's equation with -c pertrb = a(1,1)/(2.*sqrt(2.)) subtracted from the -c right side slap(i,j). -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshsgs -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for islapgs -c -c ********************************************************************** -c -c - subroutine islapgs(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,wshsgs,lshsgs,work,lwork,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshsgs(lshsgs),work(lwork),xlmbda(nt),pertrb(nt) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c - imid = (nlat+1)/2 - l2 = (nlat+mod(nlat,2))/2 - l1 = min0((nlon+2)/2,nlat) - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwkmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwkmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym.eq.0) then - lwkmin = (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) - else - lwkmin = (nt+1)*l2*nlon + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c check sign of xlmbda -c - do k=1,nt - if (xlmbda(k).lt.0.0) then - ierror = -1 - end if - end do -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call islpgs1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshsgs,lshsgs,work(iwk),lwk, - +pertrb,ierror) - return - end - - subroutine islpgs1(nlat,nlon,isym,nt,xlmbda,sf,ids,jds,a,b, - +mdab,ndab,as,bs,mmax,fnn,wsav,lsav,wk,lwk,pertrb,ierror) - dimension sf(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension as(mmax,nlat,nt),bs(mmax,nlat,nt),fnn(nlat) - dimension wsav(lsav),wk(lwk),xlmbda(nt),pertrb(nt) -c -c set multipliers and preset synthesis coefficients to zero -c - do n=1,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.0) - do m=1,mmax - do k=1,nt - as(m,n,k) = 0.0 - bs(m,n,k) = 0.0 - end do - end do - end do - - do k=1,nt -c -c compute synthesis coefficients for xlmbda zero or nonzero -c - if (xlmbda(k) .eq. 0.0) then - do n=2,nlat - as(1,n,k) = -a(1,n,k)/fnn(n) - bs(1,n,k) = -b(1,n,k)/fnn(n) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/fnn(n) - bs(m,n,k) = -b(m,n,k)/fnn(n) - end do - end do - else -c -c xlmbda nonzero so operator invertible unless -c -n*(n-1) = xlmbda(k) < 0.0 for some n -c - pertrb(k) = 0.0 - do n=1,nlat - as(1,n,k) = -a(1,n,k)/(fnn(n)+xlmbda(k)) - bs(1,n,k) = -b(1,n,k)/(fnn(n)+xlmbda(k)) - end do - do m=2,mmax - do n=m,nlat - as(m,n,k) = -a(m,n,k)/(fnn(n)+xlmbda(k)) - bs(m,n,k) = -b(m,n,k)/(fnn(n)+xlmbda(k)) - end do - end do - end if - end do -c -c synthesize as,bs into sf -c - call shsgs(nlat,nlon,isym,nt,sf,ids,jds,as,bs,mmax,nlat, - + wsav,lsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapec.f deleted file mode 100755 index b69b93e41..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapec.f +++ /dev/null @@ -1,500 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivlapec.f -c -c this file includes documentation and code for -c subroutine ivlapec -c -c ... files which must be loaded with ivlapec.f -c -c sphcom.f, hrfft.f, vhaec.f, vhsec.f -c -c -c -c subroutine ivlapec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhsec,lvhsec,work,lwork,ierror) -c -c -c subroutine ivlapec computes a the vector field (v,w) whose vector -c laplacian is (vlap,wlap). w and wlap are east longitudinal -c components of the vectors. v and vlap are colatitudinal components -c of the vectors. br,bi,cr, and ci are the vector harmonic coefficients -c of (vlap,wlap). these must be precomputed by vhaec and are input -c parameters to ivlapec. (v,w) have the same symmetry or lack of -c symmetry about the about the equator as (vlap,wlap). the input -c parameters ityp,nt,mdbc,ndbc must have the same values used by -c vhaec to compute br,bi,cr, and ci for (vlap,wlap). -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhaec to compute the coefficients br,bi,cr, and ci for the -c vector field (vlap,wlap). ityp is set as follows: -c -c = 0 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c arrays v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c = 1 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. the -c vorticity of (vlap,wlap) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (v,w) is -c also zero. -c -c -c = 2 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c w(i,j) and v(i,j) for i=1,...,nlat and j=1,...,nlon. the -c divergence of (vlap,wlap) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (v,w) is -c also zero. -c -c = 3 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 5 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c = 6 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 8 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c nt nt is the number of vector fields (vlap,wlap). some computational -c efficiency is obtained for multiple fields. in the program -c that calls ivlapec, the arrays v,w,br,bi,cr and ci can be -c three dimensional corresponding to an indexed multiple vector -c field. in this case multiple vector synthesis will be performed -c to compute the (v,w) for each field (vlap,wlap). the third -c index is the synthesis index which assumes the values k=1,...,nt. -c for a single synthesis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 or -c that all arrays are two dimensional. -c -c idvw the first dimension of the arrays w and v as it appears in -c the program that calls ivlapec. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays w and v as it appears in -c the program that calls ivlapec. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients of the -c vector field (vlap,wlap) as computed by subroutine vhaec. -c br,bi,cr and ci must be computed by vhaec prior to calling -c ivlapec. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapec. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapec. ndbc must be at -c least nlat. -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized, wvhsec -c can be used repeatedly by ivlapec as long as nlat and nlon -c remain unchanged. wvhsec must not be altered between calls -c of ivlapec. -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls ivlapec. let -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivlapec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 let -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(4*nt*l1+1) -c -c will suffice as a minimum length for lwork -c (see ierror=10 below) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose vector laplacian is (vlap,wlap). -c w(i,j) is the east longitude and v(i,j) is the colatitudinal -c component of the vector. v(i,j) and w(i,j) are given on the -c sphere at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c for i=1,...,nlat and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for j=1,...,nlon. -c -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let sf be either v -c or w. define: -c -c del2s(sf) = [d(sint*d(sf)/dtheta)/dtheta + -c 2 2 -c d (sf)/dlambda /sint]/sint -c -c then the vector laplacian of (v,w) in (vlap,wlap) satisfies -c -c vlap = del2s(v) + (2*cost*dw/dlambda - v)/sint**2 -c -c and -c -c wlap = del2s(w) - (2*cost*dv/dlambda + w)/sint**2 -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhsec -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for ivlapec -c -c ********************************************************************** -c - subroutine ivlapec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - +mdbc,ndbc,wvhsec,lvhsec,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsec(lvhsec),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 -c -c set minimum and verify saved workspace length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid -c lsavmin = lzimn+lzimn+nlon+15 -c if (lvhsec .lt. lsavmin) return - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsec .lt. 2*(lzz1+labc)+nlon+15) return -c -c set minimum and verify unsaved work space length -c - ierror = 10 - mn = mmax*nlat*nt - if(ityp.lt.3) then -c no symmetry - if (ityp.eq.0) then -c br,bi,cr,ci nonzero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+4*mn - else -c br,bi or cr,ci zero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+2*mn - end if - else -c symmetry - if (ityp.eq.3 .or. ityp.eq.6) then -c br,bi,cr,ci nonzero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat - else -c br,bi or cr,ci zero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat - end if - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - liwk = lwork-4*mn-nlat - else - liwk = lwork-2*mn-nlat - end if - call ivlapec1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhsec,lvhsec,work(iwk),liwk,ierror) - return - end - - subroutine ivlapec1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw, - +bivw,crvw,civw,mmax,fnn,mdbc,ndbc,br,bi,cr,ci,wsave,lwsav, - +wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension fnn(nlat),brvw(mmax,nlat,nt),bivw(mmax,nlat,nt) - dimension crvw(mmax,nlat,nt),civw(mmax,nlat,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wsave(lwsav),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -1.0/(fn*(fn+1.)) - 1 continue -c -c set (v,w) coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (v,w) -c - call vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw,bivw, - + crvw,civw,mmax,nlat,wsave,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapes.f deleted file mode 100755 index f3b89913f..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapes.f +++ /dev/null @@ -1,487 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file ivlapes.f -c -c this file includes documentation and code for -c subroutine ivlapes -c -c ... files which must be loaded with ivlapes.f -c -c sphcom.f, hrfft.f, vhaes.f, vhses.f -c -c -c -c subroutine ivlapes(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhses,lvhses,work,lwork,ierror) -c -c -c subroutine ivlapes computes a the vector field (v,w) whose vector -c laplacian is (vlap,wlap). w and wlap are east longitudinal -c components of the vectors. v and vlap are colatitudinal components -c of the vectors. br,bi,cr, and ci are the vector harmonic coefficients -c of (vlap,wlap). these must be precomputed by vhaes and are input -c parameters to ivlapes. (v,w) have the same symmetry or lack of -c symmetry about the about the equator as (vlap,wlap). the input -c parameters ityp,nt,mdbc,ndbc must have the same values used by -c vhaes to compute br,bi,cr, and ci for (vlap,wlap). -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhaes to compute the coefficients br,bi,cr, and ci for the -c vector field (vlap,wlap). ityp is set as follows: -c -c = 0 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c arrays v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c = 1 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. the -c vorticity of (vlap,wlap) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (v,w) is -c also zero. -c -c -c = 2 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c w(i,j) and v(i,j) for i=1,...,nlat and j=1,...,nlon. the -c divergence of (vlap,wlap) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (v,w) is -c also zero. -c -c = 3 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 5 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c = 6 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 8 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c nt nt is the number of vector fields (vlap,wlap). some computational -c efficiency is obtained for multiple fields. in the program -c that calls ivlapes, the arrays v,w,br,bi,cr and ci can be -c three dimensional corresponding to an indexed multiple vector -c field. in this case multiple vector synthesis will be performed -c to compute the (v,w) for each field (vlap,wlap). the third -c index is the synthesis index which assumes the values k=1,...,nt. -c for a single synthesis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 or -c that all arrays are two dimensional. -c -c idvw the first dimension of the arrays w and v as it appears in -c the program that calls ivlapes. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays w and v as it appears in -c the program that calls ivlapes. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients of the -c vector field (vlap,wlap) as computed by subroutine vhaes. -c br,bi,cr and ci must be computed by vhaes prior to calling -c ivlapes. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapes. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapes. ndbc must be at -c least nlat. -c -c wvhses an array which must be initialized by subroutine vhsesi. -c once initialized, wvhses -c can be used repeatedly by ivlapes as long as nlat and nlon -c remain unchanged. wvhses must not be altered between calls -c of ivlapes. -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls ivlapes. let -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c let -c -c lsavmin = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c then lvhses must be greater than or equal to lsavmin -c (see ierror=9 below). -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivlapes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 then -c -c (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) -c -c will suffice as a length for lwork. -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose vector laplacian is (vlap,wlap). -c w(i,j) is the east longitude and v(i,j) is the colatitudinal -c component of the vector. v(i,j) and w(i,j) are given on the -c sphere at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c for i=1,...,nlat and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for j=1,...,nlon. -c -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let sf be either v -c or w. define: -c -c del2s(sf) = [d(sint*d(sf)/dtheta)/dtheta + -c 2 2 -c d (sf)/dlambda /sint]/sint -c -c then the vector laplacian of (v,w) in (vlap,wlap) satisfies -c -c vlap = del2s(v) + (2*cost*dw/dlambda - v)/sint**2 -c -c and -c -c wlap = del2s(w) - (2*cost*dv/dlambda + w)/sint**2 -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhses -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for ivlapes -c -c ********************************************************************** -c - subroutine ivlapes(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - +mdbc,ndbc,wvhses,lvhses,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhses(lvhses),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 -c -c set minimum and verify saved workspace length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lsavmin = lzimn+lzimn+nlon+15 - if (lvhses .lt. lsavmin) return -c -c set minimum and verify unsaved work space length -c - mn = mmax*nlat*nt - l2 = (nlat+1)/2 - l1 = min0(nlat,(nlon+1)/2) - if (ityp .le. 2) then - lwkmin = (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) - else - lwkmin = (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - liwk = lwork-4*mn-nlat - else - liwk = lwork-2*mn-nlat - end if - call ivlapes1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhses,lvhses,work(iwk),liwk,ierror) - return - end - - subroutine ivlapes1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw, - +bivw,crvw,civw,mmax,fnn,mdbc,ndbc,br,bi,cr,ci,wsave,lsave, - +wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension fnn(nlat),brvw(mmax,nlat,nt),bivw(mmax,nlat,nt) - dimension crvw(mmax,nlat,nt),civw(mmax,nlat,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wsave(lsave),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -1.0/(fn*(fn+1.)) - 1 continue -c -c set (u,v) coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (v,w) -c - call vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw,bivw, - + crvw,civw,mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapgc.f deleted file mode 100755 index 445b6753c..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapgc.f +++ /dev/null @@ -1,489 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivlapgc.f -c -c this file includes documentation and code for -c subroutine ivlapgc -c -c ... files which must be loaded with ivlapgc.f -c -c sphcom.f, hrfft.f, vhagc.f, vhsgc.f, gaqd.f -c -c subroutine ivlapgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhsgc,lvhsgc,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients (br,bi,cr,ci) -c precomputed by subroutine vhagc for a vector field (vlap,wlap), -c subroutine ivlapgc computes a vector field (v,w) whose vector -c laplacian is (vlap,wlap). v,vlap are the colatitudinal -c components and w,wlap are the east longitudinal components of -c the vectors. (v,w) have the same symmetry or lack of symmetry -c about the equator as (vlap,wlap). the input parameters ityp, -c nt,mdbc,ndbc must have the same values used by vhagc to compute -c br,bi,cr,ci for (vlap,wlap). -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhagc to compute the coefficients br,bi,cr, and ci for the -c vector field (vlap,wlap). ityp is set as follows: -c -c = 0 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c arrays v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c = 1 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. the -c vorticity of (vlap,wlap) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (v,w) is -c also zero. -c -c -c = 2 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c w(i,j) and v(i,j) for i=1,...,nlat and j=1,...,nlon. the -c divergence of (vlap,wlap) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (v,w) is -c also zero. -c -c = 3 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 5 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c = 6 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 8 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c nt nt is the number of vector fields (vlap,wlap). some computational -c efficiency is obtained for multiple fields. in the program -c that calls ivlapgc, the arrays v,w,br,bi,cr and ci can be -c three dimensional corresponding to an indexed multiple vector -c field. in this case multiple vector synthesis will be performed -c to compute the (v,w) for each field (vlap,wlap). the third -c index is the synthesis index which assumes the values k=1,...,nt. -c for a single synthesis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 or -c that all arrays are two dimensional. -c -c idvw the first dimension of the arrays w and v as it appears in -c the program that calls ivlapgc. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays w and v as it appears in -c the program that calls ivlapgc. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients of the -c vector field (vlap,wlap) as computed by subroutine vhagc. -c br,bi,cr and ci must be computed by vhagc prior to calling -c ivlapgc. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapgc. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapgc. ndbc must be at -c least nlat. -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized, wvhsgc -c can be used repeatedly by ivlapgc as long as nlat and nlon -c remain unchanged. wvhsgc must not be altered between calls -c of ivlapgc. -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls ivlapgc. let -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c then lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivlapgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 let -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(4*nt*l1+1) -c -c will suffice as a minimum length for lwork -c (see ierror=10 below) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose vector laplacian is (vlap,wlap). -c w(i,j) is the east longitude and v(i,j) is the colatitudinal -c component of the vector. v(i,j) and w(i,j) are given on the -c sphere at the guassian colatitude theta(i) for i=1,...,nlat -c and east longitude lambda(j)=(j-1)*2*pi/nlon for j = 1,...,nlon. -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let sf be either v -c or w. define: -c -c del2s(sf) = [d(sint*d(sf)/dtheta)/dtheta + -c 2 2 -c d (sf)/dlambda /sint]/sint -c -c then the vector laplacian of (v,w) in (vlap,wlap) satisfies -c -c vlap = del2s(v) + (2*cost*dw/dlambda - v)/sint**2 -c -c and -c -c wlap = del2s(w) - (2*cost*dv/dlambda + w)/sint**2 -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhsgc -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for ivlapgc -c -c ********************************************************************** -c - subroutine ivlapgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - +mdbc,ndbc,wvhsgc,lvhsgc,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsgc(lvhsgc),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 -c -c set minimum and verify saved workspace length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lsavmin = lzimn+lzimn+nlon+15 - if (lvhsgc .lt. lsavmin) return -c -c set minimum and verify unsaved work space length -c - ierror = 10 - mn = mmax*nlat*nt - if(ityp.lt.3) then -c no symmetry - if (ityp.eq.0) then -c br,bi,cr,ci nonzero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+4*mn - else -c br,bi or cr,ci zero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+2*mn - end if - else -c symmetry - if (ityp.eq.3 .or. ityp.eq.6) then -c br,bi,cr,ci nonzero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat - else -c br,bi or cr,ci zero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat - end if - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - liwk = lwork-4*mn-nlat - else - liwk = lwork-2*mn-nlat - end if - call ivlapgc1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhsgc,lvhsgc,work(iwk),liwk,ierror) - return - end - - subroutine ivlapgc1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw, - +bivw,crvw,civw,mmax,fnn,mdbc,ndbc,br,bi,cr,ci,wvhsgc,lvhsgc, - +wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension fnn(nlat),brvw(mmax,nlat,nt),bivw(mmax,nlat,nt) - dimension crvw(mmax,nlat,nt),civw(mmax,nlat,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsgc(lvhsgc),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -1.0/(fn*(fn+1.)) - 1 continue -c -c set (u,v) coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (v,w) -c - call vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw,bivw, - + crvw,civw,mmax,nlat,wvhsgc,lvhsgc,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapgs.f deleted file mode 100755 index 4256db165..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivlapgs.f +++ /dev/null @@ -1,477 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivlapgs.f -c -c this file includes documentation and code for -c subroutine ivlapgs -c -c ... files which must be loaded with ivlapgs.f -c -c sphcom.f, hrfft.f, vhags.f, vhsgs.f, gaqd.f -c -c -c subroutine ivlapgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhsgs,lvhsgs,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients (br,bi,cr,ci) -c precomputed by subroutine vhags for a vector field (vlap,wlap), -c subroutine ivlapgs computes a vector field (v,w) whose vector -c laplacian is (vlap,wlap). v,vlap are the colatitudinal -c components and w,wlap are the east longitudinal components of -c the vectors. (v,w) have the same symmetry or lack of symmetry -c about the equator as (vlap,wlap). the input parameters ityp, -c nt,mdbc,ndbc must have the same values used by vhags to compute -c br,bi,cr,ci for (vlap,wlap). -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhags to compute the coefficients br,bi,cr, and ci for the -c vector field (vlap,wlap). ityp is set as follows: -c -c = 0 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c arrays v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c = 1 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c v(i,j) and w(i,j) for i=1,...,nlat and j=1,...,nlon. the -c vorticity of (vlap,wlap) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (v,w) is -c also zero. -c -c -c = 2 no symmetries exist in (vlap,wlap) about the equator. (v,w) -c is computed and stored on the entire sphere in the arrays -c w(i,j) and v(i,j) for i=1,...,nlat and j=1,...,nlon. the -c divergence of (vlap,wlap) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (v,w) is -c also zero. -c -c = 3 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays v(i,j), -c w(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays v(i,j),w(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 5 wlap is antisymmetric and vlap is symmetric about the -c equator. consequently w is antisymmetric and v is symmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c = 6 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the vorticity of (vlap, -c wlap) is zero so the coefficients cr,ci are zero and -c are not used. the vorticity of (v,w) is also zero. -c -c = 8 wlap is symmetric and vlap is antisymmetric about the -c equator. consequently w is symmetric and v is antisymmetric. -c (v,w) is computed and stored on the northern hemisphere -c only. if nlat is odd, storage is in the arrays w(i,j), -c v(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat -c is even, storage is in the arrays w(i,j),v(i,j) for -c i=1,...,nlat/2 and j=1,...,nlon. the divergence of (vlap, -c wlap) is zero so the coefficients br,bi are zero and -c are not used. the divergence of (v,w) is also zero. -c -c -c nt nt is the number of vector fields (vlap,wlap). some computational -c efficiency is obtained for multiple fields. in the program -c that calls ivlapgs, the arrays v,w,br,bi,cr and ci can be -c three dimensional corresponding to an indexed multiple vector -c field. in this case multiple vector synthesis will be performed -c to compute the (v,w) for each field (vlap,wlap). the third -c index is the synthesis index which assumes the values k=1,...,nt. -c for a single synthesis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 or -c that all arrays are two dimensional. -c -c idvw the first dimension of the arrays w and v as it appears in -c the program that calls ivlapgs. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays w and v as it appears in -c the program that calls ivlapgs. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients of the -c vector field (vlap,wlap) as computed by subroutine vhags. -c br,bi,cr and ci must be computed by vhags prior to calling -c ivlapgs. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapgs. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls ivlapgs. ndbc must be at -c least nlat. -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c once initialized, wvhsgsi -c can be used repeatedly by ivlapgs as long as nlat and nlon -c remain unchanged. wvhsgs must not be altered between calls -c of ivlapgs. -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls ivlapgs. let -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c let -c -c lsavmin = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c then lvhsgs must be greater than or equal to lsavmin -c (see ierror=9 below). -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivlapgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 then -c -c (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) -c -c will suffice as a length for lwork. -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a vector field whose vector laplacian is (vlap,wlap). -c w(i,j) is the east longitude and v(i,j) is the colatitudinal -c component of the vector. v(i,j) and w(i,j) are given on the -c sphere at the guassian colatitude theta(i) for i=1,...,nlat -c and east longitude lambda(j)=(j-1)*2*pi/nlon for j = 1,...,nlon. -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let sf be either v -c or w. define: -c -c del2s(sf) = [d(sint*d(sf)/dtheta)/dtheta + -c 2 2 -c d (sf)/dlambda /sint]/sint -c -c then the vector laplacian of (v,w) in (vlap,wlap) satisfies -c -c vlap = del2s(v) + (2*cost*dw/dlambda - v)/sint**2 -c -c and -c -c wlap = del2s(w) - (2*cost*dv/dlambda + w)/sint**2 -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhsgs -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for ivlapgs -c -c ********************************************************************** -c - subroutine ivlapgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - +mdbc,ndbc,wvhsgs,lvhsgs,work,lwork,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsgs(lvhsgs),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 -c -c set minimum and verify saved workspace length -c - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lsavmin = lzimn+lzimn+nlon+15 - if (lvhsgs .lt. lsavmin) return -c -c set minimum and verify unsaved work space length -c - mn = mmax*nlat*nt - l2 = (nlat+1)/2 - l1 = min0(nlat,(nlon+1)/2) - if (ityp .le. 2) then - lwkmin = (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) - else - lwkmin = (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - liwk = lwork-4*mn-nlat - else - liwk = lwork-2*mn-nlat - end if - call ivlapgs1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhsgs,lvhsgs,work(iwk),liwk,ierror) - return - end - - subroutine ivlapgs1(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw, - +bivw,crvw,civw,mmax,fnn,mdbc,ndbc,br,bi,cr,ci,wsave,lsave, - +wk,lwk,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt) - dimension fnn(nlat),brvw(mmax,nlat,nt),bivw(mmax,nlat,nt) - dimension crvw(mmax,nlat,nt),civw(mmax,nlat,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wsave(lsave),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -1.0/(fn*(fn+1.)) - 1 continue -c -c set (u,v) coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brvw(m,n,k) = 0.0 - bivw(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brvw(1,n,k) = fnn(n)*br(1,n,k) - bivw(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brvw(m,n,k) = fnn(n)*br(m,n,k) - bivw(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crvw(m,n,k) = 0.0 - civw(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crvw(1,n,k) = fnn(n)*cr(1,n,k) - civw(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crvw(m,n,k) = fnn(n)*cr(m,n,k) - civw(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (v,w) -c - call vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,brvw,bivw, - + crvw,civw,mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtec.f deleted file mode 100755 index 118a992d1..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtec.f +++ /dev/null @@ -1,368 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivrtec.f -c -c this file includes documentation and code for -c subroutine ivrtec i -c -c ... files which must be loaded with ivrtec.f -c -c sphcom.f, hrfft.f, vhsec.f,shaec.f -c -c subroutine ivrtec(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsec,lvhsec,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaec for a scalar array vort, subroutine ivrtec computes -c a divergence free vector field (v,w) whose vorticity is vt - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from vort for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to vort. the divergence of (v,w), as computed by -c ivrtec, is the zero scalar field. i.e., v(i,j) and w(i,j) are the -c colaatitudinal and east longitude velocity components at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon. -c -c the -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertrb -c -c and -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine ivrtes. -c -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shaec to compute the arrays a and b. isym -c determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c vort is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vort is symmetric about the equator. in this case w is -c antiymmetric and v is symmetric about the equator. v -c and w are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c vort is antisymmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls ivrtec, nt is the number of vorticity -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays a,b,v, and w can be three -c dimensional and pertrb can be one dimensional corresponding -c to an indexed multiple array vort. in this case, multiple vector -c synthesis will be performed to compute each vector field. the -c third index for a,b,v,w and first for pertrb is the synthesis -c index which assumes the values k=1,...,nt. for a single -c synthesis set nt=1. the description of the remaining parameters -c is simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls ivrtec. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls ivrtec. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vort as computed by subroutine shaec. -c *** a,b must be computed by shaec prior to calling ivrtec. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls ivrtec (and shaec). mdab must be at -c least min0(nlat,(nlon+2/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls ivrtec (and shaec). ndab must be at -c least nlat. -c -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized -c wvhsec can be used repeatedly by ivrtec as long as nlon -c and nlat remain unchanged. wvhsec must not be altered -c between calls of ivrtec. -c -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls ivrtec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivrtec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2 ) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon) + 2*nt*l1 + 1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a divergence free vector field whose vorticity is -c vort - pertrb at the lattitude point theta(i)=pi/2-(i-1)*pi/(nlat-1) -c and longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for v and w are defined at the input parameter isym. -c the divergence of (v,w) is the zero scalar field. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vort - pertrb is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of vort (computed by shaec) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vort can be the vorticity of a vector field -c only if a(1,1) is zero. if a(1,1) is nonzero (flagged by -c pertrb nonzero) then subtracting pertrb from vort yields a -c scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsec -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine ivrtec(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhsec,lvhsec,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsec(lvhsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - icr = 1 - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call ivtec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(icr),work(ici), - + mmax,work(is),mdab,ndab,a,b,wvhsec,lvhsec,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine ivtec1(nlat,nlon,isym,nt,v,w,idvw,jdvw,cr,ci,mmax, - +sqnn,mdab,ndab,a,b,wsav,lwsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lwsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set vorticity field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset cr,ci to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - cr(1,n,k) = a(1,n,k)/sqnn(n) - ci(1,n,k) = b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - cr(m,n,k) = a(m,n,k)/sqnn(n) - ci(m,n,k) = b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with divergence=0 -c - if (isym.eq.0) then - ityp = 2 - else if (isym.eq.1) then - ityp = 5 - else if (isym.eq.2) then - ityp = 8 - end if -c -c vector sythesize cr,ci into divergence free vector field (v,w) -c - call vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtes.f deleted file mode 100755 index 05e2124a2..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtes.f +++ /dev/null @@ -1,370 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivrtes.f -c -c this file includes documentation and code for -c subroutine ivrtes i -c -c ... files which must be loaded with ivrtes.f -c -c sphcom.f, hrfft.f, vhses.f,shaes.f -c -c -c subroutine ivrtes(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhses,lvhses,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaes for a scalar array vort, subroutine ivrtes computes -c a divergence free vector field (v,w) whose vorticity is vort - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from vort for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to vort. the divergence of (v,w), as computed by -c ivrtes, is the zero scalar field. i.e., v(i,j) and w(i,j) are the -c colaatitudinal and east longitude velocity components at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon. -c -c the -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertrb -c -c and -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine ivrtec. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shaes to compute the arrays a and b. isym -c determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c vort is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vort is symmetric about the equator. in this case w is -c antiymmetric and v is symmetric about the equator. v -c and w are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c vort is antisymmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls ivrtes, nt is the number of vorticity -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays a,b,v, and w can be three -c dimensional and pertrb can be one dimensional corresponding -c to an indexed multiple array vort. in this case, multiple vector -c synthesis will be performed to compute each vector field. the -c third index for a,b,v,w and first for pertrb is the synthesis -c index which assumes the values k=1,...,nt. for a single -c synthesis set nt=1. the description of the remaining parameters -c is simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls ivrtes. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls ivrtes. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vort as computed by subroutine shaes. -c *** a,b must be computed by shaes prior to calling ivrtes. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls ivrtes (and shaes). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls ivrtes (and shaes). ndab must be at -c least nlat. -c -c -c wvhses an array which must be initialized by subroutine vhsesi. -c once initialized -c wvhses can be used repeatedly by ivrtes as long as nlon -c and nlat remain unchanged. wvhses must not be altered -c between calls of ivrtes. -c -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls ivrtes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivrtes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*((2*nt+1)*nlon+2*l1*nt+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a divergence free vector field whose vorticity is -c vort - pertrb at the lattitude point theta(i)=pi/2-(i-1)*pi/(nlat-1) -c and longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for v and w are defined at the input parameter isym. -c the divergence of (v,w) is the zero scalar field. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vort - pertrb is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of vort (computed by shaes) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vort can be the vorticity of a vector field -c only if a(1,1) is zero. if a(1,1) is nonzero (flagged by -c pertrb nonzero) then subtracting pertrb from vort yields a -c scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhses -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine ivrtes(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhses,lvhses,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhses(lvhses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - lwmin = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - icr = 1 - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call ivtes1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(icr),work(ici), - + mmax,work(is),mdab,ndab,a,b,wvhses,lvhses,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine ivtes1(nlat,nlon,isym,nt,v,w,idvw,jdvw,cr,ci,mmax, - +sqnn,mdab,ndab,a,b,wsav,lwsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lwsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set vorticity field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - cr(1,n,k) = a(1,n,k)/sqnn(n) - ci(1,n,k) = b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - cr(m,n,k) = a(m,n,k)/sqnn(n) - ci(m,n,k) = b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with divergence=0 -c - if (isym.eq.0) then - ityp = 2 - else if (isym.eq.1) then - ityp = 5 - else if (isym.eq.2) then - ityp = 8 - end if -c -c vector sythesize cr,ci into divergence free vector field (v,w) -c - call vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtgc.f deleted file mode 100755 index ab29a712d..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtgc.f +++ /dev/null @@ -1,370 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivrtgc.f -c -c this file includes documentation and code for -c subroutine ivrtgc i -c -c ... files which must be loaded with ivrtgc.f -c -c sphcom.f, hrfft.f, vhsgc.f,shagc.f, gaqd.f -c -c -c subroutine ivrtgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsgc,lvhsgc,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shagc for a scalar array vt, subroutine ivrtgc computes -c a divergence free vector field (v,w) whose vorticity is vt - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from vt for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to vort. the divergence of (v,w), as computed by -c ivrtgc, is the zero scalar field. v(i,j) and w(i,j) are the -c colatitudinal and east longitude velocity components at gaussian -c colatitude theta(i) (see nlat as input parameter) and longitude -c lambda(j) = (j-1)*2*pi/nlon. the -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertrb -c -c and -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine ivrtgs. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shagc to compute the arrays a and b. isym -c determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c vt is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vt is symmetric about the equator. in this case w is -c antiymmetric and v is symmetric about the equator. v -c and w are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c vt is antisymmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls ivrtgc, nt is the number of vorticity -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays a,b,v, and w can be three -c dimensional and pertrb can be one dimensional corresponding -c to an indexed multiple array vort. in this case, multiple vector -c synthesis will be performed to compute each vector field. the -c third index for a,b,v,w and first for pertrb is the synthesis -c index which assumes the values k=1,...,nt. for a single -c synthesis set nt=1. the description of the remaining parameters -c is simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls ivrtgc. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls ivrtgc. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vt as computed by subroutine shagc. -c *** a,b must be computed by shagc prior to calling ivrtgc. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls ivrtgcs (and shagc). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls ivrtgc (and shagc). ndab must be at -c least nlat. -c -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized -c wvhsgc can be used repeatedly by ivrtgc as long as nlon -c and nlat remain unchanged. wvhsgs must not be altered -c between calls of ivrtgc. -c -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls ivrtgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivrtgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon) + 2*nt*l1 + 1) -c -c if isym = 1 or 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a divergence free vector field whose vorticity is -c vt - pertrb at the gaussian colatitude point theta(i) -c and longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for v and w are defined at the input parameter isym. -c the divergence of (v,w) is the zero scalar field. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vt - pertrb is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of vt (computed by shagc) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vt can be the vorticity of a vector field -c only if a(1,1) is zero. if a(1,1) is nonzero (flagged by -c pertrb nonzero) then subtracting pertrb from vt yields a -c scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine ivrtgc(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhsgc,lvhsgc,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgc(lvhsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c -c check save work space length -c - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 - if (lvhsgc .lt. lwmin) return -c if(lvhsgc .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - icr = 1 - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call ivtgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(icr),work(ici), - + mmax,work(is),mdab,ndab,a,b,wvhsgc,lvhsgc,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine ivtgc1(nlat,nlon,isym,nt,v,w,idvw,jdvw,cr,ci,mmax, - +sqnn,mdab,ndab,a,b,wsav,lsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set vorticity field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - cr(1,n,k) = a(1,n,k)/sqnn(n) - ci(1,n,k) = b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - cr(m,n,k) = a(m,n,k)/sqnn(n) - ci(m,n,k) = b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with divergence=0 -c - if (isym.eq.0) then - ityp = 2 - else if (isym.eq.1) then - ityp = 5 - else if (isym.eq.2) then - ityp = 8 - end if -c -c vector sythesize cr,ci into divergence free vector field (v,w) -c - call vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtgs.f deleted file mode 100755 index c3d759e14..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/ivrtgs.f +++ /dev/null @@ -1,367 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file ivrtgs.f -c -c this file includes documentation and code for -c subroutine ivrtgs -c -c ... files which must be loaded with ivrtgs.f -c -c sphcom.f, hrfft.f, vhsgs.f,shags.f, gaqd.f -c -c -c subroutine ivrtgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, -c + wvhsgs,lvhsgs,work,lwork,pertrb,ierror) -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shags for a scalar array vt, subroutine ivrtgs computes -c a divergence free vector field (v,w) whose vorticity is vt - pertrb. -c w is the east longitude component and v is the colatitudinal component. -c pertrb is a constant which must be subtracted from vt for (v,w) to -c exist (see the description of pertrb below). usually pertrb is zero -c or small relative to vt. the divergence of (v,w), as computed by -c ivrtgs, is the zero scalar field. v(i,j) and w(i,j) are the -c colatitudinal and east longitude velocity components at gaussian -c colatitude theta(i) (see nlat as input parameter) and longitude -c lambda(j) = (j-1)*2*pi/nlon. the -c -c vorticity(v(i,j),w(i,j)) -c -c = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c = vort(i,j) - pertrb -c -c and -c -c divergence(v(i,j),w(i,j)) -c -c = [d(sint*v)/dtheta + dw/dlambda]/sint -c -c = 0.0 -c -c where sint = sin(theta(i)). required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine ivrtgc. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym this has the same value as the isym that was input to -c subroutine shags to compute the arrays a and b. isym -c determines whether (v,w) are computed on the full or half -c sphere as follows: -c -c = 0 -c vt is not symmetric about the equator. in this case -c the vector field (v,w) is computed on the entire sphere. -c i.e., in the arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c vt is symmetric about the equator. in this case w is -c antiymmetric and v is symmetric about the equator. v -c and w are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c -c vt is antisymmetric about the equator. in this case w is -c symmetric and v is antisymmetric about the equator. w -c and v are computed on the northern hemisphere only. i.e., -c if nlat is odd they are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even they are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt in the program that calls ivrtgs, nt is the number of vorticity -c and vector fields. some computational efficiency is obtained -c for multiple fields. the arrays a,b,v, and w can be three -c dimensional and pertrb can be one dimensional corresponding -c to an indexed multiple array vt. in this case, multiple vector -c synthesis will be performed to compute each vector field. the -c third index for a,b,v,w and first for pertrb is the synthesis -c index which assumes the values k=1,...,nt. for a single -c synthesis set nt=1. the description of the remaining parameters -c is simplified by assuming that nt=1 or that a,b,v,w are two -c dimensional and pertrb is a constant. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls ivrtgs. if isym = 0 then idvw -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idvw must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls ivrtgs. jdvw must be at least nlon. -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the vorticity array vt as computed by subroutine shags. -c *** a,b must be computed by shags prior to calling ivrtgs. -c -c mdab the first dimension of the arrays a and b as it appears in -c the program that calls ivrtgs (and shags). mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears in -c the program that calls ivrtgs (and shags). ndab must be at -c least nlat. -c -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c once initialized -c wvhsgs can be used repeatedly by ivrtgs as long as nlon -c and nlat remain unchanged. wvhsgs must not be altered -c between calls of ivrtgs. -c -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls ivrtgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls ivrtgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 then lwork must be at least -c -c (2*nt+1)*nlat*nlon + nlat*(2*nt*l1+1) -c -c if isym = 1 or 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c v,w two or three dimensional arrays (see input parameter nt) that -c contain a divergence free vector field whose vorticity is -c vt - pertrb at the gaussian colatitude point theta(i) -c and longitude point lambda(j)=(j-1)*2*pi/nlon. w is the east -c longitude component and v is the colatitudinal component. the -c indices for v and w are defined at the input parameter isym. -c the divergence of (v,w) is the zero scalar field. -c -c pertrb a nt dimensional array (see input parameter nt and assume nt=1 -c for the description that follows). vt - pertrb is a scalar -c field which can be the vorticity of a vector field (v,w). -c pertrb is related to the scalar harmonic coefficients a,b -c of vt (computed by shags) by the formula -c -c pertrb = a(1,1)/(2.*sqrt(2.)) -c -c an unperturbed vt can be the vorticity of a vector field -c only if a(1,1) is zero. if a(1,1) is nonzero (flagged by -c pertrb nonzero) then subtracting pertrb from vt yields a -c scalar field for which a(1,1) is zero. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine ivrtgs(nlat,nlon,isym,nt,v,w,idvw,jdvw,a,b,mdab,ndab, - + wvhsgs,lvhsgs,work,lwork,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wvhsgs(lvhsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idvw.lt.nlat) .or. - + (isym.ne.0 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. min0(nlat,(nlon+2)/2)) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c lzz1 = 2*nlat*imid -c labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c if(lvhsgs .lt. 2*(lzz1+labc)+nlon+15) return - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhsgs .lt. lzimn+lzimn+nlon+15) return - ierror = 10 -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(isym.ne.0 .and. lwork .lt. - +nlat*(2*nt*nlon+max0(6*imid,nlon))+2*mn+nlat) return - if(isym.eq.0 .and. lwork .lt. - +imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - icr = 1 - ici = icr + mn - is = ici + mn - iwk = is + nlat - liwk = lwork-2*mn-nlat - call ivtgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,work(icr),work(ici), - + mmax,work(is),mdab,ndab,a,b,wvhsgs,lvhsgs,work(iwk), - + liwk,pertrb,ierror) - return - end - - subroutine ivtgs1(nlat,nlon,isym,nt,v,w,idvw,jdvw,cr,ci,mmax, - +sqnn,mdab,ndab,a,b,wsav,lsav,wk,lwk,pertrb,ierror) - dimension v(idvw,jdvw,nt),w(idvw,jdvw,nt),pertrb(nt) - dimension cr(mmax,nlat,nt),ci(mmax,nlat,nt),sqnn(nlat) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lsav),wk(lwk) -c -c preset coefficient multiplyers in vector -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute multiple vector fields coefficients -c - do 2 k=1,nt -c -c set vorticity field perturbation adjustment -c - pertrb(k) = a(1,1,k)/(2.*sqrt(2.)) -c -c preset br,bi to 0.0 -c - do 3 n=1,nlat - do 4 m=1,mmax - cr(m,n,k) = 0.0 - ci(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - cr(1,n,k) = a(1,n,k)/sqnn(n) - ci(1,n,k) = b(1,n,k)/sqnn(n) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - cr(m,n,k) = a(m,n,k)/sqnn(n) - ci(m,n,k) = b(m,n,k)/sqnn(n) - 7 continue - 6 continue - 2 continue -c -c set ityp for vector synthesis with divergence=0 -c - if (isym.eq.0) then - ityp = 2 - else if (isym.eq.1) then - ityp = 5 - else if (isym.eq.2) then - ityp = 8 - end if -c -c vector sythesize cr,ci into divergence free vector field (v,w) -c - call vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mmax,nlat,wsav,lsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfim.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/lfim.f deleted file mode 100755 index 302728c45..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfim.f +++ /dev/null @@ -1,226 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c subroutine lfim (init,theta,l,n,nm,pb,id,wlfim) -c -c dimension of theta(l), pb(id,nm+1), wlfim(4*l*(nm+1)) -c arguments -c -c purpose given n and l, routine lfim calculates -c the normalized associated legendre functions -c pbar(n,m,theta) for m=0,...,n and theta(i) -c for i=1,...,l where -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative of -c (x**2-1)**n with respect to x=cos(theta) -c -c usage call lfim (init,theta,l,n,nm,pb,id,wlfim) -c -c arguments -c on input init -c = 0 -c initialization only - using parameters -c l, nm and array theta, subroutine lfim -c initializes array wlfim for subsequent -c use in the computation of the associated -c legendre functions pb. initialization -c does not have to be repeated unless -c l, nm, or array theta are changed. -c = 1 -c subroutine lfim uses the array wlfim that -c was computed with init = 0 to compute pb. -c -c theta -c an array that contains the colatitudes -c at which the associated legendre functions -c will be computed. the colatitudes must be -c specified in radians. -c -c l -c the length of the theta array. lfim is -c vectorized with vector length l. -c -c n -c nonnegative integer, less than nm, specifying -c degree of pbar(n,m,theta). subroutine lfim -c must be called starting with n=0. n must be -c incremented by one in subsequent calls and -c must not exceed nm. -c -c nm -c the maximum value of n and m -c -c id -c the first dimension of the two dimensional -c array pb as it appears in the program that -c calls lfim. (see output parameter pb) -c -c wlfim -c an array with length 4*l*(nm+1) which -c must be initialized by calling lfim -c with init=0 (see parameter init) it -c must not be altered between calls to -c lfim. -c -c -c on output pb -c a two dimensional array with first -c dimension id in the program that calls -c lfim. the second dimension of pb must -c be at least nm+1. starting with n=0 -c lfim is called repeatedly with n being -c increased by one between calls. on each -c call, subroutine lfim computes -c = pbar(m,n,theta(i)) for m=0,...,n and -c i=1,...l. -c -c wlfim -c array containing values which must not -c be altered unless l, nm or the array theta -c are changed in which case lfim must be -c called with init=0 to reinitialize the -c wlfim array. -c -c special conditions n must be increased by one between calls -c of lfim in which n is not zero. -c -c precision single -c -c -c algorithm routine lfim calculates pbar(n,m,theta) using -c a four term recurrence relation. (unpublished -c notes by paul n. swarztrauber) -c - subroutine lfim (init,theta,l,n,nm,pb,id,wlfim) - dimension pb(1) ,wlfim(1) -c -c total length of wlfim is 4*l*(nm+1) -c - lnx = l*(nm+1) - iw1 = lnx+1 - iw2 = iw1+lnx - iw3 = iw2+lnx - call lfim1(init,theta,l,n,nm,id,pb,wlfim,wlfim(iw1), - 1 wlfim(iw2),wlfim(iw3),wlfim(iw2)) - return - end - subroutine lfim1(init,theta,l,n,nm,id,p3,phz,ph1,p1,p2,cp) - dimension p1(l,*) ,p2(l,*) ,p3(id,*) ,phz(l,*) , - 1 ph1(l,*) ,cp(*) ,theta(*) - nmp1 = nm+1 - if(init .ne. 0) go to 5 - ssqrt2 = 1./sqrt(2.) - do 10 i=1,l - phz(i,1) = ssqrt2 - 10 continue - do 15 np1=2,nmp1 - nh = np1-1 - call alfk(nh,0,cp) - do 16 i=1,l - call lfpt(nh,0,theta(i),cp,phz(i,np1)) - 16 continue - call alfk(nh,1,cp) - do 17 i=1,l - call lfpt(nh,1,theta(i),cp,ph1(i,np1)) - 17 continue - 15 continue - return - 5 if(n .gt. 2) go to 60 - if(n-1)25,30,35 - 25 do 45 i=1,l - p3(i,1)=phz(i,1) - 45 continue - return - 30 do 50 i=1,l - p3(i,1) = phz(i,2) - p3(i,2) = ph1(i,2) - 50 continue - return - 35 sq5s6 = sqrt(5./6.) - sq1s6 = sqrt(1./6.) - do 55 i=1,l - p3(i,1) = phz(i,3) - p3(i,2) = ph1(i,3) - p3(i,3) = sq5s6*phz(i,1)-sq1s6*p3(i,1) - p1(i,1) = phz(i,2) - p1(i,2) = ph1(i,2) - p2(i,1) = phz(i,3) - p2(i,2) = ph1(i,3) - p2(i,3) = p3(i,3) - 55 continue - return - 60 nm1 = n-1 - np1 = n+1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - do 65 i=1,l - p3(i,1) = phz(i,np1) - p3(i,2) = ph1(i,np1) - 65 continue - if(nm1 .lt. 3) go to 71 - do 70 mp1=3,nm1 - m = mp1-1 - fm = float(m) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - dd = sqrt(cn*fnmm*(fnmm-1.)/temp) - ee = sqrt((fnmm+1.)*(fnmm+2.)/temp) - do 70 i=1,l - p3(i,mp1) = cc*p1(i,mp1-2)+dd*p1(i,mp1)-ee*p3(i,mp1-2) - 70 continue - 71 fnpm = fn+fn-1. - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - ee = sqrt(6./temp) - do 75 i=1,l - p3(i,n) = cc*p1(i,n-2)-ee*p3(i,n-2) - 75 continue - fnpm = fn+fn - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - ee = sqrt(2./temp) - do 80 i=1,l - p3(i,n+1) = cc*p1(i,n-1)-ee*p3(i,n-1) - 80 continue - do 90 mp1=1,np1 - do 90 i=1,l - p1(i,mp1) = p2(i,mp1) - p2(i,mp1) = p3(i,mp1) - 90 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfin.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/lfin.f deleted file mode 100755 index 9b182674c..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfin.f +++ /dev/null @@ -1,211 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c subroutine lfin (init,theta,l,m,nm,pb,id,wlfin) -c -c dimension of theta(l), pb(id,nm+1), wlfin(4*l*(nm+1)) -c arguments -c -c purpose given m and l, routine lfin calculates -c the normalized associated legendre functions -c pbar(n,m,theta) for n=m,...,nm and theta(i) -c for i=1,...,l where -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative of -c (x**2-1)**n with respect to x=cos(theta) -c -c usage call lfin (init,theta,l,m,nm,pb,id,wlfin) -c -c arguments -c on input init -c = 0 -c initialization only - using parameters -c l, nm and the array theta, subroutine lfin -c initializes the array wlfin for subsequent -c use in the computation of the associated -c legendre functions pb. initialization does -c not have to be repeated unless l, nm or -c the array theta are changed. -c = 1 -c subroutine lfin uses the array wlfin that -c was computed with init = 0 to compute pb -c -c theta -c an array that contains the colatitudes -c at which the associated legendre functions -c will be computed. the colatitudes must be -c specified in radians. -c -c l -c the length of the theta array. lfin is -c vectorized with vector length l. -c -c m -c nonnegative integer, less than nm, specifying -c degree of pbar(n,m,theta). subroutine lfin -c must be called starting with n=0. n must be -c incremented by one in subsequent calls and -c must not exceed nm. -c -c nm -c the maximum value of n and m -c -c id -c the first dimension of the two dimensional -c array pb as it appears in the program that -c calls lfin. (see output parameter pb) -c -c wlfin -c an array with length 4*l*(nm+1) which -c must be initialized by calling lfin -c with init=0 (see parameter init) it -c must not be altered between calls to -c lfin. -c -c -c on output pb -c a two dimensional array with first -c dimension id in the program that calls -c lfin. the second dimension of pb must -c be at least nm+1. starting with m=0 -c lfin is called repeatedly with m being -c increased by one between calls. on each -c call, subroutine lfin computes pb(i,n+1) -c = pbar(m,n,theta(i)) for n=m,...,nm and -c i=1,...l. -c -c wlfin -c array containing values which must not -c be altered unless l, nm or the array theta -c are changed in which case lfin must be -c called with init=0 to reinitialize the -c wlfin array. -c -c special conditions m must be increased by one between calls -c of lfin in which m is not zero. -c -c precision single -c -c algorithm routine lfin calculates pbar(n,m,theta) using -c a four term recurrence relation. (unpublished -c notes by paul n. swarztrauber) -c - subroutine lfin (init,theta,l,m,nm,pb,id,wlfin) - dimension pb(1) ,wlfin(1) -c -c total length of wlfin is 4*l*(nm+1) -c - lnx = l*(nm+1) - iw1 = lnx+1 - iw2 = iw1+lnx - iw3 = iw2+lnx - call lfin1(init,theta,l,m,nm,id,pb,wlfin,wlfin(iw1), - 1 wlfin(iw2),wlfin(iw3),wlfin(iw2)) - return - end - subroutine lfin1(init,theta,l,m,nm,id,p3,phz,ph1,p1,p2,cp) - dimension p1(l,1) ,p2(l,1) ,p3(id,1) ,phz(l,1) , - 1 ph1(l,1) ,cp(1) ,theta(1) - nmp1 = nm+1 - if(init .ne. 0) go to 5 - ssqrt2 = 1./sqrt(2.) - do 10 i=1,l - phz(i,1) = ssqrt2 - 10 continue - do 15 np1=2,nmp1 - nh = np1-1 - call alfk(nh,0,cp) - do 16 i=1,l - call lfpt(nh,0,theta(i),cp,phz(i,np1)) - 16 continue - call alfk(nh,1,cp) - do 17 i=1,l - call lfpt(nh,1,theta(i),cp,ph1(i,np1)) - 17 continue - 15 continue - return - 5 mp1 = m+1 - fm = float(m) - tm = fm+fm - if(m-1)25,30,35 - 25 do 45 np1=1,nmp1 - do 45 i=1,l - p3(i,np1) = phz(i,np1) - p1(i,np1) = phz(i,np1) - 45 continue - return - 30 do 50 np1=2,nmp1 - do 50 i=1,l - p3(i,np1) = ph1(i,np1) - p2(i,np1) = ph1(i,np1) - 50 continue - return - 35 temp = tm*(tm-1.) - cc = sqrt((tm+1.)*(tm-2.)/temp) - ee = sqrt(2./temp) - do 85 i=1,l - p3(i,m+1) = cc*p1(i,m-1)-ee*p1(i,m+1) - 85 continue - if(m .eq. nm) return - temp = tm*(tm+1.) - cc = sqrt((tm+3.)*(tm-2.)/temp) - ee = sqrt(6./temp) - do 70 i=1,l - p3(i,m+2) = cc*p1(i,m)-ee*p1(i,m+2) - 70 continue - mp3 = m+3 - if(nmp1 .lt. mp3) go to 80 - do 75 np1=mp3,nmp1 - n = np1-1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - cc = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - dd = sqrt(cn*fnmm*(fnmm-1.)/temp) - ee = sqrt((fnmm+1.)*(fnmm+2.)/temp) - do 75 i=1,l - p3(i,np1) = cc*p1(i,np1-2)+dd*p3(i,np1-2)-ee*p1(i,np1) - 75 continue - 80 do 90 np1=m,nmp1 - do 90 i=1,l - p1(i,np1) = p2(i,np1) - p2(i,np1) = p3(i,np1) - 90 continue - return - end - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfp.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/lfp.f deleted file mode 100755 index e6527bcd2..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfp.f +++ /dev/null @@ -1,230 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c subroutine lfp (init,n,m,l,cp,pb,w) -c -c dimension of cp((n/2)+1), pb(l), w(5*l+41) -c arguments -c -c purpose routine lfp uses coefficients computed by -c routine alfk to calculate the single precision -c normalized associated legendre function pbar(n, -c m,theta) at colatitudes theta=(i-1)*pi/(l-1), -c i=1,...,l. subroutine lfp evaluates pbar -c using one of the following trigonometric -c expansions -c -c 1) for n even and m even, pbar(m,n,theta) = -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k)*cos(2*k*th) -c -c 2) for n even and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*th) -c -c 3) for n odd and m even, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*th) -c -c 4) for n odd and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*th) -c -c -c usage call lfp(init,n,m,l,cp,pb,w) -c -c arguments -c -c on input init -c = 0 initialization only -c = 1 compute pbar(n,m,theta) -c -c lfp call with init = 0 initializes array w; -c no values of pbar(n,m,theta) are computed. -c init=0 should be used on the first call, or -c if l or w values differ from those in the -c previous call. -c -c n -c nonnegative integer, less than l, specifying -c the degree of pbar(n,m,theta) -c -c m -c is the order of pbar(n,m,theta). m can be -c any integer however pbar(n,m,theta) = 0 -c if abs(m) is greater than n and -c pbar(n,m,theta) = (-1)**m*pbar(n,-m,theta) -c for negative m. -c -c l -c number of colatitudes theta=(i-1)*pi/(l-1) -c for i=1,...,l where l is greater than 1. -c l must be an odd integer. -c -c cp -c single precision array of length (n/2)+1 -c containing coefficients computed by routine -c alfk -c -c w -c a single precision work array with at -c least 5*l+41 locations -c -c on output pb -c single precision array of length l containing -c pbar(n,m,theta), theta=(i-1)*pi/(l-1) for i=1 -c ,...,l. -c -c w -c a single precision array containing values -c which must not be destroyed if the next call -c will have the same value of input parameter n -c -c special conditions calls to routine lfp must be preceded by an -c appropriate call to routine alfk. -c -c precision single -c -c algorithm the trigonometric series formula used by -c routine lfp to calculate pbar(n,m,theta) for -c theta=(i-1)*pi/(l-1), i=1,...,n, depends on -c m and n as follows: -c -c 1) for n even and m even, the formula is -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k)*cos(2*k*theta) -c 2) for n even and m odd. the formula is -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*theta) -c 3) for n odd and m even, the formula is -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*theta) -c 4) for n odd and m odd, the formula is -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*theta) -c -c accuracy comparison between routines lfp and double -c precision dlfp on the cray1 indicates greater -c accuracy for smaller values of input parameter -c n. agreement to 12 places was obtained for -c n=10 and to 11 places for n=100. -c -c timing time per call to routine lfp is dependent on -c the input parameters l and n. -c - subroutine lfp (init,n,m,l,cp,pb,w) - dimension cp(1) ,pb(1) ,w(1) -c - do 10 i=1,l - pb(i) = 0. - 10 continue - ma = iabs(m) - if(ma .gt. n) return - iw1 = l+l+12 - iw2 = iw1+3*(l+1)/2+15 - call lfp1(init,n,ma,l,cp,pb,w,w(iw1),w(iw2)) - return - end - subroutine lfp1(init,n,m,l,cp,p,wsave1,wsave2,wsave3) - dimension cp(*),p(*),wsave1(*),wsave2(*),wsave3(*) - save lc, lq, ls - if(init.ne.0) go to 41 - lc=(l+1)/2 - ls=lc-2 - lq=lc-1 - call sinti(ls,wsave1) - call costi(lc,wsave2) - call cosqi(lq,wsave3) - return - 41 if (n) 10, 10, 40 - 10 if (m) 20, 20, 40 - 20 ssqrt2 = 1./sqrt(2.) - do 30 i=1,l - p(i) = ssqrt2 - 30 continue - return - 40 ls2 = (l+1)/2 - lm1 = l-1 - np1 = n+1 - pi = 4.*atan(1.) - dt = pi/lm1 - nmod = mod(n,2) - mmod = mod(m,2) - if (nmod) 50, 50,120 - 50 if (mmod) 60, 60, 90 - 60 kdp = n/2+1 - do 70 i=1,kdp - p(i)=.5*cp(i) - 70 continue - p(lc)=p(lc)+p(lc) - call cost(lc,p,wsave2) - do 80 i=1,lc - lmi=l-i - p(lmi+1)=p(i) - 80 continue - go to 190 - 90 kdp=n/2 - do 100 i=1,kdp - p(i+1)=.5*cp(i) - 100 continue - p(ls+2)=0. - call sint(ls,p(2),wsave1) - do 110 i=1,ls - lmi=l-i - p(lmi)=-p(i+1) - 110 continue - p(l)=0. - go to 190 - 120 kdp=(n+1)/2 - if(mmod)140,140,160 - 140 do 130 i=1,kdp - p(i)=.25*cp(i) - 130 continue - call cosqb(lq,p,wsave3) - do 150 i=1,lq - lmi=l-i - p(lmi+1)=-p(i) - 150 continue - go to 190 - 160 do 180 i=1,kdp - p(i+1)=.25*cp(i) - 180 continue - call sinqb(lq,p(2),wsave3) - do 170 i=1,lq - lmi=l-i - p(lmi)=p(i+1) - 170 continue - p(l)=0. - 190 return - end - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfpt.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/lfpt.f deleted file mode 100755 index b0f0d44d2..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/lfpt.f +++ /dev/null @@ -1,174 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c subroutine lfpt (n,m,theta,cp,pb) -c -c dimension of -c arguments -c cp((n/2)+1) -c -c purpose routine lfpt uses coefficients computed by -c routine alfk to compute the single precision -c normalized associated legendre function pbar(n, -c m,theta) at colatitude theta. -c -c usage call lfpt(n,m,theta,cp,pb) -c -c arguments -c -c on input n -c nonnegative integer specifying the degree of -c pbar(n,m,theta) -c m -c is the order of pbar(n,m,theta). m can be -c any integer however pbar(n,m,theta) = 0 -c if abs(m) is greater than n and -c pbar(n,m,theta) = (-1)**m*pbar(n,-m,theta) -c for negative m. -c -c theta -c single precision colatitude in radians -c -c cp -c single precision array of length (n/2)+1 -c containing coefficients computed by routine -c alfk -c -c on output pb -c single precision variable containing -c pbar(n,m,theta) -c -c special conditions calls to routine lfpt must be preceded by an -c appropriate call to routine alfk. -c -c precision single -c -c algorithm the trigonometric series formula used by -c routine lfpt to calculate pbar(n,m,th) at -c colatitude th depends on m and n as follows: -c -c 1) for n even and m even, the formula is -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k)*cos(2*k*th) -c 2) for n even and m odd. the formula is -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*th) -c 3) for n odd and m even, the formula is -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*th) -c 4) for n odd and m odd, the formula is -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*th) -c -c accuracy comparison between routines lfpt and double -c precision dlfpt on the cray1 indicates greater -c accuracy for greater values on input parameter -c n. agreement to 13 places was obtained for -c n=10 and to 12 places for n=100. -c -c timing time per call to routine lfpt is dependent on -c the input parameter n. -c - subroutine lfpt (n,m,theta,cp,pb) - dimension cp(1) -c - pb = 0. - ma = iabs(m) - if(ma .gt. n) return - if (n) 10, 10, 30 - 10 if (ma) 20, 20, 30 - 20 pb= sqrt(.5) - go to 140 - 30 np1 = n+1 - nmod = mod(n,2) - mmod = mod(ma,2) - if (nmod) 40, 40, 90 - 40 if (mmod) 50, 50, 70 - 50 kdo = n/2+1 - cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = 1. - st = 0. - sum = .5*cp(1) - do 60 kp1=2,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(kp1)*ct - 60 continue - pb= sum - go to 140 - 70 kdo = n/2 - cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = 1. - st = 0. - sum = 0. - do 80 k=1,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(k)*st - 80 continue - pb= sum - go to 140 - 90 kdo = (n+1)/2 - if (mmod) 100,100,120 - 100 cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = cos(theta) - st = -sin(theta) - sum = 0. - do 110 k=1,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(k)*ct - 110 continue - pb= sum - go to 140 - 120 cdt = cos(theta+theta) - sdt = sin(theta+theta) - ct = cos(theta) - st = -sin(theta) - sum = 0. - do 130 k=1,kdo - cth = cdt*ct-sdt*st - st = sdt*ct+cdt*st - ct = cth - sum = sum+cp(k)*st - 130 continue - pb= sum - 140 return - end - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpec.f deleted file mode 100755 index 10cd5783f..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpec.f +++ /dev/null @@ -1,382 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file sfvpec.f -c -c this file includes documentation and code for -c subroutine sfvpec i -c -c ... files which must be loaded with sfvpec.f -c -c sphcom.f, hrfft.f, vhaec.f, shsec.f -c -c -c subroutine sfvpec(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, -c + mdb,ndb,wshsec,lshsec,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br,bi,cr,ci, -c computed by subroutine vhaec for a vector field (v,w), sfvpec -c computes a scalar stream function sf and scalar velocity potential -c vp for (v,w). (v,w) is expressed in terms of sf and vp by the -c helmholtz relations (in mathematical spherical coordinates): -c -c v = -1/sint*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sint*d(st)/dlambda + d(vp)/dtheta -c -c where sint = sin(theta). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi,cr,ci were precomputed. required associated legendre -c polynomials are recomputed rather than stored as they are in -c subroutine sfvpes. sf(i,j) and vp(i,j) are given at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the stream function and -c velocity potential are computed on the full or half sphere -c as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case sf -c and vp are not necessarily symmetric or antisymmetric about -c the equator. sf and vp are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is symmetric and vp antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is antisymmetric and vp symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute sf,vp for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays sf,vp as it appears in -c the program that calls sfvpec. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays sf,vp as it appears in -c the program that calls sfvpec. jdv must be at least nlon. -c -c br,bi, two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaec. -c -c mdb the first dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpec. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpec. ndb must be at -c least nlat. -c -c wshsec an array which must be initialized by subroutine shseci. -c once initialized, wshsec can be used repeatedly by sfvpec -c as long as nlon and nlat remain unchanged. wshsec must -c not bel altered between calls of sfvpec. -c -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls sfvpec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls sfvpec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*((nt*nlon+max0(3*l2,nlon)) + 2*l1*nt+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*l1*nt+1) -c -c ************************************************************** -c -c output parameters -c -c sf,vp two or three dimensional arrays (see input parameter nt) -c that contains the stream function and velocity potential -c of the vector field (v,w) whose coefficients br,bi,cr,ci -c where precomputed by subroutine vhaec. sf(i,j),vp(i,j) -c are given at the colatitude point -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude point -c -c lambda(j) = (j-1)*2*pi/nlon -c -c the index ranges are defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsec -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine sfvpec(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - + mdb,ndb,wshsec,lshsec,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lshsec,lwork,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt) - real cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real wshsec(lshsec),work(lwork) - integer imid,mmax,lzz1,labc,ls,nln,mab,mn,ia,ib,is,lwk,iwk,lwmin -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space (same as shsec) -c - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwmin = lzz1+labc+nlon+15 - - if(lshsec .lt. lwmin) return -c -c verify unsaved work space (add to what shec requires) -c - ierror = 10 - ls = nlat - if (isym.gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsec) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - if(lwork .lt. nln+max0(ls*nlon,3*nlat*imid)+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call sfvpec1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshsec,lshsec,work(iwk),lwk, - +ierror) - return - end - - subroutine sfvpec1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - +mdb,ndb,a,b,mab,fnn,wshsec,lshsec,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lshsec,lwk,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt),cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real a(mab,nlat,nt),b(mab,nlat,nt) - real wshsec(lshsec),wk(lwk),fnn(nlat) - integer n,m,mmax,k -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = 1.0/sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute sf scalar coefficients from cr,ci -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) =-fnn(n)*cr(1,n,k) - b(1,n,k) =-fnn(n)*ci(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - a(m,n,k) =-fnn(n)*cr(m,n,k) - b(m,n,k) =-fnn(n)*ci(m,n,k) - end do - end do - end do -c -c synthesize a,b into st -c - call shsec(nlat,nlon,isym,nt,sf,idv,jdv,a,b, - + mab,nlat,wshsec,lshsec,wk,lwk,ierror) -c -c set coefficients for vp from br,bi -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) = fnn(n)*br(1,n,k) - b(1,n,k) = fnn(n)*bi(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do m=2,mmax - do n=m,nlat - a(m,n,k) = fnn(n)*br(m,n,k) - b(m,n,k) = fnn(n)*bi(m,n,k) - end do - end do - end do -c -c synthesize a,b into vp -c - call shsec(nlat,nlon,isym,nt,vp,idv,jdv,a,b, - + mab,nlat,wshsec,lshsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpes.f deleted file mode 100755 index 3e19becfb..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpes.f +++ /dev/null @@ -1,379 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file sfvpes.f -c -c this file includes documentation and code for -c subroutine sfvpes i -c -c ... files which must be loaded with sfvpes.f -c -c sphcom.f, hrfft.f, vhaes.f, shses.f -c -c -c subroutine sfvpes(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, -c + mdb,ndb,wshses,lshses,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br,bi,cr,ci, -c computed by subroutine vhaes for a vector field (v,w), sfvpes -c computes a scalar stream function sf and scalar velocity potential -c vp for (v,w). (v,w) is expressed in terms of sf and vp by the -c helmholtz relations (in mathematical spherical coordinates): -c -c v = -1/sint*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sint*d(st)/dlambda + d(vp)/dtheta -c -c where sint = sin(theta). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi,cr,ci were precomputed. required associated legendre -c polynomials are stored rather than recomputed as they are in -c subroutine sfvpec. sf(i,j) and vp(i,j) are given at colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the stream function and -c velocity potential are computed on the full or half sphere -c as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case sf -c and vp are not necessarily symmetric or antisymmetric about -c the equator. sf and vp are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is symmetric and vp antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is antisymmetric and vp symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute sf,vp for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays sf,vp as it appears in -c the program that calls sfvpes. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays sf,vp as it appears in -c the program that calls sfvpes. jdv must be at least nlon. -c -c br,bi, two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaec. -c -c mdb the first dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpes. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpes. ndb must be at -c least nlat. -c -c wshses an array which must be initialized by subroutine shsesi. -c once initialized, wshses can be used repeatedly by sfvpes -c as long as nlon and nlat remain unchanged. wshses must -c not bel altered between calls of sfvpes. -c -c -c lshses the dimension of the array wshses as it appears in the -c program that calls sfrvpes. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls sfvpes. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*((nt+1)*nlon + 2*l2*nt+1) -c -c if isym is nonzero then lwork must be at least -c -c l2*((nt+1)*nlon + 2*nlat*nt) + nlat -c -c ************************************************************** -c -c output parameters -c -c sf,vp two or three dimensional arrays (see input parameter nt) -c that contains the stream function and velocity potential -c of the vector field (v,w) whose coefficients br,bi,cr,ci -c where computed by subroutine vhaec. sf(i,j),vp(i,j) -c are given at the colatitude point -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude point -c -c lambda(j) = (j-1)*2*pi/nlon -c -c the index ranges are defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshses -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine sfvpes(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - + mdb,ndb,wshses,lshses,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lshses,lwork,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt) - real cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real wshses(lshses),work(lwork) - integer imid,mmax,ls,mab,mn,ia,ib,is,lwk,iwk - integer lpimn -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space (same as shses) -c - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return -c -c verify unsaved work space (add to what shec requires) -c - ierror = 10 - ls = nlat - if (isym.gt. 0) ls = imid -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - if (lwork.lt. ls*(nt+1)*nlon +nlat*(2*imid+1)) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call sfvpes1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshses,lshses,work(iwk),lwk, - +ierror) - return - end - - subroutine sfvpes1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - +mdb,ndb,a,b,mab,fnn,wshses,lshses,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lshses,lwk,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt),cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real a(mab,nlat,nt),b(mab,nlat,nt) - real wshses(lshses),wk(lwk),fnn(nlat) - integer n,m,mmax,k -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = 1.0/sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute sf scalar coefficients from cr,ci -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) =-fnn(n)*cr(1,n,k) - b(1,n,k) =-fnn(n)*ci(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - a(m,n,k) =-fnn(n)*cr(m,n,k) - b(m,n,k) =-fnn(n)*ci(m,n,k) - end do - end do - end do -c -c synthesize a,b into st -c - call shses(nlat,nlon,isym,nt,sf,idv,jdv,a,b, - + mab,nlat,wshses,lshses,wk,lwk,ierror) -c -c set coefficients for vp from br,bi -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) = fnn(n)*br(1,n,k) - b(1,n,k) = fnn(n)*bi(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do m=2,mmax - do n=m,nlat - a(m,n,k) = fnn(n)*br(m,n,k) - b(m,n,k) = fnn(n)*bi(m,n,k) - end do - end do - end do -c -c synthesize a,b into vp -c - call shses(nlat,nlon,isym,nt,vp,idv,jdv,a,b, - + mab,nlat,wshses,lshses,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpgc.f deleted file mode 100755 index 60d12944b..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpgc.f +++ /dev/null @@ -1,372 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file sfvpgc.f -c -c this file includes documentation and code for -c subroutine sfvpgc i -c -c ... files which must be loaded with sfvpgc.f -c -c sphcom.f, hrfft.f, vhagc.f, shsgc.f, gaqd.f -c -c -c subroutine sfvpgc(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, -c + mdb,ndb,wshsgc,lshsgc,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br,bi,cr,ci, -c computed by subroutine vhagc for a vector field (v,w), sfvpgc -c computes a scalar stream function sf and scalar velocity potential -c vp for (v,w). (v,w) is expressed in terms of sf and vp by the -c helmholtz relations (in mathematical spherical coordinates): -c -c v = -1/sint*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sint*d(st)/dlambda + d(vp)/dtheta -c -c where sint = sin(theta). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi,cr,ci were precomputed. required associated legendre -c polynomials are recomputed rather than stored as they are in -c subroutine sfvpgs. sf(i,j) and vp(i,j) are given at the i(th) -c gaussian colatitude point theta(i) (see nlat description below) -c and east longitude lambda(j) = (j-1)*2*pi/nlon on the sphere. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the stream function and -c velocity potential are computed on the full or half sphere -c as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case st -c and vp are not necessarily symmetric or antisymmetric about -c the equator. sf and vp are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is symmetric and vp antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is antisymmetric and vp symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute sf,vp for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays sf,vp as it appears in -c the program that calls sfvpgc. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays sf,vp as it appears in -c the program that calls sfvpgc. jdv must be at least nlon. -c -c br,bi, two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhagc. -c -c mdb the first dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpgc. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpgc. ndb must be at -c least nlat. -c -c wshsgc an array which must be initialized by subroutine shsgci. -c once initialized, wshsgc can be used repeatedly by sfvpgc -c as long as nlon and nlat remain unchanged. wshsgc must -c not bel altered between calls of sfvpgc. -c -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls sfvpgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls sfvpgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*((nt*nlon+max0(3*l2,nlon)) + 2*l1*nt+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*l1*nt+1) -c -c ************************************************************** -c -c output parameters -c -c sf,vp two or three dimensional arrays (see input parameter nt) -c that contains the stream function and velocity potential -c of the vector field (v,w) whose coefficients br,bi,cr,ci -c where precomputed by subroutine vhagc. sf(i,j),vp(i,j) -c are given at the i(th) gaussian colatitude point theta(i) -c and longitude point lambda(j) = (j-1)*2*pi/nlon. the index -c ranges are defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine sfvpgc(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - + mdb,ndb,wshsgc,lshsgc,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lshsgc,lwork,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt) - real cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real wshsgc(lshsgc),work(lwork) - integer imid,mmax,lzz1,labc,ls,nln,mab,mn,ia,ib,is,lwk,iwk,lwmin - integer l1,l2 -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+2)/2) - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 -c -c verify saved work space (same as shsgc) -c - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwmin = lzz1+labc+nlon+15 - l2 = (nlat+1)/2 - l1 = min0((nlon+2)/2,nlat) - if (lshsgc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return -c -c verify unsaved work space (add to what shsgc requires) -c - ierror = 10 - ls = nlat - if (isym.gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsgc) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - if(lwork .lt. nln+max0(ls*nlon,3*nlat*imid)+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call sfvpgc1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshsgc,lshsgc,work(iwk),lwk, - +ierror) - return - end - - subroutine sfvpgc1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - +mdb,ndb,a,b,mab,fnn,wshsgc,lshsgc,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lshsgc,lwk,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt),cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real a(mab,nlat,nt),b(mab,nlat,nt) - real wshsgc(lshsgc),wk(lwk),fnn(nlat) - integer n,m,mmax,k -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = 1.0/sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute sf scalar coefficients from cr,ci -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) =-fnn(n)*cr(1,n,k) - b(1,n,k) =-fnn(n)*ci(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - a(m,n,k) =-fnn(n)*cr(m,n,k) - b(m,n,k) =-fnn(n)*ci(m,n,k) - end do - end do - end do -c -c synthesize a,b into st -c - call shsgc(nlat,nlon,isym,nt,sf,idv,jdv,a,b, - + mab,nlat,wshsgc,lshsgc,wk,lwk,ierror) -c -c set coefficients for vp from br,bi -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) = fnn(n)*br(1,n,k) - b(1,n,k) = fnn(n)*bi(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do m=2,mmax - do n=m,nlat - a(m,n,k) = fnn(n)*br(m,n,k) - b(m,n,k) = fnn(n)*bi(m,n,k) - end do - end do - end do -c -c synthesize a,b into vp -c - call shsgc(nlat,nlon,isym,nt,vp,idv,jdv,a,b, - + mab,nlat,wshsgc,lshsgc,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpgs.f deleted file mode 100755 index 31d2a242c..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sfvpgs.f +++ /dev/null @@ -1,371 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file sfvpgs.f -c -c this file includes documentation and code for -c subroutine sfvpgs i -c -c ... files which must be loaded with sfvpgs.f -c -c sphcom.f, hrfft.f, vhags.f, shsgs.f, gaqd.f -c -c -c subroutine sfvpgs(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, -c + mdb,ndb,wshsgs,lshsgs,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients br,bi,cr,ci, -c computed by subroutine vhags for a vector field (v,w), sfvpgs -c computes a scalar stream function sf and scalar velocity potential -c vp for (v,w). (v,w) is expressed in terms of sf and vp by the -c helmholtz relations (in mathematical spherical coordinates): -c -c v = -1/sint*d(vp)/dlambda + d(st)/dtheta -c -c w = 1/sint*d(st)/dlambda + d(vp)/dtheta -c -c where sint = sin(theta). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c br,bi,cr,ci were precomputed. required associated legendre -c polynomials are stored rather than recomputed as they are in -c subroutine sfvpgc. sf(i,j) and vp(i,j) are given at the i(th) -c gaussian colatitude point theta(i) (see nlat description below) -c and east longitude lambda(j) = (j-1)*2*pi/nlon on the sphere. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater than -c 3. the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the stream function and -c velocity potential are computed on the full or half sphere -c as follows: -c -c = 0 -c -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case st -c and vp are not necessarily symmetric or antisymmetric about -c the equator. sf and vp are computed on the entire sphere. -c i.e., in arrays sf(i,j),vp(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c -c w is antisymmetric and v is symmetric about the equator. -c in this case sf is symmetric and vp antisymmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c = 2 -c -c w is symmetric and v is antisymmetric about the equator. -c in this case sf is antisymmetric and vp symmetric about -c the equator and are computed for the northern hemisphere -c only. i.e., if nlat is odd the sf(i,j),vp(i,j) are computed -c for i=1,...,(nlat+1)/2 and for j=1,...,nlon. if nlat is -c even then sf(i,j),vp(i,j) are computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. arrays -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute sf,vp for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c idv the first dimension of the arrays sf,vp as it appears in -c the program that calls sfvpgs. if isym = 0 then idv -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then idv must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then idv must be at least (nlat+1)/2. -c -c jdv the second dimension of the arrays sf,vp as it appears in -c the program that calls sfvpgs. jdv must be at least nlon. -c -c br,bi, two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhags. -c -c mdb the first dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpgs. mdb must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndb the second dimension of the arrays br,bi,cr,ci as it -c appears in the program that calls sfvpgs. ndb must be at -c least nlat. -c -c wshsgs an array which must be initialized by subroutine shsgsi. -c once initialized, wshsgs can be used repeatedly by sfvpgs -c as long as nlon and nlat remain unchanged. wshsgs must -c not bel altered between calls of sfvpgs. -c -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls sfvpgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls sfvpgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*nlon*(nt+1) + nlat*(2*l1*nt + 1) -c -c if isym is nonzero then lwork must be at least -c -c l2*nlon*(nt+1) + nlat*(2*l1*nt + 1) -c -c ************************************************************** -c -c output parameters -c -c sf,vp two or three dimensional arrays (see input parameter nt) -c that contains the stream function and velocity potential -c of the vector field (v,w) whose coefficients br,bi,cr,ci -c where precomputed by subroutine vhags. sf(i,j),vp(i,j) -c are given at the i(th) gaussian colatitude point theta(i) -c and longitude point lambda(j) = (j-1)*2*pi/nlon. the index -c ranges are defined above at the input parameter isym. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idv -c = 6 error in the specification of jdv -c = 7 error in the specification of mdb -c = 8 error in the specification of ndb -c = 9 error in the specification of lshsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c - subroutine sfvpgs(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - + mdb,ndb,wshsgs,lshsgs,work,lwork,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,lshsgs,lwork,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt) - real cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real wshsgs(lshsgs),work(lwork) - integer imid,ls,mab,mn,ia,ib,is,lwk,iwk - integer lat,late,l1,l2,lp -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if (nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if (nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. idv.lt.nlat) .or. - + (isym.gt.0 .and. idv.lt.imid)) return - ierror = 6 - if(jdv .lt. nlon) return - ierror = 7 - if(mdb .lt. min0(nlat,(nlon+1)/2)) return - ierror = 8 - if (ndb .lt. nlat) return - ierror = 9 - l1 = min0((nlon+2)/2,nlat) - late = (nlat+mod(nlat,2))/2 - lat = nlat - if (isym.ne.0) lat = late - l2 = late -c check permanent work space length - l2 = (nlat+mod(nlat,2))/2 - l1 = min0((nlon+2)/2,nlat) - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return -c -c verify unsaved work space -c - ierror = 10 - ls = nlat - if (isym.gt. 0) ls = imid -c -c set first dimension for a,b (as requried by shsgs) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - if (lwork .lt. ls*nlon+(nt+1)+nlat*(2*l1*nt+1)) return - - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call stvpgs1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci,mdb,ndb, - +work(ia),work(ib),mab,work(is),wshsgs,lshsgs,work(iwk),lwk, - +ierror) - return - end - - subroutine stvpgs1(nlat,nlon,isym,nt,sf,vp,idv,jdv,br,bi,cr,ci, - +mdb,ndb,a,b,mab,fnn,wshsgs,lshsgs,wk,lwk,ierror) - implicit none - integer nlat,nlon,isym,nt,idv,jdv,mdb,ndb,mab,lshsgs,lwk,ierror - real sf(idv,jdv,nt),vp(idv,jdv,nt) - real br(mdb,ndb,nt),bi(mdb,ndb,nt),cr(mdb,ndb,nt),ci(mdb,ndb,nt) - real a(mab,nlat,nt),b(mab,nlat,nt) - real wshsgs(lshsgs),wk(lwk),fnn(nlat) - integer n,m,mmax,k -c -c set coefficient multiplyers -c - do n=2,nlat - fnn(n) = 1.0/sqrt(float(n*(n-1))) - end do - mmax = min0(nlat,(nlon+1)/2) -c -c compute st scalar coefficients from cr,ci -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) =-fnn(n)*cr(1,n,k) - b(1,n,k) =-fnn(n)*ci(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - do m=2,mmax - do n=m,nlat - a(m,n,k) =-fnn(n)*cr(m,n,k) - b(m,n,k) =-fnn(n)*ci(m,n,k) - end do - end do - end do -c -c synthesize a,b into st -c - call shsgs(nlat,nlon,isym,nt,sf,idv,jdv,a,b, - + mab,nlat,wshsgs,lshsgs,wk,lwk,ierror) -c -c set coefficients for vp from br,bi -c - do k=1,nt - do n=1,nlat - do m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - end do - end do -c -c compute m=0 coefficients -c - do n=2,nlat - a(1,n,k) = fnn(n)*br(1,n,k) - b(1,n,k) = fnn(n)*bi(1,n,k) - end do -c -c compute m>0 coefficients using vector spherepack value for mmax -c - mmax = min0(nlat,(nlon+1)/2) - do m=2,mmax - do n=m,nlat - a(m,n,k) = fnn(n)*br(m,n,k) - b(m,n,k) = fnn(n)*bi(m,n,k) - end do - end do - end do -c -c synthesize a,b into vp -c - call shsgs(nlat,nlon,isym,nt,vp,idv,jdv,a,b, - + mab,nlat,wshsgs,lshsgs,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shaec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shaec.f deleted file mode 100755 index 720669da0..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shaec.f +++ /dev/null @@ -1,469 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file shaec.f -c -c this file contains code and documentation for subroutines -c shaec and shaeci -c -c ... files which must be loaded with shaec.f -c -c sphcom.f, hrfft.f -c -c subroutine shaec(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c + wshaec,lshaec,work,lwork,ierror) -c -c subroutine shaec performs the spherical harmonic analysis -c on the array g and stores the result in the arrays a and b. -c the analysis is performed on an equally spaced grid. the -c associated legendre functions are recomputed rather than stored -c as they are in subroutine shaes. the analysis is described -c below at output parameters a,b. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the analysis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the analysis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of analyses. in the program that calls shaec, -c the arrays g,a and b can be three dimensional in which -c case multiple analyses will be performed. the third -c index is the analysis index which assumes the values -c k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c g a two or three dimensional array (see input parameter -c nt) that contains the discrete function to be analyzed. -c g(i,j) contains the value of the function at the colatitude -c point theta(i) = (i-1)*pi/(nlat-1) and longitude point -c phi(j) = (j-1)*2*pi/nlon. the index ranges are defined -c above at the input parameter isym. -c -c -c idg the first dimension of the array g as it appears in the -c program that calls shaec. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg -c must be at least nlat/2 if nlat is even or at least -c (nlat+1)/2 if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shaec. jdg must be at least nlon. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shaec. mdab must be at least -c min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shaec. ndab must be at least nlat -c -c wshaec an array which must be initialized by subroutine shaeci. -c once initialized, wshaec can be used repeatedly by shaec -c as long as nlon and nlat remain unchanged. wshaec must -c not be altered between calls of shaec. -c -c lshaec the dimension of the array wshaec as it appears in the -c program that calls shaec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshaec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shaec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*(nt*nlon+max0(3*l2,nlon)) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c a,b both a,b are two or three dimensional arrays (see input -c parameter nt) that contain the spherical harmonic -c coefficients in the representation of g(i,j) given in the -c discription of subroutine shsec. for isym=0, a(m,n) and -c b(m,n) are given by the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c -c -c definitions -c -c 1. the normalized associated legendre functions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c 2. the normalized z functions for m even -c -c zbar(m,n,theta) = 2/(nlat-1) times the sum from k=0 to k=nlat-1 of -c the integral from tau = 0 to tau = pi of -c cos(k*theta)*cos(k*tau)*pbar(m,n,tau)*sin(tau) -c (first and last terms in this sum are divided -c by 2) -c -c 3. the normalized z functions for m odd -c -c zbar(m,n,theta) = 2/(nlat-1) times the sum from k=0 to k=nlat-1 of -c of the integral from tau = 0 to tau = pi of -c sin(k*theta)*sin(k*tau)*pbar(m,n,tau)*sin(tau) -c -c 4. the fourier transform of g(i,j). -c -c c(m,i) = 2/nlon times the sum from j=1 to j=nlon -c of g(i,j)*cos((m-1)*(j-1)*2*pi/nlon) -c (the first and last terms in this sum -c are divided by 2) -c -c s(m,i) = 2/nlon times the sum from j=2 to j=nlon -c of g(i,j)*sin((m-1)*(j-1)*2*pi/nlon) -c -c 5. the maximum (plus one) longitudinal wave number -c -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c -c then for m=0,...,mmax-1 and n=m,...,nlat-1 the arrays a,b -c are given by -c -c a(m+1,n+1) = the sum from i=1 to i=nlat of -c c(m+1,i)*zbar(m,n,theta(i)) -c (first and last terms in this sum are -c divided by 2) -c -c b(m+1,n+1) = the sum from i=1 to i=nlat of -c s(m+1,i)*zbar(m,n,theta(i)) -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshaec -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c subroutine shaeci(nlat,nlon,wshaec,lshaec,dwork,ldwork,ierror) -c -c subroutine shaeci initializes the array wshaec which can then -c be used repeatedly by subroutine shaec. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c lshaec the dimension of the array wshaec as it appears in the -c program that calls shaeci. the array wshaec is an output -c parameter which is described below. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshaec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c dwork a double precision dwork array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls shaeci. ldwork must be at least -c nlat+1. -c -c -c output parameters -c -c wshaec an array which is initialized for use by subroutine shaec. -c once initialized, wshaec can be used repeatedly by shaec -c as long as nlon and nlat remain unchanged. wshaec must -c not be altered between calls of shaec. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshaec -c = 4 error in the specification of ldwork -c -c -c ******************************************************************* - subroutine shaec(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshaec,lshaec,work,lwork,ierror) - dimension g(idg,jdg,*),a(mdab,ndab,*),b(mdab,ndab,*),wshaec(*), - 1 work(*) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - if((isym.eq.0 .and. idg.lt.nlat) .or. - 1 (isym.ne.0 .and. idg.lt.(nlat+1)/2)) return - ierror = 6 - if(jdg .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - labc = 3*((mmax-2)*(nlat+nlat-mmax-1))/2 - if(lshaec .lt. lzz1+labc+nlon+15) return - ierror = 10 - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - if(lwork .lt. nln+max0(ls*nlon,3*nlat*imid)) return - ierror = 0 - ist = 0 - if(isym .eq. 0) ist = imid - iw1 = lzz1+labc+1 - call shaec1(nlat,isym,nt,g,idg,jdg,a,b,mdab,ndab,imid,ls,nlon, - 1 work,work(ist+1),work(nln+1),work(nln+1),wshaec,wshaec(iw1)) - return - end - subroutine shaec1(nlat,isym,nt,g,idgs,jdgs,a,b,mdab,ndab,imid, - 1 idg,jdg,ge,go,work,zb,wzfin,whrfft) -c -c whrfft must have at least nlon+15 locations -c wzfin must have 2*l*(nlat+1)/2 + ((l-3)*l+2)/2 locations -c zb must have 3*l*(nlat+1)/2 locations -c work must have ls*nlon locations -c - dimension g(idgs,jdgs,1),a(mdab,ndab,1),b(mdab,ndab,1), - 1 ge(idg,jdg,1),go(idg,jdg,1),zb(imid,nlat,3),wzfin(1), - 3 whrfft(1),work(1) - ls = idg - nlon = jdg - mmax = min0(nlat,nlon/2+1) - mdo = mmax - if(mdo+mdo-1 .gt. nlon) mdo = mmax-1 - nlp1 = nlat+1 - tsn = 2./nlon - fsn = 4./nlon - modl = mod(nlat,2) - imm1 = imid - if(modl .ne. 0) imm1 = imid-1 - if(isym .ne. 0) go to 15 - do 5 k=1,nt - do 5 i=1,imm1 - do 5 j=1,nlon - ge(i,j,k) = tsn*(g(i,j,k)+g(nlp1-i,j,k)) - go(i,j,k) = tsn*(g(i,j,k)-g(nlp1-i,j,k)) - 5 continue - go to 30 - 15 do 20 k=1,nt - do 20 i=1,imm1 - do 20 j=1,nlon - ge(i,j,k) = fsn*g(i,j,k) - 20 continue - if(isym .eq. 1) go to 27 - 30 if(modl .eq. 0) go to 27 - do 25 k=1,nt - do 25 j=1,nlon - ge(imid,j,k) = tsn*g(imid,j,k) - 25 continue - 27 do 35 k=1,nt - call hrfftf(ls,nlon,ge(1,1,k),ls,whrfft,work) - if(mod(nlon,2) .ne. 0) go to 35 - do 36 i=1,ls - ge(i,nlon,k) = .5*ge(i,nlon,k) - 36 continue - 35 continue - do 40 k=1,nt - do 40 mp1=1,mmax - do 40 np1=mp1,nlat - a(mp1,np1,k) = 0. - b(mp1,np1,k) = 0. - 40 continue - if(isym .eq. 1) go to 145 - call zfin (2,nlat,nlon,0,zb,i3,wzfin) - do 110 k=1,nt - do 110 i=1,imid - do 110 np1=1,nlat,2 - a(1,np1,k) = a(1,np1,k)+zb(i,np1,i3)*ge(i,1,k) - 110 continue - ndo = nlat - if(mod(nlat,2) .eq. 0) ndo = nlat-1 - do 120 mp1=2,mdo - m = mp1-1 - call zfin (2,nlat,nlon,m,zb,i3,wzfin) - do 120 k=1,nt - do 120 i=1,imid - do 120 np1=mp1,ndo,2 - a(mp1,np1,k) = a(mp1,np1,k)+zb(i,np1,i3)*ge(i,2*mp1-2,k) - b(mp1,np1,k) = b(mp1,np1,k)+zb(i,np1,i3)*ge(i,2*mp1-1,k) - 120 continue - if(mdo .eq. mmax .or. mmax .gt. ndo) go to 135 - call zfin (2,nlat,nlon,mdo,zb,i3,wzfin) - do 130 k=1,nt - do 130 i=1,imid - do 130 np1=mmax,ndo,2 - a(mmax,np1,k) = a(mmax,np1,k)+zb(i,np1,i3)*ge(i,2*mmax-2,k) - 130 continue - 135 if(isym .eq. 2) return - 145 call zfin (1,nlat,nlon,0,zb,i3,wzfin) - do 150 k=1,nt - do 150 i=1,imm1 - do 150 np1=2,nlat,2 - a(1,np1,k) = a(1,np1,k)+zb(i,np1,i3)*go(i,1,k) - 150 continue - ndo = nlat - if(mod(nlat,2) .ne. 0) ndo = nlat-1 - do 160 mp1=2,mdo - m = mp1-1 - mp2 = mp1+1 - call zfin (1,nlat,nlon,m,zb,i3,wzfin) - do 160 k=1,nt - do 160 i=1,imm1 - do 160 np1=mp2,ndo,2 - a(mp1,np1,k) = a(mp1,np1,k)+zb(i,np1,i3)*go(i,2*mp1-2,k) - b(mp1,np1,k) = b(mp1,np1,k)+zb(i,np1,i3)*go(i,2*mp1-1,k) - 160 continue - mp2 = mmax+1 - if(mdo .eq. mmax .or. mp2 .gt. ndo) return - call zfin (1,nlat,nlon,mdo,zb,i3,wzfin) - do 170 k=1,nt - do 170 i=1,imm1 - do 170 np1=mp2,ndo,2 - a(mmax,np1,k) = a(mmax,np1,k)+zb(i,np1,i3)*go(i,2*mmax-2,k) - 170 continue - return - end - - subroutine shaeci(nlat,nlon,wshaec,lshaec,dwork,ldwork,ierror) - dimension wshaec(lshaec) - double precision dwork(ldwork) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - imid = (nlat+1)/2 - mmax = min0(nlat,nlon/2+1) - lzz1 = 2*nlat*imid - labc = 3*((mmax-2)*(nlat+nlat-mmax-1))/2 - if(lshaec .lt. lzz1+labc+nlon+15) return - ierror = 4 - if(ldwork .lt. nlat+1) return - ierror = 0 - call zfinit (nlat,nlon,wshaec,dwork) - iw1 = lzz1+labc+1 - call hrffti(nlon,wshaec(iw1)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shaes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shaes.f deleted file mode 100755 index 52842fce1..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shaes.f +++ /dev/null @@ -1,485 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shaes.f -c -c this file contains code and documentation for subroutines -c shaes and shaesi -c -c ... files which must be loaded with shaes.f -c -c sphcom.f, hrfft.f -c -c subroutine shaes(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c + wshaes,lshaes,work,lwork,ierror) -c -c subroutine shaes performs the spherical harmonic analysis -c on the array g and stores the result in the arrays a and b. -c the analysis is performed on an equally spaced grid. the -c associated legendre functions are stored rather than recomputed -c as they are in subroutine shaec. the analysis is described -c below at output parameters a,b. -c -c sphcom.f, hrfft.f -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the analysis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the analysis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of analyses. in the program that calls shaes, -c the arrays g,a and b can be three dimensional in which -c case multiple analyses will be performed. the third -c index is the analysis index which assumes the values -c k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c g a two or three dimensional array (see input parameter -c nt) that contains the discrete function to be analyzed. -c g(i,j) contains the value of the function at the colatitude -c point theta(i) = (i-1)*pi/(nlat-1) and longitude point -c phi(j) = (j-1)*2*pi/nlon. the index ranges are defined -c above at the input parameter isym. -c -c -c idg the first dimension of the array g as it appears in the -c program that calls shaes. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg -c must be at least nlat/2 if nlat is even or at least -c (nlat+1)/2 if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shaes. jdg must be at least nlon. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shaes. mdab must be at least -c min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shaes. ndab must be at least nlat -c -c wshaes an array which must be initialized by subroutine shaesi. -c once initialized, wshaes can be used repeatedly by shaes -c as long as nlon and nlat remain unchanged. wshaes must -c not be altered between calls of shaes. -c -c lshaes the dimension of the array wshaes as it appears in the -c program that calls shaes. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshaes must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shaes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c (nt+1)*nlat*nlon. if isym is not zero then -c lwork must be at least (nt+1)*l2*nlon. -c -c -c ************************************************************** -c -c output parameters -c -c a,b both a,b are two or three dimensional arrays (see input -c parameter nt) that contain the spherical harmonic -c coefficients in the representation of g(i,j) given in the -c discription of subroutine shses. for isym=0, a(m,n) and -c b(m,n) are given by the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c -c -c definitions -c -c 1. the normalized associated legendre functions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c 2. the normalized z functions for m even -c -c zbar(m,n,theta) = 2/(nlat-1) times the sum from k=0 to k=nlat-1 of -c the integral from tau = 0 to tau = pi of -c cos(k*theta)*cos(k*tau)*pbar(m,n,tau)*sin(tau) -c (first and last terms in this sum are divided -c by 2) -c -c 3. the normalized z functions for m odd -c -c zbar(m,n,theta) = 2/(nlat-1) times the sum from k=0 to k=nlat-1 of -c of the integral from tau = 0 to tau = pi of -c sin(k*theta)*sin(k*tau)*pbar(m,n,tau)*sin(tau) -c -c 4. the fourier transform of g(i,j). -c -c c(m,i) = 2/nlon times the sum from j=1 to j=nlon -c of g(i,j)*cos((m-1)*(j-1)*2*pi/nlon) -c (the first and last terms in this sum -c are divided by 2) -c -c s(m,i) = 2/nlon times the sum from j=2 to j=nlon -c of g(i,j)*sin((m-1)*(j-1)*2*pi/nlon) -c -c 5. the maximum (plus one) longitudinal wave number -c -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c then for m=0,...,mmax-1 and n=m,...,nlat-1 the arrays a,b are -c given by -c -c a(m+1,n+1) = the sum from i=1 to i=nlat of -c c(m+1,i)*zbar(m,n,theta(i)) -c (first and last terms in this sum are -c divided by 2) -c -c b(m+1,n+1) = the sum from i=1 to i=nlat of -c s(m+1,i)*zbar(m,n,theta(i)) -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshaes -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c subroutine shaesi(nlat,nlon,wshaes,lshaes,work,lwork,dwork, -c + ldwork,ierror) -c -c subroutine shaesi initializes the array wshaes which can then -c be used repeatedly by subroutine shaes -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c lshaes the dimension of the array wshaes as it appears in the -c program that calls shaesi. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshaes must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a real work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shaesi. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwork must be at least -c -c 5*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2 -c -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls shaesi. ldwork must be at least nlat+1 -c -c -c output parameters -c -c wshaes an array which is initialized for use by subroutine shaes. -c once initialized, wshaes can be used repeatedly by shaes -c as long as nlon and nlat remain unchanged. wshaes must -c not be altered between calls of shaes. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshaes -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c -c -c **************************************************************** - subroutine shaes(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshaes,lshaes,work,lwork,ierror) - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1),wshaes(1), - 1 work(1) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - if((isym.eq.0 .and. idg.lt.nlat) .or. - 1 (isym.ne.0 .and. idg.lt.(nlat+1)/2)) return - ierror = 6 - if(jdg .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lshaes .lt. lzimn+nlon+15) return - ierror = 10 - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - if(lwork .lt. nln+ls*nlon) return - ierror = 0 - ist = 0 - if(isym .eq. 0) ist = imid - call shaes1(nlat,isym,nt,g,idg,jdg,a,b,mdab,ndab,wshaes,idz, - 1 ls,nlon,work,work(ist+1),work(nln+1),wshaes(lzimn+1)) - return - end - subroutine shaes1(nlat,isym,nt,g,idgs,jdgs,a,b,mdab,ndab,z,idz, - 1 idg,jdg,ge,go,work,whrfft) - dimension g(idgs,jdgs,1),a(mdab,ndab,1),b(mdab,ndab,1),z(idz,1), - 1 ge(idg,jdg,1),go(idg,jdg,1),work(1),whrfft(1) - ls = idg - nlon = jdg - mmax = min0(nlat,nlon/2+1) - mdo = mmax - if(mdo+mdo-1 .gt. nlon) mdo = mmax-1 - nlp1 = nlat+1 - tsn = 2./nlon - fsn = 4./nlon - imid = (nlat+1)/2 - modl = mod(nlat,2) - imm1 = imid - if(modl .ne. 0) imm1 = imid-1 - if(isym .ne. 0) go to 15 - do 5 k=1,nt - do 5 i=1,imm1 - do 5 j=1,nlon - ge(i,j,k) = tsn*(g(i,j,k)+g(nlp1-i,j,k)) - go(i,j,k) = tsn*(g(i,j,k)-g(nlp1-i,j,k)) - 5 continue - go to 30 - 15 do 20 k=1,nt - do 20 i=1,imm1 - do 20 j=1,nlon - ge(i,j,k) = fsn*g(i,j,k) - 20 continue - if(isym .eq. 1) go to 27 - 30 if(modl .eq. 0) go to 27 - do 25 k=1,nt - do 25 j=1,nlon - ge(imid,j,k) = tsn*g(imid,j,k) - 25 continue - 27 do 35 k=1,nt - call hrfftf(ls,nlon,ge(1,1,k),ls,whrfft,work) - if(mod(nlon,2) .ne. 0) go to 35 - do 36 i=1,ls - ge(i,nlon,k) = .5*ge(i,nlon,k) - 36 continue - 35 continue - do 40 k=1,nt - do 40 mp1=1,mmax - do 40 np1=mp1,nlat - a(mp1,np1,k) = 0. - b(mp1,np1,k) = 0. - 40 continue - if(isym .eq. 1) go to 145 - do 110 k=1,nt - do 110 i=1,imid - do 110 np1=1,nlat,2 - a(1,np1,k) = a(1,np1,k)+z(np1,i)*ge(i,1,k) - 110 continue - ndo = nlat - if(mod(nlat,2) .eq. 0) ndo = nlat-1 - do 120 mp1=2,mdo - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - do 120 k=1,nt - do 120 i=1,imid - do 120 np1=mp1,ndo,2 - a(mp1,np1,k) = a(mp1,np1,k)+z(np1+mb,i)*ge(i,2*mp1-2,k) - b(mp1,np1,k) = b(mp1,np1,k)+z(np1+mb,i)*ge(i,2*mp1-1,k) - 120 continue - if(mdo .eq. mmax .or. mmax .gt. ndo) go to 135 - mb = mdo*(nlat-1)-(mdo*(mdo-1))/2 - do 130 k=1,nt - do 130 i=1,imid - do 130 np1=mmax,ndo,2 - a(mmax,np1,k) = a(mmax,np1,k)+z(np1+mb,i)*ge(i,2*mmax-2,k) - 130 continue - 135 if(isym .eq. 2) return - 145 do 150 k=1,nt - do 150 i=1,imm1 - do 150 np1=2,nlat,2 - a(1,np1,k) = a(1,np1,k)+z(np1,i)*go(i,1,k) - 150 continue - ndo = nlat - if(mod(nlat,2) .ne. 0) ndo = nlat-1 - do 160 mp1=2,mdo - m = mp1-1 - mp2 = mp1+1 - mb = m*(nlat-1)-(m*(m-1))/2 - do 160 k=1,nt - do 160 i=1,imm1 - do 160 np1=mp2,ndo,2 - a(mp1,np1,k) = a(mp1,np1,k)+z(np1+mb,i)*go(i,2*mp1-2,k) - b(mp1,np1,k) = b(mp1,np1,k)+z(np1+mb,i)*go(i,2*mp1-1,k) - 160 continue - mp2 = mmax+1 - if(mdo .eq. mmax .or. mp2 .gt. ndo) return - mb = mdo*(nlat-1)-(mdo*(mdo-1))/2 - do 170 k=1,nt - do 170 i=1,imm1 - do 170 np1=mp2,ndo,2 - a(mmax,np1,k) = a(mmax,np1,k)+z(np1+mb,i)*go(i,2*mmax-2,k) - 170 continue - return - end - - subroutine shaesi(nlat,nlon,wshaes,lshaes,work,lwork,dwork, - + ldwork,ierror) - dimension wshaes(*),work(*) - double precision dwork(*) -c -c length of wshaes is (l*(l+1)*imid)/2+nlon+15 -c length of work is 5*l*imid + 3*((l-3)*l+2)/2 -c - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - mmax = min0(nlat,nlon/2+1) - imid = (nlat+1)/2 - lzimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshaes .lt. lzimn+nlon+15) return - ierror = 4 - labc = 3*((mmax-2)*(nlat+nlat-mmax-1))/2 - if(lwork .lt. 5*nlat*imid + labc) return - ierror = 5 - if (ldwork .lt. nlat+1) return - ierror = 0 - iw1 = 3*nlat*imid+1 - idz = (mmax*(nlat+nlat-mmax+1))/2 - call sea1(nlat,nlon,imid,wshaes,idz,work,work(iw1),dwork) - call hrffti(nlon,wshaes(lzimn+1)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shagc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shagc.f deleted file mode 100755 index ba4427ca3..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shagc.f +++ /dev/null @@ -1,646 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shagc.f -c -c this file contains code and documentation for subroutines -c shagc and shagci -c -c ... files which must be loaded with shagc.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c -c subroutine shagc(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c + wshagc,lshagc,work,lwork,ierror) -c -c subroutine shagc performs the spherical harmonic analysis -c on the array g and stores the result in the arrays a and b. -c the analysis is performed on a gaussian grid in colatitude -c and an equally spaced grid in longitude. the associated -c legendre functions are recomputed rather than stored as they -c are in subroutine shags. the analysis is described below -c at output parameters a,b. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the analysis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the analysis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of analyses. in the program that calls shagc, -c the arrays g,a and b can be three dimensional in which -c case multiple analyses will be performed. the third -c index is the analysis index which assumes the values -c k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c g a two or three dimensional array (see input parameter -c nt) that contains the discrete function to be analyzed. -c g(i,j) contains the value of the function at the gaussian -c point theta(i) and longitude point phi(j) = (j-1)*2*pi/nlon -c the index ranges are defined above at the input parameter -c isym. -c -c idg the first dimension of the array g as it appears in the -c program that calls shagc. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg must -c be at least nlat/2 if nlat is even or at least (nlat+1)/2 -c if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shagc. jdg must be at least nlon. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shagc. mdab must be at least -c min0((nlon+2)/2,nlat) if nlon is even or at least -c min0((nlon+1)/2,nlat) if nlon is odd -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shaec. ndab must be at least nlat -c -c wshagc an array which must be initialized by subroutine shagci. -c once initialized, wshagc can be used repeatedly by shagc. -c as long as nlat and nlon remain unchanged. wshagc must -c not be altered between calls of shagc. -c -c lshagc the dimension of the array wshagc as it appears in the -c program that calls shagc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshagc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shagc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*(nlon*nt+max0(3*l2,nlon)) -c -c if isym is not zero then lwork must be at least -c -c l2*(nlon*nt+max0(3*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c a,b both a,b are two or three dimensional arrays (see input -c parameter nt) that contain the spherical harmonic -c coefficients in the representation of g(i,j) given in the -c discription of subroutine shagc. for isym=0, a(m,n) and -c b(m,n) are given by the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c definitions -c -c 1. the normalized associated legendre functions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta). -c -c 2. the fourier transform of g(i,j). -c -c c(m,i) = 2/nlon times the sum from j=1 to j=nlon of -c g(i,j)*cos((m-1)*(j-1)*2*pi/nlon) -c (the first and last terms in this sum -c are divided by 2) -c -c s(m,i) = 2/nlon times the sum from j=2 to j=nlon of -c g(i,j)*sin((m-1)*(j-1)*2*pi/nlon) -c -c -c 3. the gaussian points and weights on the sphere -c (computed by subroutine gaqd). -c -c theta(1),...,theta(nlat) (gaussian pts in radians) -c wts(1),...,wts(nlat) (corresponding gaussian weights) -c -c 4. the maximum (plus one) longitudinal wave number -c -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c -c then for m=0,...,mmax-1 and n=m,...,nlat-1 the arrays a,b -c are given by -c -c a(m+1,n+1) = the sum from i=1 to i=nlat of -c c(m+1,i)*wts(i)*pbar(m,n,theta(i)) -c -c b(m+1,n+1) = the sum from i=1 to nlat of -c s(m+1,i)*wts(i)*pbar(m,n,theta(i)) -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshagc -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c -c subroutine shagci(nlat,nlon,wshagc,lshagc,dwork,ldwork,ierror) -c -c subroutine shagci initializes the array wshagc which can then -c be used repeatedly by subroutines shagc. it precomputes -c and stores in wshagc quantities such as gaussian weights, -c legendre polynomial coefficients, and fft trigonometric tables. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c wshagc an array which must be initialized by subroutine shagci. -c once initialized, wshagc can be used repeatedly by shagc -c as long as nlat and nlon remain unchanged. wshagc must -c not be altered between calls of shagc. -c -c lshagc the dimension of the array wshagc as it appears in the -c program that calls shagc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshagc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls shagci. ldwork must be at least -c -c nlat*(nlat+4) -c -c output parameter -c -c wshagc an array which must be initialized before calling shagc or -c once initialized, wshagc can be used repeatedly by shagc or -c as long as nlat and nlon remain unchanged. wshagc must not -c altered between calls of shagc. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshagc -c = 4 error in the specification of ldwork -c = 5 failure in gaqd to compute gaussian points -c (due to failure in eigenvalue routine) -c -c -c **************************************************************** - subroutine shagc(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshagc,lshagc,work,lwork,ierror) -c subroutine shagc performs the spherical harmonic analysis on -c a gaussian grid on the array(s) in g and returns the coefficients -c in array(s) a,b. the necessary legendre polynomials are computed -c as needed in this version. -c - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1), - 1 wshagc(lshagc),work(lwork) -c check input parameters - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return - ierror = 3 - if (isym.lt.0 .or.isym.gt.2) return - ierror = 4 - if (nt.lt.1) return -c set upper limit on m for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set gaussian point nearest equator pointer - late = (nlat+mod(nlat,2))/2 -c set number of grid points for analysis/synthesis - lat = nlat - if (isym.ne.0) lat = late - ierror = 5 - if (idg.lt.lat) return - ierror = 6 - if (jdg.lt.nlon) return - ierror = 7 - if(mdab .lt. l) return - ierror = 8 - if(ndab .lt. nlat) return - l1 = l - l2 = late - ierror = 9 -c check permanent work space length - if (lshagc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 10 -c check temporary work space length - if (isym.eq.0) then - if(lwork.lt.nlat*(nlon*nt+max0(3*l2,nlon))) return - else -c isym.ne.0 - if(lwork.lt.l2*(nlon*nt+max0(3*nlat,nlon))) return - end if - ierror = 0 -c starting address for gaussian wts in shigc and fft values - iwts = 1 - ifft = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+1 -c set pointers for internal storage of g and legendre polys - ipmn = lat*nlon*nt+1 - call shagc1(nlat,nlon,l,lat,isym,g,idg,jdg,nt,a,b,mdab,ndab, - 1wshagc,wshagc(iwts),wshagc(ifft),late,work(ipmn),work) - return - end - subroutine shagc1(nlat,nlon,l,lat,mode,gs,idg,jdg,nt,a,b,mdab, - 1 ndab,w,wts,wfft,late,pmn,g) - dimension gs(idg,jdg,nt),a(mdab,ndab,nt), - 1 b(mdab,ndab,nt),g(lat,nlon,nt) - dimension w(1),wts(nlat),wfft(1),pmn(nlat,late,3) -c set gs array internally in shagc1 - do 100 k=1,nt - do 100 j=1,nlon - do 100 i=1,lat - g(i,j,k) = gs(i,j,k) - 100 continue -c do fourier transform - do 101 k=1,nt - call hrfftf(lat,nlon,g(1,1,k),lat,wfft,pmn) - 101 continue -c scale result - sfn = 2.0/float(nlon) - do 102 k=1,nt - do 102 j=1,nlon - do 102 i=1,lat - g(i,j,k) = sfn*g(i,j,k) - 102 continue -c compute using gaussian quadrature -c a(n,m) = s (ga(theta,m)*pnm(theta)*sin(theta)*dtheta) -c b(n,m) = s (gb(theta,m)*pnm(theta)*sin(theta)*dtheta) -c here ga,gb are the cos(phi),sin(phi) coefficients of -c the fourier expansion of g(theta,phi) in phi. as a result -c of the above fourier transform they are stored in array -c g as follows: -c for each theta(i) and k= l-1 -c ga(0),ga(1),gb(1),ga(2),gb(2),...,ga(k-1),gb(k-1),ga(k) -c correspond to (in the case nlon=l+l-2) -c g(i,1),g(i,2),g(i,3),g(i,4),g(i,5),...,g(i,2l-4),g(i,2l-3),g(i,2l- -c initialize coefficients to zero - do 103 k=1,nt - do 103 np1=1,nlat - do 103 mp1=1,l - a(mp1,np1,k) = 0.0 - b(mp1,np1,k) = 0.0 - 103 continue -c set m+1 limit on b(m+1) calculation - lm1 = l - if (nlon .eq. l+l-2) lm1 = l-1 - if (mode.eq.0) then -c for full sphere (mode=0) and even/odd reduction: -c overwrite g(i) with (g(i)+g(nlat-i+1))*wts(i) -c overwrite g(nlat-i+1) with (g(i)-g(nlat-i+1))*wts(i) - nl2 = nlat/2 - do 104 k=1,nt - do 104 j=1,nlon - do 105 i=1,nl2 - is = nlat-i+1 - t1 = g(i,j,k) - t2 = g(is,j,k) - g(i,j,k) = wts(i)*(t1+t2) - g(is,j,k) = wts(i)*(t1-t2) - 105 continue -c adjust equator if necessary(nlat odd) - if (mod(nlat,2).ne.0) g(late,j,k) = wts(late)*g(late,j,k) - 104 continue -c set m = 0 coefficients first - m = 0 - call legin(mode,l,nlat,m,w,pmn,km) - do 106 k=1,nt - do 106 i=1,late - is = nlat-i+1 - do 107 np1=1,nlat,2 -c n even - a(1,np1,k) = a(1,np1,k)+g(i,1,k)*pmn(np1,i,km) - 107 continue - do 108 np1=2,nlat,2 -c n odd - a(1,np1,k) = a(1,np1,k)+g(is,1,k)*pmn(np1,i,km) - 108 continue - 106 continue -c compute coefficients for which b(m,n) is available - do 109 mp1=2,lm1 - m = mp1-1 - mp2 = m+2 -c compute pmn for all i and n=m,...,l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 110 k=1,nt - do 111 i=1,late - is = nlat-i+1 -c n-m even - do 112 np1=mp1,nlat,2 - a(mp1,np1,k) = a(mp1,np1,k)+g(i,2*m,k)*pmn(np1,i,km) - b(mp1,np1,k) = b(mp1,np1,k)+g(i,2*m+1,k)*pmn(np1,i,km) - 112 continue -c n-m odd - do 113 np1=mp2,nlat,2 - a(mp1,np1,k) = a(mp1,np1,k)+g(is,2*m,k)*pmn(np1,i,km) - b(mp1,np1,k) = b(mp1,np1,k)+g(is,2*m+1,k)*pmn(np1,i,km) - 113 continue - 111 continue - 110 continue - 109 continue - if (nlon .eq. l+l-2) then -c compute a(l,np1) coefficients only - m = l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 114 k=1,nt - do 114 i=1,late - is = nlat-i+1 -c n-m even - do 124 np1=l,nlat,2 - a(l,np1,k) = a(l,np1,k)+0.5*g(i,nlon,k)*pmn(np1,i,km) - 124 continue - lp1 = l+1 -c n-m odd - do 125 np1=lp1,nlat,2 - a(l,np1,k) = a(l,np1,k)+0.5*g(is,nlon,k)*pmn(np1,i,km) - 125 continue - 114 continue - end if - else -c half sphere -c overwrite g(i) with wts(i)*(g(i)+g(i)) for i=1,...,nlate/2 - nl2 = nlat/2 - do 116 k=1,nt - do 116 j=1,nlon - do 115 i=1,nl2 - g(i,j,k) = wts(i)*(g(i,j,k)+g(i,j,k)) - 115 continue -c adjust equator separately if a grid point - if (nl2.lt.late) g(late,j,k) = wts(late)*g(late,j,k) - 116 continue -c set m = 0 coefficients first - m = 0 - call legin(mode,l,nlat,m,w,pmn,km) - ms = 1 - if (mode.eq.1) ms = 2 - do 117 k=1,nt - do 117 i=1,late - do 117 np1=ms,nlat,2 - a(1,np1,k) = a(1,np1,k)+g(i,1,k)*pmn(np1,i,km) - 117 continue -c compute coefficients for which b(m,n) is available - do 118 mp1=2,lm1 - m = mp1-1 - ms = mp1 - if (mode.eq.1) ms = mp1+1 -c compute pmn for all i and n=m,...,nlat-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 119 k=1,nt - do 119 i=1,late - do 119 np1=ms,nlat,2 - a(mp1,np1,k) = a(mp1,np1,k)+g(i,2*m,k)*pmn(np1,i,km) - b(mp1,np1,k) = b(mp1,np1,k)+g(i,2*m+1,k)*pmn(np1,i,km) - 119 continue - 118 continue - if (nlon.eq.l+l-2) then -c compute coefficient a(l,np1) only - m = l-1 - call legin(mode,l,nlat,m,w,pmn,km) - ns = l - if (mode.eq.1) ns = l+1 - do 120 k=1,nt - do 120 i=1,late - do 120 np1=ns,nlat,2 - a(l,np1,k) = a(l,np1,k)+0.5*g(i,nlon,k)*pmn(np1,i,km) - 120 continue - end if - end if - return - end - subroutine shagci(nlat,nlon,wshagc,lshagc,dwork,ldwork,ierror) -c this subroutine must be called before calling shagc with -c fixed nlat,nlon. it precomputes quantites such as the gaussian -c points and weights, m=0,m=1 legendre polynomials, recursion -c recursion coefficients. - dimension wshagc(lshagc) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+mod(nlat,2))/2 - l1 = l - l2 = late - ierror = 3 -c check permanent work space length - if (lshagc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 4 - if (ldwork.lt.nlat*(nlat+4))return - ierror = 0 -c set pointers - i1 = 1 - i2 = i1+nlat - i3 = i2+nlat*late - i4 = i3+nlat*late - i5 = i4+l*(l-1)/2 +(nlat-l)*(l-1) - i6 = i5+l*(l-1)/2 +(nlat-l)*(l-1) - i7 = i6+l*(l-1)/2 +(nlat-l)*(l-1) -c set indices in temp work for double precision gaussian wts and pts - idth = 1 - idwts = idth+nlat - iw = idwts+nlat - call shagci1(nlat,nlon,l,late,wshagc(i1),wshagc(i2),wshagc(i3), - 1wshagc(i4),wshagc(i5),wshagc(i6),wshagc(i7),dwork(idth), - 2dwork(idwts),dwork(iw),ierror) - if (ierror.ne.0) ierror = 5 - return - end - subroutine shagci1(nlat,nlon,l,late,wts,p0n,p1n,abel,bbel,cbel, - 1 wfft,dtheta,dwts,work,ier) - dimension wts(nlat),p0n(nlat,late),p1n(nlat,late),abel(1),bbel(1), - 1 cbel(1),wfft(1) - double precision pb,dtheta(nlat),dwts(nlat),work(*) -c compute the nlat gaussian points and weights, the -c m=0,1 legendre polys for gaussian points and all n, -c and the legendre recursion coefficients -c define index function used in storing -c arrays for recursion coefficients (functions of (m,n)) -c the index function indx(m,n) is defined so that -c the pairs (m,n) map to [1,2,...,indx(l-1,l-1)] with no -c "holes" as m varies from 2 to n and n varies from 2 to l-1. -c (m=0,1 are set from p0n,p1n for all n) -c define for 2.le.n.le.l-1 - indx(m,n) = (n-1)*(n-2)/2+m-1 -c define index function for l.le.n.le.nlat - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 -c preset quantites for fourier transform - call hrffti(nlon,wfft) -c compute double precision gaussian points and weights -c lw = 4*nlat*(nlat+1)+2 - lw = nlat*(nlat+2) - call gaqd(nlat,dtheta,dwts,work,lw,ier) - if (ier.ne.0) return -c store gaussian weights single precision to save computation -c in inner loops in analysis - do 100 i=1,nlat - wts(i) = dwts(i) - 100 continue -c initialize p0n,p1n using double precision dnlfk,dnlft - do 101 np1=1,nlat - do 101 i=1,late - p0n(np1,i) = 0.0 - p1n(np1,i) = 0.0 - 101 continue -c compute m=n=0 legendre polynomials for all theta(i) - np1 = 1 - n = 0 - m = 0 - call dnlfk(m,n,work) - do 103 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(1,i) = pb - 103 continue -c compute p0n,p1n for all theta(i) when n.gt.0 - do 104 np1=2,nlat - n = np1-1 - m = 0 - call dnlfk(m,n,work) - do 105 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(np1,i) = pb - 105 continue -c compute m=1 legendre polynomials for all n and theta(i) - m = 1 - call dnlfk(m,n,work) - do 106 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p1n(np1,i) = pb - 106 continue - 104 continue -c compute and store swarztrauber recursion coefficients -c for 2.le.m.le.n and 2.le.n.le.nlat in abel,bbel,cbel - do 107 n=2,nlat - mlim = min0(n,l) - do 107 m=2,mlim - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/ - 1 float(((n+m-1)*(n+m)))) - 107 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shags.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shags.f deleted file mode 100755 index c41e9277f..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shags.f +++ /dev/null @@ -1,727 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shags.f -c -c this file contains code and documentation for subroutines -c shags and shagsi -c -c ... files which must be loaded with shags.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c subroutine shags(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c 1 wshags,lshags,work,lwork,ierror) -c -c subroutine shags performs the spherical harmonic analysis -c on the array g and stores the result in the arrays a and b. -c the analysis is performed on a gaussian grid in colatitude -c and an equally spaced grid in longitude. the associated -c legendre functions are stored rather than recomputed as they -c are in subroutine shagc. the analysis is described below -c at output parameters a,b. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the analysis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the analysis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the analysis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the analysis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of analyses. in the program that calls shags, -c the arrays g,a and b can be three dimensional in which -c case multiple analyses will be performed. the third -c index is the analysis index which assumes the values -c k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c g a two or three dimensional array (see input parameter -c nt) that contains the discrete function to be analyzed. -c g(i,j) contains the value of the function at the gaussian -c point theta(i) and longitude point phi(j) = (j-1)*2*pi/nlon -c the index ranges are defined above at the input parameter -c isym. -c -c idg the first dimension of the array g as it appears in the -c program that calls shags. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg must -c be at least nlat/2 if nlat is even or at least (nlat+1)/2 -c if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shags. jdg must be at least nlon. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shags. mdab must be at least -c min0((nlon+2)/2,nlat) if nlon is even or at least -c min0((nlon+1)/2,nlat) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shags. ndab must be at least nlat -c -c wshags an array which must be initialized by subroutine shagsi. -c once initialized, wshags can be used repeatedly by shags -c as long as nlat and nlon remain unchanged. wshags must -c not be altered between calls of shags. -c -c lshags the dimension of the array wshags as it appears in the -c program that calls shags. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshags must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c work a real work space which need not be saved -c -c -c lwork the dimension of the array work as it appears in the -c program that calls shags. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c -c if isym is zero then lwork must be at least -c -c nlat*nlon*(nt+1) -c -c if isym is nonzero then lwork must be at least -c -c l2*nlon*(nt+1) -c -c ************************************************************** -c -c output parameters -c -c a,b both a,b are two or three dimensional arrays (see input -c parameter nt) that contain the spherical harmonic -c coefficients in the representation of g(i,j) given in the -c discription of subroutine shags. for isym=0, a(m,n) and -c b(m,n) are given by the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c definitions -c -c 1. the normalized associated legendre functions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta). -c -c 2. the fourier transform of g(i,j). -c -c c(m,i) = 2/nlon times the sum from j=1 to j=nlon of -c g(i,j)*cos((m-1)*(j-1)*2*pi/nlon) -c (the first and last terms in this sum -c are divided by 2) -c -c s(m,i) = 2/nlon times the sum from j=2 to j=nlon of -c g(i,j)*sin((m-1)*(j-1)*2*pi/nlon) -c -c -c 3. the gaussian points and weights on the sphere -c (computed by subroutine gaqd). -c -c theta(1),...,theta(nlat) (gaussian pts in radians) -c wts(1),...,wts(nlat) (corresponding gaussian weights) -c -c -c 4. the maximum (plus one) longitudinal wave number -c -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c -c then for m=0,...,mmax-1 and n=m,...,nlat-1 the arrays a,b -c are given by -c -c a(m+1,n+1) = the sum from i=1 to i=nlat of -c c(m+1,i)*wts(i)*pbar(m,n,theta(i)) -c -c b(m+1,n+1) = the sum from i=1 to nlat of -c s(m+1,i)*wts(i)*pbar(m,n,theta(i)) -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshags -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c -c subroutine shagsi(nlat,nlon,wshags,lshags,work,lwork,dwork,ldwork, -c + ierror) -c -c subroutine shagsi initializes the array wshags which can then -c be used repeatedly by subroutines shags. it precomputes -c and stores in wshags quantities such as gaussian weights, -c legendre polynomial coefficients, and fft trigonometric tables. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c wshags an array which must be initialized by subroutine shagsi. -c once initialized, wshags can be used repeatedly by shags -c as long as nlat and nlon remain unchanged. wshags must -c not be altered between calls of shags. -c -c lshags the dimension of the array wshags as it appears in the -c program that calls shags. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshags must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c work a real work space which need not be saved -c -c lwork the dimension of the array work as it appears in the -c program that calls shagsi. lwork must be at least -c 4*nlat*(nlat+2)+2 in the routine calling shagsi -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the length of dwork in the calling routine. ldwork must -c be at least nlat*(nlat+4) -c -c output parameter -c -c wshags an array which must be initialized before calling shags or -c once initialized, wshags can be used repeatedly by shags or -c as long as nlat and nlon remain unchanged. wshags must not -c altered between calls of shasc. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshags -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c = 6 failure in gaqd to compute gaussian points -c (due to failure in eigenvalue routine) -c -c -c **************************************************************** - subroutine shags(nlat,nlon,mode,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshags,lshags,work,lwork,ierror) -c subroutine shags performs the spherical harmonic analysis on -c a gaussian grid on the array(s) in g and returns the coefficients -c in array(s) a,b. the necessary legendre polynomials are fully -c stored in this version. -c - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1), - 1 wshags(lshags),work(lwork) -c check input parameters - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return - ierror = 3 - if (mode.lt.0 .or.mode.gt.2) return -c set m limit for pmn - l = min0((nlon+2)/2,nlat) -c set gaussian point nearest equator pointer - late = (nlat+mod(nlat,2))/2 -c set number of grid points for analysis/synthesis - lat = nlat - if (mode.ne.0) lat = late - ierror = 4 - if (nt.lt.1) return - ierror = 5 - if (idg.lt.lat) return - ierror = 6 - if (jdg.lt.nlon) return - ierror = 7 - if(mdab .lt. l) return - ierror = 8 - if(ndab .lt. nlat) return - l1 = l - l2 = late - ierror = 9 -c check permanent work space length -c - lp= nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshags.lt.lp) return - ierror = 10 -c check temporary work space length - if (mode.eq.0 .and. lwork.lt.nlat*nlon*(nt+1)) return - if (mode.ne.0 .and. lwork.lt.l2*nlon*(nt+1)) return - ierror = 0 -c set starting address for gaussian wts ,fft values, -c and fully stored legendre polys in wshags - iwts = 1 - ifft = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+1 - ipmn = ifft+nlon+15 -c set pointer for internal storage of g - iw = lat*nlon*nt+1 - call shags1(nlat,nlon,l,lat,mode,g,idg,jdg,nt,a,b,mdab,ndab, - 1wshags(iwts),wshags(ifft),wshags(ipmn),late,work,work(iw)) - return - end - - subroutine shags1(nlat,nlon,l,lat,mode,gs,idg,jdg,nt,a,b,mdab, - 1 ndab,wts,wfft,pmn,late,g,work) - dimension gs(idg,jdg,nt),a(mdab,ndab,nt), - 1 b(mdab,ndab,nt),g(lat,nlon,nt) - dimension wfft(1),pmn(late,1),wts(nlat),work(1) -c set gs array internally in shags1 - do 100 k=1,nt - do 100 j=1,nlon - do 100 i=1,lat - g(i,j,k) = gs(i,j,k) - 100 continue - -c do fourier transform - do 101 k=1,nt - call hrfftf(lat,nlon,g(1,1,k),lat,wfft,work) - 101 continue - -c scale result - sfn = 2.0/float(nlon) - do 102 k=1,nt - do 102 j=1,nlon - do 102 i=1,lat - g(i,j,k) = sfn*g(i,j,k) - 102 continue - -c compute using gaussian quadrature -c a(n,m) = s (ga(theta,m)*pnm(theta)*sin(theta)*dtheta) -c b(n,m) = s (gb(theta,m)*pnm(theta)*sin(theta)*dtheta) -c here ga,gb are the cos(phi),sin(phi) coefficients of -c the fourier expansion of g(theta,phi) in phi. as a result -c of the above fourier transform they are stored in array -c g as follows: -c for each theta(i) and k= l-1 -c ga(0),ga(1),gb(1),ga(2),gb(2),...,ga(k-1),gb(k-1),ga(k) -c correspond to -c g(i,1),g(i,2),g(i,3),g(i,4),g(i,5),...,g(i,2l-4),g(i,2l-3),g(i,2l-2) -c whenever 2*l-2 = nlon exactly -c initialize coefficients to zero - do 103 k=1,nt - do 103 np1=1,nlat - do 103 mp1=1,l - a(mp1,np1,k) = 0.0 - b(mp1,np1,k) = 0.0 - 103 continue -c set mp1 limit on b(mp1) calculation - lm1 = l - if (nlon .eq. l+l-2) lm1 = l-1 - - if (mode.eq.0) then -c for full sphere (mode=0) and even/odd reduction: -c overwrite g(i) with (g(i)+g(nlat-i+1))*wts(i) -c overwrite g(nlat-i+1) with (g(i)-g(nlat-i+1))*wts(i) - nl2 = nlat/2 - do 104 k=1,nt - do 104 j=1,nlon - do 105 i=1,nl2 - is = nlat-i+1 - t1 = g(i,j,k) - t2 = g(is,j,k) - g(i,j,k) = wts(i)*(t1+t2) - g(is,j,k) = wts(i)*(t1-t2) - 105 continue -c adjust equator if necessary(nlat odd) - if (mod(nlat,2).ne.0) g(late,j,k) = wts(late)*g(late,j,k) - 104 continue -c set m = 0 coefficients first - mp1 = 1 - m = 0 - mml1 = m*(2*nlat-m-1)/2 - do 106 k=1,nt - do 106 i=1,late - is = nlat-i+1 - do 107 np1=1,nlat,2 -c n even - a(1,np1,k) = a(1,np1,k)+g(i,1,k)*pmn(i,mml1+np1) - 107 continue - do 108 np1=2,nlat,2 -c n odd - a(1,np1,k) = a(1,np1,k)+g(is,1,k)*pmn(i,mml1+np1) - 108 continue - 106 continue -c compute m.ge.1 coefficients next - do 109 mp1=2,lm1 - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 - mp2 = mp1+1 - do 110 k=1,nt - do 111 i=1,late - is = nlat-i+1 -c n-m even - do 112 np1=mp1,nlat,2 - a(mp1,np1,k) = a(mp1,np1,k)+g(i,2*m,k)*pmn(i,mml1+np1) - b(mp1,np1,k) = b(mp1,np1,k)+g(i,2*m+1,k)*pmn(i,mml1+np1) - 112 continue -c n-m odd - do 113 np1=mp2,nlat,2 - a(mp1,np1,k) = a(mp1,np1,k)+g(is,2*m,k)*pmn(i,mml1+np1) - b(mp1,np1,k) = b(mp1,np1,k)+g(is,2*m+1,k)*pmn(i,mml1+np1) - 113 continue - 111 continue - 110 continue - 109 continue - if (nlon .eq. l+l-2) then -c compute m=l-1, n=l-1,l,...,nlat-1 coefficients - m = l-1 - mml1 = m*(2*nlat-m-1)/2 - do 114 k=1,nt - do 114 i=1,late - is = nlat-i+1 - do 124 np1=l,nlat,2 - mn = mml1+np1 - a(l,np1,k) = a(l,np1,k)+0.5*g(i,nlon,k)*pmn(i,mn) - 124 continue -c n-m odd - lp1 = l+1 - do 125 np1=lp1,nlat,2 - mn = mml1+np1 - a(l,np1,k) = a(l,np1,k)+0.5*g(is,nlon,k)*pmn(i,mn) - 125 continue - 114 continue - end if - - else - -c half sphere -c overwrite g(i) with wts(i)*(g(i)+g(i)) for i=1,...,nlate/2 - nl2 = nlat/2 - do 116 k=1,nt - do 116 j=1,nlon - do 115 i=1,nl2 - g(i,j,k) = wts(i)*(g(i,j,k)+g(i,j,k)) - 115 continue -c adjust equator separately if a grid point - if (nl2.lt.late) g(late,j,k) = wts(late)*g(late,j,k) - 116 continue - -c set m = 0 coefficients first - mp1 = 1 - m = 0 - mml1 = m*(2*nlat-m-1)/2 - ms = 1 - if (mode.eq.1) ms = 2 - do 117 k=1,nt - do 117 i=1,late - do 117 np1=ms,nlat,2 - a(1,np1,k) = a(1,np1,k)+g(i,1,k)*pmn(i,mml1+np1) - 117 continue - -c compute m.ge.1 coefficients next - do 118 mp1=2,lm1 - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 - ms = mp1 - if (mode.eq.1) ms = mp1+1 - do 119 k=1,nt - do 119 i=1,late - do 119 np1=ms,nlat,2 - a(mp1,np1,k) = a(mp1,np1,k)+g(i,2*m,k)*pmn(i,mml1+np1) - b(mp1,np1,k) = b(mp1,np1,k)+g(i,2*m+1,k)*pmn(i,mml1+np1) - 119 continue - 118 continue - - if (nlon.eq.l+l-2) then -c compute n=m=l-1 coefficients last - m = l-1 - mml1 = m*(2*nlat-m-1)/2 -c set starting n for mode even - ns = l -c set starting n for mode odd - if (mode.eq.1) ns = l+1 - do 120 k=1,nt - do 120 i=1,late - do 120 np1=ns,nlat,2 - mn = mml1+np1 - a(l,np1,k) = a(l,np1,k)+0.5*g(i,nlon,k)*pmn(i,mn) - 120 continue - end if - - end if - - return - end - subroutine shagsi(nlat,nlon,wshags,lshags,work,lwork,dwork,ldwork, - + ierror) -c -c this subroutine must be called before calling shags or shsgs with -c fixed nlat,nlon. it precomputes the gaussian weights, points -c and all necessary legendre polys and stores them in wshags. -c these quantities must be preserved when calling shags or shsgs -c repeatedly with fixed nlat,nlon. dwork must be of length at -c least nlat*(nlat+4) in the routine calling shagsi. This is -c not checked. undetectable errors will result if dwork is -c smaller than nlat*(nlat+4). -c - dimension wshags(lshags),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+1)/2 - l1 = l - l2 = late -c check permanent work space length - ierror = 3 - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshags.lt.lp) return - ierror = 4 -c check temporary work space - if (lwork.lt.4*nlat*(nlat+2)+2) return - ierror = 5 -c check double precision temporary space - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set preliminary quantites needed to compute and store legendre polys - ldw = nlat*(nlat+4) - call shagsp(nlat,nlon,wshags,lshags,dwork,ldwork,ierror) - if (ierror.ne.0) return -c set legendre poly pointer in wshags - ipmnf = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+nlon+16 - call shagss1(nlat,l,late,wshags,work,wshags(ipmnf)) - return - end - subroutine shagss1(nlat,l,late,w,pmn,pmnf) - dimension w(1),pmn(nlat,late,3),pmnf(late,1) -c compute and store legendre polys for i=1,...,late,m=0,...,l-1 -c and n=m,...,l-1 - do i=1,nlat - do j=1,late - do k=1,3 - pmn(i,j,k) = 0.0 - end do - end do - end do - do 100 mp1=1,l - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 -c compute pmn for n=m,...,nlat-1 and i=1,...,(l+1)/2 - mode = 0 - call legin(mode,l,nlat,m,w,pmn,km) -c store above in pmnf - do 101 np1=mp1,nlat - mn = mml1+np1 - do 102 i=1,late - pmnf(i,mn) = pmn(np1,i,km) - 102 continue - 101 continue - 100 continue - return - end - subroutine shagsp(nlat,nlon,wshags,lshags,dwork,ldwork,ierror) - dimension wshags(lshags) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+mod(nlat,2))/2 - l1 = l - l2 = late - ierror = 3 -c check permanent work space length - if (lshags .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 4 -c if (lwork.lt.4*nlat*(nlat+2)+2) return - if (ldwork.lt.nlat*(nlat+4))return - ierror = 0 -c set pointers - i1 = 1 - i2 = i1+nlat - i3 = i2+nlat*late - i4 = i3+nlat*late - i5 = i4+l*(l-1)/2 +(nlat-l)*(l-1) - i6 = i5+l*(l-1)/2 +(nlat-l)*(l-1) - i7 = i6+l*(l-1)/2 +(nlat-l)*(l-1) -c set indices in temp work for double precision gaussian wts and pts - idth = 1 -c idwts = idth+2*nlat -c iw = idwts+2*nlat - idwts = idth+nlat - iw = idwts+nlat - call shagsp1(nlat,nlon,l,late,wshags(i1),wshags(i2),wshags(i3), - 1wshags(i4),wshags(i5),wshags(i6),wshags(i7),dwork(idth), - 2dwork(idwts),dwork(iw),ierror) - if (ierror.ne.0) ierror = 6 - return - end - - subroutine shagsp1(nlat,nlon,l,late,wts,p0n,p1n,abel,bbel,cbel, - + wfft,dtheta,dwts,work,ier) - dimension wts(nlat),p0n(nlat,late),p1n(nlat,late),abel(1),bbel(1), - 1 cbel(1),wfft(1),dtheta(nlat),dwts(nlat) - double precision pb,dtheta,dwts,work(*) - indx(m,n) = (n-1)*(n-2)/2+m-1 - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 - call hrffti(nlon,wfft) - -c compute double precision gaussian points and weights -c lw = 4*nlat*(nlat+2) - lw = nlat*(nlat+2) - call gaqd(nlat,dtheta,dwts,work,lw,ier) - if (ier.ne.0) return - -c store gaussian weights single precision to save computation -c in inner loops in analysis - do 100 i=1,nlat - wts(i) = dwts(i) - 100 continue -c initialize p0n,p1n using double precision dnlfk,dnlft - do 101 np1=1,nlat - do 101 i=1,late - p0n(np1,i) = 0.0 - p1n(np1,i) = 0.0 - 101 continue -c compute m=n=0 legendre polynomials for all theta(i) - np1 = 1 - n = 0 - m = 0 - call dnlfk(m,n,work) - do 103 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(1,i) = pb - 103 continue -c compute p0n,p1n for all theta(i) when n.gt.0 - do 104 np1=2,nlat - n = np1-1 - m = 0 - call dnlfk(m,n,work) - do 105 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(np1,i) = pb - 105 continue -c compute m=1 legendre polynomials for all n and theta(i) - m = 1 - call dnlfk(m,n,work) - do 106 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p1n(np1,i) = pb - 106 continue - 104 continue -c -c compute and store swarztrauber recursion coefficients -c for 2.le.m.le.n and 2.le.n.le.nlat in abel,bbel,cbel - do 107 n=2,nlat - mlim = min0(n,l) - do 107 m=2,mlim - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/ - 1 float(((n+m-1)*(n+m)))) - 107 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shallow.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shallow.f deleted file mode 100755 index 03d07814c..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shallow.f +++ /dev/null @@ -1,638 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shallow.f -c -c program shallow solves the nonlinear shallow-water equations -c on the sphere using spherepack software. -c -c ... required spherepack files -c -c vtses.f, dives.f, vrtes.f, grades.f, sphcom.f, hrfft.f, -c vhaes.f,vhses.f,shaes.f,shses.f -c - - program shallow -c -c the nonlinear shallow-water equations on the sphere are -c solved using a spectral method based on the spherical -c vector harmonics. the method is described in the paper: -c -c [1] p. n. swarztrauber, spectral transform methods for solving -c the shallow-water equations on the sphere, p.n. swarztrauber, -c monthly weather review, vol. 124, no. 4, april 1996, pp. 730-744. -c -c this program implements test case 3 (steady nonlinear rotated flow) -c in the paper: -c -c [2] d.l. williamson, j.b. drake, j.j. hack, r. jakob, and -c p.n. swarztrauber, j. comp. phys., a standard test set -c for numerical approximations to the shallow-water -c equations in spherical geometry, j. comp. phys., -c vol. 102, no. 1, sept. 1992, pp. 211-224. -c -c definitions: -c -c -c nlat number of latitudes including poles -c nlon number of distinct longitudes -c mmode max wave number -c omega rotation rate of earth in radians per second -c aa radius of earth in meters -c pzero mean height of geopotential -c uzero maximum velocity -c alpha tilt angle of the rotated grid -c ncycle cycle number -c time model time in seconds -c dt time step -c lambda longitude -c theta colatitude -c -c the first dimension of the following two dimensional arrays -c corresponds to the latitude index with values i=1,...,nlat -c where i=1 is the north pole and i=nlat is the south pole. -c the second dimension is longitude with values j=1,...,nlon -c where j=1 corresponds to zero longitude and j=nlon corresponds -c to 2pi minus 2pi/nlon. -c -c u(i,j) east longitudinal velocity component at t=time -c v(i,j) latitudinal velocity component at t=time -c p(i,j) +pzero = geopotential at t=time -c -c unew(i,j) east longitudinal velocity component at t=time+dt -c vnew(i,j) latitudinal velocity component at t=time+dt -c pnew(i,j) +pzero = geopotential at t=time+dt -c -c uold(i,j) east longitudinal velocity component at t=time-dt -c vold(i,j) latitudinal velocity component at t=time-dt -c pold(i,j) +pzero = geopotential at t=time-dt -c -c divg(i,j) divergence (d/dtheta (cos(theta) v) -c + du/dlambda)/cos(theta) -c vort(i,j) vorticity (d/dtheta (cos(theta) u) -c - dv/dlambda)/cos(theta) -c -c ut(i,j) latitudinal derivative of longitudinal -c velocity component -c vt(i,j) latitudinal derivative of latitudinal -c velocity component -c -c dudt(i,j) time derivative of longitudinal velocity component -c dvdt(i,j) time derivative of latitudinal velocity component -c dpdt(i,j) time derivative of geopotential -c -c gpdl(i,j) first component of the gradient of p(i,j) -c the longitudinal derivative of the geopotential -c divided by the cosine of the latitude -c -c gpdt(i,j) second component of the gradient of p(i,j) -c the latitudinal derivative of the geopotential -c -c uxact(i,j) the "exact" longitudinal veloctiy component -c vxact(i,j) the "exact" latitudinal veloctiy component -c uxact(i,j) the "exact" geopotential -c -c f(i,j) the coriolis force on rotated grid -c -c the following two dimensional arrays are nonzero in the triangle -c n=1,...,nlat and m less than or equal to n. -c -c a(m,n),b(m,n) spectral coefficients of the geopotential -c -c br(m,n),bi(m,n) spectral coefficients of the velocity -c cr(m,n),ci(m,n) vector [u(i,j),v(i,j)] -c -c -c phlt(i) the coefficients in the cosine series -c representation of the unrotated geopotential -c - parameter (idp=73,jdp=144,mdab=73,ndab=73) - parameter(lldwork = 2*(idp+1)) -c - dimension u(idp,jdp),v(idp,jdp),p(idp,jdp),f(idp,jdp), - 1 unew(idp,jdp),vnew(idp,jdp),pnew(idp,jdp), - 2 uold(idp,jdp),vold(idp,jdp),pold(idp,jdp), - 3 uxact(idp,jdp),vxact(idp,jdp),pxact(idp,jdp), - 4 divg(idp,jdp),vort(idp,jdp),ut(idp,jdp), - 5 vt(idp,jdp),dudt(idp,jdp),dvdt(idp,jdp), - 6 dpdt(idp,jdp),gpdt(idp,jdp),gpdl(idp,jdp), - 7 a(mdab,ndab),b(mdab,ndab),br(mdab,ndab), - 8 bi(mdab,ndab),cr(mdab,ndab),ci(mdab,ndab), - 9 phlt(361) -c -c the following work arrays are initialized and subsequently -c used repeatedly by spherepack routines. -c - dimension wsha(70928),wshs(70928),wvha(141647),wvhs(141647), - 1 wvts(141647),work(40000) - double precision dwork(lldwork) -c - real lambda,lhat - - lwsha = 70928 - lwshs = 70928 - lwvha = 141647 - lwvhs = 141647 - lwvts = 141647 - lwork = 40000 - ldwork = lldwork - pi = 4.*atan(1.) - hpi = pi/2. - dtr = pi/180. - aa = 6.37122e6 - omega = 7.292e-5 - fzero = omega+omega - uzero = 40. - pzero = 2.94e4 - alphad = 60. - alpha = dtr*alphad -c - itmax = 720 - mprint = 72 - mmode = 42 - nlat = 65 - nlon = 128 - dt = 600. - tdt = dt+dt -c -c initialize spherepack routines -c - call shaesi(nlat,nlon,wsha,lwsha,work,lwork,dwork,lwork,ierror) - if(ierror .ne. 0) write(*,55) ierror - 55 format(' error' i4 ' in shaesi') - call shsesi(nlat,nlon,wshs,lwshs,work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,56) ierror - 56 format(' error' i4 ' in shsesi') - call vhaesi(nlat,nlon,wvha,lwvha,work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,57) ierror - 57 format(' error' i4 ' in vhaesi') - call vhsesi(nlat,nlon,wvhs,lwvhs,work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,58) ierror - 58 format(' error' i4 ' in vhsesi') - call vtsesi(nlat,nlon,wvts,lwvts,work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,59) ierror - 59 format(' error' i4 ' in vtsesi') -c -c -c compute the derivative of the unrotated geopotential -c p as a function of latitude -c - nl = 91 - nlm1 = nl-1 - nlm2 = nl-2 - cfn = 1./nlm1 - dlath = pi/nlm1 - do 10 i=1,nlm2 - theta = i*dlath - sth = sin(theta) - cth = cos(theta) - uhat = ui(uzero,hpi-theta) - phlt(i) = cfn*cth*uhat*(uhat/sth+aa*fzero) - 10 continue -c -c compute sine transform of the derivative of the geopotential -c for the purpose of computing the geopotential by integration -c see equation (3.9) in reference [1] above -c - call sine(nlm2,phlt,work) -c -c compute the cosine coefficients of the unrotated geopotential -c by the formal integration of the sine series representation -c - do 12 i=1,nlm2 - phlt(i) = -phlt(i)/i - 12 continue -c -c phlt(i) contains the coefficients in the cosine series -c representation of the unrotated geopotential that are used -c below to compute the geopotential on the rotated grid. -c -c compute the initial values of east longitudinal -c and latitudinal velocities u and v as well as the -c geopotential p and coriolis f on the rotated grid. -c - ca = cos(alpha) - sa = sin(alpha) - dtheta = pi/(nlat-1) - dlam = (pi+pi)/nlon - do 50 j=1,nlon - lambda = (j-1)*dlam - cl = cos(lambda) - sl = sin(lambda) - do 50 i=1,nlat -c -c lambda is longitude, theta is colatitude, and pi/2-theta is -c latitude on the rotated grid. lhat and that are longitude -c and colatitude on the unrotated grid. see text starting at -c equation (3.10) -c - theta = (i-1)*dtheta - st = cos(theta) - ct = sin(theta) - sth = ca*st+sa*ct*cl - cthclh = ca*ct*cl-sa*st - cthslh = ct*sl - lhat = atanxy(cthclh,cthslh) - clh = cos(lhat) - slh = sin(lhat) - cth = clh*cthclh+slh*cthslh - that = atanxy(sth,cth) - uhat = ui(uzero,hpi-that) - pxact(i,j) = cosine(that,nlm2,phlt) - uxact(i,j) = uhat*(ca*sl*slh+cl*clh) - vxact(i,j) = uhat*(ca*cl*slh*st-clh*sl*st+sa*slh*ct) - f(i,j) = fzero*sth - 50 continue -c - vmax = 0. - pmax = 0. - v2max = 0. - p2max = 0. - do 54 j=1,nlon - do 54 i=1,nlat - v2max = v2max+uxact(i,j)**2+vxact(i,j)**2 - p2max = p2max+pxact(i,j)**2 - vmax = amax1(abs(uxact(i,j)),abs(vxact(i,j)),vmax) - pmax = amax1(abs(pxact(i,j)),pmax) - 54 continue -c -c initialize first time step -c - do 60 j=1,nlon - do 60 i=1,nlat - u(i,j) = uxact(i,j) - v(i,j) = vxact(i,j) - p(i,j) = pxact(i,j) - 60 continue -c - isym = 0 - nt = 1 - time = 0. - ctime = 0. - ncycle = 0 -c -c start of the time loop -c -c begin step 1, section 3 -c -c analyze the velocity components (u,v) -c - 90 call vhaesgo(nlat,nlon,isym,nt,u,v,idp,jdp,br,bi,cr,ci, - 1 mdab,ndab,wvha,lwvha,work,lwork,ierror) - if(ierror .ne. 0) write(*,91) ierror - 91 format(' error' i4 ' in vhaes') -c -c truncate spectrum to eliminate aliasing of the -c product terms in the shallow-water equations -c - call trunc(nlat,mmode,mdab,br,bi) - call trunc(nlat,mmode,mdab,cr,ci) -c -c resynthesize the velocity components -c - call vhsesgo(nlat,nlon,isym,nt,u,v,idp,jdp,br,bi,cr,ci, - 1 mdab,ndab,wvhs,lwvhs,work,lwork,ierror) - if(ierror .ne. 0) write(*,92) ierror - 92 format(' error' i4 ' in vhses') -c -c begin step 2, section 3 -c -c analyze geopotential p -c - call shaes(nlat,nlon,isym,nt,p,idp,jdp,a,b,mdab,ndab, - 1 wsha,lwsha,work,lwork,ierror) - if(ierror .ne. 0) write(*,93) ierror - 93 format(' error' i4 ' in shaes') -c -c truncate spectrum to eliminate aliasing of the -c product terms in the shallow-water equations -c - call trunc(nlat,mmode,mdab,a,b) -c -c resynthesize the geopotential p -c - call shses(nlat,nlon,isym,nt,p,idp,jdp,a,b,mdab,ndab, - 1 wshs,lwshs,work,lwork,ierror) - if(ierror .ne. 0) write(*,94) ierror - 94 format(' error' i4 ' in shses') -c -c -c begin step 3, section 3 -c -c compute the vorticity of the velocity (u,v) -c - call vrtes(nlat,nlon,isym,nt,vort,idp,jdp,cr,ci,mdab,ndab, - 1 wshs,lwshs,work,lwork,ierror) - if(ierror .ne. 0) write(*,95) ierror - 95 format(' error' i4 ' in vrtes') -c -c compute the divergence of the velocity (u,v) -c - call dives(nlat,nlon,isym,nt,divg,idp,jdp,br,bi,mdab,ndab, - 1 wshs,lwshs,work,lwork,ierror) - if(ierror .ne. 0) write(*,96) ierror - 96 format(' error' i4 ' in dives') -c -c begin step 4, section 3 -c -c compute the derivative of the velocity (u,v) with -c respect to colatitude theta. -c - call vtsesgo(nlat,nlon,isym,nt,ut,vt,idp,jdp,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) - if(ierror .ne. 0) write(*,97) ierror - 97 format(' error' i4 ' in vtsesgo') -c -c begin step 5, section 3 -c -c compute the gradient of the geopotential p -c - call gradesgo(nlat,nlon,isym,nt,gpdl,gpdt,idp,jdp,a,b,mdab,ndab, - 1wvhs,lwvhs,work,lwork,ierror) - if(ierror .ne. 0) write(*,98) ierror - 98 format(' error' i4 ' in grades') -c -c compute the time derivatives of the velocity (u,v) -c and the geopotential p using the shallow-water -c equations (2.8), (2.9), and (2.10), section 3. -c - do 200 j=1,nlon - do 200 i=1,nlat - dudt(i,j) = (u(i,j)*(vt(i,j)-divg(i,j))-v(i,j)*ut(i,j) - 1 -gpdl(i,j))/aa+f(i,j)*v(i,j) - dvdt(i,j) = -(u(i,j)*(vort(i,j)+ut(i,j))+v(i,j)*vt(i,j) - 1 +gpdt(i,j))/aa-f(i,j)*u(i,j) - dpdt(i,j) = -((p(i,j)+pzero)*divg(i,j)+v(i,j)*gpdt(i,j) - 1 +u(i,j)*gpdl(i,j))/aa - 200 continue -c - if(mod(ncycle,mprint) .ne. 0) go to 370 - htime = time/3600. - write(*,390) ncycle,htime,dt,nlat,nlon,mmode,omega,pzero, - 1 uzero,alphad - 390 format(//' steady nonlinear rotated flow, test case 3'/ - 1 ' cycle number ' i10 - 2 ' model time in hours ' f10.2/ - 3 ' time step in seconds ' f10.0 - 4 ' number of latitudes ' i10/ - 5 ' number of longitudes ' i10 - 6 ' max wave number ' i10/ - 7 ' rotation rate ' 1pe15.6 - 8 ' mean height ' 1pe15.6/ - 9 ' maximum velocity ' 1pe15.6 - 1 ' tilt angle ' f10.2) - dvgm = 0. - dvmax = 0. - dpmax = 0. - evmax = 0.0 - epmax = 0.0 - do 217 j=1,nlon - do 217 i=1,nlat - dvgm = amax1(dvgm,abs(divg(i,j))) - dvmax = dvmax+(u(i,j)-uxact(i,j))**2+(v(i,j)-vxact(i,j))**2 - dpmax = dpmax+(p(i,j)-pxact(i,j))**2 - evmax = amax1(evmax,abs(v(i,j)-vxact(i,j)),abs(u(i,j)-uxact(i,j))) - epmax = amax1(epmax,abs(p(i,j)-pxact(i,j))) - 217 continue - dvmax = sqrt(dvmax/v2max) - dpmax = sqrt(dpmax/p2max) - evmax = evmax/vmax - epmax = epmax/pmax - write(*,391) evmax,epmax,dvmax,dpmax,dvgm - 391 format(' max error in velocity' 1pe15.6 - + ' max error in geopot. ' 1pe15.6/ - + ' l2 error in velocity ' 1pe15.6 - + ' l2 error in geopot. ' 1pe15.6/ - + ' maximum divergence ' 1pe15.6) -c -c set values at time = -dt to values at time = 0. -c - 370 if(ncycle .gt. 0) go to 206 - do 205 j=1,nlon - do 205 i=1,nlat - uold(i,j) = u(i,j) - vold(i,j) = v(i,j) - pold(i,j) = p(i,j) - 205 continue -c -c compute values at next time level using leap frog -c time differencing -c - 206 do 210 j=1,nlon - do 210 i=1,nlat - unew(i,j) = uold(i,j)+tdt*dudt(i,j) - vnew(i,j) = vold(i,j)+tdt*dvdt(i,j) - pnew(i,j) = pold(i,j)+tdt*dpdt(i,j) - 210 continue -c -c update values to next time level -c - do 300 j=1,nlon - do 300 i=1,nlat - uold(i,j) = u(i,j) - vold(i,j) = v(i,j) - pold(i,j) = p(i,j) - u(i,j) = unew(i,j) - v(i,j) = vnew(i,j) - p(i,j) = pnew(i,j) - 300 continue - ncycle = ncycle+1 - time = time+dt - if(ncycle .le. itmax) go to 90 - end - - subroutine vtsesgo(nlat,nlon,ityp,nt,ut,vt,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) -c -c vtsesgo computes the latitudinal derivatives of the -c velocity components using subroutine vtses which -c assumes the velocity components are given in terms -c of mathematical coordinates -c - dimension ut(idvw,jdvw,1),vt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(*),wvts(*) - call vtses(nlat,nlon,ityp,nt,vt,ut,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) - do k=1,nt - do j=1,nlon - do i=1,nlat - ut(i,j,k) = -ut(i,j,k) - end do - end do - end do - return - end -c - function ui(amp,thetad) -c -c computes the initial unrotated longitudinal velocity -c see section 3.3. -c - pi=4.*atan(1.) - thetab=-pi/6. - thetae= pi/2. - xe=3.e-1 - x =xe*(thetad-thetab)/(thetae-thetab) - ui = 0. - if(x.le.0. .or. x.ge.xe) return - ui=amp*exp(-1./x-1./(xe-x)+4./xe) - return - end -c - function atanxy(x,y) - atanxy = 0. - if(x.eq.0. .and. y.eq.0.) return - atanxy = atan2(y,x) - return - end - subroutine sine(n,x,w) -c -c computes the sine transform -c - dimension x(n),w(n) - arg = 4.*atan(1.)/(n+1) - do 10 j=1,n - w(j) = 0. - do 10 i=1,n - w(j) = w(j)+x(i)*sin(i*j*arg) - 10 continue - do 15 i=1,n - x(i) = 2.*w(i) - 15 continue - return - end -c - function cosine(theta,n,cf) -c -c computes the cosine transform -c - dimension cf(n) - cosine = 0. - do 10 i=1,n - cosine = cosine+cf(i)*cos(i*theta) - 10 continue - return - end -c - subroutine trunc(nm,ms,id,a,b) -c -c truncates spectral coefficients so that aliasing -c does not occur when computing the spectral representations -c of the product terms. -c - dimension a(id,1),b(id,1) - mp = ms+2 - do 10 n=mp,nm - do 10 m=1,n - a(m,n) = 0. - b(m,n) = 0. - 10 continue - return - end - - subroutine vhaesgo(nlat,nlon,ityp,nt,u,v,iduv,jduv, - +br,bi,cr,ci,mdab,ndab,wsav,lwsav,work,lwork,ierror) - dimension u(iduv,jduv,*),v(iduv,jduv,*),br(mdab,ndab,*), - + bi(mdab,ndab,*),cr(mdab,ndab,*),ci(mdab,ndab,*), - 2 work(1),wsav(1) -c -c vhaesgo computes the vector harmonic analysis of (u,v) using vhaes which -c assumes the velocity components are given in mathematical coordinates -c - do k=1,nt - do j=1,nlon - do i=1,nlat - v(i,j,k) = -v(i,j,k) - end do - end do - end do - call vhaes(nlat,nlon,ityp,nt,v,u,iduv,jduv, - +br,bi,cr,ci,mdab,ndab,wsav,lwsav,work,lwork,ierror) -c -c restore v -c - do k=1,nt - do j=1,nlon - do i=1,nlat - v(i,j,k) = -v(i,j,k) - end do - end do - end do - if (ierror.ne.0) return - return - end - - subroutine vhsesgo(nlat,nlon,ityp,nt,u,v,iduv,jduv, - +br,bi,cr,ci,mdab,ndab,wsav,lwsav,work,lwork,ierror) - dimension u(iduv,jduv,*),v(iduv,jduv,*),br(mdab,ndab,*), - + bi(mdab,ndab,*),cr(mdab,ndab,*),ci(mdab,ndab,*), - 2 work(1),wsav(1) -c -c vhsesgo computes a vector harmonic synthesis in (u,v) using vhses which -c assumes the velocity components are given in mathematical coordinates -c - call vhses(nlat,nlon,ityp,nt,v,u,iduv,jduv, - +br,bi,cr,ci,mdab,ndab,wsav,lwsav,work,lwork,ierror) - if (ierror.ne.0) return - do k=1,nt - do j=1,nlon - do i=1,nlat - v(i,j,k) = -v(i,j,k) - end do - end do - end do - return - end - - subroutine gradesgo(nlat,nlon,isym,nt,u,v,iduv,jduv,a,b, - +mdab,ndab,wsav,lwsav,work,lwork,ierror) - dimension u(iduv,jduv,nt),v(iduv,jduv,nt) - dimension a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wsav(lwsav),work(lwork) -c -c gradesgo computes the gradient in (u,v) using grades which assumes -c the velocity components are given in mathematical coordinates -c - call grades(nlat,nlon,isym,nt,v,u,iduv,jduv,a,b, - +mdab,ndab,wsav,lwsav,work,lwork,ierror) - if (ierror .ne.0) return - do k=1,nt - do j=1,nlon - do i=1,nlat - v(i,j,k) = -v(i,j,k) - end do - end do - end do - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shigc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shigc.f deleted file mode 100755 index ce278e81a..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shigc.f +++ /dev/null @@ -1,240 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shigc.f -c -c this file contains code and documentation for subroutine shigc -c -c ... files which must be loaded with shigc.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c 3/6/98 -c -c *** shigc is functionally the same as shagci or shsgci. It -c it included in this version of spherepack because -c older versions of spherepack call shigc to initialize -c the saved work space wshigc, for either shagc or shsgc -c -c subroutine shigc(nlat,nlon,wshigc,lshigc,dwork,ldwork,ierror) -c -c subroutine shigc initializes the array wshigc which can then -c be used repeatedly by subroutines shsgc or shagc. it precomputes -c and stores in wshigc quantities such as gaussian weights, -c legendre polynomial coefficients, and fft trigonometric tables. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c wshigc an array which must be initialized by subroutine shigc. -c once initialized, wshigc can be used repeatedly by shsgc -c or shagc as long as nlat and nlon remain unchanged. wshigc -c must not be altered between calls of shsgc or shagc. -c -c lshigc the dimension of the array wshigc as it appears in the -c program that calls shsgc or shagc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshigc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls shigc. ldwork must be at least -c -c nlat*(nlat+4) -c -c output parameter -c -c wshigc an array which must be initialized before calling shsgc or shagc. -c once initialized, wshigc can be used repeatedly by shsgc or shagc -c as long as nlat and nlon remain unchanged. wshigc must not -c altered between calls of shsgc or shagc -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshigc -c = 4 error in the specification of ldwork -c = 5 failure in gaqd to compute gaussian points -c (due to failure in eigenvalue routine) -c -c -c **************************************************************** - subroutine shigc(nlat,nlon,wshigc,lshigc,dwork,ldwork,ierror) -c this subroutine must be called before calling shsgc/shagc with -c fixed nlat,nlon. it precomputes quantites such as the gaussian -c points and weights, m=0,m=1 legendre polynomials, recursion -c recursion coefficients. - dimension wshigc(lshigc) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+mod(nlat,2))/2 - l1 = l - l2 = late - ierror = 3 -c check permanent work space length - if (lshigc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 4 -c if (lwork.lt.4*nlat*(nlat+2)+2) return - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set pointers - i1 = 1 - i2 = i1+nlat - i3 = i2+nlat*late - i4 = i3+nlat*late - i5 = i4+l*(l-1)/2 +(nlat-l)*(l-1) - i6 = i5+l*(l-1)/2 +(nlat-l)*(l-1) - i7 = i6+l*(l-1)/2 +(nlat-l)*(l-1) -c set indices in temp work for double precision gaussian wts and pts - idth = 1 -c idwts = idth+2*nlat -c iw = idwts+2*nlat - idwts = idth+nlat - iw = idwts+nlat - call shigc1(nlat,nlon,l,late,wshigc(i1),wshigc(i2),wshigc(i3), - 1wshigc(i4),wshigc(i5),wshigc(i6),wshigc(i7),dwork(idth), - 2dwork(idwts),dwork(iw),ierror) - if (ierror.ne.0) ierror = 5 - return - end - subroutine shigc1(nlat,nlon,l,late,wts,p0n,p1n,abel,bbel,cbel, - 1 wfft,dtheta,dwts,work,ier) - dimension wts(nlat),p0n(nlat,late),p1n(nlat,late),abel(1),bbel(1), - 1 cbel(1),wfft(1),dtheta(nlat),dwts(nlat) - double precision pb,dtheta,dwts,work(*) -c compute the nlat gaussian points and weights, the -c m=0,1 legendre polys for gaussian points and all n, -c and the legendre recursion coefficients -c define index function used in storing -c arrays for recursion coefficients (functions of (m,n)) -c the index function indx(m,n) is defined so that -c the pairs (m,n) map to [1,2,...,indx(l-1,l-1)] with no -c "holes" as m varies from 2 to n and n varies from 2 to l-1. -c (m=0,1 are set from p0n,p1n for all n) -c define for 2.le.n.le.l-1 - indx(m,n) = (n-1)*(n-2)/2+m-1 -c define index function for l.le.n.le.nlat - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 -c preset quantites for fourier transform - call hrffti(nlon,wfft) -c compute double precision gaussian points and weights -c lw = 4*nlat*(nlat+1)+2 - lw = nlat*(nlat+2) - call gaqd(nlat,dtheta,dwts,work,lw,ier) - if (ier.ne.0) return -c store gaussian weights single precision to save computation -c in inner loops in analysis - do 100 i=1,nlat - wts(i) = dwts(i) - 100 continue -c initialize p0n,p1n using double precision dnlfk,dnlft - do 101 np1=1,nlat - do 101 i=1,late - p0n(np1,i) = 0.0 - p1n(np1,i) = 0.0 - 101 continue -c compute m=n=0 legendre polynomials for all theta(i) - np1 = 1 - n = 0 - m = 0 - call dnlfk(m,n,work) - do 103 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(1,i) = pb - 103 continue -c compute p0n,p1n for all theta(i) when n.gt.0 - do 104 np1=2,nlat - n = np1-1 - m = 0 - call dnlfk(m,n,work) - do 105 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(np1,i) = pb - 105 continue -c compute m=1 legendre polynomials for all n and theta(i) - m = 1 - call dnlfk(m,n,work) - do 106 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p1n(np1,i) = pb - 106 continue - 104 continue -c compute and store swarztrauber recursion coefficients -c for 2.le.m.le.n and 2.le.n.le.nlat in abel,bbel,cbel - do 107 n=2,nlat - mlim = min0(n,l) - do 107 m=2,mlim - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/ - 1 float(((n+m-1)*(n+m)))) - 107 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shigs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shigs.f deleted file mode 100755 index d9da36f2f..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shigs.f +++ /dev/null @@ -1,304 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shigs.f -c -c this file contains code and documentation for subroutine shigs -c -c ... files which must be loaded with shigs.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c 3/6/98 -c -c *** shigs is functionally the same as shagsi or shsgsi. It -c is included in this version because legacy codes, using -c older versions of spherepack called shigs to initialize -c the saved work space wshigs for either shags or shsgs -c Its arguments are identical to those of shagsi or shsgsi. -c -c **************************************************************** -c -c subroutine shigs(nlat,nlon,wshigs,lshigs,work,lwork,dwork,ldwork, -c + ierror) -c -c subroutine shigs initializes the array wshigs which can then -c be used repeatedly by subroutines shags,shsgs. it precomputes -c and stores in wshigs quantities such as gaussian weights, -c legendre polynomial coefficients, and fft trigonometric tables. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c wshigs an array which must be initialized by subroutine shigs . -c once initialized, wshigs can be used repeatedly by shigs -c as long as nlat and nlon remain unchanged. wshigs must -c not be altered between calls of shigs. -c -c lshigs the dimension of the array wshigs as it appears in the -c program that calls shigs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshigs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c work a real work space which need not be saved -c -c lwork the dimension of the array work as it appears in the -c program that calls shigs. lwork must be at least -c 4*nlat*(nlat+2)+2 in the routine calling shigs -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the length of dwork in the calling routine. ldwork must -c be at least nlat*(nlat+4) -c -c output parameter -c -c wshags an array which must be initialized before calling shags or -c once initialized, wshags can be used repeatedly by shags or -c as long as nlat and nlon remain unchanged. wshags must not -c altered between calls of shasc. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshags -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c = 6 failure in gaqd to compute gaussian points -c (due to failure in eigenvalue routine) -c -c -c **************************************************************** -c - subroutine shigs(nlat,nlon,wshigs,lshigs,work,lwork,dwork, - + ldwork,ierror) -c -c this subroutine must be called before calling shags or shsgs with -c fixed nlat,nlon. it precomputes the gaussian weights, points -c and all necessary legendre polys and stores them in wshigs. -c these quantities must be preserved when calling shsgs or shags -c repeatedly with fixed nlat,nlon. -c - dimension wshigs(lshigs),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+1)/2 - l1 = l - l2 = late -c check permanent work space length - ierror = 3 - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshigs.lt.lp) return - ierror = 4 -c check temporary work space - if (lwork.lt.4*nlat*(nlat+2)+2) return -c check temp double precision space - ierror = 5 - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set preliminary quantites needed to compute and store legendre polys - call shigsp(nlat,nlon,wshigs,lshigs,dwork,ldwork,ierror) - if (ierror.ne.0) return -c set legendre poly pointer in wshigs - ipmnf = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+nlon+16 - call shigss1(nlat,l,late,wshigs,work,wshigs(ipmnf)) - return - end - - subroutine shigss1(nlat,l,late,w,pmn,pmnf) - dimension w(1),pmn(nlat,late,3),pmnf(late,1) -c compute and store legendre polys for i=1,...,late,m=0,...,l-1 -c and n=m,...,l-1 - do i=1,nlat - do j=1,late - do k=1,3 - pmn(i,j,k) = 0.0 - end do - end do - end do - do 100 mp1=1,l - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 -c compute pmn for n=m,...,nlat-1 and i=1,...,(l+1)/2 - mode = 0 - call legin(mode,l,nlat,m,w,pmn,km) -c store above in pmnf - do 101 np1=mp1,nlat - mn = mml1+np1 - do 102 i=1,late - pmnf(i,mn) = pmn(np1,i,km) - 102 continue - 101 continue - 100 continue - return - end - subroutine shigsp(nlat,nlon,wshigs,lshigs,dwork,ldwork,ierror) - dimension wshigs(lshigs) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+mod(nlat,2))/2 - l1 = l - l2 = late - ierror = 3 -c check permanent work space length - if (lshigs .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 4 -c if (lwork.lt.4*nlat*(nlat+2)+2) return - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set pointers - i1 = 1 - i2 = i1+nlat - i3 = i2+nlat*late - i4 = i3+nlat*late - i5 = i4+l*(l-1)/2 +(nlat-l)*(l-1) - i6 = i5+l*(l-1)/2 +(nlat-l)*(l-1) - i7 = i6+l*(l-1)/2 +(nlat-l)*(l-1) -c set indices in temp work for double precision gaussian wts and pts - idth = 1 -c idwts = idth+2*nlat -c iw = idwts+2*nlat - idwts = idth+nlat - iw = idwts+nlat - call shigsp1(nlat,nlon,l,late,wshigs(i1),wshigs(i2),wshigs(i3), - 1wshigs(i4),wshigs(i5),wshigs(i6),wshigs(i7),dwork(idth), - 2dwork(idwts),dwork(iw),ierror) - if (ierror.ne.0) ierror = 5 - return - end - - subroutine shigsp1(nlat,nlon,l,late,wts,p0n,p1n,abel,bbel,cbel, - + wfft,dtheta,dwts,work,ier) - dimension wts(nlat),p0n(nlat,late),p1n(nlat,late),abel(1),bbel(1), - 1 cbel(1),wfft(1),dtheta(nlat),dwts(nlat) - double precision pb,dtheta,dwts,work(*) - indx(m,n) = (n-1)*(n-2)/2+m-1 - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 - call hrffti(nlon,wfft) -c compute double precision gaussian points and weights -c lw = 4*nlat*(nlat+2) - lw = nlat*(nlat+2) - call gaqd(nlat,dtheta,dwts,work,lw,ier) - if (ier.ne.0) return -c store gaussian weights single precision to save computation -c in inner loops in analysis - do 100 i=1,nlat - wts(i) = dwts(i) - 100 continue -c initialize p0n,p1n using double precision dnlfk,dnlft - do 101 np1=1,nlat - do 101 i=1,late - p0n(np1,i) = 0.0 - p1n(np1,i) = 0.0 - 101 continue -c compute m=n=0 legendre polynomials for all theta(i) - np1 = 1 - n = 0 - m = 0 - call dnlfk(m,n,work) - do 103 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(1,i) = pb - 103 continue -c compute p0n,p1n for all theta(i) when n.gt.0 - do 104 np1=2,nlat - n = np1-1 - m = 0 - call dnlfk(m,n,work) - do 105 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(np1,i) = pb - 105 continue -c compute m=1 legendre polynomials for all n and theta(i) - m = 1 - call dnlfk(m,n,work) - do 106 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p1n(np1,i) = pb - 106 continue - 104 continue -c -c compute and store swarztrauber recursion coefficients -c for 2.le.m.le.n and 2.le.n.le.nlat in abel,bbel,cbel - do 107 n=2,nlat - mlim = min0(n,l) - do 107 m=2,mlim - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/ - 1 float(((n+m-1)*(n+m)))) - 107 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shpe.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shpe.f deleted file mode 100755 index 94b901d20..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shpe.f +++ /dev/null @@ -1,2054 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c August 2003 -c -c ... file shpe.f -c -c this file contains code and documentation for subroutines -c shpei and shpe. -c -c ... files which must be loaded with shpe.f -c -c sphcom.f, hrfft.f -c -c subroutine shpei initializes arrays wshp and iwshp for -c subsequent repeated use by subroutine shpe, which -c performs the harmonic projection equivalent to a -c harmonic analysis followed by harmonic synthesis -c but faster and with less memory. (see description of -c subroutine shpe below) -c -c subroutine shpei(nlat,nlon,isym,mtrunc,wshp,lwshp,iwshp, -c 1 liwshp,work,lwork,ierror) -c -c shpei initializes arrays wshp and iwshp for repeated use -c by subroutine shpe .... -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c nlon must beat least 4. -c -c isym currently not used. -c -c mtrunc the highest longitudinal wave number retained in the -c projection. It must be less than or equal to -c the minimum of nlat-1 and nlon/2. The first wave -c number is zero. For example, if wave numbers 0 and -c 1 are desired then mtrunc = 1. -c -c lwshp the dimension of the array wshp as it appears in the -c program that calls shpei. It must be at least -c 2*(nlat+1)**2+nlon+log2(nlon) -c -c liwshp the dimension of the array iwshp as it appears in the -c program that calls shpei. It must be at least -c 4*(nlat+1). -c -c lwork the dimension of the array work as it appears in the -c program that calls shpei. It must be at least -c 1.25*(nlat+1)**2+7*nlat+8. -c -c ************************************************************** -c -c output parameters -c -c wshp a single precision array that must be saved for -c repeated use by subroutine shpe. -c -c iwshp an integer array that must be saved for repeated -c use by subroutine shpe. -c -c work a double precision work array that does -c not have to be saved. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of mtrunc -c = 5 error in the specification of lwshp -c = 6 error in the specification of liwshp -c = 7 error in the specification of lwork -c - subroutine shpei(nlat,nlon,isym,mtrunc,wshp,lwshp,iwshp, - 1 liwshp,work,lwork,ierror) - double precision work(*) - dimension wshp(*),iwshp(*) -c - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return -c ierror = 3 -c if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - mmax = min(nlat-1,nlon/2) - if(mtrunc.lt.0 .or. mtrunc.gt.mmax) return - ierror = 5 - lw1 = 2*(nlat+1)**2 - log2n = log(float(nlon))/log(2.0) - if(lwshp.lt.lw1+nlon+log2n) return - ierror = 6 - if(liwshp.lt.4*(nlat+1)) return - ierror = 7 - mlwk = 1.25*(nlat+1)**2+7*nlat+8 - if(lwork.lt.mlwk) return - ierror = 0 -c - call hrffti(nlon,wshp(lw1+1)) -c - nte = (nlat+1)/2 - nloc1 = 2*nte*nte - nloc2 = nlat+1 - iw1 = 1 - iw2 = iw1+nloc1 - iw3 = iw2+nloc1 - iw4 = iw3+nloc1 - jw1 = 1 - jw2 = jw1+nloc2 - jw3 = jw2+nloc2 - jw4 = jw3+nloc2 - kw1 = 1 - kw2 = kw1+nte - kw3 = kw2+nte - kw4 = kw3+nte - kw5 = kw4+nte+1 - kw6 = kw5+nte - kw7 = kw6+nte - kw8 = kw7+nte - kw9 = kw8+nte - kw10 = kw9+nloc2+nloc2 - kw11 = kw10+nloc2 - - kw12 = kw11+nloc1 - kw13 = kw12+nloc1 -c - call shpei1(nlat,nlon,isym,mtrunc,nte,ierror,wshp(iw1),wshp(iw2), - 1 wshp(iw3),wshp(iw4),iwshp(jw1),iwshp(jw2),iwshp(jw3), - 2 iwshp(jw4),work(kw1),work(kw2),work(kw3),work(kw4),work(kw5), - 3 work(kw6),work(kw7),work(kw8),work(kw9),work(kw10),work(kw11), - 4 work(kw12),work(kw11),work(kw12),work(kw13)) - return - end - subroutine shpei1(nlat,nlon,isym,mtrunc,idp,ierror, - 1 pe,po,ze,zo,ipse,jzse,ipso,jzso, - 2 cp,work,wx,s,e,thet,xx,z,a,b,we,ped,wo,pod,u) -c - double precision sum,eps,pi,dthet,v,a1,b1,c1 - parameter (eps=5.0d-8) - double precision cp(idp),work(idp),wx(idp),s(idp+1), - 1 e(idp),thet(idp),xx(idp),z(idp),u(idp,idp), - 3 we(idp,idp,2),ped(idp,idp,2),a(4*idp),b(2*idp), - 4 wo(idp,idp,2),pod(idp,idp,2) -c - dimension pe(idp,idp,2),po(idp,idp,2),ze(idp,idp,2), - 1 zo(idp,idp,2), - 2 ipse(idp,2),jzse(idp,2),ipso(idp,2),jzso(idp,2), - 3 nshe(2),nsho(2) -c - ns2 = nlat/2 - modn = nlat-ns2-ns2 - nte = (nlat+1)/2 - nto = nlat-nte - tusl = 0. - toe = 0. -c -c compute grid distribution -c - pi = 4.d0*datan(1.0d0) - dthet = pi/(nlat-1) - do i=1,nte - thet(i) = (i-1)*dthet - end do -c -c compute weight matrices for even functions -c - do 40 mp1=1,2 - m = mp1-1 - mrank = nlat-m-m - nem = (mrank+1)/2 - do j=1,nem - n = j+j+m-2 - call dlfkp(m,n,cp) - do i=1,nte - call dlftp (m,n,thet(i),cp,ped(i,j,mp1)) - end do - if(m.gt.0) ped(1,j,mp1) = 0.0d0 - end do - call dsvdc(ped(m+1,1,mp1),idp,nem,nem,s,e,u, - 1 idp,v,idp,work,10,info) -c - do j=1,nem - s(j) = 1.0d0/(s(j)*s(j)) - end do -c -c compute weight matrix as u s sup -2 u transpose -c - do j=1,nte - do i=1,nte - we(i,j,mp1) = 0.0d0 - end do - end do - do i=1,nem - do j=1,nem - sum = 0. - do k=1,nem - sum = sum+s(k)*u(i,k)*u(j,k) - end do - we(i+m,j+m,mp1) = sum - end do - end do - 40 continue - we(1,1,2) = 1.0d0 -c -c compute n**2 basis (even functions) -c - do n=1,nlat+nlat-2 - dfn = n - a(n) = dsqrt(dfn*(dfn+1.0d0)) - end do - do n=1,nlat-1 - dfn = n - b(n) = dsqrt((dfn+dfn+3.0d0)/(dfn+dfn-1.0d0)) - end do -c - mxtr = min(nlat-1,nlon/2,mtrunc) - ip = 2 - do 200 mp1=1,mxtr+1 - m = mp1-1 - ip = 3-ip - ms2 = mp1/2 - nrank = ms2+ms2 - mrank = nlat-nrank - nem = (mrank+1)/2 -c -c compute associated legendre functions -c - if(m.le.1) then - do 205 j=1,nem - n = j+j+m-2 - call dlfkp(m,n,cp) - do i=1,nte - call dlftp (m,n,thet(i),cp,ped(i,j+ms2,ip)) - end do - 202 if(m.gt.0) ped(1,j+ms2,ip) = 0.0d0 - 205 continue -c - else -c - do 207 j=1,nem - n = j+j+m-2 - if(m.gt.1.and.n.gt.mxtr) then - do i=1,nte - u(i,j+ms2) = ped(i,j+ms2,ip) - end do - go to 207 - end if - a1 = b(n-1)*a(n+m-3)/a(n+m-1) - b1 = a(n-m+1)/a(n+m-1) - if(n-m.le.1) then - do i=1,nte - u(i,j+ms2) = a1*ped(i,j+ms2-1,ip) - 1 - b1*ped(i,j+ms2,ip) - end do - else - c1 = b(n-1)*a(n-m-1)/a(n+m-1) - do i=1,nte - u(i,j+ms2) = a1*ped(i,j+ms2-1,ip) - 1 - b1*ped(i,j+ms2,ip) + c1*u(i,j+ms2-1) - end do - end if - 207 continue - do j=1,nem - do i=1,nte - ped(i,j+ms2,ip) = u(i,j+ms2) - end do - end do - end if -c - if(ms2.le.0.or.ms2.ge.nte) go to 200 -c -c initialize array with random numbers using -c Fortran90 intrinsics RANDOM_{SEED, NUMBER} -c -c old code commented out -c do i=1,nte -c xx(i) = rand() -c end do -c -c replacement code -c - CALL RANDOM_SEED() - CALL RANDOM_NUMBER(xx(1:nte)) - it = 0 - 201 do i=1,nte - z(i) = 0.0d0 - wx(i) = 0.0d0 - do j=1,nte - wx(i) = wx(i)+we(i,j,ip)*xx(j) - end do - end do - do 220 j=1,nte - if(j.eq.ms2) go to 220 - call gs(nte,wx,ped(1,j,ip),z) - 220 continue -c - do i=1,nte - xx(i) = xx(i)-z(i) - end do - call normal(nte,xx,idp,we(1,1,ip)) - it = it+1 - if(it.le.2) go to 201 - do i=1,nte - ped(i,ms2,ip) = xx(i) - end do - 200 continue -c -c reorder if mtrunc is less than nlat-1 -c case of even functions -c - if(modn.eq.0) then - nshe(1) = (nlat-mtrunc-1)/2 - nshe(2) = (nlat-mtrunc-2)/2 - else - nshe(1) = (nlat-mtrunc)/2 - nshe(2) = (nlat-mtrunc-1)/2 - end if -c - do 210 mp1=1,2 - do j=1,nte - js = j+nshe(mp1) - if(js.gt.nte) js = js-nte - do i=1,nte - u(i,js) = ped(i,j,mp1) - end do - end do - do j=1,nte - do i=1,nte - ped(i,j,mp1) = u(i,j) - end do - end do - 210 continue -c - call trunc(0,nte,idp,ped(1,1,1),nte,ipse(1,1)) - call trunc(0,nte,idp,ped(1,1,2),nte,ipse(1,2)) -c -c compute the analysis matrices -c - do 250 ip=1,2 - do i=1,nte - lock = 0 - do j=1,nte - sum = 0.0d0 - do k=1,nte - sum = sum+ped(k,i,ip)*we(k,j,ip) - end do - pe(i,j,ip) = ped(i,j,ip) - ze(j,i,ip) = sum - if(dabs(sum).gt.eps .and. lock.eq.0) then - lock = 1 - jzse(i,ip) = j - end if - end do - end do - 250 continue -c -c compute weight matrices for odd functions -c - do 50 mp1=1,2 - m = mp1-1 - mrank = nlat-m-m - nem = (mrank+1)/2 - nom = mrank-nem - do j=1,nom - n = j+j+m-1 - call dlfkp(m,n,cp) - do i=1,nte - call dlftp (m,n,thet(i),cp,pod(i,j,mp1)) - end do - if(modn.eq.1) pod(nte,j,mp1) = 0.0d0 - end do - call dsvdc(pod(m+1,1,mp1),idp,nom,nom,s,e,u, - 1 idp,v,idp,work,10,info) -c - do j=1,nom - s(j) = 1.0d0/(s(j)*s(j)) - end do -c -c compute weight matrix as u s sup -2 u transpose -c - do j=1,nte - do i=1,nte - wo(i,j,mp1) = 0.0d0 - end do - end do - do i=1,nom - do j=1,nom - sum = 0. - do k=1,nom - sum = sum+s(k)*u(i,k)*u(j,k) - end do - wo(i+m,j+m,mp1) = sum - end do - end do - 50 continue - wo(1,1,2) = 1.0d0 - if(modn.eq.1) then - wo(nte,nte,1) = 1.0d0 - wo(nte,nte,2) = 1.0d0 - end if -c -c compute n**2 basis (odd functions) -c - ip = 2 - do 300 mp1=1,mxtr+1 - ip = 3-ip - m = mp1-1 - ms2 = mp1/2 - nrank = ms2+ms2 - mrank = nlat-nrank - nem = (mrank+1)/2 - nom = mrank-nem -c -c compute associated legendre functions -c - if(m.le.1) then - do 305 j=1,nom - n = j+j+m-1 - call dlfkp(m,n,cp) - do i=1,nte - call dlftp (m,n,thet(i),cp,pod(i,j+ms2,ip)) - end do - 302 if(modn.eq.1) pod(nte,j+ms2,ip) = 0.0d0 - if(m.gt.0) pod(1,j+ms2,ip) = 0.0d0 - 305 continue -c - else -c - do 307 j=1,nom - n = j+j+m-1 - if(m.gt.1.and.n.gt.mxtr) then - do i=1,nte - u(i,j+ms2) = pod(i,j+ms2,ip) - end do - go to 304 - end if - a1 = b(n-1)*a(n+m-3)/a(n+m-1) - b1 = a(n-m+1)/a(n+m-1) - if(n-m.le.1) then - do i=1,nte - u(i,j+ms2) = a1*pod(i,j+ms2-1,ip) - 1 - b1*pod(i,j+ms2,ip) - end do - else - c1 = b(n-1)*a(n-m-1)/a(n+m-1) - do i=1,nte - u(i,j+ms2) = a1*pod(i,j+ms2-1,ip) - 1 - b1*pod(i,j+ms2,ip) + c1*u(i,j+ms2-1) - end do - end if - 304 if(modn.eq.1) u(nte,j+ms2) = 0.0d0 - 307 continue - do j=1,nom - do i=1,nte - pod(i,j+ms2,ip) = u(i,j+ms2) - end do - end do - end if -c - if(ms2.le.0.or.ms2.ge.nto) go to 300 -c -c initialize array with random numbers using -c Fortran90 intrinsics RANDOM_{SEED, NUMBER} -c -c old code commented out -c -c do i=1,nte -c xx(i) = rand() -c end do -c replacement code -c - CALL RANDOM_NUMBER(xx(1:nte)) - if(modn.eq.1) xx(nte) = 0.0d0 - it = 0 - 306 do i=1,nte - z(i) = 0. - wx(i) = 0. - do j=1,nto - wx(i) = wx(i)+wo(i,j,ip)*xx(j) - end do - end do - do 330 j=1,nto - if(j.eq.ms2) go to 330 - call gs(nte,wx,pod(1,j,ip),z(1)) - 330 continue -c - do i=1,nte - xx(i) = xx(i)-z(i) - end do - call normal(nte,xx,idp,wo(1,1,ip)) - it = it+1 - if(it.le.2) go to 306 - do i=1,nte - pod(i,ms2,ip) = xx(i) - end do - if(modn.eq.1) pod(nte,ms2,ip) = 0.0d0 - 300 continue -c -c reorder if mtrunc is less than nlat-1 -c case of odd functions -c - if(modn.eq.0) then - nsho(1) = (nlat-mtrunc)/2 - nsho(2) = (nlat-mtrunc-1)/2 - else - nsho(1) = (nlat-mtrunc-1)/2 - nsho(2) = (nlat-mtrunc-2)/2 - end if -c - do 310 mp1=1,2 - do j=1,nto - js = j+nsho(mp1) - if(js.gt.nto) js = js-nto - do i=1,nte - u(i,js) = pod(i,j,mp1) - end do - end do - do j=1,nto - do i=1,nte - pod(i,j,mp1) = u(i,j) - end do - end do - 310 continue -c - call trunc(0,nte,idp,pod(1,1,1),nto,ipso(1,1)) - call trunc(0,nte,idp,pod(1,1,2),nto,ipso(1,2)) -c -c compute the analysis matrices (odd functions) -c - do ip=1,2 - do i=1,nto - lock = 0 - do j=1,nto - sum = 0.0d0 - do k=1,nte - sum = sum+pod(k,i,ip)*wo(k,j,ip) - end do - po(i,j,ip) = pod(i,j,ip) - zo(j,i,ip) = sum - if(dabs(sum).gt.eps .and. lock.eq.0) then - lock = 1 - jzso(i,ip) = j - end if - end do - end do - end do - return - end -c -c -c ... file shpe.f -c -c ... files which must be loaded with shpe.f -c -c sphcom.f, hrfft.f -c -c the n**2 projection with complement, odd/even -c factorization and zero truncation on an -c equally spaced grid as defined in the JCP paper -c "Generalized discrete spherical harmonic transforms" -c by Paul N. Swarztrauber and William F. Spotz -c It is equivalent to a harmonic analysis followed -c by a synthesis except faster and requires less memory. -c -c subroutine shpe(nlat,nlon,isym,mtrunc,x,y,idxy, -c 1 wshp,lwshp,iwshp,liwshp,work,lwork,ierror) -c -c shpe projects the array x onto the set of functions represented -c by a discrete set of spherical harmonics. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c nlon must beat least 4. -c -c isym currently not used. -c -c mtrunc the highest longitudinal wave number retained in the -c projection. It must be less than or equal to -c the minimum of nlat-1 and nlon/2. The first wave -c number is zero. For example, if wave numbers 0 and -c 1 are desired then mtrunc = 1. - -c zero. -c -c x a two dimensional array that contains the the nlat -c by nlon array x(i,j) defined at the colatitude point -c theta(i) = (i-1)*pi/(nlat-1) and longitude point phi(j) = -c (j-1)*2*pi/nlon. -c -c idxy the first dimension of the arrays x and y as they -c appear in the program that calls shpe. It must be -c at least nlat. -c -c wshp a single precision array that must be saved for -c repeated use by subroutine shpe. -c -c lwshp the dimension of the array wshp as it appears in the -c program that calls shpei. It must be at least -c 2*(nlat+1)**2+nlon+log2(nlon) -c -c iwshp an integer array that must be saved for repeated -c use by subroutine shpe. -c -c -c liwshp the dimension of the array iwshp as it appears in the -c program that calls shpei. It must be at least -c 4*(nlat+1). -c -c work a single precision work array that does -c not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shpe. It must be at least -c max(nlat*nlon,4*(nlat+1)). -c -c ************************************************************** -c -c output parameters -c -c y an nlat by nlon single precision array that contains -c the projection of x onto the set of functions that -c can be represented by the discrete set of spherical -c harmonics. The arrays x(i,j) and y(i,j) are located -c at colatitude point theta(i) = (i-1)*pi/(nlat-1) and -c longitude point phi(j) = (j-1)*2*pi/nlon. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of mtrunc -c = 5 error in the specification of lwshp -c = 6 error in the specification of liwshp -c = 7 error in the specification of lwork -c - subroutine shpe(nlat,nlon,isym,mtrunc,x,y,idxy, - 1 wshp,lwshp,iwshp,liwshp,work,lwork,ierror) -c - dimension wshp(*),iwshp(*),work(*),x(idxy,nlon),y(idxy,nlon) -c - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return -c ierror = 3 -c if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - mmax = min(nlat-1,nlon/2) - if(mtrunc.lt.0 .or. mtrunc.gt.mmax) return - ierror = 5 - log2n = log(float(nlon))/log(2.0) - lw1 = 2*(nlat+1)**2 - if(lwshp.lt.lw1+nlon+log2n) return - ierror = 6 - if(liwshp.lt.4*(nlat+1)) return - ierror = 7 - mwrk = max(nlat*nlon,4*(nlat+1)) - if(lwork.lt.mwrk) return - ierror = 0 -c - do j=1,nlon - do i=1,nlat - y(i,j) = x(i,j) - end do - end do - call hrfftf(nlat,nlon,y,idxy,wshp(lw1+1),work) -c - nte = (nlat+1)/2 - nloc1 = 2*nte*nte - nloc2 = nlat+1 - iw1 = 1 - iw2 = iw1+nloc1 - iw3 = iw2+nloc1 - iw4 = iw3+nloc1 - jw1 = 1 - jw2 = jw1+nloc2 - jw3 = jw2+nloc2 - jw4 = jw3+nloc2 -c - call shpe1(nlat,nlon,isym,mtrunc,y,y,idxy,ierror, - 1 nte,wshp(iw1),wshp(iw2),wshp(iw3),wshp(iw4),iwshp(jw1), - 2 iwshp(jw2),iwshp(jw3),iwshp(jw4),work(jw1), - 3 work(jw2),work(jw3),work(jw4)) -c - call hrfftb(nlat,nlon,y,idxy,wshp(lw1+1),work) -c - sn = 1.0/nlon - do j=1,nlon - do i=1,nlat - y(i,j) = sn*y(i,j) - end do - end do - return - end - subroutine shpe1(nlat,nlon,isym,mtrunc,sx,sy,idxy,ierror, - 1 idp,pe,po,ze,zo,ipse,jzse,ipso,jzso,xe,xo,ye,yo) -c - dimension sx(idxy,nlon),sy(idxy,nlon),nshe(2),nsho(2), - 1 pe(idp,idp,2),po(idp,idp,2),ze(idp,idp,2),zo(idp,idp,2), - 2 ipse(idp,2),jzse(idp,2),ipso(idp,2),jzso(idp,2), - 3 xe(idp,2),xo(idp,2),ye(idp,2),yo(idp,2) -c - ns2 = nlat/2 - modn = nlat-ns2-ns2 - nte = (nlat+1)/2 - nto = nlat-nte -c - if(modn.eq.0) then - nshe(1) = (nlat-mtrunc-1)/2 - nshe(2) = (nlat-mtrunc-2)/2 - nsho(1) = (nlat-mtrunc)/2 - nsho(2) = (nlat-mtrunc-1)/2 - else - nshe(1) = (nlat-mtrunc)/2 - nshe(2) = (nlat-mtrunc-1)/2 - nsho(1) = (nlat-mtrunc-1)/2 - nsho(2) = (nlat-mtrunc-2)/2 - end if - mxtr = min(nlat-1,nlon/2,mtrunc) - ip = 2 - do 100 mp1=1,mxtr+1 - ip = 3-ip - if(mxtr.eq.nlat-1.and.mp1.le.2) then - do i=1,nlat - sy(i,mp1) = sx(i,mp1) - end do - if(mp1.eq.2) then - sy(1,2) = 0. - sy(nlat,2) = 0. - end if - if(nlon.ge.3) then - sy(1,3) = 0. - sy(nlat,3) = 0. - do i=2,nlat-1 - sy(i,3) = sx(i,3) - end do - end if - go to 100 - end if - m = mp1-1 - mpm = max(1,m+m) - ms2 = mp1/2 - mrank = min(nlat-m,nlat-ms2-ms2) -c mrank = mxtr+1-ms2-ms2 - nrank = nlat-mrank - nem = (mrank+1)/2-nshe(ip) - nom = mrank-(mrank+1)/2-nsho(ip) - nec = nte-nem - noc = nto-nom -c - do i=1,nte - xe(i,1) = .5*(sx(i,mpm)+sx(nlat+1-i,mpm)) - xo(i,1) = .5*(sx(i,mpm)-sx(nlat+1-i,mpm)) - end do - if(mpm.lt.nlon) then - do i=1,nte - xe(i,2) = .5*(sx(i,mpm+1)+sx(nlat+1-i,mpm+1)) - xo(i,2) = .5*(sx(i,mpm+1)-sx(nlat+1-i,mpm+1)) - end do - end if - if(3*nec.lt.2*nem.or.nem.eq.0) then - call tmxmx(nte,nec,idp,pe(1,1,ip),nte,idp, - 1 ze(1,1,ip),xe,ye,ipse(1,ip),jzse(1,ip)) - do i=1,nte - ye(i,1) = xe(i,1)-ye(i,1) - end do - if(mpm.lt.nlon.and.m.ne.0) then - do i=1,nte - ye(i,2) = xe(i,2)-ye(i,2) - end do - end if - else - call tmxmx(nte,nem,idp,pe(1,nec+1,ip),nte,idp, - 1ze(1,nec+1,ip),xe,ye,ipse(nec+1,ip),jzse(nec+1,ip)) - end if - if(3*noc.lt.2*nom.or.nom.eq.0) then - call tmxmx(nto,noc,idp,po(1,1,ip),nto,idp, - 1 zo(1,1,ip),xo,yo,ipso(1,ip),jzso(1,ip)) - do i=1,nte - yo(i,1) = xo(i,1)-yo(i,1) - end do - if(mpm.lt.nlon.and.m.ne.0) then - do i=1,nte - yo(i,2) = xo(i,2)-yo(i,2) - end do - end if - else - call tmxmx(nto,nom,idp,po(1,noc+1,ip),nto,idp, - 1zo(1,noc+1,ip),xo,yo,ipso(noc+1,ip),jzso(noc+1,ip)) - end if - do i=1,nte - sy(i,mpm) = ye(i,1)+yo(i,1) - sy(nlat+1-i,mpm) = ye(i,1)-yo(i,1) - end do - if(mpm.lt.nlon.and.m.ne.0) then - do i=1,nte - sy(i,mpm+1) = ye(i,2)+yo(i,2) - sy(nlat+1-i,mpm+1) = ye(i,2)-yo(i,2) - end do - end if - 100 continue - js = mxtr+mxtr+2 - do j=js,nlon - do i=1,nlat - sy(i,j) = 0. - end do - end do - return - end - subroutine mxm(lr,lc,ld,a,mc,md,b,nd,c) - double precision a(ld,*),b(md,*),c(nd,*) - do i=1,lr - do j=1,mc - c(i,j) = 0. - do k=1,lc - c(i,j) = c(i,j)+a(i,k)*b(k,j) - end do - end do - end do - return - end - subroutine smxm(lr,lc,ld,a,mc,md,b,nd,c) - dimension a(ld,*),b(md,*),c(nd,*) - do i=1,lr - do j=1,mc - c(i,j) = 0. - do k=1,lc - c(i,j) = c(i,j)+a(i,k)*b(k,j) - end do - end do - end do - return - end - subroutine mxmx(lr,lc,ld,a,mc,md,b,x,y) - dimension a(ld,*),b(md,*),x(ld,2),y(ld,2) - do k=1,lr - y(k,1) = 0. - y(k,2) = 0. - end do -c - if(lc.le.0) return - do i=1,lc - sum1 = 0. - sum2 = 0. - do j=1,mc - sum1 = sum1 + b(i,j)*x(j,1) - sum2 = sum2 + b(i,j)*x(j,2) - end do - do k=1,lr - y(k,1) = y(k,1)+sum1*a(k,i) - y(k,2) = y(k,2)+sum2*a(k,i) - end do - end do - return - end - subroutine dmxmx(lr,lc,ld,a,mc,md,b,x,y) - double precision a(ld,*),b(md,*),x(ld,2),y(ld,2), - 1 sum1,sum2 - do k=1,lr - y(k,1) = 0. - y(k,2) = 0. - end do -c - if(lc.le.0) return - do i=1,lc - sum1 = 0. - sum2 = 0. - do j=1,mc - sum1 = sum1 + b(i,j)*x(j,1) - sum2 = sum2 + b(i,j)*x(j,2) - end do - do k=1,lr - y(k,1) = y(k,1)+sum1*a(k,i) - y(k,2) = y(k,2)+sum2*a(k,i) - end do - end do - return - end - subroutine tmxmx(lr,lc,ld,a,mc,md,b,x,y,is,js) - dimension a(ld,*),b(md,*),x(ld,2),y(ld,2), - 1 is(*),js(*) -c - kmx = min(lr+1,ld) - do k=1,kmx - y(k,1) = 0. - y(k,2) = 0. - end do - if(lc.le.0) return -c - do i=1,lc - sum1 = 0. - sum2 = 0. - do j=js(i),mc - sum1 = sum1 + b(j,i)*x(j,1) - sum2 = sum2 + b(j,i)*x(j,2) - end do - do k=is(i),lr - y(k,1) = y(k,1)+sum1*a(k,i) - y(k,2) = y(k,2)+sum2*a(k,i) - end do - end do - return - end - subroutine trunc(irc,n,idp,a,nrc,ijs) - double precision a,eps - parameter (eps=5.d-8) - dimension a(idp,*),ijs(n) -c -c irc = 0 for columns , or irc = 1 for rows -c - if(irc.ne.0) go to 30 - do 20 j=1,nrc - do i=1,n - ijs(j) = i - if(dabs(a(i,j)) .gt. eps) go to 20 - end do - 20 continue - return - 30 do 50 i=1,nrc - do j=1,n - ijs(i) = j - if(abs(a(i,j)) .gt. eps) go to 50 - end do - 50 continue - return - end - subroutine gs(n,x,y,z) - dimension x(n),y(n),z(n) - double precision x,y,z,sum -c -c accumulate innerproducts of x with respect to y. -c - sum = 0. - do i=1,n - sum = sum+x(i)*y(i) - end do - do i=1,n - z(i) = z(i)+sum*y(i) - end do - return - end - subroutine normal(n,x,id,q) - dimension x(n),q(id,n) - double precision x,q,sum,sqs -c -c normalize x -c - sqs = 0. - do i=1,n - sum = 0. - do j=1,n - sum = sum+q(i,j)*x(j) - end do - sqs = sqs+sum*x(i) - end do -c - sqs = dsqrt(sqs) - do i=1,n - x(i) = x(i)/sqs - end do - return - end - subroutine coe(moe,n,x,dmax) - double precision x(n),dmax - nh = (n+1)/2 - dmax = 0. - if(moe.ne.0) go to 1 - do i=1,nh - dmax = max(dmax,dabs(x(i)-x(n-i+1))) - x(i) = .5*(x(i)+x(n-i+1)) - x(n-i+1) = x(i) - end do - return - 1 do i=1,nh - dmax = max(dmax,dabs(x(i)+x(n-i+1))) - x(i) = .5*(x(i)-x(n-i+1)) - x(n-i+1) = -x(i) - end do - if(mod(n,2).ne.0) x(nh) = 0. - return - end -c subroutine dlfkp(m,n,cp) -c -c subroutine dlfkp computes the coefficients in the trigonometric -c expansion of the normalized associated legendre functions: -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c where theta is colatitude. -c -c subroutine dlfkp computes the coefficients cp(k) in the -c following trigonometric expansion of pbar(m,n,theta). -c -c 1) for n even and m even, pbar(m,n,theta) = -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k)*cos(2*k*th) -c -c 2) for n even and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*th) -c -c 3) for n odd and m even, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*th) -c -c 4) for n odd and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*th) -c -c input parameters -c -c m is the order of pbar(n,m,theta). m can be any integer -c however pbar(n,m,theta) = 0 if abs(m) is greater than -c n and pbar(n,m,theta) = (-1)**m*pbar(n,-m,theta) for -c negative m. -c -c n nonnegative integer specifying the degree of -c pbar(n,m,theta) -c -c output parameters -c -c cp a double precision array that contains the fourier -c coefficients for pbar(m,n,theta). the length of the -c array depends on the parity of m and n -c -c parity length of cp -c -c n even m even n/2+1 -c n even m odd n/2 -c n odd m even (n+1)/2 -c n odd m odd (n+1)/2 -c -c -c **************************************************************** - subroutine dlfkp (m,n,cp) -c - double precision cp,fnum,fden,fnmh,a1,b1,c1,cp2,fnnp1,fnmsq,fk, - 1 t1,t2,pm1,sc10,sc20,sc40 - dimension cp(1) - parameter (sc10=1024.d0) - parameter (sc20=sc10*sc10) - parameter (sc40=sc20*sc20) -c - cp(1) = 0. - ma = iabs(m) - if(ma .gt. n) return - if(n-1) 2,3,5 - 2 cp(1) = dsqrt(2.d0) - return - 3 if(ma .ne. 0) go to 4 - cp(1) = dsqrt(1.5d0) - return - 4 cp(1) = dsqrt(.75d0) - if(m .eq. -1) cp(1) = -cp(1) - return - 5 if(mod(n+ma,2) .ne. 0) go to 10 - nmms2 = (n-ma)/2 - fnum = n+ma+1 - fnmh = n-ma+1 - pm1 = 1.d0 - go to 15 - 10 nmms2 = (n-ma-1)/2 - fnum = n+ma+2 - fnmh = n-ma+2 - pm1 = -1.d0 -c t1 = 1. -c t1 = 2.d0**(n-1) -c t1 = 1.d0/t1 - 15 t1 = 1.d0/sc20 - nex = 20 - fden = 2.d0 - if(nmms2 .lt. 1) go to 20 - do 18 i=1,nmms2 - t1 = fnum*t1/fden - if(t1 .gt. sc20) then - t1 = t1/sc40 - nex = nex+40 - end if - fnum = fnum+2. - fden = fden+2. - 18 continue - 20 t1 = t1/2.d0**(n-1-nex) - if(mod(ma/2,2) .ne. 0) t1 = -t1 - t2 = 1. - if(ma .eq. 0) go to 26 - do 25 i=1,ma - t2 = fnmh*t2/(fnmh+pm1) - fnmh = fnmh+2. - 25 continue - 26 cp2 = t1*dsqrt((n+.5d0)*t2) - fnnp1 = n*(n+1) - fnmsq = fnnp1-2.d0*ma*ma - l = (n+1)/2 - if(mod(n,2) .eq. 0 .and. mod(ma,2) .eq. 0) l = l+1 - cp(l) = cp2 - if(m .ge. 0) go to 29 - if(mod(ma,2) .ne. 0) cp(l) = -cp(l) - 29 if(l .le. 1) return - fk = n - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = 2.*(fk*fk-fnmsq) - cp(l-1) = b1*cp(l)/a1 - 30 l = l-1 - if(l .le. 1) return - fk = fk-2. - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = -2.*(fk*fk-fnmsq) - c1 = (fk+1.)*(fk+2.)-fnnp1 - cp(l-1) = -(b1*cp(l)+c1*cp(l+1))/a1 - go to 30 - end - subroutine dlftp (m,n,theta,cp,pb) - dimension cp(1) - double precision cp,pb,theta,cdt,sdt,cth,sth,chh - cdt = dcos(theta+theta) - sdt = dsin(theta+theta) - nmod=mod(n,2) - mmod=mod(abs(m),2) - if(nmod)1,1,2 -1 if(mmod)3,3,4 -c -c n even, m even -c -3 kdo=n/2 - pb = .5*cp(1) - if(n .eq. 0) return - cth = cdt - sth = sdt - do 170 k=1,kdo -c pb = pb+cp(k+1)*dcos(2*k*theta) - pb = pb+cp(k+1)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 170 continue - return -c -c n even, m odd -c - 4 kdo = n/2 - pb = 0. - cth = cdt - sth = sdt - do 180 k=1,kdo -c pb = pb+cp(k)*dsin(2*k*theta) - pb = pb+cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 180 continue - return -2 if(mmod)13,13,14 -c -c n odd, m even -c -13 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 190 k=1,kdo -c pb = pb+cp(k)*dcos((2*k-1)*theta) - pb = pb+cp(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 190 continue - return -c -c n odd, m odd -c - 14 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 200 k=1,kdo -c pb = pb+cp(k)*dsin((2*k-1)*theta) - pb = pb+cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 200 continue - return - end -c - subroutine dsvdc(x,ldx,n,p,s,e,u,ldu,v,ldv,work,job,info) - integer ldx,n,p,ldu,ldv,job,info - double precision x(ldx,1),s(1),e(1),u(ldu,1),v(ldv,1),work(1) -c -c -c dsvdc is a subroutine to reduce a double precision nxp matrix x -c by orthogonal transformations u and v to diagonal form. the -c diagonal elements s(i) are the singular values of x. the -c columns of u are the corresponding left singular vectors, -c and the columns of v the right singular vectors. -c -c on entry -c -c x double precision(ldx,p), where ldx.ge.n. -c x contains the matrix whose singular value -c decomposition is to be computed. x is -c destroyed by dsvdc. -c -c ldx integer. -c ldx is the leading dimension of the array x. -c -c n integer. -c n is the number of rows of the matrix x. -c -c p integer. -c p is the number of columns of the matrix x. -c -c ldu integer. -c ldu is the leading dimension of the array u. -c (see below). -c -c ldv integer. -c ldv is the leading dimension of the array v. -c (see below). -c -c work double precision(n). -c work is a scratch array. -c -c job integer. -c job controls the computation of the singular -c vectors. it has the decimal expansion ab -c with the following meaning -c -c a.eq.0 do not compute the left singular -c vectors. -c a.eq.1 return the n left singular vectors -c in u. -c a.ge.2 return the first min(n,p) singular -c vectors in u. -c b.eq.0 do not compute the right singular -c vectors. -c b.eq.1 return the right singular vectors -c in v. -c -c on return -c -c s double precision(mm), where mm=min(n+1,p). -c the first min(n,p) entries of s contain the -c singular values of x arranged in descending -c order of magnitude. -c -c e double precision(p), -c e ordinarily contains zeros. however see the -c discussion of info for exceptions. -c -c u double precision(ldu,k), where ldu.ge.n. if -c joba.eq.1 then k.eq.n, if joba.ge.2 -c then k.eq.min(n,p). -c u contains the matrix of left singular vectors. -c u is not referenced if joba.eq.0. if n.le.p -c or if joba.eq.2, then u may be identified with x -c in the subroutine call. -c -c v double precision(ldv,p), where ldv.ge.p. -c v contains the matrix of right singular vectors. -c v is not referenced if job.eq.0. if p.le.n, -c then v may be identified with x in the -c subroutine call. -c -c info integer. -c the singular values (and their corresponding -c singular vectors) s(info+1),s(info+2),...,s(m) -c are correct (here m=min(n,p)). thus if -c info.eq.0, all the singular values and their -c vectors are correct. in any event, the matrix -c b = trans(u)*x*v is the bidiagonal matrix -c with the elements of s on its diagonal and the -c elements of e on its super-diagonal (trans(u) -c is the transpose of u). thus the singular -c values of x and b are the same. -c -c linpack. this version dated 08/14/78 . -c correction made to shift 2/84. -c g.w. stewart, university of maryland, argonne national lab. -c -c dsvdc uses the following functions and subprograms. -c -c external drot -c blas daxpy,ddot,dscal,dswap,dnrm2,drotg -c fortran dabs,dmax1,max0,min0,mod,dsqrt -c -c internal variables -c - integer i,iter,j,jobu,k,kase,kk,l,ll,lls,lm1,lp1,ls,lu,m,maxit, - * mm,mm1,mp1,nct,nctp1,ncu,nrt,nrtp1 -c double precision ddot,t,r - double precision ddot,t - double precision b,c,cs,el,emm1,f,g,dnrm2,scale,shift,sl,sm,sn, - * smm1,t1,test,ztest - logical wantu,wantv -c -c -c set the maximum number of iterations. -c - maxit = 30 -c -c determine what is to be computed. -c - wantu = .false. - wantv = .false. - jobu = mod(job,100)/10 - ncu = n - if (jobu .gt. 1) ncu = min0(n,p) - if (jobu .ne. 0) wantu = .true. - if (mod(job,10) .ne. 0) wantv = .true. -c -c reduce x to bidiagonal form, storing the diagonal elements -c in s and the super-diagonal elements in e. -c - info = 0 - nct = min0(n-1,p) - nrt = max0(0,min0(p-2,n)) - lu = max0(nct,nrt) - if (lu .lt. 1) go to 170 - do 160 l = 1, lu - lp1 = l + 1 - if (l .gt. nct) go to 20 -c -c compute the transformation for the l-th column and -c place the l-th diagonal in s(l). -c - s(l) = dnrm2(n-l+1,x(l,l),1) - if (s(l) .eq. 0.0d0) go to 10 - if (x(l,l) .ne. 0.0d0) s(l) = dsign(s(l),x(l,l)) - call dscal(n-l+1,1.0d0/s(l),x(l,l),1) - x(l,l) = 1.0d0 + x(l,l) - 10 continue - s(l) = -s(l) - 20 continue - if (p .lt. lp1) go to 50 - do 40 j = lp1, p - if (l .gt. nct) go to 30 - if (s(l) .eq. 0.0d0) go to 30 -c -c apply the transformation. -c - t = -ddot(n-l+1,x(l,l),1,x(l,j),1)/x(l,l) - call daxpy(n-l+1,t,x(l,l),1,x(l,j),1) - 30 continue -c -c place the l-th row of x into e for the -c subsequent calculation of the row transformation. -c - e(j) = x(l,j) - 40 continue - 50 continue - if (.not.wantu .or. l .gt. nct) go to 70 -c -c place the transformation in u for subsequent back -c multiplication. -c - do 60 i = l, n - u(i,l) = x(i,l) - 60 continue - 70 continue - if (l .gt. nrt) go to 150 -c -c compute the l-th row transformation and place the -c l-th super-diagonal in e(l). -c - e(l) = dnrm2(p-l,e(lp1),1) - if (e(l) .eq. 0.0d0) go to 80 - if (e(lp1) .ne. 0.0d0) e(l) = dsign(e(l),e(lp1)) - call dscal(p-l,1.0d0/e(l),e(lp1),1) - e(lp1) = 1.0d0 + e(lp1) - 80 continue - e(l) = -e(l) - if (lp1 .gt. n .or. e(l) .eq. 0.0d0) go to 120 -c -c apply the transformation. -c - do 90 i = lp1, n - work(i) = 0.0d0 - 90 continue - do 100 j = lp1, p - call daxpy(n-l,e(j),x(lp1,j),1,work(lp1),1) - 100 continue - do 110 j = lp1, p - call daxpy(n-l,-e(j)/e(lp1),work(lp1),1,x(lp1,j),1) - 110 continue - 120 continue - if (.not.wantv) go to 140 -c -c place the transformation in v for subsequent -c back multiplication. -c - do 130 i = lp1, p - v(i,l) = e(i) - 130 continue - 140 continue - 150 continue - 160 continue - 170 continue -c -c set up the final bidiagonal matrix or order m. -c - m = min0(p,n+1) - nctp1 = nct + 1 - nrtp1 = nrt + 1 - if (nct .lt. p) s(nctp1) = x(nctp1,nctp1) - if (n .lt. m) s(m) = 0.0d0 - if (nrtp1 .lt. m) e(nrtp1) = x(nrtp1,m) - e(m) = 0.0d0 -c -c if required, generate u. -c - if (.not.wantu) go to 300 - if (ncu .lt. nctp1) go to 200 - do 190 j = nctp1, ncu - do 180 i = 1, n - u(i,j) = 0.0d0 - 180 continue - u(j,j) = 1.0d0 - 190 continue - 200 continue - if (nct .lt. 1) go to 290 - do 280 ll = 1, nct - l = nct - ll + 1 - if (s(l) .eq. 0.0d0) go to 250 - lp1 = l + 1 - if (ncu .lt. lp1) go to 220 - do 210 j = lp1, ncu - t = -ddot(n-l+1,u(l,l),1,u(l,j),1)/u(l,l) - call daxpy(n-l+1,t,u(l,l),1,u(l,j),1) - 210 continue - 220 continue - call dscal(n-l+1,-1.0d0,u(l,l),1) - u(l,l) = 1.0d0 + u(l,l) - lm1 = l - 1 - if (lm1 .lt. 1) go to 240 - do 230 i = 1, lm1 - u(i,l) = 0.0d0 - 230 continue - 240 continue - go to 270 - 250 continue - do 260 i = 1, n - u(i,l) = 0.0d0 - 260 continue - u(l,l) = 1.0d0 - 270 continue - 280 continue - 290 continue - 300 continue -c -c if it is required, generate v. -c - if (.not.wantv) go to 350 - do 340 ll = 1, p - l = p - ll + 1 - lp1 = l + 1 - if (l .gt. nrt) go to 320 - if (e(l) .eq. 0.0d0) go to 320 - do 310 j = lp1, p - t = -ddot(p-l,v(lp1,l),1,v(lp1,j),1)/v(lp1,l) - call daxpy(p-l,t,v(lp1,l),1,v(lp1,j),1) - 310 continue - 320 continue - do 330 i = 1, p - v(i,l) = 0.0d0 - 330 continue - v(l,l) = 1.0d0 - 340 continue - 350 continue -c -c main iteration loop for the singular values. -c - mm = m - iter = 0 - 360 continue -c -c quit if all the singular values have been found. -c -c ...exit - if (m .eq. 0) go to 620 -c -c if too many iterations have been performed, set -c flag and return. -c - if (iter .lt. maxit) go to 370 - info = m -c ......exit - go to 620 - 370 continue -c -c this section of the program inspects for -c negligible elements in the s and e arrays. on -c completion the variables kase and l are set as follows. -c -c kase = 1 if s(m) and e(l-1) are negligible and l.lt.m -c kase = 2 if s(l) is negligible and l.lt.m -c kase = 3 if e(l-1) is negligible, l.lt.m, and -c s(l), ..., s(m) are not negligible (qr step). -c kase = 4 if e(m-1) is negligible (convergence). -c - do 390 ll = 1, m - l = m - ll -c ...exit - if (l .eq. 0) go to 400 - test = dabs(s(l)) + dabs(s(l+1)) - ztest = test + dabs(e(l)) - if (ztest .ne. test) go to 380 - e(l) = 0.0d0 -c ......exit - go to 400 - 380 continue - 390 continue - 400 continue - if (l .ne. m - 1) go to 410 - kase = 4 - go to 480 - 410 continue - lp1 = l + 1 - mp1 = m + 1 - do 430 lls = lp1, mp1 - ls = m - lls + lp1 -c ...exit - if (ls .eq. l) go to 440 - test = 0.0d0 - if (ls .ne. m) test = test + dabs(e(ls)) - if (ls .ne. l + 1) test = test + dabs(e(ls-1)) - ztest = test + dabs(s(ls)) - if (ztest .ne. test) go to 420 - s(ls) = 0.0d0 -c ......exit - go to 440 - 420 continue - 430 continue - 440 continue - if (ls .ne. l) go to 450 - kase = 3 - go to 470 - 450 continue - if (ls .ne. m) go to 460 - kase = 1 - go to 470 - 460 continue - kase = 2 - l = ls - 470 continue - 480 continue - l = l + 1 -c -c perform the task indicated by kase. -c -c go to (490,520,540,570), kase - - select case(kase) - case(490) - goto 490 - case(520) - goto 520 - case(540) - goto 540 - case(570) - goto 570 - end select -c -c deflate negligible s(m). -c - 490 continue - mm1 = m - 1 - f = e(m-1) - e(m-1) = 0.0d0 - do 510 kk = l, mm1 - k = mm1 - kk + l - t1 = s(k) - call drotg(t1,f,cs,sn) - s(k) = t1 - if (k .eq. l) go to 500 - f = -sn*e(k-1) - e(k-1) = cs*e(k-1) - 500 continue - if (wantv) call drot(p,v(1,k),1,v(1,m),1,cs,sn) - 510 continue - go to 610 -c -c split at negligible s(l). -c - 520 continue - f = e(l-1) - e(l-1) = 0.0d0 - do 530 k = l, m - t1 = s(k) - call drotg(t1,f,cs,sn) - s(k) = t1 - f = -sn*e(k) - e(k) = cs*e(k) - if (wantu) call drot(n,u(1,k),1,u(1,l-1),1,cs,sn) - 530 continue - go to 610 -c -c perform one qr step. -c - 540 continue -c -c calculate the shift. -c - scale = dmax1(dabs(s(m)),dabs(s(m-1)),dabs(e(m-1)), - * dabs(s(l)),dabs(e(l))) - sm = s(m)/scale - smm1 = s(m-1)/scale - emm1 = e(m-1)/scale - sl = s(l)/scale - el = e(l)/scale - b = ((smm1 + sm)*(smm1 - sm) + emm1**2)/2.0d0 - c = (sm*emm1)**2 - shift = 0.0d0 - if (b .eq. 0.0d0 .and. c .eq. 0.0d0) go to 550 - shift = dsqrt(b**2+c) - if (b .lt. 0.0d0) shift = -shift - shift = c/(b + shift) - 550 continue - f = (sl + sm)*(sl - sm) + shift - g = sl*el -c -c chase zeros. -c - mm1 = m - 1 - do 560 k = l, mm1 - call drotg(f,g,cs,sn) - if (k .ne. l) e(k-1) = f - f = cs*s(k) + sn*e(k) - e(k) = cs*e(k) - sn*s(k) - g = sn*s(k+1) - s(k+1) = cs*s(k+1) - if (wantv) call drot(p,v(1,k),1,v(1,k+1),1,cs,sn) - call drotg(f,g,cs,sn) - s(k) = f - f = cs*e(k) + sn*s(k+1) - s(k+1) = -sn*e(k) + cs*s(k+1) - g = sn*e(k+1) - e(k+1) = cs*e(k+1) - if (wantu .and. k .lt. n) - * call drot(n,u(1,k),1,u(1,k+1),1,cs,sn) - 560 continue - e(m-1) = f - iter = iter + 1 - go to 610 -c -c convergence. -c - 570 continue -c -c make the singular value positive. -c - if (s(l) .ge. 0.0d0) go to 580 - s(l) = -s(l) - if (wantv) call dscal(p,-1.0d0,v(1,l),1) - 580 continue -c -c order the singular value. -c - 590 if (l .eq. mm) go to 600 -c ...exit - if (s(l) .ge. s(l+1)) go to 600 - t = s(l) - s(l) = s(l+1) - s(l+1) = t - if (wantv .and. l .lt. p) - * call dswap(p,v(1,l),1,v(1,l+1),1) - if (wantu .and. l .lt. n) - * call dswap(n,u(1,l),1,u(1,l+1),1) - l = l + 1 - go to 590 - 600 continue - iter = 0 - m = m - 1 - 610 continue - go to 360 - 620 continue - return - end - subroutine daxpy(n,da,dx,incx,dy,incy) -c -c constant times a vector plus a vector. -c uses unrolled loops for increments equal to one. -c jack dongarra, linpack, 3/11/78. -c modified 12/3/93, array(1) declarations changed to array(*) -c - double precision dx(*),dy(*),da - integer i,incx,incy,ix,iy,m,mp1,n -c - if(n.le.0)return - if (da .eq. 0.0d0) return - if(incx.eq.1.and.incy.eq.1)go to 20 -c -c code for unequal increments or equal increments -c not equal to 1 -c - ix = 1 - iy = 1 - if(incx.lt.0)ix = (-n+1)*incx + 1 - if(incy.lt.0)iy = (-n+1)*incy + 1 - do 10 i = 1,n - dy(iy) = dy(iy) + da*dx(ix) - ix = ix + incx - iy = iy + incy - 10 continue - return -c -c code for both increments equal to 1 -c -c -c clean-up loop -c - 20 m = mod(n,4) - if( m .eq. 0 ) go to 40 - do 30 i = 1,m - dy(i) = dy(i) + da*dx(i) - 30 continue - if( n .lt. 4 ) return - 40 mp1 = m + 1 - do 50 i = mp1,n,4 - dy(i) = dy(i) + da*dx(i) - dy(i + 1) = dy(i + 1) + da*dx(i + 1) - dy(i + 2) = dy(i + 2) + da*dx(i + 2) - dy(i + 3) = dy(i + 3) + da*dx(i + 3) - 50 continue - return - end - double precision function ddot(n,dx,incx,dy,incy) -c -c forms the dot product of two vectors. -c uses unrolled loops for increments equal to one. -c jack dongarra, linpack, 3/11/78. -c modified 12/3/93, array(1) declarations changed to array(*) -c - double precision dx(*),dy(*),dtemp - integer i,incx,incy,ix,iy,m,mp1,n -c - ddot = 0.0d0 - dtemp = 0.0d0 - if(n.le.0)return - if(incx.eq.1.and.incy.eq.1)go to 20 -c -c code for unequal increments or equal increments -c not equal to 1 -c - ix = 1 - iy = 1 - if(incx.lt.0)ix = (-n+1)*incx + 1 - if(incy.lt.0)iy = (-n+1)*incy + 1 - do 10 i = 1,n - dtemp = dtemp + dx(ix)*dy(iy) - ix = ix + incx - iy = iy + incy - 10 continue - ddot = dtemp - return -c -c code for both increments equal to 1 -c -c -c clean-up loop -c - 20 m = mod(n,5) - if( m .eq. 0 ) go to 40 - do 30 i = 1,m - dtemp = dtemp + dx(i)*dy(i) - 30 continue - if( n .lt. 5 ) go to 60 - 40 mp1 = m + 1 - do 50 i = mp1,n,5 - dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) + - * dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4) - 50 continue - 60 ddot = dtemp - return - end - DOUBLE PRECISION FUNCTION DNRM2 ( N, X, INCX ) -* .. Scalar Arguments .. - INTEGER INCX, N -* .. Array Arguments .. - DOUBLE PRECISION X( * ) -* .. -* -* DNRM2 returns the euclidean norm of a vector via the function -* name, so that -* -* DNRM2 := sqrt( x'*x ) -* -* -* -* -- This version written on 25-October-1982. -* Modified on 14-October-1993 to inline the call to DLASSQ. -* Sven Hammarling, Nag Ltd. -* -* -* .. Parameters .. - DOUBLE PRECISION ONE , ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. Local Scalars .. - INTEGER IX - DOUBLE PRECISION ABSXI, NORM, SCALE, SSQ -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. - IF( N.LT.1 .OR. INCX.LT.1 )THEN - NORM = ZERO - ELSE IF( N.EQ.1 )THEN - NORM = ABS( X( 1 ) ) - ELSE - SCALE = ZERO - SSQ = ONE -* The following loop is equivalent to this call to the LAPACK -* auxiliary routine: -* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) -* - DO 10, IX = 1, 1 + ( N - 1 )*INCX, INCX - IF( X( IX ).NE.ZERO )THEN - ABSXI = ABS( X( IX ) ) - IF( SCALE.LT.ABSXI )THEN - SSQ = ONE + SSQ*( SCALE/ABSXI )**2 - SCALE = ABSXI - ELSE - SSQ = SSQ + ( ABSXI/SCALE )**2 - END IF - END IF - 10 CONTINUE - NORM = SCALE * SQRT( SSQ ) - END IF -* - DNRM2 = NORM - RETURN -* -* End of DNRM2. -* - END - subroutine drot (n,dx,incx,dy,incy,c,s) -c -c applies a plane rotation. -c jack dongarra, linpack, 3/11/78. -c modified 12/3/93, array(1) declarations changed to array(*) -c - double precision dx(*),dy(*),dtemp,c,s - integer i,incx,incy,ix,iy,n -c - if(n.le.0)return - if(incx.eq.1.and.incy.eq.1)go to 20 -c -c code for unequal increments or equal increments not equal -c to 1 -c - ix = 1 - iy = 1 - if(incx.lt.0)ix = (-n+1)*incx + 1 - if(incy.lt.0)iy = (-n+1)*incy + 1 - do 10 i = 1,n - dtemp = c*dx(ix) + s*dy(iy) - dy(iy) = c*dy(iy) - s*dx(ix) - dx(ix) = dtemp - ix = ix + incx - iy = iy + incy - 10 continue - return -c -c code for both increments equal to 1 -c - 20 do 30 i = 1,n - dtemp = c*dx(i) + s*dy(i) - dy(i) = c*dy(i) - s*dx(i) - dx(i) = dtemp - 30 continue - return - end - subroutine drotg(da,db,c,s) -c -c construct givens plane rotation. -c jack dongarra, linpack, 3/11/78. -c - double precision da,db,c,s,roe,scale,r,z -c - roe = db - if( dabs(da) .gt. dabs(db) ) roe = da - scale = dabs(da) + dabs(db) - if( scale .ne. 0.0d0 ) go to 10 - c = 1.0d0 - s = 0.0d0 - r = 0.0d0 - z = 0.0d0 - go to 20 - 10 r = scale*dsqrt((da/scale)**2 + (db/scale)**2) - r = dsign(1.0d0,roe)*r - c = da/r - s = db/r - z = 1.0d0 - if( dabs(da) .gt. dabs(db) ) z = s - if( dabs(db) .ge. dabs(da) .and. c .ne. 0.0d0 ) z = 1.0d0/c - 20 da = r - db = z - return - end - subroutine dscal(n,da,dx,incx) -c -c scales a vector by a constant. -c uses unrolled loops for increment equal to one. -c jack dongarra, linpack, 3/11/78. -c modified 3/93 to return if incx .le. 0. -c modified 12/3/93, array(1) declarations changed to array(*) -c - double precision da,dx(*) - integer i,incx,m,mp1,n,nincx -c - if( n.le.0 .or. incx.le.0 )return - if(incx.eq.1)go to 20 -c -c code for increment not equal to 1 -c - nincx = n*incx - do 10 i = 1,nincx,incx - dx(i) = da*dx(i) - 10 continue - return -c -c code for increment equal to 1 -c -c -c clean-up loop -c - 20 m = mod(n,5) - if( m .eq. 0 ) go to 40 - do 30 i = 1,m - dx(i) = da*dx(i) - 30 continue - if( n .lt. 5 ) return - 40 mp1 = m + 1 - do 50 i = mp1,n,5 - dx(i) = da*dx(i) - dx(i + 1) = da*dx(i + 1) - dx(i + 2) = da*dx(i + 2) - dx(i + 3) = da*dx(i + 3) - dx(i + 4) = da*dx(i + 4) - 50 continue - return - end - subroutine dswap (n,dx,incx,dy,incy) -c -c interchanges two vectors. -c uses unrolled loops for increments equal one. -c jack dongarra, linpack, 3/11/78. -c modified 12/3/93, array(1) declarations changed to array(*) -c - double precision dx(*),dy(*),dtemp - integer i,incx,incy,ix,iy,m,mp1,n -c - if(n.le.0)return - if(incx.eq.1.and.incy.eq.1)go to 20 -c -c code for unequal increments or equal increments not equal -c to 1 -c - ix = 1 - iy = 1 - if(incx.lt.0)ix = (-n+1)*incx + 1 - if(incy.lt.0)iy = (-n+1)*incy + 1 - do 10 i = 1,n - dtemp = dx(ix) - dx(ix) = dy(iy) - dy(iy) = dtemp - ix = ix + incx - iy = iy + incy - 10 continue - return -c -c code for both increments equal to 1 -c -c -c clean-up loop -c - 20 m = mod(n,3) - if( m .eq. 0 ) go to 40 - do 30 i = 1,m - dtemp = dx(i) - dx(i) = dy(i) - dy(i) = dtemp - 30 continue - if( n .lt. 3 ) return - 40 mp1 = m + 1 - do 50 i = mp1,n,3 - dtemp = dx(i) - dx(i) = dy(i) - dy(i) = dtemp - dtemp = dx(i + 1) - dx(i + 1) = dy(i + 1) - dy(i + 1) = dtemp - dtemp = dx(i + 2) - dx(i + 2) = dy(i + 2) - dy(i + 2) = dtemp - 50 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shpg.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shpg.f deleted file mode 100755 index 722689926..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shpg.f +++ /dev/null @@ -1,1495 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c August 2003 -c -c ... in file shpg.f -c -c this file contains code and documentation for subroutines -c shpgi and shpg. -c -c ... files which must be loaded with shpg.f -c -c hrfft.f -c -c shpgi initializes the arrays wshp and iwshp for subsequent -c use in subroutine shpg, which performs the harmonic projection -c which is equivalent to a harmonic analysis followed by -c harmonic synthesis but faster and with less memory. -c (see description of subroutine shpg below). -c -c subroutine shpgi(nlat,nlon,isym,mtrunc,wshp,lwshp,iwshp, -c 1 liwshp,work,lwork,ierror) -c -c shpgi initializes arrays wshp and iwshp for repeated use -c by subroutine shpg .... -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c nlon must be at least 4. -c -c isym currently not used, no equatorial symmetries assumed, -c only whole sphere computations. -c -c mtrunc the highest longitudinal wave number retained in the -c projection. It must be less than or equal to -c the minimum of nlat-1 and nlon/2. The first wave -c number is zero. For example, if wave numbers 0 and -c 1 are desired then mtrunc = 1. -c -c lwshp the dimension of the array wshp as it appears in the -c program that calls shpgi. It must be at least -c 2*(nlat+1)**2+nlon+log2(nlon) -c -c liwshp the dimension of the array iwshp as it appears in the -c program that calls shpgi. It must be at least -c 4*(nlat+1). -c -c lwork the dimension of the array work as it appears in the -c program that calls shpgi. It must be at least -c 1.25*(nlat+1)**2+7*nlat+8. -c -c ************************************************************** -c -c output parameters -c -c wshp a single precision array that must be saved for -c repeated use by subroutine shpg. -c -c iwshp an integer array that must be saved for repeated -c use by subroutine shpg. -c -c work a double precision work array that does -c not have to be saved. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of mtrunc -c = 5 error in the specification of lwshp -c = 6 error in the specification of liwshp -c = 7 error in the specification of lwork -c - subroutine shpgi(nlat,nlon,isym,mtrunc,wshp,lwshp,iwshp, - 1 liwshp,work,lwork,ierror) - double precision work(*) - dimension wshp(*),iwshp(*) -c - ierror = 1 - if(nlat.lt.1) return - ierror = 2 - if(nlon.lt.1) return -c ierror = 3 -c if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - mmax = min(nlat-1,nlon/2) - if(mtrunc.lt.0 .or. mtrunc.gt.mmax) return - ierror = 5 - lw1 = 2*(nlat+1)**2 - log2n = log(float(nlon))/log(2.0) - if(lwshp.lt.lw1+nlon+log2n) return - ierror = 6 - if(liwshp.lt.4*(nlat+1)) return - ierror = 7 - mlwk = 1.25*(nlat+1)**2+7*nlat+8 - if(lwork.lt.mlwk) return - ierror = 0 -c - call hrffti(nlon,wshp(lw1+1)) -c - nte = (nlat+1)/2 - nloc1 = 2*nte*nte - nloc2 = nlat+1 - iw1 = 1 - iw2 = iw1+nloc1 - iw3 = iw2+nloc1 - iw4 = iw3+nloc1 - jw1 = 1 - jw2 = jw1+nloc2 - jw3 = jw2+nloc2 - jw4 = jw3+nloc2 - kw1 = 1 - kw2 = kw1+nte - kw3 = kw2+nte - kw4 = kw3+2*nte - kw5 = kw4+2*nte - kw6 = kw5+nte - kw7 = kw6+nte - kw8 = kw7+4*nte - kw9 = kw8+2*nte - kw10 = kw9+nloc1 - kw11 = kw10+nloc1 - ktot = kw11+nte*nte -c - call shpgi1(nlat,nlon,isym,mtrunc,nte,ierror,wshp(iw1),wshp(iw2), - 1 wshp(iw3),wshp(iw4),iwshp(jw1),iwshp(jw2),iwshp(jw3), - 2 iwshp(jw4),work(kw1),work(kw2),work(kw3),work(kw4),work(kw5), - 3 work(kw6),work(kw7),work(kw8),work(kw9),work(kw10),work(kw11)) - return - end - subroutine shpgi1(nlat,nlon,isym,mtrunc,idp,ierror, - 1 pe,po,ze,zo,ipse,jzse,ipso,jzso, - 2 cp,wx,thet,gwts,xx,z,a,b,ped,pod,u) -c - double precision sum,eps,a1,b1,c1,work - parameter (eps=5.0d-8) - double precision cp(idp),wx(idp), - 1 thet(nlat),gwts(nlat),xx(idp),z(idp),a(4*idp), - 2 b(2*idp),ped(idp,idp,2),pod(idp,idp,2),u(idp,idp) -c - dimension pe(idp,idp,2),po(idp,idp,2),ze(idp,idp,2), - 1 zo(idp,idp,2), - 2 ipse(idp,2),jzse(idp,2),ipso(idp,2),jzso(idp,2), - 3 nshe(2),nsho(2) - dimension zort(64,64,2) -c - ns2 = nlat/2 - modn = nlat-ns2-ns2 - nte = (nlat+1)/2 - nto = nlat-nte - tusl = 0. - toe = 0. -c -c compute gauss grid distribution -c - lwork = nlat+1 - call gaqdp(nlat,thet,gwts,work,lwork,ierr) - if(ierr .ne. 0) write(*,160) ierr - 160 format(' error in gaqd =',i5) - do i=1,nto - gwts(i) = gwts(i)+gwts(i) - end do -c -c compute n**2 basis (even functions) -c - do n=1,nlat+nlat-2 - dfn = n - a(n) = dsqrt(dfn*(dfn+1.0d0)) - end do - do n=1,nlat-1 - dfn = n - b(n) = dsqrt((dfn+dfn+3.0d0)/(dfn+dfn-1.0d0)) - end do -c - mxtr = min(nlat-1,nlon/2,mtrunc) - ip = 2 - do 200 mp1=1,mxtr+1 - m = mp1-1 - ip = 3-ip - ms2 = mp1/2 - nem = (nlat-m+1)/2 - nec = nte-nem -c -c compute associated legendre functions -c - if(m.le.1) then - do 205 j=1,nem - n = j+j+m-2 - call dlfkg(m,n,cp) - do i=1,nte - call dlftg (m,n,thet(i),cp,ped(i,j+nec,ip)) - end do - 205 continue -c - else -c - do 207 j=1,nem - n = j+j+m-2 - if(m.gt.1.and.n.gt.mxtr) then - do i=1,nte - u(i,j+nec) = ped(i,j+nec,ip) - end do - go to 207 - end if - a1 = b(n-1)*a(n+m-3)/a(n+m-1) - b1 = a(n-m+1)/a(n+m-1) - if(n-m.le.1) then - do i=1,nte - u(i,j+nec) = a1*ped(i,j+nec-1,ip) - 1 - b1*ped(i,j+nec,ip) - end do - else - c1 = b(n-1)*a(n-m-1)/a(n+m-1) - do i=1,nte - u(i,j+nec) = a1*ped(i,j+nec-1,ip) - 1 - b1*ped(i,j+nec,ip) + c1*u(i,j+nec-1) - end do - end if - 207 continue - do j=1,nem - do i=1,nte - ped(i,j+nec,ip) = u(i,j+nec) - end do - end do - end if - if(nec.le.0) go to 200 -c -c generate orthogonal vector with -c random numbers using Fortran90 -c intrinsics RANDOM_{SEED, NUMBER} -c -c comment out old code -c -c do i=1,nte -c xx(i) = rand() -c end do -c -c replacement code -c - CALL RANDOM_SEED() - CALL RANDOM_NUMBER(xx(1:nte)) -c - it = 0 - 201 do i=1,nte - z(i) = 0.0d0 - wx(i) = gwts(i)*xx(i) - end do - do 220 j=1,nte - if(j.eq.nec) go to 220 - call gs(nte,wx,ped(1,j,ip),z) - 220 continue -c - do i=1,nte - xx(i) = xx(i)-z(i) - end do - call normal(nte,xx,idp,gwts) - it = it+1 - if(it.le.2) go to 201 - do i=1,nte - ped(i,nec,ip) = xx(i) - end do - 200 continue -c -c reorder if mtrunc is less than nlat-1 -c case of even functions -c - nmx = nlat-mxtr - if(modn.eq.1) then - nshe(1) = nmx/2 - nshe(2) = (nmx-1)/2 - else - nshe(1) = (nmx-1)/2 - nshe(2) = nmx/2 - end if -c - do 210 mp1=1,2 - do j=1,nte - js = j+nshe(mp1) - if(js.gt.nte) js = js-nte - do i=1,nte - u(i,js) = ped(i,j,mp1) - end do - end do - do j=1,nte - do i=1,nte - ped(i,j,mp1) = u(i,j) - end do - end do - 210 continue -c - call trunc(0,nte,idp,ped(1,1,1),nte,ipse(1,1)) - call trunc(0,nte,idp,ped(1,1,2),nte,ipse(1,2)) -c -c compute the analysis matrices -c - do 250 ip=1,2 - do i=1,nte - lock = 0 - do j=1,nte - sum = ped(j,i,ip)*gwts(j) - ze(j,i,ip) = sum - pe(i,j,ip) = ped(i,j,ip) - if(dabs(sum).gt.eps .and. lock.eq.0) then - lock = 1 - jzse(i,ip) = j - end if - end do - end do - 250 continue -c -c check orthogonality of pe(i,j,mp1) mp1=1,2 -c - do ip=1,2 - dmax = 0. - do i=1,nte - do j=1,nte - sum1 = 0. - do k=1,nte - sum1 = sum1+ze(k,i,ip)*pe(k,j,ip) - end do - zo(i,j,ip) = sum1 - if(i.ne.j) then - dmax = max(dmax,abs(sum1)) - else - dmax = max(dmax,abs(sum1-1.0)) - end if - end do - end do - end do -c -c compute n**2 basis (odd functions) -c - ip = 2 - do 300 mp1=1,mxtr+1 - ip = 3-ip - m = mp1-1 - ms2 = mp1/2 - nem = (nlat-m+1)/2 - nom = nlat-m-nem - noc = nto-nom -c -c compute associated legendre functions -c - if(m.le.1) then - do 305 j=1,nom - n = j+j+m-1 - call dlfkg(m,n,cp) - do i=1,nte - call dlftg (m,n,thet(i),cp,pod(i,j+noc,ip)) - end do - if(modn.gt.0) pod(nte,j+noc,ip) = 0.0d0 - 305 continue -c - else -c - do 307 j=1,nom - n = j+j+m-1 - if(m.gt.1.and.n.gt.mxtr) then - do i=1,nte - u(i,j+noc) = pod(i,j+noc,ip) - end do - go to 304 - end if - a1 = b(n-1)*a(n+m-3)/a(n+m-1) - b1 = a(n-m+1)/a(n+m-1) - if(n-m.le.1) then - do i=1,nte - u(i,j+noc) = a1*pod(i,j+noc-1,ip) - 1 - b1*pod(i,j+noc,ip) - end do - else - c1 = b(n-1)*a(n-m-1)/a(n+m-1) - do i=1,nte - u(i,j+noc) = a1*pod(i,j+noc-1,ip) - 1 - b1*pod(i,j+noc,ip) + c1*u(i,j+noc-1) - end do - end if - 304 if(modn.eq.1) u(nte,j+noc) = 0.0d0 - 307 continue - do j=1,nom - do i=1,nte - pod(i,j+noc,ip) = u(i,j+noc) - end do - end do - end if -c - if(noc.le.0) go to 300 -c -c old code with nonstandard (s)rand -c commented out -c -c do i=1,nte -c xx(i) = rand() -c end do -c -c replacement code with standard Fortran90 -c intrinsic -c - CALL RANDOM_NUMBER(xx(1:nte)) - if(modn.eq.1) xx(nte) = 0.0d0 - it = 0 - 306 do i=1,nte - z(i) = 0. - wx(i) = gwts(i)*xx(i) - end do - do 330 j=1,nto - if(j.eq.noc) go to 330 - call gs(nte,wx,pod(1,j,ip),z(1)) - 330 continue -c - do i=1,nte - xx(i) = xx(i)-z(i) - end do - call normal(nte,xx,idp,gwts) - it = it+1 - if(it.le.2) go to 306 - do i=1,nte - pod(i,noc,ip) = xx(i) - end do - if(modn.eq.1) pod(nte,noc,ip) = 0.0d0 - 300 continue -c - nmx = nlat-mxtr - if(modn.eq.1) then - nsho(1) = (nmx-1)/2 - nsho(2) = nmx/2 - else - nsho(1) = nmx/2 - nsho(2) = (nmx-1)/2 - end if -c - do 310 mp1=1,2 - do j=1,nto - js = j+nsho(mp1) - if(js.gt.nto) js = js-nto - do i=1,nte - u(i,js) = pod(i,j,mp1) - end do - end do - do j=1,nto - do i=1,nte - pod(i,j,mp1) = u(i,j) - end do - end do - 310 continue -c - call trunc(0,nte,idp,pod(1,1,1),nto,ipso(1,1)) - call trunc(0,nte,idp,pod(1,1,2),nto,ipso(1,2)) -c -c compute the analysis matrices (odd functions) -c - do ip=1,2 - do i=1,nto - lock = 0 - do j=1,nto - sum = pod(j,i,ip)*gwts(j) - zo(j,i,ip) = sum - po(i,j,ip) = pod(i,j,ip) - if(dabs(sum).gt.eps .and. lock.eq.0) then - lock = 1 - jzso(i,ip) = j - end if - end do - end do - end do -c -c check orthogonality of po(i,j,mp1) mp1=1,2 -c - do ip=1,2 - dmax = 0. - do i=1,nto - do j=1,nto - sum1 = 0. - do k=1,nto - sum1 = sum1+zo(k,i,ip)*po(k,j,ip) - end do - zort(i,j,ip) = sum1 - if(i.ne.j) then - dmax = max(dmax,abs(sum1)) - else - dmax = max(dmax,abs(sum1-1.0)) - end if - end do - end do - end do - return - end -c -c -c ... file shpg.f -c -c ... files which must be loaded with shpg.f -c -c hrfft.f -c -c shpg computes the harmonic projection, which is -c equivalent to a harmonic analysis (forward) followed -c by a harmonic synthesis (backward transform). -c shpg uses the n**2 projection or complement when appropriate -c as well as odd/even factorization and zero truncation on an -c on a Gaussian distributed grid as defined in the JCP paper -c "Generalized discrete spherical harmonic transforms" -c by Paul N. Swarztrauber and William F. Spotz -c J. Comp. Phys., 159(2000) pp. 213-230. -c -c subroutine shpg(nlat,nlon,isym,mtrunc,x,y,idxy, -c 1 wshp,lwshp,iwshp,liwshp,work,lwork,ierror) -c -c shpg projects the array x onto the set of functions represented -c by a discrete set of spherical harmonics. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c nlon must be at least 4. -c -c isym currently not used. -c -c mtrunc the highest longitudinal wave number retained in the -c projection. It must be less than or equal to -c the minimum of nlat-1 and nlon/2. The first wave -c number is zero. For example, if wave numbers 0 and -c 1 are desired then mtrunc = 1. - -c zero. -c -c x a two dimensional array that contains the the nlat -c by nlon array x(i,j) defined at the colatitude point -c theta(i) = (i-1)*pi/(nlat-1) and longitude point phi(j) = -c (j-1)*2*pi/nlon. -c -c idxy the first dimension of the arrays x and y as they -c appear in the program that calls shpg. It must be -c at least nlat. -c -c wshp a single precision array that must be saved for -c repeated use by subroutine shpg. -c -c lwshp the dimension of the array wshp as it appears in the -c program that calls shpgi. It must be at least -c 2*(nlat+1)**2+nlon+log2(nlon) -c -c iwshp an integer array that must be saved for repeated -c use by subroutine shpg. -c -c -c liwshp the dimension of the array iwshp as it appears in the -c program that calls shpgi. It must be at least -c 4*(nlat+1). -c -c work a single precision work array that does -c not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shpg. It must be at least -c max(nlat*nlon,4*(nlat+1)). -c -c ************************************************************** -c -c output parameters -c -c y an nlat by nlon single precision array that contains -c the projection of x onto the set of functions that -c can be represented by the discrete set of spherical -c harmonics. The arrays x(i,j) and y(i,j) are located -c at colatitude point theta(i) = (i-1)*pi/(nlat-1) and -c longitude point phi(j) = (j-1)*2*pi/nlon. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of mtrunc -c = 5 error in the specification of lwshp -c = 6 error in the specification of liwshp -c = 7 error in the specification of lwork -c - subroutine shpg(nlat,nlon,isym,mtrunc,x,y,idxy, - 1 wshp,lwshp,iwshp,liwshp,work,lwork,ierror) -c - dimension wshp(*),iwshp(*),work(*),x(idxy,nlon),y(idxy,nlon) -c - ierror = 1 - if(nlat.lt.1) return - ierror = 2 - if(nlon.lt.1) return -c ierror = 3 -c if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - mmax = min(nlat-1,nlon/2) - if(mtrunc.lt.0 .or. mtrunc.gt.mmax) return - ierror = 5 - log2n = log(float(nlon))/log(2.0) - lw1 = 2*(nlat+1)**2 - if(lwshp.lt.lw1+nlon+log2n) return - ierror = 6 - if(liwshp.lt.4*(nlat+1)) return - ierror = 7 - mwrk = max(nlat*nlon,4*(nlat+1)) - if(lwork.lt.mwrk) return - ierror = 0 -c - do j=1,nlon - do i=1,nlat - y(i,j) = x(i,j) - end do - end do - call hrfftf(nlat,nlon,y,idxy,wshp(lw1+1),work) -c - nte = (nlat+1)/2 - nloc1 = 2*nte*nte - nloc2 = nlat+1 - iw1 = 1 - iw2 = iw1+nloc1 - iw3 = iw2+nloc1 - iw4 = iw3+nloc1 - jw1 = 1 - jw2 = jw1+nloc2 - jw3 = jw2+nloc2 - jw4 = jw3+nloc2 -c - call shpg1(nlat,nlon,isym,mtrunc,y,y,idxy,ierror, - 1 nte,wshp(iw1),wshp(iw2),wshp(iw3),wshp(iw4),iwshp(jw1), - 2 iwshp(jw2),iwshp(jw3),iwshp(jw4),work(jw1), - 3 work(jw2),work(jw3),work(jw4)) -c - call hrfftb(nlat,nlon,y,idxy,wshp(lw1+1),work) -c - sn = 1.0/nlon - do j=1,nlon - do i=1,nlat - y(i,j) = sn*y(i,j) - end do - end do - return - end - subroutine shpg1(nlat,nlon,isym,mtrunc,sx,sy,idxy,ierror, - 1 idp,pe,po,ze,zo,ipse,jzse,ipso,jzso,xe,xo,ye,yo) -c - dimension sx(idxy,nlon),sy(idxy,nlon),nshe(2),nsho(2), - 1 pe(idp,idp,2),po(idp,idp,2),ze(idp,idp,2),zo(idp,idp,2), - 2 ipse(idp,2),jzse(idp,2),ipso(idp,2),jzso(idp,2), - 3 xe(idp,2),xo(idp,2),ye(idp,2),yo(idp,2) -c - ns2 = nlat/2 - modn = nlat-ns2-ns2 - nte = (nlat+1)/2 - nto = nlat-nte -c - mxtr = min(nlat-1,nlon/2,mtrunc) - nmx = nlat-mxtr - if(modn.eq.1) then - nshe(1) = nmx/2 - nshe(2) = (nmx-1)/2 - nsho(1) = (nmx-1)/2 - nsho(2) = nmx/2 - else - nshe(1) = (nmx-1)/2 - nshe(2) = nmx/2 - nsho(1) = nmx/2 - nsho(2) = (nmx-1)/2 - end if -c - ip = 2 - do 100 mp1=1,mxtr+1 - ip = 3-ip - if(mxtr.eq.nlat-1.and.mp1.eq.1) then - do i=1,nlat - sy(i,mp1) = sx(i,mp1) - end do -c if(mp1.eq.2) then -c sy(1,2) = 0. -c sy(nlat,2) = 0. -c end if -c if(nlon.ge.3) then -c sy(1,3) = 0. -c sy(nlat,3) = 0. -c do i=2,nlat-1 -c sy(i,3) = sx(i,3) -c end do -c end if - go to 100 - end if - m = mp1-1 - mpm = max(1,m+m) - ms2 = mp1/2 -c mrank = min(nlat-m,nlat-ms2-ms2) -c nrank = nlat-mrank -c nem = (mrank+1)/2-nshe(ip) -c nom = mrank-(mrank+1)/2-nsho(ip) - nem = (nlat-m+1)/2-nshe(ip) - nom = (nlat-m)/2-nsho(ip) - nec = nte-nem - noc = nto-nom - do i=1,nte - xe(i,1) = .5*(sx(i,mpm)+sx(nlat+1-i,mpm)) - xo(i,1) = .5*(sx(i,mpm)-sx(nlat+1-i,mpm)) - end do -c if(modn.eq.1) then -c xe(nte,1) = sx(nte,mpm) -c xo(nte,1) = 0. -c end if - if(mpm.lt.nlon) then - do i=1,nte - xe(i,2) = .5*(sx(i,mpm+1)+sx(nlat+1-i,mpm+1)) - xo(i,2) = .5*(sx(i,mpm+1)-sx(nlat+1-i,mpm+1)) - end do -c if(modn.eq.1) then -c xe(nte,2) = sx(nte,mpm+1) -c xo(nte,2) = 0. -c end if - end if - lag = 0 - if(m.eq.0.or.mpm.eq.nlon) lag = 1 - if(3*nec.lt.2*nem.or.nem.eq.0) then - call tmxmx(lag,nte,nec,idp,pe(1,1,ip),nte,idp, - 1 ze(1,1,ip),xe,ye,ipse(1,ip),jzse(1,ip)) - do i=1,nte - ye(i,1) = xe(i,1)-ye(i,1) - end do - if(mpm.lt.nlon.and.m.ne.0) then - do i=1,nte - ye(i,2) = xe(i,2)-ye(i,2) - end do - end if - else - call tmxmx(lag,nte,nem,idp,pe(1,nec+1,ip),nte,idp, - 1ze(1,nec+1,ip),xe,ye,ipse(nec+1,ip),jzse(nec+1,ip)) - end if - if(3*noc.lt.2*nom.or.nom.eq.0) then - call tmxmx(lag,nto,noc,idp,po(1,1,ip),nto,idp, - 1 zo(1,1,ip),xo,yo,ipso(1,ip),jzso(1,ip)) - do i=1,nto - yo(i,1) = xo(i,1)-yo(i,1) - end do - if(mpm.lt.nlon.and.m.ne.0) then - do i=1,nto - yo(i,2) = xo(i,2)-yo(i,2) - end do - end if - else - call tmxmx(lag,nto,nom,idp,po(1,noc+1,ip),nto,idp, - 1zo(1,noc+1,ip),xo,yo,ipso(noc+1,ip),jzso(noc+1,ip)) - end if - do i=1,nto - sy(i,mpm) = ye(i,1)+yo(i,1) - sy(nlat+1-i,mpm) = ye(i,1)-yo(i,1) - end do - if(nte.gt.nto) sy(nte,mpm) = ye(nte,1) - if(mpm.lt.nlon.and.m.ne.0) then - do i=1,nto - sy(i,mpm+1) = ye(i,2)+yo(i,2) - sy(nlat+1-i,mpm+1) = ye(i,2)-yo(i,2) - end do - if(nte.gt.nto) sy(nte,mpm+1) = ye(nte,2) - end if - 100 continue -c - js = mxtr+mxtr+2 - do j=js,nlon - do i=1,nlat - sy(i,j) = 0. - end do - end do - return - end - subroutine mxm(lr,lc,ld,a,mc,md,b,nd,c) - double precision a(ld,*),b(md,*),c(nd,*) - do i=1,lr - do j=1,mc - c(i,j) = 0. - do k=1,lc - c(i,j) = c(i,j)+a(i,k)*b(k,j) - end do - end do - end do - return - end - subroutine smxm(lr,lc,ld,a,mc,md,b,nd,c) - dimension a(ld,*),b(md,*),c(nd,*) - do i=1,lr - do j=1,mc - c(i,j) = 0. - do k=1,lc - c(i,j) = c(i,j)+a(i,k)*b(k,j) - end do - end do - end do - return - end - subroutine mxmx(lr,lc,ld,a,mc,md,b,x,y) - dimension a(ld,*),b(md,*),x(ld,2),y(ld,2) - do k=1,lr - y(k,1) = 0. - y(k,2) = 0. - end do -c - if(lc.le.0) return - do i=1,lc - sum1 = 0. - sum2 = 0. - do j=1,mc - sum1 = sum1 + b(i,j)*x(j,1) - sum2 = sum2 + b(i,j)*x(j,2) - end do - do k=1,lr - y(k,1) = y(k,1)+sum1*a(k,i) - y(k,2) = y(k,2)+sum2*a(k,i) - end do - end do - return - end - subroutine dmxmx(lr,lc,ld,a,mc,md,b,x,y) - double precision a(ld,*),b(md,*),x(ld,2),y(ld,2), - 1 sum1,sum2 - do k=1,lr - y(k,1) = 0. - y(k,2) = 0. - end do -c - if(lc.le.0) return - do i=1,lc - sum1 = 0. - sum2 = 0. - do j=1,mc - sum1 = sum1 + b(i,j)*x(j,1) - sum2 = sum2 + b(i,j)*x(j,2) - end do - do k=1,lr - y(k,1) = y(k,1)+sum1*a(k,i) - y(k,2) = y(k,2)+sum2*a(k,i) - end do - end do - return - end - subroutine tmxmx(lag,lr,lc,ld,a,mc,md,b,x,y,is,js) - dimension a(ld,*),b(md,*),x(ld,2),y(ld,2), - 1 is(*),js(*) -c - kmx = min(lr+1,ld) - if(lag.eq.1) then - do k=1,kmx - y(k,1) = 0. - end do -c if(lc.eq.0) then -c do k=1,lr -c y(k,1) = x(k,1) -c end do -c return -c end if - if(lc.le.0) return - do i=1,lc - sum1 = 0. - do j=js(i),mc - sum1 = sum1 + b(j,i)*x(j,1) - end do - do k=is(i),lr - y(k,1) = y(k,1)+sum1*a(k,i) - end do - end do - return - end if - do k=1,kmx - y(k,1) = 0. - y(k,2) = 0. - end do - if(lc.le.0) return -c - do i=1,lc - sum1 = 0. - sum2 = 0. - do j=js(i),mc - sum1 = sum1 + b(j,i)*x(j,1) - sum2 = sum2 + b(j,i)*x(j,2) - end do - do k=is(i),lr - y(k,1) = y(k,1)+sum1*a(k,i) - y(k,2) = y(k,2)+sum2*a(k,i) - end do - end do - return - end - subroutine trunc(irc,n,idp,a,nrc,ijs) - double precision a,eps - parameter (eps=5.d-8) - dimension a(idp,*),ijs(n) -c -c irc = 0 for columns , or irc = 1 for rows -c - if(irc.ne.0) go to 30 - do 20 j=1,nrc - do i=1,n - ijs(j) = i - if(dabs(a(i,j)) .gt. eps) go to 20 - end do - 20 continue - return - 30 do 50 i=1,nrc - do j=1,n - ijs(i) = j - if(abs(a(i,j)) .gt. eps) go to 50 - end do - 50 continue - return - end - subroutine gs(n,x,y,z) - dimension x(n),y(n),z(n) - double precision x,y,z,sum -c -c accumulate innerproducts of x with respect to y. -c - sum = 0. - do i=1,n - sum = sum+x(i)*y(i) - end do - do i=1,n - z(i) = z(i)+sum*y(i) - end do - return - end - subroutine normal(n,x,id,q) - dimension x(n),q(n) - double precision x,q,sqs -c -c normalize x -c - sqs = 0. - do i=1,n -c sum = 0. -c do j=1,n -c sum = sum+q(i,j)*x(j) -c end do -c sqs = sqs+sum*x(i) - sqs = sqs+q(i)*x(i)*x(i) - end do -c - if(sqs .ne. 0) go to 4 - write(*,3) - 3 format(' norm of z is zero in subroutine normal') - return - 4 sqs = dsqrt(sqs) - do i=1,n - x(i) = x(i)/sqs - end do - return - end - subroutine coe(moe,n,x,dmax) - double precision x(n),dmax - nh = (n+1)/2 - dmax = 0. - if(moe.ne.0) go to 1 - do i=1,nh - dmax = max(dmax,dabs(x(i)-x(n-i+1))) - x(i) = .5*(x(i)+x(n-i+1)) - x(n-i+1) = x(i) - end do - return - 1 do i=1,nh - dmax = max(dmax,dabs(x(i)+x(n-i+1))) - x(i) = .5*(x(i)-x(n-i+1)) - x(n-i+1) = -x(i) - end do - if(mod(n,2).ne.0) x(nh) = 0. - return - end -c subroutine dlfkg(m,n,cp) -c -c subroutine dlfkg computes the coefficients in the trigonometric -c expansion of the normalized associated legendre functions: -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c where theta is colatitude. -c -c subroutine dlfkg computes the coefficients cp(k) in the -c following trigonometric expansion of pbar(m,n,theta). -c -c 1) for n even and m even, pbar(m,n,theta) = -c .5*cp(1) plus the sum from k=1 to k=n/2 -c of cp(k)*cos(2*k*th) -c -c 2) for n even and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=n/2 of -c cp(k)*sin(2*k*th) -c -c 3) for n odd and m even, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*cos((2*k-1)*th) -c -c 4) for n odd and m odd, pbar(m,n,theta) = -c the sum from k=1 to k=(n+1)/2 of -c cp(k)*sin((2*k-1)*th) -c -c input parameters -c -c m is the order of pbar(n,m,theta). m can be any integer -c however pbar(n,m,theta) = 0 if abs(m) is greater than -c n and pbar(n,m,theta) = (-1)**m*pbar(n,-m,theta) for -c negative m. -c -c n nonnegative integer specifying the degree of -c pbar(n,m,theta) -c -c output parameters -c -c cp a double precision array that contains the fourier -c coefficients for pbar(m,n,theta). the length of the -c array depends on the parity of m and n -c -c parity length of cp -c -c n even m even n/2+1 -c n even m odd n/2 -c n odd m even (n+1)/2 -c n odd m odd (n+1)/2 -c -c -c **************************************************************** - subroutine dlfkg (m,n,cp) -c - double precision cp,fnum,fden,fnmh,a1,b1,c1,cp2,fnnp1,fnmsq,fk, - 1 t1,t2,pm1,sc10,sc20,sc40 - dimension cp(1) - parameter (sc10=1024.d0) - parameter (sc20=sc10*sc10) - parameter (sc40=sc20*sc20) -c - cp(1) = 0. - ma = iabs(m) - if(ma .gt. n) return - if(n-1) 2,3,5 - 2 cp(1) = dsqrt(2.d0) - return - 3 if(ma .ne. 0) go to 4 - cp(1) = dsqrt(1.5d0) - return - 4 cp(1) = dsqrt(.75d0) - if(m .eq. -1) cp(1) = -cp(1) - return - 5 if(mod(n+ma,2) .ne. 0) go to 10 - nmms2 = (n-ma)/2 - fnum = n+ma+1 - fnmh = n-ma+1 - pm1 = 1.d0 - go to 15 - 10 nmms2 = (n-ma-1)/2 - fnum = n+ma+2 - fnmh = n-ma+2 - pm1 = -1.d0 - 15 t1 = 1.d0/sc20 - nex = 20 - fden = 2.d0 - if(nmms2 .lt. 1) go to 20 - do 18 i=1,nmms2 - t1 = fnum*t1/fden - if(t1 .gt. sc20) then - t1 = t1/sc40 - nex = nex+40 - end if - fnum = fnum+2. - fden = fden+2. - 18 continue - 20 t1 = t1/2.d0**(n-1-nex) - if(mod(ma/2,2) .ne. 0) t1 = -t1 - t2 = 1. - if(ma .eq. 0) go to 26 - do 25 i=1,ma - t2 = fnmh*t2/(fnmh+pm1) - fnmh = fnmh+2. - 25 continue - 26 cp2 = t1*dsqrt((n+.5d0)*t2) - fnnp1 = n*(n+1) - fnmsq = fnnp1-2.d0*ma*ma - l = (n+1)/2 - if(mod(n,2) .eq. 0 .and. mod(ma,2) .eq. 0) l = l+1 - cp(l) = cp2 - if(m .ge. 0) go to 29 - if(mod(ma,2) .ne. 0) cp(l) = -cp(l) - 29 if(l .le. 1) return - fk = n - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = 2.*(fk*fk-fnmsq) - cp(l-1) = b1*cp(l)/a1 - 30 l = l-1 - if(l .le. 1) return - fk = fk-2. - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = -2.*(fk*fk-fnmsq) - c1 = (fk+1.)*(fk+2.)-fnnp1 - cp(l-1) = -(b1*cp(l)+c1*cp(l+1))/a1 - go to 30 - end - subroutine dlftg (m,n,theta,cp,pb) - dimension cp(1) - double precision cp,pb,theta,cdt,sdt,cth,sth,chh - cdt = dcos(theta+theta) - sdt = dsin(theta+theta) - nmod=mod(n,2) - mmod=mod(abs(m),2) - if(nmod)1,1,2 -1 if(mmod)3,3,4 -c -c n even, m even -c -3 kdo=n/2 - pb = .5*cp(1) - if(n .eq. 0) return - cth = cdt - sth = sdt - do 170 k=1,kdo -c pb = pb+cp(k+1)*dcos(2*k*theta) - pb = pb+cp(k+1)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 170 continue - return -c -c n even, m odd -c - 4 kdo = n/2 - pb = 0. - cth = cdt - sth = sdt - do 180 k=1,kdo -c pb = pb+cp(k)*dsin(2*k*theta) - pb = pb+cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 180 continue - return -2 if(mmod)13,13,14 -c -c n odd, m even -c -13 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 190 k=1,kdo -c pb = pb+cp(k)*dcos((2*k-1)*theta) - pb = pb+cp(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 190 continue - return -c -c n odd, m odd -c - 14 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 200 k=1,kdo -c pb = pb+cp(k)*dsin((2*k-1)*theta) - pb = pb+cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 200 continue - return - end -c - subroutine gaqdp(nlat,theta,wts,w,lwork,ierror) -c -c April 2002 -c -c gauss points and weights are computed using the fourier-newton -c described in "on computing the points and weights for -c gauss-legendre quadrature", paul n. swarztrauber, siam journal -c on scientific computing that has been accepted for publication. -c This routine is faster and more accurate than older program -c with the same name. -c -c subroutine gaqdp computes the nlat gaussian colatitudes and weights -c in double precision. the colatitudes are in radians and lie in the -c in the interval (0,pi). -c -c input parameters -c -c nlat the number of gaussian colatitudes in the interval (0,pi) -c (between the two poles). nlat must be greater than zero. -c -c w unused variable that permits a simple exchange with the -c old routine with the same name in spherepack. -c -c lwork unused variable that permits a simple exchange with the -c old routine with the same name in spherepack. -c -c output parameters -c -c theta a double precision array with length nlat -c containing the gaussian colatitudes in -c increasing radians on the interval (0,pi). -c -c wts a double precision array with lenght nlat -c containing the gaussian weights. -c -c ierror = 0 no errors -c = 1 if nlat.le.0 -c -c ***************************************************************** -c - double precision theta(nlat),wts(nlat), - 1 x,pi,pis2,dtheta,dthalf,cmax,zprev,zlast,zero, - 2 zhold,pb,dpb,dcor,sum,w,cz -c -c check work space length -c - ierror = 1 - if (nlat.le.0) return - ierror = 0 -c -c compute weights and points analytically when nlat=1,2 -c - if (nlat.eq.1) then - theta(1) = dacos(0.0d0) - wts(1) = 2.0d0 - return - end if - if (nlat.eq.2) then - x = dsqrt(1.0d0/3.0d0) - theta(1) = dacos(x) - theta(2) = dacos(-x) - wts(1) = 1.0d0 - wts(2) = 1.0d0 - return - end if - eps = sqrt(dzepp(1.0d0)) - eps = eps*sqrt(eps) - pis2 = 2.0d0*datan(1.0d0) - pi = pis2+pis2 - mnlat = mod(nlat,2) - ns2 = nlat/2 - nhalf = (nlat+1)/2 - idx = ns2+2 -c - call cpdp1 (nlat,cz,theta(ns2+1),wts(ns2+1)) -c - dtheta = pis2/nhalf - dthalf = dtheta/2.0d0 - cmax = .2d0*dtheta -c -c estimate first point next to theta = pi/2 -c - if(mnlat.ne.0) then - zero = pis2-dtheta - zprev = pis2 - nix = nhalf-1 - else - zero = pis2-dthalf - nix = nhalf - end if - 9 it = 0 - 10 it = it+1 - zlast = zero -c -c newton iterations -c - call tpdp1 (nlat,zero,cz,theta(ns2+1),wts(ns2+1),pb,dpb) - dcor = pb/dpb - sgnd = 1.0 - if(dcor .ne. 0.0d0) sgnd = dcor/dabs(dcor) - dcor = sgnd*min(dabs(dcor),cmax) - zero = zero-dcor - if(dabs(zero-zlast).gt.eps*dabs(zero)) go to 10 - theta(nix) = zero - zhold = zero -c wts(nix) = (nlat+nlat+1)/(dpb*dpb) -c -c yakimiw's formula permits using old pb and dpb -c - wts(nix) = (nlat+nlat+1)/(dpb+pb*dcos(zlast)/dsin(zlast))**2 - nix = nix-1 - if(nix.eq.0) go to 30 - if(nix.eq.nhalf-1) zero = 3.0*zero-pi - if(nix.lt.nhalf-1) zero = zero+zero-zprev - zprev = zhold - go to 9 -c -c extend points and weights via symmetries -c - 30 if(mnlat.ne.0) then - theta(nhalf) = pis2 - call tpdp1 (nlat,pis2,cz,theta(ns2+1),wts(ns2+1),pb,dpb) - wts(nhalf) = (nlat+nlat+1)/(dpb*dpb) - end if - do i=1,ns2 - wts(nlat-i+1) = wts(i) - theta(nlat-i+1) = pi-theta(i) - end do - sum = 0.0d0 - do i=1,nlat - sum = sum+wts(i) - end do - do i=1,nlat - wts(i) = 2.0d0*wts(i)/sum - end do - return - end - subroutine cpdp1(n,cz,cp,dcp) -c -c computes the fourier coefficients of the legendre -c polynomial p_n^0 and its derivative. -c n is the degree and n/2 or (n+1)/2 -c coefficients are returned in cp depending on whether -c n is even or odd. The same number of coefficients -c are returned in dcp. For n even the constant -c coefficient is returned in cz. -c - double precision cp(n/2+1),dcp(n/2+1), - 1 t1,t2,t3,t4,cz - ncp = (n+1)/2 - t1 = -1.0d0 - t2 = n+1.0d0 - t3 = 0.0d0 - t4 = n+n+1.0d0 - if(mod(n,2).eq.0) then - cp(ncp) = 1.0d0 - do j = ncp,2,-1 - t1 = t1+2.0d0 - t2 = t2-1.0d0 - t3 = t3+1.0d0 - t4 = t4-2.0d0 - cp(j-1) = (t1*t2)/(t3*t4)*cp(j) - end do - t1 = t1+2.0d0 - t2 = t2-1.0d0 - t3 = t3+1.0d0 - t4 = t4-2.0d0 - cz = (t1*t2)/(t3*t4)*cp(1) - do j=1,ncp - dcp(j) = (j+j)*cp(j) - end do - else - cp(ncp) = 1.0d0 - do j = ncp-1,1,-1 - t1 = t1+2.0d0 - t2 = t2-1.0d0 - t3 = t3+1.0d0 - t4 = t4-2.0d0 - cp(j) = (t1*t2)/(t3*t4)*cp(j+1) - end do - do j=1,ncp - dcp(j) = (j+j-1)*cp(j) - end do - end if - return - end - subroutine tpdp1 (n,theta,cz,cp,dcp,pb,dpb) -c -c computes pn(theta) and its derivative dpb(theta) with -c respect to theta -c - double precision cp(n/2+1),dcp(n/2+1),cz, - 1 pb,dpb,fn,theta,cdt,sdt,cth,sth,chh -c - fn = n - cdt = dcos(theta+theta) - sdt = dsin(theta+theta) - if(mod(n,2) .eq.0) then -c -c n even -c - kdo = n/2 - pb = .5d0*cz - dpb = 0.0d0 - if(n .gt. 0) then - cth = cdt - sth = sdt - do 170 k=1,kdo -c pb = pb+cp(k)*cos(2*k*theta) - pb = pb+cp(k)*cth -c dpb = dpb-(k+k)*cp(k)*sin(2*k*theta) - dpb = dpb-dcp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 170 continue - end if - else -c -c n odd -c - kdo = (n+1)/2 - pb = 0.0d0 - dpb = 0.0d0 - cth = dcos(theta) - sth = dsin(theta) - do 190 k=1,kdo -c pb = pb+cp(k)*cos((2*k-1)*theta) - pb = pb+cp(k)*cth -c dpb = dpb-(k+k-1)*cp(k)*sin((2*k-1)*theta) - dpb = dpb-dcp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 190 continue - end if - return - end - real function dzepp (x) - double precision x -c -c estimate unit roundoff in quantities of size x. -c - double precision a,b,c,eps -c -c this program should function properly on all systems -c satisfying the following two assumptions, -c 1. the base used in representing floating point -c numbers is not a power of three. -c 2. the quantity a in statement 10 is represented to -c the accuracy used in floating point variables -c that are stored in memory. -c the statement number 10 and the go to 10 are intended to -c force optimizing compilers to generate code satisfying -c assumption 2. -c under these assumptions, it should be true that, -c a is not exactly equal to four-thirds, -c b has a zero for its last bit or digit, -c c is not exactly equal to one, -c eps measures the separation of 1.0 from -c the next larger floating point number. -c the developers of eispack would appreciate being informed -c about any systems where these assumptions do not hold. -c -c this version dated 4/6/83. -c - a = 4.0d0/3.0d0 - 10 b = a - 1.0d0 - c = b + b + b - eps = abs(c-1.0d0) - if (eps .eq. 0.0d0) go to 10 - dzepp = eps*dabs(x) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shsec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shsec.f deleted file mode 100755 index 8ccc488d5..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shsec.f +++ /dev/null @@ -1,498 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file shsec.f -c -c this file contains code and documentation for subroutines -c shsec and shseci -c -c ... files which must be loaded with shsec.f -c -c sphcom.f, hrfft.f -c -c subroutine shsec(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c + wshsec,lshsec,work,lwork,ierror) -c -c subroutine shsec performs the spherical harmonic synthesis -c on the arrays a and b and stores the result in the array g. -c the synthesis is performed on an equally spaced grid. the -c associated legendre functions are recomputed rather than stored -c as they are in subroutine shses. the synthesis is described -c below at output parameter g. -c -c required files from spherepack2 -c -c sphcom.f, hrfft.f -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the synthesis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the synthesis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls shsec, -c the arrays g,a and b can be three dimensional in which -c case multiple syntheses will be performed. the third -c index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c idg the first dimension of the array g as it appears in the -c program that calls shsec. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg -c must be at least nlat/2 if nlat is even or at least -c (nlat+1)/2 if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shsec. jdg must be at least nlon. -c -c a,b two or three dimensional arrays (see the input parameter -c nt) that contain the coefficients in the spherical harmonic -c expansion of g(i,j) given below at the definition of the -c output parameter g. a(m,n) and b(m,n) are defined for -c indices m=1,...,mmax and n=m,...,nlat where mmax is the -c maximum (plus one) longitudinal wave number given by -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shsec. mdab must be at least -c min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shsec. ndab must be at least nlat -c -c wshsec an array which must be initialized by subroutine shseci. -c once initialized, wshsec can be used repeatedly by shsec -c as long as nlon and nlat remain unchanged. wshsec must -c not be altered between calls of shsec. -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls shsec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shsec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*(nt*nlon+max0(3*l2,nlon)) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c g a two or three dimensional array (see input parameter -c nt) that contains the spherical harmonic synthesis of -c the arrays a and b at the colatitude point theta(i) = -c (i-1)*pi/(nlat-1) and longitude point phi(j) = -c (j-1)*2*pi/nlon. the index ranges are defined above at -c at the input parameter isym. for isym=0, g(i,j) is -c given by the the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c the normalized associated legendre functions are given by -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c define the maximum (plus one) longitudinal wave number -c as mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c then g(i,j) = the sum from n=0 to n=nlat-1 of -c -c .5*pbar(0,n,theta(i))*a(1,n+1) -c -c plus the sum from m=1 to m=mmax-1 of -c -c the sum from n=m to n=nlat-1 of -c -c pbar(m,n,theta(i))*(a(m+1,n+1)*cos(m*phi(j)) -c -b(m+1,n+1)*sin(m*phi(j))) -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshsec -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c subroutine shseci(nlat,nlon,wshsec,lshsec,dwork,ldwork,ierror) -c -c subroutine shseci initializes the array wshsec which can then -c be used repeatedly by subroutine shsec. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls shseci. the array wshsec is an output -c parameter which is described below. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c dwork a double precision work array that does not have to be -c saved. -c -c ldwork the dimension of array dwork as it appears in the program -c that calls shseci. ldwork must be at least nlat+1. -c -c output parameters -c -c wshsec an array which is initialized for use by subroutine shsec. -c once initialized, wshsec can be used repeatedly by shsec -c as long as nlon and nlat remain unchanged. wshsec must -c not be altered between calls of shsec. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshsec -c = 4 error in the specification of ldwork -c -c -c **************************************************************** - subroutine shsec(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshsec,lshsec,work,lwork,ierror) - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1),wshsec(1), - 1 work(1) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - if((isym.eq.0 .and. idg.lt.nlat) .or. - 1 (isym.ne.0 .and. idg.lt.(nlat+1)/2)) return - ierror = 6 - if(jdg .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - labc = 3*((mmax-2)*(nlat+nlat-mmax-1))/2 - if(lshsec .lt. lzz1+labc+nlon+15) return - ierror = 10 - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - if(lwork .lt. nln+max0(ls*nlon,3*nlat*imid)) return - ierror = 0 - ist = 0 - if(isym .eq. 0) ist = imid - iw1 = lzz1+labc+1 - call shsec1(nlat,isym,nt,g,idg,jdg,a,b,mdab,ndab,imid,ls,nlon, - 1 work,work(ist+1),work(nln+1),work(nln+1),wshsec,wshsec(iw1)) - return - end - subroutine shsec1(nlat,isym,nt,g,idgs,jdgs,a,b,mdab,ndab,imid, - 1 idg,jdg,ge,go,work,pb,walin,whrfft) -c -c whrfft must have at least nlon+15 locations -c walin must have 3*l*imid + 3*((l-3)*l+2)/2 locations -c zb must have 3*l*imid locations -c - dimension g(idgs,jdgs,1),a(mdab,ndab,1),b(mdab,ndab,1), - 1 ge(idg,jdg,1),go(idg,jdg,1),pb(imid,nlat,3),walin(1), - 3 whrfft(1),work(1) - ls = idg - nlon = jdg - mmax = min0(nlat,nlon/2+1) - mdo = mmax - if(mdo+mdo-1 .gt. nlon) mdo = mmax-1 - nlp1 = nlat+1 - modl = mod(nlat,2) - imm1 = imid - if(modl .ne. 0) imm1 = imid-1 - do 80 k=1,nt - do 80 j=1,nlon - do 80 i=1,ls - ge(i,j,k)=0. - 80 continue - if(isym .eq. 1) go to 125 - call alin (2,nlat,nlon,0,pb,i3,walin) - do 100 k=1,nt - do 100 np1=1,nlat,2 - do 100 i=1,imid - ge(i,1,k)=ge(i,1,k)+a(1,np1,k)*pb(i,np1,i3) - 100 continue - ndo = nlat - if(mod(nlat,2) .eq. 0) ndo = nlat-1 - do 110 mp1=2,mdo - m = mp1-1 - call alin (2,nlat,nlon,m,pb,i3,walin) - do 110 np1=mp1,ndo,2 - do 110 k=1,nt - do 110 i=1,imid - ge(i,2*mp1-2,k) = ge(i,2*mp1-2,k)+a(mp1,np1,k)*pb(i,np1,i3) - ge(i,2*mp1-1,k) = ge(i,2*mp1-1,k)+b(mp1,np1,k)*pb(i,np1,i3) - 110 continue - if(mdo .eq. mmax .or. mmax .gt. ndo) go to 122 - call alin (2,nlat,nlon,mdo,pb,i3,walin) - do 120 np1=mmax,ndo,2 - do 120 k=1,nt - do 120 i=1,imid - ge(i,2*mmax-2,k) = ge(i,2*mmax-2,k)+a(mmax,np1,k)*pb(i,np1,i3) - 120 continue - 122 if(isym .eq. 2) go to 155 - 125 call alin(1,nlat,nlon,0,pb,i3,walin) - do 140 k=1,nt - do 140 np1=2,nlat,2 - do 140 i=1,imm1 - go(i,1,k)=go(i,1,k)+a(1,np1,k)*pb(i,np1,i3) - 140 continue - ndo = nlat - if(mod(nlat,2) .ne. 0) ndo = nlat-1 - do 150 mp1=2,mdo - mp2 = mp1+1 - m = mp1-1 - call alin(1,nlat,nlon,m,pb,i3,walin) - do 150 np1=mp2,ndo,2 - do 150 k=1,nt - do 150 i=1,imm1 - go(i,2*mp1-2,k) = go(i,2*mp1-2,k)+a(mp1,np1,k)*pb(i,np1,i3) - go(i,2*mp1-1,k) = go(i,2*mp1-1,k)+b(mp1,np1,k)*pb(i,np1,i3) - 150 continue - mp2 = mmax+1 - if(mdo .eq. mmax .or. mp2 .gt. ndo) go to 155 - call alin(1,nlat,nlon,mdo,pb,i3,walin) - do 152 np1=mp2,ndo,2 - do 152 k=1,nt - do 152 i=1,imm1 - go(i,2*mmax-2,k) = go(i,2*mmax-2,k)+a(mmax,np1,k)*pb(i,np1,i3) - 152 continue - 155 do 160 k=1,nt - if(mod(nlon,2) .ne. 0) go to 157 - do 156 i=1,ls - ge(i,nlon,k) = 2.*ge(i,nlon,k) - 156 continue - 157 call hrfftb(ls,nlon,ge(1,1,k),ls,whrfft,work) - 160 continue - if(isym .ne. 0) go to 180 - do 170 k=1,nt - do 170 j=1,nlon - do 175 i=1,imm1 - g(i,j,k) = .5*(ge(i,j,k)+go(i,j,k)) - g(nlp1-i,j,k) = .5*(ge(i,j,k)-go(i,j,k)) - 175 continue - if(modl .eq. 0) go to 170 - g(imid,j,k) = .5*ge(imid,j,k) - 170 continue - return - 180 do 185 k=1,nt - do 185 i=1,imid - do 185 j=1,nlon - g(i,j,k) = .5*ge(i,j,k) - 185 continue - return - end -c subroutine shseci(nlat,nlon,wshsec,lshsec,dwork,ldwork,ierror) -c -c subroutine shseci initializes the array wshsec which can then -c be used repeatedly by subroutine shsec. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls shseci. the array wshsec is an output -c parameter which is described below. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c dwork a double precision work array that does not have to be -c saved. -c -c ldwork the dimension of array dwork as it appears in the program -c that calls shseci. ldwork must be at least nlat+1. -c -c output parameters -c -c wshsec an array which is initialized for use by subroutine shsec. -c once initialized, wshsec can be used repeatedly by shsec -c as long as nlon and nlat remain unchanged. wshsec must -c not be altered between calls of shsec. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshsec -c = 4 error in the specification of ldwork -c -c -c **************************************************************** - subroutine shseci(nlat,nlon,wshsec,lshsec,dwork,ldwork,ierror) - dimension wshsec(*) - double precision dwork(ldwork) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - imid = (nlat+1)/2 - mmax = min0(nlat,nlon/2+1) - lzz1 = 2*nlat*imid - labc = 3*((mmax-2)*(nlat+nlat-mmax-1))/2 - if(lshsec .lt. lzz1+labc+nlon+15) return - ierror = 4 - if(ldwork .lt. nlat+1) return - ierror = 0 - call alinit(nlat,nlon,wshsec,dwork) - iw1 = lzz1+labc+1 - call hrffti(nlon,wshsec(iw1)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shses.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shses.f deleted file mode 100755 index 6fbc9d5b2..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shses.f +++ /dev/null @@ -1,456 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shses.f -c -c this file contains code and documentation for subroutines -c shses and shsesi -c -c ... files which must be loaded with shses.f -c -c sphcom.f, hrfft.f -c -c subroutine shses(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c + wshses,lshses,work,lwork,ierror) -c -c subroutine shses performs the spherical harmonic synthesis -c on the arrays a and b and stores the result in the array g. -c the synthesis is performed on an equally spaced grid. the -c associated legendre functions are stored rather than recomputed -c as they are in subroutine shsec. the synthesis is described -c below at output parameter g. -c -c *** required files from spherepack2 -c -c sphcom.f, hrfft.f -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the synthesis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the synthesis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls shses, -c the arrays g,a and b can be three dimensional in which -c case multiple syntheses will be performed. the third -c index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c idg the first dimension of the array g as it appears in the -c program that calls shses. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg -c must be at least nlat/2 if nlat is even or at least -c (nlat+1)/2 if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shses. jdg must be at least nlon. -c -c a,b two or three dimensional arrays (see the input parameter -c nt) that contain the coefficients in the spherical harmonic -c expansion of g(i,j) given below at the definition of the -c output parameter g. a(m,n) and b(m,n) are defined for -c indices m=1,...,mmax and n=m,...,nlat where mmax is the -c maximum (plus one) longitudinal wave number given by -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shses. mdab must be at least -c min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shses. ndab must be at least nlat -c -c wshses an array which must be initialized by subroutine shsesi. -c once initialized, wshses can be used repeatedly by shses -c as long as nlon and nlat remain unchanged. wshses must -c not be altered between calls of shses. -c -c lshses the dimension of the array wshses as it appears in the -c program that calls shses. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shses. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c (nt+1)*nlat*nlon -c -c if isym is nonzero lwork must be at least -c -c (nt+1)*l2*nlon. -c -c ************************************************************** -c -c output parameters -c -c g a two or three dimensional array (see input parameter -c nt) that contains the spherical harmonic synthesis of -c the arrays a and b at the colatitude point theta(i) = -c (i-1)*pi/(nlat-1) and longitude point phi(j) = -c (j-1)*2*pi/nlon. the index ranges are defined above at -c at the input parameter isym. for isym=0, g(i,j) is -c given by the the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c the normalized associated legendre functions are given by -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c define the maximum (plus one) longitudinal wave number -c as mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c then g(i,j) = the sum from n=0 to n=nlat-1 of -c -c .5*pbar(0,n,theta(i))*a(1,n+1) -c -c plus the sum from m=1 to m=mmax-1 of -c -c the sum from n=m to n=nlat-1 of -c -c pbar(m,n,theta(i))*(a(m+1,n+1)*cos(m*phi(j)) -c -b(m+1,n+1)*sin(m*phi(j))) -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshses -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c subroutine shsesi(nlat,nlon,wshses,lshses,work,lwork,dwork, -c + ldwork,ierror) -c -c subroutine shsesi initializes the array wshses which can then -c be used repeatedly by subroutine shses. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c lshses the dimension of the array wshses as it appears in the -c program that calls shsesi. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a real work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in -c the program that calls shsesi. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwork must be at least -c -c 5*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2 -c -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls shsesi. ldwork must be at least nlat+1 -c -c -c output parameters -c -c wshses an array which is initialized for use by subroutine shses. -c once initialized, wshses can be used repeatedly by shses -c as long as nlon and nlat remain unchanged. wshses must -c not be altered between calls of shses. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshses -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c -c **************************************************************** - subroutine shses(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshses,lshses,work,lwork,ierror) - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1),wshses(1), - 1 work(1) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - if(isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - if((isym.eq.0 .and. idg.lt.nlat) .or. - 1 (isym.ne.0 .and. idg.lt.(nlat+1)/2)) return - ierror = 6 - if(jdg .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 10 - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - if(lwork.lt. nln+ls*nlon) return - ierror = 0 - ist = 0 - if(isym .eq. 0) ist = imid - call shses1(nlat,isym,nt,g,idg,jdg,a,b,mdab,ndab,wshses,imid, - 1 ls,nlon,work,work(ist+1),work(nln+1),wshses(lpimn+1)) - return - end - subroutine shses1(nlat,isym,nt,g,idgs,jdgs,a,b,mdab,ndab,p,imid, - 1 idg,jdg,ge,go,work,whrfft) - dimension g(idgs,jdgs,1),a(mdab,ndab,1),b(mdab,ndab,1),p(imid,1), - 1 ge(idg,jdg,1),go(idg,jdg,1),work(1),whrfft(1) - ls = idg - nlon = jdg - mmax = min0(nlat,nlon/2+1) - mdo = mmax - if(mdo+mdo-1 .gt. nlon) mdo = mmax-1 - nlp1 = nlat+1 - modl = mod(nlat,2) - imm1 = imid - if(modl .ne. 0) imm1 = imid-1 - do 80 k=1,nt - do 80 j=1,nlon - do 80 i=1,ls - ge(i,j,k) = 0. - 8000 continue - 800 continue - 80 continue - if(isym .eq. 1) go to 125 - do 100 k=1,nt - do 100 np1=1,nlat,2 - do 100 i=1,imid - ge(i,1,k)=ge(i,1,k)+a(1,np1,k)*p(i,np1) - 100 continue - ndo = nlat - if(mod(nlat,2) .eq. 0) ndo = nlat-1 - do 110 mp1=2,mdo - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - do 110 np1=mp1,ndo,2 - mn = mb+np1 - do 110 k=1,nt - do 110 i=1,imid - ge(i,2*mp1-2,k) = ge(i,2*mp1-2,k)+a(mp1,np1,k)*p(i,mn) - ge(i,2*mp1-1,k) = ge(i,2*mp1-1,k)+b(mp1,np1,k)*p(i,mn) - 110 continue - if(mdo .eq. mmax .or. mmax .gt. ndo) go to 122 - mb = mdo*(nlat-1)-(mdo*(mdo-1))/2 - do 120 np1=mmax,ndo,2 - mn = mb+np1 - do 120 k=1,nt - do 120 i=1,imid - ge(i,2*mmax-2,k) = ge(i,2*mmax-2,k)+a(mmax,np1,k)*p(i,mn) - 120 continue - 122 if(isym .eq. 2) go to 155 - 125 do 140 k=1,nt - do 140 np1=2,nlat,2 - do 140 i=1,imm1 - go(i,1,k)=go(i,1,k)+a(1,np1,k)*p(i,np1) - 140 continue - ndo = nlat - if(mod(nlat,2) .ne. 0) ndo = nlat-1 - do 150 mp1=2,mdo - mp2 = mp1+1 - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - do 150 np1=mp2,ndo,2 - mn = mb+np1 - do 150 k=1,nt - do 150 i=1,imm1 - go(i,2*mp1-2,k) = go(i,2*mp1-2,k)+a(mp1,np1,k)*p(i,mn) - go(i,2*mp1-1,k) = go(i,2*mp1-1,k)+b(mp1,np1,k)*p(i,mn) - 150 continue - mp2 = mmax+1 - if(mdo .eq. mmax .or. mp2 .gt. ndo) go to 155 - mb = mdo*(nlat-1)-(mdo*(mdo-1))/2 - do 152 np1=mp2,ndo,2 - mn = mb+np1 - do 152 k=1,nt - do 152 i=1,imm1 - go(i,2*mmax-2,k) = go(i,2*mmax-2,k)+a(mmax,np1,k)*p(i,mn) - 152 continue - 155 do 160 k=1,nt - if(mod(nlon,2) .ne. 0) go to 157 - do 156 i=1,ls - ge(i,nlon,k) = 2.*ge(i,nlon,k) - 156 continue - 157 call hrfftb(ls,nlon,ge(1,1,k),ls,whrfft,work) - 160 continue - if(isym .ne. 0) go to 180 - do 170 k=1,nt - do 170 j=1,nlon - do 175 i=1,imm1 - g(i,j,k) = .5*(ge(i,j,k)+go(i,j,k)) - g(nlp1-i,j,k) = .5*(ge(i,j,k)-go(i,j,k)) - 175 continue - if(modl .eq. 0) go to 170 - g(imid,j,k) = .5*ge(imid,j,k) - 170 continue - return - 180 do 185 k=1,nt - do 185 i=1,imid - do 185 j=1,nlon - g(i,j,k) = .5*ge(i,j,k) - 185 continue - return - end - - subroutine shsesi(nlat,nlon,wshses,lshses,work,lwork,dwork, - + ldwork,ierror) - dimension wshses(*),work(*) - double precision dwork(*) - ierror = 1 - if(nlat.lt.3) return - ierror = 2 - if(nlon.lt.4) return - ierror = 3 - mmax = min0(nlat,nlon/2+1) - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 4 - labc = 3*((mmax-2)*(nlat+nlat-mmax-1))/2 - if(lwork .lt. 5*nlat*imid + labc) return - ierror = 5 - if (ldwork .lt. nlat+1) return - ierror = 0 - iw1 = 3*nlat*imid+1 - CALL SES1(NLAT,NLON,IMID,WSHSES,WORK,WORK(IW1),DWORK) - call hrffti(nlon,wshses(lpimn+1)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shsgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shsgc.f deleted file mode 100755 index 4e2961ac1..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shsgc.f +++ /dev/null @@ -1,620 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file shsgc.f -c -c this file contains code and documentation for subroutines -c shsgc and shsgci -c -c ... files which must be loaded with shsgc.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c subroutine shsgc(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c + wshsgc,lshsgc,work,lwork,ierror) -c -c subroutine shsgc performs the spherical harmonic synthesis -c on the arrays a and b and stores the result in the array g. -c the synthesis is performed on an equally spaced longitude grid -c and a gaussian colatitude grid. the associated legendre functions -c are recomputed rather than stored as they are in subroutine -c shsgs. the synthesis is described below at output parameter -c g. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the synthesis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the synthesis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls shsgc, -c the arrays g,a and b can be three dimensional in which -c case multiple synthesis will be performed. the third -c index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c idg the first dimension of the array g as it appears in the -c program that calls shsgc. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg must -c be at least nlat/2 if nlat is even or at least (nlat+1)/2 -c if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shsgc. jdg must be at least nlon. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shsgc. mdab must be at least -c min0((nlon+2)/2,nlat) if nlon is even or at least -c min0((nlon+1)/2,nlat) if nlon is odd -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shsgc. ndab must be at least nlat -c -c a,b two or three dimensional arrays (see the input parameter -c nt) that contain the coefficients in the spherical harmonic -c expansion of g(i,j) given below at the definition of the -c output parameter g. a(m,n) and b(m,n) are defined for -c indices m=1,...,mmax and n=m,...,nlat where mmax is the -c maximum (plus one) longitudinal wave number given by -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c wshsgc an array which must be initialized by subroutine shsgci. -c once initialized, wshsgc can be used repeatedly by shsgc -c as long as nlat and nlon remain unchanged. wshsgc must -c not be altered between calls of shsgc. -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls shsgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls shsgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if isym is zero then lwork must be at least -c -c nlat*(nlon*nt+max0(3*l2,nlon)) -c -c if isym is not zero then lwork must be at least -c -c l2*(nlon*nt+max0(3*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c g a two or three dimensional array (see input parameter nt) -c that contains the discrete function which is synthesized. -c g(i,j) contains the value of the function at the gaussian -c colatitude point theta(i) and longitude point -c phi(j) = (j-1)*2*pi/nlon. the index ranges are defined -c above at the input parameter isym. for isym=0, g(i,j) -c is given by the the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c the normalized associated legendre functions are given by -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c -c define the maximum (plus one) longitudinal wave number -c as mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c then g(i,j) = the sum from n=0 to n=nlat-1 of -c -c .5*pbar(0,n,theta(i))*a(1,n+1) -c -c plus the sum from m=1 to m=mmax-1 of -c -c the sum from n=m to n=nlat-1 of -c -c pbar(m,n,theta(i))*(a(m+1,n+1)*cos(m*phi(j)) -c -b(m+1,n+1)*sin(m*phi(j))) -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lwshig -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c -c subroutine shsgci(nlat,nlon,wshsgc,lshsgc,dwork,ldwork,ierror) -c -c subroutine shsgci initializes the array wshsgc which can then -c be used repeatedly by subroutines shsgc. it precomputes -c and stores in wshsgc quantities such as gaussian weights, -c legendre polynomial coefficients, and fft trigonometric tables. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c wshsgc an array which must be initialized by subroutine shsgci. -c once initialized, wshsgc can be used repeatedly by shsgc -c as long as nlat and nlon remain unchanged. wshsgc must -c not be altered between calls of shsgc. -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls shsgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls shsgci. ldwork must be at least -c -c nlat*(nlat+4) -c -c output parameter -c -c wshsgc an array which must be initialized before calling shsgc. -c once initialized, wshsgc can be used repeatedly by shsgc -c as long as nlat and nlon remain unchanged. wshsgc must not -c altered between calls of shsgc. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshsgc -c = 4 error in the specification of ldwork -c = 5 failure in gaqd to compute gaussian points -c (due to failure in eigenvalue routine) -c -c -c **************************************************************** - subroutine shsgc(nlat,nlon,mode,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshsgc,lshsgc,work,lwork,ierror) -c subroutine shsgc performs the spherical harmonic synthesis on -c a gaussian grid using the coefficients in array(s) a,b and returns -c the results in array(s) g. the legendre polynomials are computed -c as needed in this version. -c - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1), - 1 wshsgc(lshsgc),work(lwork) -c check input parameters - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return - ierror = 3 - if (mode.lt.0 .or.mode.gt.2) return - ierror = 4 - if (nt.lt.1) return -c set limit for m iin a(m,n),b(m,n) computation - l = min0((nlon+2)/2,nlat) -c set gaussian point nearest equator pointer - late = (nlat+mod(nlat,2))/2 -c set number of grid points for analysis/synthesis - lat = nlat - if (mode.ne.0) lat = late - ierror = 5 - if (idg.lt.lat) return - ierror = 6 - if (jdg.lt.nlon) return - ierror = 7 - if(mdab .lt. l) return - ierror = 8 - if(ndab .lt. nlat) return - l1 = l - l2 = late - ierror = 9 -c check permanent work space length - if (lshsgc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 10 -c check temporary work space length - if (mode.eq.0) then - if(lwork.lt.nlat*(nlon*nt+max0(3*l2,nlon)))return - else -c mode.ne.0 - if(lwork.lt.l2*(nlon*nt+max0(3*nlat,nlon))) return - end if - ierror = 0 -c starting address fft values - ifft = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+1 -c set pointers for internal storage of g and legendre polys - ipmn = lat*nlon*nt+1 - call shsgc1(nlat,nlon,l,lat,mode,g,idg,jdg,nt,a,b,mdab,ndab, - 1wshsgc,wshsgc(ifft),late,work(ipmn),work) - return - end - subroutine shsgc1(nlat,nlon,l,lat,mode,gs,idg,jdg,nt,a,b,mdab, - 1 ndab,w,wfft,late,pmn,g) - dimension gs(idg,jdg,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension w(1),pmn(nlat,late,3),g(lat,nlon,nt),wfft(1) -c reconstruct fourier coefficients in g on gaussian grid -c using coefficients in a,b -c set m+1 limit for b coefficient calculation - lm1 = l - if (nlon .eq. l+l-2) lm1 = l-1 -c initialize to zero - do 100 k=1,nt - do 100 j=1,nlon - do 100 i=1,lat - g(i,j,k) = 0.0 - 100 continue - if (mode.eq.0) then -c set first column in g - m = 0 -c compute pmn for all i and n=m,...,l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 101 k=1,nt -c n even - do 102 np1=1,nlat,2 - do 102 i=1,late - g(i,1,k) = g(i,1,k)+a(1,np1,k)*pmn(np1,i,km) - 102 continue -c n odd - nl2 = nlat/2 - do 103 np1=2,nlat,2 - do 103 i=1,nl2 - is = nlat-i+1 - g(is,1,k) = g(is,1,k)+a(1,np1,k)*pmn(np1,i,km) - 103 continue -c restore m=0 coefficents (reverse implicit even/odd reduction) - do 112 i=1,nl2 - is = nlat-i+1 - t1 = g(i,1,k) - t3 = g(is,1,k) - g(i,1,k) = t1+t3 - g(is,1,k) = t1-t3 - 112 continue - 101 continue -c sweep columns of g for which b is available - do 104 mp1=2,lm1 - m = mp1-1 - mp2 = m+2 -c compute pmn for all i and n=m,...,l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 105 k=1,nt -c for n-m even store (g(i,p,k)+g(nlat-i+1,p,k))/2 in g(i,p,k) p=2*m, -c for i=1,...,late - do 106 np1=mp1,nlat,2 - do 107 i=1,late - g(i,2*m,k) = g(i,2*m,k)+a(mp1,np1,k)*pmn(np1,i,km) - g(i,2*m+1,k) = g(i,2*m+1,k)+b(mp1,np1,k)*pmn(np1,i,km) - 107 continue - 106 continue -c for n-m odd store g(i,p,k)-g(nlat-i+1,p,k) in g(nlat-i+1,p,k) -c for i=1,...,nlat/2 (p=2*m,p=2*m+1) - do 108 np1=mp2,nlat,2 - do 109 i=1,nl2 - is = nlat-i+1 - g(is,2*m,k) = g(is,2*m,k)+a(mp1,np1,k)*pmn(np1,i,km) - g(is,2*m+1,k) = g(is,2*m+1,k)+b(mp1,np1,k)*pmn(np1,i,km) - 109 continue - 108 continue -c now set fourier coefficients using even-odd reduction above - do 110 i=1,nl2 - is = nlat-i+1 - t1 = g(i,2*m,k) - t2 = g(i,2*m+1,k) - t3 = g(is,2*m,k) - t4 = g(is,2*m+1,k) - g(i,2*m,k) = t1+t3 - g(i,2*m+1,k) = t2+t4 - g(is,2*m,k) = t1-t3 - g(is,2*m+1,k) = t2-t4 - 110 continue - 105 continue - 104 continue -c set last column (using a only) - if (nlon.eq. l+l-2) then - m = l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 111 k=1,nt -c n-m even - do 131 np1=l,nlat,2 - do 131 i=1,late - g(i,nlon,k) = g(i,nlon,k)+2.0*a(l,np1,k)*pmn(np1,i,km) - 131 continue - lp1 = l+1 -c n-m odd - do 132 np1=lp1,nlat,2 - do 132 i=1,nl2 - is = nlat-i+1 - g(is,nlon,k) = g(is,nlon,k)+2.0*a(l,np1,k)*pmn(np1,i,km) - 132 continue - do 133 i=1,nl2 - is = nlat-i+1 - t1 = g(i,nlon,k) - t3 = g(is,nlon,k) - g(i,nlon,k)= t1+t3 - g(is,nlon,k)= t1-t3 - 133 continue - 111 continue - end if - else -c half sphere (mode.ne.0) -c set first column in g - m = 0 - meo = 1 - if (mode.eq.1) meo = 2 - ms = m+meo -c compute pmn for all i and n=m,...,l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 113 k=1,nt - do 113 np1=ms,nlat,2 - do 113 i=1,late - g(i,1,k) = g(i,1,k)+a(1,np1,k)*pmn(np1,i,km) - 113 continue -c sweep interior columns of g - do 114 mp1=2,lm1 - m = mp1-1 - ms = m+meo -c compute pmn for all i and n=m,...,l-1 - call legin(mode,l,nlat,m,w,pmn,km) - do 115 k=1,nt - do 115 np1=ms,nlat,2 - do 115 i=1,late - g(i,2*m,k) = g(i,2*m,k)+a(mp1,np1,k)*pmn(np1,i,km) - g(i,2*m+1,k) = g(i,2*m+1,k)+b(mp1,np1,k)*pmn(np1,i,km) - 115 continue - 114 continue - if (nlon.eq.l+l-2) then -c set last column - m = l-1 - call legin(mode,l,nlat,m,w,pmn,km) - ns = l - if (mode.eq.1) ns = l+1 - do 116 k=1,nt - do 116 i=1,late - do 116 np1=ns,nlat,2 - g(i,nlon,k) = g(i,nlon,k)+2.0*a(l,np1,k)*pmn(np1,i,km) - 116 continue - end if - end if -c do inverse fourier transform - do 120 k=1,nt - call hrfftb(lat,nlon,g(1,1,k),lat,wfft,pmn) - 120 continue -c scale output in gs - do 122 k=1,nt - do 122 j=1,nlon - do 122 i=1,lat - gs(i,j,k) = 0.5*g(i,j,k) - 122 continue - return - end - subroutine shsgci(nlat,nlon,wshsgc,lshsgc,dwork,ldwork,ierror) -c this subroutine must be called before calling shsgc with -c fixed nlat,nlon. it precomputes quantites such as the gaussian -c points and weights, m=0,m=1 legendre polynomials, recursion -c recursion coefficients. - dimension wshsgc(lshsgc) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+mod(nlat,2))/2 - l1 = l - l2 = late - ierror = 3 -c check permanent work space length - if (lshsgc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 4 - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set pointers - i1 = 1 - i2 = i1+nlat - i3 = i2+nlat*late - i4 = i3+nlat*late - i5 = i4+l*(l-1)/2 +(nlat-l)*(l-1) - i6 = i5+l*(l-1)/2 +(nlat-l)*(l-1) - i7 = i6+l*(l-1)/2 +(nlat-l)*(l-1) -c set indices in temp work for double precision gaussian wts and pts - idth = 1 - idwts = idth+nlat - iw = idwts+nlat - call shsgci1(nlat,nlon,l,late,wshsgc(i1),wshsgc(i2),wshsgc(i3), - 1wshsgc(i4),wshsgc(i5),wshsgc(i6),wshsgc(i7),dwork(idth), - 2dwork(idwts),dwork(iw),ierror) - if (ierror.ne.0) ierror = 5 - return - end - subroutine shsgci1(nlat,nlon,l,late,wts,p0n,p1n,abel,bbel,cbel, - 1 wfft,dtheta,dwts,work,ier) - dimension wts(nlat),p0n(nlat,late),p1n(nlat,late),abel(1),bbel(1), - 1 cbel(1),wfft(1),dtheta(nlat),dwts(nlat) - double precision pb,dtheta,dwts,work(*) -c compute the nlat gaussian points and weights, the -c m=0,1 legendre polys for gaussian points and all n, -c and the legendre recursion coefficients -c define index function used in storing -c arrays for recursion coefficients (functions of (m,n)) -c the index function indx(m,n) is defined so that -c the pairs (m,n) map to [1,2,...,indx(l-1,l-1)] with no -c "holes" as m varies from 2 to n and n varies from 2 to l-1. -c (m=0,1 are set from p0n,p1n for all n) -c define for 2.le.n.le.l-1 - indx(m,n) = (n-1)*(n-2)/2+m-1 -c define index function for l.le.n.le.nlat - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 -c preset quantites for fourier transform - call hrffti(nlon,wfft) -c compute double precision gaussian points and weights -c lw = 4*nlat*(nlat+1)+2 - lw = nlat*(nlat+2) - call gaqd(nlat,dtheta,dwts,work,lw,ier) - if (ier.ne.0) return -c store gaussian weights single precision to save computation -c in inner loops in analysis - do 100 i=1,nlat - wts(i) = dwts(i) - 100 continue -c initialize p0n,p1n using double precision dnlfk,dnlft - do 101 np1=1,nlat - do 101 i=1,late - p0n(np1,i) = 0.0 - p1n(np1,i) = 0.0 - 101 continue -c compute m=n=0 legendre polynomials for all theta(i) - np1 = 1 - n = 0 - m = 0 - call dnlfk(m,n,work) - do 103 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(1,i) = pb - 103 continue -c compute p0n,p1n for all theta(i) when n.gt.0 - do 104 np1=2,nlat - n = np1-1 - m = 0 - call dnlfk(m,n,work) - do 105 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(np1,i) = pb - 105 continue -c compute m=1 legendre polynomials for all n and theta(i) - m = 1 - call dnlfk(m,n,work) - do 106 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p1n(np1,i) = pb - 106 continue - 104 continue -c compute and store swarztrauber recursion coefficients -c for 2.le.m.le.n and 2.le.n.le.nlat in abel,bbel,cbel - do 107 n=2,nlat - mlim = min0(n,l) - do 107 m=2,mlim - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/ - 1 float(((n+m-1)*(n+m)))) - 107 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/shsgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/shsgs.f deleted file mode 100755 index ff253cbdd..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/shsgs.f +++ /dev/null @@ -1,698 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file shsgs.f -c -c this file contains code and documentation for subroutines -c shsgs and shsgsi -c -c ... files which must be loaded with shsgs.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c subroutine shsgs(nlat,nlon,isym,nt,g,idg,jdg,a,b,mdab,ndab, -c 1 wshsgs,lshsgs,work,lwork,ierror) -c -c subroutine shsgs performs the spherical harmonic synthesis -c on the arrays a and b and stores the result in the array g. -c the synthesis is performed on an equally spaced longitude grid -c and a gaussian colatitude grid. the associated legendre functions -c are stored rather than recomputed as they are in subroutine -c shsgc. the synthesis is described below at output parameter -c g. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c isym = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c array g(i,j) for i=1,...,nlat and j=1,...,nlon. -c (see description of g below) -c -c = 1 g is antisymmetric about the equator. the synthesis -c is performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c = 2 g is symmetric about the equator. the synthesis is -c performed on the northern hemisphere only. i.e. -c if nlat is odd the synthesis is performed on the -c array g(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the synthesis is performed on the -c array g(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls shsgs, -c the arrays g,a and b can be three dimensional in which -c case multiple synthesis will be performed. the third -c index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that the arrays g,a and b -c have only two dimensions. -c -c idg the first dimension of the array g as it appears in the -c program that calls shagc. if isym equals zero then idg -c must be at least nlat. if isym is nonzero then idg must -c be at least nlat/2 if nlat is even or at least (nlat+1)/2 -c if nlat is odd. -c -c jdg the second dimension of the array g as it appears in the -c program that calls shagc. jdg must be at least nlon. -c -c a,b two or three dimensional arrays (see the input parameter -c nt) that contain the coefficients in the spherical harmonic -c expansion of g(i,j) given below at the definition of the -c output parameter g. a(m,n) and b(m,n) are defined for -c indices m=1,...,mmax and n=m,...,nlat where mmax is the -c maximum (plus one) longitudinal wave number given by -c mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls shsgs. mdab must be at least -c min0((nlon+2)/2,nlat) if nlon is even or at least -c min0((nlon+1)/2,nlat) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls shsgs. ndab must be at least nlat -c -c wshsgs an array which must be initialized by subroutine shsgsi. -c once initialized, wshsgs can be used repeatedly by shsgs -c as long as nlat and nlon remain unchanged. wshsgs must -c not be altered between calls of shsgs. -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls shsgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c -c lwork the dimension of the array work as it appears in the -c program that calls shsgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c -c if isym is zero then lwork must be at least -c -c nlat*nlon*(nt+1) -c -c if isym is nonzero then lwork must be at least -c -c l2*nlon*(nt+1) -c -c -c ************************************************************** -c -c output parameters -c -c g a two or three dimensional array (see input parameter nt) -c that contains the discrete function which is synthesized. -c g(i,j) contains the value of the function at the gaussian -c colatitude point theta(i) and longitude point -c phi(j) = (j-1)*2*pi/nlon. the index ranges are defined -c above at the input parameter isym. for isym=0, g(i,j) -c is given by the the equations listed below. symmetric -c versions are used when isym is greater than zero. -c -c the normalized associated legendre functions are given by -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) -c *sin(theta)**m/(2**n*factorial(n)) times the -c (n+m)th derivative of (x**2-1)**n with respect -c to x=cos(theta) -c -c define the maximum (plus one) longitudinal wave number -c as mmax = min0(nlat,(nlon+2)/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c then g(i,j) = the sum from n=0 to n=nlat-1 of -c -c .5*pbar(0,n,theta(i))*a(1,n+1) -c -c plus the sum from m=1 to m=mmax-1 of -c -c the sum from n=m to n=nlat-1 of -c -c pbar(m,n,theta(i))*(a(m+1,n+1)*cos(m*phi(j)) -c -b(m+1,n+1)*sin(m*phi(j))) -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of idg -c = 6 error in the specification of jdg -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lshsgs -c = 10 error in the specification of lwork -c -c -c **************************************************************** -c -c subroutine shsgsi(nlat,nlon,wshsgs,lshsgs,work,lwork,dwork,ldwork, -c + ierror) -c -c subroutine shsgsi initializes the array wshsgs which can then -c be used repeatedly by subroutines shsgs. it precomputes -c and stores in wshsgs quantities such as gaussian weights, -c legendre polynomial coefficients, and fft trigonometric tables. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are compu -c in radians in theta(1),...,theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid poi -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c wshsgs an array which must be initialized by subroutine shsgsi. -c once initialized, wshsgs can be used repeatedly by shsgs -c as long as nlat and nlon remain unchanged. wshsgs must -c not be altered between calls of shsgs. -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls shsgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c work a real work space which need not be saved -c -c lwork the dimension of the array work as it appears in the -c program that calls shsgsi. lwork must be at least -c 4*nlat*(nlat+2)+2 in the routine calling shsgsi -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the length of dwork in the calling routine. ldwork must -c be at least nlat*(nlat+4) -c -c output parameter -c -c wshsgs an array which must be initialized before calling shsgs or -c once initialized, wshsgs can be used repeatedly by shsgs or -c as long as nlat and nlon remain unchanged. wshsgs must not -c altered between calls of shsgs. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lshsgs -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c = 5 failure in gaqd to compute gaussian points -c (due to failure in eigenvalue routine) -c -c - subroutine shsgs(nlat,nlon,mode,nt,g,idg,jdg,a,b,mdab,ndab, - 1 wshsgs,lshsgs,work,lwork,ierror) - dimension g(idg,jdg,1),a(mdab,ndab,1),b(mdab,ndab,1), - 1 wshsgs(lshsgs),work(lwork) -c check input parameters - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return - ierror = 3 - if (mode.lt.0 .or.mode.gt.2) return - ierror = 4 - if (nt.lt.1) return -c set limit on m subscript - l = min0((nlon+2)/2,nlat) -c set gaussian point nearest equator pointer - late = (nlat+mod(nlat,2))/2 -c set number of grid points for analysis/synthesis - lat = nlat - if (mode.ne.0) lat = late - ierror = 5 - if (idg.lt.lat) return - ierror = 6 - if (jdg.lt.nlon) return - ierror = 7 - if(mdab .lt. l) return - ierror = 8 - if(ndab .lt. nlat) return - l1 = l - l2 = late - ierror = 9 -c check permanent work space length - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return -c check temporary work space length - ierror = 10 - if (mode.eq.0 .and. lwork.lt.nlat*nlon*(nt+1)) return - if (mode.ne.0 .and. lwork.lt.l2*nlon*(nt+1)) return - ierror = 0 -c starting address for fft values and legendre polys in wshsgs - ifft = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+1 - ipmn = ifft+nlon+15 -c set pointer for internal storage of g - iw = lat*nlon*nt+1 - call shsgs1(nlat,nlon,l,lat,mode,g,idg,jdg,nt,a,b,mdab,ndab, - 1 wshsgs(ifft),wshsgs(ipmn),late,work,work(iw)) - return - end - - subroutine shsgs1(nlat,nlon,l,lat,mode,gs,idg,jdg,nt,a,b,mdab, - 1 ndab,wfft,pmn,late,g,work) - dimension gs(idg,jdg,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wfft(1),pmn(late,1),g(lat,nlon,nt),work(1) - -c reconstruct fourier coefficients in g on gaussian grid -c using coefficients in a,b - -c initialize to zero - do 100 k=1,nt - do 100 j=1,nlon - do 100 i=1,lat - g(i,j,k) = 0.0 - 100 continue - - lm1 = l - if (nlon .eq. l+l-2) lm1 = l-1 - if (mode.eq.0) then -c set first column in g - m = 0 - mml1 = m*(2*nlat-m-1)/2 - do 101 k=1,nt -c n even - do 102 np1=1,nlat,2 - mn = mml1+np1 - do 102 i=1,late - g(i,1,k) = g(i,1,k)+a(1,np1,k)*pmn(i,mn) - 102 continue -c n odd - nl2 = nlat/2 - do 103 np1=2,nlat,2 - mn = mml1+np1 - do 103 i=1,nl2 - is = nlat-i+1 - g(is,1,k) = g(is,1,k)+a(1,np1,k)*pmn(i,mn) - 103 continue - 101 continue - -c restore m=0 coefficients from odd/even - do 112 k=1,nt - do 112 i=1,nl2 - is = nlat-i+1 - t1 = g(i,1,k) - t3 = g(is,1,k) - g(i,1,k) = t1+t3 - g(is,1,k) = t1-t3 - 112 continue - -c sweep interior columns of g - do 104 mp1=2,lm1 - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 - mp2 = m+2 - do 105 k=1,nt -c for n-m even store (g(i,p,k)+g(nlat-i+1,p,k))/2 in g(i,p,k) p=2*m,2*m+1 -c for i=1,...,late - do 106 np1=mp1,nlat,2 - mn = mml1+np1 - do 107 i=1,late - g(i,2*m,k) = g(i,2*m,k)+a(mp1,np1,k)*pmn(i,mn) - g(i,2*m+1,k) = g(i,2*m+1,k)+b(mp1,np1,k)*pmn(i,mn) - 107 continue - 106 continue - -c for n-m odd store g(i,p,k)-g(nlat-i+1,p,k) in g(nlat-i+1,p,k) -c for i=1,...,nlat/2 (p=2*m,p=2*m+1) - do 108 np1=mp2,nlat,2 - mn = mml1+np1 - do 109 i=1,nl2 - is = nlat-i+1 - g(is,2*m,k) = g(is,2*m,k)+a(mp1,np1,k)*pmn(i,mn) - g(is,2*m+1,k) = g(is,2*m+1,k)+b(mp1,np1,k)*pmn(i,mn) - 109 continue - 108 continue - -c now set fourier coefficients using even-odd reduction above - do 110 i=1,nl2 - is = nlat-i+1 - t1 = g(i,2*m,k) - t2 = g(i,2*m+1,k) - t3 = g(is,2*m,k) - t4 = g(is,2*m+1,k) - g(i,2*m,k) = t1+t3 - g(i,2*m+1,k) = t2+t4 - g(is,2*m,k) = t1-t3 - g(is,2*m+1,k) = t2-t4 - 110 continue - - 105 continue - 104 continue - -c set last column (using a only) if necessary - if (nlon.eq. l+l-2) then - m = l-1 - mml1 = m*(2*nlat-m-1)/2 - do 111 k=1,nt -c n-m even - do 131 np1=l,nlat,2 - mn = mml1+np1 - do 131 i=1,late - g(i,nlon,k) = g(i,nlon,k)+2.0*a(l,np1,k)*pmn(i,mn) - - 131 continue - lp1 = l+1 -c n-m odd - do 132 np1=lp1,nlat,2 - mn = mml1+np1 - do 132 i=1,nl2 - is = nlat-i+1 - g(is,nlon,k) = g(is,nlon,k)+2.0*a(l,np1,k)*pmn(i,mn) - 132 continue - do 133 i=1,nl2 - is = nlat-i+1 - t1 = g(i,nlon,k) - t3 = g(is,nlon,k) - g(i,nlon,k)= t1+t3 - g(is,nlon,k)= t1-t3 - 133 continue - 111 continue - end if - - else -c half sphere (mode.ne.0) -c set first column in g - m = 0 - mml1 = m*(2*nlat-m-1)/2 - meo = 1 - if (mode.eq.1) meo = 2 - ms = m+meo - do 113 k=1,nt - do 113 np1=ms,nlat,2 - mn = mml1+np1 - do 113 i=1,late - g(i,1,k) = g(i,1,k)+a(1,np1,k)*pmn(i,mn) - 113 continue - -c sweep interior columns of g - - do 114 mp1=2,lm1 - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 - ms = m+meo - do 115 k=1,nt - do 115 np1=ms,nlat,2 - mn = mml1+np1 - do 115 i=1,late - g(i,2*m,k) = g(i,2*m,k)+a(mp1,np1,k)*pmn(i,mn) - g(i,2*m+1,k) = g(i,2*m+1,k)+b(mp1,np1,k)*pmn(i,mn) - 115 continue - 114 continue - - if (nlon.eq.l+l-2) then -c set last column - m = l-1 - mml1 = m*(2*nlat-m-1)/2 - ns = l - if (mode.eq.1) ns = l+1 - do 116 k=1,nt - do 116 np1=ns,nlat,2 - mn = mml1+np1 - do 116 i=1,late - g(i,nlon,k) = g(i,nlon,k)+2.0*a(l,np1,k)*pmn(i,mn) - 116 continue - end if - - end if - - -c do inverse fourier transform - do 120 k=1,nt - call hrfftb(lat,nlon,g(1,1,k),lat,wfft,work) - 120 continue -c scale output in gs - do 122 k=1,nt - do 122 j=1,nlon - do 122 i=1,lat - gs(i,j,k) = 0.5*g(i,j,k) - 122 continue - - return - end - subroutine shsgsi(nlat,nlon,wshsgs,lshsgs,work,lwork,dwork,ldwork, - + ierror) -c -c this subroutine must be called before calling shags or shsgs with -c fixed nlat,nlon. it precomputes the gaussian weights, points -c and all necessary legendre polys and stores them in wshsgs. -c these quantities must be preserved when calling shsgs -c repeatedly with fixed nlat,nlon. -c - dimension wshsgs(lshsgs),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+1)/2 - l1 = l - l2 = late -c check permanent work space length - ierror = 3 - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return - ierror = 4 -c check temporary work space - if (lwork.lt.4*nlat*(nlat+2)+2) return - ierror = 5 - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set preliminary quantites needed to compute and store legendre polys - ldw = nlat*(nlat+4) - call shsgsp(nlat,nlon,wshsgs,lshsgs,dwork,ldwork,ierror) - if (ierror.ne.0) return -c set legendre poly pointer in wshsgs - ipmnf = nlat+2*nlat*late+3*(l*(l-1)/2+(nlat-l)*(l-1))+nlon+16 - call shsgss1(nlat,l,late,wshsgs,work,wshsgs(ipmnf)) - return - end - subroutine shsgss1(nlat,l,late,w,pmn,pmnf) - dimension w(1),pmn(nlat,late,3),pmnf(late,1) -c compute and store legendre polys for i=1,...,late,m=0,...,l-1 -c and n=m,...,l-1 - do i=1,nlat - do j=1,late - do k=1,3 - pmn(i,j,k) = 0.0 - end do - end do - end do - do 100 mp1=1,l - m = mp1-1 - mml1 = m*(2*nlat-m-1)/2 -c compute pmn for n=m,...,nlat-1 and i=1,...,(l+1)/2 - mode = 0 - call legin(mode,l,nlat,m,w,pmn,km) -c store above in pmnf - do 101 np1=mp1,nlat - mn = mml1+np1 - do 102 i=1,late - pmnf(i,mn) = pmn(np1,i,km) - 102 continue - 101 continue - 100 continue - return - end - subroutine shsgsp(nlat,nlon,wshsgs,lshsgs,dwork,ldwork,ierror) - dimension wshsgs(lshsgs) - double precision dwork(ldwork) - ierror = 1 - if (nlat.lt.3) return - ierror = 2 - if (nlon.lt.4) return -c set triangular truncation limit for spherical harmonic basis - l = min0((nlon+2)/2,nlat) -c set equator or nearest point (if excluded) pointer - late = (nlat+mod(nlat,2))/2 - l1 = l - l2 = late - ierror = 3 -c check permanent work space length - if (lshsgs .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 4 -c if (lwork.lt.4*nlat*(nlat+2)+2) return - if (ldwork .lt. nlat*(nlat+4)) return - ierror = 0 -c set pointers - i1 = 1 - i2 = i1+nlat - i3 = i2+nlat*late - i4 = i3+nlat*late - i5 = i4+l*(l-1)/2 +(nlat-l)*(l-1) - i6 = i5+l*(l-1)/2 +(nlat-l)*(l-1) - i7 = i6+l*(l-1)/2 +(nlat-l)*(l-1) -c set indices in temp work for double precision gaussian wts and pts - idth = 1 -c idwts = idth+2*nlat -c iw = idwts+2*nlat - idwts = idth+nlat - iw = idwts+nlat - call shsgsp1(nlat,nlon,l,late,wshsgs(i1),wshsgs(i2),wshsgs(i3), - 1wshsgs(i4),wshsgs(i5),wshsgs(i6),wshsgs(i7),dwork(idth), - 2dwork(idwts),dwork(iw),ierror) - if (ierror.ne.0) ierror = 6 - return - end - subroutine shsgsp1(nlat,nlon,l,late,wts,p0n,p1n,abel,bbel,cbel, - + wfft,dtheta,dwts,work,ier) - dimension wts(nlat),p0n(nlat,late),p1n(nlat,late),abel(1),bbel(1), - 1 cbel(1),wfft(1),dtheta(nlat),dwts(nlat) - double precision pb,dtheta,dwts,work(*) - indx(m,n) = (n-1)*(n-2)/2+m-1 - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 - call hrffti(nlon,wfft) -c -c compute double precision gaussian points and weights -c - lw = nlat*(nlat+2) - call gaqd(nlat,dtheta,dwts,work,lw,ier) - if (ier.ne.0) return - -c store gaussian weights single precision to save computation -c in inner loops in analysis - do 100 i=1,nlat - wts(i) = dwts(i) - 100 continue - -c initialize p0n,p1n using double precision dnlfk,dnlft - do 101 np1=1,nlat - do 101 i=1,late - p0n(np1,i) = 0.0 - p1n(np1,i) = 0.0 - 101 continue -c compute m=n=0 legendre polynomials for all theta(i) - np1 = 1 - n = 0 - m = 0 - call dnlfk(m,n,work) - do 103 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(1,i) = pb - 103 continue -c compute p0n,p1n for all theta(i) when n.gt.0 - do 104 np1=2,nlat - n = np1-1 - m = 0 - call dnlfk(m,n,work) - do 105 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p0n(np1,i) = pb - 105 continue -c compute m=1 legendre polynomials for all n and theta(i) - m = 1 - call dnlfk(m,n,work) - do 106 i=1,late - call dnlft(m,n,dtheta(i),work,pb) - p1n(np1,i) = pb - 106 continue - 104 continue -c -c compute and store swarztrauber recursion coefficients -c for 2.le.m.le.n and 2.le.n.le.nlat in abel,bbel,cbel - do 107 n=2,nlat - mlim = min0(n,l) - do 107 m=2,mlim - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - abel(imn)=sqrt(float((2*n+1)*(m+n-2)*(m+n-3))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - bbel(imn)=sqrt(float((2*n+1)*(n-m-1)*(n-m))/ - 1 float(((2*n-3)*(m+n-1)*(m+n)))) - cbel(imn)=sqrt(float((n-m+1)*(n-m+2))/ - 1 float(((n+m-1)*(n+m)))) - 107 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/slapec.f deleted file mode 100755 index b321577ec..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapec.f +++ /dev/null @@ -1,366 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file slapec.f -c -c this file includes documentation and code for -c subroutine slapec i -c -c ... files which must be loaded with slapec.f -c -c sphcom.f, hrfft.f, shaec.f, shsec.f -c -c -c -c subroutine slapec(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, -c + wshsec,lshsec,work,lwork,ierror) -c -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaec for a scalar field sf, subroutine slapec computes -c the laplacian of sf in the scalar array slap. slap(i,j) is the -c laplacian of sf at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e. -c -c slap(i,j) = -c -c 2 2 -c [1/sint*d (sf(i,j)/dlambda + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c -c where sint = sin(theta(i)). the scalar laplacian in slap has the -c same symmetry or absence of symmetry about the equator as the scalar -c field sf. the input parameters isym,nt,mdab,ndab must have the -c same values used by shaec to compute a and b for sf. the associated -c legendre functions are recomputed rather than stored as they are -c in subroutine slapes. - -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shaec to compute the coefficients a and b for the scalar field -c sf. isym is set as follows: -c -c = 0 no symmetries exist in sf about the equator. scalar -c synthesis is used to compute slap on the entire sphere. -c i.e., in the array slap(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of analyses. in the program that calls slapec -c the arrays slap,a, and b can be three dimensional in which -c case multiple synthesis will be performed. the third index -c is the synthesis index which assumes the values k=1,...,nt. -c for a single analysis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c or that all the arrays are two dimensional. -c -c ids the first dimension of the array slap as it appears in the -c program that calls slapec. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array slap as it appears in the -c program that calls slapec. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field sf as computed by subroutine shaec. -c *** a,b must be computed by shaec prior to calling slapec. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls slapec. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls slapec. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shaec to -c compute the coefficients a and b. -c -c -c wshsec an array which must be initialized by subroutine shseci -c before calling slapec. once initialized, wshsec -c can be used repeatedly by slapec as long as nlat and nlon -c remain unchanged. wshsec must not be altered between calls -c of slapec. -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls slapec. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be greater than or equal to -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls slapec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 let -c -c lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1. -c -c if isym > 0 let -c -c lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) -c -c -c then lwork must be greater than or equal to lwkmin (see ierror=10) -c -c ************************************************************** -c -c output parameters -c -c -c slap a two or three dimensional arrays (see input parameter nt) that -c contain the scalar laplacian of the scalar field sf. slap(i,j) -c is the scalar laplacian at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshsec -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for slapec -c -c ********************************************************************** -c -c - subroutine slapec(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + wshsec,lshsec,work,lwork,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshsec(lshsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c -c - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - lwmin = 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 - if(lshsec .lt. lwmin) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym .eq. 0) then - lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - - - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call slapec1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshsec,lshsec,work(iwk),lwk, - +ierror) - return - end - - subroutine slapec1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + alap,blap,mmax,fnn,wshsec,lshsec,wk,lwk,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension alap(mmax,nlat,nt),blap(mmax,nlat,nt),fnn(nlat) - dimension wshsec(lshsec),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.) - 1 continue -c -c compute scalar laplacian coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - alap(m,n,k) = 0.0 - blap(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - alap(1,n,k) = -fnn(n)*a(1,n,k) - blap(1,n,k) = -fnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - alap(m,n,k) = -fnn(n)*a(m,n,k) - blap(m,n,k) = -fnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize alap,blap into slap -c - call shsec(nlat,nlon,isym,nt,slap,ids,jds,alap,blap, - + mmax,nlat,wshsec,lshsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/slapes.f deleted file mode 100755 index 3f49edf19..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapes.f +++ /dev/null @@ -1,356 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file slapes.f -c -c this file includes documentation and code for -c subroutine slapes i -c -c ... files which must be loaded with slapec.f -c -c sphcom.f, hrfft.f, shaes.f, shses.f -c -c -c -c subroutine slapes(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, -c + wshses,lshses,work,lwork,ierror) -c -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shaes for a scalar field sf, subroutine slapes computes -c the laplacian of sf in the scalar array slap. slap(i,j) is the -c laplacian of sf at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e. -c -c slap(i,j) = -c -c 2 2 -c [1/sint*d (sf(i,j)/dlambda + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c -c where sint = sin(theta(i)). the scalar laplacian in slap has the -c same symmetry or absence of symmetry about the equator as the scalar -c field sf. the input parameters isym,nt,mdab,ndab must have the -c same values used by shaes to compute a and b for sf. the associated -c legendre functions are stored rather than recomputed as they are -c in subroutine slapec. - -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shaes to compute the coefficients a and b for the scalar field -c sf. isym is set as follows: -c -c = 0 no symmetries exist in sf about the equator. scalar -c synthesis is used to compute slap on the entire sphere. -c i.e., in the array slap(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of analyses. in the program that calls slapes -c the arrays slap,a, and b can be three dimensional in which -c case multiple synthesis will be performed. the third index -c is the synthesis index which assumes the values k=1,...,nt. -c for a single analysis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c or that all the arrays are two dimensional. -c -c ids the first dimension of the array slap as it appears in the -c program that calls slapes. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array slap as it appears in the -c program that calls slapes. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field sf as computed by subroutine shaes. -c *** a,b must be computed by shaes prior to calling slapes. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls slapes. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls slapes. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shaes to -c compute the coefficients a and b. -c -c -c wshses an array which must be initialized by subroutine shsesi -c before calling slapes. once initialized, wshses -c can be used repeatedly by slapes as long as nlat and nlon -c remain unchanged. wshses must not be altered between calls -c of slapes. -c -c lshses the dimension of the array wshses as it appears in the -c program that calls slapes. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be greater than or equal to -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15. -c -c -c work a work array that does not have to be saved. -c -c -c lwork the dimension of the array work as it appears in the -c program that calls slapes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym is zero then lwork must be at least -c -c (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) -c -c if isym is nonzero lwork must be at least -c -c (nt+1)*l2*nlon + nlat*(2*nt*l1+1) -c -c ************************************************************** -c -c output parameters -c -c -c slap a two or three dimensional arrays (see input parameter nt) that -c contain the scalar laplacian of the scalar field sf. slap(i,j) -c is the scalar laplacian at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for i=1,...,nlat and j=1,...,nlon. -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshses -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for slapes -c -c ********************************************************************** -c - subroutine slapes(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + wshses,lshses,work,lwork,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshses(lshses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwkmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwkmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym.eq.0) then - lwkmin = (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) - else - lwkmin = (nt+1)*l2*nlon + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call slapes1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshses,lshses,work(iwk),lwk, - +ierror) - return - end - - subroutine slapes1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + alap,blap,mmax,fnn,wsave,lsave,wk,lwk,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension alap(mmax,nlat,nt),blap(mmax,nlat,nt),fnn(nlat) - dimension wsave(lsave),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.) - 1 continue -c -c compute scalar laplacian coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - alap(m,n,k) = 0.0 - blap(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - alap(1,n,k) = -fnn(n)*a(1,n,k) - blap(1,n,k) = -fnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - alap(m,n,k) = -fnn(n)*a(m,n,k) - blap(m,n,k) = -fnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize alap,blap into slap -c - call shses(nlat,nlon,isym,nt,slap,ids,jds,alap,blap, - + mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/slapgc.f deleted file mode 100755 index 063140cfc..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapgc.f +++ /dev/null @@ -1,351 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file slapgc.f -c -c this file includes documentation and code for -c subroutine slapgc i -c -c ... files which must be loaded with slapec.f -c -c sphcom.f, hrfft.f, shagc.f, shsgc.f -c -c -c -c subroutine slapgc(nlat,nlon,isym,nt,slap,ids,jds,a,b, -c +mdab,ndab,wshsgc,lshsgc,work,lwork,ierror) -c -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shagc for a scalar field sf, subroutine slapgc computes -c the laplacian of sf in the scalar array slap. slap(i,j) is the -c laplacian of sf at the gaussian colatitude theta(i) (see nlat as -c an input parameter) and east longitude lambda(j) = (j-1)*2*pi/nlon -c on the sphere. i.e. -c -c slap(i,j) = -c -c 2 2 -c [1/sint*d (sf(i,j)/dlambda + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c -c where sint = sin(theta(i)). the scalar laplacian in slap has the -c same symmetry or absence of symmetry about the equator as the scalar -c field sf. the input parameters isym,nt,mdab,ndab must have the -c same values used by shagc to compute a and b for sf. the associated -c legendre functions are stored rather than recomputed as they are -c in subroutine slapgc. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shagc to compute the coefficients a and b for the scalar field -c sf. isym is set as follows: -c -c = 0 no symmetries exist in sf about the equator. scalar -c synthesis is used to compute slap on the entire sphere. -c i.e., in the array slap(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of analyses. in the program that calls slapgc -c the arrays slap,a, and b can be three dimensional in which -c case multiple synthesis will be performed. the third index -c is the synthesis index which assumes the values k=1,...,nt. -c for a single analysis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c or that all the arrays are two dimensional. -c -c ids the first dimension of the array slap as it appears in the -c program that calls slapgc. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array slap as it appears in the -c program that calls slapgc. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field sf as computed by subroutine shagc. -c *** a,b must be computed by shagc prior to calling slapgc. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls slapgc. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls slapgc. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shagc to -c compute the coefficients a and b. -c -c -c wshsgc an array which must be initialized by subroutine shsgci. -c once initialized, wshsgc -c can be used repeatedly by slapgc as long as nlat and nlon -c remain unchanged. wshsgc must not be altered between calls -c of slapgc. -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls slapgc. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls slapgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym = 0 let -c -c lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1. -c -c if isym > 0 let -c -c lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) -c -c -c then lwork must be greater than or equal to lwkmin (see ierror=10) -c -c ************************************************************** -c -c output parameters -c -c -c slap a two or three dimensional arrays (see input parameter nt) that -c contain the scalar laplacian of the scalar field sf. slap(i,j) -c is the scalar laplacian at the gaussian colatitude theta(i) -c and longitude lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat -c and j=1,...,nlon. -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshsgc -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for slapgc -c -c ********************************************************************** -c -c - subroutine slapgc(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + wshsgc,lshsgc,work,lwork,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshsgc(lshsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c -c - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - if (lshsgc .lt. nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15)return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym .eq. 0) then - lwkmin = nlat*(2*nt*nlon+max0(6*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(2*nt*nlon+max0(6*nlat,nlon))+nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call slapgc1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshsgc,lshsgc,work(iwk),lwk, - +ierror) - return - end - - subroutine slapgc1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + alap,blap,mmax,fnn,wsave,lsave,wk,lwk,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension alap(mmax,nlat,nt),blap(mmax,nlat,nt),fnn(nlat) - dimension wsave(lsave),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.) - 1 continue -c -c compute scalar laplacian coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - alap(m,n,k) = 0.0 - blap(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - alap(1,n,k) = -fnn(n)*a(1,n,k) - blap(1,n,k) = -fnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - alap(m,n,k) = -fnn(n)*a(m,n,k) - blap(m,n,k) = -fnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize alap,blap into slap -c - call shsgc(nlat,nlon,isym,nt,slap,ids,jds,alap,blap, - + mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/slapgs.f deleted file mode 100755 index f4d84d551..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/slapgs.f +++ /dev/null @@ -1,350 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file slapgs.f -c -c this file includes documentation and code for -c subroutine slapgs i -c -c ... files which must be loaded with slapgs.f -c -c sphcom.f, hrfft.f, shags.f, shsgs.f -c -c -c -c subroutine slapgs(nlat,nlon,isym,nt,slap,ids,jds,a,b, -c +mdab,ndab,wshsgs,lshsgs,work,lwork,ierror) -c -c -c given the scalar spherical harmonic coefficients a and b, precomputed -c by subroutine shags for a scalar field sf, subroutine slapgs computes -c the laplacian of sf in the scalar array slap. slap(i,j) is the -c laplacian of sf at the gaussian colatitude theta(i) (see nlat as -c an input parameter) and east longitude lambda(j) = (j-1)*2*pi/nlon -c on the sphere. i.e. -c -c slap(i,j) = -c -c 2 2 -c [1/sint*d (sf(i,j)/dlambda + d(sint*d(sf(i,j))/dtheta)/dtheta]/sint -c -c -c where sint = sin(theta(i)). the scalar laplacian in slap has the -c same symmetry or absence of symmetry about the equator as the scalar -c field sf. the input parameters isym,nt,mdab,ndab must have the -c same values used by shags to compute a and b for sf. the associated -c legendre functions are stored rather than recomputed as they are -c in subroutine slapgc. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c isym this parameter should have the same value input to subroutine -c shags to compute the coefficients a and b for the scalar field -c sf. isym is set as follows: -c -c = 0 no symmetries exist in sf about the equator. scalar -c synthesis is used to compute slap on the entire sphere. -c i.e., in the array slap(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 sf and slap are antisymmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c = 2 sf and slap are symmetric about the equator. the -c synthesis used to compute slap is performed on the -c northern hemisphere only. if nlat is odd, slap(i,j) is -c computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. if -c nlat is even, slap(i,j) is computed for i=1,...,nlat/2 -c and j=1,...,nlon. -c -c -c nt the number of analyses. in the program that calls slapgs -c the arrays slap,a, and b can be three dimensional in which -c case multiple synthesis will be performed. the third index -c is the synthesis index which assumes the values k=1,...,nt. -c for a single analysis set nt=1. the description of the -c remaining parameters is simplified by assuming that nt=1 -c or that all the arrays are two dimensional. -c -c ids the first dimension of the array slap as it appears in the -c program that calls slapgs. if isym = 0 then ids must be at -c least nlat. if isym > 0 and nlat is even then ids must be -c at least nlat/2. if isym > 0 and nlat is odd then ids must -c be at least (nlat+1)/2. -c -c jds the second dimension of the array slap as it appears in the -c program that calls slapgs. jds must be at least nlon. -c -c -c a,b two or three dimensional arrays (see input parameter nt) -c that contain scalar spherical harmonic coefficients -c of the scalar field sf as computed by subroutine shags. -c *** a,b must be computed by shags prior to calling slapgs. -c -c -c mdab the first dimension of the arrays a and b as it appears -c in the program that calls slapgs. mdab must be at -c least min0(nlat,(nlon+2)/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays a and b as it appears -c in the program that calls slapgs. ndbc must be at least -c least nlat. -c -c mdab,ndab should have the same values input to shags to -c compute the coefficients a and b. -c -c -c wshsgs an array which must be initialized by subroutine slapgsi -c (or equivalently by shsgsi). once initialized, wshsgs -c can be used repeatedly by slapgs as long as nlat and nlon -c remain unchanged. wshsgs must not be altered between calls -c of slapgs. -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls slapgs. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls slapgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if isym is zero then lwork must be at least -c -c (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) -c -c if isym is nonzero lwork must be at least -c -c (nt+1)*l2*nlon + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c slap a two or three dimensional arrays (see input parameter nt) that -c contain the scalar laplacian of the scalar field sf. slap(i,j) -c is the scalar laplacian at the gaussian colatitude theta(i) -c and longitude lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat -c and j=1,...,nlon. -c -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of ids -c -c = 6 error in the specification of jds -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lshsgs -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for slapgs -c -c ********************************************************************** -c -c - subroutine slapgs(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + wshsgs,lshsgs,work,lwork,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension wshsgs(lshsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ids.lt.nlat) .or. - 1 (isym.gt.0 .and. ids.lt.imid)) return - ierror = 6 - if(jds .lt. nlon) return - ierror = 7 - mmax = min0(nlat,nlon/2+1) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 -c -c set and verify saved work space length -c - imid = (nlat+1)/2 - l2 = (nlat+mod(nlat,2))/2 - l1 = min0((nlon+2)/2,nlat) - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return - ierror = 10 -c -c set and verify unsaved work space length -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - mn = mmax*nlat*nt -c lwkmin = nln+ls*nlon+2*mn+nlat -c if (lwork .lt. lwkmin) return - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (isym.eq.0) then - lwkmin = (nt+1)*nlat*nlon + nlat*(2*nt*l1+1) - else - lwkmin = (nt+1)*l2*nlon + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - ifn = ib+mn - iwk = ifn+nlat - lwk = lwork-2*mn-nlat - call slapgs1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - +work(ia),work(ib),mmax,work(ifn),wshsgs,lshsgs,work(iwk),lwk, - +ierror) - return - end - - subroutine slapgs1(nlat,nlon,isym,nt,slap,ids,jds,a,b,mdab,ndab, - + alap,blap,mmax,fnn,wsave,lsave,wk,lwk,ierror) - dimension slap(ids,jds,nt),a(mdab,ndab,nt),b(mdab,ndab,nt) - dimension alap(mmax,nlat,nt),blap(mmax,nlat,nt),fnn(nlat) - dimension wsave(lsave),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = fn*(fn+1.) - 1 continue -c -c compute scalar laplacian coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - alap(m,n,k) = 0.0 - blap(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - alap(1,n,k) = -fnn(n)*a(1,n,k) - blap(1,n,k) = -fnn(n)*b(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - do 6 m=2,mmax - do 7 n=m,nlat - alap(m,n,k) = -fnn(n)*a(m,n,k) - blap(m,n,k) = -fnn(n)*b(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize alap,blap into slap -c - call shsgs(nlat,nlon,isym,nt,slap,ids,jds,alap,blap, - + mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sphcom.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/sphcom.f deleted file mode 100755 index 348936db2..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sphcom.f +++ /dev/null @@ -1,2489 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file sphcom.f -c -c this file must be loaded with all main program files -c in spherepack. it includes undocumented subroutines -c called by some or all of main programs -c - subroutine dnlfk (m,n,cp) -c -c cp requires n/2+1 double precision locations -c - double precision cp,fnum,fden,fnmh,a1,b1,c1,cp2,fnnp1,fnmsq,fk, - 1 t1,t2,pm1,sc10,sc20,sc40 - dimension cp(1) - parameter (sc10=1024.d0) - parameter (sc20=sc10*sc10) - parameter (sc40=sc20*sc20) -c - cp(1) = 0. - ma = iabs(m) - if(ma .gt. n) return - if(n-1) 2,3,5 - 2 cp(1) = dsqrt(2.d0) - return - 3 if(ma .ne. 0) go to 4 - cp(1) = dsqrt(1.5d0) - return - 4 cp(1) = dsqrt(.75d0) - if(m .eq. -1) cp(1) = -cp(1) - return - 5 if(mod(n+ma,2) .ne. 0) go to 10 - nmms2 = (n-ma)/2 - fnum = n+ma+1 - fnmh = n-ma+1 - pm1 = 1.d0 - go to 15 - 10 nmms2 = (n-ma-1)/2 - fnum = n+ma+2 - fnmh = n-ma+2 - pm1 = -1.d0 -c t1 = 1. -c t1 = 2.d0**(n-1) -c t1 = 1.d0/t1 - 15 t1 = 1.d0/sc20 - nex = 20 - fden = 2.d0 - if(nmms2 .lt. 1) go to 20 - do 18 i=1,nmms2 - t1 = fnum*t1/fden - if(t1 .gt. sc20) then - t1 = t1/sc40 - nex = nex+40 - end if - fnum = fnum+2. - fden = fden+2. - 18 continue - 20 t1 = t1/2.d0**(n-1-nex) - if(mod(ma/2,2) .ne. 0) t1 = -t1 - t2 = 1. - if(ma .eq. 0) go to 26 - do 25 i=1,ma - t2 = fnmh*t2/(fnmh+pm1) - fnmh = fnmh+2. - 25 continue - 26 cp2 = t1*dsqrt((n+.5d0)*t2) - fnnp1 = n*(n+1) - fnmsq = fnnp1-2.d0*ma*ma - l = (n+1)/2 - if(mod(n,2) .eq. 0 .and. mod(ma,2) .eq. 0) l = l+1 - cp(l) = cp2 - if(m .ge. 0) go to 29 - if(mod(ma,2) .ne. 0) cp(l) = -cp(l) - 29 if(l .le. 1) return - fk = n - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = 2.*(fk*fk-fnmsq) - cp(l-1) = b1*cp(l)/a1 - 30 l = l-1 - if(l .le. 1) return - fk = fk-2. - a1 = (fk-2.)*(fk-1.)-fnnp1 - b1 = -2.*(fk*fk-fnmsq) - c1 = (fk+1.)*(fk+2.)-fnnp1 - cp(l-1) = -(b1*cp(l)+c1*cp(l+1))/a1 - go to 30 - end - subroutine dnlft (m,n,theta,cp,pb) - double precision cp(*),pb,theta,cdt,sdt,cth,sth,chh - cdt = dcos(theta+theta) - sdt = dsin(theta+theta) - nmod=mod(n,2) - mmod=mod(m,2) - if(nmod)1,1,2 -1 if(mmod)3,3,4 -c -c n even, m even -c -3 kdo=n/2 - pb = .5*cp(1) - if(n .eq. 0) return - cth = cdt - sth = sdt - do 170 k=1,kdo -c pb = pb+cp(k+1)*dcos(2*k*theta) - pb = pb+cp(k+1)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 170 continue - return -c -c n even, m odd -c - 4 kdo = n/2 - pb = 0. - cth = cdt - sth = sdt - do 180 k=1,kdo -c pb = pb+cp(k)*dsin(2*k*theta) - pb = pb+cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 180 continue - return -2 if(mmod)13,13,14 -c -c n odd, m even -c -13 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 190 k=1,kdo -c pb = pb+cp(k)*dcos((2*k-1)*theta) - pb = pb+cp(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 190 continue - return -c -c n odd, m odd -c - 14 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 200 k=1,kdo -c pb = pb+cp(k)*dsin((2*k-1)*theta) - pb = pb+cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 200 continue - return - end - subroutine dnlftd (m,n,theta,cp,pb) -c -c computes the derivative of pmn(theta) with respect to theta -c - dimension cp(1) - double precision cp,pb,theta,cdt,sdt,cth,sth,chh - cdt = dcos(theta+theta) - sdt = dsin(theta+theta) - nmod=mod(n,2) - mmod=mod(abs(m),2) - if(nmod)1,1,2 -1 if(mmod)3,3,4 -c -c n even, m even -c -3 kdo=n/2 - pb = 0.d0 - if(n .eq. 0) return - cth = cdt - sth = sdt - do 170 k=1,kdo -c pb = pb+cp(k+1)*dcos(2*k*theta) - pb = pb-2.d0*k*cp(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 170 continue - return -c -c n even, m odd -c - 4 kdo = n/2 - pb = 0. - cth = cdt - sth = sdt - do 180 k=1,kdo -c pb = pb+cp(k)*dsin(2*k*theta) - pb = pb+2.d0*k*cp(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 180 continue - return -2 if(mmod)13,13,14 -c -c n odd, m even -c -13 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 190 k=1,kdo -c pb = pb+cp(k)*dcos((2*k-1)*theta) - pb = pb-(2.d0*k-1)*cp(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 190 continue - return -c -c n odd, m odd -c - 14 kdo = (n+1)/2 - pb = 0. - cth = dcos(theta) - sth = dsin(theta) - do 200 k=1,kdo -c pb = pb+cp(k)*dsin((2*k-1)*theta) - pb = pb+(2.d0*k-1)*cp(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 200 continue - return - end - subroutine legin(mode,l,nlat,m,w,pmn,km) -c this subroutine computes legendre polynomials for n=m,...,l-1 -c and i=1,...,late (late=((nlat+mod(nlat,2))/2)gaussian grid -c in pmn(n+1,i,km) using swarztrauber's recursion formula. -c the vector w contains quantities precomputed in shigc. -c legin must be called in the order m=0,1,...,l-1 -c (e.g., if m=10 is sought it must be preceded by calls with -c m=0,1,2,...,9 in that order) - dimension w(1),pmn(1) -c set size of pole to equator gaussian grid - late = (nlat+mod(nlat,2))/2 -c partition w (set pointers for p0n,p1n,abel,bbel,cbel,pmn) - i1 = 1+nlat - i2 = i1+nlat*late - i3 = i2+nlat*late - i4 = i3+(2*nlat-l)*(l-1)/2 - i5 = i4+(2*nlat-l)*(l-1)/2 - call legin1(mode,l,nlat,late,m,w(i1),w(i2),w(i3),w(i4), - 1 w(i5),pmn,km) - return - end - subroutine legin1(mode,l,nlat,late,m,p0n,p1n,abel,bbel,cbel, - 1 pmn,km) - dimension p0n(nlat,late),p1n(nlat,late) - dimension abel(1),bbel(1),cbel(1),pmn(nlat,late,3) - data km0,km1,km2/ 1,2,3/ - save km0,km1,km2 -c define index function used in storing triangular -c arrays for recursion coefficients (functions of (m,n)) -c for 2.le.m.le.n-1 and 2.le.n.le.l-1 - indx(m,n) = (n-1)*(n-2)/2+m-1 -c for l.le.n.le.nlat and 2.le.m.le.l - imndx(m,n) = l*(l-1)/2+(n-l-1)*(l-1)+m-1 - -c set do loop indices for full or half sphere - ms = m+1 - ninc = 1 - if (mode.eq.1) then -c only compute pmn for n-m odd - ms = m+2 - ninc = 2 - else if (mode.eq.2) then -c only compute pmn for n-m even - ms = m+1 - ninc = 2 - end if - - - if (m.gt.1) then - do 100 np1=ms,nlat,ninc - n = np1-1 - imn = indx(m,n) - if (n.ge.l) imn = imndx(m,n) - do 100 i=1,late - pmn(np1,i,km0) = abel(imn)*pmn(n-1,i,km2) - 1 +bbel(imn)*pmn(n-1,i,km0) - 2 -cbel(imn)*pmn(np1,i,km2) - 100 continue - - else if (m.eq.0) then - do 101 np1=ms,nlat,ninc - do 101 i=1,late - pmn(np1,i,km0) = p0n(np1,i) - 101 continue - - else if (m.eq.1) then - do 102 np1=ms,nlat,ninc - do 102 i=1,late - pmn(np1,i,km0) = p1n(np1,i) - 102 continue - end if - -c permute column indices -c km0,km1,km2 store m,m-1,m-2 columns - kmt = km0 - km0 = km2 - km2 = km1 - km1 = kmt -c set current m index in output param km - km = kmt - return - end - - - subroutine zfin (isym,nlat,nlon,m,z,i3,wzfin) - dimension z(1) ,wzfin(1) - imid = (nlat+1)/2 - lim = nlat*imid - mmax = min0(nlat,nlon/2+1) - labc = ((mmax-2)*(nlat+nlat-mmax-1))/2 - iw1 = lim+1 - iw2 = iw1+lim - iw3 = iw2+labc - iw4 = iw3+labc -c -c the length of wzfin is 2*lim+3*labc -c - call zfin1 (isym,nlat,m,z,imid,i3,wzfin,wzfin(iw1),wzfin(iw2), - 1 wzfin(iw3),wzfin(iw4)) - return - end - subroutine zfin1 (isym,nlat,m,z,imid,i3,zz,z1,a,b,c) - dimension z(imid,nlat,3),zz(imid,1),z1(imid,1), - 1 a(1),b(1),c(1) - save i1,i2 - ihold = i1 - i1 = i2 - i2 = i3 - i3 = ihold - if(m-1)25,30,35 - 25 i1 = 1 - i2 = 2 - i3 = 3 - do 45 np1=1,nlat - do 45 i=1,imid - z(i,np1,i3) = zz(i,np1) - 45 continue - return - 30 do 50 np1=2,nlat - do 50 i=1,imid - z(i,np1,i3) = z1(i,np1) - 50 continue - return - 35 ns = ((m-2)*(nlat+nlat-m-1))/2+1 - if(isym .eq. 1) go to 36 - do 85 i=1,imid - z(i,m+1,i3) = a(ns)*z(i,m-1,i1)-c(ns)*z(i,m+1,i1) - 85 continue - 36 if(m .eq. nlat-1) return - if(isym .eq. 2) go to 71 - ns = ns+1 - do 70 i=1,imid - z(i,m+2,i3) = a(ns)*z(i,m,i1)-c(ns)*z(i,m+2,i1) - 70 continue - 71 nstrt = m+3 - if(isym .eq. 1) nstrt = m+4 - if(nstrt .gt. nlat) go to 80 - nstp = 2 - if(isym .eq. 0) nstp = 1 - do 75 np1=nstrt,nlat,nstp - ns = ns+nstp - do 75 i=1,imid - z(i,np1,i3) = a(ns)*z(i,np1-2,i1)+b(ns)*z(i,np1-2,i3) - 1 -c(ns)*z(i,np1,i1) - 75 continue - 80 return - end - subroutine zfinit (nlat,nlon,wzfin,dwork) - dimension wzfin(*) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wzfin is 3*((l-3)*l+2)/2 + 2*l*imid -c the length of dwork is nlat+2 -c - call zfini1 (nlat,nlon,imid,wzfin,wzfin(iw1),dwork, - 1 dwork(nlat/2+1)) - return - end - subroutine zfini1 (nlat,nlon,imid,z,abc,cz,work) -c -c abc must have 3*((mmax-2)*(nlat+nlat-mmax-1))/2 locations -c where mmax = min0(nlat,nlon/2+1) -c cz and work must each have nlat+1 locations -c - dimension z(imid,nlat,2),abc(1) - double precision pi,dt,th,zh,cz(*),work(*) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - do 160 mp1=1,2 - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dnzfk(nlat,m,n,cz,work) - do 165 i=1,imid - th = (i-1)*dt - call dnzft(nlat,m,n,th,cz,zh) - z(i,np1,mp1) = zh - 165 continue - z(1,np1,mp1) = .5*z(1,np1,mp1) - 160 continue - call rabcp(nlat,nlon,abc) - return - end - subroutine dnzfk(nlat,m,n,cz,work) -c -c dnzfk computes the coefficients in the trigonometric -c expansion of the z functions that are used in spherical -c harmonic analysis. -c - dimension cz(1),work(1) -c -c cz and work must both have nlat/2+1 locations -c - double precision sum,sc1,t1,t2,work,cz - lc = (nlat+1)/2 - sc1 = 2.d0/float(nlat-1) - call dnlfk(m,n,work) - nmod = mod(n,2) - mmod = mod(m,2) - if(nmod)1,1,2 -1 if(mmod)3,3,4 -c -c n even, m even -c -3 kdo = n/2+1 - do 5 idx=1,lc - i = idx+idx-2 - sum = work(1)/(1.d0-i*i) - if(kdo.lt.2) go to 29 - do 6 kp1=2,kdo - k = kp1-1 - t1 = 1.d0-(k+k+i)**2 - t2 = 1.d0-(k+k-i)**2 -8 sum = sum+work(kp1)*(t1+t2)/(t1*t2) -6 continue -29 cz(idx) = sc1*sum -5 continue - return -c -c n even, m odd -c -4 kdo = n/2 - do 9 idx=1,lc - i = idx+idx-2 - sum = 0. - do 101 k=1,kdo - t1 = 1.d0-(k+k+i)**2 - t2 = 1.d0-(k+k-i)**2 -12 sum=sum+work(k)*(t1-t2)/(t1*t2) -101 continue - cz(idx) = sc1*sum -9 continue - return -2 if(mmod)13,13,14 -c -c n odd, m even -c -13 kdo = (n+1)/2 - do 15 idx=1,lc - i = idx+idx-1 - sum = 0. - do 16 k=1,kdo - t1 = 1.d0-(k+k-1+i)**2 - t2 = 1.d0-(k+k-1-i)**2 -18 sum=sum+work(k)*(t1+t2)/(t1*t2) -16 continue - cz(idx)=sc1*sum -15 continue - return -c -c n odd, m odd -c -14 kdo = (n+1)/2 - do 19 idx=1,lc - i = idx+idx-3 - sum=0. - do 20 k=1,kdo - t1 = 1.d0-(k+k-1+i)**2 - t2 = 1.d0-(k+k-1-i)**2 -22 sum=sum+work(k)*(t1-t2)/(t1*t2) -20 continue - cz(idx)=sc1*sum -19 continue - return - end - subroutine dnzft(nlat,m,n,th,cz,zh) - dimension cz(1) - double precision cz,zh,th,cdt,sdt,cth,sth,chh - zh = 0. - cdt = dcos(th+th) - sdt = dsin(th+th) - lmod = mod(nlat,2) - mmod = mod(m,2) - nmod = mod(n,2) - if(lmod)20,20,10 - 10 lc = (nlat+1)/2 - lq = lc-1 - ls = lc-2 - if(nmod)1,1,2 - 1 if(mmod)3,3,4 -c -c nlat odd n even m even -c - 3 zh = .5*(cz(1)+cz(lc)*dcos(2*lq*th)) - cth = cdt - sth = sdt - do 201 k=2,lq -c zh = zh+cz(k)*dcos(2*(k-1)*th) - zh = zh+cz(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 201 continue - return -c -c nlat odd n even m odd -c - 4 cth = cdt - sth = sdt - do 202 k=1,ls -c zh = zh+cz(k+1)*dsin(2*k*th) - zh = zh+cz(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 202 continue - return -c -c nlat odd n odd, m even -c - 2 if(mmod)5,5,6 - 5 cth = dcos(th) - sth = dsin(th) - do 203 k=1,lq -c zh = zh+cz(k)*dcos((2*k-1)*th) - zh = zh+cz(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 203 continue - return -c -c nlat odd n odd m odd -c - 6 cth = dcos(th) - sth = dsin(th) - do 204 k=1,lq -c zh = zh+cz(k+1)*dsin((2*k-1)*th) - zh = zh+cz(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 204 continue - return - 20 lc = nlat/2 - lq = lc-1 - if(nmod)30,30,80 - 30 if(mmod)40,40,60 -c -c nlat even n even m even -c - 40 zh = .5*cz(1) - cth = cdt - sth = sdt - do 50 k=2,lc -c zh = zh+cz(k)*dcos(2*(k-1)*th) - zh = zh+cz(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 50 continue - return -c -c nlat even n even m odd -c - 60 cth = cdt - sth = sdt - do 70 k=1,lq -c zh = zh+cz(k+1)*dsin(2*k*th) - zh = zh+cz(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 70 continue - return -c -c nlat even n odd m even -c - 80 if(mmod)90,90,110 - 90 zh = .5*cz(lc)*dcos((nlat-1)*th) - cth = dcos(th) - sth = dsin(th) - do 100 k=1,lq -c zh = zh+cz(k)*dcos((2*k-1)*th) - zh = zh+cz(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 100 continue - return -c -c nlat even n odd m odd -c - 110 cth = dcos(th) - sth = dsin(th) - do 120 k=1,lq -c zh = zh+cz(k+1)*dsin((2*k-1)*th) - zh = zh+cz(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 120 continue - return - end - subroutine alin (isym,nlat,nlon,m,p,i3,walin) - dimension p(1) ,walin(1) - imid = (nlat+1)/2 - lim = nlat*imid - mmax = min0(nlat,nlon/2+1) - labc = ((mmax-2)*(nlat+nlat-mmax-1))/2 - iw1 = lim+1 - iw2 = iw1+lim - iw3 = iw2+labc - iw4 = iw3+labc -c -c the length of walin is ((5*l-7)*l+6)/2 -c - call alin1 (isym,nlat,m,p,imid,i3,walin,walin(iw1),walin(iw2), - 1 walin(iw3),walin(iw4)) - return - end - subroutine alin1 (isym,nlat,m,p,imid,i3,pz,p1,a,b,c) - dimension p(imid,nlat,3),pz(imid,1),p1(imid,1), - 1 a(1),b(1),c(1) - save i1,i2 - ihold = i1 - i1 = i2 - i2 = i3 - i3 = ihold - if(m-1)25,30,35 - 25 i1 = 1 - i2 = 2 - i3 = 3 - do 45 np1=1,nlat - do 45 i=1,imid - p(i,np1,i3) = pz(i,np1) - 45 continue - return - 30 do 50 np1=2,nlat - do 50 i=1,imid - p(i,np1,i3) = p1(i,np1) - 50 continue - return - 35 ns = ((m-2)*(nlat+nlat-m-1))/2+1 - if(isym .eq. 1) go to 36 - do 85 i=1,imid - p(i,m+1,i3) = a(ns)*p(i,m-1,i1)-c(ns)*p(i,m+1,i1) - 85 continue - 36 if(m .eq. nlat-1) return - if(isym .eq. 2) go to 71 - ns = ns+1 - do 70 i=1,imid - p(i,m+2,i3) = a(ns)*p(i,m,i1)-c(ns)*p(i,m+2,i1) - 70 continue - 71 nstrt = m+3 - if(isym .eq. 1) nstrt = m+4 - if(nstrt .gt. nlat) go to 80 - nstp = 2 - if(isym .eq. 0) nstp = 1 - do 75 np1=nstrt,nlat,nstp - ns = ns+nstp - do 75 i=1,imid - p(i,np1,i3) = a(ns)*p(i,np1-2,i1)+b(ns)*p(i,np1-2,i3) - 1 -c(ns)*p(i,np1,i1) - 75 continue - 80 return - end - subroutine alinit (nlat,nlon,walin,dwork) - dimension walin(*) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of walin is 3*((l-3)*l+2)/2 + 2*l*imid -c the length of work is nlat+1 -c - call alini1 (nlat,nlon,imid,walin,walin(iw1),dwork) - return - end - subroutine alini1 (nlat,nlon,imid,p,abc,cp) - dimension p(imid,nlat,2),abc(1),cp(1) - double precision pi,dt,th,cp,ph - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - do 160 mp1=1,2 - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dnlfk (m,n,cp) - do 160 i=1,imid - th = (i-1)*dt - call dnlft (m,n,th,cp,ph) - p(i,np1,mp1) = ph - 160 continue - call rabcp(nlat,nlon,abc) - return - end - subroutine rabcp(nlat,nlon,abc) -c -c subroutine rabcp computes the coefficients in the recurrence -c relation for the associated legendre fuctions. array abc -c must have 3*((mmax-2)*(nlat+nlat-mmax-1))/2 locations. -c - dimension abc(1) - mmax = min0(nlat,nlon/2+1) - labc = ((mmax-2)*(nlat+nlat-mmax-1))/2 - iw1 = labc+1 - iw2 = iw1+labc - call rabcp1(nlat,nlon,abc,abc(iw1),abc(iw2)) - return - end - subroutine rabcp1(nlat,nlon,a,b,c) -c -c coefficients a, b, and c for computing pbar(m,n,theta) are -c stored in location ((m-2)*(nlat+nlat-m-1))/2+n+1 -c - dimension a(1),b(1),c(1) - mmax = min0(nlat,nlon/2+1) - do 215 mp1=3,mmax - m = mp1-1 - ns = ((m-2)*(nlat+nlat-m-1))/2+1 - fm = float(m) - tm = fm+fm - temp = tm*(tm-1.) - a(ns) = sqrt((tm+1.)*(tm-2.)/temp) - c(ns) = sqrt(2./temp) - if(m .eq. nlat-1) go to 215 - ns = ns+1 - temp = tm*(tm+1.) - a(ns) = sqrt((tm+3.)*(tm-2.)/temp) - c(ns) = sqrt(6./temp) - mp3 = m+3 - if(mp3 .gt. nlat) go to 215 - do 210 np1=mp3,nlat - n = np1-1 - ns = ns+1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - a(ns) = sqrt(cn*(fnpm-3.)*(fnpm-2.)/temp) - b(ns) = sqrt(cn*fnmm*(fnmm-1.)/temp) - c(ns) = sqrt((fnmm+1.)*(fnmm+2.)/temp) - 210 continue - 215 continue - return - end - subroutine sea1(nlat,nlon,imid,z,idz,zin,wzfin,dwork) - dimension z(idz,*),zin(imid,nlat,3),wzfin(*) - double precision dwork(*) - call zfinit(nlat,nlon,wzfin,dwork) - mmax = min0(nlat,nlon/2+1) - do 33 mp1=1,mmax - m = mp1-1 - call zfin (0,nlat,nlon,m,zin,i3,wzfin) - do 33 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 33 i=1,imid - z(mn,i) = zin(i,np1,i3) - 33 continue - return - end - subroutine ses1(nlat,nlon,imid,p,pin,walin,dwork) - dimension p(imid,*),pin(imid,nlat,3),walin(*) - double precision dwork(*) - call alinit (nlat,nlon,walin,dwork) - mmax = min0(nlat,nlon/2+1) - do 10 mp1=1,mmax - m = mp1-1 - call alin(0,nlat,nlon,m,pin,i3,walin) - do 10 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 10 i=1,imid - p(i,mn) = pin(i,np1,i3) - 10 continue - return - end - subroutine zvinit (nlat,nlon,wzvin,dwork) - dimension wzvin(1) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wzvin is -c 2*nlat*imid +3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c the length of dwork is nlat+2 -c - call zvini1 (nlat,nlon,imid,wzvin,wzvin(iw1),dwork, - 1 dwork(nlat/2+2)) - return - end - subroutine zvini1 (nlat,nlon,imid,zv,abc,czv,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c czv and work must each have nlat/2+1 locations -c - dimension zv(imid,nlat,2),abc(1) - double precision pi,dt,czv(1),zvh,th,work(1) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - mdo = min0(2,nlat,(nlon+1)/2) - do 160 mp1=1,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dzvk(nlat,m,n,czv,work) - do 165 i=1,imid - th = (i-1)*dt - call dzvt(nlat,m,n,th,czv,zvh) - zv(i,np1,mp1) = zvh - 165 continue - zv(1,np1,mp1) = .5*zv(1,np1,mp1) - 160 continue - call rabcv(nlat,nlon,abc) - return - end - subroutine zwinit (nlat,nlon,wzwin,dwork) - dimension wzwin(1) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wzvin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of dwork is nlat+2 -c - call zwini1 (nlat,nlon,imid,wzwin,wzwin(iw1),dwork, - 1 dwork(nlat/2+2)) - return - end - subroutine zwini1 (nlat,nlon,imid,zw,abc,czw,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c czw and work must each have nlat+1 locations -c - dimension zw(imid,nlat,2),abc(1) - double precision pi,dt,czw(1),zwh,th,work(1) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - mdo = min0(3,nlat,(nlon+1)/2) - if(mdo .lt. 2) return - do 160 mp1=2,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dzwk(nlat,m,n,czw,work) - do 165 i=1,imid - th = (i-1)*dt - call dzwt(nlat,m,n,th,czw,zwh) - zw(i,np1,m) = zwh - 165 continue - zw(1,np1,m) = .5*zw(1,np1,m) - 160 continue - call rabcw(nlat,nlon,abc) - return - end - subroutine zvin (ityp,nlat,nlon,m,zv,i3,wzvin) - dimension zv(1) ,wzvin(1) - imid = (nlat+1)/2 - lim = nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = (max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - iw1 = lim+1 - iw2 = iw1+lim - iw3 = iw2+labc - iw4 = iw3+labc -c -c the length of wzvin is 2*lim+3*labc -c - call zvin1 (ityp,nlat,m,zv,imid,i3,wzvin,wzvin(iw1),wzvin(iw2), - 1 wzvin(iw3),wzvin(iw4)) - return - end - subroutine zvin1 (ityp,nlat,m,zv,imid,i3,zvz,zv1,a,b,c) - dimension zv(imid,nlat,3),zvz(imid,1),zv1(imid,1), - 1 a(1),b(1),c(1) - save i1,i2 - ihold = i1 - i1 = i2 - i2 = i3 - i3 = ihold - if(m-1)25,30,35 - 25 i1 = 1 - i2 = 2 - i3 = 3 - do 45 np1=1,nlat - do 45 i=1,imid - zv(i,np1,i3) = zvz(i,np1) - 45 continue - return - 30 do 50 np1=2,nlat - do 50 i=1,imid - zv(i,np1,i3) = zv1(i,np1) - 50 continue - return - 35 ns = ((m-2)*(nlat+nlat-m-1))/2+1 - if(ityp .eq. 1) go to 36 - do 85 i=1,imid - zv(i,m+1,i3) = a(ns)*zv(i,m-1,i1)-c(ns)*zv(i,m+1,i1) - 85 continue - 36 if(m .eq. nlat-1) return - if(ityp .eq. 2) go to 71 - ns = ns+1 - do 70 i=1,imid - zv(i,m+2,i3) = a(ns)*zv(i,m,i1)-c(ns)*zv(i,m+2,i1) - 70 continue - 71 nstrt = m+3 - if(ityp .eq. 1) nstrt = m+4 - if(nstrt .gt. nlat) go to 80 - nstp = 2 - if(ityp .eq. 0) nstp = 1 - do 75 np1=nstrt,nlat,nstp - ns = ns+nstp - do 75 i=1,imid - zv(i,np1,i3) = a(ns)*zv(i,np1-2,i1)+b(ns)*zv(i,np1-2,i3) - 1 -c(ns)*zv(i,np1,i1) - 75 continue - 80 return - end - subroutine zwin (ityp,nlat,nlon,m,zw,i3,wzwin) - dimension zw(1) ,wzwin(1) - imid = (nlat+1)/2 - lim = nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = (max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - iw1 = lim+1 - iw2 = iw1+lim - iw3 = iw2+labc - iw4 = iw3+labc -c -c the length of wzwin is 2*lim+3*labc -c - call zwin1 (ityp,nlat,m,zw,imid,i3,wzwin,wzwin(iw1),wzwin(iw2), - 1 wzwin(iw3),wzwin(iw4)) - return - end - subroutine zwin1 (ityp,nlat,m,zw,imid,i3,zw1,zw2,a,b,c) - dimension zw(imid,nlat,3),zw1(imid,1),zw2(imid,1), - 1 a(1),b(1),c(1) - save i1,i2 - ihold = i1 - i1 = i2 - i2 = i3 - i3 = ihold - if(m-2)25,30,35 - 25 i1 = 1 - i2 = 2 - i3 = 3 - do 45 np1=2,nlat - do 45 i=1,imid - zw(i,np1,i3) = zw1(i,np1) - 45 continue - return - 30 do 50 np1=3,nlat - do 50 i=1,imid - zw(i,np1,i3) = zw2(i,np1) - 50 continue - return - 35 ns = ((m-2)*(nlat+nlat-m-1))/2+1 - if(ityp .eq. 1) go to 36 - do 85 i=1,imid - zw(i,m+1,i3) = a(ns)*zw(i,m-1,i1)-c(ns)*zw(i,m+1,i1) - 85 continue - 36 if(m .eq. nlat-1) return - if(ityp .eq. 2) go to 71 - ns = ns+1 - do 70 i=1,imid - zw(i,m+2,i3) = a(ns)*zw(i,m,i1)-c(ns)*zw(i,m+2,i1) - 70 continue - 71 nstrt = m+3 - if(ityp .eq. 1) nstrt = m+4 - if(nstrt .gt. nlat) go to 80 - nstp = 2 - if(ityp .eq. 0) nstp = 1 - do 75 np1=nstrt,nlat,nstp - ns = ns+nstp - do 75 i=1,imid - zw(i,np1,i3) = a(ns)*zw(i,np1-2,i1)+b(ns)*zw(i,np1-2,i3) - 1 -c(ns)*zw(i,np1,i1) - 75 continue - 80 return - end - subroutine vbinit (nlat,nlon,wvbin,dwork) - dimension wvbin(1) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wvbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of dwork is nlat+2 -c - call vbini1 (nlat,nlon,imid,wvbin,wvbin(iw1),dwork, - 1 dwork(nlat/2+2)) - return - end - subroutine vbini1 (nlat,nlon,imid,vb,abc,cvb,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c cvb and work must each have nlat+1 locations -c - dimension vb(imid,nlat,2),abc(1) - double precision pi,dt,cvb(1),th,vbh,work(1) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - mdo = min0(2,nlat,(nlon+1)/2) - do 160 mp1=1,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dvbk(m,n,cvb,work) - do 165 i=1,imid - th = (i-1)*dt - call dvbt(m,n,th,cvb,vbh) - vb(i,np1,mp1) = vbh - 165 continue - 160 continue - call rabcv(nlat,nlon,abc) - return - end - subroutine wbinit (nlat,nlon,wwbin,dwork) - dimension wwbin(1) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wwbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of dwork is nlat+2 -c - call wbini1 (nlat,nlon,imid,wwbin,wwbin(iw1),dwork, - 1 dwork(nlat/2+2)) - return - end - subroutine wbini1 (nlat,nlon,imid,wb,abc,cwb,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c cwb and work must each have nlat/2+1 locations -c - dimension wb(imid,nlat,2),abc(1) - double precision pi,dt,cwb(1),wbh,th,work(1) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - mdo = min0(3,nlat,(nlon+1)/2) - if(mdo .lt. 2) return - do 160 mp1=2,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dwbk(m,n,cwb,work) - do 165 i=1,imid - th = (i-1)*dt - call dwbt(m,n,th,cwb,wbh) - wb(i,np1,m) = wbh - 165 continue - 160 continue - call rabcw(nlat,nlon,abc) - return - end - subroutine vbin (ityp,nlat,nlon,m,vb,i3,wvbin) - dimension vb(1) ,wvbin(1) - imid = (nlat+1)/2 - lim = nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = (max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - iw1 = lim+1 - iw2 = iw1+lim - iw3 = iw2+labc - iw4 = iw3+labc -c -c the length of wvbin is 2*lim+3*labc -c - call vbin1 (ityp,nlat,m,vb,imid,i3,wvbin,wvbin(iw1),wvbin(iw2), - 1 wvbin(iw3),wvbin(iw4)) - return - end - subroutine vbin1 (ityp,nlat,m,vb,imid,i3,vbz,vb1,a,b,c) - dimension vb(imid,nlat,3),vbz(imid,1),vb1(imid,1), - 1 a(1),b(1),c(1) - save i1,i2 - ihold = i1 - i1 = i2 - i2 = i3 - i3 = ihold - if(m-1)25,30,35 - 25 i1 = 1 - i2 = 2 - i3 = 3 - do 45 np1=1,nlat - do 45 i=1,imid - vb(i,np1,i3) = vbz(i,np1) - 45 continue - return - 30 do 50 np1=2,nlat - do 50 i=1,imid - vb(i,np1,i3) = vb1(i,np1) - 50 continue - return - 35 ns = ((m-2)*(nlat+nlat-m-1))/2+1 - if(ityp .eq. 1) go to 36 - do 85 i=1,imid - vb(i,m+1,i3) = a(ns)*vb(i,m-1,i1)-c(ns)*vb(i,m+1,i1) - 85 continue - 36 if(m .eq. nlat-1) return - if(ityp .eq. 2) go to 71 - ns = ns+1 - do 70 i=1,imid - vb(i,m+2,i3) = a(ns)*vb(i,m,i1)-c(ns)*vb(i,m+2,i1) - 70 continue - 71 nstrt = m+3 - if(ityp .eq. 1) nstrt = m+4 - if(nstrt .gt. nlat) go to 80 - nstp = 2 - if(ityp .eq. 0) nstp = 1 - do 75 np1=nstrt,nlat,nstp - ns = ns+nstp - do 75 i=1,imid - vb(i,np1,i3) = a(ns)*vb(i,np1-2,i1)+b(ns)*vb(i,np1-2,i3) - 1 -c(ns)*vb(i,np1,i1) - 75 continue - 80 return - end - subroutine wbin (ityp,nlat,nlon,m,wb,i3,wwbin) - dimension wb(1) ,wwbin(1) - imid = (nlat+1)/2 - lim = nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = (max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - iw1 = lim+1 - iw2 = iw1+lim - iw3 = iw2+labc - iw4 = iw3+labc -c -c the length of wwbin is 2*lim+3*labc -c - call wbin1 (ityp,nlat,m,wb,imid,i3,wwbin,wwbin(iw1),wwbin(iw2), - 1 wwbin(iw3),wwbin(iw4)) - return - end - subroutine wbin1 (ityp,nlat,m,wb,imid,i3,wb1,wb2,a,b,c) - dimension wb(imid,nlat,3),wb1(imid,1),wb2(imid,1), - 1 a(1),b(1),c(1) - save i1,i2 - ihold = i1 - i1 = i2 - i2 = i3 - i3 = ihold - if(m-2)25,30,35 - 25 i1 = 1 - i2 = 2 - i3 = 3 - do 45 np1=2,nlat - do 45 i=1,imid - wb(i,np1,i3) = wb1(i,np1) - 45 continue - return - 30 do 50 np1=3,nlat - do 50 i=1,imid - wb(i,np1,i3) = wb2(i,np1) - 50 continue - return - 35 ns = ((m-2)*(nlat+nlat-m-1))/2+1 - if(ityp .eq. 1) go to 36 - do 85 i=1,imid - wb(i,m+1,i3) = a(ns)*wb(i,m-1,i1)-c(ns)*wb(i,m+1,i1) - 85 continue - 36 if(m .eq. nlat-1) return - if(ityp .eq. 2) go to 71 - ns = ns+1 - do 70 i=1,imid - wb(i,m+2,i3) = a(ns)*wb(i,m,i1)-c(ns)*wb(i,m+2,i1) - 70 continue - 71 nstrt = m+3 - if(ityp .eq. 1) nstrt = m+4 - if(nstrt .gt. nlat) go to 80 - nstp = 2 - if(ityp .eq. 0) nstp = 1 - do 75 np1=nstrt,nlat,nstp - ns = ns+nstp - do 75 i=1,imid - wb(i,np1,i3) = a(ns)*wb(i,np1-2,i1)+b(ns)*wb(i,np1-2,i3) - 1 -c(ns)*wb(i,np1,i1) - 75 continue - 80 return - end - subroutine dzvk(nlat,m,n,czv,work) -c -c subroutine dzvk computes the coefficients in the trigonometric -c expansion of the quadrature function zvbar(n,m,theta) -c -c input parameters -c -c nlat the number of colatitudes including the poles. -c -c n the degree (subscript) of wbarv(n,m,theta) -c -c m the order (superscript) of wbarv(n,m,theta) -c -c work a work array with at least nlat/2+1 locations -c -c output parameter -c -c czv the fourier coefficients of zvbar(n,m,theta). -c - dimension czv(1),work(1) - double precision czv,sc1,sum,work,t1,t2 - if(n .le. 0) return - lc = (nlat+1)/2 - sc1 = 2.d0/float(nlat-1) - call dvbk(m,n,work,czv) - nmod = mod(n,2) - mmod = mod(m,2) - if(nmod .ne. 0) go to 1 - if(mmod .ne. 0) go to 2 -c -c n even, m even -c - kdo = n/2 - do 9 id=1,lc - i = id+id-2 - sum = 0. - do 10 k=1,kdo - t1 = 1.d0-(k+k+i)**2 - t2 = 1.d0-(k+k-i)**2 - sum = sum+work(k)*(t1-t2)/(t1*t2) - 10 continue - czv(id) = sc1*sum - 9 continue - return -c -c n even, m odd -c - 2 kdo = n/2 - do 5 id=1,lc - i = id+id-2 - sum = 0. - do 6 k=1,kdo - t1 = 1.d0-(k+k+i)**2 - t2 = 1.d0-(k+k-i)**2 - sum = sum+work(k)*(t1+t2)/(t1*t2) - 6 continue - czv(id) = sc1*sum - 5 continue - return - 1 if(mmod .ne. 0) go to 3 -c -c n odd, m even -c - kdo = (n+1)/2 - do 19 id=1,lc - i = id+id-3 - sum = 0. - do 20 k=1,kdo - t1 = 1.d0-(k+k-1+i)**2 - t2 = 1.d0-(k+k-1-i)**2 - sum = sum+work(k)*(t1-t2)/(t1*t2) - 20 continue - czv(id) = sc1*sum - 19 continue - return -c -c n odd, m odd -c - 3 kdo = (n+1)/2 - do 15 id=1,lc - i = id+id-1 - sum = 0. - do 16 k=1,kdo - t1 = 1.d0-(k+k-1+i)**2 - t2 = 1.d0-(k+k-1-i)**2 - sum = sum+work(k)*(t1+t2)/(t1*t2) - 16 continue - czv(id) = sc1*sum - 15 continue - return - end - subroutine dzvt(nlat,m,n,th,czv,zvh) -c -c subroutine dzvt tabulates the function zvbar(n,m,theta) -c at theta = th in double precision -c -c input parameters -c -c nlat the number of colatitudes including the poles. -c -c n the degree (subscript) of zvbar(n,m,theta) -c -c m the order (superscript) of zvbar(n,m,theta) -c -c czv the fourier coefficients of zvbar(n,m,theta) -c as computed by subroutine zwk. -c -c output parameter -c -c zvh zvbar(m,n,theta) evaluated at theta = th -c - dimension czv(1) - double precision th,czv,zvh,cth,sth,cdt,sdt,chh - zvh = 0. - if(n .le. 0) return - lc = (nlat+1)/2 - lq = lc-1 - ls = lc-2 - cth = dcos(th) - sth = dsin(th) - cdt = cth*cth-sth*sth - sdt = 2.*sth*cth - lmod = mod(nlat,2) - mmod = mod(m,2) - nmod = mod(n,2) - if(lmod .eq. 0) go to 50 - if(nmod .ne. 0) go to 1 - cth = cdt - sth = sdt - if(mmod .ne. 0) go to 2 -c -c nlat odd n even m even -c - do 10 k=1,ls - zvh = zvh+czv(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 10 continue - return -c -c nlat odd n even m odd -c - 2 zvh = .5*czv(1) - do 20 k=2,lq - zvh = zvh+czv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 20 continue - zvh = zvh+.5*czv(lc)*dcos((nlat-1)*th) - return - 1 if(mmod .ne. 0) go to 3 -c -c nlat odd n odd m even -c - do 30 k=1,lq - zvh = zvh+czv(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 30 continue - return -c -c nlat odd n odd m odd -c - 3 do 40 k=1,lq - zvh = zvh+czv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 40 continue - return - 50 if(nmod .ne. 0) go to 51 - cth = cdt - sth = sdt - if(mmod .ne. 0) go to 52 -c -c nlat even n even m even -c - do 55 k=1,lq - zvh = zvh+czv(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 55 continue - return -c -c nlat even n even m odd -c - 52 zvh = .5*czv(1) - do 57 k=2,lc - zvh = zvh+czv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 57 continue - return - 51 if(mmod .ne. 0) go to 53 -c -c nlat even n odd m even -c - do 58 k=1,lq - zvh = zvh+czv(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 58 continue - return -c -c nlat even n odd m odd -c - 53 zvh = .5*czv(lc)*dcos((nlat-1)*th) - do 60 k=1,lq - zvh = zvh+czv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 60 continue - return - end - subroutine dzwk(nlat,m,n,czw,work) -c -c subroutine dzwk computes the coefficients in the trigonometric -c expansion of the quadrature function zwbar(n,m,theta) -c -c input parameters -c -c nlat the number of colatitudes including the poles. -c -c n the degree (subscript) of zwbar(n,m,theta) -c -c m the order (superscript) of zwbar(n,m,theta) -c -c work a work array with at least nlat/2+1 locations -c -c output parameter -c -c czw the fourier coefficients of zwbar(n,m,theta). -c - dimension czw(1),work(1) - double precision czw,work,sc1,sum,t1,t2 - if(n .le. 0) return - lc = (nlat+1)/2 - sc1 = 2.d0/float(nlat-1) - call dwbk(m,n,work,czw) - nmod = mod(n,2) - mmod = mod(m,2) - if(nmod .ne. 0) go to 1 - if(mmod .ne. 0) go to 2 -c -c n even, m even -c - kdo = n/2 - do 19 id=1,lc - i = id+id-3 - sum = 0. - do 20 k=1,kdo - t1 = 1.d0-(k+k-1+i)**2 - t2 = 1.d0-(k+k-1-i)**2 - sum = sum+work(k)*(t1-t2)/(t1*t2) - 20 continue - czw(id) = sc1*sum - 19 continue - return -c -c n even, m odd -c - 2 kdo = n/2 - do 15 id=1,lc - i = id+id-1 - sum = 0. - do 16 k=1,kdo - t1 = 1.d0-(k+k-1+i)**2 - t2 = 1.d0-(k+k-1-i)**2 - sum = sum+work(k)*(t1+t2)/(t1*t2) - 16 continue - czw(id) = sc1*sum - 15 continue - return - 1 if(mmod .ne. 0) go to 3 -c -c n odd, m even -c - kdo = (n-1)/2 - do 9 id=1,lc - i = id+id-2 - sum = 0. - do 10 k=1,kdo - t1 = 1.d0-(k+k+i)**2 - t2 = 1.d0-(k+k-i)**2 - sum = sum+work(k)*(t1-t2)/(t1*t2) - 10 continue - czw(id) = sc1*sum - 9 continue - return -c -c n odd, m odd -c - 3 kdo = (n+1)/2 - do 5 id=1,lc - i = id+id-2 - sum = work(1)/(1.d0-i*i) - if(kdo .lt. 2) go to 29 - do 6 kp1=2,kdo - k = kp1-1 - t1 = 1.d0-(k+k+i)**2 - t2 = 1.d0-(k+k-i)**2 - sum = sum+work(kp1)*(t1+t2)/(t1*t2) - 6 continue - 29 czw(id) = sc1*sum - 5 continue - return - end - subroutine dzwt(nlat,m,n,th,czw,zwh) -c -c subroutine dzwt tabulates the function zwbar(n,m,theta) -c at theta = th in double precision -c -c input parameters -c -c nlat the number of colatitudes including the poles. -c nlat must be an odd integer -c -c n the degree (subscript) of zwbar(n,m,theta) -c -c m the order (superscript) of zwbar(n,m,theta) -c -c czw the fourier coefficients of zwbar(n,m,theta) -c as computed by subroutine zwk. -c -c output parameter -c -c zwh zwbar(m,n,theta) evaluated at theta = th -c - dimension czw(1) - double precision czw,zwh,th,cth,sth,cdt,sdt,chh - zwh = 0. - if(n .le. 0) return - lc = (nlat+1)/2 - lq = lc-1 - ls = lc-2 - cth = dcos(th) - sth = dsin(th) - cdt = cth*cth-sth*sth - sdt = 2.*sth*cth - lmod = mod(nlat,2) - mmod = mod(m,2) - nmod = mod(n,2) - if(lmod .eq. 0) go to 50 - if(nmod .ne. 0) go to 1 - if(mmod .ne. 0) go to 2 -c -c nlat odd n even m even -c - do 30 k=1,lq - zwh = zwh+czw(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 30 continue - return -c -c nlat odd n even m odd -c - 2 do 40 k=1,lq - zwh = zwh+czw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 40 continue - return - 1 cth = cdt - sth = sdt - if(mmod .ne. 0) go to 3 -c -c nlat odd n odd m even -c - do 10 k=1,ls - zwh = zwh+czw(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 10 continue - return -c -c nlat odd n odd m odd -c - 3 zwh = .5*czw(1) - do 20 k=2,lq - zwh = zwh+czw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 20 continue - zwh = zwh+.5*czw(lc)*dcos((nlat-1)*th) - return - 50 if(nmod .ne. 0) go to 51 - if(mmod .ne. 0) go to 52 -c -c nlat even n even m even -c - do 55 k=1,lq - zwh = zwh+czw(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 55 continue - return -c -c nlat even n even m odd -c - 52 zwh = .5*czw(lc)*dcos((nlat-1)*th) - do 60 k=1,lq - zwh = zwh+czw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 60 continue - return - 51 cth = cdt - sth = sdt - if(mmod .ne. 0) go to 53 -c -c nlat even n odd m even -c - do 65 k=1,lq - zwh = zwh+czw(k+1)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 65 continue - return -c -c nlat even n odd m odd -c - 53 zwh = .5*czw(1) - do 70 k=2,lc - zwh = zwh+czw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 70 continue - return - end - subroutine dvbk(m,n,cv,work) - double precision cv(1),work(1),fn,fk,cf - cv(1) = 0. - if(n .le. 0) return - fn = n - srnp1 = dsqrt(fn*(fn+1.)) - cf = 2.*m/srnp1 - modn = mod(n,2) - modm = mod(m,2) - call dnlfk(m,n,work) - if(modn .ne. 0) go to 70 - ncv = n/2 - if(ncv .eq. 0) return - fk = 0. - if(modm .ne. 0) go to 60 -c -c n even m even -c - do 55 l=1,ncv - fk = fk+2. - cv(l) = -fk*work(l+1)/srnp1 - 55 continue - return -c -c n even m odd -c - 60 do 65 l=1,ncv - fk = fk+2. - cv(l) = fk*work(l)/srnp1 - 65 continue - return - 70 ncv = (n+1)/2 - fk = -1. - if(modm .ne. 0) go to 80 -c -c n odd m even -c - do 75 l=1,ncv - fk = fk+2. - cv(l) = -fk*work(l)/srnp1 - 75 continue - return -c -c n odd m odd -c - 80 do 85 l=1,ncv - fk = fk+2. - cv(l) = fk*work(l)/srnp1 - 85 continue - return - end - subroutine dwbk(m,n,cw,work) - double precision cw(1),work(1),fn,cf,srnp1 - cw(1) = 0. - if(n.le.0 .or. m.le.0) return - fn = n - srnp1 = dsqrt(fn*(fn+1.)) - cf = 2.*m/srnp1 - modn = mod(n,2) - modm = mod(m,2) - call dnlfk(m,n,work) - if(m .eq. 0) go to 50 - if(modn .ne. 0) go to 30 - l = n/2 - if(l .eq. 0) go to 50 - if(modm .ne. 0) go to 20 -c -c n even m even -c - cw(l) = -cf*work(l+1) - 10 l = l-1 - if(l .le. 0) go to 50 - cw(l) = cw(l+1)-cf*work(l+1) - go to 10 -c -c n even m odd -c - 20 cw(l) = cf*work(l) - 25 l = l-1 - if(l .le. 0) go to 50 - cw(l) = cw(l+1)+cf*work(l) - go to 25 - 30 if(modm .ne. 0) go to 40 - l = (n-1)/2 - if(l .eq. 0) go to 50 -c -c n odd m even -c - cw(l) = -cf*work(l+1) - 35 l = l-1 - if(l .le. 0) go to 50 - cw(l) = cw(l+1)-cf*work(l+1) - go to 35 -c -c n odd m odd -c - 40 l = (n+1)/2 - cw(l) = cf*work(l) - 45 l = l-1 - if(l .le. 0) go to 50 - cw(l) = cw(l+1)+cf*work(l) - go to 45 - 50 return - end - subroutine dvbt(m,n,theta,cv,vh) - dimension cv(1) - double precision cv,vh,theta,cth,sth,cdt,sdt,chh - vh = 0. - if(n.eq.0) return - cth = dcos(theta) - sth = dsin(theta) - cdt = cth*cth-sth*sth - sdt = 2.*sth*cth - mmod = mod(m,2) - nmod = mod(n,2) - if(nmod .ne. 0) go to 1 - cth = cdt - sth = sdt - if(mmod .ne. 0) go to 2 -c -c n even m even -c - ncv = n/2 - do 10 k=1,ncv - vh = vh+cv(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 10 continue - return -c -c n even m odd -c - 2 ncv = n/2 - do 15 k=1,ncv - vh = vh+cv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 15 continue - return - 1 if(mmod .ne. 0) go to 3 -c -c n odd m even -c - ncv = (n+1)/2 - do 20 k=1,ncv - vh = vh+cv(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 20 continue - return -c -c case m odd and n odd -c - 3 ncv = (n+1)/2 - do 25 k=1,ncv - vh = vh+cv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 25 continue - return - end - subroutine dwbt(m,n,theta,cw,wh) - dimension cw(1) - double precision theta,cw,wh,cth,sth,cdt,sdt,chh - wh = 0. - if(n.le.0 .or. m.le.0) return - cth = dcos(theta) - sth = dsin(theta) - cdt = cth*cth-sth*sth - sdt = 2.*sth*cth - mmod=mod(m,2) - nmod=mod(n,2) - if(nmod .ne. 0) go to 1 - if(mmod .ne. 0) go to 2 -c -c n even m even -c - ncw = n/2 - do 10 k=1,ncw - wh = wh+cw(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 10 continue - return -c -c n even m odd -c - 2 ncw = n/2 - do 8 k=1,ncw - wh = wh+cw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 8 continue - return - 1 cth = cdt - sth = sdt - if(mmod .ne. 0) go to 3 -c -c n odd m even -c - ncw = (n-1)/2 - do 20 k=1,ncw - wh = wh+cw(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 20 continue - return -c -c case m odd and n odd -c - 3 ncw = (n+1)/2 - wh = .5*cw(1) - if(ncw.lt.2) return - do 25 k=2,ncw - wh = wh+cw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 25 continue - return - end - subroutine rabcv(nlat,nlon,abc) -c -c subroutine rabcp computes the coefficients in the recurrence -c relation for the functions vbar(m,n,theta). array abc -c must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 locations. -c - dimension abc(1) - mmax = min0(nlat,(nlon+1)/2) - labc = (max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - iw1 = labc+1 - iw2 = iw1+labc - call rabcv1(nlat,nlon,abc,abc(iw1),abc(iw2)) - return - end - subroutine rabcv1(nlat,nlon,a,b,c) -c -c coefficients a, b, and c for computing vbar(m,n,theta) are -c stored in location ((m-2)*(nlat+nlat-m-1))/2+n+1 -c - dimension a(1),b(1),c(1) - mmax = min0(nlat,(nlon+1)/2) - if(mmax .lt. 3) return - do 215 mp1=3,mmax - m = mp1-1 - ns = ((m-2)*(nlat+nlat-m-1))/2+1 - fm = float(m) - tm = fm+fm - temp = tm*(tm-1.) - tpn = (fm-2.)*(fm-1.)/(fm*(fm+1.)) - a(ns) = sqrt(tpn*(tm+1.)*(tm-2.)/temp) - c(ns) = sqrt(2./temp) - if(m .eq. nlat-1) go to 215 - ns = ns+1 - temp = tm*(tm+1.) - tpn = (fm-1.)*fm/((fm+1.)*(fm+2.)) - a(ns) = sqrt(tpn*(tm+3.)*(tm-2.)/temp) - c(ns) = sqrt(6./temp) - mp3 = m+3 - if(mp3 .gt. nlat) go to 215 - do 210 np1=mp3,nlat - n = np1-1 - ns = ns+1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - tpn = (fn-2.)*(fn-1.)/(fn*(fn+1.)) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - a(ns) = sqrt(tpn*cn*(fnpm-3.)*(fnpm-2.)/temp) - b(ns) = sqrt(tpn*cn*fnmm*(fnmm-1.)/temp) - c(ns) = sqrt((fnmm+1.)*(fnmm+2.)/temp) - 210 continue - 215 continue - return - end - subroutine rabcw(nlat,nlon,abc) -c -c subroutine rabcw computes the coefficients in the recurrence -c relation for the functions wbar(m,n,theta). array abc -c must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 locations. -c - dimension abc(1) - mmax = min0(nlat,(nlon+1)/2) - labc = (max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - iw1 = labc+1 - iw2 = iw1+labc - call rabcw1(nlat,nlon,abc,abc(iw1),abc(iw2)) - return - end - subroutine rabcw1(nlat,nlon,a,b,c) -c -c coefficients a, b, and c for computing wbar(m,n,theta) are -c stored in location ((m-2)*(nlat+nlat-m-1))/2+n+1 -c - dimension a(1),b(1),c(1) - mmax = min0(nlat,(nlon+1)/2) - if(mmax .lt. 4) return - do 215 mp1=4,mmax - m = mp1-1 - ns = ((m-2)*(nlat+nlat-m-1))/2+1 - fm = float(m) - tm = fm+fm - temp = tm*(tm-1.) - tpn = (fm-2.)*(fm-1.)/(fm*(fm+1.)) - tph = fm/(fm-2.) - a(ns) = tph*sqrt(tpn*(tm+1.)*(tm-2.)/temp) - c(ns) = tph*sqrt(2./temp) - if(m .eq. nlat-1) go to 215 - ns = ns+1 - temp = tm*(tm+1.) - tpn = (fm-1.)*fm/((fm+1.)*(fm+2.)) - tph = fm/(fm-2.) - a(ns) = tph*sqrt(tpn*(tm+3.)*(tm-2.)/temp) - c(ns) = tph*sqrt(6./temp) - mp3 = m+3 - if(mp3 .gt. nlat) go to 215 - do 210 np1=mp3,nlat - n = np1-1 - ns = ns+1 - fn = float(n) - tn = fn+fn - cn = (tn+1.)/(tn-3.) - fnpm = fn+fm - fnmm = fn-fm - temp = fnpm*(fnpm-1.) - tpn = (fn-2.)*(fn-1.)/(fn*(fn+1.)) - tph = fm/(fm-2.) - a(ns) = tph*sqrt(tpn*cn*(fnpm-3.)*(fnpm-2.)/temp) - b(ns) = sqrt(tpn*cn*fnmm*(fnmm-1.)/temp) - c(ns) = tph*sqrt((fnmm+1.)*(fnmm+2.)/temp) - 210 continue - 215 continue - return - end - subroutine vtinit (nlat,nlon,wvbin,dwork) - dimension wvbin(*) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wvbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of dwork is nlat+2 -c - call vtini1 (nlat,nlon,imid,wvbin,wvbin(iw1),dwork, - 1 dwork(nlat/2+2)) - return - end - subroutine vtini1 (nlat,nlon,imid,vb,abc,cvb,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c cvb and work must each have nlat/2+1 locations -c - dimension vb(imid,nlat,2),abc(1),cvb(1) - double precision pi,dt,cvb,th,vbh,work(*) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - mdo = min0(2,nlat,(nlon+1)/2) - do 160 mp1=1,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dvtk(m,n,cvb,work) - do 165 i=1,imid - th = (i-1)*dt - call dvtt(m,n,th,cvb,vbh) - vb(i,np1,mp1) = vbh - 165 continue - 160 continue - call rabcv(nlat,nlon,abc) - return - end - subroutine wtinit (nlat,nlon,wwbin,dwork) - dimension wwbin(1) - double precision dwork(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c the length of wwbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of dwork is nlat+2 -c - call wtini1 (nlat,nlon,imid,wwbin,wwbin(iw1),dwork, - 1 dwork(nlat/2+2)) - return - end - subroutine wtini1 (nlat,nlon,imid,wb,abc,cwb,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c cwb and work must each have nlat/2+1 locations -c - dimension wb(imid,nlat,2),abc(1) - double precision pi,dt,cwb(*),wbh,th,work(*) - pi = 4.*datan(1.d0) - dt = pi/(nlat-1) - mdo = min0(3,nlat,(nlon+1)/2) - if(mdo .lt. 2) return - do 160 mp1=2,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dwtk(m,n,cwb,work) - do 165 i=1,imid - th = (i-1)*dt - call dwtt(m,n,th,cwb,wbh) - wb(i,np1,m) = wbh - 165 continue - 160 continue - call rabcw(nlat,nlon,abc) - return - end - subroutine vtgint (nlat,nlon,theta,wvbin,work) - dimension wvbin(*) - double precision theta(*), work(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c theta is a double precision array with (nlat+1)/2 locations -c nlat is the maximum value of n+1 -c the length of wvbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of work is nlat+2 -c - call vtgit1 (nlat,nlon,imid,theta,wvbin,wvbin(iw1), - + work,work(nlat/2+2)) - return - end - subroutine vtgit1 (nlat,nlon,imid,theta,vb,abc,cvb,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c cvb and work must each have nlat/2+1 locations -c - dimension vb(imid,nlat,2),abc(*) - double precision theta(*),cvb(*),work(*),vbh - mdo = min0(2,nlat,(nlon+1)/2) - do 160 mp1=1,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dvtk(m,n,cvb,work) - do 165 i=1,imid - call dvtt(m,n,theta(i),cvb,vbh) - vb(i,np1,mp1) = vbh - 165 continue - 160 continue - call rabcv(nlat,nlon,abc) - return - end - subroutine wtgint (nlat,nlon,theta,wwbin,work) - dimension wwbin(*) - double precision theta(*), work(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c theta is a double precision array with (nlat+1)/2 locations -c nlat is the maximum value of n+1 -c the length of wwbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of work is nlat+2 -c - call wtgit1 (nlat,nlon,imid,theta,wwbin,wwbin(iw1), - 1 work,work(nlat/2+2)) - return - end - subroutine wtgit1 (nlat,nlon,imid,theta,wb,abc,cwb,work) -c -c abc must have 3*((nlat-3)*nlat+2)/2 locations -c cwb and work must each have nlat/2+1 locations -c - dimension wb(imid,nlat,2),abc(1) - double precision theta(*), cwb(*), work(*), wbh - mdo = min0(3,nlat,(nlon+1)/2) - if(mdo .lt. 2) return - do 160 mp1=2,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dwtk(m,n,cwb,work) - do 165 i=1,imid - call dwtt(m,n,theta(i),cwb,wbh) - wb(i,np1,m) = wbh - 165 continue - 160 continue - call rabcw(nlat,nlon,abc) - return - end - subroutine dvtk(m,n,cv,work) - double precision cv(*),work(*),fn,fk,cf,srnp1 - cv(1) = 0. - if(n .le. 0) return - fn = n - srnp1 = dsqrt(fn*(fn+1.)) - cf = 2.*m/srnp1 - modn = mod(n,2) - modm = mod(m,2) - call dnlfk(m,n,work) - if(modn .ne. 0) go to 70 - ncv = n/2 - if(ncv .eq. 0) return - fk = 0. - if(modm .ne. 0) go to 60 -c -c n even m even -c - do 55 l=1,ncv - fk = fk+2. - cv(l) = -fk*fk*work(l+1)/srnp1 - 55 continue - return -c -c n even m odd -c - 60 do 65 l=1,ncv - fk = fk+2. - cv(l) = -fk*fk*work(l)/srnp1 - 65 continue - return - 70 ncv = (n+1)/2 - fk = -1. - if(modm .ne. 0) go to 80 -c -c n odd m even -c - do 75 l=1,ncv - fk = fk+2. - cv(l) = -fk*fk*work(l)/srnp1 - 75 continue - return -c -c n odd m odd -c - 80 do 85 l=1,ncv - fk = fk+2. - cv(l) = -fk*fk*work(l)/srnp1 - 85 continue - return - end - subroutine dwtk(m,n,cw,work) - double precision cw(*),work(*),fn,cf,srnp1 - cw(1) = 0. - if(n.le.0 .or. m.le.0) return - fn = n - srnp1 = dsqrt(fn*(fn+1.)) - cf = 2.*m/srnp1 - modn = mod(n,2) - modm = mod(m,2) - call dnlfk(m,n,work) - if(m .eq. 0) go to 50 - if(modn .ne. 0) go to 30 - l = n/2 - if(l .eq. 0) go to 50 - if(modm .ne. 0) go to 20 -c -c n even m even -c - cw(l) = -cf*work(l+1) - 10 l = l-1 - if(l .le. 0) go to 50 - cw(l) = cw(l+1)-cf*work(l+1) - cw(l+1) = (l+l+1)*cw(l+1) - go to 10 -c -c n even m odd -c - 20 cw(l) = cf*work(l) - 25 l = l-1 - if(l) 50,27,26 - 26 cw(l) = cw(l+1)+cf*work(l) - 27 cw(l+1) = -(l+l+1)*cw(l+1) - go to 25 - 30 if(modm .ne. 0) go to 40 - l = (n-1)/2 - if(l .eq. 0) go to 50 -c -c n odd m even -c - cw(l) = -cf*work(l+1) - 35 l = l-1 - if(l) 50,37,36 - 36 cw(l) = cw(l+1)-cf*work(l+1) - 37 cw(l+1) = (l+l+2)*cw(l+1) - go to 35 -c -c n odd m odd -c - 40 l = (n+1)/2 - cw(l) = cf*work(l) - 45 l = l-1 - if(l) 50,47,46 - 46 cw(l) = cw(l+1)+cf*work(l) - 47 cw(l+1) = -(l+l)*cw(l+1) - go to 45 - 50 return - end - subroutine dvtt(m,n,theta,cv,vh) - dimension cv(1) - double precision cv,vh,theta,cth,sth,cdt,sdt,chh - vh = 0. - if(n.eq.0) return - cth = dcos(theta) - sth = dsin(theta) - cdt = cth*cth-sth*sth - sdt = 2.*sth*cth - mmod = mod(m,2) - nmod = mod(n,2) - if(nmod .ne. 0) go to 1 - cth = cdt - sth = sdt - if(mmod .ne. 0) go to 2 -c -c n even m even -c - ncv = n/2 - do 10 k=1,ncv - vh = vh+cv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 10 continue - return -c -c n even m odd -c - 2 ncv = n/2 - do 15 k=1,ncv - vh = vh+cv(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 15 continue - return - 1 if(mmod .ne. 0) go to 3 -c -c n odd m even -c - ncv = (n+1)/2 - do 20 k=1,ncv - vh = vh+cv(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 20 continue - return -c -c case m odd and n odd -c - 3 ncv = (n+1)/2 - do 25 k=1,ncv - vh = vh+cv(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 25 continue - return - end - subroutine dwtt(m,n,theta,cw,wh) - dimension cw(1) - double precision theta,cw,wh,cth,sth,cdt,sdt,chh - wh = 0. - if(n.le.0 .or. m.le.0) return - cth = dcos(theta) - sth = dsin(theta) - cdt = cth*cth-sth*sth - sdt = 2.*sth*cth - mmod=mod(m,2) - nmod=mod(n,2) - if(nmod .ne. 0) go to 1 - if(mmod .ne. 0) go to 2 -c -c n even m even -c - ncw = n/2 - do 10 k=1,ncw - wh = wh+cw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 10 continue - return -c -c n even m odd -c - 2 ncw = n/2 - do 8 k=1,ncw - wh = wh+cw(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 8 continue - return - 1 cth = cdt - sth = sdt - if(mmod .ne. 0) go to 3 -c -c n odd m even -c - ncw = (n-1)/2 - do 20 k=1,ncw - wh = wh+cw(k)*cth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 20 continue - return -c -c case m odd and n odd -c - 3 ncw = (n+1)/2 - wh = 0. - if(ncw.lt.2) return - do 25 k=2,ncw - wh = wh+cw(k)*sth - chh = cdt*cth-sdt*sth - sth = sdt*cth+cdt*sth - cth = chh - 25 continue - return - end - subroutine vbgint (nlat,nlon,theta,wvbin,work) - dimension wvbin(1) - double precision theta(*),work(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c theta is a double precision array with (nlat+1)/2 locations -c nlat is the maximum value of n+1 -c the length of wvbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of work is nlat+2 -c - call vbgit1 (nlat,nlon,imid,theta,wvbin,wvbin(iw1), - + work,work(nlat/2+2)) - return - end - subroutine vbgit1 (nlat,nlon,imid,theta,vb,abc,cvb,work) -c -c abc must have 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c locations where mmax = min0(nlat,(nlon+1)/2) -c cvb and work must each have nlat/2+1 locations -c - dimension vb(imid,nlat,2),abc(1) - double precision cvb(1),theta(1),vbh,work(1) - mdo = min0(2,nlat,(nlon+1)/2) - do 160 mp1=1,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dvbk(m,n,cvb,work) - do 165 i=1,imid - call dvbt(m,n,theta(i),cvb,vbh) - vb(i,np1,mp1) = vbh - 165 continue - 160 continue - call rabcv(nlat,nlon,abc) - return - end - subroutine wbgint (nlat,nlon,theta,wwbin,work) - dimension wwbin(1) - double precision work(*),theta(*) - imid = (nlat+1)/2 - iw1 = 2*nlat*imid+1 -c -c theta is a double precision array with (nlat+1)/2 locations -c nlat is the maximum value of n+1 -c the length of wwbin is 2*nlat*imid+3*((nlat-3)*nlat+2)/2 -c the length of work is nlat+2 -c - call wbgit1 (nlat,nlon,imid,theta,wwbin,wwbin(iw1), - + work,work(nlat/2+2)) - return - end - subroutine wbgit1 (nlat,nlon,imid,theta,wb,abc,cwb,work) -c -c abc must have 3*((nlat-3)*nlat+2)/2 locations -c cwb and work must each have nlat/2+1 locations -c - dimension wb(imid,nlat,2),abc(1) - double precision cwb(1),theta(1),wbh,work(1) - mdo = min0(3,nlat,(nlon+1)/2) - if(mdo .lt. 2) return - do 160 mp1=2,mdo - m = mp1-1 - do 160 np1=mp1,nlat - n = np1-1 - call dwbk(m,n,cwb,work) - do 165 i=1,imid - call dwbt(m,n,theta(i),cwb,wbh) - wb(i,np1,m) = wbh - 165 continue - 160 continue - call rabcw(nlat,nlon,abc) - return - end - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sphere.f90 b/sorc/hafs_tools.fd/libsrc/src/spherepack/sphere.f90 deleted file mode 100644 index 8ea940a4c..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sphere.f90 +++ /dev/null @@ -1,1625 +0,0 @@ - module sphere -! -! fortran95 interface for spherepack. -! For regular and gaussian lat/lon grids. -! -! requires NCAR's SPHEREPACK 3.2 -! (http://www2.cisl.ucar.edu/resources/legacy/spherepack) -! -! Version 1.2 - February, 2012 -! Jeff Whitaker - -!---------------------------------------------------------------------------- -! Fortran95 module that drives NCAR's SPHEREPACK 3.0 Fortran77 routines -! for spherical harmonic synthesis and analysis. sphere.f90 works for -! both gaussian and regularly spaced lat/lon grids. All of the routines -! have very simple interfaces, and the arguments are almost self-explanatory. -! The last argument for each subroutine (gridtype - character*3) is optional -! and specifies the type of lat/lon grid. Valid values are 'REG' or 'GAU' -! ('REG' is the default). Each one of the routines can also be called -! using SUBROUTINENAME_REG or SUBROUTINENAME_GAU, with the gridtype argument -! omitted. For example, converting spherical harmonic coefficients to a -! regular grid can be accomplished by CALL GRDTOSPEC(datagrid,dataspec,'REG') -! or CALL SPECTOGRD_REG(datagrid,dataspec). CALL GRDTOSPEC(datagrid,dataspec) -! would accomplish the same thing, since the default value of the optional -! argument gridtype is 'REG'. - -! The available routines are: - -! SUBROUTINE GRDTOSPEC(datagrid,dataspec,gridtype): -! converts input gridded data array (datagrid) to complex spectral -! coefficients (dataspec). - -! SUBROUTINE SPECTOGRD(dataspec,datagrid,gridtype): -! converts input spectral coefficient array (dataspec) to a grid (datagrid). - -! SUBROUTINE SPECSMOOTH(datagrid,smooth,gridtype): -! isotropic spectral smoothing of input gridded data array (datagrid). -! Smoothing is a function of total wavenumber only, given by vector smooth -! (smooth(j),j=1,mtrunc+1, where mtrunc is the triangular truncation -! limit - see Important Details below). For example, for Gaussian spectral -! smoothing, use smooth(j) = exp(-(float(j-1)/deln)**2), where deln is the -! e-folding width of the smoother in total wavenumber space. For straight -! triangular truncation, set smooth(j) = 0 for j-1 > desired truncation limit. - -! SUBROUTINE GETUV(vrtspec,divspec,ugrid,vgrid,rsphere,gridtype): -! given input spectral coefficients of vorticity and divergence -! (vrtspec,divspec) calculates gridded winds (ugrid,vgrid). -! rsphere is the radius of the sphere. - -! SUBROUTINE GETGRAD(dataspec,gradx,grady,rsphere,gridtype): -! calculates gridded vector gradient (gradx,grady) given input -! spectral coefficients. rsphere is the radius of the sphere. - -! SUBROUTINE GETVRTDIVSPEC(ugrid,vgrid,vrtspec,divspec,rsphere,gridtype): -! given input gridded winds (ugrid,vgrid) calculates spectral coefficients -! of vorticity and divergence (vrtspec,divspec). rsphere is the radius of -! the sphere. - -! SUBROUTINE GAUINFO(gaulats,weights): -! calculate gaussian latitudes and weights for grid determined -! by the size of gaulats and weights (which must be the same). - -! SUBROUTINE CLEANUP(gridtype): -! Garbage collection. Deallocates all work arrays. -! Call this when you are done with the module to free up memory. - -! All of these routines use triangular truncation. - -! Important Details: - -! The grid and spectral arrays must be rank 2 and rank 1, respectively. -! Passing array sections is OK. - -! The gridded data is assumed to be oriented such that i=1 is the -! Greenwich meridian and j=1 is the northernmost point. Grid indices -! increase eastward and southward. If nlat is odd the equator will be -! included as a grid point. If nlat is even the equator will lie half -! way between points nlat/2 and (nlat/2)+1. nlat must be at least 3. -! The grid increment in longitude is 2*pi/nlon radians. For example, -! nlon = 72 for a five degree grid. nlon must be greater than or -! equal to 4. The efficiency of the computation is improved when nlon -! is a product of small prime numbers. - -! The spectral data is assumed to be in a complex array of dimension -! (MTRUNC+1)*(MTRUNC+2)/2. MTRUNC is the triangular truncation limit -! (MTRUNC = 42 for T42). MTRUNC must be <= nlat-1. Coefficients are -! ordered so that first (nm=1) is m=0,n=0, second is m=0,n=1, -! nm=mtrunc is m=0,n=mtrunc, nm=mtrunc+1 is m=1,n=1, etc. -! In Fortran95 syntax, values of m (degree) and n (order) as a function -! of the index nm are: - -! integer, dimension((mtrunc+1)*(mtrunc+2)/2) :: indxm,indxn -! indxm = (/((m,n=m,mtrunc),m=0,mtrunc)/) -! indxn = (/((n,n=m,mtrunc),m=0,mtrunc)/) - -! Conversely, the index nm as a function of m and n is: -! nm = sum((/(i,i=mtrunc+1,mtrunc-m+2,-1)/))+n-m+1 - -! The associated legendre polynomials are normalized so that the -! integral (pbar(n,m,theta)**2)*sin(theta) on the interval theta=0 -! to theta=pi is 1, where: - -! pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m)/(2*factorial(n+m))) * -! sin(theta)**m/(2**n*factorial(n)) times the (n+m)th derivative of -! (x**2-1)**n with respect to x=cos(theta) - -! note: theta = 0.5*pi - phi, where phi is latitude and theta is colatitude. -! Therefore, cos(theta) = sin(phi) and sin(theta) = cos(phi). -! Note that pbar(0,0,theta)=sqrt(2)/2, and -! pbar(1,0,theta)=0.5*sqrt(6.)*sin(lat). -!---------------------------------------------------------------------------- - - -! logical variables set to .FALSE. after work arrays initialized on -! first call. If nlon or nlat changes (as determined by size of -! input array), work arrays are reallocated and -! recomputed. - - implicit none - private - public :: & - grdtospec_reg,spectogrd_reg,getuv_reg,getgrad_reg,& - getvrtdivspec_reg,specsmooth_reg,cleanup_reg,& - grdtospec_gau,spectogrd_gau,getuv_gau,getgrad_gau,& - getvrtdivspec_gau,specsmooth_gau,cleanup_gau,& - grdtospec,spectogrd,getuv,getgrad,& - getvrtdivspec,specsmooth,cleanup - - integer, save :: saved_nlon_reg_spectogrd = -1 - integer, save :: saved_nlat_reg_spectogrd = -1 - integer, save :: saved_nlon_reg_vspectogrd = -1 - integer, save :: saved_nlat_reg_vspectogrd = -1 - integer, save :: saved_nlon_reg_grdtospec = -1 - integer, save :: saved_nlat_reg_grdtospec = -1 - integer, save :: saved_nlon_reg_vgrdtospec = -1 - integer, save :: saved_nlat_reg_vgrdtospec = -1 - integer, save :: saved_nlon_gau_spectogrd = -1 - integer, save :: saved_nlat_gau_spectogrd = -1 - integer, save :: saved_nlon_gau_vspectogrd = -1 - integer, save :: saved_nlat_gau_vspectogrd = -1 - integer, save :: saved_nlon_gau_grdtospec = -1 - integer, save :: saved_nlat_gau_grdtospec = -1 - integer, save :: saved_nlon_gau_vgrdtospec = -1 - integer, save :: saved_nlat_gau_vgrdtospec = -1 - logical, save :: lfrst_grdtospec_reg=.TRUE. - logical, save :: lfrst_spectogrd_reg=.TRUE. - logical, save :: lfrst_vgrdtospec_reg=.TRUE. - logical, save :: lfrst_vspectogrd_reg=.TRUE. - logical, save :: lfrst_grdtospec_gau=.TRUE. - logical, save :: lfrst_spectogrd_gau=.TRUE. - logical, save :: lfrst_vgrdtospec_gau=.TRUE. - logical, save :: lfrst_vspectogrd_gau=.TRUE. - -! work arrays are allocated in module subroutines when above -! logical variables are .TRUE., or when nlon or nlat change. - - real, dimension(:), allocatable, save :: wshaes,wshses,wvhaes,wvhses - real, dimension(:), allocatable, save :: wshags,wshsgs,wvhags,wvhsgs - - contains - - subroutine gauinfo(gaulats,weights) -! -! calculate gaussian latitudes and weights. -! number of latitudes desired inferred from size of gaulats and weights -! (both must have same size) -! - real, dimension(:), intent(out) :: gaulats,weights - double precision, dimension(:), allocatable :: theta,wts - double precision workdp - integer nlat, lwork, ierror - - nlat = size(gaulats) - if (nlat .ne. size(weights)) then - write(6,*) 'gaulats and weights must be same size!' - write(6,*) 'stopping in gauinfo' - stop - end if - lwork = nlat*(nlat+2) - allocate(theta(nlat)) - allocate(wts(nlat)) - call gaqd(nlat,theta,wts,workdp,lwork,ierror) - gaulats = 2.*atan(1.0) - theta - weights = wts - deallocate(theta) - deallocate(wts) - - end subroutine gauinfo - - subroutine grdtospec(datagrid,dataspec,gridtype) - real, dimension(:,:), intent(in) :: datagrid - complex, dimension(:), intent(out) :: dataspec - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call grdtospec_gau(datagrid,dataspec) - else if (gridtype .eq. 'REG') then - call grdtospec_reg(datagrid,dataspec) - else - write(6,*) 'SUBROUTINE GRDTOSPEC:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call grdtospec_reg(datagrid,dataspec) - endif - end subroutine grdtospec - - subroutine spectogrd(dataspec,datagrid,gridtype) - real, dimension(:,:), intent(out) :: datagrid - complex, dimension(:), intent(in) :: dataspec - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call spectogrd_gau(dataspec,datagrid) - else if (gridtype .eq. 'REG') then - call spectogrd_reg(dataspec,datagrid) - else - write(6,*) 'SUBROUTINE SPECTOGRD:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call spectogrd_reg(dataspec,datagrid) - endif - end subroutine spectogrd - - subroutine specsmooth(datagrid,smooth,gridtype) - real, dimension(:,:), intent(inout) :: datagrid - real, dimension(:), intent(in) :: smooth - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call specsmooth_gau(datagrid,smooth) - else if (gridtype .eq. 'REG') then - call specsmooth_reg(datagrid,smooth) - else - write(6,*) 'SUBROUTINE SPECSMOOTH:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call specsmooth_reg(datagrid,smooth) - endif - end subroutine specsmooth - - subroutine getvrtdivspec(ugrid,vgrid,vrtspec,divspec,rsphere,gridtype) - real, intent(in) :: rsphere - real, dimension(:,:), intent(in) :: ugrid,vgrid - complex, dimension(:), intent(out) :: vrtspec,divspec - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call getvrtdivspec_gau(ugrid,vgrid,vrtspec,divspec,rsphere) - else if (gridtype .eq. 'REG') then - call getvrtdivspec_reg(ugrid,vgrid,vrtspec,divspec,rsphere) - else - write(6,*) 'SUBROUTINE GETVRTDIVSPEC:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call getvrtdivspec_reg(ugrid,vgrid,vrtspec,divspec,rsphere) - endif - end subroutine getvrtdivspec - - subroutine getuv(vrtspec,divspec,ugrid,vgrid,rsphere,gridtype) - real, intent(in) :: rsphere - real, dimension(:,:), intent(out) :: ugrid,vgrid - complex, dimension(:), intent(in) :: vrtspec,divspec - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call getuv_gau(vrtspec,divspec,ugrid,vgrid,rsphere) - else if (gridtype .eq. 'REG') then - call getuv_reg(vrtspec,divspec,ugrid,vgrid,rsphere) - else - write(6,*) 'SUBROUTINE GETUV:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call getuv_reg(vrtspec,divspec,ugrid,vgrid,rsphere) - endif - end subroutine getuv - - subroutine getgrad(dataspec,gradx,grady,rsphere,gridtype) - real, intent(in) :: rsphere - real, dimension(:,:), intent(out) :: gradx,grady - complex, dimension(:), intent(in) :: dataspec - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call getgrad_gau(dataspec,gradx,grady,rsphere) - else if (gridtype .eq. 'REG') then - call getgrad_reg(dataspec,gradx,grady,rsphere) - else - write(6,*) 'SUBROUTINE GETGRAD:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call getgrad_reg(dataspec,gradx,grady,rsphere) - endif - end subroutine getgrad - - subroutine cleanup(gridtype) - character(*), intent(in), optional :: gridtype - if (present(gridtype)) then - if (gridtype .eq. 'GAU') then - call cleanup_gau - else if (gridtype .eq. 'REG') then - call cleanup_reg - else - write(6,*) 'SUBROUTINE CLEANUP:' - write(6,*) 'optional argument gridtype = ',gridtype - write(6,*) 'must be either REG or GAU (default REG)' - stop - end if - else - call cleanup_reg - endif - end subroutine cleanup - - subroutine grdtospec_reg(datagrid,dataspec) - -! converts gridded input array (datagrid) to complex spectral coefficients -! (dataspec). - - real, dimension(:,:), intent(in) :: datagrid - complex, dimension(:), intent(out) :: dataspec - - real, dimension((4*size(datagrid,1)+2)*size(datagrid,2)) :: work - double precision, dimension(2*(size(datagrid,2)+1)) :: dwork - real, dimension(size(datagrid,2),size(datagrid,1)) :: temp - real, dimension(size(datagrid,2),size(datagrid,2)) :: a,b - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lshaes,ierror,m,n - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - - nlon = size(datagrid,1) - nlat = size(datagrid,2) - if (nlon .ne. saved_nlon_reg_grdtospec .or. nlat .ne. saved_nlat_reg_grdtospec) then - lfrst_grdtospec_reg = .TRUE. - saved_nlon_reg_grdtospec = nlon - saved_nlat_reg_grdtospec = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 - - -! initialize work array wshaes for spherical harmonic analysis. -! only done when lfrst_grdtospec_reg = .T. - - if (lfrst_grdtospec_reg) then - - if (allocated(wshaes)) deallocate(wshaes) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshaes = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 - - allocate(wshaes(lshaes)) - - call shaesi(nlat,nlon,wshaes,lshaes, & - work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in shaesi') - lfrst_grdtospec_reg = .FALSE. - else - lshaes = size(wshaes,1) - endif - -! transpose data. - - temp = transpose(datagrid) - -! spherical harmonic analysis. - - call shaes(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshaes,lshaes,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in shaes') - -! fill complex array dataspec with result. - - dataspec = cmplx( 0.5*(/((a(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/), & - 0.5*(/((b(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/) ) - - end subroutine grdtospec_reg - - subroutine spectogrd_reg(dataspec,datagrid) - -! converts complex spectral coefficients (dataspec) to -! gridded data array (datagrid). - - - real, dimension(:,:), intent(inout) :: datagrid - complex, dimension(:), intent(in) :: dataspec - - real, dimension((4*size(datagrid,1)+2)*size(datagrid,2)) :: work - double precision, dimension(2*(size(datagrid,2)+1)) :: dwork - real, dimension(size(datagrid,2),size(datagrid,1)) :: temp - real, dimension(size(datagrid,2),size(datagrid,2)) :: a,b - - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lshses,ierror,m,n,nn,i - -! compute array dimensions and infer truncation limit -! from size of dataspec. - - nlon = size(datagrid,1) - nlat = size(datagrid,2) - if (nlon .ne. saved_nlon_reg_spectogrd .or. nlat .ne. saved_nlat_reg_spectogrd) then - lfrst_spectogrd_reg = .TRUE. - saved_nlon_reg_spectogrd = nlon - saved_nlat_reg_spectogrd = nlat - else - end if - lwork = size(work) - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 - -! compute work array wshses for spherical harmonic synthesis. -! only done when lfrst_spectogrd_reg = .T. - - if (lfrst_spectogrd_reg) then - - if (allocated(wshses)) deallocate(wshses) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshses = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 - - allocate(wshses(lshses)) - - call shsesi(nlat,nlon,wshses,lshses,work,lwork, & - dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in shsesi') - lfrst_spectogrd_reg = .FALSE. - else - lshses = size(wshses,1) - endif - -! fill two real arrays (a,b) with contents of dataspec. - - a = 0. - b = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = 2.*real(dataspec(nn)) - b(m,n) = 2.*aimag(dataspec(nn)) - enddo - enddo - -! spherical harmonic synthesis. - - call shses(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshses,lshses,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in shses') - -! transpose data. - - datagrid = transpose(temp) - - end subroutine spectogrd_reg - - subroutine getgrad_reg(dataspec,gradx,grady,rsphere) - -! given spectral coefficients compute gridded vector gradient. -! rsphere is the radius of the sphere in meters. - - real, intent(in) :: rsphere - real, dimension(:,:), intent(out) :: grady,gradx - complex, dimension(:), intent(in) :: dataspec - - real, dimension((4*size(grady,1)+2)*size(grady,2)) :: work - double precision, dimension(2*(size(grady,2)+1)) :: dwork - real, dimension(size(grady,2),size(grady,1)) :: v,w - real, dimension(size(grady,2),size(grady,2)) :: br,bi,cr,ci,a,b - real, dimension(size(grady,2)) :: sqnn - - real fn - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lvhses,ierror,m,n,nn,i - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - nlon = size(grady,1) - nlat = size(grady,2) - if (nlon .ne. saved_nlon_reg_vspectogrd .or. nlat .ne. saved_nlat_reg_vspectogrd) then - lfrst_vspectogrd_reg = .TRUE. - saved_nlon_reg_vspectogrd = nlon - saved_nlat_reg_vspectogrd = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 - -! if not already done, compute work arrays for vector spherical -! harmonic synthesis. - - if (lfrst_vspectogrd_reg) then - - if (allocated(wvhses)) deallocate(wvhses) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,nlon/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lvhses = l1*l2*(nlat+nlat-l1+1)+nlon+15 - - allocate(wvhses(lvhses)) - - call vhsesi(nlat,nlon,wvhses,lvhses,work,lwork,dwork, & - ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in vhsesi') - lfrst_vspectogrd_reg = .FALSE. - else - lvhses = size(wvhses,1) - end if - -! multiply spectral coefficients of vorticity and divergence -! by appropriate factors to convert them into vector harmonic -! coefficients of winds. - - do n=1,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.))/rsphere - enddo - - a = 0. - b = 0. - br = 0. - bi = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = -2.*real(dataspec(nn)) - b(m,n) = -2.*aimag(dataspec(nn)) - enddo - enddo - do n=1,nlat - br(:,n) = a(:,n)*sqnn(n) - bi(:,n) = b(:,n)*sqnn(n) - enddo - - cr = 0. - ci = 0. - -! compute vector harmonic synthesis to get winds on grid. - - call vhses(nlat,nlon,0,1,v,w,nlat,nlon,br,bi,cr,ci, & - nlat,nlat,wvhses,lvhses,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in vhaes') - -! transpose data. -! minus sign to account for differences -! between mathematical and geophysical spherical coords. - - grady = transpose(v) - gradx = -transpose(w) - - end subroutine getgrad_reg - - subroutine specsmooth_reg(datagrid,smooth) - -! isotropic spectral smoothing of gridded data (datagrid). -! smoothing is a function of total wavenumber only, as specified -! by (smooth(n),n=1,nlat). - - real, dimension(:,:), intent(inout) :: datagrid - real, dimension(:), intent(in) :: smooth - - real, dimension((4*size(datagrid,1)+2)*size(datagrid,2)) :: work - double precision, dimension(2*(size(datagrid,2)+1)) :: dwork - real, dimension(size(datagrid,2),size(datagrid,1)) :: temp - real, dimension(size(datagrid,2),size(datagrid,2)) :: a,b - - integer nlon,nlat,lwork,ldwork,l1,l2,lshaes,lshses,ierror,j - -! compute array dimensions. - - nlon = size(datagrid,1) - nlat = size(datagrid,2) - if (nlon .ne. saved_nlon_reg_spectogrd .or. & - nlat .ne. saved_nlat_reg_spectogrd .or. & - nlon .ne. saved_nlon_reg_grdtospec .or. & - nlat .ne. saved_nlat_reg_grdtospec) then - lfrst_grdtospec_reg = .TRUE. - lfrst_spectogrd_reg = .TRUE. - saved_nlon_reg_spectogrd = nlon - saved_nlat_reg_spectogrd = nlat - saved_nlon_reg_grdtospec = nlon - saved_nlat_reg_grdtospec = nlat - end if - lwork = size(work) - lwork = size(work) - ldwork = size(dwork) - -! if not already done, initialized work arrays for spherical -! harmonic synthesis and analysis. - - if (lfrst_grdtospec_reg) then - - if (allocated(wshaes)) deallocate(wshaes) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshaes = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 - - allocate(wshaes(lshaes)) - - call shaesi(nlat,nlon,wshaes,lshaes, & - work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in shaesi') - lfrst_grdtospec_reg = .FALSE. - else - lshaes = size(wshaes,1) - end if - if (lfrst_spectogrd_reg) then - - if (allocated(wshses)) deallocate(wshses) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshses = (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 - - allocate(wshses(lshses)) - - call shsesi(nlat,nlon,wshses,lshses,work,lwork, & - dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1002) ierror - 1002 format(' error',i4,' in shsesi') - lfrst_spectogrd_reg = .FALSE. - else - lshses = size(wshses,1) - endif - -! transpose data. - - temp = transpose(datagrid) - -! perform spherical harmonic analysis. - - call shaes(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshaes,lshaes,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in shaes') - -! multiply spectral coefficients by smoothing factor -! (a function of degree only). - - do j=1,nlat - a(:,j) = smooth(j)*a(:,j) - b(:,j) = smooth(j)*b(:,j) - enddo - -! perform spherical harmonic synthesis. - - call shses(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshses,lshses,work,lwork,ierror) - if(ierror .ne. 0) write(*,1004) ierror - 1004 format(' error',i4,' in shses') - -! transpose data. - - datagrid = transpose(temp) - - end subroutine specsmooth_reg - - subroutine getvrtdivspec_reg(ugrid,vgrid,vrtspec,divspec,rsphere) - -! calculate spectral coefficients of vorticity and divergence -! (vrtspec,divspec) given input gridded winds (ugrid,vgrid). -! rsphere is the radius of the sphere in meters. - - real, intent(in) :: rsphere - real, dimension(:,:), intent(in) :: ugrid,vgrid - complex, dimension(:), intent(out) :: vrtspec,divspec - - real, dimension((4*size(ugrid,1)+2)*size(ugrid,2)) :: work - double precision, dimension(2*(size(ugrid,2)+1)) :: dwork - real, dimension(size(ugrid,2),size(ugrid,1)) :: v,w - real, dimension(size(ugrid,2),size(ugrid,2)) :: br,bi,cr,ci,a,b - real, dimension(size(ugrid,2)) :: sqnn - - real fn - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lvhaes,ierror,m,n - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - nlon = size(ugrid,1) - nlat = size(ugrid,2) - if (nlon .ne. saved_nlon_reg_vgrdtospec .or. nlat .ne. saved_nlat_reg_vgrdtospec) then - lfrst_vgrdtospec_reg = .TRUE. - saved_nlon_reg_vgrdtospec = nlon - saved_nlat_reg_vgrdtospec = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(vrtspec))))/2.)-1 - -! if not already done, compute work arrays for vector spherical -! harmonic analysis and scalar spherical harmonic synthesis. - - if (lfrst_vgrdtospec_reg) then - - if (allocated(wvhaes)) deallocate(wvhaes) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,nlon/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lvhaes = l1*l2*(nlat+nlat-l1+1)+nlon+15 - - allocate(wvhaes(lvhaes)) - - call vhaesi(nlat,nlon,wvhaes,lvhaes,work,lwork,dwork, & - ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in vhaesi') - lfrst_vgrdtospec_reg = .FALSE. - else - lvhaes = size(wvhaes,1) - endif - -! transpose data. -! minus sign to account for difference between -! mathematical and geophysical spherical coords. - - v = -transpose(vgrid) - w = transpose(ugrid) - -! calculate vector spherical harmonic analysis. - - call vhaes(nlat,nlon,0,1,v,w,nlat,nlon,br,bi,cr,ci, & - nlat,nlat,wvhaes,lvhaes,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in vhaes') - -! multiply vector harmonic coefficients of winds by -! appropriate factors to convert into vorticity and -! divergence coefficients. - - do n=1,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - enddo - - a = 0. - b = 0. - do n=1,nlat - a(:,n) = -(sqnn(n)/rsphere)*br(:,n) - b(:,n) = -(sqnn(n)/rsphere)*bi(:,n) - enddo - divspec = cmplx( 0.5*(/((a(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/), & - 0.5*(/((b(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/) ) - - do n=1,nlat - a(:,n) = (sqnn(n)/rsphere)*cr(:,n) - b(:,n) = (sqnn(n)/rsphere)*ci(:,n) - enddo - vrtspec = cmplx( 0.5*(/((a(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/), & - 0.5*(/((b(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/) ) - - end subroutine getvrtdivspec_reg - - subroutine getuv_reg(vrtspec,divspec,ugrid,vgrid,rsphere) - -! given spectral coefficients of vorticity and divergence -! (vrtspec,divspec) compute gridded winds (ugrid,vgrid). -! rsphere is the radius of the sphere in meters. - - real, intent(in) :: rsphere - real, dimension(:,:), intent(out) :: ugrid,vgrid - complex, dimension(:), intent(in) :: vrtspec,divspec - - real, dimension((4*size(ugrid,1)+2)*size(ugrid,2)) :: work - double precision, dimension(2*(size(ugrid,2)+1)) :: dwork - real, dimension(size(ugrid,2),size(ugrid,1)) :: v,w - real, dimension(size(ugrid,2),size(ugrid,2)) :: br,bi,cr,ci,a,b - real, dimension(size(ugrid,2)) :: sqnn - - real fn - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lvhses,ierror,m,n,nn,i - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - nlon = size(ugrid,1) - nlat = size(ugrid,2) - if (nlon .ne. saved_nlon_reg_vspectogrd .or. nlat .ne. saved_nlat_reg_vspectogrd) then - lfrst_vspectogrd_reg = .TRUE. - saved_nlon_reg_vspectogrd = nlon - saved_nlat_reg_vspectogrd = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(vrtspec))))/2.)-1 - -! if not already done, compute work arrays for vector spherical -! harmonic synthesis. - - if (lfrst_vspectogrd_reg) then - - if (allocated(wvhses)) deallocate(wvhses) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,nlon/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lvhses = l1*l2*(nlat+nlat-l1+1)+nlon+15 - - allocate(wvhses(lvhses)) - - call vhsesi(nlat,nlon,wvhses,lvhses,work,lwork,dwork, & - ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in vhsesi') - lfrst_vspectogrd_reg = .FALSE. - else - lvhses = size(wvhses,1) - end if - -! multiply spectral coefficients of vorticity and divergence -! by appropriate factors to convert them into vector harmonic -! coefficients of winds. - - sqnn(1) = 0. - do n=2,nlat - fn = float(n-1) - sqnn(n) = rsphere/sqrt(fn*(fn+1.)) - enddo - - a = 0. - b = 0. - br = 0. - bi = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = -2.*real(divspec(nn)) - b(m,n) = -2.*aimag(divspec(nn)) - enddo - enddo - do n=1,nlat - br(:,n) = sqnn(n)*a(:,n) - bi(:,n) = sqnn(n)*b(:,n) - enddo - - cr = 0. - ci = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = 2.*real(vrtspec(nn)) - b(m,n) = 2.*aimag(vrtspec(nn)) - enddo - enddo - do n=1,nlat - cr(:,n) = sqnn(n)*a(:,n) - ci(:,n) = sqnn(n)*b(:,n) - enddo - -! compute vector harmonic synthesis to get winds on grid. - - call vhses(nlat,nlon,0,1,v,w,nlat,nlon,br,bi,cr,ci, & - nlat,nlat,wvhses,lvhses,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in vhaes') - -! transpose data. -! minus sign to account for differences -! between mathematical and geophysical spherical coords. - - vgrid = -transpose(v) - ugrid = transpose(w) - - end subroutine getuv_reg - - subroutine cleanup_reg - -! cleanup memory allocations when done with module. - - if (allocated(wshaes)) deallocate(wshaes) - if (allocated(wshses)) deallocate(wshses) - if (allocated(wvhaes)) deallocate(wvhaes) - if (allocated(wvhses)) deallocate(wvhses) - saved_nlat_reg_grdtospec = -1 - saved_nlon_reg_grdtospec = -1 - saved_nlat_reg_vgrdtospec = -1 - saved_nlon_reg_vgrdtospec = -1 - saved_nlat_reg_spectogrd = -1 - saved_nlon_reg_spectogrd = -1 - saved_nlat_reg_vspectogrd = -1 - saved_nlon_reg_vspectogrd = -1 - lfrst_grdtospec_reg = .TRUE. - lfrst_spectogrd_reg = .TRUE. - lfrst_vgrdtospec_reg = .TRUE. - lfrst_vspectogrd_reg = .TRUE. - - end subroutine cleanup_reg - - subroutine grdtospec_gau(datagrid,dataspec) - -! converts gridded input array (datagrid) to complex spectral coefficients -! (dataspec). - - real, dimension(:,:), intent(in) :: datagrid - complex, dimension(:), intent(out) :: dataspec - - real, dimension((4*size(datagrid,1)+2)*size(datagrid,2)) :: work - double precision, dimension((3*size(datagrid,2)*(size(datagrid,2)+3)+2)/2) :: dwork - real, dimension(size(datagrid,2),size(datagrid,1)) :: temp - real, dimension(size(datagrid,2),size(datagrid,2)) :: a,b - - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lshags,ierror,m,n - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - - nlon = size(datagrid,1) - nlat = size(datagrid,2) - if (nlon .ne. saved_nlon_gau_grdtospec .or. nlat .ne. saved_nlat_gau_grdtospec) then - lfrst_grdtospec_gau = .TRUE. - saved_nlon_gau_grdtospec = nlon - saved_nlat_gau_grdtospec = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 - - -! initialize work array wshags for spherical harmonic analysis. -! only done when lfrst_grdtospec_gau = .T. - - if (lfrst_grdtospec_gau) then - - if (allocated(wshags)) deallocate(wshags) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshags = nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - - allocate(wshags(lshags)) - - call shagsi(nlat,nlon,wshags,lshags, & - work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in shagsi') - lfrst_grdtospec_gau = .FALSE. - else - lshags = size(wshags,1) - endif - -! transpose data. - - temp = transpose(datagrid) - -! spherical harmonic analysis. - - call shags(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshags,lshags,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in shags') - -! fill complex array dataspec with result. - - dataspec = cmplx( 0.5*(/((a(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/), & - 0.5*(/((b(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/) ) - - end subroutine grdtospec_gau - - subroutine spectogrd_gau(dataspec,datagrid) - -! converts complex spectral coefficients (dataspec) to -! gridded data array (datagrid). - - - real, dimension(:,:), intent(out) :: datagrid - complex, dimension(:), intent(in) :: dataspec - - real, dimension((4*size(datagrid,1)+2)*size(datagrid,2)) :: work - double precision, dimension((3*size(datagrid,2)*(size(datagrid,2)+3)+2)/2) :: dwork - real, dimension(size(datagrid,2),size(datagrid,1)) :: temp - real, dimension(size(datagrid,2),size(datagrid,2)) :: a,b - - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lshsgs,ierror,m,n,nn,i - -! compute array dimensions and infer truncation limit -! from size of dataspec. - - nlon = size(datagrid,1) - nlat = size(datagrid,2) - if (nlon .ne. saved_nlon_gau_spectogrd .or. nlat .ne. saved_nlat_gau_spectogrd) then - lfrst_spectogrd_gau = .TRUE. - saved_nlon_gau_spectogrd = nlon - saved_nlat_gau_spectogrd = nlat - end if - lwork = size(work) - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 - -! compute work array wshsgs for spherical harmonic synthesis. -! only done when lfrst_spectogrd_gau = .T. - - if (lfrst_spectogrd_gau) then - - if (allocated(wshsgs)) deallocate(wshsgs) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshsgs = nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - - allocate(wshsgs(lshsgs)) - - call shsgsi(nlat,nlon,wshsgs,lshsgs,work,lwork, & - dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in shsgsi') - lfrst_spectogrd_gau = .FALSE. - else - lshsgs = size(wshsgs,1) - endif - -! fill two real arrays (a,b) with contents of dataspec. - - a = 0. - b = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = 2.*real(dataspec(nn)) - b(m,n) = 2.*aimag(dataspec(nn)) - enddo - enddo - -! spherical harmonic synthesis. - - call shsgs(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshsgs,lshsgs,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in shsgs') - -! transpose data. - - datagrid = transpose(temp) - - end subroutine spectogrd_gau - - subroutine getgrad_gau(dataspec,gradx,grady,rsphere) - -! given spectral coefficients compute gridded vector gradient. -! rsphere is the radius of the sphere in meters. - - real, intent(in) :: rsphere - real, dimension(:,:), intent(out) :: grady,gradx - complex, dimension(:), intent(in) :: dataspec - - real, dimension((4*size(grady,1)+2)*size(grady,2)) :: work - double precision, dimension((3*size(grady,2)*(size(grady,2)+3)+2)/2) :: dwork - real, dimension(size(grady,2),size(grady,1)) :: v,w - real, dimension(size(grady,2),size(grady,2)) :: br,bi,cr,ci,a,b - real, dimension(size(grady,2)) :: sqnn - - real fn - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lvhsgs,ierror,m,n,nn,i - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - nlon = size(grady,1) - nlat = size(grady,2) - if (nlon .ne. saved_nlon_gau_vspectogrd .or. nlat .ne. saved_nlat_gau_vspectogrd) then - lfrst_vspectogrd_gau = .TRUE. - saved_nlon_gau_vspectogrd = nlon - saved_nlat_gau_vspectogrd = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 - -! if not already done, compute work arrays for vector spherical -! harmonic synthesis. - - if (lfrst_vspectogrd_gau) then - - if (allocated(wvhsgs)) deallocate(wvhsgs) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,nlon/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lvhsgs = l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat - - allocate(wvhsgs(lvhsgs)) - - call vhsgsi(nlat,nlon,wvhsgs,lvhsgs,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in vhsgsi') - lfrst_vspectogrd_gau = .FALSE. - else - lvhsgs = size(wvhsgs,1) - end if - -! multiply spectral coefficients of vorticity and divergence -! by appropriate factors to convert them into vector harmonic -! coefficients of winds. - - do n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.))/rsphere - enddo - - a = 0. - b = 0. - br = 0. - bi = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = -2.*real(dataspec(nn)) - b(m,n) = -2.*aimag(dataspec(nn)) - enddo - enddo - do n=1,nlat - br(:,n) = a(:,n)*sqnn(n) - bi(:,n) = b(:,n)*sqnn(n) - enddo - - cr = 0. - ci = 0. - -! compute vector harmonic synthesis to get winds on grid. - - call vhsgs(nlat,nlon,0,1,v,w,nlat,nlon,br,bi,cr,ci, & - nlat,nlat,wvhsgs,lvhsgs,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in vhags') - -! transpose data. -! minus sign to account for differences -! between mathematical and geophysical spherical coords. - - grady = transpose(v) - gradx = -transpose(w) - - end subroutine getgrad_gau - - subroutine specsmooth_gau(datagrid,smooth) - -! isotropic spectral smoothing of gridded data (datagrid). -! smoothing is a function of total wavenumber only, as specified -! by (smooth(n),n=1,nlat). - - real, dimension(:,:), intent(inout) :: datagrid - real, dimension(:), intent(in) :: smooth - - real, dimension((4*size(datagrid,1)+2)*size(datagrid,2)) :: work - double precision, dimension((3*size(datagrid,2)*(size(datagrid,2)+3)+2)/2) :: dwork - real, dimension(size(datagrid,2),size(datagrid,1)) :: temp - real, dimension(size(datagrid,2),size(datagrid,2)) :: a,b - - integer nlon,nlat,lwork,ldwork,l1,l2,lshags,lshsgs,ierror,j - -! compute array dimensions. - - - nlon = size(datagrid,1) - nlat = size(datagrid,2) - if (nlon .ne. saved_nlon_gau_spectogrd .or. & - nlat .ne. saved_nlat_gau_spectogrd .or. & - nlon .ne. saved_nlon_gau_grdtospec .or. & - nlat .ne. saved_nlat_gau_grdtospec) then - lfrst_grdtospec_gau = .TRUE. - lfrst_spectogrd_gau = .TRUE. - saved_nlon_gau_spectogrd = nlon - saved_nlat_gau_spectogrd = nlat - saved_nlon_gau_grdtospec = nlon - saved_nlat_gau_grdtospec = nlat - end if - lwork = size(work) - lwork = size(work) - ldwork = size(dwork) - -! if not already done, initialized work arrays for spherical -! harmonic synthesis and analysis. - - if (lfrst_grdtospec_gau) then - - if (allocated(wshags)) deallocate(wshags) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshags = nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - - allocate(wshags(lshags)) - - call shagsi(nlat,nlon,wshags,lshags, & - work,lwork,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in shagsi') - lfrst_grdtospec_gau = .FALSE. - else - lshags = size(wshags,1) - end if - if (lfrst_spectogrd_gau) then - - if (allocated(wshsgs)) deallocate(wshsgs) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,(nlon+2)/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lshsgs = nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - - allocate(wshsgs(lshsgs)) - - call shsgsi(nlat,nlon,wshsgs,lshsgs,work,lwork, & - dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1002) ierror - 1002 format(' error',i4,' in shsgsi') - lfrst_spectogrd_gau = .FALSE. - else - lshsgs = size(wshsgs,1) - endif - -! transpose data. - - temp = transpose(datagrid) - -! perform spherical harmonic analysis. - - call shags(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshags,lshags,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in shags') - -! multiply spectral coefficients by smoothing factor -! (a function of degree only). - - do j=1,nlat - a(:,j) = smooth(j)*a(:,j) - b(:,j) = smooth(j)*b(:,j) - enddo - -! perform spherical harmonic synthesis. - - call shsgs(nlat,nlon,0,1,temp,nlat,nlon,a,b,nlat,nlat, & - wshsgs,lshsgs,work,lwork,ierror) - if(ierror .ne. 0) write(*,1004) ierror - 1004 format(' error',i4,' in shsgs') - -! transpose data. - - datagrid = transpose(temp) - - end subroutine specsmooth_gau - - subroutine getvrtdivspec_gau(ugrid,vgrid,vrtspec,divspec,rsphere) - -! calculate spectral coefficients of vorticity and divergence -! (vrtspec,divspec) given input gridded winds (ugrid,vgrid). -! rsphere is the radius of the sphere in meters. - - real, intent(in) :: rsphere - real, dimension(:,:), intent(in) :: ugrid,vgrid - complex, dimension(:), intent(out) :: vrtspec,divspec - - real, dimension((4*size(ugrid,1)+2)*size(ugrid,2)) :: work - double precision, dimension((3*size(ugrid,2)*(size(ugrid,2)+3)+2)/2) :: dwork - real, dimension(size(ugrid,2),size(ugrid,1)) :: v,w - real, dimension(size(ugrid,2),size(ugrid,2)) :: br,bi,cr,ci,a,b - real, dimension(size(ugrid,2)) :: sqnn - - real fn - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lvhags,ierror,m,n - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - nlon = size(ugrid,1) - nlat = size(ugrid,2) - if (nlon .ne. saved_nlon_gau_vgrdtospec .or. nlat .ne. saved_nlat_gau_vgrdtospec) then - lfrst_vgrdtospec_gau = .TRUE. - saved_nlon_gau_vgrdtospec = nlon - saved_nlat_gau_vgrdtospec = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(vrtspec))))/2.)-1 - -! if not already done, compute work arrays for vector spherical -! harmonic analysis and scalar spherical harmonic synthesis. - - if (lfrst_vgrdtospec_gau) then - - if (allocated(wvhags)) deallocate(wvhags) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,nlon/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lvhags = (nlat+1)*(nlat+1)*nlat/2 + nlon + 15 - - allocate(wvhags(lvhags)) - - call vhagsi(nlat,nlon,wvhags,lvhags,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in vhagsi') - lfrst_vgrdtospec_gau = .FALSE. - else - lvhags = size(wvhags,1) - endif - -! transpose data. -! minus sign to account for difference between -! mathematical and geophysical spherical coords. - - v = -transpose(vgrid) - w = transpose(ugrid) - -! calculate vector spherical harmonic analysis. - - call vhags(nlat,nlon,0,1,v,w,nlat,nlon,br,bi,cr,ci, & - nlat,nlat,wvhags,lvhags,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in vhags') - -! multiply vector harmonic coefficients of winds by -! appropriate factors to convert into vorticity and -! divergence coefficients. - - do n=1,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - enddo - - a = 0. - b = 0. - do n=1,nlat - a(:,n) = -(sqnn(n)/rsphere)*br(:,n) - b(:,n) = -(sqnn(n)/rsphere)*bi(:,n) - enddo - divspec = cmplx( 0.5*(/((a(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/), & - 0.5*(/((b(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/) ) - - do n=1,nlat - a(:,n) = (sqnn(n)/rsphere)*cr(:,n) - b(:,n) = (sqnn(n)/rsphere)*ci(:,n) - enddo - vrtspec = cmplx( 0.5*(/((a(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/), & - 0.5*(/((b(m,n),n=m,ntrunc+1),m=1,ntrunc+1)/) ) - - end subroutine getvrtdivspec_gau - - subroutine getuv_gau(vrtspec,divspec,ugrid,vgrid,rsphere) - -! given spectral coefficients of vorticity and divergence -! (vrtspec,divspec) compute gridded winds (ugrid,vgrid). -! rsphere is the radius of the sphere in meters. - - real, intent(in) :: rsphere - real, dimension(:,:), intent(out) :: ugrid,vgrid - complex, dimension(:), intent(in) :: vrtspec,divspec - - real, dimension((4*size(ugrid,1)+2)*size(ugrid,2)) :: work - double precision, dimension((3*size(ugrid,2)*(size(ugrid,2)+3)+2)/2) :: dwork - real, dimension(size(ugrid,2),size(ugrid,1)) :: v,w - real, dimension(size(ugrid,2),size(ugrid,2)) :: br,bi,cr,ci,a,b - real, dimension(size(ugrid,2)) :: sqnn - - real fn - integer nlon,nlat,lwork,ldwork,ntrunc,l1,l2,lvhsgs,ierror,m,n,nn,i - -! compute array dimensions and infer truncation limit -! from size of spectral arrays. - - nlon = size(ugrid,1) - nlat = size(ugrid,2) - if (nlon .ne. saved_nlon_gau_vspectogrd .or. nlat .ne. saved_nlat_gau_vspectogrd) then - lfrst_vspectogrd_gau = .TRUE. - saved_nlon_gau_vspectogrd = nlon - saved_nlat_gau_vspectogrd = nlat - end if - lwork = size(work) - ldwork = size(dwork) - ntrunc = nint((-1.+sqrt(1+8*float(size(vrtspec))))/2.)-1 - -! if not already done, compute work arrays for vector spherical -! harmonic synthesis. - - if (lfrst_vspectogrd_gau) then - - if (allocated(wvhsgs)) deallocate(wvhsgs) - - if (mod(nlon,2) .eq. 0) then - l1 = min0(nlat,nlon/2) - else - l1 = min0(nlat,(nlon+1)/2) - end if - if (mod(nlat,2) .eq. 0) then - l2 = nlat/2 - else - l2 = (nlat+1)/2 - end if - - lvhsgs = l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat - - allocate(wvhsgs(lvhsgs)) - - call vhsgsi(nlat,nlon,wvhsgs,lvhsgs,dwork,ldwork,ierror) - if(ierror .ne. 0) write(*,1001) ierror - 1001 format(' error',i4,' in vhsgsi') - lfrst_vspectogrd_gau = .FALSE. - else - lvhsgs = size(wvhsgs,1) - end if - -! multiply spectral coefficients of vorticity and divergence -! by appropriate factors to convert them into vector harmonic -! coefficients of winds. - - sqnn(1) = 0. - do n=2,nlat - fn = float(n-1) - sqnn(n) = rsphere/sqrt(fn*(fn+1.)) - enddo - - a = 0. - b = 0. - br = 0. - bi = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = -2.*real(divspec(nn)) - b(m,n) = -2.*aimag(divspec(nn)) - enddo - enddo - do n=1,nlat - br(:,n) = sqnn(n)*a(:,n) - bi(:,n) = sqnn(n)*b(:,n) - enddo - - cr = 0. - ci = 0. - do m=1,ntrunc+1 - do n=m,ntrunc+1 - nn = sum((/(i,i=ntrunc+1,ntrunc-m+3,-1)/))+n-m+1 - a(m,n) = 2.*real(vrtspec(nn)) - b(m,n) = 2.*aimag(vrtspec(nn)) - enddo - enddo - do n=1,nlat - cr(:,n) = sqnn(n)*a(:,n) - ci(:,n) = sqnn(n)*b(:,n) - enddo - -! compute vector harmonic synthesis to get winds on grid. - - call vhsgs(nlat,nlon,0,1,v,w,nlat,nlon,br,bi,cr,ci, & - nlat,nlat,wvhsgs,lvhsgs,work,lwork,ierror) - if(ierror .ne. 0) write(*,1003) ierror - 1003 format(' error',i4,' in vhags') - -! transpose data. -! minus sign to account for differences -! between mathematical and geophysical spherical coords. - - vgrid = -transpose(v) - ugrid = transpose(w) - - end subroutine getuv_gau - - subroutine cleanup_gau - -! cleanup memory allocations when done with module. - - if (allocated(wshags)) deallocate(wshags) - if (allocated(wshsgs)) deallocate(wshsgs) - if (allocated(wvhags)) deallocate(wvhags) - if (allocated(wvhsgs)) deallocate(wvhsgs) - saved_nlat_gau_grdtospec = -1 - saved_nlon_gau_grdtospec = -1 - saved_nlat_gau_vgrdtospec = -1 - saved_nlon_gau_vgrdtospec = -1 - saved_nlat_gau_spectogrd = -1 - saved_nlon_gau_spectogrd = -1 - saved_nlat_gau_vspectogrd = -1 - saved_nlon_gau_vspectogrd = -1 - lfrst_grdtospec_gau = .TRUE. - lfrst_spectogrd_gau = .TRUE. - lfrst_vgrdtospec_gau = .TRUE. - lfrst_vspectogrd_gau = .TRUE. - - end subroutine cleanup_gau - -! that's it! - - end module sphere diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/sshifte.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/sshifte.f deleted file mode 100755 index 33e9c700a..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/sshifte.f +++ /dev/null @@ -1,571 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file sshifte.f contains code and documentation for subroutine sshifte -c and its' initialization subroutine sshifti -c -c ... required spherepack files -c -c hrfft.f -c -c subroutine sshifte(ioff,nlon,nlat,goff,greg,wsav,lsav,work,lwork,ier) -c -c *** purpose -c -c subroutine sshifte does a highly accurate 1/2 grid increment shift -c in both longitude and latitude of equally spaced data on the sphere. -c data is transferred between the nlon by nlat "offset grid" in goff -c (which excludes poles) and the nlon by nlat+1 "regular grid" in greg -c (which includes poles). the transfer can go from goff to greg or from -c greg to goff (see ioff). the grids which underly goff and greg are -c described below. the north and south poles are at latitude 0.5*pi and -c -0.5*pi radians respectively where pi = 4.*atan(1.). -c -c *** grid descriptions -c -c let dlon = (pi+pi)/nlon and dlat = pi/nlat be the uniform grid -c increments in longitude and latitude -c -c offset grid -c -c the "1/2 increment offset" grid (long(j),lat(i)) on which goff(j,i) -c is given (ioff=0) or generated (ioff=1) is -c -c long(j) =0.5*dlon + (j-1)*dlon (j=1,...,nlon) -c -c and -c -c lat(i) = -0.5*pi + 0.5*dlat + (i-1)*dlat (i=1,...,nlat) -c -c the data in goff is "shifted" one half a grid increment in longitude -c and latitude and excludes the poles. each goff(j,1) is given at -c latitude -0.5*pi+0.5*dlat and goff(j,nlat) is given at 0.5*pi-0.5*dlat -c (1/2 a grid increment away from the poles). each goff(1,i),goff(nlon,i) -c is given at longitude 0.5*dlon and 2.*pi-0.5*dlon. -c -c regular grid -c -c let dlat,dlon be as above. then the nlon by nlat+1 grid on which -c greg(j,i) is generated (ioff=0) or given (ioff=1) is given by -c -c lone(j) = (j-1)*dlon (j=1,...,nlon) -c -c and -c -c late(i) = -0.5*pi + (i-1)*dlat (i=1,...,nlat+1) -c -c values in greg include the poles and start at zero degrees longitude. -c -c *** remark -c -c subroutine sshifte can be used in conjunction with subroutine trssph -c when transferring data from an equally spaced "1/2 increment offset" -c grid to a gaussian or equally spaced grid (which includes poles) of -c any resolution. this problem (personal communication with dennis -c shea) is encountered in geophysical modeling and data analysis. -c -c *** method -c -c fast fourier transform software from spherepack2 and trigonometric -c identities are used to accurately "shift" periodic vectors half a -c grid increment in latitude and longitude. latitudinal shifts are -c accomplished by setting periodic 2*nlat vectors over the pole for each -c longitude. when nlon is odd, this requires an additional longitude -c shift. longitudinal shifts are then executed for each shifted latitude. -c when necessary (ioff=0) poles are obtained by averaging the nlon -c shifted polar values. -c -c *** required spherepack files -c -c hrfft.f -c -c *** argument description -c -c ... ioff -c -c ioff = 0 if values on the offset grid in goff are given and values -c on the regular grid in greg are to be generated. -c -c ioff = 1 if values on the regular grid in greg are given and values -c on the offset grid in goff are to be generated. -c -c ... nlon -c -c the number of longitude points on both the "offset" and "regular" -c uniform grid in longitude (see "grid description" above). nlon -c is also the first dimension of array goff and greg. nlon determines -c the grid increment in longitude as dlon = 2.*pi/nlon. for example, -c nlon = 144 for a 2.5 degree grid. nlon can be even or odd and must -c be greater than or equal to 4. the efficiency of the computation -c is improved when nlon is a product of small primes. -c -c ... nlat -c -c the number of latitude points on the "offset" uniform grid. nlat+1 -c is the number of latitude points on the "regular" uniform grid (see -c "grid description" above). nlat is the second dimension of array goff. -c nlat+1 must be the second dimension of the array greg in the program -c calling sshifte. nlat determines the grid in latitude as pi/nlat. -c for example, nlat = 36 for a five degree grid. nlat must be at least 3. -c -c ... goff -c -c a nlon by nlat array that contains data on the offset grid -c described above. goff is a given input argument if ioff=0. -c goff is a generated output argument if ioff=1. -c -c ... greg -c -c a nlon by nlat+1 array that contains data on the regular grid -c described above. greg is a given input argument if ioff=1. -c greg is a generated output argument if ioff=0. -c -c ... wsav -c -c a real saved work space array that must be initialized by calling -c subroutine sshifti(ioff,nlon,nlat,wsav,ier) before calling sshifte. -c wsav can then be used repeatedly by sshifte as long as ioff, nlon, -c and nlat do not change. this bypasses redundant computations and -c saves time. undetectable errors will result if sshifte is called -c without initializing wsav whenever ioff, nlon, or nlat change. -c -c ... lsav -c -c the length of the saved work space wsav in the routine calling sshifte -c and sshifti. lsave must be greater than or equal to 2*(2*nlat+nlon+16). -c -c ... work -c -c a real unsaved work space -c -c ... lwork -c -c the length of the unsaved work space in the routine calling sshifte -c lwork must be greater than or equal to 2*nlon*(nlat+1) if nlon is even. -c lwork must be greater than or equal to nlon*(5*nlat+1) if nlon is odd. -c -c ... ier -c -c indicates errors in input parameters -c -c = 0 if no errors are detected -c -c = 1 if ioff is not equal to 0 or 1 -c -c = 1 if nlon < 4 -c -c = 2 if nlat < 3 -c -c = 3 if lsave < 2*(nlon+2*nlat+16) -c -c = 4 if lwork < 2*nlon*(nlat+1) for nlon even or -c lwork < nlon*(5*nlat+1) for nlon odd -c -c *** end of sshifte documentation -c -c subroutine sshifti(ioff,nlon,nlat,lsav,wsav,ier) -c -c subroutine sshifti initializes the saved work space wsav -c for ioff and nlon and nlat (see documentation for sshifte). -c sshifti must be called before sshifte whenever ioff or nlon -c or nlat change. -c -c ... ier -c -c = 0 if no errors with input arguments -c -c = 1 if ioff is not 0 or 1 -c -c = 2 if nlon < 4 -c -c = 3 if nlat < 3 -c -c = 4 if lsav < 2*(2*nlat+nlon+16) -c -c *** end of sshifti documentation -c - subroutine sshifte(ioff,nlon,nlat,goff,greg,wsav,lsav, - + wrk,lwrk,ier) - implicit none - integer ioff,nlon,nlat,n2,nr,nlat2,nlatp1,lsav,lwrk,i1,i2,ier - real goff(nlon,nlat),greg(nlon,*),wsav(lsav),wrk(lwrk) -c -c check input parameters -c - ier = 1 - if (ioff*(ioff-1).ne.0) return - ier = 2 - if (nlon.lt.4) return - ier = 3 - if (nlat .lt. 3) return - ier = 4 - if (lsav .lt. 2*(2*nlat+nlon+16)) return - ier = 5 - n2 = (nlon+1)/2 - if (2*n2 .eq. nlon) then - if (lwrk .lt. 2*nlon*(nlat+1)) return - i1 = 1 - nr = n2 - else - if (lwrk .lt. nlon*(5*nlat+1)) return - i1 = 1+2*nlat*nlon - nr = nlon - end if - ier = 0 - nlat2 = nlat+nlat - i2 = i1 + (nlat+1)*nlon - if (ioff.eq.0) then - call shftoff(nlon,nlat,goff,greg,wsav,nr,nlat2, - + wrk,wrk(i1),wrk(i2)) - else - nlatp1 = nlat+1 - call shftreg(nlon,nlat,goff,greg,wsav,nr,nlat2,nlatp1, - + wrk,wrk(i1),wrk(i2)) - end if - end - - subroutine shftoff(nlon,nlat,goff,greg,wsav,nr,nlat2, - + rlat,rlon,wrk) -c -c shift offset grid to regular grid, i.e., -c goff is given, greg is to be generated -c - implicit none - integer nlon,nlat,nlat2,n2,nr,j,i,js,isav - real goff(nlon,nlat),greg(nlon,nlat+1) - real rlat(nr,nlat2),rlon(nlat,nlon) - real wsav(*),wrk(*) - real gnorth,gsouth - isav = 4*nlat+17 - n2 = (nlon+1)/2 -c -c execute full circle latitude shifts for nlon odd or even -c - if (2*n2 .gt. nlon) then -c -c odd number of longitudes -c - do i=1,nlat - do j=1,nlon - rlon(i,j) = goff(j,i) - end do - end do -c -c half shift in longitude -c - call shifth(nlat,nlon,rlon,wsav(isav),wrk) -c -c set full 2*nlat circles in rlat using shifted values in rlon -c - do j=1,n2-1 - js = j+n2 - do i=1,nlat - rlat(j,i) = goff(j,i) - rlat(j,nlat+i) = rlon(nlat+1-i,js) - end do - end do - do j=n2,nlon - js = j-n2+1 - do i=1,nlat - rlat(j,i) = goff(j,i) - rlat(j,nlat+i) = rlon(nlat+1-i,js) - end do - end do -c -c shift the nlon rlat vectors one half latitude grid -c - call shifth(nlon,nlat2,rlat,wsav,wrk) -c -c set nonpole values in greg and average for poles -c - gnorth = 0.0 - gsouth = 0.0 - do j=1,nlon - gnorth = gnorth + rlat(j,1) - gsouth = gsouth + rlat(j,nlat+1) - do i=2,nlat - greg(j,i) = rlat(j,i) - end do - end do - gnorth = gnorth/nlon - gsouth = gsouth/nlon - - else -c -c even number of longitudes (no initial longitude shift necessary) -c set full 2*nlat circles (over poles) for each longitude pair (j,js) -c - do j=1,n2 - js = n2+j - do i=1,nlat - rlat(j,i) = goff(j,i) - rlat(j,nlat+i) = goff(js,nlat+1-i) - end do - end do -c -c shift the n2=(nlon+1)/2 rlat vectors one half latitude grid -c - call shifth(n2,nlat2,rlat,wsav,wrk) -c -c set nonpole values in greg and average poles -c - gnorth = 0.0 - gsouth = 0.0 - do j=1,n2 - js = n2+j - gnorth = gnorth + rlat(j,1) - gsouth = gsouth + rlat(j,nlat+1) - do i=2,nlat - greg(j,i) = rlat(j,i) - greg(js,i) = rlat(j,nlat2-i+2) - end do - end do - gnorth = gnorth/n2 - gsouth = gsouth/n2 - end if -c -c set poles -c - do j=1,nlon - greg(j,1) = gnorth - greg(j,nlat+1) = gsouth - end do -c -c execute full circle longitude shift -c - do j=1,nlon - do i=1,nlat - rlon(i,j) = greg(j,i) - end do - end do - call shifth(nlat,nlon,rlon,wsav(isav),wrk) - do j=1,nlon - do i=2,nlat - greg(j,i) = rlon(i,j) - end do - end do - end - - subroutine shftreg(nlon,nlat,goff,greg,wsav,nr,nlat2,nlatp1, - + rlat,rlon,wrk) -c -c shift regular grid to offset grid, i.e., -c greg is given, goff is to be generated -c - implicit none - integer nlon,nlat,nlat2,nlatp1,n2,nr,j,i,js,isav - real goff(nlon,nlat),greg(nlon,nlatp1) - real rlat(nr,nlat2),rlon(nlatp1,nlon) - real wsav(*),wrk(*) - isav = 4*nlat+17 - n2 = (nlon+1)/2 -c -c execute full circle latitude shifts for nlon odd or even -c - if (2*n2 .gt. nlon) then -c -c odd number of longitudes -c - do i=1,nlat+1 - do j=1,nlon - rlon(i,j) = greg(j,i) - end do - end do -c -c half shift in longitude in rlon -c - call shifth(nlat+1,nlon,rlon,wsav(isav),wrk) -c -c set full 2*nlat circles in rlat using shifted values in rlon -c - do j=1,n2 - js = j+n2-1 - rlat(j,1) = greg(j,1) - do i=2,nlat - rlat(j,i) = greg(j,i) - rlat(j,nlat+i) = rlon(nlat+2-i,js) - end do - rlat(j,nlat+1) = greg(j,nlat+1) - end do - do j=n2+1,nlon - js = j-n2 - rlat(j,1) = greg(j,1) - do i=2,nlat - rlat(j,i) = greg(j,i) - rlat(j,nlat+i) = rlon(nlat+2-i,js) - end do - rlat(j,nlat+1) = greg(j,nlat+1) - end do -c -c shift the nlon rlat vectors one halflatitude grid -c - call shifth(nlon,nlat2,rlat,wsav,wrk) -c -c set values in goff -c - do j=1,nlon - do i=1,nlat - goff(j,i) = rlat(j,i) - end do - end do - - else -c -c even number of longitudes (no initial longitude shift necessary) -c set full 2*nlat circles (over poles) for each longitude pair (j,js) -c - do j=1,n2 - js = n2+j - rlat(j,1) = greg(j,1) - do i=2,nlat - rlat(j,i) = greg(j,i) - rlat(j,nlat+i) = greg(js,nlat+2-i) - end do - rlat(j,nlat+1) = greg(j,nlat+1) - end do -c -c shift the n2=(nlon+1)/2 rlat vectors one half latitude grid -c - call shifth(n2,nlat2,rlat,wsav,wrk) -c -c set values in goff -c - do j=1,n2 - js = n2+j - do i=1,nlat - goff(j,i) = rlat(j,i) - goff(js,i) = rlat(j,nlat2+1-i) - end do - end do - end if -c -c execute full circle longitude shift for all latitude circles -c - do j=1,nlon - do i=1,nlat - rlon(i,j) = goff(j,i) - end do - end do - call shifth(nlat+1,nlon,rlon,wsav(isav),wrk) - do j=1,nlon - do i=1,nlat - goff(j,i) = rlon(i,j) - end do - end do - end - - subroutine sshifti(ioff,nlon,nlat,lsav,wsav,ier) - integer ioff,nlat,nlon,nlat2,isav,ier - real wsav(lsav) - real pi,dlat,dlon,dp - ier = 1 - if (ioff*(ioff-1).ne.0) return - ier = 2 - if (nlon .lt. 4) return - ier = 3 - if (nlat .lt. 3) return - ier = 4 - if (lsav .lt. 2*(2*nlat+nlon+16)) return - ier = 0 - pi = 4.0*atan(1.0) -c -c set lat,long increments -c - dlat = pi/nlat - dlon = (pi+pi)/nlon -c -c initialize wsav for left or right latitude shifts -c - if (ioff.eq.0) then - dp = -0.5*dlat - else - dp = 0.5*dlat - end if - nlat2 = nlat+nlat - call shifthi(nlat2,dp,wsav) -c -c initialize wsav for left or right longitude shifts -c - if (ioff.eq.0) then - dp = -0.5*dlon - else - dp = 0.5*dlon - end if - isav = 4*nlat + 17 - call shifthi(nlon,dp,wsav(isav)) - return - end - - subroutine shifth(m,n,r,wsav,work) - implicit none - integer m,n,n2,k,l - real r(m,n),wsav(*),work(*),r2km2,r2km1 - n2 = (n+1)/2 -c -c compute fourier coefficients for r on shifted grid -c - call hrfftf(m,n,r,m,wsav(n+2),work) - do l=1,m - do k=2,n2 - r2km2 = r(l,k+k-2) - r2km1 = r(l,k+k-1) - r(l,k+k-2) = r2km2*wsav(n2+k) - r2km1*wsav(k) - r(l,k+k-1) = r2km2*wsav(k) + r2km1*wsav(n2+k) - end do - end do -c -c shift r with fourier synthesis and normalization -c - call hrfftb(m,n,r,m,wsav(n+2),work) - do l=1,m - do k=1,n - r(l,k) = r(l,k)/n - end do - end do - return - end - - subroutine shifthi(n,dp,wsav) -c -c initialize wsav for subroutine shifth -c - implicit none - integer n,n2,k - real wsav(*),dp - n2 = (n+1)/2 - do k=2,n2 - wsav(k) = sin((k-1)*dp) - wsav(k+n2) = cos((k-1)*dp) - end do - call hrffti(n,wsav(n+2)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/trssph.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/trssph.f deleted file mode 100755 index fd052b068..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/trssph.f +++ /dev/null @@ -1,765 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file trssph.f -c -c contains documentation and code for subroutine trssph -c -c ... required files -c -c sphcom.f, hrfft.f, gaqd.f, shaec.f, shsec.f, shagc.f, shsgc.f -c -c -c subroutine trssph(intl,igrida,nlona,nlata,da,igridb,nlonb,nlatb, -c +db,wsave,lsave,lsvmin,work,lwork,lwkmin,dwork,ldwork,ier) -c -c *** purpose -c -c subroutine trssph transfers data given in array da on a grid on the -c full sphere to data in array db on a grid on the full sphere. the -c grids on which da is given and db is generated can be specified -c independently of each other (see description below and the arguments -c igrida,igridb). for transferring vector data on the sphere, use -c subroutine trvsph. - -c notice that scalar and vector quantities are fundamentally different -c on the sphere. for example, vectors are discontinuous and multiple -c valued at the poles. scalars are continuous and single valued at the -c poles. erroneous results would be produced if one attempted to transfer -c vector fields between grids with subroutine trssph applied to each -c component of the vector. -c -c -c *** underlying grid assumptions and a description -c -c discussions with the ncar scd data support group and others indicate -c there is no standard grid for storing observational or model generated -c data on the sphere. subroutine trssph was designed to handle most -c cases likely to be encountered when moving data from one grid format -c to another. -c -c the grid on which da is given must be equally spaced in longitude -c and either equally spaced or gaussian in latitude (or colatitude). -c longitude, which can be either the first or second dimension of da, -c subdivides [0,2pi) excluding the periodic point 2pi. (co)latitude, -c which can be the second or first dimension of da, has south -c to north or north to south orientation with increasing subscript -c value in da (see the argument igrida). -c -c the grid on which db is generated must be equally spaced in longitude -c and either equally spaced or gaussian in latitude (or colatitude). -c longitude, which can be either the first or second dimension of db, -c subdivides [0,2pi) excluding the periodic point 2pi. (co)latitude, -c which can be the second or first dimension of db, has south -c to north or north to south orientation with increasing subscript -c value in db (see the argument igridb). -c -c let nlon be either nlona or nlonb (the number of grid points in -c longitude. the longitude grid subdivides [0,2pi) into nlon spaced -c points -c -c (j-1)*2.*pi/nlon (j=1,...,nlon). -c -c it is not necessary to communicate to subroutine trssph whether the -c underlying grids are in latitude or colatitude. it is only necessary -c to communicate whether they run south to north or north to south with -c increasing subscripts. a brief discussion of latitude and colatitude -c follows. equally spaced latitude grids are assumed to subdivide -c [-pi/2,pi/2] with the south pole at -pi/2 and north pole at pi/2. -c equally spaced colatitude grids subdivide [0,pi] with the north pole -c at 0 and south pole at pi. equally spaced partitions on the sphere -c include both poles. gaussian latitude grids subdivide (-pi/2,pi/2) -c and gaussian colatitude grids subdivide (0,pi). gaussian grids do not -c include the poles. the gaussian grid points are uniquely determined by -c the size of the partition. they can be computed in colatitude in -c (0,pi) (north to south) in double precision by the spherepack subroutine -c gaqd. let nlat be nlata or nlatb if either the da or db grid is -c gaussian. let -c -c north pole south pole -c ---------- ---------- -c 0.0 < cth(1) < ... < cth(nlat) < pi -c -c -c be nlat gaussian colatitude points in the interval (0,pi) and let -c -c south pole north pole -c ---------- ---------- -c -pi/2 < th(1) < ... < th(nlat) < pi/2 -c -c be nlat gaussian latitude points in the open interval (-pi/2,pi/2). -c these are related by -c -c th(i) = -pi/2 + cth(i) (i=1,...,nlat) -c -c if the da or db grid is equally spaced in (co)latitude then -c -c ctht(i) = (i-1)*pi/(nlat-1) -c (i=1,...,nlat) -c tht(i) = -pi/2 + (i-1)*pi/(nlat-1) -c -c define the equally spaced (north to south) colatitude and (south to -c north) latitude grids. -c -c -c *** method (simplified description) -c -c for simplicity, assume da is a nlat by nlon data tabulation and da(i,j) -c is the value at latitude theta(i) and longitude phi(j). then -c coefficients a(m,n) and b(m,n) can be determined so that da(i,j) is -c approximated by the sum -c -c l-1 n -c (a) sum sum pbar(m,n,theta(i))*(a(m,n)*cos(m*phi(j)+b(m,n)*sin(m*phi(j)) -c n=0 m=0 -c -c here pbar(n,m,theta) are the normalized associated legendre functions -c and l = min0(nlat,(nlon+2)/2). the determination of a(m,n) and b(m,n) -c is called spherical harmonic analysis. a sum of this form can then be -c used to regenerate the data in db on the new grid with the known -c a(m,n) and b(m,n). this is referred to spherical harmonic synthesis. -c analysis and synthesis subroutines from the software package spherepack, -c are used for these purposes. -c -c if da or db is not in mathematical spherical coordinates then array -c transposition and/or subscript reordering is used prior to harmonic -c analysis and after harmonic synthesis. -c -c *** advantages -c -c the use of surface spherical harmonics to transfer spherical grid data -c has advantages over pointwise grid interpolation schemes on the sphere. -c it is highly accurate. if p(x,y,z) is any polynomial of degree n or -c less in x,y,z cartesian coordinates which is restricted to the surface -c of the sphere, then p is exactly represented by sums of the form (a) -c whenever n = mino(nlat,nlon/2) (i.e., transfers with spherical harmonics -c have n(th) order accuracy. by way of contrast, bilinear interpolation -c schemes are exact for polynomials of degree one. bicubic interpolation -c is exact only for polynomials of degree three or less. the method -c also produces a weighted least squares fit to the data in which waves -c are resolved uniformly on the full sphere. high frequencies, induced -c by closeness of grid points near the poles (due to computational -c or observational errors) are smoothed. finally, the method is -c consistent with methods used to generate data in numerical spectral -c models based on spherical harmonics. for more discussion of these and -c related issues, see the article: "on the spectral approximation of -c discrete scalar and vector functions on the sphere," siam j. numer. -c anal., vol 16. dec 1979, pp. 934-949, by paul swarztrauber. -c -c -c *** comment -c -c on a nlon by nlat or nlat by nlon grid (gaussian or equally spaced) -c spherical harmonic analysis generates and synthesis utilizes -c min0(nlat,(nlon+2)/2)) by nlat coefficients. consequently, for -c da and db, if either -c -c min0(nlatb,(nlonb+2)/2) < min0(nlata,(nlona+2)/2) -c -c or if -c -c nlatb < nlata -c -c then all the coefficients generated by an analysis of da cannot be used -c in the synthesis which generates db. in this case "information" can be -c lost in generating db. more precisely, information will be lost if the -c analysis of da yields nonzero coefficients which are outside the bounds -c determined by the db grid. nevertheless, transference of values with -c spherical harmonics will yield results consistent with grid resolution -c and is highly accurate. -c -c -c *** input arguments -c -c ... intl -c -c an initialization argument which should be zero on an initial call to -c trssph. intl should be one if trssph is being recalled and -c -c igrida,nlona,nlata,igridb,nlonb,nlatb -c -c have not changed from the previous call. if any of these arguments -c have changed, intl=0 must be used to avoid undetectable errors. calls -c with intl=1 bypass redundant computation and save time. it can be used -c when transferring multiple data sets with the same underlying grids. -c -c -c ... igrida -c -c an integer vector dimensioned two which identifies the underlying grid -c on the full sphere for the given data array da as follows: -c -c igrida(1) -c -c = -1 -c if the latitude (or colatitude) grid for da is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c runs north to south -c -c = +1 -c if the latitude (or colatitude) grid for da is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c runs south to north -c -c = -2 -c if the latitude (or colatitude) grid for da is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs north -c to south -c -c = +2 -c if the latitude (or colatitude) grid for da is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs south -c north -c -c igrida(2) -c -c = 0 if the underlying grid for da is a nlona by nlata -c -c = 1 if the underlying grid for da is a nlata by nlona -c -c -c ... nlona -c -c the number of longitude points on the uniform grid which partitions -c [0,2pi) for the given data array da. nlona is also the first or second -c dimension of da (see igrida(2)) in the program which calls trssph. -c nlona determines the grid increment in longitude as 2*pi/nlona. for -c example nlona = 72 for a five degree grid. nlona must be greater than -c or equal to 4. the efficiency of the computation is improved when -c nlona is a product of small prime numbers -c -c ... nlata -c -c the number of points in the latitude (or colatitude) grid -c for the given data array da. nlata is also the first or second -c dimension of da (see igrida(2)) in the program which calls trssph. -c if nlata is odd then the equator will be located at the (nlata+1)/2 -c gaussian grid point. if nlata is even then the equator will be -c located half way between the nlata/2 and nlata/2+1 grid points. -c -c *** note: -c igrida(1)=-1 or igrida(1)=-2 and igrida(2)=1 corresponds to -c the "usual" mathematical spherical coordinate system required -c by most of the drivers in spherepack2. igrida(1)=1 or igrida(1)=2 -c and igrida(2)=0 corresponds to the "usual" geophysical spherical -c coordinate system. -c -c ... da -c -c a two dimensional array that contains the data to be transferred. -c da must be dimensioned nlona by nlata in the program calling trssph if -c igrida(2) = 0. da must be dimensioned nlata by nlona in the program -c calling trssph if igrida(2) = 1. if da is not properly dimensioned -c and if the latitude (colatitude) values do not run south to north or -c north to south as flagged by igrida(1) (this cannot be checked!) then -c incorrect results will be produced. -c -c ... igridb -c -c an integer vector dimensioned two which identifies the underlying grid -c on the full sphere for the transformed data array db as follows: -c -c igridb(1) -c -c = -1 -c if the latitude (or colatitude) grid for db is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c north to south -c -c = +1 -c if the latitude (or colatitude) grid for db is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c south to north -c -c = -2 -c if the latitude (or colatitude) grid for db is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs north to -c south -c -c = +2 -c if the latitude (or colatitude) grid for db is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs south to -c north -c -c -c igridb(2) -c -c = 0 if the underlying grid for db is a nlonb by nlatb -c -c = 1 if the underlying grid for db is a nlatb by nlonb -c -c -c ... nlonb -c -c the number of longitude points on the uniform grid which partitions -c [0,2pi) for the transformed data array db. nlonb is also the first or -c second dimension of db (see igridb(2)) in the program which calls -c trssph. nlonb determines the grid increment in longitude as 2*pi/nlonb. -c for example nlonb = 72 for a five degree grid. nlonb must be greater -c than or equal to 4. the efficiency of the computation is improved when -c nlonb is a product of small prime numbers -c -c ... nlatb -c -c the number of points in the latitude (or colatitude) grid -c for the transformed data array db. nlatb is also the first or second -c dimension of db (see igridb(2)) in the program which calls trssph. -c if nlatb is odd then the equator will be located at the (nlatb+1)/2 -c gaussian grid point. if nlatb is even then the equator will be -c located half way between the nlatb/2 and nlatb/2+1 grid points. -c -c ... wsave -c -c a saved work space array that can be utilized repeatedly by trssph -c as long as the arguments nlata,nlona,nlatb,nlonb remain unchanged. -c wsave is set by a intl=0 call to trssph. wsave must not be altered -c when trssph is being recalled with intl=1. -c -c ... lsave -c -c the dimension of the work space wsave as it appears in the program -c that calls trssph. the minimum required value of lsave for the -c current set of input arguments is set in the output argument lsvmin. -c it can be determined by calling trssph with lsave=0 and printing lsvmin. -c let -c -c lwa = 2*nlata*la2+3*((la1-2)*(nlata+nlata-la1-1))/2+nlona+15 -c -c if the grid for da is equally spaced in (co)latitude. let -c -c lwa = nlata*(2*la2+3*la1-2)+3*la1*(1-la1)/2+nlona+15 -c -c if the grid for da is gaussian in (co)latitude. -c let -c -c lwb = nlatb*(2*lb2+3*lb1-2)+3*lb1*(1-lb1)/2+nlonb+15 -c -c if the grid for db is gaussian in (co)latitude. let -c -c lwb = 2*nlatb*lb2+3*((lb1-2)*(nlatb+nlatb-lb1-1))/2+nlonb+15 -c -c if the grid for db is equally spaced in (co)latitude. then -c the quantity -c -c lwa + lwb -c -c is the minimum required length of wsave. this value is returned -c in the output argument lsvmin even if lsave is to small (ierror=10) -c -c ... work -c -c a real work array that does not have to be preserved -c -c ... lwork -c -c the dimension of the array work as it appears in the program -c calling trssph. the minimum required value of lwork for the current -c set of input arguments is set in the output argument lwkmin. -c it can be determined by calling trssph with lwork=0 and printing -c lwkmin. an estimate for lwork follows. let nlat,nlon,l1,l2 be -c defined by -c -c nlat = max0(nlata,nlatb), nlon = nax0(nlona,nlonb), -c l1 = min0(nlat,(nlon+2)/2), l2 = (nlat+1)/2 -c -c then the quantity -c -c nlat*(4*l1+nlon+2*nlat+4)+3*((l1-2)*2*(2*nlat-l1-1))/2 -c -c will suffice as a length for the unsaved work space. -c -c * both of the formulas above for lsave and lwork may overestimate the -c required minimum values. they can be predetermined by calling trssph -c with lsave=lwork=0 and printout of lsvmin and lwkmin. -c -c ... dwork -c -c a double precision work array that does not have to be preserved. -c -c ... ldwork -c -c The length of dwork in the routine calling trssph. -c Let -c -c nlat = max0(nlata,nlatb) -c -c ldwork must be at least nlat*(nlat+4) -c -c *** output arguments -c -c -c ... db -c -c a two dimensional array that contains the transformed data. db -c must be dimensioned nlonb by nlatb in the program calling trssph if -c igridb(2) = 0 or 1. db must be dimensioned nlatb by nlonb in the -c program calling trssph if igridb(2) = 1. if db is not properly -c dimensioned and if the latitude (colatitude) values do not run south -c north or north to south as flagged by igrdb(1) (this cannot be checked!) -c then incorrect results will be produced. -c -c ... lsvmin -c -c the minimum length of the saved work space in wsave. -c lsvmin is computed even if lsave < lsvmin (ier = 10). -c -c ... lwkmin -c -c the minimum length of the unsaved work space in work. -c lwkmin is computed even if lwork < lwkmin (ier = 11). -c -c *** error argument -c -c ... ier = 0 if no errors are detected -c -c = 1 if intl is not 0 or 1 -c -c = 2 if igrida(1) is not -1 or +1 or -2 or +2 -c -c = 3 if igrida(2) is not 0 or 1 -c -c = 4 if nlona is less than 4 -c -c = 5 if nlata is less than 3 -c -c = 6 if igridb(1) is not -1 or +1 or -2 or +2 -c -c = 7 if igridb(2) is not 0 or 1 -c -c = 8 if nlonb is less than 4 -c -c = 9 if nlatb is less than 3 - -c =10 if there is insufficient saved work space (lsave < lsvmin) -c -c =11 if there is insufficient unsaved work space (lwork < lwkmin) -c -c =12 indicates failure in an eigenvalue routine which computes -c gaussian weights and points -c -c =13 if ldwork is too small (insufficient unsaved double precision -c work space) -c -c ***************************************************** -c ***************************************************** -c -c end of argument description ... code follows -c -c ***************************************************** -c ***************************************************** -c - SUBROUTINE TRSSPH (INTL,IGRIDA,NLONA,NLATA,DA,IGRIDB,NLONB,NLATB, - +DB,WSAVE,LSAVE,LSVMIN,WORK,LWORK,LWKMIN,DWORK,LDWORK,IER) - implicit none - integer intl,igrida(2),nlona,nlata,igridb(2),nlonb,nlatb - integer lsave,lsvmin,lwork,lwkmin,ldwork,ier - real da(*),db(*),wsave(*),work(*) - double precision dwork(*) - integer ig,igrda,igrdb,la1,la2,lb1,lb2,lwa,lwb,iaa,iab,iba,ibb - integer lwk3,lwk4,lw,iw,jb,nt,isym,nlat -c -c include a save statement to ensure local variables in trssph, set during -c an intl=0 call, are preserved if trssph is recalled with intl=1 -c - save -c -c check input arguments -c - ier = 1 - if (intl*(intl-1).ne.0) return - ier = 2 - ig = igrida(1) - if ((ig-1)*(ig+1)*(ig-2)*(ig+2).ne.0) return - ier = 3 - ig = igrida(2) - if (ig*(ig-1).ne.0) return - ier = 4 - if (nlona .lt. 4) return - ier = 5 - if (nlata .lt.3) return - ier = 6 - ig = igridb(1) - if ((ig-1)*(ig+1)*(ig-2)*(ig+2).ne.0) return - ier = 7 - ig = igridb(2) - if (ig*(ig-1).ne.0) return - ier = 8 - if (nlonb .lt.4) return - ier = 9 - if (nlatb .lt.3) return - ier = 0 - - igrda = iabs(igrida(1)) - igrdb = iabs(igridb(1)) - if (intl.eq.0) then - la1 = min0(nlata,(nlona+2)/2) - la2 = (nlata+1)/2 - lb1 = min0(nlatb,(nlonb+2)/2) - lb2 = (nlatb+1)/2 -c -c set saved work space length for analysis -c - if (igrda .eq. 1) then -c -c saved space for analysis on equally spaced grid -c - lwa = 2*nlata*la2+3*((la1-2)*(nlata+nlata-la1-1))/2+nlona+15 - else -c -c saved space for analysis on gaussian grid -c - lwa = nlata*(2*la2+3*la1-2)+3*la1*(1-la1)/2+nlona+15 - end if -c -c set wsave pointer -c - jb = 1+lwa -c -c set pointers for spherical harmonic coefs -c - iaa = 1 - iba = iaa+la1*nlata - iab = iba+la1*nlata - if (igrdb .eq. 2) then -c -c set saved work space length for gaussian synthesis -c - lwb = nlatb*(2*lb2+3*lb1-2)+3*lb1*(1-lb1)/2+nlonb+15 - else -c -c set saved work space length for equally spaced synthesis -c - lwb = 2*nlatb*lb2+3*((lb1-2)*(nlatb+nlatb-lb1-1))/2+nlonb+15 - end if -c -c set minimum saved work space length -c - lsvmin = lwa + lwb -c -c set remaining harmonic pointer -c - ibb = iab+lb1*nlatb -c -c set pointers for remaining work -c - iw = ibb+lb1*nlatb -c -c set remaining work space length in lw -c - lw = lwork - iw - lwk3 = nlata*nlona*2 - lwk4 = nlatb*nlonb*2 -c -c set minimum unsaved work space required by trssph -c - lwkmin = iw + max0(lwk3,lwk4) -c -c set error flags if saved or unsaved work spaces are insufficient -c - ier = 10 - if (lsave .lt. lsvmin) return - ier = 11 - if (lwork .lt. lwkmin) return - ier = 13 - nlat = max0(nlata,nlatb) - if (ldwork .lt. nlat*(nlat+4)) return - ier = 0 - if (igrda .eq. 1) then -c -c initialize wsave for equally spaced analysis -c - call shaeci(nlata,nlona,wsave,lwa,dwork,ldwork,ier) - else -c -c initialize wsave for gaussian analysis -c - call shagci(nlata,nlona,wsave,lwa,dwork,ldwork,ier) - if (ier.ne.0) then -c -c flag failure in spherepack gaussian software -c - ier = 12 - return - end if - end if - - if (igrdb .eq. 2) then -c -c initialize wsave for gaussian synthesis -c - call shsgci(nlatb,nlonb,wsave(jb),lwb,dwork,ldwork,ier) - if (ier.ne.0) then -c -c flag failure in spherepack gaussian software -c - ier = 12 - return - end if - else -c -c initialize wsave for equally spaced synthesis -c - call shseci(nlatb,nlonb,wsave(jb),lwb,dwork,ldwork,ier) - end if -c -c end of initialization (intl=0) call -c - end if -c -c transpose and/or reorder (co)latitude if necessary for da -c (arrays must have latitude (colatitude) as the first dimension -c and run north to south for spherepack software) -c - if (igrida(2) .eq. 0) call trsplat(nlona,nlata,da,work) - if (igrida(1) .gt. 0) call convlat(nlata,nlona,da) - - nt = 1 - isym = 0 - if (igrda .eq. 2) then -c -c do spherical harmonic analysis of "adjusted" da on gaussian grid -c - call shagc(nlata,nlona,isym,nt,da,nlata,nlona,work(iaa), - +work(iba),la1,nlata,wsave,lwa,work(iw),lw,ier) - else -c -c do spherical harmonic analysis of "adjusted" da on equally spaced grid -c - call shaec(nlata,nlona,isym,nt,da,nlata,nlona,work(iaa), - +work(iba),la1,nlata,wsave,lwa,work(iw),lw,ier) - end if -c -c transfer da grid coefficients to db grid coefficients -c truncating to zero as necessary -c - call trab(la1,nlata,work(iaa),work(iba),lb1,nlatb,work(iab), - + work(ibb)) - - if (igrdb .eq. 1) then -c -c do spherical harmonic synthesis on nlatb by nlonb equally spaced grid -c - call shsec(nlatb,nlonb,isym,nt,db,nlatb,nlonb,work(iab), - +work(ibb),lb1,nlatb,wsave(jb),lwb,work(iw),lw,ier) - else -c -c do spherical harmonic synthesis on nlatb by nlonb gaussian grid -c - call shsgc(nlatb,nlonb,isym,nt,db,nlatb,nlonb,work(iab), - +work(ibb),lb1,nlatb,wsave(jb),lwb,work(iw),lw,ier) - end if -c -c both da,db are currently latitude by longitude north to south arrays -c restore da and set db to agree with flags in igrida and igridb -c - if (igrida(1) .gt. 0) call convlat(nlata,nlona,da) - if (igridb(1) .gt. 0) call convlat(nlatb,nlonb,db) - if (igrida(2) .eq. 0) call trsplat(nlata,nlona,da,work) - if (igridb(2) .eq. 0) call trsplat(nlatb,nlonb,db,work) - return - end - - subroutine trab(ma,na,aa,ba,mb,nb,ab,bb) - implicit none - integer ma,na,mb,nb,i,j,m,n - real aa(ma,na),ba(ma,na),ab(mb,nb),bb(mb,nb) -c -c set coefficients for b grid from coefficients for a grid -c - m = min0(ma,mb) - n = min0(na,nb) - do j=1,n - do i=1,m - ab(i,j) = aa(i,j) - bb(i,j) = ba(i,j) - end do - end do -c -c set coefs outside triangle to zero -c - do i=m+1,mb - do j=1,nb - ab(i,j) = 0.0 - bb(i,j) = 0.0 - end do - end do - do j=n+1,nb - do i=1,mb - ab(i,j) = 0.0 - bb(i,j) = 0.0 - end do - end do - return - end - - subroutine trsplat(n,m,data,work) -c -c transpose the n by m array data to a m by n array data -c work must be at least n*m words long -c - implicit none - integer n,m,i,j,ij,ji - real data(*),work(*) - do j=1,m - do i=1,n - ij = (j-1)*n+i - work(ij) = data(ij) - end do - end do - do i=1,n - do j=1,m - ji = (i-1)*m+j - ij = (j-1)*n+i - data(ji) = work(ij) - end do - end do - return - end - - subroutine convlat(nlat,nlon,data) -c -c reverse order of latitude (colatitude) grids -c - implicit none - integer nlat,nlon,nlat2,i,ib,j - real data(nlat,nlon),temp - nlat2 = nlat/2 - do i=1,nlat2 - ib = nlat-i+1 - do j=1,nlon - temp = data(i,j) - data(i,j) = data(ib,j) - data(ib,j) = temp - end do - end do - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/trvsph.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/trvsph.f deleted file mode 100755 index 91cea58f3..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/trvsph.f +++ /dev/null @@ -1,834 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file trvsph.f -c -c this file contains documentation and code for subroutine trvsph -c -c ... required files -c -c sphcom.f, hrfft.f, gaqd.f, vhaec.f, vhsec.f, vhagc.f, vhsgc.f -c -c subroutine trvsph (intl,igrida,nlona,nlata,iveca,ua,va, -c +igridb,nlonb,nlatb,ivecb,ub,vb,wsave,lsave,lsvmin,work, -c +lwork,lwkmin,dwork,ldwork,ier) -c -c *** author -c -c John C. Adams (NCAR 1997), email: johnad@ncar.ucar.edu -c -c *** purpose -c -c subroutine trvsph transfers vector data given in (ua,va) on a grid on -c the full sphere to vector data in (ub,vb) on a grid on the full sphere. -c the grids on which (ua,va) is given and (ub,vb) is generated can be -c specified independently of each other (see the input arguments igrida, -c igridb,iveca,ivecb). ua and ub are the east longitudinal components of -c the given and transformed vector fields. va is either the latitudinal -c or colatitudinal component of the given vector field (see iveca). -c vb is either the latitudinal or colatitudinal component of the -c transformed vector field (see ivecb). for transferring scalar data -c on the sphere, use subroutine trssph. -c -c * notice that scalar and vector quantities are fundamentally different -c on the sphere. for example, vectors are discontinuous and multiple -c valued at the poles. scalars are continuous and single valued at the -c poles. erroneous results would be produced if one attempted to transfer -c vector fields between grids with subroutine trssph applied to each -c component of the vector. -c -c *** underlying grid assumptions and a description -c -c discussions with the ncar scd data support group and others indicate -c there is no standard grid for storing observational or model generated -c data on the sphere. subroutine trvsph was designed to handle most -c cases likely to be encountered when moving data from one grid format -c to another. -c -c the grid on which (ua,va) is given must be equally spaced in longitude -c and either equally spaced or gaussian in latitude (or colatitude). -c longitude, which can be either the first or second dimension of ua,va -c subdivides [0,2pi) excluding the periodic point 2pi. (co)latitude, -c which can be the second or first dimension of ua,va, has south -c to north or north to south orientation with increasing subscript -c value in ua,va (see the argument igrida). -c -c the grid on which ub,vb is generated must be equally spaced in longitude -c and either equally spaced or gaussian in latitude (or colatitude). -c longitude, which can be either the first or second dimension of ub,vb -c subdivides [0,2pi) excluding the periodic point 2pi. (co)latitude, -c which can be the second or first dimension of ub,vb, has south -c to north or north to south orientation with increasing subscript -c value in db (see the argument igridb). -c -c let nlon be either nlona or nlonb (the number of grid points in -c longitude. the longitude grid subdivides [0,2pi) into nlon spaced -c points -c -c (j-1)*2.*pi/nlon (j=1,...,nlon). -c -c it is not necessary to communicate to subroutine trvsph whether the -c underlying grids are in latitude or colatitude. it is only necessary -c to communicate whether they run south to north or north to south with -c increasing subscripts. a brief discussion of latitude and colatitude -c follows. equally spaced latitude grids are assumed to subdivide -c [-pi/2,pi/2] with the south pole at -pi/2 and north pole at pi/2. -c equally spaced colatitude grids subdivide [0,pi] with the north pole -c at 0 and south pole at pi. equally spaced partitions on the sphere -c include both poles. gaussian latitude grids subdivide (-pi/2,pi/2) -c and gaussian colatitude grids subdivide (0,pi). gaussian grids do not -c include the poles. the gaussian grid points are uniquely determined by -c the size of the partition. they can be computed in colatitude in -c (0,pi) (north to south) in double precision by the spherepack subroutine -c gaqd. let nlat be nlata or nlatb if either the ua,va or ub,vb grid is -c gaussian. let -c -c north pole south pole -c ---------- ---------- -c 0.0 < cth(1) < ... < cth(nlat) < pi -c -c -c be nlat gaussian colatitude points in the interval (0,pi) and let -c -c south pole north pole -c ---------- ---------- -c -pi/2 < th(1) < ... < th(nlat) < pi/2 -c -c be nlat gaussian latitude points in the open interval (-pi/2,pi/2). -c these are related by -c -c th(i) = -pi/2 + cth(i) (i=1,...,nlat) -c -c if the (ua,va) or (ub,vb) grid is equally spaced in (co)latitude then -c -c ctht(i) = (i-1)*pi/(nlat-1) -c (i=1,...,nlat) -c tht(i) = -pi/2 + (i-1)*pi/(nlat-1) -c -c define the equally spaced (north to south) colatitude and (south to -c north) latitude grids. -c -c *** method (simplified description) -c -c (1) -c -c the vector field (ua,va) is reformated to a vector field in mathematical -c spherical coordinates using array transpositions, subscript reordering -c and negation of va as necessary (see arguments igrida,iveca). -c -c (2) -c -c a vector harmonic analysis is performed on the result from (1) -c -c (3) -c -c a vector harmonic synthesis is performed on the (ub,vb) grid -c using as many coefficients from (2) as possible (i.e., as -c as is consistent with the size of the ub,vb grid). -c -c (4) -c -c the vector field generated in (3) is transformed from mathematical -c spherical coordinates to the form flagged by ivecb and igridb in -c (ub,vb) using array transpositions, subscript reordering and negation -c as necessary -c -c -c *** advantages -c -c the use of vector spherical harmonics to transfer vector data is -c highly accurate and preserves properties of vectors on the sphere. -c the method produces a weighted least squares fit to vector data in -c which waves are resolved uniformly on the full sphere. high frequencies -c induced by closeness of grid points near the poles (due to computational -c or observational errors) are smoothed. the method is consistent with -c methods used to generate vector data in numerical spectral models based -c on spherical harmonics. for more discussion of these and related issues, -c see "on the spectral approximation of discrete scalar and vector -c functions on the sphere," siam j. numer. anal., vol. 16, december 1979, -c pp. 934-949, by paul swarztrauber. -c -c -c *** comment -c -c on a nlon by nlat or nlat by nlon grid (gaussian or equally spaced) -c spherical harmonic analysis generates and synthesis utilizes -c min0(nlat,(nlon+2)/2)) by nlat coefficients. consequently, for -c ua,va and ub,vb, if either -c -c min0(nlatb,(nlonb+2)/2) < min0(nlata,(nlona+2)/2) -c -c or if -c -c nlatb < nlata -c -c then all the coefficients generated by an analysis of ua,va cannot be -c used in the synthesis which generates ub,vb. in this case "information" -c can be lost in generating ub,vb. more precisely, information will be -c lost if the analysis of ua,va yields nonzero coefficients which are -c outside the coefficient bounds determined by the ub,vb grid. still -c transference with vector spherical harmonics will yield results -c consistent with grid resolution and is highly accurate. -c -c *** input arguments -c -c ... intl -c -c an initialization argument which should be zero on an initial call to -c trvsph. intl should be one if trvsph is being recalled and -c -c igrida,nlona,nlata,iveca,igridb,nlonb,nlatb,ivecb -c -c have not changed from the previous call. if any of these arguments have -c changed intl=0 must be used to avoid undetectable errors. when allowed, -c calls with intl=1 bypass redundant computation and save time. it can -c be used when transferring multiple vector data sets with the same -c underlying grids. -c -c ... igrida -c -c an integer vector dimensioned two which identifies the underlying grid -c on the full sphere for the given vector data (ua,va) as follows: -c -c igrida(1) -c -c = -1 -c if the latitude (or colatitude) grid for ua,va is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c runs north to south with increasing subscript value -c -c = +1 -c if the latitude (or colatitude) grid for ua,va is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c runs south to north with increasing subscript value -c -c = -2 -c if the latitude (or colatitude) grid for ua,va is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs north -c to south with increasing subscript value -c -c = +2 -c if the latitude (or colatitude) grid for ua,va is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs south -c north with increasing subscript value -c -c igrida(2) -c -c = 0 if the underlying grid for ua,va is a nlona by nlata -c -c = 1 if the underlying grid for ua,va is a nlata by nlona -c -c -c ... nlona -c -c the number of longitude points on the uniform grid which partitions -c [0,2pi) for the given vector (ua,va). nlona is also the first or second -c dimension of ua,va (see igrida(2)) in the program which calls trvsph. -c nlona determines the grid increment in longitude as 2*pi/nlona. for -c example nlona = 72 for a five degree grid. nlona must be greater than -c or equal to 4. the efficiency of the computation is improved when -c nlona is a product of small prime numbers -c -c ... nlata -c -c the number of points in the latitude (or colatitude) grid for the -c given vector (ua,va). nlata is also the first or second dimension -c of ua and va (see igrida(2)) in the program which calls trvsph. -c if nlata is odd then the equator will be located at the (nlata+1)/2 -c gaussian grid point. if nlata is even then the equator will be -c located half way between the nlata/2 and nlata/2+1 grid points. -c -c ... iveca -c -c if iveca=0 is input then va is the latitudinal component of the -c given vector field. if iveca=1 then va is the colatitudinal -c compoenent of the given vector field. in either case, ua must -c be the east longitudinal component of the given vector field. -c -c *** note: -c igrida(1)=-1 or igrida(1)=-2, igrida(2)=1, and iveca=1 corresponds -c to the "usual" mathematical spherical coordinate system required -c by most of the drivers in spherepack2. igrida(1)=1 or igrida(1)=2, -c igrida(2)=0, and iveca=0 corresponds to the "usual" geophysical -c spherical coordinate system. -c -c -c ... ua -c -c ua is the east longitudinal component of the given vector field. -c ua must be dimensioned nlona by nlata in the program calling trvsph if -c igrida(2) = 0. ua must be dimensioned nlata by nlona in the program -c calling trvsph if igrida(2) = 1. if ua is not properly dimensioned -c and if the latitude (colatitude) values do not run south to north or -c north to south as flagged by igrida(1) (this cannot be checked!) then -c incorrect results will be produced. -c -c -c ... va -c -c va is either the latitudinal or colatitudinal componenet of the -c given vector field (see iveca). va must be dimensioned nlona by -c nlata in the program calling trvsph if igrida(2)=0. va must be -c dimensioned nlata by nlona in the program calling trvsph if -c igrida(2)=1. if va is not properly dimensioned or if the latitude -c (colatitude) values do not run south to north or north to south -c as flagged by igrida(1) (this cannot be checked!) then incorrect -c results will be produced. -c -c ... igridb -c -c an integer vector dimensioned two which identifies the underlying grid -c on the full sphere for the transformed vector (ub,vb) as follows: -c -c igridb(1) -c -c = -1 -c if the latitude (or colatitude) grid for ub,vb is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c north to south -c -c = +1 -c if the latitude (or colatitude) grid for ub,vb is an equally spaced -c partition of [-pi/2,pi/2] ( or [0,pi] ) including the poles which -c south to north -c -c = -2 -c if the latitude (or colatitude) grid for ub,vb is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs north to -c south -c -c = +2 -c if the latitude (or colatitude) grid for ub,vb is a gaussian partition -c of (-pi/2,pi/2) ( or (0,pi) ) excluding the poles which runs south to -c north -c -c igridb(2) -c -c = 0 if the underlying grid for ub,vb is a nlonb by nlatb -c -c = 1 if the underlying grid for ub,vb is a nlatb by nlonb -c -c -c ... nlonb -c -c the number of longitude points on the uniform grid which partitions -c [0,2pi) for the transformed vector (ub,vb). nlonb is also the first or -c second dimension of ub and vb (see igridb(2)) in the program which calls -c trvsph. nlonb determines the grid increment in longitude as 2*pi/nlonb. -c for example nlonb = 72 for a five degree grid. nlonb must be greater -c than or equal to 4. the efficiency of the computation is improved when -c nlonb is a product of small prime numbers -c -c ... nlatb -c -c the number of points in the latitude (or colatitude) grid for the -c transformed vector (ub,vb). nlatb is also the first or second dimension -c of ub and vb (see igridb(2)) in the program which calls trvsph. -c if nlatb is odd then the equator will be located at the (nlatb+1)/2 -c gaussian grid point. if nlatb is even then the equator will be -c located half way between the nlatb/2 and nlatb/2+1 grid points. -c -c ... ivecb -c -c if ivecb=0 is input then vb is the latitudinal component of the -c given vector field. if ivecb=1 then vb is the colatitudinal -c compoenent of the given vector field. in either case, ub must -c be the east longitudinal component of the given vector field. -c -c *** note: -c igridb(1)=-1 or igridb(1)=-2, igridb(2)=1, and ivecb=1 corresponds -c to the "usual" mathematical spherical coordinate system required -c by most of the drivers in spherepack2. igridb(1)=1 or igridb(1)=2, -c igridb(2)=0, and ivecb=0 corresponds to the "usual" geophysical -c spherical coordinate system. -c -c ... wsave -c -c a saved work space array that can be utilized repeatedly by trvsph -c as long as the arguments nlata,nlona,nlatb,nlonb remain unchanged. -c wsave is set by a intl=0 call to trvsph. wsave must not be altered -c when trvsph is being recalled with intl=1. -c -c ... lsave -c -c the dimension of the work space wsave as it appears in the program -c that calls trvsph. the minimum required value of lsave for the -c current set of input arguments is set in the output argument lsvmin. -c it can be determined by calling trvsph with lsave=0 and printing lsvmin. -c -c la1 = min0(nlata,(nlona+1)/2), la2 = (nlata+1)/2 -c -c lb1 = min0(nlatb,(nlonb+1)/2), lb2 = (nlatb+1)/2 -c -c lwa = 4*nlata*la2+3*max0(la1-2,0)*(2*nlata-la1-1)+la2+nlona+15 -c -c lwb = 4*nlatb*lb2+3*max0(lb1-2,0)*(2*nlatb-lb1-1)+nlonb+15 -c -c then -c -c lsvmin = lwa + lwb -c -c is the minimal required work space length of wsave -c -c -c ... work -c -c a work array that does not have to be preserved -c -c ... lwork -c -c the dimension of the array work as it appears in the program that -c calls trvsph. the minimum required value of lwork for the current -c set of input arguments is set in the output argument lwkmin. -c it can be determined by calling trvsph with lwork=0 and printing -c lwkmin. an estimate for lwork follows. let nlat = max0(nlata,nlatb), -c nlon = max0(nlona,nlonb) and l1 = min0(nlat,(nlon+2)/2). with these -c these definitions, the quantity -c -c 2*nlat*(8*l1 + 4*nlon + 3) -c -c will suffice as a length for the unsaved work space. this formula -c may overestimate the required minimum value for lwork. the exact -c minimum value can be predetermined by calling trvsph wtih lwork=0 -c and printout of lwkmin. -c -c ... dwork -c -c a double precision work array that does not have to be preserved. -c -c ... ldwork -c -c the length of dwork in the routine calling trvsph -c Let -c -c nlat = max0(nlata,nlatb) -c -c ldwork must be at least 2*nlat*(nlat+1)+1 -c -c -c *** output arguments -c -c -c ... ub -c -c a two dimensional array that contains the east longitudinal component -c of the transformed vector data. ub -c must be dimensioned nlonb by nlatb in the program calling trvsph if -c igridb(2)=0. ub must be dimensioned nlatb by nlonb in the program -c calling trvsph if igridb(2)=1. if ub is not properly dimensioned -c and if the latitude (colatitude) values do not run south to north or -c north to south as flagged by igrdb(1) (this cannot be checked!) then -c incorrect results will be produced. -c -c -c ... vb -c -c a two dimensional array that contains the latitudinal or colatitudinal -c component of the transformed vector data (see ivecb). -c vb must be dimensioned nlonb by nlatb in the program calling trvsph if -c igridb(2)=0. vb must be dimensioned nlatb by nlonb in the program -c calling trvsph if igridb(2)=1. if vb is not properly dimensioned -c and if the latitude (colatitude) values do not run south to north or -c north to south as flagged by igrdb(1) (this cannot be checked!) then -c incorrect results will be produced. -c -c ... lsvmin -c -c the minimum length of the saved work space in wsave. -c lsvmin is computed even if lsave < lsvmin (ier = 10). -c -c ... lwkmin -c -c the minimum length of the unsaved work space in work. -c lwkmin is computed even if lwork < lwkmin (ier = 11). -c -c -c *** error argument -c -c ... ier = 0 if no errors are detected -c -c = 1 if intl is not 0 or 1 -c -c = 2 if igrida(1) is not -1 or +1 or -2 or +2 -c -c = 3 if igrida(2) is not 0 or 1 -c -c = 4 if nlona is less than 4 -c -c = 5 if nlata is less than 3 -c -c = 6 if iveca is not 0 or 1 -c -c = 7 if igridb(1) is not -1 or +1 or -2 or +2 -c -c = 8 if igridb(2) is not 0 or 1 -c -c = 9 if nlonb is less than 4 -c -c =10 if nlatb is less than 3 -c -c =11 if ivecb is not 0 or 1 -c -c =12 if there is insufficient saved work space (lsave < lsvmin) -c -c =13 if there is insufficient unsaved work space (lwork < lwkmin) -c -c =14 indicates failure in an eigenvalue routine which computes -c gaussian weights and points -c -c =15 if ldwork is too small (insufficient double precision -c unsaved work space) -c -c ***************************************************** -c ***************************************************** -c -c end of argument description ... code follows -c -c ***************************************************** -c ***************************************************** -c - subroutine trvsph (intl,igrida,nlona,nlata,iveca,ua,va, - +igridb,nlonb,nlatb,ivecb,ub,vb,wsave,lsave,lsvmin,work, - +lwork,lwkmin,dwork,ldwork,ier) - implicit none - integer intl,igrida(2),nlona,nlata,igridb(2),nlonb,nlatb - integer iveca,ivecb,lsave,lsvmin,lwork,lwkmin,ldwork,ier - real ua(*),va(*),ub(*),vb(*),wsave(*),work(*) - double precision dwork(*) - integer ig,igrda,igrdb,la1,la2,lb1,lb2,lwa,lwb - integer iabr,iabi,iacr,iaci,ibbr,ibbi,ibcr,ibci - integer nlat,lwk1,lwk2,lw,iw,jb,nt,ityp -c -c include a save statement to ensure local variables in trvsph, set during -c an intl=0 call, are preserved if trvsph is recalled with intl=1 -c - save -c -c check input arguments -c - ier = 1 - if (intl*(intl-1).ne.0) return - ier = 2 - ig = igrida(1) - if ((ig-1)*(ig+1)*(ig-2)*(ig+2).ne.0) return - ier = 3 - ig = igrida(2) - if (ig*(ig-1).ne.0) return - ier = 4 - if (nlona .lt. 4) return - ier = 5 - if (nlata .lt.3) return - ier = 6 - if (iveca*(iveca-1).ne.0) return - ier = 7 - ig = igridb(1) - if ((ig-1)*(ig+1)*(ig-2)*(ig+2).ne.0) return - ier = 8 - ig = igridb(2) - if (ig*(ig-1).ne.0) return - ier = 9 - if (nlonb .lt.4) return - ier = 10 - if (nlatb .lt.3) return - ier = 11 - if (ivecb*(ivecb-1).ne.0) return - ier = 0 - igrda = iabs(igrida(1)) - igrdb = iabs(igridb(1)) - if (intl.eq.0) then - la1 = min0(nlata,(nlona+1)/2) - la2 = (nlata+1)/2 - lb1 = min0(nlatb,(nlonb+1)/2) - lb2 = (nlatb+1)/2 -c -c saved space for analysis on a grid -c - lwa = 4*nlata*la2+3*max0(la1-2,0)*(2*nlata-la1-1)+la2+nlona+15 -c -c set saved work space length for synthesis on b grid -c - lwb = 4*nlatb*lb2+3*max0(lb1-2,0)*(2*nlatb-lb1-1)+nlonb+15 -c -c set minimum required saved work space length -c - lsvmin = lwa + lwb -c -c set wsave pointer -c - jb = 1+lwa -c -c set pointers for vector spherical harmonic coefs in work -c - iabr = 1 - iabi = iabr + la1*nlata - iacr = iabi + la1*nlata - iaci = iacr + la1*nlata - ibbr = iaci + la1*nlata - ibbi = ibbr + lb1*nlatb - ibcr = ibbi + lb1*nlatb - ibci = ibcr + lb1*nlatb -c -c set pointers for remaining work -c - iw = ibci + lb1*nlatb -c -c set remaining work space length in lw -c - lw = lwork - iw -c -c compute unsaved space for analysis and synthesis -c - lwk1 = 2*nlata*(2*nlona+max0(6*la2,nlona)) - lwk2 = 2*nlatb*(2*nlonb+max0(6*lb2,nlonb)) -c -c set minimum unsaved work space required by trvsph -c - lwkmin = iw + max0(lwk1,lwk2) -c -c set error flags if saved or unsaved work space is insufficient -c - ier = 12 - if (lsave .lt. lsvmin) return - ier = 13 - if (lwork .lt. lwkmin) return - ier = 15 - nlat = max0(nlata,nlatb) - if (ldwork .lt. 2*nlat*(nlat+1)+1) return - ier = 0 - if (igrda .eq. 1) then -c -c initialize wsave for equally spaced analysis -c - call vhaeci(nlata,nlona,wsave,lwa,dwork,ldwork,ier) - else -c -c initialize wsave for gaussian analysis -c - call vhagci(nlata,nlona,wsave,lwa,dwork,ldwork,ier) - if (ier.ne.0) then -c -c flag failure in spherepack gaussian software -c - ier = 14 - return - end if - end if - - if (igrdb .eq. 2) then -c -c initialize wsave for gaussian synthesis -c - call vhsgci(nlatb,nlonb,wsave(jb),lwb,dwork,ldwork,ier) - if (ier.ne.0) then -c -c flag failure in spherepack gaussian software -c - ier = 14 - return - end if - else -c -c initialize wsave for equally spaced synthesis -c - call vhseci(nlatb,nlonb,wsave(jb),lwb,dwork,ldwork,ier) - end if -c -c end of initialization (intl=0) call -c - end if -c -c convert the vector field (ua,va) to mathematical spherical coordinates -c - if (igrida(2).eq.0) then - call trvplat(nlona,nlata,ua,work) - call trvplat(nlona,nlata,va,work) - end if - if (igrida(1) .gt. 0) then - call covlat(nlata,nlona,ua) - call covlat(nlata,nlona,va) - end if - if (iveca .eq. 0) then - call negv(nlata,nlona,va) - end if - nt = 1 - ityp = 0 -c -c analyze vector field -c - if (igrda .eq. 2) then - call vhagc(nlata,nlona,ityp,nt,va,ua,nlata,nlona,work(iabr), - + work(iabi),work(iacr),work(iaci),la1,nlata,wsave,lwa,work(iw), - + lw,ier) - else - call vhaec(nlata,nlona,ityp,nt,va,ua,nlata,nlona,work(iabr), - + work(iabi),work(iacr),work(iaci),la1,nlata,wsave,lwa,work(iw), - + lw,ier) - end if -c -c transfer a grid coefficients to b grid coefficients -c - call trvab(la1,nlata,work(iabr),work(iabi),work(iacr),work(iaci), - + lb1,nlatb,work(ibbr),work(ibbi),work(ibcr),work(ibci)) -c -c synthesize on b grid -c - if (igrdb .eq. 1) then - call vhsec(nlatb,nlonb,ityp,nt,vb,ub,nlatb,nlonb,work(ibbr), - +work(ibbi),work(ibcr),work(ibci),lb1,nlatb,wsave(jb),lwb, - +work(iw),lw,ier) - else - call vhsgc(nlatb,nlonb,ityp,nt,vb,ub,nlatb,nlonb,work(ibbr), - +work(ibbi),work(ibcr),work(ibci),lb1,nlatb,wsave(jb),lwb,work(iw), - +lw,ier) - end if -c -c restore a grid and b grid vector fields (now in math coordinates) to -c agree with grid flags in igrida,iveca,igridb,ivecb -c - if (iveca .eq. 0) then - call negv(nlata,nlona,va) - end if - if (ivecb .eq. 0) then - call negv(nlatb,nlonb,vb) - end if - if (igrida(1).gt. 0) then - call covlat(nlata,nlona,ua) - call covlat(nlata,nlona,va) - end if - if (igridb(1) .gt. 0) then - call covlat(nlatb,nlonb,ub) - call covlat(nlatb,nlonb,vb) - end if - if (igrida(2) .eq. 0) then - call trvplat(nlata,nlona,ua,work) - call trvplat(nlata,nlona,va,work) - end if - if (igridb(2) .eq. 0) then - call trvplat(nlatb,nlonb,ub,work) - call trvplat(nlatb,nlonb,vb,work) - end if - return - end - subroutine negv(nlat,nlon,v) -c -c negate (co)latitudinal vector componenet -c - implicit none - integer nlat,nlon,i,j - real v(nlat,nlon) - do j=1,nlon - do i=1,nlat - v(i,j) = -v(i,j) - end do - end do - return - end - subroutine trvab(ma,na,abr,abi,acr,aci,mb,nb,bbr,bbi,bcr,bci) - implicit none - integer ma,na,mb,nb,i,j,m,n - real abr(ma,na),abi(ma,na),acr(ma,na),aci(ma,na) - real bbr(mb,nb),bbi(mb,nb),bcr(mb,nb),bci(mb,nb) -c -c set coefficients for b grid from coefficients for a grid -c - m = min0(ma,mb) - n = min0(na,nb) - do j=1,n - do i=1,m - bbr(i,j) = abr(i,j) - bbi(i,j) = abi(i,j) - bcr(i,j) = acr(i,j) - bci(i,j) = aci(i,j) - end do - end do -c -c set coefs outside triangle to zero -c - do i=m+1,mb - do j=1,nb - bbr(i,j) = 0.0 - bbi(i,j) = 0.0 - bcr(i,j) = 0.0 - bci(i,j) = 0.0 - end do - end do - do j=n+1,nb - do i=1,mb - bbr(i,j) = 0.0 - bbi(i,j) = 0.0 - bcr(i,j) = 0.0 - bci(i,j) = 0.0 - end do - end do - return - end - subroutine trvplat(n,m,data,work) -c -c transpose the n by m array data to a m by n array data -c work must be at least n*m words long -c - implicit none - integer n,m,i,j,ij,ji - real data(*),work(*) - do j=1,m - do i=1,n - ij = (j-1)*n+i - work(ij) = data(ij) - end do - end do - do i=1,n - do j=1,m - ji = (i-1)*m+j - ij = (j-1)*n+i - data(ji) = work(ij) - end do - end do - return - end - subroutine covlat(nlat,nlon,data) -c -c reverse order of latitude (colatitude) grids -c - implicit none - integer nlat,nlon,nlat2,i,ib,j - real data(nlat,nlon),temp - nlat2 = nlat/2 - do i=1,nlat2 - ib = nlat-i+1 - do j=1,nlon - temp = data(i,j) - data(i,j) = data(ib,j) - data(ib,j) = temp - end do - end do - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhaec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhaec.f deleted file mode 100755 index 3283f9295..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhaec.f +++ /dev/null @@ -1,936 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhaec.f -c -c this file contains code and documentation for subroutines -c vhaec and vhaeci -c -c ... files which must be loaded with vhaec.f -c -c sphcom.f, hrfft.f -c -c -c subroutine vhaec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhaec,lvhaec,work,lwork,ierror) -c -c subroutine vhaec performs the vector spherical harmonic analysis -c on the vector field (v,w) and stores the result in the arrays -c br, bi, cr, and ci. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given at output parameters v,w in -c subroutine vhsec. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of analyses. in the program that calls vhaec, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple analyses will be performed. -c the third index is the analysis index which assumes the -c values k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contain the vector function to be analyzed. -c v is the colatitudnal component and w is the east -c longitudinal component. v(i,j),w(i,j) contain the -c components at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhaec. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhaec. jdvw must be at least nlon. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhaec. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhaec. ndab must be at -c least nlat. -c -c wvhaec an array which must be initialized by subroutine vhaeci. -c once initialized, wvhaec can be used repeatedly by vhaec -c as long as nlon and nlat remain unchanged. wvhaec must -c not be altered between calls of vhaec. -c -c lvhaec the dimension of the array wvhaec as it appears in the -c program that calls vhaec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhaec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhaec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) -c -c if ityp .gt. 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c in the discription of subroutine vhsec. br(mp1,np1), -c bi(mp1,np1),cr(mp1,np1), and ci(mp1,np1) are computed -c for mp1=1,...,mmax and np1=mp1,...,nlat except for np1=nlat -c and odd mp1. mmax=min0(nlat,nlon/2) if nlon is even or -c mmax=min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhaec -c = 10 error in the specification of lwork -c -c -c ******************************************************************* -c -c subroutine vhaeci(nlat,nlon,wvhaec,lvhaec,dwork,ldwork,ierror) -c -c subroutine vhaeci initializes the array wvhaec which can then be -c used repeatedly by subroutine vhaec until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhaec the dimension of the array wvhaec as it appears in the -c program that calls vhaec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhaec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vhaec. ldwork must be at least -c 2*(nlat+2) -c -c -c ************************************************************** -c -c output parameters -c -c wvhaec an array which is initialized for use by subroutine vhaec. -c once initialized, wvhaec can be used repeatedly by vhaec -c as long as nlat or nlon remain unchanged. wvhaec must not -c be altered between calls of vhaec. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhaec -c = 4 error in the specification of ldwork -c -c -c ********************************************************************** - subroutine vhaec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvhaec,lvhaec,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhaec(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhaec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 - if(ityp .le. 2 .and. - 1 lwork .lt. nlat*(2*nt*nlon+max0(6*imid,nlon))) return - if(ityp .gt. 2 .and. - 1 lwork .lt. imid*(2*nt*nlon+max0(6*nlat,nlon))) return - ierror = 0 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - iw5 = iw4+3*imid*nlat - lwzvin = lzz1+labc - jw1 = lwzvin+1 - jw2 = jw1+lwzvin - call vhaec1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),work(iw5),wvhaec,wvhaec(jw1),wvhaec(jw2)) - return - end - subroutine vhaec1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - 1 ndab,br,bi,cr,ci,idv,ve,vo,we,wo,zv,zw,wzvin,wzwin,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),wzvin(1),wzwin(1),wrfft(1), - 4 zv(imid,nlat,3),zw(imid,nlat,3) - nlp1 = nlat+1 - tsn = 2./nlon - fsn = 4./nlon - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - if(ityp .gt. 2) go to 3 - do 5 k=1,nt - do 5 i=1,imm1 - do 5 j=1,nlon - ve(i,j,k) = tsn*(v(i,j,k)+v(nlp1-i,j,k)) - vo(i,j,k) = tsn*(v(i,j,k)-v(nlp1-i,j,k)) - we(i,j,k) = tsn*(w(i,j,k)+w(nlp1-i,j,k)) - wo(i,j,k) = tsn*(w(i,j,k)-w(nlp1-i,j,k)) - 5 continue - go to 2 - 3 do 8 k=1,nt - do 8 i=1,imm1 - do 8 j=1,nlon - ve(i,j,k) = fsn*v(i,j,k) - vo(i,j,k) = fsn*v(i,j,k) - we(i,j,k) = fsn*w(i,j,k) - wo(i,j,k) = fsn*w(i,j,k) - 8 continue - 2 if(mlat .eq. 0) go to 7 - do 6 k=1,nt - do 6 j=1,nlon - ve(imid,j,k) = tsn*v(imid,j,k) - we(imid,j,k) = tsn*w(imid,j,k) - 6 continue - 7 do 9 k=1,nt - call hrfftf(idv,nlon,ve(1,1,k),idv,wrfft,zv) - call hrfftf(idv,nlon,we(1,1,k),idv,wrfft,zv) - 9 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - if(ityp.eq.2 .or. ityp.eq.5 .or. ityp.eq.8) go to 11 - do 10 k=1,nt - do 10 mp1=1,mmax - do 10 np1=mp1,nlat - br(mp1,np1,k)=0. - bi(mp1,np1,k)=0. - 10 continue - 11 if(ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) go to 13 - do 12 k=1,nt - do 12 mp1=1,mmax - do 12 np1=mp1,nlat - cr(mp1,np1,k)=0. - ci(mp1,np1,k)=0. - 12 continue - 13 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select -c -c case ityp=0 , no symmetries -c - 1 call zvin(0,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 15 k=1,nt - do 15 i=1,imid - do 15 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*ve(i,1,k) - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*we(i,1,k) - 15 continue - do 16 k=1,nt - do 16 i=1,imm1 - do 16 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*vo(i,1,k) - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*wo(i,1,k) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 20 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(0,nlat,nlon,m,zv,iv,wzvin) - call zwin(0,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 17 - do 23 k=1,nt - do 23 i=1,imm1 - do 23 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*we(i,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*ve(i,2*mp1-2,k) - 23 continue - if(mlat .eq. 0) go to 17 - do 24 k=1,nt - do 24 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(imid,np1,iw)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(imid,np1,iw)*we(imid,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(imid,np1,iw)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(imid,np1,iw)*ve(imid,2*mp1-2,k) - 24 continue - 17 if(mp2 .gt. ndo2) go to 20 - do 21 k=1,nt - do 21 i=1,imm1 - do 21 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*wo(i,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*vo(i,2*mp1-2,k) - 21 continue - if(mlat .eq. 0) go to 20 - do 22 k=1,nt - do 22 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-1,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-1,k) - 22 continue - 20 continue - return -c -c case ityp=1 , no symmetries but cr and ci equal zero -c - 100 call zvin(0,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 115 k=1,nt - do 115 i=1,imid - do 115 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*ve(i,1,k) - 115 continue - do 116 k=1,nt - do 116 i=1,imm1 - do 116 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*vo(i,1,k) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 120 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(0,nlat,nlon,m,zv,iv,wzvin) - call zwin(0,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 117 - do 123 k=1,nt - do 123 i=1,imm1 - do 123 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*we(i,2*mp1-2,k) - 123 continue - if(mlat .eq. 0) go to 117 - do 124 k=1,nt - do 124 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(imid,np1,iw)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(imid,np1,iw)*we(imid,2*mp1-2,k) - 124 continue - 117 if(mp2 .gt. ndo2) go to 120 - do 121 k=1,nt - do 121 i=1,imm1 - do 121 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*wo(i,2*mp1-2,k) - 121 continue - if(mlat .eq. 0) go to 120 - do 122 k=1,nt - do 122 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-1,k) - 122 continue - 120 continue - return -c -c case ityp=2 , no symmetries but br and bi equal zero -c - 200 call zvin(0,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 215 k=1,nt - do 215 i=1,imid - do 215 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*we(i,1,k) - 215 continue - do 216 k=1,nt - do 216 i=1,imm1 - do 216 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*wo(i,1,k) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 220 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(0,nlat,nlon,m,zv,iv,wzvin) - call zwin(0,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 217 - do 223 k=1,nt - do 223 i=1,imm1 - do 223 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*ve(i,2*mp1-2,k) - 223 continue - if(mlat .eq. 0) go to 217 - do 224 k=1,nt - do 224 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(imid,np1,iw)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(imid,np1,iw)*ve(imid,2*mp1-2,k) - 224 continue - 217 if(mp2 .gt. ndo2) go to 220 - do 221 k=1,nt - do 221 i=1,imm1 - do 221 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*vo(i,2*mp1-2,k) - 221 continue - if(mlat .eq. 0) go to 220 - do 222 k=1,nt - do 222 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-1,k) - 222 continue - 220 continue - return -c -c case ityp=3 , v even , w odd -c - 300 call zvin(0,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 315 k=1,nt - do 315 i=1,imid - do 315 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*ve(i,1,k) - 315 continue - do 316 k=1,nt - do 316 i=1,imm1 - do 316 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*wo(i,1,k) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 320 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(0,nlat,nlon,m,zv,iv,wzvin) - call zwin(0,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 317 - do 323 k=1,nt - do 323 i=1,imm1 - do 323 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*ve(i,2*mp1-2,k) - 323 continue - if(mlat .eq. 0) go to 317 - do 324 k=1,nt - do 324 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(imid,np1,iw)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(imid,np1,iw)*ve(imid,2*mp1-2,k) - 324 continue - 317 if(mp2 .gt. ndo2) go to 320 - do 321 k=1,nt - do 321 i=1,imm1 - do 321 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*wo(i,2*mp1-2,k) - 321 continue - if(mlat .eq. 0) go to 320 - do 322 k=1,nt - do 322 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-1,k) - 322 continue - 320 continue - return -c -c case ityp=4 , v even, w odd, and cr and ci equal 0. -c - 400 call zvin(1,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 415 k=1,nt - do 415 i=1,imid - do 415 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*ve(i,1,k) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 420 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(1,nlat,nlon,m,zv,iv,wzvin) - call zwin(1,nlat,nlon,m,zw,iw,wzwin) - if(mp2 .gt. ndo2) go to 420 - do 421 k=1,nt - do 421 i=1,imm1 - do 421 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*ve(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*wo(i,2*mp1-2,k) - 421 continue - if(mlat .eq. 0) go to 420 - do 422 k=1,nt - do 422 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(imid,np1,iv)*ve(imid,2*mp1-1,k) - 422 continue - 420 continue - return -c -c case ityp=5 v even, w odd, and br and bi equal zero -c - 500 call zvin(2,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 516 k=1,nt - do 516 i=1,imm1 - do 516 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*wo(i,1,k) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 520 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(2,nlat,nlon,m,zv,iv,wzvin) - call zwin(2,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 520 - do 523 k=1,nt - do 523 i=1,imm1 - do 523 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*wo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*ve(i,2*mp1-2,k) - 523 continue - if(mlat .eq. 0) go to 520 - do 524 k=1,nt - do 524 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(imid,np1,iw)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(imid,np1,iw)*ve(imid,2*mp1-2,k) - 524 continue - 520 continue - return -c -c case ityp=6 , v odd , w even -c - 600 call zvin(0,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 615 k=1,nt - do 615 i=1,imid - do 615 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*we(i,1,k) - 615 continue - do 616 k=1,nt - do 616 i=1,imm1 - do 616 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*vo(i,1,k) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 620 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(0,nlat,nlon,m,zv,iv,wzvin) - call zwin(0,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 617 - do 623 k=1,nt - do 623 i=1,imm1 - do 623 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*we(i,2*mp1-2,k) - 623 continue - if(mlat .eq. 0) go to 617 - do 624 k=1,nt - do 624 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(imid,np1,iw)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(imid,np1,iw)*we(imid,2*mp1-2,k) - 624 continue - 617 if(mp2 .gt. ndo2) go to 620 - do 621 k=1,nt - do 621 i=1,imm1 - do 621 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*vo(i,2*mp1-2,k) - 621 continue - if(mlat .eq. 0) go to 620 - do 622 k=1,nt - do 622 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-1,k) - 622 continue - 620 continue - return -c -c case ityp=7 v odd, w even, and cr and ci equal zero -c - 700 call zvin(2,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 716 k=1,nt - do 716 i=1,imm1 - do 716 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(i,np1,iv)*vo(i,1,k) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 720 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(2,nlat,nlon,m,zv,iv,wzvin) - call zwin(2,nlat,nlon,m,zw,iw,wzwin) - if(mp1 .gt. ndo1) go to 720 - do 723 k=1,nt - do 723 i=1,imm1 - do 723 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(i,np1,iv)*vo(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*we(i,2*mp1-2,k) - 723 continue - if(mlat .eq. 0) go to 720 - do 724 k=1,nt - do 724 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(imid,np1,iw)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(imid,np1,iw)*we(imid,2*mp1-2,k) - 724 continue - 720 continue - return -c -c case ityp=8 v odd, w even, and both br and bi equal zero -c - 800 call zvin(1,nlat,nlon,0,zv,iv,wzvin) -c -c case m=0 -c - do 815 k=1,nt - do 815 i=1,imid - do 815 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-zv(i,np1,iv)*we(i,1,k) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 820 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call zvin(1,nlat,nlon,m,zv,iv,wzvin) - call zwin(1,nlat,nlon,m,zw,iw,wzwin) - if(mp2 .gt. ndo2) go to 820 - do 821 k=1,nt - do 821 i=1,imm1 - do 821 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-2,k) - 1 +zw(i,np1,iw)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(i,np1,iv)*we(i,2*mp1-1,k) - 1 -zw(i,np1,iw)*vo(i,2*mp1-2,k) - 821 continue - if(mlat .eq. 0) go to 820 - do 822 k=1,nt - do 822 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(imid,np1,iv)*we(imid,2*mp1-1,k) - 822 continue - 820 continue - return - end - subroutine vhaeci(nlat,nlon,wvhaec,lvhaec,dwork,ldwork,ierror) - dimension wvhaec(lvhaec) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhaec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 4 - if(ldwork .lt. 2*nlat+2) return - ierror = 0 - call zvinit (nlat,nlon,wvhaec,dwork) - lwzvin = lzz1+labc - iw1 = lwzvin+1 - call zwinit (nlat,nlon,wvhaec(iw1),dwork) - iw2 = iw1+lwzvin - call hrffti(nlon,wvhaec(iw2)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhaes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhaes.f deleted file mode 100755 index b5986c161..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhaes.f +++ /dev/null @@ -1,942 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhaes.f -c -c this file contains code and documentation for subroutines -c vhaes and vhaesi -c -c ... files which must be loaded with vhaes.f -c -c sphcom.f, hrfft.f -c -c -c subroutine vhaes(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhaes,lvhaes,work,lwork,ierror) -c -c subroutine vhaes performs the vector spherical harmonic analysis -c on the vector field (v,w) and stores the result in the arrays -c br, bi, cr, and ci. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given at output parameters v,w in -c subroutine vhses. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of analyses. in the program that calls vhaes, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple analyses will be performed. -c the third index is the analysis index which assumes the -c values k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contain the vector function to be analyzed. -c v is the colatitudnal component and w is the east -c longitudinal component. v(i,j),w(i,j) contain the -c components at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhaes. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhaes. jdvw must be at least nlon. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhaes. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhaes. ndab must be at -c least nlat. -c -c lvhaes an array which must be initialized by subroutine vhaesi. -c once initialized, wvhaes can be used repeatedly by vhaes -c as long as nlon and nlat remain unchanged. wvhaes must -c not be altered between calls of vhaes. -c -c lvhaes the dimension of the array wvhaes as it appears in the -c program that calls vhaes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhaes must be at least -c -c l1*l2(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhaes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c (2*nt+1)*nlat*nlon -c -c if ityp .gt. 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon -c -c ************************************************************** -c -c output parameters -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c in the discription of subroutine vhses. br(mp1,np1), -c bi(mp1,np1),cr(mp1,np1), and ci(mp1,np1) are computed -c for mp1=1,...,mmax and np1=mp1,...,nlat except for np1=nlat -c and odd mp1. mmax=min0(nlat,nlon/2) if nlon is even or -c mmax=min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhaes -c = 10 error in the specification of lwork -c -c ******************************************************** -c -c subroutine vhaesi(nlat,nlon,wvhaes,lvhaes,work,lwork,dwork, -c + ldwork,ierror) -c -c subroutine vhaesi initializes the array wvhaes which can then be -c used repeatedly by subroutine vhaes until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhaes the dimension of the array wvhaes as it appears in the -c program that calls vhaes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhaes must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhaes. lwork must be at least -c -c 3*(max0(l1-2,0)*(nlat+nlat-l1-1))/2+5*l2*nlat -c -c dwork an unsaved double precision work space -c -c ldwork the length of the array dwork as it appears in the -c program that calls vhaesi. ldwork must be at least -c 2*(nlat+1) -c -c -c ************************************************************** -c -c output parameters -c -c wvhaes an array which is initialized for use by subroutine vhaes. -c once initialized, wvhaes can be used repeatedly by vhaes -c as long as nlat or nlon remain unchanged. wvhaes must not -c be altered between calls of vhaes. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhaes -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c -c - subroutine vhaes(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvhaes,lvhaes,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhaes(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhaes .lt. lzimn+lzimn+nlon+15) return - ierror = 10 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - if(lwork .lt. lnl+lnl+idv*nlon) return - ierror = 0 - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - jw1 = lzimn+1 - jw2 = jw1+lzimn - call vhaes1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),idz,wvhaes,wvhaes(jw1),wvhaes(jw2)) - return - end - - subroutine vhaes1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - 1 ndab,br,bi,cr,ci,idv,ve,vo,we,wo,work,idz,zv,zw,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),work(1),wrfft(1), - 4 zv(idz,1),zw(idz,1) - nlp1 = nlat+1 - tsn = 2./nlon - fsn = 4./nlon - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - if(ityp .gt. 2) go to 3 - do 5 k=1,nt - do 5 i=1,imm1 - do 5 j=1,nlon - ve(i,j,k) = tsn*(v(i,j,k)+v(nlp1-i,j,k)) - vo(i,j,k) = tsn*(v(i,j,k)-v(nlp1-i,j,k)) - we(i,j,k) = tsn*(w(i,j,k)+w(nlp1-i,j,k)) - wo(i,j,k) = tsn*(w(i,j,k)-w(nlp1-i,j,k)) - 5 continue - go to 2 - 3 do 8 k=1,nt - do 8 i=1,imm1 - do 8 j=1,nlon - ve(i,j,k) = fsn*v(i,j,k) - vo(i,j,k) = fsn*v(i,j,k) - we(i,j,k) = fsn*w(i,j,k) - wo(i,j,k) = fsn*w(i,j,k) - 8 continue - 2 if(mlat .eq. 0) go to 7 - do 6 k=1,nt - do 6 j=1,nlon - ve(imid,j,k) = tsn*v(imid,j,k) - we(imid,j,k) = tsn*w(imid,j,k) - 6 continue - 7 do 9 k=1,nt - call hrfftf(idv,nlon,ve(1,1,k),idv,wrfft,work) - call hrfftf(idv,nlon,we(1,1,k),idv,wrfft,work) - 9 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - if(ityp.eq.2 .or. ityp.eq.5 .or. ityp.eq.8) go to 11 - do 10 k=1,nt - do 10 mp1=1,mmax - do 10 np1=mp1,nlat - br(mp1,np1,k)=0. - bi(mp1,np1,k)=0. - 10 continue - 11 if(ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) go to 13 - do 12 k=1,nt - do 12 mp1=1,mmax - do 12 np1=mp1,nlat - cr(mp1,np1,k)=0. - ci(mp1,np1,k)=0. - 12 continue - 13 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - -c -c case ityp=0 , no symmetries -c -c case m=0 -c - 1 do 15 k=1,nt - do 15 i=1,imid - do 15 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*ve(i,1,k) - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*we(i,1,k) - 15 continue - do 16 k=1,nt - do 16 i=1,imm1 - do 16 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*vo(i,1,k) - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*wo(i,1,k) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 20 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 17 - do 23 k=1,nt - do 23 i=1,imm1 - do 23 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*we(i,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*ve(i,2*mp1-2,k) - 23 continue - if(mlat .eq. 0) go to 17 - do 24 k=1,nt - do 24 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(np1+mb,imid)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(np1+mb,imid)*we(imid,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(np1+mb,imid)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(np1+mb,imid)*ve(imid,2*mp1-2,k) - 24 continue - 17 if(mp2 .gt. ndo2) go to 20 - do 21 k=1,nt - do 21 i=1,imm1 - do 21 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*wo(i,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*vo(i,2*mp1-2,k) - 21 continue - if(mlat .eq. 0) go to 20 - do 22 k=1,nt - do 22 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-1,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-1,k) - 22 continue - 20 continue - return -c -c case ityp=1 , no symmetries but cr and ci equal zero -c -c case m=0 -c - 100 do 115 k=1,nt - do 115 i=1,imid - do 115 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*ve(i,1,k) - 115 continue - do 116 k=1,nt - do 116 i=1,imm1 - do 116 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*vo(i,1,k) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 120 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 117 - do 123 k=1,nt - do 123 i=1,imm1 - do 123 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*we(i,2*mp1-2,k) - 123 continue - if(mlat .eq. 0) go to 117 - do 124 k=1,nt - do 124 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(np1+mb,imid)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(np1+mb,imid)*we(imid,2*mp1-2,k) - 124 continue - 117 if(mp2 .gt. ndo2) go to 120 - do 121 k=1,nt - do 121 i=1,imm1 - do 121 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*wo(i,2*mp1-2,k) - 121 continue - if(mlat .eq. 0) go to 120 - do 122 k=1,nt - do 122 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-1,k) - 122 continue - 120 continue - return -c -c case ityp=2 , no symmetries but br and bi equal zero -c -c case m=0 -c - 200 do 215 k=1,nt - do 215 i=1,imid - do 215 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*we(i,1,k) - 215 continue - do 216 k=1,nt - do 216 i=1,imm1 - do 216 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*wo(i,1,k) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 220 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 217 - do 223 k=1,nt - do 223 i=1,imm1 - do 223 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*ve(i,2*mp1-2,k) - 223 continue - if(mlat .eq. 0) go to 217 - do 224 k=1,nt - do 224 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(np1+mb,imid)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(np1+mb,imid)*ve(imid,2*mp1-2,k) - 224 continue - 217 if(mp2 .gt. ndo2) go to 220 - do 221 k=1,nt - do 221 i=1,imm1 - do 221 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*vo(i,2*mp1-2,k) - 221 continue - if(mlat .eq. 0) go to 220 - do 222 k=1,nt - do 222 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-1,k) - 222 continue - 220 continue - return -c -c case ityp=3 , v even , w odd -c -c case m=0 -c - 300 do 315 k=1,nt - do 315 i=1,imid - do 315 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*ve(i,1,k) - 315 continue - do 316 k=1,nt - do 316 i=1,imm1 - do 316 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*wo(i,1,k) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 320 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 317 - do 323 k=1,nt - do 323 i=1,imm1 - do 323 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*ve(i,2*mp1-2,k) - 323 continue - if(mlat .eq. 0) go to 317 - do 324 k=1,nt - do 324 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(np1+mb,imid)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(np1+mb,imid)*ve(imid,2*mp1-2,k) - 324 continue - 317 if(mp2 .gt. ndo2) go to 320 - do 321 k=1,nt - do 321 i=1,imm1 - do 321 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*wo(i,2*mp1-2,k) - 321 continue - if(mlat .eq. 0) go to 320 - do 322 k=1,nt - do 322 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-1,k) - 322 continue - 320 continue - return -c -c case ityp=4 , v even, w odd, and cr and ci equal 0. -c -c case m=0 -c - 400 do 415 k=1,nt - do 415 i=1,imid - do 415 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*ve(i,1,k) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 420 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 420 - do 421 k=1,nt - do 421 i=1,imm1 - do 421 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*ve(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*wo(i,2*mp1-2,k) - 421 continue - if(mlat .eq. 0) go to 420 - do 422 k=1,nt - do 422 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,imid)*ve(imid,2*mp1-1,k) - 422 continue - 420 continue - return -c -c case ityp=5 v even, w odd, and br and bi equal zero -c -c case m=0 -c - 500 do 516 k=1,nt - do 516 i=1,imm1 - do 516 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*wo(i,1,k) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 520 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 520 - do 523 k=1,nt - do 523 i=1,imm1 - do 523 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*wo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*ve(i,2*mp1-2,k) - 523 continue - if(mlat .eq. 0) go to 520 - do 524 k=1,nt - do 524 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+zw(np1+mb,imid)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zw(np1+mb,imid)*ve(imid,2*mp1-2,k) - 524 continue - 520 continue - return -c -c case ityp=6 , v odd , w even -c -c case m=0 -c - 600 do 615 k=1,nt - do 615 i=1,imid - do 615 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*we(i,1,k) - 615 continue - do 616 k=1,nt - do 616 i=1,imm1 - do 616 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*vo(i,1,k) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 620 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 617 - do 623 k=1,nt - do 623 i=1,imm1 - do 623 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*we(i,2*mp1-2,k) - 623 continue - if(mlat .eq. 0) go to 617 - do 624 k=1,nt - do 624 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(np1+mb,imid)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(np1+mb,imid)*we(imid,2*mp1-2,k) - 624 continue - 617 if(mp2 .gt. ndo2) go to 620 - do 621 k=1,nt - do 621 i=1,imm1 - do 621 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*vo(i,2*mp1-2,k) - 621 continue - if(mlat .eq. 0) go to 620 - do 622 k=1,nt - do 622 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-1,k) - 622 continue - 620 continue - return -c -c case ityp=7 v odd, w even, and cr and ci equal zero -c -c case m=0 -c - 700 do 716 k=1,nt - do 716 i=1,imm1 - do 716 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+zv(np1,i)*vo(i,1,k) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 720 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 720 - do 723 k=1,nt - do 723 i=1,imm1 - do 723 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+zv(np1+mb,i)*vo(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*we(i,2*mp1-2,k) - 723 continue - if(mlat .eq. 0) go to 720 - do 724 k=1,nt - do 724 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+zw(np1+mb,imid)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-zw(np1+mb,imid)*we(imid,2*mp1-2,k) - 724 continue - 720 continue - return -c -c case ityp=8 v odd, w even, and both br and bi equal zero -c -c case m=0 -c - 800 do 815 k=1,nt - do 815 i=1,imid - do 815 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-zv(np1,i)*we(i,1,k) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 820 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 820 - do 821 k=1,nt - do 821 i=1,imm1 - do 821 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-2,k) - 1 +zw(np1+mb,i)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,i)*we(i,2*mp1-1,k) - 1 -zw(np1+mb,i)*vo(i,2*mp1-2,k) - 821 continue - if(mlat .eq. 0) go to 820 - do 822 k=1,nt - do 822 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-zv(np1+mb,imid)*we(imid,2*mp1-1,k) - 822 continue - 820 continue - return - end -c -c dwork must be of length at least 2*(nlat+1) -c - subroutine vhaesi(nlat,nlon,wvhaes,lvhaes,work,lwork,dwork, - + ldwork,ierror) - dimension wvhaes(lvhaes),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - mmax = min0(nlat,(nlon+1)/2) - imid = (nlat+1)/2 - lzimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lvhaes .lt. lzimn+lzimn+nlon+15) return - ierror = 4 - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwork .lt. 5*nlat*imid+labc) return - ierror = 5 - if (ldwork .lt. 2*(nlat+1)) return - ierror = 0 - iw1 = 3*nlat*imid+1 - idz = (mmax*(nlat+nlat-mmax+1))/2 - CALL VEA1(NLAT,NLON,IMID,WVHAES,WVHAES(LZIMN+1),IDZ, - + WORK,WORK(IW1),DWORK) - call hrffti(nlon,wvhaes(2*lzimn+1)) - return - end - subroutine vea1(nlat,nlon,imid,zv,zw,idz,zin,wzvin,dwork) - dimension zv(idz,1),zw(idz,1),zin(imid,nlat,3),wzvin(1) - double precision dwork(*) - mmax = min0(nlat,(nlon+1)/2) - call zvinit (nlat,nlon,wzvin,dwork) - do 33 mp1=1,mmax - m = mp1-1 - call zvin (0,nlat,nlon,m,zin,i3,wzvin) - do 33 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 33 i=1,imid - zv(mn,i) = zin(i,np1,i3) - 33 continue - call zwinit (nlat,nlon,wzvin,dwork) - do 34 mp1=1,mmax - m = mp1-1 - call zwin (0,nlat,nlon,m,zin,i3,wzvin) - do 34 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 34 i=1,imid - zw(mn,i) = zin(i,np1,i3) - 34 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhagc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhagc.f deleted file mode 100755 index fd60023de..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhagc.f +++ /dev/null @@ -1,1085 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhagc.f -c -c this file contains code and documentation for subroutines -c vhagc and vhagci -c -c ... files which must be loaded with vhagc.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c -c subroutine vhagc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhagc,lvhagc,work,lwork,ierror) -c -c subroutine vhagc performs the vector spherical harmonic analysis -c on the vector field (v,w) and stores the result in the arrays -c br,bi,cr, and ci. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at the gaussian colatitude point theta(i) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given at output parameters v,w in -c subroutine vhsec. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of analyses. in the program that calls vhagc, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple analyses will be performed. -c the third index is the analysis index which assumes the -c values k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contain the vector function to be analyzed. -c v is the colatitudnal component and w is the east -c longitudinal component. v(i,j),w(i,j) contain the -c components at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhagc. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhagc. jdvw must be at least nlon. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhagc. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhagc. ndab must be at -c least nlat. -c -c wvhagc an array which must be initialized by subroutine vhagci. -c once initialized, wvhagc can be used repeatedly by vhagc -c as long as nlon and nlat remain unchanged. wvhagc must -c not be altered between calls of vhagc. -c -c lvhagc the dimension of the array wvhagc as it appears in the -c program that calls vhagc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhagc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+l2+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhagc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c 2*nlat*(2*nlon*nt+3*l2) -c -c if ityp .gt. 2 then lwork must be at least -c -c 2*l2*(2*nlon*nt+3*nlat) -c -c -c -c ************************************************************** -c -c output parameters -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c in the discription of subroutine vhsec. br(mp1,np1), -c bi(mp1,np1),cr(mp1,np1), and ci(mp1,np1) are computed -c for mp1=1,...,mmax and np1=mp1,...,nlat except for np1=nlat -c and odd mp1. mmax=min0(nlat,nlon/2) if nlon is even or -c mmax=min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhagc -c = 10 error in the specification of lwork -c -c **************************************************************** -c -c subroutine vhagci(nlat,nlon,wvhagc,lvhagc,dwork,ldwork,ierror) -c -c subroutine vhagci initializes the array wvhagc which can then be -c used repeatedly by subroutine vhagc until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhagc the dimension of the array wvhagc as it appears in the -c program that calls vhagci. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhagc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+l2+15 -c -c -c dwork a double precision work array that does not need to be saved -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vhagci. ldwork must be at least -c -c 2*nlat*(nlat+1)+1 -c -c -c ************************************************************** -c -c output parameters -c -c wvhagc an array which is initialized for use by subroutine vhagc. -c once initialized, wvhagc can be used repeatedly by vhagc -c as long as nlat and nlon remain unchanged. wvhagc must not -c be altered between calls of vhagc. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhagc -c = 4 error in the specification of lwork -c - subroutine vhagc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvhagc,lvhagc,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhagc(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - + (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhagc .lt. 2*(lzz1+labc)+nlon+imid+15) return - ierror = 10 - if (ityp.le.2 .and. lwork.lt.nlat*(4*nlon*nt+6*imid)) return - if (ityp.gt.2 .and. lwork.lt.imid*(4*nlon*nt+6*nlat)) return - ierror = 0 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - iw5 = iw4+3*imid*nlat - lwzvin = lzz1+labc - jw1 = (nlat+1)/2+1 - jw2 = jw1+lwzvin - jw3 = jw2+lwzvin - call vhagc1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - +br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - +work(iw4),work(iw5),wvhagc,wvhagc(jw1),wvhagc(jw2),wvhagc(jw3)) - return - end - subroutine vhagc1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - +ndab,br,bi,cr,ci,idv,ve,vo,we,wo,vb,wb,wts,wvbin,wwbin,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),wts(*),wvbin(1),wwbin(1),wrfft(1), - 4 vb(imid,nlat,3),wb(imid,nlat,3) - nlp1 = nlat+1 - tsn = 2./nlon - fsn = 4./nlon - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - if(ityp .gt. 2) go to 3 - do 5 k=1,nt - do 5 i=1,imm1 - do 5 j=1,nlon - ve(i,j,k) = tsn*(v(i,j,k)+v(nlp1-i,j,k)) - vo(i,j,k) = tsn*(v(i,j,k)-v(nlp1-i,j,k)) - we(i,j,k) = tsn*(w(i,j,k)+w(nlp1-i,j,k)) - wo(i,j,k) = tsn*(w(i,j,k)-w(nlp1-i,j,k)) - 5 continue - go to 2 - 3 do 8 k=1,nt - do 8 i=1,imm1 - do 8 j=1,nlon - ve(i,j,k) = fsn*v(i,j,k) - vo(i,j,k) = fsn*v(i,j,k) - we(i,j,k) = fsn*w(i,j,k) - wo(i,j,k) = fsn*w(i,j,k) - 8 continue - 2 if(mlat .eq. 0) go to 7 - do 6 k=1,nt - do 6 j=1,nlon - ve(imid,j,k) = tsn*v(imid,j,k) - we(imid,j,k) = tsn*w(imid,j,k) - 6 continue - 7 do 9 k=1,nt - call hrfftf(idv,nlon,ve(1,1,k),idv,wrfft,vb) - call hrfftf(idv,nlon,we(1,1,k),idv,wrfft,vb) - 9 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - if(ityp.eq.2 .or. ityp.eq.5 .or. ityp.eq.8) go to 11 - do 10 k=1,nt - do 10 mp1=1,mmax - do 10 np1=mp1,nlat - br(mp1,np1,k)=0. - bi(mp1,np1,k)=0. - 10 continue - 11 if(ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) go to 13 - do 12 k=1,nt - do 12 mp1=1,mmax - do 12 np1=mp1,nlat - cr(mp1,np1,k)=0. - ci(mp1,np1,k)=0. - 12 continue - 13 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - - -c -c case ityp=0 , no symmetries -c - 1 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 15 k=1,nt - do 1015 i=1,imid - tv = ve(i,1,k)*wts(i) - tw = we(i,1,k)*wts(i) - do 10015 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw -10015 continue - 1015 continue - 15 continue - do 16 k=1,nt - do 1016 i=1,imm1 - tv = vo(i,1,k)*wts(i) - tw = wo(i,1,k)*wts(i) - do 10016 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw -10016 continue - 1016 continue - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 20 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 17 - do 23 k=1,nt - do 1023 i=1,imm1 -c -c set temps to optimize quadrature -c - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - do 10023 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tvo2 - + +wb(i,np1,iw)*twe1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tvo1 - + -wb(i,np1,iw)*twe2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*two2 - + +wb(i,np1,iw)*tve1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*two1 - + -wb(i,np1,iw)*tve2 -10023 continue - 1023 continue - 23 continue - - if(mlat .eq. 0) go to 17 - i = imid - do 24 k=1,nt - do 1024 np1=mp1,ndo1,2 - br(mp1,np1,k)=br(mp1,np1,k)+wb(i,np1,iw)*we(i,2*mp1-1,k)*wts(i) - bi(mp1,np1,k)=bi(mp1,np1,k)-wb(i,np1,iw)*we(i,2*mp1-2,k)*wts(i) - cr(mp1,np1,k)=cr(mp1,np1,k)+wb(i,np1,iw)*ve(i,2*mp1-1,k)*wts(i) - ci(mp1,np1,k)=ci(mp1,np1,k)-wb(i,np1,iw)*ve(i,2*mp1-2,k)*wts(i) - 1024 continue - 24 continue - 17 if(mp2 .gt. ndo2) go to 20 - do 21 k=1,nt - do 1021 i=1,imm1 - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - do 10021 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tve2 - 1 +wb(i,np1,iw)*two1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tve1 - 1 -wb(i,np1,iw)*two2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*twe2 - 1 +wb(i,np1,iw)*tvo1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*twe1 - 1 -wb(i,np1,iw)*tvo2 -10021 continue - 1021 continue - 21 continue - - if(mlat .eq. 0) go to 20 - i = imid - do 22 k=1,nt - do 1022 np1=mp2,ndo2,2 - br(mp1,np1,k)=br(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-2,k)*wts(i) - bi(mp1,np1,k)=bi(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-1,k)*wts(i) - cr(mp1,np1,k)=cr(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-2,k)*wts(i) - ci(mp1,np1,k)=ci(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-1,k)*wts(i) - 1022 continue - 22 continue - 20 continue - return -c -c case ityp=1 , no symmetries but cr and ci equal zero -c - 100 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 115 k=1,nt - do 115 i=1,imid - tv = ve(i,1,k)*wts(i) - do 115 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - 115 continue - do 116 k=1,nt - do 116 i=1,imm1 - tv = vo(i,1,k)*wts(i) - do 116 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 120 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 117 - do 123 k=1,nt - do 123 i=1,imm1 - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - do 123 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tvo2 - + +wb(i,np1,iw)*twe1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tvo1 - + -wb(i,np1,iw)*twe2 - 123 continue - if(mlat .eq. 0) go to 117 - i = imid - do 124 k=1,nt - do 124 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(i,np1,iw)*we(i,2*mp1-1,k)*wts(i) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(i,np1,iw)*we(i,2*mp1-2,k)*wts(i) - 124 continue - 117 if(mp2 .gt. ndo2) go to 120 - do 121 k=1,nt - do 121 i=1,imm1 - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - do 121 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tve2 - + +wb(i,np1,iw)*two1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tve1 - + -wb(i,np1,iw)*two2 - 121 continue - if(mlat .eq. 0) go to 120 - i = imid - do 122 k=1,nt - do 122 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-2,k)*wts(i) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-1,k)*wts(i) - 122 continue - 120 continue - return -c -c case ityp=2 , no symmetries but br and bi equal zero -c - 200 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 215 k=1,nt - do 215 i=1,imid - tw = we(i,1,k)*wts(i) - do 215 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw - 215 continue - do 216 k=1,nt - do 216 i=1,imm1 - tw = wo(i,1,k)*wts(i) - do 216 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 220 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 217 - do 223 k=1,nt - do 223 i=1,imm1 - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - do 223 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*two2 - + +wb(i,np1,iw)*tve1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*two1 - + -wb(i,np1,iw)*tve2 - 223 continue - if(mlat .eq. 0) go to 217 - i = imid - do 224 k=1,nt - do 224 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(i,np1,iw)*ve(i,2*mp1-1,k)*wts(i) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(i,np1,iw)*ve(i,2*mp1-2,k)*wts(i) - 224 continue - 217 if(mp2 .gt. ndo2) go to 220 - do 221 k=1,nt - do 221 i=1,imm1 - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - do 221 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*twe2 - + +wb(i,np1,iw)*tvo1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*twe1 - + -wb(i,np1,iw)*tvo2 - 221 continue - if(mlat .eq. 0) go to 220 - i = imid - do 222 k=1,nt - do 222 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-2,k)*wts(i) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-1,k)*wts(i) - 222 continue - 220 continue - return -c -c case ityp=3 , v even , w odd -c - 300 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 315 k=1,nt - do 315 i=1,imid - tv = ve(i,1,k)*wts(i) - do 315 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - 315 continue - do 316 k=1,nt - do 316 i=1,imm1 - tw = wo(i,1,k)*wts(i) - do 316 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 320 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 317 - do 323 k=1,nt - do 323 i=1,imm1 - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - do 323 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*two2 - + +wb(i,np1,iw)*tve1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*two1 - + -wb(i,np1,iw)*tve2 - 323 continue - if(mlat .eq. 0) go to 317 - i = imid - do 324 k=1,nt - do 324 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(i,np1,iw)*ve(i,2*mp1-1,k)*wts(i) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(i,np1,iw)*ve(i,2*mp1-2,k)*wts(i) - 324 continue - 317 if(mp2 .gt. ndo2) go to 320 - do 321 k=1,nt - do 321 i=1,imm1 - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - do 321 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tve2 - + +wb(i,np1,iw)*two1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tve1 - + -wb(i,np1,iw)*two2 - 321 continue - if(mlat .eq. 0) go to 320 - i = imid - do 322 k=1,nt - do 322 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-2,k)*wts(i) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-1,k)*wts(i) - 322 continue - 320 continue - return -c -c case ityp=4 , v even, w odd, and cr and ci equal 0. -c - 400 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 415 k=1,nt - do 415 i=1,imid - tv = ve(i,1,k)*wts(i) - do 415 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 420 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 420 - do 421 k=1,nt - do 421 i=1,imm1 - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - do 421 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tve2 - + +wb(i,np1,iw)*two1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tve1 - + -wb(i,np1,iw)*two2 - 421 continue - if(mlat .eq. 0) go to 420 - i = imid - do 422 k=1,nt - do 422 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-2,k)*wts(i) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*ve(i,2*mp1-1,k)*wts(i) - 422 continue - 420 continue - return -c -c case ityp=5 v even, w odd, and br and bi equal zero -c - 500 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 516 k=1,nt - do 516 i=1,imm1 - tw = wo(i,1,k)*wts(i) - do 516 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 520 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 520 - do 523 k=1,nt - do 523 i=1,imm1 - two1 = wo(i,2*mp1-1,k)*wts(i) - two2 = wo(i,2*mp1-2,k)*wts(i) - tve1 = ve(i,2*mp1-1,k)*wts(i) - tve2 = ve(i,2*mp1-2,k)*wts(i) - do 523 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*two2 - + +wb(i,np1,iw)*tve1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*two1 - + -wb(i,np1,iw)*tve2 - 523 continue - if(mlat .eq. 0) go to 520 - i = imid - do 524 k=1,nt - do 524 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(i,np1,iw)*ve(i,2*mp1-1,k)*wts(i) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(i,np1,iw)*ve(i,2*mp1-2,k)*wts(i) - 524 continue - 520 continue - return -c -c case ityp=6 , v odd , w even -c - 600 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 615 k=1,nt - do 615 i=1,imid - tw = we(i,1,k)*wts(i) - do 615 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw - 615 continue - do 616 k=1,nt - do 616 i=1,imm1 - tv = vo(i,1,k)*wts(i) - do 616 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 620 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 617 - do 623 k=1,nt - do 623 i=1,imm1 - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - do 623 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tvo2 - + +wb(i,np1,iw)*twe1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tvo1 - + -wb(i,np1,iw)*twe2 - 623 continue - if(mlat .eq. 0) go to 617 - i = imid - do 624 k=1,nt - do 624 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(i,np1,iw)*we(i,2*mp1-1,k)*wts(i) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(i,np1,iw)*we(i,2*mp1-2,k)*wts(i) - 624 continue - 617 if(mp2 .gt. ndo2) go to 620 - do 621 k=1,nt - do 621 i=1,imm1 - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - do 621 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*twe2 - + +wb(i,np1,iw)*tvo1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*twe1 - + -wb(i,np1,iw)*tvo2 - 621 continue - if(mlat .eq. 0) go to 620 - i = imid - do 622 k=1,nt - do 622 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-2,k)*wts(i) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-1,k)*wts(i) - 622 continue - 620 continue - return -c -c case ityp=7 v odd, w even, and cr and ci equal zero -c - 700 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 716 k=1,nt - do 716 i=1,imm1 - tv = vo(i,1,k)*wts(i) - do 716 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1,iv)*tv - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 720 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 720 - do 723 k=1,nt - do 723 i=1,imm1 - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - do 723 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1,iv)*tvo2 - + +wb(i,np1,iw)*twe1 - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1,iv)*tvo1 - + -wb(i,np1,iw)*twe2 - 723 continue - if(mlat .eq. 0) go to 720 - i = imid - do 724 k=1,nt - do 724 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(i,np1,iw)*we(i,2*mp1-1,k)*wts(i) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(i,np1,iw)*we(i,2*mp1-2,k)*wts(i) - 724 continue - 720 continue - return -c -c case ityp=8 v odd, w even, and both br and bi equal zero -c - 800 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m=0 -c - do 815 k=1,nt - do 815 i=1,imid - tw = we(i,1,k)*wts(i) - do 815 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1,iv)*tw - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 820 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 820 - do 821 k=1,nt - do 821 i=1,imm1 - twe1 = we(i,2*mp1-1,k)*wts(i) - twe2 = we(i,2*mp1-2,k)*wts(i) - tvo1 = vo(i,2*mp1-1,k)*wts(i) - tvo2 = vo(i,2*mp1-2,k)*wts(i) - do 821 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*twe2 - + +wb(i,np1,iw)*tvo1 - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*twe1 - + -wb(i,np1,iw)*tvo2 - 821 continue - if(mlat .eq. 0) go to 820 - i = imid - do 822 k=1,nt - do 822 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-2,k)*wts(i) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1,iv)*we(i,2*mp1-1,k)*wts(i) - 822 continue - 820 continue - return - end - subroutine vhagci(nlat,nlon,wvhagc,lvhagc,dwork,ldwork,ierror) - dimension wvhagc(1) - double precision dwork(*) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - imid = (nlat+1)/2 - if(lvhagc .lt. 2*(lzz1+labc)+nlon+imid+15) return - ierror = 4 - if (ldwork .lt. 2*nlat*(nlat+1)+1) return - ierror = 0 -c -c compute gaussian points in first nlat+1 words of dwork -c double precision -c - lwk = nlat*(nlat+2) - - jw1 = 1 -c jw2 = jw1+nlat+nlat -c jw3 = jw2+nlat+nlat - jw2 = jw1+nlat - jw3 = jw2+nlat - call gaqd(nlat,dwork(jw1),dwork(jw2),dwork(jw3),lwk,ierror) - imid = (nlat+1)/2 -c -c set first imid words of double precision weights in dwork -c as single precision in first imid words of wvhagc -c - call setwts(imid,dwork(nlat+1),wvhagc) -c -c first nlat+1 words of dwork contain double theta -c -c iwrk = nlat+2 - iwrk = (nlat+1)/2 +1 - iw1 = imid+1 - call vbgint (nlat,nlon,dwork,wvhagc(iw1),dwork(iwrk)) - lwvbin = lzz1+labc - iw2 = iw1+lwvbin - call wbgint (nlat,nlon,dwork,wvhagc(iw2),dwork(iwrk)) - iw3 = iw2+lwvbin - call hrffti(nlon,wvhagc(iw3)) - return - end - subroutine setwts(imid,dwts,wts) -c -c set first imid =(nlat+1)/2 of double precision weights in dwts -c as single precision in wts -c - dimension dwts(imid),wts(imid) - double precision dwts - do 1 i=1,imid - wts(i) = dwts(i) - 1 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhags.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhags.f deleted file mode 100755 index 030994ab0..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhags.f +++ /dev/null @@ -1,1053 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhags.f -c -c this file contains code and documentation for subroutines -c vhags and vhagsi -c -c ... files which must be loaded with vhags.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c subroutine vhags(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhags,lvhags,work,lwork,ierror) -c -c subroutine vhags performs the vector spherical harmonic analysis -c on the vector field (v,w) and stores the result in the arrays -c br, bi, cr, and ci. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at the gaussian colatitude point theta(i) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given at output parameters v,w in -c subroutine vhses. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the analysis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the analysis is performed on the northern -c hemisphere only. i.e., if nlat is odd the analysis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the analysis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of analyses. in the program that calls vhags, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple analyses will be performed. -c the third index is the analysis index which assumes the -c values k=1,...,nt. for a single analysis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c v,w two or three dimensional arrays (see input parameter nt) -c that contain the vector function to be analyzed. -c v is the colatitudnal component and w is the east -c longitudinal component. v(i,j),w(i,j) contain the -c components at the gaussian colatitude point theta(i) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhags. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhags. jdvw must be at least nlon. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhags. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhags. ndab must be at -c least nlat. -c -c wvhags an array which must be initialized by subroutine vhgsi. -c once initialized, wvhags can be used repeatedly by vhags -c as long as nlon and nlat remain unchanged. wvhags must -c not be altered between calls of vhags. -c -c lvhags the dimension of the array wvhags as it appears in the -c program that calls vhags. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhags must be at least -c -c l1*l2(nlat+nlat-l1+1)+nlon+15 -c -c ??? (nlat+1)*(nlat+1)*nlat/2 + nlon + 15 -c -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhags. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c the larger of the two quantities -c -c 3*nlat*(nlat+1)+2 (required by vhagsi) -c -c and -c -c (2*nt+1)*nlat*nlon -c -c if ityp .gt. 2 then lwork must be at least -c the larger of the two quantities -c -c 3*nlat*(nlat+1)+2 (required by vhagsi) -c -c and -c -c (2*nt+1)*l2*nlon -c -c -c ************************************************************** -c -c output parameters -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c in the discription of subroutine vhses. br(mp1,np1), -c bi(mp1,np1),cr(mp1,np1), and ci(mp1,np1) are computed -c for mp1=1,...,mmax and np1=mp1,...,nlat except for np1=nlat -c and odd mp1. mmax=min0(nlat,nlon/2) if nlon is even or -c mmax=min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhags -c = 10 error in the specification of lwork -c -c -c subroutine vhagsi(nlat,nlon,wvhags,lvhags,work,lwork,ierror) -c -c subroutine vhagsi initializes the array wvhags which can then be -c used repeatedly by subroutine vhags until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhags the dimension of the array wvhags as it appears in the -c program that calls vhagsi. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhags must be at least -c -c 3*nlat*(nlat+1)+2 (required by vhagsi) -c -c dwork a double precision work space that does not need to be saved -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vhagsi. ldwork must be at least -c -c (3*nlat*(nlat+3)+2)/2 -c -c ************************************************************** -c -c output parameters -c -c wvhags an array which is initialized for use by subroutine vhags. -c once initialized, wvhags can be used repeatedly by vhags -c as long as nlat and nlon remain unchanged. wvhags must not -c be altered between calls of vhags. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhags -c = 4 error in the specification of ldwork -c - subroutine vhags(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvhags,lvhags,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhags(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhags .lt. lzimn+lzimn+nlon+15) return - ierror = 10 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - if(lwork .lt. lnl+lnl+idv*nlon) return - ierror = 0 - ist = 0 - if(ityp .le. 2) ist = imid -c -c set wvhags pointers -c - lmn = nlat*(nlat+1)/2 - jw1 = 1 - jw2 = jw1+imid*lmn - jw3 = jw2+imid*lmn -c -c set work pointers -c - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - call vhags1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - + br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - + work(iw4),idz,wvhags(jw1),wvhags(jw2),wvhags(jw3)) - return - end - - subroutine vhags1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - +ndab,br,bi,cr,ci,idv,ve,vo,we,wo,work,idz,vb,wb,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),work(1), - 4 vb(imid,1),wb(imid,1),wrfft(1) - nlp1 = nlat+1 - tsn = 2./nlon - fsn = 4./nlon - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - if(ityp .gt. 2) go to 3 - do 5 k=1,nt - do 5 i=1,imm1 - do 5 j=1,nlon - ve(i,j,k) = tsn*(v(i,j,k)+v(nlp1-i,j,k)) - vo(i,j,k) = tsn*(v(i,j,k)-v(nlp1-i,j,k)) - we(i,j,k) = tsn*(w(i,j,k)+w(nlp1-i,j,k)) - wo(i,j,k) = tsn*(w(i,j,k)-w(nlp1-i,j,k)) - 5 continue - go to 2 - 3 do 8 k=1,nt - do 8 i=1,imm1 - do 8 j=1,nlon - ve(i,j,k) = fsn*v(i,j,k) - vo(i,j,k) = fsn*v(i,j,k) - we(i,j,k) = fsn*w(i,j,k) - wo(i,j,k) = fsn*w(i,j,k) - 8 continue - 2 if(mlat .eq. 0) go to 7 - do 6 k=1,nt - do 6 j=1,nlon - ve(imid,j,k) = tsn*v(imid,j,k) - we(imid,j,k) = tsn*w(imid,j,k) - 6 continue - 7 do 9 k=1,nt - call hrfftf(idv,nlon,ve(1,1,k),idv,wrfft,work) - call hrfftf(idv,nlon,we(1,1,k),idv,wrfft,work) - 9 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - if(ityp.eq.2 .or. ityp.eq.5 .or. ityp.eq.8) go to 11 - do 10 k=1,nt - do 10 mp1=1,mmax - do 10 np1=mp1,nlat - br(mp1,np1,k)=0. - bi(mp1,np1,k)=0. - 10 continue - 11 if(ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) go to 13 - do 12 k=1,nt - do 12 mp1=1,mmax - do 12 np1=mp1,nlat - cr(mp1,np1,k)=0. - ci(mp1,np1,k)=0. - 12 continue - 13 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - - -c -c case ityp=0 , no symmetries -c -c case m=0 -c - 1 do 15 k=1,nt - do 15 i=1,imid - do 15 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*ve(i,1,k) - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*we(i,1,k) - 15 continue - do 16 k=1,nt - do 16 i=1,imm1 - do 16 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*vo(i,1,k) - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*wo(i,1,k) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 20 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 17 - do 23 k=1,nt - do 23 i=1,imm1 - do 23 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*we(i,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*ve(i,2*mp1-2,k) - 23 continue - if(mlat .eq. 0) go to 17 - do 24 k=1,nt - do 24 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(imid,np1+mb)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(imid,np1+mb)*we(imid,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(imid,np1+mb)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(imid,np1+mb)*ve(imid,2*mp1-2,k) - 24 continue - 17 if(mp2 .gt. ndo2) go to 20 - do 21 k=1,nt - do 21 i=1,imm1 - do 21 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*wo(i,2*mp1-2,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*vo(i,2*mp1-2,k) - 21 continue - if(mlat .eq. 0) go to 20 - do 22 k=1,nt - do 22 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-1,k) - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-1,k) - 22 continue - 20 continue - return -c -c case ityp=1 , no symmetries but cr and ci equal zero -c -c case m=0 -c - 100 do 115 k=1,nt - do 115 i=1,imid - do 115 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*ve(i,1,k) - 115 continue - do 116 k=1,nt - do 116 i=1,imm1 - do 116 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*vo(i,1,k) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 120 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 117 - do 123 k=1,nt - do 123 i=1,imm1 - do 123 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*we(i,2*mp1-2,k) - 123 continue - if(mlat .eq. 0) go to 117 - do 124 k=1,nt - do 124 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(imid,np1+mb)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(imid,np1+mb)*we(imid,2*mp1-2,k) - 124 continue - 117 if(mp2 .gt. ndo2) go to 120 - do 121 k=1,nt - do 121 i=1,imm1 - do 121 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*wo(i,2*mp1-2,k) - 121 continue - if(mlat .eq. 0) go to 120 - do 122 k=1,nt - do 122 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-1,k) - 122 continue - 120 continue - return -c -c case ityp=2 , no symmetries but br and bi equal zero -c -c case m=0 -c - 200 do 215 k=1,nt - do 215 i=1,imid - do 215 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*we(i,1,k) - 215 continue - do 216 k=1,nt - do 216 i=1,imm1 - do 216 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*wo(i,1,k) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 220 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 217 - do 223 k=1,nt - do 223 i=1,imm1 - do 223 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*ve(i,2*mp1-2,k) - 223 continue - if(mlat .eq. 0) go to 217 - do 224 k=1,nt - do 224 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(imid,np1+mb)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(imid,np1+mb)*ve(imid,2*mp1-2,k) - 224 continue - 217 if(mp2 .gt. ndo2) go to 220 - do 221 k=1,nt - do 221 i=1,imm1 - do 221 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*vo(i,2*mp1-2,k) - 221 continue - if(mlat .eq. 0) go to 220 - do 222 k=1,nt - do 222 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-1,k) - 222 continue - 220 continue - return -c -c case ityp=3 , v even , w odd -c -c case m=0 -c - 300 do 315 k=1,nt - do 315 i=1,imid - do 315 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*ve(i,1,k) - 315 continue - do 316 k=1,nt - do 316 i=1,imm1 - do 316 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*wo(i,1,k) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 320 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 317 - do 323 k=1,nt - do 323 i=1,imm1 - do 323 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*ve(i,2*mp1-2,k) - 323 continue - if(mlat .eq. 0) go to 317 - do 324 k=1,nt - do 324 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(imid,np1+mb)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(imid,np1+mb)*ve(imid,2*mp1-2,k) - 324 continue - 317 if(mp2 .gt. ndo2) go to 320 - do 321 k=1,nt - do 321 i=1,imm1 - do 321 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*wo(i,2*mp1-2,k) - 321 continue - if(mlat .eq. 0) go to 320 - do 322 k=1,nt - do 322 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-1,k) - 322 continue - 320 continue - return -c -c case ityp=4 , v even, w odd, and cr and ci equal 0. -c -c case m=0 -c - 400 do 415 k=1,nt - do 415 i=1,imid - do 415 np1=2,ndo2,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*ve(i,1,k) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 420 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 420 - do 421 k=1,nt - do 421 i=1,imm1 - do 421 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*wo(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*ve(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*wo(i,2*mp1-2,k) - 421 continue - if(mlat .eq. 0) go to 420 - do 422 k=1,nt - do 422 np1=mp2,ndo2,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-2,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(imid,np1+mb)*ve(imid,2*mp1-1,k) - 422 continue - 420 continue - return -c -c case ityp=5 v even, w odd, and br and bi equal zero -c -c case m=0 -c - 500 do 516 k=1,nt - do 516 i=1,imm1 - do 516 np1=3,ndo1,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*wo(i,1,k) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 520 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 520 - do 523 k=1,nt - do 523 i=1,imm1 - do 523 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*ve(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*wo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*ve(i,2*mp1-2,k) - 523 continue - if(mlat .eq. 0) go to 520 - do 524 k=1,nt - do 524 np1=mp1,ndo1,2 - cr(mp1,np1,k) = cr(mp1,np1,k)+wb(imid,np1+mb)*ve(imid,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-wb(imid,np1+mb)*ve(imid,2*mp1-2,k) - 524 continue - 520 continue - return -c -c case ityp=6 , v odd , w even -c -c case m=0 -c - 600 do 615 k=1,nt - do 615 i=1,imid - do 615 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*we(i,1,k) - 615 continue - do 616 k=1,nt - do 616 i=1,imm1 - do 616 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*vo(i,1,k) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 620 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 617 - do 623 k=1,nt - do 623 i=1,imm1 - do 623 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*we(i,2*mp1-2,k) - 623 continue - if(mlat .eq. 0) go to 617 - do 624 k=1,nt - do 624 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(imid,np1+mb)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(imid,np1+mb)*we(imid,2*mp1-2,k) - 624 continue - 617 if(mp2 .gt. ndo2) go to 620 - do 621 k=1,nt - do 621 i=1,imm1 - do 621 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*vo(i,2*mp1-2,k) - 621 continue - if(mlat .eq. 0) go to 620 - do 622 k=1,nt - do 622 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-1,k) - 622 continue - 620 continue - return -c -c case ityp=7 v odd, w even, and cr and ci equal zero -c -c case m=0 -c - 700 do 716 k=1,nt - do 716 i=1,imm1 - do 716 np1=3,ndo1,2 - br(1,np1,k) = br(1,np1,k)+vb(i,np1)*vo(i,1,k) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 720 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 720 - do 723 k=1,nt - do 723 i=1,imm1 - do 723 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*we(i,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)+vb(i,np1+mb)*vo(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*we(i,2*mp1-2,k) - 723 continue - if(mlat .eq. 0) go to 720 - do 724 k=1,nt - do 724 np1=mp1,ndo1,2 - br(mp1,np1,k) = br(mp1,np1,k)+wb(imid,np1+mb)*we(imid,2*mp1-1,k) - bi(mp1,np1,k) = bi(mp1,np1,k)-wb(imid,np1+mb)*we(imid,2*mp1-2,k) - 724 continue - 720 continue - return -c -c case ityp=8 v odd, w even, and both br and bi equal zero -c -c case m=0 -c - 800 do 815 k=1,nt - do 815 i=1,imid - do 815 np1=2,ndo2,2 - cr(1,np1,k) = cr(1,np1,k)-vb(i,np1)*we(i,1,k) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) return - do 820 mp1=2,mmax - m = mp1-1 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 820 - do 821 k=1,nt - do 821 i=1,imm1 - do 821 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-2,k) - 1 +wb(i,np1+mb)*vo(i,2*mp1-1,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(i,np1+mb)*we(i,2*mp1-1,k) - 1 -wb(i,np1+mb)*vo(i,2*mp1-2,k) - 821 continue - if(mlat .eq. 0) go to 820 - do 822 k=1,nt - do 822 np1=mp2,ndo2,2 - cr(mp1,np1,k) = cr(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-2,k) - ci(mp1,np1,k) = ci(mp1,np1,k)-vb(imid,np1+mb)*we(imid,2*mp1-1,k) - 822 continue - 820 continue - return - end - subroutine vhagsi(nlat,nlon,wvhags,lvhags,dwork,ldwork,ierror) - dimension wvhags(lvhags) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lmn = (nlat*(nlat+1))/2 - if(lvhags .lt. 2*(imid*lmn)+nlon+15) return - ierror = 4 -c if (ldwork.lt.nlat*(3*nlat+9)+2) return - if (ldwork.lt.(nlat*(3*nlat+9)+2)/2) return - ierror = 0 - jw1 = 1 - jw2 = jw1+imid*lmn - jw3 = jw2+imid*lmn - iw1 = 1 - iw2 = iw1+nlat - iw3 = iw2+nlat - iw4 = iw3+3*imid*nlat -c iw2 = iw1+nlat+nlat -c iw3 = iw2+nlat+nlat -c iw4 = iw3+6*imid*nlat - call vhgai1(nlat,imid,wvhags(jw1),wvhags(jw2), - +dwork(iw1),dwork(iw2),dwork(iw3),dwork(iw4)) - call hrffti(nlon,wvhags(jw3)) - return - end - subroutine vhgai1(nlat,imid,vb,wb,dthet,dwts,dpbar,work) - dimension vb(imid,*),wb(imid,*) - double precision abel,bbel,cbel,ssqr2,dcf - double precision dpbar(imid,nlat,3), dthet(*),dwts(*),work(*) -c lwk = 4*nlat*(nlat+2) - lwk = nlat*(nlat+2) - call gaqd(nlat,dthet,dwts,dpbar,lwk,ierror) -c -c compute associated legendre functions -c -c compute m=n=0 legendre polynomials for all theta(i) -c - ssqr2 = 1./dsqrt(2.d0) - do 90 i=1,imid - dpbar(i,1,1) = ssqr2 - vb(i,1) = 0. - wb(i,1) = 0. - 90 continue -c -c main loop for remaining vb, and wb -c - do 100 n=1,nlat-1 - nm = mod(n-2,3)+1 - nz = mod(n-1,3)+1 - np = mod(n,3)+1 -c -c compute dpbar for m=0 -c - call dnlfk(0,n,work) - mn = indx(0,n,nlat) - do 105 i=1,imid - call dnlft(0,n,dthet(i),work,dpbar(i,1,np)) - 105 continue -c -c compute dpbar for m=1 -c - call dnlfk(1,n,work) - mn = indx(1,n,nlat) - do 106 i=1,imid - call dnlft(1,n,dthet(i),work,dpbar(i,2,np)) -c pbar(i,mn) = dpbar(i,2,np) - 106 continue - 104 continue -c -c compute and store dpbar for m=2,n -c - if(n.lt.2) go to 108 - do 107 m=2,n - abel = dsqrt(dble(float((2*n+1)*(m+n-2)*(m+n-3)))/ - 1 dble(float((2*n-3)*(m+n-1)*(m+n)))) - bbel = dsqrt(dble(float((2*n+1)*(n-m-1)*(n-m)))/ - 1 dble(float((2*n-3)*(m+n-1)*(m+n)))) - cbel = dsqrt(dble(float((n-m+1)*(n-m+2)))/ - 1 dble(float((m+n-1)*(m+n)))) - id = indx(m,n,nlat) - if (m.ge.n-1) go to 102 - do 103 i=1,imid - dpbar(i,m+1,np) = abel*dpbar(i,m-1,nm)+bbel*dpbar(i,m+1,nm) - 1 -cbel*dpbar(i,m-1,np) - 103 continue - go to 107 - 102 do 101 i=1,imid - dpbar(i,m+1,np) = abel*dpbar(i,m-1,nm)-cbel*dpbar(i,m-1,np) - 101 continue - 107 continue -c -c compute the derivative of the functions -c - 108 continue - ix = indx(0,n,nlat) - iy = indx(n,n,nlat) - do 125 i=1,imid - vb(i,ix) = -dpbar(i,2,np)*dwts(i) - vb(i,iy) = dpbar(i,n,np)/dsqrt(dble(float(2*(n+1))))*dwts(i) -125 continue -c - if(n.eq.1) go to 131 - dcf = dsqrt(dble(float(4*n*(n+1)))) - do 130 m=1,n-1 - ix = indx(m,n,nlat) - abel = dsqrt(dble(float((n+m)*(n-m+1))))/dcf - bbel = dsqrt(dble(float((n-m)*(n+m+1))))/dcf - do 130 i=1,imid - vb(i,ix) = (abel*dpbar(i,m,np)-bbel*dpbar(i,m+2,np))*dwts(i) -130 continue -c -c compute the vector harmonic w(theta) = m*pbar/cos(theta) -c -c set wb=0 for m=0 -c - 131 continue - ix = indx(0,n,nlat) - do 220 i=1,imid - wb(i,ix) = 0.d0 -220 continue -c -c compute wb for m=1,n -c - dcf = dsqrt(dble(float(n+n+1))/dble(float(4*n*(n+1)*(n+n-1)))) - do 230 m=1,n - ix = indx(m,n,nlat) - abel = dcf*dsqrt(dble(float((n+m)*(n+m-1)))) - bbel = dcf*dsqrt(dble(float((n-m)*(n-m-1)))) - if(m.ge.n-1) go to 231 - do 229 i=1,imid - wb(i,ix) = (abel*dpbar(i,m,nz) + bbel*dpbar(i,m+2,nz))*dwts(i) - 229 continue - go to 230 - 231 do 228 i=1,imid - wb(i,ix) = abel*dpbar(i,m,nz)*dwts(i) - 228 continue - 230 continue - 100 continue - return - end - - function indx(m,n,nlat) - integer indx - indx = m*nlat-(m*(m+1))/2+n+1 - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsec.f deleted file mode 100755 index aa2a78118..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsec.f +++ /dev/null @@ -1,1051 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhsec.f -c -c this file contains code and documentation for subroutines -c vhsec and vhseci -c -c ... files which must be loaded with vhsec.f -c -c sphcom.f, hrfft.f -c -c subroutine vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhsec,lvhsec,work,lwork,ierror) -c -c subroutine vhsec performs the vector spherical harmonic synthesis -c of the arrays br, bi, cr, and ci and stores the result in the -c arrays v and w. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given below at output parameters v,w. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of syntheses. in the program that calls vhsec, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhsec. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhsec. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c below at the discription of output parameters v and w. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhsec. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhsec. ndab must be at -c least nlat. -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized, wvhsec can be used repeatedly by vhsec -c as long as nlon and nlat remain unchanged. wvhsec must -c not be altered between calls of vhsec. -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls vhsec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhsec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) -c -c if ityp .gt. 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c in which the synthesis is stored. v is the colatitudinal -c component and w is the east longitudinal component. -c v(i,j),w(i,j) contain the components at colatitude -c theta(i) = (i-1)*pi/(nlat-1) and longitude phi(j) = -c (j-1)*2*pi/nlon. the index ranges are defined above at -c the input parameter ityp. v and w are computed from the -c formulas given below -c -c -c define -c -c 1. theta is colatitude and phi is east longitude -c -c 2. the normalized associated legendre funnctions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative -c of (x**2-1)**n with respect to x=cos(theta) -c -c 3. vbar(m,n,theta) = the derivative of pbar(m,n,theta) with -c respect to theta divided by the square -c root of n(n+1). -c -c vbar(m,n,theta) is more easily computed in the form -c -c vbar(m,n,theta) = (sqrt((n+m)*(n-m+1))*pbar(m-1,n,theta) -c -sqrt((n-m)*(n+m+1))*pbar(m+1,n,theta))/(2*sqrt(n*(n+1))) -c -c 4. wbar(m,n,theta) = m/(sin(theta))*pbar(m,n,theta) divided -c by the square root of n(n+1). -c -c wbar(m,n,theta) is more easily computed in the form -c -c wbar(m,n,theta) = sqrt((2n+1)/(2n-1))*(sqrt((n+m)*(n+m-1)) -c *pbar(m-1,n-1,theta)+sqrt((n-m)*(n-m-1))*pbar(m+1,n-1,theta)) -c /(2*sqrt(n*(n+1))) -c -c -c the colatitudnal dependence of the normalized surface vector -c spherical harmonics are defined by -c -c 5. bbar(m,n,theta) = (vbar(m,n,theta),i*wbar(m,n,theta)) -c -c 6. cbar(m,n,theta) = (i*wbar(m,n,theta),-vbar(m,n,theta)) -c -c -c the coordinate to index mappings -c -c 7. theta(i) = (i-1)*pi/(nlat-1) and phi(j) = (j-1)*2*pi/nlon -c -c -c the maximum (plus one) longitudinal wave number -c -c 8. mmax = min0(nlat,nlon/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c if we further define the output vector as -c -c 9. h(i,j) = (v(i,j),w(i,j)) -c -c and the complex coefficients -c -c 10. b(m,n) = cmplx(br(m+1,n+1),bi(m+1,n+1)) -c -c 11. c(m,n) = cmplx(cr(m+1,n+1),ci(m+1,n+1)) -c -c -c then for i=1,...,nlat and j=1,...,nlon -c -c the expansion for real h(i,j) takes the form -c -c h(i,j) = the sum from n=1 to n=nlat-1 of the real part of -c -c .5*(b(0,n)*bbar(0,n,theta(i))+c(0,n)*cbar(0,n,theta(i))) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c b(m,n)*bbar(m,n,theta(i))*exp(i*m*phi(j)) -c +c(m,n)*cbar(m,n,theta(i))*exp(i*m*phi(j)) -c -c ************************************************************* -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c v(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vbar(m,n,theta(i))-ci(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c -(bi(m+1,n+1)*vbar(m,n,theta(i))+cr(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c w(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vbar(m,n,theta(i))+bi(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c +(ci(m+1,n+1)*vbar(m,n,theta(i))-br(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsec -c = 10 error in the specification of lwork -c -c -c ******************************************************************* -c -c subroutine vhseci(nlat,nlon,wvhsec,lvhsec,dwork,ldwork,ierror) -c -c subroutine vhseci initializes the array wvhsec which can then be -c used repeatedly by subroutine vhsec until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls vhsec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vhsec. ldwork must be at least -c 2*(nlat+2) -c -c ************************************************************** -c -c output parameters -c -c wvhsec an array which is initialized for use by subroutine vhsec. -c once initialized, wvhsec can be used repeatedly by vhsec -c as long as nlat or nlon remain unchanged. wvhsec must not -c be altered between calls of vhsec. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhsec -c = 4 error in the specification of ldwork -c -c -c - subroutine vhsec(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvhsec,lvhsec,work,lwork,ierror) -c - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhsec(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 - if(ityp .le. 2 .and. - 1 lwork .lt. nlat*(2*nt*nlon+max0(6*imid,nlon))) return - if(ityp .gt. 2 .and. - 1 lwork .lt. imid*(2*nt*nlon+max0(6*nlat,nlon))) return - ierror = 0 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - iw5 = iw4+3*imid*nlat - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwzvin = lzz1+labc - jw1 = lwzvin+1 - jw2 = jw1+lwzvin - call vhsec1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),work(iw5),wvhsec,wvhsec(jw1),wvhsec(jw2)) - return - end - subroutine vhsec1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - 1 ndab,br,bi,cr,ci,idv,ve,vo,we,wo,vb,wb,wvbin,wwbin,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),wvbin(1),wwbin(1),wrfft(1), - 4 vb(imid,nlat,3),wb(imid,nlat,3) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - ve(i,j,k) = 0. - we(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - -c -c case ityp=0 no symmetries -c - 1 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - do 23 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 23 continue - if(mlat .eq. 0) go to 24 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - do 27 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 27 continue - if(mlat .eq. 0) go to 28 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c - 100 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - do 123 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 123 continue - if(mlat .eq. 0) go to 124 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - do 127 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 127 continue - if(mlat .eq. 0) go to 128 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c - 200 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - do 223 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 223 continue - if(mlat .eq. 0) go to 224 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - do 227 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 227 continue - if(mlat .eq. 0) go to 228 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v even, w odd -c - 300 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - do 323 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 323 continue - if(mlat .eq. 0) go to 324 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - do 327 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 327 continue - if(mlat .eq. 0) go to 328 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v even, w odd, and both cr and ci equal zero -c - 400 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - do 427 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 427 continue - if(mlat .eq. 0) go to 428 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v even, w odd, br and bi equal zero -c - 500 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - do 523 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 523 continue - if(mlat .eq. 0) go to 524 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v odd , w even -c - 600 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - do 623 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 623 continue - if(mlat .eq. 0) go to 624 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - do 627 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 627 continue - if(mlat .eq. 0) go to 628 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v odd, w even cr and ci equal zero -c - 700 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - do 723 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 723 continue - if(mlat .eq. 0) go to 724 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v odd, w even br and bi equal zero -c - 800 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - do 827 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 827 continue - if(mlat .eq. 0) go to 828 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,ve(1,1,k),idv,wrfft,vb) - call hrfftb(idv,nlon,we(1,1,k),idv,wrfft,vb) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - v(i,j,k) = .5*(ve(i,j,k)+vo(i,j,k)) - w(i,j,k) = .5*(we(i,j,k)+wo(i,j,k)) - v(nlp1-i,j,k) = .5*(ve(i,j,k)-vo(i,j,k)) - w(nlp1-i,j,k) = .5*(we(i,j,k)-wo(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - v(i,j,k) = .5*ve(i,j,k) - w(i,j,k) = .5*we(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - v(imid,j,k) = .5*ve(imid,j,k) - w(imid,j,k) = .5*we(imid,j,k) - 65 continue - return - end - subroutine vhseci(nlat,nlon,wvhsec,lvhsec,dwork,ldwork,ierror) - dimension wvhsec(lvhsec) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsec .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 4 - if(ldwork .lt. 2*nlat+2) return - ierror = 0 - call vbinit (nlat,nlon,wvhsec,dwork) - lwvbin = lzz1+labc - iw1 = lwvbin+1 - call wbinit (nlat,nlon,wvhsec(iw1),dwork) - iw2 = iw1+lwvbin - call hrffti(nlon,wvhsec(iw2)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhses.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhses.f deleted file mode 100755 index 356c7c25e..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhses.f +++ /dev/null @@ -1,1068 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhses.f -c -c this file contains code and documentation for subroutines -c vhses and vhsesi -c -c ... files which must be loaded with vhses.f -c -c sphcom.f, hrfft.f -c -c -c subroutine vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhses,lvhses,work,lwork,ierror) -c -c subroutine vhses performs the vector spherical harmonic synthesis -c of the arrays br, bi, cr, and ci and stores the result in the -c arrays v and w. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given below at output parameters v,w. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of syntheses. in the program that calls vhses, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhaes. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhses. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c below at the discription of output parameters v and w. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhses. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhses. ndab must be at -c least nlat. -c -c wvhses an array which must be initialized by subroutine vhsesi. -c once initialized, wvhses can be used repeatedly by vhses -c as long as nlon and nlat remain unchanged. wvhses must -c not be altered between calls of vhses. -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls vhses. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhses must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhses. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c (2*nt+1)*nlat*nlon -c -c if ityp .gt. 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c in which the synthesis is stored. v is the colatitudinal -c component and w is the east longitudinal component. -c v(i,j),w(i,j) contain the components at colatitude -c theta(i) = (i-1)*pi/(nlat-1) and longitude phi(j) = -c (j-1)*2*pi/nlon. the index ranges are defined above at -c the input parameter ityp. v and w are computed from the -c formulas given below -c -c -c define -c -c 1. theta is colatitude and phi is east longitude -c -c 2. the normalized associated legendre funnctions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative -c of (x**2-1)**n with respect to x=cos(theta) -c -c 3. vbar(m,n,theta) = the derivative of pbar(m,n,theta) with -c respect to theta divided by the square -c root of n(n+1). -c -c vbar(m,n,theta) is more easily computed in the form -c -c vbar(m,n,theta) = (sqrt((n+m)*(n-m+1))*pbar(m-1,n,theta) -c -sqrt((n-m)*(n+m+1))*pbar(m+1,n,theta))/(2*sqrt(n*(n+1))) -c -c 4. wbar(m,n,theta) = m/(sin(theta))*pbar(m,n,theta) divided -c by the square root of n(n+1). -c -c wbar(m,n,theta) is more easily computed in the form -c -c wbar(m,n,theta) = sqrt((2n+1)/(2n-1))*(sqrt((n+m)*(n+m-1)) -c *pbar(m-1,n-1,theta)+sqrt((n-m)*(n-m-1))*pbar(m+1,n-1,theta)) -c /(2*sqrt(n*(n+1))) -c -c -c the colatitudnal dependence of the normalized surface vector -c spherical harmonics are defined by -c -c 5. bbar(m,n,theta) = (vbar(m,n,theta),i*wbar(m,n,theta)) -c -c 6. cbar(m,n,theta) = (i*wbar(m,n,theta),-vbar(m,n,theta)) -c -c -c the coordinate to index mappings -c -c 7. theta(i) = (i-1)*pi/(nlat-1) and phi(j) = (j-1)*2*pi/nlon -c -c -c the maximum (plus one) longitudinal wave number -c -c 8. mmax = min0(nlat,nlon/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c if we further define the output vector as -c -c 9. h(i,j) = (v(i,j),w(i,j)) -c -c and the complex coefficients -c -c 10. b(m,n) = cmplx(br(m+1,n+1),bi(m+1,n+1)) -c -c 11. c(m,n) = cmplx(cr(m+1,n+1),ci(m+1,n+1)) -c -c -c then for i=1,...,nlat and j=1,...,nlon -c -c the expansion for real h(i,j) takes the form -c -c h(i,j) = the sum from n=1 to n=nlat-1 of the real part of -c -c .5*(b(0,n)*bbar(0,n,theta(i))+c(0,n)*cbar(0,n,theta(i))) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c b(m,n)*bbar(m,n,theta(i))*exp(i*m*phi(j)) -c +c(m,n)*cbar(m,n,theta(i))*exp(i*m*phi(j)) -c -c ************************************************************* -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c v(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vbar(m,n,theta(i))-ci(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c -(bi(m+1,n+1)*vbar(m,n,theta(i))+cr(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c w(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vbar(m,n,theta(i))+bi(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c +(ci(m+1,n+1)*vbar(m,n,theta(i))-br(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhses -c = 10 error in the specification of lwork -c -c ************************************************************ -c -c subroutine vhsesi(nlat,nlon,wvhses,lvhses,work,lwork,dwork, -c + ldwork,ierror) -c -c subroutine vhsesi initializes the array wvhses which can then be -c used repeatedly by subroutine vhses until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls vhses. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhses must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhses. lwork must be at least -c -c 3*(max0(l1-2,0)*(nlat+nlat-l1-1))/2+5*l2*nlat -c -c dwork an unsaved double precision work space -c -c ldwork the length of the array dwork as it appears in the -c program that calls vhsesi. ldwork must be at least -c 2*(nlat+1) -c -c -c ************************************************************** -c -c output parameters -c -c wvhses an array which is initialized for use by subroutine vhses. -c once initialized, wvhses can be used repeatedly by vhses -c as long as nlat or nlon remain unchanged. wvhses must not -c be altered between calls of vhses. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhses -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c -c ***************************************** - subroutine vhses(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mdab,ndab,wvhses,lvhses,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhses(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhses .lt. lzimn+lzimn+nlon+15) return - ierror = 10 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - if(lwork .lt. lnl+lnl+idv*nlon) return - ierror = 0 - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - jw1 = lzimn+1 - jw2 = jw1+lzimn - call vhses1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),idz,wvhses,wvhses(jw1),wvhses(jw2)) - return - end - - subroutine vhses1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - 1 ndab,br,bi,cr,ci,idv,ve,vo,we,wo,work,idz,vb,wb,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),work(1),wrfft(1), - 4 vb(imid,1),wb(imid,1) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - ve(i,j,k) = 0. - we(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - -c -c case ityp=0 no symmetries -c -c case m = 0 -c - 1 do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - mn = mb+np1 - do 23 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 23 continue - if(mlat .eq. 0) go to 24 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - mn = mb+np1 - do 27 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 27 continue - if(mlat .eq. 0) go to 28 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c -c case m = 0 -c - 100 continue - do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - mn = mb+np1 - do 123 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 123 continue - if(mlat .eq. 0) go to 124 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - mn = mb+np1 - do 127 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 127 continue - if(mlat .eq. 0) go to 128 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c -c case m = 0 -c - 200 do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - mn = mb+np1 - do 223 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 223 continue - if(mlat .eq. 0) go to 224 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - mn = mb+np1 - do 227 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 227 continue - if(mlat .eq. 0) go to 228 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v even, w odd -c -c case m = 0 -c - 300 do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - mn = mb+np1 - do 323 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 323 continue - if(mlat .eq. 0) go to 324 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - mn = mb+np1 - do 327 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 327 continue - if(mlat .eq. 0) go to 328 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v even, w odd, and both cr and ci equal zero -c -c case m = 0 -c - 400 do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - mn = mb+np1 - do 427 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 427 continue - if(mlat .eq. 0) go to 428 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v even, w odd, br and bi equal zero -c -c case m = 0 -c - 500 do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - mn = mb+np1 - do 523 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 523 continue - if(mlat .eq. 0) go to 524 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v odd , w even -c -c case m = 0 -c - 600 do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - mn = mb+np1 - do 623 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 623 continue - if(mlat .eq. 0) go to 624 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - mn = mb+np1 - do 627 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 627 continue - if(mlat .eq. 0) go to 628 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v odd, w even cr and ci equal zero -c -c case m = 0 -c - 700 do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - mn = mb+np1 - do 723 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 723 continue - if(mlat .eq. 0) go to 724 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v odd, w even br and bi equal zero -c -c case m = 0 -c - 800 do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - mn = mb+np1 - do 827 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 827 continue - if(mlat .eq. 0) go to 828 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,ve(1,1,k),idv,wrfft,work) - call hrfftb(idv,nlon,we(1,1,k),idv,wrfft,work) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - v(i,j,k) = .5*(ve(i,j,k)+vo(i,j,k)) - w(i,j,k) = .5*(we(i,j,k)+wo(i,j,k)) - v(nlp1-i,j,k) = .5*(ve(i,j,k)-vo(i,j,k)) - w(nlp1-i,j,k) = .5*(we(i,j,k)-wo(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - v(i,j,k) = .5*ve(i,j,k) - w(i,j,k) = .5*we(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - v(imid,j,k) = .5*ve(imid,j,k) - w(imid,j,k) = .5*we(imid,j,k) - 65 continue - return - end - - subroutine vhsesi(nlat,nlon,wvhses,lvhses,work,lwork,dwork, - + ldwork,ierror) - dimension wvhses(lvhses),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - mmax = min0(nlat,(nlon+1)/2) - imid = (nlat+1)/2 - lzimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lvhses .lt. lzimn+lzimn+nlon+15) return - ierror = 4 - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwork .lt. 5*nlat*imid+labc) return - ierror = 5 - if (ldwork .lt. 2*(nlat+1)) return - ierror = 0 - iw1 = 3*nlat*imid+1 - idz = (mmax*(nlat+nlat-mmax+1))/2 - call ves1(nlat,nlon,imid,wvhses,wvhses(lzimn+1),idz,work, - 1 work(iw1),dwork) - call hrffti(nlon,wvhses(2*lzimn+1)) - return - end - subroutine ves1(nlat,nlon,imid,vb,wb,idz,vin,wzvin,dwork) - dimension vb(imid,*),wb(imid,*),vin(imid,nlat,3),wzvin(*) - double precision dwork(*) - mmax = min0(nlat,(nlon+1)/2) - call vbinit (nlat,nlon,wzvin,dwork) - do 33 mp1=1,mmax - m = mp1-1 - call vbin (0,nlat,nlon,m,vin,i3,wzvin) - do 33 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 33 i=1,imid - vb(i,mn) = vin(i,np1,i3) - 33 continue - call wbinit (nlat,nlon,wzvin,dwork) - do 34 mp1=1,mmax - m = mp1-1 - call wbin (0,nlat,nlon,m,vin,i3,wzvin) - do 34 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 34 i=1,imid - wb(i,mn) = vin(i,np1,i3) - 34 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsgc.f deleted file mode 100755 index 52588c81d..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsgc.f +++ /dev/null @@ -1,1070 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhsgc.f -c -c this file contains code and documentation for subroutines -c vhsgc and vhsgci -c -c ... files which must be loaded with vhsgc.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c subroutine vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhsgc,lvhsgc,work,lwork,ierror) -c -c subroutine vhsgc performs the vector spherical harmonic synthesis -c of the arrays br, bi, cr, and ci and stores the result in the -c arrays v and w. v(i,j) and w(i,j) are the colatitudinal -c (measured from the north pole) and east longitudinal components -c respectively, located at the gaussian colatitude point theta(i) -c and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (v,w) is given below at output parameters v,w. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of syntheses. in the program that calls vhsgc, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhsgc. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhsgc. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c below at the discription of output parameters v and w. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhsgc. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhsgc. ndab must be at -c least nlat. -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized, wvhsgc can be used repeatedly by vhsgc -c as long as nlon and nlat remain unchanged. wvhsgc must -c not be altered between calls of vhsgc. -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls vhsgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhsgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) -c -c if ityp .gt. 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c in which the synthesis is stored. v is the colatitudinal -c component and w is the east longitudinal component. -c v(i,j),w(i,j) contain the components at the gaussian -c colatitude theta(i) and longitude phi(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c ityp. v and w are computed from the formulas given below. -c -c define -c -c 1. theta is colatitude and phi is east longitude -c -c 2. the normalized associated legendre funnctions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative -c of (x**2-1)**n with respect to x=cos(theta) -c -c 3. vbar(m,n,theta) = the derivative of pbar(m,n,theta) with -c respect to theta divided by the square -c root of n(n+1). -c -c vbar(m,n,theta) is more easily computed in the form -c -c vbar(m,n,theta) = (sqrt((n+m)*(n-m+1))*pbar(m-1,n,theta) -c -sqrt((n-m)*(n+m+1))*pbar(m+1,n,theta))/(2*sqrt(n*(n+1))) -c -c 4. wbar(m,n,theta) = m/(sin(theta))*pbar(m,n,theta) divided -c by the square root of n(n+1). -c -c wbar(m,n,theta) is more easily computed in the form -c -c wbar(m,n,theta) = sqrt((2n+1)/(2n-1))*(sqrt((n+m)*(n+m-1)) -c *pbar(m-1,n-1,theta)+sqrt((n-m)*(n-m-1))*pbar(m+1,n-1,theta)) -c /(2*sqrt(n*(n+1))) -c -c -c the colatitudnal dependence of the normalized surface vector -c spherical harmonics are defined by -c -c 5. bbar(m,n,theta) = (vbar(m,n,theta),i*wbar(m,n,theta)) -c -c 6. cbar(m,n,theta) = (i*wbar(m,n,theta),-vbar(m,n,theta)) -c -c -c the coordinate to index mappings -c -c 7. phi(j) = (j-1)*2*pi/nlon, theta(i) is the i(th) guassian -c point (see nlat as an input parameter). -c -c the maximum (plus one) longitudinal wave number -c -c 8. mmax = min0(nlat,nlon/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c if we further define the output vector as -c -c 9. h(i,j) = (v(i,j),w(i,j)) -c -c and the complex coefficients -c -c 10. b(m,n) = cmplx(br(m+1,n+1),bi(m+1,n+1)) -c -c 11. c(m,n) = cmplx(cr(m+1,n+1),ci(m+1,n+1)) -c -c -c then for i=1,...,nlat and j=1,...,nlon -c -c the expansion for real h(i,j) takes the form -c -c h(i,j) = the sum from n=1 to n=nlat-1 of the real part of -c -c .5*(b(0,n)*bbar(0,n,theta(i))+c(0,n)*cbar(0,n,theta(i))) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c b(m,n)*bbar(m,n,theta(i))*exp(i*m*phi(j)) -c +c(m,n)*cbar(m,n,theta(i))*exp(i*m*phi(j)) -c -c ************************************************************* -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c v(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vbar(m,n,theta(i))-ci(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c -(bi(m+1,n+1)*vbar(m,n,theta(i))+cr(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c w(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vbar(m,n,theta(i))+bi(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c +(ci(m+1,n+1)*vbar(m,n,theta(i))-br(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgc -c = 10 error in the specification of lwork -c -c************************************************************* -c -c subroutine vhsgci(nlat,nlon,wvhsgc,lvhsgc,dwork,ldwork,ierror) -c -c subroutine vhsgci initializes the array wvhsgc which can then be -c used repeatedly by subroutine vhsgc until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls vhsgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c work a double precision work space that does not need to be saved -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vhsgsi. ldwork must be at least -c -c 2*nlat*(nlat+1)+1 -c -c ************************************************************** -c -c output parameters -c -c wvhsgc an array which is initialized for use by subroutine vhsgc. -c once initialized, wvhsgc can be used repeatedly by vhsgc -c as long as nlat and nlon remain unchanged. wvhsgc must not -c be altered between calls of vhsgc. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhsgc -c = 4 error in the specification of ldwork -c - subroutine vhsgc(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mdab,ndab,wvhsgc,lvhsgc,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhsgc(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c -c check save work space length -c - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 - if (lvhsgc .lt. lwmin) return - - -c if(lvhsgc .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 - if(ityp .le. 2 .and. - 1 lwork .lt. nlat*(2*nt*nlon+max0(6*imid,nlon))) return - if(ityp .gt. 2 .and. - 1 lwork .lt. imid*(2*nt*nlon+max0(6*nlat,nlon))) return - ierror = 0 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - iw5 = iw4+3*imid*nlat - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwzvin = lzz1+labc - jw1 = lwzvin+1 - jw2 = jw1+lwzvin - call vhsgc1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),work(iw5),wvhsgc,wvhsgc(jw1),wvhsgc(jw2)) - return - end - subroutine vhsgc1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - 1 ndab,br,bi,cr,ci,idv,ve,vo,we,wo,vb,wb,wvbin,wwbin,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),wvbin(1),wwbin(1),wrfft(1), - 4 vb(imid,nlat,3),wb(imid,nlat,3) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - ve(i,j,k) = 0. - we(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - -c -c case ityp=0 no symmetries -c - 1 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - do 23 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 23 continue - if(mlat .eq. 0) go to 24 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - do 27 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 27 continue - if(mlat .eq. 0) go to 28 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c - 100 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - do 123 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 123 continue - if(mlat .eq. 0) go to 124 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - do 127 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 127 continue - if(mlat .eq. 0) go to 128 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c - 200 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - do 223 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 223 continue - if(mlat .eq. 0) go to 224 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - do 227 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 227 continue - if(mlat .eq. 0) go to 228 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v even, w odd -c - 300 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - do 323 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 323 continue - if(mlat .eq. 0) go to 324 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - do 327 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 327 continue - if(mlat .eq. 0) go to 328 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v even, w odd, and both cr and ci equal zero -c - 400 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - do 427 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 427 continue - if(mlat .eq. 0) go to 428 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v even, w odd, br and bi equal zero -c - 500 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - do 523 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 523 continue - if(mlat .eq. 0) go to 524 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v odd , w even -c - 600 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - do 623 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 623 continue - if(mlat .eq. 0) go to 624 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - do 627 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 627 continue - if(mlat .eq. 0) go to 628 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v odd, w even cr and ci equal zero -c - 700 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - do 723 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 723 continue - if(mlat .eq. 0) go to 724 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v odd, w even br and bi equal zero -c - 800 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - do 827 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 827 continue - if(mlat .eq. 0) go to 828 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,ve(1,1,k),idv,wrfft,vb) - call hrfftb(idv,nlon,we(1,1,k),idv,wrfft,vb) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - v(i,j,k) = .5*(ve(i,j,k)+vo(i,j,k)) - w(i,j,k) = .5*(we(i,j,k)+wo(i,j,k)) - v(nlp1-i,j,k) = .5*(ve(i,j,k)-vo(i,j,k)) - w(nlp1-i,j,k) = .5*(we(i,j,k)-wo(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - v(i,j,k) = .5*ve(i,j,k) - w(i,j,k) = .5*we(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - v(imid,j,k) = .5*ve(imid,j,k) - w(imid,j,k) = .5*we(imid,j,k) - 65 continue - return - end - subroutine vhsgci(nlat,nlon,wvhsgc,lvhsgc,dwork,ldwork,ierror) - dimension wvhsgc(lvhsgc) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lvhsgc .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 4 - if (ldwork .lt. 2*nlat*(nlat+1)+1) return - ierror = 0 -c -c compute gaussian points in first nlat+1 words of dwork -c double precision -c -c lwk = 2*nlat*(nlat+2) - jw1 = 1 - jw2 = jw1+nlat - jw3 = jw2+nlat -c jw2 = jw1+nlat+nlat -c jw3 = jw2+nlat+nlat - call gaqd(nlat,dwork(jw1),dwork(jw2),dwork(jw3),ldwork,ierror) -c iwrk = nlat+2 - iwrk = (nlat+1)/2 + 1 - call vbgint (nlat,nlon,dwork,wvhsgc,dwork(iwrk)) - lwvbin = lzz1+labc - iw1 = lwvbin+1 - call wbgint (nlat,nlon,dwork,wvhsgc(iw1),dwork(iwrk)) - iw2 = iw1+lwvbin - call hrffti(nlon,wvhsgc(iw2)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsgs.f deleted file mode 100755 index 864973d18..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vhsgs.f +++ /dev/null @@ -1,1199 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vhsgs.f -c -c this file contains code and documentation for subroutines -c vhsgs and vhsgsi -c -c ... files which must be loaded with vhsgs.f -c -c sphcom.f, hrfft.f, gaqd.f -c -c subroutine vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvhsgs,lvhsgs,work,lwork,ierror) -c -c -c subroutine vhsgs performs the vector spherical harmonic synthesis -c of the arrays br, bi, cr, and ci and stores the result in the -c arrays v and w. the synthesis is performed on an equally spaced -c longitude grid and a gaussian colatitude grid (measured from -c the north pole). v(i,j) and w(i,j) are the colatitudinal and -c east longitudinal components respectively, located at the i(th) -c colatitude gaussian point (see nlat below) and longitude -c phi(j) = (j-1)*2*pi/nlon. the spectral respresentation of (v,w) -c is given below at output parameters v,w. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 2 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. on the -c arrays v(i,j),w(i,j) for i=1,...,nlat and -c j=1,...,nlon. the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 3 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 5 v is symmetric and w is antisymmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c = 6 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the coefficients cr and ci are zero. -c -c = 8 v is antisymmetric and w is symmetric about the -c equator. the synthesis is performed on the northern -c hemisphere only. i.e., if nlat is odd the synthesis -c is performed on the arrays v(i,j),w(i,j) for -c i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the synthesis is performed on the the arrays -c v(i,j),w(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c the divergence of (v,w) is zero. i.e., -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the coefficients br and bi are zero. -c -c -c nt the number of syntheses. in the program that calls vhsgs, -c the arrays v,w,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays v,w as it appears in -c the program that calls vhags. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays v,w as it appears in -c the program that calls vhsgs. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c in the spectral representation of v(i,j) and w(i,j) given -c below at the discription of output parameters v and w. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhsgs. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vhsgs. ndab must be at -c least nlat. -c -c wvhsgs an array which must be initialized by subroutine vhsgsi. -c once initialized, wvhsgs can be used repeatedly by vhsgs -c as long as nlon and nlat remain unchanged. wvhsgs must -c not be altered between calls of vhsgs. -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls vhsgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vhsgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c (2*nt+1)*nlat*nlon -c -c if ityp .gt. 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon -c -c ************************************************************** -c -c output parameters -c -c v,w two or three dimensional arrays (see input parameter nt) -c in which the synthesis is stored. v is the colatitudinal -c component and w is the east longitudinal component. -c v(i,j),w(i,j) contain the components at the guassian colatitude -c point theta(i) and longitude phi(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c ityp. v and w are computed from the formulas given below. -c -c -c define -c -c 1. theta is colatitude and phi is east longitude -c -c 2. the normalized associated legendre funnctions -c -c pbar(m,n,theta) = sqrt((2*n+1)*factorial(n-m) -c /(2*factorial(n+m)))*sin(theta)**m/(2**n* -c factorial(n)) times the (n+m)th derivative -c of (x**2-1)**n with respect to x=cos(theta) -c -c 3. vbar(m,n,theta) = the derivative of pbar(m,n,theta) with -c respect to theta divided by the square -c root of n(n+1). -c -c vbar(m,n,theta) is more easily computed in the form -c -c vbar(m,n,theta) = (sqrt((n+m)*(n-m+1))*pbar(m-1,n,theta) -c -sqrt((n-m)*(n+m+1))*pbar(m+1,n,theta))/(2*sqrt(n*(n+1))) -c -c 4. wbar(m,n,theta) = m/(sin(theta))*pbar(m,n,theta) divided -c by the square root of n(n+1). -c -c wbar(m,n,theta) is more easily computed in the form -c -c wbar(m,n,theta) = sqrt((2n+1)/(2n-1))*(sqrt((n+m)*(n+m-1)) -c *pbar(m-1,n-1,theta)+sqrt((n-m)*(n-m-1))*pbar(m+1,n-1,theta)) -c /(2*sqrt(n*(n+1))) -c -c -c the colatitudnal dependence of the normalized surface vector -c spherical harmonics are defined by -c -c 5. bbar(m,n,theta) = (vbar(m,n,theta),i*wbar(m,n,theta)) -c -c 6. cbar(m,n,theta) = (i*wbar(m,n,theta),-vbar(m,n,theta)) -c -c -c the coordinate to index mappings -c -c 7. theta(i) = i(th) gaussian grid point and phi(j) = (j-1)*2*pi/nlon -c -c -c the maximum (plus one) longitudinal wave number -c -c 8. mmax = min0(nlat,nlon/2) if nlon is even or -c mmax = min0(nlat,(nlon+1)/2) if nlon is odd. -c -c if we further define the output vector as -c -c 9. h(i,j) = (v(i,j),w(i,j)) -c -c and the complex coefficients -c -c 10. b(m,n) = cmplx(br(m+1,n+1),bi(m+1,n+1)) -c -c 11. c(m,n) = cmplx(cr(m+1,n+1),ci(m+1,n+1)) -c -c -c then for i=1,...,nlat and j=1,...,nlon -c -c the expansion for real h(i,j) takes the form -c -c h(i,j) = the sum from n=1 to n=nlat-1 of the real part of -c -c .5*(b(0,n)*bbar(0,n,theta(i))+c(0,n)*cbar(0,n,theta(i))) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c b(m,n)*bbar(m,n,theta(i))*exp(i*m*phi(j)) -c +c(m,n)*cbar(m,n,theta(i))*exp(i*m*phi(j)) -c -c ************************************************************* -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c v(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vbar(m,n,theta(i))-ci(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c -(bi(m+1,n+1)*vbar(m,n,theta(i))+cr(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c w(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vbar(m,n,theta(i))+bi(m+1,n+1)*wbar(m,n,theta(i))) -c *cos(m*phi(j)) -c +(ci(m+1,n+1)*vbar(m,n,theta(i))-br(m+1,n+1)*wbar(m,n,theta(i))) -c *sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lvhsgs -c = 10 error in the specification of lwork -c -c -c subroutine vhsgsi(nlat,nlon,wvhsgs,lvhsgs,dwork,ldwork,ierror) -c -c subroutine vhsgsi initializes the array wvhsgs which can then be -c used repeatedly by subroutine vhsgs until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls vhsgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat -c -c dwork a double precision work array that does not need to be saved -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vhsgsi. ldwork must be at least -c -c (3*nlat*(nlat+3)+2)/2 - -c -c ************************************************************** -c -c output parameters -c -c wvhsgs an array which is initialized for use by subroutine vhsgs. -c once initialized, wvhsgs can be used repeatedly by vhsgs -c as long as nlat and nlon remain unchanged. wvhsgs must not -c be altered between calls of vhsgs. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lvhsgs -c = 4 error in the specification of lwork -c - subroutine vhsgs(nlat,nlon,ityp,nt,v,w,idvw,jdvw,br,bi,cr,ci, - + mdab,ndab,wvhsgs,lvhsgs,work,lwork,ierror) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvhsgs(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lvhsgs .lt. lzimn+lzimn+nlon+15) return - ierror = 10 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - if(lwork .lt. lnl+lnl+idv*nlon) return - ierror = 0 - ist = 0 - if(ityp .le. 2) ist = imid -c -c set wvhsgs pointers -c - lmn = nlat*(nlat+1)/2 - jw1 = 1 - jw2 = jw1+imid*lmn - jw3 = jw2+imid*lmn -c -c set work pointers -c - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - - call vhsgs1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab,ndab, - + br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - + work(iw4),idz,wvhsgs(jw1),wvhsgs(jw2),wvhsgs(jw3)) - return - end - - subroutine vhsgs1(nlat,nlon,ityp,nt,imid,idvw,jdvw,v,w,mdab, - 1 ndab,br,bi,cr,ci,idv,ve,vo,we,wo,work,idz,vb,wb,wrfft) - dimension v(idvw,jdvw,1),w(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 ve(idv,nlon,1),vo(idv,nlon,1),we(idv,nlon,1), - 3 wo(idv,nlon,1),work(1),wrfft(1), - 4 vb(imid,1),wb(imid,1) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - ve(i,j,k) = 0. - we(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(2) - goto 100 - case(3) - goto 200 - case(4) - goto 300 - case(5) - goto 400 - case(6) - goto 500 - case(7) - goto 600 - case(8) - goto 700 - case(9) - goto 800 - end select - - -c -c case ityp=0 no symmetries -c -c case m = 0 -c - 1 continue - do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - mn = mb+np1 - do 23 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 23 continue - if(mlat .eq. 0) go to 24 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - mn = mb+np1 - do 27 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 27 continue - if(mlat .eq. 0) go to 28 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c -c case m = 0 -c - 100 continue - do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - mn = mb+np1 - do 123 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 123 continue - if(mlat .eq. 0) go to 124 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - mn = mb+np1 - do 127 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 127 continue - if(mlat .eq. 0) go to 128 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c -c case m = 0 -c - 200 do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - mn = mb+np1 - do 223 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 223 continue - if(mlat .eq. 0) go to 224 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - mn = mb+np1 - do 227 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 227 continue - if(mlat .eq. 0) go to 228 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v even, w odd -c -c case m = 0 -c - 300 do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - mn = mb+np1 - do 323 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 323 continue - if(mlat .eq. 0) go to 324 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - mn = mb+np1 - do 327 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 327 continue - if(mlat .eq. 0) go to 328 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v even, w odd, and both cr and ci equal zero -c -c case m = 0 -c - 400 do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imid - ve(i,1,k)=ve(i,1,k)+br(1,np1,k)*vb(i,np1) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - mn = mb+np1 - do 427 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 427 continue - if(mlat .eq. 0) go to 428 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v even, w odd, br and bi equal zero -c -c case m = 0 -c - 500 do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imm1 - wo(i,1,k)=wo(i,1,k)-cr(1,np1,k)*vb(i,np1) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - mn = mb+np1 - do 523 i=1,imm1 - ve(i,2*mp1-2,k) = ve(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - ve(i,2*mp1-1,k) = ve(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wo(i,2*mp1-2,k) = wo(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wo(i,2*mp1-1,k) = wo(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 523 continue - if(mlat .eq. 0) go to 524 - ve(imid,2*mp1-2,k) = ve(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - ve(imid,2*mp1-1,k) = ve(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v odd , w even -c -c case m = 0 -c - 600 do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - mn = mb+np1 - do 623 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 623 continue - if(mlat .eq. 0) go to 624 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - mn = mb+np1 - do 627 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 627 continue - if(mlat .eq. 0) go to 628 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v odd, w even cr and ci equal zero -c -c case m = 0 -c - 700 do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imm1 - vo(i,1,k)=vo(i,1,k)+br(1,np1,k)*vb(i,np1) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - mn = mb+np1 - do 723 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 723 continue - if(mlat .eq. 0) go to 724 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v odd, w even br and bi equal zero -c -c case m = 0 -c - 800 do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imid - we(i,1,k)=we(i,1,k)-cr(1,np1,k)*vb(i,np1) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 -c mb = m*(nlat-1)-(m*(m-1))/2 - mb = m*nlat-(m*(m+1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - mn = mb+np1 - do 827 i=1,imm1 - vo(i,2*mp1-2,k) = vo(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vo(i,2*mp1-1,k) = vo(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - we(i,2*mp1-2,k) = we(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - we(i,2*mp1-1,k) = we(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 827 continue - if(mlat .eq. 0) go to 828 - we(imid,2*mp1-2,k) = we(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - we(imid,2*mp1-1,k) = we(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 828 continue - 829 continue - 830 continue - 950 continue - do 14 k=1,nt - call hrfftb(idv,nlon,ve(1,1,k),idv,wrfft,work) - call hrfftb(idv,nlon,we(1,1,k),idv,wrfft,work) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - v(i,j,k) = .5*(ve(i,j,k)+vo(i,j,k)) - w(i,j,k) = .5*(we(i,j,k)+wo(i,j,k)) - v(nlp1-i,j,k) = .5*(ve(i,j,k)-vo(i,j,k)) - w(nlp1-i,j,k) = .5*(we(i,j,k)-wo(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - v(i,j,k) = .5*ve(i,j,k) - w(i,j,k) = .5*we(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - v(imid,j,k) = .5*ve(imid,j,k) - w(imid,j,k) = .5*we(imid,j,k) - 65 continue - return - end - subroutine vhsgsi(nlat,nlon,wvhsgs,lvhsgs,dwork,ldwork,ierror) -c -c subroutine vhsfsi computes the gaussian points theta, gauss -c weights wts, and the components vb and wb of the vector -c harmonics. all quantities are computed internally in double -c precision but returned in single precision and are therfore -c accurate to single precision. -c -c set imid = (nlat+1)/2 and lmn=(nlat*(nlat+1))/2 then -c wvhsgs must have 2*(imid*lmn+nlat)+nlon+15 locations -c -c double precision array dwork must have -c 3*nlat*(nlat+1)+5*nlat+1 = nlat*(3*nlat+8)+1 -c locations which is determined by the size of dthet, -c dwts, dwork, and dpbar in vhsgs1 -c - dimension wvhsgs(*) - double precision dwork(*) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lmn = (nlat*(nlat+1))/2 - if(lvhsgs .lt. 2*(imid*lmn)+nlon+15) return - ierror = 4 - if (ldwork .lt. (nlat*3*(nlat+3)+2)/2) return - ierror = 0 -c -c set saved work space pointers -c - jw1 = 1 - jw2 = jw1+imid*lmn - jw3 = jw2+imid*lmn -c -c set unsaved work space pointers -c - iw1 = 1 - iw2 = iw1+nlat - iw3 = iw2+nlat - iw4 = iw3+3*imid*nlat -c iw2 = iw1+nlat+nlat -c iw3 = iw2+nlat+nlat -c iw4 = iw3+6*imid*nlat - call vhgsi1(nlat,imid,wvhsgs(jw1),wvhsgs(jw2), - +dwork(iw1),dwork(iw2),dwork(iw3),dwork(iw4)) - call hrffti(nlon,wvhsgs(jw3)) - return - end - subroutine vhgsi1(nlat,imid,vb,wb,dthet,dwts,dpbar,work) - dimension vb(imid,*),wb(imid,*) - double precision abel,bbel,cbel,ssqr2,dcf - double precision dthet(*),dwts(*),dpbar(imid,nlat,3),work(*) -c -c compute gauss points and weights -c use dpbar (length 3*nnlat*(nnlat+1)) as work space for gaqd -c - lwk = nlat*(nlat+2) - call gaqd(nlat,dthet,dwts,dpbar,lwk,ierror) -c -c compute associated legendre functions -c -c compute m=n=0 legendre polynomials for all theta(i) -c - ssqr2 = 1./dsqrt(2.d0) - do 90 i=1,imid - dpbar(i,1,1) = ssqr2 - vb(i,1) = 0. - wb(i,1) = 0. - 90 continue -c -c main loop for remaining vb, and wb -c - do 100 n=1,nlat-1 - nm = mod(n-2,3)+1 - nz = mod(n-1,3)+1 - np = mod(n,3)+1 -c -c compute dpbar for m=0 -c - call dnlfk(0,n,work) - mn = indx(0,n,nlat) - do 105 i=1,imid - call dnlft(0,n,dthet(i),work,dpbar(i,1,np)) -c pbar(i,mn) = dpbar(i,1,np) - 105 continue -c -c compute dpbar for m=1 -c - call dnlfk(1,n,work) - mn = indx(1,n,nlat) - do 106 i=1,imid - call dnlft(1,n,dthet(i),work,dpbar(i,2,np)) -c pbar(i,mn) = dpbar(i,2,np) - 106 continue - 104 continue -c -c compute and store dpbar for m=2,n -c - if(n.lt.2) go to 108 - do 107 m=2,n - abel = dsqrt(dble(float((2*n+1)*(m+n-2)*(m+n-3)))/ - 1 dble(float((2*n-3)*(m+n-1)*(m+n)))) - bbel = dsqrt(dble(float((2*n+1)*(n-m-1)*(n-m)))/ - 1 dble(float((2*n-3)*(m+n-1)*(m+n)))) - cbel = dsqrt(dble(float((n-m+1)*(n-m+2)))/ - 1 dble(float((m+n-1)*(m+n)))) - id = indx(m,n,nlat) - if (m.ge.n-1) go to 102 - do 103 i=1,imid - dpbar(i,m+1,np) = abel*dpbar(i,m-1,nm)+bbel*dpbar(i,m+1,nm) - 1 -cbel*dpbar(i,m-1,np) -c pbar(i,id) = dpbar(i,m+1,np) - 103 continue - go to 107 - 102 do 101 i=1,imid - dpbar(i,m+1,np) = abel*dpbar(i,m-1,nm)-cbel*dpbar(i,m-1,np) -c pbar(i,id) = dpbar(i,m+1,np) - 101 continue - 107 continue -c -c compute the derivative of the functions -c - 108 ix = indx(0,n,nlat) - iy = indx(n,n,nlat) - do 125 i=1,imid - vb(i,ix) = -dpbar(i,2,np) - vb(i,iy) = dpbar(i,n,np)/dsqrt(dble(float(2*(n+1)))) -125 continue -c - if(n.eq.1) go to 131 - dcf = dsqrt(dble(float(4*n*(n+1)))) - do 130 m=1,n-1 - ix = indx(m,n,nlat) - abel = dsqrt(dble(float((n+m)*(n-m+1))))/dcf - bbel = dsqrt(dble(float((n-m)*(n+m+1))))/dcf - do 130 i=1,imid - vb(i,ix) = abel*dpbar(i,m,np)-bbel*dpbar(i,m+2,np) -130 continue -c -c compute the vector harmonic w(theta) = m*pbar/cos(theta) -c -c set wb=0 for m=0 -c - 131 ix = indx(0,n,nlat) - do 220 i=1,imid - wb(i,ix) = 0.d0 -220 continue -c -c compute wb for m=1,n -c - dcf = dsqrt(dble(float(n+n+1))/dble(float(4*n*(n+1)*(n+n-1)))) - do 230 m=1,n - ix = indx(m,n,nlat) - abel = dcf*dsqrt(dble(float((n+m)*(n+m-1)))) - bbel = dcf*dsqrt(dble(float((n-m)*(n-m-1)))) - if(m.ge.n-1) go to 231 - do 229 i=1,imid - wb(i,ix) = abel*dpbar(i,m,nz) + bbel*dpbar(i,m+2,nz) - 229 continue - go to 230 - 231 do 228 i=1,imid - wb(i,ix) = abel*dpbar(i,m,nz) - 228 continue - 230 continue - 100 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/visequ.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/visequ.f deleted file mode 100755 index d6e2f75a1..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/visequ.f +++ /dev/null @@ -1,1052 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c ... file visgau.f -c -c contains documentation and code for subroutine visgau -c - subroutine visequ (nlat,nlon,h,len,eyer,eyelat,eyelon, - + wk,lwk,iwk,liwk,ierror) -c -c subroutine visequ will display a function on the sphere -c as a solid. ie. as a "lumpy" sphere. visequ calls subroutine -c vsurf to produce the visible surface rendering. -c -c requires routines visequ1 interp sptc diag stride triang vsurf -c vsurf1 prjct box icvmg projct -c -c visgeo uses the ncar graphics package. -c compile with: ncargf77 (all programs above) -c -c execute with: a.out -c -c on screen display with: ctrans -d x11 gmeta -c -c print with: ctrans -d ps.color gmeta > gmeta.ps -c lpr -p(your printer) gmeta.ps -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c -c h a two dimensional array that contains the discrete -c function to be displayed. h(i,j) is the distance from the -c center of the sphere to the surface at the colatitude -c point theta(i) = (i-1)*pi/(nlat-1) and longitude point -c phi(j) = (j-1)*2*pi/nlon. -c -c len the first dimension of the array h as it appears in the -c program that calls visequ. -c -c eyer the distance from the center of the sphere to the eye. -c -c eyelat the colatitudinal coordinate of the eye (in degrees). -c -c eyelon the longitudinal coordinate of the eye (in degrees). -c -c wk a real work array -c -c lwk the dimension of the array wk as it appears in the -c program that calls visequ. lwk must be at least -c 46*nlat*(nlon+1). -c -c iwk an integer work array -c -c liwk the dimension of the array iwk as it appears in the -c program that calls visequ. liwk must be at least -c 14*nlat*(nlon+1). -c -c ierror = 0 no error -c = 1 the eye is positioned inside the sphere -c = 2 lwk is less than 46*nlat*(nlon+1) -c = 3 liwk is less than 14*nlat*(nlon+1) -c -c - dimension h(len,*),wk(*) - integer iwk(*) - n = nlat - m = nlon+1 - mn = m*n - ierror = 2 - if(lwk .lt. 46*mn) return - ierror = 3 - if(liwk .lt. 14*mn) return - ierror = 1 - do 10 j=1,nlon - do 10 i=1,nlat - if(eyer .le. h(i,j)) return - 10 continue - ierror = 0 - pi = 4.*atan(1.) - dtr = pi/180. -c -c **** set up pointers to sub work arrays in wk and iwk -c - ntri = mn+mn - nw1 = 1 - nw2 = nw1+mn - nclat = 1 - nslat = nclat+n - nxp = 1 - nyp = nxp+mn - nx1 = 1 - ny1 = nx1+ntri - nz1 = ny1+ntri - nx2 = nz1+ntri - ny2 = nx2+ntri - nz2 = ny2+ntri - nx3 = nz2+ntri - ny3 = nx3+ntri - nz3 = ny3+ntri - nx = nz3+ntri - ny = nx+mn - nz = ny+mn - nwrk = nx - nitype = 1 - niflag = ntri+1 - nmst = niflag+mn - nmfac = nmst+n -c total iwk is 7*ntri -c total wk is 58*nlat*(nlon+1) -c **** mid-cell interpolation, calculation of polar values - call interp(h,len,m,n,wk(nw1),wk(nw2),iwk(niflag)) -c **** transform grid points to cartesian coordinates - call sptc(h,len,m,n,wk(nclat),wk(nslat),wk(nx),wk(ny),wk(nz)) -c **** transform eye position to cartesian coordinates - xeye=eyer*sin(dtr*eyelat) - yeye=xeye*sin(dtr*eyelon) - xeye=xeye*cos(dtr*eyelon) - zeye=eyer*cos(dtr*eyelat) -c **** project grid points - call projct(m,n,xeye,yeye,zeye,wk(nx),wk(ny),wk(nz),wk(nxp), - 1 wk(nyp)) -c **** check for visibility of cell boundaries - call diag(m,n,wk(nxp),wk(nyp),iwk(niflag)) -c **** compute longitude stride as a function of latitude - call stride(m,n,iwk(nmst),iwk(nmfac)) -c **** perform triangulation - call triang(m,n,wk(nx),wk(ny),wk(nz),itri,wk(nx1),wk(ny1), - 1wk(nz1),wk(nx2),wk(ny2),wk(nz2),wk(nx3),wk(ny3),wk(nz3), - 2iwk(nitype),iwk(niflag),iwk(nmst)) -c **** call surface plotting routine - call vsurf(xeye,yeye,zeye,itri,wk(nx1),wk(ny1),wk(nz1),wk(nx2), - 1wk(ny2),wk(nz2),wk(nx3),wk(ny3),wk(nz3),iwk(nitype),wk(nwrk), - 1iwk(niflag)) - return - end - subroutine interp(h,len,m,n,w1,w2,iflag) -c **** interpolates to mid points of grid cells using second -c **** order formula - dimension h(len,1),w1(n,m),w2(n+2,m+2),iflag(n,m),sten(4,4) - data sten/.015625,2*-.078125,.015625,-.078125,2*.390625, - 12*-.078125,2*.390625,-.078125,.015625,2*-.078125,.015625/ -c **** copy h to w2 - mm1 = m-1 - do 1 i=1,mm1 - do 1 j=1,n - w2(j,i+1)=h(j,i) - 1 continue -c **** add periodic points - do 2 j=1,n - w2(j,1)=w2(j,m) - w2(j,m+1)=w2(j,2) - w2(j,m+2)=w2(j,3) - 2 continue - n1=2 - n2=n-2 -c **** perform interpolation -c **** set w1 to zero - - do 7 i=1,m - do 7 j=1,n - w1(j,i)=0. - 7 continue -c **** interpolate - do 8 k=1,4 - do 8 l=1,4 - do 8 i=1,m-1 - do 8 j=n1,n2 - w1(j,i)=w1(j,i)+w2(j+l-2,i+k-1)*sten(k,l) - 8 continue -c **** set up iflag array -c **** iflag(j,i)=0 if diagonal is (j,i) to (j+1,i+1) -c **** iflag(j,i)=16 if diagonal is (j+1,i), (j,i+1) - do 9 i=1,m-1 - do 9 j=n1,n2 - iflag(j,i)=icvmg(16,0,abs(.5*(w2(j,i+1)+w2(j+1,i+2))-w1(j,i))- - 1abs(.5*(w2(j,i+2)+w2(j+1,i+1))-w1(j,i))) - 9 continue - return - end - subroutine sptc(r,len,m,n,clat,slat,x,y,z) -c **** transforms from spherical to cartesian coordinates - dimension r(len,1),clat(n),slat(n),x(n,m),y(n,m),z(n,m) - pi = 4.*atan(1.) - dt = pi/(n-1) - dp = (pi+pi)/(m-1) - do 10 j=1,n - clat(j) = cos((j-1)*dt) - slat(j) = sin((j-1)*dt) - 10 continue - do 20 i=1,m-1 - clon = cos((i-1)*dp) - slon = sin((i-1)*dp) - do 20 j=1,n - x(j,i)=r(j,i)*slat(j) - y(j,i)=x(j,i)*slon - x(j,i)=x(j,i)*clon - z(j,i)=r(j,i)*clat(j) - 20 continue - do 30 j=1,n - x(j,m)=x(j,1) - y(j,m)=y(j,1) - z(j,m)=z(j,1) - 30 continue - return - end - subroutine diag(m,n,xp,yp,iflag) -c -c **** label visibility of cell sides -c -c north side corresponds to j -c south side corresponds to j+1 -c west side corresponds to i -c east side corresponds to i+1 -c -c let iflag = b4 b3 b2 b1 b0 (in binary) then b0 through b3 are -c either o or 1 depending on whether the east, south, north -c or west side is either invisible or visible, respectively. -c -c b4 is o if the diagonal is from (i,j) to (i+1,j+1) and 1 if -c the diagonal is from (i,j+1) to (i+1,j). -c - dimension xp(n,m),yp(n,m),iflag(n,m) -c **** arithmetic statement function - cp(j1,i1,j2,i2,j3,i3)=((xp(j1,i1)-xp(j2,i2))*(yp(j3,i3)-yp(j2,i2)) - 1-(xp(j3,i3)-xp(j2,i2))*(yp(j1,i1)-yp(j2,i2))) - do 100 j=2,n-2 - do 100 i=1,m-1 - if(iflag(j,i) .ge. 16) go to 20 - if(cp(j+1,i+1,j+1,i,j,i) .le. 0) go to 10 -c west and south are visible - iflag(j,i) = iflag(j,i)+10 - 10 if(cp(j,i,j,i+1,j+1,i+1) .le. 0) go to 100 -c east and north are visible - iflag(j,i) = iflag(j,i)+5 - go to 100 - 20 if(cp(j+1,i,j,i,j,i+1) .le. 0) go to 30 -c west and north are visible - iflag(j,i) = iflag(j,i)+12 - 30 if(cp(j,i+1,j+1,i+1,j+1,i) .le. 0) go to 100 -c east and south are visible - iflag(j,i) = iflag(j,i)+3 - 100 continue -c -c classify the poles -c - do 200 i=1,m-1 - iflag(1,i) = 0 - if(cp(2,i+1,2,i,1,i) .gt. 0) iflag(1,i) = 15 - iflag(n-1,i) = 0 - if(cp(n,i,n-1,i,n-1,i+1) .gt. 0) iflag(n-1,i) = 31 - 200 continue - do 250 j=1,n-1 - iflag(j,m) = iflag(j,1) - 250 continue - return - end - subroutine stride(m,n,mst,mfac) - dimension mfac(*),mtryh(3),mst(n),icl(8) - data mtryh(1),mtryh(2),mtryh(3)/2,3,5/ - data icl(1),icl(2),icl(3),icl(4),icl(5),icl(6),icl(7),icl(8) - 1 /0,1,2,12,3,13,23,123/ -c -c find prime factors of m-1 -c - ml = m-1 - nf = 0 - j = 0 - 101 j = j+1 - if (j-3) 102,102,103 - 102 mtry = mtryh(j) - go to 104 - 103 mtry = mtry+2 - 104 mq = ml/mtry - mr = ml-mtry*mq - if (mr) 101,105,101 - 105 nf = nf+1 - mfac(nf) = mtry - ml = mq - if (ml .ne. 1) go to 104 - if(mfac(nf) .gt. 2) go to 106 - nf = nf-1 - mfac(nf) = 4 - 106 tphi = .707/float(m-1) - ns2 = n/2 - mf1 = mfac(nf) - mst(1) = (m-1)/mf1 - pi = 4.*atan(1.) - dt = pi/float(n-1) - jf = nf-1 - do 110 jdo=2,ns2 - j = jdo - theta = (j-1)*dt - st = sin(theta) - mf2 = mf1*mfac(jf) - if(abs(st/mf1-tphi) .gt. abs(st/mf2-tphi)) go to 115 - mst(j) = mst(j-1) - go to 110 - 115 mst(j) = (m-1)/mf2 - mf1 = mf2 - jf = jf-1 - if(jf .eq. 0) go to 120 - 110 continue - 120 do 125 jdo=j,ns2 - mst(jdo) = 1 - 125 continue - do 130 jdo=1,ns2 - mst(n-jdo) = mst(jdo) - 130 continue -c write (6,135) (mst(j),j=1,n) - 135 format(' colatitude strides'/(15i5)) -c - return - end - subroutine triang(m,n,x,y,z,itri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 ityp,iflag,mst) -c **** performs triangulation - dimension x(n,m),y(n,m),z(n,m),x1(1),y1(1),z1(1), - 1x2(1),y2(1),z2(1),x3(1),y3(1),z3(1),ityp(1),iflag(n,m), - 2mst(n),icl(8) - data icl(1),icl(2),icl(3),icl(4),icl(5),icl(6),icl(7),icl(8) - 1 /0,1,2,12,3,13,23,123/ - itri = 0 - n1=2 - n2=n-2 - do 100 j=n1,n2 - do 100 i=1,m-1 - if(iflag(j,i) .ge. 16) go to 50 - if(mod(iflag(j,i),16) .lt. 8) go to 70 - itri = itri+1 - x1(itri) = x(j,i) - y1(itri) = y(j,i) - z1(itri) = z(j,i) - x2(itri) = x(j+1,i) - y2(itri) = y(j+1,i) - z2(itri) = z(j+1,i) - x3(itri) = x(j+1,i+1) - y3(itri) = y(j+1,i+1) - z3(itri) = z(j+1,i+1) - ityph = 3 - if(mod(i-1,mst(j)) .eq. 0) go to 60 - if(mod(iflag(j,i-1),2) .eq. 0) go to 60 - ityph = ityph-1 - 60 if(mod(iflag(j,i),2) .eq. 0) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 70 if(mod(iflag(j,i),2) .eq. 0) go to 100 - itri = itri+1 - x1(itri) = x(j,i) - y1(itri) = y(j,i) - z1(itri) = z(j,i) - x2(itri) = x(j+1,i+1) - y2(itri) = y(j+1,i+1) - z2(itri) = z(j+1,i+1) - x3(itri) = x(j,i+1) - y3(itri) = y(j,i+1) - z3(itri) = z(j,i+1) - ityph = 0 - if(mod(iflag(j,i),16) .lt. 8) ityph = ityph+1 - if(mod(iflag(j,i+1),16) .lt. 8) ityph = ityph+2 - if(mod(iflag(j-1,i),4) .lt. 2) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - go to 100 - 50 if(mod(iflag(j,i),16) .lt. 8) go to 20 - itri = itri+1 - x1(itri) = x(j,i) - y1(itri) = y(j,i) - z1(itri) = z(j,i) - x2(itri) = x(j+1,i) - y2(itri) = y(j+1,i) - z2(itri) = z(j+1,i) - x3(itri) = x(j,i+1) - y3(itri) = y(j,i+1) - z3(itri) = z(j,i+1) - ityph = 1 - if(mod(i-1,mst(j)) .eq. 0) go to 10 - if(mod(iflag(j,i-1),2) .eq. 0) go to 10 - ityph = 0 - 10 if(mod(iflag(j,i),2) .eq. 0) ityph = ityph+2 - if(mod(iflag(j-1,i),4) .lt. 2) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 20 if(mod(iflag(j,i),2) .eq. 0) go to 100 - itri = itri+1 - x1(itri) = x(j+1,i) - y1(itri) = y(j+1,i) - z1(itri) = z(j+1,i) - x2(itri) = x(j+1,i+1) - y2(itri) = y(j+1,i+1) - z2(itri) = z(j+1,i+1) - x3(itri) = x(j,i+1) - y3(itri) = y(j,i+1) - z3(itri) = z(j,i+1) - ityph = 1 - if(mod(iflag(j,i+1),16) .lt. 8) ityph = ityph+2 - if(mod(iflag(j,i),16) .lt. 8) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 100 continue -c -c **** triangles around north and south poles -c - do 200 i=1,m-1 - if(mod(iflag(1,i),16) .lt. 8) go to 250 - itri = itri+1 - x1(itri) = x(1,i) - y1(itri) = y(1,i) - z1(itri) = z(1,i) - x2(itri) = x(2,i) - y2(itri) = y(2,i) - z2(itri) = z(2,i) - x3(itri) = x(2,i+1) - y3(itri) = y(2,i+1) - z3(itri) = z(2,i+1) - ityph = 3 - if(mod(i-1,mst(1)) .eq. 0) go to 260 - if(mod(iflag(1,i-1),2) .eq. 0) go to 260 - ityph = ityph-1 - 260 if(mod(iflag(1,i+1),16) .lt. 8) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 250 if(mod(iflag(n-1,i),16) .lt. 8) go to 200 - itri = itri+1 - x1(itri)=x(n-1,i) - y1(itri)=y(n-1,i) - z1(itri)=z(n-1,i) - x2(itri)=x(n,i) - y2(itri)=y(n,i) - z2(itri)=z(n,i) - x3(itri)=x(n-1,i+1) - y3(itri)=y(n-1,i+1) - z3(itri)=z(n-1,i+1) - ityph = 1 - if(mod(i-1,mst(n-1)) .eq. 0) go to 210 - if(mod(iflag(n-1,i-1),2) .eq. 0) go to 210 - ityph = 0 - 210 if(mod(iflag(n-1,i+1),16) .lt. 8) ityph = ityph+2 - if(mod(iflag(n-2,i),4) .lt. 2) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 200 continue - return - end - SUBROUTINE VSURF(XEYE,YEYE,ZEYE,NTRI,X1,Y1,Z1,X2,Y2,Z2, - 1 X3,Y3,Z3,ITYPE,WORK,IWORK) -c -c subroutine vsurf is like subroutine hidel except the triangles -c are categorized. vsurf is also like solid except triangles rather -c than lines are covered. -c -c written by paul n. swarztrauber, national center for atmospheric -c research, p.o. box 3000, boulder, colorado, 80307 -c -c this program plots visible lines for the surface defined -c by the input 3-d triangles with corners at (x1,y1,z1), (x2,y2,z2) -c and (x3,y3,z3). the sides of these these triangles may or -c may not be plotted depending on itype. if itype is 1 then the -c side between points (x1,y1,z1) and (x2,y2,z2) is plotted if it -c is visible. if itype is 2 then the side between (x2,y2,z2) -c and (x3,y3,z3) is plotted. if itype is 3 then the visible portion -c of the side between (x3,y3,z3) and (x1,y1,z1) is plotted. -c any combination is possible by specifying itype to be one -c of the following values: 0,1,2,3,12,13,23,123. -c -c the length of real array work must be at least 14*ntri -c -c the length of integer array iwork must be at least 6*ntri -c -c -c the vertices of the triangles are renumbered by vsurf so that -c their projections are orientated counterclockwise. the user need -c only be aware that the vertices may be renumbered by vsurf. -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri),work(14*ntri) - INTEGER IWORK(6*NTRI) -c - call vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,work,work(ntri+1),work(2*ntri+1),work(3*ntri+1), - 2 work(4*ntri+1),work(5*ntri+1),work(6*ntri+1),work(7*ntri+1), - 3 work(8*ntri+1),work(9*ntri+1),work(10*ntri+1),work(11*ntri+1), - 3 work(12*ntri+1),work(13*ntri+1),IWORK,IWORK(NTRI+1), - 4 IWORK(2*NTRI+1),IWORK(4*NTRI+1)) - return - end - subroutine vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,px1,py1,px2,py2,px3,py3,vx1,vy1,vx2,vy2,vx3,vy3,tl,tr,kh, - 2 next,istart,ifinal) -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri), - 2 px1(ntri),py1(ntri),px2(ntri),py2(ntri), - 3 px3(ntri),py3(ntri),vx1(ntri),vy1(ntri), - 4 vx2(ntri),vy2(ntri),vx3(ntri),vy3(ntri), - 5 tl(ntri),tr(ntri),next(ntri),kh(ntri), - 6 istart(2*ntri),ifinal(2*ntri),ltp(3), - 7 ird(11),ip2(11),nct(11),ncv(11),last(11) -c - real l2e - double precision le2 -c -c compute projections of 3-d points -c - le2 = .6931471805599453094172321d0 - l2e = 1.d0/le2 - fntri = ntri - irmax = .5*l2e*log(fntri) - irmax = min(irmax,10) - irmp1 = irmax+1 - do 4 icv=1,11 - ncv(icv) = 0 - 4 continue - nct(1) = 0 - ip2(1) = 1 - ird(1) = 0 - isize = 4 - do 7 irp1=2,irmp1 - ir = irp1-1 - nct(irp1) = 0 - ip2(irp1) = 2**ir - ird(irp1) = ird(ir)+isize - isize = (ip2(irp1)+1)**2 - 7 continue - isxm = ird(irmp1)+isize+1 - do 8 isx=1,isxm - istart(isx) = 0 - ifinal(isx) = 0 - 8 continue - do 6 i=1,ntri - next(i) = 0 - 6 continue - call prjct(0,xeye,yeye,zeye,x,y,z,dum1,dum2) -c write(6,127) ntri - 127 format(' ntri in hidel', i5) - do 86 k=1,ntri - call prjct(1,xeye,yeye,zeye,x1(k),y1(k),z1(k),px1(k),py1(k)) - call prjct(1,xeye,yeye,zeye,x2(k),y2(k),z2(k),px2(k),py2(k)) - call prjct(1,xeye,yeye,zeye,x3(k),y3(k),z3(k),px3(k),py3(k)) - if (k .lt. 3) then -c write(6,333) xeye,yeye,zeye,x1(k),y1(k),z1(k),px1(k),py1(k) - 333 format(' xeye, etc.',8e8.1) - endif - 86 continue -c -c orientate triangles counter clockwise -c - do 70 k=1,ntri - cprod = (px2(k)-px1(k))*(py3(k)-py1(k))-(py2(k)-py1(k)) - 1 *(px3(k)-px1(k)) -c if(cprod.eq.0.) write(6,79) k,px1(k),px2(k),px3(k), -c - py1(k),py2(k),py3(k) - 79 format(' cprod=0 at k=', i5,6e9.2) - if(cprod.ge.0.) go to 70 - px1h = px1(k) - py1h = py1(k) - px1(k) = px2(k) - py1(k) = py2(k) - px2(k) = px1h - py2(k) = py1h - x1hold = x1(k) - y1hold = y1(k) - z1hold = z1(k) - x1(k) = x2(k) - y1(k) = y2(k) - z1(k) = z2(k) - x2(k) = x1hold - y2(k) = y1hold - z2(k) = z1hold - ityp = itype(k) - if(ityp.eq.2) itype(k) = 3 - if(ityp.eq.3) itype(k) = 2 - if(ityp.eq.12) itype(k) = 13 - if(ityp.eq.13) itype(k) = 12 - 70 continue -c -c set screen limits -c - pmax = px1(1) - pmin = px1(1) - do 87 k=1,ntri - pmin = amin1(pmin,px1(k),py1(k),px2(k),py2(k),px3(k),py3(k)) - pmax = amax1(pmax,px1(k),py1(k),px2(k),py2(k),px3(k),py3(k)) - 87 continue - pmin = 1.1*pmin - pmax = 1.1*pmax - call set(0.,1.,0.,1.,pmin,pmax,pmin,pmax,1) - xmin = amin1(px1(1),px2(1),px3(1)) - xmax = amax1(px1(1),px2(1),px3(1)) - ymin = amin1(py1(1),py2(1),py3(1)) - ymax = amax1(py1(1),py2(1),py3(1)) - do 1 i=2,ntri - xmin = amin1(xmin,px1(i),px2(i),px3(i)) - xmax = amax1(xmax,px1(i),px2(i),px3(i)) - ymin = amin1(ymin,py1(i),py2(i),py3(i)) - ymax = amax1(ymax,py1(i),py2(i),py3(i)) - 1 continue - dmx = xmax-xmin - dmy = ymax-ymin - if(dmx .gt. dmy) go to 2 - c = ymin - d = ymax - xmid = .5*(xmin+xmax) - hdy = .5*dmy - a = xmid-hdy - b = xmid+hdy - go to 3 - 2 a = xmin - b = xmax - ymid = .5*(ymin+ymax) - hdx = .5*dmx - c = ymid-hdx - d = ymid+hdx - 3 hgr = b-a -c -c categorize triangles -c - do 100 i=1,ntri - xmin = amin1(px1(i),px2(i),px3(i)) - xmax = amax1(px1(i),px2(i),px3(i)) - ymin = amin1(py1(i),py2(i),py3(i)) - ymax = amax1(py1(i),py2(i),py3(i)) - dxt = amax1(xmax-xmin,ymax-ymin) - if(dxt .gt. 0.) go to 10 - ir = irmax - go to 20 - 10 ir = l2e*log(hgr/dxt) - ir = min(ir,irmax) - 20 irp1 = ir+1 - nct(irp1) = nct(irp1)+1 - hr = hgr/ip2(irp1) - xmid = .5*(xmin+xmax) - id = (xmid-a)/hr+1.5 - ymid = .5*(ymin+ymax) - jd = (ymid-c)/hr+1.5 - ijd = ip2(irp1)+1 - isx = id+(jd-1)*ijd+ird(irp1) - ifx = ifinal(isx) - if(ifx .gt. 0) go to 50 - istart(isx) = i - go to 60 - 50 next(ifx) = i - 60 ifinal(isx) = i - 100 continue -c write(6,106) tcat,(irp1,nct(irp1),irp1=1,irmp1) - 106 format(' time to categorize ', e15.6/(' ir+1',i3,' ntri',i7)) -c -c sort triangles into boxes -c - l = 0 - do 30 irp1=1,irmp1 - if(nct(irp1) .eq. 0) go to 30 - ist = ird(irp1)+1 - isd = ip2(irp1)+1 - call box(isd,istart(ist),next,l,ifinal) - last(irp1) = l+1 - 30 continue - do 35 irp1=1,irmp1 - il = ird(irp1)+(ip2(irp1)+1)**2+1 - if(istart(il) .eq. 0) istart(il) = last(irp1) - 35 continue -c write(6,31) tsort,l,ntri - 31 format(' time to sort ', e15.6,' l', i8,' ntri',i8) - do 90 k=1,ntri - vx1(k) = px2(k)-px1(k) - vy1(k) = py2(k)-py1(k) - vx2(k) = px3(k)-px2(k) - vy2(k) = py3(k)-py2(k) - vx3(k) = px1(k)-px3(k) - vy3(k) = py1(k)-py3(k) - 90 continue - tl1 = 0. - tl2 = 0. - maxs = 0 - do 500 ir2=1,irmp1 - if(nct(ir2) .eq. 0) go to 500 - ist = ird(ir2) - isd = ip2(ir2)+1 - do 490 j2=1,isd - do 480 i2=1,isd - ist = ist+1 - ls = istart(ist) - lf = istart(ist+1)-1 - if(lf .lt. ls) go to 480 -c -c define coverings -c - kcv = 0 - i2m = i2-1 - j2m = j2-1 - do 300 ir1=1,irmp1 - if(nct(ir1) .eq. 0) go to 300 - if(ir1 .ge. ir2) go to 260 - irdp = 2**(ir2-ir1) - i1s = (i2m-1)/irdp - i1f = (i2m+1)/irdp - if = i2m+1-i1f*irdp - if(if .gt. 0) i1f = i1f+1 - j1s = (j2m-1)/irdp - j1f = (j2m+1)/irdp - jf = j2m+1-j1f*irdp - if(jf .gt. 0) j1f = j1f+1 - go to 270 - 260 irdp = 2**(ir1-ir2) - i1s = irdp*(i2m-1) - i1f = irdp*(i2m+1) - j1s = irdp*(j2m-1) - j1f = irdp*(j2m+1) - 270 ijd = ip2(ir1)+1 - i1s = max(i1s+1,1) - i1f = min(i1f+1,ijd) - j1s = max(j1s+1,1) - j1f = min(j1f+1,ijd) - ixh = (j1s-2)*ijd+ird(ir1) - ixs = i1s+ixh - ixf = i1f+ixh - do 290 j1=j1s,j1f - ixs = ixs+ijd - kds = istart(ixs) - ixf = ixf+ijd - kdf = istart(ixf+1)-1 - if(kdf .lt. kds) go to 290 - do 280 kd=kds,kdf - kcv = kcv+1 - kh(kcv) = ifinal(kd) - 280 continue - 290 continue - 300 continue - do 310 icv=1,10 - if(kcv .le. ncv(icv)) go to 310 - ncv(icv) = kcv - go to 320 - 310 continue -c -c - 320 do 470 ldo=ls,lf - l = ifinal(ldo) - ith = itype(l) - if(ith .eq. 0) go to 470 - ltp(1) = 0 - ltp(2) = 0 - ltp(3) = 0 - id1 = ith/100 - ith = ith-100*id1 - id2 = ith/10 - id3 = ith-10*id2 - if(id1 .ne. 0) ltp(id1) = 1 - if(id2 .ne. 0) ltp(id2) = 1 - if(id3 .ne. 0) ltp(id3) = 1 -c if((ith.eq.123) .or. (ith.eq.12) .or.(ith.eq.13)) ltp(1) = 1 -c if((ith.eq.123) .or. (ith.eq.23) .or.(ith.eq.12)) ltp(2) = 1 -c if((ith.eq.123) .or. (ith.eq.13) .or.(ith.eq.23)) ltp(3) = 1 - do 460 ns=1,3 -c go to (101,102,103),ns - - select case(ns) - case(1) - goto 101 - case(2) - goto 102 - case(3) - goto 103 - end select - - - 101 if(ltp(ns) .eq. 0) go to 460 - px4 = px1(l) - py4 = py1(l) - px5 = px2(l) - py5 = py2(l) - x4 = x1(l) - y4 = y1(l) - z4 = z1(l) - x5 = x2(l) - y5 = y2(l) - z5 = z2(l) - go to 105 - 102 if(ltp(ns) .eq. 0) go to 460 - px4 = px2(l) - py4 = py2(l) - px5 = px3(l) - py5 = py3(l) - x4 = x2(l) - y4 = y2(l) - z4 = z2(l) - x5 = x3(l) - y5 = y3(l) - z5 = z3(l) - go to 105 - 103 if(ltp(ns) .eq. 0) go to 460 - px4 = px1(l) - py4 = py1(l) - px5 = px3(l) - py5 = py3(l) - x4 = x1(l) - y4 = y1(l) - z4 = z1(l) - x5 = x3(l) - y5 = y3(l) - z5 = z3(l) - 105 x54 = px5-px4 - y54 = py5-py4 - nseg = 0 - do 440 kd=1,kcv - k = kh(kd) - c17 = vx1(k)*y54-vy1(k)*x54 - c27 = vx2(k)*y54-vy2(k)*x54 - c37 = vx3(k)*y54-vy3(k)*x54 - c14 = vy1(k)*(px4-px1(k))-vx1(k)*(py4-py1(k)) - c25 = vy2(k)*(px4-px2(k))-vx2(k)*(py4-py2(k)) - c36 = vy3(k)*(px4-px3(k))-vx3(k)*(py4-py3(k)) - tmin = 0. - tmax = 1. - if(c17) 151,152,153 - 151 tmax = amin1(c14/c17,tmax) - go to 154 - 152 if(c14) 154,440,440 - 153 tmin = amax1(c14/c17,tmin) - 154 if(c27) 155,156,157 - 155 tmax = amin1(c25/c27,tmax) - go to 158 - 156 if(c25) 158,440,440 - 157 tmin = amax1(c25/c27,tmin) - 158 if(c37) 159,160,161 - 159 tmax = amin1(c36/c37,tmax) - go to 162 - 160 if(c36) 162,440,440 - 161 tmin = amax1(c36/c37,tmin) - 162 if(tmax-tmin .lt. .00001) go to 440 - xpl = x4+tmin*(x5-x4) - ypl = y4+tmin*(y5-y4) - zpl = z4+tmin*(z5-z4) - xpr = x4+tmax*(x5-x4) - ypr = y4+tmax*(y5-y4) - zpr = z4+tmax*(z5-z4) -c -c the projections of line and plane intersect -c now determine if plane covers line -c - vx1t = x2(k)-x1(k) - vy1t = y2(k)-y1(k) - vz1t = z2(k)-z1(k) - vx2t = x3(k)-x1(k) - vy2t = y3(k)-y1(k) - vz2t = z3(k)-z1(k) - apl = vy1t*vz2t-vy2t*vz1t - bpl = vx2t*vz1t-vx1t*vz2t - cpl = vx1t*vy2t-vx2t*vy1t - dpl = apl*x1(k)+bpl*y1(k)+cpl*z1(k) - vx3t = xpl-xeye - vy3t = ypl-yeye - vz3t = zpl-zeye - den = apl*vx3t+bpl*vy3t+cpl*vz3t - til = 0. - if(den .eq. 0.) go to 410 - til = (dpl-apl*xeye-bpl*yeye-cpl*zeye)/den - 410 vx3t = xpr-xeye - vy3t = ypr-yeye - vz3t = zpr-zeye - den = apl*vx3t+bpl*vy3t+cpl*vz3t - tir = 0. - if(den .eq. 0.) go to 412 - tir = (dpl-apl*xeye-bpl*yeye-cpl*zeye)/den - 412 if(til.ge..99999.and.tir.ge..99999) go to 440 - if(til.lt.1..and.tir.lt.1.) go to 164 - vx3t = xpr-xpl - vy3t = ypr-ypl - vz3t = zpr-zpl - den = apl*vx3t+bpl*vy3t+cpl*vz3t - tim = 0. - if(den .eq. 0.) go to 414 - tim = (dpl-apl*xpl-bpl*ypl-cpl*zpl)/den - 414 thold = tmin+tim*(tmax-tmin) - if(til.ge.1.) go to 163 - tmax = thold - go to 164 - 163 tmin = thold - 164 nseg = nseg+1 - tl(nseg) = tmin - tr(nseg) = tmax - 440 continue - maxs = max0(maxs,nseg) - if(nseg-1)171,180,172 - 171 call line(px4,py4,px5,py5) - go to 460 -c -c order the segments according to left end point tl(k) -c - 172 do 173 k=2,nseg - do 173 i=k,nseg - if(tl(k-1).le.tl(i)) go to 173 - tlh = tl(k-1) - trh = tr(k-1) - tl(k-1) = tl(i) - tr(k-1) = tr(i) - tl(i) = tlh - tr(i) = trh - 173 continue -c -c eliminate segment overlap -c - k1 = 1 - k2 = 1 - 174 k2 = k2+1 - if(k2.gt.nseg) go to 176 - if(tr(k1).lt.tl(k2)) go to 175 - tr(k1) = amax1(tr(k1),tr(k2)) - go to 174 - 175 k1 = k1+1 - tl(k1) = tl(k2) - tr(k1) = tr(k2) - go to 174 - 176 nseg = k1 -c -c plot all segments of the line -c - 180 do 181 ks =1,nseg - kb = nseg-ks+1 - tl(kb+1) = tr(kb) - tr(kb) = tl(kb) - 181 continue - tl(1) = 0. - tr(nseg+1) = 1. - nsegp = nseg+1 - do 450 k=1,nsegp - if(abs(tr(k)-tl(k)).lt..000001) go to 450 - xa = px4+tl(k)*(px5-px4) - ya = py4+tl(k)*(py5-py4) - xb = px4+tr(k)*(px5-px4) - yb = py4+tr(k)*(py5-py4) - call line(xa,ya,xb,yb) - 450 continue - 460 continue - 470 continue - 480 continue - 490 continue - 500 continue -c write(6,903) tl1,tl2 - 903 format(' time to cover', e15.6/ - 1 ' time to test ', e15.6) -c write(6,904) maxs - 904 format(' maximum number of segments', i5) -c write(6,250) (ncv(icv),icv=1,10) - 250 format(' the ten largest coverings'/(10i5)) - call frame - end - subroutine prjct(init,xeye,yeye,zeye,x,y,z,px,py) -c -c subroutine prjct projects the point x,y,z onto a plane through -c the origin that is perpendicular to a line between the origin -c and the eye. the projection is along the line between the eye -c and the point x,y,z. px and py are the coordinates of the -c projection in the plane. -c (version 2 , 12-10-82) -c - save - if(init.ne.0) go to 1 - rads1 = xeye**2+yeye**2 - rads2 = rads1+zeye**2 - d1 = sqrt(rads1) - d2 = sqrt(rads2) - cx1 = -yeye/d1 - cy1 = xeye/d1 - cx2 = -xeye*zeye/(d1*d2) - cy2 = -yeye*zeye/(d1*d2) - cz2 = d1/d2 - cx3 = xeye/d2 - cy3 = yeye/d2 - cz3 = zeye/d2 - return - 1 x1 = cx1*x+cy1*y - y1 = cx2*x+cy2*y+cz2*z - z1 = cx3*x+cy3*y+cz3*z - ratio = d2/(d2-z1) - px = ratio*x1 - py = ratio*y1 - return - end - subroutine box(isd,istart,next,l,list) - dimension istart(isd,isd),next(1),list(1) - do 30 jd=1,isd - do 10 id=1,isd - idx = istart(id,jd) - istart(id,jd) = l+1 - if(idx .eq. 0) go to 10 - 20 l = l+1 - list(l) = idx - if(next(idx) .eq. 0) go to 10 - idx = next(idx) - go to 20 - 10 continue - 30 continue - return - end - integer function icvmg(i1,i2,r) - integer i1,i2 - real r -c -c returns i1 if i3.ge.0 and returns i2 if i3.lt.0 . -c - icvmg = i1 - if (r .lt. 0.) icvmg = i2 - return - end - subroutine projct(m,n,xeye,yeye,zeye,x,y,z,px,py) -c **** projects point (x,y,z) onto plane thru origin and perp -c **** to line joining origin and eye - dimension x(n,m),y(n,m),z(n,m),px(n,m),py(n,m) - call prjct(0,xeye,yeye,zeye,rdum1,rdum2,rdum3,rdum4,rdum5) - do 100 i=1,m - do 100 j=1,n - call prjct(1,xeye,yeye,zeye,x(j,i),y(j,i),z(j,i),px(j,i),py(j,i)) - 100 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/visgau.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/visgau.f deleted file mode 100755 index 270f0cfea..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/visgau.f +++ /dev/null @@ -1,1067 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c ... file visgau.f -c -c contains documentation and code for subroutine visgau -c - SUBROUTINE VISGAU (NLAT,NLON,H,LEN,EYER,EYELAT,EYELON, - 1 THETA,WK,LWK,IWK,LIWK,IERROR) -c -c subroutine visgau produces a three dimensional visible rendering -c of the function h(i,j) which is tabulated on a gauss distributed -c colatitude grid. -c -c requires setgau alfk lfpt gaqd drst dintql dpytha -c visgau embed intrpg sptcg diag stride -c trigau vsurf vsurf1 prjct box icvmg projct -c -c tvisgau uses the ncar graphics package. -c compile with: ncargf77 (all programs above) -c -c execute with: a.out -c -c on screen display with: ctrans -d x11 gmeta -c -c print with: ctrans -d ps.color gmeta > gmeta.ps -c lpr -p(your printer) gmeta.ps -c -c input parameters -c -c nlat the number of gauss colatitudes. -c if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than or equal to 4. the efficiency of the computation is -c improved when nlon is a product of small prime numbers. -c -c -c h a two dimensional array that contains the discrete -c function to be displayed. h(i,j) is the distance from the -c center of the sphere to the surface at gauss colatitude -c point theta(i) and longitude point -c phi(j) = (j-1)*2*pi/nlon. -c -c len the first dimension of the array h as it appears in the -c program that calls sphere. -c -c eyer the distance from the center of the sphere to the eye. -c -c eyelat the colatitudinal coordinate of the eye (in degrees). -c -c eyelon the longitudinal coordinate of the eye (in degrees). -c -c theta a double precision array with nlat gauss colatitudes -c computed by subroutine gaqd -c -c wk a real work array -c -c lwk the dimension of the array wk as it appears in the -c program that calls visgau. lwk must be at least -c 46*(nlat+2)*(nlon+1). -c -c iwk an integer work array -c -c liwk the dimension of the array iwk as it appears in the -c program that calls visgau. liwk must be at least -c 14*(nlat+2)*(nlon+1). -c -c ierror = 0 no error -c = 1 the eye is positioned inside the sphere -c = 2 lwk is less than 46*(nlat+2)*(nlon+1) -c = 3 liwk is less than 14*(nlat+2)*(nlon+1) -c -c - dimension h(len,nlon),wk(*) - INTEGER IWK(*) - double precision theta(nlat) - n = nlat+2 - m = nlon+1 - mn = m*n - ierror = 2 - if(lwk .lt. 46*mn) return - ierror = 3 - if(liwk .lt. 14*mn) return - ierror = 1 - do 10 j=1,nlon - do 10 i=1,nlat - if(eyer .le. h(i,j)) return - 10 continue - ierror = 0 -c **** set up pointers to sub work arrays in wk - ntri = mn+mn - nw1 = 1 - nw2 = nw1+mn - nclat = 1 - nslat = nclat+n - nxp = 1 - nyp = nxp+mn - nx1 = 1 - ny1 = nx1+ntri - nz1 = ny1+ntri - nx2 = nz1+ntri - ny2 = nx2+ntri - nz2 = ny2+ntri - nx3 = nz2+ntri - ny3 = nx3+ntri - nz3 = ny3+ntri - nx = nz3+ntri - ny = nx+mn - nz = ny+mn - nwrk = nx - nitype = 1 - niflag = ntri+1 - nmst = niflag+mn - nmfac = nmst+n -c **** embed h in a larger array - call embed(nlat,nlon,h,len,wk(nz1)) -c **** mid-cell interpolation - call intrpg(wk(nz1),m,n,wk(nw1),wk(nw2),iwk(niflag)) -c **** transform grid points to cartesian coordinates - call sptcg(wk(nz1),m,n,theta,wk(nclat),wk(nslat),wk(nx),wk(ny), - 1 wk(nz)) -c **** transform eye position to cartesian coordinates - pi = 4.*atan(1.) - dtr = pi/180. - xeye=eyer*sin(dtr*eyelat) - yeye=xeye*sin(dtr*eyelon) - xeye=xeye*cos(dtr*eyelon) - zeye=eyer*cos(dtr*eyelat) -c **** project grid points - call projct(m,n,xeye,yeye,zeye,wk(nx),wk(ny),wk(nz),wk(nxp), - 1 wk(nyp)) -c **** check for visibility of cell boundaries - call diag(m,n,wk(nxp),wk(nyp),iwk(niflag)) -c **** compute longitude stride as a function of latitude - call stride(m,n,iwk(nmst),iwk(nmfac)) -c **** perform triangulation - call trigau(m,n,wk(nx),wk(ny),wk(nz),itri,wk(nx1),wk(ny1), - 1wk(nz1),wk(nx2),wk(ny2),wk(nz2),wk(nx3),wk(ny3),wk(nz3), - 2iwk(nitype),iwk(niflag),iwk(nmst)) -c **** call surface plotting routine - call vsurf(xeye,yeye,zeye,itri,wk(nx1),wk(ny1),wk(nz1),wk(nx2), - 1wk(ny2),wk(nz2),wk(nx3),wk(ny3),wk(nz3),iwk(nitype),wk(nwrk), - 1iwk(niflag)) - return - end - subroutine embed(nlat,nlon,h,len,hg) - dimension h(len,nlon),hg(nlat+2,nlon+1) - do 10 i=1,nlat - do 10 j=1,nlon - hg(i+1,j) = h(i,j) - 10 continue - sumn = 0. - sums = 0. - do 15 j=1,nlon - sumn = sumn+h(1,j) - sums = sums+h(nlat,j) - 15 continue - sumn = sumn/nlon - sums = sums/nlon - do 20 j=1,nlon - hg(1,j) = sumn - hg(nlat+2,j) = sums - 20 continue - do 25 i=1,nlat+2 - hg(i,nlon+1) = hg(i,1) - 25 continue - return - end - subroutine intrpg(h,m,n,w1,w2,iflag) -c **** interpolates to mid points of grid cells using second -c **** order formula - dimension h(n,m),w1(n,m),w2(n,m+2),iflag(n,m),sten(4,4) - data sten/.015625,2*-.078125,.015625,-.078125,2*.390625, - 12*-.078125,2*.390625,-.078125,.015625,2*-.078125,.015625/ -c **** copy h to w2 - mm1 = m-1 - do 1 i=1,mm1 - do 1 j=1,n - w2(j,i+1)=h(j,i) - 1 continue -c **** add periodic points - do 2 j=1,n - w2(j,1)=w2(j,m) - w2(j,m+1)=w2(j,2) - w2(j,m+2)=w2(j,3) - 2 continue -c **** perform interpolation -c **** set w1 to zero - do 7 i=1,m - do 7 j=1,n - w1(j,i)=0. - 7 continue -c **** interpolate - do 8 k=1,4 - do 8 l=1,4 - do 8 i=1,m-1 - do 8 j=2,n-2 - w1(j,i)=w1(j,i)+w2(j+l-2,i+k-1)*sten(k,l) - 8 continue -c **** set up iflag array -c **** iflag(j,i)=0 if diagonal is (j,i) to (j+1,i+1) -c **** iflag(j,i)=16 if diagonal is (j+1,i), (j,i+1) - do 9 i=1,m-1 - do 9 j=2,n-2 - iflag(j,i)=icvmg(16,0,abs(.5*(w2(j,i+1)+w2(j+1,i+2))-w1(j,i))- - 1abs(.5*(w2(j,i+2)+w2(j+1,i+1))-w1(j,i))) - 9 continue - return - end - subroutine sptcg(r,m,n,theta,clat,slat,x,y,z) -c **** transforms from spherical to cartesian coordinates - dimension r(n,m),clat(n),slat(n),x(n,m),y(n,m),z(n,m) - double precision theta(*) - pi = 4.*atan(1.) - dp = (pi+pi)/(m-1) - clat(1) = 1. - slat(1) = 0. - do 10 j=2,n-1 - thet = theta(j-1) - clat(j) = cos(thet) - slat(j) = sin(thet) - 10 continue - clat(n) = -1. - slat(n) = 0. - do 20 i=1,m-1 - clon = cos((i-1)*dp) - slon = sin((i-1)*dp) - do 20 j=1,n - x(j,i)=r(j,i)*slat(j) - y(j,i)=x(j,i)*slon - x(j,i)=x(j,i)*clon - z(j,i)=r(j,i)*clat(j) - 20 continue - do 30 j=1,n - x(j,m)=x(j,1) - y(j,m)=y(j,1) - z(j,m)=z(j,1) - 30 continue - return - end - subroutine diag(m,n,xp,yp,iflag) -c -c **** label visibility of cell sides -c -c north side corresponds to j -c south side corresponds to j+1 -c west side corresponds to i -c east side corresponds to i+1 -c -c let iflag = b4 b3 b2 b1 b0 (in binary) then b0 through b3 are -c either o or 1 depeending on whether the east, south, north -c or west side is either invisible or visible, respectively. -c -c b4 is o if the diagonal is from (i,j) to (i+1,j+1) and 1 if -c the diagonal is from (i,j+1) to (i+1,j). -c - dimension xp(n,m),yp(n,m),iflag(n,m) -c **** arithmetic statement function - cp(j1,i1,j2,i2,j3,i3)=((xp(j1,i1)-xp(j2,i2))*(yp(j3,i3)-yp(j2,i2)) - 1-(xp(j3,i3)-xp(j2,i2))*(yp(j1,i1)-yp(j2,i2))) - do 100 j=2,n-2 - do 100 i=1,m-1 - if(iflag(j,i) .ge. 16) go to 20 - if(cp(j+1,i+1,j+1,i,j,i) .le. 0) go to 10 -c west and south are visible - iflag(j,i) = iflag(j,i)+10 - 10 if(cp(j,i,j,i+1,j+1,i+1) .le. 0) go to 100 -c east and north are visible - iflag(j,i) = iflag(j,i)+5 - go to 100 - 20 if(cp(j+1,i,j,i,j,i+1) .le. 0) go to 30 -c west and north are visible - iflag(j,i) = iflag(j,i)+12 - 30 if(cp(j,i+1,j+1,i+1,j+1,i) .le. 0) go to 100 -c east and south are visible - iflag(j,i) = iflag(j,i)+3 - 100 continue -c -c classify the poles -c - do 200 i=1,m-1 - iflag(1,i) = 0 - if(cp(2,i+1,2,i,1,i) .gt. 0) iflag(1,i) = 15 - iflag(n-1,i) = 0 - if(cp(n,i,n-1,i,n-1,i+1) .gt. 0) iflag(n-1,i) = 31 - 200 continue - do 250 j=1,n-1 - iflag(j,m) = iflag(j,1) - 250 continue - return - end - subroutine stride(m,n,mst,mfac) - dimension mfac(*),mtryh(3),mst(n),icl(8) - data mtryh(1),mtryh(2),mtryh(3)/2,3,5/ - data icl(1),icl(2),icl(3),icl(4),icl(5),icl(6),icl(7),icl(8) - 1 /0,1,2,12,3,13,23,123/ -c -c find prime factors of m-1 -c - ml = m-1 - nf = 0 - j = 0 - 101 j = j+1 - if (j-3) 102,102,103 - 102 mtry = mtryh(j) - go to 104 - 103 mtry = mtry+2 - 104 mq = ml/mtry - mr = ml-mtry*mq - if (mr) 101,105,101 - 105 nf = nf+1 - mfac(nf) = mtry - ml = mq - if (ml .ne. 1) go to 104 - if(mfac(nf) .gt. 2) go to 106 - nf = nf-1 - mfac(nf) = 4 - 106 tphi = .707/float(m-1) - ns2 = n/2 - mf1 = mfac(nf) - mst(1) = (m-1)/mf1 - pi = 4.*atan(1.) - dt = pi/float(n-1) - jf = nf-1 - do 110 jdo=2,ns2 - j = jdo - theta = (j-1)*dt - st = sin(theta) - mf2 = mf1*mfac(jf) - if(abs(st/mf1-tphi) .gt. abs(st/mf2-tphi)) go to 115 - mst(j) = mst(j-1) - go to 110 - 115 mst(j) = (m-1)/mf2 - mf1 = mf2 - jf = jf-1 - if(jf .eq. 0) go to 120 - 110 continue - 120 do 125 jdo=j,ns2 - mst(jdo) = 1 - 125 continue - do 130 jdo=1,ns2 - mst(n-jdo) = mst(jdo) - 130 continue -c write (6,135) (mst(j),j=1,n) - 135 format(' colatitude strides'/(15i5)) -c - return - end - subroutine trigau(m,n,x,y,z,itri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 ityp,iflag,mst) -c **** performs triangulation - dimension x(n,m),y(n,m),z(n,m),x1(1),y1(1),z1(1), - 1x2(1),y2(1),z2(1),x3(1),y3(1),z3(1),ityp(1),iflag(n,m), - 2mst(n),icl(8) - data icl(1),icl(2),icl(3),icl(4),icl(5),icl(6),icl(7),icl(8) - 1 /0,1,2,12,3,13,23,123/ - itri = 0 - n1=2 - n2=n-2 - do 100 j=n1,n2 - do 100 i=1,m-1 - if(iflag(j,i) .ge. 16) go to 50 - if(mod(iflag(j,i),16) .lt. 8) go to 70 - itri = itri+1 - x1(itri) = x(j,i) - y1(itri) = y(j,i) - z1(itri) = z(j,i) - x2(itri) = x(j+1,i) - y2(itri) = y(j+1,i) - z2(itri) = z(j+1,i) - x3(itri) = x(j+1,i+1) - y3(itri) = y(j+1,i+1) - z3(itri) = z(j+1,i+1) - ityph = 3 - if(mod(i-1,mst(j)) .eq. 0) go to 60 - if(mod(iflag(j,i-1),2) .eq. 0) go to 60 - ityph = ityph-1 - 60 if(mod(iflag(j,i),2) .eq. 0) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 70 if(mod(iflag(j,i),2) .eq. 0) go to 100 - itri = itri+1 - x1(itri) = x(j,i) - y1(itri) = y(j,i) - z1(itri) = z(j,i) - x2(itri) = x(j+1,i+1) - y2(itri) = y(j+1,i+1) - z2(itri) = z(j+1,i+1) - x3(itri) = x(j,i+1) - y3(itri) = y(j,i+1) - z3(itri) = z(j,i+1) - ityph = 0 - if(mod(iflag(j,i),16) .lt. 8) ityph = ityph+1 - if(mod(iflag(j,i+1),16) .lt. 8) ityph = ityph+2 - if(mod(iflag(j-1,i),4) .lt. 2) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - go to 100 - 50 if(mod(iflag(j,i),16) .lt. 8) go to 20 - itri = itri+1 - x1(itri) = x(j,i) - y1(itri) = y(j,i) - z1(itri) = z(j,i) - x2(itri) = x(j+1,i) - y2(itri) = y(j+1,i) - z2(itri) = z(j+1,i) - x3(itri) = x(j,i+1) - y3(itri) = y(j,i+1) - z3(itri) = z(j,i+1) - ityph = 1 - if(mod(i-1,mst(j)) .eq. 0) go to 10 - if(mod(iflag(j,i-1),2) .eq. 0) go to 10 - ityph = 0 - 10 if(mod(iflag(j,i),2) .eq. 0) ityph = ityph+2 - if(mod(iflag(j-1,i),4) .lt. 2) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 20 if(mod(iflag(j,i),2) .eq. 0) go to 100 - itri = itri+1 - x1(itri) = x(j+1,i) - y1(itri) = y(j+1,i) - z1(itri) = z(j+1,i) - x2(itri) = x(j+1,i+1) - y2(itri) = y(j+1,i+1) - z2(itri) = z(j+1,i+1) - x3(itri) = x(j,i+1) - y3(itri) = y(j,i+1) - z3(itri) = z(j,i+1) - ityph = 1 - if(mod(iflag(j,i+1),16) .lt. 8) ityph = ityph+2 - if(mod(iflag(j,i),16) .lt. 8) ityph = ityph+4 - ityp(itri) = icl(ityph+1) - 100 continue -c -c **** triangles around north and south poles -c - do 200 i=1,m-1 - if(mod(iflag(1,i),16) .lt. 8) go to 250 - itri = itri+1 - x1(itri) = x(1,i) - y1(itri) = y(1,i) - z1(itri) = z(1,i) - x2(itri) = x(2,i) - y2(itri) = y(2,i) - z2(itri) = z(2,i) - x3(itri) = x(2,i+1) - y3(itri) = y(2,i+1) - z3(itri) = z(2,i+1) - ityp(itri) = icl(3) - 250 if(mod(iflag(n-1,i),16) .lt. 8) go to 200 - itri = itri+1 - x1(itri)=x(n-1,i) - y1(itri)=y(n-1,i) - z1(itri)=z(n-1,i) - x2(itri)=x(n,i) - y2(itri)=y(n,i) - z2(itri)=z(n,i) - x3(itri)=x(n-1,i+1) - y3(itri)=y(n-1,i+1) - z3(itri)=z(n-1,i+1) - ityp(itri) = icl(1) - 200 continue - return - end - SUBROUTINE VSURF(XEYE,YEYE,ZEYE,NTRI,X1,Y1,Z1,X2,Y2,Z2, - 1 X3,Y3,Z3,ITYPE,WORK,IWORK) -c -c subroutine vsurf is like subroutine hidel except the triangles -c are categorized. vsurf is also like solid except triangles rather -c than lines are covered. -c -c written by paul n. swarztrauber, national center for atmospheric -c research, p.o. box 3000, boulder, colorado, 80307 -c -c this program plots visible lines for the surface defined -c by the input 3-d triangles with corners at (x1,y1,z1), (x2,y2,z2) -c and (x3,y3,z3). the sides of these these triangles may or -c may not be plotted depending on itype. if itype is 1 then the -c side between points (x1,y1,z1) and (x2,y2,z2) is plotted if it -c is visible. if itype is 2 then the side between (x2,y2,z2) -c and (x3,y3,z3) is plotted. if itype is 3 then the visible portion -c of the side between (x3,y3,z3) and (x1,y1,z1) is plotted. -c any combination is possible by specifying itype to be one -c of the following values: 0,1,2,3,12,13,23,123. -c -c the length of real array work must be at least 14*ntri -c -c the length of integer array iwork must be at least 6*ntri -c -c -c the vertices of the triangles are renumbered by vsurf so that -c their projections are orientated counterclockwise. the user need -c only be aware that the vertices may be renumbered by vsurf. -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri),work(14*ntri) - INTEGER IWORK(6*NTRI) -c - call vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,work,work(ntri+1),work(2*ntri+1),work(3*ntri+1), - 2 work(4*ntri+1),work(5*ntri+1),work(6*ntri+1),work(7*ntri+1), - 3 work(8*ntri+1),work(9*ntri+1),work(10*ntri+1),work(11*ntri+1), - 3 work(12*ntri+1),work(13*ntri+1),IWORK,IWORK(NTRI+1), - 4 IWORK(2*NTRI+1),IWORK(4*NTRI+1)) - return - end - subroutine vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,px1,py1,px2,py2,px3,py3,vx1,vy1,vx2,vy2,vx3,vy3,tl,tr,kh, - 2 next,istart,ifinal) -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri), - 2 px1(ntri),py1(ntri),px2(ntri),py2(ntri), - 3 px3(ntri),py3(ntri),vx1(ntri),vy1(ntri), - 4 vx2(ntri),vy2(ntri),vx3(ntri),vy3(ntri), - 5 tl(ntri),tr(ntri),next(ntri),kh(ntri), - 6 istart(2*ntri),ifinal(2*ntri),ltp(3), - 7 ird(11),ip2(11),nct(11),ncv(11),last(11) -c - real l2e - double precision le2 -c -c compute projections of 3-d points -c - le2 = .6931471805599453094172321d0 - l2e = 1.d0/le2 - fntri = ntri - irmax = .5*l2e*log(fntri) - irmax = min(irmax,10) - irmp1 = irmax+1 - do 4 icv=1,11 - ncv(icv) = 0 - 4 continue - nct(1) = 0 - ip2(1) = 1 - ird(1) = 0 - isize = 4 - do 7 irp1=2,irmp1 - ir = irp1-1 - nct(irp1) = 0 - ip2(irp1) = 2**ir - ird(irp1) = ird(ir)+isize - isize = (ip2(irp1)+1)**2 - 7 continue - isxm = ird(irmp1)+isize+1 - do 8 isx=1,isxm - istart(isx) = 0 - ifinal(isx) = 0 - 8 continue - do 6 i=1,ntri - next(i) = 0 - 6 continue - call prjct(0,xeye,yeye,zeye,x,y,z,dum1,dum2) -c write(6,127) ntri - 127 format(' ntri in hidel', i5) - do 86 k=1,ntri - call prjct(1,xeye,yeye,zeye,x1(k),y1(k),z1(k),px1(k),py1(k)) - call prjct(1,xeye,yeye,zeye,x2(k),y2(k),z2(k),px2(k),py2(k)) - call prjct(1,xeye,yeye,zeye,x3(k),y3(k),z3(k),px3(k),py3(k)) - if (k .lt. 3) then -c write(6,333) xeye,yeye,zeye,x1(k),y1(k),z1(k),px1(k),py1(k) - 333 format(' xeye, etc.',8e8.1) - endif - 86 continue -c -c orientate triangles counter clockwise -c - do 70 k=1,ntri - cprod = (px2(k)-px1(k))*(py3(k)-py1(k))-(py2(k)-py1(k)) - 1 *(px3(k)-px1(k)) -c if(cprod.eq.0.) write(6,79) k,px1(k),px2(k),px3(k), -c - py1(k),py2(k),py3(k) - 79 format(' cprod=0 at k=', i5,6e9.2) - if(cprod.ge.0.) go to 70 - px1h = px1(k) - py1h = py1(k) - px1(k) = px2(k) - py1(k) = py2(k) - px2(k) = px1h - py2(k) = py1h - x1hold = x1(k) - y1hold = y1(k) - z1hold = z1(k) - x1(k) = x2(k) - y1(k) = y2(k) - z1(k) = z2(k) - x2(k) = x1hold - y2(k) = y1hold - z2(k) = z1hold - ityp = itype(k) - if(ityp.eq.2) itype(k) = 3 - if(ityp.eq.3) itype(k) = 2 - if(ityp.eq.12) itype(k) = 13 - if(ityp.eq.13) itype(k) = 12 - 70 continue -c -c set screen limits -c - pmax = px1(1) - pmin = px1(1) - do 87 k=1,ntri - pmin = amin1(pmin,px1(k),py1(k),px2(k),py2(k),px3(k),py3(k)) - pmax = amax1(pmax,px1(k),py1(k),px2(k),py2(k),px3(k),py3(k)) - 87 continue - pmin = 1.1*pmin - pmax = 1.1*pmax - call set(0.,1.,0.,1.,pmin,pmax,pmin,pmax,1) - xmin = amin1(px1(1),px2(1),px3(1)) - xmax = amax1(px1(1),px2(1),px3(1)) - ymin = amin1(py1(1),py2(1),py3(1)) - ymax = amax1(py1(1),py2(1),py3(1)) - do 1 i=2,ntri - xmin = amin1(xmin,px1(i),px2(i),px3(i)) - xmax = amax1(xmax,px1(i),px2(i),px3(i)) - ymin = amin1(ymin,py1(i),py2(i),py3(i)) - ymax = amax1(ymax,py1(i),py2(i),py3(i)) - 1 continue - dmx = xmax-xmin - dmy = ymax-ymin - if(dmx .gt. dmy) go to 2 - c = ymin - d = ymax - xmid = .5*(xmin+xmax) - hdy = .5*dmy - a = xmid-hdy - b = xmid+hdy - go to 3 - 2 a = xmin - b = xmax - ymid = .5*(ymin+ymax) - hdx = .5*dmx - c = ymid-hdx - d = ymid+hdx - 3 hgr = b-a -c -c categorize triangles -c - do 100 i=1,ntri - xmin = amin1(px1(i),px2(i),px3(i)) - xmax = amax1(px1(i),px2(i),px3(i)) - ymin = amin1(py1(i),py2(i),py3(i)) - ymax = amax1(py1(i),py2(i),py3(i)) - dxt = amax1(xmax-xmin,ymax-ymin) - if(dxt .gt. 0.) go to 10 - ir = irmax - go to 20 - 10 ir = l2e*log(hgr/dxt) - ir = min(ir,irmax) - 20 irp1 = ir+1 - nct(irp1) = nct(irp1)+1 - hr = hgr/ip2(irp1) - xmid = .5*(xmin+xmax) - id = (xmid-a)/hr+1.5 - ymid = .5*(ymin+ymax) - jd = (ymid-c)/hr+1.5 - ijd = ip2(irp1)+1 - isx = id+(jd-1)*ijd+ird(irp1) - ifx = ifinal(isx) - if(ifx .gt. 0) go to 50 - istart(isx) = i - go to 60 - 50 next(ifx) = i - 60 ifinal(isx) = i - 100 continue -c write(6,106) tcat,(irp1,nct(irp1),irp1=1,irmp1) - 106 format(' time to categorize ', e15.6/(' ir+1',i3,' ntri',i7)) -c -c sort triangles into boxes -c - l = 0 - do 30 irp1=1,irmp1 - if(nct(irp1) .eq. 0) go to 30 - ist = ird(irp1)+1 - isd = ip2(irp1)+1 - call box(isd,istart(ist),next,l,ifinal) - last(irp1) = l+1 - 30 continue - do 35 irp1=1,irmp1 - il = ird(irp1)+(ip2(irp1)+1)**2+1 - if(istart(il) .eq. 0) istart(il) = last(irp1) - 35 continue -c write(6,31) tsort,l,ntri - 31 format(' time to sort ', e15.6,' l', i8,' ntri',i8) - do 90 k=1,ntri - vx1(k) = px2(k)-px1(k) - vy1(k) = py2(k)-py1(k) - vx2(k) = px3(k)-px2(k) - vy2(k) = py3(k)-py2(k) - vx3(k) = px1(k)-px3(k) - vy3(k) = py1(k)-py3(k) - 90 continue - tl1 = 0. - tl2 = 0. - maxs = 0 - do 500 ir2=1,irmp1 - if(nct(ir2) .eq. 0) go to 500 - ist = ird(ir2) - isd = ip2(ir2)+1 - do 490 j2=1,isd - do 480 i2=1,isd - ist = ist+1 - ls = istart(ist) - lf = istart(ist+1)-1 - if(lf .lt. ls) go to 480 -c -c define coverings -c - kcv = 0 - i2m = i2-1 - j2m = j2-1 - do 300 ir1=1,irmp1 - if(nct(ir1) .eq. 0) go to 300 - if(ir1 .ge. ir2) go to 260 - irdp = 2**(ir2-ir1) - i1s = (i2m-1)/irdp - i1f = (i2m+1)/irdp - if = i2m+1-i1f*irdp - if(if .gt. 0) i1f = i1f+1 - j1s = (j2m-1)/irdp - j1f = (j2m+1)/irdp - jf = j2m+1-j1f*irdp - if(jf .gt. 0) j1f = j1f+1 - go to 270 - 260 irdp = 2**(ir1-ir2) - i1s = irdp*(i2m-1) - i1f = irdp*(i2m+1) - j1s = irdp*(j2m-1) - j1f = irdp*(j2m+1) - 270 ijd = ip2(ir1)+1 - i1s = max(i1s+1,1) - i1f = min(i1f+1,ijd) - j1s = max(j1s+1,1) - j1f = min(j1f+1,ijd) - ixh = (j1s-2)*ijd+ird(ir1) - ixs = i1s+ixh - ixf = i1f+ixh - do 290 j1=j1s,j1f - ixs = ixs+ijd - kds = istart(ixs) - ixf = ixf+ijd - kdf = istart(ixf+1)-1 - if(kdf .lt. kds) go to 290 - do 280 kd=kds,kdf - kcv = kcv+1 - kh(kcv) = ifinal(kd) - 280 continue - 290 continue - 300 continue - do 310 icv=1,10 - if(kcv .le. ncv(icv)) go to 310 - ncv(icv) = kcv - go to 320 - 310 continue -c -c - 320 do 470 ldo=ls,lf - l = ifinal(ldo) - ith = itype(l) - if(ith .eq. 0) go to 470 - ltp(1) = 0 - ltp(2) = 0 - ltp(3) = 0 - id1 = ith/100 - ith = ith-100*id1 - id2 = ith/10 - id3 = ith-10*id2 - if(id1 .ne. 0) ltp(id1) = 1 - if(id2 .ne. 0) ltp(id2) = 1 - if(id3 .ne. 0) ltp(id3) = 1 -c if((ith.eq.123) .or. (ith.eq.12) .or.(ith.eq.13)) ltp(1) = 1 -c if((ith.eq.123) .or. (ith.eq.23) .or.(ith.eq.12)) ltp(2) = 1 -c if((ith.eq.123) .or. (ith.eq.13) .or.(ith.eq.23)) ltp(3) = 1 - do 460 ns=1,3 -c go to (101,102,103),ns - - select case(ns) - case(1) - goto 101 - case(2) - goto 102 - case(3) - goto 103 - end select - - 101 if(ltp(ns) .eq. 0) go to 460 - px4 = px1(l) - py4 = py1(l) - px5 = px2(l) - py5 = py2(l) - x4 = x1(l) - y4 = y1(l) - z4 = z1(l) - x5 = x2(l) - y5 = y2(l) - z5 = z2(l) - go to 105 - 102 if(ltp(ns) .eq. 0) go to 460 - px4 = px2(l) - py4 = py2(l) - px5 = px3(l) - py5 = py3(l) - x4 = x2(l) - y4 = y2(l) - z4 = z2(l) - x5 = x3(l) - y5 = y3(l) - z5 = z3(l) - go to 105 - 103 if(ltp(ns) .eq. 0) go to 460 - px4 = px1(l) - py4 = py1(l) - px5 = px3(l) - py5 = py3(l) - x4 = x1(l) - y4 = y1(l) - z4 = z1(l) - x5 = x3(l) - y5 = y3(l) - z5 = z3(l) - 105 x54 = px5-px4 - y54 = py5-py4 - nseg = 0 - do 440 kd=1,kcv - k = kh(kd) - c17 = vx1(k)*y54-vy1(k)*x54 - c27 = vx2(k)*y54-vy2(k)*x54 - c37 = vx3(k)*y54-vy3(k)*x54 - c14 = vy1(k)*(px4-px1(k))-vx1(k)*(py4-py1(k)) - c25 = vy2(k)*(px4-px2(k))-vx2(k)*(py4-py2(k)) - c36 = vy3(k)*(px4-px3(k))-vx3(k)*(py4-py3(k)) - tmin = 0. - tmax = 1. - if(c17) 151,152,153 - 151 tmax = amin1(c14/c17,tmax) - go to 154 - 152 if(c14) 154,440,440 - 153 tmin = amax1(c14/c17,tmin) - 154 if(c27) 155,156,157 - 155 tmax = amin1(c25/c27,tmax) - go to 158 - 156 if(c25) 158,440,440 - 157 tmin = amax1(c25/c27,tmin) - 158 if(c37) 159,160,161 - 159 tmax = amin1(c36/c37,tmax) - go to 162 - 160 if(c36) 162,440,440 - 161 tmin = amax1(c36/c37,tmin) - 162 if(tmax-tmin .lt. .00001) go to 440 - xpl = x4+tmin*(x5-x4) - ypl = y4+tmin*(y5-y4) - zpl = z4+tmin*(z5-z4) - xpr = x4+tmax*(x5-x4) - ypr = y4+tmax*(y5-y4) - zpr = z4+tmax*(z5-z4) -c -c the projections of line and plane intersect -c now determine if plane covers line -c - vx1t = x2(k)-x1(k) - vy1t = y2(k)-y1(k) - vz1t = z2(k)-z1(k) - vx2t = x3(k)-x1(k) - vy2t = y3(k)-y1(k) - vz2t = z3(k)-z1(k) - apl = vy1t*vz2t-vy2t*vz1t - bpl = vx2t*vz1t-vx1t*vz2t - cpl = vx1t*vy2t-vx2t*vy1t - dpl = apl*x1(k)+bpl*y1(k)+cpl*z1(k) - vx3t = xpl-xeye - vy3t = ypl-yeye - vz3t = zpl-zeye - den = apl*vx3t+bpl*vy3t+cpl*vz3t - til = 0. - if(den .eq. 0.) go to 410 - til = (dpl-apl*xeye-bpl*yeye-cpl*zeye)/den - 410 vx3t = xpr-xeye - vy3t = ypr-yeye - vz3t = zpr-zeye - den = apl*vx3t+bpl*vy3t+cpl*vz3t - tir = 0. - if(den .eq. 0.) go to 412 - tir = (dpl-apl*xeye-bpl*yeye-cpl*zeye)/den - 412 if(til.ge..99999.and.tir.ge..99999) go to 440 - if(til.lt.1..and.tir.lt.1.) go to 164 - vx3t = xpr-xpl - vy3t = ypr-ypl - vz3t = zpr-zpl - den = apl*vx3t+bpl*vy3t+cpl*vz3t - tim = 0. - if(den .eq. 0.) go to 414 - tim = (dpl-apl*xpl-bpl*ypl-cpl*zpl)/den - 414 thold = tmin+tim*(tmax-tmin) - if(til.ge.1.) go to 163 - tmax = thold - go to 164 - 163 tmin = thold - 164 nseg = nseg+1 - tl(nseg) = tmin - tr(nseg) = tmax - 440 continue - maxs = max0(maxs,nseg) - if(nseg-1)171,180,172 - 171 call line(px4,py4,px5,py5) - go to 460 -c -c order the segments according to left end point tl(k) -c - 172 do 173 k=2,nseg - do 173 i=k,nseg - if(tl(k-1).le.tl(i)) go to 173 - tlh = tl(k-1) - trh = tr(k-1) - tl(k-1) = tl(i) - tr(k-1) = tr(i) - tl(i) = tlh - tr(i) = trh - 173 continue -c -c eliminate segment overlap -c - k1 = 1 - k2 = 1 - 174 k2 = k2+1 - if(k2.gt.nseg) go to 176 - if(tr(k1).lt.tl(k2)) go to 175 - tr(k1) = amax1(tr(k1),tr(k2)) - go to 174 - 175 k1 = k1+1 - tl(k1) = tl(k2) - tr(k1) = tr(k2) - go to 174 - 176 nseg = k1 -c -c plot all segments of the line -c - 180 do 181 ks =1,nseg - kb = nseg-ks+1 - tl(kb+1) = tr(kb) - tr(kb) = tl(kb) - 181 continue - tl(1) = 0. - tr(nseg+1) = 1. - nsegp = nseg+1 - do 450 k=1,nsegp - if(abs(tr(k)-tl(k)).lt..000001) go to 450 - xa = px4+tl(k)*(px5-px4) - ya = py4+tl(k)*(py5-py4) - xb = px4+tr(k)*(px5-px4) - yb = py4+tr(k)*(py5-py4) - call line(xa,ya,xb,yb) - 450 continue - 460 continue - 470 continue - 480 continue - 490 continue - 500 continue -c write(6,903) tl1,tl2 - 903 format(' time to cover', e15.6/ - 1 ' time to test ', e15.6) -c write(6,904) maxs - 904 format(' maximum number of segments', i5) -c write(6,250) (ncv(icv),icv=1,10) - 250 format(' the ten largest coverings'/(10i5)) - call frame - end - subroutine prjct(init,xeye,yeye,zeye,x,y,z,px,py) -c -c subroutine prjct projects the point x,y,z onto a plane through -c the origin that is perpendicular to a line between the origin -c and the eye. the projection is along the line between the eye -c and the point x,y,z. px and py are the coordinates of the -c projection in the plane. -c (version 2 , 12-10-82) -c - save - if(init.ne.0) go to 1 - rads1 = xeye**2+yeye**2 - rads2 = rads1+zeye**2 - d1 = sqrt(rads1) - d2 = sqrt(rads2) - cx1 = -yeye/d1 - cy1 = xeye/d1 - cx2 = -xeye*zeye/(d1*d2) - cy2 = -yeye*zeye/(d1*d2) - cz2 = d1/d2 - cx3 = xeye/d2 - cy3 = yeye/d2 - cz3 = zeye/d2 - return - 1 x1 = cx1*x+cy1*y - y1 = cx2*x+cy2*y+cz2*z - z1 = cx3*x+cy3*y+cz3*z - ratio = d2/(d2-z1) - px = ratio*x1 - py = ratio*y1 - return - end - subroutine box(isd,istart,next,l,list) - dimension istart(isd,isd),next(1),list(1) - do 30 jd=1,isd - do 10 id=1,isd - idx = istart(id,jd) - istart(id,jd) = l+1 - if(idx .eq. 0) go to 10 - 20 l = l+1 - list(l) = idx - if(next(idx) .eq. 0) go to 10 - idx = next(idx) - go to 20 - 10 continue - 30 continue - return - end - integer function icvmg(i1,i2,r) - integer i1,i2 - real r -c -c returns i1 if i3.ge.0 and returns i2 if i3.lt.0 . -c - icvmg = i1 - if (r .lt. 0.) icvmg = i2 - return - end - subroutine projct(m,n,xeye,yeye,zeye,x,y,z,px,py) -c **** projects point (x,y,z) onto plane thru origin and perp -c **** to line joining origin and eye - dimension x(n,m),y(n,m),z(n,m),px(n,m),py(n,m) - call prjct(0,xeye,yeye,zeye,rdum1,rdum2,rdum3,rdum4,rdum5) - do 100 i=1,m - do 100 j=1,n - call prjct(1,xeye,yeye,zeye,x(j,i),y(j,i),z(j,i),px(j,i),py(j,i)) - 100 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/visgeo.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/visgeo.f deleted file mode 100755 index 80f3f4201..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/visgeo.f +++ /dev/null @@ -1,801 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c ... visgeo.f -c -c contains documentation and code for subroutine visgeo -c - SUBROUTINE VISGEO (M,IDP,JDP,X,Y,Z,H,EYER,EYELAT,EYELON, - 1 WORK,LWORK,IWORK,LIWORK,IERROR) -c -c subroutine visgeo will display a function on the sphere -c as a solid. ie. as a "lumpy" sphere. visgeo calls subroutine -c vsurf to produce the visible surface rendering. X, Y, and Z -c are the points on an icosahedral geodesic computed by -c subroutine geopts available in spherepack. -c -c requires routines visgeo1 ctos stoc vsurf vsurf1 -c prjct box -c -c visgeo uses the ncar graphics package. -c compile with: ncargf77 (all programs above) -c -c execute with: a.out -c -c on screen display with: ctrans -d x11 gmeta -c -c print with: ctrans -d ps.color gmeta > gmeta.ps -c lpr -P(your printer) gmeta.ps -c -c -c input parameters -c -c m the number of points on one edge of the icosahedron -c -c idp,jdp the first and second dimensions of the three -c dimensional arrays x, y, z, and h. -c -c x,y,z the coordinates of the geodesic points on -c the unit sphere computed by subroutine geopts. -c the indices are defined on the unfolded -c icosahedron as follows for the case m=3 -c -c north pole -c -c (5,1) 0 l -c i (4,1) (5,2) a (repeated for -c (3,1) (4,2) (5,3) theta1 t k=2,3,4,5 in -c (2,1) (3,2) (4,3) i --> -c (1,1) (2,2) (3,3) theta2 t the longitudinal -c (1,2) (2,3) u direction) -c (1,3) pi d -c j e -c south pole -c -c total number of vertices is 10*(m-1)**2+2 -c total number of triangles is 20*(m-1)**2 -c -c h a three dimensional array that contains the discrete -c function to be displayed. h(i,j,k) is the distance from -c the center of the sphere to the "lumpy" surface at the -c point [x(i,j,k),y(i,j,k),z(i,j,k)] on the unit sphere. -c -c eyer the distance from the center of the sphere to the eye. -c -c eyelat the colatitudinal coordinate of the eye (in degrees). -c -c eyelon the longitudinal coordinate of the eye (in degrees). -c -c idp the first dimension of the array h as it appears in -c the program that calls visgeo -c -c jdp the second dimension of the array h as it appears in -c the program that calls visgeo -c -c work a real work array -c -c lwork the dimension of the array work as it appears in the -c program that calls visgeo. lwork must be at least -c 480*(m-1)**2. -c -c iwork an integer work array -c -c liwork the dimension of the array iwork as it appears in the -c program that calls visgeo. liwork must be at least -c 140*(m-1)**2. -c -c input parameter -c -c ierror = 0 no error -c = 1 h(i,j,k) is less than zero for some i,j,k. -c = 2 eyer is less than h(i,j,k) for some i,k,k. -c = 3 lwork is less than 480*(m-1)**2 -c = 4 liwork is less than 140*(m-1)**2 -c - dimension h(idp,jdp,5),x(idp,jdp,5),y(idp,jdp,5),z(idp,jdp,5), - 1 work(*) - INTEGER IWORK(*) - mmsq = (m-1)**2 - ierror = 3 - if(lwork .lt. 480*mmsq) return - ierror = 4 - if(liwork .lt. 140*mmsq) return - do 10 k=1,5 - do 10 j=1,m - do 10 i=1,m+m-1 - if(h(i,j,k) .ge. 0.) go to 15 - ierror = 1 - return - 15 if(eyer .gt. h(i,j,k)) go to 10 - ierror = 2 - return - 10 continue - ierror = 0 - lt = 20*(m-1)**2 - lg = 5*m*(m+m-1) - i1 = 1 - i2 = i1+lt - i3 = i2+lt - i4 = i3+lt - i5 = i4+lt - i6 = i5+lt - i7 = i6+lt - i8 = i7+lt - i9 = i8+lt - i10 = i9+lt - i11 = i10+lt - i12 = i11 - i13 = i12+lg - i14 = i13+lg - call visgeo1 (m,idp,jdp,h,eyer,eyelat,eyelon,x,y,z, - 1work(i1),work(i2),work(i3),work(i4),work(i5),work(i6), - 2work(i7),work(i8),work(i9),IWORK(1),work(i11), - 3work(i12),work(i13),work(i14),IWORK(lt+1)) - return - end - SUBROUTINE VISGEO1(M,IDP,JDP,H,EYER,EYELAT,EYELON, - 1 XI,YI,ZI,X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,ITYPE,WORK,X,Y,Z,IWORK) - dimension h(idp,jdp,5),xi(idp,jdp,5),yi(idp,jdp,5),zi(idp,jdp,5), - 1x1(*),y1(*),z1(*),x2(*),y2(*),z2(*),x3(*),y3(*),z3(*),itype(*), - 2work(*),x(m+m-1,m,5),y(m+m-1,m,5),z(m+m-1,m,5) - INTEGER IWORK(*) -c -c the * above refers to 20*(m-1)**2 locations which is the -c number of triangles -c - do 10 k=1,5 - do 10 j=1,m - do 10 i=1,m+m-1 - call ctos(xi(i,j,k),yi(i,j,k),zi(i,j,k),rad,theta,elambda) - call stoc(h(i,j,k),theta,elambda,x(i,j,k),y(i,j,k),z(i,j,k)) - 10 continue - ntri = 0 - do 20 k=1,5 - do 20 j=1,m-1 - do 20 i=1,m+m-2 - ntri = ntri+1 - x1(ntri) = x(i,j,k) - y1(ntri) = y(i,j,k) - z1(ntri) = z(i,j,k) - x2(ntri) = x(i+1,j+1,k) - y2(ntri) = y(i+1,j+1,k) - z2(ntri) = z(i+1,j+1,k) - x3(ntri) = x(i+1,j,k) - y3(ntri) = y(i+1,j,k) - z3(ntri) = z(i+1,j,k) - itype(ntri) = 13 - ntri = ntri+1 - x1(ntri) = x(i,j,k) - y1(ntri) = y(i,j,k) - z1(ntri) = z(i,j,k) - x2(ntri) = x(i+1,j+1,k) - y2(ntri) = y(i+1,j+1,k) - z2(ntri) = z(i+1,j+1,k) - x3(ntri) = x(i,j+1,k) - y3(ntri) = y(i,j+1,k) - z3(ntri) = z(i,j+1,k) - itype(ntri) = 3 - 20 continue -c write(6,22) ntri - 22 format(i10) -c write(6,23) (x1(l2),y1(l2),z1(l2),x2(l2),y2(l2),z2(l2), -c 1 x3(l2),y3(l2),z3(l2),l2=1,ntri) -c 23 format(9f10.7) -c - pi = 4.*atan(1.) - dtr = pi/180. - xeye=eyer*sin(dtr*eyelat) - yeye=xeye*sin(dtr*eyelon) - xeye=xeye*cos(dtr*eyelon) - zeye=eyer*cos(dtr*eyelat) - CALL VSURF(XEYE,YEYE,ZEYE,NTRI,X1,Y1,Z1,X2,Y2,Z2, - 1 X3,Y3,Z3,ITYPE,WORK,IWORK) - return - end - subroutine ctos(x,y,z,r,theta,phi) - r1 = x*x+y*y - if(r1 .ne. 0.) go to 10 - phi = 0. - theta = 0. - if(z .lt. 0.) theta = 4.*atan(1.) - return - 10 r = sqrt(r1+z*z) - r1 = sqrt(r1) - phi = atan2(y,x) - theta = atan2(r1,z) - return - end - subroutine stoc(r,theta,phi,x,y,z) - st = sin(theta) - x = r*st*cos(phi) - y = r*st*sin(phi) - z = r*cos(theta) - return - end - SUBROUTINE VSURF(XEYE,YEYE,ZEYE,NTRI,X1,Y1,Z1,X2,Y2,Z2, - 1 X3,Y3,Z3,ITYPE,WORK,IWORK) -c -c subroutine vsurf is like subroutine hidel except the triangles -c are categorized. vsurf is also like solid except triangles rather -c than lines are covered. -c -c written by paul n. swarztrauber, national center for atmospheric -c research, p.o. box 3000, boulder, colorado, 80307 -c -c this program plots visible lines for the surface defined -c by the input 3-d triangles with corners at (x1,y1,z1), (x2,y2,z2) -c and (x3,y3,z3). the sides of these these triangles may or -c may not be plotted depending on itype. if itype is 1 then the -c side between points (x1,y1,z1) and (x2,y2,z2) is plotted if it -c is visible. if itype is 2 then the side between (x2,y2,z2) -c and (x3,y3,z3) is plotted. if itype is 3 then the visible portion -c of the side between (x3,y3,z3) and (x1,y1,z1) is plotted. -c any combination is possible by specifying itype to be one -c of the following values: 0,1,2,3,12,13,23,123. -c -c the length of real array work must be at least 14*ntri -c -c the length of integer array iwork must be at least 6*ntri -c -c -c the vertices of the triangles are renumbered by vsurf so that -c their projections are orientated counterclockwise. the user need -c only be aware that the vertices may be renumbered by vsurf. -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri),work(14*ntri) - INTEGER IWORK(6*NTRI) -c - call vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,work,work(ntri+1),work(2*ntri+1),work(3*ntri+1), - 2 work(4*ntri+1),work(5*ntri+1),work(6*ntri+1),work(7*ntri+1), - 3 work(8*ntri+1),work(9*ntri+1),work(10*ntri+1),work(11*ntri+1), - 3 work(12*ntri+1),work(13*ntri+1),IWORK,IWORK(NTRI+1), - 4 IWORK(2*NTRI+1),IWORK(4*NTRI+1)) - return - end - subroutine vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,px1,py1,px2,py2,px3,py3,vx1,vy1,vx2,vy2,vx3,vy3,tl,tr,kh, - 2 next,istart,ifinal) -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri), - 2 px1(ntri),py1(ntri),px2(ntri),py2(ntri), - 3 px3(ntri),py3(ntri),vx1(ntri),vy1(ntri), - 4 vx2(ntri),vy2(ntri),vx3(ntri),vy3(ntri), - 5 tl(ntri),tr(ntri),next(ntri),kh(ntri), - 6 istart(2*ntri),ifinal(2*ntri),ltp(3), - 7 ird(11),ip2(11),nct(11),ncv(11),last(11) -c - real l2e - double precision le2 -c -c compute projections of 3-d points -c - le2 = .6931471805599453094172321d0 - l2e = 1.d0/le2 - fntri = ntri - irmax = .5*l2e*log(fntri) - irmax = min(irmax,10) - irmp1 = irmax+1 - do 4 icv=1,11 - ncv(icv) = 0 - 4 continue - nct(1) = 0 - ip2(1) = 1 - ird(1) = 0 - isize = 4 - do 7 irp1=2,irmp1 - ir = irp1-1 - nct(irp1) = 0 - ip2(irp1) = 2**ir - ird(irp1) = ird(ir)+isize - isize = (ip2(irp1)+1)**2 - 7 continue - isxm = ird(irmp1)+isize+1 - do 8 isx=1,isxm - istart(isx) = 0 - ifinal(isx) = 0 - 8 continue - do 6 i=1,ntri - next(i) = 0 - 6 continue - call prjct(0,xeye,yeye,zeye,x,y,z,dum1,dum2) -c write(6,127) ntri - 127 format(' ntri in hidel', i5) - do 86 k=1,ntri - call prjct(1,xeye,yeye,zeye,x1(k),y1(k),z1(k),px1(k),py1(k)) - call prjct(1,xeye,yeye,zeye,x2(k),y2(k),z2(k),px2(k),py2(k)) - call prjct(1,xeye,yeye,zeye,x3(k),y3(k),z3(k),px3(k),py3(k)) - if (k .lt. 3) then -c write(6,333) xeye,yeye,zeye,x1(k),y1(k),z1(k),px1(k),py1(k) - 333 format(' xeye, etc.',8e8.1) - endif - 86 continue -c -c orientate triangles counter clockwise -c - do 70 k=1,ntri - cprod = (px2(k)-px1(k))*(py3(k)-py1(k))-(py2(k)-py1(k)) - 1 *(px3(k)-px1(k)) -c if(cprod.eq.0.) write(6,79) k,px1(k),px2(k),px3(k), -c - py1(k),py2(k),py3(k) - 79 format(' cprod=0 at k=', i5,6e9.2) - if(cprod.ge.0.) go to 70 - px1h = px1(k) - py1h = py1(k) - px1(k) = px2(k) - py1(k) = py2(k) - px2(k) = px1h - py2(k) = py1h - x1hold = x1(k) - y1hold = y1(k) - z1hold = z1(k) - x1(k) = x2(k) - y1(k) = y2(k) - z1(k) = z2(k) - x2(k) = x1hold - y2(k) = y1hold - z2(k) = z1hold - ityp = itype(k) - if(ityp.eq.2) itype(k) = 3 - if(ityp.eq.3) itype(k) = 2 - if(ityp.eq.12) itype(k) = 13 - if(ityp.eq.13) itype(k) = 12 - 70 continue -c -c set screen limits -c - pmax = px1(1) - pmin = px1(1) - do 87 k=1,ntri - pmin = amin1(pmin,px1(k),py1(k),px2(k),py2(k),px3(k),py3(k)) - pmax = amax1(pmax,px1(k),py1(k),px2(k),py2(k),px3(k),py3(k)) - 87 continue - pmin = 1.1*pmin - pmax = 1.1*pmax - call set(0.,1.,0.,1.,pmin,pmax,pmin,pmax,1) - xmin = amin1(px1(1),px2(1),px3(1)) - xmax = amax1(px1(1),px2(1),px3(1)) - ymin = amin1(py1(1),py2(1),py3(1)) - ymax = amax1(py1(1),py2(1),py3(1)) - do 1 i=2,ntri - xmin = amin1(xmin,px1(i),px2(i),px3(i)) - xmax = amax1(xmax,px1(i),px2(i),px3(i)) - ymin = amin1(ymin,py1(i),py2(i),py3(i)) - ymax = amax1(ymax,py1(i),py2(i),py3(i)) - 1 continue - dmx = xmax-xmin - dmy = ymax-ymin - if(dmx .gt. dmy) go to 2 - c = ymin - d = ymax - xmid = .5*(xmin+xmax) - hdy = .5*dmy - a = xmid-hdy - b = xmid+hdy - go to 3 - 2 a = xmin - b = xmax - ymid = .5*(ymin+ymax) - hdx = .5*dmx - c = ymid-hdx - d = ymid+hdx - 3 hgr = b-a -c -c categorize triangles -c - do 100 i=1,ntri - xmin = amin1(px1(i),px2(i),px3(i)) - xmax = amax1(px1(i),px2(i),px3(i)) - ymin = amin1(py1(i),py2(i),py3(i)) - ymax = amax1(py1(i),py2(i),py3(i)) - dxt = amax1(xmax-xmin,ymax-ymin) - if(dxt .gt. 0.) go to 10 - ir = irmax - go to 20 - 10 ir = l2e*log(hgr/dxt) - ir = min(ir,irmax) - 20 irp1 = ir+1 - nct(irp1) = nct(irp1)+1 - hr = hgr/ip2(irp1) - xmid = .5*(xmin+xmax) - id = (xmid-a)/hr+1.5 - ymid = .5*(ymin+ymax) - jd = (ymid-c)/hr+1.5 - ijd = ip2(irp1)+1 - isx = id+(jd-1)*ijd+ird(irp1) - ifx = ifinal(isx) - if(ifx .gt. 0) go to 50 - istart(isx) = i - go to 60 - 50 next(ifx) = i - 60 ifinal(isx) = i - 100 continue -c write(6,106) tcat,(irp1,nct(irp1),irp1=1,irmp1) - 106 format(' time to categorize ', e15.6/(' ir+1',i3,' ntri',i7)) -c -c sort triangles into boxes -c - l = 0 - do 30 irp1=1,irmp1 - if(nct(irp1) .eq. 0) go to 30 - ist = ird(irp1)+1 - isd = ip2(irp1)+1 - call box(isd,istart(ist),next,l,ifinal) - last(irp1) = l+1 - 30 continue - do 35 irp1=1,irmp1 - il = ird(irp1)+(ip2(irp1)+1)**2+1 - if(istart(il) .eq. 0) istart(il) = last(irp1) - 35 continue -c write(6,31) tsort,l,ntri - 31 format(' time to sort ', e15.6,' l', i8,' ntri',i8) - do 90 k=1,ntri - vx1(k) = px2(k)-px1(k) - vy1(k) = py2(k)-py1(k) - vx2(k) = px3(k)-px2(k) - vy2(k) = py3(k)-py2(k) - vx3(k) = px1(k)-px3(k) - vy3(k) = py1(k)-py3(k) - 90 continue - tl1 = 0. - tl2 = 0. - maxs = 0 - do 500 ir2=1,irmp1 - if(nct(ir2) .eq. 0) go to 500 - ist = ird(ir2) - isd = ip2(ir2)+1 - do 490 j2=1,isd - do 480 i2=1,isd - ist = ist+1 - ls = istart(ist) - lf = istart(ist+1)-1 - if(lf .lt. ls) go to 480 -c -c define coverings -c - kcv = 0 - i2m = i2-1 - j2m = j2-1 - do 300 ir1=1,irmp1 - if(nct(ir1) .eq. 0) go to 300 - if(ir1 .ge. ir2) go to 260 - irdp = 2**(ir2-ir1) - i1s = (i2m-1)/irdp - i1f = (i2m+1)/irdp - if = i2m+1-i1f*irdp - if(if .gt. 0) i1f = i1f+1 - j1s = (j2m-1)/irdp - j1f = (j2m+1)/irdp - jf = j2m+1-j1f*irdp - if(jf .gt. 0) j1f = j1f+1 - go to 270 - 260 irdp = 2**(ir1-ir2) - i1s = irdp*(i2m-1) - i1f = irdp*(i2m+1) - j1s = irdp*(j2m-1) - j1f = irdp*(j2m+1) - 270 ijd = ip2(ir1)+1 - i1s = max(i1s+1,1) - i1f = min(i1f+1,ijd) - j1s = max(j1s+1,1) - j1f = min(j1f+1,ijd) - ixh = (j1s-2)*ijd+ird(ir1) - ixs = i1s+ixh - ixf = i1f+ixh - do 290 j1=j1s,j1f - ixs = ixs+ijd - kds = istart(ixs) - ixf = ixf+ijd - kdf = istart(ixf+1)-1 - if(kdf .lt. kds) go to 290 - do 280 kd=kds,kdf - kcv = kcv+1 - kh(kcv) = ifinal(kd) - 280 continue - 290 continue - 300 continue - do 310 icv=1,10 - if(kcv .le. ncv(icv)) go to 310 - ncv(icv) = kcv - go to 320 - 310 continue -c -c - 320 do 470 ldo=ls,lf - l = ifinal(ldo) - ith = itype(l) - if(ith .eq. 0) go to 470 - ltp(1) = 0 - ltp(2) = 0 - ltp(3) = 0 - id1 = ith/100 - ith = ith-100*id1 - id2 = ith/10 - id3 = ith-10*id2 - if(id1 .ne. 0) ltp(id1) = 1 - if(id2 .ne. 0) ltp(id2) = 1 - if(id3 .ne. 0) ltp(id3) = 1 -c if((ith.eq.123) .or. (ith.eq.12) .or.(ith.eq.13)) ltp(1) = 1 -c if((ith.eq.123) .or. (ith.eq.23) .or.(ith.eq.12)) ltp(2) = 1 -c if((ith.eq.123) .or. (ith.eq.13) .or.(ith.eq.23)) ltp(3) = 1 - do 460 ns=1,3 -c go to (101,102,103),ns - - select case(ns) - case(1) - goto 101 - case(2) - goto 102 - case(3) - goto 103 - end select - - 101 if(ltp(ns) .eq. 0) go to 460 - px4 = px1(l) - py4 = py1(l) - px5 = px2(l) - py5 = py2(l) - x4 = x1(l) - y4 = y1(l) - z4 = z1(l) - x5 = x2(l) - y5 = y2(l) - z5 = z2(l) - go to 105 - 102 if(ltp(ns) .eq. 0) go to 460 - px4 = px2(l) - py4 = py2(l) - px5 = px3(l) - py5 = py3(l) - x4 = x2(l) - y4 = y2(l) - z4 = z2(l) - x5 = x3(l) - y5 = y3(l) - z5 = z3(l) - go to 105 - 103 if(ltp(ns) .eq. 0) go to 460 - px4 = px1(l) - py4 = py1(l) - px5 = px3(l) - py5 = py3(l) - x4 = x1(l) - y4 = y1(l) - z4 = z1(l) - x5 = x3(l) - y5 = y3(l) - z5 = z3(l) - 105 x54 = px5-px4 - y54 = py5-py4 - nseg = 0 - do 440 kd=1,kcv - k = kh(kd) - c17 = vx1(k)*y54-vy1(k)*x54 - c27 = vx2(k)*y54-vy2(k)*x54 - c37 = vx3(k)*y54-vy3(k)*x54 - c14 = vy1(k)*(px4-px1(k))-vx1(k)*(py4-py1(k)) - c25 = vy2(k)*(px4-px2(k))-vx2(k)*(py4-py2(k)) - c36 = vy3(k)*(px4-px3(k))-vx3(k)*(py4-py3(k)) - tmin = 0. - tmax = 1. - if(c17) 151,152,153 - 151 tmax = amin1(c14/c17,tmax) - go to 154 - 152 if(c14) 154,440,440 - 153 tmin = amax1(c14/c17,tmin) - 154 if(c27) 155,156,157 - 155 tmax = amin1(c25/c27,tmax) - go to 158 - 156 if(c25) 158,440,440 - 157 tmin = amax1(c25/c27,tmin) - 158 if(c37) 159,160,161 - 159 tmax = amin1(c36/c37,tmax) - go to 162 - 160 if(c36) 162,440,440 - 161 tmin = amax1(c36/c37,tmin) - 162 if(tmax-tmin .lt. .00001) go to 440 - xpl = x4+tmin*(x5-x4) - ypl = y4+tmin*(y5-y4) - zpl = z4+tmin*(z5-z4) - xpr = x4+tmax*(x5-x4) - ypr = y4+tmax*(y5-y4) - zpr = z4+tmax*(z5-z4) -c -c the projections of line and plane intersect -c now determine if plane covers line -c - vx1t = x2(k)-x1(k) - vy1t = y2(k)-y1(k) - vz1t = z2(k)-z1(k) - vx2t = x3(k)-x1(k) - vy2t = y3(k)-y1(k) - vz2t = z3(k)-z1(k) - apl = vy1t*vz2t-vy2t*vz1t - bpl = vx2t*vz1t-vx1t*vz2t - cpl = vx1t*vy2t-vx2t*vy1t - dpl = apl*x1(k)+bpl*y1(k)+cpl*z1(k) - vx3t = xpl-xeye - vy3t = ypl-yeye - vz3t = zpl-zeye - den = apl*vx3t+bpl*vy3t+cpl*vz3t - til = 0. - if(den .eq. 0.) go to 410 - til = (dpl-apl*xeye-bpl*yeye-cpl*zeye)/den - 410 vx3t = xpr-xeye - vy3t = ypr-yeye - vz3t = zpr-zeye - den = apl*vx3t+bpl*vy3t+cpl*vz3t - tir = 0. - if(den .eq. 0.) go to 412 - tir = (dpl-apl*xeye-bpl*yeye-cpl*zeye)/den - 412 if(til.ge..99999.and.tir.ge..99999) go to 440 - if(til.lt.1..and.tir.lt.1.) go to 164 - vx3t = xpr-xpl - vy3t = ypr-ypl - vz3t = zpr-zpl - den = apl*vx3t+bpl*vy3t+cpl*vz3t - tim = 0. - if(den .eq. 0.) go to 414 - tim = (dpl-apl*xpl-bpl*ypl-cpl*zpl)/den - 414 thold = tmin+tim*(tmax-tmin) - if(til.ge.1.) go to 163 - tmax = thold - go to 164 - 163 tmin = thold - 164 nseg = nseg+1 - tl(nseg) = tmin - tr(nseg) = tmax - 440 continue - maxs = max0(maxs,nseg) - if(nseg-1)171,180,172 - 171 call line(px4,py4,px5,py5) - go to 460 -c -c order the segments according to left end point tl(k) -c - 172 do 173 k=2,nseg - do 173 i=k,nseg - if(tl(k-1).le.tl(i)) go to 173 - tlh = tl(k-1) - trh = tr(k-1) - tl(k-1) = tl(i) - tr(k-1) = tr(i) - tl(i) = tlh - tr(i) = trh - 173 continue -c -c eliminate segment overlap -c - k1 = 1 - k2 = 1 - 174 k2 = k2+1 - if(k2.gt.nseg) go to 176 - if(tr(k1).lt.tl(k2)) go to 175 - tr(k1) = amax1(tr(k1),tr(k2)) - go to 174 - 175 k1 = k1+1 - tl(k1) = tl(k2) - tr(k1) = tr(k2) - go to 174 - 176 nseg = k1 -c -c plot all segments of the line -c - 180 do 181 ks =1,nseg - kb = nseg-ks+1 - tl(kb+1) = tr(kb) - tr(kb) = tl(kb) - 181 continue - tl(1) = 0. - tr(nseg+1) = 1. - nsegp = nseg+1 - do 450 k=1,nsegp - if(abs(tr(k)-tl(k)).lt..000001) go to 450 - xa = px4+tl(k)*(px5-px4) - ya = py4+tl(k)*(py5-py4) - xb = px4+tr(k)*(px5-px4) - yb = py4+tr(k)*(py5-py4) - call line(xa,ya,xb,yb) - 450 continue - 460 continue - 470 continue - 480 continue - 490 continue - 500 continue -c write(6,903) tl1,tl2 - 903 format(' time to cover', e15.6/ - 1 ' time to test ', e15.6) -c write(6,904) maxs - 904 format(' maximum number of segments', i5) -c write(6,250) (ncv(icv),icv=1,10) - 250 format(' the ten largest coverings'/(10i5)) - call frame - end - subroutine prjct(init,xeye,yeye,zeye,x,y,z,px,py) -c -c subroutine prjct projects the point x,y,z onto a plane through -c the origin that is perpendicular to a line between the origin -c and the eye. the projection is along the line between the eye -c and the point x,y,z. px and py are the coordinates of the -c projection in the plane. -c (version 2 , 12-10-82) -c - save - if(init.ne.0) go to 1 - rads1 = xeye**2+yeye**2 - rads2 = rads1+zeye**2 - d1 = sqrt(rads1) - d2 = sqrt(rads2) - if(d1.ne.0.) go to 2 - cx1 = 1. - cy1 = 0. - cx2 = 0. - cy2 = 1. - cz2 = 0. - cx3 = 0. - cy3 = 0. - cz3 = 1. - return - 2 cx1 = -yeye/d1 - cy1 = xeye/d1 - cx2 = -xeye*zeye/(d1*d2) - cy2 = -yeye*zeye/(d1*d2) - cz2 = d1/d2 - cx3 = xeye/d2 - cy3 = yeye/d2 - cz3 = zeye/d2 - return - 1 x1 = cx1*x+cy1*y - y1 = cx2*x+cy2*y+cz2*z - z1 = cx3*x+cy3*y+cz3*z - ratio = d2/(d2-z1) - px = ratio*x1 - py = ratio*y1 - return - end - subroutine box(isd,istart,next,l,list) - dimension istart(isd,isd),next(1),list(1) - do 30 jd=1,isd - do 10 id=1,isd - idx = istart(id,jd) - istart(id,jd) = l+1 - if(idx .eq. 0) go to 10 - 20 l = l+1 - list(l) = idx - if(next(idx) .eq. 0) go to 10 - idx = next(idx) - go to 20 - 10 continue - 30 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapec.f deleted file mode 100755 index 2b08f00c4..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapec.f +++ /dev/null @@ -1,505 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vlapec.f -c -c this file includes documentation and code for -c subroutine vlapec i -c -c ... files which must be loaded with vlapec.f -c -c sphcom.f, hrfft.f, vhaec.f, vhsec.f -c -c -c subroutine vlapec(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhsec,lvhsec,work,lwork,ierror) -c -c -c subroutine vlapec computes the vector laplacian of the vector field -c (v,w) in (vlap,wlap) (see the definition of the vector laplacian at -c the output parameter description of vlap,wlap below). w and wlap -c are east longitudinal components of the vectors. v and vlap are -c colatitudinal components of the vectors. br,bi,cr, and ci are the -c vector harmonic coefficients of (v,w). these must be precomputed by -c vhaec and are input parameters to vlapec. the laplacian components -c in (vlap,wlap) have the same symmetry or lack of symmetry about the -c equator as (v,w). the input parameters ityp,nt,mdbc,nbdc must have -c the same values used by vhaec to compute br,bi,cr, and ci for (v,w). -c vlap(i,j) and wlap(i,j) are given on the sphere at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c for i=1,...,nlat and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for j=1,...,nlon. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhaec to compute the coefficients br,bi,cr, and ci for the -c vector field (v,w). ityp is set as follows: -c -c = 0 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c -c = 1 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the vorticity of (v,w) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (vlap,wlap) -c is also zero. -c -c -c = 2 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the divergence of (v,w) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c = 3 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 5 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c = 6 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 8 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c nt nt is the number of vector fields (v,w). some computational -c efficiency is obtained for multiple fields. in the program -c that calls vlapec, the arrays vlap,wlap,br,bi,cr and ci -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute the vector laplacian for each field. -c the third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description -c of the remaining parameters is simplified by assuming that nt=1 -c or that all arrays are two dimensional. -c -c idvw the first dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapec. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapec. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaec. -c br,bi,cr and ci must be computed by vhaec prior to calling -c vlapec. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapec. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapec. ndbc must be at -c least nlat. -c -c wvhsec an array which must be initialized by subroutine vhseci. -c once initialized, wvhsec -c can be used repeatedly by vlapec as long as nlat and nlon -c remain unchanged. wvhsec must not be altered between calls -c of vlapec. -c -c lvhsec the dimension of the array wvhsec as it appears in the -c program that calls vlapec. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c then lvhsec must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 - -c (see ierror=9 below). -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vlapec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c -c if ityp .le. 2 then -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 let -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(4*nt*l1+1) -c -c will suffice as a minimum length for lwork -c (see ierror=10 below) -c -c ************************************************************** -c -c output parameters -c -c -c vlap, two or three dimensional arrays (see input parameter nt) that -c wlap contain the vector laplacian of the field (v,w). wlap(i,j) is -c the east longitude component and vlap(i,j) is the colatitudinal -c component of the vector laplacian. the definition of the -c vector laplacian follows: -c -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let del2 be the scalar -c laplacian operator -c -c del2(s) = [d(sint*d(s)/dtheta)/dtheta + -c 2 2 -c d (s)/dlambda /sint]/sint -c -c then the vector laplacian opeator -c -c dvel2(v,w) = (vlap,wlap) -c -c is defined by -c -c vlap = del2(v) - (2*cost*dw/dlambda + v)/sint**2 -c -c wlap = del2(w) + (2*cost*dv/dlambda - w)/sint**2 -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhsec -c -c = 10 error in the specification of lwork (lwork < lwkmin) -c -c -c ********************************************************************** -c -c end of documentation for vlapec -c -c ********************************************************************** -c - subroutine vlapec(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi, - +cr,ci,mdbc,ndbc,wvhsec,lvhsec,work,lwork,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsec(lvhsec),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid -c -c check saved work space -c - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 - if (lvhsec .lt. lwmin) return -c -c verify unsaved work space length -c - ierror = 10 - mn = mmax*nlat*nt - if(ityp.lt.3) then -c no symmetry - if (ityp.eq.0) then -c br,bi,cr,ci nonzero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+4*mn - else -c br,bi or cr,ci zero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+2*mn - end if - else -c symmetry about equator - if (ityp.eq.3 .or. ityp.eq.6) then -c br,bi,cr,ci nonzero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat - else -c br,bi or cr,ci zero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat - end if - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - liwk = lwork-4*mn-nlat - call vlapec1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhsec,lvhsec,work(iwk),liwk,ierror) - return - end - - subroutine vlapec1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap, - +bilap,crlap,cilap,mmax,fnn,mdb,ndb,br,bi,cr,ci,wsave,lwsav, - +wk,lwk,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension fnn(nlat),brlap(mmax,nlat,nt),bilap(mmax,nlat,nt) - dimension crlap(mmax,nlat,nt),cilap(mmax,nlat,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension cr(mdb,ndb,nt),ci(mdb,ndb,nt) - dimension wsave(lwsav),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -fn*(fn+1.) - 1 continue -c -c set laplacian coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (vlap,wlap) -c - call vhsec(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap,bilap, - + crlap,cilap,mmax,nlat,wsave,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapes.f deleted file mode 100755 index 2cd958a03..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapes.f +++ /dev/null @@ -1,485 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vlapes.f -c -c this file includes documentation and code for -c subroutine vlapes i -c -c ... files which must be loaded with vlapes.f -c -c sphcom.f, hrfft.f, vhaes.f, vhses.f -c -c -c -c -c subroutine vlapes(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhses,lvhses,work,lwork,ierror) -c -c -c subroutine vlapes computes the vector laplacian of the vector field -c (v,w) in (vlap,wlap) (see the definition of the vector laplacian at -c the output parameter description of vlap,wlap below). w and wlap -c are east longitudinal components of the vectors. v and vlap are -c colatitudinal components of the vectors. br,bi,cr, and ci are the -c vector harmonic coefficients of (v,w). these must be precomputed by -c vhaes and are input parameters to vlapes. the laplacian components -c in (vlap,wlap) have the same symmetry or lack of symmetry about the -c equator as (v,w). the input parameters ityp,nt,mdbc,nbdc must have -c the same values used by vhaes to compute br,bi,cr, and ci for (v,w). -c vlap(i,j) and wlap(i,j) are given on the sphere at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c for i=1,...,nlat and east longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c for j=1,...,nlon. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhaes to compute the coefficients br,bi,cr, and ci for the -c vector field (v,w). ityp is set as follows: -c -c = 0 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c -c = 1 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the vorticity of (v,w) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (vlap,wlap) -c is also zero. -c -c -c = 2 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the divergence of (v,w) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c = 3 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 5 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c = 6 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 8 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c nt nt is the number of vector fields (v,w). some computational -c efficiency is obtained for multiple fields. in the program -c that calls vlapes, the arrays vlap,wlap,br,bi,cr and ci -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute the vector laplacian for each field. -c the third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description -c of the remaining parameters is simplified by assuming that nt=1 -c or that all arrays are two dimensional. -c -c idvw the first dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapes. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapes. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaes. -c br,bi,cr and ci must be computed by vhaes prior to calling -c vlapes. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapes. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapes. ndbc must be at -c least nlat. -c -c wvhses an array which must be initialized by subroutine vhsesi. -c once initialized, vhses -c can be used repeatedly by vlapes as long as nlat and nlon -c remain unchanged. wvhses must not be altered between calls -c of vlapes. -c -c lvhses the dimension of the array wvhses as it appears in the -c program that calls vlapes. let -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c then lvhses must be greater than or equal -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vlapes. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 then -c -c (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) -c -c will suffice as a length for lwork. -c -c ************************************************************** -c -c output parameters -c -c -c vlap, two or three dimensional arrays (see input parameter nt) that -c wlap contain the vector laplacian of the field (v,w). wlap(i,j) is -c the east longitude component and vlap(i,j) is the colatitudinal -c component of the vector laplacian. the definition of the -c vector laplacian follows: -c -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let del2 be the scalar -c laplacian operator -c -c del2(s) = [d(sint*d(s)/dtheta)/dtheta + -c 2 2 -c d (s)/dlambda /sint]/sint -c -c then the vector laplacian opeator -c -c dvel2(v,w) = (vlap,wlap) -c -c is defined by -c -c vlap = del2(v) - (2*cost*dw/dlambda + v)/sint**2 -c -c wlap = del2(w) + (2*cost*dv/dlambda - w)/sint**2 -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhses -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for vlapes -c -c ********************************************************************** -c - subroutine vlapes(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi, - +cr,ci,mdbc,ndbc,wvhses,lvhses,work,lwork,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhses(lvhses),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lsavmin = lzimn+lzimn+nlon+15 - if(lvhses .lt. lsavmin) return -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - l2 = (nlat+1)/2 - l1 = min0(nlat,nlon/2+1) - if (ityp .le. 2) then - lwkmin = (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) - else - lwkmin = (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - liwk = lwork-4*mn-nlat - call vlapes1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhses,lvhses,work(iwk),liwk,ierror) - return - end - - subroutine vlapes1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap, - +bilap,crlap,cilap,mmax,fnn,mdb,ndb,br,bi,cr,ci,wsave,lsave, - +wk,lwk,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension fnn(nlat),brlap(mmax,nlat,nt),bilap(mmax,nlat,nt) - dimension crlap(mmax,nlat,nt),cilap(mmax,nlat,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension cr(mdb,ndb,nt),ci(mdb,ndb,nt) - dimension wsave(lsave),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -fn*(fn+1.) - 1 continue -c -c set laplacian coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (vlap,wlap) -c - call vhses(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap,bilap, - + crlap,cilap,mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapgc.f deleted file mode 100755 index a4571d252..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapgc.f +++ /dev/null @@ -1,496 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c ... file vlapgc.f -c -c this file includes documentation and code for -c subroutine vlapgc i -c -c ... files which must be loaded with vlapgc.f -c -c sphcom.f, hrfft.f, vhagc.f, vhsgc.f, gaqd.f -c -c -c subroutine vlapgc(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhsgc,lvhsgc,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients (br,bi,cr,ci) -c precomputed by subroutine vhagc for a vector field (v,w), subroutine -c vlapgc computes the vector laplacian of the vector field (v,w) -c in (vlap,wlap) (see the definition of the vector laplacian at -c the output parameter description of vlap,wlap below). w and wlap -c are east longitudinal components of the vectors. v and vlap are -c colatitudinal components of the vectors. the laplacian components -c in (vlap,wlap) have the same symmetry or lack of symmetry about the -c equator as (v,w). the input parameters ityp,nt,mdbc,nbdc must have -c the same values used by vhagc to compute br,bi,cr, and ci for (v,w). -c vlap(i,j) and wlap(i,j) are given on the sphere at the gaussian -c colatitude theta(i) (see nlat as input parameter) and east longitude -c lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat and j=1,...,nlon. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhagc to compute the coefficients br,bi,cr, and ci for the -c vector field (v,w). ityp is set as follows: -c -c = 0 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c -c = 1 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the vorticity of (v,w) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (vlap,wlap) -c is also zero. -c -c -c = 2 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the divergence of (v,w) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c = 3 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 5 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c = 6 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 8 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c nt nt is the number of vector fields (v,w). some computational -c efficiency is obtained for multiple fields. in the program -c that calls vlapgc, the arrays vlap,wlap,br,bi,cr and ci -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute the vector laplacian for each field. -c the third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description -c of the remaining parameters is simplified by assuming that nt=1 -c or that all arrays are two dimensional. -c -c idvw the first dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapgc. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapgc. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhagc. -c br,bi,cr and ci must be computed by vhagc prior to calling -c vlapgc. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapgc. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapgc. ndbc must be at -c least nlat. -c -c wvhsgc an array which must be initialized by subroutine vhsgci. -c once initialized, wvhsgc -c can be used repeatedly by vlapgc as long as nlat and nlon -c remain unchanged. wvhsgc must not be altered between calls -c of vlapgc. -c -c lvhsgc the dimension of the array wvhsgc as it appears in the -c program that calls vhagc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgc must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vlapgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 let -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) + nlat*(4*nt*l1+1) -c -c will suffice as a minimum length for lwork -c (see ierror=10 below) -c (see ierror=10 below) -c -c ************************************************************** -c -c output parameters -c -c -c vlap, two or three dimensional arrays (see input parameter nt) that -c wlap contain the vector laplacian of the field (v,w). wlap(i,j) is -c the east longitude component and vlap(i,j) is the colatitudinal -c component of the vector laplacian. the definition of the -c vector laplacian follows: -c -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let del2 be the scalar -c laplacian operator -c -c del2(s) = [d(sint*d(s)/dtheta)/dtheta + -c 2 2 -c d (s)/dlambda /sint]/sint -c -c then the vector laplacian opeator -c -c dvel2(v,w) = (vlap,wlap) -c -c is defined by -c -c vlap = del2(v) - (2*cost*dw/dlambda + v)/sint**2 -c -c wlap = del2(w) + (2*cost*dv/dlambda - w)/sint**2 -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhsgc -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for vlapgc -c -c ********************************************************************** -c - subroutine vlapgc(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi, - +cr,ci,mdbc,ndbc,wvhsgc,lvhsgc,work,lwork,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsgc(lvhsgc),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid -c lsavmin = lzimn+lzimn+nlon+15 -c if(lsave .lt. lsavmin) return - - l1 = min0(nlat,(nlon+1)/2) - l2 = (nlat+1)/2 - lwmin = 4*nlat*l2+3*max0(l1-2,0)*(2*nlat-l1-1)+nlon+15 - if (lvhsgc .lt. lwmin) return - -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - if(ityp.lt.3) then -c no symmetry - if (ityp.eq.0) then -c br,bi,cr,ci nonzero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+4*mn - else -c br,bi or cr,ci zero - lwkmin = nlat*(2*nt*nlon+max0(6*imid,nlon)+1)+2*mn - end if - else -c symmetry about equator - if (ityp.eq.3 .or. ityp.eq.6) then -c br,bi,cr,ci nonzero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+4*mn+nlat - else -c br,bi or cr,ci zero - lwkmin = imid*(2*nt*nlon+max0(6*nlat,nlon))+2*mn+nlat - end if - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - liwk = lwork-4*mn-nlat - call vlapgc1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhsgc,lvhsgc,work(iwk),liwk,ierror) - return - end - - subroutine vlapgc1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap, - +bilap,crlap,cilap,mmax,fnn,mdb,ndb,br,bi,cr,ci,wsave,lwsav, - +wk,lwk,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension fnn(nlat),brlap(mmax,nlat,nt),bilap(mmax,nlat,nt) - dimension crlap(mmax,nlat,nt),cilap(mmax,nlat,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension cr(mdb,ndb,nt),ci(mdb,ndb,nt) - dimension wsave(lwsav),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -fn*(fn+1.) - 1 continue -c -c set laplacian coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (vlap,wlap) -c - call vhsgc(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap,bilap, - + crlap,cilap,mmax,nlat,wsave,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapgs.f deleted file mode 100755 index 95f4b5ded..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vlapgs.f +++ /dev/null @@ -1,478 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vlapgs.f -c -c this file includes documentation and code for -c subroutine vlapgs i -c -c ... files which must be loaded with vlapgs.f -c -c sphcom.f, hrfft.f, vhags.f, vhsgs.f, gaqd.f -c -c -c -c subroutine vlapgs(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi,cr,ci, -c +mdbc,ndbc,wvhsgs,lvhsgs,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients (br,bi,cr,ci) -c precomputed by subroutine vhags for a vector field (v,w), subroutine -c vlapgs computes the vector laplacian of the vector field (v,w) -c in (vlap,wlap) (see the definition of the vector laplacian at -c the output parameter description of vlap,wlap below). w and wlap -c are east longitudinal components of the vectors. v and vlap are -c colatitudinal components of the vectors. the laplacian components -c in (vlap,wlap) have the same symmetry or lack of symmetry about the -c equator as (v,w). the input parameters ityp,nt,mdbc,nbdc must have -c the same values used by vhags to compute br,bi,cr, and ci for (v,w). -c vlap(i,j) and wlap(i,j) are given on the sphere at the gaussian -c colatitude theta(i) (see nlat as input parameter) and east longitude -c lambda(j) = (j-1)*2*pi/nlon for i=1,...,nlat and j=1,...,nlon. -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct longitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp this parameter should have the same value input to subroutine -c vhags to compute the coefficients br,bi,cr, and ci for the -c vector field (v,w). ityp is set as follows: -c -c = 0 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c -c -c = 1 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the vorticity of (v,w) is zero so the coefficients cr and -c ci are zero and are not used. the vorticity of (vlap,wlap) -c is also zero. -c -c -c = 2 no symmetries exist in (v,w) about the equator. (vlap,wlap) -c is computed and stored on the entire sphere in the arrays -c vlap(i,j) and wlap(i,j) for i=1,...,nlat and j=1,...,nlon. -c the divergence of (v,w) is zero so the coefficients br and -c bi are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c = 3 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 5 w is antisymmetric and v is symmetric about the equator. -c consequently wlap is antisymmetric and vlap is symmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c = 6 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c vorticity of (v,w) is zero so the coefficients cr,ci are -c zero and are not used. the vorticity of (vlap,wlap) is -c also zero. -c -c = 8 w is symmetric and v is antisymmetric about the equator. -c consequently wlap is symmetric and vlap is antisymmetric. -c (vlap,wlap) is computed and stored on the northern -c hemisphere only. if nlat is odd, storage is in the arrays -c vlap(i,j),wlap(i,j) for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even, storage is in the arrays vlap(i,j), -c wlap(i,j) for i=1,...,nlat/2 and j=1,...,nlon. the -c divergence of (v,w) is zero so the coefficients br,bi -c are zero and are not used. the divergence of (vlap,wlap) -c is also zero. -c -c -c nt nt is the number of vector fields (v,w). some computational -c efficiency is obtained for multiple fields. in the program -c that calls vlapgs, the arrays vlap,wlap,br,bi,cr and ci -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple vector synthesis will -c be performed to compute the vector laplacian for each field. -c the third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt=1. the description -c of the remaining parameters is simplified by assuming that nt=1 -c or that all arrays are two dimensional. -c -c idvw the first dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapgs. if ityp=0,1, or 2 then idvw -c must be at least nlat. if ityp > 2 and nlat is even then idvw -c must be at least nlat/2. if ityp > 2 and nlat is odd then idvw -c must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vlap and wlap as it appears -c in the program that calls vlapgs. jdvw must be at least nlon. -c -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhags. -c br,bi,cr and ci must be computed by vhags prior to calling -c vlapgs. if ityp=1,4, or 7 then cr,ci are not used and can -c be dummy arguments. if ityp=2,5, or 8 then br,bi are not -c used and can be dummy arguments. -c -c mdbc the first dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapgs. mdbc must be -c at least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndbc the second dimension of the arrays br,bi,cr and ci as it -c appears in the program that calls vlapgs. ndbc must be at -c least nlat. -c -c wvhsgs an array which must be initialized by subroutine vlapgsi -c (or equivalently by vhsgsi). once initialized, wvhsgs -c can be used repeatedly by vlapgs as long as nlat and nlon -c remain unchanged. wvhsgs must not be altered between calls -c of vlapgs. -c -c lvhsgs the dimension of the array wvhsgs as it appears in the -c program that calls vlapgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lvhsgs must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15+2*nlat -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vlapgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c if ityp .le. 2 then -c -c (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) -c -c or if ityp .gt. 2 then -c -c (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) -c -c will suffice as a length for lwork. -c -c ************************************************************** -c -c output parameters -c -c -c vlap, two or three dimensional arrays (see input parameter nt) that -c wlap contain the vector laplacian of the field (v,w). wlap(i,j) is -c the east longitude component and vlap(i,j) is the colatitudinal -c component of the vector laplacian. the definition of the -c vector laplacian follows: -c -c let cost and sint be the cosine and sine at colatitude theta. -c let d( )/dlambda and d( )/dtheta be the first order partial -c derivatives in longitude and colatitude. let del2 be the scalar -c laplacian operator -c -c del2(s) = [d(sint*d(s)/dtheta)/dtheta + -c 2 2 -c d (s)/dlambda /sint]/sint -c -c then the vector laplacian opeator -c -c dvel2(v,w) = (vlap,wlap) -c -c is defined by -c -c vlap = del2(v) - (2*cost*dw/dlambda + v)/sint**2 -c -c wlap = del2(w) + (2*cost*dv/dlambda - w)/sint**2 -c -c ierror a parameter which flags errors in input parameters as follows: -c -c = 0 no errors detected -c -c = 1 error in the specification of nlat -c -c = 2 error in the specification of nlon -c -c = 3 error in the specification of ityp -c -c = 4 error in the specification of nt -c -c = 5 error in the specification of idvw -c -c = 6 error in the specification of jdvw -c -c = 7 error in the specification of mdbc -c -c = 8 error in the specification of ndbc -c -c = 9 error in the specification of lvhsgs -c -c = 10 error in the specification of lwork -c -c -c ********************************************************************** -c -c end of documentation for vlapgs -c -c ********************************************************************** -c - subroutine vlapgs(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,br,bi, - +cr,ci,mdbc,ndbc,wvhsgs,lvhsgs,work,lwork,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension br(mdbc,ndbc,nt),bi(mdbc,ndbc,nt) - dimension cr(mdbc,ndbc,nt),ci(mdbc,ndbc,nt) - dimension wvhsgs(lvhsgs),work(lwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdbc .lt. mmax) return - ierror = 8 - if(ndbc .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - lsavmin = lzimn+lzimn+nlon+15 - if(lvhsgs .lt. lsavmin) return -c -c verify unsaved work space length -c - mn = mmax*nlat*nt - l2 = (nlat+1)/2 - l1 = mmax - if (ityp .le. 2) then - lwkmin = (2*nt+1)*nlat*nlon + nlat*(4*nt*l1+1) - else - lwkmin = (2*nt+1)*l2*nlon + nlat*(4*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers for vector laplacian coefficients -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr+mn - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then - ibr = 1 - ibi = ibr+mn - icr = ibi+mn - ici = icr - else - ibr = 1 - ibi = 1 - icr = ibi+mn - ici = icr+mn - end if - ifn = ici + mn - iwk = ifn + nlat - liwk = lwork-4*mn-nlat - call vlapgs1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,work(ibr), - +work(ibi),work(icr),work(ici),mmax,work(ifn),mdbc,ndbc,br,bi, - +cr,ci,wvhsgs,lvhsgs,work(iwk),liwk,ierror) - return - end - - subroutine vlapgs1(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap, - +bilap,crlap,cilap,mmax,fnn,mdb,ndb,br,bi,cr,ci,wsave,lsave, - +wk,lwk,ierror) - dimension vlap(idvw,jdvw,nt),wlap(idvw,jdvw,nt) - dimension fnn(nlat),brlap(mmax,nlat,nt),bilap(mmax,nlat,nt) - dimension crlap(mmax,nlat,nt),cilap(mmax,nlat,nt) - dimension br(mdb,ndb,nt),bi(mdb,ndb,nt) - dimension cr(mdb,ndb,nt),ci(mdb,ndb,nt) - dimension wsave(lsave),wk(lwk) -c -c preset coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - fnn(n) = -fn*(fn+1.) - 1 continue -c -c set laplacian coefficients from br,bi,cr,ci -c - if (ityp.eq.0 .or. ityp.eq.3 .or. ityp.eq.6) then -c -c all coefficients needed -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 4 continue - 3 continue - do 5 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 5 continue - do 6 m=2,mmax - do 7 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue - else if (ityp.eq.1 .or. ityp.eq.4 .or. ityp.eq.7) then -c -c vorticity is zero so cr,ci=0 not used -c - do 12 k=1,nt - do 13 n=1,nlat - do 14 m=1,mmax - brlap(m,n,k) = 0.0 - bilap(m,n,k) = 0.0 - 14 continue - 13 continue - do 15 n=2,nlat - brlap(1,n,k) = fnn(n)*br(1,n,k) - bilap(1,n,k) = fnn(n)*bi(1,n,k) - 15 continue - do 16 m=2,mmax - do 17 n=m,nlat - brlap(m,n,k) = fnn(n)*br(m,n,k) - bilap(m,n,k) = fnn(n)*bi(m,n,k) - 17 continue - 16 continue - 12 continue - else -c -c divergence is zero so br,bi=0 not used -c - do 22 k=1,nt - do 23 n=1,nlat - do 24 m=1,mmax - crlap(m,n,k) = 0.0 - cilap(m,n,k) = 0.0 - 24 continue - 23 continue - do 25 n=2,nlat - crlap(1,n,k) = fnn(n)*cr(1,n,k) - cilap(1,n,k) = fnn(n)*ci(1,n,k) - 25 continue - do 26 m=2,mmax - do 27 n=m,nlat - crlap(m,n,k) = fnn(n)*cr(m,n,k) - cilap(m,n,k) = fnn(n)*ci(m,n,k) - 27 continue - 26 continue - 22 continue - end if -c -c sythesize coefs into vector field (vlap,wlap) -c - call vhsgs(nlat,nlon,ityp,nt,vlap,wlap,idvw,jdvw,brlap,bilap, - + crlap,cilap,mmax,nlat,wsave,lsave,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtec.f deleted file mode 100755 index 5edb43308..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtec.f +++ /dev/null @@ -1,343 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c -c ... file vrtec.f -c -c this file includes documentation and code for -c subroutine divec i -c -c ... files which must be loaded with vrtec.f -c -c sphcom.f, hrfft.f, vhaec.f,shsec.f -c -c subroutine vrtec(nlat,nlon,isym,nt,vt,ivrt,jvrt,cr,ci,mdc,ndc, -c + wshsec,lshsec,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients cr and ci, precomputed -c by subroutine vhaec for a vector field (v,w), subroutine vrtec -c computes the vorticity of the vector field in the scalar array -c vt. vt(i,j) is the vorticity at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e., -c -c vt(i,j) = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c cr,ci were precomputed. required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine vrtes. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vorticity is -c computed on the full or half sphere as follows: -c -c = 0 -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c vorticity is neither symmetric nor antisymmetric about -c the equator. the vorticity is computed on the entire -c sphere. i.e., in the array vt(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c w is antisymmetric and v is symmetric about the equator. -c in this case the vorticity is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vt(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vt(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the vorticity is antisymmetric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vt(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vt(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c in the program that calls vrtec, the arrays cr,ci, and vort -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the vorticity for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c ivrt the first dimension of the array vt as it appears in -c the program that calls vrtec. if isym = 0 then ivrt -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then ivrt must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then ivrt must be at least (nlat+1)/2. -c -c jvrt the second dimension of the array vt as it appears in -c the program that calls vrtec. jvrt must be at least nlon. -c -c cr,ci two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaec. -c *** cr and ci must be computed by vhaec prior to calling -c vrtec. -c -c mdc the first dimension of the arrays cr and ci as it -c appears in the program that calls vrtec. mdc must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndc the second dimension of the arrays cr and ci as it -c appears in the program that calls vrtec. ndc must be at -c least nlat. -c -c wshsec an array which must be initialized by subroutine shseci. -c once initialized, -c wshsec can be used repeatedly by vrtec as long as nlon -c and nlat remain unchanged. wshsec must not be altered -c between calls of vrtec -c -c lshsec the dimension of the array wshsec as it appears in the -c program that calls vrtec. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsec must be at least -c -c 2*nlat*l2+3*((l1-2)*(nlat+nlat-l1-1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vrtec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c if isym is zero then lwork must be at least -c -c nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c -c -c ************************************************************** -c -c output parameters -c -c -c vt a two or three dimensional array (see input parameter nt) -c that contains the vorticity of the vector field (v,w) -c whose coefficients cr,ci where computed by subroutine vhaec. -c vt(i,j) is the vorticity at the colatitude point theta(i) = -c (i-1)*pi/(nlat-1) and longitude point lambda(j) = -c (j-1)*2*pi/nlon. the index ranges are defined above at the -c input parameter isym. -c -c -c ierror an error parameter which indicates fatal errors with input -c parameters when returned positive. -c = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of ivrt -c = 6 error in the specification of jvrt -c = 7 error in the specification of mdc -c = 8 error in the specification of ndc -c = 9 error in the specification of lshsec -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine vrtec(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + wshsec,lshsec,work,lwork,ierror) - - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension wshsec(lshsec),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ivrt.lt.nlat) .or. - 1 (isym.gt.0 .and. ivrt.lt.imid)) return - ierror = 6 - if(jvrt .lt. nlon) return - ierror = 7 - if(mdc .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndc .lt. nlat) return - ierror = 9 -c -c verify saved work space (same as shec) -c - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lshsec .lt. lzz1+labc+nlon+15) return - ierror = 10 -c -c verify unsaved work space (add to what shec requires) -c - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c -c set first dimension for a,b (as requried by shsec) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt -c if(lwork.lt.nln+max0(ls*nlon,3*nlat*imid)+2*mn+nlat) return - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - if (isym .eq. 0) then - lwkmin = nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call vrtec1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - +work(ia),work(ib),mab,work(is),wshsec,lshsec,work(iwk),lwk, - +ierror) - return - end - - subroutine vrtec1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + a,b,mab,sqnn,wshsec,lshsec,wk,lwk,ierror) - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wshsec(lshsec),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute vorticity scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = sqnn(n)*cr(1,n,k) - b(1,n,k) = sqnn(n)*ci(1,n,k) - 5 continue -c -c compute m>0 coefficients, use mmax from vector coef range -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*cr(m,n,k) - b(m,n,k) = sqnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into vort -c - call shsec(nlat,nlon,isym,nt,vort,ivrt,jvrt,a,b, - + mab,nlat,wshsec,lshsec,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtes.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtes.f deleted file mode 100755 index 98566b1fa..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtes.f +++ /dev/null @@ -1,330 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vrtes.f -c -c this file includes documentation and code for -c subroutine divec i -c -c ... files which must be loaded with vrtes.f -c -c sphcom.f, hrfft.f, vhaes.f,shses.f -c -c subroutine vrtes(nlat,nlon,isym,nt,vt,ivrt,jvrt,cr,ci,mdc,ndc, -c + wshses,lshses,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients cr and ci, precomputed -c by subroutine vhaes for a vector field (v,w), subroutine vrtes -c computes the vorticity of the vector field in the scalar array -c vt. vt(i,j) is the vorticity at the colatitude -c -c theta(i) = (i-1)*pi/(nlat-1) -c -c and longitude -c -c lambda(j) = (j-1)*2*pi/nlon -c -c on the sphere. i.e., -c -c vt(i,j) = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c cr,ci were precomputed. required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine vrtec. -c -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vorticity is -c computed on the full or half sphere as follows: -c -c = 0 -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c vorticity is neither symmetric nor antisymmetric about -c the equator. the vorticity is computed on the entire -c sphere. i.e., in the array vt(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c w is antisymmetric and v is symmetric about the equator. -c in this case the vorticity is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vt(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vt(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the vorticity is antisymmetric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vt(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vt(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c in the program that calls vrtes, the arrays cr,ci, and vort -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the vorticity for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c ivrt the first dimension of the array vt as it appears in -c the program that calls vrtes. if isym = 0 then ivrt -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then ivrt must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then ivrt must be at least (nlat+1)/2. -c -c jvrt the second dimension of the array vt as it appears in -c the program that calls vrtes. jvrt must be at least nlon. -c -c cr,ci two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhaes. -c *** cr and ci must be computed by vhaes prior to calling -c vrtes. -c -c mdc the first dimension of the arrays cr and ci as it -c appears in the program that calls vrtes. mdc must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndc the second dimension of the arrays cr and ci as it -c appears in the program that calls vrtes. ndc must be at -c least nlat. -c -c wshses an array which must be initialized by subroutine shsesi. -c once initialized, -c wshses can be used repeatedly by vrtes as long as nlon -c and nlat remain unchanged. wshses must not be altered -c between calls of vrtes -c -c lshses the dimension of the array wshses as it appears in the -c program that calls vrtes. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshses must be at least -c -c (l1*l2*(nlat+nlat-l1+1))/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vrtes. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c if isym = 0 then lwork must be at least -c -c nlat*((nt+1)*nlon+2*nt*l1+1) -c -c if isym > 0 then lwork must be at least -c -c (nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c vt a two or three dimensional array (see input parameter nt) -c that contains the vorticity of the vector field (v,w) -c whose coefficients cr,ci where computed by subroutine vhaes. -c vt(i,j) is the vorticity at the colatitude point theta(i) = -c (i-1)*pi/(nlat-1) and longitude point lambda(j) = -c (j-1)*2*pi/nlon. the index ranges are defined above at the -c input parameter isym. -c -c -c ierror an error parameter which indicates fatal errors with input -c parameters when returned positive. -c = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of ivrt -c = 6 error in the specification of jvrt -c = 7 error in the specification of mdc -c = 8 error in the specification of ndc -c = 9 error in the specification of lshses -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine vrtes(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + wshses,lshses,work,lwork,ierror) - - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension wshses(lshses),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ivrt.lt.nlat) .or. - 1 (isym.gt.0 .and. ivrt.lt.imid)) return - ierror = 6 - if(jvrt .lt. nlon) return - ierror = 7 - if(mdc .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndc .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lshses .lt. lpimn+nlon+15) return - ierror = 10 -c -c verify unsaved work space (add to what shses requires, file f3) -c -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - if(lwork.lt. nln+ls*nlon+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call vrtes1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - +work(ia),work(ib),mab,work(is),wshses,lshses,work(iwk),lwk, - +ierror) - return - end - - subroutine vrtes1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + a,b,mab,sqnn,wsav,lwsav,wk,lwk,ierror) - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wsav(lwsav),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = sqnn(n)*cr(1,n,k) - b(1,n,k) = sqnn(n)*ci(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*cr(m,n,k) - b(m,n,k) = sqnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into vort -c - call shses(nlat,nlon,isym,nt,vort,ivrt,jvrt,a,b, - + mab,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtgc.f deleted file mode 100755 index 378dede55..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtgc.f +++ /dev/null @@ -1,337 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vrtgc.f -c -c this file includes documentation and code for -c subroutine divec i -c -c ... files which must be loaded with vrtgc.f -c -c sphcom.f, hrfft.f, vhagc.f, shsgc.f, gaqd.f -c -c subroutine vrtgc(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, -c + wshsgc,lshsgc,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients cr and ci, precomputed -c by subroutine vhagc for a vector field (v,w), subroutine vrtgc -c computes the vorticity of the vector field in the scalar array -c vort. vort(i,j) is the vorticity at the gaussian colatitude -c theta(i) (see nlat as input parameter) and longitude -c lambda(j) = (j-1)*2*pi/nlon on the sphere. i.e., -c -c vort(i,j) = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c cr,ci were precomputed. required associated legendre polynomials -c are recomputed rather than stored as they are in subroutine vrtgs. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vorticity is -c computed on the full or half sphere as follows: -c -c = 0 -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c vorticity is neither symmetric nor antisymmetric about -c the equator. the vorticity is computed on the entire -c sphere. i.e., in the array vort(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c w is antisymmetric and v is symmetric about the equator. -c in this case the vorticity is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vort(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vort(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the vorticity is antisymmetric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vort(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vort(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c in the program that calls vrtgc, the arrays cr,ci, and vort -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the vorticity for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c ivrt the first dimension of the array vort as it appears in -c the program that calls vrtgc. if isym = 0 then ivrt -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then ivrt must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then ivrt must be at least (nlat+1)/2. -c -c jvrt the second dimension of the array vort as it appears in -c the program that calls vrtgc. jvrt must be at least nlon. -c -c cr,ci two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhagc. -c *** cr and ci must be computed by vhagc prior to calling -c vrtgc. -c -c mdc the first dimension of the arrays cr and ci as it -c appears in the program that calls vrtgc. mdc must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndc the second dimension of the arrays cr and ci as it -c appears in the program that calls vrtgc. ndc must be at -c least nlat. -c -c wshsgc an array which must be initialized by subroutine shsgci. -c once initialized, -c wshsgc can be used repeatedly by vrtgc as long as nlon -c and nlat remain unchanged. wshsgc must not be altered -c between calls of vrtgc -c -c lshsgc the dimension of the array wshsgc as it appears in the -c program that calls vrtgc. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgc must be at least -c -c nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vrtgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c if isym is zero then lwork must be at least -c -c nlat*(nlon*nt+max0(3*l2,nlon) + 2*nt*l1+1) -c -c if isym is not zero then lwork must be at least -c -c l2*(nlon*nt+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c vort a two or three dimensional array (see input parameter nt) -c that contains the vorticity of the vector field (v,w) -c whose coefficients cr,ci where computed by subroutine vhagc. -c vort(i,j) is the vorticity at the gaussian colatitude point -c theta(i) and longitude point lambda(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c isym. -c -c -c ierror an error parameter which indicates fatal errors with input -c parameters when returned positive. -c = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of ivrt -c = 6 error in the specification of jvrt -c = 7 error in the specification of mdc -c = 8 error in the specification of ndc -c = 9 error in the specification of lshsgc -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine vrtgc(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + wshsgc,lshsgc,work,lwork,ierror) - - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension wshsgc(lshsgc),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ivrt.lt.nlat) .or. - 1 (isym.gt.0 .and. ivrt.lt.imid)) return - ierror = 6 - if(jvrt .lt. nlon) return - ierror = 7 - if(mdc .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndc .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - lwmin = nlat*(2*l2+3*l1-2)+3*l1*(1-l1)/2+nlon+15 - if (lshsgc .lt. lwmin) return - ierror = 10 -c -c verify unsaved work space (add to what shses requires, file f3) -c -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon -c if(lwork.lt. nln+ls*nlon+2*mn+nlat) return - l1 = min0(nlat,(nlon+2)/2) - l2 = (nlat+1)/2 - if (isym .eq. 0) then - lwkmin = nlat*(nt*nlon+max0(3*l2,nlon)+2*nt*l1+1) - else - lwkmin = l2*(nt*nlon+max0(3*nlat,nlon)) + nlat*(2*nt*l1+1) - end if - if (lwork .lt. lwkmin) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call vrtgc1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - +work(ia),work(ib),mab,work(is),wshsgc,lshsgc,work(iwk),lwk, - +ierror) - return - end - - subroutine vrtgc1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + a,b,mab,sqnn,wsav,lwsav,wk,lwk,ierror) - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wsav(lwsav),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = sqnn(n)*cr(1,n,k) - b(1,n,k) = sqnn(n)*ci(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*cr(m,n,k) - b(m,n,k) = sqnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into vort -c - call shsgc(nlat,nlon,isym,nt,vort,ivrt,jvrt,a,b, - + mab,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtgs.f deleted file mode 100755 index d06a6494a..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vrtgs.f +++ /dev/null @@ -1,328 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vrtgs.f -c -c this file includes documentation and code for -c subroutine divgs i -c -c ... files which must be loaded with vrtgs.f -c -c sphcom.f, hrfft.f, vhgsc.f, shsgs.f, gaqd.f -c -c subroutine vrtgs(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, -c + wshsgs,lshsgs,work,lwork,ierror) -c -c given the vector spherical harmonic coefficients cr and ci, precomputed -c by subroutine vhags for a vector field (v,w), subroutine vrtgs -c computes the vorticity of the vector field in the scalar array -c vort. vort(i,j) is the vorticity at the gaussian colatitude -c theta(i) (see nlat as input parameter) and longitude -c lambda(j) = (j-1)*2*pi/nlon on the sphere. i.e., -c -c vort(i,j) = [-dv/dlambda + d(sint*w)/dtheta]/sint -c -c where sint = sin(theta(i)). w is the east longitudinal and v -c is the colatitudinal component of the vector field from which -c cr,ci were precomputed. required associated legendre polynomials -c are stored rather than recomputed as they are in subroutine vrtgc. -c -c -c input parameters -c -c nlat the number of points in the gaussian colatitude grid on the -c full sphere. these lie in the interval (0,pi) and are computed -c in radians in theta(1) <...< theta(nlat) by subroutine gaqd. -c if nlat is odd the equator will be included as the grid point -c theta((nlat+1)/2). if nlat is even the equator will be -c excluded as a grid point and will lie half way between -c theta(nlat/2) and theta(nlat/2+1). nlat must be at least 3. -c note: on the half sphere, the number of grid points in the -c colatitudinal direction is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than 3. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c -c isym a parameter which determines whether the vorticity is -c computed on the full or half sphere as follows: -c -c = 0 -c the symmetries/antsymmetries described in isym=1,2 below -c do not exist in (v,w) about the equator. in this case the -c vorticity is neither symmetric nor antisymmetric about -c the equator. the vorticity is computed on the entire -c sphere. i.e., in the array vort(i,j) for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 -c w is antisymmetric and v is symmetric about the equator. -c in this case the vorticity is symmetyric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vort(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vort(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 2 -c w is symmetric and v is antisymmetric about the equator -c in this case the vorticity is antisymmetric about the -c equator and is computed for the northern hemisphere -c only. i.e., if nlat is odd the vorticity is computed -c in the array vort(i,j) for i=1,...,(nlat+1)/2 and for -c j=1,...,nlon. if nlat is even the vorticity is computed -c in the array vort(i,j) for i=1,...,nlat/2 and j=1,...,nlon. -c -c -c nt nt is the number of scalar and vector fields. some -c computational efficiency is obtained for multiple fields. -c in the program that calls vrtgs, the arrays cr,ci, and vort -c can be three dimensional corresponding to an indexed multiple -c vector field. in this case multiple scalar synthesis will -c be performed to compute the vorticity for each field. the -c third index is the synthesis index which assumes the values -c k=1,...,nt. for a single synthesis set nt = 1. the -c description of the remaining parameters is simplified by -c assuming that nt=1 or that all the arrays are two dimensional. -c -c ivrt the first dimension of the array vort as it appears in -c the program that calls vrtgs. if isym = 0 then ivrt -c must be at least nlat. if isym = 1 or 2 and nlat is -c even then ivrt must be at least nlat/2. if isym = 1 or 2 -c and nlat is odd then ivrt must be at least (nlat+1)/2. -c -c jvrt the second dimension of the array vort as it appears in -c the program that calls vrtgs. jvrt must be at least nlon. -c -c cr,ci two or three dimensional arrays (see input parameter nt) -c that contain vector spherical harmonic coefficients -c of the vector field (v,w) as computed by subroutine vhags. -c *** cr and ci must be computed by vhags prior to calling -c vrtgs. -c -c mdc the first dimension of the arrays cr and ci as it -c appears in the program that calls vrtgs. mdc must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndc the second dimension of the arrays cr and ci as it -c appears in the program that calls vrtgs. ndc must be at -c least nlat. -c -c wshsgs an array which must be initialized by subroutine shsgsi. -c once initialized, -c wshsgs can be used repeatedly by vrtgs as long as nlon -c and nlat remain unchanged. wshsgs must not be altered -c between calls of vrtgs -c -c lshsgs the dimension of the array wshsgs as it appears in the -c program that calls vrtgs. define -c -c l1 = min0(nlat,(nlon+2)/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lshsgs must be at least -c -c nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vrtgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd. -c -c if isym = 0 then lwork must be at least -c -c nlat*((nt+1)*nlon+2*nt*l1+1) -c -c if isym > 0 then lwork must be at least -c -c (nt+1)*l2*nlon+nlat*(2*nt*l1+1) -c -c -c ************************************************************** -c -c output parameters -c -c -c vort a two or three dimensional array (see input parameter nt) -c that contains the vorticity of the vector field (v,w) -c whose coefficients cr,ci where computed by subroutine vhags. -c vort(i,j) is the vorticity at the gaussian colatitude point -c theta(i) and longitude point lambda(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c isym. -c -c -c ierror an error parameter which indicates fatal errors with input -c parameters when returned positive. -c = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of isym -c = 4 error in the specification of nt -c = 5 error in the specification of ivrt -c = 6 error in the specification of jvrt -c = 7 error in the specification of mdc -c = 8 error in the specification of ndc -c = 9 error in the specification of lshsgs -c = 10 error in the specification of lwork -c ********************************************************************** -c -c - subroutine vrtgs(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + wshsgs,lshsgs,work,lwork,ierror) - - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension wshsgs(lshsgs),work(lwork) -c -c check input parameters -c - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 4) return - ierror = 3 - if (isym.lt.0 .or. isym.gt.2) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((isym.eq.0 .and. ivrt.lt.nlat) .or. - 1 (isym.gt.0 .and. ivrt.lt.imid)) return - ierror = 6 - if(jvrt .lt. nlon) return - ierror = 7 - if(mdc .lt. min0(nlat,(nlon+1)/2)) return - mmax = min0(nlat,(nlon+2)/2) - ierror = 8 - if(ndc .lt. nlat) return - ierror = 9 - imid = (nlat+1)/2 - lpimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - l2 = (nlat+mod(nlat,2))/2 - l1 = min0((nlon+2)/2,nlat) - lp=nlat*(3*(l1+l2)-2)+(l1-1)*(l2*(2*nlat-l1)-3*l1)/2+nlon+15 - if(lshsgs.lt.lp) return - ierror = 10 -c -c verify unsaved work space (add to what shses requires, file f3) -c -c -c set first dimension for a,b (as requried by shses) -c - mab = min0(nlat,nlon/2+1) - mn = mab*nlat*nt - ls = nlat - if(isym .gt. 0) ls = imid - nln = nt*ls*nlon - if(lwork.lt. nln+ls*nlon+2*mn+nlat) return - ierror = 0 -c -c set work space pointers -c - ia = 1 - ib = ia+mn - is = ib+mn - iwk = is+nlat - lwk = lwork-2*mn-nlat - call vrtgs1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - +work(ia),work(ib),mab,work(is),wshsgs,lshsgs,work(iwk),lwk, - +ierror) - return - end - - subroutine vrtgs1(nlat,nlon,isym,nt,vort,ivrt,jvrt,cr,ci,mdc,ndc, - + a,b,mab,sqnn,wsav,lwsav,wk,lwk,ierror) - dimension vort(ivrt,jvrt,nt),cr(mdc,ndc,nt),ci(mdc,ndc,nt) - dimension a(mab,nlat,nt),b(mab,nlat,nt),sqnn(nlat) - dimension wsav(lwsav),wk(lwk) -c -c set coefficient multiplyers -c - do 1 n=2,nlat - fn = float(n-1) - sqnn(n) = sqrt(fn*(fn+1.)) - 1 continue -c -c compute divergence scalar coefficients for each vector field -c - do 2 k=1,nt - do 3 n=1,nlat - do 4 m=1,mab - a(m,n,k) = 0.0 - b(m,n,k) = 0.0 - 4 continue - 3 continue -c -c compute m=0 coefficients -c - do 5 n=2,nlat - a(1,n,k) = sqnn(n)*cr(1,n,k) - b(1,n,k) = sqnn(n)*ci(1,n,k) - 5 continue -c -c compute m>0 coefficients -c - mmax = min0(nlat,(nlon+1)/2) - do 6 m=2,mmax - do 7 n=m,nlat - a(m,n,k) = sqnn(n)*cr(m,n,k) - b(m,n,k) = sqnn(n)*ci(m,n,k) - 7 continue - 6 continue - 2 continue -c -c synthesize a,b into vort -c - call shsgs(nlat,nlon,isym,nt,vort,ivrt,jvrt,a,b, - + mab,nlat,wsav,lwsav,wk,lwk,ierror) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vshifte.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vshifte.f deleted file mode 100755 index 685057839..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vshifte.f +++ /dev/null @@ -1,603 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vshifte.f contains code and documentation for subroutine vshifte -c and its initialization subroutine vshifti -c -c ... required files -c -c hrfft.f -c -c subroutine vshifte(ioff,nlon,nlat,uoff,voff,ureg,vreg, -c + wsave,lsave,work,lwork,ierror) -c -c *** purpose -c -c subroutine vshifte does a highly accurate 1/2 grid increment shift -c in both longitude and latitude of equally spaced vector data on the -c sphere. data is transferred between the nlon by nlat "offset grid" -c in (uoff,voff) (which excludes poles) and the nlon by nlat+1 "regular -c grid" in (ureg,vreg) (which includes poles). the transfer can go from -c (uoff,voff) to (ureg,vreg) or vice versa (see ioff). the grids which -c underly the vector fields are described below. the north and south -c pole are at 0.5*pi and-0.5*pi radians respectively (pi=4.*atan(1.)). -c uoff and ureg are the east longitudinal vector data components. voff -c and vreg are the latitudinal vector data components. -c -c subroutine sshifte can be used to shift scalar data on the sphere. -c notice that scalar and vector quantities are fundamentally different -c on the sphere. for example, vectors are discontinuous and multiple -c valued at the poles. scalars are continuous and single valued at the -c poles. erroneous results would be produced if one attempted to shift -c vector fields with subroutine sshifte applied to each component of -c of the vector. -c -c *** grid descriptions -c -c let dlon = (pi+pi)/nlon and dlat = pi/nlat be the uniform grid -c increments in longitude and latitude -c -c offset grid -c -c the "1/2 increment offset" grid (long(j),lat(i)) on which uoff(j,i) -c and voff(j,i) are given (ioff=0) or generated (ioff=1) is -c -c long(j) =0.5*dlon + (j-1)*dlon (j=1,...,nlon) -c -c and -c -c lat(i) = -0.5*pi + 0.5*dlat + (i-1)*dlat (i=1,...,nlat) -c -c the data in (uoff,voff) is "shifted" one half a grid increment in both -c longitude and latitude and excludes the poles. each uoff(j,1),voff(j,1) -c is given at latitude -pi/2+dlat/2. uoff(j,nlat),voff(j,nlat) is -c given at pi/2-dlat/2 (1/2 a grid increment away from the poles). -c uoff(1,i),voff(1,i) is given at longitude dlon/2. each uoff(nlon,i), -c voff(nlon,i) is given at longitude 2*pi-dlon/2. -c -c regular grid -c -c let dlat,dlon be as above. then the nlon by nlat+1 grid on which -c ureg(j,i),vreg(j,i) are generated (ioff=0) or given (ioff=1) is -c -c lone(j) = (j-1)*dlon (j=1,...,nlon) -c -c and -c -c late(i) = -0.5*pi + (i-1)*dlat (i=1,...,nlat+1) -c -c values in ureg,vreg include the poles and start at zero degrees -c longitude and at the south pole this is the "usual" equally spaced -c grid in geophysical coordinates. -c -c *** remark -c -c subroutine vshifte can be used in conjunction with subroutine trvsph -c when transferring vector data from an equally spaced "1/2 increment -c offset" grid to a gaussian or equally spaced grid (which includes poles) -c of any resolution. this problem (personal communication with dennis -c shea) is encountered in geophysical modeling and data analysis. -c -c *** method -c -c fast fourier transform software from spherepack2 and trigonometric -c identities are used to accurately "shift" periodic vectors half a -c grid increment in latitude and longitude. latitudinal shifts are -c accomplished by setting periodic 2*nlat vectors over the pole for each -c longitude. vector values must be negated on one side of the pole -c to maintain periodicity prior to the 2*nlat shift over the poles. -c when nlon is odd, the 2*nlat latitudinal shift requires an additional -c longitude shift to obtain symmetry necessary for full circle shifts -c over the poles. finally longitudinal shifts are executed for each -c shifted latitude. -c -c *** argument description -c -c ... ioff -c -c ioff = 0 if values on the offset grid in (uoff,voff) are given and -c values on the regular grid in (ureg,vreg) are to be generated. -c -c ioff = 1 if values on the regular grid in (ureg,vreg) are given and -c values on the offset grid in (uoff,voff) are to be generated. -c -c ... nlon -c -c the number of longitude points on both the "offset" and "regular" -c uniform grid in longitude (see "grid description" above). nlon -c is also the first dimension of uoff,voff,ureg,vreg. nlon determines -c the grid increment in longitude as dlon = 2.*pi/nlon. for example, -c nlon = 144 for a 2.5 degree grid. nlon can be even or odd and must -c be greater than or equal to 4. the efficiency of the computation -c is improved when nlon is a product of small primes. -c -c ... nlat -c -c the number of latitude points on the "offset" uniform grid. nlat+1 -c is the number of latitude points on the "regular" uniform grid (see -c "grid description" above). nlat is the second dimension of uoff,voff. -c nlat+1 must be the second dimension of ureg,vreg in the program -c calling vshifte. nlat determines the grid in latitude as pi/nlat. -c for example, nlat = 36 for a five degree grid. nlat must be at least 3. -c -c ... uoff -c -c a nlon by nlat array that contains the east longitudinal vector -c data component on the offset grid described above. uoff is a -c given input argument if ioff=0. uoff is a generated output -c argument if ioff=1. -c -c ... voff -c -c a nlon by nlat array that contains the latitudinal vector data -c component on the offset grid described above. voff is a given -c input argument if ioff=0. voff is a generated output argument -c if ioff=1. -c -c ... ureg -c -c a nlon by nlat+1 array that contains the east longitudinal vector -c data component on the regular grid described above. ureg is a given -c input argument if ioff=1. ureg is a generated output argument -c if ioff=0. -c -c ... vreg -c -c a nlon by nlat+1 array that contains the latitudinal vector data -c component on the regular grid described above. vreg is a given -c input argument if ioff=1. vreg is a generated output argument -c if ioff=0. -c -c ... wsav -c -c a real saved work space array that must be initialized by calling -c subroutine vshifti(ioff,nlon,nlat,wsav,ier) before calling vshifte. -c wsav can then be used repeatedly by vshifte as long as ioff, nlon, -c and nlat do not change. this bypasses redundant computations and -c saves time. undetectable errors will result if vshifte is called -c without initializing wsav whenever ioff, nlon, or nlat change. -c -c ... lsav -c -c the length of the saved work space wsav in the routine calling vshifte -c and sshifti. lsave must be greater than or equal to 2*(2*nlat+nlon+16). -c -c ... work -c -c a real unsaved work space -c -c ... lwork -c -c the length of the unsaved work space in the routine calling vshifte -c if nlon is even then lwork must be greater than or equal to -c -c 2*nlon*(nlat+1) -c -c if nlon is odd then lwork must be greater than or equal to -c -c nlon*(5*nlat+1) -c -c ... ier -c -c indicates errors in input parameters -c -c = 0 if no errors are detected -c -c = 1 if ioff is not equal to 0 or 1 -c -c = 2 if nlon < 4 -c -c = 3 if nlat < 3 -c -c = 4 if lsave < 2*(nlon+2*nlat)+32 -c -c = 5 if lwork < 2*nlon*(nlat+1) for nlon even or -c lwork < nlon*(5*nlat+1) for nlon odd -c -c *** end of vshifte documentation -c -c subroutine vshifti(ioff,nlon,nlat,lsav,wsav,ier) -c -c subroutine vshifti initializes the saved work space wsav -c for ioff and nlon and nlat (see documentation for vshifte). -c vshifti must be called before vshifte whenever ioff or nlon -c or nlat change. -c -c ... ier -c -c = 0 if no errors with input arguments -c -c = 1 if ioff is not 0 or 1 -c -c = 2 if nlon < 4 -c -c = 3 if nlat < 3 -c -c = 4 if lsav < 2*(2*nlat+nlon+16) -c -c *** end of vshifti documentation -c - subroutine vshifte(ioff,nlon,nlat,uoff,voff,ureg,vreg, - + wsav,lsav,wrk,lwrk,ier) - implicit none - integer ioff,nlon,nlat,n2,nr,nlat2,nlatp1,lsav,lwrk,ier - integer i1,i2,i3 - real uoff(nlon,nlat),voff(nlon,nlat) - real ureg(nlon,*),vreg(nlon,*) - real wsav(lsav),wrk(lwrk) -c -c check input parameters -c - ier = 1 - if (ioff*(ioff-1).ne.0) return - ier = 2 - if (nlon.lt.4) return - ier = 3 - if (nlat .lt. 3) return - ier = 4 - if (lsav .lt. 2*(2*nlat+nlon+16)) return - nlat2 = nlat+nlat - nlatp1 = nlat+1 - n2 = (nlon+1)/2 - ier = 5 - if (2*n2 .eq. nlon) then - if (lwrk .lt. 2*nlon*(nlat+1)) return - nr = n2 - i1 = 1 - i2 = 1 - i3 = i2+nlon*nlatp1 - else - if (lwrk .lt. nlon*(5*nlat+1)) return - nr = nlon - i1 = 1 - i2 = i1+nlat2*nlon - i3 = i2+nlatp1*nlon - end if - ier = 0 - if (ioff.eq.0) then -c -c shift (uoff,voff) to (ureg,vreg) -c - call vhftoff(nlon,nlat,uoff,ureg,wsav,nr,nlat2, - + nlatp1,wrk(i1),wrk(i2),wrk(i2),wrk(i3)) - call vhftoff(nlon,nlat,voff,vreg,wsav,nr,nlat2, - + nlatp1,wrk(i1),wrk(i2),wrk(i2),wrk(i3)) - else -c -c shift (ureg,vreg) to (uoff,voff) -c - call vhftreg(nlon,nlat,uoff,ureg,wsav,nr,nlat2, - + nlatp1,wrk(i1),wrk(i2),wrk(i2),wrk(i3)) - call vhftreg(nlon,nlat,voff,vreg,wsav,nr,nlat2, - + nlatp1,wrk(i1),wrk(i2),wrk(i2),wrk(i3)) - end if - end - - subroutine vhftoff(nlon,nlat,uoff,ureg,wsav,nr, - +nlat2,nlatp1,rlatu,rlonu,rlou,wrk) -c -c generate ureg from uoff (a vector component!) -c - implicit none - integer nlon,nlat,nlat2,nlatp1,n2,nr,j,i,js,isav - real uoff(nlon,nlat),ureg(nlon,nlatp1) - real rlatu(nr,nlat2),rlonu(nlatp1,nlon),rlou(nlat,nlon) - real wsav(*),wrk(*) - isav = 4*nlat+17 - n2 = (nlon+1)/2 -c -c execute full circle latitude shifts for nlon odd or even -c - if (2*n2 .gt. nlon) then -c -c odd number of longitudes -c - do i=1,nlat - do j=1,nlon - rlou(i,j) = uoff(j,i) - end do - end do -c -c half shift in longitude -c - call vhifth(nlat,nlon,rlou,wsav(isav),wrk) -c -c set full 2*nlat circles in rlatu using shifted values in rlonu -c - do j=1,n2-1 - js = j+n2 - do i=1,nlat - rlatu(j,i) = uoff(j,i) - rlatu(j,nlat+i) = -rlou(nlat+1-i,js) - end do - end do - do j=n2,nlon - js = j-n2+1 - do i=1,nlat - rlatu(j,i) = uoff(j,i) - rlatu(j,nlat+i) = -rlou(nlat+1-i,js) - end do - end do -c -c shift the nlon rlat vectors one half latitude grid -c - call vhifth(nlon,nlat2,rlatu,wsav,wrk) -c -c set in ureg -c - do j=1,nlon - do i=1,nlat+1 - ureg(j,i) = rlatu(j,i) - end do - end do - else -c -c even number of longitudes (no initial longitude shift necessary) -c set full 2*nlat circles (over poles) for each longitude pair (j,js) -c negating js vector side for periodicity -c - do j=1,n2 - js = n2+j - do i=1,nlat - rlatu(j,i) = uoff(j,i) - rlatu(j,nlat+i) =-uoff(js,nlatp1-i) - end do - end do -c -c shift the n2=(nlon+1)/2 rlat vectors one half latitude grid -c - call vhifth(n2,nlat2,rlatu,wsav,wrk) -c -c set ureg,vreg shifted in latitude -c - do j=1,n2 - js = n2+j - ureg(j,1) = rlatu(j,1) - ureg(js,1) = -rlatu(j,1) - do i=2,nlatp1 - ureg(j,i) = rlatu(j,i) - ureg(js,i) =-rlatu(j,nlat2-i+2) - end do - end do - end if -c -c execute full circle longitude shift -c - do j=1,nlon - do i=1,nlatp1 - rlonu(i,j) = ureg(j,i) - end do - end do - call vhifth(nlatp1,nlon,rlonu,wsav(isav),wrk) - do j=1,nlon - do i=1,nlatp1 - ureg(j,i) = rlonu(i,j) - end do - end do - end - - subroutine vhftreg(nlon,nlat,uoff,ureg,wsav,nr,nlat2, - + nlatp1,rlatu,rlonu,rlou,wrk) -c -c generate uoff vector component from ureg -c - implicit none - integer nlon,nlat,nlat2,nlatp1,n2,nr,j,i,js,isav - real uoff(nlon,nlat),ureg(nlon,nlatp1) - real rlatu(nr,nlat2),rlonu(nlatp1,nlon),rlou(nlat,nlon) - real wsav(*),wrk(*) - isav = 4*nlat+17 - n2 = (nlon+1)/2 -c -c execute full circle latitude shifts for nlon odd or even -c - if (2*n2 .gt. nlon) then -c -c odd number of longitudes -c - do i=1,nlatp1 - do j=1,nlon - rlonu(i,j) = ureg(j,i) - end do - end do -c -c half shift in longitude in rlon -c - call vhifth(nlatp1,nlon,rlonu,wsav(isav),wrk) -c -c set full 2*nlat circles in rlat using shifted values in rlon -c - do j=1,n2 - js = j+n2-1 - rlatu(j,1) = ureg(j,1) - do i=2,nlat - rlatu(j,i) = ureg(j,i) - rlatu(j,nlat+i) =-rlonu(nlat+2-i,js) - end do - rlatu(j,nlat+1) = ureg(j,nlat+1) - end do - do j=n2+1,nlon - js = j-n2 - rlatu(j,1) = ureg(j,1) - do i=2,nlat - rlatu(j,i) = ureg(j,i) - rlatu(j,nlat+i) =-rlonu(nlat+2-i,js) - end do - rlatu(j,nlat+1) = ureg(j,nlat+1) - end do -c -c shift the nlon rlat vectors one halflatitude grid -c - call vhifth(nlon,nlat2,rlatu,wsav,wrk) -c -c set values in uoff -c - do j=1,nlon - do i=1,nlat - uoff(j,i) = rlatu(j,i) - end do - end do - else -c -c even number of longitudes (no initial longitude shift necessary) -c set full 2*nlat circles (over poles) for each longitude pair (j,js) -c - do j=1,n2 - js = n2+j - rlatu(j,1) = ureg(j,1) - do i=2,nlat - rlatu(j,i) = ureg(j,i) - rlatu(j,nlat+i) =-ureg(js,nlat+2-i) - end do - rlatu(j,nlat+1) = ureg(j,nlat+1) - end do -c -c shift the n2=(nlon+1)/2 rlat vectors one half latitude grid -c - call vhifth(n2,nlat2,rlatu,wsav,wrk) -c -c set values in uoff -c - do j=1,n2 - js = n2+j - do i=1,nlat - uoff(j,i) = rlatu(j,i) - uoff(js,i) =-rlatu(j,nlat2+1-i) - end do - end do - end if -c -c execute full circle longitude shift for all latitude circles -c - do j=1,nlon - do i=1,nlat - rlou(i,j) = uoff(j,i) - end do - end do - call vhifth(nlat,nlon,rlou,wsav(isav),wrk) - do j=1,nlon - do i=1,nlat - uoff(j,i) = rlou(i,j) - end do - end do - end - - subroutine vshifti(ioff,nlon,nlat,lsav,wsav,ier) -c -c initialize wsav for vshifte -c - integer ioff,nlat,nlon,nlat2,isav,ier - real wsav(lsav) - real pi,dlat,dlon,dp - ier = 1 - if (ioff*(ioff-1).ne.0) return - ier = 2 - if (nlon .lt. 4) return - ier = 3 - if (nlat .lt. 3) return - ier = 4 - if (lsav .lt. 2*(2*nlat+nlon+16)) return - ier = 0 - pi = 4.0*atan(1.0) -c -c set lat,long increments -c - dlat = pi/nlat - dlon = (pi+pi)/nlon -c -c set left or right latitude shifts -c - if (ioff.eq.0) then - dp = -0.5*dlat - else - dp = 0.5*dlat - end if - nlat2 = nlat+nlat - call vhifthi(nlat2,dp,wsav) -c -c set left or right longitude shifts -c - if (ioff.eq.0) then - dp = -0.5*dlon - else - dp = 0.5*dlon - end if - isav = 4*nlat + 17 - call vhifthi(nlon,dp,wsav(isav)) - return - end - - subroutine vhifth(m,n,r,wsav,work) - implicit none - integer m,n,n2,k,l - real r(m,n),wsav(*),work(*),r2km2,r2km1 - n2 = (n+1)/2 -c -c compute fourier coefficients for r on shifted grid -c - call hrfftf(m,n,r,m,wsav(n+2),work) - do l=1,m - do k=2,n2 - r2km2 = r(l,k+k-2) - r2km1 = r(l,k+k-1) - r(l,k+k-2) = r2km2*wsav(n2+k) - r2km1*wsav(k) - r(l,k+k-1) = r2km2*wsav(k) + r2km1*wsav(n2+k) - end do - end do -c -c shift r with fourier synthesis and normalization -c - call hrfftb(m,n,r,m,wsav(n+2),work) - do l=1,m - do k=1,n - r(l,k) = r(l,k)/n - end do - end do - return - end - - subroutine vhifthi(n,dp,wsav) -c -c initialize wsav for subroutine vhifth -c - implicit none - integer n,n2,k - real wsav(*),dp - n2 = (n+1)/2 - do k=2,n2 - wsav(k) = sin((k-1)*dp) - wsav(k+n2) = cos((k-1)*dp) - end do - call hrffti(n,wsav(n+2)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vsurf.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vsurf.f deleted file mode 100755 index 5767c13a3..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vsurf.f +++ /dev/null @@ -1,74 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c - SUBROUTINE VSURF(XEYE,YEYE,ZEYE,NTRI,X1,Y1,Z1,X2,Y2,Z2, - 1 X3,Y3,Z3,ITYPE,WORK,IWORK) -c -c subroutine vsurf is like subroutine hidel except the triangles -c are categorized. vsurf is also like solid except triangles rather -c than lines are covered. -c -c written by paul n. swarztrauber, national center for atmospheric -c research, p.o. box 3000, boulder, colorado, 80307 -c -c this program plots visible lines for the surface defined -c by the input 3-d triangles with corners at (x1,y1,z1), (x2,y2,z2) -c and (x3,y3,z3). the sides of these these triangles may or -c may not be plotted depending on itype. if itype is 1 then the -c side between points (x1,y1,z1) and (x2,y2,z2) is plotted if it -c is visible. if itype is 2 then the side between (x2,y2,z2) -c and (x3,y3,z3) is plotted. if itype is 3 then the visible portion -c of the side between (x3,y3,z3) and (x1,y1,z1) is plotted. -c any combination is possible by specifying itype to be one -c of the following values: 0,1,2,3,12,13,23,123. -c -c the length of real array work must be at least 19*ntri -c -c the length of integer array iwork must be at least 19*ntri -c -c -c the vertices of the triangles are renumbered by vsurf so that -c their projections are orientated counterclockwise. the user need -c only be aware that the vertices may be renumbered by vsurf. -c - dimension x1(ntri),y1(ntri),z1(ntri),x2(ntri),y2(ntri),z2(ntri), - 1 x3(ntri),y3(ntri),z3(ntri),itype(ntri),work(19*ntri) - INTEGER IWORK(19*NTRI) -c - call vsurf1(xeye,yeye,zeye,ntri,x1,y1,z1,x2,y2,z2,x3,y3,z3, - 1 itype,work,work(ntri+1),work(2*ntri+1),work(3*ntri+1), - 2 work(4*ntri+1),work(5*ntri+1),work(6*ntri+1),work(7*ntri+1), - 3 work(8*ntri+1),work(9*ntri+1),work(10*ntri+1),work(11*ntri+1), - 3 work(12*ntri+1),work(13*ntri+1),IWORK(14*NTRI+1),IWORK(6*NTRI+1), - 4 IWORK(15*NTRI+1),IWORK(17*NTRI+1)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsec.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsec.f deleted file mode 100755 index 661e21200..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsec.f +++ /dev/null @@ -1,964 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vtsec.f -c -c this file includes documentation and code for -c subroutines vtsec and vtseci -c -c ... files which must be loaded with vtsec.f -c -c sphcom.f, hrfft.f, vhaec.f, vhsec.f -c -c subroutine vtsec(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvts,lwvts,work,lwork,ierror) -c -c given the vector harmonic analysis br,bi,cr, and ci (computed -c by subroutine vhaec) of some vector function (v,w), this -c subroutine computes the vector function (vt,wt) which is -c the derivative of (v,w) with respect to colatitude theta. vtsec -c is similar to vhsec except the vector harmonics are replaced by -c their derivative with respect to colatitude with the result that -c (vt,wt) is computed instead of (v,w). vt(i,j) is the derivative -c of the colatitudinal component v(i,j) at the point theta(i) = -c (i-1)*pi/(nlat-1) and longitude phi(j) = (j-1)*2*pi/nlon. the -c spectral representation of (vt,wt) is given below at output -c parameters vt,wt. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator however the -c the coefficients cr and ci are zero. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 2 no symmetries exist about the equator however the -c the coefficients br and bi are zero. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 3 vt is odd and wt is even about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j),wt(i,j) -c are computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 vt is odd and wt is even about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 5 vt is odd and wt is even about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 6 vt is even and wt is odd about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j),wt(i,j) -c are computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 vt is even and wt is odd about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 8 vt is even and wt is odd about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls vtsec, -c the arrays vt,wt,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays vt,wt as it appears in -c the program that calls vtsec. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vt,wt as it appears in -c the program that calls vtsec. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c of (v,w) as computed by subroutine vhaec. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtsec. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtsec. ndab must be at -c least nlat. -c -c wvts an array which must be initialized by subroutine vtseci. -c once initialized, wvts can be used repeatedly by vtsec -c as long as nlon and nlat remain unchanged. wvts must -c not be altered between calls of vtsec. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtsec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vtsec. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) -c -c if ityp .gt. 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c vt,wt two or three dimensional arrays (see input parameter nt) -c in which the derivative of (v,w) with respect to -c colatitude theta is stored. vt(i,j),wt(i,j) contain the -c derivatives at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. vt and wt -c are computed from the formulas for v and w given in -c subroutine vhsec but with vbar and wbar replaced with -c their derivatives with respect to colatitude. these -c derivatives are denoted by vtbar and wtbar. -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c vt(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vtbar(m,n,theta(i)) -c -ci(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c -(bi(m+1,n+1)*vtbar(m,n,theta(i)) -c +cr(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c wt(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vtbar(m,n,theta(i)) -c +bi(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c +(ci(m+1,n+1)*vtbar(m,n,theta(i)) -c -br(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lwvts -c = 10 error in the specification of lwork -c -c -c ******************************************************************* -c -c subroutine vtseci(nlat,nlon,wvts,lwvts,dwork,ldwork,ierror) -c -c subroutine vtseci initializes the array wvts which can then be -c used repeatedly by subroutine vtsec until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtsec. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array work as it appears in the -c program that calls vtsec. lwork must be at least -c 2*(nlat+1) -c -c ************************************************************** -c -c output parameters -c -c wvts an array which is initialized for use by subroutine vtsec. -c once initialized, wvts can be used repeatedly by vtsec -c as long as nlat or nlon remain unchanged. wvts must not -c be altered between calls of vtsec. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lwvts -c = 4 error in the specification of ldwork -c -c ********************************************************************** -c - subroutine vtsec(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) -c - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvts(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwvts .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 - if(ityp .le. 2 .and. - 1 lwork .lt. nlat*(2*nt*nlon+max0(6*imid,nlon))) return - if(ityp .gt. 2 .and. - 1 lwork .lt. imid*(2*nt*nlon+max0(6*nlat,nlon))) return - ierror = 0 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - iw5 = iw4+3*imid*nlat - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwzvin = lzz1+labc - jw1 = lwzvin+1 - jw2 = jw1+lwzvin - call vtsec1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),work(iw5),wvts,wvts(jw1),wvts(jw2)) - return - end - subroutine vtsec1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab, - 1 ndab,br,bi,cr,ci,idv,vte,vto,wte,wto,vb,wb,wvbin,wwbin,wrfft) - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 vte(idv,nlon,1),vto(idv,nlon,1),wte(idv,nlon,1), - 3 wto(idv,nlon,1),wvbin(1),wwbin(1),wrfft(1), - 4 vb(imid,nlat,3),wb(imid,nlat,3) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - vte(i,j,k) = 0. - wte(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(100) - goto 100 - case(200) - goto 200 - case(300) - goto 300 - case(400) - goto 400 - case(500) - goto 500 - case(600) - goto 600 - case(700) - goto 700 - case(800) - goto 800 - end select - -c -c case ityp=0 no symmetries -c - 1 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - do 23 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 23 continue - if(mlat .eq. 0) go to 24 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - do 27 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 27 continue - if(mlat .eq. 0) go to 28 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c - 100 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - do 123 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 123 continue - if(mlat .eq. 0) go to 124 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - do 127 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 127 continue - if(mlat .eq. 0) go to 128 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c - 200 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - do 223 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 223 continue - if(mlat .eq. 0) go to 224 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - do 227 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 227 continue - if(mlat .eq. 0) go to 228 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v odd, w even -c - 300 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - do 323 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 323 continue - if(mlat .eq. 0) go to 324 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - do 327 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 327 continue - if(mlat .eq. 0) go to 328 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v odd, w even, and both cr and ci equal zero -c - 400 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - do 427 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 427 continue - if(mlat .eq. 0) go to 428 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v odd, w even, br and bi equal zero -c - 500 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - do 523 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 523 continue - if(mlat .eq. 0) go to 524 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v even , w odd -c - 600 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - do 623 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 623 continue - if(mlat .eq. 0) go to 624 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - do 627 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 627 continue - if(mlat .eq. 0) go to 628 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v even, w odd cr and ci equal zero -c - 700 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - do 723 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 723 continue - if(mlat .eq. 0) go to 724 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v even, w odd br and bi equal zero -c - 800 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - do 827 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 827 continue - if(mlat .eq. 0) go to 828 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,vte(1,1,k),idv,wrfft,vb) - call hrfftb(idv,nlon,wte(1,1,k),idv,wrfft,vb) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - vt(i,j,k) = .5*(vte(i,j,k)+vto(i,j,k)) - wt(i,j,k) = .5*(wte(i,j,k)+wto(i,j,k)) - vt(nlp1-i,j,k) = .5*(vte(i,j,k)-vto(i,j,k)) - wt(nlp1-i,j,k) = .5*(wte(i,j,k)-wto(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - vt(i,j,k) = .5*vte(i,j,k) - wt(i,j,k) = .5*wte(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - vt(imid,j,k) = .5*vte(imid,j,k) - wt(imid,j,k) = .5*wte(imid,j,k) - 65 continue - return - end - subroutine vtseci(nlat,nlon,wvts,lwvts,dwork,ldwork,ierror) -c - dimension wvts(lwvts) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwvts .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 4 - if (ldwork .lt. 2*nlat+2) return - ierror = 0 - call vtinit (nlat,nlon,wvts,dwork) - lwvbin = lzz1+labc - iw1 = lwvbin+1 - call wtinit (nlat,nlon,wvts(iw1),dwork) - iw2 = iw1+lwvbin - call hrffti(nlon,wvts(iw2)) - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtses.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vtses.f deleted file mode 100755 index 8a6f7dabf..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtses.f +++ /dev/null @@ -1,981 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vtses.f -c -c this file includes documentation and code for -c subroutines vtses and vtsesi -c -c ... files which must be loaded with vtses.f -c -c sphcom.f, hrfft.f, vhaes.f, vhses.f -c -c -c subroutine vtses(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvts,lwvts,work,lwork,ierror) -c -c given the vector harmonic analysis br,bi,cr, and ci (computed -c by subroutine vhaes) of some vector function (v,w), this -c subroutine computes the vector function (vt,wt) which is -c the derivative of (v,w) with respect to colatitude theta. vtses -c is similar to vhses except the vector harmonics are replaced by -c their derivative with respect to colatitude with the result that -c (vt,wt) is computed instead of (v,w). vt(i,j) is the derivative -c of the colatitudinal component v(i,j) at the point theta(i) = -c (i-1)*pi/(nlat-1) and longitude phi(j) = (j-1)*2*pi/nlon. the -c spectral representation of (vt,wt) is given below at output -c parameters vt,wt. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator however the -c the coefficients cr and ci are zero. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 2 no symmetries exist about the equator however the -c the coefficients br and bi are zero. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 3 vt is odd and wt is even about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j),wt(i,j) -c are computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 vt is odd and wt is even about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 5 vt is odd and wt is even about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 6 vt is even and wt is odd about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j),wt(i,j) -c are computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 vt is even and wt is odd about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 8 vt is even and wt is odd about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls vtses, -c the arrays vt,wt,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays vt,wt as it appears in -c the program that calls vtses. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vt,wt as it appears in -c the program that calls vtses. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c of (v,w) as computed by subroutine vhaes. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtses. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtses. ndab must be at -c least nlat. -c -c wvts an array which must be initialized by subroutine vtsesi. -c once initialized, wvts can be used repeatedly by vtses -c as long as nlon and nlat remain unchanged. wvts must -c not be altered between calls of vtses. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtses. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vtses. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c (2*nt+1)*nlat*nlon -c -c if ityp .gt. 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon -c -c ************************************************************** -c -c output parameters -c -c vt,wt two or three dimensional arrays (see input parameter nt) -c in which the derivative of (v,w) with respect to -c colatitude theta is stored. vt(i,j),wt(i,j) contain the -c derivatives at colatitude theta(i) = (i-1)*pi/(nlat-1) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. vt and wt -c are computed from the formulas for v and w given in -c subroutine vhses but with vbar and wbar replaced with -c their derivatives with respect to colatitude. these -c derivatives are denoted by vtbar and wtbar. -c -c -c ************************************************************* -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c vt(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vtbar(m,n,theta(i)) -c -ci(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c -(bi(m+1,n+1)*vtbar(m,n,theta(i)) -c +cr(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c wt(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vtbar(m,n,theta(i)) -c +bi(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c +(ci(m+1,n+1)*vtbar(m,n,theta(i)) -c -br(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lwvts -c = 10 error in the specification of lwork -c -c -c ******************************************************************* -c -c subroutine vtsesi(nlat,nlon,wvts,lwvts,work,lwork,dwork,ldwork, -c + ierror) -c -c subroutine vtsesi initializes the array wvts which can then be -c used repeatedly by subroutine vtses until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of colatitudes on the full sphere including the -c poles. for example, nlat = 37 for a five degree grid. -c nlat determines the grid increment in colatitude as -c pi/(nlat-1). if nlat is odd the equator is located at -c grid point i=(nlat+1)/2. if nlat is even the equator is -c located half way between points i=nlat/2 and i=nlat/2+1. -c nlat must be at least 3. note: on the half sphere, the -c number of grid points in the colatitudinal direction is -c nlat/2 if nlat is even or (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtses. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vtses. lwork must be at least -c -c 3*(max0(l1-2,0)*(nlat+nlat-l1-1))/2+5*l2*nlat -c -c dwork a double precision work array that does have to be saved. -c -c ldwork the length of dwork. ldwork must be at least 2*(nlat+1) -c -c ************************************************************** -c -c output parameters -c -c wvts an array which is initialized for use by subroutine vtses. -c once initialized, wvts can be used repeatedly by vtses -c as long as nlat or nlon remain unchanged. wvts must not -c be altered between calls of vtses. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lwvts -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c -c ******************************************************************** -c - subroutine vtses(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) -c - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvts(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lwvts .lt. lzimn+lzimn+nlon+15) return - ierror = 10 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - if(lwork .lt. lnl+lnl+idv*nlon) return - ierror = 0 - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - jw1 = lzimn+1 - jw2 = jw1+lzimn - call vtses1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),idz,wvts,wvts(jw1),wvts(jw2)) - return - end - subroutine vtses1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab, - 1 ndab,br,bi,cr,ci,idv,vte,vto,wte,wto,work,idz,vb,wb,wrfft) - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 vte(idv,nlon,1),vto(idv,nlon,1),wte(idv,nlon,1), - 3 wto(idv,nlon,1),work(1),wrfft(1), - 4 vb(imid,1),wb(imid,1) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - vte(i,j,k) = 0. - wte(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(100) - goto 100 - case(200) - goto 200 - case(300) - goto 300 - case(400) - goto 400 - case(500) - goto 500 - case(600) - goto 600 - case(700) - goto 700 - case(800) - goto 800 - end select - -c -c case ityp=0 no symmetries -c -c case m = 0 -c - 1 do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - mn = mb+np1 - do 23 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 23 continue - if(mlat .eq. 0) go to 24 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - mn = mb+np1 - do 27 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 27 continue - if(mlat .eq. 0) go to 28 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c -c case m = 0 -c - 100 do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - mn = mb+np1 - do 123 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 123 continue - if(mlat .eq. 0) go to 124 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - mn = mb+np1 - do 127 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 127 continue - if(mlat .eq. 0) go to 128 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c -c case m = 0 -c - 200 do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - mn = mb+np1 - do 223 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 223 continue - if(mlat .eq. 0) go to 224 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - mn = mb+np1 - do 227 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 227 continue - if(mlat .eq. 0) go to 228 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v odd, w even -c -c case m = 0 -c - 300 do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - mn = mb+np1 - do 323 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 323 continue - if(mlat .eq. 0) go to 324 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - mn = mb+np1 - do 327 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 327 continue - if(mlat .eq. 0) go to 328 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v odd, w even, and both cr and ci equal zero -c -c case m = 0 -c - 400 do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - mn = mb+np1 - do 427 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 427 continue - if(mlat .eq. 0) go to 428 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v odd, w even, br and bi equal zero -c -c case m = 0 -c - 500 do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - mn = mb+np1 - do 523 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 523 continue - if(mlat .eq. 0) go to 524 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v even , w odd -c -c case m = 0 -c - 600 do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - mn = mb+np1 - do 623 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 623 continue - if(mlat .eq. 0) go to 624 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - mn = mb+np1 - do 627 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 627 continue - if(mlat .eq. 0) go to 628 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v even, w odd cr and ci equal zero -c -c case m = 0 -c - 700 do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - mn = mb+np1 - do 723 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 723 continue - if(mlat .eq. 0) go to 724 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v even, w odd, br and bi equal zero -c -c case m = 0 -c - 800 do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - mn = mb+np1 - do 827 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 827 continue - if(mlat .eq. 0) go to 828 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,vte(1,1,k),idv,wrfft,work) - call hrfftb(idv,nlon,wte(1,1,k),idv,wrfft,work) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - vt(i,j,k) = .5*(vte(i,j,k)+vto(i,j,k)) - wt(i,j,k) = .5*(wte(i,j,k)+wto(i,j,k)) - vt(nlp1-i,j,k) = .5*(vte(i,j,k)-vto(i,j,k)) - wt(nlp1-i,j,k) = .5*(wte(i,j,k)-wto(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - vt(i,j,k) = .5*vte(i,j,k) - wt(i,j,k) = .5*wte(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - vt(imid,j,k) = .5*vte(imid,j,k) - wt(imid,j,k) = .5*wte(imid,j,k) - 65 continue - return - end - subroutine vtsesi(nlat,nlon,wvts,lwvts,work,lwork,dwork,ldwork, - + ierror) -c - dimension wvts(lwvts),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - mmax = min0(nlat,(nlon+1)/2) - imid = (nlat+1)/2 - lzimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lwvts .lt. lzimn+lzimn+nlon+15) return - ierror = 4 - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwork .lt. 5*nlat*imid+labc) return - ierror = 5 - if (ldwork .lt. 2*(nlat+1)) return - ierror = 0 - iw1 = 3*nlat*imid+1 - idz = (mmax*(nlat+nlat-mmax+1))/2 - call vet1(nlat,nlon,imid,wvts,wvts(lzimn+1),idz,work, - + work(iw1),dwork) - call hrffti(nlon,wvts(2*lzimn+1)) - return - end - subroutine vet1(nlat,nlon,imid,vb,wb,idz,vin,wzvin,dwork) - dimension vb(imid,*),wb(imid,*),vin(imid,nlat,3),wzvin(*) - double precision dwork(*) - mmax = min0(nlat,(nlon+1)/2) - call vtinit (nlat,nlon,wzvin,dwork) - do 33 mp1=1,mmax - m = mp1-1 - call vbin (0,nlat,nlon,m,vin,i3,wzvin) - do 33 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 33 i=1,imid - vb(i,mn) = vin(i,np1,i3) - 33 continue - call wtinit (nlat,nlon,wzvin,dwork) - do 34 mp1=1,mmax - m = mp1-1 - call wbin (0,nlat,nlon,m,vin,i3,wzvin) - do 34 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 34 i=1,imid - wb(i,mn) = vin(i,np1,i3) - 34 continue - return - end diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsgc.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsgc.f deleted file mode 100755 index 80059777a..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsgc.f +++ /dev/null @@ -1,982 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vtsgc.f -c -c this file includes documentation and code for -c subroutines vtsgc and vtsgci -c -c ... files which must be loaded with vtsgc.f -c -c sphcom.f, hrfft.f, vhagc.f, vhsgc.f,gaqd.f -c -c -c subroutine vtsgc(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvts,lwvts,work,lwork,ierror) -c -c given the vector harmonic analysis br,bi,cr, and ci (computed -c by subroutine vhagc) of some vector function (v,w), this -c subroutine computes the vector function (vt,wt) which is -c the derivative of (v,w) with respect to colatitude theta. vtsgc -c is similar to vhsgc except the vector harmonics are replaced by -c their derivative with respect to colatitude with the result that -c (vt,wt) is computed instead of (v,w). vt(i,j) is the derivative -c of the colatitudinal component v(i,j) at the gaussian colatitude -c theta(i) and longitude phi(j) = (j-1)*2*pi/nlon. the spectral -c representation of (vt,wt) is given below at the definition of -c output parameters vt,wt. -c -c input parameters -c -c nlat the number of gaussian colatitudinal grid points theta(i) -c such that 0 < theta(1) <...< theta(nlat) < pi. they are -c computed by subroutine gaqd which is called by this -c subroutine. if nlat is odd the equator is -c theta((nlat+1)/2). if nlat is even the equator lies -c half way between theta(nlat/2) and theta(nlat/2+1). nlat -c must be at least 3. note: if (v,w) is symmetric about -c the equator (see parameter ityp below) the number of -c colatitudinal grid points is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator however the -c the coefficients cr and ci are zero which implies -c that the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the calculations are performed on the entire sphere. -c i.e. the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat and j=1,...,nlon. -c -c = 2 no symmetries exist about the equator however the -c the coefficients br and bi are zero which implies -c that the divergence of (v,w) is zero. that is, -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the calculations are performed on the entire sphere. -c i.e. the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat and j=1,...,nlon. -c -c = 3 vt is odd and wt is even about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j) -c and wt(i,j) are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even the arrays -c are computed for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 vt is odd and wt is even about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 5 vt is odd and wt is even about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 6 vt is even and wt is odd about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j),wt(i,j) -c are computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 vt is even and wt is odd about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 8 vt is even and wt is odd about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls vtsgc, -c the arrays vt,wt,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays vt,wt as it appears in -c the program that calls vtsgc. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vt,wt as it appears in -c the program that calls vtsgc. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c of (v,w) as computed by subroutine vhagc. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtsgc. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtsgc. ndab must be at -c least nlat. -c -c wvts an array which must be initialized by subroutine vtsgci. -c once initialized, wvts can be used repeatedly by vtsgc -c as long as nlon and nlat remain unchanged. wvts must -c not be altered between calls of vtsgc. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtsgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vtsgc. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c nlat*(2*nt*nlon+max0(6*l2,nlon)) -c -c if ityp .gt. 2 then lwork must be at least -c -c l2*(2*nt*nlon+max0(6*nlat,nlon)) -c -c ************************************************************** -c -c output parameters -c -c vt,wt two or three dimensional arrays (see input parameter nt) -c in which the derivative of (v,w) with respect to -c colatitude theta is stored. vt(i,j),wt(i,j) contain the -c derivatives at gaussian colatitude points theta(i) -c and longitude phi(j) = (j-1)*2*pi/nlon. the index ranges -c are defined above at the input parameter ityp. vt and wt -c are computed from the formulas for v and w given in -c subroutine vhsgc but with vbar and wbar replaced with -c their derivatives with respect to colatitude. these -c derivatives are denoted by vtbar and wtbar. -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c vt(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vtbar(m,n,theta(i)) -c -ci(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c -(bi(m+1,n+1)*vtbar(m,n,theta(i)) -c +cr(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c wt(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vtbar(m,n,theta(i)) -c +bi(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c +(ci(m+1,n+1)*vtbar(m,n,theta(i)) -c -br(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lwvts -c = 10 error in the specification of lwork -c -c -c ******************************************************************* -c -c subroutine vtsgci(nlat,nlon,wvts,lwvts,dwork,ldwork,ierror) -c -c subroutine vtsgci initializes the array wvts which can then be -c used repeatedly by subroutine vtsgc until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of gaussian colatitudinal grid points theta(i) -c such that 0 < theta(1) <...< theta(nlat) < pi. they are -c computed by subroutine gaqd which is called by this -c subroutine. if nlat is odd the equator is -c theta((nlat+1)/2). if nlat is even the equator lies -c half way between theta(nlat/2) and theta(nlat/2+1). nlat -c must be at least 3. note: if (v,w) is symmetric about -c the equator (see parameter ityp below) the number of -c colatitudinal grid points is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtsgc. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c 4*nlat*l2+3*max0(l1-2,0)*(nlat+nlat-l1-1)+nlon+15 -c -c -c dwork a double precision work array that does not have to be saved. -c -c ldwork the dimension of the array dwork as it appears in the -c program that calls vtsgc. ldwork must be at least -c 3*nlat+2 -c -c ************************************************************** -c -c output parameters -c -c wvts an array which is initialized for use by subroutine vtsgc. -c once initialized, wvts can be used repeatedly by vtsgc -c as long as nlat or nlon remain unchanged. wvts must not -c be altered between calls of vtsgc. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lwvts -c = 4 error in the specification of lwork -c -c -c -c ********************************************************************** -c - subroutine vtsgc(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) -c - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvts(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwvts .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 10 - if(ityp .le. 2 .and. - 1 lwork .lt. nlat*(2*nt*nlon+max0(6*imid,nlon))) return - if(ityp .gt. 2 .and. - 1 lwork .lt. imid*(2*nt*nlon+max0(6*nlat,nlon))) return - ierror = 0 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - iw5 = iw4+3*imid*nlat - lzz1 = 2*nlat*imid - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lwzvin = lzz1+labc - jw1 = lwzvin+1 - jw2 = jw1+lwzvin - call vtsgc1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),work(iw5),wvts,wvts(jw1),wvts(jw2)) - return - end - subroutine vtsgc1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab, - 1 ndab,br,bi,cr,ci,idv,vte,vto,wte,wto,vb,wb,wvbin,wwbin,wrfft) - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 vte(idv,nlon,1),vto(idv,nlon,1),wte(idv,nlon,1), - 3 wto(idv,nlon,1),wvbin(1),wwbin(1),wrfft(1), - 4 vb(imid,nlat,3),wb(imid,nlat,3) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - vte(i,j,k) = 0. - wte(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(100) - goto 100 - case(200) - goto 200 - case(300) - goto 300 - case(400) - goto 400 - case(500) - goto 500 - case(600) - goto 600 - case(700) - goto 700 - case(800) - goto 800 - end select - -c -c case ityp=0 no symmetries -c - 1 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - do 23 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 23 continue - if(mlat .eq. 0) go to 24 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - do 27 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 27 continue - if(mlat .eq. 0) go to 28 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c - 100 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - do 123 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 123 continue - if(mlat .eq. 0) go to 124 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - do 127 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 127 continue - if(mlat .eq. 0) go to 128 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c - 200 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - do 223 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 223 continue - if(mlat .eq. 0) go to 224 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - do 227 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 227 continue - if(mlat .eq. 0) go to 228 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v odd, w even -c - 300 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - do 323 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 323 continue - if(mlat .eq. 0) go to 324 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - do 327 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 327 continue - if(mlat .eq. 0) go to 328 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v odd, w even, and both cr and ci equal zero -c - 400 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - do 427 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 427 continue - if(mlat .eq. 0) go to 428 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,np1,iw) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,np1,iw) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v odd, w even, br and bi equal zero -c - 500 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - do 523 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 523 continue - if(mlat .eq. 0) go to 524 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,np1,iv) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,np1,iv) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v even , w odd -c - 600 call vbin(0,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(0,nlat,nlon,m,vb,iv,wvbin) - call wbin(0,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - do 623 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 623 continue - if(mlat .eq. 0) go to 624 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - do 627 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 627 continue - if(mlat .eq. 0) go to 628 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v even, w odd cr and ci equal zero -c - 700 call vbin(2,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1,iv) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(2,nlat,nlon,m,vb,iv,wvbin) - call wbin(2,nlat,nlon,m,wb,iw,wwbin) - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - do 723 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,np1,iv) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,np1,iw) - 723 continue - if(mlat .eq. 0) go to 724 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,np1,iv) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,np1,iv) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v even, w odd br and bi equal zero -c - 800 call vbin(1,nlat,nlon,0,vb,iv,wvbin) -c -c case m = 0 -c - do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1,iv) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mp2 = mp1+1 - call vbin(1,nlat,nlon,m,vb,iv,wvbin) - call wbin(1,nlat,nlon,m,wb,iw,wwbin) - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - do 827 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,np1,iw) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,np1,iw) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,np1,iv) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,np1,iv) - 827 continue - if(mlat .eq. 0) go to 828 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,np1,iw) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,np1,iw) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,vte(1,1,k),idv,wrfft,vb) - call hrfftb(idv,nlon,wte(1,1,k),idv,wrfft,vb) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - vt(i,j,k) = .5*(vte(i,j,k)+vto(i,j,k)) - wt(i,j,k) = .5*(wte(i,j,k)+wto(i,j,k)) - vt(nlp1-i,j,k) = .5*(vte(i,j,k)-vto(i,j,k)) - wt(nlp1-i,j,k) = .5*(wte(i,j,k)-wto(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - vt(i,j,k) = .5*vte(i,j,k) - wt(i,j,k) = .5*wte(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - vt(imid,j,k) = .5*vte(imid,j,k) - wt(imid,j,k) = .5*wte(imid,j,k) - 65 continue - return - end - subroutine vtsgci(nlat,nlon,wvts,lwvts,dwork,ldwork,ierror) -c - dimension wvts(lwvts) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - imid = (nlat+1)/2 - lzz1 = 2*nlat*imid - mmax = min0(nlat,(nlon+1)/2) - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - if(lwvts .lt. 2*(lzz1+labc)+nlon+15) return - ierror = 4 -c if(lwork .lt. 2*nlat*(nlat+2)) return - if(ldwork .lt. 3*nlat+2) return -c call gaqd(nlat,work,work(2*nlat+1),work(4*nlat+1),lwork,ierr) - ldwk = 1 - call gaqd(nlat,dwork,dwork(nlat+1),dwork(2*nlat+1),ldwk,ierr) - ierror = 5 - if(ierr .ne. 0) return - ierror = 0 -c call vtgint (nlat,nlon,work,wvts,work(4*nlat+1)) - call vtgint (nlat,nlon,dwork,wvts,dwork(2*nlat+1)) - lwvbin = lzz1+labc - iw1 = lwvbin+1 -c call wtgint (nlat,nlon,work,wvts(iw1),work(4*nlat+1)) - call wtgint (nlat,nlon,dwork,wvts(iw1),dwork(2*nlat+1)) - iw2 = iw1+lwvbin - call hrffti(nlon,wvts(iw2)) - return - end - diff --git a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsgs.f b/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsgs.f deleted file mode 100755 index cd35cc30e..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spherepack/vtsgs.f +++ /dev/null @@ -1,1011 +0,0 @@ -c -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c * * -c * copyright (c) 1998 by UCAR * -c * * -c * University Corporation for Atmospheric Research * -c * * -c * all rights reserved * -c * * -c * SPHEREPACK version 3.2 * -c * * -c * A Package of Fortran77 Subroutines and Programs * -c * * -c * for Modeling Geophysical Processes * -c * * -c * by * -c * * -c * John Adams and Paul Swarztrauber * -c * * -c * of * -c * * -c * the National Center for Atmospheric Research * -c * * -c * Boulder, Colorado (80307) U.S.A. * -c * * -c * which is sponsored by * -c * * -c * the National Science Foundation * -c * * -c * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -c -c -c -c ... file vtsgs.f -c -c this file includes documentation and code for -c subroutines vtsgs and vtsgsi -c -c ... files which must be loaded with vtsgs.f -c -c sphcom.f, hrfft.f, vhags.f, vhsgs.f,gaqd.f -c -c -c subroutine vtsgs(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, -c + mdab,ndab,wvts,lwvts,work,lwork,ierror) -c -c given the vector harmonic analysis br,bi,cr, and ci (computed -c by subroutine vhags) of some vector function (v,w), this -c subroutine computes the vector function (vt,wt) which is -c the derivative of (v,w) with respect to colatitude theta. vtsgs -c is similar to vhsgs except the vector harmonics are replaced by -c their derivative with respect to colatitude with the result that -c (vt,wt) is computed instead of (v,w). vt(i,j) is the derivative -c of the colatitudinal component v(i,j) at the gaussian colatitude -c point theta(i) and longitude phi(j) = (j-1)*2*pi/nlon. the -c spectral representation of (vt,wt) is given below at output -c parameters vt,wt. -c -c input parameters -c -c nlat the number of gaussian colatitudinal grid points theta(i) -c such that 0 < theta(1) <...< theta(nlat) < pi. they are -c computed by subroutine gaqd which is called by this -c subroutine. if nlat is odd the equator is -c theta((nlat+1)/2). if nlat is even the equator lies -c half way between theta(nlat/2) and theta(nlat/2+1). nlat -c must be at least 3. note: if (v,w) is symmetric about -c the equator (see parameter ityp below) the number of -c colatitudinal grid points is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c ityp = 0 no symmetries exist about the equator. the synthesis -c is performed on the entire sphere. i.e. the arrays -c vt(i,j),wt(i,j) are computed for i=1,...,nlat and -c j=1,...,nlon. -c -c = 1 no symmetries exist about the equator however the -c the coefficients cr and ci are zero which implies -c that the curl of (v,w) is zero. that is, -c (d/dtheta (sin(theta) w) - dv/dphi)/sin(theta) = 0. -c the calculations are performed on the entire sphere. -c i.e. the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat and j=1,...,nlon. -c -c = 2 no symmetries exist about the equator however the -c the coefficients br and bi are zero which implies -c that the divergence of (v,w) is zero. that is, -c (d/dtheta (sin(theta) v) + dw/dphi)/sin(theta) = 0. -c the calculations are performed on the entire sphere. -c i.e. the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat and j=1,...,nlon. -c -c = 3 vt is odd and wt is even about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j) -c and wt(i,j) are computed for i=1,...,(nlat+1)/2 -c and j=1,...,nlon. if nlat is even the arrays -c are computed for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 4 vt is odd and wt is even about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 5 vt is odd and wt is even about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 6 vt is even and wt is odd about the equator. the -c synthesis is performed on the northern hemisphere -c only. i.e., if nlat is odd the arrays vt(i,j),wt(i,j) -c are computed for i=1,...,(nlat+1)/2 and j=1,...,nlon. -c if nlat is even the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,nlat/2 and j=1,...,nlon. -c -c = 7 vt is even and wt is odd about the equator and the -c coefficients cr and ci are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c = 8 vt is even and wt is odd about the equator and the -c coefficients br and bi are zero. the synthesis is -c performed on the northern hemisphere only. i.e. if -c nlat is odd the arrays vt(i,j),wt(i,j) are computed -c for i=1,...,(nlat+1)/2 and j=1,...,nlon. if nlat is -c even the arrays vt(i,j),wt(i,j) are computed for -c i=1,...,nlat/2 and j=1,...,nlon. -c -c nt the number of syntheses. in the program that calls vtsgs, -c the arrays vt,wt,br,bi,cr, and ci can be three dimensional -c in which case multiple syntheses will be performed. -c the third index is the synthesis index which assumes the -c values k=1,...,nt. for a single synthesis set nt=1. the -c discription of the remaining parameters is simplified -c by assuming that nt=1 or that all the arrays are two -c dimensional. -c -c idvw the first dimension of the arrays vt,wt as it appears in -c the program that calls vtsgs. if ityp .le. 2 then idvw -c must be at least nlat. if ityp .gt. 2 and nlat is -c even then idvw must be at least nlat/2. if ityp .gt. 2 -c and nlat is odd then idvw must be at least (nlat+1)/2. -c -c jdvw the second dimension of the arrays vt,wt as it appears in -c the program that calls vtsgs. jdvw must be at least nlon. -c -c br,bi two or three dimensional arrays (see input parameter nt) -c cr,ci that contain the vector spherical harmonic coefficients -c of (v,w) as computed by subroutine vhags. -c -c mdab the first dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtsgs. mdab must be at -c least min0(nlat,nlon/2) if nlon is even or at least -c min0(nlat,(nlon+1)/2) if nlon is odd. -c -c ndab the second dimension of the arrays br,bi,cr, and ci as it -c appears in the program that calls vtsgs. ndab must be at -c least nlat. -c -c wvts an array which must be initialized by subroutine vtsgsi. -c once initialized, wvts can be used repeatedly by vtsgs -c as long as nlon and nlat remain unchanged. wvts must -c not be altered between calls of vtsgs. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtsgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vtsgs. define -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c if ityp .le. 2 then lwork must be at least -c -c (2*nt+1)*nlat*nlon -c -c if ityp .gt. 2 then lwork must be at least -c -c (2*nt+1)*l2*nlon -c -c ************************************************************** -c -c output parameters -c -c vt,wt two or three dimensional arrays (see input parameter nt) -c in which the derivative of (v,w) with respect to -c colatitude theta is stored. vt(i,j),wt(i,j) contain the -c derivatives at gaussian colatitude points theta(i) for -c i=1,...,nlat and longitude phi(j) = (j-1)*2*pi/nlon. -c the index ranges are defined above at the input parameter -c ityp. vt and wt are computed from the formulas for v and -c w given in subroutine vhsgs but with vbar and wbar replaced -c with their derivatives with respect to colatitude. these -c derivatives are denoted by vtbar and wtbar. -c -c -c ************************************************************* -c -c in terms of real variables this expansion takes the form -c -c for i=1,...,nlat and j=1,...,nlon -c -c vt(i,j) = the sum from n=1 to n=nlat-1 of -c -c .5*br(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c (br(m+1,n+1)*vtbar(m,n,theta(i)) -c -ci(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c -(bi(m+1,n+1)*vtbar(m,n,theta(i)) -c +cr(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c and for i=1,...,nlat and j=1,...,nlon -c -c wt(i,j) = the sum from n=1 to n=nlat-1 of -c -c -.5*cr(1,n+1)*vtbar(0,n,theta(i)) -c -c plus the sum from m=1 to m=mmax-1 of the sum from n=m to -c n=nlat-1 of the real part of -c -c -(cr(m+1,n+1)*vtbar(m,n,theta(i)) -c +bi(m+1,n+1)*wtbar(m,n,theta(i)))*cos(m*phi(j)) -c +(ci(m+1,n+1)*vtbar(m,n,theta(i)) -c -br(m+1,n+1)*wtbar(m,n,theta(i)))*sin(m*phi(j)) -c -c -c br(m+1,nlat),bi(m+1,nlat),cr(m+1,nlat), and ci(m+1,nlat) are -c assumed zero for m even. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of ityp -c = 4 error in the specification of nt -c = 5 error in the specification of idvw -c = 6 error in the specification of jdvw -c = 7 error in the specification of mdab -c = 8 error in the specification of ndab -c = 9 error in the specification of lwvts -c = 10 error in the specification of lwork -c -c -c ******************************************************************* -c -c subroutine vtsgsi(nlat,nlon,wvts,lwvts,work,lwork,dwork,ldwork, -c + ierror) -c -c subroutine vtsgsi initializes the array wvts which can then be -c used repeatedly by subroutine vtsgs until nlat or nlon is changed. -c -c input parameters -c -c nlat the number of gaussian colatitudinal grid points theta(i) -c such that 0 < theta(1) <...< theta(nlat) < pi. they are -c computed by subroutine gaqd which is called by this -c subroutine. if nlat is odd the equator is -c theta((nlat+1)/2). if nlat is even the equator lies -c half way between theta(nlat/2) and theta(nlat/2+1). nlat -c must be at least 3. note: if (v,w) is symmetric about -c the equator (see parameter ityp below) the number of -c colatitudinal grid points is nlat/2 if nlat is even or -c (nlat+1)/2 if nlat is odd. -c -c nlon the number of distinct londitude points. nlon determines -c the grid increment in longitude as 2*pi/nlon. for example -c nlon = 72 for a five degree grid. nlon must be greater -c than zero. the axisymmetric case corresponds to nlon=1. -c the efficiency of the computation is improved when nlon -c is a product of small prime numbers. -c -c lwvts the dimension of the array wvts as it appears in the -c program that calls vtsgs. define -c -c l1 = min0(nlat,nlon/2) if nlon is even or -c l1 = min0(nlat,(nlon+1)/2) if nlon is odd -c -c and -c -c l2 = nlat/2 if nlat is even or -c l2 = (nlat+1)/2 if nlat is odd -c -c then lwvts must be at least -c -c l1*l2*(nlat+nlat-l1+1)+nlon+15 -c -c -c work a work array that does not have to be saved. -c -c lwork the dimension of the array work as it appears in the -c program that calls vtsgs. lwork must be at least -c -c 3*(max0(l1-2,0)*(nlat+nlat-l1-1))/2+(5*l2+2)*nlat -c -c dwork a double precision work array that does not have to be saved -c -c ldwork the length of dwork. ldwork must be at least -c 3*nlat+2 -c -c ************************************************************** -c -c output parameters -c -c wvts an array which is initialized for use by subroutine vtsgs. -c once initialized, wvts can be used repeatedly by vtsgs -c as long as nlat or nlon remain unchanged. wvts must not -c be altered between calls of vtsgs. -c -c -c ierror = 0 no errors -c = 1 error in the specification of nlat -c = 2 error in the specification of nlon -c = 3 error in the specification of lwvts -c = 4 error in the specification of lwork -c = 5 error in the specification of ldwork -c - subroutine vtsgs(nlat,nlon,ityp,nt,vt,wt,idvw,jdvw,br,bi,cr,ci, - 1 mdab,ndab,wvts,lwvts,work,lwork,ierror) -c - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 work(1),wvts(1) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - if(ityp.lt.0 .or. ityp.gt.8) return - ierror = 4 - if(nt .lt. 0) return - ierror = 5 - imid = (nlat+1)/2 - if((ityp.le.2 .and. idvw.lt.nlat) .or. - 1 (ityp.gt.2 .and. idvw.lt.imid)) return - ierror = 6 - if(jdvw .lt. nlon) return - ierror = 7 - mmax = min0(nlat,(nlon+1)/2) - if(mdab .lt. mmax) return - ierror = 8 - if(ndab .lt. nlat) return - ierror = 9 - idz = (mmax*(nlat+nlat-mmax+1))/2 - lzimn = idz*imid - if(lwvts .lt. lzimn+lzimn+nlon+15) return - ierror = 10 - idv = nlat - if(ityp .gt. 2) idv = imid - lnl = nt*idv*nlon - if(lwork .lt. lnl+lnl+idv*nlon) return - ierror = 0 - ist = 0 - if(ityp .le. 2) ist = imid - iw1 = ist+1 - iw2 = lnl+1 - iw3 = iw2+ist - iw4 = iw2+lnl - jw1 = lzimn+1 - jw2 = jw1+lzimn - call vtsgs1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab,ndab, - 1 br,bi,cr,ci,idv,work,work(iw1),work(iw2),work(iw3), - 2 work(iw4),idz,wvts,wvts(jw1),wvts(jw2)) - return - end - subroutine vtsgs1(nlat,nlon,ityp,nt,imid,idvw,jdvw,vt,wt,mdab, - 1 ndab,br,bi,cr,ci,idv,vte,vto,wte,wto,work,idz,vb,wb,wrfft) - dimension vt(idvw,jdvw,1),wt(idvw,jdvw,1),br(mdab,ndab,1), - 1 bi(mdab,ndab,1),cr(mdab,ndab,1),ci(mdab,ndab,1), - 2 vte(idv,nlon,1),vto(idv,nlon,1),wte(idv,nlon,1), - 3 wto(idv,nlon,1),work(1),wrfft(1), - 4 vb(imid,1),wb(imid,1) - nlp1 = nlat+1 - mlat = mod(nlat,2) - mlon = mod(nlon,2) - mmax = min0(nlat,(nlon+1)/2) - imm1 = imid - if(mlat .ne. 0) imm1 = imid-1 - do 10 k=1,nt - do 10 j=1,nlon - do 10 i=1,idv - vte(i,j,k) = 0. - wte(i,j,k) = 0. - 10 continue - ndo1 = nlat - ndo2 = nlat - if(mlat .ne. 0) ndo1 = nlat-1 - if(mlat .eq. 0) ndo2 = nlat-1 - 18 itypp = ityp+1 -c go to (1,100,200,300,400,500,600,700,800),itypp - - select case(itypp) - case(1) - goto 1 - case(100) - goto 100 - case(200) - goto 200 - case(300) - goto 300 - case(400) - goto 400 - case(500) - goto 500 - case(600) - goto 600 - case(700) - goto 700 - case(800) - goto 800 - end select - - -c -c case ityp=0 no symmetries -c -c case m = 0 -c - 1 do 15 k=1,nt - do 15 np1=2,ndo2,2 - do 15 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 15 continue - do 16 k=1,nt - do 16 np1=3,ndo1,2 - do 16 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 16 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 30 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 26 - do 25 k=1,nt - do 24 np1=mp1,ndo1,2 - mn = mb+np1 - do 23 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 23 continue - if(mlat .eq. 0) go to 24 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 24 continue - 25 continue - 26 if(mp2 .gt. ndo2) go to 30 - do 29 k=1,nt - do 28 np1=mp2,ndo2,2 - mn = mb+np1 - do 27 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 27 continue - if(mlat .eq. 0) go to 28 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 28 continue - 29 continue - 30 continue - go to 950 -c -c case ityp=1 no symmetries, cr and ci equal zero -c -c case m = 0 -c - 100 do 115 k=1,nt - do 115 np1=2,ndo2,2 - do 115 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - 115 continue - do 116 k=1,nt - do 116 np1=3,ndo1,2 - do 116 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - 116 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 130 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 126 - do 125 k=1,nt - do 124 np1=mp1,ndo1,2 - mn = mb+np1 - do 123 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 123 continue - if(mlat .eq. 0) go to 124 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 124 continue - 125 continue - 126 if(mp2 .gt. ndo2) go to 130 - do 129 k=1,nt - do 128 np1=mp2,ndo2,2 - mn = mb+np1 - do 127 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 127 continue - if(mlat .eq. 0) go to 128 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 128 continue - 129 continue - 130 continue - go to 950 -c -c case ityp=2 no symmetries, br and bi are equal to zero -c -c case m = 0 -c - 200 do 215 k=1,nt - do 215 np1=2,ndo2,2 - do 215 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 215 continue - do 216 k=1,nt - do 216 np1=3,ndo1,2 - do 216 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 216 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 230 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 226 - do 225 k=1,nt - do 224 np1=mp1,ndo1,2 - mn = mb+np1 - do 223 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 223 continue - if(mlat .eq. 0) go to 224 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 224 continue - 225 continue - 226 if(mp2 .gt. ndo2) go to 230 - do 229 k=1,nt - do 228 np1=mp2,ndo2,2 - mn = mb+np1 - do 227 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 227 continue - if(mlat .eq. 0) go to 228 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 228 continue - 229 continue - 230 continue - go to 950 -c -c case ityp=3 v odd, w even -c -c case m = 0 -c - 300 do 315 k=1,nt - do 315 np1=2,ndo2,2 - do 315 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - 315 continue - do 316 k=1,nt - do 316 np1=3,ndo1,2 - do 316 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 316 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 330 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 326 - do 325 k=1,nt - do 324 np1=mp1,ndo1,2 - mn = mb+np1 - do 323 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 323 continue - if(mlat .eq. 0) go to 324 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 324 continue - 325 continue - 326 if(mp2 .gt. ndo2) go to 330 - do 329 k=1,nt - do 328 np1=mp2,ndo2,2 - mn = mb+np1 - do 327 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 327 continue - if(mlat .eq. 0) go to 328 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 328 continue - 329 continue - 330 continue - go to 950 -c -c case ityp=4 v odd, w even, and both cr and ci equal zero -c -c case m = 0 -c - 400 do 415 k=1,nt - do 415 np1=2,ndo2,2 - do 415 i=1,imm1 - vto(i,1,k)=vto(i,1,k)+br(1,np1,k)*vb(i,np1) - 415 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 430 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 430 - do 429 k=1,nt - do 428 np1=mp2,ndo2,2 - mn = mb+np1 - do 427 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 427 continue - if(mlat .eq. 0) go to 428 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -bi(mp1,np1,k)*wb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 +br(mp1,np1,k)*wb(imid,mn) - 428 continue - 429 continue - 430 continue - go to 950 -c -c case ityp=5 v odd, w even, br and bi equal zero -c -c case m = 0 -c - 500 do 516 k=1,nt - do 516 np1=3,ndo1,2 - do 516 i=1,imid - wte(i,1,k)=wte(i,1,k)-cr(1,np1,k)*vb(i,np1) - 516 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 530 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 530 - do 525 k=1,nt - do 524 np1=mp1,ndo1,2 - mn = mb+np1 - do 523 i=1,imm1 - vto(i,2*mp1-2,k) = vto(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vto(i,2*mp1-1,k) = vto(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wte(i,2*mp1-2,k) = wte(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wte(i,2*mp1-1,k) = wte(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 523 continue - if(mlat .eq. 0) go to 524 - wte(imid,2*mp1-2,k) = wte(imid,2*mp1-2,k) - 1 -cr(mp1,np1,k)*vb(imid,mn) - wte(imid,2*mp1-1,k) = wte(imid,2*mp1-1,k) - 1 -ci(mp1,np1,k)*vb(imid,mn) - 524 continue - 525 continue - 530 continue - go to 950 -c -c case ityp=6 v even , w odd -c -c case m = 0 -c - 600 do 615 k=1,nt - do 615 np1=2,ndo2,2 - do 615 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 615 continue - do 616 k=1,nt - do 616 np1=3,ndo1,2 - do 616 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - 616 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 630 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 626 - do 625 k=1,nt - do 624 np1=mp1,ndo1,2 - mn = mb+np1 - do 623 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 623 continue - if(mlat .eq. 0) go to 624 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 624 continue - 625 continue - 626 if(mp2 .gt. ndo2) go to 630 - do 629 k=1,nt - do 628 np1=mp2,ndo2,2 - mn = mb+np1 - do 627 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 627 continue - if(mlat .eq. 0) go to 628 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 628 continue - 629 continue - 630 continue - go to 950 -c -c case ityp=7 v even, w odd cr and ci equal zero -c -c case m = 0 -c - 700 do 716 k=1,nt - do 716 np1=3,ndo1,2 - do 716 i=1,imid - vte(i,1,k)=vte(i,1,k)+br(1,np1,k)*vb(i,np1) - 716 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 730 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp1 .gt. ndo1) go to 730 - do 725 k=1,nt - do 724 np1=mp1,ndo1,2 - mn = mb+np1 - do 723 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)+br(mp1,np1,k)*vb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+bi(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-bi(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)+br(mp1,np1,k)*wb(i,mn) - 723 continue - if(mlat .eq. 0) go to 724 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 +br(mp1,np1,k)*vb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +bi(mp1,np1,k)*vb(imid,mn) - 724 continue - 725 continue - 730 continue - go to 950 -c -c case ityp=8 v even, w odd, br and bi equal zero -c -c case m = 0 -c - 800 do 815 k=1,nt - do 815 np1=2,ndo2,2 - do 815 i=1,imm1 - wto(i,1,k)=wto(i,1,k)-cr(1,np1,k)*vb(i,np1) - 815 continue -c -c case m = 1 through nlat-1 -c - if(mmax .lt. 2) go to 950 - do 830 mp1=2,mmax - m = mp1-1 - mb = m*(nlat-1)-(m*(m-1))/2 - mp2 = mp1+1 - if(mp2 .gt. ndo2) go to 830 - do 829 k=1,nt - do 828 np1=mp2,ndo2,2 - mn = mb+np1 - do 827 i=1,imm1 - vte(i,2*mp1-2,k) = vte(i,2*mp1-2,k)-ci(mp1,np1,k)*wb(i,mn) - vte(i,2*mp1-1,k) = vte(i,2*mp1-1,k)+cr(mp1,np1,k)*wb(i,mn) - wto(i,2*mp1-2,k) = wto(i,2*mp1-2,k)-cr(mp1,np1,k)*vb(i,mn) - wto(i,2*mp1-1,k) = wto(i,2*mp1-1,k)-ci(mp1,np1,k)*vb(i,mn) - 827 continue - if(mlat .eq. 0) go to 828 - vte(imid,2*mp1-2,k) = vte(imid,2*mp1-2,k) - 1 -ci(mp1,np1,k)*wb(imid,mn) - vte(imid,2*mp1-1,k) = vte(imid,2*mp1-1,k) - 1 +cr(mp1,np1,k)*wb(imid,mn) - 828 continue - 829 continue - 830 continue - 950 do 14 k=1,nt - call hrfftb(idv,nlon,vte(1,1,k),idv,wrfft,work) - call hrfftb(idv,nlon,wte(1,1,k),idv,wrfft,work) - 14 continue - if(ityp .gt. 2) go to 12 - do 60 k=1,nt - do 60 j=1,nlon - do 60 i=1,imm1 - vt(i,j,k) = .5*(vte(i,j,k)+vto(i,j,k)) - wt(i,j,k) = .5*(wte(i,j,k)+wto(i,j,k)) - vt(nlp1-i,j,k) = .5*(vte(i,j,k)-vto(i,j,k)) - wt(nlp1-i,j,k) = .5*(wte(i,j,k)-wto(i,j,k)) - 60 continue - go to 13 - 12 do 11 k=1,nt - do 11 j=1,nlon - do 11 i=1,imm1 - vt(i,j,k) = .5*vte(i,j,k) - wt(i,j,k) = .5*wte(i,j,k) - 11 continue - 13 if(mlat .eq. 0) return - do 65 k=1,nt - do 65 j=1,nlon - vt(imid,j,k) = .5*vte(imid,j,k) - wt(imid,j,k) = .5*wte(imid,j,k) - 65 continue - return - end - subroutine vtsgsi(nlat,nlon,wvts,lwvts,work,lwork,dwork,ldwork, - + ierror) -c -c define imid = (nlat+1)/2 and mmax = min0(nlat,(nlon+1)/2) -c the length of wvts is imid*mmax*(nlat+nlat-mmax+1)+nlon+15 -c and the length of work is labc+5*nlat*imid+2*nlat where -c labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 -c - dimension wvts(lwvts),work(lwork) - double precision dwork(ldwork) - ierror = 1 - if(nlat .lt. 3) return - ierror = 2 - if(nlon .lt. 1) return - ierror = 3 - mmax = min0(nlat,nlon/2+1) - imid = (nlat+1)/2 - lzimn = (imid*mmax*(nlat+nlat-mmax+1))/2 - if(lwvts .lt. lzimn+lzimn+nlon+15) return - ierror = 4 - labc = 3*(max0(mmax-2,0)*(nlat+nlat-mmax-1))/2 - lvin = 3*nlat*imid - lwvbin = 2*nlat*imid+labc - ltheta = nlat+nlat - if(lwork .lt. lvin+lwvbin+ltheta) return - ierror = 5 - if (ldwork .lt. 3*nlat+2) return - ierror = 0 - iw1 = lvin+1 - iw2 = iw1+lwvbin - jw1 = nlat+1 - jw2 = jw1+nlat - CALL VETG1(NLAT,NLON,IMID,WVTS,WVTS(LZIMN+1),WORK,work(IW1), - 1 DWORK,DWORK(JW1),DWORK(JW2),IERROR) - if(ierror .ne. 0) return - call hrffti(nlon,wvts(2*lzimn+1)) - return - end - subroutine vetg1(nlat,nlon,imid,vb,wb,vin,wvbin, - 1 theta,wts,dwork,ierror) - dimension vb(imid,*),wb(imid,*),vin(imid,nlat,3),wvbin(*) - double precision dwork(*),theta(*),wts(*) - mmax = min0(nlat,nlon/2+1) - ldwork = 1 - call gaqd(nlat,theta,wts,dwork,ldwork,ierr) - if(ierr .eq. 0) go to 10 - ierror = 10+ierr - return - 10 call vtgint (nlat,nlon,theta,wvbin,dwork) - do 33 mp1=1,mmax - m = mp1-1 - call vbin (0,nlat,nlon,m,vin,i3,wvbin) - do 33 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 33 i=1,imid - vb(i,mn) = vin(i,np1,i3) - 33 continue - call wtgint (nlat,nlon,theta,wvbin,dwork) - do 34 mp1=1,mmax - m = mp1-1 - call wbin (0,nlat,nlon,m,vin,i3,wvbin) - do 34 np1=mp1,nlat - mn = m*(nlat-1)-(m*(m-1))/2+np1 - do 34 i=1,imid - wb(i,mn) = vin(i,np1,i3) - 34 continue - return - end - - - - - - - diff --git a/sorc/hafs_tools.fd/libsrc/src/spline/CMakeLists.txt b/sorc/hafs_tools.fd/libsrc/src/spline/CMakeLists.txt deleted file mode 100644 index 38e799d95..000000000 --- a/sorc/hafs_tools.fd/libsrc/src/spline/CMakeLists.txt +++ /dev/null @@ -1,48 +0,0 @@ -#======================================================================= - -#$$$ CMAKEFILE DOCUMENTATION BLOCK - -# Copyright (C) 2018 Henry R. Winterbottom - -# Email: henry.winterbottom@noaa.gov - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# . - -# Review the README, within the top-level directory, which provides -# relevant instructions and (any) references cited by algorithms -# within this software suite. - -#======================================================================= - -# CMake pre-requisites - -include_directories(${NWP_LIBS_SOURCE_DIR}/src/spline) -set (LLIBS "m") -set (TARGET "spline") - -# CMake compiler flags - -set (CMAKE_Fortran_FLAGS "-O3 -g -convert big_endian") - -# CMake source codes declarations - -file (GLOB ftn_objs *.f90) -set (FTN_OBJS ${ftn_objs}) - -# CMake build and install instructions - -add_library (${TARGET} ${FTN_OBJS}) -install (TARGETS ${TARGET} DESTINATION ${INSTALL_PATH}) - diff --git a/sorc/hafs_tools.fd/sorc/build_hafs_utils.sh b/sorc/hafs_tools.fd/sorc/build_hafs_utils.sh new file mode 100755 index 000000000..cfd36c8de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/build_hafs_utils.sh @@ -0,0 +1,405 @@ +#!/bin/bash --posix + +################################################################################ +#### UNIX Script Documentation Block +## +## Script name: build_hafs_utils.sh +## +## Script description: Compile HAFS libraries and utility applications. +## +## Author: Henry R. Winterbottom +## +## Date: 2020-02-03 +## +## Abstract: This script compiles the HAFS local libraries +## (ext_libs) source codes and all utility applications. +## +## Script history log: +## +## 2020-02-03 Henry R. Winterbottom -- Original version. +## +## Usage: build_hafs_utils.sh +## +## Imported Shell Variables: +## +## Exported Shell Variables: +## +## Remarks: +## +## Condition codes: +## +## 0 - no problem encountered +## >0 - some problem encountered +## +## Attributes: +## +## Language: POSIX shell +## Machine: IBM SP +## +################################################################################ +## +## CMake based build: Biju Thomas 2021-01-04 +## Cleaning hafs_tools.fd: Biju Thomas 2021-03-23 +## * Removing sources that are not needed or no longer used +## * Merging internal libraries into a single folder with a single driver script +################################################################################# + +set -x -e + +#---- + +# FUNCTION: + +# _hafsutils_analysis_update.sh + +# DESCRIPTION: + +# This function compiles and install the HAFS utility analysis-update +# application. + +# NOTE: + +# This function should never be called directly by the user and is for +# internal use only within this script. + +_hafsutils_analysis_update (){ + + # Remove the build dir if it exists from previous build + if [ -d "${HAFS_UTILS_SORC}/build" ]; then + rm -rf ${HAFS_UTILS_SORC}/build + fi + + # Create a build directory for a fresh build + mkdir ${HAFS_UTILS_SORC}/build + + cd ${HAFS_UTILS_SORC}/build + + # Generate makefile using CMake for the application + if [[ $target = "wcoss_cray" ]]; then + cmake ../hafs_analysis_update -DCMAKE_Fortran_COMPILER=ftn -DCMAKE_C_COMPILER=cc + else + cmake ../hafs_analysis_update -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc + fi + + # Build the analysis-update application. + + make all + + # Move the analysis-update application executable to the HAFS + # utility application executables path. + make install +} + +#---- + +# FUNCTION: + +# _hafsutils_obs_preproc.sh + +# DESCRIPTION: + +# This function compiles and install the HAFS utility obs-preproc +# application. + +# NOTE: + +# This function should never be called directly by the user and is for +# internal use only within this script. + +_hafsutils_obs_preproc (){ + + # Remove the build dir if it exists from previous build + if [ -d "${HAFS_UTILS_SORC}/build" ]; then + rm -rf ${HAFS_UTILS_SORC}/build + fi + + # Create a build directory for a fresh build + mkdir ${HAFS_UTILS_SORC}/build + + cd ${HAFS_UTILS_SORC}/build + + # Generate makefile using CMake for the application + if [[ $target = "wcoss_cray" ]]; then + cmake ../hafs_obs_preproc -DCMAKE_Fortran_COMPILER=ftn -DCMAKE_C_COMPILER=cc + else + cmake ../hafs_obs_preproc -DCMAKE_Fortran_COMPILER=ifort -DCMAKE_C_COMPILER=icc + fi + + # Build the obs-preproc application. + make all + + # Move the analysis-update application executable to the HAFS + # utility application executables path. + make install +} + +#---- + +# FUNCTION: + +# build_hafsutils.sh + +# DESCRIPTION: + +# This function builds all source code and/or libraries for the HAFS +# utility applications. + +build_hafsutils (){ + + # Create a directory to contain all configure, make, and + # installation logs. + + mkdir -p ${HAFS_UTILS_SORC}/logs + + # Define the top-level directory for all HAFS utility libraries + # collected from external sources. + + export EXT_LIBS=${HAFS_UTILS_EXTLIBS} + + # Build the analysis-update application. + + _hafsutils_analysis_update + + # Build the obs-preproc application. + + _hafsutils_obs_preproc + +} + +#---- + +# FUNCTION: + +# _extlib_fftw.sh + +# DESCRIPTION: + +# This function configures, builds, and installs the FFTW +# application. + +# NOTE: + +# This function should never be called directly by the user and is for +# internal use only within this script. + +_extlib_fftw (){ + + # Move to the working directory for the FFTW application/library. + + cd ${HAFS_UTILS_EXTLIBS}/fftw + + # Define the local environment variables for the FFTW compilation. + + PREFIX=${HAFS_UTILS_EXTLIBS} + export F77=`which ifort` + export CC=`which gcc` + + # Configure the compile-time environment for the FFTW application + # build. + +# make clean + + ./configure --prefix=${PREFIX} --disable-doc + + # Build the FFTW application. + + make + + # Install the FFTW application. + + make install +} + +#---- + +# FUNCTION: + +# _extlib_shtns.sh + +# DESCRIPTION: + +# This function configures, builds, and installs the SHTNS +# application. + +# NOTE: + +# This function should never be called directly by the user and is for +# internal use only within this script. + +_extlib_shtns (){ + + # Move to the working directory for the SHTNS application/library. + + cd ${HAFS_UTILS_EXTLIBS}/shtns + + # Define the local environment variables for the SHTNS + # compilation. + + export LDFLAGS=-L${HAFS_UTILS_EXTLIBS}/lib + PREFIX=${HAFS_UTILS_EXTLIBS} + + # Configure the compile-time environment for the SHTNS application + # build. + + ./configure --prefix=${PREFIX} + + # Build the SHTNS application. + + make + + # Install the SHTNS application. + + make install +} + +#---- + +# FUNCTION: + +# build_extlibs.sh + +# DESCRIPTION: + +# This function builds all applications and/or libraries required for +# the HAFS utility applications. + +build_extlibs (){ + + # Create a directory to contain all configure, make, and + # installation logs. + + mkdir -p ${HAFS_UTILS_EXTLIBS}/logs + + # clean previous build + + cd ${HAFS_UTILS_EXTLIBS} + make clean + + # Build the FFTW application. + + _extlib_fftw + + # Build the SHTNS application. + + _extlib_shtns + + + # Create a directory to contain all configure, make, and + # installation logs. + + mkdir -p ${HAFS_UTILS_EXTLIBS}/logs + + # Move to the working directory for the HAFS utility libraries. + + cd ${HAFS_UTILS_EXTLIBS} + + # Build all utility libraries. + + _setup_compiler + make +} + +#---- + +# FUNCTION: + +# setup_hafs_utils_build.sh + +# DESCRIPTION: + +# This function configures the compile-time environment for the HAFS +# utility application compilations and builds. + +setup_hafs_utils_build (){ + + # Define the top-level directory for all HAFS utility application + # source codes; this includes the library paths. + + export HAFS_UTILS_SORC=`pwd` + + # Define a working directory to contain all HAFS utility + # application executables. + + export HAFS_UTILS_EXEC=${HAFS_UTILS_SORC}/../exec + + # Define the top-level directory for all HAFS utility external + # libraries. + + export HAFS_UTILS_EXTLIBS=${HAFS_UTILS_SORC}/hafs_extlibs + + if [ -d "${HAFS_UTILS_EXTLIBS}/lib" ]; then rm -Rf ${HAFS_UTILS_EXTLIBS}/lib; fi + if [ -d "${HAFS_UTILS_EXTLIBS}/bin" ]; then rm -Rf ${HAFS_UTILS_EXTLIBS}/bin; fi + if [ -d "${HAFS_UTILS_EXTLIBS}/include" ]; then rm -Rf ${HAFS_UTILS_EXTLIBS}/include; fi + if [ -d "${HAFS_UTILS_EXTLIBS}/logs" ]; then rm -Rf ${HAFS_UTILS_EXTLIBS}/logs; fi + + # Create a working directory to contain all HAFS utility + # application executables. + + mkdir -p ${HAFS_UTILS_EXEC} +} + +#---- + +# FUNCTION: + +# setup_compiler.sh + +# DESCRIPTION: + +# Define all compilers specific to the HAFS utility application +# builds. + +_setup_compiler (){ + export AR=/usr/bin/ar + export MKDIR=/bin/mkdir + export MV=/bin/mv + export RANLIB=/usr/bin/ranlib + export RM=/bin/rm + export CC=gcc + export F77=ifort + export FC=ifort + ##export MPIFC=mpif90 (Moved to build_tools.sh) + +# Define all compiler flags for the EXT-libs applications. + + export EXT_LIBS_CCFLAGS="-O3" + export EXT_LIBS_DEBUG="" + export EXT_LIBS_FCFLAGS="-O3 -mcmodel=large -convert big_endian" + +# Define all compiler flags for the analysis-update application. + + export ANALYSIS_UPDATE_DEBUG="" + export ANALYSIS_UPDATE_FCFLAGS="-O3 -heap-arrays -mkl=sequential -convert big_endian -assume byterecl -DLINUX" + +# Define all compiler flags for the obs-preproc application. + + export OBS_PREPROC_DEBUG="" + export OBS_PREPROC_FCFLAGS="-O3 -fp-model precise -assume byterecl -convert big_endian" +} + +#---- + +script_name=`basename "$0"` +start_date=`date` +echo "START ${script_name}: ${start_date}" + +# (1) Configure the local environment for the HAFS utility application +# compilations. + +setup_hafs_utils_build + +# (2) Build all libraries specific to numerical weather prediction +# (EXT) applications. + +build_extlibs + +# (3) Build all HAFS utility applications. + +build_hafsutils + +export ERR=$? +export err=${ERR} +stop_date=`date` +echo "STOP ${script_name}: ${stop_date}" + +exit ${err} diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/FindESMF.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/FindESMF.cmake new file mode 100644 index 000000000..de6e88909 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/FindESMF.cmake @@ -0,0 +1,105 @@ +# - Try to find ESMF +# +# Requires setting ESMFMKFILE to the filepath of esmf.mk. If this is NOT set, +# then ESMF_FOUND will always be FALSE. If ESMFMKFILE exists, then ESMF_FOUND=TRUE +# and all ESMF makefile variables will be set in the global scope. Optionally, +# set ESMF_MKGLOBALS to a string list to filter makefile variables. For example, +# to globally scope only ESMF_LIBSDIR and ESMF_APPSDIR variables, use this CMake +# command in CMakeLists.txt: +# +# set(ESMF_MKGLOBALS "LIBSDIR" "APPSDIR") + + +# Add the ESMFMKFILE path to the cache if defined as system env variable +if (DEFINED ENV{ESMFMKFILE} AND NOT DEFINED ESMFMKFILE) + set(ESMFMKFILE $ENV{ESMFMKFILE} CACHE FILEPATH "Path to ESMF mk file") +endif () + +# Found the mk file and ESMF exists on the system +if (EXISTS ${ESMFMKFILE}) + set(ESMF_FOUND TRUE CACHE BOOL "ESMF mk file found" FORCE) + # Did not find the ESMF mk file +else() + set(ESMF_FOUND FALSE CACHE BOOL "ESMF mk file NOT found" FORCE) + # Best to warn users that without the mk file there is no way to find ESMF + if (NOT DEFINED ESMFMKFILE) + message(WARNING "ESMFMKFILE not defined. This is the path to esmf.mk file. \ +Without this filepath, ESMF_FOUND will always be FALSE.") + endif () +endif() + +# Only parse the mk file if it is found +if (ESMF_FOUND) + # Read the mk file + file(STRINGS "${ESMFMKFILE}" esmfmkfile_contents) + # Parse each line in the mk file + foreach(str ${esmfmkfile_contents}) + # Only consider uncommented lines + string(REGEX MATCH "^[^#]" def ${str}) + # Line is not commented + if (def) + # Extract the variable name + string(REGEX MATCH "^[^=]+" esmf_varname ${str}) + # Extract the variable's value + string(REGEX MATCH "=.+$" esmf_vardef ${str}) + # Only for variables with a defined value + if (esmf_vardef) + # Get rid of the assignment string + string(SUBSTRING ${esmf_vardef} 1 -1 esmf_vardef) + # Remove whitespace + string(STRIP ${esmf_vardef} esmf_vardef) + # A string or single-valued list + if(NOT DEFINED ESMF_MKGLOBALS) + # Set in global scope + set(${esmf_varname} ${esmf_vardef}) + # Don't display by default in GUI + mark_as_advanced(esmf_varname) + else() # Need to filter global promotion + foreach(m ${ESMF_MKGLOBALS}) + string(FIND ${esmf_varname} ${m} match) + # Found the string + if(NOT ${match} EQUAL -1) + # Promote to global scope + set(${esmf_varname} ${esmf_vardef}) + # Don't display by default in the GUI + mark_as_advanced (esmf_varname) + # No need to search for the current string filter + break() + endif() + endforeach() + endif() + endif() + endif() + endforeach() + + separate_arguments(ESMF_F90COMPILEPATHS NATIVE_COMMAND ${ESMF_F90COMPILEPATHS}) + foreach (ITEM ${ESMF_F90COMPILEPATHS}) + string(REGEX REPLACE "^-I" "" ITEM "${ITEM}") + list(APPEND tmp ${ITEM}) + endforeach() + set(ESMF_F90COMPILEPATHS ${tmp}) + + add_library(esmf UNKNOWN IMPORTED) + # Look for static library, if not found try dynamic library + find_library(esmf_lib NAMES libesmf.a PATHS ${ESMF_LIBSDIR}) + if(esmf_lib MATCHES "esmf_lib-NOTFOUND") + message(STATUS "Static ESMF library not found, searching for dynamic library instead") + find_library(esmf_lib NAMES esmf_fullylinked PATHS ${ESMF_LIBSDIR}) + if(esmf_lib MATCHES "esmf_lib-NOTFOUND") + message(WARNING "Neither the dynamic nor the static ESMF library was found") + else() + message(STATUS "Found ESMF library: ${esmf_lib}") + endif() + set(ESMF_INTERFACE_LINK_LIBRARIES "") + else() + # When linking the static library, also need the ESMF linker flags; strip any leading/trailing whitespaces + string(STRIP "${ESMF_F90ESMFLINKRPATHS} ${ESMF_F90ESMFLINKPATHS} ${ESMF_F90LINKLIBS} ${ESMF_F90LINKOPTS}" ESMF_INTERFACE_LINK_LIBRARIES) + message(STATUS "Found ESMF library: ${esmf_lib}") + endif() + + set_target_properties(esmf PROPERTIES + IMPORTED_LOCATION ${esmf_lib} + INTERFACE_INCLUDE_DIRECTORIES "${ESMF_F90COMPILEPATHS}" + INTERFACE_LINK_LIBRARIES "${ESMF_INTERFACE_LINK_LIBRARIES}") + +endif() diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/FindNetCDF.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/FindNetCDF.cmake new file mode 100644 index 000000000..1439ae848 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/FindNetCDF.cmake @@ -0,0 +1,337 @@ +# (C) Copyright 2011- ECMWF. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation nor +# does it submit to any jurisdiction. + +# Try to find NetCDF includes and library. +# Supports static and shared libaries and allows each component to be found in sepearte prefixes. +# +# This module defines +# +# - NetCDF_FOUND - System has NetCDF +# - NetCDF_INCLUDE_DIRS - the NetCDF include directories +# - NetCDF_VERSION - the version of NetCDF +# - NetCDF_CONFIG_EXECUTABLE - the netcdf-config executable if found +# - NetCDF_PARALLEL - Boolean True if NetCDF4 has parallel IO support via hdf5 and/or pnetcdf +# - NetCDF_HAS_PNETCDF - Boolean True if NetCDF4 has pnetcdf support +# +# Deprecated Defines +# - NetCDF_LIBRARIES - [Deprecated] Use NetCDF::NetCDF_ targets instead. +# +# +# Following components are available: +# +# - C - C interface to NetCDF (netcdf) +# - CXX - CXX4 interface to NetCDF (netcdf_c++4) +# - Fortran - Fortran interface to NetCDF (netcdff) +# +# For each component the following are defined: +# +# - NetCDF__FOUND - whether the component is found +# - NetCDF__LIBRARIES - the libraries for the component +# - NetCDF__LIBRARY_SHARED - Boolean is true if libraries for component are shared +# - NetCDF__INCLUDE_DIRS - the include directories for specified component +# - NetCDF::NetCDF_ - target of component to be used with target_link_libraries() +# +# The following paths will be searched in order if set in CMake (first priority) or environment (second priority) +# +# - NetCDF_ROOT - root of NetCDF installation +# - NetCDF_PATH - root of NetCDF installation +# +# The search process begins with locating NetCDF Include headers. If these are in a non-standard location, +# set one of the following CMake or environment variables to point to the location: +# +# - NetCDF_INCLUDE_DIR or NetCDF_${comp}_INCLUDE_DIR +# - NetCDF_INCLUDE_DIRS or NetCDF_${comp}_INCLUDE_DIR +# +# Notes: +# +# - Use "NetCDF::NetCDF_" targets only. NetCDF_LIBRARIES exists for backwards compatibility and should not be used. +# - These targets have all the knowledge of include directories and library search directories, and a single +# call to target_link_libraries will provide all these transitive properties to your target. Normally all that is +# needed to build and link against NetCDF is, e.g.: +# target_link_libraries(my_c_tgt PUBLIC NetCDF::NetCDF_C) +# - "NetCDF" is always the preferred naming for this package, its targets, variables, and environment variables +# - For compatibility, some variables are also set/checked using alternate names NetCDF4, NETCDF, or NETCDF4 +# - Environments relying on these older environment variable names should move to using a "NetCDF_ROOT" environment variable +# - Preferred component capitalization follows the CMake LANGUAGES variables: i.e., C, Fortran, CXX +# - For compatibility, alternate capitalizations are supported but should not be used. +# - If no components are defined, all components will be searched +# + +list( APPEND _possible_components C CXX Fortran ) + +## Include names for each component +set( NetCDF_C_INCLUDE_NAME netcdf.h ) +set( NetCDF_CXX_INCLUDE_NAME netcdf ) +set( NetCDF_Fortran_INCLUDE_NAME netcdf.mod ) + +## Library names for each component +set( NetCDF_C_LIBRARY_NAME netcdf ) +set( NetCDF_CXX_LIBRARY_NAME netcdf_c++4 ) +set( NetCDF_Fortran_LIBRARY_NAME netcdff ) + +## Enumerate search components +foreach( _comp ${_possible_components} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_${_COMP} ${_comp} ) + set( _name_${_COMP} ${_comp} ) +endforeach() + +set( _search_components C) +foreach( _comp ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_${_COMP} ${_comp} ) + list( APPEND _search_components ${_name_${_COMP}} ) + if( NOT _name_${_COMP} ) + message(SEND_ERROR "Find${CMAKE_FIND_PACKAGE_NAME}: COMPONENT ${_comp} is not a valid component. Valid components: ${_possible_components}" ) + endif() +endforeach() +list( REMOVE_DUPLICATES _search_components ) + +## Search hints for finding include directories and libraries +foreach( _comp IN ITEMS "_" "_C_" "_Fortran_" "_CXX_" ) + foreach( _name IN ITEMS NetCDF4 NetCDF NETCDF4 NETCDF ) + foreach( _var IN ITEMS ROOT PATH ) + list(APPEND _search_hints ${${_name}${_comp}${_var}} $ENV{${_name}${_comp}${_var}} ) + list(APPEND _include_search_hints + ${${_name}${_comp}INCLUDE_DIR} $ENV{${_name}${_comp}INCLUDE_DIR} + ${${_name}${_comp}INCLUDE_DIRS} $ENV{${_name}${_comp}INCLUDE_DIRS} ) + endforeach() + endforeach() +endforeach() +#Old-school HPC module env variable names +foreach( _name IN ITEMS NetCDF4 NetCDF NETCDF4 NETCDF ) + foreach( _comp IN ITEMS "_C" "_Fortran" "_CXX" ) + list(APPEND _search_hints ${${_name}} $ENV{${_name}}) + list(APPEND _search_hints ${${_name}${_comp}} $ENV{${_name}${_comp}}) + endforeach() +endforeach() + +## Find headers for each component +set(NetCDF_INCLUDE_DIRS) +set(_new_search_components) +foreach( _comp IN LISTS _search_components ) + if(NOT ${PROJECT_NAME}_NetCDF_${_comp}_FOUND) + list(APPEND _new_search_components ${_comp}) + endif() + find_file(NetCDF_${_comp}_INCLUDE_FILE + NAMES ${NetCDF_${_comp}_INCLUDE_NAME} + DOC "NetCDF ${_comp} include directory" + HINTS ${_include_search_hints} ${_search_hints} + PATH_SUFFIXES include include/netcdf + ) + mark_as_advanced(NetCDF_${_comp}_INCLUDE_FILE) + message(DEBUG "NetCDF_${_comp}_INCLUDE_FILE: ${NetCDF_${_comp}_INCLUDE_FILE}") + if( NetCDF_${_comp}_INCLUDE_FILE ) + get_filename_component(NetCDF_${_comp}_INCLUDE_FILE ${NetCDF_${_comp}_INCLUDE_FILE} ABSOLUTE) + get_filename_component(NetCDF_${_comp}_INCLUDE_DIR ${NetCDF_${_comp}_INCLUDE_FILE} DIRECTORY) + list(APPEND NetCDF_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIR}) + endif() +endforeach() +if(NetCDF_INCLUDE_DIRS) + list(REMOVE_DUPLICATES NetCDF_INCLUDE_DIRS) +endif() +set(NetCDF_INCLUDE_DIRS "${NetCDF_INCLUDE_DIRS}" CACHE STRING "NetCDF Include directory paths" FORCE) + +## Find n*-config executables for search components +foreach( _comp IN LISTS _search_components ) + if( _comp MATCHES "^(C)$" ) + set(_conf "c") + elseif( _comp MATCHES "^(Fortran)$" ) + set(_conf "f") + elseif( _comp MATCHES "^(CXX)$" ) + set(_conf "cxx4") + endif() + find_program( NetCDF_${_comp}_CONFIG_EXECUTABLE + NAMES n${_conf}-config + HINTS ${NetCDF_INCLUDE_DIRS} ${_include_search_hints} ${_search_hints} + PATH_SUFFIXES bin Bin ../bin ../../bin + DOC "NetCDF n${_conf}-config helper" ) + message(DEBUG "NetCDF_${_comp}_CONFIG_EXECUTABLE: ${NetCDF_${_comp}_CONFIG_EXECUTABLE}") +endforeach() + +set(_C_libs_flag --libs) +set(_Fortran_libs_flag --flibs) +set(_CXX_libs_flag --libs) +set(_C_includes_flag --includedir) +set(_Fortran_includes_flag --includedir) +set(_CXX_includes_flag --includedir) +function(netcdf_config exec flag output_var) + set(${output_var} False PARENT_SCOPE) + if( exec ) + execute_process( COMMAND ${exec} ${flag} RESULT_VARIABLE _ret OUTPUT_VARIABLE _val) + if( _ret EQUAL 0 ) + string( STRIP ${_val} _val ) + set( ${output_var} ${_val} PARENT_SCOPE ) + endif() + endif() +endfunction() + +## Find libraries for each component +set( NetCDF_LIBRARIES ) +foreach( _comp IN LISTS _search_components ) + string( TOUPPER "${_comp}" _COMP ) + + find_library( NetCDF_${_comp}_LIBRARY + NAMES ${NetCDF_${_comp}_LIBRARY_NAME} + DOC "NetCDF ${_comp} library" + HINTS ${NetCDF_${_comp}_INCLUDE_DIRS} ${_search_hints} + PATH_SUFFIXES lib64 lib ../lib64 ../lib ../../lib64 ../../lib ) + mark_as_advanced( NetCDF_${_comp}_LIBRARY ) + get_filename_component(NetCDF_${_comp}_LIBRARY ${NetCDF_${_comp}_LIBRARY} ABSOLUTE) + set(NetCDF_${_comp}_LIBRARY ${NetCDF_${_comp}_LIBRARY} CACHE STRING "NetCDF ${_comp} library" FORCE) + message(DEBUG "NetCDF_${_comp}_LIBRARY: ${NetCDF_${_comp}_LIBRARY}") + + if( NetCDF_${_comp}_LIBRARY ) + if( NetCDF_${_comp}_LIBRARY MATCHES ".a$" ) + set( NetCDF_${_comp}_LIBRARY_SHARED FALSE ) + set( _library_type STATIC) + else() + list( APPEND NetCDF_LIBRARIES ${NetCDF_${_comp}_LIBRARY} ) + set( NetCDF_${_comp}_LIBRARY_SHARED TRUE ) + set( _library_type SHARED) + endif() + endif() + + #Use nc-config to set per-component LIBRARIES variable if possible + netcdf_config( ${NetCDF_${_comp}_CONFIG_EXECUTABLE} ${_${_comp}_libs_flag} _val ) + if( _val ) + set( NetCDF_${_comp}_LIBRARIES ${_val} ) + if(NOT NetCDF_${_comp}_LIBRARY_SHARED AND NOT NetCDF_${_comp}_FOUND) #Static targets should use nc_config to get a proper link line with all necessary static targets. + list( APPEND NetCDF_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + endif() + else() + set( NetCDF_${_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARY} ) + if(NOT NetCDF_${_comp}_LIBRARY_SHARED) + message(SEND_ERROR "Unable to properly find NetCDF. Found static libraries at: ${NetCDF_${_comp}_LIBRARY} but could not run nc-config: ${NetCDF_CONFIG_EXECUTABLE}") + endif() + endif() + + #Use nc-config to set per-component INCLUDE_DIRS variable if possible + netcdf_config( ${NetCDF_${_comp}_CONFIG_EXECUTABLE} ${_${_comp}_includes_flag} _val ) + if( _val ) + string( REPLACE " " ";" _val ${_val} ) + set( NetCDF_${_comp}_INCLUDE_DIRS ${_val} ) + else() + set( NetCDF_${_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIR} ) + endif() + + if( NetCDF_${_comp}_LIBRARIES AND NetCDF_${_comp}_INCLUDE_DIRS ) + set( ${CMAKE_FIND_PACKAGE_NAME}_${_arg_${_COMP}}_FOUND TRUE ) + if (NOT TARGET NetCDF::NetCDF_${_comp}) + add_library(NetCDF::NetCDF_${_comp} ${_library_type} IMPORTED) + set_target_properties(NetCDF::NetCDF_${_comp} PROPERTIES + IMPORTED_LOCATION ${NetCDF_${_comp}_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES "${NetCDF_${_comp}_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + endif() + endif() +endforeach() +if(NetCDF_LIBRARIES AND NetCDF_${_comp}_LIBRARY_SHARED) + list(REMOVE_DUPLICATES NetCDF_LIBRARIES) +endif() +set(NetCDF_LIBRARIES "${NetCDF_LIBRARIES}" CACHE STRING "NetCDF library targets" FORCE) + +## Find version via netcdf-config if possible +if (NetCDF_INCLUDE_DIRS) + if( NetCDF_C_CONFIG_EXECUTABLE ) + netcdf_config( ${NetCDF_C_CONFIG_EXECUTABLE} --version _vers ) + if( _vers ) + string(REGEX REPLACE ".* ((([0-9]+)\\.)+([0-9]+)).*" "\\1" NetCDF_VERSION "${_vers}" ) + endif() + else() + foreach( _dir IN LISTS NetCDF_INCLUDE_DIRS) + if( EXISTS "${_dir}/netcdf_meta.h" ) + file(STRINGS "${_dir}/netcdf_meta.h" _netcdf_version_lines + REGEX "#define[ \t]+NC_VERSION_(MAJOR|MINOR|PATCH|NOTE)") + string(REGEX REPLACE ".*NC_VERSION_MAJOR *\([0-9]*\).*" "\\1" _netcdf_version_major "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_MINOR *\([0-9]*\).*" "\\1" _netcdf_version_minor "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_PATCH *\([0-9]*\).*" "\\1" _netcdf_version_patch "${_netcdf_version_lines}") + string(REGEX REPLACE ".*NC_VERSION_NOTE *\"\([^\"]*\)\".*" "\\1" _netcdf_version_note "${_netcdf_version_lines}") + set(NetCDF_VERSION "${_netcdf_version_major}.${_netcdf_version_minor}.${_netcdf_version_patch}${_netcdf_version_note}") + unset(_netcdf_version_major) + unset(_netcdf_version_minor) + unset(_netcdf_version_patch) + unset(_netcdf_version_note) + unset(_netcdf_version_lines) + endif() + endforeach() + endif() +endif () + +## Detect additional package properties +netcdf_config(${NetCDF_C_CONFIG_EXECUTABLE} --has-parallel4 _val) +if( NOT _val MATCHES "^(yes|no)$" ) + netcdf_config(${NetCDF_C_CONFIG_EXECUTABLE} --has-parallel _val) +endif() +if( _val MATCHES "^(yes)$" ) + set(NetCDF_PARALLEL TRUE CACHE STRING "NetCDF has parallel IO capability via pnetcdf or hdf5." FORCE) +else() + set(NetCDF_PARALLEL FALSE CACHE STRING "NetCDF has no parallel IO capability." FORCE) +endif() + +## Finalize find_package +include(FindPackageHandleStandardArgs) + +if(NOT NetCDF_FOUND OR _new_search_components) + find_package_handle_standard_args( ${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS NetCDF_INCLUDE_DIRS NetCDF_LIBRARIES + VERSION_VAR NetCDF_VERSION + HANDLE_COMPONENTS ) +endif() + +foreach( _comp IN LISTS _search_components ) + if( NetCDF_${_comp}_FOUND ) + #Record found components to avoid duplication in NetCDF_LIBRARIES for static libraries + set(NetCDF_${_comp}_FOUND ${NetCDF_${_comp}_FOUND} CACHE BOOL "NetCDF ${_comp} Found" FORCE) + #Set a per-package, per-component found variable to communicate between multiple calls to find_package() + set(${PROJECT_NAME}_NetCDF_${_comp}_FOUND True) + endif() +endforeach() + +if( ${CMAKE_FIND_PACKAGE_NAME}_FOUND AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY AND _new_search_components) + message( STATUS "Find${CMAKE_FIND_PACKAGE_NAME} defines targets:" ) + message( STATUS " - NetCDF_VERSION [${NetCDF_VERSION}]") + message( STATUS " - NetCDF_PARALLEL [${NetCDF_PARALLEL}]") + foreach( _comp IN LISTS _new_search_components ) + string( TOUPPER "${_comp}" _COMP ) + message( STATUS " - NetCDF_${_comp}_CONFIG_EXECUTABLE [${NetCDF_${_comp}_CONFIG_EXECUTABLE}]") + if( ${CMAKE_FIND_PACKAGE_NAME}_${_arg_${_COMP}}_FOUND ) + get_filename_component(_root ${NetCDF_${_comp}_INCLUDE_DIR}/.. ABSOLUTE) + if( NetCDF_${_comp}_LIBRARY_SHARED ) + message( STATUS " - NetCDF::NetCDF_${_comp} [SHARED] [Root: ${_root}] Lib: ${NetCDF_${_comp}_LIBRARY} ") + else() + message( STATUS " - NetCDF::NetCDF_${_comp} [STATIC] [Root: ${_root}] Lib: ${NetCDF_${_comp}_LIBRARY} ") + endif() + endif() + endforeach() +endif() + +foreach( _prefix NetCDF NetCDF4 NETCDF NETCDF4 ${CMAKE_FIND_PACKAGE_NAME} ) + set( ${_prefix}_INCLUDE_DIRS ${NetCDF_INCLUDE_DIRS} ) + set( ${_prefix}_LIBRARIES ${NetCDF_LIBRARIES}) + set( ${_prefix}_VERSION ${NetCDF_VERSION} ) + set( ${_prefix}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_FOUND} ) + set( ${_prefix}_CONFIG_EXECUTABLE ${NetCDF_CONFIG_EXECUTABLE} ) + set( ${_prefix}_PARALLEL ${NetCDF_PARALLEL} ) + + foreach( _comp ${_search_components} ) + string( TOUPPER "${_comp}" _COMP ) + set( _arg_comp ${_arg_${_COMP}} ) + set( ${_prefix}_${_comp}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + set( ${_prefix}_${_COMP}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + set( ${_prefix}_${_arg_comp}_FOUND ${${CMAKE_FIND_PACKAGE_NAME}_${_arg_comp}_FOUND} ) + + set( ${_prefix}_${_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + set( ${_prefix}_${_COMP}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + set( ${_prefix}_${_arg_comp}_LIBRARIES ${NetCDF_${_comp}_LIBRARIES} ) + + set( ${_prefix}_${_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + set( ${_prefix}_${_COMP}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + set( ${_prefix}_${_arg_comp}_INCLUDE_DIRS ${NetCDF_${_comp}_INCLUDE_DIRS} ) + endforeach() +endforeach() diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/CMakeParseArguments.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/CMakeParseArguments.cmake new file mode 100644 index 000000000..7ee2bbace --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/CMakeParseArguments.cmake @@ -0,0 +1,11 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# CMakeParseArguments +# ------------------- +# +# This module once implemented the :command:`cmake_parse_arguments` command +# that is now implemented natively by CMake. It is now an empty placeholder +# for compatibility with projects that include it to get the command from +# CMake 3.4 and lower. diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindHDF5.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindHDF5.cmake new file mode 100644 index 000000000..fd8891cf2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindHDF5.cmake @@ -0,0 +1,934 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindHDF5 +# -------- +# +# Find HDF5, a library for reading and writing self describing array data. +# +# +# +# This module invokes the HDF5 wrapper compiler that should be installed +# alongside HDF5. Depending upon the HDF5 Configuration, the wrapper +# compiler is called either h5cc or h5pcc. If this succeeds, the module +# will then call the compiler with the -show argument to see what flags +# are used when compiling an HDF5 client application. +# +# The module will optionally accept the COMPONENTS argument. If no +# COMPONENTS are specified, then the find module will default to finding +# only the HDF5 C library. If one or more COMPONENTS are specified, the +# module will attempt to find the language bindings for the specified +# components. The only valid components are C, CXX, Fortran, HL, and +# Fortran_HL. If the COMPONENTS argument is not given, the module will +# attempt to find only the C bindings. +# +# This module will read the variable +# HDF5_USE_STATIC_LIBRARIES to determine whether or not to prefer a +# static link to a dynamic link for HDF5 and all of it's dependencies. +# To use this feature, make sure that the HDF5_USE_STATIC_LIBRARIES +# variable is set before the call to find_package. +# +# To provide the module with a hint about where to find your HDF5 +# installation, you can set the environment variable HDF5_ROOT. The +# Find module will then look in this path when searching for HDF5 +# executables, paths, and libraries. +# +# Both the serial and parallel HDF5 wrappers are considered and the first +# directory to contain either one will be used. In the event that both appear +# in the same directory the serial version is preferentially selected. This +# behavior can be reversed by setting the variable HDF5_PREFER_PARALLEL to +# true. +# +# In addition to finding the includes and libraries required to compile +# an HDF5 client application, this module also makes an effort to find +# tools that come with the HDF5 distribution that may be useful for +# regression testing. +# +# This module will define the following variables: +# +# :: +# +# HDF5_FOUND - true if HDF5 was found on the system +# HDF5_VERSION - HDF5 version in format Major.Minor.Release +# HDF5_INCLUDE_DIRS - Location of the hdf5 includes +# HDF5_INCLUDE_DIR - Location of the hdf5 includes (deprecated) +# HDF5_DEFINITIONS - Required compiler definitions for HDF5 +# HDF5_LIBRARIES - Required libraries for all requested bindings +# HDF5_HL_LIBRARIES - Required libraries for the HDF5 high level API for all +# bindings, if the HL component is enabled +# +# Available components are: C CXX Fortran and HL. For each enabled language +# binding, a corresponding HDF5_${LANG}_LIBRARIES variable, and potentially +# HDF5_${LANG}_DEFINITIONS, will be defined. +# If the HL component is enabled, then an HDF5_${LANG}_HL_LIBRARIES will +# also be defined. With all components enabled, the following variables will be defined: +# +# :: +# +# HDF5_C_DEFINITIONS -- Required compiler definitions for HDF5 C bindings +# HDF5_CXX_DEFINITIONS -- Required compiler definitions for HDF5 C++ bindings +# HDF5_Fortran_DEFINITIONS -- Required compiler definitions for HDF5 Fortran bindings +# HDF5_C_INCLUDE_DIRS -- Required include directories for HDF5 C bindings +# HDF5_CXX_INCLUDE_DIRS -- Required include directories for HDF5 C++ bindings +# HDF5_Fortran_INCLUDE_DIRS -- Required include directories for HDF5 Fortran bindings +# HDF5_C_LIBRARIES - Required libraries for the HDF5 C bindings +# HDF5_CXX_LIBRARIES - Required libraries for the HDF5 C++ bindings +# HDF5_Fortran_LIBRARIES - Required libraries for the HDF5 Fortran bindings +# HDF5_C_HL_LIBRARIES - Required libraries for the high level C bindings +# HDF5_CXX_HL_LIBRARIES - Required libraries for the high level C++ bindings +# HDF5_Fortran_HL_LIBRARIES - Required libraries for the high level Fortran +# bindings. +# +# HDF5_IS_PARALLEL - Whether or not HDF5 was found with parallel IO support +# HDF5_C_COMPILER_EXECUTABLE - the path to the HDF5 C wrapper compiler +# HDF5_CXX_COMPILER_EXECUTABLE - the path to the HDF5 C++ wrapper compiler +# HDF5_Fortran_COMPILER_EXECUTABLE - the path to the HDF5 Fortran wrapper compiler +# HDF5_C_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary C compiler +# which is also the HDF5 wrapper +# HDF5_CXX_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary C++ +# compiler which is also +# the HDF5 wrapper +# HDF5_Fortran_COMPILER_EXECUTABLE_NO_INTERROGATE - path to the primary +# Fortran compiler which +# is also the HDF5 wrapper +# HDF5_DIFF_EXECUTABLE - the path to the HDF5 dataset comparison tool +# +# The following variable can be set to guide the search for HDF5 libraries and includes: +# +# ``HDF5_ROOT`` +# Specify the path to the HDF5 installation to use. +# +# ``HDF5_FIND_DEBUG`` +# Set to a true value to get some extra debugging output. +# +# ``HDF5_NO_FIND_PACKAGE_CONFIG_FILE`` +# Set to a true value to skip trying to find ``hdf5-config.cmake``. + +# This module is maintained by Will Dicharry . + +include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# List of the valid HDF5 components +set(HDF5_VALID_LANGUAGE_BINDINGS C CXX Fortran) + +# Validate the list of find components. +if(NOT HDF5_FIND_COMPONENTS) + set(HDF5_LANGUAGE_BINDINGS "C") +else() + set(HDF5_LANGUAGE_BINDINGS) + # add the extra specified components, ensuring that they are valid. + set(FIND_HL OFF) + foreach(component IN LISTS HDF5_FIND_COMPONENTS) + list(FIND HDF5_VALID_LANGUAGE_BINDINGS ${component} component_location) + if(NOT component_location EQUAL -1) + list(APPEND HDF5_LANGUAGE_BINDINGS ${component}) + elseif(component STREQUAL "HL") + set(FIND_HL ON) + elseif(component STREQUAL "Fortran_HL") # only for compatibility + list(APPEND HDF5_LANGUAGE_BINDINGS Fortran) + set(FIND_HL ON) + set(HDF5_FIND_REQUIRED_Fortran_HL False) + set(HDF5_FIND_REQUIRED_Fortran True) + set(HDF5_FIND_REQUIRED_HL True) + else() + message(FATAL_ERROR "${component} is not a valid HDF5 component.") + endif() + endforeach() + if(NOT HDF5_LANGUAGE_BINDINGS) + get_property(__langs GLOBAL PROPERTY ENABLED_LANGUAGES) + foreach(__lang IN LISTS __langs) + if(__lang MATCHES "^(C|CXX|Fortran)$") + list(APPEND HDF5_LANGUAGE_BINDINGS ${__lang}) + endif() + endforeach() + endif() + list(REMOVE_ITEM HDF5_FIND_COMPONENTS Fortran_HL) # replaced by Fortran and HL + list(REMOVE_DUPLICATES HDF5_LANGUAGE_BINDINGS) +endif() + +# Determine whether to search for serial or parallel executable first +if(HDF5_PREFER_PARALLEL) + set(HDF5_C_COMPILER_NAMES h5pcc h5cc) + set(HDF5_CXX_COMPILER_NAMES h5pc++ h5c++) + set(HDF5_Fortran_COMPILER_NAMES h5pfc h5fc) +else() + set(HDF5_C_COMPILER_NAMES h5cc h5pcc) + set(HDF5_CXX_COMPILER_NAMES h5c++ h5pc++) + set(HDF5_Fortran_COMPILER_NAMES h5fc h5pfc) +endif() + +# We may have picked up some duplicates in various lists during the above +# process for the language bindings (both the C and C++ bindings depend on +# libz for example). Remove the duplicates. It appears that the default +# CMake behavior is to remove duplicates from the end of a list. However, +# for link lines, this is incorrect since unresolved symbols are searched +# for down the link line. Therefore, we reverse the list, remove the +# duplicates, and then reverse it again to get the duplicates removed from +# the beginning. +macro(_HDF5_remove_duplicates_from_beginning _list_name) + if(${_list_name}) + list(REVERSE ${_list_name}) + list(REMOVE_DUPLICATES ${_list_name}) + list(REVERSE ${_list_name}) + endif() +endmacro() + + +# Test first if the current compilers automatically wrap HDF5 + +function(_HDF5_test_regular_compiler_C success version is_parallel) + set(scratch_directory + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if(NOT ${success} OR + NOT EXISTS ${scratch_directory}/compiler_has_h5_c) + set(test_file ${scratch_directory}/cmake_hdf5_test.c) + file(WRITE ${test_file} + "#include \n" + "#include \n" + "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" + "#ifdef H5_HAVE_PARALLEL\n" + "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" + "#endif\n" + "int main(int argc, char **argv) {\n" + " int require = 0;\n" + " require += info_ver[argc];\n" + "#ifdef H5_HAVE_PARALLEL\n" + " require += info_parallel[argc];\n" + "#endif\n" + " hid_t fid;\n" + " fid = H5Fcreate(\"foo.h5\",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT);\n" + " return 0;\n" + "}") + try_compile(${success} ${scratch_directory} ${test_file} + COPY_FILE ${scratch_directory}/compiler_has_h5_c + ) + endif() + if(${success}) + file(STRINGS ${scratch_directory}/compiler_has_h5_c INFO_STRINGS + REGEX "^INFO:" + ) + string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?" + INFO_VER "${INFO_STRINGS}" + ) + set(${version} ${CMAKE_MATCH_1}) + if(CMAKE_MATCH_3) + set(${version} ${HDF5_C_VERSION}.${CMAKE_MATCH_3}) + endif() + set(${version} ${${version}} PARENT_SCOPE) + + if(INFO_STRINGS MATCHES "INFO:PARALLEL") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() +endfunction() + +function(_HDF5_test_regular_compiler_CXX success version is_parallel) + set(scratch_directory ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if(NOT ${success} OR + NOT EXISTS ${scratch_directory}/compiler_has_h5_cxx) + set(test_file ${scratch_directory}/cmake_hdf5_test.cxx) + file(WRITE ${test_file} + "#include \n" + "#ifndef H5_NO_NAMESPACE\n" + "using namespace H5;\n" + "#endif\n" + "const char* info_ver = \"INFO\" \":\" H5_VERSION;\n" + "#ifdef H5_HAVE_PARALLEL\n" + "const char* info_parallel = \"INFO\" \":\" \"PARALLEL\";\n" + "#endif\n" + "int main(int argc, char **argv) {\n" + " int require = 0;\n" + " require += info_ver[argc];\n" + "#ifdef H5_HAVE_PARALLEL\n" + " require += info_parallel[argc];\n" + "#endif\n" + " H5File file(\"foo.h5\", H5F_ACC_TRUNC);\n" + " return 0;\n" + "}") + try_compile(${success} ${scratch_directory} ${test_file} + COPY_FILE ${scratch_directory}/compiler_has_h5_cxx + ) + endif() + if(${success}) + file(STRINGS ${scratch_directory}/compiler_has_h5_cxx INFO_STRINGS + REGEX "^INFO:" + ) + string(REGEX MATCH "^INFO:([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?" + INFO_VER "${INFO_STRINGS}" + ) + set(${version} ${CMAKE_MATCH_1}) + if(CMAKE_MATCH_3) + set(${version} ${HDF5_CXX_VERSION}.${CMAKE_MATCH_3}) + endif() + set(${version} ${${version}} PARENT_SCOPE) + + if(INFO_STRINGS MATCHES "INFO:PARALLEL") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() +endfunction() + +function(_HDF5_test_regular_compiler_Fortran success is_parallel) + if(NOT ${success}) + set(scratch_directory + ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + set(test_file ${scratch_directory}/cmake_hdf5_test.f90) + file(WRITE ${test_file} + "program hdf5_hello\n" + " use hdf5\n" + " use h5lt\n" + " use h5ds\n" + " integer error\n" + " call h5open_f(error)\n" + " call h5close_f(error)\n" + "end\n") + try_compile(${success} ${scratch_directory} ${test_file}) + if(${success}) + execute_process(COMMAND ${CMAKE_Fortran_COMPILER} -showconfig + OUTPUT_VARIABLE config_output + ERROR_VARIABLE config_error + RESULT_VARIABLE config_result + ) + if(config_output MATCHES "Parallel HDF5: yes") + set(${is_parallel} TRUE PARENT_SCOPE) + else() + set(${is_parallel} FALSE PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + +# Invoke the HDF5 wrapper compiler. The compiler return value is stored to the +# return_value argument, the text output is stored to the output variable. +macro( _HDF5_invoke_compiler language output return_value version is_parallel) + set(${version}) + if(HDF5_USE_STATIC_LIBRARIES) + set(lib_type_args -noshlib) + else() + set(lib_type_args -shlib) + endif() + set(scratch_dir ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/hdf5) + if("${language}" STREQUAL "C") + set(test_file ${scratch_dir}/cmake_hdf5_test.c) + elseif("${language}" STREQUAL "CXX") + set(test_file ${scratch_dir}/cmake_hdf5_test.cxx) + elseif("${language}" STREQUAL "Fortran") + set(test_file ${scratch_dir}/cmake_hdf5_test.f90) + endif() + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -show ${lib_type_args} ${test_file} + OUTPUT_VARIABLE ${output} + RETURN_VALUE ${return_value} + ) + if(NOT ${${return_value}} EQUAL 0) + message(STATUS + "Unable to determine HDF5 ${language} flags from HDF5 wrapper.") + endif() + exec_program( ${HDF5_${language}_COMPILER_EXECUTABLE} + ARGS -showconfig + OUTPUT_VARIABLE config_output + RETURN_VALUE config_return + ) + if(NOT ${return_value} EQUAL 0) + message( STATUS + "Unable to determine HDF5 ${language} version from HDF5 wrapper.") + endif() + string(REGEX MATCH "HDF5 Version: ([a-zA-Z0-9\\.\\-]*)" version_match "${config_output}") + if(version_match) + string(REPLACE "HDF5 Version: " "" ${version} "${version_match}") + string(REPLACE "-patch" "." ${version} "${${version}}") + endif() + if(config_output MATCHES "Parallel HDF5: yes") + set(${is_parallel} TRUE) + else() + set(${is_parallel} FALSE) + endif() +endmacro() + +# Parse a compile line for definitions, includes, library paths, and libraries. +macro( _HDF5_parse_compile_line + compile_line_var + include_paths + definitions + library_paths + libraries + libraries_hl) + + separate_arguments(_HDF5_COMPILE_ARGS UNIX_COMMAND "${${compile_line_var}}") + + foreach(arg IN LISTS _HDF5_COMPILE_ARGS) + if("${arg}" MATCHES "^-I(.*)$") + # include directory + list(APPEND ${include_paths} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-D(.*)$") + # compile definition + list(APPEND ${definitions} "-D${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-L(.*)$") + # library search path + list(APPEND ${library_paths} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-l(hdf5.*hl.*)$") + # library name (hl) + list(APPEND ${libraries_hl} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^-l(.*)$") + # library name + list(APPEND ${libraries} "${CMAKE_MATCH_1}") + elseif("${arg}" MATCHES "^(.:)?[/\\].*\\.(a|so|dylib|sl|lib)$") + # library file + if(NOT EXISTS "${arg}") + continue() + endif() + get_filename_component(_HDF5_LPATH "${arg}" DIRECTORY) + get_filename_component(_HDF5_LNAME "${arg}" NAME_WE) + string(REGEX REPLACE "^lib" "" _HDF5_LNAME "${_HDF5_LNAME}") + list(APPEND ${library_paths} "${_HDF5_LPATH}") + if(_HDF5_LNAME MATCHES "hdf5.*hl") + list(APPEND ${libraries_hl} "${_HDF5_LNAME}") + else() + list(APPEND ${libraries} "${_HDF5_LNAME}") + endif() + endif() + endforeach() +endmacro() + +# Select a preferred imported configuration from a target +function(_HDF5_select_imported_config target imported_conf) + # We will first assign the value to a local variable _imported_conf, then assign + # it to the function argument at the end. + get_target_property(_imported_conf ${target} MAP_IMPORTED_CONFIG_${CMAKE_BUILD_TYPE}) + if (NOT _imported_conf) + # Get available imported configurations by examining target properties + get_target_property(_imported_conf ${target} IMPORTED_CONFIGURATIONS) + if(HDF5_FIND_DEBUG) + message(STATUS "Found imported configurations: ${_imported_conf}") + endif() + # Find the imported configuration that we prefer. + # We do this by making list of configurations in order of preference, + # starting with ${CMAKE_BUILD_TYPE} and ending with the first imported_conf + set(_preferred_confs ${CMAKE_BUILD_TYPE}) + list(GET _imported_conf 0 _fallback_conf) + list(APPEND _preferred_confs RELWITHDEBINFO RELEASE DEBUG ${_fallback_conf}) + if(HDF5_FIND_DEBUG) + message(STATUS "Start search through imported configurations in the following order: ${_preferred_confs}") + endif() + # Now find the first of these that is present in imported_conf + cmake_policy(PUSH) + cmake_policy(SET CMP0057 NEW) # support IN_LISTS + foreach (_conf IN LISTS _preferred_confs) + if (${_conf} IN_LIST _imported_conf) + set(_imported_conf ${_conf}) + break() + endif() + endforeach() + cmake_policy(POP) + endif() + if(HDF5_FIND_DEBUG) + message(STATUS "Selected imported configuration: ${_imported_conf}") + endif() + # assign value to function argument + set(${imported_conf} ${_imported_conf} PARENT_SCOPE) +endfunction() + + +if(NOT HDF5_ROOT) + set(HDF5_ROOT $ENV{HDF5_ROOT}) +endif() +if(HDF5_ROOT) + set(_HDF5_SEARCH_OPTS NO_DEFAULT_PATH) +else() + set(_HDF5_SEARCH_OPTS) +endif() + +# Try to find HDF5 using an installed hdf5-config.cmake +if(NOT HDF5_FOUND AND NOT HDF5_NO_FIND_PACKAGE_CONFIG_FILE) + find_package(HDF5 QUIET NO_MODULE + HINTS ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS} + ) + if( HDF5_FOUND) + if(HDF5_FIND_DEBUG) + message(STATUS "Found HDF5 at ${HDF5_DIR} via NO_MODULE. Now trying to extract locations etc.") + endif() + set(HDF5_IS_PARALLEL ${HDF5_ENABLE_PARALLEL}) + set(HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) + set(HDF5_LIBRARIES) + if (NOT TARGET hdf5 AND NOT TARGET hdf5-static AND NOT TARGET hdf5-shared) + # Some HDF5 versions (e.g. 1.8.18) used hdf5::hdf5 etc + set(_target_prefix "hdf5::") + endif() + set(HDF5_C_TARGET ${_target_prefix}hdf5) + set(HDF5_C_HL_TARGET ${_target_prefix}hdf5_hl) + set(HDF5_CXX_TARGET ${_target_prefix}hdf5_cpp) + set(HDF5_CXX_HL_TARGET ${_target_prefix}hdf5_hl_cpp) + set(HDF5_Fortran_TARGET ${_target_prefix}hdf5_fortran) + set(HDF5_Fortran_HL_TARGET ${_target_prefix}hdf5_hl_fortran) + set(HDF5_DEFINITIONS "") + if(HDF5_USE_STATIC_LIBRARIES) + set(_suffix "-static") + else() + set(_suffix "-shared") + endif() + foreach(_lang ${HDF5_LANGUAGE_BINDINGS}) + + #Older versions of hdf5 don't have a static/shared suffix so + #if we detect that occurrence clear the suffix + if(_suffix AND NOT TARGET ${HDF5_${_lang}_TARGET}${_suffix}) + if(NOT TARGET ${HDF5_${_lang}_TARGET}) + #cant find this component with or without the suffix + #so bail out, and let the following locate HDF5 + set(HDF5_FOUND FALSE) + break() + endif() + set(_suffix "") + endif() + + if(HDF5_FIND_DEBUG) + message(STATUS "Trying to get properties of target ${HDF5_${_lang}_TARGET}${_suffix}") + endif() + # Find library for this target. Complicated as on Windows with a DLL, we need to search for the import-lib. + _HDF5_select_imported_config(${HDF5_${_lang}_TARGET}${_suffix} _hdf5_imported_conf) + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} ) + if (NOT _hdf5_lang_location) + # no import lib, just try LOCATION + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf}) + if (NOT _hdf5_lang_location) + get_target_property(_hdf5_lang_location ${HDF5_${_lang}_TARGET}${_suffix} LOCATION) + endif() + endif() + if( _hdf5_lang_location ) + set(HDF5_${_lang}_LIBRARY ${_hdf5_lang_location}) + list(APPEND HDF5_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix}) + set(HDF5_${_lang}_LIBRARIES ${HDF5_${_lang}_TARGET}${_suffix}) + set(HDF5_${_lang}_FOUND True) + endif() + if(FIND_HL) + get_target_property(__lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} IMPORTED_IMPLIB_${_hdf5_imported_conf} ) + if (NOT _hdf5_lang_hl_location) + get_target_property(_hdf5_lang_hl_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION_${_hdf5_imported_conf}) + if (NOT _hdf5_hl_lang_location) + get_target_property(_hdf5_hl_lang_location ${HDF5_${_lang}_HL_TARGET}${_suffix} LOCATION) + endif() + endif() + if( _hdf5_lang_hl_location ) + set(HDF5_${_lang}_HL_LIBRARY ${_hdf5_lang_hl_location}) + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix}) + set(HDF5_${_lang}_HL_LIBRARIES ${HDF5_${_lang}_HL_TARGET}${_suffix}) + set(HDF5_HL_FOUND True) + endif() + unset(_hdf5_lang_hl_location) + endif() + unset(_hdf5_imported_conf) + unset(_hdf5_lang_location) + endforeach() + endif() +endif() + +if(NOT HDF5_FOUND) + set(_HDF5_NEED_TO_SEARCH False) + set(HDF5_COMPILER_NO_INTERROGATE True) + # Only search for languages we've enabled + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + # First check to see if our regular compiler is one of wrappers + if(__lang STREQUAL "C") + _HDF5_test_regular_compiler_C( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_VERSION + HDF5_${__lang}_IS_PARALLEL) + elseif(__lang STREQUAL "CXX") + _HDF5_test_regular_compiler_CXX( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_VERSION + HDF5_${__lang}_IS_PARALLEL) + elseif(__lang STREQUAL "Fortran") + _HDF5_test_regular_compiler_Fortran( + HDF5_${__lang}_COMPILER_NO_INTERROGATE + HDF5_${__lang}_IS_PARALLEL) + else() + continue() + endif() + if(HDF5_${__lang}_COMPILER_NO_INTERROGATE) + message(STATUS "HDF5: Using hdf5 compiler wrapper for all ${__lang} compiling") + set(HDF5_${__lang}_FOUND True) + set(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE + "${CMAKE_${__lang}_COMPILER}" + CACHE FILEPATH "HDF5 ${__lang} compiler wrapper") + set(HDF5_${__lang}_DEFINITIONS) + set(HDF5_${__lang}_INCLUDE_DIRS) + set(HDF5_${__lang}_LIBRARIES) + set(HDF5_${__lang}_HL_LIBRARIES) + + mark_as_advanced(HDF5_${__lang}_COMPILER_EXECUTABLE_NO_INTERROGATE) + + set(HDF5_${__lang}_FOUND True) + set(HDF5_HL_FOUND True) + else() + set(HDF5_COMPILER_NO_INTERROGATE False) + # If this language isn't using the wrapper, then try to seed the + # search options with the wrapper + find_program(HDF5_${__lang}_COMPILER_EXECUTABLE + NAMES ${HDF5_${__lang}_COMPILER_NAMES} NAMES_PER_DIR + HINTS ${HDF5_ROOT} + PATH_SUFFIXES bin Bin + DOC "HDF5 ${__lang} Wrapper compiler. Used only to detect HDF5 compile flags." + ${_HDF5_SEARCH_OPTS} + ) + mark_as_advanced( HDF5_${__lang}_COMPILER_EXECUTABLE ) + unset(HDF5_${__lang}_COMPILER_NAMES) + + if(HDF5_${__lang}_COMPILER_EXECUTABLE) + _HDF5_invoke_compiler(${__lang} HDF5_${__lang}_COMPILE_LINE + HDF5_${__lang}_RETURN_VALUE HDF5_${__lang}_VERSION HDF5_${__lang}_IS_PARALLEL) + if(HDF5_${__lang}_RETURN_VALUE EQUAL 0) + message(STATUS "HDF5: Using hdf5 compiler wrapper to determine ${__lang} configuration") + _HDF5_parse_compile_line( HDF5_${__lang}_COMPILE_LINE + HDF5_${__lang}_INCLUDE_DIRS + HDF5_${__lang}_DEFINITIONS + HDF5_${__lang}_LIBRARY_DIRS + HDF5_${__lang}_LIBRARY_NAMES + HDF5_${__lang}_HL_LIBRARY_NAMES + ) + set(HDF5_${__lang}_LIBRARIES) + + foreach(L IN LISTS HDF5_${__lang}_LIBRARY_NAMES) + set(_HDF5_SEARCH_NAMES_LOCAL) + if("x${L}" MATCHES "hdf5") + # hdf5 library + set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS}) + if(HDF5_USE_STATIC_LIBRARIES) + if(WIN32) + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}) + else() + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a) + endif() + endif() + else() + # external library + set(_HDF5_SEARCH_OPTS_LOCAL) + endif() + find_library(HDF5_${__lang}_LIBRARY_${L} + NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR + HINTS ${HDF5_${__lang}_LIBRARY_DIRS} + ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS_LOCAL} + ) + unset(_HDF5_SEARCH_OPTS_LOCAL) + unset(_HDF5_SEARCH_NAMES_LOCAL) + if(HDF5_${__lang}_LIBRARY_${L}) + list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}}) + else() + list(APPEND HDF5_${__lang}_LIBRARIES ${L}) + endif() + endforeach() + if(FIND_HL) + set(HDF5_${__lang}_HL_LIBRARIES) + foreach(L IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES) + set(_HDF5_SEARCH_NAMES_LOCAL) + if("x${L}" MATCHES "hdf5") + # hdf5 library + set(_HDF5_SEARCH_OPTS_LOCAL ${_HDF5_SEARCH_OPTS}) + if(HDF5_USE_STATIC_LIBRARIES) + if(WIN32) + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}) + else() + set(_HDF5_SEARCH_NAMES_LOCAL lib${L}.a) + endif() + endif() + else() + # external library + set(_HDF5_SEARCH_OPTS_LOCAL) + endif() + find_library(HDF5_${__lang}_LIBRARY_${L} + NAMES ${_HDF5_SEARCH_NAMES_LOCAL} ${L} NAMES_PER_DIR + HINTS ${HDF5_${__lang}_LIBRARY_DIRS} + ${HDF5_ROOT} + ${_HDF5_SEARCH_OPTS_LOCAL} + ) + unset(_HDF5_SEARCH_OPTS_LOCAL) + unset(_HDF5_SEARCH_NAMES_LOCAL) + if(HDF5_${__lang}_LIBRARY_${L}) + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${__lang}_LIBRARY_${L}}) + else() + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${L}) + endif() + endforeach() + set(HDF5_HL_FOUND True) + endif() + + set(HDF5_${__lang}_FOUND True) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_${__lang}_HL_LIBRARIES) + else() + set(_HDF5_NEED_TO_SEARCH True) + endif() + else() + set(_HDF5_NEED_TO_SEARCH True) + endif() + endif() + if(HDF5_${__lang}_VERSION) + if(NOT HDF5_VERSION) + set(HDF5_VERSION ${HDF5_${__lang}_VERSION}) + elseif(NOT HDF5_VERSION VERSION_EQUAL HDF5_${__lang}_VERSION) + message(WARNING "HDF5 Version found for language ${__lang}, ${HDF5_${__lang}_VERSION} is different than previously found version ${HDF5_VERSION}") + endif() + endif() + if(DEFINED HDF5_${__lang}_IS_PARALLEL) + if(NOT DEFINED HDF5_IS_PARALLEL) + set(HDF5_IS_PARALLEL ${HDF5_${__lang}_IS_PARALLEL}) + elseif(NOT HDF5_IS_PARALLEL AND HDF5_${__lang}_IS_PARALLEL) + message(WARNING "HDF5 found for language ${__lang} is parallel but previously found language is not parallel.") + elseif(HDF5_IS_PARALLEL AND NOT HDF5_${__lang}_IS_PARALLEL) + message(WARNING "HDF5 found for language ${__lang} is not parallel but previously found language is parallel.") + endif() + endif() + endforeach() +else() + set(_HDF5_NEED_TO_SEARCH True) +endif() + +if(NOT HDF5_FOUND AND HDF5_COMPILER_NO_INTERROGATE) + # No arguments necessary, all languages can use the compiler wrappers + set(HDF5_FOUND True) + set(HDF5_METHOD "Included by compiler wrappers") + set(HDF5_REQUIRED_VARS HDF5_METHOD) +elseif(NOT HDF5_FOUND AND NOT _HDF5_NEED_TO_SEARCH) + # Compiler wrappers aren't being used by the build but were found and used + # to determine necessary include and library flags + set(HDF5_INCLUDE_DIRS) + set(HDF5_LIBRARIES) + set(HDF5_HL_LIBRARIES) + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + if(HDF5_${__lang}_FOUND) + if(NOT HDF5_${__lang}_COMPILER_NO_INTERROGATE) + list(APPEND HDF5_DEFINITIONS ${HDF5_${__lang}_DEFINITIONS}) + list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIRS}) + list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES}) + if(FIND_HL) + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES}) + endif() + endif() + endif() + endforeach() + _HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES) + set(HDF5_FOUND True) + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES) + if(FIND_HL) + list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES) + endif() +endif() + +find_program( HDF5_DIFF_EXECUTABLE + NAMES h5diff + HINTS ${HDF5_ROOT} + PATH_SUFFIXES bin Bin + ${_HDF5_SEARCH_OPTS} + DOC "HDF5 file differencing tool." ) +mark_as_advanced( HDF5_DIFF_EXECUTABLE ) + +if( NOT HDF5_FOUND ) + # seed the initial lists of libraries to find with items we know we need + set(HDF5_C_LIBRARY_NAMES hdf5) + set(HDF5_C_HL_LIBRARY_NAMES hdf5_hl) + + set(HDF5_CXX_LIBRARY_NAMES hdf5_cpp ${HDF5_C_LIBRARY_NAMES}) + set(HDF5_CXX_HL_LIBRARY_NAMES hdf5_hl_cpp ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_CXX_LIBRARY_NAMES}) + + set(HDF5_Fortran_LIBRARY_NAMES hdf5_fortran ${HDF5_C_LIBRARY_NAMES}) + set(HDF5_Fortran_HL_LIBRARY_NAMES hdf5hl_fortran ${HDF5_C_HL_LIBRARY_NAMES} ${HDF5_Fortran_LIBRARY_NAMES}) + + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + # find the HDF5 include directories + if("${__lang}" STREQUAL "Fortran") + set(HDF5_INCLUDE_FILENAME hdf5.mod) + elseif("${__lang}" STREQUAL "CXX") + set(HDF5_INCLUDE_FILENAME H5Cpp.h) + else() + set(HDF5_INCLUDE_FILENAME hdf5.h) + endif() + + find_path(HDF5_${__lang}_INCLUDE_DIR ${HDF5_INCLUDE_FILENAME} + HINTS ${HDF5_ROOT} + PATHS $ENV{HOME}/.local/include + PATH_SUFFIXES include Include + ${_HDF5_SEARCH_OPTS} + ) + mark_as_advanced(HDF5_${__lang}_INCLUDE_DIR) + # set the _DIRS variable as this is what the user will normally use + set(HDF5_${__lang}_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR}) + list(APPEND HDF5_INCLUDE_DIRS ${HDF5_${__lang}_INCLUDE_DIR}) + + # find the HDF5 libraries + foreach(LIB IN LISTS HDF5_${__lang}_LIBRARY_NAMES) + if(HDF5_USE_STATIC_LIBRARIES) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See https://gitlab.kitware.com/cmake/cmake/issues/1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG + lib${LIB}d.a lib${LIB}_debug.a lib${LIB}d lib${LIB}_D lib${LIB}_debug + lib${LIB}d-static.a lib${LIB}_debug-static.a ${LIB}d-static ${LIB}_D-static ${LIB}_debug-static ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a lib${LIB} lib${LIB}-static.a ${LIB}-static) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ${LIB}_D ${LIB}_debug ${LIB}d-shared ${LIB}_D-shared ${LIB}_debug-shared) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ${LIB}-shared) + if(WIN32) + list(APPEND HDF5_DEFINITIONS "-DH5_BUILT_AS_DYNAMIC_LIB") + endif() + endif() + find_library(HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${__lang}_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + if(HDF5_${__lang}_LIBRARIES) + set(HDF5_${__lang}_FOUND True) + endif() + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_LIBRARIES ${HDF5_${__lang}_LIBRARIES}) + + if(FIND_HL) + foreach(LIB IN LISTS HDF5_${__lang}_HL_LIBRARY_NAMES) + if(HDF5_USE_STATIC_LIBRARIES) + # According to bug 1643 on the CMake bug tracker, this is the + # preferred method for searching for a static library. + # See https://gitlab.kitware.com/cmake/cmake/issues/1643. We search + # first for the full static library name, but fall back to a + # generic search on the name if the static search fails. + set( THIS_LIBRARY_SEARCH_DEBUG + lib${LIB}d.a lib${LIB}_debug.a lib${LIB}d lib${LIB}_D lib${LIB}_debug + lib${LIB}d-static.a lib${LIB}_debug-static.a lib${LIB}d-static lib${LIB}_D-static lib${LIB}_debug-static ) + set( THIS_LIBRARY_SEARCH_RELEASE lib${LIB}.a ${LIB} lib${LIB}-static.a lib${LIB}-static) + else() + set( THIS_LIBRARY_SEARCH_DEBUG ${LIB}d ${LIB}_D ${LIB}_debug ${LIB}d-shared ${LIB}_D-shared ${LIB}_debug-shared) + set( THIS_LIBRARY_SEARCH_RELEASE ${LIB} ${LIB}-shared) + endif() + find_library(HDF5_${LIB}_LIBRARY_DEBUG + NAMES ${THIS_LIBRARY_SEARCH_DEBUG} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + find_library( HDF5_${LIB}_LIBRARY_RELEASE + NAMES ${THIS_LIBRARY_SEARCH_RELEASE} + HINTS ${HDF5_ROOT} PATH_SUFFIXES lib Lib + ${_HDF5_SEARCH_OPTS} + ) + select_library_configurations( HDF5_${LIB} ) + list(APPEND HDF5_${__lang}_HL_LIBRARIES ${HDF5_${LIB}_LIBRARY}) + endforeach() + + # Append the libraries for this language binding to the list of all + # required libraries. + list(APPEND HDF5_HL_LIBRARIES ${HDF5_${__lang}_HL_LIBRARIES}) + endif() + endforeach() + if(FIND_HL AND HDF5_HL_LIBRARIES) + set(HDF5_HL_FOUND True) + endif() + + _HDF5_remove_duplicates_from_beginning(HDF5_DEFINITIONS) + _HDF5_remove_duplicates_from_beginning(HDF5_INCLUDE_DIRS) + _HDF5_remove_duplicates_from_beginning(HDF5_LIBRARIES) + _HDF5_remove_duplicates_from_beginning(HDF5_HL_LIBRARIES) + + # If the HDF5 include directory was found, open H5pubconf.h to determine if + # HDF5 was compiled with parallel IO support + set( HDF5_IS_PARALLEL FALSE ) + set( HDF5_VERSION "" ) + foreach( _dir IN LISTS HDF5_INCLUDE_DIRS ) + foreach(_hdr "${_dir}/H5pubconf.h" "${_dir}/H5pubconf-64.h" "${_dir}/H5pubconf-32.h") + if( EXISTS "${_hdr}" ) + file( STRINGS "${_hdr}" + HDF5_HAVE_PARALLEL_DEFINE + REGEX "HAVE_PARALLEL 1" ) + if( HDF5_HAVE_PARALLEL_DEFINE ) + set( HDF5_IS_PARALLEL TRUE ) + endif() + unset(HDF5_HAVE_PARALLEL_DEFINE) + + file( STRINGS "${_hdr}" + HDF5_VERSION_DEFINE + REGEX "^[ \t]*#[ \t]*define[ \t]+H5_VERSION[ \t]+" ) + if( "${HDF5_VERSION_DEFINE}" MATCHES + "H5_VERSION[ \t]+\"([0-9]+\\.[0-9]+\\.[0-9]+)(-patch([0-9]+))?\"" ) + set( HDF5_VERSION "${CMAKE_MATCH_1}" ) + if( CMAKE_MATCH_3 ) + set( HDF5_VERSION ${HDF5_VERSION}.${CMAKE_MATCH_3}) + endif() + endif() + unset(HDF5_VERSION_DEFINE) + endif() + endforeach() + endforeach() + set( HDF5_IS_PARALLEL ${HDF5_IS_PARALLEL} CACHE BOOL + "HDF5 library compiled with parallel IO support" ) + mark_as_advanced( HDF5_IS_PARALLEL ) + + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS) + if(FIND_HL) + list(APPEND HDF5_REQUIRED_VARS HDF5_HL_LIBRARIES) + endif() +endif() + +# For backwards compatibility we set HDF5_INCLUDE_DIR to the value of +# HDF5_INCLUDE_DIRS +if( HDF5_INCLUDE_DIRS ) + set( HDF5_INCLUDE_DIR "${HDF5_INCLUDE_DIRS}" ) +endif() + +# If HDF5_REQUIRED_VARS is empty at this point, then it's likely that +# something external is trying to explicitly pass already found +# locations +if(NOT HDF5_REQUIRED_VARS) + set(HDF5_REQUIRED_VARS HDF5_LIBRARIES HDF5_INCLUDE_DIRS) +endif() + +find_package_handle_standard_args(HDF5 + REQUIRED_VARS ${HDF5_REQUIRED_VARS} + VERSION_VAR HDF5_VERSION + HANDLE_COMPONENTS +) + +unset(_HDF5_SEARCH_OPTS) + +if( HDF5_FOUND AND NOT HDF5_DIR) + # hide HDF5_DIR for the non-advanced user to avoid confusion with + # HDF5_DIR-NOT_FOUND while HDF5 was found. + mark_as_advanced(HDF5_DIR) +endif() + +if (HDF5_FIND_DEBUG) + message(STATUS "HDF5_DIR: ${HDF5_DIR}") + message(STATUS "HDF5_DEFINITIONS: ${HDF5_DEFINITIONS}") + message(STATUS "HDF5_INCLUDE_DIRS: ${HDF5_INCLUDE_DIRS}") + message(STATUS "HDF5_LIBRARIES: ${HDF5_LIBRARIES}") + message(STATUS "HDF5_HL_LIBRARIES: ${HDF5_HL_LIBRARIES}") + foreach(__lang IN LISTS HDF5_LANGUAGE_BINDINGS) + message(STATUS "HDF5_${__lang}_DEFINITIONS: ${HDF5_${__lang}_DEFINITIONS}") + message(STATUS "HDF5_${__lang}_INCLUDE_DIR: ${HDF5_${__lang}_INCLUDE_DIR}") + message(STATUS "HDF5_${__lang}_INCLUDE_DIRS: ${HDF5_${__lang}_INCLUDE_DIRS}") + message(STATUS "HDF5_${__lang}_LIBRARY: ${HDF5_${__lang}_LIBRARY}") + message(STATUS "HDF5_${__lang}_LIBRARIES: ${HDF5_${__lang}_LIBRARIES}") + message(STATUS "HDF5_${__lang}_HL_LIBRARY: ${HDF5_${__lang}_HL_LIBRARY}") + message(STATUS "HDF5_${__lang}_HL_LIBRARIES: ${HDF5_${__lang}_HL_LIBRARIES}") + endforeach() +endif() diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI.cmake new file mode 100644 index 000000000..5cd2a2afe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI.cmake @@ -0,0 +1,1514 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindMPI +# ------- +# +# Find a Message Passing Interface (MPI) implementation. +# +# The Message Passing Interface (MPI) is a library used to write +# high-performance distributed-memory parallel applications, and is +# typically deployed on a cluster. MPI is a standard interface (defined +# by the MPI forum) for which many implementations are available. +# +# Variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module exposes the components ``C``, ``CXX``, ``MPICXX`` and ``Fortran``. +# Each of these controls the various MPI languages to search for. +# The difference between ``CXX`` and ``MPICXX`` is that ``CXX`` refers to the +# MPI C API being usable from C++, whereas ``MPICXX`` refers to the MPI-2 C++ API +# that was removed again in MPI-3. +# +# Depending on the enabled components the following variables will be set: +# +# ``MPI_FOUND`` +# Variable indicating that MPI settings for all requested languages have been found. +# If no components are specified, this is true if MPI settings for all enabled languages +# were detected. Note that the ``MPICXX`` component does not affect this variable. +# ``MPI_VERSION`` +# Minimal version of MPI detected among the requested languages, or all enabled languages +# if no components were specified. +# +# This module will set the following variables per language in your +# project, where ```` is one of C, CXX, or Fortran: +# +# ``MPI__FOUND`` +# Variable indicating the MPI settings for ```` were found and that +# simple MPI test programs compile with the provided settings. +# ``MPI__COMPILER`` +# MPI compiler for ```` if such a program exists. +# ``MPI__COMPILE_OPTIONS`` +# Compilation options for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__COMPILE_DEFINITIONS`` +# Compilation definitions for MPI programs in ````, given as a :ref:`;-list `. +# ``MPI__INCLUDE_DIRS`` +# Include path(s) for MPI header. +# ``MPI__LINK_FLAGS`` +# Linker flags for MPI programs. +# ``MPI__LIBRARIES`` +# All libraries to link MPI programs against. +# +# Additionally, the following :prop_tgt:`IMPORTED` targets are defined: +# +# ``MPI::MPI_`` +# Target for using MPI from ````. +# +# The following variables indicating which bindings are present will be defined: +# +# ``MPI_MPICXX_FOUND`` +# Variable indicating whether the MPI-2 C++ bindings are present (introduced in MPI-2, removed with MPI-3). +# ``MPI_Fortran_HAVE_F77_HEADER`` +# True if the Fortran 77 header ``mpif.h`` is available. +# ``MPI_Fortran_HAVE_F90_MODULE`` +# True if the Fortran 90 module ``mpi`` can be used for accessing MPI (MPI-2 and higher only). +# ``MPI_Fortran_HAVE_F08_MODULE`` +# True if the Fortran 2008 ``mpi_f08`` is available to MPI programs (MPI-3 and higher only). +# +# If possible, the MPI version will be determined by this module. The facilities to detect the MPI version +# were introduced with MPI-1.2, and therefore cannot be found for older MPI versions. +# +# ``MPI__VERSION_MAJOR`` +# Major version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION_MINOR`` +# Minor version of MPI implemented for ```` by the MPI distribution. +# ``MPI__VERSION`` +# MPI version implemented for ```` by the MPI distribution. +# +# Note that there's no variable for the C bindings being accessible through ``mpi.h``, since the MPI standards +# always have required this binding to work in both C and C++ code. +# +# For running MPI programs, the module sets the following variables +# +# ``MPIEXEC_EXECUTABLE`` +# Executable for running MPI programs, if such exists. +# ``MPIEXEC_NUMPROC_FLAG`` +# Flag to pass to ``mpiexec`` before giving it the number of processors to run on. +# ``MPIEXEC_MAX_NUMPROCS`` +# Number of MPI processors to utilize. Defaults to the number +# of processors detected on the host system. +# ``MPIEXEC_PREFLAGS`` +# Flags to pass to ``mpiexec`` directly before the executable to run. +# ``MPIEXEC_POSTFLAGS`` +# Flags to pass to ``mpiexec`` after other flags. +# +# Variables for locating MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# This module performs a three step search for an MPI implementation: +# +# 1. Check if the compiler has MPI support built-in. This is the case if the user passed a +# compiler wrapper as ``CMAKE__COMPILER`` or if they're on a Cray system. +# 2. Attempt to find an MPI compiler wrapper and determine the compiler information from it. +# 3. Try to find an MPI implementation that does not ship such a wrapper by guessing settings. +# Currently, only Microsoft MPI and MPICH2 on Windows are supported. +# +# For controlling the second step, the following variables may be set: +# +# ``MPI__COMPILER`` +# Search for the specified compiler wrapper and use it. +# ``MPI__COMPILER_FLAGS`` +# Flags to pass to the MPI compiler wrapper during interrogation. Some compiler wrappers +# support linking debug or tracing libraries if a specific flag is passed and this variable +# may be used to obtain them. +# ``MPI_COMPILER_FLAGS`` +# Used to initialize ``MPI__COMPILER_FLAGS`` if no language specific flag has been given. +# Empty by default. +# ``MPI_EXECUTABLE_SUFFIX`` +# A suffix which is appended to all names that are being looked for. For instance you may set this +# to ``.mpich`` or ``.openmpi`` to prefer the one or the other on Debian and its derivatives. +# +# In order to control the guessing step, the following variable may be set: +# +# ``MPI_GUESS_LIBRARY_NAME`` +# Valid values are ``MSMPI`` and ``MPICH2``. If set, only the given library will be searched for. +# By default, ``MSMPI`` will be preferred over ``MPICH2`` if both are available. +# This also sets ``MPI_SKIP_COMPILER_WRAPPER`` to ``true``, which may be overridden. +# +# Each of the search steps may be skipped with the following control variables: +# +# ``MPI_ASSUME_NO_BUILTIN_MPI`` +# If true, the module assumes that the compiler itself does not provide an MPI implementation and +# skips to step 2. +# ``MPI_SKIP_COMPILER_WRAPPER`` +# If true, no compiler wrapper will be searched for. +# ``MPI_SKIP_GUESSING`` +# If true, the guessing step will be skipped. +# +# Additionally, the following control variable is available to change search behavior: +# +# ``MPI_CXX_SKIP_MPICXX`` +# Add some definitions that will disable the MPI-2 C++ bindings. +# Currently supported are MPICH, Open MPI, Platform MPI and derivatives thereof, +# for example MVAPICH or Intel MPI. +# +# If the find procedure fails for a variable ``MPI__WORKS``, then the settings detected by or passed to +# the module did not work and even a simple MPI test program failed to compile. +# +# If all of these parameters were not sufficient to find the right MPI implementation, a user may +# disable the entire autodetection process by specifying both a list of libraries in ``MPI__LIBRARIES`` +# and a list of include directories in ``MPI__ADDITIONAL_INCLUDE_DIRS``. +# Any other variable may be set in addition to these two. The module will then validate the MPI settings and store the +# settings in the cache. +# +# Cache variables for MPI +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# The variable ``MPI__INCLUDE_DIRS`` will be assembled from the following variables. +# For C and CXX: +# +# ``MPI__HEADER_DIR`` +# Location of the ``mpi.h`` header on disk. +# +# For Fortran: +# +# ``MPI_Fortran_F77_HEADER_DIR`` +# Location of the Fortran 77 header ``mpif.h``, if it exists. +# ``MPI_Fortran_MODULE_DIR`` +# Location of the ``mpi`` or ``mpi_f08`` modules, if available. +# +# For all languages the following variables are additionally considered: +# +# ``MPI__ADDITIONAL_INCLUDE_DIRS`` +# A :ref:`;-list ` of paths needed in addition to the normal include directories. +# ``MPI__INCLUDE_DIR`` +# Path variables for include folders referred to by ````. +# ``MPI__ADDITIONAL_INCLUDE_VARS`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# The variable ``MPI__LIBRARIES`` will be assembled from the following variables: +# +# ``MPI__LIBRARY`` +# The location of a library called ```` for use with MPI. +# ``MPI__LIB_NAMES`` +# A :ref:`;-list ` of ```` that will be added to the include locations of ````. +# +# Usage of mpiexec +# ^^^^^^^^^^^^^^^^ +# +# When using ``MPIEXEC_EXECUTABLE`` to execute MPI applications, you should typically +# use all of the ``MPIEXEC_EXECUTABLE`` flags as follows: +# +# :: +# +# ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} +# ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS +# +# where ``EXECUTABLE`` is the MPI program, and ``ARGS`` are the arguments to +# pass to the MPI program. +# +# Advanced variables for using MPI +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# The module can perform some advanced feature detections upon explicit request. +# +# **Important notice:** The following checks cannot be performed without *executing* an MPI test program. +# Consider the special considerations for the behavior of :command:`try_run` during cross compilation. +# Moreover, running an MPI program can cause additional issues, like a firewall notification on some systems. +# You should only enable these detections if you absolutely need the information. +# +# If the following variables are set to true, the respective search will be performed: +# +# ``MPI_DETERMINE_Fortran_CAPABILITIES`` +# Determine for all available Fortran bindings what the values of ``MPI_SUBARRAYS_SUPPORTED`` and +# ``MPI_ASYNC_PROTECTS_NONBLOCKING`` are and make their values available as ``MPI_Fortran__SUBARRAYS`` +# and ``MPI_Fortran__ASYNCPROT``, where ```` is one of ``F77_HEADER``, ``F90_MODULE`` and +# ``F08_MODULE``. +# ``MPI_DETERMINE_LIBRARY_VERSION`` +# For each language, find the output of ``MPI_Get_library_version`` and make it available as ``MPI__LIBRARY_VERSION``. +# This information is usually tied to the runtime component of an MPI implementation and might differ depending on ````. +# Note that the return value is entirely implementation defined. This information might be used to identify +# the MPI vendor and for example pick the correct one of multiple third party binaries that matches the MPI vendor. +# +# Backward Compatibility +# ^^^^^^^^^^^^^^^^^^^^^^ +# +# For backward compatibility with older versions of FindMPI, these +# variables are set, but deprecated: +# +# :: +# +# MPI_COMPILER MPI_LIBRARY MPI_EXTRA_LIBRARY +# MPI_COMPILE_FLAGS MPI_INCLUDE_PATH MPI_LINK_FLAGS +# MPI_LIBRARIES +# +# In new projects, please use the ``MPI__XXX`` equivalents. +# Additionally, the following variables are deprecated: +# +# ``MPI__COMPILE_FLAGS`` +# Use ``MPI__COMPILE_OPTIONS`` and ``MPI__COMPILE_DEFINITIONS`` instead. +# ``MPI__INCLUDE_PATH`` +# For consumption use ``MPI__INCLUDE_DIRS`` and for specifying folders use ``MPI__ADDITIONAL_INCLUDE_DIRS`` instead. +# ``MPIEXEC`` +# Use ``MPIEXEC_EXECUTABLE`` instead. + +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) # if IN_LIST + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) + +# Generic compiler names +set(_MPI_C_GENERIC_COMPILER_NAMES mpicc mpcc mpicc_r mpcc_r) +set(_MPI_CXX_GENERIC_COMPILER_NAMES mpicxx mpiCC mpcxx mpCC mpic++ mpc++ + mpicxx_r mpiCC_r mpcxx_r mpCC_r mpic++_r mpc++_r) +set(_MPI_Fortran_GENERIC_COMPILER_NAMES mpif95 mpif95_r mpf95 mpf95_r + mpif90 mpif90_r mpf90 mpf90_r + mpif77 mpif77_r mpf77 mpf77_r + mpifc) + +# GNU compiler names +set(_MPI_GNU_C_COMPILER_NAMES mpigcc mpgcc mpigcc_r mpgcc_r) +set(_MPI_GNU_CXX_COMPILER_NAMES mpig++ mpg++ mpig++_r mpg++_r mpigxx) +set(_MPI_GNU_Fortran_COMPILER_NAMES mpigfortran mpgfortran mpigfortran_r mpgfortran_r + mpig77 mpig77_r mpg77 mpg77_r) + +# Intel MPI compiler names on Windows +if(WIN32) + list(APPEND _MPI_C_GENERIC_COMPILER_NAMES mpicc.bat) + list(APPEND _MPI_CXX_GENERIC_COMPILER_NAMES mpicxx.bat) + list(APPEND _MPI_Fortran_GENERIC_COMPILER_NAMES mpifc.bat) + + # Intel MPI compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc.bat) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc.bat) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort.bat mpif77.bat mpif90.bat) + + # Intel MPI compiler names for MSMPI + set(_MPI_MSVC_C_COMPILER_NAMES mpicl.bat) + set(_MPI_MSVC_CXX_COMPILER_NAMES mpicl.bat) +else() + # Intel compiler names + set(_MPI_Intel_C_COMPILER_NAMES mpiicc) + set(_MPI_Intel_CXX_COMPILER_NAMES mpiicpc mpiicxx mpiic++) + set(_MPI_Intel_Fortran_COMPILER_NAMES mpiifort mpiif95 mpiif90 mpiif77) +endif() + +# PGI compiler names +set(_MPI_PGI_C_COMPILER_NAMES mpipgcc mppgcc) +set(_MPI_PGI_CXX_COMPILER_NAMES mpipgCC mppgCC) +set(_MPI_PGI_Fortran_COMPILER_NAMES mpipgf95 mpipgf90 mppgf95 mppgf90 mpipgf77 mppgf77) + +# XLC MPI Compiler names +set(_MPI_XL_C_COMPILER_NAMES mpxlc mpxlc_r mpixlc mpixlc_r) +set(_MPI_XL_CXX_COMPILER_NAMES mpixlcxx mpixlC mpixlc++ mpxlcxx mpxlc++ mpixlc++ mpxlCC + mpixlcxx_r mpixlC_r mpixlc++_r mpxlcxx_r mpxlc++_r mpixlc++_r mpxlCC_r) +set(_MPI_XL_Fortran_COMPILER_NAMES mpixlf95 mpixlf95_r mpxlf95 mpxlf95_r + mpixlf90 mpixlf90_r mpxlf90 mpxlf90_r + mpixlf77 mpixlf77_r mpxlf77 mpxlf77_r + mpixlf mpixlf_r mpxlf mpxlf_r) + +# Prepend vendor-specific compiler wrappers to the list. If we don't know the compiler, +# attempt all of them. +# By attempting vendor-specific compiler names first, we should avoid situations where the compiler wrapper +# stems from a proprietary MPI and won't know which compiler it's being used for. For instance, Intel MPI +# controls its settings via the I_MPI_CC environment variables if the generic name is being used. +# If we know which compiler we're working with, we can use the most specialized wrapper there is in order to +# pick up the right settings for it. +foreach (LANG IN ITEMS C CXX Fortran) + set(_MPI_${LANG}_COMPILER_NAMES "") + foreach (id IN ITEMS GNU Intel MSVC PGI XL) + if (NOT CMAKE_${LANG}_COMPILER_ID OR CMAKE_${LANG}_COMPILER_ID STREQUAL id) + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${id}_${LANG}_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + endif() + unset(_MPI_${id}_${LANG}_COMPILER_NAMES) + endforeach() + list(APPEND _MPI_${LANG}_COMPILER_NAMES ${_MPI_${LANG}_GENERIC_COMPILER_NAMES}${MPI_EXECUTABLE_SUFFIX}) + unset(_MPI_${LANG}_GENERIC_COMPILER_NAMES) +endforeach() + +# Names to try for mpiexec +# Only mpiexec commands are guaranteed to behave as described in the standard, +# mpirun commands are not covered by the standard in any way whatsoever. +# lamexec is the executable for LAM/MPI, srun is for SLURM or Open MPI with SLURM support. +# srun -n X is however a valid command, so it behaves 'like' mpiexec. +set(_MPIEXEC_NAMES_BASE mpiexec mpiexec.hydra mpiexec.mpd mpirun lamexec srun) + +unset(_MPIEXEC_NAMES) +foreach(_MPIEXEC_NAME IN LISTS _MPIEXEC_NAMES_BASE) + list(APPEND _MPIEXEC_NAMES "${_MPIEXEC_NAME}${MPI_EXECUTABLE_SUFFIX}") +endforeach() +unset(_MPIEXEC_NAMES_BASE) + +function (_MPI_check_compiler LANG QUERY_FLAG OUTPUT_VARIABLE RESULT_VARIABLE) + if(DEFINED MPI_${LANG}_COMPILER_FLAGS) +# separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_${LANG}_COMPILER_FLAGS}") + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS "${MPI_${LANG}_COMPILER_FLAGS}") + else() + separate_arguments(_MPI_COMPILER_WRAPPER_OPTIONS NATIVE_COMMAND "${MPI_COMPILER_FLAGS}") + endif() + execute_process( + COMMAND ${MPI_${LANG}_COMPILER} ${_MPI_COMPILER_WRAPPER_OPTIONS} ${QUERY_FLAG} + OUTPUT_VARIABLE WRAPPER_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE WRAPPER_OUTPUT ERROR_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE WRAPPER_RETURN) + # Some compiler wrappers will yield spurious zero return values, for example + # Intel MPI tolerates unknown arguments and if the MPI wrappers loads a shared + # library that has invalid or missing version information there would be warning + # messages emitted by ld.so in the compiler output. In either case, we'll treat + # the output as invalid. + if("${WRAPPER_OUTPUT}" MATCHES "undefined reference|unrecognized|need to set|no version information available") + set(WRAPPER_RETURN 255) + endif() + # Ensure that no error output might be passed upwards. + if(NOT WRAPPER_RETURN EQUAL 0) + unset(WRAPPER_OUTPUT) + endif() + set(${OUTPUT_VARIABLE} "${WRAPPER_OUTPUT}" PARENT_SCOPE) + set(${RESULT_VARIABLE} "${WRAPPER_RETURN}" PARENT_SCOPE) +endfunction() + +function (_MPI_interrogate_compiler lang) + unset(MPI_COMPILE_CMDLINE) + unset(MPI_LINK_CMDLINE) + + unset(MPI_COMPILE_OPTIONS_WORK) + unset(MPI_COMPILE_DEFINITIONS_WORK) + unset(MPI_INCLUDE_DIRS_WORK) + unset(MPI_LINK_FLAGS_WORK) + unset(MPI_LIB_NAMES_WORK) + unset(MPI_LIB_FULLPATHS_WORK) + + # Check whether the -showme:compile option works. This indicates that we have either Open MPI + # or a newer version of LAM/MPI, and implies that -showme:link will also work. + # Open MPI also supports -show, but separates linker and compiler information + _MPI_check_compiler(${LANG} "-showme:compile" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme:link" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + + # MPICH and MVAPICH offer -compile-info and -link-info. + # For modern versions, both do the same as -show. However, for old versions, they do differ + # when called for mpicxx and mpif90 and it's necessary to use them over -show in order to find the + # removed MPI C++ bindings. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-compile-info" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + + if (MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-link-info" MPI_LINK_CMDLINE MPI_COMPILER_RETURN) + + if (NOT MPI_COMPILER_RETURN EQUAL 0) + unset(MPI_COMPILE_CMDLINE) + endif() + endif() + endif() + + # MPICH, MVAPICH2 and Intel MPI just use "-show". Open MPI also offers this, but the + # -showme commands are more specialized. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-show" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + # Older versions of LAM/MPI have "-showme". Open MPI also supports this. + # Unknown to MPICH, MVAPICH and Intel MPI. + if (NOT MPI_COMPILER_RETURN EQUAL 0) + _MPI_check_compiler(${LANG} "-showme" MPI_COMPILE_CMDLINE MPI_COMPILER_RETURN) + endif() + + if (NOT (MPI_COMPILER_RETURN EQUAL 0) OR NOT (DEFINED MPI_COMPILE_CMDLINE)) + # Cannot interrogate this compiler, so exit. + set(MPI_${LANG}_WRAPPER_FOUND FALSE PARENT_SCOPE) + return() + endif() + unset(MPI_COMPILER_RETURN) + + # We have our command lines, but we might need to copy MPI_COMPILE_CMDLINE + # into MPI_LINK_CMDLINE, if we didn't find the link line. + if (NOT DEFINED MPI_LINK_CMDLINE) + set(MPI_LINK_CMDLINE "${MPI_COMPILE_CMDLINE}") + endif() + + # At this point, we obtained some output from a compiler wrapper that works. + # We'll now try to parse it into variables with meaning to us. + if("${LANG}" STREQUAL "Fortran") + # Some MPICH-1 and MVAPICH-1 versions return a three command answer for Fortran, consisting + # out of a symlink command for mpif.h, the actual compiler command and a deletion of the + # created symlink. We need to detect that case, remember the include path and drop the + # symlink/deletion operation to obtain the link/compile lines we'd usually expect. + if("${MPI_COMPILE_CMDLINE}" MATCHES "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h") + get_filename_component(MPI_INCLUDE_DIRS_WORK "${CMAKE_MATCH_1}" DIRECTORY) + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "^ln -s ([^\" ]+|\"[^\"]+\") mpif.h\n" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "\nrm -f mpif.h$" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + endif() + + # The Intel MPI wrapper on Linux will emit some objcopy commands after its compile command + # if -static_mpi was passed to the wrapper. To avoid spurious matches, we need to drop these lines. + if(UNIX) + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_COMPILE_CMDLINE "${MPI_COMPILE_CMDLINE}") + string(REGEX REPLACE "(^|\n)objcopy[^\n]+(\n|$)" "" MPI_LINK_CMDLINE "${MPI_LINK_CMDLINE}") + endif() + + # Extract compile options from the compile command line. + string(REGEX MATCHALL "(^| )-f([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_OPTIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_OPTION IN LISTS MPI_ALL_COMPILE_OPTIONS) + string(REGEX REPLACE "^ " "" _MPI_COMPILE_OPTION "${_MPI_COMPILE_OPTION}") + # Ignore -fstack-protector directives: These occur on MPICH and MVAPICH when the libraries + # themselves were built with this flag. However, this flag is unrelated to using MPI, and + # we won't match the accompanying --param-ssp-size and -Wp,-D_FORTIFY_SOURCE flags and therefore + # produce inconsistent results with the regularly flags. + # Similarly, aliasing flags do not belong into our flag array. + if(NOT "${_MPI_COMPILE_OPTION}" MATCHES "^-f(stack-protector|(no-|)strict-aliasing|PI[CE]|pi[ce])") + list(APPEND MPI_COMPILE_OPTIONS_WORK "${_MPI_COMPILE_OPTION}") + endif() + endforeach() + + # Same deal, with the definitions. We also treat arguments passed to the preprocessor directly. + string(REGEX MATCHALL "(^| )(-Wp,|-Xpreprocessor |)[-/]D([^\" ]+|\"[^\"]+\")" MPI_ALL_COMPILE_DEFINITIONS "${MPI_COMPILE_CMDLINE}") + + foreach(_MPI_COMPILE_DEFINITION IN LISTS MPI_ALL_COMPILE_DEFINITIONS) + string(REGEX REPLACE "^ ?(-Wp,|-Xpreprocessor )?[-/]D" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + string(REPLACE "\"" "" _MPI_COMPILE_DEFINITION "${_MPI_COMPILE_DEFINITION}") + if(NOT "${_MPI_COMPILE_DEFINITION}" MATCHES "^_FORTIFY_SOURCE.*") + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${_MPI_COMPILE_DEFINITION}") + endif() + endforeach() + + # Extract include paths from compile command line + string(REGEX MATCHALL "(^| )[-/]I([^\" ]+|\"[^\"]+\")" MPI_ALL_INCLUDE_PATHS "${MPI_COMPILE_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:incdirs. + if (NOT MPI_ALL_INCLUDE_PATHS) + _MPI_check_compiler(${LANG} "-showme:incdirs" MPI_INCDIRS_CMDLINE MPI_INCDIRS_COMPILER_RETURN) + if(MPI_INCDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_INCLUDE_PATHS NATIVE_COMMAND "${MPI_INCDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_INCLUDE_PATH IN LISTS MPI_ALL_INCLUDE_PATHS) + string(REGEX REPLACE "^ ?[-/]I" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + string(REPLACE "\"" "" _MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}") + get_filename_component(_MPI_INCLUDE_PATH "${_MPI_INCLUDE_PATH}" REALPATH) + list(APPEND MPI_INCLUDE_DIRS_WORK "${_MPI_INCLUDE_PATH}") + endforeach() + + # Extract linker paths from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker |)(-L|[/-]LIBPATH:|[/-]libpath:)([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_PATHS "${MPI_LINK_CMDLINE}") + + # If extracting failed to work, we'll try using -showme:libdirs. + if (NOT MPI_ALL_LINK_PATHS) + _MPI_check_compiler(${LANG} "-showme:libdirs" MPI_LIBDIRS_CMDLINE MPI_LIBDIRS_COMPILER_RETURN) + if(MPI_LIBDIRS_COMPILER_RETURN) + separate_arguments(MPI_ALL_LINK_PATHS NATIVE_COMMAND "${MPI_LIBDIRS_CMDLINE}") + endif() + endif() + + foreach(_MPI_LPATH IN LISTS MPI_ALL_LINK_PATHS) + string(REGEX REPLACE "^ ?(-Wl,|-Xlinker )?(-L|[/-]LIBPATH:|[/-]libpath:)" "" _MPI_LPATH "${_MPI_LPATH}") + string(REPLACE "\"" "" _MPI_LPATH "${_MPI_LPATH}") + get_filename_component(_MPI_LPATH "${_MPI_LPATH}" REALPATH) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${_MPI_LPATH}") + endforeach() + + # Extract linker flags from the link command line + string(REGEX MATCHALL "(^| )(-Wl,|-Xlinker )([^\" ]+|\"[^\"]+\")" MPI_ALL_LINK_FLAGS "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LINK_FLAG IN LISTS MPI_ALL_LINK_FLAGS) + string(STRIP "${_MPI_LINK_FLAG}" _MPI_LINK_FLAG) + # MPI might be marked to build with non-executable stacks but this should not propagate. + if (NOT "${_MPI_LINK_FLAG}" MATCHES "(-Wl,|-Xlinker )-z,noexecstack") + if (MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " ${_MPI_LINK_FLAG}") + else() + set(MPI_LINK_FLAGS_WORK "${_MPI_LINK_FLAG}") + endif() + endif() + endforeach() + + # Extract the set of libraries to link against from the link command + # line + string(REGEX MATCHALL "(^| )-l([^\" ]+|\"[^\"]+\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ ?-l" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + + if(WIN32) + # A compiler wrapper on Windows will just have the name of the + # library to link on its link line, potentially with a full path + string(REGEX MATCHALL "(^| )([^\" ]+\\.lib|\"[^\"]+\\.lib\")" MPI_LIBNAMES "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBNAMES) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + else() + # On UNIX platforms, archive libraries can be given with full path. + string(REGEX MATCHALL "(^| )([^\" ]+\\.a|\"[^\"]+\\.a\")" MPI_LIBFULLPATHS "${MPI_LINK_CMDLINE}") + foreach(_MPI_LIB_NAME IN LISTS MPI_LIBFULLPATHS) + string(REGEX REPLACE "^ " "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + string(REPLACE "\"" "" _MPI_LIB_NAME "${_MPI_LIB_NAME}") + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_NAME}" DIRECTORY) + if(NOT "${_MPI_LIB_PATH}" STREQUAL "") + list(APPEND MPI_LIB_FULLPATHS_WORK "${_MPI_LIB_NAME}") + else() + list(APPEND MPI_LIB_NAMES_WORK "${_MPI_LIB_NAME}") + endif() + endforeach() + endif() + + # An MPI compiler wrapper could have its MPI libraries in the implictly + # linked directories of the compiler itself. + if(DEFINED CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(APPEND MPI_LINK_DIRECTORIES_WORK "${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}") + endif() + + # Determine full path names for all of the libraries that one needs + # to link against in an MPI program + unset(MPI_PLAIN_LIB_NAMES_WORK) + foreach(_MPI_LIB_NAME IN LISTS MPI_LIB_NAMES_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_NAME}" NAME_WE) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${MPI_LINK_DIRECTORIES_WORK} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + + # Deal with the libraries given with full path next + unset(MPI_DIRECT_LIB_NAMES_WORK) + foreach(_MPI_LIB_FULLPATH IN LISTS MPI_LIB_FULLPATHS_WORK) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB_FULLPATH}" NAME) + get_filename_component(_MPI_LIB_PATH "${_MPI_LIB_FULLPATH}" DIRECTORY) + list(APPEND MPI_DIRECT_LIB_NAMES_WORK "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_PATH} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endforeach() + if(MPI_DIRECT_LIB_NAMES_WORK) + set(MPI_PLAIN_LIB_NAMES_WORK "${MPI_DIRECT_LIB_NAMES_WORK};${MPI_PLAIN_LIB_NAMES_WORK}") + endif() + + # MPI might require pthread to work. The above mechanism wouldn't detect it, but we need to + # link it in that case. -lpthread is covered by the normal library treatment on the other hand. + if("${MPI_COMPILE_CMDLINE}" MATCHES "-pthread") + list(APPEND MPI_COMPILE_OPTIONS_WORK "-pthread") + if(MPI_LINK_FLAGS_WORK) + string(APPEND MPI_LINK_FLAGS_WORK " -pthread") + else() + set(MPI_LINK_FLAGS_WORK "-pthread") + endif() + endif() + + if(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + list(APPEND MPI_COMPILE_DEFINITIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS}") + endif() + if(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + list(APPEND MPI_COMPILE_OPTIONS_WORK "${MPI_${LANG}_EXTRA_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_EXTRA_LIB_NAMES) + list(APPEND MPI_PLAIN_LIB_NAMES_WORK "${MPI_${LANG}_EXTRA_LIB_NAMES}") + endif() + + # If we found MPI, set up all of the appropriate cache entries + if(NOT MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_COMPILE_OPTIONS_WORK} CACHE STRING "MPI ${LANG} compilation options" FORCE) + endif() + if(NOT MPI_${LANG}_COMPILE_DEFINITIONS) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_COMPILE_DEFINITIONS_WORK} CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_INCLUDE_DIRS_WORK} CACHE STRING "MPI ${LANG} additional include directories" FORCE) + endif() + if(NOT MPI_${LANG}_LINK_FLAGS) + set(MPI_${LANG}_LINK_FLAGS ${MPI_LINK_FLAGS_WORK} CACHE STRING "MPI ${LANG} linker flags" FORCE) + endif() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES ${MPI_PLAIN_LIB_NAMES_WORK} CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + set(MPI_${LANG}_WRAPPER_FOUND TRUE PARENT_SCOPE) +endfunction() + +function(_MPI_guess_settings LANG) + set(MPI_GUESS_FOUND FALSE) + # Currently only MSMPI and MPICH2 on Windows are supported, so we can skip this search if we're not targeting that. + if(WIN32) + # MSMPI + + # The environment variables MSMPI_INC and MSMPILIB32/64 are the only ways of locating the MSMPI_SDK, + # which is installed separately from the runtime. Thus it's possible to have mpiexec but not MPI headers + # or import libraries and vice versa. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MSMPI") + # We first attempt to locate the msmpi.lib. Should be find it, we'll assume that the MPI present is indeed + # Microsoft MPI. + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 8) + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB64}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x64") + else() + set(MPI_MSMPI_LIB_PATH "$ENV{MSMPI_LIB32}") + set(MPI_MSMPI_INC_PATH_EXTRA "$ENV{MSMPI_INC}/x86") + endif() + + find_library(MPI_msmpi_LIBRARY + NAMES msmpi + HINTS ${MPI_MSMPI_LIB_PATH} + DOC "Location of the msmpi library for Microsoft MPI") + mark_as_advanced(MPI_msmpi_LIBRARY) + + if(MPI_msmpi_LIBRARY) + # Next, we attempt to locate the MPI header. Note that for Fortran we know that mpif.h is a way + # MSMPI can be used and therefore that header has to be present. + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + get_filename_component(MPI_MSMPI_INC_DIR "$ENV{MSMPI_INC}" REALPATH) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MSMPI_INC_DIR}" CACHE STRING "MPI ${LANG} additional include directories" FORCE) + unset(MPI_MSMPI_INC_DIR) + endif() + + # For MSMPI, one can compile the MPI module by building the mpi.f90 shipped with the MSMPI SDK, + # thus it might be present or provided by the user. Figuring out which is supported is done later on. + # The PGI Fortran compiler for instance ships a prebuilt set of modules in its own include folder. + # Should a user be employing PGI or have built its own set and provided it via cache variables, the + # splitting routine would have located the module files. + + # For C and C++, we're done here (MSMPI does not ship the MPI-2 C++ bindings) - however, for Fortran + # we need some extra library to glue Fortran support together: + # MSMPI ships 2-4 Fortran libraries, each for different Fortran compiler behaviors. The library names + # ending with a c are using the cdecl calling convention, whereas those ending with an s are for Fortran + # implementations using stdcall. Therefore, the 64-bit MSMPI only ships those ending in 'c', whereas the 32-bit + # has both variants available. + # The second difference is the last but one letter, if it's an e(nd), the length of a string argument is + # passed by the Fortran compiler after all other arguments on the parameter list, if it's an m(ixed), + # it's passed immediately after the string address. + + # To summarize: + # - msmpifec: CHARACTER length passed after the parameter list and using cdecl calling convention + # - msmpifmc: CHARACTER length passed directly after string address and using cdecl calling convention + # - msmpifes: CHARACTER length passed after the parameter list and using stdcall calling convention + # - msmpifms: CHARACTER length passed directly after string address and using stdcall calling convention + # 32-bit MSMPI ships all four libraries, 64-bit MSMPI ships only the first two. + + # As is, Intel Fortran and PGI Fortran both use the 'ec' variant of the calling convention, whereas + # the old Compaq Visual Fortran compiler defaulted to the 'ms' version. It's possible to make Intel Fortran + # use the CVF calling convention using /iface:cvf, but we assume - and this is also assumed in FortranCInterface - + # this isn't the case. It's also possible to make CVF use the 'ec' variant, using /iface=(cref,nomixed_str_len_arg). + + # Our strategy is now to locate all libraries, but enter msmpifec into the LIB_NAMES array. + # Should this not be adequate it's a straightforward way for a user to change the LIB_NAMES array and + # have his library found. Still, this should not be necessary outside of exceptional cases, as reasoned. + if ("${LANG}" STREQUAL "Fortran") + set(MPI_MSMPI_CALLINGCONVS c) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL 4) + list(APPEND MPI_MSMPI_CALLINGCONVS s) + endif() + foreach(mpistrlenpos IN ITEMS e m) + foreach(mpicallingconv IN LISTS MPI_MSMPI_CALLINGCONVS) + find_library(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY + NAMES msmpif${mpistrlenpos}${mpicallingconv} + HINTS "${MPI_MSMPI_LIB_PATH}" + DOC "Location of the msmpi${mpistrlenpos}${mpicallingconv} library for Microsoft MPI") + mark_as_advanced(MPI_msmpif${mpistrlenpos}${mpicallingconv}_LIBRARY) + endforeach() + endforeach() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi;msmpifec" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + + # At this point we're *not* done. MSMPI requires an additional include file for Fortran giving the value + # of MPI_AINT. This file is called mpifptr.h located in the x64 and x86 subfolders, respectively. + find_path(MPI_mpifptr_INCLUDE_DIR + NAMES "mpifptr.h" + HINTS "${MPI_MSMPI_INC_PATH_EXTRA}" + DOC "Location of the mpifptr.h extra header for Microsoft MPI") + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS "mpifptr" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + mark_as_advanced(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS MPI_mpifptr_INCLUDE_DIR) + else() + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "msmpi" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + endif() + mark_as_advanced(MPI_${LANG}_LIB_NAMES) + set(MPI_GUESS_FOUND TRUE) + endif() + endif() + + # At this point there's not many MPIs that we could still consider. + # OpenMPI 1.6.x and below supported Windows, but these ship compiler wrappers that still work. + # The only other relevant MPI implementation without a wrapper is MPICH2, which had Windows support in 1.4.1p1 and older. + if(NOT MPI_GUESS_LIBRARY_NAME OR "${MPI_GUESS_LIBRARY_NAME}" STREQUAL "MPICH2") + set(MPI_MPICH_PREFIX_PATHS + "$ENV{ProgramW6432}/MPICH2/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH\\SMPD;binary]/../lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MPICH2;Path]/lib" + ) + + # All of C, C++ and Fortran will need mpi.lib, so we'll look for this first + find_library(MPI_mpi_LIBRARY + NAMES mpi + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_mpi_LIBRARY) + # If we found mpi.lib, we detect the rest of MPICH2 + if(MPI_mpi_LIBRARY) + set(MPI_MPICH_LIB_NAMES "mpi") + # If MPI-2 C++ bindings are requested, we need to locate cxx.lib as well. + # Otherwise, MPICH_SKIP_MPICXX will be defined and these bindings aren't needed. + if("${LANG}" STREQUAL "CXX" AND NOT MPI_CXX_SKIP_MPICXX) + find_library(MPI_cxx_LIBRARY + NAMES cxx + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_cxx_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "cxx") + # For Fortran, MPICH2 provides three different libraries: + # fmpich2.lib which uses uppercase symbols and cdecl, + # fmpich2s.lib which uses uppercase symbols and stdcall (32-bit only), + # fmpich2g.lib which uses lowercase symbols with double underscores and cdecl. + # fmpich2s.lib would be useful for Compaq Visual Fortran, fmpich2g.lib has to be used with GNU g77 and is also + # provided in the form of an .a archive for MinGW and Cygwin. From our perspective, fmpich2.lib is the only one + # we need to try, and if it doesn't work with the given Fortran compiler we'd find out later on during validation + elseif("${LANG}" STREQUAL "Fortran") + find_library(MPI_fmpich2_LIBRARY + NAMES fmpich2 + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2s_LIBRARY + NAMES fmpich2s + HINTS ${MPI_MPICH_PREFIX_PATHS}) + find_library(MPI_fmpich2g_LIBRARY + NAMES fmpich2g + HINTS ${MPI_MPICH_PREFIX_PATHS}) + mark_as_advanced(MPI_fmpich2_LIBRARY MPI_fmpich2s_LIBRARY MPI_fmpich2g_LIBRARY) + list(APPEND MPI_MPICH_LIB_NAMES "fmpich2") + endif() + + if(NOT MPI_${LANG}_LIB_NAMES) + set(MPI_${LANG}_LIB_NAMES "${MPI_MPICH_LIB_NAMES}" CACHE STRING "MPI ${LANG} libraries to link against" FORCE) + endif() + unset(MPI_MPICH_LIB_NAMES) + + if(NOT MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + # For MPICH2, the include folder would be in ../include relative to the library folder. + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_mpi_LIBRARY}" DIRECTORY) + get_filename_component(MPI_MPICH_ROOT_DIR "${MPI_MPICH_ROOT_DIR}" DIRECTORY) + if(IS_DIRECTORY "${MPI_MPICH_ROOT_DIR}/include") + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_MPICH_ROOT_DIR}/include" CACHE STRING "MPI ${LANG} additional include directory variables, given in the form MPI__INCLUDE_DIR." FORCE) + endif() + unset(MPI_MPICH_ROOT_DIR) + endif() + set(MPI_GUESS_FOUND TRUE) + endif() + unset(MPI_MPICH_PREFIX_PATHS) + endif() + endif() + set(MPI_${LANG}_GUESS_FOUND "${MPI_GUESS_FOUND}" PARENT_SCOPE) +endfunction() + +function(_MPI_adjust_compile_definitions LANG) + if("${LANG}" STREQUAL "CXX") + # To disable the C++ bindings, we need to pass some definitions since the mpi.h header has to deal with both C and C++ + # bindings in MPI-2. + if(MPI_CXX_SKIP_MPICXX AND NOT MPI_${LANG}_COMPILE_DEFINITIONS MATCHES "SKIP_MPICXX") + # MPICH_SKIP_MPICXX is being used in MPICH and derivatives like MVAPICH or Intel MPI + # OMPI_SKIP_MPICXX is being used in Open MPI + # _MPICC_H is being used for IBM Platform MPI + list(APPEND MPI_${LANG}_COMPILE_DEFINITIONS "MPICH_SKIP_MPICXX" "OMPI_SKIP_MPICXX" "_MPICC_H") + set(MPI_${LANG}_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}" CACHE STRING "MPI ${LANG} compilation definitions" FORCE) + endif() + endif() +endfunction() + +macro(_MPI_assemble_libraries LANG) + set(MPI_${LANG}_LIBRARIES "") + # Only for libraries do we need to check whether the compiler's linking stage is separate. + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS_IMPLICIT) + foreach(mpilib IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_LIBRARIES ${MPI_${mpilib}_LIBRARY}) + endforeach() + endif() +endmacro() + +macro(_MPI_assemble_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_${LANG}_INCLUDE_DIRS "") + else() + set(MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS}") + if("${LANG}" MATCHES "(C|CXX)") + if(MPI_${LANG}_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + else() # Fortran + if(MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_F77_HEADER_DIR}") + endif() + if(MPI_${LANG}_MODULE_DIR AND NOT "${MPI_${LANG}_MODULE_DIR}" IN_LIST MPI_${LANG}_INCLUDE_DIRS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${LANG}_MODULE_DIR}") + endif() + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(MPI_ADDITIONAL_INC_DIR IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_INCLUDE_DIRS "${MPI_${MPI_ADDITIONAL_INC_DIR}_INCLUDE_DIR}") + endforeach() + endif() + endif() +endmacro() + +function(_MPI_split_include_dirs LANG) + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + return() + endif() + # Backwards compatibility: Search INCLUDE_PATH if given. + if(MPI_${LANG}_INCLUDE_PATH) + list(APPEND MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_INCLUDE_PATH}") + endif() + + # We try to find the headers/modules among those paths (and system paths) + # For C/C++, we just need to have a look for mpi.h. + if("${LANG}" MATCHES "(C|CXX)") + find_path(MPI_${LANG}_HEADER_DIR "mpi.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + mark_as_advanced(MPI_${LANG}_HEADER_DIR) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "${MPI_${LANG}_HEADER_DIR}") + endif() + # Fortran is more complicated here: An implementation could provide + # any of the Fortran 77/90/2008 APIs for MPI. For example, MSMPI + # only provides Fortran 77 and - if mpi.f90 is built - potentially + # a Fortran 90 module. + elseif("${LANG}" STREQUAL "Fortran") + find_path(MPI_${LANG}_F77_HEADER_DIR "mpif.h" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + find_path(MPI_${LANG}_MODULE_DIR + NAMES "mpi.mod" "mpi_f08.mod" + HINTS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} + ) + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS + "${MPI_${LANG}_F77_HEADER_DIR}" + "${MPI_${LANG}_MODULE_DIR}" + ) + endif() + mark_as_advanced(MPI_${LANG}_F77_HEADER_DIR MPI_${LANG}_MODULE_DIR) + endif() + # Remove duplicates and default system directories from the list. + if(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + list(REMOVE_DUPLICATES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS) + foreach(MPI_IMPLICIT_INC_DIR IN LISTS CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES) + list(REMOVE_ITEM MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_IMPLICIT_INC_DIR}) + endforeach() + endif() + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories" FORCE) +endfunction() + +macro(_MPI_create_imported_target LANG) + if(NOT TARGET MPI::MPI_${LANG}) + add_library(MPI::MPI_${LANG} INTERFACE IMPORTED) + endif() + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_OPTIONS "${MPI_${LANG}_COMPILE_OPTIONS}") + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_COMPILE_DEFINITIONS "${MPI_${LANG}_COMPILE_DEFINITIONS}") + + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_LINK_LIBRARIES "") + if(MPI_${LANG}_LINK_FLAGS) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LINK_FLAGS}") + endif() + # If the compiler links MPI implicitly, no libraries will be found as they're contained within + # CMAKE__IMPLICIT_LINK_LIBRARIES already. + if(MPI_${LANG}_LIBRARIES) + set_property(TARGET MPI::MPI_${LANG} APPEND PROPERTY INTERFACE_LINK_LIBRARIES "${MPI_${LANG}_LIBRARIES}") + endif() + # Given the new design of FindMPI, INCLUDE_DIRS will always be located, even under implicit linking. + set_property(TARGET MPI::MPI_${LANG} PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${MPI_${LANG}_INCLUDE_DIRS}") +endmacro() + +function(_MPI_try_staged_settings LANG MPI_TEST_FILE_NAME MODE RUN_BINARY) + set(WORK_DIR "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI") + set(SRC_DIR "${CMAKE_CURRENT_LIST_DIR}/FindMPI") + set(BIN_FILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI/${MPI_TEST_FILE_NAME}_${LANG}.bin") + unset(MPI_TEST_COMPILE_DEFINITIONS) + if("${LANG}" STREQUAL "Fortran") + if("${MODE}" STREQUAL "F90_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi\n implicit none") + elseif("${MODE}" STREQUAL "F08_MODULE") + set(MPI_Fortran_INCLUDE_LINE "use mpi_f08\n implicit none") + else() # F77 header + set(MPI_Fortran_INCLUDE_LINE "implicit none\n include 'mpif.h'") + endif() + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.f90.in" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90" @ONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.f90") + elseif("${LANG}" STREQUAL "CXX") + configure_file("${SRC_DIR}/${MPI_TEST_FILE_NAME}.c" "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp" COPYONLY) + set(MPI_TEST_SOURCE_FILE "${WORK_DIR}/${MPI_TEST_FILE_NAME}.cpp") + if("${MODE}" STREQUAL "TEST_MPICXX") + set(MPI_TEST_COMPILE_DEFINITIONS TEST_MPI_MPICXX) + endif() + else() # C + set(MPI_TEST_SOURCE_FILE "${SRC_DIR}/${MPI_TEST_FILE_NAME}.c") + endif() + if(RUN_BINARY) + try_run(MPI_RUN_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + RUN_OUTPUT_VARIABLE MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}) + set(MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} "${MPI_RUN_OUTPUT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE}}" PARENT_SCOPE) + else() + try_compile(MPI_RESULT_${LANG}_${MPI_TEST_FILE_NAME}_${MODE} + "${CMAKE_BINARY_DIR}" SOURCES "${MPI_TEST_SOURCE_FILE}" + COMPILE_DEFINITIONS ${MPI_TEST_COMPILE_DEFINITIONS} + LINK_LIBRARIES MPI::MPI_${LANG} + COPY_FILE "${BIN_FILE}") + endif() +endfunction() + +macro(_MPI_check_lang_works LANG) + # For Fortran we may have by the MPI-3 standard an implementation that provides: + # - the mpi_f08 module + # - *both*, the mpi module and 'mpif.h' + # Since older MPI standards (MPI-1) did not define anything but 'mpif.h', we need to check all three individually. + if( NOT MPI_${LANG}_WORKS ) + if("${LANG}" STREQUAL "Fortran") + set(MPI_Fortran_INTEGER_LINE "(kind=MPI_INTEGER_KIND)") + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F90_MODULE FALSE) + _MPI_try_staged_settings(${LANG} test_mpi F08_MODULE FALSE) + + set(MPI_${LANG}_WORKS FALSE) + + foreach(mpimethod IN ITEMS F77_HEADER F08_MODULE F90_MODULE) + if(MPI_RESULT_${LANG}_test_mpi_${mpimethod}) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_${mpimethod} TRUE) + else() + set(MPI_${LANG}_HAVE_${mpimethod} FALSE) + endif() + endforeach() + # MPI-1 versions had no MPI_INTGER_KIND defined, so we need to try without it. + # However, MPI-1 also did not define the Fortran 90 and 08 modules, so we only try the F77 header. + unset(MPI_Fortran_INTEGER_LINE) + if(NOT MPI_${LANG}_WORKS) + _MPI_try_staged_settings(${LANG} test_mpi F77_HEADER_NOKIND FALSE) + if(MPI_RESULT_${LANG}_test_mpi_F77_HEADER_NOKIND) + set(MPI_${LANG}_WORKS TRUE) + set(MPI_${LANG}_HAVE_F77_HEADER TRUE) + endif() + endif() + else() + _MPI_try_staged_settings(${LANG} test_mpi normal FALSE) + # If 'test_mpi' built correctly, we've found valid MPI settings. There might not be MPI-2 C++ support, but there can't + # be MPI-2 C++ support without the C bindings being present, so checking for them is sufficient. + set(MPI_${LANG}_WORKS "${MPI_RESULT_${LANG}_test_mpi_normal}") + endif() + endif() +endmacro() + +# Some systems install various MPI implementations in separate folders in some MPI prefix +# This macro enumerates all such subfolders and adds them to the list of hints that will be searched. +macro(MPI_search_mpi_prefix_folder PREFIX_FOLDER) + if(EXISTS "${PREFIX_FOLDER}") + file(GLOB _MPI_folder_children RELATIVE "${PREFIX_FOLDER}" "${PREFIX_FOLDER}/*") + foreach(_MPI_folder_child IN LISTS _MPI_folder_children) + if(IS_DIRECTORY "${PREFIX_FOLDER}/${_MPI_folder_child}") + list(APPEND MPI_HINT_DIRS "${PREFIX_FOLDER}/${_MPI_folder_child}") + endif() + endforeach() + endif() +endmacro() + +set(MPI_HINT_DIRS ${MPI_HOME} $ENV{MPI_ROOT} $ENV{MPI_HOME} $ENV{I_MPI_ROOT}) +if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux") + # SUSE Linux Enterprise Server stores its MPI implementations under /usr/lib64/mpi/gcc/ + # We enumerate the subfolders and append each as a prefix + MPI_search_mpi_prefix_folder("/usr/lib64/mpi/gcc") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") + # MSMPI stores its runtime in a special folder, this adds the possible locations to the hints. + list(APPEND MPI_HINT_DIRS $ENV{MSMPI_BIN} "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MPI;InstallRoot]") +elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "FreeBSD") + # FreeBSD ships mpich under the normal system paths - but available openmpi implementations + # will be found in /usr/local/mpi/ + MPI_search_mpi_prefix_folder("/usr/local/mpi") +endif() + +# Most MPI distributions have some form of mpiexec or mpirun which gives us something we can look for. +# The MPI standard does not mandate the existence of either, but instead only makes requirements if a distribution +# ships an mpiexec program (mpirun executables are not regulated by the standard). +find_program(MPIEXEC_EXECUTABLE + NAMES ${_MPIEXEC_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${MPI_HINT_DIRS} + DOC "Executable for running MPI programs.") + +# call get_filename_component twice to remove mpiexec and the directory it exists in (typically bin). +# This gives us a fairly reliable base directory to search for /bin /lib and /include from. +get_filename_component(_MPI_BASE_DIR "${MPIEXEC_EXECUTABLE}" PATH) +get_filename_component(_MPI_BASE_DIR "${_MPI_BASE_DIR}" PATH) + +# According to the MPI standard, section 8.8 -n is a guaranteed, and the only guaranteed way to +# launch an MPI process using mpiexec if such a program exists. +set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "Flag used by MPI to specify the number of processes for mpiexec; the next option will be the number of processes.") +set(MPIEXEC_PREFLAGS "" CACHE STRING "These flags will be directly before the executable that is being run by mpiexec.") +set(MPIEXEC_POSTFLAGS "" CACHE STRING "These flags will be placed after all flags passed to mpiexec.") + +# Set the number of processes to the physical processor count +cmake_host_system_information(RESULT _MPIEXEC_NUMPROCS QUERY NUMBER_OF_PHYSICAL_CORES) +set(MPIEXEC_MAX_NUMPROCS "${_MPIEXEC_NUMPROCS}" CACHE STRING "Maximum number of processors available to run MPI applications.") +unset(_MPIEXEC_NUMPROCS) +mark_as_advanced(MPIEXEC_EXECUTABLE MPIEXEC_NUMPROC_FLAG MPIEXEC_PREFLAGS MPIEXEC_POSTFLAGS MPIEXEC_MAX_NUMPROCS) + +#============================================================================= +# Backward compatibility input hacks. Propagate the FindMPI hints to C and +# CXX if the respective new versions are not defined. Translate the old +# MPI_LIBRARY and MPI_EXTRA_LIBRARY to respective MPI_${LANG}_LIBRARIES. +# +# Once we find the new variables, we translate them back into their old +# equivalents below. +if(NOT MPI_IGNORE_LEGACY_VARIABLES) + foreach (LANG IN ITEMS C CXX) + # Old input variables. + set(_MPI_OLD_INPUT_VARS COMPILER COMPILE_FLAGS INCLUDE_PATH LINK_FLAGS) + + # Set new vars based on their old equivalents, if the new versions are not already set. + foreach (var ${_MPI_OLD_INPUT_VARS}) + if (NOT MPI_${LANG}_${var} AND MPI_${var}) + set(MPI_${LANG}_${var} "${MPI_${var}}") + endif() + endforeach() + + # Chop the old compile flags into options and definitions + + unset(MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS) + unset(MPI_${LANG}_EXTRA_COMPILE_OPTIONS) + if(MPI_${LANG}_COMPILE_FLAGS) + separate_arguments(MPI_SEPARATE_FLAGS NATIVE_COMMAND "${MPI_${LANG}_COMPILE_FLAGS}") + foreach(_MPI_FLAG IN LISTS MPI_SEPARATE_FLAGS) + if("${_MPI_FLAG}" MATCHES "^ *[-/D]([^ ]+)") + list(APPEND MPI_${LANG}_EXTRA_COMPILE_DEFINITIONS "${CMAKE_MATCH_1}") + else() + list(APPEND MPI_${LANG}_EXTRA_COMPILE_OPTIONS "${_MPI_FLAG}") + endif() + endforeach() + unset(MPI_SEPARATE_FLAGS) + endif() + + # If a list of libraries was given, we'll split it into new-style cache variables + unset(MPI_${LANG}_EXTRA_LIB_NAMES) + if(NOT MPI_${LANG}_LIB_NAMES) + foreach(_MPI_LIB IN LISTS MPI_${LANG}_LIBRARIES MPI_LIBRARY MPI_EXTRA_LIBRARY) + if(_MPI_LIB) + get_filename_component(_MPI_PLAIN_LIB_NAME "${_MPI_LIB}" NAME_WE) + get_filename_component(_MPI_LIB_NAME "${_MPI_LIB}" NAME) + get_filename_component(_MPI_LIB_DIR "${_MPI_LIB}" DIRECTORY) + list(APPEND MPI_${LANG}_EXTRA_LIB_NAMES "${_MPI_PLAIN_LIB_NAME}") + find_library(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY + NAMES "${_MPI_LIB_NAME}" "lib${_MPI_LIB_NAME}" + HINTS ${_MPI_LIB_DIR} $ENV{MPI_LIB} + DOC "Location of the ${_MPI_PLAIN_LIB_NAME} library for MPI" + ) + mark_as_advanced(MPI_${_MPI_PLAIN_LIB_NAME}_LIBRARY) + endif() + endforeach() + endif() + endforeach() +endif() +#============================================================================= + +unset(MPI_VERSION) +unset(MPI_VERSION_MAJOR) +unset(MPI_VERSION_MINOR) + +unset(_MPI_MIN_VERSION) + +# If the user specified a library name we assume they prefer that library over a wrapper. If not, they can disable skipping manually. +if(NOT DEFINED MPI_SKIP_COMPILER_WRAPPER AND MPI_GUESS_LIBRARY_NAME) + set(MPI_SKIP_COMPILER_WRAPPER TRUE) +endif() + +# This loop finds the compilers and sends them off for interrogation. +foreach(LANG IN ITEMS C CXX Fortran) + if(CMAKE_${LANG}_COMPILER_LOADED) + if(NOT MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} IN_LIST MPI_FIND_COMPONENTS) + set(_MPI_FIND_${LANG} TRUE) + elseif( ${LANG} STREQUAL CXX AND NOT MPI_CXX_SKIP_MPICXX AND MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(_MPI_FIND_${LANG} TRUE) + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + else() + set(_MPI_FIND_${LANG} FALSE) + endif() + if(_MPI_FIND_${LANG}) + if( ${LANG} STREQUAL CXX AND NOT MPICXX IN_LIST MPI_FIND_COMPONENTS ) + set(MPI_CXX_SKIP_MPICXX FALSE CACHE BOOL "If true, the MPI-2 C++ bindings are disabled using definitions.") + mark_as_advanced(MPI_CXX_SKIP_MPICXX) + endif() + if(NOT (MPI_${LANG}_LIB_NAMES AND (MPI_${LANG}_INCLUDE_PATH OR MPI_${LANG}_INCLUDE_DIRS OR MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS))) + set(MPI_${LANG}_TRIED_IMPLICIT FALSE) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + if(NOT MPI_${LANG}_COMPILER AND NOT MPI_ASSUME_NO_BUILTIN_MPI) + # Should the imported targets be empty, we effectively try whether the compiler supports MPI on its own, which is the case on e.g. + # Cray PrgEnv. + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + + # If the compiler can build MPI code on its own, it functions as an MPI compiler and we'll set the variable to point to it. + if(MPI_${LANG}_WORKS) + set(MPI_${LANG}_COMPILER "${CMAKE_${LANG}_COMPILER}" CACHE FILEPATH "MPI compiler for ${LANG}" FORCE) + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + set(MPI_${LANG}_TRIED_IMPLICIT TRUE) + endif() + + if(NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}" OR NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WRAPPER_FOUND FALSE) + set(MPI_PINNED_COMPILER FALSE) + + if(NOT MPI_SKIP_COMPILER_WRAPPER) + if(MPI_${LANG}_COMPILER) + # If the user supplies a compiler *name* instead of an absolute path, assume that we need to find THAT compiler. + if (NOT IS_ABSOLUTE "${MPI_${LANG}_COMPILER}") + # Get rid of our default list of names and just search for the name the user wants. + set(_MPI_${LANG}_COMPILER_NAMES "${MPI_${LANG}_COMPILER}") + unset(MPI_${LANG}_COMPILER CACHE) + endif() + # If the user specifies a compiler, we don't want to try to search libraries either. + set(MPI_PINNED_COMPILER TRUE) + endif() + + # If we have an MPI base directory, we'll try all compiler names in that one first. + # This should prevent mixing different MPI environments + if(_MPI_BASE_DIR) + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + HINTS ${_MPI_BASE_DIR} + NO_DEFAULT_PATH + DOC "MPI compiler for ${LANG}" + ) + endif() + + # If the base directory did not help (for example because the mpiexec isn't in the same directory as the compilers), + # we shall try searching in the default paths. + find_program(MPI_${LANG}_COMPILER + NAMES ${_MPI_${LANG}_COMPILER_NAMES} + PATH_SUFFIXES bin sbin + DOC "MPI compiler for ${LANG}" + ) + + if("${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + set(MPI_PINNED_COMPILER TRUE) + + # If we haven't made the implicit compiler test yet, perform it now. + if(NOT MPI_${LANG}_TRIED_IMPLICIT) + _MPI_create_imported_target(${LANG}) + _MPI_check_lang_works(${LANG}) + endif() + + # Should the MPI compiler not work implicitly for MPI, still interrogate it. + # Otherwise, MPI compilers for which CMake has separate linking stages, e.g. Intel MPI on Windows where link.exe is being used + # directly during linkage instead of CMAKE__COMPILER will not work. + if(NOT MPI_${LANG}_WORKS) + set(MPI_${LANG}_WORKS_IMPLICIT FALSE) + _MPI_interrogate_compiler(${LANG}) + else() + set(MPI_${LANG}_WORKS_IMPLICIT TRUE) + endif() + elseif(MPI_${LANG}_COMPILER) + _MPI_interrogate_compiler(${LANG}) + endif() + endif() + + if(NOT MPI_SKIP_GUESSING AND NOT MPI_${LANG}_WRAPPER_FOUND AND NOT MPI_PINNED_COMPILER) + # For C++, we may use the settings for C. Should a given compiler wrapper for C++ not exist, but one for C does, we copy over the + # settings for C. An MPI distribution that is in this situation would be IBM Platform MPI. + if("${LANG}" STREQUAL "CXX" AND MPI_C_WRAPPER_FOUND) + set(MPI_${LANG}_COMPILE_OPTIONS ${MPI_C_COMPILE_OPTIONS} CACHE STRING "MPI ${LANG} compilation options" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS ${MPI_C_COMPILE_DEFINITIONS} CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS ${MPI_C_INCLUDE_DIRS} CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS ${MPI_C_LINK_FLAGS} CACHE STRING "MPI ${LANG} linker flags" ) + set(MPI_${LANG}_LIB_NAMES ${MPI_C_LIB_NAMES} CACHE STRING "MPI ${LANG} libraries to link against" ) + else() + _MPI_guess_settings(${LANG}) + endif() + endif() + endif() + endif() + + _MPI_split_include_dirs(${LANG}) + _MPI_assemble_include_dirs(${LANG}) + _MPI_assemble_libraries(${LANG}) + + _MPI_adjust_compile_definitions(${LANG}) + # We always create imported targets even if they're empty + _MPI_create_imported_target(${LANG}) + + if(NOT MPI_${LANG}_WORKS) + _MPI_check_lang_works(${LANG}) + endif() + + # Next, we'll initialize the MPI variables that have not been previously set. + set(MPI_${LANG}_COMPILE_OPTIONS "" CACHE STRING "MPI ${LANG} compilation flags" ) + set(MPI_${LANG}_COMPILE_DEFINITIONS "" CACHE STRING "MPI ${LANG} compilation definitions" ) + set(MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS "" CACHE STRING "MPI ${LANG} additional include directories") + set(MPI_${LANG}_LINK_FLAGS "" CACHE STRING "MPI ${LANG} linker flags" ) + if(NOT MPI_${LANG}_COMPILER STREQUAL CMAKE_${LANG}_COMPILER) + set(MPI_${LANG}_LIB_NAMES "" CACHE STRING "MPI ${LANG} libraries to link against" ) + endif() + mark_as_advanced(MPI_${LANG}_COMPILE_OPTIONS MPI_${LANG}_COMPILE_DEFINITIONS MPI_${LANG}_LINK_FLAGS + MPI_${LANG}_LIB_NAMES MPI_${LANG}_ADDITIONAL_INCLUDE_DIRS MPI_${LANG}_COMPILER) + + # If we've found MPI, then we'll perform additional analysis: Determine the MPI version, MPI library version, supported + # MPI APIs (i.e. MPI-2 C++ bindings). For Fortran we also need to find specific parameters if we're under MPI-3. + if(MPI_${LANG}_WORKS) + if("${LANG}" STREQUAL "CXX" AND NOT DEFINED MPI_MPICXX_FOUND) + if(NOT MPI_CXX_SKIP_MPICXX AND NOT MPI_CXX_VALIDATE_SKIP_MPICXX) + _MPI_try_staged_settings(${LANG} test_mpi MPICXX FALSE) + if(MPI_RESULT_${LANG}_test_mpi_MPICXX) + set(MPI_MPICXX_FOUND TRUE) + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + else() + set(MPI_MPICXX_FOUND FALSE) + endif() + endif() + + # At this point, we know the bindings present but not the MPI version or anything else. + if(NOT DEFINED MPI_${LANG}_VERSION) + unset(MPI_${LANG}_VERSION_MAJOR) + unset(MPI_${LANG}_VERSION_MINOR) + endif() + set(MPI_BIN_FOLDER ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindMPI) + + # For Fortran, we'll want to use the most modern MPI binding to test capabilities other than the + # Fortran parameters, since those depend on the method of consumption. + # For C++, we can always use the C bindings, and should do so, since the C++ bindings do not exist in MPI-3 + # whereas the C bindings do, and the C++ bindings never offered any feature advantage over their C counterparts. + if("${LANG}" STREQUAL "Fortran") + if(MPI_${LANG}_HAVE_F08_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F08_MODULE) + elseif(MPI_${LANG}_HAVE_F90_MODULE) + set(MPI_${LANG}_HIGHEST_METHOD F90_MODULE) + else() + set(MPI_${LANG}_HIGHEST_METHOD F77_HEADER) + endif() + + # Another difference between C and Fortran is that we can't use the preprocessor to determine whether MPI_VERSION + # and MPI_SUBVERSION are provided. These defines did not exist in MPI 1.0 and 1.1 and therefore might not + # exist. For C/C++, test_mpi.c will handle the MPI_VERSION extraction, but for Fortran, we need mpiver.f90. + if(NOT DEFINED MPI_${LANG}_VERSION) + _MPI_try_staged_settings(${LANG} mpiver ${MPI_${LANG}_HIGHEST_METHOD} FALSE) + if(MPI_RESULT_${LANG}_mpiver_${MPI_${LANG}_HIGHEST_METHOD}) + file(STRINGS ${MPI_BIN_FOLDER}/mpiver_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + # Finally, we want to find out which capabilities a given interface supports, compare the MPI-3 standard. + # This is determined by interface specific parameters MPI_SUBARRAYS_SUPPORTED and MPI_ASYNC_PROTECTS_NONBLOCKING + # and might vary between the different methods of consumption. + if(MPI_DETERMINE_Fortran_CAPABILITIES AND NOT MPI_Fortran_CAPABILITIES_DETERMINED) + foreach(mpimethod IN ITEMS F08_MODULE F90_MODULE F77_HEADER) + if(MPI_${LANG}_HAVE_${mpimethod}) + set(MPI_${LANG}_${mpimethod}_SUBARRAYS FALSE) + set(MPI_${LANG}_${mpimethod}_ASYNCPROT FALSE) + _MPI_try_staged_settings(${LANG} fortranparam_mpi ${mpimethod} TRUE) + if(MPI_RESULT_${LANG}_fortranparam_mpi_${mpimethod} AND + NOT "${MPI_RUN_RESULT_${LANG}_fortranparam_mpi_${mpimethod}}" STREQUAL "FAILED_TO_RUN") + if("${MPI_RUN_OUTPUT_${LANG}_fortranparam_mpi_${mpimethod}}" MATCHES + ".*INFO:SUBARRAYS\\[ *([TF]) *\\]-ASYNCPROT\\[ *([TF]) *\\].*") + if("${CMAKE_MATCH_1}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_SUBARRAYS TRUE) + endif() + if("${CMAKE_MATCH_2}" STREQUAL "T") + set(MPI_${LANG}_${mpimethod}_ASYNCPROT TRUE) + endif() + endif() + endif() + endif() + endforeach() + set(MPI_Fortran_CAPABILITIES_DETERMINED TRUE) + endif() + else() + set(MPI_${LANG}_HIGHEST_METHOD normal) + + # By the MPI-2 standard, MPI_VERSION and MPI_SUBVERSION are valid for both C and C++ bindings. + if(NOT DEFINED MPI_${LANG}_VERSION) + file(STRINGS ${MPI_BIN_FOLDER}/test_mpi_${LANG}.bin _MPI_VERSION_STRING LIMIT_COUNT 1 REGEX "INFO:MPI-VER") + if("${_MPI_VERSION_STRING}" MATCHES ".*INFO:MPI-VER\\[([0-9]+)\\.([0-9]+)\\].*") + set(MPI_${LANG}_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(MPI_${LANG}_VERSION_MINOR "${CMAKE_MATCH_2}") + set(MPI_${LANG}_VERSION "${MPI_${LANG}_VERSION_MAJOR}.${MPI_${LANG}_VERSION_MINOR}") + endif() + endif() + endif() + + unset(MPI_BIN_FOLDER) + + # At this point, we have dealt with determining the MPI version and parameters for each Fortran method available. + # The one remaining issue is to determine which MPI library is installed. + # Determining the version and vendor of the MPI library is only possible via MPI_Get_library_version() at runtime, + # and therefore we cannot do this while cross-compiling (a user may still define MPI__LIBRARY_VERSION_STRING + # themselves and we'll attempt splitting it, which is equivalent to provide the try_run output). + # It's also worth noting that the installed version string can depend on the language, or on the system the binary + # runs on if MPI is not statically linked. + if(MPI_DETERMINE_LIBRARY_VERSION AND NOT MPI_${LANG}_LIBRARY_VERSION_STRING) + _MPI_try_staged_settings(${LANG} libver_mpi ${MPI_${LANG}_HIGHEST_METHOD} TRUE) + if(MPI_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD} AND + "${MPI_RUN_RESULT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" EQUAL "0") + string(STRIP "${MPI_RUN_OUTPUT_${LANG}_libver_mpi_${MPI_${LANG}_HIGHEST_METHOD}}" + MPI_${LANG}_LIBRARY_VERSION_STRING) + else() + set(MPI_${LANG}_LIBRARY_VERSION_STRING "NOTFOUND") + endif() + endif() + endif() + + set(MPI_${LANG}_FIND_QUIETLY ${MPI_FIND_QUIETLY}) + set(MPI_${LANG}_FIND_VERSION ${MPI_FIND_VERSION}) + set(MPI_${LANG}_FIND_VERSION_EXACT ${MPI_FIND_VERSION_EXACT}) + + unset(MPI_${LANG}_REQUIRED_VARS) + if (NOT "${MPI_${LANG}_COMPILER}" STREQUAL "${CMAKE_${LANG}_COMPILER}") + foreach(mpilibname IN LISTS MPI_${LANG}_LIB_NAMES) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpilibname}_LIBRARY") + endforeach() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_LIB_NAMES") + if("${LANG}" STREQUAL "Fortran") + # For Fortran we only need one of the module or header directories to have *some* support for MPI. + if(NOT MPI_${LANG}_MODULE_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_F77_HEADER_DIR") + endif() + if(NOT MPI_${LANG}_F77_HEADER_DIR) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_MODULE_DIR") + endif() + else() + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_HEADER_DIR") + endif() + if(MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + foreach(mpiincvar IN LISTS MPI_${LANG}_ADDITIONAL_INCLUDE_VARS) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${mpiincvar}_INCLUDE_DIR") + endforeach() + endif() + # Append the works variable now. If the settings did not work, this will show up properly. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + else() + # If the compiler worked implicitly, use its path as output. + # Should the compiler variable be set, we also require it to work. + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_COMPILER") + if(MPI_${LANG}_COMPILER) + list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS") + endif() + endif() + find_package_handle_standard_args(MPI_${LANG} REQUIRED_VARS ${MPI_${LANG}_REQUIRED_VARS} + VERSION_VAR MPI_${LANG}_VERSION) + + if(DEFINED MPI_${LANG}_VERSION) + if(NOT _MPI_MIN_VERSION OR _MPI_MIN_VERSION VERSION_GREATER MPI_${LANG}_VERSION) + set(_MPI_MIN_VERSION MPI_${LANG}_VERSION) + endif() + endif() + endif() +endforeach() + +unset(_MPI_REQ_VARS) +foreach(LANG IN ITEMS C CXX Fortran) + if((NOT MPI_FIND_COMPONENTS AND CMAKE_${LANG}_COMPILER_LOADED) OR LANG IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_${LANG}_FOUND") + endif() +endforeach() + +if(MPICXX IN_LIST MPI_FIND_COMPONENTS) + list(APPEND _MPI_REQ_VARS "MPI_MPICXX_FOUND") +endif() + +find_package_handle_standard_args(MPI + REQUIRED_VARS ${_MPI_REQ_VARS} + VERSION_VAR ${_MPI_MIN_VERSION} + HANDLE_COMPONENTS) + +#============================================================================= +# More backward compatibility stuff + +# For compatibility reasons, we also define MPIEXEC +set(MPIEXEC "${MPIEXEC_EXECUTABLE}") + +# Copy over MPI__INCLUDE_PATH from the assembled INCLUDE_DIRS. +foreach(LANG IN ITEMS C CXX Fortran) + if(MPI_${LANG}_FOUND) + set(MPI_${LANG}_INCLUDE_PATH "${MPI_${LANG}_INCLUDE_DIRS}") + unset(MPI_${LANG}_COMPILE_FLAGS) + if(MPI_${LANG}_COMPILE_OPTIONS) + set(MPI_${LANG}_COMPILE_FLAGS "${MPI_${LANG}_COMPILE_OPTIONS}") + endif() + if(MPI_${LANG}_COMPILE_DEFINITIONS) + foreach(_MPI_DEF IN LISTS MPI_${LANG}_COMPILE_DEFINITIONS) + string(APPEND MPI_${LANG}_COMPILE_FLAGS " -D${_MPI_DEF}") + endforeach() + endif() + endif() +endforeach() + +# Bare MPI sans ${LANG} vars are set to CXX then C, depending on what was found. +# This mimics the behavior of the old language-oblivious FindMPI. +set(_MPI_OLD_VARS COMPILER INCLUDE_PATH COMPILE_FLAGS LINK_FLAGS LIBRARIES) +if (MPI_CXX_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_CXX_${var}}) + endforeach() +elseif (MPI_C_FOUND) + foreach (var ${_MPI_OLD_VARS}) + set(MPI_${var} ${MPI_C_${var}}) + endforeach() +endif() + +# Chop MPI_LIBRARIES into the old-style MPI_LIBRARY and MPI_EXTRA_LIBRARY, and set them in cache. +if (MPI_LIBRARIES) + list(GET MPI_LIBRARIES 0 MPI_LIBRARY_WORK) + set(MPI_LIBRARY "${MPI_LIBRARY_WORK}") + unset(MPI_LIBRARY_WORK) +else() + set(MPI_LIBRARY "MPI_LIBRARY-NOTFOUND") +endif() + +list(LENGTH MPI_LIBRARIES MPI_NUMLIBS) +if (MPI_NUMLIBS GREATER 1) + set(MPI_EXTRA_LIBRARY_WORK "${MPI_LIBRARIES}") + list(REMOVE_AT MPI_EXTRA_LIBRARY_WORK 0) + set(MPI_EXTRA_LIBRARY "${MPI_EXTRA_LIBRARY_WORK}") + unset(MPI_EXTRA_LIBRARY_WORK) +else() + set(MPI_EXTRA_LIBRARY "MPI_EXTRA_LIBRARY-NOTFOUND") +endif() +set(MPI_IGNORE_LEGACY_VARIABLES TRUE) +#============================================================================= + +# unset these vars to cleanup namespace +unset(_MPI_OLD_VARS) +unset(_MPI_PREFIX_PATH) +unset(_MPI_BASE_DIR) +foreach (lang C CXX Fortran) + unset(_MPI_${LANG}_COMPILER_NAMES) +endforeach() + +cmake_policy(POP) diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in new file mode 100644 index 000000000..30f912c62 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/fortranparam_mpi.f90.in @@ -0,0 +1,4 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + print *, 'INFO:SUBARRAYS[', MPI_SUBARRAYS_SUPPORTED, ']-ASYNCPROT[', MPI_ASYNC_PROTECTS_NONBLOCKING, ']' + end program mpi_ver diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/libver_mpi.c b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/libver_mpi.c new file mode 100644 index 000000000..be9d19d43 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/libver_mpi.c @@ -0,0 +1,19 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +int main(int argc, char* argv[]) +{ + char mpilibver_str[MPI_MAX_LIBRARY_VERSION_STRING]; + int mpilibver_len; + MPI_Get_library_version(mpilibver_str, &mpilibver_len); +#ifdef __cplusplus + std::puts(mpilibver_str); +#else + puts(mpilibver_str); +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in new file mode 100644 index 000000000..793858716 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/libver_mpi.f90.in @@ -0,0 +1,7 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + character(len=MPI_MAX_LIBRARY_VERSION_STRING) :: mpilibver_str + integer(kind=MPI_INTEGER_KIND) :: ierror, reslen + call MPI_GET_LIBRARY_VERSION(mpilibver_str, reslen, ierror) + print *, mpilibver_str + end program mpi_ver diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in new file mode 100644 index 000000000..a25452385 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/mpiver.f90.in @@ -0,0 +1,10 @@ + program mpi_ver + @MPI_Fortran_INCLUDE_LINE@ + integer(kind=kind(MPI_VERSION)), parameter :: zero = ichar('0') + character, dimension(17), parameter :: mpiver_str =& + (/ 'I', 'N', 'F', 'O', ':', 'M', 'P', 'I', '-', 'V', 'E', 'R', '[', & + char(zero + MPI_VERSION), & + '.', & + char(zero + MPI_SUBVERSION), ']' /) + print *, mpiver_str + end program mpi_ver diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/test_mpi.c b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/test_mpi.c new file mode 100644 index 000000000..b8a308a4b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/test_mpi.c @@ -0,0 +1,37 @@ +#include + +#ifdef __cplusplus +#include +#else +#include +#endif + +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +const char mpiver_str[] = { 'I', 'N', + 'F', 'O', + ':', 'M', + 'P', 'I', + '-', 'V', + 'E', 'R', + '[', ('0' + MPI_VERSION), + '.', ('0' + MPI_SUBVERSION), + ']', '\0' }; +#endif + +int main(int argc, char* argv[]) +{ +#if defined(MPI_VERSION) && defined(MPI_SUBVERSION) +#ifdef __cplusplus + std::puts(mpiver_str); +#else + puts(mpiver_str); +#endif +#endif +#ifdef TEST_MPI_MPICXX + MPI::MPI_Init(&argc, &argv); + MPI::MPI_Finalize(); +#else + MPI_Init(&argc, &argv); + MPI_Finalize(); +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in new file mode 100644 index 000000000..4d43a04d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindMPI/test_mpi.f90.in @@ -0,0 +1,6 @@ + program hello + @MPI_Fortran_INCLUDE_LINE@ + integer@MPI_Fortran_INTEGER_LINE@ ierror + call MPI_INIT(ierror) + call MPI_FINALIZE(ierror) + end program diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake new file mode 100644 index 000000000..67f6bd6f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,386 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#[=======================================================================[.rst: +FindPackageHandleStandardArgs +----------------------------- + +This module provides a function intended to be used in :ref:`Find Modules` +implementing :command:`find_package()` calls. It handles the +``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``. +It also sets the ``_FOUND`` variable. The package is +considered found if all variables listed contain valid results, e.g. +valid filepaths. + +.. command:: find_package_handle_standard_args + + There are two signatures:: + + find_package_handle_standard_args( + (DEFAULT_MSG|) + ... + ) + + find_package_handle_standard_args( + [FOUND_VAR ] + [REQUIRED_VARS ...] + [VERSION_VAR ] + [HANDLE_COMPONENTS] + [CONFIG_MODE] + [FAIL_MESSAGE ] + ) + + The ``_FOUND`` variable will be set to ``TRUE`` if all + the variables ``...`` are valid and any optional + constraints are satisfied, and ``FALSE`` otherwise. A success or + failure message may be displayed based on the results and on + whether the ``REQUIRED`` and/or ``QUIET`` option was given to + the :command:`find_package` call. + + The options are: + + ``(DEFAULT_MSG|)`` + In the simple signature this specifies the failure message. + Use ``DEFAULT_MSG`` to ask for a default message to be computed + (recommended). Not valid in the full signature. + + ``FOUND_VAR `` + Obsolete. Specifies either ``_FOUND`` or + ``_FOUND`` as the result variable. This exists only + for compatibility with older versions of CMake and is now ignored. + Result variables of both names are always set for compatibility. + + ``REQUIRED_VARS ...`` + Specify the variables which are required for this package. + These may be named in the generated failure message asking the + user to set the missing variable values. Therefore these should + typically be cache entries such as ``FOO_LIBRARY`` and not output + variables like ``FOO_LIBRARIES``. + + ``VERSION_VAR `` + Specify the name of a variable that holds the version of the package + that has been found. This version will be checked against the + (potentially) specified required version given to the + :command:`find_package` call, including its ``EXACT`` option. + The default messages include information about the required + version and the version which has been actually found, both + if the version is ok or not. + + ``HANDLE_COMPONENTS`` + Enable handling of package components. In this case, the command + will report which components have been found and which are missing, + and the ``_FOUND`` variable will be set to ``FALSE`` + if any of the required components (i.e. not the ones listed after + the ``OPTIONAL_COMPONENTS`` option of :command:`find_package`) are + missing. + + ``CONFIG_MODE`` + Specify that the calling find module is a wrapper around a + call to ``find_package( NO_MODULE)``. This implies + a ``VERSION_VAR`` value of ``_VERSION``. The command + will automatically check whether the package configuration file + was found. + + ``FAIL_MESSAGE `` + Specify a custom failure message instead of using the default + generated message. Not recommended. + +Example for the simple signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibXml2 DEFAULT_MSG + LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) + +The ``LibXml2`` package is considered to be found if both +``LIBXML2_LIBRARY`` and ``LIBXML2_INCLUDE_DIR`` are valid. +Then also ``LibXml2_FOUND`` is set to ``TRUE``. If it is not found +and ``REQUIRED`` was used, it fails with a +:command:`message(FATAL_ERROR)`, independent whether ``QUIET`` was +used or not. If it is found, success will be reported, including +the content of the first ````. On repeated CMake runs, +the same message will not be printed again. + +Example for the full signature: + +.. code-block:: cmake + + find_package_handle_standard_args(LibArchive + REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR + VERSION_VAR LibArchive_VERSION) + +In this case, the ``LibArchive`` package is considered to be found if +both ``LibArchive_LIBRARY`` and ``LibArchive_INCLUDE_DIR`` are valid. +Also the version of ``LibArchive`` will be checked by using the version +contained in ``LibArchive_VERSION``. Since no ``FAIL_MESSAGE`` is given, +the default messages will be printed. + +Another example for the full signature: + +.. code-block:: cmake + + find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) + find_package_handle_standard_args(Automoc4 CONFIG_MODE) + +In this case, a ``FindAutmoc4.cmake`` module wraps a call to +``find_package(Automoc4 NO_MODULE)`` and adds an additional search +directory for ``automoc4``. Then the call to +``find_package_handle_standard_args`` produces a proper success/failure +message. +#]=======================================================================] + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${_msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${_msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing:${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + string(APPEND configsText " ${filename} (version ${version})\n") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + string(APPEND configsText " Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + +# Set up the arguments for `cmake_parse_arguments`. + set(options CONFIG_MODE HANDLE_COMPONENTS) + set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + +# Check whether we are in 'simple' or 'extended' mode: + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + cmake_parse_arguments(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + endif() + +# now that we collected all arguments, process them + + if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$") + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + set(FPHSA_FOUND_${_NAME} TRUE) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(FPHSA_FOUND_${_NAME} FALSE) + string(APPEND MISSING_VARS " ${_CURRENT_VAR}") + else() + string(APPEND DETAILS "[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(FPHSA_FOUND_${_NAME}) + set(${_NAME}_FOUND TRUE) + set(${_NAME_UPPER}_FOUND TRUE) + else() + set(${_NAME}_FOUND FALSE) + set(${_NAME_UPPER}_FOUND FALSE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components: ") + endif() + string(APPEND FOUND_COMPONENTS_MSG " ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components: ") + endif() + string(APPEND MISSING_COMPONENTS_MSG " ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + string(APPEND MISSING_VARS " ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + string(APPEND DETAILS "[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + + # check with DEFINED here as the requested or found version may be "0" + if (DEFINED ${_NAME}_FIND_VERSION) + if(DEFINED ${FPHSA_VERSION_VAR}) + set(_FOUND_VERSION ${${FPHSA_VERSION_VAR}}) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + # count the dots in the version string + string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${_FOUND_VERSION}") + # add one dot because there is one dot more than there are components + string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS) + if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT) + # Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT + # is at most 4 here. Therefore a simple lookup table is used. + if (${_NAME}_FIND_VERSION_COUNT EQUAL 1) + set(_VERSION_REGEX "[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2) + set(_VERSION_REGEX "[^.]*\\.[^.]*") + elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3) + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*") + else () + set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*") + endif () + string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${_FOUND_VERSION}") + unset(_VERSION_REGEX) + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + unset(_VERSION_HEAD) + else () + if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")") + endif () + endif () + unset(_VERSION_DOTS) + + else() # minimum version specified: + if (${_NAME}_FIND_VERSION VERSION_GREATER _FOUND_VERSION) + set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${_FOUND_VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + # Check with DEFINED as the found version may be 0. + if(DEFINED ${FPHSA_VERSION_VAR}) + set(VERSION_MSG "(found version \"${${FPHSA_VERSION_VAR}}\")") + endif() + endif () + + if(VERSION_OK) + string(APPEND DETAILS "[v${${FPHSA_VERSION_VAR}}(${${_NAME}_FIND_VERSION})]") + else() + set(${_NAME}_FOUND FALSE) + endif() + + + # print the result: + if (${_NAME}_FOUND) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_NAME}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) + set(${_NAME_UPPER}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE) +endfunction() diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindPackageMessage.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindPackageMessage.cmake new file mode 100644 index 000000000..6821cee4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/FindPackageMessage.cmake @@ -0,0 +1,47 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# FindPackageMessage +# ------------------ +# +# +# +# FIND_PACKAGE_MESSAGE( "message for user" "find result details") +# +# This macro is intended to be used in FindXXX.cmake modules files. It +# will print a message once for each unique find result. This is useful +# for telling the user where a package was found. The first argument +# specifies the name (XXX) of the package. The second argument +# specifies the message to display. The third argument lists details +# about the find result so that if they change the message will be +# displayed again. The macro also obeys the QUIET argument to the +# find_package command. +# +# Example: +# +# :: +# +# if(X11_FOUND) +# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}" +# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") +# else() +# ... +# endif() + +function(FIND_PACKAGE_MESSAGE pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REPLACE "\n" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake new file mode 100644 index 000000000..dce6f9926 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/cmake/Modules/NewCMake/SelectLibraryConfigurations.cmake @@ -0,0 +1,70 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +#.rst: +# SelectLibraryConfigurations +# --------------------------- +# +# +# +# select_library_configurations( basename ) +# +# This macro takes a library base name as an argument, and will choose +# good values for basename_LIBRARY, basename_LIBRARIES, +# basename_LIBRARY_DEBUG, and basename_LIBRARY_RELEASE depending on what +# has been found and set. If only basename_LIBRARY_RELEASE is defined, +# basename_LIBRARY will be set to the release value, and +# basename_LIBRARY_DEBUG will be set to basename_LIBRARY_DEBUG-NOTFOUND. +# If only basename_LIBRARY_DEBUG is defined, then basename_LIBRARY will +# take the debug value, and basename_LIBRARY_RELEASE will be set to +# basename_LIBRARY_RELEASE-NOTFOUND. +# +# If the generator supports configuration types, then basename_LIBRARY +# and basename_LIBRARIES will be set with debug and optimized flags +# specifying the library to be used for the given configuration. If no +# build type has been set or the generator in use does not support +# configuration types, then basename_LIBRARY and basename_LIBRARIES will +# take only the release value, or the debug value if the release one is +# not set. + +# This macro was adapted from the FindQt4 CMake module and is maintained by Will +# Dicharry . + +macro( select_library_configurations basename ) + if(NOT ${basename}_LIBRARY_RELEASE) + set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + if(NOT ${basename}_LIBRARY_DEBUG) + set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.") + endif() + + if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND + NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND + ( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE ) ) + # if the generator supports configuration types or CMAKE_BUILD_TYPE + # is set, then set optimized and debug options. + set( ${basename}_LIBRARY "" ) + foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE ) + list( APPEND ${basename}_LIBRARY optimized "${_libname}" ) + endforeach() + foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG ) + list( APPEND ${basename}_LIBRARY debug "${_libname}" ) + endforeach() + elseif( ${basename}_LIBRARY_RELEASE ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} ) + elseif( ${basename}_LIBRARY_DEBUG ) + set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} ) + else() + set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND") + endif() + + set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" ) + + if( ${basename}_LIBRARY ) + set( ${basename}_FOUND TRUE ) + endif() + + mark_as_advanced( ${basename}_LIBRARY_RELEASE + ${basename}_LIBRARY_DEBUG + ) +endmacro() diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/CMakeLists.txt b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/CMakeLists.txt new file mode 100644 index 000000000..4f9e55700 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/CMakeLists.txt @@ -0,0 +1,84 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +cmake_minimum_required(VERSION 3.15) +project( + ANALYSIS_UPDATE + LANGUAGES C Fortran) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules/") + +if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_Fortran_COMPILER_ID}") +endif() + +if(NOT CMAKE_C_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_C_COMPILER_ID}") +endif() + +find_package(bacio REQUIRED) +find_package(nemsio REQUIRED) +find_package(w3nco REQUIRED) +find_package(w3emc REQUIRED) +find_package(NetCDF REQUIRED C Fortran) + +set(fortran_srcs + kinds_interface.F90 + constants_interface.F90 + namelist_interface.F90 + diagnostics_interface.F90 + variable_interface.F90 + json_interface.F90 + time_methods_interface.F90 + nemsio_interface.F90 + netcdf_interface.F90 + fileio_interface.F90 + math_methods_interface.F90 + grid_methods_interface.F90 + meteo_methods_interface.F90 + interpolation_interface.F90 + pattern_interface.F90 + ensmemgen_interface.F90 + update_state_interface.F90 + fv3_analysis_interface.F90 + analysis_update_interface.F90 + main.F90) + +set(exe_name hafs_analysis_update.x) +message("TYPE CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}") +set(exec_dir ${CMAKE_SOURCE_DIR}/../../exec) +set(ext_dir ${CMAKE_SOURCE_DIR}/../hafs_extlibs/lib) +set(ext_inc_dir ${CMAKE_SOURCE_DIR}/../hafs_extlibs/include) + +set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -heap-arrays -mkl=sequential -convert big_endian -assume byterecl -DLINUX") + +add_executable(${exe_name} ${fortran_srcs}) + +target_include_directories( + ${exe_name} PUBLIC + ${ext_inc_dir}) + +target_link_libraries( + ${exe_name} + ${ext_dir}/libfftw3.a + ${ext_dir}/libfson.a + ${ext_dir}/libgridprojs.a + ${ext_dir}/libkdtree.a + nemsio::nemsio + NetCDF::NetCDF_Fortran + NetCDF::NetCDF_C + ${ext_dir}/libshtns.a + ${ext_dir}/libfftw3.a + ${ext_dir}/libshtns_interface.a + ${ext_dir}/libslatec.a + ${ext_dir}/libslint.a + ${ext_dir}/libspline.a + bacio::bacio_4 + w3emc::w3emc_d + w3nco::w3nco_d) + + + install(TARGETS ${exe_name} DESTINATION ${exec_dir}) diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile new file mode 100644 index 000000000..39634648a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile @@ -0,0 +1,71 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +SHELL=/bin/sh + +# Machine dependent compile options + +MAKE_CONF = Makefile.conf +MAKE_DEPEND = Makefile.dependency +include $(MAKE_CONF) +include $(MAKE_DEPEND) +include configure.analysis-update + +# Make calls + +"" : + @$(MAKE) -f Makefile all + +clean: + - $(RM) $(EXEC) *.o *.mod + +# Source files + +SRCS = $(SRCSF77) $(SRCSF90) + +# Object files + +OBJS = $(SRCSF90:.F90=.o) $(SRCSF77:.f=.o) + +# Compiling rules + +.SUFFIXES : +.SUFFIXES : .F90 .f .c .o + +.F90.o : + $(FC) $(FCFFLAGS) $(LIBS) $(INCS) -c $< + +.f.o : + $(F77) $(FCFFLAGS) $(LIBS) $(INCS) -c $< + +# Compiler + +all: $(EXEC) + +$(EXEC): $(OBJS) + $(LD) $(LDFLAGS) $(OBJS) main.F90 $(LIBS) $(INCS) -lm -o ./$(EXEC) diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile.conf b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile.conf new file mode 100644 index 000000000..3b924e453 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile.conf @@ -0,0 +1,93 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# Fortran compiler and options + +LD = $(FC) +LDFLAGS = $(FCFFLAGS) + +# Library dependencies + +LIBbacio = -L$(BACIO)/lib -lbacio +LIBfftw = -L$(FFTW)/lib -lfftw3 +LIBfson = -L$(FSON)/lib -lfson +LIBgridprojs = -L$(GRIDPROJS)/lib -lgridprojs +LIBkdtree = -L$(KDTREE)/lib -lkdtree +LIBnemsio = -L$(NEMSIO)/lib -lnemsio +LIBnetcdf = -L$(NETCDF)/lib -lnetcdff +LIBshtns = -L$(SHTNS)/lib -lshtns -lfftw3 +LIBshtns_mod = -L$(SHTNS_MOD)/lib -lshtns_interface -lshtns +LIBslatec = -L$(SLATEC)/lib -lslatec +LIBslint = -L$(SLINT)/lib -lslint +LIBspline = -L$(SPLINE)/lib -lspline +LIBw3 = -L$(W3)/lib -lw3 +LIBS = $(LIBfftw) $(LIBfson) $(LIBgridprojs) $(LIBkdtree) $(LIBmkl) $(LIBnemsio) $(LIBnetcdf) $(LIBshtns) $(LIBshtns_mod) $(LIBslatec) $(LIBslint) $(LIBspline) $(LIBbacio) $(LIBw3) + +# Module dependencies + +INCbacio = -I$(BACIO)/include +INCfftw = -I$(FFTW)/include +INCfson = -I$(FSON)/include +INCgridprojs = -I$(GRIDPROJS)/include +INCkdtree = -I$(KDTREE)/include +INCnemsio = -I$(NEMSIO)/include +INCnetcdf = -I$(NETCDF)/include +INCshtns = -I$(SHTNS)/include +INCshtns_mod = -I$(SHTNS_MOD)/include +INCslatec = -I$(SLATEC)/include +INCslint = -I$(SLINT)/include +INCspline = -I$(SPLINE)/include +INCS = $(INCfftw) $(INCfson) $(INCgridprojs) $(INCkdtree) $(INCnemsio) $(INCnetcdf) $(INCshtns) $(INCshtns_mod) $(INCslatec) $(INCslint) $(INCspline) $(INCbacio) + +# Executable + +EXEC = analysis_update.x + +# Source files + +SRCSF90 = kinds_interface.F90 \ + constants_interface.F90 \ + namelist_interface.F90 \ + diagnostics_interface.F90 \ + variable_interface.F90 \ + json_interface.F90 \ + time_methods_interface.F90 \ + nemsio_interface.F90 \ + netcdf_interface.F90 \ + fileio_interface.F90 \ + math_methods_interface.F90 \ + grid_methods_interface.F90 \ + meteo_methods_interface.F90 \ + interpolation_interface.F90 \ + pattern_interface.F90 \ + ensmemgen_interface.F90 \ + update_state_interface.F90 \ + fv3_analysis_interface.F90 \ + analysis_update_interface.F90 + +SRCSF77 = diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile.dependency b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile.dependency new file mode 100644 index 000000000..931cf84a3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/Makefile.dependency @@ -0,0 +1,121 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +analysis_update_interface.o: analysis_update_interface.F90 \ + diagnostics_interface.o \ + ensmemgen_interface.o \ + fv3_analysis_interface.o \ + kinds_interface.o \ + namelist_interface.o + +constants_interface.o: constants_interface.F90 \ + kinds_interface.o + +diagnostics_interface.o: diagnostics_interface.F90 \ + kinds_interface.o + +ensmemgen_interface.o: ensmemgen_interface.F90 \ + constants_interface.o \ + fileio_interface.o \ + kinds_interface.o \ + math_methods_interface.o \ + +fileio_interface.o: fileio_interface.F90 \ + json_interface.o \ + namelist_interface.o \ + netcdf_interface.o \ + variable_interface.o + +fv3_analysis_interface.o: fv3_analysis_interface.F90 \ + fileio_interface.o \ + kinds_interface.o \ + namelist_interface.o \ + update_state_interface.o + +grid_methods_interface.o: grid_methods_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + math_methods_interface.o \ + variable_interface.o + +interpolation_interface.o: interpolation_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + namelist_interface.o \ + variable_interface.o + +json_interface.o: json_interface.F90 \ + kinds_interface.o \ + variable_interface.o + +kinds_interface.o: kinds_interface.F90 + +math_methods_interface: math_methods_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + namelist_interface.o \ + variable_interface.o + +meteo_methods_interface.o: meteo_methods_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + variable_interface.o + +namelist_interface.o: namelist_interface.F90 \ + kinds_interface.o + +nemsio_interface.o: nemsio_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + namelist_interface.o \ + variable_interface.o + +netcdf_interface.o: netcdf_interface.F90 \ + kinds_interface.o \ + variable_interface.o + +pattern_interface.o: pattern_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + math_methods_interface.o \ + namelist_interface.o \ + variable_interface.o + +time_methods_interface.o: time_methods_interface.F90 \ + kinds_interface.o \ + variable_interface.o + +update_state_interface.o: update_state_interface.F90 \ + constants_interface.o \ + interpolation_interface.o \ + kinds_interface.o \ + namelist_interface.o \ + variable_interface.o + +variable_interface.o: variable_interface.F90 \ + kinds_interface.o diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/analysis_update_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/analysis_update_interface.F90 new file mode 100644 index 000000000..96e13427d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/analysis_update_interface.F90 @@ -0,0 +1,87 @@ +module analysis_update_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: analysis_update_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associate modules and subroutines + + use diagnostics_interface + use ensmemgen_interface + use fv3_analysis_interface + use kinds_interface + use namelist_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: analysis_update + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! analysis_update.f90 + + ! DESCRIPTION: + + ! This subroutine is the driver-level routine for all + ! analysis_update routines. + + !----------------------------------------------------------------------- + + subroutine analysis_update() + + ! Define variables computed within routine + + real(r_kind) :: time_start + + !===================================================================== + + ! Define local variables + + call diagnostics_time_start(time_start) + call namelist() + + ! Compute local variables + + if(is_ensgen) call ensmem_analysis() + if(is_fv3) call fv3_analysis() + + ! Define local variables + + call diagnostics_time_stop(time_start) + + !===================================================================== + + end subroutine analysis_update + + !======================================================================= + +end module analysis_update_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/configure.analysis-update b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/configure.analysis-update new file mode 100644 index 000000000..d809c614b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/configure.analysis-update @@ -0,0 +1,47 @@ +#======================================================================= + +#$$$ CONFIGURE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# Compiler options. + +DEBUG = ${ANALYSIS_UPDATE_DEBUG} +FCFFLAGS = ${ANALYSIS_UPDATE_FCFLAGS} $(DEBUG) + +# Compile time libraries. + +BACIO = ${NWP_LIBS} +FFTW = ${EXT_LIBS} +FSON = ${NWP_LIBS} +GRIDPROJS = ${NWP_LIBS} +KDTREE = ${NWP_LIBS} +NEMSIO = ${NWP_LIBS} +SHTNS = ${EXT_LIBS} +SHTNS_MOD = ${NWP_LIBS} +SLATEC = ${NWP_LIBS} +SLINT = ${NWP_LIBS} +SPLINE = ${NWP_LIBS} +W3 = ${NWP_LIBS} diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/constants_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/constants_interface.F90 new file mode 100644 index 000000000..38f98cd38 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/constants_interface.F90 @@ -0,0 +1,175 @@ +module constants_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: constants_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: cearth_equator + public :: constants_interface_init + public :: cp_mass + public :: deg2rad + public :: dlat_equator + public :: dlon_equator + public :: earth_omega + public :: grav + public :: grav_std + public :: ltnthtvpr + public :: pi + public :: rad2deg + public :: rd + public :: rd_over_cp_mass + public :: rearth_equator + public :: rv + + !----------------------------------------------------------------------- + + ! DESCRIPTION (alphabetized): + + ! * cearth_equator; a FORTRAN 4-byte real value specifying the + ! circumference of the Earth at the equator; units are meters. + + ! * cp_mass; a FORTRAN 4-byte real value specifying the specific + ! heat capacity of water vapor at constant pressure; units are + ! Joules per kilogram per Kelvin. + + ! * deg2rad; a FORTRAN 4-byte real value specifying the mathematical + ! constant to convert from degrees to radians; unitless. + + ! * dlat_equator; a FORTRAN 4-byte real value specifying the + ! distance between consecutive latitude points at the equator; + ! this value is for reference since latitude distance values do + ! not vary from equator to pole; units are meters. + + ! * dlon_equator; a FORTRAN 4-byte real value specifying the + ! distance between consecutive longitude points at the equator; + ! units are meters. + + ! * earth_omega; a FORTRAN 4-byte real value specifying the rotation + ! rate of the Earth; units are radians per second. + + ! * grav; a FORTRAN 4-byte real value containing the acceleration + ! due to gravity; units are meters per second per second. + + ! * grav_std; a FORTRAN 4-byte real value containing the standard + ! * gravity; units are meters per second per second. + + ! * ltnthtvpr; a FORTRAN 4-byte real value containing the latent + ! heat of vaporization; units are Joules per kilogram. + + ! * pi; a FORTRAN 4-byte real value containing the (machine + ! precision truncated) mathematical constant for atan(-1.0); + ! unitless. + + ! * rad2deg; a FORTRAN 4-byte real value specifying the mathematical + ! constant to convert from radians to degrees; unitless. + + ! * rd; a FORTRAN 4-byte real value specifying the gas constant for + ! dry air; units are Joules per Kelvin per kilogram. + + ! * rd_over_cp_mass; a FORTRAN 4-byte real value designating the + ! ratio rd/cp_mass. + + ! * rearth_equator; a FORTRAN 4-byte real value specifying the Earth + ! equatorial radius; units are meters. + + ! * rv; a FORTRAN 4-byte real value specifying the gas constant for + ! water vapor; units are Joules per Kelvin per kilogram. + + !----------------------------------------------------------------------- + + ! Define local variables + + real(r_kind) & + & cearth_equator + real(r_kind) & + & dlat_equator + real(r_kind) & + & dlon_equator + real(r_kind), parameter :: & + & cp_mass = 1004.67_r_kind + real(r_kind), parameter :: & + & earth_omega = 7.292115e-5_r_kind + real(r_kind), parameter :: & + & grav = 9.80665e0_r_kind + real(r_kind), parameter :: & + & grav_std = 9.80665e0_r_kind + real(r_kind), parameter :: & + & ltnthtvpr = 2.5e6_r_kind + real(r_kind), parameter :: & + & pi = acos(-1.0) + real(r_kind), parameter :: & + & deg2rad = pi/180.0_r_kind + real(r_kind), parameter :: & + & rad2deg = 1.0/deg2rad + real(r_kind), parameter :: & + & rd = 2.8705e2_r_kind + real(r_kind), parameter :: & + & rd_over_cp_mass = rd/cp_mass + real(r_kind), parameter :: & + & rearth_equator = 6.37813662e6_r_kind + real(r_kind), parameter :: & + & rv = 4.6150e2_r_kind + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! constants_interface_init.f90 + + ! DESCRIPTION: + + ! This subroutine initializes (e.g., computes) all constant values + ! with constant value dependencies. + + !----------------------------------------------------------------------- + + subroutine constants_interface_init() + + !===================================================================== + + ! Compute local variables + + cearth_equator = 2.0*pi*rearth_equator + dlat_equator = cearth_equator/360.0 + dlon_equator = cearth_equator/360.0 + + !===================================================================== + + end subroutine constants_interface_init + + !======================================================================= + +end module constants_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/diagnostics_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/diagnostics_interface.F90 new file mode 100644 index 000000000..6b3aecb73 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/diagnostics_interface.F90 @@ -0,0 +1,137 @@ +module diagnostics_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: diagnostics_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: diagnostics_time_start + public :: diagnostics_time_stop + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! diagnostics_time_start.f90 + + ! DESCRIPTION: + + ! This subroutine calls the intrinsic subroutine cpu_time and + ! defines the elapsed CPU time in seconds. + + ! INPUT VARIABLES: + + ! * time_start; a FORTRAN 4-byte real value. + + ! OUTPUT VARIABLES: + + ! * time_start; a FORTRAN 4-byte real value specifying the elapsed + ! CPU time; units are seconds. + + !----------------------------------------------------------------------- + + subroutine diagnostics_time_start(time_start) + + ! Define variables passed to routine + + real(r_kind) :: time_start + + ! Define variables computed within routine + + character(len=100) :: cmd + + !===================================================================== + + ! Define local variables + + call get_command_argument(0,cmd) + call cpu_time(time_start) + write(6,500) trim(adjustl(cmd)) + write(6,*) '' +500 format('BEGINNING EXECUTION OF PROGRAM ',a,'.') + + !===================================================================== + + end subroutine diagnostics_time_start + + !======================================================================= + + ! SUBROUTINE: + + ! diagnostics_time_stop.f90 + + ! DESCRIPTION: + + ! This subroutine computes the total time since the user specified + ! starting time and prints a message indicating the time in + ! accordance with the optional variables provided by the user. + + ! INPUT VARIABLES: + + ! * time_start; a FORTRAN 4-byte real specifying the value returned + ! by subroutine diagnostics_time_start.f90. + + !----------------------------------------------------------------------- + + subroutine diagnostics_time_stop(time_start) + + ! Define variables passed to routine + + real(r_kind) :: time_start + + ! Define variables computed within routine + + character(len=100) :: cmd + real(r_kind) :: time_stop + + !===================================================================== + + ! Define local variables + + call get_command_argument(0,cmd) + call cpu_time(time_stop) + write(6,500) (time_stop - time_start) + write(6,*) '' + write(6,501) trim(adjustl(cmd)) +500 format('Execution time: ', f13.5, ' seconds.') +501 format('COMPLETED EXECUTION OF PROGRAM ',a,'.') + + !===================================================================== + + end subroutine diagnostics_time_stop + + !======================================================================= + +end module diagnostics_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/ensmemgen_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/ensmemgen_interface.F90 new file mode 100644 index 000000000..584ce2256 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/ensmemgen_interface.F90 @@ -0,0 +1,975 @@ +module ensmemgen_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: ensmemgen_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use fileio_interface + use kinds_interface + use math_methods_interface + use meteo_methods_interface + use namelist_interface + use nemsio_interface + use pattern_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: ensmem_analysis + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! compute_pattern.f90 + + ! DESCRIPTION: + + ! This subroutine computes a random pattern from a Gaussian 'white' + ! noise spectrum advanced via an auto-regressive process; an + ! external netcdf file 'pattern.nc' is written to the namelist + ! 'datapath' attribute which contains the geographical (e.g., + ! latitude and longitude) grid and the computed random number + ! pattern. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! geographical (e.g., latitude and longitude) grid and the + ! computed random number pattern. + + !----------------------------------------------------------------------- + + subroutine compute_pattern(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + type(nems_struct) :: nemsio + character(len=500) :: pattern_filename + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_read_pattern) then + + ! Define local variables + + call fileio_interface_read(ensmem_pattern_filename,pattern) + + end if ! if(is_read_pattern) + + ! Check local variable and proceed accordingly + + if(.not. is_read_pattern) then + + ! Check local variable and proceed accordingly + + if(is_nemsio) then + + ! Define local variables + + call nemsio_interface_init(ensmem_filename,nemsio) + pattern%nx = nemsio%nx + pattern%ny = nemsio%ny + pattern%ntrunc = nemsio%jcap + + end if ! if(is_nemsio) + + ! Define local variables + + call pattern_interface_compute(pattern) + + ! Check local variable and proceed accordingly + + if(is_nemsio) then + + ! Define local variables + + pattern%lat = reshape(nemsio%lat,shape(pattern%lat)) + pattern%lon = reshape(nemsio%lon,shape(pattern%lon)) + + end if ! if(is_nemsio) + + ! Define local variables + + pattern_filename = trim(adjustl(datapath))//'pattern.nc' + call fileio_interface_write(pattern_filename,pattern) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(nemsio) + + end if ! if(.not. is_read_pattern) + + ! Define local variables + + if(debug) write(6,500) minval(pattern%rnp), maxval(pattern%rnp) +500 format('COMPUTE_PATTERN: Random number pattern values min/max = ', & + & f13.5,1x,f13.5) + + !===================================================================== + + end subroutine compute_pattern + + !======================================================================= + + ! SUBROUTINE: + + ! compute_perturbations_global.f90 + + ! DESCRIPTION: + + ! This subroutine applies random perturbations to the principle + ! components at (or above) the variance explained threshold + ! specified by the user and updates the corresponding file for the + ! respective ensemble member to be generated. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! computed random number pattern. + + !----------------------------------------------------------------------- + + subroutine compute_perturbations_global(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + type(json_pattern_struct), dimension(:), allocatable :: json + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(json) + + ! Loop through local variable + + do i = 1, size(json) + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json(i)%variable_name)) .ne. 'uv') then + + ! Check local variable and proceed accordingly + + if(is_nemsio) then + + ! Compute local variables + + call nemsio_perturbations_scalar(pattern,json(i)) + + end if ! if(is_nemsio) + + else ! if(trim(adjustl(json(i)%variable_name)) .ne. 'uv') + + ! Check local variable and proceed accordingly + + if(is_nemsio) then + + ! Compute local variables + + call nemsio_perturbations_winds(pattern,json(i)) + + end if ! if(is_nemsio) + + end if ! if(trim(adjustl(json(i)%variable_name)) .ne. 'uv') + + end do ! do i = 1, size(json) + + ! Deallocate memory for local variables + + if(allocated(json)) deallocate(json) + + !===================================================================== + + end subroutine compute_perturbations_global + + !======================================================================= + + ! SUBROUTINE: + + ! compute_perturbations_regional.f90 + + ! DESCRIPTION: + + ! This subroutine applies random perturbations to the principle + ! components at (or above) the variance explained threshold + ! specified by the user and updates the corresponding file for the + ! respective ensemble member to be generated. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! computed random number pattern. + + ! * tcv; a FORTRAN tcv_struct variable containing the TC-vitals + ! attributes. + + !----------------------------------------------------------------------- + + subroutine compute_perturbations_regional(pattern,tcv) + + ! Define variables passed to routine + + type(tcv_struct) :: tcv(:) + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + type(json_pattern_struct), dimension(:), allocatable :: json + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(json) + + ! Loop through local variable + + do i = 1, size(json) + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json(i)%variable_name)) .ne. 'uv') then + + ! Check local variable and proceed accordingly + + if(is_nemsio) then + + ! Compute local variables + + call nemsio_perturbations_scalar(pattern,json(i),tcv) + + end if ! if(is_nemsio) + + else ! if(trim(adjustl(json(i)%variable_name)) .ne. 'uv') + + ! Check local variable and proceed accordingly + + if(is_nemsio) then + + ! Compute local variables + + call nemsio_perturbations_winds(pattern,json(i),tcv) + + end if ! if(is_nemsio) + + end if ! if(trim(adjustl(json(i)%variable_name)) .ne. 'uv') + + end do ! do i = 1, size(json) + + ! Deallocate memory for local variables + + if(allocated(json)) deallocate(json) + + !===================================================================== + + end subroutine compute_perturbations_regional + + !======================================================================= + + ! SUBROUTINE: + + ! ensmem_analysis.f90 + + ! DESCRIPTION: + + ! This subroutine is the driver routine to apply a 'white' noise + ! generated random pattern of perturbations to user specified + ! analysis variables as a means to generate error growth as a means + ! to describe/generate ensemble members. + + !----------------------------------------------------------------------- + + subroutine ensmem_analysis() + + ! Define variables computed within routine + + type(tcv_struct), dimension(:), allocatable :: tcv + type(pattern_struct) :: pattern + + !===================================================================== + + ! Compute local variables + + call compute_pattern(pattern) + + ! Check local variable and proceed accordingly + + if(is_ensgen_regional) then + + ! Define local variables + + call fileio_interface_read(tcv_filename,tcv) + + ! Compute local variables + + call compute_perturbations_regional(pattern,tcv) + + end if ! if(is_ensgen_regional) + + ! Check local variable and proceed accordingly + + if(.not. is_ensgen_regional) then + + ! Compute local variables + + call compute_perturbations_global(pattern) + + end if ! if(.not. is_ensgen_regional) + + ! Deallocate memory for local variables + + if(allocated(tcv)) deallocate(tcv) + call variable_interface_cleanup_struct(pattern) + + !===================================================================== + + end subroutine ensmem_analysis + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_perturbations_scalar.f90 + + ! DESCRIPTION: + + ! This subroutine applies perturbations to scalar variable fields + ! using PCA and random spatially- and temporally correlated (e.g., + ! Gaussian 'white' noise) patterns. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! computed random number pattern. + + ! * json; a FORTRAN json_pattern_struct variable. + + ! OPTIONAL INPUT VARIABLES: + + ! * tcv; a FORTRAN tcv_struct variable containing the TC-vitals + ! attributes. + + !----------------------------------------------------------------------- + + subroutine nemsio_perturbations_scalar(pattern,json,tcv) + + ! Define variables passed to routine + + type(tcv_struct), optional :: tcv(:) + type(json_pattern_struct) :: json + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + type(nems_struct) :: nemsio + type(pattern_struct) :: pattern_local + type(vargrid_struct) :: vargrid + type(statgrid_struct) :: statgrid + type(svd_struct) :: svd + real(r_double), dimension(:,:), allocatable :: svd_a + real(r_double), dimension(:), allocatable :: svd_s + integer :: idx + integer :: idxp1 + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call variable_interface_vtable_lookup(json,nemsio) + call nemsio_interface_init(ensmem_filename,nemsio) + pattern_local%nx = pattern%nx + pattern_local%ny = pattern%ny + call variable_interface_setup_struct(pattern_local) + pattern_local%lat = pattern%lat + pattern_local%lon = pattern%lon + pattern_local%rnp = pattern%rnp + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(nemsio) + + ! Allocate memory for local variables + + if(.not. allocated(svd_a)) allocate(svd_a(nemsio%nx,nemsio%ny)) + if(.not. allocated(svd_s)) allocate(svd_s(nemsio%ny)) + + ! Check local variable and proceed accordingly + + if(json%levtype .eq. 3) then + + ! Loop through local variable + + do i = max(json%min_lev,1), min(json%max_lev,nemsio%nz) + + ! Define local variables + + nemsio%lev = i + call fileio_interface_read(ensmem_filename,nemsio) + if(debug) write(6,500) trim(adjustl(nemsio%varname)), & + & nemsio%lev, minval(nemsio%var), maxval(nemsio%var) + svd%nx = nemsio%nx + svd%ny = nemsio%ny + call variable_interface_setup_struct(svd) + svd%a = reshape(dble(nemsio%var),shape(svd%a)) + svd_a = svd%a + svd%dcnstrct = .true. + svd%rcnstrct = .false. + + ! Compute local variables + + call math_methods_pca(svd) + call math_methods_pca_vari_cutoff(svd,json%vari_thresh,idx, & + & idxp1) + + ! Define local variables + + svd_s = svd%s + svd%s = dble(0.0) + svd%s(idxp1:size(svd%s)) = svd_s(idxp1:size(svd%s)) + svd%dcnstrct = .false. + svd%rcnstrct = .true. + + ! Compute local variables + + call math_methods_pca(svd) + + ! Define local variables + + vargrid%nx = svd%nx + vargrid%ny = svd%ny + call variable_interface_setup_struct(vargrid) + vargrid%var = reshape(real(svd%a),shape(vargrid%var)) + + ! Compute local variables + + call math_methods_stats(vargrid,statgrid) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(vargrid) + + ! Define local variables + + pattern_local%rnp_max_scale = statgrid%vari + pattern_local%rnp_min_scale = -1.0*statgrid%vari + + ! Check local variable and proceed accordingly + + if(is_ensgen_regional) then + + ! Compute local variables + + call rescale_rnp(pattern_local,tcv) + + else ! if(is_ensgen_regional) + + ! Compute local variables + + call rescale_rnp(pattern_local) + + end if ! if(is_ensgen_regional) + + ! Define local variables + + svd_a = svd_a + svd%a*dble(pattern_local%rnp) + nemsio%var = reshape(real(svd_a),shape(nemsio%var)) + + ! Check local variable and proceed accordingly + + if(json%clip) then + + ! Define local variables + + where(nemsio%var .lt. 0.0) nemsio%var = clpval + + end if ! if(json%clip) + + ! Define local variables + + if(debug) write(6,501) trim(adjustl(nemsio%varname)), & + & nemsio%lev, minval(nemsio%var), maxval(nemsio%var) + call fileio_interface_write(ensmem_filename,nemsio) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(nemsio) + call variable_interface_cleanup_struct(svd) + + end do ! do i = max(json%min_lev,1), + ! min(json%max_lev,nemsio%nz) + + end if ! if(json%levtype .eq. 3) + + ! Deallocate memory for local variables + + if(allocated(svd_a)) deallocate(svd_a) + if(allocated(svd_s)) deallocate(svd_s) + call variable_interface_cleanup_struct(pattern_local) + + ! Define local variables + +500 format('NEMSIO_PERTURBATIONS_SCALER: Input variable ',a,1x, & + & 'level = ',i3.3,1x,'min/max = ',2f13.5) +501 format('NEMSIO_PERTURBATIONS_SCALER: Output variable ',a,1x, & + & 'level = ',i3.3,1x,'min/max = ',2f13.5) + + !===================================================================== + + end subroutine nemsio_perturbations_scalar + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_perturbations_vector.f90 + + ! DESCRIPTION: + + ! This subroutine applies perturbations to vector (derived) variable + ! fields using PCA and random spatially- and temporally correlated + ! (e.g., Gaussian 'white' noise) patterns. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! computed random number pattern. + + ! * json; a FORTRAN json_pattern_struct variable. + + ! OPTIONAL INPUT VARIABLES: + + ! * tcv; a FORTRAN tcv_struct variable containing the TC-vitals + ! attributes. + + !----------------------------------------------------------------------- + + subroutine nemsio_perturbations_winds(pattern,json,tcv) + + ! Define variables passed to routine + + type(tcv_struct), optional :: tcv(:) + type(json_pattern_struct) :: json + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + type(meteo_struct) :: meteo + type(nems_struct) :: nemsio + type(pattern_struct) :: pattern_local + type(vargrid_struct) :: vargrid + type(statgrid_struct) :: statgrid + type(svd_struct) :: svd + real(r_double), dimension(:,:), allocatable :: svd_a + real(r_double), dimension(:), allocatable :: svd_s + real(r_kind), dimension(:,:), allocatable :: wspd + integer :: idx + integer :: idxp1 + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call variable_interface_vtable_lookup(json,nemsio) + call nemsio_interface_init(ensmem_filename,nemsio) + pattern_local%nx = pattern%nx + pattern_local%ny = pattern%ny + call variable_interface_setup_struct(pattern_local) + pattern_local%lat = pattern%lat + pattern_local%lon = pattern%lon + pattern_local%rnp = pattern%rnp + meteo%nx = nemsio%nx + meteo%ny = nemsio%ny + meteo%nz = 1 + call variable_interface_setup_struct(meteo) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(nemsio) + + ! Allocate memory for local variables + + if(.not. allocated(svd_a)) allocate(svd_a(nemsio%nx,nemsio%ny)) + if(.not. allocated(svd_s)) allocate(svd_s(nemsio%ny)) + if(.not. allocated(wspd)) allocate(wspd(nemsio%nx,nemsio%ny)) + + ! Check local variable and proceed accordingly + + if(json%levtype .eq. 3) then + + ! Loop through local variable + + do i = max(json%min_lev,1), min(json%max_lev,nemsio%nz) + + ! Define local variables + + nemsio%lev = i + nemsio%varname = 'ugrd' + call fileio_interface_read(ensmem_filename,nemsio) + if(debug) write(6,500) trim(adjustl(nemsio%varname)), & + & nemsio%lev, minval(nemsio%var), maxval(nemsio%var) + meteo%u(:,1) = nemsio%var + nemsio%varname = 'vgrd' + call fileio_interface_read(ensmem_filename,nemsio) + if(debug) write(6,500) trim(adjustl(nemsio%varname)), & + & nemsio%lev, minval(nemsio%var), maxval(nemsio%var) + meteo%v(:,1) = nemsio%var + meteo%wdir(:,1) = spval + meteo%wspd(:,1) = spval + + ! Compute local variables + + call meteo_methods_winds(meteo) + + ! Define local variables + + wspd = reshape(meteo%wspd(:,1),shape(wspd)) + svd%nx = nemsio%nx + svd%ny = nemsio%ny + call variable_interface_setup_struct(svd) + svd%a = reshape(dble(wspd),shape(svd%a)) + svd_a = svd%a + svd%dcnstrct = .true. + svd%rcnstrct = .false. + + ! Compute local variables + + call math_methods_pca(svd) + call math_methods_pca_vari_cutoff(svd,json%vari_thresh,idx, & + & idxp1) + + ! Define local variables + + svd_s = svd%s + svd%s = dble(0.0) + svd%s(idxp1:size(svd%s)) = svd_s(idxp1:size(svd%s)) + svd%dcnstrct = .false. + svd%rcnstrct = .true. + + ! Compute local variables + + call math_methods_pca(svd) + + ! Define local variables + + vargrid%nx = svd%nx + vargrid%ny = svd%ny + call variable_interface_setup_struct(vargrid) + vargrid%var = reshape(real(svd%a),shape(vargrid%var)) + + ! Compute local variables + + call math_methods_stats(vargrid,statgrid) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(vargrid) + + ! Define local variables + + pattern_local%rnp_max_scale = statgrid%vari + pattern_local%rnp_min_scale = -1.0*statgrid%vari + pattern_local%rnp = pattern%rnp + + ! Check local variable and proceed accordingly + + if(is_ensgen_regional) then + + ! Compute local variables + + call rescale_rnp(pattern_local,tcv) + + else ! if(is_ensgen_regional) + + ! Compute local variables + + call rescale_rnp(pattern_local) + + end if ! if(is_ensgen_regional) + + ! Define local variables + + svd_a = svd_a + svd%a*dble(pattern_local%rnp) + meteo%wspd(:,1) = reshape(svd_a,shape(meteo%wspd(:,1))) + meteo%u(:,1) = spval + meteo%v(:,1) = spval + + ! Compute local variables + + call meteo_methods_winds(meteo) + + ! Define local variables + + nemsio%var = meteo%u(:,1) + nemsio%varname = 'ugrd' + call fileio_interface_write(ensmem_filename,nemsio) + if(debug) write(6,501) trim(adjustl(nemsio%varname)), & + & nemsio%lev, minval(nemsio%var), maxval(nemsio%var) + nemsio%var = meteo%v(:,1) + nemsio%varname = 'vgrd' + call fileio_interface_write(ensmem_filename,nemsio) + if(debug) write(6,501) trim(adjustl(nemsio%varname)), & + & nemsio%lev, minval(nemsio%var), maxval(nemsio%var) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(nemsio) + call variable_interface_cleanup_struct(svd) + + end do ! do i = max(json%min_lev,1), + ! min(json%max_lev,nemsio%nz) + + end if ! if(json%levtype .eq. 3) + + ! Deallocate memory for local variables + + if(allocated(svd_a)) deallocate(svd_a) + if(allocated(svd_s)) deallocate(svd_s) + if(allocated(wspd)) deallocate(wspd) + call variable_interface_cleanup_struct(meteo) + call variable_interface_cleanup_struct(pattern_local) + + ! Define local variables + +500 format('NEMSIO_PERTURBATIONS_WINDS: Input variable ',a,1x, & + & 'level = ',i3.3,1x,'min/max = ',2f13.5) +501 format('NEMSIO_PERTURBATIONS_WINDS: Output variable ',a,1x, & + & 'level = ',i3.3,1x,'min/max = ',2f13.5) + + !===================================================================== + + end subroutine nemsio_perturbations_winds + + !======================================================================= + + ! SUBROUTINE: + + ! rescale_rnp.f90 + + ! DESCRIPTION: + + ! This subroutine rescales the values defining the random number + ! pattern between the threshold values specified by the user. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the random + ! number, spatially and temporally correlated, pattern within the + ! 'rnp' attribute. + + ! OPTIONAL INPUT VARIABLES: + + ! * tcv; a FORTRAN tcv_struct variable array containing the ???? + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the random + ! number, spatially and temporally correlated, pattern re-scale + ! within the interval specified by the user in the 'rnp' + ! attribute. + + !----------------------------------------------------------------------- + + subroutine rescale_rnp(pattern,tcv) + + ! Define variables passed to routine + + type(tcv_struct), optional :: tcv(:) + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(kdtree_struct) :: kdtree + real(r_kind), dimension(:), allocatable :: rnp + real(r_kind), dimension(:), allocatable :: rnp_tcv + real(r_kind) :: radius(4) + real(r_kind) :: rnp_maxval + real(r_kind) :: rnp_max + real(r_kind) :: rnp_minval + real(r_kind) :: rnp_min + real(r_kind) :: tcv_lat + real(r_kind) :: tcv_lon + integer :: ncoords + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + rnp_maxval = maxval(pattern%rnp) + rnp_max = pattern%rnp_max_scale + rnp_minval = minval(pattern%rnp) + rnp_min = pattern%rnp_min_scale + + ! Loop through local variable + + do j = 1, pattern%ny + + ! Loop through local variable + + do i = 1, pattern%nx + + ! Compute local variables + + pattern%rnp(i,j) = rnp_min + ((pattern%rnp(i,j) - rnp_minval)* & + & (rnp_max - rnp_min))/(rnp_maxval - rnp_minval) + + end do ! do i = 1, pattern%nx + + end do ! do j = 1, pattern%ny + + ! Check local variable and proceed accordingly + + if(present(tcv)) then + + ! Define local variables + + kdtree%src_ncoords = 1 + kdtree%dst_ncoords = (pattern%nx*pattern%ny) + kdtree%nn = (pattern%nx*pattern%ny) + call variable_interface_setup_struct(kdtree) + kdtree%nalloc = (pattern%nx*pattern%ny) + dst_grid%ncoords = (pattern%nx*pattern%ny) + call variable_interface_setup_struct(dst_grid) + dst_grid%lat = reshape(pattern%lat,shape(dst_grid%lat)) + dst_grid%lon = reshape(pattern%lon,shape(dst_grid%lon)) + + ! Allocate memory for local variables + + if(.not. allocated(rnp)) & + & allocate(rnp(pattern%nx*pattern%ny)) + if(.not. allocated(rnp_tcv)) & + & allocate(rnp_tcv(pattern%nx*pattern%ny)) + + ! Define local variables + + rnp = reshape(pattern%rnp,shape(rnp)) + rnp_tcv = 0.0 + + ! Loop through local variable + + do i = 1, size(tcv) + + ! Compute local variables + + call math_methods_radialdist(tcv(i)%lon,tcv(i)%lat, & + & tcv(i)%lon+tc_region_area,tcv(i)%lat+tc_region_area, & + & radius(1)) + call math_methods_radialdist(tcv(i)%lon,tcv(i)%lat, & + & tcv(i)%lon-tc_region_area,tcv(i)%lat+tc_region_area, & + & radius(2)) + call math_methods_radialdist(tcv(i)%lon,tcv(i)%lat, & + & tcv(i)%lon+tc_region_area,tcv(i)%lat-tc_region_area, & + & radius(3)) + call math_methods_radialdist(tcv(i)%lon,tcv(i)%lat, & + & tcv(i)%lon-tc_region_area,tcv(i)%lat-tc_region_area, & + & radius(4)) + + ! Define local variables + + src_grid%clat = tcv(i)%lat + src_grid%clon = tcv(i)%lon + kdtree%r2 = maxval(radius)*maxval(radius) + + ! Compute local variables + + call math_methods_kdtree_r2(src_grid,dst_grid,kdtree) + + ! Loop through local variable + + do j = 1, kdtree%nfound + + ! Define local variables + + rnp_tcv(kdtree%idx(1,j)) = rnp(kdtree%idx(1,j)) + + end do ! do j = 1, kdtree%nfound + + end do ! do i = 1, size(tcv) + + ! Define local variables + + pattern%rnp = reshape(rnp_tcv,shape(pattern%rnp)) + + ! Deallocate memory for local variables + + if(allocated(rnp)) deallocate(rnp) + if(allocated(rnp_tcv)) deallocate(rnp_tcv) + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(kdtree) + + end if ! if(present(tcv)) + + !===================================================================== + + end subroutine rescale_rnp + + !======================================================================= + +end module ensmemgen_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/fileio_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/fileio_interface.F90 new file mode 100644 index 000000000..5dbff1e0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/fileio_interface.F90 @@ -0,0 +1,1356 @@ +module fileio_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: fileio_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associate modules and subroutines + + use json_interface + use kinds_interface + use namelist_interface + use nemsio_interface + use netcdf_interface + use time_methods_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: fileio_interface_date_read + public :: fileio_interface_date_write + public :: fileio_interface_read + public :: fileio_interface_write + interface fileio_interface_date_read + module procedure nemsdate_read + end interface fileio_interface_date_read + interface fileio_interface_date_write + module procedure nemsdate_write + end interface fileio_interface_date_write + interface fileio_interface_read + module procedure fv3grid_read + module procedure fv3psfc_read + module procedure fv3var_read + module procedure json_fv3var_read + module procedure json_pattern_read + module procedure nemsvar_read + module procedure pattern_read + module procedure tcv_read + end interface fileio_interface_read + interface fileio_interface_varinfo + module procedure varinfo_pattern + end interface fileio_interface_varinfo + interface fileio_interface_write + module procedure fv3var_write + module procedure nemsvar_write + module procedure pattern_write + end interface fileio_interface_write + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! fv3grid_read.f90 + + ! DESCRIPTION: + + ! This subroutine defines and computes the attributes of the FV3 + ! Arakawa-D grid. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string containing the path to the + ! external file containing the FV3 grid specifications/attributes. + + ! * fv3grid; an array of FORTRAN fv3grid_struct variables of + ! dimension 3. + + ! OUTPUT VARIABLES: + + ! * fv3grid; an array of FORTRAN fv3grid_struct variables of + ! dimension 3 containing the defined and computed attributes of + ! the FV3 Arakawa-D grid; the mass variable projections are + ! contained in array 1, the zonal- (U-) wind aligned variable + ! projections are contained in array 2, and the meridional- (V-) + ! wind aligned variable projections are contained in array 3. + + !----------------------------------------------------------------------- + + subroutine fv3grid_read(filename_static,filename_grid,fv3grid) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid(3) + character(len=500) :: filename_static + character(len=500) :: filename_grid + + ! Define variables computed within routine + + character(len=100) :: dimname + character(len=100) :: varname + real(r_kind), dimension(:,:), allocatable :: dlat + real(r_kind), dimension(:,:), allocatable :: dlon + real(r_kind), dimension(:,:), allocatable :: lat + real(r_kind), dimension(:,:), allocatable :: latt + real(r_kind), dimension(:,:), allocatable :: lat_work + real(r_kind), dimension(:,:), allocatable :: lon + real(r_kind), dimension(:,:), allocatable :: lont + real(r_kind), dimension(:,:), allocatable :: lon_work + real(r_kind), dimension(:), allocatable :: ak + real(r_kind), dimension(:), allocatable :: bk + integer :: grid_x + integer :: grid_xt + integer :: grid_y + integer :: grid_yt + integer :: pfull + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + dimname = 'grid_x' + call netcdf_interface_getdim(filename_grid,dimname,grid_x) + dimname = 'grid_xt' + call netcdf_interface_getdim(filename_grid,dimname,grid_xt) + dimname = 'grid_y' + call netcdf_interface_getdim(filename_grid,dimname,grid_y) + dimname = 'grid_yt' + call netcdf_interface_getdim(filename_grid,dimname,grid_yt) + dimname = 'pfull' + call netcdf_interface_getdim(filename_static,dimname,pfull) + + ! Allocate memory for local variables + + if(.not. allocated(dlat)) allocate(dlat(grid_xt,grid_yt)) + if(.not. allocated(dlon)) allocate(dlon(grid_xt,grid_yt)) + if(.not. allocated(lat)) allocate(lat(grid_x,grid_y)) + if(.not. allocated(latt)) allocate(latt(grid_xt,grid_yt)) + if(.not. allocated(lon)) allocate(lon(grid_x,grid_y)) + if(.not. allocated(lont)) allocate(lont(grid_xt,grid_yt)) + if(.not. allocated(ak)) allocate(ak(pfull)) + if(.not. allocated(bk)) allocate(bk(pfull)) + + ! Define local variables + + varname = 'grid_lat' + call netcdf_interface_getvar(filename_grid,varname,lat) + varname = 'grid_latt' + call netcdf_interface_getvar(filename_grid,varname,latt) + varname = 'grid_lon' + call netcdf_interface_getvar(filename_grid,varname,lon) + varname = 'grid_lont' + call netcdf_interface_getvar(filename_grid,varname,lont) + varname = 'hyam' + call netcdf_interface_getvar(filename_static,varname,ak) + varname = 'hybm' + call netcdf_interface_getvar(filename_static,varname,bk) + dlat = 0.0 + dlon = 0.0 + + ! Loop through local variables + + do j = 1, (grid_yt - 1) + + ! Loop through local variable + + do i = 1, grid_xt + + ! Compute local variables + + dlat(i,j) = latt(i,j) - latt(i,j+1) + + end do ! do i = 1, grid_xt + + end do ! do j = 1, (grid_yt - 1) + + ! Loop through local variables + + do j = 1, grid_yt + + ! Loop through local variable + + do i = 1, (grid_xt - 1) + + ! Compute local variables + + dlon(i,j) = lont(i,j) - lont(i+1,j) + + end do ! do i = 1, (grid_xt - 1) + + end do ! do j = 1, grid_yt + + ! Define local variables + + fv3grid(1)%nx = grid_xt + fv3grid(1)%ny = grid_yt + fv3grid(1)%nz = pfull + call variable_interface_setup_struct(fv3grid(1)) + fv3grid(1)%lat = reshape(latt,shape(fv3grid(1)%lat)) + fv3grid(1)%lon = reshape(lont,shape(fv3grid(1)%lon)) + if(debug) write(6,500) 'T', minval(fv3grid(1)%lat), & + & maxval(fv3grid(1)%lat) + if(debug) write(6,501) 'T', minval(fv3grid(1)%lon), & + & maxval(fv3grid(1)%lon) + fv3grid(1)%clat = latt(nint(fv3grid(1)%nx/2.0), & + & nint(fv3grid(1)%ny/2.0)) + fv3grid(1)%clon = lont(nint(fv3grid(1)%nx/2.0), & + & nint(fv3grid(1)%ny/2.0)) + fv3grid(1)%ak = ak*1.e5 + fv3grid(1)%bk = bk + if(debug) write(6,502) 'T', fv3grid(1)%clat, fv3grid(1)%clon + fv3grid(2)%nx = grid_xt + fv3grid(2)%ny = grid_y + fv3grid(2)%nz = pfull + call variable_interface_setup_struct(fv3grid(2)) + + ! Allocate memory for local variables + + if(.not. allocated(lat_work)) & + & allocate(lat_work(fv3grid(2)%nx,fv3grid(2)%ny)) + if(.not. allocated(lon_work)) & + & allocate(lon_work(fv3grid(2)%nx,fv3grid(2)%ny)) + + ! Define local variables + + lon_work(1:fv3grid(1)%nx,1:fv3grid(2)%ny) = & + & lon(1:fv3grid(1)%nx,1:fv3grid(2)%ny) + + ! Loop through local variable + + do j = 1, fv3grid(1)%ny + + ! Loop through local variable + + do i = 1, fv3grid(1)%nx + + ! Compute local variables + + lat_work(i,j) = latt(i,j) + 0.5*dlat(i,j) + lon_work(i,j) = lont(i,j) + + end do ! do i = 1, fv3grid(1)%nx + + end do ! do j = 1, fv3grid(1)%ny + + ! Define local variables + + lat_work(1:fv3grid(2)%nx,fv3grid(2)%ny) = & + & lat(1:fv3grid(2)%nx,fv3grid(2)%ny) + fv3grid(2)%lat = & + & reshape(lat_work,shape(fv3grid(2)%lat)) + fv3grid(2)%lon = & + & reshape(lon_work,shape(fv3grid(2)%lon)) + if(debug) write(6,500) 'U', minval(fv3grid(2)%lat), & + & maxval(fv3grid(2)%lat) + if(debug) write(6,501) 'U', minval(fv3grid(2)%lon), & + & maxval(fv3grid(2)%lon) + fv3grid(2)%clat = & + & lat_work(nint(fv3grid(2)%nx/2.0),nint(fv3grid(2)%ny/2.0)) + fv3grid(2)%clon = & + & lon_work(nint(fv3grid(2)%nx/2.0),nint(fv3grid(2)%ny/2.0)) + fv3grid(2)%ak = ak + fv3grid(2)%bk = bk + if(debug) write(6,502) 'U', fv3grid(2)%clat, fv3grid(2)%clon + + ! Deallocate memory for local variables + + if(allocated(lat_work)) deallocate(lat_work) + if(allocated(lon_work)) deallocate(lon_work) + + ! Define local variables + + fv3grid(3)%nx = grid_x + fv3grid(3)%ny = grid_yt + fv3grid(3)%nz = pfull + call variable_interface_setup_struct(fv3grid(3)) + + ! Allocate memory for local variables + + if(.not. allocated(lat_work)) & + & allocate(lat_work(fv3grid(3)%nx,fv3grid(3)%ny)) + if(.not. allocated(lon_work)) & + & allocate(lon_work(fv3grid(3)%nx,fv3grid(3)%ny)) + + ! Define local variables + + lat_work(1:fv3grid(3)%nx,1:fv3grid(1)%ny) = & + & lat(1:fv3grid(3)%nx,1:fv3grid(1)%ny) + + ! Loop through local variable + + do j = 1, fv3grid(1)%ny + + ! Loop through local variable + + do i = 1, fv3grid(1)%nx + + ! Compute local variables + + lat_work(i,j) = latt(i,j) + lon_work(i,j) = lont(i,j) + 0.5*dlon(i,j) + + end do ! do i = 1, fv3grid(1)%nx + + end do ! do j = 1, fv3grid(1)%ny + + ! Define local variables + + lon_work(fv3grid(3)%nx,1:fv3grid(3)%ny) = & + & lon(fv3grid(3)%nx,1:fv3grid(3)%ny) + fv3grid(3)%lat = & + & reshape(lat_work,shape(fv3grid(3)%lat)) + fv3grid(3)%lon = & + & reshape(lon_work,shape(fv3grid(3)%lon)) + if(debug) write(6,500) 'V', minval(fv3grid(3)%lat), & + & maxval(fv3grid(3)%lat) + if(debug) write(6,501) 'V', minval(fv3grid(3)%lon), & + & maxval(fv3grid(3)%lon) + fv3grid(3)%clat = & + & lat_work(nint(fv3grid(3)%nx/2.0),nint(fv3grid(3)%ny/2.0)) + fv3grid(3)%clon = & + & lon_work(nint(fv3grid(3)%nx/2.0),nint(fv3grid(3)%ny/2.0)) + fv3grid(3)%ak = ak + fv3grid(3)%bk = bk + if(debug) write(6,502) 'V', fv3grid(3)%clat, fv3grid(3)%clon + + ! Deallocate memory for local variables + + if(allocated(dlat)) deallocate(dlat) + if(allocated(dlon)) deallocate(dlon) + if(allocated(lat_work)) deallocate(lat_work) + if(allocated(lon_work)) deallocate(lon_work) + if(allocated(lat)) deallocate(lat) + if(allocated(latt)) deallocate(latt) + if(allocated(lon)) deallocate(lon) + if(allocated(lont)) deallocate(lont) + if(allocated(ak)) deallocate(ak) + if(allocated(bk)) deallocate(bk) + + ! Define local variables + +500 format('FV3GRID_READ: ',a1,1x,'grid; min/max latitude: ',2f13.5) +501 format('FV3GRID_READ: ',a1,1x,'grid; min/max longitude: ',2f13.5) +502 format('FV3GRID_READ: ',a1,1x,'grid; center latitude/longitude: ', & + & 2f13.5) + + !===================================================================== + + end subroutine fv3grid_read + + !======================================================================= + + ! SUBROUTINE: + + ! fv3psfc_read.f90 + + ! DESCRIPTION: + + ! This subroutine computes the surface pressure (psfc) by + ! integrating the FV3 'delp' variable values along the respective + ! profile. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string containing the path to the + ! external file containing the FV3 'delp' variable values and/or + ! attributes. + + ! * fv3grid; a FORTRAN fv3grid_struct variable containing the grid + ! attribute variables and values for the grid corresponding to the + ! 'delp' variable collected from filename (see above). + + ! * remappres; a FORTRAN remappres_struct variable. + + ! OUTPUT VARIABLES: + + ! * remappres; a FORTRAN remappres_struct variable containing the + ! surface pressure attribute (psfc) computed from the vertical + ! integral of 'delp' from filename (see above). + + !----------------------------------------------------------------------- + + subroutine fv3psfc_read(filename,fv3grid,remappres) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid + type(remappres_struct) :: remappres + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=100) :: varname + real(r_kind), dimension(:,:,:), allocatable :: delp + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(delp)) & + & allocate(delp(fv3grid%nx,fv3grid%ny,fv3grid%nz)) + + ! Define local variables + + remappres%ncoords = fv3grid%ncoords + remappres%nz = fv3grid%nz + call variable_interface_setup_struct(remappres) + varname = 'delp' + call netcdf_interface_getvar(filename,varname,delp) + remappres%psfc = 0.0 + + ! Loop through local variable + + do i = 1, fv3grid%nz + + ! Define local variables + + remappres%psfc = remappres%psfc + reshape(delp(:,:,i), & + & shape(remappres%psfc)) + + end do ! do i = 1, fv3grid%nz + + ! Deallocate memory for local variables + + if(allocated(delp)) deallocate(delp) + + !===================================================================== + + end subroutine fv3psfc_read + + !======================================================================= + + ! SUBROUTINE: + + ! fv3var_read.f90 + + ! DESCRIPTION: + + ! This subroutine reads a FV3 variable from a FV3 file and populates + ! the attributes within a FORTRAN fv3var_struct variable specified + ! by the user. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string containing the path to the + ! external file containing the FV3 variable values and/or + ! attributes. + + ! * fv3var; a FORTRAN fv3var_struct variable. + + ! * json_fv3var; a FORTRAN json_fv3var_struct variable containing + ! (at minimum) the I/O attributes for the respective FV3 variable. + + ! OUTPUT VARIABLES: + + ! * fv3var; a FORTRAN fv3var_struct variable containing the user + ! specified FV3 variable values and attributes. + + !----------------------------------------------------------------------- + + subroutine fv3var_read(filename,fv3var,json_fv3var) + + ! Define variables passed to routine + + type(fv3var_struct) :: fv3var + type(json_fv3var_struct) :: json_fv3var + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=100) :: dimname + character(len=100) :: varname + real(r_kind), dimension(:,:,:), allocatable :: ncvar + integer :: xaxis_1 + integer :: xaxis_2 + integer :: yaxis_1 + integer :: yaxis_2 + integer :: zaxis_1 + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + dimname = 'xaxis_1' + call netcdf_interface_getdim(filename,dimname,xaxis_1) + dimname = 'xaxis_2' + call netcdf_interface_getdim(filename,dimname,xaxis_2) + dimname = 'yaxis_1' + call netcdf_interface_getdim(filename,dimname,yaxis_1) + dimname = 'yaxis_2' + call netcdf_interface_getdim(filename,dimname,yaxis_2) + dimname = 'zaxis_1' + call netcdf_interface_getdim(filename,dimname,zaxis_1) + + ! Check local variable and proceed accordingly + + if(json_fv3var%gridtype .eq. 1) then + + ! Check local variable and proceed accordingly + + if(is_fv3_tracers) then + + ! Define local variables + + fv3var%nx = xaxis_1 + fv3var%ny = yaxis_1 + + else ! if(is_fv3_tracers) + + ! Define local variables + + fv3var%nx = xaxis_1 + fv3var%ny = yaxis_2 + + end if ! if(is_fv3_tracers) + + end if ! if(json_fv3var%gridtype .eq. 1) + + ! Check local variable and proceed accordingly + + if(json_fv3var%gridtype .eq. 2) then + + ! Define local variables + + fv3var%nx = xaxis_1 + fv3var%ny = yaxis_1 + + end if ! if(json_fv3var%gridtype .eq. 2) + + ! Check local variable and proceed accordingly + + if(json_fv3var%gridtype .eq. 3) then + + ! Define local variables + + fv3var%nx = xaxis_2 + fv3var%ny = yaxis_2 + + end if ! if(json_fv3var%gridtype .eq. 3) + + ! Check local variable and proceed accordingly + + if(json_fv3var%levtype .eq. 1) then + + ! Define local variables + + fv3var%nz = 1 + + end if ! if(json_fv3var%levtype .eq. 1) + + ! Check local variable and proceed accordingly + + if(json_fv3var%levtype .eq. 3) then + + ! Define local variables + + fv3var%nz = zaxis_1 + + ! Check local variable and proceed accordingly + + if(json_fv3var%z_staggered) then + + ! Define local variables + + fv3var%nz = fv3var%nz + 1 + + end if ! if(json_fv3var%z_staggered) + + end if ! if(json_fv3var%levtype .eq. 3) + + ! Allocate memory for local variables + + if(.not. allocated(ncvar)) & + & allocate(ncvar(fv3var%nx,fv3var%ny,fv3var%nz)) + + ! Define local variables + + call variable_interface_setup_struct(fv3var) + varname = trim(adjustl(json_fv3var%variable_name)) + call netcdf_interface_getvar(filename,varname,ncvar) + + ! Loop through local variable + + do i = 1, fv3var%nz + + ! Define local variables + + fv3var%var(:,i) = reshape(ncvar(:,:,i),shape(fv3var%var(:,i))) + if(debug) write(6,500) trim(adjustl(varname)), i, & + & minval(fv3var%var(:,i)), maxval(fv3var%var(:,i)) + + end do ! do i = 1, fv3var%nz + + ! Deallocate memory for local variables + + if(allocated(ncvar)) deallocate(ncvar) + + ! Define local variables + +500 format('FV3VAR_READ: Variable ',a,1x,', Level ',i3.3,1x,'min/max = ', & + & 2f13.5) + + !===================================================================== + + end subroutine fv3var_read + + !======================================================================= + + ! SUBROUTINE: + + ! fv3var_write.f90 + + ! DESCRIPTION: + + ! This subroutine writes a FV3 variable to a FV3 file using the + ! attributes within a FORTRAN fv3var_struct variable specified by + ! the user. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string containing the path to the + ! external file containing the FV3 variable values and/or + ! attributes. + + ! * fv3var; a FORTRAN fv3var_struct variable. + + ! * json_fv3var; a FORTRAN json_fv3var_struct variable containing + ! (at minimum) the I/O attributes for the respective FV3 variable. + + !----------------------------------------------------------------------- + + subroutine fv3var_write(filename,fv3var,json_fv3var) + + ! Define variables passed to routine + + type(fv3var_struct) :: fv3var + type(json_fv3var_struct) :: json_fv3var + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=100) :: dimname + character(len=100) :: varname + real(r_kind), dimension(:,:,:), allocatable :: ncvar3d + real(r_kind), dimension(:,:), allocatable :: ncvar2d + + !===================================================================== + + ! Define local variables + + varname = trim(adjustl(json_fv3var%variable_name)) + if(debug) write(6,500) trim(adjustl(varname)), fv3var%nx, fv3var%ny, & + & fv3var%nz + + ! Check local variable and proceed accordingly + + if(json_fv3var%levtype .eq. 1) then + + ! Allocate memory for local variables + + if(.not. allocated(ncvar2d)) & + & allocate(ncvar2d(fv3var%nx,fv3var%ny)) + + ! Define local variables + + ncvar2d = reshape(fv3var%var(:,1),shape(ncvar2d)) + call netcdf_interface_putvar(filename,varname,ncvar2d) + + ! Deallocate memory for local variables + + if(allocated(ncvar2d)) deallocate(ncvar2d) + + end if ! if(json_fv3var%levtype .eq. 1) + + ! Check local variable and proceed accordingly + + if(json_fv3var%levtype .eq. 3) then + + ! Allocate memory for local variables + + if(.not. allocated(ncvar3d)) & + & allocate(ncvar3d(fv3var%nx,fv3var%ny,fv3var%nz)) + + ! Define local variables + + ncvar3d = reshape(fv3var%var,shape(ncvar3d)) + call netcdf_interface_putvar(filename,varname,ncvar3d) + + ! Deallocate memory for local variables + + if(allocated(ncvar3d)) deallocate(ncvar3d) + + end if ! if(json_fv3var%levtype .eq. 3) + + ! Define local variables + +500 format('FV3VAR_WRITE: Writing variable ', a,1x,'of dimension ',3i) + + !===================================================================== + + end subroutine fv3var_write + + !======================================================================= + + ! SUBROUTINE: + + ! json_fv3var_read.f90 + + ! DESCRIPTION: + + ! This subroutine defines the contents of the json_fv3var_struct + ! variable. + + ! INPUT VARIABLES: + + ! * json_fv3var; an array of FORTRAN json_fv3var_struct variables. + + ! OUTPUT VARIABLES: + + ! * json_fv3var; an array of FORTRAN json_fv3var_struct variables + ! containing the contents of the user specified JSON-formatted + ! file. + + !----------------------------------------------------------------------- + + subroutine json_fv3var_read(json_fv3var) + + ! Define variables passed to routine + + type(json_fv3var_struct), dimension(:), allocatable :: json_fv3var + + !===================================================================== + + ! Define local variables + + call json_interface_read(json_fv3var_filename,json_fv3var) + + !===================================================================== + + end subroutine json_fv3var_read + + !======================================================================= + + ! SUBROUTINE: + + ! json_pattern_read.f90 + + ! DESCRIPTION: + + ! This subroutine reads the contents of a user specified JSON + ! formatted file and fills the json variable array. + + ! INPUT VARIABLES: + + ! * json_pattern; a FORTRAN json_pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * json_pattern; a FORTRAN json_pattern_struct variable array + ! containing the respective variable record attributes. + + !----------------------------------------------------------------------- + + subroutine json_pattern_read(json_pattern) + + ! Define variables passed to routine + + type(json_pattern_struct), dimension(:), allocatable :: json_pattern + + !===================================================================== + + ! Define local variables + + call json_interface_read(ensgen_json_vtable,json_pattern) + + !===================================================================== + + end subroutine json_pattern_read + + !======================================================================= + + ! SUBROUTINE: + + ! nemsdate_read.f90 + + ! DESCRIPTION: + + ! This subroutine reads a NCEP NEMS-formatted file to collect the + ! idate variable array, defines a time-stamp value, and returns the + ! corresponding Julian date within the 'jdate' attribute. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! NCEP NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the Julian + ! date corresponding to the idate variable array values. + + !----------------------------------------------------------------------- + + subroutine nemsdate_read(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + ! Define variables computed within routine + + type(timeinfo_struct) :: timeinfo + + !===================================================================== + + ! Define local variables + + call nemsio_interface_date_read(filename,nemsio) + write(timeinfo%timestamp,500) nemsio%idate(1), nemsio%idate(2), & + & nemsio%idate(3), nemsio%idate(4), nemsio%idate(5), & + & nemsio%idate(6) + + ! Compute local variables + + call time_methods_interface_julian(timeinfo%timestamp,timeinfo%jday) + + ! Define local variables + + nemsio%jday = timeinfo%jday +500 format(i4.4,'-',i2.2,'-',i2.2,'_',i2.2,':',i2.2,':',i2.2) + + !===================================================================== + + end subroutine nemsdate_read + + !======================================================================= + + ! SUBROUTINE: + + ! nemsdate_write.f90 + + ! DESCRIPTION: + + ! This subroutine writes the idate variable array to NCEP + ! NEMS-formatted; the idate variable array contents are derived from + ! the timeinfo_struct variable 'timestamp' attribute. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! NCEP NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + !----------------------------------------------------------------------- + + subroutine nemsdate_write(filename,timeinfo,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + type(timeinfo_struct) :: timeinfo + character(len=500) :: filename + + !===================================================================== + + ! Compute local variables + + call time_methods_interface_attrs(timeinfo) + + ! Define local variables + + nemsio%idate(1) = timeinfo%yy + nemsio%idate(2) = timeinfo%mm + nemsio%idate(3) = timeinfo%dd + nemsio%idate(4) = timeinfo%hh + nemsio%idate(5) = timeinfo%nn + nemsio%idate(6) = timeinfo%ss + call nemsio_interface_date_write(filename,nemsio) + + !===================================================================== + + end subroutine nemsdate_write + + !======================================================================= + + ! SUBROUTINE: + + ! nemsvar_read.f90 + + ! DESCRIPTION: + + ! This subroutine parses a NCEP NEMS formatted file and returns a + ! FORTRAN structure (nems) containing the gridded variable. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! NCEP NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the gridded + ! NEMS variable. + + !----------------------------------------------------------------------- + + subroutine nemsvar_read(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call nemsio_interface_init(filename,nemsio) + call nemsio_interface_read(filename,nemsio) + + !===================================================================== + + end subroutine nemsvar_read + + !======================================================================= + + ! SUBROUTINE: + + ! nemsvar_write.f90 + + ! DESCRIPTION: + + ! This subroutine writes a gridded variable to a NCEP NEMS formatted + ! file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! NCEP NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + !----------------------------------------------------------------------- + + subroutine nemsvar_write(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call nemsio_interface_write(filename,nemsio) + + !===================================================================== + + end subroutine nemsvar_write + + !======================================================================= + + ! SUBROUTINE: + + ! pattern_read.f90 + + ! DESCRIPTION: + + ! This subroutine reads an external file containing the random + ! pattern attributes applied for the generation of ensemble member + ! analyses. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the random + ! number pattern within the rnp attribute. + + !----------------------------------------------------------------------- + + subroutine pattern_read(filename,pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=100) :: dimname + character(len=100) :: varname + + !===================================================================== + + ! Define local variables + + dimname = 'nx' + call netcdf_interface_getdim(filename,dimname,pattern%nx) + dimname = 'ny' + call netcdf_interface_getdim(filename,dimname,pattern%ny) + call variable_interface_setup_struct(pattern) + varname = 'lat' + call netcdf_interface_getvar(filename,varname,pattern%lat) + varname = 'lon' + call netcdf_interface_getvar(filename,varname,pattern%lon) + varname = 'rnp' + call netcdf_interface_getvar(filename,varname,pattern%rnp) + + !===================================================================== + + end subroutine pattern_read + + !======================================================================= + + ! SUBROUTINE: + + ! pattern_write.f90 + + ! DESCRIPTION: + + ! This subroutine writes an external file containing the random + ! pattern attributes applied for the generation of ensemble member + ! analyses. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * pattern; a FORTRAN pattern_struct variable containing the random + ! pattern attributes. + + !----------------------------------------------------------------------- + + subroutine pattern_write(filename,pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + character(len=500) :: filename + + ! Define variables computed within routine + + type(varinfo_struct) :: varinfo + character(len=100) :: attrname + character(len=100) :: varname + real(r_kind), dimension(:,:,:,:), allocatable :: work + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.false.,.true.) + call fileio_interface_varinfo(pattern,varinfo) + attrname = 'adv_dtime' + call netcdf_interface_putattr(attrname,pattern%dt) + attrname = 'corr_length' + call netcdf_interface_putattr(attrname,pattern%lengthscale) + attrname = 'corr_stdev' + call netcdf_interface_putattr(attrname,pattern%stdev) + attrname = 'corr_tau' + call netcdf_interface_putattr(attrname,pattern%tau) + attrname = 'rng_seed' + call netcdf_interface_putattr(attrname,pattern%seed) + call netcdf_interface_writedef(varinfo) + + ! Allocate memory for local variables + + if(.not. allocated(work)) allocate(work(1,pattern%nx,pattern%ny,1)) + + ! Define local variables + + work(1,:,:,1) = reshape(pattern%lat,shape(work(1,:,:,1))) + varname = varinfo%varname(1) + call netcdf_interface_putvar(filename,varname,work(1,:,:,1)) + work(1,:,:,1) = reshape(pattern%lon,shape(work(1,:,:,1))) + varname = varinfo%varname(2) + call netcdf_interface_putvar(filename,varname,work(1,:,:,1)) + work(1,:,:,1) = reshape(pattern%rnp,shape(work(1,:,:,1))) + varname = varinfo%varname(3) + call netcdf_interface_putvar(filename,varname,work(1,:,:,1)) + + ! Deallocate memory for local variables + + if(allocated(work)) deallocate(work) + call variable_interface_cleanup_struct(varinfo) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine pattern_write + + !======================================================================= + + ! SUBROUTINE: + + ! varinfo_pattern.f90 + + ! DESCRIPTION: + + ! This subroutine writes the netcdf directives (e.g., varinfo) for + ! the user specified netcdf formatted file to be written. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! * varinfo; a FORTRAN varinfo_struct variable. + + ! OUTPUT VARIABLES: + + ! * varinfo; a FORTRAN varinfo_struct variable specifying the + ! appropriate fields for external file formats. + + !----------------------------------------------------------------------- + + subroutine varinfo_pattern(pattern,varinfo) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + type(varinfo_struct) :: varinfo + + ! Define variables computed within routine + + character(len=10), dimension(:), allocatable :: dimname + integer, dimension(:), allocatable :: dimval + integer, dimension(:), allocatable :: dimid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + varinfo%ndims = 2 + varinfo%nvars = 3 + varinfo%nattrs = 2 + call variable_interface_setup_struct(varinfo) + + ! Allocate memory for local variables + + if(.not. allocated(dimname)) allocate(dimname(varinfo%ndims)) + if(.not. allocated(dimval)) allocate(dimval(varinfo%ndims)) + if(.not. allocated(dimid)) allocate(dimid(varinfo%ndims)) + + ! Define local variables + + dimname(1) = 'nx' + dimname(2) = 'ny' + dimval(1) = pattern%nx + dimval(2) = pattern%ny + + ! Loop through local variable + + do i = 1, varinfo%ndims + + ! Define local variables + + varinfo%dimval(i) = dimval(i) + varinfo%dimname(i) = dimname(i) + dimid(i) = i + + end do ! do i = 1, varinfo%ndims + + varinfo%varattrs(1,1,1) = 'title' + varinfo%varattrs(1,1,2) = 'latitude' + varinfo%varattrs(1,2,1) = 'units' + varinfo%varattrs(1,2,2) = 'degrees' + varinfo%varname(1) = 'lat' + varinfo%varndims(1) = 2 + varinfo%varnattrs(1) = 2 + varinfo%vartype(1) = 'float' + varinfo%vardimid(1,1) = dimid(1) + varinfo%vardimid(1,2) = dimid(2) + varinfo%varattrs(2,1,1) = 'title' + varinfo%varattrs(2,1,2) = 'longitude' + varinfo%varattrs(2,2,1) = 'units' + varinfo%varattrs(2,2,2) = 'degrees' + varinfo%varname(2) = 'lon' + varinfo%varndims(2) = 2 + varinfo%varnattrs(2) = 2 + varinfo%vartype(2) = 'float' + varinfo%vardimid(2,1) = dimid(1) + varinfo%vardimid(2,2) = dimid(2) + varinfo%varattrs(3,1,1) = 'title' + varinfo%varattrs(3,1,2) = 'random number pattern' + varinfo%varname(3) = 'rnp' + varinfo%varndims(3) = 2 + varinfo%varnattrs(3) = 1 + varinfo%vartype(3) = 'float' + varinfo%vardimid(3,1) = dimid(1) + varinfo%vardimid(3,2) = dimid(2) + + ! Deallocate memory for local variables + + if(allocated(dimname)) deallocate(dimname) + if(allocated(dimval)) deallocate(dimval) + if(allocated(dimid)) deallocate(dimid) + + !===================================================================== + + end subroutine varinfo_pattern + + !======================================================================= + + ! SUBROUTINE: + + ! tcv_read.f90 + + ! DESCRIPTION: + + ! This subroutine ingests an external file containing tropical + ! cyclone attributes (e.g., TC-vitals). + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! TCV file. + + ! * tcv; a FORTRAN tcv_struct variable. + + ! OUTPUT VARIABLES: + + ! * tcv; a FORTRAN tcv_struct variable now containing the tropical + ! cyclone attributes retrieved from the user specified file. + + !----------------------------------------------------------------------- + + subroutine tcv_read(filename,tcv) + + ! Define variables passed to routine + + type(tcv_struct), dimension(:), allocatable :: tcv + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=1) :: dummy + real(r_kind) :: lat_scale + real(r_kind) :: lon_scale + integer :: ntcs + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + ntcs = 0 + open(99,file=trim(adjustl(filename)),form='formatted') +1000 read(99,*,end=1001) dummy + ntcs = ntcs + 1 + goto 1000 +1001 continue + close(99) + + ! Allocate memory for local variables + + if(.not. allocated(tcv)) allocate(tcv(ntcs)) + + ! Define local variables + + open(99,file=trim(adjustl(filename)),form='formatted') + + ! Loop through local variable + + do i = 1, ntcs + + ! Define local variables + + read(99,500) tcv(i)%center, tcv(i)%id, tcv(i)%name, tcv(i)%century, & + & tcv(i)%yymmdd, tcv(i)%hhmm, tcv(i)%lati, tcv(i)%latns, & + & tcv(i)%loni, tcv(i)%lonew, tcv(i)%stdir, tcv(i)%stspd, & + & tcv(i)%pcen, tcv(i)%penv, tcv(i)%penvrad, tcv(i)%vmax, & + & tcv(i)%vmaxrad, tcv(i)%r15ne, tcv(i)%r15se, tcv(i)%r15sw, & + & tcv(i)%r15nw, tcv(i)%depth + lat_scale = 1.0/10.0 + lon_scale = 1.0/10.0 + + ! Check local variable and proceed accordingly + + if(tcv(i)%latns .eq. 'S') lat_scale = -1.0*lat_scale + if(tcv(i)%lonew .eq. 'W') lon_scale = -1.0*lon_scale + + ! Compute local variables + + tcv(i)%lat = real(tcv(i)%lati)*lat_scale + tcv(i)%lon = real(tcv(i)%loni)*lon_scale + + ! Define local variables + + tcv(i)%lon = tcv(i)%lon + 360.0 + + end do ! do i = 1, ntcs + + ! Define local variables + + close(99) +500 format(a4,1x,a3,1x,a9,1x,i2,i6,1x,i4,1x,i3,a1,1x,i4,a1,1x,i3,1x,i3, & + & 3(1x,i4),1x,i2,1x,i3,1x,4(i4,1x),a1) + + !===================================================================== + + end subroutine tcv_read + + !======================================================================= + +end module fileio_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/fv3_analysis_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/fv3_analysis_interface.F90 new file mode 100644 index 000000000..3125634ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/fv3_analysis_interface.F90 @@ -0,0 +1,254 @@ +module fv3_analysis_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: fv3_analysis_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associate modules and subroutines + + use fileio_interface + use kinds_interface + use namelist_interface + use update_state_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: fv3_analysis + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_analysis.f90 + + ! DESCRIPTION: + + ! This subroutine is the driver-level routine for all fv3_analysis + ! routines. + + !----------------------------------------------------------------------- + + subroutine fv3_analysis() + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_bcupdate) call nest_bcupdate() + if(is_merge) call nest_parent_merge() + + !===================================================================== + + end subroutine fv3_analysis + + !======================================================================= + + ! SUBROUTINE: + + ! nest_bcupdate.f90 + + ! DESCRIPTION: + + ! This subroutine relaxes the data-assimilation derived prognostic + ! variable increment values to zero as specified by the user + ! relaxation mask criteria. + + !----------------------------------------------------------------------- + + subroutine nest_bcupdate() + + ! Define variables computed within routine + + type(json_fv3var_struct), dimension(:), allocatable :: json_fv3var + type(fv3grid_struct) :: fv3grid(3) + type(fv3var_struct) :: fv3var_anl + type(fv3var_struct) :: fv3var_bkgrd + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(json_fv3var) + call fileio_interface_read(fv3_gridspec_filename, & + & fv3_atmos_static_nest_filename,fv3grid) + + ! Compute local variables + + call update_state_init(fv3grid) + + ! Loop through local variable + + do i = 1, size(json_fv3var) + + ! Define local variables + + call fileio_interface_read(fv3_analysis_filename,fv3var_anl, & + & json_fv3var(i)) + call fileio_interface_read(fv3_background_filename,fv3var_bkgrd, & + & json_fv3var(i)) + + ! Compute local variables + + call update_state_nest_lbcs(fv3var_anl,fv3var_bkgrd, & + & fv3grid(json_fv3var(i)%gridtype),json_fv3var(i)) + + ! Define local variables + + call fileio_interface_write(fv3_analysis_filename,fv3var_anl, & + & json_fv3var(i)) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3var_anl) + call variable_interface_cleanup_struct(fv3var_bkgrd) + + end do ! do i = 1, size(json_fv3var) + + ! Deallocate memory for local variables + + if(allocated(json_fv3var)) deallocate(json_fv3var) + + ! Loop through local variable + + do i = 1, size(fv3grid) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3grid(i)) + + end do ! do i = 1, size(fv3grid) + + !===================================================================== + + end subroutine nest_bcupdate + + !======================================================================= + + ! SUBROUTINE: + + ! nest_parent_merge.f90 + + ! DESCRIPTION: + + ! This subroutine merges a FV3 nested-domain into the respective + ! parent tile within which the nested-domain is embedded. + + !----------------------------------------------------------------------- + + subroutine nest_parent_merge() + + ! Define variables computed within routine + + type(json_fv3var_struct), dimension(:), allocatable :: json_fv3var + type(fv3grid_struct) :: fv3grid_nest(3) + type(fv3grid_struct) :: fv3grid_parent(3) + type(interp_struct) :: interp(3) + type(fv3var_struct) :: fv3var_nest + type(fv3var_struct) :: fv3var_parent + type(remappres_struct) :: remappres + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(json_fv3var) + call fileio_interface_read(fv3_atmos_static_nest_filename, & + & fv3_gridspec_nest_filename,fv3grid_nest) + call fileio_interface_read(fv3_atmos_static_parent_filename, & + & fv3_gridspec_parent_filename,fv3grid_parent) + + ! Compute local variables + + call update_state_init(fv3grid_nest,fv3grid_parent,interp) + + ! Loop through local variable + + do i = 1, size(json_fv3var) + + ! Define local variables + + call fileio_interface_read(fv3_var_nest_filename,fv3var_nest, & + & json_fv3var(i)) + fv3var_nest%pres = fv3grid_nest(json_fv3var(i)%gridtype)%pres + call fileio_interface_read(fv3_var_parent_filename,fv3var_parent, & + & json_fv3var(i)) + fv3var_parent%pres = fv3grid_parent(json_fv3var(i)%gridtype)%pres + + ! Compute local variables + + call update_state_nest_parent_merge(fv3var_nest,fv3var_parent, & + & fv3grid_nest(json_fv3var(i)%gridtype), & + & fv3grid_parent(json_fv3var(i)%gridtype),json_fv3var(i), & + & interp(json_fv3var(i)%gridtype)) + + ! Define local variables + + call fileio_interface_write(fv3_var_parent_filename,fv3var_parent, & + & json_fv3var(i)) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3var_nest) + call variable_interface_cleanup_struct(fv3var_parent) + + end do ! do i = 1, size(json_fv3var) + + ! Deallocate memory for local variables + + if(allocated(json_fv3var)) deallocate(json_fv3var) + + ! Loop through local variable + + do i = 1, size(fv3grid_nest) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3grid_nest(i)) + call variable_interface_cleanup_struct(fv3grid_parent(i)) + call variable_interface_cleanup_struct(interp(i)) + + end do ! do i = 1, size(fv3grid_nest) + + !===================================================================== + + end subroutine nest_parent_merge + + !======================================================================= + +end module fv3_analysis_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/grid_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/grid_methods_interface.F90 new file mode 100644 index 000000000..c669fb173 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/grid_methods_interface.F90 @@ -0,0 +1,112 @@ +module grid_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: grid_methods_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kinds_interface + use math_methods_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: grid_methods_radialdist + interface grid_methods_radialdist + module procedure fv3grid_radialdist + end interface grid_methods_radialdist + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! fv3grid_radialdist.f90 + + ! DESCRIPTION: + + ! This subroutine computes the radial distance (meters) relative to + ! a reference location using the Euclidean L2 norm metric. + + ! INPUT VARIABLES: + + ! * fv3grid; a FORTRAN fv3grid_struct variable. + + ! OUTPUT VARIABLES: + + ! * fv3grid; a FORTRAN fv3grid_struct variable containing the + ! computed Euclidean L2 norm (radial distance) relative to the + ! specified reference location. + + !----------------------------------------------------------------------- + + subroutine fv3grid_radialdist(fv3grid) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid + + ! Define variables computed within routine + + type(kdtree_struct) :: kdtree + + !===================================================================== + + ! Define local variables + + kdtree%dst_ncoords = 1 + kdtree%nn = fv3grid%ncoords + kdtree%src_ncoords = fv3grid%ncoords + call variable_interface_setup_struct(kdtree) + kdtree%dst_lat = fv3grid%clat + kdtree%dst_lon = fv3grid%clon + kdtree%src_lat = fv3grid%lat + kdtree%src_lon = fv3grid%lon + + ! Compute local variables + + call math_methods_euclidean_norm(kdtree) + + ! Define local variables + + fv3grid%radius = sqrt(kdtree%r2dist(:,1)) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(kdtree) + + !===================================================================== + + end subroutine fv3grid_radialdist + + !======================================================================= + +end module grid_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/interpolation_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/interpolation_interface.F90 new file mode 100644 index 000000000..d38d95b2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/interpolation_interface.F90 @@ -0,0 +1,916 @@ +module interpolation_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: interpolation_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associate modules and subroutines + + use constants_interface + use kinds_interface + use math_methods_interface + use namelist_interface + use slint + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: interpolation_interface_init + public :: interpolation_interface_interp + interface interpolation_interface_init + module procedure fv3_nest_parent_init + module procedure general_init + end interface interpolation_interface_init + interface interpolation_interface_interp + module procedure fv3_nest_parent_interp + module procedure general_interp + end interface interpolation_interface_interp + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! bilinear.f90 + + ! DESCRIPTION: + + ! This subroutine interpolates a variable to a destination grid + ! using bi-linear interpolation via the user-specified algorithm. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values to be interpolated to the destination grid. + + ! * dst_grid; a FORTRAN grid_struct variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the + ! user-specified method/algorithm. + + ! OUTPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values interpolated to the destination grid + ! mapping. + + !----------------------------------------------------------------------- + + subroutine bilinear(src_grid,dst_grid,interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + + ! Define variables computed within routine + + real(r_double) :: c(3) + real(r_double) :: v(3) + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_slint) then + + ! Loop through local variable + + do j = 1, dst_grid%nz + + ! Loop through local variable + + do i = 1, dst_grid%ncoords + + ! Define local variables + + c = interp%slint_coeffs(:,i) + v(1) = dble(src_grid%var(interp%slint_nn(1,i),j)) + v(2) = dble(src_grid%var(interp%slint_nn(2,i),j)) + v(3) = dble(src_grid%var(interp%slint_nn(3,i),j)) + + ! Compute local variables + + dst_grid%var(i,j) = real(c(1)*v(1) + c(2)*v(2) + c(3)*v(3)) + + end do ! do i = 1, dst_grid%ncoords + + end do ! do j = 1, dst_grid%nz + + end if + + !===================================================================== + + end subroutine bilinear + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_nest_parent_init.f90 + + ! DESCRIPTION: + + ! This subroutine initializes the FORTRAN remapping variable objects + ! in accordance with the interpolation method/algorithm specified by + ! the user. + + ! INPUT VARIABLES: + + ! * fv3grid_nest; a FORTRAN fv3grid_struct variable containing the + ! FV3 nested tile grid attributes. + + ! * fv3grid_parent; a FORTRAN fv3grid_struct variable containing the + ! FV3 parent tile grid attributes. + + ! * interp; a FORTRAN interp_struct variable. + + ! OUTPUT VARIABLES: + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes defined in accordance with + ! the interpolation method/algorithm specified by the user. + + !----------------------------------------------------------------------- + + subroutine fv3_nest_parent_init(fv3grid_nest,fv3grid_parent,interp) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid_nest + type(fv3grid_struct) :: fv3grid_parent + type(interp_struct) :: interp + + ! Define variables computed within routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + + !===================================================================== + + ! Define local variables + + dst_grid%ncoords = fv3grid_parent%ncoords + dst_grid%nz = 1 + call variable_interface_setup_struct(dst_grid) + src_grid%ncoords = fv3grid_nest%ncoords + src_grid%nz = 1 + call variable_interface_setup_struct(src_grid) + dst_grid%lat = fv3grid_parent%lat + dst_grid%lon = fv3grid_parent%lon + src_grid%lat = fv3grid_nest%lat + src_grid%lon = fv3grid_nest%lon + + ! Compute local variables + + if(is_slint) call init_slint(src_grid,dst_grid,interp) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(src_grid) + + !===================================================================== + + end subroutine fv3_nest_parent_init + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_nest_parent_interp.f90 + + ! DESCRIPTION: + + ! This subroutine + + ! INPUT VARIABLES: + + ! * fv3grid_nest; a FORTRAN fv3grid_struct variable containing the + ! FV3 nested tile grid attributes. + + ! * fv3grid_parent; a FORTRAN fv3grid_struct variable containing the + ! FV3 parent tile grid attributes. + + ! * json_fv3var; a FORTRAN json_fv3var_struct variable containing + ! the respective FV3 attributes, specifically those pertaining to + ! variable and remapping types. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes defined in accordance with + ! the interpolation method/algorithm specified by the user. + + ! * remapvar; a FORTRAN remapvar_struct variable. + + ! OUTPUT VARIABLES: + + ! * remapvar; a FORTRAN remapvar_struct variable containing the + ! source grid variable remapped to the destination grid mapping. + + !----------------------------------------------------------------------- + + subroutine fv3_nest_parent_interp(fv3var_nest,fv3var_parent, & + & json_fv3var,interp,remapvar) + + ! Define variables passed to routine + + type(fv3var_struct) :: fv3var_nest + type(fv3var_struct) :: fv3var_parent + type(json_fv3var_struct) :: json_fv3var + type(interp_struct) :: interp + type(remapvar_struct) :: remapvar + + ! Define variables computed within routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(json_interp_struct) :: json_interp + + !===================================================================== + + ! Define local variables + + remapvar%ncoords = fv3var_parent%ncoords + remapvar%nz = fv3var_parent%nz + call variable_interface_setup_struct(remapvar) + remapvar%fixed_var = fv3var_parent%var + dst_grid%ncoords = fv3var_parent%ncoords + dst_grid%nz = fv3var_parent%nz + call variable_interface_setup_struct(dst_grid) + dst_grid%pres = fv3var_parent%pres + dst_grid%var = fv3var_parent%var + src_grid%ncoords = fv3var_parent%ncoords + src_grid%nz = fv3var_parent%nz + call variable_interface_setup_struct(src_grid) + src_grid%pres = fv3var_nest%pres + src_grid%var = fv3var_nest%var + json_interp%interp_bilinear = json_fv3var%interp_bilinear + json_interp%interp_nrstnghbr = json_fv3var%interp_nrstnghbr + + ! Compute local variables + + if(is_slint) call interp_slint(src_grid,dst_grid,interp,json_interp) + + ! Define local variables + + remapvar%remap_var = dst_grid%var + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(src_grid) + + !===================================================================== + + end subroutine fv3_nest_parent_interp + + !======================================================================= + + ! SUBROUTINE: + + ! general_init.f90 + + ! DESCRIPTION: + + ! This subroutine initializes the FORTRAN interp_struct variable + ! remapping attributes in accordance with the user specified source + ! and destination FORTRAN grid_struct (src_grid and dst_grid, + ! respectively) variables. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid geographical locations; units are degrees. + + ! * dst_grid; a FORTRAN grid_struct variable containing the + ! destination grid geographical locations; units are degrees. + + ! * interp; a FORTRAN interp_struct variable. + + ! OUTPUT VARIABLES: + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the user + ! specified interpolation method/algorithm. + + !----------------------------------------------------------------------- + + subroutine general_init(src_grid,dst_grid,interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + + !===================================================================== + + ! Compute local variables + + if(is_slint) call init_slint(src_grid,dst_grid,interp) + + !===================================================================== + + end subroutine general_init + + !======================================================================= + + ! SUBROUTINE: + + ! general_interp.f90 + + ! DESCRIPTION: + + ! This is the driver-level subroutine to interpolate a source grid + ! set of values to a destination grid mapping using the user + ! specified interpolation algorithms. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values to be interpolated to the destination grid. + + ! * dst_grid; a FORTRAN grid_struct variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the user + ! specified method/algorithm. + + ! * interp_type; a FORTRAN integer specifying the interpolation + ! methodology; 1 = nearest-neighbor interpolation; 2 = bi-linear + ! interpolation. + + ! OUTPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values interpolated to the destination grid + ! mapping. + + !----------------------------------------------------------------------- + + subroutine general_interp(src_grid,dst_grid,interp,interp_type) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + integer :: interp_type + + !===================================================================== + + ! Compute local variables + + if(interp_type .eq. 1) call nrstnghbr(src_grid,dst_grid,interp) + if(interp_type .eq. 2) call bilinear(src_grid,dst_grid,interp) + + !===================================================================== + + end subroutine general_interp + + !======================================================================= + + ! SUBROUTINE: + + ! init_slint.f90 + + ! DESCRIPTION: + + ! This subroutine computes the remapping attributes assuming the + ! SLINT interpolation method/algorithm. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid geographical locations; units are degrees. + + ! * dst_grid; a FORTRAN grid_struct variable containing the + ! destination grid geographical locations; units are degrees. + + ! * interp; a FORTRAN interp_struct variable. + + ! OUTPUT VARIABLES: + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the SLINT + ! method/algorithm. + + !----------------------------------------------------------------------- + + subroutine init_slint(src_grid,dst_grid,interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + + ! Define variables computed within routine + + type(grid) :: grid + real(r_kind), dimension(:,:), allocatable :: grid1 + real(r_kind), dimension(:,:), allocatable :: grid2 + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid1)) & + & allocate(grid1(src_grid%ncoords,2)) + if(.not. allocated(grid2)) & + & allocate(grid2(dst_grid%ncoords,2)) + + ! Define local variables + + grid1(:,1) = src_grid%lat*deg2rad + grid1(:,2) = src_grid%lon*deg2rad + grid2(:,1) = dst_grid%lat*deg2rad + grid2(:,2) = dst_grid%lon*deg2rad + + ! Compute local variables + + call slint_init_compute(grid1,src_grid%ncoords,grid2, & + & dst_grid%ncoords,grid) + + ! Define local variables + + interp%ncoords = src_grid%ncoords + call variable_interface_setup_struct(interp) + interp%slint_coeffs = grid%coeffs + interp%slint_nn = grid%nn + if(debug) write(6,500) minval(interp%slint_coeffs), & + & maxval(interp%slint_coeffs) + + ! Deallocate memory for local variables + + if(allocated(grid2)) deallocate(grid2) + if(allocated(grid1)) deallocate(grid1) + + ! Define local variables + +500 format('INIT_SLINT: SLINT coeffs min/max = ',2f13.5) + + !===================================================================== + + end subroutine init_slint + + !======================================================================= + + ! SUBROUTINE: + + ! interp_slint.f90 + + ! DESCRIPTION: + + ! This is the driver-level subroutine to interpolate a source grid + ! set of values to a destination grid mapping using the SLINT + ! interpolation algorithms. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values to be interpolated to the destination grid. + + ! * dst_grid; a FORTRAN grid_struct variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the SLINT + ! method/algorithm. + + ! * json_interp; a FORTRAN json_interp_struct variable containing + ! the interpolation instructions for the respective source grid + ! variable. + + ! OUTPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values interpolated to the destination grid + ! mapping. + + !----------------------------------------------------------------------- + + subroutine interp_slint(src_grid,dst_grid,interp,json_interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + type(json_interp_struct) :: json_interp + + !===================================================================== + + ! Compute local variables + + if(json_interp%interp_bilinear) call slint_bilinear(src_grid, & + & dst_grid,interp) + if(json_interp%interp_nrstnghbr) call slint_nrstnghbr(src_grid, & + & dst_grid,interp) + + !===================================================================== + + end subroutine interp_slint + + !======================================================================= + + ! SUBROUTINE: + + ! interp_spline.f90 + + ! DESCRIPTION: + + ! + + ! INPUT VARIABLES: + + ! + + ! OUTPUT VARIABLES: + + ! + + !----------------------------------------------------------------------- + + subroutine interp_spline(spline) + + ! Define variables passed to routine + + type(spline_struct) :: spline + + !===================================================================== + + ! Compute local variables + + call math_methods_spline(spline) + + !===================================================================== + + end subroutine interp_spline + + !======================================================================= + + ! SUBROUTINE: + + ! nrstnghbr.f90 + + ! DESCRIPTION: + + ! This subroutine interpolates a variable to a destination grid + ! using nearest-neighbor interpolation via the user-specified + ! algorithm. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values to be interpolated to the destination grid. + + ! * dst_grid; a FORTRAN grid_struct variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the + ! user-specified method/algorithm. + + ! OUTPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values interpolated to the destination grid + ! mapping. + + !----------------------------------------------------------------------- + + subroutine nrstnghbr(src_grid,dst_grid,interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + + ! Define variables computed within routine + + real(r_double) :: v(1) + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_slint) then + + ! Loop through local variable + + do j = 1, dst_grid%nz + + ! Loop through local variable + + do i = 1, dst_grid%ncoords + + ! Define local variables + + v(1) = dble(src_grid%var(interp%slint_nn(1,i),j)) + + ! Compute local variables + + dst_grid%var(i,j) = real(v(1)) + + end do ! do i = 1, dst_grid%ncoords + + end do ! do j = 1, dst_grid%nz + + end if + + !===================================================================== + + end subroutine nrstnghbr + + !======================================================================= + + ! SUBROUTINE: + + ! slint_bilinear.f90 + + ! DESCRIPTION: + + ! This subroutine interpolates a variable to a destination grid + ! using bi-linear interpolation via the SLINT algorithm. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values to be interpolated to the destination grid. + + ! * dst_grid; a FORTRAN grid_struct variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the SLINT + ! method/algorithm. + + ! OUTPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values interpolated to the destination grid + ! mapping. + + !----------------------------------------------------------------------- + + subroutine slint_bilinear(src_grid,dst_grid,interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + + ! Define variables computed within routine + + type(spline_struct) :: spline + real(r_double) :: c(3) + real(r_double) :: v(3) + + ! Define counting variables + + integer :: i, j, k + + !===================================================================== + + ! Loop through local variable + + do j = 1, dst_grid%nz + + ! Loop through local variable + + do i = 1, dst_grid%ncoords + + ! Check local variable and proceed accordingly + + if((interp%slint_nn(1,i) .ne. interp%slint_nn(2,i)) .and. & + & (interp%slint_nn(1,i) .ne. interp%slint_nn(3,i)) .and. & + & (interp%slint_nn(2,i) .ne. interp%slint_nn(3,i))) then + + ! Define local variables + + c = interp%slint_coeffs(:,i) + + ! Check local variable and proceed accordingly + + if(is_remap_pres .and. (dst_grid%nz .gt. 1)) then + + ! Loop through local variable + + do k = 1, size(v) + + ! Define local variables + + spline%n = dst_grid%nz + call variable_interface_setup_struct(spline) + spline%xa = src_grid%pres(interp%slint_nn(k,i),:) + spline%ya = src_grid%var(interp%slint_nn(k,i),:) + spline%x = dst_grid%pres(i,j) + + ! Check local variable and proceed accordingly + + if(is_interp_llp) then + + ! Define local variables + + spline%xa = log(spline%xa) + spline%x = log(spline%x) + + end if ! if(is_interp_llp) + + ! Compute local variables + + call interp_spline(spline) + + ! Check local variable and proceed accordingly + + if(spline%y .eq. spval) then + + ! Define local variables + + v(k) = dble(src_grid%var(interp%slint_nn(k,i),j)) + + else ! if(spline%y .eq. spval) + + ! Define local variables + + v(k) = dble(spline%y) + + end if ! if(spline%y .eq. spval) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(spline) + + end do ! do k = 1, size(v) + + else ! if(is_remap_pres .and. (dst_grid%nz .gt. 1)) + + ! Define local variables + + v(1) = dble(src_grid%var(interp%slint_nn(1,i),j)) + v(2) = dble(src_grid%var(interp%slint_nn(2,i),j)) + v(3) = dble(src_grid%var(interp%slint_nn(3,i),j)) + + end if ! if(is_remap_pres .and. (dst_grid%nz .gt. 1)) + + ! Compute local variables + + dst_grid%var(i,j) = real(c(1)*v(1) + c(2)*v(2) + c(3)*v(3)) + + else ! if((interp%slint_nn(1,i) .ne. interp%slint_nn(2,i)) + ! .and. (interp%slint_nn(1,i) + ! .ne. interp%slint_nn(3,i)) + ! .and. (interp%slint_nn(2,i) + ! .ne. interp%slint_nn(3,i))) + + ! Define local variables + + dst_grid%var(i,j) = spval + + end if ! if((interp%slint_nn(1,i) .ne. interp%slint_nn(2,i)) + ! .and. (interp%slint_nn(1,i) + ! .ne. interp%slint_nn(3,i)) + ! .and. (interp%slint_nn(2,i) + ! .ne. interp%slint_nn(3,i))) + + end do ! do i = 1, dst_grid%ncoords + + end do ! do j = 1, dst_grid%nz + + !===================================================================== + + end subroutine slint_bilinear + + !======================================================================= + + ! SUBROUTINE: + + ! slint_nrstnghbr.f90 + + ! DESCRIPTION: + + ! This subroutine interpolates a variable to a destination grid + ! using nearest-neighbor interpolation via the SLINT algorithm. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values to be interpolated to the destination grid. + + ! * dst_grid; a FORTRAN grid_struct variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping/interpolation attributes as defined by the SLINT + ! method/algorithm. + + ! OUTPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the source + ! grid variable values interpolated to the destination grid + ! mapping. + + !----------------------------------------------------------------------- + + subroutine slint_nrstnghbr(src_grid,dst_grid,interp) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + + ! Define variables computed within routine + + real(r_double) :: v(1) + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Loop through local variable + + do j = 1, dst_grid%nz + + ! Loop through local variable + + do i = 1, dst_grid%ncoords + + ! Check local variable and proceed accordingly + + if((interp%slint_nn(1,i) .ne. interp%slint_nn(2,i)) .and. & + & (interp%slint_nn(1,i) .ne. interp%slint_nn(3,i)) .and. & + & (interp%slint_nn(2,i) .ne. interp%slint_nn(3,i))) then + + ! Define local variables + + v(1) = dble(src_grid%var(interp%slint_nn(1,i),j)) + + ! Compute local variables + + dst_grid%var(i,j) = real(v(1)) + + else ! if((interp%slint_nn(1,i) .ne. interp%slint_nn(2,i)) + ! .and. (interp%slint_nn(1,i) + ! .ne. interp%slint_nn(3,i)) + ! .and. (interp%slint_nn(2,i) + ! .ne. interp%slint_nn(3,i))) + + ! Define local variables + + dst_grid%var(i,j) = spval + + end if ! if((interp%slint_nn(1,i) .ne. interp%slint_nn(2,i)) + ! .and. (interp%slint_nn(1,i) + ! .ne. interp%slint_nn(3,i)) + ! .and. (interp%slint_nn(2,i) + ! .ne. interp%slint_nn(3,i))) + + end do ! do i = 1, dst_grid%ncoords + + end do ! do j = 1, dst_grid%nz + + !===================================================================== + + end subroutine slint_nrstnghbr + + !======================================================================= + +end module interpolation_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/json_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/json_interface.F90 new file mode 100644 index 000000000..e4e78ceb1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/json_interface.F90 @@ -0,0 +1,257 @@ +module json_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: json_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use fson + use fson_value_m + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: json_interface_read + interface json_interface_read + module procedure read_fv3var + module procedure read_pattern + end interface json_interface_read + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! json_nrecs.f90 + + ! DESCRIPTION: + + ! This subroutine defines the number of records within the external + ! JSON formatted file specified by the user using the FSON API + ! utilities. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! a JSON formatted file. + + !----------------------------------------------------------------------- + + subroutine json_nrecs(filename,json_size) + + ! Define variables passed to routine + + character(len=500) :: filename + integer :: json_size + + ! Define variables computed within routine + + type(fson_value), pointer :: json_file + + !===================================================================== + + ! Define local variables + + json_file => fson_parse(trim(adjustl(filename))) + json_size = fson_value_count(json_file) + call fson_destroy(json_file) + + !===================================================================== + + end subroutine json_nrecs + + !======================================================================= + + ! SUBROUTINE: + + ! read_fv3var.f90 + + ! DESCRIPTION: + + ! This subroutine parses a JSON formatted file and defines elements + ! of the json_fv3var_struct variable necessary to parse the JSON + ! formatted variable table (vtable) specfied by the user. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! a JSON formatted file. + + ! * json; a FORTRAN json_fv3var_struct variable. + + ! OUTPUT VARIABLES: + + ! * json; a FORTRAN json_fv3var_struct variable containing the + ! contents of the user JSON formatted file. + + !----------------------------------------------------------------------- + + subroutine read_fv3var(filename,json) + + ! Define variables passed to routine + + type(json_fv3var_struct), dimension(:), allocatable :: json + character(len=500) :: filename + + ! Define variables computed within routine + + type(fson_value), pointer :: json_file + type(fson_value), pointer :: json_item + integer :: json_size + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call json_nrecs(filename,json_size) + + ! Allocate memory for local variables + + if(.not. allocated(json)) allocate(json(json_size)) + + ! Define local variables + + json_file => fson_parse(trim(adjustl(filename))) + + ! Loop through local variable + + do i = 1, json_size + + ! Define local variables + + json_item => fson_value_get(json_file,i) + call fson_get(json_item,'clip',json(i)%clip) + call fson_get(json_item,'gridtype',json(i)%gridtype) + call fson_get(json_item,'interp_bilinear',json(i)%interp_bilinear) + call fson_get(json_item,'interp_nrstnghbr', & + & json(i)%interp_nrstnghbr) + call fson_get(json_item,'levtype',json(i)%levtype) + call fson_get(json_item,'variable_name',json(i)%variable_name) + call fson_get(json_item,'z_staggered',json(i)%z_staggered) + + end do ! do i = 1, json_size + + ! Define local variables + + call fson_destroy(json_file) + + !===================================================================== + + end subroutine read_fv3var + + !======================================================================= + + ! SUBROUTINE: + + ! read_pattern.f90 + + ! DESCRIPTION: + + ! This subroutine parses a JSON formatted file and defines elements + ! of the pattern_json_struct variable necessary to parse the JSON + ! formatted variable table (vtable) specfied by the user. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! a JSON formatted file. + + ! * json; a FORTRAN pattern_json_struct variable. + + ! OUTPUT VARIABLES: + + ! * json; a FORTRAN pattern_json_struct variable containing the + ! contents of the user JSON formatted file. + + !----------------------------------------------------------------------- + + subroutine read_pattern(filename,json) + + ! Define variables passed to routine + + type(json_pattern_struct), dimension(:), allocatable :: json + character(len=500) :: filename + + ! Define variables computed within routine + + type(fson_value), pointer :: json_file + type(fson_value), pointer :: json_item + integer :: json_size + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call json_nrecs(filename,json_size) + + ! Allocate memory for local variables + + if(.not. allocated(json)) allocate(json(json_size)) + + ! Define local variables + + json_file => fson_parse(trim(adjustl(filename))) + + ! Loop through local variable + + do i = 1, json_size + + ! Define local variables + + json_item => fson_value_get(json_file,i) + call fson_get(json_item,'clip',json(i)%clip) + call fson_get(json_item,'levtype',json(i)%levtype) + call fson_get(json_item,'max_lev',json(i)%max_lev) + call fson_get(json_item,'min_lev',json(i)%min_lev) + call fson_get(json_item,'vari_thresh',json(i)%vari_thresh) + call fson_get(json_item,'variable_name',json(i)%variable_name) + + end do ! do i = 1, json_size + + ! Define local variables + + call fson_destroy(json_file) + + !===================================================================== + + end subroutine read_pattern + + !======================================================================= + +end module json_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/kinds_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/kinds_interface.F90 new file mode 100644 index 000000000..9fe547acd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/kinds_interface.F90 @@ -0,0 +1,126 @@ +module kinds_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: kinds_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use f95_precision + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: default_integer + public :: default_real + public :: i_byte + public :: i_kind + public :: i_llong + public :: i_long + public :: i_short + public :: num_bytes_for_i_byte + public :: num_bytes_for_i_kind + public :: num_bytes_for_i_llong + public :: num_bytes_for_i_long + public :: num_bytes_for_i_short + public :: num_bytes_for_r_double + public :: num_bytes_for_r_quad + public :: num_bytes_for_r_kind + public :: num_bytes_for_r_single + public :: r_double + public :: r_kind + public :: r_quad + public :: r_single + public :: dp_intel + + !----------------------------------------------------------------------- + + ! Define local variables + + integer, parameter :: & + & default_integer = 3 + integer, parameter :: & + & default_real = 1 + integer, parameter :: & + & llong_t = selected_int_kind(16) + integer, parameter :: & + & num_bytes_for_i_byte = 1 + integer, parameter :: & + & num_bytes_for_i_short = 2 + integer, parameter :: & + & num_bytes_for_i_long = 4 + integer, parameter :: & + & num_bytes_for_i_llong = 8 + integer, parameter :: & + & num_i_kinds = 4 + integer, dimension(num_i_kinds), parameter :: & + & integer_byte_sizes = & + & (/num_bytes_for_i_byte,num_bytes_for_i_short, & + & num_bytes_for_i_long,num_bytes_for_i_llong/) + integer, parameter :: & + & num_bytes_for_i_kind = integer_byte_sizes(default_integer) + integer, parameter :: & + & i_byte = selected_int_kind(1) + integer, parameter :: & + & i_short = selected_int_kind(4) + integer, parameter :: & + & i_long = selected_int_kind(8) + integer, parameter :: & + & i_llong = max(llong_t,i_long) + integer, dimension(num_i_kinds), parameter :: & + & integer_types = (/i_byte,i_short,i_long,i_llong/) + integer, parameter :: & + & i_kind = integer_byte_sizes(default_integer) + integer, parameter :: & + & num_r_kinds = 3 + integer, parameter :: & + & r_single = selected_real_kind(6) + integer, parameter :: & + & r_double = selected_real_kind(15) + integer, parameter :: & + & quad_t = selected_real_kind(20) + integer, parameter :: & + & r_quad = max(quad_t,r_double) + integer, parameter :: & + & num_bytes_for_r_single = 4 + integer, parameter :: & + & num_bytes_for_r_double = 8 + integer, parameter :: & + & num_bytes_for_r_quad = 16 + integer, dimension(num_r_kinds), parameter :: & + & real_kinds = (/r_single,r_double,r_quad/) + integer, dimension(num_r_kinds), parameter :: & + & real_byte_sizes = (/num_bytes_for_r_single, & + & num_bytes_for_r_double,num_bytes_for_r_quad/) + integer, parameter :: & + & r_kind = real_kinds(default_real) + integer, parameter :: & + & num_bytes_for_r_kind = real_byte_sizes(default_real) + integer, parameter :: & + & dp_intel = dp + + !======================================================================= + +end module kinds_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/main.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/main.F90 new file mode 100644 index 000000000..bc8cce48f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/main.F90 @@ -0,0 +1,48 @@ +program analysis_update_main + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! analysis-update :: analysis_update_main + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use analysis_update_interface + + ! Define interfaces and attributes for module routines + + implicit none + + !======================================================================= + + ! Compute local variables + + call analysis_update() + + !======================================================================= + +end program analysis_update_main diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/math_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/math_methods_interface.F90 new file mode 100644 index 000000000..af9563a87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/math_methods_interface.F90 @@ -0,0 +1,1377 @@ +module math_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: math_methods_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kdtree2_module + use kinds_interface + use namelist_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: math_methods_euclidean_norm + public :: math_methods_kdtree_r2 + public :: math_methods_pca + public :: math_methods_pca_vari_cutoff + public :: math_methods_radialdist + public :: math_methods_rnorm + public :: math_methods_spline + public :: math_methods_stats + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! init_stats.f90 + + ! DESCRIPTION: + + ! This subroutine initializes a statgrid_struct variable. + + ! INPUT VARIABLES: + + ! * statgrid; an uninitialized FORTRAN statgrid_struct variable. + + ! OUTPUT VARIABLES: + + ! * statgrid; an initialized FORTRAN statgrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine init_stats(statgrid) + + ! Define variables passed to routine + + type(statgrid_struct) :: statgrid + + !===================================================================== + + ! Define local variables + + statgrid%varmin = spval + statgrid%varmax = spval + statgrid%mean = spval + statgrid%vari = spval + statgrid%nvals = 0 + + !===================================================================== + + end subroutine init_stats + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_euclidean_norm.f90 + + ! DESCRIPTION: + + ! This subroutine computes the Euclidean vector (L2) norm from an + ! array of fixed reference locations (dst_grdloc) to all fixed grid + ! location (src_grdloc); the resulting L2 norm is squared such that + ! it complies with traditional KD-tree type results. + + ! INPUT VARIABLES: + + ! * kdtree; a FORTRAN kdtree_struct variable containing the + ! destination and source grid (dst_ and src_, respectively) + ! geographical locations from which to compute the L2 norm. + + ! OUTPUT VARIABLES: + + ! * kdtree; a FORTRAN kdtree_struct variable now containing the + ! squared L2 norm Euclidean distance from the specified fixed + ! (reference) locations (dst_) to all points on the target grid + ! (src_). + + !----------------------------------------------------------------------- + + subroutine math_methods_euclidean_norm(kdtree) + + ! Define variables passed to routine + + type(kdtree_struct) :: kdtree + + ! Define variables computed within routine + + real(r_kind), dimension(:,:), allocatable :: src_grdloc + real(r_kind) :: dst_grdloc(3) + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(src_grdloc)) & + & allocate(src_grdloc(3,kdtree%src_ncoords)) + + ! Loop through local variable + + do i = 1, kdtree%src_ncoords + + ! Compute local variables + + src_grdloc(1,i) = rearth_equator*cos(kdtree%src_lat(i)*deg2rad)* & + & cos(kdtree%src_lon(i)*deg2rad) + src_grdloc(2,i) = rearth_equator*cos(kdtree%src_lat(i)*deg2rad)* & + & sin(kdtree%src_lon(i)*deg2rad) + src_grdloc(3,i) = rearth_equator*sin(kdtree%src_lat(i)*deg2rad) + + end do ! do i = 1, kdtree%src_ncoords + + ! Loop through local variable + + do j = 1, kdtree%dst_ncoords + + ! Compute local variables + + dst_grdloc(1) = rearth_equator*cos(kdtree%dst_lat(j)*deg2rad)* & + & cos(kdtree%dst_lon(j)*deg2rad) + dst_grdloc(2) = rearth_equator*cos(kdtree%dst_lat(j)*deg2rad)* & + & sin(kdtree%dst_lon(j)*deg2rad) + dst_grdloc(3) = rearth_equator*sin(kdtree%dst_lat(j)*deg2rad) + + ! Loop through local variable + + do i = 1, kdtree%src_ncoords + + ! Define local variables + + kdtree%r2dist(i,j) = norm2((src_grdloc(:,i) - dst_grdloc))**2.0 + + end do ! do i = 1, kdtree%src_ncoords + + end do ! do i = 1, kdtree%dst_ncoords + + ! Define local variables + + if(debug) write(6,500) minval(kdtree%r2dist(:,1:kdtree%dst_ncoords)), & + & maxval(kdtree%r2dist(:,1:kdtree%dst_ncoords)) + + ! Deallocate memory for local variables + + if(allocated(src_grdloc)) deallocate(src_grdloc) + + ! Define local variables + +500 format('MATH_METHODS_EUCLIDEAN_NORM: min/max r2dist = ',2e) + + !===================================================================== + + end subroutine math_methods_euclidean_norm + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_kdtree_r2.f90 + + ! DESCRIPTION: + + ! This subroutine finds the N nearest-neighbors within a user + ! specified radius of a given location. + + ! REFERENCES: + + ! Kennel, M. B., 2004: KDTREE2: Fortran 95 and C++ software to + ! efficiently search for near neighbors in a multi-dimensional + ! Euclidean space. + + ! http://arxiv.org/PScache/phvsics/pdf/0408/0408067.pdf. + + ! INPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the + ! Euclidean space geographical locations within which to find + ! nearest-neighbors; geographical locations (e.g., latitudes and + ! longitudes) are assumed to have units of degrees. + + ! * src_grid; a FORTRAN grid_struct variable containing the + ! geographical locations for which to find the N-nearest neighbor + ! locations; geographical locations (e.g., latitudes and + ! longitudes) are assumed to have units of degrees. + + ! * kdtree; a FORTRAN kdtree_struct variable containing (at minimum) + ! the number of coordinate values (the ncoords attribute should be + ! equal to the dst_grid variable ncoords attribute) and the radial + ! distance within which to seek the nearest neighbors. + + ! OUTPUT VARIABLES: + + ! * kdtree; a FORTRAN kdtree_struct variable containing the + ! N-nearest neighbors within the R^2 distance specified by the + ! user. + + !----------------------------------------------------------------------- + + subroutine math_methods_kdtree_r2(src_grid,dst_grid,kdtree) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(kdtree_struct) :: kdtree + + ! Define variables computed within routine + + type(kdtree2), pointer :: kdtree2 + type(kdtree2_result) :: sresults(kdtree%nalloc) + real(r_kind), dimension(:,:), allocatable :: src_grdloc + real(r_kind) :: dst_grdloc(3) + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(src_grdloc)) & + & allocate(src_grdloc(3,dst_grid%ncoords)) + + ! Loop through local variables + + do i = 1, dst_grid%ncoords + + ! Compute local variables + + src_grdloc(1,i) = rearth_equator*cos(dst_grid%lat(i)*deg2rad)* & + & cos(dst_grid%lon(i)*deg2rad) + src_grdloc(2,i) = rearth_equator*cos(dst_grid%lat(i)*deg2rad)* & + & sin(dst_grid%lon(i)*deg2rad) + src_grdloc(3,i) = rearth_equator*sin(dst_grid%lat(i)*deg2rad) + + end do ! do i = 1, dst_grid%ncoords + + ! Compute local variables + + kdtree2 => kdtree2_create(src_grdloc,sort=.true.,rearrange=.true.) + dst_grdloc(1) = rearth_equator*cos(src_grid%clat*deg2rad)* & + & cos(src_grid%clon*deg2rad) + dst_grdloc(2) = rearth_equator*cos(src_grid%clat*deg2rad)* & + & sin(src_grid%clon*deg2rad) + dst_grdloc(3) = rearth_equator*sin(src_grid%clat*deg2rad) + + ! Define local variables + + call kdtree2_r_nearest(tp=kdtree2,qv=dst_grdloc,r2=kdtree%r2,nfound= & + & kdtree%nfound,nalloc=kdtree%nalloc,results=sresults) + kdtree%r2dist(1,1:kdtree%nfound) = sresults(1:kdtree%nfound)%dis + kdtree%idx(1,1:kdtree%nfound) = sresults(1:kdtree%nfound)%idx + + ! Deallocate memory for local variables + + call kdtree2_destroy(kdtree2) + if(allocated(src_grdloc)) deallocate(src_grdloc) + + !===================================================================== + + end subroutine math_methods_kdtree_r2 + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_pca.f90 + + ! DESCRIPTION: + + ! This subroutine deconstructs and/or reconstructs a user specified + ! variable using singular value decomposition (SVD) of a general + ! rectangular (m-by-n) maxtrix (svd%a). + + ! NOTE: + + ! The FORTRAN svd_struct variable attributes 'dcnstrct' and + ! 'rcnstrct' denote deconstruction via SVD or reconstruct via the + ! component matrices, respectively. + + ! If the deconstruction of a user specified variable is compute, the + ! output FORTRAN svd_struct variable contains the transpose of the + ! m-by-m orthogonal matrix component matrix 'vt' within the variable + ! attribute 'v'. + + ! INPUT VARIABLES: + + ! For deconstruction: + + ! * svd; a FORTRAN svd_struct variable containing the matrix to be + ! decomposed as the 'a' attribute; the component matrices are + ! returned within the 'u', 'vt', 'v', and 's' variable attributes. + + ! For reconstruction: + + ! * svd; a FORTRAN svd_struct variable containing the component + ! matrices 'u', 'v', and 's'. + + ! OUTPUT VARIABLES: + + ! For deconstruction: + + ! * svd; a FORTRAN svd_struct variable containing the component + ! matrices 'u', 'v', 'vt', and 's'. + + ! For reconstruction: + + ! * svd; a FORTRAN svd_struct variable containing the reconstructed + ! matrix as the 'a' attribute. + + !----------------------------------------------------------------------- + + subroutine math_methods_pca(svd) + + ! Define variables passed to routine + + type(svd_struct) :: svd + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(svd%dcnstrct) call pca_deconstruct(svd) + if(svd%rcnstrct) call pca_reconstruct(svd) + + !===================================================================== + + end subroutine math_methods_pca + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_pca_vari_cutoff.f90 + + ! DESCRIPTION: + + ! This subroutine returns the array indice representing the first + ! index which exceeds the variance explained cutoff threshold + ! specified by the user. + + ! INPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the variance + ! explained by each principle component (e.g., singular value). + + ! * cutoff; a FORTRAN 4-byte real-valued variable specifying the + ! variance explained by the principle component summation + ! threshold value; this is a percentage value (e.g., 0.9 => 90%). + + ! * idx; a FORTRAN integer value. + + ! * idxp1; a FORTRAN integer value. + + ! OUTPUT VARIABLES: + + ! * idx; a FORTRAN integer representing the first index which is + ! less than or equal to the variance explained cutoff threshold + ! specified by the user. + + ! * idxp1; a FORTRAN integer representing the index which exceeds + ! the variance explained cutoff threshold specified by the user. + + !----------------------------------------------------------------------- + + subroutine math_methods_pca_vari_cutoff(svd,cutoff,idx,idxp1) + + ! Define variables passed to routine + + type(svd_struct) :: svd + real(r_kind) :: cutoff + integer :: idx + integer :: idxp1 + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + idx = 1 + + ! Loop through local variable + + do i = 1, size(svd%s) + + ! Check local variable and proceed accordingly + + if(sum(svd%svarex(1:i)) .le. cutoff) then + + ! Define local variables + + idx = i + + end if ! ! Check local variable and proceed accordingly + + end do ! do i = 1, size(svd%s) + + ! Define local variables + + idxp1 = min((idx + 1),size(svd%s)) + + !===================================================================== + + end subroutine math_methods_pca_vari_cutoff + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_radialdist.f90 + + ! DESCRIPTION: + + ! This subroutine computes the radial distance, using the + ! Earth-bound geographical coordinates, between two locations + ! assuming the equitorial radius of the Earth. + + ! INPUT VARIABLES: + + ! * lon1; a FORTRAN 4-byte real value specifying the geographical + ! longitude coordinate of location 1; units are degrees. + + ! * lat1; a FORTRAN 4-byte real value specifying the geographical + ! latitude coordinate of location 1; units are degrees. + + ! * lon2; a FORTRAN 4-byte real value specifying the geographical + ! longitude coordinate of location 2; units are degrees. + + ! * lat2; a FORTRAN 4-byte real value specifying the geographical + ! latitude coordinate of location 2; units are degrees. + + ! OUTPUT VARIABLES: + + ! * dist; a FORTRAN 4-byte real value specifying the radial distance + ! between two locations assuming the equitorial radius of the + ! Earth; units are meters. + + !----------------------------------------------------------------------- + + subroutine math_methods_radialdist(lon1,lat1,lon2,lat2,dist) + + ! Define variables passed to routine + + real(r_kind) :: lon1 + real(r_kind) :: lat1 + real(r_kind) :: lon2 + real(r_kind) :: lat2 + real(r_kind) :: dist + + ! Define variables computed within routine + + real(r_double) :: lat1_deg + real(r_double) :: lat2_deg + real(r_double) :: lat1_rad + real(r_double) :: lat2_rad + real(r_double) :: lon1_deg + real(r_double) :: lon2_deg + real(r_double) :: lon1_rad + real(r_double) :: lon2_rad + real(r_double) :: x1 + real(r_double) :: y1 + real(r_double) :: z1 + real(r_double) :: x2 + real(r_double) :: y2 + real(r_double) :: z2 + real(r_kind) :: dr + + !===================================================================== + + ! Compute local variables + + lon1_deg = lon1 + lon1_deg = mod(lon1_deg,360.d0) + if(lon1_deg .lt. 0.d0) then + lon1_deg = lon1_deg + 360.d0 + end if ! if(lon1_deg .lt. 0.d0) + lon2_deg = lon2 + lon2_deg = mod(lon2_deg,360.d0) + if(lon2_deg .lt. 0.d0) then + lon2_deg = lon2_deg + 360.d0 + end if ! if(lon2_deg .lt. 0.d0) + if(lat1 .lt. lat2) then + lon1_rad = lon1_deg*deg2rad + lat1_rad = (90.d0 - lat1)*deg2rad + lon2_rad = lon2_deg*deg2rad + lat2_rad = (90.d0 - lat2)*deg2rad + else if(lat1 .eq. lat2 .and. lon1_deg .le. lon2_deg) then + lon1_rad = lon1_deg*deg2rad + lat1_rad = (90.d0 - lat1)*deg2rad + lon2_rad = lon2_deg*deg2rad + lat2_rad = (90.d0 - lat2)*deg2rad + else + lon1_rad = lon2_deg*deg2rad + lat1_rad = (90.d0 - lat2)*deg2rad + lon2_rad = lon1_deg*deg2rad + lat2_rad = (90.d0 - lat1)*deg2rad + end if ! if(lat1 .lt. lat2) + x1 = sin(lat1_rad)*cos(lon1_rad) + y1 = sin(lat1_rad)*sin(lon1_rad) + z1 = cos(lat1_rad) + x2 = sin(lat2_rad)*cos(lon2_rad) + y2 = sin(lat2_rad)*sin(lon2_rad) + z2 = cos(lat2_rad) + dr = acos(min(1.d0,x1*x2 + y1*y2 + z1*z2)) + dist = dr*rearth_equator + + !===================================================================== + + end subroutine math_methods_radialdist + + !======================================================================= + + ! FUNCTION: + + ! math_methods_rnorm.f90 + + ! DESCRIPTION: + + ! This function generates a random normal deviate using the polar + ! method. + + ! REFERENCES: + + ! Marsaglia, G. and Bray, T.A., 1964. A convenient method for + ! generating normal variables. SIAM review, 6(3), pp.260-264. + + ! OUTPUT VARIABLES: + + ! * fnval; a random normal deviate computed via the Marsaglia et + ! al., [1964] polar method. + + !----------------------------------------------------------------------- + + function math_methods_rnorm() result(fnval) + + ! Define variables computed within routine + + real(r_kind) :: fnval + real(r_kind) :: u + real(r_kind) :: v + real(r_kind) :: sum + real(r_kind) :: sln + real(r_kind) :: vsmall + + !===================================================================== + + ! Define local variables + + vsmall = tiny(1.0) + sum = spval + + ! Loop throgh local variable + + do while(sum .ge. 1.0) + + ! Define local variables + + call random_number(u) + call random_number(v) + + ! Compute local variables + + u = scale(u,1) - 1.0 + v = scale(v,1) - 1.0 + sum = u*u + v*v + vsmall + + end do ! do while(sum .ge. 1.0) + + ! Compute local variables + + sln = sqrt(-1.0*scale(log(sum),1)/sum) + fnval = u*sln + + !===================================================================== + + end function math_methods_rnorm + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_spline.f90 + + ! DESCRIPTION: + + ! This method interpolates, using cubic-splines, to estimate the + ! value along a profile given a value, presumably within the range + ! of profile values. + + ! INPUT VARIABLES: + + ! * spline; a FORTRAN spline_struct variable that contains the + ! reference profile and variable as well as the location (within + ! the profile) to remap the variable values. + + ! OUTPUT VARIABLES: + + ! * spline; a FORTRAN spline_struct variable containing the remapped + ! variable value; if the value is equal to the spval designiaton, + ! this implies that the location for which to remap was outside + ! the bounds of the available profile values (e.g., no + ! extrapolation is performed). + + !----------------------------------------------------------------------- + + subroutine math_methods_spline(spline) + + ! Define variables passed to routine + + type(spline_struct) :: spline + + ! Define variables computed within routine + + real(r_double), dimension(:), allocatable :: xa + real(r_double), dimension(:), allocatable :: ya + real(r_double), dimension(:), allocatable :: y2a + real(r_double) :: x + real(r_double) :: y + real(r_double) :: yp + real(r_double) :: ypp + real(r_double) :: yp1 + real(r_double) :: ypn + integer :: n + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + call sort_array(spline,.true.,.false.) + n = count(spline%xa .ne. spval) + x = dble(spline%x) + y = spval + yp1 = dble(0.0) + ypn = dble(0.0) + + ! Check local variable and proceed accordingly + + if(n .ge. 2) then + + ! Allocate memory for local variables + + if(.not. allocated(xa)) allocate(xa(n)) + if(.not. allocated(ya)) allocate(ya(n)) + if(.not. allocated(y2a)) allocate(y2a(n)) + + ! Define local variables + + j = 0 + + ! Loop through local variable + + do i = 1, size(spline%xa) + + ! Check local variable and proceed accordingly + + if(spline%xa(i) .ne. spval .and. spline%ya(i) .ne. spval) then + + ! Define local variables + + j = j + 1 + xa(j) = dble(spline%xa(i)) + ya(j) = dble(spline%ya(i)) + + end if ! if(spline%xa(i) .ne. spval .and. spline%ya(i) + ! .ne. spval) + + end do ! do i = 1, size(spline%xa) + + ! Compute local variables + + call spline_cubic_set(n,xa(1:n),ya(1:n),3,yp1,3,ypn,y2a) + + ! Check local variable and proceed accordingly + + if(minval(xa(1:n)) .le. x .and. maxval(xa(1:n)) .ge. x) then + + ! Compute local variables + + call spline_cubic_val(n,xa(1:n),ya(1:n),y2a(1:n),x,y,yp,ypp) + + end if ! if(minval(xa(1:n)) .le. x .and. maxval(xa(1:n)) + ! .ge. x) + + ! Deallocate memory for local variables + + if(allocated(xa)) deallocate(xa) + if(allocated(ya)) deallocate(ya) + if(allocated(y2a)) deallocate(y2a) + + end if ! if(n .ge. 2) + + ! Define local variables + + spline%y = real(y) + + !===================================================================== + + end subroutine math_methods_spline + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_stats.f90 + + ! DESCRIPTION: + + ! This subroutine defines/computes the attributes of a variable + ! array and returns the respective attibutes. + + ! INPUT VARIABLES: + + ! * vargrid; a FORTRAN vargrid_struct variable. + + ! OUTPUT VARIABLES: + + ! * statgrid; a FORTRAN statgrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine math_methods_stats(vargrid,statgrid) + + ! Define variables passed to routine + + type(vargrid_struct) :: vargrid + type(statgrid_struct) :: statgrid + + ! Define variables computed within routine + + real(r_kind) :: sum + real(r_kind) :: sumsq + real(r_kind) :: varmin + real(r_kind) :: varmax + integer :: count + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call init_stats(statgrid) + varmin = spval + varmax = -spval + sum = 0.0 + count = 0 + + ! Loop through local variable + + do i = 1, vargrid%nvals + + ! Check local variable and proceed accordingly + + if(vargrid%var(i) .ne. spval) then + + ! Define local variables + + varmin = min(varmin,vargrid%var(i)) + varmax = max(varmax,vargrid%var(i)) + + ! Compute local variables + + sum = sum + vargrid%var(i) + count = count + 1 + + end if ! if(vargrid%var(i) .ne. spval) + + end do ! do i = 1, vargrid%nvals + + ! Check local variable and proceed accordingly + + if(abs(varmax) .eq. spval) varmax = spval + if(varmin .ne. spval) statgrid%varmin = varmin + if(varmax .ne. spval) statgrid%varmax = varmax + if(count .gt. 0) statgrid%mean = sum/real(count) + if(statgrid%mean .ne. spval) then + + ! Define local variables + + sum = 0.0 + sumsq = 0.0 + + ! Loop through local variable + + do i = 1, vargrid%nvals + + ! Check local variable and proceed accordingly + + if(vargrid%var(i) .ne. spval) then + + ! Compute local variables + + sum = sum + (vargrid%var(i) - statgrid%mean) + sumsq = sumsq + ((vargrid%var(i) - statgrid%mean)* & + & (vargrid%var(i) - statgrid%mean)) + + end if ! if(vargrid%var(i) .ne. spval) + + end do ! do i = 1, vargrid%nvals + + ! Check local variable and proceed accordingly + + if(count .gt. 1) then + + ! Compute local variables + + statgrid%vari = (sumsq - (sum*sum)/count)/(count - 1) + statgrid%stdev = sqrt(statgrid%vari) + + end if ! if(count .gt. 1) + + end if ! if(statgrid%mean .ne. spval) + + ! Define local variables + + statgrid%nvals = count + + !===================================================================== + + end subroutine math_methods_stats + + !======================================================================= + + ! SUBROUTINE: + + ! pca_deconstruct.f90 + + ! DESCRIPTION: + + ! This subroutine computes the principle component and singular + ! vector (U, S, and VT) matrices via descontruction of a matrix A. + + ! INPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the matrix to be + ! decomposed as the 'a' attribute. + + ! OUTPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the component + ! matrices 'u', 'vt', and 's'. + + !----------------------------------------------------------------------- + + subroutine pca_deconstruct(svd) + + ! Define variables passed to routine + + type(svd_struct) :: svd + + ! Define variables computed within routine + + type(statgrid_struct) :: statgrid + type(vargrid_struct) :: vargrid + character(len=1) :: jobu + character(len=1) :: jobvt + real(dp_intel), dimension(:), allocatable :: work + integer :: lwmax + integer :: lwork + integer :: info + + !===================================================================== + + ! Define local variables + + vargrid%nx = svd%nx + vargrid%ny = svd%ny + call variable_interface_setup_struct(vargrid) + vargrid%var = reshape(real(svd%a),(/size(vargrid%var)/)) + + ! Compute local variables + + call math_methods_stats(vargrid,statgrid) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(vargrid) + + ! Define local variables + + svd%mean = dble(statgrid%mean) + jobu = 'A' + jobvt = 'A' + lwmax = max(3*min(svd%nx,svd%ny)+max(svd%nx,svd%ny), & + & 5*min(svd%nx,svd%ny)-4) + lwork = -1 + + ! Allocate memory for local variables + + if(.not. allocated(work)) allocate(work(lwmax)) + + ! Compute local variables + + call dgesvd(jobu,jobvt,svd%nx,svd%ny,svd%a,svd%lda,svd%s,svd%u, & + & svd%ldu,svd%vt,svd%ldvt,work,lwork,info) + + ! Define local variables + + lwork = int(work(1)) + svd%a = svd%a - svd%mean + + ! Deallocate memory for local variables + + if(allocated(work)) deallocate(work) + + ! Allocate memory for local variables + + if(.not. allocated(work)) allocate(work(lwork)) + + ! Compute local variables + + call dgesvd(jobu,jobvt,svd%nx,svd%ny,svd%a,svd%lda,svd%s,svd%u, & + & svd%ldu,svd%vt,svd%ldvt,work,lwork,info) + + ! Define local variables + + svd%v = transpose(svd%vt) + + ! Deallocate memory for local variables + + if(allocated(work)) deallocate(work) + + ! Compute local variables + + call pca_variexpl(svd) + + !===================================================================== + + end subroutine pca_deconstruct + + !======================================================================= + + ! SUBROUTINE: + + ! pca_reconstruct.f90 + + ! DESCRIPTION: + + ! This subroutine reconstructs a matrix A from the principle + ! component and singular vector (U, S, and VT) matrices. + + ! INPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the component + ! matrices defined within the 'u', 'vt', and 's' attributes. + + ! OUTPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the reconstructed + ! matrix as the 'a' attribute. + + !----------------------------------------------------------------------- + + subroutine pca_reconstruct(svd) + + ! Define variables passed to routine + + type(svd_struct) :: svd + + ! Define variables computed within routine + + character(len=1) :: transa + character(len=1) :: transb + real(dp_intel), dimension(:,:), allocatable :: sxvt + real(dp_intel), dimension(:,:), allocatable :: uxsvt + real(dp_intel), dimension(:,:), allocatable :: sdiag + real(dp_intel) :: alpha + real(dp_intel) :: beta + integer :: argm + integer :: argn + integer :: argk + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(sxvt)) allocate(sxvt(svd%nx,size(svd%s))) + if(.not. allocated(sdiag)) allocate(sdiag(size(svd%s),size(svd%s))) + + ! Define local variables + + sdiag = dble(0.0) + + ! Loop through local variable + + do i = 1, size(svd%s) + + ! Define local variables + + sdiag(i,i) = svd%s(i) + + end do ! do i = 1, size(svd%s) + + ! Define local variables + + transa = 'N' + transb = 'N' + alpha = dble(1.0) + beta = dble(0.0) + argm = size(sdiag(:,1)) + argn = svd%ny + argk = size(sdiag(1,:)) + sxvt = dble(0.0) + + ! Compute local variables + + call dgemm(transa,transb,argm,argn,argk,alpha,sdiag,size(sdiag(:,1)), & + & svd%vt,svd%ldvt,beta,sxvt,argk) + + ! Deallocate memory for local variables + + if(allocated(sdiag)) deallocate(sdiag) + + ! Allocate memory for local variables + + if(.not. allocated(uxsvt)) allocate(uxsvt(svd%nx,svd%ny)) + + ! Define local variables + + transa = 'N' + transb = 'N' + alpha = dble(1.0) + beta = dble(0.0) + argm = size(svd%u(:,1)) + argn = size(sxvt(1,:)) + argk = size(svd%u(1,:)) + uxsvt = dble(0.0) + + ! Compute local variables + + call dgemm(transa,transb,argm,argn,argk,alpha,svd%u,size(svd%u(:,1)), & + & sxvt,size(sxvt(:,1)),beta,uxsvt,argk) + + ! Define local variables + + svd%a = uxsvt + svd%mean + + ! Deallocate memory for local variables + + if(allocated(uxsvt)) deallocate(uxsvt) + if(allocated(sxvt)) deallocate(sxvt) + + !===================================================================== + + end subroutine pca_reconstruct + + !======================================================================= + + ! SUBROUTINE: + + ! pca_variexpl.f90 + + ! DESCRIPTION: + + ! This subroutine computes the variance explained by each singular + ! value (e.g., principle component). + + ! INPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the singular + ! values (e.g., principle components) within the 's' attribute. + + ! OUTPUT VARIABLES: + + ! * svd; a FORTRAN svd_struct variable containing the variance + ! explained by each of the principle components within the + ! 'svarex' attribute. + + !----------------------------------------------------------------------- + + subroutine pca_variexpl(svd) + + ! Define variables passed to routine + + type(svd_struct) :: svd + + ! Define variables computed within routine + + real(r_double) :: sumsq + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + sumsq = dble(0.0) + + ! Loop through local variable + + do i = 1, size(svd%s) + + ! Compute local variables + + sumsq = sumsq + svd%s(i)*svd%s(i) + + end do ! do i = 1, size(svd%s) + + ! Loop through local variable + + do i = 1, size(svd%s) + + ! Compute local variables + + svd%svarex(i) = (svd%s(i)*svd%s(i))/sumsq + + end do ! do i = 1, size(svd%s) + + !===================================================================== + + end subroutine pca_variexpl + + !======================================================================= + + ! SUBROUTINE: + + ! sort_array.f90 + + ! DESCRIPTION: + + ! This subroutine implements the SLATEC ssort routine to sort a + ! dependent array (ya) relative to a sorted independent array (xa); + ! the arrays may be sorted in either the ascending or descending + ! direction. + + ! REFERENCES: + + ! Singleton, R.C., 1969. Algorithm 347: an efficient algorithm for + ! sorting with minimal storage [M1]. Communications of the ACM, + ! 12(3), pp.185-186. + + ! INPUT VARIABLES: + + ! * spline; a FORTRAN spline_struct containing the independent (xa) + ! and dependent (ya) variable arrays to be sorted. + + ! * ascend; a FORTRAN logical variable specifying whether the arrays + ! are to be sorted in the ascending direction. + + ! * descend; a FORTRAN logical variable specifying whether the + ! arrays are to be sorted in the descending direction. + + ! OUTPUT VARIABLES: + + ! * spline; a FORTRAN spline_struct containing the sorted + ! independent (xa) and dependent (ya) variable arrays. + + !----------------------------------------------------------------------- + + subroutine sort_array(spline,ascend,descend) + + ! Define variables passed to routine + + type(spline_struct) :: spline + logical :: ascend + logical :: descend + + ! Define variables computed within routine + + real(r_kind), dimension(:), allocatable :: xa + real(r_kind), dimension(:), allocatable :: ya + integer :: kflag + integer :: n + + !===================================================================== + + ! Define local variables + + call unique_array_spline(spline) + + ! Check local variable and proceed accordingly + + if(ascend) kflag = 2 + if(descend) kflag = -2 + + ! Define local variables + + n = spline%n + + ! Check local variable and proceed accordingly + + if(n .ge. 2) then + + ! Allocate memory for local variables + + if(.not. allocated(xa)) allocate(xa(n)) + if(.not. allocated(ya)) allocate(ya(n)) + + ! Define local variables + + xa = spline%xa + ya = spline%ya + call ssort(xa,ya,n,kflag) + spline%xa = xa + spline%ya = ya + + ! Deallocate memory for local variables + + if(allocated(xa)) deallocate(xa) + if(allocated(ya)) deallocate(ya) + + end if ! if(n .ge. 2) + + !===================================================================== + + end subroutine sort_array + + !======================================================================= + + ! SUBROUTINE: + + ! unique_array_spline.f90 + + ! DESCRIPTION: + + ! This subroutine returns an array containing only unique values; + ! this method is utilitized by spline routines which require + ! absolute ascending/descending arrays/lists in order to perform + ! their respective algorithms. + + ! INPUT VARIABLES: + + ! * spline; a FORTRAN spline_struct variable containing the values + ! defined by the user for spline calculations; + + ! OUTPUT VARIABLES: + + ! * spline; a FORTRAN spline_struct variable which is a modified + ! version of the input FORTRAN spline_struct variable assuming the + ! FORTRAN spline_struct variable does not contain entirely unique + ! values. + + !----------------------------------------------------------------------- + + subroutine unique_array_spline(spline) + + ! Define variables passed to routine + + type(spline_struct) :: spline + + ! Define variables computed within routine + + type(spline_struct) :: splinel + real(r_kind) :: max_val + real(r_kind) :: min_val + integer :: nn + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + splinel%n = spline%n + call variable_interface_setup_struct(splinel) + splinel%xa = spval + splinel%ya = spval + max_val = maxval(spline%xa) + min_val = minval(spline%xa) + nn = 0 + + ! Loop through local variable + + do while(min_val .lt. max_val) + + ! Define local variables + + nn = nn + 1 + min_val = minval(spline%xa,mask=(spline%xa .gt. min_val)) + splinel%xa(nn) = min_val + + ! Loop through local variable + + do i = 1, spline%n + + ! Check local variable and proceed accordingly + + if(splinel%xa(nn) .eq. spline%xa(i)) then + + ! Define local variables + + splinel%ya(nn) = spline%ya(i) + goto 1000 + + end if ! if(splinel%xa(nn) .eq. spline%xa(i)) + + end do ! do i = 1, spline%n + + ! Define local variables + +1000 continue + + end do ! do while(min_val .lt. max_val) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(spline) + + ! Define local variables + + spline%n = count(splinel%xa .ne. spval) + call variable_interface_setup_struct(spline) + spline%xa = splinel%xa(1:spline%n) + spline%ya = splinel%ya(1:spline%n) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(splinel) + + !===================================================================== + + end subroutine unique_array_spline + + !======================================================================= + +end module math_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/meteo_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/meteo_methods_interface.F90 new file mode 100644 index 000000000..39cf3c712 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/meteo_methods_interface.F90 @@ -0,0 +1,268 @@ +module meteo_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: meteo_methods_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: meteo_methods_winds + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_winds.f90 + + ! DESCRIPTION: + + ! This subroutine computes the attributes of the wind field in + ! accordance with the user input variable (meteo_struct); if the + ! zonal- (u-) and meridional (v-) wind components are equal to + ! 'spval' upon entry, they are derived from the wind speed (spd) and + ! direction (dir); if the wind speed and direction are equal to + ! 'spval' upon entry, they are computed from the wind components (u- + ! and v-). + + ! INPUT VARIABLES: + + ! * meteo; a FORTRAN meteo_struct variable containing the defined + ! wind field attributes. + + ! OUTPUT VARIABLES: + + ! * meteo; a FORTRAN meteo_struct variable containing the computed + ! wind field attributes + + !----------------------------------------------------------------------- + + subroutine meteo_methods_winds(meteo) + + ! Define variables passed to routine + + type(meteo_struct) :: meteo + + ! Define variables computed within routine + + type(winds_struct) :: winds + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + winds%nx = meteo%nx + winds%ny = meteo%ny + call variable_interface_setup_struct(winds) + + ! Loop through local variable + + do i = 1, meteo%nz + + ! Check local variable and proceed accordingly + + if((minval(meteo%u(:,i)) .eq. spval) .and. (maxval(meteo%u(:,i)) & + & .eq. spval) .and. (minval(meteo%v(:,i)) .eq. spval) .and. & + & (maxval(meteo%v(:,i)) .eq. spval)) then + + ! Define local variables + + winds%dir = meteo%wdir(:,i) + winds%spd = meteo%wspd(:,i) + + ! Compute local variables + + call wnd_comps(winds) + + ! Define local variables + + meteo%u(:,i) = winds%u + meteo%v(:,i) = -1.0*winds%v + + end if ! if((minval(meteo%u(:,i)) .eq. spval) + ! .and. (maxval(meteo%u(:,i)) .eq. spval) + ! .and. (minval(meteo%v(:,i)) .eq. spval) + ! .and. (maxval(meteo%v(:,i)) .eq. spval)) + + ! Check local variable and proceed accordingly + + if((minval(meteo%wspd(:,i)) .eq. spval) .and. & + & (maxval(meteo%wspd(:,i)) .eq. spval) .and. & + & (minval(meteo%wdir(:,i)) .eq. spval) .and. & + & (maxval(meteo%wdir(:,i)) .eq. spval)) then + + ! Define local variables + + winds%u = meteo%u(:,i) + winds%v = meteo%v(:,i) + + ! Compute local variables + + call wnd_spddir(winds) + + ! Define local variables + + meteo%wdir(:,i) = winds%dir + meteo%wspd(:,i) = winds%spd + + end if ! if((minval(meteo%wspd(:,i)) .eq. spval) + ! .and. (maxval(meteo%wspd(:,i)) .eq. spval) + ! .and. (minval(meteo%wdir(:,i)) .eq. spval) + ! .and. (maxval(meteo%wdir(:,i)) .eq. spval)) + + end do ! do i = 1, meteo%nz + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(winds) + + !===================================================================== + + end subroutine meteo_methods_winds + + !======================================================================= + + ! SUBROUTINE: + + ! wnd_comps.f90 + + ! DESCRIPTION: + + ! This subroutine computes the zonal- and meridional wind (u- and v, + ! respectively) components from the wind speed (spd) and direction + ! (dir). + + ! INPUT VARIABLES: + + ! * winds; a FORTRAN winds_struct variable containing (at minimum) + ! the wind speed (spd) and direction (dir). + + ! OUTPUT VARIABLES: + + ! * winds; a FORTRAN winds_struct variable containing the computed + ! zonal- (u-) and meridional (v-) wind components. + + !----------------------------------------------------------------------- + + subroutine wnd_comps(winds) + + ! Define variables passed to routine + + type(winds_struct) :: winds + + !===================================================================== + + ! Compute local variables + + winds%u = winds%spd*cos(winds%dir*deg2rad) + winds%v = winds%spd*sin(winds%dir*deg2rad) + + !===================================================================== + + end subroutine wnd_comps + + !======================================================================= + + ! SUBROUTINE: + + ! wnd_spddir.f90 + + ! DESCRIPTION: + + ! This subroutine computes the wind speed and direction (spd and + ! dir, respectively) from the zonal- and meridional wind (u- and v, + ! respectively) components. + + ! INPUT VARIABLES: + + ! * winds; a FORTRAN winds_struct variable containing (at minimum) + ! the zonal (u) and meridional (v) components. + + ! OUTPUT VARIABLES: + + ! * winds; a FORTRAN winds_struct variable containing the computed + ! wind speed (spd) and direction (dir). + + !----------------------------------------------------------------------- + + subroutine wnd_spddir(winds) + + ! Define variables passed to routine + + type(winds_struct) :: winds + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, winds%ncoords + + ! Compute local variables + + winds%spd(i) = sqrt(winds%u(i)*winds%u(i) + winds%v(i)*winds%v(i)) + + ! Check local variable and proceed accordingly + + if(winds%spd(i) .lt. 1.e-10) then + + ! Define local variables + + winds%dir(i) = 0.0 + + else ! if(winds%spd(i) .lt. 1.e-10) + + ! Compute local variables + + winds%dir(i) = atan2(winds%u(i),winds%v(i))*rad2deg + 270.0 + + end if ! if(winds%spd(i) .lt. 1.e-10) + + end do ! do i = 1, winds%ncoords + + !===================================================================== + + end subroutine wnd_spddir + + !======================================================================= + +end module meteo_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/namelist_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/namelist_interface.F90 new file mode 100644 index 000000000..fafde7518 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/namelist_interface.F90 @@ -0,0 +1,471 @@ +module namelist_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: namelist_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + + !----------------------------------------------------------------------- + + ! DESCRIPTION (alphabetized): + + ! * adv_time; a FORTRAN 4-byte real valued variable specifying the + ! integration time-step for the generation of the stochastic + ! random pattern applied for ensemble member generation; units are + ! seconds. + + ! * corr_length; a FORTRAN 4-byte real valued variable specifying + ! the spatial correlation scale for the stochastic random pattern + ! applied for ensemble member generation; units are meters. + + ! * corr_nmax; a FORTRAN integer specifying the total number of + ! iterations applied to generate the stochastic random pattern + ! applied for ensemble member generation. + + ! * corr_stdev; a FORTRAN 4-byte real valued variable specifying the + ! standard deviation used to define the random (e.g., white-) + ! noise spectrum for the generation of the stochastic random + ! pattern applied for ensemble member generation. + + ! * corr_tau; a FORTRAN 4-byte real valued variable specifying the + ! temporal correlation scale for the stochastic random pattern + ! applied for ensemble member generation; units are seconds. + + ! * datapath; a FORTRAN character string specifying the full-path to + ! the directory to contain output files written by the respective + ! routines. + + ! * debug; a FORTRAN logical value specifying whether to include + ! debug information during execution. + + ! * domain_blend_ratio; a FORTRAN 4-byte real valued variable + ! specifying the ratio of the blended nest and parent domains + ! which contains the nest versus the parent domain; for example, a + ! value of 0.95 implies that 95% of the total blended region is + ! defined by the interpolated nested domain while the remaining 5% + ! is a linear combination (as a function of radius) of the nest + ! and parent grid solutions. + + ! * ensgen_json_vtable; a FORTRAN character string specifying the + ! full-path to the JSON-formatted file containing the perturbation + ! attributes to be applied to variables which is required to + ! generate ensemble member initial perturbations/uncertainty. + + ! * ensgen_ntrunc; a FORTRAN integer value specifying the spectral + ! truncation value used to construct the spatially-correlated + ! white-noise pattern required to generate the perturbations to + ! the respective state variables described in ensgen_json_vtable + ! (above). + + ! * ensmem_filename; a FORTRAN character string specifying the + ! full-path to the external file to be modified in order to + ! generate ensemble member initial perturbations/uncertainty; + ! currently only NEMS-formatted files are supported. + + ! * ensmem_pattern_filename; a FORTRAN character string specifying + ! the full-path to an external file netcdf file containing a + ! random number pattern (e.g., white noise spectum) to generate + ! ensemble member initial perturbations/uncertainty. + + ! * fv3_analysis_filename; a FORTRAN character string specifying the + ! full-path to the FV3 restart-formatted file containing the + ! data-assimilation method/algorithm defined/derived "analysis" + ! state variables. + + ! * fv3_atmos_static_nest_filename; a FORTRAN character string + ! specifying the full-path to the FV3 file containing the static + ! atmosphere model fields for the nested-grid tile, namely the + ! vertical coordinate coefficients. + + ! * fv3_atmos_static_parent_filename; a FORTRAN character string + ! specifying the full-path to the FV3 file containing the static + ! atmosphere model fields for the parent tile within which the + ! nested-grid is embedded, namely the vertical coordinate + ! coefficients. + + ! * fv3_background_filename; a FORTRAN character string specifying + ! the full-path to the FV3 restart-formatted file containing the + ! data-assimilation method/algorithm defined/derived "background" + ! (e.g., first-guess) state variables. + + ! * fv3_gridspec_filename; a FORTRAN character string specifying the + ! full-path to the FV3 containing the grid specifications and + ! attributes corresponding to the variables defined within + ! fv3_analysis_filename and fv3_background_filename (above). + + ! * fv3_gridspec_nest_filename; a FORTRAN character string + ! specifying the full-path to the FV3 file containing the + ! nested-tile grid specifications and attributes. + + ! * fv3_gridspec_parent_filename; a FORTRAN character string + ! specifying the full-path to the FV3 file containing the parent + ! tile grid specifications and attributes. + + ! * fv3_presvar_nest_filename; a FORTRAN character string specifying + ! the full-path to the file containing the FV3 nested-tile + ! variable 'delp' values; this is typically a FV3 + ! restart-formatted file. + + ! * fv3_presvar_parent_filename; a FORTRAN character string + ! specifying the full-path to the file containing the FV3 parent + ! tile variable 'delp' values; this is typically a FV3 + ! restart-formatted file. + + ! * fv3_var_nest_filename; a FORTRAN character string specifying the + ! full-path to the file containing the FV3 nested-tile variable + ! values; this is typically a FV3 restart-formatted file. + + ! * fv3_var_parent_filename; a FORTRAN character string specifying + ! the full-path to the file containing the FV3 parent tile + ! variable values; this is typically a FV3 restart-formatted file. + + ! * is_bcupdate; a FORTRAN logical variable specifying whether the + ! data-assimilation defined/defived increment values are to be + ! relaxed to a value of zero in accordance with the user specified + ! relaxation region (see npad_cells and nrelax_cells, below). + + ! * is_ensgen; a FORTRAN logical variable specifying whether to + ! generate ensemble member initial perturbations/uncertainty (see + ! ensgen_json_vtable and ensmem_filename); currently only + ! NEMS-formatted files are supported. + + ! * is_ensgen_regional; a FORTRAN logical variable specifying + ! whether to localize perturbations relative to a specified + ! location; currently this is supported only for tropical cyclone + ! (TC) locations (see tcv_filename). + + ! * is_fv3; a FORTRAN logical variable specifying whether the + ! forecast model is the Finite-Volume Cubed-Sphere (FV3). + + ! * is_fv3_tracers; a FORTRAN logical variable specifying whether + ! the FV3 files contain the tracer variables; this check is + ! required since the netcdf file grid dimension variable names and + ! availability change as a function of FV3 variable-type files and + ! for tracer variables, there are no horizontally staggered + ! fields. + + ! * is_interp_llp; a FORTRAN logical variable specifying whether to + ! use linear-log methods to remap/interpolate profile variable + ! values to a pressure level coordinate. + + ! * is_merge; a FORTRAN logical variable specifying whether the + ! algorithms are to be applied to merge user specified FV3 + ! variables from nested-grid forecast solutions into the + ! corresponding parent-tile forecast solutions. + + ! * is_nemsio; a FORTRAN logical variable specifying whether the + ! external file for the ensemble member generation routines is of + ! NEMS-format; this is (currently) the only supported option (see + ! is_ensgen, ensgen_json_vtable, and ensmem_filename). + + ! * is_read_pattern; a FORTRAN logical variable specifying whether + ! to read in a previously created random-number pattern file + ! required to generate a given ensemble member. + + ! * is_remap_pres; a FORTRAN logical variable specifying whether to + ! remap/interpolate the profile variables to the new pressure + ! level coordinate; this applies to only nest-to-parent merging + ! applications. + + ! * is_slint; a FORTRAN logical variable specifying whether the + ! remapping coefficients are defined via the SLINT interpolation + ! algorithm (Wang, 2006); currently this is the default and is not + ! able to be modified by the user. + + ! * json_fv3var_filename; a FORTRAN character string specifying the + ! full-path to the JSON-formatted file containing the FV3 variable + ! attributes. + + ! * npad_cells; a FORTRAN integer value specifying the number of + ! cells, relative to the nested domain size, across which all + ! data-assimilation defined/derived increment values are set to + ! zero. + + ! * nrelax_cells; a FORTRAN integer value specifying the number of + ! grid cells across which to relax the data-assimilation + ! defined/derived increments to zero. + + ! * rng_seed; a FORTRAN integer specifying the random number seed + ! applied to generate the the stochastic random pattern applied + ! for ensemble member generation. + + ! * tc_region_area; a FORTRAN 4-byte real valued variable specifying + ! the size of the region, relative to a TC-vitals record, which to + ! merge into a different (i.e., parent) domain; units are degrees. + + ! * tcv_filename; a FORTRAN character string specifying the + ! full-path to the TC-vitals formatted file. + + !----------------------------------------------------------------------- + + ! Define local variables + + character(len=500) :: & + & datapath = './' + character(len=500) :: & + & ensgen_json_vtable = 'NOT USED' + character(len=500) :: & + & ensmem_filename = 'NOT USED' + character(len=500) :: & + & ensmem_pattern_filename = 'NOT USED' + character(len=500) :: & + & fv3_analysis_filename = 'NOT USED' + character(len=500) :: & + & fv3_atmos_static_nest_filename = 'NOT USED' ! NEED + character(len=500) :: & + & fv3_atmos_static_parent_filename = 'NOT USED' ! NEED + character(len=500) :: & + & fv3_background_filename = 'NOT USED' + character(len=500) :: & + & fv3_gridspec_filename = 'NOT USED' + character(len=500) :: & + & fv3_gridspec_nest_filename = 'NOT USED' + character(len=500) :: & + & fv3_gridspec_parent_filename = 'NOT USED' + character(len=500) :: & + & fv3_presvar_nest_filename = 'NOT USED' ! NEED + character(len=500) :: & + & fv3_presvar_parent_filename = 'NOT USED' ! NEED + character(len=500) :: & + & fv3_var_nest_filename = 'NOT USED' + character(len=500) :: & + & fv3_var_parent_filename = 'NOT USED' + character(len=500) :: & + & json_fv3var_filename = 'NOT USED' + character(len=500) :: & + & tcv_filename = 'NOT USED' + logical :: & + & debug = .false. + logical :: & + & is_bcupdate = .false. + logical :: & + & is_ensgen = .false. + logical :: & + & is_ensgen_regional = .false. + logical :: & + & is_fv3 = .false. + logical :: & + & is_fv3_tracers = .false. + logical :: & + & is_interp_llp = .false. + logical :: & + & is_merge = .false. + logical :: & + & is_nemsio = .false. + logical :: & + & is_read_pattern = .true. + logical :: & + & is_remap_pres = .false. ! NEED + logical :: & + & is_slint = .true. + real(r_kind) :: & + & adv_dtime = 3600.0 + real(r_kind) :: & + & corr_length = 500.0e3 + real(r_kind) :: & + & corr_stdev = 1.0 + real(r_kind) :: & + & corr_tau = 21600.0 + real(r_kind) :: & + & domain_blend_ratio = 1.0 + real(r_kind) :: & + & tc_region_area = 11.0 + integer :: & + & corr_nmax = 100 + integer :: & + & ensgen_ntrunc = 1534 + integer :: & + & npad_cells = 1 + integer :: & + & nrelax_cells = 10 + integer :: & + & rng_seed = 1234 + namelist /share/ debug, datapath, is_bcupdate, is_bcupdate, & + & is_ensgen, is_fv3, is_merge, is_nemsio + namelist /bcupdate/ npad_cells, nrelax_cells + namelist /ensgen/ adv_dtime, corr_length, corr_nmax, corr_stdev, & + & corr_tau, ensgen_json_vtable, ensgen_ntrunc, ensmem_filename, & + & ensmem_pattern_filename, is_ensgen_regional, is_read_pattern, & + & rng_seed + namelist /fv3/ fv3_analysis_filename, & + & fv3_atmos_static_nest_filename, fv3_atmos_static_parent_filename, & + & fv3_background_filename, fv3_gridspec_filename, & + & fv3_gridspec_nest_filename, fv3_gridspec_parent_filename, & + & fv3_presvar_nest_filename, fv3_presvar_parent_filename, & + & fv3_var_nest_filename, fv3_var_parent_filename, is_fv3_tracers, & + & json_fv3var_filename + namelist /interp/ domain_blend_ratio, is_interp_llp, is_remap_pres, & + & is_slint + namelist /tc/ tc_region_area, tcv_filename + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! namelist.f90 + + ! DESCRIPTION: + + ! This subroutine acts as the interface to the namelist file, + ! provided as 'analysis-update.input' by the user. + + !----------------------------------------------------------------------- + + subroutine namelist() + + ! Define variables computed within routine + + character(len=500) :: nml_filename + logical :: is_it_there + integer :: unit_nml + + !===================================================================== + + ! Define local variables + + nml_filename = './analysis-update.input' + unit_nml = 9 + is_it_there = .false. + inquire(file = trim(adjustl(nml_filename)),exist = is_it_there) + + ! Check local variable and proceed accordingly + + if(is_it_there) then + + ! Define local variables + + open(file = trim(adjustl(nml_filename)), & + unit = unit_nml , & + status = 'old' , & + form = 'formatted' , & + action = 'read') + read(unit_nml,NML = share) + read(unit_nml,NML = bcupdate) + read(unit_nml,NML = ensgen) + read(unit_nml,NML = fv3) + read(unit_nml,NML = interp) + read(unit_nml,NML = tc) + close(unit_nml) + + else ! if(is_it_there) + + ! Define local variables + + write(6,500) trim(adjustl(nml_filename)) + stop(99) + + end if ! if(is_it_there) + + ! Define local variables + + write(6,*) '&SHARE' + write(6,*) 'DATAPATH = ', & + & trim(adjustl(datapath)) + write(6,*) 'DEBUG = ', debug + write(6,*) 'IS_BCUPDATE = ', is_bcupdate + write(6,*) 'IS_FV3 = ', is_fv3 + write(6,*) 'IS_MERGE = ', is_merge + write(6,*) '/' + write(6,*) '&BCUPDATE' + write(6,*) 'NPAD_CELLS = ', npad_cells + write(6,*) 'NRELAX_CELLS = ', nrelax_cells + write(6,*) '/' + write(6,*) '&ENSGEN' + write(6,*) 'ADV_DTIME = ', adv_dtime + write(6,*) 'CORR_LENGTH = ', corr_length + write(6,*) 'CORR_NMAX = ', corr_nmax + write(6,*) 'CORR_STDEV = ', corr_stdev + write(6,*) 'CORR_TAU = ', corr_tau + write(6,*) 'ENSGEN_JSON_VTABLE = ', & + & trim(adjustl(ensgen_json_vtable)) + write(6,*) 'ENSGEN_NTRUNC = ', ensgen_ntrunc + write(6,*) 'ENSMEM_FILENAME = ', & + & trim(adjustl(ensmem_filename)) + write(6,*) 'ENSMEM_PATTERN_FILENAME = ', & + & trim(adjustl(ensmem_pattern_filename)) + write(6,*) 'IS_ENSGEN_REGIONAL = ', is_ensgen_regional + write(6,*) 'IS_READ_PATTERN = ', is_read_pattern + write(6,*) 'RNG_SEED = ', rng_seed + write(6,*) '/' + write(6,*) '&FV3' + write(6,*) 'FV3_ANALYSIS_FILENAME = ', & + & trim(adjustl(fv3_analysis_filename)) + write(6,*) 'FV3_ATMOS_STATIC_NEST_FILENAME = ', & + & trim(adjustl(fv3_atmos_static_nest_filename)) + write(6,*) 'FV3_ATMOS_STATIC_PARENT_FILENAME = ', & + & trim(adjustl(fv3_atmos_static_parent_filename)) + write(6,*) 'FV3_BACKGROUND_FILENAME = ', & + & trim(adjustl(fv3_background_filename)) + write(6,*) 'FV3_GRIDSPEC_FILENAME = ', & + & trim(adjustl(fv3_gridspec_filename)) + write(6,*) 'FV3_GRIDSPEC_NEST_FILENAME = ', & + & trim(adjustl(fv3_gridspec_nest_filename)) + write(6,*) 'FV3_GRIDSPEC_PARENT_FILENAME = ', & + & trim(adjustl(fv3_gridspec_parent_filename)) + write(6,*) 'FV3_PRESVAR_NEST_FILENAME = ', & + & trim(adjustl(fv3_presvar_nest_filename)) + write(6,*) 'FV3_PRESVAR_PARENT_FILENAME = ', & + & trim(adjustl(fv3_presvar_parent_filename)) + write(6,*) 'FV3_VAR_NEST_FILENAME = ', & + & trim(adjustl(fv3_var_nest_filename)) + write(6,*) 'FV3_VAR_PARENT_FILENAME = ', & + & trim(adjustl(fv3_var_parent_filename)) + write(6,*) 'IS_FV3_TRACERS = ', is_fv3_tracers + write(6,*) 'JSON_FV3VAR_FILENAME = ', & + & trim(adjustl(json_fv3var_filename)) + write(6,*) '/' + write(6,*) '&INTERP' + write(6,*) 'DOMAIN_BLEND_RATIO = ', domain_blend_ratio + write(6,*) 'IS_INTERP_LLP = ', is_interp_llp + write(6,*) 'IS_REMAP_PRES = ', is_remap_pres + write(6,*) 'IS_SLINT = ', is_slint + write(6,*) '/' + write(6,*) '&TC' + write(6,*) 'TC_REGION_AREA = ', tc_region_area + write(6,*) 'TCV_FILENAME = ', & + & trim(adjustl(tcv_filename)) + write(6,*) '/' + write(6,501) +500 format('NAMELISTPARAMS: ', a, ' not found in the current working ', & + & 'directory. ABORTING!!!!') +501 format(/) + + !===================================================================== + + end subroutine namelist + + !======================================================================= + +end module namelist_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/nemsio_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/nemsio_interface.F90 new file mode 100644 index 000000000..9817280a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/nemsio_interface.F90 @@ -0,0 +1,397 @@ +module nemsio_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: nemsio_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use gridprojs_interface + use kinds_interface + use namelist_interface + use nemsio_module + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: nemsio_interface_date_read + public :: nemsio_interface_date_write + public :: nemsio_interface_init + public :: nemsio_interface_read + public :: nemsio_interface_write + + ! Define local variables + + type(nemsio_gfile) :: gfile + integer(nemsio_intkind) :: iret + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! compute_grid.f90 + + ! DESCRIPTION: + + ! This subroutine computes the geographical Gaussian grid + ! described/defined by the NEMS spectral truncation. + + ! INPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing (at minimum) + ! the NEMS spectral truncation. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the + ! geographical Gaussian grid described/defined by the NEMS + ! spectral truncation. + + !----------------------------------------------------------------------- + + subroutine compute_grid(nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + + ! Define variables computed within routine + + type(specgrids_grid) :: grid + + !===================================================================== + + ! Check local variable + + if(nemsio%jcap .gt. 0) then + + ! Define local variables + + grid%ntrunc = nemsio%jcap + + else ! if(nemsio%jcap .gt. 0) + + ! Define local variables + + grid%ntrunc = nint(nemsio%nx/2.0) + + end if ! if(nemsio%jcap .gt. 0) + + ! Define local variables + + if(debug) write(6,500) grid%ntrunc + + ! Compute local variables + + call specgrids_compute(grid) + + ! Define local variables + + if(debug) write(6,501) grid%nlons, grid%nlats + nemsio%lat = grid%lats + nemsio%lon = grid%lons + + ! Deallocate memory for local variables + + call specgrids_cleanup(grid) + + ! Define local variables + +500 format('COMPUTE_GRID: Computing spectral transform grid of ', & + & 'trunction T',i4,'.') +501 format('COMPUTE_GRID: Spectral grid dimensions (nx,ny) = ',i4,1x,i4, & + & '.') + + !===================================================================== + + end subroutine compute_grid + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_interface_date_read.f90 + + ! DESCRIPTION: + + ! This subroutine is the interface layer to the NEMS header and + ! collects the idate variable array values. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the attributes + ! of the idate variable array. + + !----------------------------------------------------------------------- + + subroutine nemsio_interface_date_read(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call nemsio_open(gfile,trim(adjustl(filename)),'read',iret=iret) + call nemsio_getfilehead(gfile,iret=iret,idate=nemsio%idate) + call nemsio_close(gfile,iret=iret) + + !===================================================================== + + end subroutine nemsio_interface_date_read + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_interface_date_write.f90 + + ! DESCRIPTION: + + ! This subroutine is the interface layer to the NEMS header and + ! writes the idate variable array values to the NEMS-formatted file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + !----------------------------------------------------------------------- + + subroutine nemsio_interface_date_write(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + ! Define variables computed within routine + + integer(nemsio_intkind) :: idate(7) + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, size(idate) + + ! Define local variables + + idate(i) = nemsio%idate(i) + + end do ! do i = 1, size(idate) + + ! Define local variables + + call nemsio_open(gfile,trim(adjustl(filename)),'rdwr',iret=iret) + call nemsio_setheadvar(gfile,varname='idate',varval=idate,iret=iret) + call nemsio_close(gfile,iret=iret) + + !===================================================================== + + end subroutine nemsio_interface_date_write + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_interface_init.f90 + + ! DESCRIPTION: + + ! This subroutine parses a user specified NEMS formatted file header + ! and returns the header attributes describing the grid. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the values + ! retrieved from the NEMS formatted file. + + !----------------------------------------------------------------------- + + subroutine nemsio_interface_init(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call nemsio_init(iret=iret) + call nemsio_open(gfile,trim(adjustl(filename)),'read',iret=iret) + call nemsio_getfilehead(gfile,iret=iret,dimx=nemsio%nx,dimy= & + & nemsio%ny,dimz=nemsio%nz,jcap=nemsio%jcap,idate=nemsio%idate) + + ! Check local variable and proceed accordingly + + if(nemsio%jcap .le. 0) then + + ! Define local variables + + nemsio%jcap = ensgen_ntrunc + + end if ! if(nemsio%jcap .le. 0) + + ! Define local variables + + call variable_interface_setup_struct(nemsio) + + ! Compute local variables + + call compute_grid(nemsio) + + ! Define local variables + + call nemsio_close(gfile,iret=iret) + + !===================================================================== + + end subroutine nemsio_interface_init + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_interface_read.f90 + + ! DESCRIPTION: + + ! This subroutine is the interface layer to read different NEMS + ! variable types from an external NEMS-formatted file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable containing (at mininum) + ! the NEMS formatted file variable name. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the values + ! retrieved from the NEMS formatted file. + + !----------------------------------------------------------------------- + + subroutine nemsio_interface_read(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call nemsio_open(gfile,trim(adjustl(filename)),'read',iret=iret) + call nemsio_readrecv(gfile,trim(adjustl(nemsio%varname)),levtyp= & + & trim(adjustl(nemsio%levtype)),lev=nemsio%lev,data=nemsio%var, & + & iret=iret) + call nemsio_close(gfile,iret=iret) + + !===================================================================== + + end subroutine nemsio_interface_read + + !======================================================================= + + ! SUBROUTINE: + + ! nemsio_interface_write.f90 + + ! DESCRIPTION: + + ! This subroutine is the interface layer to write NEMS variable + ! types to an external NEMS-formatted file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the NEMS formatted file. + + ! * nemsio; a FORTRAN nems_struct variable containing (at mininum) + ! the NEMS formatted file name and the variable attributes to be + ! written. + + !----------------------------------------------------------------------- + + subroutine nemsio_interface_write(filename,nemsio) + + ! Define variables passed to routine + + type(nems_struct) :: nemsio + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call nemsio_open(gfile,trim(adjustl(filename)),'rdwr',iret=iret) + call nemsio_writerecv(gfile,trim(adjustl(nemsio%varname)),levtyp= & + & trim(adjustl(nemsio%levtype)),lev=nemsio%lev,data=nemsio%var, & + & iret=iret) + call nemsio_close(gfile,iret=iret) + + !===================================================================== + + end subroutine nemsio_interface_write + + !======================================================================= + +end module nemsio_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/netcdf_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/netcdf_interface.F90 new file mode 100644 index 000000000..cb449c697 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/netcdf_interface.F90 @@ -0,0 +1,1337 @@ +module netcdf_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: netcdf_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + use netcdf + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: ncdimid + public :: ncfileid + public :: ncstatus + public :: ncvarid + public :: netcdf_interface_close + public :: netcdf_interface_getattr + public :: netcdf_interface_getdim + public :: netcdf_interface_getvar + public :: netcdf_interface_open + public :: netcdf_interface_putattr + public :: netcdf_interface_putvar + public :: netcdf_interface_writedef + interface netcdf_interface_getattr + module procedure getattr_char + module procedure getattr_real + end interface netcdf_interface_getattr + interface netcdf_interface_getvar + module procedure getvar_real + module procedure getvar_real_1d + module procedure getvar_real_2d + module procedure getvar_real_3d + module procedure getvar_real_4d + end interface netcdf_interface_getvar + interface netcdf_interface_putattr + module procedure putattr_char + module procedure putattr_int + module procedure putattr_real + end interface netcdf_interface_putattr + interface netcdf_interface_putvar + module procedure putvar_char_1d + module procedure putvar_real_1d + module procedure putvar_real_2d + module procedure putvar_real_3d + module procedure putvar_real_4d + end interface netcdf_interface_putvar + + ! Define local variables + + integer :: ncdimid + integer :: ncfileid + integer :: ncstatus + integer :: ncvarid + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! getattr_char.f90 + + ! DESCRIPTION: + + ! This subroutine retrieves a character attribute from a netcdf + ! file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN character string to contain the netcdf attribute + ! value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN character string specifying the netcdf attribute + ! value. + + !----------------------------------------------------------------------- + + subroutine getattr_char(filename,attrname,var,varname) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: attrname + character(len=100), optional :: varname + character(len=*) :: var + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_get_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine getattr_char + + !======================================================================= + + ! SUBROUTINE: + + ! getattr_real.f90 + + ! DESCRIPTION: + + ! This subroutine retrieves a 4-byte real-valued attribute from a + ! netcdf file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN 4-byte real-valued variable to contain the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 4-byte real-valued variable specifying the netcdf + ! attribute value. + + !----------------------------------------------------------------------- + + subroutine getattr_real(filename,attrname,var,varname) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: attrname + character(len=100), optional :: varname + real(r_kind) :: var + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_get_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine getattr_real + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real.f90 + + ! DESCRIPTION: + + ! This subroutine reads a scalar variable from a user specified + ! netcdf file specified by the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-byte precision variable to contain the contents + ! of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 4-byte precision variable containing the contents + ! of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine getvar_real + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_1d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 1-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 1-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 1-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_1d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:) + + ! Define variables computed within routine + + real(r_kind), dimension(:), allocatable :: workgrid + integer :: d1 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_1d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_2d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 2-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 2-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 2-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_2d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:) + + ! Define variables computed within routine + + real(r_kind), dimension(:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1)) + d2 = size(var(1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_2d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_3d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 3-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 3-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 3-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_3d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:) + + ! Define variables computed within routine + + real(r_kind), dimension(:,:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + integer :: d3 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1,1)) + d2 = size(var(1,:,1)) + d3 = size(var(1,1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_3d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_4d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 4-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 4-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_4d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:,:) + + ! Define variables computed within routine + + real(r_kind), dimension(:,:,:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + integer :: d3 + integer :: d4 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1,1,1)) + d2 = size(var(1,:,1,1)) + d3 = size(var(1,1,:,1)) + d4 = size(var(1,1,1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3,d4)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_4d + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_close.f90 + + ! DESCRIPTION: + + ! This subroutine closes a Network Common Data Format (netcdf) file + ! defined by the FORTRAN integer variable ncfileid. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_close() + + !===================================================================== + + ! Define local variables + + ncstatus = nf90_close(ncfileid) + + !===================================================================== + + end subroutine netcdf_interface_close + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_getdim.f90 + + ! DESCRIPTION: + + ! This subroutine assigns the dimension value associated with the + ! netcdf API key specified by the user. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * dimname; a FORTRAN character string specifying the netcdf API + ! key for the respective netcdf dimension variable. + + ! * dimval; a FORTRAN integer variable to contain the netcdf + ! dimension value. + + ! OUTPUT VARIABLES: + + ! * dimval; a FORTRAN integer value specifying the netcdf dimension + ! value. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_getdim(filename,dimname,dimval) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: dimname + integer :: dimval + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_dimid(ncfileid,trim(adjustl(dimname)),ncdimid) + ncstatus = nf90_inquire_dimension(ncfileid,ncdimid,len=dimval) + call netcdf_interface_close() + + !===================================================================== + + end subroutine netcdf_interface_getdim + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_open.f90 + + ! DESCRIPTION: + + ! This subroutine opens a Network Common Data Format (netcdf) file + ! with permissions in accordance with the specifications of the + ! user; the global variable ncfileid is defined by this subroutine + ! until terminated by the subroutine netcdf_interface_close.f90. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * is_read; a FORTRAN logical variable specifying to open the + ! netcdf file with read-only permissions. + + ! * is_rdwr; a FORTRAN logical variable specifying to open the + ! netcdf file with read and write permissions. + + ! * is_write; a FORTRAN logical variable specifying to open a new + ! (and clobber any previous existence of a) the netcdf file with + ! write permissions. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_open(filename,is_read,is_rdwr,is_write) + + ! Define variables passed to routine + + character(len=500) :: filename + logical :: is_read + logical :: is_rdwr + logical :: is_write + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_read) then + + ! Define local variables + + ncstatus = nf90_open(trim(adjustl(filename)),nf90_nowrite, & + & ncfileid) + + end if ! if(is_read) + + ! Check local variable and proceed accordingly + + if(is_rdwr) then + + ! Define local variables + + ncstatus = nf90_open(trim(adjustl(filename)),nf90_write, & + & ncfileid) + + end if ! if(is_rdwr) + + ! Check local variable and proceed accordingly + + if(is_write) then + + ! Define local variables + + ncstatus = nf90_create(path=trim(adjustl(filename)), & + & cmode=or(nf90_clobber,nf90_64bit_offset),ncid=ncfileid) + + end if ! if(is_write) + + !===================================================================== + + end subroutine netcdf_interface_open + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_writedef.f90 + + ! DESCRIPTION: + + ! This subroutine writes the Network Common Data Format (netcdf) + ! file dimension and variable definition section. + + ! INPUT VARIABLES: + + ! * varinfo; a FORTRAN varinfo_struct variable containing the + ! dimension and variable definitions for the netcdf file. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_writedef(varinfo) + + ! Define variables passed to routine + + type(varinfo_struct) :: varinfo + + ! Define variables computed within routine + + integer, dimension(:), allocatable :: dimid + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Loop through local variable + + do i = 1, varinfo%ndims + + ! Define local variables + + ncstatus = nf90_def_dim(ncfileid,trim(adjustl(varinfo%dimname(i))), & + & varinfo%dimval(i),varinfo%dimid(i)) + + end do ! do i = 1, varinfo + + ! Loop through local variable + + do i = 1, varinfo%nvars + + ! Allocate memory for local variables + + if(.not. allocated(dimid)) allocate(dimid(varinfo%varndims(i))) + + ! Loop through local variable + + do j = 1, varinfo%varndims(i) + + ! Define local variables + + dimid(j) = varinfo%vardimid(i,j) + + end do ! do j = 1, varinfo%varndims(i) + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'float') then + + ! Define local variables + + ncstatus = nf90_def_var(ncfileid, & + & trim(adjustl(varinfo%varname(i))),nf90_float, & + & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) + + end if ! if(varinfo%vartype(i) .eq. 'float') + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'integer') then + + ! Define local variables + + ncstatus = nf90_def_var(ncfileid, & + & trim(adjustl(varinfo%varname(i))),nf90_int, & + & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) + + end if ! if(varinfo%vartype(i) .eq. 'integer') + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'char') then + + ! Define local variables + + ncstatus = nf90_def_var(ncfileid, & + & trim(adjustl(varinfo%varname(i))),nf90_char, & + & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) + + end if ! if(varinfo%vartype(i) .eq. 'char') + + ! Loop through local variable + + do j = 1, varinfo%varnattrs(i) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & + & trim(adjustl(varinfo%varattrs(i,j,1))), & + & trim(adjustl(varinfo%varattrs(i,j,2)))) + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'float') then + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & + & '_FillValue',spval) + + end if ! if(varinfo%vartype(i) .eq. 'float') + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'integer') then + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & + & '_FillValue',-99) + + end if ! if(varinfo%vartype(i) .eq. 'integer') + + end do ! do j = 1, varinfo%varnattrs(i) + + ! Deallocate memory for local variables + + if(allocated(dimid)) deallocate(dimid) + + end do ! do i = 1, varinfo%nvars + + ! Define local variables + + ncstatus = nf90_enddef(ncfileid) + + !===================================================================== + + end subroutine netcdf_interface_writedef + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_char.f90 + + ! DESCRIPTION: + + ! This subroutine writes a character attribute to a netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN character string to contain the netcdf attribute + ! value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_char(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + character(len=*) :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_char + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_int.f90 + + ! DESCRIPTION: + + ! This subroutine writes a 4-byte integer-value variable attribute + ! to a netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN 4-byte integer variable containing the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_int(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + integer :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_int + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_real.f90 + + ! DESCRIPTION: + + ! This subroutine writes a 4-byte real-valued variable attribute to + ! a netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN 4-byte real-valued variable containing the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_real(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + real(r_kind) :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_real + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_char_1d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 1-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 1-dimensional character variable array containing + ! the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_char_1d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + character(len=*) :: var(:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,varname,ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_char_1d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_1d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 1-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 1-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_1d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_1d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_2d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 2-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 2-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_2d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_2d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_3d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 3-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 3-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_3d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:) + + ! Define variables computed within routine + + integer :: start(3) + integer :: count(3) + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + count = (/size(var(:,1,1)),size(var(1,:,1)),1/) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + + ! Loop through local variable + + do i = 1, size(var(1,1,:)) + + ! Define local variables + + start = (/1,1,i/) + ncstatus = nf90_put_var(ncfileid,ncvarid,var(:,:,i),start=start, & + & count=count) + + end do ! do i = 1, size(var(1,1,:)) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_3d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_4d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 4-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_4d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:,:) + + ! Define variables computed within routine + + integer :: start(4) + integer :: count(4) + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + count = (/size(var(:,1,1,1)),size(var(1,:,1,1)),1,1/) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + + ! Loop through local variable + + do i = 1, size(var(1,1,1,:)) + + ! Loop through local variable + + do j = 1, size(var(1,1,:,i)) + + ! Define local variables + + start = (/1,1,j,i/) + ncstatus = nf90_put_var(ncfileid,ncvarid,var(:,:,j,i), & + & start=start,count=count) + + end do ! do j = 1, size(var(1,1,:,i)) + + end do ! do i = 1, size(var(1,1,1,:)) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_4d + + !======================================================================= + +end module netcdf_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/pattern_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/pattern_interface.F90 new file mode 100644 index 000000000..c5d999db0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/pattern_interface.F90 @@ -0,0 +1,481 @@ +module pattern_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: pattern_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kinds_interface + use math_methods_interface + use namelist_interface + use shtns + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: pattern_interface_compute + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! advance_autoregression.f90 + + ! DESCRIPTION: + + ! This subroutine advances a first-order autoregressive processed + ! with specfied auto-correlated and variance spectrum. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! updated noise (e.g., white noise) spectrum via the + ! auto-regressive process. + + !----------------------------------------------------------------------- + + subroutine advance_autoregression(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + complex(r_kind), dimension(:), allocatable :: noise + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(noise)) allocate(noise(pattern%ndimspec)) + + ! Define local variables + + noise = pattern%noise + + ! Compute local variables + + call white_noise_spectrum(pattern) + noise = pattern%phi*noise + pattern%stdev*sqrt(1.0 - pattern%phi & + & **2.0)*pattern%varspec*pattern%noise + + ! Define local variables + + pattern%noise = noise + + ! Deallocate memory for local variables + + if(allocated(noise)) deallocate(noise) + + !===================================================================== + + end subroutine advance_autoregression + + !======================================================================= + + ! SUBROUTINE: + + ! define_random_seed.f90 + + ! DESCRIPTION: + + ! This subroutine provides a wrapper around the FORTRAN 90 random + ! number generator (RNG) initialized via a 'seed' for the RNG; the + ! random number (RN) seed is passed to this routine via the FORTRAN + ! pattern_struct variable 'seed' attribute. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + !----------------------------------------------------------------------- + + subroutine define_random_seed(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define variables computed within routine + + integer, dimension(:), allocatable :: seed + integer :: nseed + + !===================================================================== + + ! Define local variables + + call random_seed() + call random_seed(size = nseed) + + ! Allocate memory for local variables + + if(.not. allocated(seed)) allocate(seed(nseed)) + + ! Define local variables + + seed(1:nseed) = pattern%seed + call random_seed(put = seed(1:nseed)) + + ! Deallocate memory for local variables + + if(allocated(seed)) deallocate(seed) + + !===================================================================== + + end subroutine define_random_seed + + !======================================================================= + + ! SUBROUTINE: + + ! gaussian_spectrum.f90 + + ! DESCRIPTION: + + ! This subroutine will define a variance spectrum assuming isotropic + ! Gaussian covariance which is normalized with respect to a global + ! variance of 1.0. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! normalized Gaussian variance spectra. + + !----------------------------------------------------------------------- + + subroutine gaussian_spectrum(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 0, pattern%ntrunc + + ! Define local variables + + pattern%varspec1d(i) = exp(-1.0*pattern%lengthscale**2.0*(float(i) & + & *(float(i)+1.0))/(4.0*rearth_equator**2.0)) + + end do ! do i = 0, pattern%ntrunc + + ! Define local variables + + pattern%varspec = sqrt(pattern%ntrunc*exp(pattern%lengthscale**2.0* & + & pattern%lap/(4.0*rearth_equator**2.0))) + pattern%noise = cmplx(0.0,0.0) + + ! Loop through local variable + + do i = 1, pattern%ndimspec + + ! Check local variable and proceed accordingly + + if(pattern%order(i) .ne. 0.0) then + + ! Define local variables + + pattern%noise(i) = cmplx(1.0,1.0)/sqrt(2.0*pattern%degree(i) + & + & 1.0) + + else ! if(pattern%order(i) .ne. 0.0) + + ! Define local variables + + pattern%noise(i) = sqrt(2.0)/(sqrt(2.0*pattern%degree(i) + 1.0)) + + end if ! if(pattern%order(i) .ne. 0.0) + + end do ! do i = 1, pattern%ndimspec + + ! Define local variables + + pattern%noise(1) = cmplx(0.0,0.0) + pattern%noise = pattern%noise*sqrt(pattern%normfact/ & + & pattern%ntrunc) + pattern%noise = pattern%noise*pattern%varspec + + ! Compute local variables + + call spectrum_variance(pattern) + + ! Define local variables + + pattern%varspec = pattern%varspec/sqrt(pattern%vari) + pattern%varspec1d = pattern%varspec1d/pattern%vari + + !===================================================================== + + end subroutine gaussian_spectrum + + !======================================================================= + + ! SUBROUTINE: + + ! pattern_interface_compute.f90 + + ! DESCRIPTION: + + ! This subroutine is the driver routine to compute a random number, + ! yet spatially and temporally correlated, pattern initiated from a + ! Gaussian 'white' noise spectrum and advanced using auto-regressive + ! process. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the random + ! number, spatially and temporally correlated, pattern within the + ! 'rnp' attribute. + + !----------------------------------------------------------------------- + + subroutine pattern_interface_compute(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + call variable_interface_setup_struct(pattern) + pattern%dt = adv_dtime + pattern%seed = rng_seed + pattern%lengthscale = corr_length + pattern%normfact = 2.0*pi + pattern%stdev = corr_stdev + pattern%tau = corr_tau + pattern%type = 'GAU' + pattern%degree = (/((j,j=i,pattern%ntrunc),i=0,pattern%ntrunc)/) + pattern%order = (/((i,j=i,pattern%ntrunc),i=0,pattern%ntrunc)/) + pattern%lap = -pattern%degree*(pattern%degree + 1.0) + pattern%phi = exp(-pattern%dt/pattern%tau) + + ! Compute local variables + + call define_random_seed(pattern) + call gaussian_spectrum(pattern) + call white_noise_spectrum(pattern) + + ! Loop through local variable + + do i = 1, corr_nmax + + ! Compute local variables + + call advance_autoregression(pattern) + call spectrum_variance(pattern) + + end do ! do i = 1, corr_nmax + + ! Define local variables + + call shtns_init(pattern%nx,pattern%ny,pattern%ntrunc) + + ! Compute local variables + + call spectogrd(pattern%noise,pattern%rnp) + + ! Deallocate memory for local variables + + call shtns_destroy() + + !===================================================================== + + end subroutine pattern_interface_compute + + !======================================================================= + + ! SUBROUTINE: + + ! spectrum_variance.f90 + + ! DESCRIPTION: + + ! This subroutine computes the globally integrated variance from the + ! spectral coefficients. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containing the + ! globally integrated variance within the 'vari' attribute. + + !----------------------------------------------------------------------- + + subroutine spectrum_variance(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + pattern%vari = 0.0 + + ! Loop through local variable + + do i = 1, pattern%ndimspec + + ! Check local variable and proceed accordingly + + if(pattern%order(i) .eq. 0) then + + ! Define local variables + + pattern%vari = pattern%vari + pattern%noise(i)* & + & conjg(pattern%noise(i)) + + else ! if(pattern%order(i) .eq. 0) + + ! Define local variables + + pattern%vari = pattern%vari + 0.5*pattern%noise(i)* & + & conjg(pattern%noise(i)) + + end if ! if(pattern%order(i) .eq. 0) + + end do ! do i = 1, pattern%ndimspec + + ! Define local variables + + pattern%vari = pattern%vari/pattern%normfact + + !===================================================================== + + end subroutine spectrum_variance + + !======================================================================= + + ! SUBROUTINE: + + ! white_noise_spectrum.f90 + + ! DESCRIPTION: + + ! This subroutine generates a 'white' noise spectrum, assuming unit + ! variance, in spectral space. + + ! INPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * pattern; a FORTRAN pattern_struct variable containined the + ! 'white' noise spectrum within the 'noise' attribute. + + !----------------------------------------------------------------------- + + subroutine white_noise_spectrum(pattern) + + ! Define variables passed to routine + + type(pattern_struct) :: pattern + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, pattern%ndimspec + + ! Check local variable and proceed accordingly + + if(pattern%order(i) .ne. 0.0) then + + ! Define local variables + + pattern%noise(i) = cmplx(math_methods_rnorm(), & + & math_methods_rnorm())/sqrt(2.0*pattern%degree(i) + 1.0) + + else ! if(pattern%order(i) .ne. 0.0) + + ! Define local variables + + pattern%noise(i) = sqrt(2.0)*math_methods_rnorm()/ & + & (sqrt(2.0*pattern%degree(i) + 1.0)) + + end if ! if(pattern%order(i) .ne. 0.0) + + end do ! do i = 1, pattern%ndimspec + + ! Define local variables + + pattern%noise(1) = 0.0 + pattern%noise = pattern%noise*sqrt(pattern%normfact/pattern%ntrunc) + + !===================================================================== + + end subroutine white_noise_spectrum + + !======================================================================= + +end module pattern_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/time_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/time_methods_interface.F90 new file mode 100644 index 000000000..906b20147 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/time_methods_interface.F90 @@ -0,0 +1,383 @@ +module time_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: time_methods_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associate modules and subroutines + + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: time_methods_interface_attrs + public :: time_methods_interface_dseconds + public :: time_methods_interface_julian + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! date_attributes.f90 + + ! DESCRIPTION: + + ! This subroutine returns the integer attributes from the user + ! specified integer defining the date to be parsed. + + ! INPUT VARIABLES: + + ! * dateint; a FORTRAN integer defining the date to be parsed. + + ! * yyyy; a FORTRAN integer value to specify the year for the parsed + ! date. + + ! * mm; a FORTRAN integer value to specify the month for the parsed + ! date. + + ! * dd; a FORTRAN integer value to specify the day for the parsed + ! date. + + ! * hh; a FORTRAN integer value to specify the hour of day for the + ! parsed date. + + ! * nn; a FORTRAN integer value to specify the minute of hour for + ! the parsed date. + + ! * ss; a FORTRAN integer value to specify the second of minute for + ! the parsed date. + + ! OUTPUT VARIABLES: + + ! * yyyy; a FORTRAN integer value specifying the year for the parsed + ! date. + + ! * mm; a FORTRAN integer value specifying the month for the parsed + ! date. + + ! * dd; a FORTRAN integer value specifying the day for the parsed + ! date. + + ! * hh; a FORTRAN integer value specifying the hour of day for the + ! parsed date. + + ! * nn; a FORTRAN integer value specifying the minute of hour for + ! the parsed date. + + ! * ss; a FORTRAN integer value specifying the second of minute for + ! the parsed date. + + !----------------------------------------------------------------------- + + subroutine date_attributes(datestr,yyyy,mm,dd,hh,nn,ss) + + ! Define variables passed to routine + + character(len=19) :: datestr + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + !===================================================================== + + ! Define local variables + + read(datestr(1:4), '(i4.4)') yyyy + read(datestr(6:7), '(i2.2)') mm + read(datestr(9:10), '(i2.2)') dd + read(datestr(12:13),'(i2.2)') hh + read(datestr(15:16),'(i2.2)') nn + read(datestr(18:19),'(i2.2)') ss + + !===================================================================== + + end subroutine date_attributes + + !======================================================================= + + ! SUBROUTINE: + + ! julian_day.f90 + + ! DESCRIPTION: + + ! This subroutine determines the Julian date corresponding the + ! Gregorian calendar attributes. + + ! REFERENCES: + + ! http://aa.usno.navy.mil/faq/docs/JD_Formula.php + + ! INPUT VARIABLES: + + ! * yyyy; a FORTRAN integer value specifying the Gregorian calendar + ! year. + + ! * mm; a FORTRAN integer value specifying the Gregorian calendar + ! month. + + ! * dd; a FORTRAN integer value specifying the Gregorian calendar + ! day. + + ! * hh; a FORTRAN integer value specifying the Gregorian calendar + ! hour of day. + + ! * nn; a FORTRAN integer value specifying the Gregorian calendar + ! minute of hour. + + ! * ss; a FORTRAN integer value specifying the Gregorian calendar + ! second of minute. + + ! * jday; a FORTRAN 8-byte real value to define the Julian date. + + ! OUTPUT VARIABLES: + + ! * jday; a FORTRAN 8-byte real value specifying the Julian date. + + !----------------------------------------------------------------------- + + subroutine julian_day(yyyy,mm,dd,hh,nn,ss,jday) + + ! Define variables passed to routine + + real(r_double) :: jday + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + ! Define variables computed within routine + + real(r_double) :: frac_day + + !===================================================================== + + ! Compute local variables + + jday = dble(dd - 32075 + 1461*(yyyy + 4800 + (mm - 14)/12)/4 + & + & 367*(mm - 2 - (mm - 14)/12*12)/12 - 3*((yyyy + 4900 + & + & (mm - 14)/12)/100)/4) + + ! Define local variables + + frac_day = jday*86400.0 + frac_day = frac_day + dble(hh*3600.0) + frac_day = frac_day + dble(nn*60.0) + frac_day = frac_day + dble(ss) + jday = frac_day/86400.0 + + !===================================================================== + + end subroutine julian_day + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_interface_attrs.f90 + + ! DESCRIPTION: + + ! This subroutine defines the time-attributes in accordance with the + ! timestamp (e.g., datestr) passed by the user. + + ! INPUT VARIABLES: + + ! * timeinfo; a FORTRAN timeinfo_struct variable containing the + ! time-stamp (e.g., the 'timestamp' attribute) to be parsed to + ! obtain the corresponding time-attributes. + + ! OUTPUT VARIABLES: + + ! * timeinfo; a FORTRAN timeinfo_struct variable containing the + ! time-attributes corresponding to the time-stamp (e.g., the + ! 'timestamp' attribute). + + !----------------------------------------------------------------------- + + subroutine time_methods_interface_attrs(timeinfo) + + ! Define variables passed to routine + + type(timeinfo_struct) :: timeinfo + + ! Define variables computed within routine + + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + !===================================================================== + + ! Define local variables + + call date_attributes(timeinfo%timestamp,yyyy,mm,dd,hh,nn,ss) + timeinfo%yy = yyyy + timeinfo%mm = mm + timeinfo%dd = dd + timeinfo%hh = hh + timeinfo%nn = nn + timeinfo%ss = ss + + !===================================================================== + + end subroutine time_methods_interface_attrs + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_interface_dseconds.f90 + + ! DESCRIPTION: + + ! This subroutine computes the time-offset (in seconds) between two + ! time-levels specified by the user. + + ! INPUT VARIABLES: + + ! * datestr1; a FORTRAN character string variable of length 19 + ! containing the first time-level; format is (assuming the + ! standard UNIX convention) %Y-%m-%d_%H:%M:%S. + + ! * datestr2; a FORTRAN character string variable of length 19 + ! containing the second time-level; format is (assuming the + ! standard UNIX convention) %Y-%m-%d_%H:%M:%S. + + ! * dseconds; a FORTRAN 4-byte real value to specify the time-offset + ! (in seconds) between the two time-levels specified by the user. + + ! OUTPUT VARIABLES: + + ! * dseconds; a FORTRAN 4-byte real value specifying the time-offset + ! (in seconds) between the two time-levels specified by the user. + + !----------------------------------------------------------------------- + + subroutine time_methods_interface_dseconds(datestr1,datestr2,dseconds) + + ! Define variables passed to routine + + character(len=19) :: datestr1 + character(len=19) :: datestr2 + real(r_kind) :: dseconds + + ! Define variables computed within routine + + real(r_double) :: jday1 + real(r_double) :: jday2 + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + !===================================================================== + + ! Define local variables + + call date_attributes(datestr1,yyyy,mm,dd,hh,nn,ss) + call julian_day(yyyy,mm,dd,hh,nn,ss,jday1) + call date_attributes(datestr2,yyyy,mm,dd,hh,nn,ss) + call julian_day(yyyy,mm,dd,hh,nn,ss,jday2) + + ! Compute local variables + + dseconds = (real(jday1 - jday2))*86400.0 + + !===================================================================== + + end subroutine time_methods_interface_dseconds + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_interface_julian.f90 + + ! DESCRIPTION: + + ! This subroutine computes the Julian date corresponding to the + ! specified time-stamp. + + ! INPUT VARIABLES: + + ! * datestr; a FORTRAN character string variable of length 19 + ! containing the time-stamp; format is (assuming the standard UNIX + ! convention) %Y-%m-%d_%H:%M:%S. + + ! * jday; a FORTRAN 4-byte real value to contain the Julian date. + + ! OUTPUT VARIABLES: + + ! * jday; a FORTRAN 4-byte real value to containing the Julian date. + + !----------------------------------------------------------------------- + + subroutine time_methods_interface_julian(datestr,jday) + + ! Define variables passed to routine + + character(len=19) :: datestr + real(r_double) :: jday + + ! Define variables computed within routine + + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + !===================================================================== + + ! Define local variables + + call date_attributes(datestr,yyyy,mm,dd,hh,nn,ss) + call julian_day(yyyy,mm,dd,hh,nn,ss,jday) + + !===================================================================== + + end subroutine time_methods_interface_julian + + !======================================================================= + +end module time_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/update_state_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/update_state_interface.F90 new file mode 100644 index 000000000..f46663db9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/update_state_interface.F90 @@ -0,0 +1,1114 @@ +module update_state_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: update_state_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associate modules and subroutines + + use constants_interface + use fileio_interface + use grid_methods_interface + use interpolation_interface + use kinds_interface + use namelist_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: update_state_init + public :: update_state_nest_lbcs + public :: update_state_nest_parent_merge + interface update_state_init + module procedure fv3_nest_parent_merge_init + module procedure fv3_nest_lbcs_init + end interface update_state_init + interface update_state_nest_lbcs + module procedure fv3_nest_lbcs + end interface update_state_nest_lbcs + interface update_state_nest_parent_merge + module procedure fv3_nest_parent_merge + end interface update_state_nest_parent_merge + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_nest_lbcs.f90 + + ! DESCRIPTION: + + ! This subroutine computes the data-assimilation derived increment + ! values and relaxes the increment values to a value of 0.0 as the + ! edges of the nested forecast domain are approached using a + ! relaxation mask defined by the user specified attributes; optional + ! clipping of negative (e.g., non-physical) values is performed if + ! specified. + + ! INPUT VARIABLES: + + ! * fv3var_anl; a FORTRAN fv3var_struct variable containing the + ! data-assimilation "analysis" variable attributes. + + ! * fv3var_bkgrd; a FORTRAN fv3var_struct variable containing the + ! data-assimilation "background" (e.g., first-guess) variable + ! attributes. + + ! * fv3grid; a FORTRAN fv3grid_struct variable containing (at + ! minimum) the increment relaxation mask values as determined by + ! the user specified relaxation region thresholds. + + ! * json_fv3var; a FORTRAN json_fv3var_struct variable containing + ! the attributes for the respective FV3 variable. + + ! OUTPUT VARIABLES: + + ! * fv3var_anl; a FORTRAN fv3var_struct variable containing the + ! updated "analysis" variable values determined by the relaxation + ! region thresholds (see fv3grid) and the respective variable + ! attributes (see json_fv3var). + + !----------------------------------------------------------------------- + + subroutine fv3_nest_lbcs(fv3var_anl,fv3var_bkgrd,fv3grid,json_fv3var) + + ! Define variables passed to routine + + type(fv3var_struct) :: fv3var_anl + type(fv3var_struct) :: fv3var_bkgrd + type(fv3grid_struct) :: fv3grid + type(json_fv3var_struct) :: json_fv3var + + ! Define variables computed within routine + + type(fv3var_struct) :: fv3var_incr + + ! Define counting variable + + integer :: i + + !===================================================================== + + ! Define local variables + + fv3var_incr%nx = fv3var_anl%nx + fv3var_incr%ny = fv3var_anl%ny + fv3var_incr%nz = fv3var_anl%nz + call variable_interface_setup_struct(fv3var_incr) + + ! Compute local variables + + fv3var_incr%var = fv3var_anl%var - fv3var_bkgrd%var + + ! Define local variables + + fv3var_anl%var = 0.0 + + ! Loop through local variable + + do i = 1, fv3var_incr%nz + + ! Compute local variables + + fv3var_anl%var(:,i) = fv3var_bkgrd%var(:,i) + & + & fv3var_incr%var(:,i)*fv3grid%mask + + end do ! do i = 1, fv3var_incr%nz + + ! Check local variable and proceed accordingly + + if(json_fv3var%clip) then + + ! Define local variables + + where(fv3var_anl%var .lt. 0.0) fv3var_anl%var = clpval + + end if ! if(json_fv3var%clip) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3var_incr) + + !===================================================================== + + end subroutine fv3_nest_lbcs + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_nest_lbcs_init.f90 + + ! DESCRIPTION: + + ! This subroutine defines the relaxation mask to be applied for the + ! data-assimilation computed increments (e.g., analysis variable + ! minus background variable) such that the increments relax to a + ! value of 0.0 within a user specified relaxation region as the + ! edges of the respective FV3 forecast grid are reached. + + ! INPUT VARIABLES: + + ! * fv3grid; an array of FORTRAN fv3grid_struct variables of + ! dimension 3 containing the defined and computed attributes of + ! the FV3 Arakawa-D grid; the mass variable projections are + ! contained in array 1, the zonal- (U-) wind aligned variable + ! projections are contained in array 2, and the meridional- (V-) + ! wind aligned variable projections are contained in array 3. + + ! OUTPUT VARIABLES: + + ! * fv3grid; an array of FORTRAN fv3grid_struct variables now + ! containing the increment relaxation mask values as determined by + ! the user specified relaxation region thresholds. + + !----------------------------------------------------------------------- + + subroutine fv3_nest_lbcs_init(fv3grid) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid(:) + + ! Define variables computed within routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp + real(r_kind), dimension(:,:), allocatable :: lat + real(r_kind), dimension(:,:), allocatable :: lon + real(r_kind), dimension(:,:), allocatable :: mask + real(r_kind), dimension(:,:), allocatable :: work + integer :: nmx_nomask + integer :: nmy_nomask + integer :: npx_nomask + integer :: npy_nomask + + ! Define counting variable + + integer :: i, j, k + + !===================================================================== + + ! Loop through local variable + + do k = 1, size(fv3grid) + + ! Allocate memory for local variables + + if(.not. allocated(lat)) & + & allocate(lat(fv3grid(k)%nx,fv3grid(k)%ny)) + if(.not. allocated(lon)) & + & allocate(lon(fv3grid(k)%nx,fv3grid(k)%ny)) + if(.not. allocated(mask)) & + & allocate(mask(fv3grid(k)%nx,fv3grid(k)%ny)) + if(.not. allocated(work)) & + & allocate(work(fv3grid(k)%nx,fv3grid(k)%ny)) + + ! Define local variables + + lat = reshape(fv3grid(k)%lat,shape(lat)) + lon = reshape(fv3grid(k)%lon,shape(lon)) + mask = spval + work = spval + nmx_nomask = min((npad_cells - 1),fv3grid(k)%nx) + nmy_nomask = min((npad_cells - 1),fv3grid(k)%ny) + npx_nomask = max((fv3grid(k)%nx - (npad_cells + 1)),1) + npy_nomask = max((fv3grid(k)%ny - (npad_cells + 1)),1) + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if((i .le. nmx_nomask) .or. (i .ge. npx_nomask)) then + + ! Define local variables + + mask(i,:) = 4.0 + + end if ! if((i .le. nmx_nomask) .or. (i .ge. npx_nomask)) + + ! Check local variable and proceed accordingly + + if((j .le. nmy_nomask) .or. (j .ge. npy_nomask)) then + + ! Define local variables + + mask(:,j) = 4.0 + + end if ! if((j .le. nmy_nomask) .or. (j .ge. npy_nomask)) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Define local variables + + nmx_nomask = min((nmx_nomask + 1),fv3grid(k)%nx) + nmy_nomask = min((nmy_nomask + 1),fv3grid(k)%ny) + npx_nomask = max((npx_nomask + 1),1) + npy_nomask = max((npy_nomask + 1),1) + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) .and. & + & (j .ge. nmy_nomask) .and. (j .le. npy_nomask)) then + + ! Define local variables + + mask(i,j) = 3.0 + + end if ! if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) + ! .and. (j .ge. nmy_nomask) .and. (j + ! .le. npy_nomask)) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Define local variables + + nmx_nomask = min((nmx_nomask + 1),fv3grid(k)%nx) + nmy_nomask = min((nmy_nomask + 1),fv3grid(k)%ny) + npx_nomask = max((npx_nomask - 1),1) + npy_nomask = max((npy_nomask - 1),1) + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) .and. & + & (j .ge. nmy_nomask) .and. (j .le. npy_nomask)) then + + ! Define local variables + + mask(i,j) = 2.0 + + end if ! if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) + ! .and. (j .ge. nmy_nomask) .and. (j + ! .le. npy_nomask)) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Define local variables + + nmx_nomask = min((nmx_nomask + nrelax_cells),fv3grid(k)%nx) + nmy_nomask = min((nmy_nomask + nrelax_cells),fv3grid(k)%ny) + npx_nomask = max((npx_nomask - nrelax_cells),1) + npy_nomask = max((npy_nomask - nrelax_cells),1) + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) .and. & + & (j .ge. nmy_nomask) .and. (j .le. npy_nomask)) then + + ! Define local variables + + mask(i,j) = 1.0 + + end if ! if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) + ! .and. (j .ge. nmy_nomask) .and. (j + ! .le. npy_nomask)) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Define local variables + + nmx_nomask = min((nmx_nomask + 1),fv3grid(k)%nx) + nmy_nomask = min((nmy_nomask + 1),fv3grid(k)%ny) + npx_nomask = max((npx_nomask - 1),1) + npy_nomask = max((npy_nomask - 1),1) + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) .and. & + & (j .ge. nmy_nomask) .and. (j .le. npy_nomask)) then + + ! Define local variables + + mask(i,j) = 0.0 + + end if ! if((i .ge. nmx_nomask) .and. (i .le. npx_nomask) + ! .and. (j .ge. nmy_nomask) .and. (j + ! .le. npy_nomask)) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Define local variables + + dst_grid%ncoords = count(mask .eq. 2.0) + dst_grid%nz = 1 + call variable_interface_setup_struct(dst_grid) + src_grid%ncoords = count(mask .ne. 2.0) + src_grid%nz = 1 + call variable_interface_setup_struct(src_grid) + dst_grid%ncoords = 0 + src_grid%ncoords = 0 + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if(mask(i,j) .eq. 2.0) then + + ! Define local variables + + dst_grid%ncoords = dst_grid%ncoords + 1 + dst_grid%lat(dst_grid%ncoords) = lat(i,j) + dst_grid%lon(dst_grid%ncoords) = lon(i,j) + + end if ! if(mask(i,j) .eq. 2.0) + + ! Check local variable and proceed accordingly + + if((mask(i,j) .ne. 2.0)) then + + ! Define local variables + + src_grid%ncoords = src_grid%ncoords + 1 + src_grid%lat(src_grid%ncoords) = lat(i,j) + src_grid%lon(src_grid%ncoords) = lon(i,j) + + ! Check local variable and proceed accordingly + + if(mask(i,j) .gt. 2.0) src_grid%var(src_grid%ncoords,1) = 1.0 + if(mask(i,j) .lt. 2.0) src_grid%var(src_grid%ncoords,1) = 0.0 + + end if ! if((mask(i,j) .eq. 3.0) .or. (mask(i,j) .eq. 1.0)) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Deallocate memory for local variables + + if(allocated(lat)) deallocate(lat) + if(allocated(lon)) deallocate(lon) + + ! Compute local variables + + call interpolation_interface_init(src_grid,dst_grid,interp) + call interpolation_interface_interp(src_grid,dst_grid,interp,2) + + ! Define local variables + + dst_grid%ncoords = 0 + + ! Loop through local variable + + do j = 1, fv3grid(k)%ny + + ! Loop through local variable + + do i = 1, fv3grid(k)%nx + + ! Check local variable and proceed accordingly + + if(mask(i,j) .gt. 2.0) work(i,j) = 1.0 + if(mask(i,j) .lt. 2.0) work(i,j) = 0.0 + + ! Check local variable and proceed accordingly + + if(mask(i,j) .eq. 2.0) then + + ! Define local variables + + dst_grid%ncoords = dst_grid%ncoords + 1 + work(i,j) = dst_grid%var(dst_grid%ncoords,1) + + end if ! if(mask(i,j) .eq. 2.0) + + end do ! do i = 1, fv3grid(k)%nx + + end do ! do j = 1, fv3grid(k)%ny + + ! Define local variables + + where(work .gt. 1.0) work = 1.0 + where(work .lt. 0.0) work = 0.0 + mask = 1.0 - work + fv3grid(k)%mask = reshape(mask,shape(fv3grid(k)%mask)) + + ! Deallocate memory for local variables + + if(allocated(mask)) deallocate(mask) + if(allocated(work)) deallocate(work) + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(interp) + call variable_interface_cleanup_struct(src_grid) + + end do ! do k = 1, size(fv3grid) + + !===================================================================== + + end subroutine fv3_nest_lbcs_init + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_nest_parent_merge.f90 + + ! DESCRIPTION: + + ! This subroutine merges a FV3 nested-grid variable into it's + ! corresponding FV3 parent tile using linear relaxation and/or + ! nearest-neighbor interpolation methods. + + ! INPUT VARIABLES: + + ! * fv3var_nest; a FORTRAN fv3var_struct variable containing the FV3 + ! nested-grid variable attributes. + + ! * fv3var_parent; a FORTRAN fv3var_struct variable containing the + ! FV3 parent tile variable attributes. + + ! * fv3grid_nest; an array of dimension 3 of FORTRAN fv3grid_struct + ! variables containing the FV3 nested-grid variable Arakawa D-grid + ! geographical location attributes. + + ! * fv3grid_parent; an array of dimension 3 of FORTRAN + ! fv3grid_struct variables containing the FV3 nested-grid parent + ! tile variable Arakawa D-grid geographical location attributes. + + ! * json_fv3var; a FORTRAN json_fv3var_struct variable containing + ! the attributes for the respective FV3 variable. + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping attributes required to interpolated the FV3 + ! nested-grid variable values to the corresponding FV3 parent tile + ! variable. + + ! OUTPUT VARIABLES: + + ! * fv3var_parent; a FORTRAN fv3var_struct variable containing the + ! merged FV3 nested-grid and parent tile variable values. + + !----------------------------------------------------------------------- + + subroutine fv3_nest_parent_merge(fv3var_nest,fv3var_parent,fv3grid_nest, & + & fv3grid_parent,json_fv3var,interp) + + ! Define variables passed to routine + + type(fv3var_struct) :: fv3var_nest + type(fv3var_struct) :: fv3var_parent + type(fv3grid_struct) :: fv3grid_nest + type(fv3grid_struct) :: fv3grid_parent + type(interp_struct) :: interp + type(json_fv3var_struct) :: json_fv3var + + ! Define variables computed within routine + + type(remapvar_struct) :: remapvar + real(r_kind), dimension(:,:), allocatable :: radius + real(r_kind), dimension(:), allocatable :: mask + real(r_kind) :: max_radius + real(r_kind) :: min_radius + + ! Define counting variable + + integer :: i + + !===================================================================== + + ! Compute local variables + + call interpolation_interface_interp(fv3var_nest,fv3var_parent, & + & json_fv3var,interp,remapvar) + call grid_methods_radialdist(fv3grid_nest) + + ! Define local variables + + fv3grid_parent%clat = fv3grid_nest%clat + fv3grid_parent%clon = fv3grid_nest%clon + + ! Compute local variables + + call grid_methods_radialdist(fv3grid_parent) + + ! Define local variables + + where(remapvar%remap_var .eq. spval) remapvar%remap_var = & + & remapvar%fixed_var + + ! Allocate memory for local variables + + if(.not. allocated(radius)) & + & allocate(radius(fv3grid_nest%nx,fv3grid_nest%ny)) + if(.not. allocated(mask)) & + & allocate(mask(fv3grid_parent%ncoords)) + + ! Define local variables + + radius = reshape(fv3grid_nest%radius,shape(radius)) + max_radius = rearth_equator + + ! Loop through local variable + + do i = 1, fv3grid_parent%nx + + ! Define local variables + + max_radius = min(max_radius,maxval(radius(i,:))) + + end do ! do i = 1, fv3grid_parent%nx + + ! Loop through local variable + + do i = 1, fv3grid_parent%ny + + ! Define local variables + + max_radius = min(max_radius,maxval(radius(:,i))) + + end do ! do i = 1, fv3grid_parent%ny + + ! Deallocate memory for local variables + + if(allocated(radius)) deallocate(radius) + + ! Define local variables + + min_radius = (domain_blend_ratio*max_radius) + + ! Compute local variables + + mask = (fv3grid_parent%radius - min_radius)/(max_radius - min_radius) + + ! Define local variables + + where(mask .lt. 0.0) mask = 0.0 + where(mask .gt. 1.0) mask = 1.0 + mask = 1.0 - mask + + ! Loop through local variable + + do i = 1, fv3var_parent%nz + + ! Compute local variables + + fv3var_parent%var(:,i) = remapvar%remap_var(:,i)*mask + & + & remapvar%fixed_var(:,i)*(1.0 - mask) + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(json_fv3var%variable_name)), & + & i, minval(fv3var_parent%var(:,i)), & + & maxval(fv3var_parent%var(:,i)) + + end do ! do i = 1, fv3var_parent%nz + + ! Deallocate memory for local variables + + if(allocated(mask)) deallocate(mask) + call variable_interface_cleanup_struct(remapvar) + + ! Define local variables + +500 format('FV3_NEST_PARENT_MERGE: Variable ',a,1x,'level ',i3.3,1x, & + & 'min/max = ',2f13.5) + + !===================================================================== + + end subroutine fv3_nest_parent_merge + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_nest_parent_merge_init.f90 + + ! DESCRIPTION: + + ! This subroutine initializes the remapping variable FORTRAN objects + ! for the remapping of nested-grid variables to the corresponding + ! parent-grid variable. + + ! INPUT VARIABLES: + + ! * fv3grid_nest; an array of dimension 3 of FORTRAN fv3grid_struct + ! variables containing the FV3 nested-grid variable Arakawa D-grid + ! geographical location attributes. + + ! * fv3grid_parent; an array of dimension 3 of FORTRAN + ! fv3grid_struct variables containing the FV3 nested-grid parent + ! tile variable Arakawa D-grid geographical location attributes. + + ! * interp; a FORTRAN interp_struct variable. + + ! OUTPUT VARIABLES: + + ! * interp; a FORTRAN interp_struct variable containing the + ! remapping attributes required to interpolated the FV3 + ! nested-grid variable values to the corresponding FV3 parent tile + ! variable. + + !----------------------------------------------------------------------- + + subroutine fv3_nest_parent_merge_init(fv3grid_nest,fv3grid_parent, & + & interp) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid_nest(:) + type(fv3grid_struct) :: fv3grid_parent(:) + type(interp_struct) :: interp(:) + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, size(interp) + + ! Compute local variables + + call interpolation_interface_init(fv3grid_nest(i), & + & fv3grid_parent(i),interp(i)) + + end do ! do i = 1, size(interp) + + ! Compute local variables + + call fv3_remappres_init(fv3grid_nest,fv3grid_parent,interp) + + !===================================================================== + + end subroutine fv3_nest_parent_merge_init + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_remappres_init.f90 + + ! DESCRIPTION: + + ! This subroutine computes the updated the pressure profile + ! following the interpolation and calculation of the nested-domain + ! pressure profile to the respective parent-domain pressure profile. + + ! INPUT VARIABLES: + + ! * fv3grid_nest; an array of dimension 3 of FORTRAN fv3grid_struct + ! variables containing the FV3 nested-grid variable Arakawa D-grid + ! geographical location attributes. + + ! * fv3grid_parent; an array of dimension 3 of FORTRAN + ! fv3grid_struct variables containing the FV3 nested-grid parent + ! tile variable Arakawa D-grid geographical location attributes. + + ! * interp; a FORTRAN interp_struct variable. + + ! OUTPUT VARIABLES: + + ! * fv3grid_nest; an array of dimension 3 of FORTRAN fv3grid_struct + ! variables now containing the FV3 nested-tile pressure profile + ! for each grid-type. + + ! * fv3grid_parent; an array of dimension 3 of FORTRAN + ! fv3grid_struct variables now containing the FV3 parent-tile + ! pressure profile for each grid-type. + + !----------------------------------------------------------------------- + + subroutine fv3_remappres_init(fv3grid_nest,fv3grid_parent,interp) + + ! Define variables passed to routine + + type(fv3grid_struct) :: fv3grid_nest(:) + type(fv3grid_struct) :: fv3grid_parent(:) + type(interp_struct) :: interp(:) + + ! Define variables computed within routine + + type(fv3var_struct) :: fv3var_nest + type(fv3var_struct) :: fv3var_parent + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(interp_struct) :: interp_local + type(json_fv3var_struct) :: json_fv3var + type(remappres_struct) :: remappres_nest + type(remappres_struct) :: remappres_parent + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(fv3_presvar_parent_filename, & + & fv3grid_parent(1),remappres_parent) + if(debug) write(6,500) 'Parent', minval(remappres_parent%psfc), & + & maxval(remappres_parent%psfc) + call fileio_interface_read(fv3_presvar_nest_filename, & + & fv3grid_nest(1),remappres_nest) + if(debug) write(6,500) 'Nested', minval(remappres_nest%psfc), & + & maxval(remappres_nest%psfc) + remappres_parent%pres = 0.0 + remappres_nest%pres = 0.0 + + ! Loop through local variable + + do i = 1, remappres_parent%nz + + ! Compute local variables + + remappres_parent%pres(:,i) = fv3grid_parent(1)%ak(i) + & + & fv3grid_parent(1)%bk(i)*remappres_parent%psfc + + ! Define local variables + + if(debug) write(6,501) 'Parent', (remappres_parent%nz - i + 1), & + & minval(remappres_parent%pres(:,i)), & + & maxval(remappres_parent%pres(:,i)) + + end do ! do i = 1, remappres_parent%nz + + ! Loop through local variable + + do i = 1, remappres_nest%nz + + ! Compute local variables + + remappres_nest%pres(:,i) = fv3grid_nest(1)%ak(i) + & + & fv3grid_nest(1)%bk(i)*remappres_nest%psfc + + ! Define local variables + + if(debug) write(6,501) 'Nest', (remappres_nest%nz - i + 1), & + & minval(remappres_nest%pres(:,i)), & + & maxval(remappres_nest%pres(:,i)) + + end do ! do i = 1, remappres_nest%nz + + ! Define local variables + + json_fv3var%variable_name = 'pres' + fv3var_nest%nx = fv3grid_nest(1)%nx + fv3var_nest%ny = fv3grid_nest(1)%ny + fv3var_nest%nz = fv3grid_nest(1)%nz + call variable_interface_setup_struct(fv3var_nest) + fv3var_nest%var = remappres_nest%pres + fv3var_parent%nx = fv3grid_parent(1)%nx + fv3var_parent%ny = fv3grid_parent(1)%ny + fv3var_parent%nz = fv3grid_parent(1)%nz + call variable_interface_setup_struct(fv3var_parent) + fv3var_nest%var = remappres_nest%pres + fv3var_parent%var = remappres_parent%pres + + ! Compute local variables + + call fv3_nest_parent_merge(fv3var_nest,fv3var_parent,fv3grid_nest(1), & + & fv3grid_parent(1),json_fv3var,interp(1)) + + ! Define local variables + + fv3grid_nest(1)%pres = fv3var_nest%var + fv3grid_parent(1)%pres = fv3var_parent%var + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3grid_parent(1)%nz + + ! Define local variables + + write(6,502) 'nest', i, 'T', & + & minval(fv3grid_nest(1)%pres(:,i)), & + & maxval(fv3grid_nest(1)%pres(:,i)) + + end do ! do i = 1, fv3grid_parent(1)%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3var_nest) + call variable_interface_cleanup_struct(remappres_nest) + + ! Define local variables + + src_grid%nx = fv3grid_nest(1)%nx + src_grid%ny = fv3grid_nest(1)%ny + src_grid%ncoords = (src_grid%nx*src_grid%ny) + src_grid%nz = fv3grid_nest(1)%nz + call variable_interface_setup_struct(src_grid) + src_grid%lat = fv3grid_nest(1)%lat + src_grid%lon = fv3grid_nest(1)%lon + src_grid%var = fv3grid_nest(1)%pres + dst_grid%nx = fv3grid_nest(2)%nx + dst_grid%ny = fv3grid_nest(2)%ny + dst_grid%ncoords = (dst_grid%nx*dst_grid%ny) + dst_grid%nz = fv3grid_nest(2)%nz + call variable_interface_setup_struct(dst_grid) + dst_grid%lat = fv3grid_nest(2)%lat + dst_grid%lon = fv3grid_nest(2)%lon + + ! Compute local variables + + call interpolation_interface_init(src_grid,dst_grid,interp_local) + call interpolation_interface_interp(src_grid,dst_grid,interp_local,2) + + ! Define local variables + + fv3grid_nest(2)%pres = dst_grid%var + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3grid_nest(2)%nz + + ! Define local variables + + write(6,502) 'nest', i, 'U', minval(fv3grid_nest(2)%pres(:,i)), & + & maxval(fv3grid_nest(2)%pres(:,i)) + + end do ! do i = 1, fv3grid_nest(2)%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(interp_local) + + ! Define local variables + + dst_grid%nx = fv3grid_nest(3)%nx + dst_grid%ny = fv3grid_nest(3)%ny + dst_grid%ncoords = (dst_grid%nx*dst_grid%ny) + dst_grid%nz = fv3grid_nest(3)%nz + call variable_interface_setup_struct(dst_grid) + dst_grid%lat = fv3grid_nest(3)%lat + dst_grid%lon = fv3grid_nest(3)%lon + + ! Compute local variables + + call interpolation_interface_init(src_grid,dst_grid,interp_local) + call interpolation_interface_interp(src_grid,dst_grid,interp_local,2) + + ! Define local variables + + fv3grid_nest(3)%pres = dst_grid%var + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3grid_nest(3)%nz + + ! Define local variables + + write(6,502) 'nest', i, 'V', minval(fv3grid_nest(3)%pres(:,i)), & + & maxval(fv3grid_nest(3)%pres(:,i)) + + end do ! do i = 1, fv3grid_nest(3)%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(interp_local) + + ! Define local variables + + src_grid%nx = fv3grid_parent(1)%nx + src_grid%ny = fv3grid_parent(1)%ny + src_grid%ncoords = (src_grid%nx*src_grid%ny) + src_grid%nz = fv3grid_parent(1)%nz + call variable_interface_setup_struct(src_grid) + src_grid%lat = fv3grid_parent(1)%lat + src_grid%lon = fv3grid_parent(1)%lon + src_grid%var = fv3grid_parent(1)%pres + dst_grid%nx = fv3grid_parent(2)%nx + dst_grid%ny = fv3grid_parent(2)%ny + dst_grid%ncoords = (dst_grid%nx*dst_grid%ny) + dst_grid%nz = fv3grid_parent(2)%nz + call variable_interface_setup_struct(dst_grid) + dst_grid%lat = fv3grid_parent(2)%lat + dst_grid%lon = fv3grid_parent(2)%lon + + ! Compute local variables + + call interpolation_interface_init(src_grid,dst_grid,interp_local) + call interpolation_interface_interp(src_grid,dst_grid,interp_local,2) + + ! Define local variables + + fv3grid_parent(2)%pres = dst_grid%var + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3grid_parent(2)%nz + + ! Define local variables + + write(6,502) 'parent', i, 'U', & + & minval(fv3grid_parent(2)%pres(:,i)), & + & maxval(fv3grid_parent(2)%pres(:,i)) + + end do ! do i = 1, fv3grid_parent(2)%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(interp_local) + + ! Define local variables + + dst_grid%nx = fv3grid_parent(3)%nx + dst_grid%ny = fv3grid_parent(3)%ny + dst_grid%ncoords = (dst_grid%nx*dst_grid%ny) + dst_grid%nz = fv3grid_parent(3)%nz + call variable_interface_setup_struct(dst_grid) + dst_grid%lat = fv3grid_parent(3)%lat + dst_grid%lon = fv3grid_parent(3)%lon + + ! Compute local variables + + call interpolation_interface_init(src_grid,dst_grid,interp_local) + call interpolation_interface_interp(src_grid,dst_grid,interp_local,2) + + ! Define local variables + + fv3grid_parent(3)%pres = dst_grid%var + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3grid_parent(3)%nz + + ! Define local variables + + write(6,502) 'parent', i, 'V', & + & minval(fv3grid_parent(3)%pres(:,i)), & + & maxval(fv3grid_parent(3)%pres(:,i)) + + end do ! do i = 1, fv3grid_parent(3)%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) + call variable_interface_cleanup_struct(fv3var_parent) + call variable_interface_cleanup_struct(interp_local) + call variable_interface_cleanup_struct(remappres_parent) + call variable_interface_cleanup_struct(src_grid) + + ! Define local variables + +500 format('FV3_REMAPPRES_INIT: ',a,' tile surface pressure min/max = ', & + & 2f13.5) +501 format('FV3_REMAPPRES_INIT: ',a,' tile level ',i3.3,' pressure ', & + & ' min/max = ', 2f13.5) +502 format('FV3_REMAPPRES_INIT: Remapped ', a, ' tile level ', i3.3, & + & ' grid-type ', a, ' min/max = ', 2f13.5) + + !===================================================================== + + end subroutine fv3_remappres_init + + !======================================================================= + +end module update_state_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_analysis_update/variable_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/variable_interface.F90 new file mode 100644 index 000000000..78b1da779 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_analysis_update/variable_interface.F90 @@ -0,0 +1,1750 @@ +module variable_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! analysis-update :: variable_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + use namelist_interface + use nemsio_module + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: clpval + public :: fv3grid_struct + public :: fv3var_struct + public :: grid_struct + public :: interp_struct + public :: json_fv3var_struct + public :: json_interp_struct + public :: json_pattern_struct + public :: kdtree_struct + public :: meteo_struct + public :: nems_struct + public :: pattern_struct + public :: remappres_struct + public :: remapvar_struct + public :: spline_struct + public :: spval + public :: statgrid_struct + public :: svd_struct + public :: tcv_struct + public :: timeinfo_struct + public :: vargrid_struct + public :: variable_interface_cleanup_struct + public :: variable_interface_setup_struct + public :: variable_interface_vtable_lookup + public :: varinfo_struct + public :: winds_struct + interface variable_interface_cleanup_struct + module procedure finalize_fv3grid_struct + module procedure finalize_fv3var_struct + module procedure finalize_grid_struct + module procedure finalize_interp_struct + module procedure finalize_kdtree_struct + module procedure finalize_meteo_struct + module procedure finalize_nems_struct + module procedure finalize_pattern_struct + module procedure finalize_remappres_struct + module procedure finalize_remapvar_struct + module procedure finalize_spline_struct + module procedure finalize_svd_struct + module procedure finalize_vargrid_struct + module procedure finalize_varinfo_struct + module procedure finalize_winds_struct + end interface variable_interface_cleanup_struct + interface variable_interface_setup_struct + module procedure initialize_fv3grid_struct + module procedure initialize_fv3var_struct + module procedure initialize_grid_struct + module procedure initialize_interp_struct + module procedure initialize_kdtree_struct + module procedure initialize_meteo_struct + module procedure initialize_nems_struct + module procedure initialize_pattern_struct + module procedure initialize_remappres_struct + module procedure initialize_remapvar_struct + module procedure initialize_spline_struct + module procedure initialize_svd_struct + module procedure initialize_vargrid_struct + module procedure initialize_varinfo_struct + module procedure initialize_winds_struct + end interface variable_interface_setup_struct + interface variable_interface_vtable_lookup + module procedure pattern_vtable_lookup_nemsio + end interface variable_interface_vtable_lookup + + ! Define local variables + + type fv3grid_struct + real(r_kind), dimension(:,:), allocatable :: pres + real(r_kind), dimension(:), allocatable :: ak + real(r_kind), dimension(:), allocatable :: bk + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind), dimension(:), allocatable :: mask + real(r_kind), dimension(:), allocatable :: radius + real(r_kind) :: clat + real(r_kind) :: clon + integer :: ncoords + integer :: nx + integer :: ny + integer :: nz + end type fv3grid_struct ! type fv3grid_struct + type fv3var_struct + real(r_kind), dimension(:,:), allocatable :: pres + real(r_kind), dimension(:,:), allocatable :: var + integer :: ncoords + integer :: nx + integer :: ny + integer :: nz + end type fv3var_struct ! type fv3var_struct + type grid_struct + real(r_kind), dimension(:,:), allocatable :: pres + real(r_kind), dimension(:,:), allocatable :: var + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind) :: clat + real(r_kind) :: clon + integer :: ncoords + integer :: nx + integer :: ny + integer :: nz + end type grid_struct ! type grid_struct + type interp_struct + real(r_double), dimension(:,:), allocatable :: slint_coeffs + real(r_kind), dimension(:), allocatable :: var + integer, dimension(:,:), allocatable :: slint_nn + integer :: ncoeffs + integer :: ncoords + end type interp_struct ! type interp_struct + type json_fv3var_struct + character(len=20) :: variable_name + logical :: clip + logical :: z_staggered + logical :: interp_bilinear + logical :: interp_nrstnghbr + integer :: gridtype + integer :: levtype + end type json_fv3var_struct ! type json_fv3var_struct + type json_interp_struct + logical :: interp_bilinear + logical :: interp_nrstnghbr + end type json_interp_struct ! type json_interp_struct + type json_pattern_struct + character(len=20) :: variable_name + logical :: clip + real(r_kind) :: vari_thresh + integer :: max_lev + integer :: min_lev + integer :: levtype + end type json_pattern_struct ! type json_pattern_struct + type kdtree_struct + real(r_kind), dimension(:,:), allocatable :: r2dist + real(r_kind), dimension(:), allocatable :: dst_lat + real(r_kind), dimension(:), allocatable :: dst_lon + real(r_kind), dimension(:), allocatable :: src_lat + real(r_kind), dimension(:), allocatable :: src_lon + real(r_kind) :: r2 + integer, dimension(:,:), allocatable :: idx + integer :: dst_ncoords + integer :: nalloc + integer :: nfound + integer :: nn + integer :: src_ncoords + end type kdtree_struct ! type kdtree_struct + type meteo_struct + real(r_kind), dimension(:,:), allocatable :: u + real(r_kind), dimension(:,:), allocatable :: v + real(r_kind), dimension(:,:), allocatable :: wdir + real(r_kind), dimension(:,:), allocatable :: wspd + integer :: ncoords + integer :: nx + integer :: ny + integer :: nz + end type meteo_struct ! type meteo_struct + type nems_struct + character(nemsio_charkind) :: varname + character(nemsio_charkind) :: levtype + real(r_double) :: jday + real(nemsio_realkind), dimension(:), allocatable :: lat + real(nemsio_realkind), dimension(:), allocatable :: lon + real(nemsio_realkind), dimension(:), allocatable :: var + integer(nemsio_intkind) :: idate(7) + integer(nemsio_intkind) :: jcap + integer(nemsio_intkind) :: lev + integer(nemsio_intkind) :: nx + integer(nemsio_intkind) :: ny + integer(nemsio_intkind) :: nz + integer :: ncoords + end type nems_struct ! type nems_struct + type pattern_struct + character(len=3) :: type + complex(r_kind), dimension(:), allocatable :: noise + real(r_kind), dimension(:,:), allocatable :: lat + real(r_kind), dimension(:,:), allocatable :: lon + real(r_kind), dimension(:,:), allocatable :: rnp + real(r_kind), dimension(:), allocatable :: lap + real(r_kind), dimension(:), allocatable :: varspec + real(r_kind), dimension(:), allocatable :: varspec1d + real(r_kind) :: dt + real(r_kind) :: lengthscale + real(r_kind) :: normfact + real(r_kind) :: phi + real(r_kind) :: rnp_max_scale + real(r_kind) :: rnp_min_scale + real(r_kind) :: stdev + real(r_kind) :: tau + real(r_kind) :: vari + integer, dimension(:), allocatable :: degree + integer, dimension(:), allocatable :: order + integer :: nx + integer :: ny + integer :: ntrunc + integer :: ndimspec + integer :: seed + end type pattern_struct ! type pattern_struct + type remappres_struct + real(r_kind), dimension(:,:), allocatable :: pres + real(r_kind), dimension(:), allocatable :: psfc + real(r_kind), dimension(:), allocatable :: ak + real(r_kind), dimension(:), allocatable :: bk + integer :: ncoords + integer :: nz + end type remappres_struct ! type remappres_struct + type remapvar_struct + real(r_kind), dimension(:,:), allocatable :: fixed_var + real(r_kind), dimension(:,:), allocatable :: remap_var + integer :: ncoords + integer :: nz + end type remapvar_struct ! type remapvar_struct + type spline_struct + real(r_kind), dimension(:), allocatable :: xa + real(r_kind), dimension(:), allocatable :: ya + real(r_kind) :: x + real(r_kind) :: y + integer :: n + end type spline_struct ! type spline_struct + type statgrid_struct + real(r_kind) :: mean + real(r_kind) :: vari + real(r_kind) :: stdev + real(r_kind) :: varmin + real(r_kind) :: varmax + integer :: nvals + end type statgrid_struct ! type statgrid_struct + type svd_struct + logical :: dcnstrct + logical :: rcnstrct + real(dp_intel), dimension(:,:), allocatable :: a + real(dp_intel), dimension(:,:), allocatable :: u + real(dp_intel), dimension(:,:), allocatable :: v + real(dp_intel), dimension(:,:), allocatable :: vt + real(dp_intel), dimension(:), allocatable :: s + real(dp_intel), dimension(:), allocatable :: svarex + real(dp_intel) :: mean + integer :: lda + integer :: ldu + integer :: ldvt + integer :: nx + integer :: ny + end type svd_struct ! type svd_struct + type tcv_struct + character(len=9) :: name + character(len=4) :: center + character(len=3) :: id + character(len=1) :: depth + character(len=1) :: latns + character(len=1) :: lonew + real(r_kind) :: area_mnlat + real(r_kind) :: area_mnlon + real(r_kind) :: area_mxlat + real(r_kind) :: area_mxlon + real(r_kind) :: lat + real(r_kind) :: lon + integer :: century + integer :: hhmm + integer :: lati + integer :: loni + integer :: pcen + integer :: penv + integer :: penvrad + integer :: r15ne + integer :: r15se + integer :: r15sw + integer :: r15nw + integer :: stdir + integer :: stspd + integer :: vmax + integer :: vmaxrad + integer :: yymmdd + end type tcv_struct ! type tcv_struct + type timeinfo_struct + character(len=19) :: timestamp + real(r_double) :: jday + integer :: dd + integer :: hh + integer :: mm + integer :: nn + integer :: ss + integer :: yy + end type timeinfo_struct ! type timeinfo_struct + type vargrid_struct + real(r_kind), dimension(:), allocatable :: var + real(r_kind) :: cutoff + integer :: xmin + integer :: xmax + integer :: ymin + integer :: ymax + integer :: nx + integer :: ny + integer :: nvals + end type vargrid_struct ! type vargrid_struct + type varinfo_struct + character(len=500), dimension(:,:,:), allocatable :: varattrs + character(len=100), dimension(:), allocatable :: varname + character(len=10), dimension(:), allocatable :: dimname + character(len=10), dimension(:), allocatable :: vartype + integer, dimension(:,:), allocatable :: vardimid + integer, dimension(:), allocatable :: dimid + integer, dimension(:), allocatable :: dimval + integer, dimension(:), allocatable :: varid + integer, dimension(:), allocatable :: varndims + integer, dimension(:), allocatable :: varnattrs + integer :: nvars + integer :: ndims + integer :: nattrs + end type varinfo_struct ! type varinfo_struct + type winds_struct + real(r_kind), dimension(:), allocatable :: dir + real(r_kind), dimension(:), allocatable :: spd + real(r_kind), dimension(:), allocatable :: u + real(r_kind), dimension(:), allocatable :: v + integer :: ncoords + integer :: nx + integer :: ny + end type winds_struct ! type winds_struct + real(r_kind), parameter :: clpval = tiny(0.0) + real(r_kind), parameter :: spval = huge(0.0) + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_fv3grid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! fv3grid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3grid_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_fv3grid_struct(grid) + + ! Define variables passed to routine + + type(fv3grid_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%pres)) deallocate(grid%pres) + if(allocated(grid%ak)) deallocate(grid%ak) + if(allocated(grid%bk)) deallocate(grid%bk) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%mask)) deallocate(grid%mask) + if(allocated(grid%radius)) deallocate(grid%radius) + + !===================================================================== + + end subroutine finalize_fv3grid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_fv3var_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! fv3var_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3var_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_fv3var_struct(grid) + + ! Define variables passed to routine + + type(fv3var_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%pres)) deallocate(grid%pres) + if(allocated(grid%var)) deallocate(grid%var) + + !===================================================================== + + end subroutine finalize_fv3var_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_grid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! grid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_grid_struct(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%pres)) deallocate(grid%pres) + if(allocated(grid%var)) deallocate(grid%var) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + + !===================================================================== + + end subroutine finalize_grid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_interp_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! interp_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_interp_struct(grid) + + ! Define variables passed to routine + + type(interp_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%slint_coeffs)) deallocate(grid%slint_coeffs) + if(allocated(grid%slint_nn)) deallocate(grid%slint_nn) + if(allocated(grid%var)) deallocate(grid%var) + + !===================================================================== + + end subroutine finalize_interp_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_kdtree_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! kdtree_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN kdtree_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_kdtree_struct(grid) + + ! Define variables passed to routine + + type(kdtree_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%r2dist)) deallocate(grid%r2dist) + if(allocated(grid%dst_lat)) deallocate(grid%dst_lat) + if(allocated(grid%dst_lon)) deallocate(grid%dst_lon) + if(allocated(grid%src_lat)) deallocate(grid%src_lat) + if(allocated(grid%src_lon)) deallocate(grid%src_lon) + if(allocated(grid%idx)) deallocate(grid%idx) + + !===================================================================== + + end subroutine finalize_kdtree_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_meteo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! FORTRAN meteo_struct variable. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_meteo_struct(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + if(allocated(grid%wdir)) deallocate(grid%wdir) + if(allocated(grid%wspd)) deallocate(grid%wspd) + + !===================================================================== + + end subroutine finalize_meteo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_nems_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! nems_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN nems_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_nems_struct(grid) + + ! Define variables passed to routine + + type(nems_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%var)) deallocate(grid%var) + + !===================================================================== + + end subroutine finalize_nems_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_pattern_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocated memory for all arrays within the + ! pattern_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN pattern_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_pattern_struct(grid) + + ! Define variables passed to routine + + type(pattern_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%noise)) deallocate(grid%noise) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%rnp)) deallocate(grid%rnp) + if(allocated(grid%degree)) deallocate(grid%degree) + if(allocated(grid%order)) deallocate(grid%order) + if(allocated(grid%lap)) deallocate(grid%lap) + if(allocated(grid%varspec)) deallocate(grid%varspec) + if(allocated(grid%varspec1d)) deallocate(grid%varspec1d) + + !===================================================================== + + end subroutine finalize_pattern_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_remappres_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! remappres_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN remappres_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_remappres_struct(grid) + + ! Define variables passed to routine + + type(remappres_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%pres)) deallocate(grid%pres) + if(allocated(grid%psfc)) deallocate(grid%psfc) + if(allocated(grid%ak)) deallocate(grid%ak) + if(allocated(grid%bk)) deallocate(grid%bk) + + !===================================================================== + + end subroutine finalize_remappres_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_remapvar_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! remapvar_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN remapvar_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_remapvar_struct(grid) + + ! Define variables passed to routine + + type(remapvar_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%fixed_var)) deallocate(grid%fixed_var) + if(allocated(grid%remap_var)) deallocate(grid%remap_var) + + !===================================================================== + + end subroutine finalize_remapvar_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_spline_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! spline_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN spline_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_spline_struct(grid) + + ! Define variables passed to routine + + type(spline_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%xa)) deallocate(grid%xa) + if(allocated(grid%ya)) deallocate(grid%ya) + + !===================================================================== + + end subroutine finalize_spline_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_svd_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! svd_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN svd_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_svd_struct(grid) + + ! Define variables passed to routine + + type(svd_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%a)) deallocate(grid%a) + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + if(allocated(grid%vt)) deallocate(grid%vt) + if(allocated(grid%s)) deallocate(grid%s) + if(allocated(grid%svarex)) deallocate(grid%svarex) + + !===================================================================== + + end subroutine finalize_svd_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_vargrid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! vargrid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN vargrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_vargrid_struct(grid) + + ! Define variables passed to routine + + type(vargrid_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%var)) deallocate(grid%var) + + !===================================================================== + + end subroutine finalize_vargrid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_varinfo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! varinfo_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN varinfo_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_varinfo_struct(grid) + + ! Define variables passed to routine + + type(varinfo_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%varattrs)) deallocate(grid%varattrs) + if(allocated(grid%varname)) deallocate(grid%varname) + if(allocated(grid%vartype)) deallocate(grid%vartype) + if(allocated(grid%dimname)) deallocate(grid%dimname) + if(allocated(grid%dimval)) deallocate(grid%dimval) + if(allocated(grid%dimid)) deallocate(grid%dimid) + if(allocated(grid%vardimid)) deallocate(grid%vardimid) + if(allocated(grid%varid)) deallocate(grid%varid) + if(allocated(grid%varndims)) deallocate(grid%varndims) + if(allocated(grid%varnattrs)) deallocate(grid%varnattrs) + + !===================================================================== + + end subroutine finalize_varinfo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_winds_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! winds_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN winds_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_winds_struct(grid) + + ! Define variables passed to routine + + type(winds_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%dir)) deallocate(grid%dir) + if(allocated(grid%spd)) deallocate(grid%spd) + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + + !===================================================================== + + end subroutine finalize_winds_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_fv3grid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! fv3grid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3grid_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN fv3grid_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_fv3grid_struct(grid) + + ! Define variables passed to routine + + type(fv3grid_struct) :: grid + + ! Define variables computed within routine + + integer :: ncoord + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%pres)) & + & allocate(grid%pres(grid%ncoords,grid%nz)) + if(.not. allocated(grid%ak)) & + & allocate(grid%ak(grid%nz)) + if(.not. allocated(grid%bk)) & + & allocate(grid%bk(grid%nz)) + if(.not. allocated(grid%lat)) & + & allocate(grid%lat(grid%ncoords)) + if(.not. allocated(grid%lon)) & + & allocate(grid%lon(grid%ncoords)) + if(.not. allocated(grid%mask)) & + & allocate(grid%mask(grid%ncoords)) + if(.not. allocated(grid%radius)) & + & allocate(grid%radius(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_fv3grid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_fv3var_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! fv3var_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3var_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN fv3var_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_fv3var_struct(grid) + + ! Define variables passed to routine + + type(fv3var_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%pres)) & + & allocate(grid%pres(grid%ncoords,grid%nz)) + if(.not. allocated(grid%var)) & + & allocate(grid%var(grid%ncoords,grid%nz)) + + !===================================================================== + + end subroutine initialize_fv3var_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_grid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! grid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_grid_struct(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%pres)) & + & allocate(grid%pres(grid%ncoords,grid%nz)) + if(.not. allocated(grid%var)) & + & allocate(grid%var(grid%ncoords,grid%nz)) + if(.not. allocated(grid%lat)) & + & allocate(grid%lat(grid%ncoords)) + if(.not. allocated(grid%lon)) & + & allocate(grid%lon(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_grid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_interp_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! interp_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN interp_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_interp_struct(grid) + + ! Define variables passed to routine + + type(interp_struct) :: grid + + !===================================================================== + + ! Define local variables + + if(is_slint) grid%ncoeffs = 3 + + ! Allocate memory for local variables + + if(.not. allocated(grid%slint_coeffs)) & + & allocate(grid%slint_coeffs(grid%ncoeffs,grid%ncoords)) + if(.not. allocated(grid%slint_nn)) & + & allocate(grid%slint_nn(grid%ncoeffs,grid%ncoords)) + if(.not. allocated(grid%var)) & + & allocate(grid%var(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_interp_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_kdtree_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! kdtree_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN kdtree_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN kdtree_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_kdtree_struct(grid) + + ! Define variables passed to routine + + type(kdtree_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%nalloc = grid%src_ncoords + + ! Allocate memory for local variables + + if(.not. allocated(grid%r2dist)) & + & allocate(grid%r2dist(grid%src_ncoords,grid%dst_ncoords)) + if(.not. allocated(grid%idx)) & + & allocate(grid%idx(grid%src_ncoords,grid%dst_ncoords)) + if(.not. allocated(grid%dst_lat)) & + & allocate(grid%dst_lat(grid%dst_ncoords)) + if(.not. allocated(grid%dst_lon)) & + & allocate(grid%dst_lon(grid%dst_ncoords)) + if(.not. allocated(grid%src_lat)) & + & allocate(grid%src_lat(grid%src_ncoords)) + if(.not. allocated(grid%src_lon)) & + & allocate(grid%src_lon(grid%src_ncoords)) + + !===================================================================== + + end subroutine initialize_kdtree_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_meteo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory and initializes (if applicable) + ! all arrays within the FORTRAN meteo_struct variable. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_meteo_struct(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%u)) & + & allocate(grid%u(grid%ncoords,grid%nz)) + if(.not. allocated(grid%v)) & + & allocate(grid%v(grid%ncoords,grid%nz)) + if(.not. allocated(grid%wdir)) & + & allocate(grid%wdir(grid%ncoords,grid%nz)) + if(.not. allocated(grid%wspd)) & + & allocate(grid%wspd(grid%ncoords,grid%nz)) + + ! Define local variables + + grid%u = spval + grid%v = spval + grid%wdir = spval + grid%wspd = spval + + !===================================================================== + + end subroutine initialize_meteo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_nems_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays and initializes + ! all variables within the nems_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN nems_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN nems_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_nems_struct(grid) + + ! Define variables passed to routine + + type(nems_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%lat)) allocate(grid%lat(grid%ncoords)) + if(.not. allocated(grid%lon)) allocate(grid%lon(grid%ncoords)) + if(.not. allocated(grid%var)) allocate(grid%var(grid%ncoords)) + + ! Define local variables + + grid%idate = -9999_nemsio_intkind + + !===================================================================== + + end subroutine initialize_nems_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_pattern_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! pattern_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN pattern_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN pattern_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_pattern_struct(grid) + + ! Define variables passed to routine + + type(pattern_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ndimspec = (grid%ntrunc + 1)*(grid%ntrunc + 2)/2 + + ! Allocate memory for local variables + + if(.not. allocated(grid%noise)) & + & allocate(grid%noise(grid%ndimspec)) + if(.not. allocated(grid%lat)) & + & allocate(grid%lat(grid%nx,grid%ny)) + if(.not. allocated(grid%lon)) & + & allocate(grid%lon(grid%nx,grid%ny)) + if(.not. allocated(grid%rnp)) & + & allocate(grid%rnp(grid%nx,grid%ny)) + if(.not. allocated(grid%degree)) & + & allocate(grid%degree(grid%ndimspec)) + if(.not. allocated(grid%order)) & + & allocate(grid%order(grid%ndimspec)) + if(.not. allocated(grid%lap)) & + & allocate(grid%lap(grid%ndimspec)) + if(.not. allocated(grid%varspec)) & + & allocate(grid%varspec(grid%ndimspec)) + if(.not. allocated(grid%varspec1d)) & + & allocate(grid%varspec1d(0:grid%ntrunc)) + + !===================================================================== + + end subroutine initialize_pattern_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_remappres_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! remappres_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN remappres_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN remappres_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_remappres_struct(grid) + + ! Define variables passed to routine + + type(remappres_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%pres)) & + & allocate(grid%pres(grid%ncoords,grid%nz)) + if(.not. allocated(grid%psfc)) & + & allocate(grid%psfc(grid%ncoords)) + if(.not. allocated(grid%ak)) & + & allocate(grid%ak(grid%nz)) + if(.not. allocated(grid%bk)) & + & allocate(grid%bk(grid%nz)) + + !===================================================================== + + end subroutine initialize_remappres_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_remapvar_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! remapvar_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN remapvar_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN remapvar_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_remapvar_struct(grid) + + ! Define variables passed to routine + + type(remapvar_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%fixed_var)) & + & allocate(grid%fixed_var(grid%ncoords,grid%nz)) + if(.not. allocated(grid%remap_var)) & + & allocate(grid%remap_var(grid%ncoords,grid%nz)) + + !===================================================================== + + end subroutine initialize_remapvar_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_spline_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! spline_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN spline_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN spline_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_spline_struct(grid) + + ! Define variables passed to routine + + type(spline_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%xa)) allocate(grid%xa(grid%n)) + if(.not. allocated(grid%ya)) allocate(grid%ya(grid%n)) + + !===================================================================== + + end subroutine initialize_spline_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_svd_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! svd_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN svd_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN svd_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_svd_struct(grid) + + ! Define variables passed to routine + + type(svd_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%lda = grid%nx + grid%ldu = grid%nx + grid%ldvt = grid%ny + + ! Allocate memory for local variables + + if(.not. allocated(grid%a)) allocate(grid%a(grid%lda,grid%ny)) + if(.not. allocated(grid%u)) allocate(grid%u(grid%ldu,grid%nx)) + if(.not. allocated(grid%v)) allocate(grid%v(grid%ny,grid%ldvt)) + if(.not. allocated(grid%vt)) allocate(grid%vt(grid%ldvt,grid%ny)) + if(.not. allocated(grid%s)) allocate(grid%s(grid%ny)) + if(.not. allocated(grid%svarex)) allocate(grid%svarex(grid%ny)) + + ! Define local variables + + grid%u = dble(0.0) + grid%v = dble(0.0) + grid%vt = dble(0.0) + grid%s = dble(0.0) + grid%svarex = dble(0.0) + + !===================================================================== + + end subroutine initialize_svd_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_vargrid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! vargrid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN vargrid_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN vargrid_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_vargrid_struct(grid) + + ! Define variables passed to routine + + type(vargrid_struct) :: grid + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(grid%nvals .eq. 0) then + + ! Define local variables + + grid%nvals = (grid%nx*grid%ny) + + end if ! if(grid%nvals .eq. 0) + + ! Allocate memory for local variables + + if(.not. allocated(grid%var)) allocate(grid%var(grid%nvals)) + + !===================================================================== + + end subroutine initialize_vargrid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_varinfo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! varinfo_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN varinfo_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN varinfo_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_varinfo_struct(grid) + + ! Define variables passed to routine + + type(varinfo_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%varattrs)) & + & allocate(grid%varattrs(grid%nvars,grid%nattrs,2)) + if(.not. allocated(grid%vardimid)) & + & allocate(grid%vardimid(grid%nvars,grid%ndims)) + if(.not. allocated(grid%varname)) & + & allocate(grid%varname(grid%nvars)) + if(.not. allocated(grid%vartype)) & + & allocate(grid%vartype(grid%nvars)) + if(.not. allocated(grid%varndims)) & + & allocate(grid%varndims(grid%nvars)) + if(.not. allocated(grid%varnattrs)) & + & allocate(grid%varnattrs(grid%nvars)) + if(.not. allocated(grid%varid)) & + & allocate(grid%varid(grid%nvars)) + if(.not. allocated(grid%dimval)) & + & allocate(grid%dimval(grid%ndims)) + if(.not. allocated(grid%dimname)) & + & allocate(grid%dimname(grid%ndims)) + if(.not. allocated(grid%dimid)) & + & allocate(grid%dimid(grid%ndims)) + + !===================================================================== + + end subroutine initialize_varinfo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_winds_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! winds_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN winds_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN winds_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_winds_struct(grid) + + ! Define variables passed to routine + + type(winds_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%dir)) allocate(grid%dir(grid%ncoords)) + if(.not. allocated(grid%spd)) allocate(grid%spd(grid%ncoords)) + if(.not. allocated(grid%u)) allocate(grid%u(grid%ncoords)) + if(.not. allocated(grid%v)) allocate(grid%v(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_winds_struct + + !======================================================================= + + ! SUBROUTINE: + + ! pattern_vtable_lookup_nemsio.f90 + + ! DESCRIPTION: + + ! This subroutine returns the NEMSIO file name corresponding to the + ! json_pattern_struct variable name and level-type. + + ! INPUT VARIABLES: + + ! * json; a FORTRAN json_pattern_struct variable. + + ! * nemsio; a FORTRAN nems_struct variable. + + ! OUTPUT VARIABLES: + + ! * nemsio; a FORTRAN nems_struct variable containing the variable + ! name within the NEMSIO formatted file in accordance with the + ! corresponding json_pattern_struct variable name. + + !----------------------------------------------------------------------- + + subroutine pattern_vtable_lookup_nemsio(json,nemsio) + + ! Define variables passed to routine + + type(json_pattern_struct) :: json + type(nems_struct) :: nemsio + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(json%levtype .eq. 3) then + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json%variable_name)) .eq. 'clw') then + + ! Define local variables + + nemsio%varname = 'clwmr' + nemsio%levtype = 'mid layer' + + end if ! if(trim(adjustl(json%variable_name)) .eq. 'clw') + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json%variable_name)) .eq. 'ozone') then + + ! Define local variables + + nemsio%varname = 'o3mr' + nemsio%levtype = 'mid layer' + + end if ! if(trim(adjustl(json%variable_name)) .eq. 'ozone') + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json%variable_name)) .eq. 'q') then + + ! Define local variables + + nemsio%varname = 'spfh' + nemsio%levtype = 'mid layer' + + end if ! if(trim(adjustl(json%variable_name)) .eq. 'q') + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json%variable_name)) .eq. 't') then + + ! Define local variables + + nemsio%varname = 'tmp' + nemsio%levtype = 'mid layer' + + end if ! if(trim(adjustl(json%variable_name)) .eq. 't') + + ! Check local variable and proceed accordingly + + if(trim(adjustl(json%variable_name)) .eq. 'uv') then + + ! Define local variables + + nemsio%levtype = 'mid layer' + + end if ! if(trim(adjustl(json%variable_name)) .eq. 'uv') + + end if ! if(json%levtype .eq. 3) + + !===================================================================== + + end subroutine pattern_vtable_lookup_nemsio + + !======================================================================= + +end module variable_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/INSTALL b/sorc/hafs_tools.fd/sorc/hafs_extlibs/INSTALL new file mode 100644 index 000000000..6cd8d7fe3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/INSTALL @@ -0,0 +1,46 @@ +#======================================================================= + +#$$$ INSTALLATION INSTRUCTIONS + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +To compile the software, do the following: + +ln -sf configure/configure.nwp-libs. configure.nwp-libs +make + +If successful, all module and library files will be placed in +./include and ./lib, respectively. + +!!!! FOR LINUX MACHINES WITH LMOD CAPABILITIES !!!! + +Benearth ./tools, there exists example module template files for +(currently) supportted NOAA RDHPCS machines; please consult the +notes/documentation within. + +!!!! IMPORTANT !!!! + +Currently, only a generic Darwin OSX platform and the NOAA RDHPCS Jet +and Theia machines are supported. \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/Makefile new file mode 100755 index 000000000..3fcc06f6a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/Makefile @@ -0,0 +1,49 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include configure.ext-libs + +# Libraries and modules + +SUBDIRS = fson gridprojs gridtrans kdtree shtns_interface slatec slint sondelib spline wmm + +# Make calls + +all: + $(MKDIR) -p ./lib ./include + @for dir in $(SUBDIRS); do \ + ( cd ./$$dir; echo "Making $@ in `pwd`" ; make >& ./../logs/make.$$dir; make install >& ./../logs/install.$$dir; cd ./) ; \ + done + +clean: + $(RM) -rf ./lib/*.a ./include/*.mod + @for dir in $(SUBDIRS); do \ + ( cd ./$$dir; rm -rf lib*.a install.$$dir make.$$dir; make clean >& clean.$$dir ; cd ./) ; \ + done diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/README b/sorc/hafs_tools.fd/sorc/hafs_extlibs/README new file mode 100644 index 000000000..da8624a30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/README @@ -0,0 +1,22 @@ +FFTW -- Fast-Fourier Transform library + + revision: N/A + version: 3.3.8 + web: http://www.fftw.org/download.html + +GRIB-API -- WMO GRIB edition 1 and 2 de-/encoding application program + interface (API) + + revision: N/A + version: 1.28.0 + web: https://confluence.ecmwf.int/display/GRIB/Releases + +SHTns -- Spherical Harmonic Transform library + + revision: 694 + version: 3.3.1 + web: https://bitbucket.org/nschaeff/shtns/downloads/ + +#---- + +Last Update: Thu Jan 30 20:45:57 UTC 2020 \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/configure.ext-libs b/sorc/hafs_tools.fd/sorc/hafs_extlibs/configure.ext-libs new file mode 100644 index 000000000..cbb79c5a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/configure.ext-libs @@ -0,0 +1,32 @@ +#======================================================================= + +#$$$ CONFIGURE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +CCFLAGS = ${EXT_LIBS_CCFLAGS} +DEBUG = ${EXT_LIBS_DEBUG} +FCFLAGS = ${EXT_LIBS_FCFLAGS} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/AUTHORS b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/AUTHORS new file mode 100644 index 000000000..ade9e58db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/AUTHORS @@ -0,0 +1,18 @@ +Authors of FFTW (reachable at fftw@fftw.org): + +Matteo Frigo +Steven G. Johnson + +Stefan Kral wrote genfft-k7/*.ml*, which was +added in fftw-3.0 and removed in fftw-3.2. + +Romain Dolbeau contributed support for AVX512 and KCvi. + +Erik Lindahl contributed support for AVX2 and Power8 VSX. + +Support for the Cell Broadband Engine was graciously donated by the +IBM Austin Research Lab, which was added in fftw-3.2 and removed in +fftw-3.3. + +Support for MIPS64 paired-single SIMD instructions was graciously +donated by CodeSourcery, Inc. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/CMakeLists.txt b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/CMakeLists.txt new file mode 100644 index 000000000..335808a32 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/CMakeLists.txt @@ -0,0 +1,429 @@ +cmake_minimum_required (VERSION 3.0) + +if (NOT DEFINED CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE Release CACHE STRING "Build type") +endif () + +project (fftw) + +if (POLICY CMP0042) + cmake_policy (SET CMP0042 NEW) +endif () + +option (BUILD_SHARED_LIBS "Build shared libraries" ON) +option (BUILD_TESTS "Build tests" ON) + +option (ENABLE_OPENMP "Use OpenMP for multithreading" OFF) +option (ENABLE_THREADS "Use pthread for multithreading" OFF) +option (WITH_COMBINED_THREADS "Merge thread library" OFF) + +option (ENABLE_FLOAT "single-precision" OFF) +option (ENABLE_LONG_DOUBLE "long-double precision" OFF) +option (ENABLE_QUAD_PRECISION "quadruple-precision" OFF) + +option (ENABLE_SSE "Compile with SSE instruction set support" OFF) +option (ENABLE_SSE2 "Compile with SSE2 instruction set support" OFF) +option (ENABLE_AVX "Compile with AVX instruction set support" OFF) +option (ENABLE_AVX2 "Compile with AVX2 instruction set support" OFF) + +option (DISABLE_FORTRAN "Disable Fortran wrapper routines" OFF) + +include(GNUInstallDirs) + + +include (CheckIncludeFile) +check_include_file (alloca.h HAVE_ALLOCA_H) +check_include_file (altivec.h HAVE_ALTIVEC_H) +check_include_file (c_asm.h HAVE_C_ASM_H) +check_include_file (dlfcn.h HAVE_DLFCN_H) +check_include_file (intrinsics.h HAVE_INTRINSICS_H) +check_include_file (inttypes.h HAVE_INTTYPES_H) +check_include_file (libintl.h HAVE_LIBINTL_H) +check_include_file (limits.h HAVE_LIMITS_H) +check_include_file (mach/mach_time.h HAVE_MACH_MACH_TIME_H) +check_include_file (malloc.h HAVE_MALLOC_H) +check_include_file (memory.h HAVE_MEMORY_H) +check_include_file (stddef.h HAVE_STDDEF_H) +check_include_file (stdint.h HAVE_STDINT_H) +check_include_file (stdlib.h HAVE_STDLIB_H) +check_include_file (string.h HAVE_STRING_H) +check_include_file (strings.h HAVE_STRINGS_H) +check_include_file (sys/types.h HAVE_SYS_TYPES_H) +check_include_file (sys/time.h HAVE_SYS_TIME_H) +check_include_file (sys/stat.h HAVE_SYS_STAT_H) +check_include_file (sys/sysctl.h HAVE_SYS_SYSCTL_H) +check_include_file (time.h HAVE_TIME_H) +check_include_file (uintptr.h HAVE_UINTPTR_H) +check_include_file (unistd.h HAVE_UNISTD_H) +if (HAVE_TIME_H AND HAVE_SYS_TIME_H) + set (TIME_WITH_SYS_TIME TRUE) +endif () + +include (CheckPrototypeDefinition) +check_prototype_definition (drand48 "double drand48 (void)" "0" stdlib.h HAVE_DECL_DRAND48) +check_prototype_definition (srand48 "void srand48(long int seedval)" "0" stdlib.h HAVE_DECL_SRAND48) +check_prototype_definition (cosl "long double cosl( long double arg )" "0" math.h HAVE_DECL_COSL) +check_prototype_definition (sinl "long double sinl( long double arg )" "0" math.h HAVE_DECL_SINL) +check_prototype_definition (memalign "void *memalign(size_t alignment, size_t size)" "0" malloc.h HAVE_DECL_MEMALIGN) +check_prototype_definition (posix_memalign "int posix_memalign(void **memptr, size_t alignment, size_t size)" "0" stdlib.h HAVE_DECL_POSIX_MEMALIGN) + +include (CheckSymbolExists) +check_symbol_exists (clock_gettime time.h HAVE_CLOCK_GETTIME) +check_symbol_exists (gettimeofday sys/time.h HAVE_GETTIMEOFDAY) +check_symbol_exists (getpagesize unistd.h HAVE_GETPAGESIZE) +check_symbol_exists (drand48 stdlib.h HAVE_DRAND48) +check_symbol_exists (srand48 stdlib.h HAVE_SRAND48) +check_symbol_exists (memalign malloc.h HAVE_MEMALIGN) +check_symbol_exists (posix_memalign stdlib.h HAVE_POSIX_MEMALIGN) +check_symbol_exists (mach_absolute_time mach/mach_time.h HAVE_MACH_ABSOLUTE_TIME) +check_symbol_exists (alloca alloca.h HAVE_ALLOCA) +if (NOT HAVE_ALLOCA) + unset (HAVE_ALLOCA CACHE) + check_symbol_exists (alloca malloc.h HAVE_ALLOCA) +endif () +check_symbol_exists (isnan math.h HAVE_ISNAN) +check_symbol_exists (snprintf stdio.h HAVE_SNPRINTF) +check_symbol_exists (strchr string.h HAVE_STRCHR) +check_symbol_exists (sysctl unistd.h HAVE_SYSCTL) + +if (UNIX) + set (CMAKE_REQUIRED_LIBRARIES m) +endif () +check_symbol_exists (cosl math.h HAVE_COSL) +check_symbol_exists (sinl math.h HAVE_SINL) + +include (CheckTypeSize) +check_type_size ("float" SIZEOF_FLOAT) +check_type_size ("double" SIZEOF_DOUBLE) +check_type_size ("int" SIZEOF_INT) +check_type_size ("long" SIZEOF_LONG) +check_type_size ("long long" SIZEOF_LONG_LONG) +check_type_size ("unsigned int" SIZEOF_UNSIGNED_INT) +check_type_size ("unsigned long" SIZEOF_UNSIGNED_LONG) +check_type_size ("unsigned long long" SIZEOF_UNSIGNED_LONG_LONG) +check_type_size ("size_t" SIZEOF_SIZE_T) +check_type_size ("ptrdiff_t" SIZEOF_PTRDIFF_T) +math (EXPR SIZEOF_INT_BITS "8 * ${SIZEOF_INT}") +set (C_FFTW_R2R_KIND "C_INT${SIZEOF_INT_BITS}_T") + +find_library (LIBM_LIBRARY NAMES m) +if (LIBM_LIBRARY) + set (HAVE_LIBM TRUE) +endif () + + +if (ENABLE_THREADS) + find_package (Threads) +endif () +if (Threads_FOUND) + if(CMAKE_USE_PTHREADS_INIT) + set (USING_POSIX_THREADS 1) + endif () + set (HAVE_THREADS TRUE) +endif () + +if (ENABLE_OPENMP) + find_package (OpenMP) +endif () +if (OPENMP_FOUND) + set (HAVE_OPENMP TRUE) +endif () + +include (CheckCCompilerFlag) + +if (ENABLE_SSE) + foreach (FLAG "-msse" "/arch:SSE") + unset (HAVE_SSE CACHE) + check_c_compiler_flag (${FLAG} HAVE_SSE) + if (HAVE_SSE) + set (SSE_FLAG ${FLAG}) + break() + endif () + endforeach () +endif () + +if (ENABLE_SSE2) + foreach (FLAG "-msse2" "/arch:SSE2") + unset (HAVE_SSE2 CACHE) + check_c_compiler_flag (${FLAG} HAVE_SSE2) + if (HAVE_SSE2) + set (SSE2_FLAG ${FLAG}) + break() + endif () + endforeach () +endif () + +if (ENABLE_AVX) + foreach (FLAG "-mavx" "/arch:AVX") + unset (HAVE_AVX CACHE) + check_c_compiler_flag (${FLAG} HAVE_AVX) + if (HAVE_AVX) + set (AVX_FLAG ${FLAG}) + break() + endif () + endforeach () +endif () + +if (ENABLE_AVX2) + foreach (FLAG "-mavx2" "/arch:AVX2") + unset (HAVE_AVX2 CACHE) + check_c_compiler_flag (${FLAG} HAVE_AVX2) + if (HAVE_AVX2) + set (AVX2_FLAG ${FLAG}) + break() + endif () + endforeach () +endif () + +# AVX2 codelets require FMA support as well +if (ENABLE_AVX2) + foreach (FLAG "-mfma" "/arch:FMA") + unset (HAVE_FMA CACHE) + check_c_compiler_flag (${FLAG} HAVE_FMA) + if (HAVE_FMA) + set (FMA_FLAG ${FLAG}) + break() + endif () + endforeach () +endif () + +if (HAVE_SSE2 OR HAVE_AVX) + set (HAVE_SIMD TRUE) +endif () +file(GLOB fftw_api_SOURCE api/*.c api/*.h) +file(GLOB fftw_dft_SOURCE dft/*.c dft/*.h) +file(GLOB fftw_dft_scalar_SOURCE dft/scalar/*.c dft/scalar/*.h) +file(GLOB fftw_dft_scalar_codelets_SOURCE dft/scalar/codelets/*.c dft/scalar/codelets/*.h) +file(GLOB fftw_dft_simd_SOURCE dft/simd/*.c dft/simd/*.h) + +file(GLOB fftw_dft_simd_sse2_SOURCE dft/simd/sse2/*.c dft/simd/sse2/*.h) +file(GLOB fftw_dft_simd_avx_SOURCE dft/simd/avx/*.c dft/simd/avx/*.h) +file(GLOB fftw_dft_simd_avx2_SOURCE dft/simd/avx2/*.c dft/simd/avx2/*.h dft/simd/avx2-128/*.c dft/simd/avx2-128/*.h) +file(GLOB fftw_kernel_SOURCE kernel/*.c kernel/*.h) +file(GLOB fftw_rdft_SOURCE rdft/*.c rdft/*.h) +file(GLOB fftw_rdft_scalar_SOURCE rdft/scalar/*.c rdft/scalar/*.h) + +file(GLOB fftw_rdft_scalar_r2cb_SOURCE rdft/scalar/r2cb/*.c + rdft/scalar/r2cb/*.h) +file(GLOB fftw_rdft_scalar_r2cf_SOURCE rdft/scalar/r2cf/*.c + rdft/scalar/r2cf/*.h) +file(GLOB fftw_rdft_scalar_r2r_SOURCE rdft/scalar/r2r/*.c + rdft/scalar/r2r/*.h) + +file(GLOB fftw_rdft_simd_SOURCE rdft/simd/*.c rdft/simd/*.h) +file(GLOB fftw_rdft_simd_sse2_SOURCE rdft/simd/sse2/*.c rdft/simd/sse2/*.h) +file(GLOB fftw_rdft_simd_avx_SOURCE rdft/simd/avx/*.c rdft/simd/avx/*.h) +file(GLOB fftw_rdft_simd_avx2_SOURCE rdft/simd/avx2/*.c rdft/simd/avx2/*.h rdft/simd/avx2-128/*.c rdft/simd/avx2-128/*.h) + +file(GLOB fftw_reodft_SOURCE reodft/*.c reodft/*.h) +file(GLOB fftw_simd_support_SOURCE simd-support/*.c simd-support/*.h) +file(GLOB fftw_libbench2_SOURCE libbench2/*.c libbench2/*.h) +list (REMOVE_ITEM fftw_libbench2_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/libbench2/useropt.c) + +set(SOURCEFILES + ${fftw_api_SOURCE} + ${fftw_dft_SOURCE} + ${fftw_dft_scalar_SOURCE} + ${fftw_dft_scalar_codelets_SOURCE} + ${fftw_dft_simd_SOURCE} + ${fftw_kernel_SOURCE} + ${fftw_rdft_SOURCE} + ${fftw_rdft_scalar_SOURCE} + + ${fftw_rdft_scalar_r2cb_SOURCE} + ${fftw_rdft_scalar_r2cf_SOURCE} + ${fftw_rdft_scalar_r2r_SOURCE} + + ${fftw_rdft_simd_SOURCE} + ${fftw_reodft_SOURCE} + ${fftw_simd_support_SOURCE} + ${fftw_threads_SOURCE} +) + +set(fftw_par_SOURCE + threads/api.c + threads/conf.c + threads/ct.c + threads/dft-vrank-geq1.c + threads/f77api.c + threads/hc2hc.c + threads/rdft-vrank-geq1.c + threads/vrank-geq1-rdft2.c) + +set (fftw_threads_SOURCE ${fftw_par_SOURCE} threads/threads.c) +set (fftw_omp_SOURCE ${fftw_par_SOURCE} threads/openmp.c) + + +include_directories (.) + + +if (WITH_COMBINED_THREADS) + list (APPEND SOURCEFILES ${fftw_threads_SOURCE}) +endif () + + +if (HAVE_SSE2) + list (APPEND SOURCEFILES ${fftw_dft_simd_sse2_SOURCE} ${fftw_rdft_simd_sse2_SOURCE}) +endif () + +if (HAVE_AVX) + list (APPEND SOURCEFILES ${fftw_dft_simd_avx_SOURCE} ${fftw_rdft_simd_avx_SOURCE}) +endif () + +if (HAVE_AVX2) + list (APPEND SOURCEFILES ${fftw_dft_simd_avx2_SOURCE} ${fftw_rdft_simd_avx2_SOURCE}) +endif () + +set (FFTW_VERSION 3.3.7) + +set (PREC_SUFFIX) +if (ENABLE_FLOAT) + set (FFTW_SINGLE TRUE) + set (BENCHFFT_SINGLE TRUE) + set (PREC_SUFFIX f) +endif () + +if (ENABLE_LONG_DOUBLE) + set (FFTW_LDOUBLE TRUE) + set (BENCHFFT_LDOUBLE TRUE) + set (PREC_SUFFIX l) +endif () + +if (ENABLE_QUAD_PRECISION) + set (FFTW_QUAD TRUE) + set (BENCHFFT_QUAD TRUE) + set (PREC_SUFFIX q) +endif () +set (fftw3_lib fftw3${PREC_SUFFIX}) + +configure_file (cmake.config.h.in config.h @ONLY) +include_directories (${CMAKE_CURRENT_BINARY_DIR}) + +if (BUILD_SHARED_LIBS) + add_definitions (-DFFTW_DLL) +endif () + +add_library (${fftw3_lib} ${SOURCEFILES}) +target_include_directories (${fftw3_lib} INTERFACE $) +if (MSVC) + target_compile_definitions (${fftw3_lib} PRIVATE /bigobj) +endif () +if (HAVE_SSE) + target_compile_options (${fftw3_lib} PRIVATE ${SSE_FLAG}) +endif () +if (HAVE_SSE2) + target_compile_options (${fftw3_lib} PRIVATE ${SSE2_FLAG}) +endif () +if (HAVE_AVX) + target_compile_options (${fftw3_lib} PRIVATE ${AVX_FLAG}) +endif () +if (HAVE_AVX2) + target_compile_options (${fftw3_lib} PRIVATE ${AVX2_FLAG}) +endif () +if (HAVE_FMA) + target_compile_options (${fftw3_lib} PRIVATE ${FMA_FLAG}) +endif () +if (HAVE_LIBM) + target_link_libraries (${fftw3_lib} m) +endif () + +set (subtargets ${fftw3_lib}) + +if (Threads_FOUND) + if (WITH_COMBINED_THREADS) + target_link_libraries (${fftw3_lib} ${CMAKE_THREAD_LIBS_INIT}) + else () + add_library (${fftw3_lib}_threads ${fftw_threads_SOURCE}) + target_include_directories (${fftw3_lib}_threads INTERFACE $) + target_link_libraries (${fftw3_lib}_threads ${fftw3_lib}) + target_link_libraries (${fftw3_lib}_threads ${CMAKE_THREAD_LIBS_INIT}) + list (APPEND subtargets ${fftw3_lib}_threads) + endif () +endif () + +if (OPENMP_FOUND) + add_library (${fftw3_lib}_omp ${fftw_omp_SOURCE}) + target_include_directories (${fftw3_lib}_omp INTERFACE $) + target_link_libraries (${fftw3_lib}_omp ${fftw3_lib}) + target_link_libraries (${fftw3_lib}_omp ${CMAKE_THREAD_LIBS_INIT}) + list (APPEND subtargets ${fftw3_lib}_omp) + target_compile_options (${fftw3_lib}_omp PRIVATE ${OpenMP_C_FLAGS}) +endif () + +foreach(subtarget ${subtargets}) + set_target_properties (${subtarget} PROPERTIES SOVERSION 3.5.7 VERSION 3) + install (TARGETS ${subtarget} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +endforeach () +install(TARGETS ${fftw3_lib} + EXPORT FFTW3LibraryDepends + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +install (FILES api/fftw3.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +if (EXISTS ${CMAKE_SOURCE_DIR}/api/fftw3.f) + install (FILES api/fftw3.f api/fftw3l.f03 api/fftw3q.f03 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif () +if (EXISTS ${CMAKE_SOURCE_DIR}/api/fftw3.f03.in) + file (READ api/fftw3.f03.in FFTW3_F03_IN OFFSET 42) + file (WRITE ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 "! Generated automatically. DO NOT EDIT!\n\n") + file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 " integer, parameter :: C_FFTW_R2R_KIND = ${C_FFTW_R2R_KIND}\n\n") + file (APPEND ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 "${FFTW3_F03_IN}") + install (FILES ${CMAKE_CURRENT_BINARY_DIR}/fftw3.f03 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif () + +if (BUILD_TESTS) + + add_executable (bench ${fftw_libbench2_SOURCE} tests/bench.c tests/hook.c tests/fftw-bench.c) + + if (ENABLE_THREADS AND NOT WITH_COMBINED_THREADS) + target_link_libraries (bench ${fftw3_lib}_threads) + else () + target_link_libraries (bench ${fftw3_lib}) + endif () + + + enable_testing () + + if (Threads_FOUND) + + macro (fftw_add_test problem) + add_test (NAME ${problem} COMMAND bench -s ${problem}) + endmacro () + + fftw_add_test (32x64) + fftw_add_test (ib256) + + endif () +endif () + +# pkgconfig file +set (prefix ${CMAKE_INSTALL_PREFIX}) +set (exec_prefix ${CMAKE_INSTALL_PREFIX}) +set (libdir ${CMAKE_INSTALL_FULL_LIBDIR}) +set (includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +set (VERSION ${FFTW_VERSION}) +configure_file (fftw.pc.in fftw${PREC_SUFFIX}.pc @ONLY) +install (FILES + ${CMAKE_CURRENT_BINARY_DIR}/fftw${PREC_SUFFIX}.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + COMPONENT Development) + +# cmake file +set (FFTW3_LIBRARIES "FFTW3::${fftw3_lib}") +configure_file (FFTW3Config.cmake.in FFTW3${PREC_SUFFIX}Config.cmake @ONLY) +configure_file (FFTW3ConfigVersion.cmake.in FFTW3${PREC_SUFFIX}ConfigVersion.cmake @ONLY) +install (FILES + ${CMAKE_CURRENT_BINARY_DIR}/FFTW3${PREC_SUFFIX}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/FFTW3${PREC_SUFFIX}ConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fftw3${PREC_SUFFIX} + COMPONENT Development) + +export (TARGETS ${fftw3_lib} NAMESPACE FFTW3:: FILE ${PROJECT_BINARY_DIR}/FFTW3LibraryDepends.cmake) +install(EXPORT FFTW3LibraryDepends + NAMESPACE FFTW3:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fftw3${PREC_SUFFIX} + COMPONENT Development) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/CONVENTIONS b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/CONVENTIONS new file mode 100644 index 000000000..b4e388d3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/CONVENTIONS @@ -0,0 +1,65 @@ +Code conventions used internally by fftw3 (not in API): + +LEARN FROM THE MASTERS: read Ken Thompson's C compiler in Plan 9. + Avoid learning from C++/Java programs. + +INDENTATION: K&R, 5 spaces/tab. In case of doubt, indent -kr -i5. + +NAMES: keep them short. Shorter than you think. The Bible was written + without vowels. Don't outsmart the Bible. + + Common names: + + R : real type, aka fftw_real + E : real type for local variables (possibly extra precision) + C : complex type + sz : size + vecsz : vector size + is, os : input/output stride + ri, ii : real/imag input (complex data) + ro, io : real/imag output (complex data) + I, O : real input/output (real data) + A : assert + CK : check + S : solver, defined internally to each solver file + P : plan, defined internally to each solver file + k : codelet + X(...) : used for mangling of external names (see below) + K(...) : floating-point constant, in E precision + + If a name is used often and must have the form fftw_foo to avoid + namespace pollution, #define FOO fftw_foo and use the short name. + + Leave that hungarian crap to MS. foo_t counts as hungarian: use + foo instead. foo is lowercase so that it does not look like a DOS + program. Exception: typedef struct foo_s {...} foo; instead of + typedef struct foo {...} foo; for C++ compatibility. + +NAME MANGLING: use X(foo) for external names instead of fftw_foo. + X(foo) expands to fftwf_foo or fftw_foo, depending on the + precision. (Unfortunately, this is a ugly form of hungarian + notation. Grrr...) Names that are not exported do not need to be + mangled. + +REPEATED CODE: favor a table. E.g., do not write + + foo("xxx", 1); + foo("yyy", 2); + foo("zzz", -1); + + Instead write + + struct { const char *nam, int arg } footab[] = { + { "xxx", 1 }, + { "yyy", 2 }, + { "zzz", -1 } + }; + + and loop over footab. Rationale: it saves code space. + Similarly, replace a switch statement with a table whenever + possible. + +C++: The code should compile as a C++ program. Run the code through + gcc -xc++ . The extra C++ restrictions are unnecessary, of + course, but this will save us from a flood of complaints when + we release the code. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/COPYING b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/COPYING new file mode 100644 index 000000000..623b6258a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/COPYRIGHT b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/COPYRIGHT new file mode 100644 index 000000000..089500b67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/COPYRIGHT @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/ChangeLog b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/ChangeLog new file mode 100644 index 000000000..e11e7c999 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/ChangeLog @@ -0,0 +1,20364 @@ +commit 700745cdbb34e964e1abda86183809fd8dd95796 +Author: Matteo Frigo +Date: Thu May 24 08:00:45 2018 -0400 + + Bump FFTW_MINOR_VERSION for fftw-3.3.8 + +commit 902d0982522cdf6f0acd60f01f59203824e8e6f3 +Author: Matteo Frigo +Date: Thu May 24 07:43:02 2018 -0400 + + update NEWS + +commit 41b0d9eff394891ba3327b9062811d48677bb411 +Author: Matteo Frigo +Date: Thu May 24 07:35:36 2018 -0400 + + CFLAGS: don't use -ffast-math + + -ffast-math is a relic from 1999 when it was kind of necessary for + full use of FMA on powerpc. Nowadays it is just a liability. For + example, 'gcc-8 -ffast-math' ignores the disctintion between +0 and + -0, thus breaking the avx and avx2 implementations in fftw-3.7. + +commit 19eeeca592f63413698f23dd02b9961f22581803 +Author: Matteo Frigo +Date: Thu May 24 07:29:00 2018 -0400 + + Fixes for gcc-8 + + It looks like 'gcc-8 -ffast-math' does honor the distinction between + +0.0 and -0.0 in floating-point constants. I suppose that technically + -ffast-math has the right to do so. + + For good measure, this patch encodes such constants as their explicit + binary representation. A separate patch will disable -ffast-math. + +commit bf478afbf2367df0f38c77f31d1f912aeeb82585 +Author: Miklos Espak +Date: Thu Apr 26 18:31:57 2018 +0100 + + Define include directory for installed targets (#141) + +commit ab888adf510338c03ea8ac49b4aab91fb57f1479 +Author: Steven G. Johnson +Date: Sat Apr 14 11:40:39 2018 -0400 + + don't need both identifier and name fields + +commit 2b999c600c58c78b8acb78c3352b02d9df6f6e60 +Author: Steven G. Johnson +Date: Fri Apr 13 08:43:35 2018 -0400 + + JSON doesn't like trailing commas + +commit 92eee8bbc4252c871aa870d2dce88eb98d0c7d18 +Author: Steven G. Johnson +Date: Fri Apr 13 08:38:50 2018 -0400 + + list both C and OCaml (as explained in codemeta/codemeta#181) + +commit 35e5609f17e212bf1c40da9b2ebe66784ad37052 +Author: Steven G. Johnson +Date: Thu Apr 12 12:01:15 2018 -0400 + + add codemeta file + +commit eba07c46b5d2f7824d293ab59aa5c29a25034963 +Author: Matteo Frigo +Date: Mon Feb 19 09:30:29 2018 -0500 + + Call _mm256_zeroupper() when leaving avx512 code + + Carsten Steger says: + + simd-avx512.h defines VLEAVE as nothing in FFTW 3.3.7. However, the + current Intel® 64 and IA-32 Architectures Optimization Reference Manual, + chapter 15.18, recommends the following: + - When you have to mix group B instructions with Intel SSE instructions, + or you suspect that such a mixture might occur, use the VZEROUPPER + instruction whenever a transition is expected. + - Add VZEROUPPER after group B instructions were executed and before any + function call that might lead to Intel SSE instruction execution. + - Add VZEROUPPER at the end of any function that uses group B instructions. + - Add VZEROUPPER before thread creation if not already in a clean state + so that the thread does not inherit Dirty Upper State. + (Group B are instruction types that modify bits 128-511 of vector + registers 0-15.) + + Therefore, I believe it would be prudent to define VLEAVE as + _mm256_zeroupper in simd-avx512.h (see the attached patch). + + At https://software.intel.com/en-us/forums/intel-isa-extensions/topic/704023 + Mark Charney says: + + To be clear, we very much still recommend using VZEROUPPER on + Skylake. Even though it does not have the same penalties as earlier + designs in that family for mixing AVX and SSE code, we definitely + recommend using VZEROUPPER on Skylake. + + Yes it would obviously be better if there were one solution. For + code that has to run on both families, the "common code" solution + is to use the Xeon guidelines. + + If Mark Charney recommends VZEROUPPER, that's good enough for me. + +commit b267008613d082975b108252ed596ba0916ffa31 +Author: Matteo Frigo +Date: Wed Nov 22 12:54:18 2017 -0500 + + fftw3-mpi.f03 should be regenerated when Makefile changes + +commit 708b202fd593cf1002cf97dce0863e2a438e3720 +Merge: 2e0cfdda 8ba34c40 +Author: Matteo Frigo +Date: Mon Nov 20 09:37:17 2017 -0500 + + Merge pull request #113 from xantares/mingw + + CMake enhancements + +commit 2e0cfddacacccc8a1e6e679c5e3fa81fb0219bda +Author: Matteo Frigo +Date: Mon Nov 20 07:07:30 2017 -0500 + + Attempt to strengthen language in README.md + +commit 8ba34c40fef38f661c9c413781990a7c021ba22b +Author: Michel Zou +Date: Thu Nov 9 22:33:51 2017 +0100 + + Preliminary Fortran support + +commit bd753a7679ecca2799640e7c8ced6f1f784f1b51 +Author: Michel Zou +Date: Mon Nov 6 23:00:29 2017 +0100 + + CMake MinGW fixes + + Mostly fixes the SSE2 macro in config.h, otherwise minor detection fixes + +commit da5372a175bcb09578359960869c76da74c9fda3 +Author: Matteo Frigo +Date: Tue Oct 31 20:21:17 2017 -0400 + + EXTRA_DIST += README-perfcnt.md + +commit 1b64d9269254e9d0a0f0b088e5eceb0db92d531f +Merge: b5ccc557 2be183c3 +Author: Matteo Frigo +Date: Tue Oct 31 20:19:13 2017 -0400 + + Merge pull request #112 from alexeicolin/PR--armv7-pmccntr-counter-and-docs + + Pr armv7 pmccntr counter and docs + +commit 2be183c3a44d58aaa11909ba8882310fb44d598c +Author: Alexei Colin +Date: Tue Oct 31 23:34:38 2017 +0000 + + perf counters: name ARMv8 PMCCNTR_EL0 explicitly + + For consistency with the rest. + +commit 504ece7f8ffc60c2a03b28d977e9825230052d48 +Author: Alexei Colin +Date: Tue Oct 31 23:28:48 2017 +0000 + + perf counters: add PMCCNTR for ARMv7 and add docs + + The existing armv7 counter (CNTVCT) does need enabling from kernel mode (so + updated the configure help), and the enable bit is different from the PMU + enable bit (described in the new docs). + + Tested on XU4: printed the returned counter values and they look reasonable. + +commit b5ccc557fd2e57bfc955f0db9b5182e92f9cb55c +Author: Matteo Frigo +Date: Sun Oct 29 08:13:04 2017 -0400 + + fftw-mpi.h should include , not "fftw3.h" + +commit 9e3f8da20e65f1e34e677768e550086b06d77f16 +Author: Matteo Frigo +Date: Sun Oct 29 08:09:35 2017 -0400 + + NEWS: warn that cmake support is experimental and not well tested + +commit 9616fb9ff1c2694f5cfa2c4a59efa96094ae6812 +Author: Matteo Frigo +Date: Sun Oct 29 07:48:43 2017 -0400 + + Update NEWS for upcoming fftw-3.3.7 + +commit 62edb203fc09c8c8ac2c2d5ac3299ea8d4dc7838 +Author: Matteo Frigo +Date: Tue Oct 10 18:58:37 2017 -0400 + + Ditch --enable-debug-malloc and --enable-debug-alignment + + We wrote DEBUG_MALLOC in 1997 to debug memory leaks. Nowadays + DEBUG_MALLOC is just confusing. Better tools are available, and + DEBUG_MALLOC is not thread-safe and it does not respect SIMD + alignment. It confused at least one user. + + In the gcc-2.SOMETHING days, gcc would allocate doubles on the stack + at 4-byte boundary (vs. 8) reducing performance by a factor of 3. + That's when we introduced --enable-debug-alignment, which is totally + obsolete by now. + +commit 6ed4297e85e5ef24a18ce428b18e020d8e48413a +Author: Matteo Frigo +Date: Fri Sep 29 19:27:43 2017 -0400 + + Use armv7a cycle counter unconditionally if HAVE_ARMV7A_CNTVCT + + It looks like __ARM_ARCH_7A__ is not always defined. If the + user says HAVE_ARMV7A_CNTVCT, trust the user. + +commit 2dd77382319ceb99c32b38418716783eec8adad4 +Merge: 04590cb1 e09ab8ca +Author: Matteo Frigo +Date: Thu Sep 21 22:42:38 2017 -0400 + + Merge pull request #110 from junghans/cmake + + Minor cmake fixes + +commit e09ab8cac98c0f206968bbd962a6f76cf26e7437 +Merge: 890dac59 76427f30 +Author: Christoph Junghans +Date: Thu Sep 21 16:13:43 2017 -0600 + + Merge commit 'refs/pull/109/head' of github.com:FFTW/fftw3 into cmake + +commit 04590cb11baa11bbfdebe101fa90186bbf48423c +Author: Matteo Frigo +Date: Thu Sep 21 18:00:58 2017 -0400 + + simd-vsx.h: don't use vpermxor + + It seems like gcc-6 generates incorrect code when using vpermxor + (tested with qemu emulator, so there is a chance that gcc is right and + qemu is wrong). Disable the use of vpermxor and do the simple thing + (one multiplication + one permutation). + +commit 76427f30080e2cab3ca5047193ce8ffe6110f047 +Author: Michel Zou +Date: Thu Sep 21 23:44:15 2017 +0200 + + No need to list includes + +commit e47e9a81c41454e5e128cd68505b38152ad60500 +Author: Matteo Frigo +Date: Thu Sep 21 17:13:14 2017 -0400 + + Remove AC_FUNC_{MALLOC,REALLOC,MMAP} + + They don't do what I thought. E.g., AC_FUNC_MALLOC checks that + malloc(0) returns NULL, and defines malloc to be rpl_malloc otherwise. + We don't support rpl_malloc() and we don't care about malloc(0). + +commit 5aebc02ff30af12d2dc3be6c762e821a38f56595 +Author: Matteo Frigo +Date: Thu Sep 21 10:09:02 2017 -0400 + + Dead-Code Police + +commit d97394a17250d71d6a722ae64dcc3123130cf08f +Author: Matteo Frigo +Date: Thu Sep 21 09:54:36 2017 -0400 + + Fixup fftw3-mpi.h + + fftw3-mpi.h must include "fftw3.h", not "api/fftw3.h", because both + fftw3-mpi.h and fftw3.h will ultimately be installed in /usr/include. + + Thus, as a special exception, mpi/Makefile.am must specify the include + path -I $(top_srcdir)/api. + +commit 890dac59aca4c153e7e22add0a8de00766227670 +Merge: 4ebda892 106582aa +Author: Christoph Junghans +Date: Wed Sep 20 14:44:04 2017 -0600 + + Merge commit 'refs/pull/109/head' of github.com:FFTW/fftw3 into cmake + +commit 4ebda89297b6b38632c3d91bd5a673a1bee4ffff +Author: Christoph Junghans +Date: Wed Sep 20 14:05:13 2017 -0600 + + autotools: fix install of FFTW3ConfigVersion.cmake + +commit e9a66d5f748037f9cb9c0f5b8d824d73c0425042 +Author: Christoph Junghans +Date: Wed Sep 20 13:29:29 2017 -0600 + + cmake: use GNUInstallDirs + +commit 4fbb72ad294e2070d64a83b24f89a601d4f624c6 +Author: Matteo Frigo +Date: Wed Sep 20 13:11:55 2017 -0400 + + Generate codlist.c only when MAINTAINER_MODE + + The user is not supposed to regenerate .c files. In addition, the + generation rule is subtly nonportable (it depends on whether or not + '#' can be escaped in Makefiles, an issue that does not appear + settled.) + +commit f243f8ce48be61952527d43da222096296fdd2f9 +Author: Matteo Frigo +Date: Wed Sep 20 11:54:13 2017 -0400 + + Generate {dft,rdft}/simd/{sse,sse2,avx,...}/*.c only when MAINTAINER_MODE + + Users are not supposed to generate them. Apart from that, the + generation rule uses '$*' in an explicit make rule, which is + technically a GNU extension. (Works with {open,free}bsd, but breaks + Solaris.) + +commit 106582aa8f97257f53730cbac81f98e8659b084c +Author: Michel Zou +Date: Wed Sep 20 15:46:51 2017 +0200 + + Fix includes, export target + +commit 1a24e67165ba56447f814bcdc12b9d6e083f1670 +Author: Matteo Frigo +Date: Wed Sep 20 07:24:58 2017 -0400 + + Restore the ability to build out of tree. + + Before 1f3704b9, we had "-I $(top_srcdir)/foo -I $(top_srcdir)/bar". + After 1f3704b9, we had no -I specification at all, but automake wants + an explicit -I $(top_srcdir) in order to build out of tree. + +commit 919b795940d1e86a948a4430193dbd0853f47272 +Merge: 6076339a f7a64365 +Author: Matteo Frigo +Date: Wed Sep 20 06:41:50 2017 -0400 + + Merge pull request #107 from xantares/config-mode + + Config mode + +commit f7a6436509d324297783eb77df54010320b062f8 +Author: Michel Zou +Date: Wed Sep 20 11:46:05 2017 +0200 + + Build bench according to BUILD_TESTS + +commit 82cec28b7e14280ad11878978e23a3680bb0e983 +Author: Michel Zou +Date: Wed Sep 20 11:41:20 2017 +0200 + + Use cmake config mode + + Installs FFTW3Config.cmake instead of a FindFFTW3.cmake + Also configures the pkgconfig file from cmake + +commit 6076339a342b12b0d0cfd9f6d967bfa9fbf6b1b2 +Author: Matteo Frigo +Date: Tue Sep 19 23:38:27 2017 -0400 + + Fix performance regression with gcc-3.3 + +commit f4c37657cb32b2552c5e86f0540c0308d4f451ef +Author: Matteo Frigo +Date: Tue Sep 19 23:24:08 2017 -0400 + + get rid of the sse2-nonportable.c hack + + It was necessary to support some broken compiler 15 years ago. + Remove it and see if anybody complains. + +commit 362ae5c7b8a9df76b5ec0de4433131db33bae0ae +Author: Matteo Frigo +Date: Tue Sep 19 21:44:13 2017 -0400 + + configure.ac Police + + Remove some obsolete AC_CHECK_HEADERS, add new checks suggested by + autoscan. + +commit a56b5b4b149e56fce43778172a56f77d30352833 +Author: Matteo Frigo +Date: Tue Sep 19 21:43:45 2017 -0400 + + Include Police + + fftw-wisdom.c was including instead of "api/fftw3.h" + +commit 1f3704b9eff4b7e80ef7d775fb13f5bb8de0a5f1 +Author: Matteo Frigo +Date: Tue Sep 19 21:12:22 2017 -0400 + + Do not set include path ("-I") in Makefile.am + + .[ch] files should specify their own paths explicitly. Setting paths + in the Makefile was always a bad idea, but it is totally untenable if + we are supporting cmake. + +commit 6e0ae04bad14a7dd9b4928f22d7a01e887dfdc03 +Author: Matteo Frigo +Date: Tue Sep 19 19:31:55 2017 -0400 + + Fix OpenBSD build + + Using $< in a non-suffix rule context is a GNUmake idiom and OpenBSD + doesn't like it. + +commit 31a53789197f90d6bf349dd230ab86023e5fb83c +Author: Matteo Frigo +Date: Tue Sep 19 19:24:34 2017 -0400 + + EXTRA_DIST += FindFFTW3.cmake.in + +commit ae1a764ce88166e8e1f05a25888f105ec8f1939d +Merge: 5fdca1d9 97b273d8 +Author: Matteo Frigo +Date: Tue Sep 19 17:13:58 2017 -0400 + + Merge pull request #69 from junghans/cmake + + Build und install cmake module + +commit 5fdca1d9b0a0b2e6491c98f63873dcf600355e09 +Merge: b521e530 66506470 +Author: Matteo Frigo +Date: Tue Sep 19 15:57:59 2017 -0400 + + Merge pull request #92 from tklauser/armv7a-cycle-counter + + Fix ARMV7-A cycle counter detection + +commit b521e5305a7317c1c0f1d454beb6580eaf4de1db +Author: Matteo Frigo +Date: Tue Sep 19 15:51:03 2017 -0400 + + cmake: don't check for dlfcn.h + + We don't use it + +commit fc852fcdfa80fab30eac2284249686853efa2e4b +Author: Matteo Frigo +Date: Tue Sep 19 15:43:02 2017 -0400 + + Remove ancient paranoia + + In the '90s we used to run autoconf three times, just in case + (because it really didn't work the first time). "Three" was modeled + after the "sync; sync; sync; reboot" incantation of the '80s. + + Hopefully we are past this by now. + +commit 34738e7f669882c6abc12c2744c8acc347c91719 +Author: Matteo Frigo +Date: Tue Sep 19 15:32:39 2017 -0400 + + Flip boolean in a way that makes more sense to me + +commit a2bfd859d9ad08490d02252d8a80c5994dd82747 +Author: Matteo Frigo +Date: Tue Sep 19 15:28:56 2017 -0400 + + Various CMakeLists.txt fixes + + * AVX2 codelets require -mfma + + * --enable-avx2 automatically enables the 128-bit avx2 codelets in + *dft/simd/avx2-128 + + * bump FFTW_VERSION to 3.3.7, SOVERSION to 3.5.7 + + * build bench always, irrespective of Threads_FOUND + +commit 93ac6e1075e73c0275a9e0006fe9161c3b6fae38 +Merge: a71f3dd3 d3a8d13f +Author: Matteo Frigo +Date: Tue Sep 19 14:31:03 2017 -0400 + + Merge pull request #103 from xantares/cmake + + Add user cmake support + + Still needs work, but let's move forward and move this contribution into the official repository + +commit d3a8d13f74361a7ffc4c48c229181a86b35e9a7d +Author: Michel Zou +Date: Tue Jul 18 12:16:43 2017 +0200 + + Add user cmake infrastructure + +commit a71f3dd355f802dc362a52674a977ff81daadf9d +Author: Matteo Frigo +Date: Wed Jul 5 06:33:40 2017 -0400 + + Disable ISA_EXTENSION_PREFERS_FMA for now + + I still don't understand whether or not avx2 should use FMA codelets. + Ryzen is faster with the non-FMA version. Haswell prefers the FMA + version. + + However, I suspect that Haswell prefers FMA because of a quirk of the + micro-architecture. Haswell has two floating-point "ports". You can + issue an addition only through one "port", but you can issue two FMA + in parallel on both ports, so FMA appears to be faster. Skylake + apparently restores balance (but I haven't tried yet). Suspend + judgment for now until I gather more data. + +commit f82b8c94596868897987b71a648eaa664590602a +Author: Matteo Frigo +Date: Tue Jul 4 20:06:57 2017 -0400 + + Rationalize HAVE_FMA + + Distinguish ARCH_PREFERS_FMA, for architectures that "naturally" + prefer FMA (e.g., powerpc), from ISA_EXTENSION_PREFERS_FMA, for + instruction-set extensions that favor FMA where the base architecture + does not (e.g., avx2 on x86). + + Previously, --enable-avx2 would use FMA code for scalar and avx + codelets, which is wrong. + + This change improves performance by a few percent on Ryzen (where FMA + doesn't really do anything), and is a wash on Haswell. + +commit 0869f4e51b8b0aeb7da1b21b2683c30cd4e10a5e +Author: Steven G. Johnson +Date: Tue May 9 09:14:37 2017 -0400 + + document that howmany ≥ 0 (closes #95) + +commit 665064700b26c01c0836e4c12a5ee0eab3923858 +Author: Tobias Klauser +Date: Wed Mar 29 16:15:45 2017 +0200 + + Fix ARMV7-A cycle counter detection + + Check for the correct pre-processor define HAVE_ARMV7A_CNTVCT from + config.h (instead of ARMV7A_HAS_CNTVCT) to fix the detection of the + cycle counter for ARMv7-A in the configure script (and actually use it + in the built library). + + Without this fix, even the following ./configure call: + + ./configure --enable-neon --enable-single --enable-armv7a-cntvct \ + --host=arm-linux-gnueabihf --disable-fortran \ + CC="arm-linux-gnueabihf-gcc -march=armv7-a" + + will emit the warning: + + checking whether a cycle counter is available... no + *************************************************************** + WARNING: No cycle counter found. FFTW will use ESTIMATE mode + for all plans. See the manual for more information. + *************************************************************** + + With this fix applied, ./configure will correctly detect the cycle + counter register: + + ... + checking whether a cycle counter is available... yes + ... + +commit cc5fc8ce7ffd77f467740554f649aab4d3f71344 +Merge: 102f2fd0 950b1539 +Author: Matteo Frigo +Date: Tue Mar 14 07:21:45 2017 -0400 + + Merge pull request #91 from fornwall/android-clock-gettime + + Avoid trying to use CLOCK_SGI_CYCLE on Android + +commit 950b153910f7f0dde9cc20cddeee5dc9048d25b7 +Author: Fredrik Fornwall +Date: Mon Mar 13 23:41:35 2017 +0100 + + Avoid trying to use CLOCK_SGI_CYCLE on Android + + The Android headers defines CLOCK_SGI_CYCLE but the call fails at + runtime as it's not implemented. Combined with getticks() not + checking the return value of clock_gettime() this causes bogus + values to be returned from getticks(). + +commit 102f2fd0249dca301d195b4df1b94e7b339b8c60 +Author: Matteo Frigo +Date: Wed Feb 22 14:59:30 2017 -0500 + + Compute mflops() in 64 bit precision + + Old code was overflowing for N>2^32 + +commit 2b63fc2eaae645a5c2ef4a97c384beb2adefd58d +Author: Matteo Frigo +Date: Fri Jan 27 16:06:27 2017 -0500 + + Update NEWS for 3.3.6-pl2 + +commit d2ca54234956ad8be82ba050305ccf979fd631a7 +Author: Matteo Frigo +Date: Fri Jan 27 16:01:42 2017 -0500 + + Get ready for fftw-3.3.6-pl2 + +commit 83092f8efbf872aefe7cfc6ee8fa43412f8e167a +Author: Matteo Frigo +Date: Fri Jan 27 15:52:18 2017 -0500 + + Fix scrips that generate the MPI F03 interface + + It turns out that the scripts were using fftw3.h from /usr/include, + not ../api, and were failing silently if fftw3.h was not installed. + This bug led to a fftw-3.3.6pl1 release with incomplete mpi/f03 header + files. + +commit ab402b00f9a003daa10863b9bcdbe0810b26f541 +Author: Steven G. Johnson +Date: Wed Jan 25 13:03:15 2017 -0500 + + mention mkdist.sh and summarize the build process in README.md (closes #85) + +commit fa9f00b3831177f0a9582092f21efb14e3d4601f +Author: Matteo Frigo +Date: Sun Jan 22 14:51:44 2017 -0500 + + add __cdecl decorators to fftw3.h functions on Windows + + This patch re-does 1f19d597 in a more disciplined way. + + Also, Whitespace Police. + +commit 42c0036e839b78a7af651d5504add62ed57f9961 +Author: Matteo Frigo +Date: Sun Jan 22 14:32:32 2017 -0500 + + Revert "add __cdecl decorators to fftw3.h functions on Windows, in case someone compiles with a non-default calling convention, as discussed in #80" + + This reverts commit 1f19d59793eb629dd8228e8a41f4f8618c20a246. + + The chosen syntax + + FFTW_EXTRN(T) X(name) + + is improper because __cdecl appertains to the declarator + and not to the return type. (As is clear, e.g., in + void (__cdecl *foo)(void)). + + This forces monstrosities such as + + FFTW_EXTRN(R *) X(name) + + that contradict the C declaration syntax. + + I'll redo the patch in a way that looks like C: + + FFTW_EXTERN R *FFTW_CDECL X(name) + +commit 1f19d59793eb629dd8228e8a41f4f8618c20a246 +Author: Steven G. Johnson +Date: Thu Jan 19 23:09:23 2017 -0500 + + add __cdecl decorators to fftw3.h functions on Windows, in case someone compiles with a non-default calling convention, as discussed in #80 + +commit 596b924b86340456771fb75559016ec2cc1b44c4 +Author: Matteo Frigo +Date: Mon Jan 16 10:25:37 2017 -0500 + + Assert that CURRENT-AGE=3 + + This is an attempt to prevent the 3.3.6 version screwup from occurring + again. + + In any reasonable universe, libraries would have a version H and they + would specify a L such that the library is compatible with all + versions in [L..H]. Any sensible programmer would never change L, as + this breaks backward compatibility and screws users. A new version + would increase H and be done. Instead, libtool wants CURRENT=H and + AGE=H-L (a new version change two variables). Furthermore, the name + of the library in the file system is a combination of L and H-L. The + two changes of basis arent't even orthogonal. Pure madness. + + This change attempts to impose sanity by asserting that that the + implied L is 3, since we never intend to break backward compatibility + with fftw-3.3, which was version L=3. + +commit 6fb9cd7b6359f29ce488a5802793139971d59c6c +Author: Matteo Frigo +Date: Mon Jan 16 09:06:06 2017 -0500 + + Release 3.3.6-pl1 + +commit 18b7e53c54727303703db29373e61a35fb8d5db8 +Author: Matteo Frigo +Date: Mon Jan 16 08:56:53 2017 -0500 + + Fix #82: FFTW3 3.3.6 shared version rollback + +commit 64a5a288e56c6ff4462b69531f4f34d740fdc12c +Author: Matteo Frigo +Date: Mon Jan 16 08:42:01 2017 -0500 + + Improve documentation of fftw_make_planner_thread_safe + + Specifically, tell people not to use it unless they must. + +commit 811a672bdaedec4363272d9f7ed5fae56086aeb1 +Author: Matteo Frigo +Date: Sun Jan 15 17:40:37 2017 -0500 + + rm obsolete simd/ directory + + We switched to simd-support/ many years ago, not sure why + it is still in git. + + This was not a problem when the repository was private, but + the directory probably confuses people on github. + +commit 5c9bead1ea35b3a21fb33f17011d6802722ba44b +Author: Matteo Frigo +Date: Sun Jan 15 07:25:40 2017 -0500 + + Warnings Police + + * suppress dead code in genfft/simd.ml + * fix on size_t/int confusion + * fix one float*/double* confusion (should have been void* because + we only check the alignment of the pointer, not its type). + +commit 41b191ee128fefe28a228ab706dfdfb65d32c2e1 +Author: Matteo Frigo +Date: Sun Jan 15 07:02:40 2017 -0500 + + Update configure.ac, NEWS for 3.3.6 + +commit fc3ada6e6bd790341fb5d91c6775b8afd686bad7 +Author: Matteo Frigo +Date: Sun Jan 15 06:40:23 2017 -0500 + + Ansi C Police + + fftw is supposed to compile with c89/c90. Restore this property + so that I can test with gcc -ansi. + + This change may seem needlessly reactionary, but in the last release I + accidentally inserted an assertion before a declaration and I broke + the Visual Studio build, so we must be careful not to use C99 + constructs. + + There are a few non-ANSI function calls in tests, e.g. isnan(), + drand48(), snprintf(). Since nobody has complained about those in + years, I am leaving them alone. + +commit 50dacdaba79694c873965ab23d11c8ca3b94d436 +Author: Matteo Frigo +Date: Sat Jan 7 09:01:47 2017 -0500 + + Revert simd-avx.h changes from b606e3191 + + They didn't improve performance at all as far as I can tell, + and they ended up breaking the PGI compiler. + + It is always tempting to use the fancy addsub instructions in FFTW to + do complex multiplications, but the reality is that FFTW is designed + to avoid complex multiplications in most cases (we started in the SSE + days), and thus they don't make any difference. We are better off + using the minimal possible set of AVX instructions to minimize the + chance of triggering compiler bugs. + + The same statement holds for _mm256_shuffle_pd() versus + _mm256_permute_pd(): in theory the latter is better, in practice + either one is rarely used. However, SHUFFLE is older (since the SSE + days) and has a higher chance of working. + +commit 5fa55dc130e18cc4b3f4d88b8a159307eecf51d0 +Merge: 1637e8aa aa00ba84 +Author: Matteo Frigo +Date: Sun Nov 13 05:49:09 2016 -0500 + + Merge pull request #77 from rolandschulz/master + + Fix AVX512 load+store + +commit aa00ba84079a272637666c9ae941821087f712b8 +Author: Roland Schulz +Date: Sat Nov 12 20:52:49 2016 -0800 + + Fix AVX512 load+store + + FFTW alignment is only 16 bytes. AVX512 requires 64 bytes. + Thus unaligned load/store is required. AVX256 does the same. + +commit 1637e8aace6e91d67837901b5a4cbbc87c42aca9 +Merge: 3e7ee221 a538bf2c +Author: Matteo Frigo +Date: Thu Nov 3 11:24:44 2016 -0400 + + Merge pull request #76 from forandom/patch-2 + + Update simd-vsx.h to support building with IBM XLC + +commit a538bf2c4a17ec509f2cec37bffe48874702c671 +Author: forandom +Date: Thu Nov 3 23:06:17 2016 +0800 + + Update simd-vsx.h to support building with IBM XLC + + defined(__POWER8_VECTOR__) && defined(__GNUC__) && defined(__LITTLE_ENDIAN__) is true for IBM XLC compiler for which we should use the intrinsic __vpermxor instead of __builtin_crypto_vpermxor. + +commit 3e7ee2211ae1bd5e76901bbe1bcca67b31f84ccb +Author: Matteo Frigo +Date: Sat Sep 24 06:39:01 2016 -0400 + + Do not run programs at configure time, ever. + + configure was running a program to detect the ARM cycle counter, + thus preventing cross-compiling. Sorry about that. + +commit fee0f966b2d3fae18019dd03a9bae338b4108d42 +Merge: 3a3173b0 cca0c6e5 +Author: Matteo Frigo +Date: Fri Sep 9 06:49:23 2016 -0400 + + Merge pull request #72 from tkelman/patch-1 + + #include in threads.c for windows build + +commit cca0c6e5a8c717df10f380411709f3360ceea6e9 +Author: Tony Kelman +Date: Fri Sep 9 03:24:30 2016 -0700 + + #include in threads.c for windows build + + otherwise an i686-w64-mingw32 cross compile is giving + ``` + libtool: link: i686-w64-mingw32-gcc -march=pentium4 -m32 -std=gnu99 -shared -Wl,--whole-archive kernel/.libs/libkernel.a dft/.libs/libdft.a dft/scalar/.libs/libdft_scalar.a dft/scalar/codelets/.libs/libdft_scalar_codelets.a rdft/.libs/librdft.a rdft/scalar/.libs/librdft_scalar.a rdft/scalar/r2cf/.libs/librdft_scalar_r2cf.a rdft/scalar/r2cb/.libs/librdft_scalar_r2cb.a rdft/scalar/r2r/.libs/librdft_scalar_r2r.a reodft/.libs/libreodft.a api/.libs/libapi.a simd-support/.libs/libsimd_support.a simd-support/.libs/libsimd_sse2_nonportable.a dft/simd/avx/.libs/libdft_avx_codelets.a rdft/simd/avx/.libs/librdft_avx_codelets.a threads/.libs/libfftw3f_threads.a -Wl,--no-whole-archive -march=pentium4 -m32 -O3 -mtune=native -malign-double -Wl,--stack -Wl,8388608 -o .libs/libfftw3f-3.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libfftw3f.dll.a + libtool: link: i686-w64-mingw32-gcc -march=pentium4 -m32 -std=gnu99 -shared -Wl,--whole-archive kernel/.libs/libkernel.a dft/.libs/libdft.a dft/scalar/.libs/libdft_scalar.a dft/scalar/codelets/.libs/libdft_scalar_codelets.a rdft/.libs/librdft.a rdft/scalar/.libs/librdft_scalar.a rdft/scalar/r2cf/.libs/librdft_scalar_r2cf.a rdft/scalar/r2cb/.libs/librdft_scalar_r2cb.a rdft/scalar/r2r/.libs/librdft_scalar_r2r.a reodft/.libs/libreodft.a api/.libs/libapi.a simd-support/.libs/libsimd_support.a simd-support/.libs/libsimd_sse2_nonportable.a dft/simd/avx/.libs/libdft_avx_codelets.a rdft/simd/avx/.libs/librdft_avx_codelets.a threads/.libs/libfftw3_threads.a -Wl,--no-whole-archive -march=pentium4 -m32 -O3 -mtune=native -malign-double -Wl,--stack -Wl,8388608 -o .libs/libfftw3-3.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libfftw3.dll.a + threads/.libs/libfftw3_threads.a(libfftw3_threads_la-threads.o):threads.c:(.text+0x121): undefined reference to `_mm_pause' + threads/.libs/libfftw3_threads.a(libfftw3_threads_la-threads.o):threads.c:(.text+0x581): undefined reference to `_mm_pause' + collect2: error: ld returned 1 exit status + threads/.libs/libfftw3f_threads.a(libfftw3f_threads_la-threads.o):threads.c:(.text+0x121): undefined reference to `_mm_pause' + threads/.libs/libfftw3f_threads.a(libfftw3f_threads_la-threads.o):threads.c:(.text+0x581): undefined reference to `_mm_pause' + collect2: error: ld returned 1 exit status + make[4]: *** [Makefile:627: libfftw3f.la] Error 1 + make[4]: *** [Makefile:627: libfftw3.la] Error 1 + make[3]: *** [Makefile:672: all-recursive] Error 1 + make[2]: *** [Makefile:536: all] Error 2 + make[3]: *** [Makefile:672: all-recursive] Error 1 + make[1]: *** [/home/Tony/julia32/deps/fftw.mk:46: scratch/fftw-3.3.5-single/build-compiled] Error 2 + make[1]: *** Waiting for unfinished jobs.... + make[2]: *** [Makefile:536: all] Error 2 + make[1]: *** [/home/Tony/julia32/deps/fftw.mk:46: scratch/fftw-3.3.5-double/build-compiled] Error 2 + make: *** [Makefile:81: julia-deps] Error 2 + ``` + +commit 97b273d87dcc797e688709e207f119dd4dfca015 +Author: Christoph Junghans +Date: Wed Aug 31 14:24:05 2016 -0600 + + Build und install cmake module + +commit 3a3173b018f30d03df5f3166d459888f2669fe25 +Author: Matteo Frigo +Date: Wed Aug 31 06:14:51 2016 -0400 + + C++ compatibility + + Although FFTW is a C program, we try to make it compilable by a C++ + compiler as well. Implicit cast void * ==> double * is not allowed + in C++. + +commit 5fd9609eaed60360ce84d98add5d9548093e0bdc +Author: Matteo Frigo +Date: Fri Aug 12 04:24:52 2016 -0400 + + Updated NEWS + +commit 402d2508fe970770d9316d9c83f21d6fc268ba12 +Author: Matteo Frigo +Date: Fri Aug 12 04:21:33 2016 -0400 + + Fix race condition when destroying a plan. + + More generally, this patch calls the planner hooks when destroying a + plan. The intended usage is that the hooks do in fact acquire a lock. + +commit 432835f2cd37d2cb8b9528ac8ef983b3b38738f2 +Author: Matteo Frigo +Date: Tue Aug 9 05:29:39 2016 -0400 + + MSVC fixes by Carsten Steger + + * don't mix declarations and statements, stick to ANSI C + + * suppress some warnings with Intel cc + + * undefined variable in x86-cpuid.h when + (_MSC_VER > 1500) || (_MSC_VER == 1500 & _MSC_FULL_VER >= 150030729) + +commit c018cbe430fd6b2af31d594c27a0aaf711292567 +Author: Matteo Frigo +Date: Thu Aug 4 06:36:29 2016 -0400 + + Fix SIMD autodetection on amd64 when (_MSC_VER > 1500) + +commit d5055c9ae2e60f191f6cc2e8b5200fd06dbdb6be +Author: Matteo Frigo +Date: Sun Jul 31 13:42:00 2016 -0400 + + revise README.md language + +commit 0af8d8b9eea0750add8be0e6dec18841ee61424e +Author: Matteo Frigo +Date: Sun Jul 31 13:39:49 2016 -0400 + + revise README.md language + +commit 0d026e09f9b514cb86bbc7977ad0a03b664b95de +Author: Matteo Frigo +Date: Sun Jul 31 13:37:09 2016 -0400 + + Attempt to tell users to download official tarballs from fftw.org instead of github + +commit b405994456f9a87f2170ba19536d4c4d8278682f +Author: Matteo Frigo +Date: Sat Jul 30 16:33:22 2016 -0400 + + update AUTHORS + +commit 4d0c1894fb37c61b0f0a42b50afd435d226f6b9e +Author: Matteo Frigo +Date: Sat Jul 30 15:18:06 2016 -0400 + + Fixes for Windows cross-compilation + + These days mingw by default produces binaries that depend on + libgcc-sjlj-1.dll, which defeats the whole historical point of mingw + (produce vanilla win32 binaries with no GNU stuff). + + Add a hack to link with -static-libgcc, which avoids the problem. + +commit a17d44eeb3100780ba106a22f497d47a43be7642 +Author: Matteo Frigo +Date: Sat Jul 30 11:39:09 2016 -0400 + + Misc fixes. + + * sed s/avx[_- ]128[-_ ]fma/avx-128-fma + * avoid some signed/unsigned casts + +commit f3688be112ed0099b4c57970db74c08373f3604d +Author: Matteo Frigo +Date: Sat Jul 30 10:52:53 2016 -0400 + + Fix SIMD autodetection + + * AVX was not testing for OSXSAVE support + + * AVX2 was broken (issuing XGETBV without checking for its presence---failing + on atom) + + * AVX512 was broken in the same way as AVX2, I have guessed a fix but + I have no way to test it. + +commit 7fce2ae37f8338bd7e021b1a406c75b213c31c77 +Author: Matteo Frigo +Date: Fri Jul 29 07:48:10 2016 -0400 + + document fftw_make_planner_thread_safe() + +commit 6167b92e3362f2d116274daa561c0d788fb670d4 +Author: Matteo Frigo +Date: Fri Jul 29 07:28:03 2016 -0400 + + rm README-bench + + It appears in tests/README + +commit cc9640cbbaa70e6645a0ea46be0508268905c2ba +Author: Matteo Frigo +Date: Fri Jul 29 07:27:25 2016 -0400 + + Add README-bench + +commit d82fe4f3e06bdbf92b09324e36f4d477bc5fe376 +Author: Matteo Frigo +Date: Fri Jul 29 07:25:00 2016 -0400 + + Do not enable avx128-fma unless the user asks for it. + + Adding SIMD instruction sets automatically is user-hostile behavior. + + Also, update the manual to reflect the new SIMD support + +commit dc32329871d304de8d95ad290973844dfbc6101f +Author: Matteo Frigo +Date: Fri Jul 29 07:00:55 2016 -0400 + + Update NEWS for 3.3.5 + +commit 2ed010c62b1bc8ca6b23bfda2e09b8c28e1e8bcc +Author: Matteo Frigo +Date: Sun Jun 5 07:07:15 2016 -0400 + + Clean up some int<->size_t confusion + +commit ea86c49ac7470a646d1e6a4fa007ecbda6ab56c4 +Author: Matteo Frigo +Date: Sat Jun 4 20:33:15 2016 -0400 + + Unused Variable Police + +commit d9a3f48343bda0a88c8a87cab329d95426ddfcb9 +Author: Matteo Frigo +Date: Sat Jun 4 20:30:12 2016 -0400 + + Integral Type Police + + clear some int/unsigned/size_t confusions + +commit 29cee6cc95d434321292d013d6a7be4c55379a49 +Author: Matteo Frigo +Date: Sat Jun 4 19:50:10 2016 -0400 + + Cast Police + + Eliminate some useless (but harmless) int<->size_t conversions. + +commit d7c566eb98523c7c0bafae734c7894a5a3595771 +Author: Matteo Frigo +Date: Sun Mar 13 17:50:45 2016 -0400 + + Clarify ambiguous/wrong documentation of halfcomplex output format. + +commit 6543818e3091ea788a1aac41d06ca343e672f103 +Author: Matteo Frigo +Date: Wed Jan 20 18:18:14 2016 -0500 + + Cleanup + + Rewrite Unique.make in more idiomatic caml style, + strongly typed. + +commit 4965e33c6c98484b66787f1891cfe4f689becee5 +Merge: 119aa4c4 f8a73593 +Author: Matteo Frigo +Date: Wed Jan 20 15:14:32 2016 -0800 + + Merge pull request #53 from artemkin/master + + Fixed unique token generation in genfft + +commit f8a73593a499efc751103460ff2f07d8b1e2ff0c +Author: Stanislav Artemkin +Date: Thu Jan 21 01:17:30 2016 +0400 + + Fixed unique token generation in genfft + + Unique token generation was based on the assumption that OCaml compiler + won't inline a given piece of code. Starting from 4.02.0 it does more + aggressive inlining and breaks this functionality. + +commit 119aa4c4a893f32dfd837a84fac9453b6dae6680 +Merge: 8c7a7af1 e41df2c3 +Author: Matteo Frigo +Date: Wed Sep 30 15:38:00 2015 -0400 + + Merge pull request #48 from rleonid/master + + Replace depracted usage of Pervasives or. + +commit e41df2c3cac7c3e69586c07f80f1bb0a24dccd5a +Author: Leonid Rozenberg +Date: Wed Sep 30 15:22:16 2015 -0400 + + Replace depracted usage of Pervasives or. + +commit 8c7a7af184a63064325fa542a8d1d7f4e3b4b8aa +Author: Matteo Frigo +Date: Tue Sep 8 10:35:18 2015 -0400 + + Clarify how to bootstrap fftw from the git repository + +commit a0cbff67eae9ab66f6f2b4cf2ea79de6c95d7d61 +Author: Matteo Frigo +Date: Tue Sep 8 10:28:49 2015 -0400 + + Clarify that ocamlbuild is necessary for --enable-maintainer-mode + +commit f6339eadef8a62432ea2f2017ce0b4a1954ea738 +Author: Steven G. Johnson +Date: Wed Aug 5 11:11:26 2015 -0400 + + fix LaTeX typo, thanks to Gael Lorieul + +commit 8cd9bfa347289143a00fa0d5eea30f4766192d46 +Author: Erik Lindahl +Date: Wed May 27 00:15:57 2015 +0200 + + Update VSX SIMD to avoid inline assembly + + Thanks to some help from Michael Gschwind of + IBM, this removes the remaining inline assembly + calls and replace the with vector functions. This + avoid interfering with the optimizer both on GCC + and XLC, and gets us another 3-10% of performance + when using VSX SIMD. Tested with GCC-4.9, XLC-13.1 + in single and double on little-endian power 8. + +commit 579cec9a64cc177e673f006eb112d488be21b230 +Author: Erik Lindahl +Date: Tue May 26 19:27:58 2015 +0200 + + Enable SSE2 automatically with AVX,AVX2, or AVX512. + + 256-bit AVX can be significantly slower than + 128-bit SIMD. Despite recommendations many + distributions appear to only enable AVX, but not + SSE. This fixes the problem by also enabling + SSE when we use the wider SIMD instructions. + +commit dd80210ec433938876575e2435e12d7e630872e7 +Author: Erik Lindahl +Date: Tue May 26 19:09:40 2015 +0200 + + Turn AVX-128 into AMD-specific AVX-128-FMA + + The only platform where AVX-128 really matters + is AMD (since the compute units can execute a + single 256-bit or two 128-bit SIMD instructions), + so now we only use it there which means we can + also enable FMA instructions. + +commit b3105ed9529846ca8dd9267e46d7bcd2ebb12ff6 +Author: Matteo Frigo +Date: Mon May 25 17:33:15 2015 -0400 + + Fix broken avx/32-bit compilation + +commit d3442a8395e1fc6e77490c3f34c868b1998e4e96 +Author: Matteo Frigo +Date: Mon May 25 17:27:31 2015 -0400 + + rm hooks api's, add fftw_make_planner_thread_safe() api + + fftw_make_planner_thread_safe() installs a lock around the planner. + It is guaranteed to be atomic and idempotent. + + I wrote an emulation of pthread mutex initializers on Windows, but I + haven't even compiled the Windows code yet. + +commit 842596fe6bfb277effc8f8f8db7e1c4008bb59e1 +Author: Matteo Frigo +Date: Mon May 25 11:11:58 2015 -0400 + + Add TODO's + +commit eff7dfcd526e90539f169cfff2374ceb2fd2dd0e +Author: Matteo Frigo +Date: Mon May 25 10:50:21 2015 -0400 + + add TODOs + +commit 0e53e3e9d2640a895a69c5aff4a676c156271141 +Author: Matteo Frigo +Date: Mon May 25 10:48:03 2015 -0400 + + Add argument to planner hooks + +commit 94ef591d61c8e78e87c65f9779eb003fc7f1ba6b +Author: Matteo Frigo +Date: Mon May 25 10:37:24 2015 -0400 + + Update shared-version-info + + We added an API (planner hooks), so the shared version info + needs to be bumped. + +commit 9ef9ec85588c026e6a80b1475df24ba20d098e8e +Author: Matteo Frigo +Date: Mon May 25 10:27:25 2015 -0400 + + Bump version to 3.3.5 + +commit 593d55932959366918e209fbbd2f4719d39d448c +Author: Romain Dolbeau +Date: Wed May 13 16:42:23 2015 +0200 + + Typo ; Fixes #41 + +commit cd2b27d1600d80ba719f1b70094886e39cf145a3 +Author: Erik Lindahl +Date: Thu May 7 17:45:43 2015 +0200 + + Separate routines to query 128-bit AVX support + + This also disables 256-bit AVX for current AMD processors + that work better with 128-bit AVX. Note that this is not + detected by the timing routines since the effect is only + apparent when using multiple cores. + +commit a1cf4158dd829853bd9f6b8c4c4951d7495c9e64 +Merge: b6135085 0331b39c +Author: Romain Dolbeau +Date: Mon Apr 20 22:01:15 2015 +0200 + + Merge branch 'master' of github.com:FFTW/fftw3 + +commit 0331b39cd3641a8ac89be27dbde3e41204fd1888 +Merge: 38b93ccf d2ea399c +Author: Erik Lindahl +Date: Mon Apr 20 21:09:44 2015 +0200 + + Merge branch 'experimental-simd' + + Merged in new SIMD architectures from separate branch. + +commit d2ea399c46174db45838ca6a3b917cf880970921 +Author: Romain Dolbeau +Date: Thu Apr 16 08:54:58 2015 +0200 + + Fix stack alignment (alloca) for generic256. + +commit b6135085bd1ee2e2c6c82b06e78d492e4f242cca +Author: Romain Dolbeau +Date: Tue Apr 14 10:17:38 2015 +0200 + + Add a configure option to disable building the documentation in doc/. This is useful if some documentation tools are missing on the host (i.e. fig2dev in maintainer mode). + +commit 38b93ccfc3786d1c23726dc939de558f4dd2a2d3 +Author: Romain Dolbeau +Date: Mon Apr 13 14:16:28 2015 +0200 + + In maintainer mode, detect whether 'indent' is available and is GNU indent. + + BSD 'indent' in e.g. MacOSX doesn't support -kr, which is the default style in FFTW3. + Fallback to 'indent' with no option for non-GNU 'indent', or 'cat' if 'indent' is not available. + This should fix GitHub issue #13. + +commit 96eb0ad31c8d0c226a6aeb95e68bda90dd7e6f6a +Author: Romain Dolbeau +Date: Sun Apr 12 13:49:39 2015 +0200 + + missing AC_ARG_ENABLE for --enable-fma + +commit 24ff943f4e99458d41db543305a2c945ba2ba429 +Author: Romain Dolbeau +Date: Sun Apr 12 13:47:24 2015 +0200 + + Revert "reinstate --enable-fma ; not enabled by default for AVX2 & AVX-512 (will ad a warning later)" + + This reverts commit 40691a49eea40d305405fe527e174e8067606dae. A different fix is needed. + +commit 37a0dbc10f0199fd431f0b5d8b42143cc2a2a88d +Author: Romain Dolbeau +Date: Sun Apr 12 13:39:28 2015 +0200 + + Add sanity check & warning in AVX2 & AVX-512 + +commit 40691a49eea40d305405fe527e174e8067606dae +Author: Romain Dolbeau +Date: Sun Apr 12 13:38:29 2015 +0200 + + reinstate --enable-fma ; not enabled by default for AVX2 & AVX-512 (will ad a warning later) + +commit 7960d08a3fe74b38d8dfdd20917efb52d141d53a +Author: Erik Lindahl +Date: Wed Apr 8 22:55:28 2015 +0200 + + Improved compiler flags for OS X + + Separate detection for AVX/AVX2 on gcc and clang. + Clang works for AVX, but AVX2 leads to a compiler + crash. Issue 20471870 has been filed with Apple. + When using gcc, we now request to use the external + system assembler, or the AVX/AVX2 instructions will + cause errors. + +commit 91928338b767b84742e8ec86da6b4864381ed889 +Author: Erik Lindahl +Date: Wed Apr 8 22:54:41 2015 +0200 + + Fix alignments for generic simd. + +commit eaaec9b6ea9dc0f0656d953639c325855cb3bbee +Author: Erik Lindahl +Date: Wed Apr 8 21:16:13 2015 +0200 + + Made api versions more verbose for 128-bit AVX. + +commit 4b3dbf7009b020bffe7c9c96a5b24c87496fd058 +Author: Erik Lindahl +Date: Wed Apr 8 21:09:50 2015 +0200 + + Make 128/256 bit generic simd separate options + + These will only be used on esoteric and/or new + architectures, which likely also miss cycle counters. + In this case the widest simd would be picked automatically + based on flops estimates, so to give the user more + control it is better to provide separate options + to enable/disable these two choices. + +commit cbe2a4a64064d12b9b817235906d61a996c00be1 +Author: Romain Dolbeau +Date: Mon Mar 30 13:35:47 2015 +0200 + + AVX-512: minor fix(sp)&improvement(dp) to VDUPL/VDUPH + +commit 5379243044ea4113b9cbde25fd097195817b3653 +Author: Romain Dolbeau +Date: Sun Mar 29 14:17:13 2015 +0200 + + AVX-512: fix typo; fix shuffle parameter in SP; _mm512_set1 exists now. + +commit 90f9610ee6708efc11c848b5e078dd92997ffa25 +Author: Romain Dolbeau +Date: Sun Mar 29 14:14:02 2015 +0200 + + Fix typo in KCvi + +commit 2b44c9213a11816506b1bd3d6b7316ed1ed65a15 +Merge: 5c5bed23 1f28d2d3 +Author: Romain Dolbeau +Date: Sun Mar 29 10:49:42 2015 +0200 + + Merge branch 'experimental-simd' of github.com:FFTW/fftw3 into experimental-simd + +commit 5c5bed2365693b5f57503f6aad35264a3b3d86b9 +Author: Romain Dolbeau +Date: Sun Mar 29 10:48:13 2015 +0200 + + typo for AVX-512 + +commit 1f28d2d3693bd919c674e08dc76726cf56d3648f +Author: Romain Dolbeau +Date: Sun Mar 29 10:48:13 2015 +0200 + + typo + +commit a8845007ecb07fd0cc91994c574b1008c64708e0 +Author: Romain Dolbeau +Date: Thu Mar 19 19:22:44 2015 +0100 + + Generic SIMD support for gcc + + While not as optimized as the specific SIMD ports, this + enables the usage of gcc's generic vector representation, + which usually gets implemented with SIMD instructions on + most hardware. Double precision implementations for 256 + and 128 bits by Romain Dolbeau, merged into a single + generic SIMD implementation and single precision added + by Erik Lindahl. The option --enable-generic-simd will + turn on both 128 and 256 bit versions, and the timers will + choose the fastest codelets. + +commit 56bbdbab2f03ebae92fd2c52b9509fb3b8ffe226 +Author: Erik Lindahl +Date: Tue Mar 24 19:35:31 2015 +0100 + + Added Power8 VSX SIMD support + + Power8 is a descendent of Power7, but the switch to little endian + means the old altivec SIMD will not work due to shifts on load + and store, and the new VSX instructions are much improved. + This adds support for both single and double precision VSX SIMD, + using either gcc (tested with version 4.9) or IBM xlC (tested with + version 13.1.2, slower than gcc). Clang from llvm-3.7 is still too + buggy to compile VSX code correctly, but flags and detection has + been added so it will work with a correct clang. + +commit 8aa91763af07767f3ebb71a9836a69e3b3385cab +Author: Romain Dolbeau +Date: Tue Feb 24 09:27:07 2015 +0100 + + Double precision Neon SIMD for aarch64 + + --enable-neon now works in double precision for 64-bit Arm. + Support added for the generic timer virtual counter in armv7a + (optional, available in A15 & A7) & armv8. They are privileged, but + should be made user-readable in recent linux (> 3.19.1 for v7a, + most for v8). + Architecture Reference Manual ARMv7-A and ARMv7-R edition: + E.7.16 CNTVCT, Virtual Count register, system level + Architecture Reference Manual ARMv8, for ARMv8-A architecture + profile Beta: D7.5.17 CNTVCT_EL0, Counter-timer Virtual Count register + +commit aa26395250c9c4d6831e8e5017650ea70af56a28 +Author: Romain Dolbeau +Date: Thu Sep 5 10:53:42 2013 +0200 + + AVX-512 SIMD support + + New configure flag --enable-avx512 + +commit de81bfdb66b9bc867e389bbaf67b56490ca2e2cd +Author: Erik Lindahl +Date: Wed Mar 25 15:49:33 2015 +0100 + + 128-bit AVX2 SIMD support + + Add 128 bit support for AVX2. Similar to AVX-128, this + improves slightly on SSE2 due to more efficient instructions, + and the shorter SIMD width is beneficial in some cases. Both + 128- and 256-bit flavors will be built automatically with + --enable-avx2, and the timing routines will chose the best one + automatically. + +commit da988fa4c53fb63fafe2eeff3da4abad93e7d014 +Author: Erik Lindahl +Date: Sat Mar 28 12:52:52 2015 +0100 + + AVX2 kernels and CPUID support + + Initial AVX2 code from Romain Dolbeau. Modifications, + cpuid and more compiler flags from Erik Lindahl. + New --enable-avx2 configure flag supported. + +commit d7d9b9d2b71bd93bc4d4fa82d46a9c013291b7fe +Author: Romain Dolbeau +Date: Tue Sep 3 10:02:53 2013 +0200 + + KCvi [Knight Corner Vector Instructions] SIMD support + + This adds SIMD support for the first generation of Xeon Phi. + +commit b606e3191e5b65e2e13f67ef7dad5b1e7c40206c +Author: Erik Lindahl +Date: Wed Mar 25 01:44:17 2015 +0100 + + Improved AVX SIMD + + Previously, some kernels were actually faster with the old SSE2 + SIMD, which made it necessary to compile with both sse2 and avx + for good performance. This adds 128-bit AVX kernels which are + enabled together with the standard AVX kernels. Apart from + being encoded with AVX rather than SSE instructions + (depending on compiler flags), it also uses a couple of new + instructions only available with AVX that use fewer micro-ops. + These instructions have also been added to the 256-bit AVX SIMD + implementation. No new configure flags needed, it is just faster. + +commit 131027afcd3ed5d7c0185611036431c1035a734a +Merge: 0ea3051f 56af330f +Author: Matteo Frigo +Date: Sun Mar 22 16:24:29 2015 -0400 + + Merge pull request #37 from maxlevesque/patch-1 + + add indent to requirements + +commit 56af330fc1600a856241968482ecd443bc2c26aa +Author: Maximilien Levesque +Date: Sat Mar 21 22:41:26 2015 +0100 + + add indent to requirements + + Without indent, `make` reports errors in somewhere in a directory called codelets. + It also reports "/bin/bash: indent: command not found" not far away. + + For my Ubuntu 14.04 flavor, a simple `sudo apt-get install indent` made `make` work as expected. + +commit 0ea3051f99f2931a46a66aef8862517cd9c5f3c7 +Merge: 506c1634 69a82a6c +Author: Matteo Frigo +Date: Mon Feb 16 06:36:46 2015 -0500 + + Merge pull request #32 from psteinb/2d_mem_layout_complying_to_text + + changed ny to n1 and nx to n0 so that the labels match the text + +commit 69a82a6c5ff4d2169a7f8a0afda9f3c68f24eb2a +Author: Peter Steinbach +Date: Mon Feb 16 09:10:23 2015 +0100 + + changed ny to n1 and nx to n0 so that the labels match the text, it's quite confusing otherwise + +commit 506c16346f9fc57444b179e542e88225e3c3e923 +Author: Steven G. Johnson +Date: Fri Jan 30 15:02:17 2015 -0500 + + fix #29 + +commit d94666815b9a0073e4ac8cc48f88e18ac931bd45 +Merge: ded00512 9831bbd1 +Author: Steven G. Johnson +Date: Sun Dec 7 16:39:15 2014 -0500 + + Merge pull request #27 from mpip/master + + avoid segfaults due to double free + +commit 9831bbd14ca5b963ad1dba260c86151c94e000ee +Author: Michael Pippig +Date: Sat Dec 6 15:03:33 2014 +0100 + + avoid segfaults due to double free + + If fftw_mpi_mkplans_posttranspose() fails, the plans cld3, cld2rest, + and cld2 are destroyed at nada and must be set to NULL. Otherwise, + a second destroy at nada in mkplan() will cause a segfault. + +commit ded0051238f129fb65846e822191706c9b1f5221 +Author: Matteo Frigo +Date: Sun Nov 16 09:45:16 2014 -0500 + + Conciseness Police + +commit 113e1086966fdff4c172672753cc880e6bc74d3d +Author: Matteo Frigo +Date: Sun Nov 16 09:41:05 2014 -0500 + + add {before,after}_planner_hooks + + FFTW now calls fftw_before_planner_hook() before creating a plan, and + fftw_after_planner_hook() afterwards. This allows users, e.g., to + grab a lock. + + TBD: add arguments. + +commit 28635e1d5f0a0079af3e7d00cd0678c4745e2c2b +Author: Matteo Frigo +Date: Sun Nov 16 09:22:47 2014 -0500 + + avoid multiple declarations of fftw_alignment_of() + + fftw_alignment_of() was declared both in the API header file fftw3.h + and in the internal header file ifftw.h. While there is nothing wrong + with this, it breaks the property that all exported symbols are + defined in the API directory. E.g., I am not sure what happens on + windows without the proper DLLEXPORT nonsense. + + To avoid any issues, rename the internal routine to + fftw_ialignment_of(), and define an API wrapper. + +commit 36597576e4c3c5dc3efd7d8b57a1bbad505715aa +Author: Steven G. Johnson +Date: Tue Aug 12 12:29:50 2014 -0400 + + fix #21 (don't use float128 on Portland compilers, which pretend to be gcc) + +commit cde4559ba9b822166cb88a84a0994fdb83a2061c +Author: Matteo Frigo +Date: Sat Jul 26 20:09:38 2014 -0400 + + Avoid transforming uninitalized data. + + In r2c/c2r transforms when using 4-way SIMD, sometimes FFTW uses the + following hack: to transform an odd number of inputs, it copies the + input into a buffer that holds space for one extra input; it + transforms the buffer (now comprising an even number of inputs, as + required by SIMD); it copies back the odd number of transformed + inputs, ignoring the padding element. + + The extra input was uninitialized until now. This is ok because we + ignore the transform of the uninitialized input. Transforming + uninitialized data may cause floating-point exceptions, an effect that + is observable. This patch initializes the additional elements to + zero, thus avoiding the problem. + + This patch also includes a test, but the test is disabled by default + because it is nonportable. To observe the FP exception, one must use + feenableexcept(), which appears to be a GNU-ism. + +commit 2493129c332197c5195ecb6796cfeb5e8d92e09a +Author: Steven G. Johnson +Date: Thu Jul 10 10:41:38 2014 -0400 + + fix #19: missing Fortran interface for fftwq_alloc_real + +commit 07ef78dc1b273a40fb4f7db1797d12d3423b1f40 +Author: Steven G. Johnson +Date: Tue Jul 8 11:14:15 2014 -0400 + + fix #18 (disable float128 for CUDACC) + +commit 2fd372f31ab7c6417de0634199bcd5b7765df926 +Author: Matteo Frigo +Date: Sat Jun 28 17:17:19 2014 -0400 + + git rm *~ + +commit 203e0d610ec1e413bb426a7d60fd5e2a206a2830 +Author: Matteo Frigo +Date: Thu Apr 3 15:46:19 2014 -0400 + + Fix wrong boolean precedence in hppa cycle counter. + + Thanks Jens Keiner for the bug report. For some reason nobody noticed + this in years. + +commit f8048af3e30cb3f65befd0aa2f3d16de3eeb5583 +Author: Steven G. Johnson +Date: Tue Mar 4 15:23:11 2014 -0500 + + more .gitignore additions + +commit 5a51b3fe98509cc7e7ba5d3e17a3381777ad4731 +Author: Steven G. Johnson +Date: Tue Mar 4 15:21:31 2014 -0500 + + some fixes for make distcheck + +commit 836af27f5d780970c87e436da882c9928e09c0f0 +Author: Steven G. Johnson +Date: Tue Mar 4 13:42:02 2014 -0500 + + copyright year update + +commit 853f9f7cad1a8d3e92e6767562e4cd2d336164d2 +Author: Steven G. Johnson +Date: Tue Mar 4 13:39:18 2014 -0500 + + updates for 3.3.4 + +commit bf30f5aeea1c2927b302b13dc7579acf9f2adc12 +Author: Steven G. Johnson +Date: Tue Mar 4 13:30:00 2014 -0500 + + another file in .gitignore + +commit c82b4fd61796715b1043982b1d4af49047f90238 +Author: Steven G. Johnson +Date: Tue Mar 4 10:39:09 2014 -0500 + + add .gitignore + +commit 146fa8d61fca4a06a85c70d7167ac925575df02b +Author: Steven G. Johnson +Date: Thu Jan 16 10:47:40 2014 -0500 + + added fftw_sprint_plan to output plan info to a string (so that the caller can be more flexible about how it is displayed) + +commit 53e1fdbc07133b53ffbbd51c56b57a89880c0b21 +Author: Steven G. Johnson +Date: Thu Jan 16 10:26:48 2014 -0500 + + document fftw_alignment_of (since I found it useful in Julia, other people may too) + +commit 7dbc7067e99477312acae30a9001c0dffa9bb428 +Author: Matteo Frigo +Date: Tue Nov 19 19:08:44 2013 -0500 + + group together AC_CHECK_DECLS for functions in stdlib.h + +commit fb70e413bddca578b2b72e0cac281d5c9a3c4101 +Author: Matteo Frigo +Date: Tue Nov 19 07:33:59 2013 -0500 + + Be more careful in detecting sinl(), cos(), memalign(), posix_memalign() + +commit 40f59a1d0f9bf384826595c499b0e7fe99aa1df5 +Author: Matteo Frigo +Date: Tue Nov 19 06:20:43 2013 -0500 + + Fix autodetection of cosl(), sinl() + + Autoconf must have changed since we last looked. Thanks + Åke Sandgren for the fix. + +commit 7e66dc5a495edc855dc9e156767172eaeabee335 +Author: Matteo Frigo +Date: Sat Oct 26 17:31:00 2013 -0400 + + Fix wrong example in fftw-wisdom-to-conf.1 + + Thanks Julian Taylor for the bug report. + +commit dd3283ac7d2e916bdeccb7229a669fcc2ef7ff83 +Author: Matteo Frigo +Date: Tue Oct 1 07:03:51 2013 -0400 + + Use "bench$(EXEEXT)" instead of "bench" + + Seems to be necessary on Windows. + +commit c6acf03f53d217c9041eae3d381ad41b942dc9d9 +Author: Steven G. Johnson +Date: Fri Sep 20 09:26:08 2013 -0400 + + fix typo + +commit f230f8cf903f1e2bb1261ed2f8657a99ac12a9ca +Author: Matteo Frigo +Date: Thu Jul 11 19:28:50 2013 -0400 + + Fix fftw-wisdom-to-conf + + Apparently we broke fftw-wisdom-to-conf many years ago and nobody + noticed. Thanks Florian Oppermann for the bug report. + +commit c74775bff0c164611377b29d95b3f6a6e8192005 +Author: Matteo Frigo +Date: Tue Jun 4 10:31:33 2013 -0400 + + Somehow the NEWS entries for fftw-3.1.[23] were missing from the trunk. + +commit c87bdc8bfd7cbf753bbe0635ea82613bc271220d +Author: Matteo Frigo +Date: Mon Jun 3 06:59:35 2013 -0400 + + note fixes for texinfo-5 + +commit ed390e3a385832e1faa452032f170510be6ed280 +Author: Matteo Frigo +Date: Sun Jun 2 09:10:01 2013 -0400 + + version.texi should not be in git + +commit aff23d05642705f738f788648c060085bdc476d6 +Author: Matteo Frigo +Date: Sun Jun 2 09:05:50 2013 -0400 + + Fix the manual to work with both texinfo-4 and texinfo-5. + + Texinfo has been stable for the first 15 years of FFTW's history. + Then some genius, with too much time in his hands and on a mission to + deliver the world from the evil of the C language, decided to rewrite + makeinfo in Perl, the old C version of makeinfo being, as I said, + evil. The official excuse for the rewrite was that now I can have my + manual in XML format, as if XML were a feature. + + The result of this stroke of genius is that texinfo-5 has different + rules for macro expansion than texinfo-4 does, specifically regarding + whether or not spaces after a macro are ignored. Texinfo-4 had weird + rules, but at least they were constant and internally more or less + consistent. Texinfo-5 has different rules, and even worse the rules + in texinfo-5 are inconsistent between the TeX and HTML output + processors. This situation makes it almost impossible for us to + produce a manual that works with both texinfo 4 and 5 in all modes + (TeX, info, and html). The @noindent/@refill hack is my best shot at + patching this situation. + +commit b0308275bb63a9cb3edb5847fa130f901deaf47e +Author: Matteo Frigo +Date: Fri May 17 11:39:05 2013 -0400 + + fftw_wisdom.1.in: document the --threads option. + +commit 7eb9af0354f7663fa89daa56163d5bc5865bcec1 +Author: Matteo Frigo +Date: Wed Mar 27 13:12:15 2013 -0400 + + Define the version number as M4 macros, so that it is defined only once. + + We used to have two version strings: the package number FFTW-X.Y.Z and + the libtool number CURRENT:REVISION:AGE with the invariant that + REVISION==Z. Unfortunately in the fftw-3.3.3 release we forgot to + change REVISION, with the result that fftw-3.3.3 and fftw-3.3.2 have + the same REVISION number. + + Hopefully this patch will prevent similar screwups in the future. + +commit e67d16ed0b81b0e01124c7cdee2320bfea2fd6e4 +Author: Matteo Frigo +Date: Sun Mar 17 19:47:57 2013 -0400 + + note that these scripts are not meant for normal users + +commit b892c705c7051bcd27c0939070e515fe85f68bb2 +Author: Matteo Frigo +Date: Sun Mar 17 19:45:52 2013 -0400 + + add README.md for github's convenience + +commit 029db460f692ea9fefc7d0efdf8e11b5d51215b0 +Author: Matteo Frigo +Date: Sun Mar 17 19:44:00 2013 -0400 + + Update README for people who download the git repository. + +commit 128e9ddbde76a63c7f255b258ff02bd6766cbaa4 +Author: Matteo Frigo +Date: Sun Mar 17 19:37:40 2013 -0400 + + Remove reference to obsolete mailing list. + +commit 4b1d3b63d64a01216c023389565e40ca03d6be2f +Author: Matteo Frigo +Date: Sat Mar 16 09:47:59 2013 -0400 + + mkdist.sh: use git instead of darcs + + Use git instead of darcs to generate the ChangeLog. Also, refuse to + create a distribution if git HEAD does not have a tag, to prevent a + common mistake. + +commit fe84f5d9eeef9f773b0785ba91032ab5b7677461 +Author: Matteo Frigo +Date: Sat Mar 16 09:26:03 2013 -0400 + + remove some junk '*~' files created by the darcs->git conversion + +commit 2f9d0a41eec86def6fe9160dac1be172bb241eba +Author: stevenj +Date: Thu Feb 7 14:22:12 2013 -0500 + + use Win32 threads, not pthreads, if both are present (it's not clear why Windows users would ever want the latter); see also https://github.com/JuliaLang/julia/issues/2015 + +commit b8623189967ed7eb1ca50e80f2b5ee2d6f3ca0ad +Author: stevenj +Date: Thu Feb 7 14:13:40 2013 -0500 + + I found it useful in the Julia interface to call fftw_alignment_of (in order to check plan applicability), in which case we need to IFFTW_EXTERN it for Windows; might be worth considering documenting this function + +commit 23b1bf3e19198d2c4575bf6f305cd41ebc17124c +Author: athena +Date: Sat Jan 12 15:35:46 2013 -0500 + + Increase timing interval to 5000 cycles on x86_64 + +commit 6e615417da7e1c7cba49b1a73c9edcc15d938cf9 +Author: athena +Date: Tue Dec 4 15:58:22 2012 -0500 + + make -lm a private library in fftw.pc.in + + Julian Taylor says: + + Make -lm a private library, libfftw is linked against it so clients + don't need it. You can use pkg-configs --static flag for static + linking. this works on all systems where indirect linking works, + probably on all others pkg-config is not supported anyway (wild + guess). + +commit 553849f32bcc82a17de11c76cfa9b2f672bfb89e +Author: athena +Date: Tue Dec 4 15:54:58 2012 -0500 + + Escape minus signs in man pages + + http://lintian.debian.org/tags/hyphen-used-as-minus-sign.html says: + + By default, "-" chars are interpreted as hyphens (U+2010) by groff, + not as minus signs (U+002D). Since options to programs use minus + signs (U+002D), this means for example in UTF-8 locales that you + cannot cut and paste options, nor search for them easily. + + Thanks Julian Taylor for the patch. + +commit 715c7ea8347a5dad7d97a0c5d81a87801e826ada +Author: athena +Date: Tue Dec 4 15:53:28 2012 -0500 + + Change texinfo category to Development + +commit 01810ba2a427ee086a4a5323e991dd19e2d715be +Author: stevenj +Date: Sat Nov 24 22:37:54 2012 -0500 + + fixed deadlock bug caused by bogosity flag getting out of synch between processes; thanks to Michael Pippig for the bug report + +commit 69aa82642e26a8eb5292a8a7b83250e8df619065 +Author: athena +Date: Wed Nov 21 18:34:29 2012 -0500 + + Updated NEWS + +commit e98f888b9457ce5855491279c6c0ef72e23a374c +Author: athena +Date: Wed Nov 21 18:33:15 2012 -0500 + + use 2x2 AVX transposition instead of individual stores. + + This seems to improve single-precision AVX on Sandy Bridge machines. + +commit 466f579cb8856a0709da1e6c6b5ca03360bc61a0 +Author: stevenj +Date: Tue Nov 20 12:18:00 2012 -0500 + + revert part of Taylor patch to acx_mpi.m4: do not link -lmpi if mpicc works without libraries, as -lmpi may be some completely different MPI implementation + +commit 610460226f6d5d2d7c4c53896b5aff9b1f108e4b +Author: stevenj +Date: Tue Nov 20 11:44:57 2012 -0500 + + fix deadlock bug (thanks to Michael Pippig for the bug report and patch, and to Graham Dennis for the bug report) in which some processes called MPI_Alltoall and some called MPI_Alltoallv + +commit 512d8d783d6af373fca8376f79255b794df5bd31 +Author: athena +Date: Mon Oct 29 15:20:01 2012 -0400 + + fix texinfo quirk + +commit ff329890540002506c47717ebbc3959de30e5066 +Author: athena +Date: Mon Oct 29 09:16:43 2012 -0400 + + clarify that padding only applies to in-place transforms + +commit 905ded711f93fa3c94faa7623a5093525338fdeb +Author: athena +Date: Sun Oct 28 18:42:48 2012 -0400 + + make the index-computation logic less paranoid + + The problem is that for each K and for each expression of the form P[I + + STRIDE * K] in a loop, most compilers will try to lift an induction + variable PK := &P[I + STRIDE * K]. In large codelets we have many + such values of K. For example, a codelet of size 32 with 4 input + pointers will generate O(128) induction variables, which will likely + overflow the register set, which is likely worse than doing the index + computation in the first place. + + In the past we (wisely and correctly) assumed that compilers will do + the wrong thing, and consequently we disabled the induction-variable + "optimization" altogether by setting STRIDE ^= ZERO, where ZERO is a + value guaranteed to be 0. Since the compiler does not know that + ZERO=0, it cannot perform its "optimization" and it is forced to + behave sensibly. + + With this patch, FFTW is a little bit less paranoid. FFTW now + disables the induction-variable optimization" only when we estimate + that the codelet uses more than ESTIMATED_AVAILABLE_INDEX_REGISTERS + induction variables. + + Currently we set ESTIMATED_AVAILABLE_INDEX_REGISTERS=16. 16 registers ought + to be enough for anybody (or so the amd64 and ARM ISA's seem to imply). + +commit 1dacef5bde5cb6599f9d98e42495f7897f109787 +Author: athena +Date: Sun Oct 28 18:33:24 2012 -0400 + + silence warnings + +commit fb08724b27a05ca890c1da062c8d0385c22c02eb +Author: athena +Date: Sat Oct 27 09:58:49 2012 -0400 + + bump version to 3.3.3 + +commit c4d6abbc1c80eb612b2abccce728a06189780a69 +Author: athena +Date: Sat Oct 27 09:55:15 2012 -0400 + + evaluate plans for >1ms when using gettimeofday() + + The previous limit 10ms was too paranoid, and it made life difficult + on machines without an "official" cycle counter, such as ARM. + +commit 172dd3def821c0898822a5ca72c3f5391553536c +Author: athena +Date: Sat Oct 27 09:46:04 2012 -0400 + + use 4-way NEON SIMD instead of 2-way + + Kai-Uwe Bloem tried to warn me a year ago that 128-bit NEON was better + than 64-bit NEON even on machines with a 64-bit pipe, but I foolishly + did not listen. Now that 128-bit NEON pipes are starting to appear on + the market it is definitely time to switch. + +commit 1c9c469f8727ab1780533226283746e7e9098694 +Author: athena +Date: Wed Sep 26 14:21:12 2012 -0400 + + Note that fftw-3.3 includes MPI support + +commit 2de12d67e5f4e34d39119f2e730e9d70e4df0c4e +Author: athena +Date: Wed Jul 18 11:25:40 2012 -0400 + + remove obsolete unused function + +commit 6bc94ae7db56490e35c256bd4840608eea6ec150 +Author: stevenj +Date: Fri Jun 29 15:57:14 2012 -0400 + + whoops, call omp_get_max_threads; thanks to Hanno Rein for the bug report + +commit 747ece1503281aad7beb32448af9a7cad05eba52 +Author: athena +Date: Sat Apr 28 10:55:09 2012 -0400 + + Fix libfftw3/libfftw3_threads chicken-egg problem + + On most systems we want to build libfftw3 first, so that + libfftw3_threads can depend upon libfftw3. When producing a single + combined-thread library (e.g. on Windows) we want the opposite, + so that libfftw3 can include libfftw3_threads. + +commit 4bcfb67da7211171d5f4b80a90845770bbd2e147 +Author: athena +Date: Sat Apr 28 10:11:28 2012 -0400 + + updated NEWS for 3.3.2 + +commit cb553a8315ae9a700558956a190aac4658064b83 +Author: athena +Date: Thu Apr 26 19:36:11 2012 -0400 + + change revision to 3.3.2 + +commit 98229b0d7673cfa15a8c339d305b09367b97d670 +Author: athena +Date: Thu Apr 26 19:31:02 2012 -0400 + + Remove old aligned_main() hack. + + On i386, in our benchmark program we used to manually aligned the + stack to 16-byte boundary via asm trickery. This was a good idea in + 1999 (and it was actually necessary to make things work) but the hack + is now obsolete and it seems to break gcc-4.7. So the hack is now + gone. + +commit 4e4c680e7497ee8bb87bb31451d10d71b8c205e2 +Author: athena +Date: Thu Mar 29 16:26:16 2012 -0400 + + Bugfix: a couple of uninitialized values in the benchmark program + +commit 229d864bde7f95f45ee23608b756926a3a20ddd0 +Author: athena +Date: Tue Mar 20 19:03:47 2012 -0400 + + make libfftw{threads,mpi} depend upon libfftw for libtool purposes + + Thanks Julian Taylor for the patch + +commit f9a05701f2027906b68ff913713166310e18c8cc +Author: stevenj +Date: Tue Mar 6 04:44:00 2012 -0500 + + formatting tweak + +commit cec6c01b2647796f5909cfe2d90ce040380da5c5 +Author: athena +Date: Mon Mar 5 21:05:27 2012 -0500 + + destroying => overwriting + +commit ad79a0ae3baf83548bc5c9597b0aae94e5226073 +Author: stevenj +Date: Fri Mar 2 10:31:20 2012 -0500 + + note that WISDOM_ONLY is a documented flag + +commit adf4cdab68e50778689170eb91270bb189aea1ac +Author: stevenj +Date: Fri Mar 2 10:27:08 2012 -0500 + + check for icc pretending to be gcc before including quad-precision decls; thanks to Michael Anselmi for the bug report + +commit 99aeb386978a56c1a33f6fe7c9b7942421cf550e +Author: stevenj +Date: Fri Mar 2 10:23:19 2012 -0500 + + foo_CFLAGS needs to manually include AM_CFLAGS; thanks to Henry Gomersall for the Windows bug report + +commit 6060dbccef23e01e603f44d42ab602ab89a9442e +Author: athena +Date: Sat Feb 25 15:21:39 2012 -0500 + + update for latest mingw + +commit 06fff6523418bd7ee2478c081cec418eb73adee5 +Author: stevenj +Date: Mon Feb 20 23:06:13 2012 -0500 + + added Fortran NEWS + +commit 51e33866a2c0cc189954b8197e5053b3275fc564 +Author: stevenj +Date: Mon Feb 20 23:00:13 2012 -0500 + + move non-portable extended/quad precision F03 interfaces into separate .f03 files (while keeping double/single in fftw3.f03 for minimal ABI breakage) + +commit 545c90a1db20c5cd50f30d0f31d2334ec10cf8ac +Author: athena +Date: Mon Feb 20 11:21:57 2012 -0500 + + rm mpi/fftw3-mpi.f03 at make clean time; thanks Tyler Luchko for the bug report. + +commit b7c0fcdee76b9f2efe194ec13d3b1ca97fadf376 +Author: athena +Date: Mon Feb 20 11:18:24 2012 -0500 + + Disable a Visual Studion warning that was obnoxious enough for Sebastian Schuberth to send us a patch. + +commit 4a0de08f4d1f026454fba2e053bd0573afb984d2 +Author: athena +Date: Mon Feb 20 11:18:06 2012 -0500 + + Change version to 3.3.1 + +commit 49783f83e58d9bc7dc3ea7f1822fefe961361935 +Author: athena +Date: Mon Feb 20 11:03:15 2012 -0500 + + Integrated Visual Studio AVX patches by Carsten Steger + +commit bc9dc18402445ce9b357dea5ff2b20720773ddc5 +Author: stevenj +Date: Wed Nov 9 10:13:32 2011 -0500 + + typo + +commit 659e85e6065429fc6a6e4a005bc5f5068f707fb3 +Author: stevenj +Date: Tue Nov 8 22:45:09 2011 -0500 + + add missing F77 set_timelimit function; thanks to Martin Diehl for the bug repory + +commit cf1a5563a691fd0c25c67910926adb2ef936cbb7 +Author: athena +Date: Sun Sep 25 10:54:56 2011 -0400 + + note requirement of /machine:x64 in windows x64 README + +commit cb216e1fd71ab751f2de5e083bc0237cc98535c9 +Author: athena +Date: Sun Sep 18 09:28:20 2011 -0400 + + AVX detection for MSVC + +commit 8acf60e9e0c6417a91d9a21dddb1467feb4fd23e +Author: athena +Date: Tue Sep 13 14:58:29 2011 -0400 + + compile with C89 + +commit f3edf46ebdda4a632ccb0ece6c5fa0559014d24e +Author: athena +Date: Sat Sep 3 16:25:50 2011 -0400 + + use the same search pruning heuristics for threaded plans as for nonthreaded plans + +commit f004d764307d0e1815c2f936a9a398825d367f2c +Author: athena +Date: Sat Sep 3 16:12:11 2011 -0400 + + shorten ESTIMATE planning time for certain weird sizes + + FFTW includes a collection of "solvers" that apply to a subset of + "problems". Assume for simplicity that a "problem" is a single 1D + complex transform of size N, even though real "problems" are much more + general than that. FFTW includes three "prime" solvers called + "generic", "bluestein", and "rader", which implement different + algorithms for prime sizes. + + Now, for a "problem" of size 13 (say) FFTW also includes special code + that handles that size at high speed. It would be a waste of time to + measure the execution time of the prime solvers, since we know that + the special code is way faster. However, FFTW is modular and one may + or may not include the special code for size 13, in which case we must + resort to one of the "prime" solvers. To address this issue, the + "prime" solvers (and others) are proclaimed to be SLOW". When + planning, FFTW first tries to produce a plan ignoring all the SLOW + solvers, and if this fails FFTW tries again allowing SLOW solvers. + + This heuristic works ok unless the sizes are too large. For example + for 1044000=2*2*2*2*2*3*3*5*5*5*29 FFTW explores a huge search tree of + all zillion factorizations of 1044000/29, failing every time because + 29 is SLOW; then it finally allows SLOW solvers and finds a solution + immediately. + + This patch proclaims solvers to be SLOW only for small values of N. + For example, the "generic" solver implements an O(n^2) DFT algorithm; + we say that it is SLOW only for N<=16. + + The side effects of this choice are as follows. If one modifies FFTW to + include a fast solver of size 17, then planning for N=17*K will be + slower than today, because FFTW till try both the fast solver and the + generic solver (which is SLOW today and therefore not tried, but is no + longer SLOW after the patch). If one removes a fast solver, of size say + 13, then he may still fall into the current exponential-search behavior + for "problems" of size 13*HIGHLY_FACTORIZABLE_N. + + If somebody had compleined about transforms of size 1044000 ten years + ago, "don't do that" would have been an acceptable answer. I guess the + bar is higher today, so I am going to include this patch in our 3.3.1 + release despite their side-effects for people who want to modify FFTW. + +commit 610f7976d8d31f385e2bce4fd8da0a5c770fb877 +Author: athena +Date: Sat Aug 27 13:55:24 2011 -0400 + + Fix typo fftw_execute_dft_r2r => fftw_execute_r2r + + Thanks KIU Shueng Chuan for the bug report. + +commit 76f7c5558bb5eedb80ff3e67db798b4e493a5872 +Author: athena +Date: Fri Aug 26 06:13:55 2011 -0400 + + In Rader's algorithm, compute the generator lazily. + + The planner was spending a lot of time computing generators for + plans that were immediately discarded. Now we compute generators + only when absolutely needed. + +commit e1b527d72aad02ddea04f266f6831fb13768fbc3 +Author: athena +Date: Sun Aug 21 16:16:38 2011 -0400 + + Release notes for 3.3.1-beta1 + +commit 7079b5216c27e2320215f1eb10f6c6554a6c1ac1 +Author: stevenj +Date: Fri Aug 19 19:59:17 2011 -0400 + + make fftw_mpi_block routine 10x faster, since it is being called zillions of times (thanks to Tom Vacek for the profiling) + +commit e5c7931a01f350aa1f756bfa76307b317e2208e1 +Author: athena +Date: Thu Aug 18 14:19:36 2011 -0400 + + Implement autodetection of NEON extensions + +commit 16600d97d52a81152e4ef9ac140c336a5a1ca126 +Author: athena +Date: Sun Aug 14 14:12:29 2011 -0400 + + Update the FSF address. + + The FSF moved downtown. + +commit 8609b388c7872e1b39baa6d72349dbbb476ade97 +Author: stevenj +Date: Thu Aug 11 14:54:38 2011 -0400 + + allow specifying TRANSPOSE_{IN/OUT} transpose plans, since libbench does not canonicalize rnk=1 n=1 plans as rnk=0 + +commit 341d3e142ea250096b5c76778f77fba4bf6de622 +Author: stevenj +Date: Thu Aug 11 14:17:24 2011 -0400 + + check.pl should occasionally check DESTROY_INPUT problems too (especially since those enable slightly different algorithms in MPI) + +commit 2845a3c0be7059c93b704b624cc482f9e4778188 +Author: stevenj +Date: Thu Aug 11 12:37:51 2011 -0400 + + unify post-MPI transpose handling in pairwise and alltoall solvers; should make the former faster in the destroy-input out-of-place case, and the latter more widely applicable + +commit f02c57b267809e16e0e29ae8f7c1301323eda1cb +Author: athena +Date: Mon Aug 8 10:06:14 2011 -0400 + + Add support for ARM NEON + +commit 8ec2b52144bcf72a028cb84c273719b0ecc7730e +Author: stevenj +Date: Fri Aug 5 17:25:32 2011 -0400 + + more C++ paranoia + +commit 6047a7079ad3a55d982e68e03cbe158c5e476ee0 +Author: stevenj +Date: Fri Aug 5 17:02:00 2011 -0400 + + tentative version bump for 3.3.1 + +commit 6fbb0639cf17563d4603c6d545e9335d19e3ac43 +Author: stevenj +Date: Fri Aug 5 16:52:28 2011 -0400 + + fixes so that MPI code compiles when MPICC is a C++ compiler, even if the serial code is compiled with a C compiler; thanks to Kyle Spyksma for the bug report + +commit d7feb2daba8f23e5bca6c4e4e3f4177ad9a49e87 +Author: stevenj +Date: Fri Aug 5 16:04:06 2011 -0400 + + use correct precision in f03-wrap.c, avoiding a (harmless) implicit pointer cast that prevented compilation under C++; thanks to Kyle Spyksma for the bug report + +commit 50d12441bd0b3410c799d11784717e76147b5474 +Author: stevenj +Date: Fri Aug 5 14:04:32 2011 -0400 + + manual typo + +commit 9e45ff08aca4e28ec61c947284188a01aed45fe6 +Author: athena +Date: Tue Jul 26 20:55:45 2011 -0400 + + Honor WITH_OUR_MALLOC in libbench2 + +commit 2cfcd40d46731a41a400ed4a4d2eeeb954422568 +Author: athena +Date: Tue Jul 26 20:27:28 2011 -0400 + + fixed typo: incorrect name of combined threads library on Windows + +commit a81ea0083c5cc32c9acecfd5f57f38d0e4f07bb5 +Author: stevenj +Date: Mon Jul 25 14:38:20 2011 -0400 + + 3.3 version bump & NEWS + +commit df2116046636b6ed6b989fa8b706f3e9db53e17e +Author: stevenj +Date: Mon Jul 25 14:37:48 2011 -0400 + + use int(..., C_SIZE_T) rather than declaring another variable in the Fortran examples + +commit 19ebb38d4180b0a70f4579d37dedfd6e678edecd +Author: stevenj +Date: Wed Jul 13 05:02:32 2011 -0400 + + typo, thanks to Rhys Ulerich for the comment + +commit a221f0e99a9206e1edaa8016e04f891261cc5196 +Author: athena +Date: Mon Jul 11 14:39:52 2011 -0400 + + Fix bug in bubblesort + + Bubblesort was not sorting. This was a bug in the benchmark library + (not in FFTW per se), and it impacted the benchmark program + with --report-time and --report-mflops causing it to output + an incorrect value for the median. (The minimum, maximum, and + average value were correct.) Thanks Dima Baksheev of Intel for + reporting this bug. + +commit d33f4f7b648b658d0d232f8561c85fd9b007c105 +Author: stevenj +Date: Fri Jul 8 13:35:59 2011 -0400 + + small manual typos + +commit 047c6636b6cbbdde2d8f4e5a62e26013336fd3e7 +Author: athena +Date: Wed Jul 6 10:49:40 2011 -0400 + + Detection of altivec.h requires $ALTIVEC_CFLAGS + +commit 8cb56c732d86e26edca3ea53e63440756a434031 +Author: athena +Date: Tue Jul 5 19:58:47 2011 -0400 + + Introduce fake dependency so that my-getopt.c is recompiled + + my-getopt.c does not depend on anything, and so it is not rebuilt when + reconfiguring for a different ISA (e.g., CC="gcc -m32" vs CC="gcc + -m64"). Add a fake dependency on so that the file is + recompiled. + +commit e50fbe175fe6b482d4eabf554a9d923fe1cb727a +Author: stevenj +Date: Tue Jul 5 18:53:36 2011 -0400 + + support compiling/installing --enable-threads --enable-openmp at the same time, although in this case the test program only uses the threads variety. Update documentation accordingly, and in general expand the documentation of the OpenMP support + +commit 1b13a7673c31c9f98151186ab5ad96952f0c8cc2 +Author: stevenj +Date: Tue Jul 5 16:04:03 2011 -0400 + + call omp_set_num_threads in fftw-bench so that the number of OpenMP threads corresponds with the number of FFTW threads + +commit fcd3d63bce6f23ca8274e739ca83a0fcb8b63a99 +Author: stevenj +Date: Tue Jul 5 16:03:06 2011 -0400 + + when --enable-openmp, install as fftw3_omp rather than fftw3_threads, so that both the POSIX threads and OpenMP variants of FFTW can be installed at once + +commit 4c8bae967265bf7b4c9705d6efe87cf7e9151fce +Author: stevenj +Date: Sat Jul 2 02:21:22 2011 -0400 + + don't even declare an fftw_execute interface in Fortran, since it is unsafe and we recommend against it anyway; thanks to Arjen Markus for the suggestion + +commit b1741fcc12ccd46d1ce538398c78ca8da98b2448 +Author: athena +Date: Fri Jul 1 14:35:44 2011 -0400 + + consistently use the order single, double, long double + +commit 02d76b0f908814ec69eb9f4edf423e6794d63720 +Author: athena +Date: Wed Jun 29 17:27:06 2011 -0400 + + MSVC AVX 64-bit detection does not work, punt for now. + +commit 5a057b2b67c6eac3cb59c5dd555e1e4093d0ce8e +Author: stevenj +Date: Wed Jun 29 15:52:27 2011 -0400 + + fixed typo, added note on transposed flags for r2c/c2r; thanks to Rhys Ulerich for the suggestions + [empty commit message] + +commit 21db43d01a6a55f3bce9bbb3bd01fc968a8fb4ac +Author: athena +Date: Wed Jun 29 09:41:39 2011 -0400 + + fixes for compiling with MSVC (untested) + +commit dcbc5ebfe7dd814f3ef8ee85fb5b2ccb4a3671f0 +Author: athena +Date: Tue Jun 28 16:48:36 2011 -0400 + + comment + +commit f71799bf38f03deaeea50a8b4178757e826854c0 +Author: stevenj +Date: Mon Jun 27 21:01:56 2011 -0400 + + rm extraneous line break in HTML output ... I hate texinfo + [empty commit message] + +commit 9ae9c2b534eb9064d8153f235e6d013a4c8b50c1 +Author: stevenj +Date: Mon Jun 27 00:47:33 2011 -0400 + + maintainer-clean should delete html directory (otherwwise we keep obsolete HTML files in the dist tarball, sigh) + [empty commit message] + +commit f66d29622c87134e4a790fdab1e25413fac8d33d +Author: stevenj +Date: Sun Jun 26 23:36:32 2011 -0400 + + update copyright year in manual + [empty commit message] + +commit 3799446cb5d30354dc69a36f07e8bdf87ed5cb34 +Author: stevenj +Date: Sun Jun 26 22:52:54 2011 -0400 + + whoops, don't dist .f03 headers, since those are built by the user's Makefile + [empty commit message] + +commit 8c336f8396e94752233e91433a0e64a72e137599 +Author: stevenj +Date: Sun Jun 26 22:43:49 2011 -0400 + + fix embarrassing deadlock/crashing bug in my previous nowisdom_hook fix -- I forgot to handle the case where one process has wisdom and another one doesn't, requiring a nowisdom_hook in the latter case; this should only affect MPI transforms since otherwise these hook functions are NULL + [empty commit message] + +commit e32aa9704f9a6e0811638809bbf764dc748116fb +Author: stevenj +Date: Sun Jun 26 21:02:15 2011 -0400 + + subsubheadings, MPI transpose reference + [empty commit message] + +commit e2759a2102797af24072573371a9d94d4943f1ff +Author: stevenj +Date: Sun Jun 26 20:48:53 2011 -0400 + + add MPI plan reference + [empty commit message] + +commit 5fd0d86ab1801a09997624a79a56029f76e4c718 +Author: stevenj +Date: Sun Jun 26 17:07:21 2011 -0400 + + portions of MPI reference docs; tweaks to NEWS + [empty commit message] + +commit b280b47c049bc941297a69b5d668a7fdf4a81977 +Author: stevenj +Date: Sun Jun 26 12:40:43 2011 -0400 + + use $(CHECK_PL_OPTS) more consistently + [empty commit message] + +commit f78b49c77e0442702bb0bb3b1e52b82795c36358 +Author: athena +Date: Sun Jun 26 10:04:54 2011 -0400 + + accept \r\n as well as \n. Grrr... + +commit 4449361639ee599d5221557c1b7021c85954c2d9 +Author: athena +Date: Sun Jun 26 09:52:11 2011 -0400 + + new configure option --with-incoming-stack-boundary=N + + This option selects CFLAGS to align the stack at all externally-callable + functions. This currently comprises api/* and threads/* + +commit 44191f4b3b5109c9e1befb9a3eefb1f34a1fd63e +Author: athena +Date: Sun Jun 26 09:51:37 2011 -0400 + + add -fomit-frame-pointer back + + Somehow -O3 does not imply -fomit-frame-pointer on ia32 + +commit 94f1e0517794a91b91b81bc46695d0bcf5d23ca9 +Author: athena +Date: Sun Jun 26 07:20:27 2011 -0400 + + Note that removal of mips-ps is temporary. + +commit 6ec5e833bf16b843f2893e894f786a67721cf647 +Author: stevenj +Date: Sat Jun 25 23:15:03 2011 -0400 + + update copyright year + [empty commit message] + +commit 27117ddc70e191d20cc88be0a2285f454a1409cd +Author: stevenj +Date: Sat Jun 25 21:33:13 2011 -0400 + + updated NEWS + [empty commit message] + +commit 2e1f81718cf9d9073a65e907c6aecebc1333a4a1 +Author: stevenj +Date: Sat Jun 25 20:29:55 2011 -0400 + + fixes to Fortran interface and docs + [empty commit message] + +commit 32e0027e573cbfcae6c39e535a1a3549f602b97a +Author: stevenj +Date: Sat Jun 25 17:43:31 2011 -0400 + + initial stab at MPI Fortran docs + [empty commit message] + +commit f1b33feb4669f8b92467a448172c0c0734c5ac48 +Author: stevenj +Date: Sat Jun 25 16:43:31 2011 -0400 + + correct description of what MPI standard says about I/O (I can't believe this crap) + [empty commit message] + +commit 0329701daca6ace6a4167366fda97a86d7d3b6f4 +Author: stevenj +Date: Sat Jun 25 15:14:07 2011 -0400 + + more MPI documentation; mention `fftw_alloc' functions earlier in the manual + [empty commit message] + +commit c4a68ffe9d9332bc0fc9e9db4f41a7c0728ec663 +Author: stevenj +Date: Sat Jun 25 13:40:19 2011 -0400 + + clarification about --enable-sse2 + [empty commit message] + +commit cbf6b823ec85dfecab28d071db39d5f92cdcb561 +Author: athena +Date: Sat Jun 25 13:31:25 2011 -0400 + + Update mingw build scripts for fftw-3.3 + +commit 1c97317e9689ac1376ba51c408adde1514475140 +Author: athena +Date: Sat Jun 25 08:52:13 2011 -0400 + + Fix typo: EXTRADIST => EXTRA_DIST + +commit 0ab873d4daf2a047ec04e273f0a8046f8919961c +Author: stevenj +Date: Fri Jun 24 23:52:19 2011 -0400 + + finished draft "modern fortran" chapter + [empty commit message] + +commit 35f278113d2e2b4532514f40b44fe468b5c7d729 +Author: stevenj +Date: Fri Jun 24 20:47:49 2011 -0400 + + include FFTW_EXTERN prototypes for wrappers, so that they are properly exported to DLLs on Windows (sigh) + [empty commit message] + +commit d2a1f24513b42464d64fa4fea5b97326f4251646 +Author: athena +Date: Fri Jun 24 16:52:30 2011 -0400 + + use malloc() instead of alloca() for large buffers + + The proximate cause for this patch is that OpenBSD/i386 reserves 256KB + stack size per thread. We were allocating a buffer of size + 128*130*sizeof(fftw_complex) that exceeds the stack. + + While 128*130*sizeof(fftw_complex) = 260KiB is the worst case for + normal configurations, it is a good idea to limit stack allocation + just in case. Also, the generic solver might in principle generate + unbounded buffers, even though it is normally disabled for n > 137. + + So, as an added precaution, we now never stack-allocate buffers larger + than 64KiB, which ought to be enough for anybody. + +commit 3b1c71b8e61a7fbfa88589ddf418d494a672ed78 +Author: stevenj +Date: Fri Jun 24 16:32:30 2011 -0400 + + don't imply that AVX is available on Pentium III; note that MIPS Paired Single is currently only in FFTW 3.2.x + [empty commit message] + +commit 02153f462b97b2733b47d298a3fc5cc57b45ba86 +Author: stevenj +Date: Fri Jun 24 16:05:27 2011 -0400 + + silence annoying gfortran warnings + [empty commit message] + +commit dff007f6cc14bdd1ea710466aa3f6fb3a5408c0a +Author: stevenj +Date: Fri Jun 24 14:59:30 2011 -0400 + + a couple MPI Fortran 2003 fixes; changed MPI flags to not use 1<<31 since Fortran (not having unsigned integers) does not allow us to declare that constant in a portable way + [empty commit message] + +commit ff330ebfa25ed56b29ea61ea99bf293cec079dde +Author: athena +Date: Fri Jun 24 15:05:05 2011 -0400 + + Fix libtool shared version info. + + FFTW-3.3.x should be a direct drop-in replacement for all FFTW-3.x.y + versions. + +commit 6c3c5cd3040d318a184fc0e6ee6ee4e3429ef8ce +Author: stevenj +Date: Fri Jun 24 14:38:47 2011 -0400 + + add MPI Fortran API and wrappers + [empty commit message] + +commit 02d3e72585a1254f2685014f5f8de5c7730b8ec5 +Author: athena +Date: Fri Jun 24 14:51:12 2011 -0400 + + Do not require fig2dev on the user's machine + + Distribute the manual's figures in PDF/PS/PNG form instead. + +commit 5169fc22863b9b6ea7bfbaafc0ca523e82114ee1 +Author: athena +Date: Fri Jun 24 11:52:44 2011 -0400 + + Remove --enable-portable-binary, --with-gcc-arch from documentation. + +commit f6d1274e5c9cc173d07c58df0a3535c9f4767e48 +Author: athena +Date: Fri Jun 24 11:48:48 2011 -0400 + + Forget about specifying nonportable CFLAGS. Let the user do it if he wants. + +commit 74872e79034a2379c537c23a7c29d0b6f43d2437 +Author: athena +Date: Fri Jun 24 11:48:25 2011 -0400 + + Add "-avx" to version string when appropriate. + +commit 2d6800ac3b8070da86d6d825d89fea05fbd44b78 +Author: athena +Date: Fri Jun 24 10:26:38 2011 -0400 + + change 3.3-alpha => 3.3-beta1 + +commit 97a4d17f30831d71b4075eec8b7f4b7c12deedb7 +Author: athena +Date: Fri Jun 24 09:25:49 2011 -0400 + + Extend OUR_MALLOC16 to larger alignments + + Make it work for 32-byte alignment and beyond, as needed by AVX. + Rename --with-our-malloc16 to --with-our-malloc. Keep old --with-our-malloc16 + flag for compatibility. + +commit fd31e415cd0731c428daafe791386d79ff34b8ca +Author: athena +Date: Fri Jun 24 09:19:38 2011 -0400 + + Fix typo + +commit 4f8a370b687860b92a93c49fed128218e6fb9f9b +Author: athena +Date: Fri Jun 24 09:10:26 2011 -0400 + + One pass over the manual. + +commit ba838fa07395a4f365eb16aa8ba1bb108f533dd5 +Author: athena +Date: Fri Jun 24 08:19:03 2011 -0400 + + eliminate the WITH_ALIGNED_STACK hack + + This is 2011 and I have no system with incorrect stack alignment. + +commit 7e32fb649dcd2a78a3b2d216140fc218cb69c334 +Author: athena +Date: Fri Jun 24 07:49:47 2011 -0400 + + enable both threaded and unthreaded wisdom in tools/fftw-wisdom + +commit 7543b3029bce4fc595c5efc7e0d31a71b4ec5cce +Author: stevenj +Date: Fri Jun 24 02:40:04 2011 -0400 + + clarification + [empty commit message] + +commit 81589ce427090a8aea9f4362a9b7f9ba7e76e111 +Author: stevenj +Date: Fri Jun 24 02:24:01 2011 -0400 + + check for error code in example + [empty commit message] + +commit 3c57716a6525c37f0f485e925c7df8f9819c66fd +Author: stevenj +Date: Fri Jun 24 02:22:18 2011 -0400 + + cleanup - since NATIVE_MALLOC is always malloc, delete this #define + [empty commit message] + +commit 644b3ee0d54eb80e78a35710d2b8027f3104fbe6 +Author: stevenj +Date: Fri Jun 24 02:19:44 2011 -0400 + + document wisdom string import/export in Fortran + [empty commit message] + +commit bee8d24fa16cd40bba5612938edc915399526c03 +Author: stevenj +Date: Fri Jun 24 02:11:40 2011 -0400 + + bug fix - NATIVE_MALLOC should always be plain malloc, even in debug_malloc mode, because it is used in the API to return things that should be deallocated with free(); correspondingly, be sure to use free() ansd not X(free) with this + [empty commit message] + +commit 119eb3d276de6b3178c5436fd0cee98a35f0aabf +Author: stevenj +Date: Fri Jun 24 01:35:27 2011 -0400 + + declaration style + [empty commit message] + +commit 8916c213d4b3121e65af9ee4989ed8ae0fc21db9 +Author: stevenj +Date: Fri Jun 24 01:25:36 2011 -0400 + + document wisdom file export/import from Fortran; add export/import_to/from_filename functions for convenience + [empty commit message] + +commit 9fb007e826ee94927e9ff4a9de14c6b80ec06e69 +Author: stevenj +Date: Thu Jun 23 19:19:43 2011 -0400 + + more fortran docs + [empty commit message] + +commit 3f0d26b4fd7e8e501fbd2f6ff24337ff0ad3c97c +Author: stevenj +Date: Thu Jun 23 17:50:30 2011 -0400 + + enforce 132-character line-length limit that is the default in Fortran + [empty commit message] + +commit 6e69de25872aed3a4eb13523a43bcfdf9a4f731c +Author: stevenj +Date: Wed Jun 22 23:27:31 2011 -0400 + + the F03 standard is ambiguous about whether types can be assigned to wider types as formal parameters with VALUE attributes, and e.g. gfortran interprets it to disallow this code + [empty commit message] + +commit a91a52952fb6d32423f351afdda8de2d04b71e38 +Author: athena +Date: Thu Jun 23 18:12:10 2011 -0400 + + Add md5 hash of fftw's configuration to wisdom file + + People were already confused by threaded vs unthreaded wisdom, and now + things will be even worse because we enable/disable AVX codelets at + runtime. Accept incoming wisdom only if it was produced by the same + configuration (modulo MD5). + +commit 0de6ca5c7f7720457124d7b7a3ca35153d06f761 +Author: athena +Date: Thu Jun 23 09:01:27 2011 -0400 + + distribute fftw3.f03.in + +commit 6422ed65a6cfb1704c1b428f37a6034baeba212c +Author: stevenj +Date: Wed Jun 22 22:02:18 2011 -0400 + + more Fortran documentation + [empty commit message] + +commit 9c1e1d48f0f97b49b62e5ee42e92673964e7d7cf +Author: stevenj +Date: Wed Jun 22 20:10:39 2011 -0400 + + correct comment + [empty commit message] + +commit ce8bb23e571efe5595d6d9578a45769e48bad7fe +Author: athena +Date: Wed Jun 22 20:26:18 2011 -0400 + + Use "sh FOO.sh" instead of "./FOO.sh" to avoid chmod +x. + +commit 660905636ebbefe3338d405d4a6fb30b89e07912 +Author: stevenj +Date: Wed Jun 22 19:19:05 2011 -0400 + + document fftw_alloc_real/complex ... should we switch to using these in the tutorial examples? + [empty commit message] + +commit ea8c9f7fedc0ca183449b70bee978a4251f552e1 +Author: stevenj +Date: Wed Jun 22 19:07:49 2011 -0400 + + whoops, added missing file + [empty commit message] + +commit 6caf08feba78084741e749e022c8c2e523c7ab44 +Author: athena +Date: Wed Jun 22 18:46:01 2011 -0400 + + Note addition of AVX. + +commit a17b6a6a493d19c93fd3a6b8eaacef8174033cd7 +Author: athena +Date: Wed Jun 22 18:43:43 2011 -0400 + + In SSE2, AVX: use FMA macros when applicable. + + Makes it easier to play with fma4 and fma3 when it comes out. + +commit d4dfffc05a4f9c3f7aa7c2c2ef9fa416f9257a5f +Author: stevenj +Date: Wed Jun 22 18:16:45 2011 -0400 + + all modern Fortran compilers can call FFTW's C interfface directly -- support this, and in particular generate a Fortran 2003 interface file from fftw3.h so that Fortran code calling FFTW can be typechecked ((addressing the source of a lot of Fortran-user problems) + [empty commit message] + +commit 10a9a86ddf3d94750c57ca8b20c0fca39cea6541 +Author: athena +Date: Wed Jun 22 13:10:02 2011 -0400 + + some cleanup of SSE2 macros + +commit f301a0adb53b56a2e4fd74ef61cf29d66b745286 +Author: athena +Date: Wed Jun 22 07:38:18 2011 -0400 + + don't use -xHost on ICC + + -xHost with ICC is problematic. On icc-12.0.0, "-mavx -xHost" + overrides -mavx with -xHost, generating SSE2 code instead of AVX code. + ICC does not seem to support -mtune=host or equivalent non-ABI + changing flag. + +commit 9e7758ff431947863cec44354413c27067f0fda8 +Author: athena +Date: Tue Jun 21 20:35:36 2011 -0400 + + Complete AVX implementation for split codelets + +commit a547e3d5dba38863f6e2c9acb45ffb94351fe3a5 +Author: stevenj +Date: Tue Jun 21 19:37:14 2011 -0400 + + whoops, missing altivec conf patches + [empty commit message] + +commit 9dc6263714fa685f384fb61ed08d398b38b26329 +Author: stevenj +Date: Tue Jun 21 19:12:45 2011 -0400 + + some BSD ar versions (e.g. on MacOS X) give an error if there are no object files, so we cannot build empty libraries + [empty commit message] + +commit 32dcba1b5d68cf9e33ec3f81e0405f2f909389dd +Author: stevenj +Date: Tue Jun 21 19:12:12 2011 -0400 + + re-insertion of Altivec code + [empty commit message] + +commit 931617ee1ba9f9257117ad8e1df38dfe055f9cee +Author: athena +Date: Tue Jun 21 16:26:09 2011 -0400 + + Implement faster AVX loads/stores. + +commit f76d6c1d278b34b2ccac7cff57522cab7ec90864 +Author: athena +Date: Tue Jun 21 16:03:24 2011 -0400 + + Initial AVX256/single implementation + + This should be correct but slow. I need to figure out how to implement + noncontiguous loads/stores efficiently. + +commit 164cc4c8fa9bfdf2b02d9cb9364c8f3f36e420e7 +Author: athena +Date: Tue Jun 21 14:13:57 2011 -0400 + + fix AVX alignment + +commit c277833627164aeb649d187ba0409a3fdca9166d +Author: athena +Date: Tue Jun 21 14:07:28 2011 -0400 + + rename avx256d -> avx + + AVX will work in both double and single precision, like SSE2. + +commit f97162a135eee43630825fccaa29b735ee284fff +Author: athena +Date: Tue Jun 21 13:52:20 2011 -0400 + + remove CODELET_OPTIM + + In the old 32-bit gcc-3.x days we used to play games with gcc to force + it to produce decent code. Now gcc has gotten smarter and it produces + indecent code no matter what we do, so it is safe to remove these hacks. + +commit 57baa1a6761a441c6aa47b0b63503bfd5270d9a9 +Author: athena +Date: Tue Jun 21 09:57:31 2011 -0400 + + work around gcc/icc quirks + +commit deeea8205c4cf4511b41a8a7cd85195b1e4eb7f6 +Author: athena +Date: Tue Jun 21 09:56:07 2011 -0400 + + Add remarks in places where we work around gcc quirks + +commit b357b3a90ba2060915fa03d888f0b2306be1f17a +Author: stevenj +Date: Mon Jun 20 21:17:59 2011 -0400 + + remove the libbench directory (which we have kept lingering in the repository for years due to CVS's inability to remove directories) + [empty commit message] + +commit 1ff7bbcc3b0dcfa3bd8f16ec1c672e5671cc0f99 +Author: stevenj +Date: Mon Jun 20 21:17:14 2011 -0400 + + update URLs + [empty commit message] + +commit ddcac323fe11f273f8e983836edaec002237a3ca +Author: stevenj +Date: Mon Jun 20 20:53:31 2011 -0400 + + whoops, forgot to check in alignment change + [empty commit message] + +commit 5eac5571d61bf5515946dab5750f5db82632cd54 +Author: athena +Date: Mon Jun 20 20:22:23 2011 -0400 + + "test X = Y" requires spaces around "=" + +commit 60d4535475d937207b8fd0c6ebef966d95601154 +Author: stevenj +Date: Mon Jun 20 19:18:52 2011 -0400 + + indenting + [empty commit message] + +commit 22cdbb3e3f35d6c289f4c250fbeba696090c6cc9 +Author: stevenj +Date: Mon Jun 20 18:57:10 2011 -0400 + + merge back in SSE support, now combined with SSE2; --enable-sse2 now works in both single and double precision, and simd-sse2.h contains both the double- and single-precision code (which overlap a lot); in single precision it is still compiled for SSE-only (SSE2 is only required for double) + [empty commit message] + +commit 2d767316e1ba0cf9fd4f5eb3134c6341b2d87a29 +Author: athena +Date: Mon Jun 20 16:02:07 2011 -0400 + + Implement AVX autodetection (gcc-only so far) + +commit 1ed535ea5c0ae847edb64b1696c7c40ea6022fbd +Author: athena +Date: Mon Jun 20 14:25:54 2011 -0400 + + Add VZEROUPPER at the end of AVX codelets + + If the Intel Optimization Manual is to be believed, we need to wave a + dead chicken before transitioning from AVX code to SSE code. I am + supposed to believe that there is a transition penalty for doing so, + unless one uses a magic VZEROUPPER instruction that apparently has + zero cost. Whatever. + +commit 1b26ff69ef0065d12689cd77ae65a7a049a37150 +Author: athena +Date: Mon Jun 20 10:21:25 2011 -0400 + + Move RDFT to new simd scheme + +commit 02b63c9ba5acf94a24d0b948436026df702681a9 +Author: athena +Date: Mon Jun 20 09:23:38 2011 -0400 + + New SIMD build system + + We now support multiple SIMD extensions in the same binary, e.g. + --enable-sse2 --enable-avx. This patch adds the necessary + infrastructure for SSE2/AVX and complex DFT. Later patches will add + RDFT and SSE/ALTIVEC/etc. + +commit 3409ea120286bc180d314be65f949ecb62f954cb +Author: stevenj +Date: Sun Jun 19 12:29:27 2011 -0400 + + italicize Latin quote + [empty commit message] + +commit 760f9aec6ca8c45219a357605b8216fef71ff04f +Author: stevenj +Date: Sun Jun 19 12:26:34 2011 -0400 + + work around incredibly annoying makeinfo bug -- for HTML output, in any paragraph ending with an @index command, two blank lines are needed to create a paragraph break ... our HTML output has apparently been screwed up for years + [empty commit message] + +commit f7a34a1e53ec9e1b7c263d6c8a4cf8020c1de89e +Author: stevenj +Date: Sun Jun 19 12:01:39 2011 -0400 + + conjugate-pair algorithm turns out not to be due to djb, but it was pointed out to us by djb + [empty commit message] + +commit 34e740878c4a449ef31a6df2f538a67387504b57 +Author: stevenj +Date: Sun Jun 19 11:59:21 2011 -0400 + + new-array execute functions are *not* the same for MPI, since the problems are different + [empty commit message] + +commit a0b07a03fd52e6192dd0023054cc6359dd651554 +Author: stevenj +Date: Sun Jun 19 11:57:52 2011 -0400 + + tweaks to MPI manual + [empty commit message] + +commit 9fa05d4bcd100d5ed0ade53a1c28f00a01cd89fc +Author: stevenj +Date: Sun Jun 19 00:47:23 2011 -0400 + + only call MPI_Init_thread for MPI version >= 2 + [empty commit message] + +commit e2f3cf7c8965653eb94a03c25ab7ce8f4f09ed8e +Author: stevenj +Date: Sun Jun 19 00:35:44 2011 -0400 + + document quad precision in Fortran + [empty commit message] + +commit f5dd231509aa0a32aa1d0fa1024adf8ebba30aa9 +Author: stevenj +Date: Sun Jun 19 00:16:10 2011 -0400 + + use -lquadmath for quad-precision library in pkgconfig file + [empty commit message] + +commit d0775d11f358dc46f0f2925be4830b3127564ab4 +Author: stevenj +Date: Sun Jun 19 00:10:33 2011 -0400 + + document quad precision + [empty commit message] + +commit a6142f7e745906e6b392369e5ffc5bf83f57d573 +Author: stevenj +Date: Sat Jun 18 21:26:24 2011 -0400 + + there is currently no standard quad-precision type in MPI, so don't allow MPI support to be compiled with --enable-quad-precision + [empty commit message] + +commit 34067999298aa71f65b2ac33386693f03bebd725 +Author: stevenj +Date: Sat Jun 18 21:25:51 2011 -0400 + + make quad-precision library libfftwq + [empty commit message] + +commit 28db5c98edf2ce5508cc8a91118b41ede6476183 +Author: stevenj +Date: Sat Jun 18 21:19:50 2011 -0400 + + use --estimate in check script with --enable-random-estimator + [empty commit message] + +commit e16e119568222dd95a717242b191a4adf72ec2de +Author: stevenj +Date: Sat Jun 18 20:36:51 2011 -0400 + + bug fix - correct crashing interaction between threads and debug-malloc + [empty commit message] + +commit 25a1b5252eb203919634a13d0c5deb8f8ddad940 +Author: stevenj +Date: Sat Jun 18 18:41:48 2011 -0400 + + whoops, typo + [empty commit message] + +commit 2d8b12a9624e30de0054d035d35474c57d115f49 +Author: stevenj +Date: Sat Jun 18 18:35:14 2011 -0400 + + clarification of when fftw_cost may return 0 + [empty commit message] + +commit 9d7a9545df20eb5b0c4ea6535161108225abce21 +Author: stevenj +Date: Sat Jun 18 18:31:26 2011 -0400 + + corrected manual and test program for proper interaction of MPI and threads + [empty commit message] + +commit a950b94a168ed22d850db5394fd633eee3309ebf +Author: stevenj +Date: Sat Jun 18 17:13:52 2011 -0400 + + need --mpi restriction in mpi+threads check + [empty commit message] + +commit 7a8106a510a8147ce2f8f986a0ea6f1fc935b419 +Author: stevenj +Date: Sat Jun 18 12:09:04 2011 -0400 + + split fftw3.texi into multiple files for ease of editing + [empty commit message] + +commit cb26916dace1d5d264f7561b760a89d5ee972d3b +Author: stevenj +Date: Fri Jun 17 17:26:50 2011 -0400 + + merge recent Cell deletion with MPI branch + [empty commit message] + +commit 1595e9847b428d6b439d7f908d3d6f06b6746d1f +Author: stevenj +Date: Fri Jun 17 01:52:59 2011 -0400 + + whoops, incorrect assertion + [empty commit message] + +commit 158a22057fd700263ff39e20dafbf506982bad25 +Author: stevenj +Date: Fri Jun 17 01:52:51 2011 -0400 + + comment fix + [empty commit message] + +commit e0d118305f05ad4f429fda2879547b9285c362ea +Author: stevenj +Date: Thu Jun 16 23:30:27 2011 -0400 + + check if pln creation failed (e.g. for split input) bbefore calling setup_gather_scatter, to prevent crashes + [empty commit message] + +commit b2254795d8d3f65d1205053f39d5e837bec6e4d0 +Author: stevenj +Date: Thu Jun 16 23:26:48 2011 -0400 + + bug fix -- transpose-recurse is only applicable if subtransposes fit in the same space (unless I change the allocation routine, but this would seem to require looking at all possible recursive invocations of transpose-recurse) + [empty commit message] + +commit 25faa34d32d8b7577ad1107769f3e87e7c87cef0 +Author: stevenj +Date: Mon Apr 11 17:58:03 2011 -0400 + + yikes, any_true check on subplan creation should be in comm, not comm2, so that all processes know if failure occurred + [empty commit message] + +commit c0b90d9331fbcc167f07c04a3ce1298cc8d88593 +Author: stevenj +Date: Mon Apr 11 17:00:46 2011 -0400 + + add wisdom_ok_hook to enforce wisdom synchronization on MPI problems, apparently fixing a longstanding deadlock/crash bug + [empty commit message] + +commit 651a2f59b8fdeecf79246c3f65b776be567b2ddb +Author: stevenj +Date: Mon Apr 11 15:10:22 2011 -0400 + + add a check (in DEBUG mode only) that all processes produce the same hash of MPI problems; don't include alignment in MPI problem hash because it may differ between processes for unaligned malloc + [empty commit message] + +commit 23bb1cb665dc571a773eb5125371b1079e0a4243 +Author: stevenj +Date: Fri Apr 8 18:46:54 2011 -0400 + + use cost_hook in random_estimate + [empty commit message] + +commit 21229fc46c88d7ca15c9ba06c1f731d01eecd77a +Author: stevenj +Date: Sun Mar 6 23:33:53 2011 -0500 + + added mpi new-array execute functions; thanks to Guo Luo for the bug report + [empty commit message] + +commit 7335ef11cd5e2e9962dbc41c42e5c14e156e6f82 +Author: stevenj +Date: Wed Feb 9 21:29:17 2011 -0500 + + MPI may not support tags > 2^15-1 (e.g. Cray MPI requires tags < 2^24); thanks to Jonathan Bentz for the bug report. + [empty commit message] + +commit 155887d9e173f2a72cb63cf5b7b36ff49bf52356 +Author: stevenj +Date: Wed Feb 2 12:21:30 2011 -0500 + + fix merge conflicts + [empty commit message] + +commit 56c3bf01ecfcc23f2d76efed77dac234a59b9234 +Author: stevenj +Date: Sat Nov 15 20:33:33 2008 -0500 + + version bump for 3.3alpha1 + [empty commit message] + +commit 136cf63d2cdcb5889a38163c4ccf9b1198e47e04 +Author: stevenj +Date: Sun Oct 26 22:47:07 2008 -0400 + + re-added mpi/Makefile + [empty commit message] + +commit 3bfab1285c5390285e734dc910b728a328d9f7fd +Author: stevenj +Date: Sat Oct 25 17:14:42 2008 -0400 + + re-add MPI to dist + [empty commit message] + +commit b2470178928b190c6b50d3bef353925061db3d08 +Author: athena +Date: Sat Jun 18 08:50:13 2011 -0400 + + remove obsolete Cell code + +commit 38bfc62ffa5051da294faa46a8ab29fc7225a97b +Author: stevenj +Date: Fri Jun 17 23:31:33 2011 -0400 + + bug fix in accuracy test, which prevented us from consiistently determining accuracy in > double precision + [empty commit message] + +commit 7356645134bcb66286da0c00ad3d993e90e425af +Author: athena +Date: Fri Jun 17 20:05:13 2011 -0400 + + do not check for gcc version before checking for gcc + +commit d94f234b00d3ced13ccfc3551e0a20cd66645922 +Author: stevenj +Date: Fri Jun 17 18:56:37 2011 -0400 + + require gcc 4.6.0 or later for --enable-quad-precision, to match fftw3.h header file; no need to mark this as EXPERIMENTAL (make check passes, and support in gcc 4.6 seems reasonably complete) + [empty commit message] + +commit 28ebf4da08a1fc607b0ea41ed24ea3707a256548 +Author: stevenj +Date: Fri Jun 17 18:51:41 2011 -0400 + + need ugly __attribute__ to use __float128 with _Complex, ugh + [empty commit message] + +commit b00cf20a5c45b953d2e6d954570543727b72cf9a +Author: stevenj +Date: Fri Jun 17 18:23:05 2011 -0400 + + --verify tolerance in quad precision changed to 1e-29 + [empty commit message] + +commit 015e365952344e8395a0516c9fe0e3c736550b9e +Author: stevenj +Date: Fri Jun 17 18:22:38 2011 -0400 + + quad-precision F77 api should use "qfftw" prefix + [empty commit message] + +commit af4a1c37d8eb5e14678449741fd185cb65c4c10b +Author: stevenj +Date: Fri Jun 17 18:22:27 2011 -0400 + + rm extraneous space from fftw3.h + [empty commit message] + +commit 654e73b0cfe2079498eadaf15b19361f71ef18ab +Author: stevenj +Date: Fri Jun 17 18:05:10 2011 -0400 + + use cosq etcetera with libquadmath in libbench2, so that --verify correctly gives ~33 decimal places in shift test + [empty commit message] + +commit 00bac1ae1e651e5e85c507294c3e215dde1bb85b +Author: stevenj +Date: Fri Jun 17 17:52:51 2011 -0400 + + libquadmath ships with gcc 4.6.0, so we should require this library for sinq/cosq with --enable-quad-precision; also, include the __float128 FFTW functions in the header file for gcc >= 4.6 on i86/x86_64/ia64 + [empty commit message] + +commit a17a0720767ca177a799d685a5ac7b63331dd559 +Author: stevenj +Date: Fri Jun 17 16:54:01 2011 -0400 + + typo in manual for fftw_cost + [empty commit message] + +commit 4aab5d51dbc8b798c25f857cfa07ce7f25f9360d +Author: stevenj +Date: Fri Jun 17 16:48:24 2011 -0400 + + fix fftw_cost function: pcost needs to be saved in mkapiplan, since the plan is re-created from wisdom + [empty commit message] + +commit c031d561c14a97b9a04197ba07c19cbf769648f9 +Author: athena +Date: Fri Jun 17 16:42:25 2011 -0400 + + removed support for the Cell Broadband Engine + +commit 34f5ad2eaae86075973d26ee5adcc7ceb04f4924 +Author: athena +Date: Tue May 24 06:51:07 2011 -0400 + + Undo previous change; the typo was not a typo after all. + +commit b9b72d1a42b162f74dfe9dc073ce5f5fc873113b +Author: athena +Date: Mon May 23 05:08:05 2011 -0400 + + Fix typo in manual + +commit f41fb798be412eff5c26c539e07385dbbc6ac56a +Author: athena +Date: Sat May 21 17:37:50 2011 -0400 + + clarify intent about canonicalization of tensor in tensor_compress_contiguous() + +commit 438c3b46f428023ce986422a697c9d33687ae9c1 +Author: athena +Date: Sat May 21 17:30:31 2011 -0400 + + avoid useless canonicalization in tensor_compress_contiguous() + +commit 8fbf77ca71756bd32bb5c71e709ec717e388451e +Author: athena +Date: Sat May 21 17:24:57 2011 -0400 + + Fix tensor_compress_contiguous + + tensor_compress_contiguous() was supposed to sort dimensions by + descending istride, and then compress adjacent dimensions. This + property was lost once we changed the canonical order of strides to be + sorted by descending min{istride,ostride}. + + Change tensor_compress_contiguous() to sort by descending istride + again, which is necessary for its correctness, and then canonicalize + at the end. + +commit 5ad70bf5c1bdeadefcaac86cc3e9a76b31f75724 +Author: athena +Date: Sun May 8 18:47:26 2011 -0400 + + Don't distribute obsolete .depend + +commit c48d28bc5b7fb54ea8e037579cb0af3fae339543 +Author: athena +Date: Sun May 8 18:05:36 2011 -0400 + + Use ocamlbuild for building genfft + + Remove the old Makefile cruft to support ocaml, and use ocamlbuild + instead. + +commit d183b35663d030b1ad789795fa441941961472c0 +Author: athena +Date: Sun May 8 18:03:07 2011 -0400 + + Do not use __float128 unless BENCHFFT_QUAD is defined + + Otherwise, compilation fails on compilers that do not support + __float128. + +commit 833ec738fe3c3234382a3fc160c8fe54060dc860 +Author: stevenj +Date: Fri Apr 8 13:15:54 2011 -0400 + + fix configure --help string for --disable-alloca (since default is enabled) + [empty commit message] + +commit 68538e1ffa84d206cae95558c636d9fa490888bd +Author: stevenj +Date: Fri Apr 8 13:09:56 2011 -0400 + + add "random estimator" for debugging purposes; note that this is best used with ESTIMATE_PATIENT mode + [empty commit message] + +commit 56d274a97c1868b43a2294bab6a4d6d245849608 +Author: stevenj +Date: Tue Apr 5 14:47:56 2011 -0400 + + add AC_CHECK_DECLS for srand48; thanks to Ralf Wildenhues for the bug report + [empty commit message] + +commit 50465ef2118b72f9f868e9ec53ee7e53bb050259 +Author: stevenj +Date: Sat Feb 5 17:00:40 2011 -0500 + + experimental support for gcc's __float128 quad-precision type + [empty commit message] + +commit 2471f34097daef93ae593743403cf40820a0673a +Author: athena +Date: Sun Oct 24 14:33:59 2010 -0400 + + guarantee that "timelimit < 0" means "no timeout" + + "timelimit < 0" was always meant to be equivalent to + "timelimit = HUGENUM", but this was not true in all cases, + causing some obscure wisdom behavior. + + Thanks William Andrew Burnson for the bug report. + +commit c16bc87b770bb0757dead223c13dc1966e3c2e3e +Author: athena +Date: Sun Oct 24 14:32:20 2010 -0400 + + compile with --enable-fma and SSE, SSE2 + + Allow compilation with --enable-fma and --enable-sse, --enable-sse2. + This is a bad idea performance-wise, but people will try anyway. + +commit eb34fdf7b5233e8f8a5b44c7f275e0c950ead3e7 +Author: athena +Date: Sun Jul 11 13:34:06 2010 -0400 + + Make threads.c compiler with c++ + +commit a80ce9ee8210615480efcaf03989278540ad900e +Author: athena +Date: Sun Jul 11 10:05:05 2010 -0400 + + Attempt at clarifying the advanced interface doc. + +commit 537372cf3446b014e53ad2b2bfd636748abfe44f +Author: athena +Date: Sun Jul 11 07:37:27 2010 -0400 + + rename rfftwnd html picture + + It turns out that texinfo with pdf output reads .png + files in preference to .pdf files (when did this change?). + I renamed the .png figure to avoid producing an ugly pdf file. + +commit 7be5dbd77b2c719b804b53731ffc9e27100b48f6 +Author: stevenj +Date: Tue Mar 30 19:43:22 2010 -0400 + + added fftw_cost function; this is the second time people have asked for this, and there is a reasonable use for it in comparing e.g. oout-of-place vs. in-place plans + [empty commit message] + +commit 101fc17a6dbc1feb1e5cc7625a251068fac7c202 +Author: stevenj +Date: Tue Mar 2 18:55:49 2010 -0500 + + documented that --enable-debug-malloc causes fftw_execute to be thread-unsafe (thanks to Alexis Rohou for the problem report) + [empty commit message] + +commit e9b894f0a2b7d65d559d8fded2d7298bdfc90694 +Author: athena +Date: Fri Jan 22 19:42:08 2010 -0500 + + Added FAQ about how to transpose matrices using FFTW. + [empty commit message] + +commit 18462a4c21b99482fcb9b2dc7338b83f8bbd790b +Author: stevenj +Date: Thu Jan 7 20:16:57 2010 -0500 + + catch FMS (instead of generating FMA(_,_,NEG(_)) with h -generic-arith option + [empty commit message] + +commit 90015026798cd3bad02d8c4144f527dfdc5f1ca7 +Author: athena +Date: Fri Dec 11 07:01:26 2009 -0500 + + note future wisdom enhancements. + [empty commit message] + +commit 03747c3de44cda09224d08e8d580483cc23b6687 +Author: athena +Date: Mon Oct 19 20:21:05 2009 -0400 + + Use SIMD flags when checking for xmmintrin.h + + This prevents an obnoxious warning from configure. + +commit 9211b77226bd67a674d5be4b26843b466a24d377 +Author: athena +Date: Sat Aug 29 20:47:56 2009 -0400 + + new bug + [empty commit message] + +commit 4d7817c4b3f6476892515b47aca61d2830ba2e5c +Author: stevenj +Date: Sun Jul 26 00:40:11 2009 -0400 + + typo (s/man1/many) + [empty commit message] + +commit 4de43b59f0ef8a445810e2b96e746d95a63b39b1 +Author: stevenj +Date: Tue Jul 14 14:19:08 2009 -0400 + + BUILD-MINGW32 script, updated Windows README + [empty commit message] + +commit fe7ce32f22a1cfe7049d095ecbea5024915e93ac +Author: fftw +Date: Mon Jul 13 09:40:38 2009 -0400 + + cleanup BUILD-MINGW64.sh + +commit 18ddd3f4d23697d8f6dcbf9c122ca281ed17bdde +Author: athena +Date: Sun Jul 12 06:34:46 2009 -0400 + + Update NEWS, version number for 3.2.2 release. + +commit 54f4ad016522892f54c2955ecaa5dc06dbff260a +Author: athena +Date: Sat Jul 11 22:28:38 2009 -0400 + + Reintroduce the pruning heuristic in ESTIMATE mode for r2r problems. + + Somehow, we lost this feature between fftw-3.1.3 and fftw-3.2. + +commit 18e2d0a785627f6360e756d1cd93c78a8f7b6ba3 +Author: athena +Date: Thu Jun 25 07:39:04 2009 -0400 + + don't use pshared=1 in sem_init + + pshared is really not necessary, and it is not supported on + GNU/kFreeBSD. Thanks Petr Salinger for the bug report. + +commit e58f95716b84021e2175673ccbbd4fe1bc180ad3 +Author: fftw +Date: Thu Jun 11 19:35:40 2009 -0400 + + Add mingw64 build file so that we can track it. + +commit 03c7f0e0ade24de0e4d08bc6899f78db917ffaca +Author: fftw +Date: Wed Jun 10 12:10:58 2009 -0400 + + note 3.2.2 NEWS + +commit ddd2281898dca1a30c48cff89c42c2d9c631faa3 +Author: fftw +Date: Wed Jun 10 12:04:54 2009 -0400 + + add --disable-alloca to configure + + It looks like alloca() is broken on mingw64, and thus + we need to disable it explicitly. + +commit 902651afe12f9de0efb131bffa42db8189516595 +Author: athena +Date: Sun Apr 26 16:33:10 2009 -0400 + + Note in FAQ that --enable-k7 has been discontinued. + +commit 0d50e05674406773adea157318c85b8f9c94d9c0 +Author: athena +Date: Tue Mar 24 09:16:18 2009 -0400 + + clarified small confusion in fftw_cleanup documentation + +commit bea8d6909782b15db9d6a591c8344e8179444746 +Author: stevenj +Date: Thu Mar 19 13:18:06 2009 -0400 + + fix documentation of dfftw_init_threads to indicate thaat it takes an argument (since the C version returns a value); thanks t Hans Johnnston for the bug report + [empty commit message] + +commit d6eaf145d2cc51db18fd69b49ef24cf628313c01 +Author: fftw +Date: Thu Mar 12 13:12:13 2009 -0400 + + if possible, use a 128-bit type for copy + +commit b1d732a8e58c303b9f3be4feb082f5b5ac27628c +Author: fftw +Date: Tue Mar 10 12:49:51 2009 -0400 + + add size-128 simd codelets + + It's about time + +commit d1f4ac081fe3fa267db692b6da4da3b2023e2e8a +Author: athena +Date: Mon Mar 9 20:29:16 2009 -0400 + + copy two floats as a double when possible + + Resurrect the old hack of copying two floats as a double, + which makes some difference in these days of 64 bit boxes. + +commit aa6865bac3cfb4050d6f662ddf744c86c8324393 +Author: athena +Date: Sun Mar 8 18:08:04 2009 -0400 + + fixed (harmless) confusion of strides + + RS and VS were swapped in dftw-direct.c. This is a bug, but + it is harmless unless one uses fixed-stride codelets, which we + do not. + +commit f34f1f3fee5d0bd112c8e55c9292d47bd643552f +Author: athena +Date: Sun Mar 8 10:29:49 2009 -0400 + + oops, I checked in debug code accidentally. + +commit d5a07965857012694d310ac28800d47741abccfd +Author: athena +Date: Sat Feb 14 19:01:00 2009 -0500 + + Change TLO email address since Magdalen is no longer there. + [empty commit message] + +commit 8418ed8d856c8c50e6463828e015c9d80be1285d +Author: stevenj +Date: Sat Feb 14 18:18:45 2009 -0500 + + quote arguments to bench in test script on the off-chance that '*' would be expanded by the shell into a valid filename, and also to avoid shell confusion on Cygwin that "//" begins the name of a Windows network mountpoint + [empty commit message] + +commit 55f747d248139ddffad00ede4d649fc6eb612839 +Author: athena +Date: Sun Mar 8 10:02:59 2009 -0400 + + stricter conditions for Cooley-Tukey being ugly + + It turns out that m=2 in the leaf of Cooley-Tukey may be + advantageous in certain cases, eg. i512v512 on AMD Shanghai: + + (dft-buffered-512-x128/512-6 + (dft-ct-dit/4 + (dftw-direct-4/24-x128 "t2fv_4") + (dft-vrank>=1-x4/1 + (dft-ct-dit/64 + (dftw-direct-64/504-x128 "t2fv_64") + (dft-vrank>=1-x64/1 + (dft-direct-2-x128 "n2fv_2"))))) + (dft-r2hc-1 + (rdft-rank0-tiled/2-x128-x512)) + (dft-nop)) + + Presumably this works around the 2 way associativity of the L1 cache. + +commit b2acc4c668acebf2ded61cc3a939606bbc73a3e0 +Author: stevenj +Date: Mon Feb 9 19:46:00 2009 -0500 + + disable Windows QueryPerformanceCounter code, since it requires us to pull in windows.h in ifftw.h and causes namespace conflicts; gettimeofday seems to work well enough and has had few complaints + [empty commit message] + +commit 1b3884da38a34cbc1c8f33f78394eeca588f0786 +Author: stevenj +Date: Wed Feb 4 22:55:54 2009 -0500 + + version bump for 3.2.1, updated NEWS + [empty commit message] + +commit e12e5cb04667aa089cf606fb163ce788247d1c2b +Author: stevenj +Date: Wed Feb 4 22:27:28 2009 -0500 + + recommend that users avoid fftw_execute in Fortran, instead using dfftw_execute_dft and friends so that the compiler knows that the input/output arrays are used + [empty commit message] + +commit db43aa9ae291dd66fc542c13afc2dd577750ef75 +Author: stevenj +Date: Wed Jan 21 16:02:08 2009 -0500 + + prefer windows queryperformancecounter to gettimeofday on Windows, thanks to David Price for the suggestion + [empty commit message] + +commit 338b5272f6924179a0b345e70f44fd1e5edafc23 +Author: athena +Date: Sun Feb 1 14:34:49 2009 -0500 + + compilation fixes in case snprintf() is defined as a macro. + [empty commit message] + +commit 321141568010f66f31c36912a230005ab10d54d3 +Author: athena +Date: Wed Jan 28 20:19:04 2009 -0500 + + Automake does not like continuation lines beginning with a comment. + [empty commit message] + +commit 618225923a36a2ef96214e2f2a0c6c12b0fb89be +Author: athena +Date: Wed Jan 28 18:24:39 2009 -0500 + + Add r2cb_2.c + + r2cb_2.c is needed for problem rb2, which is not equivalent to + rf2 (unlike kb2, which is equivalent to kf2). + + This change would not matter much except that rb2 is generated + when reducing backward rdft2 to dft, and the absence of the codelet was + preventing radix 2 from being employed at all in this case. + +commit dc4c6cb9e1ae4df2be85e77c3fea172f24e1523b +Author: athena +Date: Sat Jan 10 06:47:22 2009 -0500 + + handle the case vecsz->rnk == 0 correctly. + [empty commit message] + +commit 3ca4f694d0b27bb0b1e84ea028e3dadcfdf5b236 +Author: stevenj +Date: Fri Dec 19 15:20:36 2008 -0500 + + Macs are no longer ppc-based; thanks to Charles Collicutt for the FAQ update + [empty commit message] + +commit bbfa5e2c5102a5f923eed3b31d37ec7b75616edd +Author: stevenj +Date: Mon Dec 8 18:08:33 2008 -0500 + + use new multiple-nbuf code in rdft/buffered, like for dft/buffered + [empty commit message] + +commit 679ab9ffd5738b9df115adfb64f72fd015fe7d6b +Author: stevenj +Date: Sat Dec 6 16:34:36 2008 -0500 + + make x86_cpuid macro work on x86_64 + [empty commit message] + +commit 9771718d2e4e57450b03c89bb0c06663c59242c8 +Author: athena +Date: Sat Dec 6 09:20:37 2008 -0500 + + Allow automatic choice of buffer size in dft/buffered.c + + Try a couple of different buffer sizes in buffered transforms, + since this seems to make a difference on some Core2 models. + +commit c4888a4f4fb2961e0f067c55489989da8f3223f5 +Author: athena +Date: Tue Dec 2 19:18:30 2008 -0500 + + libbench2: do not assume that split-complex arrays are stride-1 + [empty commit message] + +commit e05f9234129ed82f1f5094465788742c271d1f4b +Author: stevenj +Date: Tue Dec 2 18:39:43 2008 -0500 + + updated NEWS + [empty commit message] + +commit 3cfe589fdc4393ff549c1bacbeb2b23c27562339 +Author: stevenj +Date: Tue Dec 2 18:30:00 2008 -0500 + + date fix + [empty commit message] + +commit 81326cf16c11ddc12f3d3c1fda7861853abba308 +Author: stevenj +Date: Tue Dec 2 18:29:06 2008 -0500 + + updated icc flags -- now prefer -xHost (-xN etc. seem t be obsolete), check for new spelling -ansi-alias, and use -malign-double like we do for gcc + [empty commit message] + +commit 2e94f29d37f25690825b11ed436d726d5077dba6 +Author: stevenj +Date: Tue Dec 2 18:28:03 2008 -0500 + + use $ax_cv_c_compiler_vendor rather than $GCC, as the former is more reliable (icc incorrectly self-identifies as gcc on MacOS where we don't use -no-gcc) + [empty commit message] + +commit a5edcdb0c705b3b42f8aec48e41457fd3771bed7 +Author: stevenj +Date: Tue Dec 2 17:55:36 2008 -0500 + + don't use -no-gcc for icc on MacOS + [empty commit message] + +commit 2ce94a7fa1858ca3bfdf38f47f7f2d62ceae5262 +Author: stevenj +Date: Tue Dec 2 17:34:04 2008 -0500 + + document some more bench options + [empty commit message] + +commit 315a8ae3389d84d6c062a1afc5c2c4eddee4bb77 +Author: stevenj +Date: Wed Nov 19 16:55:13 2008 -0500 + + make it clearer that --enable-openmp and --enable-threads are mutually exclusive; thanks to Long To for his comments + [empty commit message] + +commit 4bca25954f1e56299cf45e61bec3877007f8cbc4 +Author: stevenj +Date: Mon Nov 17 20:16:28 2008 -0500 + + version bump to 3.2.1, use explicit Makefile.am for m4 subdirectory so that tarball does not include random files in there when you do 'make dist' + [empty commit message] + +commit 7728d69ca6e4f30747b182a3f0d30ec7c25bf26d +Author: stevenj +Date: Sat Nov 15 21:12:58 2008 -0500 + + document behavior of FFTW guru arrays, and in particular the odd behavior of the plan_guru_r2r routine in Fortran (thanks to Alexander Pozdneev for the bug report) + [empty commit message] + +commit ba5c08b8b8a3c0e69ba228e071d71664f72c76ba +Author: stevenj +Date: Mon Nov 10 20:21:32 2008 -0500 + + version bump to 3.2, updated copyright year + [empty commit message] + +commit a25226c3cd7b9451e6690a813cc3266b15acd7c2 +Author: athena +Date: Wed Nov 5 16:40:31 2008 -0500 + + Store GPLv2 in darcs because automake installs GPLv3 these days. + [empty commit message] + +commit f80a90668573e199b3509a7737ba2d071f4e3974 +Author: athena +Date: Thu Oct 30 15:03:41 2008 -0400 + + stylistic changes, comments + [empty commit message] + +commit b8f22edf8aadff2aea6d4e69b7651506951810d0 +Author: athena +Date: Thu Oct 30 14:40:14 2008 -0400 + + oops + [empty commit message] + +commit bfaec2f123eb8d8297ce405590e07d682cf80293 +Author: athena +Date: Thu Oct 30 14:30:08 2008 -0400 + + simplification of the threading machinery + [empty commit message] + +commit c471651b5bc46868c1e8231a89ec6d459c868854 +Author: athena +Date: Thu Oct 30 14:22:40 2008 -0400 + + typo + [empty commit message] + +commit e1f64989da3c427c36c9df3495ef9d24ab01993d +Author: athena +Date: Thu Oct 30 13:42:07 2008 -0400 + + [SECOND ATTEMPT] do not assume that a semaphore can be freed just because nobody is using it + + Let S be a semaphore, initially 0. Let thread A execute UP(S); + let thread B execute DOWN(S); free(&S); It is unclear whether this + code is correct with posix semaphores. The problem is whether UP() + uses S after allowing DOWN() to continue; this seems to be the + case in the glibc-2.7 implementation, and thus the pattern above + seems to be incorrect. Avoid using such a pattern, and introduce + a global semaphore for the unavoidable case when nothing else + can be depended upon. + +commit cddb0450696d51a99ca1d9663d4e4a606c45725e +Author: stevenj +Date: Wed Oct 29 20:09:39 2008 -0400 + + updated cpu codes from x86-1.21 + [empty commit message] + +commit 2b8ab85fb21f1fd637cfe7a04ad0acf1610b5713 +Author: athena +Date: Wed Oct 29 16:24:16 2008 -0400 + + Previous change was bogus, need to find another way. + [empty commit message] + +commit 0123295bb8dd2064d858a59a48242611219b020d +Author: athena +Date: Wed Oct 29 12:22:20 2008 -0400 + + do not assume that a semaphore can be freed just because nobody is using it + + Let S be a semaphore, initially 0. Let thread A execute UP(S); + let thread B execute DOWN(S); free(&S); It is unclear whether this + code is correct with posix semaphores. The problem is whether UP() + uses S after allowing DOWN() to continue; this seems to be the + case in the glibc-2.7 implementation, and thus the pattern above + seems to be incorrect. Avoid using such a pattern, and introduce + a global semaphore for the unavoidable case when nothing else + can be depended upon. + +commit 1b1dd4a34bb653d4bd63775d2760b435cb4f0d1d +Author: stevenj +Date: Mon Oct 27 23:38:02 2008 -0400 + + don't need PROG_AS any more + [empty commit message] + +commit f7f67160af9b208e74304378ef54b4b5608fb96a +Author: stevenj +Date: Sun Oct 26 23:41:11 2008 -0400 + + use AC_CONFIG_MACRO_DIR macro + [empty commit message] + +commit d6334fa841da6e5f06a7323ce1d31346fb79b4f4 +Author: athena +Date: Sun Oct 26 10:08:44 2008 -0400 + + Remove mpi/Makefile from configure.ac + Otherwise, the tarball breaks because mpi/ is not in + the distribution. + +commit dda1fd64e3ab5fbb80578cfe41c69191cdfcc7f5 +Author: stevenj +Date: Sat Oct 25 17:13:50 2008 -0400 + + remove MPI from dist until FFTW 3.3 + [empty commit message] + +commit a3a16288f18899e7fc8351da1c500024709174cd +Author: stevenj +Date: Sat Oct 25 17:12:35 2008 -0400 + + use MPIRUN even for -np 1 + [empty commit message] + +commit 1b2a86c0ab92772ce43bf6b0c5e0bbae2dfb7fee +Author: stevenj +Date: Fri Jul 18 17:17:08 2008 -0400 + + use new gcc arch=native flag as fallback + [empty commit message] + +commit 73944e9472d933cdafcff9c3e5b85efc9661ea5b +Author: athena +Date: Sat Oct 25 13:36:40 2008 -0400 + + Use sem_t to implement mutexes + Use sem_t instead of pthread_mutex_t to implement mutexes. + It seems like pthread mutexes hang on linux-2.6.22 after several + days of tests; the hang does not occur on linux >= 2.6.24 + or when we use sem_t instead of pthread_mutex_t. The + situation is still quite mysterious but this code seems to + work. + +commit 82a0159088bdacf0cb5d5ecb5547f51ae34f77ab +Author: athena +Date: Thu Oct 23 13:32:45 2008 -0400 + + print informative message when pstring is NULL. + [empty commit message] + +commit ddc681c6a5de3aee386cf990428dcfba95d32369 +Author: athena +Date: Sun Oct 19 16:00:07 2008 -0400 + + Fix incorrect alignment in dftw-generic. + + Multithreaded dftw-generic is supposed to process only a slice + of the array, but we were planning with the alignment of the + original array rather than the slice. This led to unaligned + accesses in certain obscure situations. + +commit d35ad1d719daf7a8b1c7658b88bf962e86dd050a +Author: Matteo Frigo +Date: Mon Aug 18 17:27:26 2008 -0400 + + Paranoia: do not create OS threads while holding locks. + + Glibc at least plays silly games such as keeping a global variable + that records whether there is more than one thread in the process, and + it does not perform atomic operations if the variable says that there + is only one thread. Who knows how this interacts with creating + threads while holding a lock. Some day some genius will come up with + some ``optimization'' that breaks everything. + +commit 9ae439e37bf0cb024de699e15f98b5f5074d116c +Author: athena +Date: Wed Aug 6 07:41:46 2008 -0400 + + Welcome to the quadcore era + [empty commit message] + +commit be6af68ab86ada70645a79ef9ac5da11ea787eba +Author: stevenj +Date: Mon Jun 16 16:46:39 2008 -0400 + + backslash is technically not allowed in "echo" arguments; thanks to Debian Bug#486046 for pointing out problem and solution (and Raphael Geissert and Vincent Zweije, in particular) + [empty commit message] + +commit fd1ef499dca6f079bd9980cbecd1499e08fe99d0 +Author: stevenj +Date: Sun May 4 12:15:24 2008 -0400 + + note problem with test program in gcc 4.1.2-4.2; thanks to Raymond Rogers for reporting it + [empty commit message] + +commit 771f298272494232c994bdca79978f00cbd0a0ac +Author: stevenj +Date: Fri May 2 19:21:30 2008 -0400 + + output count of constants along with other statistics + [empty commit message] + +commit 8a8a1bb47539bb8be624af291c28c77cc541ba4e +Author: athena +Date: Sat Apr 19 14:15:03 2008 -0400 + + Lower priority of unaligned SIMD codelets. + List t1[fb]uv_* codelets before the corresponding + aligned codelets, since the estimator picks the + latter ones in case of a tie and aligned codelets + are preferable. + + In other words, this is a hack. + +commit d4d0ed3f7cee7e5c06409b3162fbcf4bfd42fea9 +Author: Matteo Frigo +Date: Sat Apr 19 08:55:46 2008 -0400 + + There is no point in using higher radices for unaligned codelets. + [empty commit message] + +commit c09bbbbc4d2c7236b861b7b2f67b77d4821bb8fc +Author: stevenj +Date: Fri Apr 18 19:01:27 2008 -0400 + + support generating loopless, strideless r2r codelets + [empty commit message] + +commit 5d2811a46f654c7dbbade5d2d65921e056c6b3a2 +Author: stevenj +Date: Fri Apr 18 19:00:25 2008 -0400 + + added Magic.threemult to use 3+3 complex-multiply variant when possible + [empty commit message] + +commit b21cf57a0c4d5711ea4cdb085b068b366f93c916 +Author: stevenj +Date: Thu Apr 10 19:53:31 2008 -0400 + + fix documentation bug - export_wisdom_to_string returns a string that should be deallocated with free, not fftw_free (thanks to Stein Vidar Hagfors Haugan for the bug report) + [empty commit message] + +commit 2a8ac0ba37e9087af75bd0edc9563279424c909d +Author: stevenj +Date: Mon Jan 21 01:11:44 2008 -0500 + + bsd calls x86_64 "amd64"; thanks to Fernando Herrero Carron for the bug report + [empty commit message] + +commit 9d150bc32eea5f0404562a6e26c8f5af7571174c +Author: stevenj +Date: Tue Jan 1 12:29:56 2008 -0500 + + fix typo in manual, thanks to Yinon Ehrlich + [empty commit message] + +commit a46838157abb2d1d08cf36d882b6e6979c90a059 +Author: stevenj +Date: Mon Dec 3 13:57:13 2007 -0500 + + note problem with gcc 3.4.4 on x86_64, thanks to Uwe Hollerbach for the report + [empty commit message] + +commit 14def93d5b1ba54d64d86d0b9635dfbb41795197 +Author: stevenj +Date: Tue Nov 13 16:19:22 2007 -0500 + + bump shared-lib revision + [empty commit message] + +commit ac56042c777020dd5edd04a142c522d0ea3d55d9 +Author: stevenj +Date: Tue Nov 13 16:16:49 2007 -0500 + + update NEWS for alpha3 + [empty commit message] + +commit d90bca8d53eaa2ecde6c54123b290ea2cccfeda1 +Author: stevenj +Date: Tue Oct 2 13:53:04 2007 -0400 + + fixed URL + [empty commit message] + +commit 2e992067b2172b9ef10c068d5b3b1f5f0e336790 +Author: stevenj +Date: Mon Sep 17 19:38:29 2007 -0400 + + added missing prototype + [empty commit message] + +commit a9a3696f1daa50cfcea8e9264912fd7010f59edf +Author: stevenj +Date: Tue Aug 14 22:35:06 2007 -0400 + + terminology tweak + [empty commit message] + +commit 7e0c1a370fdec22df30379eb952943a8b9f16080 +Author: stevenj +Date: Wed Aug 1 18:44:21 2007 -0400 + + check for pathscale compilers (thanks to Julian Cummings) + [empty commit message] + +commit dabff4a5303cc1bde1a1ac88508f3301caeb6e9f +Author: athena +Date: Sat Sep 15 18:02:32 2007 -0400 + + Avoid possible conflict with Windows include files. + [empty commit message] + +commit 1090ecb91cd0da452cca31e8ef926494895a83bc +Author: athena +Date: Tue Aug 7 21:26:05 2007 -0400 + + Distribute codlist.c for SIMD codelets in the commercial tarball. + [empty commit message] + +commit 9c132ba2c88c1d5f9e35ad89c8d9e7b012f3741f +Author: stevenj +Date: Wed Aug 1 10:33:41 2007 -0400 + + some documentation clarifications, and documented FFTW_WISDOM_ONLY, at the suggestion of Mario Emmenlauer and Phil Dumont + [empty commit message] + +commit 79a73f23fc62044a1edd421d031c35d9d17345dc +Author: stevenj +Date: Tue Jul 31 16:52:56 2007 -0400 + + bug fix in test program for vrank-3 transpose plans with vl=1 + [empty commit message] + +commit 13dcde33151a281f5dd4084f3a65277223d444eb +Author: stevenj +Date: Sun Jul 29 17:02:46 2007 -0400 + + only run mpi checks for --enable-mpi + [empty commit message] + +commit da920b9d9649c89291980b342a38cd31e689d04c +Author: stevenj +Date: Sun Jul 29 16:45:30 2007 -0400 + + check for NULL return from spe_context_create in case SPE_MAP_PS not supported + [empty commit message] + +commit 8b5208ab2d26b33f10864d23ae032a575877cdb3 +Author: stevenj +Date: Sun Jul 29 15:56:57 2007 -0400 + + use problem-state pointer to write SPE mailbox with lower latency (makes a significant performance difference for N < 32k), thanks to Jan Wagner for suggestion + [empty commit message] + +commit 35435685af71440fc9601b845163491e61845b4b +Author: stevenj +Date: Sun Jul 29 14:22:08 2007 -0400 + + port cell code to SDK2.1 (libspe2), since libspe1 API is deprecated and can't be used in code that also uses libspe2 API + [empty commit message] + +commit 21dc1b9f90f96120a92469077cabfd80dd7fcb70 +Author: stevenj +Date: Sun Jul 29 11:46:24 2007 -0400 + + bug fix: ego->W allocated with cell_aligned_malloc, so deallocate with free, not X(ifree0) + [empty commit message] + +commit 7c9f576ed6672631a9d36698f5d9824d173e06ea +Author: stevenj +Date: Mon Jul 2 15:57:12 2007 -0400 + + removed obsolete reference to CVS id + [empty commit message] + +commit 2efeadcf8d2b6562d8c18707a0b7eb2e3e5f73d3 +Author: athena +Date: Mon May 21 14:25:39 2007 -0400 + + cycle counter for sun compiler + [empty commit message] + +commit 0b59ce4b61ae5c052d9c673807e7b3386d7bdaa2 +Author: stevenj +Date: Wed May 9 19:49:11 2007 -0400 + + use __inline instead of inline for AIX routines (__inline is supported by gcc and xlc, whereas apparently "inline" is only supported by xlc if you specify -qlanglvl=stdc99 or similar); thanks to Jeff Haferman for the bug report + [empty commit message] + +commit a3dc6f8631568cca3039a6932aa4a66e46456a79 +Author: stevenj +Date: Mon Apr 30 15:37:56 2007 -0400 + + fixed incorrect type prefix (fftw_ vs. X(...)) in mpi/wisdom-api.c; thanks to Eric A. Borisch for the bug report + [empty commit message] + +commit 122d2b4a77a11b949e61e503681975f2da3d7d4f +Author: stevenj +Date: Wed Apr 25 21:21:39 2007 -0400 + + some cleanups in MPI make check + [empty commit message] + +commit 4d26d141fb5e018b49133b1e080acbff744d97c0 +Author: stevenj +Date: Wed Apr 25 21:19:27 2007 -0400 + + re-enable heuristic in the common case where we are not compiling for Cell + [empty commit message] + +commit 28a27bde79e55d51dd1fb81d82ca418587106a62 +Author: athena +Date: Tue Apr 24 17:42:43 2007 -0400 + + Removed duplicate codelet names, was breaking linker. + [empty commit message] + +commit 1a4a3dcbbe5a046f07654fa3734a5b3568d51b32 +Author: stevenj +Date: Tue Apr 24 11:38:16 2007 -0400 + + added more codelets of sizes 5/10/20/25 to improve speed for round decimal sizes (speed improvements of 10-20%, at cost of 10-30% in library size) + [empty commit message] + +commit 35443ed785a0ce0a05e16d1f6419769f7641f415 +Author: stevenj +Date: Sat Mar 24 18:40:47 2007 -0400 + + for 1d prime sizes, punt and return serial plan + [empty commit message] + +commit 3cf27d0073f9f911a2b15283b0d1acebeaf7b599 +Author: stevenj +Date: Sat Mar 24 18:24:55 2007 -0400 + + output reminders of the problem during bench --verify + [empty commit message] + +commit e68227acb0ebf9ad3cb0b022382c6df9fcf0d8b1 +Author: stevenj +Date: Sat Mar 24 18:10:24 2007 -0400 + + bug fix - missing solver->destroy initializer in rdft2-rdft + [empty commit message] + +commit 59a3e77ab1cba10afa53a627849abef6dd93152d +Author: stevenj +Date: Fri Mar 23 11:12:19 2007 -0400 + + -static, in --enable-debug, doesn't work on MacOS X (according to Daniel Oberhoff) + [empty commit message] + +commit 1bcacddfa919627af62568a28b0713b368549612 +Author: stevenj +Date: Wed Mar 21 22:23:06 2007 -0400 + + fix MPI r2c/c2r to work with howmany > 1 + [empty commit message] + +commit 86e99768530258b6184733a382920feae222ae55 +Author: stevenj +Date: Wed Mar 21 18:44:41 2007 -0400 + + rm MPI version from TODO + [empty commit message] + +commit b55ed34cb35d64e452aac41b5661536d75c492d4 +Author: stevenj +Date: Wed Mar 21 18:34:40 2007 -0400 + + added 'make bigcheck' for MPI (no paranoid-check, unfortunately), and properly get MPIRUN from configure + [empty commit message] + +commit e11b28e739bf5b888cfdf0ec97337166fbb6c425 +Author: stevenj +Date: Wed Mar 21 18:23:18 2007 -0400 + + bug fix - incorrect local_size returned for 1d bigvec case + [empty commit message] + +commit 3c4171a56630a623798d71e1a6218c1400ea3e46 +Author: stevenj +Date: Wed Mar 21 03:13:54 2007 -0400 + + hack to specify MPI_TRANSPOSED_IN/OUT via "[" and "]" in libbench2 problem + [empty commit message] + +commit b6643c4d6de6ac41e771a65accc67af6d515009f +Author: stevenj +Date: Wed Mar 21 02:58:11 2007 -0400 + + added MPI 'make check', still needs a bit of work + [empty commit message] + +commit 5c4ca6bf40ab9683f717ef89a5bbb2c7da031680 +Author: stevenj +Date: Wed Mar 21 02:47:10 2007 -0400 + + bug fix in r2r transposed-input case + [empty commit message] + +commit 518bfe4ddbe9a727866374bb0b0fb49a2d0a9f2b +Author: stevenj +Date: Wed Mar 21 02:46:25 2007 -0400 + + don't output more than 300 erroneous outputs (unless verbose > 2) + [empty commit message] + +commit 5ae1f03689a0f37d5db6becf54c8e54395541407 +Author: stevenj +Date: Wed Mar 21 01:48:54 2007 -0400 + + fixed bug in transposed-in c2r MPI transforms ... seems to be working, finally + [empty commit message] + +commit 6ff00891c3f7fcfe5399e652b9aeb1538bf9c8d6 +Author: stevenj +Date: Wed Mar 21 00:41:32 2007 -0400 + + some fixes to MPI r2c/c2r transforms with transposed output/input + [empty commit message] + +commit fc68b9bdd4975fec0d3f9b9ef6a2d9e052f8e7ce +Author: stevenj +Date: Wed Mar 21 00:40:25 2007 -0400 + + typos + [empty commit message] + +commit 75dce53511a209c32f881a782af96bf68fdf41af +Author: stevenj +Date: Tue Mar 20 19:53:02 2007 -0400 + + bug fix for mpi-bench with r2c/c2r: allocate a little bit extra to make sure that padding is allocated + [empty commit message] + +commit 1720fcb4dc2220e66e50a2baa9201f6c58913bf4 +Author: stevenj +Date: Tue Mar 20 19:19:13 2007 -0400 + + fix typo, thanks to Ernest Turro for the bug report + [empty commit message] + +commit 3a9a95e347c10d98ad7d7ef0c3dca97217e2137a +Author: stevenj +Date: Tue Mar 20 01:39:06 2007 -0400 + + spacing tweaks + [empty commit message] + +commit 27cc0f277fb7839e10996eb97c07e4ea9e5bb94c +Author: stevenj +Date: Tue Mar 20 00:53:11 2007 -0400 + + Ralf Wildenhues is the one who pointed out that the self-communication could fill in the stalls in the pairwise schedule + [empty commit message] + +commit 3879a995d7146eb6be6ab3df826ebdf2660451f5 +Author: stevenj +Date: Tue Mar 20 00:22:25 2007 -0400 + + add TRANSPOSED_OUT/IN support for r2c/c2r, respectively + [empty commit message] + +commit 5a4f8df7a48f55926d1a2017e234903e75fbf35b +Author: stevenj +Date: Mon Mar 19 21:45:34 2007 -0400 + + yikes! fixed likely deadlock bug in MPI + [empty commit message] + +commit e5514b08ccfb3c99dfa7034276872af1e3a15b84 +Author: stevenj +Date: Mon Mar 19 21:38:52 2007 -0400 + + comment + [empty commit message] + +commit 2ccef4a6915eeebe969120c75c5790791905fd37 +Author: stevenj +Date: Mon Mar 19 21:30:44 2007 -0400 + + s/alpha1/alpha2/ + [empty commit message] + +commit 4c069ca435d517243da0ea52594b8101723303b1 +Author: stevenj +Date: Mon Mar 19 00:39:47 2007 -0400 + + include README in dist tarball + [empty commit message] + +commit ea9cd7ed69c82e7b129bf88b99dc58238d856c0c +Author: stevenj +Date: Mon Mar 19 00:35:43 2007 -0400 + + added MPI r2c/c2r transforms, some more documentation + [empty commit message] + +commit 539fd2ff41bbf5d9955ff83880d983d422e4f4bd +Author: stevenj +Date: Sun Mar 18 23:14:29 2007 -0400 + + set version to 3.2alpha2 + [empty commit message] + +commit 5b7625b7daebd8aba2e0a876083a944e2c7b520e +Author: stevenj +Date: Sun Mar 18 19:12:18 2007 -0400 + + changed --enable-mips_ps to --enable-mips-ps; added Cell section to manual (from README.Cell); many minor updates to manual + [empty commit message] + +commit c8cd95869bb81b8d85d87a91e0d65402f9de2288 +Author: stevenj +Date: Sun Mar 18 15:27:06 2007 -0400 + + whoops, need to sync costs in problem_mpi_rdft + [empty commit message] + +commit dfc055b714f7d4b63b6615bb4b00c86d1600b7de +Author: stevenj +Date: Sun Mar 18 12:44:49 2007 -0400 + + documented guru64 interface + [empty commit message] + +commit e6a8b5ed239bd9e150f62c8f773e0dcdc97df31a +Author: stevenj +Date: Sun Mar 18 02:57:46 2007 -0400 + + typo + [empty commit message] + +commit 4625ba2558f8f51201b06cc14102507dd3f2731d +Author: stevenj +Date: Sun Mar 18 02:45:09 2007 -0400 + + bumped copyright year to 2007 + [empty commit message] + +commit 66392e6b7c997772c49e9c38d275fe79cc25ed33 +Author: stevenj +Date: Sun Mar 18 01:41:40 2007 -0400 + + noted CodeSourcery in AUTHORS + [empty commit message] + +commit 2c18cc0507bb6ea17abd5d54bacf15bd7ccbca13 +Author: stevenj +Date: Sun Mar 18 01:25:00 2007 -0400 + + more MPI documentation + [empty commit message] + +commit 498f7ef52ac60aa1467d76bbfbd0d2224b9ccb10 +Author: stevenj +Date: Sat Mar 17 23:15:04 2007 -0400 + + added MPI multi-dimensional rdft solvers & tests + [empty commit message] + +commit 871ff1554eded2f68e184ecff1d3befd19aa2679 +Author: stevenj +Date: Sat Mar 17 22:52:00 2007 -0400 + + whoops + [empty commit message] + +commit 5a46acce32021f8bcdf12188ca3d764ce7f1cc85 +Author: stevenj +Date: Sat Mar 17 22:43:54 2007 -0400 + + clarification - fftw_mpi_init should be called before importing wisdom + [empty commit message] + +commit 3e2d1704698a4609579e332b904502f5b30370fa +Author: stevenj +Date: Sat Mar 17 19:49:37 2007 -0400 + + kindx/y/z -> kind0/1/2 for consistency + [empty commit message] + +commit 73c018e5b29c759aaf1012ee39853b025024334c +Author: stevenj +Date: Sat Mar 17 19:34:02 2007 -0400 + + typo + [empty commit message] + +commit 1d9eeb0231c02f554470a9b6150b07df35e85a4a +Author: stevenj +Date: Sat Mar 17 19:14:16 2007 -0400 + + some refactoring in preparation for mpi-rdft + [empty commit message] + +commit 3a5f38381e0f65c6da82ab93eefe1be2789c9749 +Author: stevenj +Date: Sat Mar 17 18:12:45 2007 -0400 + + documented more stuff for MPI + [empty commit message] + +commit f833ef7087c898b684d1e0945fb28164e7d5fc02 +Author: stevenj +Date: Sat Mar 17 15:41:23 2007 -0400 + + added NEWS for 3.2alpha + [empty commit message] + +commit 75d1f8189e12f1104a11d92da913592e69b37227 +Author: stevenj +Date: Sat Mar 17 14:50:22 2007 -0400 + + documented MPI transpose routines + [empty commit message] + +commit 4fdc9e45f4c6f587f12edb5c0bbe0c60a499d0a9 +Author: athena +Date: Sat Mar 17 08:57:30 2007 -0400 + + Removed unused variables + [empty commit message] + +commit a1bd09375e2342d3dec8dbaba75321c278b50861 +Author: athena +Date: Fri Mar 16 14:47:10 2007 -0400 + + Preparing for interim release of Cell code. + [empty commit message] + +commit bd1f6de1d0c69ee9a7b7be715797ae2e5cb28ed0 +Author: athena +Date: Thu Feb 8 12:23:43 2007 -0500 + + Added README.Cell + [empty commit message] + +commit 4125ae1b42049d9828b51cb9f45398601fa25e5c +Author: athena +Date: Sat Mar 10 19:17:40 2007 -0500 + + Synchronized with main branch + [empty commit message] + +commit fa8f1748c92e9255b456b995a9c2d439110fb1b5 +Author: athena +Date: Mon Jan 22 17:43:56 2007 -0500 + + Adapted vrecur heuristic to Cell. + [empty commit message] + +commit 31c0788d89e5d2db56d1949df2e61171360ad282 +Author: athena +Date: Thu Jan 18 20:29:22 2007 -0500 + + Increased MAX_N to 32K/sizeof(R). + [empty commit message] + +commit e0e08abd04fec6f16a5aa4b8dbec2f614b845bde +Author: Matteo Frigo +Date: Thu Jan 18 13:43:51 2007 -0500 + + Added pointer to solver->destroy which is used in the Cell branch. + [empty commit message] + +commit dbb33d0b51897749feff0ef26e63af7769cd4fa5 +Author: athena +Date: Thu Jan 18 12:09:26 2007 -0500 + + Updated copyright notices + [empty commit message] + +commit bdb23b08725ce86827dc72f39ace915e594e0ddd +Author: athena +Date: Fri Jan 12 12:54:43 2007 -0500 + + Use mfc_read_tag_status_all() instead of spu_mfcstat(2), since the former seems to be standardized. + [empty commit message] + +commit d958d4081d9d131a8c331795b51c38392e038f5f +Author: athena +Date: Thu Jan 11 14:55:08 2007 -0500 + + Silence some int/INT warnings. + [empty commit message] + +commit a465f3a820c88855cec17a8b62093f151cf4a75b +Author: athena +Date: Wed Jan 10 18:19:53 2007 -0500 + + Note incompatibility of --enable-cell with --enable-threads + [empty commit message] + +commit f8d67adca8de472032a5bb176caef2df069ac301 +Author: athena +Date: Wed Jan 10 17:57:10 2007 -0500 + + forgot to add file + [empty commit message] + +commit 2b494f41afa950fa4174d4588070c49879c89acb +Author: athena +Date: Wed Jan 10 17:45:16 2007 -0500 + + 64-bit cleanup + [empty commit message] + +commit d4d591f6547fba8ab96d982a76747e0248e94031 +Author: athena +Date: Wed Jan 10 13:47:20 2007 -0500 + + Use -mcpu=cell where appropriate. + [empty commit message] + +commit bbff6b92337e5462c8e01c3c6f200f0841422229 +Author: athena +Date: Tue Dec 26 21:35:59 2006 -0500 + + synchronized with main + [empty commit message] + +commit 011961c240152fa9ff6c791c430f0104ca2dada7 +Author: athena +Date: Sun Dec 24 20:58:25 2006 -0500 + + synchronized with main branch + [empty commit message] + +commit 563b10fee948f8cf7089fc91f97ccd07b92169ae +Author: athena +Date: Sun Dec 24 13:47:37 2006 -0500 + + synchronized with main branch, updated to new sdk. + [empty commit message] + +commit 8a7076d3c731fa116d61cc072416ab46beddfc03 +Author: athena +Date: Thu Dec 21 17:17:41 2006 -0500 + + removed obsolete file + [empty commit message] + +commit b4139c9ef725c1910b97628667ab1fa9ab98e635 +Author: athena +Date: Tue Dec 19 15:17:20 2006 -0500 + + synchronized with main branch + [empty commit message] + +commit 7df6b5623e1db3fe7e9dff26fd4d23f484495649 +Author: athena +Date: Tue Dec 19 11:27:38 2006 -0500 + + Synchronized with main branch + [empty commit message] + +commit 6ea2fd75cd1aae82fe1d1a510f104646ab7aa7c9 +Author: athena +Date: Fri Dec 15 16:04:31 2006 -0500 + + resolved conflict with main branch + [empty commit message] + +commit 65515a62ffff8fb5649200627cb0c93ef813a9c0 +Author: athena +Date: Fri Dec 8 14:43:50 2006 -0500 + + Fixes for compilation in subdirectories + [empty commit message] + +commit d39013569f9cb742b50238ca622f3bd52cade5b5 +Author: athena +Date: Fri Dec 8 12:46:00 2006 -0500 + + Silence warning + [empty commit message] + +commit 565f828f3b33be86ac3263046fae490fda62d059 +Author: athena +Date: Fri Dec 8 12:24:19 2006 -0500 + + silence warning + [empty commit message] + +commit 5ae3fbed814693f0172abe16b6875b17df64616d +Author: athena +Date: Thu Dec 7 15:18:17 2006 -0500 + + Commented a particularly obscure piece of code. + [empty commit message] + +commit b4f78f41fb5960b0ec300d23d6653e80f498eee2 +Author: athena +Date: Thu Dec 7 11:53:29 2006 -0500 + + Reorganized, clarified conditions for applicability of the DFT solver. + [empty commit message] + +commit 4d31f1609b233b3951f5f660bc7d2f8f98d7bd38 +Author: athena +Date: Mon Dec 4 21:33:49 2006 -0500 + + Minor changes + [empty commit message] + +commit b4cd386c5a2ebd85f8c53be407642199914c26ed +Author: athena +Date: Mon Dec 4 17:43:28 2006 -0500 + + Clarified comment + [empty commit message] + +commit aafb3252fb01b21a852ed938b9bc6b2e8b852517 +Author: athena +Date: Mon Dec 4 16:49:06 2006 -0500 + + Less incorrect conditions for fitting into local store. + [empty commit message] + +commit 985d9f04682d20ed877a04bfc1d5c0cb73af903c +Author: athena +Date: Mon Dec 4 16:08:24 2006 -0500 + + Implemented DECDIF+TRANSPOSE on Cell + [empty commit message] + +commit 00969378eff1f94e8858105bd22015e622da58d0 +Author: athena +Date: Fri Dec 1 17:42:55 2006 -0500 + + relaxed conditions of applicability of SPE + [empty commit message] + +commit 4df1c8eb6351f9f6dd2e869a33044d8b36f8dd54 +Author: athena +Date: Fri Dec 1 16:28:10 2006 -0500 + + tweaks + [empty commit message] + +commit 92a232ae0edf2fe3f92ca5485861d866aa4c96b0 +Author: athena +Date: Fri Dec 1 14:35:17 2006 -0500 + + Implemented Cell opcounts + [empty commit message] + +commit b2e38a76dac60881d4e14e3d9a6ad2b236086a68 +Author: athena +Date: Fri Dec 1 13:38:44 2006 -0500 + + minor cleanup + [empty commit message] + +commit 0ab21aa8b736fd4002a92db39449d9e140c39606 +Author: athena +Date: Fri Dec 1 11:16:52 2006 -0500 + + use [c0 s0 c1 s1] format for Cell twiddle factors, rather than [c0 c1 s0 s1]. This makes life easier and there is no speed penalty on Cell (unlike Altivec). + [empty commit message] + +commit d080990161fe731d5e1af92f9534c4bd86e06d1f +Author: athena +Date: Wed Nov 29 18:02:54 2006 -0500 + + Implemented SPE-accelerated copies + [empty commit message] + +commit 23f9c35ec5d4c123a664c907e5aaca2d9704888c +Author: athena +Date: Wed Nov 29 12:11:08 2006 -0500 + + allow SPEs to compute vrank-0 problems. + [empty commit message] + +commit 2f71518adcd364d1cc45272d4f254028c779ff83 +Author: athena +Date: Tue Nov 28 18:03:07 2006 -0500 + + eliminated DMA lists + [empty commit message] + +commit 8620a7ab00d1bd4d288513998c82d14cce47b98f +Author: athena +Date: Tue Nov 28 14:22:05 2006 -0500 + + Conservatively force all dimensions to be 0 (mod VL) in cell, since otherwise it is too hard to get all cases right. + [empty commit message] + +commit 8343bf57ddaff7d35756635dd9a4a6aa8d31e964 +Author: athena +Date: Tue Nov 28 12:39:01 2006 -0500 + + Check alignment of strides when transposing on Cell. + [empty commit message] + +commit 7e28410dc1fbaa1bbf53007869937b84d44c37f3 +Author: athena +Date: Tue Nov 28 12:19:09 2006 -0500 + + consistent usage of FFT_SIGN + [empty commit message] + +commit 66491d40310d02c982e54ebee2f9f6c7cb0ae7db +Author: athena +Date: Tue Nov 28 11:35:38 2006 -0500 + + clever transposition algorithm without buffering + [empty commit message] + +commit 33e68acd59c892e969a722ded4292aef57fab0a9 +Author: athena +Date: Mon Nov 27 14:08:28 2006 -0500 + + Fixed tracking of dependencies + [empty commit message] + +commit 1eab08a3242ae935de04debda8abee056fb3d978 +Author: athena +Date: Mon Nov 27 14:03:53 2006 -0500 + + implemented 1D transforms, various tweaks + [empty commit message] + +commit 14891530341581ba7a2422754d83d0c621c71daa +Author: athena +Date: Wed Nov 22 15:43:36 2006 -0500 + + no need to poll mailbox on spu side + [empty commit message] + +commit bc0822718ba87089828bd9362b112c8a9bef878c +Author: athena +Date: Wed Nov 22 14:08:24 2006 -0500 + + increased maximum size handled by spe + [empty commit message] + +commit 0fb0144374b505502ed768b7f13c191d775bf870 +Author: athena +Date: Tue Nov 21 16:23:17 2006 -0500 + + allow vrank<=2 problems in SPEs to avoid the vecloop overhead (grrr...) + [empty commit message] + +commit 26017102cbb70e6e0292087249267b6560414f1c +Author: athena +Date: Mon Nov 20 14:41:45 2006 -0500 + + added emacs mode + [empty commit message] + +commit ae2ed8341f9860cd659dc62def4f0c3712e856ab +Author: athena +Date: Mon Nov 20 09:34:12 2006 -0500 + + revised transpose, cleanup + [empty commit message] + +commit 7de0b7799021747ff1eef31aca59f7b229750e93 +Author: athena +Date: Sun Nov 19 20:20:23 2006 -0500 + + added file + [empty commit message] + +commit 7383afd328c1e98b5ec25c32094a28b0312fb7b0 +Author: athena +Date: Sun Nov 19 20:18:35 2006 -0500 + + removed file + [empty commit message] + +commit fa6b1a88cae92cf2e4e5ab247d7a9d93e722c405 +Author: athena +Date: Sun Nov 19 20:15:38 2006 -0500 + + better automake integration + [empty commit message] + +commit d1af1e31717e8df8126e7f44197d10e652adbaab +Author: athena +Date: Sat Nov 18 20:14:29 2006 -0500 + + changed algorithm for computing chunk size + [empty commit message] + +commit 631ad019b179b1e260a5197ef0012e38e5adfb9c +Author: athena +Date: Sat Nov 18 19:18:11 2006 -0500 + + implemented transpose, various fixes. + [empty commit message] + +commit 4d0d4332d36eb952e188eb44f039249a78dc2545 +Author: athena +Date: Thu Nov 16 16:33:50 2006 -0500 + + Added explicit destructor to all solvers to help with the cell port. + [empty commit message] + +commit c668de4bc5e8677b2c78830b34214aa832631281 +Author: athena +Date: Thu Nov 16 15:22:15 2006 -0500 + + consistent use of #if vs. #ifdef + [empty commit message] + +commit 34192d4eaa06426a1168b5ac743332adb1cd6039 +Author: athena +Date: Thu Nov 16 15:15:34 2006 -0500 + + Additional Cell double codelets, better automake integration + [empty commit message] + +commit 4b19e0b192a7f797d21adc5b8b39b126bf809e53 +Author: athena +Date: Thu Nov 16 12:43:34 2006 -0500 + + Use dma lists. + [empty commit message] + +commit 398bcee9091aa5c56d753877957f367e7041e6a7 +Author: athena +Date: Thu Nov 16 11:03:46 2006 -0500 + + converted to automake + [empty commit message] + +commit caf4303b1448b64d7f82cf9ba36eee8071674421 +Author: athena +Date: Wed Nov 15 18:00:12 2006 -0500 + + Initial port to Cell Broadband Engine. + [empty commit message] + +commit 45eebf6ef925ca51e2749ea8658cfb39216fd5b7 +Author: athena +Date: Wed Mar 14 10:19:53 2007 -0400 + + Remove Codesourcery contributions from commercial tarball. + [empty commit message] + +commit 71e740a2b810c009c637addb3f87bba3338fa0d2 +Author: athena +Date: Wed Mar 14 08:59:18 2007 -0400 + + Added FFTW_WISDOM_ONLY, at the request of Phil Dumont. + [empty commit message] + +commit 8c4485fd3fffb1cfd1aacddfecb58250b5b69607 +Author: stevenj +Date: Tue Mar 13 00:32:05 2007 -0400 + + fixed potential MPI deadlock if timer misbehaves + [empty commit message] + +commit 193dbead568fc6582fce99e2b1824f7aac2c66b1 +Author: stevenj +Date: Mon Mar 12 23:31:52 2007 -0400 + + more work on MPI documentation + [empty commit message] + +commit 4374a330a301a85267faf67eb71833daeeeefa72 +Author: stevenj +Date: Tue Feb 27 13:48:43 2007 -0500 + + index + [empty commit message] + +commit 8dd26fb6008dec917db3ff3f34bbd437b21ba12f +Author: stevenj +Date: Tue Feb 27 13:46:45 2007 -0500 + + rename "new-data execute" to "new-array execute", since of course you do not need a new array to have new data + [empty commit message] + +commit 89ebde1693423d225eb9a50b56dc0a5703d30384 +Author: stevenj +Date: Tue Feb 27 13:43:55 2007 -0500 + + consistency with manual (guru execute -> new-data execute) + [empty commit message] + +commit 8cce0d9c67bf193b5cf177483ad0500e71a18a84 +Author: stevenj +Date: Tue Feb 27 13:42:24 2007 -0500 + + texinfo fixes; renamed "guru execute" section to "new-data execute", since previously it seemed to lead to endless confusion with the guru planner API + [empty commit message] + +commit 7188f6250c91692fb25976542298900e557d092a +Author: stevenj +Date: Mon Feb 26 18:57:11 2007 -0500 + + consistently use n0/n1/.. everywhere instead of nx/ny/... (for consistency with d-dimensional case n[0], n[1], ...) ... first start at MPI documentation + [empty commit message] + +commit 385b92bc1fa159e0423f02059cd15c93b7444c92 +Author: athena +Date: Sat Mar 10 18:48:05 2007 -0500 + + Changed C++-style comment into K&R + [empty commit message] + +commit 32f8fc24e66030c4e5fdc42b9ec503c50d163435 +Author: athena +Date: Sat Mar 10 18:47:12 2007 -0500 + + Forgot to add file + [empty commit message] + +commit acf05fd6f7275e013b16abcfafbc2db7437145f1 +Author: athena +Date: Sat Mar 10 18:44:39 2007 -0500 + + Note removal of K7 support. + [empty commit message] + +commit e768b9aeeddd3937eacf72bf4bcd1fe6b67681b8 +Author: athena +Date: Sat Mar 10 18:41:52 2007 -0500 + + Updated manual for MIPS PS + [empty commit message] + +commit 56c7d29b2740a24da19b5c022569e60a9bf1abaa +Author: athena +Date: Sat Mar 10 18:37:07 2007 -0500 + + Adopted MIPS_PS patches from Codesourcery. + [empty commit message] + +commit 117c18b54c2398c74c00d3f375e60e490cfd0a55 +Author: athena +Date: Sun Feb 25 11:34:51 2007 -0500 + + Incorrect initialization of win32 semaphores + [empty commit message] + +commit 835fb99c05fc32b63c000aaa65fa8f098d66d1a1 +Author: stevenj +Date: Tue Jan 30 11:43:09 2007 -0500 + + win32 fixes (I think, still untested) + [empty commit message] + +commit 22544bfee3ccdd6810c7f7b9552eb8ec67f58562 +Author: stevenj +Date: Fri Jan 19 17:31:47 2007 -0500 + + message-size heuristic in tranpose-recurse + [empty commit message] + +commit c3f9a60853f7d021b8e2e84aca81167fe0742499 +Author: athena +Date: Tue Jan 30 08:53:55 2007 -0500 + + Threading layer for Win32, completely untested. + [empty commit message] + +commit e9103c2fa36af2816f233d39aa4b4e6aad4bccd2 +Author: athena +Date: Mon Jan 29 14:26:30 2007 -0500 + + Check for EINTR after sem_wait(), as suggested by Chip Salzenberg. + [empty commit message] + +commit 719f223ad7ec385208d4d10171374f44d6dcbfa9 +Author: athena +Date: Mon Jan 22 13:58:23 2007 -0500 + + Force vector recursion by means of a separate function pointer. I need this for Cell. + [empty commit message] + +commit 44d62282fe44de7c794ce22ec8a5a3120e71d57f +Author: athena +Date: Mon Jan 22 09:28:35 2007 -0500 + + Merge multiplications by twiddle with multiplications by i for faster r2c transforms. + [empty commit message] + +commit 37defea1b213e2cb3e5f73fc481e34551ca72e59 +Author: athena +Date: Sun Jan 21 19:02:44 2007 -0500 + + Disabled vector recursion, too messy. + [empty commit message] + +commit f6f7ab5fd044a6ed0b9803c8ea10e176c37137dd +Author: athena +Date: Sun Jan 21 14:23:35 2007 -0500 + + Changed heuristics for vector recursion. + + As in fftw-3.1, NO_VRECURSE disables vector recursion. As an + exception, however, vector recursion is allowed when the predicate + VRECURSE_ANYWAYP is true. We need some form of vector recursion to + obtain decent plans on Cell, and this solution captures the common + cases without increasing planning time too much. + +commit 3612cb7be2fce875627ec720c48a70f9204b42f6 +Author: athena +Date: Sun Dec 17 22:31:17 2006 -0500 + + fixed hc2c for vector-recursion branch + [empty commit message] + +commit af9505fcc532b01fb7d7d4e4df0793f1d58bbedd +Author: athena +Date: Tue Dec 5 12:52:36 2006 -0500 + + switch to default vector recursion + [empty commit message] + +commit d49ea8d1b8d123219d25c7279a06f0146ff0020b +Author: athena +Date: Sat Jan 20 23:37:33 2007 -0500 + + Smarter algorithm for selection of nbuf. + [empty commit message] + +commit 983a3c8a18351c2aa89b096d17419c8ecc8ee4eb +Author: athena +Date: Sat Jan 20 22:15:33 2007 -0500 + + Increased buffer sizes according to Moore's law. + [empty commit message] + +commit 3063d37e369e9b607af9a1870c3e9c67966969d3 +Author: stevenj +Date: Fri Jan 19 16:02:00 2007 -0500 + + fix another MPI synchronization bug -- several more places where cost_hook must be called to synchronized process timings (sigh) + [empty commit message] + +commit ed26acb97814e71ca8961385f95d136fb532d3e5 +Author: athena +Date: Fri Jan 19 12:08:07 2007 -0500 + + Set havewisdom=0 when calling forget_wisdom() in the test program. + [empty commit message] + +commit 9c8fc20de720a1f8588230add1f732504a489797 +Author: stevenj +Date: Fri Jan 19 10:29:56 2007 -0500 + + remove redundant check + [empty commit message] + +commit ea709110aaac1eac97acdc9e6d6dccb1a319f491 +Author: stevenj +Date: Thu Jan 18 22:37:59 2007 -0500 + + fixed potential (unlikely) bug in wisdom import (triggered when importing impatient wisdom after creating more patient plans, but apparently only for nonstandard configure.c configurations) + [empty commit message] + +commit c30ae9a7d180707e86d8a42ce607c6e7717b49e6 +Author: stevenj +Date: Thu Jan 18 21:50:14 2007 -0500 + + added functions to gather/broadcast wisdom for MPI + [empty commit message] + +commit a87ad4116c7bf1ac3e28709b2dc7a3f942beba34 +Author: stevenj +Date: Thu Jan 11 18:33:17 2007 -0500 + + whoops, another int/INT bug + [empty commit message] + +commit 51ddf455e30f2f8448b94dc40b8a19a8f296067b +Author: stevenj +Date: Thu Jan 11 17:42:24 2007 -0500 + + whoops, fixed bug in transpose-recurse for r != m + [empty commit message] + +commit d2550926efaedd18154f03ae20b464f57ebbc71f +Author: stevenj +Date: Thu Jan 11 17:25:36 2007 -0500 + + canonicalize mpi-transposed flags by setting TRANSPOSED_IN/OUT where possible + [empty commit message] + +commit 0129b3159f5ffd78b1d5e8c99a80e5aac5ae1743 +Author: stevenj +Date: Thu Jan 11 17:16:24 2007 -0500 + + replace transpose-radix2 with much more general transpose-recurse solver + [empty commit message] + +commit b5399f6884419e5aac9bd45b2f99a55c722dbae6 +Author: stevenj +Date: Wed Jan 10 20:23:48 2007 -0500 + + rename transpose-inplace to transpose-pairwise, as the algorithm is not restricted to inplace operation + [empty commit message] + +commit 1db83491ac2308011e874a0e14867ab82285ca87 +Author: stevenj +Date: Wed Jan 10 14:39:08 2007 -0500 + + whoops, some int/INT bugs + [empty commit message] + +commit 7c54c7285fedadb55997fa5032a86721a5d73c00 +Author: stevenj +Date: Tue Jan 9 18:50:07 2007 -0500 + + fix FAQ Makefile for vpath builds + [empty commit message] + +commit 1f9ce0c767890a637491a26dc6d671cb48d899e1 +Author: athena +Date: Tue Jan 9 20:22:11 2007 -0500 + + Missing ``static'' keyword. + [empty commit message] + +commit 5719264a71b3d5a725179d6c6f38fc9844f614c7 +Author: athena +Date: Tue Jan 9 20:13:18 2007 -0500 + + Minor cleanup. + [empty commit message] + +commit 31f23769946e8cbd668eae280cf6fa5e0d731cc6 +Author: stevenj +Date: Tue Jan 9 00:04:03 2007 -0500 + + interleave twiddle mults with DFTs (should we use dftw?) + [empty commit message] + +commit 5ee274d2bfff3ccfa48faf75d4c5ba4254b6403a +Author: stevenj +Date: Mon Jan 8 18:35:41 2007 -0500 + + simplified (and somewhat sped up) dft-rank1 by exploiting dft-rank1-bigvec + [empty commit message] + +commit 6603c476a81bd7d9a84eeec0106ce87ea7af55eb +Author: stevenj +Date: Sun Jan 7 00:31:31 2007 -0500 + + rearranged TRANSPOSED format, numerous speedups + + Split the TRANSPOSED and non-TRANSPOSED rank-geq2 solvers, and changed + the DFT TRANSPOSED format to be more like fftw2 (both globally and + locally transposed). In general, more emphasis on arranging the data + contiguously for the DFTs, and more flexibility in intermediate + transposed formats. Also disable NO_SLOW when planning transposes, + since otherwise non-square in-place transposes gratuitously put the + planner in SLOW mode. + + Currently, dft-rank1-bigvec has 5 variants (or 10, if DESTROY_INPUT). + It looks like only 2 of these are commonly used, so I should probably + add some UGLY tags once I do more benchmarking. + +commit 8efa4e83812fc0d52b20291b0ae6b6d863d873b4 +Author: stevenj +Date: Thu Jan 4 19:13:17 2007 -0500 + + add bench_cost_postprocess to prevent deadlocks in mpi-bench + [empty commit message] + +commit ad8fbe7775bfe2a214cefd3759493f11d3330532 +Author: stevenj +Date: Thu Jan 4 16:46:29 2007 -0500 + + whoops + [empty commit message] + +commit f1d13c4b532737e65ce9f8cdb058875fed16aac7 +Author: stevenj +Date: Wed Jan 3 14:23:42 2007 -0500 + + pass proper pointer types as arguments, so that ACX_PTHREAD still works with C++ and -Werror (thanks to Ewald Arnold for the suggestion) + [empty commit message] + +commit 85662c73ef1053f67e55830adb20a7660c7f546e +Author: athena +Date: Mon Jan 1 19:30:43 2007 -0500 + + Renamed [io]vs => [io]vs_by_nbuf, which is more appropriate and would have saved me 30mins debugging. + [empty commit message] + +commit 011d6fa311a3126c66527f22f76a55acababb0f3 +Author: stevenj +Date: Mon Jan 1 18:52:38 2007 -0500 + + add --with-g77-wrappers option & always include g77 wrappers on GNU systems and/or with gfortran + + Upcoming GNU/Linux distros will most likely switch to configuring FFTW + with gfortran by default, since g77 isn't even included with recent gcc + versions. However, we still want to include g77-compatible wrappers in + this case (two underscores) in addition to gfortran wrappers (one + underscore) lest we silently break binary compatibility and provoke + lots of annoying emails. + +commit fbb0f99f47d4c09c87cd81573b3532809b44fee1 +Author: stevenj +Date: Mon Jan 1 16:48:36 2007 -0500 + + use AC_HELP_STRING for --disable-fortran + [empty commit message] + +commit 4c6880164b7e43be156bd10825038bc5fe83b9b3 +Author: stevenj +Date: Mon Jan 1 15:56:12 2007 -0500 + + terminology + [empty commit message] + +commit ae75dc0d2a5fb8286ebadc5fa70a1ff2e17ed7ba +Author: athena +Date: Sat Dec 30 16:18:35 2006 -0500 + + Free buffers before calling cldrest. + [empty commit message] + +commit 053f45629c9af2bc608086640e6684ef1e76bf0b +Author: athena +Date: Fri Dec 29 10:52:15 2006 -0500 + + Removed obsolete code. + [empty commit message] + +commit e6ffd09841ff145db9112e4fca774cc3454e1170 +Author: athena +Date: Thu Dec 28 21:37:48 2006 -0500 + + Attempt to work-around old gcc bugs in a more efficient fashion that does not lose performance on newer gcc's. + [empty commit message] + +commit b1d16645f02bf03f9934c6acfe86d41705734cf6 +Author: athena +Date: Thu Dec 28 16:10:33 2006 -0500 + + Make sure that the speed() input is zero even in paranoid mode. + [empty commit message] + +commit bd281a3248526dd660f3cc5db5662a38af6aca70 +Author: athena +Date: Thu Dec 28 11:41:46 2006 -0500 + + cld0 and cldm problems must be tainted because they are used in a v-loop. + [empty commit message] + +commit 762203e35e50a636ebbe34f1bb4a9a72dbdfceae +Author: athena +Date: Wed Dec 27 17:17:45 2006 -0500 + + Run paranoid-check in patient mode. + [empty commit message] + +commit 13fcf5a8a0073c72a967a6b5c21009dc09b0e63e +Author: athena +Date: Wed Dec 27 10:51:42 2006 -0500 + + Fixed incorrect initialization to zero. + [empty commit message] + +commit 957a6a68a80da76a90adfd5c50e6570a0102a174 +Author: athena +Date: Wed Dec 27 09:33:02 2006 -0500 + + Fixed wrong TAINT() + [empty commit message] + +commit 131e00d9d05b13400d93ba18bddd02ee53db276a +Author: athena +Date: Tue Dec 26 22:50:28 2006 -0500 + + Grrrrr... + [empty commit message] + +commit e30b1ccf6d58829fdae52ee072c605802f728761 +Author: athena +Date: Tue Dec 26 22:48:44 2006 -0500 + + Give up trying to verify rdft2 when vrank=-infinity. + [empty commit message] + +commit 50b70cffda5f011216fd43162aa1b6b69f7ef912 +Author: athena +Date: Tue Dec 26 22:31:38 2006 -0500 + + typo + [empty commit message] + +commit 4cdf2b4a16da17795eadebf1a1215e1060f1c573 +Author: athena +Date: Tue Dec 26 21:54:53 2006 -0500 + + Correctly verify rdft2 when vrank = -infinity. + [empty commit message] + +commit a93befe83478f18c088fc474973185660c237154 +Author: athena +Date: Tue Dec 26 21:25:02 2006 -0500 + + rdft/buffered2.c now generates rdft2 subproblems, not rdft. + + The old rdft2->rdft reduction is now in rdft/rdft2-rdft.c + and still does way too much. + +commit 994d04b97146dcfb849bc7d83136402cb1a0a070 +Author: athena +Date: Tue Dec 26 14:03:27 2006 -0500 + + Buffer the input in hc2r problems, as opposed to the output. + [empty commit message] + +commit 47f2f5a1335a6cc49ed95c73655fa08a19958606 +Author: athena +Date: Tue Dec 26 10:02:59 2006 -0500 + + streamlined buffered solvers + [empty commit message] + +commit add79ce24b3c20348a098ca15c7431ce95835a54 +Author: athena +Date: Mon Dec 25 16:08:22 2006 -0500 + + c++ compatibility + [empty commit message] + +commit 7caedf2e6196972d2a5c4745ff5badc6856c1b29 +Author: athena +Date: Sun Dec 24 20:27:23 2006 -0500 + + Gratuitous renaming of directories and files since the old naming was becoming too inconsistent for my taste. + [empty commit message] + +commit ab5397b31582ea9372345a7868a165a340a8aefb +Author: athena +Date: Sun Dec 24 20:11:50 2006 -0500 + + Fixed another dftw bug (sigh) + [empty commit message] + +commit aa1c7cfcbfb0b6bedd716d02d2b84ea86432f03b +Author: athena +Date: Sun Dec 24 11:48:01 2006 -0500 + + Removed debugging leftovers. + [empty commit message] + +commit 401d4cd84bec4348694725e268ccb78c5cbbb71c +Author: athena +Date: Sun Dec 24 11:34:17 2006 -0500 + + Moved dftw-generic* to new dftw protocol. + [empty commit message] + +commit 91d2ba6242b230cf1195cf9c8e7d61f2ee226a28 +Author: athena +Date: Sun Dec 24 09:37:19 2006 -0500 + + Oops + [empty commit message] + +commit ef28c24515ebda3edb9fcb0e67682b3e608f7e67 +Author: athena +Date: Sun Dec 24 09:31:46 2006 -0500 + + Fixed wrong verification of rank-1 rdft2 + [empty commit message] + +commit a0f01cb9aaaa491d23686acf3ccedc38c47cd8bb +Author: athena +Date: Sat Dec 23 20:11:29 2006 -0500 + + minor tweaks + [empty commit message] + +commit de3d507c8f454e02a382e0cbf7d9453f04621021 +Author: athena +Date: Sat Dec 23 19:50:03 2006 -0500 + + Removed obsolete items. + [empty commit message] + +commit 67ca9cb9258b4fb320d26445040b6fae0e450594 +Author: athena +Date: Sat Dec 23 17:56:37 2006 -0500 + + Modified the problem_dftw invocation protocol. + + apply() now requires pointers to the beginning of the full array. + Each thread processes a slice mb <= m < me. This protocol is + consistent with the one used in hc2hc, where there is no other choice. + +commit 378686a490f47d469eedfb5383cb46f6500cf835 +Author: athena +Date: Sat Dec 23 16:18:25 2006 -0500 + + typo + [empty commit message] + +commit a15a3176f43a12770d66407d77b3fc138f278a53 +Author: athena +Date: Sat Dec 23 16:06:56 2006 -0500 + + changed hc2hc twiddle storage to be the same as hc2c + [empty commit message] + +commit a4d048b7080396fae83e41bd64c4740ba0ab9f7a +Author: athena +Date: Sat Dec 23 15:16:36 2006 -0500 + + Allowed extra_iter in dftw-direct. Rationalized twiddle factors in hc2c. + [empty commit message] + +commit 4c0bf02653b7e58b218d47e0cf01d719edc1d015 +Author: athena +Date: Sat Dec 23 10:37:11 2006 -0500 + + Implemented unmentionable hack to use 4-way SIMD with an odd number of + iterations. + +commit 992d3ce4a54640d5af4d942ef17eb880f56ec36e +Author: athena +Date: Fri Dec 22 22:13:30 2006 -0500 + + altivec support for new codelets + [empty commit message] + +commit e0908cfd6fe22ae0544576667bec649b71dcb922 +Author: athena +Date: Fri Dec 22 19:09:15 2006 -0500 + + fixed incorrect computation of W + [empty commit message] + +commit df8bd57748278b92e0975a66062bd71bb5ac2e8d +Author: athena +Date: Fri Dec 22 18:51:22 2006 -0500 + + Implemented 4-way simd hc2cdftv + + Also eliminated the twiddle_shift hack. A zillion changes dictated + by this choice, which was in turn necessary for the hc2cdftv thing + to work. + +commit 7bac8d1f715f737bfed8742521fe60d5dec6b963 +Author: athena +Date: Fri Dec 22 08:45:46 2006 -0500 + + Fixed verification of rdft2 problems with new format. + [empty commit message] + +commit c18f29a56027a5e08aa164530d10ff55c1950170 +Author: athena +Date: Fri Dec 22 00:05:59 2006 -0500 + + Added file + [empty commit message] + +commit aafef0ef88f37d8b0e63a31afec168dad67a29f4 +Author: athena +Date: Fri Dec 22 00:02:50 2006 -0500 + + Hmm, previous commit did not work + [empty commit message] + +commit 21c810018e7f4993ebadf9a05682f3bd0a6d2c8f +Author: athena +Date: Thu Dec 21 23:58:33 2006 -0500 + + Added SIMD r2cdft codelets. + [empty commit message] + +commit fe2f5075f1443d522b445b31027cacb32e8add18 +Author: athena +Date: Thu Dec 21 21:19:21 2006 -0500 + + Bug in buffering, grrr... + [empty commit message] + +commit 32f34cf494321ef860f20924b84df527d63e0ce0 +Author: athena +Date: Thu Dec 21 20:58:14 2006 -0500 + + Oops, memory leak. + [empty commit message] + +commit 179cfb2f9ddf45916458e2dfdd0e0adbcf762044 +Author: athena +Date: Thu Dec 21 17:12:31 2006 -0500 + + minor changes, cleanup. + [empty commit message] + +commit 2505062c2e9ded3822b01c123e82033d37968917 +Author: athena +Date: Wed Dec 20 22:09:28 2006 -0500 + + Unified hc2hc-direct, hc2hc-directbuf. Cleanup. + [empty commit message] + +commit 5f80c36202acc746148c007e394a4260457f1f60 +Author: athena +Date: Wed Dec 20 17:55:56 2006 -0500 + + removed obsolete rdft2-radix2 + [empty commit message] + +commit 18d4fddebb71049478d41152af043e33ed90d014 +Author: athena +Date: Wed Dec 20 17:51:20 2006 -0500 + + implemented reduction rdft2->dft + [empty commit message] + +commit f84c7e67e6c77dc3b8ef4c0703277aa884852ab0 +Author: athena +Date: Wed Dec 20 09:29:39 2006 -0500 + + Implemented buffered direct-r2c, direct-hc2c. + Also, removed some old cruft: + + * okp() functions were never used and a pain to maintain---now they + are gone. + + * ``m'' in hc2hc and hc2c codelets is now the number of iterations, + not the ``logical'' m. + +commit de904f19b230a114ead0b9580646689ab8519a29 +Author: stevenj +Date: Tue Dec 19 17:07:04 2006 -0500 + + added memcpy-loop rank0 solver (it makes a 5-20% difference for transposes of large tuples) + [empty commit message] + +commit d91736d4442e92910eabaa0e923d0cda833213cc +Author: stevenj +Date: Tue Dec 19 16:15:54 2006 -0500 + + new variable to disable libbench2's problem allocation during speed benchmarking (to benchmark MPI transforms where the array does not fit into the memory of a single process) + [empty commit message] + +commit 8c1f9aabc4cd60f5509b287de2850c2767d07fd8 +Author: stevenj +Date: Tue Dec 19 14:55:08 2006 -0500 + + allow transpose-inplace to use input as scratch for DESTROY_INPUT plans (to avoid non-square in-place transpositions) ... on supersgj, the planner often prefers transpose-inplace to transpose-alltoall in this case (apparently MPI_Alltoall in LAM MPI isn't that great) + [empty commit message] + +commit 762d58ccde3a29468b9b522c8426ba6f48f0e74b +Author: athena +Date: Tue Dec 19 17:07:14 2006 -0500 + + For some reason HB2 codelets were not generated. + [empty commit message] + +commit 928be47a01cfc332b729fd60775949d699d60795 +Author: athena +Date: Tue Dec 19 15:12:39 2006 -0500 + + split rdft/direct.c into direct-r2r and direct-r2c, since the file was getting out of control. + [empty commit message] + +commit cf38c33836313129b7e98c192434dae261777810 +Author: stevenj +Date: Tue Dec 19 02:59:35 2006 -0500 + + added dft-rank1 solver - MPI now supports 1d complex DFTs! + [empty commit message] + +commit 061b341f302122d768db24c7aab043ade2e2dbb8 +Author: stevenj +Date: Tue Dec 19 01:27:20 2006 -0500 + + fftw_flops must call cost_hook directly; iestimate_cost always uses COST_MAX + [empty commit message] + +commit ebf61714b949775e7004b86b828112ae82b69726 +Author: stevenj +Date: Tue Dec 19 01:16:54 2006 -0500 + + fftw_flops and fftw_estimate_cost must now be called from every process, to prevent deadlocks in the MPI code (since they sum/max the cost over all processes) + [empty commit message] + +commit bea9d02f1cc9edd02ad6d30a11795bc11ff64d1a +Author: stevenj +Date: Tue Dec 19 00:55:34 2006 -0500 + + whoops, typo in assert + [empty commit message] + +commit aee20bd2d616611547ef7826e5d30bf033994736 +Author: stevenj +Date: Tue Dec 19 00:51:07 2006 -0500 + + remove multiplication by FFT_SIGN + [empty commit message] + +commit 8583a34cfe3ae51cd835c45d9035d80a0f944b52 +Author: stevenj +Date: Mon Dec 18 22:51:45 2006 -0500 + + need to synchronize ESTIMATE costs in MPI planner, and sum ESTIMATE costs for flop reporting: generalize measure_hook to cost_hook(..., {COST_SUM, COST_MAX}) + [empty commit message] + +commit 97ebd8fa0c58fd24345e3386b28f1c7abba8cb8d +Author: stevenj +Date: Mon Dec 18 15:36:15 2006 -0500 + + previous patch slowed down transpose-alltoall when TRANSPOSED_IN and DESTROY_INPUT; now allow planner to choose old behavior in this case + [empty commit message] + +commit 045a9c7e5b7ac5d91eb7567f34a2b4e307adeeeb +Author: stevenj +Date: Mon Dec 18 15:15:39 2006 -0500 + + transpose-alltoall doesn't require input to be destroyed if TRANSPOSED_IN is set + [empty commit message] + +commit 43ab77408bc3d76457a0e89ad02aec84f4949bf3 +Author: athena +Date: Mon Dec 18 17:41:25 2006 -0500 + + Added t2-style hc2c codelets, fixed typos. + [empty commit message] + +commit 7e431baa8e5da11432db111e201a4da9b19d6f49 +Author: athena +Date: Mon Dec 18 16:02:42 2006 -0500 + + Renamed certain variables to avoid calling an output stride `is'. + [empty commit message] + +commit 141dcad10c248a45577b80c26d1e396530597d3b +Author: athena +Date: Mon Dec 18 15:54:43 2006 -0500 + + Oops---wrong stride + [empty commit message] + +commit 23386506c8294fc1d61bc7cfcedb0bebc4e8fe60 +Author: athena +Date: Mon Dec 18 14:59:16 2006 -0500 + + Oops, forgot to add file + [empty commit message] + +commit 8e69f0617fe6f90d09c23d4ce8f125f1822eb363 +Author: athena +Date: Mon Dec 18 14:17:02 2006 -0500 + + Renamed r2hc/hc2r codelets to r2c + After the recent changes, r2hc/hc2r codelets became rdft2 + problems, so I renamed them accordingly to r2cf/r2cb. + Codelet parameters are now a real array and a complex array, instead + of an input array and an output array, and forward and backward + codelets have the same type, which removes some clutter from the rdft + code. + +commit 91b8d21aa599744cf6f9bb2141bcd4193fcdb957 +Author: athena +Date: Mon Dec 18 10:48:07 2006 -0500 + + Implemented backward radix-2k rdft2. + [empty commit message] + +commit c91a0bf1ed85466bcb46d2f55128399855c90f06 +Author: stevenj +Date: Mon Dec 18 13:56:09 2006 -0500 + + move extract_reim into kernel, since it is used by internal MPI stuff and not just in the API code any more + [empty commit message] + +commit ab0e79e7a1319598924b4d434f1a0ce57bc58a43 +Author: athena +Date: Mon Dec 18 08:40:14 2006 -0500 + + Do not check r1==cr unless rnk>0 + [empty commit message] + +commit 4a203a4d39cb5b02d1f6d83f2f525a6a6c0cf065 +Author: athena +Date: Sun Dec 17 21:03:50 2006 -0500 + + Implemented radix-2k RDFT2, forward only for now + [empty commit message] + +commit 6d86c9dd27b6fbfb45faf91980565df40ec8d825 +Author: stevenj +Date: Mon Dec 18 01:23:45 2006 -0500 + + separate TRANSPOSED/SCRAMBLED flags internally (this is required so that dft-rank1-bigvec and the future dft-rank1 won't have incompatible SCRAMBLED formats) + [empty commit message] + +commit 7920d86807a6fe9829cca1cb4e633ab3156c8b38 +Author: stevenj +Date: Mon Dec 18 01:02:27 2006 -0500 + + ops_add -> ops_add2 where possible, to shrink code + [empty commit message] + +commit 81d5eddab81d4c0265863e1da6302b63fb1a9a80 +Author: stevenj +Date: Mon Dec 18 00:43:02 2006 -0500 + + added dft-rank1-bigvec solver (easy case for 1d parallel transforms) + [empty commit message] + +commit bf7a77840dcbe0b1d5a8a1d7568877f093299e69 +Author: stevenj +Date: Sun Dec 17 20:42:21 2006 -0500 + + rewrote MPI stuff to use dtensor data structure + + A dtensor is an ordered tuple of triplets (n, ib, ob) giving the size of + a dimension (n) and its input and output block sizes of a distributed + row-major multi-dimensional array. An MPI DFT (etc.) is now specified + in terms of dtensors, which provide a much more flexible data layout. + + For example, we can now describe multidimensional block distributions, + which are important if the number of processors is greater than the + size of any given dimension. Currently, we only have solvers for + 1d slab distributions, and this is all that is supported in the basic + and advanced APIs. The guru API allows one to specify more general + distributions, however, which will be useful when/if we have solvers + for this case. + + We now also don't need a TRANSPOSED flag, at least internally, since + TRANSPOSED multi-dimensional DFT plans just correspond to dtensors + where the input and output block distributions are different. + + Other changes include the use of the XM(foo) macro for X(mpi_foo). + +commit c9e4b997dd8cd38b753a8c40fb0004ab07124ca7 +Author: athena +Date: Fri Dec 15 16:01:23 2006 -0500 + + Distinguished mutexes from semaphores. + The distinction is useful because the linux implementation of + sem_post() in unnecessarily slow when semaphores are used for mutual + exclusion. This change made spinlocks messier to implement, so I + excised them. + +commit 352252ac74f50d01ae2c996f0072533f84c9a043 +Author: athena +Date: Fri Dec 15 12:46:11 2006 -0500 + + Use posix semaphores where available. + Paranoid declaration of all shared variables as ``volatile''. Paranoid + initialization of all shared variables within locks. + +commit 3364aa89b74e5e6a3514c653dc4ef4ebeebddae4 +Author: Matteo Frigo +Date: Wed Dec 13 20:12:13 2006 -0500 + + paranoia + [empty commit message] + +commit 0be1cd7e754cf3b9550bcf6f60c2b31643d4512a +Author: stevenj +Date: Tue Dec 12 17:28:13 2006 -0500 + + punt on detecting unsolvable rdft2 problems; make r==iio rdft2 problems unsolvable, since it doesn't look like we've consistently checked for this case and it's not clear why we would want to support it (it was also not documented in the manual) + [empty commit message] + +commit 8f3194d212eeb8c2382a60a4db59ff1cf935faef +Author: athena +Date: Sat Dec 9 12:14:13 2006 -0500 + + Obey stupid const rules + [empty commit message] + +commit 1f7938759fd6c3a52293ffeffea1961692a22e72 +Author: stevenj +Date: Fri Dec 8 18:21:50 2006 -0500 + + added unsolvable check for rdft2 problem + + An in-place rdft2 problem is ill-formed if the real data, including the + extra "padding" elements, do not coincide with the complex data. + + CHANGE: the new code considers all in-place split r2c and c2r problems + to be ill-formed. Previously, these could be done, but only if the + entire multi-dimensional array fit into the buffer, which is kind of + stupid. I'm not sure it's worth it to even try to support the + split in-place r2c case. + +commit e5241fedc1b2a9be448809abfc8b812e07598801 +Author: stevenj +Date: Fri Dec 8 13:47:53 2006 -0500 + + check in-placeness after joining taints + [empty commit message] + +commit b7a9db50bbf343d80e6b5d0cbaae7cd4d8653f1e +Author: athena +Date: Fri Dec 8 13:43:44 2006 -0500 + + Grrr... paranoid-check was not testing in exhaustive mode + [empty commit message] + +commit d34bae7a5b89e8298450b98759be43f22e7c99d3 +Author: Matteo Frigo +Date: Fri Dec 8 10:00:30 2006 -0500 + + Implemented PROBLEM_UNSOLVABLE. + In-place DFT and RDFT problems with inconsistent I/O strides are + now unsolvable, and we don't check for them any longer in solvers. + + While I was at it, declared all problem pointers to be ``const'' + for extra safety. + +commit db6e8b81d60e8cbe9f49ac3035a5151759afc88b +Author: Matteo Frigo +Date: Thu Dec 7 20:13:46 2006 -0500 + + Avoid qsort'ing one element. + [empty commit message] + +commit a6d29bce88258799bb4bc6ee27c36aa5ccf4cbcd +Author: Matteo Frigo +Date: Thu Dec 7 18:25:47 2006 -0500 + + In-place vrank>=1 is now applicable only if the problem is really in-place. + [empty commit message] + +commit f0e0bda2dacfef167a5387c26d0c5631b59aaa0c +Author: athena +Date: Tue Dec 5 12:21:38 2006 -0500 + + unused variable + [empty commit message] + +commit 07dc6817f4991f8690c6b6952bc3879c4712a624 +Author: Matteo Frigo +Date: Sun Dec 3 19:16:33 2006 -0500 + + Removed CVS $Id$ everywhere, since darcs does not update them. + [empty commit message] + +commit 2cf2355d9987a09710a6b6b345cf232abf8c1a8b +Author: Matteo Frigo +Date: Sun Dec 3 16:11:17 2006 -0500 + + generalized dftw to encompass q codelets. As a side effect, q codelets are now threaded. + [empty commit message] + +commit 942c7b34d673282b52aacbb51237b38f3ffef3f5 +Author: stevenj +Date: Sat Nov 25 16:34:38 2006 -0500 + + add missing __declspec attribute to threads API functions when compiling for Windows (thanks to Robert O. Morris for the bug report) + [empty commit message] + +commit 8c4b9a9a79e7fdbbd7eab18f4aac4ac94c8ce2cb +Author: stevenj +Date: Mon Nov 20 17:39:20 2006 -0500 + + add AC_SUBST to AX_OPENMP, thanks to Sebastien Maret for the suggestion + [empty commit message] + +commit 02d141e6157d606dce0bf146248958313ea19466 +Author: stevenj +Date: Mon Oct 16 23:02:29 2006 -0400 + + not gcc bug for MIPS (thanks to Jonathan Day) + [empty commit message] + +commit 87fc8a66ef9cf8161a4cf23c0580f91ec9e86e25 +Author: stevenj +Date: Sat Sep 23 17:52:36 2006 -0400 + + in maintainer/debug mode, don't modify CFLAGS if they were explicitly set (-pedantic seems to cause problems with LAM's mpicc, so I need a way to override) + [empty commit message] + +commit d1ebd06376db08bd5afecbe45d6059f60f7cd09d +Author: athena +Date: Wed Nov 22 18:14:47 2006 -0500 + + Removed obsolete comment. + [empty commit message] + +commit b7bdd19e3b444a9c0ce68991739644a0fd4d9166 +Author: athena +Date: Sun Nov 19 11:21:44 2006 -0500 + + Use p->v when comparing TW_FULL fields. + [empty commit message] + +commit fd6481c30c72bf15c3316dd7db6664e5b801160e +Author: athena +Date: Thu Nov 16 14:49:05 2006 -0500 + + removed useless definition + [empty commit message] + +commit d161dc974c19cf43addd4b6cb516ae6b770827e7 +Author: athena +Date: Mon Nov 13 09:18:32 2006 -0500 + + paranoid avoidance of integer overflows + [empty commit message] + +commit e5a1cce0ead5ae9d73c2c38c48e66c3bf059a874 +Author: athena +Date: Mon Nov 13 09:00:11 2006 -0500 + + avoid potential overflows in cycle counters + At the suggestion of Alex Cichowski, convert all ticks + to double before operating on them, to avoid potential + signed/unsigned confusion and integer overflow. + +commit 98e4c9b9751d26d0adecc56634cc77e5689357bc +Author: Matteo Frigo +Date: Sun Nov 5 09:00:52 2006 -0500 + + Removed unused struct field + [empty commit message] + +commit 303349e158e3fdf0231790fe32a6831aa671f895 +Author: Matteo Frigo +Date: Sat Nov 4 09:43:13 2006 -0500 + + use pthread condition variables instead of semaphores + Condition variables are more likely to be portable everywhere, and + somehow they appear to introduce less overhead at least on my + linux box. + +commit eb7fb1efca70242568f0e74266ea88e8c9a45eff +Author: Matteo Frigo +Date: Tue Oct 31 20:45:24 2006 -0500 + + Imprecise help message. + [empty commit message] + +commit 08bdb758c515972281738ca7567e38d3aeb05cf4 +Author: athena +Date: Mon Oct 30 20:13:35 2006 -0500 + + Experimental implementation of spinlocks. + This patch implements spinlocks via a semi-portable hack, and adds + the -ospinlocks option to the bench program so that we can play with them. + +commit fe239f5afbec9a3868f4330849cfe3d6dccb54b0 +Author: athena +Date: Thu Oct 26 22:29:18 2006 -0400 + + Updated manual for new openmp configure options. + [empty commit message] + +commit 9809db57ce3f7e945e7bf04105a3fce74cdf7f47 +Author: athena +Date: Thu Oct 26 21:52:39 2006 -0400 + + Added back openmp. + Rationalized threads naming conventions: + + * threads explicitly managed by us are enabled by --enable-threads, + predicated on HAVE_THREADS, etc. + * openmp is enabled by --enable-openmp, predicated on HAVE_OPENMP, etc. + * SMP denotes either THREADS or OPENMP. + +commit 22cd21b038b6dd972444d5b00a6ebd00a932aa7f +Author: athena +Date: Mon Oct 23 20:14:31 2006 -0400 + + different thread protocols + [empty commit message] + +commit f61da0e9c9db3c22dfd61c108f5f65bc4afe78bd +Author: athena +Date: Sun Oct 22 14:49:32 2006 -0400 + + fix memory leak + Added pthread_attr_destroy to avoid memory leak. + +commit 6f6532928b29c6ac7599424c9dc834c41fc7fcf0 +Author: athena +Date: Sun Oct 22 14:23:30 2006 -0400 + + Experimental new pthread implementation that recycles threads. + [empty commit message] + +commit e8c76bbab164fd6ad784bcfd9ec0fe5f002bfb43 +Author: athena +Date: Tue Oct 24 23:28:10 2006 -0400 + + switched buddies + Switched order of buddies in rdft2 rank-geq2 for consistency + with analogous dft and rdft solvers. Furthermore, this change reduces + the MEASURE planning time for rank == 3. + +commit 3e13c85d1651dfc698143631f47a45b4c3947d12 +Author: Matteo Frigo +Date: Sat Oct 21 10:10:00 2006 -0400 + + Typo. + [empty commit message] + +commit 7151038f7642b5ca050afb037fd91719a6f733b8 +Author: Matteo Frigo +Date: Sat Oct 21 09:56:50 2006 -0400 + + Out of place is the default. Thanks to Kirk Kern for pointing this out. + [empty commit message] + +commit 281e20106cf076681392cb66050e11d2ac758dd2 +Author: stevenj +Date: Fri Sep 29 01:36:11 2006 -0400 + + rename "test" to "tst", since a user (Igor Levicki) reports that "test" is a reserved words in some x86 assemblers + [empty commit message] + +commit 859e712b9c8051f6a1fb5a6500472042f194712f +Author: Matteo Frigo +Date: Tue Sep 26 09:01:08 2006 -0400 + + Stylistic change. + [empty commit message] + +commit d024e575f98dc4a3452b9e0d5115a6650a7bf951 +Author: athena +Date: Tue Sep 26 08:45:37 2006 -0400 + + Do not set tmin=1e10, since a large FFT may take longer than that. + [empty commit message] + +commit f31fffd32e9497675200784973ee8420ef3d60db +Author: athena +Date: Sat Sep 23 22:07:10 2006 -0400 + + Disable certain gcc optimizations. + When PRECOMPUTE_ARRAY_INDICES is #define'd, array indices have the + form array[stride[k]] for compile-time constant k. Apparently new + gcc's copy stride[k] onto the stack before the codelet loop, which is + an idiotic optimization if ever there was one. This patch confuses + gcc enough to prevent this optimization. + +commit 0cc1f20ac1bbadb2e82d6465941755a9754d69d7 +Author: stevenj +Date: Sat Sep 23 13:02:58 2006 -0400 + + re-enable TOMS algorithm - it is the best for large vector lengths, since for such sizes the cache line is not an issue and the bookkeeping overhead is negligible + [empty commit message] + +commit 458c7ee2e058d2cbe6fc90d23780b59bb29fbb52 +Author: stevenj +Date: Thu Sep 21 15:40:15 2006 -0400 + + add measure_hook so that MPI can synchronize timing measurements (otherwise different processors might end up with different MPI plans, yikes!) + [empty commit message] + +commit 9fa6c37e2e09ea6bd226bde9a62f95d7c66f33bb +Author: stevenj +Date: Tue Sep 19 21:26:19 2006 -0400 + + added O(p log p) transpose algorithm (radix 2) + [empty commit message] + +commit 1316689f96089a3b53799a3733d15add7c2f267c +Author: stevenj +Date: Tue Sep 19 21:05:09 2006 -0400 + + comments + [empty commit message] + +commit c4b69d82b2c7de2fa2a963e27e3e498544c80262 +Author: stevenj +Date: Tue Sep 19 19:54:58 2006 -0400 + + whoops + [empty commit message] + +commit 19265283619d376581c5815adab98a2b51fb0cb2 +Author: stevenj +Date: Tue Sep 19 19:49:01 2006 -0400 + + synchronize planning so that if one process fails to create a plan then all of them do. + [empty commit message] + +commit e1b970b70562528b08d665ad2f7a17ee31f23e47 +Author: stevenj +Date: Tue Sep 19 18:17:38 2006 -0400 + + call MPI_Alltoall instead of MPI_Alltoallv for equal-blocks case, in case MPI implementation has special optimizations for the common case of equal sizes + [empty commit message] + +commit 3adcd54e6a54928afc2c58b7aab4bc75664be1d1 +Author: stevenj +Date: Tue Sep 19 12:07:35 2006 -0400 + + whoops + [empty commit message] + +commit 31b25a3bccaa0a8290dab5010199da8a5fec619d +Author: stevenj +Date: Tue Sep 19 02:20:06 2006 -0400 + + typo in comment + [empty commit message] + +commit 519395bdb6ed85a2f18ba95bc82a68b2d42ddaae +Author: stevenj +Date: Tue Sep 19 01:58:55 2006 -0400 + + more filename simplifications + [empty commit message] + +commit 2870207d79654158ecf7ae1d68d37382be5e39da +Author: stevenj +Date: Tue Sep 19 01:49:52 2006 -0400 + + canonicalize file names (hyphens, not underscores) + [empty commit message] + +commit 41c88ac7e2cc2df2ff894c7223d55a41800b4c98 +Author: stevenj +Date: Tue Sep 19 01:34:07 2006 -0400 + + add mpi-dft-serial + [empty commit message] + +commit cbf1beef8656c2b0bc205c4787e6986cf32b405a +Author: stevenj +Date: Tue Sep 19 01:21:47 2006 -0400 + + silence warnings + [empty commit message] + +commit ff7df52317b96acc1966b2d5920e46a3e368bded +Author: stevenj +Date: Tue Sep 19 00:31:59 2006 -0400 + + make "t" problem semantics match FFTW_MPI_TRANSPOSED + [empty commit message] + +commit 694244ed8ede7153eca565e43ff553a26db39b8f +Author: stevenj +Date: Mon Sep 18 23:50:43 2006 -0400 + + whoops, fixed backwards mpi_dft + [empty commit message] + +commit a36a49ee7709c1f3010f32039814f655e502850a +Author: stevenj +Date: Mon Sep 18 22:26:31 2006 -0400 + + initial stab at rank-geq2 mpi-dft; seems to be mostly working + [empty commit message] + +commit c8e0a65f63c0d8eb6a148cee255c5aca2ff4c68b +Author: stevenj +Date: Sun Sep 17 13:41:32 2006 -0400 + + support SCRAMBLED_OUT in alltoall transpose + [empty commit message] + +commit 72887de15eec06aeb7426d6a7cc527fc171821b0 +Author: stevenj +Date: Sun Sep 17 12:34:30 2006 -0400 + + skeleton of future support for block-cyclic + [empty commit message] + +commit 62b562d1df02409e10395385348f56318e46a2e7 +Author: stevenj +Date: Sun Sep 17 12:11:19 2006 -0400 + + test program now checks scrambled in/out via -obflag=28/29 + [empty commit message] + +commit b3ef0c11ca26e02875c29eb154f1a5b9bf386ad5 +Author: stevenj +Date: Sun Sep 17 11:58:36 2006 -0400 + + added -obflag to make it easier to set high-order bits + [empty commit message] + +commit a4cbe985fe508661ccf587b5331e62b0a6526289 +Author: stevenj +Date: Sun Sep 17 01:30:51 2006 -0400 + + use proper child plans for 2nd transpose in transpose_alltoall; implement opcount in transpose_inplace + [empty commit message] + +commit ab2dd6cfd9903487e3ac3cf9401c9a1f35de4862 +Author: stevenj +Date: Sun Sep 17 01:08:01 2006 -0400 + + fix in test program for transposes of vectors -- transpose routines seem to completely work now (except for scrambled in/out, which is untested) + [empty commit message] + +commit aa5eecbf266020f2e2788bba862c13f6575d1ce8 +Author: stevenj +Date: Sun Sep 17 01:01:16 2006 -0400 + + fixed bug in transpose_alltoall for unequal blocks + [empty commit message] + +commit 202f232a54abc2cb04e0a3d0d32bdb727c306c4e +Author: stevenj +Date: Sat Sep 16 15:29:46 2006 -0400 + + correctly handle cld2rest + [empty commit message] + +commit 36668c0dd144f2bc2f6b2bf1f10eb1677593b9c6 +Author: stevenj +Date: Sat Sep 16 15:29:31 2006 -0400 + + some debugging code and other fixes + [empty commit message] + +commit 66dcf1f5c673fd16b2f0f88988c4aaf388eeaf27 +Author: stevenj +Date: Sat Sep 16 14:54:30 2006 -0400 + + whoops, forgot to check in mpi_bench.c file + [empty commit message] + +commit 3d96f316225934ef4485bcc2432314b89292914b +Author: stevenj +Date: Sat Sep 16 14:54:02 2006 -0400 + + added bench_exit routine so that it can be overridden (by MPI_Abort) if needed + [empty commit message] + +commit b14337a969f6fee88bda25464c7ef7c0e56b5c00 +Author: stevenj +Date: Sat Sep 16 14:52:56 2006 -0400 + + bug fix in mpi_transpose_inplace for case where some processors are idle + [empty commit message] + +commit 43fd42786f54710bffe85528beae2fff76e4a58e +Author: stevenj +Date: Fri Sep 15 18:47:13 2006 -0400 + + allow vecloop for sz->rnk==0 in exceptional (SLOW) cases, e.g. it is necessary for loops of non-square transposes (otherwise e.g. ik1v5:200:200x10:20:1x20:1:10 planning fails) + [empty commit message] + +commit 121eaa69908a7b465f21f3529f74e983a63801ad +Author: stevenj +Date: Thu Sep 14 23:36:48 2006 -0400 + + first pass at working mpi_bench test program; transpose seems to work iff dimensions are divisible by #processors + [empty commit message] + +commit 51101a902b4fdaef585e1d9e975238100951601c +Author: stevenj +Date: Wed Sep 13 17:28:07 2006 -0400 + + whoops + [empty commit message] + +commit 7986cd7f00327db5f156e8d4d1458456f309e37a +Author: stevenj +Date: Tue Sep 12 22:27:03 2006 -0400 + + initial stub for mpi_bench + [empty commit message] + +commit 279ca0155c7cb9dcd9bb9c75149a24bb1f44ba50 +Author: stevenj +Date: Tue Sep 12 21:54:31 2006 -0400 + + do no output at all if verbose < 0 (for use with MPI, where we only want output from process 0) + [empty commit message] + +commit 481f3838af04ae3db7aee15094ecf748f71d03da +Author: stevenj +Date: Tue Sep 12 21:39:15 2006 -0400 + + whoops + [empty commit message] + +commit 792aaa1acca61e89b5605cbed49e9dd86bfbc2b1 +Author: stevenj +Date: Tue Sep 12 21:31:40 2006 -0400 + + split bench.c into bench.c and fftw_bench_common.c so that we can re-use some of the code in the MPI test program + [empty commit message] + +commit 3b3b95ad0b1ab373687a9df59cdf2ec4bcdd502b +Author: stevenj +Date: Tue Sep 12 21:00:36 2006 -0400 + + MPI stuff at least compiles now + [empty commit message] + +commit f5092f54bc2b8ee7289a2fb5148fc5315cbb2ee8 +Author: stevenj +Date: Mon Sep 11 22:26:36 2006 -0400 + + initial (nonfunctional) start at MPI support (similar to FFTW 2.x in spirit, but mostly rewritten) + [empty commit message] + +commit 64d68fafe0c7f4433aec4a0925ce5972c33c78b4 +Author: stevenj +Date: Mon Sep 11 22:25:38 2006 -0400 + + make X(plan_awake) work for NULL argument to reduce code size + [empty commit message] + +commit ed05c503c219544b0fe91af61db02d9cbb4027b5 +Author: stevenj +Date: Fri Sep 15 23:47:08 2006 -0400 + + -mt should go before -mthreads to avoid spurious warnings on HPUX (thanks to Peter O'Gorman for the bug report) + [empty commit message] + +commit d737c7b3eca4ff8d7f372273f114dfd4e765b70c +Author: stevenj +Date: Mon Sep 11 13:53:44 2006 -0400 + + Fortran init_threads wrapper didn't return result; thanks to Markus Wetzstein for the bug report + [empty commit message] + +commit ba5664a7958d533904b9251a4bfaa56b0f338a8a +Author: stevenj +Date: Thu Sep 7 18:43:55 2006 -0400 + + make sure wrappers are included even if Fortran compiler was not detected (unless --disable-fortran was specified explicitly) ... this was supposed to be done before, but the definition was in the wrong place, grr + [empty commit message] + +commit 188c9dde71d0bc56ba30a052b82d02b6676f20ed +Author: stevenj +Date: Thu Aug 31 19:33:29 2006 -0400 + + I'm sick of answering this question about non-deterministic results + [empty commit message] + +commit 336fb6116c43aa5559392ea2d0759606efd6f275 +Author: Matteo Frigo +Date: Tue Aug 22 21:27:29 2006 -0400 + + Add --tag=CC flag to libtool. + + This change is consistent with the libtool invocation in the latest + automake, and is required to compile with (some version of) xlc. + +commit d98d86f9115ca1a836e92d8df8e061f98f329032 +Author: athena +Date: Mon Aug 21 21:40:36 2006 -0400 + + avoid ``fma'' because it is defined in c99. + [empty commit message] + +commit 841eb8db14a22936ba8ef81f439f42cb2411073d +Author: Matteo Frigo +Date: Sun Aug 20 11:40:53 2006 -0400 + + Obey -standalone flag. + [empty commit message] + +commit f270abac4732fe5f77708bef5f0d0cdc599bdb61 +Author: Matteo Frigo +Date: Sat Aug 19 13:34:27 2006 -0400 + + obey -standalone when generating simd codelets + [empty commit message] + +commit f573bbe2aaafabfbb21daf7da62972b8b071167f +Author: Matteo Frigo +Date: Sat Aug 19 13:33:43 2006 -0400 + + removed obsolete athfft + [empty commit message] + +commit 84e5b7792da92198e101b168d10710f0b81df5e8 +Author: stevenj +Date: Thu Aug 17 21:50:50 2006 -0400 + + updated citation to Proc. IEEE paper + [empty commit message] + +commit 5ca3a79e05b95a688c21e7cb37a1ef7fa42a7f04 +Author: stevenj +Date: Thu Aug 17 21:47:05 2006 -0400 + + use darcs changes --summary to make nice changelog; emacs fill-region hack is obsolete + [empty commit message] + +commit b80ff1b7affc5ba9c62bde0b06a548c3baf7c615 +Author: athena +Date: Mon Aug 14 17:53:19 2006 -0400 + + removed timer calibration + Timer calibration seems not to work any longer on recent processors--- + too much noise. I have remove it completely. + +commit 8986b3fa943f3f424a2f75541f8627a86af31a0a +Author: Matteo Frigo +Date: Mon Aug 14 10:47:15 2006 -0400 + + removed k7 + Removed obsolete k7 support. + +commit 820835bfa680e9a0193435bfbcaf21923df9e7fc +Author: athena +Date: Sun Aug 13 11:02:11 2006 -0400 + + Use darcs instead of cvs. + [empty commit message] + +commit 818c52da26a5d0781db8d9b45d4026403fb7e922 +Author: Matteo Frigo +Date: Wed Jul 19 08:52:15 2006 -0400 + + Treat a the string "-" as a nonoption. + +commit 4e8a814e90696ee38898bfb5f079ac9bb6b614c2 +Author: Steven G. Johnson +Date: Tue Jul 4 17:10:47 2006 -0400 + + comment out pkginclude dir for now + +commit 1bc4dd79b8cc59be7b18676f338c78013da54dab +Author: Steven G. Johnson +Date: Mon Jul 3 20:51:08 2006 -0400 + + make sure CCAS = CC to avoid libtool confusion + +commit ebddd6bce119dec0b9a970a6d6194131321bdc5e +Author: Steven G. Johnson +Date: Fri Jun 23 04:07:31 2006 -0400 + + install x77.h guru.h guru64.h in pkgincludedir + +commit e272fe53d7d822aa7d5ce03277f40c87aa843eef +Author: Steven G. Johnson +Date: Fri Jun 23 04:03:42 2006 -0400 + + whitespace + +commit d6d23fdac18d0d01e363ff60bdba1285be017d0c +Author: Steven G. Johnson +Date: Fri Jun 23 02:33:45 2006 -0400 + + support cycle counter with xlc on Linux/ppc + +commit 677dd906902cf9dd2215c576a8f9d9e6755cc7cd +Author: Matteo Frigo +Date: Tue Jun 20 08:16:08 2006 -0400 + + Stylistic change. + +commit bb6bed2564fdec63eb8439031bc45caf8436b378 +Author: Steven G. Johnson +Date: Tue Jun 20 02:20:34 2006 -0400 + + bump date + +commit 6944a35c403fdcbf6b7b46f1aa9df9288991efca +Author: Steven G. Johnson +Date: Tue Jun 20 02:20:06 2006 -0400 + + correct bug reported by Andrew Salamon ... --enable-portable-binary was + ignored (or rather, treated unpredictably) due to typo, grrr + +commit ad98ebc35798f8713ac299ebe9ce74ca9fefe2f1 +Author: Steven G. Johnson +Date: Thu Jun 1 20:30:06 2006 -0400 + + install 'internal' header files into includedir/fftw3/, includedir/fftw3f/, etcetera....this will make it easier to write external libraries that plug into FFTW internals, e.g. to add new solvers + +commit 4ce51f61d823524e8bebc4bc92ad2b17b6e7b53a +Author: Steven G. Johnson +Date: Mon May 29 23:59:19 2006 -0400 + + bug fix, thanks to James Donald for the bug report (only affects experimental semaphore stuff) + +commit ca9e38be107c761af7cd66a3ce9f0cfe93e9c069 +Author: Steven G. Johnson +Date: Mon May 29 23:58:16 2006 -0400 + + comment + +commit 7e4b4be5e1bcdd9706a3ded5e2f59010ff751401 +Author: Steven G. Johnson +Date: Mon May 29 21:02:50 2006 -0400 + + whoops + +commit 5af69a3ec3b932c0d7e3e2dfdbcbff2aa067c5bf +Author: Steven G. Johnson +Date: Sat May 27 19:36:15 2006 -0400 + + version bump + +commit 27dd43e42fa0b4ccea275b2143a9056f42f8c7f9 +Author: Steven G. Johnson +Date: Sat May 27 14:54:47 2006 -0400 + + only check for xlc_r/cc_r if we are not using gcc + +commit c222c025be6649da84164ba5d2334fdcf0b3ac0b +Author: Steven G. Johnson +Date: Fri May 26 15:00:38 2006 -0400 + + use ptrdiff_t (it's C89 and standard C++, hooray) + +commit c3450d7f654ac2adf06bbbe9687f99cf1c6641b5 +Author: Steven G. Johnson +Date: Fri May 26 12:59:33 2006 -0400 + + version bump + +commit 0be4f57c071dc97314660a66f4d46eee4ac143e9 +Author: Steven G. Johnson +Date: Fri May 26 12:57:32 2006 -0400 + + noted 64-bit guru API + +commit 90455678a81def7a9aa3bc14f17047deb714271b +Author: Steven G. Johnson +Date: Fri May 26 12:53:09 2006 -0400 + + note that newer versions of VC++ support long long + +commit efddf05184fe6977af120842d10faf89399f14e0 +Author: Steven G. Johnson +Date: Fri May 26 12:46:09 2006 -0400 + + try harder to get a portable 64-bit type + +commit 1d34caa16af08ff47fd75006c7576242e4643d17 +Author: Steven G. Johnson +Date: Thu May 25 22:04:18 2006 -0400 + + added draft guru64 API + +commit f987e828891ddd69efa3c664c68d231c1d3fc460 +Author: Steven G. Johnson +Date: Mon May 22 16:41:44 2006 -0400 + + added FIXME note + +commit 245cd07427cd24c953e4f1eea383790c7f557701 +Author: Steven G. Johnson +Date: Mon May 22 16:40:30 2006 -0400 + + check for xlc_r in addition to cc_r; thanks to Guy Moebs for the bug report + +commit 8a76c773855a145883608d47ca0aaa369e3ec408 +Author: Steven G. Johnson +Date: Fri Apr 21 12:35:25 2006 -0400 + + added note about gcc 4.0.1 on MacOS/Intel + +commit 9bb0ec78947a8597e0642379e7348e6b1c03af0b +Author: Steven G. Johnson +Date: Thu Apr 20 23:08:42 2006 -0400 + + added code for Core Duo; thanks to Eric Branlund + +commit d7a2e4a3ad51c01ec1bffbbadad602bb643da270 +Author: Steven G. Johnson +Date: Thu Apr 20 20:21:03 2006 -0400 + + fixed failure for -fPIC or for gcc-4 on Apple Intel machines; thanks to + Eric Branlund for the bug report + +commit 3cb3cea549b4e8e0f9a16a1952eae4b4d8be1189 +Author: Matteo Frigo +Date: Tue Apr 11 20:00:31 2006 -0400 + + Use -maltivec when checking for altivec.h. + +commit e2fb474c726118343e25059e2e1e8d2da6a21f62 +Author: Steven G. Johnson +Date: Mon Apr 3 15:52:44 2006 -0400 + + note planner overwriting input in planner-flags reference + +commit 89a78d79d22078ee258d43d581cee6aaa3ba1d80 +Author: Matteo Frigo +Date: Tue Mar 28 09:05:26 2006 -0500 + + FAQ entry about --enable-k7 in 64-bit mode. + +commit bfc115831ce70cd5cbf96fc005710862cf10bef6 +Author: Steven G. Johnson +Date: Mon Mar 27 23:41:05 2006 -0500 + + sprintf -> snprintf, to avoid (harmless) complaints by users/compilers + +commit a2e4f6bfa281ed8b11c3a42e4cf32570e6a5c4d9 +Author: Steven G. Johnson +Date: Mon Mar 27 23:30:22 2006 -0500 + + silence compiler warning + +commit 2c39d368d18c97bb079456491d60bb9a0c4c4342 +Author: Matteo Frigo +Date: Fri Mar 17 09:20:10 2006 -0500 + + Remove dft/codelets/inplace, add simd/nonportable to list of + directories to be compiled on non-unix systems. + +commit 01fa8ec4e8e6bd7a560437afe4ce4e37c13e0806 +Author: Steven G. Johnson +Date: Sat Mar 4 16:17:56 2006 -0500 + + whoops + +commit 6687db156af27c4ba2a4ddab66b6aa0a951b1a35 +Author: Steven G. Johnson +Date: Sat Mar 4 16:13:08 2006 -0500 + + note that we align the stack ourselves if necessary, with gcc and icc + +commit eee84dd2a9317a44c05e2f4dc2c05ff42709a973 +Author: Steven G. Johnson +Date: Sat Mar 4 16:08:16 2006 -0500 + + clearer distinction between static and automatic storage in C + +commit bc1aba15a1ddb5cd37b8088ea70f81ea6093e8d2 +Author: Steven G. Johnson +Date: Sat Feb 25 20:27:01 2006 -0500 + + rm unused var + +commit d93efe4d5783cc4d5791894d58524c93644d5cb2 +Author: Matteo Frigo +Date: Sat Feb 25 17:30:28 2006 -0500 + + Improved usage of goto (Dijkstra miserere nostri) + +commit 36a203c3ada1b6257109162fee8dc563da9c4bc2 +Author: Steven G. Johnson +Date: Sat Feb 25 14:19:15 2006 -0500 + + boilerplate + +commit 4041499e9299726d5840a0d119af094517810bda +Author: Steven G. Johnson +Date: Sat Feb 25 14:14:40 2006 -0500 + + update for upcoming 3.1.1 + +commit 579c413f3bb5e24ac92d433aa17a063b1f11f8a1 +Author: Steven G. Johnson +Date: Sat Feb 25 13:57:34 2006 -0500 + + replace obsolete IMPATIENT with MEASURE + +commit e0e594ba308e101ba93aacdceabdf0a35b4b0221 +Author: Steven G. Johnson +Date: Sat Feb 25 13:52:25 2006 -0500 + + corrected comment + +commit 5c1e2c07d1d8e21c219853b35212ba7373b35b45 +Author: Matteo Frigo +Date: Sat Feb 25 10:19:26 2006 -0500 + + -v does not take an argument. + +commit dca8aaed07eadc0d1db6fe19b4a86d00ff7a328b +Author: Matteo Frigo +Date: Sat Feb 25 10:17:18 2006 -0500 + + Obey the unix convention that -ab = -a -b + +commit 95450e7e4d3ed287b4ff36d6ccd1250023cc06a2 +Author: Steven G. Johnson +Date: Fri Feb 24 23:13:49 2006 -0500 + + minor fixes (return error on unrecognized option) + +commit af67fa909fc8ad31f5163b26da1693b1f9a61649 +Author: Steven G. Johnson +Date: Fri Feb 24 22:46:12 2006 -0500 + + ugh + +commit fec17358e3fbfb5e049933495db198312f9e10f9 +Author: Matteo Frigo +Date: Fri Feb 24 21:42:56 2006 -0500 + + require exact match for long options. + +commit 5538e310cb61df6e3b5bd880ae604d86ec8f6121 +Author: Matteo Frigo +Date: Fri Feb 24 21:38:02 2006 -0500 + + better fix + +commit 6f17dbe2db5e098604a35c03a7a1514040ea47d6 +Author: Matteo Frigo +Date: Fri Feb 24 21:37:06 2006 -0500 + + Fix + +commit f10cae7e4cf944a6ef5928afbbaead482a4692d3 +Author: Matteo Frigo +Date: Fri Feb 24 21:25:48 2006 -0500 + + nothing + +commit 01a4d4b5c204ef2c6d0afc7402a72481ad4a6c3e +Author: Steven G. Johnson +Date: Mon Feb 20 17:37:21 2006 -0500 + + rm transpose-indirect-inplace solver, which was buggy + +commit baa641d48341281eb3a9d4d9792f4482042836b4 +Author: Matteo Frigo +Date: Wed Feb 15 08:43:05 2006 -0500 + + Comment fix. + +commit 207d1eae51bef5d4d14c7c670d6d16dadd8c8edf +Author: Matteo Frigo +Date: Wed Feb 15 08:18:41 2006 -0500 + + Cycle counter for Visual C++ x86-64, courtesy of Dirk Michaelis + +commit 0aefc1a066f619ed6f5b54791b00ab0acffe2901 +Author: Steven G. Johnson +Date: Tue Feb 14 19:17:30 2006 -0500 + + rfftwnd.png is in builddir + +commit 1799b5fa46fef72b8f116de92605ea4b8118a3db +Author: Steven G. Johnson +Date: Tue Feb 14 19:03:27 2006 -0500 + + fixed typo: --enable-portable-binary, not --with + +commit f75d618a590c61c3bdba28ad0155f327670e231f +Author: Matteo Frigo +Date: Mon Feb 13 07:59:06 2006 -0500 + + estimator tweaks. + +commit 1c0cc8d7bb3570ce31320d87bbe35eb5b03ef38d +Author: Matteo Frigo +Date: Sun Feb 12 20:43:39 2006 -0500 + + sse/sse2 support for t3?v codelets + +commit b1116627def6398d97dc443ba0f9bba1e2989f86 +Author: Matteo Frigo +Date: Sun Feb 12 20:39:22 2006 -0500 + + Use CEXP instead of SIN/COS. + +commit dd361f593b5e85eeea97f2a2c048d3a8dce9d7e5 +Author: Matteo Frigo +Date: Sun Feb 12 20:12:10 2006 -0500 + + bug in randomized cse eliminator. + +commit 9d329a9d010b44b728449d0f566eaa9356682a82 +Author: Matteo Frigo +Date: Sun Feb 12 18:34:12 2006 -0500 + + Added support for t2-style simd codelets. This is altivec only for + now; sse/sse2 don't even compile yet. + +commit b187b797d17ccda6efb853eb93b27aa42474a02a +Author: Matteo Frigo +Date: Sun Feb 12 15:30:27 2006 -0500 + + Added support for t2-style simd split-complex codelets. + +commit 78281302f4fd1a0d42f0a0baf64cb364076aedb3 +Author: Steven G. Johnson +Date: Fri Feb 10 18:21:28 2006 -0500 + + [empty commit message] + +commit 948abfe0c2c7db954b7de51ff8da674dab3258ee +Author: Steven G. Johnson +Date: Fri Feb 10 18:19:46 2006 -0500 + + punctuation + +commit e24cb9776a48a5cb0673e4ee8d75d142fcf2b117 +Author: Steven G. Johnson +Date: Fri Feb 10 18:00:35 2006 -0500 + + windows DLL stuff for Fortran interface + +commit fd7272f2e39eddd4491666e0bfe1e5c69c1eb04c +Author: Matteo Frigo +Date: Fri Feb 10 09:48:52 2006 -0500 + + Bumped version to 3.1.1 + +commit 81a965e9d51e8e647f2eeaa12a973f7ef5188314 +Author: Matteo Frigo +Date: Fri Feb 10 09:18:39 2006 -0500 + + Precompute array indices on x86-64. Speeds up Pentium IV and makes no + appreciable difference on AMD. + +commit 5dbfa49ad81db0d3dca7e419507654fc0adc63fe +Author: Matteo Frigo +Date: Tue Feb 7 22:01:36 2006 -0500 + + Check whether the processor supports CPUID before issuing the + instruction. (Grrr...) Code contributed by Eric J. Korpela. + +commit ce017677182a7662b7b1db85f32c6a8f34773703 +Author: Matteo Frigo +Date: Tue Feb 7 21:36:47 2006 -0500 + + icc supports x86_64 these days. + +commit a7f132f06de9d343ee68b436c089bd37e6b7fc17 +Author: Matteo Frigo +Date: Sun Feb 5 18:19:55 2006 -0500 + + Paranoia. + +commit 8645d5236a621db86ff7094b0e1a3e2946abc9fc +Author: Steven G. Johnson +Date: Mon Jan 30 15:27:53 2006 -0500 + + whoops, fixed assert (y <= x) + +commit 13864d94f5c655cee3914be9d8751e184f86b8c9 +Author: Steven G. Johnson +Date: Mon Jan 30 15:26:22 2006 -0500 + + note that safe_mulmod requires {x,y} < p (or at least < 2p), and added + assert + +commit 849af348d142662e71fc4f3efe2866907e3bc745 +Author: Matteo Frigo +Date: Mon Jan 30 11:09:32 2006 -0500 + + fixed aix/xlc lossage + +commit 106ee57674a134e1f876b6b6b77accd3a3b7a5f8 +Author: Matteo Frigo +Date: Sun Jan 29 20:42:51 2006 -0500 + + In the impuse test, normalize the impulse so that the impulse and the + random vectors have roughly the same L2 norm. This change reduces the + number of bits that we lose because of floating-point cancellation, so + that we can focus on the bits that we lose because of bugs. + +commit 45098b30a5e91b87bb97474de6ff2c16fd7373e3 +Author: Matteo Frigo +Date: Sun Jan 29 20:37:47 2006 -0500 + + Compute omega in trigreal precision, as opposed to R. + +commit 2c5480453a0fd877bdec040eb421b975eb2c63f4 +Author: Steven G. Johnson +Date: Fri Jan 27 19:16:22 2006 -0500 + + add --with-combined-threads option as workaround to Windows inability to build shared libs with dependencies + +commit 68fde0a7351209d643634dfc19367da685c7e455 +Author: Steven G. Johnson +Date: Fri Jan 27 17:20:45 2006 -0500 + + libfftw3_threads should *not* used -no-undefined because, in fact, it is not true -- this library depends on -lfftw3, and is not self-contained + +commit ba85fd54aba2401c937c7acbff52a7c557956f68 +Author: Steven G. Johnson +Date: Thu Jan 26 22:04:34 2006 -0500 + + updated + +commit 42feb604758692ce9936076f37e10c0f4098d46d +Author: Matteo Frigo +Date: Thu Jan 26 21:10:50 2006 -0500 + + Added paranoid stack alignment when awaking plans. While I was at it, + removed obsolete, redundant AWAKE macro. + +commit 6b9831ddefcd83bf50aeafd90a6aa1effb44183e +Author: Matteo Frigo +Date: Thu Jan 26 20:54:39 2006 -0500 + + Updated for 3.1. + +commit 4f2fadf55d8ba8d714bc96fb2236dfa981e3d244 +Author: Matteo Frigo +Date: Thu Jan 26 19:15:12 2006 -0500 + + ditched one alignment check and noted that we should eliminate the rest as well + +commit 7c89983f07d925a997e5c293f8cdd5fbe577e3fb +Author: Matteo Frigo +Date: Wed Jan 25 23:02:19 2006 -0500 + + alignment hack + +commit 34f414ddf79840e5a7a9122c98e97bb2a09ecbd7 +Author: Matteo Frigo +Date: Wed Jan 25 22:05:11 2006 -0500 + + detect pentium M + +commit 4f5853890a7ad01e763186bd03e44a5b20e5ef4a +Author: Steven G. Johnson +Date: Wed Jan 25 18:42:58 2006 -0500 + + don't trust host_cpu if it claims we are on i386/i486, and call cpuid anyway (if it fails we use no arch flag). This is needed on FreeBSD + +commit 16caea410e6cc85276555146cf41c370534074b6 +Author: Steven G. Johnson +Date: Wed Jan 25 18:00:04 2006 -0500 + + suggest --with-our-malloc16 in error message + +commit 7574f2ae7e872c4f05f34b73057069b57fb2df01 +Author: Steven G. Johnson +Date: Tue Jan 24 19:53:34 2006 -0500 + + ditto for -no-gcc + +commit 04b5cc720e50ebe4cd2360425e79d6767356288a +Author: Steven G. Johnson +Date: Tue Jan 24 19:51:08 2006 -0500 + + flags required for successfull compilation should be added even if the + user overrides CFLAGS + +commit 623ce195f6fe58d67f3bc8928ecc173f753e55db +Author: Steven G. Johnson +Date: Tue Jan 24 18:43:59 2006 -0500 + + upcoming gcc OpenMP support uses -fopenmp + +commit abec9a1443aa235af2e2cfbd86f636599bcfea5e +Author: Steven G. Johnson +Date: Tue Jan 24 18:26:59 2006 -0500 + + note that PGI uses -mp as well + +commit 883f0f18de0f8528fe77129192f521b1a77bfece +Author: Matteo Frigo +Date: Mon Jan 23 15:31:24 2006 -0500 + + my best guess at how to fix the microsoft crap du jour + +commit b457e9e371cf5e13bb818868495b38dce7ccdcd6 +Author: Steven G. Johnson +Date: Mon Jan 23 14:05:14 2006 -0500 + + use -Masmkeyword for PGI cycle counter, grr + +commit 91a65bac96c2fc134d11c8d551eb410de6d18bc2 +Author: Matteo Frigo +Date: Sun Jan 22 18:09:06 2006 -0500 + + Bumped version number to 3.1. + +commit 1745639a638440b17bfcea324c068679f655df24 +Author: Matteo Frigo +Date: Sat Jan 21 10:03:59 2006 -0500 + + Report that --enable-k7 is incompatible with --enable-shared. + +commit 840da056365df79ea63fc3d5a21b1ab5a13707e9 +Author: Matteo Frigo +Date: Sat Jan 21 09:17:54 2006 -0500 + + Do not use empty libraries in LIBADD, since otherwise the linker fails + on Solaris. + +commit 4228f20154f81216ab4ddae092d7661bb8af1652 +Author: Steven G. Johnson +Date: Wed Jan 18 10:47:59 2006 -0500 + + warn end-users away from this file + +commit b6e0f0a6eac2561efe417f2cfc0eb8686196a385 +Author: Matteo Frigo +Date: Tue Jan 17 16:16:42 2006 -0500 + + Gcc sucks. + +commit 8560506aa44b2740ea378c83c403373dfce2a662 +Author: Matteo Frigo +Date: Tue Jan 17 11:48:55 2006 -0500 + + Disabled checks that may turn out to be too paranoid. + +commit 782888694f5690298d87cc67cf9963f97aabc412 +Author: Matteo Frigo +Date: Tue Jan 17 10:35:03 2006 -0500 + + Some paranoid checks. + +commit c93e48fa31d081994b9e3b11cca9f1ab25bdf6a1 +Author: Matteo Frigo +Date: Tue Jan 17 09:31:08 2006 -0500 + + Flush stdout after printing. + +commit 8a84f237ca9d96babf1f4edeecb181c47cd74dbe +Author: Matteo Frigo +Date: Tue Jan 17 08:28:18 2006 -0500 + + Run the leak detector in all cases, not just when verbose > 2. + +commit 884a08a129046af3f84ce0fc138f385976f5a5a9 +Author: Matteo Frigo +Date: Tue Jan 17 08:11:41 2006 -0500 + + Eliminate calls to pow(), rint(). + +commit 370ddffe8e4854e4826b1ff4ea14c617d1eea504 +Author: Steven G. Johnson +Date: Tue Jan 17 00:45:06 2006 -0500 + + put # in first column, for stylistic consistency + +commit ede00270785b328279288ada254a11f7314bcd6c +Author: Matteo Frigo +Date: Tue Jan 17 00:17:27 2006 -0500 + + Made timeout part of impatience flags, in order to improve the + usability of wisdom. Also, fixed bogus error recovery logic in + planner.c:imprt(). + +commit 693f01973548254de258d7efa4217cabea005e79 +Author: Steven G. Johnson +Date: Mon Jan 16 23:03:34 2006 -0500 + + make timelimit < 0 .eq. FFTW_NO_TIMELIMIT + +commit 5af63c169becdefc68db3b4f2df8e788b9867c98 +Author: Matteo Frigo +Date: Mon Jan 16 21:52:01 2006 -0500 + + Eliminated the FFTW_TIMELIMIT flag in favor of this simpler logic: + fftw_set_timelimit(0) disables time limit. + fftw_set_timelimit(X), X>0 sets the time limit to X. + +commit 8a9d6dd6b442050ad202a6f7154926d145e359b1 +Author: Matteo Frigo +Date: Mon Jan 16 08:38:04 2006 -0500 + + Force the use of the estimator when wisdom fails because of md5 + collisions, otherwise the planner takes forever. + +commit 7c6a1a3f7e16df4dca8f78ee994d0488278977fb +Author: Matteo Frigo +Date: Sun Jan 15 21:30:31 2006 -0500 + + Ranted about how broken gcc-4 is. + +commit 383c1374f7af522dfcfe363c508d7fb630e83746 +Author: Steven G. Johnson +Date: Sun Jan 15 19:59:38 2006 -0500 + + change fftw_timelimit global var to fftw_set_timelimit(double) function, for simpler usage with shared libraries and for consistency with e.g. set_numthreads + +commit 584641592c2c273e233b919c8e68e1dbb840d72f +Author: Matteo Frigo +Date: Sun Jan 15 19:32:27 2006 -0500 + + Minor tweaks. + +commit f8fd8093b44aca863601612ae0b4818e91cca853 +Author: Matteo Frigo +Date: Sun Jan 15 16:32:54 2006 -0500 + + tweaks to make sure that time_n() is always called from the same stack position. + +commit 1a5445769d483d86df5d2de6e41f4c5e9515a4f1 +Author: Matteo Frigo +Date: Sun Jan 15 16:09:53 2006 -0500 + + Major simplification of the timer calibration logic. Also, use an FFT + as a unit of work instead of the old pointer chasing, because God + knows how pointer chasing interacts with the idiotic cache-hit + speculation on the Pentium IV. + +commit 1838fc3c1290495355ce10791c9a9f376dd7522d +Author: Matteo Frigo +Date: Sun Jan 15 15:12:08 2006 -0500 + + Fixed broken aligment checks when sizeof(R)==12. + +commit 17b67db5fa051c8eef9c962abfb698b51d11f303 +Author: Matteo Frigo +Date: Sun Jan 15 10:36:40 2006 -0500 + + Manual unrolling of loop. + +commit 7465e7b2ab1c48d06a50189a8545af2b0d98fdda +Author: Matteo Frigo +Date: Sun Jan 15 10:12:55 2006 -0500 + + Various improvements to timer calibration routines. + +commit 049684aa3e3f0411c535a71b0f4adc0ecff7327d +Author: Matteo Frigo +Date: Sat Jan 14 22:16:09 2006 -0500 + + cygwin defines __CYGWIN__, not __WIN32__ etc. + +commit c418027ffb0304f446af729a93415df506d093f3 +Author: Matteo Frigo +Date: Sat Jan 14 20:40:12 2006 -0500 + + fixed confusion between libbench and user timers + +commit 64c27bbd6553e2d8e2e988456890e3e31266b89e +Author: Steven G. Johnson +Date: Sat Jan 14 12:32:44 2006 -0500 + + update + +commit 1b00d512abfe62699264bc556e84a50e89c9a377 +Author: Matteo Frigo +Date: Sat Jan 14 10:24:11 2006 -0500 + + Comment. + +commit 7fa69534cca1e07e3c1260151ed8dee5e5a645cc +Author: Matteo Frigo +Date: Sat Jan 14 10:19:28 2006 -0500 + + Workaround gcc bug. + +commit 686f1af1d0f1c63d99f2891a47c5de2b459b92d2 +Author: Matteo Frigo +Date: Fri Jan 13 19:13:18 2006 -0500 + + Switched to -beta2. + +commit 9f370230780a4f3c03643f6c35f4114fada8c1e7 +Author: Matteo Frigo +Date: Thu Jan 12 22:21:57 2006 -0500 + + Fixed technically correct but highly obfuscated use of the enum tag + R2HC as a null pointer. + +commit 38965981e1187e5d0574e129690f3e02b4bc1cae +Author: Steven G. Johnson +Date: Thu Jan 12 19:25:20 2006 -0500 + + --enable-unsafe-mulmod is obsolete + +commit 3f29e7d2e1993de8b7a9759bc879955cb8ae569d +Author: Matteo Frigo +Date: Thu Jan 12 19:23:18 2006 -0500 + + More thoughts. + +commit 84082b78ddfaf5133e49453cc3a62c3d3dde9c04 +Author: Matteo Frigo +Date: Thu Jan 12 19:17:57 2006 -0500 + + Removed loop unrolling because it slows things down on at least one + powerpc and it generates clumsy x86 code. + +commit 51caa62b55dcdb8e1aeb9da2d10a40874cef875a +Author: Steven G. Johnson +Date: Thu Jan 12 19:17:35 2006 -0500 + + tweaks + +commit e29d0b0a8ceacbe19adba501d8e5799c7647bb87 +Author: Steven G. Johnson +Date: Thu Jan 12 15:55:52 2006 -0500 + + MacOSX x86 ABI specifies that the stack is kept 16-byte aligned + +commit 487e03a1ee35bc63877b6ec2c2e410da5f3dd4d5 +Author: Matteo Frigo +Date: Thu Jan 12 12:46:49 2006 -0500 + + ``ret'' is a reserved word in the evil empire. + +commit ef109b1d0703dbf67144c7ef5afe9ee4dd0ef489 +Author: Matteo Frigo +Date: Thu Jan 12 08:31:43 2006 -0500 + + Changed ret => result because ret ``is a reserved word'' in the evil + empire. + +commit 7dfbcb39afd28daaa10eba6e7909e0e8e3dd56bc +Author: Matteo Frigo +Date: Wed Jan 11 19:30:42 2006 -0500 + + Workaround Visual c++ lossage. + +commit 93876be963fec88768744d04a2c027a4c14f49f0 +Author: Matteo Frigo +Date: Wed Jan 11 19:26:16 2006 -0500 + + Workaround visual c++ lossage. + +commit b2e9544d09112da7db08f07f268e2ed3ad707634 +Author: Matteo Frigo +Date: Wed Jan 11 19:10:52 2006 -0500 + + isprint() is guaranteed to work for unsigned char + EOF only. + +commit 5b926765db935776483660d88b2ce02dca54081e +Author: Steven G. Johnson +Date: Wed Jan 11 13:47:49 2006 -0500 + + rm obsolete fixme + +commit 9237b1a5063d1190e4a8a79d924599a240706756 +Author: Steven G. Johnson +Date: Wed Jan 11 13:38:46 2006 -0500 + + [empty commit message] + +commit 72c1af743cd4da543e142aa9d51b600f47811378 +Author: Steven G. Johnson +Date: Wed Jan 11 13:32:26 2006 -0500 + + fix comment + +commit 47b608a52f08027e1429325bd1639ee4f176aea2 +Author: Matteo Frigo +Date: Wed Jan 11 12:27:05 2006 -0500 + + Paranoid use of K(x) for all constants x, to avoid runtime double->float conversions on sufficiently stupid compilers. + +commit fd9ac529906a8db6d171aa999e4a848b495a8fde +Author: Matteo Frigo +Date: Tue Jan 10 20:10:38 2006 -0500 + + Workaround to gcc nonsense. + +commit 90aaf565346f372e580fb899f9212558ff87d0d2 +Author: Steven G. Johnson +Date: Tue Jan 10 18:44:28 2006 -0500 + + bug fix: infinite loop in transpose-cut planning + +commit 5cd8a9482a90f25c76df01e4f8ea4b2a3386c449 +Author: Steven G. Johnson +Date: Tue Jan 10 18:12:14 2006 -0500 + + clarified comment + +commit 4c5e2af8af80c06734bac116adefdc9e346caa47 +Author: Steven G. Johnson +Date: Tue Jan 10 18:10:32 2006 -0500 + + more Windows decorations + +commit c0bb01fdec0e5c0d9636187641f43690cdb771e2 +Author: Steven G. Johnson +Date: Tue Jan 10 17:57:45 2006 -0500 + + added FIXME comment + +commit 82eb98885049d8d0b69490915a39614c17d5263c +Author: Steven G. Johnson +Date: Tue Jan 10 17:52:07 2006 -0500 + + 'make clean' should not delete codlist.c since it is included in the dist tarball + +commit 7fece302306db2d854caf017c680e29eadf79cb7 +Author: Matteo Frigo +Date: Tue Jan 10 17:50:12 2006 -0500 + + Change threshold for ``large'' Cooley-Tukey to 256K from 64K, since it + seems to benefit the Pentium IV with sse and the planning cost is not + too horrible. + +commit 46c94f013ca0ab45344996479ff3059a6b835241 +Author: Steven G. Johnson +Date: Tue Jan 10 17:45:11 2006 -0500 + + more missing Windows DLL decorations + +commit 67d487e555c8d365aa9530173dba788656f2d91b +Author: Steven G. Johnson +Date: Tue Jan 10 17:41:28 2006 -0500 + + remove unused var + +commit 3356ac92a38eea7582b9712a6cef2067dd9ccf28 +Author: Steven G. Johnson +Date: Tue Jan 10 14:00:50 2006 -0500 + + allow compiler threads, if enabled, to take precedence over explicit threads + +commit d2c3905718e0dbe3bb6e67befc3a2f4c63badbeb +Author: Steven G. Johnson +Date: Tue Jan 10 12:30:09 2006 -0500 + + [empty commit message] + +commit 755b3ecdb747b9b6f1dbc52036cf1d08f724596d +Author: Steven G. Johnson +Date: Tue Jan 10 12:21:56 2006 -0500 + + [empty commit message] + +commit 22db6a0e68da61729239444ff941e84f8de1b336 +Author: Matteo Frigo +Date: Tue Jan 10 09:13:20 2006 -0500 + + Fixed comment typo. + +commit 219609390fc443e6defd5f4940aa36e059b0e6c6 +Author: Matteo Frigo +Date: Tue Jan 10 08:59:22 2006 -0500 + + Rearranged timeout checks so as to eliminate one of them. + +commit 5d22885da57a28d4ce96128650dba99a3ea76481 +Author: Matteo Frigo +Date: Tue Jan 10 08:56:55 2006 -0500 + + Converted residual CK() -> A(). + +commit d82a20e3e3a4d47aebbd2ce4350da4976ba32652 +Author: Matteo Frigo +Date: Tue Jan 10 08:36:13 2006 -0500 + + Maintain the invariant TIMED_OUT ==> NEED_TIMEOUT_CHECK. + +commit 08f674254d16c7770944dc9e7c0eaa3579f333bb +Author: Matteo Frigo +Date: Tue Jan 10 08:24:41 2006 -0500 + + silence some 64-bit warnings + +commit 37aaadd4f3be4c0a5f03fffae1df96e82e8064c9 +Author: Matteo Frigo +Date: Tue Jan 10 07:58:48 2006 -0500 + + Assertions. + +commit 3ee7cd888752144ff48442480446982dcbf3bba3 +Author: Steven G. Johnson +Date: Tue Jan 10 00:14:00 2006 -0500 + + some condensing + +commit 667419d3ac72c2cc43df2d10f704111a40320338 +Author: Steven G. Johnson +Date: Tue Jan 10 00:03:32 2006 -0500 + + eliminate X(seconds) in favor of X(elapsed_since), in paranoia of clock wrap + +commit f696d1fe43a496c64fcf0daaa83060ac70c789fb +Author: Steven G. Johnson +Date: Mon Jan 9 23:21:21 2006 -0500 + + [empty commit message] + +commit 95280e070545a42bbd407c52877e6f8b48d778d6 +Author: Steven G. Johnson +Date: Mon Jan 9 23:21:06 2006 -0500 + + hmm, a bit more pessimistic about clock wrapping + +commit 47d7479fd14d1baf3102a699e72eb7158fede8bd +Author: Matteo Frigo +Date: Mon Jan 9 23:20:26 2006 -0500 + + Revert to md5uint = unsigned int whenever possible, so as to + avoid wasting space for unsigned long on 64-bit machines. + +commit 887d8a089ff5b925f88a198bf1b1cc7ddf61392a +Author: Steven G. Johnson +Date: Mon Jan 9 23:12:27 2006 -0500 + + note why clock() wrap should not be a concern + +commit 2991a94ba406fa1f245b62216e463a778f646bbd +Author: Steven G. Johnson +Date: Mon Jan 9 22:57:16 2006 -0500 + + bugfix in recent timeout changes - check for case where last solver times out + +commit 3a0c958aa20c64dab514ec5afe74531e933ac77a +Author: Steven G. Johnson +Date: Mon Jan 9 22:40:26 2006 -0500 + + started changes list from beta + +commit 63922f26968d87550c4fcfd47f41225d056e4977 +Author: Matteo Frigo +Date: Mon Jan 9 22:34:13 2006 -0500 + + Paranoia. + +commit 5bf3d3dd9c6ab2be2e450cd03cabb775bb3db4ca +Author: Matteo Frigo +Date: Mon Jan 9 22:27:37 2006 -0500 + + Paranoid assertions. + +commit 967f0848ad28ffe357a4758d477c5826075a4bac +Author: Matteo Frigo +Date: Mon Jan 9 22:13:32 2006 -0500 + + Added FIXME comment stating the 64-bit uncleaniness of + fftw_tensor_to_bench_tensor(). + +commit 0a2228df28268ba4855063849942199ed2c86d31 +Author: Matteo Frigo +Date: Mon Jan 9 22:06:05 2006 -0500 + + Another 64-bit bug. + +commit dc20e0d303713ae5664b91eb4762b4a0f5cf0623 +Author: Steven G. Johnson +Date: Mon Jan 9 21:54:07 2006 -0500 + + more Windows DLL nonsense + +commit d884e3edc5ca24864e92470966ed04aeaccab8f9 +Author: Steven G. Johnson +Date: Mon Jan 9 21:18:25 2006 -0500 + + some additional dllexport tags required to build the test program, due to internal stuff called by hook.c + +commit c0fc6ffb403456e03f5e8dc425182e6607c1cd2a +Author: Steven G. Johnson +Date: Mon Jan 9 20:31:15 2006 -0500 + + [empty commit message] + +commit a85549d03edbe4bee47b0248fac7d76d9cdfeb06 +Author: Steven G. Johnson +Date: Mon Jan 9 20:30:19 2006 -0500 + + comment + +commit 1f72b4d52a499bd63cd52ec259ae2585c6df2b66 +Author: Steven G. Johnson +Date: Mon Jan 9 20:20:28 2006 -0500 + + [empty commit message] + +commit fb0eb0e86fcfffb4c1b5ba17cc520e27914c4ff4 +Author: Steven G. Johnson +Date: Mon Jan 9 20:16:50 2006 -0500 + + clarification + +commit 29de1846aefcd05cb14e0dd286a8374a4a9b18e8 +Author: Steven G. Johnson +Date: Mon Jan 9 20:12:23 2006 -0500 + + define FFTW_DLL if DLL_EXPORT (defined by libtool) is supplied + +commit b99426a4b113d6c8017a6feeb22d89b8a32211f7 +Author: Steven G. Johnson +Date: Mon Jan 9 20:05:11 2006 -0500 + + whoops + +commit 5bb395fcc8798c697d5158b9242d4d914922d9db +Author: Steven G. Johnson +Date: Mon Jan 9 20:00:47 2006 -0500 + + another stab at Windows DLL mess + +commit 9453c5ed5d0c160deb3aef127870b7d65c26d8d1 +Author: Matteo Frigo +Date: Mon Jan 9 19:23:42 2006 -0500 + + 64-bit clean SIMD header file. I missed those because sparse + does not know vector types. Grrr... + +commit a27e044b39f52abb6066e070b1a3492b6be2e155 +Author: Steven G. Johnson +Date: Mon Jan 9 19:08:36 2006 -0500 + + this option is called AC_DISABLE_SHARED in the documentation + +commit 25cd95982a2acda3a3d6220728768164d6d9c890 +Author: Steven G. Johnson +Date: Mon Jan 9 17:34:13 2006 -0500 + + fixed --with-gcc-arch to work when cross-compiling + +commit c0b9d3122ba267c448b98b0ede12bcf27b9b4e02 +Author: Matteo Frigo +Date: Mon Jan 9 12:04:04 2006 -0500 + + Moved the timeout check back into the search loop, sicut erat in + principio. This gives us a precise control over the timeout. To + avoid the overhead of X(seconds)(), only call X(seconds)() if some + time measurement was taken since the last call to X(seconds)(). + +commit 8c4448e2b69fb02b70e85405bf58a77ec4c13de9 +Author: Steven G. Johnson +Date: Mon Jan 9 00:07:40 2006 -0500 + + comments + +commit 3cd770cab6fac7657b7cd55d6d98f3f516a20fb3 +Author: Steven G. Johnson +Date: Sun Jan 8 23:58:23 2006 -0500 + + generalized transpose-cut routine to be able to call transpose-gcd recursivly; TOMS follow-the-cycles algorithm now seems to be completely superseded + +commit 7ce8a67fabd9ed925a7aee905fa50c658ed2fd20 +Author: Steven G. Johnson +Date: Sun Jan 8 20:53:18 2006 -0500 + + [empty commit message] + +commit ee3cbdc7ad5dd5bfcb2f1f3df6b5ace55f121f32 +Author: Steven G. Johnson +Date: Sun Jan 8 20:52:16 2006 -0500 + + ignore errors from setscope -- POSIX standard does not require PTHREAD_SCOPE_SYSTEM to be supported, and PTHREAD_SCOPE_PROCESS is usually okay in that case + +commit 0ee88684468fc0dae5fd08cc684b8c174d885dd9 +Author: Steven G. Johnson +Date: Sun Jan 8 15:58:40 2006 -0500 + + added TODO comment + +commit 839a6d3192f804e3bc018419b90d18aa82d00292 +Author: Steven G. Johnson +Date: Sun Jan 8 15:39:28 2006 -0500 + + whoops + +commit d3fdf3fcd234dbb12aea0ab1029db2f121356f1e +Author: Matteo Frigo +Date: Sun Jan 8 14:44:23 2006 -0500 + + Boasted ``much faster altivec performance''. + +commit 6d85298a5a4c987cf192ae2df25673a8250d265d +Author: Matteo Frigo +Date: Sun Jan 8 11:44:52 2006 -0500 + + Added a new pass to the generator to schedule for the pipeline + latency. (This schedule modifies the ``optimal'' cache-oblivious + schedule and hence it uses more registers.) + + This pass is currently: + + * disabled for non-fma code, under the assumption that this will + run on a register-starved fma. + + * enabled for non-simd fma code, under the assumption that this will + run on a processor with 32 or more FP registers. The latency of 4 + is conservative and does not introduce too much register pressure. + + * enabled for simd fma code, under the assumption that this will run + on altivec. The latency of 8 seems to produce the best results. + +commit 1e7e0cd308f67033c681c0ae52836283f874fe51 +Author: Steven G. Johnson +Date: Sun Jan 8 03:13:53 2006 -0500 + + fixed estimator for vrank3-transpose + +commit 13dd2e84c1d331d07eaaef76bb78110dbe941446 +Author: Steven G. Johnson +Date: Sun Jan 8 02:02:11 2006 -0500 + + more detail on VC++ workaround + +commit 699008e51d100801bb19d99b2dbe595b1e33c445 +Author: Steven G. Johnson +Date: Sun Jan 8 00:19:19 2006 -0500 + + typo + +commit 2f842c52fbd7cac9b7564045378e1d649af6dbbf +Author: Steven G. Johnson +Date: Sun Jan 8 00:16:20 2006 -0500 + + screw it, just use planner for all sub-transposes in vrank3-transpose (still just use memcpy for contiguous copies, though) + +commit e6908d5d37b50dff661acfecd3687d1a9fd3300c +Author: Steven G. Johnson +Date: Sat Jan 7 23:13:45 2006 -0500 + + add an assert + +commit 000c5f8a4f6f83143f85268a03709d12ba1e896e +Author: Steven G. Johnson +Date: Sat Jan 7 21:57:34 2006 -0500 + + vrank3-transpose now uses planner to decide whether to use cpy2d, cpy2d_tiled, etc. + +commit f9db072d1270330e0fde90db33e71576d4a2e141 +Author: Steven G. Johnson +Date: Sat Jan 7 20:57:16 2006 -0500 + + too annoying to have isqrt unexpectedly fail for n==0 + +commit 9c8847c394cdd9bdd3d02a127a2497e09bab2d28 +Author: Steven G. Johnson +Date: Sat Jan 7 17:49:37 2006 -0500 + + clarifications + +commit 9fdeaf83ff81ca6931d74b65f8477f95fcfae323 +Author: Steven G. Johnson +Date: Sat Jan 7 16:39:20 2006 -0500 + + comment fix + +commit ad7b11b215b77bad24047e811e8bdaa2ee320edb +Author: Steven G. Johnson +Date: Sat Jan 7 15:16:22 2006 -0500 + + more faq updates + +commit 8bc87da1486f5f1a451cc418a345bb12b95479fc +Author: Steven G. Johnson +Date: Sat Jan 7 15:12:16 2006 -0500 + + enable fma on hppa, update FAQ entry + +commit 479aa905ff4136d48a86ef8ea28e46c06c07ee79 +Author: Matteo Frigo +Date: Sat Jan 7 14:06:31 2006 -0500 + + Accomodate different semantics of 'const' in C and C++ + +commit cf0d153fd10cf6e894520f58c2ce1e6259b683c9 +Author: Matteo Frigo +Date: Fri Jan 6 23:40:53 2006 -0500 + + Altivec is called VMX in IBM land. + +commit a46734a158edbc1e170c0e043d64fb3a320c8d80 +Author: Matteo Frigo +Date: Fri Jan 6 23:40:16 2006 -0500 + + Noted faster altivec support. + +commit 4e7329c580102980a2862964df1474c403d59f9d +Author: Steven G. Johnson +Date: Fri Jan 6 21:49:10 2006 -0500 + + updated icc flag detection + +commit 2de66ca6567360268fa4f1653c787903471a2ab7 +Author: Matteo Frigo +Date: Fri Jan 6 10:01:50 2006 -0500 + + Note ``memoize triggen''. + +commit c19609ea4726f8e842db68cbf15f2ee94abdf33d +Author: Matteo Frigo +Date: Fri Jan 6 09:36:51 2006 -0500 + + Use --enable-threads to generate dependencies in the threads/ directory. + +commit 7538d17a7e277e5f3099b285f85944ee81df6a7c +Author: Matteo Frigo +Date: Fri Jan 6 09:26:29 2006 -0500 + + Workaround to icc #defining __GNUC__. + +commit 3623ea4c4e5649470d360af6c89410b22da9b9ef +Author: Matteo Frigo +Date: Fri Jan 6 09:21:19 2006 -0500 + + Switched name to 3.1-beta1. + +commit 5022d2e2f5e385f82c9b298f958a6935de39233c +Author: Matteo Frigo +Date: Thu Jan 5 23:08:44 2006 -0500 + + More thoughts. + +commit d6262891e97139b27fdb2ca73addf122be568d17 +Author: Matteo Frigo +Date: Thu Jan 5 22:30:51 2006 -0500 + + Note wish that (block_size % 4) == 0. + +commit d6779fe4008a3ff1b5341cc82946e24a6e0cf418 +Author: Matteo Frigo +Date: Thu Jan 5 22:19:09 2006 -0500 + + Check alignment of mstart, mcount in SIMD codelets. + +commit 3d4fc920479d90ecc75a2256c6306c148d2a7bd8 +Author: Matteo Frigo +Date: Thu Jan 5 21:56:19 2006 -0500 + + Enable threads at bootstrap time, so I get the compiler warnings that + I would otherwise ignore. + +commit 90f3ef0fb9b081f29eae1e1923e94ea3bb29d7ba +Author: Matteo Frigo +Date: Thu Jan 5 18:23:15 2006 -0500 + + made compilable by c++ + +commit b68d5ed7c28299cf92764bff3ab8b8f06ec1cf00 +Author: Matteo Frigo +Date: Thu Jan 5 17:39:02 2006 -0500 + + FIXED: incorrect twiddle_shift() + +commit b56739cdd0ea335b6ca48c8dd34103316cc43785 +Author: Matteo Frigo +Date: Thu Jan 5 16:01:51 2006 -0500 + + Replaced remnants of awake flag with the new enum wakefulness type. + +commit 8871d572d270aa76dea86073fc11362c6d516c9a +Author: Matteo Frigo +Date: Thu Jan 5 11:20:59 2006 -0500 + + Oops---there is no need to find a free slot. + +commit fedf131be6c553e13212c16f7a8f474a0e61fed6 +Author: Matteo Frigo +Date: Thu Jan 5 09:41:58 2006 -0500 + + Assertions. + +commit ff66bb4a211ea2640f833ae48bedb1b34a0b47f2 +Author: Matteo Frigo +Date: Thu Jan 5 09:29:55 2006 -0500 + + Commented the hash table lookup algorithm. + +commit 4bafb30ddfc85ff74bb758a23532ce60bb621d19 +Author: Matteo Frigo +Date: Thu Jan 5 09:12:00 2006 -0500 + + Fixed infinite loop in hashtable lookup/insert. Grrr... + +commit 02a5374038e878b9e0cfe88ee88b0389bf20a255 +Author: Steven G. Johnson +Date: Wed Jan 4 22:04:28 2006 -0500 + + updated copyright years to 2006 + +commit b2d48f50aa87d2b9e5f57c6c04959b7ce0984732 +Author: Steven G. Johnson +Date: Wed Jan 4 21:57:23 2006 -0500 + + whoops + +commit 24baeff279c41dbe00c5fd1b13844175e8f70cfe +Author: Steven G. Johnson +Date: Wed Jan 4 21:52:18 2006 -0500 + + whoops + +commit 490a044a9e2b2f599506ef415c3f87c2b64ba83a +Author: Steven G. Johnson +Date: Wed Jan 4 21:51:40 2006 -0500 + + more updates for recent pentia/amd + +commit 21fc6cf5d45450edd194c6d83d328dd7c27c8142 +Author: Matteo Frigo +Date: Wed Jan 4 20:57:47 2006 -0500 + + Pruned TODO. + +commit 96c862a6929365a5a78a2196cd72c5037082c5d8 +Author: Matteo Frigo +Date: Wed Jan 4 20:43:41 2006 -0500 + + Prototype of problem_destroy() + +commit 700b7dcd5331fe4317b214d64086771a404814ef +Author: Steven G. Johnson +Date: Wed Jan 4 20:43:13 2006 -0500 + + rm obsoleted TODOs + +commit f722e923cd823d4501bc8c3a730fbc09d2c26e06 +Author: Matteo Frigo +Date: Wed Jan 4 20:37:24 2006 -0500 + + Fallback to 970 if neither -mcpu=power5 nor -mcpu=power4 are supported. + +commit b5823feffb1b189d536e5c562959969c247a61c3 +Author: Steven G. Johnson +Date: Wed Jan 4 20:29:07 2006 -0500 + + NEWS updates, clarifications, and reorganization + +commit fffa543ce9d6cb43d2c09bf401c029b5f6830356 +Author: Steven G. Johnson +Date: Wed Jan 4 19:54:41 2006 -0500 + + remove some compiler warnings, add an assert check, make estimator work properly for nop plans + +commit 3c4889a04995ac9f01ffdb3c4dd0ddc4ef42dc53 +Author: Matteo Frigo +Date: Tue Jan 3 19:34:04 2006 -0500 + + Two big changes: + + 1) revised the twiddle generation machinery, to avoid generating + twiddles when measuring, and to use a faster O(sqrt(N)) table + when this entails no loss of precision. + + 2) implemented new ALLOW_PRUNING estimator hack. + +commit 30e3e40e0439f7109a75c063ebb0544bbe68a0c7 +Author: Matteo Frigo +Date: Sat Dec 24 22:08:29 2005 -0500 + + Estimator tweaks, mostly to favor generic over rader for small n. + +commit 2e0e06d43cef1259a6fdda21744c8fa71960ea69 +Author: Matteo Frigo +Date: Sat Dec 24 17:55:47 2005 -0500 + + Grrr... missing break statement in switch. + +commit 12348cb25f94416b730862ea4d0a5e85eb2c98b2 +Author: Matteo Frigo +Date: Sat Dec 24 16:08:50 2005 -0500 + + Swapped fields TW and OPS in struct ct_desc_s, to make k7 asm + code insensitive to -malign-double. For consistency, changed + struct hc2hc_desc_s in the same way. + +commit 33a820de9270d537b4079f08fe258a969c410632 +Author: Matteo Frigo +Date: Sat Dec 24 16:00:42 2005 -0500 + + Wrong check for infeasible slvndx in imprt(). + +commit 4b5008a48fbfaf95504f2816b980f971d6678326 +Author: Matteo Frigo +Date: Sat Dec 24 15:56:59 2005 -0500 + + Removed obsolete function invoke_solver_if_correct_kind(). + +commit e1959cade352dd407f5c1c87cf37580ef60f6eb3 +Author: Matteo Frigo +Date: Sat Dec 24 14:22:12 2005 -0500 + + Faster implementation of safe_mulmod(), avoiding divisions altogether. + Works for 0 <= p <= INT_MAX. + +commit f827b89e687419b19b7133b64651c3a2f10de064 +Author: Matteo Frigo +Date: Sat Dec 24 12:05:54 2005 -0500 + + FFTW_ALLOW_LARGE_GENERIC must belong to flags->l, it cannot be + overridden by fftw. + +commit 5dbe4dcaa75797cb76e09e4349b526993fb435b2 +Author: Steven G. Johnson +Date: Fri Dec 23 20:46:24 2005 -0500 + + no more need for limits.h, add some explanatory comments + +commit 1dba2396d5d50261e6c82014e279b4ac035120f2 +Author: Matteo Frigo +Date: Fri Dec 23 17:50:25 2005 -0500 + + Paranoia. + +commit a09014d7cc40be154096f5b14b0b136985ac39fb +Author: Matteo Frigo +Date: Fri Dec 23 17:40:41 2005 -0500 + + Fixed subtle bug involving overflow of the slvndx field in flags_t. + +commit 1a5304605e6f104eb147f96a5bc76dad55ad9dbf +Author: Matteo Frigo +Date: Fri Dec 23 16:33:56 2005 -0500 + + Note 64-bit clean. + +commit 7d6e177477acee44216776a7afff2306b58eb963 +Author: Matteo Frigo +Date: Fri Dec 23 15:34:32 2005 -0500 + + Threads are now 64-bit clean + +commit 208ba330fb9eaaa58a138350dc9f9e965b95bd2c +Author: Matteo Frigo +Date: Fri Dec 23 13:00:31 2005 -0500 + + Restored the old numbering TW_NEXT=3 etc, because the k7 code depends + on it. + +commit 5a7e2e7cbedf9021d8b278afdd9762f3fe0cc697 +Author: Matteo Frigo +Date: Fri Dec 23 11:58:00 2005 -0500 + + Portable implementation of MULMOD() and safe_mulmod(). + Removed all unnecessary AC_CHECK_SIZEOF() from configure.ac. + +commit e515294ed8f991b8efb4dc7a0891c16562783679 +Author: Matteo Frigo +Date: Thu Dec 22 11:12:29 2005 -0500 + + Inline the loop body in r2r codelets like we do everywhere else. + +commit 94210bafc8387499f631cdd6187ab293943261a2 +Author: Matteo Frigo +Date: Thu Dec 22 10:48:53 2005 -0500 + + Oops. + +commit 2dcf5d5b1908062b236d6aa2fba93b28937e9488 +Author: Matteo Frigo +Date: Thu Dec 22 10:25:15 2005 -0500 + + Renamed X(sin_and_cos)() to X(cexp)(). + +commit de2f6ff5df500a8d15c1cb36f620d277994ec098 +Author: Matteo Frigo +Date: Wed Dec 21 22:49:58 2005 -0500 + + Somewhat faster generation of twiddle factors. + +commit 2bda3ba8833c53949694b05f2518b57b2cda80a3 +Author: Matteo Frigo +Date: Tue Dec 20 23:50:01 2005 -0500 + + tweaks + +commit 86c8779bcf89bca6fad1812b716a0171b7ab0f91 +Author: Matteo Frigo +Date: Tue Dec 20 22:29:19 2005 -0500 + + Sped up planner, esp. in estimate mode. The planner now classifies + all solvers into DFT, RDFT, and RDFT2, and it only invokes solvers + appropriate for the problem being planned. Because we have several + hundred solvers, the overhead of calling irrelevant solvers is + significant, and this modification mitigates the issue somewhat. + +commit 98ea24afbd44d88617f25cd467def39b934cbed5 +Author: Matteo Frigo +Date: Mon Dec 19 22:04:00 2005 -0500 + + Eliminated all calls to sprintf() in favor of own routines, so as not + to force users to link stdio and the associated locale/pthreads crap. + +commit 112a5e19c813a918315e26a80ed9e1f427aa59c3 +Author: Matteo Frigo +Date: Mon Dec 19 21:27:25 2005 -0500 + + Implemented routine to print INT, removing the need for c99's + %td format. + +commit 5c20f07423e4661b32498afa8071e1f6dacd47c7 +Author: Matteo Frigo +Date: Mon Dec 19 12:06:33 2005 -0500 + + info->n is size_t + +commit 6ae75f3b9b700352da7e3ad728d49d988f80e864 +Author: Matteo Frigo +Date: Sun Dec 18 18:15:04 2005 -0500 + + Explicit casts in front of pointer difference in printf() context, + just in case INT != ptrdiff_t. + +commit 25abe60b6b82d9cab328fbfc8dc17f33ffd6803a +Author: Matteo Frigo +Date: Sun Dec 18 16:52:38 2005 -0500 + + Forgot to add %D to print.c + +commit 7e07750df2164e8f8c88185b8857c527f145b444 +Author: Matteo Frigo +Date: Sun Dec 18 16:43:26 2005 -0500 + + Use %D as format character for type INT. + +commit 1bf67aff56a4e6b2f0fc41cb8b66e9b09d4b2ea0 +Author: Matteo Frigo +Date: Sun Dec 18 15:14:03 2005 -0500 + + Changed type of an_int_guaranteed_to_be_zero. Changed name as well. + +commit 602b07fee7f1fbb86b429e682fbce4a4f886e0d1 +Author: Matteo Frigo +Date: Sun Dec 18 14:41:31 2005 -0500 + + converted %o -> INT + +commit e99c67870f4d09190598610fc7c1bd5df8e4515e +Author: Matteo Frigo +Date: Sat Dec 17 20:28:50 2005 -0500 + + Major 64-bit cleanup. + +commit 3cd29a6839b31e093a5c715d6deb2867eafb1b15 +Author: Steven G. Johnson +Date: Wed Dec 7 22:39:01 2005 -0500 + + PGI x86-64 cycle counter, courtesy Cristiano Calonaci + +commit 7b830d38cb785513bde604f14a3253e171a75e0c +Author: Matteo Frigo +Date: Mon Dec 5 21:25:57 2005 -0500 + + Must insert into hash table when wisdom_state == WISDOM_ONLY, + otherwise wisdom does not work. + +commit 9cfa064f6635afd41f01788e5a16a7a56babfca0 +Author: Steven G. Johnson +Date: Sat Oct 8 18:08:44 2005 -0400 + + comment + +commit 7fd8f4a4ff768b59317a318d3d83ac0726609868 +Author: Matteo Frigo +Date: Sun Oct 2 11:49:13 2005 -0400 + + Paranoia: made planner robust against MD5 collisions. + +commit 55004ef918346e933b7d46aa529fc76258c0b673 +Author: Matteo Frigo +Date: Tue Sep 27 22:33:18 2005 -0400 + + Note that --enable-3dnow is unsupported. + +commit 317d36cb4265710fe5ccbf3518f15f7f24c076cb +Author: Matteo Frigo +Date: Tue Sep 27 22:31:04 2005 -0400 + + * Removed --enable-3dnow support. + + * SIMD support for split complex arrays. + +commit 2f87ee31a3c1a416b983aee2ad2441b0624f6839 +Author: Matteo Frigo +Date: Tue Sep 27 22:28:41 2005 -0400 + + Removed --enabled-3dnow, since it is becoming useless as the world + moves to x86-64, and it is a pain to maintain. (We should probably + remove the k7 stuff as well.) + +commit e5a5da39405e5960f93478937fea04c98feabf49 +Author: Matteo Frigo +Date: Tue Sep 27 21:59:16 2005 -0400 + + Missing BEGIN_SIMD(), END_SIMD() statements. + +commit 7898dae11c979e9b069616b3d922b09b23b8750f +Author: Matteo Frigo +Date: Tue Sep 27 12:16:08 2005 -0400 + + Tweaks + +commit 3bc850803f4f000f1c979a3576bdd066c37eaafe +Author: Matteo Frigo +Date: Tue Sep 27 10:04:32 2005 -0400 + + Fixed wrong opcount for simd codelets. + +commit 2c35b6d0d3217976f3597d04403cfac7a4f7da57 +Author: Matteo Frigo +Date: Tue Sep 27 09:25:50 2005 -0400 + + Fixed wrong opcount for simd codelets. + +commit 27aa07803ba692bbdbc563607e6531222bb56488 +Author: Matteo Frigo +Date: Mon Sep 26 22:58:19 2005 -0400 + + fixed flop counts + +commit 97b8e6bc0d2daddf10da0eb41c94e8e8c4e92bf1 +Author: Matteo Frigo +Date: Mon Sep 26 22:34:40 2005 -0400 + + Silence warnings + +commit 804b1a4d34edaba87c4aa0f6f7fe3f173bb926f8 +Author: Matteo Frigo +Date: Mon Sep 26 20:52:36 2005 -0400 + + Implemented split-complex SIMD codelets + +commit 4c34b9513f4003ec04ebc836dd009d15d4f913f1 +Author: Matteo Frigo +Date: Sun Sep 25 22:25:35 2005 -0400 + + Generalized the ``store pairs'' trick (now called ``store multiple''). + +commit c8eb4f532fe1b280cd93313eab57b1e51cd6d4cf +Author: Matteo Frigo +Date: Sun Sep 25 18:58:20 2005 -0400 + + Silence some warnings. + +commit 7ecbbeacf952a07cbc1a338fa9bdc9612d99b7bb +Author: Matteo Frigo +Date: Sat Sep 24 12:37:16 2005 -0400 + + Removed obsolete cruft + +commit 9a8a94ca3fb2d0ee33268ae8527f65260631d958 +Author: Matteo Frigo +Date: Mon Sep 19 22:55:19 2005 -0400 + + Re-enabled check for because OSX requires it. + +commit 2525a542b0277af07f89f45a3e68c2ac022d4189 +Author: Matteo Frigo +Date: Sun Sep 11 11:03:03 2005 -0400 + + Check for sizeof(unsigned int) unconditionally, because the + result is used by ifftw.h. + +commit 5750c658cabc6d64ab0f9817312b2399d75f4041 +Author: Matteo Frigo +Date: Sun Sep 11 10:59:40 2005 -0400 + + Higher size limit for t2 codelets. + +commit c5134ff6de3bfe5306428398c14cb7dcc9a09afe +Author: Matteo Frigo +Date: Sun Sep 11 10:50:37 2005 -0400 + + Heuristic: do not use t2 simd codelets for N>1024. + +commit 8c4b74a02763d61fd64c98f01fd2658bf80fbc68 +Author: Matteo Frigo +Date: Mon Sep 5 22:22:50 2005 -0400 + + Larger tolerance in timer calibration routine. + +commit ed07b941c3be22c7f19c569bd29230c683783b47 +Author: Matteo Frigo +Date: Mon Sep 5 16:03:33 2005 -0400 + + #include unconditionally. (There is no point in checking.) + +commit f03e0aced4c470b2b24d8d5abb94be526833a2b1 +Author: Matteo Frigo +Date: Mon Sep 5 15:23:27 2005 -0400 + + Removed SSE and SSE2 asm because it was bitrotting. Use the Intel + API instead, which seems to be supported by gcc >= 3.3. + Moved files that require -msse, -msse2 to new directory. + +commit a12a85c774d25cb85391f200a8e6d62da2572cce +Author: Matteo Frigo +Date: Mon Sep 5 12:56:28 2005 -0400 + + Parse cputypes of the form 7447A,altivecsupported + +commit 1d5a7d722689e83fdcccae9edae36ec276b68241 +Author: Matteo Frigo +Date: Mon Sep 5 12:52:30 2005 -0400 + + Distinguish powerpc 7400 from the 7450, which has a different + pipeline. + +commit b363c2bb7fe126fe80afcd974a463349e63a48a6 +Author: Matteo Frigo +Date: Mon Sep 5 12:46:00 2005 -0400 + + Paranoia: define RIGHT_CPU unconditionally. + +commit 558789684b3fa4435a4fab4d86769f2a5ee53b57 +Author: Matteo Frigo +Date: Thu Aug 11 20:56:41 2005 -0400 + + Removed obsolete name fftw-wisdom2c. + +commit d73fb7f9d84bc1acccdf9c8f7f2b71e10b3d7854 +Author: Matteo Frigo +Date: Thu Aug 11 20:55:59 2005 -0400 + + Avoid creation of temporary files---use cpp magic instead. + This fix solves a security bug and avoids nonportable tempfile + creation hacks. + +commit a74941c286a12d9a008c3b89ba558cfab82587af +Author: Matteo Frigo +Date: Fri Aug 5 10:03:02 2005 -0400 + + Workaround for with gcc-3.3 altivec bug. + +commit 259f7d688fec2615a29b1aeb22321568cdcc4bc4 +Author: Steven G. Johnson +Date: Wed Jun 15 21:36:46 2005 -0400 + + solaris fix: check -pthreads first since gcc does not like -pthread but chokes due to stubbed libc (grr) + +commit 261b7c0fcfaa8c8e6a34d06b051c4355bcac60b1 +Author: Steven G. Johnson +Date: Fri Jun 3 17:19:56 2005 -0400 + + note that VC++ bug was fixed in 2005 + +commit 14832d8b25d4091667d3f0e5c8fd8fa1c14f8ce1 +Author: Steven G. Johnson +Date: Mon May 30 16:30:45 2005 -0400 + + generalized ax_cc_vendor to ax_compiler_vendor + +commit b13949fd1df86e14fcd73495557bea7532b49b8c +Author: Steven G. Johnson +Date: Mon May 30 15:55:07 2005 -0400 + + updated message + +commit ead701adfc138233d26e86258f0daa8041a41d37 +Author: Steven G. Johnson +Date: Mon May 30 15:45:14 2005 -0400 + + update for new AC archive format + +commit 56c34ca4db1ff26982040ff00e1cb549653ab720 +Author: Steven G. Johnson +Date: Mon May 23 23:12:22 2005 -0400 + + [empty commit message] + +commit c04871b2f43fe56cd9e921b4864a26ad354cf3f5 +Author: Steven G. Johnson +Date: Mon May 23 18:17:38 2005 -0400 + + [empty commit message] + +commit c4afbfd4ef5235b1b88715bac592b8f091d76d13 +Author: Steven G. Johnson +Date: Mon May 23 18:13:08 2005 -0400 + + more notes + +commit 1cf10c2f758f89da2c0f8bd68f0a8c974e93f33c +Author: Steven G. Johnson +Date: Sun May 22 23:37:08 2005 -0400 + + whoops + +commit 568dac7da89c3fe5dbab61ff28e2aa6dc52ca71f +Author: Steven G. Johnson +Date: Sun May 22 22:37:50 2005 -0400 + + note icc 8.x annoyance + +commit 1b1f5c242db3f55c2dfadb248a9fb292981c5e6b +Author: Steven G. Johnson +Date: Sun May 22 22:36:04 2005 -0400 + + [empty commit message] + +commit f66bc7b513029ac91ec983bb3279f3c0dec3468c +Author: Steven G. Johnson +Date: Sun May 22 22:35:34 2005 -0400 + + note gcc 3.4.[0123] bug, which is fixed in gcc 3.4.4 + +commit 0f2a7eb61a2bcf44583bd41245ad55c7e78eb70f +Author: Steven G. Johnson +Date: Sun May 22 22:21:26 2005 -0400 + + added automatic detection of icc architecture flag + +commit 7b90a23bc9ceeeb03131b4774aa0ff5d04e91c63 +Author: Steven G. Johnson +Date: Sun May 22 21:47:19 2005 -0400 + + add -no-gcc to icc flags...even if it is Intel's fault, I'm sick of dealing with bug reports about this + +commit ff0439a0bc1dc149d302630cb96062fc7fb053f1 +Author: Steven G. Johnson +Date: Sun May 22 21:40:59 2005 -0400 + + added @cindex portability + +commit e18637fa933a8a75ef831024c4c966d6a2dff76b +Author: Steven G. Johnson +Date: Sun May 22 21:34:10 2005 -0400 + + note --without-gcc-arch + +commit 7131ee53a750ff084f05b97c67e34a39e1a7011c +Author: Steven G. Johnson +Date: Sun May 22 20:54:54 2005 -0400 + + bsd ppc detection; some odd 603 types + +commit 7f439b2ab6289af0e08134c659480f9589b13387 +Author: Steven G. Johnson +Date: Sun May 22 11:53:20 2005 -0400 + + [empty commit message] + +commit 32419ec5a48e285cbcbee2f0a4c49e628fcf6ccb +Author: Steven G. Johnson +Date: Sat May 21 20:34:52 2005 -0400 + + ensure no spaces in cputype + +commit 7a6288d8a7617720cb8c46fc9152a31c7dab793a +Author: Steven G. Johnson +Date: Sat May 21 20:31:41 2005 -0400 + + nevermind + +commit b9bac647b7039e381615e0faac27fc3a8de06eb4 +Author: Steven G. Johnson +Date: Sat May 21 20:30:08 2005 -0400 + + more bsd stuff + +commit f1c985e46f8c17122e47ece0e9696258638be1f1 +Author: Steven G. Johnson +Date: Sat May 21 20:28:40 2005 -0400 + + added BSD cpu detection for SPARC and better super/hypersparc detection + +commit e35c028649be9cc1568401e9e39eb2e19d1cda3b +Author: Steven G. Johnson +Date: Sat May 21 20:22:11 2005 -0400 + + comment + +commit a0582b1056c2562cd639c18f2827fc124dd79fa6 +Author: Steven G. Johnson +Date: Fri May 20 19:40:09 2005 -0400 + + "alternate" == "alternative" is US-centric + +commit 333d9eb5086ed1afa77719e9f24142a8bd5dada9 +Author: Steven G. Johnson +Date: Fri May 20 19:36:26 2005 -0400 + + typo + +commit e2d0b93f5de6abb830a0d28324399d4689850b09 +Author: Steven G. Johnson +Date: Fri May 20 01:28:34 2005 -0400 + + clarification + +commit f8a4a4af8c47ae8e572e5f169c0eeb0720eb7473 +Author: Steven G. Johnson +Date: Tue May 17 18:56:46 2005 -0400 + + print out estimate-planner time from can_do in verbose>2 mode + +commit e1bbc2ce6ff2b094ad3549a5140d6acd0218b7d8 +Author: Steven G. Johnson +Date: Mon May 9 00:47:19 2005 -0400 + + comment + +commit 2e2b68117557549932c89d24586be1852a189462 +Author: Steven G. Johnson +Date: Thu May 5 23:47:55 2005 -0400 + + fixes for building Windows DLLs with Cygwin; thanks in part to Stephane Fillod + +commit bb8fc9fb4dda639b9f0b1f13ef448e39d71a4b39 +Author: Steven G. Johnson +Date: Fri Apr 22 19:47:43 2005 -0400 + + -ffast-math seems to produce code that is either about the same speed or slightly faster (gcc 3.3 and 4.0, x86) + +commit 2f7b1f2707810c171bb85b330c99a94196a257d0 +Author: Steven G. Johnson +Date: Fri Apr 22 19:18:23 2005 -0400 + + power5 fallback to power4 sched for older gcc's + +commit 169cba437dfb6f553bb1a8e2a404ca2bf74a5b56 +Author: Steven G. Johnson +Date: Fri Apr 22 19:14:53 2005 -0400 + + check for power5 + +commit 1978d7cd087b7e6e93133c7b4aa2c612f664203d +Author: Matteo Frigo +Date: Tue Apr 19 21:55:13 2005 -0400 + + Removed clause #3 + +commit 3c385073178a321cc4108d4b88f121276b5d0020 +Author: Steven G. Johnson +Date: Tue Apr 19 21:44:57 2005 -0400 + + license clarification + +commit ab865d9025afbb6c923e94956c3e7ebdd64ef75d +Author: Matteo Frigo +Date: Tue Apr 19 21:42:51 2005 -0400 + + Changed license of fftw3.h to X11. + +commit d851f36c4ff5e1febbc2ed47cb08eba3f8dbaf19 +Author: Steven G. Johnson +Date: Mon Apr 11 13:15:12 2005 -0400 + + delete fixed-input code + +commit cc673385bfc98894c37272241fcb6135756d2c14 +Author: Matteo Frigo +Date: Sun Apr 10 16:33:24 2005 -0400 + + joned L-U-planner branch + +commit d4b2b38d4a6b40919a6229bb574ecd49884ad58f +Author: Steven G. Johnson +Date: Thu Apr 7 23:15:02 2005 -0400 + + ref + +commit 8895af84fb9e4970420b21451977fde49072c2b9 +Author: Steven G. Johnson +Date: Thu Apr 7 00:11:13 2005 -0400 + + whoops + +commit 6dbfe38e27a7f4a5090917f8b53a03e334a40881 +Author: Steven G. Johnson +Date: Wed Apr 6 22:06:21 2005 -0400 + + added (optional) new split-radix algorithm, enabled with -newsplit; also new -standalone option to omit desc; also -unitary, -normalization, and -normsqr options to generate r2r codelets with various normalization (to match lit. in DCT-II, use: -unitary -normsqr 2) + +commit 5e1deadac7dbe4d60d493b86f66b37474388b11e +Author: Matteo Frigo +Date: Fri Mar 25 08:59:43 2005 -0500 + + Moved timeout check outside the search loop, because X(seconds) is + expensive. + +commit 094cbe955f1ad43c143f7781eb524ede71d164bc +Author: Matteo Frigo +Date: Sun Mar 20 18:35:53 2005 -0500 + + Enable vector recursion for in-place problems, otherwise + dftw-genericbuf works only in PATIENT mode. + +commit 14a9b596a784705637abb9cd5a47595ed2a4bcbd +Author: Matteo Frigo +Date: Sun Mar 20 17:53:58 2005 -0500 + + oops + +commit 7ea889cca28101323df5287b988ee6bd96c531a0 +Author: Matteo Frigo +Date: Sun Mar 20 17:49:13 2005 -0500 + + make solver UGLY for small N + +commit a4abcfa708787e3e18b32fc37506992215578c4b +Author: Matteo Frigo +Date: Sun Mar 20 17:16:37 2005 -0500 + + new dftw-genericbuf solver + +commit 70997fbe34952f59b14245e68e5fd4614d13c3ac +Author: Matteo Frigo +Date: Sun Mar 20 16:12:44 2005 -0500 + + new dftw-genericbuf solver + +commit 3d40d10cca6f0fb8ed0e327ae23d569829a43768 +Author: Matteo Frigo +Date: Thu Mar 17 21:48:19 2005 -0500 + + Hmm... what was I thinking? + +commit b27eff441bd1e24148569ed9ee02c05c08b46ea4 +Author: Matteo Frigo +Date: Thu Mar 17 19:20:54 2005 -0500 + + Workaround for a MSVC bug. + +commit 433960d78aef7dc12c5611baa3213b4db99f99cc +Author: Matteo Frigo +Date: Thu Mar 17 08:18:39 2005 -0500 + + Workaround for a MSVC bug that was reported by Eddie Yee. + +commit 0c4f3dfe86c936003eed705208a100c11a5bcce6 +Author: Matteo Frigo +Date: Tue Mar 15 13:25:53 2005 -0500 + + try both contiguous input and contiguous output when in doubt + +commit 155f07c46c6589d374f886a8ed86f985a64642e3 +Author: Matteo Frigo +Date: Tue Mar 15 08:44:41 2005 -0500 + + Added genfft flag -precompute-twiddles which moves the computation of + the twiddle factors before the main schedule. This flag produces + smaller code everywhere, and slightly faster code on powerpc. + I observe no speed difference on x86. + +commit 5cc6165f9756f2faeab137eed5f8c25ebac08773 +Author: Steven G. Johnson +Date: Mon Mar 14 21:43:53 2005 -0500 + + sp + +commit 255c6db9915f31c3b323cee61a7900999c7b4cfe +Author: Steven G. Johnson +Date: Mon Mar 14 21:43:05 2005 -0500 + + whoops, spelling error (thanks to Steve Eddins for bug report) + +commit 556965536b7671795bc6e4ef86edfffe75b2ffd9 +Author: Matteo Frigo +Date: Sat Mar 12 15:03:47 2005 -0500 + + Do not approximate pcost = vl * child->pcost unless child is guaranteed + not to be a simple codelet. + +commit a5282a50ce6211585a443fa099e2fa6e47450ceb +Author: Matteo Frigo +Date: Wed Mar 9 20:00:02 2005 -0500 + + Relaxed applicability conditions. + +commit 2496640b61c0ac594325d4fa68e3729873c004bd +Author: Matteo Frigo +Date: Wed Mar 9 00:05:47 2005 -0500 + + Minor optimization + +commit 81c49148f9fb58b0c541b2636b37bd8422a458b1 +Author: Matteo Frigo +Date: Tue Mar 8 22:14:02 2005 -0500 + + Interpret K to mean *1024. Similarly for M. + +commit b94f2eb04282f6c3c511944e3767a8895a19ef77 +Author: Matteo Frigo +Date: Tue Mar 8 20:44:25 2005 -0500 + + Hmm... somehow some previous commit got lost. + +commit 55b8abdbbc3a2bbb26f005735bd9d121634c4055 +Author: Matteo Frigo +Date: Tue Mar 8 20:30:42 2005 -0500 + + Paranoia + +commit 752db4c71fd1a447d9ed1699ed0382e042d4f89c +Author: Steven G. Johnson +Date: Mon Mar 7 14:30:01 2005 -0500 + + whoops + +commit 6c18ecea25e2a9f685131b49c7365fc35b8c4c7c +Author: Steven G. Johnson +Date: Mon Mar 7 14:29:43 2005 -0500 + + move fftw-specific HP/UX tweak into configure.ac + +commit 3916e3b25257834172ce4eb126a2d745b8943123 +Author: Steven G. Johnson +Date: Mon Mar 7 14:19:24 2005 -0500 + + ax_cc_family -> ax_cc_vendor (vendor names are easier to remember), add checks for many new compilers, use in ax_cc_maxopt + +commit a0ad3ef6add8118e82611c08b4c252ec8346efea +Author: Matteo Frigo +Date: Sun Mar 6 21:36:05 2005 -0500 + + Count FMA as one flop in estimator when HAVE_FMA + +commit 10a57b3a5a428bab777ec22f4eb83203498a743a +Author: Matteo Frigo +Date: Sun Mar 6 19:16:06 2005 -0500 + + Do not try radix-2 generic. + +commit e38ef2e30e6f41fb2301acf208ff7f9b775de0ac +Author: Matteo Frigo +Date: Sun Mar 6 13:04:23 2005 -0500 + + Use -O3 for xlc now that we use -O for CODELET_OPTIM + +commit be3c47c96bcc1ef146a296202b53db7a457b3230 +Author: Matteo Frigo +Date: Sun Mar 6 13:02:41 2005 -0500 + + New AX_CC_FAMILY macro, that detects the compiler based on symbols + that it defines (as opposed to the name of the compiler). + We need to start use this strategy everywhere else. + +commit 562882d5c889b0bce256013a056ce07f55c27dfb +Author: Matteo Frigo +Date: Sun Mar 6 11:33:15 2005 -0500 + + Runtime checks to guarantee small strides. + +commit 1fcf24126783752b3ab8f35f480a0e5d0fa90aab +Author: Matteo Frigo +Date: Sat Mar 5 20:09:25 2005 -0500 + + Reduced the search space for rank-0 transforms + +commit 77cbffe7c30bbac4d294cd2c7321163054732418 +Author: Steven G. Johnson +Date: Fri Mar 4 17:50:29 2005 -0500 + + little assert + +commit 495b9d7617c0167346817c4d5620fe80ee2d1194 +Author: Matteo Frigo +Date: Tue Mar 1 09:19:16 2005 -0500 + + Implemented directbuf, enabled for now. + +commit 1869b027f29cef23f101026dee512744fba87eaa +Author: Matteo Frigo +Date: Mon Feb 28 22:21:14 2005 -0500 + + Unified dftw-direct, dftw-directbuf in an attempt to tame code + growth + +commit 82fce69cd912d2a58b86a5699c04d2eea3b9a536 +Author: Steven G. Johnson +Date: Sun Feb 27 13:51:24 2005 -0500 + + fixed copyright + +commit 7d1a5530230d76d105f3ed4aeebdf4f708ed0e8a +Author: Matteo Frigo +Date: Sat Feb 26 22:21:03 2005 -0500 + + silence warnings + +commit 753ab3b636f099eedb841e643898aed3e8c5c817 +Author: Matteo Frigo +Date: Sat Feb 26 22:19:16 2005 -0500 + + oops + +commit a64fecb2ccd2670c6b37d40d70558d553e4cb17d +Author: Matteo Frigo +Date: Sat Feb 26 21:28:39 2005 -0500 + + Tweaking while thinking about a higher-rank transposer (bitreverser) + +commit 9c7a7d3c45be7ca132fdece876ebea7eb053fad7 +Author: Matteo Frigo +Date: Sat Feb 26 20:06:49 2005 -0500 + + Transposed the buffer, and skewed it. This allows for contiguous + copy operations, and the codelet should not incur associativity + conflicts if the buffer is large. + +commit 521fa92ebcf99b32b35cb4c26b304f42a2812e22 +Author: Steven G. Johnson +Date: Sat Feb 26 18:14:11 2005 -0500 + + make tensor_max_index more reasonable (take maximum of input and output + max indices, computed separately) + +commit c6c2bcbb2b8c8f3b1da7d5465e4bee93905c8d32 +Author: Matteo Frigo +Date: Sat Feb 26 10:04:30 2005 -0500 + + Use cpy2d instead of cpy2d_tiled, because vl may be too large. + +commit 269e71f3db6c3d1bcf8dc77e25983dcc9989d5f7 +Author: Matteo Frigo +Date: Sat Feb 26 00:31:52 2005 -0500 + + Fixed old bug that was introduced with yesterday's changes. + +commit e769a1735dd71165677025498471db8a41271198 +Author: Matteo Frigo +Date: Fri Feb 25 21:54:23 2005 -0500 + + ``Interesting'' switch statement. + +commit 7e729390b41355c7abf6c2a3901dec6cb40c4c23 +Author: Matteo Frigo +Date: Fri Feb 25 12:29:54 2005 -0500 + + Disabled -reorder-loads -reorder-stores, since they seem to do + nothing. + +commit 4350026ea3252e1dbc25b1539941ee79b3cb6124 +Author: Steven G. Johnson +Date: Fri Feb 25 12:19:10 2005 -0500 + + Because of the recent changes to kernel/pickdim.c, splitrnk=0 is no + longer equivalent to splitrnk=1 for rnk < 4, where the latter is the + FFTW2 behavior. For small rnk, however, I observe the planner to pretty + consistently choose the FFTW2 behavior (splitrnk=1), despite its not + being asymptotically optimal in the cache oblivious sense. So, make + splitrnk=1 instead of splitrnk=0 the default in FFTW_MEASURE and + FFTW_ESTIMATE modes (rnk > 3 is pretty rare in practice anyway). + +commit 3bfeb642d11098a707ca70b7332077b6472917d6 +Author: Steven G. Johnson +Date: Fri Feb 25 00:33:27 2005 -0500 + + tweak + +commit 24560b26faac0a352c23e15c892c38a762bbb453 +Author: Steven G. Johnson +Date: Fri Feb 25 00:29:09 2005 -0500 + + slight relaxation + +commit cadf7b9d5561d14d8042ad3b051f7f95a010cb1f +Author: Steven G. Johnson +Date: Fri Feb 25 00:21:00 2005 -0500 + + cruft + +commit 42d46a1c8af18b951c978ee2cf1cc57ca106929f +Author: Steven G. Johnson +Date: Fri Feb 25 00:03:14 2005 -0500 + + added experimental indirect-transpose solver: when transforming the columns of the matrix, allow us to do a transpose to make the DFTs contiguous + +commit eec7f69ff78e1b95f1bdd09a2f96b3be5cf1b407 +Author: Steven G. Johnson +Date: Thu Feb 24 23:04:58 2005 -0500 + + check for abort() + +commit e1d0f900a4e4444b4ef0fa230de11da87a48a192 +Author: Steven G. Johnson +Date: Thu Feb 24 23:04:43 2005 -0500 + + call abort() on failed assertion + +commit 4d8aee345fa2da4b2383722a482d245d38288dad +Author: Matteo Frigo +Date: Thu Feb 24 21:17:23 2005 -0500 + + Forgot to change X(isqrt) -> isqrt_maybe + +commit 47e79fca2a795dcd96ecf59852cdc53bc883f9d1 +Author: Steven G. Johnson +Date: Thu Feb 24 20:18:59 2005 -0500 + + require finite_rnk + +commit 7e29047649fc202d7061c007ce3ba8a3962ed38c +Author: Steven G. Johnson +Date: Thu Feb 24 20:07:38 2005 -0500 + + #ifdef HAVE_STRING_H must come after rdft.h so that we get config.h + +commit d0b93533d99e69f85e2aaf759989f652311206ac +Author: Matteo Frigo +Date: Thu Feb 24 18:59:40 2005 -0500 + + Implemented reordering of loads and stores so that the real and + imaginary part are loaded/stored together. This should improve + out-of-cache performance in the presence of associativity conflicts, + and maybe worsen in-cache performance because of worse scheduling. + Enabled for now, for experimental purposes. + +commit 827ad1c139031037135765c5600dcf05b58030e4 +Author: Steven G. Johnson +Date: Thu Feb 24 18:10:49 2005 -0500 + + fix comment + +commit 35e5d61fd3b5f769ea631e357ac6f55002f74f96 +Author: Steven G. Johnson +Date: Thu Feb 24 18:10:23 2005 -0500 + + better message + +commit d2c6d9c9d37a6ea058c48c7445fbaca7089a6489 +Author: Steven G. Johnson +Date: Thu Feb 24 18:08:36 2005 -0500 + + use gcc version > 3.0 as fallback in check for alignment bug + +commit 9efbf189a95137e78b39f48e223e66df384eb89c +Author: Steven G. Johnson +Date: Thu Feb 24 18:02:31 2005 -0500 + + don't use -malign-double unconditionally (it is only available on x86) + +commit 858b560880b60856698a28728dd44964d456b7cf +Author: Matteo Frigo +Date: Thu Feb 24 12:03:30 2005 -0500 + + Subtler selection of tilesz. + +commit c44a6cff160e0ecd38f2a4f56bff4e34ddda2b59 +Author: Matteo Frigo +Date: Thu Feb 24 11:52:25 2005 -0500 + + Call cpy2d_tiledbuf, not cpy2d_tiled. + +commit 826a2387489dd9efde0ed09afc92e91e50a6d578 +Author: Matteo Frigo +Date: Thu Feb 24 11:29:28 2005 -0500 + + buffer sizes were wrong :-( + +commit fdabdfc4ef5010ed7965168b1ab583c296db3637 +Author: Matteo Frigo +Date: Thu Feb 24 11:19:01 2005 -0500 + + Single function for computing tile size. Eliminate spurious assertions. + +commit add19c2d3c32f843ff951cc227dc4ce1221fafb6 +Author: Matteo Frigo +Date: Thu Feb 24 10:00:02 2005 -0500 + + Do tiling recursively. + +commit 203fc5647fea6fe99f2d23cc43a24eeea47aee49 +Author: Matteo Frigo +Date: Thu Feb 24 09:40:30 2005 -0500 + + Reworked tiled transposes; provide tiling with and without buffering. + I can't believe that one has to waste his life with this @#$%. + +commit c92a1fc69c9315d97f71a3070003d37923ac02b8 +Author: Matteo Frigo +Date: Wed Feb 23 22:21:19 2005 -0500 + + Clarified logic. I am not sure why the code was so confusing to begin + with. The computation of *dp in the which_dim == 0 case was also + wrong, returning e.g. *dp == -1 if sz->rnk == 1. + +commit 44692fa46d7313f08a624ec68bd421e282fa139f +Author: Matteo Frigo +Date: Wed Feb 23 22:00:15 2005 -0500 + + Enable aggressive inlining in codelets only, to avoid code bloat. + +commit e94240f1731b33ff9ad18ffe4c14a08a7d66d65a +Author: Matteo Frigo +Date: Wed Feb 23 21:51:50 2005 -0500 + + Removed cache-oblivious copy/transpose algorithms in favor of + explicitly blocked algorithms. The cache-oblivious algorithms fail if + there are associativity conflicts, in which case buffering is + necessary, as per Carter and Gatlin. Once you set the buffer size, + there is no point whatsoever to do the algorithm recursively, and you + may as well use blocking. + +commit 77aeedee308c8b7bce0ff4c36986f715ced6748c +Author: Steven G. Johnson +Date: Wed Feb 23 18:46:12 2005 -0500 + + --disable-fortran now differs from --enable-fortran that fails + +commit 3cb3e167e76d53336c1307cecb6b1eb975bdda61 +Author: Steven G. Johnson +Date: Wed Feb 23 18:42:21 2005 -0500 + + comment tweak + +commit e0f881c48bd199f098eaa764fb17982cf1435475 +Author: Steven G. Johnson +Date: Wed Feb 23 18:41:14 2005 -0500 + + If a Fortran compiler was not detected, just make our best guess at + what wrappers to use...I'm sick of dealing with user complaints from + cases where wrapper detection fails for whatever reason. + +commit aa2c11cd3b47c6352d13b8f869f858082bb7a52a +Author: Steven G. Johnson +Date: Wed Feb 23 18:10:40 2005 -0500 + + fflush(stdout) after print_plan, in case F77 doesn't + +commit 76bdaf349e332587c7b5b4ae1fe55f4d3c0cc92d +Author: Matteo Frigo +Date: Tue Feb 22 22:54:42 2005 -0500 + + --enable-sse is necessary after all, to generate all dependencies + correctly. + +commit 5844ac653fc5e937e4f2939d8a73dcc282657fd2 +Author: Matteo Frigo +Date: Tue Feb 22 22:32:06 2005 -0500 + + Put cpy2d_pair into its own file, so that I can experiment with + buffering of nontwiddle codelets. + +commit e7d485c4f71be2a762c91d4d7e96a321afdfe858 +Author: Matteo Frigo +Date: Tue Feb 22 20:07:11 2005 -0500 + + Copy rfftwnd.png from ${srcdir}, not $PWD + +commit 0c56019ec6dc8f3c778b628a8a0b6094cd8a31d0 +Author: Matteo Frigo +Date: Tue Feb 22 17:08:48 2005 -0500 + + Do not bother memcpy-ing complex numbers. + +commit 6accb53a30744a5793b451670a70afb371cceeff +Author: Matteo Frigo +Date: Tue Feb 22 16:20:46 2005 -0500 + + Tighther layout of buffers. I am not sure it matters, but just in case... + +commit 0f5938fa6bcc89ad947656aa949a89feb73b7c77 +Author: Matteo Frigo +Date: Tue Feb 22 10:13:02 2005 -0500 + + Usec cpy1d for rank-0 copies + +commit 24a0b716253a1914882d738969bc8b101b70380f +Author: Matteo Frigo +Date: Tue Feb 22 10:06:13 2005 -0500 + + Implemented in-place transposes with buffering. Moved + copy/transposition routines into own files, so that we can reuse them + from multiple places. TODO: merge vrank3-transpose.c with rank0.c, or + rename vrank3-transpose.c to rank0-fancy.c or something like that; + decide whether square in-place transposes should be in rank0.c or + vrank3-transpose.c; apply FIXME's in vrank3-transpose.c. + +commit 52f669f4280a8ad0834f201919290dc382898a4c +Author: Matteo Frigo +Date: Mon Feb 21 23:29:52 2005 -0500 + + Indentation should be printed after newline, not at the beginning + of print() + +commit decdf03722050f50fba24b8152927c2327109e16 +Author: Matteo Frigo +Date: Mon Feb 21 10:07:24 2005 -0500 + + generalized in anticipation of more complicated solvers. + +commit 2a7b91a46dd814576f0dbfa54f17d38380bd35f0 +Author: Matteo Frigo +Date: Sun Feb 20 22:18:59 2005 -0500 + + Implemented buffered recursive transpose + +commit 4ce9d94def9d52633bb76b107aba65caa8c4fcf4 +Author: Matteo Frigo +Date: Sun Feb 20 18:27:29 2005 -0500 + + Fixed comment + +commit ac7a99027ee51e48f6be6dadcf00eb593d6017d9 +Author: Matteo Frigo +Date: Sun Feb 20 18:22:15 2005 -0500 + + grand unification of rank0 solvers + +commit 20af4f6724d7080f17a83aae996a6fd00e08ae7b +Author: Matteo Frigo +Date: Sun Feb 20 15:35:24 2005 -0500 + + manual tail-recursion optimization + +commit e834b974175d946c82b66c99c7bf18593f85cd8c +Author: Matteo Frigo +Date: Sat Feb 19 17:57:44 2005 -0500 + + implemented check for transpositions + +commit 6f6c5d224ae74b757b7013102ab25c018d7f9a30 +Author: Matteo Frigo +Date: Sat Feb 19 17:28:43 2005 -0500 + + Previous fix was wrong for rdft2 problems. + +commit 6bd660a504ef0345ea0f55db133690f9de7218ec +Author: Matteo Frigo +Date: Sat Feb 19 17:23:36 2005 -0500 + + vecsz->rnk must be finite for this solver to apply. + +commit 05d2a86385b2655cca135d882688ff493eccaa22 +Author: Matteo Frigo +Date: Sat Feb 19 17:15:19 2005 -0500 + + unified the various simple'' transposers + +commit e67ffc01608a1ebeedd99bb1390ff0ad58e33c0c +Author: Matteo Frigo +Date: Sat Feb 19 16:55:29 2005 -0500 + + Fixed stupid bug in rec_transpose_swap. Fixed stupid verifier that did not catch the bug. + +commit 49f3542f8f1ee7aa2bc7ddb12ded96d4b330b452 +Author: Matteo Frigo +Date: Sat Feb 19 15:24:03 2005 -0500 + + Minor cleanup of transposition routines. + +commit 770952578791d8ac1394ba8e19890fce2779ad67 +Author: Matteo Frigo +Date: Sat Feb 19 09:31:14 2005 -0500 + + Make the batch size B=Theta(r) instead of B=Theta(1) in buffered + twiddle solvers. Theory: for cache line size L, we want B = Omega(L) + to utilize the cache line fully. We also want B*r =O(Z), where Z is + the size of the cache. It is safe to assume that Z = Theta(L^2): + cache designers will tend to make L as large as they can get away + with, because they don't have to program the machines that they build, + and Z < Theta(L^2) will screw up the little matrix transposition + benchmarks that they use to design the cache. Hence, B=Theta(r) is + the right number. + +commit 0fc1650f8f411bc3fd1b6019b33d8e67d54b43a3 +Author: Steven G. Johnson +Date: Fri Feb 18 23:47:22 2005 -0500 + + for --enable-portable-binary, only try -mcpu=$arch and -m$arch on x86, + since these generate non-portable code on every other target (and + some other targets, like Alpha, don't support -mtune=$arch). + +commit 77be37a9825edf45432db688f9b6e307fc779320 +Author: Matteo Frigo +Date: Thu Feb 17 21:15:42 2005 -0500 + + gcc/aix defines _POWER, not __powerpc__ like the rest of the world + does. + +commit da4852a84de13f2ed74462052a1081a8517fac9c +Author: Matteo Frigo +Date: Wed Feb 16 22:30:27 2005 -0500 + + enable fma for ia64, since it seems to help with the hpux compiler. + +commit e9b2b83177aabb8ff8d42f4b239e9eda1fbd10bf +Author: Matteo Frigo +Date: Wed Feb 16 21:47:48 2005 -0500 + + [empty commit message] + +commit 9f01f364832d025554f5912bd4f71c3c0b972d5c +Author: Matteo Frigo +Date: Wed Feb 16 15:27:18 2005 -0500 + + Fixes for darwin + +commit ff3f2d0d66afc832a1ec7f70d14e6d1520e40858 +Author: Matteo Frigo +Date: Wed Feb 16 14:27:42 2005 -0500 + + Made the correctness of the code more obvious. + +commit 0eaea796c7d8dfc833c38cc2485c68004bcb9d4c +Author: Steven G. Johnson +Date: Wed Feb 16 12:30:29 2005 -0500 + + s/with-portable-binary/enable-portable-binary/ to be GNUlly correct; I'm sticking with --with-gcc-arch=arch, however, as --enable-gcc-arch=arch has the wrong connotations for me + +commit 1f54539fae28f217a239c3dbc5c66a31784dbcd9 +Author: Steven G. Johnson +Date: Wed Feb 16 11:44:48 2005 -0500 + + whoops + +commit 743d6f8aa35cf29485b805e657e72afb83e401cf +Author: Steven G. Johnson +Date: Wed Feb 16 11:23:38 2005 -0500 + + bless wisdom with patience used to create it + +commit 741a55c0cb7529ae5ce8b1b3a01375a3f176a5e0 +Author: Steven G. Johnson +Date: Wed Feb 16 11:18:56 2005 -0500 + + whoops + +commit ab2c1f6788b6309abe08b585fa21ac7254e02f07 +Author: Steven G. Johnson +Date: Wed Feb 16 10:50:28 2005 -0500 + + whoops + +commit aa37add40de415143b25c5c3fa09d3d212af9ec2 +Author: Steven G. Johnson +Date: Tue Feb 15 23:53:53 2005 -0500 + + added 'timed' planner option + +commit 79f70936e6e19cb09dafb45f8ead8d9fff715111 +Author: Matteo Frigo +Date: Tue Feb 15 23:08:29 2005 -0500 + + Do not use SIMD_CFLAGS. The theory is that if taint.c is unsafe + with SIMD_CFLAGS, then all files in this directory are as well. + Conversely, if these files require SIMD_CFLAGS because they include + "simd.h", then taint.c requires SIMD_CFLAGS as well, and thus we need + some other hack. + +commit f9e6da507bcacf5aa503ce42e7cd73c0c501cbe2 +Author: Matteo Frigo +Date: Tue Feb 15 22:49:05 2005 -0500 + + Do not override CFLAGS in Makefile.am. + +commit 932e8f656a8a592700a3ca153c416e3e1504d278 +Author: Matteo Frigo +Date: Tue Feb 15 10:30:12 2005 -0500 + + Allow users to build long double version even if sizeof(long double) + == sizeof(double) + +commit b35d88cdc10b06342c2c39a8d2012a71875aecf6 +Author: Matteo Frigo +Date: Mon Feb 14 19:55:38 2005 -0500 + + Updated for 3.1 + +commit 3c20661d7ca87a19ec855d94791bd24a3202e30d +Author: Matteo Frigo +Date: Mon Feb 14 19:07:14 2005 -0500 + + Oops, version.h is no longer used + +commit 485e6dbbea69f8e6438ec11fdb265cbe3b786464 +Author: Matteo Frigo +Date: Mon Feb 14 18:51:05 2005 -0500 + + unified fma and non-fma versions + +commit 800ea93e6f610aa9a7c15f1e9e7ed779dedefcfa +Author: Matteo Frigo +Date: Mon Feb 14 14:12:09 2005 -0500 + + forgot to remove inplace/Makefile from configure.ac + +commit 48bfe71f273d592eb0010911c4df16e12df1b9b4 +Author: Matteo Frigo +Date: Mon Feb 14 12:08:52 2005 -0500 + + Merged dft/codelets/inplace with the main dft/codelets/standard + directory. This step makes dft codelets consistent with the rest + of the naming conventions, and will simplify the eventual merge + of fma and non-fma codelets. + +commit 1f70ee8f508d17b3cb0b694d838c71d4b411d740 +Author: Matteo Frigo +Date: Mon Feb 14 11:16:15 2005 -0500 + + inline altivec constants, since gcc seems to generate better code this way. + +commit 454930e2baceefbda8523cfbc103db0061604799 +Author: Matteo Frigo +Date: Sun Feb 13 18:17:32 2005 -0500 + + group altivec constants into a single array, for faster access + +commit 6cfc3df81b5b843ac0641d7aff61b76d29f82a63 +Author: Matteo Frigo +Date: Sun Feb 13 18:15:37 2005 -0500 + + code cleanup + +commit e8d683e0260b327eeedec8e25249bfd8c81cdda9 +Author: Matteo Frigo +Date: Sun Feb 13 10:29:32 2005 -0500 + + removed some unused stuff + +commit d495f6e14d219a63d1ed2a3e77e2c526e185a82c +Author: Matteo Frigo +Date: Sat Feb 12 22:04:40 2005 -0500 + + New twiddle scheme for altivec, 3dnow + +commit 510cdba23c47b1838f8a027da5680ad9ff21dcf3 +Author: Matteo Frigo +Date: Sat Feb 12 20:17:35 2005 -0500 + + Implemented new twiddle scheme for sse2 + +commit fd74e1eb06f6460dc3f0d8b6c5504fc005f98806 +Author: Matteo Frigo +Date: Sat Feb 12 19:57:46 2005 -0500 + + Implemented experimental t2* codelets, which store twiddle factors + in a more convenient format, at the expense of twice the storage. + Currently only SSE works; I have to port SSE2, altivec, etc. to the + new scheme. After this, we will decide whether these codelets + are worth the price. + +commit 9ba2ad18ff0a5c9a683120d7737cc6d343b83246 +Author: Matteo Frigo +Date: Fri Feb 11 08:07:12 2005 -0500 + + Forgot to define SIMD_STRIDE_OKPAIR + +commit 24aa1c39dc04c158a5275310b779bec639962a38 +Author: Matteo Frigo +Date: Thu Feb 10 22:20:00 2005 -0500 + + fixed sse2, 3dnow, and altivec, as promised + +commit fa8ee16c80d02c0a0a19391f9aa5897b37ac004b +Author: Matteo Frigo +Date: Thu Feb 10 21:47:40 2005 -0500 + + Generate n2?v_* codelets in such a way that we may or may not + pair stores, depending on which mode happens to work best on + a particular SIMD implementation. sse2, 3dnow, and altivec + are currently broken---will fix soon. + +commit 8a141e0f8570683466ef4cf2aa4e8027d7ea698e +Author: Matteo Frigo +Date: Thu Feb 10 08:53:22 2005 -0500 + + instantiate altivec constants only once + +commit b23eef5ad62b650caafba583fae089d173718eac +Author: Matteo Frigo +Date: Thu Feb 10 06:37:56 2005 -0500 + + Fixed alignment checks for new SIMD scheme + +commit bf8b613b6a4299e8fcc3b36c1c0ec6c61ae944d6 +Author: Matteo Frigo +Date: Wed Feb 9 21:35:01 2005 -0500 + + Change n2?v_* codelets to store pairs of vectors, with implicit + 2x2 transposition. Works for 2-way SIMD as well. Tested with sse + and sse2. I haven't tried altivec yet, but I observed a huge + speedup when I transformed one codelet by hand. + +commit b45f5e7af8fe63c291238eded48cff440ad1f4b9 +Author: Matteo Frigo +Date: Tue Feb 8 21:28:38 2005 -0500 + + Resurrected old DIF codelets for experimental purposes. They + are disabled for now, but I am keeping the setup around for + future reference. + +commit 2b2271e7df0c994e8ed02a49304a2ef279c084d2 +Author: Steven G. Johnson +Date: Tue Feb 8 20:10:19 2005 -0500 + + [empty commit message] + +commit c06695785e699d90aab66ce15e718ccab31f42bc +Author: Steven G. Johnson +Date: Tue Feb 8 19:37:09 2005 -0500 + + clarifications, document --with-portable-binary and --with-gcc-arch + +commit 4658829ef2505ec43aab6986fdc4778314c3e0bf +Author: Steven G. Johnson +Date: Tue Feb 8 19:23:41 2005 -0500 + + [empty commit message] + +commit 44be70997db3875b83dfe5dee436014717bdf235 +Author: Steven G. Johnson +Date: Tue Feb 8 01:36:22 2005 -0500 + + more change comments + +commit b7802bbb738b279d8d061756f90f03caecd0767a +Author: Steven G. Johnson +Date: Tue Feb 8 00:41:38 2005 -0500 + + fma is definitely beneficial on Itanium with the HP/UX compiler + +commit 95f76ca2081a043388616e815c0364bc6ffde166 +Author: Matteo Frigo +Date: Mon Feb 7 22:58:47 2005 -0500 + + Silence warnings. + +commit fe63ebfa96d081c7d45183e96a8d904d3dcfd226 +Author: Steven G. Johnson +Date: Mon Feb 7 22:55:49 2005 -0500 + + when we compile our own getopt, change symbol names to avoid conflicts (e.g. avoid build failure on MacOS X with --enable-shared) + +commit 151717343ac9ebd9197dfa0065de4176fa9d0894 +Author: Steven G. Johnson +Date: Mon Feb 7 22:36:42 2005 -0500 + + grr, more bugfixes for in-place case + +commit ca853db7099972e3b3840be7d1d3ee1abff00d04 +Author: Matteo Frigo +Date: Mon Feb 7 22:29:35 2005 -0500 + + removed relics of FRANZ mode + +commit b5015c430276d969565a9b6fe816a55556f8d6f7 +Author: Matteo Frigo +Date: Mon Feb 7 18:48:36 2005 -0500 + + Somehow xlc does not like ``vector int dummy;'' + +commit e8ba7b5c1885c85755dd33973ec8d2c5305f41e9 +Author: Matteo Frigo +Date: Mon Feb 7 13:59:47 2005 -0500 + + There is no need to enable sse to make the distribution. This might + have been true in the past but not anymore. + +commit fea3ce788e0bd8cfd350e05d05c418e90b27ec63 +Author: Matteo Frigo +Date: Mon Feb 7 13:55:17 2005 -0500 + + Oops---included fortran file in C sources + +commit 2f4c935bb52c2e34940f4ad58ea6fd26ba30740f +Author: Matteo Frigo +Date: Mon Feb 7 13:42:45 2005 -0500 + + Set version string at ``make dist'' time, not at ``configure'' time, + so we know whether a user is using the fma version or not. + +commit fcd17cfa8271300c8a41d87c9abd4968502ebaca +Author: Matteo Frigo +Date: Sun Feb 6 17:00:33 2005 -0500 + + Removed useless files + +commit 2707963bd735e791f7f5b8200c8c9d4f155bc4f8 +Author: Matteo Frigo +Date: Sun Feb 6 16:59:39 2005 -0500 + + Different (simpler?) way to prevent the compiler from optimizing loop + inductive variables. We now explicitly corrupt stride variables by + xor-ing them with another variable that happens to be zero (but the + compiler does not know it). In this way, the compiler does not + attempt to extract a zillion loop indices from codelets, which would + overflow the register set. Set the -fno-loop-optimize flag to further + help the process. + + Consequences: removed m* codelets. Smaller library size. Slightly + faster code with gcc/powerpc (including altivec). Much faster code + with xlc/powerpc. No changes for gcc/pentium. Maybe slightly faster + with icc/pentium. + +commit 1e222893c8c84f35b16a63384ad1239e471ce684 +Author: Steven G. Johnson +Date: Sat Feb 5 18:51:08 2005 -0500 + + paranoia about in-place rodft00 plans + +commit 1d442744933c7161e86dd825d65aeb3d0c640e53 +Author: Steven G. Johnson +Date: Sat Feb 5 18:39:55 2005 -0500 + + don't believe pcost when using the estimator...there is no point, and + it screws up estimator hacks to prefer in-codelet loops to vecloops + +commit 9ad39d1cad4ef56e0c29fc64a12a76e2e6195c52 +Author: Matteo Frigo +Date: Sat Feb 5 18:34:25 2005 -0500 + + Reduced optimization level from -O3 to -O for xlc, since -O generates + faster code. + +commit 91fa9ff722538be49b29c22a3174cef3fdce9c25 +Author: Steven G. Johnson +Date: Sat Feb 5 16:26:58 2005 -0500 + + whoops, only applicable to redft00/rodft00 plans + +commit 6591b1e69eec3c3d11199ec3f84c341aa8e754db +Author: Steven G. Johnson +Date: Sat Feb 5 16:22:39 2005 -0500 + + fixed in-place operation, and don't create size-0 sub-plans + +commit f01834e572803db476083af9b0a0906b951ac9d0 +Author: Matteo Frigo +Date: Fri Feb 4 11:30:30 2005 -0500 + + Autodetect altivec on linux. This code works with gcc-3.4 and + -maltivec, with or without -mabi=altivec. The code *should* work with + gcc-3.3 without -mabi=altivec. However, disabling -mabi=altivec on + gcc-3.4 produces much worse code (I don't know why). + +commit 2ac42677bbf31c868ad589a378f93887163910c1 +Author: Steven G. Johnson +Date: Fri Jan 28 00:04:58 2005 -0500 + + update reference + +commit 2f3db335dab469a165ed2d9a4f19435371ef9590 +Author: Steven G. Johnson +Date: Thu Jan 27 15:48:28 2005 -0500 + + note that DCT-II/III are often called the'' DCT/DCT + +commit a2480b0a7742cb4792f0a17ef54fcfa47bf9299f +Author: Steven G. Johnson +Date: Fri Jan 21 14:42:04 2005 -0500 + + added MSVC++ for ia64 (based on information at http://www.intel.com/cd/ids/developer/asmo-na/eng/19949.htm?prn=Y) + +commit fa86c1be03f8a3ac77ad8f17a4a0db76b8a08d04 +Author: Steven G. Johnson +Date: Fri Jan 21 14:22:50 2005 -0500 + + vc++ defines _M_AMD64 on x86-64, apparently + +commit 905e261576a2333fdc356609f6f6533740716663 +Author: Steven G. Johnson +Date: Tue Jan 18 22:30:27 2005 -0500 + + avoid gratuitous breakage with -Werror, requested by Simon Perreault + +commit 6fb09d4fad8df9be7c5cadda330234fbcf6bdecd +Author: Steven G. Johnson +Date: Mon Jan 17 18:54:55 2005 -0500 + + comment typo + +commit 2f9aac9cff6654101febb130659eab9345b58783 +Author: Steven G. Johnson +Date: Sat Jan 15 16:56:23 2005 -0500 + + bumped shared-lib revision# + +commit c793a51d3eafa054b132ebbc6095810261ac56b6 +Author: Steven G. Johnson +Date: Sat Jan 15 16:35:42 2005 -0500 + + add X(estimate_cost) to get estimator cost, and print from bench, to aid in tweaking estimator + +commit ef81def3aef05a8e513d2c28f9eba162af22020b +Author: Steven G. Johnson +Date: Sat Jan 15 14:57:56 2005 -0500 + + [empty commit message] + +commit 1b90ee6f155399994c4234601dfdce43c854555e +Author: Steven G. Johnson +Date: Sat Jan 15 12:57:07 2005 -0500 + + formatting fix + +commit 2abab58ebcf1286120285091b31ff706fa81cf81 +Author: Steven G. Johnson +Date: Sat Jan 15 12:31:28 2005 -0500 + + tweaks + +commit 044466122b66a254d87c396cbf0b17039543fd13 +Author: Steven G. Johnson +Date: Sat Jan 15 12:03:24 2005 -0500 + + use less buffer space + +commit 3e78c0361397476b699825b883be3d32331e8439 +Author: Steven G. Johnson +Date: Sat Jan 15 01:41:58 2005 -0500 + + added split-radix-based dct/dst I for odd n + +commit d994d2ded5077bfb54d19ee5c062e607b73ce73a +Author: Steven G. Johnson +Date: Fri Jan 14 21:50:08 2005 -0500 + + [empty commit message] + +commit cf8ef77af5eddfdda0d6c952ae0ae1955890bca4 +Author: Steven G. Johnson +Date: Fri Jan 14 21:49:55 2005 -0500 + + warn silly users who confuse CVS id with FFTW version + +commit e7ab0f25025fb3be5f73408419e51a2fcf54f031 +Author: Steven G. Johnson +Date: Fri Jan 14 16:57:36 2005 -0500 + + get sparc cpu type on solaris as well as with linux + +commit e82ef68d349c8df79cb772c944164b79b7f2c77a +Author: Steven G. Johnson +Date: Thu Jan 13 19:21:58 2005 -0500 + + detect prescott mobile (f37) + +commit 3622c28434b7292df2153c577f8262a2974fd6ce +Author: Steven G. Johnson +Date: Thu Jan 13 18:09:52 2005 -0500 + + use cpuid for x86_64 as well as i[56]86 + +commit ba6d8352bbd435da164d15a693e824711bcd86ce +Author: Steven G. Johnson +Date: Thu Jan 13 17:59:55 2005 -0500 + + update with x86info 1.7 and other sources (identify k8, nocona, etc), handle nonzero leading bytes in eax + +commit 92d9e4b244a2689bc7fb64105d20c874d09f9cca +Author: Steven G. Johnson +Date: Thu Jan 13 16:30:33 2005 -0500 + + compactified check for JOINABLE; use AC_DEFINE_UNQUOTED instead of AC_DEFINE for PTHREAD_CREATE_JOINABLE (thanks to Oliver Niekrenz for the bug report) + +commit 5440f786f094cdfb2b624e1e9050ba74a06ad780 +Author: Matteo Frigo +Date: Wed Jan 12 12:22:13 2005 -0500 + + The scheduler hack was incorrect because it swapped instructions + of the form A = *B and *B = C. Fixed. + +commit 124a19a9d293ffa06f8b50519fc1e53ced2ca1ab +Author: Matteo Frigo +Date: Tue Jan 11 22:13:24 2005 -0500 + + Quote expressions such as ``if test $FOO = yes'' when $FOO may be + empty. Also, $GCC is set to either ``yes'' or empty, never to ``no''. + +commit d52e4f122a2b71ab9272261bfec25931b8d9cd5b +Author: Matteo Frigo +Date: Tue Jan 11 19:30:47 2005 -0500 + + Hmm---somehow the previous commit did not work. + +commit ca5f6331f2b2432591707b129dc343705209e482 +Author: Matteo Frigo +Date: Tue Jan 11 16:54:45 2005 -0500 + + Fixed various gcc-related problems on powerpc: + - gcc-3.4 becomes totally confused by expressions like + vec_add(a, vec_add(b, vec_add(c, ...))) + The compiler uses gigabytes of memory and then crashes, presumably + because of the exponential-time search problem involved in typing the + above expression (since vec_add can take either ints or floats). + I changed VADD and similar macros to be inline functions, thus + constraining the type system. + + - New flags + --param inline-unit-growth=1000 --param large-function-growth=1000 + to work around limitations of the gcc-3.4 inliner. + +commit 43a34b10c3383ccf1277216826b8201c3a0f3276 +Author: Matteo Frigo +Date: Mon Jan 10 21:27:24 2005 -0500 + + Check for HAVE_ALTIVEC_H + +commit 558d64554efbc303c104513b4f6243d2178335a8 +Author: Matteo Frigo +Date: Mon Jan 10 21:09:30 2005 -0500 + + Remove support for altivec using gcc builtins, since these keep + changing across gcc versions. These changes work on gcc-3.4/linux; I + haven't tried MacOS X yet. (The altivec ``spec'' differs between + Motorola/Apple and gcc, grrr...) + +commit d9289c88276c6c878bd61c454049052d420013fa +Author: Matteo Frigo +Date: Mon Jan 10 18:57:30 2005 -0500 + + Stylistic changes + +commit 34b131fad38155ebb215614d02fba749c35c10ed +Author: Matteo Frigo +Date: Mon Jan 10 17:34:41 2005 -0500 + + Changed incorrect ugliness condition. + +commit 79acbd2e7f6820db37155925cdb1411a808b5bb4 +Author: Steven G. Johnson +Date: Mon Jan 10 16:09:43 2005 -0500 + + note x86info version number that was used, to make it easier to update + the cpuid for changes in later versions + +commit 114d644618ae24c93784d908c47981dfbd32719e +Author: Matteo Frigo +Date: Mon Jan 10 15:00:51 2005 -0500 + + Make dft-r2hc non-UGLY for rank-0 problems + +commit 1a81406a03ef105ec8c188ee2f77dd605c25d422 +Author: Matteo Frigo +Date: Mon Jan 10 14:50:23 2005 -0500 + + Do not use -mcpu=970 on power4 processors, because power4 does + not have altivec. + +commit 393ce48d0f58f8f7788198d59fa203e19f36db69 +Author: Matteo Frigo +Date: Mon Jan 10 14:48:47 2005 -0500 + + Note gcc-3.4 problem with inlining. + +commit c25eb53aa1676a746b9243a7463a62e3d753fb0f +Author: Matteo Frigo +Date: Mon Jan 10 13:51:08 2005 -0500 + + Oops, forgot to remove ``static'' from the declaration of noninlinable + functions. + +commit 1447d501267177b4d3f4b5160a7e3b4fc16e7aba +Author: Matteo Frigo +Date: Mon Jan 10 12:31:26 2005 -0500 + + Recognize power4. Use ``head -n COUNT'' instead of obsolete ``head + -COUNT'' (which fails on gentoo). + +commit 3de5bb754f1b9eb2514402c3b542a3735009f223 +Author: Matteo Frigo +Date: Sun Jan 9 22:12:16 2005 -0500 + + Remind to add FAQ entry concerning gcc-3.4.[1-3] crashes. + +commit 669ca8a3c4968477bf695ebc2961279779e0ec37 +Author: Steven G. Johnson +Date: Sun Jan 9 21:53:08 2005 -0500 + + whoops + +commit dcaa702e5c8d172b42b79a0c8ae14a1c8525f0a3 +Author: Steven G. Johnson +Date: Sun Jan 9 21:48:02 2005 -0500 + + support checking for major.minor.patchlevel + +commit 584fa85e1d7ca47d71b72c14f7dab1ac448048ec +Author: Matteo Frigo +Date: Sun Jan 9 21:40:18 2005 -0500 + + Revert CODELET_OPTIM to -O on IA32, which is faster than -O2. + +commit ec5ec6cbc0d0325a26eda54206f7f17253b39bae +Author: Matteo Frigo +Date: Sun Jan 9 20:30:12 2005 -0500 + + /bin/sh allows no spaces in assignments. + +commit 2b5a7ef73ab8bd55c32f63badf3120d1c4a62a28 +Author: Matteo Frigo +Date: Sun Jan 9 20:05:55 2005 -0500 + + Make non-inlinable functions external, so that gcc becomes confused + and does not try to inline them. + +commit 321304bb50c85a0d5353f7bed5116d33b865dc4b +Author: Matteo Frigo +Date: Sun Jan 9 13:44:25 2005 -0500 + + Add -fno-web to CFLAGS, because -fweb destroys FMAs. + +commit 2f4f3044ed140d5b0edf1cf7415e0c0035392b40 +Author: Matteo Frigo +Date: Sun Jan 9 10:31:47 2005 -0500 + + Allow -mcpu=970 besides -mcpu=G5 + +commit e00f75f258a1b31526633b408804ed3c231cef68 +Author: Matteo Frigo +Date: Sun Jan 9 10:26:20 2005 -0500 + + configure was not using -fno-schedule-insns :-( + +commit e86fb1669da7d88ee98278e686d078ed205237c3 +Author: Matteo Frigo +Date: Sun Jan 9 08:52:40 2005 -0500 + + In mkplan() and elsewhere, use solver index instead of solver + *pointer*, which looks marginally clearer. + +commit 446a3894d345237cabc59f659d5a2186c1f26554 +Author: Matteo Frigo +Date: Sun Jan 9 08:15:36 2005 -0500 + + Split planner hash table into two tables, for blessed and unblessed + solutions respectively. Now an unblessed solution never overwrites a + blessed solution, thus avoiding wisdom leakage by construction. + Further, forget() is now a O(1) operation, which speeds up the + estimator when the wisdom table is large. + +commit ee5380a2af1b55803ff5d64557ff5b9a2005b54b +Author: Matteo Frigo +Date: Sat Jan 8 21:19:45 2005 -0500 + + New TODO idea. + +commit 8bf4164bfd1d6aef62dac0e09eb5c5ef712ed8f4 +Author: Matteo Frigo +Date: Thu Jan 6 11:02:29 2005 -0500 + + Split search() into two routines to make the UGLY/NO_UGLY logic + obvious. + +commit 1f170904d9848a43935bbd9a7c95d0249fa39138 +Author: Steven G. Johnson +Date: Fri Dec 17 16:08:54 2004 -0500 + + push/pop 64-bit registers on ia64; thanks to Orion Poplawski for the fix + +commit c53a0b8fa44ee6e63d41cdf2e4eb12589981f43d +Author: Steven G. Johnson +Date: Thu Dec 9 21:41:09 2004 -0500 + + patch from FreeBSD ports - FreeBSD does not have memalign, but its + malloc is 16-byte aligned + +commit 31b763b9455632deddfb6425b630c4ce458b444e +Author: Steven G. Johnson +Date: Tue Nov 23 17:06:47 2004 -0500 + + don't compile taint.c with SIMD_CFLAGS (fixed Debian bug #259612) + +commit 5f505f2c11b292e769afc7de1e1fbb9bb75d1495 +Author: Steven G. Johnson +Date: Thu Nov 18 11:37:32 2004 -0500 + + revert incorrect change -- codlist.c should be rebuilt, but it is built in the build directory and not in the source directory + +commit 247e871cccf86dee2fa5543473c76373e5c46b34 +Author: Steven G. Johnson +Date: Wed Nov 17 22:53:53 2004 -0500 + + $(CODLIST) should be rebuilt only if Makefile.am changes, or + alternatively only in maintainer mode, to prevent stomping in the + source directory during user builds. (Thanks to Grant Cook for the + bug report.) + +commit 7b6e452ba1709033b19a1056184ef5e7865773c3 +Author: Steven G. Johnson +Date: Sat Nov 13 13:43:01 2004 -0500 + + corrected #ifdef for icc/ia64, thanks to Matt Boman + +commit 80176573959dd2f034b41ab5d38c541281a5987a +Author: Steven G. Johnson +Date: Sat Nov 13 13:34:55 2004 -0500 + + spelling correction (Larsen, not Larson) + +commit 4e72b0ba4a2ee4245a1c996aabcea979753ded6e +Author: Steven G. Johnson +Date: Mon Nov 8 22:12:39 2004 -0500 + + use standard withval + +commit 38a050f2474601bd6fc7f1e9faca33e8656f0a63 +Author: Steven G. Johnson +Date: Mon Nov 8 22:09:16 2004 -0500 + + match doc + +commit 8d34c77d933aba00013d63875fb0a8cfdb5c5058 +Author: Steven G. Johnson +Date: Mon Nov 8 22:00:34 2004 -0500 + + formatting + +commit f354a059a0559c7816da1f1bfcbf30fef2965584 +Author: Steven G. Johnson +Date: Mon Nov 8 21:59:33 2004 -0500 + + make sure OPENMP_CFLAGS environment variable is used correctly + +commit caffdb38e0d057c260d21dcd45fee9d04ba48520 +Author: Steven G. Johnson +Date: Mon Nov 8 21:46:50 2004 -0500 + + replace ax_check_cc_flags with more generic ax_check_compiler_flags + +commit bc44b190250c3a55ddc841fdb85623efef8a1d04 +Author: Steven G. Johnson +Date: Mon Nov 8 17:49:42 2004 -0500 + + separate macro for OpenMP test + +commit 7bdd20309c710d7f29cb11cd2a130a2a453252ca +Author: Steven G. Johnson +Date: Fri Nov 5 16:24:22 2004 -0500 + + typo + +commit ba62ab6d94914626b1bb5c4fa59d239a92f5789a +Author: Steven G. Johnson +Date: Fri Oct 29 00:48:13 2004 -0400 + + [empty commit message] + +commit bbe80b4b34e5e86fb09b40b44a0f686b07bbd17b +Author: Steven G. Johnson +Date: Thu Oct 28 00:09:38 2004 -0400 + + better guessing of sparc type on Linux + +commit 93d85f0ab3a391bf35f1eb8c51e0d693736fa416 +Author: Steven G. Johnson +Date: Wed Oct 27 13:44:08 2004 -0400 + + note default + +commit 78065724b3f4e1170788d4d75cc1c1e318663b06 +Author: Steven G. Johnson +Date: Wed Oct 27 13:41:57 2004 -0400 + + tweak + +commit e43858fa862ad22519805870bef8be66593db88c +Author: Steven G. Johnson +Date: Wed Oct 27 13:34:25 2004 -0400 + + comment + +commit af53c27b20c589cc956cc567f7a85d05e5f9996d +Author: Steven G. Johnson +Date: Wed Oct 27 13:31:10 2004 -0400 + + whoops, m4 is EXTRA_DIST, not SUBDIR, since it doesn't have a Makefile + +commit fc7444822d899746b1c4e68cb06847ce95ff12b7 +Author: Steven G. Johnson +Date: Wed Oct 27 13:16:57 2004 -0400 + + silence warnings + +commit be281108e1c825de4313ece30b12fd918273b1a9 +Author: Steven G. Johnson +Date: Wed Oct 27 13:14:22 2004 -0400 + + clean up m4 macros; try to detect correct gcc -march flag on x86; new --with-portable-binary, --with-gcc-arch= flags; use -O2 for codelets with gcc 3.4 to work around bug + +commit 9403174ddea85728f959287755950e43901c2d39 +Author: Steven G. Johnson +Date: Tue Oct 26 16:46:14 2004 -0400 + + rename cexp -> mcexp to avoid conflict with C99 builtin + +commit d581a67939f4d7c95a0b07b3a4952d35e44bb17c +Author: Steven G. Johnson +Date: Mon Oct 25 16:58:23 2004 -0400 + + use basename , w/o args, for compiler-name comparisons; also detect Compaq ccc on alpha-linus + +commit a1d9fccd5bdda57ae410ba0ce15367e987d64f73 +Author: Steven G. Johnson +Date: Sun Oct 24 22:05:10 2004 -0400 + + note recent icc problems + +commit dfddc484065adab609af43ba17821394c23dc5cd +Author: Steven G. Johnson +Date: Sun Oct 24 02:10:12 2004 -0400 + + whoops, disable semaphores again (for now) + +commit a2dad5feeb7e13cc8d93adb55bb59ed0431341be +Author: Steven G. Johnson +Date: Sun Oct 24 02:04:58 2004 -0400 + + POSIX semaphores are *not* the same as SYSV semaphores + +commit 64a5d0fd73897b1f811382dc5238209dfe9672be +Author: Steven G. Johnson +Date: Sun Oct 24 01:18:14 2004 -0400 + + re-implement threaded stuff; dftw now takes parameters to indicate a portion of m loop + +commit 99fecf91b80dfe5aabdd4b3d69cc71639de2c483 +Author: Steven G. Johnson +Date: Thu Oct 21 20:44:51 2004 -0400 + + more C++ notes + +commit 77e885e9ca5d60b2b34f126b21cce95382cafc59 +Author: Steven G. Johnson +Date: Thu Oct 14 09:50:38 2004 -0400 + + note bug report for VC++ 6.0 from Dale Dickerhoof + +commit e5523dbd23cd0d4beff0d5b53ca76a275b7e5b1f +Author: Steven G. Johnson +Date: Fri Oct 1 16:06:59 2004 -0400 + + fmt + +commit 8e9f882720c1fc5f2c7c3b168a8f48608af95057 +Author: Steven G. Johnson +Date: Fri Oct 1 15:59:17 2004 -0400 + + comment typo + +commit 689ac491bc35a2728b1ae0ccc6e1698f84a04f4f +Author: Steven G. Johnson +Date: Fri Oct 1 15:48:09 2004 -0400 + + bug fix -- ishift/oshift only apply to execution of child plan + +commit 6438e86b96980ae10958e4483acf04e80573c1dd +Author: Matteo Frigo +Date: Thu Sep 30 21:12:47 2004 -0400 + + New planner that tries never to lose wisdom. + +commit 28f9e28b2b6d2c7d5969c93cdf3c460f6fd895a2 +Author: Matteo Frigo +Date: Thu Sep 30 13:36:43 2004 -0400 + + Nested comment was triggering a warning. + +commit 7f1f6a5fe5723ce3079588306a98c43289f6df32 +Author: Steven G. Johnson +Date: Fri Sep 10 15:20:07 2004 -0400 + + system "root" under dgjpp is /dev/env/DJDIR, not /dev/env/DJGPP, + according to djgpp's libc.info; patch confirmed with J. M. Guerrero + +commit 354611ae36fd7494d3f90789fa33d6b26febeec2 +Author: Steven G. Johnson +Date: Wed Sep 8 18:50:03 2004 -0400 + + some minor portability fixes for djgpp; thanks to Juan Manuel Guerrero for the patch + +commit 133be56f2adeb3f4ab3c394a03da4254f758eacf +Author: Steven G. Johnson +Date: Thu Aug 19 12:41:23 2004 -0400 + + pointer to tutorial for quick start + +commit 6a23ed45415cae1a9825953e80dc99ceee5d185a +Author: Steven G. Johnson +Date: Thu Aug 19 12:39:50 2004 -0400 + + point users to manual + +commit b759a1ca992dee63a97a67ba2beddde782dba6c7 +Author: Steven G. Johnson +Date: Sat Aug 7 13:42:22 2004 -0400 + + minor typo + +commit 693ed3bc9f47a262b3502ad06b42be41f68ee47f +Author: Steven G. Johnson +Date: Sun Jul 18 18:54:18 2004 -0400 + + use __DECCXX for Compaq cxx, not Linux-specific symbol + +commit df4ddeeaad67144bd7d6f855f690cf06907f1d56 +Author: Steven G. Johnson +Date: Fri Jul 16 13:55:25 2004 -0400 + + patch by John Bowman to make cycle counter work with DEC cxx under Linux + +commit fd9cd11e5b8806245d6b5522fdef29b1626eda0f +Author: Steven G. Johnson +Date: Wed Jun 30 00:45:10 2004 -0400 + + updated pruned FFT discussion, with link to further details on www.fftw.org/pruned.html + +commit 243e4dafca54e62e83d796c176d4af2ce00690b1 +Author: Steven G. Johnson +Date: Mon Jun 14 20:08:27 2004 -0400 + + darwin is based on freebsd + +commit fa86af755d34199fa6ddf2a1e40dbedb9898f5bb +Author: Steven G. Johnson +Date: Thu Jun 3 14:23:41 2004 -0400 + + in --with-windows-f77-mangling, add lowercase + single underscore for Intel compilers, etc. (thanks to David Gomez for the bug report) + +commit 3f13a0eb176fe03d5937ef282b9defa42c258876 +Author: Steven G. Johnson +Date: Wed Apr 7 00:46:07 2004 -0400 + + whoops, extra alignment check + +commit f0e8345ba78e99831a1589192d6fc3b2e1e41e38 +Author: Steven G. Johnson +Date: Wed Apr 7 00:16:49 2004 -0400 + + disable most 2-float-as-double copying, add alignment check in one remaining place + +commit a12d8b846381396d54acbc1748e53cbc0c09baac +Author: Steven G. Johnson +Date: Tue Apr 6 13:49:13 2004 -0400 + + make sure it is clear that real-even/odd refers to symmetry, not size + +commit 920197fd649070eadef659b39572b155a8b0c36c +Author: Steven G. Johnson +Date: Mon Apr 5 20:18:29 2004 -0400 + + optimization + +commit c0d199f22910faaf1f4850900185c161a585f96b +Author: Steven G. Johnson +Date: Fri Apr 2 21:31:00 2004 -0500 + + separate cutoff for ugliness...these cutoffs are still not ideal + +commit e1920963de856b058811b84764d848947cab454f +Author: Steven G. Johnson +Date: Fri Apr 2 21:30:17 2004 -0500 + + transpose.c is gone + +commit a115ba2703fa6d7cfb8e1453904bf94cd9c25b7d +Author: Steven G. Johnson +Date: Fri Apr 2 21:18:27 2004 -0500 + + move all rank0 transforms to rdft + +commit 444b8f48586e952b107d4ee2ad58c56e357e5fbd +Author: Steven G. Johnson +Date: Fri Apr 2 20:35:35 2004 -0500 + + enable fp-moves/us comparison of rank-0 transforms + +commit 2cc4d9f4818fb41d6aa0c1be4224eb25a94b3ac7 +Author: Steven G. Johnson +Date: Thu Apr 1 16:13:22 2004 -0500 + + whoops + +commit b0ee7083fd7d7ff73366c8011fbf43d675380d8c +Author: Steven G. Johnson +Date: Thu Apr 1 15:25:30 2004 -0500 + + whoops + +commit 50854b83979e79e4a0a2f6e90404ca553d0a3d33 +Author: Steven G. Johnson +Date: Wed Mar 31 18:11:02 2004 -0500 + + sort tensor dims by stride absolute values, not strides + +commit 39cd8178427b5a70d5fa503a14c663c6a4f96edf +Author: Steven G. Johnson +Date: Tue Mar 30 20:22:50 2004 -0500 + + [empty commit message] + +commit 9b5e15aa7f7e515b9faa505be708a14d568ceb1b +Author: Steven G. Johnson +Date: Tue Mar 30 19:44:54 2004 -0500 + + added improved transpose algorithm for N x M where |N-M| is small + +commit 2db4ea7db1f587486546e244ea42930e51275806 +Author: Steven G. Johnson +Date: Tue Mar 30 19:41:14 2004 -0500 + + check to make sure SIMD matches precision, and make sure user doesn't select both SSE and SSE2 + +commit 8995d09da3bc5d0fd7daf6f6ad295fccd9e94893 +Author: Matteo Frigo +Date: Sun Mar 28 09:26:38 2004 -0500 + + Implemented hc2hc-generic hc2r. + +commit 581a83475a46b89a73b8a7fb3f2dccb140f72629 +Author: Matteo Frigo +Date: Thu Mar 25 11:19:25 2004 -0500 + + Inverted loop for stride-1 access. + +commit b0d68fa533d26d6bebf433c43c4dfee7b99a3701 +Author: Matteo Frigo +Date: Thu Mar 25 11:18:49 2004 -0500 + + Swapped j <-> k for consistency + +commit dc715359aa2bb496a60ae650612b42f0cdf998dc +Author: Matteo Frigo +Date: Tue Mar 23 12:08:07 2004 -0500 + + Require that R be odd + +commit 36e2199cf602f511e50a4bbc56e472d79c935e8f +Author: Matteo Frigo +Date: Tue Mar 23 11:49:01 2004 -0500 + + Implemented hc2hc-generic (DIT only for now). + +commit bc377e92e0d11be803dc1a3deb60f05a82799f85 +Author: Matteo Frigo +Date: Mon Mar 22 14:43:16 2004 -0500 + + Relax equality of twiddle description, since the `i' field + is not used by TW_FULL or TW_HALF. + +commit ede9d975b188649b84cca9bf24c5f7feab3653c4 +Author: Matteo Frigo +Date: Mon Mar 22 13:22:44 2004 -0500 + + Do not allocate tw_instr's on the stack. Thus, the ``consistency check'' + in twiddle.c becomes wrong. + +commit 19b8fbca72260c622266cd93466267c9dfb57cc3 +Author: Matteo Frigo +Date: Mon Mar 22 13:21:28 2004 -0500 + + Fixed incorrect malloc()/free() logic. + +commit 050be8cad10f411ab6ca025f59e5cffc3f7bf42d +Author: Matteo Frigo +Date: Mon Mar 22 09:04:37 2004 -0500 + + Silence warnings + +commit ae20d94938c08cb65f257fec653a9e3b1961a77b +Author: Matteo Frigo +Date: Mon Mar 22 09:02:55 2004 -0500 + + Separate file for hc2hc common routines + +commit e35b856a11108d5bdf61855976cddd7e8e7a84e9 +Author: Matteo Frigo +Date: Mon Mar 22 08:23:56 2004 -0500 + + (re)Implemented buffered hc2hc. Slight simplification of + twiddle-factors management. + +commit de8ff3b06710f0dda76007150592239d4aa7565c +Author: Matteo Frigo +Date: Sun Mar 21 19:53:05 2004 -0500 + + Incremented libtool revision number before we forget. + +commit 5004b2e13de1b9b8635441bba800e8f6b850900a +Author: Matteo Frigo +Date: Sun Mar 21 19:25:56 2004 -0500 + + Fixed opcnt + +commit af360d8473ebdda79f57a3fa6bd3bbb2b7b041a2 +Author: Matteo Frigo +Date: Sun Mar 21 17:56:15 2004 -0500 + + Renamed files. These solvers are not really cooley-tukey. + +commit c6c735fb857127becb133e21c37544052b985806 +Author: Matteo Frigo +Date: Sun Mar 21 12:38:45 2004 -0500 + + Started moving rdft/ to the new cooley-tukey ontology + +commit 5df5843950df1fb50697f28d983ff0a9b8d5c5b9 +Author: Matteo Frigo +Date: Sun Mar 21 10:59:42 2004 -0500 + + Plans in ct-*.c are subtypes of plan_dftw, not plan_dft + +commit 5a4eb1dc842c864c311f175e9f97dde3f42dba2f +Author: Matteo Frigo +Date: Sun Mar 21 10:38:18 2004 -0500 + + Slight simplification + +commit 23b338208a4b752b307a0c6ff8d03f4e3f3c077f +Author: Matteo Frigo +Date: Sun Mar 21 10:20:06 2004 -0500 + + Minor simplification + +commit 71c684955ce3dfb91065a561e806edc213b2a1ae +Author: Matteo Frigo +Date: Sat Mar 20 08:43:57 2004 -0500 + + Workarounds for icc-8.0 nonsense. + +commit 446cbae42c628ae2ba7e6f63f4771355a10b5e0f +Author: Matteo Frigo +Date: Sun Mar 7 07:56:08 2004 -0500 + + FFTW_FORWARD is not technically an ``option''. + +commit 150af2bf6e6d380dc31ebffdcb79961e64d47f97 +Author: Steven G. Johnson +Date: Tue Feb 24 12:17:06 2004 -0500 + + Alejandro requested that his name be removed from @author + +commit 6948af91f0140722c52246a2b09faaeb7e664d99 +Author: Steven G. Johnson +Date: Mon Feb 23 17:42:56 2004 -0500 + + GNU Pth emulation library check + +commit b28089821d98c117e9688fdb7c65b4bfc0645345 +Author: Steven G. Johnson +Date: Sat Feb 21 17:51:13 2004 -0500 + + calling can-do calls the estimating-planner, which creates wisdom that we don't want ...we should be able to do all of the documented problems, anyway + +commit 262bd966d1d8394d17b2dc1ae7b76446b9300323 +Author: Steven G. Johnson +Date: Sat Feb 21 17:46:06 2004 -0500 + + don't forget_wisdom because of side effects + +commit b5c61a6821de885155d1b960a1d8b50a5464bc3d +Author: Steven G. Johnson +Date: Sat Feb 21 17:42:47 2004 -0500 + + forget wisdom from can_do + +commit 51442d30f17617100834e2fb27cbe7df79b3d61b +Author: Steven G. Johnson +Date: Thu Feb 19 14:11:14 2004 -0500 + + parenthesization + +commit 63bf06148e526cb5c90550fbd7b53a40fc73f2d4 +Author: Matteo Frigo +Date: Fri Feb 13 07:20:31 2004 -0500 + + Split malloc into kernel_malloc and API malloc + +commit 26fb1d12ecc37fda0f9760386b1f59a87e193e01 +Author: Steven G. Johnson +Date: Thu Feb 12 15:42:20 2004 -0500 + + X(malloc) must be extern "C" + +commit bb95c42e188e35ab4f22703978e5da7ba796eaff +Author: Steven G. Johnson +Date: Thu Feb 12 15:41:44 2004 -0500 + + satsify C++ compiler + +commit 5560fa42b5df5500dfd63303262c412f308ceb76 +Author: Steven G. Johnson +Date: Thu Feb 5 20:39:14 2004 -0500 + + with the new flags, fma is definitely beneficial on PA-RISC with HP/UX cc + +commit 795e5b6919fec5bbdf1fb9cff3be1db5f63ddeee +Author: Steven G. Johnson +Date: Thu Feb 5 19:52:17 2004 -0500 + + grr, Ofaster etcetera are not supported under older versions of the compiler. Note that +Ofltacc *disables* fp-reordering optimizations (which are enabled by +Oall). +Optrs_ansi is the older version of the aliasing stuff + +commit db287e0973e7d6ef19261b5a96979dff3b339b9a +Author: Steven G. Johnson +Date: Thu Feb 5 19:26:01 2004 -0500 + + +Otype_safety=ansi on hpux + +commit c98916ab1aa18fd95e8e43584e6eb618015de573 +Author: Steven G. Johnson +Date: Thu Feb 5 19:22:34 2004 -0500 + + just use +Ofaster on hpux (+O3 +Onolimit +Olibcalls +Ofltacc=relaxed -Wl,+mergeseg) + +commit 4e3bf163dca0615df17146ee2e18481d0a20a9e6 +Author: Steven G. Johnson +Date: Fri Jan 30 14:17:15 2004 -0500 + + check for win32 threads for mingw32; thanks to Alessio Massaro + +commit 86652c99050dcc4f52d17974597bdbf56a5998de +Author: Steven G. Johnson +Date: Thu Jan 29 15:23:33 2004 -0500 + + added missing 'static', thanks to Alessio Massaro + +commit 96566e4ddd0a9d00b23ad7c8ad04240cce7bfac1 +Author: Steven G. Johnson +Date: Fri Jan 9 16:36:48 2004 -0500 + + print more like bluestein + +commit 9ce57c8bf150fdf7d8177b0252abd7721d82d28b +Author: Steven G. Johnson +Date: Fri Jan 9 15:45:22 2004 -0500 + + fixed op count for R2HC_ONLY_CONV + +commit 1d28fc43969f2824c21efd2d1f2ce5a365dc0a07 +Author: Steven G. Johnson +Date: Fri Jan 9 15:41:50 2004 -0500 + + include DESTROY_INPUT in buffered flags for in-place...otherwise in-place hc2r uses rdft-dhtcvs diff + +commit bf6f542cb4702cf9d2c9346254cf09f0bce0e032 +Author: Steven G. Johnson +Date: Fri Jan 9 15:41:09 2004 -0500 + + resurrected R2HC_ONLY_CONV option to share plans and save on planning time + +commit 04d01b659718c6e66f9b14ad925fc5c630c7c1e8 +Author: Steven G. Johnson +Date: Fri Jan 9 14:47:00 2004 -0500 + + precompute folding for cyclic convolution + +commit 41947ea5b1fd5203da848d5afe3ecfed87f90d91 +Author: Steven G. Johnson +Date: Wed Jan 7 16:48:39 2004 -0500 + + minor + +commit 766e29f31c88457b71f94bc7607e81a39b445fdd +Author: Steven G. Johnson +Date: Wed Jan 7 16:48:25 2004 -0500 + + note reports of successful compilation on Windows + +commit a3b6ef73f675682810957a7770b13c5ede3c75a3 +Author: Steven G. Johnson +Date: Wed Jan 7 14:16:16 2004 -0500 + + citation year + +commit c6ff6592cd7196994610014cb3da0caafa4354df +Author: Steven G. Johnson +Date: Tue Jan 6 01:07:36 2004 -0500 + + comment + +commit 326cb17c5ee1b2d61f66a81bf90c012128148add +Author: Steven G. Johnson +Date: Tue Jan 6 01:07:08 2004 -0500 + + comment fix + +commit 16c7ff8cc5de0d74ad68a628e80e9ac8ede5e918 +Author: Steven G. Johnson +Date: Tue Jan 6 01:06:57 2004 -0500 + + fixed naming cruft + +commit 3c33d645c75a685c1b95f12be64b272dd01fb621 +Author: Steven G. Johnson +Date: Tue Jan 6 00:56:16 2004 -0500 + + space + +commit daf2625a4becbd9aac13358827eef8bbf2ef115e +Author: Steven G. Johnson +Date: Tue Jan 6 00:55:53 2004 -0500 + + comment + +commit 8bc4eaa51d81346cd07706771fc58bb8767bd428 +Author: Steven G. Johnson +Date: Tue Jan 6 00:54:07 2004 -0500 + + moved assert + +commit 679d41c77182afe28023a32c667fb6771f7df10d +Author: Steven G. Johnson +Date: Tue Jan 6 00:49:16 2004 -0500 + + comment + +commit 0ead6d3532ee317a8e8e99391655c0ef3b13bfd3 +Author: Steven G. Johnson +Date: Tue Jan 6 00:41:06 2004 -0500 + + delete old R2HC_ONLY_CONV hack, now defunct + +commit 4f45958b21e10e4b0ad128e4a36b3b1c456e7a22 +Author: Steven G. Johnson +Date: Tue Jan 6 00:32:58 2004 -0500 + + added padded real rader + +commit 2743f45c6e17d1cc72cce590faa7475c03e8ea74 +Author: Steven G. Johnson +Date: Mon Jan 5 22:56:58 2004 -0500 + + removed unused var + +commit 57cf035f36b08fae46144c4e03a52b3fb7a65f51 +Author: Steven G. Johnson +Date: Mon Jan 5 21:20:29 2004 -0500 + + handle both FFT_SIGN values + +commit 0f0e531863a2392a747c6b540a966b48b77debaa +Author: Matteo Frigo +Date: Fri Jan 2 06:07:51 2004 -0500 + + Oops: d->ros ==> d->ios + +commit 6ce67e298050d47829243bf692910eeef126601f +Author: Matteo Frigo +Date: Fri Jan 2 06:05:10 2004 -0500 + + Oops: d->ris should have been d->iis + +commit 3ddc923840694e141348bb8f48eb6bc9272b607b +Author: Matteo Frigo +Date: Thu Jan 1 16:00:07 2004 -0500 + + Removed rdft rader cooley-tukey, to be superseded by a generic + reduction of rdft twiddle problems to dft + pre/post processing + +commit 3f82980635418e49dad204ff327021a8adf4bcfb +Author: Matteo Frigo +Date: Thu Jan 1 15:44:09 2004 -0500 + + In anticipation of the upcoming revision of rdft, removed rdft generic + dit/dif cooley-tukey, in favor of generic rh2c and hc2r solvers. + Cleaned up stuff that became unused after this change, such as + TW_GENERIC. + +commit f7546dadff20223e87c698a9c3e8bcdb8496547e +Author: Matteo Frigo +Date: Thu Jan 1 12:59:30 2004 -0500 + + Removed useless file + +commit 822bd0498b7fe0a45a001af73cd4b317f33b0230 +Author: Steven G. Johnson +Date: Fri Dec 26 13:54:00 2003 -0500 + + whoops, don't call AC_F77_DUMMY_MAIN if no Fortran compiler is found; thanks to Charles Radley for the bug report. + +commit 6d8fa3754568aeb1979cbd6d1f6b91c90f524989 +Author: Steven G. Johnson +Date: Fri Dec 19 13:58:05 2003 -0500 + + guess good flags for Solaris/intel, suggested by J. Gregory Wright + +commit e393cf5533fdff4834a269b4d163641553f9532f +Author: Steven G. Johnson +Date: Fri Dec 5 19:55:13 2003 -0500 + + blah + +commit bcb1ecc806de458e9744b90452468221ab65d36d +Author: Matteo Frigo +Date: Sun Nov 30 06:59:41 2003 -0500 + + DIF generic solver was destroying the input. + +commit 1580db9c3c75c57928058fc81faa981295c7b6ca +Author: Matteo Frigo +Date: Sat Nov 29 19:28:39 2003 -0500 + + Fixed bug that caused HC2R transforms to destroy the input in + certain cases, even if the user specified FFTW_PRESERVE_INPUT. + +commit 24f8af52f2a239ba51cd03e37e4c1c74befdc2f2 +Author: Matteo Frigo +Date: Sat Nov 29 16:49:01 2003 -0500 + + Implemented swap_io hack for r2r verifier. + +commit e15bf89a0e15d64e294ea23deb4f3de422e467b6 +Author: Steven G. Johnson +Date: Thu Nov 20 22:00:53 2003 -0500 + + citation + +commit f8afd813d4a9af4549ccca07ea7604c12c081761 +Author: Matteo Frigo +Date: Fri Nov 14 20:57:55 2003 -0500 + + Trying to get ``make paranoid-check'' to work. (Still broken.) + +commit 74399102001e6b633c21ca16f1b4369f63facab1 +Author: Steven G. Johnson +Date: Fri Nov 14 20:05:54 2003 -0500 + + fixes for input-preservation tests + +commit 29fc95192096b664dc7f23bfc6d3530f5880c66f +Author: Matteo Frigo +Date: Fri Nov 14 19:19:31 2003 -0500 + + Assume FFTW_PRESERVE_INPUT unless either the `d' flag is given in the + problem, or the problem is multidimensional c2r (which fftw3 cannot + without destroying the input). With this change, we can at least test + that FFTW_PRESERVE_INPUT works in the c2r 1d case. + +commit 5a2907cf7121cc9e824150f654d83c9ff984aa92 +Author: Steven G. Johnson +Date: Fri Nov 14 19:14:40 2003 -0500 + + apply should copy back input for input-preservation check + +commit e5b287efdbd1a909467ac69e49f09c708462ea6d +Author: Matteo Frigo +Date: Fri Nov 14 19:01:36 2003 -0500 + + Undone previous bogus changes + +commit 55075f65e5f23bb045b5a076bd559d508e15fab8 +Author: Matteo Frigo +Date: Fri Nov 14 18:27:12 2003 -0500 + + Check dr[fb] in addition to r[fb] + +commit 74d5a2653d744d48adc748e8ebfaafdad0198cb7 +Author: Matteo Frigo +Date: Fri Nov 14 17:33:44 2003 -0500 + + Fixed conditions under which the rank-geq2-rdft2 solver is applicable. + + The old solver was not applicable for out-of-place problems + unless DESTROY_INPUT. This is bogus. As long as the subsolvers + honor !DESTROY_INPUT, the solver is always applicable. + + Changed semantics of test program, so that PRESERVE_INPUT is always + true unless the problem specifies destroy_input explicitly. Without + this change, there is no way to test the new solver. + +commit edcc72abc5fafc3147bfb8b802cea42d249c711b +Author: Steven G. Johnson +Date: Thu Oct 30 15:10:42 2003 -0500 + + added AIX OpenMP (-qsmp=omp) support; thanks to Greg Bauer + +commit 8dffe5112def767dc95ffe8c722d009bd2d3a5aa +Author: Matteo Frigo +Date: Thu Oct 30 10:11:39 2003 -0500 + + G5 CFLAGS + +commit 3cdf00d461370ae110601bf4612b31601a9b7100 +Author: Steven G. Johnson +Date: Fri Oct 24 04:17:39 2003 -0400 + + western FAQ + +commit 8ae00fe74ec955caecad22123ab716b908fb595a +Author: Matteo Frigo +Date: Thu Oct 23 11:34:11 2003 -0400 + + Oops. + +commit f7b3b4aae8910a377ab2c391da7855bad4c6875a +Author: Matteo Frigo +Date: Thu Oct 23 11:28:28 2003 -0400 + + Autodetect altivec + +commit 7458c1cb849f028a73209b18da00a2b63da0d861 +Author: Steven G. Johnson +Date: Wed Oct 22 01:14:10 2003 -0400 + + MinGW gets confused by a single / + +commit 3b8090b60a50893cb21b3e7442c5d8eec86c756e +Author: Matteo Frigo +Date: Fri Oct 17 10:46:41 2003 -0400 + + Paranoid portability fix + +commit 82175d1a4b25bd246759a5a9499a50037b51bc94 +Author: Matteo Frigo +Date: Thu Oct 16 11:07:46 2003 -0400 + + size -> length, which should make clear that we are not talking + about arbitrary precision. + +commit b5f6b9f86f41b0429dd03c64101bc2cbd4a0b261 +Author: Steven G. Johnson +Date: Wed Oct 15 15:01:40 2003 -0400 + + pruned transforms are a FAQ + +commit 736d76c64078a558714dc87e31bc158117a274d7 +Author: Steven G. Johnson +Date: Wed Oct 8 23:54:17 2003 -0400 + + NO_SEARCH has already been mapped to FFTW_WISDOM_ONLY + +commit 02a8d7f029570cfb78c03215109a391d74f22ebd +Author: Steven G. Johnson +Date: Wed Oct 8 23:53:19 2003 -0400 + + newline + +commit 4177857895703cbd233c7b10e80cb95b8e8c25c5 +Author: Steven G. Johnson +Date: Sat Sep 27 20:27:32 2003 -0400 + + fix + +commit 694836051975049f0d2981df1372a23be9d9bc1b +Author: Steven G. Johnson +Date: Sat Sep 27 20:24:39 2003 -0400 + + clarification + +commit 0b20096c7a3afe66a13dc3efd84ba9e535748248 +Author: Steven G. Johnson +Date: Sat Sep 27 17:43:57 2003 -0400 + + minor fix + +commit 39ef965f44a5ba2245f12c7e1b182032746d6dda +Author: Steven G. Johnson +Date: Sat Sep 27 17:42:30 2003 -0400 + + grammar + +commit f7d34b13ca2adef07ab32520d97f05c403d34bd4 +Author: Steven G. Johnson +Date: Sat Sep 27 17:29:04 2003 -0400 + + html output fix + +commit 4b0c92ff25547e2f4fef16bf2089b6525407fc9e +Author: Steven G. Johnson +Date: Sat Sep 27 17:22:48 2003 -0400 + + mentioned sqrt(2) factors for DCT/DST + +commit 512c0e8650df0efa89bc8fea862a005f6f58f2cc +Author: Steven G. Johnson +Date: Sat Sep 27 17:07:18 2003 -0400 + + FFTW_WISDOM_ONLY flag (undocumented for now), suggested by Phil Dumont + +commit 54b4afc9f006bc10ce0423f09625b91af30d9dc3 +Author: Steven G. Johnson +Date: Tue Sep 23 23:36:19 2003 -0400 + + removed UpTime code + +commit 26c7e51b101004fe0cc9c2a5f90c732fd7bcf2b2 +Author: Steven G. Johnson +Date: Tue Sep 23 23:27:29 2003 -0400 + + updated documentation for mach_absolute_time + +commit 12a80b367661367374d32deeb29e01fd75e311e3 +Author: Steven G. Johnson +Date: Tue Sep 23 23:25:52 2003 -0400 + + use mach_absolute_time on MacOS/Darwin, as a fallback; don't bother checking for UpTime since it requires extra libs + +commit fa1787b57c9fb3539af76bd43c35ce224da7dace +Author: Steven G. Johnson +Date: Tue Sep 23 22:59:29 2003 -0400 + + support Apple UpTime function for asm-less xlc, grrr... + +commit 13e7c9ab7273a625f9b21015a75eff8ef163d468 +Author: Steven G. Johnson +Date: Tue Sep 23 15:42:29 2003 -0400 + + additional paranoia for xlc etc. + +commit 2da4a3de8376303c716cd7ee5b3b47b8f759983b +Author: Steven G. Johnson +Date: Mon Sep 22 15:28:56 2003 -0400 + + work around _Complex_I weirdness in xlc, reported by Greg Allen + +commit 3533775b3de13e397feb15794631f1d2fedd1e98 +Author: Steven G. Johnson +Date: Fri Sep 5 18:03:11 2003 -0400 + + typo + +commit ef0a55daee823f7ae55367f4304e32abf20c0d40 +Author: Matteo Frigo +Date: Fri Sep 5 13:11:40 2003 -0400 + + New script that produces commercial version. + +commit 4c4873b3aface20d5444216fcb5ea79221e5a289 +Author: Matteo Frigo +Date: Fri Sep 5 07:27:06 2003 -0400 + + Noted that VC++ is buggy. Noted that we know nothing about Windows. + Noted that the sky is blue as well. + +commit a3d172eb32ea6f17849604998b55db355d60cc26 +Author: Matteo Frigo +Date: Tue Sep 2 09:04:19 2003 -0400 + + Noted that certain arrays are no longer used after the planner has + completed. + +commit c68f62d97627bb869061a9433c4f4605f4dc8fd4 +Author: Matteo Frigo +Date: Tue Aug 26 08:22:38 2003 -0400 + + Typo + +commit b95fbd832374dacc4e8c9fb21b8c4085b33b3460 +Author: Matteo Frigo +Date: Mon Aug 25 21:27:43 2003 -0400 + + New item + +commit b2a02ef7112f03f73e25ccb67227265306b69b6c +Author: Steven G. Johnson +Date: Thu Aug 21 17:36:08 2003 -0400 + + try creating output file before planning (thanks to Phil Dumont for the suggestion) + +commit 766c3757fc99565ef8a14a9f3d5729740b1e7182 +Author: Matteo Frigo +Date: Tue Aug 19 10:08:07 2003 -0400 + + Clarified fftw_cleanup() + +commit 8eecb544f6ac10687ec258d3162a5c7508c6156d +Author: Steven G. Johnson +Date: Sat Aug 16 03:13:41 2003 -0400 + + typo + +commit 443c1d796f44813179c18d5b34c2836bd441a1e2 +Author: Steven G. Johnson +Date: Mon Jul 28 18:01:13 2003 -0400 + + use time() instead of clock() (FIXME: what to do for non-POSIX systems?) ...thanks to JP Sugarbroad and James A. Treacy for the bug report + +commit 9de40445c11cba14fa6eb7ae8e06d2792ebb2262 +Author: Matteo Frigo +Date: Thu Jul 24 18:58:10 2003 -0400 + + Need __volatile__ in sparc cycle counter. This is why the debian + port hangs. + +commit 3da4cd5a3334e2b8415224657c5f5d9ce17eef12 +Author: Steven G. Johnson +Date: Sun Jul 20 16:02:43 2003 -0400 + + merged 3.0.1 notes + +commit cb6949db0271a00b15369efbd59d5c74af6d8c0c +Author: Steven G. Johnson +Date: Sun Jul 13 20:57:34 2003 -0400 + + whoops + +commit 906832308c9b7ba4ce3e55a3efa502ab55e6a676 +Author: Matteo Frigo +Date: Thu Jul 10 11:48:50 2003 -0400 + + Dealing with constants in a way that seems to confuse gcc less. + +commit e823de6c6b1433905ed2851aadcd1e11bf9b81b9 +Author: Matteo Frigo +Date: Wed Jul 9 17:39:23 2003 -0400 + + Enabled scheduler hack for FMA, where it seems to help. + +commit cff00fb9b000446f13c060876536184a03873ca5 +Author: Matteo Frigo +Date: Wed Jul 9 12:57:38 2003 -0400 + + Hmm---the new scheduler seems make things worse for gcc/x86, better + for gcc/ppc, and about the same for icc/x86. Disabled for now. + +commit ca5556ba3956352649cd6d7342d16ffa660db23f +Author: Matteo Frigo +Date: Wed Jul 9 08:09:53 2003 -0400 + + New scheduling pass that keeps ``x = a + b'' and ``y = a - b'' close + together. This property was no longer automatic for the dags + generated in SIMD mode. + + I cannot measure any speed difference due to this change. However, + the change is justified by a minimal-screwup argument. Moreover, the + sse2 fftw library is now 1% smaller than it was before. + +commit 82ab8c034224f1364c148e9f725c90e6e16f721d +Author: Matteo Frigo +Date: Tue Jul 8 20:42:22 2003 -0400 + + -(FNMS()) => FMS() + +commit 471cc543a0805c19f676664861e5dc9d1fb5f1d7 +Author: Steven G. Johnson +Date: Sun Jul 6 13:53:23 2003 -0400 + + added more convenient target name + +commit 18303fef32c580b6c7dc03c4e8bfe30ca2a92724 +Author: Steven G. Johnson +Date: Sat Jul 5 13:30:10 2003 -0400 + + typo + +commit c30db69dc73fc965683cd147c948c3dba1f6aad7 +Author: Matteo Frigo +Date: Sat Jul 5 13:19:36 2003 -0400 + + Consistent naming + +commit da3b10c5645b3bb482b26cb42d0821dda213b994 +Author: Matteo Frigo +Date: Sat Jul 5 13:05:51 2003 -0400 + + Got rid of problemw. + +commit 21c3f87f755cadd9ef25945fe33448eeea7cb511 +Author: Matteo Frigo +Date: Fri Jul 4 06:56:26 2003 -0400 + + Increase TIME_MIN on intel only + +commit c749315d331fac4826ab1754a84f2a66e00197df +Author: Matteo Frigo +Date: Fri Jul 4 06:36:02 2003 -0400 + + A little hack to get more consistent scheduling. + +commit 1af463bd5b8ae6bd696ecb6a86d8b1952aaf6fd0 +Author: Matteo Frigo +Date: Thu Jul 3 16:47:42 2003 -0400 + + New experimental scheduler (currently disabled). + + The old scheduler is ``optimal'' in the sense that it minimizes + register pressure. The only way to reduce register pressure is to + schedule dependent instructions as closely as possible, so as to + minimize the life time of registers. This strategy maximizes the + number of pipeline stalls, however. With enough registers and short + enough pipelines, this tradeoff is fine. This is no longer the case + for the devilish pipeline of the Pentium IV or (probably) the PowerPC + 970. + + The new scheduler switches to a ``list scheduler'' for dags smaller + than a specified size. The list scheduler executes a butterfly left + to right one column at the time. This amounts to the best possible + pipeline utilization, and the worst possible register pressure. + + The ``specified size'' defaults to 0, i.e., no change from fftw2 and + fftw-3.0. It seems like a value of 7--10 produces the best results + for Pentium IV (probably screwing the G3/G4 powerpcs and sparc, but I + haven't tried.) As time goes by, we may want to increase this number + to favor newer processors over older processors. + +commit b4dc4ef39f37d036b9120f6e273549fd7bbaaa2a +Author: Steven G. Johnson +Date: Wed Jun 25 17:43:59 2003 -0400 + + remove non-portable use of tempfile; thanks to Nicolas Decoster for the patch + +commit 9630b97551ac80d0b1a8ecc26722ab98149a2be6 +Author: Steven G. Johnson +Date: Wed Jun 25 17:14:03 2003 -0400 + + increase stupid HP preprocessor limits + +commit a31916f0f41eb0a1398f38341da28991919123f0 +Author: Matteo Frigo +Date: Thu Jun 19 15:21:52 2003 -0400 + + Distribute gen_mdct.ml + +commit 367373d615cb66b335d9586544ead2f9d424effc +Author: Matteo Frigo +Date: Wed Jun 11 06:55:21 2003 -0400 + + Cleared int/ptrdiff_t confusions + +commit f1e0319906231b0e8d5675cc4ab24db00e560dc0 +Author: Matteo Frigo +Date: Tue Jun 10 22:15:42 2003 -0400 + + Cleared int/ptrdiff_t confusion + +commit 48d9ab9a8d3ddcb8fc21d4c8e90adfcbf7e4e200 +Author: Matteo Frigo +Date: Sun Jun 8 09:52:57 2003 -0400 + + Increased TIME_MIN. This seems to produce more reliable plans + on Pentium IV. + +commit 3ba082c0f617d0c03cde783d3d7eba4392d13397 +Author: Matteo Frigo +Date: Sat Jun 7 21:43:00 2003 -0400 + + Removed relic -trivial-stores, which dates back to Franz's early + experiments. Speed improved on SSE2, both with gcc and icc. + +commit 25a3b0e594d1b7fbe6b87c322ae34470bfdcccba +Author: Steven G. Johnson +Date: Thu Jun 5 22:29:52 2003 -0400 + + fix direntry + +commit 4ceff26934f86ada8712eabca96511462e7e8eaf +Author: Steven G. Johnson +Date: Thu Jun 5 13:41:34 2003 -0400 + + added imdct + +commit 1f23163e190c844ee3b2caf4564245cfbddd1c5b +Author: Matteo Frigo +Date: Wed Jun 4 19:54:38 2003 -0400 + + Collect pattern (a * b) +- (c * d) in generic-arith, because this + operation can usually be computed with one rounding in fixed-point + (and it possibly exposes a FMA instruction) + +commit 10d5f543e3ab8e1f2acb3f0bdeef0b196f22d6e0 +Author: Matteo Frigo +Date: Wed Jun 4 15:11:29 2003 -0400 + + Generic-arithmetic unparser + +commit d705a296a095ba4947adbd5e745b1a5ccf39f04a +Author: Matteo Frigo +Date: Sun Jun 1 09:05:30 2003 -0400 + + Oops---randomized CSE was using the same random numbers + over and over + +commit fed2aa57dc95873ed83371338d16b9667c84c6f1 +Author: Matteo Frigo +Date: Sun Jun 1 07:01:17 2003 -0400 + + Paranoia. + +commit 4905e1d1498f044f37a6efd2b168c9bfac54a3de +Author: Matteo Frigo +Date: Sun Jun 1 07:00:54 2003 -0400 + + Use relative error instead of absolute error, to avoid problems + when normalization factors are used. + +commit 967eecb8b745332dff25a3610a617bd73897abd6 +Author: Steven G. Johnson +Date: Sat May 31 22:11:28 2003 -0400 + + slight opt + +commit 6186c7e4fbaec8d816ce12a74c211890ad8c7fe9 +Author: Steven G. Johnson +Date: Sat May 31 22:10:45 2003 -0400 + + slight optimization + +commit f547dd3851ad0f88d4b79ac5b32af9ecbe727e4e +Author: Steven G. Johnson +Date: Sat May 31 20:43:31 2003 -0400 + + *W is const + +commit 9d9e1ec4a2623c32dd10304f84d3d3854b17b938 +Author: Steven G. Johnson +Date: Sat May 31 20:41:15 2003 -0400 + + comment + +commit 4269fae3e68941b115c0f8855ad3bb58e18c6f89 +Author: Steven G. Johnson +Date: Thu May 29 21:31:31 2003 -0400 + + added experimental MDCT + +commit 3028a550c6acc0fb367dbe26af192714715a09e2 +Author: Steven G. Johnson +Date: Wed May 28 22:01:37 2003 -0400 + + altivec (fma) needs simd codlist.c too + +commit 083e7c5e6bf88cffc3938cb6225551ec5af0f869 +Author: Steven G. Johnson +Date: Wed May 28 22:00:49 2003 -0400 + + make sure we include SIMD codlist.c for non-Unix folks + +commit 08028f9b0217ea164f25bcbf01824df23bb7245e +Author: Steven G. Johnson +Date: Tue May 27 20:31:25 2003 -0400 + + noted howmany_rank == 0 is a single transform + +commit 46b08adb7f478a6f5d51e1fefa6ab99891d3391d +Author: Steven G. Johnson +Date: Tue May 27 20:02:31 2003 -0400 + + further stride clarification + +commit 1264855f26ebf31705c1a6cf6067c3e996c71114 +Author: Matteo Frigo +Date: Mon May 26 10:21:22 2003 -0400 + + Removed transposed dftw problems. + + I now consider transposed dftw a Bad Idea, since it does not + apply to the case that it was originally meant for (speed up four-step) + and it complicates the implementation of the other thing I want to try + (dftw m-slices). + +commit c198c3ed318d9864a22877795f7bac4f3eaf4d8b +Author: Matteo Frigo +Date: Mon May 26 07:22:59 2003 -0400 + + Obsolete comment + +commit bb96207501d8ca498bde638f46932c2bdd4bec66 +Author: Matteo Frigo +Date: Sat May 24 15:00:53 2003 -0400 + + comment + +commit a3733f2596b8d6d3972edfd942ce61296f2051d1 +Author: Matteo Frigo +Date: Sat May 24 07:20:35 2003 -0400 + + Oops---wrong test NO_UGLYP instead of !NO_UGLYP + +commit d8575658ab032ccf0b6553c4a84af8510d0cae55 +Author: Matteo Frigo +Date: Sat May 24 07:05:34 2003 -0400 + + Implemented radix r, where n=r^2 * p + +commit c2ca438ef110583287ce3c0e8527d4d382ccedde +Author: Steven G. Johnson +Date: Wed May 21 01:54:32 2003 -0400 + + xlc seems to properly use fma as well + +commit 3bf5cca5763573337c68978f05125e6e3eb4fe3d +Author: Steven G. Johnson +Date: Tue May 20 23:07:43 2003 -0400 + + print warning if there is no cycle counter + +commit 00cef912cbb09cf8a1080a3544d45d6bacc44222 +Author: Steven G. Johnson +Date: Tue May 20 17:32:04 2003 -0400 + + updated Funda reference + +commit a331d8a0841d1ccb7c314dbb98749bd77d69e709 +Author: Matteo Frigo +Date: Mon May 19 20:12:36 2003 -0400 + + const + +commit 200b3519c0ee6bd32babf52b352b8f8385da45d1 +Author: Matteo Frigo +Date: Mon May 19 15:41:09 2003 -0400 + + Implemented generic dif square transposed (q-style) solver. + +commit 8c6184ff5904082729018b5c36926b5bc479db14 +Author: Matteo Frigo +Date: Mon May 19 07:00:36 2003 -0400 + + applicable() is now a property of the solver (in anticipation of + transposed solvers) + +commit 75102fd59a69589a2b23faeab596f43e7bcdc46c +Author: Matteo Frigo +Date: Mon May 19 06:33:40 2003 -0400 + + Slight cleanup + +commit fb49407efc496838a8f21a6cdfa52ad602b1cdfa +Author: Matteo Frigo +Date: Sun May 18 13:05:51 2003 -0400 + + Nothing, really + +commit df97ba383cdf4cc6a473e4e1ad041b11b8f965af +Author: Matteo Frigo +Date: Sun May 18 09:05:20 2003 -0400 + + Moved vector loop inside bytwiddle(), in anticipation of + a q-style dftw-dit transposed solver. + +commit ee4edcdb0d229ae56167c04d4ffc36ee84d32361 +Author: Matteo Frigo +Date: Sun May 18 08:52:02 2003 -0400 + + Fixed flops count + +commit dccb90a9de4bd56cb5dad7340b27302bf2c6d245 +Author: Matteo Frigo +Date: Sun May 18 08:47:20 2003 -0400 + + style + +commit b83dec51bb0e588e9bc8fd4aff422b3e8b20e8ca +Author: Matteo Frigo +Date: Sun May 18 07:16:34 2003 -0400 + + Faster inner loop. + +commit c7bd9e9fc6d14ae3a28012fa0425a14330746572 +Author: Matteo Frigo +Date: Sat May 17 08:02:38 2003 -0400 + + Print vector length + +commit 74d6f9435c81aaafcf08927ebec58dd49ecea003 +Author: Matteo Frigo +Date: Sat May 17 07:55:33 2003 -0400 + + Oops + +commit 668b7018dd6ccd5a7802f71b29eb4e155801ff86 +Author: Matteo Frigo +Date: Sat May 17 07:50:35 2003 -0400 + + Allow vl > 1 + +commit 1919840986e87d611bccc5a1ffbaa469bccaa94a +Author: Matteo Frigo +Date: Sat May 17 07:01:42 2003 -0400 + + Radix can be derived from problem---no need to pre-specify it. + +commit a25c7ceebb0e65bb9b03bd7c30e3b97a29063185 +Author: Steven G. Johnson +Date: Fri May 16 22:50:50 2003 -0400 + + fixed comment + +commit e12663ca110ee43071e2344163161cd2122312c4 +Author: Steven G. Johnson +Date: Fri May 16 22:48:20 2003 -0400 + + whoops, gcd should be static + +commit 96c37858e236a75341bc45eca6e8a9a6180c61c8 +Author: Steven G. Johnson +Date: Fri May 16 22:40:32 2003 -0400 + + more unrolling + +commit ce888f64f2b19c2b1d0a2306c0f5a0bfb282e2cf +Author: Matteo Frigo +Date: Fri May 16 20:03:48 2003 -0400 + + Hack to avoid infinite recursion. + +commit 3be61e5d6f8b5c517feed2417902fc4fc8205180 +Author: Steven G. Johnson +Date: Fri May 16 19:52:43 2003 -0400 + + consistency + +commit 10ef200843d878ba4e88a6e59c53ec89b48cba11 +Author: Matteo Frigo +Date: Fri May 16 19:45:15 2003 -0400 + + Wrong comment. + +commit 9ad0f5ae45b2265e1307381d14a436eb43998c8d +Author: Matteo Frigo +Date: Fri May 16 19:45:03 2003 -0400 + + Style. + +commit bc609cdbd63dfd90154f4f0b07a0fb6c9c1f7354 +Author: Steven G. Johnson +Date: Fri May 16 18:35:27 2003 -0400 + + punctuation + +commit 3c931e88733a24d99d4639165f16f073ff25b35e +Author: Steven G. Johnson +Date: Fri May 16 18:33:45 2003 -0400 + + added allzero FAQ + +commit 4e3c1c97240d8dc8b8595f179994e9999e2a7b98 +Author: Steven G. Johnson +Date: Fri May 16 18:22:45 2003 -0400 + + simplification: instead of cldb, just use cldf with inputs/output values swapped + +commit 734444b8d502c323a04fd2cc6e6fc37d53cd4b04 +Author: Matteo Frigo +Date: Fri May 16 15:47:17 2003 -0400 + + Allow more general transform sizes. + +commit 77d47783b6445a14416a351ffb88c70348bb7ae1 +Author: Steven G. Johnson +Date: Fri May 16 14:22:37 2003 -0400 + + slight change + +commit 7bdfe7acb85d3e5c4081537789ee95c49d852e0c +Author: Steven G. Johnson +Date: Fri May 16 14:22:05 2003 -0400 + + MS has __int64 type, not long long (grr) + +commit 6778b57c92f2c729955fec383ee1ec817559b35f +Author: Matteo Frigo +Date: Fri May 16 13:34:16 2003 -0400 + + Fixed printout + +commit 26cad01414a0e9ec0f5809c3fafdcd0ebeca8eee +Author: Matteo Frigo +Date: Fri May 16 13:23:00 2003 -0400 + + Fixed flop count + +commit 6663b7b12eed820ccad08bbe8a7b13d4e7e96baf +Author: Matteo Frigo +Date: Fri May 16 13:02:06 2003 -0400 + + New bluestein solver + +commit a3444150521abc3e4522064bfbce259979d143dd +Author: Matteo Frigo +Date: Fri May 16 09:51:05 2003 -0400 + + Implemented generic radix. + +commit 105268f348df67714aaff107d5a4817a8ea9069e +Author: Matteo Frigo +Date: Fri May 16 08:19:38 2003 -0400 + + Removed conditional branch from inner loop in generic.c + +commit 44179d747df49fe429ae0108b108e1f28b71023c +Author: Matteo Frigo +Date: Fri May 16 07:48:28 2003 -0400 + + Simplified indexing + +commit 6a89bb8523df8e372f221f4ccdd6fa9e75120ec1 +Author: Matteo Frigo +Date: Fri May 16 06:53:56 2003 -0400 + + Better still. + +commit bc7126aa1f6bca65323f8d367629a9e6ddb18310 +Author: Matteo Frigo +Date: Fri May 16 06:24:31 2003 -0400 + + Further improvement of generic solver + +commit 29931919e62a0633afc7fdfe2738fba18419e30c +Author: Matteo Frigo +Date: Fri May 16 05:57:07 2003 -0400 + + Cleanup + +commit 516d81975ebfabe254800e61a072976ce2493792 +Author: Matteo Frigo +Date: Fri May 16 05:42:57 2003 -0400 + + Cleanup + +commit 9c40e9a8ab92ae76b96b1e57a51a8a46cd4202aa +Author: Matteo Frigo +Date: Fri May 16 05:31:40 2003 -0400 + + Generic now only works for odd sized. Added check. + +commit a4abb5b3c869ca3d4c1b572793c4128935461f2e +Author: Matteo Frigo +Date: Thu May 15 21:53:25 2003 -0400 + + Increased GENERIC_MIN_BAD because of new algorithm. + +commit 60bf38f4720ea99600008e1ad0772e3871cc975d +Author: Matteo Frigo +Date: Thu May 15 21:40:27 2003 -0400 + + Much, much better. + +commit bd0ae8b86cd6e44542f040b89670e8559cb4daef +Author: Matteo Frigo +Date: Thu May 15 21:25:00 2003 -0400 + + Still trying to understand why rdft-generic-dit is faster + then dft-generic... + +commit 1ace458103964bbd9cc763efde55b6c64543e072 +Author: Matteo Frigo +Date: Thu May 15 21:04:33 2003 -0400 + + Nothing, really + +commit e68561ce796750faf2eb70606053723da3a3651b +Author: Matteo Frigo +Date: Thu May 15 20:59:45 2003 -0400 + + Never be clever for the sake of being clever. + +commit 3480d0dea4ccb5fa65ea2c8950aea4821cea6e3a +Author: Matteo Frigo +Date: Thu May 15 20:58:06 2003 -0400 + + Simplified. generic-dit is gone. The solver is now out-of-place + only---buffering is done by the buffered solver. + +commit 21161d67e447696eda8fb463a6e629fdb9b9a286 +Author: Matteo Frigo +Date: Thu May 15 19:18:18 2003 -0400 + + rader-dit is gone. + +commit 99baac8e16f51413086aa8b35ff5894b43ddce25 +Author: Matteo Frigo +Date: Thu May 15 19:13:03 2003 -0400 + + Cast + +commit 9bc90955564668ef3b897434df873ea7a9e987b7 +Author: Matteo Frigo +Date: Thu May 15 19:09:07 2003 -0400 + + Introduced twiddle problem ``dftw''. Changed most other things + to deal with this change. + +commit 57d761eab36c018f98849a04c82df5fdc61db498 +Author: Steven G. Johnson +Date: Thu May 15 18:47:18 2003 -0400 + + whoops, X(safe_mulmod) not fftw_safe_mulmod + +commit ad0f04aa3eead44c4f82e436a20241a8d76fdfba +Author: Steven G. Johnson +Date: Thu May 15 16:53:16 2003 -0400 + + add VC++ versions of asm + +commit 4e67675d7f66ce57718045e8ddf3769ba44f378f +Author: Steven G. Johnson +Date: Thu May 15 15:03:06 2003 -0400 + + VC++ reportedly supports the intel intrinsics, but requires __inline instead of __inline__ + +commit 8d72a4d25a56b9b8c9e918cb462ae7f8429fce9c +Author: Steven G. Johnson +Date: Thu May 15 14:32:06 2003 -0400 + + precompute array indices with VC++ + +commit 7a8ca44fd207d2de8947e6d7dad9b6122d5eacf4 +Author: Steven G. Johnson +Date: Wed May 14 21:57:39 2003 -0400 + + added doc note + +commit e21c7e8fbc7073874cec2c052a810cb8c8bafb6c +Author: Steven G. Johnson +Date: Wed May 14 19:45:54 2003 -0400 + + autodetect windows + +commit 9e15f067241ae365258fdae039f13855799566b5 +Author: Steven G. Johnson +Date: Wed May 14 15:08:49 2003 -0400 + + don't bother with #ifdef HAVE_CONFIG_H, since non-Unix users always forget to define it + +commit 8fd89cce099546af6bb94f83b4e84bc46609708a +Author: Steven G. Johnson +Date: Tue May 13 16:58:07 2003 -0400 + + VC++ uses __inline + +commit 02aaa87cb911b0d6d67ec4f11932357f702aa75f +Author: Steven G. Johnson +Date: Tue May 13 14:51:26 2003 -0400 + + added leak question + +commit 64d02f177161f96e87c02cde6015ceff42ac0bfe +Author: Steven G. Johnson +Date: Mon May 12 18:26:51 2003 -0400 + + LARGE_INTEGER needs windows.h (supposedly, there is some problem converting _itnt64 to double...damn MS and their nonstandard types) + +commit 342ab9adfdb7bf9a5936f1c1d3f0820fa729ab2e +Author: Steven G. Johnson +Date: Mon May 12 18:22:16 2003 -0400 + + whoops + +commit a8cb5339f580f0f4ee0ff02c58f91036b7fef886 +Author: Steven G. Johnson +Date: Mon May 12 17:16:19 2003 -0400 + + added 256x256 to canonical list + +commit 446260f6a6a84986c7eec6e1b3c0eea0f66f759d +Author: Matteo Frigo +Date: Mon May 12 07:02:06 2003 -0400 + + Oops... + +commit 924714d15f5ed063b1fa8a40a3bcd2ebe406e572 +Author: Matteo Frigo +Date: Sun May 11 11:04:46 2003 -0400 + + Unrolled loops, changed cutoff + +commit a8e681a4dd1d8cbae25becdb745926efde43cf3c +Author: Matteo Frigo +Date: Sun May 11 10:20:04 2003 -0400 + + Do not multiply strides by 2 twice. + +commit cba6f4731943edfe50f4bacd9de28d0551593f43 +Author: Steven G. Johnson +Date: Wed May 7 21:09:43 2003 -0400 + + added 'make smallcheck' + +commit 8f61201655a4d04b402d2cec34acb86e89cbe35f +Author: Steven G. Johnson +Date: Wed May 7 20:46:10 2003 -0400 + + --without-cycle-counter becomes --with-slow-timer, updated docs + +commit e77df17a33148f0cd531fcf1bcf371af0b69ced6 +Author: Steven G. Johnson +Date: Wed May 7 18:05:29 2003 -0400 + + remove duplicate -openmp check; Sun requires -xopenmp + +commit 34594ee9cdef76091eff1164f9518e92bf0b855b +Author: Steven G. Johnson +Date: Wed May 7 17:59:23 2003 -0400 + + fixed compilation under Sun C++ + +commit fe5788275ebad911c952662c50694c2f296ae4b2 +Author: Matteo Frigo +Date: Wed May 7 14:24:46 2003 -0400 + + Use estimator if cycle counter is unavailable, regardless + of the FFTW_MEASURE/ESTIMATE setting. + +commit 7d2473af5f98cac96951e94c009b96f1d96dcea3 +Author: Steven G. Johnson +Date: Tue May 6 23:15:34 2003 -0400 + + _WIN32 (not __WIN32__) is always defined + +commit a9d4840add6bac6ef0f0f194868861615f52d91c +Author: Steven G. Johnson +Date: Tue May 6 23:11:52 2003 -0400 + + minor cleanup + +commit 33d6678021b7c966f0490729f9839282d88b7e68 +Author: Steven G. Johnson +Date: Tue May 6 22:50:07 2003 -0400 + + tentative VC++ stuff, some consolidation + +commit 4b2c8b1fdf43a442999e9309b1abb5f525b2a5e2 +Author: Steven G. Johnson +Date: Tue May 6 12:17:56 2003 -0400 + + made cycle.h more self-contained + +commit 17b78ccd6e3bf378453a85f671f02c82eb45ced4 +Author: Matteo Frigo +Date: Tue May 6 08:30:39 2003 -0400 + + Use ``%'' flag to denote commutative operations. + +commit b98342890cbb95b8f450d6da8e22637b455fccc0 +Author: Steven G. Johnson +Date: Mon May 5 20:42:30 2003 -0400 + + MIT license, brief documentation + +commit 95f79870876aa95354fecf59c0da025edb8982f9 +Author: Steven G. Johnson +Date: Mon May 5 20:31:16 2003 -0400 + + whoops, forgot f77_wisdom.f + +commit 5cdde47077a07f4aa39487741662e868f5cf11df +Author: Matteo Frigo +Date: Sun May 4 19:37:09 2003 -0400 + + Improved speed of accuracy test. + +commit ff00ccc1b3a83962c18e91ab12740ca63bbb6081 +Author: Matteo Frigo +Date: Tue Apr 29 11:45:34 2003 -0400 + + s390 cycle counter + +commit 2ab4e6e2c3bfdd6882bad8bca36fdc105f742847 +Author: Steven G. Johnson +Date: Sat Apr 26 12:26:15 2003 -0400 + + forgot r2r directory + +commit 990abcc219adbf0759807b9b2c20d80f639dd940 +Author: Steven G. Johnson +Date: Fri Apr 25 20:52:23 2003 -0400 + + delete unused files, since they don't compile any more + +commit a35c9fd7e587b8301131f8e530387dad7e62fc00 +Author: Matteo Frigo +Date: Thu Apr 24 06:37:41 2003 -0400 + + Better gcc code generation + +commit 462d92a21265012fd4fb89326da6bccd69f05406 +Author: Steven G. Johnson +Date: Wed Apr 23 15:30:50 2003 -0400 + + ccc is the Compaq C compiler on Linux/alpha + +commit a97d5f6b3b451179f501157bfe6fafde3481ea0d +Author: Steven G. Johnson +Date: Wed Apr 23 00:06:03 2003 -0400 + + whoops + +commit a53aa0afb9f63f64ee6235e07fd99014f6da32fb +Author: Matteo Frigo +Date: Sat Apr 19 09:18:25 2003 -0400 + + ia64 cycle counter with intel compiler. + +commit 20978a6bcaad9c07b4c969eae56ab29ae092e2bb +Author: Matteo Frigo +Date: Fri Apr 18 18:27:30 2003 -0400 + + More gcc bugs. Sigh. + +commit 1a9f1a74c640a09efbabff5043cc7074b6bfefe0 +Author: Matteo Frigo +Date: Fri Apr 18 18:01:49 2003 -0400 + + touch ChangeLog to observe GNU standards + +commit 4241f03ed18cc0acf61072c70b9c38b1c7dc7c31 +Author: Matteo Frigo +Date: Fri Apr 18 18:01:12 2003 -0400 + + We now build ChangeLog automatically at distribution time + +commit 1797417a3e517b1f9b9931e49797dff29ae760da +Author: Matteo Frigo +Date: Fri Apr 18 18:00:17 2003 -0400 + + Automatic ChangeLog hackery + +commit d76cd97496030b79d3450f2c6de88da7b4458bd6 +Author: Steven G. Johnson +Date: Fri Apr 18 13:25:26 2003 -0400 + + plural + +commit 6c59528dcbd6ce3676a0852bad2d909e68fdeeac +Author: Steven G. Johnson +Date: Fri Apr 18 13:25:01 2003 -0400 + + updated + +commit b37ba8f3518f8be4c0c25dd86f102c9e64527104 +Author: Matteo Frigo +Date: Fri Apr 18 12:59:41 2003 -0400 + + Updated + +commit 61ac8832cb1bd238132fe475c699f12e11232781 +Author: Steven G. Johnson +Date: Fri Apr 18 11:48:39 2003 -0400 + + a -> an + +commit 287a97f4366aeb55745345972896f06e378dcacf +Author: Steven G. Johnson +Date: Fri Apr 18 11:47:56 2003 -0400 + + hyphen + +commit 8791b19a3135636c10dd4e99695799a6ac315870 +Author: Steven G. Johnson +Date: Fri Apr 18 11:47:28 2003 -0400 + + comma + +commit ad823e8abbe446885056a5fc05555e295b7a174f +Author: Steven G. Johnson +Date: Fri Apr 18 11:46:59 2003 -0400 + + minor + +commit 7a09c0d18816d7d1c2ed89a0dfbd62843d3442eb +Author: Matteo Frigo +Date: Fri Apr 18 10:37:31 2003 -0400 + + Updated + +commit 13381c1ba5e8af34a8bb03710aa7741a8040cc07 +Author: Matteo Frigo +Date: Fri Apr 18 10:14:59 2003 -0400 + + New script that builds the distributions + +commit 459fa38ea6735a02e430cb0ecbca2323e07cef57 +Author: Matteo Frigo +Date: Fri Apr 18 08:51:07 2003 -0400 + + Oops again + +commit e57ee39dc083cd4461a548cded7fdc45e57fc74f +Author: Matteo Frigo +Date: Fri Apr 18 08:39:05 2003 -0400 + + Oops, forgot -sign 1 + +commit 396b6bc876a10a52ce9dc68230e2eb25af544f29 +Author: Matteo Frigo +Date: Fri Apr 18 08:28:25 2003 -0400 + + Reorganization of simd codelets + +commit fd7cb9b51d78aabe5b32969758bf472ca0d563ae +Author: Matteo Frigo +Date: Thu Apr 17 21:21:45 2003 -0400 + + k7 assembly was not updated after conversion of opcnt from + int to double + +commit 3bf64e2b77975db0ec3c2ad2232fa9dfceeae35f +Author: Matteo Frigo +Date: Thu Apr 17 19:15:53 2003 -0400 + + Capital `X' looks bad in all-lowercase plans + +commit 448802e951a73d406bacc449b5d7eb0ece3bfaf6 +Author: Matteo Frigo +Date: Thu Apr 17 18:53:29 2003 -0400 + + Removed redundant inline/noinline codelets + +commit b72b1f8cdf96f12c6776efdb456cdd6e2eff00b3 +Author: Matteo Frigo +Date: Thu Apr 17 15:25:50 2003 -0400 + + New noinline + Noinline real codelets + +commit 4f5ff427ae9e39bda6b17cdc61b9ecfad075f322 +Author: Steven G. Johnson +Date: Thu Apr 17 15:23:03 2003 -0400 + + more ideas + +commit e549828bdf29f4ba5b352f8d54e1d8fb65e86b0b +Author: Matteo Frigo +Date: Thu Apr 17 13:18:45 2003 -0400 + + Removed duplicate rules. + +commit 29889996e0d7e2beec6c4afaf8d06936f0bc8e7a +Author: Matteo Frigo +Date: Thu Apr 17 10:51:09 2003 -0400 + + acx_pthread.m4 was not distributed + +commit 4bcda610088022777266a9d4723e3108871a2382 +Author: Matteo Frigo +Date: Thu Apr 17 07:21:17 2003 -0400 + + Oops + +commit 92ba4bfacade8ab1d4dae0e256cda08e8b22eb3c +Author: Matteo Frigo +Date: Thu Apr 17 07:07:19 2003 -0400 + + Both inlined and non-inlined notw codelets. + +commit bc5fcf6d524989489b08f05b59fd2660b4331765 +Author: Matteo Frigo +Date: Thu Apr 17 06:44:21 2003 -0400 + + Initial experiment with both inlined and non-inlined simd codelets. + Both are included for now. + +commit 5586bdcd9d791a373355fae20e4df01e8b51ef32 +Author: Matteo Frigo +Date: Thu Apr 17 05:57:36 2003 -0400 + + --enable-fma to build FMA distribution + +commit 6719f26d34cd9bd0dce5a3d279a06b113cd774a7 +Author: Matteo Frigo +Date: Wed Apr 16 17:21:53 2003 -0400 + + Inline SIMD nontwiddle codelets + +commit 5db4d2ae77f5600008ce54b88e93a0e7fbcc649b +Author: Matteo Frigo +Date: Wed Apr 16 16:18:29 2003 -0400 + + Pathetic attempt at saving a couple of registers... + +commit 7267a94d763a0380970f1b07ee84aad71f138c8f +Author: Matteo Frigo +Date: Wed Apr 16 15:51:27 2003 -0400 + + for (i = 0; i < m; ++i) ==> for (i = m; i > 0; --i) + No proof of evidence that this is any faster, but just in case... + +commit 607d75d99f7b0c558d5664cc18b0c6a070d3aa02 +Author: Steven G. Johnson +Date: Tue Apr 15 15:03:20 2003 -0400 + + added hack to make sure that codelet loops are preferred to vecloop solvers in the estimator + +commit a772926574ae28c851b95b9eea8d22d0b244e25e +Author: Steven G. Johnson +Date: Tue Apr 15 14:53:44 2003 -0400 + + use double for flops + +commit 84c191f258a2ee1fde8b39e4a567f48bc84d273a +Author: Steven G. Johnson +Date: Tue Apr 15 14:51:50 2003 -0400 + + metrowerks reportedly supports gcc assembly extensions on ppc + +commit d83a8e3d6b322b293fb8b048bb46c1048faf430b +Author: Matteo Frigo +Date: Mon Apr 14 15:00:50 2003 -0400 + + foo_CFLAGS generates some automake junk that breaks the build + on Redhat 7.3. Screw it. + +commit 54128f6b2dd2ea009736debbb0c2eee43c4a0ade +Author: Matteo Frigo +Date: Mon Apr 14 12:22:59 2003 -0400 + + Carefully check return status + +commit 8935dbb4a98ff9a7780aa1ce7a98c656b7284d79 +Author: Matteo Frigo +Date: Sun Apr 13 16:46:12 2003 -0400 + + Removed annoying -FMA() expressions. + +commit 8ce45c13aca6d081f84f8dcb84a973383d3e5ee8 +Author: Matteo Frigo +Date: Sat Apr 12 14:32:22 2003 -0400 + + Major fma hackery + +commit 4a294df6343206e437a3f24ed268a71c9cd9edb0 +Author: Matteo Frigo +Date: Sat Apr 12 14:25:43 2003 -0400 + + Slight cleanup + +commit bda29baca81b8098e25fb1d61d3aa7b882f33ef5 +Author: Matteo Frigo +Date: Sat Apr 12 10:04:51 2003 -0400 + + Updated version number + +commit 80a70d1b1e8e1d7e336301a3f65b26d153ba15a7 +Author: Matteo Frigo +Date: Sat Apr 12 08:03:07 2003 -0400 + + Damn autoconf + +commit 27c1334aec2b8b3bbc7e679761d0ddab53212487 +Author: Matteo Frigo +Date: Sat Apr 12 07:54:20 2003 -0400 + + Recognize all 74xx processors + +commit 7b1c87d4184dace0460075da82295c1fc90e523d +Author: Matteo Frigo +Date: Sat Apr 12 07:35:17 2003 -0400 + + Detect 7400 processor. + +commit ea19ce217870bff790c8e91865228328a08cd769 +Author: Matteo Frigo +Date: Fri Apr 11 20:42:11 2003 -0400 + + No need to check for gcc-2.95 + +commit fb6560399e6c1dc7382fc48209545f4494f87e65 +Author: Steven G. Johnson +Date: Fri Apr 11 16:14:39 2003 -0400 + + removed duplicate + +commit 114c5faeddef91d05efc3af062e58f21879cd77d +Author: Matteo Frigo +Date: Fri Apr 11 08:45:37 2003 -0400 + + mflops ==> ``mflops'' + +commit be09e2c160458ffa571c8c207546d77dd86f1022 +Author: Matteo Frigo +Date: Fri Apr 11 07:00:53 2003 -0400 + + Print setup time as well + +commit a55b833ea382a9dcf478517c83d68d044db4dcaa +Author: Matteo Frigo +Date: Thu Apr 10 15:36:18 2003 -0400 + + Enforce pointer equality for in-place problems. + +commit a920de28e41596cc862a7f7bcc14c27c68920b53 +Author: Steven G. Johnson +Date: Wed Apr 9 17:47:54 2003 -0400 + + updated + +commit 080c6f9a24e129da6a216d44e581ea9c5012df83 +Author: Steven G. Johnson +Date: Wed Apr 9 14:53:38 2003 -0400 + + cross-ref fftw-wisdom man page + +commit 920b026d6c76cc8b23b877e8238cb6cd9f71e7af +Author: Matteo Frigo +Date: Wed Apr 9 10:13:00 2003 -0400 + + Undone previous change, committed by mistake. + +commit c636a6d32d90fda78f15b6e5b0060feeea45b47c +Author: Matteo Frigo +Date: Wed Apr 9 10:12:24 2003 -0400 + + Quick and dirty README for bench + +commit e542ee15fcc1eaa62b3c1ea6a58cc3bc468ff599 +Author: Matteo Frigo +Date: Wed Apr 9 08:50:25 2003 -0400 + + Consider additional command-line arguments as problems to be + benchmarked. + +commit 2196cad41694a580854e0f04991d3055d9e365e3 +Author: Matteo Frigo +Date: Wed Apr 9 08:44:13 2003 -0400 + + Default report format is now human-readable. Removed + unnecessary complexity in benchmark reporting. + +commit 1ecc5f59fb401c7ecdeb54596088ac86ede3639a +Author: Matteo Frigo +Date: Wed Apr 9 06:10:40 2003 -0400 + + Updated for new interleaved/split api. + +commit 8d3536f2476441b3f7754a1d5298102d6cd14ac2 +Author: Steven G. Johnson +Date: Wed Apr 9 03:01:03 2003 -0400 + + updated citation + +commit aaf6b0e66924b89fb8c927bbcc3bc655512aab13 +Author: Matteo Frigo +Date: Tue Apr 8 19:35:59 2003 -0400 + + Time for beta3 + +commit f5c162435d5334990a7c6f3421191592a831bdd7 +Author: Steven G. Johnson +Date: Tue Apr 8 17:40:59 2003 -0400 + + whoops, added + +commit 14108da14b0738a1c8b036a901971104d5374ef7 +Author: Steven G. Johnson +Date: Tue Apr 8 17:33:47 2003 -0400 + + more comparison of different R*DFT types + +commit 75bbef9a658de085d8c21952d597dbca9e8fa722 +Author: Steven G. Johnson +Date: Tue Apr 8 16:48:08 2003 -0400 + + comments + +commit 0ba9318b95b11d2cb5470ebcf73a1819d31caafb +Author: Steven G. Johnson +Date: Tue Apr 8 16:19:39 2003 -0400 + + more accurate DCT-I and DST-I, at the expense of up to a factor of 2 in speed and memory + +commit 404912f3cee76dd7a6b3928798304c64c55129bf +Author: Matteo Frigo +Date: Tue Apr 8 05:38:09 2003 -0400 + + Workaround gcc/sparc bug + +commit f34586737c6b234a5e2316dddbbe425331d4a5b3 +Author: Steven G. Johnson +Date: Tue Apr 8 01:34:12 2003 -0400 + + rumors + +commit 78f9ac7bedec0c22cb7fc5fccdbb2adc8b8c4f3b +Author: Steven G. Johnson +Date: Mon Apr 7 18:54:11 2003 -0400 + + added rdft2 paranoid mode + +commit 55b03e7ef8ab680294bbbe73059cb32cef82ac65 +Author: Steven G. Johnson +Date: Mon Apr 7 18:47:37 2003 -0400 + + added paranoid mode for r2r + +commit 8361bbcd9549f5c5819b31ce44c2e733e185f1a5 +Author: Steven G. Johnson +Date: Mon Apr 7 15:10:08 2003 -0400 + + whoops, sincos is predefined on some systems + +commit 0e1c9cf517e0d4010af5a35d10d141b2d74f7d0e +Author: Matteo Frigo +Date: Sat Apr 5 16:50:57 2003 -0500 + + bp->destroy_input was not initialized + +commit 7b13a4d8dfbf05ed699e7a1a533e7edf9355e2bc +Author: Matteo Frigo +Date: Sat Apr 5 09:29:11 2003 -0500 + + Asserted correctness conditions for tainted pointers. + + (For now, use CK() while we test. They should be changed into + A() at some point.) + +commit 6b16dfb3e11fcfa65d2064af8ee1c66f0e0ba2a2 +Author: Matteo Frigo +Date: Sat Apr 5 08:18:23 2003 -0500 + + Untaint pointers before zero'ing arrays and before hashing + +commit 1495e7c627b502d282f4fb290357d6fe573e12dd +Author: Matteo Frigo +Date: Sat Apr 5 07:11:56 2003 -0500 + + Alignment check did not work with icc, which seems to be + confused by the fact that the variable is not used. + +commit e013a83a5d1fb9e98a7d035baa3e4c5a89f768f1 +Author: Matteo Frigo +Date: Sat Apr 5 06:41:20 2003 -0500 + + More paranoid paranoid-check + +commit 377dd60fc68c62595e87882b3a5caede183a1251 +Author: Matteo Frigo +Date: Sat Apr 5 06:19:25 2003 -0500 + + 0 == x & 7 parses as (0 == x) & 7, which is wrong + +commit 109ea5550e130de0017dcdf2665c0872ff776e98 +Author: Steven G. Johnson +Date: Fri Apr 4 21:35:49 2003 -0500 + + alignment checks + +commit 97c940cb1b38b75289d99b2206d77a13db97f6fb +Author: Steven G. Johnson +Date: Fri Apr 4 21:04:14 2003 -0500 + + prevent infinite loops in exhaustive planning + +commit 20a0d16cc3bf2a26e0e5b2ed4f1691c617ab676e +Author: Steven G. Johnson +Date: Fri Apr 4 20:58:20 2003 -0500 + + split/unsplit guru interface + +commit ec77ade6672c46fde379e806bb25f26569eaa874 +Author: Matteo Frigo +Date: Fri Apr 4 20:39:55 2003 -0500 + + Need UNTAINT in verifier too. + +commit 2fd0ede87b74bd6a6b325910eb68ce55ee69ae66 +Author: Matteo Frigo +Date: Fri Apr 4 19:36:46 2003 -0500 + + Forgot #if HAVE_SIMD + +commit 0509bf08e01662eb716c8038093caab6bbbe867e +Author: Matteo Frigo +Date: Fri Apr 4 19:30:37 2003 -0500 + + Keep track of two separate taint bits + +commit dc9c49340a92349a47d46befc4f85937b95911c5 +Author: Steven G. Johnson +Date: Fri Apr 4 19:16:32 2003 -0500 + + added NO_SIMD problem flag, made UNALIGNED an API issue (taints input pointers) + +commit 1b8c8e9e88fa0f39226f2a8a853a07719d4faf40 +Author: Steven G. Johnson +Date: Fri Apr 4 18:14:14 2003 -0500 + + bugfix in buffered: wrong pointers passed for cldrest; also use TAINT instead of UNALIGNED in buffered2 + +commit 99fccbefe65b6e39c9b4e9be40e647facb900b4f +Author: Matteo Frigo +Date: Fri Apr 4 17:19:51 2003 -0500 + + Reverted previous change, committed accidentally + +commit db841c316cbd202532fd5b428396e5f4e9c74cf0 +Author: Matteo Frigo +Date: Fri Apr 4 17:18:39 2003 -0500 + + What was I thinking? + +commit 6235b967442a2150ad1e7100ae39070ecbee0ca9 +Author: Matteo Frigo +Date: Fri Apr 4 17:18:21 2003 -0500 + + [empty commit message] + +commit 4d690f88fdc36870e18b359db01ee23dbc005d72 +Author: Steven G. Johnson +Date: Fri Apr 4 16:48:32 2003 -0500 + + added --enable-debug-alignment + +commit 8890a79f285088b2b04ca1c2db939a582ac0328e +Author: Steven G. Johnson +Date: Fri Apr 4 16:29:43 2003 -0500 + + X(taint) prototype, define corresponding function only if HAVE_SIMD + +commit 3f29be3cc8a63846e725e496ae01474af84ab9fc +Author: Matteo Frigo +Date: Fri Apr 4 16:15:53 2003 -0500 + + Initial checkin of tained pointers + +commit faad01bdd384c083438df8ef016b8a18804cb72a +Author: Matteo Frigo +Date: Fri Apr 4 13:12:58 2003 -0500 + + More conservative preservation of alignment + +commit ac40b45c34f80bd09d25405935c3722528595a97 +Author: Steven G. Johnson +Date: Thu Apr 3 23:16:27 2003 -0500 + + plan/execute with aligned stack + +commit 978b7f409d31dde15736857998dada802a3ef49c +Author: Steven G. Johnson +Date: Thu Apr 3 15:40:01 2003 -0500 + + whoops, missed FFTW_MEASURE in fftw3.f + +commit 3274f607dea4bbf61b89f1d09703054007b28776 +Author: Steven G. Johnson +Date: Thu Apr 3 13:44:46 2003 -0500 + + use WITH_ALIGNED_STACK for experimental semaphore stuff, too + +commit 345df91b8bab3216268ca697850bc00767799265 +Author: Matteo Frigo +Date: Thu Apr 3 09:04:23 2003 -0500 + + Removed old file + +commit a36ad0e14ceb92c16cdc3bec19938c53c69f79a5 +Author: Matteo Frigo +Date: Thu Apr 3 07:50:43 2003 -0500 + + Improved stack-alignment hack + +commit c4f4e2d7d432203a0f99e3a50b29168c3d653a83 +Author: Steven G. Johnson +Date: Thu Apr 3 02:37:57 2003 -0500 + + use aligned stack for experimental semaphores, too + +commit cea2d48a884c03d448b9c688a192081e3e984983 +Author: Steven G. Johnson +Date: Thu Apr 3 02:17:58 2003 -0500 + + whoops + +commit c3bdcb8375c4c5181c0c642b0331d2a7268757f8 +Author: Steven G. Johnson +Date: Thu Apr 3 01:58:32 2003 -0500 + + fix(?) for SIMD thread problems + +commit 13dde386673933410cafa316f241cdc6544ecd65 +Author: Steven G. Johnson +Date: Wed Apr 2 20:33:12 2003 -0500 + + noted n=1 REDFT01 case + +commit 4a2c5556d9c6d080f3c3fee8c87d0aee50c12531 +Author: Steven G. Johnson +Date: Wed Apr 2 20:32:07 2003 -0500 + + note about n=2 REDFT00 formula + +commit ac5fe8c3ecce10f2e79f84279ce6e406db3891e8 +Author: Steven G. Johnson +Date: Wed Apr 2 20:30:10 2003 -0500 + + note about undefined REDFT00 + +commit 4761b3e61b5cf393deeacf6eba73d9f3a35e2d12 +Author: Steven G. Johnson +Date: Wed Apr 2 20:18:03 2003 -0500 + + noted n=1 RODFT01 case + +commit 00cd3721f0f757f691e62c836aff445fece4a9ef +Author: Steven G. Johnson +Date: Wed Apr 2 20:14:07 2003 -0500 + + corrected definitions + +commit 20545fe3112a9aa8bd9529129f24586a66f39f9d +Author: Steven G. Johnson +Date: Wed Apr 2 19:43:59 2003 -0500 + + added REODFT_KINDP, fixed nontrivial test for R2HC11 and HC2R11 (not that we support these yet anyway) + +commit dcd456710f59aea75abb5a4b62ad7b8c8592c28f +Author: Steven G. Johnson +Date: Wed Apr 2 19:16:54 2003 -0500 + + size 2 hc2r and dht are equivalent to r2hc + +commit dd3db55bba543cc4db74f3760716a251892089a9 +Author: Steven G. Johnson +Date: Wed Apr 2 15:09:08 2003 -0500 + + noted overwriting in upgrading section + +commit 4752fd3dcd81d75371bc667be6ab701ee36a24d3 +Author: Matteo Frigo +Date: Wed Apr 2 05:25:56 2003 -0500 + + Moved with_aligned_stack to its own file + +commit 821f37e9c6396afa7dcf22eae25e2ddb56f16218 +Author: Matteo Frigo +Date: Tue Apr 1 21:11:31 2003 -0500 + + Fixed comments + +commit 44b77936443c9dcbba1ccf21d3e90c2426a46e01 +Author: Matteo Frigo +Date: Tue Apr 1 20:57:39 2003 -0500 + + Alignment hacks + +commit 52974f9347f673ccfc5eca68ed2af2e39f0ae148 +Author: Steven G. Johnson +Date: Tue Apr 1 14:26:48 2003 -0500 + + phew, no, previous version was okay + +commit f599fa6d8cb159f0e636411e51f0bd07feca296e +Author: Steven G. Johnson +Date: Tue Apr 1 14:26:15 2003 -0500 + + whoops, crap + +commit da939ebd27d69c1e3693ebf71f81060e816af54e +Author: Matteo Frigo +Date: Tue Apr 1 08:01:06 2003 -0500 + + support sse2 in forthcoming gcc-3.3 + +commit bad66cbc1963d1beecba1205ff4d528026003427 +Author: Steven G. Johnson +Date: Tue Apr 1 01:17:15 2003 -0500 + + comment + +commit bde4d633afdc37f663c31f7aa2c4b3f8673e9607 +Author: Steven G. Johnson +Date: Tue Apr 1 01:16:46 2003 -0500 + + noted ac_check_headers + +commit 0e70968689aed47b11b44eb15752b97e21534366 +Author: Steven G. Johnson +Date: Tue Apr 1 01:11:31 2003 -0500 + + comment + +commit 716a92cca66059e083cc6dc764db18de707a6318 +Author: Steven G. Johnson +Date: Tue Apr 1 01:06:53 2003 -0500 + + documented autoconf tests, so that cycle.h can be distributed separately + +commit a081cb59d2fbd65042f4a1cec68ec04698a03594 +Author: Steven G. Johnson +Date: Mon Mar 31 22:12:02 2003 -0500 + + IRIX is all-caps + +commit c21fee75eade0b3c38780e252bb0dbe24383d2cf +Author: Steven G. Johnson +Date: Mon Mar 31 22:11:42 2003 -0500 + + noted Irix fix + +commit 0521214bc9e4b224ee18c31c165c8971d5d09fc6 +Author: Steven G. Johnson +Date: Mon Mar 31 22:10:33 2003 -0500 + + whoops + +commit e42bd5b20e10661a6cd8228c3b19ee7d8f1a1602 +Author: Steven G. Johnson +Date: Mon Mar 31 22:04:35 2003 -0500 + + use ithreads_init so as not to confuse fftw 2 users + +commit 95c74b4b2e3ef14b347ae7b50fdb455d6a7aa719 +Author: Steven G. Johnson +Date: Mon Mar 31 22:00:42 2003 -0500 + + IRIX lossage + +commit 746ced9c6d3a5d53c7b95090cbb99fcfd0b07344 +Author: Steven G. Johnson +Date: Mon Mar 31 21:19:20 2003 -0500 + + check for -openmp (icc) among the OpenMP flags (TODO: make this a + separate macro, with a loop instead of repeated checks) + +commit 589adf0e340eafbabdd43f5beacae6740e9e64a0 +Author: Steven G. Johnson +Date: Mon Mar 31 17:12:19 2003 -0500 + + clarification + +commit 4242c9c8bf63111190cbcccd162a224af036e5af +Author: Matteo Frigo +Date: Mon Mar 31 17:01:16 2003 -0500 + + More liberal test for solaris CC + +commit d5928079a514ffaba5eedc2cd5ce76eb2dd9fa9b +Author: Matteo Frigo +Date: Mon Mar 31 15:13:33 2003 -0500 + + Allow x86-64 simd + +commit b7a2252e112c67968e6695c7ef13e375a04d23d1 +Author: Matteo Frigo +Date: Mon Mar 31 15:13:21 2003 -0500 + + Added x86-64 timer code + +commit 7f0d1b516cd025f72f304fdeb210c563b94bff31 +Author: Steven G. Johnson +Date: Mon Mar 31 13:10:54 2003 -0500 + + updated + +commit 914e74201ca244b441f7f971d2f05aced6aa405c +Author: Steven G. Johnson +Date: Mon Mar 31 13:07:19 2003 -0500 + + updated + +commit 202febc5ba6f89ad6e834d4e36a01caf4bb5fde2 +Author: Steven G. Johnson +Date: Mon Mar 31 13:05:27 2003 -0500 + + colon + +commit 2deea3231269a3e4bcbdfa9498ad253ad1b26a48 +Author: Matteo Frigo +Date: Mon Mar 31 07:20:20 2003 -0500 + + Reorganized compiler bugs section (which is growing out of control) + +commit b4bb5597a0d941eeefe4ec01208c139d37e9fce2 +Author: Matteo Frigo +Date: Mon Mar 31 07:15:20 2003 -0500 + + solaris gcc bug appears to be also in 2.95.2 + +commit efb7874ecc58a7e086abf8428d481a6e19c4e0d7 +Author: Matteo Frigo +Date: Mon Mar 31 07:13:45 2003 -0500 + + Workaround works---there is another gcc/sparc bug elsehwere + +commit 8ab897ec05303f83b56d2e349c3dba59da173ef2 +Author: Matteo Frigo +Date: Mon Mar 31 07:08:56 2003 -0500 + + Grrr, workaround does not work. + +commit 32707cc1247ff03834c3d37fceb57f53e268da65 +Author: Matteo Frigo +Date: Mon Mar 31 07:02:23 2003 -0500 + + ADDMOD is now function, which seems to avoid gcc bugs. + +commit c4c605027021db9b801e3e2695c802ed6e1bc44a +Author: Matteo Frigo +Date: Sun Mar 30 16:40:26 2003 -0500 + + Workaround sparc gcc bug + +commit b77fba4459439cf3d969088c9edb010ab151a893 +Author: Steven G. Johnson +Date: Sun Mar 30 15:51:59 2003 -0500 + + note + +commit 91e398fb21a1c46fac8174a5f2faf0b79548e188 +Author: Steven G. Johnson +Date: Sun Mar 30 15:34:57 2003 -0500 + + make non-square UGLY, for now + +commit 4233309534b8e309bce0dafeeff64c29ac9f4b1c +Author: Steven G. Johnson +Date: Sun Mar 30 15:33:57 2003 -0500 + + added -o amnesia to forget_wisdom before each plan + +commit 055907acc9ab6486266e2601f13e76e768bd990f +Author: Matteo Frigo +Date: Sun Mar 30 09:41:27 2003 -0500 + + Report setup time in benchmark + +commit 6a49d54d587cc678c9a4063e3ed620c998d2602e +Author: Steven G. Johnson +Date: Sat Mar 29 20:21:15 2003 -0500 + + comment + +commit 1ccc921a0398eb08789ac928e28840a524100587 +Author: Steven G. Johnson +Date: Sat Mar 29 19:11:10 2003 -0500 + + slight change + +commit ee2cf222eef51c2ee38a761765c58ed6a2faa35e +Author: Matteo Frigo +Date: Sat Mar 29 18:46:16 2003 -0500 + + More relaxed definition of UGLYness + +commit 2afbef3c1cd1edca0168bc5341dac85de41790ba +Author: Steven G. Johnson +Date: Sat Mar 29 15:28:01 2003 -0500 + + no more cvs id strings in header files...I'm tired of having to rebuild everything after a commit + +commit 6922449e07c11f405107d7e5fc63d7dfb0379b5d +Author: Steven G. Johnson +Date: Sat Mar 29 15:22:28 2003 -0500 + + rdft2 stride unification + +commit 383f9ebcd63e13f756a57f0801b6bdc4080f4887 +Author: Steven G. Johnson +Date: Sat Mar 29 14:38:23 2003 -0500 + + preserve in-place-ness + +commit 4989fd02c94baef2f163547b88f643fcd1172a72 +Author: Steven G. Johnson +Date: Sat Mar 29 14:23:31 2003 -0500 + + make nowisdom the default + +commit a2f08dcbee1508f40df179ca67ed0ddcefd66f37 +Author: Matteo Frigo +Date: Sat Mar 29 14:13:18 2003 -0500 + + --verbose in paranoid-check produces too much output. Make it quiet. + +commit 90cdd14a2b342236ae6e8367d94ad2e29ecadd76 +Author: Steven G. Johnson +Date: Sat Mar 29 13:45:13 2003 -0500 + + fixed transpose bugs...need to check ri-ii before deciding whether Ntuple fits + +commit 71fc37fa553e50623f56a5fb21731833cb2d9dfd +Author: Matteo Frigo +Date: Sat Mar 29 08:10:40 2003 -0500 + + try more 2^k + +commit d4e0d59380ec69df5a4250ebd0f62f002c964e19 +Author: Matteo Frigo +Date: Sat Mar 29 08:05:41 2003 -0500 + + MIN_ALIGNMENT was defined after being used, causing crash in sse2. + +commit 101331222a4ff1189042a5997260a7e171ae1136 +Author: Steven G. Johnson +Date: Sat Mar 29 03:07:34 2003 -0500 + + real transposes are currently unused, and are not needed for MPI code either + +commit 55b24758612593bac4f6b7065d32b33b815eb81f +Author: Steven G. Johnson +Date: Sat Mar 29 02:58:39 2003 -0500 + + added general transpose + +commit c111a90447eb6c3c1a0058a93e97557beaaf1605 +Author: Steven G. Johnson +Date: Fri Mar 28 22:49:04 2003 -0500 + + added transposition option + +commit 90fb8971b2092e9a1fa97b10065683ba8af9247c +Author: Steven G. Johnson +Date: Fri Mar 28 22:09:22 2003 -0500 + + yikes, fixed incorrect applicability of transpose plans + +commit 5776651de7f7152e07630b99ee8445fb004131a1 +Author: Steven G. Johnson +Date: Fri Mar 28 22:06:14 2003 -0500 + + in the future, we might want to allow sz->rnk == 0, vecsz->rnk arbitrary to be converted to r2hc (the apply function already should work for this case)...disabled for now, though + +commit db6988d7af647595db1ef218c039bb2755070b59 +Author: Steven G. Johnson +Date: Fri Mar 28 19:12:08 2003 -0500 + + use most_unaligned in rdft2 + +commit bf69a12d650bc9daee88f41bd0a04bf1abe664c8 +Author: Steven G. Johnson +Date: Fri Mar 28 19:11:47 2003 -0500 + + slight change + +commit b79360114562af8636d8c3da2898cc7ed7df7b98 +Author: Steven G. Johnson +Date: Fri Mar 28 19:00:21 2003 -0500 + + output message when checks pass + +commit 14afb1d94a6d7eb23f853cd2097814989148a9e2 +Author: Steven G. Johnson +Date: Fri Mar 28 17:21:47 2003 -0500 + + added ifndef alloca around alloca stuff + +commit 6cccb2f2fed1d79204cbbb7e1ee44685bf2ed300 +Author: Matteo Frigo +Date: Fri Mar 28 13:45:50 2003 -0500 + + Proper alignment in rader + +commit 643528ab599946750ef668ce19266fe5a0bab5c1 +Author: Steven G. Johnson +Date: Fri Mar 28 12:43:23 2003 -0500 + + whitespace + +commit 8c9af83603806d8d769f21b1222dfe717068f7c6 +Author: Steven G. Johnson +Date: Fri Mar 28 12:41:39 2003 -0500 + + whoops, alloca stuff inside HAVE_ALLOCA + +commit 4f4ed55f3679a721e23cf9cb61e9180646f0f176 +Author: Steven G. Johnson +Date: Fri Mar 28 12:35:21 2003 -0500 + + make check can afford to be a little bigger + +commit e7db3e5ee6c6cbb0c24626dc09c00e23e46e70e7 +Author: Steven G. Johnson +Date: Fri Mar 28 12:31:32 2003 -0500 + + use same alloca macrology as configure script + +commit 3c6ec07b6659b60cfb8e77365e75c872ccacd66d +Author: Steven G. Johnson +Date: Fri Mar 28 03:05:15 2003 -0500 + + fallback is no longer needed for mingw + +commit cbc91a4cae1193e9e27ef5885e1bb37c548c191b +Author: Steven G. Johnson +Date: Fri Mar 28 02:58:45 2003 -0500 + + alloca fallback for gcc + +commit 37a6e5be53d9273006dc360b8dafe2e3e53356e5 +Author: Steven G. Johnson +Date: Fri Mar 28 02:49:59 2003 -0500 + + _alloca was added for MinGW, but it causes problems there + +commit 37adf3eddeb59f98c6d4e8888ddb4208b10fb42a +Author: Steven G. Johnson +Date: Thu Mar 27 22:06:07 2003 -0500 + + fixed most_unaligned for split format + +commit fae5ff2e94558a024ef43a1cd4470f5c68b4de17 +Author: Steven G. Johnson +Date: Thu Mar 27 19:01:58 2003 -0500 + + whoops + +commit 5a2216ff945775dcd769967d2a58125b51c4b3c0 +Author: Steven G. Johnson +Date: Thu Mar 27 19:00:20 2003 -0500 + + added pkg-config + +commit 669fc84978762faee9e8d48a7b852eca22ee4303 +Author: Steven G. Johnson +Date: Thu Mar 27 15:59:01 2003 -0500 + + fixed asserts + +commit 8108cd595625c0e28683a556df95de39588c7fb4 +Author: Matteo Frigo +Date: Thu Mar 27 15:49:53 2003 -0500 + + Do not adjust r/i pointers separately. + +commit d9b6e6ea20bc01290efaabb99405a0b10a3dadca +Author: Matteo Frigo +Date: Thu Mar 27 15:17:40 2003 -0500 + + iForgot to add files + +commit 9c79c521f6c57b91f21a90731610214d9dafca8e +Author: Matteo Frigo +Date: Thu Mar 27 15:10:41 2003 -0500 + + Specialized n simd codelets for unit vector stride. + +commit 7e309fd9c2284d234e3932b6d3a2d5bbcc44c9e0 +Author: Matteo Frigo +Date: Thu Mar 27 08:22:03 2003 -0500 + + Changed version number to beta2 + +commit 513db4fd67e83952d5e510cf7a1eb23fbd6ef2bb +Author: Matteo Frigo +Date: Thu Mar 27 06:37:07 2003 -0500 + + Changed alignment requirements for n1 simd codelets. Changed + mechanism for detecting lack of alignment. + +commit be8495756a69c610211f28e3f9a7ff20016eb901 +Author: Matteo Frigo +Date: Thu Mar 27 04:25:06 2003 -0500 + + Oops, wrong place for hook + +commit 575731d46f96f87a35f3a1a37dba70cc153728df +Author: Steven G. Johnson +Date: Thu Mar 27 02:37:52 2003 -0500 + + added comments to codelet makefiles, to aid people wanting to generate their own code + +commit 59245164a590789dd1ed892f910bc43a346b791b +Author: Steven G. Johnson +Date: Thu Mar 27 01:42:27 2003 -0500 + + Matteo is also a copyright holder + +commit c558091f6b4b0f37175f86a623e2f2376da9c01a +Author: Steven G. Johnson +Date: Thu Mar 27 01:41:08 2003 -0500 + + FORTRAN is officially Fortran, these days + +commit d0b28f4043bbc0aae200dd359e7ad52da98bc903 +Author: Steven G. Johnson +Date: Thu Mar 27 01:40:32 2003 -0500 + + punctuation + +commit 46bd3b7c143c2291021d10121a74d23936e3ccdd +Author: Steven G. Johnson +Date: Thu Mar 27 01:40:14 2003 -0500 + + don't use "wrapper" + +commit 9a8eba97546a52e4070f6910534c849009d027d8 +Author: Steven G. Johnson +Date: Thu Mar 27 01:37:53 2003 -0500 + + plural + +commit bc26c4cd5feb70158f734130ef3415ce557e207b +Author: Steven G. Johnson +Date: Thu Mar 27 01:35:32 2003 -0500 + + grammar + +commit 246a46ccdfc59616fdc3234ee8f773f54b9b5260 +Author: Steven G. Johnson +Date: Thu Mar 27 01:33:35 2003 -0500 + + better phrasing + +commit 8d4fae80f2b4558c3ec62f108316187e7dad2b84 +Author: Steven G. Johnson +Date: Wed Mar 26 22:47:58 2003 -0500 + + stddef.h should not be needed anymore for this file + +commit 1080fb42895231d251238b34f4af9458ee7329ec +Author: Steven G. Johnson +Date: Wed Mar 26 22:13:48 2003 -0500 + + added comments for Franz mode + +commit e995cc9d9c287c7681b4e8ff9e97dc57e5dcbdb4 +Author: Steven G. Johnson +Date: Wed Mar 26 22:11:58 2003 -0500 + + clarification + +commit cff23bce9ddaeddc3338be9cfcbc3cd3d57f2370 +Author: Steven G. Johnson +Date: Wed Mar 26 22:08:51 2003 -0500 + + commented on FRANZ codelets + +commit 0b33d349e4eab5f3fce6b0873cf0366e83e51d59 +Author: Steven G. Johnson +Date: Wed Mar 26 22:06:45 2003 -0500 + + updated + +commit 8467b9db21a1c618e7ccaf958299f9edc31bbb42 +Author: Steven G. Johnson +Date: Wed Mar 26 21:51:15 2003 -0500 + + disable DIF codelets, since they are never used (apparently) except + for some non-power-of-two sizes...improve support for the latter by + adding size 3, 5, and 6 q^2 codelets. + +commit 100f8e1667a8ffdc4ad997bbe4346603e7da122b +Author: Steven G. Johnson +Date: Wed Mar 26 20:07:11 2003 -0500 + + DHT has no forward/backward + +commit 9f5c7271cdd393f08d42a71669c9d3d1686ab641 +Author: fftw +Date: Wed Mar 26 19:46:12 2003 -0500 + + added hacky way to use an arbitrary flag + +commit 59d54e87e6bb971ba93e6b371aad0c3ee5d88d11 +Author: Matteo Frigo +Date: Wed Mar 26 19:44:31 2003 -0500 + + Better place to install hook + +commit b35aa5670a5cf242f215c8281c3c09097c3c740a +Author: Steven G. Johnson +Date: Wed Mar 26 19:40:28 2003 -0500 + + noted that the user should run make check if they think FFTW has a bug + +commit dd17b391f48608fdfe190c514eb865ff891689b9 +Author: Matteo Frigo +Date: Wed Mar 26 17:31:16 2003 -0500 + + Oops, what am I thinking + +commit 47c3588218fccd048fb32989c007dc693f402abc +Author: Matteo Frigo +Date: Wed Mar 26 17:23:56 2003 -0500 + + Grrr.... fixed bug in estimator + +commit a3f8ee308a4b9b1f83d1031991c9f8fdc55b3bc2 +Author: Matteo Frigo +Date: Wed Mar 26 17:16:19 2003 -0500 + + Oops---the flop count was right. The estimator is broken elsewhere. + +commit f2103b394847d39a74d720c5dc18b9f3139fc257 +Author: Matteo Frigo +Date: Wed Mar 26 14:28:41 2003 -0500 + + Fixed SIMD estimator + +commit 442a17b47519435071b0c7373c83cc50f5e4b826 +Author: Matteo Frigo +Date: Wed Mar 26 07:45:03 2003 -0500 + + Added twidsq simd codelets + +commit 9647b9a35046476b0697bb196f6ad80a1c81b763 +Author: Steven G. Johnson +Date: Tue Mar 25 23:33:03 2003 -0500 + + gensrc -> genfft + +commit e668b629605e9193d33403c9c87be52a7d08d134 +Author: Steven G. Johnson +Date: Tue Mar 25 23:32:16 2003 -0500 + + newline + +commit 76eeb4a83c788c638126d62924bbedb833573028 +Author: Matteo Frigo +Date: Tue Mar 25 19:17:08 2003 -0500 + + Noted need to add dif simd codelets + +commit 350bf8c788a6f8a0ec21b7b004ce7a83c163f511 +Author: Steven G. Johnson +Date: Tue Mar 25 13:03:47 2003 -0500 + + noted shift + +commit a5fa31a29076ae51d870e2db210b7f51aa46adbb +Author: Steven G. Johnson +Date: Tue Mar 25 13:02:47 2003 -0500 + + clarification + +commit 276ff68eb803fb179adefc146b05b4f616fd226f +Author: Steven G. Johnson +Date: Tue Mar 25 12:46:44 2003 -0500 + + need make after bootstrap + +commit f48787b41d83d8f21ec8ce19b275eaedf5316484 +Author: Steven G. Johnson +Date: Tue Mar 25 12:31:49 2003 -0500 + + slight change + +commit 7143220a87f7444e90964aadccece0c31bf3830b +Author: Steven G. Johnson +Date: Tue Mar 25 12:30:56 2003 -0500 + + libtool is also needed + +commit 212581eeb5c4011118653b3d8fe433b774bbcd1b +Author: Steven G. Johnson +Date: Tue Mar 25 12:29:52 2003 -0500 + + added code generator introduction + +commit e22b4de0a314136783316cc1acbbc7bf97ca105c +Author: Steven G. Johnson +Date: Tue Mar 25 11:51:49 2003 -0500 + + added support for REDFT/RODFT/DHT direct codelets + +commit cc149df36c0ddc161d91558da702572cd01f99c6 +Author: Steven G. Johnson +Date: Tue Mar 25 11:29:29 2003 -0500 + + noted ARM bug; thanks to Jay Treacy + +commit e313a7fb2e0c1c2524eaed8926b25055a38fb957 +Author: Matteo Frigo +Date: Tue Mar 25 07:55:54 2003 -0500 + + bugfix from Stefan + +commit dc62fc48ad26abb231c697a5a18b5f7ca64ab6fe +Author: Steven G. Johnson +Date: Mon Mar 24 15:59:08 2003 -0500 + + slight change + +commit 878030bb1ea7efd3b1e1dab02601732fd5c90c36 +Author: Steven G. Johnson +Date: Mon Mar 24 15:58:44 2003 -0500 + + caveat + +commit 776dd0aac7bb400bce14f59781f664062d7b4117 +Author: Steven G. Johnson +Date: Mon Mar 24 15:58:04 2003 -0500 + + warning about DHT + +commit 2bd26e46c0f7e3622be81d9922f0089923143c65 +Author: Matteo Frigo +Date: Mon Mar 24 08:34:14 2003 -0500 + + Oops + +commit 597693dba60d0535d890bbb5f161c3a01830a1ea +Author: Matteo Frigo +Date: Mon Mar 24 08:13:15 2003 -0500 + + Regression test for p4fftwgel + +commit 92603541cee018def425427f93dcb3739ab7c0f1 +Author: Steven G. Johnson +Date: Mon Mar 24 03:09:06 2003 -0500 + + make check is faster, old tests are in make bigcheck + +commit 518b188f2a8a30b7cbc2a5c34b335940afa54530 +Author: Steven G. Johnson +Date: Sat Mar 22 00:41:21 2003 -0500 + + note + +commit 82b8e611b2d1a65af695db0ddf0cf306a5804886 +Author: Steven G. Johnson +Date: Sat Mar 22 00:40:05 2003 -0500 + + whoops, line wrapping + +commit b9e7ade930fd2e2de8105a28ff7a8f32a799237f +Author: Matteo Frigo +Date: Fri Mar 21 15:10:00 2003 -0500 + + Franz-mode codelets even without SIMD. (disabled) + +commit bd548cc599b6178d2e1bdbc2c6abc08f276ae386 +Author: Matteo Frigo +Date: Fri Mar 21 09:09:30 2003 -0500 + + Bug is in netbsd-1.6, not 1.5 + +commit 1d1b6b166a1164c2499c4a7e5f9bd9b69f3cf5c3 +Author: Matteo Frigo +Date: Fri Mar 21 07:45:48 2003 -0500 + + const cast, should placate c++ compilers. + +commit 677ff57df2415f59cc701368e26dd23d1c6ec956 +Author: Steven G. Johnson +Date: Thu Mar 20 18:49:49 2003 -0500 + + added FAQ on why plans are array-specific + +commit f0c1a0a7c03bfb68f4559001c2b652aa7a601c0d +Author: Steven G. Johnson +Date: Thu Mar 20 16:12:56 2003 -0500 + + comment fix + +commit 3ac192669e4bbb596cc30adb429179fa58f11387 +Author: Steven G. Johnson +Date: Thu Mar 20 16:12:15 2003 -0500 + + noted comparison to NR + +commit 3f8a990d38ae5f796daa261636120dcb936acb2a +Author: Steven G. Johnson +Date: Wed Mar 19 20:13:16 2003 -0500 + + whoops, C99 complex didn't work if complex is a macro (as it is with glibc); thanks to Keh-Cheng Chu for the bug report + +commit faab1981e35c6596ac99e9c1e8379c77d92155fe +Author: Steven G. Johnson +Date: Wed Mar 19 16:52:54 2003 -0500 + + noted in help that --enable-k7 enables 3dnow, and that --enable-3dnow is only a fallback + +commit 297a4fd9785fe05d2149abf128413bd363fa2dbc +Author: Matteo Frigo +Date: Wed Mar 19 15:09:52 2003 -0500 + + New gcc bug. html.refs was not in repository/distribution. + +commit 8a81ec059d2c1c567c69a45f77d76b8f242c8836 +Author: Matteo Frigo +Date: Wed Mar 19 10:09:16 2003 -0500 + + Don't write wisdom if you don't have it. + +commit 4bc446d3e46e7a8c2f084d425e193e58f9ff76ec +Author: Matteo Frigo +Date: Tue Mar 18 15:44:41 2003 -0500 + + Added index entries for DHT. Similarly for DCT, DST + +commit 4a72bfaf1f333116de1e5e0a154bc87d17c9c234 +Author: Steven G. Johnson +Date: Tue Mar 18 14:50:04 2003 -0500 + + execute should not go through C api, for efficiency + +commit 22f933b01c30e0f68f46f8a73e474a1e8a893360 +Author: Matteo Frigo +Date: Tue Mar 18 06:14:51 2003 -0500 + + Renamed FFTW_IODIM, FFTW_R2R_KIND + +commit e57a38d55f979644a5fecd702c1d4bd105b1eac3 +Author: Steven G. Johnson +Date: Tue Mar 18 00:30:17 2003 -0500 + + added rfftwnd.eps to dist, so that transfig is not required for people trying to build other formats (e.g. ps); thanks to Brian Gough for the bug report + +commit f5713b796921f5e1cfded3ce96e33c6df0d09a8c +Author: Steven G. Johnson +Date: Mon Mar 17 15:17:59 2003 -0500 + + pointer to upgrading section from tutorial + +commit 7e222b6349b8a2bceeb8703d347715fb763efadd +Author: Steven G. Johnson +Date: Mon Mar 17 14:44:40 2003 -0500 + + make print_plan and fprint_plan, so that the former can be more easily called from other languages + +commit f358b64955871f01d87a42a05275f5f0cb5094e5 +Author: Steven G. Johnson +Date: Mon Mar 17 14:19:10 2003 -0500 + + whoops, forgot to change equation image links to .png + +commit ea32f5a93a88f6ddec9185886bbbea43cf8ed067 +Author: Matteo Frigo +Date: Mon Mar 17 04:15:50 2003 -0500 + + fixed c++ linkage problems + +commit de7c276d4b4ab36471c8dcb639d3c522d2cbe7cc +Author: Matteo Frigo +Date: Mon Mar 17 03:25:17 2003 -0500 + + Removed ``const'', otherwise c++ link fails + +commit f3bf675c6d0003e3087d634aab2ef34a6745dcb9 +Author: Steven G. Johnson +Date: Sun Mar 16 20:24:31 2003 -0500 + + fixed C++ annoyances: void* casts, and global variables are static by default(?!?) + +commit 45e54b3f9a8c0b5942cc21c0b2d2f19682d3a7c0 +Author: Steven G. Johnson +Date: Sun Mar 16 15:29:11 2003 -0500 + + ranlib bug is in binutils + +commit a17b7eb5a896ea6d7ca3f73fd7251bfc76de500d +Author: Steven G. Johnson +Date: Sun Mar 16 15:26:42 2003 -0500 + + ranlib Irix bug + +commit f482abd59b1c2afed27292d79bef782b935d0c51 +Author: Steven G. Johnson +Date: Sun Mar 16 15:13:35 2003 -0500 + + start with random tests + +commit a216647a57733c53d3407957caaaf759ed0dd700 +Author: Steven G. Johnson +Date: Sun Mar 16 15:00:04 2003 -0500 + + silenced some compiler warnings, eliminated unused variables, and fixed Makefile.am for f77funcs.h + +commit 2b581243067955d0e82eb7cf487def793b8f66b6 +Author: Steven G. Johnson +Date: Sun Mar 16 14:55:13 2003 -0500 + + whoops + +commit 058c4751ed4a98a52e6a878c78335f4997c60294 +Author: Steven G. Johnson +Date: Sun Mar 16 14:28:22 2003 -0500 + + 3dnow is float + +commit 0b50f9ef3433e59f0b9cc7983652a8fe3c361fdf +Author: Steven G. Johnson +Date: Sun Mar 16 14:27:45 2003 -0500 + + fixed k7 docs + +commit 9179a17f1ba8db6733ccb2dbe541aa3f5f59727e +Author: Steven G. Johnson +Date: Sun Mar 16 14:19:10 2003 -0500 + + SGI compilers now support inline + +commit 353d40e964502f46aba99f094c08fd610cb9fc2c +Author: Steven G. Johnson +Date: Sun Mar 16 14:18:32 2003 -0500 + + cruft + +commit 455c3aa4c3e0cc6d5404c78ef12ed70b8751da45 +Author: Steven G. Johnson +Date: Sun Mar 16 14:15:47 2003 -0500 + + texinfo doesn't like commas in nodes + +commit 323b6d34cebb6be520075efaf4eeef0a369a6635 +Author: Steven G. Johnson +Date: Sun Mar 16 13:52:04 2003 -0500 + + updated + +commit 7762fe2f89dc86791560cad9326ece6fbdbceaf7 +Author: Steven G. Johnson +Date: Sun Mar 16 13:47:44 2003 -0500 + + f77funcs.c -> f77funcs.h so that people don't try to compile it + +commit acd3f5b16c0b85acfad30bb086199cc65bc6b326 +Author: Steven G. Johnson +Date: Sun Mar 16 13:46:11 2003 -0500 + + minor changes + +commit 8d4f8a05ac24ce13ba6adea137099c22c6f5362b +Author: Steven G. Johnson +Date: Sun Mar 16 13:39:24 2003 -0500 + + updated compiler bug list + +commit dc84fdefd84cac3bd6ecf521f48ca6cab0ae2b0e +Author: Steven G. Johnson +Date: Sun Mar 16 13:39:07 2003 -0500 + + noted how to set CC + +commit d71b55ff07b10fe5ee5dc24799511bdbb0b3f772 +Author: Steven G. Johnson +Date: Sun Mar 16 13:01:01 2003 -0500 + + TODONE + +commit 454b2a79327b2582f18024204a6ab683d97f9f41 +Author: Steven G. Johnson +Date: Sun Mar 16 13:00:42 2003 -0500 + + yikes, bugfix + +commit e741c61f2ab8b259c217e9e25adbcece21a6be4b +Author: Steven G. Johnson +Date: Sun Mar 16 10:26:28 2003 -0500 + + whoops + +commit f0073024ddb3bb621a4c71fcc7ddb575adf42871 +Author: Matteo Frigo +Date: Sun Mar 16 09:24:19 2003 -0500 + + Report SIMD extensions in version string + +commit 0b40f7e79a8110bd4d2215f9d81a3d100f1e9ecc +Author: Steven G. Johnson +Date: Sat Mar 15 18:56:11 2003 -0500 + + more verbose output + +commit 1310aa1ef6043afa44bc6c8bcc2d7b3bae66190c +Author: Steven G. Johnson +Date: Sat Mar 15 17:41:25 2003 -0500 + + a couple of additional non-Unix instructions + +commit 12cb13aafd73275762b5f2c098c436457b8f9be9 +Author: Steven G. Johnson +Date: Sat Mar 15 17:15:26 2003 -0500 + + hyphen + +commit 7aea3d41ed7a9dde86b14f410caf606a05f15fd5 +Author: Steven G. Johnson +Date: Sat Mar 15 17:12:29 2003 -0500 + + softened + +commit 2a251916b17e7380f33bf556d666781828819789 +Author: Steven G. Johnson +Date: Sat Mar 15 17:09:44 2003 -0500 + + added FAQ, used PNGs + +commit d3669c90789fbfcc99404a8fbd8d90540fae6c52 +Author: Steven G. Johnson +Date: Sat Mar 15 15:29:43 2003 -0500 + + great copyright update + +commit 1b82fbfbe632120cba76c9c6107bd3e1abbe4547 +Author: Steven G. Johnson +Date: Sat Mar 15 15:14:02 2003 -0500 + + threads in make check + +commit a7ebafd6aec670afd0a9d5165893abf7d7413870 +Author: Steven G. Johnson +Date: Sat Mar 15 15:11:24 2003 -0500 + + fixed const warnings + +commit b72d4726555aa5ef40e612f712eaa2190324c89e +Author: Steven G. Johnson +Date: Sat Mar 15 15:08:25 2003 -0500 + + make sure spawn_loop size > 1 (it has to be at least > 0 lest we crash, but > 1 is an optimization) + +commit 8f82cc0405e8d264d1a201e4b65d0e82e5822834 +Author: Matteo Frigo +Date: Sat Mar 15 14:00:17 2003 -0500 + + hpux seems to want machine/sys/inline.h as opposed to + machine/inline.h. + +commit 195978c28fbdd1b1ead25d381c9c6af6f71a74fb +Author: Steven G. Johnson +Date: Sat Mar 15 13:36:56 2003 -0500 + + Sourceforge is really SourceForge.net, and is run by VA + +commit 93eaa99ca18255b538bd37c4742ff87898a9350c +Author: Steven G. Johnson +Date: Sat Mar 15 13:34:05 2003 -0500 + + comma + +commit aa16c88c1efdf9283884a6f3c28bda36d54c1cb9 +Author: Steven G. Johnson +Date: Sat Mar 15 13:31:42 2003 -0500 + + fixed AMD company name + +commit fa4887fa3ddccb2e53b50158d92f8cb9da3223f2 +Author: Steven G. Johnson +Date: Sat Mar 15 13:29:41 2003 -0500 + + minor changes + +commit 689f73454e57451cc4ceca48e6c9b3856550cc3f +Author: Steven G. Johnson +Date: Sat Mar 15 13:13:55 2003 -0500 + + more emitter->read_char renaming + +commit 469d7370865e70079d60fc5d2144c477847ff50b +Author: Steven G. Johnson +Date: Sat Mar 15 13:08:45 2003 -0500 + + more wisdom docs, noted wisdom utilities + +commit 69c2e6ee0d6523c9181828e9d918d00390f1b07f +Author: Steven G. Johnson +Date: Sat Mar 15 11:41:32 2003 -0500 + + compound adjectives are hyphenated + +commit 1c816b975a4d35c3296bceb2700bc665c2838788 +Author: Steven G. Johnson +Date: Sat Mar 15 11:40:30 2003 -0500 + + fftw does support another type of packed array via r2r + +commit 4510d672da97fc9273a574d9cad23f807c811192 +Author: Steven G. Johnson +Date: Sat Mar 15 11:29:12 2003 -0500 + + write_char/read_char for export/import functions + +commit 5d042765f68d22c08849f8120b432d637364a95a +Author: Steven G. Johnson +Date: Sat Mar 15 11:19:19 2003 -0500 + + comments + +commit ec4d319ec4d855dd2e5c3521429d77dcba1deffa +Author: Matteo Frigo +Date: Sat Mar 15 10:08:26 2003 -0500 + + Enabled randomized-cse + +commit 85619e6f972e3105691588bba210448ad468726f +Author: Matteo Frigo +Date: Sat Mar 15 09:47:49 2003 -0500 + + Changed to 3.0-beta1 + +commit 6c58169a5ef565ec595054c8a1a3644a119575ad +Author: Matteo Frigo +Date: Sat Mar 15 09:07:31 2003 -0500 + + First complete draft + +commit e014222e1611b0fda35eb4e81010d764371f645a +Author: Matteo Frigo +Date: Sat Mar 15 08:37:52 2003 -0500 + + EMITTER is a misnomer + +commit b4e71cdebd8e08a8e4cb6e4e021c9839b0240220 +Author: Matteo Frigo +Date: Sat Mar 15 05:50:50 2003 -0500 + + Revision, wisdom tutorial, acks. + +commit 304d6a33a960a6867e345b7a2391f580de183901 +Author: Steven G. Johnson +Date: Fri Mar 14 22:59:04 2003 -0500 + + noted OpenMP + +commit f0132ff87cdec8cce3eec22776267630ce5d52a8 +Author: Steven G. Johnson +Date: Fri Mar 14 22:38:49 2003 -0500 + + comment + +commit d32e3536671b2ddf95fd19eefd595903f53369c9 +Author: Steven G. Johnson +Date: Fri Mar 14 22:38:30 2003 -0500 + + comments + +commit 758a708f03680fe53ce46466e344370a9537adfc +Author: Steven G. Johnson +Date: Fri Mar 14 22:38:05 2003 -0500 + + reformatting + +commit f31a618619a119ba5df49807d225f5fef53e2acc +Author: Steven G. Johnson +Date: Fri Mar 14 22:26:28 2003 -0500 + + whoops + +commit 47acccb2c662f75a8b9b082032072bfa154f13e5 +Author: Steven G. Johnson +Date: Fri Mar 14 22:11:23 2003 -0500 + + some threads fixes, and added experimental semaphore (pre-thread-spawning) and Linux spinlock support + +commit b3f95134caa95e434d418ab40f2bb57c07521a33 +Author: Steven G. Johnson +Date: Fri Mar 14 20:50:46 2003 -0500 + + whoops + +commit caedcb4f9b8df5449616654ec8782156a2e63e7f +Author: Steven G. Johnson +Date: Fri Mar 14 18:23:03 2003 -0500 + + added note that FFTW_PATIENT will disable threads if they are not beneficial + +commit 34677912b28d4342f4ac1f84e27ee248d2c9ca71 +Author: Steven G. Johnson +Date: Fri Mar 14 18:20:44 2003 -0500 + + made fftw_cleanup* more restrictive, in that we don't want to + guarantee that previously created plans will still work (they won't, + in the case of threaded plans and fftw_cleanup_threads), and there is + no reason to provide such a guarantee anyway. + +commit 4311c764859ea3a4a45fbb507ff0e131d12a5d44 +Author: Matteo Frigo +Date: Fri Mar 14 17:23:13 2003 -0500 + + Moved version.c from kernel/ into api/ + +commit b79acfd84c9dc9bf6ce933ef72af7aafa01623e4 +Author: Matteo Frigo +Date: Fri Mar 14 17:19:50 2003 -0500 + + icc-7.0 requires -openmp + +commit 36f49567ecc9ec71ab72b760ee70ceb688f51f4c +Author: Matteo Frigo +Date: Fri Mar 14 14:47:52 2003 -0500 + + Ensure that one can do make dist given the distribution + +commit 266bb8c14f0aa494b54fcaf1fd0b517c646d5618 +Author: Matteo Frigo +Date: Fri Mar 14 14:38:11 2003 -0500 + + Dist fftw3.pdf, not fftw.pdf + +commit a79801bc40a8ba8ba6f7b27f78aebb9426010b5a +Author: Matteo Frigo +Date: Fri Mar 14 14:36:25 2003 -0500 + + Support -onthreads=%d + +commit 84c91507e6f7f6a050cc8651c7ee8c017d5d1b2f +Author: Steven G. Johnson +Date: Fri Mar 14 14:34:21 2003 -0500 + + comment + +commit a8ef843faf74d0384c6ee1320b456f6aae56c5b2 +Author: Steven G. Johnson +Date: Fri Mar 14 14:33:27 2003 -0500 + + whoops + +commit 3e4f6ed2ad2fda1dbaa2bb444f81cbf116ab1931 +Author: Steven G. Johnson +Date: Fri Mar 14 12:32:18 2003 -0500 + + fftw_real is gone + +commit b55295b022d814a869b207fea2dbbb79c5091525 +Author: Steven G. Johnson +Date: Fri Mar 14 12:26:04 2003 -0500 + + typos + +commit 469579587defd8532f362c0ca4a2935532bae16a +Author: Matteo Frigo +Date: Fri Mar 14 06:21:43 2003 -0500 + + More BENCH_DOC strings + +commit 18f0d31d803f348a8494ac190b4b9ff8d9be7a97 +Author: Matteo Frigo +Date: Fri Mar 14 05:58:53 2003 -0500 + + Fixed xref's + +commit d39f035994e443ebbc933eae51b3d9116bc50bb4 +Author: Matteo Frigo +Date: Fri Mar 14 05:38:26 2003 -0500 + + Revised manual (esp. intro and tutorial), fixed texinfo hackery + for figures. + +commit f0cf0419996f46abb0bdf85068d67c1f88435a87 +Author: Steven G. Johnson +Date: Wed Mar 12 02:42:33 2003 -0500 + + redirect users from guru execute to advanced interface, if possible + +commit d30d60239f8f57975f53876649f04f04458b8d90 +Author: Steven G. Johnson +Date: Wed Mar 12 02:35:22 2003 -0500 + + punctuation + +commit cc3b4e3f2fd1880b0a9ced57de8bc592ac868aab +Author: Steven G. Johnson +Date: Wed Mar 12 02:28:51 2003 -0500 + + use correct heading level + +commit 16e33bb6e9eba6c6ac3a3b5e88192f0937cbc79a +Author: Steven G. Johnson +Date: Wed Mar 12 02:24:37 2003 -0500 + + html generation + +commit 8ea08e261cef0528db1c181268c6aabca6c52e50 +Author: Steven G. Johnson +Date: Wed Mar 12 01:44:00 2003 -0500 + + added equation GIFs + +commit 6b511ad0e8551382fb008d5f7d9d6db7c923f5d7 +Author: Steven G. Johnson +Date: Wed Mar 12 01:43:27 2003 -0500 + + punctuation + +commit b223dbcdf2607d546dcde4593dfeb29740b5a2c3 +Author: Steven G. Johnson +Date: Wed Mar 12 01:26:46 2003 -0500 + + punctuation + +commit 8e6421b39b31952d4cde709e9a7dc68146eeac77 +Author: Steven G. Johnson +Date: Wed Mar 12 01:25:12 2003 -0500 + + added multi-dimensional transform definitions + +commit da7ac31fa42d9b594d9a458bc86b31e326d2631b +Author: Steven G. Johnson +Date: Wed Mar 12 00:14:03 2003 -0500 + + slight changes + +commit 4fa36533cd5df28fb24a7cd7678c4ff3a2b8e1f7 +Author: Steven G. Johnson +Date: Wed Mar 12 00:06:34 2003 -0500 + + typo + +commit 93fdbbd4434ff6db48765645e2af3eb2031caece +Author: Steven G. Johnson +Date: Tue Mar 11 23:50:43 2003 -0500 + + added 1d version of What FFTW Really Computes + +commit 989a15455a04e193bd71a2fe4b1daea5649d0f2d +Author: Steven G. Johnson +Date: Tue Mar 11 21:17:54 2003 -0500 + + note in upgrading section about FFTW_PATIENT + +commit f94fc8414c8477ad076f17bed5a1bffe87557ea9 +Author: Steven G. Johnson +Date: Tue Mar 11 15:18:39 2003 -0500 + + added cycle-counter section + +commit 32e58f9ac101c22551198abe31c5021196f69f0e +Author: Steven G. Johnson +Date: Tue Mar 11 14:53:44 2003 -0500 + + more ideas + +commit 54102c10c10da11afcf1dac0451ce4a1e064be8c +Author: Steven G. Johnson +Date: Mon Mar 10 17:41:35 2003 -0500 + + noted that indirect should probably be merged with rank-geq2, to make a rank-split solver + +commit e93a7d1eda3519a9467a0d1a7af57a176aae195c +Author: Steven G. Johnson +Date: Fri Mar 7 03:01:52 2003 -0500 + + added non-Unix installation instructions + +commit 910a5988b2529e4ebd33372540c9db14626a3e8c +Author: Steven G. Johnson +Date: Fri Mar 7 02:30:59 2003 -0500 + + also talk about stack alignment with SSE/SSE2 + +commit 620f6439ff6d382e7f79fba9735243ffbc4e98d6 +Author: Steven G. Johnson +Date: Fri Mar 7 02:24:07 2003 -0500 + + made warning more dire + +commit 6c49e3a0d90853a504b55ee2bb9e67e6961334c6 +Author: Steven G. Johnson +Date: Fri Mar 7 02:13:25 2003 -0500 + + fix + +commit 076cf960691702683f560140c3c90932f531c802 +Author: Steven G. Johnson +Date: Fri Mar 7 02:09:55 2003 -0500 + + number + +commit abe3e1b3e2ac5d1ce15dd74544550011079f056c +Author: Steven G. Johnson +Date: Fri Mar 7 02:09:08 2003 -0500 + + fix + +commit a43149065f2c521c8ce705f9ac0eeb519899ec2b +Author: Steven G. Johnson +Date: Fri Mar 7 02:08:01 2003 -0500 + + minor + +commit cb19343373774be75d78469cbcd3ac4f0f4a903a +Author: Steven G. Johnson +Date: Fri Mar 7 02:04:45 2003 -0500 + + minor fix + +commit d962180e504c71e46dc5b2f71d2304c254fcdace +Author: Steven G. Johnson +Date: Fri Mar 7 01:58:15 2003 -0500 + + cross-ref + +commit 35ef1ce130da4c0389a2f7cef5eaab36dbd614ae +Author: Steven G. Johnson +Date: Fri Mar 7 01:57:31 2003 -0500 + + minor + +commit 28fe03b9f79a6a80be8cc0d02cfc87e090f408d5 +Author: Steven G. Johnson +Date: Fri Mar 7 01:53:28 2003 -0500 + + more installation manual + +commit 650bf3b91d1fe392906f9aa25faed1707244f4f4 +Author: Steven G. Johnson +Date: Fri Mar 7 00:43:40 2003 -0500 + + GNU-lly correct + +commit aec18000f9851e8985d704ee50f49ea4d17f324e +Author: Steven G. Johnson +Date: Fri Mar 7 00:38:48 2003 -0500 + + started installation section + +commit f7bf8016fa681c46c51385297a58d6dae611862f +Author: Steven G. Johnson +Date: Fri Mar 7 00:25:02 2003 -0500 + + added --without-cycle-counter option as a last resort + +commit e97d01d48d003b290d6d2da7dc53cea35c90357d +Author: Steven G. Johnson +Date: Fri Mar 7 00:07:12 2003 -0500 + + macros with () arguments were only standardized in C99, and we don't need them anyway + +commit 459a56abf74ce71af7c63047b31d39f7befefbb9 +Author: Steven G. Johnson +Date: Thu Mar 6 23:10:41 2003 -0500 + + wording + +commit 20d77f4e2a461fab512a8b5cd0ccd301d42f3673 +Author: Steven G. Johnson +Date: Thu Mar 6 23:03:03 2003 -0500 + + parallelism + +commit 881feeb3f3d4813a30da4baf5d71b8af8ca72d23 +Author: Steven G. Johnson +Date: Thu Mar 6 23:01:47 2003 -0500 + + additions to upgrading chapter + +commit 59f6ac21ab762470d0d4740130fa2131cc3f684e +Author: Steven G. Johnson +Date: Thu Mar 6 22:39:36 2003 -0500 + + noted additional humility of FFTW 3 wisdom + +commit cf933ec73d68c2839a79d1fc53ba1198dc63fe39 +Author: Steven G. Johnson +Date: Thu Mar 6 22:32:44 2003 -0500 + + renaming + +commit 724b52700268a45264d168aaf7a63977a16af8bb +Author: Steven G. Johnson +Date: Thu Mar 6 22:31:00 2003 -0500 + + added placeholder for wisdom reference + +commit c286ee068195c75e012cdf36534aa5f4154b394f +Author: Steven G. Johnson +Date: Thu Mar 6 22:29:38 2003 -0500 + + wrote upgrading chapter + +commit 35c5a163f14e561b45a226dece35564f5773ce69 +Author: Steven G. Johnson +Date: Thu Mar 6 18:01:10 2003 -0500 + + slight change + +commit de53b4abb5481ee319ffcfc4e4b215861d814ed6 +Author: Steven G. Johnson +Date: Thu Mar 6 18:00:43 2003 -0500 + + placeholder for upgrade chapter + +commit a8a06d66b81a785625077d6de4fb8699ee4c718f +Author: Steven G. Johnson +Date: Thu Mar 6 13:47:49 2003 -0500 + + whoops + +commit a128a59973d9f74fa491a56fc22b374ad69a5ebc +Author: Steven G. Johnson +Date: Thu Mar 6 13:36:38 2003 -0500 + + strengthed warning about time + +commit 271819893ab4e7634f8cee294f9c68612ff811f2 +Author: Steven G. Johnson +Date: Thu Mar 6 13:35:42 2003 -0500 + + noted -t in example + +commit 08b64e3b15f7ad163677a348ba8d0a1a62720b07 +Author: Steven G. Johnson +Date: Thu Mar 6 13:21:03 2003 -0500 + + pay attention to WINDOWS_F77_MANGLING + +commit 5428bbf998b549e46c06f6f3e2ed9ff435304631 +Author: Steven G. Johnson +Date: Thu Mar 6 02:52:30 2003 -0500 + + punctuation + +commit 1462402c458e7a21360fcde1e6a5e9a023987747 +Author: Steven G. Johnson +Date: Thu Mar 6 02:51:02 2003 -0500 + + index + +commit 3cfc6a120672eeb46fca1300ba357ef6bff2b1cc +Author: Steven G. Johnson +Date: Thu Mar 6 02:50:38 2003 -0500 + + documented C++ usage + +commit 675b0233f6e57d4aa15fe422acb4c156e2c3692a +Author: Steven G. Johnson +Date: Thu Mar 6 02:25:32 2003 -0500 + + got rid of overfull hbox TeX warnings + +commit a5a689c09a184e7f361240b46f8a74cd5c0bea78 +Author: Steven G. Johnson +Date: Thu Mar 6 02:20:38 2003 -0500 + + whoops + +commit 9bdfa427108e546c8fd707d8bde9151b5cacd81d +Author: Steven G. Johnson +Date: Thu Mar 6 02:20:13 2003 -0500 + + noted fftw_iodim split for Fortran guru interface + +commit ba02448b7f27ddbff45651477c0ca5ea4d28b7bd +Author: Steven G. Johnson +Date: Thu Mar 6 02:14:21 2003 -0500 + + added guru reference + +commit db7990c25a72ecb1a1acddfa63bdd8c38fdaeedf +Author: Steven G. Johnson +Date: Wed Mar 5 22:56:05 2003 -0500 + + minor + +commit 58778ac5172128991fd8e88d4461004a03763596 +Author: Steven G. Johnson +Date: Wed Mar 5 22:45:31 2003 -0500 + + use @r{...} for comment text in code examples + +commit bd4b0411a2a7a9485f83d430455ff5d1571019f8 +Author: Steven G. Johnson +Date: Wed Mar 5 13:14:04 2003 -0500 + + eliminate warning + +commit 87d217e8cd045402dbb4d9a4bc7ac81481edbcf9 +Author: Steven G. Johnson +Date: Wed Mar 5 13:12:56 2003 -0500 + + SIMD_CFLAGS only for simd code + +commit 8346b6688d8e88aa91864685b77de030e8cb2549 +Author: Matteo Frigo +Date: Wed Mar 5 11:06:41 2003 -0500 + + Minor changes. + +commit 181d6c8fbdca0f24c1feb199c9a29edcf2187977 +Author: Steven G. Johnson +Date: Wed Mar 5 02:13:34 2003 -0500 + + cross-compiling with MinGW can't detect f77 mangling, so add an option to use what seems to be the most common styles + +commit 17f9e2aabc5526c6614d7055960c5e7f5fda3720 +Author: Steven G. Johnson +Date: Tue Mar 4 20:00:31 2003 -0500 + + comment + +commit b0715eb2e0f6662e3b3b41adf70799a31c2ab630 +Author: Steven G. Johnson +Date: Tue Mar 4 20:00:13 2003 -0500 + + we only use our-malloc-16 on machines where size_t == uintptr_t, so don't bother doing the right thing with the benchmark + +commit 72d331d4dbb9bf0bed0796e05eaf970a17c2975a +Author: Steven G. Johnson +Date: Tue Mar 4 19:46:09 2003 -0500 + + support WITH_OUR_MALLOC16 + +commit d2ee17676db2b01e1d57b6f6fcebe4c9c8987fff +Author: fftw +Date: Tue Mar 4 18:50:53 2003 -0500 + + automatically add -msse etcetera for --enable-sse etcetera + +commit 0a7cb6363f8effac8a34176c7b31d1dfbe4e71d0 +Author: fftw +Date: Tue Mar 4 18:24:26 2003 -0500 + + got rid of const warning + +commit f27a29dff516ba8bf8bd22a3affe1e881a045389 +Author: fftw +Date: Tue Mar 4 18:22:48 2003 -0500 + + missing header + +commit 58b8d88bdb16fde7d1400c93b1d976af4a29acaf +Author: Steven G. Johnson +Date: Tue Mar 4 15:55:47 2003 -0500 + + fixes + +commit a636d3b26c9ca10c0225bb058035e2f99ae41383 +Author: Steven G. Johnson +Date: Tue Mar 4 15:53:26 2003 -0500 + + whoops + +commit 530bdb066779445d91537bb42fafd03d98d24bd1 +Author: Steven G. Johnson +Date: Tue Mar 4 02:22:14 2003 -0500 + + started guru reference + +commit c44336102065022482f5d8a4eda068247672c05c +Author: Steven G. Johnson +Date: Tue Mar 4 01:44:09 2003 -0500 + + use same FFTW_IODIM between precisions + +commit da6302aba33f0dc74c9da6d7cd4824a6c431c948 +Author: Steven G. Johnson +Date: Tue Mar 4 00:25:57 2003 -0500 + + renamed section + +commit bf45437f266c9ce170d54e87466ba34f41b1937d +Author: Steven G. Johnson +Date: Tue Mar 4 00:21:49 2003 -0500 + + no need for "advanced" in subheadings + +commit 5fb9bd9fe4b93abeb0aa4b00e1ca6e9057da2fbd +Author: Steven G. Johnson +Date: Tue Mar 4 00:20:05 2003 -0500 + + typo + +commit 0127b618539bcb2ddf8634d4bb09c10673ba26a5 +Author: Steven G. Johnson +Date: Tue Mar 4 00:17:23 2003 -0500 + + finished advanced interface + +commit 76aa5434ffee4220caa0b1935d813723d43d55eb +Author: Steven G. Johnson +Date: Mon Mar 3 23:26:12 2003 -0500 + + more advance interface docs + +commit 05a9b164357317a362a1f4e0acb2067faa66910e +Author: Steven G. Johnson +Date: Mon Mar 3 23:12:09 2003 -0500 + + fail for win32 + +commit c49ad63f2fb49af4c81ea1fde51303013e637d7b +Author: fftw +Date: Mon Mar 3 17:18:48 2003 -0500 + + shortened help string + +commit 52ebcb06b186e8f796fdc71ae30d3ac7e9e35017 +Author: fftw +Date: Mon Mar 3 17:16:17 2003 -0500 + + fixed cross-refs + +commit 331a793c80e1bb04018aad92d07791ff432d792e +Author: fftw +Date: Mon Mar 3 17:07:27 2003 -0500 + + FFTW_POSSIBLY_UNALIGNED -> simpler FFTW_UNALIGNED in API, added bench option + +commit 3ba1c479988c55e2f9244fac654f491c5b1c4b78 +Author: fftw +Date: Mon Mar 3 16:58:07 2003 -0500 + + whoops + +commit 62a1622e28fcc9408467bccee64c50f977243b7f +Author: fftw +Date: Mon Mar 3 16:52:58 2003 -0500 + + noted assumption + +commit b6a1f1234fe0834ad8c7a313fc15c710bffafdc6 +Author: fftw +Date: Mon Mar 3 16:50:33 2003 -0500 + + provide our own malloc16 routine because of Windows lossage + +commit 22de7295407d77062d3611d326295950f90d4907 +Author: Steven G. Johnson +Date: Mon Mar 3 13:28:12 2003 -0500 + + capitalization + +commit 5756c9b659e1dda142a21c8c4c8fed00015bf29d +Author: Steven G. Johnson +Date: Mon Mar 3 13:26:32 2003 -0500 + + whoops + +commit 0f92b4f922681df3c6ea4a35bafb8c32907a028d +Author: Steven G. Johnson +Date: Mon Mar 3 12:55:57 2003 -0500 + + vertical skip looks better than indenting for setting off short paragraphs + +commit 767a89f2268461313cb0a3666be311640bb288af +Author: Matteo Frigo +Date: Mon Mar 3 06:34:09 2003 -0500 + + Removed franz-mode. Automake was distributing franz files + whether franz mode was enabled or not. + +commit d40ea4ed0a561aa7f85008bb970d07b33010a0eb +Author: Steven G. Johnson +Date: Mon Mar 3 01:44:00 2003 -0500 + + made output boundary conditions more prominent; they are important, + because they make the different transform types inequivalent in + parity + +commit 909ed5b34a848e505c9a62fcb5b07d346183a43d +Author: Steven G. Johnson +Date: Mon Mar 3 01:17:28 2003 -0500 + + clarification + +commit feb1fc01699f139143e536e1d0f961b904bba74e +Author: Steven G. Johnson +Date: Mon Mar 3 01:17:07 2003 -0500 + + typo + +commit 8d2e91da57095741496a5ae8b809cee8bd01bdb9 +Author: Steven G. Johnson +Date: Mon Mar 3 01:10:28 2003 -0500 + + started advanced reference + +commit 34cc962abf3c75c27328c21fb2c9b053426870f8 +Author: Steven G. Johnson +Date: Mon Mar 3 00:52:02 2003 -0500 + + r2r reference + +commit 6a32d0463a93a19f01e9b13bdc2e0d73857c7eaa +Author: Steven G. Johnson +Date: Sun Mar 2 23:51:21 2003 -0500 + + workaround for info formatting bug + +commit a76009f2fb554d2af97e39f4857b70d26a263bf5 +Author: Steven G. Johnson +Date: Sun Mar 2 23:47:19 2003 -0500 + + noted lack of fftw_malloc in Fortran + +commit 53555b1acdefbc4b092702bcd7defa71dd523ee7 +Author: Steven G. Johnson +Date: Sun Mar 2 23:42:52 2003 -0500 + + parallelism + +commit a84b5314b96882b7495c7d0fbdd91a73f678683f +Author: Steven G. Johnson +Date: Sun Mar 2 23:39:54 2003 -0500 + + whoops + +commit f4b30c1aeb9cadcb0ef3586a40e2a41a6087304f +Author: Steven G. Johnson +Date: Sun Mar 2 23:33:02 2003 -0500 + + r2c/c2r reference + +commit 9afb0869850070a47c3b45df511efdaef0c19292 +Author: Steven G. Johnson +Date: Sun Mar 2 22:44:10 2003 -0500 + + table of contents was being included twice + +commit 9433ef02af21f2e3ee1c5a5e6034a2e5a02663af +Author: Steven G. Johnson +Date: Sun Mar 2 22:42:29 2003 -0500 + + minor changes + +commit 34aaf0acd96dc522e8b71c3844077a7d28149690 +Author: Steven G. Johnson +Date: Sun Mar 2 21:54:13 2003 -0500 + + started reference section + +commit 10afdab4c99f7d367227f61d6ea87e43113379ef +Author: Steven G. Johnson +Date: Sun Mar 2 19:10:02 2003 -0500 + + whoops + +commit da1655a272a6bd0bf3db360605818d3684e01919 +Author: Steven G. Johnson +Date: Sun Mar 2 19:03:23 2003 -0500 + + started ref. section + +commit a3cc56c2b538f79864f787f9480a7da21017624a +Author: Steven G. Johnson +Date: Sun Mar 2 18:50:58 2003 -0500 + + fftw_flops takes const plan + +commit e6c9dd42b944a416f6cca057b2277acb2a00d370 +Author: Steven G. Johnson +Date: Sun Mar 2 15:54:14 2003 -0500 + + typo + +commit 9d97e6245d45d65061499080021f2e0c877803b6 +Author: Steven G. Johnson +Date: Sun Mar 2 15:52:41 2003 -0500 + + added "Wisdom of Fortran?" section + +commit 85f80c144fc9da705ddc7da87d0e437a4125d1db +Author: Steven G. Johnson +Date: Sun Mar 2 15:50:37 2003 -0500 + + typo + +commit 0f4d81b32a7ddf1e011dcc66a7ca3a6f01602aa9 +Author: Steven G. Johnson +Date: Sun Mar 2 15:49:57 2003 -0500 + + wording + +commit 6c6dd67d7f64ce4ab293456c0b4fce7397b4204f +Author: Steven G. Johnson +Date: Sun Mar 2 15:46:13 2003 -0500 + + added comments + +commit d9ecf01ce4b7d0bb1c81de9097941541d96f68d0 +Author: Steven G. Johnson +Date: Sun Mar 2 15:44:01 2003 -0500 + + added example file + +commit 37b6da9ec0958f78193e343ff5adbb7221039698 +Author: Steven G. Johnson +Date: Sun Mar 2 15:37:32 2003 -0500 + + don't print out READ WISDOM unless we have + +commit c476c76dbda1de2cfcfed5db46f8eb6a59ca5eda +Author: Steven G. Johnson +Date: Sun Mar 2 15:36:28 2003 -0500 + + EOF is not a space + +commit 789f94ba726188b22495dffa33536923784cc893 +Author: Matteo Frigo +Date: Sun Mar 2 09:14:37 2003 -0500 + + Turn on inline by default + +commit f76cd82b2e8d570d38aafcd3bc479871a6bfef71 +Author: Matteo Frigo +Date: Sun Mar 2 07:11:56 2003 -0500 + + Optionally inline loop in notw codelets + +commit 4ee60a97aba5df7daa9a1f0f20fc8a18b4caeef9 +Author: Steven G. Johnson +Date: Sun Mar 2 01:37:41 2003 -0500 + + updated nodes + +commit a760bacb99bcb4d1b37deac1a0d03048564f06ae +Author: Steven G. Johnson +Date: Sun Mar 2 01:37:19 2003 -0500 + + wrote most of Fortran chapter + +commit 84b26fd1d2d412fc5dae194fa4f49ea8c5ad803b +Author: Steven G. Johnson +Date: Sun Mar 2 00:58:37 2003 -0500 + + citation + +commit 90c66908b4f24f05f5a77a85d890ef77a5946747 +Author: Steven G. Johnson +Date: Sun Mar 2 00:57:22 2003 -0500 + + added parallel FFTW chapter + +commit 1a89e4fc8d30e58c46d409543e5641d74d82012b +Author: Steven G. Johnson +Date: Sat Mar 1 20:42:23 2003 -0500 + + typo + +commit 125c6e2e61c2977a10fe882134b6daa518d211b6 +Author: Steven G. Johnson +Date: Sat Mar 1 20:34:38 2003 -0500 + + added inlining to TODO + +commit 86f19bdcd118e4f74034a5acf2a9f46ae0dd563b +Author: Steven G. Johnson +Date: Sat Mar 1 19:36:26 2003 -0500 + + added K + +commit c471cfe8ed04c68bd3ba96de578160018676966f +Author: Steven G. Johnson +Date: Sat Mar 1 19:15:18 2003 -0500 + + use K for constants + +commit c9132f12b56356608c7430b1aa8674c57982cf6f +Author: Steven G. Johnson +Date: Sat Mar 1 19:14:54 2003 -0500 + + fixed cross-ref + +commit 2c552e93b7ac76c6ed2cb15d84fb724e71d90901 +Author: Steven G. Johnson +Date: Sat Mar 1 19:14:16 2003 -0500 + + whoops + +commit ffd88e528368512ad6260f9829d093be01b0b8e0 +Author: Steven G. Johnson +Date: Sat Mar 1 18:50:43 2003 -0500 + + cleanup + +commit eb500b0aee97bc247fadc5f14053addd510f8911 +Author: Steven G. Johnson +Date: Sat Mar 1 18:46:38 2003 -0500 + + "words of wisdom" by itself is a little too obscure + +commit c110b9bcf9dc0e3ac3bd0a9dc0aa04a3003808ab +Author: Steven G. Johnson +Date: Sat Mar 1 18:43:21 2003 -0500 + + re-added multi-dimensional array stuff + +commit 3c1809be37bedc7b19bb0ad1645d2d0c55fb24af +Author: Steven G. Johnson +Date: Sat Mar 1 18:15:22 2003 -0500 + + added alignment section + +commit 5ea9d154e8d9b180445e82c228f66dc620435630 +Author: Steven G. Johnson +Date: Sat Mar 1 16:34:21 2003 -0500 + + shrunk code + +commit 969e6184c37360147d4377765e4209f740bbbc63 +Author: Steven G. Johnson +Date: Fri Feb 28 20:22:00 2003 -0500 + + slight compression + +commit 61f49745af277cf662c0b684d812bb937991da02 +Author: Steven G. Johnson +Date: Fri Feb 28 19:01:20 2003 -0500 + + style + +commit 7a450c9741b7d712c4b0647c8348b6f5c16c5b5b +Author: Steven G. Johnson +Date: Fri Feb 28 18:46:53 2003 -0500 + + noted not in API + +commit dcb2c790e6afe7674f917a64a27a5d757de04d54 +Author: Steven G. Johnson +Date: Fri Feb 28 18:43:14 2003 -0500 + + more updates + +commit 9c734e0be5f7e454d53ea076c85b07a1563d12d0 +Author: Steven G. Johnson +Date: Fri Feb 28 18:38:42 2003 -0500 + + slight updates + +commit 3e0a26ba8c35cc39e451dddb4ff538a9b6897853 +Author: Steven G. Johnson +Date: Fri Feb 28 18:28:58 2003 -0500 + + great const-ification of apply/solve and print + +commit 7531ed4ba4a1cd9a4e9caf11c225f930a72efc73 +Author: Steven G. Johnson +Date: Fri Feb 28 17:51:15 2003 -0500 + + make fftw_execute take a const plan, to remind the user that it is re-entrant (or should be)... + +commit 4688736baa020b3ea5f442e36b70d793b431c5c5 +Author: Steven G. Johnson +Date: Fri Feb 28 17:29:40 2003 -0500 + + weakening + +commit 0318454412dbe1cd837ddb068bd343ca6e112011 +Author: Steven G. Johnson +Date: Fri Feb 28 17:28:48 2003 -0500 + + note + +commit 91b816d6c3f80bdb7e0d0116306ae7ffd2c455a8 +Author: Steven G. Johnson +Date: Fri Feb 28 17:27:10 2003 -0500 + + footnote about why DHT is provided + +commit ade0a1b900ff7aad1f0b34334d0aeef444f9c6f1 +Author: Steven G. Johnson +Date: Fri Feb 28 15:07:03 2003 -0500 + + index + +commit 02af64c2431e9ebe1f95750c16596bb16b0130e2 +Author: Steven G. Johnson +Date: Fri Feb 28 15:05:48 2003 -0500 + + added DHT tutorial + +commit 4c0a2b93c6fabdbd47e06a9f6ba76008bcb560a1 +Author: Steven G. Johnson +Date: Fri Feb 28 14:36:45 2003 -0500 + + fixed O(n log n) + +commit fd7ecdadbf64ae5027bac415310c4a98a276db60 +Author: Steven G. Johnson +Date: Fri Feb 28 14:12:15 2003 -0500 + + whoops + +commit ee8d32cc161fa77c6d9566dfb000a80af883f835 +Author: Steven G. Johnson +Date: Fri Feb 28 14:06:22 2003 -0500 + + slight improvements + +commit 0b2ef4ccfd465403919403e5151753a4280f683e +Author: Steven G. Johnson +Date: Fri Feb 28 00:55:50 2003 -0500 + + addition + +commit 22bd399df29e7380522c5bac340a3f04a466fd79 +Author: Steven G. Johnson +Date: Fri Feb 28 00:54:09 2003 -0500 + + clarification + +commit 1b357d49f4d4ee22c59374391be91ddb42813a2d +Author: Steven G. Johnson +Date: Thu Feb 27 23:49:37 2003 -0500 + + fix + +commit 1c30eacc33d5c9d5daf303cfbbc5fa74e6a5bfa4 +Author: Steven G. Johnson +Date: Thu Feb 27 23:43:56 2003 -0500 + + slight changes + +commit 053b9356142e3b05c1ee11800f497813e5c9f119 +Author: Steven G. Johnson +Date: Thu Feb 27 23:27:48 2003 -0500 + + added R{E,O}DFTab tutorial + +commit a793a4024b69b7e4ec4bbbeedb00508845c0cab2 +Author: Steven G. Johnson +Date: Thu Feb 27 17:24:20 2003 -0500 + + fixes + +commit de5b2994a11c8c2b3d1948f43525864b0ac5d265 +Author: Steven G. Johnson +Date: Thu Feb 27 17:20:42 2003 -0500 + + fixes + +commit 027014da3b7f99190c9c1edbe0f6d0c0d15e043a +Author: Steven G. Johnson +Date: Thu Feb 27 17:11:54 2003 -0500 + + slight change + +commit 6359d6080ac4a827218faee02ba1bfe5a5a676bf +Author: Steven G. Johnson +Date: Thu Feb 27 17:07:45 2003 -0500 + + documented r2hc/hc2r + +commit a44e1bc64be97cffdf71bf77dcb526786daa8efe +Author: Steven G. Johnson +Date: Thu Feb 27 16:19:16 2003 -0500 + + minor changes + +commit 7186d1f0701c1507ce6b57f943f0d069c69e09d1 +Author: Steven G. Johnson +Date: Thu Feb 27 13:54:06 2003 -0500 + + timed planner and unifying radix-2 butterfly loops are not critical for release + +commit e22ae82e9d2c007712ae8e8523a2ba4844265b26 +Author: Steven G. Johnson +Date: Thu Feb 27 13:51:20 2003 -0500 + + reodft/verify.c no longer exists + +commit d562aee6ca0c9e2c375d31a2f283ef5188b8819a +Author: Steven G. Johnson +Date: Thu Feb 27 13:44:19 2003 -0500 + + optimization: REDFT00 of size 2 is same as R2HC + +commit 35bca2a3e6f2b887fe4517dfed61eb4cc614f9ff +Author: Steven G. Johnson +Date: Thu Feb 27 12:35:33 2003 -0500 + + R{E,O}DFT01 of size-1 is identity + +commit 3e86434a19f94bd85e576be96fb26b0db8456b7e +Author: Steven G. Johnson +Date: Thu Feb 27 12:15:10 2003 -0500 + + minor simplification + +commit 23aeb956f45a31061c6f0bee5c78119e332e9d20 +Author: Steven G. Johnson +Date: Thu Feb 27 02:46:31 2003 -0500 + + fixed add count + +commit 629bf73abe3666100c7a3cdb795cdf85f1c3467c +Author: Steven G. Johnson +Date: Thu Feb 27 02:25:04 2003 -0500 + + whoops + +commit 46350e9b4b06fc596f73c2e8297276e38871fbcc +Author: Steven G. Johnson +Date: Thu Feb 27 02:22:03 2003 -0500 + + another optimization + +commit 16310c985bad6d32fa0da6362c37fd375822d813 +Author: Steven G. Johnson +Date: Thu Feb 27 01:43:00 2003 -0500 + + added op counts + +commit 870808939ac67893ae3193d1eaf47d6722399743 +Author: Steven G. Johnson +Date: Thu Feb 27 01:29:32 2003 -0500 + + cleanup + +commit e13936e36480509c10d5f8da4806a17a1f2c9d34 +Author: Steven G. Johnson +Date: Thu Feb 27 01:17:23 2003 -0500 + + typo in comment + +commit 32c3d158f7f210901f1c16a8c8cbdfff05024993 +Author: Steven G. Johnson +Date: Thu Feb 27 01:13:49 2003 -0500 + + fixed comment + +commit 6e65b622f4e11f6b75ce19b92715054e01726a87 +Author: Steven G. Johnson +Date: Thu Feb 27 01:12:05 2003 -0500 + + use E instead of R + +commit b2dbcc1af3dac45c5dc937090de39d8c50f79f04 +Author: Steven G. Johnson +Date: Thu Feb 27 01:05:39 2003 -0500 + + more unrolling to eliminate if statements in loops, for speedups of 25-40% + +commit efdfcd1ab423b3b5f4c226859c38fe82ef8d5ee3 +Author: Steven G. Johnson +Date: Thu Feb 27 00:27:00 2003 -0500 + + some loop splitting to touch each element of output buf only once and eliminate some conditionals...speeds up by 30-40% + +commit ac2585fa04303d0a9733f25529a4de770165a96a +Author: Steven G. Johnson +Date: Wed Feb 26 17:48:26 2003 -0500 + + comma + +commit 12f6863d7ba56d03a828d47d95226914f7624343 +Author: Steven G. Johnson +Date: Wed Feb 26 17:46:17 2003 -0500 + + pointer to odd case + +commit b305de27048e5d88018afd557b9853fcfd938e7e +Author: Steven G. Johnson +Date: Wed Feb 26 17:40:54 2003 -0500 + + precision -> accuracy (c.f. Kahan) + +commit 8cce3f1c36041dfd0f3099ccd2b4d07af10ba0ae +Author: Steven G. Johnson +Date: Wed Feb 26 17:36:13 2003 -0500 + + added time limit for wisdom generation + +commit 57f9db2fb5d1498630bc04fa9ce59c0362383dc2 +Author: Steven G. Johnson +Date: Wed Feb 26 13:24:36 2003 -0500 + + caps + +commit 194e3fe2a23b43433042f38567d615508f0219f0 +Author: Steven G. Johnson +Date: Tue Feb 25 20:56:01 2003 -0500 + + another note + +commit 74d5d37f8b5f57257ac2996c1b78cd6e178009b2 +Author: Steven G. Johnson +Date: Tue Feb 25 20:54:57 2003 -0500 + + note + +commit 4c454a521c659245d7d5328a0428abe8e0e65ca0 +Author: Steven G. Johnson +Date: Tue Feb 25 20:42:08 2003 -0500 + + added new, more accurate (hopefully) reodft11 algorithms; added --disable-debug-malloc; added --impulse-accuracy-rounds=rounds flags to libbench2 for impulse-response accuracy tests + +commit 56c91af19d265df468a1c332950285ccc35cadf2 +Author: Matteo Frigo +Date: Sun Feb 23 14:07:48 2003 -0500 + + fftw_wisdom.1 is in $builddir, not $srcdir + +commit afb274d60def917682dcfb6752788ae69feb0e89 +Author: Steven G. Johnson +Date: Mon Feb 17 03:42:19 2003 -0500 + + pde + +commit 57844d17a4a5e42a9b3a6e264d4b9ef96a48b7d7 +Author: Steven G. Johnson +Date: Mon Feb 17 03:40:19 2003 -0500 + + consistent number + +commit da10f4a095936c4a272edf95561177e0ba1e0976 +Author: Steven G. Johnson +Date: Mon Feb 17 03:39:02 2003 -0500 + + started r2r doc + +commit 9339401bc1db11ab2b3ea8332adf2b7f8d2bd39d +Author: Steven G. Johnson +Date: Mon Feb 17 02:31:51 2003 -0500 + + rfftwnd + +commit e9481965be99453d16fce50a2cec8a7189d50e5a +Author: Steven G. Johnson +Date: Sat Feb 15 17:02:07 2003 -0500 + + continued + +commit 387c70c9f598cc84949f9b36c3a7ec3aee478107 +Author: Steven G. Johnson +Date: Sat Feb 15 15:16:26 2003 -0500 + + started r2c/c2r docs + +commit 0df57f98fa114607c9ea5a9e17e8aa4fa92bd0c1 +Author: Steven G. Johnson +Date: Sat Feb 15 01:12:52 2003 -0500 + + added r{e,o}dft11 accuracy test + +commit e24081ffd7a170743a930c91ec251fb1fa590072 +Author: Steven G. Johnson +Date: Sat Feb 15 00:42:48 2003 -0500 + + added more r2r accuracy checks + +commit da37c854fdf95a2cfc3cf2c6ef698ab1ed9e8a70 +Author: Matteo Frigo +Date: Fri Feb 14 19:19:54 2003 -0500 + + $< is a GNUism + +commit 01c0739002308b926e8ed648f93c2b46ef885404 +Author: Steven G. Johnson +Date: Wed Feb 12 21:02:16 2003 -0500 + + r2r test cases are in + +commit e0d1053729fe6e63cfc19bf040c14593ced050c5 +Author: Steven G. Johnson +Date: Wed Feb 12 21:01:28 2003 -0500 + + added vector radix to TODO + +commit eabfd75e1f96eb039ac8ba4f612ad92a5de3f3f2 +Author: Steven G. Johnson +Date: Wed Feb 12 17:21:33 2003 -0500 + + fixed cross-ref + +commit fe1a1f526ac5401ffbb69ddc61b07af2f9c08cfc +Author: Steven G. Johnson +Date: Wed Feb 12 17:19:56 2003 -0500 + + shorter synopsis + +commit 73464a04bcc91f1244cca8812515833da6cad60c +Author: Steven G. Johnson +Date: Wed Feb 12 12:53:19 2003 -0500 + + obsolete + +commit f235c4cdb767ed752563b5a12b609f4a606ae89d +Author: Steven G. Johnson +Date: Wed Feb 12 12:52:53 2003 -0500 + + removed old dotens + +commit 1b45907552bf8c3c7e91e77b9256f904a7dc46db +Author: Steven G. Johnson +Date: Wed Feb 12 12:52:16 2003 -0500 + + removed old verify files + +commit d2baa62fc65ce7b8c09581f2feaacd90466c07e2 +Author: Steven G. Johnson +Date: Wed Feb 12 12:37:17 2003 -0500 + + disable threads support by default + +commit 6fc7d66c60a2e9bfbac7bba821b5329c9fde4b0b +Author: Matteo Frigo +Date: Wed Feb 12 11:03:28 2003 -0500 + + Removed old test program + +commit 948df3a1949a1a5d9d8924a1c51c49d015477b73 +Author: Steven G. Johnson +Date: Tue Feb 11 22:30:55 2003 -0500 + + joke + +commit 06377bf381dbb2e1a05674678924168ee9235d46 +Author: Steven G. Johnson +Date: Tue Feb 11 22:27:44 2003 -0500 + + add --help and --version, to be GNU-lly correct + +commit c59c2fb43df57981f39141efe881ade700dffb3f +Author: Steven G. Johnson +Date: Tue Feb 11 22:27:18 2003 -0500 + + whoops + +commit ecc46199c7967a7164deaa4f6be2ad734eb6c986 +Author: Steven G. Johnson +Date: Tue Feb 11 22:17:35 2003 -0500 + + better help + +commit e73d1cfefcfdffa9a318c184463973e309e1f421 +Author: Steven G. Johnson +Date: Tue Feb 11 21:47:35 2003 -0500 + + comma + +commit dc27e6924a7f6e054e0d542d855d4f62c9545ce2 +Author: Steven G. Johnson +Date: Tue Feb 11 21:46:12 2003 -0500 + + formatting + +commit 06c5acf858b96e548a3d5664252103486c5dbb5e +Author: Steven G. Johnson +Date: Tue Feb 11 21:45:23 2003 -0500 + + man pages for tools + +commit d643ece55b08510928523882ac2213361d1eaf43 +Author: Steven G. Johnson +Date: Tue Feb 11 19:07:12 2003 -0500 + + added -V + +commit ad12cdca62eb5030d1388f12f7278fd1a3eb8a3a +Author: Steven G. Johnson +Date: Tue Feb 11 18:42:17 2003 -0500 + + added install-wisdom target + +commit 83162f468afd0941a99c408ae84e6c35ce43dbb3 +Author: Steven G. Johnson +Date: Tue Feb 11 18:23:02 2003 -0500 + + another note + +commit 52735853d05221978df609981a95f9d89ec03c0a +Author: Steven G. Johnson +Date: Tue Feb 11 17:32:56 2003 -0500 + + started r2r accuracy tests (only three kinds covered so far) + +commit 6fb598e12ddd2e595289c0d399cd7c283425540b +Author: Steven G. Johnson +Date: Mon Feb 10 22:04:18 2003 -0500 + + silence warning + +commit b94eaa910fb2a707a185e743514f009a77663600 +Author: Matteo Frigo +Date: Mon Feb 10 20:55:20 2003 -0500 + + gcc bug is now avoided. + +commit d142433a2935361da613eef685c306e1f86ef8cb +Author: Matteo Frigo +Date: Mon Feb 10 20:37:54 2003 -0500 + + Accuracy test + +commit 3e6c6925a0daf524ddff6ef711ebe2dbf07ebda2 +Author: Matteo Frigo +Date: Mon Feb 10 07:59:57 2003 -0500 + + There is no point in precomputing strides for the long-double code, as + multiplication by sizeof(long double) cannot be folded into the + addressing mode. This change also fixes the gcc-2.95 bug that causes + miscompilation of certain codelets. + +commit 1cdf3be30717cb411fcb7272628ab72dc31ea3d0 +Author: Steven G. Johnson +Date: Mon Feb 10 02:54:35 2003 -0500 + + added random r2r tests + +commit 13fd49dc504be79d65f5c3b254b08572689fcd71 +Author: Steven G. Johnson +Date: Mon Feb 10 02:44:58 2003 -0500 + + whoops, bugfix: missing stride for ro10 + +commit f0926d171845f84e02584361b0a6a9b6c4d68e71 +Author: Steven G. Johnson +Date: Mon Feb 10 02:21:50 2003 -0500 + + formatting + +commit 2ec7cca77de0ed39b104a090158f4f3994f18343 +Author: Steven G. Johnson +Date: Sun Feb 9 23:24:52 2003 -0500 + + flop counts for reodft + +commit 1ec87d09b3698d5c2093d8436ea885225d67191a +Author: Steven G. Johnson +Date: Sun Feb 9 23:22:15 2003 -0500 + + declare aligned_main + +commit 9c3374ad54ec97ed408760b77234ea4980fcd311 +Author: Steven G. Johnson +Date: Sun Feb 9 20:56:06 2003 -0500 + + corrected rader op counts + +commit 6803f88282e3117c77721aff1a96515236b27fb9 +Author: Steven G. Johnson +Date: Sun Feb 9 20:25:32 2003 -0500 + + punctuation + +commit e8cbdde425f97261b79551ea78f87322a4983bf3 +Author: Steven G. Johnson +Date: Sun Feb 9 20:25:17 2003 -0500 + + noted need for better estimator + +commit 156eefce1a365107071ac016b4c818354a98e60b +Author: Steven G. Johnson +Date: Sun Feb 9 19:58:59 2003 -0500 + + noted F77 api fix for g77 mangling incompatibility + +commit e160cbe881f0f509fa09e6eedd76141b439c3ad9 +Author: Steven G. Johnson +Date: Sun Feb 9 19:30:55 2003 -0500 + + build f77 header file of constants from fftw3.h + +commit 370b6e68c535ab81d29047d5fd3a9a48f7e3ebec +Author: Steven G. Johnson +Date: Sun Feb 9 19:04:53 2003 -0500 + + updates + +commit f2c761d6d435ea22fc390b1e388dc0d01a747bd4 +Author: Steven G. Johnson +Date: Sun Feb 9 19:03:34 2003 -0500 + + threads f77 api + +commit b84617e3c6d025d4f13cfa3056ddbdbd5227b961 +Author: Steven G. Johnson +Date: Sun Feb 9 18:54:00 2003 -0500 + + finished f77 serial api + +commit 86446f99fc266c435826ab0f0ca77b48117dd21f +Author: Steven G. Johnson +Date: Sun Feb 9 18:32:26 2003 -0500 + + added flops, slight cleanups + +commit b02c6ea6492b370ac0dde405bc4d899b3b4d4ab7 +Author: Matteo Frigo +Date: Sun Feb 9 18:11:48 2003 -0500 + + Oops, forgot #include + +commit 218af736c45f2ac117c4fe70c79029a7bb26ae33 +Author: Matteo Frigo +Date: Sun Feb 9 18:08:26 2003 -0500 + + Removed duplication of stack-alignment code + +commit 5b5fc6186df8fa5214ae22ebaf84922aab584d90 +Author: Steven G. Johnson +Date: Sun Feb 9 15:48:15 2003 -0500 + + allow - to read problems from stdin + +commit c8e7f4b0b4ed904a7dc8b474f220d17bd061809e +Author: Steven G. Johnson +Date: Sun Feb 9 15:22:23 2003 -0500 + + added fftw-wisdom tool + +commit 216bb0693d91019be789666644d90c1f9afde7a5 +Author: Steven G. Johnson +Date: Sun Feb 9 15:06:38 2003 -0500 + + elim. warning + +commit 8ff159c3583032eb2b661bb50b34d77344f1898e +Author: Steven G. Johnson +Date: Sun Feb 9 14:24:19 2003 -0500 + + destroy_input should not contaminate flags of other problems + +commit c1e578a3c33cee071a10e2f8f49a5dd29f4749ae +Author: Steven G. Johnson +Date: Sun Feb 9 13:06:11 2003 -0500 + + updated + +commit 8b09de262bcd31d3ef04cff36791c389f75b733b +Author: Steven G. Johnson +Date: Sun Feb 9 13:01:45 2003 -0500 + + removed overzealous inplace check, which caused problems for rdft2 + +commit bfb7a5cab2f68265d33dea80716baec602a7c5ef +Author: Matteo Frigo +Date: Sun Feb 9 08:14:03 2003 -0500 + + Consistent syntax for RNK_MINFTY tensors + +commit 0f87db2efc6a2d72c3bb8584c195ee3682e09870 +Author: Matteo Frigo +Date: Sun Feb 9 07:31:13 2003 -0500 + + lisply-correct tensor print. We no longer need to parse tensors. + +commit 14826af57fa8cd1490d3d4d8111e64336ad638a4 +Author: Steven G. Johnson +Date: Sun Feb 9 03:35:56 2003 -0500 + + removed completed items + +commit ba72775e69c1b4ff00b77a37bd0c80312bcc072f +Author: Steven G. Johnson +Date: Sun Feb 9 03:27:56 2003 -0500 + + slight renaming + +commit a96011aa06fe98812ad45afba51a6f1c3ceeab31 +Author: Steven G. Johnson +Date: Sun Feb 9 03:15:28 2003 -0500 + + multi-dimensional r2r verifier + +commit d2c2e3058ab81d087848fdd251e8bb6e92416710 +Author: Steven G. Johnson +Date: Sun Feb 9 02:40:22 2003 -0500 + + comments + +commit 5553af4969fd029313dc53f63201fa9c40acd051 +Author: Steven G. Johnson +Date: Sun Feb 9 02:38:26 2003 -0500 + + slight simplification + +commit 8aa7d693d055305129c2518385e9816529c9a334 +Author: Steven G. Johnson +Date: Sun Feb 9 02:36:25 2003 -0500 + + added 1d r2r verifier (triple ugh) + +commit ef489a80e6559cf2828da23340df129302681dd5 +Author: Steven G. Johnson +Date: Sat Feb 8 22:23:00 2003 -0500 + + added vector transforms to random tests + +commit 826567b4d872cb6920840a850e0a584e0cc015e9 +Author: Steven G. Johnson +Date: Sat Feb 8 20:59:07 2003 -0500 + + whoops + +commit b4d28e3488a63128b0ad1500d2e8b5777eadc8e4 +Author: Steven G. Johnson +Date: Sat Feb 8 19:52:58 2003 -0500 + + fixed interaction between dwims for sz/vecsz with rdft2 transforms + +commit 0c8c54737beaa3db6a119769716f40416ddc7718 +Author: Steven G. Johnson +Date: Sat Feb 8 19:35:56 2003 -0500 + + added destroy_input flag/check + +commit 0e205231678541426c1a0bcd61b0442e7e24ad4a +Author: Steven G. Johnson +Date: Sat Feb 8 19:11:58 2003 -0500 + + added rdft2 verifier + +commit a20a05830b52221eda2f16ab7da1dc80e0e5a050 +Author: Steven G. Johnson +Date: Sat Feb 8 13:31:14 2003 -0500 + + an additional check for in-place case + +commit 6096b268ec7fb9e5c1ad5d41aff355e8f674fd22 +Author: Steven G. Johnson +Date: Fri Feb 7 17:36:56 2003 -0500 + + slight fix: hc2r constraints are mostly determined by sub-plan + +commit 668b0af47a07011aaa3202ee70d3588aeca0ddd9 +Author: Steven G. Johnson +Date: Fri Feb 7 16:28:55 2003 -0500 + + make radix2-dft inapplicable to in-place/split case (r == rio, iio >= rio + n/2+1 != r + 1) + +commit 533f0a1824842664dfe63287e03800c2426b8ba5 +Author: Matteo Frigo +Date: Tue Feb 4 06:36:29 2003 -0500 + + Allow plnr->hook to be 0 + +commit 5c89a91a0efc3714980409d12055f91a2bd33693 +Author: Steven G. Johnson +Date: Tue Feb 4 03:25:36 2003 -0500 + + moved dft stuff into verify-dft + +commit 941da36d0fa1562ef98fd796b05c0a8a94c4ff94 +Author: Steven G. Johnson +Date: Tue Feb 4 03:25:00 2003 -0500 + + cruft + +commit 727cc86ece827ba21a236149c66ef6c7e7890d6b +Author: Steven G. Johnson +Date: Tue Feb 4 03:18:28 2003 -0500 + + further unify libbench2 and paranoid verifiers + +commit 6fb68912913cd9ab647b0206a713470e1bad462b +Author: Steven G. Johnson +Date: Sun Feb 2 01:45:37 2003 -0500 + + typo in comment + +commit 3d1a5701f571ec275672faf3da2d7ea6f1e34b93 +Author: Matteo Frigo +Date: Sat Feb 1 09:30:03 2003 -0500 + + Fixed p==2 case + +commit 723093b36b481e0f742822129f33998ba5acff14 +Author: Matteo Frigo +Date: Sat Feb 1 09:23:43 2003 -0500 + + Incorporated new find_generator by Greg Dionne. + +commit 93a75fda2dad56fbf69030eabdb09af0987e5316 +Author: Matteo Frigo +Date: Fri Jan 31 20:46:24 2003 -0500 + + Removed nonportable call to gettext() + +commit 0d937fc4f0800cdad67d7a6a496c30c67c70b0ae +Author: Matteo Frigo +Date: Wed Jan 29 19:03:43 2003 -0500 + + uintptr_t is in in openbsd + +commit 9ffa4f6b400e1818a4c50a1385d916d501ff16b7 +Author: Matteo Frigo +Date: Wed Jan 29 15:41:56 2003 -0500 + + Huge speedups in wisdom I/O. + +commit 426e786cc0662f3926cd79d3d76b0825a65ff445 +Author: Matteo Frigo +Date: Tue Jan 28 19:36:51 2003 -0500 + + Added appropriate warning against likely future bug. + +commit b254ecc51abc22f1642e0bae9d6d22fbb2efb771 +Author: Matteo Frigo +Date: Tue Jan 28 19:00:24 2003 -0500 + + Don't attempt to remove bogus wisdom entries. + +commit c19570082c79ce6d86613248e700ee17bb3582b8 +Author: Matteo Frigo +Date: Tue Jan 28 18:16:24 2003 -0500 + + Fixed a couple of very very very nasty bugs---pointers became + invalid after the hash table was relocated. + +commit 123972fa083c9fb07f18c3ee3a902a79606f5987 +Author: Matteo Frigo +Date: Tue Jan 28 07:34:10 2003 -0500 + + Read wisdom at can_do() time, otherwise wisdom is destroyed. + +commit d1e805e6353a689a61b6aec66a28d568723717fc +Author: Matteo Frigo +Date: Tue Jan 28 06:54:38 2003 -0500 + + More conservative inheritance of blessings + +commit e718fe3fa7a7c4194011493e0bd86b78b222c0b9 +Author: Matteo Frigo +Date: Tue Jan 28 06:50:20 2003 -0500 + + Print the same info as it is hashed + +commit 84199fe5035171395b24754b6f4428513b850e84 +Author: Matteo Frigo +Date: Tue Jan 28 06:49:48 2003 -0500 + + Print name of executable when FAILURE + +commit 3919d8a49fb4779e470deefd35cc3c7fc09c20ce +Author: Matteo Frigo +Date: Mon Jan 27 06:59:40 2003 -0500 + + New NO_SEARCH planner flag, which avoids searching altogether. + A wisdom entry must lead to a NO_SEARCH-grade plan, or else the + wisdom entry is bogus. + +commit 9534126e49e082098917ef5500133d8ef8a7289a +Author: Matteo Frigo +Date: Sun Jan 26 20:45:21 2003 -0500 + + Use cosl()/sinl() when appropriate + +commit 5cc66fc2964feb54cff148e70280c083715d371f +Author: Matteo Frigo +Date: Sun Jan 26 16:29:18 2003 -0500 + + Use null pointers when estimating. The estimator should never + time anything. + +commit 8a54d02af36535be471d8326bf4e061165295320 +Author: Steven G. Johnson +Date: Sun Jan 26 15:19:01 2003 -0500 + + note + +commit 127681d03bd37c45649032138e7c976ec3395c99 +Author: Steven G. Johnson +Date: Sun Jan 26 15:16:22 2003 -0500 + + support multiple mangling schemes with g77 + +commit 757b13e27cfe6317d5c871796c129ec5b693e89b +Author: Steven G. Johnson +Date: Sun Jan 26 12:58:57 2003 -0500 + + fixed verbose, made random tests only use selected rank, use rank <= 4, fixed final flush_problems call + +commit c379edca317112097e76dacd0dfb69c83c319023 +Author: Steven G. Johnson +Date: Sun Jan 26 12:42:49 2003 -0500 + + fixed typo (count instead of maxcount) + +commit 6c0c2a4aac442f27536a584f1e619c69f6aa7ca6 +Author: Steven G. Johnson +Date: Sun Jan 26 12:12:07 2003 -0500 + + hypot is no longer used + +commit 8466e0fb929081a67acbe832ddd155f33ee13734 +Author: Steven G. Johnson +Date: Sun Jan 26 12:07:43 2003 -0500 + + check for _alloca (MSVC) + +commit 34321edf6b705ea8f04c0ac903baf9a2d0239cd2 +Author: Steven G. Johnson +Date: Sun Jan 26 11:56:53 2003 -0500 + + slight fix in assert + +commit c099d12f16d6131750ccde572b7651661b84881b +Author: Matteo Frigo +Date: Sun Jan 26 11:55:39 2003 -0500 + + Allocate problem in all cases--- can_do may need correct pointers. + +commit 93ba509b275e8a2b798b237dae50927c04da5b74 +Author: Matteo Frigo +Date: Sun Jan 26 11:51:27 2003 -0500 + + Nastier checks + +commit 91419140c877e227d804c4cbb18cb89b350527b3 +Author: Matteo Frigo +Date: Sun Jan 26 11:51:16 2003 -0500 + + X(use_plan) is a relic. + +commit 9cc664aacbc213b2cdbca13e686ca9f15f4d89f4 +Author: Matteo Frigo +Date: Sun Jan 26 09:23:16 2003 -0500 + + Print full pathname of the bench executable, so that I don't get + confused when running multiple tests for different configurations. + +commit a755e0b1e768f7624d20ba4d564d9b658fc8aa45 +Author: Matteo Frigo +Date: Sun Jan 26 07:35:46 2003 -0500 + + Split done() into done() and cleanup(), in order to test + multiple problems with the same planner from the command line. + +commit c9a2310aa41b815190cd73c801d28f6b68635734 +Author: Matteo Frigo +Date: Sat Jan 25 20:44:49 2003 -0500 + + Improved readability + +commit 6a7d0ba4578fa4f1989e521e80cd1504dddb5ff9 +Author: Steven G. Johnson +Date: Sat Jan 25 19:17:26 2003 -0500 + + comment + +commit 7e5332d67aa4dd505518874798560834170c2d1c +Author: Steven G. Johnson +Date: Sat Jan 25 19:16:53 2003 -0500 + + added macos9 mpallocatealigned function + +commit f3bba67e15e3ff2cc63e615a97ef4161af9fbb6d +Author: Steven G. Johnson +Date: Sat Jan 25 18:59:55 2003 -0500 + + sometimes __APPLE__ is defined instead of __MACOSX__ + +commit eb44a626174b2c4b5a3b91799f929f087ab89b90 +Author: Steven G. Johnson +Date: Sat Jan 25 18:54:39 2003 -0500 + + macos x malloc is already 16-byte aligned + +commit e1f4dfe3d7d517b655cbf1d9f34910cf5b91f16f +Author: Matteo Frigo +Date: Sat Jan 25 13:38:32 2003 -0500 + + Include because uintptr_t is defined there + on solaris. + +commit 2e0d88fe660fa8d5dd70ac8b4d7ce327b8e3143a +Author: Matteo Frigo +Date: Sat Jan 25 13:22:59 2003 -0500 + + Oops---forgot getopt_long + +commit 8ca5ca5adffa7f09e53fd6876720807c9e09b526 +Author: Matteo Frigo +Date: Sat Jan 25 13:17:29 2003 -0500 + + Include default includes when checking for uintptr_t. + (Otherwise solaris breaks.) + +commit b2e7887137a70e836841860650f673a32d8fd0e0 +Author: Matteo Frigo +Date: Sat Jan 25 12:39:52 2003 -0500 + + distribute check.pl + +commit f523570817e6d4e02d1229eb4fae65aa54b39c90 +Author: Matteo Frigo +Date: Sat Jan 25 12:38:34 2003 -0500 + + Check split format, too. + +commit 4cf6b31bc1d606a85ebe86b81538440c32ba16d4 +Author: Matteo Frigo +Date: Sat Jan 25 11:48:19 2003 -0500 + + New tests, added make check + +commit cc595c7702af171d1850e32593ad093a1884fa98 +Author: Matteo Frigo +Date: Thu Jan 23 08:34:24 2003 -0500 + + More tests + +commit 132d24bf7371a5738a8703d6700452432c1ff8d6 +Author: Matteo Frigo +Date: Tue Jan 21 20:32:12 2003 -0500 + + Deal with rnk(sz)=-infinity + +commit dbf5eba2cfe458f7fa1853b8b73ac880f50268d3 +Author: Matteo Frigo +Date: Tue Jan 21 10:07:16 2003 -0500 + + Crazy idea + +commit 538d043b618e83f8c9dd443618e30fad09412560 +Author: Matteo Frigo +Date: Tue Jan 21 07:14:22 2003 -0500 + + Test program, still barely worthy of the name. + +commit bd13e47fca93beafd8c87bd039e4c7f6f9843cc0 +Author: Matteo Frigo +Date: Mon Jan 20 08:29:21 2003 -0500 + + Stylistic changes + +commit 7a7f938bfa0596d8a971476e304a584e80c9af3e +Author: Matteo Frigo +Date: Mon Jan 20 07:03:38 2003 -0500 + + Implemented flops api + +commit 06f9de2ae48e8508332300af57ce4a892d5d7327 +Author: Steven G. Johnson +Date: Sun Jan 19 14:27:21 2003 -0500 + + cleanup + +commit 0004f3c1d04b2dbf2cd0c329464a761f513b17e8 +Author: Steven G. Johnson +Date: Sun Jan 19 14:14:49 2003 -0500 + + 'v' syntax now defaults to an 'internal' (stride 1) vector, which is a more interesting case and corresponds more closely to the intuitive notion of a 'vector' transform, while '*' does the old 'external' (stride n) vector + +commit 3ae6aeb8ad69f728e24a22eaff8cb1c2d769dbfd +Author: Steven G. Johnson +Date: Sun Jan 19 13:55:35 2003 -0500 + + removed '/' overloading + +commit 16e5b7c653597353fa972d5da6226e3d1c21f09c +Author: Steven G. Johnson +Date: Sun Jan 19 13:52:09 2003 -0500 + + get rid of '*' and ',' synonyms for 'x' in problem parser; there's no need to clutter the namespace with syntax we never use + +commit fe570b1a3ef49b842a35c74088e1893023c924a3 +Author: Matteo Frigo +Date: Sun Jan 19 07:28:27 2003 -0500 + + Signed/unsigned fixes. + +commit 39087e0b7d51d64ce70403c94042723a27ebd90e +Author: Matteo Frigo +Date: Sun Jan 19 07:09:54 2003 -0500 + + Test split arrays. + +commit f5c448ba8c68ad9343a147b9ee0edddd48101248 +Author: Steven G. Johnson +Date: Sat Jan 18 23:46:57 2003 -0500 + + clarification + +commit ce827c93bd4b66fca1e4c6925c9638fc061f2a9c +Author: Steven G. Johnson +Date: Sat Jan 18 21:53:18 2003 -0500 + + caps + +commit 8e0bc243bfa4a19e901e09af2175220823a29fda +Author: Steven G. Johnson +Date: Sat Jan 18 21:52:51 2003 -0500 + + brackets + +commit 205193db72e85418b6db84064c2d0c417d3622ae +Author: Steven G. Johnson +Date: Sat Jan 18 21:52:32 2003 -0500 + + quote + +commit 53b6dc0784f2f573114f99a64e3c3a3f5c25d144 +Author: Steven G. Johnson +Date: Sat Jan 18 20:53:11 2003 -0500 + + referencing + +commit dc903b262a3cdbfacda95f8cacf08a79b26a3725 +Author: Steven G. Johnson +Date: Sat Jan 18 20:33:28 2003 -0500 + + fix + +commit 34867e8b93f1464aeb74afe7a57e6db29a6bf6ef +Author: Steven G. Johnson +Date: Sat Jan 18 20:31:41 2003 -0500 + + slight change + +commit de2f4e199030747045d6b15f10f81015e6fa77c9 +Author: Matteo Frigo +Date: Sat Jan 18 20:31:22 2003 -0500 + + Print errors when --verify. + +commit a241dce3b13972ae124686d2a73d6845172dca10 +Author: Steven G. Johnson +Date: Sat Jan 18 20:30:27 2003 -0500 + + improved description, noted that FFTW_ESTIMATE does not destroy arrays + +commit de9ad7da59f6f405cb9698340a708c51879074fa +Author: Steven G. Johnson +Date: Sat Jan 18 20:23:12 2003 -0500 + + FFTW_DEFAULTS isn't really needed + +commit 742ec9578cb87f7e8640c998b6455f0c1347cbad +Author: Steven G. Johnson +Date: Sat Jan 18 20:21:09 2003 -0500 + + added FFTW_MEASURE synonym for FFTW_DEFAULTS + +commit 7e4c0117633ecc6c774e5747fb88e5d9b901ade1 +Author: Steven G. Johnson +Date: Sat Jan 18 20:18:29 2003 -0500 + + slight change + +commit 1f5d8e6883c07b8b55b3ccdd76728dba0db83b51 +Author: Matteo Frigo +Date: Sat Jan 18 20:16:08 2003 -0500 + + Clearer name + +commit 72f6ff219f76d5836c974d7739c9deb1fdaae1b1 +Author: Matteo Frigo +Date: Sat Jan 18 20:13:14 2003 -0500 + + Completed dft api test + +commit d98d355d8025c3244f40cb21d3c13fd49b95bb31 +Author: Steven G. Johnson +Date: Sat Jan 18 20:07:33 2003 -0500 + + index + +commit 5abf9be2a1e971d3911958c2f2b0f830c1e94507 +Author: Steven G. Johnson +Date: Sat Jan 18 20:05:50 2003 -0500 + + fix + +commit 6ce8d648e9020903839bb75540e2c7f31c350a77 +Author: Steven G. Johnson +Date: Sat Jan 18 20:04:11 2003 -0500 + + parallel structure + +commit bf5e342ad8e4ec2778b7cb07e9fe04c3b88fef1c +Author: Steven G. Johnson +Date: Sat Jan 18 20:03:18 2003 -0500 + + fix + +commit 27f73ffc519eca88af9d51fccafa9d0a9eaec3d7 +Author: Steven G. Johnson +Date: Sat Jan 18 20:00:24 2003 -0500 + + joke + +commit fc0561411a690340303ab579fe66b5b919e94706 +Author: Steven G. Johnson +Date: Sat Jan 18 19:59:28 2003 -0500 + + recommendation to read tutorial in-order + +commit 23f008eece1d5af1cc9aff5c21f16c4b78626a43 +Author: Steven G. Johnson +Date: Sat Jan 18 19:54:55 2003 -0500 + + expanded outline + +commit dd05ed963f2b3b6248a90c8a28ec92ed0748447f +Author: Steven G. Johnson +Date: Sat Jan 18 19:35:52 2003 -0500 + + clarification + +commit 45f4203a263004153eb30c5e2b6d5fbf7d363ebe +Author: Steven G. Johnson +Date: Sat Jan 18 19:17:27 2003 -0500 + + draft complex-dft tutorial + +commit a1cf23e6204a958c2adb5fa5ad6908ed9ae8d5aa +Author: Matteo Frigo +Date: Sat Jan 18 17:27:15 2003 -0500 + + Paranoid mode is back. Fixed dwim to do what I mean. + +commit 02a981bcb005fd082e832f912a0d6970469af2db +Author: Steven G. Johnson +Date: Sat Jan 18 17:13:51 2003 -0500 + + started tut. + +commit db27392f9335988028063634e188cd6e0329b2db +Author: Matteo Frigo +Date: Sat Jan 18 16:13:15 2003 -0500 + + Great renaming, so that we can include both bench-user.h and + ifftw.h to implement the paranoid-mode hook. + +commit 272ce9998c6c2ba1440c85c89adf525029c3713c +Author: Matteo Frigo +Date: Sat Jan 18 15:41:18 2003 -0500 + + Trying to tweak the verifier so that I can use it in + bench.c for paranoid mode + +commit 9406410c744c3d040dcf53cab0033e6289315e0d +Author: Matteo Frigo +Date: Sat Jan 18 10:24:05 2003 -0500 + + Added stride_factor for complex arrays. + +commit be5440925e131346debad7cb5c52ec9ccca20838 +Author: Matteo Frigo +Date: Sat Jan 18 10:02:11 2003 -0500 + + can_do now calls the planner. + +commit 1c2aa801bd04200c319430596f26e33c57ade5b7 +Author: Matteo Frigo +Date: Sat Jan 18 09:59:24 2003 -0500 + + Call guru api in bench.c + +commit 5ccc685036846da380536544c08668012a62953a +Author: Matteo Frigo +Date: Sat Jan 18 08:17:23 2003 -0500 + + Fixed prototype. + +commit 6a0efba859963432de8d7ddef8a68615fba215df +Author: Matteo Frigo +Date: Sat Jan 18 08:14:48 2003 -0500 + + Attempt to make the signed/unsigned use of flags consistent. + +commit 6c6caca90a9df0f2f76cae61abf4d5b4108e5a16 +Author: Matteo Frigo +Date: Sat Jan 18 08:03:07 2003 -0500 + + Implemented useropt. + +commit 7165449ca5470fe7104141090f15d804f8fa3d58 +Author: Matteo Frigo +Date: Sat Jan 18 08:02:05 2003 -0500 + + The first map_flags pass must be transitive, i.e., always use the + latest flags value as opposed to the original value. (I think.) + +commit b5ff8655a95e88173c98942113dedb0b8f293154 +Author: Matteo Frigo +Date: Sat Jan 18 07:20:19 2003 -0500 + + Started working on verifier + +commit 6c1864f54390a4ba6483dd6f6af716030275af40 +Author: Steven G. Johnson +Date: Fri Jan 17 14:53:28 2003 -0500 + + added X(threads_cleanup) + +commit 53ccbeeb98ce85aeee2dfdc73a79518dd428cabd +Author: Matteo Frigo +Date: Fri Jan 17 10:35:56 2003 -0500 + + Use C style for upper and lower array bounds. Free tensors properly. + +commit 8f979d12529a8cdcbc19773db64b203d396667f3 +Author: Matteo Frigo +Date: Fri Jan 17 08:50:42 2003 -0500 + + Fixed ambiguous syntax + +commit b4a79fbfcd90a04148e114c3dc9ffeec57475b91 +Author: Matteo Frigo +Date: Fri Jan 17 08:20:57 2003 -0500 + + Parse minus sign, bugfixes + +commit 74b7faa7902bc94ba6a2cb2229b29a0ae7fc1ae6 +Author: Matteo Frigo +Date: Fri Jan 17 08:11:56 2003 -0500 + + Skeleton libbench2 implemented (probably still buggy) + +commit e589fb07c231478fcaac2ff1747634bf9f06ea8f +Author: Matteo Frigo +Date: Fri Jan 17 04:23:37 2003 -0500 + + Formatting + +commit ca9524db0c137f154e83a76d36cf935f00674f2e +Author: fftw +Date: Fri Jan 17 03:15:24 2003 -0500 + + slight updates + +commit 9cf580eecfb6efdc94025f0016482c3b39e42d44 +Author: Steven G. Johnson +Date: Fri Jan 17 01:44:44 2003 -0500 + + eliminated obsolete uimin/uimax + +commit 43e7097cd5f50fec4d5cba68968062d735c70118 +Author: Steven G. Johnson +Date: Fri Jan 17 01:40:10 2003 -0500 + + threads needs to have its own library, lest all programs linking to libfftw3.so need -lpthread + +commit dfbd69e73262bfd32e4238660b05e9e66f2d4639 +Author: Steven G. Johnson +Date: Thu Jan 16 19:53:46 2003 -0500 + + whoops + +commit 2270fad47a873f34165771451625eb46b32f8934 +Author: Steven G. Johnson +Date: Thu Jan 16 19:53:30 2003 -0500 + + better name + +commit 90d92f5270d46d9e8f4775937e55433d425a5706 +Author: Steven G. Johnson +Date: Thu Jan 16 19:52:36 2003 -0500 + + added more functions + +commit 3f06842ca4733e7ecabf350ae1e679d52ed7698a +Author: Steven G. Johnson +Date: Thu Jan 16 16:57:06 2003 -0500 + + if 'long' is big enough, use it for mulmod in preference to 'long long' + +commit 66e1948c825bca967b2ad7e6746242e8b23f2b00 +Author: Steven G. Johnson +Date: Thu Jan 16 14:53:41 2003 -0500 + + use uintptr_t for pointer alignment arithmetic + +commit 7eb1f83c40d65241a97769cbd182b979f54b3694 +Author: Matteo Frigo +Date: Thu Jan 16 07:58:28 2003 -0500 + + More signed/unsigned cleanup + +commit 45b331a5c2824f7d0d08df9385910c66db337edf +Author: Matteo Frigo +Date: Thu Jan 16 07:57:40 2003 -0500 + + null function pointers are technically nonportable + +commit 67822e08115a08b056287208aa8db4cf8679eeb5 +Author: Matteo Frigo +Date: Thu Jan 16 07:17:45 2003 -0500 + + Free short_options + +commit 477c8d3241c4d9943d025ae59f9305a0b149231b +Author: Matteo Frigo +Date: Thu Jan 16 05:48:30 2003 -0500 + + Oops, forgot STACK_FREE + +commit 0e20238b7462741468c08db5854a75106766b2ef +Author: Matteo Frigo +Date: Thu Jan 16 05:40:39 2003 -0500 + + Do not require memalign() unless HAVE_SIMD + +commit e1ab6010079824a6d2eba12510455609646681fc +Author: Steven G. Johnson +Date: Thu Jan 16 01:03:31 2003 -0500 + + MS VC++ _aligned_malloc + +commit b60bc7e076569eb05d30aea259d6d6347e6a2da0 +Author: Steven G. Johnson +Date: Thu Jan 16 00:44:45 2003 -0500 + + added api fftw_malloc/free + +commit fce03e8f76d32e4642d3e3abe4ace0d60e5e14f5 +Author: Steven G. Johnson +Date: Thu Jan 16 00:43:48 2003 -0500 + + silence warning + +commit 641795cb961dfc1336f70563c2c7ad1ed3192395 +Author: Steven G. Johnson +Date: Wed Jan 15 22:39:04 2003 -0500 + + send error output to stderr + +commit f6710096b2309498d0d21582380e4edf3f3cc75c +Author: Matteo Frigo +Date: Wed Jan 15 13:20:35 2003 -0500 + + Pure paranoia. + +commit 91f5030882cd7a147a68a99634aa5e2b962998cf +Author: Matteo Frigo +Date: Wed Jan 15 06:51:34 2003 -0500 + + Fixed formatting that was messed up by the conversion uint->int. + Ensure that iodims etc are kosher. + +commit e013a32092d6ec5aa0e9f2d9ae6c26d4b8659c6f +Author: Steven G. Johnson +Date: Wed Jan 15 01:32:18 2003 -0500 + + added version stamp + +commit 50b479b4aac66242696e7fd98f58455325526959 +Author: Steven G. Johnson +Date: Wed Jan 15 01:28:20 2003 -0500 + + added warning + +commit a1084fccb8215cfd46c69f6b5eeb7ff22f358d82 +Author: Steven G. Johnson +Date: Wed Jan 15 01:23:25 2003 -0500 + + add fftw-wisdom-to-conf to BUILT_SOURCES + +commit 4b8e34f3dba941ca2f59b9705ee49a9f29951906 +Author: Steven G. Johnson +Date: Wed Jan 15 01:09:29 2003 -0500 + + added const + +commit e3063ad93de5985a0cea8fcc35052dfdd31d3f24 +Author: Steven G. Johnson +Date: Wed Jan 15 01:04:10 2003 -0500 + + added wisdom-to-conf + +commit f1bc153c63191407f4af84ca6641b4153481abca +Author: Steven G. Johnson +Date: Wed Jan 15 00:23:36 2003 -0500 + + include type prefix in wisdom preamble + +commit 564b63e0eb961ab85824847dd4171323d185f2d3 +Author: Steven G. Johnson +Date: Wed Jan 15 00:02:31 2003 -0500 + + updates + +commit eed0a2c1a6165c360b7f87ff1aa77341dc112be5 +Author: Steven G. Johnson +Date: Tue Jan 14 23:59:26 2003 -0500 + + check the_plan before printing + +commit b90c45ecd325b1cbb5821b7d22b7d1003a01e11b +Author: Matteo Frigo +Date: Tue Jan 14 21:10:25 2003 -0500 + + Eliminated those unsigned values that would break LP64 machines. + +commit 2cfc97931df736f5090ba7eec7fa6d13686c6899 +Author: Steven G. Johnson +Date: Tue Jan 14 15:14:29 2003 -0500 + + comments + +commit 3b9adee3905d5c9686dd26e6af706297c57d3e6e +Author: Matteo Frigo +Date: Tue Jan 14 08:00:08 2003 -0500 + + Oops + +commit b8ef56b0756c8db296926946f027105168ac91c9 +Author: Matteo Frigo +Date: Tue Jan 14 07:59:14 2003 -0500 + + int/uint confusion + +commit 4063890615e1ebdd337cd0b6b79e3d8c191f7ac7 +Author: Steven G. Johnson +Date: Tue Jan 14 02:25:33 2003 -0500 + + updated introduction and some organization + +commit 23ce88399655bc3c3f102fb81927f18f964381d7 +Author: Steven G. Johnson +Date: Tue Jan 14 01:34:46 2003 -0500 + + whoops + +commit b165736884413d29ac6ea2d63b7784ebf40c8400 +Author: Steven G. Johnson +Date: Tue Jan 14 01:33:04 2003 -0500 + + newline + +commit 02a1859f44c60c5452b4d9fb3e89ecdac0d57873 +Author: Steven G. Johnson +Date: Tue Jan 14 00:23:04 2003 -0500 + + added win32 timer + +commit d0e64f8319671968827241d6923c1dcc613734ec +Author: Steven G. Johnson +Date: Tue Jan 14 00:12:21 2003 -0500 + + sync with kernel/alloc.c + +commit 1e179069c40aafd83bbaedf588ced907c60d8f7d +Author: Steven G. Johnson +Date: Tue Jan 14 00:03:20 2003 -0500 + + handle missing F77_FUNC_ + +commit d1e7472bbe33eaf99e4464fea7629ea9dc2549d8 +Author: Steven G. Johnson +Date: Mon Jan 13 17:42:50 2003 -0500 + + used fint instead of int to make Fortran integer type easier to change + +commit 2a5dd8f944a6ed354d8245abf6cc67de05ca7457 +Author: Steven G. Johnson +Date: Mon Jan 13 17:38:56 2003 -0500 + + slight abbreviation + +commit 1371e68a5061a7de34681052e5c7f31139752046 +Author: Steven G. Johnson +Date: Mon Jan 13 17:35:20 2003 -0500 + + the great lengthening, part I: int -> long in api; mv mktensor-rowmajor to api + +commit 1011711ec3ed3d1252ee9ea5134e8e18a9925081 +Author: Steven G. Johnson +Date: Mon Jan 13 15:23:22 2003 -0500 + + long types + +commit 2f236bb6f4b8d4b68a2799c59eed45c3fa5d9bef +Author: Matteo Frigo +Date: Mon Jan 13 04:20:37 2003 -0500 + + Renamed fftw_malloc -> MALLOC, X(free) -> X(ifree), X(free0) -> + X(ifree0), non_fftw_malloc -> NATIVE_MALLOC + +commit ab8d02fc9ecab18a2639a0167616e782995592eb +Author: Steven G. Johnson +Date: Mon Jan 13 02:37:22 2003 -0500 + + added beginning of Fortran interface + +commit f2c44ba05c22d8cab1e72c5393ba64e97fb4eb57 +Author: Steven G. Johnson +Date: Mon Jan 13 01:05:29 2003 -0500 + + add fortran mangling check + +commit 59c96c1e23c8b4b4830a0f1aa70d8715a57db138 +Author: Steven G. Johnson +Date: Mon Jan 13 00:33:28 2003 -0500 + + added guru r2r interface + +commit d1b297f4a235356f816342e21c1f69617d836a4f +Author: Steven G. Johnson +Date: Mon Jan 13 00:23:26 2003 -0500 + + whoops + +commit 07839004aaa3e10e2493cf14fcaf6c603703ecf6 +Author: Steven G. Johnson +Date: Mon Jan 13 00:16:20 2003 -0500 + + added r2r planner + +commit f0e64dbc84dcd207fcf9ab13bf270707e878b9cb +Author: Steven G. Johnson +Date: Sun Jan 12 22:58:18 2003 -0500 + + more long-double checks + +commit fc870a86543c6166b8f3c689278c3e6c429c8fb5 +Author: Steven G. Johnson +Date: Sun Jan 12 20:01:51 2003 -0500 + + slight regrouping + +commit 889820ff1b5fe4f8ccf4c0f321cbcfc6066facc6 +Author: Steven G. Johnson +Date: Sun Jan 12 19:58:46 2003 -0500 + + added joke + +commit 709357f9b9ad15dbc409491672174b0369364de5 +Author: Steven G. Johnson +Date: Sun Jan 12 19:53:58 2003 -0500 + + simplified rdft2 padding + +commit b724cc6adafccd6b09b69ea2433567634d2b18fc +Author: Steven G. Johnson +Date: Sun Jan 12 19:02:09 2003 -0500 + + added comment + +commit f7e00499811c30295febdd6d70699c0bee9c2260 +Author: Steven G. Johnson +Date: Sun Jan 12 18:54:49 2003 -0500 + + use latest api + +commit 17dfd8a88bbd556d885e59de2c75f6ed10666ee3 +Author: Steven G. Johnson +Date: Sun Jan 12 18:49:58 2003 -0500 + + nembed should only be in advanced (many) interface, not basic interface...only a handful of people over the years have ever requested that functionality. + +commit de10a37b79b7222dff049d7b17a2f52c4d8818f7 +Author: Steven G. Johnson +Date: Sun Jan 12 18:41:57 2003 -0500 + + impatient is default; generalize mapping functions using xor trick + +commit d759ad32aae7ec487f4bacbacd50c36e9b9252de +Author: Steven G. Johnson +Date: Sun Jan 12 14:39:42 2003 -0500 + + use NULL nembed to signal padding + +commit c52303f271b00a8388b368b13e26e492e34e8ac1 +Author: Steven G. Johnson +Date: Sun Jan 12 14:23:00 2003 -0500 + + accept NULL nembed + +commit 130e62b15d813a605dbe261661f3d4f73eefd869 +Author: Steven G. Johnson +Date: Sun Jan 12 13:57:13 2003 -0500 + + added execute-dft-r2c/c2r + +commit 1fd627fbdef40e0158d1880e765131d7316614eb +Author: Steven G. Johnson +Date: Sun Jan 12 13:43:20 2003 -0500 + + don't need dft.h + +commit 116ca5713809a7a18bea146e4e1d2c13679f0570 +Author: Steven G. Johnson +Date: Sun Jan 12 13:22:14 2003 -0500 + + tensors are compressed in the problem, duh + +commit 2ede363d3dc04c22c6d801931c613f8acb365f20 +Author: Steven G. Johnson +Date: Sun Jan 12 12:45:26 2003 -0500 + + noted that posix_memalign bug is now fixed, thanks to bug report by yours truly + +commit aa78a752a45559c3cd10009619c38714715b4bd8 +Author: Matteo Frigo +Date: Sun Jan 12 12:44:43 2003 -0500 + + Bug: n[3] instead of n[2]. Bug was propagated by copy-and-paste. + Grrr... + +commit da61449b6d55793e890eaf9246c2cef570656949 +Author: Matteo Frigo +Date: Sun Jan 12 12:41:43 2003 -0500 + + Express plan_dft() in terms of plan_many_dft() + +commit f50b2491505035d8da53cdc2f807f777ab7f2fa2 +Author: Steven G. Johnson +Date: Sun Jan 12 12:19:53 2003 -0500 + + whoops + +commit 91650cec6fb479345ace984c86a3d0bf8dd45fa3 +Author: Matteo Frigo +Date: Sun Jan 12 06:00:46 2003 -0500 + + Manual skeleton. + +commit 58983b0fcb5dde376eef5290f5afeda420bb3516 +Author: Steven G. Johnson +Date: Sat Jan 11 23:46:34 2003 -0500 + + added r2c/c2r guru api + +commit 7ab4791d61cf0a563110b7c4458f092ad3209452 +Author: Steven G. Johnson +Date: Sat Jan 11 23:42:10 2003 -0500 + + FFTW_DESTROY_INPUT is default for c2r transforms + +commit 702d37e3aa20ac9e2007f9415a6c09875dc58eec +Author: Steven G. Johnson +Date: Sat Jan 11 23:36:26 2003 -0500 + + added more of r2c/c2r api + +commit 877b1c30a8de302c16d17618928ea9eeafa1d840 +Author: Steven G. Johnson +Date: Sat Jan 11 21:09:41 2003 -0500 + + r2c doesn't have adjustible sign + +commit d7e17c10e9b94495bf5b8d91ee938bddb15a778f +Author: Steven G. Johnson +Date: Sat Jan 11 21:07:55 2003 -0500 + + note that copyright year is out of date + +commit 414ef3efe34a68c1d1886ebc7bf3696c9888312d +Author: Steven G. Johnson +Date: Sat Jan 11 21:04:23 2003 -0500 + + updated api for r2c + +commit f55aa9fa016782becff68f499151eb9b1142f48c +Author: Steven G. Johnson +Date: Sat Jan 11 21:00:07 2003 -0500 + + removed annoying nophys == niphys case + +commit 5ac383f909dedb9038b26d2534d1c50f831bb622 +Author: Steven G. Johnson +Date: Sat Jan 11 20:58:13 2003 -0500 + + added basic r2c/c2r planner + +commit 67a72b6fe3950808458f9db07fd17fdb5a23f174 +Author: Steven G. Johnson +Date: Sat Jan 11 19:34:14 2003 -0500 + + dist should be in terms of complex values + +commit 38330465de7aa72398c41e080a538abe90f11525 +Author: Steven G. Johnson +Date: Sat Jan 11 19:14:24 2003 -0500 + + added plan-with-nthreads + +commit 250cd26e00612f247ec647a8b1cd12757c6bc2dd +Author: Steven G. Johnson +Date: Sat Jan 11 19:12:51 2003 -0500 + + added function to set nthr + +commit 2a3a928928d0a1a720099f63d46f9c9335e60d07 +Author: Steven G. Johnson +Date: Sat Jan 11 18:04:57 2003 -0500 + + slight cleanup + +commit c70d4ae24f18ed8573746982ded357d7a66e45d7 +Author: Steven G. Johnson +Date: Sat Jan 11 17:57:29 2003 -0500 + + whoops + +commit f6eead982eac7fba05e3e1b211e92218fa75ac0e +Author: Steven G. Johnson +Date: Sat Jan 11 17:55:39 2003 -0500 + + maxlen is maximum string length, not including null termination + +commit 7d5ced1616625f49a8064e213c195cb0dfdfd015 +Author: Steven G. Johnson +Date: Sat Jan 11 17:50:49 2003 -0500 + + imprt reverts hashtable on failure + +commit 8b8397f47fca460f6f4d799ed4d3523dbb9febe4 +Author: Steven G. Johnson +Date: Sat Jan 11 16:43:54 2003 -0500 + + slight move + +commit ef10382faf88c76dbed1b15712ea4385f5c53d60 +Author: Steven G. Johnson +Date: Sat Jan 11 16:34:56 2003 -0500 + + stdio.h should be inlcuded outside of extern "C" + +commit a12b4db5cb652f45955ba8597ac6aad5494d10f2 +Author: Steven G. Johnson +Date: Sat Jan 11 16:26:35 2003 -0500 + + added guru planner API + +commit 6612a3a2112dc6db386ca1a7c9e80e0cdff8060a +Author: Steven G. Johnson +Date: Sat Jan 11 15:54:57 2003 -0500 + + added FFTW_FORWARD/BACKWARD + +commit e9182c7a6103c19c79d2d457aadfd3cbafc8e7f8 +Author: Steven G. Johnson +Date: Sat Jan 11 15:52:17 2003 -0500 + + added plan_many_dft + +commit 93581dbc842eb787a6a1f514d9ae4a3af66da1ae +Author: Steven G. Johnson +Date: Sat Jan 11 15:44:37 2003 -0500 + + indenting + +commit 4b42a448907aaef4bce3be179fe2676f89dc7580 +Author: Matteo Frigo +Date: Sat Jan 11 14:49:08 2003 -0500 + + Final \n + +commit 3174ca24fb957b047983215e5651a9f5db6a6687 +Author: Matteo Frigo +Date: Sat Jan 11 14:47:31 2003 -0500 + + Do not compile if not defined(FFTW_DEBUG), in order to avoid + unused code in the shared library. + +commit e011c0ebee3524df3ebfe4c485e34247e5167ffd +Author: Matteo Frigo +Date: Sat Jan 11 14:45:56 2003 -0500 + + Implemented print_plan() + +commit 83d6f1227a7413bf1cee8e8fda10b15569e6391f +Author: Steven G. Johnson +Date: Sat Jan 11 13:12:01 2003 -0500 + + changed the OOP-like plan_destroy to the more-grammatical destroy_plan + +commit 7f9077eb88fc4deb6d8c1457988ad518ab450a92 +Author: Steven G. Johnson +Date: Sat Jan 11 12:58:04 2003 -0500 + + added guru execute_dft + +commit eb4083006537a4a3dc5ee3d202d1bc9c07909a3b +Author: Steven G. Johnson +Date: Sat Jan 11 12:38:40 2003 -0500 + + allow for malloc errors in wisdom string, since non-fftw-malloc + +commit a84ffa432d7e480e83d87090ed763a8ba8deefc1 +Author: Steven G. Johnson +Date: Sat Jan 11 12:16:05 2003 -0500 + + cleanup should reset plnr to zero so that fftw can be restarted + +commit 5c64b4a2e584e795861b00a8c2683f1ab740c5f4 +Author: Steven G. Johnson +Date: Sat Jan 11 12:13:18 2003 -0500 + + NO_UGLY is an internal planner flag + +commit f9e7b4ae52caaf33854eeab2f49cc98c0ed76431 +Author: Matteo Frigo +Date: Sat Jan 11 11:23:13 2003 -0500 + + Written 1d api in terms of generic n-d api. The code is less compact + but easier to test + +commit 96c701ecb75dbd0236023c61f59a0cde3f0f330d +Author: Matteo Frigo +Date: Sat Jan 11 11:07:25 2003 -0500 + + Added wisdom to header file, made scanners/printer static. stdio.h + no longer needed in fftw.h, removed. Probably the printer_file + should be reintroduced in a separate file if we ever want to + print plans... + +commit ea3e4d45a1aec83b6e5534b2f0fbdd8271601ebd +Author: Matteo Frigo +Date: Sat Jan 11 09:49:30 2003 -0500 + + Implemented more APIs + +commit 41044feee9e55eb6ff29128fca2ad7458087146b +Author: Matteo Frigo +Date: Sat Jan 11 09:21:53 2003 -0500 + + Added cleanup() to API + +commit 125c89f921354d7d4e18aa61700b2d2ce8704e5f +Author: Matteo Frigo +Date: Sat Jan 11 09:17:34 2003 -0500 + + Started new bench.c. I had to rename plan_destroy -> + plan_destroy_internal to avoid conflicts with API + +commit f315b29db425d56e3daffc4a5710b8e6542a0c91 +Author: Steven G. Johnson +Date: Sat Jan 11 02:45:39 2003 -0500 + + fix types + +commit 9419d5287867213b7dec8bbb7e594a3f77157be2 +Author: Steven G. Johnson +Date: Sat Jan 11 02:13:25 2003 -0500 + + whoops + +commit 8a271133e0891ed171ae642860ef03dff81e4bce +Author: Steven G. Johnson +Date: Sat Jan 11 02:10:50 2003 -0500 + + added wisdom api + +commit ce93efb2d481b23ccb261df25cb2021dd38b5668 +Author: Steven G. Johnson +Date: Sat Jan 11 01:01:17 2003 -0500 + + grammar + +commit faefac80f41e5203c91c356619f97c3c1cdf8b13 +Author: Steven G. Johnson +Date: Sat Jan 11 00:54:54 2003 -0500 + + slight change + +commit c01969dd0125889865e81c33fff6f5a0055f71b5 +Author: Steven G. Johnson +Date: Sat Jan 11 00:52:04 2003 -0500 + + implemented api/mapflags + +commit fb2e4c252410f4b6d3e26ce97ca17083ca45a773 +Author: Steven G. Johnson +Date: Sat Jan 11 00:48:27 2003 -0500 + + IMPATIENT is an api issue + +commit 21879988984f816cbd2ff5250d85b004a7dac217 +Author: Steven G. Johnson +Date: Fri Jan 10 01:57:41 2003 -0500 + + removed un-needed headers + +commit d0d8c732879727d7af40c9301c58d661c4c62343 +Author: Steven G. Johnson +Date: Fri Jan 10 01:56:59 2003 -0500 + + mkplanner initializes nthr to 1 already + +commit e0b0e74169c6b2ee44abc01b035e356b5ab1aaa8 +Author: Steven G. Johnson +Date: Thu Jan 9 18:53:09 2003 -0500 + + boilerplate + +commit f90417638448166e44f56b0f7bcc61f0263c40b7 +Author: Steven G. Johnson +Date: Thu Jan 9 18:16:39 2003 -0500 + + fold vecloop into r{e,o}dft apply function to share buffer, etcetera + +commit aa1101d19e86b64d4753f8bf562df5db7ea5de73 +Author: Steven G. Johnson +Date: Thu Jan 9 18:10:19 2003 -0500 + + whoops, bugfix in impulse test for vecn > 1 + +commit d70526c96f5f1959cf5fa3df3e15ff71a8e66487 +Author: Steven G. Johnson +Date: Thu Jan 9 14:23:51 2003 -0500 + + bugfix, grr + +commit 6c4923f6c3d24b14b644dea8a85adaddfb165ef5 +Author: Steven G. Johnson +Date: Thu Jan 9 14:21:16 2003 -0500 + + fixed signed-ness enum problem + +commit 656713c6b00d9f53d81820fd4675fe568a204088 +Author: Matteo Frigo +Date: Thu Jan 9 14:12:42 2003 -0500 + + Explicit cast + +commit 06f32cbb5be575b9880ff2b1a0e4031fa9be68d1 +Author: Matteo Frigo +Date: Thu Jan 9 13:41:51 2003 -0500 + + Added configure_planner(). mkplan() behaves properly when plan is null. + +commit 0c9627b61142790be11d642e3348808cbfa7cd5e +Author: Matteo Frigo +Date: Thu Jan 9 06:48:53 2003 -0500 + + More API work + +commit e21443ac067af4615dc8513d68d880f78801b983 +Author: Matteo Frigo +Date: Thu Jan 9 05:40:34 2003 -0500 + + First skeleton of API infrastructure + +commit 8c1212b04af0632d827194223919a73133593c54 +Author: Steven G. Johnson +Date: Thu Jan 9 03:19:35 2003 -0500 + + unsigned strikes again + +commit d9142b307e261d5d50a1b2086eef9012e2c36602 +Author: Steven G. Johnson +Date: Thu Jan 9 01:51:45 2003 -0500 + + put rdft2_inplace_strides and rdft2_tensor_max_index in their own files for tighter linking + +commit 7c048dc37ce30e18367fc3e84ec7759a2c2f0b7e +Author: Steven G. Johnson +Date: Thu Jan 9 01:43:13 2003 -0500 + + added rdft2_tensor_max_index...incorrect use of tensor_max_index was preventing proper loop ordering for rnk > 2 rdft2 + +commit 561ca9cb4f10d1710cea9126fc0fa63366814127 +Author: Steven G. Johnson +Date: Thu Jan 9 00:44:45 2003 -0500 + + arbitrary spltrnk in rdft2 rank-geq2 + +commit f17e0e00c61ac65b9353fc879a5e33f185bc8f36 +Author: Steven G. Johnson +Date: Thu Jan 9 00:40:17 2003 -0500 + + don't mention wisdom when non-verbose + +commit be48b68a4776f2add565a8ff0b0b0c4b8095518e +Author: Steven G. Johnson +Date: Thu Jan 9 00:02:35 2003 -0500 + + bug fix: printing %T should pass tensor *, not tensor ** + +commit 13e8d5776b965f625f836ffb3ed0541c5ec1c3b4 +Author: Steven G. Johnson +Date: Wed Jan 8 23:40:48 2003 -0500 + + correct(?) normalization for rodft00 ... all of the even/odd transforms should be normalized according to the expanded'' DFT of ~twice the length + +commit 08581922580b63f9723d7bd0da7e341d49b0225a +Author: Steven G. Johnson +Date: Wed Jan 8 23:18:23 2003 -0500 + + fixed tests for n=1 + +commit cd3f97118a39ef25691a86f62df1a53abfe3f15b +Author: Steven G. Johnson +Date: Wed Jan 8 22:10:08 2003 -0500 + + fixed bug in vector tests for rdft(2) + +commit 81b7636d1db4f7c33fa315720b91077f0c189f22 +Author: Steven G. Johnson +Date: Wed Jan 8 20:12:00 2003 -0500 + + fixed handling when first rnk-1 dimensions compress to nothing (ugh) + +commit a1150e27e85473748f0705407bb3858272d25bca +Author: Steven G. Johnson +Date: Wed Jan 8 20:02:35 2003 -0500 + + fixed incorrect/missing rdft2 rank-0 handling + +commit 77ab86cd9b8adef254ae54ee9f5f1355efb82b6f +Author: Steven G. Johnson +Date: Wed Jan 8 19:49:05 2003 -0500 + + bug fix: for rnk > 1, must compress rnk-1 dims separately (ugh) + +commit cba19ba921fb1d660ea71804cd40ba3d14fac750 +Author: Steven G. Johnson +Date: Wed Jan 8 17:39:14 2003 -0500 + + added trailing newline + +commit 925276da406dd1908a70b57c584cab6719dfb44b +Author: Steven G. Johnson +Date: Wed Jan 8 17:38:02 2003 -0500 + + updated + +commit 3740fe7538b1f9e0c2776a305f1c46dde0e12082 +Author: Steven G. Johnson +Date: Wed Jan 8 16:53:16 2003 -0500 + + got rid of compiler warning + +commit 2dfda812b6ddde932b9dd627cfbc2677ec4caeb0 +Author: Steven G. Johnson +Date: Wed Jan 8 16:49:48 2003 -0500 + + whoops, test r2hc and not rodft00 by default + +commit 12f2eb610a61a32de3a2d961676f005a3c7bc0c9 +Author: Steven G. Johnson +Date: Wed Jan 8 16:46:24 2003 -0500 + + got rid of real_n...use physical n everywhere in rdft; fixed rdft sz compression; fixed rodft00 verify bug + +commit 17233aac9a159de06ecf2dec334205094e3e0a03 +Author: Matteo Frigo +Date: Wed Jan 8 07:20:47 2003 -0500 + + icc-6.0 bug workaround + +commit 8490d0c5c383dcfe1910afc3e006557fb7c9aa76 +Author: Matteo Frigo +Date: Wed Jan 8 04:21:40 2003 -0500 + + Reclaimed the fftw_real identifier, because I need it for the API + +commit 82c0ab6a22809a05739960cb8c06c9d14d5e7968 +Author: Matteo Frigo +Date: Wed Jan 8 04:14:55 2003 -0500 + + Use recommended AC_OUTPUT syntax + +commit 38010c2e123c85caeb3c0827f769f304b8f77c87 +Author: Matteo Frigo +Date: Wed Jan 8 04:00:22 2003 -0500 + + Removed FFTW(foo) as a synonym for X(foo). This is an API issue. + +commit 863cf56f79b7eac7b70f307d24f431d71bfbdd52 +Author: Steven G. Johnson +Date: Tue Jan 7 17:45:52 2003 -0500 + + get rid of warning + +commit fbc87e15fead24d239286af63e298620ac46b30b +Author: Matteo Frigo +Date: Tue Jan 7 16:22:39 2003 -0500 + + Renamed conflicting files */codelet.h into dft/codelet-dft.h and + rdft/codelet-rdft.h + +commit 683c665e1da6396f9b2c2dc8ecc749b90e666907 +Author: Steven G. Johnson +Date: Tue Jan 7 16:21:16 2003 -0500 + + updated + +commit 13ef7881b1b28e1772271d54f92e7f7d96059c25 +Author: Matteo Frigo +Date: Tue Jan 7 15:47:24 2003 -0500 + + Silence warnings + +commit f35b6c4c226aa4cba7f2a0b30b5493cc94517e13 +Author: Steven G. Johnson +Date: Tue Jan 7 15:00:14 2003 -0500 + + fftw2 used spltrnk=1 + +commit 9a9b9463c83f021eeefa0743fd50b9e11c008103 +Author: Matteo Frigo +Date: Tue Jan 7 14:32:06 2003 -0500 + + Silence warning + +commit 86d050e48df435dd7091a75e4ee9647cc31d65e0 +Author: Steven G. Johnson +Date: Tue Jan 7 12:13:50 2003 -0500 + + noted deficiency + +commit 97269b487afae721bc3efc07d4510284d184500e +Author: Matteo Frigo +Date: Tue Jan 7 07:18:51 2003 -0500 + + Strengthened conditions for a problem to be POSSIBLY_UNALIGNED + +commit d135e51da8af9610080ca861eec8a12f04e33617 +Author: Matteo Frigo +Date: Tue Jan 7 05:09:42 2003 -0500 + + Strengthened conditions for a plan to be POSSIBLY_UNALIGNED + +commit 41d4363cc830c074d8e602a4046fcfb361714aa3 +Author: Steven G. Johnson +Date: Sun Jan 5 02:43:45 2003 -0500 + + added copyright todo + +commit 81f531aeaa2fb148c7f8b5519a792c7e226060dd +Author: Steven G. Johnson +Date: Sun Jan 5 02:37:31 2003 -0500 + + modified comment + +commit e17581aca74e377a94b5506199a6f3c0d95dd218 +Author: Steven G. Johnson +Date: Sun Jan 5 02:34:36 2003 -0500 + + fixed comment + +commit f33e50cd3dedd8472c0b37116e337749dd80efa8 +Author: Steven G. Johnson +Date: Sun Jan 5 02:31:56 2003 -0500 + + implemented rdft2 verify + +commit 352eadf383e28c25c7132ace3c4179e561c54aa8 +Author: Steven G. Johnson +Date: Sat Jan 4 16:20:42 2003 -0500 + + fix --enable-single + +commit 3cd824b965de4c51a977683e83bfaa1f2d8b37ab +Author: Steven G. Johnson +Date: Wed Oct 23 12:59:12 2002 -0400 + + slight fixes + +commit 64f0f3180cf46058053d0a452152f3fb7e4d5363 +Author: Steven G. Johnson +Date: Wed Oct 23 12:42:39 2002 -0400 + + typo + +commit b6cffe0e74206ccd7ae7726181a361bea4d94986 +Author: Matteo Frigo +Date: Tue Oct 1 09:32:56 2002 -0400 + + Experimental stuff + +commit b92e96518b5b9ac3275a6f7194d5e1ec49b36e7d +Author: Matteo Frigo +Date: Sat Sep 28 13:03:53 2002 -0400 + + Experimental Franz mode + +commit fd2ac8fb21fc75eccec5c5352069388b52ab00ea +Author: Matteo Frigo +Date: Thu Sep 26 15:14:38 2002 -0400 + + const-correct + +commit ec5733489ef85cbe78e5253358fdb320be5b2642 +Author: Matteo Frigo +Date: Thu Sep 26 15:06:38 2002 -0400 + + Reuse dimcmp routine for other purposes + +commit 6fa12bfc6f9ac208da72478981473011a292f57d +Author: Matteo Frigo +Date: Wed Sep 25 07:37:38 2002 -0400 + + Use tornk1 correctly. + +commit 97b84fbe4c90ade6b9cad6ac2efba9b6fb305412 +Author: Matteo Frigo +Date: Wed Sep 25 07:36:38 2002 -0400 + + Hmm... I thought I had fixed this before... + +commit 69de6d4b5d66e405c267001886d8a7ae9e84224b +Author: Matteo Frigo +Date: Tue Sep 24 21:27:49 2002 -0400 + + Collect more common idioms + +commit 1bbba9625dca12e70a6e26402ba1a2262b7ca984 +Author: Matteo Frigo +Date: Tue Sep 24 21:15:57 2002 -0400 + + Still collecting common idioms... + +commit 01a7139392f8170c8563510d0c489bfd91687520 +Author: Matteo Frigo +Date: Tue Sep 24 21:13:00 2002 -0400 + + More garbage collection. + +commit 45bb1a6c49ce1569ebc75896da0ed42b0b03ee59 +Author: Matteo Frigo +Date: Tue Sep 24 21:08:19 2002 -0400 + + More compact code + +commit eed5c4ed8045a26be389b99e1492aedc5017f448 +Author: Matteo Frigo +Date: Tue Sep 24 20:54:43 2002 -0400 + + Collect common pattern if (foo) free(foo) ==> free0(foo) + +commit e7d2657d2d3bb77eb2403856e102678d865de742 +Author: Matteo Frigo +Date: Tue Sep 24 20:08:44 2002 -0400 + + Collect some common code in */buffered*.c + +commit 61cd95889228f7a100d853c42e461780fd01dd92 +Author: Steven G. Johnson +Date: Tue Sep 24 19:39:22 2002 -0400 + + use STRUCT_HACK #define to determing rdft kind[] allocation + +commit 337af322b345f45b275182f7bc8f5949794ea140 +Author: Steven G. Johnson +Date: Tue Sep 24 17:21:09 2002 -0400 + + report total pcost of measured/estimated plans...epcost is especially useful to estimate the effects of various impatience flags on planning time for large transforms + +commit 5cbf8b44eabe724a226d58fbeac341b7f3c13e49 +Author: Matteo Frigo +Date: Mon Sep 23 18:49:10 2002 -0400 + + Prevent unwanted inlining + +commit 7342f004be53b759052eaf9a01a9a574dc64631f +Author: Matteo Frigo +Date: Mon Sep 23 18:37:59 2002 -0400 + + Space compaction + +commit d8299eef074631210e64b01453a7602dad45d6b8 +Author: Matteo Frigo +Date: Mon Sep 23 11:49:32 2002 -0400 + + Still reducing size + +commit 5df9269dc8d95153c138fd44e41effd6ed1f58e2 +Author: Matteo Frigo +Date: Sun Sep 22 16:03:30 2002 -0400 + + Saved another 5KB by redesigning opcnt protocol. (gasp!) + +commit 074344d84ab955d0ad7efdc9b58f8414952a0372 +Author: Matteo Frigo +Date: Sun Sep 22 15:00:59 2002 -0400 + + More code compression + +commit 7e2e90935398c3d3d50cc2bbcab66d4b188bf757 +Author: Matteo Frigo +Date: Sun Sep 22 13:27:46 2002 -0400 + + Smaller code size. + +commit 1da75a085efd3348694dafb0905fb59e2c6cee27 +Author: Matteo Frigo +Date: Sun Sep 22 12:50:36 2002 -0400 + + Started unification of rader + +commit e0cb464fbac3602192afd97211885e814674d246 +Author: Matteo Frigo +Date: Sun Sep 22 12:35:30 2002 -0400 + + Typo + +commit 363f9b3b1a6bbf78e371c46a74645b55281ec0ca +Author: Matteo Frigo +Date: Sun Sep 22 12:25:20 2002 -0400 + + Changed protocol for destroy_plan so as to save space. + +commit daf930d4450cc9caa5d528b631f964bfbf16a208 +Author: Matteo Frigo +Date: Sun Sep 22 11:08:57 2002 -0400 + + Introduced convenient function X(mkplan_d) + +commit e74d86afcd19e77f275c86c916449ae2b82310be +Author: Matteo Frigo +Date: Sun Sep 22 10:21:36 2002 -0400 + + Split tensor/md5 into separate files to allow independent linking + and/or prevent undesidred inlining + +commit 249329f66447c68d67536d4a868ac589b264a9ff +Author: Matteo Frigo +Date: Sun Sep 22 09:49:09 2002 -0400 + + Treat all tensors as dynamically allocated objects. They were + dynamically allocated in part anyway, so there is no point in + complicating the object code with the clumsy calling conventions + for by-value structs. + +commit 53cf5c7cab96e0657153327e660e787279e77c4f +Author: Steven G. Johnson +Date: Sat Sep 21 18:24:55 2002 -0400 + + typo + +commit e36da5f9b63af8a62dab370b005e2472e5edc33f +Author: Matteo Frigo +Date: Sat Sep 21 18:10:07 2002 -0400 + + Avoid generating NaN when n = 0. + +commit a49b921ea278fcb353b2be6338d04daf3b0a72dc +Author: Matteo Frigo +Date: Sat Sep 21 18:04:05 2002 -0400 + + Saved more. + +commit 2008afba6889d6f2b9d3f00dcbcf0bc9edd8c7c2 +Author: Matteo Frigo +Date: Sat Sep 21 17:47:36 2002 -0400 + + Save 1200 bytes of object code. Do not pass structs by value whenever + practical, because the calling protocol generates clumsy code. + +commit 8dbaef7c3531ccca29ae4f52528ed11c5089700d +Author: Matteo Frigo +Date: Sat Sep 21 12:10:21 2002 -0400 + + Do not allocate buffers for rader omegas. Let the planner do it + if necessary. + +commit 0cd3107a7fe058042f7e23b73658bacf82d08805 +Author: Matteo Frigo +Date: Sat Sep 21 12:03:46 2002 -0400 + + Check rank *before* reading kind[0], which may be undefined if rnk < 1 + +commit ffab113d0748937a80de8e046d5d971a7cfde97f +Author: Matteo Frigo +Date: Sat Sep 21 11:48:50 2002 -0400 + + Second step towards rader unification. + +commit 054daf75a708d4b060c35b13a48ee8e8b1732cc1 +Author: Matteo Frigo +Date: Sat Sep 21 11:37:06 2002 -0400 + + First step towards unification of Rader code + +commit fc97f7d9567238bd1930e63614352160ff2bc202 +Author: Matteo Frigo +Date: Sat Sep 21 07:58:11 2002 -0400 + + Fix ugliness condition for cooley-tukey. + +commit 28fe4962b2e634dc302c3fba3853b87788b411ad +Author: Matteo Frigo +Date: Fri Sep 20 16:53:45 2002 -0400 + + Removed RADER_MIN_GOOD and associated machinery + +commit dc40093700e7a00e3808b606108137c7ce5cb592 +Author: Matteo Frigo +Date: Fri Sep 20 14:49:12 2002 -0400 + + Proper cast + +commit 2eec2b720ae866f16db023e3815f27875f572a56 +Author: Matteo Frigo +Date: Fri Sep 20 14:45:54 2002 -0400 + + Typo + +commit d55f46a0acf7e75a5c216964aa0016166254876f +Author: Matteo Frigo +Date: Fri Sep 20 14:38:13 2002 -0400 + + Implemented NO_LARGE_GENERIC + +commit 535ecb44b8e4450306cf760afb294431e5595ae6 +Author: Matteo Frigo +Date: Thu Sep 19 07:48:25 2002 -0400 + + Consistent macroization of NO_DHT_R2HC + +commit fe02be9d79515c92b53d929977c270b46a8b7fdd +Author: Matteo Frigo +Date: Wed Sep 18 21:47:17 2002 -0400 + + NO_DHT_R2HC is a planner flag, otherwise the EXHAUSTIVE planner loops. + +commit 20e70850bb3d2cd4590c9bfce7777b8a2f9a80fc +Author: Matteo Frigo +Date: Wed Sep 18 20:47:31 2002 -0400 + + Resurrected NO_EXHAUSTIVE + +commit 4e477d8e68603cc899c8d0104fc6897817fd74d9 +Author: Steven G. Johnson +Date: Wed Sep 18 19:31:57 2002 -0400 + + au revoir, score() + +commit c3f01031fa05a9088d18e643a9b3476fa6a6437d +Author: Steven G. Johnson +Date: Wed Sep 18 19:31:05 2002 -0400 + + eliminated unused + +commit 25e32538394211412f3aac06baa6677ae148ea03 +Author: Steven G. Johnson +Date: Wed Sep 18 18:28:44 2002 -0400 + + capitalize and parenthesize SUBSUMES + +commit 7115ad27ce3a4390e6c81800126315f757abbdb5 +Author: Steven G. Johnson +Date: Wed Sep 18 18:26:58 2002 -0400 + + comment + +commit 3ec48dd0fd8e9cc88fd85a1b7b74f9ec5ef1789d +Author: Matteo Frigo +Date: Wed Sep 18 18:03:18 2002 -0400 + + Use flags from wisdom if wisdom is applicable. + +commit e16b332f900b1872044fe195f7e40ae15e5ed5e6 +Author: Matteo Frigo +Date: Wed Sep 18 17:16:17 2002 -0400 + + Removed score() machinery + +commit bc4041b9adab2d69de986123e38bee24f480eb3a +Author: Matteo Frigo +Date: Wed Sep 18 14:12:21 2002 -0400 + + Revised planner hack + +commit 4f3717ebf2eca24ac5e8017eaf8856bf5270020c +Author: Matteo Frigo +Date: Wed Sep 18 10:14:41 2002 -0400 + + Fix warning + +commit b627b00f2f1adf8c8839b27618ac1765064c0b78 +Author: Matteo Frigo +Date: Tue Sep 17 17:54:07 2002 -0400 + + Type qualifiers. + +commit 48fc716d339ceb08432ab2a6704e79de578ad5fc +Author: Matteo Frigo +Date: Tue Sep 17 16:17:55 2002 -0400 + + ESTIMATE is no longer subsumed by everything else. + +commit 1c6447f56fe864b172d70f8940dc9de74a15a499 +Author: Matteo Frigo +Date: Tue Sep 17 10:55:15 2002 -0400 + + NO_BUFFERING is a planner flag, not a problem flag + +commit 458afba08480c2115e585e898153352ca125ff39 +Author: Matteo Frigo +Date: Tue Sep 17 09:36:16 2002 -0400 + + Maintain flags in canonical form. + +commit 1a01c050c68d0ffa9380d7bd780194509c75a31e +Author: Matteo Frigo +Date: Tue Sep 17 09:09:57 2002 -0400 + + In dramatic break with tradition, SUBSUME is now a partial order. I + swear. + +commit 7c1f9aafa59ca2c68f98f1b2f88ca8b029506e09 +Author: Matteo Frigo +Date: Tue Sep 17 07:29:00 2002 -0400 + + Added comment + +commit 8b8f6515fa6ddcc9ac579c80062a9b9aa55917c1 +Author: Matteo Frigo +Date: Tue Sep 17 07:27:17 2002 -0400 + + Inverted ESTIMATE flag, renamed USE_SCORE for consistency with the + convention that 0 subsumes 1. + +commit 1fd38e50ba038d57947daa7c999bab9da4a33836 +Author: Steven G. Johnson +Date: Tue Sep 17 02:50:15 2002 -0400 + + NO_INDIRECT -> NO_INDIRECT_OP (out-of-place only) + +commit ff2617c02989df82c99fd064ec298e107afe627e +Author: Steven G. Johnson +Date: Tue Sep 17 00:40:04 2002 -0400 + + hpux needs -D_REENTRANT (thanks to Clinton Roy for the bug report) + +commit ef127fa967046516cf5658be72eb70c93b817120 +Author: Matteo Frigo +Date: Mon Sep 16 23:54:34 2002 -0400 + + Oops. + +commit 70546cbffe33ede1657b54f626e133039ba26528 +Author: Matteo Frigo +Date: Mon Sep 16 23:44:47 2002 -0400 + + Yet another attempt at getting the planner right. + +commit ac2a09b8c81db49fcc9c770b94723577beee286c +Author: Matteo Frigo +Date: Mon Sep 16 21:56:14 2002 -0400 + + Better coding. + +commit a0a3d5520d53b44194f63fe2873207b57a07d544 +Author: Matteo Frigo +Date: Mon Sep 16 21:51:06 2002 -0400 + + NO_UGLY is no longer a flag, but a separate planner field that does not + interfere with wisdom. + +commit 69253431765ca3b9cfce2c4a56c846512f6c9968 +Author: Matteo Frigo +Date: Mon Sep 16 19:04:41 2002 -0400 + + Did not compile without FFTW_DEBUG + +commit 43a0347e3daa0fd854eec1d7ded5c6f45ce727e4 +Author: Matteo Frigo +Date: Mon Sep 16 18:37:06 2002 -0400 + + Changed scoring mechanism. + +commit e4f00711d6784b6f4196859738a039ae1f7b9edd +Author: Matteo Frigo +Date: Mon Sep 16 17:13:45 2002 -0400 + + Count infeasible plans + +commit 18299388527442d1dfc7b7a5748da0d987c019bc +Author: Matteo Frigo +Date: Mon Sep 16 16:36:12 2002 -0400 + + curse subsumed plans before export + +commit fb22a4fc3b6fa45b0f46f605ed1c94eba5960359 +Author: Steven G. Johnson +Date: Mon Sep 16 15:40:46 2002 -0400 + + removed ESTIMATE_BIT vs. ESTIMATE... ESTIMATE | IMPATIENT is a UI issue + +commit 548808e1fefe66c9b882d332d70488986e3b073d +Author: Steven G. Johnson +Date: Mon Sep 16 15:31:39 2002 -0400 + + cleanup + +commit 14a42333af6152472262413b8d1a97207a1aff59 +Author: Steven G. Johnson +Date: Mon Sep 16 15:28:47 2002 -0400 + + use CONSERVE_MEMORY flag to prevent buffered for large sizes + +commit 688cb6fee87d6ba5ed14e9e9899ba46c96eaddbb +Author: Steven G. Johnson +Date: Mon Sep 16 15:16:16 2002 -0400 + + moved NO_DHT_R2HC back into planner flags: there's no reason we would want this flag to block plan reuse + +commit b06ee447ad1ee0f95af06c2d91092db1475f44a5 +Author: Steven G. Johnson +Date: Mon Sep 16 14:59:14 2002 -0400 + + whoops, commas + +commit 396a6523178fa8aa79f3b716e6a14577bb83c337 +Author: Steven G. Johnson +Date: Mon Sep 16 14:58:26 2002 -0400 + + problem_flags == checked in applicable, planner_flags == checked in score + +commit b7ef5ad344bcd298e14a30b30bd2d6f2b3c7442f +Author: Steven G. Johnson +Date: Mon Sep 16 14:53:16 2002 -0400 + + ESTIMATE should not *include* all impatience flags, even if it subsumes them; some impatience flags, like NO_INDIRECT, might make a problem unsolvable + +commit 81a60e6002c427a15cbb298654f954c09954c9a4 +Author: Steven G. Johnson +Date: Mon Sep 16 00:56:29 2002 -0400 + + quotatio marks + +commit 0833118f7818c740e7387c607c320e79e088c6be +Author: Steven G. Johnson +Date: Sun Sep 15 23:55:44 2002 -0400 + + delete blank line + +commit 4cbe17440ce2d074a4c0a0d3245d25c63dd469fb +Author: Steven G. Johnson +Date: Sun Sep 15 23:51:14 2002 -0400 + + substitution + +commit 3963051622d435d96083c0d753dcd8f503bac2f5 +Author: Steven G. Johnson +Date: Sun Sep 15 23:49:50 2002 -0400 + + note that we are not GNUlly correct + +commit ec9b8c84419f5dd8cd533eca7b07391696019046 +Author: Steven G. Johnson +Date: Sun Sep 15 23:41:01 2002 -0400 + + indenting + +commit bb5f5581a5d05566bf679da7ed67a2e59e68781e +Author: Steven G. Johnson +Date: Sun Sep 15 23:37:46 2002 -0400 + + more jokes + +commit 0db38cc3a3f7215cdd2e9c308fa9d88c0422024e +Author: Steven G. Johnson +Date: Sun Sep 15 23:20:14 2002 -0400 + + NONTHREADED_ICKYP includes nthr > 1 check + +commit a1900e4f7fdc5bc663fe60ec30d99f342ac06d34 +Author: Steven G. Johnson +Date: Sun Sep 15 22:56:44 2002 -0400 + + use md5sig + +commit 7f2631f48f2874827ca50e2c9ee4d59ddf861ba3 +Author: Steven G. Johnson +Date: Sun Sep 15 22:55:41 2002 -0400 + + md5sig typedef + +commit c83d9aa4a856e2b34011a4285df02dc43937d982 +Author: Steven G. Johnson +Date: Sun Sep 15 22:35:13 2002 -0400 + + updated + +commit 849fd22c4bdead7cab04a20c1b63966946b2355a +Author: Steven G. Johnson +Date: Sun Sep 15 22:30:26 2002 -0400 + + partially-ordered impatience + +commit f811a39af185c82590b34fd1439901b8cbf32d03 +Author: Matteo Frigo +Date: Sat Sep 14 19:47:56 2002 -0400 + + Removed all that planner inheritance crap. + +commit 74cf5ca97fc18b5d64c869c64575c0095f8b81c2 +Author: Steven G. Johnson +Date: Sat Sep 14 16:35:28 2002 -0400 + + string.h is used for more than strlen + +commit 7f974585ea055241b1339d303ffdb472305c7d75 +Author: Matteo Frigo +Date: Sat Sep 14 12:19:13 2002 -0400 + + Reduced hashtable size by 1/6 (on 32-bit machines) at the expense + of messier planner. + +commit 8b1efa0ba0e2a490fc04c66900ad41248a55c86c +Author: Matteo Frigo +Date: Sat Sep 14 08:31:29 2002 -0400 + + Only print wisdom if verbose > 3 + +commit abd7a17545150645bb864c140559ba794257a897 +Author: Matteo Frigo +Date: Sat Sep 14 07:56:56 2002 -0400 + + Changed syntax of temporaries to avoid shadowing library functions + (which is harmless but I hate the warning) + +commit a120b53fd271fad4f9b879ff6247840764061813 +Author: Steven G. Johnson +Date: Fri Sep 13 23:07:39 2002 -0400 + + only add warnings in debug/maintainer mode, and add a few more warning flags; eliminate more warnings; add support for posix_memalign (broken in glibc, grrr) + +commit 7832eabf884004c42c3e4089fe637e205f47732e +Author: Matteo Frigo +Date: Fri Sep 13 21:57:50 2002 -0400 + + Explicit cast + +commit d5127e37db1b557049933fe9aff91d9c3b0a1dc0 +Author: Matteo Frigo +Date: Fri Sep 13 21:54:50 2002 -0400 + + Use double-hashing. This allows a slightly higher load factor + at the expense of a messier computation of the hashtable size. + +commit e689e22a6e1b981c379989a760186035fa18939c +Author: Steven G. Johnson +Date: Fri Sep 13 17:53:13 2002 -0400 + + typo + +commit 1d2a159b2078ef8c6063fad80d7358fd30bd4f9d +Author: Matteo Frigo +Date: Fri Sep 13 15:36:07 2002 -0400 + + Slight change in hash table growth functions. + +commit 9e1d9f0454bc70a807bcdb0f9ff25ed18a7c9903 +Author: Matteo Frigo +Date: Fri Sep 13 14:58:22 2002 -0400 + + More statistics. + +commit e1049bcf9446871a4ed34cebaae6b5b542dbca53 +Author: Matteo Frigo +Date: Fri Sep 13 10:13:02 2002 -0400 + + Clearer logic. + +commit 4dda68614273939d7843da329ab6c8b4da2e7bb6 +Author: Matteo Frigo +Date: Fri Sep 13 10:11:10 2002 -0400 + + Oops. + +commit 223f36a95fc7bd42e3b2d4bac8ad506cc2e4c8d9 +Author: Matteo Frigo +Date: Fri Sep 13 09:31:46 2002 -0400 + + Cleaned up + +commit c78314bd598dfb1c7e54f18fc2d050240910de4c +Author: Matteo Frigo +Date: Fri Sep 13 09:16:07 2002 -0400 + + Deal properly with infeasible problems. + +commit 875f159755baff40c2dd02f462c6bc36c49fbc59 +Author: Matteo Frigo +Date: Fri Sep 13 07:15:06 2002 -0400 + + Redundantly initialize hash table to prevent valgrind warnings. + +commit b7047a11d0b3e41e53e1890f73135be6f2ce3b2c +Author: Matteo Frigo +Date: Thu Sep 12 19:00:22 2002 -0400 + + Removed relics from past. + +commit 4cae827eaf456e69f3155183afd52e4c0216c980 +Author: Matteo Frigo +Date: Thu Sep 12 18:53:44 2002 -0400 + + md5hash a problem only once. + +commit a1ef1699bff263e0141cd43801c7a4ff3431389e +Author: Matteo Frigo +Date: Thu Sep 12 16:33:49 2002 -0400 + + Renamed k7 codelets + +commit c4367d998eeed60d4618b8a5b54162d500b84271 +Author: Steven G. Johnson +Date: Thu Sep 12 16:32:03 2002 -0400 + + FORBID_DHT_R2HC -> DHT_R2HC_VERBOTEN for consistency + +commit 39a9858e45ca542695b9419c09ec6b61b09a6004 +Author: Steven G. Johnson +Date: Thu Sep 12 16:28:43 2002 -0400 + + removed obsolete macro + +commit bd1d1de9ba94e111921e911a49de82fe4ff2d16e +Author: Matteo Frigo +Date: Thu Sep 12 16:20:39 2002 -0400 + + Split flags in SIMD code. + +commit b9fbfffc3ee26e56c4c16448ced8db523670de55 +Author: Matteo Frigo +Date: Thu Sep 12 16:18:51 2002 -0400 + + Forgot to fix threads + +commit 1d3447ab63c27d4bd97beb41882ca34addd0df18 +Author: Matteo Frigo +Date: Thu Sep 12 16:10:05 2002 -0400 + + Split flags into planner_flags and problem_flags + +commit 075ff4047c6c5a98bd268a3bae692df6a9ec1d84 +Author: Steven G. Johnson +Date: Thu Sep 12 15:46:56 2002 -0400 + + tetrameter + +commit ff7f0235dd4460a5e3c332725151037107514954 +Author: Matteo Frigo +Date: Thu Sep 12 15:11:21 2002 -0400 + + Overwrite less impatient solutions properly. + +commit b470f419700398ec14357990abeb69aa6eb4d857 +Author: Matteo Frigo +Date: Thu Sep 12 11:29:16 2002 -0400 + + Oops. + +commit 1ae2a65b2895b51b43f316fa11fcc932ed127ae2 +Author: Matteo Frigo +Date: Thu Sep 12 10:58:56 2002 -0400 + + Keep less impatient solution in case of conflict. Paranoid + cast to uint in certain places. + +commit 640b1f4df72028daa4293c304e53af0da7f31c36 +Author: Matteo Frigo +Date: Thu Sep 12 10:02:51 2002 -0400 + + Complete reimplementation of planner hash table. + +commit 40f47f4111154bd1e17e44f87908228ede39af18 +Author: Matteo Frigo +Date: Thu Sep 12 07:58:45 2002 -0400 + + planner->cnt was not properly decremented. + +commit fda67f21284b158043d7ba171a81a933a3891e1a +Author: Steven G. Johnson +Date: Wed Sep 11 17:52:39 2002 -0400 + + typo + +commit ebe84b30659823364a95bfd646512b387bef4629 +Author: Matteo Frigo +Date: Mon Sep 9 17:10:45 2002 -0400 + + Simplified + +commit 230458a658da6fa62fac4ccd66918f38442df00b +Author: Matteo Frigo +Date: Mon Sep 9 17:03:32 2002 -0400 + + Always overwrite old wisdom with new, in case the old is + corrupt/conclicting. + +commit 2d91c8d00acc06eb228d7ba5492e8f6ec7ee24d9 +Author: Steven G. Johnson +Date: Mon Sep 9 16:56:03 2002 -0400 + + added quote/joke + +commit 0173e3dc140cec9b061b4cf0cc0a626e41105e1f +Author: Matteo Frigo +Date: Mon Sep 9 15:04:47 2002 -0400 + + Completed wisdom import + +commit dee4de2b0b7a9c60d9501d67e5ab17c5e828e474 +Author: Matteo Frigo +Date: Mon Sep 9 10:14:22 2002 -0400 + + Slight cleanup of md5 interface. + +commit b990a36ddb7c8ec04d248fcbbbc4a135827cf7b2 +Author: Matteo Frigo +Date: Tue Sep 3 22:32:43 2002 -0400 + + More consistent protocol between planner and inferior. + +commit fbf287fea9e51a6eb2a62030a115aea58ef2f630 +Author: Matteo Frigo +Date: Tue Sep 3 21:08:30 2002 -0400 + + I can't think of any situation where saving infeasible problems would + be desirable. Removed relevant code. + +commit c194f7f7a34d6909408bcd55e543f4cbf7a60a2f +Author: Matteo Frigo +Date: Tue Sep 3 20:57:03 2002 -0400 + + Encoder registrar's names in wisdom. Remove export_conf, since + a separate program can now generate it. + +commit e9a30d633c905ac3eba878af7839ad73f153dd06 +Author: Matteo Frigo +Date: Tue Sep 3 15:11:06 2002 -0400 + + Fixed typo + +commit 51b8ddee6eda85459d68909df089b7e251fb65ca +Author: Matteo Frigo +Date: Tue Sep 3 14:52:45 2002 -0400 + + Fixed broken trochaic meter. + +commit eb531c7d3242141b4603cca8f270d88bab0f48e3 +Author: Matteo Frigo +Date: Tue Sep 3 09:49:50 2002 -0400 + + Initialize planner->score. It is correct to leave it uninitialized, + but I don't want people to send reports about purify complaining. + +commit 6a000fc379ab96b4ea9310e76f5391af7d6131a8 +Author: Matteo Frigo +Date: Tue Sep 3 09:03:46 2002 -0400 + + More latin silliness + +commit 3b9fecd5d0365958954cc149251fed5b9ce07ddc +Author: Steven G. Johnson +Date: Mon Sep 2 17:57:32 2002 -0400 + + updated + +commit 28a40bce8ba8e91b240d4f6e7ddcf55b68f05e77 +Author: Steven G. Johnson +Date: Mon Sep 2 17:33:49 2002 -0400 + + added clock() getseconds timer + +commit c004f7f51d23ac8f1c6220ff4a18e83d2e4fe7cf +Author: Matteo Frigo +Date: Mon Sep 2 16:16:58 2002 -0400 + + Oops + +commit 3f227ec57b346fe8688fbf2e08dfcf6cc3c3c955 +Author: Matteo Frigo +Date: Mon Sep 2 15:58:19 2002 -0400 + + Experimental INDIRECT_VERBOTEN flag (not used) + +commit 802f348a8a8c0bd97e15ed827e8092ab358abbe2 +Author: Matteo Frigo +Date: Mon Sep 2 15:36:21 2002 -0400 + + Do not allow buffering in children of indirect solvers. + +commit f081fc5e202141350664e3d9adbe947d5331ab9f +Author: Matteo Frigo +Date: Mon Sep 2 15:02:11 2002 -0400 + + Oops + +commit 08826857c28146b6366770565a9971eb4bdd9505 +Author: Matteo Frigo +Date: Mon Sep 2 14:32:28 2002 -0400 + + Hash sizeof(R) as part of wisdom. + +commit ff803ad22f9a5a980be0ab10aebd18ab210557de +Author: Steven G. Johnson +Date: Mon Sep 2 13:47:57 2002 -0400 + + added --enable-float synonym for --enable-single (since with have --enable-long-double) + +commit 99672a129c0032eeb3c99424d16f16547e1fff5d +Author: Matteo Frigo +Date: Mon Sep 2 13:46:08 2002 -0400 + + zerotens is now in its own file, so it does not cause dft to be linked + in if only rdft is used. + +commit fe35f517845e4692b46077037dc40b155c9fa500 +Author: Matteo Frigo +Date: Mon Sep 2 11:56:37 2002 -0400 + + Removed unused var. + +commit 2a4e8a9a1121f4adb852256865ae2b52743d6f40 +Author: Matteo Frigo +Date: Mon Sep 2 11:55:33 2002 -0400 + + Split insert() in preparation for wisdom import + +commit fc1cf1dfa9a72fe8968426c4e694b7336926a03d +Author: Matteo Frigo +Date: Mon Sep 2 11:46:57 2002 -0400 + + Moved debugging infrastructure to test directory so that it is not + linked into the shared library. + +commit 07a825b37e850981bc9fa18460538346cc7dd137 +Author: Matteo Frigo +Date: Mon Sep 2 11:04:54 2002 -0400 + + Reactivated wisdom export + +commit dfcc8fd2b155015d11c95762e4384ae139f922c6 +Author: Matteo Frigo +Date: Sun Sep 1 21:30:58 2002 -0400 + + Dump errors to stderr, not stdout. + +commit 44e1a88d3527239c405ca268888b3695c902c807 +Author: Matteo Frigo +Date: Sun Sep 1 21:26:38 2002 -0400 + + Removed traverse.c. + traverse.c is no longer need for plan blessing. I figured out + a way to avoid using it in planner-score.c, so the file is + now redundant. + +commit 1c9ef6ccf7c373d274215c83bbede0fea30682c7 +Author: Matteo Frigo +Date: Sun Sep 1 19:51:50 2002 -0400 + + Removed code made obsolete by new MD5 scheme: problem equality + tests, scanners, and associated list of problem kinds. + +commit 726b571dc2949d3369fc09237b41f99ef8ce058b +Author: Matteo Frigo +Date: Sun Sep 1 19:22:54 2002 -0400 + + Started md5 implementation + +commit d89348364f45c8f635356d8ae1047f6cb8508158 +Author: Matteo Frigo +Date: Sat Aug 31 14:00:04 2002 -0400 + + Keep track of hit rate + +commit 971b014a7698a2b54a6dec16b486b7953a1f41e0 +Author: Matteo Frigo +Date: Sat Aug 31 12:44:04 2002 -0400 + + Only dump when verbose > 4 + +commit 018df5704e37547209aeaecadc50811defcf5f2b +Author: Matteo Frigo +Date: Sat Aug 31 09:55:57 2002 -0400 + + Debugging infrastructure + +commit 837cecb7a386caabb14f3b41518083f18b364fc7 +Author: Matteo Frigo +Date: Sat Aug 31 09:21:48 2002 -0400 + + Use debug infrastructure to dump planner. + +commit dfaf407162a50f7a77ef3496dbaf754b27551029 +Author: Matteo Frigo +Date: Fri Aug 30 21:29:10 2002 -0400 + + Do not store plans in planner, plus general planner cleanup. + +commit e74dd299a89b62e7d0e51be3293163325b5044ea +Author: Steven G. Johnson +Date: Fri Aug 30 18:07:52 2002 -0400 + + renamed IN_DHT_R2HC to the more general FORBID_DHT_R2HC + +commit 904ff75e31a716b0c9d97f7e4efd425bd4309c06 +Author: Steven G. Johnson +Date: Fri Aug 30 18:07:21 2002 -0400 + + eliminated unused var + +commit 60f3382238de7ce933a192a923f06657900e4853 +Author: Matteo Frigo +Date: Fri Aug 30 12:09:48 2002 -0400 + + Score planner was not working correctly when using wisdom. Fixed. + +commit 0522d2fcf8b00ec9f1f3cdbd38cfa03d764e1154 +Author: Matteo Frigo +Date: Fri Aug 30 08:20:48 2002 -0400 + + Use hash table in debug malloc + +commit e451f6d74620eefd71304a543d0eb48ab9ea953d +Author: Steven G. Johnson +Date: Fri Aug 30 02:45:15 2002 -0400 + + listed some good stuff + +commit 4d5aeb7a8917367942f1e798bd19d5c3be2feaf1 +Author: Steven G. Johnson +Date: Fri Aug 30 02:17:30 2002 -0400 + + timed planner + +commit 3bb76589f0d1efc68b0a82eeecbdf30748a991fd +Author: Steven G. Johnson +Date: Fri Aug 30 02:07:00 2002 -0400 + + fma? + +commit e231f879031ab34c3a8fa8a8da0fbf642cd88a0b +Author: Steven G. Johnson +Date: Fri Aug 30 02:05:55 2002 -0400 + + update + +commit 1f29de7940d8c29acc6b608deec341cd982cc706 +Author: Steven G. Johnson +Date: Fri Aug 30 01:31:47 2002 -0400 + + rader-dht -> dht-rader + +commit 888439dcea7af2d64300c776238afa7c5c18a372 +Author: Steven G. Johnson +Date: Fri Aug 30 01:21:37 2002 -0400 + + add DHT solver, and break up rader-dht and r2hc-hc2r + +commit df668dba33c6181cb6feb58dba6f649c89d73fe6 +Author: Steven G. Johnson +Date: Thu Aug 29 23:20:35 2002 -0400 + + another option + +commit 213d66b5bcf73e5525c97bb6dc9461808600d483 +Author: Steven G. Johnson +Date: Thu Aug 29 22:55:29 2002 -0400 + + generalized indirect solvers for fftw2-like buffering and more + +commit 795353001d9c3db1d30d5def55b8671cb4eb67b0 +Author: Steven G. Johnson +Date: Thu Aug 29 18:08:16 2002 -0400 + + tensor_max_index and tensor_min_stride are now both unsigned + +commit d59c4e92144b248504c9c01cae0ea5d3f4e0aa60 +Author: Steven G. Johnson +Date: Thu Aug 29 17:58:35 2002 -0400 + + added iabs.c, and tensor_min_stride returns min absolute value + +commit 9247f8665076f514844f3fd4a0478f9988313251 +Author: Steven G. Johnson +Date: Thu Aug 29 17:31:39 2002 -0400 + + bug fix in cldrest hc2c/c2hc copy loops + +commit c8d575230e1d18331b0a1d8fe22d6c8fcfd70ce4 +Author: Matteo Frigo +Date: Thu Aug 29 13:45:08 2002 -0400 + + Added things to do. + +commit c8b62313d7952baa412a1c18427473c010451303 +Author: Steven G. Johnson +Date: Thu Aug 29 13:10:04 2002 -0400 + + added automake prereq + +commit 3a6be2745802ae618bbb0521fe5e54e17e1eecb2 +Author: Matteo Frigo +Date: Thu Aug 29 08:36:36 2002 -0400 + + Use indexed addressing + +commit b27567a442018af7ec7cf782f117bfc9f5476e08 +Author: Matteo Frigo +Date: Thu Aug 29 08:20:55 2002 -0400 + + Ooops + +commit dc19f8daf30d11be571d8856cb10e8d8a9046b6c +Author: Matteo Frigo +Date: Thu Aug 29 07:45:37 2002 -0400 + + Oops + +commit ee4bb3eb29224fe9ef1e5c3c8416256b04a22599 +Author: Steven G. Johnson +Date: Thu Aug 29 02:32:13 2002 -0400 + + updates to win32 threads code (ick) + +commit 6cfa2e60b0f2831342f21a72eb3732bf80366250 +Author: Steven G. Johnson +Date: Thu Aug 29 01:44:33 2002 -0400 + + added threaded version + +commit 8cc323cbe02b7c270bb664e2c8acedce4ddf48b5 +Author: Steven G. Johnson +Date: Wed Aug 28 19:47:21 2002 -0400 + + fix make dist + +commit 43fa7922084aae1bdb1b69aff7109aed56e1f025 +Author: Steven G. Johnson +Date: Wed Aug 28 15:09:03 2002 -0400 + + whoops, bugfix for inverse + +commit b3136883e3f02c5bbb68338e01d134aa2b2a25eb +Author: Matteo Frigo +Date: Wed Aug 28 14:50:34 2002 -0400 + + Use C9x convention for naming (fftwf etc.). Removed installable header + files since they will be part of the API. + +commit ed3b5e17a932fe32d1a9397642c6e043eb3dbc40 +Author: Steven G. Johnson +Date: Tue Aug 27 23:34:00 2002 -0400 + + allow _1 variants to accept rnk 0 (sz 1) problems + +commit 004227a749ea2b1990047e29b15826437335239f +Author: Steven G. Johnson +Date: Tue Aug 27 15:56:09 2002 -0400 + + updated + +commit ca46171fc03dc63c4a93462abded63a039acdd82 +Author: Matteo Frigo +Date: Mon Aug 26 20:14:56 2002 -0400 + + Loop unroll is useless + +commit 6528250479b8700bc9082f776d5f3c340080175a +Author: Matteo Frigo +Date: Mon Aug 26 20:00:41 2002 -0400 + + Use indexed addressing + +commit 8f4d60a4abc3e10d5e4e2739119422babe433a1d +Author: Matteo Frigo +Date: Mon Aug 26 19:46:46 2002 -0400 + + Use indexed addressing in transpose routines. (Seems to be + slightly better on athlon.) + +commit aac3c6a8800ddbc174774e9eeeb32f054c8af6a6 +Author: Steven G. Johnson +Date: Mon Aug 26 12:59:44 2002 -0400 + + added comment about stability + +commit bdaced931410f8e984ac5c3a833e842d6ffa8965 +Author: Matteo Frigo +Date: Mon Aug 26 07:43:53 2002 -0400 + + Approximate opcount + +commit 46c5151b696b0d6f0ff98f952d8a13283d95877b +Author: Matteo Frigo +Date: Mon Aug 26 06:38:49 2002 -0400 + + Finished rdft2 via dft/rdft + +commit c9122c8dbfcac3ae13893442c0ad348e410b646b +Author: Steven G. Johnson +Date: Mon Aug 26 00:15:59 2002 -0400 + + some updates + +commit b049bb9502bd3c00a3a8f1ff3cfd3c5596e9e7c0 +Author: Steven G. Johnson +Date: Mon Aug 26 00:05:53 2002 -0400 + + rdft kind is now per-dimension, added rdft/rank-geq2 + +commit 32db021f7eabd57af68c88e1e6266589a828df35 +Author: Steven G. Johnson +Date: Sun Aug 25 22:45:38 2002 -0400 + + added note + +commit e174f61162d8e897e181f1ae8f01b5c8ba4122d8 +Author: Steven G. Johnson +Date: Sun Aug 25 22:28:12 2002 -0400 + + must zero real sz + +commit 7881bf396852115443bd3ce1dbdce177d8d64b6e +Author: Steven G. Johnson +Date: Sun Aug 25 22:06:52 2002 -0400 + + unified pickdim funcs + +commit 9b588fdbd50ab5d47cb936aae0569b6f9b54fc4c +Author: fftw +Date: Sun Aug 25 14:10:55 2002 -0400 + + silence warnings + +commit f58dff38cc5c75f8c508e971a1ffd286be572f87 +Author: Matteo Frigo +Date: Sun Aug 25 13:16:49 2002 -0400 + + I had to add another planner flag to record whether pointers could + become unaligned because of vrank-geq1 solvers (these solvers only + plan the first element of a vector problem, but the second element + may have a different alignment). This addition is ugly, but I don't + see any way around it. + +commit 3633f42453ac103289d0c471630892680f1b0625 +Author: Matteo Frigo +Date: Sun Aug 25 10:18:25 2002 -0400 + + Added thoughts + +commit fb9c1acef1a3499a8629190b172a1ec0430260b4 +Author: Matteo Frigo +Date: Sun Aug 25 10:08:59 2002 -0400 + + Implemented rdft2 via vector rdft + radix2 step + +commit 8bc1aed075f15afc6de9d82adc44d6ab8b5e50f6 +Author: Matteo Frigo +Date: Sat Aug 24 17:43:54 2002 -0400 + + Stylistic changes + +commit 188add2600049e4313ba1e77c1976b887544ae90 +Author: Matteo Frigo +Date: Sat Aug 24 11:19:30 2002 -0400 + + Simplified mktwiddle interface + +commit 1c91434a8fea606141e28014376c2d2c9937f1b7 +Author: Matteo Frigo +Date: Sat Aug 24 11:05:08 2002 -0400 + + Unification of certain vector computations. rdft2-dft is now a + vector transform. + +commit f9311503a90a428a78350116e1bf47c6ffefddcc +Author: Matteo Frigo +Date: Fri Aug 23 20:21:25 2002 -0400 + + Intel compiler seems to be still buggy + +commit de1bb9192bc2740a6fbe70bbac497a1ac34450f0 +Author: Matteo Frigo +Date: Fri Aug 23 16:07:12 2002 -0400 + + Streamlined twiddle protocol + +commit e2a28ed96b7b40db5f3fe6b72852acf550cdaca4 +Author: Matteo Frigo +Date: Fri Aug 23 13:22:17 2002 -0400 + + Implemented rdft2 via dft (forward only for now) + +commit 17d57ef85db79c55dcd5c77260618e798833e1d0 +Author: Matteo Frigo +Date: Thu Aug 22 11:29:29 2002 -0400 + + More cleanup of verify + +commit 0eb03788a7c1c13953638a19182235738511b77a +Author: Matteo Frigo +Date: Thu Aug 22 11:16:03 2002 -0400 + + Changed error criterion because old one was too strict + +commit e97f092fbcd955e08b36522352e0e9b94cfd473e +Author: Matteo Frigo +Date: Thu Aug 22 11:15:17 2002 -0400 + + Disable shared + +commit f611df2e683eea128367d652cf12e2c4a2b3dfb1 +Author: Matteo Frigo +Date: Thu Aug 22 09:19:12 2002 -0400 + + Added thoughts + +commit 6ad63b2082094c83de1fe5a01400423c249564a1 +Author: Matteo Frigo +Date: Thu Aug 22 09:17:28 2002 -0400 + + Oops + +commit 42381c1bcded2b7d1854300ff5de0addfca36575 +Author: Matteo Frigo +Date: Thu Aug 22 09:11:34 2002 -0400 + + Do not use inline. Minor changes. + +commit b9b2448db23e3d5d0d6d10b4bf3fe1858a847a05 +Author: Steven G. Johnson +Date: Wed Aug 21 16:23:26 2002 -0400 + + more commented flags + +commit 1c316981c3ed81a4550d6ba9bfa733745532bcf2 +Author: Steven G. Johnson +Date: Tue Aug 20 19:44:43 2002 -0400 + + added DCT-IV and DST-IV + +commit c15e995b01901e957e42c369b5341b6dbeaf3ac2 +Author: Matteo Frigo +Date: Tue Aug 20 16:01:36 2002 -0400 + + Slight improvement in twiddle scheme + +commit 8ba1ef4db7a3866fae35bd1825a5a5c35ae5673f +Author: Steven G. Johnson +Date: Tue Aug 20 15:31:54 2002 -0400 + + name fix + +commit 5b56bb057b02f41413a9d5436a3d9d1c50a0e7f5 +Author: Steven G. Johnson +Date: Tue Aug 20 15:16:48 2002 -0400 + + removed extraneous variable + +commit d8b1080be08abcfa55a88f38d7bc677d99a9c2d9 +Author: Matteo Frigo +Date: Tue Aug 20 11:46:29 2002 -0400 + + Oops + +commit b500a0d285f5b95a9b88952b8830aa8423be9332 +Author: Matteo Frigo +Date: Tue Aug 20 08:37:45 2002 -0400 + + Still playing around + +commit 7a44ac35618394bd3715c928e9dc0b3a7a149f0e +Author: Matteo Frigo +Date: Mon Aug 19 19:56:29 2002 -0400 + + Playing around with addition chain + +commit ac8dfff733ce38c8b013523ff4e9fc9888456989 +Author: Steven G. Johnson +Date: Mon Aug 19 19:48:56 2002 -0400 + + comments + +commit 175b3b2cec3441b1a0e34d03343e9f581f0e030e +Author: Steven G. Johnson +Date: Mon Aug 19 19:45:35 2002 -0400 + + comment fixes + +commit 0b6386c1ef38de51383f1306c82e7966b0db0d52 +Author: Steven G. Johnson +Date: Mon Aug 19 19:40:18 2002 -0400 + + added reodft stuff + +commit 8d4aef3c5738367c010a1bfd3004c94f73281950 +Author: Matteo Frigo +Date: Sun Aug 18 19:44:14 2002 -0400 + + Sync with nbenchfft + +commit 6ec9197550f61b20dad2a8e238bd00da3bf2cf23 +Author: Matteo Frigo +Date: Sun Aug 18 16:02:37 2002 -0400 + + Economy of thought + +commit 70610d2a45fcebc6b9c3c61e5dd6caa96d292b4f +Author: Steven G. Johnson +Date: Sat Aug 17 15:52:05 2002 -0400 + + distribute addchain.c + +commit 2fea59351e2abaeec9bb1ea094d06097282bdf7e +Author: Matteo Frigo +Date: Sat Aug 17 14:09:11 2002 -0400 + + Nothing serious + +commit c5ef4a2ddba0963a8c9a388edf050c5ee2fbbb00 +Author: Matteo Frigo +Date: Sat Aug 17 10:47:59 2002 -0400 + + New twiddle policy (disabled for now) + +commit bf62c3f3bb4be6257869db7d46f69b694c7a2688 +Author: Steven G. Johnson +Date: Fri Aug 16 23:44:28 2002 -0400 + + bug fix for hc2r (must use inverse dft) + +commit e7434c44d6c3f77e761da5e7a8e850f48c6fb872 +Author: Matteo Frigo +Date: Fri Aug 16 20:27:10 2002 -0400 + + New log3 twiddle policy + +commit d0f1857c45c12d35cbd9fded016c3b7ceac70aa7 +Author: Matteo Frigo +Date: Fri Aug 16 18:10:33 2002 -0400 + + More verify cleanup + +commit c8f750da8aab093581b6be29ff8d781906ca771b +Author: Matteo Frigo +Date: Fri Aug 16 16:31:19 2002 -0400 + + Oops + +commit eae86b4ff97b783a93ebd6f7b0a6352cea48359c +Author: Matteo Frigo +Date: Fri Aug 16 15:22:36 2002 -0400 + + Economy of thought (and code) + +commit d7bdf2e9b5a011b19bb16a9d12d5d763a3196c2a +Author: Matteo Frigo +Date: Fri Aug 16 14:05:45 2002 -0400 + + Added comment + +commit 4bec01a2c6ea089d18a81b8d7d3ce649cbe80fe8 +Author: Matteo Frigo +Date: Fri Aug 16 12:57:43 2002 -0400 + + Cleaner rounding algorithm + +commit d91cc0e5f23a61e226b2a575c23f35c79ec3ca06 +Author: Matteo Frigo +Date: Fri Aug 16 11:27:43 2002 -0400 + + Can get away with shorter length in bluestein (I think). + +commit 56113aa7d008511b8387a1d1652e03d9fd8844e7 +Author: Matteo Frigo +Date: Fri Aug 16 11:08:09 2002 -0400 + + Portability improvements + +commit b58468b7ecd1e0ff7b9a2b1236d64e357627d8a0 +Author: Matteo Frigo +Date: Fri Aug 16 08:06:31 2002 -0400 + + Optionally average accuracy test over many rounds + +commit 21b850aeaafa046e663e6bc5a42a9538c9571180 +Author: Matteo Frigo +Date: Fri Aug 16 07:50:24 2002 -0400 + + More accurate formula for trig tables + +commit ce0241125c235817e2132e938e8c9dcd3166773f +Author: Matteo Frigo +Date: Fri Aug 16 06:42:02 2002 -0400 + + Implemented accuracy test for all integers + +commit db374e203e4d37c399e6b3d877da8cdf192ec649 +Author: Matteo Frigo +Date: Thu Aug 15 18:54:44 2002 -0400 + + inv, neg: make static + +commit 79f1c53641c0cec5612621c1f72726a81d56144e +Author: Matteo Frigo +Date: Thu Aug 15 17:25:37 2002 -0400 + + Verify was not complete for real transforms + +commit c60e8fcdedd600b93f30f098ca49f794375e8377 +Author: Matteo Frigo +Date: Thu Aug 15 16:30:03 2002 -0400 + + Oops + +commit 688a0ef88f8ef6a8d060ad2b04ce51b4d94870b7 +Author: Matteo Frigo +Date: Thu Aug 15 16:29:16 2002 -0400 + + Fixed hb codelets + +commit 8a4d71183c0b5cd62b6f9f53f41cfd68a8b602fc +Author: Matteo Frigo +Date: Thu Aug 15 14:10:45 2002 -0400 + + Changed twiddle policy + +commit 9905db7579db957d5ebc9f472847910d24b65e10 +Author: Steven G. Johnson +Date: Thu Aug 15 13:32:24 2002 -0400 + + whoops + +commit 59c9d170edb4001d3f37b64cfb2d8d48e9cb9b7d +Author: Matteo Frigo +Date: Thu Aug 15 11:01:04 2002 -0400 + + No point in libbench being a shared library + +commit b75824c63085764eb1fbf97b83961eb0411bd969 +Author: Matteo Frigo +Date: Thu Aug 15 09:48:37 2002 -0400 + + Moved accuracy test to libbench + +commit ebac0dde6d77f268c45cfc7ba17230c547e60800 +Author: Matteo Frigo +Date: Wed Aug 14 19:48:23 2002 -0400 + + Modified accuracy test + +commit d5e2c4a63b8f9b195e7812f817cefc61617accf9 +Author: Matteo Frigo +Date: Wed Aug 14 08:34:26 2002 -0400 + + Fixes for long double + +commit 41c23eb9e18add9786e959871bcba7d1ffc44bb6 +Author: Matteo Frigo +Date: Wed Aug 14 08:17:57 2002 -0400 + + Normalize input + +commit d83e36740eaf0cd2d8ffecb25d38ffdcd6412bcb +Author: Matteo Frigo +Date: Wed Aug 14 07:26:41 2002 -0400 + + Oops + +commit 0d312034a4b8a8ece11903c0b81aa4ce57151783 +Author: Matteo Frigo +Date: Wed Aug 14 07:25:34 2002 -0400 + + Also compute relative error + +commit 10c281df8a8195c0eb497cd3b73955807c64f06e +Author: Matteo Frigo +Date: Wed Aug 14 07:08:20 2002 -0400 + + Loop over N + +commit 588a70753f53ef9fe7801fd3c0cd1b1f2c5da7fc +Author: Matteo Frigo +Date: Wed Aug 14 06:54:50 2002 -0400 + + simple-minded accuracy test + +commit b25380fae97bb3af2b38f592f5393b10be1ff430 +Author: Steven G. Johnson +Date: Wed Aug 14 03:26:06 2002 -0400 + + whoops + +commit d32e62c62857ed17fdf4a9fa7ebb12007c8e32bc +Author: Matteo Frigo +Date: Tue Aug 13 11:42:41 2002 -0400 + + fma() stuff is too nonportable, removed + +commit 583c58e086a592a198619d6c36fcb6137b4ea068 +Author: Steven G. Johnson +Date: Mon Aug 12 14:07:44 2002 -0400 + + slight fix + +commit 2be67d85e7e8c8b4db5644bdeca6cfa1a0211959 +Author: Steven G. Johnson +Date: Mon Aug 12 14:07:18 2002 -0400 + + use table for rdft_kind_str + +commit 331ca343e551313e04bc1c88ae8c8cd3e1dfb4fd +Author: Steven G. Johnson +Date: Mon Aug 12 13:43:08 2002 -0400 + + slight fixes + +commit 8bf7bf1145ef67937cf020d64f0e9913aef84d58 +Author: Steven G. Johnson +Date: Mon Aug 12 13:31:37 2002 -0400 + + multidimensional rdft2 + +commit 4457a7cf6bf60cff0e842bfd127e22e7b3de55e5 +Author: Steven G. Johnson +Date: Sat Aug 10 19:33:23 2002 -0400 + + use tensor_copy_inplace + +commit 5e370a1a072a67b940639f311e296a97150acf1c +Author: Steven G. Johnson +Date: Sat Aug 10 19:32:03 2002 -0400 + + bugfix, use tensor_copy_inplace + +commit 92f280c99e002d9ee78e42967ee81bb4fcf84d2b +Author: Steven G. Johnson +Date: Sat Aug 10 19:30:39 2002 -0400 + + use tensor_copy_inplace + +commit 55ee1b50c140e81f41abc05975f01393c8bd4cbd +Author: Steven G. Johnson +Date: Sat Aug 10 19:28:07 2002 -0400 + + added tensor_copy_inplace + +commit ce8083b65d5ae7952d40c253896ae0e6759e73e8 +Author: Steven G. Johnson +Date: Sat Aug 10 19:25:50 2002 -0400 + + fixed trig-function table type + +commit 9b354635204711389328f487a058a54604d58e0a +Author: Matteo Frigo +Date: Sat Aug 10 14:41:04 2002 -0400 + + Improved trig scheme + +commit 466d2a03411d082ab673c73582a08842f12f6846 +Author: Matteo Frigo +Date: Fri Aug 9 21:05:01 2002 -0400 + + Allow for testing using long double instead of pari + +commit 14b243d1d509236a5b19e8783570989cdfda6333 +Author: Matteo Frigo +Date: Fri Aug 9 20:49:32 2002 -0400 + + Yet another trig scheme. + +commit 361e112752a93e14cab74d86d92fccb88686fed1 +Author: Matteo Frigo +Date: Fri Aug 9 20:38:07 2002 -0400 + + Yet another scheme + +commit b3ca7c941515736b0ebd97c7d1195cd736d2b8d8 +Author: Matteo Frigo +Date: Fri Aug 9 20:31:16 2002 -0400 + + Careful with overflow + +commit c1af0a91c6bbcd3482427d1be4a812a0c061d879 +Author: Matteo Frigo +Date: Fri Aug 9 20:16:23 2002 -0400 + + Avoid overflow + +commit f06cb59c469661f10f65f220b91d79e8d98097f7 +Author: Matteo Frigo +Date: Fri Aug 9 19:26:57 2002 -0400 + + New(er) trig routines + +commit ba6e2f6487663745c402856288f95441c6191fe8 +Author: Matteo Frigo +Date: Fri Aug 9 19:25:44 2002 -0400 + + Oops + +commit 267f53395f5e34f83a0664c9405e4d7b17583695 +Author: Matteo Frigo +Date: Fri Aug 9 18:49:04 2002 -0400 + + New file + +commit cc25b36b4369f7fd773b614e416185078bc3e20c +Author: Matteo Frigo +Date: Fri Aug 9 13:04:00 2002 -0400 + + Commented about likely gcc bug + +commit 745572695256ffc140f9b3bd828b561f56bea1a5 +Author: Matteo Frigo +Date: Fri Aug 9 13:01:49 2002 -0400 + + Improved accuracy of twiddle factors + +commit b90ec91c045668caabc583c27da9400331fc34cc +Author: Matteo Frigo +Date: Thu Aug 8 06:36:23 2002 -0400 + + Wrong comment + +commit 01653dbd957c931c5e562c6cdf727c26a4570680 +Author: Matteo Frigo +Date: Wed Aug 7 17:14:09 2002 -0400 + + Experimental 3dnow port using gcc, to compare it with Stefan's stuff. + +commit 9716316af3a8a84ac9888e8b184fad1f8b34279d +Author: Matteo Frigo +Date: Wed Aug 7 12:58:10 2002 -0400 + + End of AREF experiment + +commit 03365b937b905ad6dd6dad3ec0044f010f2cec51 +Author: Matteo Frigo +Date: Wed Aug 7 07:47:19 2002 -0400 + + Oops + +commit 00d1519ee07579c41da9738b4bd0d9e130c252df +Author: Matteo Frigo +Date: Wed Aug 7 07:46:38 2002 -0400 + + Pathetic attempt to reduce size of configure script + +commit 882c809b6257b73377a20a807a20a61f5cc5a655 +Author: Matteo Frigo +Date: Tue Aug 6 20:38:11 2002 -0400 + + Changed array syntax for experiments. + +commit 06bf9f0b7d08eb0a66a07b4b517fede0514a4a2c +Author: Matteo Frigo +Date: Tue Aug 6 19:58:20 2002 -0400 + + Fix warning + +commit dd2b973d27111516233a46e5d44734f2d1cea503 +Author: Matteo Frigo +Date: Tue Aug 6 13:35:28 2002 -0400 + + Move nonportable stuff in one place. + +commit 3a3a36d48074544b746b464bd194f93a371615b9 +Author: Matteo Frigo +Date: Tue Aug 6 10:32:53 2002 -0400 + + Economy of thought: I didn't like having two algorithms for removing + solutions, both correct. At least now we have the same algorithm + copied twice. + +commit e0cf8fd96853061b2160a99ed871b621a69bacbe +Author: Matteo Frigo +Date: Tue Aug 6 09:12:21 2002 -0400 + + Added things to do + +commit f96ded332986cff7099c0dd6bf2cff07d3e59217 +Author: Steven G. Johnson +Date: Mon Aug 5 19:54:31 2002 -0400 + + improved interaction of planner with patience flags + +commit f37ad7a0a0a7009a6c29c02ff53b06440f12e846 +Author: Steven G. Johnson +Date: Mon Aug 5 14:17:58 2002 -0400 + + set up for real-even/odd DFTs, where n is not the size of the data + +commit 1a2ea854fa6156b907c817752dc47a1c07ef5c2e +Author: Steven G. Johnson +Date: Sun Aug 4 23:57:51 2002 -0400 + + DESTROY_INPUT flag + +commit 18483232ce3afae0412e565222de6c48891700d7 +Author: Steven G. Johnson +Date: Sun Aug 4 22:50:19 2002 -0400 + + CLASSIC -> IMPATIENT + +commit 0fee1c8d39ed87aaab3387028cc3ff4422261a41 +Author: Matteo Frigo +Date: Sun Aug 4 19:05:43 2002 -0400 + + Require make maintainer-clean to remove the generator, as opposed + to make clean. In this way we can type make clean without regenerating + all codelets. + +commit b633708685610bf42bb69bbe71f31f0fd849aff5 +Author: Steven G. Johnson +Date: Sun Aug 4 17:34:04 2002 -0400 + + ESTIMATE plans are not blessed + +commit 17f106f814fd30121f7fcc2de65cc78f77a6448d +Author: Steven G. Johnson +Date: Sun Aug 4 17:24:37 2002 -0400 + + use flags in wisdom + +commit 342928973eaf98429367ce537b088761c391505c +Author: Steven G. Johnson +Date: Sun Aug 4 17:03:45 2002 -0400 + + score now takes plnr, not flags, as arg + +commit 5ef96008dcfb0e7428716122ea8ea56d0637898a +Author: Steven G. Johnson +Date: Sun Aug 4 16:37:46 2002 -0400 + + align initial stack in alignment check, which should now pass for gcc 3.1.1 + +commit ce14480bda337274a988627272fbe696bcaf5589 +Author: Matteo Frigo +Date: Sat Aug 3 20:04:57 2002 -0400 + + Detect ultrasparc (sort of) + +commit 946e964b908a9fcd9b98345a5f525049b8143cce +Author: Steven G. Johnson +Date: Sat Aug 3 19:38:17 2002 -0400 + + added solvtab_rdft_r2r placeholder + +commit db8c63ea924d244e0c207d514dd425bfab39f2b6 +Author: Matteo Frigo +Date: Sat Aug 3 19:34:49 2002 -0400 + + Damn solaris + +commit 6f4f2a31d28db1040f796b703d9b6c9fd7b4052d +Author: Steven G. Johnson +Date: Sat Aug 3 17:55:44 2002 -0400 + + use E extended precision in solvers + +commit eb1a98695f9827716943ddc0ca00475c2d61d9c2 +Author: Steven G. Johnson +Date: Sat Aug 3 17:53:29 2002 -0400 + + an alternative notation for D{C,S}T: DXTio, where i/o are {0,1} + according to whether the input/output are shifted, respectively. + Alternatively, io is the binary representation of the usual + DXT-{I,II,III,IV} nomenclature, minus 1. + +commit 24b13985e810f08cbef3c5dac739433c5ac0161a +Author: Steven G. Johnson +Date: Sat Aug 3 17:49:11 2002 -0400 + + use E extended precision in solvers + +commit 46b2fc024b187b4356bf6a7977d508a4c4ba22c1 +Author: Matteo Frigo +Date: Sat Aug 3 15:39:49 2002 -0400 + + More portability fixes, compiler bugs workarounds, etc. + +commit ca88f96aed7b0399f4d2199342c5287639e51d3b +Author: Matteo Frigo +Date: Sat Aug 3 15:09:56 2002 -0400 + + More portability work + +commit 3cfd742c2225f91d295d75af9e6ddc46cd4c39f4 +Author: Matteo Frigo +Date: Sat Aug 3 14:33:40 2002 -0400 + + Improved portability, removed gnu make dependencies + +commit ac8aa3edbc9864af3b3e3e8d753cc2388b80732c +Author: Matteo Frigo +Date: Sat Aug 3 13:48:53 2002 -0400 + + Remember to thank XXX + +commit 807dc0e147fedfa044a4ae2a03dbff426e155136 +Author: Matteo Frigo +Date: Fri Aug 2 17:38:18 2002 -0400 + + Multiplication on altivec requires FMA with -0.0 to be IEEE754 compliant. + +commit dfa0ebdb72edd084c82b682b62fffdbd8f9a7611 +Author: Matteo Frigo +Date: Fri Aug 2 15:26:37 2002 -0400 + + Allow for extended precision in codelets + +commit 2eee7899ea3308e919dbeafffeee423dd0c810b5 +Author: Matteo Frigo +Date: Fri Aug 2 08:52:04 2002 -0400 + + Shortened names + +commit 239f0f6f2197b4761abad5f8ac2f1da6736a5ccd +Author: Steven G. Johnson +Date: Fri Aug 2 03:49:09 2002 -0400 + + added infrastructure for future r2r transforms + +commit 4f64527883bd151d5f597abec9870dc9e6d0c8b7 +Author: Matteo Frigo +Date: Thu Aug 1 21:29:14 2002 -0400 + + Version info + +commit 1f6a7039b9fe3a439d6aa9fa83d179fb864ab920 +Author: Matteo Frigo +Date: Thu Aug 1 21:06:22 2002 -0400 + + Listened to one customer and added radix-12. Added radix-15 for + consistency (whatever that is) + +commit ece6187a35d44322c45b0fc946187615d8d3bebd +Author: Steven G. Johnson +Date: Thu Aug 1 19:50:53 2002 -0400 + + whoops again, fixed the wrong line + +commit 53c48f4c8eb4f39a1bcea9b47a2cf78c669e2dd2 +Author: Steven G. Johnson +Date: Thu Aug 1 19:50:16 2002 -0400 + + whoops + +commit afb281f39223c26fe968873928fd8ca0c69c1fe7 +Author: Steven G. Johnson +Date: Thu Aug 1 16:01:15 2002 -0400 + + use new AC_INIT and add VERSION to wisdom + +commit 1d4b7a029734d0948b44713fb94429ffd4ce40d4 +Author: Steven G. Johnson +Date: Thu Aug 1 14:56:45 2002 -0400 + + mygetR -> getR + +commit 010ffe455949d901be083a52aeb485e933d4c252 +Author: Steven G. Johnson +Date: Thu Aug 1 14:56:02 2002 -0400 + + scanner cleanups: just return 0/1, simplify integer reads + +commit 052184d84276b884548c95a76e89d5f2ccd124d2 +Author: Matteo Frigo +Date: Thu Aug 1 08:04:01 2002 -0400 + + Reverted back to casting pointer to ulong + +commit c61b1e4aa77a06a1565d2f816bc2b6a22c82f6d8 +Author: Matteo Frigo +Date: Thu Aug 1 08:03:46 2002 -0400 + + Cast to unsigned long, not long + +commit bc2a8794eec9dbdd2eaa2d10070974ab1cdcc3bf +Author: Steven G. Johnson +Date: Thu Aug 1 03:14:50 2002 -0400 + + additional comment + +commit 72bc55e7f202b4d772bc8a50263870f1434becb0 +Author: Steven G. Johnson +Date: Thu Aug 1 03:12:37 2002 -0400 + + added comment + +commit 980a9e749d1361de03ea2256209ee0216942a6aa +Author: Steven G. Johnson +Date: Thu Aug 1 03:03:18 2002 -0400 + + added wisdom import + +commit b9bcf9486c742271f7c9fa64f41791666cf16cb6 +Author: Steven G. Johnson +Date: Wed Jul 31 23:12:05 2002 -0400 + + whoops + +commit 183a8a7311c571981db4ef087608b599de96b062 +Author: Steven G. Johnson +Date: Wed Jul 31 22:06:46 2002 -0400 + + use %u for alignment_of + +commit f9cc3f2e326569214e7ac246b5dacabe10f9f4aa +Author: Steven G. Johnson +Date: Wed Jul 31 21:47:15 2002 -0400 + + ptrdiff_t form + +commit 26346129bd45ff91529e18e5770220025ae5cc8c +Author: Matteo Frigo +Date: Wed Jul 31 21:33:35 2002 -0400 + + Cast to avoid warning from C++ compiler + +commit dc8c0c64365fd7f14a579a730f50107f4c01839e +Author: Matteo Frigo +Date: Wed Jul 31 18:57:04 2002 -0400 + + Make problem equality depend on alignments. + +commit 185babf3691983eb1fc109f4d2864ea80070319f +Author: Matteo Frigo +Date: Wed Jul 31 15:45:31 2002 -0400 + + Shorter names + +commit d0a23f2a7ca0ef90c893e1bc9fe38562bf4b97c4 +Author: Matteo Frigo +Date: Wed Jul 31 14:38:00 2002 -0400 + + Oops + +commit db553c5b6c9be77013e5e6862aecb074abd05daf +Author: Matteo Frigo +Date: Wed Jul 31 14:37:19 2002 -0400 + + Fix warning + +commit 20ce4a31106f745c8765cafa87b94df7b152ba01 +Author: Matteo Frigo +Date: Wed Jul 31 07:52:53 2002 -0400 + + Removed silly abstraction barrier. Also, cons() terminology was + no longer appropriate. + +commit 6e519e71ee2bff45a45acc9860e6688b5a2ac0ca +Author: Steven G. Johnson +Date: Tue Jul 30 22:35:24 2002 -0400 + + removed register_registrar and solvtab_exec_reverse hacks + +commit 3bb2201fd6c0b2a0e2e6e1cb07849fc640c23fe4 +Author: Steven G. Johnson +Date: Tue Jul 30 19:54:41 2002 -0400 + + register_registrar doesn't search whole solver list (maybe we should change register_solver instead) + +commit acf987d04a520c14c0d452f2036338e4d89e91a0 +Author: Steven G. Johnson +Date: Tue Jul 30 19:36:37 2002 -0400 + + credit + +commit 1ae9a399e262ce07b3733a11fcb23ea08541bd45 +Author: Steven G. Johnson +Date: Tue Jul 30 19:34:16 2002 -0400 + + added HP/UX ia64 support, courtesy of Teresa L. Johnson + +commit 76ce2ea38a0a18376e316ee3348e8ffd069aebe1 +Author: Matteo Frigo +Date: Tue Jul 30 13:28:33 2002 -0400 + + Fixed alignment checks + +commit 7356d1bc11f552e41d0de8df8fc9e0ef4f83b1a0 +Author: Steven G. Johnson +Date: Tue Jul 30 01:20:11 2002 -0400 + + ugh, wisdom id fixes in exprt_conf + +commit 110cfd3d5abb89da042f3953d99179c04fcb6839 +Author: Steven G. Johnson +Date: Tue Jul 30 00:41:15 2002 -0400 + + exprt_registrars -> exprt_conf, added missing SOLVTAB_END + +commit 331b32dd8322273182a47c852416afaac4f6007b +Author: Steven G. Johnson +Date: Tue Jul 30 00:36:26 2002 -0400 + + exprt_registrars should output self-contained configuration + +commit ddd63d9b49d333a58f352f4f561a6ff1fbe17a5a +Author: Steven G. Johnson +Date: Mon Jul 29 23:52:07 2002 -0400 + + added exprt_registrars + +commit 691ba278639460f94cfd6ff45e14e10007d4f62c +Author: Steven G. Johnson +Date: Mon Jul 29 23:42:27 2002 -0400 + + whoops + +commit ebcd431d564b1f5f86f3bb274ed123971d449415 +Author: Matteo Frigo +Date: Mon Jul 29 21:24:51 2002 -0400 + + More stringent requirements on strides for SIMD codelets + +commit 4fa11627e55b15059ce9b91dce1383c29040f2bb +Author: Steven G. Johnson +Date: Mon Jul 29 21:05:49 2002 -0400 + + remove warning + +commit 30f4b2f2ca2fd97ae591c98d812ec38546a1cd8b +Author: Steven G. Johnson +Date: Mon Jul 29 20:51:19 2002 -0400 + + use %td for ptrdiff_t and %T for tensors + +commit 33c7a10abb7b7b1e3250654481f536b6e33de824 +Author: Matteo Frigo +Date: Mon Jul 29 16:17:11 2002 -0400 + + Fix for SIMD + +commit 1688dda0ec01678ac3d2e16af154c4898a56b568 +Author: Matteo Frigo +Date: Mon Jul 29 15:40:53 2002 -0400 + + Missing lfftw_mkstride and lfftw_stride_destroy + +commit 2e84b7c68c4270593cc2a1c152520b6f55e3c0c9 +Author: Matteo Frigo +Date: Mon Jul 29 14:34:46 2002 -0400 + + Implement LDA/STA + +commit 385b21d8dc7b1c465acbb83b5414caefa80960d2 +Author: Matteo Frigo +Date: Mon Jul 29 14:19:21 2002 -0400 + + More SIMD work + +commit 00e43e5facae3c33e901ca12dd57cf5905c8508d +Author: Matteo Frigo +Date: Mon Jul 29 13:16:12 2002 -0400 + + Cleanup + +commit 6fb8177180cf59f95bc37163f4e8d4c68b1657e8 +Author: Steven G. Johnson +Date: Mon Jul 29 13:02:38 2002 -0400 + + update + +commit 8354486a52f87afe52440aa3316acec7c768ac75 +Author: Matteo Frigo +Date: Mon Jul 29 12:45:33 2002 -0400 + + Also check strides in SIMD codelets + +commit 7b48f56b4e18bd9799c46214829e7b15531e5244 +Author: Matteo Frigo +Date: Mon Jul 29 11:26:08 2002 -0400 + + Minor changes, mostly for consistency with the big-endian processor + +commit ec8f6e4c58d50603587e0bba533ec2086e6174b8 +Author: Steven G. Johnson +Date: Mon Jul 29 00:50:06 2002 -0400 + + added comment + +commit a7cc792884a9acb1d81a346cdab1d9b07e9b2bdf +Author: Steven G. Johnson +Date: Sun Jul 28 21:19:35 2002 -0400 + + added code for icc's _mm_malloc (memalign replacement) + +commit d1398d4a205bae587e99b40049dd6a301c1f58f9 +Author: Steven G. Johnson +Date: Sun Jul 28 17:33:07 2002 -0400 + + slight fixes + +commit 5f21f0a04a242174ff85c63925c88e15e6ff101e +Author: Steven G. Johnson +Date: Sun Jul 28 16:28:43 2002 -0400 + + whoops + +commit d5256b19914cddf9b241ebce04f10042f4837e9b +Author: Matteo Frigo +Date: Sun Jul 28 16:13:19 2002 -0400 + + Use vec_xor to change sign + +commit ec0a29c8d03cbed27c09a96fcb3f022bfc9f647f +Author: Steven G. Johnson +Date: Sun Jul 28 16:10:59 2002 -0400 + + added rdft2 + +commit 516c9c1117a0811dba416bfa1ba20a5c93e91532 +Author: Matteo Frigo +Date: Sun Jul 28 15:45:54 2002 -0400 + + Optimized + +commit 8619a2039d6723004a1fef760203e5d6f33f9469 +Author: Matteo Frigo +Date: Sun Jul 28 15:11:14 2002 -0400 + + Changed ALIGNMENT + +commit 37c7c1fd79835b212e94e565fb3abe0352243919 +Author: Matteo Frigo +Date: Sun Jul 28 15:09:40 2002 -0400 + + alignment := 8 + +commit 27b891f615494d0f1996ed1acf0665eb386704e6 +Author: Matteo Frigo +Date: Sun Jul 28 14:57:22 2002 -0400 + + Avoid warning + +commit fd53f4d5bdfc8c8daf0126fab34270b09cf49aa2 +Author: Matteo Frigo +Date: Sun Jul 28 14:53:03 2002 -0400 + + Oops + +commit 8b749b4406276bb4b4d6e3b4c78486d0fea38fff +Author: Matteo Frigo +Date: Sun Jul 28 14:50:09 2002 -0400 + + New altivec experiment + +commit 87bd001083f039c6728a3a19d03b7e14eac11666 +Author: Matteo Frigo +Date: Sun Jul 28 13:48:20 2002 -0400 + + Nothing + +commit 3a5876fd4582a075560988801d7c958b0ca75a74 +Author: Matteo Frigo +Date: Sun Jul 28 13:47:50 2002 -0400 + + Oops + +commit 551ad6c0e199fcd5fce5defd470ce7d975dcacb4 +Author: Matteo Frigo +Date: Sun Jul 28 13:44:28 2002 -0400 + + Nothing + +commit a13f42aa3c37a3065a08a59220529d5292683ac9 +Author: Matteo Frigo +Date: Sun Jul 28 10:38:10 2002 -0400 + + Constants are now in separate file. + +commit 94226e68396c790ce6bfbbf8db0c299fed32e2f9 +Author: Matteo Frigo +Date: Sun Jul 28 07:58:37 2002 -0400 + + More precise comment + +commit 4009a4d5579eb5520346c956632ef0c2df5273d2 +Author: Matteo Frigo +Date: Sun Jul 28 07:56:40 2002 -0400 + + gcc-3.1 bug workaround + +commit 092830f99bf3fd15390980b4e441d4c7d1a9826c +Author: Steven G. Johnson +Date: Sun Jul 28 01:39:54 2002 -0400 + + slight optimization, and exported zerotens functions + +commit e3797dbb5984f5f1272b452c7005c775badb6fb2 +Author: Steven G. Johnson +Date: Sun Jul 28 00:54:59 2002 -0400 + + should be a plan_dft, not a plan_rdft + +commit ab69981af2f5c80981e7f1432560cbdaae08770c +Author: Matteo Frigo +Date: Sat Jul 27 21:36:46 2002 -0400 + + Optimizations. Make it work with vanilla non-Apple gcc. + +commit 9a7ad02a4bfebfa91a4afe01756023a3a74f5d8b +Author: Steven G. Johnson +Date: Sat Jul 27 19:20:09 2002 -0400 + + whoops + +commit 4aac8a4d98395b964b16b1251d8d52410fc232f8 +Author: Steven G. Johnson +Date: Sat Jul 27 18:54:01 2002 -0400 + + added hc2r (dif) + +commit abe907208a2a3e7ff558b3f12bb0b254768d670a +Author: Steven G. Johnson +Date: Sat Jul 27 18:31:43 2002 -0400 + + add hc2r (dif) case + +commit b933474c3373bdca65dd9cce3b16272c2b197ee8 +Author: Matteo Frigo +Date: Sat Jul 27 15:09:40 2002 -0400 + + Altivec port + +commit 0884acf4e8fc2cd9ec4144877e5a0879bbf779e6 +Author: Matteo Frigo +Date: Sat Jul 27 15:06:21 2002 -0400 + + Fixed signed/unsigned bug. + +commit 11508c3160c5d3a404a58eb143139d9088a213e5 +Author: Matteo Frigo +Date: Thu Jul 25 20:11:26 2002 -0400 + + Make rank0 unapplicable to in-place problems. + +commit 81a49b1e405be525a9ee5476ddfa16e8c70ef702 +Author: Steven G. Johnson +Date: Thu Jul 25 17:10:52 2002 -0400 + + only works for r odd + +commit 2b54747fb0e87bbd03b3c7b04ed1cb752a470796 +Author: Matteo Frigo +Date: Thu Jul 25 15:30:06 2002 -0400 + + Reinserted much better timing-avoidance heuristic + +commit 171716115f0f318397186964ecc341ac9268fd84 +Author: Matteo Frigo +Date: Thu Jul 25 15:21:13 2002 -0400 + + Score is now a property of the plan, not of the solver. + Revised representation of closures. + +commit 67c69e319a7ca8ac6c81a45a1d0f6dde9efc2e12 +Author: Matteo Frigo +Date: Thu Jul 25 06:36:51 2002 -0400 + + Cosmetic changes. Added hc2r_128.c + +commit 0a22b8dd9629f62d1a682af581c17d6dc71e244a +Author: Steven G. Johnson +Date: Thu Jul 25 01:37:53 2002 -0400 + + added hc2r + +commit 22bad3aea85c62120134db4652c6ac990c8607e2 +Author: Steven G. Johnson +Date: Thu Jul 25 00:51:45 2002 -0400 + + added hc2hc-difbuf + +commit aac8e9d03008ccbe1c244717e404e283c03eabe1 +Author: Steven G. Johnson +Date: Thu Jul 25 00:25:06 2002 -0400 + + added rdft-dif + +commit 39d632acade375e06e60dc11cd0b693ed29bbf07 +Author: Steven G. Johnson +Date: Thu Jul 25 00:22:36 2002 -0400 + + whoops, hc2r must be conjugated to have right sign + +commit ebc9e7b4083f1d545cc47032a7bffbcc5d5a26ce +Author: Steven G. Johnson +Date: Wed Jul 24 23:27:45 2002 -0400 + + slight change + +commit 6c5a0b11d3a86a418e02108a90472ff19d97bae0 +Author: Steven G. Johnson +Date: Wed Jul 24 23:24:24 2002 -0400 + + whoops + +commit 28adebe469b82ee53e436f33389b459d8707a603 +Author: Steven G. Johnson +Date: Wed Jul 24 22:46:39 2002 -0400 + + support hc2r codelets + +commit af7b3ec85871349e26698fb5edf95c6a1e96bbbf +Author: Steven G. Johnson +Date: Wed Jul 24 22:01:53 2002 -0400 + + use vector plan for r/i instead of two separate plans + +commit b31e3e7d86ef1ab3aa58145768cc801979ba5cd6 +Author: Steven G. Johnson +Date: Wed Jul 24 20:36:34 2002 -0400 + + hack to allow rader/generic to work in-place for small prime sizes, instead of always using buffered + +commit cddf15b3b7c1d3baec98982550f18344c3361216 +Author: Steven G. Johnson +Date: Wed Jul 24 18:04:41 2002 -0400 + + added rdft-generic + +commit 76637f738e056d7e4fcba907ffd4ab52db457fed +Author: Steven G. Johnson +Date: Wed Jul 24 17:27:34 2002 -0400 + + fixed add count + +commit 7c1f6a8f3b35a5034daacc521a10c06424144047 +Author: Steven G. Johnson +Date: Wed Jul 24 14:52:26 2002 -0400 + + again + +commit ab910c9e4a7fc66e0a19e1b9557669e896ac465b +Author: Steven G. Johnson +Date: Wed Jul 24 14:51:58 2002 -0400 + + slight fix + +commit 2169c91de93a2c096765218e2b25e32e6f2d47f0 +Author: Steven G. Johnson +Date: Wed Jul 24 14:51:07 2002 -0400 + + fixed comment + +commit b6ed79694396f04555b0009027b94355c81a4019 +Author: Steven G. Johnson +Date: Wed Jul 24 14:41:24 2002 -0400 + + whoops + +commit 10fabba80f177e1ee4bfca04ac09836c798998ef +Author: Steven G. Johnson +Date: Wed Jul 24 14:38:15 2002 -0400 + + added rader-hc2hc + +commit 3015fea221f119cf88e68c12087c0ca8fbb508a9 +Author: Steven G. Johnson +Date: Wed Jul 24 00:07:59 2002 -0400 + + whoops, initialize W + +commit d48486c4715a0db6bb2653a34d868f5f52732f66 +Author: Steven G. Johnson +Date: Tue Jul 23 23:03:09 2002 -0400 + + strides should not be unsigned + +commit 7d6e7cacd21c97ef1622d681de2543e71ac2171d +Author: Steven G. Johnson +Date: Tue Jul 23 23:02:08 2002 -0400 + + more stride sign fixes + +commit b967fadc107addb8cec4effc1f0e7ae7d6ce1f86 +Author: Steven G. Johnson +Date: Tue Jul 23 23:01:04 2002 -0400 + + strides should not be unsigned! + +commit 0ad85517c669d39fcf0ac6f77e73ed8c2fa80e89 +Author: Steven G. Johnson +Date: Tue Jul 23 14:55:25 2002 -0400 + + added comment + +commit 5d278e1ac3640bc39cd6b7e19aaa5563cd319de4 +Author: Steven G. Johnson +Date: Tue Jul 23 14:52:04 2002 -0400 + + another fix to op count + +commit 9260aed8161a66eb5de14e68c932d11bc113cd56 +Author: Steven G. Johnson +Date: Tue Jul 23 14:51:01 2002 -0400 + + whoops + +commit 3f42b7510d2c0f2b1e7bc34342041f8123667897 +Author: Steven G. Johnson +Date: Tue Jul 23 14:49:43 2002 -0400 + + slight fix to op counts + +commit 1288dec288612070c531c98067255cf3de3d90b1 +Author: Steven G. Johnson +Date: Tue Jul 23 14:09:19 2002 -0400 + + added dft-r2hc + +commit ad4bf834d8b55b38d2766779e5d00c4f61e30dbe +Author: Steven G. Johnson +Date: Tue Jul 23 02:50:12 2002 -0400 + + better comment and var. name + +commit f1ab8ef1b9cf77432f6bb627a5c3ec2f586ebcd9 +Author: Steven G. Johnson +Date: Tue Jul 23 02:39:11 2002 -0400 + + fixed tests for hc2r, and added r2hc-hc2r + +commit d3b91945fd199f6bb99711479972b7074c00b352 +Author: Steven G. Johnson +Date: Tue Jul 23 00:45:23 2002 -0400 + + added rader-dht + +commit 57036068d38970156c0bcf5d4edd72cdb20a09fd +Author: Matteo Frigo +Date: Mon Jul 22 21:05:12 2002 -0400 + + Added r2hc_128, what the hell. + +commit d82c1c99be202e2cc55851a4bd406b4682cb0b4a +Author: Matteo Frigo +Date: Mon Jul 22 20:48:59 2002 -0400 + + Added codelets that compute twiddle factors + +commit f98ad798168562c0da5714110eb0c37972178728 +Author: Steven G. Johnson +Date: Mon Jul 22 19:57:16 2002 -0400 + + added rdft-buffered + +commit 50b0158abe60a9e62698baf54e31623bf29a34f9 +Author: Steven G. Johnson +Date: Mon Jul 22 19:43:39 2002 -0400 + + added hc2hc-ditbuf + +commit 4b7abfd7514cb4d98a0c87746c25fcafe6d263b3 +Author: Steven G. Johnson +Date: Mon Jul 22 14:29:04 2002 -0400 + + use STACK_MALLOC (alloca), since generic radix is always small + +commit d083d389c40a363c4b90a6ca2efd202c52b81713 +Author: Steven G. Johnson +Date: Mon Jul 22 14:22:43 2002 -0400 + + small cleanup + +commit 851d792b2de11df3620f32093e02632f78aeef6e +Author: Matteo Frigo +Date: Mon Jul 22 07:42:13 2002 -0400 + + What the hell was I thinking? + +commit 7237f72026e6aad4325427a52b0fb683ec4b2e0d +Author: Matteo Frigo +Date: Mon Jul 22 07:37:12 2002 -0400 + + Reduced code size by using table instead of switch statement. + +commit f253821d2c79215c87e18cf134e218e02d0235ed +Author: Matteo Frigo +Date: Mon Jul 22 07:27:06 2002 -0400 + + Changed hash function to avoid collisions with DFT. + +commit 602ef947b9122139e2b55fca3e007ca6bcda4bbf +Author: Steven G. Johnson +Date: Mon Jul 22 01:37:06 2002 -0400 + + added missing file, whoops + +commit 6b3144d456eb3c0caee53880e7fe60ddbd2c48d5 +Author: Steven G. Johnson +Date: Mon Jul 22 01:24:17 2002 -0400 + + whoops, generate enough twiddles for odd m + +commit 4738a6cbbc5206c3fdc7b0bf7cdc481609439497 +Author: Steven G. Johnson +Date: Mon Jul 22 01:10:21 2002 -0400 + + don't try to verify R2HCII or HC2RIII plans + +commit ec9e9517ca4ac29008a9b1b8f79f4543ef4ae90a +Author: Steven G. Johnson +Date: Mon Jul 22 01:05:00 2002 -0400 + + recursive case now works, I think + +commit 7ebf4c56ae4cc7861840cb8ee5d8a482c5e3f64a +Author: Steven G. Johnson +Date: Mon Jul 22 01:04:40 2002 -0400 + + add extra impulse test for debugging + +commit 7dacfd5778747c8ae3b803ddf37d7921eeab713f +Author: Steven G. Johnson +Date: Mon Jul 22 01:02:38 2002 -0400 + + whoops, multiply ios offset by stride (and rename to ioffset) + +commit ca3c5bf3c6de8946f1caf40e779487110e5b59ce +Author: Steven G. Johnson +Date: Mon Jul 22 00:22:02 2002 -0400 + + whoops + +commit e40381e0407f8570c076968fb7c7138ffebe9ae2 +Author: Steven G. Johnson +Date: Sun Jul 21 23:58:14 2002 -0400 + + whoops + +commit 030d0f7f52cbc000070d885b815768bfadb86649 +Author: Steven G. Johnson +Date: Sun Jul 21 23:43:03 2002 -0400 + + added hc2hc-dit + +commit c1c28b632b9cc24c542610dbdb3bf424eb740810 +Author: Steven G. Johnson +Date: Sun Jul 21 23:15:12 2002 -0400 + + twiddles can be shared with smaller m's + +commit cbb0b11b1a8aa023f1d81dba688278012451de8e +Author: Steven G. Johnson +Date: Sun Jul 21 22:34:28 2002 -0400 + + preparing for recursive rdft... + +commit 8f48e0e3caf86690c7328cd128cc981364c9026f +Author: Steven G. Johnson +Date: Sun Jul 21 19:31:22 2002 -0400 + + slight fix, to match libbench/verify.c + +commit d9aec187c49dbc272df30d040d4acfc160220b07 +Author: Steven G. Johnson +Date: Sun Jul 21 18:43:12 2002 -0400 + + r2hcII has imag parts offset by n-1, not n. We can also allocate fewer strides. + +commit 00e3acce93c910450482c37155200244adfc51b4 +Author: Steven G. Johnson +Date: Sun Jul 21 18:27:09 2002 -0400 + + delete unused var + +commit 469254570eda6c6851c8c76ac2ce631c7e160d40 +Author: Steven G. Johnson +Date: Sun Jul 21 02:06:53 2002 -0400 + + added some rdft solvers + +commit c267ad079a4ef7cb7a9fdbe4556c89121137be02 +Author: Steven G. Johnson +Date: Sun Jul 21 01:52:54 2002 -0400 + + pass identifier in FFTW() through another macro so that the mangled name + can itself be a preprocessor symbol + +commit cf660c4cf10b80d7ec37cd99825c9663738d77e7 +Author: Steven G. Johnson +Date: Sun Jul 21 01:05:21 2002 -0400 + + fix in comment + +commit 14081a9d216ccc757b9ce46631d956f5135628ea +Author: Steven G. Johnson +Date: Sun Jul 21 00:47:03 2002 -0400 + + bench tests rdft plans + +commit 61ed41f792df937cc80b9fa0c643871ab7449968 +Author: Steven G. Johnson +Date: Sun Jul 21 00:22:14 2002 -0400 + + make rdft.h and dft.h compatible + +commit d314a5c84e70803b32075884ee96c0099c695d9a +Author: Steven G. Johnson +Date: Sun Jul 21 00:12:19 2002 -0400 + + first-draft rdft verify + +commit 01403979be858145b4f1f61f03c9f1f98c59587d +Author: Steven G. Johnson +Date: Sat Jul 20 22:09:15 2002 -0400 + + got rid of annoying warnings + +commit 710e4e4687092d0d823f7fe442c0bc981d99a598 +Author: Steven G. Johnson +Date: Sat Jul 20 22:07:37 2002 -0400 + + added stub codelet registration for linking purposes + +commit 9b9775415f67f53910d95e1ac963f1bed389ff9b +Author: Steven G. Johnson +Date: Sat Jul 20 21:46:03 2002 -0400 + + basic rdft stuff + +commit 9c7a553bedb1f7f2fce816ae284d4867ffc0924d +Author: Steven G. Johnson +Date: Sat Jul 20 21:06:50 2002 -0400 + + rdft codelets now compile + +commit fb7686cdfd1674f03c35ed523fcc2d11db157ecb +Author: Matteo Frigo +Date: Sat Jul 20 18:40:31 2002 -0400 + + Oops, was generating rdfts instead of hdfts + +commit f82dcb63a673b994a4677ed9f8d065766c79c31c +Author: Matteo Frigo +Date: Sat Jul 20 18:25:47 2002 -0400 + + Added hc2r codelets + +commit d8127083d80d0f0b9de30e6e3c9ae1b90f92a90d +Author: Matteo Frigo +Date: Sat Jul 20 17:54:39 2002 -0400 + + return W in hc2hc codelets + +commit 354e28470103a92db21d621263a687a6bf437595 +Author: Matteo Frigo +Date: Sat Jul 20 17:51:06 2002 -0400 + + Some work on rdft codelets + +commit 8a7b5a3242b8bd823c8d70e1b04e9492d6d65d43 +Author: Matteo Frigo +Date: Tue Jul 16 13:55:50 2002 -0400 + + fix const + +commit 6a3576889b8683e9ee15d2f95fb76f6fef645667 +Author: Matteo Frigo +Date: Tue Jul 16 07:00:10 2002 -0400 + + Separate CFLAGS in codelets. Fix const in certain places. + +commit 7870f6dff402e655def77265bc4ac0225608f677 +Author: Steven G. Johnson +Date: Mon Jul 15 21:10:42 2002 -0400 + + note buffering problem + +commit 0bd6af885007a6f0561577c521d4999c903f27df +Author: Matteo Frigo +Date: Mon Jul 15 20:27:51 2002 -0400 + + Removed unpredictable branch from inner loop + +commit 8a40f059239add905fa4c0abd6c20a40644559fa +Author: Steven G. Johnson +Date: Mon Jul 15 19:35:04 2002 -0400 + + update + +commit 45bb25aa64ce46c8821c9717770a28a5ab60e492 +Author: Steven G. Johnson +Date: Mon Jul 15 19:31:39 2002 -0400 + + optimization + +commit 526958106e6a43bfc1d4a7cab335fc3df41a7d9f +Author: Steven G. Johnson +Date: Mon Jul 15 19:28:30 2002 -0400 + + added generic dit + +commit aebc10cb69074f33b3370de5aff7bc20b684800b +Author: Steven G. Johnson +Date: Mon Jul 15 17:03:53 2002 -0400 + + whoops, mksolver should be static + +commit e2b6303fa6575e6796c2834f222b77d221e1a77e +Author: Matteo Frigo +Date: Mon Jul 15 16:46:36 2002 -0400 + + First implementation of gen_hc2hc, probably still buggy. + +commit 0105f03531806f86cc1c0e89c18b91947b15cb10 +Author: Steven G. Johnson +Date: Mon Jul 15 16:40:23 2002 -0400 + + don't count loading of twiddle factors in ops.other, since it isn't + counted for the codelets + +commit 47f3220441f5da7ee844e0abd36f41f32b4bc17e +Author: Steven G. Johnson +Date: Mon Jul 15 15:13:19 2002 -0400 + + plan_destroy puts plan to sleep before deallocating it, to eliminate duplicate free calls in solvers + +commit 90347b282680ec2b611ededef7ab7272beb2857a +Author: Steven G. Johnson +Date: Mon Jul 15 15:07:41 2002 -0400 + + fftw2-like vector recursion flag + +commit df45d5d1588019d57e80aee326c92e5ffb49715f +Author: Matteo Frigo +Date: Sun Jul 14 21:01:44 2002 -0400 + + More jokes + +commit 5efd22c7d5499d7bad84216e526ec11551fb81f0 +Author: Matteo Frigo +Date: Sun Jul 14 20:36:01 2002 -0400 + + Bless plan for testing purposes + +commit dd45761d063a5473473f44d5800a55b35794c8a6 +Author: Matteo Frigo +Date: Sun Jul 14 20:35:49 2002 -0400 + + Canonical linked-list deletion (hope it is right) + +commit 04cbcbfe2eb171da6ee678d000f1cf7aa2435f5d +Author: Steven G. Johnson +Date: Sun Jul 14 18:26:19 2002 -0400 + + use estimating planner for cld_omega + +commit c2e125a60dc8101c25c1f08debd9a4b1661b1658 +Author: Steven G. Johnson +Date: Sun Jul 14 18:10:56 2002 -0400 + + better internal naming + +commit fac5147b9b14fe2997cde8bbd5a39c956f577eaf +Author: Steven G. Johnson +Date: Sun Jul 14 18:10:01 2002 -0400 + + printing should really be fixed now, grrr + +commit 8dbd07648153ea12bd52c12aad39b58adc479140 +Author: Steven G. Johnson +Date: Sun Jul 14 17:57:12 2002 -0400 + + print all distinct child plans + +commit af0c968546d0c39197e3c7925e21bf1897f1b5ab +Author: Steven G. Johnson +Date: Sun Jul 14 17:49:21 2002 -0400 + + whoops + +commit af601a5405861e68cedd4314f70b677b6c36e640 +Author: Steven G. Johnson +Date: Sun Jul 14 17:45:54 2002 -0400 + + whoops, destroy should delete twiddle/omega from list + +commit a20712e3a4b5d2364f092fd222b540cbc8c2df44 +Author: Steven G. Johnson +Date: Sun Jul 14 17:33:02 2002 -0400 + + whoops + +commit a43e6c2aeb20b20987891fa7461cc6a2898d1785 +Author: Steven G. Johnson +Date: Sun Jul 14 17:12:14 2002 -0400 + + added plan_bless and FORGET_ACCURSED + +commit 8da186b0e85df747bbd0a91db772c869e9b35e3c +Author: Steven G. Johnson +Date: Sun Jul 14 16:15:43 2002 -0400 + + further cleanup + +commit 255479f4ad3175722fe32fd4a2b7cefa858b3b35 +Author: Steven G. Johnson +Date: Sun Jul 14 16:14:15 2002 -0400 + + slight cleanup + +commit d5346f1dfc7154d9a4fbade8fba1dcce90c7bec5 +Author: Steven G. Johnson +Date: Sun Jul 14 16:09:17 2002 -0400 + + added traverse_plan via print (ugh) + +commit 1edcc5b2fb3cf8741aec7b32042453803a1eb145 +Author: Steven G. Johnson +Date: Sun Jul 14 15:08:29 2002 -0400 + + added TW_FULL, and additional n parameter for twiddles + +commit c300c4c9e119ee5e657fe52fa48ce8251321f8a2 +Author: Steven G. Johnson +Date: Sun Jul 14 15:03:51 2002 -0400 + + whoops + +commit 8eb08032b56dac1d0b4200c2a1e17e6a33674395 +Author: Steven G. Johnson +Date: Sun Jul 14 13:49:20 2002 -0400 + + save flags before invoking solver mkplan + +commit 68d1b66d54458eb685bee1a95bd4433421a68f58 +Author: Matteo Frigo +Date: Sun Jul 14 09:28:37 2002 -0400 + + [empty commit message] + +commit 8f335f455b54a35089073c690ecd93c7380c1b95 +Author: Steven G. Johnson +Date: Sat Jul 13 22:17:29 2002 -0400 + + added support for UNICOS _rtc() real-time-clock intrinsic function + +commit e0550777d2519623392bd1678c39e7491fd3d38c +Author: Steven G. Johnson +Date: Sat Jul 13 22:06:35 2002 -0400 + + fixed typo: HAVE_TIME_H should include time.h, not sys/time.h + +commit fcff09d063384ac24b87c16cfed1c246de45623f +Author: Steven G. Johnson +Date: Sat Jul 13 21:46:02 2002 -0400 + + support AIX read_real_time timer + +commit ca89737634be3d5de4851c1f3fbc19d900cf22b0 +Author: Steven G. Johnson +Date: Sat Jul 13 17:02:51 2002 -0400 + + use && instead of the (sigh) unportable -a + +commit 769cf9267df8b75c3e2849a171e995136bacd4af +Author: Steven G. Johnson +Date: Sat Jul 13 16:38:18 2002 -0400 + + use AC_HELP_STRING + +commit 6600ee1ae97f1919117e4c3877092249443c545b +Author: Steven G. Johnson +Date: Sat Jul 13 16:05:43 2002 -0400 + + support long-double precision + +commit d7aff35e1553f8735b56597fd524c5b52d8e475f +Author: Steven G. Johnson +Date: Sat Jul 13 15:48:10 2002 -0400 + + whoops whoops + +commit 9a20964a145ceef9018cf8bf0977be7ba63ecb6e +Author: Steven G. Johnson +Date: Sat Jul 13 15:47:39 2002 -0400 + + whoops + +commit d040c7ef353abc5accf76a9953a26feb2d11fc0c +Author: Steven G. Johnson +Date: Sat Jul 13 14:13:42 2002 -0400 + + buffered solver strides have been fixed + +commit 6bcbee663a0b8b8b23b70a180e1ca12ee1141724 +Author: Steven G. Johnson +Date: Sat Jul 13 13:48:13 2002 -0400 + + convention + +commit 4d3d49e4b447b49a45b803fea4ff4d23a31288a0 +Author: Steven G. Johnson +Date: Sat Jul 13 12:50:06 2002 -0400 + + share twiddle arrays in Rader + +commit 91dbf0b319de38c0b67df70aa4c39ccac0b523da +Author: Steven G. Johnson +Date: Sat Jul 13 12:48:10 2002 -0400 + + call done() after verify + +commit b5b07111cda5f2b5b1130829d05b698575f4a5f8 +Author: Steven G. Johnson +Date: Fri Jul 12 15:42:04 2002 -0400 + + output planner time with -v + +commit b71bd73584d1e960018fbda1b8f078fa4e2ea542 +Author: Steven G. Johnson +Date: Fri Jul 12 15:40:14 2002 -0400 + + support double outputs + +commit e808db8fbfe2b7d4afbabe558d5a757379c49dd8 +Author: Steven G. Johnson +Date: Fri Jul 12 15:09:19 2002 -0400 + + removed extraneous parens + +commit b1ca74610947a0007932fb0eb65c794868f15977 +Author: Steven G. Johnson +Date: Fri Jul 12 15:08:13 2002 -0400 + + increase maxbufsz to 64k; makes a big difference for large 2d transforms + +commit 92dfa732c944f37774e1b4b9b889ba64a7621ccb +Author: Matteo Frigo +Date: Fri Jul 12 05:59:26 2002 -0400 + + Fix + +commit fdae83d7830d6df98ac417066e0c5ea8bc254d35 +Author: Steven G. Johnson +Date: Fri Jul 12 01:22:38 2002 -0400 + + fix comment + +commit 8b316634377ad2f829c26d6d107005638c6ab8ba +Author: Steven G. Johnson +Date: Fri Jul 12 00:59:29 2002 -0400 + + fix in comment + +commit efb8ce2f3a2e518f02245f8eb12425a30bb420c0 +Author: Steven G. Johnson +Date: Fri Jul 12 00:13:13 2002 -0400 + + updated + +commit 21a94bd1783b4cde2728d54932cdf1ecf2485a21 +Author: Steven G. Johnson +Date: Thu Jul 11 23:39:27 2002 -0400 + + buffered malloc's buffers + +commit 2cec064ce9f3fd0ccd891651557a5739409c19c3 +Author: Steven G. Johnson +Date: Thu Jul 11 23:30:26 2002 -0400 + + share more code between apply and apply_dit in Rader + +commit afd5fe37e6c3060145530115b6c2f2d676ddfe37 +Author: Matteo Frigo +Date: Mon Jul 8 12:30:34 2002 -0400 + + Polished + +commit 71ae7be079984537f7770d1b70280b77ad23c722 +Author: Matteo Frigo +Date: Mon Jul 8 09:47:11 2002 -0400 + + [empty commit message] + +commit a5760afe5aed6838383937fad0a3243528ce15fc +Author: Matteo Frigo +Date: Mon Jul 8 09:42:08 2002 -0400 + + SIMD/FMA stuff + +commit ec76a60088a86df970b3cbf4005506ade4570040 +Author: Matteo Frigo +Date: Mon Jul 8 07:43:51 2002 -0400 + + Avoid code duplication + +commit ffce0587abc26960f1bffb08b99f61280176d25b +Author: Matteo Frigo +Date: Sun Jul 7 20:56:15 2002 -0400 + + Fixes for FMA+SIMD + +commit cd1278e203d5014ee55026d00eef0c5cd87091a7 +Author: Matteo Frigo +Date: Sun Jul 7 20:32:01 2002 -0400 + + Major changes in SIMD fftw + +commit 47b31e4f895a8385d29297182fd4ab3cbe756486 +Author: Matteo Frigo +Date: Fri Jul 5 17:32:09 2002 -0400 + + Use unpck instructions instead of shuffles + +commit 8390c4b680fa05c264d6308d70aeb8b69e97b44a +Author: Matteo Frigo +Date: Fri Jul 5 15:49:14 2002 -0400 + + Minor tweaks + +commit 9939d14df8ec43f0f3724eccce6907f723ae7bcd +Author: Matteo Frigo +Date: Fri Jul 5 15:02:54 2002 -0400 + + Use score planner + +commit db780c34509c8cc70385f63815249dbb982371ab +Author: Matteo Frigo +Date: Fri Jul 5 14:49:59 2002 -0400 + + Added verifier + +commit a4c35fbcefcca25a0e31431dcdabb0d44a2bfb98 +Author: Matteo Frigo +Date: Wed Jul 3 20:32:28 2002 -0400 + + More simd codelets + +commit 0b41b3e8c38d89cca050b1b0df6110056a55463e +Author: Matteo Frigo +Date: Tue Jul 2 16:18:09 2002 -0400 + + Oops + +commit 4aa14927597947c2f2c0c38064e92ce29850f3eb +Author: Matteo Frigo +Date: Tue Jul 2 16:13:24 2002 -0400 + + Fixed classic mode + +commit b32c4fa8b6fddb6a4af23a7d2794adb53733fc2d +Author: Matteo Frigo +Date: Tue Jul 2 15:38:36 2002 -0400 + + Use LDK for constants so that we can play games. + +commit 38505faa2d20e4d958d80dce05620dbf20420822 +Author: Matteo Frigo +Date: Tue Jul 2 13:15:58 2002 -0400 + + Improved support for fixed strides + +commit 2c99260bbd5e86361b09120817f07543384fc5e0 +Author: Matteo Frigo +Date: Tue Jul 2 10:30:58 2002 -0400 + + Changed accounting of flops + +commit ae3999cb3d0ec0d5140c9dead499de0cf4318e5e +Author: Matteo Frigo +Date: Tue Jul 2 08:51:38 2002 -0400 + + Wrong code in non-fma mode + +commit 55015bd78bfbcbffb833554b7df558efd1a826cc +Author: Matteo Frigo +Date: Mon Jul 1 23:17:06 2002 -0400 + + sse2 stuff + +commit 021b59968903662e9727f7833c19c613f1b192b7 +Author: Matteo Frigo +Date: Mon Jul 1 14:05:56 2002 -0400 + + Identify CPUs for special codelets + +commit f304f0151ac1ad333b9450a6d78c8cd8f8724d1a +Author: Matteo Frigo +Date: Mon Jul 1 09:26:42 2002 -0400 + + Change split problem syntax + +commit 48a37449fcbd51779bb3dde3f3b8c2d02bbc323d +Author: Matteo Frigo +Date: Mon Jul 1 09:11:39 2002 -0400 + + Removed -fma flag + +commit 38d63d20ab1bd900f5f89914ca7b7f90191d866f +Author: Matteo Frigo +Date: Sun Jun 30 20:08:26 2002 -0400 + + Work around gcc bug + +commit 6b96cea114710b35caa1d65a669f92a46e20f27f +Author: Matteo Frigo +Date: Sun Jun 30 18:34:06 2002 -0400 + + New simd stuff + +commit 5dd26fcef247d6776f4b5b587b15a1b317a97431 +Author: Matteo Frigo +Date: Sun Jun 30 17:00:09 2002 -0400 + + Added altivec support + +commit a81146d09b6762b1c82b9f998720454245ee5e25 +Author: Matteo Frigo +Date: Sun Jun 30 14:47:47 2002 -0400 + + Forgot file + +commit 734f270fddd3a03066eb4323706090f99c82bf9c +Author: Matteo Frigo +Date: Sun Jun 30 14:37:55 2002 -0400 + + Progress towards simd implementation + +commit 05dc59aa43296d7fb6b79edf5decf65e9a100401 +Author: Matteo Frigo +Date: Tue Jun 25 20:23:29 2002 -0400 + + Add 128- codelet + +commit a94cde7e798f7da510f20b25d1a4bd4aea4dc58b +Author: Matteo Frigo +Date: Sat Jun 22 20:47:28 2002 -0400 + + More simd changes. Ensure proper stack alignment in k7 codelets. + +commit c4ef1c53884a0a7fee4587ef0b1f4317ae83a644 +Author: Matteo Frigo +Date: Sat Jun 22 13:01:33 2002 -0400 + + Fixed prototypes + +commit 5383095f6dd63b1db544695c4b0f7f244344d698 +Author: Matteo Frigo +Date: Sat Jun 22 12:53:26 2002 -0400 + + Sparc cycle counter requires v9 + +commit a25e9ee31d663307683038fbf703f0ed60a502e3 +Author: Matteo Frigo +Date: Sat Jun 22 11:45:48 2002 -0400 + + Minor fixes + +commit 01922e916a7428cc0f7f188518720710b101e9e6 +Author: Matteo Frigo +Date: Sat Jun 22 11:11:46 2002 -0400 + + Fixed ev67 detection + +commit ff1e337f46f9f1bbdcc32756bcdaa0e86566df2e +Author: Matteo Frigo +Date: Sat Jun 22 10:19:11 2002 -0400 + + Print flops + +commit 3f2d94c9ccabcf93d7f8b1230c5b2f97ac6cc4d2 +Author: Matteo Frigo +Date: Sat Jun 22 09:36:47 2002 -0400 + + Nothing really + +commit 8843a01025a26b7bb5a3f26b94c46243332cca25 +Author: Matteo Frigo +Date: Fri Jun 21 22:19:20 2002 -0400 + + More simd work + +commit 3a71fc73cd6c17ba8df8d7aad29fa1bf5ad71a96 +Author: Matteo Frigo +Date: Thu Jun 20 21:22:41 2002 -0400 + + More simd work + +commit fcbb846544687bd8c14e9d004746230e8b6a49e2 +Author: Matteo Frigo +Date: Thu Jun 20 18:51:33 2002 -0400 + + More simd work + +commit 4e25f887266e572b5418dcd0bad8db69265ba3b3 +Author: Matteo Frigo +Date: Thu Jun 20 15:04:37 2002 -0400 + + Moving towards incorporation of simd stuff + +commit 8b98bf67f5e3c976f17988acc8c2e063d3848408 +Author: Matteo Frigo +Date: Wed Jun 19 18:47:55 2002 -0400 + + Reorganized k7 stuff into own directory + +commit 30f0669ed255025d8e4bad6adb9737022a7a6b34 +Author: Matteo Frigo +Date: Wed Jun 19 13:21:13 2002 -0400 + + Minor experimental stuff + +commit 51b0055df9ca6f4c9ea05ccbeb4714bd61d8469b +Author: Matteo Frigo +Date: Wed Jun 19 11:20:29 2002 -0400 + + Cosmetic changes + +commit 3309bd7a80d6dfb0da60d6c2a185d5213505b036 +Author: fftw +Date: Wed Jun 19 01:43:31 2002 -0400 + + allocate buffers on the fly + +commit d290c98ff9fdac1646b56bf9fd80913ecf4b42ed +Author: Matteo Frigo +Date: Tue Jun 18 17:48:41 2002 -0400 + + Added ct-ditbuf-k7.c . Major changes required in generator. + +commit c672bc817602bb03a8e6d7b637e78e84dc2f1f1d +Author: Matteo Frigo +Date: Tue Jun 18 11:55:57 2002 -0400 + + Nothing, really + +commit 327d908d5d396a22fa85216b24203c6b709f9379 +Author: Matteo Frigo +Date: Tue Jun 18 11:19:59 2002 -0400 + + !SINGLE ==> !K7_MODE (for some reason the contrapositive sounds wrong) + +commit fc34a6a92882caf5e8346225e9c25a2a1b6fcb2c +Author: Matteo Frigo +Date: Tue Jun 18 11:07:13 2002 -0400 + + Buffer is now symmetric wrt forward/backward transform + +commit 2dfa3580ad3c4d0960a3b18aba5464c6d9cc91c1 +Author: Matteo Frigo +Date: Tue Jun 18 10:33:58 2002 -0400 + + Fixed applicable() in indirect.c + +commit 40e9e2373f160b3760c87aa707e20aa91a30479d +Author: Matteo Frigo +Date: Tue Jun 18 08:41:18 2002 -0400 + + Fixed attempt to free() uninitialized pointer. + +commit 854771dbd1a262127ab6ef87b31e6ec3645dbce4 +Author: Matteo Frigo +Date: Tue Jun 18 08:13:55 2002 -0400 + + Added reference counts for awake() + +commit b65907ea5ba6b84347976ae59688acbc4a982b82 +Author: Steven G. Johnson +Date: Mon Jun 17 20:49:05 2002 -0400 + + updated comment + +commit 11cbdda3f3c4e688e59eb28d43946c6053ce461e +Author: Steven G. Johnson +Date: Mon Jun 17 20:46:45 2002 -0400 + + slight update + +commit df79d1312e84ddc47b65056c2b59fb6eec20915b +Author: fftw +Date: Mon Jun 17 02:30:16 2002 -0400 + + moved prime-number stuff into primes.c, so it can be shared with generic codelet and with rfftw rader + +commit 92c3a4be474dca7d3e4f2076f2d5c61e040e6739 +Author: fftw +Date: Mon Jun 17 02:01:58 2002 -0400 + + added comment + +commit b580b3303f83589a5b87ad88f104ed41b8c641a3 +Author: fftw +Date: Mon Jun 17 01:39:55 2002 -0400 + + added rader-dit + +commit 51f015c4a6df06fa475e6e291d7e0f8a0293a891 +Author: fftw +Date: Sun Jun 16 23:50:16 2002 -0400 + + added initial Rader (no DIT yet) + +commit d45d1bbd591b1c30885baa7b1025ae016b23e937 +Author: fftw +Date: Sun Jun 16 22:29:51 2002 -0400 + + don't warn about long long + +commit 16ad72af138d08605df2fadf239e142ace2680eb +Author: Matteo Frigo +Date: Sun Jun 16 21:30:42 2002 -0400 + + Added k7 DIF codelets + +commit 3728b053dde52469a7deea4654ca0352c40bd6d4 +Author: Matteo Frigo +Date: Sun Jun 16 19:13:31 2002 -0400 + + Added stuff to do + +commit 6eadf663f6d05339378e742de11484c6d46283a5 +Author: Matteo Frigo +Date: Sun Jun 16 19:05:58 2002 -0400 + + Handle dual case R = I + 1 + +commit f6e99e6f7959f1e91fb66ff344ce372c75567e9b +Author: Matteo Frigo +Date: Sun Jun 16 18:54:31 2002 -0400 + + Removed useless flag + +commit d38b5396624973e2ddc9531587b799eaa13f9daf +Author: Matteo Frigo +Date: Sun Jun 16 18:30:32 2002 -0400 + + Removed useless file + +commit 376194067d9decb0e20df12443a0ac64a16f67a2 +Author: Matteo Frigo +Date: Sun Jun 16 18:30:18 2002 -0400 + + More k7 work. Switched to runtime CLASSIC mode. + +commit 331b9479423ed2ad02e75cb8a759241178460ede +Author: Steven G. Johnson +Date: Sun Jun 16 17:15:18 2002 -0400 + + spelling + +commit c278f9c639c8c850773474634acb51104857ad21 +Author: Matteo Frigo +Date: Sun Jun 16 15:51:44 2002 -0400 + + Do not compile if not K7_MODE + +commit 375f66850303af4e6eb9c7263fe5c5c769876065 +Author: Matteo Frigo +Date: Sun Jun 16 15:35:02 2002 -0400 + + Do not require K7 definitions to compile + +commit 684b95447b420d52337cd499589d31dce430ca4a +Author: Matteo Frigo +Date: Sun Jun 16 08:05:17 2002 -0400 + + More k7 stuff + +commit 535c1c74ca2099099e3edbab3aa7acafa02ea7d6 +Author: Matteo Frigo +Date: Sat Jun 15 18:30:43 2002 -0400 + + Try to be compatible with automake-1.6 + +commit ba06164744e743ea9ea8dabb9359dd0e3b830c9c +Author: Matteo Frigo +Date: Sat Jun 15 18:23:40 2002 -0400 + + More merging of Stefan's generator with main genfft branch + +commit fbe6e3f25188363b31caadf2a598be16eeb2a6a7 +Author: Matteo Frigo +Date: Sat Jun 15 13:51:39 2002 -0400 + + Slowly merging genfft-k7 with main genfft branch + +commit 8a567ee1d079e0cb9ba06e66a3f06d9be0eb34b0 +Author: Matteo Frigo +Date: Fri Jun 14 21:33:02 2002 -0400 + + Fixed, really + +commit 6bd3b52c770b109a025d9982098066f91a84c937 +Author: Matteo Frigo +Date: Fri Jun 14 21:27:12 2002 -0400 + + Oops... + +commit 5b6a71f941de2e28005b7821317ec7032c0b9743 +Author: Matteo Frigo +Date: Fri Jun 14 21:25:34 2002 -0400 + + Work properly when $(ALL_CODELETS) = "" + +commit 07399bfca3c51c6e59dc5f7f9a0f1e7600ab2f41 +Author: Matteo Frigo +Date: Fri Jun 14 21:11:16 2002 -0400 + + Fixed k7 build machinery + +commit 015e0a9b55cfef97ad18e06af166a22d02240d09 +Author: Matteo Frigo +Date: Fri Jun 14 17:42:35 2002 -0400 + + More work on k7 stuff + +commit cf8b11788ed23e9e651cbadf1950302c67102f62 +Author: Matteo Frigo +Date: Fri Jun 14 15:54:29 2002 -0400 + + More work on k7 stuff + +commit 8bd8bb064c77d442eb9da44432a3030b2b48f88a +Author: Matteo Frigo +Date: Fri Jun 14 14:18:15 2002 -0400 + + Changed my mind again + +commit 1cfe47c1940dab749e1c63c15bfde4d0eed29495 +Author: Matteo Frigo +Date: Fri Jun 14 11:53:09 2002 -0400 + + Removed some useless stuff. + +commit 315edea8537b5df64d2eb456cd20f12e16c50544 +Author: Matteo Frigo +Date: Fri Jun 14 11:01:39 2002 -0400 + + Hmm... + +commit fb33fef8ea963d61445cfdef5dcf576cbd616cd8 +Author: Matteo Frigo +Date: Fri Jun 14 10:28:12 2002 -0400 + + More work in preparation for k7 stuff + +commit 1efd1ce4b0d507eab8ff1b618a75bb66303b690d +Author: Matteo Frigo +Date: Fri Jun 14 07:25:28 2002 -0400 + + Still preparing to include k7 stuff + +commit 4c4195fba4ee1d73c35a4d8695a714d788a542cb +Author: Matteo Frigo +Date: Fri Jun 14 07:06:02 2002 -0400 + + Create .depend + +commit 4a55307470a6737b48d2cfb10be690ce60b7ac25 +Author: Matteo Frigo +Date: Fri Jun 14 06:56:15 2002 -0400 + + Imported Stefan's K7 generator + +commit 61a7a73d101594961d9b63fb34fb2340635aaf1b +Author: Matteo Frigo +Date: Thu Jun 13 15:30:41 2002 -0400 + + Generator for real->halfcomplex and halfcomplex->real codelets + +commit d43342dc8c0aa4ac1802eff495ca96ac37c9fb22 +Author: Matteo Frigo +Date: Thu Jun 13 11:54:02 2002 -0400 + + Improved hash functions, printers + +commit b26a2a40553deea06a47abfd3ba1f45d54b28cc2 +Author: Matteo Frigo +Date: Thu Jun 13 11:17:31 2002 -0400 + + Only regenerate codlist.c in maintainer mode + +commit 39f18e53eaf87dc26e7001bccb2839fca11d1bf8 +Author: Matteo Frigo +Date: Thu Jun 13 11:04:24 2002 -0400 + + Planner can export solution list + +commit 94b38d1890179198beac49ead7263d4c0a345a59 +Author: Matteo Frigo +Date: Thu Jun 13 08:59:53 2002 -0400 + + Fixed for intel compiler + +commit bd4fbd5827358275240d991af98b0c477a4158cf +Author: Matteo Frigo +Date: Thu Jun 13 08:48:51 2002 -0400 + + Revised strategy for constants in codelets + +commit 9d1d76e5a32774ac2c7d9c43d2594032aeb20933 +Author: Matteo Frigo +Date: Thu Jun 13 06:21:31 2002 -0400 + + Enable score planner in classic mode, naive planner in pro mode. + +commit 81ae7fad037e7325c65da97a3c842c220ea68a2d +Author: Matteo Frigo +Date: Wed Jun 12 19:18:18 2002 -0400 + + Report classic/pro + +commit 2c6576feda81b17c61be5678e97ca1a4db5f7935 +Author: Matteo Frigo +Date: Wed Jun 12 19:07:48 2002 -0400 + + Fixed behavior of buffered solver for large buffers. + +commit e241b59af22b29dd33ada31e9dcfc93eadfc594f +Author: Matteo Frigo +Date: Wed Jun 12 18:57:19 2002 -0400 + + Make assumption COST(vector) = length * COST(scalar) in classic mode. + +commit 2ccbe15f93c5f1bd3bdf6997f28ef1f10a2a5c76 +Author: Matteo Frigo +Date: Wed Jun 12 18:19:48 2002 -0400 + + Revised planner implementation in preparation for wisdom. + +commit 40ff868c177cd7afc80a4b35f2771aadd59ec6a4 +Author: Matteo Frigo +Date: Wed Jun 12 08:27:36 2002 -0400 + + Manually hoist loop invariants. + +commit fca6f800f5e3a40bf20f80e4a2b3da5fe64da13e +Author: Matteo Frigo +Date: Wed Jun 12 07:47:41 2002 -0400 + + Revised loop to compile better with gcc -O + +commit c3e9fb16552f161f337915be9bba97d50aeca6a6 +Author: Matteo Frigo +Date: Tue Jun 11 17:24:09 2002 -0400 + + Changed tensor syntax + +commit c2fb4345e13f698ea829e790e9e50bf5f218d740 +Author: Matteo Frigo +Date: Tue Jun 11 16:39:45 2002 -0400 + + Added stuff to do. + +commit 79b41ae4b2cf1c9d44e386a0fad68531b6fc78a7 +Author: Matteo Frigo +Date: Tue Jun 11 16:28:14 2002 -0400 + + Report classic/pro in version number + +commit e80c221c61c5f10652272a7b86dc61d461ace6d1 +Author: Matteo Frigo +Date: Tue Jun 11 14:22:49 2002 -0400 + + Renamed versions into classic/pro + +commit 49f5d6fa06030e9ee51346622a68b20e37eff60b +Author: Matteo Frigo +Date: Tue Jun 11 14:06:06 2002 -0400 + + Revised planners, estimator + +commit cd4556586e22a54132fe9b13920474a2b404fe21 +Author: Matteo Frigo +Date: Tue Jun 11 11:45:41 2002 -0400 + + I don't know what I am doing. + +commit 2feca6ebca91d4c762240f32f2381be534adb289 +Author: Matteo Frigo +Date: Tue Jun 11 10:35:52 2002 -0400 + + Massive revision of estimator + +commit 9147712cee87c8b5aff5dc3deebcadf1c159ea90 +Author: Matteo Frigo +Date: Tue Jun 11 07:32:20 2002 -0400 + + Many changes + +commit a68d4a6962649cd7996d2320934764d7490bf685 +Author: Matteo Frigo +Date: Mon Jun 10 21:35:29 2002 -0400 + + Keep it simple, stupid. + +commit 6561b587e1de9ea7d45bd354ad1907512733d3e2 +Author: Matteo Frigo +Date: Mon Jun 10 19:24:28 2002 -0400 + + Fixed when #undef PRECOMPUTE_ARRAY_INDICES + +commit dc412dcd137b131ea524fedf1e7012ad405068bc +Author: Matteo Frigo +Date: Mon Jun 10 17:58:13 2002 -0400 + + Minor changes + +commit 9a633a7a248735746b8e8e4ef7675a2c0b2a8330 +Author: Matteo Frigo +Date: Mon Jun 10 16:30:37 2002 -0400 + + Added ct-ditbuf.c, many changes everywhere + +commit c8406b59941a26cd2145a45edbfa10d136572b94 +Author: Matteo Frigo +Date: Mon Jun 10 10:55:40 2002 -0400 + + More name mangling + +commit 0889cbac352d22d2214500301375f43bf584a6f6 +Author: Matteo Frigo +Date: Mon Jun 10 10:08:27 2002 -0400 + + Fixed build system for single/double precision + +commit c27e0f15eeb5336b8eebc47c215d2ba092e68aa9 +Author: Matteo Frigo +Date: Mon Jun 10 09:04:21 2002 -0400 + + Massive renaming to support both single and double precision. + (Must recompile everything twice). + +commit a0b9a19548d7a6278163b36fa1d3088a3ae24cd7 +Author: Matteo Frigo +Date: Mon Jun 10 06:49:55 2002 -0400 + + Preliminary crude support for vector transforms in benchmark library. + +commit ac333b5f92707c9dd867b283d23a53bc64ef69dc +Author: Matteo Frigo +Date: Sun Jun 9 21:11:51 2002 -0400 + + Wrong cast + +commit 669c861be6b66386cd4e8bf2763a8beacebe9bf7 +Author: Matteo Frigo +Date: Sun Jun 9 16:48:54 2002 -0400 + + Added things to do. + +commit 9bfab3a2538b271e95b879402f2269d3cb796144 +Author: Matteo Frigo +Date: Sun Jun 9 16:07:12 2002 -0400 + + twlen0: make static + +commit 89e7b8c3a0488bd401d699312ce92ac4fc7ad872 +Author: Matteo Frigo +Date: Sun Jun 9 15:34:54 2002 -0400 + + Nothing + +commit d8b5a396d1befb9c8709b66e032d5babd304779b +Author: Matteo Frigo +Date: Sun Jun 9 15:30:13 2002 -0400 + + Forgot break in switch statement. + +commit 36c2890f3950c1994c94a98ddf84e218064211d1 +Author: Matteo Frigo +Date: Sun Jun 9 15:27:24 2002 -0400 + + Fix for c++ compatibility + +commit 71882a5547eeb7ca329df8033e7b2eddb759bf76 +Author: Matteo Frigo +Date: Sun Jun 9 15:16:43 2002 -0400 + + Added printer, changed everything + +commit fea5c4c9f8ba921c22c6d7388e5babe9c73b8e26 +Author: Matteo Frigo +Date: Sun Jun 9 11:37:07 2002 -0400 + + Removed redundant nop solver + +commit 382dec87c6ce525bdbf78111112feabc152eb8f7 +Author: Matteo Frigo +Date: Sun Jun 9 11:06:31 2002 -0400 + + More things to do + +commit e471ce8b9ea5726e0a4d2b63770ca8e242327e71 +Author: Matteo Frigo +Date: Sun Jun 9 11:01:41 2002 -0400 + + Introduced idea of rank -infinity and associated NOP plans + +commit 408125e1afdc419d7a914c6475dc663199d1e372 +Author: Matteo Frigo +Date: Sun Jun 9 08:36:27 2002 -0400 + + Fixed comment + +commit eb28a96b485229b8d6883369b0cab54fe3df5b3d +Author: Matteo Frigo +Date: Sun Jun 9 08:20:13 2002 -0400 + + Removed useless assertions. + +commit a05a666ec036474e44f87cecc89a76f13249c4cd +Author: Matteo Frigo +Date: Sun Jun 9 08:19:26 2002 -0400 + + Don't malloc(0). + +commit 53cf44cd85d0b4fe9fd486f24c591d66fd4cb9ff +Author: Matteo Frigo +Date: Sun Jun 9 08:08:13 2002 -0400 + + Fixed signed/unsigned puns + +commit e2aae81e2ec289bb799c02ff72172ffe7f34d076 +Author: Matteo Frigo +Date: Sun Jun 9 07:52:22 2002 -0400 + + Added buffered.c + +commit bb2eb63fb1a1ddf2a8c28a918c2108f9b128053a +Author: Matteo Frigo +Date: Sat Jun 8 16:57:54 2002 -0400 + + Fixed printout + +commit 5e196db13b6e3ea78d999f2a2958c7e65c4e5e68 +Author: Matteo Frigo +Date: Sat Jun 8 16:42:52 2002 -0400 + + Fixed comment + +commit 00c4dc36263864bb6edf511df147475ca8049e35 +Author: Matteo Frigo +Date: Sat Jun 8 16:40:58 2002 -0400 + + Added vrank3-transpose, renamed vrank0-transpose -> vrank2-transpose + +commit 70736b265541c54ab69946ad312e21300b0b2f47 +Author: Matteo Frigo +Date: Sat Jun 8 15:51:46 2002 -0400 + + Added vrank0-transpose + +commit 21fa46aab36c0306bf64d254b8718c8eaf96118c +Author: Matteo Frigo +Date: Sat Jun 8 15:11:09 2002 -0400 + + Added planner-score.c + +commit 3700ef27b625aa5dd4e42e19969b9d5d0e546b39 +Author: Matteo Frigo +Date: Sat Jun 8 11:10:44 2002 -0400 + + Added indirect.c + +commit 92cdbe47f89adcf0d5ae5a1535e171fa58b94f0c +Author: Matteo Frigo +Date: Sat Jun 8 09:34:58 2002 -0400 + + dif, ditf solvers + +commit 9382caabae5da944eb93a194ed963efa5b0dcd2a +Author: Matteo Frigo +Date: Fri Jun 7 18:07:53 2002 -0400 + + Implemented rank_geq2. Revised build system + +commit fd9d18f8d6fbe910aa48673bfcfa7b3e9a0ab7e4 +Author: Matteo Frigo +Date: Fri Jun 7 07:12:25 2002 -0400 + + Fixed printout + +commit 3f7d553cb7059f0f68b15004eb6a62a2a396c092 +Author: Matteo Frigo +Date: Fri Jun 7 07:07:46 2002 -0400 + + Added rank0. Revised codelet organization. + +commit 9b91cf2747d0b49d1220a4e1fc494fe72d2a6f64 +Author: Matteo Frigo +Date: Thu Jun 6 18:03:17 2002 -0400 + + Added memoization + +commit 61d0f601e04b8e1f9ff8fe350c4ef61211be20de +Author: Matteo Frigo +Date: Thu Jun 6 08:07:33 2002 -0400 + + Added vecloop + +commit 5995d0f346270a179f5156150ce1997613636f8f +Author: Matteo Frigo +Date: Wed Jun 5 19:02:56 2002 -0400 + + First DIT solver/plan + +commit 70714a1ca5a962fc4acf3c91b5b1dbb2b5518310 +Author: Matteo Frigo +Date: Wed Jun 5 16:03:44 2002 -0400 + + More work on ct + +commit 479c74ce55bbc9e78c22e4ed8506db9c494871c5 +Author: Matteo Frigo +Date: Wed Jun 5 11:28:09 2002 -0400 + + Only use cycle counters + +commit f397307a4a2ecb675736dbfaee0e3cb117ecafc4 +Author: Matteo Frigo +Date: Tue Jun 4 20:22:23 2002 -0400 + + Signed/unsigned fixup + +commit 26f9cec858cb382ad71e3d025ef4258dffce6e0d +Author: Matteo Frigo +Date: Tue Jun 4 20:03:56 2002 -0400 + + New file twiddle.c + +commit e31060a0f867b05a6cde5ade185fa6edc487c43b +Author: Matteo Frigo +Date: Tue Jun 4 17:49:39 2002 -0400 + + Made tensor ranks and vector lengths unsigned. Hopefully fixed + all places where it matters. + +commit 33459884b1d822c57fec05becfccd6cf4a5c1efd +Author: Matteo Frigo +Date: Tue Jun 4 16:28:58 2002 -0400 + + System is in working state now (but very incomplete) + +commit 53e8499d5241b1194dcf9d39bb617b45ba00beed +Author: Matteo Frigo +Date: Mon Jun 3 18:10:12 2002 -0400 + + Started implementing planners + +commit 41ec7720369ea65ef877dacee5b43c73d36e9dc0 +Author: Matteo Frigo +Date: Mon Jun 3 11:44:18 2002 -0400 + + Imported libbench from the new benchfft. We will use libbench + for benchmarking and testing. + +commit 936272ab0ecd1ecb585f889ef7d8c996a9e9920c +Author: Matteo Frigo +Date: Mon Jun 3 09:18:46 2002 -0400 + + Removed useless rand.c + +commit c0d9815658256675268110505f21e80b6a850e2c +Author: Matteo Frigo +Date: Mon Jun 3 08:09:05 2002 -0400 + + Added timer + +commit 1135ab2472586a6ddfd23571aa9724686470238c +Author: Matteo Frigo +Date: Sun Jun 2 21:03:51 2002 -0400 + + Split codelets into standard and inplace + +commit 8394a2d62bb726c0af14d1ca1bf721d538bbb6ce +Author: Matteo Frigo +Date: Sun Jun 2 19:49:03 2002 -0400 + + Many many changes + +commit 069ab6b1a318b8d31556dafc6b07953becc026ab +Author: Matteo Frigo +Date: Sun Jun 2 15:00:11 2002 -0400 + + Fixed anachronism + +commit 9a85d188479075e3f6d1de0d33c35008578e5b97 +Author: Matteo Frigo +Date: Sun Jun 2 14:42:32 2002 -0400 + + Initial revision diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/FFTW3Config.cmake.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/FFTW3Config.cmake.in new file mode 100644 index 000000000..6b1fbc2e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/FFTW3Config.cmake.in @@ -0,0 +1,17 @@ +# defined since 2.8.3 +if (CMAKE_VERSION VERSION_LESS 2.8.3) + get_filename_component (CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) +endif () + +# Allows loading FFTW3 settings from another project +set (FFTW3_CONFIG_FILE "${CMAKE_CURRENT_LIST_FILE}") + +set (FFTW3@PREC_SUFFIX@_LIBRARIES fftw3@PREC_SUFFIX@) +set (FFTW3@PREC_SUFFIX@_LIBRARY_DIRS @CMAKE_INSTALL_FULL_LIBDIR@) +set (FFTW3@PREC_SUFFIX@_INCLUDE_DIRS @CMAKE_INSTALL_FULL_INCLUDEDIR@) + +include ("${CMAKE_CURRENT_LIST_DIR}/FFTW3LibraryDepends.cmake") + +if (CMAKE_VERSION VERSION_LESS 2.8.3) + set (CMAKE_CURRENT_LIST_DIR) +endif () diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/FFTW3ConfigVersion.cmake.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/FFTW3ConfigVersion.cmake.in new file mode 100644 index 000000000..cb906a406 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/FFTW3ConfigVersion.cmake.in @@ -0,0 +1,12 @@ + +set (PACKAGE_VERSION "@FFTW_VERSION@") + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if ("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set (PACKAGE_VERSION_COMPATIBLE FALSE) +else () + set (PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set (PACKAGE_VERSION_EXACT TRUE) + endif () +endif () diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/INSTALL b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/INSTALL new file mode 100644 index 000000000..209984075 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/Makefile.am new file mode 100644 index 000000000..eaf131cca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/Makefile.am @@ -0,0 +1,179 @@ +OPTIONS_AUTOMAKE=gnu +lib_LTLIBRARIES = libfftw3@PREC_SUFFIX@.la + +# pkgincludedir = $(includedir)/fftw3@PREC_SUFFIX@ +# nodist_pkginclude_HEADERS = config.h + +# recompile genfft if maintainer mode is true +if MAINTAINER_MODE +GENFFT = genfft +EXTRA_libfftw3@PREC_SUFFIX@_la_DEPENDENCIES = assert-shared-version-info +else +GENFFT = +endif + +ACLOCAL_AMFLAGS=-I m4 + +# when using combined thread libraries (necessary on Windows), we want +# to build threads/ first, because libfftw3_threads is added to +# libfftw3. +# +# Otherwise, we want to build libfftw3_threads after libfftw3 +# so that we can track the fact that libfftw3_threads depends upon +# libfftw3. +# +# This is the inescapable result of combining three bad ideas +# (threads, Windows, and shared libraries). +# +if COMBINED_THREADS +CHICKEN_EGG=threads . +else +CHICKEN_EGG=. threads +endif + +# Only build in doc/ if not disabled by user (i.e. not all +# tools are available, such as fig2dev in maintainer mode) +if BUILD_DOC +DOCDIR=doc +else +DOCDIR= +endif + +SUBDIRS=support $(GENFFT) kernel simd-support dft rdft reodft api \ +libbench2 $(CHICKEN_EGG) tests mpi $(DOCDIR) tools m4 +EXTRA_DIST=COPYRIGHT bootstrap.sh CONVENTIONS fftw.pc.in \ +CMakeLists.txt cmake.config.h.in FFTW3Config.cmake.in \ +FFTW3ConfigVersion.cmake.in README-perfcnt.md + +SIMD_LIBS = simd-support/libsimd_support.la + +if HAVE_SSE2 +SSE2_LIBS = dft/simd/sse2/libdft_sse2_codelets.la \ +rdft/simd/sse2/librdft_sse2_codelets.la +endif + +if HAVE_AVX +AVX_LIBS = dft/simd/avx/libdft_avx_codelets.la \ +rdft/simd/avx/librdft_avx_codelets.la +endif + +if HAVE_AVX_128_FMA +AVX_128_FMA_LIBS = dft/simd/avx-128-fma/libdft_avx_128_fma_codelets.la \ +rdft/simd/avx-128-fma/librdft_avx_128_fma_codelets.la +endif + +if HAVE_AVX2 +AVX2_LIBS = dft/simd/avx2/libdft_avx2_codelets.la \ +dft/simd/avx2-128/libdft_avx2_128_codelets.la \ +rdft/simd/avx2/librdft_avx2_codelets.la \ +rdft/simd/avx2-128/librdft_avx2_128_codelets.la +endif + +if HAVE_AVX512 +AVX512_LIBS = dft/simd/avx512/libdft_avx512_codelets.la \ +rdft/simd/avx512/librdft_avx512_codelets.la +endif + +if HAVE_KCVI +KCVI_LIBS = dft/simd/kcvi/libdft_kcvi_codelets.la \ +rdft/simd/kcvi/librdft_kcvi_codelets.la +endif + +if HAVE_ALTIVEC +ALTIVEC_LIBS = dft/simd/altivec/libdft_altivec_codelets.la \ +rdft/simd/altivec/librdft_altivec_codelets.la +endif + +if HAVE_VSX +VSX_LIBS = dft/simd/vsx/libdft_vsx_codelets.la \ +rdft/simd/vsx/librdft_vsx_codelets.la +endif + +if HAVE_NEON +NEON_LIBS = dft/simd/neon/libdft_neon_codelets.la \ +rdft/simd/neon/librdft_neon_codelets.la +endif + +if HAVE_GENERIC_SIMD128 +GENERIC_SIMD128_LIBS = dft/simd/generic-simd128/libdft_generic_simd128_codelets.la \ +rdft/simd/generic-simd128/librdft_generic_simd128_codelets.la +endif + +if HAVE_GENERIC_SIMD256 +GENERIC_SIMD256_LIBS = dft/simd/generic-simd256/libdft_generic_simd256_codelets.la \ +rdft/simd/generic-simd256/librdft_generic_simd256_codelets.la +endif + +if THREADS +if COMBINED_THREADS +COMBINED_THREADLIBS=threads/libfftw3@PREC_SUFFIX@_threads.la +endif +endif + +libfftw3@PREC_SUFFIX@_la_SOURCES = + +libfftw3@PREC_SUFFIX@_la_LIBADD = \ + kernel/libkernel.la \ + dft/libdft.la \ + dft/scalar/libdft_scalar.la \ + dft/scalar/codelets/libdft_scalar_codelets.la \ + rdft/librdft.la \ + rdft/scalar/librdft_scalar.la \ + rdft/scalar/r2cf/librdft_scalar_r2cf.la \ + rdft/scalar/r2cb/librdft_scalar_r2cb.la \ + rdft/scalar/r2r/librdft_scalar_r2r.la \ + reodft/libreodft.la \ + api/libapi.la \ + $(SIMD_LIBS) $(SSE2_LIBS) $(AVX_LIBS) $(AVX_128_FMA_LIBS) \ + $(AVX2_LIBS) $(ALTIVEC_LIBS) \ + $(VSX_LIBS) $(NEON_LIBS) $(KCVI_LIBS) $(AVX512_LIBS) \ + $(GENERIC_SIMD128_LIBS) $(GENERIC_SIMD256_LIBS) \ + $(COMBINED_THREADLIBS) + +if QUAD +# cannot use -no-undefined since dependent on libquadmath +libfftw3@PREC_SUFFIX@_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ $(ENVIRONMENT_LIBFFTW3_LDFLAGS) +else +libfftw3@PREC_SUFFIX@_la_LDFLAGS = -no-undefined -version-info \ +@SHARED_VERSION_INFO@ $(ENVIRONMENT_LIBFFTW3_LDFLAGS) +endif + +fftw3@PREC_SUFFIX@.pc: fftw.pc + cp -f fftw.pc fftw3@PREC_SUFFIX@.pc +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = fftw3@PREC_SUFFIX@.pc + +FFTW3@PREC_SUFFIX@Config.cmake: $(top_srcdir)/FFTW3Config.cmake.in + $(SED) \ + -e 's|[@]PREC_SUFFIX@|@PREC_SUFFIX@|g' \ + -e 's|[@]CMAKE_INSTALL_FULL_LIBDIR@|$(libdir)|g' \ + -e 's|[@]CMAKE_INSTALL_FULL_INCLUDEDIR@|$(includedir)|g' \ + $(top_srcdir)/FFTW3Config.cmake.in > $@ +FFTW3@PREC_SUFFIX@ConfigVersion.cmake: $(top_srcdir)/FFTW3ConfigVersion.cmake.in + $(SED) \ + -e 's|[@]FFTW_VERSION@|@PACKAGE_VERSION@|g' \ + $(top_srcdir)/FFTW3ConfigVersion.cmake.in > $@ +cmakedir = $(libdir)/cmake/fftw3 +cmake_DATA = FFTW3@PREC_SUFFIX@Config.cmake FFTW3@PREC_SUFFIX@ConfigVersion.cmake + +WISDOM_DIR = /etc/fftw +WISDOM = wisdom@PREC_SUFFIX@ + +WISDOM_TIME=12 # default to 12-hour limit, i.e. overnight +WISDOM_FLAGS=--verbose --canonical --time-limit=$(WISDOM_TIME) + +wisdom: + tools/fftw@PREC_SUFFIX@-wisdom -o $@ $(WISDOM_FLAGS) + +install-wisdom: wisdom + $(mkinstalldirs) $(WISDOM_DIR) + $(INSTALL_DATA) wisdom $(WISDOM_DIR)/$(WISDOM) + +if MAINTAINER_MODE +assert-shared-version-info: + current=`echo @SHARED_VERSION_INFO@ | cut -d: -f1`; \ + age=`echo @SHARED_VERSION_INFO@ | cut -d: -f3`; \ + major=3; \ + expected=`expr $$age + $$major`; \ + test $$current -eq $$expected +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/Makefile.in new file mode 100644 index 000000000..b4e7b2c02 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/Makefile.in @@ -0,0 +1,1161 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = fftw.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cmakedir)" \ + "$(DESTDIR)$(pkgconfigdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libfftw3@PREC_SUFFIX@_la_DEPENDENCIES = kernel/libkernel.la \ + dft/libdft.la dft/scalar/libdft_scalar.la \ + dft/scalar/codelets/libdft_scalar_codelets.la rdft/librdft.la \ + rdft/scalar/librdft_scalar.la \ + rdft/scalar/r2cf/librdft_scalar_r2cf.la \ + rdft/scalar/r2cb/librdft_scalar_r2cb.la \ + rdft/scalar/r2r/librdft_scalar_r2r.la reodft/libreodft.la \ + api/libapi.la $(SIMD_LIBS) $(SSE2_LIBS) $(AVX_LIBS) \ + $(AVX_128_FMA_LIBS) $(AVX2_LIBS) $(ALTIVEC_LIBS) $(VSX_LIBS) \ + $(NEON_LIBS) $(KCVI_LIBS) $(AVX512_LIBS) \ + $(GENERIC_SIMD128_LIBS) $(GENERIC_SIMD256_LIBS) \ + $(COMBINED_THREADLIBS) +am_libfftw3@PREC_SUFFIX@_la_OBJECTS = +libfftw3@PREC_SUFFIX@_la_OBJECTS = \ + $(am_libfftw3@PREC_SUFFIX@_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libfftw3@PREC_SUFFIX@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libfftw3@PREC_SUFFIX@_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libfftw3@PREC_SUFFIX@_la_SOURCES) +DIST_SOURCES = $(libfftw3@PREC_SUFFIX@_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(cmake_DATA) $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = support genfft kernel simd-support dft rdft reodft api \ + libbench2 . threads tests mpi doc tools m4 +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/fftw.pc.in AUTHORS COPYING ChangeLog INSTALL NEWS \ + README TODO compile config.guess config.sub install-sh \ + ltmain.sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +OPTIONS_AUTOMAKE = gnu +lib_LTLIBRARIES = libfftw3@PREC_SUFFIX@.la +@MAINTAINER_MODE_FALSE@GENFFT = + +# pkgincludedir = $(includedir)/fftw3@PREC_SUFFIX@ +# nodist_pkginclude_HEADERS = config.h + +# recompile genfft if maintainer mode is true +@MAINTAINER_MODE_TRUE@GENFFT = genfft +@MAINTAINER_MODE_TRUE@EXTRA_libfftw3@PREC_SUFFIX@_la_DEPENDENCIES = assert-shared-version-info +ACLOCAL_AMFLAGS = -I m4 +@COMBINED_THREADS_FALSE@CHICKEN_EGG = . threads + +# when using combined thread libraries (necessary on Windows), we want +# to build threads/ first, because libfftw3_threads is added to +# libfftw3. +# +# Otherwise, we want to build libfftw3_threads after libfftw3 +# so that we can track the fact that libfftw3_threads depends upon +# libfftw3. +# +# This is the inescapable result of combining three bad ideas +# (threads, Windows, and shared libraries). +# +@COMBINED_THREADS_TRUE@CHICKEN_EGG = threads . +@BUILD_DOC_FALSE@DOCDIR = + +# Only build in doc/ if not disabled by user (i.e. not all +# tools are available, such as fig2dev in maintainer mode) +@BUILD_DOC_TRUE@DOCDIR = doc +SUBDIRS = support $(GENFFT) kernel simd-support dft rdft reodft api \ +libbench2 $(CHICKEN_EGG) tests mpi $(DOCDIR) tools m4 + +EXTRA_DIST = COPYRIGHT bootstrap.sh CONVENTIONS fftw.pc.in \ +CMakeLists.txt cmake.config.h.in FFTW3Config.cmake.in \ +FFTW3ConfigVersion.cmake.in README-perfcnt.md + +SIMD_LIBS = simd-support/libsimd_support.la +@HAVE_SSE2_TRUE@SSE2_LIBS = dft/simd/sse2/libdft_sse2_codelets.la \ +@HAVE_SSE2_TRUE@rdft/simd/sse2/librdft_sse2_codelets.la + +@HAVE_AVX_TRUE@AVX_LIBS = dft/simd/avx/libdft_avx_codelets.la \ +@HAVE_AVX_TRUE@rdft/simd/avx/librdft_avx_codelets.la + +@HAVE_AVX_128_FMA_TRUE@AVX_128_FMA_LIBS = dft/simd/avx-128-fma/libdft_avx_128_fma_codelets.la \ +@HAVE_AVX_128_FMA_TRUE@rdft/simd/avx-128-fma/librdft_avx_128_fma_codelets.la + +@HAVE_AVX2_TRUE@AVX2_LIBS = dft/simd/avx2/libdft_avx2_codelets.la \ +@HAVE_AVX2_TRUE@dft/simd/avx2-128/libdft_avx2_128_codelets.la \ +@HAVE_AVX2_TRUE@rdft/simd/avx2/librdft_avx2_codelets.la \ +@HAVE_AVX2_TRUE@rdft/simd/avx2-128/librdft_avx2_128_codelets.la + +@HAVE_AVX512_TRUE@AVX512_LIBS = dft/simd/avx512/libdft_avx512_codelets.la \ +@HAVE_AVX512_TRUE@rdft/simd/avx512/librdft_avx512_codelets.la + +@HAVE_KCVI_TRUE@KCVI_LIBS = dft/simd/kcvi/libdft_kcvi_codelets.la \ +@HAVE_KCVI_TRUE@rdft/simd/kcvi/librdft_kcvi_codelets.la + +@HAVE_ALTIVEC_TRUE@ALTIVEC_LIBS = dft/simd/altivec/libdft_altivec_codelets.la \ +@HAVE_ALTIVEC_TRUE@rdft/simd/altivec/librdft_altivec_codelets.la + +@HAVE_VSX_TRUE@VSX_LIBS = dft/simd/vsx/libdft_vsx_codelets.la \ +@HAVE_VSX_TRUE@rdft/simd/vsx/librdft_vsx_codelets.la + +@HAVE_NEON_TRUE@NEON_LIBS = dft/simd/neon/libdft_neon_codelets.la \ +@HAVE_NEON_TRUE@rdft/simd/neon/librdft_neon_codelets.la + +@HAVE_GENERIC_SIMD128_TRUE@GENERIC_SIMD128_LIBS = dft/simd/generic-simd128/libdft_generic_simd128_codelets.la \ +@HAVE_GENERIC_SIMD128_TRUE@rdft/simd/generic-simd128/librdft_generic_simd128_codelets.la + +@HAVE_GENERIC_SIMD256_TRUE@GENERIC_SIMD256_LIBS = dft/simd/generic-simd256/libdft_generic_simd256_codelets.la \ +@HAVE_GENERIC_SIMD256_TRUE@rdft/simd/generic-simd256/librdft_generic_simd256_codelets.la + +@COMBINED_THREADS_TRUE@@THREADS_TRUE@COMBINED_THREADLIBS = threads/libfftw3@PREC_SUFFIX@_threads.la +libfftw3@PREC_SUFFIX@_la_SOURCES = +libfftw3@PREC_SUFFIX@_la_LIBADD = \ + kernel/libkernel.la \ + dft/libdft.la \ + dft/scalar/libdft_scalar.la \ + dft/scalar/codelets/libdft_scalar_codelets.la \ + rdft/librdft.la \ + rdft/scalar/librdft_scalar.la \ + rdft/scalar/r2cf/librdft_scalar_r2cf.la \ + rdft/scalar/r2cb/librdft_scalar_r2cb.la \ + rdft/scalar/r2r/librdft_scalar_r2r.la \ + reodft/libreodft.la \ + api/libapi.la \ + $(SIMD_LIBS) $(SSE2_LIBS) $(AVX_LIBS) $(AVX_128_FMA_LIBS) \ + $(AVX2_LIBS) $(ALTIVEC_LIBS) \ + $(VSX_LIBS) $(NEON_LIBS) $(KCVI_LIBS) $(AVX512_LIBS) \ + $(GENERIC_SIMD128_LIBS) $(GENERIC_SIMD256_LIBS) \ + $(COMBINED_THREADLIBS) + +@QUAD_FALSE@libfftw3@PREC_SUFFIX@_la_LDFLAGS = -no-undefined -version-info \ +@QUAD_FALSE@@SHARED_VERSION_INFO@ $(ENVIRONMENT_LIBFFTW3_LDFLAGS) + + +# cannot use -no-undefined since dependent on libquadmath +@QUAD_TRUE@libfftw3@PREC_SUFFIX@_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ $(ENVIRONMENT_LIBFFTW3_LDFLAGS) +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = fftw3@PREC_SUFFIX@.pc +cmakedir = $(libdir)/cmake/fftw3 +cmake_DATA = FFTW3@PREC_SUFFIX@Config.cmake FFTW3@PREC_SUFFIX@ConfigVersion.cmake +WISDOM_DIR = /etc/fftw +WISDOM = wisdom@PREC_SUFFIX@ +WISDOM_TIME = 12 # default to 12-hour limit, i.e. overnight +WISDOM_FLAGS = --verbose --canonical --time-limit=$(WISDOM_TIME) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +fftw.pc: $(top_builddir)/config.status $(srcdir)/fftw.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libfftw3@PREC_SUFFIX@.la: $(libfftw3@PREC_SUFFIX@_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_la_DEPENDENCIES) $(EXTRA_libfftw3@PREC_SUFFIX@_la_DEPENDENCIES) + $(AM_V_CCLD)$(libfftw3@PREC_SUFFIX@_la_LINK) -rpath $(libdir) $(libfftw3@PREC_SUFFIX@_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-cmakeDATA: $(cmake_DATA) + @$(NORMAL_INSTALL) + @list='$(cmake_DATA)'; test -n "$(cmakedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \ + done + +uninstall-cmakeDATA: + @$(NORMAL_UNINSTALL) + @list='$(cmake_DATA)'; test -n "$(cmakedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-cmakeDATA install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-cmakeDATA uninstall-libLTLIBRARIES \ + uninstall-pkgconfigDATA + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libLTLIBRARIES clean-libtool cscope cscopelist-am ctags \ + ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ + dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-cmakeDATA install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-cmakeDATA uninstall-libLTLIBRARIES \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +fftw3@PREC_SUFFIX@.pc: fftw.pc + cp -f fftw.pc fftw3@PREC_SUFFIX@.pc + +FFTW3@PREC_SUFFIX@Config.cmake: $(top_srcdir)/FFTW3Config.cmake.in + $(SED) \ + -e 's|[@]PREC_SUFFIX@|@PREC_SUFFIX@|g' \ + -e 's|[@]CMAKE_INSTALL_FULL_LIBDIR@|$(libdir)|g' \ + -e 's|[@]CMAKE_INSTALL_FULL_INCLUDEDIR@|$(includedir)|g' \ + $(top_srcdir)/FFTW3Config.cmake.in > $@ +FFTW3@PREC_SUFFIX@ConfigVersion.cmake: $(top_srcdir)/FFTW3ConfigVersion.cmake.in + $(SED) \ + -e 's|[@]FFTW_VERSION@|@PACKAGE_VERSION@|g' \ + $(top_srcdir)/FFTW3ConfigVersion.cmake.in > $@ + +wisdom: + tools/fftw@PREC_SUFFIX@-wisdom -o $@ $(WISDOM_FLAGS) + +install-wisdom: wisdom + $(mkinstalldirs) $(WISDOM_DIR) + $(INSTALL_DATA) wisdom $(WISDOM_DIR)/$(WISDOM) + +@MAINTAINER_MODE_TRUE@assert-shared-version-info: +@MAINTAINER_MODE_TRUE@ current=`echo @SHARED_VERSION_INFO@ | cut -d: -f1`; \ +@MAINTAINER_MODE_TRUE@ age=`echo @SHARED_VERSION_INFO@ | cut -d: -f3`; \ +@MAINTAINER_MODE_TRUE@ major=3; \ +@MAINTAINER_MODE_TRUE@ expected=`expr $$age + $$major`; \ +@MAINTAINER_MODE_TRUE@ test $$current -eq $$expected + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/NEWS b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/NEWS new file mode 100644 index 000000000..9f55f060d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/NEWS @@ -0,0 +1,637 @@ +FFTW 3.3.8: + +* Fixed AVX, AVX2 for gcc-8. + + By default, FFTW 3.3.7 was broken with gcc-8. AVX and AVX2 code + assumed that the compiler honors the distinction between +0 and -0, + but gcc-8 -ffast-math does not. The default CFLAGS included -ffast-math. + This release ensures that FFTW works with gcc-8 -ffast-math, and + removes -ffast-math from the default CFLAGS for good measure. + +FFTW 3.3.7: + +* Experimental support for CMake. + + The primary build mechanism for FFTW remains GNU autoconf/automake. + CMake support is meant to offer an easy way to compile FFTW on + Windows, and as such it does not cover all the features of the + automake build system, such as exotic cycle counters, + cross-compiling, or build of binaries for a mixture of ISA's + (e.g., amd64 vs amd64+avx vs amd64+avx2). Patches are welcome. + +* Fixes for armv7a cycle counter. +* Official support for aarch64, now that we have hardware to test it. +* Tweak usage of FMA instructions in a way that favors newer processors + (Skylake and Ryzen) over older processors (Haswell). +* tests/bench: use 64-bit precision to compute mflops. + +FFTW 3.3.6-pl2: + +* Bugfix: MPI Fortran-03 headers were missing in FFTW 3.3.6-pl1. + +FFTW 3.3.6-pl1: + +* Bugfix: FFTW 3.3.6 had the wrong libtool version number, and generated + shared libraries of the form libfftw3.so.2.6.6 instead of + libfftw3.so.3.*. + +FFTW 3.3.6: + +* The fftw_make_planner_thread_safe() API introduced in 3.3.5 didn't + work, and this 3.3.6 fixes it. Sorry about that. +* compilation fixes for IBM XLC +* compilation fixes for threads on Windows +* fix SIMD autodetection on amd64 when (_MSC_VER > 1500) + +FFTW 3.3.5: + +* New SIMD support: + - Power8 VSX instructions in single and double precision. + To use, add --enable-vsx to configure. + - Support for AVX2 (256-bit FMA instructions). + To use, add --enable-avx2 to configure. + - Experimental support for AVX512 and KCVI. (--enable-avx512, --enable-kcvi) + This code is expected to work but the FFTW maintainers do not have + hardware to test it. + - Support for AVX128/FMA (for some AMD machines) (--enable-avx128-fma) + - Double precision Neon SIMD for aarch64. + This code is expected to work but the FFTW maintainers do not have + hardware to test it. + - generic SIMD support using gcc vector intrinsics +* Add fftw_make_planner_thread_safe() API +* fix #18 (disable float128 for CUDACC) +* fix #19: missing Fortran interface for fftwq_alloc_real +* fix #21 (don't use float128 on Portland compilers, which pretend to be gcc) +* fix: Avoid segfaults due to double free in MPI transpose + +* Special note for distribution maintainers: Although FFTW supports a + zillion SIMD instruction sets, enabling them all at the same time is + a bad idea, because it increases the planning time for minimal gain. + We recommend that general-purpose x86 distributions only enable SSE2 + and perhaps AVX. Users who care about the last ounce of performance + should recompile FFTW themselves. + +FFTW 3.3.4 + +* New functions fftw_alignment_of (to check whether two arrays are + equally aligned for the purposes of applying a plan) and fftw_sprint_plan + (to output a description of plan to a string). + +* Bugfix in fftw-wisdom-to-conf; thanks to Florian Oppermann for the + bug report. + +* Fixed manual to work with texinfo-5. + +* Increased timing interval on x86_64 to reduce timing errors. + +* Default to Win32 threads, not pthreads, if both are present. + +* Various build-script fixes. + +FFTW 3.3.3 + +* Fix deadlock bug in MPI transforms (thanks to Michael Pippig for the + bug report and patch, and to Graham Dennis for the bug report). + +* Use 128-bit ARM NEON instructions instead of 64-bits. This change + appears to speed up even ARM processors with a 64-bit NEON pipe. + +* Speed improvements for single-precision AVX. + +* Speed up planner on machines without "official" cycle counters, such as ARM. + +FFTW 3.3.2 + +* Removed an archaic stack-alignment hack that was failing with + gcc-4.7/i386. + +* Added stack-alignment hack necessary for gcc on Windows/i386. We + will regret this in ten years (see previous change). + +* Fix incompatibility with Intel icc which pretends to be gcc + but does not support quad precision. + +* make libfftw{threads,mpi} depend upon libfftw when using libtool; + this is consistent with most other libraries and simplifies the life + of various distributors of GNU/Linux. + +FFTW 3.3.1 + +* Changes since 3.3.1-beta1: + + - Reduced planning time in estimate mode for sizes with large + prime factors. + + - Added AVX autodetection under Visual Studio. Thanks Carsten + Steger for submitting the necessary code. + + - Modern Fortran interface now uses a separate fftw3l.f03 interface + file for the long double interface, which is not supported by + some Fortran compilers. Provided new fftw3q.f03 interface file + to access the quadruple-precision FFTW routines with recent + versions of gcc/gfortran. + +* Added support for the NEON extensions to the ARM ISA. (Note to beta + users: an ARM cycle counter is not yet implemented; please contact + fftw@fftw.org if you know how to do it right.) + +* MPI code now compiles even if mpicc is a C++ compiler; thanks to + Kyle Spyksma for the bug report. + +FFTW 3.3 + +* Changes since 3.3-beta1: + + - Compiling OpenMP support (--enable-openmp) now installs a + fftw3_omp library, instead of fftw3_threads, so that OpenMP + and POSIX threads (--enable-threads) libraries can be built + and installed at the same time. + + - Various minor compilation fixes, corrections of manual typos, and + improvements to the benchmark test program. + +* Add support for the AVX extensions to x86 and x86-64. The AVX code + works with 16-byte alignment (as opposed to 32-byte alignment), + so there is no ABI change compared to FFTW 3.2.2. + +* Added Fortran 2003 interface, which should be usable on most modern + Fortran compilers (e.g. gfortran) and provides type-checked access + to the the C FFTW interface. (The legacy Fortran-77 interface is + still included also.) + +* Added MPI distributed-memory transforms. Compared to 3.3alpha, + the major changes in the MPI transforms are: + - Fixed some deadlock and crashing bugs. + - Added Fortran 2003 interface. + - Added new-array execute functions for MPI plans. + - Eliminated use of large MPI tags, since Cray MPI requires tags < 2^24; + thanks to Jonathan Bentz for the bug report. + - Expanded documentation. + - 'make check' now runs MPI tests + - Some ABI changes - not binary-compatible with 3.3alpha MPI. + +* Add support for quad-precision __float128 in gcc 4.6 or later (on x86. + x86-64, and Itanium). The new routines use the fftwq_ prefix. + +* Removed support for MIPS paired-single instructions due to lack of + available hardware for testing. Users who want this functionality + should continue using FFTW 3.2.x. (Note that FFTW 3.3 still works + on MIPS; this only concerns special instructions available on some + MIPS chips.) + +* Removed support for the Cell Broadband Engine. Cell users should + use FFTW 3.2.x. + +* New convenience functions fftw_alloc_real and fftw_alloc_complex + to use fftw_malloc for real and complex arrays without typecasts + or sizeof. + +* New convenience functions fftw_export_wisdom_to_filename and + fftw_import_wisdom_from_filename that export/import wisdom + to a file, which don't require you to open/close the file yourself. + +* New function fftw_cost to return FFTW's internal cost metric for + a given plan; thanks to Rhys Ulerich and Nathanael Schaeffer for the + suggestion. + +* The --enable-sse2 configure flag now works in both double and single + precision (and is equivalent to --enable-sse in the latter case). + +* Remove --enable-portable-binary flag: we new produce portable binaries + by default. + +* Remove the automatic detection of native architecture flag for gcc + which was introduced in fftw-3.1, since new gcc supports -mtune=native. + Remove the --with-gcc-arch flag; if you want to specify a particlar + arch to configure, use ./configure CC="gcc -mtune=...". + +* --with-our-malloc16 configure flag is now renamed --with-our-malloc. + +* Fixed build problem failure when srand48 declaration is missing; + thanks to Ralf Wildenhues for the bug report. + +* Fixed bug in fftw_set_timelimit: ensure that a negative timelimit + is equivalent to no timelimit in all cases. Thanks to William Andrew + Burnson for the bug report. + +* Fixed stack-overflow problem on OpenBSD caused by using alloca with + too large a buffer. + +FFTW 3.2.2 + +* Improve performance of some copy operations of complex arrays on + x86 machines. + +* Add configure flag to disable alloca(), which is broken in mingw64. + +* Planning in FFTW_ESTIMATE mode for r2r transforms became slower + between fftw-3.1.3 and 3.2. This regression has now been fixed. + +FFTW 3.2.1 + +* Performance improvements for some multidimensional r2c/c2r transforms; + thanks to Eugene Miloslavsky for his benchmark reports. + +* Compile with icc on MacOS X, use better icc compiler flags. + +* Compilation fixes for systems where snprintf is defined as a macro; + thanks to Marcus Mae for the bug report. + +* Fortran documentation now recommends not using dfftw_execute, + because of reports of problems with various Fortran compilers; + it is better to use dfftw_execute_dft etcetera. + +* Some documentation clarifications, e.g. of fact that --enable-openmp + and --enable-threads are mutually exclusive (thanks to Long To), + and document slightly odd behavior of plan_guru_r2r in Fortran + (thanks to Alexander Pozdneev). + +* FAQ was accidentally omitted from 3.2 tarball. + +* Remove some extraneous (harmless) files accidentally included in + a subdirectory of the 3.2 tarball. + +FFTW 3.2 + +* Worked around apparent glibc bug that leads to rare hangs when freeing + semaphores. + +* Fixed segfault due to unaligned access in certain obscure problems + that use SSE and multiple threads. + +* MPI transforms not included, as they are still in alpha; the alpha + versions of the MPI transforms have been moved to FFTW 3.3alpha1. + +FFTW 3.2alpha3 + +* Performance improvements for sizes with factors of 5 and 10. + +* Documented FFTW_WISDOM_ONLY flag, at the suggestion of Mario + Emmenlauer and Phil Dumont. + +* Port Cell code to SDK2.1 (libspe2), as opposed to the old libspe1 code. + +* Performance improvements in Cell code for N < 32k, thanks to Jan Wagner + for the suggestions. + +* Cycle counter for Sun x86_64 compiler, and compilation fix in cycle + counter for AIX/xlc (thanks to Jeff Haferman for the bug report). + +* Fixed incorrect type prefix in MPI code that prevented wisdom routines + from working in single precision (thanks to Eric A. Borisch for the report). + +* Added 'make check' for MPI code (which still fails in a couple corner + cases, but should be much better than in alpha2). + +* Many other small fixes. + +FFTW 3.2alpha2 + +* Support for the Cell processor, donated by IBM Research; see README.Cell + and the Cell section of the manual. + +* New 64-bit API: for every "plan_guru" function there is a new "plan_guru64" + function with the same semantics, but which takes fftw_iodim64 instead of + fftw_iodim. fftw_iodim64 is the same as fftw_iodim, except that it takes + ptrdiff_t integer types as parameters, which is a 64-bit type on + 64-bit machines. This is only useful for specifying very large transforms + on 64-bit machines. (Internally, FFTW uses ptrdiff_t everywhere + regardless of what API you choose.) + +* Experimental MPI support. Complex one- and multi-dimensional FFTs, + multi-dimensional r2r, multi-dimensional r2c/c2r transforms, and + distributed transpose operations, with 1d block distributions. + (This is an alpha preview: routines have not been exhaustively + tested, documentation is incomplete, and some functionality is + missing, e.g. Fortran support.) See mpi/README and also the MPI + section of the manual. + +* Significantly faster r2c/c2r transforms, especially on machines with SIMD. + +* Rewritten multi-threaded support for better performance by + re-using a fixed pool of threads rather than continually + respawning and joining (which nowadays is much slower). + +* Support for MIPS paired-single SIMD instructions, donated by + Codesourcery. + +* FFTW_WISDOM_ONLY planner flag, to create plan only if wisdom is + available and return NULL otherwise. + +* Removed k7 support, which only worked in 32-bit mode and is + becoming obsolete. Use --enable-sse instead. + +* Added --with-g77-wrappers configure option to force inclusion + of g77 wrappers, in addition to whatever is needed for the + detected Fortran compilers. This is mainly intended for GNU/Linux + distros switching to gfortran that wish to include both + gfortran and g77 support in FFTW. + +* In manual, renamed "guru execute" functions to "new-array execute" + functions, to reduce confusion with the guru planner interface. + (The programming interface is unchanged.) + +* Add missing __declspec attribute to threads API functions when compiling + for Windows; thanks to Robert O. Morris for the bug report. + +* Fixed missing return value from dfftw_init_threads in Fortran; + thanks to Markus Wetzstein for the bug report. + +FFTW 3.1.3 + +* Bug fix: FFTW computes incorrect results when the user plans both + REDFT11 and RODFT11 transforms of certain sizes. The bug is caused + by incorrect sharing of twiddle-factor tables between the two + transforms, and only occurs when both are used. Thanks to Paul + A. Valiant for the bug report. + +FFTW 3.1.2 + +* Correct bug in configure script: --enable-portable-binary option was ignored! + Thanks to Andrew Salamon for the bug report. + +* Threads compilation fix on AIX: prefer xlc_r to cc_r, and don't use + either if we are using gcc. Thanks to Guy Moebs for the bug report. + +* Updated FAQ to note that Apple gcc 4.0.1 on MacOS/Intel is broken, + and suggest a workaround. configure script now detects Core/Duo arch. + +* Use -maltivec when checking for altivec.h. Fixes Gentoo bug #129304, + thanks to Markus Dittrich. + +FFTW 3.1.1 + +* Performance improvements for Intel EMT64. + +* Performance improvements for large-size transforms with SIMD. + +* Cycle counter support for Intel icc and Visual C++ on x86-64. + +* In fftw-wisdom tool, replaced obsolete --impatient with --measure. + +* Fixed compilation failure with AIX/xlc; thanks to Joseph Thomas. + +* Windows DLL support for Fortran API (added missing __declspec(dllexport)). + +* SSE/SSE2 code works properly (i.e. disables itself) on older 386 and 486 + CPUs lacking a CPUID instruction; thanks to Eric Korpela. + +FFTW 3.1 + +* Faster FFTW_ESTIMATE planner. + +* New (faster) algorithm for REDFT00/RODFT00 (type-I DCT/DST) of odd size. + +* "4-step" algorithm for faster FFTs of very large sizes (> 2^18). + +* Faster in-place real-data DFTs (for R2HC and HC2R r2r formats). + +* Faster in-place non-square transpositions (FFTW uses these internally + for in-place FFTs, and you can also perform them explicitly using + the guru interface). + +* Faster prime-size DFTs: implemented Bluestein's algorithm, as well + as a zero-padded Rader variant to limit recursive use of Rader's algorithm. + +* SIMD support for split complex arrays. + +* Much faster Altivec/VMX performance. + +* New fftw_set_timelimit function to specify a (rough) upper bound to the + planning time (does not affect ESTIMATE mode). + +* Removed --enable-3dnow support; use --enable-k7 instead. + +* FMA (fused multiply-add) version is now included in "standard" FFTW, + and is enabled with --enable-fma (the default on PowerPC and Itanium). + +* Automatic detection of native architecture flag for gcc. New + configure options: --enable-portable-binary and --with-gcc-arch=, + for people distributing compiled binaries of FFTW (see manual). + +* Automatic detection of Altivec under Linux with gcc 3.4 (so that + same binary should work on both Altivec and non-Altivec PowerPCs). + +* Compiler-specific tweaks/flags/workarounds for gcc 3.4, xlc, HP/UX, + Solaris/Intel. + +* Various documentation clarifications. + +* 64-bit clean. (Fixes a bug affecting the split guru planner on + 64-bit machines, reported by David Necas.) + +* Fixed Debian bug #259612: inadvertent use of SSE instructions on + non-SSE machines (causing a crash) for --enable-sse binaries. + +* Fixed bug that caused HC2R transforms to destroy the input in + certain cases, even if the user specified FFTW_PRESERVE_INPUT. + +* Fixed bug where wisdom would be lost under rare circumstances, + causing excessive planning time. + +* FAQ notes bug in gcc-3.4.[1-3] that causes FFTW to crash with SSE/SSE2. + +* Fixed accidentally exported symbol that prohibited simultaneous + linking to double/single multithreaded FFTW (thanks to Alessio Massaro). + +* Support Win32 threads under MinGW (thanks to Alessio Massaro). + +* Fixed problem with building DLL under Cygwin; thanks to Stephane Fillod. + +* Fix build failure if no Fortran compiler is found (thanks to Charles + Radley for the bug report). + +* Fixed compilation failure with icc 8.0 and SSE/SSE2. Automatic + detection of icc architecture flag (e.g. -xW). + +* Fixed compilation with OpenMP on AIX (thanks to Greg Bauer). + +* Fixed compilation failure on x86-64 with gcc (thanks to Orion Poplawski). + +* Incorporated patch from FreeBSD ports (FreeBSD does not have memalign, + but its malloc is 16-byte aligned). + +* Cycle-counter compilation fixes for Itanium, Alpha, x86-64, Sparc, + MacOS (thanks to Matt Boman, John Bowman, and James A. Treacy for + reports/fixes). Added x86-64 cycle counter for PGI compilers, + courtesy Cristiano Calonaci. + +* Fix compilation problem in test program due to C99 conflict. + +* Portability fix for import_system_wisdom with djgpp (thanks to Juan + Manuel Guerrero). + +* Fixed compilation failure on MacOS 10.3 due to getopt conflict. + +* Work around Visual C++ (version 6/7) bug in SSE compilation; + thanks to Eddie Yee for his detailed report. + +Changes from FFTW 3.1 beta 2: + +* Several minor compilation fixes. + +* Eliminate FFTW_TIMELIMIT flag and replace fftw_timelimit global with + fftw_set_timelimit function. Make wisdom work with time-limited plans. + +Changes from FFTW 3.1 beta 1: + +* Fixes for creating DLLs under Windows; thanks to John Pavel for his feedback. + +* Fixed more 64-bit problems, thanks to John Pavel for the bug report. + +* Further speed improvements for Altivec/VMX. + +* Further speed improvements for non-square transpositions. + +* Many minor tweaks. + +FFTW 3.0.1 + +* Some speed improvements in SIMD code. + +* --without-cycle-counter option is removed. If no cycle counter is found, + then the estimator is always used. A --with-slow-timer option is provided + to force the use of lower-resolution timers. + +* Several fixes for compilation under Visual C++, with help from Stefane Ruel. + +* Added x86 cycle counter for Visual C++, with help from Morten Nissov. + +* Added S390 cycle counter, courtesy of James Treacy. + +* Added missing static keyword that prevented simultaneous linkage + of different-precision versions; thanks to Rasmus Larsen for the bug report. + +* Corrected accidental omission of f77_wisdom.f file; thanks to Alan Watson. + +* Support -xopenmp flag for SunOS; thanks to John Lou for the bug report. + +* Compilation with HP/UX cc requires -Wp,-H128000 flag to increase + preprocessor limits; thanks to Peter Vouras for the bug report. + +* Removed non-portable use of 'tempfile' in fftw-wisdom-to-conf script; + thanks to Nicolas Decoster for the patch. + +* Added 'make smallcheck' target in tests/ directory, at the request of + James Treacy. + +FFTW 3.0 + +Major goals of this release: + +* Speed: often 20% or more faster than FFTW 2.x, even without SIMD (see below). + +* Complete rewrite, to make it easier to add new algorithms and transforms. + +* New API, to support more general semantics. + +Other enhancements: + +* SIMD acceleration on supporting CPUs (SSE, SSE2, 3DNow!, and AltiVec). + (With special thanks to Franz Franchetti for many experimental prototypes + and to Stefan Kral for the vectorizing generator from fftwgel.) + +* True in-place 1d transforms of large sizes (as well as compressed + twiddle tables for additional memory/cache savings). + +* More arbitrary placement of real & imaginary data, e.g. including + interleaved (as in FFTW 2.x) as well as separate real/imag arrays. + +* Efficient prime-size transforms of real data. + +* Multidimensional transforms can operate on a subset of a larger matrix, + and/or transform selected dimensions of a multidimensional array. + +* By popular demand, simultaneous linking to double precision (fftw), + single precision (fftwf), and long-double precision (fftwl) versions + of FFTW is now supported. + +* Cycle counters (on all modern CPUs) are exploited to speed planning. + +* Efficient transforms of real even/odd arrays, a.k.a. discrete + cosine/sine transforms (types I-IV). (Currently work via pre/post + processing of real transforms, ala FFTPACK, so are not optimal.) + +* DHTs (Discrete Hartley Transforms), again via post-processing + of real transforms (and thus suboptimal, for now). + +* Support for linking to just those parts of FFTW that you need, + greatly reducing the size of statically linked programs when + only a limited set of transform sizes/types are required. + +* Canonical global wisdom file (/etc/fftw/wisdom) on Unix, along + with a command-line tool (fftw-wisdom) to generate/update it. + +* Fortran API can be used with both g77 and non-g77 compilers + simultaneously. + +* Multi-threaded version has optional OpenMP support. + +* Authors' good looks have greatly improved with age. + +Changes from 3.0beta3: + +* Separate FMA distribution to better exploit fused multiply-add instructions + on PowerPC (and possibly other) architectures. + +* Performance improvements via some inlining tweaks. + +* fftw_flops now returns double arguments, not int, to avoid overflows + for large sizes. + +* Workarounds for automake bugs. + +Changes from 3.0beta2: + +* The standard REDFT00/RODFT00 (DCT-I/DST-I) algorithm (used in + FFTPACK, NR, etcetera) turns out to have poor numerical accuracy, so + we replaced it with a slower routine that is more accurate. + +* The guru planner and execute functions now have two variants, one that + takes complex arguments and one that takes separate real/imag pointers. + +* Execute and planner routines now automatically align the stack on x86, + in case the calling program is misaligned. + +* README file for test program. + +* Fixed bugs in the combination of SIMD with multi-threaded transforms. + +* Eliminated internal fftw_threads_init function, which some people were + calling accidentally instead of the fftw_init_threads API function. + +* Check for -openmp flag (Intel C compiler) when --enable-openmp is used. + +* Support AMD x86-64 SIMD and cycle counter. + +* Support SSE2 intrinsics in forthcoming gcc 3.3. + +Changes from 3.0beta1: + +* Faster in-place 1d transforms of non-power-of-two sizes. + +* SIMD improvements for in-place, multi-dimensional, and/or non-FFTW_PATIENT + transforms. + +* Added support for hard-coded DCT/DST/DHT codelets of small sizes; the + default distribution only includes hard-coded size-8 DCT-II/III, however. + +* Many minor improvements to the manual. Added section on using the + codelet generator to customize and enhance FFTW. + +* The default 'make check' should now only take a few minutes; for more + strenuous tests (which may take a day or so), do 'cd tests; make bigcheck'. + +* fftw_print_plan is split into fftw_fprint_plan and fftw_print_plan, where + the latter uses stdout. + +* Fixed ability to compile with a C++ compiler. + +* Fixed support for C99 complex type under glibc. + +* Fixed problems with alloca under MinGW, AIX. + +* Workaround for gcc/SPARC bug. + +* Fixed multi-threaded initialization failure on IRIX due to lack of + user-accessible PTHREAD_SCOPE_SYSTEM there. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/README b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/README new file mode 100644 index 000000000..d694a87cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/README @@ -0,0 +1,61 @@ +FFTW is a free collection of fast C routines for computing the +Discrete Fourier Transform in one or more dimensions. It includes +complex, real, symmetric, and parallel transforms, and can handle +arbitrary array sizes efficiently. FFTW is typically faster than +other publically-available FFT implementations, and is even +competitive with vendor-tuned libraries. (See our web page +http://fftw.org/ for extensive benchmarks.) To achieve this +performance, FFTW uses novel code-generation and runtime +self-optimization techniques (along with many other tricks). + +The doc/ directory contains the manual in texinfo, PDF, info, and HTML +formats. Frequently asked questions and answers can be found in the +doc/FAQ/ directory in ASCII and HTML. + +For a quick introduction to calling FFTW, see the "Tutorial" section +of the manual. + +INSTALLATION +------------ + +INSTALLATION FROM AN OFFICIAL RELEASE: + +Please read chapter 10 "Installation and Customization" of the manual. +In short: + + ./configure + make + make install + +INSTALLATION FROM THE GIT REPOSITORY: + +First, install these programs: + + ocaml, ocamlbuild, autoconf, automake, indent, and libtool, + +Then, execute + + sh bootstrap.sh + make + +The bootstrap.sh script runs configure directly, but if you need to +re-run configure, you must pass the --enable-maintainer-mode flag: + + ./configure --enable-maintainer-mode [OTHER CONFIGURE FLAGS] + +Alternatively, you can run + + sh mkdist.sh + +which will run the entire bootstrapping process and generate +.tar.gz files similar to those for official releases. + +CONTACTS +-------- + +FFTW was written by Matteo Frigo and Steven G. Johnson. You can +contact them at fftw@fftw.org. The latest version of FFTW, +benchmarks, links, and other information can be found at the FFTW home +page (http://www.fftw.org). You can also sign up to the fftw-announce +Google group to receive (infrequent) updates and information about new +releases. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/README-perfcnt.md b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/README-perfcnt.md new file mode 100644 index 000000000..46d82397f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/README-perfcnt.md @@ -0,0 +1,93 @@ +Performance Counters +==================== + +FFTW measures execution time in the planning stage, optionally taking advantage +of hardware performance counters. This document describes the supported +counters and additional steps needed to enable each on different architectures. + +See `./configure --help` for flags for enabling each supported counter. +See [kernel/cycle.h](kernel/cycle.h) for the code that accesses the counters. + +ARMv7-A (armv7a) +================ + +`CNTVCT`: Virtual Count Register in VMSA +-------------------------------------- + +A 64-bit counter part of Virtual Memory System Architecture. +Section B4.1.34 in ARM Architecture Reference Manual ARMv7-A/ARMv7-R + +For access from user mode, requires `CNTKCTL.PL0VCTEN == 1`, which must +be set in kernel mode on each CPU: + + #define CNTKCTL_PL0VCTEN 0x2 /* B4.1.26 in ARM Architecture Rreference */ + uint32_t r; + asm volatile("mrc p15, 0, %0, c14, c1, 0" : "=r"(r)); /* read */ + r |= CNTKCTL_PL0VCTEN; + asm volatile("mcr p15, 0, %0, c14, c1, 0" :: "r"(r)); /* write */ + +Kernel module source *which can be patched with the above code* available at: +https://github.com/thoughtpolice/enable_arm_pmu + +`PMCCNTR`: Performance Monitors Cycle Count Register in VMSA +---------------------------------------------------------- + +A 32-bit counter part of Virtual Memory System Architecture. +Section B4.1.113 in ARM Architecture Reference Manual ARMv7-A/ARMv7-R + +For access from user mode, requires user-mode access to PMU to be enabled +(`PMUSERENR.EN == 1`), which must be done from kernel mode on each CPU: + + #define PERF_DEF_OPTS (1 | 16) + /* enable user-mode access to counters */ + asm volatile("mcr p15, 0, %0, c9, c14, 0" :: "r"(1)); + /* Program PMU and enable all counters */ + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(PERF_DEF_OPTS)); + asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(0x8000000f)); + +Kernel module source with the above code available at: +[GitHub thoughtpolice/enable\_arm\_pmu](https://github.com/thoughtpolice/enable_arm_pmu) + +More information: +http://neocontra.blogspot.com/2013/05/user-mode-performance-counters-for.html + +ARMv8-A (aarch64) +================= + +`CNTVCT_EL0`: Counter-timer Virtual Count Register +------------------------------------------------ + +A 64-bit counter, part of Generic Registers. +Section D8.5.17 in ARM Architecture Reference Manual ARMv8-A + +For user-mode access, requires `CNTKCTL_EL1.EL0VCTEN == 1`, which +must be set from kernel mode for each CPU: + + #define CNTKCTL_EL0VCTEN 0x2 + uint32_t r; + asm volatile("mrs %0, CNTKCTL_EL1" : "=r"(r)); /* read */ + r |= CNTKCTL_EL0VCTEN; + asm volatile("msr CNTKCTL_EL1, %0" :: "r"(r)); /* write */ + +*WARNING*: Above code was not tested. + +`PMCCNTR_EL0`: Performance Monitors Cycle Count Register +------------------------------------------------------ + +A 64-bit counter, part of Performance Monitors. +Section D8.4.2 in ARM Architecture Reference Manual ARMv8-A + +For access from user mode, requires user-mode access to PMU (`PMUSERENR_EL0.EN +== 1`), which must be set from kernel mode for each CPU: + + #define PERF_DEF_OPTS (1 | 16) + /* enable user-mode access to counters */ + asm volatile("msr PMUSERENR_EL0, %0" :: "r"(1)); + /* Program PMU and enable all counters */ + asm volatile("msr PMCR_EL0, %0" :: "r"(PERF_DEF_OPTS)); + asm volatile("msr PMCNTENSET_EL0, %0" :: "r"(0x8000000f)); + asm volatile("msr PMCCFILTR_EL0, %0" :: "r"(0)); + +Kernel module source with the above code available at: +[GitHub rdolbeau/enable\_arm\_pmu](https://github.com/rdolbeau/enable_arm_pmu) +or in [Pull Request #2 at thoughtpolice/enable\_arm\_pmu](https://github.com/thoughtpolice/enable_arm_pmu/pull/2) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/TODO b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/TODO new file mode 100644 index 000000000..a452e79b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/TODO @@ -0,0 +1,43 @@ +TODO before FFTW-$2\pi$: + +* figure out how to autodetect NEON at runtime + +* figure out the arm cycle counter business + +* Wisdom: make it clear that it is specific to the exact fftw version + and configuration. Report error codes when reading wisdom. Maybe + have multiple system wisdom files, one per version? + +* DCT/DST codelets? which kinds? + +* investigate the addition-chain trig computation + +* I can't believe that there isn't a closed form for the omega + array in Rader. + +* convolution problem type(s) + +* Explore the idea of having n < 0 in tensors, possibly to mean + inverse DFT. + +* better estimator: possibly, let "other" cost be coef * n, where + coef is a per-solver constant determined via some big numerical + optimization/fit. + +* vector radix, multidimensional codelets + +* it may be a good idea to unify all those little loops that do + copying, (X[i], X[n-i]) <- (X[i] + X[n-i], X[i] - X[n-i]), + and multiplication of vectors by twiddle factors. + +* Pruned FFTs (basically, a vecloop that skips zeros). + +* Try FFTPACK-style back-and-forth (Stockham) FFT. (We tried this a + few years ago and it was slower, but perhaps matters have changed.) + +* Generate assembly directly for more processors, or maybe fork gcc. =) + +* ensure that threaded solvers generate (block_size % 4 == 0) + to allow SIMD to be used. + +* memoize triggen. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/aclocal.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/aclocal.m4 new file mode 100644 index 000000000..222455bcb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/aclocal.m4 @@ -0,0 +1,1230 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Add --enable-maintainer-mode option to configure. -*- Autoconf -*- +# From Jim Meyering + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAINTAINER_MODE([DEFAULT-MODE]) +# ---------------------------------- +# Control maintainer-specific portions of Makefiles. +# Default is to disable them, unless 'enable' is passed literally. +# For symmetry, 'disable' may be passed as well. Anyway, the user +# can override the default with the --enable/--disable switch. +AC_DEFUN([AM_MAINTAINER_MODE], +[m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl +] +) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# -*- Autoconf -*- +# Obsolete and "removed" macros, that must however still report explicit +# error messages when used, to smooth transition. +# +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +AC_DEFUN([AM_CONFIG_HEADER], +[AC_DIAGNOSE([obsolete], +['$0': this macro is obsolete. +You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl +AC_CONFIG_HEADERS($@)]) + +AC_DEFUN([AM_PROG_CC_STDC], +[AC_PROG_CC +am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc +AC_DIAGNOSE([obsolete], +['$0': this macro is obsolete. +You should simply use the 'AC][_PROG_CC' macro instead. +Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', +but upon 'ac_cv_prog_cc_stdc'.])]) + +AC_DEFUN([AM_C_PROTOTYPES], + [AC_FATAL([automatic de-ANSI-fication support has been removed])]) +AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/acx_mpi.m4]) +m4_include([m4/acx_pthread.m4]) +m4_include([m4/ax_cc_maxopt.m4]) +m4_include([m4/ax_check_compiler_flags.m4]) +m4_include([m4/ax_compiler_vendor.m4]) +m4_include([m4/ax_gcc_aligns_stack.m4]) +m4_include([m4/ax_gcc_version.m4]) +m4_include([m4/ax_openmp.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/Makefile.am new file mode 100644 index 000000000..5cb108203 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/Makefile.am @@ -0,0 +1,59 @@ +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) + +EXTRA_DIST = f03api.sh genf03.pl fftw3.f03.in + +include_HEADERS = fftw3.h fftw3.f fftw3l.f03 fftw3q.f03 +nodist_include_HEADERS = fftw3.f03 +noinst_LTLIBRARIES = libapi.la + +libapi_la_SOURCES = apiplan.c configure.c execute-dft-c2r.c \ +execute-dft-r2c.c execute-dft.c execute-r2r.c execute-split-dft-c2r.c \ +execute-split-dft-r2c.c execute-split-dft.c execute.c \ +export-wisdom-to-file.c export-wisdom-to-string.c export-wisdom.c \ +f77api.c flops.c forget-wisdom.c import-system-wisdom.c \ +import-wisdom-from-file.c import-wisdom-from-string.c import-wisdom.c \ +malloc.c map-r2r-kind.c mapflags.c mkprinter-file.c mkprinter-str.c \ +mktensor-iodims.c mktensor-rowmajor.c plan-dft-1d.c plan-dft-2d.c \ +plan-dft-3d.c plan-dft-c2r-1d.c plan-dft-c2r-2d.c plan-dft-c2r-3d.c \ +plan-dft-c2r.c plan-dft-r2c-1d.c plan-dft-r2c-2d.c plan-dft-r2c-3d.c \ +plan-dft-r2c.c plan-dft.c plan-guru-dft-c2r.c plan-guru-dft-r2c.c \ +plan-guru-dft.c plan-guru-r2r.c plan-guru-split-dft-c2r.c \ +plan-guru-split-dft-r2c.c plan-guru-split-dft.c plan-many-dft-c2r.c \ +plan-many-dft-r2c.c plan-many-dft.c plan-many-r2r.c plan-r2r-1d.c \ +plan-r2r-2d.c plan-r2r-3d.c plan-r2r.c print-plan.c rdft2-pad.c \ +the-planner.c version.c api.h f77funcs.h fftw3.h x77.h guru.h \ +guru64.h mktensor-iodims.h plan-guru-dft-c2r.h plan-guru-dft-r2c.h \ +plan-guru-dft.h plan-guru-r2r.h plan-guru-split-dft-c2r.h \ +plan-guru-split-dft-r2c.h plan-guru-split-dft.h plan-guru64-dft-c2r.c \ +plan-guru64-dft-r2c.c plan-guru64-dft.c plan-guru64-r2r.c \ +plan-guru64-split-dft-c2r.c plan-guru64-split-dft-r2c.c \ +plan-guru64-split-dft.c mktensor-iodims64.c + +BUILT_SOURCES = fftw3.f fftw3.f03.in fftw3.f03 fftw3l.f03 fftw3q.f03 +CLEANFILES = fftw3.f03 + +fftw3.f03: fftw3.f03.in + (echo "! Generated automatically. DO NOT EDIT!"; echo; \ + echo " integer, parameter :: C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@"; \ + grep -v "Generated automatically" $(srcdir)/fftw3.f03.in) > $@ + +if MAINTAINER_MODE + +# convert constants to F77 PARAMETER statements +fftw3.f: fftw3.h + rm -f $@ + perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' > $@ + perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' >> $@ + perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n INTEGER $$1\n PARAMETER ($$1=",$$2 << $$3,")\n"; }' $< |egrep 'PARAMETER|INTEGER' >> $@ + +fftw3.f03.in: fftw3.h f03api.sh genf03.pl + sh $(srcdir)/f03api.sh d f > $@ + +fftw3l.f03: fftw3.h f03api.sh genf03.pl + sh $(srcdir)/f03api.sh l | grep -v parameter > $@ + +fftw3q.f03: fftw3.h f03api.sh genf03.pl + sh $(srcdir)/f03api.sh q | grep -v parameter > $@ + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/Makefile.in new file mode 100644 index 000000000..bf01c48d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/Makefile.in @@ -0,0 +1,846 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = api +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libapi_la_LIBADD = +am_libapi_la_OBJECTS = apiplan.lo configure.lo execute-dft-c2r.lo \ + execute-dft-r2c.lo execute-dft.lo execute-r2r.lo \ + execute-split-dft-c2r.lo execute-split-dft-r2c.lo \ + execute-split-dft.lo execute.lo export-wisdom-to-file.lo \ + export-wisdom-to-string.lo export-wisdom.lo f77api.lo flops.lo \ + forget-wisdom.lo import-system-wisdom.lo \ + import-wisdom-from-file.lo import-wisdom-from-string.lo \ + import-wisdom.lo malloc.lo map-r2r-kind.lo mapflags.lo \ + mkprinter-file.lo mkprinter-str.lo mktensor-iodims.lo \ + mktensor-rowmajor.lo plan-dft-1d.lo plan-dft-2d.lo \ + plan-dft-3d.lo plan-dft-c2r-1d.lo plan-dft-c2r-2d.lo \ + plan-dft-c2r-3d.lo plan-dft-c2r.lo plan-dft-r2c-1d.lo \ + plan-dft-r2c-2d.lo plan-dft-r2c-3d.lo plan-dft-r2c.lo \ + plan-dft.lo plan-guru-dft-c2r.lo plan-guru-dft-r2c.lo \ + plan-guru-dft.lo plan-guru-r2r.lo plan-guru-split-dft-c2r.lo \ + plan-guru-split-dft-r2c.lo plan-guru-split-dft.lo \ + plan-many-dft-c2r.lo plan-many-dft-r2c.lo plan-many-dft.lo \ + plan-many-r2r.lo plan-r2r-1d.lo plan-r2r-2d.lo plan-r2r-3d.lo \ + plan-r2r.lo print-plan.lo rdft2-pad.lo the-planner.lo \ + version.lo plan-guru64-dft-c2r.lo plan-guru64-dft-r2c.lo \ + plan-guru64-dft.lo plan-guru64-r2r.lo \ + plan-guru64-split-dft-c2r.lo plan-guru64-split-dft-r2c.lo \ + plan-guru64-split-dft.lo mktensor-iodims64.lo +libapi_la_OBJECTS = $(am_libapi_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libapi_la_SOURCES) +DIST_SOURCES = $(libapi_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) +EXTRA_DIST = f03api.sh genf03.pl fftw3.f03.in +include_HEADERS = fftw3.h fftw3.f fftw3l.f03 fftw3q.f03 +nodist_include_HEADERS = fftw3.f03 +noinst_LTLIBRARIES = libapi.la +libapi_la_SOURCES = apiplan.c configure.c execute-dft-c2r.c \ +execute-dft-r2c.c execute-dft.c execute-r2r.c execute-split-dft-c2r.c \ +execute-split-dft-r2c.c execute-split-dft.c execute.c \ +export-wisdom-to-file.c export-wisdom-to-string.c export-wisdom.c \ +f77api.c flops.c forget-wisdom.c import-system-wisdom.c \ +import-wisdom-from-file.c import-wisdom-from-string.c import-wisdom.c \ +malloc.c map-r2r-kind.c mapflags.c mkprinter-file.c mkprinter-str.c \ +mktensor-iodims.c mktensor-rowmajor.c plan-dft-1d.c plan-dft-2d.c \ +plan-dft-3d.c plan-dft-c2r-1d.c plan-dft-c2r-2d.c plan-dft-c2r-3d.c \ +plan-dft-c2r.c plan-dft-r2c-1d.c plan-dft-r2c-2d.c plan-dft-r2c-3d.c \ +plan-dft-r2c.c plan-dft.c plan-guru-dft-c2r.c plan-guru-dft-r2c.c \ +plan-guru-dft.c plan-guru-r2r.c plan-guru-split-dft-c2r.c \ +plan-guru-split-dft-r2c.c plan-guru-split-dft.c plan-many-dft-c2r.c \ +plan-many-dft-r2c.c plan-many-dft.c plan-many-r2r.c plan-r2r-1d.c \ +plan-r2r-2d.c plan-r2r-3d.c plan-r2r.c print-plan.c rdft2-pad.c \ +the-planner.c version.c api.h f77funcs.h fftw3.h x77.h guru.h \ +guru64.h mktensor-iodims.h plan-guru-dft-c2r.h plan-guru-dft-r2c.h \ +plan-guru-dft.h plan-guru-r2r.h plan-guru-split-dft-c2r.h \ +plan-guru-split-dft-r2c.h plan-guru-split-dft.h plan-guru64-dft-c2r.c \ +plan-guru64-dft-r2c.c plan-guru64-dft.c plan-guru64-r2r.c \ +plan-guru64-split-dft-c2r.c plan-guru64-split-dft-r2c.c \ +plan-guru64-split-dft.c mktensor-iodims64.c + +BUILT_SOURCES = fftw3.f fftw3.f03.in fftw3.f03 fftw3l.f03 fftw3q.f03 +CLEANFILES = fftw3.f03 +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu api/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu api/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libapi.la: $(libapi_la_OBJECTS) $(libapi_la_DEPENDENCIES) $(EXTRA_libapi_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libapi_la_OBJECTS) $(libapi_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apiplan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/configure.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-split-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-split-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute-split-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export-wisdom-to-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export-wisdom-to-string.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f77api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flops.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forget-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-system-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-wisdom-from-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-wisdom-from-string.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import-wisdom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map-r2r-kind.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapflags.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkprinter-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkprinter-str.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktensor-iodims.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktensor-iodims64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktensor-rowmajor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-split-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-split-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru-split-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-split-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-split-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-guru64-split-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-dft-c2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-dft-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-dft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-many-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r-1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r-2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r-3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-plan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-pad.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/the-planner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS install-nodist_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS uninstall-nodist_includeHEADERS + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includeHEADERS install-info install-info-am \ + install-man install-nodist_includeHEADERS install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile + + +fftw3.f03: fftw3.f03.in + (echo "! Generated automatically. DO NOT EDIT!"; echo; \ + echo " integer, parameter :: C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@"; \ + grep -v "Generated automatically" $(srcdir)/fftw3.f03.in) > $@ + +# convert constants to F77 PARAMETER statements +@MAINTAINER_MODE_TRUE@fftw3.f: fftw3.h +@MAINTAINER_MODE_TRUE@ rm -f $@ +@MAINTAINER_MODE_TRUE@ perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' > $@ +@MAINTAINER_MODE_TRUE@ perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n INTEGER \1\n PARAMETER (\1=\2)\n/g' $< |egrep 'PARAMETER|INTEGER' >> $@ +@MAINTAINER_MODE_TRUE@ perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n INTEGER $$1\n PARAMETER ($$1=",$$2 << $$3,")\n"; }' $< |egrep 'PARAMETER|INTEGER' >> $@ + +@MAINTAINER_MODE_TRUE@fftw3.f03.in: fftw3.h f03api.sh genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh d f > $@ + +@MAINTAINER_MODE_TRUE@fftw3l.f03: fftw3.h f03api.sh genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh l | grep -v parameter > $@ + +@MAINTAINER_MODE_TRUE@fftw3q.f03: fftw3.h f03api.sh genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh q | grep -v parameter > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/api.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/api.h new file mode 100644 index 000000000..e3e94ddd1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/api.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* internal API definitions */ +#ifndef __API_H__ +#define __API_H__ + +#ifndef CALLING_FFTW /* defined in hook.c, when calling internal functions */ +# define COMPILING_FFTW /* used for DLL symbol exporting in fftw3.h */ +#endif + +/* When compiling with GNU libtool on Windows, DLL_EXPORT is #defined + for compiling the shared-library code. In this case, we'll #define + FFTW_DLL to add dllexport attributes to the specified functions in + fftw3.h. + + If we don't specify dllexport explicitly, then libtool + automatically exports all symbols. However, if we specify + dllexport explicitly for any functions, then libtool apparently + doesn't do any automatic exporting. (Not documented, grrr, but + this is the observed behavior with libtool 1.5.8.) Thus, using + this forces us to correctly dllexport every exported symbol, or + linking bench.exe will fail. This has the advantage of forcing + us to mark things correctly, which is necessary for other compilers + (such as MS VC++). */ +#ifdef DLL_EXPORT +# define FFTW_DLL +#endif + +/* just in case: force not to use C99 complex numbers + (we need this for IBM xlc because _Complex_I is treated specially + and is defined even if is not included) */ +#define FFTW_NO_Complex + +#include "api/fftw3.h" +#include "kernel/ifftw.h" +#include "rdft/rdft.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* the API ``plan'' contains both the kernel plan and problem */ +struct X(plan_s) { + plan *pln; + problem *prb; + int sign; +}; + +/* shorthand */ +typedef struct X(plan_s) apiplan; + +/* complex type for internal use */ +typedef R C[2]; + +#define EXTRACT_REIM(sign, c, r, i) X(extract_reim)(sign, (c)[0], r, i) + +#define TAINT_UNALIGNED(p, flg) TAINT(p, ((flg) & FFTW_UNALIGNED) != 0) + +tensor *X(mktensor_rowmajor)(int rnk, const int *n, + const int *niphys, const int *nophys, + int is, int os); + +tensor *X(mktensor_iodims)(int rank, const X(iodim) *dims, int is, int os); +tensor *X(mktensor_iodims64)(int rank, const X(iodim64) *dims, int is, int os); +const int *X(rdft2_pad)(int rnk, const int *n, const int *nembed, + int inplace, int cmplx, int **nfree); + +int X(many_kosherp)(int rnk, const int *n, int howmany); +int X(guru_kosherp)(int rank, const X(iodim) *dims, + int howmany_rank, const X(iodim) *howmany_dims); +int X(guru64_kosherp)(int rank, const X(iodim64) *dims, + int howmany_rank, const X(iodim64) *howmany_dims); + +/* Note: FFTW_EXTERN is used for "internal" functions used in tests/hook.c */ + +FFTW_EXTERN printer *X(mkprinter_file)(FILE *f); + +printer *X(mkprinter_cnt)(size_t *cnt); +printer *X(mkprinter_str)(char *s); + +FFTW_EXTERN planner *X(the_planner)(void); +void X(configure_planner)(planner *plnr); + +void X(mapflags)(planner *, unsigned); + +apiplan *X(mkapiplan)(int sign, unsigned flags, problem *prb); + +rdft_kind *X(map_r2r_kind)(int rank, const X(r2r_kind) * kind); + +typedef void (*planner_hook_t)(void); + +void X(set_planner_hooks)(planner_hook_t before, planner_hook_t after); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __API_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/apiplan.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/apiplan.c new file mode 100644 index 000000000..b8642a93e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/apiplan.c @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +static planner_hook_t before_planner_hook = 0, after_planner_hook = 0; + +void X(set_planner_hooks)(planner_hook_t before, planner_hook_t after) +{ + before_planner_hook = before; + after_planner_hook = after; +} + +static plan *mkplan0(planner *plnr, unsigned flags, + const problem *prb, unsigned hash_info, + wisdom_state_t wisdom_state) +{ + /* map API flags into FFTW flags */ + X(mapflags)(plnr, flags); + + plnr->flags.hash_info = hash_info; + plnr->wisdom_state = wisdom_state; + + /* create plan */ + return plnr->adt->mkplan(plnr, prb); +} + +static unsigned force_estimator(unsigned flags) +{ + flags &= ~(FFTW_MEASURE | FFTW_PATIENT | FFTW_EXHAUSTIVE); + return (flags | FFTW_ESTIMATE); +} + +static plan *mkplan(planner *plnr, unsigned flags, + const problem *prb, unsigned hash_info) +{ + plan *pln; + + pln = mkplan0(plnr, flags, prb, hash_info, WISDOM_NORMAL); + + if (plnr->wisdom_state == WISDOM_NORMAL && !pln) { + /* maybe the planner failed because of inconsistent wisdom; + plan again ignoring infeasible wisdom */ + pln = mkplan0(plnr, force_estimator(flags), prb, + hash_info, WISDOM_IGNORE_INFEASIBLE); + } + + if (plnr->wisdom_state == WISDOM_IS_BOGUS) { + /* if the planner detected a wisdom inconsistency, + forget all wisdom and plan again */ + plnr->adt->forget(plnr, FORGET_EVERYTHING); + + A(!pln); + pln = mkplan0(plnr, flags, prb, hash_info, WISDOM_NORMAL); + + if (plnr->wisdom_state == WISDOM_IS_BOGUS) { + /* if it still fails, plan without wisdom */ + plnr->adt->forget(plnr, FORGET_EVERYTHING); + + A(!pln); + pln = mkplan0(plnr, force_estimator(flags), + prb, hash_info, WISDOM_IGNORE_ALL); + } + } + + return pln; +} + +apiplan *X(mkapiplan)(int sign, unsigned flags, problem *prb) +{ + apiplan *p = 0; + plan *pln; + unsigned flags_used_for_planning; + planner *plnr; + static const unsigned int pats[] = {FFTW_ESTIMATE, FFTW_MEASURE, + FFTW_PATIENT, FFTW_EXHAUSTIVE}; + int pat, pat_max; + double pcost = 0; + + if (before_planner_hook) + before_planner_hook(); + + plnr = X(the_planner)(); + + if (flags & FFTW_WISDOM_ONLY) { + /* Special mode that returns a plan only if wisdom is present, + and returns 0 otherwise. This is now documented in the manual, + as a way to detect whether wisdom is available for a problem. */ + flags_used_for_planning = flags; + pln = mkplan0(plnr, flags, prb, 0, WISDOM_ONLY); + } else { + pat_max = flags & FFTW_ESTIMATE ? 0 : + (flags & FFTW_EXHAUSTIVE ? 3 : + (flags & FFTW_PATIENT ? 2 : 1)); + pat = plnr->timelimit >= 0 ? 0 : pat_max; + + flags &= ~(FFTW_ESTIMATE | FFTW_MEASURE | + FFTW_PATIENT | FFTW_EXHAUSTIVE); + + plnr->start_time = X(get_crude_time)(); + + /* plan at incrementally increasing patience until we run + out of time */ + for (pln = 0, flags_used_for_planning = 0; pat <= pat_max; ++pat) { + plan *pln1; + unsigned tmpflags = flags | pats[pat]; + pln1 = mkplan(plnr, tmpflags, prb, 0u); + + if (!pln1) { + /* don't bother continuing if planner failed or timed out */ + A(!pln || plnr->timed_out); + break; + } + + X(plan_destroy_internal)(pln); + pln = pln1; + flags_used_for_planning = tmpflags; + pcost = pln->pcost; + } + } + + if (pln) { + /* build apiplan */ + p = (apiplan *) MALLOC(sizeof(apiplan), PLANS); + p->prb = prb; + p->sign = sign; /* cache for execute_dft */ + + /* re-create plan from wisdom, adding blessing */ + p->pln = mkplan(plnr, flags_used_for_planning, prb, BLESSING); + + /* record pcost from most recent measurement for use in X(cost) */ + p->pln->pcost = pcost; + + if (sizeof(trigreal) > sizeof(R)) { + /* this is probably faster, and we have enough trigreal + bits to maintain accuracy */ + X(plan_awake)(p->pln, AWAKE_SQRTN_TABLE); + } else { + /* more accurate */ + X(plan_awake)(p->pln, AWAKE_SINCOS); + } + + /* we don't use pln for p->pln, above, since by re-creating the + plan we might use more patient wisdom from a timed-out mkplan */ + X(plan_destroy_internal)(pln); + } else + X(problem_destroy)(prb); + + /* discard all information not necessary to reconstruct the plan */ + plnr->adt->forget(plnr, FORGET_ACCURSED); + +#ifdef FFTW_RANDOM_ESTIMATOR + X(random_estimate_seed)++; /* subsequent "random" plans are distinct */ +#endif + + if (after_planner_hook) + after_planner_hook(); + + return p; +} + +void X(destroy_plan)(X(plan) p) +{ + if (p) { + if (before_planner_hook) + before_planner_hook(); + + X(plan_awake)(p->pln, SLEEPY); + X(plan_destroy_internal)(p->pln); + X(problem_destroy)(p->prb); + X(ifree)(p); + + if (after_planner_hook) + after_planner_hook(); + } +} + +int X(alignment_of)(R *p) +{ + return X(ialignment_of(p)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/configure.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/configure.c new file mode 100644 index 000000000..08b074cd1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/configure.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" +#include "rdft/rdft.h" +#include "reodft/reodft.h" + +void X(configure_planner)(planner *plnr) +{ + X(dft_conf_standard)(plnr); + X(rdft_conf_standard)(plnr); + X(reodft_conf_standard)(plnr); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft-c2r.c new file mode 100644 index 000000000..436cfeaab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft-c2r.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_dft_c2r)(const X(plan) p, C *in, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), in[0], in[0]+1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft-r2c.c new file mode 100644 index 000000000..0ba2c1884 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft-r2c.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_dft_r2c)(const X(plan) p, R *in, C *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), out[0], out[0]+1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft.c new file mode 100644 index 000000000..56e3afe86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-dft.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +/* guru interface: requires care in alignment etcetera. */ +void X(execute_dft)(const X(plan) p, C *in, C *out) +{ + plan_dft *pln = (plan_dft *) p->pln; + if (p->sign == FFT_SIGN) + pln->apply((plan *) pln, in[0], in[0]+1, out[0], out[0]+1); + else + pln->apply((plan *) pln, in[0]+1, in[0], out[0]+1, out[0]); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-r2r.c new file mode 100644 index 000000000..2f9beab86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-r2r.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, etcetera. */ +void X(execute_r2r)(const X(plan) p, R *in, R *out) +{ + plan_rdft *pln = (plan_rdft *) p->pln; + pln->apply((plan *) pln, in, out); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft-c2r.c new file mode 100644 index 000000000..f44e00261 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft-c2r.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_split_dft_c2r)(const X(plan) p, R *ri, R *ii, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), ri, ii); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft-r2c.c new file mode 100644 index 000000000..d8f0d6276 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft-r2c.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_split_dft_r2c)(const X(plan) p, R *in, R *ro, R *io) +{ + plan_rdft2 *pln = (plan_rdft2 *) p->pln; + problem_rdft2 *prb = (problem_rdft2 *) p->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), ro, io); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft.c new file mode 100644 index 000000000..819b9f4e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute-split-dft.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +/* guru interface: requires care in alignment, r - i, etcetera. */ +void X(execute_split_dft)(const X(plan) p, R *ri, R *ii, R *ro, R *io) +{ + plan_dft *pln = (plan_dft *) p->pln; + pln->apply((plan *) pln, ri, ii, ro, io); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute.c new file mode 100644 index 000000000..079b8aad6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/execute.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(execute)(const X(plan) p) +{ + plan *pln = p->pln; + pln->adt->solve(pln, p->prb); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom-to-file.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom-to-file.c new file mode 100644 index 000000000..39dcbaa20 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom-to-file.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(export_wisdom_to_file)(FILE *output_file) +{ + printer *p = X(mkprinter_file)(output_file); + planner *plnr = X(the_planner)(); + plnr->adt->exprt(plnr, p); + X(printer_destroy)(p); +} + +int X(export_wisdom_to_filename)(const char *filename) +{ + FILE *f = fopen(filename, "w"); + int ret; + if (!f) return 0; /* error opening file */ + X(export_wisdom_to_file)(f); + ret = !ferror(f); + if (fclose(f)) ret = 0; /* error closing file */ + return ret; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom-to-string.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom-to-string.c new file mode 100644 index 000000000..f1fe7ab68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom-to-string.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +char *X(export_wisdom_to_string)(void) +{ + printer *p; + planner *plnr = X(the_planner)(); + size_t cnt; + char *s; + + p = X(mkprinter_cnt)(&cnt); + plnr->adt->exprt(plnr, p); + X(printer_destroy)(p); + + s = (char *) malloc(sizeof(char) * (cnt + 1)); + if (s) { + p = X(mkprinter_str)(s); + plnr->adt->exprt(plnr, p); + X(printer_destroy)(p); + } + + return s; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom.c new file mode 100644 index 000000000..baa2f35bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/export-wisdom.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + printer super; + void (*write_char)(char c, void *); + void *data; +} P; + +static void putchr_generic(printer * p_, char c) +{ + P *p = (P *) p_; + (p->write_char)(c, p->data); +} + +void X(export_wisdom)(void (*write_char)(char c, void *), void *data) +{ + P *p = (P *) X(mkprinter)(sizeof(P), putchr_generic, 0); + planner *plnr = X(the_planner)(); + + p->write_char = write_char; + p->data = data; + plnr->adt->exprt(plnr, (printer *) p); + X(printer_destroy)((printer *) p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/f03api.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/f03api.sh new file mode 100755 index 000000000..caaacafe7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/f03api.sh @@ -0,0 +1,42 @@ +#! /bin/sh + +# Script to generate Fortran 2003 interface declarations for FFTW from +# the fftw3.h header file. + +# This is designed so that the Fortran caller can do: +# use, intrinsic :: iso_c_binding +# implicit none +# include 'fftw3.f03' +# and then call the C FFTW functions directly, with type checking. + +echo "! Generated automatically. DO NOT EDIT!" +echo + +# C_FFTW_R2R_KIND is determined by configure and inserted by the Makefile +# echo " integer, parameter :: C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@" + +# Extract constants +perl -pe 's/([A-Z0-9_]+)=([+-]?[0-9]+)/\n integer\(C_INT\), parameter :: \1 = \2\n/g' < fftw3.h | grep 'integer(C_INT)' +perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n integer\(C_INT\), parameter :: \1 = \2\n/g' < fftw3.h | grep 'integer(C_INT)' +perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n integer\(C_INT\), parameter :: $1 = ",$2 << $3,"\n"; }' < fftw3.h | grep 'integer(C_INT)' + +# Extract function declarations +for p in $*; do + if test "$p" = "d"; then p=""; fi + + echo + cat <f77_write_char(&c, ad->data); +} + +typedef struct { + void (*f77_read_char)(int *, void *); + void *data; +} read_char_data; + +static int read_char(void *d) +{ + read_char_data *ed = (read_char_data *) d; + int c; + ed->f77_read_char(&c, ed->data); + return (c < 0 ? EOF : c); +} + +static X(r2r_kind) *ints2kinds(int rnk, const int *ik) +{ + if (!FINITE_RNK(rnk) || rnk == 0) + return 0; + else { + int i; + X(r2r_kind) *k; + + k = (X(r2r_kind) *) MALLOC(sizeof(X(r2r_kind)) * (unsigned)rnk, PROBLEMS); + /* reverse order for Fortran -> C */ + for (i = 0; i < rnk; ++i) + k[i] = (X(r2r_kind)) ik[rnk - 1 - i]; + return k; + } +} + +/*-----------------------------------------------------------------------*/ + +#define F77(a, A) F77x(x77(a), X77(A)) + +#ifndef WINDOWS_F77_MANGLING + +#if defined(F77_FUNC) +# define F77x(a, A) F77_FUNC(a, A) +# include "f77funcs.h" +#endif + +/* If identifiers with underscores are mangled differently than those + without underscores, then we include *both* mangling versions. The + reason is that the only Fortran compiler that does such differing + mangling is currently g77 (which adds an extra underscore to names + with underscores), whereas other compilers running on the same + machine are likely to use non-underscored mangling. (I'm sick + of users complaining that FFTW works with g77 but not with e.g. + pgf77 or ifc on the same machine.) Note that all FFTW identifiers + contain underscores, and configure picks g77 by default. */ +#if defined(F77_FUNC_) && !defined(F77_FUNC_EQUIV) +# undef F77x +# define F77x(a, A) F77_FUNC_(a, A) +# include "f77funcs.h" +#endif + +#else /* WINDOWS_F77_MANGLING */ + +/* Various mangling conventions common (?) under Windows. */ + +/* g77 */ +# define WINDOWS_F77_FUNC(a, A) a ## __ +# define F77x(a, A) WINDOWS_F77_FUNC(a, A) +# include "f77funcs.h" + +/* Intel, etc. */ +# undef WINDOWS_F77_FUNC +# define WINDOWS_F77_FUNC(a, A) a ## _ +# include "f77funcs.h" + +/* Digital/Compaq/HP Visual Fortran, Intel Fortran. stdcall attribute + is apparently required to adjust for calling conventions (callee + pops stack in stdcall). See also: + http://msdn.microsoft.com/library/en-us/vccore98/html/_core_mixed.2d.language_programming.3a_.overview.asp +*/ +# undef WINDOWS_F77_FUNC +# if defined(__GNUC__) +# define WINDOWS_F77_FUNC(a, A) __attribute__((stdcall)) A +# elif defined(_MSC_VER) || defined(_ICC) || defined(_STDCALL_SUPPORTED) +# define WINDOWS_F77_FUNC(a, A) __stdcall A +# else +# define WINDOWS_F77_FUNC(a, A) A /* oh well */ +# endif +# include "f77funcs.h" + +#endif /* WINDOWS_F77_MANGLING */ + +#endif /* F77_FUNC */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/f77funcs.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/f77funcs.h new file mode 100644 index 000000000..1e557dc1e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/f77funcs.h @@ -0,0 +1,458 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Functions in the FFTW Fortran API, mangled according to the + F77(...) macro. This file is designed to be #included by + f77api.c, possibly multiple times in order to support multiple + compiler manglings (via redefinition of F77). */ + +FFTW_VOIDFUNC F77(execute, EXECUTE)(X(plan) * const p) +{ + plan *pln = (*p)->pln; + pln->adt->solve(pln, (*p)->prb); +} + +FFTW_VOIDFUNC F77(destroy_plan, DESTROY_PLAN)(X(plan) *p) +{ + X(destroy_plan)(*p); +} + +FFTW_VOIDFUNC F77(cleanup, CLEANUP)(void) +{ + X(cleanup)(); +} + +FFTW_VOIDFUNC F77(forget_wisdom, FORGET_WISDOM)(void) +{ + X(forget_wisdom)(); +} + +FFTW_VOIDFUNC F77(export_wisdom, EXPORT_WISDOM)(void (*f77_write_char)(char *, void *), + void *data) +{ + write_char_data ad; + ad.f77_write_char = f77_write_char; + ad.data = data; + X(export_wisdom)(write_char, (void *) &ad); +} + +FFTW_VOIDFUNC F77(import_wisdom, IMPORT_WISDOM)(int *isuccess, + void (*f77_read_char)(int *, void *), + void *data) +{ + read_char_data ed; + ed.f77_read_char = f77_read_char; + ed.data = data; + *isuccess = X(import_wisdom)(read_char, (void *) &ed); +} + +FFTW_VOIDFUNC F77(import_system_wisdom, IMPORT_SYSTEM_WISDOM)(int *isuccess) +{ + *isuccess = X(import_system_wisdom)(); +} + +FFTW_VOIDFUNC F77(print_plan, PRINT_PLAN)(X(plan) * const p) +{ + X(print_plan)(*p); + fflush(stdout); +} + +FFTW_VOIDFUNC F77(flops,FLOPS)(X(plan) *p, double *add, double *mul, double *fma) +{ + X(flops)(*p, add, mul, fma); +} + +FFTW_VOIDFUNC F77(estimate_cost,ESTIMATE_COST)(double *cost, X(plan) * const p) +{ + *cost = X(estimate_cost)(*p); +} + +FFTW_VOIDFUNC F77(cost,COST)(double *cost, X(plan) * const p) +{ + *cost = X(cost)(*p); +} + +FFTW_VOIDFUNC F77(set_timelimit,SET_TIMELIMIT)(double *t) +{ + X(set_timelimit)(*t); +} + +/******************************** DFT ***********************************/ + +FFTW_VOIDFUNC F77(plan_dft, PLAN_DFT)(X(plan) *p, int *rank, const int *n, + C *in, C *out, int *sign, int *flags) +{ + int *nrev = reverse_n(*rank, n); + *p = X(plan_dft)(*rank, nrev, in, out, *sign, *flags); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_dft_1d, PLAN_DFT_1D)(X(plan) *p, int *n, C *in, C *out, + int *sign, int *flags) +{ + *p = X(plan_dft_1d)(*n, in, out, *sign, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_2d, PLAN_DFT_2D)(X(plan) *p, int *nx, int *ny, + C *in, C *out, int *sign, int *flags) +{ + *p = X(plan_dft_2d)(*ny, *nx, in, out, *sign, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_3d, PLAN_DFT_3D)(X(plan) *p, int *nx, int *ny, int *nz, + C *in, C *out, + int *sign, int *flags) +{ + *p = X(plan_dft_3d)(*nz, *ny, *nx, in, out, *sign, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_dft, PLAN_MANY_DFT)(X(plan) *p, int *rank, const int *n, + int *howmany, + C *in, const int *inembed, + int *istride, int *idist, + C *out, const int *onembed, + int *ostride, int *odist, + int *sign, int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + *p = X(plan_many_dft)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + *sign, *flags); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_dft, PLAN_GURU_DFT)(X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + C *in, C *out, int *sign, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_dft)(*rank, dims, *howmany_rank, howmany_dims, + in, out, *sign, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(plan_guru_split_dft, PLAN_GURU_SPLIT_DFT)(X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *ri, R *ii, R *ro, R *io, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_split_dft)(*rank, dims, *howmany_rank, howmany_dims, + ri, ii, ro, io, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_dft, EXECUTE_DFT)(X(plan) * const p, C *in, C *out) +{ + plan_dft *pln = (plan_dft *) (*p)->pln; + if ((*p)->sign == FFT_SIGN) + pln->apply((plan *) pln, in[0], in[0]+1, out[0], out[0]+1); + else + pln->apply((plan *) pln, in[0]+1, in[0], out[0]+1, out[0]); +} + +FFTW_VOIDFUNC F77(execute_split_dft, EXECUTE_SPLIT_DFT)(X(plan) * const p, + R *ri, R *ii, R *ro, R *io) +{ + plan_dft *pln = (plan_dft *) (*p)->pln; + pln->apply((plan *) pln, ri, ii, ro, io); +} + +/****************************** DFT r2c *********************************/ + +FFTW_VOIDFUNC F77(plan_dft_r2c, PLAN_DFT_R2C)(X(plan) *p, int *rank, const int *n, + R *in, C *out, int *flags) +{ + int *nrev = reverse_n(*rank, n); + *p = X(plan_dft_r2c)(*rank, nrev, in, out, *flags); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_dft_r2c_1d, PLAN_DFT_R2C_1D)(X(plan) *p, int *n, R *in, C *out, + int *flags) +{ + *p = X(plan_dft_r2c_1d)(*n, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_r2c_2d, PLAN_DFT_R2C_2D)(X(plan) *p, int *nx, int *ny, + R *in, C *out, int *flags) +{ + *p = X(plan_dft_r2c_2d)(*ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_r2c_3d, PLAN_DFT_R2C_3D)(X(plan) *p, + int *nx, int *ny, int *nz, + R *in, C *out, + int *flags) +{ + *p = X(plan_dft_r2c_3d)(*nz, *ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_dft_r2c, PLAN_MANY_DFT_R2C)( + X(plan) *p, int *rank, const int *n, + int *howmany, + R *in, const int *inembed, int *istride, int *idist, + C *out, const int *onembed, int *ostride, int *odist, + int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + *p = X(plan_many_dft_r2c)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + *flags); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_dft_r2c, PLAN_GURU_DFT_R2C)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *in, C *out, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_dft_r2c)(*rank, dims, *howmany_rank, howmany_dims, + in, out, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(plan_guru_split_dft_r2c, PLAN_GURU_SPLIT_DFT_R2C)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *in, R *ro, R *io, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_split_dft_r2c)(*rank, dims, *howmany_rank, howmany_dims, + in, ro, io, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_dft_r2c, EXECUTE_DFT_R2C)(X(plan) * const p, R *in, C *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), out[0], out[0]+1); +} + +FFTW_VOIDFUNC F77(execute_split_dft_r2c, EXECUTE_SPLIT_DFT_R2C)(X(plan) * const p, + R *in, R *ro, R *io) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, in, in + (prb->r1 - prb->r0), ro, io); +} + +/****************************** DFT c2r *********************************/ + +FFTW_VOIDFUNC F77(plan_dft_c2r, PLAN_DFT_C2R)(X(plan) *p, int *rank, const int *n, + C *in, R *out, int *flags) +{ + int *nrev = reverse_n(*rank, n); + *p = X(plan_dft_c2r)(*rank, nrev, in, out, *flags); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_dft_c2r_1d, PLAN_DFT_C2R_1D)(X(plan) *p, int *n, C *in, R *out, + int *flags) +{ + *p = X(plan_dft_c2r_1d)(*n, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_c2r_2d, PLAN_DFT_C2R_2D)(X(plan) *p, int *nx, int *ny, + C *in, R *out, int *flags) +{ + *p = X(plan_dft_c2r_2d)(*ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_dft_c2r_3d, PLAN_DFT_C2R_3D)(X(plan) *p, + int *nx, int *ny, int *nz, + C *in, R *out, + int *flags) +{ + *p = X(plan_dft_c2r_3d)(*nz, *ny, *nx, in, out, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_dft_c2r, PLAN_MANY_DFT_C2R)( + X(plan) *p, int *rank, const int *n, + int *howmany, + C *in, const int *inembed, int *istride, int *idist, + R *out, const int *onembed, int *ostride, int *odist, + int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + *p = X(plan_many_dft_c2r)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + *flags); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_dft_c2r, PLAN_GURU_DFT_C2R)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + C *in, R *out, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_dft_c2r)(*rank, dims, *howmany_rank, howmany_dims, + in, out, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(plan_guru_split_dft_c2r, PLAN_GURU_SPLIT_DFT_C2R)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *ri, R *ii, R *out, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + *p = X(plan_guru_split_dft_c2r)(*rank, dims, *howmany_rank, howmany_dims, + ri, ii, out, *flags); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_dft_c2r, EXECUTE_DFT_C2R)(X(plan) * const p, C *in, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), in[0], in[0]+1); +} + +FFTW_VOIDFUNC F77(execute_split_dft_c2r, EXECUTE_SPLIT_DFT_C2R)(X(plan) * const p, + R *ri, R *ii, R *out) +{ + plan_rdft2 *pln = (plan_rdft2 *) (*p)->pln; + problem_rdft2 *prb = (problem_rdft2 *) (*p)->prb; + pln->apply((plan *) pln, out, out + (prb->r1 - prb->r0), ri, ii); +} + +/****************************** r2r *********************************/ + +FFTW_VOIDFUNC F77(plan_r2r, PLAN_R2R)(X(plan) *p, int *rank, const int *n, + R *in, R *out, + int *kind, int *flags) +{ + int *nrev = reverse_n(*rank, n); + X(r2r_kind) *k = ints2kinds(*rank, kind); + *p = X(plan_r2r)(*rank, nrev, in, out, k, *flags); + X(ifree0)(k); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_r2r_1d, PLAN_R2R_1D)(X(plan) *p, int *n, R *in, R *out, + int *kind, int *flags) +{ + *p = X(plan_r2r_1d)(*n, in, out, (X(r2r_kind)) *kind, *flags); +} + +FFTW_VOIDFUNC F77(plan_r2r_2d, PLAN_R2R_2D)(X(plan) *p, int *nx, int *ny, + R *in, R *out, + int *kindx, int *kindy, int *flags) +{ + *p = X(plan_r2r_2d)(*ny, *nx, in, out, + (X(r2r_kind)) *kindy, (X(r2r_kind)) *kindx, *flags); +} + +FFTW_VOIDFUNC F77(plan_r2r_3d, PLAN_R2R_3D)(X(plan) *p, + int *nx, int *ny, int *nz, + R *in, R *out, + int *kindx, int *kindy, int *kindz, + int *flags) +{ + *p = X(plan_r2r_3d)(*nz, *ny, *nx, in, out, + (X(r2r_kind)) *kindz, (X(r2r_kind)) *kindy, + (X(r2r_kind)) *kindx, *flags); +} + +FFTW_VOIDFUNC F77(plan_many_r2r, PLAN_MANY_R2R)( + X(plan) *p, int *rank, const int *n, + int *howmany, + R *in, const int *inembed, int *istride, int *idist, + R *out, const int *onembed, int *ostride, int *odist, + int *kind, int *flags) +{ + int *nrev = reverse_n(*rank, n); + int *inembedrev = reverse_n(*rank, inembed); + int *onembedrev = reverse_n(*rank, onembed); + X(r2r_kind) *k = ints2kinds(*rank, kind); + *p = X(plan_many_r2r)(*rank, nrev, *howmany, + in, inembedrev, *istride, *idist, + out, onembedrev, *ostride, *odist, + k, *flags); + X(ifree0)(k); + X(ifree0)(onembedrev); + X(ifree0)(inembedrev); + X(ifree0)(nrev); +} + +FFTW_VOIDFUNC F77(plan_guru_r2r, PLAN_GURU_R2R)( + X(plan) *p, int *rank, const int *n, + const int *is, const int *os, + int *howmany_rank, const int *h_n, + const int *h_is, const int *h_os, + R *in, R *out, int *kind, int *flags) +{ + X(iodim) *dims = make_dims(*rank, n, is, os); + X(iodim) *howmany_dims = make_dims(*howmany_rank, h_n, h_is, h_os); + X(r2r_kind) *k = ints2kinds(*rank, kind); + *p = X(plan_guru_r2r)(*rank, dims, *howmany_rank, howmany_dims, + in, out, k, *flags); + X(ifree0)(k); + X(ifree0)(howmany_dims); + X(ifree0)(dims); +} + +FFTW_VOIDFUNC F77(execute_r2r, EXECUTE_R2R)(X(plan) * const p, R *in, R *out) +{ + plan_rdft *pln = (plan_rdft *) (*p)->pln; + pln->apply((plan *) pln, in, out); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.f new file mode 100644 index 000000000..72d1aaf2a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.f @@ -0,0 +1,72 @@ + INTEGER FFTW_R2HC + PARAMETER (FFTW_R2HC=0) + INTEGER FFTW_HC2R + PARAMETER (FFTW_HC2R=1) + INTEGER FFTW_DHT + PARAMETER (FFTW_DHT=2) + INTEGER FFTW_REDFT00 + PARAMETER (FFTW_REDFT00=3) + INTEGER FFTW_REDFT01 + PARAMETER (FFTW_REDFT01=4) + INTEGER FFTW_REDFT10 + PARAMETER (FFTW_REDFT10=5) + INTEGER FFTW_REDFT11 + PARAMETER (FFTW_REDFT11=6) + INTEGER FFTW_RODFT00 + PARAMETER (FFTW_RODFT00=7) + INTEGER FFTW_RODFT01 + PARAMETER (FFTW_RODFT01=8) + INTEGER FFTW_RODFT10 + PARAMETER (FFTW_RODFT10=9) + INTEGER FFTW_RODFT11 + PARAMETER (FFTW_RODFT11=10) + INTEGER FFTW_FORWARD + PARAMETER (FFTW_FORWARD=-1) + INTEGER FFTW_BACKWARD + PARAMETER (FFTW_BACKWARD=+1) + INTEGER FFTW_MEASURE + PARAMETER (FFTW_MEASURE=0) + INTEGER FFTW_DESTROY_INPUT + PARAMETER (FFTW_DESTROY_INPUT=1) + INTEGER FFTW_UNALIGNED + PARAMETER (FFTW_UNALIGNED=2) + INTEGER FFTW_CONSERVE_MEMORY + PARAMETER (FFTW_CONSERVE_MEMORY=4) + INTEGER FFTW_EXHAUSTIVE + PARAMETER (FFTW_EXHAUSTIVE=8) + INTEGER FFTW_PRESERVE_INPUT + PARAMETER (FFTW_PRESERVE_INPUT=16) + INTEGER FFTW_PATIENT + PARAMETER (FFTW_PATIENT=32) + INTEGER FFTW_ESTIMATE + PARAMETER (FFTW_ESTIMATE=64) + INTEGER FFTW_WISDOM_ONLY + PARAMETER (FFTW_WISDOM_ONLY=2097152) + INTEGER FFTW_ESTIMATE_PATIENT + PARAMETER (FFTW_ESTIMATE_PATIENT=128) + INTEGER FFTW_BELIEVE_PCOST + PARAMETER (FFTW_BELIEVE_PCOST=256) + INTEGER FFTW_NO_DFT_R2HC + PARAMETER (FFTW_NO_DFT_R2HC=512) + INTEGER FFTW_NO_NONTHREADED + PARAMETER (FFTW_NO_NONTHREADED=1024) + INTEGER FFTW_NO_BUFFERING + PARAMETER (FFTW_NO_BUFFERING=2048) + INTEGER FFTW_NO_INDIRECT_OP + PARAMETER (FFTW_NO_INDIRECT_OP=4096) + INTEGER FFTW_ALLOW_LARGE_GENERIC + PARAMETER (FFTW_ALLOW_LARGE_GENERIC=8192) + INTEGER FFTW_NO_RANK_SPLITS + PARAMETER (FFTW_NO_RANK_SPLITS=16384) + INTEGER FFTW_NO_VRANK_SPLITS + PARAMETER (FFTW_NO_VRANK_SPLITS=32768) + INTEGER FFTW_NO_VRECURSE + PARAMETER (FFTW_NO_VRECURSE=65536) + INTEGER FFTW_NO_SIMD + PARAMETER (FFTW_NO_SIMD=131072) + INTEGER FFTW_NO_SLOW + PARAMETER (FFTW_NO_SLOW=262144) + INTEGER FFTW_NO_FIXED_RADIX_LARGE_N + PARAMETER (FFTW_NO_FIXED_RADIX_LARGE_N=524288) + INTEGER FFTW_ALLOW_PRUNING + PARAMETER (FFTW_ALLOW_PRUNING=1048576) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.f03.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.f03.in new file mode 100644 index 000000000..c18e3c9f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.f03.in @@ -0,0 +1,1252 @@ +! Generated automatically. DO NOT EDIT! + + integer(C_INT), parameter :: FFTW_R2HC = 0 + integer(C_INT), parameter :: FFTW_HC2R = 1 + integer(C_INT), parameter :: FFTW_DHT = 2 + integer(C_INT), parameter :: FFTW_REDFT00 = 3 + integer(C_INT), parameter :: FFTW_REDFT01 = 4 + integer(C_INT), parameter :: FFTW_REDFT10 = 5 + integer(C_INT), parameter :: FFTW_REDFT11 = 6 + integer(C_INT), parameter :: FFTW_RODFT00 = 7 + integer(C_INT), parameter :: FFTW_RODFT01 = 8 + integer(C_INT), parameter :: FFTW_RODFT10 = 9 + integer(C_INT), parameter :: FFTW_RODFT11 = 10 + integer(C_INT), parameter :: FFTW_FORWARD = -1 + integer(C_INT), parameter :: FFTW_BACKWARD = +1 + integer(C_INT), parameter :: FFTW_MEASURE = 0 + integer(C_INT), parameter :: FFTW_DESTROY_INPUT = 1 + integer(C_INT), parameter :: FFTW_UNALIGNED = 2 + integer(C_INT), parameter :: FFTW_CONSERVE_MEMORY = 4 + integer(C_INT), parameter :: FFTW_EXHAUSTIVE = 8 + integer(C_INT), parameter :: FFTW_PRESERVE_INPUT = 16 + integer(C_INT), parameter :: FFTW_PATIENT = 32 + integer(C_INT), parameter :: FFTW_ESTIMATE = 64 + integer(C_INT), parameter :: FFTW_WISDOM_ONLY = 2097152 + integer(C_INT), parameter :: FFTW_ESTIMATE_PATIENT = 128 + integer(C_INT), parameter :: FFTW_BELIEVE_PCOST = 256 + integer(C_INT), parameter :: FFTW_NO_DFT_R2HC = 512 + integer(C_INT), parameter :: FFTW_NO_NONTHREADED = 1024 + integer(C_INT), parameter :: FFTW_NO_BUFFERING = 2048 + integer(C_INT), parameter :: FFTW_NO_INDIRECT_OP = 4096 + integer(C_INT), parameter :: FFTW_ALLOW_LARGE_GENERIC = 8192 + integer(C_INT), parameter :: FFTW_NO_RANK_SPLITS = 16384 + integer(C_INT), parameter :: FFTW_NO_VRANK_SPLITS = 32768 + integer(C_INT), parameter :: FFTW_NO_VRECURSE = 65536 + integer(C_INT), parameter :: FFTW_NO_SIMD = 131072 + integer(C_INT), parameter :: FFTW_NO_SLOW = 262144 + integer(C_INT), parameter :: FFTW_NO_FIXED_RADIX_LARGE_N = 524288 + integer(C_INT), parameter :: FFTW_ALLOW_PRUNING = 1048576 + + type, bind(C) :: fftw_iodim + integer(C_INT) n, is, os + end type fftw_iodim + type, bind(C) :: fftw_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftw_iodim64 + + interface + type(C_PTR) function fftw_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftw_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft + + type(C_PTR) function fftw_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftw_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_1d + + type(C_PTR) function fftw_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftw_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_2d + + type(C_PTR) function fftw_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftw_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_dft_3d + + type(C_PTR) function fftw_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftw_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_many_dft + + type(C_PTR) function fftw_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftw_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_guru_dft + + type(C_PTR) function fftw_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftw_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft + + type(C_PTR) function fftw_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftw_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft + + type(C_PTR) function fftw_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftw_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft + + subroutine fftw_execute_dft(p,in,out) bind(C, name='fftw_execute_dft') + import + type(C_PTR), value :: p + complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft + + subroutine fftw_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftw_execute_split_dft') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: ri + real(C_DOUBLE), dimension(*), intent(inout) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftw_execute_split_dft + + type(C_PTR) function fftw_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftw_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftw_plan_many_dft_r2c + + type(C_PTR) function fftw_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c + + type(C_PTR) function fftw_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_1d + + type(C_PTR) function fftw_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_2d + + type(C_PTR) function fftw_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_r2c_3d + + type(C_PTR) function fftw_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftw_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftw_plan_many_dft_c2r + + type(C_PTR) function fftw_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftw_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r + + type(C_PTR) function fftw_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftw_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_1d + + type(C_PTR) function fftw_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftw_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_2d + + type(C_PTR) function fftw_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftw_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_dft_c2r_3d + + type(C_PTR) function fftw_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_dft_r2c + + type(C_PTR) function fftw_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_dft_c2r + + type(C_PTR) function fftw_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftw_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft_r2c + + type(C_PTR) function fftw_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftw_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru_split_dft_c2r + + type(C_PTR) function fftw_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft_r2c + + type(C_PTR) function fftw_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftw_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_dft_c2r + + type(C_PTR) function fftw_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftw_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft_r2c + + type(C_PTR) function fftw_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftw_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: ri + real(C_DOUBLE), dimension(*), intent(out) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftw_plan_guru64_split_dft_c2r + + subroutine fftw_execute_dft_r2c(p,in,out) bind(C, name='fftw_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + complex(C_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft_r2c + + subroutine fftw_execute_dft_c2r(p,in,out) bind(C, name='fftw_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_dft_c2r + + subroutine fftw_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftw_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: ro + real(C_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftw_execute_split_dft_r2c + + subroutine fftw_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftw_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: ri + real(C_DOUBLE), dimension(*), intent(inout) :: ii + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_split_dft_c2r + + type(C_PTR) function fftw_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftw_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_many_r2r + + type(C_PTR) function fftw_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftw_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_r2r + + type(C_PTR) function fftw_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftw_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftw_plan_r2r_1d + + type(C_PTR) function fftw_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftw_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftw_plan_r2r_2d + + type(C_PTR) function fftw_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftw_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftw_plan_r2r_3d + + type(C_PTR) function fftw_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftw_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftw_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_guru_r2r + + type(C_PTR) function fftw_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftw_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftw_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftw_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_DOUBLE), dimension(*), intent(out) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftw_plan_guru64_r2r + + subroutine fftw_execute_r2r(p,in,out) bind(C, name='fftw_execute_r2r') + import + type(C_PTR), value :: p + real(C_DOUBLE), dimension(*), intent(inout) :: in + real(C_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftw_execute_r2r + + subroutine fftw_destroy_plan(p) bind(C, name='fftw_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftw_destroy_plan + + subroutine fftw_forget_wisdom() bind(C, name='fftw_forget_wisdom') + import + end subroutine fftw_forget_wisdom + + subroutine fftw_cleanup() bind(C, name='fftw_cleanup') + import + end subroutine fftw_cleanup + + subroutine fftw_set_timelimit(t) bind(C, name='fftw_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftw_set_timelimit + + subroutine fftw_plan_with_nthreads(nthreads) bind(C, name='fftw_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftw_plan_with_nthreads + + integer(C_INT) function fftw_init_threads() bind(C, name='fftw_init_threads') + import + end function fftw_init_threads + + subroutine fftw_cleanup_threads() bind(C, name='fftw_cleanup_threads') + import + end subroutine fftw_cleanup_threads + + subroutine fftw_make_planner_thread_safe() bind(C, name='fftw_make_planner_thread_safe') + import + end subroutine fftw_make_planner_thread_safe + + integer(C_INT) function fftw_export_wisdom_to_filename(filename) bind(C, name='fftw_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftw_export_wisdom_to_filename + + subroutine fftw_export_wisdom_to_file(output_file) bind(C, name='fftw_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftw_export_wisdom_to_file + + type(C_PTR) function fftw_export_wisdom_to_string() bind(C, name='fftw_export_wisdom_to_string') + import + end function fftw_export_wisdom_to_string + + subroutine fftw_export_wisdom(write_char,data) bind(C, name='fftw_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftw_export_wisdom + + integer(C_INT) function fftw_import_system_wisdom() bind(C, name='fftw_import_system_wisdom') + import + end function fftw_import_system_wisdom + + integer(C_INT) function fftw_import_wisdom_from_filename(filename) bind(C, name='fftw_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftw_import_wisdom_from_filename + + integer(C_INT) function fftw_import_wisdom_from_file(input_file) bind(C, name='fftw_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftw_import_wisdom_from_file + + integer(C_INT) function fftw_import_wisdom_from_string(input_string) bind(C, name='fftw_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftw_import_wisdom_from_string + + integer(C_INT) function fftw_import_wisdom(read_char,data) bind(C, name='fftw_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftw_import_wisdom + + subroutine fftw_fprint_plan(p,output_file) bind(C, name='fftw_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftw_fprint_plan + + subroutine fftw_print_plan(p) bind(C, name='fftw_print_plan') + import + type(C_PTR), value :: p + end subroutine fftw_print_plan + + type(C_PTR) function fftw_sprint_plan(p) bind(C, name='fftw_sprint_plan') + import + type(C_PTR), value :: p + end function fftw_sprint_plan + + type(C_PTR) function fftw_malloc(n) bind(C, name='fftw_malloc') + import + integer(C_SIZE_T), value :: n + end function fftw_malloc + + type(C_PTR) function fftw_alloc_real(n) bind(C, name='fftw_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftw_alloc_real + + type(C_PTR) function fftw_alloc_complex(n) bind(C, name='fftw_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftw_alloc_complex + + subroutine fftw_free(p) bind(C, name='fftw_free') + import + type(C_PTR), value :: p + end subroutine fftw_free + + subroutine fftw_flops(p,add,mul,fmas) bind(C, name='fftw_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftw_flops + + real(C_DOUBLE) function fftw_estimate_cost(p) bind(C, name='fftw_estimate_cost') + import + type(C_PTR), value :: p + end function fftw_estimate_cost + + real(C_DOUBLE) function fftw_cost(p) bind(C, name='fftw_cost') + import + type(C_PTR), value :: p + end function fftw_cost + + integer(C_INT) function fftw_alignment_of(p) bind(C, name='fftw_alignment_of') + import + real(C_DOUBLE), dimension(*), intent(out) :: p + end function fftw_alignment_of + + end interface + + type, bind(C) :: fftwf_iodim + integer(C_INT) n, is, os + end type fftwf_iodim + type, bind(C) :: fftwf_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwf_iodim64 + + interface + type(C_PTR) function fftwf_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwf_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft + + type(C_PTR) function fftwf_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwf_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_1d + + type(C_PTR) function fftwf_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwf_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_2d + + type(C_PTR) function fftwf_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwf_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_dft_3d + + type(C_PTR) function fftwf_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwf_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_many_dft + + type(C_PTR) function fftwf_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwf_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft + + type(C_PTR) function fftwf_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwf_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft + + type(C_PTR) function fftwf_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwf_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft + + type(C_PTR) function fftwf_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwf_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft + + subroutine fftwf_execute_dft(p,in,out) bind(C, name='fftwf_execute_dft') + import + type(C_PTR), value :: p + complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft + + subroutine fftwf_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwf_execute_split_dft') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: ri + real(C_FLOAT), dimension(*), intent(inout) :: ii + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + end subroutine fftwf_execute_split_dft + + type(C_PTR) function fftwf_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwf_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_FLOAT), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwf_plan_many_dft_r2c + + type(C_PTR) function fftwf_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c + + type(C_PTR) function fftwf_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_1d + + type(C_PTR) function fftwf_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_2d + + type(C_PTR) function fftwf_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_r2c_3d + + type(C_PTR) function fftwf_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwf_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwf_plan_many_dft_c2r + + type(C_PTR) function fftwf_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r + + type(C_PTR) function fftwf_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_1d + + type(C_PTR) function fftwf_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_2d + + type(C_PTR) function fftwf_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwf_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_dft_c2r_3d + + type(C_PTR) function fftwf_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft_r2c + + type(C_PTR) function fftwf_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_dft_c2r + + type(C_PTR) function fftwf_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwf_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft_r2c + + type(C_PTR) function fftwf_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwf_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru_split_dft_c2r + + type(C_PTR) function fftwf_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft_r2c + + type(C_PTR) function fftwf_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwf_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_dft_c2r + + type(C_PTR) function fftwf_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwf_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwf_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwf_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: ri + real(C_FLOAT), dimension(*), intent(out) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwf_plan_guru64_split_dft_c2r + + subroutine fftwf_execute_dft_r2c(p,in,out) bind(C, name='fftwf_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + complex(C_FLOAT_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft_r2c + + subroutine fftwf_execute_dft_c2r(p,in,out) bind(C, name='fftwf_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_FLOAT_COMPLEX), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_dft_c2r + + subroutine fftwf_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwf_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: ro + real(C_FLOAT), dimension(*), intent(out) :: io + end subroutine fftwf_execute_split_dft_r2c + + subroutine fftwf_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwf_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: ri + real(C_FLOAT), dimension(*), intent(inout) :: ii + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_split_dft_c2r + + type(C_PTR) function fftwf_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwf_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_FLOAT), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_many_r2r + + type(C_PTR) function fftwf_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_r2r + + type(C_PTR) function fftwf_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwf_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwf_plan_r2r_1d + + type(C_PTR) function fftwf_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwf_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwf_plan_r2r_2d + + type(C_PTR) function fftwf_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwf_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwf_plan_r2r_3d + + type(C_PTR) function fftwf_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwf_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_guru_r2r + + type(C_PTR) function fftwf_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwf_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwf_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwf_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_FLOAT), dimension(*), intent(out) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwf_plan_guru64_r2r + + subroutine fftwf_execute_r2r(p,in,out) bind(C, name='fftwf_execute_r2r') + import + type(C_PTR), value :: p + real(C_FLOAT), dimension(*), intent(inout) :: in + real(C_FLOAT), dimension(*), intent(out) :: out + end subroutine fftwf_execute_r2r + + subroutine fftwf_destroy_plan(p) bind(C, name='fftwf_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwf_destroy_plan + + subroutine fftwf_forget_wisdom() bind(C, name='fftwf_forget_wisdom') + import + end subroutine fftwf_forget_wisdom + + subroutine fftwf_cleanup() bind(C, name='fftwf_cleanup') + import + end subroutine fftwf_cleanup + + subroutine fftwf_set_timelimit(t) bind(C, name='fftwf_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwf_set_timelimit + + subroutine fftwf_plan_with_nthreads(nthreads) bind(C, name='fftwf_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwf_plan_with_nthreads + + integer(C_INT) function fftwf_init_threads() bind(C, name='fftwf_init_threads') + import + end function fftwf_init_threads + + subroutine fftwf_cleanup_threads() bind(C, name='fftwf_cleanup_threads') + import + end subroutine fftwf_cleanup_threads + + subroutine fftwf_make_planner_thread_safe() bind(C, name='fftwf_make_planner_thread_safe') + import + end subroutine fftwf_make_planner_thread_safe + + integer(C_INT) function fftwf_export_wisdom_to_filename(filename) bind(C, name='fftwf_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwf_export_wisdom_to_filename + + subroutine fftwf_export_wisdom_to_file(output_file) bind(C, name='fftwf_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwf_export_wisdom_to_file + + type(C_PTR) function fftwf_export_wisdom_to_string() bind(C, name='fftwf_export_wisdom_to_string') + import + end function fftwf_export_wisdom_to_string + + subroutine fftwf_export_wisdom(write_char,data) bind(C, name='fftwf_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwf_export_wisdom + + integer(C_INT) function fftwf_import_system_wisdom() bind(C, name='fftwf_import_system_wisdom') + import + end function fftwf_import_system_wisdom + + integer(C_INT) function fftwf_import_wisdom_from_filename(filename) bind(C, name='fftwf_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwf_import_wisdom_from_filename + + integer(C_INT) function fftwf_import_wisdom_from_file(input_file) bind(C, name='fftwf_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwf_import_wisdom_from_file + + integer(C_INT) function fftwf_import_wisdom_from_string(input_string) bind(C, name='fftwf_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwf_import_wisdom_from_string + + integer(C_INT) function fftwf_import_wisdom(read_char,data) bind(C, name='fftwf_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwf_import_wisdom + + subroutine fftwf_fprint_plan(p,output_file) bind(C, name='fftwf_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwf_fprint_plan + + subroutine fftwf_print_plan(p) bind(C, name='fftwf_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwf_print_plan + + type(C_PTR) function fftwf_sprint_plan(p) bind(C, name='fftwf_sprint_plan') + import + type(C_PTR), value :: p + end function fftwf_sprint_plan + + type(C_PTR) function fftwf_malloc(n) bind(C, name='fftwf_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwf_malloc + + type(C_PTR) function fftwf_alloc_real(n) bind(C, name='fftwf_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwf_alloc_real + + type(C_PTR) function fftwf_alloc_complex(n) bind(C, name='fftwf_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwf_alloc_complex + + subroutine fftwf_free(p) bind(C, name='fftwf_free') + import + type(C_PTR), value :: p + end subroutine fftwf_free + + subroutine fftwf_flops(p,add,mul,fmas) bind(C, name='fftwf_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwf_flops + + real(C_DOUBLE) function fftwf_estimate_cost(p) bind(C, name='fftwf_estimate_cost') + import + type(C_PTR), value :: p + end function fftwf_estimate_cost + + real(C_DOUBLE) function fftwf_cost(p) bind(C, name='fftwf_cost') + import + type(C_PTR), value :: p + end function fftwf_cost + + integer(C_INT) function fftwf_alignment_of(p) bind(C, name='fftwf_alignment_of') + import + real(C_FLOAT), dimension(*), intent(out) :: p + end function fftwf_alignment_of + + end interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.h new file mode 100644 index 000000000..7bd4c6e55 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3.h @@ -0,0 +1,514 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * The following statement of license applies *only* to this header file, + * and *not* to the other files distributed with FFTW or derived therefrom: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/***************************** NOTE TO USERS ********************************* + * + * THIS IS A HEADER FILE, NOT A MANUAL + * + * If you want to know how to use FFTW, please read the manual, + * online at http://www.fftw.org/doc/ and also included with FFTW. + * For a quick start, see the manual's tutorial section. + * + * (Reading header files to learn how to use a library is a habit + * stemming from code lacking a proper manual. Arguably, it's a + * *bad* habit in most cases, because header files can contain + * interfaces that are not part of the public, stable API.) + * + ****************************************************************************/ + +#ifndef FFTW3_H +#define FFTW3_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* If is included, use the C99 complex type. Otherwise + define a type bit-compatible with C99 complex */ +#if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +# define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C +#else +# define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2] +#endif + +#define FFTW_CONCAT(prefix, name) prefix ## name +#define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name) +#define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name) +#define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name) +#define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name) + +/* IMPORTANT: for Windows compilers, you should add a line + #define FFTW_DLL + here and in kernel/ifftw.h if you are compiling/using FFTW as a + DLL, in order to do the proper importing/exporting, or + alternatively compile with -DFFTW_DLL or the equivalent + command-line flag. This is not necessary under MinGW/Cygwin, where + libtool does the imports/exports automatically. */ +#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__)) + /* annoying Windows syntax for shared-library declarations */ +# if defined(COMPILING_FFTW) /* defined in api.h when compiling FFTW */ +# define FFTW_EXTERN extern __declspec(dllexport) +# else /* user is calling FFTW; import symbol */ +# define FFTW_EXTERN extern __declspec(dllimport) +# endif +#else +# define FFTW_EXTERN extern +#endif + +/* specify calling convention (Windows only) */ +#if defined(_WIN32) || defined(__WIN32__) +# define FFTW_CDECL __cdecl +#else +# define FFTW_CDECL +#endif + +enum fftw_r2r_kind_do_not_use_me { + FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, + FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, + FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 +}; + +struct fftw_iodim_do_not_use_me { + int n; /* dimension size */ + int is; /* input stride */ + int os; /* output stride */ +}; + +#include /* for ptrdiff_t */ +struct fftw_iodim64_do_not_use_me { + ptrdiff_t n; /* dimension size */ + ptrdiff_t is; /* input stride */ + ptrdiff_t os; /* output stride */ +}; + +typedef void (FFTW_CDECL *fftw_write_char_func_do_not_use_me)(char c, void *); +typedef int (FFTW_CDECL *fftw_read_char_func_do_not_use_me)(void *); + +/* + huge second-order macro that defines prototypes for all API + functions. We expand this macro for each supported precision + + X: name-mangling macro + R: real data type + C: complex data type +*/ + +#define FFTW_DEFINE_API(X, R, C) \ + \ +FFTW_DEFINE_COMPLEX(R, C); \ + \ +typedef struct X(plan_s) *X(plan); \ + \ +typedef struct fftw_iodim_do_not_use_me X(iodim); \ +typedef struct fftw_iodim64_do_not_use_me X(iodim64); \ + \ +typedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind); \ + \ +typedef fftw_write_char_func_do_not_use_me X(write_char_func); \ +typedef fftw_read_char_func_do_not_use_me X(read_char_func); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute)(const X(plan) p); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft)(int rank, const int *n, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_1d)(int n, C *in, C *out, int sign, \ + unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_2d)(int n0, int n1, \ + C *in, C *out, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_3d)(int n0, int n1, int n2, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_dft)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_split_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_dft)(const X(plan) p, C *in, C *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_split_dft)(const X(plan) p, R *ri, R *ii, \ + R *ro, R *io); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_dft_r2c)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c)(int rank, const int *n, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c_2d)(int n0, int n1, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_r2c_3d)(int n0, int n1, \ + int n2, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_dft_c2r)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r)(int rank, const int *n, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r_2d)(int n0, int n1, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_dft_c2r_3d)(int n0, int n1, \ + int n2, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_split_dft_r2c)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_split_dft_c2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_dft_r2c)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_dft_c2r)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_split_dft_r2c)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_split_dft_c2r)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_dft_r2c)(const X(plan) p, R *in, C *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_dft_c2r)(const X(plan) p, C *in, R *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_split_dft_r2c)(const X(plan) p, \ + R *in, R *ro, R *io); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_split_dft_c2r)(const X(plan) p, \ + R *ri, R *ii, R *out); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_many_r2r)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r)(int rank, const int *n, R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r_1d)(int n, R *in, R *out, \ + X(r2r_kind) kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r_2d)(int n0, int n1, R *in, R *out, \ + X(r2r_kind) kind0, X(r2r_kind) kind1, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_r2r_3d)(int n0, int n1, int n2, \ + R *in, R *out, X(r2r_kind) kind0, \ + X(r2r_kind) kind1, X(r2r_kind) kind2, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru_r2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) \ +FFTW_CDECL X(plan_guru64_r2r)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(execute_r2r)(const X(plan) p, R *in, R *out); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(destroy_plan)(X(plan) p); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(forget_wisdom)(void); \ +FFTW_EXTERN void \ +FFTW_CDECL X(cleanup)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(set_timelimit)(double t); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(plan_with_nthreads)(int nthreads); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(init_threads)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(cleanup_threads)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(make_planner_thread_safe)(void); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(export_wisdom_to_filename)(const char *filename); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(export_wisdom_to_file)(FILE *output_file); \ + \ +FFTW_EXTERN char * \ +FFTW_CDECL X(export_wisdom_to_string)(void); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(export_wisdom)(X(write_char_func) write_char, \ + void *data); \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_system_wisdom)(void); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom_from_filename)(const char *filename); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom_from_file)(FILE *input_file); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom_from_string)(const char *input_string); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(import_wisdom)(X(read_char_func) read_char, void *data); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(fprint_plan)(const X(plan) p, FILE *output_file); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(print_plan)(const X(plan) p); \ + \ +FFTW_EXTERN char * \ +FFTW_CDECL X(sprint_plan)(const X(plan) p); \ + \ +FFTW_EXTERN void * \ +FFTW_CDECL X(malloc)(size_t n); \ + \ +FFTW_EXTERN R * \ +FFTW_CDECL X(alloc_real)(size_t n); \ +FFTW_EXTERN C * \ +FFTW_CDECL X(alloc_complex)(size_t n); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(free)(void *p); \ + \ +FFTW_EXTERN void \ +FFTW_CDECL X(flops)(const X(plan) p, \ + double *add, double *mul, double *fmas); \ +FFTW_EXTERN double \ +FFTW_CDECL X(estimate_cost)(const X(plan) p); \ + \ +FFTW_EXTERN double \ +FFTW_CDECL X(cost)(const X(plan) p); \ + \ +FFTW_EXTERN int \ +FFTW_CDECL X(alignment_of)(R *p); \ + \ +FFTW_EXTERN const char X(version)[]; \ +FFTW_EXTERN const char X(cc)[]; \ +FFTW_EXTERN const char X(codelet_optim)[]; + + +/* end of FFTW_DEFINE_API macro */ + +FFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex) +FFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex) +FFTW_DEFINE_API(FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex) + +/* __float128 (quad precision) is a gcc extension on i386, x86_64, and ia64 + for gcc >= 4.6 (compiled in FFTW with --enable-quad-precision) */ +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) \ + && !(defined(__ICC) || defined(__INTEL_COMPILER) || defined(__CUDACC__) || defined(__PGI)) \ + && (defined(__i386__) || defined(__x86_64__) || defined(__ia64__)) +# if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +/* note: __float128 is a typedef, which is not supported with the _Complex + keyword in gcc, so instead we use this ugly __attribute__ version. + However, we can't simply pass the __attribute__ version to + FFTW_DEFINE_API because the __attribute__ confuses gcc in pointer + types. Hence redefining FFTW_DEFINE_COMPLEX. Ugh. */ +# undef FFTW_DEFINE_COMPLEX +# define FFTW_DEFINE_COMPLEX(R, C) typedef _Complex float __attribute__((mode(TC))) C +# endif +FFTW_DEFINE_API(FFTW_MANGLE_QUAD, __float128, fftwq_complex) +#endif + +#define FFTW_FORWARD (-1) +#define FFTW_BACKWARD (+1) + +#define FFTW_NO_TIMELIMIT (-1.0) + +/* documented flags */ +#define FFTW_MEASURE (0U) +#define FFTW_DESTROY_INPUT (1U << 0) +#define FFTW_UNALIGNED (1U << 1) +#define FFTW_CONSERVE_MEMORY (1U << 2) +#define FFTW_EXHAUSTIVE (1U << 3) /* NO_EXHAUSTIVE is default */ +#define FFTW_PRESERVE_INPUT (1U << 4) /* cancels FFTW_DESTROY_INPUT */ +#define FFTW_PATIENT (1U << 5) /* IMPATIENT is default */ +#define FFTW_ESTIMATE (1U << 6) +#define FFTW_WISDOM_ONLY (1U << 21) + +/* undocumented beyond-guru flags */ +#define FFTW_ESTIMATE_PATIENT (1U << 7) +#define FFTW_BELIEVE_PCOST (1U << 8) +#define FFTW_NO_DFT_R2HC (1U << 9) +#define FFTW_NO_NONTHREADED (1U << 10) +#define FFTW_NO_BUFFERING (1U << 11) +#define FFTW_NO_INDIRECT_OP (1U << 12) +#define FFTW_ALLOW_LARGE_GENERIC (1U << 13) /* NO_LARGE_GENERIC is default */ +#define FFTW_NO_RANK_SPLITS (1U << 14) +#define FFTW_NO_VRANK_SPLITS (1U << 15) +#define FFTW_NO_VRECURSE (1U << 16) +#define FFTW_NO_SIMD (1U << 17) +#define FFTW_NO_SLOW (1U << 18) +#define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19) +#define FFTW_ALLOW_PRUNING (1U << 20) + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FFTW3_H */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3l.f03 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3l.f03 new file mode 100644 index 000000000..59e7ed273 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3l.f03 @@ -0,0 +1,609 @@ +! Generated automatically. DO NOT EDIT! + + + type, bind(C) :: fftwl_iodim + integer(C_INT) n, is, os + end type fftwl_iodim + type, bind(C) :: fftwl_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwl_iodim64 + + interface + type(C_PTR) function fftwl_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwl_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft + + type(C_PTR) function fftwl_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwl_plan_dft_1d') + import + integer(C_INT), value :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft_1d + + type(C_PTR) function fftwl_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwl_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft_2d + + type(C_PTR) function fftwl_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwl_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_dft_3d + + type(C_PTR) function fftwl_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwl_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_many_dft + + type(C_PTR) function fftwl_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwl_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_guru_dft + + type(C_PTR) function fftwl_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwl_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru_split_dft + + type(C_PTR) function fftwl_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwl_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_plan_guru64_dft + + type(C_PTR) function fftwl_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwl_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru64_split_dft + + subroutine fftwl_execute_dft(p,in,out) bind(C, name='fftwl_execute_dft') + import + type(C_PTR), value :: p + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwl_execute_dft + + subroutine fftwl_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwl_execute_split_dft') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftwl_execute_split_dft + + type(C_PTR) function fftwl_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwl_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwl_plan_many_dft_r2c + + type(C_PTR) function fftwl_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwl_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c + + type(C_PTR) function fftwl_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c_1d + + type(C_PTR) function fftwl_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c_2d + + type(C_PTR) function fftwl_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwl_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_r2c_3d + + type(C_PTR) function fftwl_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwl_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwl_plan_many_dft_c2r + + type(C_PTR) function fftwl_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwl_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r + + type(C_PTR) function fftwl_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r_1d + + type(C_PTR) function fftwl_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r_2d + + type(C_PTR) function fftwl_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwl_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_dft_c2r_3d + + type(C_PTR) function fftwl_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru_dft_r2c + + type(C_PTR) function fftwl_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru_dft_c2r + + type(C_PTR) function fftwl_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwl_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru_split_dft_r2c + + type(C_PTR) function fftwl_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwl_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru_split_dft_c2r + + type(C_PTR) function fftwl_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru64_dft_r2c + + type(C_PTR) function fftwl_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwl_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru64_dft_c2r + + type(C_PTR) function fftwl_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwl_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwl_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwl_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwl_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwl_plan_guru64_split_dft_c2r + + subroutine fftwl_execute_dft_r2c(p,in,out) bind(C, name='fftwl_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwl_execute_dft_r2c + + subroutine fftwl_execute_dft_c2r(p,in,out) bind(C, name='fftwl_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_execute_dft_c2r + + subroutine fftwl_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwl_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: ro + real(C_LONG_DOUBLE), dimension(*), intent(out) :: io + end subroutine fftwl_execute_split_dft_r2c + + subroutine fftwl_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwl_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ri + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: ii + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_execute_split_dft_c2r + + type(C_PTR) function fftwl_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwl_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_many_r2r + + type(C_PTR) function fftwl_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwl_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_r2r + + type(C_PTR) function fftwl_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwl_plan_r2r_1d') + import + integer(C_INT), value :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwl_plan_r2r_1d + + type(C_PTR) function fftwl_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwl_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwl_plan_r2r_2d + + type(C_PTR) function fftwl_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwl_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwl_plan_r2r_3d + + type(C_PTR) function fftwl_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwl_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_guru_r2r + + type(C_PTR) function fftwl_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwl_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwl_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwl_iodim64), dimension(*), intent(in) :: howmany_dims + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_plan_guru64_r2r + + subroutine fftwl_execute_r2r(p,in,out) bind(C, name='fftwl_execute_r2r') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_execute_r2r + + subroutine fftwl_destroy_plan(p) bind(C, name='fftwl_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwl_destroy_plan + + subroutine fftwl_forget_wisdom() bind(C, name='fftwl_forget_wisdom') + import + end subroutine fftwl_forget_wisdom + + subroutine fftwl_cleanup() bind(C, name='fftwl_cleanup') + import + end subroutine fftwl_cleanup + + subroutine fftwl_set_timelimit(t) bind(C, name='fftwl_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwl_set_timelimit + + subroutine fftwl_plan_with_nthreads(nthreads) bind(C, name='fftwl_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwl_plan_with_nthreads + + integer(C_INT) function fftwl_init_threads() bind(C, name='fftwl_init_threads') + import + end function fftwl_init_threads + + subroutine fftwl_cleanup_threads() bind(C, name='fftwl_cleanup_threads') + import + end subroutine fftwl_cleanup_threads + + subroutine fftwl_make_planner_thread_safe() bind(C, name='fftwl_make_planner_thread_safe') + import + end subroutine fftwl_make_planner_thread_safe + + integer(C_INT) function fftwl_export_wisdom_to_filename(filename) bind(C, name='fftwl_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwl_export_wisdom_to_filename + + subroutine fftwl_export_wisdom_to_file(output_file) bind(C, name='fftwl_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwl_export_wisdom_to_file + + type(C_PTR) function fftwl_export_wisdom_to_string() bind(C, name='fftwl_export_wisdom_to_string') + import + end function fftwl_export_wisdom_to_string + + subroutine fftwl_export_wisdom(write_char,data) bind(C, name='fftwl_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwl_export_wisdom + + integer(C_INT) function fftwl_import_system_wisdom() bind(C, name='fftwl_import_system_wisdom') + import + end function fftwl_import_system_wisdom + + integer(C_INT) function fftwl_import_wisdom_from_filename(filename) bind(C, name='fftwl_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwl_import_wisdom_from_filename + + integer(C_INT) function fftwl_import_wisdom_from_file(input_file) bind(C, name='fftwl_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwl_import_wisdom_from_file + + integer(C_INT) function fftwl_import_wisdom_from_string(input_string) bind(C, name='fftwl_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwl_import_wisdom_from_string + + integer(C_INT) function fftwl_import_wisdom(read_char,data) bind(C, name='fftwl_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwl_import_wisdom + + subroutine fftwl_fprint_plan(p,output_file) bind(C, name='fftwl_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwl_fprint_plan + + subroutine fftwl_print_plan(p) bind(C, name='fftwl_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwl_print_plan + + type(C_PTR) function fftwl_sprint_plan(p) bind(C, name='fftwl_sprint_plan') + import + type(C_PTR), value :: p + end function fftwl_sprint_plan + + type(C_PTR) function fftwl_malloc(n) bind(C, name='fftwl_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwl_malloc + + type(C_PTR) function fftwl_alloc_real(n) bind(C, name='fftwl_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwl_alloc_real + + type(C_PTR) function fftwl_alloc_complex(n) bind(C, name='fftwl_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwl_alloc_complex + + subroutine fftwl_free(p) bind(C, name='fftwl_free') + import + type(C_PTR), value :: p + end subroutine fftwl_free + + subroutine fftwl_flops(p,add,mul,fmas) bind(C, name='fftwl_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwl_flops + + real(C_DOUBLE) function fftwl_estimate_cost(p) bind(C, name='fftwl_estimate_cost') + import + type(C_PTR), value :: p + end function fftwl_estimate_cost + + real(C_DOUBLE) function fftwl_cost(p) bind(C, name='fftwl_cost') + import + type(C_PTR), value :: p + end function fftwl_cost + + integer(C_INT) function fftwl_alignment_of(p) bind(C, name='fftwl_alignment_of') + import + real(C_LONG_DOUBLE), dimension(*), intent(out) :: p + end function fftwl_alignment_of + + end interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3q.f03 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3q.f03 new file mode 100644 index 000000000..61dacd6cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/fftw3q.f03 @@ -0,0 +1,609 @@ +! Generated automatically. DO NOT EDIT! + + + type, bind(C) :: fftwq_iodim + integer(C_INT) n, is, os + end type fftwq_iodim + type, bind(C) :: fftwq_iodim64 + integer(C_INTPTR_T) n, is, os + end type fftwq_iodim64 + + interface + type(C_PTR) function fftwq_plan_dft(rank,n,in,out,sign,flags) bind(C, name='fftwq_plan_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft + + type(C_PTR) function fftwq_plan_dft_1d(n,in,out,sign,flags) bind(C, name='fftwq_plan_dft_1d') + import + integer(C_INT), value :: n + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft_1d + + type(C_PTR) function fftwq_plan_dft_2d(n0,n1,in,out,sign,flags) bind(C, name='fftwq_plan_dft_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft_2d + + type(C_PTR) function fftwq_plan_dft_3d(n0,n1,n2,in,out,sign,flags) bind(C, name='fftwq_plan_dft_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_dft_3d + + type(C_PTR) function fftwq_plan_many_dft(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,sign,flags) & + bind(C, name='fftwq_plan_many_dft') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_many_dft + + type(C_PTR) function fftwq_plan_guru_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwq_plan_guru_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_guru_dft + + type(C_PTR) function fftwq_plan_guru_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwq_plan_guru_split_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru_split_dft + + type(C_PTR) function fftwq_plan_guru64_dft(rank,dims,howmany_rank,howmany_dims,in,out,sign,flags) & + bind(C, name='fftwq_plan_guru64_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwq_plan_guru64_dft + + type(C_PTR) function fftwq_plan_guru64_split_dft(rank,dims,howmany_rank,howmany_dims,ri,ii,ro,io,flags) & + bind(C, name='fftwq_plan_guru64_split_dft') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru64_split_dft + + subroutine fftwq_execute_dft(p,in,out) bind(C, name='fftwq_execute_dft') + import + type(C_PTR), value :: p + complex(16), dimension(*), intent(inout) :: in + complex(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_dft + + subroutine fftwq_execute_split_dft(p,ri,ii,ro,io) bind(C, name='fftwq_execute_split_dft') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: ri + real(16), dimension(*), intent(inout) :: ii + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + end subroutine fftwq_execute_split_dft + + type(C_PTR) function fftwq_plan_many_dft_r2c(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwq_plan_many_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + complex(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwq_plan_many_dft_r2c + + type(C_PTR) function fftwq_plan_dft_r2c(rank,n,in,out,flags) bind(C, name='fftwq_plan_dft_r2c') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c + + type(C_PTR) function fftwq_plan_dft_r2c_1d(n,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_1d') + import + integer(C_INT), value :: n + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c_1d + + type(C_PTR) function fftwq_plan_dft_r2c_2d(n0,n1,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c_2d + + type(C_PTR) function fftwq_plan_dft_r2c_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwq_plan_dft_r2c_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_r2c_3d + + type(C_PTR) function fftwq_plan_many_dft_c2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,flags) & + bind(C, name='fftwq_plan_many_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + complex(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_INT), value :: flags + end function fftwq_plan_many_dft_c2r + + type(C_PTR) function fftwq_plan_dft_c2r(rank,n,in,out,flags) bind(C, name='fftwq_plan_dft_c2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r + + type(C_PTR) function fftwq_plan_dft_c2r_1d(n,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_1d') + import + integer(C_INT), value :: n + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r_1d + + type(C_PTR) function fftwq_plan_dft_c2r_2d(n0,n1,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r_2d + + type(C_PTR) function fftwq_plan_dft_c2r_3d(n0,n1,n2,in,out,flags) bind(C, name='fftwq_plan_dft_c2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_dft_c2r_3d + + type(C_PTR) function fftwq_plan_guru_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru_dft_r2c + + type(C_PTR) function fftwq_plan_guru_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru_dft_c2r + + type(C_PTR) function fftwq_plan_guru_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwq_plan_guru_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru_split_dft_r2c + + type(C_PTR) function fftwq_plan_guru_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwq_plan_guru_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru_split_dft_c2r + + type(C_PTR) function fftwq_plan_guru64_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru64_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + complex(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru64_dft_r2c + + type(C_PTR) function fftwq_plan_guru64_dft_c2r(rank,dims,howmany_rank,howmany_dims,in,out,flags) & + bind(C, name='fftwq_plan_guru64_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + complex(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru64_dft_c2r + + type(C_PTR) function fftwq_plan_guru64_split_dft_r2c(rank,dims,howmany_rank,howmany_dims,in,ro,io,flags) & + bind(C, name='fftwq_plan_guru64_split_dft_r2c') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + integer(C_INT), value :: flags + end function fftwq_plan_guru64_split_dft_r2c + + type(C_PTR) function fftwq_plan_guru64_split_dft_c2r(rank,dims,howmany_rank,howmany_dims,ri,ii,out,flags) & + bind(C, name='fftwq_plan_guru64_split_dft_c2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: ri + real(16), dimension(*), intent(out) :: ii + real(16), dimension(*), intent(out) :: out + integer(C_INT), value :: flags + end function fftwq_plan_guru64_split_dft_c2r + + subroutine fftwq_execute_dft_r2c(p,in,out) bind(C, name='fftwq_execute_dft_r2c') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: in + complex(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_dft_r2c + + subroutine fftwq_execute_dft_c2r(p,in,out) bind(C, name='fftwq_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(16), dimension(*), intent(inout) :: in + real(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_dft_c2r + + subroutine fftwq_execute_split_dft_r2c(p,in,ro,io) bind(C, name='fftwq_execute_split_dft_r2c') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: in + real(16), dimension(*), intent(out) :: ro + real(16), dimension(*), intent(out) :: io + end subroutine fftwq_execute_split_dft_r2c + + subroutine fftwq_execute_split_dft_c2r(p,ri,ii,out) bind(C, name='fftwq_execute_split_dft_c2r') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: ri + real(16), dimension(*), intent(inout) :: ii + real(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_split_dft_c2r + + type(C_PTR) function fftwq_plan_many_r2r(rank,n,howmany,in,inembed,istride,idist,out,onembed,ostride,odist,kind,flags) & + bind(C, name='fftwq_plan_many_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + integer(C_INT), value :: howmany + real(16), dimension(*), intent(out) :: in + integer(C_INT), dimension(*), intent(in) :: inembed + integer(C_INT), value :: istride + integer(C_INT), value :: idist + real(16), dimension(*), intent(out) :: out + integer(C_INT), dimension(*), intent(in) :: onembed + integer(C_INT), value :: ostride + integer(C_INT), value :: odist + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_many_r2r + + type(C_PTR) function fftwq_plan_r2r(rank,n,in,out,kind,flags) bind(C, name='fftwq_plan_r2r') + import + integer(C_INT), value :: rank + integer(C_INT), dimension(*), intent(in) :: n + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_r2r + + type(C_PTR) function fftwq_plan_r2r_1d(n,in,out,kind,flags) bind(C, name='fftwq_plan_r2r_1d') + import + integer(C_INT), value :: n + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind + integer(C_INT), value :: flags + end function fftwq_plan_r2r_1d + + type(C_PTR) function fftwq_plan_r2r_2d(n0,n1,in,out,kind0,kind1,flags) bind(C, name='fftwq_plan_r2r_2d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwq_plan_r2r_2d + + type(C_PTR) function fftwq_plan_r2r_3d(n0,n1,n2,in,out,kind0,kind1,kind2,flags) bind(C, name='fftwq_plan_r2r_3d') + import + integer(C_INT), value :: n0 + integer(C_INT), value :: n1 + integer(C_INT), value :: n2 + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwq_plan_r2r_3d + + type(C_PTR) function fftwq_plan_guru_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwq_plan_guru_r2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_guru_r2r + + type(C_PTR) function fftwq_plan_guru64_r2r(rank,dims,howmany_rank,howmany_dims,in,out,kind,flags) & + bind(C, name='fftwq_plan_guru64_r2r') + import + integer(C_INT), value :: rank + type(fftwq_iodim64), dimension(*), intent(in) :: dims + integer(C_INT), value :: howmany_rank + type(fftwq_iodim64), dimension(*), intent(in) :: howmany_dims + real(16), dimension(*), intent(out) :: in + real(16), dimension(*), intent(out) :: out + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwq_plan_guru64_r2r + + subroutine fftwq_execute_r2r(p,in,out) bind(C, name='fftwq_execute_r2r') + import + type(C_PTR), value :: p + real(16), dimension(*), intent(inout) :: in + real(16), dimension(*), intent(out) :: out + end subroutine fftwq_execute_r2r + + subroutine fftwq_destroy_plan(p) bind(C, name='fftwq_destroy_plan') + import + type(C_PTR), value :: p + end subroutine fftwq_destroy_plan + + subroutine fftwq_forget_wisdom() bind(C, name='fftwq_forget_wisdom') + import + end subroutine fftwq_forget_wisdom + + subroutine fftwq_cleanup() bind(C, name='fftwq_cleanup') + import + end subroutine fftwq_cleanup + + subroutine fftwq_set_timelimit(t) bind(C, name='fftwq_set_timelimit') + import + real(C_DOUBLE), value :: t + end subroutine fftwq_set_timelimit + + subroutine fftwq_plan_with_nthreads(nthreads) bind(C, name='fftwq_plan_with_nthreads') + import + integer(C_INT), value :: nthreads + end subroutine fftwq_plan_with_nthreads + + integer(C_INT) function fftwq_init_threads() bind(C, name='fftwq_init_threads') + import + end function fftwq_init_threads + + subroutine fftwq_cleanup_threads() bind(C, name='fftwq_cleanup_threads') + import + end subroutine fftwq_cleanup_threads + + subroutine fftwq_make_planner_thread_safe() bind(C, name='fftwq_make_planner_thread_safe') + import + end subroutine fftwq_make_planner_thread_safe + + integer(C_INT) function fftwq_export_wisdom_to_filename(filename) bind(C, name='fftwq_export_wisdom_to_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwq_export_wisdom_to_filename + + subroutine fftwq_export_wisdom_to_file(output_file) bind(C, name='fftwq_export_wisdom_to_file') + import + type(C_PTR), value :: output_file + end subroutine fftwq_export_wisdom_to_file + + type(C_PTR) function fftwq_export_wisdom_to_string() bind(C, name='fftwq_export_wisdom_to_string') + import + end function fftwq_export_wisdom_to_string + + subroutine fftwq_export_wisdom(write_char,data) bind(C, name='fftwq_export_wisdom') + import + type(C_FUNPTR), value :: write_char + type(C_PTR), value :: data + end subroutine fftwq_export_wisdom + + integer(C_INT) function fftwq_import_system_wisdom() bind(C, name='fftwq_import_system_wisdom') + import + end function fftwq_import_system_wisdom + + integer(C_INT) function fftwq_import_wisdom_from_filename(filename) bind(C, name='fftwq_import_wisdom_from_filename') + import + character(C_CHAR), dimension(*), intent(in) :: filename + end function fftwq_import_wisdom_from_filename + + integer(C_INT) function fftwq_import_wisdom_from_file(input_file) bind(C, name='fftwq_import_wisdom_from_file') + import + type(C_PTR), value :: input_file + end function fftwq_import_wisdom_from_file + + integer(C_INT) function fftwq_import_wisdom_from_string(input_string) bind(C, name='fftwq_import_wisdom_from_string') + import + character(C_CHAR), dimension(*), intent(in) :: input_string + end function fftwq_import_wisdom_from_string + + integer(C_INT) function fftwq_import_wisdom(read_char,data) bind(C, name='fftwq_import_wisdom') + import + type(C_FUNPTR), value :: read_char + type(C_PTR), value :: data + end function fftwq_import_wisdom + + subroutine fftwq_fprint_plan(p,output_file) bind(C, name='fftwq_fprint_plan') + import + type(C_PTR), value :: p + type(C_PTR), value :: output_file + end subroutine fftwq_fprint_plan + + subroutine fftwq_print_plan(p) bind(C, name='fftwq_print_plan') + import + type(C_PTR), value :: p + end subroutine fftwq_print_plan + + type(C_PTR) function fftwq_sprint_plan(p) bind(C, name='fftwq_sprint_plan') + import + type(C_PTR), value :: p + end function fftwq_sprint_plan + + type(C_PTR) function fftwq_malloc(n) bind(C, name='fftwq_malloc') + import + integer(C_SIZE_T), value :: n + end function fftwq_malloc + + type(C_PTR) function fftwq_alloc_real(n) bind(C, name='fftwq_alloc_real') + import + integer(C_SIZE_T), value :: n + end function fftwq_alloc_real + + type(C_PTR) function fftwq_alloc_complex(n) bind(C, name='fftwq_alloc_complex') + import + integer(C_SIZE_T), value :: n + end function fftwq_alloc_complex + + subroutine fftwq_free(p) bind(C, name='fftwq_free') + import + type(C_PTR), value :: p + end subroutine fftwq_free + + subroutine fftwq_flops(p,add,mul,fmas) bind(C, name='fftwq_flops') + import + type(C_PTR), value :: p + real(C_DOUBLE), intent(out) :: add + real(C_DOUBLE), intent(out) :: mul + real(C_DOUBLE), intent(out) :: fmas + end subroutine fftwq_flops + + real(C_DOUBLE) function fftwq_estimate_cost(p) bind(C, name='fftwq_estimate_cost') + import + type(C_PTR), value :: p + end function fftwq_estimate_cost + + real(C_DOUBLE) function fftwq_cost(p) bind(C, name='fftwq_cost') + import + type(C_PTR), value :: p + end function fftwq_cost + + integer(C_INT) function fftwq_alignment_of(p) bind(C, name='fftwq_alignment_of') + import + real(16), dimension(*), intent(out) :: p + end function fftwq_alignment_of + + end interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/flops.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/flops.c new file mode 100644 index 000000000..7145ab586 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/flops.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(flops)(const X(plan) p, double *add, double *mul, double *fma) +{ + planner *plnr = X(the_planner)(); + opcnt *o = &p->pln->ops; + *add = o->add; *mul = o->mul; *fma = o->fma; + if (plnr->cost_hook) { + *add = plnr->cost_hook(p->prb, *add, COST_SUM); + *mul = plnr->cost_hook(p->prb, *mul, COST_SUM); + *fma = plnr->cost_hook(p->prb, *fma, COST_SUM); + } +} + +double X(estimate_cost)(const X(plan) p) +{ + return X(iestimate_cost)(X(the_planner)(), p->pln, p->prb); +} + +double X(cost)(const X(plan) p) +{ + return p->pln->pcost; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/forget-wisdom.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/forget-wisdom.c new file mode 100644 index 000000000..09a0e8581 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/forget-wisdom.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +void X(forget_wisdom)(void) +{ + planner *plnr = X(the_planner)(); + plnr->adt->forget(plnr, FORGET_EVERYTHING); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/genf03.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/genf03.pl new file mode 100755 index 000000000..1905d9c4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/genf03.pl @@ -0,0 +1,213 @@ +#!/usr/bin/perl -w +# Generate Fortran 2003 interfaces from a sequence of C function declarations +# of the form (one per line): +# extern (...args...) +# extern (...args...) +# ... +# with no line breaks within a given function. (It's too much work to +# write a general parser, since we just have to handle FFTW's header files.) + +sub canonicalize_type { + my($type); + ($type) = @_; + $type =~ s/ +/ /g; + $type =~ s/^ //; + $type =~ s/ $//; + $type =~ s/([^\* ])\*/$1 \*/g; + return $type; +} + +# C->Fortran map of supported return types +%return_types = ( + "int" => "integer(C_INT)", + "ptrdiff_t" => "integer(C_INTPTR_T)", + "size_t" => "integer(C_SIZE_T)", + "double" => "real(C_DOUBLE)", + "float" => "real(C_FLOAT)", + "long double" => "real(C_LONG_DOUBLE)", + "__float128" => "real(16)", + "fftw_plan" => "type(C_PTR)", + "fftwf_plan" => "type(C_PTR)", + "fftwl_plan" => "type(C_PTR)", + "fftwq_plan" => "type(C_PTR)", + "void *" => "type(C_PTR)", + "char *" => "type(C_PTR)", + "double *" => "type(C_PTR)", + "float *" => "type(C_PTR)", + "long double *" => "type(C_PTR)", + "__float128 *" => "type(C_PTR)", + "fftw_complex *" => "type(C_PTR)", + "fftwf_complex *" => "type(C_PTR)", + "fftwl_complex *" => "type(C_PTR)", + "fftwq_complex *" => "type(C_PTR)", + ); + +# C->Fortran map of supported argument types +%arg_types = ( + "int" => "integer(C_INT), value", + "unsigned" => "integer(C_INT), value", + "size_t" => "integer(C_SIZE_T), value", + "ptrdiff_t" => "integer(C_INTPTR_T), value", + + "fftw_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + "fftwf_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + "fftwl_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + "fftwq_r2r_kind" => "integer(C_FFTW_R2R_KIND), value", + + "double" => "real(C_DOUBLE), value", + "float" => "real(C_FLOAT), value", + "long double" => "real(C_LONG_DOUBLE), value", + "__float128" => "real(16), value", + + "fftw_complex" => "complex(C_DOUBLE_COMPLEX), value", + "fftwf_complex" => "complex(C_DOUBLE_COMPLEX), value", + "fftwl_complex" => "complex(C_LONG_DOUBLE), value", + "fftwq_complex" => "complex(16), value", + + "fftw_plan" => "type(C_PTR), value", + "fftwf_plan" => "type(C_PTR), value", + "fftwl_plan" => "type(C_PTR), value", + "fftwq_plan" => "type(C_PTR), value", + "const fftw_plan" => "type(C_PTR), value", + "const fftwf_plan" => "type(C_PTR), value", + "const fftwl_plan" => "type(C_PTR), value", + "const fftwq_plan" => "type(C_PTR), value", + + "const int *" => "integer(C_INT), dimension(*), intent(in)", + "ptrdiff_t *" => "integer(C_INTPTR_T), intent(out)", + "const ptrdiff_t *" => "integer(C_INTPTR_T), dimension(*), intent(in)", + + "const fftw_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + "const fftwf_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + "const fftwl_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + "const fftwq_r2r_kind *" => "integer(C_FFTW_R2R_KIND), dimension(*), intent(in)", + + "double *" => "real(C_DOUBLE), dimension(*), intent(out)", + "float *" => "real(C_FLOAT), dimension(*), intent(out)", + "long double *" => "real(C_LONG_DOUBLE), dimension(*), intent(out)", + "__float128 *" => "real(16), dimension(*), intent(out)", + + "fftw_complex *" => "complex(C_DOUBLE_COMPLEX), dimension(*), intent(out)", + "fftwf_complex *" => "complex(C_FLOAT_COMPLEX), dimension(*), intent(out)", + "fftwl_complex *" => "complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out)", + "fftwq_complex *" => "complex(16), dimension(*), intent(out)", + + "const fftw_iodim *" => "type(fftw_iodim), dimension(*), intent(in)", + "const fftwf_iodim *" => "type(fftwf_iodim), dimension(*), intent(in)", + "const fftwl_iodim *" => "type(fftwl_iodim), dimension(*), intent(in)", + "const fftwq_iodim *" => "type(fftwq_iodim), dimension(*), intent(in)", + + "const fftw_iodim64 *" => "type(fftw_iodim64), dimension(*), intent(in)", + "const fftwf_iodim64 *" => "type(fftwf_iodim64), dimension(*), intent(in)", + "const fftwl_iodim64 *" => "type(fftwl_iodim64), dimension(*), intent(in)", + "const fftwq_iodim64 *" => "type(fftwq_iodim64), dimension(*), intent(in)", + + "void *" => "type(C_PTR), value", + "FILE *" => "type(C_PTR), value", + + "const char *" => "character(C_CHAR), dimension(*), intent(in)", + + "fftw_write_char_func" => "type(C_FUNPTR), value", + "fftwf_write_char_func" => "type(C_FUNPTR), value", + "fftwl_write_char_func" => "type(C_FUNPTR), value", + "fftwq_write_char_func" => "type(C_FUNPTR), value", + "fftw_read_char_func" => "type(C_FUNPTR), value", + "fftwf_read_char_func" => "type(C_FUNPTR), value", + "fftwl_read_char_func" => "type(C_FUNPTR), value", + "fftwq_read_char_func" => "type(C_FUNPTR), value", + + # Although the MPI standard defines this type as simply "integer", + # if we use integer without a 'C_' kind in a bind(C) interface then + # gfortran complains. Instead, since MPI also requires the C type + # MPI_Fint to match Fortran integers, we use the size of this type + # (extracted by configure and substituted by the Makefile). + "MPI_Comm" => "integer(C_MPI_FINT), value" + ); + +while (<>) { + next if /^ *$/; + if (/^ *extern +([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *\((.*)\) *$/) { + $ret = &canonicalize_type($1); + $name = $2; + + $args = $3; + $args =~ s/^ *void *$//; + + $bad = ($ret ne "void") && !exists($return_types{$ret}); + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $bad = 1 if !exists($arg_types{$argtype}); + } + if ($bad) { + print "! Unable to generate Fortran interface for $name\n"; + next; + } + + # any function taking an MPI_Comm arg needs a C wrapper (grr). + if ($args =~ /MPI_Comm/) { + $cname = $name . "_f03"; + } + else { + $cname = $name; + } + + # Fortran has a 132-character line-length limit by default (grr) + $len = 0; + + print " "; $len = $len + length(" "); + if ($ret eq "void") { + $kind = "subroutine" + } + else { + print "$return_types{$ret} "; + $len = $len + length("$return_types{$ret} "); + $kind = "function" + } + print "$kind $name("; $len = $len + length("$kind $name("); + $len0 = $len; + + $argnames = $args; + $argnames =~ s/([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) */$2/g; + $comma = ""; + foreach $argname (split(/ *, */, $argnames)) { + if ($len + length("$comma$argname") + 3 > 132) { + printf ", &\n%*s", $len0, ""; + $len = $len0; + $comma = ""; + } + print "$comma$argname"; + $len = $len + length("$comma$argname"); + $comma = ","; + } + print ") "; $len = $len + 2; + + if ($len + length("bind(C, name='$cname')") > 132) { + printf "&\n%*s", $len0 - length("$name("), ""; + } + print "bind(C, name='$cname')\n"; + + print " import\n"; + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $argname = $2; + $ftype = $arg_types{$argtype}; + + # Various special cases for argument types: + if ($name =~ /_flops$/ && $argtype eq "double *") { + $ftype = "real(C_DOUBLE), intent(out)" + } + if ($name =~ /_execute/ && ($argname eq "ri" || + $argname eq "ii" || + $argname eq "in")) { + $ftype =~ s/intent\(out\)/intent(inout)/; + } + + print " $ftype :: $argname\n" + } + + print " end $kind $name\n"; + print " \n"; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/guru.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/guru.h new file mode 100644 index 000000000..c54262da0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/guru.h @@ -0,0 +1,4 @@ +#define XGURU(name) X(plan_guru_ ## name) +#define IODIM X(iodim) +#define MKTENSOR_IODIMS X(mktensor_iodims) +#define GURU_KOSHERP X(guru_kosherp) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/guru64.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/guru64.h new file mode 100644 index 000000000..376ef2d23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/guru64.h @@ -0,0 +1,4 @@ +#define XGURU(name) X(plan_guru64_ ## name) +#define IODIM X(iodim64) +#define MKTENSOR_IODIMS X(mktensor_iodims64) +#define GURU_KOSHERP X(guru64_kosherp) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-system-wisdom.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-system-wisdom.c new file mode 100644 index 000000000..b30521a87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-system-wisdom.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +#if defined(FFTW_SINGLE) +# define WISDOM_NAME "wisdomf" +#elif defined(FFTW_LDOUBLE) +# define WISDOM_NAME "wisdoml" +#else +# define WISDOM_NAME "wisdom" +#endif + +/* OS-specific configuration-file directory */ +#if defined(__DJGPP__) +# define WISDOM_DIR "/dev/env/DJDIR/etc/fftw/" +#else +# define WISDOM_DIR "/etc/fftw/" +#endif + +int X(import_system_wisdom)(void) +{ +#if defined(__WIN32__) || defined(WIN32) || defined(_WINDOWS) + return 0; /* TODO? */ +#else + + FILE *f; + f = fopen(WISDOM_DIR WISDOM_NAME, "r"); + if (f) { + int ret = X(import_wisdom_from_file)(f); + fclose(f); + return ret; + } else + return 0; +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom-from-file.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom-from-file.c new file mode 100644 index 000000000..f6b293c15 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom-from-file.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include + +/* getc()/putc() are *unbelievably* slow on linux. Looks like glibc + is grabbing a lock for each call to getc()/putc(), or something + like that. You pay the price for these idiotic posix threads + whether you use them or not. + + So, we do our own buffering. This completely defeats the purpose + of having stdio in the first place, of course. +*/ + +#define BUFSZ 256 + +typedef struct { + scanner super; + FILE *f; + char buf[BUFSZ]; + char *bufr, *bufw; +} S; + +static int getchr_file(scanner * sc_) +{ + S *sc = (S *) sc_; + + if (sc->bufr >= sc->bufw) { + sc->bufr = sc->buf; + sc->bufw = sc->buf + fread(sc->buf, 1, BUFSZ, sc->f); + if (sc->bufr >= sc->bufw) + return EOF; + } + + return *(sc->bufr++); +} + +static scanner *mkscanner_file(FILE *f) +{ + S *sc = (S *) X(mkscanner)(sizeof(S), getchr_file); + sc->f = f; + sc->bufr = sc->bufw = sc->buf; + return &sc->super; +} + +int X(import_wisdom_from_file)(FILE *input_file) +{ + scanner *s = mkscanner_file(input_file); + planner *plnr = X(the_planner)(); + int ret = plnr->adt->imprt(plnr, s); + X(scanner_destroy)(s); + return ret; +} + +int X(import_wisdom_from_filename)(const char *filename) +{ + FILE *f = fopen(filename, "r"); + int ret; + if (!f) return 0; /* error opening file */ + ret = X(import_wisdom_from_file)(f); + if (fclose(f)) ret = 0; /* error closing file */ + return ret; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom-from-string.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom-from-string.c new file mode 100644 index 000000000..9eb3a0b94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom-from-string.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + scanner super; + const char *s; +} S_str; + +static int getchr_str(scanner * sc_) +{ + S_str *sc = (S_str *) sc_; + if (!*sc->s) + return EOF; + return *sc->s++; +} + +static scanner *mkscanner_str(const char *s) +{ + S_str *sc = (S_str *) X(mkscanner)(sizeof(S_str), getchr_str); + sc->s = s; + return &sc->super; +} + +int X(import_wisdom_from_string)(const char *input_string) +{ + scanner *s = mkscanner_str(input_string); + planner *plnr = X(the_planner)(); + int ret = plnr->adt->imprt(plnr, s); + X(scanner_destroy)(s); + return ret; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom.c new file mode 100644 index 000000000..834fc0481 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/import-wisdom.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + scanner super; + int (*read_char)(void *); + void *data; +} S; + +static int getchr_generic(scanner * s_) +{ + S *s = (S *) s_; + return (s->read_char)(s->data); +} + +int X(import_wisdom)(int (*read_char)(void *), void *data) +{ + S *s = (S *) X(mkscanner)(sizeof(S), getchr_generic); + planner *plnr = X(the_planner)(); + int ret; + + s->read_char = read_char; + s->data = data; + ret = plnr->adt->imprt(plnr, (scanner *) s); + X(scanner_destroy)((scanner *) s); + return ret; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/malloc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/malloc.c new file mode 100644 index 000000000..3994b4a69 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/malloc.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + + +void *X(malloc)(size_t n) +{ + return X(kernel_malloc)(n); +} + +void X(free)(void *p) +{ + X(kernel_free)(p); +} + +/* The following two routines are mainly for the convenience of + the Fortran 2003 API, although C users may find them convienent + as well. The problem is that, although Fortran 2003 has a + c_sizeof intrinsic that is equivalent to sizeof, it is broken + in some gfortran versions, and in any case is a bit unnatural + in a Fortran context. So we provide routines to allocate real + and complex arrays, which are all that are really needed by FFTW. */ + +R *X(alloc_real)(size_t n) +{ + return (R *) X(malloc)(sizeof(R) * n); +} + +C *X(alloc_complex)(size_t n) +{ + return (C *) X(malloc)(sizeof(C) * n); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/map-r2r-kind.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/map-r2r-kind.c new file mode 100644 index 000000000..c17c69e43 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/map-r2r-kind.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +rdft_kind *X(map_r2r_kind)(int rank, const X(r2r_kind) * kind) +{ + int i; + rdft_kind *k; + + A(FINITE_RNK(rank)); + k = (rdft_kind *) MALLOC((unsigned)rank * sizeof(rdft_kind), PROBLEMS); + for (i = 0; i < rank; ++i) { + rdft_kind m; + switch (kind[i]) { + case FFTW_R2HC: m = R2HC; break; + case FFTW_HC2R: m = HC2R; break; + case FFTW_DHT: m = DHT; break; + case FFTW_REDFT00: m = REDFT00; break; + case FFTW_REDFT01: m = REDFT01; break; + case FFTW_REDFT10: m = REDFT10; break; + case FFTW_REDFT11: m = REDFT11; break; + case FFTW_RODFT00: m = RODFT00; break; + case FFTW_RODFT01: m = RODFT01; break; + case FFTW_RODFT10: m = RODFT10; break; + case FFTW_RODFT11: m = RODFT11; break; + default: m = R2HC; A(0); + } + k[i] = m; + } + return k; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mapflags.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mapflags.c new file mode 100644 index 000000000..de8d8df77 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mapflags.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include + +/* a flag operation: x is either a flag, in which case xm == 0, or + a mask, in which case xm == x; using this we can compactly code + the various bit operations via (flags & x) ^ xm or (flags | x) ^ xm. */ +typedef struct { + unsigned x, xm; +} flagmask; + +typedef struct { + flagmask flag; + flagmask op; +} flagop; + +#define FLAGP(f, msk)(((f) & (msk).x) ^ (msk).xm) +#define OP(f, msk)(((f) | (msk).x) ^ (msk).xm) + +#define YES(x) {x, 0} +#define NO(x) {x, x} +#define IMPLIES(predicate, consequence) { predicate, consequence } +#define EQV(a, b) IMPLIES(YES(a), YES(b)), IMPLIES(NO(a), NO(b)) +#define NEQV(a, b) IMPLIES(YES(a), NO(b)), IMPLIES(NO(a), YES(b)) + +static void map_flags(unsigned *iflags, unsigned *oflags, + const flagop flagmap[], size_t nmap) +{ + size_t i; + for (i = 0; i < nmap; ++i) + if (FLAGP(*iflags, flagmap[i].flag)) + *oflags = OP(*oflags, flagmap[i].op); +} + +/* encoding of the planner timelimit into a BITS_FOR_TIMELIMIT-bits + nonnegative integer, such that we can still view the integer as + ``impatience'': higher means *lower* time limit, and 0 is the + highest possible value (about 1 year of calendar time) */ +static unsigned timelimit_to_flags(double timelimit) +{ + const double tmax = 365 * 24 * 3600; + const double tstep = 1.05; + const int nsteps = (1 << BITS_FOR_TIMELIMIT); + int x; + + if (timelimit < 0 || timelimit >= tmax) + return 0; + if (timelimit <= 1.0e-10) + return nsteps - 1; + + x = (int) (0.5 + (log(tmax / timelimit) / log(tstep))); + + if (x < 0) x = 0; + if (x >= nsteps) x = nsteps - 1; + return x; +} + +void X(mapflags)(planner *plnr, unsigned flags) +{ + unsigned l, u, t; + + /* map of api flags -> api flags, to implement consistency rules + and combination flags */ + const flagop self_flagmap[] = { + /* in some cases (notably for halfcomplex->real transforms), + DESTROY_INPUT is the default, so we need to support + an inverse flag to disable it. + + (PRESERVE, DESTROY) -> (PRESERVE, DESTROY) + (0, 0) (1, 0) + (0, 1) (0, 1) + (1, 0) (1, 0) + (1, 1) (1, 0) + */ + IMPLIES(YES(FFTW_PRESERVE_INPUT), NO(FFTW_DESTROY_INPUT)), + IMPLIES(NO(FFTW_DESTROY_INPUT), YES(FFTW_PRESERVE_INPUT)), + + IMPLIES(YES(FFTW_EXHAUSTIVE), YES(FFTW_PATIENT)), + + IMPLIES(YES(FFTW_ESTIMATE), NO(FFTW_PATIENT)), + IMPLIES(YES(FFTW_ESTIMATE), + YES(FFTW_ESTIMATE_PATIENT + | FFTW_NO_INDIRECT_OP + | FFTW_ALLOW_PRUNING)), + + IMPLIES(NO(FFTW_EXHAUSTIVE), + YES(FFTW_NO_SLOW)), + + /* a canonical set of fftw2-like impatience flags */ + IMPLIES(NO(FFTW_PATIENT), + YES(FFTW_NO_VRECURSE + | FFTW_NO_RANK_SPLITS + | FFTW_NO_VRANK_SPLITS + | FFTW_NO_NONTHREADED + | FFTW_NO_DFT_R2HC + | FFTW_NO_FIXED_RADIX_LARGE_N + | FFTW_BELIEVE_PCOST)) + }; + + /* map of (processed) api flags to internal problem/planner flags */ + const flagop l_flagmap[] = { + EQV(FFTW_PRESERVE_INPUT, NO_DESTROY_INPUT), + EQV(FFTW_NO_SIMD, NO_SIMD), + EQV(FFTW_CONSERVE_MEMORY, CONSERVE_MEMORY), + EQV(FFTW_NO_BUFFERING, NO_BUFFERING), + NEQV(FFTW_ALLOW_LARGE_GENERIC, NO_LARGE_GENERIC) + }; + + const flagop u_flagmap[] = { + IMPLIES(YES(FFTW_EXHAUSTIVE), NO(0xFFFFFFFF)), + IMPLIES(NO(FFTW_EXHAUSTIVE), YES(NO_UGLY)), + + /* the following are undocumented, "beyond-guru" flags that + require some understanding of FFTW internals */ + EQV(FFTW_ESTIMATE_PATIENT, ESTIMATE), + EQV(FFTW_ALLOW_PRUNING, ALLOW_PRUNING), + EQV(FFTW_BELIEVE_PCOST, BELIEVE_PCOST), + EQV(FFTW_NO_DFT_R2HC, NO_DFT_R2HC), + EQV(FFTW_NO_NONTHREADED, NO_NONTHREADED), + EQV(FFTW_NO_INDIRECT_OP, NO_INDIRECT_OP), + EQV(FFTW_NO_RANK_SPLITS, NO_RANK_SPLITS), + EQV(FFTW_NO_VRANK_SPLITS, NO_VRANK_SPLITS), + EQV(FFTW_NO_VRECURSE, NO_VRECURSE), + EQV(FFTW_NO_SLOW, NO_SLOW), + EQV(FFTW_NO_FIXED_RADIX_LARGE_N, NO_FIXED_RADIX_LARGE_N) + }; + + map_flags(&flags, &flags, self_flagmap, NELEM(self_flagmap)); + + l = u = 0; + map_flags(&flags, &l, l_flagmap, NELEM(l_flagmap)); + map_flags(&flags, &u, u_flagmap, NELEM(u_flagmap)); + + /* enforce l <= u */ + PLNR_L(plnr) = l; + PLNR_U(plnr) = u | l; + + /* assert that the conversion didn't lose bits */ + A(PLNR_L(plnr) == l); + A(PLNR_U(plnr) == (u | l)); + + /* compute flags representation of the timelimit */ + t = timelimit_to_flags(plnr->timelimit); + + PLNR_TIMELIMIT_IMPATIENCE(plnr) = t; + A(PLNR_TIMELIMIT_IMPATIENCE(plnr) == t); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mkprinter-file.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mkprinter-file.c new file mode 100644 index 000000000..df44b2fa2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mkprinter-file.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include + +#define BUFSZ 256 + +typedef struct { + printer super; + FILE *f; + char buf[BUFSZ]; + char *bufw; +} P; + +static void myflush(P *p) +{ + fwrite(p->buf, 1, p->bufw - p->buf, p->f); + p->bufw = p->buf; +} + +static void myputchr(printer *p_, char c) +{ + P *p = (P *) p_; + if (p->bufw >= p->buf + BUFSZ) + myflush(p); + *p->bufw++ = c; +} + +static void mycleanup(printer *p_) +{ + P *p = (P *) p_; + myflush(p); +} + +printer *X(mkprinter_file)(FILE *f) +{ + P *p = (P *) X(mkprinter)(sizeof(P), myputchr, mycleanup); + p->f = f; + p->bufw = p->buf; + return &p->super; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mkprinter-str.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mkprinter-str.c new file mode 100644 index 000000000..142fd62cf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mkprinter-str.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +typedef struct { + printer super; + size_t *cnt; +} P_cnt; + +static void putchr_cnt(printer * p_, char c) +{ + P_cnt *p = (P_cnt *) p_; + UNUSED(c); + ++*p->cnt; +} + +printer *X(mkprinter_cnt)(size_t *cnt) +{ + P_cnt *p = (P_cnt *) X(mkprinter)(sizeof(P_cnt), putchr_cnt, 0); + p->cnt = cnt; + *cnt = 0; + return &p->super; +} + +typedef struct { + printer super; + char *s; +} P_str; + +static void putchr_str(printer * p_, char c) +{ + P_str *p = (P_str *) p_; + *p->s++ = c; + *p->s = 0; +} + +printer *X(mkprinter_str)(char *s) +{ + P_str *p = (P_str *) X(mkprinter)(sizeof(P_str), putchr_str, 0); + p->s = s; + *s = 0; + return &p->super; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims.c new file mode 100644 index 000000000..ae5924ec6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "mktensor-iodims.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims.h new file mode 100644 index 000000000..cdedd392f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +tensor *MKTENSOR_IODIMS(int rank, const IODIM *dims, int is, int os) +{ + int i; + tensor *x = X(mktensor)(rank); + + if (FINITE_RNK(rank)) { + for (i = 0; i < rank; ++i) { + x->dims[i].n = dims[i].n; + x->dims[i].is = dims[i].is * is; + x->dims[i].os = dims[i].os * os; + } + } + return x; +} + +static int iodims_kosherp(int rank, const IODIM *dims, int allow_minfty) +{ + int i; + + if (rank < 0) return 0; + + if (allow_minfty) { + if (!FINITE_RNK(rank)) return 1; + for (i = 0; i < rank; ++i) + if (dims[i].n < 0) return 0; + } else { + if (!FINITE_RNK(rank)) return 0; + for (i = 0; i < rank; ++i) + if (dims[i].n <= 0) return 0; + } + + return 1; +} + +int GURU_KOSHERP(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims) +{ + return (iodims_kosherp(rank, dims, 0) && + iodims_kosherp(howmany_rank, howmany_dims, 1)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims64.c new file mode 100644 index 000000000..df5b4e03c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-iodims64.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "mktensor-iodims.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-rowmajor.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-rowmajor.c new file mode 100644 index 000000000..d470356af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/mktensor-rowmajor.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +tensor *X(mktensor_rowmajor)(int rnk, const int *n, + const int *niphys, const int *nophys, + int is, int os) +{ + tensor *x = X(mktensor)(rnk); + + if (FINITE_RNK(rnk) && rnk > 0) { + int i; + + A(n && niphys && nophys); + x->dims[rnk - 1].is = is; + x->dims[rnk - 1].os = os; + x->dims[rnk - 1].n = n[rnk - 1]; + for (i = rnk - 1; i > 0; --i) { + x->dims[i - 1].is = x->dims[i].is * niphys[i]; + x->dims[i - 1].os = x->dims[i].os * nophys[i]; + x->dims[i - 1].n = n[i - 1]; + } + } + return x; +} + +static int rowmajor_kosherp(int rnk, const int *n) +{ + int i; + + if (!FINITE_RNK(rnk)) return 0; + if (rnk < 0) return 0; + + for (i = 0; i < rnk; ++i) + if (n[i] <= 0) return 0; + + return 1; +} + +int X(many_kosherp)(int rnk, const int *n, int howmany) +{ + return (howmany >= 0) && rowmajor_kosherp(rnk, n); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-1d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-1d.c new file mode 100644 index 000000000..d18e08e07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-1d.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) X(plan_dft_1d)(int n, C *in, C *out, int sign, unsigned flags) +{ + return X(plan_dft)(1, &n, in, out, sign, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-2d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-2d.c new file mode 100644 index 000000000..53c68cd20 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-2d.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) X(plan_dft_2d)(int nx, int ny, C *in, C *out, int sign, unsigned flags) +{ + int n[2]; + n[0] = nx; + n[1] = ny; + return X(plan_dft)(2, n, in, out, sign, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-3d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-3d.c new file mode 100644 index 000000000..37e9fafac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-3d.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) X(plan_dft_3d)(int nx, int ny, int nz, + C *in, C *out, int sign, unsigned flags) +{ + int n[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + return X(plan_dft)(3, n, in, out, sign, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-1d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-1d.c new file mode 100644 index 000000000..c0f6ba035 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-1d.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r_1d)(int n, C *in, R *out, unsigned flags) +{ + return X(plan_dft_c2r)(1, &n, in, out, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-2d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-2d.c new file mode 100644 index 000000000..e9dda3681 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-2d.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r_2d)(int nx, int ny, C *in, R *out, unsigned flags) +{ + int n[2]; + n[0] = nx; + n[1] = ny; + return X(plan_dft_c2r)(2, n, in, out, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-3d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-3d.c new file mode 100644 index 000000000..be9dc9a92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r-3d.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r_3d)(int nx, int ny, int nz, + C *in, R *out, unsigned flags) +{ + int n[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + return X(plan_dft_c2r)(3, n, in, out, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r.c new file mode 100644 index 000000000..00043a14b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-c2r.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_c2r)(int rank, const int *n, C *in, R *out, unsigned flags) +{ + return X(plan_many_dft_c2r)(rank, n, 1, + in, 0, 1, 1, out, 0, 1, 1, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-1d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-1d.c new file mode 100644 index 000000000..63b0db36f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-1d.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c_1d)(int n, R *in, C *out, unsigned flags) +{ + return X(plan_dft_r2c)(1, &n, in, out, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-2d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-2d.c new file mode 100644 index 000000000..43000b370 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-2d.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c_2d)(int nx, int ny, R *in, C *out, unsigned flags) +{ + int n[2]; + n[0] = nx; + n[1] = ny; + return X(plan_dft_r2c)(2, n, in, out, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-3d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-3d.c new file mode 100644 index 000000000..1cd5b647e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c-3d.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c_3d)(int nx, int ny, int nz, + R *in, C *out, unsigned flags) +{ + int n[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + return X(plan_dft_r2c)(3, n, in, out, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c.c new file mode 100644 index 000000000..0b194590b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft-r2c.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft_r2c)(int rank, const int *n, R *in, C *out, unsigned flags) +{ + return X(plan_many_dft_r2c)(rank, n, 1, + in, 0, 1, 1, + out, 0, 1, 1, + flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft.c new file mode 100644 index 000000000..921af7181 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-dft.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_dft)(int rank, const int *n, + C *in, C *out, int sign, unsigned flags) +{ + return X(plan_many_dft)(rank, n, 1, + in, 0, 1, 1, + out, 0, 1, 1, + sign, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-c2r.c new file mode 100644 index 000000000..00226e995 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-dft-c2r.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-c2r.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-c2r.h new file mode 100644 index 000000000..30879d6d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-c2r.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(dft_c2r)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + C *in, R *out, unsigned flags) +{ + R *ri, *ii; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + EXTRACT_REIM(FFT_SIGN, in, &ri, &ii); + + if (out != ri) + flags |= FFTW_DESTROY_INPUT; + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 2, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 2, 1), + TAINT_UNALIGNED(out, flags), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), HC2R)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-r2c.c new file mode 100644 index 000000000..a88945f11 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-dft-r2c.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-r2c.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-r2c.h new file mode 100644 index 000000000..429769623 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft-r2c.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(dft_r2c)(int rank, const IODIM *dims, + int howmany_rank, + const IODIM *howmany_dims, + R *in, C *out, unsigned flags) +{ + R *ro, *io; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + EXTRACT_REIM(FFT_SIGN, out, &ro, &io); + + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 1, 2), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 1, 2), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags), R2HC)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft.c new file mode 100644 index 000000000..85873da61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-dft.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft.h new file mode 100644 index 000000000..9e7c836a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-dft.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) XGURU(dft)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + C *in, C *out, int sign, unsigned flags) +{ + R *ri, *ii, *ro, *io; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + EXTRACT_REIM(sign, in, &ri, &ii); + EXTRACT_REIM(sign, out, &ro, &io); + + return X(mkapiplan)( + sign, flags, + X(mkproblem_dft_d)(MKTENSOR_IODIMS(rank, dims, 2, 2), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, + 2, 2), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-r2r.c new file mode 100644 index 000000000..c6ebaed30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-r2r.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-r2r.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-r2r.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-r2r.h new file mode 100644 index 000000000..baf1048f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-r2r.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(r2r)(int rank, const IODIM *dims, + int howmany_rank, + const IODIM *howmany_dims, + R *in, R *out, + const X(r2r_kind) * kind, unsigned flags) +{ + X(plan) p; + rdft_kind *k; + + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + k = X(map_r2r_kind)(rank, kind); + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft_d)(MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, + 1, 1), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(out, flags), k)); + X(ifree0)(k); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-c2r.c new file mode 100644 index 000000000..2831f024e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-split-dft-c2r.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-c2r.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-c2r.h new file mode 100644 index 000000000..69a88034b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-c2r.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(split_dft_c2r)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + R *ri, R *ii, R *out, unsigned flags) +{ + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + if (out != ri) + flags |= FFTW_DESTROY_INPUT; + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 1, 1), + TAINT_UNALIGNED(out, flags), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), HC2R)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-r2c.c new file mode 100644 index 000000000..32cac9ec3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-split-dft-r2c.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-r2c.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-r2c.h new file mode 100644 index 000000000..e095551fa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft-r2c.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) XGURU(split_dft_r2c)(int rank, const IODIM *dims, + int howmany_rank, + const IODIM *howmany_dims, + R *in, R *ro, R *io, unsigned flags) +{ + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + return X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, 1, 1), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags), R2HC)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft.c new file mode 100644 index 000000000..328aa7d90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft.c @@ -0,0 +1,2 @@ +#include "guru.h" +#include "plan-guru-split-dft.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft.h new file mode 100644 index 000000000..0f7a963fb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru-split-dft.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +X(plan) XGURU(split_dft)(int rank, const IODIM *dims, + int howmany_rank, const IODIM *howmany_dims, + R *ri, R *ii, R *ro, R *io, unsigned flags) +{ + if (!GURU_KOSHERP(rank, dims, howmany_rank, howmany_dims)) return 0; + + return X(mkapiplan)( + ii - ri == 1 && io - ro == 1 ? FFT_SIGN : -FFT_SIGN, flags, + X(mkproblem_dft_d)(MKTENSOR_IODIMS(rank, dims, 1, 1), + MKTENSOR_IODIMS(howmany_rank, howmany_dims, + 1, 1), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft-c2r.c new file mode 100644 index 000000000..6e2dddf77 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-dft-c2r.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft-r2c.c new file mode 100644 index 000000000..a9e776c31 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-dft-r2c.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft.c new file mode 100644 index 000000000..5ea218fbd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-dft.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-dft.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-r2r.c new file mode 100644 index 000000000..46012ddcb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-r2r.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-r2r.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft-c2r.c new file mode 100644 index 000000000..f20d12c23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft-c2r.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-split-dft-c2r.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft-r2c.c new file mode 100644 index 000000000..3dfa81a57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft-r2c.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-split-dft-r2c.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft.c new file mode 100644 index 000000000..25b94ae35 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-guru64-split-dft.c @@ -0,0 +1,2 @@ +#include "guru64.h" +#include "plan-guru-split-dft.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft-c2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft-c2r.c new file mode 100644 index 000000000..5f719a6fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft-c2r.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) X(plan_many_dft_c2r)(int rank, const int *n, + int howmany, + C *in, const int *inembed, + int istride, int idist, + R *out, const int *onembed, + int ostride, int odist, unsigned flags) +{ + R *ri, *ii; + int *nfi, *nfo; + int inplace; + X(plan) p; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + EXTRACT_REIM(FFT_SIGN, in, &ri, &ii); + inplace = out == ri; + + if (!inplace) + flags |= FFTW_DESTROY_INPUT; + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + X(mktensor_rowmajor)( + rank, n, + X(rdft2_pad)(rank, n, inembed, inplace, 1, &nfi), + X(rdft2_pad)(rank, n, onembed, inplace, 0, &nfo), + 2 * istride, ostride), + X(mktensor_1d)(howmany, 2 * idist, odist), + TAINT_UNALIGNED(out, flags), + TAINT_UNALIGNED(ri, flags), TAINT_UNALIGNED(ii, flags), + HC2R)); + + X(ifree0)(nfi); + X(ifree0)(nfo); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft-r2c.c new file mode 100644 index 000000000..ad05231d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft-r2c.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +X(plan) X(plan_many_dft_r2c)(int rank, const int *n, + int howmany, + R *in, const int *inembed, + int istride, int idist, + C *out, const int *onembed, + int ostride, int odist, unsigned flags) +{ + R *ro, *io; + int *nfi, *nfo; + int inplace; + X(plan) p; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + EXTRACT_REIM(FFT_SIGN, out, &ro, &io); + inplace = in == ro; + + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft2_d_3pointers)( + X(mktensor_rowmajor)( + rank, n, + X(rdft2_pad)(rank, n, inembed, inplace, 0, &nfi), + X(rdft2_pad)(rank, n, onembed, inplace, 1, &nfo), + istride, 2 * ostride), + X(mktensor_1d)(howmany, idist, 2 * odist), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(ro, flags), TAINT_UNALIGNED(io, flags), + R2HC)); + + X(ifree0)(nfi); + X(ifree0)(nfo); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft.c new file mode 100644 index 000000000..69643cdef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-dft.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "dft/dft.h" + +#define N0(nembed)((nembed) ? (nembed) : n) + +X(plan) X(plan_many_dft)(int rank, const int *n, + int howmany, + C *in, const int *inembed, + int istride, int idist, + C *out, const int *onembed, + int ostride, int odist, int sign, unsigned flags) +{ + R *ri, *ii, *ro, *io; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + EXTRACT_REIM(sign, in, &ri, &ii); + EXTRACT_REIM(sign, out, &ro, &io); + + return + X(mkapiplan)(sign, flags, + X(mkproblem_dft_d)( + X(mktensor_rowmajor)(rank, n, + N0(inembed), N0(onembed), + 2 * istride, 2 * ostride), + X(mktensor_1d)(howmany, 2 * idist, 2 * odist), + TAINT_UNALIGNED(ri, flags), + TAINT_UNALIGNED(ii, flags), + TAINT_UNALIGNED(ro, flags), + TAINT_UNALIGNED(io, flags))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-r2r.c new file mode 100644 index 000000000..6cc7a96f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-many-r2r.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "rdft/rdft.h" + +#define N0(nembed)((nembed) ? (nembed) : n) + +X(plan) X(plan_many_r2r)(int rank, const int *n, + int howmany, + R *in, const int *inembed, + int istride, int idist, + R *out, const int *onembed, + int ostride, int odist, + const X(r2r_kind) * kind, unsigned flags) +{ + X(plan) p; + rdft_kind *k; + + if (!X(many_kosherp)(rank, n, howmany)) return 0; + + k = X(map_r2r_kind)(rank, kind); + p = X(mkapiplan)( + 0, flags, + X(mkproblem_rdft_d)(X(mktensor_rowmajor)(rank, n, + N0(inembed), N0(onembed), + istride, ostride), + X(mktensor_1d)(howmany, idist, odist), + TAINT_UNALIGNED(in, flags), + TAINT_UNALIGNED(out, flags), k)); + X(ifree0)(k); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-1d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-1d.c new file mode 100644 index 000000000..1f7e03314 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-1d.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r_1d)(int n, R *in, R *out, X(r2r_kind) kind, unsigned flags) +{ + return X(plan_r2r)(1, &n, in, out, &kind, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-2d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-2d.c new file mode 100644 index 000000000..3e6004e65 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-2d.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r_2d)(int nx, int ny, R *in, R *out, + X(r2r_kind) kindx, X(r2r_kind) kindy, unsigned flags) +{ + int n[2]; + X(r2r_kind) kind[2]; + n[0] = nx; + n[1] = ny; + kind[0] = kindx; + kind[1] = kindy; + return X(plan_r2r)(2, n, in, out, kind, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-3d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-3d.c new file mode 100644 index 000000000..77ebefc4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r-3d.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r_3d)(int nx, int ny, int nz, + R *in, R *out, X(r2r_kind) kindx, + X(r2r_kind) kindy, X(r2r_kind) kindz, unsigned flags) +{ + int n[3]; + X(r2r_kind) kind[3]; + n[0] = nx; + n[1] = ny; + n[2] = nz; + kind[0] = kindx; + kind[1] = kindy; + kind[2] = kindz; + return X(plan_r2r)(3, n, in, out, kind, flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r.c new file mode 100644 index 000000000..4c4b9dda8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/plan-r2r.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +X(plan) X(plan_r2r)(int rank, const int *n, R *in, R *out, + const X(r2r_kind) * kind, unsigned flags) +{ + return X(plan_many_r2r)(rank, n, 1, in, 0, 1, 1, out, 0, 1, 1, kind, + flags); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/print-plan.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/print-plan.c new file mode 100644 index 000000000..6b3881645 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/print-plan.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +char *X(sprint_plan)(const X(plan) p) +{ + size_t cnt; + char *s; + plan *pln = p->pln; + + printer *pr = X(mkprinter_cnt)(&cnt); + pln->adt->print(pln, pr); + X(printer_destroy)(pr); + + s = (char *) malloc(sizeof(char) * (cnt + 1)); + if (s) { + pr = X(mkprinter_str)(s); + pln->adt->print(pln, pr); + X(printer_destroy)(pr); + } + return s; +} + +void X(fprint_plan)(const X(plan) p, FILE *output_file) +{ + printer *pr = X(mkprinter_file)(output_file); + plan *pln = p->pln; + pln->adt->print(pln, pr); + X(printer_destroy)(pr); +} + +void X(print_plan)(const X(plan) p) +{ + X(fprint_plan)(p, stdout); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/rdft2-pad.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/rdft2-pad.c new file mode 100644 index 000000000..5e1026f6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/rdft2-pad.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include "api/api.h" + +const int *X(rdft2_pad)(int rnk, const int *n, const int *nembed, + int inplace, int cmplx, int **nfree) +{ + A(FINITE_RNK(rnk)); + *nfree = 0; + if (!nembed && rnk > 0) { + if (inplace || cmplx) { + int *np = (int *) MALLOC(sizeof(int) * (unsigned)rnk, PROBLEMS); + memcpy(np, n, sizeof(int) * (unsigned)rnk); + np[rnk - 1] = (n[rnk - 1] / 2 + 1) * (1 + !cmplx); + nembed = *nfree = np; + } else + nembed = n; + } + return nembed; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/the-planner.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/the-planner.c new file mode 100644 index 000000000..0313a2611 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/the-planner.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +static planner *plnr = 0; + +/* create the planner for the rest of the API */ +planner *X(the_planner)(void) +{ + if (!plnr) { + plnr = X(mkplanner)(); + X(configure_planner)(plnr); + } + + return plnr; +} + +void X(cleanup)(void) +{ + if (plnr) { + X(planner_destroy)(plnr); + plnr = 0; + } +} + +void X(set_timelimit)(double tlim) +{ + /* PLNR is not necessarily initialized when this function is + called, so use X(the_planner)() */ + X(the_planner)()->timelimit = tlim; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/version.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/version.c new file mode 100644 index 000000000..4f14de157 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/version.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "api/api.h" + +const char X(cc)[] = FFTW_CC; + +/* fftw <= 3.2.2 had special compiler flags for codelets, which are + not used anymore. We keep this variable around because it is part + of the ABI */ +const char X(codelet_optim)[] = ""; + +const char X(version)[] = PACKAGE "-" PACKAGE_VERSION + +#if HAVE_FMA + "-fma" +#endif + +#if HAVE_SSE2 + "-sse2" +#endif + + /* Earlier versions of FFTW only provided 256-bit AVX, which meant + * it was important to also enable sse2 for best performance for + * short transforms. Since some programs check for this and warn + * the user, we explicitly add avx_128 to the suffix to emphasize + * that this version is more capable. + */ + +#if HAVE_AVX + "-avx" +#endif + +#if HAVE_AVX_128_FMA + "-avx_128_fma" +#endif + +#if HAVE_AVX2 + "-avx2-avx2_128" +#endif + +#if HAVE_AVX512 + "-avx512" +#endif + +#if HAVE_KCVI + "-kcvi" +#endif + +#if HAVE_ALTIVEC + "-altivec" +#endif + +#if HAVE_VSX + "-vsx" +#endif + +#if HAVE_NEON + "-neon" +#endif + +#if defined(HAVE_GENERIC_SIMD128) + "-generic_simd128" +#endif + +#if defined(HAVE_GENERIC_SIMD256) + "-generic_simd256" +#endif + +; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/x77.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/x77.h new file mode 100644 index 000000000..9a1ab8340 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/api/x77.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Fortran-like (e.g. as in BLAS) type prefixes for F77 interface */ +#if defined(FFTW_SINGLE) +# define x77(name) CONCAT(sfftw_, name) +# define X77(NAME) CONCAT(SFFTW_, NAME) +#elif defined(FFTW_LDOUBLE) +/* FIXME: what is best? BLAS uses D..._X, apparently. Ugh. */ +# define x77(name) CONCAT(lfftw_, name) +# define X77(NAME) CONCAT(LFFTW_, NAME) +#elif defined(FFTW_QUAD) +# define x77(name) CONCAT(qfftw_, name) +# define X77(NAME) CONCAT(QFFTW_, NAME) +#else +# define x77(name) CONCAT(dfftw_, name) +# define X77(NAME) CONCAT(DFFTW_, NAME) +#endif + +/* If F77_FUNC is not defined and the user didn't explicitly specify + --disable-fortran, then make our best guess at default wrappers + (since F77_FUNC_EQUIV should not be defined in this case, we + will use both double-underscored g77 wrappers and single- or + non-underscored wrappers). This saves us from dealing with + complaints in the cases where the user failed to specify + an F77 compiler or wrapper detection failed for some reason. */ +#if !defined(F77_FUNC) && !defined(DISABLE_FORTRAN) +# if (defined(_WIN32) || defined(__WIN32__)) && !defined(WINDOWS_F77_MANGLING) +# define WINDOWS_F77_MANGLING 1 +# endif +# if defined(_AIX) || defined(__hpux) || defined(hpux) +# define F77_FUNC(a, A) a +# elif defined(CRAY) || defined(_CRAY) || defined(_UNICOS) +# define F77_FUNC(a, A) A +# else +# define F77_FUNC(a, A) a ## _ +# endif +# define F77_FUNC_(a, A) a ## __ +#endif + +#if defined(WITH_G77_WRAPPERS) && !defined(DISABLE_FORTRAN) +# undef F77_FUNC_ +# define F77_FUNC_(a, A) a ## __ +# undef F77_FUNC_EQUIV +#endif + +/* annoying Windows syntax for shared-library declarations */ +#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__)) +# define FFTW_VOIDFUNC __declspec(dllexport) void +#else +# define FFTW_VOIDFUNC void +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/bootstrap.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/bootstrap.sh new file mode 100755 index 000000000..54dfea9d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/bootstrap.sh @@ -0,0 +1,26 @@ +#! /bin/sh +############################################################################ +# +# NOTE: If you just want to build FFTW, do not use this file. Just use +# the ordinary ./configure && make commmands as described in the installation +# section of the manual. +# +# This file is only for users that want to generate their own codelets, +# as described in the "generating your own code" section of the manual. +# +############################################################################ + +touch ChangeLog + +echo "PLEASE IGNORE WARNINGS AND ERRORS" + +rm -rf autom4te.cache +autoreconf --verbose --install --symlink --force + +rm -f config.cache + +# --enable-maintainer-mode enables build of genfft and automatic +# rebuild of codelets whenever genfft changes +( + ./configure --disable-shared --enable-maintainer-mode --enable-threads $* +) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/cmake.config.h.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/cmake.config.h.in new file mode 100644 index 000000000..1f4c50559 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/cmake.config.h.in @@ -0,0 +1,395 @@ + +/* Define to compile in long-double precision. */ +#cmakedefine BENCHFFT_LDOUBLE 1 + +/* Define to compile in quad precision. */ +#cmakedefine BENCHFFT_QUAD 1 + +/* Define to compile in single precision. */ +#cmakedefine BENCHFFT_SINGLE 1 + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to disable Fortran wrappers. */ +#cmakedefine DISABLE_FORTRAN 1 + +/* Define to dummy `main' function (if any) required to link to the Fortran + libraries. */ +/* #undef F77_DUMMY_MAIN */ + +/* Define to a macro mangling the given C identifier (in lower and upper + case), which must not contain underscores, for linking with Fortran. */ +#define F77_FUNC(name,NAME) name ## _ + +/* As F77_FUNC, but for C identifiers containing underscores. */ +#define F77_FUNC_(name,NAME) name ## _ + +/* Define if F77_FUNC and F77_FUNC_ are equivalent. */ +#define F77_FUNC_EQUIV 1 + +/* Define if F77 and FC dummy `main' functions are identical. */ +/* #undef FC_DUMMY_MAIN_EQ_F77 */ + +/* C compiler name and flags */ +#define FFTW_CC "@CMAKE_C_COMPILER@" + +/* Define to enable extra FFTW debugging code. */ +/* #undef FFTW_DEBUG */ + +/* Define to enable the use of alloca(). */ +#define FFTW_ENABLE_ALLOCA 1 + +/* Define to compile in long-double precision. */ +#cmakedefine FFTW_LDOUBLE 1 + +/* Define to compile in quad precision. */ +#cmakedefine FFTW_QUAD 1 + +/* Define to enable pseudorandom estimate planning for debugging. */ +/* #undef FFTW_RANDOM_ESTIMATOR */ + +/* Define to compile in single precision. */ +#cmakedefine FFTW_SINGLE 1 + +/* Define to 1 if you have the `abort' function. */ +#define HAVE_ABORT 1 + +/* Define to 1 if you have `alloca', as a function or macro. */ +#cmakedefine HAVE_ALLOCA 1 + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#cmakedefine HAVE_ALLOCA_H 1 + +/* Define to enable Altivec optimizations. */ +/* #undef HAVE_ALTIVEC */ + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_ALTIVEC_H 1 + +/* Define if you have enabled the cycle counter on ARMv8 */ +/* #undef HAVE_ARMV8CC */ + +/* Define to enable AVX optimizations. */ +#cmakedefine HAVE_AVX 1 + +/* Define to enable AVX2 optimizations. */ +#cmakedefine HAVE_AVX2 1 + +/* Define to enable AVX512 optimizations. */ +/* #undef HAVE_AVX512 */ + +/* Define to enable 128-bit FMA AVX optimization */ +/* #undef HAVE_AVX_128_FMA */ + +/* Define to 1 if you have the `BSDgettimeofday' function. */ +/* #undef HAVE_BSDGETTIMEOFDAY */ + +/* Define to 1 if you have the `clock_gettime' function. */ +#cmakedefine01 HAVE_CLOCK_GETTIME + +/* Define to 1 if you have the `cosl' function. */ +#cmakedefine HAVE_COSL 1 + +/* Define to 1 if you have the declaration of `cosl', and to 0 if you don't. + */ +#cmakedefine01 HAVE_DECL_COSL + +/* Define to 1 if you have the declaration of `cosq', and to 0 if you don't. + */ +#cmakedefine01 HAVE_DECL_COSQ + +/* Define to 1 if you have the declaration of `drand48', and to 0 if you + don't. */ +#cmakedefine01 HAVE_DECL_DRAND48 + +/* Define to 1 if you have the declaration of `memalign', and to 0 if you + don't. */ +#cmakedefine01 HAVE_DECL_MEMALIGN + +/* Define to 1 if you have the declaration of `posix_memalign', and to 0 if + you don't. */ +#cmakedefine01 HAVE_DECL_POSIX_MEMALIGN + +/* Define to 1 if you have the declaration of `sinl', and to 0 if you don't. + */ +#cmakedefine01 HAVE_DECL_SINL + +/* Define to 1 if you have the declaration of `sinq', and to 0 if you don't. + */ +#cmakedefine01 HAVE_DECL_SINQ + +/* Define to 1 if you have the declaration of `srand48', and to 0 if you + don't. */ +#cmakedefine01 HAVE_DECL_SRAND48 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_DLFCN_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Define to 1 if you have the `drand48' function. */ +#cmakedefine HAVE_DRAND48 1 + +/* Define if you have a machine with fused multiply-add */ +/* #undef HAVE_FMA */ + +/* Define to enable generic (gcc) 128-bit SIMD optimizations. */ +/* #undef HAVE_GENERIC_SIMD128 */ + +/* Define to enable generic (gcc) 256-bit SIMD optimizations. */ +/* #undef HAVE_GENERIC_SIMD256 */ + +/* Define to 1 if you have the `gethrtime' function. */ +/* #undef HAVE_GETHRTIME */ + +/* Define to 1 if you have the `getpagesize' function. */ +#cmakedefine HAVE_GETPAGESIZE 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#cmakedefine HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if hrtime_t is defined in */ +/* #undef HAVE_HRTIME_T */ + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_INTTYPES_H 1 + +/* Define if the isnan() function/macro is available. */ +#cmakedefine HAVE_ISNAN 1 + +/* Define to enable KCVI optimizations. */ +/* #undef HAVE_KCVI */ + +/* Define to 1 if you have the `m' library (-lm). */ +#cmakedefine HAVE_LIBM 1 + +/* Define to 1 if you have the `quadmath' library (-lquadmath). */ +/* #undef HAVE_LIBQUADMATH */ + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LIMITS_H 1 + +/* Define to 1 if the compiler supports `long double' */ +#define HAVE_LONG_DOUBLE 1 + +/* Define to 1 if you have the `mach_absolute_time' function. */ +#cmakedefine HAVE_MACH_ABSOLUTE_TIME 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memalign' function. */ +#cmakedefine HAVE_MEMALIGN 1 + +/* Define to 1 if you have the `memmove' function. */ +#cmakedefine HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to enable use of MIPS ZBus cycle-counter. */ +/* #undef HAVE_MIPS_ZBUS_TIMER */ + +/* Define if you have the MPI library. */ +/* #undef HAVE_MPI */ + +/* Define to enable ARM NEON optimizations. */ +/* #undef HAVE_NEON */ + +/* Define if OpenMP is enabled */ +#cmakedefine HAVE_OPENMP + +/* Define to 1 if you have the `posix_memalign' function. */ +#cmakedefine HAVE_POSIX_MEMALIGN 1 + +/* Define if you have POSIX threads libraries and header files. */ +/* #undef HAVE_PTHREAD */ + +/* Define to 1 if you have the `read_real_time' function. */ +/* #undef HAVE_READ_REAL_TIME */ + +/* Define to 1 if you have the `sinl' function. */ +#cmakedefine HAVE_SINL 1 + +/* Define to 1 if you have the `snprintf' function. */ +#cmakedefine HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `sqrt' function. */ +#define HAVE_SQRT 1 + +/* Define to enable SSE/SSE2 optimizations. */ +#cmakedefine HAVE_SSE2 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_STRING_H 1 + +/* Define to 1 if you have the `sysctl' function. */ +#cmakedefine HAVE_SYSCTL 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the `tanl' function. */ +/* #undef HAVE_TANL */ + +/* Define if we have a threads library. */ +#cmakedefine HAVE_THREADS 1 + +/* Define to 1 if you have the `time_base_to_time' function. */ +/* #undef HAVE_TIME_BASE_TO_TIME */ + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to enable IBM VSX optimizations. */ +/* #undef HAVE_VSX */ + +/* Define if you have the UNICOS _rtc() intrinsic. */ +/* #undef HAVE__RTC */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "fftw" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "fftw@fftw.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "fftw" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "fftw @FFTW_VERSION@" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "fftw" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@FFTW_VERSION@" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE @SIZEOF_DOUBLE@ + +/* The size of `fftw_r2r_kind', as computed by sizeof. */ +#define SIZEOF_FFTW_R2R_KIND 4 + +/* The size of `float', as computed by sizeof. */ +#define SIZEOF_FLOAT @SIZEOF_FLOAT@ + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT @SIZEOF_INT@ + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG @SIZEOF_LONG@ + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG @SIZEOF_LONG_LONG@ + +/* The size of `MPI_Fint', as computed by sizeof. */ +/* #undef SIZEOF_MPI_FINT */ + +/* The size of `ptrdiff_t', as computed by sizeof. */ +#define SIZEOF_PTRDIFF_T @SIZEOF_PTRDIFF_T@ + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@ + +/* The size of `unsigned int', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_INT @SIZEOF_UNSIGNED_INT@ + +/* The size of `unsigned long', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_LONG @SIZEOF_UNSIGNED_LONG@ + +/* The size of `unsigned long long', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_LONG_LONG @SIZEOF_UNSIGNED_LONG_LONG@ + +/* The size of `void *', as computed by sizeof. */ +#define SIZEOF_VOID_P @CMAKE_SIZEOF_VOID_P@ + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#cmakedefine TIME_WITH_SYS_TIME 1 + +/* Define if we have and are using POSIX threads. */ +#cmakedefine USING_POSIX_THREADS 1 + +/* Version number of package */ +#define VERSION "@FFTW_VERSION@" + +/* Use common Windows Fortran mangling styles for the Fortran interfaces. */ +/* #undef WINDOWS_F77_MANGLING */ + +/* Include g77-compatible wrappers in addition to any other Fortran wrappers. + */ +#cmakedefine WITH_G77_WRAPPERS 1 + +/* Use our own aligned malloc routine; mainly helpful for Windows systems + lacking aligned allocation system-library routines. */ +/* #undef WITH_OUR_MALLOC */ + +/* Use low-precision timers, making planner very slow */ +/* #undef WITH_SLOW_TIMER */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/compile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/compile new file mode 100755 index 000000000..a85b723c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.guess b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.guess new file mode 100755 index 000000000..2e9ad7fe8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.guess @@ -0,0 +1,1462 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2016 Free Software Foundation, Inc. + +timestamp='2016-10-02' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2016 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = hppa2.0w ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +cat >&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.h.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.h.in new file mode 100644 index 000000000..01ea4ca61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.h.in @@ -0,0 +1,443 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if the machine architecture "naturally" prefers fused multiply-add + instructions */ +#undef ARCH_PREFERS_FMA + +/* Define to compile in long-double precision. */ +#undef BENCHFFT_LDOUBLE + +/* Define to compile in quad precision. */ +#undef BENCHFFT_QUAD + +/* Define to compile in single precision. */ +#undef BENCHFFT_SINGLE + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to disable Fortran wrappers. */ +#undef DISABLE_FORTRAN + +/* Define to dummy `main' function (if any) required to link to the Fortran + libraries. */ +#undef F77_DUMMY_MAIN + +/* Define to a macro mangling the given C identifier (in lower and upper + case), which must not contain underscores, for linking with Fortran. */ +#undef F77_FUNC + +/* As F77_FUNC, but for C identifiers containing underscores. */ +#undef F77_FUNC_ + +/* Define if F77_FUNC and F77_FUNC_ are equivalent. */ +#undef F77_FUNC_EQUIV + +/* Define if F77 and FC dummy `main' functions are identical. */ +#undef FC_DUMMY_MAIN_EQ_F77 + +/* C compiler name and flags */ +#undef FFTW_CC + +/* Define to enable extra FFTW debugging code. */ +#undef FFTW_DEBUG + +/* Define to enable the use of alloca(). */ +#undef FFTW_ENABLE_ALLOCA + +/* Define to compile in long-double precision. */ +#undef FFTW_LDOUBLE + +/* Define to compile in quad precision. */ +#undef FFTW_QUAD + +/* Define to enable pseudorandom estimate planning for debugging. */ +#undef FFTW_RANDOM_ESTIMATOR + +/* Define to compile in single precision. */ +#undef FFTW_SINGLE + +/* Define to 1 if you have the `abort' function. */ +#undef HAVE_ABORT + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* Define to enable Altivec optimizations. */ +#undef HAVE_ALTIVEC + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALTIVEC_H + +/* Define if you have enabled the CNTVCT cycle counter on ARMv7a */ +#undef HAVE_ARMV7A_CNTVCT + +/* Define if you have enabled the PMCCNTR cycle counter on ARMv7a */ +#undef HAVE_ARMV7A_PMCCNTR + +/* Define if you have enabled the CNTVCT_EL0 cycle counter on ARMv8 */ +#undef HAVE_ARMV8_CNTVCT_EL0 + +/* Define if you have enabled the PMCCNTR_EL0 cycle counter on ARMv8 */ +#undef HAVE_ARMV8_PMCCNTR_EL0 + +/* Define to enable AVX optimizations. */ +#undef HAVE_AVX + +/* Define to enable AVX2 optimizations. */ +#undef HAVE_AVX2 + +/* Define to enable AVX512 optimizations. */ +#undef HAVE_AVX512 + +/* Define to enable 128-bit FMA AVX optimization */ +#undef HAVE_AVX_128_FMA + +/* Define to 1 if you have the `BSDgettimeofday' function. */ +#undef HAVE_BSDGETTIMEOFDAY + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define to 1 if you have the `cosl' function. */ +#undef HAVE_COSL + +/* Define to 1 if you have the declaration of `cosl', and to 0 if you don't. + */ +#undef HAVE_DECL_COSL + +/* Define to 1 if you have the declaration of `cosq', and to 0 if you don't. + */ +#undef HAVE_DECL_COSQ + +/* Define to 1 if you have the declaration of `drand48', and to 0 if you + don't. */ +#undef HAVE_DECL_DRAND48 + +/* Define to 1 if you have the declaration of `memalign', and to 0 if you + don't. */ +#undef HAVE_DECL_MEMALIGN + +/* Define to 1 if you have the declaration of `posix_memalign', and to 0 if + you don't. */ +#undef HAVE_DECL_POSIX_MEMALIGN + +/* Define to 1 if you have the declaration of `sinl', and to 0 if you don't. + */ +#undef HAVE_DECL_SINL + +/* Define to 1 if you have the declaration of `sinq', and to 0 if you don't. + */ +#undef HAVE_DECL_SINQ + +/* Define to 1 if you have the declaration of `srand48', and to 0 if you + don't. */ +#undef HAVE_DECL_SRAND48 + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Define to 1 if you have the `drand48' function. */ +#undef HAVE_DRAND48 + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FENV_H + +/* Define to enable generic (gcc) 128-bit SIMD optimizations. */ +#undef HAVE_GENERIC_SIMD128 + +/* Define to enable generic (gcc) 256-bit SIMD optimizations. */ +#undef HAVE_GENERIC_SIMD256 + +/* Define to 1 if you have the `gethrtime' function. */ +#undef HAVE_GETHRTIME + +/* Define to 1 if you have the `getpagesize' function. */ +#undef HAVE_GETPAGESIZE + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if hrtime_t is defined in */ +#undef HAVE_HRTIME_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define if the isnan() function/macro is available. */ +#undef HAVE_ISNAN + +/* Define to enable KCVI optimizations. */ +#undef HAVE_KCVI + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if you have the `quadmath' library (-lquadmath). */ +#undef HAVE_LIBQUADMATH + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if the compiler supports `long double' */ +#undef HAVE_LONG_DOUBLE + +/* Define to 1 if you have the `mach_absolute_time' function. */ +#undef HAVE_MACH_ABSOLUTE_TIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memalign' function. */ +#undef HAVE_MEMALIGN + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to enable use of MIPS ZBus cycle-counter. */ +#undef HAVE_MIPS_ZBUS_TIMER + +/* Define if you have the MPI library. */ +#undef HAVE_MPI + +/* Define to enable ARM NEON optimizations. */ +#undef HAVE_NEON + +/* Define if OpenMP is enabled */ +#undef HAVE_OPENMP + +/* Define to 1 if you have the `posix_memalign' function. */ +#undef HAVE_POSIX_MEMALIGN + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the `read_real_time' function. */ +#undef HAVE_READ_REAL_TIME + +/* Define to 1 if you have the `sinl' function. */ +#undef HAVE_SINL + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the `sqrt' function. */ +#undef HAVE_SQRT + +/* Define to enable SSE/SSE2 optimizations. */ +#undef HAVE_SSE2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `sysctl' function. */ +#undef HAVE_SYSCTL + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the `tanl' function. */ +#undef HAVE_TANL + +/* Define if we have a threads library. */ +#undef HAVE_THREADS + +/* Define to 1 if you have the `time_base_to_time' function. */ +#undef HAVE_TIME_BASE_TO_TIME + +/* Define to 1 if the system has the type `uintptr_t'. */ +#undef HAVE_UINTPTR_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to enable IBM VSX optimizations. */ +#undef HAVE_VSX + +/* Define to 1 if you have the `_mm_free' function. */ +#undef HAVE__MM_FREE + +/* Define to 1 if you have the `_mm_malloc' function. */ +#undef HAVE__MM_MALLOC + +/* Define if you have the UNICOS _rtc() intrinsic. */ +#undef HAVE__RTC + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* The size of `double', as computed by sizeof. */ +#undef SIZEOF_DOUBLE + +/* The size of `fftw_r2r_kind', as computed by sizeof. */ +#undef SIZEOF_FFTW_R2R_KIND + +/* The size of `float', as computed by sizeof. */ +#undef SIZEOF_FLOAT + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `MPI_Fint', as computed by sizeof. */ +#undef SIZEOF_MPI_FINT + +/* The size of `ptrdiff_t', as computed by sizeof. */ +#undef SIZEOF_PTRDIFF_T + +/* The size of `size_t', as computed by sizeof. */ +#undef SIZEOF_SIZE_T + +/* The size of `unsigned int', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_INT + +/* The size of `unsigned long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG + +/* The size of `unsigned long long', as computed by sizeof. */ +#undef SIZEOF_UNSIGNED_LONG_LONG + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if we have and are using POSIX threads. */ +#undef USING_POSIX_THREADS + +/* Version number of package */ +#undef VERSION + +/* Use common Windows Fortran mangling styles for the Fortran interfaces. */ +#undef WINDOWS_F77_MANGLING + +/* Include g77-compatible wrappers in addition to any other Fortran wrappers. + */ +#undef WITH_G77_WRAPPERS + +/* Use our own aligned malloc routine; mainly helpful for Windows systems + lacking aligned allocation system-library routines. */ +#undef WITH_OUR_MALLOC + +/* Use low-precision timers, making planner very slow */ +#undef WITH_SLOW_TIMER + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.sub b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.sub new file mode 100755 index 000000000..dd2ca93c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/config.sub @@ -0,0 +1,1825 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2016 Free Software Foundation, Inc. + +timestamp='2016-11-04' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2016 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/configure b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/configure new file mode 100755 index 000000000..034c59850 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/configure @@ -0,0 +1,24685 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for fftw 3.3.8. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and fftw@fftw.org +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='fftw' +PACKAGE_TARNAME='fftw' +PACKAGE_VERSION='3.3.8' +PACKAGE_STRING='fftw 3.3.8' +PACKAGE_BUGREPORT='fftw@fftw.org' +PACKAGE_URL='' + +ac_unique_file="kernel/ifftw.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +COMBINED_THREADS_FALSE +COMBINED_THREADS_TRUE +SMP_FALSE +SMP_TRUE +OPENMP_FALSE +OPENMP_TRUE +THREADS_FALSE +THREADS_TRUE +THREADLIBS +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +acx_pthread_config +OPENMP_CFLAGS +FLIBS +ac_ct_F77 +FFLAGS +F77 +INDENT +LIBQUADMATH +LIBOBJS +POW_LIB +ALLOCA +C_FFTW_R2R_KIND +STACK_ALIGN_CFLAGS +NEON_CFLAGS +VSX_CFLAGS +ALTIVEC_CFLAGS +KCVI_CFLAGS +AVX512_CFLAGS +AVX2_CFLAGS +AVX_CFLAGS +SSE2_CFLAGS +MPI_FALSE +MPI_TRUE +C_MPI_FINT +MPIRUN +MPILIBS +MPICC +OCAMLBUILD +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +LN_S +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +PREC_SUFFIX +HAVE_GENERIC_SIMD256_FALSE +HAVE_GENERIC_SIMD256_TRUE +HAVE_GENERIC_SIMD128_FALSE +HAVE_GENERIC_SIMD128_TRUE +HAVE_NEON_FALSE +HAVE_NEON_TRUE +HAVE_VSX_FALSE +HAVE_VSX_TRUE +HAVE_ALTIVEC_FALSE +HAVE_ALTIVEC_TRUE +HAVE_KCVI_FALSE +HAVE_KCVI_TRUE +HAVE_AVX_128_FMA_FALSE +HAVE_AVX_128_FMA_TRUE +AVX_128_FMA_CFLAGS +HAVE_AVX512_FALSE +HAVE_AVX512_TRUE +HAVE_AVX2_FALSE +HAVE_AVX2_TRUE +HAVE_AVX_FALSE +HAVE_AVX_TRUE +HAVE_SSE2_FALSE +HAVE_SSE2_TRUE +CHECK_PL_OPTS +PRECISION +QUAD_FALSE +QUAD_TRUE +LDOUBLE_FALSE +LDOUBLE_TRUE +SINGLE_FALSE +SINGLE_TRUE +BUILD_DOC_FALSE +BUILD_DOC_TRUE +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +SHARED_VERSION_INFO +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_shared +enable_debug +enable_doc +enable_random_estimator +enable_alloca +enable_single +enable_float +enable_long_double +enable_quad_precision +enable_sse +enable_sse2 +enable_avx +enable_avx2 +enable_avx512 +enable_avx_128_fma +enable_kcvi +enable_altivec +enable_vsx +enable_neon +enable_armv8_pmccntr_el0 +enable_armv8_cntvct_el0 +enable_armv7a_cntvct +enable_armv7a_pmccntr +enable_generic_simd128 +enable_generic_simd256 +with_slow_timer +enable_mips_zbus_timer +with_our_malloc +with_our_malloc16 +with_windows_f77_mangling +with_incoming_stack_boundary +enable_fma +enable_dependency_tracking +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +enable_mpi +enable_fortran +with_g77_wrappers +enable_openmp +enable_threads +with_combined_threads +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +LT_SYS_LIBRARY_PATH +CPP +MPICC +F77 +FFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures fftw 3.3.8 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/fftw] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of fftw 3.3.8:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-shared[=PKGS] build shared libraries [default=no] + --enable-debug compile fftw with extra runtime checks for debugging + --disable-doc disable building the documentation + --enable-random-estimator + enable pseudorandom estimator (debugging hack) + --disable-alloca disable use of the alloca() function (may be broken + on mingw64) + --enable-single compile fftw in single precision + --enable-float synonym for --enable-single + --enable-long-double compile fftw in long-double precision + --enable-quad-precision compile fftw in quadruple precision if available + --enable-sse enable SSE optimizations + --enable-sse2 enable SSE/SSE2 optimizations + --enable-avx enable AVX optimizations + --enable-avx2 enable AVX2 optimizations + --enable-avx512 enable AVX512 optimizations + --enable-avx-128-fma enable AVX128/FMA optimizations + --enable-kcvi enable Knights Corner vector instructions + optimizations + --enable-altivec enable Altivec optimizations + --enable-vsx enable IBM VSX optimizations + --enable-neon enable ARM NEON optimizations + --enable-armv8-pmccntr-el0 + enable the cycle counter on ARMv8 via the + PMCCNTR_EL0 register (see README-perfcounters for + details and mandatory instructions) + --enable-armv8-cntvct-el0 + enable the cycle counter on ARMv8 via the CNTVCT_EL0 + register (see README-perfcounters for details and + mandatory instructions) + --enable-armv7a-cntvct enable the cycle counter on Armv7a via the CNTVCT + register (see README-perfcounters for details and + mandatory instructions) + --enable-armv7a-pmccntr enable the cycle counter on Armv7a via the PMCCNTR + register (see README-perfcounters for details and + mandatory instructions) + --enable-generic-simd128 + enable generic (gcc) 128-bit SIMD optimizations + --enable-generic-simd256 + enable generic (gcc) 256-bit SIMD optimizations + --enable-mips-zbus-timer + use MIPS ZBus cycle-counter + --enable-fma enable if the machine architecture "naturally" + prefers fused multiply-add instructions + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-mpi compile FFTW MPI library + --disable-fortran don't include Fortran-callable wrappers + --enable-openmp use OpenMP directives for parallelism + --enable-threads compile FFTW SMP threads library + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-slow-timer use low-precision timers (SLOW) + --with-our-malloc use our aligned malloc (helpful for Win32) + --with-our-malloc16 Obsolete alias for --with-our-malloc16 + --with-windows-f77-mangling + use common Win32 Fortran interface styles + --with-incoming-stack-boundary=X + Assume that stack is aligned to (1< if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + MPICC MPI C compiler command + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +fftw configure 3.3.8 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------- ## +## Report this to fftw@fftw.org ## +## ---------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_find_uintX_t LINENO BITS VAR +# ------------------------------------ +# Finds an unsigned integer type with width BITS, setting cache variable VAR +# accordingly. +ac_fn_c_find_uintX_t () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 +$as_echo_n "checking for uint$2_t... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + # Order is important - never check a type that is potentially smaller + # than half of the expected target width. + for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ + 'unsigned long long int' 'unsigned short int' 'unsigned char'; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case $ac_type in #( + uint$2_t) : + eval "$3=yes" ;; #( + *) : + eval "$3=\$ac_type" ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if eval test \"x\$"$3"\" = x"no"; then : + +else + break +fi + done +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_find_uintX_t + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl + +# ac_fn_f77_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_compile + +# ac_fn_f77_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by fftw $as_me 3.3.8, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +SHARED_VERSION_INFO="8:8:5" # CURRENT:REVISION:AGE + +am__api_version='1.15' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='fftw' + VERSION='3.3.8' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +ac_config_headers="$ac_config_headers config.h" + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=no +fi + + + + + + + + + # Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + +case "${host_cpu}" in + powerpc*) arch_prefers_fma=yes;; + ia64*) arch_prefers_fma=yes;; + hppa*) arch_prefers_fma=yes;; + mips64*) arch_prefers_fma=yes;; + *) arch_prefers_fma=no;; +esac + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; ok=$enableval +else + ok=no +fi + +if test "$ok" = "yes"; then + +$as_echo "#define FFTW_DEBUG 1" >>confdefs.h + +fi + +# Check whether --enable-doc was given. +if test "${enable_doc+set}" = set; then : + enableval=$enable_doc; build_doc=$enableval +else + build_doc=yes +fi + + if test x"$build_doc" = xyes; then + BUILD_DOC_TRUE= + BUILD_DOC_FALSE='#' +else + BUILD_DOC_TRUE='#' + BUILD_DOC_FALSE= +fi + + +# Check whether --enable-random-estimator was given. +if test "${enable_random_estimator+set}" = set; then : + enableval=$enable_random_estimator; ok=$enableval +else + ok=no +fi + +if test "$ok" = "yes"; then + +$as_echo "#define FFTW_RANDOM_ESTIMATOR 1" >>confdefs.h + + CHECK_PL_OPTS="--estimate" +fi + +# Check whether --enable-alloca was given. +if test "${enable_alloca+set}" = set; then : + enableval=$enable_alloca; ok=$enableval +else + ok=yes +fi + +if test "$ok" = "yes"; then + +$as_echo "#define FFTW_ENABLE_ALLOCA 1" >>confdefs.h + +fi + +# Check whether --enable-single was given. +if test "${enable_single+set}" = set; then : + enableval=$enable_single; ok=$enableval +else + ok=no +fi + +# Check whether --enable-float was given. +if test "${enable_float+set}" = set; then : + enableval=$enable_float; ok=$enableval +fi + +if test "$ok" = "yes"; then + +$as_echo "#define FFTW_SINGLE 1" >>confdefs.h + + +$as_echo "#define BENCHFFT_SINGLE 1" >>confdefs.h + + PRECISION=s +else + PRECISION=d +fi + if test "$ok" = "yes"; then + SINGLE_TRUE= + SINGLE_FALSE='#' +else + SINGLE_TRUE='#' + SINGLE_FALSE= +fi + + +# Check whether --enable-long-double was given. +if test "${enable_long_double+set}" = set; then : + enableval=$enable_long_double; ok=$enableval +else + ok=no +fi + +if test "$ok" = "yes"; then + if test "$PRECISION" = "s"; then + as_fn_error $? "--enable-single/--enable-long-double conflict" "$LINENO" 5 + fi + +$as_echo "#define FFTW_LDOUBLE 1" >>confdefs.h + + +$as_echo "#define BENCHFFT_LDOUBLE 1" >>confdefs.h + + PRECISION=l +fi + if test "$ok" = "yes"; then + LDOUBLE_TRUE= + LDOUBLE_FALSE='#' +else + LDOUBLE_TRUE='#' + LDOUBLE_FALSE= +fi + + +# Check whether --enable-quad-precision was given. +if test "${enable_quad_precision+set}" = set; then : + enableval=$enable_quad_precision; ok=$enableval +else + ok=no +fi + +if test "$ok" = "yes"; then + if test "$PRECISION" != "d"; then + as_fn_error $? "conflicting precisions specified" "$LINENO" 5 + fi + +$as_echo "#define FFTW_QUAD 1" >>confdefs.h + + +$as_echo "#define BENCHFFT_QUAD 1" >>confdefs.h + + PRECISION=q +fi + if test "$ok" = "yes"; then + QUAD_TRUE= + QUAD_FALSE='#' +else + QUAD_TRUE='#' + QUAD_FALSE= +fi + + + + + +# Check whether --enable-sse was given. +if test "${enable_sse+set}" = set; then : + enableval=$enable_sse; have_sse=$enableval +else + have_sse=no +fi + +if test "$have_sse" = "yes"; then + if test "$PRECISION" != "s"; then + as_fn_error $? "SSE requires single precision" "$LINENO" 5 + fi +fi + +# Check whether --enable-sse2 was given. +if test "${enable_sse2+set}" = set; then : + enableval=$enable_sse2; have_sse2=$enableval +else + have_sse2=no +fi + +if test "$have_sse" = "yes"; then have_sse2=yes; fi +if test "$have_sse2" = "yes"; then + +$as_echo "#define HAVE_SSE2 1" >>confdefs.h + + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + as_fn_error $? "SSE2 requires single or double precision" "$LINENO" 5 + fi +fi + if test "$have_sse2" = "yes"; then + HAVE_SSE2_TRUE= + HAVE_SSE2_FALSE='#' +else + HAVE_SSE2_TRUE='#' + HAVE_SSE2_FALSE= +fi + + +# Check whether --enable-avx was given. +if test "${enable_avx+set}" = set; then : + enableval=$enable_avx; have_avx=$enableval +else + have_avx=no +fi + +if test "$have_avx" = "yes"; then + +$as_echo "#define HAVE_AVX 1" >>confdefs.h + + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + as_fn_error $? "AVX requires single or double precision" "$LINENO" 5 + fi +fi + if test "$have_avx" = "yes"; then + HAVE_AVX_TRUE= + HAVE_AVX_FALSE='#' +else + HAVE_AVX_TRUE='#' + HAVE_AVX_FALSE= +fi + + +# Check whether --enable-avx2 was given. +if test "${enable_avx2+set}" = set; then : + enableval=$enable_avx2; have_avx2=$enableval +else + have_avx2=no +fi + +if test "$have_avx2" = "yes"; then + +$as_echo "#define HAVE_AVX2 1" >>confdefs.h + + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + as_fn_error $? "AVX2 requires single or double precision" "$LINENO" 5 + fi +fi + if test "$have_avx2" = "yes"; then + HAVE_AVX2_TRUE= + HAVE_AVX2_FALSE='#' +else + HAVE_AVX2_TRUE='#' + HAVE_AVX2_FALSE= +fi + + +# Check whether --enable-avx512 was given. +if test "${enable_avx512+set}" = set; then : + enableval=$enable_avx512; have_avx512=$enableval +else + have_avx512=no +fi + +if test "$have_avx512" = "yes"; then + +$as_echo "#define HAVE_AVX512 1" >>confdefs.h + + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + as_fn_error $? "AVX512 requires single or double precision" "$LINENO" 5 + fi +fi + if test "$have_avx512" = "yes"; then + HAVE_AVX512_TRUE= + HAVE_AVX512_FALSE='#' +else + HAVE_AVX512_TRUE='#' + HAVE_AVX512_FALSE= +fi + + +# Check whether --enable-avx-128-fma was given. +if test "${enable_avx_128_fma+set}" = set; then : + enableval=$enable_avx_128_fma; have_avx_128_fma=$enableval +else + have_avx_128_fma=no +fi + +if test "$have_avx_128_fma" = "yes"; then + +$as_echo "#define HAVE_AVX_128_FMA 1" >>confdefs.h + + AVX_128_FMA_CFLAGS="${AVX_CFLAGS} -mfma4" + +fi + if test "$have_avx_128_fma" = "yes"; then + HAVE_AVX_128_FMA_TRUE= + HAVE_AVX_128_FMA_FALSE='#' +else + HAVE_AVX_128_FMA_TRUE='#' + HAVE_AVX_128_FMA_FALSE= +fi + + +# Check whether --enable-kcvi was given. +if test "${enable_kcvi+set}" = set; then : + enableval=$enable_kcvi; have_kcvi=$enableval +else + have_kcvi=no +fi + +if test "$have_kcvi" = "yes"; then + +$as_echo "#define HAVE_KCVI 1" >>confdefs.h + + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + as_fn_error $? "Knights Corner vector instructions requires single or double precision" "$LINENO" 5 + fi +fi + if test "$have_kcvi" = "yes"; then + HAVE_KCVI_TRUE= + HAVE_KCVI_FALSE='#' +else + HAVE_KCVI_TRUE='#' + HAVE_KCVI_FALSE= +fi + + +# Check whether --enable-altivec was given. +if test "${enable_altivec+set}" = set; then : + enableval=$enable_altivec; have_altivec=$enableval +else + have_altivec=no +fi + +if test "$have_altivec" = "yes"; then + +$as_echo "#define HAVE_ALTIVEC 1" >>confdefs.h + + if test "$PRECISION" != "s"; then + as_fn_error $? "Altivec requires single precision" "$LINENO" 5 + fi +fi + if test "$have_altivec" = "yes"; then + HAVE_ALTIVEC_TRUE= + HAVE_ALTIVEC_FALSE='#' +else + HAVE_ALTIVEC_TRUE='#' + HAVE_ALTIVEC_FALSE= +fi + + +# Check whether --enable-vsx was given. +if test "${enable_vsx+set}" = set; then : + enableval=$enable_vsx; have_vsx=$enableval +else + have_vsx=no +fi + +if test "$have_vsx" = "yes"; then + +$as_echo "#define HAVE_VSX 1" >>confdefs.h + +fi + if test "$have_vsx" = "yes"; then + HAVE_VSX_TRUE= + HAVE_VSX_FALSE='#' +else + HAVE_VSX_TRUE='#' + HAVE_VSX_FALSE= +fi + + +# Check whether --enable-neon was given. +if test "${enable_neon+set}" = set; then : + enableval=$enable_neon; have_neon=$enableval +else + have_neon=no +fi + +if test "$have_neon" = "yes"; then + +$as_echo "#define HAVE_NEON 1" >>confdefs.h + + case "${host_cpu}" in + aarch64) + ;; + *) + if test "$PRECISION" != "s"; then + as_fn_error $? "NEON requires single precision" "$LINENO" 5 + fi + ;; + esac +fi + if test "$have_neon" = "yes"; then + HAVE_NEON_TRUE= + HAVE_NEON_FALSE='#' +else + HAVE_NEON_TRUE='#' + HAVE_NEON_FALSE= +fi + + +# Check whether --enable-armv8-pmccntr-el0 was given. +if test "${enable_armv8_pmccntr_el0+set}" = set; then : + enableval=$enable_armv8_pmccntr_el0; have_armv8pmccntrel0=$enableval +fi + +if test "$have_armv8pmccntrel0"x = "yes"x; then + +$as_echo "#define HAVE_ARMV8_PMCCNTR_EL0 1" >>confdefs.h + +fi + +# Check whether --enable-armv8-cntvct-el0 was given. +if test "${enable_armv8_cntvct_el0+set}" = set; then : + enableval=$enable_armv8_cntvct_el0; have_armv8cntvctel0=$enableval +fi + +if test "$have_armv8cntvctel0"x = "yes"x; then + +$as_echo "#define HAVE_ARMV8_CNTVCT_EL0 1" >>confdefs.h + +fi + +# Check whether --enable-armv7a-cntvct was given. +if test "${enable_armv7a_cntvct+set}" = set; then : + enableval=$enable_armv7a_cntvct; have_armv7acntvct=$enableval +fi + +if test "$have_armv7acntvct"x = "yes"x; then + +$as_echo "#define HAVE_ARMV7A_CNTVCT 1" >>confdefs.h + +fi + +# Check whether --enable-armv7a-pmccntr was given. +if test "${enable_armv7a_pmccntr+set}" = set; then : + enableval=$enable_armv7a_pmccntr; have_armv7apmccntr=$enableval +fi + +if test "$have_armv7apmccntr"x = "yes"x; then + +$as_echo "#define HAVE_ARMV7A_PMCCNTR 1" >>confdefs.h + +fi + +# Check whether --enable-generic-simd128 was given. +if test "${enable_generic_simd128+set}" = set; then : + enableval=$enable_generic_simd128; have_generic_simd128=$enableval +else + have_generic_simd128=no +fi + +if test "$have_generic_simd128" = "yes"; then + +$as_echo "#define HAVE_GENERIC_SIMD128 1" >>confdefs.h + +fi + if test "$have_generic_simd128" = "yes"; then + HAVE_GENERIC_SIMD128_TRUE= + HAVE_GENERIC_SIMD128_FALSE='#' +else + HAVE_GENERIC_SIMD128_TRUE='#' + HAVE_GENERIC_SIMD128_FALSE= +fi + + +# Check whether --enable-generic-simd256 was given. +if test "${enable_generic_simd256+set}" = set; then : + enableval=$enable_generic_simd256; have_generic_simd256=$enableval +else + have_generic_simd256=no +fi + +if test "$have_generic_simd256" = "yes"; then + +$as_echo "#define HAVE_GENERIC_SIMD256 1" >>confdefs.h + +fi + if test "$have_generic_simd256" = "yes"; then + HAVE_GENERIC_SIMD256_TRUE= + HAVE_GENERIC_SIMD256_FALSE='#' +else + HAVE_GENERIC_SIMD256_TRUE='#' + HAVE_GENERIC_SIMD256_FALSE= +fi + + + + + +# Check whether --with-slow-timer was given. +if test "${with_slow_timer+set}" = set; then : + withval=$with_slow_timer; with_slow_timer=$withval +else + with_slow_timer=no +fi + +if test "$with_slow_timer" = "yes"; then + +$as_echo "#define WITH_SLOW_TIMER 1" >>confdefs.h + +fi + +# Check whether --enable-mips_zbus_timer was given. +if test "${enable_mips_zbus_timer+set}" = set; then : + enableval=$enable_mips_zbus_timer; have_mips_zbus_timer=$enableval +else + have_mips_zbus_timer=no +fi + +if test "$have_mips_zbus_timer" = "yes"; then + +$as_echo "#define HAVE_MIPS_ZBUS_TIMER 1" >>confdefs.h + +fi + + +# Check whether --with-our-malloc was given. +if test "${with_our_malloc+set}" = set; then : + withval=$with_our_malloc; with_our_malloc=$withval +else + with_our_malloc=no +fi + + +# Check whether --with-our-malloc16 was given. +if test "${with_our_malloc16+set}" = set; then : + withval=$with_our_malloc16; with_our_malloc=$withval +fi + +if test "$with_our_malloc" = "yes"; then + +$as_echo "#define WITH_OUR_MALLOC 1" >>confdefs.h + +fi + + +# Check whether --with-windows-f77-mangling was given. +if test "${with_windows_f77_mangling+set}" = set; then : + withval=$with_windows_f77_mangling; with_windows_f77_mangling=$withval +else + with_windows_f77_mangling=no +fi + +if test "$with_windows_f77_mangling" = "yes"; then + +$as_echo "#define WINDOWS_F77_MANGLING 1" >>confdefs.h + +fi + + +# Check whether --with-incoming-stack-boundary was given. +if test "${with_incoming_stack_boundary+set}" = set; then : + withval=$with_incoming_stack_boundary; with_incoming_stack_boundary=$withval +else + with_incoming_stack_boundary=no +fi + + + +# Check whether --enable-fma was given. +if test "${enable_fma+set}" = set; then : + enableval=$enable_fma; arch_prefers_fma=$enableval +fi + +if test "$arch_prefers_fma"x = "yes"x; then + +$as_echo "#define ARCH_PREFERS_FMA 1" >>confdefs.h + +fi + +case "$PRECISION" in + s) PREC_SUFFIX=f;; + d) PREC_SUFFIX=;; + l) PREC_SUFFIX=l;; + q) PREC_SUFFIX=q;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 +$as_echo_n "checking for C compiler vendor... " >&6; } +if ${ax_cv_c_compiler_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_c_compiler_vendor=unknown + # note: don't check for gcc first since some other compilers define __GNUC__ + for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__ibmxl__,__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do + vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#if !($vencpp) + thisisanerror; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_compiler_vendor=`echo $ventest | cut -d: -f1`; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 +$as_echo "$ax_cv_c_compiler_vendor" >&6; } + + case $ac_cv_prog_cc_stdc in #( + no) : + ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +if ${ac_cv_prog_cc_c99+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +#include + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +#define debug(...) fprintf (stderr, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + your preprocessor is broken; +#endif +#if BIG_OK +#else + your preprocessor is broken; +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\0'; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static void +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str; + int number; + float fnumber; + + while (*format) + { + switch (*format++) + { + case 's': // string + str = va_arg (args_copy, const char *); + break; + case 'd': // int + number = va_arg (args_copy, int); + break; + case 'f': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); +} + +int +main () +{ + + // Check bool. + _Bool success = false; + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + test_varargs ("s, d' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' + || dynamic_array[ni.number - 1] != 543); + + ; + return 0; +} +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c99" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c99" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c99" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +else + ac_cv_prog_cc_stdc=no +fi + +fi + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } + if ${ac_cv_prog_cc_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +fi + + case $ac_cv_prog_cc_stdc in #( + no) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; #( + '') : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AS+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options + + + + enable_dlopen=no + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +# Extract the first word of "ocamlbuild", so it can be a program name with args. +set dummy ocamlbuild; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OCAMLBUILD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLBUILD"; then + ac_cv_prog_OCAMLBUILD="$OCAMLBUILD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OCAMLBUILD="ocamlbuild" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OCAMLBUILD=$ac_cv_prog_OCAMLBUILD +if test -n "$OCAMLBUILD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLBUILD" >&5 +$as_echo "$OCAMLBUILD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +# Check whether --enable-mpi was given. +if test "${enable_mpi+set}" = set; then : + enableval=$enable_mpi; enable_mpi=$enableval +else + enable_mpi=no +fi + + +if test "$enable_mpi" = "yes"; then + if test $PRECISION = q; then + as_fn_error $? "quad precision is not supported in MPI" "$LINENO" 5 + fi + + + + + + for ac_prog in mpicc hcc mpcc mpcc_r mpxlc cmpicc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MPICC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MPICC"; then + ac_cv_prog_MPICC="$MPICC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MPICC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MPICC=$ac_cv_prog_MPICC +if test -n "$MPICC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPICC" >&5 +$as_echo "$MPICC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MPICC" && break +done +test -n "$MPICC" || MPICC="$CC" + + acx_mpi_save_CC="$CC" + CC="$MPICC" + + + +if test x = x"$MPILIBS"; then + ac_fn_c_check_func "$LINENO" "MPI_Init" "ac_cv_func_MPI_Init" +if test "x$ac_cv_func_MPI_Init" = xyes; then : + MPILIBS=" " +fi + +fi +if test x = x"$MPILIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpi" >&5 +$as_echo_n "checking for MPI_Init in -lmpi... " >&6; } +if ${ac_cv_lib_mpi_MPI_Init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmpi $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char MPI_Init (); +int +main () +{ +return MPI_Init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mpi_MPI_Init=yes +else + ac_cv_lib_mpi_MPI_Init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpi_MPI_Init" >&5 +$as_echo "$ac_cv_lib_mpi_MPI_Init" >&6; } +if test "x$ac_cv_lib_mpi_MPI_Init" = xyes; then : + MPILIBS="-lmpi" +fi + +fi +if test x = x"$MPILIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPI_Init in -lmpich" >&5 +$as_echo_n "checking for MPI_Init in -lmpich... " >&6; } +if ${ac_cv_lib_mpich_MPI_Init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmpich $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char MPI_Init (); +int +main () +{ +return MPI_Init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mpich_MPI_Init=yes +else + ac_cv_lib_mpich_MPI_Init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpich_MPI_Init" >&5 +$as_echo "$ac_cv_lib_mpich_MPI_Init" >&6; } +if test "x$ac_cv_lib_mpich_MPI_Init" = xyes; then : + MPILIBS="-lmpich" +fi + +fi + +if test x != x"$MPILIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpi.h" >&5 +$as_echo_n "checking for mpi.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + MPILIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +CC="$acx_mpi_save_CC" + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x = x"$MPILIBS"; then + as_fn_error $? "could not find mpi library for --enable-mpi" "$LINENO" 5 + : +else + +$as_echo "#define HAVE_MPI 1" >>confdefs.h + + : +fi + + # Extract the first word of "mpirun", so it can be a program name with args. +set dummy mpirun; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MPIRUN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MPIRUN"; then + ac_cv_prog_MPIRUN="$MPIRUN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MPIRUN="mpirun" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MPIRUN=$ac_cv_prog_MPIRUN +if test -n "$MPIRUN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPIRUN" >&5 +$as_echo "$MPIRUN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + save_CC=$CC + CC=$MPICC + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of MPI_Fint" >&5 +$as_echo_n "checking size of MPI_Fint... " >&6; } +if ${ac_cv_sizeof_MPI_Fint+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (MPI_Fint))" "ac_cv_sizeof_MPI_Fint" "#include +"; then : + +else + if test "$ac_cv_type_MPI_Fint" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (MPI_Fint) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_MPI_Fint=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_MPI_Fint" >&5 +$as_echo "$ac_cv_sizeof_MPI_Fint" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_MPI_FINT $ac_cv_sizeof_MPI_Fint +_ACEOF + + + CC=$save_CC + if test 0 = $ac_cv_sizeof_MPI_Fint; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: sizeof(MPI_Fint) test failed" >&5 +$as_echo "$as_me: WARNING: sizeof(MPI_Fint) test failed" >&2;}; + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + + if test 0 = $ac_cv_sizeof_int; then as_fn_error $? "sizeof(int) test failed" "$LINENO" 5; fi + ac_cv_sizeof_MPI_Fint=$ac_cv_sizeof_int + fi + C_MPI_FINT=C_INT`expr $ac_cv_sizeof_MPI_Fint \* 8`_T + +fi + if test "$enable_mpi" = "yes"; then + MPI_TRUE= + MPI_FALSE='#' +else + MPI_TRUE='#' + MPI_FALSE= +fi + + + + + + + + +# Try to determine "good" native compiler flags if none specified via CFLAGS +if test "$ac_test_CFLAGS" != "set"; then + CFLAGS="" + case $ax_cv_c_compiler_vendor in + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + ;; + + sun) CFLAGS="-native -fast -xO5 -dalign" + ;; + + hp) CFLAGS="+Oall +Optrs_ansi +DSnative" + ;; + + ibm) xlc_opt="-qarch=auto -qtune=auto" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $xlc_opt" >&5 +$as_echo_n "checking whether C compiler accepts $xlc_opt... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$xlc_opt" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$xlc_opt" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="-O3 -qalias=ansi -w $xlc_opt" +else + CFLAGS="-O3 -qalias=ansi -w" +fi + + ;; + + intel) CFLAGS="-O3" + # Intel seems to have changed the spelling of this flag recently + icc_ansi_alias="unknown" + for flag in -ansi-alias -ansi_alias; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 +$as_echo_n "checking whether C compiler accepts $flag... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + icc_ansi_alias=$flag; break +else + : +fi + + done + if test "x$icc_ansi_alias" != xunknown; then + CFLAGS="$CFLAGS $icc_ansi_alias" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5 +$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; } +if ${ax_cv_c_flags__malign_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-malign-double" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__malign_double=yes +else + ax_cv_c_flags__malign_double=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -malign-double" +else + : +fi + + # We used to check for architecture flags here, e.g. -xHost etc., + # but these flags are problematic. On icc-12.0.0, "-mavx -xHost" + # overrides -mavx with -xHost, generating SSE2 code instead of AVX + # code. ICC does not seem to support -mtune=host or equivalent + # non-ABI changing flag. + ;; + + clang) + CFLAGS="-O3 -fomit-frame-pointer" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mtune=native" >&5 +$as_echo_n "checking whether C compiler accepts -mtune=native... " >&6; } +if ${ax_cv_c_flags__mtune_native+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mtune=native" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mtune_native=yes +else + ax_cv_c_flags__mtune_native=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mtune_native +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -mtune=native" +else + : +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5 +$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; } +if ${ax_cv_c_flags__fstrict_aliasing+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-fstrict-aliasing" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__fstrict_aliasing=yes +else + ax_cv_c_flags__fstrict_aliasing=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -fstrict-aliasing" +else + : +fi + + ;; + + gnu) + # Default optimization flags for gcc on all systems. + # Somehow -O3 does not imply -fomit-frame-pointer on ia32 + CFLAGS="-O3 -fomit-frame-pointer" + + # tune for the host by default + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mtune=native" >&5 +$as_echo_n "checking whether C compiler accepts -mtune=native... " >&6; } +if ${ax_cv_c_flags__mtune_native+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mtune=native" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mtune_native=yes +else + ax_cv_c_flags__mtune_native=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mtune_native +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -mtune=native" +else + : +fi + + + # -malign-double for x86 systems + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5 +$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; } +if ${ax_cv_c_flags__malign_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-malign-double" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__malign_double=yes +else + ax_cv_c_flags__malign_double=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -malign-double" +else + : +fi + + + # -fstrict-aliasing for gcc-2.95+ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstrict-aliasing" >&5 +$as_echo_n "checking whether C compiler accepts -fstrict-aliasing... " >&6; } +if ${ax_cv_c_flags__fstrict_aliasing+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-fstrict-aliasing" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__fstrict_aliasing=yes +else + ax_cv_c_flags__fstrict_aliasing=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__fstrict_aliasing +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -fstrict-aliasing" +else + : +fi + + + # -fno-schedule-insns is pretty much required on all risc + # processors. + # + # gcc performs one pass of instruction scheduling, then a pass of + # register allocation, then another pass of instruction + # scheduling. The first pass reorders instructions in a way that + # is pretty much the worst possible for the purposes of register + # allocation. We disable the first pass. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-schedule-insns" >&5 +$as_echo_n "checking whether C compiler accepts -fno-schedule-insns... " >&6; } +if ${ax_cv_c_flags__fno_schedule_insns+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-fno-schedule-insns" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__fno_schedule_insns=yes +else + ax_cv_c_flags__fno_schedule_insns=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__fno_schedule_insns +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -fno-schedule-insns" +else + : +fi + + + # flags to enable power ISA 2.07 instructions with gcc (always true with vsx) + if test "$have_vsx" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mcpu=power8" >&5 +$as_echo_n "checking whether C compiler accepts -mcpu=power8... " >&6; } +if ${ax_cv_c_flags__mcpu_power8+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mcpu=power8" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mcpu_power8=yes +else + ax_cv_c_flags__mcpu_power8=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mcpu_power8 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -mcpu=power8" +else + : +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mpower8-fusion" >&5 +$as_echo_n "checking whether C compiler accepts -mpower8-fusion... " >&6; } +if ${ax_cv_c_flags__mpower8_fusion+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mpower8-fusion" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mpower8_fusion=yes +else + ax_cv_c_flags__mpower8_fusion=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mpower8_fusion +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -mpower8-fusion" +else + : +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mpower8-vector" >&5 +$as_echo_n "checking whether C compiler accepts -mpower8-vector... " >&6; } +if ${ax_cv_c_flags__mpower8_vector+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mpower8-vector" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mpower8_vector=yes +else + ax_cv_c_flags__mpower8_vector=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mpower8_vector +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -mpower8-vector" +else + : +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mdirect-move" >&5 +$as_echo_n "checking whether C compiler accepts -mdirect-move... " >&6; } +if ${ax_cv_c_flags__mdirect_move+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mdirect-move" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mdirect_move=yes +else + ax_cv_c_flags__mdirect_move=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mdirect_move +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -mdirect-move" +else + : +fi + + fi + ;; + esac + + if test -z "$CFLAGS"; then + echo "" + echo "********************************************************" + echo "* WARNING: Don't know the best CFLAGS for this system *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "********************************************************" + echo "" + CFLAGS="-O3" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CFLAGS" >&5 +$as_echo_n "checking whether C compiler accepts $CFLAGS... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$CFLAGS" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + : +else + + echo "" + echo "********************************************************" + echo "* WARNING: The guessed CFLAGS don't seem to work with *" + echo "* your compiler. *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "********************************************************" + echo "" + CFLAGS="" + +fi + + +fi + + +case "${ax_cv_c_compiler_vendor}" in + intel) # Stop icc from defining __GNUC__, except on MacOS where this fails + case "${host_os}" in + *darwin*) ;; # icc -no-gcc fails to compile some system headers + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -no-gcc" >&5 +$as_echo_n "checking whether C compiler accepts -no-gcc... " >&6; } +if ${ax_cv_c_flags__no_gcc+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-no-gcc" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__no_gcc=yes +else + ax_cv_c_flags__no_gcc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__no_gcc +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CC="$CC -no-gcc" +else + : +fi + + ;; + esac + ;; + + hp) # must (sometimes) manually increase cpp limits to handle fftw3.h + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wp,-H128000" >&5 +$as_echo_n "checking whether C compiler accepts -Wp,-H128000... " >&6; } +if ${ax_cv_c_flags__Wp+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-Wp,-H128000" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__Wp=yes +else + ax_cv_c_flags__Wp=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__Wp +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CC="$CC -Wp,-H128000" +else + : +fi + + ;; + + portland) # -Masmkeyword required for asm("") cycle counters + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Masmkeyword" >&5 +$as_echo_n "checking whether C compiler accepts -Masmkeyword... " >&6; } +if ${ax_cv_c_flags__Masmkeyword+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-Masmkeyword" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__Masmkeyword=yes +else + ax_cv_c_flags__Masmkeyword=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__Masmkeyword +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CC="$CC -Masmkeyword" +else + : +fi + + ;; +esac + +case "${ax_cv_c_compiler_vendor}" in + gnu|intel) + # SSE/SSE2 + if test "$have_sse2" = "yes" -a "x$SSE2_CFLAGS" = x; then + if test "$PRECISION" = d; then flag=msse2; else flag=msse; fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -$flag" >&5 +$as_echo_n "checking whether C compiler accepts -$flag... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="-$flag" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_-$flag" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_-$flag" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_-$flag" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + SSE2_CFLAGS="-$flag" +else + as_fn_error $? "Need a version of gcc with -$flag" "$LINENO" 5 +fi + + fi + + # AVX + if test "$have_avx" = "yes" -a "x$AVX_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx" >&5 +$as_echo_n "checking whether C compiler accepts -mavx... " >&6; } +if ${ax_cv_c_flags__mavx+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mavx" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mavx=yes +else + ax_cv_c_flags__mavx=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mavx +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX_CFLAGS="-mavx" +else + as_fn_error $? "Need a version of gcc with -mavx" "$LINENO" 5 +fi + + fi + + # AVX2 + # gcc-4.8 works with -march=core-avx2, but -mavx2 is not enough. + # Later versions seem to happy with -mavx2, so try the arch one first. + if test "$have_avx2" = "yes" -a "x$AVX2_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -march=core-avx2" >&5 +$as_echo_n "checking whether C compiler accepts -march=core-avx2... " >&6; } +if ${ax_cv_c_flags__march_core_avx2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-march=core-avx2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__march_core_avx2=yes +else + ax_cv_c_flags__march_core_avx2=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__march_core_avx2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX2_CFLAGS="-march=core-avx2" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx2" >&5 +$as_echo_n "checking whether C compiler accepts -mavx2... " >&6; } +if ${ax_cv_c_flags__mavx2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mavx2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mavx2=yes +else + ax_cv_c_flags__mavx2=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mavx2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX2_CFLAGS="-mavx2" +else + as_fn_error $? "Need a version of gcc with either -march=core-avx2 or -mavx2" "$LINENO" 5 +fi + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mfma" >&5 +$as_echo_n "checking whether C compiler accepts -mfma... " >&6; } +if ${ax_cv_c_flags__mfma+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mfma" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mfma=yes +else + ax_cv_c_flags__mfma=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mfma +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX2_CFLAGS="$AVX2_CFLAGS -mfma" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Need a version of gcc with -mfma (harmless for icc)" >&5 +$as_echo "$as_me: WARNING: Need a version of gcc with -mfma (harmless for icc)" >&2;} +fi + + fi + + # AVX512 + if test "$have_avx512" = "yes" -a "x$AVX512_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx512f" >&5 +$as_echo_n "checking whether C compiler accepts -mavx512f... " >&6; } +if ${ax_cv_c_flags__mavx512f+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mavx512f" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mavx512f=yes +else + ax_cv_c_flags__mavx512f=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mavx512f +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX512_CFLAGS="-mavx512f" +else + as_fn_error $? "Need a version of gcc with -mavx512f" "$LINENO" 5 +fi + + fi + + if test "$host_vendor" = "apple"; then + # We need to tell gcc to use an external assembler to get AVX/AVX2 with gcc on OS X + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wa,-q" >&5 +$as_echo_n "checking whether C compiler accepts -Wa,-q... " >&6; } +if ${ax_cv_c_flags__Wa+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-Wa,-q" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__Wa=yes +else + ax_cv_c_flags__Wa=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__Wa +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -Wa,-q" +else + : +fi + + # Disable the new compact unwinding format so we avoid warnings/potential errors. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wl,-no_compact_unwind" >&5 +$as_echo_n "checking whether C compiler accepts -Wl,-no_compact_unwind... " >&6; } +if ${ax_cv_c_flags__Wl+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-Wl,-no_compact_unwind" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__Wl=yes +else + ax_cv_c_flags__Wl=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__Wl +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -Wl,-no_compact_unwind" +else + : +fi + + fi + + # KCVI + if test "$have_kcvi" = "yes" -a "x$KCVI_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mmic" >&5 +$as_echo_n "checking whether C compiler accepts -mmic... " >&6; } +if ${ax_cv_c_flags__mmic+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mmic" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mmic=yes +else + ax_cv_c_flags__mmic=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mmic +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + KCVI_CFLAGS="-mmic" +else + as_fn_error $? "Need a version of icc with -mmic" "$LINENO" 5 +fi + + fi + + if test "$have_altivec" = "yes" -a "x$ALTIVEC_CFLAGS" = x; then + # -DFAKE__VEC__ is a workaround because gcc-3.3 does not + # #define __VEC__ with -maltivec. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -faltivec" >&5 +$as_echo_n "checking whether C compiler accepts -faltivec... " >&6; } +if ${ax_cv_c_flags__faltivec+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-faltivec" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__faltivec=yes +else + ax_cv_c_flags__faltivec=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__faltivec +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + ALTIVEC_CFLAGS="-faltivec" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -maltivec -mabi=altivec" >&5 +$as_echo_n "checking whether C compiler accepts -maltivec -mabi=altivec... " >&6; } +if ${ax_cv_c_flags__maltivec__mabi_altivec+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-maltivec -mabi=altivec" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__maltivec__mabi_altivec=yes +else + ax_cv_c_flags__maltivec__mabi_altivec=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__maltivec__mabi_altivec +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + ALTIVEC_CFLAGS="-maltivec -mabi=altivec -DFAKE__VEC__" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fvec" >&5 +$as_echo_n "checking whether C compiler accepts -fvec... " >&6; } +if ${ax_cv_c_flags__fvec+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-fvec" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__fvec=yes +else + ax_cv_c_flags__fvec=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__fvec +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + ALTIVEC_CFLAGS="-fvec" +else + as_fn_error $? "Need a version of gcc with -maltivec" "$LINENO" 5 +fi + +fi + +fi + + fi + + case "${host_cpu}" in + aarch64) + ;; + *) + if test "$have_neon" = "yes" -a "x$NEON_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mfpu=neon" >&5 +$as_echo_n "checking whether C compiler accepts -mfpu=neon... " >&6; } +if ${ax_cv_c_flags__mfpu_neon+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mfpu=neon" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mfpu_neon=yes +else + ax_cv_c_flags__mfpu_neon=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mfpu_neon +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + NEON_CFLAGS="-mfpu=neon" +else + as_fn_error $? "Need a version of gcc with -mfpu=neon" "$LINENO" 5 +fi + + fi + ;; + esac + + if test "$have_vsx" = "yes" -a "x$VSX_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mvsx" >&5 +$as_echo_n "checking whether C compiler accepts -mvsx... " >&6; } +if ${ax_cv_c_flags__mvsx+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mvsx" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mvsx=yes +else + ax_cv_c_flags__mvsx=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mvsx +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + VSX_CFLAGS="-mvsx" +else + as_fn_error $? "Need a version of gcc with -mvsx" "$LINENO" 5 +fi + + fi + + ;; + + clang) + + if test "$have_avx" = "yes" -a "x$AVX_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx" >&5 +$as_echo_n "checking whether C compiler accepts -mavx... " >&6; } +if ${ax_cv_c_flags__mavx+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mavx" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mavx=yes +else + ax_cv_c_flags__mavx=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mavx +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX_CFLAGS="-mavx" +else + as_fn_error $? "Need a version of clang with -mavx" "$LINENO" 5 +fi + + fi + + if test "$have_avx2" = "yes" -a "x$AVX2_CFLAGS" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx2" >&5 +$as_echo_n "checking whether C compiler accepts -mavx2... " >&6; } +if ${ax_cv_c_flags__mavx2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mavx2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mavx2=yes +else + ax_cv_c_flags__mavx2=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mavx2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX2_CFLAGS="-mavx2" +else + as_fn_error $? "Need a version of clang with -mavx2" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mfma" >&5 +$as_echo_n "checking whether C compiler accepts -mfma... " >&6; } +if ${ax_cv_c_flags__mfma+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mfma" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mfma=yes +else + ax_cv_c_flags__mfma=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mfma +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + AVX2_CFLAGS="$AVX2_CFLAGS -mfma" +else + : +fi + + fi + + if test "$have_vsx" = "yes" -a "x$VSX_CFLAGS" = x; then + # clang appears to need both -mvsx and -maltivec for VSX + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -maltivec" >&5 +$as_echo_n "checking whether C compiler accepts -maltivec... " >&6; } +if ${ax_cv_c_flags__maltivec+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-maltivec" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__maltivec=yes +else + ax_cv_c_flags__maltivec=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__maltivec +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + VSX_CFLAGS="-maltivec" +else + as_fn_error $? "Need a version of gcc with -maltivec" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mvsx" >&5 +$as_echo_n "checking whether C compiler accepts -mvsx... " >&6; } +if ${ax_cv_c_flags__mvsx+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mvsx" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mvsx=yes +else + ax_cv_c_flags__mvsx=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mvsx +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + VSX_CFLAGS="-mvsx $VSX_CFLAGS" +else + as_fn_error $? "Need a version of gcc with -mvsx" "$LINENO" 5 +fi + + fi + ;; + + ibm) + if test "$have_vsx" = "yes" -a "x$VSX_CFLAGS" = x; then + # Note that IBM xlC uses -qaltivec for VSX too. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -qaltivec" >&5 +$as_echo_n "checking whether C compiler accepts -qaltivec... " >&6; } +if ${ax_cv_c_flags__qaltivec+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-qaltivec" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__qaltivec=yes +else + ax_cv_c_flags__qaltivec=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__qaltivec +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + VSX_CFLAGS="-qaltivec" +else + as_fn_error $? "Need a version of gcc with -qaltivec" "$LINENO" 5 +fi + + fi + ;; +esac + + + + + + + + + + +if test "$with_incoming_stack_boundary"x != "no"x; then + case "${ax_cv_c_compiler_vendor}" in + gnu) + tentative_flags="-mincoming-stack-boundary=$with_incoming_stack_boundary"; + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $tentative_flags" >&5 +$as_echo_n "checking whether C compiler accepts $tentative_flags... " >&6; } +ax_save_FLAGS=$CFLAGS + CFLAGS="$tentative_flags" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval `$as_echo "ax_cv_c_flags_$tentative_flags" | $as_tr_sh`=yes +else + eval `$as_echo "ax_cv_c_flags_$tentative_flags" | $as_tr_sh`=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +eval ax_check_compiler_flags=$`$as_echo "ax_cv_c_flags_$tentative_flags" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + STACK_ALIGN_CFLAGS=$tentative_flags +else + : +fi + + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in fcntl.h fenv.h limits.h malloc.h stddef.h sys/time.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +save_CFLAGS="$CFLAGS" +save_CPPFLAGS="$CPPFLAGS" +CFLAGS="$CFLAGS $ALTIVEC_CFLAGS $VSX_CFLAGS" +CPPFLAGS="$CPPFLAGS $ALTIVEC_CFLAGS $VSX_CFLAGS" +for ac_header in altivec.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "altivec.h" "ac_cv_header_altivec_h" "$ac_includes_default" +if test "x$ac_cv_header_altivec_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ALTIVEC_H 1 +_ACEOF + +fi + +done + +CFLAGS="$save_CFLAGS" +CPPFLAGS="$save_CPPFLAGS" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" +case $ac_cv_c_uint32_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT32_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint32_t $ac_cv_c_uint32_t +_ACEOF +;; + esac + +ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" +case $ac_cv_c_uint64_t in #( + no|yes) ;; #( + *) + +$as_echo "#define _UINT64_T 1" >>confdefs.h + + +cat >>confdefs.h <<_ACEOF +#define uint64_t $ac_cv_c_uint64_t +_ACEOF +;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "long double" "ac_cv_type_long_double" "$ac_includes_default" +if test "x$ac_cv_type_long_double" = xyes; then : + +$as_echo "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + +else + +if test $PRECISION = l; then + as_fn_error $? "long double is not a supported type with your compiler." "$LINENO" 5 +fi + +fi + +ac_fn_c_check_type "$LINENO" "hrtime_t" "ac_cv_type_hrtime_t" " +#if HAVE_SYS_TIME_H +#include +#endif + +" +if test "x$ac_cv_type_hrtime_t" = xyes; then : + +$as_echo "#define HAVE_HRTIME_T 1" >>confdefs.h + +fi + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5 +$as_echo_n "checking size of unsigned int... " >&6; } +if ${ac_cv_sizeof_unsigned_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5 +$as_echo "$ac_cv_sizeof_unsigned_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 +$as_echo_n "checking size of unsigned long... " >&6; } +if ${ac_cv_sizeof_unsigned_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5 +$as_echo_n "checking size of unsigned long long... " >&6; } +if ${ac_cv_sizeof_unsigned_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_unsigned_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (unsigned long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_unsigned_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 +$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 +$as_echo_n "checking size of size_t... " >&6; } +if ${ac_cv_sizeof_size_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_size_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (size_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_size_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 +$as_echo "$ac_cv_sizeof_size_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ptrdiff_t" >&5 +$as_echo_n "checking size of ptrdiff_t... " >&6; } +if ${ac_cv_sizeof_ptrdiff_t+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ptrdiff_t))" "ac_cv_sizeof_ptrdiff_t" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_ptrdiff_t" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (ptrdiff_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_ptrdiff_t=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ptrdiff_t" >&5 +$as_echo "$ac_cv_sizeof_ptrdiff_t" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_PTRDIFF_T $ac_cv_sizeof_ptrdiff_t +_ACEOF + + + +ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_PTRDIFF_T 1 +_ACEOF + + +fi + +ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default +#ifdef HAVE_STDINT_H +# include +#endif +" +if test "x$ac_cv_type_uintptr_t" = xyes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINTPTR_T 1 +_ACEOF + + +else + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if ${ac_cv_sizeof_void_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_void_p" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void *) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_void_p=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +$as_echo "$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF + + +fi + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 +$as_echo_n "checking size of float... " >&6; } +if ${ac_cv_sizeof_float+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_float" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (float) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_float=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5 +$as_echo "$ac_cv_sizeof_float" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FLOAT $ac_cv_sizeof_float +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 +$as_echo_n "checking size of double... " >&6; } +if ${ac_cv_sizeof_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_double" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (double) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_double=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5 +$as_echo "$ac_cv_sizeof_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_DOUBLE $ac_cv_sizeof_double +_ACEOF + + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fftw_r2r_kind" >&5 +$as_echo_n "checking size of fftw_r2r_kind... " >&6; } +if ${ac_cv_sizeof_fftw_r2r_kind+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fftw_r2r_kind))" "ac_cv_sizeof_fftw_r2r_kind" "typedef enum { + FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, + FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, + FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 +} fftw_r2r_kind; +"; then : + +else + if test "$ac_cv_type_fftw_r2r_kind" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (fftw_r2r_kind) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_fftw_r2r_kind=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_fftw_r2r_kind" >&5 +$as_echo "$ac_cv_sizeof_fftw_r2r_kind" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_FFTW_R2R_KIND $ac_cv_sizeof_fftw_r2r_kind +_ACEOF + + +if test 0 = $ac_cv_sizeof_fftw_r2r_kind; then as_fn_error $? "sizeof(fftw_r2r_kind) test failed" "$LINENO" 5; fi +C_FFTW_R2R_KIND=C_INT`expr $ac_cv_sizeof_fftw_r2r_kind \* 8`_T + + +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +$as_echo_n "checking for working alloca.h... " >&6; } +if ${ac_cv_working_alloca_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_working_alloca_h=yes +else + ac_cv_working_alloca_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +$as_echo "$ac_cv_working_alloca_h" >&6; } +if test $ac_cv_working_alloca_h = yes; then + +$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +$as_echo_n "checking for alloca... " >&6; } +if ${ac_cv_func_alloca_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca (size_t); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + if (p) return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_func_alloca_works=yes +else + ac_cv_func_alloca_works=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +$as_echo "$ac_cv_func_alloca_works" >&6; } + +if test $ac_cv_func_alloca_works = yes; then + +$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +$as_echo "#define C_ALLOCA 1" >>confdefs.h + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +if ${ac_cv_os_cray+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#if defined CRAY && ! defined CRAY2 +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then : + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +$as_echo "$ac_cv_os_cray" >&6; } +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +$as_echo_n "checking stack direction for C alloca... " >&6; } +if ${ac_cv_c_stack_direction+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_c_stack_direction=0 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +find_stack_direction (int *addr, int depth) +{ + int dir, dummy = 0; + if (! addr) + addr = &dummy; + *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; + dir = depth ? find_stack_direction (addr, depth - 1) : 0; + return dir + dummy; +} + +int +main (int argc, char **argv) +{ + return find_stack_direction (0, argc + !argv + 20) < 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_stack_direction=1 +else + ac_cv_c_stack_direction=-1 +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +$as_echo "$ac_cv_c_stack_direction" >&6; } +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strtod" >&5 +$as_echo_n "checking for working strtod... " >&6; } +if ${ac_cv_func_strtod+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + ac_cv_func_strtod=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +$ac_includes_default +#ifndef strtod +double strtod (); +#endif +int +main() +{ + { + /* Some versions of Linux strtod mis-parse strings with leading '+'. */ + char *string = " +69"; + char *term; + double value; + value = strtod (string, &term); + if (value != 69 || term != (string + 4)) + return 1; + } + + { + /* Under Solaris 2.4, strtod returns the wrong value for the + terminating character under some conditions. */ + char *string = "NaN"; + char *term; + strtod (string, &term); + if (term != string && *(term - 1) == 0) + return 1; + } + return 0; +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_func_strtod=yes +else + ac_cv_func_strtod=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtod" >&5 +$as_echo "$ac_cv_func_strtod" >&6; } +if test $ac_cv_func_strtod = no; then + case " $LIBOBJS " in + *" strtod.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtod.$ac_objext" + ;; +esac + +ac_fn_c_check_func "$LINENO" "pow" "ac_cv_func_pow" +if test "x$ac_cv_func_pow" = xyes; then : + +fi + +if test $ac_cv_func_pow = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pow in -lm" >&5 +$as_echo_n "checking for pow in -lm... " >&6; } +if ${ac_cv_lib_m_pow+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pow (); +int +main () +{ +return pow (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_pow=yes +else + ac_cv_lib_m_pow=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_pow" >&5 +$as_echo "$ac_cv_lib_m_pow" >&6; } +if test "x$ac_cv_lib_m_pow" = xyes; then : + POW_LIB=-lm +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot find library containing definition of pow" >&5 +$as_echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;} +fi + +fi + +fi + +for ac_func in vprintf +do : + ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" +if test "x$ac_cv_func_vprintf" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VPRINTF 1 +_ACEOF + +ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" +if test "x$ac_cv_func__doprnt" = xyes; then : + +$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h + +fi + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 +$as_echo_n "checking for sin in -lm... " >&6; } +if ${ac_cv_lib_m_sin+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sin (); +int +main () +{ +return sin (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_sin=yes +else + ac_cv_lib_m_sin=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 +$as_echo "$ac_cv_lib_m_sin" >&6; } +if test "x$ac_cv_lib_m_sin" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +fi + + +if test $PRECISION = q; then + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using gcc 4.6.0 or later" >&5 +$as_echo_n "checking whether we are using gcc 4.6.0 or later... " >&6; } +if ${ax_cv_gcc_4_6_0+:} false; then : + $as_echo_n "(cached) " >&6 +else + +ax_cv_gcc_4_6_0=no +if test "$GCC" = "yes"; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef __GNUC__ +# if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ > 6) \ + || (__GNUC__ == 4 && __GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ >= 0) + yes; +# endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + ax_cv_gcc_4_6_0=yes +fi +rm -f conftest* + +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_4_6_0" >&5 +$as_echo "$ax_cv_gcc_4_6_0" >&6; } +if test "$ax_cv_gcc_4_6_0" = yes; then + : +else + as_fn_error $? "gcc 4.6 or later required for quad precision support" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sinq in -lquadmath" >&5 +$as_echo_n "checking for sinq in -lquadmath... " >&6; } +if ${ac_cv_lib_quadmath_sinq+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lquadmath $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char sinq (); +int +main () +{ +return sinq (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_quadmath_sinq=yes +else + ac_cv_lib_quadmath_sinq=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quadmath_sinq" >&5 +$as_echo "$ac_cv_lib_quadmath_sinq" >&6; } +if test "x$ac_cv_lib_quadmath_sinq" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBQUADMATH 1 +_ACEOF + + LIBS="-lquadmath $LIBS" + +else + as_fn_error $? "quad precision requires libquadmath for quad-precision trigonometric routines" "$LINENO" 5 +fi + + LIBQUADMATH=-lquadmath +fi + + +for ac_func in BSDgettimeofday gettimeofday gethrtime read_real_time time_base_to_time drand48 sqrt memset posix_memalign memalign _mm_malloc _mm_free clock_gettime mach_absolute_time sysctl abort sinl cosl snprintf memmove strchr getpagesize +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +ac_fn_c_check_decl "$LINENO" "sinl" "ac_cv_have_decl_sinl" "#include +" +if test "x$ac_cv_have_decl_sinl" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SINL $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "cosl" "ac_cv_have_decl_cosl" "#include +" +if test "x$ac_cv_have_decl_cosl" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_COSL $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "sinq" "ac_cv_have_decl_sinq" "#include +" +if test "x$ac_cv_have_decl_sinq" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SINQ $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "cosq" "ac_cv_have_decl_cosq" "#include +" +if test "x$ac_cv_have_decl_cosq" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_COSQ $ac_have_decl +_ACEOF + +ac_fn_c_check_decl "$LINENO" "memalign" "ac_cv_have_decl_memalign" " +#ifdef HAVE_MALLOC_H +#include +#endif +" +if test "x$ac_cv_have_decl_memalign" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MEMALIGN $ac_have_decl +_ACEOF + +ac_fn_c_check_decl "$LINENO" "drand48" "ac_cv_have_decl_drand48" "$ac_includes_default" +if test "x$ac_cv_have_decl_drand48" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_DRAND48 $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "srand48" "ac_cv_have_decl_srand48" "$ac_includes_default" +if test "x$ac_cv_have_decl_srand48" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SRAND48 $ac_have_decl +_ACEOF +ac_fn_c_check_decl "$LINENO" "posix_memalign" "ac_cv_have_decl_posix_memalign" "$ac_includes_default" +if test "x$ac_cv_have_decl_posix_memalign" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_POSIX_MEMALIGN $ac_have_decl +_ACEOF + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rtc intrinsic" >&5 +$as_echo_n "checking for _rtc intrinsic... " >&6; } +rtc_ok=yes +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_INTRINSICS_H +#include +#endif +int +main () +{ +_rtc() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +$as_echo "#define HAVE__RTC 1" >>confdefs.h + +else + rtc_ok=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $rtc_ok" >&5 +$as_echo "$rtc_ok" >&6; } + +if test "$PRECISION" = "l"; then + for ac_func in cosl sinl tanl +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + as_fn_error $? "long-double precision requires long-double trigonometric routines" "$LINENO" 5 +fi +done + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan" >&5 +$as_echo_n "checking for isnan... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +if (!isnan(3.14159)) isnan(2.7183); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ok=yes +else + ok=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ok" = "yes"; then + +$as_echo "#define HAVE_ISNAN 1" >>confdefs.h + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ok}" >&5 +$as_echo "${ok}" >&6; } + + + +ax_gcc_aligns_stack=no +if test "$GCC" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mpreferred-stack-boundary=4" >&5 +$as_echo_n "checking whether C compiler accepts -mpreferred-stack-boundary=4... " >&6; } +if ${ax_cv_c_flags__mpreferred_stack_boundary_4+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-mpreferred-stack-boundary=4" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__mpreferred_stack_boundary_4=yes +else + ax_cv_c_flags__mpreferred_stack_boundary_4=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__mpreferred_stack_boundary_4 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the stack is at least 8-byte aligned by gcc" >&5 +$as_echo_n "checking whether the stack is at least 8-byte aligned by gcc... " >&6; } + save_CFLAGS="$CFLAGS" + CFLAGS="-O" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -malign-double" >&5 +$as_echo_n "checking whether C compiler accepts -malign-double... " >&6; } +if ${ax_cv_c_flags__malign_double+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_save_FLAGS=$CFLAGS + CFLAGS="-malign-double" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_c_flags__malign_double=yes +else + ax_cv_c_flags__malign_double=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_save_FLAGS +fi + +eval ax_check_compiler_flags=$ax_cv_c_flags__malign_double +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_check_compiler_flags" >&5 +$as_echo "$ax_check_compiler_flags" >&6; } +if test "x$ax_check_compiler_flags" = xyes; then + CFLAGS="$CFLAGS -malign-double" +else + : +fi + + if test "$cross_compiling" = yes; then : + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using gcc 3.0.0 or later" >&5 +$as_echo_n "checking whether we are using gcc 3.0.0 or later... " >&6; } +if ${ax_cv_gcc_3_0_0+:} false; then : + $as_echo_n "(cached) " >&6 +else + +ax_cv_gcc_3_0_0=no +if test "$GCC" = "yes"; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef __GNUC__ +# if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ > 0) \ + || (__GNUC__ == 3 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ >= 0) + yes; +# endif +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + ax_cv_gcc_3_0_0=yes +fi +rm -f conftest* + +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_gcc_3_0_0" >&5 +$as_echo "$ax_cv_gcc_3_0_0" >&6; } +if test "$ax_cv_gcc_3_0_0" = yes; then + ax_gcc_stack_align_bug=no +else + ax_gcc_stack_align_bug=yes +fi + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +# include + struct yuck { int blechh; }; + int one(void) { return 1; } + struct yuck ick(void) { struct yuck y; y.blechh = 3; return y; } +# define CHK_ALIGN(x) if ((((long) &(x)) & 0x7)) { fprintf(stderr, "bad alignment of " #x "\n"); exit(1); } + void blah(int foo) { double foobar; CHK_ALIGN(foobar); } + int main2(void) {double ok1; struct yuck y; double ok2; CHK_ALIGN(ok1); + CHK_ALIGN(ok2); y = ick(); blah(one()); return 0;} + int main(void) { if ((((long) (__builtin_alloca(0))) & 0x7)) __builtin_alloca(4); return main2(); } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_gcc_aligns_stack=yes; ax_gcc_stack_align_bug=no +else + ax_gcc_stack_align_bug=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + CFLAGS="$save_CFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_gcc_aligns_stack" >&5 +$as_echo "$ax_gcc_aligns_stack" >&6; } + +else + : +fi + +fi +if test "$ax_gcc_aligns_stack" = yes; then + : +else + : +fi + + +if test "${enable_debug}" = "yes"; then + CFLAGS="-g" +fi + +if test "$enable_debug" = yes || test "$USE_MAINTAINER_MODE" = yes; then +if test "$ac_test_CFLAGS" != "set"; then + if test $ac_cv_c_compiler_gnu = yes; then + CFLAGS="$CFLAGS -Wall -W -Wcast-qual -Wpointer-arith -Wcast-align -pedantic -Wno-long-long -Wshadow -Wbad-function-cast -Wwrite-strings -Wstrict-prototypes -Wredundant-decls -Wnested-externs" # -Wundef -Wconversion -Wmissing-prototypes -Wmissing-declarations + fi +fi +fi + +if test "$USE_MAINTAINER_MODE" = yes; then + # Extract the first word of "indent", so it can be a program name with args. +set dummy indent; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_INDENT+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $INDENT in + [\\/]* | ?:[\\/]*) + ac_cv_path_INDENT="$INDENT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_INDENT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_INDENT" && ac_cv_path_INDENT="indent" + ;; +esac +fi +INDENT=$ac_cv_path_INDENT +if test -n "$INDENT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INDENT" >&5 +$as_echo "$INDENT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # if INDENT is set to 'indent' then we didn't find indent + if test "$INDENT" != indent ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $INDENT is GNU indent" >&5 +$as_echo_n "checking if $INDENT is GNU indent... " >&6; } + if $INDENT --version 2>/dev/null | head -n 1|grep "GNU indent" > /dev/null ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + INDENT="$INDENT -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $INDENT does not appear to be GNU indent." >&5 +$as_echo "$as_me: WARNING: $INDENT does not appear to be GNU indent." >&2;} + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no indent program found: codelets will be ugly" >&5 +$as_echo "$as_me: WARNING: no indent program found: codelets will be ugly" >&2;} + INDENT=cat + fi +fi + + +# Check whether --enable-fortran was given. +if test "${enable_fortran+set}" = set; then : + enableval=$enable_fortran; enable_fortran=$enableval +else + enable_fortran=yes +fi + + +if test "$enable_fortran" = "yes"; then + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if ${ac_cv_f77_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if ${ac_cv_prog_f77_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_g=yes +else + ac_cv_prog_f77_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_direct_absolute_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +inherit_rpath_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +reload_flag_F77=$reload_flag +reload_cmds_F77=$reload_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + compiler_F77=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + GCC=$G77 + if test -n "$compiler"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + GCC_F77=$G77 + LD_F77=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + lt_prog_compiler_pic_F77='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_F77='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_F77='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_F77= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_F77='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl_F77='-Xlinker ' + if test -n "$lt_prog_compiler_pic_F77"; then + lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_F77='-Wl,-Wl,,' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_F77='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='--shared' + lt_prog_compiler_static_F77='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl_F77='-Wl,-Wl,,' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-qpic' + lt_prog_compiler_static_F77='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fPIC' + lt_prog_compiler_static_F77='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_F77='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_F77" >&6; } +lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_F77=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_F77"; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_F77=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_F77=yes + fi + else + lt_cv_prog_compiler_static_works_F77=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_F77"; then + : +else + lt_prog_compiler_static_F77= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_F77" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + always_export_symbols_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + compiler_needs_object_F77=no + enable_shared_with_static_runtimes_F77=no + export_dynamic_flag_spec_F77= + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic_F77=no + hardcode_direct_F77=no + hardcode_direct_absolute_F77=no + hardcode_libdir_flag_spec_F77= + hardcode_libdir_separator_F77= + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + inherit_rpath_F77=no + link_all_deplibs_F77=unknown + module_cmds_F77= + module_expsym_cmds_F77= + old_archive_from_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + thread_safe_flag_spec_F77= + whole_archive_flag_spec_F77= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_F77=no + ;; + esac + + ld_shlibs_F77=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_F77='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='' + ;; + m68k) + archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + export_dynamic_flag_spec_F77='$wl--export-all-symbols' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + haiku*) + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_F77=yes + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + shrext_cmds=.dll + archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_F77=yes + ;; + + interix[3-9]*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' + export_dynamic_flag_spec_F77='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec_F77= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_F77=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_F77='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_F77=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec_F77='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs_F77=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test no = "$ld_shlibs_F77"; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + file_list_spec_F77='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_F77=no + hardcode_direct_absolute_F77=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_F77='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__F77 +fi + + hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_F77='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__F77"; then + lt_cv_aix_libpath__F77=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__F77 +fi + + hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' $wl-bernotok' + allow_undefined_flag_F77=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_F77='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + fi + archive_cmds_need_lc_F77=yes + archive_expsym_cmds_F77='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='' + ;; + m68k) + archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + file_list_spec_F77='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' + enable_shared_with_static_runtimes_F77=yes + exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds_F77='chmod 644 $oldlib' + postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes_F77=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + compiler_needs_object_F77=yes + else + whole_archive_flag_spec_F77='' + fi + link_all_deplibs_F77=yes + allow_undefined_flag_F77=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_F77="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_F77="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs_F77=no + fi + + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + export_dynamic_flag_spec_F77='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + hardcode_direct_absolute_F77=yes + export_dynamic_flag_spec_F77='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat > conftest.$ac_ext <<_ACEOF + + subroutine foo + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs_F77=no + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + hardcode_libdir_separator_F77=: + inherit_rpath_F77=yes + link_all_deplibs_F77=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs_F77=yes + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + hardcode_direct_absolute_F77=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' + export_dynamic_flag_spec_F77='$wl-E' + else + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' + fi + else + ld_shlibs_F77=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + shrext_cmds=.dll + archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_F77=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + archive_cmds_need_lc_F77='no' + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds_F77='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds_F77='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds_F77='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec_F77='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_F77='$wl-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='$wl-z,text' + allow_undefined_flag_F77='$wl-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='$wl-R,$libdir' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec_F77='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test no = "$ld_shlibs_F77" && can_build_shared=no + +with_gnu_ld_F77=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_F77=no + else + lt_cv_archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; } + archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_F77='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || + test -n "$runpath_var_F77" || + test yes = "$hardcode_automatic_F77"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_F77" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" && + test no != "$hardcode_minus_L_F77"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test relink = "$hardcode_action_F77" || + test yes = "$inherit_rpath_F77"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + if test -z "$F77"; then + enable_fortran=no + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** Couldn't find f77 compiler; using default Fortran wrappers." >&5 +$as_echo "$as_me: WARNING: *** Couldn't find f77 compiler; using default Fortran wrappers." >&2;} + else + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $F77" >&5 +$as_echo_n "checking how to get verbose linking output from $F77... " >&6; } +if ${ac_cv_prog_f77_v+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_v= +# Try some options frequently used verbose output +for ac_verb in -v -verbose --verbose -V -\#\#\#; do + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF + +# Compile and link our simple test program by passing a flag (argument +# 1 to this macro) to the Fortran compiler in order to get +# "verbose" output that we can then parse for the Fortran linker +# flags. +ac_save_FFLAGS=$FFLAGS +FFLAGS="$FFLAGS $ac_verb" +eval "set x $ac_link" +shift +$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 +# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, +# LIBRARY_PATH; skip all such settings. +ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | + sed '/^Driving:/d; /^Configured with:/d; + '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` +$as_echo "$ac_f77_v_output" >&5 +FFLAGS=$ac_save_FFLAGS + +rm -rf conftest* + +# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where +# /foo, /bar, and /baz are search directories for the Fortran linker. +# Here, we change these into -L/foo -L/bar -L/baz (and put it first): +ac_f77_v_output="`echo $ac_f77_v_output | + grep 'LPATH is:' | + sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" + +# FIXME: we keep getting bitten by quoted arguments; a more general fix +# that detects unbalanced quotes in FLIBS should be implemented +# and (ugh) tested at some point. +case $ac_f77_v_output in + # With xlf replace commas with spaces, + # and remove "-link" and closing parenthesis. + *xlfentry*) + ac_f77_v_output=`echo $ac_f77_v_output | + sed ' + s/,/ /g + s/ -link / /g + s/) *$// + ' + ` ;; + + # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted + # $LIBS confuse us, and the libraries appear later in the output anyway). + *mGLOB_options_string*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; + + # Portland Group compiler has singly- or doubly-quoted -cmdline argument + # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. + # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". + *-cmdline\ * | *-ignore\ * | *-def\ *) + ac_f77_v_output=`echo $ac_f77_v_output | sed "\ + s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g + s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g + s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; + + # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. + *fort77*f2c*gcc*) + ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' + /:[ ]\+Running[ ]\{1,\}"gcc"/{ + /"-c"/d + /[.]c"*/d + s/^.*"gcc"/"gcc"/ + s/"//gp + }'` ;; + + # If we are using Cray Fortran then delete quotes. + *cft90*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; +esac + + + # look for -l* and *.a constructs in the output + for ac_arg in $ac_f77_v_output; do + case $ac_arg in + [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) + ac_cv_prog_f77_v=$ac_verb + break 2 ;; + esac + done +done +if test -z "$ac_cv_prog_f77_v"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $F77" >&5 +$as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $F77" >&2;} +fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 +$as_echo "$as_me: WARNING: compilation failed" >&2;} +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_v" >&5 +$as_echo "$ac_cv_prog_f77_v" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 libraries of $F77" >&5 +$as_echo_n "checking for Fortran 77 libraries of $F77... " >&6; } +if ${ac_cv_f77_libs+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$FLIBS" != "x"; then + ac_cv_f77_libs="$FLIBS" # Let the user override the test. +else + +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF + +# Compile and link our simple test program by passing a flag (argument +# 1 to this macro) to the Fortran compiler in order to get +# "verbose" output that we can then parse for the Fortran linker +# flags. +ac_save_FFLAGS=$FFLAGS +FFLAGS="$FFLAGS $ac_cv_prog_f77_v" +eval "set x $ac_link" +shift +$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5 +# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, +# LIBRARY_PATH; skip all such settings. +ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | + sed '/^Driving:/d; /^Configured with:/d; + '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` +$as_echo "$ac_f77_v_output" >&5 +FFLAGS=$ac_save_FFLAGS + +rm -rf conftest* + +# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where +# /foo, /bar, and /baz are search directories for the Fortran linker. +# Here, we change these into -L/foo -L/bar -L/baz (and put it first): +ac_f77_v_output="`echo $ac_f77_v_output | + grep 'LPATH is:' | + sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" + +# FIXME: we keep getting bitten by quoted arguments; a more general fix +# that detects unbalanced quotes in FLIBS should be implemented +# and (ugh) tested at some point. +case $ac_f77_v_output in + # With xlf replace commas with spaces, + # and remove "-link" and closing parenthesis. + *xlfentry*) + ac_f77_v_output=`echo $ac_f77_v_output | + sed ' + s/,/ /g + s/ -link / /g + s/) *$// + ' + ` ;; + + # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted + # $LIBS confuse us, and the libraries appear later in the output anyway). + *mGLOB_options_string*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; + + # Portland Group compiler has singly- or doubly-quoted -cmdline argument + # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. + # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". + *-cmdline\ * | *-ignore\ * | *-def\ *) + ac_f77_v_output=`echo $ac_f77_v_output | sed "\ + s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g + s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g + s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; + + # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. + *fort77*f2c*gcc*) + ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' + /:[ ]\+Running[ ]\{1,\}"gcc"/{ + /"-c"/d + /[.]c"*/d + s/^.*"gcc"/"gcc"/ + s/"//gp + }'` ;; + + # If we are using Cray Fortran then delete quotes. + *cft90*) + ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; +esac + + + +ac_cv_f77_libs= + +# Save positional arguments (if any) +ac_save_positional="$@" + +set X $ac_f77_v_output +while test $# != 1; do + shift + ac_arg=$1 + case $ac_arg in + [\\/]*.a | ?:[\\/]*.a) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi + ;; + -bI:*) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + if test "$ac_compiler_gnu" = yes; then + for ac_link_opt in $ac_arg; do + ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" + done +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi +fi + ;; + # Ignore these flags. + -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ + |-LANG:=* | -LIST:* | -LNO:* | -link) + ;; + -lkernel32) + case $host_os in + *cygwin*) ;; + *) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" + ;; + esac + ;; + -[LRuYz]) + # These flags, when seen by themselves, take an argument. + # We remove the space between option and argument and re-iterate + # unless we find an empty arg or a new option (starting with -) + case $2 in + "" | -*);; + *) + ac_arg="$ac_arg$2" + shift; shift + set X $ac_arg "$@" + ;; + esac + ;; + -YP,*) + for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_j" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_arg="$ac_arg $ac_j" + ac_cv_f77_libs="$ac_cv_f77_libs $ac_j" +fi + done + ;; + -[lLR]*) + ac_exists=false + for ac_i in $ac_cv_f77_libs; do + if test x"$ac_arg" = x"$ac_i"; then + ac_exists=true + break + fi + done + + if test x"$ac_exists" = xtrue; then : + +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" +fi + ;; + -zallextract*| -zdefaultextract) + ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" + ;; + # Ignore everything else. + esac +done +# restore positional arguments +set X $ac_save_positional; shift + +# We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, +# then we insist that the "run path" must be an absolute path (i.e. it +# must begin with a "/"). +case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + ac_ld_run_path=`$as_echo "$ac_f77_v_output" | + sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` + test "x$ac_ld_run_path" != x && + if test "$ac_compiler_gnu" = yes; then + for ac_link_opt in $ac_ld_run_path; do + ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" + done +else + ac_cv_f77_libs="$ac_cv_f77_libs $ac_ld_run_path" +fi + ;; +esac +fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_libs" >&5 +$as_echo "$ac_cv_f77_libs" >&6; } +FLIBS="$ac_cv_f77_libs" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran 77 libraries" >&5 +$as_echo_n "checking for dummy main to link with Fortran 77 libraries... " >&6; } +if ${ac_cv_f77_dummy_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_f77_dm_save_LIBS=$LIBS + LIBS="$LIBS $FLIBS" + ac_fortran_dm_var=F77_DUMMY_MAIN + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + # First, try linking without a dummy main: + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_fortran_dummy_main=none +else + ac_cv_fortran_dummy_main=unknown +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + if test $ac_cv_fortran_dummy_main = unknown; then + for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define $ac_fortran_dm_var $ac_func +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_fortran_dummy_main=$ac_func; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + fi + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + ac_cv_f77_dummy_main=$ac_cv_fortran_dummy_main + rm -rf conftest* + LIBS=$ac_f77_dm_save_LIBS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_dummy_main" >&5 +$as_echo "$ac_cv_f77_dummy_main" >&6; } +F77_DUMMY_MAIN=$ac_cv_f77_dummy_main +if test "$F77_DUMMY_MAIN" != unknown; then : + if test $F77_DUMMY_MAIN != none; then + +cat >>confdefs.h <<_ACEOF +#define F77_DUMMY_MAIN $F77_DUMMY_MAIN +_ACEOF + + if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then + +$as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h + + fi +fi +else + enable_fortran=no + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** Couldn't figure out how to link C and Fortran; using default Fortran wrappers." >&5 +$as_echo "$as_me: WARNING: *** Couldn't figure out how to link C and Fortran; using default Fortran wrappers." >&2;} +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + fi +else + +$as_echo "#define DISABLE_FORTRAN 1" >>confdefs.h + +fi + +if test "x$enable_fortran" = xyes; then + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 name-mangling scheme" >&5 +$as_echo_n "checking for Fortran 77 name-mangling scheme... " >&6; } +if ${ac_cv_f77_mangling+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + subroutine foobar() + return + end + subroutine foo_bar() + return + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + mv conftest.$ac_objext cfortran_test.$ac_objext + + ac_save_LIBS=$LIBS + LIBS="cfortran_test.$ac_objext $LIBS $FLIBS" + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_success=no + for ac_foobar in foobar FOOBAR; do + for ac_underscore in "" "_"; do + ac_func="$ac_foobar$ac_underscore" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_success=yes; break 2 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + done + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + if test "$ac_success" = "yes"; then + case $ac_foobar in + foobar) + ac_case=lower + ac_foo_bar=foo_bar + ;; + FOOBAR) + ac_case=upper + ac_foo_bar=FOO_BAR + ;; + esac + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_success_extra=no + for ac_extra in "" "_"; do + ac_func="$ac_foo_bar$ac_underscore$ac_extra" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_success_extra=yes; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + if test "$ac_success_extra" = "yes"; then + ac_cv_f77_mangling="$ac_case case" + if test -z "$ac_underscore"; then + ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" + else + ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" + fi + if test -z "$ac_extra"; then + ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" + else + ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" + fi + else + ac_cv_f77_mangling="unknown" + fi + else + ac_cv_f77_mangling="unknown" + fi + + LIBS=$ac_save_LIBS + rm -rf conftest* + rm -f cfortran_test* +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compile a simple Fortran program +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_mangling" >&5 +$as_echo "$ac_cv_f77_mangling" >&6; } + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +case $ac_cv_f77_mangling in + "lower case, no underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name" >>confdefs.h + ;; + "lower case, no underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h + ;; + "lower case, underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h + ;; + "lower case, underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) name ## __" >>confdefs.h + ;; + "upper case, no underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME" >>confdefs.h + ;; + "upper case, no underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h + ;; + "upper case, underscore, no extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h + ;; + "upper case, underscore, extra underscore") + $as_echo "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h + + $as_echo "#define F77_FUNC_(name,NAME) NAME ## __" >>confdefs.h + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 +$as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +case $ac_cv_f77_mangling in + upper*) ac_val="F77FOO" ;; + lower*) ac_val="f77foo" ;; + *) ac_val="unknown" ;; +esac +case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac + +f77foo="$ac_val" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +case $ac_cv_f77_mangling in + upper*) ac_val="F77_FOO" ;; + lower*) ac_val="f77_foo" ;; + *) ac_val="unknown" ;; +esac +case $ac_cv_f77_mangling in *," underscore"*) ac_val="$ac_val"_ ;; esac +case $ac_cv_f77_mangling in *," extra underscore"*) ac_val="$ac_val"_ ;; esac + +f77_foo="$ac_val" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + f77_foo2=`echo $f77foo | sed 's/77/77_/'` + if test "$f77_foo" = "$f77_foo2"; then + +$as_echo "#define F77_FUNC_EQUIV 1" >>confdefs.h + + + # Include g77 wrappers by default for GNU systems or gfortran + with_g77_wrappers=$ac_cv_f77_compiler_gnu + case $host_os in *gnu*) with_g77_wrappers=yes ;; esac + fi +else + with_g77_wrappers=no +fi + + +# Check whether --with-g77-wrappers was given. +if test "${with_g77_wrappers+set}" = set; then : + withval=$with_g77_wrappers; with_g77_wrappers=$withval +fi + +if test "x$with_g77_wrappers" = "xyes"; then + +$as_echo "#define WITH_G77_WRAPPERS 1" >>confdefs.h + +fi + +have_smp="no" +# Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; enable_openmp=$enableval +else + enable_openmp=no +fi + + +if test "$enable_openmp" = "yes"; then + +$as_echo "#define HAVE_OPENMP 1" >>confdefs.h + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenMP flag of C compiler" >&5 +$as_echo_n "checking for OpenMP flag of C compiler... " >&6; } +if ${ax_cv_c_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + saveCFLAGS=$CFLAGS +ax_cv_c_openmp=unknown +# Flags to try: -fopenmp (gcc), -openmp (icc), -mp (SGI & PGI), +# -xopenmp (Sun), -omp (Tru64), -qsmp=omp (AIX), none +ax_openmp_flags="-fopenmp -openmp -mp -xopenmp -omp -qsmp=omp none" +if test "x$OPENMP_CFLAGS" != x; then + ax_openmp_flags="$OPENMP_CFLAGS $ax_openmp_flags" +fi +for ax_openmp_flag in $ax_openmp_flags; do + case $ax_openmp_flag in + none) CFLAGS=$saveC ;; + *) CFLAGS="$saveCFLAGS $ax_openmp_flag" ;; + esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char omp_set_num_threads (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return omp_set_num_threads (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_c_openmp=$ax_openmp_flag; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +done +CFLAGS=$saveCFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_openmp" >&5 +$as_echo "$ax_cv_c_openmp" >&6; } +if test "x$ax_cv_c_openmp" = "xunknown"; then + as_fn_error $? "don't know how to enable OpenMP" "$LINENO" 5 +else + if test "x$ax_cv_c_openmp" != "xnone"; then + OPENMP_CFLAGS=$ax_cv_c_openmp + fi + +$as_echo "#define HAVE_OPENMP 1" >>confdefs.h + +fi + + +fi + +# Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then : + enableval=$enable_threads; enable_threads=$enableval +else + enable_threads=no +fi + + +if test "$enable_threads" = "yes"; then + +$as_echo "#define HAVE_THREADS 1" >>confdefs.h + +fi + + +# Check whether --with-combined-threads was given. +if test "${with_combined_threads+set}" = set; then : + withval=$with_combined_threads; with_combined_threads=$withval +else + with_combined_threads=no +fi + + +if test "$with_combined_threads" = yes; then + if test "$enable_openmp" = "yes"; then + as_fn_error $? "--with-combined-threads incompatible with --enable-openmp" "$LINENO" 5 + fi + if test "$enable_threads" != "yes"; then + as_fn_error $? "--with-combined-threads requires --enable-threads" "$LINENO" 5 + fi +fi + +THREADLIBS="" +if test "$enable_threads" = "yes"; then + # Win32 threads are the default on Windows: + if test -z "$THREADLIBS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32 threads" >&5 +$as_echo_n "checking for Win32 threads... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +_beginthreadex(0,0,0,0,0,0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + THREADLIBS=" "; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + + # POSIX threads, the default choice everywhere else: + if test -z "$THREADLIBS"; then + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + acx_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt -mthreads pthread --thread-safe pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# (where it should come before -mthreads to avoid spurious warnings) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 +$as_echo_n "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_acx_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$acx_pthread_config"; then + ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_acx_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" +fi +fi +acx_pthread_config=$ac_cv_prog_acx_pthread_config +if test -n "$acx_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 +$as_echo "$acx_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 +$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +pthread_t th; pthread_join(th, (void**) 0); + pthread_attr_init((pthread_attr_t*) 0); + pthread_cleanup_push((void(*)(void *)) 0, (void*) 0); + pthread_create((pthread_t*) 0, (pthread_attr_t*) 0, + (void*(*)(void *)) 0, (void*) 0); + pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + acx_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef F77_DUMMY_MAIN + +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } + +#endif +int +main () +{ +int attr=$attr; return attr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + attr_name=$attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 +$as_echo "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $attr_name +_ACEOF + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 +$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 +$as_echo "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + THREADLIBS="$PTHREAD_LIBS " + CC="$PTHREAD_CC" + +$as_echo "#define USING_POSIX_THREADS 1" >>confdefs.h + + : +else + acx_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + fi + + if test -z "$THREADLIBS"; then + as_fn_error $? "couldn't find threads library for --enable-threads" "$LINENO" 5 + fi + +$as_echo "#define HAVE_THREADS 1" >>confdefs.h + +fi + + if test "$enable_threads" = "yes"; then + THREADS_TRUE= + THREADS_FALSE='#' +else + THREADS_TRUE='#' + THREADS_FALSE= +fi + + if test "$enable_openmp" = "yes"; then + OPENMP_TRUE= + OPENMP_FALSE='#' +else + OPENMP_TRUE='#' + OPENMP_FALSE= +fi + + if test "$enable_threads" = "yes" -o "$enable_openmp" = "yes"; then + SMP_TRUE= + SMP_FALSE='#' +else + SMP_TRUE='#' + SMP_FALSE= +fi + + if test x"$with_combined_threads" = xyes; then + COMBINED_THREADS_TRUE= + COMBINED_THREADS_FALSE='#' +else + COMBINED_THREADS_TRUE='#' + COMBINED_THREADS_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a cycle counter is available" >&5 +$as_echo_n "checking whether a cycle counter is available... " >&6; } +save_CPPFLAGS=$CPPFLAGS +CPPFLAGS="$CPPFLAGS -I$srcdir/kernel" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include "cycle.h" +#ifndef HAVE_TICK_COUNTER +# error No cycle counter +#endif +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ok=yes +else + ok=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +CPPFLAGS=$save_CPPFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ok" >&5 +$as_echo "$ok" >&6; } +if test $ok = no && test "x$with_slow_timer" = xno; then + echo "***************************************************************" + echo "WARNING: No cycle counter found. FFTW will use ESTIMATE mode " + echo " for all plans. See the manual for more information." + echo "***************************************************************" +fi + + + +cat >>confdefs.h <<_ACEOF +#define FFTW_CC "$CC $CFLAGS" +_ACEOF + + +ac_config_files="$ac_config_files Makefile support/Makefile genfft/Makefile kernel/Makefile simd-support/Makefile dft/Makefile dft/scalar/Makefile dft/scalar/codelets/Makefile dft/simd/Makefile dft/simd/common/Makefile dft/simd/sse2/Makefile dft/simd/avx/Makefile dft/simd/avx-128-fma/Makefile dft/simd/avx2/Makefile dft/simd/avx2-128/Makefile dft/simd/avx512/Makefile dft/simd/kcvi/Makefile dft/simd/altivec/Makefile dft/simd/vsx/Makefile dft/simd/neon/Makefile dft/simd/generic-simd128/Makefile dft/simd/generic-simd256/Makefile rdft/Makefile rdft/scalar/Makefile rdft/scalar/r2cf/Makefile rdft/scalar/r2cb/Makefile rdft/scalar/r2r/Makefile rdft/simd/Makefile rdft/simd/common/Makefile rdft/simd/sse2/Makefile rdft/simd/avx/Makefile rdft/simd/avx-128-fma/Makefile rdft/simd/avx2/Makefile rdft/simd/avx2-128/Makefile rdft/simd/avx512/Makefile rdft/simd/kcvi/Makefile rdft/simd/altivec/Makefile rdft/simd/vsx/Makefile rdft/simd/neon/Makefile rdft/simd/generic-simd128/Makefile rdft/simd/generic-simd256/Makefile reodft/Makefile threads/Makefile api/Makefile mpi/Makefile libbench2/Makefile tests/Makefile doc/Makefile doc/FAQ/Makefile tools/Makefile tools/fftw_wisdom.1 tools/fftw-wisdom-to-conf m4/Makefile fftw.pc" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${BUILD_DOC_TRUE}" && test -z "${BUILD_DOC_FALSE}"; then + as_fn_error $? "conditional \"BUILD_DOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SINGLE_TRUE}" && test -z "${SINGLE_FALSE}"; then + as_fn_error $? "conditional \"SINGLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${LDOUBLE_TRUE}" && test -z "${LDOUBLE_FALSE}"; then + as_fn_error $? "conditional \"LDOUBLE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${QUAD_TRUE}" && test -z "${QUAD_FALSE}"; then + as_fn_error $? "conditional \"QUAD\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_SSE2_TRUE}" && test -z "${HAVE_SSE2_FALSE}"; then + as_fn_error $? "conditional \"HAVE_SSE2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_AVX_TRUE}" && test -z "${HAVE_AVX_FALSE}"; then + as_fn_error $? "conditional \"HAVE_AVX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_AVX2_TRUE}" && test -z "${HAVE_AVX2_FALSE}"; then + as_fn_error $? "conditional \"HAVE_AVX2\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_AVX512_TRUE}" && test -z "${HAVE_AVX512_FALSE}"; then + as_fn_error $? "conditional \"HAVE_AVX512\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_AVX_128_FMA_TRUE}" && test -z "${HAVE_AVX_128_FMA_FALSE}"; then + as_fn_error $? "conditional \"HAVE_AVX_128_FMA\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_KCVI_TRUE}" && test -z "${HAVE_KCVI_FALSE}"; then + as_fn_error $? "conditional \"HAVE_KCVI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_ALTIVEC_TRUE}" && test -z "${HAVE_ALTIVEC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_ALTIVEC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_VSX_TRUE}" && test -z "${HAVE_VSX_FALSE}"; then + as_fn_error $? "conditional \"HAVE_VSX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_NEON_TRUE}" && test -z "${HAVE_NEON_FALSE}"; then + as_fn_error $? "conditional \"HAVE_NEON\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GENERIC_SIMD128_TRUE}" && test -z "${HAVE_GENERIC_SIMD128_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GENERIC_SIMD128\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_GENERIC_SIMD256_TRUE}" && test -z "${HAVE_GENERIC_SIMD256_FALSE}"; then + as_fn_error $? "conditional \"HAVE_GENERIC_SIMD256\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${MPI_TRUE}" && test -z "${MPI_FALSE}"; then + as_fn_error $? "conditional \"MPI\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${THREADS_TRUE}" && test -z "${THREADS_FALSE}"; then + as_fn_error $? "conditional \"THREADS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${OPENMP_TRUE}" && test -z "${OPENMP_FALSE}"; then + as_fn_error $? "conditional \"OPENMP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${SMP_TRUE}" && test -z "${SMP_FALSE}"; then + as_fn_error $? "conditional \"SMP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${COMBINED_THREADS_TRUE}" && test -z "${COMBINED_THREADS_FALSE}"; then + as_fn_error $? "conditional \"COMBINED_THREADS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by fftw $as_me 3.3.8, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +fftw config.status 3.3.8 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' +reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' +reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' +compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' +GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' +archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' +module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' +hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' +inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' +always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' +include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' +prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' +postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' +file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' +hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +LD_F77 \ +reload_flag_F77 \ +compiler_F77 \ +lt_prog_compiler_no_builtin_flag_F77 \ +lt_prog_compiler_pic_F77 \ +lt_prog_compiler_wl_F77 \ +lt_prog_compiler_static_F77 \ +lt_cv_prog_compiler_c_o_F77 \ +export_dynamic_flag_spec_F77 \ +whole_archive_flag_spec_F77 \ +compiler_needs_object_F77 \ +with_gnu_ld_F77 \ +allow_undefined_flag_F77 \ +no_undefined_flag_F77 \ +hardcode_libdir_flag_spec_F77 \ +hardcode_libdir_separator_F77 \ +exclude_expsyms_F77 \ +include_expsyms_F77 \ +file_list_spec_F77; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_F77 \ +old_archive_cmds_F77 \ +old_archive_from_new_cmds_F77 \ +old_archive_from_expsyms_cmds_F77 \ +archive_cmds_F77 \ +archive_expsym_cmds_F77 \ +module_cmds_F77 \ +module_expsym_cmds_F77 \ +export_symbols_cmds_F77 \ +prelink_cmds_F77 \ +postlink_cmds_F77; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "support/Makefile") CONFIG_FILES="$CONFIG_FILES support/Makefile" ;; + "genfft/Makefile") CONFIG_FILES="$CONFIG_FILES genfft/Makefile" ;; + "kernel/Makefile") CONFIG_FILES="$CONFIG_FILES kernel/Makefile" ;; + "simd-support/Makefile") CONFIG_FILES="$CONFIG_FILES simd-support/Makefile" ;; + "dft/Makefile") CONFIG_FILES="$CONFIG_FILES dft/Makefile" ;; + "dft/scalar/Makefile") CONFIG_FILES="$CONFIG_FILES dft/scalar/Makefile" ;; + "dft/scalar/codelets/Makefile") CONFIG_FILES="$CONFIG_FILES dft/scalar/codelets/Makefile" ;; + "dft/simd/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/Makefile" ;; + "dft/simd/common/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/common/Makefile" ;; + "dft/simd/sse2/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/sse2/Makefile" ;; + "dft/simd/avx/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/avx/Makefile" ;; + "dft/simd/avx-128-fma/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/avx-128-fma/Makefile" ;; + "dft/simd/avx2/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/avx2/Makefile" ;; + "dft/simd/avx2-128/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/avx2-128/Makefile" ;; + "dft/simd/avx512/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/avx512/Makefile" ;; + "dft/simd/kcvi/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/kcvi/Makefile" ;; + "dft/simd/altivec/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/altivec/Makefile" ;; + "dft/simd/vsx/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/vsx/Makefile" ;; + "dft/simd/neon/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/neon/Makefile" ;; + "dft/simd/generic-simd128/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/generic-simd128/Makefile" ;; + "dft/simd/generic-simd256/Makefile") CONFIG_FILES="$CONFIG_FILES dft/simd/generic-simd256/Makefile" ;; + "rdft/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/Makefile" ;; + "rdft/scalar/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/scalar/Makefile" ;; + "rdft/scalar/r2cf/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/scalar/r2cf/Makefile" ;; + "rdft/scalar/r2cb/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/scalar/r2cb/Makefile" ;; + "rdft/scalar/r2r/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/scalar/r2r/Makefile" ;; + "rdft/simd/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/Makefile" ;; + "rdft/simd/common/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/common/Makefile" ;; + "rdft/simd/sse2/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/sse2/Makefile" ;; + "rdft/simd/avx/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/avx/Makefile" ;; + "rdft/simd/avx-128-fma/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/avx-128-fma/Makefile" ;; + "rdft/simd/avx2/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/avx2/Makefile" ;; + "rdft/simd/avx2-128/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/avx2-128/Makefile" ;; + "rdft/simd/avx512/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/avx512/Makefile" ;; + "rdft/simd/kcvi/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/kcvi/Makefile" ;; + "rdft/simd/altivec/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/altivec/Makefile" ;; + "rdft/simd/vsx/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/vsx/Makefile" ;; + "rdft/simd/neon/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/neon/Makefile" ;; + "rdft/simd/generic-simd128/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/generic-simd128/Makefile" ;; + "rdft/simd/generic-simd256/Makefile") CONFIG_FILES="$CONFIG_FILES rdft/simd/generic-simd256/Makefile" ;; + "reodft/Makefile") CONFIG_FILES="$CONFIG_FILES reodft/Makefile" ;; + "threads/Makefile") CONFIG_FILES="$CONFIG_FILES threads/Makefile" ;; + "api/Makefile") CONFIG_FILES="$CONFIG_FILES api/Makefile" ;; + "mpi/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/Makefile" ;; + "libbench2/Makefile") CONFIG_FILES="$CONFIG_FILES libbench2/Makefile" ;; + "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "doc/FAQ/Makefile") CONFIG_FILES="$CONFIG_FILES doc/FAQ/Makefile" ;; + "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; + "tools/fftw_wisdom.1") CONFIG_FILES="$CONFIG_FILES tools/fftw_wisdom.1" ;; + "tools/fftw-wisdom-to-conf") CONFIG_FILES="$CONFIG_FILES tools/fftw-wisdom-to-conf" ;; + "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; + "fftw.pc") CONFIG_FILES="$CONFIG_FILES fftw.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='F77 ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: F77 + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_F77 +reload_cmds=$lt_reload_cmds_F77 + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_F77 + +# A language specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU compiler? +with_gcc=$GCC_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_F77 + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_F77 + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_F77 + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_F77 + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_F77 + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_F77 + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_F77 + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# ### END LIBTOOL TAG CONFIG: F77 +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/configure.ac b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/configure.ac new file mode 100644 index 000000000..2a2e8c7d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/configure.ac @@ -0,0 +1,819 @@ + + +dnl Process this file with autoconf to produce a configure script. + +dnl Define the fftw version number as M4 macros, so that we can enforce +dnl the invariant that the minor version number in FFTW-X.Y.MINOR is the same +dnl as the revision number in SHARED_VERSION_INFO. +define(FFTW_MAJOR_VERSION, 3.3)dnl +define(FFTW_MINOR_VERSION, 8)dnl + +dnl Version number of the FFTW source package. +AC_INIT(fftw, FFTW_MAJOR_VERSION.FFTW_MINOR_VERSION, fftw@fftw.org) +AC_CONFIG_SRCDIR(kernel/ifftw.h) + +dnl Version number for libtool shared libraries. Libtool wants a string +dnl of the form CURRENT:REVISION:AGE. We adopt the convention that +dnl REVISION is the same as the FFTW minor version number. +dnl fftw-3.1.x was 4:x:1 +dnl fftw-3.2.x was 5:x:2 +dnl fftw-3.3.x was 6:x:3 for x < 4 +dnl fftw-3.3.4 was 7:x:4 +dnl fftw-3.3.5 was 8:x:5 (added planner hooks) +dnl fftw-3.3.6 was 8:x:6 (8:x:6 is a bug, should have been 8:x:5. No API changes) +dnl fftw-3.3.6.1 fixes the 8:x:6 screwup +dnl fftw-3.3.7 was 8:x:5 (No API changes) +dnl fftw-3.3.8 was 8:x:5 (No API changes) +SHARED_VERSION_INFO="8:FFTW_MINOR_VERSION:5" # CURRENT:REVISION:AGE + +AM_INIT_AUTOMAKE(1.7) +AM_CONFIG_HEADER(config.h) +AC_CONFIG_MACRO_DIR([m4]) +AM_MAINTAINER_MODE +AC_SUBST(SHARED_VERSION_INFO) +AC_DISABLE_SHARED dnl to hell with shared libraries +AC_CANONICAL_HOST + +dnl configure options +case "${host_cpu}" in + powerpc*) arch_prefers_fma=yes;; + ia64*) arch_prefers_fma=yes;; + hppa*) arch_prefers_fma=yes;; + mips64*) arch_prefers_fma=yes;; + *) arch_prefers_fma=no;; +esac + +AC_ARG_ENABLE(debug, [AC_HELP_STRING([--enable-debug],[compile fftw with extra runtime checks for debugging])], ok=$enableval, ok=no) +if test "$ok" = "yes"; then + AC_DEFINE(FFTW_DEBUG,1,[Define to enable extra FFTW debugging code.]) +fi + +AC_ARG_ENABLE(doc, [AC_HELP_STRING([--disable-doc],[disable building the documentation])], build_doc=$enableval, build_doc=yes) +AM_CONDITIONAL(BUILD_DOC, test x"$build_doc" = xyes) + +AC_ARG_ENABLE(random-estimator, [AC_HELP_STRING([--enable-random-estimator],[enable pseudorandom estimator (debugging hack)])], ok=$enableval, ok=no) +if test "$ok" = "yes"; then + AC_DEFINE(FFTW_RANDOM_ESTIMATOR,1,[Define to enable pseudorandom estimate planning for debugging.]) + CHECK_PL_OPTS="--estimate" +fi + +AC_ARG_ENABLE(alloca, [AC_HELP_STRING([--disable-alloca],[disable use of the alloca() function (may be broken on mingw64)])], ok=$enableval, ok=yes) +if test "$ok" = "yes"; then + AC_DEFINE(FFTW_ENABLE_ALLOCA,1,[Define to enable the use of alloca().]) +fi + +AC_ARG_ENABLE(single, [AC_HELP_STRING([--enable-single],[compile fftw in single precision])], ok=$enableval, ok=no) +AC_ARG_ENABLE(float, [AC_HELP_STRING([--enable-float],[synonym for --enable-single])], ok=$enableval) +if test "$ok" = "yes"; then + AC_DEFINE(FFTW_SINGLE,1,[Define to compile in single precision.]) + AC_DEFINE(BENCHFFT_SINGLE,1,[Define to compile in single precision.]) + PRECISION=s +else + PRECISION=d +fi +AM_CONDITIONAL(SINGLE, test "$ok" = "yes") + +AC_ARG_ENABLE(long-double, [AC_HELP_STRING([--enable-long-double],[compile fftw in long-double precision])], ok=$enableval, ok=no) +if test "$ok" = "yes"; then + if test "$PRECISION" = "s"; then + AC_MSG_ERROR([--enable-single/--enable-long-double conflict]) + fi + AC_DEFINE(FFTW_LDOUBLE,1,[Define to compile in long-double precision.]) + AC_DEFINE(BENCHFFT_LDOUBLE,1,[Define to compile in long-double precision.]) + PRECISION=l +fi +AM_CONDITIONAL(LDOUBLE, test "$ok" = "yes") + +AC_ARG_ENABLE(quad-precision, [AC_HELP_STRING([--enable-quad-precision],[compile fftw in quadruple precision if available])], ok=$enableval, ok=no) +if test "$ok" = "yes"; then + if test "$PRECISION" != "d"; then + AC_MSG_ERROR([conflicting precisions specified]) + fi + AC_DEFINE(FFTW_QUAD,1,[Define to compile in quad precision.]) + AC_DEFINE(BENCHFFT_QUAD,1,[Define to compile in quad precision.]) + PRECISION=q +fi +AM_CONDITIONAL(QUAD, test "$ok" = "yes") + +AC_SUBST(PRECISION) +AC_SUBST(CHECK_PL_OPTS) + +dnl SSE/SSE2 theory: +dnl +dnl Historically, you had to supply --enable-sse in single precision and --enable-sse2 +dnl in double precision. +dnl +dnl This behavior is pointless in 2016. --enable-sse2 now works in both precisions, +dnl and is interpreted as --enable-sse in single precision. The old flag --enable--se +dnl is still supported in single-precision only. +AC_ARG_ENABLE(sse, [AC_HELP_STRING([--enable-sse],[enable SSE optimizations])], have_sse=$enableval, have_sse=no) +if test "$have_sse" = "yes"; then + if test "$PRECISION" != "s"; then + AC_MSG_ERROR([SSE requires single precision]) + fi +fi + +AC_ARG_ENABLE(sse2, [AC_HELP_STRING([--enable-sse2],[enable SSE/SSE2 optimizations])], have_sse2=$enableval, have_sse2=no) +if test "$have_sse" = "yes"; then have_sse2=yes; fi +if test "$have_sse2" = "yes"; then + AC_DEFINE(HAVE_SSE2,1,[Define to enable SSE/SSE2 optimizations.]) + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + AC_MSG_ERROR([SSE2 requires single or double precision]) + fi +fi +AM_CONDITIONAL(HAVE_SSE2, test "$have_sse2" = "yes") + +AC_ARG_ENABLE(avx, [AC_HELP_STRING([--enable-avx],[enable AVX optimizations])], have_avx=$enableval, have_avx=no) +if test "$have_avx" = "yes"; then + AC_DEFINE(HAVE_AVX,1,[Define to enable AVX optimizations.]) + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + AC_MSG_ERROR([AVX requires single or double precision]) + fi +fi +AM_CONDITIONAL(HAVE_AVX, test "$have_avx" = "yes") + +AC_ARG_ENABLE(avx2, [AC_HELP_STRING([--enable-avx2],[enable AVX2 optimizations])], have_avx2=$enableval, have_avx2=no) +if test "$have_avx2" = "yes"; then + AC_DEFINE(HAVE_AVX2,1,[Define to enable AVX2 optimizations.]) + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + AC_MSG_ERROR([AVX2 requires single or double precision]) + fi +fi +AM_CONDITIONAL(HAVE_AVX2, test "$have_avx2" = "yes") + +AC_ARG_ENABLE(avx512, [AC_HELP_STRING([--enable-avx512],[enable AVX512 optimizations])], have_avx512=$enableval, have_avx512=no) +if test "$have_avx512" = "yes"; then + AC_DEFINE(HAVE_AVX512,1,[Define to enable AVX512 optimizations.]) + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + AC_MSG_ERROR([AVX512 requires single or double precision]) + fi +fi +AM_CONDITIONAL(HAVE_AVX512, test "$have_avx512" = "yes") + +dnl 128-bit AVX is special. There is no reason to use it on Intel processors +dnl since SSE2 is just as fast. However, on AMD processors we can both use +dnl FMA4, and 128-bit SIMD is better than 256-bit since core pairs in a +dnl compute unit can execute two 128-bit instructions independently. +AC_ARG_ENABLE(avx-128-fma, [AC_HELP_STRING([--enable-avx-128-fma],[enable AVX128/FMA optimizations])], have_avx_128_fma=$enableval, have_avx_128_fma=no) +if test "$have_avx_128_fma" = "yes"; then + AC_DEFINE(HAVE_AVX_128_FMA,1,[Define to enable 128-bit FMA AVX optimization]) + AVX_128_FMA_CFLAGS="${AVX_CFLAGS} -mfma4" + AC_SUBST(AVX_128_FMA_CFLAGS) +fi +AM_CONDITIONAL(HAVE_AVX_128_FMA, test "$have_avx_128_fma" = "yes") + +AC_ARG_ENABLE(kcvi, [AC_HELP_STRING([--enable-kcvi],[enable Knights Corner vector instructions optimizations])], have_kcvi=$enableval, have_kcvi=no) +if test "$have_kcvi" = "yes"; then + AC_DEFINE(HAVE_KCVI,1,[Define to enable KCVI optimizations.]) + if test "$PRECISION" != "d" -a "$PRECISION" != "s"; then + AC_MSG_ERROR([Knights Corner vector instructions requires single or double precision]) + fi +fi +AM_CONDITIONAL(HAVE_KCVI, test "$have_kcvi" = "yes") + +AC_ARG_ENABLE(altivec, [AC_HELP_STRING([--enable-altivec],[enable Altivec optimizations])], have_altivec=$enableval, have_altivec=no) +if test "$have_altivec" = "yes"; then + AC_DEFINE(HAVE_ALTIVEC,1,[Define to enable Altivec optimizations.]) + if test "$PRECISION" != "s"; then + AC_MSG_ERROR([Altivec requires single precision]) + fi +fi +AM_CONDITIONAL(HAVE_ALTIVEC, test "$have_altivec" = "yes") + +AC_ARG_ENABLE(vsx, [AC_HELP_STRING([--enable-vsx],[enable IBM VSX optimizations])], have_vsx=$enableval, have_vsx=no) +if test "$have_vsx" = "yes"; then + AC_DEFINE(HAVE_VSX,1,[Define to enable IBM VSX optimizations.]) +fi +AM_CONDITIONAL(HAVE_VSX, test "$have_vsx" = "yes") + +AC_ARG_ENABLE(neon, [AC_HELP_STRING([--enable-neon],[enable ARM NEON optimizations])], have_neon=$enableval, have_neon=no) +if test "$have_neon" = "yes"; then + AC_DEFINE(HAVE_NEON,1,[Define to enable ARM NEON optimizations.]) + case "${host_cpu}" in + aarch64) + ;; + *) + if test "$PRECISION" != "s"; then + AC_MSG_ERROR([NEON requires single precision]) + fi + ;; + esac +fi +AM_CONDITIONAL(HAVE_NEON, test "$have_neon" = "yes") + +AC_ARG_ENABLE(armv8-pmccntr-el0, [AC_HELP_STRING([--enable-armv8-pmccntr-el0],[enable the cycle counter on ARMv8 via the PMCCNTR_EL0 register (see README-perfcounters for details and mandatory instructions)])], have_armv8pmccntrel0=$enableval) +if test "$have_armv8pmccntrel0"x = "yes"x; then + AC_DEFINE(HAVE_ARMV8_PMCCNTR_EL0,1,[Define if you have enabled the PMCCNTR_EL0 cycle counter on ARMv8]) +fi + +AC_ARG_ENABLE(armv8-cntvct-el0, [AC_HELP_STRING([--enable-armv8-cntvct-el0],[enable the cycle counter on ARMv8 via the CNTVCT_EL0 register (see README-perfcounters for details and mandatory instructions)])], have_armv8cntvctel0=$enableval) +if test "$have_armv8cntvctel0"x = "yes"x; then + AC_DEFINE(HAVE_ARMV8_CNTVCT_EL0,1,[Define if you have enabled the CNTVCT_EL0 cycle counter on ARMv8]) +fi + +AC_ARG_ENABLE(armv7a-cntvct, [AC_HELP_STRING([--enable-armv7a-cntvct],[enable the cycle counter on Armv7a via the CNTVCT register (see README-perfcounters for details and mandatory instructions)])], have_armv7acntvct=$enableval) +if test "$have_armv7acntvct"x = "yes"x; then + AC_DEFINE(HAVE_ARMV7A_CNTVCT,1,[Define if you have enabled the CNTVCT cycle counter on ARMv7a]) +fi + +AC_ARG_ENABLE(armv7a-pmccntr, [AC_HELP_STRING([--enable-armv7a-pmccntr],[enable the cycle counter on Armv7a via the PMCCNTR register (see README-perfcounters for details and mandatory instructions)])], have_armv7apmccntr=$enableval) +if test "$have_armv7apmccntr"x = "yes"x; then + AC_DEFINE(HAVE_ARMV7A_PMCCNTR,1,[Define if you have enabled the PMCCNTR cycle counter on ARMv7a]) +fi + +AC_ARG_ENABLE(generic-simd128, [AC_HELP_STRING([--enable-generic-simd128],[enable generic (gcc) 128-bit SIMD optimizations])], have_generic_simd128=$enableval, have_generic_simd128=no) +if test "$have_generic_simd128" = "yes"; then + AC_DEFINE(HAVE_GENERIC_SIMD128,1,[Define to enable generic (gcc) 128-bit SIMD optimizations.]) +fi +AM_CONDITIONAL(HAVE_GENERIC_SIMD128, test "$have_generic_simd128" = "yes") + +AC_ARG_ENABLE(generic-simd256, [AC_HELP_STRING([--enable-generic-simd256],[enable generic (gcc) 256-bit SIMD optimizations])], have_generic_simd256=$enableval, have_generic_simd256=no) +if test "$have_generic_simd256" = "yes"; then + AC_DEFINE(HAVE_GENERIC_SIMD256,1,[Define to enable generic (gcc) 256-bit SIMD optimizations.]) +fi +AM_CONDITIONAL(HAVE_GENERIC_SIMD256, test "$have_generic_simd256" = "yes") + + +dnl FIXME: +dnl AC_ARG_ENABLE(mips-ps, [AC_HELP_STRING([--enable-mips-ps],[enable MIPS pair-single optimizations])], have_mips_ps=$enableval, have_mips_ps=no) +dnl if test "$have_mips_ps" = "yes"; then +dnl AC_DEFINE(HAVE_MIPS_PS,1,[Define to enable MIPS paired-single optimizations.]) +dnl if test "$PRECISION" != "s"; then +dnl AC_MSG_ERROR([MIPS paired-single requires single precision]) +dnl fi +dnl fi +dnl AM_CONDITIONAL(HAVE_MIPS_PS, test "$have_mips_ps" = "yes") + +AC_ARG_WITH(slow-timer, [AC_HELP_STRING([--with-slow-timer],[use low-precision timers (SLOW)])], with_slow_timer=$withval, with_slow_timer=no) +if test "$with_slow_timer" = "yes"; then + AC_DEFINE(WITH_SLOW_TIMER,1,[Use low-precision timers, making planner very slow]) +fi + +AC_ARG_ENABLE(mips_zbus_timer, [AC_HELP_STRING([--enable-mips-zbus-timer],[use MIPS ZBus cycle-counter])], have_mips_zbus_timer=$enableval, have_mips_zbus_timer=no) +if test "$have_mips_zbus_timer" = "yes"; then + AC_DEFINE(HAVE_MIPS_ZBUS_TIMER,1,[Define to enable use of MIPS ZBus cycle-counter.]) +fi + +AC_ARG_WITH(our-malloc, [AC_HELP_STRING([--with-our-malloc],[use our aligned malloc (helpful for Win32)])], with_our_malloc=$withval, with_our_malloc=no) +AC_ARG_WITH(our-malloc16, [AC_HELP_STRING([--with-our-malloc16],[Obsolete alias for --with-our-malloc16])], with_our_malloc=$withval) +if test "$with_our_malloc" = "yes"; then + AC_DEFINE(WITH_OUR_MALLOC,1,[Use our own aligned malloc routine; mainly helpful for Windows systems lacking aligned allocation system-library routines.]) +fi + +AC_ARG_WITH(windows-f77-mangling, [AC_HELP_STRING([--with-windows-f77-mangling],[use common Win32 Fortran interface styles])], with_windows_f77_mangling=$withval, with_windows_f77_mangling=no) +if test "$with_windows_f77_mangling" = "yes"; then + AC_DEFINE(WINDOWS_F77_MANGLING,1,[Use common Windows Fortran mangling styles for the Fortran interfaces.]) +fi + +AC_ARG_WITH(incoming-stack-boundary, [AC_HELP_STRING([--with-incoming-stack-boundary=X],[Assume that stack is aligned to (1<]) + CC=$save_CC + if test 0 = $ac_cv_sizeof_MPI_Fint; then + AC_MSG_WARN([sizeof(MPI_Fint) test failed]); + dnl As a backup, assume Fortran integer == C int + AC_CHECK_SIZEOF(int) + if test 0 = $ac_cv_sizeof_int; then AC_MSG_ERROR([sizeof(int) test failed]); fi + ac_cv_sizeof_MPI_Fint=$ac_cv_sizeof_int + fi + C_MPI_FINT=C_INT`expr $ac_cv_sizeof_MPI_Fint \* 8`_T + AC_SUBST(C_MPI_FINT) +fi +AM_CONDITIONAL(MPI, test "$enable_mpi" = "yes") + +dnl ----------------------------------------------------------------------- + +dnl determine CFLAGS first +AX_CC_MAXOPT + +case "${ax_cv_c_compiler_vendor}" in + intel) # Stop icc from defining __GNUC__, except on MacOS where this fails + case "${host_os}" in + *darwin*) ;; # icc -no-gcc fails to compile some system headers + *) + AX_CHECK_COMPILER_FLAGS([-no-gcc], [CC="$CC -no-gcc"]) + ;; + esac + ;; + + hp) # must (sometimes) manually increase cpp limits to handle fftw3.h + AX_CHECK_COMPILER_FLAGS([-Wp,-H128000], + [CC="$CC -Wp,-H128000"]) + ;; + + portland) # -Masmkeyword required for asm("") cycle counters + AX_CHECK_COMPILER_FLAGS([-Masmkeyword], + [CC="$CC -Masmkeyword"]) + ;; +esac + +dnl Determine SIMD CFLAGS at least for gcc and icc +case "${ax_cv_c_compiler_vendor}" in + gnu|intel) + # SSE/SSE2 + if test "$have_sse2" = "yes" -a "x$SSE2_CFLAGS" = x; then + if test "$PRECISION" = d; then flag=msse2; else flag=msse; fi + AX_CHECK_COMPILER_FLAGS(-$flag, [SSE2_CFLAGS="-$flag"], + [AC_MSG_ERROR([Need a version of gcc with -$flag])]) + fi + + # AVX + if test "$have_avx" = "yes" -a "x$AVX_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mavx, [AVX_CFLAGS="-mavx"], + [AC_MSG_ERROR([Need a version of gcc with -mavx])]) + fi + + # AVX2 + # gcc-4.8 works with -march=core-avx2, but -mavx2 is not enough. + # Later versions seem to happy with -mavx2, so try the arch one first. + if test "$have_avx2" = "yes" -a "x$AVX2_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-march=core-avx2, [AVX2_CFLAGS="-march=core-avx2"], + [AX_CHECK_COMPILER_FLAGS(-mavx2, [AVX2_CFLAGS="-mavx2"], + [AC_MSG_ERROR([Need a version of gcc with either -march=core-avx2 or -mavx2])])]) + AX_CHECK_COMPILER_FLAGS(-mfma, [AVX2_CFLAGS="$AVX2_CFLAGS -mfma"], + [AC_MSG_WARN([Need a version of gcc with -mfma (harmless for icc)])]) + fi + + # AVX512 + if test "$have_avx512" = "yes" -a "x$AVX512_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mavx512f, [AVX512_CFLAGS="-mavx512f"], + [AC_MSG_ERROR([Need a version of gcc with -mavx512f])]) + fi + + if test "$host_vendor" = "apple"; then + # We need to tell gcc to use an external assembler to get AVX/AVX2 with gcc on OS X + AX_CHECK_COMPILER_FLAGS([-Wa,-q], [CFLAGS="$CFLAGS -Wa,-q"]) + # Disable the new compact unwinding format so we avoid warnings/potential errors. + AX_CHECK_COMPILER_FLAGS([-Wl,-no_compact_unwind], [CFLAGS="$CFLAGS -Wl,-no_compact_unwind"]) + fi + + # KCVI + if test "$have_kcvi" = "yes" -a "x$KCVI_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mmic, [KCVI_CFLAGS="-mmic"], + [AC_MSG_ERROR([Need a version of icc with -mmic])]) + fi + + if test "$have_altivec" = "yes" -a "x$ALTIVEC_CFLAGS" = x; then + # -DFAKE__VEC__ is a workaround because gcc-3.3 does not + # #define __VEC__ with -maltivec. + AX_CHECK_COMPILER_FLAGS(-faltivec, [ALTIVEC_CFLAGS="-faltivec"], + [AX_CHECK_COMPILER_FLAGS(-maltivec -mabi=altivec, + [ALTIVEC_CFLAGS="-maltivec -mabi=altivec -DFAKE__VEC__"], + [AX_CHECK_COMPILER_FLAGS(-fvec, [ALTIVEC_CFLAGS="-fvec"], + [AC_MSG_ERROR([Need a version of gcc with -maltivec])])])]) + fi + + case "${host_cpu}" in + aarch64) + ;; + *) + if test "$have_neon" = "yes" -a "x$NEON_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mfpu=neon, [NEON_CFLAGS="-mfpu=neon"], + [AC_MSG_ERROR([Need a version of gcc with -mfpu=neon])]) + fi + ;; + esac + + if test "$have_vsx" = "yes" -a "x$VSX_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mvsx, [VSX_CFLAGS="-mvsx"], + [AC_MSG_ERROR([Need a version of gcc with -mvsx])]) + fi + + dnl FIXME: + dnl elif test "$have_mips_ps" = "yes"; then + dnl # Just punt here and use only new 4.2 compiler :( + dnl # Should add section for older compilers... + dnl AX_CHECK_COMPILER_FLAGS(-mpaired-single, + dnl [SIMD_CFLAGS="-mpaired-single"], + dnl #[AC_MSG_ERROR([Need a version of gcc with -mpaired-single])]) + dnl [AX_CHECK_COMPILER_FLAGS(-march=mips64, + dnl [SIMD_CFLAGS="-march=mips64"], + dnl [AC_MSG_ERROR( + dnl [Need a version of gcc with -mpaired-single or -march=mips64]) + dnl ])]) + dnl fi + ;; + + clang) + + if test "$have_avx" = "yes" -a "x$AVX_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mavx, [AVX_CFLAGS="-mavx"], + [AC_MSG_ERROR([Need a version of clang with -mavx])]) + fi + + if test "$have_avx2" = "yes" -a "x$AVX2_CFLAGS" = x; then + AX_CHECK_COMPILER_FLAGS(-mavx2, [AVX2_CFLAGS="-mavx2"], + [AC_MSG_ERROR([Need a version of clang with -mavx2])]) + AX_CHECK_COMPILER_FLAGS(-mfma, [AVX2_CFLAGS="$AVX2_CFLAGS -mfma"]) + fi + + if test "$have_vsx" = "yes" -a "x$VSX_CFLAGS" = x; then + # clang appears to need both -mvsx and -maltivec for VSX + AX_CHECK_COMPILER_FLAGS(-maltivec, [VSX_CFLAGS="-maltivec"], + [AC_MSG_ERROR([Need a version of gcc with -maltivec])]) + AX_CHECK_COMPILER_FLAGS(-mvsx, [VSX_CFLAGS="-mvsx $VSX_CFLAGS"], + [AC_MSG_ERROR([Need a version of gcc with -mvsx])]) + fi + ;; + + ibm) + if test "$have_vsx" = "yes" -a "x$VSX_CFLAGS" = x; then + # Note that IBM xlC uses -qaltivec for VSX too. + AX_CHECK_COMPILER_FLAGS(-qaltivec, [VSX_CFLAGS="-qaltivec"], + [AC_MSG_ERROR([Need a version of gcc with -qaltivec])]) + fi + ;; +esac + +AC_SUBST(SSE2_CFLAGS) +AC_SUBST(AVX_CFLAGS) +AC_SUBST(AVX2_CFLAGS) +AC_SUBST(AVX512_CFLAGS) +AC_SUBST(KCVI_CFLAGS) +AC_SUBST(ALTIVEC_CFLAGS) +AC_SUBST(VSX_CFLAGS) +AC_SUBST(NEON_CFLAGS) + +dnl add stack alignment CFLAGS if so requested +if test "$with_incoming_stack_boundary"x != "no"x; then + case "${ax_cv_c_compiler_vendor}" in + gnu) + tentative_flags="-mincoming-stack-boundary=$with_incoming_stack_boundary"; + AX_CHECK_COMPILER_FLAGS($tentative_flags, + [STACK_ALIGN_CFLAGS=$tentative_flags]) + ;; + esac +fi +AC_SUBST(STACK_ALIGN_CFLAGS) + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h fenv.h limits.h malloc.h stddef.h sys/time.h]) +dnl c_asm.h: Header file for enabling asm() on Digital Unix +dnl intrinsics.h: cray unicos +dnl sys/sysctl.h: MacOS X altivec detection + +dnl altivec.h requires $ALTIVEC_CFLAGS (we use this for VSX too, which uses the same header) +save_CFLAGS="$CFLAGS" +save_CPPFLAGS="$CPPFLAGS" +CFLAGS="$CFLAGS $ALTIVEC_CFLAGS $VSX_CFLAGS" +CPPFLAGS="$CPPFLAGS $ALTIVEC_CFLAGS $VSX_CFLAGS" +AC_CHECK_HEADERS([altivec.h]) +CFLAGS="$save_CFLAGS" +CPPFLAGS="$save_CPPFLAGS" + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_HEADER_TIME +AC_CHECK_TYPE([long double], + [AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define to 1 if the compiler supports `long double'])], +[ +if test $PRECISION = l; then + AC_MSG_ERROR([long double is not a supported type with your compiler.]) +fi +]) +AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in ])],, +[ +#if HAVE_SYS_TIME_H +#include +#endif +]) + +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(unsigned int) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(unsigned long) +AC_CHECK_SIZEOF(long long) +AC_CHECK_SIZEOF(unsigned long long) +AC_CHECK_SIZEOF(size_t) +AC_CHECK_SIZEOF(ptrdiff_t) + +AC_CHECK_TYPES([ptrdiff_t]) +AC_CHECK_TYPES(uintptr_t, [], [AC_CHECK_SIZEOF(void *)], [$ac_includes_default +#ifdef HAVE_STDINT_H +# include +#endif]) + +AC_CHECK_SIZEOF(float) +AC_CHECK_SIZEOF(double) + +dnl Check sizeof fftw_r2r_kind for Fortran interface [it has == sizeof(int) +dnl for years, but being paranoid]. Note: the definition here must match +dnl the one in api/fftw3.h! +AC_CHECK_SIZEOF(fftw_r2r_kind, [], [typedef enum { + FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, + FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, + FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 +} fftw_r2r_kind;]) +if test 0 = $ac_cv_sizeof_fftw_r2r_kind; then AC_MSG_ERROR([sizeof(fftw_r2r_kind) test failed]); fi +C_FFTW_R2R_KIND=C_INT`expr $ac_cv_sizeof_fftw_r2r_kind \* 8`_T +AC_SUBST(C_FFTW_R2R_KIND) + +dnl Checks for library functions. +AC_FUNC_ALLOCA +AC_FUNC_STRTOD +AC_FUNC_VPRINTF +AC_CHECK_LIB(m, sin) + +if test $PRECISION = q; then + AX_GCC_VERSION(4,6,0,[],[AC_MSG_ERROR([gcc 4.6 or later required for quad precision support])]) + AC_CHECK_LIB(quadmath, sinq, [], [AC_MSG_ERROR([quad precision requires libquadmath for quad-precision trigonometric routines])]) + LIBQUADMATH=-lquadmath +fi +AC_SUBST(LIBQUADMATH) + +AC_CHECK_FUNCS([BSDgettimeofday gettimeofday gethrtime read_real_time time_base_to_time drand48 sqrt memset posix_memalign memalign _mm_malloc _mm_free clock_gettime mach_absolute_time sysctl abort sinl cosl snprintf memmove strchr getpagesize]) +AC_CHECK_DECLS([sinl, cosl, sinq, cosq],,,[#include ]) +AC_CHECK_DECLS([memalign],,,[ +#ifdef HAVE_MALLOC_H +#include +#endif]) +AC_CHECK_DECLS([drand48, srand48, posix_memalign]) dnl in stdlib.h + +dnl Cray UNICOS _rtc() (real-time clock) intrinsic +AC_MSG_CHECKING([for _rtc intrinsic]) +rtc_ok=yes +AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H +#include +#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no]) +AC_MSG_RESULT($rtc_ok) + +if test "$PRECISION" = "l"; then + AC_CHECK_FUNCS([cosl sinl tanl], [], [AC_MSG_ERROR([long-double precision requires long-double trigonometric routines])]) +fi + +AC_MSG_CHECKING([for isnan]) +AC_TRY_LINK([#include +], if (!isnan(3.14159)) isnan(2.7183);, ok=yes, ok=no) +if test "$ok" = "yes"; then + AC_DEFINE(HAVE_ISNAN,1,[Define if the isnan() function/macro is available.]) +fi +AC_MSG_RESULT(${ok}) + +dnl TODO +AX_GCC_ALIGNS_STACK() + +dnl override CFLAGS selection when debugging +if test "${enable_debug}" = "yes"; then + CFLAGS="-g" +fi + +dnl add gcc warnings, in debug/maintainer mode only +if test "$enable_debug" = yes || test "$USE_MAINTAINER_MODE" = yes; then +if test "$ac_test_CFLAGS" != "set"; then + if test $ac_cv_prog_gcc = yes; then + CFLAGS="$CFLAGS -Wall -W -Wcast-qual -Wpointer-arith -Wcast-align -pedantic -Wno-long-long -Wshadow -Wbad-function-cast -Wwrite-strings -Wstrict-prototypes -Wredundant-decls -Wnested-externs" # -Wundef -Wconversion -Wmissing-prototypes -Wmissing-declarations + fi +fi +fi + +dnl check for a proper indent in maintainer mode +if test "$USE_MAINTAINER_MODE" = yes; then + AC_PATH_PROG(INDENT, indent, indent) + # if INDENT is set to 'indent' then we didn't find indent + if test "$INDENT" != indent ; then + AC_MSG_CHECKING(if $INDENT is GNU indent) + if $INDENT --version 2>/dev/null | head -n 1|grep "GNU indent" > /dev/null ; then + AC_MSG_RESULT(yes) + INDENT="$INDENT -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV" + else + AC_MSG_RESULT(no) + AC_MSG_WARN($INDENT does not appear to be GNU indent.) + fi + else + AC_MSG_WARN(no indent program found: codelets will be ugly) + INDENT=cat + fi +fi + +dnl ----------------------------------------------------------------------- + +AC_ARG_ENABLE(fortran, [AC_HELP_STRING([--disable-fortran],[don't include Fortran-callable wrappers])], enable_fortran=$enableval, enable_fortran=yes) + +if test "$enable_fortran" = "yes"; then + AC_PROG_F77 + if test -z "$F77"; then + enable_fortran=no + AC_MSG_WARN([*** Couldn't find f77 compiler; using default Fortran wrappers.]) + else + AC_F77_DUMMY_MAIN([], [enable_fortran=no + AC_MSG_WARN([*** Couldn't figure out how to link C and Fortran; using default Fortran wrappers.])]) + fi +else + AC_DEFINE([DISABLE_FORTRAN], 1, [Define to disable Fortran wrappers.]) +fi + +if test "x$enable_fortran" = xyes; then + AC_F77_WRAPPERS + AC_F77_FUNC(f77foo) + AC_F77_FUNC(f77_foo) + f77_foo2=`echo $f77foo | sed 's/77/77_/'` + if test "$f77_foo" = "$f77_foo2"; then + AC_DEFINE(F77_FUNC_EQUIV, 1, [Define if F77_FUNC and F77_FUNC_ are equivalent.]) + + # Include g77 wrappers by default for GNU systems or gfortran + with_g77_wrappers=$ac_cv_f77_compiler_gnu + case $host_os in *gnu*) with_g77_wrappers=yes ;; esac + fi +else + with_g77_wrappers=no +fi + +AC_ARG_WITH(g77-wrappers, [AC_HELP_STRING([--with-g77-wrappers],[force inclusion of g77-compatible wrappers in addition to any other Fortran compiler that is detected])], with_g77_wrappers=$withval) +if test "x$with_g77_wrappers" = "xyes"; then + AC_DEFINE(WITH_G77_WRAPPERS,1,[Include g77-compatible wrappers in addition to any other Fortran wrappers.]) +fi + +dnl ----------------------------------------------------------------------- +have_smp="no" +AC_ARG_ENABLE(openmp, [AC_HELP_STRING([--enable-openmp],[use OpenMP directives for parallelism])], enable_openmp=$enableval, enable_openmp=no) + +if test "$enable_openmp" = "yes"; then + AC_DEFINE(HAVE_OPENMP,1,[Define to enable OpenMP]) + AX_OPENMP([], [AC_MSG_ERROR([don't know how to enable OpenMP])]) +fi + +AC_ARG_ENABLE(threads, [AC_HELP_STRING([--enable-threads],[compile FFTW SMP threads library])], enable_threads=$enableval, enable_threads=no) + +if test "$enable_threads" = "yes"; then + AC_DEFINE(HAVE_THREADS,1,[Define to enable SMP threads]) +fi + +AC_ARG_WITH(combined-threads, [AC_HELP_STRING([--with-combined-threads],[combine threads into main libfftw3])], with_combined_threads=$withval, with_combined_threads=no) + +if test "$with_combined_threads" = yes; then + if test "$enable_openmp" = "yes"; then + AC_MSG_ERROR([--with-combined-threads incompatible with --enable-openmp]) + fi + if test "$enable_threads" != "yes"; then + AC_MSG_ERROR([--with-combined-threads requires --enable-threads]) + fi +fi + +dnl Check for threads library... +THREADLIBS="" +if test "$enable_threads" = "yes"; then + # Win32 threads are the default on Windows: + if test -z "$THREADLIBS"; then + AC_MSG_CHECKING([for Win32 threads]) + AC_TRY_LINK([#include ], + [_beginthreadex(0,0,0,0,0,0);], + [THREADLIBS=" "; AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)]) + fi + + # POSIX threads, the default choice everywhere else: + if test -z "$THREADLIBS"; then + ACX_PTHREAD([THREADLIBS="$PTHREAD_LIBS " + CC="$PTHREAD_CC" + AC_DEFINE(USING_POSIX_THREADS, 1, [Define if we have and are using POSIX threads.])]) + fi + + if test -z "$THREADLIBS"; then + AC_MSG_ERROR([couldn't find threads library for --enable-threads]) + fi + AC_DEFINE(HAVE_THREADS, 1, [Define if we have a threads library.]) +fi +AC_SUBST(THREADLIBS) +AM_CONDITIONAL(THREADS, test "$enable_threads" = "yes") +AM_CONDITIONAL(OPENMP, test "$enable_openmp" = "yes") +AM_CONDITIONAL(SMP, test "$enable_threads" = "yes" -o "$enable_openmp" = "yes") +AM_CONDITIONAL(COMBINED_THREADS, test x"$with_combined_threads" = xyes) + +dnl ----------------------------------------------------------------------- + +AC_MSG_CHECKING([whether a cycle counter is available]) +save_CPPFLAGS=$CPPFLAGS +CPPFLAGS="$CPPFLAGS -I$srcdir/kernel" +AC_TRY_CPP([#include "cycle.h" +#ifndef HAVE_TICK_COUNTER +# error No cycle counter +#endif], [ok=yes], [ok=no]) +CPPFLAGS=$save_CPPFLAGS +AC_MSG_RESULT($ok) +if test $ok = no && test "x$with_slow_timer" = xno; then + echo "***************************************************************" + echo "WARNING: No cycle counter found. FFTW will use ESTIMATE mode " + echo " for all plans. See the manual for more information." + echo "***************************************************************" +fi + +dnl ----------------------------------------------------------------------- + +AC_DEFINE_UNQUOTED(FFTW_CC, "$CC $CFLAGS", [C compiler name and flags]) + +AC_CONFIG_FILES([ + Makefile + support/Makefile + genfft/Makefile + kernel/Makefile + simd-support/Makefile + + dft/Makefile + dft/scalar/Makefile + dft/scalar/codelets/Makefile + dft/simd/Makefile + dft/simd/common/Makefile + dft/simd/sse2/Makefile + dft/simd/avx/Makefile + dft/simd/avx-128-fma/Makefile + dft/simd/avx2/Makefile + dft/simd/avx2-128/Makefile + dft/simd/avx512/Makefile + dft/simd/kcvi/Makefile + dft/simd/altivec/Makefile + dft/simd/vsx/Makefile + dft/simd/neon/Makefile + dft/simd/generic-simd128/Makefile + dft/simd/generic-simd256/Makefile + + rdft/Makefile + rdft/scalar/Makefile + rdft/scalar/r2cf/Makefile + rdft/scalar/r2cb/Makefile + rdft/scalar/r2r/Makefile + rdft/simd/Makefile + rdft/simd/common/Makefile + rdft/simd/sse2/Makefile + rdft/simd/avx/Makefile + rdft/simd/avx-128-fma/Makefile + rdft/simd/avx2/Makefile + rdft/simd/avx2-128/Makefile + rdft/simd/avx512/Makefile + rdft/simd/kcvi/Makefile + rdft/simd/altivec/Makefile + rdft/simd/vsx/Makefile + rdft/simd/neon/Makefile + rdft/simd/generic-simd128/Makefile + rdft/simd/generic-simd256/Makefile + + reodft/Makefile + + threads/Makefile + + api/Makefile + + mpi/Makefile + + libbench2/Makefile + tests/Makefile + doc/Makefile + doc/FAQ/Makefile + + tools/Makefile + tools/fftw_wisdom.1 + tools/fftw-wisdom-to-conf + + m4/Makefile + + fftw.pc +]) + +AC_OUTPUT diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/depcomp b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/depcomp new file mode 100755 index 000000000..fc98710e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/Makefile.am new file mode 100644 index 000000000..d1f932a9a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/Makefile.am @@ -0,0 +1,10 @@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = scalar simd + +noinst_LTLIBRARIES = libdft.la + +libdft_la_SOURCES = bluestein.c buffered.c conf.c ct.c dftw-direct.c \ +dftw-directsq.c dftw-generic.c dftw-genericbuf.c direct.c generic.c \ +indirect.c indirect-transpose.c kdft-dif.c kdft-difsq.c kdft-dit.c \ +kdft.c nop.c plan.c problem.c rader.c rank-geq2.c solve.c vrank-geq1.c \ +zero.c codelet-dft.h ct.h dft.h diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/Makefile.in new file mode 100644 index 000000000..4d17de921 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/Makefile.in @@ -0,0 +1,777 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_la_LIBADD = +am_libdft_la_OBJECTS = bluestein.lo buffered.lo conf.lo ct.lo \ + dftw-direct.lo dftw-directsq.lo dftw-generic.lo \ + dftw-genericbuf.lo direct.lo generic.lo indirect.lo \ + indirect-transpose.lo kdft-dif.lo kdft-difsq.lo kdft-dit.lo \ + kdft.lo nop.lo plan.lo problem.lo rader.lo rank-geq2.lo \ + solve.lo vrank-geq1.lo zero.lo +libdft_la_OBJECTS = $(am_libdft_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_la_SOURCES) +DIST_SOURCES = $(libdft_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = scalar simd +noinst_LTLIBRARIES = libdft.la +libdft_la_SOURCES = bluestein.c buffered.c conf.c ct.c dftw-direct.c \ +dftw-directsq.c dftw-generic.c dftw-genericbuf.c direct.c generic.c \ +indirect.c indirect-transpose.c kdft-dif.c kdft-difsq.c kdft-dit.c \ +kdft.c nop.c plan.c problem.c rader.c rank-geq2.c solve.c vrank-geq1.c \ +zero.c codelet-dft.h ct.h dft.h + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft.la: $(libdft_la_OBJECTS) $(libdft_la_DEPENDENCIES) $(EXTRA_libdft_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libdft_la_OBJECTS) $(libdft_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bluestein.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffered.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftw-direct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftw-directsq.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftw-generic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dftw-genericbuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/direct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indirect-transpose.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indirect.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdft-dif.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdft-difsq.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdft-dit.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rank-geq2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vrank-geq1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zero.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/bluestein.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/bluestein.c new file mode 100644 index 000000000..c1e7fcbcf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/bluestein.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/dft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_dft super; + INT n; /* problem size */ + INT nb; /* size of convolution */ + R *w; /* lambda k . exp(2*pi*i*k^2/(2*n)) */ + R *W; /* DFT(w) */ + plan *cldf; + INT is, os; +} P; + +static void bluestein_sequence(enum wakefulness wakefulness, INT n, R *w) +{ + INT k, ksq, n2 = 2 * n; + triggen *t = X(mktriggen)(wakefulness, n2); + + ksq = 0; + for (k = 0; k < n; ++k) { + t->cexp(t, ksq, w+2*k); + /* careful with overflow */ + ksq += 2*k + 1; while (ksq > n2) ksq -= n2; + } + + X(triggen_destroy)(t); +} + +static void mktwiddle(enum wakefulness wakefulness, P *p) +{ + INT i; + INT n = p->n, nb = p->nb; + R *w, *W; + E nbf = (E)nb; + + p->w = w = (R *) MALLOC(2 * n * sizeof(R), TWIDDLES); + p->W = W = (R *) MALLOC(2 * nb * sizeof(R), TWIDDLES); + + bluestein_sequence(wakefulness, n, w); + + for (i = 0; i < nb; ++i) + W[2*i] = W[2*i+1] = K(0.0); + + W[0] = w[0] / nbf; + W[1] = w[1] / nbf; + + for (i = 1; i < n; ++i) { + W[2*i] = W[2*(nb-i)] = w[2*i] / nbf; + W[2*i+1] = W[2*(nb-i)+1] = w[2*i+1] / nbf; + } + + { + plan_dft *cldf = (plan_dft *)p->cldf; + /* cldf must be awake */ + cldf->apply(p->cldf, W, W+1, W, W+1); + } +} + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT i, n = ego->n, nb = ego->nb, is = ego->is, os = ego->os; + R *w = ego->w, *W = ego->W; + R *b = (R *) MALLOC(2 * nb * sizeof(R), BUFFERS); + + /* multiply input by conjugate bluestein sequence */ + for (i = 0; i < n; ++i) { + E xr = ri[i*is], xi = ii[i*is]; + E wr = w[2*i], wi = w[2*i+1]; + b[2*i] = xr * wr + xi * wi; + b[2*i+1] = xi * wr - xr * wi; + } + + for (; i < nb; ++i) b[2*i] = b[2*i+1] = K(0.0); + + /* convolution: FFT */ + { + plan_dft *cldf = (plan_dft *)ego->cldf; + cldf->apply(ego->cldf, b, b+1, b, b+1); + } + + /* convolution: pointwise multiplication */ + for (i = 0; i < nb; ++i) { + E xr = b[2*i], xi = b[2*i+1]; + E wr = W[2*i], wi = W[2*i+1]; + b[2*i] = xi * wr + xr * wi; + b[2*i+1] = xr * wr - xi * wi; + } + + /* convolution: IFFT by FFT with real/imag input/output swapped */ + { + plan_dft *cldf = (plan_dft *)ego->cldf; + cldf->apply(ego->cldf, b, b+1, b, b+1); + } + + /* multiply output by conjugate bluestein sequence */ + for (i = 0; i < n; ++i) { + E xi = b[2*i], xr = b[2*i+1]; + E wr = w[2*i], wi = w[2*i+1]; + ro[i*os] = xr * wr + xi * wi; + io[i*os] = xi * wr - xr * wi; + } + + X(ifree)(b); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cldf, wakefulness); + + switch (wakefulness) { + case SLEEPY: + X(ifree0)(ego->w); ego->w = 0; + X(ifree0)(ego->W); ego->W = 0; + break; + default: + A(!ego->w); + mktwiddle(wakefulness, ego); + break; + } +} + +static int applicable(const solver *ego, const problem *p_, + const planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + UNUSED(ego); + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + /* FIXME: allow other sizes */ + && X(is_prime)(p->sz->dims[0].n) + + /* FIXME: avoid infinite recursion of bluestein with itself. + This works because all factors in child problems are 2, 3, 5 */ + && p->sz->dims[0].n > 16 + + && CIMPLIES(NO_SLOWP(plnr), p->sz->dims[0].n > BLUESTEIN_MAX_SLOW) + ); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldf); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *)ego_; + p->print(p, "(dft-bluestein-%D/%D%(%p%))", + ego->n, ego->nb, ego->cldf); +} + +static INT choose_transform_size(INT minsz) +{ + while (!X(factors_into_small_primes)(minsz)) + ++minsz; + return minsz; +} + +static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + P *pln; + INT n, nb; + plan *cldf = 0; + R *buf = (R *) 0; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + n = p->sz->dims[0].n; + nb = choose_transform_size(2 * n - 1); + buf = (R *) MALLOC(2 * nb * sizeof(R), BUFFERS); + + cldf = X(mkplan_f_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)(nb, 2, 2), + X(mktensor_1d)(1, 0, 0), + buf, buf+1, + buf, buf+1), + NO_SLOW, 0, 0); + if (!cldf) goto nada; + + X(ifree)(buf); + + pln = MKPLAN_DFT(P, &padt, apply); + + pln->n = n; + pln->nb = nb; + pln->w = 0; + pln->W = 0; + pln->cldf = cldf; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + + X(ops_add)(&cldf->ops, &cldf->ops, &pln->super.super.ops); + pln->super.super.ops.add += 4 * n + 2 * nb; + pln->super.super.ops.mul += 8 * n + 4 * nb; + pln->super.super.ops.other += 6 * (n + nb); + + return &(pln->super.super); + + nada: + X(ifree0)(buf); + X(plan_destroy_internal)(cldf); + return (plan *)0; +} + + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(dft_bluestein_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/buffered.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/buffered.c new file mode 100644 index 000000000..743125139 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/buffered.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" + +typedef struct { + solver super; + size_t maxnbuf_ndx; +} S; + +static const INT maxnbufs[] = { 8, 256 }; + +typedef struct { + plan_dft super; + + plan *cld, *cldcpy, *cldrest; + INT n, vl, nbuf, bufdist; + INT ivs_by_nbuf, ovs_by_nbuf; + INT roffset, ioffset; +} P; + +/* transform a vector input with the help of bufs */ +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT nbuf = ego->nbuf; + R *bufs = (R *)MALLOC(sizeof(R) * nbuf * ego->bufdist * 2, BUFFERS); + + plan_dft *cld = (plan_dft *) ego->cld; + plan_dft *cldcpy = (plan_dft *) ego->cldcpy; + plan_dft *cldrest; + INT i, vl = ego->vl; + INT ivs_by_nbuf = ego->ivs_by_nbuf, ovs_by_nbuf = ego->ovs_by_nbuf; + INT roffset = ego->roffset, ioffset = ego->ioffset; + + for (i = nbuf; i <= vl; i += nbuf) { + /* transform to bufs: */ + cld->apply((plan *) cld, ri, ii, bufs + roffset, bufs + ioffset); + ri += ivs_by_nbuf; ii += ivs_by_nbuf; + + /* copy back */ + cldcpy->apply((plan *) cldcpy, bufs+roffset, bufs+ioffset, ro, io); + ro += ovs_by_nbuf; io += ovs_by_nbuf; + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_dft *) ego->cldrest; + cldrest->apply((plan *) cldrest, ri, ii, ro, io); +} + + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldcpy, wakefulness); + X(plan_awake)(ego->cldrest, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldrest); + X(plan_destroy_internal)(ego->cldcpy); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(dft-buffered-%D%v/%D-%D%(%p%)%(%p%)%(%p%))", + ego->n, ego->nbuf, + ego->vl, ego->bufdist % ego->n, + ego->cld, ego->cldcpy, ego->cldrest); +} + +static int applicable0(const S *ego, const problem *p_, const planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + const iodim *d = p->sz->dims; + + if (1 + && p->vecsz->rnk <= 1 + && p->sz->rnk == 1 + ) { + INT vl, ivs, ovs; + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + + if (X(toobig)(p->sz->dims[0].n) && CONSERVE_MEMORYP(plnr)) + return 0; + + /* if this solver is redundant, in the sense that a solver + of lower index generates the same plan, then prune this + solver */ + if (X(nbuf_redundant)(d[0].n, vl, + ego->maxnbuf_ndx, + maxnbufs, NELEM(maxnbufs))) + return 0; + + /* + In principle, the buffered transforms might be useful + when working out of place. However, in order to + prevent infinite loops in the planner, we require + that the output stride of the buffered transforms be + greater than 2. + */ + if (p->ri != p->ro) + return (d[0].os > 2); + + /* + * If the problem is in place, the input/output strides must + * be the same or the whole thing must fit in the buffer. + */ + if (X(tensor_inplace_strides2)(p->sz, p->vecsz)) + return 1; + + if (/* fits into buffer: */ + ((p->vecsz->rnk == 0) + || + (X(nbuf)(d[0].n, p->vecsz->dims[0].n, + maxnbufs[ego->maxnbuf_ndx]) + == p->vecsz->dims[0].n))) + return 1; + } + + return 0; +} + +static int applicable(const S *ego, const problem *p_, const planner *plnr) +{ + if (NO_BUFFERINGP(plnr)) return 0; + if (!applicable0(ego, p_, plnr)) return 0; + + if (NO_UGLYP(plnr)) { + const problem_dft *p = (const problem_dft *) p_; + if (p->ri != p->ro) return 0; + if (X(toobig)(p->sz->dims[0].n)) return 0; + } + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const S *ego = (const S *)ego_; + plan *cld = (plan *) 0; + plan *cldcpy = (plan *) 0; + plan *cldrest = (plan *) 0; + const problem_dft *p = (const problem_dft *) p_; + R *bufs = (R *) 0; + INT nbuf = 0, bufdist, n, vl; + INT ivs, ovs, roffset, ioffset; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego, p_, plnr)) + goto nada; + + n = X(tensor_sz)(p->sz); + + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + + nbuf = X(nbuf)(n, vl, maxnbufs[ego->maxnbuf_ndx]); + bufdist = X(bufdist)(n, vl); + A(nbuf > 0); + + /* attempt to keep real and imaginary part in the same order, + so as to allow optimizations in the the copy plan */ + roffset = (p->ri - p->ii > 0) ? (INT)1 : (INT)0; + ioffset = 1 - roffset; + + /* initial allocation for the purpose of planning */ + bufs = (R *) MALLOC(sizeof(R) * nbuf * bufdist * 2, BUFFERS); + + /* allow destruction of input if problem is in place */ + cld = X(mkplan_f_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(n, p->sz->dims[0].is, 2), + X(mktensor_1d)(nbuf, ivs, bufdist * 2), + TAINT(p->ri, ivs * nbuf), + TAINT(p->ii, ivs * nbuf), + bufs + roffset, + bufs + ioffset), + 0, 0, (p->ri == p->ro) ? NO_DESTROY_INPUT : 0); + if (!cld) + goto nada; + + /* copying back from the buffer is a rank-0 transform: */ + cldcpy = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_0d)(), + X(mktensor_2d)(nbuf, bufdist * 2, ovs, + n, 2, p->sz->dims[0].os), + bufs + roffset, + bufs + ioffset, + TAINT(p->ro, ovs * nbuf), + TAINT(p->io, ovs * nbuf))); + if (!cldcpy) + goto nada; + + /* deallocate buffers, let apply() allocate them for real */ + X(ifree)(bufs); + bufs = 0; + + /* plan the leftover transforms (cldrest): */ + { + INT id = ivs * (nbuf * (vl / nbuf)); + INT od = ovs * (nbuf * (vl / nbuf)); + cldrest = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(tensor_copy)(p->sz), + X(mktensor_1d)(vl % nbuf, ivs, ovs), + p->ri+id, p->ii+id, p->ro+od, p->io+od)); + } + if (!cldrest) + goto nada; + + pln = MKPLAN_DFT(P, &padt, apply); + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->cldrest = cldrest; + pln->n = n; + pln->vl = vl; + pln->ivs_by_nbuf = ivs * nbuf; + pln->ovs_by_nbuf = ovs * nbuf; + pln->roffset = roffset; + pln->ioffset = ioffset; + + pln->nbuf = nbuf; + pln->bufdist = bufdist; + + { + opcnt t; + X(ops_add)(&cld->ops, &cldcpy->ops, &t); + X(ops_madd)(vl / nbuf, &t, &cldrest->ops, &pln->super.super.ops); + } + + return &(pln->super.super); + + nada: + X(ifree0)(bufs); + X(plan_destroy_internal)(cldrest); + X(plan_destroy_internal)(cldcpy); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +static solver *mksolver(size_t maxnbuf_ndx) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->maxnbuf_ndx = maxnbuf_ndx; + return &(slv->super); +} + +void X(dft_buffered_register)(planner *p) +{ + size_t i; + for (i = 0; i < NELEM(maxnbufs); ++i) + REGISTER_SOLVER(p, mksolver(i)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/codelet-dft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/codelet-dft.h new file mode 100644 index 000000000..b78e135c8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/codelet-dft.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* + * This header file must include every file or define every + * type or macro which is required to compile a codelet. + */ + +#ifndef __DFT_CODELET_H__ +#define __DFT_CODELET_H__ + +#include "kernel/ifftw.h" + +/************************************************************** + * types of codelets + **************************************************************/ + +/* DFT codelets */ +typedef struct kdft_desc_s kdft_desc; + +typedef struct { + int (*okp)( + const kdft_desc *desc, + const R *ri, const R *ii, const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr); + INT vl; +} kdft_genus; + +struct kdft_desc_s { + INT sz; /* size of transform computed */ + const char *nam; + opcnt ops; + const kdft_genus *genus; + INT is; + INT os; + INT ivs; + INT ovs; +}; + +typedef void (*kdft) (const R *ri, const R *ii, R *ro, R *io, + stride is, stride os, INT vl, INT ivs, INT ovs); +void X(kdft_register)(planner *p, kdft codelet, const kdft_desc *desc); + + +typedef struct ct_desc_s ct_desc; + +typedef struct { + int (*okp)( + const struct ct_desc_s *desc, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr); + INT vl; +} ct_genus; + +struct ct_desc_s { + INT radix; + const char *nam; + const tw_instr *tw; + const ct_genus *genus; + opcnt ops; + INT rs; + INT vs; + INT ms; +}; + +typedef void (*kdftw) (R *rioarray, R *iioarray, const R *W, + stride ios, INT mb, INT me, INT ms); +void X(kdft_dit_register)(planner *p, kdftw codelet, const ct_desc *desc); +void X(kdft_dif_register)(planner *p, kdftw codelet, const ct_desc *desc); + + +typedef void (*kdftwsq) (R *rioarray, R *iioarray, + const R *W, stride is, stride vs, + INT mb, INT me, INT ms); +void X(kdft_difsq_register)(planner *p, kdftwsq codelet, const ct_desc *desc); + + +extern const solvtab X(solvtab_dft_standard); +extern const solvtab X(solvtab_dft_sse2); +extern const solvtab X(solvtab_dft_avx); +extern const solvtab X(solvtab_dft_avx_128_fma); +extern const solvtab X(solvtab_dft_avx2); +extern const solvtab X(solvtab_dft_avx2_128); +extern const solvtab X(solvtab_dft_avx512); +extern const solvtab X(solvtab_dft_kcvi); +extern const solvtab X(solvtab_dft_altivec); +extern const solvtab X(solvtab_dft_vsx); +extern const solvtab X(solvtab_dft_neon); +extern const solvtab X(solvtab_dft_generic_simd128); +extern const solvtab X(solvtab_dft_generic_simd256); + +#endif /* __DFT_CODELET_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/conf.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/conf.c new file mode 100644 index 000000000..d0951de5d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/conf.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" + +static const solvtab s = +{ + SOLVTAB(X(dft_indirect_register)), + SOLVTAB(X(dft_indirect_transpose_register)), + SOLVTAB(X(dft_rank_geq2_register)), + SOLVTAB(X(dft_vrank_geq1_register)), + SOLVTAB(X(dft_buffered_register)), + SOLVTAB(X(dft_generic_register)), + SOLVTAB(X(dft_rader_register)), + SOLVTAB(X(dft_bluestein_register)), + SOLVTAB(X(dft_nop_register)), + SOLVTAB(X(ct_generic_register)), + SOLVTAB(X(ct_genericbuf_register)), + SOLVTAB_END +}; + +void X(dft_conf_standard)(planner *p) +{ + X(solvtab_exec)(s, p); + X(solvtab_exec)(X(solvtab_dft_standard), p); +#if HAVE_SSE2 + if (X(have_simd_sse2)()) + X(solvtab_exec)(X(solvtab_dft_sse2), p); +#endif +#if HAVE_AVX + if (X(have_simd_avx)()) + X(solvtab_exec)(X(solvtab_dft_avx), p); +#endif +#if HAVE_AVX_128_FMA + if (X(have_simd_avx_128_fma)()) + X(solvtab_exec)(X(solvtab_dft_avx_128_fma), p); +#endif +#if HAVE_AVX2 + if (X(have_simd_avx2)()) + X(solvtab_exec)(X(solvtab_dft_avx2), p); + if (X(have_simd_avx2_128)()) + X(solvtab_exec)(X(solvtab_dft_avx2_128), p); +#endif +#if HAVE_AVX512 + if (X(have_simd_avx512)()) + X(solvtab_exec)(X(solvtab_dft_avx512), p); +#endif +#if HAVE_KCVI + if (X(have_simd_kcvi)()) + X(solvtab_exec)(X(solvtab_dft_kcvi), p); +#endif +#if HAVE_ALTIVEC + if (X(have_simd_altivec)()) + X(solvtab_exec)(X(solvtab_dft_altivec), p); +#endif +#if HAVE_VSX + if (X(have_simd_vsx)()) + X(solvtab_exec)(X(solvtab_dft_vsx), p); +#endif +#if HAVE_NEON + if (X(have_simd_neon)()) + X(solvtab_exec)(X(solvtab_dft_neon), p); +#endif +#if HAVE_GENERIC_SIMD128 + X(solvtab_exec)(X(solvtab_dft_generic_simd128), p); +#endif +#if HAVE_GENERIC_SIMD256 + X(solvtab_exec)(X(solvtab_dft_generic_simd256), p); +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/ct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/ct.c new file mode 100644 index 000000000..1a6fa9352 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/ct.c @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/ct.h" + +ct_solver *(*X(mksolver_ct_hook))(size_t, INT, int, + ct_mkinferior, ct_force_vrecursion) = 0; + +typedef struct { + plan_dft super; + plan *cld; + plan *cldw; + INT r; +} P; + +static void apply_dit(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + plan_dftw *cldw; + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ri, ii, ro, io); + + cldw = (plan_dftw *) ego->cldw; + cldw->apply(ego->cldw, ro, io); +} + +static void apply_dif(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + plan_dftw *cldw; + + cldw = (plan_dftw *) ego->cldw; + cldw->apply(ego->cldw, ri, ii); + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ri, ii, ro, io); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldw, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldw); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(dft-ct-%s/%D%(%p%)%(%p%))", + ego->super.apply == apply_dit ? "dit" : "dif", + ego->r, ego->cldw, ego->cld); +} + +static int applicable0(const ct_solver *ego, const problem *p_, planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + INT r; + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + + /* DIF destroys the input and we don't like it */ + && (ego->dec == DECDIT || + p->ri == p->ro || + !NO_DESTROY_INPUTP(plnr)) + + && ((r = X(choose_radix)(ego->r, p->sz->dims[0].n)) > 1) + && p->sz->dims[0].n > r); +} + + +int X(ct_applicable)(const ct_solver *ego, const problem *p_, planner *plnr) +{ + const problem_dft *p; + + if (!applicable0(ego, p_, plnr)) + return 0; + + p = (const problem_dft *) p_; + + return (0 + || ego->dec == DECDIF+TRANSPOSE + || p->vecsz->rnk == 0 + || !NO_VRECURSEP(plnr) + || (ego->force_vrecursionp && ego->force_vrecursionp(ego, p)) + ); +} + + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const ct_solver *ego = (const ct_solver *) ego_; + const problem_dft *p; + P *pln = 0; + plan *cld = 0, *cldw = 0; + INT n, r, m, v, ivs, ovs; + iodim *d; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if ((NO_NONTHREADEDP(plnr)) || !X(ct_applicable)(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_dft *) p_; + d = p->sz->dims; + n = d[0].n; + r = X(choose_radix)(ego->r, n); + m = n / r; + + X(tensor_tornk1)(p->vecsz, &v, &ivs, &ovs); + + switch (ego->dec) { + case DECDIT: + { + cldw = ego->mkcldw(ego, + r, m * d[0].os, m * d[0].os, + m, d[0].os, + v, ovs, ovs, + 0, m, + p->ro, p->io, plnr); + if (!cldw) goto nada; + + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(m, r * d[0].is, d[0].os), + X(mktensor_2d)(r, d[0].is, m * d[0].os, + v, ivs, ovs), + p->ri, p->ii, p->ro, p->io) + ); + if (!cld) goto nada; + + pln = MKPLAN_DFT(P, &padt, apply_dit); + break; + } + case DECDIF: + case DECDIF+TRANSPOSE: + { + INT cors, covs; /* cldw ors, ovs */ + if (ego->dec == DECDIF+TRANSPOSE) { + cors = ivs; + covs = m * d[0].is; + /* ensure that we generate well-formed dftw subproblems */ + /* FIXME: too conservative */ + if (!(1 + && r == v + && d[0].is == r * cors)) + goto nada; + + /* FIXME: allow in-place only for now, like in + fftw-3.[01] */ + if (!(1 + && p->ri == p->ro + && d[0].is == r * d[0].os + && cors == d[0].os + && covs == ovs + )) + goto nada; + } else { + cors = m * d[0].is; + covs = ivs; + } + + cldw = ego->mkcldw(ego, + r, m * d[0].is, cors, + m, d[0].is, + v, ivs, covs, + 0, m, + p->ri, p->ii, plnr); + if (!cldw) goto nada; + + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(m, d[0].is, r * d[0].os), + X(mktensor_2d)(r, cors, d[0].os, + v, covs, ovs), + p->ri, p->ii, p->ro, p->io) + ); + if (!cld) goto nada; + + pln = MKPLAN_DFT(P, &padt, apply_dif); + break; + } + + default: A(0); + + } + + pln->cld = cld; + pln->cldw = cldw; + pln->r = r; + X(ops_add)(&cld->ops, &cldw->ops, &pln->super.super.ops); + + /* inherit could_prune_now_p attribute from cldw */ + pln->super.super.could_prune_now_p = cldw->could_prune_now_p; + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldw); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +ct_solver *X(mksolver_ct)(size_t size, INT r, int dec, + ct_mkinferior mkcldw, + ct_force_vrecursion force_vrecursionp) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + ct_solver *slv = (ct_solver *)X(mksolver)(size, &sadt); + slv->r = r; + slv->dec = dec; + slv->mkcldw = mkcldw; + slv->force_vrecursionp = force_vrecursionp; + return slv; +} + +plan *X(mkplan_dftw)(size_t size, const plan_adt *adt, dftwapply apply) +{ + plan_dftw *ego; + + ego = (plan_dftw *) X(mkplan)(size, adt); + ego->apply = apply; + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/ct.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/ct.h new file mode 100644 index 000000000..022e29b23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/ct.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/dft.h" + +typedef void (*dftwapply)(const plan *ego, R *rio, R *iio); +typedef struct ct_solver_s ct_solver; +typedef plan *(*ct_mkinferior)(const ct_solver *ego, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mstart, INT mcount, + R *rio, R *iio, planner *plnr); +typedef int (*ct_force_vrecursion)(const ct_solver *ego, + const problem_dft *p); + +typedef struct { + plan super; + dftwapply apply; +} plan_dftw; + +extern plan *X(mkplan_dftw)(size_t size, const plan_adt *adt, dftwapply apply); + +#define MKPLAN_DFTW(type, adt, apply) \ + (type *)X(mkplan_dftw)(sizeof(type), adt, apply) + +struct ct_solver_s { + solver super; + INT r; + int dec; +# define DECDIF 0 +# define DECDIT 1 +# define TRANSPOSE 2 + ct_mkinferior mkcldw; + ct_force_vrecursion force_vrecursionp; +}; + +int X(ct_applicable)(const ct_solver *, const problem *, planner *); +ct_solver *X(mksolver_ct)(size_t size, INT r, int dec, + ct_mkinferior mkcldw, + ct_force_vrecursion force_vrecursionp); +extern ct_solver *(*X(mksolver_ct_hook))(size_t, INT, int, + ct_mkinferior, ct_force_vrecursion); + +void X(regsolver_ct_directw)(planner *plnr, + kdftw codelet, const ct_desc *desc, int dec); +void X(regsolver_ct_directwbuf)(planner *plnr, + kdftw codelet, const ct_desc *desc, int dec); +solver *X(mksolver_ctsq)(kdftwsq codelet, const ct_desc *desc, int dec); +void X(regsolver_ct_directwsq)(planner *plnr, kdftwsq codelet, + const ct_desc *desc, int dec); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dft.h new file mode 100644 index 000000000..740260ebc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dft.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifndef __DFT_H__ +#define __DFT_H__ + +#include "kernel/ifftw.h" +#include "dft/codelet-dft.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* problem.c: */ +typedef struct { + problem super; + tensor *sz, *vecsz; + R *ri, *ii, *ro, *io; +} problem_dft; + +void X(dft_zerotens)(tensor *sz, R *ri, R *ii); +problem *X(mkproblem_dft)(const tensor *sz, const tensor *vecsz, + R *ri, R *ii, R *ro, R *io); +problem *X(mkproblem_dft_d)(tensor *sz, tensor *vecsz, + R *ri, R *ii, R *ro, R *io); + +/* solve.c: */ +void X(dft_solve)(const plan *ego_, const problem *p_); + +/* plan.c: */ +typedef void (*dftapply) (const plan *ego, R *ri, R *ii, R *ro, R *io); + +typedef struct { + plan super; + dftapply apply; +} plan_dft; + +plan *X(mkplan_dft)(size_t size, const plan_adt *adt, dftapply apply); + +#define MKPLAN_DFT(type, adt, apply) \ + (type *)X(mkplan_dft)(sizeof(type), adt, apply) + +/* various solvers */ +solver *X(mksolver_dft_direct)(kdft k, const kdft_desc *desc); +solver *X(mksolver_dft_directbuf)(kdft k, const kdft_desc *desc); + +void X(dft_rank0_register)(planner *p); +void X(dft_rank_geq2_register)(planner *p); +void X(dft_indirect_register)(planner *p); +void X(dft_indirect_transpose_register)(planner *p); +void X(dft_vrank_geq1_register)(planner *p); +void X(dft_vrank2_transpose_register)(planner *p); +void X(dft_vrank3_transpose_register)(planner *p); +void X(dft_buffered_register)(planner *p); +void X(dft_generic_register)(planner *p); +void X(dft_rader_register)(planner *p); +void X(dft_bluestein_register)(planner *p); +void X(dft_nop_register)(planner *p); +void X(ct_generic_register)(planner *p); +void X(ct_genericbuf_register)(planner *p); + +/* configurations */ +void X(dft_conf_standard)(planner *p); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __DFT_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-direct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-direct.c new file mode 100644 index 000000000..952cf1ee7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-direct.c @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/ct.h" + +typedef struct { + ct_solver super; + const ct_desc *desc; + int bufferedp; + kdftw k; +} S; + +typedef struct { + plan_dftw super; + kdftw k; + INT r; + stride rs; + INT m, ms, v, vs, mb, me, extra_iter; + stride brs; + twid *td; + const S *slv; +} P; + + +/************************************************************* + Nonbuffered code + *************************************************************/ +static void apply(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + INT i; + ASSERT_ALIGNED_DOUBLE; + for (i = 0; i < ego->v; ++i, rio += ego->vs, iio += ego->vs) { + INT mb = ego->mb, ms = ego->ms; + ego->k(rio + mb*ms, iio + mb*ms, ego->td->W, + ego->rs, mb, ego->me, ms); + } +} + +static void apply_extra_iter(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + INT i, v = ego->v, vs = ego->vs; + INT mb = ego->mb, me = ego->me, mm = me - 1, ms = ego->ms; + ASSERT_ALIGNED_DOUBLE; + for (i = 0; i < v; ++i, rio += vs, iio += vs) { + ego->k(rio + mb*ms, iio + mb*ms, ego->td->W, + ego->rs, mb, mm, ms); + ego->k(rio + mm*ms, iio + mm*ms, ego->td->W, + ego->rs, mm, mm+2, 0); + } +} + +/************************************************************* + Buffered code + *************************************************************/ +static void dobatch(const P *ego, R *rA, R *iA, INT mb, INT me, R *buf) +{ + INT brs = WS(ego->brs, 1); + INT rs = WS(ego->rs, 1); + INT ms = ego->ms; + + X(cpy2d_pair_ci)(rA + mb*ms, iA + mb*ms, buf, buf + 1, + ego->r, rs, brs, + me - mb, ms, 2); + ego->k(buf, buf + 1, ego->td->W, ego->brs, mb, me, 2); + X(cpy2d_pair_co)(buf, buf + 1, rA + mb*ms, iA + mb*ms, + ego->r, brs, rs, + me - mb, 2, ms); +} + +/* must be even for SIMD alignment; should not be 2^k to avoid + associativity conflicts */ +static INT compute_batchsize(INT radix) +{ + /* round up to multiple of 4 */ + radix += 3; + radix &= -4; + + return (radix + 2); +} + +static void apply_buf(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + INT i, j, v = ego->v, r = ego->r; + INT batchsz = compute_batchsize(r); + R *buf; + INT mb = ego->mb, me = ego->me; + size_t bufsz = r * batchsz * 2 * sizeof(R); + + BUF_ALLOC(R *, buf, bufsz); + + for (i = 0; i < v; ++i, rio += ego->vs, iio += ego->vs) { + for (j = mb; j + batchsz < me; j += batchsz) + dobatch(ego, rio, iio, j, j + batchsz, buf); + + dobatch(ego, rio, iio, j, me, buf); + } + + BUF_FREE(buf, bufsz); +} + +/************************************************************* + common code + *************************************************************/ +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(twiddle_awake)(wakefulness, &ego->td, ego->slv->desc->tw, + ego->r * ego->m, ego->r, ego->m + ego->extra_iter); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(stride_destroy)(ego->brs); + X(stride_destroy)(ego->rs); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *slv = ego->slv; + const ct_desc *e = slv->desc; + + if (slv->bufferedp) + p->print(p, "(dftw-directbuf/%D-%D/%D%v \"%s\")", + compute_batchsize(ego->r), ego->r, + X(twiddle_length)(ego->r, e->tw), ego->v, e->nam); + else + p->print(p, "(dftw-direct-%D/%D%v \"%s\")", + ego->r, X(twiddle_length)(ego->r, e->tw), ego->v, e->nam); +} + +static int applicable0(const S *ego, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mb, INT me, + R *rio, R *iio, + const planner *plnr, INT *extra_iter) +{ + const ct_desc *e = ego->desc; + UNUSED(v); + + return ( + 1 + && r == e->radix + && irs == ors /* in-place along R */ + && ivs == ovs /* in-place along V */ + + /* check for alignment/vector length restrictions */ + && ((*extra_iter = 0, + e->genus->okp(e, rio, iio, irs, ivs, m, mb, me, ms, plnr)) + || + (*extra_iter = 1, + (1 + /* FIXME: require full array, otherwise some threads + may be extra_iter and other threads won't be. + Generating the proper twiddle factors is a pain in + this case */ + && mb == 0 && me == m + && e->genus->okp(e, rio, iio, irs, ivs, + m, mb, me - 1, ms, plnr) + && e->genus->okp(e, rio, iio, irs, ivs, + m, me - 1, me + 1, ms, plnr)))) + + && (e->genus->okp(e, rio + ivs, iio + ivs, irs, ivs, + m, mb, me - *extra_iter, ms, plnr)) + + ); +} + +static int applicable0_buf(const S *ego, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mb, INT me, + R *rio, R *iio, + const planner *plnr) +{ + const ct_desc *e = ego->desc; + INT batchsz; + UNUSED(v); UNUSED(ms); UNUSED(rio); UNUSED(iio); + + return ( + 1 + && r == e->radix + && irs == ors /* in-place along R */ + && ivs == ovs /* in-place along V */ + + /* check for alignment/vector length restrictions, both for + batchsize and for the remainder */ + && (batchsz = compute_batchsize(r), 1) + && (e->genus->okp(e, 0, ((const R *)0) + 1, 2 * batchsz, 0, + m, mb, mb + batchsz, 2, plnr)) + && (e->genus->okp(e, 0, ((const R *)0) + 1, 2 * batchsz, 0, + m, mb, me, 2, plnr)) + ); +} + +static int applicable(const S *ego, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mb, INT me, + R *rio, R *iio, + const planner *plnr, INT *extra_iter) +{ + if (ego->bufferedp) { + *extra_iter = 0; + if (!applicable0_buf(ego, + r, irs, ors, m, ms, v, ivs, ovs, mb, me, + rio, iio, plnr)) + return 0; + } else { + if (!applicable0(ego, + r, irs, ors, m, ms, v, ivs, ovs, mb, me, + rio, iio, plnr, extra_iter)) + return 0; + } + + if (NO_UGLYP(plnr) && X(ct_uglyp)((ego->bufferedp? (INT)512 : (INT)16), + v, m * r, r)) + return 0; + + if (m * r > 262144 && NO_FIXED_RADIX_LARGE_NP(plnr)) + return 0; + + return 1; +} + +static plan *mkcldw(const ct_solver *ego_, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mstart, INT mcount, + R *rio, R *iio, + planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const ct_desc *e = ego->desc; + INT extra_iter; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + A(mstart >= 0 && mstart + mcount <= m); + if (!applicable(ego, + r, irs, ors, m, ms, v, ivs, ovs, mstart, mstart + mcount, + rio, iio, plnr, &extra_iter)) + return (plan *)0; + + if (ego->bufferedp) { + pln = MKPLAN_DFTW(P, &padt, apply_buf); + } else { + pln = MKPLAN_DFTW(P, &padt, extra_iter ? apply_extra_iter : apply); + } + + pln->k = ego->k; + pln->rs = X(mkstride)(r, irs); + pln->td = 0; + pln->r = r; + pln->m = m; + pln->ms = ms; + pln->v = v; + pln->vs = ivs; + pln->mb = mstart; + pln->me = mstart + mcount; + pln->slv = ego; + pln->brs = X(mkstride)(r, 2 * compute_batchsize(r)); + pln->extra_iter = extra_iter; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(v * (mcount/e->genus->vl), &e->ops, &pln->super.super.ops); + + if (ego->bufferedp) { + /* 8 load/stores * N * V */ + pln->super.super.ops.other += 8 * r * mcount * v; + } + + pln->super.super.could_prune_now_p = + (!ego->bufferedp && r >= 5 && r < 64 && m >= r); + return &(pln->super.super); +} + +static void regone(planner *plnr, kdftw codelet, + const ct_desc *desc, int dec, int bufferedp) +{ + S *slv = (S *)X(mksolver_ct)(sizeof(S), desc->radix, dec, mkcldw, 0); + slv->k = codelet; + slv->desc = desc; + slv->bufferedp = bufferedp; + REGISTER_SOLVER(plnr, &(slv->super.super)); + if (X(mksolver_ct_hook)) { + slv = (S *)X(mksolver_ct_hook)(sizeof(S), desc->radix, + dec, mkcldw, 0); + slv->k = codelet; + slv->desc = desc; + slv->bufferedp = bufferedp; + REGISTER_SOLVER(plnr, &(slv->super.super)); + } +} + +void X(regsolver_ct_directw)(planner *plnr, kdftw codelet, + const ct_desc *desc, int dec) +{ + regone(plnr, codelet, desc, dec, /* bufferedp */ 0); + regone(plnr, codelet, desc, dec, /* bufferedp */ 1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-directsq.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-directsq.c new file mode 100644 index 000000000..2ffa5710e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-directsq.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/ct.h" + +typedef struct { + ct_solver super; + const ct_desc *desc; + kdftwsq k; +} S; + +typedef struct { + plan_dftw super; + kdftwsq k; + INT r; + stride rs, vs; + INT m, ms, v, mb, me; + twid *td; + const S *slv; +} P; + + +static void apply(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + INT mb = ego->mb, ms = ego->ms; + ego->k(rio + mb*ms, iio + mb*ms, ego->td->W, ego->rs, ego->vs, + mb, ego->me, ms); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(twiddle_awake)(wakefulness, &ego->td, ego->slv->desc->tw, + ego->r * ego->m, ego->r, ego->m); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(stride_destroy)(ego->rs); + X(stride_destroy)(ego->vs); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *slv = ego->slv; + const ct_desc *e = slv->desc; + + p->print(p, "(dftw-directsq-%D/%D%v \"%s\")", + ego->r, X(twiddle_length)(ego->r, e->tw), ego->v, e->nam); +} + +static int applicable(const S *ego, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mb, INT me, + R *rio, R *iio, + const planner *plnr) +{ + const ct_desc *e = ego->desc; + UNUSED(v); + + return ( + 1 + && r == e->radix + + /* transpose r, v */ + && r == v + && irs == ovs + && ivs == ors + + /* check for alignment/vector length restrictions */ + && e->genus->okp(e, rio, iio, irs, ivs, m, mb, me, ms, plnr) + + ); +} + +static plan *mkcldw(const ct_solver *ego_, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mstart, INT mcount, + R *rio, R *iio, + planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const ct_desc *e = ego->desc; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + A(mstart >= 0 && mstart + mcount <= m); + if (!applicable(ego, + r, irs, ors, m, ms, v, ivs, ovs, mstart, mstart + mcount, + rio, iio, plnr)) + return (plan *)0; + + pln = MKPLAN_DFTW(P, &padt, apply); + + pln->k = ego->k; + pln->rs = X(mkstride)(r, irs); + pln->vs = X(mkstride)(v, ivs); + pln->td = 0; + pln->r = r; + pln->m = m; + pln->ms = ms; + pln->v = v; + pln->mb = mstart; + pln->me = mstart + mcount; + pln->slv = ego; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(mcount/e->genus->vl, &e->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +static void regone(planner *plnr, kdftwsq codelet, + const ct_desc *desc, int dec) +{ + S *slv = (S *)X(mksolver_ct)(sizeof(S), desc->radix, dec, mkcldw, 0); + slv->k = codelet; + slv->desc = desc; + REGISTER_SOLVER(plnr, &(slv->super.super)); + if (X(mksolver_ct_hook)) { + slv = (S *)X(mksolver_ct_hook)(sizeof(S), desc->radix, dec, + mkcldw, 0); + slv->k = codelet; + slv->desc = desc; + REGISTER_SOLVER(plnr, &(slv->super.super)); + } +} + +void X(regsolver_ct_directwsq)(planner *plnr, kdftwsq codelet, + const ct_desc *desc, int dec) +{ + regone(plnr, codelet, desc, dec+TRANSPOSE); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-generic.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-generic.c new file mode 100644 index 000000000..b523b2bd2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-generic.c @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* express a twiddle problem in terms of dft + multiplication by + twiddle factors */ + +#include "dft/ct.h" + +typedef ct_solver S; + +typedef struct { + plan_dftw super; + + INT r, rs, m, mb, me, ms, v, vs; + + plan *cld; + + twid *td; + + const S *slv; + int dec; +} P; + +static void mktwiddle(P *ego, enum wakefulness wakefulness) +{ + static const tw_instr tw[] = { { TW_FULL, 0, 0 }, { TW_NEXT, 1, 0 } }; + + /* note that R and M are swapped, to allow for sequential + access both to data and twiddles */ + X(twiddle_awake)(wakefulness, &ego->td, tw, + ego->r * ego->m, ego->m, ego->r); +} + +static void bytwiddle(const P *ego, R *rio, R *iio) +{ + INT iv, ir, im; + INT r = ego->r, rs = ego->rs; + INT m = ego->m, mb = ego->mb, me = ego->me, ms = ego->ms; + INT v = ego->v, vs = ego->vs; + const R *W = ego->td->W; + + mb += (mb == 0); /* skip m=0 iteration */ + for (iv = 0; iv < v; ++iv) { + for (ir = 1; ir < r; ++ir) { + for (im = mb; im < me; ++im) { + R *pr = rio + ms * im + rs * ir; + R *pi = iio + ms * im + rs * ir; + E xr = *pr; + E xi = *pi; + E wr = W[2 * im + (2 * (m-1)) * ir - 2]; + E wi = W[2 * im + (2 * (m-1)) * ir - 1]; + *pr = xr * wr + xi * wi; + *pi = xi * wr - xr * wi; + } + } + rio += vs; + iio += vs; + } +} + +static int applicable(INT irs, INT ors, INT ivs, INT ovs, + const planner *plnr) +{ + return (1 + && irs == ors + && ivs == ovs + && !NO_SLOWP(plnr) + ); +} + +static void apply_dit(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + INT dm = ego->ms * ego->mb; + + bytwiddle(ego, rio, iio); + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, rio + dm, iio + dm, rio + dm, iio + dm); +} + +static void apply_dif(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + INT dm = ego->ms * ego->mb; + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, rio + dm, iio + dm, rio + dm, iio + dm); + + bytwiddle(ego, rio, iio); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + mktwiddle(ego, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(dftw-generic-%s-%D-%D%v%(%p%))", + ego->dec == DECDIT ? "dit" : "dif", + ego->r, ego->m, ego->v, ego->cld); +} + +static plan *mkcldw(const ct_solver *ego_, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mstart, INT mcount, + R *rio, R *iio, + planner *plnr) +{ + const S *ego = (const S *)ego_; + P *pln; + plan *cld = 0; + INT dm = ms * mstart; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + A(mstart >= 0 && mstart + mcount <= m); + if (!applicable(irs, ors, ivs, ovs, plnr)) + return (plan *)0; + + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(r, irs, irs), + X(mktensor_2d)(mcount, ms, ms, v, ivs, ivs), + rio + dm, iio + dm, rio + dm, iio + dm) + ); + if (!cld) goto nada; + + pln = MKPLAN_DFTW(P, &padt, ego->dec == DECDIT ? apply_dit : apply_dif); + pln->slv = ego; + pln->cld = cld; + pln->r = r; + pln->rs = irs; + pln->m = m; + pln->ms = ms; + pln->v = v; + pln->vs = ivs; + pln->mb = mstart; + pln->me = mstart + mcount; + pln->dec = ego->dec; + pln->td = 0; + + { + double n0 = (r - 1) * (mcount - 1) * v; + pln->super.super.ops = cld->ops; + pln->super.super.ops.mul += 8 * n0; + pln->super.super.ops.add += 4 * n0; + pln->super.super.ops.other += 8 * n0; + } + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +static void regsolver(planner *plnr, INT r, int dec) +{ + S *slv = (S *)X(mksolver_ct)(sizeof(S), r, dec, mkcldw, 0); + REGISTER_SOLVER(plnr, &(slv->super)); + if (X(mksolver_ct_hook)) { + slv = (S *)X(mksolver_ct_hook)(sizeof(S), r, dec, mkcldw, 0); + REGISTER_SOLVER(plnr, &(slv->super)); + } +} + +void X(ct_generic_register)(planner *p) +{ + regsolver(p, 0, DECDIT); + regsolver(p, 0, DECDIF); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-genericbuf.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-genericbuf.c new file mode 100644 index 000000000..84d7c03ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/dftw-genericbuf.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* express a twiddle problem in terms of dft + multiplication by + twiddle factors */ + +#include "dft/ct.h" + +typedef struct { + ct_solver super; + INT batchsz; +} S; + +typedef struct { + plan_dftw super; + + INT r, rs, m, ms, v, vs, mb, me; + INT batchsz; + plan *cld; + + triggen *t; + const S *slv; +} P; + + +#define BATCHDIST(r) ((r) + 16) + +/**************************************************************/ +static void bytwiddle(const P *ego, INT mb, INT me, R *buf, R *rio, R *iio) +{ + INT j, k; + INT r = ego->r, rs = ego->rs, ms = ego->ms; + triggen *t = ego->t; + for (j = 0; j < r; ++j) { + for (k = mb; k < me; ++k) + t->rotate(t, j * k, + rio[j * rs + k * ms], + iio[j * rs + k * ms], + &buf[j * 2 + 2 * BATCHDIST(r) * (k - mb) + 0]); + } +} + +static int applicable0(const S *ego, + INT r, INT irs, INT ors, + INT m, INT v, + INT mcount) +{ + return (1 + && v == 1 + && irs == ors + && mcount >= ego->batchsz + && mcount % ego->batchsz == 0 + && r >= 64 + && m >= r + ); +} + +static int applicable(const S *ego, + INT r, INT irs, INT ors, + INT m, INT v, + INT mcount, + const planner *plnr) +{ + if (!applicable0(ego, r, irs, ors, m, v, mcount)) + return 0; + if (NO_UGLYP(plnr) && m * r < 65536) + return 0; + + return 1; +} + +static void dobatch(const P *ego, INT mb, INT me, R *buf, R *rio, R *iio) +{ + plan_dft *cld; + INT ms = ego->ms; + + bytwiddle(ego, mb, me, buf, rio, iio); + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, buf, buf + 1, buf, buf + 1); + X(cpy2d_pair_co)(buf, buf + 1, + rio + ms * mb, iio + ms * mb, + me-mb, 2 * BATCHDIST(ego->r), ms, + ego->r, 2, ego->rs); +} + +static void apply(const plan *ego_, R *rio, R *iio) +{ + const P *ego = (const P *) ego_; + R *buf = (R *) MALLOC(sizeof(R) * 2 * BATCHDIST(ego->r) * ego->batchsz, + BUFFERS); + INT m; + + for (m = ego->mb; m < ego->me; m += ego->batchsz) + dobatch(ego, m, m + ego->batchsz, buf, rio, iio); + + A(m == ego->me); + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + + switch (wakefulness) { + case SLEEPY: + X(triggen_destroy)(ego->t); ego->t = 0; + break; + default: + ego->t = X(mktriggen)(AWAKE_SQRTN_TABLE, ego->r * ego->m); + break; + } +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(dftw-genericbuf/%D-%D-%D%(%p%))", + ego->batchsz, ego->r, ego->m, ego->cld); +} + +static plan *mkcldw(const ct_solver *ego_, + INT r, INT irs, INT ors, + INT m, INT ms, + INT v, INT ivs, INT ovs, + INT mstart, INT mcount, + R *rio, R *iio, + planner *plnr) +{ + const S *ego = (const S *)ego_; + P *pln; + plan *cld = 0; + R *buf; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + UNUSED(ivs); UNUSED(ovs); UNUSED(rio); UNUSED(iio); + + A(mstart >= 0 && mstart + mcount <= m); + if (!applicable(ego, r, irs, ors, m, v, mcount, plnr)) + return (plan *)0; + + buf = (R *) MALLOC(sizeof(R) * 2 * BATCHDIST(r) * ego->batchsz, BUFFERS); + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(r, 2, 2), + X(mktensor_1d)(ego->batchsz, + 2 * BATCHDIST(r), + 2 * BATCHDIST(r)), + buf, buf + 1, buf, buf + 1 + ) + ); + X(ifree)(buf); + if (!cld) goto nada; + + pln = MKPLAN_DFTW(P, &padt, apply); + pln->slv = ego; + pln->cld = cld; + pln->r = r; + pln->m = m; + pln->ms = ms; + pln->rs = irs; + pln->batchsz = ego->batchsz; + pln->mb = mstart; + pln->me = mstart + mcount; + + { + double n0 = (r - 1) * (mcount - 1); + pln->super.super.ops = cld->ops; + pln->super.super.ops.mul += 8 * n0; + pln->super.super.ops.add += 4 * n0; + pln->super.super.ops.other += 8 * n0; + } + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +static void regsolver(planner *plnr, INT r, INT batchsz) +{ + S *slv = (S *)X(mksolver_ct)(sizeof(S), r, DECDIT, mkcldw, 0); + slv->batchsz = batchsz; + REGISTER_SOLVER(plnr, &(slv->super.super)); + + if (X(mksolver_ct_hook)) { + slv = (S *)X(mksolver_ct_hook)(sizeof(S), r, DECDIT, mkcldw, 0); + slv->batchsz = batchsz; + REGISTER_SOLVER(plnr, &(slv->super.super)); + } + +} + +void X(ct_genericbuf_register)(planner *p) +{ + static const INT radices[] = { -1, -2, -4, -8, -16, -32, -64 }; + static const INT batchsizes[] = { 4, 8, 16, 32, 64 }; + unsigned i, j; + + for (i = 0; i < sizeof(radices) / sizeof(radices[0]); ++i) + for (j = 0; j < sizeof(batchsizes) / sizeof(batchsizes[0]); ++j) + regsolver(p, radices[i], batchsizes[j]); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/direct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/direct.c new file mode 100644 index 000000000..c9df9c966 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/direct.c @@ -0,0 +1,293 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* direct DFT solver, if we have a codelet */ + +#include "dft/dft.h" + +typedef struct { + solver super; + const kdft_desc *desc; + kdft k; + int bufferedp; +} S; + +typedef struct { + plan_dft super; + + stride is, os, bufstride; + INT n, vl, ivs, ovs; + kdft k; + const S *slv; +} P; + +static void dobatch(const P *ego, R *ri, R *ii, R *ro, R *io, + R *buf, INT batchsz) +{ + X(cpy2d_pair_ci)(ri, ii, buf, buf+1, + ego->n, WS(ego->is, 1), WS(ego->bufstride, 1), + batchsz, ego->ivs, 2); + + if (IABS(WS(ego->os, 1)) < IABS(ego->ovs)) { + /* transform directly to output */ + ego->k(buf, buf+1, ro, io, + ego->bufstride, ego->os, batchsz, 2, ego->ovs); + } else { + /* transform to buffer and copy back */ + ego->k(buf, buf+1, buf, buf+1, + ego->bufstride, ego->bufstride, batchsz, 2, 2); + X(cpy2d_pair_co)(buf, buf+1, ro, io, + ego->n, WS(ego->bufstride, 1), WS(ego->os, 1), + batchsz, 2, ego->ovs); + } +} + +static INT compute_batchsize(INT n) +{ + /* round up to multiple of 4 */ + n += 3; + n &= -4; + + return (n + 2); +} + +static void apply_buf(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + R *buf; + INT vl = ego->vl, n = ego->n, batchsz = compute_batchsize(n); + INT i; + size_t bufsz = n * batchsz * 2 * sizeof(R); + + BUF_ALLOC(R *, buf, bufsz); + + for (i = 0; i < vl - batchsz; i += batchsz) { + dobatch(ego, ri, ii, ro, io, buf, batchsz); + ri += batchsz * ego->ivs; ii += batchsz * ego->ivs; + ro += batchsz * ego->ovs; io += batchsz * ego->ovs; + } + dobatch(ego, ri, ii, ro, io, buf, vl - i); + + BUF_FREE(buf, bufsz); +} + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + ASSERT_ALIGNED_DOUBLE; + ego->k(ri, ii, ro, io, ego->is, ego->os, ego->vl, ego->ivs, ego->ovs); +} + +static void apply_extra_iter(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT vl = ego->vl; + + ASSERT_ALIGNED_DOUBLE; + + /* for 4-way SIMD when VL is odd: iterate over an + even vector length VL, and then execute the last + iteration as a 2-vector with vector stride 0. */ + ego->k(ri, ii, ro, io, ego->is, ego->os, vl - 1, ego->ivs, ego->ovs); + + ego->k(ri + (vl - 1) * ego->ivs, ii + (vl - 1) * ego->ivs, + ro + (vl - 1) * ego->ovs, io + (vl - 1) * ego->ovs, + ego->is, ego->os, 1, 0, 0); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(stride_destroy)(ego->is); + X(stride_destroy)(ego->os); + X(stride_destroy)(ego->bufstride); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->slv; + const kdft_desc *d = s->desc; + + if (ego->slv->bufferedp) + p->print(p, "(dft-directbuf/%D-%D%v \"%s\")", + compute_batchsize(d->sz), d->sz, ego->vl, d->nam); + else + p->print(p, "(dft-direct-%D%v \"%s\")", d->sz, ego->vl, d->nam); +} + +static int applicable_buf(const solver *ego_, const problem *p_, + const planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_dft *p = (const problem_dft *) p_; + const kdft_desc *d = ego->desc; + INT vl; + INT ivs, ovs; + INT batchsz; + + return ( + 1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 1 + && p->sz->dims[0].n == d->sz + + /* check strides etc */ + && X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs) + + /* UGLY if IS <= IVS */ + && !(NO_UGLYP(plnr) && + X(iabs)(p->sz->dims[0].is) <= X(iabs)(ivs)) + + && (batchsz = compute_batchsize(d->sz), 1) + && (d->genus->okp(d, 0, ((const R *)0) + 1, p->ro, p->io, + 2 * batchsz, p->sz->dims[0].os, + batchsz, 2, ovs, plnr)) + && (d->genus->okp(d, 0, ((const R *)0) + 1, p->ro, p->io, + 2 * batchsz, p->sz->dims[0].os, + vl % batchsz, 2, ovs, plnr)) + + + && (0 + /* can operate out-of-place */ + || p->ri != p->ro + + /* can operate in-place as long as strides are the same */ + || X(tensor_inplace_strides2)(p->sz, p->vecsz) + + /* can do it if the problem fits in the buffer, no matter + what the strides are */ + || vl <= batchsz + ) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *extra_iterp) +{ + const S *ego = (const S *) ego_; + const problem_dft *p = (const problem_dft *) p_; + const kdft_desc *d = ego->desc; + INT vl; + INT ivs, ovs; + + return ( + 1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n == d->sz + + /* check strides etc */ + && X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs) + + && ((*extra_iterp = 0, + (d->genus->okp(d, p->ri, p->ii, p->ro, p->io, + p->sz->dims[0].is, p->sz->dims[0].os, + vl, ivs, ovs, plnr))) + || + (*extra_iterp = 1, + ((d->genus->okp(d, p->ri, p->ii, p->ro, p->io, + p->sz->dims[0].is, p->sz->dims[0].os, + vl - 1, ivs, ovs, plnr)) + && + (d->genus->okp(d, p->ri, p->ii, p->ro, p->io, + p->sz->dims[0].is, p->sz->dims[0].os, + 2, 0, 0, plnr))))) + + && (0 + /* can operate out-of-place */ + || p->ri != p->ro + + /* can always compute one transform */ + || vl == 1 + + /* can operate in-place as long as strides are the same */ + || X(tensor_inplace_strides2)(p->sz, p->vecsz) + ) + ); +} + + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const problem_dft *p; + iodim *d; + const kdft_desc *e = ego->desc; + + static const plan_adt padt = { + X(dft_solve), X(null_awake), print, destroy + }; + + UNUSED(plnr); + + if (ego->bufferedp) { + if (!applicable_buf(ego_, p_, plnr)) + return (plan *)0; + pln = MKPLAN_DFT(P, &padt, apply_buf); + } else { + int extra_iterp = 0; + if (!applicable(ego_, p_, plnr, &extra_iterp)) + return (plan *)0; + pln = MKPLAN_DFT(P, &padt, extra_iterp ? apply_extra_iter : apply); + } + + p = (const problem_dft *) p_; + d = p->sz->dims; + pln->k = ego->k; + pln->n = d[0].n; + pln->is = X(mkstride)(pln->n, d[0].is); + pln->os = X(mkstride)(pln->n, d[0].os); + pln->bufstride = X(mkstride)(pln->n, 2 * compute_batchsize(pln->n)); + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + pln->slv = ego; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl / e->genus->vl, &e->ops, &pln->super.super.ops); + + if (ego->bufferedp) + pln->super.super.ops.other += 4 * pln->n * pln->vl; + + pln->super.super.could_prune_now_p = !ego->bufferedp; + return &(pln->super.super); +} + +static solver *mksolver(kdft k, const kdft_desc *desc, int bufferedp) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->k = k; + slv->desc = desc; + slv->bufferedp = bufferedp; + return &(slv->super); +} + +solver *X(mksolver_dft_direct)(kdft k, const kdft_desc *desc) +{ + return mksolver(k, desc, 0); +} + +solver *X(mksolver_dft_directbuf)(kdft k, const kdft_desc *desc) +{ + return mksolver(k, desc, 1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/generic.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/generic.c new file mode 100644 index 000000000..e2f2b78e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/generic.c @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/dft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_dft super; + twid *td; + INT n, is, os; +} P; + + +static void cdot(INT n, const E *x, const R *w, + R *or0, R *oi0, R *or1, R *oi1) +{ + INT i; + + E rr = x[0], ri = 0, ir = x[1], ii = 0; + x += 2; + for (i = 1; i + i < n; ++i) { + rr += x[0] * w[0]; + ir += x[1] * w[0]; + ri += x[2] * w[1]; + ii += x[3] * w[1]; + x += 4; w += 2; + } + *or0 = rr + ii; + *oi0 = ir - ri; + *or1 = rr - ii; + *oi1 = ir + ri; +} + +static void hartley(INT n, const R *xr, const R *xi, INT xs, E *o, + R *pr, R *pi) +{ + INT i; + E sr, si; + o[0] = sr = xr[0]; o[1] = si = xi[0]; o += 2; + for (i = 1; i + i < n; ++i) { + sr += (o[0] = xr[i * xs] + xr[(n - i) * xs]); + si += (o[1] = xi[i * xs] + xi[(n - i) * xs]); + o[2] = xr[i * xs] - xr[(n - i) * xs]; + o[3] = xi[i * xs] - xi[(n - i) * xs]; + o += 4; + } + *pr = sr; + *pi = si; +} + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT i; + INT n = ego->n, is = ego->is, os = ego->os; + const R *W = ego->td->W; + E *buf; + size_t bufsz = n * 2 * sizeof(E); + + BUF_ALLOC(E *, buf, bufsz); + hartley(n, ri, ii, is, buf, ro, io); + + for (i = 1; i + i < n; ++i) { + cdot(n, buf, W, + ro + i * os, io + i * os, + ro + (n - i) * os, io + (n - i) * os); + W += n - 1; + } + + BUF_FREE(buf, bufsz); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr half_tw[] = { + { TW_HALF, 1, 0 }, + { TW_NEXT, 1, 0 } + }; + + X(twiddle_awake)(wakefulness, &ego->td, half_tw, ego->n, ego->n, + (ego->n - 1) / 2); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + + p->print(p, "(dft-generic-%D)", ego->n); +} + +static int applicable(const solver *ego, const problem *p_, + const planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + UNUSED(ego); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + && (p->sz->dims[0].n % 2) == 1 + && CIMPLIES(NO_LARGE_GENERICP(plnr), p->sz->dims[0].n < GENERIC_MIN_BAD) + && CIMPLIES(NO_SLOWP(plnr), p->sz->dims[0].n > GENERIC_MAX_SLOW) + && X(is_prime)(p->sz->dims[0].n) + ); +} + +static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) +{ + const problem_dft *p; + P *pln; + INT n; + + static const plan_adt padt = { + X(dft_solve), awake, print, X(plan_null_destroy) + }; + + if (!applicable(ego, p_, plnr)) + return (plan *)0; + + pln = MKPLAN_DFT(P, &padt, apply); + + p = (const problem_dft *) p_; + pln->n = n = p->sz->dims[0].n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->td = 0; + + pln->super.super.ops.add = (n-1) * 5; + pln->super.super.ops.mul = 0; + pln->super.super.ops.fma = (n-1) * (n-1) ; +#if 0 /* these are nice pipelined sequential loads and should cost nothing */ + pln->super.super.ops.other = (n-1)*(4 + 1 + 2 * (n-1)); /* approximate */ +#endif + + return &(pln->super.super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(dft_generic_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/indirect-transpose.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/indirect-transpose.c new file mode 100644 index 000000000..5d7dfa4a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/indirect-transpose.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* solvers/plans for vectors of DFTs corresponding to the columns + of a matrix: first transpose the matrix so that the DFTs are + contiguous, then do DFTs with transposed output. In particular, + we restrict ourselves to the case of a square transpose (or a + sequence thereof). */ + +#include "dft/dft.h" + +typedef solver S; + +typedef struct { + plan_dft super; + INT vl, ivs, ovs; + plan *cldtrans, *cld, *cldrest; +} P; + +/* initial transpose is out-of-place from input to output */ +static void apply_op(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT vl = ego->vl, ivs = ego->ivs, ovs = ego->ovs, i; + + for (i = 0; i < vl; ++i) { + { + plan_dft *cldtrans = (plan_dft *) ego->cldtrans; + cldtrans->apply(ego->cldtrans, ri, ii, ro, io); + } + { + plan_dft *cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ro, io, ro, io); + } + ri += ivs; ii += ivs; + ro += ovs; io += ovs; + } + { + plan_dft *cldrest = (plan_dft *) ego->cldrest; + cldrest->apply(ego->cldrest, ri, ii, ro, io); + } +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldrest); + X(plan_destroy_internal)(ego->cld); + X(plan_destroy_internal)(ego->cldtrans); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldtrans, wakefulness); + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldrest, wakefulness); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(indirect-transpose%v%(%p%)%(%p%)%(%p%))", + ego->vl, ego->cldtrans, ego->cld, ego->cldrest); +} + +static int pickdim(const tensor *vs, const tensor *s, int *pdim0, int *pdim1) +{ + int dim0, dim1; + *pdim0 = *pdim1 = -1; + for (dim0 = 0; dim0 < vs->rnk; ++dim0) + for (dim1 = 0; dim1 < s->rnk; ++dim1) + if (vs->dims[dim0].n * X(iabs)(vs->dims[dim0].is) <= X(iabs)(s->dims[dim1].is) + && vs->dims[dim0].n >= s->dims[dim1].n + && (*pdim0 == -1 + || (X(iabs)(vs->dims[dim0].is) <= X(iabs)(vs->dims[*pdim0].is) + && X(iabs)(s->dims[dim1].is) >= X(iabs)(s->dims[*pdim1].is)))) { + *pdim0 = dim0; + *pdim1 = dim1; + } + return (*pdim0 != -1 && *pdim1 != -1); +} + +static int applicable0(const solver *ego_, const problem *p_, + const planner *plnr, + int *pdim0, int *pdim1) +{ + const problem_dft *p = (const problem_dft *) p_; + UNUSED(ego_); UNUSED(plnr); + + return (1 + && FINITE_RNK(p->vecsz->rnk) && FINITE_RNK(p->sz->rnk) + + /* FIXME: can/should we relax this constraint? */ + && X(tensor_inplace_strides2)(p->vecsz, p->sz) + + && pickdim(p->vecsz, p->sz, pdim0, pdim1) + + /* output should not *already* include the transpose + (in which case we duplicate the regular indirect.c) */ + && (p->sz->dims[*pdim1].os != p->vecsz->dims[*pdim0].is) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, + int *pdim0, int *pdim1) +{ + if (!applicable0(ego_, p_, plnr, pdim0, pdim1)) return 0; + { + const problem_dft *p = (const problem_dft *) p_; + INT u = p->ri == p->ii + 1 || p->ii == p->ri + 1 ? (INT)2 : (INT)1; + + /* UGLY if does not result in contiguous transforms or + transforms of contiguous vectors (since the latter at + least have efficient transpositions) */ + if (NO_UGLYP(plnr) + && p->vecsz->dims[*pdim0].is != u + && !(p->vecsz->rnk == 2 + && p->vecsz->dims[1-*pdim0].is == u + && p->vecsz->dims[*pdim0].is + == u * p->vecsz->dims[1-*pdim0].n)) + return 0; + + if (NO_INDIRECT_OP_P(plnr) && p->ri != p->ro) return 0; + } + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + P *pln; + plan *cld = 0, *cldtrans = 0, *cldrest = 0; + int pdim0, pdim1; + tensor *ts, *tv; + INT vl, ivs, ovs; + R *rit, *iit, *rot, *iot; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &pdim0, &pdim1)) + return (plan *) 0; + + vl = p->vecsz->dims[pdim0].n / p->sz->dims[pdim1].n; + A(vl >= 1); + ivs = p->sz->dims[pdim1].n * p->vecsz->dims[pdim0].is; + ovs = p->sz->dims[pdim1].n * p->vecsz->dims[pdim0].os; + rit = TAINT(p->ri, vl == 1 ? 0 : ivs); + iit = TAINT(p->ii, vl == 1 ? 0 : ivs); + rot = TAINT(p->ro, vl == 1 ? 0 : ovs); + iot = TAINT(p->io, vl == 1 ? 0 : ovs); + + ts = X(tensor_copy_inplace)(p->sz, INPLACE_IS); + ts->dims[pdim1].os = p->vecsz->dims[pdim0].is; + tv = X(tensor_copy_inplace)(p->vecsz, INPLACE_IS); + tv->dims[pdim0].os = p->sz->dims[pdim1].is; + tv->dims[pdim0].n = p->sz->dims[pdim1].n; + cldtrans = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_0d)(), + X(tensor_append)(tv, ts), + rit, iit, + rot, iot)); + X(tensor_destroy2)(ts, tv); + if (!cldtrans) goto nada; + + ts = X(tensor_copy)(p->sz); + ts->dims[pdim1].is = p->vecsz->dims[pdim0].is; + tv = X(tensor_copy)(p->vecsz); + tv->dims[pdim0].is = p->sz->dims[pdim1].is; + tv->dims[pdim0].n = p->sz->dims[pdim1].n; + cld = X(mkplan_d)(plnr, X(mkproblem_dft_d)(ts, tv, + rot, iot, + rot, iot)); + if (!cld) goto nada; + + tv = X(tensor_copy)(p->vecsz); + tv->dims[pdim0].n -= vl * p->sz->dims[pdim1].n; + cldrest = X(mkplan_d)(plnr, X(mkproblem_dft_d)(X(tensor_copy)(p->sz), tv, + p->ri + ivs * vl, + p->ii + ivs * vl, + p->ro + ovs * vl, + p->io + ovs * vl)); + if (!cldrest) goto nada; + + pln = MKPLAN_DFT(P, &padt, apply_op); + pln->cldtrans = cldtrans; + pln->cld = cld; + pln->cldrest = cldrest; + pln->vl = vl; + pln->ivs = ivs; + pln->ovs = ovs; + X(ops_cpy)(&cldrest->ops, &pln->super.super.ops); + X(ops_madd2)(vl, &cld->ops, &pln->super.super.ops); + X(ops_madd2)(vl, &cldtrans->ops, &pln->super.super.ops); + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldrest); + X(plan_destroy_internal)(cld); + X(plan_destroy_internal)(cldtrans); + return (plan *)0; +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return slv; +} + +void X(dft_indirect_transpose_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/indirect.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/indirect.c new file mode 100644 index 000000000..4fec10cae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/indirect.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +/* solvers/plans for vectors of small DFT's that cannot be done + in-place directly. Use a rank-0 plan to rearrange the data + before or after the transform. Can also change an out-of-place + plan into a copy + in-place (where the in-place transform + is e.g. unit stride). */ + +/* FIXME: merge with rank-geq2.c(?), since this is just a special case + of a rank split where the first/second transform has rank 0. */ + +#include "dft/dft.h" + +typedef problem *(*mkcld_t) (const problem_dft *p); + +typedef struct { + dftapply apply; + problem *(*mkcld)(const problem_dft *p); + const char *nam; +} ndrct_adt; + +typedef struct { + solver super; + const ndrct_adt *adt; +} S; + +typedef struct { + plan_dft super; + plan *cldcpy, *cld; + const S *slv; +} P; + +/*-----------------------------------------------------------------------*/ +/* first rearrange, then transform */ +static void apply_before(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + + { + plan_dft *cldcpy = (plan_dft *) ego->cldcpy; + cldcpy->apply(ego->cldcpy, ri, ii, ro, io); + } + { + plan_dft *cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ro, io, ro, io); + } +} + +static problem *mkcld_before(const problem_dft *p) +{ + return X(mkproblem_dft_d)(X(tensor_copy_inplace)(p->sz, INPLACE_OS), + X(tensor_copy_inplace)(p->vecsz, INPLACE_OS), + p->ro, p->io, p->ro, p->io); +} + +static const ndrct_adt adt_before = +{ + apply_before, mkcld_before, "dft-indirect-before" +}; + +/*-----------------------------------------------------------------------*/ +/* first transform, then rearrange */ + +static void apply_after(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + + { + plan_dft *cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ri, ii, ri, ii); + } + { + plan_dft *cldcpy = (plan_dft *) ego->cldcpy; + cldcpy->apply(ego->cldcpy, ri, ii, ro, io); + } +} + +static problem *mkcld_after(const problem_dft *p) +{ + return X(mkproblem_dft_d)(X(tensor_copy_inplace)(p->sz, INPLACE_IS), + X(tensor_copy_inplace)(p->vecsz, INPLACE_IS), + p->ri, p->ii, p->ri, p->ii); +} + +static const ndrct_adt adt_after = +{ + apply_after, mkcld_after, "dft-indirect-after" +}; + +/*-----------------------------------------------------------------------*/ +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); + X(plan_destroy_internal)(ego->cldcpy); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldcpy, wakefulness); + X(plan_awake)(ego->cld, wakefulness); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->slv; + p->print(p, "(%s%(%p%)%(%p%))", s->adt->nam, ego->cld, ego->cldcpy); +} + +static int applicable0(const solver *ego_, const problem *p_, + const planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_dft *p = (const problem_dft *) p_; + return (1 + && FINITE_RNK(p->vecsz->rnk) + + /* problem must be a nontrivial transform, not just a copy */ + && p->sz->rnk > 0 + + && (0 + + /* problem must be in-place & require some + rearrangement of the data; to prevent + infinite loops with indirect-transpose, we + further require that at least some transform + strides must decrease */ + || (p->ri == p->ro + && !X(tensor_inplace_strides2)(p->sz, p->vecsz) + && X(tensor_strides_decrease)( + p->sz, p->vecsz, + ego->adt->apply == apply_after ? + INPLACE_IS : INPLACE_OS)) + + /* or problem must be out of place, transforming + from stride 1/2 to bigger stride, for apply_after */ + || (p->ri != p->ro && ego->adt->apply == apply_after + && !NO_DESTROY_INPUTP(plnr) + && X(tensor_min_istride)(p->sz) <= 2 + && X(tensor_min_ostride)(p->sz) > 2) + + /* or problem must be out of place, transforming + to stride 1/2 from bigger stride, for apply_before */ + || (p->ri != p->ro && ego->adt->apply == apply_before + && X(tensor_min_ostride)(p->sz) <= 2 + && X(tensor_min_istride)(p->sz) > 2) + ) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr) +{ + if (!applicable0(ego_, p_, plnr)) return 0; + { + const problem_dft *p = (const problem_dft *) p_; + if (NO_INDIRECT_OP_P(plnr) && p->ri != p->ro) return 0; + } + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + const S *ego = (const S *) ego_; + P *pln; + plan *cld = 0, *cldcpy = 0; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *) 0; + + cldcpy = + X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_0d)(), + X(tensor_append)(p->vecsz, p->sz), + p->ri, p->ii, p->ro, p->io)); + + if (!cldcpy) goto nada; + + cld = X(mkplan_f_d)(plnr, ego->adt->mkcld(p), NO_BUFFERING, 0, 0); + if (!cld) goto nada; + + pln = MKPLAN_DFT(P, &padt, ego->adt->apply); + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->slv = ego; + X(ops_add)(&cld->ops, &cldcpy->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld); + X(plan_destroy_internal)(cldcpy); + return (plan *)0; +} + +static solver *mksolver(const ndrct_adt *adt) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->adt = adt; + return &(slv->super); +} + +void X(dft_indirect_register)(planner *p) +{ + unsigned i; + static const ndrct_adt *const adts[] = { + &adt_before, &adt_after + }; + + for (i = 0; i < sizeof(adts) / sizeof(adts[0]); ++i) + REGISTER_SOLVER(p, mksolver(adts[i])); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-dif.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-dif.c new file mode 100644 index 000000000..3aff1c02b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-dif.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/ct.h" + +void X(kdft_dif_register)(planner *p, kdftw codelet, const ct_desc *desc) +{ + X(regsolver_ct_directw)(p, codelet, desc, DECDIF); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-difsq.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-difsq.c new file mode 100644 index 000000000..b25c49d86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-difsq.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/ct.h" + +void X(kdft_difsq_register)(planner *p, kdftwsq k, const ct_desc *desc) +{ + X(regsolver_ct_directwsq)(p, k, desc, DECDIF); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-dit.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-dit.c new file mode 100644 index 000000000..6c3c2d202 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft-dit.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/ct.h" + +void X(kdft_dit_register)(planner *p, kdftw codelet, const ct_desc *desc) +{ + X(regsolver_ct_directw)(p, codelet, desc, DECDIT); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft.c new file mode 100644 index 000000000..9eb8f41a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/kdft.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" + +void X(kdft_register)(planner *p, kdft codelet, const kdft_desc *desc) +{ + REGISTER_SOLVER(p, X(mksolver_dft_direct)(codelet, desc)); + REGISTER_SOLVER(p, X(mksolver_dft_directbuf)(codelet, desc)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/nop.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/nop.c new file mode 100644 index 000000000..f4435e9b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/nop.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for vrank -infty DFTs (nothing to do) */ + +#include "dft/dft.h" + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + UNUSED(ego_); + UNUSED(ri); + UNUSED(ii); + UNUSED(ro); + UNUSED(io); +} + +static int applicable(const solver *ego_, const problem *p_) +{ + const problem_dft *p = (const problem_dft *) p_; + + UNUSED(ego_); + + return 0 + /* case 1 : -infty vector rank */ + || (!FINITE_RNK(p->vecsz->rnk)) + + /* case 2 : rank-0 in-place dft */ + || (1 + && p->sz->rnk == 0 + && FINITE_RNK(p->vecsz->rnk) + && p->ro == p->ri + && X(tensor_inplace_strides)(p->vecsz) + ); +} + +static void print(const plan *ego, printer *p) +{ + UNUSED(ego); + p->print(p, "(dft-nop)"); +} + +static plan *mkplan(const solver *ego, const problem *p, planner *plnr) +{ + static const plan_adt padt = { + X(dft_solve), X(null_awake), print, X(plan_null_destroy) + }; + plan_dft *pln; + + UNUSED(plnr); + + if (!applicable(ego, p)) + return (plan *) 0; + pln = MKPLAN_DFT(plan_dft, &padt, apply); + X(ops_zero)(&pln->super.ops); + + return &(pln->super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + return MKSOLVER(solver, &sadt); +} + +void X(dft_nop_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/plan.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/plan.c new file mode 100644 index 000000000..67ad8427c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/plan.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" + +plan *X(mkplan_dft)(size_t size, const plan_adt *adt, dftapply apply) +{ + plan_dft *ego; + + ego = (plan_dft *) X(mkplan)(size, adt); + ego->apply = apply; + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/problem.c new file mode 100644 index 000000000..4e9640aa2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/problem.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" +#include + +static void destroy(problem *ego_) +{ + problem_dft *ego = (problem_dft *) ego_; + X(tensor_destroy2)(ego->vecsz, ego->sz); + X(ifree)(ego_); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_dft *p = (const problem_dft *) p_; + X(md5puts)(m, "dft"); + X(md5int)(m, p->ri == p->ro); + X(md5INT)(m, p->ii - p->ri); + X(md5INT)(m, p->io - p->ro); + X(md5int)(m, X(ialignment_of)(p->ri)); + X(md5int)(m, X(ialignment_of)(p->ii)); + X(md5int)(m, X(ialignment_of)(p->ro)); + X(md5int)(m, X(ialignment_of)(p->io)); + X(tensor_md5)(m, p->sz); + X(tensor_md5)(m, p->vecsz); +} + +static void print(const problem *ego_, printer *p) +{ + const problem_dft *ego = (const problem_dft *) ego_; + p->print(p, "(dft %d %d %d %D %D %T %T)", + ego->ri == ego->ro, + X(ialignment_of)(ego->ri), + X(ialignment_of)(ego->ro), + (INT)(ego->ii - ego->ri), + (INT)(ego->io - ego->ro), + ego->sz, + ego->vecsz); +} + +static void zero(const problem *ego_) +{ + const problem_dft *ego = (const problem_dft *) ego_; + tensor *sz = X(tensor_append)(ego->vecsz, ego->sz); + X(dft_zerotens)(sz, UNTAINT(ego->ri), UNTAINT(ego->ii)); + X(tensor_destroy)(sz); +} + +static const problem_adt padt = +{ + PROBLEM_DFT, + hash, + zero, + print, + destroy +}; + +problem *X(mkproblem_dft)(const tensor *sz, const tensor *vecsz, + R *ri, R *ii, R *ro, R *io) +{ + problem_dft *ego; + + /* enforce pointer equality if untainted pointers are equal */ + if (UNTAINT(ri) == UNTAINT(ro)) + ri = ro = JOIN_TAINT(ri, ro); + if (UNTAINT(ii) == UNTAINT(io)) + ii = io = JOIN_TAINT(ii, io); + + /* more correctness conditions: */ + A(TAINTOF(ri) == TAINTOF(ii)); + A(TAINTOF(ro) == TAINTOF(io)); + + A(X(tensor_kosherp)(sz)); + A(X(tensor_kosherp)(vecsz)); + + if (ri == ro || ii == io) { + /* If either real or imag pointers are in place, both must be. */ + if (ri != ro || ii != io || !X(tensor_inplace_locations)(sz, vecsz)) + return X(mkproblem_unsolvable)(); + } + + ego = (problem_dft *)X(mkproblem)(sizeof(problem_dft), &padt); + + ego->sz = X(tensor_compress)(sz); + ego->vecsz = X(tensor_compress_contiguous)(vecsz); + ego->ri = ri; + ego->ii = ii; + ego->ro = ro; + ego->io = io; + + A(FINITE_RNK(ego->sz->rnk)); + return &(ego->super); +} + +/* Same as X(mkproblem_dft), but also destroy input tensors. */ +problem *X(mkproblem_dft_d)(tensor *sz, tensor *vecsz, + R *ri, R *ii, R *ro, R *io) +{ + problem *p = X(mkproblem_dft)(sz, vecsz, ri, ii, ro, io); + X(tensor_destroy2)(vecsz, sz); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/rader.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/rader.c new file mode 100644 index 000000000..67a382732 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/rader.c @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/dft.h" + +/* + * Compute transforms of prime sizes using Rader's trick: turn them + * into convolutions of size n - 1, which you then perform via a pair + * of FFTs. + */ + +typedef struct { + solver super; +} S; + +typedef struct { + plan_dft super; + + plan *cld1, *cld2; + R *omega; + INT n, g, ginv; + INT is, os; + plan *cld_omega; +} P; + +static rader_tl *omegas = 0; + +static R *mkomega(enum wakefulness wakefulness, plan *p_, INT n, INT ginv) +{ + plan_dft *p = (plan_dft *) p_; + R *omega; + INT i, gpower; + trigreal scale; + triggen *t; + + if ((omega = X(rader_tl_find)(n, n, ginv, omegas))) + return omega; + + omega = (R *)MALLOC(sizeof(R) * (n - 1) * 2, TWIDDLES); + + scale = n - 1.0; /* normalization for convolution */ + + t = X(mktriggen)(wakefulness, n); + for (i = 0, gpower = 1; i < n-1; ++i, gpower = MULMOD(gpower, ginv, n)) { + trigreal w[2]; + t->cexpl(t, gpower, w); + omega[2*i] = w[0] / scale; + omega[2*i+1] = FFT_SIGN * w[1] / scale; + } + X(triggen_destroy)(t); + A(gpower == 1); + + p->apply(p_, omega, omega + 1, omega, omega + 1); + + X(rader_tl_insert)(n, n, ginv, omega, &omegas); + return omega; +} + +static void free_omega(R *omega) +{ + X(rader_tl_delete)(omega, &omegas); +} + + +/***************************************************************************/ + +/* Below, we extensively use the identity that fft(x*)* = ifft(x) in + order to share data between forward and backward transforms and to + obviate the necessity of having separate forward and backward + plans. (Although we often compute separate plans these days anyway + due to the differing strides, etcetera.) + + Of course, since the new FFTW gives us separate pointers to + the real and imaginary parts, we could have instead used the + fft(r,i) = ifft(i,r) form of this identity, but it was easier to + reuse the code from our old version. */ + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT is, os; + INT k, gpower, g, r; + R *buf; + R r0 = ri[0], i0 = ii[0]; + + r = ego->n; is = ego->is; os = ego->os; g = ego->g; + buf = (R *) MALLOC(sizeof(R) * (r - 1) * 2, BUFFERS); + + /* First, permute the input, storing in buf: */ + for (gpower = 1, k = 0; k < r - 1; ++k, gpower = MULMOD(gpower, g, r)) { + R rA, iA; + rA = ri[gpower * is]; + iA = ii[gpower * is]; + buf[2*k] = rA; buf[2*k + 1] = iA; + } + /* gpower == g^(r-1) mod r == 1 */; + + + /* compute DFT of buf, storing in output (except DC): */ + { + plan_dft *cld = (plan_dft *) ego->cld1; + cld->apply(ego->cld1, buf, buf+1, ro+os, io+os); + } + + /* set output DC component: */ + { + ro[0] = r0 + ro[os]; + io[0] = i0 + io[os]; + } + + /* now, multiply by omega: */ + { + const R *omega = ego->omega; + for (k = 0; k < r - 1; ++k) { + E rB, iB, rW, iW; + rW = omega[2*k]; + iW = omega[2*k+1]; + rB = ro[(k+1)*os]; + iB = io[(k+1)*os]; + ro[(k+1)*os] = rW * rB - iW * iB; + io[(k+1)*os] = -(rW * iB + iW * rB); + } + } + + /* this will add input[0] to all of the outputs after the ifft */ + ro[os] += r0; + io[os] -= i0; + + /* inverse FFT: */ + { + plan_dft *cld = (plan_dft *) ego->cld2; + cld->apply(ego->cld2, ro+os, io+os, buf, buf+1); + } + + /* finally, do inverse permutation to unshuffle the output: */ + { + INT ginv = ego->ginv; + gpower = 1; + for (k = 0; k < r - 1; ++k, gpower = MULMOD(gpower, ginv, r)) { + ro[gpower * os] = buf[2*k]; + io[gpower * os] = -buf[2*k+1]; + } + A(gpower == 1); + } + + + X(ifree)(buf); +} + +/***************************************************************************/ + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); + X(plan_awake)(ego->cld_omega, wakefulness); + + switch (wakefulness) { + case SLEEPY: + free_omega(ego->omega); + ego->omega = 0; + break; + default: + ego->g = X(find_generator)(ego->n); + ego->ginv = X(power_mod)(ego->g, ego->n - 2, ego->n); + A(MULMOD(ego->g, ego->ginv, ego->n) == 1); + + ego->omega = mkomega(wakefulness, + ego->cld_omega, ego->n, ego->ginv); + break; + } +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld_omega); + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *)ego_; + p->print(p, "(dft-rader-%D%ois=%oos=%(%p%)", + ego->n, ego->is, ego->os, ego->cld1); + if (ego->cld2 != ego->cld1) + p->print(p, "%(%p%)", ego->cld2); + if (ego->cld_omega != ego->cld1 && ego->cld_omega != ego->cld2) + p->print(p, "%(%p%)", ego->cld_omega); + p->putchr(p, ')'); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + UNUSED(ego_); + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + && CIMPLIES(NO_SLOWP(plnr), p->sz->dims[0].n > RADER_MAX_SLOW) + && X(is_prime)(p->sz->dims[0].n) + + /* proclaim the solver SLOW if p-1 is not easily factorizable. + Bluestein should take care of this case. */ + && CIMPLIES(NO_SLOWP(plnr), X(factors_into_small_primes)(p->sz->dims[0].n - 1)) + ); +} + +static int mkP(P *pln, INT n, INT is, INT os, R *ro, R *io, + planner *plnr) +{ + plan *cld1 = (plan *) 0; + plan *cld2 = (plan *) 0; + plan *cld_omega = (plan *) 0; + R *buf = (R *) 0; + + /* initial allocation for the purpose of planning */ + buf = (R *) MALLOC(sizeof(R) * (n - 1) * 2, BUFFERS); + + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)(n - 1, 2, os), + X(mktensor_1d)(1, 0, 0), + buf, buf + 1, ro + os, io + os), + NO_SLOW, 0, 0); + if (!cld1) goto nada; + + cld2 = X(mkplan_f_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)(n - 1, os, 2), + X(mktensor_1d)(1, 0, 0), + ro + os, io + os, buf, buf + 1), + NO_SLOW, 0, 0); + + if (!cld2) goto nada; + + /* plan for omega array */ + cld_omega = X(mkplan_f_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)(n - 1, 2, 2), + X(mktensor_1d)(1, 0, 0), + buf, buf + 1, buf, buf + 1), + NO_SLOW, ESTIMATE, 0); + if (!cld_omega) goto nada; + + /* deallocate buffers; let awake() or apply() allocate them for real */ + X(ifree)(buf); + buf = 0; + + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->cld_omega = cld_omega; + pln->omega = 0; + pln->n = n; + pln->is = is; + pln->os = os; + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + pln->super.super.ops.other += (n - 1) * (4 * 2 + 6) + 6; + pln->super.super.ops.add += (n - 1) * 2 + 4; + pln->super.super.ops.mul += (n - 1) * 4; + + return 1; + + nada: + X(ifree0)(buf); + X(plan_destroy_internal)(cld_omega); + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return 0; +} + +static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) +{ + const problem_dft *p = (const problem_dft *) p_; + P *pln; + INT n; + INT is, os; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + n = p->sz->dims[0].n; + is = p->sz->dims[0].is; + os = p->sz->dims[0].os; + + pln = MKPLAN_DFT(P, &padt, apply); + if (!mkP(pln, n, is, os, p->ro, p->io, plnr)) { + X(ifree)(pln); + return (plan *) 0; + } + return &(pln->super.super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(dft_rader_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/rank-geq2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/rank-geq2.c new file mode 100644 index 000000000..a15e099ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/rank-geq2.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for DFT of rank >= 2 (multidimensional) */ + +#include "dft/dft.h" + +typedef struct { + solver super; + int spltrnk; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_dft super; + + plan *cld1, *cld2; + const S *solver; +} P; + +/* Compute multi-dimensional DFT by applying the two cld plans + (lower-rnk DFTs). */ +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + plan_dft *cld1, *cld2; + + cld1 = (plan_dft *) ego->cld1; + cld1->apply(ego->cld1, ri, ii, ro, io); + + cld2 = (plan_dft *) ego->cld2; + cld2->apply(ego->cld2, ro, io, ro, io); +} + + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + p->print(p, "(dft-rank>=2/%d%(%p%)%(%p%))", + s->spltrnk, ego->cld1, ego->cld2); +} + +static int picksplit(const S *ego, const tensor *sz, int *rp) +{ + A(sz->rnk > 1); /* cannot split rnk <= 1 */ + if (!X(pickdim)(ego->spltrnk, ego->buddies, ego->nbuddies, sz, 1, rp)) + return 0; + *rp += 1; /* convert from dim. index to rank */ + if (*rp >= sz->rnk) /* split must reduce rank */ + return 0; + return 1; +} + +static int applicable0(const solver *ego_, const problem *p_, int *rp) +{ + const problem_dft *p = (const problem_dft *) p_; + const S *ego = (const S *)ego_; + return (1 + && FINITE_RNK(p->sz->rnk) && FINITE_RNK(p->vecsz->rnk) + && p->sz->rnk >= 2 + && picksplit(ego, p->sz, rp) + ); +} + +/* TODO: revise this. */ +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *rp) +{ + const S *ego = (const S *)ego_; + const problem_dft *p = (const problem_dft *) p_; + + if (!applicable0(ego_, p_, rp)) return 0; + + if (NO_RANK_SPLITSP(plnr) && (ego->spltrnk != ego->buddies[0])) return 0; + + /* Heuristic: if the vector stride is greater than the transform + sz, don't use (prefer to do the vector loop first with a + vrank-geq1 plan). */ + if (NO_UGLYP(plnr)) + if (p->vecsz->rnk > 0 && + X(tensor_min_stride)(p->vecsz) > X(tensor_max_index)(p->sz)) + return 0; + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_dft *p; + P *pln; + plan *cld1 = 0, *cld2 = 0; + tensor *sz1, *sz2, *vecszi, *sz2i; + int spltrnk; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &spltrnk)) + return (plan *) 0; + + p = (const problem_dft *) p_; + X(tensor_split)(p->sz, &sz1, spltrnk, &sz2); + vecszi = X(tensor_copy_inplace)(p->vecsz, INPLACE_OS); + sz2i = X(tensor_copy_inplace)(sz2, INPLACE_OS); + + cld1 = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(tensor_copy)(sz2), + X(tensor_append)(p->vecsz, sz1), + p->ri, p->ii, p->ro, p->io)); + if (!cld1) goto nada; + + cld2 = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(tensor_copy_inplace)(sz1, INPLACE_OS), + X(tensor_append)(vecszi, sz2i), + p->ro, p->io, p->ro, p->io)); + if (!cld2) goto nada; + + pln = MKPLAN_DFT(P, &padt, apply); + + pln->cld1 = cld1; + pln->cld2 = cld2; + + pln->solver = ego; + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + + X(tensor_destroy4)(sz1, sz2, vecszi, sz2i); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + X(tensor_destroy4)(sz1, sz2, vecszi, sz2i); + return (plan *) 0; +} + +static solver *mksolver(int spltrnk, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->spltrnk = spltrnk; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(dft_rank_geq2_register)(planner *p) +{ + static const int buddies[] = { 1, 0, -2 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); + + /* FIXME: + + Should we try more buddies? + + Another possible variant is to swap cld1 and cld2 (or rather, + to swap their problems; they are not interchangeable because + cld2 must be in-place). In past versions of FFTW, however, I + seem to recall that such rearrangements have made little or no + difference. + */ +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/Makefile.am new file mode 100644 index 000000000..678a77b4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/Makefile.am @@ -0,0 +1,6 @@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS=codelets +noinst_LTLIBRARIES = libdft_scalar.la + +libdft_scalar_la_SOURCES = n.c t.c f.h n.h q.h t.h + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/Makefile.in new file mode 100644 index 000000000..a77a2551d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/Makefile.in @@ -0,0 +1,745 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/scalar +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_scalar_la_LIBADD = +am_libdft_scalar_la_OBJECTS = n.lo t.lo +libdft_scalar_la_OBJECTS = $(am_libdft_scalar_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_scalar_la_SOURCES) +DIST_SOURCES = $(libdft_scalar_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = codelets +noinst_LTLIBRARIES = libdft_scalar.la +libdft_scalar_la_SOURCES = n.c t.c f.h n.h q.h t.h +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/scalar/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/scalar/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_scalar.la: $(libdft_scalar_la_OBJECTS) $(libdft_scalar_la_DEPENDENCIES) $(EXTRA_libdft_scalar_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libdft_scalar_la_OBJECTS) $(libdft_scalar_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/Makefile.am new file mode 100644 index 000000000..5377cc54f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/Makefile.am @@ -0,0 +1,96 @@ +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = libdft_scalar_codelets.la + +########################################################################### +# n1_ is a hard-coded FFT of size (base cases of FFT recursion) +N1 = n1_2.c n1_3.c n1_4.c n1_5.c n1_6.c n1_7.c n1_8.c n1_9.c n1_10.c \ +n1_11.c n1_12.c n1_13.c n1_14.c n1_15.c n1_16.c n1_32.c n1_64.c \ +n1_20.c n1_25.c # n1_30.c n1_40.c n1_50.c + +########################################################################### +# t1_ is a "twiddle" FFT of size , implementing a radix-r DIT step +T1 = t1_2.c t1_3.c t1_4.c t1_5.c t1_6.c t1_7.c t1_8.c t1_9.c \ +t1_10.c t1_12.c t1_15.c t1_16.c t1_32.c t1_64.c \ +t1_20.c t1_25.c # t1_30.c t1_40.c t1_50.c + +# t2_ is also a twiddle FFT, but instead of using a complete lookup table +# of trig. functions, it partially generates the trig. values on the fly +# (this is faster for large sizes). +T2 = t2_4.c t2_8.c t2_16.c t2_32.c t2_64.c \ + t2_5.c t2_10.c t2_20.c t2_25.c + +########################################################################### +# The F (DIF) codelets are used for a kind of in-place transform algorithm, +# but the planner seems to never (or hardly ever) use them on the machines +# we have access to, preferring the Q codelets and the use of buffers +# for sub-transforms. So, we comment them out, at least for now. + +# f1_ is a "twiddle" FFT of size , implementing a radix-r DIF step +F1 = # f1_2.c f1_3.c f1_4.c f1_5.c f1_6.c f1_7.c f1_8.c f1_9.c f1_10.c f1_12.c f1_15.c f1_16.c f1_32.c f1_64.c + +# like f1, but partially generates its trig. table on the fly +F2 = # f2_4.c f2_8.c f2_16.c f2_32.c f2_64.c + +########################################################################### +# q1_ is twiddle FFTs of size (DIF step), where the output is +# transposed. This is used for in-place transposes in sizes that are +# divisible by ^2. These codelets have size ~ ^2, so you should +# probably not use bigger than 8 or so. +Q1 = q1_2.c q1_4.c q1_8.c q1_3.c q1_5.c q1_6.c + +########################################################################### +ALL_CODELETS = $(N1) $(T1) $(T2) $(F1) $(F2) $(Q1) +BUILT_SOURCES= $(ALL_CODELETS) $(CODLIST) + +libdft_scalar_codelets_la_SOURCES = $(BUILT_SOURCES) + +SOLVTAB_NAME = X(solvtab_dft_standard) +XRENAME=X + +# special rules for regenerating codelets. +include $(top_srcdir)/support/Makefile.codelets + +if MAINTAINER_MODE +FLAGS_N1=$(DFT_FLAGS_COMMON) +FLAGS_T1=$(DFT_FLAGS_COMMON) +FLAGS_T2=$(DFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +FLAGS_F1=$(DFT_FLAGS_COMMON) +FLAGS_F2=$(DFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +FLAGS_Q1=$(DFT_FLAGS_COMMON) -reload-twiddle +FLAGS_Q2=$(DFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles + +n1_%.c: $(CODELET_DEPS) $(GEN_NOTW) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW) $(FLAGS_N1) -n $* -name n1_$* -include "dft/scalar/n.h") | $(ADD_DATE) | $(INDENT) >$@ + +t1_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_T1) -n $* -name t1_$* -include "dft/scalar/t.h") | $(ADD_DATE) | $(INDENT) >$@ + +t2_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_T2) -n $* -name t2_$* -include "dft/scalar/t.h") | $(ADD_DATE) | $(INDENT) >$@ + +f1_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_F1) -dif -n $* -name f1_$* -include "dft/scalar/f.h") | $(ADD_DATE) | $(INDENT) >$@ + +f2_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_F2) -dif -n $* -name f2_$* -include "dft/scalar/f.h") | $(ADD_DATE) | $(INDENT) >$@ + +q1_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ) $(FLAGS_Q1) -dif -n $* -name q1_$* -include "dft/scalar/q.h") | $(ADD_DATE) | $(INDENT) >$@ + +q2_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ) $(FLAGS_Q2) -dif -n $* -name q2_$* -include "dft/scalar/q.h") | $(ADD_DATE) | $(INDENT) >$@ + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/Makefile.in new file mode 100644 index 000000000..a6074f31f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/Makefile.in @@ -0,0 +1,859 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/scalar/codelets +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_scalar_codelets_la_LIBADD = +am__objects_1 = n1_2.lo n1_3.lo n1_4.lo n1_5.lo n1_6.lo n1_7.lo \ + n1_8.lo n1_9.lo n1_10.lo n1_11.lo n1_12.lo n1_13.lo n1_14.lo \ + n1_15.lo n1_16.lo n1_32.lo n1_64.lo n1_20.lo n1_25.lo +am__objects_2 = t1_2.lo t1_3.lo t1_4.lo t1_5.lo t1_6.lo t1_7.lo \ + t1_8.lo t1_9.lo t1_10.lo t1_12.lo t1_15.lo t1_16.lo t1_32.lo \ + t1_64.lo t1_20.lo t1_25.lo +am__objects_3 = t2_4.lo t2_8.lo t2_16.lo t2_32.lo t2_64.lo t2_5.lo \ + t2_10.lo t2_20.lo t2_25.lo +am__objects_4 = +am__objects_5 = q1_2.lo q1_4.lo q1_8.lo q1_3.lo q1_5.lo q1_6.lo +am__objects_6 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_4) $(am__objects_5) +am__objects_7 = codlist.lo +am__objects_8 = $(am__objects_6) $(am__objects_7) +am_libdft_scalar_codelets_la_OBJECTS = $(am__objects_8) +libdft_scalar_codelets_la_OBJECTS = \ + $(am_libdft_scalar_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_scalar_codelets_la_SOURCES) +DIST_SOURCES = $(libdft_scalar_codelets_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/support/Makefile.codelets +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = libdft_scalar_codelets.la + +########################################################################### +# n1_ is a hard-coded FFT of size (base cases of FFT recursion) +N1 = n1_2.c n1_3.c n1_4.c n1_5.c n1_6.c n1_7.c n1_8.c n1_9.c n1_10.c \ +n1_11.c n1_12.c n1_13.c n1_14.c n1_15.c n1_16.c n1_32.c n1_64.c \ +n1_20.c n1_25.c # n1_30.c n1_40.c n1_50.c + + +########################################################################### +# t1_ is a "twiddle" FFT of size , implementing a radix-r DIT step +T1 = t1_2.c t1_3.c t1_4.c t1_5.c t1_6.c t1_7.c t1_8.c t1_9.c \ +t1_10.c t1_12.c t1_15.c t1_16.c t1_32.c t1_64.c \ +t1_20.c t1_25.c # t1_30.c t1_40.c t1_50.c + + +# t2_ is also a twiddle FFT, but instead of using a complete lookup table +# of trig. functions, it partially generates the trig. values on the fly +# (this is faster for large sizes). +T2 = t2_4.c t2_8.c t2_16.c t2_32.c t2_64.c \ + t2_5.c t2_10.c t2_20.c t2_25.c + + +########################################################################### +# The F (DIF) codelets are used for a kind of in-place transform algorithm, +# but the planner seems to never (or hardly ever) use them on the machines +# we have access to, preferring the Q codelets and the use of buffers +# for sub-transforms. So, we comment them out, at least for now. + +# f1_ is a "twiddle" FFT of size , implementing a radix-r DIF step +F1 = # f1_2.c f1_3.c f1_4.c f1_5.c f1_6.c f1_7.c f1_8.c f1_9.c f1_10.c f1_12.c f1_15.c f1_16.c f1_32.c f1_64.c + +# like f1, but partially generates its trig. table on the fly +F2 = # f2_4.c f2_8.c f2_16.c f2_32.c f2_64.c + +########################################################################### +# q1_ is twiddle FFTs of size (DIF step), where the output is +# transposed. This is used for in-place transposes in sizes that are +# divisible by ^2. These codelets have size ~ ^2, so you should +# probably not use bigger than 8 or so. +Q1 = q1_2.c q1_4.c q1_8.c q1_3.c q1_5.c q1_6.c + +########################################################################### +ALL_CODELETS = $(N1) $(T1) $(T2) $(F1) $(F2) $(Q1) +BUILT_SOURCES = $(ALL_CODELETS) $(CODLIST) +libdft_scalar_codelets_la_SOURCES = $(BUILT_SOURCES) +SOLVTAB_NAME = X(solvtab_dft_standard) +XRENAME = X +CODLIST = codlist.c +CODELET_NAME = codelet_ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +@MAINTAINER_MODE_TRUE@TWOVERS = sh ${top_srcdir}/support/twovers.sh +@MAINTAINER_MODE_TRUE@GENFFTDIR = ${top_builddir}/genfft +@MAINTAINER_MODE_TRUE@GEN_NOTW = ${GENFFTDIR}/gen_notw.native +@MAINTAINER_MODE_TRUE@GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +@MAINTAINER_MODE_TRUE@GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +@MAINTAINER_MODE_TRUE@GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +@MAINTAINER_MODE_TRUE@GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +@MAINTAINER_MODE_TRUE@GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +@MAINTAINER_MODE_TRUE@GEN_R2R = ${GENFFTDIR}/gen_r2r.native +@MAINTAINER_MODE_TRUE@PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +@MAINTAINER_MODE_TRUE@PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +@MAINTAINER_MODE_TRUE@ADD_DATE = sed -e s/@DATE@/"`date`"/ +@MAINTAINER_MODE_TRUE@COPYRIGHT = ${top_srcdir}/COPYRIGHT +@MAINTAINER_MODE_TRUE@CODELET_DEPS = $(COPYRIGHT) $(PRELUDE) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_DFT = cat $(COPYRIGHT) $(PRELUDE_DFT) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_RDFT = cat $(COPYRIGHT) $(PRELUDE_RDFT) +@MAINTAINER_MODE_TRUE@FLAGS_COMMON = -compact -variables 4 +@MAINTAINER_MODE_TRUE@DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +@MAINTAINER_MODE_TRUE@RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# special rules for regenerating codelets. +@MAINTAINER_MODE_TRUE@FLAGS_N1 = $(DFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_T1 = $(DFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_T2 = $(DFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_F1 = $(DFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_F2 = $(DFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_Q1 = $(DFT_FLAGS_COMMON) -reload-twiddle +@MAINTAINER_MODE_TRUE@FLAGS_Q2 = $(DFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/support/Makefile.codelets $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/scalar/codelets/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/scalar/codelets/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/support/Makefile.codelets $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_scalar_codelets.la: $(libdft_scalar_codelets_la_OBJECTS) $(libdft_scalar_codelets_la_DEPENDENCIES) $(EXTRA_libdft_scalar_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libdft_scalar_codelets_la_OBJECTS) $(libdft_scalar_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +# rule to build codlist +@MAINTAINER_MODE_TRUE@$(CODLIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "#include \"kernel/ifftw.h\""; \ +@MAINTAINER_MODE_TRUE@ echo $(INCLUDE_SIMD_HEADER); \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo "extern const solvtab $(SOLVTAB_NAME);"; \ +@MAINTAINER_MODE_TRUE@ echo "const solvtab $(SOLVTAB_NAME) = {"; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB_END"; \ +@MAINTAINER_MODE_TRUE@ echo "};"; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# cancel the hideous builtin rules that cause an infinite loop +@MAINTAINER_MODE_TRUE@%: %.o +@MAINTAINER_MODE_TRUE@%: %.s +@MAINTAINER_MODE_TRUE@%: %.c +@MAINTAINER_MODE_TRUE@%: %.S + +@MAINTAINER_MODE_TRUE@n1_%.c: $(CODELET_DEPS) $(GEN_NOTW) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW) $(FLAGS_N1) -n $* -name n1_$* -include "dft/scalar/n.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t1_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_T1) -n $* -name t1_$* -include "dft/scalar/t.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t2_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_T2) -n $* -name t2_$* -include "dft/scalar/t.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@f1_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_F1) -dif -n $* -name f1_$* -include "dft/scalar/f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@f2_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(FLAGS_F2) -dif -n $* -name f2_$* -include "dft/scalar/f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@q1_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ) $(FLAGS_Q1) -dif -n $* -name q1_$* -include "dft/scalar/q.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@q2_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ) $(FLAGS_Q2) -dif -n $* -name q2_$* -include "dft/scalar/q.h") | $(ADD_DATE) | $(INDENT) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/codlist.c new file mode 100644 index 000000000..fc5922347 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/codlist.c @@ -0,0 +1,109 @@ +#include "kernel/ifftw.h" + + +extern void X(codelet_n1_2)(planner *); +extern void X(codelet_n1_3)(planner *); +extern void X(codelet_n1_4)(planner *); +extern void X(codelet_n1_5)(planner *); +extern void X(codelet_n1_6)(planner *); +extern void X(codelet_n1_7)(planner *); +extern void X(codelet_n1_8)(planner *); +extern void X(codelet_n1_9)(planner *); +extern void X(codelet_n1_10)(planner *); +extern void X(codelet_n1_11)(planner *); +extern void X(codelet_n1_12)(planner *); +extern void X(codelet_n1_13)(planner *); +extern void X(codelet_n1_14)(planner *); +extern void X(codelet_n1_15)(planner *); +extern void X(codelet_n1_16)(planner *); +extern void X(codelet_n1_32)(planner *); +extern void X(codelet_n1_64)(planner *); +extern void X(codelet_n1_20)(planner *); +extern void X(codelet_n1_25)(planner *); +extern void X(codelet_t1_2)(planner *); +extern void X(codelet_t1_3)(planner *); +extern void X(codelet_t1_4)(planner *); +extern void X(codelet_t1_5)(planner *); +extern void X(codelet_t1_6)(planner *); +extern void X(codelet_t1_7)(planner *); +extern void X(codelet_t1_8)(planner *); +extern void X(codelet_t1_9)(planner *); +extern void X(codelet_t1_10)(planner *); +extern void X(codelet_t1_12)(planner *); +extern void X(codelet_t1_15)(planner *); +extern void X(codelet_t1_16)(planner *); +extern void X(codelet_t1_32)(planner *); +extern void X(codelet_t1_64)(planner *); +extern void X(codelet_t1_20)(planner *); +extern void X(codelet_t1_25)(planner *); +extern void X(codelet_t2_4)(planner *); +extern void X(codelet_t2_8)(planner *); +extern void X(codelet_t2_16)(planner *); +extern void X(codelet_t2_32)(planner *); +extern void X(codelet_t2_64)(planner *); +extern void X(codelet_t2_5)(planner *); +extern void X(codelet_t2_10)(planner *); +extern void X(codelet_t2_20)(planner *); +extern void X(codelet_t2_25)(planner *); +extern void X(codelet_q1_2)(planner *); +extern void X(codelet_q1_4)(planner *); +extern void X(codelet_q1_8)(planner *); +extern void X(codelet_q1_3)(planner *); +extern void X(codelet_q1_5)(planner *); +extern void X(codelet_q1_6)(planner *); + + +extern const solvtab X(solvtab_dft_standard); +const solvtab X(solvtab_dft_standard) = { + SOLVTAB(X(codelet_n1_2)), + SOLVTAB(X(codelet_n1_3)), + SOLVTAB(X(codelet_n1_4)), + SOLVTAB(X(codelet_n1_5)), + SOLVTAB(X(codelet_n1_6)), + SOLVTAB(X(codelet_n1_7)), + SOLVTAB(X(codelet_n1_8)), + SOLVTAB(X(codelet_n1_9)), + SOLVTAB(X(codelet_n1_10)), + SOLVTAB(X(codelet_n1_11)), + SOLVTAB(X(codelet_n1_12)), + SOLVTAB(X(codelet_n1_13)), + SOLVTAB(X(codelet_n1_14)), + SOLVTAB(X(codelet_n1_15)), + SOLVTAB(X(codelet_n1_16)), + SOLVTAB(X(codelet_n1_32)), + SOLVTAB(X(codelet_n1_64)), + SOLVTAB(X(codelet_n1_20)), + SOLVTAB(X(codelet_n1_25)), + SOLVTAB(X(codelet_t1_2)), + SOLVTAB(X(codelet_t1_3)), + SOLVTAB(X(codelet_t1_4)), + SOLVTAB(X(codelet_t1_5)), + SOLVTAB(X(codelet_t1_6)), + SOLVTAB(X(codelet_t1_7)), + SOLVTAB(X(codelet_t1_8)), + SOLVTAB(X(codelet_t1_9)), + SOLVTAB(X(codelet_t1_10)), + SOLVTAB(X(codelet_t1_12)), + SOLVTAB(X(codelet_t1_15)), + SOLVTAB(X(codelet_t1_16)), + SOLVTAB(X(codelet_t1_32)), + SOLVTAB(X(codelet_t1_64)), + SOLVTAB(X(codelet_t1_20)), + SOLVTAB(X(codelet_t1_25)), + SOLVTAB(X(codelet_t2_4)), + SOLVTAB(X(codelet_t2_8)), + SOLVTAB(X(codelet_t2_16)), + SOLVTAB(X(codelet_t2_32)), + SOLVTAB(X(codelet_t2_64)), + SOLVTAB(X(codelet_t2_5)), + SOLVTAB(X(codelet_t2_10)), + SOLVTAB(X(codelet_t2_20)), + SOLVTAB(X(codelet_t2_25)), + SOLVTAB(X(codelet_q1_2)), + SOLVTAB(X(codelet_q1_4)), + SOLVTAB(X(codelet_q1_8)), + SOLVTAB(X(codelet_q1_3)), + SOLVTAB(X(codelet_q1_5)), + SOLVTAB(X(codelet_q1_6)), + SOLVTAB_END +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_10.c new file mode 100644 index 000000000..953b13bc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_10.c @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -name n1_10 -include dft/scalar/n.h */ + +/* + * This function contains 84 FP additions, 36 FP multiplications, + * (or, 48 additions, 0 multiplications, 36 fused multiply/add), + * 41 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + E T3, Tj, TN, T1b, TU, TV, T1j, T1i, Tm, Tp, Tq, Ta, Th, Ti, TA; + E TH, T17, T14, T1c, T1d, T1e, TO, TP, TQ; + { + E T1, T2, TL, TM; + T1 = ri[0]; + T2 = ri[WS(is, 5)]; + T3 = T1 - T2; + Tj = T1 + T2; + TL = ii[0]; + TM = ii[WS(is, 5)]; + TN = TL - TM; + T1b = TL + TM; + } + { + E T6, Tk, Tg, To, T9, Tl, Td, Tn; + { + E T4, T5, Te, Tf; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 7)]; + T6 = T4 - T5; + Tk = T4 + T5; + Te = ri[WS(is, 6)]; + Tf = ri[WS(is, 1)]; + Tg = Te - Tf; + To = Te + Tf; + } + { + E T7, T8, Tb, Tc; + T7 = ri[WS(is, 8)]; + T8 = ri[WS(is, 3)]; + T9 = T7 - T8; + Tl = T7 + T8; + Tb = ri[WS(is, 4)]; + Tc = ri[WS(is, 9)]; + Td = Tb - Tc; + Tn = Tb + Tc; + } + TU = T6 - T9; + TV = Td - Tg; + T1j = Tk - Tl; + T1i = Tn - To; + Tm = Tk + Tl; + Tp = Tn + To; + Tq = Tm + Tp; + Ta = T6 + T9; + Th = Td + Tg; + Ti = Ta + Th; + } + { + E Tw, T15, TG, T13, Tz, T16, TD, T12; + { + E Tu, Tv, TE, TF; + Tu = ii[WS(is, 2)]; + Tv = ii[WS(is, 7)]; + Tw = Tu - Tv; + T15 = Tu + Tv; + TE = ii[WS(is, 6)]; + TF = ii[WS(is, 1)]; + TG = TE - TF; + T13 = TE + TF; + } + { + E Tx, Ty, TB, TC; + Tx = ii[WS(is, 8)]; + Ty = ii[WS(is, 3)]; + Tz = Tx - Ty; + T16 = Tx + Ty; + TB = ii[WS(is, 4)]; + TC = ii[WS(is, 9)]; + TD = TB - TC; + T12 = TB + TC; + } + TA = Tw - Tz; + TH = TD - TG; + T17 = T15 - T16; + T14 = T12 - T13; + T1c = T15 + T16; + T1d = T12 + T13; + T1e = T1c + T1d; + TO = Tw + Tz; + TP = TD + TG; + TQ = TO + TP; + } + ro[WS(os, 5)] = T3 + Ti; + io[WS(os, 5)] = TN + TQ; + ro[0] = Tj + Tq; + io[0] = T1b + T1e; + { + E TI, TK, Tt, TJ, Tr, Ts; + TI = FMA(KP618033988, TH, TA); + TK = FNMS(KP618033988, TA, TH); + Tr = FNMS(KP250000000, Ti, T3); + Ts = Ta - Th; + Tt = FMA(KP559016994, Ts, Tr); + TJ = FNMS(KP559016994, Ts, Tr); + ro[WS(os, 9)] = FNMS(KP951056516, TI, Tt); + ro[WS(os, 3)] = FMA(KP951056516, TK, TJ); + ro[WS(os, 1)] = FMA(KP951056516, TI, Tt); + ro[WS(os, 7)] = FNMS(KP951056516, TK, TJ); + } + { + E TW, TY, TT, TX, TR, TS; + TW = FMA(KP618033988, TV, TU); + TY = FNMS(KP618033988, TU, TV); + TR = FNMS(KP250000000, TQ, TN); + TS = TO - TP; + TT = FMA(KP559016994, TS, TR); + TX = FNMS(KP559016994, TS, TR); + io[WS(os, 1)] = FNMS(KP951056516, TW, TT); + io[WS(os, 7)] = FMA(KP951056516, TY, TX); + io[WS(os, 9)] = FMA(KP951056516, TW, TT); + io[WS(os, 3)] = FNMS(KP951056516, TY, TX); + } + { + E T18, T1a, T11, T19, TZ, T10; + T18 = FNMS(KP618033988, T17, T14); + T1a = FMA(KP618033988, T14, T17); + TZ = FNMS(KP250000000, Tq, Tj); + T10 = Tm - Tp; + T11 = FNMS(KP559016994, T10, TZ); + T19 = FMA(KP559016994, T10, TZ); + ro[WS(os, 2)] = FNMS(KP951056516, T18, T11); + ro[WS(os, 6)] = FMA(KP951056516, T1a, T19); + ro[WS(os, 8)] = FMA(KP951056516, T18, T11); + ro[WS(os, 4)] = FNMS(KP951056516, T1a, T19); + } + { + E T1k, T1m, T1h, T1l, T1f, T1g; + T1k = FNMS(KP618033988, T1j, T1i); + T1m = FMA(KP618033988, T1i, T1j); + T1f = FNMS(KP250000000, T1e, T1b); + T1g = T1c - T1d; + T1h = FNMS(KP559016994, T1g, T1f); + T1l = FMA(KP559016994, T1g, T1f); + io[WS(os, 2)] = FMA(KP951056516, T1k, T1h); + io[WS(os, 6)] = FNMS(KP951056516, T1m, T1l); + io[WS(os, 8)] = FNMS(KP951056516, T1k, T1h); + io[WS(os, 4)] = FMA(KP951056516, T1m, T1l); + } + } + } +} + +static const kdft_desc desc = { 10, "n1_10", {48, 0, 36, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_10) (planner *p) { + X(kdft_register) (p, n1_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 10 -name n1_10 -include dft/scalar/n.h */ + +/* + * This function contains 84 FP additions, 24 FP multiplications, + * (or, 72 additions, 12 multiplications, 12 fused multiply/add), + * 41 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + E T3, Tj, TQ, T1e, TU, TV, T1c, T1b, Tm, Tp, Tq, Ta, Th, Ti, TA; + E TH, T17, T14, T1f, T1g, T1h, TL, TM, TR; + { + E T1, T2, TO, TP; + T1 = ri[0]; + T2 = ri[WS(is, 5)]; + T3 = T1 - T2; + Tj = T1 + T2; + TO = ii[0]; + TP = ii[WS(is, 5)]; + TQ = TO - TP; + T1e = TO + TP; + } + { + E T6, Tk, Tg, To, T9, Tl, Td, Tn; + { + E T4, T5, Te, Tf; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 7)]; + T6 = T4 - T5; + Tk = T4 + T5; + Te = ri[WS(is, 6)]; + Tf = ri[WS(is, 1)]; + Tg = Te - Tf; + To = Te + Tf; + } + { + E T7, T8, Tb, Tc; + T7 = ri[WS(is, 8)]; + T8 = ri[WS(is, 3)]; + T9 = T7 - T8; + Tl = T7 + T8; + Tb = ri[WS(is, 4)]; + Tc = ri[WS(is, 9)]; + Td = Tb - Tc; + Tn = Tb + Tc; + } + TU = T6 - T9; + TV = Td - Tg; + T1c = Tk - Tl; + T1b = Tn - To; + Tm = Tk + Tl; + Tp = Tn + To; + Tq = Tm + Tp; + Ta = T6 + T9; + Th = Td + Tg; + Ti = Ta + Th; + } + { + E Tw, T15, TG, T13, Tz, T16, TD, T12; + { + E Tu, Tv, TE, TF; + Tu = ii[WS(is, 2)]; + Tv = ii[WS(is, 7)]; + Tw = Tu - Tv; + T15 = Tu + Tv; + TE = ii[WS(is, 6)]; + TF = ii[WS(is, 1)]; + TG = TE - TF; + T13 = TE + TF; + } + { + E Tx, Ty, TB, TC; + Tx = ii[WS(is, 8)]; + Ty = ii[WS(is, 3)]; + Tz = Tx - Ty; + T16 = Tx + Ty; + TB = ii[WS(is, 4)]; + TC = ii[WS(is, 9)]; + TD = TB - TC; + T12 = TB + TC; + } + TA = Tw - Tz; + TH = TD - TG; + T17 = T15 - T16; + T14 = T12 - T13; + T1f = T15 + T16; + T1g = T12 + T13; + T1h = T1f + T1g; + TL = Tw + Tz; + TM = TD + TG; + TR = TL + TM; + } + ro[WS(os, 5)] = T3 + Ti; + io[WS(os, 5)] = TQ + TR; + ro[0] = Tj + Tq; + io[0] = T1e + T1h; + { + E TI, TK, Tt, TJ, Tr, Ts; + TI = FMA(KP951056516, TA, KP587785252 * TH); + TK = FNMS(KP587785252, TA, KP951056516 * TH); + Tr = KP559016994 * (Ta - Th); + Ts = FNMS(KP250000000, Ti, T3); + Tt = Tr + Ts; + TJ = Ts - Tr; + ro[WS(os, 9)] = Tt - TI; + ro[WS(os, 3)] = TJ + TK; + ro[WS(os, 1)] = Tt + TI; + ro[WS(os, 7)] = TJ - TK; + } + { + E TW, TY, TT, TX, TN, TS; + TW = FMA(KP951056516, TU, KP587785252 * TV); + TY = FNMS(KP587785252, TU, KP951056516 * TV); + TN = KP559016994 * (TL - TM); + TS = FNMS(KP250000000, TR, TQ); + TT = TN + TS; + TX = TS - TN; + io[WS(os, 1)] = TT - TW; + io[WS(os, 7)] = TY + TX; + io[WS(os, 9)] = TW + TT; + io[WS(os, 3)] = TX - TY; + } + { + E T18, T1a, T11, T19, TZ, T10; + T18 = FNMS(KP587785252, T17, KP951056516 * T14); + T1a = FMA(KP951056516, T17, KP587785252 * T14); + TZ = FNMS(KP250000000, Tq, Tj); + T10 = KP559016994 * (Tm - Tp); + T11 = TZ - T10; + T19 = T10 + TZ; + ro[WS(os, 2)] = T11 - T18; + ro[WS(os, 6)] = T19 + T1a; + ro[WS(os, 8)] = T11 + T18; + ro[WS(os, 4)] = T19 - T1a; + } + { + E T1d, T1l, T1k, T1m, T1i, T1j; + T1d = FNMS(KP587785252, T1c, KP951056516 * T1b); + T1l = FMA(KP951056516, T1c, KP587785252 * T1b); + T1i = FNMS(KP250000000, T1h, T1e); + T1j = KP559016994 * (T1f - T1g); + T1k = T1i - T1j; + T1m = T1j + T1i; + io[WS(os, 2)] = T1d + T1k; + io[WS(os, 6)] = T1m - T1l; + io[WS(os, 8)] = T1k - T1d; + io[WS(os, 4)] = T1l + T1m; + } + } + } +} + +static const kdft_desc desc = { 10, "n1_10", {72, 12, 12, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_10) (planner *p) { + X(kdft_register) (p, n1_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_11.c new file mode 100644 index 000000000..3ef9efb38 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_11.c @@ -0,0 +1,428 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 11 -name n1_11 -include dft/scalar/n.h */ + +/* + * This function contains 140 FP additions, 110 FP multiplications, + * (or, 30 additions, 0 multiplications, 110 fused multiply/add), + * 62 stack variables, 10 constants, and 44 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_11(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP989821441, +0.989821441880932732376092037776718787376519372); + DK(KP959492973, +0.959492973614497389890368057066327699062454848); + DK(KP918985947, +0.918985947228994779780736114132655398124909697); + DK(KP830830026, +0.830830026003772851058548298459246407048009821); + DK(KP876768831, +0.876768831002589333891339807079336796764054852); + DK(KP778434453, +0.778434453334651800608337670740821884709317477); + DK(KP715370323, +0.715370323453429719112414662767260662417897278); + DK(KP521108558, +0.521108558113202722944698153526659300680427422); + DK(KP634356270, +0.634356270682424498893150776899916060542806975); + DK(KP342584725, +0.342584725681637509502641509861112333758894680); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(44, is), MAKE_VOLATILE_STRIDE(44, os)) { + E T1, T1f, T4, T1u, Tg, T1q, T7, T1t, Ta, T1s, Td, T1r, Ti, TP, T26; + E TG, T1X, T1O, T1w, TY, T1F, T17, To, T1i, TA, T1k, Tr, T1h, Tu, T1j; + E Tx, T1g, TC, TU, T21, TL, T1S, T1J, T1m, T13, T1A, T1c; + T1 = ri[0]; + T1f = ii[0]; + { + E T5, T6, Tp, Tq; + { + E T2, T3, Te, Tf; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 10)]; + T4 = T2 + T3; + T1u = T3 - T2; + Te = ri[WS(is, 5)]; + Tf = ri[WS(is, 6)]; + Tg = Te + Tf; + T1q = Tf - Te; + } + T5 = ri[WS(is, 2)]; + T6 = ri[WS(is, 9)]; + T7 = T5 + T6; + T1t = T6 - T5; + { + E T8, T9, Tb, Tc; + T8 = ri[WS(is, 3)]; + T9 = ri[WS(is, 8)]; + Ta = T8 + T9; + T1s = T9 - T8; + Tb = ri[WS(is, 4)]; + Tc = ri[WS(is, 7)]; + Td = Tb + Tc; + T1r = Tc - Tb; + } + { + E Th, TO, T25, TF, T1W; + Th = FNMS(KP342584725, Ta, T7); + Ti = FNMS(KP634356270, Th, Td); + TO = FNMS(KP342584725, T4, Ta); + TP = FNMS(KP634356270, TO, Tg); + T25 = FMA(KP521108558, T1q, T1u); + T26 = FMA(KP715370323, T25, T1r); + TF = FNMS(KP342584725, Td, T4); + TG = FNMS(KP634356270, TF, T7); + T1W = FMA(KP521108558, T1s, T1q); + T1X = FNMS(KP715370323, T1W, T1t); + } + { + E T1N, T1v, TX, T1E, T16; + T1N = FNMS(KP521108558, T1t, T1r); + T1O = FMA(KP715370323, T1N, T1q); + T1v = FNMS(KP521108558, T1u, T1t); + T1w = FNMS(KP715370323, T1v, T1s); + TX = FNMS(KP342584725, T7, Tg); + TY = FNMS(KP634356270, TX, T4); + T1E = FMA(KP521108558, T1r, T1s); + T1F = FMA(KP715370323, T1E, T1u); + T16 = FNMS(KP342584725, Tg, Td); + T17 = FNMS(KP634356270, T16, Ta); + } + { + E Tm, Tn, Ty, Tz; + Tm = ii[WS(is, 3)]; + Tn = ii[WS(is, 8)]; + To = Tm - Tn; + T1i = Tm + Tn; + Ty = ii[WS(is, 5)]; + Tz = ii[WS(is, 6)]; + TA = Ty - Tz; + T1k = Ty + Tz; + } + Tp = ii[WS(is, 2)]; + Tq = ii[WS(is, 9)]; + Tr = Tp - Tq; + T1h = Tp + Tq; + { + E Ts, Tt, Tv, Tw; + Ts = ii[WS(is, 4)]; + Tt = ii[WS(is, 7)]; + Tu = Ts - Tt; + T1j = Ts + Tt; + Tv = ii[WS(is, 1)]; + Tw = ii[WS(is, 10)]; + Tx = Tv - Tw; + T1g = Tv + Tw; + } + { + E TB, TT, T20, TK, T1R; + TB = FMA(KP521108558, TA, Tx); + TC = FMA(KP715370323, TB, Tu); + TT = FNMS(KP521108558, Tr, Tu); + TU = FMA(KP715370323, TT, TA); + T20 = FNMS(KP342584725, T1i, T1h); + T21 = FNMS(KP634356270, T20, T1j); + TK = FMA(KP521108558, To, TA); + TL = FNMS(KP715370323, TK, Tr); + T1R = FNMS(KP342584725, T1j, T1g); + T1S = FNMS(KP634356270, T1R, T1h); + } + { + E T1I, T1l, T12, T1z, T1b; + T1I = FNMS(KP342584725, T1g, T1i); + T1J = FNMS(KP634356270, T1I, T1k); + T1l = FNMS(KP342584725, T1k, T1j); + T1m = FNMS(KP634356270, T1l, T1i); + T12 = FMA(KP521108558, Tu, To); + T13 = FMA(KP715370323, T12, Tx); + T1z = FNMS(KP342584725, T1h, T1k); + T1A = FNMS(KP634356270, T1z, T1g); + T1b = FNMS(KP521108558, Tx, Tr); + T1c = FNMS(KP715370323, T1b, To); + } + } + ro[0] = T1 + T4 + T7 + Ta + Td + Tg; + io[0] = T1f + T1g + T1h + T1i + T1j + T1k; + { + E Tk, TE, Tj, TD, Tl; + Tj = FNMS(KP778434453, Ti, T4); + Tk = FNMS(KP876768831, Tj, Tg); + TD = FMA(KP830830026, TC, Tr); + TE = FMA(KP918985947, TD, To); + Tl = FNMS(KP959492973, Tk, T1); + ro[WS(os, 10)] = FNMS(KP989821441, TE, Tl); + ro[WS(os, 1)] = FMA(KP989821441, TE, Tl); + } + { + E T23, T28, T22, T27, T24; + T22 = FNMS(KP778434453, T21, T1g); + T23 = FNMS(KP876768831, T22, T1k); + T27 = FMA(KP830830026, T26, T1t); + T28 = FMA(KP918985947, T27, T1s); + T24 = FNMS(KP959492973, T23, T1f); + io[WS(os, 1)] = FMA(KP989821441, T28, T24); + io[WS(os, 10)] = FNMS(KP989821441, T28, T24); + } + { + E T1U, T1Z, T1T, T1Y, T1V; + T1T = FNMS(KP778434453, T1S, T1k); + T1U = FNMS(KP876768831, T1T, T1i); + T1Y = FMA(KP830830026, T1X, T1u); + T1Z = FNMS(KP918985947, T1Y, T1r); + T1V = FNMS(KP959492973, T1U, T1f); + io[WS(os, 2)] = FNMS(KP989821441, T1Z, T1V); + io[WS(os, 9)] = FMA(KP989821441, T1Z, T1V); + } + { + E TI, TN, TH, TM, TJ; + TH = FNMS(KP778434453, TG, Tg); + TI = FNMS(KP876768831, TH, Ta); + TM = FMA(KP830830026, TL, Tx); + TN = FNMS(KP918985947, TM, Tu); + TJ = FNMS(KP959492973, TI, T1); + ro[WS(os, 2)] = FNMS(KP989821441, TN, TJ); + ro[WS(os, 9)] = FMA(KP989821441, TN, TJ); + } + { + E TR, TW, TQ, TV, TS; + TQ = FNMS(KP778434453, TP, Td); + TR = FNMS(KP876768831, TQ, T7); + TV = FNMS(KP830830026, TU, To); + TW = FNMS(KP918985947, TV, Tx); + TS = FNMS(KP959492973, TR, T1); + ro[WS(os, 8)] = FNMS(KP989821441, TW, TS); + ro[WS(os, 3)] = FMA(KP989821441, TW, TS); + } + { + E T1L, T1Q, T1K, T1P, T1M; + T1K = FNMS(KP778434453, T1J, T1j); + T1L = FNMS(KP876768831, T1K, T1h); + T1P = FNMS(KP830830026, T1O, T1s); + T1Q = FNMS(KP918985947, T1P, T1u); + T1M = FNMS(KP959492973, T1L, T1f); + io[WS(os, 3)] = FMA(KP989821441, T1Q, T1M); + io[WS(os, 8)] = FNMS(KP989821441, T1Q, T1M); + } + { + E T10, T15, TZ, T14, T11; + TZ = FNMS(KP778434453, TY, Ta); + T10 = FNMS(KP876768831, TZ, Td); + T14 = FNMS(KP830830026, T13, TA); + T15 = FMA(KP918985947, T14, Tr); + T11 = FNMS(KP959492973, T10, T1); + ro[WS(os, 4)] = FNMS(KP989821441, T15, T11); + ro[WS(os, 7)] = FMA(KP989821441, T15, T11); + } + { + E T1C, T1H, T1B, T1G, T1D; + T1B = FNMS(KP778434453, T1A, T1i); + T1C = FNMS(KP876768831, T1B, T1j); + T1G = FNMS(KP830830026, T1F, T1q); + T1H = FMA(KP918985947, T1G, T1t); + T1D = FNMS(KP959492973, T1C, T1f); + io[WS(os, 4)] = FNMS(KP989821441, T1H, T1D); + io[WS(os, 7)] = FMA(KP989821441, T1H, T1D); + } + { + E T1o, T1y, T1n, T1x, T1p; + T1n = FNMS(KP778434453, T1m, T1h); + T1o = FNMS(KP876768831, T1n, T1g); + T1x = FNMS(KP830830026, T1w, T1r); + T1y = FNMS(KP918985947, T1x, T1q); + T1p = FNMS(KP959492973, T1o, T1f); + io[WS(os, 5)] = FMA(KP989821441, T1y, T1p); + io[WS(os, 6)] = FNMS(KP989821441, T1y, T1p); + } + { + E T19, T1e, T18, T1d, T1a; + T18 = FNMS(KP778434453, T17, T7); + T19 = FNMS(KP876768831, T18, T4); + T1d = FNMS(KP830830026, T1c, Tu); + T1e = FNMS(KP918985947, T1d, TA); + T1a = FNMS(KP959492973, T19, T1); + ro[WS(os, 6)] = FNMS(KP989821441, T1e, T1a); + ro[WS(os, 5)] = FMA(KP989821441, T1e, T1a); + } + } + } +} + +static const kdft_desc desc = { 11, "n1_11", {30, 0, 110, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_11) (planner *p) { + X(kdft_register) (p, n1_11, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 11 -name n1_11 -include dft/scalar/n.h */ + +/* + * This function contains 140 FP additions, 100 FP multiplications, + * (or, 60 additions, 20 multiplications, 80 fused multiply/add), + * 41 stack variables, 10 constants, and 44 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_11(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP654860733, +0.654860733945285064056925072466293553183791199); + DK(KP142314838, +0.142314838273285140443792668616369668791051361); + DK(KP959492973, +0.959492973614497389890368057066327699062454848); + DK(KP415415013, +0.415415013001886425529274149229623203524004910); + DK(KP841253532, +0.841253532831181168861811648919367717513292498); + DK(KP989821441, +0.989821441880932732376092037776718787376519372); + DK(KP909631995, +0.909631995354518371411715383079028460060241051); + DK(KP281732556, +0.281732556841429697711417915346616899035777899); + DK(KP540640817, +0.540640817455597582107635954318691695431770608); + DK(KP755749574, +0.755749574354258283774035843972344420179717445); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(44, is), MAKE_VOLATILE_STRIDE(44, os)) { + E T1, TM, T4, TG, Tk, TR, Tw, TN, T7, TK, Ta, TH, Tn, TQ, Td; + E TJ, Tq, TO, Tt, TP, Tg, TI; + { + E T2, T3, Ti, Tj; + T1 = ri[0]; + TM = ii[0]; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 10)]; + T4 = T2 + T3; + TG = T3 - T2; + Ti = ii[WS(is, 1)]; + Tj = ii[WS(is, 10)]; + Tk = Ti - Tj; + TR = Ti + Tj; + { + E Tu, Tv, T5, T6; + Tu = ii[WS(is, 2)]; + Tv = ii[WS(is, 9)]; + Tw = Tu - Tv; + TN = Tu + Tv; + T5 = ri[WS(is, 2)]; + T6 = ri[WS(is, 9)]; + T7 = T5 + T6; + TK = T6 - T5; + } + } + { + E T8, T9, To, Tp; + T8 = ri[WS(is, 3)]; + T9 = ri[WS(is, 8)]; + Ta = T8 + T9; + TH = T9 - T8; + { + E Tl, Tm, Tb, Tc; + Tl = ii[WS(is, 3)]; + Tm = ii[WS(is, 8)]; + Tn = Tl - Tm; + TQ = Tl + Tm; + Tb = ri[WS(is, 4)]; + Tc = ri[WS(is, 7)]; + Td = Tb + Tc; + TJ = Tc - Tb; + } + To = ii[WS(is, 4)]; + Tp = ii[WS(is, 7)]; + Tq = To - Tp; + TO = To + Tp; + { + E Tr, Ts, Te, Tf; + Tr = ii[WS(is, 5)]; + Ts = ii[WS(is, 6)]; + Tt = Tr - Ts; + TP = Tr + Ts; + Te = ri[WS(is, 5)]; + Tf = ri[WS(is, 6)]; + Tg = Te + Tf; + TI = Tf - Te; + } + } + { + E Tx, Th, TZ, T10; + ro[0] = T1 + T4 + T7 + Ta + Td + Tg; + io[0] = TM + TR + TN + TQ + TO + TP; + Tx = FMA(KP755749574, Tk, KP540640817 * Tn) + FNMS(KP909631995, Tt, KP281732556 * Tq) - (KP989821441 * Tw); + Th = FMA(KP841253532, Ta, T1) + FNMS(KP959492973, Td, KP415415013 * Tg) + FNMA(KP142314838, T7, KP654860733 * T4); + ro[WS(os, 7)] = Th - Tx; + ro[WS(os, 4)] = Th + Tx; + TZ = FMA(KP755749574, TG, KP540640817 * TH) + FNMS(KP909631995, TI, KP281732556 * TJ) - (KP989821441 * TK); + T10 = FMA(KP841253532, TQ, TM) + FNMS(KP959492973, TO, KP415415013 * TP) + FNMA(KP142314838, TN, KP654860733 * TR); + io[WS(os, 4)] = TZ + T10; + io[WS(os, 7)] = T10 - TZ; + { + E TX, TY, Tz, Ty; + TX = FMA(KP909631995, TG, KP755749574 * TK) + FNMA(KP540640817, TI, KP989821441 * TJ) - (KP281732556 * TH); + TY = FMA(KP415415013, TR, TM) + FNMS(KP142314838, TO, KP841253532 * TP) + FNMA(KP959492973, TQ, KP654860733 * TN); + io[WS(os, 2)] = TX + TY; + io[WS(os, 9)] = TY - TX; + Tz = FMA(KP909631995, Tk, KP755749574 * Tw) + FNMA(KP540640817, Tt, KP989821441 * Tq) - (KP281732556 * Tn); + Ty = FMA(KP415415013, T4, T1) + FNMS(KP142314838, Td, KP841253532 * Tg) + FNMA(KP959492973, Ta, KP654860733 * T7); + ro[WS(os, 9)] = Ty - Tz; + ro[WS(os, 2)] = Ty + Tz; + } + } + { + E TB, TA, TT, TU; + TB = FMA(KP540640817, Tk, KP909631995 * Tw) + FMA(KP989821441, Tn, KP755749574 * Tq) + (KP281732556 * Tt); + TA = FMA(KP841253532, T4, T1) + FNMS(KP959492973, Tg, KP415415013 * T7) + FNMA(KP654860733, Td, KP142314838 * Ta); + ro[WS(os, 10)] = TA - TB; + ro[WS(os, 1)] = TA + TB; + { + E TV, TW, TD, TC; + TV = FMA(KP540640817, TG, KP909631995 * TK) + FMA(KP989821441, TH, KP755749574 * TJ) + (KP281732556 * TI); + TW = FMA(KP841253532, TR, TM) + FNMS(KP959492973, TP, KP415415013 * TN) + FNMA(KP654860733, TO, KP142314838 * TQ); + io[WS(os, 1)] = TV + TW; + io[WS(os, 10)] = TW - TV; + TD = FMA(KP989821441, Tk, KP540640817 * Tq) + FNMS(KP909631995, Tn, KP755749574 * Tt) - (KP281732556 * Tw); + TC = FMA(KP415415013, Ta, T1) + FNMS(KP654860733, Tg, KP841253532 * Td) + FNMA(KP959492973, T7, KP142314838 * T4); + ro[WS(os, 8)] = TC - TD; + ro[WS(os, 3)] = TC + TD; + } + TT = FMA(KP989821441, TG, KP540640817 * TJ) + FNMS(KP909631995, TH, KP755749574 * TI) - (KP281732556 * TK); + TU = FMA(KP415415013, TQ, TM) + FNMS(KP654860733, TP, KP841253532 * TO) + FNMA(KP959492973, TN, KP142314838 * TR); + io[WS(os, 3)] = TT + TU; + io[WS(os, 8)] = TU - TT; + { + E TL, TS, TF, TE; + TL = FMA(KP281732556, TG, KP755749574 * TH) + FNMS(KP909631995, TJ, KP989821441 * TI) - (KP540640817 * TK); + TS = FMA(KP841253532, TN, TM) + FNMS(KP142314838, TP, KP415415013 * TO) + FNMA(KP654860733, TQ, KP959492973 * TR); + io[WS(os, 5)] = TL + TS; + io[WS(os, 6)] = TS - TL; + TF = FMA(KP281732556, Tk, KP755749574 * Tn) + FNMS(KP909631995, Tq, KP989821441 * Tt) - (KP540640817 * Tw); + TE = FMA(KP841253532, T7, T1) + FNMS(KP142314838, Tg, KP415415013 * Td) + FNMA(KP654860733, Ta, KP959492973 * T4); + ro[WS(os, 6)] = TE - TF; + ro[WS(os, 5)] = TE + TF; + } + } + } + } +} + +static const kdft_desc desc = { 11, "n1_11", {60, 20, 80, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_11) (planner *p) { + X(kdft_register) (p, n1_11, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_12.c new file mode 100644 index 000000000..5f9f3b79f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_12.c @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -name n1_12 -include dft/scalar/n.h */ + +/* + * This function contains 96 FP additions, 24 FP multiplications, + * (or, 72 additions, 0 multiplications, 24 fused multiply/add), + * 43 stack variables, 2 constants, and 48 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(48, is), MAKE_VOLATILE_STRIDE(48, os)) { + E T5, TR, TA, Ts, TS, Tz, Ta, TU, TD, Tx, TV, TC, Tg, T1d, TG; + E TJ, T1u, T1c, Tl, T1i, TL, TO, T1v, T1h; + { + E T1, T2, T3, T4; + T1 = ri[0]; + T2 = ri[WS(is, 4)]; + T3 = ri[WS(is, 8)]; + T4 = T2 + T3; + T5 = T1 + T4; + TR = FNMS(KP500000000, T4, T1); + TA = T3 - T2; + } + { + E To, Tp, Tq, Tr; + To = ii[0]; + Tp = ii[WS(is, 4)]; + Tq = ii[WS(is, 8)]; + Tr = Tp + Tq; + Ts = To + Tr; + TS = Tp - Tq; + Tz = FNMS(KP500000000, Tr, To); + } + { + E T6, T7, T8, T9; + T6 = ri[WS(is, 6)]; + T7 = ri[WS(is, 10)]; + T8 = ri[WS(is, 2)]; + T9 = T7 + T8; + Ta = T6 + T9; + TU = FNMS(KP500000000, T9, T6); + TD = T8 - T7; + } + { + E Tt, Tu, Tv, Tw; + Tt = ii[WS(is, 6)]; + Tu = ii[WS(is, 10)]; + Tv = ii[WS(is, 2)]; + Tw = Tu + Tv; + Tx = Tt + Tw; + TV = Tu - Tv; + TC = FNMS(KP500000000, Tw, Tt); + } + { + E Tc, Td, Te, Tf; + Tc = ri[WS(is, 3)]; + Td = ri[WS(is, 7)]; + Te = ri[WS(is, 11)]; + Tf = Td + Te; + Tg = Tc + Tf; + T1d = Te - Td; + TG = FNMS(KP500000000, Tf, Tc); + } + { + E T1a, TH, TI, T1b; + T1a = ii[WS(is, 3)]; + TH = ii[WS(is, 7)]; + TI = ii[WS(is, 11)]; + T1b = TH + TI; + TJ = TH - TI; + T1u = T1a + T1b; + T1c = FNMS(KP500000000, T1b, T1a); + } + { + E Th, Ti, Tj, Tk; + Th = ri[WS(is, 9)]; + Ti = ri[WS(is, 1)]; + Tj = ri[WS(is, 5)]; + Tk = Ti + Tj; + Tl = Th + Tk; + T1i = Tj - Ti; + TL = FNMS(KP500000000, Tk, Th); + } + { + E T1f, TM, TN, T1g; + T1f = ii[WS(is, 9)]; + TM = ii[WS(is, 1)]; + TN = ii[WS(is, 5)]; + T1g = TM + TN; + TO = TM - TN; + T1v = T1f + T1g; + T1h = FNMS(KP500000000, T1g, T1f); + } + { + E Tb, Tm, T1t, T1w; + Tb = T5 + Ta; + Tm = Tg + Tl; + ro[WS(os, 6)] = Tb - Tm; + ro[0] = Tb + Tm; + { + E T1x, T1y, Tn, Ty; + T1x = Ts + Tx; + T1y = T1u + T1v; + io[WS(os, 6)] = T1x - T1y; + io[0] = T1x + T1y; + Tn = Tg - Tl; + Ty = Ts - Tx; + io[WS(os, 3)] = Tn + Ty; + io[WS(os, 9)] = Ty - Tn; + } + T1t = T5 - Ta; + T1w = T1u - T1v; + ro[WS(os, 3)] = T1t - T1w; + ro[WS(os, 9)] = T1t + T1w; + { + E T11, T1l, T1k, T1m, T14, T18, T17, T19; + { + E TZ, T10, T1e, T1j; + TZ = FMA(KP866025403, TA, Tz); + T10 = FMA(KP866025403, TD, TC); + T11 = TZ - T10; + T1l = TZ + T10; + T1e = FMA(KP866025403, T1d, T1c); + T1j = FMA(KP866025403, T1i, T1h); + T1k = T1e - T1j; + T1m = T1e + T1j; + } + { + E T12, T13, T15, T16; + T12 = FMA(KP866025403, TJ, TG); + T13 = FMA(KP866025403, TO, TL); + T14 = T12 - T13; + T18 = T12 + T13; + T15 = FMA(KP866025403, TS, TR); + T16 = FMA(KP866025403, TV, TU); + T17 = T15 + T16; + T19 = T15 - T16; + } + io[WS(os, 1)] = T11 - T14; + ro[WS(os, 1)] = T19 + T1k; + io[WS(os, 7)] = T11 + T14; + ro[WS(os, 7)] = T19 - T1k; + ro[WS(os, 10)] = T17 - T18; + io[WS(os, 10)] = T1l - T1m; + ro[WS(os, 4)] = T17 + T18; + io[WS(os, 4)] = T1l + T1m; + } + { + E TF, T1r, T1q, T1s, TQ, TY, TX, T1n; + { + E TB, TE, T1o, T1p; + TB = FNMS(KP866025403, TA, Tz); + TE = FNMS(KP866025403, TD, TC); + TF = TB - TE; + T1r = TB + TE; + T1o = FNMS(KP866025403, T1d, T1c); + T1p = FNMS(KP866025403, T1i, T1h); + T1q = T1o - T1p; + T1s = T1o + T1p; + } + { + E TK, TP, TT, TW; + TK = FNMS(KP866025403, TJ, TG); + TP = FNMS(KP866025403, TO, TL); + TQ = TK - TP; + TY = TK + TP; + TT = FNMS(KP866025403, TS, TR); + TW = FNMS(KP866025403, TV, TU); + TX = TT + TW; + T1n = TT - TW; + } + io[WS(os, 5)] = TF - TQ; + ro[WS(os, 5)] = T1n + T1q; + io[WS(os, 11)] = TF + TQ; + ro[WS(os, 11)] = T1n - T1q; + ro[WS(os, 2)] = TX - TY; + io[WS(os, 2)] = T1r - T1s; + ro[WS(os, 8)] = TX + TY; + io[WS(os, 8)] = T1r + T1s; + } + } + } + } +} + +static const kdft_desc desc = { 12, "n1_12", {72, 0, 24, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_12) (planner *p) { + X(kdft_register) (p, n1_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 12 -name n1_12 -include dft/scalar/n.h */ + +/* + * This function contains 96 FP additions, 16 FP multiplications, + * (or, 88 additions, 8 multiplications, 8 fused multiply/add), + * 43 stack variables, 2 constants, and 48 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(48, is), MAKE_VOLATILE_STRIDE(48, os)) { + E T5, TR, TA, Ts, TS, Tz, Ta, TU, TD, Tx, TV, TC, Tg, T1a, TG; + E TJ, T1u, T1d, Tl, T1f, TL, TO, T1v, T1i; + { + E T1, T2, T3, T4; + T1 = ri[0]; + T2 = ri[WS(is, 4)]; + T3 = ri[WS(is, 8)]; + T4 = T2 + T3; + T5 = T1 + T4; + TR = FNMS(KP500000000, T4, T1); + TA = KP866025403 * (T3 - T2); + } + { + E To, Tp, Tq, Tr; + To = ii[0]; + Tp = ii[WS(is, 4)]; + Tq = ii[WS(is, 8)]; + Tr = Tp + Tq; + Ts = To + Tr; + TS = KP866025403 * (Tp - Tq); + Tz = FNMS(KP500000000, Tr, To); + } + { + E T6, T7, T8, T9; + T6 = ri[WS(is, 6)]; + T7 = ri[WS(is, 10)]; + T8 = ri[WS(is, 2)]; + T9 = T7 + T8; + Ta = T6 + T9; + TU = FNMS(KP500000000, T9, T6); + TD = KP866025403 * (T8 - T7); + } + { + E Tt, Tu, Tv, Tw; + Tt = ii[WS(is, 6)]; + Tu = ii[WS(is, 10)]; + Tv = ii[WS(is, 2)]; + Tw = Tu + Tv; + Tx = Tt + Tw; + TV = KP866025403 * (Tu - Tv); + TC = FNMS(KP500000000, Tw, Tt); + } + { + E Tc, Td, Te, Tf; + Tc = ri[WS(is, 3)]; + Td = ri[WS(is, 7)]; + Te = ri[WS(is, 11)]; + Tf = Td + Te; + Tg = Tc + Tf; + T1a = KP866025403 * (Te - Td); + TG = FNMS(KP500000000, Tf, Tc); + } + { + E T1b, TH, TI, T1c; + T1b = ii[WS(is, 3)]; + TH = ii[WS(is, 7)]; + TI = ii[WS(is, 11)]; + T1c = TH + TI; + TJ = KP866025403 * (TH - TI); + T1u = T1b + T1c; + T1d = FNMS(KP500000000, T1c, T1b); + } + { + E Th, Ti, Tj, Tk; + Th = ri[WS(is, 9)]; + Ti = ri[WS(is, 1)]; + Tj = ri[WS(is, 5)]; + Tk = Ti + Tj; + Tl = Th + Tk; + T1f = KP866025403 * (Tj - Ti); + TL = FNMS(KP500000000, Tk, Th); + } + { + E T1g, TM, TN, T1h; + T1g = ii[WS(is, 9)]; + TM = ii[WS(is, 1)]; + TN = ii[WS(is, 5)]; + T1h = TM + TN; + TO = KP866025403 * (TM - TN); + T1v = T1g + T1h; + T1i = FNMS(KP500000000, T1h, T1g); + } + { + E Tb, Tm, T1t, T1w; + Tb = T5 + Ta; + Tm = Tg + Tl; + ro[WS(os, 6)] = Tb - Tm; + ro[0] = Tb + Tm; + { + E T1x, T1y, Tn, Ty; + T1x = Ts + Tx; + T1y = T1u + T1v; + io[WS(os, 6)] = T1x - T1y; + io[0] = T1x + T1y; + Tn = Tg - Tl; + Ty = Ts - Tx; + io[WS(os, 3)] = Tn + Ty; + io[WS(os, 9)] = Ty - Tn; + } + T1t = T5 - Ta; + T1w = T1u - T1v; + ro[WS(os, 3)] = T1t - T1w; + ro[WS(os, 9)] = T1t + T1w; + { + E T11, T1l, T1k, T1m, T14, T18, T17, T19; + { + E TZ, T10, T1e, T1j; + TZ = TA + Tz; + T10 = TD + TC; + T11 = TZ - T10; + T1l = TZ + T10; + T1e = T1a + T1d; + T1j = T1f + T1i; + T1k = T1e - T1j; + T1m = T1e + T1j; + } + { + E T12, T13, T15, T16; + T12 = TG + TJ; + T13 = TL + TO; + T14 = T12 - T13; + T18 = T12 + T13; + T15 = TR + TS; + T16 = TU + TV; + T17 = T15 + T16; + T19 = T15 - T16; + } + io[WS(os, 1)] = T11 - T14; + ro[WS(os, 1)] = T19 + T1k; + io[WS(os, 7)] = T11 + T14; + ro[WS(os, 7)] = T19 - T1k; + ro[WS(os, 10)] = T17 - T18; + io[WS(os, 10)] = T1l - T1m; + ro[WS(os, 4)] = T17 + T18; + io[WS(os, 4)] = T1l + T1m; + } + { + E TF, T1r, T1q, T1s, TQ, TY, TX, T1n; + { + E TB, TE, T1o, T1p; + TB = Tz - TA; + TE = TC - TD; + TF = TB - TE; + T1r = TB + TE; + T1o = T1d - T1a; + T1p = T1i - T1f; + T1q = T1o - T1p; + T1s = T1o + T1p; + } + { + E TK, TP, TT, TW; + TK = TG - TJ; + TP = TL - TO; + TQ = TK - TP; + TY = TK + TP; + TT = TR - TS; + TW = TU - TV; + TX = TT + TW; + T1n = TT - TW; + } + io[WS(os, 5)] = TF - TQ; + ro[WS(os, 5)] = T1n + T1q; + io[WS(os, 11)] = TF + TQ; + ro[WS(os, 11)] = T1n - T1q; + ro[WS(os, 2)] = TX - TY; + io[WS(os, 2)] = T1r - T1s; + ro[WS(os, 8)] = TX + TY; + io[WS(os, 8)] = T1r + T1s; + } + } + } + } +} + +static const kdft_desc desc = { 12, "n1_12", {88, 8, 8, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_12) (planner *p) { + X(kdft_register) (p, n1_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_13.c new file mode 100644 index 000000000..73b60d6f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_13.c @@ -0,0 +1,683 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 13 -name n1_13 -include dft/scalar/n.h */ + +/* + * This function contains 176 FP additions, 114 FP multiplications, + * (or, 62 additions, 0 multiplications, 114 fused multiply/add), + * 76 stack variables, 25 constants, and 52 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_13(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP875502302, +0.875502302409147941146295545768755143177842006); + DK(KP520028571, +0.520028571888864619117130500499232802493238139); + DK(KP968287244, +0.968287244361984016049539446938120421179794516); + DK(KP575140729, +0.575140729474003121368385547455453388461001608); + DK(KP600477271, +0.600477271932665282925769253334763009352012849); + DK(KP957805992, +0.957805992594665126462521754605754580515587217); + DK(KP516520780, +0.516520780623489722840901288569017135705033622); + DK(KP581704778, +0.581704778510515730456870384989698884939833902); + DK(KP300462606, +0.300462606288665774426601772289207995520941381); + DK(KP503537032, +0.503537032863766627246873853868466977093348562); + DK(KP251768516, +0.251768516431883313623436926934233488546674281); + DK(KP301479260, +0.301479260047709873958013540496673347309208464); + DK(KP083333333, +0.083333333333333333333333333333333333333333333); + DK(KP859542535, +0.859542535098774820163672132761689612766401925); + DK(KP514918778, +0.514918778086315755491789696138117261566051239); + DK(KP522026385, +0.522026385161275033714027226654165028300441940); + DK(KP853480001, +0.853480001859823990758994934970528322872359049); + DK(KP612264650, +0.612264650376756543746494474777125408779395514); + DK(KP038632954, +0.038632954644348171955506895830342264440241080); + DK(KP302775637, +0.302775637731994646559610633735247973125648287); + DK(KP769338817, +0.769338817572980603471413688209101117038278899); + DK(KP686558370, +0.686558370781754340655719594850823015421401653); + DK(KP226109445, +0.226109445035782405468510155372505010481906348); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(52, is), MAKE_VOLATILE_STRIDE(52, os)) { + E T1, T1P, T2n, T2o, To, TH, T2h, T2k, TB, TE, Tw, TF, T2c, T2j, T1j; + E T1m, T12, T1f, T21, T24, T1U, T27, T1d, T1g, T1Y, T25; + T1 = ri[0]; + T1P = ii[0]; + { + E Tf, T2d, Tb, Ty, Tq, T6, Tx, Tr, Ti, Tt, Tl, Tu, Tm, T2e, Td; + E Te, Tc, Tn; + Td = ri[WS(is, 8)]; + Te = ri[WS(is, 5)]; + Tf = Td + Te; + T2d = Td - Te; + { + E T7, T8, T9, Ta; + T7 = ri[WS(is, 12)]; + T8 = ri[WS(is, 10)]; + T9 = ri[WS(is, 4)]; + Ta = T8 + T9; + Tb = T7 + Ta; + Ty = FMS(KP500000000, Ta, T7); + Tq = T8 - T9; + } + { + E T2, T3, T4, T5; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 3)]; + T4 = ri[WS(is, 9)]; + T5 = T3 + T4; + T6 = T2 + T5; + Tx = FNMS(KP500000000, T5, T2); + Tr = T4 - T3; + } + { + E Tg, Th, Tj, Tk; + Tg = ri[WS(is, 11)]; + Th = ri[WS(is, 6)]; + Ti = Tg + Th; + Tt = Tg - Th; + Tj = ri[WS(is, 7)]; + Tk = ri[WS(is, 2)]; + Tl = Tj + Tk; + Tu = Tj - Tk; + } + Tm = Ti + Tl; + T2e = Tt + Tu; + T2n = T6 - Tb; + T2o = T2d + T2e; + Tc = T6 + Tb; + Tn = Tf + Tm; + To = Tc + Tn; + TH = Tc - Tn; + { + E T2f, T2g, Tz, TA; + T2f = FNMS(KP500000000, T2e, T2d); + T2g = Tr + Tq; + T2h = FMA(KP866025403, T2g, T2f); + T2k = FNMS(KP866025403, T2g, T2f); + Tz = Tx - Ty; + TA = FNMS(KP500000000, Tm, Tf); + TB = Tz + TA; + TE = Tz - TA; + } + { + E Ts, Tv, T2a, T2b; + Ts = Tq - Tr; + Tv = Tt - Tu; + Tw = Ts + Tv; + TF = Ts - Tv; + T2a = Tx + Ty; + T2b = Ti - Tl; + T2c = FMA(KP866025403, T2b, T2a); + T2j = FNMS(KP866025403, T2b, T2a); + } + } + { + E TM, T1R, T10, T1l, T18, TX, T1k, T15, TP, T1a, TS, T1b, TT, T1S, TK; + E TL, TU, T11; + TK = ii[WS(is, 8)]; + TL = ii[WS(is, 5)]; + TM = TK - TL; + T1R = TK + TL; + { + E T16, TY, TZ, T17; + T16 = ii[WS(is, 12)]; + TY = ii[WS(is, 10)]; + TZ = ii[WS(is, 4)]; + T17 = TY + TZ; + T10 = TY - TZ; + T1l = T16 + T17; + T18 = FMS(KP500000000, T17, T16); + } + { + E T13, TV, TW, T14; + T13 = ii[WS(is, 1)]; + TV = ii[WS(is, 9)]; + TW = ii[WS(is, 3)]; + T14 = TW + TV; + TX = TV - TW; + T1k = T13 + T14; + T15 = FNMS(KP500000000, T14, T13); + } + { + E TN, TO, TQ, TR; + TN = ii[WS(is, 11)]; + TO = ii[WS(is, 6)]; + TP = TN - TO; + T1a = TN + TO; + TQ = ii[WS(is, 7)]; + TR = ii[WS(is, 2)]; + TS = TQ - TR; + T1b = TQ + TR; + } + TT = TP + TS; + T1S = T1a + T1b; + T1j = TM + TT; + T1m = T1k - T1l; + TU = FNMS(KP500000000, TT, TM); + T11 = TX + T10; + T12 = FMA(KP866025403, T11, TU); + T1f = FNMS(KP866025403, T11, TU); + { + E T1Z, T20, T1Q, T1T; + T1Z = T15 - T18; + T20 = FNMS(KP500000000, T1S, T1R); + T21 = T1Z + T20; + T24 = T1Z - T20; + T1Q = T1k + T1l; + T1T = T1R + T1S; + T1U = T1Q + T1T; + T27 = T1Q - T1T; + } + { + E T19, T1c, T1W, T1X; + T19 = T15 + T18; + T1c = T1a - T1b; + T1d = FMA(KP866025403, T1c, T19); + T1g = FNMS(KP866025403, T1c, T19); + T1W = T10 - TX; + T1X = TP - TS; + T1Y = T1W + T1X; + T25 = T1W - T1X; + } + } + ro[0] = T1 + To; + io[0] = T1P + T1U; + { + E T1z, T1J, T1G, T1H, T1w, T1I, T1n, T1i, T1s, T1E, TD, T1D, TI, T1r, T1e; + E T1h; + { + E T1x, T1y, T1u, T1v; + T1x = FNMS(KP226109445, Tw, TB); + T1y = FMA(KP686558370, TE, TF); + T1z = FNMS(KP769338817, T1y, T1x); + T1J = FMA(KP769338817, T1y, T1x); + T1G = FMA(KP302775637, T1j, T1m); + T1u = FNMS(KP038632954, T12, T1d); + T1v = FNMS(KP612264650, T1f, T1g); + T1H = FNMS(KP853480001, T1v, T1u); + T1w = FMA(KP853480001, T1v, T1u); + T1I = FNMS(KP522026385, T1H, T1G); + } + T1n = FNMS(KP302775637, T1m, T1j); + T1e = FMA(KP038632954, T1d, T12); + T1h = FMA(KP612264650, T1g, T1f); + T1i = FNMS(KP853480001, T1h, T1e); + T1s = FNMS(KP522026385, T1i, T1n); + T1E = FMA(KP853480001, T1h, T1e); + { + E TG, T1q, Tp, TC, T1p; + TG = FNMS(KP514918778, TF, TE); + T1q = FNMS(KP859542535, TG, TH); + Tp = FNMS(KP083333333, To, T1); + TC = FMA(KP301479260, TB, Tw); + T1p = FNMS(KP251768516, TC, Tp); + TD = FMA(KP503537032, TC, Tp); + T1D = FNMS(KP300462606, T1q, T1p); + TI = FMA(KP581704778, TH, TG); + T1r = FMA(KP300462606, T1q, T1p); + } + { + E TJ, T1o, T1L, T1M; + TJ = FMA(KP516520780, TI, TD); + T1o = FMA(KP957805992, T1n, T1i); + ro[WS(os, 1)] = FNMS(KP600477271, T1o, TJ); + ro[WS(os, 12)] = FMA(KP600477271, T1o, TJ); + { + E T1t, T1A, T1N, T1O; + T1t = FNMS(KP575140729, T1s, T1r); + T1A = FMA(KP968287244, T1z, T1w); + ro[WS(os, 9)] = FNMS(KP520028571, T1A, T1t); + ro[WS(os, 3)] = FMA(KP520028571, T1A, T1t); + T1N = FNMS(KP516520780, TI, TD); + T1O = FMA(KP957805992, T1G, T1H); + ro[WS(os, 8)] = FNMS(KP600477271, T1O, T1N); + ro[WS(os, 5)] = FMA(KP600477271, T1O, T1N); + } + T1L = FNMS(KP520028571, T1E, T1D); + T1M = FNMS(KP875502302, T1J, T1I); + ro[WS(os, 11)] = FNMS(KP575140729, T1M, T1L); + ro[WS(os, 6)] = FMA(KP575140729, T1M, T1L); + { + E T1F, T1K, T1B, T1C; + T1F = FMA(KP520028571, T1E, T1D); + T1K = FMA(KP875502302, T1J, T1I); + ro[WS(os, 7)] = FNMS(KP575140729, T1K, T1F); + ro[WS(os, 2)] = FMA(KP575140729, T1K, T1F); + T1B = FMA(KP575140729, T1s, T1r); + T1C = FNMS(KP968287244, T1z, T1w); + ro[WS(os, 10)] = FNMS(KP520028571, T1C, T1B); + ro[WS(os, 4)] = FMA(KP520028571, T1C, T1B); + } + } + } + { + E T2F, T2N, T2v, T2u, T2A, T2K, T2p, T2m, T2C, T2M, T23, T2J, T28, T2z, T2i; + E T2l; + { + E T2D, T2E, T2s, T2t; + T2D = FNMS(KP226109445, T1Y, T21); + T2E = FMA(KP686558370, T24, T25); + T2F = FNMS(KP769338817, T2E, T2D); + T2N = FMA(KP769338817, T2E, T2D); + T2v = FNMS(KP302775637, T2n, T2o); + T2s = FMA(KP038632954, T2c, T2h); + T2t = FMA(KP612264650, T2j, T2k); + T2u = FNMS(KP853480001, T2t, T2s); + T2A = FNMS(KP522026385, T2u, T2v); + T2K = FMA(KP853480001, T2t, T2s); + } + T2p = FMA(KP302775637, T2o, T2n); + T2i = FNMS(KP038632954, T2h, T2c); + T2l = FNMS(KP612264650, T2k, T2j); + T2m = FNMS(KP853480001, T2l, T2i); + T2C = FMA(KP853480001, T2l, T2i); + T2M = FNMS(KP522026385, T2m, T2p); + { + E T26, T2y, T1V, T22, T2x; + T26 = FNMS(KP514918778, T25, T24); + T2y = FNMS(KP859542535, T26, T27); + T1V = FNMS(KP083333333, T1U, T1P); + T22 = FMA(KP301479260, T21, T1Y); + T2x = FNMS(KP251768516, T22, T1V); + T23 = FMA(KP503537032, T22, T1V); + T2J = FNMS(KP300462606, T2y, T2x); + T28 = FMA(KP581704778, T27, T26); + T2z = FMA(KP300462606, T2y, T2x); + } + { + E T29, T2q, T2L, T2O; + T29 = FNMS(KP516520780, T28, T23); + T2q = FMA(KP957805992, T2p, T2m); + io[WS(os, 5)] = FNMS(KP600477271, T2q, T29); + io[WS(os, 8)] = FMA(KP600477271, T2q, T29); + { + E T2r, T2w, T2P, T2Q; + T2r = FMA(KP516520780, T28, T23); + T2w = FMA(KP957805992, T2v, T2u); + io[WS(os, 1)] = FMA(KP600477271, T2w, T2r); + io[WS(os, 12)] = FNMS(KP600477271, T2w, T2r); + T2P = FMA(KP520028571, T2K, T2J); + T2Q = FMA(KP875502302, T2N, T2M); + io[WS(os, 6)] = FNMS(KP575140729, T2Q, T2P); + io[WS(os, 11)] = FMA(KP575140729, T2Q, T2P); + } + T2L = FNMS(KP520028571, T2K, T2J); + T2O = FNMS(KP875502302, T2N, T2M); + io[WS(os, 2)] = FNMS(KP575140729, T2O, T2L); + io[WS(os, 7)] = FMA(KP575140729, T2O, T2L); + { + E T2H, T2I, T2B, T2G; + T2H = FNMS(KP575140729, T2A, T2z); + T2I = FMA(KP968287244, T2F, T2C); + io[WS(os, 4)] = FNMS(KP520028571, T2I, T2H); + io[WS(os, 10)] = FMA(KP520028571, T2I, T2H); + T2B = FMA(KP575140729, T2A, T2z); + T2G = FNMS(KP968287244, T2F, T2C); + io[WS(os, 3)] = FNMS(KP520028571, T2G, T2B); + io[WS(os, 9)] = FMA(KP520028571, T2G, T2B); + } + } + } + } + } +} + +static const kdft_desc desc = { 13, "n1_13", {62, 0, 114, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_13) (planner *p) { + X(kdft_register) (p, n1_13, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 13 -name n1_13 -include dft/scalar/n.h */ + +/* + * This function contains 176 FP additions, 68 FP multiplications, + * (or, 138 additions, 30 multiplications, 38 fused multiply/add), + * 71 stack variables, 20 constants, and 52 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_13(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP083333333, +0.083333333333333333333333333333333333333333333); + DK(KP251768516, +0.251768516431883313623436926934233488546674281); + DK(KP075902986, +0.075902986037193865983102897245103540356428373); + DK(KP132983124, +0.132983124607418643793760531921092974399165133); + DK(KP258260390, +0.258260390311744861420450644284508567852516811); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP300238635, +0.300238635966332641462884626667381504676006424); + DK(KP011599105, +0.011599105605768290721655456654083252189827041); + DK(KP156891391, +0.156891391051584611046832726756003269660212636); + DK(KP256247671, +0.256247671582936600958684654061725059144125175); + DK(KP174138601, +0.174138601152135905005660794929264742616964676); + DK(KP575140729, +0.575140729474003121368385547455453388461001608); + DK(KP503537032, +0.503537032863766627246873853868466977093348562); + DK(KP113854479, +0.113854479055790798974654345867655310534642560); + DK(KP265966249, +0.265966249214837287587521063842185948798330267); + DK(KP387390585, +0.387390585467617292130675966426762851778775217); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP300462606, +0.300462606288665774426601772289207995520941381); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(52, is), MAKE_VOLATILE_STRIDE(52, os)) { + E T1, T1q, Tt, Tu, To, T22, T20, T24, TF, TH, TA, TI, T1X, T25, T2a; + E T2d, T18, T1n, T2k, T2n, T1l, T1r, T1f, T1o, T2h, T2m; + T1 = ri[0]; + T1q = ii[0]; + { + E Tf, Tp, Tb, TC, Tx, T6, TB, Tw, Ti, Tq, Tl, Tr, Tm, Ts, Td; + E Te, Tc, Tn; + Td = ri[WS(is, 8)]; + Te = ri[WS(is, 5)]; + Tf = Td + Te; + Tp = Td - Te; + { + E T7, T8, T9, Ta; + T7 = ri[WS(is, 12)]; + T8 = ri[WS(is, 10)]; + T9 = ri[WS(is, 4)]; + Ta = T8 + T9; + Tb = T7 + Ta; + TC = T8 - T9; + Tx = FNMS(KP500000000, Ta, T7); + } + { + E T2, T3, T4, T5; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 3)]; + T4 = ri[WS(is, 9)]; + T5 = T3 + T4; + T6 = T2 + T5; + TB = T3 - T4; + Tw = FNMS(KP500000000, T5, T2); + } + { + E Tg, Th, Tj, Tk; + Tg = ri[WS(is, 11)]; + Th = ri[WS(is, 6)]; + Ti = Tg + Th; + Tq = Tg - Th; + Tj = ri[WS(is, 7)]; + Tk = ri[WS(is, 2)]; + Tl = Tj + Tk; + Tr = Tj - Tk; + } + Tm = Ti + Tl; + Ts = Tq + Tr; + Tt = Tp + Ts; + Tu = T6 - Tb; + Tc = T6 + Tb; + Tn = Tf + Tm; + To = Tc + Tn; + T22 = KP300462606 * (Tc - Tn); + { + E T1Y, T1Z, TD, TE; + T1Y = TB + TC; + T1Z = Tq - Tr; + T20 = T1Y - T1Z; + T24 = T1Y + T1Z; + TD = KP866025403 * (TB - TC); + TE = FNMS(KP500000000, Ts, Tp); + TF = TD - TE; + TH = TD + TE; + } + { + E Ty, Tz, T1V, T1W; + Ty = Tw - Tx; + Tz = KP866025403 * (Ti - Tl); + TA = Ty + Tz; + TI = Ty - Tz; + T1V = Tw + Tx; + T1W = FNMS(KP500000000, Tm, Tf); + T1X = T1V - T1W; + T25 = T1V + T1W; + } + } + { + E TZ, T2b, TV, T1i, T1a, TQ, T1h, T19, T12, T1d, T15, T1c, T16, T2c, TX; + E TY, TW, T17; + TX = ii[WS(is, 8)]; + TY = ii[WS(is, 5)]; + TZ = TX + TY; + T2b = TX - TY; + { + E TR, TS, TT, TU; + TR = ii[WS(is, 12)]; + TS = ii[WS(is, 10)]; + TT = ii[WS(is, 4)]; + TU = TS + TT; + TV = FNMS(KP500000000, TU, TR); + T1i = TR + TU; + T1a = TS - TT; + } + { + E TM, TN, TO, TP; + TM = ii[WS(is, 1)]; + TN = ii[WS(is, 3)]; + TO = ii[WS(is, 9)]; + TP = TN + TO; + TQ = FNMS(KP500000000, TP, TM); + T1h = TM + TP; + T19 = TN - TO; + } + { + E T10, T11, T13, T14; + T10 = ii[WS(is, 11)]; + T11 = ii[WS(is, 6)]; + T12 = T10 + T11; + T1d = T10 - T11; + T13 = ii[WS(is, 7)]; + T14 = ii[WS(is, 2)]; + T15 = T13 + T14; + T1c = T13 - T14; + } + T16 = T12 + T15; + T2c = T1d + T1c; + T2a = T1h - T1i; + T2d = T2b + T2c; + TW = TQ + TV; + T17 = FNMS(KP500000000, T16, TZ); + T18 = TW - T17; + T1n = TW + T17; + { + E T2i, T2j, T1j, T1k; + T2i = TQ - TV; + T2j = KP866025403 * (T15 - T12); + T2k = T2i + T2j; + T2n = T2i - T2j; + T1j = T1h + T1i; + T1k = TZ + T16; + T1l = KP300462606 * (T1j - T1k); + T1r = T1j + T1k; + } + { + E T1b, T1e, T2f, T2g; + T1b = T19 + T1a; + T1e = T1c - T1d; + T1f = T1b + T1e; + T1o = T1e - T1b; + T2f = FNMS(KP500000000, T2c, T2b); + T2g = KP866025403 * (T1a - T19); + T2h = T2f - T2g; + T2m = T2g + T2f; + } + } + ro[0] = T1 + To; + io[0] = T1q + T1r; + { + E T1D, T1N, T1y, T1x, T1E, T1O, Tv, TK, T1J, T1Q, T1m, T1R, T1t, T1I, TG; + E TJ; + { + E T1B, T1C, T1v, T1w; + T1B = FMA(KP387390585, T1f, KP265966249 * T18); + T1C = FMA(KP113854479, T1o, KP503537032 * T1n); + T1D = T1B + T1C; + T1N = T1C - T1B; + T1y = FMA(KP575140729, Tu, KP174138601 * Tt); + T1v = FNMS(KP156891391, TH, KP256247671 * TI); + T1w = FMA(KP011599105, TF, KP300238635 * TA); + T1x = T1v - T1w; + T1E = T1y + T1x; + T1O = KP1_732050807 * (T1v + T1w); + } + Tv = FNMS(KP174138601, Tu, KP575140729 * Tt); + TG = FNMS(KP300238635, TF, KP011599105 * TA); + TJ = FMA(KP256247671, TH, KP156891391 * TI); + TK = TG - TJ; + T1J = KP1_732050807 * (TJ + TG); + T1Q = Tv - TK; + { + E T1g, T1H, T1p, T1s, T1G; + T1g = FNMS(KP132983124, T1f, KP258260390 * T18); + T1H = T1l - T1g; + T1p = FNMS(KP251768516, T1o, KP075902986 * T1n); + T1s = FNMS(KP083333333, T1r, T1q); + T1G = T1s - T1p; + T1m = FMA(KP2_000000000, T1g, T1l); + T1R = T1H + T1G; + T1t = FMA(KP2_000000000, T1p, T1s); + T1I = T1G - T1H; + } + { + E TL, T1u, T1P, T1S; + TL = FMA(KP2_000000000, TK, Tv); + T1u = T1m + T1t; + io[WS(os, 1)] = TL + T1u; + io[WS(os, 12)] = T1u - TL; + { + E T1z, T1A, T1T, T1U; + T1z = FMS(KP2_000000000, T1x, T1y); + T1A = T1t - T1m; + io[WS(os, 5)] = T1z + T1A; + io[WS(os, 8)] = T1A - T1z; + T1T = T1R - T1Q; + T1U = T1O + T1N; + io[WS(os, 4)] = T1T - T1U; + io[WS(os, 10)] = T1U + T1T; + } + T1P = T1N - T1O; + T1S = T1Q + T1R; + io[WS(os, 3)] = T1P + T1S; + io[WS(os, 9)] = T1S - T1P; + { + E T1L, T1M, T1F, T1K; + T1L = T1J + T1I; + T1M = T1E + T1D; + io[WS(os, 6)] = T1L - T1M; + io[WS(os, 11)] = T1M + T1L; + T1F = T1D - T1E; + T1K = T1I - T1J; + io[WS(os, 2)] = T1F + T1K; + io[WS(os, 7)] = T1K - T1F; + } + } + } + { + E T2y, T2I, T2J, T2K, T2B, T2L, T2e, T2p, T2u, T2G, T23, T2F, T28, T2t, T2l; + E T2o; + { + E T2w, T2x, T2z, T2A; + T2w = FMA(KP387390585, T20, KP265966249 * T1X); + T2x = FNMS(KP503537032, T25, KP113854479 * T24); + T2y = T2w + T2x; + T2I = T2w - T2x; + T2J = FMA(KP575140729, T2a, KP174138601 * T2d); + T2z = FNMS(KP300238635, T2n, KP011599105 * T2m); + T2A = FNMS(KP156891391, T2h, KP256247671 * T2k); + T2K = T2z + T2A; + T2B = KP1_732050807 * (T2z - T2A); + T2L = T2J + T2K; + } + T2e = FNMS(KP575140729, T2d, KP174138601 * T2a); + T2l = FMA(KP256247671, T2h, KP156891391 * T2k); + T2o = FMA(KP300238635, T2m, KP011599105 * T2n); + T2p = T2l - T2o; + T2u = T2e - T2p; + T2G = KP1_732050807 * (T2o + T2l); + { + E T21, T2r, T26, T27, T2s; + T21 = FNMS(KP132983124, T20, KP258260390 * T1X); + T2r = T22 - T21; + T26 = FMA(KP251768516, T24, KP075902986 * T25); + T27 = FNMS(KP083333333, To, T1); + T2s = T27 - T26; + T23 = FMA(KP2_000000000, T21, T22); + T2F = T2s - T2r; + T28 = FMA(KP2_000000000, T26, T27); + T2t = T2r + T2s; + } + { + E T29, T2q, T2N, T2O; + T29 = T23 + T28; + T2q = FMA(KP2_000000000, T2p, T2e); + ro[WS(os, 12)] = T29 - T2q; + ro[WS(os, 1)] = T29 + T2q; + { + E T2v, T2C, T2P, T2Q; + T2v = T2t - T2u; + T2C = T2y - T2B; + ro[WS(os, 10)] = T2v - T2C; + ro[WS(os, 4)] = T2v + T2C; + T2P = T28 - T23; + T2Q = FMS(KP2_000000000, T2K, T2J); + ro[WS(os, 5)] = T2P - T2Q; + ro[WS(os, 8)] = T2P + T2Q; + } + T2N = T2F - T2G; + T2O = T2L - T2I; + ro[WS(os, 11)] = T2N - T2O; + ro[WS(os, 6)] = T2N + T2O; + { + E T2H, T2M, T2D, T2E; + T2H = T2F + T2G; + T2M = T2I + T2L; + ro[WS(os, 7)] = T2H - T2M; + ro[WS(os, 2)] = T2H + T2M; + T2D = T2t + T2u; + T2E = T2y + T2B; + ro[WS(os, 3)] = T2D - T2E; + ro[WS(os, 9)] = T2D + T2E; + } + } + } + } + } +} + +static const kdft_desc desc = { 13, "n1_13", {138, 30, 38, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_13) (planner *p) { + X(kdft_register) (p, n1_13, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_14.c new file mode 100644 index 000000000..389e9719a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_14.c @@ -0,0 +1,515 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 14 -name n1_14 -include dft/scalar/n.h */ + +/* + * This function contains 148 FP additions, 84 FP multiplications, + * (or, 64 additions, 0 multiplications, 84 fused multiply/add), + * 67 stack variables, 6 constants, and 56 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(56, is), MAKE_VOLATILE_STRIDE(56, os)) { + E T3, Tp, T1b, T1x, T1i, T1L, T1M, T1j, T1k, T1K, Ta, To, Th, Tz, T14; + E TZ, Ts, Ty, Tv, T1Z, T2c, T27, TI, T23, T24, TP, TW, T22, T1c, T1e; + E T1d, T1f, T1s, T1n, T1A, T1G, T1D, T1H, T1U, T1P; + { + E T1, T2, T19, T1a; + T1 = ri[0]; + T2 = ri[WS(is, 7)]; + T3 = T1 - T2; + Tp = T1 + T2; + T19 = ii[0]; + T1a = ii[WS(is, 7)]; + T1b = T19 - T1a; + T1x = T19 + T1a; + } + { + E T6, Tq, T9, Tr, Tn, Tx, Tk, Tw, Tg, Tu, Td, Tt; + { + E T4, T5, Ti, Tj; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 9)]; + T6 = T4 - T5; + Tq = T4 + T5; + { + E T7, T8, Tl, Tm; + T7 = ri[WS(is, 12)]; + T8 = ri[WS(is, 5)]; + T9 = T7 - T8; + Tr = T7 + T8; + Tl = ri[WS(is, 8)]; + Tm = ri[WS(is, 1)]; + Tn = Tl - Tm; + Tx = Tl + Tm; + } + Ti = ri[WS(is, 6)]; + Tj = ri[WS(is, 13)]; + Tk = Ti - Tj; + Tw = Ti + Tj; + { + E Te, Tf, Tb, Tc; + Te = ri[WS(is, 10)]; + Tf = ri[WS(is, 3)]; + Tg = Te - Tf; + Tu = Te + Tf; + Tb = ri[WS(is, 4)]; + Tc = ri[WS(is, 11)]; + Td = Tb - Tc; + Tt = Tb + Tc; + } + } + T1i = Tn - Tk; + T1L = Tt - Tu; + T1M = Tr - Tq; + T1j = Tg - Td; + T1k = T9 - T6; + T1K = Tw - Tx; + Ta = T6 + T9; + To = Tk + Tn; + Th = Td + Tg; + Tz = FNMS(KP356895867, Th, Ta); + T14 = FNMS(KP356895867, To, Th); + TZ = FNMS(KP356895867, Ta, To); + Ts = Tq + Tr; + Ty = Tw + Tx; + Tv = Tt + Tu; + T1Z = FNMS(KP356895867, Ts, Ty); + T2c = FNMS(KP356895867, Ty, Tv); + T27 = FNMS(KP356895867, Tv, Ts); + } + { + E TE, T1B, TH, T1C, TV, T1F, TS, T1E, TO, T1z, TL, T1y; + { + E TC, TD, TQ, TR; + TC = ii[WS(is, 4)]; + TD = ii[WS(is, 11)]; + TE = TC - TD; + T1B = TC + TD; + { + E TF, TG, TT, TU; + TF = ii[WS(is, 10)]; + TG = ii[WS(is, 3)]; + TH = TF - TG; + T1C = TF + TG; + TT = ii[WS(is, 8)]; + TU = ii[WS(is, 1)]; + TV = TT - TU; + T1F = TT + TU; + } + TQ = ii[WS(is, 6)]; + TR = ii[WS(is, 13)]; + TS = TQ - TR; + T1E = TQ + TR; + { + E TM, TN, TJ, TK; + TM = ii[WS(is, 12)]; + TN = ii[WS(is, 5)]; + TO = TM - TN; + T1z = TM + TN; + TJ = ii[WS(is, 2)]; + TK = ii[WS(is, 9)]; + TL = TJ - TK; + T1y = TJ + TK; + } + } + TI = TE - TH; + T23 = T1F - T1E; + T24 = T1C - T1B; + TP = TL - TO; + TW = TS - TV; + T22 = T1y - T1z; + T1c = TL + TO; + T1e = TS + TV; + T1d = TE + TH; + T1f = FNMS(KP356895867, T1e, T1d); + T1s = FNMS(KP356895867, T1d, T1c); + T1n = FNMS(KP356895867, T1c, T1e); + T1A = T1y + T1z; + T1G = T1E + T1F; + T1D = T1B + T1C; + T1H = FNMS(KP356895867, T1G, T1D); + T1U = FNMS(KP356895867, T1D, T1A); + T1P = FNMS(KP356895867, T1A, T1G); + } + ro[WS(os, 7)] = T3 + Ta + Th + To; + io[WS(os, 7)] = T1b + T1c + T1d + T1e; + ro[0] = Tp + Ts + Tv + Ty; + io[0] = T1x + T1A + T1D + T1G; + { + E TB, TY, TA, TX; + TA = FNMS(KP692021471, Tz, To); + TB = FNMS(KP900968867, TA, T3); + TX = FMA(KP554958132, TW, TP); + TY = FMA(KP801937735, TX, TI); + ro[WS(os, 13)] = FNMS(KP974927912, TY, TB); + ro[WS(os, 1)] = FMA(KP974927912, TY, TB); + } + { + E T1u, T1w, T1t, T1v; + T1t = FNMS(KP692021471, T1s, T1e); + T1u = FNMS(KP900968867, T1t, T1b); + T1v = FMA(KP554958132, T1i, T1k); + T1w = FMA(KP801937735, T1v, T1j); + io[WS(os, 1)] = FMA(KP974927912, T1w, T1u); + io[WS(os, 13)] = FNMS(KP974927912, T1w, T1u); + } + { + E T11, T13, T10, T12; + T10 = FNMS(KP692021471, TZ, Th); + T11 = FNMS(KP900968867, T10, T3); + T12 = FMA(KP554958132, TI, TW); + T13 = FNMS(KP801937735, T12, TP); + ro[WS(os, 5)] = FNMS(KP974927912, T13, T11); + ro[WS(os, 9)] = FMA(KP974927912, T13, T11); + } + { + E T1p, T1r, T1o, T1q; + T1o = FNMS(KP692021471, T1n, T1d); + T1p = FNMS(KP900968867, T1o, T1b); + T1q = FMA(KP554958132, T1j, T1i); + T1r = FNMS(KP801937735, T1q, T1k); + io[WS(os, 5)] = FNMS(KP974927912, T1r, T1p); + io[WS(os, 9)] = FMA(KP974927912, T1r, T1p); + } + { + E T16, T18, T15, T17; + T15 = FNMS(KP692021471, T14, Ta); + T16 = FNMS(KP900968867, T15, T3); + T17 = FNMS(KP554958132, TP, TI); + T18 = FNMS(KP801937735, T17, TW); + ro[WS(os, 11)] = FNMS(KP974927912, T18, T16); + ro[WS(os, 3)] = FMA(KP974927912, T18, T16); + } + { + E T1h, T1m, T1g, T1l; + T1g = FNMS(KP692021471, T1f, T1c); + T1h = FNMS(KP900968867, T1g, T1b); + T1l = FNMS(KP554958132, T1k, T1j); + T1m = FNMS(KP801937735, T1l, T1i); + io[WS(os, 3)] = FMA(KP974927912, T1m, T1h); + io[WS(os, 11)] = FNMS(KP974927912, T1m, T1h); + } + { + E T1J, T1O, T1I, T1N; + T1I = FNMS(KP692021471, T1H, T1A); + T1J = FNMS(KP900968867, T1I, T1x); + T1N = FMA(KP554958132, T1M, T1L); + T1O = FNMS(KP801937735, T1N, T1K); + io[WS(os, 4)] = FMA(KP974927912, T1O, T1J); + io[WS(os, 10)] = FNMS(KP974927912, T1O, T1J); + } + { + E T2e, T2g, T2d, T2f; + T2d = FNMS(KP692021471, T2c, Ts); + T2e = FNMS(KP900968867, T2d, Tp); + T2f = FMA(KP554958132, T22, T24); + T2g = FNMS(KP801937735, T2f, T23); + ro[WS(os, 10)] = FNMS(KP974927912, T2g, T2e); + ro[WS(os, 4)] = FMA(KP974927912, T2g, T2e); + } + { + E T1R, T1T, T1Q, T1S; + T1Q = FNMS(KP692021471, T1P, T1D); + T1R = FNMS(KP900968867, T1Q, T1x); + T1S = FMA(KP554958132, T1L, T1K); + T1T = FMA(KP801937735, T1S, T1M); + io[WS(os, 2)] = FMA(KP974927912, T1T, T1R); + io[WS(os, 12)] = FNMS(KP974927912, T1T, T1R); + } + { + E T21, T26, T20, T25; + T20 = FNMS(KP692021471, T1Z, Tv); + T21 = FNMS(KP900968867, T20, Tp); + T25 = FMA(KP554958132, T24, T23); + T26 = FMA(KP801937735, T25, T22); + ro[WS(os, 12)] = FNMS(KP974927912, T26, T21); + ro[WS(os, 2)] = FMA(KP974927912, T26, T21); + } + { + E T1W, T1Y, T1V, T1X; + T1V = FNMS(KP692021471, T1U, T1G); + T1W = FNMS(KP900968867, T1V, T1x); + T1X = FNMS(KP554958132, T1K, T1M); + T1Y = FNMS(KP801937735, T1X, T1L); + io[WS(os, 6)] = FMA(KP974927912, T1Y, T1W); + io[WS(os, 8)] = FNMS(KP974927912, T1Y, T1W); + } + { + E T29, T2b, T28, T2a; + T28 = FNMS(KP692021471, T27, Ty); + T29 = FNMS(KP900968867, T28, Tp); + T2a = FNMS(KP554958132, T23, T22); + T2b = FNMS(KP801937735, T2a, T24); + ro[WS(os, 8)] = FNMS(KP974927912, T2b, T29); + ro[WS(os, 6)] = FMA(KP974927912, T2b, T29); + } + } + } +} + +static const kdft_desc desc = { 14, "n1_14", {64, 0, 84, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_14) (planner *p) { + X(kdft_register) (p, n1_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 14 -name n1_14 -include dft/scalar/n.h */ + +/* + * This function contains 148 FP additions, 72 FP multiplications, + * (or, 100 additions, 24 multiplications, 48 fused multiply/add), + * 43 stack variables, 6 constants, and 56 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(56, is), MAKE_VOLATILE_STRIDE(56, os)) { + E T3, Tp, T16, T1f, Ta, T1q, Ts, T10, TG, T1z, T19, T1i, Th, T1s, Tv; + E T12, TU, T1B, T17, T1o, To, T1r, Ty, T11, TN, T1A, T18, T1l; + { + E T1, T2, T14, T15; + T1 = ri[0]; + T2 = ri[WS(is, 7)]; + T3 = T1 - T2; + Tp = T1 + T2; + T14 = ii[0]; + T15 = ii[WS(is, 7)]; + T16 = T14 - T15; + T1f = T14 + T15; + } + { + E T6, Tq, T9, Tr; + { + E T4, T5, T7, T8; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 9)]; + T6 = T4 - T5; + Tq = T4 + T5; + T7 = ri[WS(is, 12)]; + T8 = ri[WS(is, 5)]; + T9 = T7 - T8; + Tr = T7 + T8; + } + Ta = T6 + T9; + T1q = Tr - Tq; + Ts = Tq + Tr; + T10 = T9 - T6; + } + { + E TC, T1g, TF, T1h; + { + E TA, TB, TD, TE; + TA = ii[WS(is, 2)]; + TB = ii[WS(is, 9)]; + TC = TA - TB; + T1g = TA + TB; + TD = ii[WS(is, 12)]; + TE = ii[WS(is, 5)]; + TF = TD - TE; + T1h = TD + TE; + } + TG = TC - TF; + T1z = T1g - T1h; + T19 = TC + TF; + T1i = T1g + T1h; + } + { + E Td, Tt, Tg, Tu; + { + E Tb, Tc, Te, Tf; + Tb = ri[WS(is, 4)]; + Tc = ri[WS(is, 11)]; + Td = Tb - Tc; + Tt = Tb + Tc; + Te = ri[WS(is, 10)]; + Tf = ri[WS(is, 3)]; + Tg = Te - Tf; + Tu = Te + Tf; + } + Th = Td + Tg; + T1s = Tt - Tu; + Tv = Tt + Tu; + T12 = Tg - Td; + } + { + E TQ, T1m, TT, T1n; + { + E TO, TP, TR, TS; + TO = ii[WS(is, 4)]; + TP = ii[WS(is, 11)]; + TQ = TO - TP; + T1m = TO + TP; + TR = ii[WS(is, 10)]; + TS = ii[WS(is, 3)]; + TT = TR - TS; + T1n = TR + TS; + } + TU = TQ - TT; + T1B = T1n - T1m; + T17 = TQ + TT; + T1o = T1m + T1n; + } + { + E Tk, Tw, Tn, Tx; + { + E Ti, Tj, Tl, Tm; + Ti = ri[WS(is, 6)]; + Tj = ri[WS(is, 13)]; + Tk = Ti - Tj; + Tw = Ti + Tj; + Tl = ri[WS(is, 8)]; + Tm = ri[WS(is, 1)]; + Tn = Tl - Tm; + Tx = Tl + Tm; + } + To = Tk + Tn; + T1r = Tw - Tx; + Ty = Tw + Tx; + T11 = Tn - Tk; + } + { + E TJ, T1j, TM, T1k; + { + E TH, TI, TK, TL; + TH = ii[WS(is, 6)]; + TI = ii[WS(is, 13)]; + TJ = TH - TI; + T1j = TH + TI; + TK = ii[WS(is, 8)]; + TL = ii[WS(is, 1)]; + TM = TK - TL; + T1k = TK + TL; + } + TN = TJ - TM; + T1A = T1k - T1j; + T18 = TJ + TM; + T1l = T1j + T1k; + } + ro[WS(os, 7)] = T3 + Ta + Th + To; + io[WS(os, 7)] = T16 + T19 + T17 + T18; + ro[0] = Tp + Ts + Tv + Ty; + io[0] = T1f + T1i + T1o + T1l; + { + E TV, Tz, T1e, T1d; + TV = FNMS(KP781831482, TN, KP974927912 * TG) - (KP433883739 * TU); + Tz = FMA(KP623489801, To, T3) + FNMA(KP900968867, Th, KP222520933 * Ta); + ro[WS(os, 5)] = Tz - TV; + ro[WS(os, 9)] = Tz + TV; + T1e = FNMS(KP781831482, T11, KP974927912 * T10) - (KP433883739 * T12); + T1d = FMA(KP623489801, T18, T16) + FNMA(KP900968867, T17, KP222520933 * T19); + io[WS(os, 5)] = T1d - T1e; + io[WS(os, 9)] = T1e + T1d; + } + { + E TX, TW, T1b, T1c; + TX = FMA(KP781831482, TG, KP974927912 * TU) + (KP433883739 * TN); + TW = FMA(KP623489801, Ta, T3) + FNMA(KP900968867, To, KP222520933 * Th); + ro[WS(os, 13)] = TW - TX; + ro[WS(os, 1)] = TW + TX; + T1b = FMA(KP781831482, T10, KP974927912 * T12) + (KP433883739 * T11); + T1c = FMA(KP623489801, T19, T16) + FNMA(KP900968867, T18, KP222520933 * T17); + io[WS(os, 1)] = T1b + T1c; + io[WS(os, 13)] = T1c - T1b; + } + { + E TZ, TY, T13, T1a; + TZ = FMA(KP433883739, TG, KP974927912 * TN) - (KP781831482 * TU); + TY = FMA(KP623489801, Th, T3) + FNMA(KP222520933, To, KP900968867 * Ta); + ro[WS(os, 11)] = TY - TZ; + ro[WS(os, 3)] = TY + TZ; + T13 = FMA(KP433883739, T10, KP974927912 * T11) - (KP781831482 * T12); + T1a = FMA(KP623489801, T17, T16) + FNMA(KP222520933, T18, KP900968867 * T19); + io[WS(os, 3)] = T13 + T1a; + io[WS(os, 11)] = T1a - T13; + } + { + E T1t, T1p, T1C, T1y; + T1t = FNMS(KP433883739, T1r, KP781831482 * T1q) - (KP974927912 * T1s); + T1p = FMA(KP623489801, T1i, T1f) + FNMA(KP900968867, T1l, KP222520933 * T1o); + io[WS(os, 6)] = T1p - T1t; + io[WS(os, 8)] = T1t + T1p; + T1C = FNMS(KP433883739, T1A, KP781831482 * T1z) - (KP974927912 * T1B); + T1y = FMA(KP623489801, Ts, Tp) + FNMA(KP900968867, Ty, KP222520933 * Tv); + ro[WS(os, 6)] = T1y - T1C; + ro[WS(os, 8)] = T1y + T1C; + } + { + E T1v, T1u, T1E, T1D; + T1v = FMA(KP433883739, T1q, KP781831482 * T1s) - (KP974927912 * T1r); + T1u = FMA(KP623489801, T1o, T1f) + FNMA(KP222520933, T1l, KP900968867 * T1i); + io[WS(os, 4)] = T1u - T1v; + io[WS(os, 10)] = T1v + T1u; + T1E = FMA(KP433883739, T1z, KP781831482 * T1B) - (KP974927912 * T1A); + T1D = FMA(KP623489801, Tv, Tp) + FNMA(KP222520933, Ty, KP900968867 * Ts); + ro[WS(os, 4)] = T1D - T1E; + ro[WS(os, 10)] = T1D + T1E; + } + { + E T1w, T1x, T1G, T1F; + T1w = FMA(KP974927912, T1q, KP433883739 * T1s) + (KP781831482 * T1r); + T1x = FMA(KP623489801, T1l, T1f) + FNMA(KP900968867, T1o, KP222520933 * T1i); + io[WS(os, 2)] = T1w + T1x; + io[WS(os, 12)] = T1x - T1w; + T1G = FMA(KP974927912, T1z, KP433883739 * T1B) + (KP781831482 * T1A); + T1F = FMA(KP623489801, Ty, Tp) + FNMA(KP900968867, Tv, KP222520933 * Ts); + ro[WS(os, 12)] = T1F - T1G; + ro[WS(os, 2)] = T1F + T1G; + } + } + } +} + +static const kdft_desc desc = { 14, "n1_14", {100, 24, 48, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_14) (planner *p) { + X(kdft_register) (p, n1_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_15.c new file mode 100644 index 000000000..c5703ae53 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_15.c @@ -0,0 +1,556 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 15 -name n1_15 -include dft/scalar/n.h */ + +/* + * This function contains 156 FP additions, 84 FP multiplications, + * (or, 72 additions, 0 multiplications, 84 fused multiply/add), + * 69 stack variables, 6 constants, and 60 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_15(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(60, is), MAKE_VOLATILE_STRIDE(60, os)) { + E T5, T2l, Tx, TV, T1z, T1X, Tl, Tq, Tr, TN, TS, TT, T2c, T2d, T2n; + E T1O, T1P, T1Z, T1l, T1q, T1B, TZ, T10, T11, Ta, Tf, Tg, TC, TH, TI; + E T2f, T2g, T2m, T1R, T1S, T1Y, T1a, T1f, T1A, TW, TX, TY; + { + E T1, T1v, T4, T1y, Tw, T1w, Tt, T1x; + T1 = ri[0]; + T1v = ii[0]; + { + E T2, T3, Tu, Tv; + T2 = ri[WS(is, 5)]; + T3 = ri[WS(is, 10)]; + T4 = T2 + T3; + T1y = T3 - T2; + Tu = ii[WS(is, 5)]; + Tv = ii[WS(is, 10)]; + Tw = Tu - Tv; + T1w = Tu + Tv; + } + T5 = T1 + T4; + T2l = T1v + T1w; + Tt = FNMS(KP500000000, T4, T1); + Tx = FNMS(KP866025403, Tw, Tt); + TV = FMA(KP866025403, Tw, Tt); + T1x = FNMS(KP500000000, T1w, T1v); + T1z = FMA(KP866025403, T1y, T1x); + T1X = FNMS(KP866025403, T1y, T1x); + } + { + E Th, Tk, TJ, T1k, T1h, T1i, TM, T1j, Tm, Tp, TO, T1p, T1m, T1n, TR; + E T1o; + { + E Ti, Tj, TK, TL; + Th = ri[WS(is, 6)]; + Ti = ri[WS(is, 11)]; + Tj = ri[WS(is, 1)]; + Tk = Ti + Tj; + TJ = FNMS(KP500000000, Tk, Th); + T1k = Tj - Ti; + T1h = ii[WS(is, 6)]; + TK = ii[WS(is, 11)]; + TL = ii[WS(is, 1)]; + T1i = TK + TL; + TM = TK - TL; + T1j = FNMS(KP500000000, T1i, T1h); + } + { + E Tn, To, TP, TQ; + Tm = ri[WS(is, 9)]; + Tn = ri[WS(is, 14)]; + To = ri[WS(is, 4)]; + Tp = Tn + To; + TO = FNMS(KP500000000, Tp, Tm); + T1p = To - Tn; + T1m = ii[WS(is, 9)]; + TP = ii[WS(is, 14)]; + TQ = ii[WS(is, 4)]; + T1n = TP + TQ; + TR = TP - TQ; + T1o = FNMS(KP500000000, T1n, T1m); + } + Tl = Th + Tk; + Tq = Tm + Tp; + Tr = Tl + Tq; + TN = FNMS(KP866025403, TM, TJ); + TS = FNMS(KP866025403, TR, TO); + TT = TN + TS; + T2c = T1h + T1i; + T2d = T1m + T1n; + T2n = T2c + T2d; + T1O = FNMS(KP866025403, T1k, T1j); + T1P = FNMS(KP866025403, T1p, T1o); + T1Z = T1O + T1P; + T1l = FMA(KP866025403, T1k, T1j); + T1q = FMA(KP866025403, T1p, T1o); + T1B = T1l + T1q; + TZ = FMA(KP866025403, TM, TJ); + T10 = FMA(KP866025403, TR, TO); + T11 = TZ + T10; + } + { + E T6, T9, Ty, T19, T16, T17, TB, T18, Tb, Te, TD, T1e, T1b, T1c, TG; + E T1d; + { + E T7, T8, Tz, TA; + T6 = ri[WS(is, 3)]; + T7 = ri[WS(is, 8)]; + T8 = ri[WS(is, 13)]; + T9 = T7 + T8; + Ty = FNMS(KP500000000, T9, T6); + T19 = T8 - T7; + T16 = ii[WS(is, 3)]; + Tz = ii[WS(is, 8)]; + TA = ii[WS(is, 13)]; + T17 = Tz + TA; + TB = Tz - TA; + T18 = FNMS(KP500000000, T17, T16); + } + { + E Tc, Td, TE, TF; + Tb = ri[WS(is, 12)]; + Tc = ri[WS(is, 2)]; + Td = ri[WS(is, 7)]; + Te = Tc + Td; + TD = FNMS(KP500000000, Te, Tb); + T1e = Td - Tc; + T1b = ii[WS(is, 12)]; + TE = ii[WS(is, 2)]; + TF = ii[WS(is, 7)]; + T1c = TE + TF; + TG = TE - TF; + T1d = FNMS(KP500000000, T1c, T1b); + } + Ta = T6 + T9; + Tf = Tb + Te; + Tg = Ta + Tf; + TC = FNMS(KP866025403, TB, Ty); + TH = FNMS(KP866025403, TG, TD); + TI = TC + TH; + T2f = T16 + T17; + T2g = T1b + T1c; + T2m = T2f + T2g; + T1R = FNMS(KP866025403, T19, T18); + T1S = FNMS(KP866025403, T1e, T1d); + T1Y = T1R + T1S; + T1a = FMA(KP866025403, T19, T18); + T1f = FMA(KP866025403, T1e, T1d); + T1A = T1a + T1f; + TW = FMA(KP866025403, TB, Ty); + TX = FMA(KP866025403, TG, TD); + TY = TW + TX; + } + { + E T2a, Ts, T29, T2i, T2k, T2e, T2h, T2j, T2b; + T2a = Tg - Tr; + Ts = Tg + Tr; + T29 = FNMS(KP250000000, Ts, T5); + T2e = T2c - T2d; + T2h = T2f - T2g; + T2i = FNMS(KP618033988, T2h, T2e); + T2k = FMA(KP618033988, T2e, T2h); + ro[0] = T5 + Ts; + T2j = FMA(KP559016994, T2a, T29); + ro[WS(os, 9)] = FNMS(KP951056516, T2k, T2j); + ro[WS(os, 6)] = FMA(KP951056516, T2k, T2j); + T2b = FNMS(KP559016994, T2a, T29); + ro[WS(os, 12)] = FNMS(KP951056516, T2i, T2b); + ro[WS(os, 3)] = FMA(KP951056516, T2i, T2b); + } + { + E T2q, T2o, T2p, T2u, T2w, T2s, T2t, T2v, T2r; + T2q = T2m - T2n; + T2o = T2m + T2n; + T2p = FNMS(KP250000000, T2o, T2l); + T2s = Tl - Tq; + T2t = Ta - Tf; + T2u = FNMS(KP618033988, T2t, T2s); + T2w = FMA(KP618033988, T2s, T2t); + io[0] = T2l + T2o; + T2v = FMA(KP559016994, T2q, T2p); + io[WS(os, 6)] = FNMS(KP951056516, T2w, T2v); + io[WS(os, 9)] = FMA(KP951056516, T2w, T2v); + T2r = FNMS(KP559016994, T2q, T2p); + io[WS(os, 3)] = FNMS(KP951056516, T2u, T2r); + io[WS(os, 12)] = FMA(KP951056516, T2u, T2r); + } + { + E T1M, TU, T1L, T1U, T1W, T1Q, T1T, T1V, T1N; + T1M = TI - TT; + TU = TI + TT; + T1L = FNMS(KP250000000, TU, Tx); + T1Q = T1O - T1P; + T1T = T1R - T1S; + T1U = FNMS(KP618033988, T1T, T1Q); + T1W = FMA(KP618033988, T1Q, T1T); + ro[WS(os, 5)] = Tx + TU; + T1V = FMA(KP559016994, T1M, T1L); + ro[WS(os, 14)] = FNMS(KP951056516, T1W, T1V); + ro[WS(os, 11)] = FMA(KP951056516, T1W, T1V); + T1N = FNMS(KP559016994, T1M, T1L); + ro[WS(os, 2)] = FNMS(KP951056516, T1U, T1N); + ro[WS(os, 8)] = FMA(KP951056516, T1U, T1N); + } + { + E T22, T20, T21, T26, T28, T24, T25, T27, T23; + T22 = T1Y - T1Z; + T20 = T1Y + T1Z; + T21 = FNMS(KP250000000, T20, T1X); + T24 = TN - TS; + T25 = TC - TH; + T26 = FNMS(KP618033988, T25, T24); + T28 = FMA(KP618033988, T24, T25); + io[WS(os, 5)] = T1X + T20; + T27 = FMA(KP559016994, T22, T21); + io[WS(os, 11)] = FNMS(KP951056516, T28, T27); + io[WS(os, 14)] = FMA(KP951056516, T28, T27); + T23 = FNMS(KP559016994, T22, T21); + io[WS(os, 2)] = FMA(KP951056516, T26, T23); + io[WS(os, 8)] = FNMS(KP951056516, T26, T23); + } + { + E T1E, T1C, T1D, T1I, T1K, T1G, T1H, T1J, T1F; + T1E = T1A - T1B; + T1C = T1A + T1B; + T1D = FNMS(KP250000000, T1C, T1z); + T1G = TW - TX; + T1H = TZ - T10; + T1I = FMA(KP618033988, T1H, T1G); + T1K = FNMS(KP618033988, T1G, T1H); + io[WS(os, 10)] = T1z + T1C; + T1J = FNMS(KP559016994, T1E, T1D); + io[WS(os, 7)] = FMA(KP951056516, T1K, T1J); + io[WS(os, 13)] = FNMS(KP951056516, T1K, T1J); + T1F = FMA(KP559016994, T1E, T1D); + io[WS(os, 1)] = FNMS(KP951056516, T1I, T1F); + io[WS(os, 4)] = FMA(KP951056516, T1I, T1F); + } + { + E T14, T12, T13, T1s, T1u, T1g, T1r, T1t, T15; + T14 = TY - T11; + T12 = TY + T11; + T13 = FNMS(KP250000000, T12, TV); + T1g = T1a - T1f; + T1r = T1l - T1q; + T1s = FMA(KP618033988, T1r, T1g); + T1u = FNMS(KP618033988, T1g, T1r); + ro[WS(os, 10)] = TV + T12; + T1t = FNMS(KP559016994, T14, T13); + ro[WS(os, 7)] = FNMS(KP951056516, T1u, T1t); + ro[WS(os, 13)] = FMA(KP951056516, T1u, T1t); + T15 = FMA(KP559016994, T14, T13); + ro[WS(os, 4)] = FNMS(KP951056516, T1s, T15); + ro[WS(os, 1)] = FMA(KP951056516, T1s, T15); + } + } + } +} + +static const kdft_desc desc = { 15, "n1_15", {72, 0, 84, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_15) (planner *p) { + X(kdft_register) (p, n1_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 15 -name n1_15 -include dft/scalar/n.h */ + +/* + * This function contains 156 FP additions, 56 FP multiplications, + * (or, 128 additions, 28 multiplications, 28 fused multiply/add), + * 69 stack variables, 6 constants, and 60 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_15(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(60, is), MAKE_VOLATILE_STRIDE(60, os)) { + E T5, T2l, Tx, TV, T1C, T20, Tl, Tq, Tr, TN, TS, TT, T2c, T2d, T2n; + E T1O, T1P, T22, T1l, T1q, T1w, TZ, T10, T11, Ta, Tf, Tg, TC, TH, TI; + E T2f, T2g, T2m, T1R, T1S, T21, T1a, T1f, T1v, TW, TX, TY; + { + E T1, T1z, T4, T1y, Tw, T1A, Tt, T1B; + T1 = ri[0]; + T1z = ii[0]; + { + E T2, T3, Tu, Tv; + T2 = ri[WS(is, 5)]; + T3 = ri[WS(is, 10)]; + T4 = T2 + T3; + T1y = KP866025403 * (T3 - T2); + Tu = ii[WS(is, 5)]; + Tv = ii[WS(is, 10)]; + Tw = KP866025403 * (Tu - Tv); + T1A = Tu + Tv; + } + T5 = T1 + T4; + T2l = T1z + T1A; + Tt = FNMS(KP500000000, T4, T1); + Tx = Tt - Tw; + TV = Tt + Tw; + T1B = FNMS(KP500000000, T1A, T1z); + T1C = T1y + T1B; + T20 = T1B - T1y; + } + { + E Th, Tk, TJ, T1h, T1i, T1j, TM, T1k, Tm, Tp, TO, T1m, T1n, T1o, TR; + E T1p; + { + E Ti, Tj, TK, TL; + Th = ri[WS(is, 6)]; + Ti = ri[WS(is, 11)]; + Tj = ri[WS(is, 1)]; + Tk = Ti + Tj; + TJ = FNMS(KP500000000, Tk, Th); + T1h = KP866025403 * (Tj - Ti); + T1i = ii[WS(is, 6)]; + TK = ii[WS(is, 11)]; + TL = ii[WS(is, 1)]; + T1j = TK + TL; + TM = KP866025403 * (TK - TL); + T1k = FNMS(KP500000000, T1j, T1i); + } + { + E Tn, To, TP, TQ; + Tm = ri[WS(is, 9)]; + Tn = ri[WS(is, 14)]; + To = ri[WS(is, 4)]; + Tp = Tn + To; + TO = FNMS(KP500000000, Tp, Tm); + T1m = KP866025403 * (To - Tn); + T1n = ii[WS(is, 9)]; + TP = ii[WS(is, 14)]; + TQ = ii[WS(is, 4)]; + T1o = TP + TQ; + TR = KP866025403 * (TP - TQ); + T1p = FNMS(KP500000000, T1o, T1n); + } + Tl = Th + Tk; + Tq = Tm + Tp; + Tr = Tl + Tq; + TN = TJ - TM; + TS = TO - TR; + TT = TN + TS; + T2c = T1i + T1j; + T2d = T1n + T1o; + T2n = T2c + T2d; + T1O = T1k - T1h; + T1P = T1p - T1m; + T22 = T1O + T1P; + T1l = T1h + T1k; + T1q = T1m + T1p; + T1w = T1l + T1q; + TZ = TJ + TM; + T10 = TO + TR; + T11 = TZ + T10; + } + { + E T6, T9, Ty, T16, T17, T18, TB, T19, Tb, Te, TD, T1b, T1c, T1d, TG; + E T1e; + { + E T7, T8, Tz, TA; + T6 = ri[WS(is, 3)]; + T7 = ri[WS(is, 8)]; + T8 = ri[WS(is, 13)]; + T9 = T7 + T8; + Ty = FNMS(KP500000000, T9, T6); + T16 = KP866025403 * (T8 - T7); + T17 = ii[WS(is, 3)]; + Tz = ii[WS(is, 8)]; + TA = ii[WS(is, 13)]; + T18 = Tz + TA; + TB = KP866025403 * (Tz - TA); + T19 = FNMS(KP500000000, T18, T17); + } + { + E Tc, Td, TE, TF; + Tb = ri[WS(is, 12)]; + Tc = ri[WS(is, 2)]; + Td = ri[WS(is, 7)]; + Te = Tc + Td; + TD = FNMS(KP500000000, Te, Tb); + T1b = KP866025403 * (Td - Tc); + T1c = ii[WS(is, 12)]; + TE = ii[WS(is, 2)]; + TF = ii[WS(is, 7)]; + T1d = TE + TF; + TG = KP866025403 * (TE - TF); + T1e = FNMS(KP500000000, T1d, T1c); + } + Ta = T6 + T9; + Tf = Tb + Te; + Tg = Ta + Tf; + TC = Ty - TB; + TH = TD - TG; + TI = TC + TH; + T2f = T17 + T18; + T2g = T1c + T1d; + T2m = T2f + T2g; + T1R = T19 - T16; + T1S = T1e - T1b; + T21 = T1R + T1S; + T1a = T16 + T19; + T1f = T1b + T1e; + T1v = T1a + T1f; + TW = Ty + TB; + TX = TD + TG; + TY = TW + TX; + } + { + E T2a, Ts, T29, T2i, T2k, T2e, T2h, T2j, T2b; + T2a = KP559016994 * (Tg - Tr); + Ts = Tg + Tr; + T29 = FNMS(KP250000000, Ts, T5); + T2e = T2c - T2d; + T2h = T2f - T2g; + T2i = FNMS(KP587785252, T2h, KP951056516 * T2e); + T2k = FMA(KP951056516, T2h, KP587785252 * T2e); + ro[0] = T5 + Ts; + T2j = T2a + T29; + ro[WS(os, 9)] = T2j - T2k; + ro[WS(os, 6)] = T2j + T2k; + T2b = T29 - T2a; + ro[WS(os, 12)] = T2b - T2i; + ro[WS(os, 3)] = T2b + T2i; + } + { + E T2q, T2o, T2p, T2u, T2w, T2s, T2t, T2v, T2r; + T2q = KP559016994 * (T2m - T2n); + T2o = T2m + T2n; + T2p = FNMS(KP250000000, T2o, T2l); + T2s = Tl - Tq; + T2t = Ta - Tf; + T2u = FNMS(KP587785252, T2t, KP951056516 * T2s); + T2w = FMA(KP951056516, T2t, KP587785252 * T2s); + io[0] = T2l + T2o; + T2v = T2q + T2p; + io[WS(os, 6)] = T2v - T2w; + io[WS(os, 9)] = T2w + T2v; + T2r = T2p - T2q; + io[WS(os, 3)] = T2r - T2u; + io[WS(os, 12)] = T2u + T2r; + } + { + E T1M, TU, T1L, T1U, T1W, T1Q, T1T, T1V, T1N; + T1M = KP559016994 * (TI - TT); + TU = TI + TT; + T1L = FNMS(KP250000000, TU, Tx); + T1Q = T1O - T1P; + T1T = T1R - T1S; + T1U = FNMS(KP587785252, T1T, KP951056516 * T1Q); + T1W = FMA(KP951056516, T1T, KP587785252 * T1Q); + ro[WS(os, 5)] = Tx + TU; + T1V = T1M + T1L; + ro[WS(os, 14)] = T1V - T1W; + ro[WS(os, 11)] = T1V + T1W; + T1N = T1L - T1M; + ro[WS(os, 2)] = T1N - T1U; + ro[WS(os, 8)] = T1N + T1U; + } + { + E T25, T23, T24, T1Z, T28, T1X, T1Y, T27, T26; + T25 = KP559016994 * (T21 - T22); + T23 = T21 + T22; + T24 = FNMS(KP250000000, T23, T20); + T1X = TN - TS; + T1Y = TC - TH; + T1Z = FNMS(KP587785252, T1Y, KP951056516 * T1X); + T28 = FMA(KP951056516, T1Y, KP587785252 * T1X); + io[WS(os, 5)] = T20 + T23; + T27 = T25 + T24; + io[WS(os, 11)] = T27 - T28; + io[WS(os, 14)] = T28 + T27; + T26 = T24 - T25; + io[WS(os, 2)] = T1Z + T26; + io[WS(os, 8)] = T26 - T1Z; + } + { + E T1x, T1D, T1E, T1I, T1J, T1G, T1H, T1K, T1F; + T1x = KP559016994 * (T1v - T1w); + T1D = T1v + T1w; + T1E = FNMS(KP250000000, T1D, T1C); + T1G = TW - TX; + T1H = TZ - T10; + T1I = FMA(KP951056516, T1G, KP587785252 * T1H); + T1J = FNMS(KP587785252, T1G, KP951056516 * T1H); + io[WS(os, 10)] = T1C + T1D; + T1K = T1E - T1x; + io[WS(os, 7)] = T1J + T1K; + io[WS(os, 13)] = T1K - T1J; + T1F = T1x + T1E; + io[WS(os, 1)] = T1F - T1I; + io[WS(os, 4)] = T1I + T1F; + } + { + E T13, T12, T14, T1s, T1u, T1g, T1r, T1t, T15; + T13 = KP559016994 * (TY - T11); + T12 = TY + T11; + T14 = FNMS(KP250000000, T12, TV); + T1g = T1a - T1f; + T1r = T1l - T1q; + T1s = FMA(KP951056516, T1g, KP587785252 * T1r); + T1u = FNMS(KP587785252, T1g, KP951056516 * T1r); + ro[WS(os, 10)] = TV + T12; + T1t = T14 - T13; + ro[WS(os, 7)] = T1t - T1u; + ro[WS(os, 13)] = T1t + T1u; + T15 = T13 + T14; + ro[WS(os, 4)] = T15 - T1s; + ro[WS(os, 1)] = T15 + T1s; + } + } + } +} + +static const kdft_desc desc = { 15, "n1_15", {128, 28, 28, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_15) (planner *p) { + X(kdft_register) (p, n1_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_16.c new file mode 100644 index 000000000..5f7d00d43 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_16.c @@ -0,0 +1,562 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -name n1_16 -include dft/scalar/n.h */ + +/* + * This function contains 144 FP additions, 40 FP multiplications, + * (or, 104 additions, 0 multiplications, 40 fused multiply/add), + * 50 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + E T7, T1R, T25, TC, TN, T1x, T1H, T1l, Tt, T22, T2h, T1b, T1g, T1E, T1Z; + E T1D, Te, T1S, T26, TJ, TQ, T1m, T1n, TT, Tm, T1X, T2g, T10, T15, T1B; + E T1U, T1A; + { + E T3, TL, Ty, T1k, T6, T1j, TB, TM; + { + E T1, T2, Tw, Tx; + T1 = ri[0]; + T2 = ri[WS(is, 8)]; + T3 = T1 + T2; + TL = T1 - T2; + Tw = ii[0]; + Tx = ii[WS(is, 8)]; + Ty = Tw + Tx; + T1k = Tw - Tx; + } + { + E T4, T5, Tz, TA; + T4 = ri[WS(is, 4)]; + T5 = ri[WS(is, 12)]; + T6 = T4 + T5; + T1j = T4 - T5; + Tz = ii[WS(is, 4)]; + TA = ii[WS(is, 12)]; + TB = Tz + TA; + TM = Tz - TA; + } + T7 = T3 + T6; + T1R = T3 - T6; + T25 = Ty - TB; + TC = Ty + TB; + TN = TL - TM; + T1x = TL + TM; + T1H = T1k - T1j; + T1l = T1j + T1k; + } + { + E Tp, T1c, T1a, T20, Ts, T17, T1f, T21; + { + E Tn, To, T18, T19; + Tn = ri[WS(is, 15)]; + To = ri[WS(is, 7)]; + Tp = Tn + To; + T1c = Tn - To; + T18 = ii[WS(is, 15)]; + T19 = ii[WS(is, 7)]; + T1a = T18 - T19; + T20 = T18 + T19; + } + { + E Tq, Tr, T1d, T1e; + Tq = ri[WS(is, 3)]; + Tr = ri[WS(is, 11)]; + Ts = Tq + Tr; + T17 = Tq - Tr; + T1d = ii[WS(is, 3)]; + T1e = ii[WS(is, 11)]; + T1f = T1d - T1e; + T21 = T1d + T1e; + } + Tt = Tp + Ts; + T22 = T20 - T21; + T2h = T20 + T21; + T1b = T17 + T1a; + T1g = T1c - T1f; + T1E = T1a - T17; + T1Z = Tp - Ts; + T1D = T1c + T1f; + } + { + E Ta, TP, TF, TO, Td, TR, TI, TS; + { + E T8, T9, TD, TE; + T8 = ri[WS(is, 2)]; + T9 = ri[WS(is, 10)]; + Ta = T8 + T9; + TP = T8 - T9; + TD = ii[WS(is, 2)]; + TE = ii[WS(is, 10)]; + TF = TD + TE; + TO = TD - TE; + } + { + E Tb, Tc, TG, TH; + Tb = ri[WS(is, 14)]; + Tc = ri[WS(is, 6)]; + Td = Tb + Tc; + TR = Tb - Tc; + TG = ii[WS(is, 14)]; + TH = ii[WS(is, 6)]; + TI = TG + TH; + TS = TG - TH; + } + Te = Ta + Td; + T1S = TF - TI; + T26 = Td - Ta; + TJ = TF + TI; + TQ = TO - TP; + T1m = TR - TS; + T1n = TP + TO; + TT = TR + TS; + } + { + E Ti, T11, TZ, T1V, Tl, TW, T14, T1W; + { + E Tg, Th, TX, TY; + Tg = ri[WS(is, 1)]; + Th = ri[WS(is, 9)]; + Ti = Tg + Th; + T11 = Tg - Th; + TX = ii[WS(is, 1)]; + TY = ii[WS(is, 9)]; + TZ = TX - TY; + T1V = TX + TY; + } + { + E Tj, Tk, T12, T13; + Tj = ri[WS(is, 5)]; + Tk = ri[WS(is, 13)]; + Tl = Tj + Tk; + TW = Tj - Tk; + T12 = ii[WS(is, 5)]; + T13 = ii[WS(is, 13)]; + T14 = T12 - T13; + T1W = T12 + T13; + } + Tm = Ti + Tl; + T1X = T1V - T1W; + T2g = T1V + T1W; + T10 = TW + TZ; + T15 = T11 - T14; + T1B = TZ - TW; + T1U = Ti - Tl; + T1A = T11 + T14; + } + { + E Tf, Tu, T2j, T2k; + Tf = T7 + Te; + Tu = Tm + Tt; + ro[WS(os, 8)] = Tf - Tu; + ro[0] = Tf + Tu; + T2j = TC + TJ; + T2k = T2g + T2h; + io[WS(os, 8)] = T2j - T2k; + io[0] = T2j + T2k; + } + { + E Tv, TK, T2f, T2i; + Tv = Tt - Tm; + TK = TC - TJ; + io[WS(os, 4)] = Tv + TK; + io[WS(os, 12)] = TK - Tv; + T2f = T7 - Te; + T2i = T2g - T2h; + ro[WS(os, 12)] = T2f - T2i; + ro[WS(os, 4)] = T2f + T2i; + } + { + E T1T, T27, T24, T28, T1Y, T23; + T1T = T1R + T1S; + T27 = T25 - T26; + T1Y = T1U + T1X; + T23 = T1Z - T22; + T24 = T1Y + T23; + T28 = T23 - T1Y; + ro[WS(os, 10)] = FNMS(KP707106781, T24, T1T); + io[WS(os, 6)] = FMA(KP707106781, T28, T27); + ro[WS(os, 2)] = FMA(KP707106781, T24, T1T); + io[WS(os, 14)] = FNMS(KP707106781, T28, T27); + } + { + E T29, T2d, T2c, T2e, T2a, T2b; + T29 = T1R - T1S; + T2d = T26 + T25; + T2a = T1X - T1U; + T2b = T1Z + T22; + T2c = T2a - T2b; + T2e = T2a + T2b; + ro[WS(os, 14)] = FNMS(KP707106781, T2c, T29); + io[WS(os, 2)] = FMA(KP707106781, T2e, T2d); + ro[WS(os, 6)] = FMA(KP707106781, T2c, T29); + io[WS(os, 10)] = FNMS(KP707106781, T2e, T2d); + } + { + E TV, T1v, T1p, T1r, T1i, T1q, T1u, T1w, TU, T1o; + TU = TQ - TT; + TV = FMA(KP707106781, TU, TN); + T1v = FNMS(KP707106781, TU, TN); + T1o = T1m - T1n; + T1p = FNMS(KP707106781, T1o, T1l); + T1r = FMA(KP707106781, T1o, T1l); + { + E T16, T1h, T1s, T1t; + T16 = FMA(KP414213562, T15, T10); + T1h = FNMS(KP414213562, T1g, T1b); + T1i = T16 - T1h; + T1q = T16 + T1h; + T1s = FMA(KP414213562, T1b, T1g); + T1t = FNMS(KP414213562, T10, T15); + T1u = T1s - T1t; + T1w = T1t + T1s; + } + ro[WS(os, 11)] = FNMS(KP923879532, T1i, TV); + io[WS(os, 11)] = FNMS(KP923879532, T1u, T1r); + ro[WS(os, 3)] = FMA(KP923879532, T1i, TV); + io[WS(os, 3)] = FMA(KP923879532, T1u, T1r); + io[WS(os, 7)] = FNMS(KP923879532, T1q, T1p); + ro[WS(os, 7)] = FNMS(KP923879532, T1w, T1v); + io[WS(os, 15)] = FMA(KP923879532, T1q, T1p); + ro[WS(os, 15)] = FMA(KP923879532, T1w, T1v); + } + { + E T1z, T1L, T1J, T1P, T1G, T1K, T1O, T1Q, T1y, T1I; + T1y = T1n + T1m; + T1z = FMA(KP707106781, T1y, T1x); + T1L = FNMS(KP707106781, T1y, T1x); + T1I = TQ + TT; + T1J = FNMS(KP707106781, T1I, T1H); + T1P = FMA(KP707106781, T1I, T1H); + { + E T1C, T1F, T1M, T1N; + T1C = FMA(KP414213562, T1B, T1A); + T1F = FNMS(KP414213562, T1E, T1D); + T1G = T1C + T1F; + T1K = T1F - T1C; + T1M = FNMS(KP414213562, T1A, T1B); + T1N = FMA(KP414213562, T1D, T1E); + T1O = T1M - T1N; + T1Q = T1M + T1N; + } + ro[WS(os, 9)] = FNMS(KP923879532, T1G, T1z); + io[WS(os, 9)] = FNMS(KP923879532, T1Q, T1P); + ro[WS(os, 1)] = FMA(KP923879532, T1G, T1z); + io[WS(os, 1)] = FMA(KP923879532, T1Q, T1P); + io[WS(os, 13)] = FNMS(KP923879532, T1K, T1J); + ro[WS(os, 13)] = FNMS(KP923879532, T1O, T1L); + io[WS(os, 5)] = FMA(KP923879532, T1K, T1J); + ro[WS(os, 5)] = FMA(KP923879532, T1O, T1L); + } + } + } +} + +static const kdft_desc desc = { 16, "n1_16", {104, 0, 40, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_16) (planner *p) { + X(kdft_register) (p, n1_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 16 -name n1_16 -include dft/scalar/n.h */ + +/* + * This function contains 144 FP additions, 24 FP multiplications, + * (or, 136 additions, 16 multiplications, 8 fused multiply/add), + * 50 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + E T7, T1R, T25, TC, TN, T1x, T1H, T1l, Tt, T22, T2h, T1b, T1g, T1E, T1Z; + E T1D, Te, T1S, T26, TJ, TQ, T1m, T1n, TT, Tm, T1X, T2g, T10, T15, T1B; + E T1U, T1A; + { + E T3, TL, Ty, T1k, T6, T1j, TB, TM; + { + E T1, T2, Tw, Tx; + T1 = ri[0]; + T2 = ri[WS(is, 8)]; + T3 = T1 + T2; + TL = T1 - T2; + Tw = ii[0]; + Tx = ii[WS(is, 8)]; + Ty = Tw + Tx; + T1k = Tw - Tx; + } + { + E T4, T5, Tz, TA; + T4 = ri[WS(is, 4)]; + T5 = ri[WS(is, 12)]; + T6 = T4 + T5; + T1j = T4 - T5; + Tz = ii[WS(is, 4)]; + TA = ii[WS(is, 12)]; + TB = Tz + TA; + TM = Tz - TA; + } + T7 = T3 + T6; + T1R = T3 - T6; + T25 = Ty - TB; + TC = Ty + TB; + TN = TL - TM; + T1x = TL + TM; + T1H = T1k - T1j; + T1l = T1j + T1k; + } + { + E Tp, T17, T1f, T20, Ts, T1c, T1a, T21; + { + E Tn, To, T1d, T1e; + Tn = ri[WS(is, 15)]; + To = ri[WS(is, 7)]; + Tp = Tn + To; + T17 = Tn - To; + T1d = ii[WS(is, 15)]; + T1e = ii[WS(is, 7)]; + T1f = T1d - T1e; + T20 = T1d + T1e; + } + { + E Tq, Tr, T18, T19; + Tq = ri[WS(is, 3)]; + Tr = ri[WS(is, 11)]; + Ts = Tq + Tr; + T1c = Tq - Tr; + T18 = ii[WS(is, 3)]; + T19 = ii[WS(is, 11)]; + T1a = T18 - T19; + T21 = T18 + T19; + } + Tt = Tp + Ts; + T22 = T20 - T21; + T2h = T20 + T21; + T1b = T17 - T1a; + T1g = T1c + T1f; + T1E = T1f - T1c; + T1Z = Tp - Ts; + T1D = T17 + T1a; + } + { + E Ta, TP, TF, TO, Td, TR, TI, TS; + { + E T8, T9, TD, TE; + T8 = ri[WS(is, 2)]; + T9 = ri[WS(is, 10)]; + Ta = T8 + T9; + TP = T8 - T9; + TD = ii[WS(is, 2)]; + TE = ii[WS(is, 10)]; + TF = TD + TE; + TO = TD - TE; + } + { + E Tb, Tc, TG, TH; + Tb = ri[WS(is, 14)]; + Tc = ri[WS(is, 6)]; + Td = Tb + Tc; + TR = Tb - Tc; + TG = ii[WS(is, 14)]; + TH = ii[WS(is, 6)]; + TI = TG + TH; + TS = TG - TH; + } + Te = Ta + Td; + T1S = TF - TI; + T26 = Td - Ta; + TJ = TF + TI; + TQ = TO - TP; + T1m = TR - TS; + T1n = TP + TO; + TT = TR + TS; + } + { + E Ti, T11, TZ, T1V, Tl, TW, T14, T1W; + { + E Tg, Th, TX, TY; + Tg = ri[WS(is, 1)]; + Th = ri[WS(is, 9)]; + Ti = Tg + Th; + T11 = Tg - Th; + TX = ii[WS(is, 1)]; + TY = ii[WS(is, 9)]; + TZ = TX - TY; + T1V = TX + TY; + } + { + E Tj, Tk, T12, T13; + Tj = ri[WS(is, 5)]; + Tk = ri[WS(is, 13)]; + Tl = Tj + Tk; + TW = Tj - Tk; + T12 = ii[WS(is, 5)]; + T13 = ii[WS(is, 13)]; + T14 = T12 - T13; + T1W = T12 + T13; + } + Tm = Ti + Tl; + T1X = T1V - T1W; + T2g = T1V + T1W; + T10 = TW + TZ; + T15 = T11 - T14; + T1B = T11 + T14; + T1U = Ti - Tl; + T1A = TZ - TW; + } + { + E Tf, Tu, T2j, T2k; + Tf = T7 + Te; + Tu = Tm + Tt; + ro[WS(os, 8)] = Tf - Tu; + ro[0] = Tf + Tu; + T2j = TC + TJ; + T2k = T2g + T2h; + io[WS(os, 8)] = T2j - T2k; + io[0] = T2j + T2k; + } + { + E Tv, TK, T2f, T2i; + Tv = Tt - Tm; + TK = TC - TJ; + io[WS(os, 4)] = Tv + TK; + io[WS(os, 12)] = TK - Tv; + T2f = T7 - Te; + T2i = T2g - T2h; + ro[WS(os, 12)] = T2f - T2i; + ro[WS(os, 4)] = T2f + T2i; + } + { + E T1T, T27, T24, T28, T1Y, T23; + T1T = T1R + T1S; + T27 = T25 - T26; + T1Y = T1U + T1X; + T23 = T1Z - T22; + T24 = KP707106781 * (T1Y + T23); + T28 = KP707106781 * (T23 - T1Y); + ro[WS(os, 10)] = T1T - T24; + io[WS(os, 6)] = T27 + T28; + ro[WS(os, 2)] = T1T + T24; + io[WS(os, 14)] = T27 - T28; + } + { + E T29, T2d, T2c, T2e, T2a, T2b; + T29 = T1R - T1S; + T2d = T26 + T25; + T2a = T1X - T1U; + T2b = T1Z + T22; + T2c = KP707106781 * (T2a - T2b); + T2e = KP707106781 * (T2a + T2b); + ro[WS(os, 14)] = T29 - T2c; + io[WS(os, 2)] = T2d + T2e; + ro[WS(os, 6)] = T29 + T2c; + io[WS(os, 10)] = T2d - T2e; + } + { + E TV, T1r, T1p, T1v, T1i, T1q, T1u, T1w, TU, T1o; + TU = KP707106781 * (TQ - TT); + TV = TN + TU; + T1r = TN - TU; + T1o = KP707106781 * (T1m - T1n); + T1p = T1l - T1o; + T1v = T1l + T1o; + { + E T16, T1h, T1s, T1t; + T16 = FMA(KP923879532, T10, KP382683432 * T15); + T1h = FNMS(KP923879532, T1g, KP382683432 * T1b); + T1i = T16 + T1h; + T1q = T1h - T16; + T1s = FNMS(KP923879532, T15, KP382683432 * T10); + T1t = FMA(KP382683432, T1g, KP923879532 * T1b); + T1u = T1s - T1t; + T1w = T1s + T1t; + } + ro[WS(os, 11)] = TV - T1i; + io[WS(os, 11)] = T1v - T1w; + ro[WS(os, 3)] = TV + T1i; + io[WS(os, 3)] = T1v + T1w; + io[WS(os, 15)] = T1p - T1q; + ro[WS(os, 15)] = T1r - T1u; + io[WS(os, 7)] = T1p + T1q; + ro[WS(os, 7)] = T1r + T1u; + } + { + E T1z, T1L, T1J, T1P, T1G, T1K, T1O, T1Q, T1y, T1I; + T1y = KP707106781 * (T1n + T1m); + T1z = T1x + T1y; + T1L = T1x - T1y; + T1I = KP707106781 * (TQ + TT); + T1J = T1H - T1I; + T1P = T1H + T1I; + { + E T1C, T1F, T1M, T1N; + T1C = FMA(KP382683432, T1A, KP923879532 * T1B); + T1F = FNMS(KP382683432, T1E, KP923879532 * T1D); + T1G = T1C + T1F; + T1K = T1F - T1C; + T1M = FNMS(KP382683432, T1B, KP923879532 * T1A); + T1N = FMA(KP923879532, T1E, KP382683432 * T1D); + T1O = T1M - T1N; + T1Q = T1M + T1N; + } + ro[WS(os, 9)] = T1z - T1G; + io[WS(os, 9)] = T1P - T1Q; + ro[WS(os, 1)] = T1z + T1G; + io[WS(os, 1)] = T1P + T1Q; + io[WS(os, 13)] = T1J - T1K; + ro[WS(os, 13)] = T1L - T1O; + io[WS(os, 5)] = T1J + T1K; + ro[WS(os, 5)] = T1L + T1O; + } + } + } +} + +static const kdft_desc desc = { 16, "n1_16", {136, 16, 8, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_16) (planner *p) { + X(kdft_register) (p, n1_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_2.c new file mode 100644 index 000000000..a71d2d7f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_2.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -name n1_2 -include dft/scalar/n.h */ + +/* + * This function contains 4 FP additions, 0 FP multiplications, + * (or, 4 additions, 0 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + E T1, T2, T3, T4; + T1 = ri[0]; + T2 = ri[WS(is, 1)]; + ro[WS(os, 1)] = T1 - T2; + ro[0] = T1 + T2; + T3 = ii[0]; + T4 = ii[WS(is, 1)]; + io[WS(os, 1)] = T3 - T4; + io[0] = T3 + T4; + } + } +} + +static const kdft_desc desc = { 2, "n1_2", {4, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_2) (planner *p) { + X(kdft_register) (p, n1_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 2 -name n1_2 -include dft/scalar/n.h */ + +/* + * This function contains 4 FP additions, 0 FP multiplications, + * (or, 4 additions, 0 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + E T1, T2, T3, T4; + T1 = ri[0]; + T2 = ri[WS(is, 1)]; + ro[WS(os, 1)] = T1 - T2; + ro[0] = T1 + T2; + T3 = ii[0]; + T4 = ii[WS(is, 1)]; + io[WS(os, 1)] = T3 - T4; + io[0] = T3 + T4; + } + } +} + +static const kdft_desc desc = { 2, "n1_2", {4, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_2) (planner *p) { + X(kdft_register) (p, n1_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_20.c new file mode 100644 index 000000000..06ace634d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_20.c @@ -0,0 +1,720 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -name n1_20 -include dft/scalar/n.h */ + +/* + * This function contains 208 FP additions, 72 FP multiplications, + * (or, 136 additions, 0 multiplications, 72 fused multiply/add), + * 81 stack variables, 4 constants, and 80 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(80, is), MAKE_VOLATILE_STRIDE(80, os)) { + E T7, T2N, T3b, TD, TP, T1R, T2f, T1d, Tt, TA, TB, T2w, T2z, T2P, T35; + E T36, T3d, TH, TI, TJ, T15, T1a, T1b, T1s, T1x, T1T, T29, T2a, T2h, T1h; + E T1i, T1j, Te, Tl, Tm, T2D, T2G, T2O, T32, T33, T3c, TE, TF, TG, TU; + E TZ, T10, T1D, T1I, T1S, T26, T27, T2g, T1e, T1f, T1g; + { + E T3, T1N, TN, T2L, T6, TO, T1Q, T2M; + { + E T1, T2, TL, TM; + T1 = ri[0]; + T2 = ri[WS(is, 10)]; + T3 = T1 + T2; + T1N = T1 - T2; + TL = ii[0]; + TM = ii[WS(is, 10)]; + TN = TL - TM; + T2L = TL + TM; + } + { + E T4, T5, T1O, T1P; + T4 = ri[WS(is, 5)]; + T5 = ri[WS(is, 15)]; + T6 = T4 + T5; + TO = T4 - T5; + T1O = ii[WS(is, 5)]; + T1P = ii[WS(is, 15)]; + T1Q = T1O - T1P; + T2M = T1O + T1P; + } + T7 = T3 - T6; + T2N = T2L - T2M; + T3b = T2L + T2M; + TD = T3 + T6; + TP = TN - TO; + T1R = T1N - T1Q; + T2f = T1N + T1Q; + T1d = TO + TN; + } + { + E Tp, T1o, T13, T2u, Ts, T14, T1r, T2v, Tw, T1t, T18, T2x, Tz, T19, T1w; + E T2y; + { + E Tn, To, T11, T12; + Tn = ri[WS(is, 8)]; + To = ri[WS(is, 18)]; + Tp = Tn + To; + T1o = Tn - To; + T11 = ii[WS(is, 8)]; + T12 = ii[WS(is, 18)]; + T13 = T11 - T12; + T2u = T11 + T12; + } + { + E Tq, Tr, T1p, T1q; + Tq = ri[WS(is, 13)]; + Tr = ri[WS(is, 3)]; + Ts = Tq + Tr; + T14 = Tq - Tr; + T1p = ii[WS(is, 13)]; + T1q = ii[WS(is, 3)]; + T1r = T1p - T1q; + T2v = T1p + T1q; + } + { + E Tu, Tv, T16, T17; + Tu = ri[WS(is, 12)]; + Tv = ri[WS(is, 2)]; + Tw = Tu + Tv; + T1t = Tu - Tv; + T16 = ii[WS(is, 12)]; + T17 = ii[WS(is, 2)]; + T18 = T16 - T17; + T2x = T16 + T17; + } + { + E Tx, Ty, T1u, T1v; + Tx = ri[WS(is, 17)]; + Ty = ri[WS(is, 7)]; + Tz = Tx + Ty; + T19 = Tx - Ty; + T1u = ii[WS(is, 17)]; + T1v = ii[WS(is, 7)]; + T1w = T1u - T1v; + T2y = T1u + T1v; + } + Tt = Tp - Ts; + TA = Tw - Tz; + TB = Tt + TA; + T2w = T2u - T2v; + T2z = T2x - T2y; + T2P = T2w + T2z; + T35 = T2u + T2v; + T36 = T2x + T2y; + T3d = T35 + T36; + TH = Tp + Ts; + TI = Tw + Tz; + TJ = TH + TI; + T15 = T13 - T14; + T1a = T18 - T19; + T1b = T15 + T1a; + T1s = T1o - T1r; + T1x = T1t - T1w; + T1T = T1s + T1x; + T29 = T1o + T1r; + T2a = T1t + T1w; + T2h = T29 + T2a; + T1h = T14 + T13; + T1i = T19 + T18; + T1j = T1h + T1i; + } + { + E Ta, T1z, TS, T2B, Td, TT, T1C, T2C, Th, T1E, TX, T2E, Tk, TY, T1H; + E T2F; + { + E T8, T9, TQ, TR; + T8 = ri[WS(is, 4)]; + T9 = ri[WS(is, 14)]; + Ta = T8 + T9; + T1z = T8 - T9; + TQ = ii[WS(is, 4)]; + TR = ii[WS(is, 14)]; + TS = TQ - TR; + T2B = TQ + TR; + } + { + E Tb, Tc, T1A, T1B; + Tb = ri[WS(is, 9)]; + Tc = ri[WS(is, 19)]; + Td = Tb + Tc; + TT = Tb - Tc; + T1A = ii[WS(is, 9)]; + T1B = ii[WS(is, 19)]; + T1C = T1A - T1B; + T2C = T1A + T1B; + } + { + E Tf, Tg, TV, TW; + Tf = ri[WS(is, 16)]; + Tg = ri[WS(is, 6)]; + Th = Tf + Tg; + T1E = Tf - Tg; + TV = ii[WS(is, 16)]; + TW = ii[WS(is, 6)]; + TX = TV - TW; + T2E = TV + TW; + } + { + E Ti, Tj, T1F, T1G; + Ti = ri[WS(is, 1)]; + Tj = ri[WS(is, 11)]; + Tk = Ti + Tj; + TY = Ti - Tj; + T1F = ii[WS(is, 1)]; + T1G = ii[WS(is, 11)]; + T1H = T1F - T1G; + T2F = T1F + T1G; + } + Te = Ta - Td; + Tl = Th - Tk; + Tm = Te + Tl; + T2D = T2B - T2C; + T2G = T2E - T2F; + T2O = T2D + T2G; + T32 = T2B + T2C; + T33 = T2E + T2F; + T3c = T32 + T33; + TE = Ta + Td; + TF = Th + Tk; + TG = TE + TF; + TU = TS - TT; + TZ = TX - TY; + T10 = TU + TZ; + T1D = T1z - T1C; + T1I = T1E - T1H; + T1S = T1D + T1I; + T26 = T1z + T1C; + T27 = T1E + T1H; + T2g = T26 + T27; + T1e = TT + TS; + T1f = TY + TX; + T1g = T1e + T1f; + } + { + E T2s, TC, T2r, T2I, T2K, T2A, T2H, T2J, T2t; + T2s = Tm - TB; + TC = Tm + TB; + T2r = FNMS(KP250000000, TC, T7); + T2A = T2w - T2z; + T2H = T2D - T2G; + T2I = FNMS(KP618033988, T2H, T2A); + T2K = FMA(KP618033988, T2A, T2H); + ro[WS(os, 10)] = T7 + TC; + T2J = FMA(KP559016994, T2s, T2r); + ro[WS(os, 14)] = FNMS(KP951056516, T2K, T2J); + ro[WS(os, 6)] = FMA(KP951056516, T2K, T2J); + T2t = FNMS(KP559016994, T2s, T2r); + ro[WS(os, 2)] = FNMS(KP951056516, T2I, T2t); + ro[WS(os, 18)] = FMA(KP951056516, T2I, T2t); + } + { + E T2S, T2Q, T2R, T2W, T2Y, T2U, T2V, T2X, T2T; + T2S = T2O - T2P; + T2Q = T2O + T2P; + T2R = FNMS(KP250000000, T2Q, T2N); + T2U = Tt - TA; + T2V = Te - Tl; + T2W = FNMS(KP618033988, T2V, T2U); + T2Y = FMA(KP618033988, T2U, T2V); + io[WS(os, 10)] = T2N + T2Q; + T2X = FMA(KP559016994, T2S, T2R); + io[WS(os, 6)] = FNMS(KP951056516, T2Y, T2X); + io[WS(os, 14)] = FMA(KP951056516, T2Y, T2X); + T2T = FNMS(KP559016994, T2S, T2R); + io[WS(os, 2)] = FMA(KP951056516, T2W, T2T); + io[WS(os, 18)] = FNMS(KP951056516, T2W, T2T); + } + { + E T30, TK, T2Z, T38, T3a, T34, T37, T39, T31; + T30 = TG - TJ; + TK = TG + TJ; + T2Z = FNMS(KP250000000, TK, TD); + T34 = T32 - T33; + T37 = T35 - T36; + T38 = FMA(KP618033988, T37, T34); + T3a = FNMS(KP618033988, T34, T37); + ro[0] = TD + TK; + T39 = FNMS(KP559016994, T30, T2Z); + ro[WS(os, 12)] = FNMS(KP951056516, T3a, T39); + ro[WS(os, 8)] = FMA(KP951056516, T3a, T39); + T31 = FMA(KP559016994, T30, T2Z); + ro[WS(os, 4)] = FNMS(KP951056516, T38, T31); + ro[WS(os, 16)] = FMA(KP951056516, T38, T31); + } + { + E T3g, T3e, T3f, T3k, T3m, T3i, T3j, T3l, T3h; + T3g = T3c - T3d; + T3e = T3c + T3d; + T3f = FNMS(KP250000000, T3e, T3b); + T3i = TE - TF; + T3j = TH - TI; + T3k = FMA(KP618033988, T3j, T3i); + T3m = FNMS(KP618033988, T3i, T3j); + io[0] = T3b + T3e; + T3l = FNMS(KP559016994, T3g, T3f); + io[WS(os, 8)] = FNMS(KP951056516, T3m, T3l); + io[WS(os, 12)] = FMA(KP951056516, T3m, T3l); + T3h = FMA(KP559016994, T3g, T3f); + io[WS(os, 4)] = FMA(KP951056516, T3k, T3h); + io[WS(os, 16)] = FNMS(KP951056516, T3k, T3h); + } + { + E T24, T1c, T23, T2c, T2e, T28, T2b, T2d, T25; + T24 = T10 - T1b; + T1c = T10 + T1b; + T23 = FNMS(KP250000000, T1c, TP); + T28 = T26 - T27; + T2b = T29 - T2a; + T2c = FMA(KP618033988, T2b, T28); + T2e = FNMS(KP618033988, T28, T2b); + io[WS(os, 5)] = TP + T1c; + T2d = FNMS(KP559016994, T24, T23); + io[WS(os, 13)] = FNMS(KP951056516, T2e, T2d); + io[WS(os, 17)] = FMA(KP951056516, T2e, T2d); + T25 = FMA(KP559016994, T24, T23); + io[WS(os, 1)] = FNMS(KP951056516, T2c, T25); + io[WS(os, 9)] = FMA(KP951056516, T2c, T25); + } + { + E T2k, T2i, T2j, T2o, T2q, T2m, T2n, T2p, T2l; + T2k = T2g - T2h; + T2i = T2g + T2h; + T2j = FNMS(KP250000000, T2i, T2f); + T2m = TU - TZ; + T2n = T15 - T1a; + T2o = FMA(KP618033988, T2n, T2m); + T2q = FNMS(KP618033988, T2m, T2n); + ro[WS(os, 5)] = T2f + T2i; + T2p = FNMS(KP559016994, T2k, T2j); + ro[WS(os, 13)] = FMA(KP951056516, T2q, T2p); + ro[WS(os, 17)] = FNMS(KP951056516, T2q, T2p); + T2l = FMA(KP559016994, T2k, T2j); + ro[WS(os, 1)] = FMA(KP951056516, T2o, T2l); + ro[WS(os, 9)] = FNMS(KP951056516, T2o, T2l); + } + { + E T1m, T1k, T1l, T1K, T1M, T1y, T1J, T1L, T1n; + T1m = T1g - T1j; + T1k = T1g + T1j; + T1l = FNMS(KP250000000, T1k, T1d); + T1y = T1s - T1x; + T1J = T1D - T1I; + T1K = FNMS(KP618033988, T1J, T1y); + T1M = FMA(KP618033988, T1y, T1J); + io[WS(os, 15)] = T1d + T1k; + T1L = FMA(KP559016994, T1m, T1l); + io[WS(os, 11)] = FNMS(KP951056516, T1M, T1L); + io[WS(os, 19)] = FMA(KP951056516, T1M, T1L); + T1n = FNMS(KP559016994, T1m, T1l); + io[WS(os, 3)] = FNMS(KP951056516, T1K, T1n); + io[WS(os, 7)] = FMA(KP951056516, T1K, T1n); + } + { + E T1W, T1U, T1V, T20, T22, T1Y, T1Z, T21, T1X; + T1W = T1S - T1T; + T1U = T1S + T1T; + T1V = FNMS(KP250000000, T1U, T1R); + T1Y = T1h - T1i; + T1Z = T1e - T1f; + T20 = FNMS(KP618033988, T1Z, T1Y); + T22 = FMA(KP618033988, T1Y, T1Z); + ro[WS(os, 15)] = T1R + T1U; + T21 = FMA(KP559016994, T1W, T1V); + ro[WS(os, 11)] = FMA(KP951056516, T22, T21); + ro[WS(os, 19)] = FNMS(KP951056516, T22, T21); + T1X = FNMS(KP559016994, T1W, T1V); + ro[WS(os, 3)] = FMA(KP951056516, T20, T1X); + ro[WS(os, 7)] = FNMS(KP951056516, T20, T1X); + } + } + } +} + +static const kdft_desc desc = { 20, "n1_20", {136, 0, 72, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_20) (planner *p) { + X(kdft_register) (p, n1_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 20 -name n1_20 -include dft/scalar/n.h */ + +/* + * This function contains 208 FP additions, 48 FP multiplications, + * (or, 184 additions, 24 multiplications, 24 fused multiply/add), + * 81 stack variables, 4 constants, and 80 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(80, is), MAKE_VOLATILE_STRIDE(80, os)) { + E T7, T2Q, T3h, TD, TP, T1U, T2l, T1d, Tt, TA, TB, T2w, T2z, T2S, T35; + E T36, T3f, TH, TI, TJ, T15, T1a, T1b, T1s, T1x, T1W, T29, T2a, T2j, T1h; + E T1i, T1j, Te, Tl, Tm, T2D, T2G, T2R, T32, T33, T3e, TE, TF, TG, TU; + E TZ, T10, T1D, T1I, T1V, T26, T27, T2i, T1e, T1f, T1g; + { + E T3, T1Q, TN, T2O, T6, TO, T1T, T2P; + { + E T1, T2, TL, TM; + T1 = ri[0]; + T2 = ri[WS(is, 10)]; + T3 = T1 + T2; + T1Q = T1 - T2; + TL = ii[0]; + TM = ii[WS(is, 10)]; + TN = TL - TM; + T2O = TL + TM; + } + { + E T4, T5, T1R, T1S; + T4 = ri[WS(is, 5)]; + T5 = ri[WS(is, 15)]; + T6 = T4 + T5; + TO = T4 - T5; + T1R = ii[WS(is, 5)]; + T1S = ii[WS(is, 15)]; + T1T = T1R - T1S; + T2P = T1R + T1S; + } + T7 = T3 - T6; + T2Q = T2O - T2P; + T3h = T2O + T2P; + TD = T3 + T6; + TP = TN - TO; + T1U = T1Q - T1T; + T2l = T1Q + T1T; + T1d = TO + TN; + } + { + E Tp, T1o, T13, T2u, Ts, T14, T1r, T2v, Tw, T1t, T18, T2x, Tz, T19, T1w; + E T2y; + { + E Tn, To, T11, T12; + Tn = ri[WS(is, 8)]; + To = ri[WS(is, 18)]; + Tp = Tn + To; + T1o = Tn - To; + T11 = ii[WS(is, 8)]; + T12 = ii[WS(is, 18)]; + T13 = T11 - T12; + T2u = T11 + T12; + } + { + E Tq, Tr, T1p, T1q; + Tq = ri[WS(is, 13)]; + Tr = ri[WS(is, 3)]; + Ts = Tq + Tr; + T14 = Tq - Tr; + T1p = ii[WS(is, 13)]; + T1q = ii[WS(is, 3)]; + T1r = T1p - T1q; + T2v = T1p + T1q; + } + { + E Tu, Tv, T16, T17; + Tu = ri[WS(is, 12)]; + Tv = ri[WS(is, 2)]; + Tw = Tu + Tv; + T1t = Tu - Tv; + T16 = ii[WS(is, 12)]; + T17 = ii[WS(is, 2)]; + T18 = T16 - T17; + T2x = T16 + T17; + } + { + E Tx, Ty, T1u, T1v; + Tx = ri[WS(is, 17)]; + Ty = ri[WS(is, 7)]; + Tz = Tx + Ty; + T19 = Tx - Ty; + T1u = ii[WS(is, 17)]; + T1v = ii[WS(is, 7)]; + T1w = T1u - T1v; + T2y = T1u + T1v; + } + Tt = Tp - Ts; + TA = Tw - Tz; + TB = Tt + TA; + T2w = T2u - T2v; + T2z = T2x - T2y; + T2S = T2w + T2z; + T35 = T2u + T2v; + T36 = T2x + T2y; + T3f = T35 + T36; + TH = Tp + Ts; + TI = Tw + Tz; + TJ = TH + TI; + T15 = T13 - T14; + T1a = T18 - T19; + T1b = T15 + T1a; + T1s = T1o - T1r; + T1x = T1t - T1w; + T1W = T1s + T1x; + T29 = T1o + T1r; + T2a = T1t + T1w; + T2j = T29 + T2a; + T1h = T14 + T13; + T1i = T19 + T18; + T1j = T1h + T1i; + } + { + E Ta, T1z, TS, T2B, Td, TT, T1C, T2C, Th, T1E, TX, T2E, Tk, TY, T1H; + E T2F; + { + E T8, T9, TQ, TR; + T8 = ri[WS(is, 4)]; + T9 = ri[WS(is, 14)]; + Ta = T8 + T9; + T1z = T8 - T9; + TQ = ii[WS(is, 4)]; + TR = ii[WS(is, 14)]; + TS = TQ - TR; + T2B = TQ + TR; + } + { + E Tb, Tc, T1A, T1B; + Tb = ri[WS(is, 9)]; + Tc = ri[WS(is, 19)]; + Td = Tb + Tc; + TT = Tb - Tc; + T1A = ii[WS(is, 9)]; + T1B = ii[WS(is, 19)]; + T1C = T1A - T1B; + T2C = T1A + T1B; + } + { + E Tf, Tg, TV, TW; + Tf = ri[WS(is, 16)]; + Tg = ri[WS(is, 6)]; + Th = Tf + Tg; + T1E = Tf - Tg; + TV = ii[WS(is, 16)]; + TW = ii[WS(is, 6)]; + TX = TV - TW; + T2E = TV + TW; + } + { + E Ti, Tj, T1F, T1G; + Ti = ri[WS(is, 1)]; + Tj = ri[WS(is, 11)]; + Tk = Ti + Tj; + TY = Ti - Tj; + T1F = ii[WS(is, 1)]; + T1G = ii[WS(is, 11)]; + T1H = T1F - T1G; + T2F = T1F + T1G; + } + Te = Ta - Td; + Tl = Th - Tk; + Tm = Te + Tl; + T2D = T2B - T2C; + T2G = T2E - T2F; + T2R = T2D + T2G; + T32 = T2B + T2C; + T33 = T2E + T2F; + T3e = T32 + T33; + TE = Ta + Td; + TF = Th + Tk; + TG = TE + TF; + TU = TS - TT; + TZ = TX - TY; + T10 = TU + TZ; + T1D = T1z - T1C; + T1I = T1E - T1H; + T1V = T1D + T1I; + T26 = T1z + T1C; + T27 = T1E + T1H; + T2i = T26 + T27; + T1e = TT + TS; + T1f = TY + TX; + T1g = T1e + T1f; + } + { + E T2s, TC, T2r, T2I, T2K, T2A, T2H, T2J, T2t; + T2s = KP559016994 * (Tm - TB); + TC = Tm + TB; + T2r = FNMS(KP250000000, TC, T7); + T2A = T2w - T2z; + T2H = T2D - T2G; + T2I = FNMS(KP587785252, T2H, KP951056516 * T2A); + T2K = FMA(KP951056516, T2H, KP587785252 * T2A); + ro[WS(os, 10)] = T7 + TC; + T2J = T2s + T2r; + ro[WS(os, 14)] = T2J - T2K; + ro[WS(os, 6)] = T2J + T2K; + T2t = T2r - T2s; + ro[WS(os, 2)] = T2t - T2I; + ro[WS(os, 18)] = T2t + T2I; + } + { + E T2V, T2T, T2U, T2N, T2Y, T2L, T2M, T2X, T2W; + T2V = KP559016994 * (T2R - T2S); + T2T = T2R + T2S; + T2U = FNMS(KP250000000, T2T, T2Q); + T2L = Tt - TA; + T2M = Te - Tl; + T2N = FNMS(KP587785252, T2M, KP951056516 * T2L); + T2Y = FMA(KP951056516, T2M, KP587785252 * T2L); + io[WS(os, 10)] = T2Q + T2T; + T2X = T2V + T2U; + io[WS(os, 6)] = T2X - T2Y; + io[WS(os, 14)] = T2Y + T2X; + T2W = T2U - T2V; + io[WS(os, 2)] = T2N + T2W; + io[WS(os, 18)] = T2W - T2N; + } + { + E T2Z, TK, T30, T38, T3a, T34, T37, T39, T31; + T2Z = KP559016994 * (TG - TJ); + TK = TG + TJ; + T30 = FNMS(KP250000000, TK, TD); + T34 = T32 - T33; + T37 = T35 - T36; + T38 = FMA(KP951056516, T34, KP587785252 * T37); + T3a = FNMS(KP587785252, T34, KP951056516 * T37); + ro[0] = TD + TK; + T39 = T30 - T2Z; + ro[WS(os, 12)] = T39 - T3a; + ro[WS(os, 8)] = T39 + T3a; + T31 = T2Z + T30; + ro[WS(os, 4)] = T31 - T38; + ro[WS(os, 16)] = T31 + T38; + } + { + E T3g, T3i, T3j, T3d, T3m, T3b, T3c, T3l, T3k; + T3g = KP559016994 * (T3e - T3f); + T3i = T3e + T3f; + T3j = FNMS(KP250000000, T3i, T3h); + T3b = TE - TF; + T3c = TH - TI; + T3d = FMA(KP951056516, T3b, KP587785252 * T3c); + T3m = FNMS(KP587785252, T3b, KP951056516 * T3c); + io[0] = T3h + T3i; + T3l = T3j - T3g; + io[WS(os, 8)] = T3l - T3m; + io[WS(os, 12)] = T3m + T3l; + T3k = T3g + T3j; + io[WS(os, 4)] = T3d + T3k; + io[WS(os, 16)] = T3k - T3d; + } + { + E T23, T1c, T24, T2c, T2e, T28, T2b, T2d, T25; + T23 = KP559016994 * (T10 - T1b); + T1c = T10 + T1b; + T24 = FNMS(KP250000000, T1c, TP); + T28 = T26 - T27; + T2b = T29 - T2a; + T2c = FMA(KP951056516, T28, KP587785252 * T2b); + T2e = FNMS(KP587785252, T28, KP951056516 * T2b); + io[WS(os, 5)] = TP + T1c; + T2d = T24 - T23; + io[WS(os, 13)] = T2d - T2e; + io[WS(os, 17)] = T2d + T2e; + T25 = T23 + T24; + io[WS(os, 1)] = T25 - T2c; + io[WS(os, 9)] = T25 + T2c; + } + { + E T2k, T2m, T2n, T2h, T2p, T2f, T2g, T2q, T2o; + T2k = KP559016994 * (T2i - T2j); + T2m = T2i + T2j; + T2n = FNMS(KP250000000, T2m, T2l); + T2f = TU - TZ; + T2g = T15 - T1a; + T2h = FMA(KP951056516, T2f, KP587785252 * T2g); + T2p = FNMS(KP587785252, T2f, KP951056516 * T2g); + ro[WS(os, 5)] = T2l + T2m; + T2q = T2n - T2k; + ro[WS(os, 13)] = T2p + T2q; + ro[WS(os, 17)] = T2q - T2p; + T2o = T2k + T2n; + ro[WS(os, 1)] = T2h + T2o; + ro[WS(os, 9)] = T2o - T2h; + } + { + E T1m, T1k, T1l, T1K, T1M, T1y, T1J, T1L, T1n; + T1m = KP559016994 * (T1g - T1j); + T1k = T1g + T1j; + T1l = FNMS(KP250000000, T1k, T1d); + T1y = T1s - T1x; + T1J = T1D - T1I; + T1K = FNMS(KP587785252, T1J, KP951056516 * T1y); + T1M = FMA(KP951056516, T1J, KP587785252 * T1y); + io[WS(os, 15)] = T1d + T1k; + T1L = T1m + T1l; + io[WS(os, 11)] = T1L - T1M; + io[WS(os, 19)] = T1L + T1M; + T1n = T1l - T1m; + io[WS(os, 3)] = T1n - T1K; + io[WS(os, 7)] = T1n + T1K; + } + { + E T1Z, T1X, T1Y, T1P, T21, T1N, T1O, T22, T20; + T1Z = KP559016994 * (T1V - T1W); + T1X = T1V + T1W; + T1Y = FNMS(KP250000000, T1X, T1U); + T1N = T1h - T1i; + T1O = T1e - T1f; + T1P = FNMS(KP587785252, T1O, KP951056516 * T1N); + T21 = FMA(KP951056516, T1O, KP587785252 * T1N); + ro[WS(os, 15)] = T1U + T1X; + T22 = T1Z + T1Y; + ro[WS(os, 11)] = T21 + T22; + ro[WS(os, 19)] = T22 - T21; + T20 = T1Y - T1Z; + ro[WS(os, 3)] = T1P + T20; + ro[WS(os, 7)] = T20 - T1P; + } + } + } +} + +static const kdft_desc desc = { 20, "n1_20", {184, 24, 24, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_20) (planner *p) { + X(kdft_register) (p, n1_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_25.c new file mode 100644 index 000000000..023b27ad9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_25.c @@ -0,0 +1,1225 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 25 -name n1_25 -include dft/scalar/n.h */ + +/* + * This function contains 352 FP additions, 268 FP multiplications, + * (or, 84 additions, 0 multiplications, 268 fused multiply/add), + * 128 stack variables, 47 constants, and 100 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_25(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(100, is), MAKE_VOLATILE_STRIDE(100, os)) { + E T9, T4Q, T1U, T3b, T45, T1D, T46, T3e, T1R, T4P, Ti, Tr, Ts, TY, T17; + E T1E, T22, T5f, T3z, T4z, T2o, T5b, T3C, T4s, T2h, T5c, T3D, T4p, T29, T5e; + E T3A, T4w, TB, TK, TL, T1h, T1q, T1F, T2x, T57, T3v, T4a, T2T, T55, T3s; + E T4k, T2M, T54, T3t, T4h, T2E, T58, T3w, T4d; + { + E T1, T4, T7, T8, T1T, T1S, T39, T3a; + T1 = ri[0]; + { + E T2, T3, T5, T6; + T2 = ri[WS(is, 5)]; + T3 = ri[WS(is, 20)]; + T4 = T2 + T3; + T5 = ri[WS(is, 10)]; + T6 = ri[WS(is, 15)]; + T7 = T5 + T6; + T8 = T4 + T7; + T1T = T5 - T6; + T1S = T2 - T3; + } + T9 = T1 + T8; + T4Q = FNMS(KP618033988, T1S, T1T); + T1U = FMA(KP618033988, T1T, T1S); + T39 = FNMS(KP250000000, T8, T1); + T3a = T4 - T7; + T3b = FMA(KP559016994, T3a, T39); + T45 = FNMS(KP559016994, T3a, T39); + } + { + E T1v, T1y, T1B, T1C, T3d, T3c, T1P, T1Q; + T1v = ii[0]; + { + E T1w, T1x, T1z, T1A; + T1w = ii[WS(is, 5)]; + T1x = ii[WS(is, 20)]; + T1y = T1w + T1x; + T1z = ii[WS(is, 10)]; + T1A = ii[WS(is, 15)]; + T1B = T1z + T1A; + T1C = T1y + T1B; + T3d = T1z - T1A; + T3c = T1w - T1x; + } + T1D = T1v + T1C; + T46 = FNMS(KP618033988, T3c, T3d); + T3e = FMA(KP618033988, T3d, T3c); + T1P = FNMS(KP250000000, T1C, T1v); + T1Q = T1y - T1B; + T1R = FMA(KP559016994, T1Q, T1P); + T4P = FNMS(KP559016994, T1Q, T1P); + } + { + E Ta, TQ, Tj, TZ, Th, T24, T1Z, T20, TX, T27, T1X, T26, Tq, T2m, T2c; + E T2l, T16, T2j, T2e, T2f; + Ta = ri[WS(is, 1)]; + TQ = ii[WS(is, 1)]; + Tj = ri[WS(is, 4)]; + TZ = ii[WS(is, 4)]; + { + E Tb, Tc, Td, Te, Tf, Tg; + Tb = ri[WS(is, 6)]; + Tc = ri[WS(is, 21)]; + Td = Tb + Tc; + Te = ri[WS(is, 11)]; + Tf = ri[WS(is, 16)]; + Tg = Te + Tf; + Th = Td + Tg; + T24 = Td - Tg; + T1Z = Tc - Tb; + T20 = Tf - Te; + } + { + E TR, TS, TT, TU, TV, TW; + TR = ii[WS(is, 6)]; + TS = ii[WS(is, 21)]; + TT = TR + TS; + TU = ii[WS(is, 11)]; + TV = ii[WS(is, 16)]; + TW = TU + TV; + TX = TT + TW; + T27 = TV - TU; + T1X = TT - TW; + T26 = TR - TS; + } + { + E Tk, Tl, Tm, Tn, To, Tp; + Tk = ri[WS(is, 9)]; + Tl = ri[WS(is, 24)]; + Tm = Tk + Tl; + Tn = ri[WS(is, 14)]; + To = ri[WS(is, 19)]; + Tp = Tn + To; + Tq = Tm + Tp; + T2m = To - Tn; + T2c = Tm - Tp; + T2l = Tl - Tk; + } + { + E T10, T11, T12, T13, T14, T15; + T10 = ii[WS(is, 9)]; + T11 = ii[WS(is, 24)]; + T12 = T10 + T11; + T13 = ii[WS(is, 14)]; + T14 = ii[WS(is, 19)]; + T15 = T13 + T14; + T16 = T12 + T15; + T2j = T15 - T12; + T2e = T11 - T10; + T2f = T14 - T13; + } + Ti = Ta + Th; + Tr = Tj + Tq; + Ts = Ti + Tr; + TY = TQ + TX; + T17 = TZ + T16; + T1E = TY + T17; + { + E T21, T4y, T1Y, T4x, T1W; + T21 = FMA(KP618033988, T20, T1Z); + T4y = FNMS(KP618033988, T1Z, T20); + T1W = FNMS(KP250000000, TX, TQ); + T1Y = FMA(KP559016994, T1X, T1W); + T4x = FNMS(KP559016994, T1X, T1W); + T22 = FMA(KP951056516, T21, T1Y); + T5f = FNMS(KP951056516, T4y, T4x); + T3z = FNMS(KP951056516, T21, T1Y); + T4z = FMA(KP951056516, T4y, T4x); + } + { + E T2n, T4r, T2k, T4q, T2i; + T2n = FMA(KP618033988, T2m, T2l); + T4r = FNMS(KP618033988, T2l, T2m); + T2i = FNMS(KP250000000, T16, TZ); + T2k = FNMS(KP559016994, T2j, T2i); + T4q = FMA(KP559016994, T2j, T2i); + T2o = FMA(KP951056516, T2n, T2k); + T5b = FNMS(KP951056516, T4r, T4q); + T3C = FNMS(KP951056516, T2n, T2k); + T4s = FMA(KP951056516, T4r, T4q); + } + { + E T2g, T4o, T2d, T4n, T2b; + T2g = FMA(KP618033988, T2f, T2e); + T4o = FNMS(KP618033988, T2e, T2f); + T2b = FMS(KP250000000, Tq, Tj); + T2d = FNMS(KP559016994, T2c, T2b); + T4n = FMA(KP559016994, T2c, T2b); + T2h = FMA(KP951056516, T2g, T2d); + T5c = FNMS(KP951056516, T4o, T4n); + T3D = FNMS(KP951056516, T2g, T2d); + T4p = FMA(KP951056516, T4o, T4n); + } + { + E T28, T4v, T25, T4u, T23; + T28 = FNMS(KP618033988, T27, T26); + T4v = FMA(KP618033988, T26, T27); + T23 = FNMS(KP250000000, Th, Ta); + T25 = FMA(KP559016994, T24, T23); + T4u = FNMS(KP559016994, T24, T23); + T29 = FMA(KP951056516, T28, T25); + T5e = FMA(KP951056516, T4v, T4u); + T3A = FNMS(KP951056516, T28, T25); + T4w = FNMS(KP951056516, T4v, T4u); + } + } + { + E Tt, T19, TC, T1i, TA, T2z, T2u, T2v, T1g, T2C, T2s, T2B, TJ, T2O, T2J; + E T2K, T1p, T2R, T2H, T2Q; + Tt = ri[WS(is, 2)]; + T19 = ii[WS(is, 2)]; + TC = ri[WS(is, 3)]; + T1i = ii[WS(is, 3)]; + { + E Tu, Tv, Tw, Tx, Ty, Tz; + Tu = ri[WS(is, 7)]; + Tv = ri[WS(is, 22)]; + Tw = Tu + Tv; + Tx = ri[WS(is, 12)]; + Ty = ri[WS(is, 17)]; + Tz = Tx + Ty; + TA = Tw + Tz; + T2z = Tz - Tw; + T2u = Tv - Tu; + T2v = Ty - Tx; + } + { + E T1a, T1b, T1c, T1d, T1e, T1f; + T1a = ii[WS(is, 7)]; + T1b = ii[WS(is, 22)]; + T1c = T1a + T1b; + T1d = ii[WS(is, 12)]; + T1e = ii[WS(is, 17)]; + T1f = T1d + T1e; + T1g = T1c + T1f; + T2C = T1d - T1e; + T2s = T1f - T1c; + T2B = T1b - T1a; + } + { + E TD, TE, TF, TG, TH, TI; + TD = ri[WS(is, 8)]; + TE = ri[WS(is, 23)]; + TF = TD + TE; + TG = ri[WS(is, 13)]; + TH = ri[WS(is, 18)]; + TI = TG + TH; + TJ = TF + TI; + T2O = TI - TF; + T2J = TD - TE; + T2K = TG - TH; + } + { + E T1j, T1k, T1l, T1m, T1n, T1o; + T1j = ii[WS(is, 8)]; + T1k = ii[WS(is, 23)]; + T1l = T1j + T1k; + T1m = ii[WS(is, 13)]; + T1n = ii[WS(is, 18)]; + T1o = T1m + T1n; + T1p = T1l + T1o; + T2R = T1n - T1m; + T2H = T1o - T1l; + T2Q = T1k - T1j; + } + TB = Tt + TA; + TK = TC + TJ; + TL = TB + TK; + T1h = T19 + T1g; + T1q = T1i + T1p; + T1F = T1h + T1q; + { + E T2w, T49, T2t, T48, T2r; + T2w = FMA(KP618033988, T2v, T2u); + T49 = FNMS(KP618033988, T2u, T2v); + T2r = FNMS(KP250000000, T1g, T19); + T2t = FNMS(KP559016994, T2s, T2r); + T48 = FMA(KP559016994, T2s, T2r); + T2x = FMA(KP951056516, T2w, T2t); + T57 = FNMS(KP951056516, T49, T48); + T3v = FNMS(KP951056516, T2w, T2t); + T4a = FMA(KP951056516, T49, T48); + } + { + E T2S, T4j, T2P, T4i, T2N; + T2S = FMA(KP618033988, T2R, T2Q); + T4j = FNMS(KP618033988, T2Q, T2R); + T2N = FNMS(KP250000000, TJ, TC); + T2P = FNMS(KP559016994, T2O, T2N); + T4i = FMA(KP559016994, T2O, T2N); + T2T = FNMS(KP951056516, T2S, T2P); + T55 = FMA(KP951056516, T4j, T4i); + T3s = FMA(KP951056516, T2S, T2P); + T4k = FNMS(KP951056516, T4j, T4i); + } + { + E T2L, T4g, T2I, T4f, T2G; + T2L = FMA(KP618033988, T2K, T2J); + T4g = FNMS(KP618033988, T2J, T2K); + T2G = FNMS(KP250000000, T1p, T1i); + T2I = FNMS(KP559016994, T2H, T2G); + T4f = FMA(KP559016994, T2H, T2G); + T2M = FNMS(KP951056516, T2L, T2I); + T54 = FMA(KP951056516, T4g, T4f); + T3t = FMA(KP951056516, T2L, T2I); + T4h = FNMS(KP951056516, T4g, T4f); + } + { + E T2D, T4c, T2A, T4b, T2y; + T2D = FNMS(KP618033988, T2C, T2B); + T4c = FMA(KP618033988, T2B, T2C); + T2y = FNMS(KP250000000, TA, Tt); + T2A = FNMS(KP559016994, T2z, T2y); + T4b = FMA(KP559016994, T2z, T2y); + T2E = FNMS(KP951056516, T2D, T2A); + T58 = FNMS(KP951056516, T4c, T4b); + T3w = FMA(KP951056516, T2D, T2A); + T4d = FMA(KP951056516, T4c, T4b); + } + } + { + E TO, TM, TN, T1s, T1u, T18, T1r, T1t, TP; + TO = Ts - TL; + TM = Ts + TL; + TN = FNMS(KP250000000, TM, T9); + T18 = TY - T17; + T1r = T1h - T1q; + T1s = FMA(KP618033988, T1r, T18); + T1u = FNMS(KP618033988, T18, T1r); + ro[0] = T9 + TM; + T1t = FNMS(KP559016994, TO, TN); + ro[WS(os, 10)] = FNMS(KP951056516, T1u, T1t); + ro[WS(os, 15)] = FMA(KP951056516, T1u, T1t); + TP = FMA(KP559016994, TO, TN); + ro[WS(os, 20)] = FNMS(KP951056516, T1s, TP); + ro[WS(os, 5)] = FMA(KP951056516, T1s, TP); + } + { + E T1I, T1G, T1H, T1M, T1O, T1K, T1L, T1N, T1J; + T1I = T1E - T1F; + T1G = T1E + T1F; + T1H = FNMS(KP250000000, T1G, T1D); + T1K = Ti - Tr; + T1L = TB - TK; + T1M = FMA(KP618033988, T1L, T1K); + T1O = FNMS(KP618033988, T1K, T1L); + io[0] = T1D + T1G; + T1N = FNMS(KP559016994, T1I, T1H); + io[WS(os, 10)] = FMA(KP951056516, T1O, T1N); + io[WS(os, 15)] = FNMS(KP951056516, T1O, T1N); + T1J = FMA(KP559016994, T1I, T1H); + io[WS(os, 5)] = FNMS(KP951056516, T1M, T1J); + io[WS(os, 20)] = FMA(KP951056516, T1M, T1J); + } + { + E T1V, T3f, T2W, T3n, T2Y, T3m, T32, T3k, T35, T3i; + T1V = FNMS(KP951056516, T1U, T1R); + T3f = FMA(KP951056516, T3e, T3b); + { + E T2a, T2p, T2q, T2F, T2U, T2V; + T2a = FNMS(KP256756360, T29, T22); + T2p = FMA(KP634619297, T2o, T2h); + T2q = FMA(KP871714437, T2p, T2a); + T2F = FNMS(KP549754652, T2E, T2x); + T2U = FNMS(KP939062505, T2T, T2M); + T2V = FMA(KP831864738, T2U, T2F); + T2W = FMA(KP904730450, T2V, T2q); + T3n = FNMS(KP831864738, T2U, T2F); + T2Y = FNMS(KP904730450, T2V, T2q); + T3m = FNMS(KP871714437, T2p, T2a); + } + { + E T30, T31, T3g, T33, T34, T3h; + T30 = FMA(KP256756360, T22, T29); + T31 = FNMS(KP634619297, T2h, T2o); + T3g = FMA(KP871714437, T31, T30); + T33 = FMA(KP549754652, T2x, T2E); + T34 = FMA(KP939062505, T2M, T2T); + T3h = FMA(KP831864738, T34, T33); + T32 = FNMS(KP871714437, T31, T30); + T3k = FNMS(KP904730450, T3h, T3g); + T35 = FNMS(KP831864738, T34, T33); + T3i = FMA(KP904730450, T3h, T3g); + } + io[WS(os, 1)] = FMA(KP968583161, T2W, T1V); + ro[WS(os, 1)] = FMA(KP968583161, T3i, T3f); + { + E T36, T38, T2Z, T37, T2X; + T36 = FMA(KP559154169, T35, T32); + T38 = FNMS(KP683113946, T32, T35); + T2X = FNMS(KP242145790, T2W, T1V); + T2Z = FMA(KP541454447, T2Y, T2X); + T37 = FNMS(KP541454447, T2Y, T2X); + io[WS(os, 6)] = FNMS(KP921177326, T36, T2Z); + io[WS(os, 11)] = FMA(KP833417178, T38, T37); + io[WS(os, 21)] = FMA(KP921177326, T36, T2Z); + io[WS(os, 16)] = FNMS(KP833417178, T38, T37); + } + { + E T3o, T3q, T3l, T3p, T3j; + T3o = FMA(KP559154169, T3n, T3m); + T3q = FNMS(KP683113946, T3m, T3n); + T3j = FNMS(KP242145790, T3i, T3f); + T3l = FMA(KP541454447, T3k, T3j); + T3p = FNMS(KP541454447, T3k, T3j); + ro[WS(os, 6)] = FMA(KP921177326, T3o, T3l); + ro[WS(os, 16)] = FMA(KP833417178, T3q, T3p); + ro[WS(os, 21)] = FNMS(KP921177326, T3o, T3l); + ro[WS(os, 11)] = FNMS(KP833417178, T3q, T3p); + } + } + { + E T53, T5j, T5i, T5A, T5u, T5v, T5q, T5D, T5s, T5C; + T53 = FNMS(KP951056516, T46, T45); + T5j = FMA(KP951056516, T4Q, T4P); + { + E T56, T59, T5a, T5d, T5g, T5h; + T56 = FMA(KP062914667, T55, T54); + T59 = FMA(KP634619297, T58, T57); + T5a = FMA(KP845997307, T59, T56); + T5d = FMA(KP470564281, T5c, T5b); + T5g = FMA(KP549754652, T5f, T5e); + T5h = FMA(KP968479752, T5g, T5d); + T5i = FMA(KP906616052, T5h, T5a); + T5A = FNMS(KP906616052, T5h, T5a); + T5u = FNMS(KP845997307, T59, T56); + T5v = FNMS(KP968479752, T5g, T5d); + } + { + E T5k, T5l, T5m, T5n, T5o, T5p; + T5k = FNMS(KP062914667, T54, T55); + T5l = FNMS(KP634619297, T57, T58); + T5m = FMA(KP845997307, T5l, T5k); + T5n = FNMS(KP470564281, T5b, T5c); + T5o = FNMS(KP549754652, T5e, T5f); + T5p = FMA(KP968479752, T5o, T5n); + T5q = FNMS(KP906616052, T5p, T5m); + T5D = FNMS(KP845997307, T5l, T5k); + T5s = FMA(KP906616052, T5p, T5m); + T5C = FNMS(KP968479752, T5o, T5n); + } + ro[WS(os, 2)] = FMA(KP998026728, T5i, T53); + io[WS(os, 2)] = FNMS(KP998026728, T5q, T5j); + { + E T5w, T5y, T5t, T5x, T5r; + T5w = FNMS(KP560319534, T5v, T5u); + T5y = FMA(KP681693190, T5u, T5v); + T5r = FMA(KP249506682, T5q, T5j); + T5t = FNMS(KP557913902, T5s, T5r); + T5x = FMA(KP557913902, T5s, T5r); + io[WS(os, 12)] = FNMS(KP949179823, T5w, T5t); + io[WS(os, 22)] = FNMS(KP860541664, T5y, T5x); + io[WS(os, 17)] = FMA(KP949179823, T5w, T5t); + io[WS(os, 7)] = FMA(KP860541664, T5y, T5x); + } + { + E T5E, T5G, T5B, T5F, T5z; + T5E = FNMS(KP681693190, T5D, T5C); + T5G = FMA(KP560319534, T5C, T5D); + T5z = FNMS(KP249506682, T5i, T53); + T5B = FNMS(KP557913902, T5A, T5z); + T5F = FMA(KP557913902, T5A, T5z); + ro[WS(os, 22)] = FMA(KP860541664, T5E, T5B); + ro[WS(os, 17)] = FMA(KP949179823, T5G, T5F); + ro[WS(os, 7)] = FNMS(KP860541664, T5E, T5B); + ro[WS(os, 12)] = FNMS(KP949179823, T5G, T5F); + } + } + { + E T47, T4R, T4C, T4Z, T4E, T4Y, T4I, T4W, T4L, T4U; + T47 = FMA(KP951056516, T46, T45); + T4R = FNMS(KP951056516, T4Q, T4P); + { + E T4e, T4l, T4m, T4t, T4A, T4B; + T4e = FMA(KP062914667, T4d, T4a); + T4l = FNMS(KP827271945, T4k, T4h); + T4m = FMA(KP772036680, T4l, T4e); + T4t = FMA(KP126329378, T4s, T4p); + T4A = FMA(KP939062505, T4z, T4w); + T4B = FMA(KP734762448, T4A, T4t); + T4C = FMA(KP994076283, T4B, T4m); + T4Z = FNMS(KP734762448, T4A, T4t); + T4E = FNMS(KP994076283, T4B, T4m); + T4Y = FNMS(KP772036680, T4l, T4e); + } + { + E T4G, T4H, T4T, T4J, T4K, T4S; + T4G = FNMS(KP126329378, T4p, T4s); + T4H = FNMS(KP939062505, T4w, T4z); + T4T = FNMS(KP734762448, T4H, T4G); + T4J = FNMS(KP062914667, T4a, T4d); + T4K = FMA(KP827271945, T4h, T4k); + T4S = FMA(KP772036680, T4K, T4J); + T4I = FMA(KP734762448, T4H, T4G); + T4W = FNMS(KP994076283, T4T, T4S); + T4L = FNMS(KP772036680, T4K, T4J); + T4U = FMA(KP994076283, T4T, T4S); + } + ro[WS(os, 3)] = FMA(KP998026728, T4C, T47); + io[WS(os, 3)] = FNMS(KP998026728, T4U, T4R); + { + E T4M, T4O, T4F, T4N, T4D; + T4M = FNMS(KP621716863, T4L, T4I); + T4O = FMA(KP614372930, T4I, T4L); + T4D = FNMS(KP249506682, T4C, T47); + T4F = FNMS(KP557913902, T4E, T4D); + T4N = FMA(KP557913902, T4E, T4D); + ro[WS(os, 23)] = FNMS(KP943557151, T4M, T4F); + ro[WS(os, 13)] = FMA(KP949179823, T4O, T4N); + ro[WS(os, 8)] = FMA(KP943557151, T4M, T4F); + ro[WS(os, 18)] = FNMS(KP949179823, T4O, T4N); + } + { + E T50, T52, T4X, T51, T4V; + T50 = FMA(KP614372930, T4Z, T4Y); + T52 = FNMS(KP621716863, T4Y, T4Z); + T4V = FMA(KP249506682, T4U, T4R); + T4X = FNMS(KP557913902, T4W, T4V); + T51 = FMA(KP557913902, T4W, T4V); + io[WS(os, 13)] = FMA(KP949179823, T50, T4X); + io[WS(os, 23)] = FNMS(KP943557151, T52, T51); + io[WS(os, 18)] = FNMS(KP949179823, T50, T4X); + io[WS(os, 8)] = FMA(KP943557151, T52, T51); + } + } + { + E T3r, T3H, T3G, T3Y, T3S, T3T, T3O, T41, T3Q, T40; + T3r = FNMS(KP951056516, T3e, T3b); + T3H = FMA(KP951056516, T1U, T1R); + { + E T3u, T3x, T3y, T3B, T3E, T3F; + T3u = FNMS(KP126329378, T3t, T3s); + T3x = FNMS(KP470564281, T3w, T3v); + T3y = FNMS(KP912018591, T3x, T3u); + T3B = FMA(KP634619297, T3A, T3z); + T3E = FNMS(KP827271945, T3D, T3C); + T3F = FNMS(KP912575812, T3E, T3B); + T3G = FNMS(KP851038619, T3F, T3y); + T3Y = FMA(KP851038619, T3F, T3y); + T3S = FMA(KP912018591, T3x, T3u); + T3T = FMA(KP912575812, T3E, T3B); + } + { + E T3I, T3J, T3K, T3L, T3M, T3N; + T3I = FMA(KP126329378, T3s, T3t); + T3J = FMA(KP470564281, T3v, T3w); + T3K = FMA(KP912018591, T3J, T3I); + T3L = FNMS(KP634619297, T3z, T3A); + T3M = FMA(KP827271945, T3C, T3D); + T3N = FMA(KP912575812, T3M, T3L); + T3O = FMA(KP851038619, T3N, T3K); + T41 = FNMS(KP912018591, T3J, T3I); + T3Q = FNMS(KP851038619, T3N, T3K); + T40 = FNMS(KP912575812, T3M, T3L); + } + ro[WS(os, 4)] = FNMS(KP992114701, T3G, T3r); + io[WS(os, 4)] = FNMS(KP992114701, T3O, T3H); + { + E T3U, T3W, T3R, T3V, T3P; + T3U = FNMS(KP525970792, T3T, T3S); + T3W = FMA(KP726211448, T3S, T3T); + T3P = FMA(KP248028675, T3O, T3H); + T3R = FNMS(KP554608978, T3Q, T3P); + T3V = FMA(KP554608978, T3Q, T3P); + io[WS(os, 14)] = FMA(KP943557151, T3U, T3R); + io[WS(os, 24)] = FMA(KP803003575, T3W, T3V); + io[WS(os, 19)] = FNMS(KP943557151, T3U, T3R); + io[WS(os, 9)] = FNMS(KP803003575, T3W, T3V); + } + { + E T42, T44, T3Z, T43, T3X; + T42 = FNMS(KP726211448, T41, T40); + T44 = FMA(KP525970792, T40, T41); + T3X = FMA(KP248028675, T3G, T3r); + T3Z = FMA(KP554608978, T3Y, T3X); + T43 = FNMS(KP554608978, T3Y, T3X); + ro[WS(os, 9)] = FNMS(KP803003575, T42, T3Z); + ro[WS(os, 19)] = FMA(KP943557151, T44, T43); + ro[WS(os, 24)] = FMA(KP803003575, T42, T3Z); + ro[WS(os, 14)] = FNMS(KP943557151, T44, T43); + } + } + } + } +} + +static const kdft_desc desc = { 25, "n1_25", {84, 0, 268, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_25) (planner *p) { + X(kdft_register) (p, n1_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 25 -name n1_25 -include dft/scalar/n.h */ + +/* + * This function contains 352 FP additions, 184 FP multiplications, + * (or, 260 additions, 92 multiplications, 92 fused multiply/add), + * 101 stack variables, 20 constants, and 100 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_25(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(100, is), MAKE_VOLATILE_STRIDE(100, os)) { + E T9, T4u, T2T, TP, T3H, TW, T5y, T3I, T2Q, T4v, Ti, Tr, Ts, T5m, T5n; + E T5v, T18, T4G, T34, T3M, T1G, T4J, T38, T3T, T1v, T4K, T37, T3W, T1j, T4H; + E T35, T3P, TB, TK, TL, T5p, T5q, T5w, T1T, T4N, T3c, T41, T2r, T4Q, T3e; + E T4b, T2g, T4R, T3f, T48, T24, T4O, T3b, T44; + { + E T1, T4, T7, T8, T2S, T2R, TN, TO; + T1 = ri[0]; + { + E T2, T3, T5, T6; + T2 = ri[WS(is, 5)]; + T3 = ri[WS(is, 20)]; + T4 = T2 + T3; + T5 = ri[WS(is, 10)]; + T6 = ri[WS(is, 15)]; + T7 = T5 + T6; + T8 = T4 + T7; + T2S = T5 - T6; + T2R = T2 - T3; + } + T9 = T1 + T8; + T4u = FNMS(KP587785252, T2R, KP951056516 * T2S); + T2T = FMA(KP951056516, T2R, KP587785252 * T2S); + TN = KP559016994 * (T4 - T7); + TO = FNMS(KP250000000, T8, T1); + TP = TN + TO; + T3H = TO - TN; + } + { + E T2N, T2K, T2L, TS, T2O, TV, T2M, T2P; + T2N = ii[0]; + { + E TQ, TR, TT, TU; + TQ = ii[WS(is, 5)]; + TR = ii[WS(is, 20)]; + T2K = TQ + TR; + TT = ii[WS(is, 10)]; + TU = ii[WS(is, 15)]; + T2L = TT + TU; + TS = TQ - TR; + T2O = T2K + T2L; + TV = TT - TU; + } + TW = FMA(KP951056516, TS, KP587785252 * TV); + T5y = T2N + T2O; + T3I = FNMS(KP587785252, TS, KP951056516 * TV); + T2M = KP559016994 * (T2K - T2L); + T2P = FNMS(KP250000000, T2O, T2N); + T2Q = T2M + T2P; + T4v = T2P - T2M; + } + { + E Ta, T1c, Tj, T1z, Th, T1h, TY, T1g, T13, T1d, T16, T1b, Tq, T1E, T1l; + E T1D, T1q, T1A, T1t, T1y; + Ta = ri[WS(is, 1)]; + T1c = ii[WS(is, 1)]; + Tj = ri[WS(is, 4)]; + T1z = ii[WS(is, 4)]; + { + E Tb, Tc, Td, Te, Tf, Tg; + Tb = ri[WS(is, 6)]; + Tc = ri[WS(is, 21)]; + Td = Tb + Tc; + Te = ri[WS(is, 11)]; + Tf = ri[WS(is, 16)]; + Tg = Te + Tf; + Th = Td + Tg; + T1h = Te - Tf; + TY = KP559016994 * (Td - Tg); + T1g = Tb - Tc; + } + { + E T11, T12, T19, T14, T15, T1a; + T11 = ii[WS(is, 6)]; + T12 = ii[WS(is, 21)]; + T19 = T11 + T12; + T14 = ii[WS(is, 11)]; + T15 = ii[WS(is, 16)]; + T1a = T14 + T15; + T13 = T11 - T12; + T1d = T19 + T1a; + T16 = T14 - T15; + T1b = KP559016994 * (T19 - T1a); + } + { + E Tk, Tl, Tm, Tn, To, Tp; + Tk = ri[WS(is, 9)]; + Tl = ri[WS(is, 24)]; + Tm = Tk + Tl; + Tn = ri[WS(is, 14)]; + To = ri[WS(is, 19)]; + Tp = Tn + To; + Tq = Tm + Tp; + T1E = Tn - To; + T1l = KP559016994 * (Tm - Tp); + T1D = Tk - Tl; + } + { + E T1o, T1p, T1w, T1r, T1s, T1x; + T1o = ii[WS(is, 9)]; + T1p = ii[WS(is, 24)]; + T1w = T1o + T1p; + T1r = ii[WS(is, 14)]; + T1s = ii[WS(is, 19)]; + T1x = T1r + T1s; + T1q = T1o - T1p; + T1A = T1w + T1x; + T1t = T1r - T1s; + T1y = KP559016994 * (T1w - T1x); + } + Ti = Ta + Th; + Tr = Tj + Tq; + Ts = Ti + Tr; + T5m = T1c + T1d; + T5n = T1z + T1A; + T5v = T5m + T5n; + { + E T17, T3L, T10, T3K, TZ; + T17 = FMA(KP951056516, T13, KP587785252 * T16); + T3L = FNMS(KP587785252, T13, KP951056516 * T16); + TZ = FNMS(KP250000000, Th, Ta); + T10 = TY + TZ; + T3K = TZ - TY; + T18 = T10 + T17; + T4G = T3K + T3L; + T34 = T10 - T17; + T3M = T3K - T3L; + } + { + E T1F, T3R, T1C, T3S, T1B; + T1F = FMA(KP951056516, T1D, KP587785252 * T1E); + T3R = FNMS(KP587785252, T1D, KP951056516 * T1E); + T1B = FNMS(KP250000000, T1A, T1z); + T1C = T1y + T1B; + T3S = T1B - T1y; + T1G = T1C - T1F; + T4J = T3S - T3R; + T38 = T1F + T1C; + T3T = T3R + T3S; + } + { + E T1u, T3V, T1n, T3U, T1m; + T1u = FMA(KP951056516, T1q, KP587785252 * T1t); + T3V = FNMS(KP587785252, T1q, KP951056516 * T1t); + T1m = FNMS(KP250000000, Tq, Tj); + T1n = T1l + T1m; + T3U = T1m - T1l; + T1v = T1n + T1u; + T4K = T3U + T3V; + T37 = T1n - T1u; + T3W = T3U - T3V; + } + { + E T1i, T3N, T1f, T3O, T1e; + T1i = FMA(KP951056516, T1g, KP587785252 * T1h); + T3N = FNMS(KP587785252, T1g, KP951056516 * T1h); + T1e = FNMS(KP250000000, T1d, T1c); + T1f = T1b + T1e; + T3O = T1e - T1b; + T1j = T1f - T1i; + T4H = T3O - T3N; + T35 = T1i + T1f; + T3P = T3N + T3O; + } + } + { + E Tt, T1X, TC, T2k, TA, T22, T1J, T21, T1O, T1Y, T1R, T1W, TJ, T2p, T26; + E T2o, T2b, T2l, T2e, T2j; + Tt = ri[WS(is, 2)]; + T1X = ii[WS(is, 2)]; + TC = ri[WS(is, 3)]; + T2k = ii[WS(is, 3)]; + { + E Tu, Tv, Tw, Tx, Ty, Tz; + Tu = ri[WS(is, 7)]; + Tv = ri[WS(is, 22)]; + Tw = Tu + Tv; + Tx = ri[WS(is, 12)]; + Ty = ri[WS(is, 17)]; + Tz = Tx + Ty; + TA = Tw + Tz; + T22 = Tx - Ty; + T1J = KP559016994 * (Tw - Tz); + T21 = Tu - Tv; + } + { + E T1M, T1N, T1U, T1P, T1Q, T1V; + T1M = ii[WS(is, 7)]; + T1N = ii[WS(is, 22)]; + T1U = T1M + T1N; + T1P = ii[WS(is, 12)]; + T1Q = ii[WS(is, 17)]; + T1V = T1P + T1Q; + T1O = T1M - T1N; + T1Y = T1U + T1V; + T1R = T1P - T1Q; + T1W = KP559016994 * (T1U - T1V); + } + { + E TD, TE, TF, TG, TH, TI; + TD = ri[WS(is, 8)]; + TE = ri[WS(is, 23)]; + TF = TD + TE; + TG = ri[WS(is, 13)]; + TH = ri[WS(is, 18)]; + TI = TG + TH; + TJ = TF + TI; + T2p = TG - TH; + T26 = KP559016994 * (TF - TI); + T2o = TD - TE; + } + { + E T29, T2a, T2h, T2c, T2d, T2i; + T29 = ii[WS(is, 8)]; + T2a = ii[WS(is, 23)]; + T2h = T29 + T2a; + T2c = ii[WS(is, 13)]; + T2d = ii[WS(is, 18)]; + T2i = T2c + T2d; + T2b = T29 - T2a; + T2l = T2h + T2i; + T2e = T2c - T2d; + T2j = KP559016994 * (T2h - T2i); + } + TB = Tt + TA; + TK = TC + TJ; + TL = TB + TK; + T5p = T1X + T1Y; + T5q = T2k + T2l; + T5w = T5p + T5q; + { + E T1S, T40, T1L, T3Z, T1K; + T1S = FMA(KP951056516, T1O, KP587785252 * T1R); + T40 = FNMS(KP587785252, T1O, KP951056516 * T1R); + T1K = FNMS(KP250000000, TA, Tt); + T1L = T1J + T1K; + T3Z = T1K - T1J; + T1T = T1L + T1S; + T4N = T3Z + T40; + T3c = T1L - T1S; + T41 = T3Z - T40; + } + { + E T2q, T49, T2n, T4a, T2m; + T2q = FMA(KP951056516, T2o, KP587785252 * T2p); + T49 = FNMS(KP587785252, T2o, KP951056516 * T2p); + T2m = FNMS(KP250000000, T2l, T2k); + T2n = T2j + T2m; + T4a = T2m - T2j; + T2r = T2n - T2q; + T4Q = T4a - T49; + T3e = T2q + T2n; + T4b = T49 + T4a; + } + { + E T2f, T47, T28, T46, T27; + T2f = FMA(KP951056516, T2b, KP587785252 * T2e); + T47 = FNMS(KP587785252, T2b, KP951056516 * T2e); + T27 = FNMS(KP250000000, TJ, TC); + T28 = T26 + T27; + T46 = T27 - T26; + T2g = T28 + T2f; + T4R = T46 + T47; + T3f = T28 - T2f; + T48 = T46 - T47; + } + { + E T23, T42, T20, T43, T1Z; + T23 = FMA(KP951056516, T21, KP587785252 * T22); + T42 = FNMS(KP587785252, T21, KP951056516 * T22); + T1Z = FNMS(KP250000000, T1Y, T1X); + T20 = T1W + T1Z; + T43 = T1Z - T1W; + T24 = T20 - T23; + T4O = T43 - T42; + T3b = T23 + T20; + T44 = T42 + T43; + } + } + { + E T5j, TM, T5k, T5s, T5u, T5o, T5r, T5t, T5l; + T5j = KP559016994 * (Ts - TL); + TM = Ts + TL; + T5k = FNMS(KP250000000, TM, T9); + T5o = T5m - T5n; + T5r = T5p - T5q; + T5s = FMA(KP951056516, T5o, KP587785252 * T5r); + T5u = FNMS(KP587785252, T5o, KP951056516 * T5r); + ro[0] = T9 + TM; + T5t = T5k - T5j; + ro[WS(os, 10)] = T5t - T5u; + ro[WS(os, 15)] = T5t + T5u; + T5l = T5j + T5k; + ro[WS(os, 20)] = T5l - T5s; + ro[WS(os, 5)] = T5l + T5s; + } + { + E T5x, T5z, T5A, T5E, T5F, T5C, T5D, T5G, T5B; + T5x = KP559016994 * (T5v - T5w); + T5z = T5v + T5w; + T5A = FNMS(KP250000000, T5z, T5y); + T5C = Ti - Tr; + T5D = TB - TK; + T5E = FMA(KP951056516, T5C, KP587785252 * T5D); + T5F = FNMS(KP587785252, T5C, KP951056516 * T5D); + io[0] = T5y + T5z; + T5G = T5A - T5x; + io[WS(os, 10)] = T5F + T5G; + io[WS(os, 15)] = T5G - T5F; + T5B = T5x + T5A; + io[WS(os, 5)] = T5B - T5E; + io[WS(os, 20)] = T5E + T5B; + } + { + E TX, T2U, T2u, T2Z, T2v, T2Y, T2A, T2V, T2D, T2J; + TX = TP + TW; + T2U = T2Q - T2T; + { + E T1k, T1H, T1I, T25, T2s, T2t; + T1k = FMA(KP968583161, T18, KP248689887 * T1j); + T1H = FMA(KP535826794, T1v, KP844327925 * T1G); + T1I = T1k + T1H; + T25 = FMA(KP876306680, T1T, KP481753674 * T24); + T2s = FMA(KP728968627, T2g, KP684547105 * T2r); + T2t = T25 + T2s; + T2u = T1I + T2t; + T2Z = T25 - T2s; + T2v = KP559016994 * (T1I - T2t); + T2Y = T1k - T1H; + } + { + E T2y, T2z, T2H, T2B, T2C, T2I; + T2y = FNMS(KP248689887, T18, KP968583161 * T1j); + T2z = FNMS(KP844327925, T1v, KP535826794 * T1G); + T2H = T2y + T2z; + T2B = FNMS(KP481753674, T1T, KP876306680 * T24); + T2C = FNMS(KP684547105, T2g, KP728968627 * T2r); + T2I = T2B + T2C; + T2A = T2y - T2z; + T2V = T2H + T2I; + T2D = T2B - T2C; + T2J = KP559016994 * (T2H - T2I); + } + ro[WS(os, 1)] = TX + T2u; + io[WS(os, 1)] = T2U + T2V; + { + E T2E, T2G, T2x, T2F, T2w; + T2E = FMA(KP951056516, T2A, KP587785252 * T2D); + T2G = FNMS(KP587785252, T2A, KP951056516 * T2D); + T2w = FNMS(KP250000000, T2u, TX); + T2x = T2v + T2w; + T2F = T2w - T2v; + ro[WS(os, 21)] = T2x - T2E; + ro[WS(os, 16)] = T2F + T2G; + ro[WS(os, 6)] = T2x + T2E; + ro[WS(os, 11)] = T2F - T2G; + } + { + E T30, T31, T2X, T32, T2W; + T30 = FMA(KP951056516, T2Y, KP587785252 * T2Z); + T31 = FNMS(KP587785252, T2Y, KP951056516 * T2Z); + T2W = FNMS(KP250000000, T2V, T2U); + T2X = T2J + T2W; + T32 = T2W - T2J; + io[WS(os, 6)] = T2X - T30; + io[WS(os, 16)] = T32 - T31; + io[WS(os, 21)] = T30 + T2X; + io[WS(os, 11)] = T31 + T32; + } + } + { + E T4F, T52, T4U, T5b, T56, T57, T51, T5f, T53, T5e; + T4F = T3H + T3I; + T52 = T4v - T4u; + { + E T4I, T4L, T4M, T4P, T4S, T4T; + T4I = FMA(KP728968627, T4G, KP684547105 * T4H); + T4L = FNMS(KP992114701, T4K, KP125333233 * T4J); + T4M = T4I + T4L; + T4P = FMA(KP062790519, T4N, KP998026728 * T4O); + T4S = FNMS(KP637423989, T4R, KP770513242 * T4Q); + T4T = T4P + T4S; + T4U = T4M + T4T; + T5b = KP559016994 * (T4M - T4T); + T56 = T4I - T4L; + T57 = T4P - T4S; + } + { + E T4V, T4W, T4X, T4Y, T4Z, T50; + T4V = FNMS(KP684547105, T4G, KP728968627 * T4H); + T4W = FMA(KP125333233, T4K, KP992114701 * T4J); + T4X = T4V - T4W; + T4Y = FNMS(KP998026728, T4N, KP062790519 * T4O); + T4Z = FMA(KP770513242, T4R, KP637423989 * T4Q); + T50 = T4Y - T4Z; + T51 = KP559016994 * (T4X - T50); + T5f = T4Y + T4Z; + T53 = T4X + T50; + T5e = T4V + T4W; + } + ro[WS(os, 3)] = T4F + T4U; + io[WS(os, 3)] = T52 + T53; + { + E T58, T59, T55, T5a, T54; + T58 = FMA(KP951056516, T56, KP587785252 * T57); + T59 = FNMS(KP587785252, T56, KP951056516 * T57); + T54 = FNMS(KP250000000, T53, T52); + T55 = T51 + T54; + T5a = T54 - T51; + io[WS(os, 8)] = T55 - T58; + io[WS(os, 18)] = T5a - T59; + io[WS(os, 23)] = T58 + T55; + io[WS(os, 13)] = T59 + T5a; + } + { + E T5g, T5i, T5d, T5h, T5c; + T5g = FMA(KP951056516, T5e, KP587785252 * T5f); + T5i = FNMS(KP587785252, T5e, KP951056516 * T5f); + T5c = FNMS(KP250000000, T4U, T4F); + T5d = T5b + T5c; + T5h = T5c - T5b; + ro[WS(os, 23)] = T5d - T5g; + ro[WS(os, 18)] = T5h + T5i; + ro[WS(os, 8)] = T5d + T5g; + ro[WS(os, 13)] = T5h - T5i; + } + } + { + E T3J, T4w, T4e, T4B, T4f, T4A, T4k, T4x, T4n, T4t; + T3J = T3H - T3I; + T4w = T4u + T4v; + { + E T3Q, T3X, T3Y, T45, T4c, T4d; + T3Q = FMA(KP876306680, T3M, KP481753674 * T3P); + T3X = FNMS(KP425779291, T3W, KP904827052 * T3T); + T3Y = T3Q + T3X; + T45 = FMA(KP535826794, T41, KP844327925 * T44); + T4c = FMA(KP062790519, T48, KP998026728 * T4b); + T4d = T45 + T4c; + T4e = T3Y + T4d; + T4B = T45 - T4c; + T4f = KP559016994 * (T3Y - T4d); + T4A = T3Q - T3X; + } + { + E T4i, T4j, T4r, T4l, T4m, T4s; + T4i = FNMS(KP481753674, T3M, KP876306680 * T3P); + T4j = FMA(KP904827052, T3W, KP425779291 * T3T); + T4r = T4i - T4j; + T4l = FNMS(KP844327925, T41, KP535826794 * T44); + T4m = FNMS(KP998026728, T48, KP062790519 * T4b); + T4s = T4l + T4m; + T4k = T4i + T4j; + T4x = T4r + T4s; + T4n = T4l - T4m; + T4t = KP559016994 * (T4r - T4s); + } + ro[WS(os, 2)] = T3J + T4e; + io[WS(os, 2)] = T4w + T4x; + { + E T4o, T4q, T4h, T4p, T4g; + T4o = FMA(KP951056516, T4k, KP587785252 * T4n); + T4q = FNMS(KP587785252, T4k, KP951056516 * T4n); + T4g = FNMS(KP250000000, T4e, T3J); + T4h = T4f + T4g; + T4p = T4g - T4f; + ro[WS(os, 22)] = T4h - T4o; + ro[WS(os, 17)] = T4p + T4q; + ro[WS(os, 7)] = T4h + T4o; + ro[WS(os, 12)] = T4p - T4q; + } + { + E T4C, T4D, T4z, T4E, T4y; + T4C = FMA(KP951056516, T4A, KP587785252 * T4B); + T4D = FNMS(KP587785252, T4A, KP951056516 * T4B); + T4y = FNMS(KP250000000, T4x, T4w); + T4z = T4t + T4y; + T4E = T4y - T4t; + io[WS(os, 7)] = T4z - T4C; + io[WS(os, 17)] = T4E - T4D; + io[WS(os, 22)] = T4C + T4z; + io[WS(os, 12)] = T4D + T4E; + } + } + { + E T33, T3j, T3i, T3z, T3r, T3s, T3q, T3D, T3v, T3C; + T33 = TP - TW; + T3j = T2T + T2Q; + { + E T36, T39, T3a, T3d, T3g, T3h; + T36 = FMA(KP535826794, T34, KP844327925 * T35); + T39 = FMA(KP637423989, T37, KP770513242 * T38); + T3a = T36 - T39; + T3d = FNMS(KP425779291, T3c, KP904827052 * T3b); + T3g = FNMS(KP992114701, T3f, KP125333233 * T3e); + T3h = T3d + T3g; + T3i = T3a + T3h; + T3z = KP559016994 * (T3a - T3h); + T3r = T3d - T3g; + T3s = T36 + T39; + } + { + E T3k, T3l, T3m, T3n, T3o, T3p; + T3k = FNMS(KP844327925, T34, KP535826794 * T35); + T3l = FNMS(KP637423989, T38, KP770513242 * T37); + T3m = T3k + T3l; + T3n = FMA(KP904827052, T3c, KP425779291 * T3b); + T3o = FMA(KP125333233, T3f, KP992114701 * T3e); + T3p = T3n + T3o; + T3q = T3m - T3p; + T3D = T3o - T3n; + T3v = KP559016994 * (T3m + T3p); + T3C = T3k - T3l; + } + ro[WS(os, 4)] = T33 + T3i; + io[WS(os, 4)] = T3j + T3q; + { + E T3t, T3y, T3w, T3x, T3u; + T3t = FNMS(KP587785252, T3s, KP951056516 * T3r); + T3y = FMA(KP951056516, T3s, KP587785252 * T3r); + T3u = FNMS(KP250000000, T3q, T3j); + T3w = T3u - T3v; + T3x = T3u + T3v; + io[WS(os, 14)] = T3t + T3w; + io[WS(os, 24)] = T3y + T3x; + io[WS(os, 19)] = T3w - T3t; + io[WS(os, 9)] = T3x - T3y; + } + { + E T3E, T3G, T3B, T3F, T3A; + T3E = FMA(KP951056516, T3C, KP587785252 * T3D); + T3G = FNMS(KP587785252, T3C, KP951056516 * T3D); + T3A = FNMS(KP250000000, T3i, T33); + T3B = T3z + T3A; + T3F = T3A - T3z; + ro[WS(os, 24)] = T3B - T3E; + ro[WS(os, 19)] = T3F + T3G; + ro[WS(os, 9)] = T3B + T3E; + ro[WS(os, 14)] = T3F - T3G; + } + } + } + } +} + +static const kdft_desc desc = { 25, "n1_25", {260, 92, 92, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_25) (planner *p) { + X(kdft_register) (p, n1_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_3.c new file mode 100644 index 000000000..37ba4e954 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_3.c @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 3 -name n1_3 -include dft/scalar/n.h */ + +/* + * This function contains 12 FP additions, 6 FP multiplications, + * (or, 6 additions, 0 multiplications, 6 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_3(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + E T1, T9, T4, Tc, T8, Ta, T5, Tb; + T1 = ri[0]; + T9 = ii[0]; + { + E T2, T3, T6, T7; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 2)]; + T4 = T2 + T3; + Tc = T3 - T2; + T6 = ii[WS(is, 1)]; + T7 = ii[WS(is, 2)]; + T8 = T6 - T7; + Ta = T6 + T7; + } + ro[0] = T1 + T4; + io[0] = T9 + Ta; + T5 = FNMS(KP500000000, T4, T1); + ro[WS(os, 2)] = FNMS(KP866025403, T8, T5); + ro[WS(os, 1)] = FMA(KP866025403, T8, T5); + Tb = FNMS(KP500000000, Ta, T9); + io[WS(os, 1)] = FMA(KP866025403, Tc, Tb); + io[WS(os, 2)] = FNMS(KP866025403, Tc, Tb); + } + } +} + +static const kdft_desc desc = { 3, "n1_3", {6, 0, 6, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_3) (planner *p) { + X(kdft_register) (p, n1_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 3 -name n1_3 -include dft/scalar/n.h */ + +/* + * This function contains 12 FP additions, 4 FP multiplications, + * (or, 10 additions, 2 multiplications, 2 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_3(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + E T1, Ta, T4, T9, T8, Tb, T5, Tc; + T1 = ri[0]; + Ta = ii[0]; + { + E T2, T3, T6, T7; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 2)]; + T4 = T2 + T3; + T9 = KP866025403 * (T3 - T2); + T6 = ii[WS(is, 1)]; + T7 = ii[WS(is, 2)]; + T8 = KP866025403 * (T6 - T7); + Tb = T6 + T7; + } + ro[0] = T1 + T4; + io[0] = Ta + Tb; + T5 = FNMS(KP500000000, T4, T1); + ro[WS(os, 2)] = T5 - T8; + ro[WS(os, 1)] = T5 + T8; + Tc = FNMS(KP500000000, Tb, Ta); + io[WS(os, 1)] = T9 + Tc; + io[WS(os, 2)] = Tc - T9; + } + } +} + +static const kdft_desc desc = { 3, "n1_3", {10, 2, 2, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_3) (planner *p) { + X(kdft_register) (p, n1_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_32.c new file mode 100644 index 000000000..fd1734cb5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_32.c @@ -0,0 +1,1320 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -name n1_32 -include dft/scalar/n.h */ + +/* + * This function contains 372 FP additions, 136 FP multiplications, + * (or, 236 additions, 0 multiplications, 136 fused multiply/add), + * 100 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + E T7, T4r, T4Z, T18, T1z, T3t, T3T, T2T, Te, T1f, T50, T4s, T2W, T3u, T1G; + E T3U, Tm, T1n, T1O, T2Z, T3y, T3X, T4w, T53, Tt, T1u, T1V, T2Y, T3B, T3W; + E T4z, T52, T2t, T3L, T3O, T2K, TR, TY, T5F, T5G, T5H, T5I, T4R, T5k, T2E; + E T3M, T4W, T5j, T2N, T3P, T22, T3E, T3H, T2j, TC, TJ, T5A, T5B, T5C, T5D; + E T4G, T5h, T2d, T3F, T4L, T5g, T2m, T3I; + { + E T3, T1x, T14, T2R, T6, T2S, T17, T1y; + { + E T1, T2, T12, T13; + T1 = ri[0]; + T2 = ri[WS(is, 16)]; + T3 = T1 + T2; + T1x = T1 - T2; + T12 = ii[0]; + T13 = ii[WS(is, 16)]; + T14 = T12 + T13; + T2R = T12 - T13; + } + { + E T4, T5, T15, T16; + T4 = ri[WS(is, 8)]; + T5 = ri[WS(is, 24)]; + T6 = T4 + T5; + T2S = T4 - T5; + T15 = ii[WS(is, 8)]; + T16 = ii[WS(is, 24)]; + T17 = T15 + T16; + T1y = T15 - T16; + } + T7 = T3 + T6; + T4r = T3 - T6; + T4Z = T14 - T17; + T18 = T14 + T17; + T1z = T1x + T1y; + T3t = T1x - T1y; + T3T = T2S + T2R; + T2T = T2R - T2S; + } + { + E Ta, T1A, T1b, T1B, Td, T1D, T1e, T1E; + { + E T8, T9, T19, T1a; + T8 = ri[WS(is, 4)]; + T9 = ri[WS(is, 20)]; + Ta = T8 + T9; + T1A = T8 - T9; + T19 = ii[WS(is, 4)]; + T1a = ii[WS(is, 20)]; + T1b = T19 + T1a; + T1B = T19 - T1a; + } + { + E Tb, Tc, T1c, T1d; + Tb = ri[WS(is, 28)]; + Tc = ri[WS(is, 12)]; + Td = Tb + Tc; + T1D = Tb - Tc; + T1c = ii[WS(is, 28)]; + T1d = ii[WS(is, 12)]; + T1e = T1c + T1d; + T1E = T1c - T1d; + } + Te = Ta + Td; + T1f = T1b + T1e; + T50 = Td - Ta; + T4s = T1b - T1e; + { + E T2U, T2V, T1C, T1F; + T2U = T1B - T1A; + T2V = T1D + T1E; + T2W = T2U + T2V; + T3u = T2U - T2V; + T1C = T1A + T1B; + T1F = T1D - T1E; + T1G = T1C + T1F; + T3U = T1F - T1C; + } + } + { + E Ti, T1L, T1j, T1I, Tl, T1J, T1m, T1M, T1K, T1N; + { + E Tg, Th, T1h, T1i; + Tg = ri[WS(is, 2)]; + Th = ri[WS(is, 18)]; + Ti = Tg + Th; + T1L = Tg - Th; + T1h = ii[WS(is, 2)]; + T1i = ii[WS(is, 18)]; + T1j = T1h + T1i; + T1I = T1h - T1i; + } + { + E Tj, Tk, T1k, T1l; + Tj = ri[WS(is, 10)]; + Tk = ri[WS(is, 26)]; + Tl = Tj + Tk; + T1J = Tj - Tk; + T1k = ii[WS(is, 10)]; + T1l = ii[WS(is, 26)]; + T1m = T1k + T1l; + T1M = T1k - T1l; + } + Tm = Ti + Tl; + T1n = T1j + T1m; + T1K = T1I - T1J; + T1N = T1L + T1M; + T1O = FNMS(KP414213562, T1N, T1K); + T2Z = FMA(KP414213562, T1K, T1N); + { + E T3w, T3x, T4u, T4v; + T3w = T1J + T1I; + T3x = T1L - T1M; + T3y = FMA(KP414213562, T3x, T3w); + T3X = FNMS(KP414213562, T3w, T3x); + T4u = T1j - T1m; + T4v = Ti - Tl; + T4w = T4u - T4v; + T53 = T4v + T4u; + } + } + { + E Tp, T1S, T1q, T1P, Ts, T1Q, T1t, T1T, T1R, T1U; + { + E Tn, To, T1o, T1p; + Tn = ri[WS(is, 30)]; + To = ri[WS(is, 14)]; + Tp = Tn + To; + T1S = Tn - To; + T1o = ii[WS(is, 30)]; + T1p = ii[WS(is, 14)]; + T1q = T1o + T1p; + T1P = T1o - T1p; + } + { + E Tq, Tr, T1r, T1s; + Tq = ri[WS(is, 6)]; + Tr = ri[WS(is, 22)]; + Ts = Tq + Tr; + T1Q = Tq - Tr; + T1r = ii[WS(is, 6)]; + T1s = ii[WS(is, 22)]; + T1t = T1r + T1s; + T1T = T1r - T1s; + } + Tt = Tp + Ts; + T1u = T1q + T1t; + T1R = T1P - T1Q; + T1U = T1S + T1T; + T1V = FMA(KP414213562, T1U, T1R); + T2Y = FNMS(KP414213562, T1R, T1U); + { + E T3z, T3A, T4x, T4y; + T3z = T1Q + T1P; + T3A = T1S - T1T; + T3B = FNMS(KP414213562, T3A, T3z); + T3W = FMA(KP414213562, T3z, T3A); + T4x = Tp - Ts; + T4y = T1q - T1t; + T4z = T4x + T4y; + T52 = T4x - T4y; + } + } + { + E TN, T2G, T2r, T4N, TQ, T2s, T2J, T4O, TU, T2x, T2w, T4T, TX, T2z, T2C; + E T4U; + { + E TL, TM, T2p, T2q; + TL = ri[WS(is, 31)]; + TM = ri[WS(is, 15)]; + TN = TL + TM; + T2G = TL - TM; + T2p = ii[WS(is, 31)]; + T2q = ii[WS(is, 15)]; + T2r = T2p - T2q; + T4N = T2p + T2q; + } + { + E TO, TP, T2H, T2I; + TO = ri[WS(is, 7)]; + TP = ri[WS(is, 23)]; + TQ = TO + TP; + T2s = TO - TP; + T2H = ii[WS(is, 7)]; + T2I = ii[WS(is, 23)]; + T2J = T2H - T2I; + T4O = T2H + T2I; + } + { + E TS, TT, T2u, T2v; + TS = ri[WS(is, 3)]; + TT = ri[WS(is, 19)]; + TU = TS + TT; + T2x = TS - TT; + T2u = ii[WS(is, 3)]; + T2v = ii[WS(is, 19)]; + T2w = T2u - T2v; + T4T = T2u + T2v; + } + { + E TV, TW, T2A, T2B; + TV = ri[WS(is, 27)]; + TW = ri[WS(is, 11)]; + TX = TV + TW; + T2z = TV - TW; + T2A = ii[WS(is, 27)]; + T2B = ii[WS(is, 11)]; + T2C = T2A - T2B; + T4U = T2A + T2B; + } + T2t = T2r - T2s; + T3L = T2G - T2J; + T3O = T2s + T2r; + T2K = T2G + T2J; + TR = TN + TQ; + TY = TU + TX; + T5F = TR - TY; + { + E T4P, T4Q, T2y, T2D; + T5G = T4N + T4O; + T5H = T4T + T4U; + T5I = T5G - T5H; + T4P = T4N - T4O; + T4Q = TX - TU; + T4R = T4P - T4Q; + T5k = T4Q + T4P; + T2y = T2w - T2x; + T2D = T2z + T2C; + T2E = T2y + T2D; + T3M = T2D - T2y; + { + E T4S, T4V, T2L, T2M; + T4S = TN - TQ; + T4V = T4T - T4U; + T4W = T4S - T4V; + T5j = T4S + T4V; + T2L = T2x + T2w; + T2M = T2z - T2C; + T2N = T2L + T2M; + T3P = T2L - T2M; + } + } + } + { + E Ty, T2f, T20, T4C, TB, T21, T2i, T4D, TF, T26, T25, T4I, TI, T28, T2b; + E T4J; + { + E Tw, Tx, T1Y, T1Z; + Tw = ri[WS(is, 1)]; + Tx = ri[WS(is, 17)]; + Ty = Tw + Tx; + T2f = Tw - Tx; + T1Y = ii[WS(is, 1)]; + T1Z = ii[WS(is, 17)]; + T20 = T1Y - T1Z; + T4C = T1Y + T1Z; + } + { + E Tz, TA, T2g, T2h; + Tz = ri[WS(is, 9)]; + TA = ri[WS(is, 25)]; + TB = Tz + TA; + T21 = Tz - TA; + T2g = ii[WS(is, 9)]; + T2h = ii[WS(is, 25)]; + T2i = T2g - T2h; + T4D = T2g + T2h; + } + { + E TD, TE, T23, T24; + TD = ri[WS(is, 5)]; + TE = ri[WS(is, 21)]; + TF = TD + TE; + T26 = TD - TE; + T23 = ii[WS(is, 5)]; + T24 = ii[WS(is, 21)]; + T25 = T23 - T24; + T4I = T23 + T24; + } + { + E TG, TH, T29, T2a; + TG = ri[WS(is, 29)]; + TH = ri[WS(is, 13)]; + TI = TG + TH; + T28 = TG - TH; + T29 = ii[WS(is, 29)]; + T2a = ii[WS(is, 13)]; + T2b = T29 - T2a; + T4J = T29 + T2a; + } + T22 = T20 - T21; + T3E = T2f - T2i; + T3H = T21 + T20; + T2j = T2f + T2i; + TC = Ty + TB; + TJ = TF + TI; + T5A = TC - TJ; + { + E T4E, T4F, T27, T2c; + T5B = T4C + T4D; + T5C = T4I + T4J; + T5D = T5B - T5C; + T4E = T4C - T4D; + T4F = TI - TF; + T4G = T4E - T4F; + T5h = T4F + T4E; + T27 = T25 - T26; + T2c = T28 + T2b; + T2d = T27 + T2c; + T3F = T2c - T27; + { + E T4H, T4K, T2k, T2l; + T4H = Ty - TB; + T4K = T4I - T4J; + T4L = T4H - T4K; + T5g = T4H + T4K; + T2k = T26 + T25; + T2l = T28 - T2b; + T2m = T2k + T2l; + T3I = T2k - T2l; + } + } + } + { + E T4B, T5b, T5a, T5c, T4Y, T56, T55, T57; + { + E T4t, T4A, T58, T59; + T4t = T4r - T4s; + T4A = T4w - T4z; + T4B = FMA(KP707106781, T4A, T4t); + T5b = FNMS(KP707106781, T4A, T4t); + T58 = FMA(KP414213562, T4R, T4W); + T59 = FNMS(KP414213562, T4G, T4L); + T5a = T58 - T59; + T5c = T59 + T58; + } + { + E T4M, T4X, T51, T54; + T4M = FMA(KP414213562, T4L, T4G); + T4X = FNMS(KP414213562, T4W, T4R); + T4Y = T4M - T4X; + T56 = T4M + T4X; + T51 = T4Z - T50; + T54 = T52 - T53; + T55 = FNMS(KP707106781, T54, T51); + T57 = FMA(KP707106781, T54, T51); + } + ro[WS(os, 22)] = FNMS(KP923879532, T4Y, T4B); + io[WS(os, 22)] = FNMS(KP923879532, T5a, T57); + ro[WS(os, 6)] = FMA(KP923879532, T4Y, T4B); + io[WS(os, 6)] = FMA(KP923879532, T5a, T57); + io[WS(os, 14)] = FNMS(KP923879532, T56, T55); + ro[WS(os, 14)] = FNMS(KP923879532, T5c, T5b); + io[WS(os, 30)] = FMA(KP923879532, T56, T55); + ro[WS(os, 30)] = FMA(KP923879532, T5c, T5b); + } + { + E T5f, T5r, T5u, T5w, T5m, T5q, T5p, T5v; + { + E T5d, T5e, T5s, T5t; + T5d = T4r + T4s; + T5e = T53 + T52; + T5f = FMA(KP707106781, T5e, T5d); + T5r = FNMS(KP707106781, T5e, T5d); + T5s = FNMS(KP414213562, T5g, T5h); + T5t = FMA(KP414213562, T5j, T5k); + T5u = T5s - T5t; + T5w = T5s + T5t; + } + { + E T5i, T5l, T5n, T5o; + T5i = FMA(KP414213562, T5h, T5g); + T5l = FNMS(KP414213562, T5k, T5j); + T5m = T5i + T5l; + T5q = T5l - T5i; + T5n = T50 + T4Z; + T5o = T4w + T4z; + T5p = FNMS(KP707106781, T5o, T5n); + T5v = FMA(KP707106781, T5o, T5n); + } + ro[WS(os, 18)] = FNMS(KP923879532, T5m, T5f); + io[WS(os, 18)] = FNMS(KP923879532, T5w, T5v); + ro[WS(os, 2)] = FMA(KP923879532, T5m, T5f); + io[WS(os, 2)] = FMA(KP923879532, T5w, T5v); + io[WS(os, 26)] = FNMS(KP923879532, T5q, T5p); + ro[WS(os, 26)] = FNMS(KP923879532, T5u, T5r); + io[WS(os, 10)] = FMA(KP923879532, T5q, T5p); + ro[WS(os, 10)] = FMA(KP923879532, T5u, T5r); + } + { + E T5z, T5P, T5S, T5U, T5K, T5O, T5N, T5T; + { + E T5x, T5y, T5Q, T5R; + T5x = T7 - Te; + T5y = T1n - T1u; + T5z = T5x + T5y; + T5P = T5x - T5y; + T5Q = T5D - T5A; + T5R = T5F + T5I; + T5S = T5Q - T5R; + T5U = T5Q + T5R; + } + { + E T5E, T5J, T5L, T5M; + T5E = T5A + T5D; + T5J = T5F - T5I; + T5K = T5E + T5J; + T5O = T5J - T5E; + T5L = T18 - T1f; + T5M = Tt - Tm; + T5N = T5L - T5M; + T5T = T5M + T5L; + } + ro[WS(os, 20)] = FNMS(KP707106781, T5K, T5z); + io[WS(os, 20)] = FNMS(KP707106781, T5U, T5T); + ro[WS(os, 4)] = FMA(KP707106781, T5K, T5z); + io[WS(os, 4)] = FMA(KP707106781, T5U, T5T); + io[WS(os, 28)] = FNMS(KP707106781, T5O, T5N); + ro[WS(os, 28)] = FNMS(KP707106781, T5S, T5P); + io[WS(os, 12)] = FMA(KP707106781, T5O, T5N); + ro[WS(os, 12)] = FMA(KP707106781, T5S, T5P); + } + { + E Tv, T5V, T5Y, T60, T10, T11, T1w, T5Z; + { + E Tf, Tu, T5W, T5X; + Tf = T7 + Te; + Tu = Tm + Tt; + Tv = Tf + Tu; + T5V = Tf - Tu; + T5W = T5B + T5C; + T5X = T5G + T5H; + T5Y = T5W - T5X; + T60 = T5W + T5X; + } + { + E TK, TZ, T1g, T1v; + TK = TC + TJ; + TZ = TR + TY; + T10 = TK + TZ; + T11 = TZ - TK; + T1g = T18 + T1f; + T1v = T1n + T1u; + T1w = T1g - T1v; + T5Z = T1g + T1v; + } + ro[WS(os, 16)] = Tv - T10; + io[WS(os, 16)] = T5Z - T60; + ro[0] = Tv + T10; + io[0] = T5Z + T60; + io[WS(os, 8)] = T11 + T1w; + ro[WS(os, 8)] = T5V + T5Y; + io[WS(os, 24)] = T1w - T11; + ro[WS(os, 24)] = T5V - T5Y; + } + { + E T1X, T37, T31, T33, T2o, T35, T2P, T34; + { + E T1H, T1W, T2X, T30; + T1H = FNMS(KP707106781, T1G, T1z); + T1W = T1O - T1V; + T1X = FMA(KP923879532, T1W, T1H); + T37 = FNMS(KP923879532, T1W, T1H); + T2X = FNMS(KP707106781, T2W, T2T); + T30 = T2Y - T2Z; + T31 = FNMS(KP923879532, T30, T2X); + T33 = FMA(KP923879532, T30, T2X); + } + { + E T2e, T2n, T2F, T2O; + T2e = FNMS(KP707106781, T2d, T22); + T2n = FNMS(KP707106781, T2m, T2j); + T2o = FMA(KP668178637, T2n, T2e); + T35 = FNMS(KP668178637, T2e, T2n); + T2F = FNMS(KP707106781, T2E, T2t); + T2O = FNMS(KP707106781, T2N, T2K); + T2P = FNMS(KP668178637, T2O, T2F); + T34 = FMA(KP668178637, T2F, T2O); + } + { + E T2Q, T36, T32, T38; + T2Q = T2o - T2P; + ro[WS(os, 21)] = FNMS(KP831469612, T2Q, T1X); + ro[WS(os, 5)] = FMA(KP831469612, T2Q, T1X); + T36 = T34 - T35; + io[WS(os, 21)] = FNMS(KP831469612, T36, T33); + io[WS(os, 5)] = FMA(KP831469612, T36, T33); + T32 = T2o + T2P; + io[WS(os, 13)] = FNMS(KP831469612, T32, T31); + io[WS(os, 29)] = FMA(KP831469612, T32, T31); + T38 = T35 + T34; + ro[WS(os, 13)] = FNMS(KP831469612, T38, T37); + ro[WS(os, 29)] = FMA(KP831469612, T38, T37); + } + } + { + E T3D, T41, T3Z, T45, T3K, T42, T3R, T43; + { + E T3v, T3C, T3V, T3Y; + T3v = FMA(KP707106781, T3u, T3t); + T3C = T3y - T3B; + T3D = FMA(KP923879532, T3C, T3v); + T41 = FNMS(KP923879532, T3C, T3v); + T3V = FMA(KP707106781, T3U, T3T); + T3Y = T3W - T3X; + T3Z = FNMS(KP923879532, T3Y, T3V); + T45 = FMA(KP923879532, T3Y, T3V); + } + { + E T3G, T3J, T3N, T3Q; + T3G = FNMS(KP707106781, T3F, T3E); + T3J = FNMS(KP707106781, T3I, T3H); + T3K = FMA(KP668178637, T3J, T3G); + T42 = FNMS(KP668178637, T3G, T3J); + T3N = FNMS(KP707106781, T3M, T3L); + T3Q = FNMS(KP707106781, T3P, T3O); + T3R = FNMS(KP668178637, T3Q, T3N); + T43 = FMA(KP668178637, T3N, T3Q); + } + { + E T3S, T46, T40, T44; + T3S = T3K + T3R; + ro[WS(os, 19)] = FNMS(KP831469612, T3S, T3D); + ro[WS(os, 3)] = FMA(KP831469612, T3S, T3D); + T46 = T42 + T43; + io[WS(os, 19)] = FNMS(KP831469612, T46, T45); + io[WS(os, 3)] = FMA(KP831469612, T46, T45); + T40 = T3R - T3K; + io[WS(os, 27)] = FNMS(KP831469612, T40, T3Z); + io[WS(os, 11)] = FMA(KP831469612, T40, T3Z); + T44 = T42 - T43; + ro[WS(os, 27)] = FNMS(KP831469612, T44, T41); + ro[WS(os, 11)] = FMA(KP831469612, T44, T41); + } + } + { + E T49, T4p, T4j, T4l, T4c, T4n, T4f, T4m; + { + E T47, T48, T4h, T4i; + T47 = FNMS(KP707106781, T3u, T3t); + T48 = T3X + T3W; + T49 = FNMS(KP923879532, T48, T47); + T4p = FMA(KP923879532, T48, T47); + T4h = FNMS(KP707106781, T3U, T3T); + T4i = T3y + T3B; + T4j = FMA(KP923879532, T4i, T4h); + T4l = FNMS(KP923879532, T4i, T4h); + } + { + E T4a, T4b, T4d, T4e; + T4a = FMA(KP707106781, T3I, T3H); + T4b = FMA(KP707106781, T3F, T3E); + T4c = FMA(KP198912367, T4b, T4a); + T4n = FNMS(KP198912367, T4a, T4b); + T4d = FMA(KP707106781, T3P, T3O); + T4e = FMA(KP707106781, T3M, T3L); + T4f = FNMS(KP198912367, T4e, T4d); + T4m = FMA(KP198912367, T4d, T4e); + } + { + E T4g, T4o, T4k, T4q; + T4g = T4c - T4f; + ro[WS(os, 23)] = FNMS(KP980785280, T4g, T49); + ro[WS(os, 7)] = FMA(KP980785280, T4g, T49); + T4o = T4m - T4n; + io[WS(os, 23)] = FNMS(KP980785280, T4o, T4l); + io[WS(os, 7)] = FMA(KP980785280, T4o, T4l); + T4k = T4c + T4f; + io[WS(os, 15)] = FNMS(KP980785280, T4k, T4j); + io[WS(os, 31)] = FMA(KP980785280, T4k, T4j); + T4q = T4n + T4m; + ro[WS(os, 15)] = FNMS(KP980785280, T4q, T4p); + ro[WS(os, 31)] = FMA(KP980785280, T4q, T4p); + } + } + { + E T3b, T3n, T3l, T3r, T3e, T3o, T3h, T3p; + { + E T39, T3a, T3j, T3k; + T39 = FMA(KP707106781, T1G, T1z); + T3a = T2Z + T2Y; + T3b = FMA(KP923879532, T3a, T39); + T3n = FNMS(KP923879532, T3a, T39); + T3j = FMA(KP707106781, T2W, T2T); + T3k = T1O + T1V; + T3l = FNMS(KP923879532, T3k, T3j); + T3r = FMA(KP923879532, T3k, T3j); + } + { + E T3c, T3d, T3f, T3g; + T3c = FMA(KP707106781, T2m, T2j); + T3d = FMA(KP707106781, T2d, T22); + T3e = FMA(KP198912367, T3d, T3c); + T3o = FNMS(KP198912367, T3c, T3d); + T3f = FMA(KP707106781, T2N, T2K); + T3g = FMA(KP707106781, T2E, T2t); + T3h = FNMS(KP198912367, T3g, T3f); + T3p = FMA(KP198912367, T3f, T3g); + } + { + E T3i, T3s, T3m, T3q; + T3i = T3e + T3h; + ro[WS(os, 17)] = FNMS(KP980785280, T3i, T3b); + ro[WS(os, 1)] = FMA(KP980785280, T3i, T3b); + T3s = T3o + T3p; + io[WS(os, 17)] = FNMS(KP980785280, T3s, T3r); + io[WS(os, 1)] = FMA(KP980785280, T3s, T3r); + T3m = T3h - T3e; + io[WS(os, 25)] = FNMS(KP980785280, T3m, T3l); + io[WS(os, 9)] = FMA(KP980785280, T3m, T3l); + T3q = T3o - T3p; + ro[WS(os, 25)] = FNMS(KP980785280, T3q, T3n); + ro[WS(os, 9)] = FMA(KP980785280, T3q, T3n); + } + } + } + } +} + +static const kdft_desc desc = { 32, "n1_32", {236, 0, 136, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_32) (planner *p) { + X(kdft_register) (p, n1_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 32 -name n1_32 -include dft/scalar/n.h */ + +/* + * This function contains 372 FP additions, 84 FP multiplications, + * (or, 340 additions, 52 multiplications, 32 fused multiply/add), + * 100 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + E T7, T4r, T4Z, T18, T1z, T3t, T3T, T2T, Te, T1f, T50, T4s, T2W, T3u, T1G; + E T3U, Tm, T1n, T1O, T2Z, T3y, T3X, T4w, T53, Tt, T1u, T1V, T2Y, T3B, T3W; + E T4z, T52, T2t, T3L, T3O, T2K, TR, TY, T5F, T5G, T5H, T5I, T4R, T5j, T2E; + E T3P, T4W, T5k, T2N, T3M, T22, T3E, T3H, T2j, TC, TJ, T5A, T5B, T5C, T5D; + E T4G, T5g, T2d, T3F, T4L, T5h, T2m, T3I; + { + E T3, T1x, T14, T2S, T6, T2R, T17, T1y; + { + E T1, T2, T12, T13; + T1 = ri[0]; + T2 = ri[WS(is, 16)]; + T3 = T1 + T2; + T1x = T1 - T2; + T12 = ii[0]; + T13 = ii[WS(is, 16)]; + T14 = T12 + T13; + T2S = T12 - T13; + } + { + E T4, T5, T15, T16; + T4 = ri[WS(is, 8)]; + T5 = ri[WS(is, 24)]; + T6 = T4 + T5; + T2R = T4 - T5; + T15 = ii[WS(is, 8)]; + T16 = ii[WS(is, 24)]; + T17 = T15 + T16; + T1y = T15 - T16; + } + T7 = T3 + T6; + T4r = T3 - T6; + T4Z = T14 - T17; + T18 = T14 + T17; + T1z = T1x - T1y; + T3t = T1x + T1y; + T3T = T2S - T2R; + T2T = T2R + T2S; + } + { + E Ta, T1B, T1b, T1A, Td, T1D, T1e, T1E; + { + E T8, T9, T19, T1a; + T8 = ri[WS(is, 4)]; + T9 = ri[WS(is, 20)]; + Ta = T8 + T9; + T1B = T8 - T9; + T19 = ii[WS(is, 4)]; + T1a = ii[WS(is, 20)]; + T1b = T19 + T1a; + T1A = T19 - T1a; + } + { + E Tb, Tc, T1c, T1d; + Tb = ri[WS(is, 28)]; + Tc = ri[WS(is, 12)]; + Td = Tb + Tc; + T1D = Tb - Tc; + T1c = ii[WS(is, 28)]; + T1d = ii[WS(is, 12)]; + T1e = T1c + T1d; + T1E = T1c - T1d; + } + Te = Ta + Td; + T1f = T1b + T1e; + T50 = Td - Ta; + T4s = T1b - T1e; + { + E T2U, T2V, T1C, T1F; + T2U = T1D - T1E; + T2V = T1B + T1A; + T2W = KP707106781 * (T2U - T2V); + T3u = KP707106781 * (T2V + T2U); + T1C = T1A - T1B; + T1F = T1D + T1E; + T1G = KP707106781 * (T1C - T1F); + T3U = KP707106781 * (T1C + T1F); + } + } + { + E Ti, T1L, T1j, T1J, Tl, T1I, T1m, T1M, T1K, T1N; + { + E Tg, Th, T1h, T1i; + Tg = ri[WS(is, 2)]; + Th = ri[WS(is, 18)]; + Ti = Tg + Th; + T1L = Tg - Th; + T1h = ii[WS(is, 2)]; + T1i = ii[WS(is, 18)]; + T1j = T1h + T1i; + T1J = T1h - T1i; + } + { + E Tj, Tk, T1k, T1l; + Tj = ri[WS(is, 10)]; + Tk = ri[WS(is, 26)]; + Tl = Tj + Tk; + T1I = Tj - Tk; + T1k = ii[WS(is, 10)]; + T1l = ii[WS(is, 26)]; + T1m = T1k + T1l; + T1M = T1k - T1l; + } + Tm = Ti + Tl; + T1n = T1j + T1m; + T1K = T1I + T1J; + T1N = T1L - T1M; + T1O = FNMS(KP923879532, T1N, KP382683432 * T1K); + T2Z = FMA(KP923879532, T1K, KP382683432 * T1N); + { + E T3w, T3x, T4u, T4v; + T3w = T1J - T1I; + T3x = T1L + T1M; + T3y = FNMS(KP382683432, T3x, KP923879532 * T3w); + T3X = FMA(KP382683432, T3w, KP923879532 * T3x); + T4u = T1j - T1m; + T4v = Ti - Tl; + T4w = T4u - T4v; + T53 = T4v + T4u; + } + } + { + E Tp, T1S, T1q, T1Q, Ts, T1P, T1t, T1T, T1R, T1U; + { + E Tn, To, T1o, T1p; + Tn = ri[WS(is, 30)]; + To = ri[WS(is, 14)]; + Tp = Tn + To; + T1S = Tn - To; + T1o = ii[WS(is, 30)]; + T1p = ii[WS(is, 14)]; + T1q = T1o + T1p; + T1Q = T1o - T1p; + } + { + E Tq, Tr, T1r, T1s; + Tq = ri[WS(is, 6)]; + Tr = ri[WS(is, 22)]; + Ts = Tq + Tr; + T1P = Tq - Tr; + T1r = ii[WS(is, 6)]; + T1s = ii[WS(is, 22)]; + T1t = T1r + T1s; + T1T = T1r - T1s; + } + Tt = Tp + Ts; + T1u = T1q + T1t; + T1R = T1P + T1Q; + T1U = T1S - T1T; + T1V = FMA(KP382683432, T1R, KP923879532 * T1U); + T2Y = FNMS(KP923879532, T1R, KP382683432 * T1U); + { + E T3z, T3A, T4x, T4y; + T3z = T1Q - T1P; + T3A = T1S + T1T; + T3B = FMA(KP923879532, T3z, KP382683432 * T3A); + T3W = FNMS(KP382683432, T3z, KP923879532 * T3A); + T4x = Tp - Ts; + T4y = T1q - T1t; + T4z = T4x + T4y; + T52 = T4x - T4y; + } + } + { + E TN, T2p, T2J, T4S, TQ, T2G, T2s, T4T, TU, T2x, T2w, T4O, TX, T2z, T2C; + E T4P; + { + E TL, TM, T2H, T2I; + TL = ri[WS(is, 31)]; + TM = ri[WS(is, 15)]; + TN = TL + TM; + T2p = TL - TM; + T2H = ii[WS(is, 31)]; + T2I = ii[WS(is, 15)]; + T2J = T2H - T2I; + T4S = T2H + T2I; + } + { + E TO, TP, T2q, T2r; + TO = ri[WS(is, 7)]; + TP = ri[WS(is, 23)]; + TQ = TO + TP; + T2G = TO - TP; + T2q = ii[WS(is, 7)]; + T2r = ii[WS(is, 23)]; + T2s = T2q - T2r; + T4T = T2q + T2r; + } + { + E TS, TT, T2u, T2v; + TS = ri[WS(is, 3)]; + TT = ri[WS(is, 19)]; + TU = TS + TT; + T2x = TS - TT; + T2u = ii[WS(is, 3)]; + T2v = ii[WS(is, 19)]; + T2w = T2u - T2v; + T4O = T2u + T2v; + } + { + E TV, TW, T2A, T2B; + TV = ri[WS(is, 27)]; + TW = ri[WS(is, 11)]; + TX = TV + TW; + T2z = TV - TW; + T2A = ii[WS(is, 27)]; + T2B = ii[WS(is, 11)]; + T2C = T2A - T2B; + T4P = T2A + T2B; + } + T2t = T2p - T2s; + T3L = T2p + T2s; + T3O = T2J - T2G; + T2K = T2G + T2J; + TR = TN + TQ; + TY = TU + TX; + T5F = TR - TY; + { + E T4N, T4Q, T2y, T2D; + T5G = T4S + T4T; + T5H = T4O + T4P; + T5I = T5G - T5H; + T4N = TN - TQ; + T4Q = T4O - T4P; + T4R = T4N - T4Q; + T5j = T4N + T4Q; + T2y = T2w - T2x; + T2D = T2z + T2C; + T2E = KP707106781 * (T2y - T2D); + T3P = KP707106781 * (T2y + T2D); + { + E T4U, T4V, T2L, T2M; + T4U = T4S - T4T; + T4V = TX - TU; + T4W = T4U - T4V; + T5k = T4V + T4U; + T2L = T2z - T2C; + T2M = T2x + T2w; + T2N = KP707106781 * (T2L - T2M); + T3M = KP707106781 * (T2M + T2L); + } + } + } + { + E Ty, T2f, T21, T4C, TB, T1Y, T2i, T4D, TF, T28, T2b, T4I, TI, T23, T26; + E T4J; + { + E Tw, Tx, T1Z, T20; + Tw = ri[WS(is, 1)]; + Tx = ri[WS(is, 17)]; + Ty = Tw + Tx; + T2f = Tw - Tx; + T1Z = ii[WS(is, 1)]; + T20 = ii[WS(is, 17)]; + T21 = T1Z - T20; + T4C = T1Z + T20; + } + { + E Tz, TA, T2g, T2h; + Tz = ri[WS(is, 9)]; + TA = ri[WS(is, 25)]; + TB = Tz + TA; + T1Y = Tz - TA; + T2g = ii[WS(is, 9)]; + T2h = ii[WS(is, 25)]; + T2i = T2g - T2h; + T4D = T2g + T2h; + } + { + E TD, TE, T29, T2a; + TD = ri[WS(is, 5)]; + TE = ri[WS(is, 21)]; + TF = TD + TE; + T28 = TD - TE; + T29 = ii[WS(is, 5)]; + T2a = ii[WS(is, 21)]; + T2b = T29 - T2a; + T4I = T29 + T2a; + } + { + E TG, TH, T24, T25; + TG = ri[WS(is, 29)]; + TH = ri[WS(is, 13)]; + TI = TG + TH; + T23 = TG - TH; + T24 = ii[WS(is, 29)]; + T25 = ii[WS(is, 13)]; + T26 = T24 - T25; + T4J = T24 + T25; + } + T22 = T1Y + T21; + T3E = T2f + T2i; + T3H = T21 - T1Y; + T2j = T2f - T2i; + TC = Ty + TB; + TJ = TF + TI; + T5A = TC - TJ; + { + E T4E, T4F, T27, T2c; + T5B = T4C + T4D; + T5C = T4I + T4J; + T5D = T5B - T5C; + T4E = T4C - T4D; + T4F = TI - TF; + T4G = T4E - T4F; + T5g = T4F + T4E; + T27 = T23 - T26; + T2c = T28 + T2b; + T2d = KP707106781 * (T27 - T2c); + T3F = KP707106781 * (T2c + T27); + { + E T4H, T4K, T2k, T2l; + T4H = Ty - TB; + T4K = T4I - T4J; + T4L = T4H - T4K; + T5h = T4H + T4K; + T2k = T2b - T28; + T2l = T23 + T26; + T2m = KP707106781 * (T2k - T2l); + T3I = KP707106781 * (T2k + T2l); + } + } + } + { + E T4B, T57, T5a, T5c, T4Y, T56, T55, T5b; + { + E T4t, T4A, T58, T59; + T4t = T4r - T4s; + T4A = KP707106781 * (T4w - T4z); + T4B = T4t + T4A; + T57 = T4t - T4A; + T58 = FNMS(KP923879532, T4L, KP382683432 * T4G); + T59 = FMA(KP382683432, T4W, KP923879532 * T4R); + T5a = T58 - T59; + T5c = T58 + T59; + } + { + E T4M, T4X, T51, T54; + T4M = FMA(KP923879532, T4G, KP382683432 * T4L); + T4X = FNMS(KP923879532, T4W, KP382683432 * T4R); + T4Y = T4M + T4X; + T56 = T4X - T4M; + T51 = T4Z - T50; + T54 = KP707106781 * (T52 - T53); + T55 = T51 - T54; + T5b = T51 + T54; + } + ro[WS(os, 22)] = T4B - T4Y; + io[WS(os, 22)] = T5b - T5c; + ro[WS(os, 6)] = T4B + T4Y; + io[WS(os, 6)] = T5b + T5c; + io[WS(os, 30)] = T55 - T56; + ro[WS(os, 30)] = T57 - T5a; + io[WS(os, 14)] = T55 + T56; + ro[WS(os, 14)] = T57 + T5a; + } + { + E T5f, T5r, T5u, T5w, T5m, T5q, T5p, T5v; + { + E T5d, T5e, T5s, T5t; + T5d = T4r + T4s; + T5e = KP707106781 * (T53 + T52); + T5f = T5d + T5e; + T5r = T5d - T5e; + T5s = FNMS(KP382683432, T5h, KP923879532 * T5g); + T5t = FMA(KP923879532, T5k, KP382683432 * T5j); + T5u = T5s - T5t; + T5w = T5s + T5t; + } + { + E T5i, T5l, T5n, T5o; + T5i = FMA(KP382683432, T5g, KP923879532 * T5h); + T5l = FNMS(KP382683432, T5k, KP923879532 * T5j); + T5m = T5i + T5l; + T5q = T5l - T5i; + T5n = T50 + T4Z; + T5o = KP707106781 * (T4w + T4z); + T5p = T5n - T5o; + T5v = T5n + T5o; + } + ro[WS(os, 18)] = T5f - T5m; + io[WS(os, 18)] = T5v - T5w; + ro[WS(os, 2)] = T5f + T5m; + io[WS(os, 2)] = T5v + T5w; + io[WS(os, 26)] = T5p - T5q; + ro[WS(os, 26)] = T5r - T5u; + io[WS(os, 10)] = T5p + T5q; + ro[WS(os, 10)] = T5r + T5u; + } + { + E T5z, T5P, T5S, T5U, T5K, T5O, T5N, T5T; + { + E T5x, T5y, T5Q, T5R; + T5x = T7 - Te; + T5y = T1n - T1u; + T5z = T5x + T5y; + T5P = T5x - T5y; + T5Q = T5D - T5A; + T5R = T5F + T5I; + T5S = KP707106781 * (T5Q - T5R); + T5U = KP707106781 * (T5Q + T5R); + } + { + E T5E, T5J, T5L, T5M; + T5E = T5A + T5D; + T5J = T5F - T5I; + T5K = KP707106781 * (T5E + T5J); + T5O = KP707106781 * (T5J - T5E); + T5L = T18 - T1f; + T5M = Tt - Tm; + T5N = T5L - T5M; + T5T = T5M + T5L; + } + ro[WS(os, 20)] = T5z - T5K; + io[WS(os, 20)] = T5T - T5U; + ro[WS(os, 4)] = T5z + T5K; + io[WS(os, 4)] = T5T + T5U; + io[WS(os, 28)] = T5N - T5O; + ro[WS(os, 28)] = T5P - T5S; + io[WS(os, 12)] = T5N + T5O; + ro[WS(os, 12)] = T5P + T5S; + } + { + E Tv, T5V, T5Y, T60, T10, T11, T1w, T5Z; + { + E Tf, Tu, T5W, T5X; + Tf = T7 + Te; + Tu = Tm + Tt; + Tv = Tf + Tu; + T5V = Tf - Tu; + T5W = T5B + T5C; + T5X = T5G + T5H; + T5Y = T5W - T5X; + T60 = T5W + T5X; + } + { + E TK, TZ, T1g, T1v; + TK = TC + TJ; + TZ = TR + TY; + T10 = TK + TZ; + T11 = TZ - TK; + T1g = T18 + T1f; + T1v = T1n + T1u; + T1w = T1g - T1v; + T5Z = T1g + T1v; + } + ro[WS(os, 16)] = Tv - T10; + io[WS(os, 16)] = T5Z - T60; + ro[0] = Tv + T10; + io[0] = T5Z + T60; + io[WS(os, 8)] = T11 + T1w; + ro[WS(os, 8)] = T5V + T5Y; + io[WS(os, 24)] = T1w - T11; + ro[WS(os, 24)] = T5V - T5Y; + } + { + E T1X, T33, T31, T37, T2o, T34, T2P, T35; + { + E T1H, T1W, T2X, T30; + T1H = T1z - T1G; + T1W = T1O - T1V; + T1X = T1H + T1W; + T33 = T1H - T1W; + T2X = T2T - T2W; + T30 = T2Y - T2Z; + T31 = T2X - T30; + T37 = T2X + T30; + } + { + E T2e, T2n, T2F, T2O; + T2e = T22 - T2d; + T2n = T2j - T2m; + T2o = FMA(KP980785280, T2e, KP195090322 * T2n); + T34 = FNMS(KP980785280, T2n, KP195090322 * T2e); + T2F = T2t - T2E; + T2O = T2K - T2N; + T2P = FNMS(KP980785280, T2O, KP195090322 * T2F); + T35 = FMA(KP195090322, T2O, KP980785280 * T2F); + } + { + E T2Q, T38, T32, T36; + T2Q = T2o + T2P; + ro[WS(os, 23)] = T1X - T2Q; + ro[WS(os, 7)] = T1X + T2Q; + T38 = T34 + T35; + io[WS(os, 23)] = T37 - T38; + io[WS(os, 7)] = T37 + T38; + T32 = T2P - T2o; + io[WS(os, 31)] = T31 - T32; + io[WS(os, 15)] = T31 + T32; + T36 = T34 - T35; + ro[WS(os, 31)] = T33 - T36; + ro[WS(os, 15)] = T33 + T36; + } + } + { + E T3D, T41, T3Z, T45, T3K, T42, T3R, T43; + { + E T3v, T3C, T3V, T3Y; + T3v = T3t - T3u; + T3C = T3y - T3B; + T3D = T3v + T3C; + T41 = T3v - T3C; + T3V = T3T - T3U; + T3Y = T3W - T3X; + T3Z = T3V - T3Y; + T45 = T3V + T3Y; + } + { + E T3G, T3J, T3N, T3Q; + T3G = T3E - T3F; + T3J = T3H - T3I; + T3K = FMA(KP555570233, T3G, KP831469612 * T3J); + T42 = FNMS(KP831469612, T3G, KP555570233 * T3J); + T3N = T3L - T3M; + T3Q = T3O - T3P; + T3R = FNMS(KP831469612, T3Q, KP555570233 * T3N); + T43 = FMA(KP831469612, T3N, KP555570233 * T3Q); + } + { + E T3S, T46, T40, T44; + T3S = T3K + T3R; + ro[WS(os, 21)] = T3D - T3S; + ro[WS(os, 5)] = T3D + T3S; + T46 = T42 + T43; + io[WS(os, 21)] = T45 - T46; + io[WS(os, 5)] = T45 + T46; + T40 = T3R - T3K; + io[WS(os, 29)] = T3Z - T40; + io[WS(os, 13)] = T3Z + T40; + T44 = T42 - T43; + ro[WS(os, 29)] = T41 - T44; + ro[WS(os, 13)] = T41 + T44; + } + } + { + E T49, T4l, T4j, T4p, T4c, T4m, T4f, T4n; + { + E T47, T48, T4h, T4i; + T47 = T3t + T3u; + T48 = T3X + T3W; + T49 = T47 + T48; + T4l = T47 - T48; + T4h = T3T + T3U; + T4i = T3y + T3B; + T4j = T4h - T4i; + T4p = T4h + T4i; + } + { + E T4a, T4b, T4d, T4e; + T4a = T3E + T3F; + T4b = T3H + T3I; + T4c = FMA(KP980785280, T4a, KP195090322 * T4b); + T4m = FNMS(KP195090322, T4a, KP980785280 * T4b); + T4d = T3L + T3M; + T4e = T3O + T3P; + T4f = FNMS(KP195090322, T4e, KP980785280 * T4d); + T4n = FMA(KP195090322, T4d, KP980785280 * T4e); + } + { + E T4g, T4q, T4k, T4o; + T4g = T4c + T4f; + ro[WS(os, 17)] = T49 - T4g; + ro[WS(os, 1)] = T49 + T4g; + T4q = T4m + T4n; + io[WS(os, 17)] = T4p - T4q; + io[WS(os, 1)] = T4p + T4q; + T4k = T4f - T4c; + io[WS(os, 25)] = T4j - T4k; + io[WS(os, 9)] = T4j + T4k; + T4o = T4m - T4n; + ro[WS(os, 25)] = T4l - T4o; + ro[WS(os, 9)] = T4l + T4o; + } + } + { + E T3b, T3n, T3l, T3r, T3e, T3o, T3h, T3p; + { + E T39, T3a, T3j, T3k; + T39 = T1z + T1G; + T3a = T2Z + T2Y; + T3b = T39 + T3a; + T3n = T39 - T3a; + T3j = T2T + T2W; + T3k = T1O + T1V; + T3l = T3j - T3k; + T3r = T3j + T3k; + } + { + E T3c, T3d, T3f, T3g; + T3c = T22 + T2d; + T3d = T2j + T2m; + T3e = FMA(KP555570233, T3c, KP831469612 * T3d); + T3o = FNMS(KP555570233, T3d, KP831469612 * T3c); + T3f = T2t + T2E; + T3g = T2K + T2N; + T3h = FNMS(KP555570233, T3g, KP831469612 * T3f); + T3p = FMA(KP831469612, T3g, KP555570233 * T3f); + } + { + E T3i, T3s, T3m, T3q; + T3i = T3e + T3h; + ro[WS(os, 19)] = T3b - T3i; + ro[WS(os, 3)] = T3b + T3i; + T3s = T3o + T3p; + io[WS(os, 19)] = T3r - T3s; + io[WS(os, 3)] = T3r + T3s; + T3m = T3h - T3e; + io[WS(os, 27)] = T3l - T3m; + io[WS(os, 11)] = T3l + T3m; + T3q = T3o - T3p; + ro[WS(os, 27)] = T3n - T3q; + ro[WS(os, 11)] = T3n + T3q; + } + } + } + } +} + +static const kdft_desc desc = { 32, "n1_32", {340, 52, 32, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_32) (planner *p) { + X(kdft_register) (p, n1_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_4.c new file mode 100644 index 000000000..c8b6ee7b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_4.c @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -name n1_4 -include dft/scalar/n.h */ + +/* + * This function contains 16 FP additions, 0 FP multiplications, + * (or, 16 additions, 0 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + E T3, Tb, T9, Tf, T6, Ta, Te, Tg; + { + E T1, T2, T7, T8; + T1 = ri[0]; + T2 = ri[WS(is, 2)]; + T3 = T1 + T2; + Tb = T1 - T2; + T7 = ii[0]; + T8 = ii[WS(is, 2)]; + T9 = T7 - T8; + Tf = T7 + T8; + } + { + E T4, T5, Tc, Td; + T4 = ri[WS(is, 1)]; + T5 = ri[WS(is, 3)]; + T6 = T4 + T5; + Ta = T4 - T5; + Tc = ii[WS(is, 1)]; + Td = ii[WS(is, 3)]; + Te = Tc - Td; + Tg = Tc + Td; + } + ro[WS(os, 2)] = T3 - T6; + io[WS(os, 2)] = Tf - Tg; + ro[0] = T3 + T6; + io[0] = Tf + Tg; + io[WS(os, 1)] = T9 - Ta; + ro[WS(os, 1)] = Tb + Te; + io[WS(os, 3)] = Ta + T9; + ro[WS(os, 3)] = Tb - Te; + } + } +} + +static const kdft_desc desc = { 4, "n1_4", {16, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_4) (planner *p) { + X(kdft_register) (p, n1_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 4 -name n1_4 -include dft/scalar/n.h */ + +/* + * This function contains 16 FP additions, 0 FP multiplications, + * (or, 16 additions, 0 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + E T3, Tb, T9, Tf, T6, Ta, Te, Tg; + { + E T1, T2, T7, T8; + T1 = ri[0]; + T2 = ri[WS(is, 2)]; + T3 = T1 + T2; + Tb = T1 - T2; + T7 = ii[0]; + T8 = ii[WS(is, 2)]; + T9 = T7 - T8; + Tf = T7 + T8; + } + { + E T4, T5, Tc, Td; + T4 = ri[WS(is, 1)]; + T5 = ri[WS(is, 3)]; + T6 = T4 + T5; + Ta = T4 - T5; + Tc = ii[WS(is, 1)]; + Td = ii[WS(is, 3)]; + Te = Tc - Td; + Tg = Tc + Td; + } + ro[WS(os, 2)] = T3 - T6; + io[WS(os, 2)] = Tf - Tg; + ro[0] = T3 + T6; + io[0] = Tf + Tg; + io[WS(os, 1)] = T9 - Ta; + ro[WS(os, 1)] = Tb + Te; + io[WS(os, 3)] = Ta + T9; + ro[WS(os, 3)] = Tb - Te; + } + } +} + +static const kdft_desc desc = { 4, "n1_4", {16, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_4) (planner *p) { + X(kdft_register) (p, n1_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_5.c new file mode 100644 index 000000000..f2da85205 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_5.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 5 -name n1_5 -include dft/scalar/n.h */ + +/* + * This function contains 32 FP additions, 18 FP multiplications, + * (or, 14 additions, 0 multiplications, 18 fused multiply/add), + * 21 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_5(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + E T1, Tl, T8, Tt, Ta, Ts, Te, Tq, Th, To; + T1 = ri[0]; + Tl = ii[0]; + { + E T2, T3, T4, T5, T6, T7; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 4)]; + T4 = T2 + T3; + T5 = ri[WS(is, 2)]; + T6 = ri[WS(is, 3)]; + T7 = T5 + T6; + T8 = T4 + T7; + Tt = T5 - T6; + Ta = T4 - T7; + Ts = T2 - T3; + } + { + E Tc, Td, Tm, Tf, Tg, Tn; + Tc = ii[WS(is, 1)]; + Td = ii[WS(is, 4)]; + Tm = Tc + Td; + Tf = ii[WS(is, 2)]; + Tg = ii[WS(is, 3)]; + Tn = Tf + Tg; + Te = Tc - Td; + Tq = Tm - Tn; + Th = Tf - Tg; + To = Tm + Tn; + } + ro[0] = T1 + T8; + io[0] = Tl + To; + { + E Ti, Tk, Tb, Tj, T9; + Ti = FMA(KP618033988, Th, Te); + Tk = FNMS(KP618033988, Te, Th); + T9 = FNMS(KP250000000, T8, T1); + Tb = FMA(KP559016994, Ta, T9); + Tj = FNMS(KP559016994, Ta, T9); + ro[WS(os, 4)] = FNMS(KP951056516, Ti, Tb); + ro[WS(os, 3)] = FMA(KP951056516, Tk, Tj); + ro[WS(os, 1)] = FMA(KP951056516, Ti, Tb); + ro[WS(os, 2)] = FNMS(KP951056516, Tk, Tj); + } + { + E Tu, Tw, Tr, Tv, Tp; + Tu = FMA(KP618033988, Tt, Ts); + Tw = FNMS(KP618033988, Ts, Tt); + Tp = FNMS(KP250000000, To, Tl); + Tr = FMA(KP559016994, Tq, Tp); + Tv = FNMS(KP559016994, Tq, Tp); + io[WS(os, 1)] = FNMS(KP951056516, Tu, Tr); + io[WS(os, 3)] = FNMS(KP951056516, Tw, Tv); + io[WS(os, 4)] = FMA(KP951056516, Tu, Tr); + io[WS(os, 2)] = FMA(KP951056516, Tw, Tv); + } + } + } +} + +static const kdft_desc desc = { 5, "n1_5", {14, 0, 18, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_5) (planner *p) { + X(kdft_register) (p, n1_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 5 -name n1_5 -include dft/scalar/n.h */ + +/* + * This function contains 32 FP additions, 12 FP multiplications, + * (or, 26 additions, 6 multiplications, 6 fused multiply/add), + * 21 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_5(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + E T1, To, T8, Tt, T9, Ts, Te, Tp, Th, Tn; + T1 = ri[0]; + To = ii[0]; + { + E T2, T3, T4, T5, T6, T7; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 4)]; + T4 = T2 + T3; + T5 = ri[WS(is, 2)]; + T6 = ri[WS(is, 3)]; + T7 = T5 + T6; + T8 = T4 + T7; + Tt = T5 - T6; + T9 = KP559016994 * (T4 - T7); + Ts = T2 - T3; + } + { + E Tc, Td, Tl, Tf, Tg, Tm; + Tc = ii[WS(is, 1)]; + Td = ii[WS(is, 4)]; + Tl = Tc + Td; + Tf = ii[WS(is, 2)]; + Tg = ii[WS(is, 3)]; + Tm = Tf + Tg; + Te = Tc - Td; + Tp = Tl + Tm; + Th = Tf - Tg; + Tn = KP559016994 * (Tl - Tm); + } + ro[0] = T1 + T8; + io[0] = To + Tp; + { + E Ti, Tk, Tb, Tj, Ta; + Ti = FMA(KP951056516, Te, KP587785252 * Th); + Tk = FNMS(KP587785252, Te, KP951056516 * Th); + Ta = FNMS(KP250000000, T8, T1); + Tb = T9 + Ta; + Tj = Ta - T9; + ro[WS(os, 4)] = Tb - Ti; + ro[WS(os, 3)] = Tj + Tk; + ro[WS(os, 1)] = Tb + Ti; + ro[WS(os, 2)] = Tj - Tk; + } + { + E Tu, Tv, Tr, Tw, Tq; + Tu = FMA(KP951056516, Ts, KP587785252 * Tt); + Tv = FNMS(KP587785252, Ts, KP951056516 * Tt); + Tq = FNMS(KP250000000, Tp, To); + Tr = Tn + Tq; + Tw = Tq - Tn; + io[WS(os, 1)] = Tr - Tu; + io[WS(os, 3)] = Tw - Tv; + io[WS(os, 4)] = Tu + Tr; + io[WS(os, 2)] = Tv + Tw; + } + } + } +} + +static const kdft_desc desc = { 5, "n1_5", {26, 6, 6, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_5) (planner *p) { + X(kdft_register) (p, n1_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_6.c new file mode 100644 index 000000000..8657604bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_6.c @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -name n1_6 -include dft/scalar/n.h */ + +/* + * This function contains 36 FP additions, 12 FP multiplications, + * (or, 24 additions, 0 multiplications, 12 fused multiply/add), + * 23 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + E T3, Tb, Tp, Tx, T6, Tc, T9, Td, Ta, Te, Ti, Tu, Tl, Tv, Tq; + E Ty; + { + E T1, T2, Tn, To; + T1 = ri[0]; + T2 = ri[WS(is, 3)]; + T3 = T1 - T2; + Tb = T1 + T2; + Tn = ii[0]; + To = ii[WS(is, 3)]; + Tp = Tn - To; + Tx = Tn + To; + } + { + E T4, T5, T7, T8; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 5)]; + T6 = T4 - T5; + Tc = T4 + T5; + T7 = ri[WS(is, 4)]; + T8 = ri[WS(is, 1)]; + T9 = T7 - T8; + Td = T7 + T8; + } + Ta = T6 + T9; + Te = Tc + Td; + { + E Tg, Th, Tj, Tk; + Tg = ii[WS(is, 2)]; + Th = ii[WS(is, 5)]; + Ti = Tg - Th; + Tu = Tg + Th; + Tj = ii[WS(is, 4)]; + Tk = ii[WS(is, 1)]; + Tl = Tj - Tk; + Tv = Tj + Tk; + } + Tq = Ti + Tl; + Ty = Tu + Tv; + ro[WS(os, 3)] = T3 + Ta; + io[WS(os, 3)] = Tp + Tq; + ro[0] = Tb + Te; + io[0] = Tx + Ty; + { + E Tf, Tm, Tr, Ts; + Tf = FNMS(KP500000000, Ta, T3); + Tm = Ti - Tl; + ro[WS(os, 5)] = FNMS(KP866025403, Tm, Tf); + ro[WS(os, 1)] = FMA(KP866025403, Tm, Tf); + Tr = FNMS(KP500000000, Tq, Tp); + Ts = T9 - T6; + io[WS(os, 1)] = FMA(KP866025403, Ts, Tr); + io[WS(os, 5)] = FNMS(KP866025403, Ts, Tr); + } + { + E Tt, Tw, Tz, TA; + Tt = FNMS(KP500000000, Te, Tb); + Tw = Tu - Tv; + ro[WS(os, 2)] = FNMS(KP866025403, Tw, Tt); + ro[WS(os, 4)] = FMA(KP866025403, Tw, Tt); + Tz = FNMS(KP500000000, Ty, Tx); + TA = Td - Tc; + io[WS(os, 2)] = FNMS(KP866025403, TA, Tz); + io[WS(os, 4)] = FMA(KP866025403, TA, Tz); + } + } + } +} + +static const kdft_desc desc = { 6, "n1_6", {24, 0, 12, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_6) (planner *p) { + X(kdft_register) (p, n1_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 6 -name n1_6 -include dft/scalar/n.h */ + +/* + * This function contains 36 FP additions, 8 FP multiplications, + * (or, 32 additions, 4 multiplications, 4 fused multiply/add), + * 23 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + E T3, Tb, Tq, Tx, T6, Tc, T9, Td, Ta, Te, Ti, Tu, Tl, Tv, Tr; + E Ty; + { + E T1, T2, To, Tp; + T1 = ri[0]; + T2 = ri[WS(is, 3)]; + T3 = T1 - T2; + Tb = T1 + T2; + To = ii[0]; + Tp = ii[WS(is, 3)]; + Tq = To - Tp; + Tx = To + Tp; + } + { + E T4, T5, T7, T8; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 5)]; + T6 = T4 - T5; + Tc = T4 + T5; + T7 = ri[WS(is, 4)]; + T8 = ri[WS(is, 1)]; + T9 = T7 - T8; + Td = T7 + T8; + } + Ta = T6 + T9; + Te = Tc + Td; + { + E Tg, Th, Tj, Tk; + Tg = ii[WS(is, 2)]; + Th = ii[WS(is, 5)]; + Ti = Tg - Th; + Tu = Tg + Th; + Tj = ii[WS(is, 4)]; + Tk = ii[WS(is, 1)]; + Tl = Tj - Tk; + Tv = Tj + Tk; + } + Tr = Ti + Tl; + Ty = Tu + Tv; + ro[WS(os, 3)] = T3 + Ta; + io[WS(os, 3)] = Tq + Tr; + ro[0] = Tb + Te; + io[0] = Tx + Ty; + { + E Tf, Tm, Tn, Ts; + Tf = FNMS(KP500000000, Ta, T3); + Tm = KP866025403 * (Ti - Tl); + ro[WS(os, 5)] = Tf - Tm; + ro[WS(os, 1)] = Tf + Tm; + Tn = KP866025403 * (T9 - T6); + Ts = FNMS(KP500000000, Tr, Tq); + io[WS(os, 1)] = Tn + Ts; + io[WS(os, 5)] = Ts - Tn; + } + { + E Tt, Tw, Tz, TA; + Tt = FNMS(KP500000000, Te, Tb); + Tw = KP866025403 * (Tu - Tv); + ro[WS(os, 2)] = Tt - Tw; + ro[WS(os, 4)] = Tt + Tw; + Tz = FNMS(KP500000000, Ty, Tx); + TA = KP866025403 * (Td - Tc); + io[WS(os, 2)] = Tz - TA; + io[WS(os, 4)] = TA + Tz; + } + } + } +} + +static const kdft_desc desc = { 6, "n1_6", {32, 4, 4, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_6) (planner *p) { + X(kdft_register) (p, n1_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_64.c new file mode 100644 index 000000000..f3d84e2ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_64.c @@ -0,0 +1,3088 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 64 -name n1_64 -include dft/scalar/n.h */ + +/* + * This function contains 912 FP additions, 392 FP multiplications, + * (or, 520 additions, 0 multiplications, 392 fused multiply/add), + * 172 stack variables, 15 constants, and 256 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + E T37, T7B, T8F, T5Z, Tf, Td9, TbB, TcB, T62, T7C, T2i, TdH, Tah, Tcb, T3e; + E T8G, Tu, TdI, Tak, TbC, Tan, TbD, T2x, Tda, T3m, T65, T7G, T8I, T7J, T8J; + E T3t, T64, TK, Tdd, Tas, Tce, Tav, Tcf, T2N, Tdc, T3G, T6G, T7O, T9k, T7R; + E T9l, T3N, T6H, T1L, TdA, Tbs, Tct, Tdx, Teo, T5j, T6Y, T5Q, T6V, T8y, T9z; + E Tbb, Tcw, T8n, T9C, TZ, Tdf, Taz, Tch, TaC, Tci, T32, Tdg, T3Z, T6J, T7V; + E T9n, T7Y, T9o, T46, T6K, T1g, Tdp, Tb1, Tcm, Tdm, Tej, T4q, T6R, T4X, T6O; + E T8f, T9s, TaK, Tcp, T84, T9v, T1v, Tdn, Tb4, Tcq, Tds, Tek, T4N, T6P, T50; + E T6S, T8i, T9w, TaV, Tcn, T8b, T9t, T20, Tdy, Tbv, Tcx, TdD, Tep, T5G, T6W; + E T5T, T6Z, T8B, T9D, Tbm, Tcu, T8u, T9A; + { + E T3, T35, T26, T5Y, T6, T5X, T29, T36, Ta, T39, T2d, T38, Td, T3b, T2g; + E T3c; + { + E T1, T2, T24, T25; + T1 = ri[0]; + T2 = ri[WS(is, 32)]; + T3 = T1 + T2; + T35 = T1 - T2; + T24 = ii[0]; + T25 = ii[WS(is, 32)]; + T26 = T24 + T25; + T5Y = T24 - T25; + } + { + E T4, T5, T27, T28; + T4 = ri[WS(is, 16)]; + T5 = ri[WS(is, 48)]; + T6 = T4 + T5; + T5X = T4 - T5; + T27 = ii[WS(is, 16)]; + T28 = ii[WS(is, 48)]; + T29 = T27 + T28; + T36 = T27 - T28; + } + { + E T8, T9, T2b, T2c; + T8 = ri[WS(is, 8)]; + T9 = ri[WS(is, 40)]; + Ta = T8 + T9; + T39 = T8 - T9; + T2b = ii[WS(is, 8)]; + T2c = ii[WS(is, 40)]; + T2d = T2b + T2c; + T38 = T2b - T2c; + } + { + E Tb, Tc, T2e, T2f; + Tb = ri[WS(is, 56)]; + Tc = ri[WS(is, 24)]; + Td = Tb + Tc; + T3b = Tb - Tc; + T2e = ii[WS(is, 56)]; + T2f = ii[WS(is, 24)]; + T2g = T2e + T2f; + T3c = T2e - T2f; + } + { + E T7, Te, T2a, T2h; + T37 = T35 - T36; + T7B = T35 + T36; + T8F = T5Y - T5X; + T5Z = T5X + T5Y; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + Td9 = T7 - Te; + { + E Tbz, TbA, T60, T61; + Tbz = Td - Ta; + TbA = T26 - T29; + TbB = Tbz + TbA; + TcB = TbA - Tbz; + T60 = T3b - T3c; + T61 = T39 + T38; + T62 = T60 - T61; + T7C = T61 + T60; + } + T2a = T26 + T29; + T2h = T2d + T2g; + T2i = T2a + T2h; + TdH = T2a - T2h; + { + E Taf, Tag, T3a, T3d; + Taf = T3 - T6; + Tag = T2d - T2g; + Tah = Taf + Tag; + Tcb = Taf - Tag; + T3a = T38 - T39; + T3d = T3b + T3c; + T3e = T3a - T3d; + T8G = T3a + T3d; + } + } + } + { + E Ti, T3j, T2l, T3h, Tl, T3g, T2o, T3k, Tp, T3q, T2s, T3o, Ts, T3n, T2v; + E T3r; + { + E Tg, Th, T2j, T2k; + Tg = ri[WS(is, 4)]; + Th = ri[WS(is, 36)]; + Ti = Tg + Th; + T3j = Tg - Th; + T2j = ii[WS(is, 4)]; + T2k = ii[WS(is, 36)]; + T2l = T2j + T2k; + T3h = T2j - T2k; + } + { + E Tj, Tk, T2m, T2n; + Tj = ri[WS(is, 20)]; + Tk = ri[WS(is, 52)]; + Tl = Tj + Tk; + T3g = Tj - Tk; + T2m = ii[WS(is, 20)]; + T2n = ii[WS(is, 52)]; + T2o = T2m + T2n; + T3k = T2m - T2n; + } + { + E Tn, To, T2q, T2r; + Tn = ri[WS(is, 60)]; + To = ri[WS(is, 28)]; + Tp = Tn + To; + T3q = Tn - To; + T2q = ii[WS(is, 60)]; + T2r = ii[WS(is, 28)]; + T2s = T2q + T2r; + T3o = T2q - T2r; + } + { + E Tq, Tr, T2t, T2u; + Tq = ri[WS(is, 12)]; + Tr = ri[WS(is, 44)]; + Ts = Tq + Tr; + T3n = Tq - Tr; + T2t = ii[WS(is, 12)]; + T2u = ii[WS(is, 44)]; + T2v = T2t + T2u; + T3r = T2t - T2u; + } + { + E Tm, Tt, Tai, Taj; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + TdI = Tt - Tm; + Tai = Ti - Tl; + Taj = T2l - T2o; + Tak = Tai + Taj; + TbC = Taj - Tai; + } + { + E Tal, Tam, T2p, T2w; + Tal = Tp - Ts; + Tam = T2s - T2v; + Tan = Tal - Tam; + TbD = Tal + Tam; + T2p = T2l + T2o; + T2w = T2s + T2v; + T2x = T2p + T2w; + Tda = T2p - T2w; + } + { + E T3i, T3l, T7E, T7F; + T3i = T3g + T3h; + T3l = T3j - T3k; + T3m = FMA(KP414213562, T3l, T3i); + T65 = FNMS(KP414213562, T3i, T3l); + T7E = T3j + T3k; + T7F = T3h - T3g; + T7G = FMA(KP414213562, T7F, T7E); + T8I = FNMS(KP414213562, T7E, T7F); + } + { + E T7H, T7I, T3p, T3s; + T7H = T3q + T3r; + T7I = T3o - T3n; + T7J = FNMS(KP414213562, T7I, T7H); + T8J = FMA(KP414213562, T7H, T7I); + T3p = T3n + T3o; + T3s = T3q - T3r; + T3t = FNMS(KP414213562, T3s, T3p); + T64 = FMA(KP414213562, T3p, T3s); + } + } + { + E Ty, T3H, T2B, T3x, TB, T3w, T2E, T3I, TI, T3K, T2L, T3E, TF, T3L, T2I; + E T3B; + { + E Tw, Tx, T2C, T2D; + Tw = ri[WS(is, 2)]; + Tx = ri[WS(is, 34)]; + Ty = Tw + Tx; + T3H = Tw - Tx; + { + E T2z, T2A, Tz, TA; + T2z = ii[WS(is, 2)]; + T2A = ii[WS(is, 34)]; + T2B = T2z + T2A; + T3x = T2z - T2A; + Tz = ri[WS(is, 18)]; + TA = ri[WS(is, 50)]; + TB = Tz + TA; + T3w = Tz - TA; + } + T2C = ii[WS(is, 18)]; + T2D = ii[WS(is, 50)]; + T2E = T2C + T2D; + T3I = T2C - T2D; + { + E TG, TH, T3C, T2J, T2K, T3D; + TG = ri[WS(is, 58)]; + TH = ri[WS(is, 26)]; + T3C = TG - TH; + T2J = ii[WS(is, 58)]; + T2K = ii[WS(is, 26)]; + T3D = T2J - T2K; + TI = TG + TH; + T3K = T3C + T3D; + T2L = T2J + T2K; + T3E = T3C - T3D; + } + { + E TD, TE, T3z, T2G, T2H, T3A; + TD = ri[WS(is, 10)]; + TE = ri[WS(is, 42)]; + T3z = TD - TE; + T2G = ii[WS(is, 10)]; + T2H = ii[WS(is, 42)]; + T3A = T2G - T2H; + TF = TD + TE; + T3L = T3A - T3z; + T2I = T2G + T2H; + T3B = T3z + T3A; + } + } + { + E TC, TJ, Taq, Tar; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + Tdd = TC - TJ; + Taq = TI - TF; + Tar = T2B - T2E; + Tas = Taq + Tar; + Tce = Tar - Taq; + } + { + E Tat, Tau, T2F, T2M; + Tat = Ty - TB; + Tau = T2I - T2L; + Tav = Tat + Tau; + Tcf = Tat - Tau; + T2F = T2B + T2E; + T2M = T2I + T2L; + T2N = T2F + T2M; + Tdc = T2F - T2M; + } + { + E T3y, T3F, T7M, T7N; + T3y = T3w + T3x; + T3F = T3B - T3E; + T3G = FNMS(KP707106781, T3F, T3y); + T6G = FMA(KP707106781, T3F, T3y); + T7M = T3x - T3w; + T7N = T3L + T3K; + T7O = FMA(KP707106781, T7N, T7M); + T9k = FNMS(KP707106781, T7N, T7M); + } + { + E T7P, T7Q, T3J, T3M; + T7P = T3H + T3I; + T7Q = T3B + T3E; + T7R = FMA(KP707106781, T7Q, T7P); + T9l = FNMS(KP707106781, T7Q, T7P); + T3J = T3H - T3I; + T3M = T3K - T3L; + T3N = FNMS(KP707106781, T3M, T3J); + T6H = FMA(KP707106781, T3M, T3J); + } + } + { + E T1z, T5I, T56, Tb8, T1C, T53, T5L, Tb9, T1J, Tbq, T5h, T5N, T1G, Tbp, T5c; + E T5O; + { + E T1x, T1y, T5J, T5K; + T1x = ri[WS(is, 63)]; + T1y = ri[WS(is, 31)]; + T1z = T1x + T1y; + T5I = T1x - T1y; + { + E T54, T55, T1A, T1B; + T54 = ii[WS(is, 63)]; + T55 = ii[WS(is, 31)]; + T56 = T54 - T55; + Tb8 = T54 + T55; + T1A = ri[WS(is, 15)]; + T1B = ri[WS(is, 47)]; + T1C = T1A + T1B; + T53 = T1A - T1B; + } + T5J = ii[WS(is, 15)]; + T5K = ii[WS(is, 47)]; + T5L = T5J - T5K; + Tb9 = T5J + T5K; + { + E T1H, T1I, T5d, T5e, T5f, T5g; + T1H = ri[WS(is, 55)]; + T1I = ri[WS(is, 23)]; + T5d = T1H - T1I; + T5e = ii[WS(is, 55)]; + T5f = ii[WS(is, 23)]; + T5g = T5e - T5f; + T1J = T1H + T1I; + Tbq = T5e + T5f; + T5h = T5d - T5g; + T5N = T5d + T5g; + } + { + E T1E, T1F, T58, T59, T5a, T5b; + T1E = ri[WS(is, 7)]; + T1F = ri[WS(is, 39)]; + T58 = T1E - T1F; + T59 = ii[WS(is, 7)]; + T5a = ii[WS(is, 39)]; + T5b = T59 - T5a; + T1G = T1E + T1F; + Tbp = T59 + T5a; + T5c = T58 + T5b; + T5O = T5b - T58; + } + } + { + E T1D, T1K, Tbo, Tbr; + T1D = T1z + T1C; + T1K = T1G + T1J; + T1L = T1D + T1K; + TdA = T1D - T1K; + Tbo = T1z - T1C; + Tbr = Tbp - Tbq; + Tbs = Tbo + Tbr; + Tct = Tbo - Tbr; + } + { + E Tdv, Tdw, T57, T5i; + Tdv = Tb8 + Tb9; + Tdw = Tbp + Tbq; + Tdx = Tdv - Tdw; + Teo = Tdv + Tdw; + T57 = T53 + T56; + T5i = T5c - T5h; + T5j = FNMS(KP707106781, T5i, T57); + T6Y = FMA(KP707106781, T5i, T57); + } + { + E T5M, T5P, T8w, T8x; + T5M = T5I - T5L; + T5P = T5N - T5O; + T5Q = FNMS(KP707106781, T5P, T5M); + T6V = FMA(KP707106781, T5P, T5M); + T8w = T5I + T5L; + T8x = T5c + T5h; + T8y = FMA(KP707106781, T8x, T8w); + T9z = FNMS(KP707106781, T8x, T8w); + } + { + E Tb7, Tba, T8l, T8m; + Tb7 = T1J - T1G; + Tba = Tb8 - Tb9; + Tbb = Tb7 + Tba; + Tcw = Tba - Tb7; + T8l = T56 - T53; + T8m = T5O + T5N; + T8n = FMA(KP707106781, T8m, T8l); + T9C = FNMS(KP707106781, T8m, T8l); + } + } + { + E TN, T40, T2Q, T3Q, TQ, T3P, T2T, T41, TX, T43, T30, T3X, TU, T44, T2X; + E T3U; + { + E TL, TM, T2R, T2S; + TL = ri[WS(is, 62)]; + TM = ri[WS(is, 30)]; + TN = TL + TM; + T40 = TL - TM; + { + E T2O, T2P, TO, TP; + T2O = ii[WS(is, 62)]; + T2P = ii[WS(is, 30)]; + T2Q = T2O + T2P; + T3Q = T2O - T2P; + TO = ri[WS(is, 14)]; + TP = ri[WS(is, 46)]; + TQ = TO + TP; + T3P = TO - TP; + } + T2R = ii[WS(is, 14)]; + T2S = ii[WS(is, 46)]; + T2T = T2R + T2S; + T41 = T2R - T2S; + { + E TV, TW, T3V, T2Y, T2Z, T3W; + TV = ri[WS(is, 54)]; + TW = ri[WS(is, 22)]; + T3V = TV - TW; + T2Y = ii[WS(is, 54)]; + T2Z = ii[WS(is, 22)]; + T3W = T2Y - T2Z; + TX = TV + TW; + T43 = T3V + T3W; + T30 = T2Y + T2Z; + T3X = T3V - T3W; + } + { + E TS, TT, T3S, T2V, T2W, T3T; + TS = ri[WS(is, 6)]; + TT = ri[WS(is, 38)]; + T3S = TS - TT; + T2V = ii[WS(is, 6)]; + T2W = ii[WS(is, 38)]; + T3T = T2V - T2W; + TU = TS + TT; + T44 = T3T - T3S; + T2X = T2V + T2W; + T3U = T3S + T3T; + } + } + { + E TR, TY, Tax, Tay; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + Tdf = TR - TY; + Tax = TX - TU; + Tay = T2Q - T2T; + Taz = Tax + Tay; + Tch = Tay - Tax; + } + { + E TaA, TaB, T2U, T31; + TaA = TN - TQ; + TaB = T2X - T30; + TaC = TaA + TaB; + Tci = TaA - TaB; + T2U = T2Q + T2T; + T31 = T2X + T30; + T32 = T2U + T31; + Tdg = T2U - T31; + } + { + E T3R, T3Y, T7T, T7U; + T3R = T3P + T3Q; + T3Y = T3U - T3X; + T3Z = FNMS(KP707106781, T3Y, T3R); + T6J = FMA(KP707106781, T3Y, T3R); + T7T = T3Q - T3P; + T7U = T44 + T43; + T7V = FMA(KP707106781, T7U, T7T); + T9n = FNMS(KP707106781, T7U, T7T); + } + { + E T7W, T7X, T42, T45; + T7W = T40 + T41; + T7X = T3U + T3X; + T7Y = FMA(KP707106781, T7X, T7W); + T9o = FNMS(KP707106781, T7X, T7W); + T42 = T40 - T41; + T45 = T43 - T44; + T46 = FNMS(KP707106781, T45, T42); + T6K = FMA(KP707106781, T45, T42); + } + } + { + E T14, T4P, T4d, TaH, T17, T4a, T4S, TaI, T1e, TaZ, T4o, T4U, T1b, TaY, T4j; + E T4V; + { + E T12, T13, T4Q, T4R; + T12 = ri[WS(is, 1)]; + T13 = ri[WS(is, 33)]; + T14 = T12 + T13; + T4P = T12 - T13; + { + E T4b, T4c, T15, T16; + T4b = ii[WS(is, 1)]; + T4c = ii[WS(is, 33)]; + T4d = T4b - T4c; + TaH = T4b + T4c; + T15 = ri[WS(is, 17)]; + T16 = ri[WS(is, 49)]; + T17 = T15 + T16; + T4a = T15 - T16; + } + T4Q = ii[WS(is, 17)]; + T4R = ii[WS(is, 49)]; + T4S = T4Q - T4R; + TaI = T4Q + T4R; + { + E T1c, T1d, T4k, T4l, T4m, T4n; + T1c = ri[WS(is, 57)]; + T1d = ri[WS(is, 25)]; + T4k = T1c - T1d; + T4l = ii[WS(is, 57)]; + T4m = ii[WS(is, 25)]; + T4n = T4l - T4m; + T1e = T1c + T1d; + TaZ = T4l + T4m; + T4o = T4k - T4n; + T4U = T4k + T4n; + } + { + E T19, T1a, T4f, T4g, T4h, T4i; + T19 = ri[WS(is, 9)]; + T1a = ri[WS(is, 41)]; + T4f = T19 - T1a; + T4g = ii[WS(is, 9)]; + T4h = ii[WS(is, 41)]; + T4i = T4g - T4h; + T1b = T19 + T1a; + TaY = T4g + T4h; + T4j = T4f + T4i; + T4V = T4i - T4f; + } + } + { + E T18, T1f, TaX, Tb0; + T18 = T14 + T17; + T1f = T1b + T1e; + T1g = T18 + T1f; + Tdp = T18 - T1f; + TaX = T14 - T17; + Tb0 = TaY - TaZ; + Tb1 = TaX + Tb0; + Tcm = TaX - Tb0; + } + { + E Tdk, Tdl, T4e, T4p; + Tdk = TaH + TaI; + Tdl = TaY + TaZ; + Tdm = Tdk - Tdl; + Tej = Tdk + Tdl; + T4e = T4a + T4d; + T4p = T4j - T4o; + T4q = FNMS(KP707106781, T4p, T4e); + T6R = FMA(KP707106781, T4p, T4e); + } + { + E T4T, T4W, T8d, T8e; + T4T = T4P - T4S; + T4W = T4U - T4V; + T4X = FNMS(KP707106781, T4W, T4T); + T6O = FMA(KP707106781, T4W, T4T); + T8d = T4P + T4S; + T8e = T4j + T4o; + T8f = FMA(KP707106781, T8e, T8d); + T9s = FNMS(KP707106781, T8e, T8d); + } + { + E TaG, TaJ, T82, T83; + TaG = T1e - T1b; + TaJ = TaH - TaI; + TaK = TaG + TaJ; + Tcp = TaJ - TaG; + T82 = T4d - T4a; + T83 = T4V + T4U; + T84 = FMA(KP707106781, T83, T82); + T9v = FNMS(KP707106781, T83, T82); + } + } + { + E T1j, TaL, T1m, TaM, T4G, T4L, TaO, TaN, T86, T85, T1q, TaR, T1t, TaS, T4v; + E T4A, TaT, TaQ, T89, T88; + { + E T4C, T4K, T4H, T4F; + { + E T1h, T1i, T4I, T4J; + T1h = ri[WS(is, 5)]; + T1i = ri[WS(is, 37)]; + T1j = T1h + T1i; + T4C = T1h - T1i; + T4I = ii[WS(is, 5)]; + T4J = ii[WS(is, 37)]; + T4K = T4I - T4J; + TaL = T4I + T4J; + } + { + E T1k, T1l, T4D, T4E; + T1k = ri[WS(is, 21)]; + T1l = ri[WS(is, 53)]; + T1m = T1k + T1l; + T4H = T1k - T1l; + T4D = ii[WS(is, 21)]; + T4E = ii[WS(is, 53)]; + T4F = T4D - T4E; + TaM = T4D + T4E; + } + T4G = T4C - T4F; + T4L = T4H + T4K; + TaO = T1j - T1m; + TaN = TaL - TaM; + T86 = T4C + T4F; + T85 = T4K - T4H; + } + { + E T4r, T4z, T4w, T4u; + { + E T1o, T1p, T4x, T4y; + T1o = ri[WS(is, 61)]; + T1p = ri[WS(is, 29)]; + T1q = T1o + T1p; + T4r = T1o - T1p; + T4x = ii[WS(is, 61)]; + T4y = ii[WS(is, 29)]; + T4z = T4x - T4y; + TaR = T4x + T4y; + } + { + E T1r, T1s, T4s, T4t; + T1r = ri[WS(is, 13)]; + T1s = ri[WS(is, 45)]; + T1t = T1r + T1s; + T4w = T1r - T1s; + T4s = ii[WS(is, 13)]; + T4t = ii[WS(is, 45)]; + T4u = T4s - T4t; + TaS = T4s + T4t; + } + T4v = T4r - T4u; + T4A = T4w + T4z; + TaT = TaR - TaS; + TaQ = T1q - T1t; + T89 = T4r + T4u; + T88 = T4z - T4w; + } + { + E T1n, T1u, Tb2, Tb3; + T1n = T1j + T1m; + T1u = T1q + T1t; + T1v = T1n + T1u; + Tdn = T1u - T1n; + Tb2 = TaO + TaN; + Tb3 = TaQ - TaT; + Tb4 = Tb2 + Tb3; + Tcq = Tb2 - Tb3; + } + { + E Tdq, Tdr, T4B, T4M; + Tdq = TaL + TaM; + Tdr = TaR + TaS; + Tds = Tdq - Tdr; + Tek = Tdq + Tdr; + T4B = FMA(KP414213562, T4A, T4v); + T4M = FNMS(KP414213562, T4L, T4G); + T4N = T4B - T4M; + T6P = T4M + T4B; + } + { + E T4Y, T4Z, T8g, T8h; + T4Y = FMA(KP414213562, T4G, T4L); + T4Z = FNMS(KP414213562, T4v, T4A); + T50 = T4Y - T4Z; + T6S = T4Y + T4Z; + T8g = FMA(KP414213562, T85, T86); + T8h = FNMS(KP414213562, T88, T89); + T8i = T8g + T8h; + T9w = T8g - T8h; + } + { + E TaP, TaU, T87, T8a; + TaP = TaN - TaO; + TaU = TaQ + TaT; + TaV = TaP + TaU; + Tcn = TaU - TaP; + T87 = FNMS(KP414213562, T86, T85); + T8a = FMA(KP414213562, T89, T88); + T8b = T87 + T8a; + T9t = T8a - T87; + } + } + { + E T1O, Tbc, T1R, Tbd, T5z, T5E, Tbf, Tbe, T8p, T8o, T1V, Tbi, T1Y, Tbj, T5o; + E T5t, Tbk, Tbh, T8s, T8r; + { + E T5v, T5D, T5A, T5y; + { + E T1M, T1N, T5B, T5C; + T1M = ri[WS(is, 3)]; + T1N = ri[WS(is, 35)]; + T1O = T1M + T1N; + T5v = T1M - T1N; + T5B = ii[WS(is, 3)]; + T5C = ii[WS(is, 35)]; + T5D = T5B - T5C; + Tbc = T5B + T5C; + } + { + E T1P, T1Q, T5w, T5x; + T1P = ri[WS(is, 19)]; + T1Q = ri[WS(is, 51)]; + T1R = T1P + T1Q; + T5A = T1P - T1Q; + T5w = ii[WS(is, 19)]; + T5x = ii[WS(is, 51)]; + T5y = T5w - T5x; + Tbd = T5w + T5x; + } + T5z = T5v - T5y; + T5E = T5A + T5D; + Tbf = T1O - T1R; + Tbe = Tbc - Tbd; + T8p = T5v + T5y; + T8o = T5D - T5A; + } + { + E T5k, T5s, T5p, T5n; + { + E T1T, T1U, T5q, T5r; + T1T = ri[WS(is, 59)]; + T1U = ri[WS(is, 27)]; + T1V = T1T + T1U; + T5k = T1T - T1U; + T5q = ii[WS(is, 59)]; + T5r = ii[WS(is, 27)]; + T5s = T5q - T5r; + Tbi = T5q + T5r; + } + { + E T1W, T1X, T5l, T5m; + T1W = ri[WS(is, 11)]; + T1X = ri[WS(is, 43)]; + T1Y = T1W + T1X; + T5p = T1W - T1X; + T5l = ii[WS(is, 11)]; + T5m = ii[WS(is, 43)]; + T5n = T5l - T5m; + Tbj = T5l + T5m; + } + T5o = T5k - T5n; + T5t = T5p + T5s; + Tbk = Tbi - Tbj; + Tbh = T1V - T1Y; + T8s = T5k + T5n; + T8r = T5s - T5p; + } + { + E T1S, T1Z, Tbt, Tbu; + T1S = T1O + T1R; + T1Z = T1V + T1Y; + T20 = T1S + T1Z; + Tdy = T1Z - T1S; + Tbt = Tbf + Tbe; + Tbu = Tbh - Tbk; + Tbv = Tbt + Tbu; + Tcx = Tbt - Tbu; + } + { + E TdB, TdC, T5u, T5F; + TdB = Tbc + Tbd; + TdC = Tbi + Tbj; + TdD = TdB - TdC; + Tep = TdB + TdC; + T5u = FMA(KP414213562, T5t, T5o); + T5F = FNMS(KP414213562, T5E, T5z); + T5G = T5u - T5F; + T6W = T5F + T5u; + } + { + E T5R, T5S, T8z, T8A; + T5R = FMA(KP414213562, T5z, T5E); + T5S = FNMS(KP414213562, T5o, T5t); + T5T = T5R - T5S; + T6Z = T5R + T5S; + T8z = FMA(KP414213562, T8o, T8p); + T8A = FNMS(KP414213562, T8r, T8s); + T8B = T8z + T8A; + T9D = T8z - T8A; + } + { + E Tbg, Tbl, T8q, T8t; + Tbg = Tbe - Tbf; + Tbl = Tbh + Tbk; + Tbm = Tbg + Tbl; + Tcu = Tbl - Tbg; + T8q = FNMS(KP414213562, T8p, T8o); + T8t = FMA(KP414213562, T8s, T8r); + T8u = T8q + T8t; + T9A = T8t - T8q; + } + } + { + E T11, TeD, TeG, TeI, T22, T23, T34, TeH; + { + E Tv, T10, TeE, TeF; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + TeD = Tv - T10; + TeE = Tej + Tek; + TeF = Teo + Tep; + TeG = TeE - TeF; + TeI = TeE + TeF; + } + { + E T1w, T21, T2y, T33; + T1w = T1g + T1v; + T21 = T1L + T20; + T22 = T1w + T21; + T23 = T21 - T1w; + T2y = T2i + T2x; + T33 = T2N + T32; + T34 = T2y - T33; + TeH = T2y + T33; + } + ro[WS(os, 32)] = T11 - T22; + io[WS(os, 32)] = TeH - TeI; + ro[0] = T11 + T22; + io[0] = TeH + TeI; + io[WS(os, 16)] = T23 + T34; + ro[WS(os, 16)] = TeD + TeG; + io[WS(os, 48)] = T34 - T23; + ro[WS(os, 48)] = TeD - TeG; + } + { + E Teh, Tex, Tev, TeB, Tem, Tey, Ter, Tez; + { + E Tef, Teg, Tet, Teu; + Tef = Tf - Tu; + Teg = T2N - T32; + Teh = Tef + Teg; + Tex = Tef - Teg; + Tet = T2i - T2x; + Teu = TZ - TK; + Tev = Tet - Teu; + TeB = Teu + Tet; + } + { + E Tei, Tel, Ten, Teq; + Tei = T1g - T1v; + Tel = Tej - Tek; + Tem = Tei + Tel; + Tey = Tel - Tei; + Ten = T1L - T20; + Teq = Teo - Tep; + Ter = Ten - Teq; + Tez = Ten + Teq; + } + { + E Tes, TeC, Tew, TeA; + Tes = Tem + Ter; + ro[WS(os, 40)] = FNMS(KP707106781, Tes, Teh); + ro[WS(os, 8)] = FMA(KP707106781, Tes, Teh); + TeC = Tey + Tez; + io[WS(os, 40)] = FNMS(KP707106781, TeC, TeB); + io[WS(os, 8)] = FMA(KP707106781, TeC, TeB); + Tew = Ter - Tem; + io[WS(os, 56)] = FNMS(KP707106781, Tew, Tev); + io[WS(os, 24)] = FMA(KP707106781, Tew, Tev); + TeA = Tey - Tez; + ro[WS(os, 56)] = FNMS(KP707106781, TeA, Tex); + ro[WS(os, 24)] = FMA(KP707106781, TeA, Tex); + } + } + { + E Tdb, TdV, Te5, TdJ, Tdi, Te6, Te3, Teb, TdM, TdW, Tdu, TdR, Te0, Tea, TdF; + E TdQ; + { + E Tde, Tdh, Tdo, Tdt; + Tdb = Td9 - Tda; + TdV = Td9 + Tda; + Te5 = TdI + TdH; + TdJ = TdH - TdI; + Tde = Tdc - Tdd; + Tdh = Tdf + Tdg; + Tdi = Tde - Tdh; + Te6 = Tde + Tdh; + { + E Te1, Te2, TdK, TdL; + Te1 = TdA + TdD; + Te2 = Tdy + Tdx; + Te3 = FNMS(KP414213562, Te2, Te1); + Teb = FMA(KP414213562, Te1, Te2); + TdK = Tdf - Tdg; + TdL = Tdd + Tdc; + TdM = TdK - TdL; + TdW = TdL + TdK; + } + Tdo = Tdm - Tdn; + Tdt = Tdp - Tds; + Tdu = FMA(KP414213562, Tdt, Tdo); + TdR = FNMS(KP414213562, Tdo, Tdt); + { + E TdY, TdZ, Tdz, TdE; + TdY = Tdp + Tds; + TdZ = Tdn + Tdm; + Te0 = FMA(KP414213562, TdZ, TdY); + Tea = FNMS(KP414213562, TdY, TdZ); + Tdz = Tdx - Tdy; + TdE = TdA - TdD; + TdF = FNMS(KP414213562, TdE, Tdz); + TdQ = FMA(KP414213562, Tdz, TdE); + } + } + { + E Tdj, TdG, TdP, TdS; + Tdj = FMA(KP707106781, Tdi, Tdb); + TdG = Tdu - TdF; + ro[WS(os, 44)] = FNMS(KP923879532, TdG, Tdj); + ro[WS(os, 12)] = FMA(KP923879532, TdG, Tdj); + TdP = FMA(KP707106781, TdM, TdJ); + TdS = TdQ - TdR; + io[WS(os, 44)] = FNMS(KP923879532, TdS, TdP); + io[WS(os, 12)] = FMA(KP923879532, TdS, TdP); + } + { + E TdN, TdO, TdT, TdU; + TdN = FNMS(KP707106781, TdM, TdJ); + TdO = Tdu + TdF; + io[WS(os, 28)] = FNMS(KP923879532, TdO, TdN); + io[WS(os, 60)] = FMA(KP923879532, TdO, TdN); + TdT = FNMS(KP707106781, Tdi, Tdb); + TdU = TdR + TdQ; + ro[WS(os, 28)] = FNMS(KP923879532, TdU, TdT); + ro[WS(os, 60)] = FMA(KP923879532, TdU, TdT); + } + { + E TdX, Te4, Ted, Tee; + TdX = FMA(KP707106781, TdW, TdV); + Te4 = Te0 + Te3; + ro[WS(os, 36)] = FNMS(KP923879532, Te4, TdX); + ro[WS(os, 4)] = FMA(KP923879532, Te4, TdX); + Ted = FMA(KP707106781, Te6, Te5); + Tee = Tea + Teb; + io[WS(os, 36)] = FNMS(KP923879532, Tee, Ted); + io[WS(os, 4)] = FMA(KP923879532, Tee, Ted); + } + { + E Te7, Te8, Te9, Tec; + Te7 = FNMS(KP707106781, Te6, Te5); + Te8 = Te3 - Te0; + io[WS(os, 52)] = FNMS(KP923879532, Te8, Te7); + io[WS(os, 20)] = FMA(KP923879532, Te8, Te7); + Te9 = FNMS(KP707106781, TdW, TdV); + Tec = Tea - Teb; + ro[WS(os, 52)] = FNMS(KP923879532, Tec, Te9); + ro[WS(os, 20)] = FMA(KP923879532, Tec, Te9); + } + } + { + E Tcd, TcP, TcD, TcZ, Tck, Td0, TcX, Td4, Tcs, TcK, TcG, TcQ, TcU, Td5, Tcz; + E TcL, Tcc, TcC; + Tcc = TbC - TbD; + Tcd = FMA(KP707106781, Tcc, Tcb); + TcP = FNMS(KP707106781, Tcc, Tcb); + TcC = Tan - Tak; + TcD = FMA(KP707106781, TcC, TcB); + TcZ = FNMS(KP707106781, TcC, TcB); + { + E Tcg, Tcj, TcV, TcW; + Tcg = FMA(KP414213562, Tcf, Tce); + Tcj = FNMS(KP414213562, Tci, Tch); + Tck = Tcg - Tcj; + Td0 = Tcg + Tcj; + TcV = FMA(KP707106781, Tcx, Tcw); + TcW = FMA(KP707106781, Tcu, Tct); + TcX = FNMS(KP198912367, TcW, TcV); + Td4 = FMA(KP198912367, TcV, TcW); + } + { + E Tco, Tcr, TcE, TcF; + Tco = FNMS(KP707106781, Tcn, Tcm); + Tcr = FNMS(KP707106781, Tcq, Tcp); + Tcs = FMA(KP668178637, Tcr, Tco); + TcK = FNMS(KP668178637, Tco, Tcr); + TcE = FMA(KP414213562, Tch, Tci); + TcF = FNMS(KP414213562, Tce, Tcf); + TcG = TcE - TcF; + TcQ = TcF + TcE; + } + { + E TcS, TcT, Tcv, Tcy; + TcS = FMA(KP707106781, Tcq, Tcp); + TcT = FMA(KP707106781, Tcn, Tcm); + TcU = FMA(KP198912367, TcT, TcS); + Td5 = FNMS(KP198912367, TcS, TcT); + Tcv = FNMS(KP707106781, Tcu, Tct); + Tcy = FNMS(KP707106781, Tcx, Tcw); + Tcz = FNMS(KP668178637, Tcy, Tcv); + TcL = FMA(KP668178637, Tcv, Tcy); + } + { + E Tcl, TcA, TcN, TcO; + Tcl = FMA(KP923879532, Tck, Tcd); + TcA = Tcs + Tcz; + ro[WS(os, 38)] = FNMS(KP831469612, TcA, Tcl); + ro[WS(os, 6)] = FMA(KP831469612, TcA, Tcl); + TcN = FMA(KP923879532, TcG, TcD); + TcO = TcK + TcL; + io[WS(os, 38)] = FNMS(KP831469612, TcO, TcN); + io[WS(os, 6)] = FMA(KP831469612, TcO, TcN); + } + { + E TcH, TcI, TcJ, TcM; + TcH = FNMS(KP923879532, TcG, TcD); + TcI = Tcz - Tcs; + io[WS(os, 54)] = FNMS(KP831469612, TcI, TcH); + io[WS(os, 22)] = FMA(KP831469612, TcI, TcH); + TcJ = FNMS(KP923879532, Tck, Tcd); + TcM = TcK - TcL; + ro[WS(os, 54)] = FNMS(KP831469612, TcM, TcJ); + ro[WS(os, 22)] = FMA(KP831469612, TcM, TcJ); + } + { + E TcR, TcY, Td3, Td6; + TcR = FNMS(KP923879532, TcQ, TcP); + TcY = TcU - TcX; + ro[WS(os, 46)] = FNMS(KP980785280, TcY, TcR); + ro[WS(os, 14)] = FMA(KP980785280, TcY, TcR); + Td3 = FNMS(KP923879532, Td0, TcZ); + Td6 = Td4 - Td5; + io[WS(os, 46)] = FNMS(KP980785280, Td6, Td3); + io[WS(os, 14)] = FMA(KP980785280, Td6, Td3); + } + { + E Td1, Td2, Td7, Td8; + Td1 = FMA(KP923879532, Td0, TcZ); + Td2 = TcU + TcX; + io[WS(os, 30)] = FNMS(KP980785280, Td2, Td1); + io[WS(os, 62)] = FMA(KP980785280, Td2, Td1); + Td7 = FMA(KP923879532, TcQ, TcP); + Td8 = Td5 + Td4; + ro[WS(os, 30)] = FNMS(KP980785280, Td8, Td7); + ro[WS(os, 62)] = FMA(KP980785280, Td8, Td7); + } + } + { + E Tap, TbR, TbF, Tc1, TaE, Tc2, TbZ, Tc7, Tb6, TbN, TbI, TbS, TbW, Tc6, Tbx; + E TbM, Tao, TbE; + Tao = Tak + Tan; + Tap = FNMS(KP707106781, Tao, Tah); + TbR = FMA(KP707106781, Tao, Tah); + TbE = TbC + TbD; + TbF = FNMS(KP707106781, TbE, TbB); + Tc1 = FMA(KP707106781, TbE, TbB); + { + E Taw, TaD, TbX, TbY; + Taw = FNMS(KP414213562, Tav, Tas); + TaD = FMA(KP414213562, TaC, Taz); + TaE = Taw - TaD; + Tc2 = Taw + TaD; + TbX = FMA(KP707106781, Tbv, Tbs); + TbY = FMA(KP707106781, Tbm, Tbb); + TbZ = FNMS(KP198912367, TbY, TbX); + Tc7 = FMA(KP198912367, TbX, TbY); + } + { + E TaW, Tb5, TbG, TbH; + TaW = FNMS(KP707106781, TaV, TaK); + Tb5 = FNMS(KP707106781, Tb4, Tb1); + Tb6 = FMA(KP668178637, Tb5, TaW); + TbN = FNMS(KP668178637, TaW, Tb5); + TbG = FNMS(KP414213562, Taz, TaC); + TbH = FMA(KP414213562, Tas, Tav); + TbI = TbG - TbH; + TbS = TbH + TbG; + } + { + E TbU, TbV, Tbn, Tbw; + TbU = FMA(KP707106781, Tb4, Tb1); + TbV = FMA(KP707106781, TaV, TaK); + TbW = FMA(KP198912367, TbV, TbU); + Tc6 = FNMS(KP198912367, TbU, TbV); + Tbn = FNMS(KP707106781, Tbm, Tbb); + Tbw = FNMS(KP707106781, Tbv, Tbs); + Tbx = FNMS(KP668178637, Tbw, Tbn); + TbM = FMA(KP668178637, Tbn, Tbw); + } + { + E TaF, Tby, TbL, TbO; + TaF = FMA(KP923879532, TaE, Tap); + Tby = Tb6 - Tbx; + ro[WS(os, 42)] = FNMS(KP831469612, Tby, TaF); + ro[WS(os, 10)] = FMA(KP831469612, Tby, TaF); + TbL = FMA(KP923879532, TbI, TbF); + TbO = TbM - TbN; + io[WS(os, 42)] = FNMS(KP831469612, TbO, TbL); + io[WS(os, 10)] = FMA(KP831469612, TbO, TbL); + } + { + E TbJ, TbK, TbP, TbQ; + TbJ = FNMS(KP923879532, TbI, TbF); + TbK = Tb6 + Tbx; + io[WS(os, 26)] = FNMS(KP831469612, TbK, TbJ); + io[WS(os, 58)] = FMA(KP831469612, TbK, TbJ); + TbP = FNMS(KP923879532, TaE, Tap); + TbQ = TbN + TbM; + ro[WS(os, 26)] = FNMS(KP831469612, TbQ, TbP); + ro[WS(os, 58)] = FMA(KP831469612, TbQ, TbP); + } + { + E TbT, Tc0, Tc9, Tca; + TbT = FMA(KP923879532, TbS, TbR); + Tc0 = TbW + TbZ; + ro[WS(os, 34)] = FNMS(KP980785280, Tc0, TbT); + ro[WS(os, 2)] = FMA(KP980785280, Tc0, TbT); + Tc9 = FMA(KP923879532, Tc2, Tc1); + Tca = Tc6 + Tc7; + io[WS(os, 34)] = FNMS(KP980785280, Tca, Tc9); + io[WS(os, 2)] = FMA(KP980785280, Tca, Tc9); + } + { + E Tc3, Tc4, Tc5, Tc8; + Tc3 = FNMS(KP923879532, Tc2, Tc1); + Tc4 = TbZ - TbW; + io[WS(os, 50)] = FNMS(KP980785280, Tc4, Tc3); + io[WS(os, 18)] = FMA(KP980785280, Tc4, Tc3); + Tc5 = FNMS(KP923879532, TbS, TbR); + Tc8 = Tc6 - Tc7; + ro[WS(os, 50)] = FNMS(KP980785280, Tc8, Tc5); + ro[WS(os, 18)] = FMA(KP980785280, Tc8, Tc5); + } + } + { + E T6F, T7h, T7m, T7x, T7p, T7w, T6M, T7s, T6U, T7c, T75, T7r, T78, T7i, T71; + E T7d; + { + E T6D, T6E, T7k, T7l; + T6D = FNMS(KP707106781, T3e, T37); + T6E = T65 + T64; + T6F = FNMS(KP923879532, T6E, T6D); + T7h = FMA(KP923879532, T6E, T6D); + T7k = FMA(KP923879532, T6S, T6R); + T7l = FMA(KP923879532, T6P, T6O); + T7m = FMA(KP098491403, T7l, T7k); + T7x = FNMS(KP098491403, T7k, T7l); + } + { + E T7n, T7o, T6I, T6L; + T7n = FMA(KP923879532, T6Z, T6Y); + T7o = FMA(KP923879532, T6W, T6V); + T7p = FNMS(KP098491403, T7o, T7n); + T7w = FMA(KP098491403, T7n, T7o); + T6I = FMA(KP198912367, T6H, T6G); + T6L = FNMS(KP198912367, T6K, T6J); + T6M = T6I - T6L; + T7s = T6I + T6L; + } + { + E T6Q, T6T, T73, T74; + T6Q = FNMS(KP923879532, T6P, T6O); + T6T = FNMS(KP923879532, T6S, T6R); + T6U = FMA(KP820678790, T6T, T6Q); + T7c = FNMS(KP820678790, T6Q, T6T); + T73 = FNMS(KP707106781, T62, T5Z); + T74 = T3m + T3t; + T75 = FNMS(KP923879532, T74, T73); + T7r = FMA(KP923879532, T74, T73); + } + { + E T76, T77, T6X, T70; + T76 = FMA(KP198912367, T6J, T6K); + T77 = FNMS(KP198912367, T6G, T6H); + T78 = T76 - T77; + T7i = T77 + T76; + T6X = FNMS(KP923879532, T6W, T6V); + T70 = FNMS(KP923879532, T6Z, T6Y); + T71 = FNMS(KP820678790, T70, T6X); + T7d = FMA(KP820678790, T6X, T70); + } + { + E T6N, T72, T7f, T7g; + T6N = FMA(KP980785280, T6M, T6F); + T72 = T6U + T71; + ro[WS(os, 39)] = FNMS(KP773010453, T72, T6N); + ro[WS(os, 7)] = FMA(KP773010453, T72, T6N); + T7f = FMA(KP980785280, T78, T75); + T7g = T7c + T7d; + io[WS(os, 39)] = FNMS(KP773010453, T7g, T7f); + io[WS(os, 7)] = FMA(KP773010453, T7g, T7f); + } + { + E T79, T7a, T7b, T7e; + T79 = FNMS(KP980785280, T78, T75); + T7a = T71 - T6U; + io[WS(os, 55)] = FNMS(KP773010453, T7a, T79); + io[WS(os, 23)] = FMA(KP773010453, T7a, T79); + T7b = FNMS(KP980785280, T6M, T6F); + T7e = T7c - T7d; + ro[WS(os, 55)] = FNMS(KP773010453, T7e, T7b); + ro[WS(os, 23)] = FMA(KP773010453, T7e, T7b); + } + { + E T7j, T7q, T7v, T7y; + T7j = FNMS(KP980785280, T7i, T7h); + T7q = T7m - T7p; + ro[WS(os, 47)] = FNMS(KP995184726, T7q, T7j); + ro[WS(os, 15)] = FMA(KP995184726, T7q, T7j); + T7v = FNMS(KP980785280, T7s, T7r); + T7y = T7w - T7x; + io[WS(os, 47)] = FNMS(KP995184726, T7y, T7v); + io[WS(os, 15)] = FMA(KP995184726, T7y, T7v); + } + { + E T7t, T7u, T7z, T7A; + T7t = FMA(KP980785280, T7s, T7r); + T7u = T7m + T7p; + io[WS(os, 31)] = FNMS(KP995184726, T7u, T7t); + io[WS(os, 63)] = FMA(KP995184726, T7u, T7t); + T7z = FMA(KP980785280, T7i, T7h); + T7A = T7x + T7w; + ro[WS(os, 31)] = FNMS(KP995184726, T7A, T7z); + ro[WS(os, 63)] = FMA(KP995184726, T7A, T7z); + } + } + { + E T9j, T9V, Ta0, Tab, Ta3, Taa, T9q, Ta6, T9y, T9Q, T9J, Ta5, T9M, T9W, T9F; + E T9R; + { + E T9h, T9i, T9Y, T9Z; + T9h = FNMS(KP707106781, T7C, T7B); + T9i = T8I - T8J; + T9j = FMA(KP923879532, T9i, T9h); + T9V = FNMS(KP923879532, T9i, T9h); + T9Y = FMA(KP923879532, T9w, T9v); + T9Z = FMA(KP923879532, T9t, T9s); + Ta0 = FMA(KP303346683, T9Z, T9Y); + Tab = FNMS(KP303346683, T9Y, T9Z); + } + { + E Ta1, Ta2, T9m, T9p; + Ta1 = FMA(KP923879532, T9D, T9C); + Ta2 = FMA(KP923879532, T9A, T9z); + Ta3 = FNMS(KP303346683, Ta2, Ta1); + Taa = FMA(KP303346683, Ta1, Ta2); + T9m = FMA(KP668178637, T9l, T9k); + T9p = FNMS(KP668178637, T9o, T9n); + T9q = T9m - T9p; + Ta6 = T9m + T9p; + } + { + E T9u, T9x, T9H, T9I; + T9u = FNMS(KP923879532, T9t, T9s); + T9x = FNMS(KP923879532, T9w, T9v); + T9y = FMA(KP534511135, T9x, T9u); + T9Q = FNMS(KP534511135, T9u, T9x); + T9H = FNMS(KP707106781, T8G, T8F); + T9I = T7J - T7G; + T9J = FMA(KP923879532, T9I, T9H); + Ta5 = FNMS(KP923879532, T9I, T9H); + } + { + E T9K, T9L, T9B, T9E; + T9K = FMA(KP668178637, T9n, T9o); + T9L = FNMS(KP668178637, T9k, T9l); + T9M = T9K - T9L; + T9W = T9L + T9K; + T9B = FNMS(KP923879532, T9A, T9z); + T9E = FNMS(KP923879532, T9D, T9C); + T9F = FNMS(KP534511135, T9E, T9B); + T9R = FMA(KP534511135, T9B, T9E); + } + { + E T9r, T9G, T9T, T9U; + T9r = FMA(KP831469612, T9q, T9j); + T9G = T9y + T9F; + ro[WS(os, 37)] = FNMS(KP881921264, T9G, T9r); + ro[WS(os, 5)] = FMA(KP881921264, T9G, T9r); + T9T = FMA(KP831469612, T9M, T9J); + T9U = T9Q + T9R; + io[WS(os, 37)] = FNMS(KP881921264, T9U, T9T); + io[WS(os, 5)] = FMA(KP881921264, T9U, T9T); + } + { + E T9N, T9O, T9P, T9S; + T9N = FNMS(KP831469612, T9M, T9J); + T9O = T9F - T9y; + io[WS(os, 53)] = FNMS(KP881921264, T9O, T9N); + io[WS(os, 21)] = FMA(KP881921264, T9O, T9N); + T9P = FNMS(KP831469612, T9q, T9j); + T9S = T9Q - T9R; + ro[WS(os, 53)] = FNMS(KP881921264, T9S, T9P); + ro[WS(os, 21)] = FMA(KP881921264, T9S, T9P); + } + { + E T9X, Ta4, Ta9, Tac; + T9X = FNMS(KP831469612, T9W, T9V); + Ta4 = Ta0 - Ta3; + ro[WS(os, 45)] = FNMS(KP956940335, Ta4, T9X); + ro[WS(os, 13)] = FMA(KP956940335, Ta4, T9X); + Ta9 = FNMS(KP831469612, Ta6, Ta5); + Tac = Taa - Tab; + io[WS(os, 45)] = FNMS(KP956940335, Tac, Ta9); + io[WS(os, 13)] = FMA(KP956940335, Tac, Ta9); + } + { + E Ta7, Ta8, Tad, Tae; + Ta7 = FMA(KP831469612, Ta6, Ta5); + Ta8 = Ta0 + Ta3; + io[WS(os, 29)] = FNMS(KP956940335, Ta8, Ta7); + io[WS(os, 61)] = FMA(KP956940335, Ta8, Ta7); + Tad = FMA(KP831469612, T9W, T9V); + Tae = Tab + Taa; + ro[WS(os, 29)] = FNMS(KP956940335, Tae, Tad); + ro[WS(os, 61)] = FMA(KP956940335, Tae, Tad); + } + } + { + E T3v, T6j, T6o, T6y, T6r, T6z, T48, T6u, T52, T6f, T67, T6t, T6a, T6k, T5V; + E T6e; + { + E T3f, T3u, T6m, T6n; + T3f = FMA(KP707106781, T3e, T37); + T3u = T3m - T3t; + T3v = FNMS(KP923879532, T3u, T3f); + T6j = FMA(KP923879532, T3u, T3f); + T6m = FMA(KP923879532, T50, T4X); + T6n = FMA(KP923879532, T4N, T4q); + T6o = FMA(KP303346683, T6n, T6m); + T6y = FNMS(KP303346683, T6m, T6n); + } + { + E T6p, T6q, T3O, T47; + T6p = FMA(KP923879532, T5T, T5Q); + T6q = FMA(KP923879532, T5G, T5j); + T6r = FNMS(KP303346683, T6q, T6p); + T6z = FMA(KP303346683, T6p, T6q); + T3O = FNMS(KP668178637, T3N, T3G); + T47 = FMA(KP668178637, T46, T3Z); + T48 = T3O - T47; + T6u = T3O + T47; + } + { + E T4O, T51, T63, T66; + T4O = FNMS(KP923879532, T4N, T4q); + T51 = FNMS(KP923879532, T50, T4X); + T52 = FMA(KP534511135, T51, T4O); + T6f = FNMS(KP534511135, T4O, T51); + T63 = FMA(KP707106781, T62, T5Z); + T66 = T64 - T65; + T67 = FNMS(KP923879532, T66, T63); + T6t = FMA(KP923879532, T66, T63); + } + { + E T68, T69, T5H, T5U; + T68 = FNMS(KP668178637, T3Z, T46); + T69 = FMA(KP668178637, T3G, T3N); + T6a = T68 - T69; + T6k = T69 + T68; + T5H = FNMS(KP923879532, T5G, T5j); + T5U = FNMS(KP923879532, T5T, T5Q); + T5V = FNMS(KP534511135, T5U, T5H); + T6e = FMA(KP534511135, T5H, T5U); + } + { + E T49, T5W, T6d, T6g; + T49 = FMA(KP831469612, T48, T3v); + T5W = T52 - T5V; + ro[WS(os, 43)] = FNMS(KP881921264, T5W, T49); + ro[WS(os, 11)] = FMA(KP881921264, T5W, T49); + T6d = FMA(KP831469612, T6a, T67); + T6g = T6e - T6f; + io[WS(os, 43)] = FNMS(KP881921264, T6g, T6d); + io[WS(os, 11)] = FMA(KP881921264, T6g, T6d); + } + { + E T6b, T6c, T6h, T6i; + T6b = FNMS(KP831469612, T6a, T67); + T6c = T52 + T5V; + io[WS(os, 27)] = FNMS(KP881921264, T6c, T6b); + io[WS(os, 59)] = FMA(KP881921264, T6c, T6b); + T6h = FNMS(KP831469612, T48, T3v); + T6i = T6f + T6e; + ro[WS(os, 27)] = FNMS(KP881921264, T6i, T6h); + ro[WS(os, 59)] = FMA(KP881921264, T6i, T6h); + } + { + E T6l, T6s, T6B, T6C; + T6l = FMA(KP831469612, T6k, T6j); + T6s = T6o + T6r; + ro[WS(os, 35)] = FNMS(KP956940335, T6s, T6l); + ro[WS(os, 3)] = FMA(KP956940335, T6s, T6l); + T6B = FMA(KP831469612, T6u, T6t); + T6C = T6y + T6z; + io[WS(os, 35)] = FNMS(KP956940335, T6C, T6B); + io[WS(os, 3)] = FMA(KP956940335, T6C, T6B); + } + { + E T6v, T6w, T6x, T6A; + T6v = FNMS(KP831469612, T6u, T6t); + T6w = T6r - T6o; + io[WS(os, 51)] = FNMS(KP956940335, T6w, T6v); + io[WS(os, 19)] = FMA(KP956940335, T6w, T6v); + T6x = FNMS(KP831469612, T6k, T6j); + T6A = T6y - T6z; + ro[WS(os, 51)] = FNMS(KP956940335, T6A, T6x); + ro[WS(os, 19)] = FMA(KP956940335, T6A, T6x); + } + } + { + E T7L, T8X, T92, T9c, T95, T9d, T80, T98, T8k, T8T, T8L, T97, T8O, T8Y, T8D; + E T8S; + { + E T7D, T7K, T90, T91; + T7D = FMA(KP707106781, T7C, T7B); + T7K = T7G + T7J; + T7L = FNMS(KP923879532, T7K, T7D); + T8X = FMA(KP923879532, T7K, T7D); + T90 = FMA(KP923879532, T8i, T8f); + T91 = FMA(KP923879532, T8b, T84); + T92 = FMA(KP098491403, T91, T90); + T9c = FNMS(KP098491403, T90, T91); + } + { + E T93, T94, T7S, T7Z; + T93 = FMA(KP923879532, T8B, T8y); + T94 = FMA(KP923879532, T8u, T8n); + T95 = FNMS(KP098491403, T94, T93); + T9d = FMA(KP098491403, T93, T94); + T7S = FNMS(KP198912367, T7R, T7O); + T7Z = FMA(KP198912367, T7Y, T7V); + T80 = T7S - T7Z; + T98 = T7S + T7Z; + } + { + E T8c, T8j, T8H, T8K; + T8c = FNMS(KP923879532, T8b, T84); + T8j = FNMS(KP923879532, T8i, T8f); + T8k = FMA(KP820678790, T8j, T8c); + T8T = FNMS(KP820678790, T8c, T8j); + T8H = FMA(KP707106781, T8G, T8F); + T8K = T8I + T8J; + T8L = FNMS(KP923879532, T8K, T8H); + T97 = FMA(KP923879532, T8K, T8H); + } + { + E T8M, T8N, T8v, T8C; + T8M = FNMS(KP198912367, T7V, T7Y); + T8N = FMA(KP198912367, T7O, T7R); + T8O = T8M - T8N; + T8Y = T8N + T8M; + T8v = FNMS(KP923879532, T8u, T8n); + T8C = FNMS(KP923879532, T8B, T8y); + T8D = FNMS(KP820678790, T8C, T8v); + T8S = FMA(KP820678790, T8v, T8C); + } + { + E T81, T8E, T8R, T8U; + T81 = FMA(KP980785280, T80, T7L); + T8E = T8k - T8D; + ro[WS(os, 41)] = FNMS(KP773010453, T8E, T81); + ro[WS(os, 9)] = FMA(KP773010453, T8E, T81); + T8R = FMA(KP980785280, T8O, T8L); + T8U = T8S - T8T; + io[WS(os, 41)] = FNMS(KP773010453, T8U, T8R); + io[WS(os, 9)] = FMA(KP773010453, T8U, T8R); + } + { + E T8P, T8Q, T8V, T8W; + T8P = FNMS(KP980785280, T8O, T8L); + T8Q = T8k + T8D; + io[WS(os, 25)] = FNMS(KP773010453, T8Q, T8P); + io[WS(os, 57)] = FMA(KP773010453, T8Q, T8P); + T8V = FNMS(KP980785280, T80, T7L); + T8W = T8T + T8S; + ro[WS(os, 25)] = FNMS(KP773010453, T8W, T8V); + ro[WS(os, 57)] = FMA(KP773010453, T8W, T8V); + } + { + E T8Z, T96, T9f, T9g; + T8Z = FMA(KP980785280, T8Y, T8X); + T96 = T92 + T95; + ro[WS(os, 33)] = FNMS(KP995184726, T96, T8Z); + ro[WS(os, 1)] = FMA(KP995184726, T96, T8Z); + T9f = FMA(KP980785280, T98, T97); + T9g = T9c + T9d; + io[WS(os, 33)] = FNMS(KP995184726, T9g, T9f); + io[WS(os, 1)] = FMA(KP995184726, T9g, T9f); + } + { + E T99, T9a, T9b, T9e; + T99 = FNMS(KP980785280, T98, T97); + T9a = T95 - T92; + io[WS(os, 49)] = FNMS(KP995184726, T9a, T99); + io[WS(os, 17)] = FMA(KP995184726, T9a, T99); + T9b = FNMS(KP980785280, T8Y, T8X); + T9e = T9c - T9d; + ro[WS(os, 49)] = FNMS(KP995184726, T9e, T9b); + ro[WS(os, 17)] = FMA(KP995184726, T9e, T9b); + } + } + } + } +} + +static const kdft_desc desc = { 64, "n1_64", {520, 0, 392, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_64) (planner *p) { + X(kdft_register) (p, n1_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 64 -name n1_64 -include dft/scalar/n.h */ + +/* + * This function contains 912 FP additions, 248 FP multiplications, + * (or, 808 additions, 144 multiplications, 104 fused multiply/add), + * 172 stack variables, 15 constants, and 256 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + E T37, T7B, T8F, T5Z, Tf, Td9, TbB, TcB, T62, T7C, T2i, TdH, Tah, Tcb, T3e; + E T8G, Tu, TdI, Tak, TbD, Tan, TbC, T2x, Tda, T3m, T65, T7G, T8J, T7J, T8I; + E T3t, T64, TK, Tdd, Tas, Tce, Tav, Tcf, T2N, Tdc, T3G, T6G, T7O, T9k, T7R; + E T9l, T3N, T6H, T1L, Tdv, Tbs, Tcw, TdC, Teo, T5j, T6V, T5Q, T6Y, T8y, T9C; + E Tbb, Tct, T8n, T9z, TZ, Tdf, Taz, Tch, TaC, Tci, T32, Tdg, T3Z, T6J, T7V; + E T9n, T7Y, T9o, T46, T6K, T1g, Tdp, Tb1, Tcm, Tdm, Tej, T4q, T6R, T4X, T6O; + E T8f, T9s, TaK, Tcp, T84, T9v, T1v, Tdn, Tb4, Tcq, Tds, Tek, T4N, T6P, T50; + E T6S, T8i, T9w, TaV, Tcn, T8b, T9t, T20, TdD, Tbv, Tcu, Tdy, Tep, T5G, T6Z; + E T5T, T6W, T8B, T9A, Tbm, Tcx, T8u, T9D; + { + E T3, T35, T26, T5Y, T6, T5X, T29, T36, Ta, T39, T2d, T38, Td, T3b, T2g; + E T3c; + { + E T1, T2, T24, T25; + T1 = ri[0]; + T2 = ri[WS(is, 32)]; + T3 = T1 + T2; + T35 = T1 - T2; + T24 = ii[0]; + T25 = ii[WS(is, 32)]; + T26 = T24 + T25; + T5Y = T24 - T25; + } + { + E T4, T5, T27, T28; + T4 = ri[WS(is, 16)]; + T5 = ri[WS(is, 48)]; + T6 = T4 + T5; + T5X = T4 - T5; + T27 = ii[WS(is, 16)]; + T28 = ii[WS(is, 48)]; + T29 = T27 + T28; + T36 = T27 - T28; + } + { + E T8, T9, T2b, T2c; + T8 = ri[WS(is, 8)]; + T9 = ri[WS(is, 40)]; + Ta = T8 + T9; + T39 = T8 - T9; + T2b = ii[WS(is, 8)]; + T2c = ii[WS(is, 40)]; + T2d = T2b + T2c; + T38 = T2b - T2c; + } + { + E Tb, Tc, T2e, T2f; + Tb = ri[WS(is, 56)]; + Tc = ri[WS(is, 24)]; + Td = Tb + Tc; + T3b = Tb - Tc; + T2e = ii[WS(is, 56)]; + T2f = ii[WS(is, 24)]; + T2g = T2e + T2f; + T3c = T2e - T2f; + } + { + E T7, Te, T2a, T2h; + T37 = T35 - T36; + T7B = T35 + T36; + T8F = T5Y - T5X; + T5Z = T5X + T5Y; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + Td9 = T7 - Te; + { + E Tbz, TbA, T60, T61; + Tbz = T26 - T29; + TbA = Td - Ta; + TbB = Tbz - TbA; + TcB = TbA + Tbz; + T60 = T3b - T3c; + T61 = T39 + T38; + T62 = KP707106781 * (T60 - T61); + T7C = KP707106781 * (T61 + T60); + } + T2a = T26 + T29; + T2h = T2d + T2g; + T2i = T2a + T2h; + TdH = T2a - T2h; + { + E Taf, Tag, T3a, T3d; + Taf = T3 - T6; + Tag = T2d - T2g; + Tah = Taf - Tag; + Tcb = Taf + Tag; + T3a = T38 - T39; + T3d = T3b + T3c; + T3e = KP707106781 * (T3a - T3d); + T8G = KP707106781 * (T3a + T3d); + } + } + } + { + E Ti, T3j, T2l, T3h, Tl, T3g, T2o, T3k, Tp, T3q, T2s, T3o, Ts, T3n, T2v; + E T3r; + { + E Tg, Th, T2j, T2k; + Tg = ri[WS(is, 4)]; + Th = ri[WS(is, 36)]; + Ti = Tg + Th; + T3j = Tg - Th; + T2j = ii[WS(is, 4)]; + T2k = ii[WS(is, 36)]; + T2l = T2j + T2k; + T3h = T2j - T2k; + } + { + E Tj, Tk, T2m, T2n; + Tj = ri[WS(is, 20)]; + Tk = ri[WS(is, 52)]; + Tl = Tj + Tk; + T3g = Tj - Tk; + T2m = ii[WS(is, 20)]; + T2n = ii[WS(is, 52)]; + T2o = T2m + T2n; + T3k = T2m - T2n; + } + { + E Tn, To, T2q, T2r; + Tn = ri[WS(is, 60)]; + To = ri[WS(is, 28)]; + Tp = Tn + To; + T3q = Tn - To; + T2q = ii[WS(is, 60)]; + T2r = ii[WS(is, 28)]; + T2s = T2q + T2r; + T3o = T2q - T2r; + } + { + E Tq, Tr, T2t, T2u; + Tq = ri[WS(is, 12)]; + Tr = ri[WS(is, 44)]; + Ts = Tq + Tr; + T3n = Tq - Tr; + T2t = ii[WS(is, 12)]; + T2u = ii[WS(is, 44)]; + T2v = T2t + T2u; + T3r = T2t - T2u; + } + { + E Tm, Tt, Tai, Taj; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + TdI = Tt - Tm; + Tai = T2l - T2o; + Taj = Ti - Tl; + Tak = Tai - Taj; + TbD = Taj + Tai; + } + { + E Tal, Tam, T2p, T2w; + Tal = Tp - Ts; + Tam = T2s - T2v; + Tan = Tal + Tam; + TbC = Tal - Tam; + T2p = T2l + T2o; + T2w = T2s + T2v; + T2x = T2p + T2w; + Tda = T2p - T2w; + } + { + E T3i, T3l, T7E, T7F; + T3i = T3g + T3h; + T3l = T3j - T3k; + T3m = FNMS(KP923879532, T3l, KP382683432 * T3i); + T65 = FMA(KP923879532, T3i, KP382683432 * T3l); + T7E = T3h - T3g; + T7F = T3j + T3k; + T7G = FNMS(KP382683432, T7F, KP923879532 * T7E); + T8J = FMA(KP382683432, T7E, KP923879532 * T7F); + } + { + E T7H, T7I, T3p, T3s; + T7H = T3o - T3n; + T7I = T3q + T3r; + T7J = FMA(KP923879532, T7H, KP382683432 * T7I); + T8I = FNMS(KP382683432, T7H, KP923879532 * T7I); + T3p = T3n + T3o; + T3s = T3q - T3r; + T3t = FMA(KP382683432, T3p, KP923879532 * T3s); + T64 = FNMS(KP923879532, T3p, KP382683432 * T3s); + } + } + { + E Ty, T3H, T2B, T3x, TB, T3w, T2E, T3I, TI, T3L, T2L, T3B, TF, T3K, T2I; + E T3E; + { + E Tw, Tx, T2C, T2D; + Tw = ri[WS(is, 2)]; + Tx = ri[WS(is, 34)]; + Ty = Tw + Tx; + T3H = Tw - Tx; + { + E T2z, T2A, Tz, TA; + T2z = ii[WS(is, 2)]; + T2A = ii[WS(is, 34)]; + T2B = T2z + T2A; + T3x = T2z - T2A; + Tz = ri[WS(is, 18)]; + TA = ri[WS(is, 50)]; + TB = Tz + TA; + T3w = Tz - TA; + } + T2C = ii[WS(is, 18)]; + T2D = ii[WS(is, 50)]; + T2E = T2C + T2D; + T3I = T2C - T2D; + { + E TG, TH, T3z, T2J, T2K, T3A; + TG = ri[WS(is, 58)]; + TH = ri[WS(is, 26)]; + T3z = TG - TH; + T2J = ii[WS(is, 58)]; + T2K = ii[WS(is, 26)]; + T3A = T2J - T2K; + TI = TG + TH; + T3L = T3z + T3A; + T2L = T2J + T2K; + T3B = T3z - T3A; + } + { + E TD, TE, T3C, T2G, T2H, T3D; + TD = ri[WS(is, 10)]; + TE = ri[WS(is, 42)]; + T3C = TD - TE; + T2G = ii[WS(is, 10)]; + T2H = ii[WS(is, 42)]; + T3D = T2G - T2H; + TF = TD + TE; + T3K = T3D - T3C; + T2I = T2G + T2H; + T3E = T3C + T3D; + } + } + { + E TC, TJ, Taq, Tar; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + Tdd = TC - TJ; + Taq = T2B - T2E; + Tar = TI - TF; + Tas = Taq - Tar; + Tce = Tar + Taq; + } + { + E Tat, Tau, T2F, T2M; + Tat = Ty - TB; + Tau = T2I - T2L; + Tav = Tat - Tau; + Tcf = Tat + Tau; + T2F = T2B + T2E; + T2M = T2I + T2L; + T2N = T2F + T2M; + Tdc = T2F - T2M; + } + { + E T3y, T3F, T7M, T7N; + T3y = T3w + T3x; + T3F = KP707106781 * (T3B - T3E); + T3G = T3y - T3F; + T6G = T3y + T3F; + T7M = T3x - T3w; + T7N = KP707106781 * (T3K + T3L); + T7O = T7M - T7N; + T9k = T7M + T7N; + } + { + E T7P, T7Q, T3J, T3M; + T7P = T3H + T3I; + T7Q = KP707106781 * (T3E + T3B); + T7R = T7P - T7Q; + T9l = T7P + T7Q; + T3J = T3H - T3I; + T3M = KP707106781 * (T3K - T3L); + T3N = T3J - T3M; + T6H = T3J + T3M; + } + } + { + E T1z, T53, T5L, Tbo, T1C, T5I, T56, Tbp, T1J, Tb9, T5h, T5N, T1G, Tb8, T5c; + E T5O; + { + E T1x, T1y, T54, T55; + T1x = ri[WS(is, 63)]; + T1y = ri[WS(is, 31)]; + T1z = T1x + T1y; + T53 = T1x - T1y; + { + E T5J, T5K, T1A, T1B; + T5J = ii[WS(is, 63)]; + T5K = ii[WS(is, 31)]; + T5L = T5J - T5K; + Tbo = T5J + T5K; + T1A = ri[WS(is, 15)]; + T1B = ri[WS(is, 47)]; + T1C = T1A + T1B; + T5I = T1A - T1B; + } + T54 = ii[WS(is, 15)]; + T55 = ii[WS(is, 47)]; + T56 = T54 - T55; + Tbp = T54 + T55; + { + E T1H, T1I, T5d, T5e, T5f, T5g; + T1H = ri[WS(is, 55)]; + T1I = ri[WS(is, 23)]; + T5d = T1H - T1I; + T5e = ii[WS(is, 55)]; + T5f = ii[WS(is, 23)]; + T5g = T5e - T5f; + T1J = T1H + T1I; + Tb9 = T5e + T5f; + T5h = T5d + T5g; + T5N = T5d - T5g; + } + { + E T1E, T1F, T5b, T58, T59, T5a; + T1E = ri[WS(is, 7)]; + T1F = ri[WS(is, 39)]; + T5b = T1E - T1F; + T58 = ii[WS(is, 7)]; + T59 = ii[WS(is, 39)]; + T5a = T58 - T59; + T1G = T1E + T1F; + Tb8 = T58 + T59; + T5c = T5a - T5b; + T5O = T5b + T5a; + } + } + { + E T1D, T1K, Tbq, Tbr; + T1D = T1z + T1C; + T1K = T1G + T1J; + T1L = T1D + T1K; + Tdv = T1D - T1K; + Tbq = Tbo - Tbp; + Tbr = T1J - T1G; + Tbs = Tbq - Tbr; + Tcw = Tbr + Tbq; + } + { + E TdA, TdB, T57, T5i; + TdA = Tbo + Tbp; + TdB = Tb8 + Tb9; + TdC = TdA - TdB; + Teo = TdA + TdB; + T57 = T53 - T56; + T5i = KP707106781 * (T5c - T5h); + T5j = T57 - T5i; + T6V = T57 + T5i; + } + { + E T5M, T5P, T8w, T8x; + T5M = T5I + T5L; + T5P = KP707106781 * (T5N - T5O); + T5Q = T5M - T5P; + T6Y = T5M + T5P; + T8w = T5L - T5I; + T8x = KP707106781 * (T5c + T5h); + T8y = T8w - T8x; + T9C = T8w + T8x; + } + { + E Tb7, Tba, T8l, T8m; + Tb7 = T1z - T1C; + Tba = Tb8 - Tb9; + Tbb = Tb7 - Tba; + Tct = Tb7 + Tba; + T8l = T53 + T56; + T8m = KP707106781 * (T5O + T5N); + T8n = T8l - T8m; + T9z = T8l + T8m; + } + } + { + E TN, T40, T2Q, T3Q, TQ, T3P, T2T, T41, TX, T44, T30, T3U, TU, T43, T2X; + E T3X; + { + E TL, TM, T2R, T2S; + TL = ri[WS(is, 62)]; + TM = ri[WS(is, 30)]; + TN = TL + TM; + T40 = TL - TM; + { + E T2O, T2P, TO, TP; + T2O = ii[WS(is, 62)]; + T2P = ii[WS(is, 30)]; + T2Q = T2O + T2P; + T3Q = T2O - T2P; + TO = ri[WS(is, 14)]; + TP = ri[WS(is, 46)]; + TQ = TO + TP; + T3P = TO - TP; + } + T2R = ii[WS(is, 14)]; + T2S = ii[WS(is, 46)]; + T2T = T2R + T2S; + T41 = T2R - T2S; + { + E TV, TW, T3S, T2Y, T2Z, T3T; + TV = ri[WS(is, 54)]; + TW = ri[WS(is, 22)]; + T3S = TV - TW; + T2Y = ii[WS(is, 54)]; + T2Z = ii[WS(is, 22)]; + T3T = T2Y - T2Z; + TX = TV + TW; + T44 = T3S + T3T; + T30 = T2Y + T2Z; + T3U = T3S - T3T; + } + { + E TS, TT, T3V, T2V, T2W, T3W; + TS = ri[WS(is, 6)]; + TT = ri[WS(is, 38)]; + T3V = TS - TT; + T2V = ii[WS(is, 6)]; + T2W = ii[WS(is, 38)]; + T3W = T2V - T2W; + TU = TS + TT; + T43 = T3W - T3V; + T2X = T2V + T2W; + T3X = T3V + T3W; + } + } + { + E TR, TY, Tax, Tay; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + Tdf = TR - TY; + Tax = T2Q - T2T; + Tay = TX - TU; + Taz = Tax - Tay; + Tch = Tay + Tax; + } + { + E TaA, TaB, T2U, T31; + TaA = TN - TQ; + TaB = T2X - T30; + TaC = TaA - TaB; + Tci = TaA + TaB; + T2U = T2Q + T2T; + T31 = T2X + T30; + T32 = T2U + T31; + Tdg = T2U - T31; + } + { + E T3R, T3Y, T7T, T7U; + T3R = T3P + T3Q; + T3Y = KP707106781 * (T3U - T3X); + T3Z = T3R - T3Y; + T6J = T3R + T3Y; + T7T = T40 + T41; + T7U = KP707106781 * (T3X + T3U); + T7V = T7T - T7U; + T9n = T7T + T7U; + } + { + E T7W, T7X, T42, T45; + T7W = T3Q - T3P; + T7X = KP707106781 * (T43 + T44); + T7Y = T7W - T7X; + T9o = T7W + T7X; + T42 = T40 - T41; + T45 = KP707106781 * (T43 - T44); + T46 = T42 - T45; + T6K = T42 + T45; + } + } + { + E T14, T4P, T4d, TaG, T17, T4a, T4S, TaH, T1e, TaZ, T4j, T4V, T1b, TaY, T4o; + E T4U; + { + E T12, T13, T4Q, T4R; + T12 = ri[WS(is, 1)]; + T13 = ri[WS(is, 33)]; + T14 = T12 + T13; + T4P = T12 - T13; + { + E T4b, T4c, T15, T16; + T4b = ii[WS(is, 1)]; + T4c = ii[WS(is, 33)]; + T4d = T4b - T4c; + TaG = T4b + T4c; + T15 = ri[WS(is, 17)]; + T16 = ri[WS(is, 49)]; + T17 = T15 + T16; + T4a = T15 - T16; + } + T4Q = ii[WS(is, 17)]; + T4R = ii[WS(is, 49)]; + T4S = T4Q - T4R; + TaH = T4Q + T4R; + { + E T1c, T1d, T4f, T4g, T4h, T4i; + T1c = ri[WS(is, 57)]; + T1d = ri[WS(is, 25)]; + T4f = T1c - T1d; + T4g = ii[WS(is, 57)]; + T4h = ii[WS(is, 25)]; + T4i = T4g - T4h; + T1e = T1c + T1d; + TaZ = T4g + T4h; + T4j = T4f - T4i; + T4V = T4f + T4i; + } + { + E T19, T1a, T4k, T4l, T4m, T4n; + T19 = ri[WS(is, 9)]; + T1a = ri[WS(is, 41)]; + T4k = T19 - T1a; + T4l = ii[WS(is, 9)]; + T4m = ii[WS(is, 41)]; + T4n = T4l - T4m; + T1b = T19 + T1a; + TaY = T4l + T4m; + T4o = T4k + T4n; + T4U = T4n - T4k; + } + } + { + E T18, T1f, TaX, Tb0; + T18 = T14 + T17; + T1f = T1b + T1e; + T1g = T18 + T1f; + Tdp = T18 - T1f; + TaX = T14 - T17; + Tb0 = TaY - TaZ; + Tb1 = TaX - Tb0; + Tcm = TaX + Tb0; + } + { + E Tdk, Tdl, T4e, T4p; + Tdk = TaG + TaH; + Tdl = TaY + TaZ; + Tdm = Tdk - Tdl; + Tej = Tdk + Tdl; + T4e = T4a + T4d; + T4p = KP707106781 * (T4j - T4o); + T4q = T4e - T4p; + T6R = T4e + T4p; + } + { + E T4T, T4W, T8d, T8e; + T4T = T4P - T4S; + T4W = KP707106781 * (T4U - T4V); + T4X = T4T - T4W; + T6O = T4T + T4W; + T8d = T4P + T4S; + T8e = KP707106781 * (T4o + T4j); + T8f = T8d - T8e; + T9s = T8d + T8e; + } + { + E TaI, TaJ, T82, T83; + TaI = TaG - TaH; + TaJ = T1e - T1b; + TaK = TaI - TaJ; + Tcp = TaJ + TaI; + T82 = T4d - T4a; + T83 = KP707106781 * (T4U + T4V); + T84 = T82 - T83; + T9v = T82 + T83; + } + } + { + E T1j, TaR, T1m, TaS, T4G, T4L, TaT, TaQ, T89, T88, T1q, TaM, T1t, TaN, T4v; + E T4A, TaO, TaL, T86, T85; + { + E T4H, T4F, T4C, T4K; + { + E T1h, T1i, T4D, T4E; + T1h = ri[WS(is, 5)]; + T1i = ri[WS(is, 37)]; + T1j = T1h + T1i; + T4H = T1h - T1i; + T4D = ii[WS(is, 5)]; + T4E = ii[WS(is, 37)]; + T4F = T4D - T4E; + TaR = T4D + T4E; + } + { + E T1k, T1l, T4I, T4J; + T1k = ri[WS(is, 21)]; + T1l = ri[WS(is, 53)]; + T1m = T1k + T1l; + T4C = T1k - T1l; + T4I = ii[WS(is, 21)]; + T4J = ii[WS(is, 53)]; + T4K = T4I - T4J; + TaS = T4I + T4J; + } + T4G = T4C + T4F; + T4L = T4H - T4K; + TaT = TaR - TaS; + TaQ = T1j - T1m; + T89 = T4H + T4K; + T88 = T4F - T4C; + } + { + E T4r, T4z, T4w, T4u; + { + E T1o, T1p, T4x, T4y; + T1o = ri[WS(is, 61)]; + T1p = ri[WS(is, 29)]; + T1q = T1o + T1p; + T4r = T1o - T1p; + T4x = ii[WS(is, 61)]; + T4y = ii[WS(is, 29)]; + T4z = T4x - T4y; + TaM = T4x + T4y; + } + { + E T1r, T1s, T4s, T4t; + T1r = ri[WS(is, 13)]; + T1s = ri[WS(is, 45)]; + T1t = T1r + T1s; + T4w = T1r - T1s; + T4s = ii[WS(is, 13)]; + T4t = ii[WS(is, 45)]; + T4u = T4s - T4t; + TaN = T4s + T4t; + } + T4v = T4r - T4u; + T4A = T4w + T4z; + TaO = TaM - TaN; + TaL = T1q - T1t; + T86 = T4z - T4w; + T85 = T4r + T4u; + } + { + E T1n, T1u, Tb2, Tb3; + T1n = T1j + T1m; + T1u = T1q + T1t; + T1v = T1n + T1u; + Tdn = T1u - T1n; + Tb2 = TaT - TaQ; + Tb3 = TaL + TaO; + Tb4 = KP707106781 * (Tb2 - Tb3); + Tcq = KP707106781 * (Tb2 + Tb3); + } + { + E Tdq, Tdr, T4B, T4M; + Tdq = TaR + TaS; + Tdr = TaM + TaN; + Tds = Tdq - Tdr; + Tek = Tdq + Tdr; + T4B = FNMS(KP923879532, T4A, KP382683432 * T4v); + T4M = FMA(KP923879532, T4G, KP382683432 * T4L); + T4N = T4B - T4M; + T6P = T4M + T4B; + } + { + E T4Y, T4Z, T8g, T8h; + T4Y = FNMS(KP923879532, T4L, KP382683432 * T4G); + T4Z = FMA(KP382683432, T4A, KP923879532 * T4v); + T50 = T4Y - T4Z; + T6S = T4Y + T4Z; + T8g = FNMS(KP382683432, T89, KP923879532 * T88); + T8h = FMA(KP923879532, T86, KP382683432 * T85); + T8i = T8g - T8h; + T9w = T8g + T8h; + } + { + E TaP, TaU, T87, T8a; + TaP = TaL - TaO; + TaU = TaQ + TaT; + TaV = KP707106781 * (TaP - TaU); + Tcn = KP707106781 * (TaU + TaP); + T87 = FNMS(KP382683432, T86, KP923879532 * T85); + T8a = FMA(KP382683432, T88, KP923879532 * T89); + T8b = T87 - T8a; + T9t = T8a + T87; + } + } + { + E T1O, Tbc, T1R, Tbd, T5o, T5t, Tbf, Tbe, T8p, T8o, T1V, Tbi, T1Y, Tbj, T5z; + E T5E, Tbk, Tbh, T8s, T8r; + { + E T5p, T5n, T5k, T5s; + { + E T1M, T1N, T5l, T5m; + T1M = ri[WS(is, 3)]; + T1N = ri[WS(is, 35)]; + T1O = T1M + T1N; + T5p = T1M - T1N; + T5l = ii[WS(is, 3)]; + T5m = ii[WS(is, 35)]; + T5n = T5l - T5m; + Tbc = T5l + T5m; + } + { + E T1P, T1Q, T5q, T5r; + T1P = ri[WS(is, 19)]; + T1Q = ri[WS(is, 51)]; + T1R = T1P + T1Q; + T5k = T1P - T1Q; + T5q = ii[WS(is, 19)]; + T5r = ii[WS(is, 51)]; + T5s = T5q - T5r; + Tbd = T5q + T5r; + } + T5o = T5k + T5n; + T5t = T5p - T5s; + Tbf = T1O - T1R; + Tbe = Tbc - Tbd; + T8p = T5p + T5s; + T8o = T5n - T5k; + } + { + E T5A, T5y, T5v, T5D; + { + E T1T, T1U, T5w, T5x; + T1T = ri[WS(is, 59)]; + T1U = ri[WS(is, 27)]; + T1V = T1T + T1U; + T5A = T1T - T1U; + T5w = ii[WS(is, 59)]; + T5x = ii[WS(is, 27)]; + T5y = T5w - T5x; + Tbi = T5w + T5x; + } + { + E T1W, T1X, T5B, T5C; + T1W = ri[WS(is, 11)]; + T1X = ri[WS(is, 43)]; + T1Y = T1W + T1X; + T5v = T1W - T1X; + T5B = ii[WS(is, 11)]; + T5C = ii[WS(is, 43)]; + T5D = T5B - T5C; + Tbj = T5B + T5C; + } + T5z = T5v + T5y; + T5E = T5A - T5D; + Tbk = Tbi - Tbj; + Tbh = T1V - T1Y; + T8s = T5A + T5D; + T8r = T5y - T5v; + } + { + E T1S, T1Z, Tbt, Tbu; + T1S = T1O + T1R; + T1Z = T1V + T1Y; + T20 = T1S + T1Z; + TdD = T1Z - T1S; + Tbt = Tbh - Tbk; + Tbu = Tbf + Tbe; + Tbv = KP707106781 * (Tbt - Tbu); + Tcu = KP707106781 * (Tbu + Tbt); + } + { + E Tdw, Tdx, T5u, T5F; + Tdw = Tbc + Tbd; + Tdx = Tbi + Tbj; + Tdy = Tdw - Tdx; + Tep = Tdw + Tdx; + T5u = FNMS(KP923879532, T5t, KP382683432 * T5o); + T5F = FMA(KP382683432, T5z, KP923879532 * T5E); + T5G = T5u - T5F; + T6Z = T5u + T5F; + } + { + E T5R, T5S, T8z, T8A; + T5R = FNMS(KP923879532, T5z, KP382683432 * T5E); + T5S = FMA(KP923879532, T5o, KP382683432 * T5t); + T5T = T5R - T5S; + T6W = T5S + T5R; + T8z = FNMS(KP382683432, T8r, KP923879532 * T8s); + T8A = FMA(KP382683432, T8o, KP923879532 * T8p); + T8B = T8z - T8A; + T9A = T8A + T8z; + } + { + E Tbg, Tbl, T8q, T8t; + Tbg = Tbe - Tbf; + Tbl = Tbh + Tbk; + Tbm = KP707106781 * (Tbg - Tbl); + Tcx = KP707106781 * (Tbg + Tbl); + T8q = FNMS(KP382683432, T8p, KP923879532 * T8o); + T8t = FMA(KP923879532, T8r, KP382683432 * T8s); + T8u = T8q - T8t; + T9D = T8q + T8t; + } + } + { + E T11, TeD, TeG, TeI, T22, T23, T34, TeH; + { + E Tv, T10, TeE, TeF; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + TeD = Tv - T10; + TeE = Tej + Tek; + TeF = Teo + Tep; + TeG = TeE - TeF; + TeI = TeE + TeF; + } + { + E T1w, T21, T2y, T33; + T1w = T1g + T1v; + T21 = T1L + T20; + T22 = T1w + T21; + T23 = T21 - T1w; + T2y = T2i + T2x; + T33 = T2N + T32; + T34 = T2y - T33; + TeH = T2y + T33; + } + ro[WS(os, 32)] = T11 - T22; + io[WS(os, 32)] = TeH - TeI; + ro[0] = T11 + T22; + io[0] = TeH + TeI; + io[WS(os, 16)] = T23 + T34; + ro[WS(os, 16)] = TeD + TeG; + io[WS(os, 48)] = T34 - T23; + ro[WS(os, 48)] = TeD - TeG; + } + { + E Teh, Tex, Tev, TeB, Tem, Tey, Ter, Tez; + { + E Tef, Teg, Tet, Teu; + Tef = Tf - Tu; + Teg = T2N - T32; + Teh = Tef + Teg; + Tex = Tef - Teg; + Tet = T2i - T2x; + Teu = TZ - TK; + Tev = Tet - Teu; + TeB = Teu + Tet; + } + { + E Tei, Tel, Ten, Teq; + Tei = T1g - T1v; + Tel = Tej - Tek; + Tem = Tei + Tel; + Tey = Tel - Tei; + Ten = T1L - T20; + Teq = Teo - Tep; + Ter = Ten - Teq; + Tez = Ten + Teq; + } + { + E Tes, TeC, Tew, TeA; + Tes = KP707106781 * (Tem + Ter); + ro[WS(os, 40)] = Teh - Tes; + ro[WS(os, 8)] = Teh + Tes; + TeC = KP707106781 * (Tey + Tez); + io[WS(os, 40)] = TeB - TeC; + io[WS(os, 8)] = TeB + TeC; + Tew = KP707106781 * (Ter - Tem); + io[WS(os, 56)] = Tev - Tew; + io[WS(os, 24)] = Tev + Tew; + TeA = KP707106781 * (Tey - Tez); + ro[WS(os, 56)] = Tex - TeA; + ro[WS(os, 24)] = Tex + TeA; + } + } + { + E Tdb, TdV, Te5, TdJ, Tdi, Te6, Te3, Teb, TdM, TdW, Tdu, TdQ, Te0, Tea, TdF; + E TdR; + { + E Tde, Tdh, Tdo, Tdt; + Tdb = Td9 - Tda; + TdV = Td9 + Tda; + Te5 = TdI + TdH; + TdJ = TdH - TdI; + Tde = Tdc - Tdd; + Tdh = Tdf + Tdg; + Tdi = KP707106781 * (Tde - Tdh); + Te6 = KP707106781 * (Tde + Tdh); + { + E Te1, Te2, TdK, TdL; + Te1 = Tdv + Tdy; + Te2 = TdD + TdC; + Te3 = FNMS(KP382683432, Te2, KP923879532 * Te1); + Teb = FMA(KP923879532, Te2, KP382683432 * Te1); + TdK = Tdf - Tdg; + TdL = Tdd + Tdc; + TdM = KP707106781 * (TdK - TdL); + TdW = KP707106781 * (TdL + TdK); + } + Tdo = Tdm - Tdn; + Tdt = Tdp - Tds; + Tdu = FMA(KP923879532, Tdo, KP382683432 * Tdt); + TdQ = FNMS(KP923879532, Tdt, KP382683432 * Tdo); + { + E TdY, TdZ, Tdz, TdE; + TdY = Tdn + Tdm; + TdZ = Tdp + Tds; + Te0 = FMA(KP382683432, TdY, KP923879532 * TdZ); + Tea = FNMS(KP382683432, TdZ, KP923879532 * TdY); + Tdz = Tdv - Tdy; + TdE = TdC - TdD; + TdF = FNMS(KP923879532, TdE, KP382683432 * Tdz); + TdR = FMA(KP382683432, TdE, KP923879532 * Tdz); + } + } + { + E Tdj, TdG, TdT, TdU; + Tdj = Tdb + Tdi; + TdG = Tdu + TdF; + ro[WS(os, 44)] = Tdj - TdG; + ro[WS(os, 12)] = Tdj + TdG; + TdT = TdJ + TdM; + TdU = TdQ + TdR; + io[WS(os, 44)] = TdT - TdU; + io[WS(os, 12)] = TdT + TdU; + } + { + E TdN, TdO, TdP, TdS; + TdN = TdJ - TdM; + TdO = TdF - Tdu; + io[WS(os, 60)] = TdN - TdO; + io[WS(os, 28)] = TdN + TdO; + TdP = Tdb - Tdi; + TdS = TdQ - TdR; + ro[WS(os, 60)] = TdP - TdS; + ro[WS(os, 28)] = TdP + TdS; + } + { + E TdX, Te4, Ted, Tee; + TdX = TdV + TdW; + Te4 = Te0 + Te3; + ro[WS(os, 36)] = TdX - Te4; + ro[WS(os, 4)] = TdX + Te4; + Ted = Te5 + Te6; + Tee = Tea + Teb; + io[WS(os, 36)] = Ted - Tee; + io[WS(os, 4)] = Ted + Tee; + } + { + E Te7, Te8, Te9, Tec; + Te7 = Te5 - Te6; + Te8 = Te3 - Te0; + io[WS(os, 52)] = Te7 - Te8; + io[WS(os, 20)] = Te7 + Te8; + Te9 = TdV - TdW; + Tec = Tea - Teb; + ro[WS(os, 52)] = Te9 - Tec; + ro[WS(os, 20)] = Te9 + Tec; + } + } + { + E Tcd, TcP, TcD, TcZ, Tck, Td0, TcX, Td5, Tcs, TcK, TcG, TcQ, TcU, Td4, Tcz; + E TcL, Tcc, TcC; + Tcc = KP707106781 * (TbD + TbC); + Tcd = Tcb - Tcc; + TcP = Tcb + Tcc; + TcC = KP707106781 * (Tak + Tan); + TcD = TcB - TcC; + TcZ = TcB + TcC; + { + E Tcg, Tcj, TcV, TcW; + Tcg = FNMS(KP382683432, Tcf, KP923879532 * Tce); + Tcj = FMA(KP923879532, Tch, KP382683432 * Tci); + Tck = Tcg - Tcj; + Td0 = Tcg + Tcj; + TcV = Tct + Tcu; + TcW = Tcw + Tcx; + TcX = FNMS(KP195090322, TcW, KP980785280 * TcV); + Td5 = FMA(KP195090322, TcV, KP980785280 * TcW); + } + { + E Tco, Tcr, TcE, TcF; + Tco = Tcm - Tcn; + Tcr = Tcp - Tcq; + Tcs = FMA(KP555570233, Tco, KP831469612 * Tcr); + TcK = FNMS(KP831469612, Tco, KP555570233 * Tcr); + TcE = FNMS(KP382683432, Tch, KP923879532 * Tci); + TcF = FMA(KP382683432, Tce, KP923879532 * Tcf); + TcG = TcE - TcF; + TcQ = TcF + TcE; + } + { + E TcS, TcT, Tcv, Tcy; + TcS = Tcm + Tcn; + TcT = Tcp + Tcq; + TcU = FMA(KP980785280, TcS, KP195090322 * TcT); + Td4 = FNMS(KP195090322, TcS, KP980785280 * TcT); + Tcv = Tct - Tcu; + Tcy = Tcw - Tcx; + Tcz = FNMS(KP831469612, Tcy, KP555570233 * Tcv); + TcL = FMA(KP831469612, Tcv, KP555570233 * Tcy); + } + { + E Tcl, TcA, TcN, TcO; + Tcl = Tcd + Tck; + TcA = Tcs + Tcz; + ro[WS(os, 42)] = Tcl - TcA; + ro[WS(os, 10)] = Tcl + TcA; + TcN = TcD + TcG; + TcO = TcK + TcL; + io[WS(os, 42)] = TcN - TcO; + io[WS(os, 10)] = TcN + TcO; + } + { + E TcH, TcI, TcJ, TcM; + TcH = TcD - TcG; + TcI = Tcz - Tcs; + io[WS(os, 58)] = TcH - TcI; + io[WS(os, 26)] = TcH + TcI; + TcJ = Tcd - Tck; + TcM = TcK - TcL; + ro[WS(os, 58)] = TcJ - TcM; + ro[WS(os, 26)] = TcJ + TcM; + } + { + E TcR, TcY, Td7, Td8; + TcR = TcP + TcQ; + TcY = TcU + TcX; + ro[WS(os, 34)] = TcR - TcY; + ro[WS(os, 2)] = TcR + TcY; + Td7 = TcZ + Td0; + Td8 = Td4 + Td5; + io[WS(os, 34)] = Td7 - Td8; + io[WS(os, 2)] = Td7 + Td8; + } + { + E Td1, Td2, Td3, Td6; + Td1 = TcZ - Td0; + Td2 = TcX - TcU; + io[WS(os, 50)] = Td1 - Td2; + io[WS(os, 18)] = Td1 + Td2; + Td3 = TcP - TcQ; + Td6 = Td4 - Td5; + ro[WS(os, 50)] = Td3 - Td6; + ro[WS(os, 18)] = Td3 + Td6; + } + } + { + E Tap, TbR, TbF, Tc1, TaE, Tc2, TbZ, Tc7, Tb6, TbM, TbI, TbS, TbW, Tc6, Tbx; + E TbN, Tao, TbE; + Tao = KP707106781 * (Tak - Tan); + Tap = Tah - Tao; + TbR = Tah + Tao; + TbE = KP707106781 * (TbC - TbD); + TbF = TbB - TbE; + Tc1 = TbB + TbE; + { + E Taw, TaD, TbX, TbY; + Taw = FNMS(KP923879532, Tav, KP382683432 * Tas); + TaD = FMA(KP382683432, Taz, KP923879532 * TaC); + TaE = Taw - TaD; + Tc2 = Taw + TaD; + TbX = Tbb + Tbm; + TbY = Tbs + Tbv; + TbZ = FNMS(KP555570233, TbY, KP831469612 * TbX); + Tc7 = FMA(KP831469612, TbY, KP555570233 * TbX); + } + { + E TaW, Tb5, TbG, TbH; + TaW = TaK - TaV; + Tb5 = Tb1 - Tb4; + Tb6 = FMA(KP980785280, TaW, KP195090322 * Tb5); + TbM = FNMS(KP980785280, Tb5, KP195090322 * TaW); + TbG = FNMS(KP923879532, Taz, KP382683432 * TaC); + TbH = FMA(KP923879532, Tas, KP382683432 * Tav); + TbI = TbG - TbH; + TbS = TbH + TbG; + } + { + E TbU, TbV, Tbn, Tbw; + TbU = TaK + TaV; + TbV = Tb1 + Tb4; + TbW = FMA(KP555570233, TbU, KP831469612 * TbV); + Tc6 = FNMS(KP555570233, TbV, KP831469612 * TbU); + Tbn = Tbb - Tbm; + Tbw = Tbs - Tbv; + Tbx = FNMS(KP980785280, Tbw, KP195090322 * Tbn); + TbN = FMA(KP195090322, Tbw, KP980785280 * Tbn); + } + { + E TaF, Tby, TbP, TbQ; + TaF = Tap + TaE; + Tby = Tb6 + Tbx; + ro[WS(os, 46)] = TaF - Tby; + ro[WS(os, 14)] = TaF + Tby; + TbP = TbF + TbI; + TbQ = TbM + TbN; + io[WS(os, 46)] = TbP - TbQ; + io[WS(os, 14)] = TbP + TbQ; + } + { + E TbJ, TbK, TbL, TbO; + TbJ = TbF - TbI; + TbK = Tbx - Tb6; + io[WS(os, 62)] = TbJ - TbK; + io[WS(os, 30)] = TbJ + TbK; + TbL = Tap - TaE; + TbO = TbM - TbN; + ro[WS(os, 62)] = TbL - TbO; + ro[WS(os, 30)] = TbL + TbO; + } + { + E TbT, Tc0, Tc9, Tca; + TbT = TbR + TbS; + Tc0 = TbW + TbZ; + ro[WS(os, 38)] = TbT - Tc0; + ro[WS(os, 6)] = TbT + Tc0; + Tc9 = Tc1 + Tc2; + Tca = Tc6 + Tc7; + io[WS(os, 38)] = Tc9 - Tca; + io[WS(os, 6)] = Tc9 + Tca; + } + { + E Tc3, Tc4, Tc5, Tc8; + Tc3 = Tc1 - Tc2; + Tc4 = TbZ - TbW; + io[WS(os, 54)] = Tc3 - Tc4; + io[WS(os, 22)] = Tc3 + Tc4; + Tc5 = TbR - TbS; + Tc8 = Tc6 - Tc7; + ro[WS(os, 54)] = Tc5 - Tc8; + ro[WS(os, 22)] = Tc5 + Tc8; + } + } + { + E T6F, T7h, T7m, T7w, T7p, T7x, T6M, T7s, T6U, T7c, T75, T7r, T78, T7i, T71; + E T7d; + { + E T6D, T6E, T7k, T7l; + T6D = T37 + T3e; + T6E = T65 + T64; + T6F = T6D - T6E; + T7h = T6D + T6E; + T7k = T6O + T6P; + T7l = T6R + T6S; + T7m = FMA(KP956940335, T7k, KP290284677 * T7l); + T7w = FNMS(KP290284677, T7k, KP956940335 * T7l); + } + { + E T7n, T7o, T6I, T6L; + T7n = T6V + T6W; + T7o = T6Y + T6Z; + T7p = FNMS(KP290284677, T7o, KP956940335 * T7n); + T7x = FMA(KP290284677, T7n, KP956940335 * T7o); + T6I = FNMS(KP555570233, T6H, KP831469612 * T6G); + T6L = FMA(KP831469612, T6J, KP555570233 * T6K); + T6M = T6I - T6L; + T7s = T6I + T6L; + } + { + E T6Q, T6T, T73, T74; + T6Q = T6O - T6P; + T6T = T6R - T6S; + T6U = FMA(KP471396736, T6Q, KP881921264 * T6T); + T7c = FNMS(KP881921264, T6Q, KP471396736 * T6T); + T73 = T5Z + T62; + T74 = T3m + T3t; + T75 = T73 - T74; + T7r = T73 + T74; + } + { + E T76, T77, T6X, T70; + T76 = FNMS(KP555570233, T6J, KP831469612 * T6K); + T77 = FMA(KP555570233, T6G, KP831469612 * T6H); + T78 = T76 - T77; + T7i = T77 + T76; + T6X = T6V - T6W; + T70 = T6Y - T6Z; + T71 = FNMS(KP881921264, T70, KP471396736 * T6X); + T7d = FMA(KP881921264, T6X, KP471396736 * T70); + } + { + E T6N, T72, T7f, T7g; + T6N = T6F + T6M; + T72 = T6U + T71; + ro[WS(os, 43)] = T6N - T72; + ro[WS(os, 11)] = T6N + T72; + T7f = T75 + T78; + T7g = T7c + T7d; + io[WS(os, 43)] = T7f - T7g; + io[WS(os, 11)] = T7f + T7g; + } + { + E T79, T7a, T7b, T7e; + T79 = T75 - T78; + T7a = T71 - T6U; + io[WS(os, 59)] = T79 - T7a; + io[WS(os, 27)] = T79 + T7a; + T7b = T6F - T6M; + T7e = T7c - T7d; + ro[WS(os, 59)] = T7b - T7e; + ro[WS(os, 27)] = T7b + T7e; + } + { + E T7j, T7q, T7z, T7A; + T7j = T7h + T7i; + T7q = T7m + T7p; + ro[WS(os, 35)] = T7j - T7q; + ro[WS(os, 3)] = T7j + T7q; + T7z = T7r + T7s; + T7A = T7w + T7x; + io[WS(os, 35)] = T7z - T7A; + io[WS(os, 3)] = T7z + T7A; + } + { + E T7t, T7u, T7v, T7y; + T7t = T7r - T7s; + T7u = T7p - T7m; + io[WS(os, 51)] = T7t - T7u; + io[WS(os, 19)] = T7t + T7u; + T7v = T7h - T7i; + T7y = T7w - T7x; + ro[WS(os, 51)] = T7v - T7y; + ro[WS(os, 19)] = T7v + T7y; + } + } + { + E T9j, T9V, Ta0, Taa, Ta3, Tab, T9q, Ta6, T9y, T9Q, T9J, Ta5, T9M, T9W, T9F; + E T9R; + { + E T9h, T9i, T9Y, T9Z; + T9h = T7B + T7C; + T9i = T8J + T8I; + T9j = T9h - T9i; + T9V = T9h + T9i; + T9Y = T9s + T9t; + T9Z = T9v + T9w; + Ta0 = FMA(KP995184726, T9Y, KP098017140 * T9Z); + Taa = FNMS(KP098017140, T9Y, KP995184726 * T9Z); + } + { + E Ta1, Ta2, T9m, T9p; + Ta1 = T9z + T9A; + Ta2 = T9C + T9D; + Ta3 = FNMS(KP098017140, Ta2, KP995184726 * Ta1); + Tab = FMA(KP098017140, Ta1, KP995184726 * Ta2); + T9m = FNMS(KP195090322, T9l, KP980785280 * T9k); + T9p = FMA(KP195090322, T9n, KP980785280 * T9o); + T9q = T9m - T9p; + Ta6 = T9m + T9p; + } + { + E T9u, T9x, T9H, T9I; + T9u = T9s - T9t; + T9x = T9v - T9w; + T9y = FMA(KP634393284, T9u, KP773010453 * T9x); + T9Q = FNMS(KP773010453, T9u, KP634393284 * T9x); + T9H = T8F + T8G; + T9I = T7G + T7J; + T9J = T9H - T9I; + Ta5 = T9H + T9I; + } + { + E T9K, T9L, T9B, T9E; + T9K = FNMS(KP195090322, T9o, KP980785280 * T9n); + T9L = FMA(KP980785280, T9l, KP195090322 * T9k); + T9M = T9K - T9L; + T9W = T9L + T9K; + T9B = T9z - T9A; + T9E = T9C - T9D; + T9F = FNMS(KP773010453, T9E, KP634393284 * T9B); + T9R = FMA(KP773010453, T9B, KP634393284 * T9E); + } + { + E T9r, T9G, T9T, T9U; + T9r = T9j + T9q; + T9G = T9y + T9F; + ro[WS(os, 41)] = T9r - T9G; + ro[WS(os, 9)] = T9r + T9G; + T9T = T9J + T9M; + T9U = T9Q + T9R; + io[WS(os, 41)] = T9T - T9U; + io[WS(os, 9)] = T9T + T9U; + } + { + E T9N, T9O, T9P, T9S; + T9N = T9J - T9M; + T9O = T9F - T9y; + io[WS(os, 57)] = T9N - T9O; + io[WS(os, 25)] = T9N + T9O; + T9P = T9j - T9q; + T9S = T9Q - T9R; + ro[WS(os, 57)] = T9P - T9S; + ro[WS(os, 25)] = T9P + T9S; + } + { + E T9X, Ta4, Tad, Tae; + T9X = T9V + T9W; + Ta4 = Ta0 + Ta3; + ro[WS(os, 33)] = T9X - Ta4; + ro[WS(os, 1)] = T9X + Ta4; + Tad = Ta5 + Ta6; + Tae = Taa + Tab; + io[WS(os, 33)] = Tad - Tae; + io[WS(os, 1)] = Tad + Tae; + } + { + E Ta7, Ta8, Ta9, Tac; + Ta7 = Ta5 - Ta6; + Ta8 = Ta3 - Ta0; + io[WS(os, 49)] = Ta7 - Ta8; + io[WS(os, 17)] = Ta7 + Ta8; + Ta9 = T9V - T9W; + Tac = Taa - Tab; + ro[WS(os, 49)] = Ta9 - Tac; + ro[WS(os, 17)] = Ta9 + Tac; + } + } + { + E T3v, T6j, T6o, T6y, T6r, T6z, T48, T6u, T52, T6e, T67, T6t, T6a, T6k, T5V; + E T6f; + { + E T3f, T3u, T6m, T6n; + T3f = T37 - T3e; + T3u = T3m - T3t; + T3v = T3f - T3u; + T6j = T3f + T3u; + T6m = T4q + T4N; + T6n = T4X + T50; + T6o = FMA(KP634393284, T6m, KP773010453 * T6n); + T6y = FNMS(KP634393284, T6n, KP773010453 * T6m); + } + { + E T6p, T6q, T3O, T47; + T6p = T5j + T5G; + T6q = T5Q + T5T; + T6r = FNMS(KP634393284, T6q, KP773010453 * T6p); + T6z = FMA(KP773010453, T6q, KP634393284 * T6p); + T3O = FNMS(KP980785280, T3N, KP195090322 * T3G); + T47 = FMA(KP195090322, T3Z, KP980785280 * T46); + T48 = T3O - T47; + T6u = T3O + T47; + } + { + E T4O, T51, T63, T66; + T4O = T4q - T4N; + T51 = T4X - T50; + T52 = FMA(KP995184726, T4O, KP098017140 * T51); + T6e = FNMS(KP995184726, T51, KP098017140 * T4O); + T63 = T5Z - T62; + T66 = T64 - T65; + T67 = T63 - T66; + T6t = T63 + T66; + } + { + E T68, T69, T5H, T5U; + T68 = FNMS(KP980785280, T3Z, KP195090322 * T46); + T69 = FMA(KP980785280, T3G, KP195090322 * T3N); + T6a = T68 - T69; + T6k = T69 + T68; + T5H = T5j - T5G; + T5U = T5Q - T5T; + T5V = FNMS(KP995184726, T5U, KP098017140 * T5H); + T6f = FMA(KP098017140, T5U, KP995184726 * T5H); + } + { + E T49, T5W, T6h, T6i; + T49 = T3v + T48; + T5W = T52 + T5V; + ro[WS(os, 47)] = T49 - T5W; + ro[WS(os, 15)] = T49 + T5W; + T6h = T67 + T6a; + T6i = T6e + T6f; + io[WS(os, 47)] = T6h - T6i; + io[WS(os, 15)] = T6h + T6i; + } + { + E T6b, T6c, T6d, T6g; + T6b = T67 - T6a; + T6c = T5V - T52; + io[WS(os, 63)] = T6b - T6c; + io[WS(os, 31)] = T6b + T6c; + T6d = T3v - T48; + T6g = T6e - T6f; + ro[WS(os, 63)] = T6d - T6g; + ro[WS(os, 31)] = T6d + T6g; + } + { + E T6l, T6s, T6B, T6C; + T6l = T6j + T6k; + T6s = T6o + T6r; + ro[WS(os, 39)] = T6l - T6s; + ro[WS(os, 7)] = T6l + T6s; + T6B = T6t + T6u; + T6C = T6y + T6z; + io[WS(os, 39)] = T6B - T6C; + io[WS(os, 7)] = T6B + T6C; + } + { + E T6v, T6w, T6x, T6A; + T6v = T6t - T6u; + T6w = T6r - T6o; + io[WS(os, 55)] = T6v - T6w; + io[WS(os, 23)] = T6v + T6w; + T6x = T6j - T6k; + T6A = T6y - T6z; + ro[WS(os, 55)] = T6x - T6A; + ro[WS(os, 23)] = T6x + T6A; + } + } + { + E T7L, T8X, T92, T9c, T95, T9d, T80, T98, T8k, T8S, T8L, T97, T8O, T8Y, T8D; + E T8T; + { + E T7D, T7K, T90, T91; + T7D = T7B - T7C; + T7K = T7G - T7J; + T7L = T7D - T7K; + T8X = T7D + T7K; + T90 = T84 + T8b; + T91 = T8f + T8i; + T92 = FMA(KP471396736, T90, KP881921264 * T91); + T9c = FNMS(KP471396736, T91, KP881921264 * T90); + } + { + E T93, T94, T7S, T7Z; + T93 = T8n + T8u; + T94 = T8y + T8B; + T95 = FNMS(KP471396736, T94, KP881921264 * T93); + T9d = FMA(KP881921264, T94, KP471396736 * T93); + T7S = FNMS(KP831469612, T7R, KP555570233 * T7O); + T7Z = FMA(KP831469612, T7V, KP555570233 * T7Y); + T80 = T7S - T7Z; + T98 = T7S + T7Z; + } + { + E T8c, T8j, T8H, T8K; + T8c = T84 - T8b; + T8j = T8f - T8i; + T8k = FMA(KP956940335, T8c, KP290284677 * T8j); + T8S = FNMS(KP956940335, T8j, KP290284677 * T8c); + T8H = T8F - T8G; + T8K = T8I - T8J; + T8L = T8H - T8K; + T97 = T8H + T8K; + } + { + E T8M, T8N, T8v, T8C; + T8M = FNMS(KP831469612, T7Y, KP555570233 * T7V); + T8N = FMA(KP555570233, T7R, KP831469612 * T7O); + T8O = T8M - T8N; + T8Y = T8N + T8M; + T8v = T8n - T8u; + T8C = T8y - T8B; + T8D = FNMS(KP956940335, T8C, KP290284677 * T8v); + T8T = FMA(KP290284677, T8C, KP956940335 * T8v); + } + { + E T81, T8E, T8V, T8W; + T81 = T7L + T80; + T8E = T8k + T8D; + ro[WS(os, 45)] = T81 - T8E; + ro[WS(os, 13)] = T81 + T8E; + T8V = T8L + T8O; + T8W = T8S + T8T; + io[WS(os, 45)] = T8V - T8W; + io[WS(os, 13)] = T8V + T8W; + } + { + E T8P, T8Q, T8R, T8U; + T8P = T8L - T8O; + T8Q = T8D - T8k; + io[WS(os, 61)] = T8P - T8Q; + io[WS(os, 29)] = T8P + T8Q; + T8R = T7L - T80; + T8U = T8S - T8T; + ro[WS(os, 61)] = T8R - T8U; + ro[WS(os, 29)] = T8R + T8U; + } + { + E T8Z, T96, T9f, T9g; + T8Z = T8X + T8Y; + T96 = T92 + T95; + ro[WS(os, 37)] = T8Z - T96; + ro[WS(os, 5)] = T8Z + T96; + T9f = T97 + T98; + T9g = T9c + T9d; + io[WS(os, 37)] = T9f - T9g; + io[WS(os, 5)] = T9f + T9g; + } + { + E T99, T9a, T9b, T9e; + T99 = T97 - T98; + T9a = T95 - T92; + io[WS(os, 53)] = T99 - T9a; + io[WS(os, 21)] = T99 + T9a; + T9b = T8X - T8Y; + T9e = T9c - T9d; + ro[WS(os, 53)] = T9b - T9e; + ro[WS(os, 21)] = T9b + T9e; + } + } + } + } +} + +static const kdft_desc desc = { 64, "n1_64", {808, 144, 104, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_64) (planner *p) { + X(kdft_register) (p, n1_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_7.c new file mode 100644 index 000000000..9145941ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_7.c @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 7 -name n1_7 -include dft/scalar/n.h */ + +/* + * This function contains 60 FP additions, 42 FP multiplications, + * (or, 18 additions, 0 multiplications, 42 fused multiply/add), + * 41 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_7(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + E T1, Tz, T4, TI, Ta, TG, T7, TH, Tb, Tp, TT, TO, TJ, Tu, Tg; + E TB, Tm, TC, Tj, TA, Tn, Ts, TQ, TL, TD, Tx; + T1 = ri[0]; + Tz = ii[0]; + { + E T2, T3, Te, Tf; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 6)]; + T4 = T2 + T3; + TI = T3 - T2; + { + E T8, T9, T5, T6; + T8 = ri[WS(is, 3)]; + T9 = ri[WS(is, 4)]; + Ta = T8 + T9; + TG = T9 - T8; + T5 = ri[WS(is, 2)]; + T6 = ri[WS(is, 5)]; + T7 = T5 + T6; + TH = T6 - T5; + } + Tb = FNMS(KP356895867, T7, T4); + Tp = FNMS(KP356895867, T4, Ta); + TT = FMA(KP554958132, TG, TI); + TO = FMA(KP554958132, TH, TG); + TJ = FNMS(KP554958132, TI, TH); + Tu = FNMS(KP356895867, Ta, T7); + Te = ii[WS(is, 2)]; + Tf = ii[WS(is, 5)]; + Tg = Te - Tf; + TB = Te + Tf; + { + E Tk, Tl, Th, Ti; + Tk = ii[WS(is, 3)]; + Tl = ii[WS(is, 4)]; + Tm = Tk - Tl; + TC = Tk + Tl; + Th = ii[WS(is, 1)]; + Ti = ii[WS(is, 6)]; + Tj = Th - Ti; + TA = Th + Ti; + } + Tn = FMA(KP554958132, Tm, Tj); + Ts = FMA(KP554958132, Tg, Tm); + TQ = FNMS(KP356895867, TB, TA); + TL = FNMS(KP356895867, TA, TC); + TD = FNMS(KP356895867, TC, TB); + Tx = FNMS(KP554958132, Tj, Tg); + } + ro[0] = T1 + T4 + T7 + Ta; + io[0] = Tz + TA + TB + TC; + { + E To, Td, Tc, TU, TS, TR; + To = FMA(KP801937735, Tn, Tg); + Tc = FNMS(KP692021471, Tb, Ta); + Td = FNMS(KP900968867, Tc, T1); + ro[WS(os, 6)] = FNMS(KP974927912, To, Td); + ro[WS(os, 1)] = FMA(KP974927912, To, Td); + TU = FMA(KP801937735, TT, TH); + TR = FNMS(KP692021471, TQ, TC); + TS = FNMS(KP900968867, TR, Tz); + io[WS(os, 1)] = FMA(KP974927912, TU, TS); + io[WS(os, 6)] = FNMS(KP974927912, TU, TS); + } + { + E Tt, Tr, Tq, TP, TN, TM; + Tt = FNMS(KP801937735, Ts, Tj); + Tq = FNMS(KP692021471, Tp, T7); + Tr = FNMS(KP900968867, Tq, T1); + ro[WS(os, 5)] = FNMS(KP974927912, Tt, Tr); + ro[WS(os, 2)] = FMA(KP974927912, Tt, Tr); + TP = FNMS(KP801937735, TO, TI); + TM = FNMS(KP692021471, TL, TB); + TN = FNMS(KP900968867, TM, Tz); + io[WS(os, 2)] = FMA(KP974927912, TP, TN); + io[WS(os, 5)] = FNMS(KP974927912, TP, TN); + } + { + E Ty, Tw, Tv, TK, TF, TE; + Ty = FNMS(KP801937735, Tx, Tm); + Tv = FNMS(KP692021471, Tu, T4); + Tw = FNMS(KP900968867, Tv, T1); + ro[WS(os, 4)] = FNMS(KP974927912, Ty, Tw); + ro[WS(os, 3)] = FMA(KP974927912, Ty, Tw); + TK = FNMS(KP801937735, TJ, TG); + TE = FNMS(KP692021471, TD, TA); + TF = FNMS(KP900968867, TE, Tz); + io[WS(os, 3)] = FMA(KP974927912, TK, TF); + io[WS(os, 4)] = FNMS(KP974927912, TK, TF); + } + } + } +} + +static const kdft_desc desc = { 7, "n1_7", {18, 0, 42, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_7) (planner *p) { + X(kdft_register) (p, n1_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 7 -name n1_7 -include dft/scalar/n.h */ + +/* + * This function contains 60 FP additions, 36 FP multiplications, + * (or, 36 additions, 12 multiplications, 24 fused multiply/add), + * 25 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_7(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + E T1, Tu, T4, Tq, Te, Tx, T7, Ts, Tk, Tv, Ta, Tr, Th, Tw; + T1 = ri[0]; + Tu = ii[0]; + { + E T2, T3, Tc, Td; + T2 = ri[WS(is, 1)]; + T3 = ri[WS(is, 6)]; + T4 = T2 + T3; + Tq = T3 - T2; + Tc = ii[WS(is, 1)]; + Td = ii[WS(is, 6)]; + Te = Tc - Td; + Tx = Tc + Td; + } + { + E T5, T6, Ti, Tj; + T5 = ri[WS(is, 2)]; + T6 = ri[WS(is, 5)]; + T7 = T5 + T6; + Ts = T6 - T5; + Ti = ii[WS(is, 2)]; + Tj = ii[WS(is, 5)]; + Tk = Ti - Tj; + Tv = Ti + Tj; + } + { + E T8, T9, Tf, Tg; + T8 = ri[WS(is, 3)]; + T9 = ri[WS(is, 4)]; + Ta = T8 + T9; + Tr = T9 - T8; + Tf = ii[WS(is, 3)]; + Tg = ii[WS(is, 4)]; + Th = Tf - Tg; + Tw = Tf + Tg; + } + ro[0] = T1 + T4 + T7 + Ta; + io[0] = Tu + Tx + Tv + Tw; + { + E Tl, Tb, TB, TC; + Tl = FNMS(KP781831482, Th, KP974927912 * Te) - (KP433883739 * Tk); + Tb = FMA(KP623489801, Ta, T1) + FNMA(KP900968867, T7, KP222520933 * T4); + ro[WS(os, 5)] = Tb - Tl; + ro[WS(os, 2)] = Tb + Tl; + TB = FNMS(KP781831482, Tr, KP974927912 * Tq) - (KP433883739 * Ts); + TC = FMA(KP623489801, Tw, Tu) + FNMA(KP900968867, Tv, KP222520933 * Tx); + io[WS(os, 2)] = TB + TC; + io[WS(os, 5)] = TC - TB; + } + { + E Tn, Tm, Tz, TA; + Tn = FMA(KP781831482, Te, KP974927912 * Tk) + (KP433883739 * Th); + Tm = FMA(KP623489801, T4, T1) + FNMA(KP900968867, Ta, KP222520933 * T7); + ro[WS(os, 6)] = Tm - Tn; + ro[WS(os, 1)] = Tm + Tn; + Tz = FMA(KP781831482, Tq, KP974927912 * Ts) + (KP433883739 * Tr); + TA = FMA(KP623489801, Tx, Tu) + FNMA(KP900968867, Tw, KP222520933 * Tv); + io[WS(os, 1)] = Tz + TA; + io[WS(os, 6)] = TA - Tz; + } + { + E Tp, To, Tt, Ty; + Tp = FMA(KP433883739, Te, KP974927912 * Th) - (KP781831482 * Tk); + To = FMA(KP623489801, T7, T1) + FNMA(KP222520933, Ta, KP900968867 * T4); + ro[WS(os, 4)] = To - Tp; + ro[WS(os, 3)] = To + Tp; + Tt = FMA(KP433883739, Tq, KP974927912 * Tr) - (KP781831482 * Ts); + Ty = FMA(KP623489801, Tv, Tu) + FNMA(KP222520933, Tw, KP900968867 * Tx); + io[WS(os, 3)] = Tt + Ty; + io[WS(os, 4)] = Ty - Tt; + } + } + } +} + +static const kdft_desc desc = { 7, "n1_7", {36, 12, 24, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_7) (planner *p) { + X(kdft_register) (p, n1_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_8.c new file mode 100644 index 000000000..7d4a3c99e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_8.c @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -name n1_8 -include dft/scalar/n.h */ + +/* + * This function contains 52 FP additions, 8 FP multiplications, + * (or, 44 additions, 0 multiplications, 8 fused multiply/add), + * 28 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + E T3, Tn, Ti, TC, T6, TB, Tl, To, Td, TN, Tz, TH, Ta, TM, Tu; + E TG; + { + E T1, T2, Tj, Tk; + T1 = ri[0]; + T2 = ri[WS(is, 4)]; + T3 = T1 + T2; + Tn = T1 - T2; + { + E Tg, Th, T4, T5; + Tg = ii[0]; + Th = ii[WS(is, 4)]; + Ti = Tg + Th; + TC = Tg - Th; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 6)]; + T6 = T4 + T5; + TB = T4 - T5; + } + Tj = ii[WS(is, 2)]; + Tk = ii[WS(is, 6)]; + Tl = Tj + Tk; + To = Tj - Tk; + { + E Tb, Tc, Tv, Tw, Tx, Ty; + Tb = ri[WS(is, 7)]; + Tc = ri[WS(is, 3)]; + Tv = Tb - Tc; + Tw = ii[WS(is, 7)]; + Tx = ii[WS(is, 3)]; + Ty = Tw - Tx; + Td = Tb + Tc; + TN = Tw + Tx; + Tz = Tv - Ty; + TH = Tv + Ty; + } + { + E T8, T9, Tq, Tr, Ts, Tt; + T8 = ri[WS(is, 1)]; + T9 = ri[WS(is, 5)]; + Tq = T8 - T9; + Tr = ii[WS(is, 1)]; + Ts = ii[WS(is, 5)]; + Tt = Tr - Ts; + Ta = T8 + T9; + TM = Tr + Ts; + Tu = Tq + Tt; + TG = Tt - Tq; + } + } + { + E T7, Te, TP, TQ; + T7 = T3 + T6; + Te = Ta + Td; + ro[WS(os, 4)] = T7 - Te; + ro[0] = T7 + Te; + TP = Ti + Tl; + TQ = TM + TN; + io[WS(os, 4)] = TP - TQ; + io[0] = TP + TQ; + } + { + E Tf, Tm, TL, TO; + Tf = Td - Ta; + Tm = Ti - Tl; + io[WS(os, 2)] = Tf + Tm; + io[WS(os, 6)] = Tm - Tf; + TL = T3 - T6; + TO = TM - TN; + ro[WS(os, 6)] = TL - TO; + ro[WS(os, 2)] = TL + TO; + } + { + E Tp, TA, TJ, TK; + Tp = Tn + To; + TA = Tu + Tz; + ro[WS(os, 5)] = FNMS(KP707106781, TA, Tp); + ro[WS(os, 1)] = FMA(KP707106781, TA, Tp); + TJ = TC - TB; + TK = TG + TH; + io[WS(os, 5)] = FNMS(KP707106781, TK, TJ); + io[WS(os, 1)] = FMA(KP707106781, TK, TJ); + } + { + E TD, TE, TF, TI; + TD = TB + TC; + TE = Tz - Tu; + io[WS(os, 7)] = FNMS(KP707106781, TE, TD); + io[WS(os, 3)] = FMA(KP707106781, TE, TD); + TF = Tn - To; + TI = TG - TH; + ro[WS(os, 7)] = FNMS(KP707106781, TI, TF); + ro[WS(os, 3)] = FMA(KP707106781, TI, TF); + } + } + } +} + +static const kdft_desc desc = { 8, "n1_8", {44, 0, 8, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_8) (planner *p) { + X(kdft_register) (p, n1_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 8 -name n1_8 -include dft/scalar/n.h */ + +/* + * This function contains 52 FP additions, 4 FP multiplications, + * (or, 52 additions, 4 multiplications, 0 fused multiply/add), + * 28 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + E T3, Tn, Ti, TC, T6, TB, Tl, To, Td, TN, Tz, TH, Ta, TM, Tu; + E TG; + { + E T1, T2, Tj, Tk; + T1 = ri[0]; + T2 = ri[WS(is, 4)]; + T3 = T1 + T2; + Tn = T1 - T2; + { + E Tg, Th, T4, T5; + Tg = ii[0]; + Th = ii[WS(is, 4)]; + Ti = Tg + Th; + TC = Tg - Th; + T4 = ri[WS(is, 2)]; + T5 = ri[WS(is, 6)]; + T6 = T4 + T5; + TB = T4 - T5; + } + Tj = ii[WS(is, 2)]; + Tk = ii[WS(is, 6)]; + Tl = Tj + Tk; + To = Tj - Tk; + { + E Tb, Tc, Tv, Tw, Tx, Ty; + Tb = ri[WS(is, 7)]; + Tc = ri[WS(is, 3)]; + Tv = Tb - Tc; + Tw = ii[WS(is, 7)]; + Tx = ii[WS(is, 3)]; + Ty = Tw - Tx; + Td = Tb + Tc; + TN = Tw + Tx; + Tz = Tv - Ty; + TH = Tv + Ty; + } + { + E T8, T9, Tq, Tr, Ts, Tt; + T8 = ri[WS(is, 1)]; + T9 = ri[WS(is, 5)]; + Tq = T8 - T9; + Tr = ii[WS(is, 1)]; + Ts = ii[WS(is, 5)]; + Tt = Tr - Ts; + Ta = T8 + T9; + TM = Tr + Ts; + Tu = Tq + Tt; + TG = Tt - Tq; + } + } + { + E T7, Te, TP, TQ; + T7 = T3 + T6; + Te = Ta + Td; + ro[WS(os, 4)] = T7 - Te; + ro[0] = T7 + Te; + TP = Ti + Tl; + TQ = TM + TN; + io[WS(os, 4)] = TP - TQ; + io[0] = TP + TQ; + } + { + E Tf, Tm, TL, TO; + Tf = Td - Ta; + Tm = Ti - Tl; + io[WS(os, 2)] = Tf + Tm; + io[WS(os, 6)] = Tm - Tf; + TL = T3 - T6; + TO = TM - TN; + ro[WS(os, 6)] = TL - TO; + ro[WS(os, 2)] = TL + TO; + } + { + E Tp, TA, TJ, TK; + Tp = Tn + To; + TA = KP707106781 * (Tu + Tz); + ro[WS(os, 5)] = Tp - TA; + ro[WS(os, 1)] = Tp + TA; + TJ = TC - TB; + TK = KP707106781 * (TG + TH); + io[WS(os, 5)] = TJ - TK; + io[WS(os, 1)] = TJ + TK; + } + { + E TD, TE, TF, TI; + TD = TB + TC; + TE = KP707106781 * (Tz - Tu); + io[WS(os, 7)] = TD - TE; + io[WS(os, 3)] = TD + TE; + TF = Tn - To; + TI = KP707106781 * (TG - TH); + ro[WS(os, 7)] = TF - TI; + ro[WS(os, 3)] = TF + TI; + } + } + } +} + +static const kdft_desc desc = { 8, "n1_8", {52, 4, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_8) (planner *p) { + X(kdft_register) (p, n1_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_9.c new file mode 100644 index 000000000..05f9703f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/n1_9.c @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -compact -variables 4 -pipeline-latency 4 -n 9 -name n1_9 -include dft/scalar/n.h */ + +/* + * This function contains 80 FP additions, 56 FP multiplications, + * (or, 24 additions, 0 multiplications, 56 fused multiply/add), + * 41 stack variables, 10 constants, and 36 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_9(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP954188894, +0.954188894138671133499268364187245676532219158); + DK(KP363970234, +0.363970234266202361351047882776834043890471784); + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP492403876, +0.492403876506104029683371512294761506835321626); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP777861913, +0.777861913430206160028177977318626690410586096); + DK(KP839099631, +0.839099631177280011763127298123181364687434283); + DK(KP176326980, +0.176326980708464973471090386868618986121633062); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(36, is), MAKE_VOLATILE_STRIDE(36, os)) { + E T5, TL, Tm, Tl, T1f, TM, Ta, T1c, TF, TW, TI, TX, Tf, T1d, Ts; + E TZ, Tx, T10; + { + E T1, T2, T3, T4; + T1 = ri[0]; + T2 = ri[WS(is, 3)]; + T3 = ri[WS(is, 6)]; + T4 = T2 + T3; + T5 = T1 + T4; + TL = FNMS(KP500000000, T4, T1); + Tm = T3 - T2; + } + { + E Th, Ti, Tj, Tk; + Th = ii[0]; + Ti = ii[WS(is, 3)]; + Tj = ii[WS(is, 6)]; + Tk = Ti + Tj; + Tl = FNMS(KP500000000, Tk, Th); + T1f = Th + Tk; + TM = Ti - Tj; + } + { + E T6, Tz, T9, TE, TC, TH, TD, TG; + T6 = ri[WS(is, 1)]; + Tz = ii[WS(is, 1)]; + { + E T7, T8, TA, TB; + T7 = ri[WS(is, 4)]; + T8 = ri[WS(is, 7)]; + T9 = T7 + T8; + TE = T7 - T8; + TA = ii[WS(is, 4)]; + TB = ii[WS(is, 7)]; + TC = TA + TB; + TH = TB - TA; + } + Ta = T6 + T9; + T1c = Tz + TC; + TD = FNMS(KP500000000, TC, Tz); + TF = FNMS(KP866025403, TE, TD); + TW = FMA(KP866025403, TE, TD); + TG = FNMS(KP500000000, T9, T6); + TI = FNMS(KP866025403, TH, TG); + TX = FMA(KP866025403, TH, TG); + } + { + E Tb, Tt, Te, Tw, Tr, Tu, To, Tv; + Tb = ri[WS(is, 2)]; + Tt = ii[WS(is, 2)]; + { + E Tc, Td, Tp, Tq; + Tc = ri[WS(is, 5)]; + Td = ri[WS(is, 8)]; + Te = Tc + Td; + Tw = Td - Tc; + Tp = ii[WS(is, 5)]; + Tq = ii[WS(is, 8)]; + Tr = Tp - Tq; + Tu = Tp + Tq; + } + Tf = Tb + Te; + T1d = Tt + Tu; + To = FNMS(KP500000000, Te, Tb); + Ts = FMA(KP866025403, Tr, To); + TZ = FNMS(KP866025403, Tr, To); + Tv = FNMS(KP500000000, Tu, Tt); + Tx = FMA(KP866025403, Tw, Tv); + T10 = FNMS(KP866025403, Tw, Tv); + } + { + E T1e, Tg, T1b, T1i, T1g, T1h; + T1e = T1c - T1d; + Tg = Ta + Tf; + T1b = FNMS(KP500000000, Tg, T5); + ro[0] = T5 + Tg; + ro[WS(os, 3)] = FMA(KP866025403, T1e, T1b); + ro[WS(os, 6)] = FNMS(KP866025403, T1e, T1b); + T1i = Tf - Ta; + T1g = T1c + T1d; + T1h = FNMS(KP500000000, T1g, T1f); + io[WS(os, 3)] = FMA(KP866025403, T1i, T1h); + io[0] = T1f + T1g; + io[WS(os, 6)] = FNMS(KP866025403, T1i, T1h); + } + { + E Tn, TN, TK, TS, TQ, TU, TR, TT; + Tn = FMA(KP866025403, Tm, Tl); + TN = FMA(KP866025403, TM, TL); + { + E Ty, TJ, TO, TP; + Ty = FNMS(KP176326980, Tx, Ts); + TJ = FNMS(KP839099631, TI, TF); + TK = FNMS(KP777861913, TJ, Ty); + TS = FMA(KP777861913, TJ, Ty); + TO = FMA(KP176326980, Ts, Tx); + TP = FMA(KP839099631, TF, TI); + TQ = FMA(KP777861913, TP, TO); + TU = FNMS(KP777861913, TP, TO); + } + io[WS(os, 1)] = FNMS(KP984807753, TK, Tn); + ro[WS(os, 1)] = FMA(KP984807753, TQ, TN); + TR = FNMS(KP492403876, TQ, TN); + ro[WS(os, 4)] = FMA(KP852868531, TS, TR); + ro[WS(os, 7)] = FNMS(KP852868531, TS, TR); + TT = FMA(KP492403876, TK, Tn); + io[WS(os, 7)] = FNMS(KP852868531, TU, TT); + io[WS(os, 4)] = FMA(KP852868531, TU, TT); + } + { + E TV, T17, T12, T1a, T16, T18, T13, T19; + TV = FNMS(KP866025403, TM, TL); + T17 = FNMS(KP866025403, Tm, Tl); + { + E TY, T11, T14, T15; + TY = FMA(KP176326980, TX, TW); + T11 = FNMS(KP363970234, T10, TZ); + T12 = FNMS(KP954188894, T11, TY); + T1a = FMA(KP954188894, T11, TY); + T14 = FNMS(KP176326980, TW, TX); + T15 = FMA(KP363970234, TZ, T10); + T16 = FNMS(KP954188894, T15, T14); + T18 = FMA(KP954188894, T15, T14); + } + ro[WS(os, 2)] = FMA(KP984807753, T12, TV); + io[WS(os, 2)] = FNMS(KP984807753, T18, T17); + T13 = FNMS(KP492403876, T12, TV); + ro[WS(os, 5)] = FNMS(KP852868531, T16, T13); + ro[WS(os, 8)] = FMA(KP852868531, T16, T13); + T19 = FMA(KP492403876, T18, T17); + io[WS(os, 5)] = FNMS(KP852868531, T1a, T19); + io[WS(os, 8)] = FMA(KP852868531, T1a, T19); + } + } + } +} + +static const kdft_desc desc = { 9, "n1_9", {24, 0, 56, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_9) (planner *p) { + X(kdft_register) (p, n1_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -compact -variables 4 -pipeline-latency 4 -n 9 -name n1_9 -include dft/scalar/n.h */ + +/* + * This function contains 80 FP additions, 40 FP multiplications, + * (or, 60 additions, 20 multiplications, 20 fused multiply/add), + * 39 stack variables, 8 constants, and 36 memory accesses + */ +#include "dft/scalar/n.h" + +static void n1_9(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP342020143, +0.342020143325668733044099614682259580763083368); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, ri = ri + ivs, ii = ii + ivs, ro = ro + ovs, io = io + ovs, MAKE_VOLATILE_STRIDE(36, is), MAKE_VOLATILE_STRIDE(36, os)) { + E T5, TO, Th, Tk, T1g, TR, Ta, T1c, Tq, TW, Tv, TX, Tf, T1d, TB; + E T10, TG, TZ; + { + E T1, T2, T3, T4; + T1 = ri[0]; + T2 = ri[WS(is, 3)]; + T3 = ri[WS(is, 6)]; + T4 = T2 + T3; + T5 = T1 + T4; + TO = KP866025403 * (T3 - T2); + Th = FNMS(KP500000000, T4, T1); + } + { + E TP, Ti, Tj, TQ; + TP = ii[0]; + Ti = ii[WS(is, 3)]; + Tj = ii[WS(is, 6)]; + TQ = Ti + Tj; + Tk = KP866025403 * (Ti - Tj); + T1g = TP + TQ; + TR = FNMS(KP500000000, TQ, TP); + } + { + E T6, Ts, T9, Tr, Tp, Tt, Tm, Tu; + T6 = ri[WS(is, 1)]; + Ts = ii[WS(is, 1)]; + { + E T7, T8, Tn, To; + T7 = ri[WS(is, 4)]; + T8 = ri[WS(is, 7)]; + T9 = T7 + T8; + Tr = KP866025403 * (T8 - T7); + Tn = ii[WS(is, 4)]; + To = ii[WS(is, 7)]; + Tp = KP866025403 * (Tn - To); + Tt = Tn + To; + } + Ta = T6 + T9; + T1c = Ts + Tt; + Tm = FNMS(KP500000000, T9, T6); + Tq = Tm + Tp; + TW = Tm - Tp; + Tu = FNMS(KP500000000, Tt, Ts); + Tv = Tr + Tu; + TX = Tu - Tr; + } + { + E Tb, TD, Te, TC, TA, TE, Tx, TF; + Tb = ri[WS(is, 2)]; + TD = ii[WS(is, 2)]; + { + E Tc, Td, Ty, Tz; + Tc = ri[WS(is, 5)]; + Td = ri[WS(is, 8)]; + Te = Tc + Td; + TC = KP866025403 * (Td - Tc); + Ty = ii[WS(is, 5)]; + Tz = ii[WS(is, 8)]; + TA = KP866025403 * (Ty - Tz); + TE = Ty + Tz; + } + Tf = Tb + Te; + T1d = TD + TE; + Tx = FNMS(KP500000000, Te, Tb); + TB = Tx + TA; + T10 = Tx - TA; + TF = FNMS(KP500000000, TE, TD); + TG = TC + TF; + TZ = TF - TC; + } + { + E T1e, Tg, T1b, T1f, T1h, T1i; + T1e = KP866025403 * (T1c - T1d); + Tg = Ta + Tf; + T1b = FNMS(KP500000000, Tg, T5); + ro[0] = T5 + Tg; + ro[WS(os, 3)] = T1b + T1e; + ro[WS(os, 6)] = T1b - T1e; + T1f = KP866025403 * (Tf - Ta); + T1h = T1c + T1d; + T1i = FNMS(KP500000000, T1h, T1g); + io[WS(os, 3)] = T1f + T1i; + io[0] = T1g + T1h; + io[WS(os, 6)] = T1i - T1f; + } + { + E Tl, TS, TI, TN, TM, TT, TJ, TU; + Tl = Th + Tk; + TS = TO + TR; + { + E Tw, TH, TK, TL; + Tw = FMA(KP766044443, Tq, KP642787609 * Tv); + TH = FMA(KP173648177, TB, KP984807753 * TG); + TI = Tw + TH; + TN = KP866025403 * (TH - Tw); + TK = FNMS(KP642787609, Tq, KP766044443 * Tv); + TL = FNMS(KP984807753, TB, KP173648177 * TG); + TM = KP866025403 * (TK - TL); + TT = TK + TL; + } + ro[WS(os, 1)] = Tl + TI; + io[WS(os, 1)] = TS + TT; + TJ = FNMS(KP500000000, TI, Tl); + ro[WS(os, 7)] = TJ - TM; + ro[WS(os, 4)] = TJ + TM; + TU = FNMS(KP500000000, TT, TS); + io[WS(os, 4)] = TN + TU; + io[WS(os, 7)] = TU - TN; + } + { + E TV, T14, T12, T13, T17, T1a, T18, T19; + TV = Th - Tk; + T14 = TR - TO; + { + E TY, T11, T15, T16; + TY = FMA(KP173648177, TW, KP984807753 * TX); + T11 = FNMS(KP939692620, T10, KP342020143 * TZ); + T12 = TY + T11; + T13 = KP866025403 * (T11 - TY); + T15 = FNMS(KP984807753, TW, KP173648177 * TX); + T16 = FMA(KP342020143, T10, KP939692620 * TZ); + T17 = T15 - T16; + T1a = KP866025403 * (T15 + T16); + } + ro[WS(os, 2)] = TV + T12; + io[WS(os, 2)] = T14 + T17; + T18 = FNMS(KP500000000, T17, T14); + io[WS(os, 5)] = T13 + T18; + io[WS(os, 8)] = T18 - T13; + T19 = FNMS(KP500000000, T12, TV); + ro[WS(os, 8)] = T19 - T1a; + ro[WS(os, 5)] = T19 + T1a; + } + } + } +} + +static const kdft_desc desc = { 9, "n1_9", {60, 20, 20, 0}, &GENUS, 0, 0, 0, 0 }; + +void X(codelet_n1_9) (planner *p) { + X(kdft_register) (p, n1_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_2.c new file mode 100644 index 000000000..77348777d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_2.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:29 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq.native -fma -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 2 -name q1_2 -include dft/scalar/q.h */ + +/* + * This function contains 12 FP additions, 8 FP multiplications, + * (or, 8 additions, 4 multiplications, 4 fused multiply/add), + * 17 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_2(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 2); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T1, T2, T4, T7, T8, T9, Tb, Tc, Te, Th, Ti, Tj; + T1 = rio[0]; + T2 = rio[WS(rs, 1)]; + T4 = T1 - T2; + T7 = iio[0]; + T8 = iio[WS(rs, 1)]; + T9 = T7 - T8; + Tb = rio[WS(vs, 1)]; + Tc = rio[WS(vs, 1) + WS(rs, 1)]; + Te = Tb - Tc; + Th = iio[WS(vs, 1)]; + Ti = iio[WS(vs, 1) + WS(rs, 1)]; + Tj = Th - Ti; + rio[0] = T1 + T2; + iio[0] = T7 + T8; + rio[WS(rs, 1)] = Tb + Tc; + iio[WS(rs, 1)] = Th + Ti; + { + E Tf, Tk, Td, Tg; + Td = W[0]; + Tf = Td * Te; + Tk = Td * Tj; + Tg = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(Tg, Tj, Tf); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(Tg, Te, Tk); + } + { + E T5, Ta, T3, T6; + T3 = W[0]; + T5 = T3 * T4; + Ta = T3 * T9; + T6 = W[1]; + rio[WS(vs, 1)] = FMA(T6, T9, T5); + iio[WS(vs, 1)] = FNMS(T6, T4, Ta); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 2}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 2, "q1_2", twinstr, &GENUS, {8, 4, 4, 0}, 0, 0, 0 }; + +void X(codelet_q1_2) (planner *p) { + X(kdft_difsq_register) (p, q1_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq.native -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 2 -name q1_2 -include dft/scalar/q.h */ + +/* + * This function contains 12 FP additions, 8 FP multiplications, + * (or, 8 additions, 4 multiplications, 4 fused multiply/add), + * 17 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_2(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 2); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T1, T2, T4, T6, T7, T8, T9, Ta, Tc, Te, Tf, Tg; + T1 = rio[0]; + T2 = rio[WS(rs, 1)]; + T4 = T1 - T2; + T6 = iio[0]; + T7 = iio[WS(rs, 1)]; + T8 = T6 - T7; + T9 = rio[WS(vs, 1)]; + Ta = rio[WS(vs, 1) + WS(rs, 1)]; + Tc = T9 - Ta; + Te = iio[WS(vs, 1)]; + Tf = iio[WS(vs, 1) + WS(rs, 1)]; + Tg = Te - Tf; + rio[0] = T1 + T2; + iio[0] = T6 + T7; + rio[WS(rs, 1)] = T9 + Ta; + iio[WS(rs, 1)] = Te + Tf; + { + E Tb, Td, T3, T5; + Tb = W[0]; + Td = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(Tb, Tc, Td * Tg); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(Td, Tc, Tb * Tg); + T3 = W[0]; + T5 = W[1]; + rio[WS(vs, 1)] = FMA(T3, T4, T5 * T8); + iio[WS(vs, 1)] = FNMS(T5, T4, T3 * T8); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 2}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 2, "q1_2", twinstr, &GENUS, {8, 4, 4, 0}, 0, 0, 0 }; + +void X(codelet_q1_2) (planner *p) { + X(kdft_difsq_register) (p, q1_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_3.c new file mode 100644 index 000000000..3d2fb5fa0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_3.c @@ -0,0 +1,316 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:30 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq.native -fma -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 3 -name q1_3 -include dft/scalar/q.h */ + +/* + * This function contains 48 FP additions, 42 FP multiplications, + * (or, 18 additions, 12 multiplications, 30 fused multiply/add), + * 35 stack variables, 2 constants, and 36 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_3(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T1, T4, T6, Tg, Td, Te, T9, Tf, Tp, Ts, Tu, TE, TB, TC, Tx; + E TD, TZ, T10, TV, T11, TN, TQ, TS, T12; + { + E T2, T3, Tv, Tw; + T1 = rio[0]; + T2 = rio[WS(rs, 1)]; + T3 = rio[WS(rs, 2)]; + T4 = T2 + T3; + T6 = FNMS(KP500000000, T4, T1); + Tg = T3 - T2; + { + E T7, T8, Tq, Tr; + Td = iio[0]; + T7 = iio[WS(rs, 1)]; + T8 = iio[WS(rs, 2)]; + Te = T7 + T8; + T9 = T7 - T8; + Tf = FNMS(KP500000000, Te, Td); + Tp = rio[WS(vs, 1)]; + Tq = rio[WS(vs, 1) + WS(rs, 1)]; + Tr = rio[WS(vs, 1) + WS(rs, 2)]; + Ts = Tq + Tr; + Tu = FNMS(KP500000000, Ts, Tp); + TE = Tr - Tq; + } + TB = iio[WS(vs, 1)]; + Tv = iio[WS(vs, 1) + WS(rs, 1)]; + Tw = iio[WS(vs, 1) + WS(rs, 2)]; + TC = Tv + Tw; + Tx = Tv - Tw; + TD = FNMS(KP500000000, TC, TB); + { + E TT, TU, TO, TP; + TZ = iio[WS(vs, 2)]; + TT = iio[WS(vs, 2) + WS(rs, 1)]; + TU = iio[WS(vs, 2) + WS(rs, 2)]; + T10 = TT + TU; + TV = TT - TU; + T11 = FNMS(KP500000000, T10, TZ); + TN = rio[WS(vs, 2)]; + TO = rio[WS(vs, 2) + WS(rs, 1)]; + TP = rio[WS(vs, 2) + WS(rs, 2)]; + TQ = TO + TP; + TS = FNMS(KP500000000, TQ, TN); + T12 = TP - TO; + } + } + rio[0] = T1 + T4; + iio[0] = Td + Te; + rio[WS(rs, 1)] = Tp + Ts; + iio[WS(rs, 1)] = TB + TC; + iio[WS(rs, 2)] = TZ + T10; + rio[WS(rs, 2)] = TN + TQ; + { + E Ta, Th, Tb, Ti, T5, Tc; + Ta = FMA(KP866025403, T9, T6); + Th = FMA(KP866025403, Tg, Tf); + T5 = W[0]; + Tb = T5 * Ta; + Ti = T5 * Th; + Tc = W[1]; + rio[WS(vs, 1)] = FMA(Tc, Th, Tb); + iio[WS(vs, 1)] = FNMS(Tc, Ta, Ti); + } + { + E T16, T19, T17, T1a, T15, T18; + T16 = FNMS(KP866025403, TV, TS); + T19 = FNMS(KP866025403, T12, T11); + T15 = W[2]; + T17 = T15 * T16; + T1a = T15 * T19; + T18 = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T18, T19, T17); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T18, T16, T1a); + } + { + E TI, TL, TJ, TM, TH, TK; + TI = FNMS(KP866025403, Tx, Tu); + TL = FNMS(KP866025403, TE, TD); + TH = W[2]; + TJ = TH * TI; + TM = TH * TL; + TK = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(TK, TL, TJ); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(TK, TI, TM); + } + { + E Ty, TF, Tz, TG, Tt, TA; + Ty = FMA(KP866025403, Tx, Tu); + TF = FMA(KP866025403, TE, TD); + Tt = W[0]; + Tz = Tt * Ty; + TG = Tt * TF; + TA = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(TA, TF, Tz); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(TA, Ty, TG); + } + { + E TW, T13, TX, T14, TR, TY; + TW = FMA(KP866025403, TV, TS); + T13 = FMA(KP866025403, T12, T11); + TR = W[0]; + TX = TR * TW; + T14 = TR * T13; + TY = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(TY, T13, TX); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(TY, TW, T14); + } + { + E Tk, Tn, Tl, To, Tj, Tm; + Tk = FNMS(KP866025403, T9, T6); + Tn = FNMS(KP866025403, Tg, Tf); + Tj = W[2]; + Tl = Tj * Tk; + To = Tj * Tn; + Tm = W[3]; + rio[WS(vs, 2)] = FMA(Tm, Tn, Tl); + iio[WS(vs, 2)] = FNMS(Tm, Tk, To); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 3, "q1_3", twinstr, &GENUS, {18, 12, 30, 0}, 0, 0, 0 }; + +void X(codelet_q1_3) (planner *p) { + X(kdft_difsq_register) (p, q1_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq.native -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 3 -name q1_3 -include dft/scalar/q.h */ + +/* + * This function contains 48 FP additions, 36 FP multiplications, + * (or, 30 additions, 18 multiplications, 18 fused multiply/add), + * 35 stack variables, 2 constants, and 36 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_3(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T1, T4, T6, Tc, Td, Te, T9, Tf, Tl, To, Tq, Tw, Tx, Ty, Tt; + E Tz, TR, TS, TN, TT, TF, TI, TK, TQ; + { + E T2, T3, Tr, Ts; + T1 = rio[0]; + T2 = rio[WS(rs, 1)]; + T3 = rio[WS(rs, 2)]; + T4 = T2 + T3; + T6 = FNMS(KP500000000, T4, T1); + Tc = KP866025403 * (T3 - T2); + { + E T7, T8, Tm, Tn; + Td = iio[0]; + T7 = iio[WS(rs, 1)]; + T8 = iio[WS(rs, 2)]; + Te = T7 + T8; + T9 = KP866025403 * (T7 - T8); + Tf = FNMS(KP500000000, Te, Td); + Tl = rio[WS(vs, 1)]; + Tm = rio[WS(vs, 1) + WS(rs, 1)]; + Tn = rio[WS(vs, 1) + WS(rs, 2)]; + To = Tm + Tn; + Tq = FNMS(KP500000000, To, Tl); + Tw = KP866025403 * (Tn - Tm); + } + Tx = iio[WS(vs, 1)]; + Tr = iio[WS(vs, 1) + WS(rs, 1)]; + Ts = iio[WS(vs, 1) + WS(rs, 2)]; + Ty = Tr + Ts; + Tt = KP866025403 * (Tr - Ts); + Tz = FNMS(KP500000000, Ty, Tx); + { + E TL, TM, TG, TH; + TR = iio[WS(vs, 2)]; + TL = iio[WS(vs, 2) + WS(rs, 1)]; + TM = iio[WS(vs, 2) + WS(rs, 2)]; + TS = TL + TM; + TN = KP866025403 * (TL - TM); + TT = FNMS(KP500000000, TS, TR); + TF = rio[WS(vs, 2)]; + TG = rio[WS(vs, 2) + WS(rs, 1)]; + TH = rio[WS(vs, 2) + WS(rs, 2)]; + TI = TG + TH; + TK = FNMS(KP500000000, TI, TF); + TQ = KP866025403 * (TH - TG); + } + } + rio[0] = T1 + T4; + iio[0] = Td + Te; + rio[WS(rs, 1)] = Tl + To; + iio[WS(rs, 1)] = Tx + Ty; + iio[WS(rs, 2)] = TR + TS; + rio[WS(rs, 2)] = TF + TI; + { + E Ta, Tg, T5, Tb; + Ta = T6 + T9; + Tg = Tc + Tf; + T5 = W[0]; + Tb = W[1]; + rio[WS(vs, 1)] = FMA(T5, Ta, Tb * Tg); + iio[WS(vs, 1)] = FNMS(Tb, Ta, T5 * Tg); + } + { + E TW, TY, TV, TX; + TW = TK - TN; + TY = TT - TQ; + TV = W[2]; + TX = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(TV, TW, TX * TY); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(TX, TW, TV * TY); + } + { + E TC, TE, TB, TD; + TC = Tq - Tt; + TE = Tz - Tw; + TB = W[2]; + TD = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(TB, TC, TD * TE); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(TD, TC, TB * TE); + } + { + E Tu, TA, Tp, Tv; + Tu = Tq + Tt; + TA = Tw + Tz; + Tp = W[0]; + Tv = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(Tp, Tu, Tv * TA); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(Tv, Tu, Tp * TA); + } + { + E TO, TU, TJ, TP; + TO = TK + TN; + TU = TQ + TT; + TJ = W[0]; + TP = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(TJ, TO, TP * TU); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(TP, TO, TJ * TU); + } + { + E Ti, Tk, Th, Tj; + Ti = T6 - T9; + Tk = Tf - Tc; + Th = W[2]; + Tj = W[3]; + rio[WS(vs, 2)] = FMA(Th, Ti, Tj * Tk); + iio[WS(vs, 2)] = FNMS(Tj, Ti, Th * Tk); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 3, "q1_3", twinstr, &GENUS, {30, 18, 18, 0}, 0, 0, 0 }; + +void X(codelet_q1_3) (planner *p) { + X(kdft_difsq_register) (p, q1_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_4.c new file mode 100644 index 000000000..a7cfbe83f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_4.c @@ -0,0 +1,524 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:29 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq.native -fma -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 4 -name q1_4 -include dft/scalar/q.h */ + +/* + * This function contains 88 FP additions, 48 FP multiplications, + * (or, 64 additions, 24 multiplications, 24 fused multiply/add), + * 51 stack variables, 0 constants, and 64 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_4(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T3, Tv, Tw, T6, Tc, Tf, Tx, Ts, Tm, Ti, T1H, T29, T2a, T1K, T1Q; + E T1T, T2b, T26, T20, T1W, TB, T13, T14, TE, TK, TN, T15, T10, TU, TQ; + E T19, T1B, T1C, T1c, T1i, T1l, T1D, T1y, T1s, T1o; + { + E T1, T2, Tb, Tg, Th, T8; + { + E T9, Ta, T4, T5; + T1 = rio[0]; + T2 = rio[WS(rs, 2)]; + T3 = T1 + T2; + T9 = iio[0]; + Ta = iio[WS(rs, 2)]; + Tb = T9 - Ta; + Tv = T9 + Ta; + Tg = iio[WS(rs, 1)]; + Th = iio[WS(rs, 3)]; + Tw = Tg + Th; + T4 = rio[WS(rs, 1)]; + T5 = rio[WS(rs, 3)]; + T6 = T4 + T5; + T8 = T4 - T5; + } + Tc = T8 + Tb; + Tf = T1 - T2; + Tx = Tv - Tw; + Ts = T3 - T6; + Tm = Tb - T8; + Ti = Tg - Th; + } + { + E T1F, T1G, T1P, T1U, T1V, T1M; + { + E T1N, T1O, T1I, T1J; + T1F = rio[WS(vs, 3)]; + T1G = rio[WS(vs, 3) + WS(rs, 2)]; + T1H = T1F + T1G; + T1N = iio[WS(vs, 3)]; + T1O = iio[WS(vs, 3) + WS(rs, 2)]; + T1P = T1N - T1O; + T29 = T1N + T1O; + T1U = iio[WS(vs, 3) + WS(rs, 1)]; + T1V = iio[WS(vs, 3) + WS(rs, 3)]; + T2a = T1U + T1V; + T1I = rio[WS(vs, 3) + WS(rs, 1)]; + T1J = rio[WS(vs, 3) + WS(rs, 3)]; + T1K = T1I + T1J; + T1M = T1I - T1J; + } + T1Q = T1M + T1P; + T1T = T1F - T1G; + T2b = T29 - T2a; + T26 = T1H - T1K; + T20 = T1P - T1M; + T1W = T1U - T1V; + } + { + E Tz, TA, TJ, TO, TP, TG; + { + E TH, TI, TC, TD; + Tz = rio[WS(vs, 1)]; + TA = rio[WS(vs, 1) + WS(rs, 2)]; + TB = Tz + TA; + TH = iio[WS(vs, 1)]; + TI = iio[WS(vs, 1) + WS(rs, 2)]; + TJ = TH - TI; + T13 = TH + TI; + TO = iio[WS(vs, 1) + WS(rs, 1)]; + TP = iio[WS(vs, 1) + WS(rs, 3)]; + T14 = TO + TP; + TC = rio[WS(vs, 1) + WS(rs, 1)]; + TD = rio[WS(vs, 1) + WS(rs, 3)]; + TE = TC + TD; + TG = TC - TD; + } + TK = TG + TJ; + TN = Tz - TA; + T15 = T13 - T14; + T10 = TB - TE; + TU = TJ - TG; + TQ = TO - TP; + } + { + E T17, T18, T1h, T1m, T1n, T1e; + { + E T1f, T1g, T1a, T1b; + T17 = rio[WS(vs, 2)]; + T18 = rio[WS(vs, 2) + WS(rs, 2)]; + T19 = T17 + T18; + T1f = iio[WS(vs, 2)]; + T1g = iio[WS(vs, 2) + WS(rs, 2)]; + T1h = T1f - T1g; + T1B = T1f + T1g; + T1m = iio[WS(vs, 2) + WS(rs, 1)]; + T1n = iio[WS(vs, 2) + WS(rs, 3)]; + T1C = T1m + T1n; + T1a = rio[WS(vs, 2) + WS(rs, 1)]; + T1b = rio[WS(vs, 2) + WS(rs, 3)]; + T1c = T1a + T1b; + T1e = T1a - T1b; + } + T1i = T1e + T1h; + T1l = T17 - T18; + T1D = T1B - T1C; + T1y = T19 - T1c; + T1s = T1h - T1e; + T1o = T1m - T1n; + } + rio[0] = T3 + T6; + iio[0] = Tv + Tw; + rio[WS(rs, 1)] = TB + TE; + iio[WS(rs, 1)] = T13 + T14; + rio[WS(rs, 2)] = T19 + T1c; + iio[WS(rs, 2)] = T1B + T1C; + iio[WS(rs, 3)] = T29 + T2a; + rio[WS(rs, 3)] = T1H + T1K; + { + E Tt, Ty, Tr, Tu; + Tr = W[2]; + Tt = Tr * Ts; + Ty = Tr * Tx; + Tu = W[3]; + rio[WS(vs, 2)] = FMA(Tu, Tx, Tt); + iio[WS(vs, 2)] = FNMS(Tu, Ts, Ty); + } + { + E T27, T2c, T25, T28; + T25 = W[2]; + T27 = T25 * T26; + T2c = T25 * T2b; + T28 = W[3]; + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T28, T2b, T27); + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T28, T26, T2c); + } + { + E T11, T16, TZ, T12; + TZ = W[2]; + T11 = TZ * T10; + T16 = TZ * T15; + T12 = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T12, T15, T11); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T12, T10, T16); + } + { + E T1z, T1E, T1x, T1A; + T1x = W[2]; + T1z = T1x * T1y; + T1E = T1x * T1D; + T1A = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T1A, T1D, T1z); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T1A, T1y, T1E); + } + { + E Tj, Te, Tk, T7, Td; + Tj = Tf - Ti; + Te = W[5]; + Tk = Te * Tc; + T7 = W[4]; + Td = T7 * Tc; + iio[WS(vs, 3)] = FNMS(Te, Tj, Td); + rio[WS(vs, 3)] = FMA(T7, Tj, Tk); + } + { + E T1p, T1k, T1q, T1d, T1j; + T1p = T1l - T1o; + T1k = W[5]; + T1q = T1k * T1i; + T1d = W[4]; + T1j = T1d * T1i; + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T1k, T1p, T1j); + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T1d, T1p, T1q); + } + { + E T23, T22, T24, T1Z, T21; + T23 = T1T + T1W; + T22 = W[1]; + T24 = T22 * T20; + T1Z = W[0]; + T21 = T1Z * T20; + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T22, T23, T21); + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T1Z, T23, T24); + } + { + E TX, TW, TY, TT, TV; + TX = TN + TQ; + TW = W[1]; + TY = TW * TU; + TT = W[0]; + TV = TT * TU; + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(TW, TX, TV); + rio[WS(vs, 1) + WS(rs, 1)] = FMA(TT, TX, TY); + } + { + E TR, TM, TS, TF, TL; + TR = TN - TQ; + TM = W[5]; + TS = TM * TK; + TF = W[4]; + TL = TF * TK; + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(TM, TR, TL); + rio[WS(vs, 3) + WS(rs, 1)] = FMA(TF, TR, TS); + } + { + E Tp, To, Tq, Tl, Tn; + Tp = Tf + Ti; + To = W[1]; + Tq = To * Tm; + Tl = W[0]; + Tn = Tl * Tm; + iio[WS(vs, 1)] = FNMS(To, Tp, Tn); + rio[WS(vs, 1)] = FMA(Tl, Tp, Tq); + } + { + E T1v, T1u, T1w, T1r, T1t; + T1v = T1l + T1o; + T1u = W[1]; + T1w = T1u * T1s; + T1r = W[0]; + T1t = T1r * T1s; + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T1u, T1v, T1t); + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T1r, T1v, T1w); + } + { + E T1X, T1S, T1Y, T1L, T1R; + T1X = T1T - T1W; + T1S = W[5]; + T1Y = T1S * T1Q; + T1L = W[4]; + T1R = T1L * T1Q; + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T1S, T1X, T1R); + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T1L, T1X, T1Y); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 4}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 4, "q1_4", twinstr, &GENUS, {64, 24, 24, 0}, 0, 0, 0 }; + +void X(codelet_q1_4) (planner *p) { + X(kdft_difsq_register) (p, q1_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq.native -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 4 -name q1_4 -include dft/scalar/q.h */ + +/* + * This function contains 88 FP additions, 48 FP multiplications, + * (or, 64 additions, 24 multiplications, 24 fused multiply/add), + * 37 stack variables, 0 constants, and 64 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_4(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T3, Te, Tb, Tq, T6, T8, Th, Tr, Tv, TG, TD, TS, Ty, TA, TJ; + E TT, TX, T18, T15, T1k, T10, T12, T1b, T1l, T1p, T1A, T1x, T1M, T1s, T1u; + E T1D, T1N; + { + E T1, T2, T9, Ta; + T1 = rio[0]; + T2 = rio[WS(rs, 2)]; + T3 = T1 + T2; + Te = T1 - T2; + T9 = iio[0]; + Ta = iio[WS(rs, 2)]; + Tb = T9 - Ta; + Tq = T9 + Ta; + } + { + E T4, T5, Tf, Tg; + T4 = rio[WS(rs, 1)]; + T5 = rio[WS(rs, 3)]; + T6 = T4 + T5; + T8 = T4 - T5; + Tf = iio[WS(rs, 1)]; + Tg = iio[WS(rs, 3)]; + Th = Tf - Tg; + Tr = Tf + Tg; + } + { + E Tt, Tu, TB, TC; + Tt = rio[WS(vs, 1)]; + Tu = rio[WS(vs, 1) + WS(rs, 2)]; + Tv = Tt + Tu; + TG = Tt - Tu; + TB = iio[WS(vs, 1)]; + TC = iio[WS(vs, 1) + WS(rs, 2)]; + TD = TB - TC; + TS = TB + TC; + } + { + E Tw, Tx, TH, TI; + Tw = rio[WS(vs, 1) + WS(rs, 1)]; + Tx = rio[WS(vs, 1) + WS(rs, 3)]; + Ty = Tw + Tx; + TA = Tw - Tx; + TH = iio[WS(vs, 1) + WS(rs, 1)]; + TI = iio[WS(vs, 1) + WS(rs, 3)]; + TJ = TH - TI; + TT = TH + TI; + } + { + E TV, TW, T13, T14; + TV = rio[WS(vs, 2)]; + TW = rio[WS(vs, 2) + WS(rs, 2)]; + TX = TV + TW; + T18 = TV - TW; + T13 = iio[WS(vs, 2)]; + T14 = iio[WS(vs, 2) + WS(rs, 2)]; + T15 = T13 - T14; + T1k = T13 + T14; + } + { + E TY, TZ, T19, T1a; + TY = rio[WS(vs, 2) + WS(rs, 1)]; + TZ = rio[WS(vs, 2) + WS(rs, 3)]; + T10 = TY + TZ; + T12 = TY - TZ; + T19 = iio[WS(vs, 2) + WS(rs, 1)]; + T1a = iio[WS(vs, 2) + WS(rs, 3)]; + T1b = T19 - T1a; + T1l = T19 + T1a; + } + { + E T1n, T1o, T1v, T1w; + T1n = rio[WS(vs, 3)]; + T1o = rio[WS(vs, 3) + WS(rs, 2)]; + T1p = T1n + T1o; + T1A = T1n - T1o; + T1v = iio[WS(vs, 3)]; + T1w = iio[WS(vs, 3) + WS(rs, 2)]; + T1x = T1v - T1w; + T1M = T1v + T1w; + } + { + E T1q, T1r, T1B, T1C; + T1q = rio[WS(vs, 3) + WS(rs, 1)]; + T1r = rio[WS(vs, 3) + WS(rs, 3)]; + T1s = T1q + T1r; + T1u = T1q - T1r; + T1B = iio[WS(vs, 3) + WS(rs, 1)]; + T1C = iio[WS(vs, 3) + WS(rs, 3)]; + T1D = T1B - T1C; + T1N = T1B + T1C; + } + rio[0] = T3 + T6; + iio[0] = Tq + Tr; + rio[WS(rs, 1)] = Tv + Ty; + iio[WS(rs, 1)] = TS + TT; + rio[WS(rs, 2)] = TX + T10; + iio[WS(rs, 2)] = T1k + T1l; + iio[WS(rs, 3)] = T1M + T1N; + rio[WS(rs, 3)] = T1p + T1s; + { + E Tc, Ti, T7, Td; + Tc = T8 + Tb; + Ti = Te - Th; + T7 = W[4]; + Td = W[5]; + iio[WS(vs, 3)] = FNMS(Td, Ti, T7 * Tc); + rio[WS(vs, 3)] = FMA(Td, Tc, T7 * Ti); + } + { + E T1K, T1O, T1J, T1L; + T1K = T1p - T1s; + T1O = T1M - T1N; + T1J = W[2]; + T1L = W[3]; + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T1J, T1K, T1L * T1O); + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T1L, T1K, T1J * T1O); + } + { + E Tk, Tm, Tj, Tl; + Tk = Tb - T8; + Tm = Te + Th; + Tj = W[0]; + Tl = W[1]; + iio[WS(vs, 1)] = FNMS(Tl, Tm, Tj * Tk); + rio[WS(vs, 1)] = FMA(Tl, Tk, Tj * Tm); + } + { + E To, Ts, Tn, Tp; + To = T3 - T6; + Ts = Tq - Tr; + Tn = W[2]; + Tp = W[3]; + rio[WS(vs, 2)] = FMA(Tn, To, Tp * Ts); + iio[WS(vs, 2)] = FNMS(Tp, To, Tn * Ts); + } + { + E T16, T1c, T11, T17; + T16 = T12 + T15; + T1c = T18 - T1b; + T11 = W[4]; + T17 = W[5]; + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T17, T1c, T11 * T16); + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T17, T16, T11 * T1c); + } + { + E T1G, T1I, T1F, T1H; + T1G = T1x - T1u; + T1I = T1A + T1D; + T1F = W[0]; + T1H = W[1]; + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T1H, T1I, T1F * T1G); + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T1H, T1G, T1F * T1I); + } + { + E TQ, TU, TP, TR; + TQ = Tv - Ty; + TU = TS - TT; + TP = W[2]; + TR = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(TP, TQ, TR * TU); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(TR, TQ, TP * TU); + } + { + E T1e, T1g, T1d, T1f; + T1e = T15 - T12; + T1g = T18 + T1b; + T1d = W[0]; + T1f = W[1]; + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T1f, T1g, T1d * T1e); + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T1f, T1e, T1d * T1g); + } + { + E T1i, T1m, T1h, T1j; + T1i = TX - T10; + T1m = T1k - T1l; + T1h = W[2]; + T1j = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T1h, T1i, T1j * T1m); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T1j, T1i, T1h * T1m); + } + { + E T1y, T1E, T1t, T1z; + T1y = T1u + T1x; + T1E = T1A - T1D; + T1t = W[4]; + T1z = W[5]; + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T1z, T1E, T1t * T1y); + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T1z, T1y, T1t * T1E); + } + { + E TM, TO, TL, TN; + TM = TD - TA; + TO = TG + TJ; + TL = W[0]; + TN = W[1]; + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(TN, TO, TL * TM); + rio[WS(vs, 1) + WS(rs, 1)] = FMA(TN, TM, TL * TO); + } + { + E TE, TK, Tz, TF; + TE = TA + TD; + TK = TG - TJ; + Tz = W[4]; + TF = W[5]; + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(TF, TK, Tz * TE); + rio[WS(vs, 3) + WS(rs, 1)] = FMA(TF, TE, Tz * TK); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 4}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 4, "q1_4", twinstr, &GENUS, {64, 24, 24, 0}, 0, 0, 0 }; + +void X(codelet_q1_4) (planner *p) { + X(kdft_difsq_register) (p, q1_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_5.c new file mode 100644 index 000000000..c2c1b0e97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_5.c @@ -0,0 +1,992 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:30 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq.native -fma -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 5 -name q1_5 -include dft/scalar/q.h */ + +/* + * This function contains 200 FP additions, 170 FP multiplications, + * (or, 70 additions, 40 multiplications, 130 fused multiply/add), + * 75 stack variables, 4 constants, and 100 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_5(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T1, Tb, TM, Tw, T8, Ta, Tn, Tj, TH, Ts, Tq, Tr, TV, T15, T1G; + E T1q, T12, T14, T1h, T1d, T1B, T1m, T1k, T1l, T1P, T1Z, T2A, T2k, T1W, T1Y; + E T2b, T27, T2v, T2g, T2e, T2f, T3Z, T3V, T4j, T44, T42, T43, T3D, T3N, T4o; + E T48, T3K, T3M, T2J, T2T, T3u, T3e, T2Q, T2S, T35, T31, T3p, T3a, T38, T39; + { + E T7, Tv, T4, Tu; + T1 = rio[0]; + { + E T5, T6, T2, T3; + T5 = rio[WS(rs, 2)]; + T6 = rio[WS(rs, 3)]; + T7 = T5 + T6; + Tv = T5 - T6; + T2 = rio[WS(rs, 1)]; + T3 = rio[WS(rs, 4)]; + T4 = T2 + T3; + Tu = T2 - T3; + } + Tb = T4 - T7; + TM = FNMS(KP618033988, Tu, Tv); + Tw = FMA(KP618033988, Tv, Tu); + T8 = T4 + T7; + Ta = FNMS(KP250000000, T8, T1); + } + { + E Ti, Tp, Tf, To; + Tn = iio[0]; + { + E Tg, Th, Td, Te; + Tg = iio[WS(rs, 2)]; + Th = iio[WS(rs, 3)]; + Ti = Tg - Th; + Tp = Tg + Th; + Td = iio[WS(rs, 1)]; + Te = iio[WS(rs, 4)]; + Tf = Td - Te; + To = Td + Te; + } + Tj = FMA(KP618033988, Ti, Tf); + TH = FNMS(KP618033988, Tf, Ti); + Ts = To - Tp; + Tq = To + Tp; + Tr = FNMS(KP250000000, Tq, Tn); + } + { + E T11, T1p, TY, T1o; + TV = rio[WS(vs, 1)]; + { + E TZ, T10, TW, TX; + TZ = rio[WS(vs, 1) + WS(rs, 2)]; + T10 = rio[WS(vs, 1) + WS(rs, 3)]; + T11 = TZ + T10; + T1p = TZ - T10; + TW = rio[WS(vs, 1) + WS(rs, 1)]; + TX = rio[WS(vs, 1) + WS(rs, 4)]; + TY = TW + TX; + T1o = TW - TX; + } + T15 = TY - T11; + T1G = FNMS(KP618033988, T1o, T1p); + T1q = FMA(KP618033988, T1p, T1o); + T12 = TY + T11; + T14 = FNMS(KP250000000, T12, TV); + } + { + E T1c, T1j, T19, T1i; + T1h = iio[WS(vs, 1)]; + { + E T1a, T1b, T17, T18; + T1a = iio[WS(vs, 1) + WS(rs, 2)]; + T1b = iio[WS(vs, 1) + WS(rs, 3)]; + T1c = T1a - T1b; + T1j = T1a + T1b; + T17 = iio[WS(vs, 1) + WS(rs, 1)]; + T18 = iio[WS(vs, 1) + WS(rs, 4)]; + T19 = T17 - T18; + T1i = T17 + T18; + } + T1d = FMA(KP618033988, T1c, T19); + T1B = FNMS(KP618033988, T19, T1c); + T1m = T1i - T1j; + T1k = T1i + T1j; + T1l = FNMS(KP250000000, T1k, T1h); + } + { + E T1V, T2j, T1S, T2i; + T1P = rio[WS(vs, 2)]; + { + E T1T, T1U, T1Q, T1R; + T1T = rio[WS(vs, 2) + WS(rs, 2)]; + T1U = rio[WS(vs, 2) + WS(rs, 3)]; + T1V = T1T + T1U; + T2j = T1T - T1U; + T1Q = rio[WS(vs, 2) + WS(rs, 1)]; + T1R = rio[WS(vs, 2) + WS(rs, 4)]; + T1S = T1Q + T1R; + T2i = T1Q - T1R; + } + T1Z = T1S - T1V; + T2A = FNMS(KP618033988, T2i, T2j); + T2k = FMA(KP618033988, T2j, T2i); + T1W = T1S + T1V; + T1Y = FNMS(KP250000000, T1W, T1P); + } + { + E T26, T2d, T23, T2c; + T2b = iio[WS(vs, 2)]; + { + E T24, T25, T21, T22; + T24 = iio[WS(vs, 2) + WS(rs, 2)]; + T25 = iio[WS(vs, 2) + WS(rs, 3)]; + T26 = T24 - T25; + T2d = T24 + T25; + T21 = iio[WS(vs, 2) + WS(rs, 1)]; + T22 = iio[WS(vs, 2) + WS(rs, 4)]; + T23 = T21 - T22; + T2c = T21 + T22; + } + T27 = FMA(KP618033988, T26, T23); + T2v = FNMS(KP618033988, T23, T26); + T2g = T2c - T2d; + T2e = T2c + T2d; + T2f = FNMS(KP250000000, T2e, T2b); + } + { + E T3U, T41, T3R, T40; + T3Z = iio[WS(vs, 4)]; + { + E T3S, T3T, T3P, T3Q; + T3S = iio[WS(vs, 4) + WS(rs, 2)]; + T3T = iio[WS(vs, 4) + WS(rs, 3)]; + T3U = T3S - T3T; + T41 = T3S + T3T; + T3P = iio[WS(vs, 4) + WS(rs, 1)]; + T3Q = iio[WS(vs, 4) + WS(rs, 4)]; + T3R = T3P - T3Q; + T40 = T3P + T3Q; + } + T3V = FMA(KP618033988, T3U, T3R); + T4j = FNMS(KP618033988, T3R, T3U); + T44 = T40 - T41; + T42 = T40 + T41; + T43 = FNMS(KP250000000, T42, T3Z); + } + { + E T3J, T47, T3G, T46; + T3D = rio[WS(vs, 4)]; + { + E T3H, T3I, T3E, T3F; + T3H = rio[WS(vs, 4) + WS(rs, 2)]; + T3I = rio[WS(vs, 4) + WS(rs, 3)]; + T3J = T3H + T3I; + T47 = T3H - T3I; + T3E = rio[WS(vs, 4) + WS(rs, 1)]; + T3F = rio[WS(vs, 4) + WS(rs, 4)]; + T3G = T3E + T3F; + T46 = T3E - T3F; + } + T3N = T3G - T3J; + T4o = FNMS(KP618033988, T46, T47); + T48 = FMA(KP618033988, T47, T46); + T3K = T3G + T3J; + T3M = FNMS(KP250000000, T3K, T3D); + } + { + E T2P, T3d, T2M, T3c; + T2J = rio[WS(vs, 3)]; + { + E T2N, T2O, T2K, T2L; + T2N = rio[WS(vs, 3) + WS(rs, 2)]; + T2O = rio[WS(vs, 3) + WS(rs, 3)]; + T2P = T2N + T2O; + T3d = T2N - T2O; + T2K = rio[WS(vs, 3) + WS(rs, 1)]; + T2L = rio[WS(vs, 3) + WS(rs, 4)]; + T2M = T2K + T2L; + T3c = T2K - T2L; + } + T2T = T2M - T2P; + T3u = FNMS(KP618033988, T3c, T3d); + T3e = FMA(KP618033988, T3d, T3c); + T2Q = T2M + T2P; + T2S = FNMS(KP250000000, T2Q, T2J); + } + { + E T30, T37, T2X, T36; + T35 = iio[WS(vs, 3)]; + { + E T2Y, T2Z, T2V, T2W; + T2Y = iio[WS(vs, 3) + WS(rs, 2)]; + T2Z = iio[WS(vs, 3) + WS(rs, 3)]; + T30 = T2Y - T2Z; + T37 = T2Y + T2Z; + T2V = iio[WS(vs, 3) + WS(rs, 1)]; + T2W = iio[WS(vs, 3) + WS(rs, 4)]; + T2X = T2V - T2W; + T36 = T2V + T2W; + } + T31 = FMA(KP618033988, T30, T2X); + T3p = FNMS(KP618033988, T2X, T30); + T3a = T36 - T37; + T38 = T36 + T37; + T39 = FNMS(KP250000000, T38, T35); + } + rio[0] = T1 + T8; + iio[0] = Tn + Tq; + rio[WS(rs, 1)] = TV + T12; + iio[WS(rs, 1)] = T1h + T1k; + rio[WS(rs, 2)] = T1P + T1W; + iio[WS(rs, 2)] = T2b + T2e; + iio[WS(rs, 4)] = T3Z + T42; + rio[WS(rs, 4)] = T3D + T3K; + rio[WS(rs, 3)] = T2J + T2Q; + iio[WS(rs, 3)] = T35 + T38; + { + E Tk, TA, Tx, TD, Tc, Tt; + Tc = FMA(KP559016994, Tb, Ta); + Tk = FMA(KP951056516, Tj, Tc); + TA = FNMS(KP951056516, Tj, Tc); + Tt = FMA(KP559016994, Ts, Tr); + Tx = FNMS(KP951056516, Tw, Tt); + TD = FMA(KP951056516, Tw, Tt); + { + E Tl, Ty, T9, Tm; + T9 = W[0]; + Tl = T9 * Tk; + Ty = T9 * Tx; + Tm = W[1]; + rio[WS(vs, 1)] = FMA(Tm, Tx, Tl); + iio[WS(vs, 1)] = FNMS(Tm, Tk, Ty); + } + { + E TB, TE, Tz, TC; + Tz = W[6]; + TB = Tz * TA; + TE = Tz * TD; + TC = W[7]; + rio[WS(vs, 4)] = FMA(TC, TD, TB); + iio[WS(vs, 4)] = FNMS(TC, TA, TE); + } + } + { + E TI, TQ, TN, TT, TG, TL; + TG = FNMS(KP559016994, Tb, Ta); + TI = FNMS(KP951056516, TH, TG); + TQ = FMA(KP951056516, TH, TG); + TL = FNMS(KP559016994, Ts, Tr); + TN = FMA(KP951056516, TM, TL); + TT = FNMS(KP951056516, TM, TL); + { + E TJ, TO, TF, TK; + TF = W[2]; + TJ = TF * TI; + TO = TF * TN; + TK = W[3]; + rio[WS(vs, 2)] = FMA(TK, TN, TJ); + iio[WS(vs, 2)] = FNMS(TK, TI, TO); + } + { + E TR, TU, TP, TS; + TP = W[4]; + TR = TP * TQ; + TU = TP * TT; + TS = W[5]; + rio[WS(vs, 3)] = FMA(TS, TT, TR); + iio[WS(vs, 3)] = FNMS(TS, TQ, TU); + } + } + { + E T2w, T2E, T2B, T2H, T2u, T2z; + T2u = FNMS(KP559016994, T1Z, T1Y); + T2w = FNMS(KP951056516, T2v, T2u); + T2E = FMA(KP951056516, T2v, T2u); + T2z = FNMS(KP559016994, T2g, T2f); + T2B = FMA(KP951056516, T2A, T2z); + T2H = FNMS(KP951056516, T2A, T2z); + { + E T2x, T2C, T2t, T2y; + T2t = W[2]; + T2x = T2t * T2w; + T2C = T2t * T2B; + T2y = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T2y, T2B, T2x); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T2y, T2w, T2C); + } + { + E T2F, T2I, T2D, T2G; + T2D = W[4]; + T2F = T2D * T2E; + T2I = T2D * T2H; + T2G = W[5]; + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T2G, T2H, T2F); + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T2G, T2E, T2I); + } + } + { + E T4k, T4s, T4p, T4v, T4i, T4n; + T4i = FNMS(KP559016994, T3N, T3M); + T4k = FNMS(KP951056516, T4j, T4i); + T4s = FMA(KP951056516, T4j, T4i); + T4n = FNMS(KP559016994, T44, T43); + T4p = FMA(KP951056516, T4o, T4n); + T4v = FNMS(KP951056516, T4o, T4n); + { + E T4l, T4q, T4h, T4m; + T4h = W[2]; + T4l = T4h * T4k; + T4q = T4h * T4p; + T4m = W[3]; + rio[WS(vs, 2) + WS(rs, 4)] = FMA(T4m, T4p, T4l); + iio[WS(vs, 2) + WS(rs, 4)] = FNMS(T4m, T4k, T4q); + } + { + E T4t, T4w, T4r, T4u; + T4r = W[4]; + T4t = T4r * T4s; + T4w = T4r * T4v; + T4u = W[5]; + rio[WS(vs, 3) + WS(rs, 4)] = FMA(T4u, T4v, T4t); + iio[WS(vs, 3) + WS(rs, 4)] = FNMS(T4u, T4s, T4w); + } + } + { + E T28, T2o, T2l, T2r, T20, T2h; + T20 = FMA(KP559016994, T1Z, T1Y); + T28 = FMA(KP951056516, T27, T20); + T2o = FNMS(KP951056516, T27, T20); + T2h = FMA(KP559016994, T2g, T2f); + T2l = FNMS(KP951056516, T2k, T2h); + T2r = FMA(KP951056516, T2k, T2h); + { + E T29, T2m, T1X, T2a; + T1X = W[0]; + T29 = T1X * T28; + T2m = T1X * T2l; + T2a = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T2a, T2l, T29); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T2a, T28, T2m); + } + { + E T2p, T2s, T2n, T2q; + T2n = W[6]; + T2p = T2n * T2o; + T2s = T2n * T2r; + T2q = W[7]; + rio[WS(vs, 4) + WS(rs, 2)] = FMA(T2q, T2r, T2p); + iio[WS(vs, 4) + WS(rs, 2)] = FNMS(T2q, T2o, T2s); + } + } + { + E T32, T3i, T3f, T3l, T2U, T3b; + T2U = FMA(KP559016994, T2T, T2S); + T32 = FMA(KP951056516, T31, T2U); + T3i = FNMS(KP951056516, T31, T2U); + T3b = FMA(KP559016994, T3a, T39); + T3f = FNMS(KP951056516, T3e, T3b); + T3l = FMA(KP951056516, T3e, T3b); + { + E T33, T3g, T2R, T34; + T2R = W[0]; + T33 = T2R * T32; + T3g = T2R * T3f; + T34 = W[1]; + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T34, T3f, T33); + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T34, T32, T3g); + } + { + E T3j, T3m, T3h, T3k; + T3h = W[6]; + T3j = T3h * T3i; + T3m = T3h * T3l; + T3k = W[7]; + rio[WS(vs, 4) + WS(rs, 3)] = FMA(T3k, T3l, T3j); + iio[WS(vs, 4) + WS(rs, 3)] = FNMS(T3k, T3i, T3m); + } + } + { + E T3q, T3y, T3v, T3B, T3o, T3t; + T3o = FNMS(KP559016994, T2T, T2S); + T3q = FNMS(KP951056516, T3p, T3o); + T3y = FMA(KP951056516, T3p, T3o); + T3t = FNMS(KP559016994, T3a, T39); + T3v = FMA(KP951056516, T3u, T3t); + T3B = FNMS(KP951056516, T3u, T3t); + { + E T3r, T3w, T3n, T3s; + T3n = W[2]; + T3r = T3n * T3q; + T3w = T3n * T3v; + T3s = W[3]; + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T3s, T3v, T3r); + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T3s, T3q, T3w); + } + { + E T3z, T3C, T3x, T3A; + T3x = W[4]; + T3z = T3x * T3y; + T3C = T3x * T3B; + T3A = W[5]; + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T3A, T3B, T3z); + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T3A, T3y, T3C); + } + } + { + E T3W, T4c, T49, T4f, T3O, T45; + T3O = FMA(KP559016994, T3N, T3M); + T3W = FMA(KP951056516, T3V, T3O); + T4c = FNMS(KP951056516, T3V, T3O); + T45 = FMA(KP559016994, T44, T43); + T49 = FNMS(KP951056516, T48, T45); + T4f = FMA(KP951056516, T48, T45); + { + E T3X, T4a, T3L, T3Y; + T3L = W[0]; + T3X = T3L * T3W; + T4a = T3L * T49; + T3Y = W[1]; + rio[WS(vs, 1) + WS(rs, 4)] = FMA(T3Y, T49, T3X); + iio[WS(vs, 1) + WS(rs, 4)] = FNMS(T3Y, T3W, T4a); + } + { + E T4d, T4g, T4b, T4e; + T4b = W[6]; + T4d = T4b * T4c; + T4g = T4b * T4f; + T4e = W[7]; + rio[WS(vs, 4) + WS(rs, 4)] = FMA(T4e, T4f, T4d); + iio[WS(vs, 4) + WS(rs, 4)] = FNMS(T4e, T4c, T4g); + } + } + { + E T1C, T1K, T1H, T1N, T1A, T1F; + T1A = FNMS(KP559016994, T15, T14); + T1C = FNMS(KP951056516, T1B, T1A); + T1K = FMA(KP951056516, T1B, T1A); + T1F = FNMS(KP559016994, T1m, T1l); + T1H = FMA(KP951056516, T1G, T1F); + T1N = FNMS(KP951056516, T1G, T1F); + { + E T1D, T1I, T1z, T1E; + T1z = W[2]; + T1D = T1z * T1C; + T1I = T1z * T1H; + T1E = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T1E, T1H, T1D); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T1E, T1C, T1I); + } + { + E T1L, T1O, T1J, T1M; + T1J = W[4]; + T1L = T1J * T1K; + T1O = T1J * T1N; + T1M = W[5]; + rio[WS(vs, 3) + WS(rs, 1)] = FMA(T1M, T1N, T1L); + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(T1M, T1K, T1O); + } + } + { + E T1e, T1u, T1r, T1x, T16, T1n; + T16 = FMA(KP559016994, T15, T14); + T1e = FMA(KP951056516, T1d, T16); + T1u = FNMS(KP951056516, T1d, T16); + T1n = FMA(KP559016994, T1m, T1l); + T1r = FNMS(KP951056516, T1q, T1n); + T1x = FMA(KP951056516, T1q, T1n); + { + E T1f, T1s, T13, T1g; + T13 = W[0]; + T1f = T13 * T1e; + T1s = T13 * T1r; + T1g = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(T1g, T1r, T1f); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(T1g, T1e, T1s); + } + { + E T1v, T1y, T1t, T1w; + T1t = W[6]; + T1v = T1t * T1u; + T1y = T1t * T1x; + T1w = W[7]; + rio[WS(vs, 4) + WS(rs, 1)] = FMA(T1w, T1x, T1v); + iio[WS(vs, 4) + WS(rs, 1)] = FNMS(T1w, T1u, T1y); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 5}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 5, "q1_5", twinstr, &GENUS, {70, 40, 130, 0}, 0, 0, 0 }; + +void X(codelet_q1_5) (planner *p) { + X(kdft_difsq_register) (p, q1_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq.native -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 5 -name q1_5 -include dft/scalar/q.h */ + +/* + * This function contains 200 FP additions, 140 FP multiplications, + * (or, 130 additions, 70 multiplications, 70 fused multiply/add), + * 75 stack variables, 4 constants, and 100 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_5(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T1, Ta, TG, Tv, T8, Tb, Tp, Tj, TD, To, Tq, Tr, TN, TW, T1s; + E T1h, TU, TX, T1b, T15, T1p, T1a, T1c, T1d, T1z, T1I, T2e, T23, T1G, T1J; + E T1X, T1R, T2b, T1W, T1Y, T1Z, T3v, T3p, T3J, T3u, T3w, T3x, T37, T3g, T3M; + E T3B, T3e, T3h, T2l, T2u, T30, T2P, T2s, T2v, T2J, T2D, T2X, T2I, T2K, T2L; + { + E T7, Tu, T4, Tt; + T1 = rio[0]; + { + E T5, T6, T2, T3; + T5 = rio[WS(rs, 2)]; + T6 = rio[WS(rs, 3)]; + T7 = T5 + T6; + Tu = T5 - T6; + T2 = rio[WS(rs, 1)]; + T3 = rio[WS(rs, 4)]; + T4 = T2 + T3; + Tt = T2 - T3; + } + Ta = KP559016994 * (T4 - T7); + TG = FNMS(KP587785252, Tt, KP951056516 * Tu); + Tv = FMA(KP951056516, Tt, KP587785252 * Tu); + T8 = T4 + T7; + Tb = FNMS(KP250000000, T8, T1); + } + { + E Ti, Tn, Tf, Tm; + Tp = iio[0]; + { + E Tg, Th, Td, Te; + Tg = iio[WS(rs, 2)]; + Th = iio[WS(rs, 3)]; + Ti = Tg - Th; + Tn = Tg + Th; + Td = iio[WS(rs, 1)]; + Te = iio[WS(rs, 4)]; + Tf = Td - Te; + Tm = Td + Te; + } + Tj = FMA(KP951056516, Tf, KP587785252 * Ti); + TD = FNMS(KP587785252, Tf, KP951056516 * Ti); + To = KP559016994 * (Tm - Tn); + Tq = Tm + Tn; + Tr = FNMS(KP250000000, Tq, Tp); + } + { + E TT, T1g, TQ, T1f; + TN = rio[WS(vs, 1)]; + { + E TR, TS, TO, TP; + TR = rio[WS(vs, 1) + WS(rs, 2)]; + TS = rio[WS(vs, 1) + WS(rs, 3)]; + TT = TR + TS; + T1g = TR - TS; + TO = rio[WS(vs, 1) + WS(rs, 1)]; + TP = rio[WS(vs, 1) + WS(rs, 4)]; + TQ = TO + TP; + T1f = TO - TP; + } + TW = KP559016994 * (TQ - TT); + T1s = FNMS(KP587785252, T1f, KP951056516 * T1g); + T1h = FMA(KP951056516, T1f, KP587785252 * T1g); + TU = TQ + TT; + TX = FNMS(KP250000000, TU, TN); + } + { + E T14, T19, T11, T18; + T1b = iio[WS(vs, 1)]; + { + E T12, T13, TZ, T10; + T12 = iio[WS(vs, 1) + WS(rs, 2)]; + T13 = iio[WS(vs, 1) + WS(rs, 3)]; + T14 = T12 - T13; + T19 = T12 + T13; + TZ = iio[WS(vs, 1) + WS(rs, 1)]; + T10 = iio[WS(vs, 1) + WS(rs, 4)]; + T11 = TZ - T10; + T18 = TZ + T10; + } + T15 = FMA(KP951056516, T11, KP587785252 * T14); + T1p = FNMS(KP587785252, T11, KP951056516 * T14); + T1a = KP559016994 * (T18 - T19); + T1c = T18 + T19; + T1d = FNMS(KP250000000, T1c, T1b); + } + { + E T1F, T22, T1C, T21; + T1z = rio[WS(vs, 2)]; + { + E T1D, T1E, T1A, T1B; + T1D = rio[WS(vs, 2) + WS(rs, 2)]; + T1E = rio[WS(vs, 2) + WS(rs, 3)]; + T1F = T1D + T1E; + T22 = T1D - T1E; + T1A = rio[WS(vs, 2) + WS(rs, 1)]; + T1B = rio[WS(vs, 2) + WS(rs, 4)]; + T1C = T1A + T1B; + T21 = T1A - T1B; + } + T1I = KP559016994 * (T1C - T1F); + T2e = FNMS(KP587785252, T21, KP951056516 * T22); + T23 = FMA(KP951056516, T21, KP587785252 * T22); + T1G = T1C + T1F; + T1J = FNMS(KP250000000, T1G, T1z); + } + { + E T1Q, T1V, T1N, T1U; + T1X = iio[WS(vs, 2)]; + { + E T1O, T1P, T1L, T1M; + T1O = iio[WS(vs, 2) + WS(rs, 2)]; + T1P = iio[WS(vs, 2) + WS(rs, 3)]; + T1Q = T1O - T1P; + T1V = T1O + T1P; + T1L = iio[WS(vs, 2) + WS(rs, 1)]; + T1M = iio[WS(vs, 2) + WS(rs, 4)]; + T1N = T1L - T1M; + T1U = T1L + T1M; + } + T1R = FMA(KP951056516, T1N, KP587785252 * T1Q); + T2b = FNMS(KP587785252, T1N, KP951056516 * T1Q); + T1W = KP559016994 * (T1U - T1V); + T1Y = T1U + T1V; + T1Z = FNMS(KP250000000, T1Y, T1X); + } + { + E T3o, T3t, T3l, T3s; + T3v = iio[WS(vs, 4)]; + { + E T3m, T3n, T3j, T3k; + T3m = iio[WS(vs, 4) + WS(rs, 2)]; + T3n = iio[WS(vs, 4) + WS(rs, 3)]; + T3o = T3m - T3n; + T3t = T3m + T3n; + T3j = iio[WS(vs, 4) + WS(rs, 1)]; + T3k = iio[WS(vs, 4) + WS(rs, 4)]; + T3l = T3j - T3k; + T3s = T3j + T3k; + } + T3p = FMA(KP951056516, T3l, KP587785252 * T3o); + T3J = FNMS(KP587785252, T3l, KP951056516 * T3o); + T3u = KP559016994 * (T3s - T3t); + T3w = T3s + T3t; + T3x = FNMS(KP250000000, T3w, T3v); + } + { + E T3d, T3A, T3a, T3z; + T37 = rio[WS(vs, 4)]; + { + E T3b, T3c, T38, T39; + T3b = rio[WS(vs, 4) + WS(rs, 2)]; + T3c = rio[WS(vs, 4) + WS(rs, 3)]; + T3d = T3b + T3c; + T3A = T3b - T3c; + T38 = rio[WS(vs, 4) + WS(rs, 1)]; + T39 = rio[WS(vs, 4) + WS(rs, 4)]; + T3a = T38 + T39; + T3z = T38 - T39; + } + T3g = KP559016994 * (T3a - T3d); + T3M = FNMS(KP587785252, T3z, KP951056516 * T3A); + T3B = FMA(KP951056516, T3z, KP587785252 * T3A); + T3e = T3a + T3d; + T3h = FNMS(KP250000000, T3e, T37); + } + { + E T2r, T2O, T2o, T2N; + T2l = rio[WS(vs, 3)]; + { + E T2p, T2q, T2m, T2n; + T2p = rio[WS(vs, 3) + WS(rs, 2)]; + T2q = rio[WS(vs, 3) + WS(rs, 3)]; + T2r = T2p + T2q; + T2O = T2p - T2q; + T2m = rio[WS(vs, 3) + WS(rs, 1)]; + T2n = rio[WS(vs, 3) + WS(rs, 4)]; + T2o = T2m + T2n; + T2N = T2m - T2n; + } + T2u = KP559016994 * (T2o - T2r); + T30 = FNMS(KP587785252, T2N, KP951056516 * T2O); + T2P = FMA(KP951056516, T2N, KP587785252 * T2O); + T2s = T2o + T2r; + T2v = FNMS(KP250000000, T2s, T2l); + } + { + E T2C, T2H, T2z, T2G; + T2J = iio[WS(vs, 3)]; + { + E T2A, T2B, T2x, T2y; + T2A = iio[WS(vs, 3) + WS(rs, 2)]; + T2B = iio[WS(vs, 3) + WS(rs, 3)]; + T2C = T2A - T2B; + T2H = T2A + T2B; + T2x = iio[WS(vs, 3) + WS(rs, 1)]; + T2y = iio[WS(vs, 3) + WS(rs, 4)]; + T2z = T2x - T2y; + T2G = T2x + T2y; + } + T2D = FMA(KP951056516, T2z, KP587785252 * T2C); + T2X = FNMS(KP587785252, T2z, KP951056516 * T2C); + T2I = KP559016994 * (T2G - T2H); + T2K = T2G + T2H; + T2L = FNMS(KP250000000, T2K, T2J); + } + rio[0] = T1 + T8; + iio[0] = Tp + Tq; + rio[WS(rs, 1)] = TN + TU; + iio[WS(rs, 1)] = T1b + T1c; + rio[WS(rs, 2)] = T1z + T1G; + iio[WS(rs, 2)] = T1X + T1Y; + iio[WS(rs, 4)] = T3v + T3w; + rio[WS(rs, 4)] = T37 + T3e; + rio[WS(rs, 3)] = T2l + T2s; + iio[WS(rs, 3)] = T2J + T2K; + { + E Tk, Ty, Tw, TA, Tc, Ts; + Tc = Ta + Tb; + Tk = Tc + Tj; + Ty = Tc - Tj; + Ts = To + Tr; + Tw = Ts - Tv; + TA = Tv + Ts; + { + E T9, Tl, Tx, Tz; + T9 = W[0]; + Tl = W[1]; + rio[WS(vs, 1)] = FMA(T9, Tk, Tl * Tw); + iio[WS(vs, 1)] = FNMS(Tl, Tk, T9 * Tw); + Tx = W[6]; + Tz = W[7]; + rio[WS(vs, 4)] = FMA(Tx, Ty, Tz * TA); + iio[WS(vs, 4)] = FNMS(Tz, Ty, Tx * TA); + } + } + { + E TE, TK, TI, TM, TC, TH; + TC = Tb - Ta; + TE = TC - TD; + TK = TC + TD; + TH = Tr - To; + TI = TG + TH; + TM = TH - TG; + { + E TB, TF, TJ, TL; + TB = W[2]; + TF = W[3]; + rio[WS(vs, 2)] = FMA(TB, TE, TF * TI); + iio[WS(vs, 2)] = FNMS(TF, TE, TB * TI); + TJ = W[4]; + TL = W[5]; + rio[WS(vs, 3)] = FMA(TJ, TK, TL * TM); + iio[WS(vs, 3)] = FNMS(TL, TK, TJ * TM); + } + } + { + E T2c, T2i, T2g, T2k, T2a, T2f; + T2a = T1J - T1I; + T2c = T2a - T2b; + T2i = T2a + T2b; + T2f = T1Z - T1W; + T2g = T2e + T2f; + T2k = T2f - T2e; + { + E T29, T2d, T2h, T2j; + T29 = W[2]; + T2d = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T29, T2c, T2d * T2g); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T2d, T2c, T29 * T2g); + T2h = W[4]; + T2j = W[5]; + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T2h, T2i, T2j * T2k); + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T2j, T2i, T2h * T2k); + } + } + { + E T3K, T3Q, T3O, T3S, T3I, T3N; + T3I = T3h - T3g; + T3K = T3I - T3J; + T3Q = T3I + T3J; + T3N = T3x - T3u; + T3O = T3M + T3N; + T3S = T3N - T3M; + { + E T3H, T3L, T3P, T3R; + T3H = W[2]; + T3L = W[3]; + rio[WS(vs, 2) + WS(rs, 4)] = FMA(T3H, T3K, T3L * T3O); + iio[WS(vs, 2) + WS(rs, 4)] = FNMS(T3L, T3K, T3H * T3O); + T3P = W[4]; + T3R = W[5]; + rio[WS(vs, 3) + WS(rs, 4)] = FMA(T3P, T3Q, T3R * T3S); + iio[WS(vs, 3) + WS(rs, 4)] = FNMS(T3R, T3Q, T3P * T3S); + } + } + { + E T1S, T26, T24, T28, T1K, T20; + T1K = T1I + T1J; + T1S = T1K + T1R; + T26 = T1K - T1R; + T20 = T1W + T1Z; + T24 = T20 - T23; + T28 = T23 + T20; + { + E T1H, T1T, T25, T27; + T1H = W[0]; + T1T = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T1H, T1S, T1T * T24); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T1T, T1S, T1H * T24); + T25 = W[6]; + T27 = W[7]; + rio[WS(vs, 4) + WS(rs, 2)] = FMA(T25, T26, T27 * T28); + iio[WS(vs, 4) + WS(rs, 2)] = FNMS(T27, T26, T25 * T28); + } + } + { + E T2E, T2S, T2Q, T2U, T2w, T2M; + T2w = T2u + T2v; + T2E = T2w + T2D; + T2S = T2w - T2D; + T2M = T2I + T2L; + T2Q = T2M - T2P; + T2U = T2P + T2M; + { + E T2t, T2F, T2R, T2T; + T2t = W[0]; + T2F = W[1]; + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T2t, T2E, T2F * T2Q); + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T2F, T2E, T2t * T2Q); + T2R = W[6]; + T2T = W[7]; + rio[WS(vs, 4) + WS(rs, 3)] = FMA(T2R, T2S, T2T * T2U); + iio[WS(vs, 4) + WS(rs, 3)] = FNMS(T2T, T2S, T2R * T2U); + } + } + { + E T2Y, T34, T32, T36, T2W, T31; + T2W = T2v - T2u; + T2Y = T2W - T2X; + T34 = T2W + T2X; + T31 = T2L - T2I; + T32 = T30 + T31; + T36 = T31 - T30; + { + E T2V, T2Z, T33, T35; + T2V = W[2]; + T2Z = W[3]; + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T2V, T2Y, T2Z * T32); + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T2Z, T2Y, T2V * T32); + T33 = W[4]; + T35 = W[5]; + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T33, T34, T35 * T36); + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T35, T34, T33 * T36); + } + } + { + E T3q, T3E, T3C, T3G, T3i, T3y; + T3i = T3g + T3h; + T3q = T3i + T3p; + T3E = T3i - T3p; + T3y = T3u + T3x; + T3C = T3y - T3B; + T3G = T3B + T3y; + { + E T3f, T3r, T3D, T3F; + T3f = W[0]; + T3r = W[1]; + rio[WS(vs, 1) + WS(rs, 4)] = FMA(T3f, T3q, T3r * T3C); + iio[WS(vs, 1) + WS(rs, 4)] = FNMS(T3r, T3q, T3f * T3C); + T3D = W[6]; + T3F = W[7]; + rio[WS(vs, 4) + WS(rs, 4)] = FMA(T3D, T3E, T3F * T3G); + iio[WS(vs, 4) + WS(rs, 4)] = FNMS(T3F, T3E, T3D * T3G); + } + } + { + E T1q, T1w, T1u, T1y, T1o, T1t; + T1o = TX - TW; + T1q = T1o - T1p; + T1w = T1o + T1p; + T1t = T1d - T1a; + T1u = T1s + T1t; + T1y = T1t - T1s; + { + E T1n, T1r, T1v, T1x; + T1n = W[2]; + T1r = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T1n, T1q, T1r * T1u); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T1r, T1q, T1n * T1u); + T1v = W[4]; + T1x = W[5]; + rio[WS(vs, 3) + WS(rs, 1)] = FMA(T1v, T1w, T1x * T1y); + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(T1x, T1w, T1v * T1y); + } + } + { + E T16, T1k, T1i, T1m, TY, T1e; + TY = TW + TX; + T16 = TY + T15; + T1k = TY - T15; + T1e = T1a + T1d; + T1i = T1e - T1h; + T1m = T1h + T1e; + { + E TV, T17, T1j, T1l; + TV = W[0]; + T17 = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(TV, T16, T17 * T1i); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(T17, T16, TV * T1i); + T1j = W[6]; + T1l = W[7]; + rio[WS(vs, 4) + WS(rs, 1)] = FMA(T1j, T1k, T1l * T1m); + iio[WS(vs, 4) + WS(rs, 1)] = FNMS(T1l, T1k, T1j * T1m); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 5}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 5, "q1_5", twinstr, &GENUS, {130, 70, 70, 0}, 0, 0, 0 }; + +void X(codelet_q1_5) (planner *p) { + X(kdft_difsq_register) (p, q1_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_6.c new file mode 100644 index 000000000..3da07d6ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_6.c @@ -0,0 +1,1320 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:31 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq.native -fma -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 6 -name q1_6 -include dft/scalar/q.h */ + +/* + * This function contains 276 FP additions, 192 FP multiplications, + * (or, 144 additions, 60 multiplications, 132 fused multiply/add), + * 109 stack variables, 2 constants, and 144 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_6(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 10); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T3, Tc, Tw, TW, Ta, TM, Tf, Tg, Tt, TT, Tn, TP, Tu, Tv, TU; + E TV, T17, T1g, T1A, T20, T1e, T1Q, T1j, T1k, T1x, T1X, T1r, T1T, T1y, T1z; + E T1Y, T1Z, T2B, T31, T2v, T2X, T2C, T2D, T32, T33, T2b, T2k, T2E, T34, T2i; + E T2U, T2n, T2o, T3f, T3o, T3I, T48, T3m, T3Y, T3r, T3s, T3F, T45, T3z, T41; + E T3G, T3H, T46, T47, T4j, T4s, T4M, T5c, T4q, T52, T4v, T4w, T4J, T59, T4D; + E T55, T4K, T4L, T5a, T5b, T5N, T6d, T5H, T69, T5O, T5P, T6e, T6f, T5n, T5w; + E T5Q, T6g, T5u, T66, T5z, T5A; + { + E T9, Te, T6, Td, T1, T2; + T1 = rio[0]; + T2 = rio[WS(rs, 3)]; + T3 = T1 + T2; + Tc = T1 - T2; + { + E T7, T8, T4, T5; + T7 = rio[WS(rs, 4)]; + T8 = rio[WS(rs, 1)]; + T9 = T7 + T8; + Te = T7 - T8; + T4 = rio[WS(rs, 2)]; + T5 = rio[WS(rs, 5)]; + T6 = T4 + T5; + Td = T4 - T5; + } + Tw = Te - Td; + TW = T9 - T6; + Ta = T6 + T9; + TM = FNMS(KP500000000, Ta, T3); + Tf = Td + Te; + Tg = FNMS(KP500000000, Tf, Tc); + } + { + E Tj, TN, Tm, TO, Th, Ti; + Th = iio[WS(rs, 2)]; + Ti = iio[WS(rs, 5)]; + Tj = Th - Ti; + TN = Th + Ti; + { + E Tr, Ts, Tk, Tl; + Tr = iio[0]; + Ts = iio[WS(rs, 3)]; + Tt = Tr - Ts; + TT = Tr + Ts; + Tk = iio[WS(rs, 4)]; + Tl = iio[WS(rs, 1)]; + Tm = Tk - Tl; + TO = Tk + Tl; + } + Tn = Tj - Tm; + TP = TN - TO; + Tu = Tj + Tm; + Tv = FNMS(KP500000000, Tu, Tt); + TU = TN + TO; + TV = FNMS(KP500000000, TU, TT); + } + { + E T1d, T1i, T1a, T1h, T15, T16; + T15 = rio[WS(vs, 1)]; + T16 = rio[WS(vs, 1) + WS(rs, 3)]; + T17 = T15 + T16; + T1g = T15 - T16; + { + E T1b, T1c, T18, T19; + T1b = rio[WS(vs, 1) + WS(rs, 4)]; + T1c = rio[WS(vs, 1) + WS(rs, 1)]; + T1d = T1b + T1c; + T1i = T1b - T1c; + T18 = rio[WS(vs, 1) + WS(rs, 2)]; + T19 = rio[WS(vs, 1) + WS(rs, 5)]; + T1a = T18 + T19; + T1h = T18 - T19; + } + T1A = T1i - T1h; + T20 = T1d - T1a; + T1e = T1a + T1d; + T1Q = FNMS(KP500000000, T1e, T17); + T1j = T1h + T1i; + T1k = FNMS(KP500000000, T1j, T1g); + } + { + E T1n, T1R, T1q, T1S, T1l, T1m; + T1l = iio[WS(vs, 1) + WS(rs, 2)]; + T1m = iio[WS(vs, 1) + WS(rs, 5)]; + T1n = T1l - T1m; + T1R = T1l + T1m; + { + E T1v, T1w, T1o, T1p; + T1v = iio[WS(vs, 1)]; + T1w = iio[WS(vs, 1) + WS(rs, 3)]; + T1x = T1v - T1w; + T1X = T1v + T1w; + T1o = iio[WS(vs, 1) + WS(rs, 4)]; + T1p = iio[WS(vs, 1) + WS(rs, 1)]; + T1q = T1o - T1p; + T1S = T1o + T1p; + } + T1r = T1n - T1q; + T1T = T1R - T1S; + T1y = T1n + T1q; + T1z = FNMS(KP500000000, T1y, T1x); + T1Y = T1R + T1S; + T1Z = FNMS(KP500000000, T1Y, T1X); + } + { + E T2r, T2V, T2u, T2W, T2p, T2q; + T2p = iio[WS(vs, 2) + WS(rs, 2)]; + T2q = iio[WS(vs, 2) + WS(rs, 5)]; + T2r = T2p - T2q; + T2V = T2p + T2q; + { + E T2z, T2A, T2s, T2t; + T2z = iio[WS(vs, 2)]; + T2A = iio[WS(vs, 2) + WS(rs, 3)]; + T2B = T2z - T2A; + T31 = T2z + T2A; + T2s = iio[WS(vs, 2) + WS(rs, 4)]; + T2t = iio[WS(vs, 2) + WS(rs, 1)]; + T2u = T2s - T2t; + T2W = T2s + T2t; + } + T2v = T2r - T2u; + T2X = T2V - T2W; + T2C = T2r + T2u; + T2D = FNMS(KP500000000, T2C, T2B); + T32 = T2V + T2W; + T33 = FNMS(KP500000000, T32, T31); + } + { + E T2h, T2m, T2e, T2l, T29, T2a; + T29 = rio[WS(vs, 2)]; + T2a = rio[WS(vs, 2) + WS(rs, 3)]; + T2b = T29 + T2a; + T2k = T29 - T2a; + { + E T2f, T2g, T2c, T2d; + T2f = rio[WS(vs, 2) + WS(rs, 4)]; + T2g = rio[WS(vs, 2) + WS(rs, 1)]; + T2h = T2f + T2g; + T2m = T2f - T2g; + T2c = rio[WS(vs, 2) + WS(rs, 2)]; + T2d = rio[WS(vs, 2) + WS(rs, 5)]; + T2e = T2c + T2d; + T2l = T2c - T2d; + } + T2E = T2m - T2l; + T34 = T2h - T2e; + T2i = T2e + T2h; + T2U = FNMS(KP500000000, T2i, T2b); + T2n = T2l + T2m; + T2o = FNMS(KP500000000, T2n, T2k); + } + { + E T3l, T3q, T3i, T3p, T3d, T3e; + T3d = rio[WS(vs, 3)]; + T3e = rio[WS(vs, 3) + WS(rs, 3)]; + T3f = T3d + T3e; + T3o = T3d - T3e; + { + E T3j, T3k, T3g, T3h; + T3j = rio[WS(vs, 3) + WS(rs, 4)]; + T3k = rio[WS(vs, 3) + WS(rs, 1)]; + T3l = T3j + T3k; + T3q = T3j - T3k; + T3g = rio[WS(vs, 3) + WS(rs, 2)]; + T3h = rio[WS(vs, 3) + WS(rs, 5)]; + T3i = T3g + T3h; + T3p = T3g - T3h; + } + T3I = T3q - T3p; + T48 = T3l - T3i; + T3m = T3i + T3l; + T3Y = FNMS(KP500000000, T3m, T3f); + T3r = T3p + T3q; + T3s = FNMS(KP500000000, T3r, T3o); + } + { + E T3v, T3Z, T3y, T40, T3t, T3u; + T3t = iio[WS(vs, 3) + WS(rs, 2)]; + T3u = iio[WS(vs, 3) + WS(rs, 5)]; + T3v = T3t - T3u; + T3Z = T3t + T3u; + { + E T3D, T3E, T3w, T3x; + T3D = iio[WS(vs, 3)]; + T3E = iio[WS(vs, 3) + WS(rs, 3)]; + T3F = T3D - T3E; + T45 = T3D + T3E; + T3w = iio[WS(vs, 3) + WS(rs, 4)]; + T3x = iio[WS(vs, 3) + WS(rs, 1)]; + T3y = T3w - T3x; + T40 = T3w + T3x; + } + T3z = T3v - T3y; + T41 = T3Z - T40; + T3G = T3v + T3y; + T3H = FNMS(KP500000000, T3G, T3F); + T46 = T3Z + T40; + T47 = FNMS(KP500000000, T46, T45); + } + { + E T4p, T4u, T4m, T4t, T4h, T4i; + T4h = rio[WS(vs, 4)]; + T4i = rio[WS(vs, 4) + WS(rs, 3)]; + T4j = T4h + T4i; + T4s = T4h - T4i; + { + E T4n, T4o, T4k, T4l; + T4n = rio[WS(vs, 4) + WS(rs, 4)]; + T4o = rio[WS(vs, 4) + WS(rs, 1)]; + T4p = T4n + T4o; + T4u = T4n - T4o; + T4k = rio[WS(vs, 4) + WS(rs, 2)]; + T4l = rio[WS(vs, 4) + WS(rs, 5)]; + T4m = T4k + T4l; + T4t = T4k - T4l; + } + T4M = T4u - T4t; + T5c = T4p - T4m; + T4q = T4m + T4p; + T52 = FNMS(KP500000000, T4q, T4j); + T4v = T4t + T4u; + T4w = FNMS(KP500000000, T4v, T4s); + } + { + E T4z, T53, T4C, T54, T4x, T4y; + T4x = iio[WS(vs, 4) + WS(rs, 2)]; + T4y = iio[WS(vs, 4) + WS(rs, 5)]; + T4z = T4x - T4y; + T53 = T4x + T4y; + { + E T4H, T4I, T4A, T4B; + T4H = iio[WS(vs, 4)]; + T4I = iio[WS(vs, 4) + WS(rs, 3)]; + T4J = T4H - T4I; + T59 = T4H + T4I; + T4A = iio[WS(vs, 4) + WS(rs, 4)]; + T4B = iio[WS(vs, 4) + WS(rs, 1)]; + T4C = T4A - T4B; + T54 = T4A + T4B; + } + T4D = T4z - T4C; + T55 = T53 - T54; + T4K = T4z + T4C; + T4L = FNMS(KP500000000, T4K, T4J); + T5a = T53 + T54; + T5b = FNMS(KP500000000, T5a, T59); + } + { + E T5D, T67, T5G, T68, T5B, T5C; + T5B = iio[WS(vs, 5) + WS(rs, 2)]; + T5C = iio[WS(vs, 5) + WS(rs, 5)]; + T5D = T5B - T5C; + T67 = T5B + T5C; + { + E T5L, T5M, T5E, T5F; + T5L = iio[WS(vs, 5)]; + T5M = iio[WS(vs, 5) + WS(rs, 3)]; + T5N = T5L - T5M; + T6d = T5L + T5M; + T5E = iio[WS(vs, 5) + WS(rs, 4)]; + T5F = iio[WS(vs, 5) + WS(rs, 1)]; + T5G = T5E - T5F; + T68 = T5E + T5F; + } + T5H = T5D - T5G; + T69 = T67 - T68; + T5O = T5D + T5G; + T5P = FNMS(KP500000000, T5O, T5N); + T6e = T67 + T68; + T6f = FNMS(KP500000000, T6e, T6d); + } + { + E T5t, T5y, T5q, T5x, T5l, T5m; + T5l = rio[WS(vs, 5)]; + T5m = rio[WS(vs, 5) + WS(rs, 3)]; + T5n = T5l + T5m; + T5w = T5l - T5m; + { + E T5r, T5s, T5o, T5p; + T5r = rio[WS(vs, 5) + WS(rs, 4)]; + T5s = rio[WS(vs, 5) + WS(rs, 1)]; + T5t = T5r + T5s; + T5y = T5r - T5s; + T5o = rio[WS(vs, 5) + WS(rs, 2)]; + T5p = rio[WS(vs, 5) + WS(rs, 5)]; + T5q = T5o + T5p; + T5x = T5o - T5p; + } + T5Q = T5y - T5x; + T6g = T5t - T5q; + T5u = T5q + T5t; + T66 = FNMS(KP500000000, T5u, T5n); + T5z = T5x + T5y; + T5A = FNMS(KP500000000, T5z, T5w); + } + rio[0] = T3 + Ta; + iio[0] = TT + TU; + rio[WS(rs, 1)] = T17 + T1e; + iio[WS(rs, 1)] = T1X + T1Y; + rio[WS(rs, 2)] = T2b + T2i; + iio[WS(rs, 2)] = T31 + T32; + iio[WS(rs, 4)] = T59 + T5a; + rio[WS(rs, 4)] = T4j + T4q; + rio[WS(rs, 3)] = T3f + T3m; + iio[WS(rs, 3)] = T45 + T46; + rio[WS(rs, 5)] = T5n + T5u; + iio[WS(rs, 5)] = T6d + T6e; + { + E To, Tx, Tp, Ty, Tb, Tq; + To = FMA(KP866025403, Tn, Tg); + Tx = FMA(KP866025403, Tw, Tv); + Tb = W[0]; + Tp = Tb * To; + Ty = Tb * Tx; + Tq = W[1]; + rio[WS(vs, 1)] = FMA(Tq, Tx, Tp); + iio[WS(vs, 1)] = FNMS(Tq, To, Ty); + } + { + E TG, TJ, TH, TK, TF, TI; + TG = Tc + Tf; + TJ = Tt + Tu; + TF = W[4]; + TH = TF * TG; + TK = TF * TJ; + TI = W[5]; + rio[WS(vs, 3)] = FMA(TI, TJ, TH); + iio[WS(vs, 3)] = FNMS(TI, TG, TK); + } + { + E T10, T13, T11, T14, TZ, T12; + T10 = FMA(KP866025403, TP, TM); + T13 = FMA(KP866025403, TW, TV); + TZ = W[6]; + T11 = TZ * T10; + T14 = TZ * T13; + T12 = W[7]; + rio[WS(vs, 4)] = FMA(T12, T13, T11); + iio[WS(vs, 4)] = FNMS(T12, T10, T14); + } + { + E T60, T63, T61, T64, T5Z, T62; + T60 = T5w + T5z; + T63 = T5N + T5O; + T5Z = W[4]; + T61 = T5Z * T60; + T64 = T5Z * T63; + T62 = W[5]; + rio[WS(vs, 3) + WS(rs, 5)] = FMA(T62, T63, T61); + iio[WS(vs, 3) + WS(rs, 5)] = FNMS(T62, T60, T64); + } + { + E T6k, T6n, T6l, T6o, T6j, T6m; + T6k = FMA(KP866025403, T69, T66); + T6n = FMA(KP866025403, T6g, T6f); + T6j = W[6]; + T6l = T6j * T6k; + T6o = T6j * T6n; + T6m = W[7]; + rio[WS(vs, 4) + WS(rs, 5)] = FMA(T6m, T6n, T6l); + iio[WS(vs, 4) + WS(rs, 5)] = FNMS(T6m, T6k, T6o); + } + { + E TA, TD, TB, TE, Tz, TC; + TA = FNMS(KP866025403, Tn, Tg); + TD = FNMS(KP866025403, Tw, Tv); + Tz = W[8]; + TB = Tz * TA; + TE = Tz * TD; + TC = W[9]; + rio[WS(vs, 5)] = FMA(TC, TD, TB); + iio[WS(vs, 5)] = FNMS(TC, TA, TE); + } + { + E TQ, TX, TR, TY, TL, TS; + TQ = FNMS(KP866025403, TP, TM); + TX = FNMS(KP866025403, TW, TV); + TL = W[2]; + TR = TL * TQ; + TY = TL * TX; + TS = W[3]; + rio[WS(vs, 2)] = FMA(TS, TX, TR); + iio[WS(vs, 2)] = FNMS(TS, TQ, TY); + } + { + E T5U, T5X, T5V, T5Y, T5T, T5W; + T5U = FNMS(KP866025403, T5H, T5A); + T5X = FNMS(KP866025403, T5Q, T5P); + T5T = W[8]; + T5V = T5T * T5U; + T5Y = T5T * T5X; + T5W = W[9]; + rio[WS(vs, 5) + WS(rs, 5)] = FMA(T5W, T5X, T5V); + iio[WS(vs, 5) + WS(rs, 5)] = FNMS(T5W, T5U, T5Y); + } + { + E T6a, T6h, T6b, T6i, T65, T6c; + T6a = FNMS(KP866025403, T69, T66); + T6h = FNMS(KP866025403, T6g, T6f); + T65 = W[2]; + T6b = T65 * T6a; + T6i = T65 * T6h; + T6c = W[3]; + rio[WS(vs, 2) + WS(rs, 5)] = FMA(T6c, T6h, T6b); + iio[WS(vs, 2) + WS(rs, 5)] = FNMS(T6c, T6a, T6i); + } + { + E T5I, T5R, T5J, T5S, T5v, T5K; + T5I = FMA(KP866025403, T5H, T5A); + T5R = FMA(KP866025403, T5Q, T5P); + T5v = W[0]; + T5J = T5v * T5I; + T5S = T5v * T5R; + T5K = W[1]; + rio[WS(vs, 1) + WS(rs, 5)] = FMA(T5K, T5R, T5J); + iio[WS(vs, 1) + WS(rs, 5)] = FNMS(T5K, T5I, T5S); + } + { + E T1s, T1B, T1t, T1C, T1f, T1u; + T1s = FMA(KP866025403, T1r, T1k); + T1B = FMA(KP866025403, T1A, T1z); + T1f = W[0]; + T1t = T1f * T1s; + T1C = T1f * T1B; + T1u = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(T1u, T1B, T1t); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(T1u, T1s, T1C); + } + { + E T3S, T3V, T3T, T3W, T3R, T3U; + T3S = T3o + T3r; + T3V = T3F + T3G; + T3R = W[4]; + T3T = T3R * T3S; + T3W = T3R * T3V; + T3U = W[5]; + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T3U, T3V, T3T); + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T3U, T3S, T3W); + } + { + E T3A, T3J, T3B, T3K, T3n, T3C; + T3A = FMA(KP866025403, T3z, T3s); + T3J = FMA(KP866025403, T3I, T3H); + T3n = W[0]; + T3B = T3n * T3A; + T3K = T3n * T3J; + T3C = W[1]; + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T3C, T3J, T3B); + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T3C, T3A, T3K); + } + { + E T56, T5d, T57, T5e, T51, T58; + T56 = FNMS(KP866025403, T55, T52); + T5d = FNMS(KP866025403, T5c, T5b); + T51 = W[2]; + T57 = T51 * T56; + T5e = T51 * T5d; + T58 = W[3]; + rio[WS(vs, 2) + WS(rs, 4)] = FMA(T58, T5d, T57); + iio[WS(vs, 2) + WS(rs, 4)] = FNMS(T58, T56, T5e); + } + { + E T2Y, T35, T2Z, T36, T2T, T30; + T2Y = FNMS(KP866025403, T2X, T2U); + T35 = FNMS(KP866025403, T34, T33); + T2T = W[2]; + T2Z = T2T * T2Y; + T36 = T2T * T35; + T30 = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T30, T35, T2Z); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T30, T2Y, T36); + } + { + E T3M, T3P, T3N, T3Q, T3L, T3O; + T3M = FNMS(KP866025403, T3z, T3s); + T3P = FNMS(KP866025403, T3I, T3H); + T3L = W[8]; + T3N = T3L * T3M; + T3Q = T3L * T3P; + T3O = W[9]; + rio[WS(vs, 5) + WS(rs, 3)] = FMA(T3O, T3P, T3N); + iio[WS(vs, 5) + WS(rs, 3)] = FNMS(T3O, T3M, T3Q); + } + { + E T38, T3b, T39, T3c, T37, T3a; + T38 = FMA(KP866025403, T2X, T2U); + T3b = FMA(KP866025403, T34, T33); + T37 = W[6]; + T39 = T37 * T38; + T3c = T37 * T3b; + T3a = W[7]; + rio[WS(vs, 4) + WS(rs, 2)] = FMA(T3a, T3b, T39); + iio[WS(vs, 4) + WS(rs, 2)] = FNMS(T3a, T38, T3c); + } + { + E T1E, T1H, T1F, T1I, T1D, T1G; + T1E = FNMS(KP866025403, T1r, T1k); + T1H = FNMS(KP866025403, T1A, T1z); + T1D = W[8]; + T1F = T1D * T1E; + T1I = T1D * T1H; + T1G = W[9]; + rio[WS(vs, 5) + WS(rs, 1)] = FMA(T1G, T1H, T1F); + iio[WS(vs, 5) + WS(rs, 1)] = FNMS(T1G, T1E, T1I); + } + { + E T5g, T5j, T5h, T5k, T5f, T5i; + T5g = FMA(KP866025403, T55, T52); + T5j = FMA(KP866025403, T5c, T5b); + T5f = W[6]; + T5h = T5f * T5g; + T5k = T5f * T5j; + T5i = W[7]; + rio[WS(vs, 4) + WS(rs, 4)] = FMA(T5i, T5j, T5h); + iio[WS(vs, 4) + WS(rs, 4)] = FNMS(T5i, T5g, T5k); + } + { + E T1K, T1N, T1L, T1O, T1J, T1M; + T1K = T1g + T1j; + T1N = T1x + T1y; + T1J = W[4]; + T1L = T1J * T1K; + T1O = T1J * T1N; + T1M = W[5]; + rio[WS(vs, 3) + WS(rs, 1)] = FMA(T1M, T1N, T1L); + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(T1M, T1K, T1O); + } + { + E T4W, T4Z, T4X, T50, T4V, T4Y; + T4W = T4s + T4v; + T4Z = T4J + T4K; + T4V = W[4]; + T4X = T4V * T4W; + T50 = T4V * T4Z; + T4Y = W[5]; + rio[WS(vs, 3) + WS(rs, 4)] = FMA(T4Y, T4Z, T4X); + iio[WS(vs, 3) + WS(rs, 4)] = FNMS(T4Y, T4W, T50); + } + { + E T4E, T4N, T4F, T4O, T4r, T4G; + T4E = FMA(KP866025403, T4D, T4w); + T4N = FMA(KP866025403, T4M, T4L); + T4r = W[0]; + T4F = T4r * T4E; + T4O = T4r * T4N; + T4G = W[1]; + rio[WS(vs, 1) + WS(rs, 4)] = FMA(T4G, T4N, T4F); + iio[WS(vs, 1) + WS(rs, 4)] = FNMS(T4G, T4E, T4O); + } + { + E T2O, T2R, T2P, T2S, T2N, T2Q; + T2O = T2k + T2n; + T2R = T2B + T2C; + T2N = W[4]; + T2P = T2N * T2O; + T2S = T2N * T2R; + T2Q = W[5]; + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T2Q, T2R, T2P); + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T2Q, T2O, T2S); + } + { + E T2w, T2F, T2x, T2G, T2j, T2y; + T2w = FMA(KP866025403, T2v, T2o); + T2F = FMA(KP866025403, T2E, T2D); + T2j = W[0]; + T2x = T2j * T2w; + T2G = T2j * T2F; + T2y = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T2y, T2F, T2x); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T2y, T2w, T2G); + } + { + E T24, T27, T25, T28, T23, T26; + T24 = FMA(KP866025403, T1T, T1Q); + T27 = FMA(KP866025403, T20, T1Z); + T23 = W[6]; + T25 = T23 * T24; + T28 = T23 * T27; + T26 = W[7]; + rio[WS(vs, 4) + WS(rs, 1)] = FMA(T26, T27, T25); + iio[WS(vs, 4) + WS(rs, 1)] = FNMS(T26, T24, T28); + } + { + E T42, T49, T43, T4a, T3X, T44; + T42 = FNMS(KP866025403, T41, T3Y); + T49 = FNMS(KP866025403, T48, T47); + T3X = W[2]; + T43 = T3X * T42; + T4a = T3X * T49; + T44 = W[3]; + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T44, T49, T43); + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T44, T42, T4a); + } + { + E T2I, T2L, T2J, T2M, T2H, T2K; + T2I = FNMS(KP866025403, T2v, T2o); + T2L = FNMS(KP866025403, T2E, T2D); + T2H = W[8]; + T2J = T2H * T2I; + T2M = T2H * T2L; + T2K = W[9]; + rio[WS(vs, 5) + WS(rs, 2)] = FMA(T2K, T2L, T2J); + iio[WS(vs, 5) + WS(rs, 2)] = FNMS(T2K, T2I, T2M); + } + { + E T4Q, T4T, T4R, T4U, T4P, T4S; + T4Q = FNMS(KP866025403, T4D, T4w); + T4T = FNMS(KP866025403, T4M, T4L); + T4P = W[8]; + T4R = T4P * T4Q; + T4U = T4P * T4T; + T4S = W[9]; + rio[WS(vs, 5) + WS(rs, 4)] = FMA(T4S, T4T, T4R); + iio[WS(vs, 5) + WS(rs, 4)] = FNMS(T4S, T4Q, T4U); + } + { + E T1U, T21, T1V, T22, T1P, T1W; + T1U = FNMS(KP866025403, T1T, T1Q); + T21 = FNMS(KP866025403, T20, T1Z); + T1P = W[2]; + T1V = T1P * T1U; + T22 = T1P * T21; + T1W = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T1W, T21, T1V); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T1W, T1U, T22); + } + { + E T4c, T4f, T4d, T4g, T4b, T4e; + T4c = FMA(KP866025403, T41, T3Y); + T4f = FMA(KP866025403, T48, T47); + T4b = W[6]; + T4d = T4b * T4c; + T4g = T4b * T4f; + T4e = W[7]; + rio[WS(vs, 4) + WS(rs, 3)] = FMA(T4e, T4f, T4d); + iio[WS(vs, 4) + WS(rs, 3)] = FNMS(T4e, T4c, T4g); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 6}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 6, "q1_6", twinstr, &GENUS, {144, 60, 132, 0}, 0, 0, 0 }; + +void X(codelet_q1_6) (planner *p) { + X(kdft_difsq_register) (p, q1_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq.native -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 6 -name q1_6 -include dft/scalar/q.h */ + +/* + * This function contains 276 FP additions, 168 FP multiplications, + * (or, 192 additions, 84 multiplications, 84 fused multiply/add), + * 85 stack variables, 2 constants, and 144 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_6(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + (mb * 10); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T3, Tc, Tt, TM, TX, T16, T1n, T1G, T2h, T2A, T1R, T20, T2L, T2U, T3b; + E T3u, T3F, T3O, T45, T4o, T4Z, T5i, T4z, T4I, Ta, TP, Tf, Tq, Tn, TN; + E Tu, TJ, T14, T1J, T19, T1k, T1h, T1H, T1o, T1D, T2b, T2B, T2i, T2x, T1Y; + E T2D, T23, T2e, T2S, T3x, T2X, T38, T35, T3v, T3c, T3r, T3M, T4r, T3R, T42; + E T3Z, T4p, T46, T4l, T4T, T5j, T50, T5f, T4G, T5l, T4L, T4W; + { + E T1, T2, T1l, T1m; + T1 = rio[0]; + T2 = rio[WS(rs, 3)]; + T3 = T1 + T2; + Tc = T1 - T2; + { + E Tr, Ts, TV, TW; + Tr = iio[0]; + Ts = iio[WS(rs, 3)]; + Tt = Tr - Ts; + TM = Tr + Ts; + TV = rio[WS(vs, 1)]; + TW = rio[WS(vs, 1) + WS(rs, 3)]; + TX = TV + TW; + T16 = TV - TW; + } + T1l = iio[WS(vs, 1)]; + T1m = iio[WS(vs, 1) + WS(rs, 3)]; + T1n = T1l - T1m; + T1G = T1l + T1m; + { + E T2f, T2g, T1P, T1Q; + T2f = iio[WS(vs, 2)]; + T2g = iio[WS(vs, 2) + WS(rs, 3)]; + T2h = T2f - T2g; + T2A = T2f + T2g; + T1P = rio[WS(vs, 2)]; + T1Q = rio[WS(vs, 2) + WS(rs, 3)]; + T1R = T1P + T1Q; + T20 = T1P - T1Q; + } + } + { + E T2J, T2K, T43, T44; + T2J = rio[WS(vs, 3)]; + T2K = rio[WS(vs, 3) + WS(rs, 3)]; + T2L = T2J + T2K; + T2U = T2J - T2K; + { + E T39, T3a, T3D, T3E; + T39 = iio[WS(vs, 3)]; + T3a = iio[WS(vs, 3) + WS(rs, 3)]; + T3b = T39 - T3a; + T3u = T39 + T3a; + T3D = rio[WS(vs, 4)]; + T3E = rio[WS(vs, 4) + WS(rs, 3)]; + T3F = T3D + T3E; + T3O = T3D - T3E; + } + T43 = iio[WS(vs, 4)]; + T44 = iio[WS(vs, 4) + WS(rs, 3)]; + T45 = T43 - T44; + T4o = T43 + T44; + { + E T4X, T4Y, T4x, T4y; + T4X = iio[WS(vs, 5)]; + T4Y = iio[WS(vs, 5) + WS(rs, 3)]; + T4Z = T4X - T4Y; + T5i = T4X + T4Y; + T4x = rio[WS(vs, 5)]; + T4y = rio[WS(vs, 5) + WS(rs, 3)]; + T4z = T4x + T4y; + T4I = T4x - T4y; + } + } + { + E T6, Td, T9, Te; + { + E T4, T5, T7, T8; + T4 = rio[WS(rs, 2)]; + T5 = rio[WS(rs, 5)]; + T6 = T4 + T5; + Td = T4 - T5; + T7 = rio[WS(rs, 4)]; + T8 = rio[WS(rs, 1)]; + T9 = T7 + T8; + Te = T7 - T8; + } + Ta = T6 + T9; + TP = KP866025403 * (T9 - T6); + Tf = Td + Te; + Tq = KP866025403 * (Te - Td); + } + { + E Tj, TH, Tm, TI; + { + E Th, Ti, Tk, Tl; + Th = iio[WS(rs, 2)]; + Ti = iio[WS(rs, 5)]; + Tj = Th - Ti; + TH = Th + Ti; + Tk = iio[WS(rs, 4)]; + Tl = iio[WS(rs, 1)]; + Tm = Tk - Tl; + TI = Tk + Tl; + } + Tn = KP866025403 * (Tj - Tm); + TN = TH + TI; + Tu = Tj + Tm; + TJ = KP866025403 * (TH - TI); + } + { + E T10, T17, T13, T18; + { + E TY, TZ, T11, T12; + TY = rio[WS(vs, 1) + WS(rs, 2)]; + TZ = rio[WS(vs, 1) + WS(rs, 5)]; + T10 = TY + TZ; + T17 = TY - TZ; + T11 = rio[WS(vs, 1) + WS(rs, 4)]; + T12 = rio[WS(vs, 1) + WS(rs, 1)]; + T13 = T11 + T12; + T18 = T11 - T12; + } + T14 = T10 + T13; + T1J = KP866025403 * (T13 - T10); + T19 = T17 + T18; + T1k = KP866025403 * (T18 - T17); + } + { + E T1d, T1B, T1g, T1C; + { + E T1b, T1c, T1e, T1f; + T1b = iio[WS(vs, 1) + WS(rs, 2)]; + T1c = iio[WS(vs, 1) + WS(rs, 5)]; + T1d = T1b - T1c; + T1B = T1b + T1c; + T1e = iio[WS(vs, 1) + WS(rs, 4)]; + T1f = iio[WS(vs, 1) + WS(rs, 1)]; + T1g = T1e - T1f; + T1C = T1e + T1f; + } + T1h = KP866025403 * (T1d - T1g); + T1H = T1B + T1C; + T1o = T1d + T1g; + T1D = KP866025403 * (T1B - T1C); + } + { + E T27, T2v, T2a, T2w; + { + E T25, T26, T28, T29; + T25 = iio[WS(vs, 2) + WS(rs, 2)]; + T26 = iio[WS(vs, 2) + WS(rs, 5)]; + T27 = T25 - T26; + T2v = T25 + T26; + T28 = iio[WS(vs, 2) + WS(rs, 4)]; + T29 = iio[WS(vs, 2) + WS(rs, 1)]; + T2a = T28 - T29; + T2w = T28 + T29; + } + T2b = KP866025403 * (T27 - T2a); + T2B = T2v + T2w; + T2i = T27 + T2a; + T2x = KP866025403 * (T2v - T2w); + } + { + E T1U, T21, T1X, T22; + { + E T1S, T1T, T1V, T1W; + T1S = rio[WS(vs, 2) + WS(rs, 2)]; + T1T = rio[WS(vs, 2) + WS(rs, 5)]; + T1U = T1S + T1T; + T21 = T1S - T1T; + T1V = rio[WS(vs, 2) + WS(rs, 4)]; + T1W = rio[WS(vs, 2) + WS(rs, 1)]; + T1X = T1V + T1W; + T22 = T1V - T1W; + } + T1Y = T1U + T1X; + T2D = KP866025403 * (T1X - T1U); + T23 = T21 + T22; + T2e = KP866025403 * (T22 - T21); + } + { + E T2O, T2V, T2R, T2W; + { + E T2M, T2N, T2P, T2Q; + T2M = rio[WS(vs, 3) + WS(rs, 2)]; + T2N = rio[WS(vs, 3) + WS(rs, 5)]; + T2O = T2M + T2N; + T2V = T2M - T2N; + T2P = rio[WS(vs, 3) + WS(rs, 4)]; + T2Q = rio[WS(vs, 3) + WS(rs, 1)]; + T2R = T2P + T2Q; + T2W = T2P - T2Q; + } + T2S = T2O + T2R; + T3x = KP866025403 * (T2R - T2O); + T2X = T2V + T2W; + T38 = KP866025403 * (T2W - T2V); + } + { + E T31, T3p, T34, T3q; + { + E T2Z, T30, T32, T33; + T2Z = iio[WS(vs, 3) + WS(rs, 2)]; + T30 = iio[WS(vs, 3) + WS(rs, 5)]; + T31 = T2Z - T30; + T3p = T2Z + T30; + T32 = iio[WS(vs, 3) + WS(rs, 4)]; + T33 = iio[WS(vs, 3) + WS(rs, 1)]; + T34 = T32 - T33; + T3q = T32 + T33; + } + T35 = KP866025403 * (T31 - T34); + T3v = T3p + T3q; + T3c = T31 + T34; + T3r = KP866025403 * (T3p - T3q); + } + { + E T3I, T3P, T3L, T3Q; + { + E T3G, T3H, T3J, T3K; + T3G = rio[WS(vs, 4) + WS(rs, 2)]; + T3H = rio[WS(vs, 4) + WS(rs, 5)]; + T3I = T3G + T3H; + T3P = T3G - T3H; + T3J = rio[WS(vs, 4) + WS(rs, 4)]; + T3K = rio[WS(vs, 4) + WS(rs, 1)]; + T3L = T3J + T3K; + T3Q = T3J - T3K; + } + T3M = T3I + T3L; + T4r = KP866025403 * (T3L - T3I); + T3R = T3P + T3Q; + T42 = KP866025403 * (T3Q - T3P); + } + { + E T3V, T4j, T3Y, T4k; + { + E T3T, T3U, T3W, T3X; + T3T = iio[WS(vs, 4) + WS(rs, 2)]; + T3U = iio[WS(vs, 4) + WS(rs, 5)]; + T3V = T3T - T3U; + T4j = T3T + T3U; + T3W = iio[WS(vs, 4) + WS(rs, 4)]; + T3X = iio[WS(vs, 4) + WS(rs, 1)]; + T3Y = T3W - T3X; + T4k = T3W + T3X; + } + T3Z = KP866025403 * (T3V - T3Y); + T4p = T4j + T4k; + T46 = T3V + T3Y; + T4l = KP866025403 * (T4j - T4k); + } + { + E T4P, T5d, T4S, T5e; + { + E T4N, T4O, T4Q, T4R; + T4N = iio[WS(vs, 5) + WS(rs, 2)]; + T4O = iio[WS(vs, 5) + WS(rs, 5)]; + T4P = T4N - T4O; + T5d = T4N + T4O; + T4Q = iio[WS(vs, 5) + WS(rs, 4)]; + T4R = iio[WS(vs, 5) + WS(rs, 1)]; + T4S = T4Q - T4R; + T5e = T4Q + T4R; + } + T4T = KP866025403 * (T4P - T4S); + T5j = T5d + T5e; + T50 = T4P + T4S; + T5f = KP866025403 * (T5d - T5e); + } + { + E T4C, T4J, T4F, T4K; + { + E T4A, T4B, T4D, T4E; + T4A = rio[WS(vs, 5) + WS(rs, 2)]; + T4B = rio[WS(vs, 5) + WS(rs, 5)]; + T4C = T4A + T4B; + T4J = T4A - T4B; + T4D = rio[WS(vs, 5) + WS(rs, 4)]; + T4E = rio[WS(vs, 5) + WS(rs, 1)]; + T4F = T4D + T4E; + T4K = T4D - T4E; + } + T4G = T4C + T4F; + T5l = KP866025403 * (T4F - T4C); + T4L = T4J + T4K; + T4W = KP866025403 * (T4K - T4J); + } + rio[0] = T3 + Ta; + iio[0] = TM + TN; + rio[WS(rs, 1)] = TX + T14; + iio[WS(rs, 1)] = T1G + T1H; + rio[WS(rs, 3)] = T2L + T2S; + rio[WS(rs, 2)] = T1R + T1Y; + iio[WS(rs, 2)] = T2A + T2B; + iio[WS(rs, 3)] = T3u + T3v; + iio[WS(rs, 4)] = T4o + T4p; + iio[WS(rs, 5)] = T5i + T5j; + rio[WS(rs, 5)] = T4z + T4G; + rio[WS(rs, 4)] = T3F + T3M; + { + E T1w, T1y, T1v, T1x; + T1w = T16 + T19; + T1y = T1n + T1o; + T1v = W[4]; + T1x = W[5]; + rio[WS(vs, 3) + WS(rs, 1)] = FMA(T1v, T1w, T1x * T1y); + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(T1x, T1w, T1v * T1y); + } + { + E T58, T5a, T57, T59; + T58 = T4I + T4L; + T5a = T4Z + T50; + T57 = W[4]; + T59 = W[5]; + rio[WS(vs, 3) + WS(rs, 5)] = FMA(T57, T58, T59 * T5a); + iio[WS(vs, 3) + WS(rs, 5)] = FNMS(T59, T58, T57 * T5a); + } + { + E TC, TE, TB, TD; + TC = Tc + Tf; + TE = Tt + Tu; + TB = W[4]; + TD = W[5]; + rio[WS(vs, 3)] = FMA(TB, TC, TD * TE); + iio[WS(vs, 3)] = FNMS(TD, TC, TB * TE); + } + { + E T4e, T4g, T4d, T4f; + T4e = T3O + T3R; + T4g = T45 + T46; + T4d = W[4]; + T4f = W[5]; + rio[WS(vs, 3) + WS(rs, 4)] = FMA(T4d, T4e, T4f * T4g); + iio[WS(vs, 3) + WS(rs, 4)] = FNMS(T4f, T4e, T4d * T4g); + } + { + E T3k, T3m, T3j, T3l; + T3k = T2U + T2X; + T3m = T3b + T3c; + T3j = W[4]; + T3l = W[5]; + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T3j, T3k, T3l * T3m); + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T3l, T3k, T3j * T3m); + } + { + E T2q, T2s, T2p, T2r; + T2q = T20 + T23; + T2s = T2h + T2i; + T2p = W[4]; + T2r = W[5]; + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T2p, T2q, T2r * T2s); + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T2r, T2q, T2p * T2s); + } + { + E T5g, T5o, T5m, T5q, T5c, T5k; + T5c = FNMS(KP500000000, T4G, T4z); + T5g = T5c - T5f; + T5o = T5c + T5f; + T5k = FNMS(KP500000000, T5j, T5i); + T5m = T5k - T5l; + T5q = T5l + T5k; + { + E T5b, T5h, T5n, T5p; + T5b = W[2]; + T5h = W[3]; + rio[WS(vs, 2) + WS(rs, 5)] = FMA(T5b, T5g, T5h * T5m); + iio[WS(vs, 2) + WS(rs, 5)] = FNMS(T5h, T5g, T5b * T5m); + T5n = W[6]; + T5p = W[7]; + rio[WS(vs, 4) + WS(rs, 5)] = FMA(T5n, T5o, T5p * T5q); + iio[WS(vs, 4) + WS(rs, 5)] = FNMS(T5p, T5o, T5n * T5q); + } + } + { + E To, Ty, Tw, TA, Tg, Tv; + Tg = FNMS(KP500000000, Tf, Tc); + To = Tg + Tn; + Ty = Tg - Tn; + Tv = FNMS(KP500000000, Tu, Tt); + Tw = Tq + Tv; + TA = Tv - Tq; + { + E Tb, Tp, Tx, Tz; + Tb = W[0]; + Tp = W[1]; + rio[WS(vs, 1)] = FMA(Tb, To, Tp * Tw); + iio[WS(vs, 1)] = FNMS(Tp, To, Tb * Tw); + Tx = W[8]; + Tz = W[9]; + rio[WS(vs, 5)] = FMA(Tx, Ty, Tz * TA); + iio[WS(vs, 5)] = FNMS(Tz, Ty, Tx * TA); + } + } + { + E T36, T3g, T3e, T3i, T2Y, T3d; + T2Y = FNMS(KP500000000, T2X, T2U); + T36 = T2Y + T35; + T3g = T2Y - T35; + T3d = FNMS(KP500000000, T3c, T3b); + T3e = T38 + T3d; + T3i = T3d - T38; + { + E T2T, T37, T3f, T3h; + T2T = W[0]; + T37 = W[1]; + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T2T, T36, T37 * T3e); + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T37, T36, T2T * T3e); + T3f = W[8]; + T3h = W[9]; + rio[WS(vs, 5) + WS(rs, 3)] = FMA(T3f, T3g, T3h * T3i); + iio[WS(vs, 5) + WS(rs, 3)] = FNMS(T3h, T3g, T3f * T3i); + } + } + { + E T2y, T2G, T2E, T2I, T2u, T2C; + T2u = FNMS(KP500000000, T1Y, T1R); + T2y = T2u - T2x; + T2G = T2u + T2x; + T2C = FNMS(KP500000000, T2B, T2A); + T2E = T2C - T2D; + T2I = T2D + T2C; + { + E T2t, T2z, T2F, T2H; + T2t = W[2]; + T2z = W[3]; + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T2t, T2y, T2z * T2E); + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T2z, T2y, T2t * T2E); + T2F = W[6]; + T2H = W[7]; + rio[WS(vs, 4) + WS(rs, 2)] = FMA(T2F, T2G, T2H * T2I); + iio[WS(vs, 4) + WS(rs, 2)] = FNMS(T2H, T2G, T2F * T2I); + } + } + { + E T3s, T3A, T3y, T3C, T3o, T3w; + T3o = FNMS(KP500000000, T2S, T2L); + T3s = T3o - T3r; + T3A = T3o + T3r; + T3w = FNMS(KP500000000, T3v, T3u); + T3y = T3w - T3x; + T3C = T3x + T3w; + { + E T3n, T3t, T3z, T3B; + T3n = W[2]; + T3t = W[3]; + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T3n, T3s, T3t * T3y); + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T3t, T3s, T3n * T3y); + T3z = W[6]; + T3B = W[7]; + rio[WS(vs, 4) + WS(rs, 3)] = FMA(T3z, T3A, T3B * T3C); + iio[WS(vs, 4) + WS(rs, 3)] = FNMS(T3B, T3A, T3z * T3C); + } + } + { + E T1E, T1M, T1K, T1O, T1A, T1I; + T1A = FNMS(KP500000000, T14, TX); + T1E = T1A - T1D; + T1M = T1A + T1D; + T1I = FNMS(KP500000000, T1H, T1G); + T1K = T1I - T1J; + T1O = T1J + T1I; + { + E T1z, T1F, T1L, T1N; + T1z = W[2]; + T1F = W[3]; + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T1z, T1E, T1F * T1K); + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T1F, T1E, T1z * T1K); + T1L = W[6]; + T1N = W[7]; + rio[WS(vs, 4) + WS(rs, 1)] = FMA(T1L, T1M, T1N * T1O); + iio[WS(vs, 4) + WS(rs, 1)] = FNMS(T1N, T1M, T1L * T1O); + } + } + { + E T4m, T4u, T4s, T4w, T4i, T4q; + T4i = FNMS(KP500000000, T3M, T3F); + T4m = T4i - T4l; + T4u = T4i + T4l; + T4q = FNMS(KP500000000, T4p, T4o); + T4s = T4q - T4r; + T4w = T4r + T4q; + { + E T4h, T4n, T4t, T4v; + T4h = W[2]; + T4n = W[3]; + rio[WS(vs, 2) + WS(rs, 4)] = FMA(T4h, T4m, T4n * T4s); + iio[WS(vs, 2) + WS(rs, 4)] = FNMS(T4n, T4m, T4h * T4s); + T4t = W[6]; + T4v = W[7]; + rio[WS(vs, 4) + WS(rs, 4)] = FMA(T4t, T4u, T4v * T4w); + iio[WS(vs, 4) + WS(rs, 4)] = FNMS(T4v, T4u, T4t * T4w); + } + } + { + E TK, TS, TQ, TU, TG, TO; + TG = FNMS(KP500000000, Ta, T3); + TK = TG - TJ; + TS = TG + TJ; + TO = FNMS(KP500000000, TN, TM); + TQ = TO - TP; + TU = TP + TO; + { + E TF, TL, TR, TT; + TF = W[2]; + TL = W[3]; + rio[WS(vs, 2)] = FMA(TF, TK, TL * TQ); + iio[WS(vs, 2)] = FNMS(TL, TK, TF * TQ); + TR = W[6]; + TT = W[7]; + rio[WS(vs, 4)] = FMA(TR, TS, TT * TU); + iio[WS(vs, 4)] = FNMS(TT, TS, TR * TU); + } + } + { + E T2c, T2m, T2k, T2o, T24, T2j; + T24 = FNMS(KP500000000, T23, T20); + T2c = T24 + T2b; + T2m = T24 - T2b; + T2j = FNMS(KP500000000, T2i, T2h); + T2k = T2e + T2j; + T2o = T2j - T2e; + { + E T1Z, T2d, T2l, T2n; + T1Z = W[0]; + T2d = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T1Z, T2c, T2d * T2k); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T2d, T2c, T1Z * T2k); + T2l = W[8]; + T2n = W[9]; + rio[WS(vs, 5) + WS(rs, 2)] = FMA(T2l, T2m, T2n * T2o); + iio[WS(vs, 5) + WS(rs, 2)] = FNMS(T2n, T2m, T2l * T2o); + } + } + { + E T40, T4a, T48, T4c, T3S, T47; + T3S = FNMS(KP500000000, T3R, T3O); + T40 = T3S + T3Z; + T4a = T3S - T3Z; + T47 = FNMS(KP500000000, T46, T45); + T48 = T42 + T47; + T4c = T47 - T42; + { + E T3N, T41, T49, T4b; + T3N = W[0]; + T41 = W[1]; + rio[WS(vs, 1) + WS(rs, 4)] = FMA(T3N, T40, T41 * T48); + iio[WS(vs, 1) + WS(rs, 4)] = FNMS(T41, T40, T3N * T48); + T49 = W[8]; + T4b = W[9]; + rio[WS(vs, 5) + WS(rs, 4)] = FMA(T49, T4a, T4b * T4c); + iio[WS(vs, 5) + WS(rs, 4)] = FNMS(T4b, T4a, T49 * T4c); + } + } + { + E T1i, T1s, T1q, T1u, T1a, T1p; + T1a = FNMS(KP500000000, T19, T16); + T1i = T1a + T1h; + T1s = T1a - T1h; + T1p = FNMS(KP500000000, T1o, T1n); + T1q = T1k + T1p; + T1u = T1p - T1k; + { + E T15, T1j, T1r, T1t; + T15 = W[0]; + T1j = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(T15, T1i, T1j * T1q); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(T1j, T1i, T15 * T1q); + T1r = W[8]; + T1t = W[9]; + rio[WS(vs, 5) + WS(rs, 1)] = FMA(T1r, T1s, T1t * T1u); + iio[WS(vs, 5) + WS(rs, 1)] = FNMS(T1t, T1s, T1r * T1u); + } + } + { + E T4U, T54, T52, T56, T4M, T51; + T4M = FNMS(KP500000000, T4L, T4I); + T4U = T4M + T4T; + T54 = T4M - T4T; + T51 = FNMS(KP500000000, T50, T4Z); + T52 = T4W + T51; + T56 = T51 - T4W; + { + E T4H, T4V, T53, T55; + T4H = W[0]; + T4V = W[1]; + rio[WS(vs, 1) + WS(rs, 5)] = FMA(T4H, T4U, T4V * T52); + iio[WS(vs, 1) + WS(rs, 5)] = FNMS(T4V, T4U, T4H * T52); + T53 = W[8]; + T55 = W[9]; + rio[WS(vs, 5) + WS(rs, 5)] = FMA(T53, T54, T55 * T56); + iio[WS(vs, 5) + WS(rs, 5)] = FNMS(T55, T54, T53 * T56); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 6}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 6, "q1_6", twinstr, &GENUS, {192, 84, 84, 0}, 0, 0, 0 }; + +void X(codelet_q1_6) (planner *p) { + X(kdft_difsq_register) (p, q1_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_8.c new file mode 100644 index 000000000..5ab5c0883 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/q1_8.c @@ -0,0 +1,2355 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:30 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq.native -fma -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 8 -name q1_8 -include dft/scalar/q.h */ + +/* + * This function contains 528 FP additions, 288 FP multiplications, + * (or, 352 additions, 112 multiplications, 176 fused multiply/add), + * 152 stack variables, 1 constants, and 256 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_8(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 14); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T7, T1d, T1t, Tk, TD, TV, T18, TQ, T4F, T5L, T61, T4S, T5b, T5t, T5G; + E T5o, T6b, T7h, T7x, T6o, T6H, T6Z, T7c, T6U, TaJ, TbP, Tc5, TaW, Tbf, Tbx; + E TbK, Tbs, T1D, T2J, T2Z, T1Q, T29, T2r, T2E, T2m, T39, T4f, T4v, T3m, T3F; + E T3X, T4a, T3S, T7H, T8N, T93, T7U, T8d, T8v, T8I, T8q, T9d, Taj, Taz, T9q; + E T9J, Ta1, Tae, T9W, Te, T19, T1u, T1g, TE, TF, TW, Tv, TR, T4M, T5H; + E T62, T5O, T5c, T5d, T5u, T53, T5p, T6i, T7d, T7y, T7k, T6I, T6J, T70, T6z; + E T6V, TaQ, TbL, Tc6, TbS, Tbg, Tbh, Tby, Tb7, Tbt, T1K, T2F, T30, T2M, T2a; + E T2b, T2s, T21, T2n, T3g, T4b, T4w, T4i, T3G, T3H, T3Y, T3x, T3T, T7O, T8J; + E T94, T8Q, T8e, T8f, T8w, T85, T8r, T9k, Taf, TaA, Tam, T9K, T9L, Ta2, T9B; + E T9X; + { + E T3, Tz, Tj, T16, T6, Tg, TC, T17; + { + E T1, T2, Th, Ti; + T1 = rio[0]; + T2 = rio[WS(rs, 4)]; + T3 = T1 + T2; + Tz = T1 - T2; + Th = iio[0]; + Ti = iio[WS(rs, 4)]; + Tj = Th - Ti; + T16 = Th + Ti; + } + { + E T4, T5, TA, TB; + T4 = rio[WS(rs, 2)]; + T5 = rio[WS(rs, 6)]; + T6 = T4 + T5; + Tg = T4 - T5; + TA = iio[WS(rs, 2)]; + TB = iio[WS(rs, 6)]; + TC = TA - TB; + T17 = TA + TB; + } + T7 = T3 + T6; + T1d = T3 - T6; + T1t = T16 + T17; + Tk = Tg + Tj; + TD = Tz - TC; + TV = Tj - Tg; + T18 = T16 - T17; + TQ = Tz + TC; + } + { + E T4B, T57, T4R, T5E, T4E, T4O, T5a, T5F; + { + E T4z, T4A, T4P, T4Q; + T4z = rio[WS(vs, 3)]; + T4A = rio[WS(vs, 3) + WS(rs, 4)]; + T4B = T4z + T4A; + T57 = T4z - T4A; + T4P = iio[WS(vs, 3)]; + T4Q = iio[WS(vs, 3) + WS(rs, 4)]; + T4R = T4P - T4Q; + T5E = T4P + T4Q; + } + { + E T4C, T4D, T58, T59; + T4C = rio[WS(vs, 3) + WS(rs, 2)]; + T4D = rio[WS(vs, 3) + WS(rs, 6)]; + T4E = T4C + T4D; + T4O = T4C - T4D; + T58 = iio[WS(vs, 3) + WS(rs, 2)]; + T59 = iio[WS(vs, 3) + WS(rs, 6)]; + T5a = T58 - T59; + T5F = T58 + T59; + } + T4F = T4B + T4E; + T5L = T4B - T4E; + T61 = T5E + T5F; + T4S = T4O + T4R; + T5b = T57 - T5a; + T5t = T4R - T4O; + T5G = T5E - T5F; + T5o = T57 + T5a; + } + { + E T67, T6D, T6n, T7a, T6a, T6k, T6G, T7b; + { + E T65, T66, T6l, T6m; + T65 = rio[WS(vs, 4)]; + T66 = rio[WS(vs, 4) + WS(rs, 4)]; + T67 = T65 + T66; + T6D = T65 - T66; + T6l = iio[WS(vs, 4)]; + T6m = iio[WS(vs, 4) + WS(rs, 4)]; + T6n = T6l - T6m; + T7a = T6l + T6m; + } + { + E T68, T69, T6E, T6F; + T68 = rio[WS(vs, 4) + WS(rs, 2)]; + T69 = rio[WS(vs, 4) + WS(rs, 6)]; + T6a = T68 + T69; + T6k = T68 - T69; + T6E = iio[WS(vs, 4) + WS(rs, 2)]; + T6F = iio[WS(vs, 4) + WS(rs, 6)]; + T6G = T6E - T6F; + T7b = T6E + T6F; + } + T6b = T67 + T6a; + T7h = T67 - T6a; + T7x = T7a + T7b; + T6o = T6k + T6n; + T6H = T6D - T6G; + T6Z = T6n - T6k; + T7c = T7a - T7b; + T6U = T6D + T6G; + } + { + E TaF, Tbb, TaV, TbI, TaI, TaS, Tbe, TbJ; + { + E TaD, TaE, TaT, TaU; + TaD = rio[WS(vs, 7)]; + TaE = rio[WS(vs, 7) + WS(rs, 4)]; + TaF = TaD + TaE; + Tbb = TaD - TaE; + TaT = iio[WS(vs, 7)]; + TaU = iio[WS(vs, 7) + WS(rs, 4)]; + TaV = TaT - TaU; + TbI = TaT + TaU; + } + { + E TaG, TaH, Tbc, Tbd; + TaG = rio[WS(vs, 7) + WS(rs, 2)]; + TaH = rio[WS(vs, 7) + WS(rs, 6)]; + TaI = TaG + TaH; + TaS = TaG - TaH; + Tbc = iio[WS(vs, 7) + WS(rs, 2)]; + Tbd = iio[WS(vs, 7) + WS(rs, 6)]; + Tbe = Tbc - Tbd; + TbJ = Tbc + Tbd; + } + TaJ = TaF + TaI; + TbP = TaF - TaI; + Tc5 = TbI + TbJ; + TaW = TaS + TaV; + Tbf = Tbb - Tbe; + Tbx = TaV - TaS; + TbK = TbI - TbJ; + Tbs = Tbb + Tbe; + } + { + E T1z, T25, T1P, T2C, T1C, T1M, T28, T2D; + { + E T1x, T1y, T1N, T1O; + T1x = rio[WS(vs, 1)]; + T1y = rio[WS(vs, 1) + WS(rs, 4)]; + T1z = T1x + T1y; + T25 = T1x - T1y; + T1N = iio[WS(vs, 1)]; + T1O = iio[WS(vs, 1) + WS(rs, 4)]; + T1P = T1N - T1O; + T2C = T1N + T1O; + } + { + E T1A, T1B, T26, T27; + T1A = rio[WS(vs, 1) + WS(rs, 2)]; + T1B = rio[WS(vs, 1) + WS(rs, 6)]; + T1C = T1A + T1B; + T1M = T1A - T1B; + T26 = iio[WS(vs, 1) + WS(rs, 2)]; + T27 = iio[WS(vs, 1) + WS(rs, 6)]; + T28 = T26 - T27; + T2D = T26 + T27; + } + T1D = T1z + T1C; + T2J = T1z - T1C; + T2Z = T2C + T2D; + T1Q = T1M + T1P; + T29 = T25 - T28; + T2r = T1P - T1M; + T2E = T2C - T2D; + T2m = T25 + T28; + } + { + E T35, T3B, T3l, T48, T38, T3i, T3E, T49; + { + E T33, T34, T3j, T3k; + T33 = rio[WS(vs, 2)]; + T34 = rio[WS(vs, 2) + WS(rs, 4)]; + T35 = T33 + T34; + T3B = T33 - T34; + T3j = iio[WS(vs, 2)]; + T3k = iio[WS(vs, 2) + WS(rs, 4)]; + T3l = T3j - T3k; + T48 = T3j + T3k; + } + { + E T36, T37, T3C, T3D; + T36 = rio[WS(vs, 2) + WS(rs, 2)]; + T37 = rio[WS(vs, 2) + WS(rs, 6)]; + T38 = T36 + T37; + T3i = T36 - T37; + T3C = iio[WS(vs, 2) + WS(rs, 2)]; + T3D = iio[WS(vs, 2) + WS(rs, 6)]; + T3E = T3C - T3D; + T49 = T3C + T3D; + } + T39 = T35 + T38; + T4f = T35 - T38; + T4v = T48 + T49; + T3m = T3i + T3l; + T3F = T3B - T3E; + T3X = T3l - T3i; + T4a = T48 - T49; + T3S = T3B + T3E; + } + { + E T7D, T89, T7T, T8G, T7G, T7Q, T8c, T8H; + { + E T7B, T7C, T7R, T7S; + T7B = rio[WS(vs, 5)]; + T7C = rio[WS(vs, 5) + WS(rs, 4)]; + T7D = T7B + T7C; + T89 = T7B - T7C; + T7R = iio[WS(vs, 5)]; + T7S = iio[WS(vs, 5) + WS(rs, 4)]; + T7T = T7R - T7S; + T8G = T7R + T7S; + } + { + E T7E, T7F, T8a, T8b; + T7E = rio[WS(vs, 5) + WS(rs, 2)]; + T7F = rio[WS(vs, 5) + WS(rs, 6)]; + T7G = T7E + T7F; + T7Q = T7E - T7F; + T8a = iio[WS(vs, 5) + WS(rs, 2)]; + T8b = iio[WS(vs, 5) + WS(rs, 6)]; + T8c = T8a - T8b; + T8H = T8a + T8b; + } + T7H = T7D + T7G; + T8N = T7D - T7G; + T93 = T8G + T8H; + T7U = T7Q + T7T; + T8d = T89 - T8c; + T8v = T7T - T7Q; + T8I = T8G - T8H; + T8q = T89 + T8c; + } + { + E T99, T9F, T9p, Tac, T9c, T9m, T9I, Tad; + { + E T97, T98, T9n, T9o; + T97 = rio[WS(vs, 6)]; + T98 = rio[WS(vs, 6) + WS(rs, 4)]; + T99 = T97 + T98; + T9F = T97 - T98; + T9n = iio[WS(vs, 6)]; + T9o = iio[WS(vs, 6) + WS(rs, 4)]; + T9p = T9n - T9o; + Tac = T9n + T9o; + } + { + E T9a, T9b, T9G, T9H; + T9a = rio[WS(vs, 6) + WS(rs, 2)]; + T9b = rio[WS(vs, 6) + WS(rs, 6)]; + T9c = T9a + T9b; + T9m = T9a - T9b; + T9G = iio[WS(vs, 6) + WS(rs, 2)]; + T9H = iio[WS(vs, 6) + WS(rs, 6)]; + T9I = T9G - T9H; + Tad = T9G + T9H; + } + T9d = T99 + T9c; + Taj = T99 - T9c; + Taz = Tac + Tad; + T9q = T9m + T9p; + T9J = T9F - T9I; + Ta1 = T9p - T9m; + Tae = Tac - Tad; + T9W = T9F + T9I; + } + { + E Ta, Tq, Tt, T1e, Td, Tl, To, T1f, Tp, Tu; + { + E T8, T9, Tr, Ts; + T8 = rio[WS(rs, 1)]; + T9 = rio[WS(rs, 5)]; + Ta = T8 + T9; + Tq = T8 - T9; + Tr = iio[WS(rs, 1)]; + Ts = iio[WS(rs, 5)]; + Tt = Tr - Ts; + T1e = Tr + Ts; + } + { + E Tb, Tc, Tm, Tn; + Tb = rio[WS(rs, 7)]; + Tc = rio[WS(rs, 3)]; + Td = Tb + Tc; + Tl = Tb - Tc; + Tm = iio[WS(rs, 7)]; + Tn = iio[WS(rs, 3)]; + To = Tm - Tn; + T1f = Tm + Tn; + } + Te = Ta + Td; + T19 = Td - Ta; + T1u = T1e + T1f; + T1g = T1e - T1f; + TE = Tt - Tq; + TF = Tl + To; + TW = TE + TF; + Tp = Tl - To; + Tu = Tq + Tt; + Tv = Tp - Tu; + TR = Tu + Tp; + } + { + E T4I, T4Y, T51, T5M, T4L, T4T, T4W, T5N, T4X, T52; + { + E T4G, T4H, T4Z, T50; + T4G = rio[WS(vs, 3) + WS(rs, 1)]; + T4H = rio[WS(vs, 3) + WS(rs, 5)]; + T4I = T4G + T4H; + T4Y = T4G - T4H; + T4Z = iio[WS(vs, 3) + WS(rs, 1)]; + T50 = iio[WS(vs, 3) + WS(rs, 5)]; + T51 = T4Z - T50; + T5M = T4Z + T50; + } + { + E T4J, T4K, T4U, T4V; + T4J = rio[WS(vs, 3) + WS(rs, 7)]; + T4K = rio[WS(vs, 3) + WS(rs, 3)]; + T4L = T4J + T4K; + T4T = T4J - T4K; + T4U = iio[WS(vs, 3) + WS(rs, 7)]; + T4V = iio[WS(vs, 3) + WS(rs, 3)]; + T4W = T4U - T4V; + T5N = T4U + T4V; + } + T4M = T4I + T4L; + T5H = T4L - T4I; + T62 = T5M + T5N; + T5O = T5M - T5N; + T5c = T51 - T4Y; + T5d = T4T + T4W; + T5u = T5c + T5d; + T4X = T4T - T4W; + T52 = T4Y + T51; + T53 = T4X - T52; + T5p = T52 + T4X; + } + { + E T6e, T6u, T6x, T7i, T6h, T6p, T6s, T7j, T6t, T6y; + { + E T6c, T6d, T6v, T6w; + T6c = rio[WS(vs, 4) + WS(rs, 1)]; + T6d = rio[WS(vs, 4) + WS(rs, 5)]; + T6e = T6c + T6d; + T6u = T6c - T6d; + T6v = iio[WS(vs, 4) + WS(rs, 1)]; + T6w = iio[WS(vs, 4) + WS(rs, 5)]; + T6x = T6v - T6w; + T7i = T6v + T6w; + } + { + E T6f, T6g, T6q, T6r; + T6f = rio[WS(vs, 4) + WS(rs, 7)]; + T6g = rio[WS(vs, 4) + WS(rs, 3)]; + T6h = T6f + T6g; + T6p = T6f - T6g; + T6q = iio[WS(vs, 4) + WS(rs, 7)]; + T6r = iio[WS(vs, 4) + WS(rs, 3)]; + T6s = T6q - T6r; + T7j = T6q + T6r; + } + T6i = T6e + T6h; + T7d = T6h - T6e; + T7y = T7i + T7j; + T7k = T7i - T7j; + T6I = T6x - T6u; + T6J = T6p + T6s; + T70 = T6I + T6J; + T6t = T6p - T6s; + T6y = T6u + T6x; + T6z = T6t - T6y; + T6V = T6y + T6t; + } + { + E TaM, Tb2, Tb5, TbQ, TaP, TaX, Tb0, TbR, Tb1, Tb6; + { + E TaK, TaL, Tb3, Tb4; + TaK = rio[WS(vs, 7) + WS(rs, 1)]; + TaL = rio[WS(vs, 7) + WS(rs, 5)]; + TaM = TaK + TaL; + Tb2 = TaK - TaL; + Tb3 = iio[WS(vs, 7) + WS(rs, 1)]; + Tb4 = iio[WS(vs, 7) + WS(rs, 5)]; + Tb5 = Tb3 - Tb4; + TbQ = Tb3 + Tb4; + } + { + E TaN, TaO, TaY, TaZ; + TaN = rio[WS(vs, 7) + WS(rs, 7)]; + TaO = rio[WS(vs, 7) + WS(rs, 3)]; + TaP = TaN + TaO; + TaX = TaN - TaO; + TaY = iio[WS(vs, 7) + WS(rs, 7)]; + TaZ = iio[WS(vs, 7) + WS(rs, 3)]; + Tb0 = TaY - TaZ; + TbR = TaY + TaZ; + } + TaQ = TaM + TaP; + TbL = TaP - TaM; + Tc6 = TbQ + TbR; + TbS = TbQ - TbR; + Tbg = Tb5 - Tb2; + Tbh = TaX + Tb0; + Tby = Tbg + Tbh; + Tb1 = TaX - Tb0; + Tb6 = Tb2 + Tb5; + Tb7 = Tb1 - Tb6; + Tbt = Tb6 + Tb1; + } + { + E T1G, T1W, T1Z, T2K, T1J, T1R, T1U, T2L, T1V, T20; + { + E T1E, T1F, T1X, T1Y; + T1E = rio[WS(vs, 1) + WS(rs, 1)]; + T1F = rio[WS(vs, 1) + WS(rs, 5)]; + T1G = T1E + T1F; + T1W = T1E - T1F; + T1X = iio[WS(vs, 1) + WS(rs, 1)]; + T1Y = iio[WS(vs, 1) + WS(rs, 5)]; + T1Z = T1X - T1Y; + T2K = T1X + T1Y; + } + { + E T1H, T1I, T1S, T1T; + T1H = rio[WS(vs, 1) + WS(rs, 7)]; + T1I = rio[WS(vs, 1) + WS(rs, 3)]; + T1J = T1H + T1I; + T1R = T1H - T1I; + T1S = iio[WS(vs, 1) + WS(rs, 7)]; + T1T = iio[WS(vs, 1) + WS(rs, 3)]; + T1U = T1S - T1T; + T2L = T1S + T1T; + } + T1K = T1G + T1J; + T2F = T1J - T1G; + T30 = T2K + T2L; + T2M = T2K - T2L; + T2a = T1Z - T1W; + T2b = T1R + T1U; + T2s = T2a + T2b; + T1V = T1R - T1U; + T20 = T1W + T1Z; + T21 = T1V - T20; + T2n = T20 + T1V; + } + { + E T3c, T3s, T3v, T4g, T3f, T3n, T3q, T4h, T3r, T3w; + { + E T3a, T3b, T3t, T3u; + T3a = rio[WS(vs, 2) + WS(rs, 1)]; + T3b = rio[WS(vs, 2) + WS(rs, 5)]; + T3c = T3a + T3b; + T3s = T3a - T3b; + T3t = iio[WS(vs, 2) + WS(rs, 1)]; + T3u = iio[WS(vs, 2) + WS(rs, 5)]; + T3v = T3t - T3u; + T4g = T3t + T3u; + } + { + E T3d, T3e, T3o, T3p; + T3d = rio[WS(vs, 2) + WS(rs, 7)]; + T3e = rio[WS(vs, 2) + WS(rs, 3)]; + T3f = T3d + T3e; + T3n = T3d - T3e; + T3o = iio[WS(vs, 2) + WS(rs, 7)]; + T3p = iio[WS(vs, 2) + WS(rs, 3)]; + T3q = T3o - T3p; + T4h = T3o + T3p; + } + T3g = T3c + T3f; + T4b = T3f - T3c; + T4w = T4g + T4h; + T4i = T4g - T4h; + T3G = T3v - T3s; + T3H = T3n + T3q; + T3Y = T3G + T3H; + T3r = T3n - T3q; + T3w = T3s + T3v; + T3x = T3r - T3w; + T3T = T3w + T3r; + } + { + E T7K, T80, T83, T8O, T7N, T7V, T7Y, T8P, T7Z, T84; + { + E T7I, T7J, T81, T82; + T7I = rio[WS(vs, 5) + WS(rs, 1)]; + T7J = rio[WS(vs, 5) + WS(rs, 5)]; + T7K = T7I + T7J; + T80 = T7I - T7J; + T81 = iio[WS(vs, 5) + WS(rs, 1)]; + T82 = iio[WS(vs, 5) + WS(rs, 5)]; + T83 = T81 - T82; + T8O = T81 + T82; + } + { + E T7L, T7M, T7W, T7X; + T7L = rio[WS(vs, 5) + WS(rs, 7)]; + T7M = rio[WS(vs, 5) + WS(rs, 3)]; + T7N = T7L + T7M; + T7V = T7L - T7M; + T7W = iio[WS(vs, 5) + WS(rs, 7)]; + T7X = iio[WS(vs, 5) + WS(rs, 3)]; + T7Y = T7W - T7X; + T8P = T7W + T7X; + } + T7O = T7K + T7N; + T8J = T7N - T7K; + T94 = T8O + T8P; + T8Q = T8O - T8P; + T8e = T83 - T80; + T8f = T7V + T7Y; + T8w = T8e + T8f; + T7Z = T7V - T7Y; + T84 = T80 + T83; + T85 = T7Z - T84; + T8r = T84 + T7Z; + } + { + E T9g, T9w, T9z, Tak, T9j, T9r, T9u, Tal, T9v, T9A; + { + E T9e, T9f, T9x, T9y; + T9e = rio[WS(vs, 6) + WS(rs, 1)]; + T9f = rio[WS(vs, 6) + WS(rs, 5)]; + T9g = T9e + T9f; + T9w = T9e - T9f; + T9x = iio[WS(vs, 6) + WS(rs, 1)]; + T9y = iio[WS(vs, 6) + WS(rs, 5)]; + T9z = T9x - T9y; + Tak = T9x + T9y; + } + { + E T9h, T9i, T9s, T9t; + T9h = rio[WS(vs, 6) + WS(rs, 7)]; + T9i = rio[WS(vs, 6) + WS(rs, 3)]; + T9j = T9h + T9i; + T9r = T9h - T9i; + T9s = iio[WS(vs, 6) + WS(rs, 7)]; + T9t = iio[WS(vs, 6) + WS(rs, 3)]; + T9u = T9s - T9t; + Tal = T9s + T9t; + } + T9k = T9g + T9j; + Taf = T9j - T9g; + TaA = Tak + Tal; + Tam = Tak - Tal; + T9K = T9z - T9w; + T9L = T9r + T9u; + Ta2 = T9K + T9L; + T9v = T9r - T9u; + T9A = T9w + T9z; + T9B = T9v - T9A; + T9X = T9A + T9v; + } + rio[0] = T7 + Te; + iio[0] = T1t + T1u; + rio[WS(rs, 1)] = T1D + T1K; + iio[WS(rs, 1)] = T2Z + T30; + rio[WS(rs, 2)] = T39 + T3g; + iio[WS(rs, 2)] = T4v + T4w; + rio[WS(rs, 3)] = T4F + T4M; + iio[WS(rs, 3)] = T61 + T62; + rio[WS(rs, 4)] = T6b + T6i; + iio[WS(rs, 4)] = T7x + T7y; + rio[WS(rs, 5)] = T7H + T7O; + iio[WS(rs, 5)] = T93 + T94; + rio[WS(rs, 6)] = T9d + T9k; + iio[WS(rs, 6)] = Taz + TaA; + rio[WS(rs, 7)] = TaJ + TaQ; + iio[WS(rs, 7)] = Tc5 + Tc6; + { + E TS, TX, TT, TY, TP, TU; + TS = FNMS(KP707106781, TR, TQ); + TX = FNMS(KP707106781, TW, TV); + TP = W[8]; + TT = TP * TS; + TY = TP * TX; + TU = W[9]; + rio[WS(vs, 5)] = FMA(TU, TX, TT); + iio[WS(vs, 5)] = FNMS(TU, TS, TY); + } + { + E T2N, T2B, T2H, T2I, T2O, T2G; + T2N = T2J - T2M; + T2G = T2E - T2F; + T2B = W[10]; + T2H = T2B * T2G; + T2I = W[11]; + T2O = T2I * T2G; + iio[WS(vs, 6) + WS(rs, 1)] = FNMS(T2I, T2N, T2H); + rio[WS(vs, 6) + WS(rs, 1)] = FMA(T2B, T2N, T2O); + } + { + E T1n, T1j, T1l, T1m, T1o, T1k; + T1n = T1d + T1g; + T1k = T19 + T18; + T1j = W[2]; + T1l = T1j * T1k; + T1m = W[3]; + T1o = T1m * T1k; + iio[WS(vs, 2)] = FNMS(T1m, T1n, T1l); + rio[WS(vs, 2)] = FMA(T1j, T1n, T1o); + } + { + E T1q, T1v, T1r, T1w, T1p, T1s; + T1q = T7 - Te; + T1v = T1t - T1u; + T1p = W[6]; + T1r = T1p * T1q; + T1w = T1p * T1v; + T1s = W[7]; + rio[WS(vs, 4)] = FMA(T1s, T1v, T1r); + iio[WS(vs, 4)] = FNMS(T1s, T1q, T1w); + } + { + E Tan, Tab, Tah, Tai, Tao, Tag; + Tan = Taj - Tam; + Tag = Tae - Taf; + Tab = W[10]; + Tah = Tab * Tag; + Tai = W[11]; + Tao = Tai * Tag; + iio[WS(vs, 6) + WS(rs, 6)] = FNMS(Tai, Tan, Tah); + rio[WS(vs, 6) + WS(rs, 6)] = FMA(Tab, Tan, Tao); + } + { + E Tc2, Tc7, Tc3, Tc8, Tc1, Tc4; + Tc2 = TaJ - TaQ; + Tc7 = Tc5 - Tc6; + Tc1 = W[6]; + Tc3 = Tc1 * Tc2; + Tc8 = Tc1 * Tc7; + Tc4 = W[7]; + rio[WS(vs, 4) + WS(rs, 7)] = FMA(Tc4, Tc7, Tc3); + iio[WS(vs, 4) + WS(rs, 7)] = FNMS(Tc4, Tc2, Tc8); + } + { + E Tbu, Tbz, Tbv, TbA, Tbr, Tbw; + Tbu = FNMS(KP707106781, Tbt, Tbs); + Tbz = FNMS(KP707106781, Tby, Tbx); + Tbr = W[8]; + Tbv = Tbr * Tbu; + TbA = Tbr * Tbz; + Tbw = W[9]; + rio[WS(vs, 5) + WS(rs, 7)] = FMA(Tbw, Tbz, Tbv); + iio[WS(vs, 5) + WS(rs, 7)] = FNMS(Tbw, Tbu, TbA); + } + { + E TbC, TbF, TbD, TbG, TbB, TbE; + TbC = FMA(KP707106781, Tbt, Tbs); + TbF = FMA(KP707106781, Tby, Tbx); + TbB = W[0]; + TbD = TbB * TbC; + TbG = TbB * TbF; + TbE = W[1]; + rio[WS(vs, 1) + WS(rs, 7)] = FMA(TbE, TbF, TbD); + iio[WS(vs, 1) + WS(rs, 7)] = FNMS(TbE, TbC, TbG); + } + { + E T10, T13, T11, T14, TZ, T12; + T10 = FMA(KP707106781, TR, TQ); + T13 = FMA(KP707106781, TW, TV); + TZ = W[0]; + T11 = TZ * T10; + T14 = TZ * T13; + T12 = W[1]; + rio[WS(vs, 1)] = FMA(T12, T13, T11); + iio[WS(vs, 1)] = FNMS(T12, T10, T14); + } + { + E T2w, T2z, T2x, T2A, T2v, T2y; + T2w = FMA(KP707106781, T2n, T2m); + T2z = FMA(KP707106781, T2s, T2r); + T2v = W[0]; + T2x = T2v * T2w; + T2A = T2v * T2z; + T2y = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(T2y, T2z, T2x); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(T2y, T2w, T2A); + } + { + E T1h, T15, T1b, T1c, T1i, T1a; + T1h = T1d - T1g; + T1a = T18 - T19; + T15 = W[10]; + T1b = T15 * T1a; + T1c = W[11]; + T1i = T1c * T1a; + iio[WS(vs, 6)] = FNMS(T1c, T1h, T1b); + rio[WS(vs, 6)] = FMA(T15, T1h, T1i); + } + { + E T2o, T2t, T2p, T2u, T2l, T2q; + T2o = FNMS(KP707106781, T2n, T2m); + T2t = FNMS(KP707106781, T2s, T2r); + T2l = W[8]; + T2p = T2l * T2o; + T2u = T2l * T2t; + T2q = W[9]; + rio[WS(vs, 5) + WS(rs, 1)] = FMA(T2q, T2t, T2p); + iio[WS(vs, 5) + WS(rs, 1)] = FNMS(T2q, T2o, T2u); + } + { + E Tat, Tap, Tar, Tas, Tau, Taq; + Tat = Taj + Tam; + Taq = Taf + Tae; + Tap = W[2]; + Tar = Tap * Taq; + Tas = W[3]; + Tau = Tas * Taq; + iio[WS(vs, 2) + WS(rs, 6)] = FNMS(Tas, Tat, Tar); + rio[WS(vs, 2) + WS(rs, 6)] = FMA(Tap, Tat, Tau); + } + { + E TbZ, TbV, TbX, TbY, Tc0, TbW; + TbZ = TbP + TbS; + TbW = TbL + TbK; + TbV = W[2]; + TbX = TbV * TbW; + TbY = W[3]; + Tc0 = TbY * TbW; + iio[WS(vs, 2) + WS(rs, 7)] = FNMS(TbY, TbZ, TbX); + rio[WS(vs, 2) + WS(rs, 7)] = FMA(TbV, TbZ, Tc0); + } + { + E Taw, TaB, Tax, TaC, Tav, Tay; + Taw = T9d - T9k; + TaB = Taz - TaA; + Tav = W[6]; + Tax = Tav * Taw; + TaC = Tav * TaB; + Tay = W[7]; + rio[WS(vs, 4) + WS(rs, 6)] = FMA(Tay, TaB, Tax); + iio[WS(vs, 4) + WS(rs, 6)] = FNMS(Tay, Taw, TaC); + } + { + E TbT, TbH, TbN, TbO, TbU, TbM; + TbT = TbP - TbS; + TbM = TbK - TbL; + TbH = W[10]; + TbN = TbH * TbM; + TbO = W[11]; + TbU = TbO * TbM; + iio[WS(vs, 6) + WS(rs, 7)] = FNMS(TbO, TbT, TbN); + rio[WS(vs, 6) + WS(rs, 7)] = FMA(TbH, TbT, TbU); + } + { + E T2T, T2P, T2R, T2S, T2U, T2Q; + T2T = T2J + T2M; + T2Q = T2F + T2E; + T2P = W[2]; + T2R = T2P * T2Q; + T2S = W[3]; + T2U = T2S * T2Q; + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T2S, T2T, T2R); + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T2P, T2T, T2U); + } + { + E T5Y, T63, T5Z, T64, T5X, T60; + T5Y = T4F - T4M; + T63 = T61 - T62; + T5X = W[6]; + T5Z = T5X * T5Y; + T64 = T5X * T63; + T60 = W[7]; + rio[WS(vs, 4) + WS(rs, 3)] = FMA(T60, T63, T5Z); + iio[WS(vs, 4) + WS(rs, 3)] = FNMS(T60, T5Y, T64); + } + { + E T42, T45, T43, T46, T41, T44; + T42 = FMA(KP707106781, T3T, T3S); + T45 = FMA(KP707106781, T3Y, T3X); + T41 = W[0]; + T43 = T41 * T42; + T46 = T41 * T45; + T44 = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T44, T45, T43); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T44, T42, T46); + } + { + E T5y, T5B, T5z, T5C, T5x, T5A; + T5y = FMA(KP707106781, T5p, T5o); + T5B = FMA(KP707106781, T5u, T5t); + T5x = W[0]; + T5z = T5x * T5y; + T5C = T5x * T5B; + T5A = W[1]; + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T5A, T5B, T5z); + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T5A, T5y, T5C); + } + { + E T6W, T71, T6X, T72, T6T, T6Y; + T6W = FNMS(KP707106781, T6V, T6U); + T71 = FNMS(KP707106781, T70, T6Z); + T6T = W[8]; + T6X = T6T * T6W; + T72 = T6T * T71; + T6Y = W[9]; + rio[WS(vs, 5) + WS(rs, 4)] = FMA(T6Y, T71, T6X); + iio[WS(vs, 5) + WS(rs, 4)] = FNMS(T6Y, T6W, T72); + } + { + E Ta6, Ta9, Ta7, Taa, Ta5, Ta8; + Ta6 = FMA(KP707106781, T9X, T9W); + Ta9 = FMA(KP707106781, Ta2, Ta1); + Ta5 = W[0]; + Ta7 = Ta5 * Ta6; + Taa = Ta5 * Ta9; + Ta8 = W[1]; + rio[WS(vs, 1) + WS(rs, 6)] = FMA(Ta8, Ta9, Ta7); + iio[WS(vs, 1) + WS(rs, 6)] = FNMS(Ta8, Ta6, Taa); + } + { + E T7r, T7n, T7p, T7q, T7s, T7o; + T7r = T7h + T7k; + T7o = T7d + T7c; + T7n = W[2]; + T7p = T7n * T7o; + T7q = W[3]; + T7s = T7q * T7o; + iio[WS(vs, 2) + WS(rs, 4)] = FNMS(T7q, T7r, T7p); + rio[WS(vs, 2) + WS(rs, 4)] = FMA(T7n, T7r, T7s); + } + { + E T8X, T8T, T8V, T8W, T8Y, T8U; + T8X = T8N + T8Q; + T8U = T8J + T8I; + T8T = W[2]; + T8V = T8T * T8U; + T8W = W[3]; + T8Y = T8W * T8U; + iio[WS(vs, 2) + WS(rs, 5)] = FNMS(T8W, T8X, T8V); + rio[WS(vs, 2) + WS(rs, 5)] = FMA(T8T, T8X, T8Y); + } + { + E T2W, T31, T2X, T32, T2V, T2Y; + T2W = T1D - T1K; + T31 = T2Z - T30; + T2V = W[6]; + T2X = T2V * T2W; + T32 = T2V * T31; + T2Y = W[7]; + rio[WS(vs, 4) + WS(rs, 1)] = FMA(T2Y, T31, T2X); + iio[WS(vs, 4) + WS(rs, 1)] = FNMS(T2Y, T2W, T32); + } + { + E T5V, T5R, T5T, T5U, T5W, T5S; + T5V = T5L + T5O; + T5S = T5H + T5G; + T5R = W[2]; + T5T = T5R * T5S; + T5U = W[3]; + T5W = T5U * T5S; + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T5U, T5V, T5T); + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T5R, T5V, T5W); + } + { + E T3U, T3Z, T3V, T40, T3R, T3W; + T3U = FNMS(KP707106781, T3T, T3S); + T3Z = FNMS(KP707106781, T3Y, T3X); + T3R = W[8]; + T3V = T3R * T3U; + T40 = T3R * T3Z; + T3W = W[9]; + rio[WS(vs, 5) + WS(rs, 2)] = FMA(T3W, T3Z, T3V); + iio[WS(vs, 5) + WS(rs, 2)] = FNMS(T3W, T3U, T40); + } + { + E T5P, T5D, T5J, T5K, T5Q, T5I; + T5P = T5L - T5O; + T5I = T5G - T5H; + T5D = W[10]; + T5J = T5D * T5I; + T5K = W[11]; + T5Q = T5K * T5I; + iio[WS(vs, 6) + WS(rs, 3)] = FNMS(T5K, T5P, T5J); + rio[WS(vs, 6) + WS(rs, 3)] = FMA(T5D, T5P, T5Q); + } + { + E T74, T77, T75, T78, T73, T76; + T74 = FMA(KP707106781, T6V, T6U); + T77 = FMA(KP707106781, T70, T6Z); + T73 = W[0]; + T75 = T73 * T74; + T78 = T73 * T77; + T76 = W[1]; + rio[WS(vs, 1) + WS(rs, 4)] = FMA(T76, T77, T75); + iio[WS(vs, 1) + WS(rs, 4)] = FNMS(T76, T74, T78); + } + { + E T9Y, Ta3, T9Z, Ta4, T9V, Ta0; + T9Y = FNMS(KP707106781, T9X, T9W); + Ta3 = FNMS(KP707106781, Ta2, Ta1); + T9V = W[8]; + T9Z = T9V * T9Y; + Ta4 = T9V * Ta3; + Ta0 = W[9]; + rio[WS(vs, 5) + WS(rs, 6)] = FMA(Ta0, Ta3, T9Z); + iio[WS(vs, 5) + WS(rs, 6)] = FNMS(Ta0, T9Y, Ta4); + } + { + E T7l, T79, T7f, T7g, T7m, T7e; + T7l = T7h - T7k; + T7e = T7c - T7d; + T79 = W[10]; + T7f = T79 * T7e; + T7g = W[11]; + T7m = T7g * T7e; + iio[WS(vs, 6) + WS(rs, 4)] = FNMS(T7g, T7l, T7f); + rio[WS(vs, 6) + WS(rs, 4)] = FMA(T79, T7l, T7m); + } + { + E T90, T95, T91, T96, T8Z, T92; + T90 = T7H - T7O; + T95 = T93 - T94; + T8Z = W[6]; + T91 = T8Z * T90; + T96 = T8Z * T95; + T92 = W[7]; + rio[WS(vs, 4) + WS(rs, 5)] = FMA(T92, T95, T91); + iio[WS(vs, 4) + WS(rs, 5)] = FNMS(T92, T90, T96); + } + { + E T4j, T47, T4d, T4e, T4k, T4c; + T4j = T4f - T4i; + T4c = T4a - T4b; + T47 = W[10]; + T4d = T47 * T4c; + T4e = W[11]; + T4k = T4e * T4c; + iio[WS(vs, 6) + WS(rs, 2)] = FNMS(T4e, T4j, T4d); + rio[WS(vs, 6) + WS(rs, 2)] = FMA(T47, T4j, T4k); + } + { + E T5q, T5v, T5r, T5w, T5n, T5s; + T5q = FNMS(KP707106781, T5p, T5o); + T5v = FNMS(KP707106781, T5u, T5t); + T5n = W[8]; + T5r = T5n * T5q; + T5w = T5n * T5v; + T5s = W[9]; + rio[WS(vs, 5) + WS(rs, 3)] = FMA(T5s, T5v, T5r); + iio[WS(vs, 5) + WS(rs, 3)] = FNMS(T5s, T5q, T5w); + } + { + E T4p, T4l, T4n, T4o, T4q, T4m; + T4p = T4f + T4i; + T4m = T4b + T4a; + T4l = W[2]; + T4n = T4l * T4m; + T4o = W[3]; + T4q = T4o * T4m; + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T4o, T4p, T4n); + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T4l, T4p, T4q); + } + { + E T4s, T4x, T4t, T4y, T4r, T4u; + T4s = T39 - T3g; + T4x = T4v - T4w; + T4r = W[6]; + T4t = T4r * T4s; + T4y = T4r * T4x; + T4u = W[7]; + rio[WS(vs, 4) + WS(rs, 2)] = FMA(T4u, T4x, T4t); + iio[WS(vs, 4) + WS(rs, 2)] = FNMS(T4u, T4s, T4y); + } + { + E T7u, T7z, T7v, T7A, T7t, T7w; + T7u = T6b - T6i; + T7z = T7x - T7y; + T7t = W[6]; + T7v = T7t * T7u; + T7A = T7t * T7z; + T7w = W[7]; + rio[WS(vs, 4) + WS(rs, 4)] = FMA(T7w, T7z, T7v); + iio[WS(vs, 4) + WS(rs, 4)] = FNMS(T7w, T7u, T7A); + } + { + E T8R, T8F, T8L, T8M, T8S, T8K; + T8R = T8N - T8Q; + T8K = T8I - T8J; + T8F = W[10]; + T8L = T8F * T8K; + T8M = W[11]; + T8S = T8M * T8K; + iio[WS(vs, 6) + WS(rs, 5)] = FNMS(T8M, T8R, T8L); + rio[WS(vs, 6) + WS(rs, 5)] = FMA(T8F, T8R, T8S); + } + { + E T8s, T8x, T8t, T8y, T8p, T8u; + T8s = FNMS(KP707106781, T8r, T8q); + T8x = FNMS(KP707106781, T8w, T8v); + T8p = W[8]; + T8t = T8p * T8s; + T8y = T8p * T8x; + T8u = W[9]; + rio[WS(vs, 5) + WS(rs, 5)] = FMA(T8u, T8x, T8t); + iio[WS(vs, 5) + WS(rs, 5)] = FNMS(T8u, T8s, T8y); + } + { + E T8A, T8D, T8B, T8E, T8z, T8C; + T8A = FMA(KP707106781, T8r, T8q); + T8D = FMA(KP707106781, T8w, T8v); + T8z = W[0]; + T8B = T8z * T8A; + T8E = T8z * T8D; + T8C = W[1]; + rio[WS(vs, 1) + WS(rs, 5)] = FMA(T8C, T8D, T8B); + iio[WS(vs, 1) + WS(rs, 5)] = FNMS(T8C, T8A, T8E); + } + { + E TH, TN, TJ, TL, TM, TO, Tf, Tx, Ty, TI, TG, TK, Tw; + TG = TE - TF; + TH = FNMS(KP707106781, TG, TD); + TN = FMA(KP707106781, TG, TD); + TK = FMA(KP707106781, Tv, Tk); + TJ = W[4]; + TL = TJ * TK; + TM = W[5]; + TO = TM * TK; + Tw = FNMS(KP707106781, Tv, Tk); + Tf = W[12]; + Tx = Tf * Tw; + Ty = W[13]; + TI = Ty * Tw; + iio[WS(vs, 7)] = FNMS(Ty, TH, Tx); + rio[WS(vs, 7)] = FMA(Tf, TH, TI); + iio[WS(vs, 3)] = FNMS(TM, TN, TL); + rio[WS(vs, 3)] = FMA(TJ, TN, TO); + } + { + E T5f, T5l, T5h, T5j, T5k, T5m, T4N, T55, T56, T5g, T5e, T5i, T54; + T5e = T5c - T5d; + T5f = FNMS(KP707106781, T5e, T5b); + T5l = FMA(KP707106781, T5e, T5b); + T5i = FMA(KP707106781, T53, T4S); + T5h = W[4]; + T5j = T5h * T5i; + T5k = W[5]; + T5m = T5k * T5i; + T54 = FNMS(KP707106781, T53, T4S); + T4N = W[12]; + T55 = T4N * T54; + T56 = W[13]; + T5g = T56 * T54; + iio[WS(vs, 7) + WS(rs, 3)] = FNMS(T56, T5f, T55); + rio[WS(vs, 7) + WS(rs, 3)] = FMA(T4N, T5f, T5g); + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T5k, T5l, T5j); + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T5h, T5l, T5m); + } + { + E T2d, T2j, T2f, T2h, T2i, T2k, T1L, T23, T24, T2e, T2c, T2g, T22; + T2c = T2a - T2b; + T2d = FNMS(KP707106781, T2c, T29); + T2j = FMA(KP707106781, T2c, T29); + T2g = FMA(KP707106781, T21, T1Q); + T2f = W[4]; + T2h = T2f * T2g; + T2i = W[5]; + T2k = T2i * T2g; + T22 = FNMS(KP707106781, T21, T1Q); + T1L = W[12]; + T23 = T1L * T22; + T24 = W[13]; + T2e = T24 * T22; + iio[WS(vs, 7) + WS(rs, 1)] = FNMS(T24, T2d, T23); + rio[WS(vs, 7) + WS(rs, 1)] = FMA(T1L, T2d, T2e); + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(T2i, T2j, T2h); + rio[WS(vs, 3) + WS(rs, 1)] = FMA(T2f, T2j, T2k); + } + { + E T3J, T3P, T3L, T3N, T3O, T3Q, T3h, T3z, T3A, T3K, T3I, T3M, T3y; + T3I = T3G - T3H; + T3J = FNMS(KP707106781, T3I, T3F); + T3P = FMA(KP707106781, T3I, T3F); + T3M = FMA(KP707106781, T3x, T3m); + T3L = W[4]; + T3N = T3L * T3M; + T3O = W[5]; + T3Q = T3O * T3M; + T3y = FNMS(KP707106781, T3x, T3m); + T3h = W[12]; + T3z = T3h * T3y; + T3A = W[13]; + T3K = T3A * T3y; + iio[WS(vs, 7) + WS(rs, 2)] = FNMS(T3A, T3J, T3z); + rio[WS(vs, 7) + WS(rs, 2)] = FMA(T3h, T3J, T3K); + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T3O, T3P, T3N); + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T3L, T3P, T3Q); + } + { + E T6L, T6R, T6N, T6P, T6Q, T6S, T6j, T6B, T6C, T6M, T6K, T6O, T6A; + T6K = T6I - T6J; + T6L = FNMS(KP707106781, T6K, T6H); + T6R = FMA(KP707106781, T6K, T6H); + T6O = FMA(KP707106781, T6z, T6o); + T6N = W[4]; + T6P = T6N * T6O; + T6Q = W[5]; + T6S = T6Q * T6O; + T6A = FNMS(KP707106781, T6z, T6o); + T6j = W[12]; + T6B = T6j * T6A; + T6C = W[13]; + T6M = T6C * T6A; + iio[WS(vs, 7) + WS(rs, 4)] = FNMS(T6C, T6L, T6B); + rio[WS(vs, 7) + WS(rs, 4)] = FMA(T6j, T6L, T6M); + iio[WS(vs, 3) + WS(rs, 4)] = FNMS(T6Q, T6R, T6P); + rio[WS(vs, 3) + WS(rs, 4)] = FMA(T6N, T6R, T6S); + } + { + E Tbj, Tbp, Tbl, Tbn, Tbo, Tbq, TaR, Tb9, Tba, Tbk, Tbi, Tbm, Tb8; + Tbi = Tbg - Tbh; + Tbj = FNMS(KP707106781, Tbi, Tbf); + Tbp = FMA(KP707106781, Tbi, Tbf); + Tbm = FMA(KP707106781, Tb7, TaW); + Tbl = W[4]; + Tbn = Tbl * Tbm; + Tbo = W[5]; + Tbq = Tbo * Tbm; + Tb8 = FNMS(KP707106781, Tb7, TaW); + TaR = W[12]; + Tb9 = TaR * Tb8; + Tba = W[13]; + Tbk = Tba * Tb8; + iio[WS(vs, 7) + WS(rs, 7)] = FNMS(Tba, Tbj, Tb9); + rio[WS(vs, 7) + WS(rs, 7)] = FMA(TaR, Tbj, Tbk); + iio[WS(vs, 3) + WS(rs, 7)] = FNMS(Tbo, Tbp, Tbn); + rio[WS(vs, 3) + WS(rs, 7)] = FMA(Tbl, Tbp, Tbq); + } + { + E T8h, T8n, T8j, T8l, T8m, T8o, T7P, T87, T88, T8i, T8g, T8k, T86; + T8g = T8e - T8f; + T8h = FNMS(KP707106781, T8g, T8d); + T8n = FMA(KP707106781, T8g, T8d); + T8k = FMA(KP707106781, T85, T7U); + T8j = W[4]; + T8l = T8j * T8k; + T8m = W[5]; + T8o = T8m * T8k; + T86 = FNMS(KP707106781, T85, T7U); + T7P = W[12]; + T87 = T7P * T86; + T88 = W[13]; + T8i = T88 * T86; + iio[WS(vs, 7) + WS(rs, 5)] = FNMS(T88, T8h, T87); + rio[WS(vs, 7) + WS(rs, 5)] = FMA(T7P, T8h, T8i); + iio[WS(vs, 3) + WS(rs, 5)] = FNMS(T8m, T8n, T8l); + rio[WS(vs, 3) + WS(rs, 5)] = FMA(T8j, T8n, T8o); + } + { + E T9N, T9T, T9P, T9R, T9S, T9U, T9l, T9D, T9E, T9O, T9M, T9Q, T9C; + T9M = T9K - T9L; + T9N = FNMS(KP707106781, T9M, T9J); + T9T = FMA(KP707106781, T9M, T9J); + T9Q = FMA(KP707106781, T9B, T9q); + T9P = W[4]; + T9R = T9P * T9Q; + T9S = W[5]; + T9U = T9S * T9Q; + T9C = FNMS(KP707106781, T9B, T9q); + T9l = W[12]; + T9D = T9l * T9C; + T9E = W[13]; + T9O = T9E * T9C; + iio[WS(vs, 7) + WS(rs, 6)] = FNMS(T9E, T9N, T9D); + rio[WS(vs, 7) + WS(rs, 6)] = FMA(T9l, T9N, T9O); + iio[WS(vs, 3) + WS(rs, 6)] = FNMS(T9S, T9T, T9R); + rio[WS(vs, 3) + WS(rs, 6)] = FMA(T9P, T9T, T9U); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 8}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 8, "q1_8", twinstr, &GENUS, {352, 112, 176, 0}, 0, 0, 0 }; + +void X(codelet_q1_8) (planner *p) { + X(kdft_difsq_register) (p, q1_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq.native -compact -variables 4 -pipeline-latency 4 -reload-twiddle -dif -n 8 -name q1_8 -include dft/scalar/q.h */ + +/* + * This function contains 528 FP additions, 256 FP multiplications, + * (or, 416 additions, 144 multiplications, 112 fused multiply/add), + * 142 stack variables, 1 constants, and 256 memory accesses + */ +#include "dft/scalar/q.h" + +static void q1_8(R *rio, R *iio, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 14); m < me; m = m + 1, rio = rio + ms, iio = iio + ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(0, vs)) { + E T7, T14, T1g, Tk, TC, TQ, T10, TM, T1w, T2p, T2z, T1H, T1M, T1W, T2j; + E T1V, T7R, T8O, T90, T84, T8m, T8A, T8K, T8w, T9g, Ta9, Taj, T9r, T9w, T9G; + E Ta3, T9F, Te, T17, T1h, Tp, Tu, TE, T11, TD, T1p, T2m, T2y, T1C, T1U; + E T28, T2i, T24, T7Y, T8R, T91, T89, T8e, T8o, T8L, T8n, T99, Ta6, Tai, T9m; + E T9E, T9S, Ta2, T9O, T2H, T3E, T3Q, T2U, T3c, T3q, T3A, T3m, T46, T4Z, T59; + E T4h, T4m, T4w, T4T, T4v, T5h, T6e, T6q, T5u, T5M, T60, T6a, T5W, T6G, T7z; + E T7J, T6R, T6W, T76, T7t, T75, T2O, T3H, T3R, T2Z, T34, T3e, T3B, T3d, T3Z; + E T4W, T58, T4c, T4u, T4I, T4S, T4E, T5o, T6h, T6r, T5z, T5E, T5O, T6b, T5N; + E T6z, T7w, T7I, T6M, T74, T7i, T7s, T7e; + { + E T3, Ty, Tj, TY, T6, Tg, TB, TZ; + { + E T1, T2, Th, Ti; + T1 = rio[0]; + T2 = rio[WS(rs, 4)]; + T3 = T1 + T2; + Ty = T1 - T2; + Th = iio[0]; + Ti = iio[WS(rs, 4)]; + Tj = Th - Ti; + TY = Th + Ti; + } + { + E T4, T5, Tz, TA; + T4 = rio[WS(rs, 2)]; + T5 = rio[WS(rs, 6)]; + T6 = T4 + T5; + Tg = T4 - T5; + Tz = iio[WS(rs, 2)]; + TA = iio[WS(rs, 6)]; + TB = Tz - TA; + TZ = Tz + TA; + } + T7 = T3 + T6; + T14 = T3 - T6; + T1g = TY + TZ; + Tk = Tg + Tj; + TC = Ty - TB; + TQ = Tj - Tg; + T10 = TY - TZ; + TM = Ty + TB; + } + { + E T1s, T1I, T1L, T2n, T1v, T1D, T1G, T2o; + { + E T1q, T1r, T1J, T1K; + T1q = rio[WS(vs, 1) + WS(rs, 1)]; + T1r = rio[WS(vs, 1) + WS(rs, 5)]; + T1s = T1q + T1r; + T1I = T1q - T1r; + T1J = iio[WS(vs, 1) + WS(rs, 1)]; + T1K = iio[WS(vs, 1) + WS(rs, 5)]; + T1L = T1J - T1K; + T2n = T1J + T1K; + } + { + E T1t, T1u, T1E, T1F; + T1t = rio[WS(vs, 1) + WS(rs, 7)]; + T1u = rio[WS(vs, 1) + WS(rs, 3)]; + T1v = T1t + T1u; + T1D = T1t - T1u; + T1E = iio[WS(vs, 1) + WS(rs, 7)]; + T1F = iio[WS(vs, 1) + WS(rs, 3)]; + T1G = T1E - T1F; + T2o = T1E + T1F; + } + T1w = T1s + T1v; + T2p = T2n - T2o; + T2z = T2n + T2o; + T1H = T1D - T1G; + T1M = T1I + T1L; + T1W = T1D + T1G; + T2j = T1v - T1s; + T1V = T1L - T1I; + } + { + E T7N, T8i, T83, T8I, T7Q, T80, T8l, T8J; + { + E T7L, T7M, T81, T82; + T7L = rio[WS(vs, 6)]; + T7M = rio[WS(vs, 6) + WS(rs, 4)]; + T7N = T7L + T7M; + T8i = T7L - T7M; + T81 = iio[WS(vs, 6)]; + T82 = iio[WS(vs, 6) + WS(rs, 4)]; + T83 = T81 - T82; + T8I = T81 + T82; + } + { + E T7O, T7P, T8j, T8k; + T7O = rio[WS(vs, 6) + WS(rs, 2)]; + T7P = rio[WS(vs, 6) + WS(rs, 6)]; + T7Q = T7O + T7P; + T80 = T7O - T7P; + T8j = iio[WS(vs, 6) + WS(rs, 2)]; + T8k = iio[WS(vs, 6) + WS(rs, 6)]; + T8l = T8j - T8k; + T8J = T8j + T8k; + } + T7R = T7N + T7Q; + T8O = T7N - T7Q; + T90 = T8I + T8J; + T84 = T80 + T83; + T8m = T8i - T8l; + T8A = T83 - T80; + T8K = T8I - T8J; + T8w = T8i + T8l; + } + { + E T9c, T9s, T9v, Ta7, T9f, T9n, T9q, Ta8; + { + E T9a, T9b, T9t, T9u; + T9a = rio[WS(vs, 7) + WS(rs, 1)]; + T9b = rio[WS(vs, 7) + WS(rs, 5)]; + T9c = T9a + T9b; + T9s = T9a - T9b; + T9t = iio[WS(vs, 7) + WS(rs, 1)]; + T9u = iio[WS(vs, 7) + WS(rs, 5)]; + T9v = T9t - T9u; + Ta7 = T9t + T9u; + } + { + E T9d, T9e, T9o, T9p; + T9d = rio[WS(vs, 7) + WS(rs, 7)]; + T9e = rio[WS(vs, 7) + WS(rs, 3)]; + T9f = T9d + T9e; + T9n = T9d - T9e; + T9o = iio[WS(vs, 7) + WS(rs, 7)]; + T9p = iio[WS(vs, 7) + WS(rs, 3)]; + T9q = T9o - T9p; + Ta8 = T9o + T9p; + } + T9g = T9c + T9f; + Ta9 = Ta7 - Ta8; + Taj = Ta7 + Ta8; + T9r = T9n - T9q; + T9w = T9s + T9v; + T9G = T9n + T9q; + Ta3 = T9f - T9c; + T9F = T9v - T9s; + } + { + E Ta, Tq, Tt, T15, Td, Tl, To, T16; + { + E T8, T9, Tr, Ts; + T8 = rio[WS(rs, 1)]; + T9 = rio[WS(rs, 5)]; + Ta = T8 + T9; + Tq = T8 - T9; + Tr = iio[WS(rs, 1)]; + Ts = iio[WS(rs, 5)]; + Tt = Tr - Ts; + T15 = Tr + Ts; + } + { + E Tb, Tc, Tm, Tn; + Tb = rio[WS(rs, 7)]; + Tc = rio[WS(rs, 3)]; + Td = Tb + Tc; + Tl = Tb - Tc; + Tm = iio[WS(rs, 7)]; + Tn = iio[WS(rs, 3)]; + To = Tm - Tn; + T16 = Tm + Tn; + } + Te = Ta + Td; + T17 = T15 - T16; + T1h = T15 + T16; + Tp = Tl - To; + Tu = Tq + Tt; + TE = Tl + To; + T11 = Td - Ta; + TD = Tt - Tq; + } + { + E T1l, T1Q, T1B, T2g, T1o, T1y, T1T, T2h; + { + E T1j, T1k, T1z, T1A; + T1j = rio[WS(vs, 1)]; + T1k = rio[WS(vs, 1) + WS(rs, 4)]; + T1l = T1j + T1k; + T1Q = T1j - T1k; + T1z = iio[WS(vs, 1)]; + T1A = iio[WS(vs, 1) + WS(rs, 4)]; + T1B = T1z - T1A; + T2g = T1z + T1A; + } + { + E T1m, T1n, T1R, T1S; + T1m = rio[WS(vs, 1) + WS(rs, 2)]; + T1n = rio[WS(vs, 1) + WS(rs, 6)]; + T1o = T1m + T1n; + T1y = T1m - T1n; + T1R = iio[WS(vs, 1) + WS(rs, 2)]; + T1S = iio[WS(vs, 1) + WS(rs, 6)]; + T1T = T1R - T1S; + T2h = T1R + T1S; + } + T1p = T1l + T1o; + T2m = T1l - T1o; + T2y = T2g + T2h; + T1C = T1y + T1B; + T1U = T1Q - T1T; + T28 = T1B - T1y; + T2i = T2g - T2h; + T24 = T1Q + T1T; + } + { + E T7U, T8a, T8d, T8P, T7X, T85, T88, T8Q; + { + E T7S, T7T, T8b, T8c; + T7S = rio[WS(vs, 6) + WS(rs, 1)]; + T7T = rio[WS(vs, 6) + WS(rs, 5)]; + T7U = T7S + T7T; + T8a = T7S - T7T; + T8b = iio[WS(vs, 6) + WS(rs, 1)]; + T8c = iio[WS(vs, 6) + WS(rs, 5)]; + T8d = T8b - T8c; + T8P = T8b + T8c; + } + { + E T7V, T7W, T86, T87; + T7V = rio[WS(vs, 6) + WS(rs, 7)]; + T7W = rio[WS(vs, 6) + WS(rs, 3)]; + T7X = T7V + T7W; + T85 = T7V - T7W; + T86 = iio[WS(vs, 6) + WS(rs, 7)]; + T87 = iio[WS(vs, 6) + WS(rs, 3)]; + T88 = T86 - T87; + T8Q = T86 + T87; + } + T7Y = T7U + T7X; + T8R = T8P - T8Q; + T91 = T8P + T8Q; + T89 = T85 - T88; + T8e = T8a + T8d; + T8o = T85 + T88; + T8L = T7X - T7U; + T8n = T8d - T8a; + } + { + E T95, T9A, T9l, Ta0, T98, T9i, T9D, Ta1; + { + E T93, T94, T9j, T9k; + T93 = rio[WS(vs, 7)]; + T94 = rio[WS(vs, 7) + WS(rs, 4)]; + T95 = T93 + T94; + T9A = T93 - T94; + T9j = iio[WS(vs, 7)]; + T9k = iio[WS(vs, 7) + WS(rs, 4)]; + T9l = T9j - T9k; + Ta0 = T9j + T9k; + } + { + E T96, T97, T9B, T9C; + T96 = rio[WS(vs, 7) + WS(rs, 2)]; + T97 = rio[WS(vs, 7) + WS(rs, 6)]; + T98 = T96 + T97; + T9i = T96 - T97; + T9B = iio[WS(vs, 7) + WS(rs, 2)]; + T9C = iio[WS(vs, 7) + WS(rs, 6)]; + T9D = T9B - T9C; + Ta1 = T9B + T9C; + } + T99 = T95 + T98; + Ta6 = T95 - T98; + Tai = Ta0 + Ta1; + T9m = T9i + T9l; + T9E = T9A - T9D; + T9S = T9l - T9i; + Ta2 = Ta0 - Ta1; + T9O = T9A + T9D; + } + { + E T2D, T38, T2T, T3y, T2G, T2Q, T3b, T3z; + { + E T2B, T2C, T2R, T2S; + T2B = rio[WS(vs, 2)]; + T2C = rio[WS(vs, 2) + WS(rs, 4)]; + T2D = T2B + T2C; + T38 = T2B - T2C; + T2R = iio[WS(vs, 2)]; + T2S = iio[WS(vs, 2) + WS(rs, 4)]; + T2T = T2R - T2S; + T3y = T2R + T2S; + } + { + E T2E, T2F, T39, T3a; + T2E = rio[WS(vs, 2) + WS(rs, 2)]; + T2F = rio[WS(vs, 2) + WS(rs, 6)]; + T2G = T2E + T2F; + T2Q = T2E - T2F; + T39 = iio[WS(vs, 2) + WS(rs, 2)]; + T3a = iio[WS(vs, 2) + WS(rs, 6)]; + T3b = T39 - T3a; + T3z = T39 + T3a; + } + T2H = T2D + T2G; + T3E = T2D - T2G; + T3Q = T3y + T3z; + T2U = T2Q + T2T; + T3c = T38 - T3b; + T3q = T2T - T2Q; + T3A = T3y - T3z; + T3m = T38 + T3b; + } + { + E T42, T4i, T4l, T4X, T45, T4d, T4g, T4Y; + { + E T40, T41, T4j, T4k; + T40 = rio[WS(vs, 3) + WS(rs, 1)]; + T41 = rio[WS(vs, 3) + WS(rs, 5)]; + T42 = T40 + T41; + T4i = T40 - T41; + T4j = iio[WS(vs, 3) + WS(rs, 1)]; + T4k = iio[WS(vs, 3) + WS(rs, 5)]; + T4l = T4j - T4k; + T4X = T4j + T4k; + } + { + E T43, T44, T4e, T4f; + T43 = rio[WS(vs, 3) + WS(rs, 7)]; + T44 = rio[WS(vs, 3) + WS(rs, 3)]; + T45 = T43 + T44; + T4d = T43 - T44; + T4e = iio[WS(vs, 3) + WS(rs, 7)]; + T4f = iio[WS(vs, 3) + WS(rs, 3)]; + T4g = T4e - T4f; + T4Y = T4e + T4f; + } + T46 = T42 + T45; + T4Z = T4X - T4Y; + T59 = T4X + T4Y; + T4h = T4d - T4g; + T4m = T4i + T4l; + T4w = T4d + T4g; + T4T = T45 - T42; + T4v = T4l - T4i; + } + { + E T5d, T5I, T5t, T68, T5g, T5q, T5L, T69; + { + E T5b, T5c, T5r, T5s; + T5b = rio[WS(vs, 4)]; + T5c = rio[WS(vs, 4) + WS(rs, 4)]; + T5d = T5b + T5c; + T5I = T5b - T5c; + T5r = iio[WS(vs, 4)]; + T5s = iio[WS(vs, 4) + WS(rs, 4)]; + T5t = T5r - T5s; + T68 = T5r + T5s; + } + { + E T5e, T5f, T5J, T5K; + T5e = rio[WS(vs, 4) + WS(rs, 2)]; + T5f = rio[WS(vs, 4) + WS(rs, 6)]; + T5g = T5e + T5f; + T5q = T5e - T5f; + T5J = iio[WS(vs, 4) + WS(rs, 2)]; + T5K = iio[WS(vs, 4) + WS(rs, 6)]; + T5L = T5J - T5K; + T69 = T5J + T5K; + } + T5h = T5d + T5g; + T6e = T5d - T5g; + T6q = T68 + T69; + T5u = T5q + T5t; + T5M = T5I - T5L; + T60 = T5t - T5q; + T6a = T68 - T69; + T5W = T5I + T5L; + } + { + E T6C, T6S, T6V, T7x, T6F, T6N, T6Q, T7y; + { + E T6A, T6B, T6T, T6U; + T6A = rio[WS(vs, 5) + WS(rs, 1)]; + T6B = rio[WS(vs, 5) + WS(rs, 5)]; + T6C = T6A + T6B; + T6S = T6A - T6B; + T6T = iio[WS(vs, 5) + WS(rs, 1)]; + T6U = iio[WS(vs, 5) + WS(rs, 5)]; + T6V = T6T - T6U; + T7x = T6T + T6U; + } + { + E T6D, T6E, T6O, T6P; + T6D = rio[WS(vs, 5) + WS(rs, 7)]; + T6E = rio[WS(vs, 5) + WS(rs, 3)]; + T6F = T6D + T6E; + T6N = T6D - T6E; + T6O = iio[WS(vs, 5) + WS(rs, 7)]; + T6P = iio[WS(vs, 5) + WS(rs, 3)]; + T6Q = T6O - T6P; + T7y = T6O + T6P; + } + T6G = T6C + T6F; + T7z = T7x - T7y; + T7J = T7x + T7y; + T6R = T6N - T6Q; + T6W = T6S + T6V; + T76 = T6N + T6Q; + T7t = T6F - T6C; + T75 = T6V - T6S; + } + { + E T2K, T30, T33, T3F, T2N, T2V, T2Y, T3G; + { + E T2I, T2J, T31, T32; + T2I = rio[WS(vs, 2) + WS(rs, 1)]; + T2J = rio[WS(vs, 2) + WS(rs, 5)]; + T2K = T2I + T2J; + T30 = T2I - T2J; + T31 = iio[WS(vs, 2) + WS(rs, 1)]; + T32 = iio[WS(vs, 2) + WS(rs, 5)]; + T33 = T31 - T32; + T3F = T31 + T32; + } + { + E T2L, T2M, T2W, T2X; + T2L = rio[WS(vs, 2) + WS(rs, 7)]; + T2M = rio[WS(vs, 2) + WS(rs, 3)]; + T2N = T2L + T2M; + T2V = T2L - T2M; + T2W = iio[WS(vs, 2) + WS(rs, 7)]; + T2X = iio[WS(vs, 2) + WS(rs, 3)]; + T2Y = T2W - T2X; + T3G = T2W + T2X; + } + T2O = T2K + T2N; + T3H = T3F - T3G; + T3R = T3F + T3G; + T2Z = T2V - T2Y; + T34 = T30 + T33; + T3e = T2V + T2Y; + T3B = T2N - T2K; + T3d = T33 - T30; + } + { + E T3V, T4q, T4b, T4Q, T3Y, T48, T4t, T4R; + { + E T3T, T3U, T49, T4a; + T3T = rio[WS(vs, 3)]; + T3U = rio[WS(vs, 3) + WS(rs, 4)]; + T3V = T3T + T3U; + T4q = T3T - T3U; + T49 = iio[WS(vs, 3)]; + T4a = iio[WS(vs, 3) + WS(rs, 4)]; + T4b = T49 - T4a; + T4Q = T49 + T4a; + } + { + E T3W, T3X, T4r, T4s; + T3W = rio[WS(vs, 3) + WS(rs, 2)]; + T3X = rio[WS(vs, 3) + WS(rs, 6)]; + T3Y = T3W + T3X; + T48 = T3W - T3X; + T4r = iio[WS(vs, 3) + WS(rs, 2)]; + T4s = iio[WS(vs, 3) + WS(rs, 6)]; + T4t = T4r - T4s; + T4R = T4r + T4s; + } + T3Z = T3V + T3Y; + T4W = T3V - T3Y; + T58 = T4Q + T4R; + T4c = T48 + T4b; + T4u = T4q - T4t; + T4I = T4b - T48; + T4S = T4Q - T4R; + T4E = T4q + T4t; + } + { + E T5k, T5A, T5D, T6f, T5n, T5v, T5y, T6g; + { + E T5i, T5j, T5B, T5C; + T5i = rio[WS(vs, 4) + WS(rs, 1)]; + T5j = rio[WS(vs, 4) + WS(rs, 5)]; + T5k = T5i + T5j; + T5A = T5i - T5j; + T5B = iio[WS(vs, 4) + WS(rs, 1)]; + T5C = iio[WS(vs, 4) + WS(rs, 5)]; + T5D = T5B - T5C; + T6f = T5B + T5C; + } + { + E T5l, T5m, T5w, T5x; + T5l = rio[WS(vs, 4) + WS(rs, 7)]; + T5m = rio[WS(vs, 4) + WS(rs, 3)]; + T5n = T5l + T5m; + T5v = T5l - T5m; + T5w = iio[WS(vs, 4) + WS(rs, 7)]; + T5x = iio[WS(vs, 4) + WS(rs, 3)]; + T5y = T5w - T5x; + T6g = T5w + T5x; + } + T5o = T5k + T5n; + T6h = T6f - T6g; + T6r = T6f + T6g; + T5z = T5v - T5y; + T5E = T5A + T5D; + T5O = T5v + T5y; + T6b = T5n - T5k; + T5N = T5D - T5A; + } + { + E T6v, T70, T6L, T7q, T6y, T6I, T73, T7r; + { + E T6t, T6u, T6J, T6K; + T6t = rio[WS(vs, 5)]; + T6u = rio[WS(vs, 5) + WS(rs, 4)]; + T6v = T6t + T6u; + T70 = T6t - T6u; + T6J = iio[WS(vs, 5)]; + T6K = iio[WS(vs, 5) + WS(rs, 4)]; + T6L = T6J - T6K; + T7q = T6J + T6K; + } + { + E T6w, T6x, T71, T72; + T6w = rio[WS(vs, 5) + WS(rs, 2)]; + T6x = rio[WS(vs, 5) + WS(rs, 6)]; + T6y = T6w + T6x; + T6I = T6w - T6x; + T71 = iio[WS(vs, 5) + WS(rs, 2)]; + T72 = iio[WS(vs, 5) + WS(rs, 6)]; + T73 = T71 - T72; + T7r = T71 + T72; + } + T6z = T6v + T6y; + T7w = T6v - T6y; + T7I = T7q + T7r; + T6M = T6I + T6L; + T74 = T70 - T73; + T7i = T6L - T6I; + T7s = T7q - T7r; + T7e = T70 + T73; + } + rio[0] = T7 + Te; + iio[0] = T1g + T1h; + rio[WS(rs, 1)] = T1p + T1w; + iio[WS(rs, 1)] = T2y + T2z; + rio[WS(rs, 3)] = T3Z + T46; + rio[WS(rs, 2)] = T2H + T2O; + iio[WS(rs, 2)] = T3Q + T3R; + iio[WS(rs, 3)] = T58 + T59; + rio[WS(rs, 6)] = T7R + T7Y; + iio[WS(rs, 6)] = T90 + T91; + iio[WS(rs, 5)] = T7I + T7J; + rio[WS(rs, 5)] = T6z + T6G; + iio[WS(rs, 4)] = T6q + T6r; + rio[WS(rs, 4)] = T5h + T5o; + rio[WS(rs, 7)] = T99 + T9g; + iio[WS(rs, 7)] = Tai + Taj; + { + E T12, T18, TX, T13; + T12 = T10 - T11; + T18 = T14 - T17; + TX = W[10]; + T13 = W[11]; + iio[WS(vs, 6)] = FNMS(T13, T18, TX * T12); + rio[WS(vs, 6)] = FMA(T13, T12, TX * T18); + } + { + E Tag, Tak, Taf, Tah; + Tag = T99 - T9g; + Tak = Tai - Taj; + Taf = W[6]; + Tah = W[7]; + rio[WS(vs, 4) + WS(rs, 7)] = FMA(Taf, Tag, Tah * Tak); + iio[WS(vs, 4) + WS(rs, 7)] = FNMS(Tah, Tag, Taf * Tak); + } + { + E T8M, T8S, T8H, T8N; + T8M = T8K - T8L; + T8S = T8O - T8R; + T8H = W[10]; + T8N = W[11]; + iio[WS(vs, 6) + WS(rs, 6)] = FNMS(T8N, T8S, T8H * T8M); + rio[WS(vs, 6) + WS(rs, 6)] = FMA(T8N, T8M, T8H * T8S); + } + { + E T2k, T2q, T2f, T2l; + T2k = T2i - T2j; + T2q = T2m - T2p; + T2f = W[10]; + T2l = W[11]; + iio[WS(vs, 6) + WS(rs, 1)] = FNMS(T2l, T2q, T2f * T2k); + rio[WS(vs, 6) + WS(rs, 1)] = FMA(T2l, T2k, T2f * T2q); + } + { + E Ta4, Taa, T9Z, Ta5; + Ta4 = Ta2 - Ta3; + Taa = Ta6 - Ta9; + T9Z = W[10]; + Ta5 = W[11]; + iio[WS(vs, 6) + WS(rs, 7)] = FNMS(Ta5, Taa, T9Z * Ta4); + rio[WS(vs, 6) + WS(rs, 7)] = FMA(Ta5, Ta4, T9Z * Taa); + } + { + E T8Y, T92, T8X, T8Z; + T8Y = T7R - T7Y; + T92 = T90 - T91; + T8X = W[6]; + T8Z = W[7]; + rio[WS(vs, 4) + WS(rs, 6)] = FMA(T8X, T8Y, T8Z * T92); + iio[WS(vs, 4) + WS(rs, 6)] = FNMS(T8Z, T8Y, T8X * T92); + } + { + E T2w, T2A, T2v, T2x; + T2w = T1p - T1w; + T2A = T2y - T2z; + T2v = W[6]; + T2x = W[7]; + rio[WS(vs, 4) + WS(rs, 1)] = FMA(T2v, T2w, T2x * T2A); + iio[WS(vs, 4) + WS(rs, 1)] = FNMS(T2x, T2w, T2v * T2A); + } + { + E Tac, Tae, Tab, Tad; + Tac = Ta3 + Ta2; + Tae = Ta6 + Ta9; + Tab = W[2]; + Tad = W[3]; + iio[WS(vs, 2) + WS(rs, 7)] = FNMS(Tad, Tae, Tab * Tac); + rio[WS(vs, 2) + WS(rs, 7)] = FMA(Tad, Tac, Tab * Tae); + } + { + E T8U, T8W, T8T, T8V; + T8U = T8L + T8K; + T8W = T8O + T8R; + T8T = W[2]; + T8V = W[3]; + iio[WS(vs, 2) + WS(rs, 6)] = FNMS(T8V, T8W, T8T * T8U); + rio[WS(vs, 2) + WS(rs, 6)] = FMA(T8V, T8U, T8T * T8W); + } + { + E T1a, T1c, T19, T1b; + T1a = T11 + T10; + T1c = T14 + T17; + T19 = W[2]; + T1b = W[3]; + iio[WS(vs, 2)] = FNMS(T1b, T1c, T19 * T1a); + rio[WS(vs, 2)] = FMA(T1b, T1a, T19 * T1c); + } + { + E T1e, T1i, T1d, T1f; + T1e = T7 - Te; + T1i = T1g - T1h; + T1d = W[6]; + T1f = W[7]; + rio[WS(vs, 4)] = FMA(T1d, T1e, T1f * T1i); + iio[WS(vs, 4)] = FNMS(T1f, T1e, T1d * T1i); + } + { + E T2s, T2u, T2r, T2t; + T2s = T2j + T2i; + T2u = T2m + T2p; + T2r = W[2]; + T2t = W[3]; + iio[WS(vs, 2) + WS(rs, 1)] = FNMS(T2t, T2u, T2r * T2s); + rio[WS(vs, 2) + WS(rs, 1)] = FMA(T2t, T2s, T2r * T2u); + } + { + E T3C, T3I, T3x, T3D; + T3C = T3A - T3B; + T3I = T3E - T3H; + T3x = W[10]; + T3D = W[11]; + iio[WS(vs, 6) + WS(rs, 2)] = FNMS(T3D, T3I, T3x * T3C); + rio[WS(vs, 6) + WS(rs, 2)] = FMA(T3D, T3C, T3x * T3I); + } + { + E T4U, T50, T4P, T4V; + T4U = T4S - T4T; + T50 = T4W - T4Z; + T4P = W[10]; + T4V = W[11]; + iio[WS(vs, 6) + WS(rs, 3)] = FNMS(T4V, T50, T4P * T4U); + rio[WS(vs, 6) + WS(rs, 3)] = FMA(T4V, T4U, T4P * T50); + } + { + E T56, T5a, T55, T57; + T56 = T3Z - T46; + T5a = T58 - T59; + T55 = W[6]; + T57 = W[7]; + rio[WS(vs, 4) + WS(rs, 3)] = FMA(T55, T56, T57 * T5a); + iio[WS(vs, 4) + WS(rs, 3)] = FNMS(T57, T56, T55 * T5a); + } + { + E T6o, T6s, T6n, T6p; + T6o = T5h - T5o; + T6s = T6q - T6r; + T6n = W[6]; + T6p = W[7]; + rio[WS(vs, 4) + WS(rs, 4)] = FMA(T6n, T6o, T6p * T6s); + iio[WS(vs, 4) + WS(rs, 4)] = FNMS(T6p, T6o, T6n * T6s); + } + { + E T7u, T7A, T7p, T7v; + T7u = T7s - T7t; + T7A = T7w - T7z; + T7p = W[10]; + T7v = W[11]; + iio[WS(vs, 6) + WS(rs, 5)] = FNMS(T7v, T7A, T7p * T7u); + rio[WS(vs, 6) + WS(rs, 5)] = FMA(T7v, T7u, T7p * T7A); + } + { + E T6c, T6i, T67, T6d; + T6c = T6a - T6b; + T6i = T6e - T6h; + T67 = W[10]; + T6d = W[11]; + iio[WS(vs, 6) + WS(rs, 4)] = FNMS(T6d, T6i, T67 * T6c); + rio[WS(vs, 6) + WS(rs, 4)] = FMA(T6d, T6c, T67 * T6i); + } + { + E T7G, T7K, T7F, T7H; + T7G = T6z - T6G; + T7K = T7I - T7J; + T7F = W[6]; + T7H = W[7]; + rio[WS(vs, 4) + WS(rs, 5)] = FMA(T7F, T7G, T7H * T7K); + iio[WS(vs, 4) + WS(rs, 5)] = FNMS(T7H, T7G, T7F * T7K); + } + { + E T3O, T3S, T3N, T3P; + T3O = T2H - T2O; + T3S = T3Q - T3R; + T3N = W[6]; + T3P = W[7]; + rio[WS(vs, 4) + WS(rs, 2)] = FMA(T3N, T3O, T3P * T3S); + iio[WS(vs, 4) + WS(rs, 2)] = FNMS(T3P, T3O, T3N * T3S); + } + { + E T3K, T3M, T3J, T3L; + T3K = T3B + T3A; + T3M = T3E + T3H; + T3J = W[2]; + T3L = W[3]; + iio[WS(vs, 2) + WS(rs, 2)] = FNMS(T3L, T3M, T3J * T3K); + rio[WS(vs, 2) + WS(rs, 2)] = FMA(T3L, T3K, T3J * T3M); + } + { + E T7C, T7E, T7B, T7D; + T7C = T7t + T7s; + T7E = T7w + T7z; + T7B = W[2]; + T7D = W[3]; + iio[WS(vs, 2) + WS(rs, 5)] = FNMS(T7D, T7E, T7B * T7C); + rio[WS(vs, 2) + WS(rs, 5)] = FMA(T7D, T7C, T7B * T7E); + } + { + E T6k, T6m, T6j, T6l; + T6k = T6b + T6a; + T6m = T6e + T6h; + T6j = W[2]; + T6l = W[3]; + iio[WS(vs, 2) + WS(rs, 4)] = FNMS(T6l, T6m, T6j * T6k); + rio[WS(vs, 2) + WS(rs, 4)] = FMA(T6l, T6k, T6j * T6m); + } + { + E T52, T54, T51, T53; + T52 = T4T + T4S; + T54 = T4W + T4Z; + T51 = W[2]; + T53 = W[3]; + iio[WS(vs, 2) + WS(rs, 3)] = FNMS(T53, T54, T51 * T52); + rio[WS(vs, 2) + WS(rs, 3)] = FMA(T53, T52, T51 * T54); + } + { + E T5G, T5S, T5Q, T5U, T5F, T5P; + T5F = KP707106781 * (T5z - T5E); + T5G = T5u - T5F; + T5S = T5u + T5F; + T5P = KP707106781 * (T5N - T5O); + T5Q = T5M - T5P; + T5U = T5M + T5P; + { + E T5p, T5H, T5R, T5T; + T5p = W[12]; + T5H = W[13]; + iio[WS(vs, 7) + WS(rs, 4)] = FNMS(T5H, T5Q, T5p * T5G); + rio[WS(vs, 7) + WS(rs, 4)] = FMA(T5H, T5G, T5p * T5Q); + T5R = W[4]; + T5T = W[5]; + iio[WS(vs, 3) + WS(rs, 4)] = FNMS(T5T, T5U, T5R * T5S); + rio[WS(vs, 3) + WS(rs, 4)] = FMA(T5T, T5S, T5R * T5U); + } + } + { + E Tw, TI, TG, TK, Tv, TF; + Tv = KP707106781 * (Tp - Tu); + Tw = Tk - Tv; + TI = Tk + Tv; + TF = KP707106781 * (TD - TE); + TG = TC - TF; + TK = TC + TF; + { + E Tf, Tx, TH, TJ; + Tf = W[12]; + Tx = W[13]; + iio[WS(vs, 7)] = FNMS(Tx, TG, Tf * Tw); + rio[WS(vs, 7)] = FMA(Tx, Tw, Tf * TG); + TH = W[4]; + TJ = W[5]; + iio[WS(vs, 3)] = FNMS(TJ, TK, TH * TI); + rio[WS(vs, 3)] = FMA(TJ, TI, TH * TK); + } + } + { + E T9Q, T9W, T9U, T9Y, T9P, T9T; + T9P = KP707106781 * (T9w + T9r); + T9Q = T9O - T9P; + T9W = T9O + T9P; + T9T = KP707106781 * (T9F + T9G); + T9U = T9S - T9T; + T9Y = T9S + T9T; + { + E T9N, T9R, T9V, T9X; + T9N = W[8]; + T9R = W[9]; + rio[WS(vs, 5) + WS(rs, 7)] = FMA(T9N, T9Q, T9R * T9U); + iio[WS(vs, 5) + WS(rs, 7)] = FNMS(T9R, T9Q, T9N * T9U); + T9V = W[0]; + T9X = W[1]; + rio[WS(vs, 1) + WS(rs, 7)] = FMA(T9V, T9W, T9X * T9Y); + iio[WS(vs, 1) + WS(rs, 7)] = FNMS(T9X, T9W, T9V * T9Y); + } + } + { + E T36, T3i, T3g, T3k, T35, T3f; + T35 = KP707106781 * (T2Z - T34); + T36 = T2U - T35; + T3i = T2U + T35; + T3f = KP707106781 * (T3d - T3e); + T3g = T3c - T3f; + T3k = T3c + T3f; + { + E T2P, T37, T3h, T3j; + T2P = W[12]; + T37 = W[13]; + iio[WS(vs, 7) + WS(rs, 2)] = FNMS(T37, T3g, T2P * T36); + rio[WS(vs, 7) + WS(rs, 2)] = FMA(T37, T36, T2P * T3g); + T3h = W[4]; + T3j = W[5]; + iio[WS(vs, 3) + WS(rs, 2)] = FNMS(T3j, T3k, T3h * T3i); + rio[WS(vs, 3) + WS(rs, 2)] = FMA(T3j, T3i, T3h * T3k); + } + } + { + E T5Y, T64, T62, T66, T5X, T61; + T5X = KP707106781 * (T5E + T5z); + T5Y = T5W - T5X; + T64 = T5W + T5X; + T61 = KP707106781 * (T5N + T5O); + T62 = T60 - T61; + T66 = T60 + T61; + { + E T5V, T5Z, T63, T65; + T5V = W[8]; + T5Z = W[9]; + rio[WS(vs, 5) + WS(rs, 4)] = FMA(T5V, T5Y, T5Z * T62); + iio[WS(vs, 5) + WS(rs, 4)] = FNMS(T5Z, T5Y, T5V * T62); + T63 = W[0]; + T65 = W[1]; + rio[WS(vs, 1) + WS(rs, 4)] = FMA(T63, T64, T65 * T66); + iio[WS(vs, 1) + WS(rs, 4)] = FNMS(T65, T64, T63 * T66); + } + } + { + E T7g, T7m, T7k, T7o, T7f, T7j; + T7f = KP707106781 * (T6W + T6R); + T7g = T7e - T7f; + T7m = T7e + T7f; + T7j = KP707106781 * (T75 + T76); + T7k = T7i - T7j; + T7o = T7i + T7j; + { + E T7d, T7h, T7l, T7n; + T7d = W[8]; + T7h = W[9]; + rio[WS(vs, 5) + WS(rs, 5)] = FMA(T7d, T7g, T7h * T7k); + iio[WS(vs, 5) + WS(rs, 5)] = FNMS(T7h, T7g, T7d * T7k); + T7l = W[0]; + T7n = W[1]; + rio[WS(vs, 1) + WS(rs, 5)] = FMA(T7l, T7m, T7n * T7o); + iio[WS(vs, 1) + WS(rs, 5)] = FNMS(T7n, T7m, T7l * T7o); + } + } + { + E T8g, T8s, T8q, T8u, T8f, T8p; + T8f = KP707106781 * (T89 - T8e); + T8g = T84 - T8f; + T8s = T84 + T8f; + T8p = KP707106781 * (T8n - T8o); + T8q = T8m - T8p; + T8u = T8m + T8p; + { + E T7Z, T8h, T8r, T8t; + T7Z = W[12]; + T8h = W[13]; + iio[WS(vs, 7) + WS(rs, 6)] = FNMS(T8h, T8q, T7Z * T8g); + rio[WS(vs, 7) + WS(rs, 6)] = FMA(T8h, T8g, T7Z * T8q); + T8r = W[4]; + T8t = W[5]; + iio[WS(vs, 3) + WS(rs, 6)] = FNMS(T8t, T8u, T8r * T8s); + rio[WS(vs, 3) + WS(rs, 6)] = FMA(T8t, T8s, T8r * T8u); + } + } + { + E T4G, T4M, T4K, T4O, T4F, T4J; + T4F = KP707106781 * (T4m + T4h); + T4G = T4E - T4F; + T4M = T4E + T4F; + T4J = KP707106781 * (T4v + T4w); + T4K = T4I - T4J; + T4O = T4I + T4J; + { + E T4D, T4H, T4L, T4N; + T4D = W[8]; + T4H = W[9]; + rio[WS(vs, 5) + WS(rs, 3)] = FMA(T4D, T4G, T4H * T4K); + iio[WS(vs, 5) + WS(rs, 3)] = FNMS(T4H, T4G, T4D * T4K); + T4L = W[0]; + T4N = W[1]; + rio[WS(vs, 1) + WS(rs, 3)] = FMA(T4L, T4M, T4N * T4O); + iio[WS(vs, 1) + WS(rs, 3)] = FNMS(T4N, T4M, T4L * T4O); + } + } + { + E TO, TU, TS, TW, TN, TR; + TN = KP707106781 * (Tu + Tp); + TO = TM - TN; + TU = TM + TN; + TR = KP707106781 * (TD + TE); + TS = TQ - TR; + TW = TQ + TR; + { + E TL, TP, TT, TV; + TL = W[8]; + TP = W[9]; + rio[WS(vs, 5)] = FMA(TL, TO, TP * TS); + iio[WS(vs, 5)] = FNMS(TP, TO, TL * TS); + TT = W[0]; + TV = W[1]; + rio[WS(vs, 1)] = FMA(TT, TU, TV * TW); + iio[WS(vs, 1)] = FNMS(TV, TU, TT * TW); + } + } + { + E T26, T2c, T2a, T2e, T25, T29; + T25 = KP707106781 * (T1M + T1H); + T26 = T24 - T25; + T2c = T24 + T25; + T29 = KP707106781 * (T1V + T1W); + T2a = T28 - T29; + T2e = T28 + T29; + { + E T23, T27, T2b, T2d; + T23 = W[8]; + T27 = W[9]; + rio[WS(vs, 5) + WS(rs, 1)] = FMA(T23, T26, T27 * T2a); + iio[WS(vs, 5) + WS(rs, 1)] = FNMS(T27, T26, T23 * T2a); + T2b = W[0]; + T2d = W[1]; + rio[WS(vs, 1) + WS(rs, 1)] = FMA(T2b, T2c, T2d * T2e); + iio[WS(vs, 1) + WS(rs, 1)] = FNMS(T2d, T2c, T2b * T2e); + } + } + { + E T9y, T9K, T9I, T9M, T9x, T9H; + T9x = KP707106781 * (T9r - T9w); + T9y = T9m - T9x; + T9K = T9m + T9x; + T9H = KP707106781 * (T9F - T9G); + T9I = T9E - T9H; + T9M = T9E + T9H; + { + E T9h, T9z, T9J, T9L; + T9h = W[12]; + T9z = W[13]; + iio[WS(vs, 7) + WS(rs, 7)] = FNMS(T9z, T9I, T9h * T9y); + rio[WS(vs, 7) + WS(rs, 7)] = FMA(T9z, T9y, T9h * T9I); + T9J = W[4]; + T9L = W[5]; + iio[WS(vs, 3) + WS(rs, 7)] = FNMS(T9L, T9M, T9J * T9K); + rio[WS(vs, 3) + WS(rs, 7)] = FMA(T9L, T9K, T9J * T9M); + } + } + { + E T6Y, T7a, T78, T7c, T6X, T77; + T6X = KP707106781 * (T6R - T6W); + T6Y = T6M - T6X; + T7a = T6M + T6X; + T77 = KP707106781 * (T75 - T76); + T78 = T74 - T77; + T7c = T74 + T77; + { + E T6H, T6Z, T79, T7b; + T6H = W[12]; + T6Z = W[13]; + iio[WS(vs, 7) + WS(rs, 5)] = FNMS(T6Z, T78, T6H * T6Y); + rio[WS(vs, 7) + WS(rs, 5)] = FMA(T6Z, T6Y, T6H * T78); + T79 = W[4]; + T7b = W[5]; + iio[WS(vs, 3) + WS(rs, 5)] = FNMS(T7b, T7c, T79 * T7a); + rio[WS(vs, 3) + WS(rs, 5)] = FMA(T7b, T7a, T79 * T7c); + } + } + { + E T1O, T20, T1Y, T22, T1N, T1X; + T1N = KP707106781 * (T1H - T1M); + T1O = T1C - T1N; + T20 = T1C + T1N; + T1X = KP707106781 * (T1V - T1W); + T1Y = T1U - T1X; + T22 = T1U + T1X; + { + E T1x, T1P, T1Z, T21; + T1x = W[12]; + T1P = W[13]; + iio[WS(vs, 7) + WS(rs, 1)] = FNMS(T1P, T1Y, T1x * T1O); + rio[WS(vs, 7) + WS(rs, 1)] = FMA(T1P, T1O, T1x * T1Y); + T1Z = W[4]; + T21 = W[5]; + iio[WS(vs, 3) + WS(rs, 1)] = FNMS(T21, T22, T1Z * T20); + rio[WS(vs, 3) + WS(rs, 1)] = FMA(T21, T20, T1Z * T22); + } + } + { + E T4o, T4A, T4y, T4C, T4n, T4x; + T4n = KP707106781 * (T4h - T4m); + T4o = T4c - T4n; + T4A = T4c + T4n; + T4x = KP707106781 * (T4v - T4w); + T4y = T4u - T4x; + T4C = T4u + T4x; + { + E T47, T4p, T4z, T4B; + T47 = W[12]; + T4p = W[13]; + iio[WS(vs, 7) + WS(rs, 3)] = FNMS(T4p, T4y, T47 * T4o); + rio[WS(vs, 7) + WS(rs, 3)] = FMA(T4p, T4o, T47 * T4y); + T4z = W[4]; + T4B = W[5]; + iio[WS(vs, 3) + WS(rs, 3)] = FNMS(T4B, T4C, T4z * T4A); + rio[WS(vs, 3) + WS(rs, 3)] = FMA(T4B, T4A, T4z * T4C); + } + } + { + E T3o, T3u, T3s, T3w, T3n, T3r; + T3n = KP707106781 * (T34 + T2Z); + T3o = T3m - T3n; + T3u = T3m + T3n; + T3r = KP707106781 * (T3d + T3e); + T3s = T3q - T3r; + T3w = T3q + T3r; + { + E T3l, T3p, T3t, T3v; + T3l = W[8]; + T3p = W[9]; + rio[WS(vs, 5) + WS(rs, 2)] = FMA(T3l, T3o, T3p * T3s); + iio[WS(vs, 5) + WS(rs, 2)] = FNMS(T3p, T3o, T3l * T3s); + T3t = W[0]; + T3v = W[1]; + rio[WS(vs, 1) + WS(rs, 2)] = FMA(T3t, T3u, T3v * T3w); + iio[WS(vs, 1) + WS(rs, 2)] = FNMS(T3v, T3u, T3t * T3w); + } + } + { + E T8y, T8E, T8C, T8G, T8x, T8B; + T8x = KP707106781 * (T8e + T89); + T8y = T8w - T8x; + T8E = T8w + T8x; + T8B = KP707106781 * (T8n + T8o); + T8C = T8A - T8B; + T8G = T8A + T8B; + { + E T8v, T8z, T8D, T8F; + T8v = W[8]; + T8z = W[9]; + rio[WS(vs, 5) + WS(rs, 6)] = FMA(T8v, T8y, T8z * T8C); + iio[WS(vs, 5) + WS(rs, 6)] = FNMS(T8z, T8y, T8v * T8C); + T8D = W[0]; + T8F = W[1]; + rio[WS(vs, 1) + WS(rs, 6)] = FMA(T8D, T8E, T8F * T8G); + iio[WS(vs, 1) + WS(rs, 6)] = FNMS(T8F, T8E, T8D * T8G); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 8}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 8, "q1_8", twinstr, &GENUS, {416, 144, 112, 0}, 0, 0, 0 }; + +void X(codelet_q1_8) (planner *p) { + X(kdft_difsq_register) (p, q1_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_10.c new file mode 100644 index 000000000..d6fdc513e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_10.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -name t1_10 -include dft/scalar/t.h */ + +/* + * This function contains 102 FP additions, 72 FP multiplications, + * (or, 48 additions, 18 multiplications, 54 fused multiply/add), + * 47 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 18); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 18, MAKE_VOLATILE_STRIDE(20, rs)) { + E T8, T23, T12, T1U, TM, TZ, T10, T1F, T1G, T1P, T16, T17, T18, T1s, T1x; + E T25, Tl, Ty, Tz, T1I, T1J, T1O, T13, T14, T15, T1h, T1m, T24; + { + E T1, T1T, T3, T6, T4, T1R, T2, T7, T1S, T5; + T1 = ri[0]; + T1T = ii[0]; + T3 = ri[WS(rs, 5)]; + T6 = ii[WS(rs, 5)]; + T2 = W[8]; + T4 = T2 * T3; + T1R = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T1S = FNMS(T5, T3, T1R); + T8 = T1 - T7; + T23 = T1T - T1S; + T12 = T1 + T7; + T1U = T1S + T1T; + } + { + E TF, T1p, TY, T1w, TL, T1r, TS, T1u; + { + E TB, TE, TC, T1o, TA, TD; + TB = ri[WS(rs, 4)]; + TE = ii[WS(rs, 4)]; + TA = W[6]; + TC = TA * TB; + T1o = TA * TE; + TD = W[7]; + TF = FMA(TD, TE, TC); + T1p = FNMS(TD, TB, T1o); + } + { + E TU, TX, TV, T1v, TT, TW; + TU = ri[WS(rs, 1)]; + TX = ii[WS(rs, 1)]; + TT = W[0]; + TV = TT * TU; + T1v = TT * TX; + TW = W[1]; + TY = FMA(TW, TX, TV); + T1w = FNMS(TW, TU, T1v); + } + { + E TH, TK, TI, T1q, TG, TJ; + TH = ri[WS(rs, 9)]; + TK = ii[WS(rs, 9)]; + TG = W[16]; + TI = TG * TH; + T1q = TG * TK; + TJ = W[17]; + TL = FMA(TJ, TK, TI); + T1r = FNMS(TJ, TH, T1q); + } + { + E TO, TR, TP, T1t, TN, TQ; + TO = ri[WS(rs, 6)]; + TR = ii[WS(rs, 6)]; + TN = W[10]; + TP = TN * TO; + T1t = TN * TR; + TQ = W[11]; + TS = FMA(TQ, TR, TP); + T1u = FNMS(TQ, TO, T1t); + } + TM = TF - TL; + TZ = TS - TY; + T10 = TM + TZ; + T1F = T1p + T1r; + T1G = T1u + T1w; + T1P = T1F + T1G; + T16 = TF + TL; + T17 = TS + TY; + T18 = T16 + T17; + T1s = T1p - T1r; + T1x = T1u - T1w; + T25 = T1s + T1x; + } + { + E Te, T1e, Tx, T1l, Tk, T1g, Tr, T1j; + { + E Ta, Td, Tb, T1d, T9, Tc; + Ta = ri[WS(rs, 2)]; + Td = ii[WS(rs, 2)]; + T9 = W[2]; + Tb = T9 * Ta; + T1d = T9 * Td; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + T1e = FNMS(Tc, Ta, T1d); + } + { + E Tt, Tw, Tu, T1k, Ts, Tv; + Tt = ri[WS(rs, 3)]; + Tw = ii[WS(rs, 3)]; + Ts = W[4]; + Tu = Ts * Tt; + T1k = Ts * Tw; + Tv = W[5]; + Tx = FMA(Tv, Tw, Tu); + T1l = FNMS(Tv, Tt, T1k); + } + { + E Tg, Tj, Th, T1f, Tf, Ti; + Tg = ri[WS(rs, 7)]; + Tj = ii[WS(rs, 7)]; + Tf = W[12]; + Th = Tf * Tg; + T1f = Tf * Tj; + Ti = W[13]; + Tk = FMA(Ti, Tj, Th); + T1g = FNMS(Ti, Tg, T1f); + } + { + E Tn, Tq, To, T1i, Tm, Tp; + Tn = ri[WS(rs, 8)]; + Tq = ii[WS(rs, 8)]; + Tm = W[14]; + To = Tm * Tn; + T1i = Tm * Tq; + Tp = W[15]; + Tr = FMA(Tp, Tq, To); + T1j = FNMS(Tp, Tn, T1i); + } + Tl = Te - Tk; + Ty = Tr - Tx; + Tz = Tl + Ty; + T1I = T1e + T1g; + T1J = T1j + T1l; + T1O = T1I + T1J; + T13 = Te + Tk; + T14 = Tr + Tx; + T15 = T13 + T14; + T1h = T1e - T1g; + T1m = T1j - T1l; + T24 = T1h + T1m; + } + { + E T1b, T11, T1a, T1z, T1B, T1n, T1y, T1A, T1c; + T1b = Tz - T10; + T11 = Tz + T10; + T1a = FNMS(KP250000000, T11, T8); + T1n = T1h - T1m; + T1y = T1s - T1x; + T1z = FMA(KP618033988, T1y, T1n); + T1B = FNMS(KP618033988, T1n, T1y); + ri[WS(rs, 5)] = T8 + T11; + T1A = FNMS(KP559016994, T1b, T1a); + ri[WS(rs, 7)] = FNMS(KP951056516, T1B, T1A); + ri[WS(rs, 3)] = FMA(KP951056516, T1B, T1A); + T1c = FMA(KP559016994, T1b, T1a); + ri[WS(rs, 9)] = FNMS(KP951056516, T1z, T1c); + ri[WS(rs, 1)] = FMA(KP951056516, T1z, T1c); + } + { + E T28, T26, T27, T2c, T2e, T2a, T2b, T2d, T29; + T28 = T24 - T25; + T26 = T24 + T25; + T27 = FNMS(KP250000000, T26, T23); + T2a = Tl - Ty; + T2b = TM - TZ; + T2c = FMA(KP618033988, T2b, T2a); + T2e = FNMS(KP618033988, T2a, T2b); + ii[WS(rs, 5)] = T26 + T23; + T2d = FNMS(KP559016994, T28, T27); + ii[WS(rs, 3)] = FNMS(KP951056516, T2e, T2d); + ii[WS(rs, 7)] = FMA(KP951056516, T2e, T2d); + T29 = FMA(KP559016994, T28, T27); + ii[WS(rs, 1)] = FNMS(KP951056516, T2c, T29); + ii[WS(rs, 9)] = FMA(KP951056516, T2c, T29); + } + { + E T1D, T19, T1C, T1L, T1N, T1H, T1K, T1M, T1E; + T1D = T15 - T18; + T19 = T15 + T18; + T1C = FNMS(KP250000000, T19, T12); + T1H = T1F - T1G; + T1K = T1I - T1J; + T1L = FNMS(KP618033988, T1K, T1H); + T1N = FMA(KP618033988, T1H, T1K); + ri[0] = T12 + T19; + T1M = FMA(KP559016994, T1D, T1C); + ri[WS(rs, 4)] = FNMS(KP951056516, T1N, T1M); + ri[WS(rs, 6)] = FMA(KP951056516, T1N, T1M); + T1E = FNMS(KP559016994, T1D, T1C); + ri[WS(rs, 2)] = FNMS(KP951056516, T1L, T1E); + ri[WS(rs, 8)] = FMA(KP951056516, T1L, T1E); + } + { + E T1W, T1Q, T1V, T20, T22, T1Y, T1Z, T21, T1X; + T1W = T1O - T1P; + T1Q = T1O + T1P; + T1V = FNMS(KP250000000, T1Q, T1U); + T1Y = T16 - T17; + T1Z = T13 - T14; + T20 = FNMS(KP618033988, T1Z, T1Y); + T22 = FMA(KP618033988, T1Y, T1Z); + ii[0] = T1Q + T1U; + T21 = FMA(KP559016994, T1W, T1V); + ii[WS(rs, 4)] = FMA(KP951056516, T22, T21); + ii[WS(rs, 6)] = FNMS(KP951056516, T22, T21); + T1X = FNMS(KP559016994, T1W, T1V); + ii[WS(rs, 2)] = FMA(KP951056516, T20, T1X); + ii[WS(rs, 8)] = FNMS(KP951056516, T20, T1X); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 10}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 10, "t1_10", twinstr, &GENUS, {48, 18, 54, 0}, 0, 0, 0 }; + +void X(codelet_t1_10) (planner *p) { + X(kdft_dit_register) (p, t1_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 10 -name t1_10 -include dft/scalar/t.h */ + +/* + * This function contains 102 FP additions, 60 FP multiplications, + * (or, 72 additions, 30 multiplications, 30 fused multiply/add), + * 45 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 18); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 18, MAKE_VOLATILE_STRIDE(20, rs)) { + E T7, T1O, TT, T1C, TF, TQ, TR, T1o, T1p, T1y, TX, TY, TZ, T1d, T1g; + E T1M, Ti, Tt, Tu, T1r, T1s, T1x, TU, TV, TW, T16, T19, T1L; + { + E T1, T1B, T6, T1A; + T1 = ri[0]; + T1B = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 5)]; + T5 = ii[WS(rs, 5)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T1A = FNMS(T4, T3, T2 * T5); + } + T7 = T1 - T6; + T1O = T1B - T1A; + TT = T1 + T6; + T1C = T1A + T1B; + } + { + E Tz, T1b, TP, T1f, TE, T1c, TK, T1e; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 4)]; + Ty = ii[WS(rs, 4)]; + Tv = W[6]; + Tx = W[7]; + Tz = FMA(Tv, Tw, Tx * Ty); + T1b = FNMS(Tx, Tw, Tv * Ty); + } + { + E TM, TO, TL, TN; + TM = ri[WS(rs, 1)]; + TO = ii[WS(rs, 1)]; + TL = W[0]; + TN = W[1]; + TP = FMA(TL, TM, TN * TO); + T1f = FNMS(TN, TM, TL * TO); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 9)]; + TD = ii[WS(rs, 9)]; + TA = W[16]; + TC = W[17]; + TE = FMA(TA, TB, TC * TD); + T1c = FNMS(TC, TB, TA * TD); + } + { + E TH, TJ, TG, TI; + TH = ri[WS(rs, 6)]; + TJ = ii[WS(rs, 6)]; + TG = W[10]; + TI = W[11]; + TK = FMA(TG, TH, TI * TJ); + T1e = FNMS(TI, TH, TG * TJ); + } + TF = Tz - TE; + TQ = TK - TP; + TR = TF + TQ; + T1o = T1b + T1c; + T1p = T1e + T1f; + T1y = T1o + T1p; + TX = Tz + TE; + TY = TK + TP; + TZ = TX + TY; + T1d = T1b - T1c; + T1g = T1e - T1f; + T1M = T1d + T1g; + } + { + E Tc, T14, Ts, T18, Th, T15, Tn, T17; + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 2)]; + Tb = ii[WS(rs, 2)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + T14 = FNMS(Ta, T9, T8 * Tb); + } + { + E Tp, Tr, To, Tq; + Tp = ri[WS(rs, 3)]; + Tr = ii[WS(rs, 3)]; + To = W[4]; + Tq = W[5]; + Ts = FMA(To, Tp, Tq * Tr); + T18 = FNMS(Tq, Tp, To * Tr); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 7)]; + Tg = ii[WS(rs, 7)]; + Td = W[12]; + Tf = W[13]; + Th = FMA(Td, Te, Tf * Tg); + T15 = FNMS(Tf, Te, Td * Tg); + } + { + E Tk, Tm, Tj, Tl; + Tk = ri[WS(rs, 8)]; + Tm = ii[WS(rs, 8)]; + Tj = W[14]; + Tl = W[15]; + Tn = FMA(Tj, Tk, Tl * Tm); + T17 = FNMS(Tl, Tk, Tj * Tm); + } + Ti = Tc - Th; + Tt = Tn - Ts; + Tu = Ti + Tt; + T1r = T14 + T15; + T1s = T17 + T18; + T1x = T1r + T1s; + TU = Tc + Th; + TV = Tn + Ts; + TW = TU + TV; + T16 = T14 - T15; + T19 = T17 - T18; + T1L = T16 + T19; + } + { + E T11, TS, T12, T1i, T1k, T1a, T1h, T1j, T13; + T11 = KP559016994 * (Tu - TR); + TS = Tu + TR; + T12 = FNMS(KP250000000, TS, T7); + T1a = T16 - T19; + T1h = T1d - T1g; + T1i = FMA(KP951056516, T1a, KP587785252 * T1h); + T1k = FNMS(KP587785252, T1a, KP951056516 * T1h); + ri[WS(rs, 5)] = T7 + TS; + T1j = T12 - T11; + ri[WS(rs, 7)] = T1j - T1k; + ri[WS(rs, 3)] = T1j + T1k; + T13 = T11 + T12; + ri[WS(rs, 9)] = T13 - T1i; + ri[WS(rs, 1)] = T13 + T1i; + } + { + E T1N, T1P, T1Q, T1U, T1W, T1S, T1T, T1V, T1R; + T1N = KP559016994 * (T1L - T1M); + T1P = T1L + T1M; + T1Q = FNMS(KP250000000, T1P, T1O); + T1S = Ti - Tt; + T1T = TF - TQ; + T1U = FMA(KP951056516, T1S, KP587785252 * T1T); + T1W = FNMS(KP587785252, T1S, KP951056516 * T1T); + ii[WS(rs, 5)] = T1P + T1O; + T1V = T1Q - T1N; + ii[WS(rs, 3)] = T1V - T1W; + ii[WS(rs, 7)] = T1W + T1V; + T1R = T1N + T1Q; + ii[WS(rs, 1)] = T1R - T1U; + ii[WS(rs, 9)] = T1U + T1R; + } + { + E T1m, T10, T1l, T1u, T1w, T1q, T1t, T1v, T1n; + T1m = KP559016994 * (TW - TZ); + T10 = TW + TZ; + T1l = FNMS(KP250000000, T10, TT); + T1q = T1o - T1p; + T1t = T1r - T1s; + T1u = FNMS(KP587785252, T1t, KP951056516 * T1q); + T1w = FMA(KP951056516, T1t, KP587785252 * T1q); + ri[0] = TT + T10; + T1v = T1m + T1l; + ri[WS(rs, 4)] = T1v - T1w; + ri[WS(rs, 6)] = T1v + T1w; + T1n = T1l - T1m; + ri[WS(rs, 2)] = T1n - T1u; + ri[WS(rs, 8)] = T1n + T1u; + } + { + E T1H, T1z, T1G, T1F, T1J, T1D, T1E, T1K, T1I; + T1H = KP559016994 * (T1x - T1y); + T1z = T1x + T1y; + T1G = FNMS(KP250000000, T1z, T1C); + T1D = TX - TY; + T1E = TU - TV; + T1F = FNMS(KP587785252, T1E, KP951056516 * T1D); + T1J = FMA(KP951056516, T1E, KP587785252 * T1D); + ii[0] = T1z + T1C; + T1K = T1H + T1G; + ii[WS(rs, 4)] = T1J + T1K; + ii[WS(rs, 6)] = T1K - T1J; + T1I = T1G - T1H; + ii[WS(rs, 2)] = T1F + T1I; + ii[WS(rs, 8)] = T1I - T1F; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 10}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 10, "t1_10", twinstr, &GENUS, {72, 30, 30, 0}, 0, 0, 0 }; + +void X(codelet_t1_10) (planner *p) { + X(kdft_dit_register) (p, t1_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_12.c new file mode 100644 index 000000000..2f8dc7c68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_12.c @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -name t1_12 -include dft/scalar/t.h */ + +/* + * This function contains 118 FP additions, 68 FP multiplications, + * (or, 72 additions, 22 multiplications, 46 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_12(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 22); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 22, MAKE_VOLATILE_STRIDE(24, rs)) { + E T1, T2i, Tl, T2e, T10, T1Y, TG, T1S, Ty, T2r, T1s, T2f, T1d, T21, T1H; + E T1Z, Te, T2o, T1l, T2h, TT, T1V, T1A, T1T; + T1 = ri[0]; + T2i = ii[0]; + { + E Th, Tk, Ti, T2d, Tg, Tj; + Th = ri[WS(rs, 6)]; + Tk = ii[WS(rs, 6)]; + Tg = W[10]; + Ti = Tg * Th; + T2d = Tg * Tk; + Tj = W[11]; + Tl = FMA(Tj, Tk, Ti); + T2e = FNMS(Tj, Th, T2d); + } + { + E TW, TZ, TX, T1X, TV, TY; + TW = ri[WS(rs, 9)]; + TZ = ii[WS(rs, 9)]; + TV = W[16]; + TX = TV * TW; + T1X = TV * TZ; + TY = W[17]; + T10 = FMA(TY, TZ, TX); + T1Y = FNMS(TY, TW, T1X); + } + { + E TC, TF, TD, T1R, TB, TE; + TC = ri[WS(rs, 3)]; + TF = ii[WS(rs, 3)]; + TB = W[4]; + TD = TB * TC; + T1R = TB * TF; + TE = W[5]; + TG = FMA(TE, TF, TD); + T1S = FNMS(TE, TC, T1R); + } + { + E Tn, Tq, To, T1o, Tt, Tw, Tu, T1q, Tm, Ts; + Tn = ri[WS(rs, 10)]; + Tq = ii[WS(rs, 10)]; + Tm = W[18]; + To = Tm * Tn; + T1o = Tm * Tq; + Tt = ri[WS(rs, 2)]; + Tw = ii[WS(rs, 2)]; + Ts = W[2]; + Tu = Ts * Tt; + T1q = Ts * Tw; + { + E Tr, T1p, Tx, T1r, Tp, Tv; + Tp = W[19]; + Tr = FMA(Tp, Tq, To); + T1p = FNMS(Tp, Tn, T1o); + Tv = W[3]; + Tx = FMA(Tv, Tw, Tu); + T1r = FNMS(Tv, Tt, T1q); + Ty = Tr + Tx; + T2r = Tx - Tr; + T1s = T1p - T1r; + T2f = T1p + T1r; + } + } + { + E T12, T15, T13, T1D, T18, T1b, T19, T1F, T11, T17; + T12 = ri[WS(rs, 1)]; + T15 = ii[WS(rs, 1)]; + T11 = W[0]; + T13 = T11 * T12; + T1D = T11 * T15; + T18 = ri[WS(rs, 5)]; + T1b = ii[WS(rs, 5)]; + T17 = W[8]; + T19 = T17 * T18; + T1F = T17 * T1b; + { + E T16, T1E, T1c, T1G, T14, T1a; + T14 = W[1]; + T16 = FMA(T14, T15, T13); + T1E = FNMS(T14, T12, T1D); + T1a = W[9]; + T1c = FMA(T1a, T1b, T19); + T1G = FNMS(T1a, T18, T1F); + T1d = T16 + T1c; + T21 = T1c - T16; + T1H = T1E - T1G; + T1Z = T1E + T1G; + } + } + { + E T3, T6, T4, T1h, T9, Tc, Ta, T1j, T2, T8; + T3 = ri[WS(rs, 4)]; + T6 = ii[WS(rs, 4)]; + T2 = W[6]; + T4 = T2 * T3; + T1h = T2 * T6; + T9 = ri[WS(rs, 8)]; + Tc = ii[WS(rs, 8)]; + T8 = W[14]; + Ta = T8 * T9; + T1j = T8 * Tc; + { + E T7, T1i, Td, T1k, T5, Tb; + T5 = W[7]; + T7 = FMA(T5, T6, T4); + T1i = FNMS(T5, T3, T1h); + Tb = W[15]; + Td = FMA(Tb, Tc, Ta); + T1k = FNMS(Tb, T9, T1j); + Te = T7 + Td; + T2o = Td - T7; + T1l = T1i - T1k; + T2h = T1i + T1k; + } + } + { + E TI, TL, TJ, T1w, TO, TR, TP, T1y, TH, TN; + TI = ri[WS(rs, 7)]; + TL = ii[WS(rs, 7)]; + TH = W[12]; + TJ = TH * TI; + T1w = TH * TL; + TO = ri[WS(rs, 11)]; + TR = ii[WS(rs, 11)]; + TN = W[20]; + TP = TN * TO; + T1y = TN * TR; + { + E TM, T1x, TS, T1z, TK, TQ; + TK = W[13]; + TM = FMA(TK, TL, TJ); + T1x = FNMS(TK, TI, T1w); + TQ = W[21]; + TS = FMA(TQ, TR, TP); + T1z = FNMS(TQ, TO, T1y); + TT = TM + TS; + T1V = TS - TM; + T1A = T1x - T1z; + T1T = T1x + T1z; + } + } + { + E TA, T28, T2k, T2m, T1f, T2l, T2b, T2c; + { + E Tf, Tz, T2g, T2j; + Tf = T1 + Te; + Tz = Tl + Ty; + TA = Tf + Tz; + T28 = Tf - Tz; + T2g = T2e + T2f; + T2j = T2h + T2i; + T2k = T2g + T2j; + T2m = T2j - T2g; + } + { + E TU, T1e, T29, T2a; + TU = TG + TT; + T1e = T10 + T1d; + T1f = TU + T1e; + T2l = TU - T1e; + T29 = T1S + T1T; + T2a = T1Y + T1Z; + T2b = T29 - T2a; + T2c = T29 + T2a; + } + ri[WS(rs, 6)] = TA - T1f; + ii[WS(rs, 6)] = T2k - T2c; + ri[0] = TA + T1f; + ii[0] = T2c + T2k; + ri[WS(rs, 3)] = T28 - T2b; + ii[WS(rs, 3)] = T2l + T2m; + ri[WS(rs, 9)] = T28 + T2b; + ii[WS(rs, 9)] = T2m - T2l; + } + { + E T1m, T1K, T2p, T2y, T2s, T2x, T1t, T1L, T1B, T1N, T1W, T25, T22, T26, T1I; + E T1O; + { + E T1g, T2n, T2q, T1n; + T1g = FNMS(KP500000000, Te, T1); + T1m = FNMS(KP866025403, T1l, T1g); + T1K = FMA(KP866025403, T1l, T1g); + T2n = FNMS(KP500000000, T2h, T2i); + T2p = FMA(KP866025403, T2o, T2n); + T2y = FNMS(KP866025403, T2o, T2n); + T2q = FNMS(KP500000000, T2f, T2e); + T2s = FMA(KP866025403, T2r, T2q); + T2x = FNMS(KP866025403, T2r, T2q); + T1n = FNMS(KP500000000, Ty, Tl); + T1t = FNMS(KP866025403, T1s, T1n); + T1L = FMA(KP866025403, T1s, T1n); + } + { + E T1v, T1U, T20, T1C; + T1v = FNMS(KP500000000, TT, TG); + T1B = FNMS(KP866025403, T1A, T1v); + T1N = FMA(KP866025403, T1A, T1v); + T1U = FNMS(KP500000000, T1T, T1S); + T1W = FMA(KP866025403, T1V, T1U); + T25 = FNMS(KP866025403, T1V, T1U); + T20 = FNMS(KP500000000, T1Z, T1Y); + T22 = FMA(KP866025403, T21, T20); + T26 = FNMS(KP866025403, T21, T20); + T1C = FNMS(KP500000000, T1d, T10); + T1I = FNMS(KP866025403, T1H, T1C); + T1O = FMA(KP866025403, T1H, T1C); + } + { + E T1u, T1J, T2z, T2A; + T1u = T1m + T1t; + T1J = T1B + T1I; + ri[WS(rs, 2)] = T1u - T1J; + ri[WS(rs, 8)] = T1u + T1J; + T2z = T2x + T2y; + T2A = T25 + T26; + ii[WS(rs, 2)] = T2z - T2A; + ii[WS(rs, 8)] = T2A + T2z; + } + { + E T1M, T1P, T2v, T2w; + T1M = T1K + T1L; + T1P = T1N + T1O; + ri[WS(rs, 10)] = T1M - T1P; + ri[WS(rs, 4)] = T1M + T1P; + T2v = T1W + T22; + T2w = T2s + T2p; + ii[WS(rs, 4)] = T2v + T2w; + ii[WS(rs, 10)] = T2w - T2v; + } + { + E T1Q, T23, T2t, T2u; + T1Q = T1K - T1L; + T23 = T1W - T22; + ri[WS(rs, 7)] = T1Q - T23; + ri[WS(rs, 1)] = T1Q + T23; + T2t = T2p - T2s; + T2u = T1N - T1O; + ii[WS(rs, 1)] = T2t - T2u; + ii[WS(rs, 7)] = T2u + T2t; + } + { + E T24, T27, T2B, T2C; + T24 = T1m - T1t; + T27 = T25 - T26; + ri[WS(rs, 11)] = T24 - T27; + ri[WS(rs, 5)] = T24 + T27; + T2B = T2y - T2x; + T2C = T1B - T1I; + ii[WS(rs, 5)] = T2B - T2C; + ii[WS(rs, 11)] = T2C + T2B; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 12}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 12, "t1_12", twinstr, &GENUS, {72, 22, 46, 0}, 0, 0, 0 }; + +void X(codelet_t1_12) (planner *p) { + X(kdft_dit_register) (p, t1_12, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 12 -name t1_12 -include dft/scalar/t.h */ + +/* + * This function contains 118 FP additions, 60 FP multiplications, + * (or, 88 additions, 30 multiplications, 30 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_12(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + (mb * 22); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 22, MAKE_VOLATILE_STRIDE(24, rs)) { + E T1, T1W, T18, T21, Tc, T15, T1V, T22, TR, T1E, T1o, T1D, T12, T1l, T1F; + E T1G, Ti, T1S, T1d, T24, Tt, T1a, T1T, T25, TA, T1z, T1j, T1y, TL, T1g; + E T1A, T1B; + { + E T6, T16, Tb, T17; + T1 = ri[0]; + T1W = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 4)]; + T5 = ii[WS(rs, 4)]; + T2 = W[6]; + T4 = W[7]; + T6 = FMA(T2, T3, T4 * T5); + T16 = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 8)]; + Ta = ii[WS(rs, 8)]; + T7 = W[14]; + T9 = W[15]; + Tb = FMA(T7, T8, T9 * Ta); + T17 = FNMS(T9, T8, T7 * Ta); + } + T18 = KP866025403 * (T16 - T17); + T21 = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + T15 = FNMS(KP500000000, Tc, T1); + T1V = T16 + T17; + T22 = FNMS(KP500000000, T1V, T1W); + } + { + E T11, T1n, TW, T1m; + { + E TO, TQ, TN, TP; + TO = ri[WS(rs, 9)]; + TQ = ii[WS(rs, 9)]; + TN = W[16]; + TP = W[17]; + TR = FMA(TN, TO, TP * TQ); + T1E = FNMS(TP, TO, TN * TQ); + } + { + E TY, T10, TX, TZ; + TY = ri[WS(rs, 5)]; + T10 = ii[WS(rs, 5)]; + TX = W[8]; + TZ = W[9]; + T11 = FMA(TX, TY, TZ * T10); + T1n = FNMS(TZ, TY, TX * T10); + } + { + E TT, TV, TS, TU; + TT = ri[WS(rs, 1)]; + TV = ii[WS(rs, 1)]; + TS = W[0]; + TU = W[1]; + TW = FMA(TS, TT, TU * TV); + T1m = FNMS(TU, TT, TS * TV); + } + T1o = KP866025403 * (T1m - T1n); + T1D = KP866025403 * (T11 - TW); + T12 = TW + T11; + T1l = FNMS(KP500000000, T12, TR); + T1F = T1m + T1n; + T1G = FNMS(KP500000000, T1F, T1E); + } + { + E Ts, T1c, Tn, T1b; + { + E Tf, Th, Te, Tg; + Tf = ri[WS(rs, 6)]; + Th = ii[WS(rs, 6)]; + Te = W[10]; + Tg = W[11]; + Ti = FMA(Te, Tf, Tg * Th); + T1S = FNMS(Tg, Tf, Te * Th); + } + { + E Tp, Tr, To, Tq; + Tp = ri[WS(rs, 2)]; + Tr = ii[WS(rs, 2)]; + To = W[2]; + Tq = W[3]; + Ts = FMA(To, Tp, Tq * Tr); + T1c = FNMS(Tq, Tp, To * Tr); + } + { + E Tk, Tm, Tj, Tl; + Tk = ri[WS(rs, 10)]; + Tm = ii[WS(rs, 10)]; + Tj = W[18]; + Tl = W[19]; + Tn = FMA(Tj, Tk, Tl * Tm); + T1b = FNMS(Tl, Tk, Tj * Tm); + } + T1d = KP866025403 * (T1b - T1c); + T24 = KP866025403 * (Ts - Tn); + Tt = Tn + Ts; + T1a = FNMS(KP500000000, Tt, Ti); + T1T = T1b + T1c; + T25 = FNMS(KP500000000, T1T, T1S); + } + { + E TK, T1i, TF, T1h; + { + E Tx, Tz, Tw, Ty; + Tx = ri[WS(rs, 3)]; + Tz = ii[WS(rs, 3)]; + Tw = W[4]; + Ty = W[5]; + TA = FMA(Tw, Tx, Ty * Tz); + T1z = FNMS(Ty, Tx, Tw * Tz); + } + { + E TH, TJ, TG, TI; + TH = ri[WS(rs, 11)]; + TJ = ii[WS(rs, 11)]; + TG = W[20]; + TI = W[21]; + TK = FMA(TG, TH, TI * TJ); + T1i = FNMS(TI, TH, TG * TJ); + } + { + E TC, TE, TB, TD; + TC = ri[WS(rs, 7)]; + TE = ii[WS(rs, 7)]; + TB = W[12]; + TD = W[13]; + TF = FMA(TB, TC, TD * TE); + T1h = FNMS(TD, TC, TB * TE); + } + T1j = KP866025403 * (T1h - T1i); + T1y = KP866025403 * (TK - TF); + TL = TF + TK; + T1g = FNMS(KP500000000, TL, TA); + T1A = T1h + T1i; + T1B = FNMS(KP500000000, T1A, T1z); + } + { + E Tv, T1N, T1Y, T20, T14, T1Z, T1Q, T1R; + { + E Td, Tu, T1U, T1X; + Td = T1 + Tc; + Tu = Ti + Tt; + Tv = Td + Tu; + T1N = Td - Tu; + T1U = T1S + T1T; + T1X = T1V + T1W; + T1Y = T1U + T1X; + T20 = T1X - T1U; + } + { + E TM, T13, T1O, T1P; + TM = TA + TL; + T13 = TR + T12; + T14 = TM + T13; + T1Z = TM - T13; + T1O = T1z + T1A; + T1P = T1E + T1F; + T1Q = T1O - T1P; + T1R = T1O + T1P; + } + ri[WS(rs, 6)] = Tv - T14; + ii[WS(rs, 6)] = T1Y - T1R; + ri[0] = Tv + T14; + ii[0] = T1R + T1Y; + ri[WS(rs, 3)] = T1N - T1Q; + ii[WS(rs, 3)] = T1Z + T20; + ri[WS(rs, 9)] = T1N + T1Q; + ii[WS(rs, 9)] = T20 - T1Z; + } + { + E T1t, T1x, T27, T2a, T1w, T28, T1I, T29; + { + E T1r, T1s, T23, T26; + T1r = T15 + T18; + T1s = T1a + T1d; + T1t = T1r + T1s; + T1x = T1r - T1s; + T23 = T21 + T22; + T26 = T24 + T25; + T27 = T23 - T26; + T2a = T26 + T23; + } + { + E T1u, T1v, T1C, T1H; + T1u = T1g + T1j; + T1v = T1l + T1o; + T1w = T1u + T1v; + T28 = T1u - T1v; + T1C = T1y + T1B; + T1H = T1D + T1G; + T1I = T1C - T1H; + T29 = T1C + T1H; + } + ri[WS(rs, 10)] = T1t - T1w; + ii[WS(rs, 10)] = T2a - T29; + ri[WS(rs, 4)] = T1t + T1w; + ii[WS(rs, 4)] = T29 + T2a; + ri[WS(rs, 7)] = T1x - T1I; + ii[WS(rs, 7)] = T28 + T27; + ri[WS(rs, 1)] = T1x + T1I; + ii[WS(rs, 1)] = T27 - T28; + } + { + E T1f, T1J, T2d, T2f, T1q, T2g, T1M, T2e; + { + E T19, T1e, T2b, T2c; + T19 = T15 - T18; + T1e = T1a - T1d; + T1f = T19 + T1e; + T1J = T19 - T1e; + T2b = T25 - T24; + T2c = T22 - T21; + T2d = T2b + T2c; + T2f = T2c - T2b; + } + { + E T1k, T1p, T1K, T1L; + T1k = T1g - T1j; + T1p = T1l - T1o; + T1q = T1k + T1p; + T2g = T1k - T1p; + T1K = T1B - T1y; + T1L = T1G - T1D; + T1M = T1K - T1L; + T2e = T1K + T1L; + } + ri[WS(rs, 2)] = T1f - T1q; + ii[WS(rs, 2)] = T2d - T2e; + ri[WS(rs, 8)] = T1f + T1q; + ii[WS(rs, 8)] = T2e + T2d; + ri[WS(rs, 11)] = T1J - T1M; + ii[WS(rs, 11)] = T2g + T2f; + ri[WS(rs, 5)] = T1J + T1M; + ii[WS(rs, 5)] = T2f - T2g; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 12}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 12, "t1_12", twinstr, &GENUS, {88, 30, 30, 0}, 0, 0, 0 }; + +void X(codelet_t1_12) (planner *p) { + X(kdft_dit_register) (p, t1_12, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_15.c new file mode 100644 index 000000000..ca40b0c4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_15.c @@ -0,0 +1,816 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 15 -name t1_15 -include dft/scalar/t.h */ + +/* + * This function contains 184 FP additions, 140 FP multiplications, + * (or, 72 additions, 28 multiplications, 112 fused multiply/add), + * 51 stack variables, 6 constants, and 60 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_15(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 28); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 28, MAKE_VOLATILE_STRIDE(30, rs)) { + E T1, T3j, T1G, T3u, Te, T1B, T3i, T3t, T1y, T2i, T2a, T2M, T37, T2V, Tz; + E T2e, T1O, T2t, T39, T2X, TT, T2f, T1V, T2z, T3a, T2Y, T1e, T2h, T23, T2G; + E T36, T2U; + { + E T7, T1D, Td, T1F; + T1 = ri[0]; + T3j = ii[0]; + { + E T3, T6, T4, T1C, T2, T5; + T3 = ri[WS(rs, 5)]; + T6 = ii[WS(rs, 5)]; + T2 = W[8]; + T4 = T2 * T3; + T1C = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T1D = FNMS(T5, T3, T1C); + } + { + E T9, Tc, Ta, T1E, T8, Tb; + T9 = ri[WS(rs, 10)]; + Tc = ii[WS(rs, 10)]; + T8 = W[18]; + Ta = T8 * T9; + T1E = T8 * Tc; + Tb = W[19]; + Td = FMA(Tb, Tc, Ta); + T1F = FNMS(Tb, T9, T1E); + } + T1G = T1D - T1F; + T3u = Td - T7; + Te = T7 + Td; + T1B = FNMS(KP500000000, Te, T1); + T3i = T1D + T1F; + T3t = FNMS(KP500000000, T3i, T3j); + } + { + E T1k, T2I, T1w, T28, T1q, T26; + { + E T1g, T1j, T1h, T2H, T1f, T1i; + T1g = ri[WS(rs, 9)]; + T1j = ii[WS(rs, 9)]; + T1f = W[16]; + T1h = T1f * T1g; + T2H = T1f * T1j; + T1i = W[17]; + T1k = FMA(T1i, T1j, T1h); + T2I = FNMS(T1i, T1g, T2H); + } + { + E T1s, T1v, T1t, T27, T1r, T1u; + T1s = ri[WS(rs, 4)]; + T1v = ii[WS(rs, 4)]; + T1r = W[6]; + T1t = T1r * T1s; + T27 = T1r * T1v; + T1u = W[7]; + T1w = FMA(T1u, T1v, T1t); + T28 = FNMS(T1u, T1s, T27); + } + { + E T1m, T1p, T1n, T25, T1l, T1o; + T1m = ri[WS(rs, 14)]; + T1p = ii[WS(rs, 14)]; + T1l = W[26]; + T1n = T1l * T1m; + T25 = T1l * T1p; + T1o = W[27]; + T1q = FMA(T1o, T1p, T1n); + T26 = FNMS(T1o, T1m, T25); + } + { + E T29, T1x, T24, T2L, T2J, T2K; + T29 = T26 - T28; + T1x = T1q + T1w; + T24 = FNMS(KP500000000, T1x, T1k); + T1y = T1k + T1x; + T2i = FMA(KP866025403, T29, T24); + T2a = FNMS(KP866025403, T29, T24); + T2L = T1w - T1q; + T2J = T26 + T28; + T2K = FNMS(KP500000000, T2J, T2I); + T2M = FMA(KP866025403, T2L, T2K); + T37 = T2I + T2J; + T2V = FNMS(KP866025403, T2L, T2K); + } + } + { + E Tl, T2p, Tx, T1M, Tr, T1K; + { + E Th, Tk, Ti, T2o, Tg, Tj; + Th = ri[WS(rs, 3)]; + Tk = ii[WS(rs, 3)]; + Tg = W[4]; + Ti = Tg * Th; + T2o = Tg * Tk; + Tj = W[5]; + Tl = FMA(Tj, Tk, Ti); + T2p = FNMS(Tj, Th, T2o); + } + { + E Tt, Tw, Tu, T1L, Ts, Tv; + Tt = ri[WS(rs, 13)]; + Tw = ii[WS(rs, 13)]; + Ts = W[24]; + Tu = Ts * Tt; + T1L = Ts * Tw; + Tv = W[25]; + Tx = FMA(Tv, Tw, Tu); + T1M = FNMS(Tv, Tt, T1L); + } + { + E Tn, Tq, To, T1J, Tm, Tp; + Tn = ri[WS(rs, 8)]; + Tq = ii[WS(rs, 8)]; + Tm = W[14]; + To = Tm * Tn; + T1J = Tm * Tq; + Tp = W[15]; + Tr = FMA(Tp, Tq, To); + T1K = FNMS(Tp, Tn, T1J); + } + { + E T1N, Ty, T1I, T2s, T2q, T2r; + T1N = T1K - T1M; + Ty = Tr + Tx; + T1I = FNMS(KP500000000, Ty, Tl); + Tz = Tl + Ty; + T2e = FMA(KP866025403, T1N, T1I); + T1O = FNMS(KP866025403, T1N, T1I); + T2s = Tx - Tr; + T2q = T1K + T1M; + T2r = FNMS(KP500000000, T2q, T2p); + T2t = FMA(KP866025403, T2s, T2r); + T39 = T2p + T2q; + T2X = FNMS(KP866025403, T2s, T2r); + } + } + { + E TF, T2v, TR, T1T, TL, T1R; + { + E TB, TE, TC, T2u, TA, TD; + TB = ri[WS(rs, 12)]; + TE = ii[WS(rs, 12)]; + TA = W[22]; + TC = TA * TB; + T2u = TA * TE; + TD = W[23]; + TF = FMA(TD, TE, TC); + T2v = FNMS(TD, TB, T2u); + } + { + E TN, TQ, TO, T1S, TM, TP; + TN = ri[WS(rs, 7)]; + TQ = ii[WS(rs, 7)]; + TM = W[12]; + TO = TM * TN; + T1S = TM * TQ; + TP = W[13]; + TR = FMA(TP, TQ, TO); + T1T = FNMS(TP, TN, T1S); + } + { + E TH, TK, TI, T1Q, TG, TJ; + TH = ri[WS(rs, 2)]; + TK = ii[WS(rs, 2)]; + TG = W[2]; + TI = TG * TH; + T1Q = TG * TK; + TJ = W[3]; + TL = FMA(TJ, TK, TI); + T1R = FNMS(TJ, TH, T1Q); + } + { + E T1U, TS, T1P, T2y, T2w, T2x; + T1U = T1R - T1T; + TS = TL + TR; + T1P = FNMS(KP500000000, TS, TF); + TT = TF + TS; + T2f = FMA(KP866025403, T1U, T1P); + T1V = FNMS(KP866025403, T1U, T1P); + T2y = TR - TL; + T2w = T1R + T1T; + T2x = FNMS(KP500000000, T2w, T2v); + T2z = FMA(KP866025403, T2y, T2x); + T3a = T2v + T2w; + T2Y = FNMS(KP866025403, T2y, T2x); + } + } + { + E T10, T2C, T1c, T21, T16, T1Z; + { + E TW, TZ, TX, T2B, TV, TY; + TW = ri[WS(rs, 6)]; + TZ = ii[WS(rs, 6)]; + TV = W[10]; + TX = TV * TW; + T2B = TV * TZ; + TY = W[11]; + T10 = FMA(TY, TZ, TX); + T2C = FNMS(TY, TW, T2B); + } + { + E T18, T1b, T19, T20, T17, T1a; + T18 = ri[WS(rs, 1)]; + T1b = ii[WS(rs, 1)]; + T17 = W[0]; + T19 = T17 * T18; + T20 = T17 * T1b; + T1a = W[1]; + T1c = FMA(T1a, T1b, T19); + T21 = FNMS(T1a, T18, T20); + } + { + E T12, T15, T13, T1Y, T11, T14; + T12 = ri[WS(rs, 11)]; + T15 = ii[WS(rs, 11)]; + T11 = W[20]; + T13 = T11 * T12; + T1Y = T11 * T15; + T14 = W[21]; + T16 = FMA(T14, T15, T13); + T1Z = FNMS(T14, T12, T1Y); + } + { + E T22, T1d, T1X, T2F, T2D, T2E; + T22 = T1Z - T21; + T1d = T16 + T1c; + T1X = FNMS(KP500000000, T1d, T10); + T1e = T10 + T1d; + T2h = FMA(KP866025403, T22, T1X); + T23 = FNMS(KP866025403, T22, T1X); + T2F = T1c - T16; + T2D = T1Z + T21; + T2E = FNMS(KP500000000, T2D, T2C); + T2G = FMA(KP866025403, T2F, T2E); + T36 = T2C + T2D; + T2U = FNMS(KP866025403, T2F, T2E); + } + } + { + E T3c, T3e, Tf, T1A, T33, T34, T3d, T35; + { + E T38, T3b, TU, T1z; + T38 = T36 - T37; + T3b = T39 - T3a; + T3c = FNMS(KP618033988, T3b, T38); + T3e = FMA(KP618033988, T38, T3b); + Tf = T1 + Te; + TU = Tz + TT; + T1z = T1e + T1y; + T1A = TU + T1z; + T33 = FNMS(KP250000000, T1A, Tf); + T34 = TU - T1z; + } + ri[0] = Tf + T1A; + T3d = FMA(KP559016994, T34, T33); + ri[WS(rs, 9)] = FNMS(KP951056516, T3e, T3d); + ri[WS(rs, 6)] = FMA(KP951056516, T3e, T3d); + T35 = FNMS(KP559016994, T34, T33); + ri[WS(rs, 12)] = FNMS(KP951056516, T3c, T35); + ri[WS(rs, 3)] = FMA(KP951056516, T3c, T35); + } + { + E T3q, T3s, T3k, T3h, T3l, T3m, T3r, T3n; + { + E T3o, T3p, T3f, T3g; + T3o = T1e - T1y; + T3p = Tz - TT; + T3q = FNMS(KP618033988, T3p, T3o); + T3s = FMA(KP618033988, T3o, T3p); + T3k = T3i + T3j; + T3f = T39 + T3a; + T3g = T36 + T37; + T3h = T3f + T3g; + T3l = FNMS(KP250000000, T3h, T3k); + T3m = T3f - T3g; + } + ii[0] = T3h + T3k; + T3r = FMA(KP559016994, T3m, T3l); + ii[WS(rs, 6)] = FNMS(KP951056516, T3s, T3r); + ii[WS(rs, 9)] = FMA(KP951056516, T3s, T3r); + T3n = FNMS(KP559016994, T3m, T3l); + ii[WS(rs, 3)] = FNMS(KP951056516, T3q, T3n); + ii[WS(rs, 12)] = FMA(KP951056516, T3q, T3n); + } + { + E T30, T32, T1H, T2c, T2R, T2S, T31, T2T; + { + E T2W, T2Z, T1W, T2b; + T2W = T2U - T2V; + T2Z = T2X - T2Y; + T30 = FNMS(KP618033988, T2Z, T2W); + T32 = FMA(KP618033988, T2W, T2Z); + T1H = FNMS(KP866025403, T1G, T1B); + T1W = T1O + T1V; + T2b = T23 + T2a; + T2c = T1W + T2b; + T2R = FNMS(KP250000000, T2c, T1H); + T2S = T1W - T2b; + } + ri[WS(rs, 5)] = T1H + T2c; + T31 = FMA(KP559016994, T2S, T2R); + ri[WS(rs, 14)] = FNMS(KP951056516, T32, T31); + ri[WS(rs, 11)] = FMA(KP951056516, T32, T31); + T2T = FNMS(KP559016994, T2S, T2R); + ri[WS(rs, 2)] = FNMS(KP951056516, T30, T2T); + ri[WS(rs, 8)] = FMA(KP951056516, T30, T2T); + } + { + E T3Q, T3S, T3H, T3K, T3L, T3M, T3R, T3N; + { + E T3O, T3P, T3I, T3J; + T3O = T23 - T2a; + T3P = T1O - T1V; + T3Q = FNMS(KP618033988, T3P, T3O); + T3S = FMA(KP618033988, T3O, T3P); + T3H = FNMS(KP866025403, T3u, T3t); + T3I = T2X + T2Y; + T3J = T2U + T2V; + T3K = T3I + T3J; + T3L = FNMS(KP250000000, T3K, T3H); + T3M = T3I - T3J; + } + ii[WS(rs, 5)] = T3K + T3H; + T3R = FMA(KP559016994, T3M, T3L); + ii[WS(rs, 11)] = FNMS(KP951056516, T3S, T3R); + ii[WS(rs, 14)] = FMA(KP951056516, T3S, T3R); + T3N = FNMS(KP559016994, T3M, T3L); + ii[WS(rs, 2)] = FMA(KP951056516, T3Q, T3N); + ii[WS(rs, 8)] = FNMS(KP951056516, T3Q, T3N); + } + { + E T3E, T3G, T3v, T3y, T3z, T3A, T3F, T3B; + { + E T3C, T3D, T3w, T3x; + T3C = T2e - T2f; + T3D = T2h - T2i; + T3E = FMA(KP618033988, T3D, T3C); + T3G = FNMS(KP618033988, T3C, T3D); + T3v = FMA(KP866025403, T3u, T3t); + T3w = T2t + T2z; + T3x = T2G + T2M; + T3y = T3w + T3x; + T3z = FNMS(KP250000000, T3y, T3v); + T3A = T3w - T3x; + } + ii[WS(rs, 10)] = T3y + T3v; + T3F = FNMS(KP559016994, T3A, T3z); + ii[WS(rs, 7)] = FMA(KP951056516, T3G, T3F); + ii[WS(rs, 13)] = FNMS(KP951056516, T3G, T3F); + T3B = FMA(KP559016994, T3A, T3z); + ii[WS(rs, 1)] = FNMS(KP951056516, T3E, T3B); + ii[WS(rs, 4)] = FMA(KP951056516, T3E, T3B); + } + { + E T2O, T2Q, T2d, T2k, T2l, T2m, T2P, T2n; + { + E T2A, T2N, T2g, T2j; + T2A = T2t - T2z; + T2N = T2G - T2M; + T2O = FMA(KP618033988, T2N, T2A); + T2Q = FNMS(KP618033988, T2A, T2N); + T2d = FMA(KP866025403, T1G, T1B); + T2g = T2e + T2f; + T2j = T2h + T2i; + T2k = T2g + T2j; + T2l = FNMS(KP250000000, T2k, T2d); + T2m = T2g - T2j; + } + ri[WS(rs, 10)] = T2d + T2k; + T2P = FNMS(KP559016994, T2m, T2l); + ri[WS(rs, 7)] = FNMS(KP951056516, T2Q, T2P); + ri[WS(rs, 13)] = FMA(KP951056516, T2Q, T2P); + T2n = FMA(KP559016994, T2m, T2l); + ri[WS(rs, 4)] = FNMS(KP951056516, T2O, T2n); + ri[WS(rs, 1)] = FMA(KP951056516, T2O, T2n); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 15}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 15, "t1_15", twinstr, &GENUS, {72, 28, 112, 0}, 0, 0, 0 }; + +void X(codelet_t1_15) (planner *p) { + X(kdft_dit_register) (p, t1_15, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 15 -name t1_15 -include dft/scalar/t.h */ + +/* + * This function contains 184 FP additions, 112 FP multiplications, + * (or, 128 additions, 56 multiplications, 56 fused multiply/add), + * 65 stack variables, 6 constants, and 60 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_15(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + (mb * 28); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 28, MAKE_VOLATILE_STRIDE(30, rs)) { + E T1q, T34, Td, T1n, T2S, T35, T13, T1k, T1l, T2E, T2F, T2O, T1H, T1T, T2k; + E T2t, T2f, T2s, T1M, T1U, Tu, TL, TM, T2H, T2I, T2N, T1w, T1Q, T29, T2w; + E T24, T2v, T1B, T1R; + { + E T1, T2R, T6, T1o, Tb, T1p, Tc, T2Q; + T1 = ri[0]; + T2R = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 5)]; + T5 = ii[WS(rs, 5)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T1o = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 10)]; + Ta = ii[WS(rs, 10)]; + T7 = W[18]; + T9 = W[19]; + Tb = FMA(T7, T8, T9 * Ta); + T1p = FNMS(T9, T8, T7 * Ta); + } + T1q = KP866025403 * (T1o - T1p); + T34 = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + Td = T1 + Tc; + T1n = FNMS(KP500000000, Tc, T1); + T2Q = T1o + T1p; + T2S = T2Q + T2R; + T35 = FNMS(KP500000000, T2Q, T2R); + } + { + E TR, T2c, T18, T2h, TW, T1E, T11, T1F, T12, T2d, T1d, T1J, T1i, T1K, T1j; + E T2i; + { + E TO, TQ, TN, TP; + TO = ri[WS(rs, 6)]; + TQ = ii[WS(rs, 6)]; + TN = W[10]; + TP = W[11]; + TR = FMA(TN, TO, TP * TQ); + T2c = FNMS(TP, TO, TN * TQ); + } + { + E T15, T17, T14, T16; + T15 = ri[WS(rs, 9)]; + T17 = ii[WS(rs, 9)]; + T14 = W[16]; + T16 = W[17]; + T18 = FMA(T14, T15, T16 * T17); + T2h = FNMS(T16, T15, T14 * T17); + } + { + E TT, TV, TS, TU; + TT = ri[WS(rs, 11)]; + TV = ii[WS(rs, 11)]; + TS = W[20]; + TU = W[21]; + TW = FMA(TS, TT, TU * TV); + T1E = FNMS(TU, TT, TS * TV); + } + { + E TY, T10, TX, TZ; + TY = ri[WS(rs, 1)]; + T10 = ii[WS(rs, 1)]; + TX = W[0]; + TZ = W[1]; + T11 = FMA(TX, TY, TZ * T10); + T1F = FNMS(TZ, TY, TX * T10); + } + T12 = TW + T11; + T2d = T1E + T1F; + { + E T1a, T1c, T19, T1b; + T1a = ri[WS(rs, 14)]; + T1c = ii[WS(rs, 14)]; + T19 = W[26]; + T1b = W[27]; + T1d = FMA(T19, T1a, T1b * T1c); + T1J = FNMS(T1b, T1a, T19 * T1c); + } + { + E T1f, T1h, T1e, T1g; + T1f = ri[WS(rs, 4)]; + T1h = ii[WS(rs, 4)]; + T1e = W[6]; + T1g = W[7]; + T1i = FMA(T1e, T1f, T1g * T1h); + T1K = FNMS(T1g, T1f, T1e * T1h); + } + T1j = T1d + T1i; + T2i = T1J + T1K; + { + E T1D, T1G, T2g, T2j; + T13 = TR + T12; + T1k = T18 + T1j; + T1l = T13 + T1k; + T2E = T2c + T2d; + T2F = T2h + T2i; + T2O = T2E + T2F; + T1D = FNMS(KP500000000, T12, TR); + T1G = KP866025403 * (T1E - T1F); + T1H = T1D - T1G; + T1T = T1D + T1G; + T2g = KP866025403 * (T1i - T1d); + T2j = FNMS(KP500000000, T2i, T2h); + T2k = T2g + T2j; + T2t = T2j - T2g; + { + E T2b, T2e, T1I, T1L; + T2b = KP866025403 * (T11 - TW); + T2e = FNMS(KP500000000, T2d, T2c); + T2f = T2b + T2e; + T2s = T2e - T2b; + T1I = FNMS(KP500000000, T1j, T18); + T1L = KP866025403 * (T1J - T1K); + T1M = T1I - T1L; + T1U = T1I + T1L; + } + } + } + { + E Ti, T21, Tz, T26, Tn, T1t, Ts, T1u, Tt, T22, TE, T1y, TJ, T1z, TK; + E T27; + { + E Tf, Th, Te, Tg; + Tf = ri[WS(rs, 3)]; + Th = ii[WS(rs, 3)]; + Te = W[4]; + Tg = W[5]; + Ti = FMA(Te, Tf, Tg * Th); + T21 = FNMS(Tg, Tf, Te * Th); + } + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 12)]; + Ty = ii[WS(rs, 12)]; + Tv = W[22]; + Tx = W[23]; + Tz = FMA(Tv, Tw, Tx * Ty); + T26 = FNMS(Tx, Tw, Tv * Ty); + } + { + E Tk, Tm, Tj, Tl; + Tk = ri[WS(rs, 8)]; + Tm = ii[WS(rs, 8)]; + Tj = W[14]; + Tl = W[15]; + Tn = FMA(Tj, Tk, Tl * Tm); + T1t = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = ri[WS(rs, 13)]; + Tr = ii[WS(rs, 13)]; + To = W[24]; + Tq = W[25]; + Ts = FMA(To, Tp, Tq * Tr); + T1u = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn + Ts; + T22 = T1t + T1u; + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 2)]; + TD = ii[WS(rs, 2)]; + TA = W[2]; + TC = W[3]; + TE = FMA(TA, TB, TC * TD); + T1y = FNMS(TC, TB, TA * TD); + } + { + E TG, TI, TF, TH; + TG = ri[WS(rs, 7)]; + TI = ii[WS(rs, 7)]; + TF = W[12]; + TH = W[13]; + TJ = FMA(TF, TG, TH * TI); + T1z = FNMS(TH, TG, TF * TI); + } + TK = TE + TJ; + T27 = T1y + T1z; + { + E T1s, T1v, T25, T28; + Tu = Ti + Tt; + TL = Tz + TK; + TM = Tu + TL; + T2H = T21 + T22; + T2I = T26 + T27; + T2N = T2H + T2I; + T1s = FNMS(KP500000000, Tt, Ti); + T1v = KP866025403 * (T1t - T1u); + T1w = T1s - T1v; + T1Q = T1s + T1v; + T25 = KP866025403 * (TJ - TE); + T28 = FNMS(KP500000000, T27, T26); + T29 = T25 + T28; + T2w = T28 - T25; + { + E T20, T23, T1x, T1A; + T20 = KP866025403 * (Ts - Tn); + T23 = FNMS(KP500000000, T22, T21); + T24 = T20 + T23; + T2v = T23 - T20; + T1x = FNMS(KP500000000, TK, Tz); + T1A = KP866025403 * (T1y - T1z); + T1B = T1x - T1A; + T1R = T1x + T1A; + } + } + } + { + E T2C, T1m, T2B, T2K, T2M, T2G, T2J, T2L, T2D; + T2C = KP559016994 * (TM - T1l); + T1m = TM + T1l; + T2B = FNMS(KP250000000, T1m, Td); + T2G = T2E - T2F; + T2J = T2H - T2I; + T2K = FNMS(KP587785252, T2J, KP951056516 * T2G); + T2M = FMA(KP951056516, T2J, KP587785252 * T2G); + ri[0] = Td + T1m; + T2L = T2C + T2B; + ri[WS(rs, 9)] = T2L - T2M; + ri[WS(rs, 6)] = T2L + T2M; + T2D = T2B - T2C; + ri[WS(rs, 12)] = T2D - T2K; + ri[WS(rs, 3)] = T2D + T2K; + } + { + E T2U, T2P, T2T, T2Y, T30, T2W, T2X, T2Z, T2V; + T2U = KP559016994 * (T2N - T2O); + T2P = T2N + T2O; + T2T = FNMS(KP250000000, T2P, T2S); + T2W = T13 - T1k; + T2X = Tu - TL; + T2Y = FNMS(KP587785252, T2X, KP951056516 * T2W); + T30 = FMA(KP951056516, T2X, KP587785252 * T2W); + ii[0] = T2P + T2S; + T2Z = T2U + T2T; + ii[WS(rs, 6)] = T2Z - T30; + ii[WS(rs, 9)] = T30 + T2Z; + T2V = T2T - T2U; + ii[WS(rs, 3)] = T2V - T2Y; + ii[WS(rs, 12)] = T2Y + T2V; + } + { + E T2y, T2A, T1r, T1O, T2p, T2q, T2z, T2r; + { + E T2u, T2x, T1C, T1N; + T2u = T2s - T2t; + T2x = T2v - T2w; + T2y = FNMS(KP587785252, T2x, KP951056516 * T2u); + T2A = FMA(KP951056516, T2x, KP587785252 * T2u); + T1r = T1n - T1q; + T1C = T1w + T1B; + T1N = T1H + T1M; + T1O = T1C + T1N; + T2p = FNMS(KP250000000, T1O, T1r); + T2q = KP559016994 * (T1C - T1N); + } + ri[WS(rs, 5)] = T1r + T1O; + T2z = T2q + T2p; + ri[WS(rs, 14)] = T2z - T2A; + ri[WS(rs, 11)] = T2z + T2A; + T2r = T2p - T2q; + ri[WS(rs, 2)] = T2r - T2y; + ri[WS(rs, 8)] = T2r + T2y; + } + { + E T3h, T3q, T3i, T3l, T3m, T3n, T3p, T3o; + { + E T3f, T3g, T3j, T3k; + T3f = T1H - T1M; + T3g = T1w - T1B; + T3h = FNMS(KP587785252, T3g, KP951056516 * T3f); + T3q = FMA(KP951056516, T3g, KP587785252 * T3f); + T3i = T35 - T34; + T3j = T2v + T2w; + T3k = T2s + T2t; + T3l = T3j + T3k; + T3m = FNMS(KP250000000, T3l, T3i); + T3n = KP559016994 * (T3j - T3k); + } + ii[WS(rs, 5)] = T3l + T3i; + T3p = T3n + T3m; + ii[WS(rs, 11)] = T3p - T3q; + ii[WS(rs, 14)] = T3q + T3p; + T3o = T3m - T3n; + ii[WS(rs, 2)] = T3h + T3o; + ii[WS(rs, 8)] = T3o - T3h; + } + { + E T3c, T3d, T36, T37, T33, T38, T3e, T39; + { + E T3a, T3b, T31, T32; + T3a = T1Q - T1R; + T3b = T1T - T1U; + T3c = FMA(KP951056516, T3a, KP587785252 * T3b); + T3d = FNMS(KP587785252, T3a, KP951056516 * T3b); + T36 = T34 + T35; + T31 = T24 + T29; + T32 = T2f + T2k; + T37 = T31 + T32; + T33 = KP559016994 * (T31 - T32); + T38 = FNMS(KP250000000, T37, T36); + } + ii[WS(rs, 10)] = T37 + T36; + T3e = T38 - T33; + ii[WS(rs, 7)] = T3d + T3e; + ii[WS(rs, 13)] = T3e - T3d; + T39 = T33 + T38; + ii[WS(rs, 1)] = T39 - T3c; + ii[WS(rs, 4)] = T3c + T39; + } + { + E T2m, T2o, T1P, T1W, T1X, T1Y, T2n, T1Z; + { + E T2a, T2l, T1S, T1V; + T2a = T24 - T29; + T2l = T2f - T2k; + T2m = FMA(KP951056516, T2a, KP587785252 * T2l); + T2o = FNMS(KP587785252, T2a, KP951056516 * T2l); + T1P = T1n + T1q; + T1S = T1Q + T1R; + T1V = T1T + T1U; + T1W = T1S + T1V; + T1X = KP559016994 * (T1S - T1V); + T1Y = FNMS(KP250000000, T1W, T1P); + } + ri[WS(rs, 10)] = T1P + T1W; + T2n = T1Y - T1X; + ri[WS(rs, 7)] = T2n - T2o; + ri[WS(rs, 13)] = T2n + T2o; + T1Z = T1X + T1Y; + ri[WS(rs, 4)] = T1Z - T2m; + ri[WS(rs, 1)] = T1Z + T2m; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 15}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 15, "t1_15", twinstr, &GENUS, {128, 56, 56, 0}, 0, 0, 0 }; + +void X(codelet_t1_15) (planner *p) { + X(kdft_dit_register) (p, t1_15, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_16.c new file mode 100644 index 000000000..447b91295 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_16.c @@ -0,0 +1,796 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:15 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -name t1_16 -include dft/scalar/t.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 104 additions, 30 multiplications, 70 fused multiply/add), + * 60 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 30); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 30, MAKE_VOLATILE_STRIDE(32, rs)) { + E T8, T3z, T1I, T3o, T1s, T35, T2o, T2r, T1F, T36, T2p, T2w, Tl, T3A, T1N; + E T3k, Tz, T2V, T1T, T1U, T11, T30, T29, T2c, T1e, T31, T2a, T2h, TM, T2W; + E T1W, T21; + { + E T1, T3n, T3, T6, T4, T3l, T2, T7, T3m, T5; + T1 = ri[0]; + T3n = ii[0]; + T3 = ri[WS(rs, 8)]; + T6 = ii[WS(rs, 8)]; + T2 = W[14]; + T4 = T2 * T3; + T3l = T2 * T6; + T5 = W[15]; + T7 = FMA(T5, T6, T4); + T3m = FNMS(T5, T3, T3l); + T8 = T1 + T7; + T3z = T3n - T3m; + T1I = T1 - T7; + T3o = T3m + T3n; + } + { + E T1h, T1k, T1i, T2k, T1n, T1q, T1o, T2m, T1g, T1m; + T1h = ri[WS(rs, 15)]; + T1k = ii[WS(rs, 15)]; + T1g = W[28]; + T1i = T1g * T1h; + T2k = T1g * T1k; + T1n = ri[WS(rs, 7)]; + T1q = ii[WS(rs, 7)]; + T1m = W[12]; + T1o = T1m * T1n; + T2m = T1m * T1q; + { + E T1l, T2l, T1r, T2n, T1j, T1p; + T1j = W[29]; + T1l = FMA(T1j, T1k, T1i); + T2l = FNMS(T1j, T1h, T2k); + T1p = W[13]; + T1r = FMA(T1p, T1q, T1o); + T2n = FNMS(T1p, T1n, T2m); + T1s = T1l + T1r; + T35 = T2l + T2n; + T2o = T2l - T2n; + T2r = T1l - T1r; + } + } + { + E T1u, T1x, T1v, T2s, T1A, T1D, T1B, T2u, T1t, T1z; + T1u = ri[WS(rs, 3)]; + T1x = ii[WS(rs, 3)]; + T1t = W[4]; + T1v = T1t * T1u; + T2s = T1t * T1x; + T1A = ri[WS(rs, 11)]; + T1D = ii[WS(rs, 11)]; + T1z = W[20]; + T1B = T1z * T1A; + T2u = T1z * T1D; + { + E T1y, T2t, T1E, T2v, T1w, T1C; + T1w = W[5]; + T1y = FMA(T1w, T1x, T1v); + T2t = FNMS(T1w, T1u, T2s); + T1C = W[21]; + T1E = FMA(T1C, T1D, T1B); + T2v = FNMS(T1C, T1A, T2u); + T1F = T1y + T1E; + T36 = T2t + T2v; + T2p = T1y - T1E; + T2w = T2t - T2v; + } + } + { + E Ta, Td, Tb, T1J, Tg, Tj, Th, T1L, T9, Tf; + Ta = ri[WS(rs, 4)]; + Td = ii[WS(rs, 4)]; + T9 = W[6]; + Tb = T9 * Ta; + T1J = T9 * Td; + Tg = ri[WS(rs, 12)]; + Tj = ii[WS(rs, 12)]; + Tf = W[22]; + Th = Tf * Tg; + T1L = Tf * Tj; + { + E Te, T1K, Tk, T1M, Tc, Ti; + Tc = W[7]; + Te = FMA(Tc, Td, Tb); + T1K = FNMS(Tc, Ta, T1J); + Ti = W[23]; + Tk = FMA(Ti, Tj, Th); + T1M = FNMS(Ti, Tg, T1L); + Tl = Te + Tk; + T3A = Te - Tk; + T1N = T1K - T1M; + T3k = T1K + T1M; + } + } + { + E To, Tr, Tp, T1P, Tu, Tx, Tv, T1R, Tn, Tt; + To = ri[WS(rs, 2)]; + Tr = ii[WS(rs, 2)]; + Tn = W[2]; + Tp = Tn * To; + T1P = Tn * Tr; + Tu = ri[WS(rs, 10)]; + Tx = ii[WS(rs, 10)]; + Tt = W[18]; + Tv = Tt * Tu; + T1R = Tt * Tx; + { + E Ts, T1Q, Ty, T1S, Tq, Tw; + Tq = W[3]; + Ts = FMA(Tq, Tr, Tp); + T1Q = FNMS(Tq, To, T1P); + Tw = W[19]; + Ty = FMA(Tw, Tx, Tv); + T1S = FNMS(Tw, Tu, T1R); + Tz = Ts + Ty; + T2V = T1Q + T1S; + T1T = T1Q - T1S; + T1U = Ts - Ty; + } + } + { + E TQ, TT, TR, T25, TW, TZ, TX, T27, TP, TV; + TQ = ri[WS(rs, 1)]; + TT = ii[WS(rs, 1)]; + TP = W[0]; + TR = TP * TQ; + T25 = TP * TT; + TW = ri[WS(rs, 9)]; + TZ = ii[WS(rs, 9)]; + TV = W[16]; + TX = TV * TW; + T27 = TV * TZ; + { + E TU, T26, T10, T28, TS, TY; + TS = W[1]; + TU = FMA(TS, TT, TR); + T26 = FNMS(TS, TQ, T25); + TY = W[17]; + T10 = FMA(TY, TZ, TX); + T28 = FNMS(TY, TW, T27); + T11 = TU + T10; + T30 = T26 + T28; + T29 = T26 - T28; + T2c = TU - T10; + } + } + { + E T13, T16, T14, T2d, T19, T1c, T1a, T2f, T12, T18; + T13 = ri[WS(rs, 5)]; + T16 = ii[WS(rs, 5)]; + T12 = W[8]; + T14 = T12 * T13; + T2d = T12 * T16; + T19 = ri[WS(rs, 13)]; + T1c = ii[WS(rs, 13)]; + T18 = W[24]; + T1a = T18 * T19; + T2f = T18 * T1c; + { + E T17, T2e, T1d, T2g, T15, T1b; + T15 = W[9]; + T17 = FMA(T15, T16, T14); + T2e = FNMS(T15, T13, T2d); + T1b = W[25]; + T1d = FMA(T1b, T1c, T1a); + T2g = FNMS(T1b, T19, T2f); + T1e = T17 + T1d; + T31 = T2e + T2g; + T2a = T17 - T1d; + T2h = T2e - T2g; + } + } + { + E TB, TE, TC, T1X, TH, TK, TI, T1Z, TA, TG; + TB = ri[WS(rs, 14)]; + TE = ii[WS(rs, 14)]; + TA = W[26]; + TC = TA * TB; + T1X = TA * TE; + TH = ri[WS(rs, 6)]; + TK = ii[WS(rs, 6)]; + TG = W[10]; + TI = TG * TH; + T1Z = TG * TK; + { + E TF, T1Y, TL, T20, TD, TJ; + TD = W[27]; + TF = FMA(TD, TE, TC); + T1Y = FNMS(TD, TB, T1X); + TJ = W[11]; + TL = FMA(TJ, TK, TI); + T20 = FNMS(TJ, TH, T1Z); + TM = TF + TL; + T2W = T1Y + T20; + T1W = TF - TL; + T21 = T1Y - T20; + } + } + { + E TO, T3e, T3q, T3s, T1H, T3r, T3h, T3i; + { + E Tm, TN, T3j, T3p; + Tm = T8 + Tl; + TN = Tz + TM; + TO = Tm + TN; + T3e = Tm - TN; + T3j = T2V + T2W; + T3p = T3k + T3o; + T3q = T3j + T3p; + T3s = T3p - T3j; + } + { + E T1f, T1G, T3f, T3g; + T1f = T11 + T1e; + T1G = T1s + T1F; + T1H = T1f + T1G; + T3r = T1G - T1f; + T3f = T30 + T31; + T3g = T35 + T36; + T3h = T3f - T3g; + T3i = T3f + T3g; + } + ri[WS(rs, 8)] = TO - T1H; + ii[WS(rs, 8)] = T3q - T3i; + ri[0] = TO + T1H; + ii[0] = T3i + T3q; + ri[WS(rs, 12)] = T3e - T3h; + ii[WS(rs, 12)] = T3s - T3r; + ri[WS(rs, 4)] = T3e + T3h; + ii[WS(rs, 4)] = T3r + T3s; + } + { + E T2Y, T3a, T3v, T3x, T33, T3b, T38, T3c; + { + E T2U, T2X, T3t, T3u; + T2U = T8 - Tl; + T2X = T2V - T2W; + T2Y = T2U + T2X; + T3a = T2U - T2X; + T3t = TM - Tz; + T3u = T3o - T3k; + T3v = T3t + T3u; + T3x = T3u - T3t; + } + { + E T2Z, T32, T34, T37; + T2Z = T11 - T1e; + T32 = T30 - T31; + T33 = T2Z + T32; + T3b = T32 - T2Z; + T34 = T1s - T1F; + T37 = T35 - T36; + T38 = T34 - T37; + T3c = T34 + T37; + } + { + E T39, T3w, T3d, T3y; + T39 = T33 + T38; + ri[WS(rs, 10)] = FNMS(KP707106781, T39, T2Y); + ri[WS(rs, 2)] = FMA(KP707106781, T39, T2Y); + T3w = T3b + T3c; + ii[WS(rs, 2)] = FMA(KP707106781, T3w, T3v); + ii[WS(rs, 10)] = FNMS(KP707106781, T3w, T3v); + T3d = T3b - T3c; + ri[WS(rs, 14)] = FNMS(KP707106781, T3d, T3a); + ri[WS(rs, 6)] = FMA(KP707106781, T3d, T3a); + T3y = T38 - T33; + ii[WS(rs, 6)] = FMA(KP707106781, T3y, T3x); + ii[WS(rs, 14)] = FNMS(KP707106781, T3y, T3x); + } + } + { + E T1O, T3B, T3H, T2E, T23, T3C, T2O, T2S, T2H, T3I, T2j, T2B, T2L, T2R, T2y; + E T2C; + { + E T1V, T22, T2b, T2i; + T1O = T1I - T1N; + T3B = T3z - T3A; + T3H = T3A + T3z; + T2E = T1I + T1N; + T1V = T1T - T1U; + T22 = T1W + T21; + T23 = T1V - T22; + T3C = T1V + T22; + { + E T2M, T2N, T2F, T2G; + T2M = T2r + T2w; + T2N = T2o - T2p; + T2O = FNMS(KP414213562, T2N, T2M); + T2S = FMA(KP414213562, T2M, T2N); + T2F = T1U + T1T; + T2G = T1W - T21; + T2H = T2F + T2G; + T3I = T2G - T2F; + } + T2b = T29 + T2a; + T2i = T2c - T2h; + T2j = FMA(KP414213562, T2i, T2b); + T2B = FNMS(KP414213562, T2b, T2i); + { + E T2J, T2K, T2q, T2x; + T2J = T2c + T2h; + T2K = T29 - T2a; + T2L = FMA(KP414213562, T2K, T2J); + T2R = FNMS(KP414213562, T2J, T2K); + T2q = T2o + T2p; + T2x = T2r - T2w; + T2y = FNMS(KP414213562, T2x, T2q); + T2C = FMA(KP414213562, T2q, T2x); + } + } + { + E T24, T2z, T3J, T3K; + T24 = FMA(KP707106781, T23, T1O); + T2z = T2j - T2y; + ri[WS(rs, 11)] = FNMS(KP923879532, T2z, T24); + ri[WS(rs, 3)] = FMA(KP923879532, T2z, T24); + T3J = FMA(KP707106781, T3I, T3H); + T3K = T2C - T2B; + ii[WS(rs, 3)] = FMA(KP923879532, T3K, T3J); + ii[WS(rs, 11)] = FNMS(KP923879532, T3K, T3J); + } + { + E T2A, T2D, T3L, T3M; + T2A = FNMS(KP707106781, T23, T1O); + T2D = T2B + T2C; + ri[WS(rs, 7)] = FNMS(KP923879532, T2D, T2A); + ri[WS(rs, 15)] = FMA(KP923879532, T2D, T2A); + T3L = FNMS(KP707106781, T3I, T3H); + T3M = T2j + T2y; + ii[WS(rs, 7)] = FNMS(KP923879532, T3M, T3L); + ii[WS(rs, 15)] = FMA(KP923879532, T3M, T3L); + } + { + E T2I, T2P, T3D, T3E; + T2I = FMA(KP707106781, T2H, T2E); + T2P = T2L + T2O; + ri[WS(rs, 9)] = FNMS(KP923879532, T2P, T2I); + ri[WS(rs, 1)] = FMA(KP923879532, T2P, T2I); + T3D = FMA(KP707106781, T3C, T3B); + T3E = T2R + T2S; + ii[WS(rs, 1)] = FMA(KP923879532, T3E, T3D); + ii[WS(rs, 9)] = FNMS(KP923879532, T3E, T3D); + } + { + E T2Q, T2T, T3F, T3G; + T2Q = FNMS(KP707106781, T2H, T2E); + T2T = T2R - T2S; + ri[WS(rs, 13)] = FNMS(KP923879532, T2T, T2Q); + ri[WS(rs, 5)] = FMA(KP923879532, T2T, T2Q); + T3F = FNMS(KP707106781, T3C, T3B); + T3G = T2O - T2L; + ii[WS(rs, 5)] = FMA(KP923879532, T3G, T3F); + ii[WS(rs, 13)] = FNMS(KP923879532, T3G, T3F); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 16}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 16, "t1_16", twinstr, &GENUS, {104, 30, 70, 0}, 0, 0, 0 }; + +void X(codelet_t1_16) (planner *p) { + X(kdft_dit_register) (p, t1_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 16 -name t1_16 -include dft/scalar/t.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 136 additions, 46 multiplications, 38 fused multiply/add), + * 52 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 30); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 30, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T37, T1t, T2U, Ti, T38, T1w, T2R, Tu, T2s, T1C, T2c, TF, T2t, T1H; + E T2d, T1f, T1q, T2B, T2C, T2D, T2E, T1Z, T2j, T24, T2k, TS, T13, T2w, T2x; + E T2y, T2z, T1O, T2g, T1T, T2h; + { + E T1, T2T, T6, T2S; + T1 = ri[0]; + T2T = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 8)]; + T5 = ii[WS(rs, 8)]; + T2 = W[14]; + T4 = W[15]; + T6 = FMA(T2, T3, T4 * T5); + T2S = FNMS(T4, T3, T2 * T5); + } + T7 = T1 + T6; + T37 = T2T - T2S; + T1t = T1 - T6; + T2U = T2S + T2T; + } + { + E Tc, T1u, Th, T1v; + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 4)]; + Tb = ii[WS(rs, 4)]; + T8 = W[6]; + Ta = W[7]; + Tc = FMA(T8, T9, Ta * Tb); + T1u = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 12)]; + Tg = ii[WS(rs, 12)]; + Td = W[22]; + Tf = W[23]; + Th = FMA(Td, Te, Tf * Tg); + T1v = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc + Th; + T38 = Tc - Th; + T1w = T1u - T1v; + T2R = T1u + T1v; + } + { + E To, T1y, Tt, T1z, T1A, T1B; + { + E Tl, Tn, Tk, Tm; + Tl = ri[WS(rs, 2)]; + Tn = ii[WS(rs, 2)]; + Tk = W[2]; + Tm = W[3]; + To = FMA(Tk, Tl, Tm * Tn); + T1y = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = ri[WS(rs, 10)]; + Ts = ii[WS(rs, 10)]; + Tp = W[18]; + Tr = W[19]; + Tt = FMA(Tp, Tq, Tr * Ts); + T1z = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T2s = T1y + T1z; + T1A = T1y - T1z; + T1B = To - Tt; + T1C = T1A - T1B; + T2c = T1B + T1A; + } + { + E Tz, T1E, TE, T1F, T1D, T1G; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 14)]; + Ty = ii[WS(rs, 14)]; + Tv = W[26]; + Tx = W[27]; + Tz = FMA(Tv, Tw, Tx * Ty); + T1E = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 6)]; + TD = ii[WS(rs, 6)]; + TA = W[10]; + TC = W[11]; + TE = FMA(TA, TB, TC * TD); + T1F = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T2t = T1E + T1F; + T1D = Tz - TE; + T1G = T1E - T1F; + T1H = T1D + T1G; + T2d = T1D - T1G; + } + { + E T19, T20, T1p, T1X, T1e, T21, T1k, T1W; + { + E T16, T18, T15, T17; + T16 = ri[WS(rs, 15)]; + T18 = ii[WS(rs, 15)]; + T15 = W[28]; + T17 = W[29]; + T19 = FMA(T15, T16, T17 * T18); + T20 = FNMS(T17, T16, T15 * T18); + } + { + E T1m, T1o, T1l, T1n; + T1m = ri[WS(rs, 11)]; + T1o = ii[WS(rs, 11)]; + T1l = W[20]; + T1n = W[21]; + T1p = FMA(T1l, T1m, T1n * T1o); + T1X = FNMS(T1n, T1m, T1l * T1o); + } + { + E T1b, T1d, T1a, T1c; + T1b = ri[WS(rs, 7)]; + T1d = ii[WS(rs, 7)]; + T1a = W[12]; + T1c = W[13]; + T1e = FMA(T1a, T1b, T1c * T1d); + T21 = FNMS(T1c, T1b, T1a * T1d); + } + { + E T1h, T1j, T1g, T1i; + T1h = ri[WS(rs, 3)]; + T1j = ii[WS(rs, 3)]; + T1g = W[4]; + T1i = W[5]; + T1k = FMA(T1g, T1h, T1i * T1j); + T1W = FNMS(T1i, T1h, T1g * T1j); + } + T1f = T19 + T1e; + T1q = T1k + T1p; + T2B = T1f - T1q; + T2C = T20 + T21; + T2D = T1W + T1X; + T2E = T2C - T2D; + { + E T1V, T1Y, T22, T23; + T1V = T19 - T1e; + T1Y = T1W - T1X; + T1Z = T1V - T1Y; + T2j = T1V + T1Y; + T22 = T20 - T21; + T23 = T1k - T1p; + T24 = T22 + T23; + T2k = T22 - T23; + } + } + { + E TM, T1K, T12, T1R, TR, T1L, TX, T1Q; + { + E TJ, TL, TI, TK; + TJ = ri[WS(rs, 1)]; + TL = ii[WS(rs, 1)]; + TI = W[0]; + TK = W[1]; + TM = FMA(TI, TJ, TK * TL); + T1K = FNMS(TK, TJ, TI * TL); + } + { + E TZ, T11, TY, T10; + TZ = ri[WS(rs, 13)]; + T11 = ii[WS(rs, 13)]; + TY = W[24]; + T10 = W[25]; + T12 = FMA(TY, TZ, T10 * T11); + T1R = FNMS(T10, TZ, TY * T11); + } + { + E TO, TQ, TN, TP; + TO = ri[WS(rs, 9)]; + TQ = ii[WS(rs, 9)]; + TN = W[16]; + TP = W[17]; + TR = FMA(TN, TO, TP * TQ); + T1L = FNMS(TP, TO, TN * TQ); + } + { + E TU, TW, TT, TV; + TU = ri[WS(rs, 5)]; + TW = ii[WS(rs, 5)]; + TT = W[8]; + TV = W[9]; + TX = FMA(TT, TU, TV * TW); + T1Q = FNMS(TV, TU, TT * TW); + } + TS = TM + TR; + T13 = TX + T12; + T2w = TS - T13; + T2x = T1K + T1L; + T2y = T1Q + T1R; + T2z = T2x - T2y; + { + E T1M, T1N, T1P, T1S; + T1M = T1K - T1L; + T1N = TX - T12; + T1O = T1M + T1N; + T2g = T1M - T1N; + T1P = TM - TR; + T1S = T1Q - T1R; + T1T = T1P - T1S; + T2h = T1P + T1S; + } + } + { + E T1J, T27, T3g, T3i, T26, T3h, T2a, T3d; + { + E T1x, T1I, T3e, T3f; + T1x = T1t - T1w; + T1I = KP707106781 * (T1C - T1H); + T1J = T1x + T1I; + T27 = T1x - T1I; + T3e = KP707106781 * (T2d - T2c); + T3f = T38 + T37; + T3g = T3e + T3f; + T3i = T3f - T3e; + } + { + E T1U, T25, T28, T29; + T1U = FMA(KP923879532, T1O, KP382683432 * T1T); + T25 = FNMS(KP923879532, T24, KP382683432 * T1Z); + T26 = T1U + T25; + T3h = T25 - T1U; + T28 = FNMS(KP923879532, T1T, KP382683432 * T1O); + T29 = FMA(KP382683432, T24, KP923879532 * T1Z); + T2a = T28 - T29; + T3d = T28 + T29; + } + ri[WS(rs, 11)] = T1J - T26; + ii[WS(rs, 11)] = T3g - T3d; + ri[WS(rs, 3)] = T1J + T26; + ii[WS(rs, 3)] = T3d + T3g; + ri[WS(rs, 15)] = T27 - T2a; + ii[WS(rs, 15)] = T3i - T3h; + ri[WS(rs, 7)] = T27 + T2a; + ii[WS(rs, 7)] = T3h + T3i; + } + { + E T2v, T2H, T32, T34, T2G, T33, T2K, T2Z; + { + E T2r, T2u, T30, T31; + T2r = T7 - Ti; + T2u = T2s - T2t; + T2v = T2r + T2u; + T2H = T2r - T2u; + T30 = TF - Tu; + T31 = T2U - T2R; + T32 = T30 + T31; + T34 = T31 - T30; + } + { + E T2A, T2F, T2I, T2J; + T2A = T2w + T2z; + T2F = T2B - T2E; + T2G = KP707106781 * (T2A + T2F); + T33 = KP707106781 * (T2F - T2A); + T2I = T2z - T2w; + T2J = T2B + T2E; + T2K = KP707106781 * (T2I - T2J); + T2Z = KP707106781 * (T2I + T2J); + } + ri[WS(rs, 10)] = T2v - T2G; + ii[WS(rs, 10)] = T32 - T2Z; + ri[WS(rs, 2)] = T2v + T2G; + ii[WS(rs, 2)] = T2Z + T32; + ri[WS(rs, 14)] = T2H - T2K; + ii[WS(rs, 14)] = T34 - T33; + ri[WS(rs, 6)] = T2H + T2K; + ii[WS(rs, 6)] = T33 + T34; + } + { + E T2f, T2n, T3a, T3c, T2m, T3b, T2q, T35; + { + E T2b, T2e, T36, T39; + T2b = T1t + T1w; + T2e = KP707106781 * (T2c + T2d); + T2f = T2b + T2e; + T2n = T2b - T2e; + T36 = KP707106781 * (T1C + T1H); + T39 = T37 - T38; + T3a = T36 + T39; + T3c = T39 - T36; + } + { + E T2i, T2l, T2o, T2p; + T2i = FMA(KP382683432, T2g, KP923879532 * T2h); + T2l = FNMS(KP382683432, T2k, KP923879532 * T2j); + T2m = T2i + T2l; + T3b = T2l - T2i; + T2o = FNMS(KP382683432, T2h, KP923879532 * T2g); + T2p = FMA(KP923879532, T2k, KP382683432 * T2j); + T2q = T2o - T2p; + T35 = T2o + T2p; + } + ri[WS(rs, 9)] = T2f - T2m; + ii[WS(rs, 9)] = T3a - T35; + ri[WS(rs, 1)] = T2f + T2m; + ii[WS(rs, 1)] = T35 + T3a; + ri[WS(rs, 13)] = T2n - T2q; + ii[WS(rs, 13)] = T3c - T3b; + ri[WS(rs, 5)] = T2n + T2q; + ii[WS(rs, 5)] = T3b + T3c; + } + { + E TH, T2L, T2W, T2Y, T1s, T2X, T2O, T2P; + { + E Tj, TG, T2Q, T2V; + Tj = T7 + Ti; + TG = Tu + TF; + TH = Tj + TG; + T2L = Tj - TG; + T2Q = T2s + T2t; + T2V = T2R + T2U; + T2W = T2Q + T2V; + T2Y = T2V - T2Q; + } + { + E T14, T1r, T2M, T2N; + T14 = TS + T13; + T1r = T1f + T1q; + T1s = T14 + T1r; + T2X = T1r - T14; + T2M = T2x + T2y; + T2N = T2C + T2D; + T2O = T2M - T2N; + T2P = T2M + T2N; + } + ri[WS(rs, 8)] = TH - T1s; + ii[WS(rs, 8)] = T2W - T2P; + ri[0] = TH + T1s; + ii[0] = T2P + T2W; + ri[WS(rs, 12)] = T2L - T2O; + ii[WS(rs, 12)] = T2Y - T2X; + ri[WS(rs, 4)] = T2L + T2O; + ii[WS(rs, 4)] = T2X + T2Y; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 16}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 16, "t1_16", twinstr, &GENUS, {136, 46, 38, 0}, 0, 0, 0 }; + +void X(codelet_t1_16) (planner *p) { + X(kdft_dit_register) (p, t1_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_2.c new file mode 100644 index 000000000..c27c817f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_2.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -name t1_2 -include dft/scalar/t.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 2); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs)) { + E T1, Ta, T3, T6, T4, T8, T2, T7, T9, T5; + T1 = ri[0]; + Ta = ii[0]; + T3 = ri[WS(rs, 1)]; + T6 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + T8 = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + T9 = FNMS(T5, T3, T8); + ri[WS(rs, 1)] = T1 - T7; + ii[WS(rs, 1)] = Ta - T9; + ri[0] = T1 + T7; + ii[0] = T9 + Ta; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 2}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 2, "t1_2", twinstr, &GENUS, {4, 2, 2, 0}, 0, 0, 0 }; + +void X(codelet_t1_2) (planner *p) { + X(kdft_dit_register) (p, t1_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 2 -name t1_2 -include dft/scalar/t.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 2); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs)) { + E T1, T8, T6, T7; + T1 = ri[0]; + T8 = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 1)]; + T5 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + T7 = FNMS(T4, T3, T2 * T5); + } + ri[WS(rs, 1)] = T1 - T6; + ii[WS(rs, 1)] = T8 - T7; + ri[0] = T1 + T6; + ii[0] = T7 + T8; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 2}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 2, "t1_2", twinstr, &GENUS, {4, 2, 2, 0}, 0, 0, 0 }; + +void X(codelet_t1_2) (planner *p) { + X(kdft_dit_register) (p, t1_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_20.c new file mode 100644 index 000000000..39db001a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_20.c @@ -0,0 +1,1050 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:15 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -name t1_20 -include dft/scalar/t.h */ + +/* + * This function contains 246 FP additions, 148 FP multiplications, + * (or, 136 additions, 38 multiplications, 110 fused multiply/add), + * 61 stack variables, 4 constants, and 80 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + (mb * 38); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 38, MAKE_VOLATILE_STRIDE(40, rs)) { + E T8, T4N, T2i, T4r, Tl, T4O, T2n, T4n, TN, T2b, T40, T4b, T2v, T3v, T3i; + E T3F, T27, T2f, T3W, T4f, T2R, T3z, T3a, T3J, T1G, T2e, T3T, T4e, T2K, T3y; + E T33, T3I, T1e, T2c, T43, T4c, T2C, T3w, T3p, T3G; + { + E T1, T4q, T3, T6, T4, T4o, T2, T7, T4p, T5; + T1 = ri[0]; + T4q = ii[0]; + T3 = ri[WS(rs, 10)]; + T6 = ii[WS(rs, 10)]; + T2 = W[18]; + T4 = T2 * T3; + T4o = T2 * T6; + T5 = W[19]; + T7 = FMA(T5, T6, T4); + T4p = FNMS(T5, T3, T4o); + T8 = T1 + T7; + T4N = T4q - T4p; + T2i = T1 - T7; + T4r = T4p + T4q; + } + { + E Ta, Td, Tb, T2j, Tg, Tj, Th, T2l, T9, Tf; + Ta = ri[WS(rs, 5)]; + Td = ii[WS(rs, 5)]; + T9 = W[8]; + Tb = T9 * Ta; + T2j = T9 * Td; + Tg = ri[WS(rs, 15)]; + Tj = ii[WS(rs, 15)]; + Tf = W[28]; + Th = Tf * Tg; + T2l = Tf * Tj; + { + E Te, T2k, Tk, T2m, Tc, Ti; + Tc = W[9]; + Te = FMA(Tc, Td, Tb); + T2k = FNMS(Tc, Ta, T2j); + Ti = W[29]; + Tk = FMA(Ti, Tj, Th); + T2m = FNMS(Ti, Tg, T2l); + Tl = Te + Tk; + T4O = Te - Tk; + T2n = T2k - T2m; + T4n = T2k + T2m; + } + } + { + E Ts, T3d, TL, T2t, Ty, T3f, TF, T2r; + { + E To, Tr, Tp, T3c, Tn, Tq; + To = ri[WS(rs, 4)]; + Tr = ii[WS(rs, 4)]; + Tn = W[6]; + Tp = Tn * To; + T3c = Tn * Tr; + Tq = W[7]; + Ts = FMA(Tq, Tr, Tp); + T3d = FNMS(Tq, To, T3c); + } + { + E TH, TK, TI, T2s, TG, TJ; + TH = ri[WS(rs, 19)]; + TK = ii[WS(rs, 19)]; + TG = W[36]; + TI = TG * TH; + T2s = TG * TK; + TJ = W[37]; + TL = FMA(TJ, TK, TI); + T2t = FNMS(TJ, TH, T2s); + } + { + E Tu, Tx, Tv, T3e, Tt, Tw; + Tu = ri[WS(rs, 14)]; + Tx = ii[WS(rs, 14)]; + Tt = W[26]; + Tv = Tt * Tu; + T3e = Tt * Tx; + Tw = W[27]; + Ty = FMA(Tw, Tx, Tv); + T3f = FNMS(Tw, Tu, T3e); + } + { + E TB, TE, TC, T2q, TA, TD; + TB = ri[WS(rs, 9)]; + TE = ii[WS(rs, 9)]; + TA = W[16]; + TC = TA * TB; + T2q = TA * TE; + TD = W[17]; + TF = FMA(TD, TE, TC); + T2r = FNMS(TD, TB, T2q); + } + { + E Tz, TM, T3Y, T3Z; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz - TM; + T2b = Tz + TM; + T3Y = T3d + T3f; + T3Z = T2r + T2t; + T40 = T3Y - T3Z; + T4b = T3Y + T3Z; + } + { + E T2p, T2u, T3g, T3h; + T2p = Ts - Ty; + T2u = T2r - T2t; + T2v = T2p - T2u; + T3v = T2p + T2u; + T3g = T3d - T3f; + T3h = TF - TL; + T3i = T3g + T3h; + T3F = T3g - T3h; + } + } + { + E T1M, T35, T25, T2P, T1S, T37, T1Z, T2N; + { + E T1I, T1L, T1J, T34, T1H, T1K; + T1I = ri[WS(rs, 12)]; + T1L = ii[WS(rs, 12)]; + T1H = W[22]; + T1J = T1H * T1I; + T34 = T1H * T1L; + T1K = W[23]; + T1M = FMA(T1K, T1L, T1J); + T35 = FNMS(T1K, T1I, T34); + } + { + E T21, T24, T22, T2O, T20, T23; + T21 = ri[WS(rs, 7)]; + T24 = ii[WS(rs, 7)]; + T20 = W[12]; + T22 = T20 * T21; + T2O = T20 * T24; + T23 = W[13]; + T25 = FMA(T23, T24, T22); + T2P = FNMS(T23, T21, T2O); + } + { + E T1O, T1R, T1P, T36, T1N, T1Q; + T1O = ri[WS(rs, 2)]; + T1R = ii[WS(rs, 2)]; + T1N = W[2]; + T1P = T1N * T1O; + T36 = T1N * T1R; + T1Q = W[3]; + T1S = FMA(T1Q, T1R, T1P); + T37 = FNMS(T1Q, T1O, T36); + } + { + E T1V, T1Y, T1W, T2M, T1U, T1X; + T1V = ri[WS(rs, 17)]; + T1Y = ii[WS(rs, 17)]; + T1U = W[32]; + T1W = T1U * T1V; + T2M = T1U * T1Y; + T1X = W[33]; + T1Z = FMA(T1X, T1Y, T1W); + T2N = FNMS(T1X, T1V, T2M); + } + { + E T1T, T26, T3U, T3V; + T1T = T1M + T1S; + T26 = T1Z + T25; + T27 = T1T - T26; + T2f = T1T + T26; + T3U = T35 + T37; + T3V = T2N + T2P; + T3W = T3U - T3V; + T4f = T3U + T3V; + } + { + E T2L, T2Q, T38, T39; + T2L = T1M - T1S; + T2Q = T2N - T2P; + T2R = T2L - T2Q; + T3z = T2L + T2Q; + T38 = T35 - T37; + T39 = T1Z - T25; + T3a = T38 + T39; + T3J = T38 - T39; + } + } + { + E T1l, T2Y, T1E, T2I, T1r, T30, T1y, T2G; + { + E T1h, T1k, T1i, T2X, T1g, T1j; + T1h = ri[WS(rs, 8)]; + T1k = ii[WS(rs, 8)]; + T1g = W[14]; + T1i = T1g * T1h; + T2X = T1g * T1k; + T1j = W[15]; + T1l = FMA(T1j, T1k, T1i); + T2Y = FNMS(T1j, T1h, T2X); + } + { + E T1A, T1D, T1B, T2H, T1z, T1C; + T1A = ri[WS(rs, 3)]; + T1D = ii[WS(rs, 3)]; + T1z = W[4]; + T1B = T1z * T1A; + T2H = T1z * T1D; + T1C = W[5]; + T1E = FMA(T1C, T1D, T1B); + T2I = FNMS(T1C, T1A, T2H); + } + { + E T1n, T1q, T1o, T2Z, T1m, T1p; + T1n = ri[WS(rs, 18)]; + T1q = ii[WS(rs, 18)]; + T1m = W[34]; + T1o = T1m * T1n; + T2Z = T1m * T1q; + T1p = W[35]; + T1r = FMA(T1p, T1q, T1o); + T30 = FNMS(T1p, T1n, T2Z); + } + { + E T1u, T1x, T1v, T2F, T1t, T1w; + T1u = ri[WS(rs, 13)]; + T1x = ii[WS(rs, 13)]; + T1t = W[24]; + T1v = T1t * T1u; + T2F = T1t * T1x; + T1w = W[25]; + T1y = FMA(T1w, T1x, T1v); + T2G = FNMS(T1w, T1u, T2F); + } + { + E T1s, T1F, T3R, T3S; + T1s = T1l + T1r; + T1F = T1y + T1E; + T1G = T1s - T1F; + T2e = T1s + T1F; + T3R = T2Y + T30; + T3S = T2G + T2I; + T3T = T3R - T3S; + T4e = T3R + T3S; + } + { + E T2E, T2J, T31, T32; + T2E = T1l - T1r; + T2J = T2G - T2I; + T2K = T2E - T2J; + T3y = T2E + T2J; + T31 = T2Y - T30; + T32 = T1y - T1E; + T33 = T31 + T32; + T3I = T31 - T32; + } + } + { + E TT, T3k, T1c, T2A, TZ, T3m, T16, T2y; + { + E TP, TS, TQ, T3j, TO, TR; + TP = ri[WS(rs, 16)]; + TS = ii[WS(rs, 16)]; + TO = W[30]; + TQ = TO * TP; + T3j = TO * TS; + TR = W[31]; + TT = FMA(TR, TS, TQ); + T3k = FNMS(TR, TP, T3j); + } + { + E T18, T1b, T19, T2z, T17, T1a; + T18 = ri[WS(rs, 11)]; + T1b = ii[WS(rs, 11)]; + T17 = W[20]; + T19 = T17 * T18; + T2z = T17 * T1b; + T1a = W[21]; + T1c = FMA(T1a, T1b, T19); + T2A = FNMS(T1a, T18, T2z); + } + { + E TV, TY, TW, T3l, TU, TX; + TV = ri[WS(rs, 6)]; + TY = ii[WS(rs, 6)]; + TU = W[10]; + TW = TU * TV; + T3l = TU * TY; + TX = W[11]; + TZ = FMA(TX, TY, TW); + T3m = FNMS(TX, TV, T3l); + } + { + E T12, T15, T13, T2x, T11, T14; + T12 = ri[WS(rs, 1)]; + T15 = ii[WS(rs, 1)]; + T11 = W[0]; + T13 = T11 * T12; + T2x = T11 * T15; + T14 = W[1]; + T16 = FMA(T14, T15, T13); + T2y = FNMS(T14, T12, T2x); + } + { + E T10, T1d, T41, T42; + T10 = TT + TZ; + T1d = T16 + T1c; + T1e = T10 - T1d; + T2c = T10 + T1d; + T41 = T3k + T3m; + T42 = T2y + T2A; + T43 = T41 - T42; + T4c = T41 + T42; + } + { + E T2w, T2B, T3n, T3o; + T2w = TT - TZ; + T2B = T2y - T2A; + T2C = T2w - T2B; + T3w = T2w + T2B; + T3n = T3k - T3m; + T3o = T16 - T1c; + T3p = T3n + T3o; + T3G = T3n - T3o; + } + } + { + E T45, T47, Tm, T29, T3O, T3P, T46, T3Q; + { + E T3X, T44, T1f, T28; + T3X = T3T - T3W; + T44 = T40 - T43; + T45 = FNMS(KP618033988, T44, T3X); + T47 = FMA(KP618033988, T3X, T44); + Tm = T8 - Tl; + T1f = TN + T1e; + T28 = T1G + T27; + T29 = T1f + T28; + T3O = FNMS(KP250000000, T29, Tm); + T3P = T1f - T28; + } + ri[WS(rs, 10)] = Tm + T29; + T46 = FMA(KP559016994, T3P, T3O); + ri[WS(rs, 14)] = FNMS(KP951056516, T47, T46); + ri[WS(rs, 6)] = FMA(KP951056516, T47, T46); + T3Q = FNMS(KP559016994, T3P, T3O); + ri[WS(rs, 2)] = FNMS(KP951056516, T45, T3Q); + ri[WS(rs, 18)] = FMA(KP951056516, T45, T3Q); + } + { + E T4K, T4M, T4B, T4E, T4F, T4G, T4L, T4H; + { + E T4I, T4J, T4C, T4D; + T4I = T1G - T27; + T4J = TN - T1e; + T4K = FNMS(KP618033988, T4J, T4I); + T4M = FMA(KP618033988, T4I, T4J); + T4B = T4r - T4n; + T4C = T40 + T43; + T4D = T3T + T3W; + T4E = T4C + T4D; + T4F = FNMS(KP250000000, T4E, T4B); + T4G = T4C - T4D; + } + ii[WS(rs, 10)] = T4E + T4B; + T4L = FMA(KP559016994, T4G, T4F); + ii[WS(rs, 6)] = FNMS(KP951056516, T4M, T4L); + ii[WS(rs, 14)] = FMA(KP951056516, T4M, T4L); + T4H = FNMS(KP559016994, T4G, T4F); + ii[WS(rs, 2)] = FMA(KP951056516, T4K, T4H); + ii[WS(rs, 18)] = FNMS(KP951056516, T4K, T4H); + } + { + E T4h, T4j, T2a, T2h, T48, T49, T4i, T4a; + { + E T4d, T4g, T2d, T2g; + T4d = T4b - T4c; + T4g = T4e - T4f; + T4h = FMA(KP618033988, T4g, T4d); + T4j = FNMS(KP618033988, T4d, T4g); + T2a = T8 + Tl; + T2d = T2b + T2c; + T2g = T2e + T2f; + T2h = T2d + T2g; + T48 = FNMS(KP250000000, T2h, T2a); + T49 = T2d - T2g; + } + ri[0] = T2a + T2h; + T4i = FNMS(KP559016994, T49, T48); + ri[WS(rs, 12)] = FNMS(KP951056516, T4j, T4i); + ri[WS(rs, 8)] = FMA(KP951056516, T4j, T4i); + T4a = FMA(KP559016994, T49, T48); + ri[WS(rs, 4)] = FNMS(KP951056516, T4h, T4a); + ri[WS(rs, 16)] = FMA(KP951056516, T4h, T4a); + } + { + E T4y, T4A, T4s, T4m, T4t, T4u, T4z, T4v; + { + E T4w, T4x, T4k, T4l; + T4w = T2b - T2c; + T4x = T2e - T2f; + T4y = FMA(KP618033988, T4x, T4w); + T4A = FNMS(KP618033988, T4w, T4x); + T4s = T4n + T4r; + T4k = T4b + T4c; + T4l = T4e + T4f; + T4m = T4k + T4l; + T4t = FNMS(KP250000000, T4m, T4s); + T4u = T4k - T4l; + } + ii[0] = T4m + T4s; + T4z = FNMS(KP559016994, T4u, T4t); + ii[WS(rs, 8)] = FNMS(KP951056516, T4A, T4z); + ii[WS(rs, 12)] = FMA(KP951056516, T4A, T4z); + T4v = FMA(KP559016994, T4u, T4t); + ii[WS(rs, 4)] = FMA(KP951056516, T4y, T4v); + ii[WS(rs, 16)] = FNMS(KP951056516, T4y, T4v); + } + { + E T3r, T3t, T2o, T2T, T2U, T2V, T3s, T2W; + { + E T3b, T3q, T2D, T2S; + T3b = T33 - T3a; + T3q = T3i - T3p; + T3r = FNMS(KP618033988, T3q, T3b); + T3t = FMA(KP618033988, T3b, T3q); + T2o = T2i - T2n; + T2D = T2v + T2C; + T2S = T2K + T2R; + T2T = T2D + T2S; + T2U = FNMS(KP250000000, T2T, T2o); + T2V = T2D - T2S; + } + ri[WS(rs, 15)] = T2o + T2T; + T3s = FMA(KP559016994, T2V, T2U); + ri[WS(rs, 11)] = FMA(KP951056516, T3t, T3s); + ri[WS(rs, 19)] = FNMS(KP951056516, T3t, T3s); + T2W = FNMS(KP559016994, T2V, T2U); + ri[WS(rs, 3)] = FMA(KP951056516, T3r, T2W); + ri[WS(rs, 7)] = FNMS(KP951056516, T3r, T2W); + } + { + E T5a, T5c, T51, T54, T55, T56, T5b, T57; + { + E T58, T59, T52, T53; + T58 = T2K - T2R; + T59 = T2v - T2C; + T5a = FNMS(KP618033988, T59, T58); + T5c = FMA(KP618033988, T58, T59); + T51 = T4O + T4N; + T52 = T3i + T3p; + T53 = T33 + T3a; + T54 = T52 + T53; + T55 = FNMS(KP250000000, T54, T51); + T56 = T52 - T53; + } + ii[WS(rs, 15)] = T54 + T51; + T5b = FMA(KP559016994, T56, T55); + ii[WS(rs, 11)] = FNMS(KP951056516, T5c, T5b); + ii[WS(rs, 19)] = FMA(KP951056516, T5c, T5b); + T57 = FNMS(KP559016994, T56, T55); + ii[WS(rs, 3)] = FNMS(KP951056516, T5a, T57); + ii[WS(rs, 7)] = FMA(KP951056516, T5a, T57); + } + { + E T3L, T3N, T3u, T3B, T3C, T3D, T3M, T3E; + { + E T3H, T3K, T3x, T3A; + T3H = T3F - T3G; + T3K = T3I - T3J; + T3L = FMA(KP618033988, T3K, T3H); + T3N = FNMS(KP618033988, T3H, T3K); + T3u = T2i + T2n; + T3x = T3v + T3w; + T3A = T3y + T3z; + T3B = T3x + T3A; + T3C = FNMS(KP250000000, T3B, T3u); + T3D = T3x - T3A; + } + ri[WS(rs, 5)] = T3u + T3B; + T3M = FNMS(KP559016994, T3D, T3C); + ri[WS(rs, 13)] = FMA(KP951056516, T3N, T3M); + ri[WS(rs, 17)] = FNMS(KP951056516, T3N, T3M); + T3E = FMA(KP559016994, T3D, T3C); + ri[WS(rs, 1)] = FMA(KP951056516, T3L, T3E); + ri[WS(rs, 9)] = FNMS(KP951056516, T3L, T3E); + } + { + E T4Y, T50, T4P, T4S, T4T, T4U, T4Z, T4V; + { + E T4W, T4X, T4Q, T4R; + T4W = T3v - T3w; + T4X = T3y - T3z; + T4Y = FMA(KP618033988, T4X, T4W); + T50 = FNMS(KP618033988, T4W, T4X); + T4P = T4N - T4O; + T4Q = T3F + T3G; + T4R = T3I + T3J; + T4S = T4Q + T4R; + T4T = FNMS(KP250000000, T4S, T4P); + T4U = T4Q - T4R; + } + ii[WS(rs, 5)] = T4S + T4P; + T4Z = FNMS(KP559016994, T4U, T4T); + ii[WS(rs, 13)] = FNMS(KP951056516, T50, T4Z); + ii[WS(rs, 17)] = FMA(KP951056516, T50, T4Z); + T4V = FMA(KP559016994, T4U, T4T); + ii[WS(rs, 1)] = FNMS(KP951056516, T4Y, T4V); + ii[WS(rs, 9)] = FMA(KP951056516, T4Y, T4V); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 20}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 20, "t1_20", twinstr, &GENUS, {136, 38, 110, 0}, 0, 0, 0 }; + +void X(codelet_t1_20) (planner *p) { + X(kdft_dit_register) (p, t1_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 20 -name t1_20 -include dft/scalar/t.h */ + +/* + * This function contains 246 FP additions, 124 FP multiplications, + * (or, 184 additions, 62 multiplications, 62 fused multiply/add), + * 85 stack variables, 4 constants, and 80 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 38); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 38, MAKE_VOLATILE_STRIDE(40, rs)) { + E Tj, T1R, T4g, T4p, T2q, T37, T3Q, T42, T1r, T1O, T1P, T3i, T3l, T44, T3D; + E T3E, T3K, T1V, T1W, T1X, T23, T28, T4r, T2W, T2X, T4c, T33, T34, T35, T2G; + E T2L, T2M, TG, T13, T14, T3p, T3s, T43, T3A, T3B, T3J, T1S, T1T, T1U, T2e; + E T2j, T4q, T2T, T2U, T4b, T30, T31, T32, T2v, T2A, T2B; + { + E T1, T3O, T6, T3N, Tc, T2n, Th, T2o; + T1 = ri[0]; + T3O = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 10)]; + T5 = ii[WS(rs, 10)]; + T2 = W[18]; + T4 = W[19]; + T6 = FMA(T2, T3, T4 * T5); + T3N = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 5)]; + Tb = ii[WS(rs, 5)]; + T8 = W[8]; + Ta = W[9]; + Tc = FMA(T8, T9, Ta * Tb); + T2n = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 15)]; + Tg = ii[WS(rs, 15)]; + Td = W[28]; + Tf = W[29]; + Th = FMA(Td, Te, Tf * Tg); + T2o = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, T4e, T4f; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 - Ti; + T1R = T7 + Ti; + T4e = T3O - T3N; + T4f = Tc - Th; + T4g = T4e - T4f; + T4p = T4f + T4e; + } + { + E T2m, T2p, T3M, T3P; + T2m = T1 - T6; + T2p = T2n - T2o; + T2q = T2m - T2p; + T37 = T2m + T2p; + T3M = T2n + T2o; + T3P = T3N + T3O; + T3Q = T3M + T3P; + T42 = T3P - T3M; + } + } + { + E T1f, T3g, T21, T2C, T1N, T3k, T27, T2K, T1q, T3h, T22, T2F, T1C, T3j, T26; + E T2H; + { + E T19, T1Z, T1e, T20; + { + E T16, T18, T15, T17; + T16 = ri[WS(rs, 8)]; + T18 = ii[WS(rs, 8)]; + T15 = W[14]; + T17 = W[15]; + T19 = FMA(T15, T16, T17 * T18); + T1Z = FNMS(T17, T16, T15 * T18); + } + { + E T1b, T1d, T1a, T1c; + T1b = ri[WS(rs, 18)]; + T1d = ii[WS(rs, 18)]; + T1a = W[34]; + T1c = W[35]; + T1e = FMA(T1a, T1b, T1c * T1d); + T20 = FNMS(T1c, T1b, T1a * T1d); + } + T1f = T19 + T1e; + T3g = T1Z + T20; + T21 = T1Z - T20; + T2C = T19 - T1e; + } + { + E T1H, T2I, T1M, T2J; + { + E T1E, T1G, T1D, T1F; + T1E = ri[WS(rs, 17)]; + T1G = ii[WS(rs, 17)]; + T1D = W[32]; + T1F = W[33]; + T1H = FMA(T1D, T1E, T1F * T1G); + T2I = FNMS(T1F, T1E, T1D * T1G); + } + { + E T1J, T1L, T1I, T1K; + T1J = ri[WS(rs, 7)]; + T1L = ii[WS(rs, 7)]; + T1I = W[12]; + T1K = W[13]; + T1M = FMA(T1I, T1J, T1K * T1L); + T2J = FNMS(T1K, T1J, T1I * T1L); + } + T1N = T1H + T1M; + T3k = T2I + T2J; + T27 = T1H - T1M; + T2K = T2I - T2J; + } + { + E T1k, T2D, T1p, T2E; + { + E T1h, T1j, T1g, T1i; + T1h = ri[WS(rs, 13)]; + T1j = ii[WS(rs, 13)]; + T1g = W[24]; + T1i = W[25]; + T1k = FMA(T1g, T1h, T1i * T1j); + T2D = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1m, T1o, T1l, T1n; + T1m = ri[WS(rs, 3)]; + T1o = ii[WS(rs, 3)]; + T1l = W[4]; + T1n = W[5]; + T1p = FMA(T1l, T1m, T1n * T1o); + T2E = FNMS(T1n, T1m, T1l * T1o); + } + T1q = T1k + T1p; + T3h = T2D + T2E; + T22 = T1k - T1p; + T2F = T2D - T2E; + } + { + E T1w, T24, T1B, T25; + { + E T1t, T1v, T1s, T1u; + T1t = ri[WS(rs, 12)]; + T1v = ii[WS(rs, 12)]; + T1s = W[22]; + T1u = W[23]; + T1w = FMA(T1s, T1t, T1u * T1v); + T24 = FNMS(T1u, T1t, T1s * T1v); + } + { + E T1y, T1A, T1x, T1z; + T1y = ri[WS(rs, 2)]; + T1A = ii[WS(rs, 2)]; + T1x = W[2]; + T1z = W[3]; + T1B = FMA(T1x, T1y, T1z * T1A); + T25 = FNMS(T1z, T1y, T1x * T1A); + } + T1C = T1w + T1B; + T3j = T24 + T25; + T26 = T24 - T25; + T2H = T1w - T1B; + } + T1r = T1f - T1q; + T1O = T1C - T1N; + T1P = T1r + T1O; + T3i = T3g - T3h; + T3l = T3j - T3k; + T44 = T3i + T3l; + T3D = T3g + T3h; + T3E = T3j + T3k; + T3K = T3D + T3E; + T1V = T1f + T1q; + T1W = T1C + T1N; + T1X = T1V + T1W; + T23 = T21 + T22; + T28 = T26 + T27; + T4r = T23 + T28; + T2W = T21 - T22; + T2X = T26 - T27; + T4c = T2W + T2X; + T33 = T2C + T2F; + T34 = T2H + T2K; + T35 = T33 + T34; + T2G = T2C - T2F; + T2L = T2H - T2K; + T2M = T2G + T2L; + } + { + E Tu, T3n, T2c, T2r, T12, T3r, T2i, T2z, TF, T3o, T2d, T2u, TR, T3q, T2h; + E T2w; + { + E To, T2a, Tt, T2b; + { + E Tl, Tn, Tk, Tm; + Tl = ri[WS(rs, 4)]; + Tn = ii[WS(rs, 4)]; + Tk = W[6]; + Tm = W[7]; + To = FMA(Tk, Tl, Tm * Tn); + T2a = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = ri[WS(rs, 14)]; + Ts = ii[WS(rs, 14)]; + Tp = W[26]; + Tr = W[27]; + Tt = FMA(Tp, Tq, Tr * Ts); + T2b = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T3n = T2a + T2b; + T2c = T2a - T2b; + T2r = To - Tt; + } + { + E TW, T2x, T11, T2y; + { + E TT, TV, TS, TU; + TT = ri[WS(rs, 1)]; + TV = ii[WS(rs, 1)]; + TS = W[0]; + TU = W[1]; + TW = FMA(TS, TT, TU * TV); + T2x = FNMS(TU, TT, TS * TV); + } + { + E TY, T10, TX, TZ; + TY = ri[WS(rs, 11)]; + T10 = ii[WS(rs, 11)]; + TX = W[20]; + TZ = W[21]; + T11 = FMA(TX, TY, TZ * T10); + T2y = FNMS(TZ, TY, TX * T10); + } + T12 = TW + T11; + T3r = T2x + T2y; + T2i = TW - T11; + T2z = T2x - T2y; + } + { + E Tz, T2s, TE, T2t; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 9)]; + Ty = ii[WS(rs, 9)]; + Tv = W[16]; + Tx = W[17]; + Tz = FMA(Tv, Tw, Tx * Ty); + T2s = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 19)]; + TD = ii[WS(rs, 19)]; + TA = W[36]; + TC = W[37]; + TE = FMA(TA, TB, TC * TD); + T2t = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T3o = T2s + T2t; + T2d = Tz - TE; + T2u = T2s - T2t; + } + { + E TL, T2f, TQ, T2g; + { + E TI, TK, TH, TJ; + TI = ri[WS(rs, 16)]; + TK = ii[WS(rs, 16)]; + TH = W[30]; + TJ = W[31]; + TL = FMA(TH, TI, TJ * TK); + T2f = FNMS(TJ, TI, TH * TK); + } + { + E TN, TP, TM, TO; + TN = ri[WS(rs, 6)]; + TP = ii[WS(rs, 6)]; + TM = W[10]; + TO = W[11]; + TQ = FMA(TM, TN, TO * TP); + T2g = FNMS(TO, TN, TM * TP); + } + TR = TL + TQ; + T3q = T2f + T2g; + T2h = T2f - T2g; + T2w = TL - TQ; + } + TG = Tu - TF; + T13 = TR - T12; + T14 = TG + T13; + T3p = T3n - T3o; + T3s = T3q - T3r; + T43 = T3p + T3s; + T3A = T3n + T3o; + T3B = T3q + T3r; + T3J = T3A + T3B; + T1S = Tu + TF; + T1T = TR + T12; + T1U = T1S + T1T; + T2e = T2c + T2d; + T2j = T2h + T2i; + T4q = T2e + T2j; + T2T = T2c - T2d; + T2U = T2h - T2i; + T4b = T2T + T2U; + T30 = T2r + T2u; + T31 = T2w + T2z; + T32 = T30 + T31; + T2v = T2r - T2u; + T2A = T2w - T2z; + T2B = T2v + T2A; + } + { + E T3e, T1Q, T3d, T3u, T3w, T3m, T3t, T3v, T3f; + T3e = KP559016994 * (T14 - T1P); + T1Q = T14 + T1P; + T3d = FNMS(KP250000000, T1Q, Tj); + T3m = T3i - T3l; + T3t = T3p - T3s; + T3u = FNMS(KP587785252, T3t, KP951056516 * T3m); + T3w = FMA(KP951056516, T3t, KP587785252 * T3m); + ri[WS(rs, 10)] = Tj + T1Q; + T3v = T3e + T3d; + ri[WS(rs, 14)] = T3v - T3w; + ri[WS(rs, 6)] = T3v + T3w; + T3f = T3d - T3e; + ri[WS(rs, 2)] = T3f - T3u; + ri[WS(rs, 18)] = T3f + T3u; + } + { + E T47, T45, T46, T41, T4a, T3Z, T40, T49, T48; + T47 = KP559016994 * (T43 - T44); + T45 = T43 + T44; + T46 = FNMS(KP250000000, T45, T42); + T3Z = T1r - T1O; + T40 = TG - T13; + T41 = FNMS(KP587785252, T40, KP951056516 * T3Z); + T4a = FMA(KP951056516, T40, KP587785252 * T3Z); + ii[WS(rs, 10)] = T45 + T42; + T49 = T47 + T46; + ii[WS(rs, 6)] = T49 - T4a; + ii[WS(rs, 14)] = T4a + T49; + T48 = T46 - T47; + ii[WS(rs, 2)] = T41 + T48; + ii[WS(rs, 18)] = T48 - T41; + } + { + E T3x, T1Y, T3y, T3G, T3I, T3C, T3F, T3H, T3z; + T3x = KP559016994 * (T1U - T1X); + T1Y = T1U + T1X; + T3y = FNMS(KP250000000, T1Y, T1R); + T3C = T3A - T3B; + T3F = T3D - T3E; + T3G = FMA(KP951056516, T3C, KP587785252 * T3F); + T3I = FNMS(KP587785252, T3C, KP951056516 * T3F); + ri[0] = T1R + T1Y; + T3H = T3y - T3x; + ri[WS(rs, 12)] = T3H - T3I; + ri[WS(rs, 8)] = T3H + T3I; + T3z = T3x + T3y; + ri[WS(rs, 4)] = T3z - T3G; + ri[WS(rs, 16)] = T3z + T3G; + } + { + E T3U, T3L, T3V, T3T, T3Y, T3R, T3S, T3X, T3W; + T3U = KP559016994 * (T3J - T3K); + T3L = T3J + T3K; + T3V = FNMS(KP250000000, T3L, T3Q); + T3R = T1S - T1T; + T3S = T1V - T1W; + T3T = FMA(KP951056516, T3R, KP587785252 * T3S); + T3Y = FNMS(KP587785252, T3R, KP951056516 * T3S); + ii[0] = T3L + T3Q; + T3X = T3V - T3U; + ii[WS(rs, 8)] = T3X - T3Y; + ii[WS(rs, 12)] = T3Y + T3X; + T3W = T3U + T3V; + ii[WS(rs, 4)] = T3T + T3W; + ii[WS(rs, 16)] = T3W - T3T; + } + { + E T2P, T2N, T2O, T2l, T2R, T29, T2k, T2S, T2Q; + T2P = KP559016994 * (T2B - T2M); + T2N = T2B + T2M; + T2O = FNMS(KP250000000, T2N, T2q); + T29 = T23 - T28; + T2k = T2e - T2j; + T2l = FNMS(KP587785252, T2k, KP951056516 * T29); + T2R = FMA(KP951056516, T2k, KP587785252 * T29); + ri[WS(rs, 15)] = T2q + T2N; + T2S = T2P + T2O; + ri[WS(rs, 11)] = T2R + T2S; + ri[WS(rs, 19)] = T2S - T2R; + T2Q = T2O - T2P; + ri[WS(rs, 3)] = T2l + T2Q; + ri[WS(rs, 7)] = T2Q - T2l; + } + { + E T4u, T4s, T4t, T4y, T4A, T4w, T4x, T4z, T4v; + T4u = KP559016994 * (T4q - T4r); + T4s = T4q + T4r; + T4t = FNMS(KP250000000, T4s, T4p); + T4w = T2G - T2L; + T4x = T2v - T2A; + T4y = FNMS(KP587785252, T4x, KP951056516 * T4w); + T4A = FMA(KP951056516, T4x, KP587785252 * T4w); + ii[WS(rs, 15)] = T4s + T4p; + T4z = T4u + T4t; + ii[WS(rs, 11)] = T4z - T4A; + ii[WS(rs, 19)] = T4A + T4z; + T4v = T4t - T4u; + ii[WS(rs, 3)] = T4v - T4y; + ii[WS(rs, 7)] = T4y + T4v; + } + { + E T36, T38, T39, T2Z, T3b, T2V, T2Y, T3c, T3a; + T36 = KP559016994 * (T32 - T35); + T38 = T32 + T35; + T39 = FNMS(KP250000000, T38, T37); + T2V = T2T - T2U; + T2Y = T2W - T2X; + T2Z = FMA(KP951056516, T2V, KP587785252 * T2Y); + T3b = FNMS(KP587785252, T2V, KP951056516 * T2Y); + ri[WS(rs, 5)] = T37 + T38; + T3c = T39 - T36; + ri[WS(rs, 13)] = T3b + T3c; + ri[WS(rs, 17)] = T3c - T3b; + T3a = T36 + T39; + ri[WS(rs, 1)] = T2Z + T3a; + ri[WS(rs, 9)] = T3a - T2Z; + } + { + E T4d, T4h, T4i, T4m, T4o, T4k, T4l, T4n, T4j; + T4d = KP559016994 * (T4b - T4c); + T4h = T4b + T4c; + T4i = FNMS(KP250000000, T4h, T4g); + T4k = T30 - T31; + T4l = T33 - T34; + T4m = FMA(KP951056516, T4k, KP587785252 * T4l); + T4o = FNMS(KP587785252, T4k, KP951056516 * T4l); + ii[WS(rs, 5)] = T4h + T4g; + T4n = T4i - T4d; + ii[WS(rs, 13)] = T4n - T4o; + ii[WS(rs, 17)] = T4o + T4n; + T4j = T4d + T4i; + ii[WS(rs, 1)] = T4j - T4m; + ii[WS(rs, 9)] = T4m + T4j; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 20}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 20, "t1_20", twinstr, &GENUS, {184, 62, 62, 0}, 0, 0, 0 }; + +void X(codelet_t1_20) (planner *p) { + X(kdft_dit_register) (p, t1_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_25.c new file mode 100644 index 000000000..efaf66b68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_25.c @@ -0,0 +1,1572 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:16 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 25 -name t1_25 -include dft/scalar/t.h */ + +/* + * This function contains 400 FP additions, 364 FP multiplications, + * (or, 84 additions, 48 multiplications, 316 fused multiply/add), + * 138 stack variables, 47 constants, and 100 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + (mb * 48); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 48, MAKE_VOLATILE_STRIDE(50, rs)) { + E T1, T6X, T3Y, T5G, T7c, T7C, Ts, T3L, T3M, T6W, T77, T78, T4P, T5T, T4W; + E T5Q, T2G, T5S, T4M, T3G, T5P, T4T, T45, T65, T4c, T68, T11, T64, T42, T2Z; + E T67, T49, T4k, T61, T4r, T5Y, T1z, T5X, T4o, T3d, T60, T4h, T4A, T5M, T4H; + E T5J, T28, T5L, T4x, T3s, T5I, T4E; + { + E T7, T3P, Tq, T3W, Tk, T3U, Td, T3R; + T1 = ri[0]; + T6X = ii[0]; + { + E T3, T6, T4, T3O, T2, T5; + T3 = ri[WS(rs, 5)]; + T6 = ii[WS(rs, 5)]; + T2 = W[8]; + T4 = T2 * T3; + T3O = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T3P = FNMS(T5, T3, T3O); + } + { + E Tm, Tp, Tn, T3V, Tl, To; + Tm = ri[WS(rs, 15)]; + Tp = ii[WS(rs, 15)]; + Tl = W[28]; + Tn = Tl * Tm; + T3V = Tl * Tp; + To = W[29]; + Tq = FMA(To, Tp, Tn); + T3W = FNMS(To, Tm, T3V); + } + { + E Tg, Tj, Th, T3T, Tf, Ti; + Tg = ri[WS(rs, 10)]; + Tj = ii[WS(rs, 10)]; + Tf = W[18]; + Th = Tf * Tg; + T3T = Tf * Tj; + Ti = W[19]; + Tk = FMA(Ti, Tj, Th); + T3U = FNMS(Ti, Tg, T3T); + } + { + E T9, Tc, Ta, T3Q, T8, Tb; + T9 = ri[WS(rs, 20)]; + Tc = ii[WS(rs, 20)]; + T8 = W[38]; + Ta = T8 * T9; + T3Q = T8 * Tc; + Tb = W[39]; + Td = FMA(Tb, Tc, Ta); + T3R = FNMS(Tb, T9, T3Q); + } + { + E T3S, T3X, T7a, T7b; + T3S = T3P - T3R; + T3X = T3U - T3W; + T3Y = FMA(KP618033988, T3X, T3S); + T5G = FNMS(KP618033988, T3S, T3X); + T7a = T7 - Td; + T7b = Tk - Tq; + T7c = FMA(KP618033988, T7b, T7a); + T7C = FNMS(KP618033988, T7a, T7b); + } + { + E Te, Tr, T6U, T6V; + Te = T7 + Td; + Tr = Tk + Tq; + Ts = Te + Tr; + T3L = FNMS(KP250000000, Ts, T1); + T3M = Te - Tr; + T6U = T3P + T3R; + T6V = T3U + T3W; + T6W = T6U + T6V; + T77 = FNMS(KP250000000, T6W, T6X); + T78 = T6U - T6V; + } + } + { + E T2e, T3u, T2x, T3B, T2D, T3D, T2E, T3E, T2k, T3w, T2q, T3y, T2r, T3z; + { + E T2a, T2d, T2b, T3t, T29, T2c; + T2a = ri[WS(rs, 3)]; + T2d = ii[WS(rs, 3)]; + T29 = W[4]; + T2b = T29 * T2a; + T3t = T29 * T2d; + T2c = W[5]; + T2e = FMA(T2c, T2d, T2b); + T3u = FNMS(T2c, T2a, T3t); + } + { + E T2t, T2w, T2u, T3A, T2z, T2C, T2A, T3C, T2s, T2y, T2v, T2B; + T2t = ri[WS(rs, 13)]; + T2w = ii[WS(rs, 13)]; + T2s = W[24]; + T2u = T2s * T2t; + T3A = T2s * T2w; + T2z = ri[WS(rs, 18)]; + T2C = ii[WS(rs, 18)]; + T2y = W[34]; + T2A = T2y * T2z; + T3C = T2y * T2C; + T2v = W[25]; + T2x = FMA(T2v, T2w, T2u); + T3B = FNMS(T2v, T2t, T3A); + T2B = W[35]; + T2D = FMA(T2B, T2C, T2A); + T3D = FNMS(T2B, T2z, T3C); + T2E = T2x + T2D; + T3E = T3B + T3D; + } + { + E T2g, T2j, T2h, T3v, T2m, T2p, T2n, T3x, T2f, T2l, T2i, T2o; + T2g = ri[WS(rs, 8)]; + T2j = ii[WS(rs, 8)]; + T2f = W[14]; + T2h = T2f * T2g; + T3v = T2f * T2j; + T2m = ri[WS(rs, 23)]; + T2p = ii[WS(rs, 23)]; + T2l = W[44]; + T2n = T2l * T2m; + T3x = T2l * T2p; + T2i = W[15]; + T2k = FMA(T2i, T2j, T2h); + T3w = FNMS(T2i, T2g, T3v); + T2o = W[45]; + T2q = FMA(T2o, T2p, T2n); + T3y = FNMS(T2o, T2m, T3x); + T2r = T2k + T2q; + T3z = T3w + T3y; + } + { + E T4N, T4O, T4U, T4V; + T4N = T3y - T3w; + T4O = T3D - T3B; + T4P = FMA(KP618033988, T4O, T4N); + T5T = FNMS(KP618033988, T4N, T4O); + T4U = T2k - T2q; + T4V = T2x - T2D; + T4W = FMA(KP618033988, T4V, T4U); + T5Q = FNMS(KP618033988, T4U, T4V); + } + { + E T4L, T2F, T4K, T4S, T3F, T4R; + T4L = T2E - T2r; + T2F = T2r + T2E; + T4K = FNMS(KP250000000, T2F, T2e); + T2G = T2e + T2F; + T5S = FMA(KP559016994, T4L, T4K); + T4M = FNMS(KP559016994, T4L, T4K); + T4S = T3E - T3z; + T3F = T3z + T3E; + T4R = FNMS(KP250000000, T3F, T3u); + T3G = T3u + T3F; + T5P = FMA(KP559016994, T4S, T4R); + T4T = FNMS(KP559016994, T4S, T4R); + } + } + { + E Tz, T2N, TS, T2U, TY, T2W, TZ, T2X, TF, T2P, TL, T2R, TM, T2S; + { + E Tv, Ty, Tw, T2M, Tu, Tx; + Tv = ri[WS(rs, 1)]; + Ty = ii[WS(rs, 1)]; + Tu = W[0]; + Tw = Tu * Tv; + T2M = Tu * Ty; + Tx = W[1]; + Tz = FMA(Tx, Ty, Tw); + T2N = FNMS(Tx, Tv, T2M); + } + { + E TO, TR, TP, T2T, TU, TX, TV, T2V, TN, TT, TQ, TW; + TO = ri[WS(rs, 11)]; + TR = ii[WS(rs, 11)]; + TN = W[20]; + TP = TN * TO; + T2T = TN * TR; + TU = ri[WS(rs, 16)]; + TX = ii[WS(rs, 16)]; + TT = W[30]; + TV = TT * TU; + T2V = TT * TX; + TQ = W[21]; + TS = FMA(TQ, TR, TP); + T2U = FNMS(TQ, TO, T2T); + TW = W[31]; + TY = FMA(TW, TX, TV); + T2W = FNMS(TW, TU, T2V); + TZ = TS + TY; + T2X = T2U + T2W; + } + { + E TB, TE, TC, T2O, TH, TK, TI, T2Q, TA, TG, TD, TJ; + TB = ri[WS(rs, 6)]; + TE = ii[WS(rs, 6)]; + TA = W[10]; + TC = TA * TB; + T2O = TA * TE; + TH = ri[WS(rs, 21)]; + TK = ii[WS(rs, 21)]; + TG = W[40]; + TI = TG * TH; + T2Q = TG * TK; + TD = W[11]; + TF = FMA(TD, TE, TC); + T2P = FNMS(TD, TB, T2O); + TJ = W[41]; + TL = FMA(TJ, TK, TI); + T2R = FNMS(TJ, TH, T2Q); + TM = TF + TL; + T2S = T2P + T2R; + } + { + E T43, T44, T4a, T4b; + T43 = T2P - T2R; + T44 = T2W - T2U; + T45 = FNMS(KP618033988, T44, T43); + T65 = FMA(KP618033988, T43, T44); + T4a = TL - TF; + T4b = TY - TS; + T4c = FMA(KP618033988, T4b, T4a); + T68 = FNMS(KP618033988, T4a, T4b); + } + { + E T41, T10, T40, T48, T2Y, T47; + T41 = TM - TZ; + T10 = TM + TZ; + T40 = FNMS(KP250000000, T10, Tz); + T11 = Tz + T10; + T64 = FNMS(KP559016994, T41, T40); + T42 = FMA(KP559016994, T41, T40); + T48 = T2S - T2X; + T2Y = T2S + T2X; + T47 = FNMS(KP250000000, T2Y, T2N); + T2Z = T2N + T2Y; + T67 = FNMS(KP559016994, T48, T47); + T49 = FMA(KP559016994, T48, T47); + } + } + { + E T17, T31, T1q, T38, T1w, T3a, T1x, T3b, T1d, T33, T1j, T35, T1k, T36; + { + E T13, T16, T14, T30, T12, T15; + T13 = ri[WS(rs, 4)]; + T16 = ii[WS(rs, 4)]; + T12 = W[6]; + T14 = T12 * T13; + T30 = T12 * T16; + T15 = W[7]; + T17 = FMA(T15, T16, T14); + T31 = FNMS(T15, T13, T30); + } + { + E T1m, T1p, T1n, T37, T1s, T1v, T1t, T39, T1l, T1r, T1o, T1u; + T1m = ri[WS(rs, 14)]; + T1p = ii[WS(rs, 14)]; + T1l = W[26]; + T1n = T1l * T1m; + T37 = T1l * T1p; + T1s = ri[WS(rs, 19)]; + T1v = ii[WS(rs, 19)]; + T1r = W[36]; + T1t = T1r * T1s; + T39 = T1r * T1v; + T1o = W[27]; + T1q = FMA(T1o, T1p, T1n); + T38 = FNMS(T1o, T1m, T37); + T1u = W[37]; + T1w = FMA(T1u, T1v, T1t); + T3a = FNMS(T1u, T1s, T39); + T1x = T1q + T1w; + T3b = T38 + T3a; + } + { + E T19, T1c, T1a, T32, T1f, T1i, T1g, T34, T18, T1e, T1b, T1h; + T19 = ri[WS(rs, 9)]; + T1c = ii[WS(rs, 9)]; + T18 = W[16]; + T1a = T18 * T19; + T32 = T18 * T1c; + T1f = ri[WS(rs, 24)]; + T1i = ii[WS(rs, 24)]; + T1e = W[46]; + T1g = T1e * T1f; + T34 = T1e * T1i; + T1b = W[17]; + T1d = FMA(T1b, T1c, T1a); + T33 = FNMS(T1b, T19, T32); + T1h = W[47]; + T1j = FMA(T1h, T1i, T1g); + T35 = FNMS(T1h, T1f, T34); + T1k = T1d + T1j; + T36 = T33 + T35; + } + { + E T4i, T4j, T4p, T4q; + T4i = T1j - T1d; + T4j = T1w - T1q; + T4k = FMA(KP618033988, T4j, T4i); + T61 = FNMS(KP618033988, T4i, T4j); + T4p = T35 - T33; + T4q = T3a - T38; + T4r = FMA(KP618033988, T4q, T4p); + T5Y = FNMS(KP618033988, T4p, T4q); + } + { + E T4n, T1y, T4m, T4g, T3c, T4f; + T4n = T1k - T1x; + T1y = T1k + T1x; + T4m = FNMS(KP250000000, T1y, T17); + T1z = T17 + T1y; + T5X = FNMS(KP559016994, T4n, T4m); + T4o = FMA(KP559016994, T4n, T4m); + T4g = T3b - T36; + T3c = T36 + T3b; + T4f = FNMS(KP250000000, T3c, T31); + T3d = T31 + T3c; + T60 = FMA(KP559016994, T4g, T4f); + T4h = FNMS(KP559016994, T4g, T4f); + } + } + { + E T1G, T3g, T1Z, T3n, T25, T3p, T26, T3q, T1M, T3i, T1S, T3k, T1T, T3l; + { + E T1C, T1F, T1D, T3f, T1B, T1E; + T1C = ri[WS(rs, 2)]; + T1F = ii[WS(rs, 2)]; + T1B = W[2]; + T1D = T1B * T1C; + T3f = T1B * T1F; + T1E = W[3]; + T1G = FMA(T1E, T1F, T1D); + T3g = FNMS(T1E, T1C, T3f); + } + { + E T1V, T1Y, T1W, T3m, T21, T24, T22, T3o, T1U, T20, T1X, T23; + T1V = ri[WS(rs, 12)]; + T1Y = ii[WS(rs, 12)]; + T1U = W[22]; + T1W = T1U * T1V; + T3m = T1U * T1Y; + T21 = ri[WS(rs, 17)]; + T24 = ii[WS(rs, 17)]; + T20 = W[32]; + T22 = T20 * T21; + T3o = T20 * T24; + T1X = W[23]; + T1Z = FMA(T1X, T1Y, T1W); + T3n = FNMS(T1X, T1V, T3m); + T23 = W[33]; + T25 = FMA(T23, T24, T22); + T3p = FNMS(T23, T21, T3o); + T26 = T1Z + T25; + T3q = T3n + T3p; + } + { + E T1I, T1L, T1J, T3h, T1O, T1R, T1P, T3j, T1H, T1N, T1K, T1Q; + T1I = ri[WS(rs, 7)]; + T1L = ii[WS(rs, 7)]; + T1H = W[12]; + T1J = T1H * T1I; + T3h = T1H * T1L; + T1O = ri[WS(rs, 22)]; + T1R = ii[WS(rs, 22)]; + T1N = W[42]; + T1P = T1N * T1O; + T3j = T1N * T1R; + T1K = W[13]; + T1M = FMA(T1K, T1L, T1J); + T3i = FNMS(T1K, T1I, T3h); + T1Q = W[43]; + T1S = FMA(T1Q, T1R, T1P); + T3k = FNMS(T1Q, T1O, T3j); + T1T = T1M + T1S; + T3l = T3i + T3k; + } + { + E T4y, T4z, T4F, T4G; + T4y = T3k - T3i; + T4z = T3n - T3p; + T4A = FNMS(KP618033988, T4z, T4y); + T5M = FMA(KP618033988, T4y, T4z); + T4F = T1S - T1M; + T4G = T25 - T1Z; + T4H = FMA(KP618033988, T4G, T4F); + T5J = FNMS(KP618033988, T4F, T4G); + } + { + E T4w, T27, T4v, T4D, T3r, T4C; + T4w = T26 - T1T; + T27 = T1T + T26; + T4v = FNMS(KP250000000, T27, T1G); + T28 = T1G + T27; + T5L = FMA(KP559016994, T4w, T4v); + T4x = FNMS(KP559016994, T4w, T4v); + T4D = T3q - T3l; + T3r = T3l + T3q; + T4C = FNMS(KP250000000, T3r, T3g); + T3s = T3g + T3r; + T5I = FMA(KP559016994, T4D, T4C); + T4E = FNMS(KP559016994, T4D, T4C); + } + } + { + E T3I, T3K, Tt, T2I, T2J, T2K, T3J, T2L; + { + E T3e, T3H, T1A, T2H; + T3e = T2Z - T3d; + T3H = T3s - T3G; + T3I = FMA(KP618033988, T3H, T3e); + T3K = FNMS(KP618033988, T3e, T3H); + Tt = T1 + Ts; + T1A = T11 + T1z; + T2H = T28 + T2G; + T2I = T1A + T2H; + T2J = FNMS(KP250000000, T2I, Tt); + T2K = T1A - T2H; + } + ri[0] = Tt + T2I; + T3J = FNMS(KP559016994, T2K, T2J); + ri[WS(rs, 10)] = FNMS(KP951056516, T3K, T3J); + ri[WS(rs, 15)] = FMA(KP951056516, T3K, T3J); + T2L = FMA(KP559016994, T2K, T2J); + ri[WS(rs, 20)] = FNMS(KP951056516, T3I, T2L); + ri[WS(rs, 5)] = FMA(KP951056516, T3I, T2L); + } + { + E T74, T76, T6Y, T6T, T6Z, T70, T75, T71; + { + E T72, T73, T6R, T6S; + T72 = T11 - T1z; + T73 = T28 - T2G; + T74 = FMA(KP618033988, T73, T72); + T76 = FNMS(KP618033988, T72, T73); + T6Y = T6W + T6X; + T6R = T2Z + T3d; + T6S = T3s + T3G; + T6T = T6R + T6S; + T6Z = FNMS(KP250000000, T6T, T6Y); + T70 = T6R - T6S; + } + ii[0] = T6T + T6Y; + T75 = FNMS(KP559016994, T70, T6Z); + ii[WS(rs, 10)] = FMA(KP951056516, T76, T75); + ii[WS(rs, 15)] = FNMS(KP951056516, T76, T75); + T71 = FMA(KP559016994, T70, T6Z); + ii[WS(rs, 5)] = FNMS(KP951056516, T74, T71); + ii[WS(rs, 20)] = FMA(KP951056516, T74, T71); + } + { + E T3Z, T5d, T7d, T7p, T56, T59, T7l, T7k, T7e, T7f, T7g, T4u, T4Z, T50, T5y; + E T5B, T7x, T7w, T7q, T7r, T7s, T5k, T5r, T5s, T3N, T79; + T3N = FMA(KP559016994, T3M, T3L); + T3Z = FMA(KP951056516, T3Y, T3N); + T5d = FNMS(KP951056516, T3Y, T3N); + T79 = FMA(KP559016994, T78, T77); + T7d = FNMS(KP951056516, T7c, T79); + T7p = FMA(KP951056516, T7c, T79); + { + E T4e, T54, T4Y, T58, T4t, T55, T4J, T57; + { + E T46, T4d, T4Q, T4X; + T46 = FMA(KP951056516, T45, T42); + T4d = FMA(KP951056516, T4c, T49); + T4e = FMA(KP256756360, T4d, T46); + T54 = FNMS(KP256756360, T46, T4d); + T4Q = FNMS(KP951056516, T4P, T4M); + T4X = FNMS(KP951056516, T4W, T4T); + T4Y = FMA(KP939062505, T4X, T4Q); + T58 = FNMS(KP939062505, T4Q, T4X); + } + { + E T4l, T4s, T4B, T4I; + T4l = FMA(KP951056516, T4k, T4h); + T4s = FNMS(KP951056516, T4r, T4o); + T4t = FMA(KP634619297, T4s, T4l); + T55 = FNMS(KP634619297, T4l, T4s); + T4B = FNMS(KP951056516, T4A, T4x); + T4I = FMA(KP951056516, T4H, T4E); + T4J = FMA(KP549754652, T4I, T4B); + T57 = FNMS(KP549754652, T4B, T4I); + } + T56 = FMA(KP871714437, T55, T54); + T59 = FNMS(KP831864738, T58, T57); + T7l = FNMS(KP831864738, T4Y, T4J); + T7k = FNMS(KP871714437, T4t, T4e); + T7e = FNMS(KP871714437, T55, T54); + T7f = FMA(KP831864738, T58, T57); + T7g = FMA(KP904730450, T7f, T7e); + T4u = FMA(KP871714437, T4t, T4e); + T4Z = FMA(KP831864738, T4Y, T4J); + T50 = FMA(KP904730450, T4Z, T4u); + } + { + E T5g, T5z, T5q, T5x, T5j, T5A, T5n, T5w; + { + E T5e, T5f, T5o, T5p; + T5e = FMA(KP951056516, T4P, T4M); + T5f = FMA(KP951056516, T4W, T4T); + T5g = FNMS(KP126329378, T5f, T5e); + T5z = FMA(KP126329378, T5e, T5f); + T5o = FNMS(KP951056516, T4k, T4h); + T5p = FMA(KP951056516, T4r, T4o); + T5q = FMA(KP827271945, T5p, T5o); + T5x = FNMS(KP827271945, T5o, T5p); + } + { + E T5h, T5i, T5l, T5m; + T5h = FNMS(KP951056516, T4H, T4E); + T5i = FMA(KP951056516, T4A, T4x); + T5j = FNMS(KP470564281, T5i, T5h); + T5A = FMA(KP470564281, T5h, T5i); + T5l = FNMS(KP951056516, T4c, T49); + T5m = FNMS(KP951056516, T45, T42); + T5n = FMA(KP634619297, T5m, T5l); + T5w = FNMS(KP634619297, T5l, T5m); + } + T5y = FMA(KP912575812, T5x, T5w); + T5B = FNMS(KP912018591, T5A, T5z); + T7x = FMA(KP912018591, T5j, T5g); + T7w = FMA(KP912575812, T5q, T5n); + T7q = FMA(KP912018591, T5A, T5z); + T7r = FNMS(KP912575812, T5x, T5w); + T7s = FMA(KP851038619, T7r, T7q); + T5k = FNMS(KP912018591, T5j, T5g); + T5r = FNMS(KP912575812, T5q, T5n); + T5s = FNMS(KP851038619, T5r, T5k); + } + ri[WS(rs, 1)] = FMA(KP968583161, T50, T3Z); + ii[WS(rs, 1)] = FMA(KP968583161, T7g, T7d); + ri[WS(rs, 4)] = FNMS(KP992114701, T5s, T5d); + ii[WS(rs, 4)] = FNMS(KP992114701, T7s, T7p); + { + E T5a, T5c, T53, T5b, T51, T52; + T5a = FMA(KP559154169, T59, T56); + T5c = FNMS(KP683113946, T56, T59); + T51 = FNMS(KP242145790, T50, T3Z); + T52 = FNMS(KP904730450, T4Z, T4u); + T53 = FMA(KP541454447, T52, T51); + T5b = FNMS(KP541454447, T52, T51); + ri[WS(rs, 6)] = FMA(KP921177326, T5a, T53); + ri[WS(rs, 16)] = FMA(KP833417178, T5c, T5b); + ri[WS(rs, 21)] = FNMS(KP921177326, T5a, T53); + ri[WS(rs, 11)] = FNMS(KP833417178, T5c, T5b); + } + { + E T7m, T7o, T7j, T7n, T7h, T7i; + T7m = FMA(KP559154169, T7l, T7k); + T7o = FNMS(KP683113946, T7k, T7l); + T7h = FNMS(KP242145790, T7g, T7d); + T7i = FNMS(KP904730450, T7f, T7e); + T7j = FMA(KP541454447, T7i, T7h); + T7n = FNMS(KP541454447, T7i, T7h); + ii[WS(rs, 6)] = FNMS(KP921177326, T7m, T7j); + ii[WS(rs, 16)] = FNMS(KP833417178, T7o, T7n); + ii[WS(rs, 21)] = FMA(KP921177326, T7m, T7j); + ii[WS(rs, 11)] = FMA(KP833417178, T7o, T7n); + } + { + E T5C, T5E, T5v, T5D, T5t, T5u; + T5C = FNMS(KP726211448, T5B, T5y); + T5E = FMA(KP525970792, T5y, T5B); + T5t = FMA(KP248028675, T5s, T5d); + T5u = FMA(KP851038619, T5r, T5k); + T5v = FMA(KP554608978, T5u, T5t); + T5D = FNMS(KP554608978, T5u, T5t); + ri[WS(rs, 9)] = FNMS(KP803003575, T5C, T5v); + ri[WS(rs, 19)] = FMA(KP943557151, T5E, T5D); + ri[WS(rs, 24)] = FMA(KP803003575, T5C, T5v); + ri[WS(rs, 14)] = FNMS(KP943557151, T5E, T5D); + } + { + E T7y, T7A, T7v, T7z, T7t, T7u; + T7y = FMA(KP726211448, T7x, T7w); + T7A = FNMS(KP525970792, T7w, T7x); + T7t = FMA(KP248028675, T7s, T7p); + T7u = FNMS(KP851038619, T7r, T7q); + T7v = FMA(KP554608978, T7u, T7t); + T7z = FNMS(KP554608978, T7u, T7t); + ii[WS(rs, 9)] = FNMS(KP803003575, T7y, T7v); + ii[WS(rs, 19)] = FNMS(KP943557151, T7A, T7z); + ii[WS(rs, 24)] = FMA(KP803003575, T7y, T7v); + ii[WS(rs, 14)] = FMA(KP943557151, T7A, T7z); + } + } + { + E T5H, T6p, T7D, T7P, T6i, T6l, T7X, T7W, T7Q, T7R, T7S, T5W, T6b, T6c, T6K; + E T6N, T7L, T7K, T7E, T7F, T7G, T6w, T6D, T6E, T5F, T7B; + T5F = FNMS(KP559016994, T3M, T3L); + T5H = FMA(KP951056516, T5G, T5F); + T6p = FNMS(KP951056516, T5G, T5F); + T7B = FNMS(KP559016994, T78, T77); + T7D = FMA(KP951056516, T7C, T7B); + T7P = FNMS(KP951056516, T7C, T7B); + { + E T5O, T6j, T6a, T6h, T5V, T6k, T63, T6g; + { + E T5K, T5N, T66, T69; + T5K = FMA(KP951056516, T5J, T5I); + T5N = FMA(KP951056516, T5M, T5L); + T5O = FMA(KP062914667, T5N, T5K); + T6j = FNMS(KP062914667, T5K, T5N); + T66 = FNMS(KP951056516, T65, T64); + T69 = FMA(KP951056516, T68, T67); + T6a = FMA(KP939062505, T69, T66); + T6h = FNMS(KP939062505, T66, T69); + } + { + E T5R, T5U, T5Z, T62; + T5R = FNMS(KP951056516, T5Q, T5P); + T5U = FNMS(KP951056516, T5T, T5S); + T5V = FNMS(KP827271945, T5U, T5R); + T6k = FMA(KP827271945, T5R, T5U); + T5Z = FNMS(KP951056516, T5Y, T5X); + T62 = FMA(KP951056516, T61, T60); + T63 = FNMS(KP126329378, T62, T5Z); + T6g = FMA(KP126329378, T5Z, T62); + } + T6i = FMA(KP734762448, T6h, T6g); + T6l = FNMS(KP772036680, T6k, T6j); + T7X = FNMS(KP772036680, T5V, T5O); + T7W = FMA(KP734762448, T6a, T63); + T7Q = FMA(KP772036680, T6k, T6j); + T7R = FNMS(KP734762448, T6h, T6g); + T7S = FMA(KP994076283, T7R, T7Q); + T5W = FMA(KP772036680, T5V, T5O); + T6b = FNMS(KP734762448, T6a, T63); + T6c = FNMS(KP994076283, T6b, T5W); + } + { + E T6s, T6L, T6C, T6J, T6v, T6M, T6z, T6I; + { + E T6q, T6r, T6A, T6B; + T6q = FMA(KP951056516, T5Q, T5P); + T6r = FMA(KP951056516, T5T, T5S); + T6s = FMA(KP062914667, T6r, T6q); + T6L = FNMS(KP062914667, T6q, T6r); + T6A = FMA(KP951056516, T65, T64); + T6B = FNMS(KP951056516, T68, T67); + T6C = FMA(KP549754652, T6B, T6A); + T6J = FNMS(KP549754652, T6A, T6B); + } + { + E T6t, T6u, T6x, T6y; + T6t = FNMS(KP951056516, T5J, T5I); + T6u = FNMS(KP951056516, T5M, T5L); + T6v = FMA(KP634619297, T6u, T6t); + T6M = FNMS(KP634619297, T6t, T6u); + T6x = FNMS(KP951056516, T61, T60); + T6y = FMA(KP951056516, T5Y, T5X); + T6z = FNMS(KP470564281, T6y, T6x); + T6I = FMA(KP470564281, T6x, T6y); + } + T6K = FMA(KP968479752, T6J, T6I); + T6N = FNMS(KP845997307, T6M, T6L); + T7L = FNMS(KP845997307, T6v, T6s); + T7K = FNMS(KP968479752, T6C, T6z); + T7E = FMA(KP845997307, T6M, T6L); + T7F = FNMS(KP968479752, T6J, T6I); + T7G = FMA(KP906616052, T7F, T7E); + T6w = FMA(KP845997307, T6v, T6s); + T6D = FMA(KP968479752, T6C, T6z); + T6E = FMA(KP906616052, T6D, T6w); + } + ri[WS(rs, 3)] = FMA(KP998026728, T6c, T5H); + ii[WS(rs, 3)] = FNMS(KP998026728, T7S, T7P); + ri[WS(rs, 2)] = FMA(KP998026728, T6E, T6p); + ii[WS(rs, 2)] = FNMS(KP998026728, T7G, T7D); + { + E T6m, T6o, T6f, T6n, T6d, T6e; + T6m = FNMS(KP621716863, T6l, T6i); + T6o = FMA(KP614372930, T6i, T6l); + T6d = FNMS(KP249506682, T6c, T5H); + T6e = FMA(KP994076283, T6b, T5W); + T6f = FNMS(KP557913902, T6e, T6d); + T6n = FMA(KP557913902, T6e, T6d); + ri[WS(rs, 23)] = FNMS(KP943557151, T6m, T6f); + ri[WS(rs, 13)] = FMA(KP949179823, T6o, T6n); + ri[WS(rs, 8)] = FMA(KP943557151, T6m, T6f); + ri[WS(rs, 18)] = FNMS(KP949179823, T6o, T6n); + } + { + E T7Y, T80, T7V, T7Z, T7T, T7U; + T7Y = FMA(KP621716863, T7X, T7W); + T80 = FNMS(KP614372930, T7W, T7X); + T7T = FMA(KP249506682, T7S, T7P); + T7U = FNMS(KP994076283, T7R, T7Q); + T7V = FMA(KP557913902, T7U, T7T); + T7Z = FNMS(KP557913902, T7U, T7T); + ii[WS(rs, 8)] = FNMS(KP943557151, T7Y, T7V); + ii[WS(rs, 18)] = FNMS(KP949179823, T80, T7Z); + ii[WS(rs, 23)] = FMA(KP943557151, T7Y, T7V); + ii[WS(rs, 13)] = FMA(KP949179823, T80, T7Z); + } + { + E T6O, T6Q, T6H, T6P, T6F, T6G; + T6O = FMA(KP681693190, T6N, T6K); + T6Q = FNMS(KP560319534, T6K, T6N); + T6F = FNMS(KP249506682, T6E, T6p); + T6G = FNMS(KP906616052, T6D, T6w); + T6H = FNMS(KP557913902, T6G, T6F); + T6P = FMA(KP557913902, T6G, T6F); + ri[WS(rs, 22)] = FNMS(KP860541664, T6O, T6H); + ri[WS(rs, 17)] = FMA(KP949179823, T6Q, T6P); + ri[WS(rs, 7)] = FMA(KP860541664, T6O, T6H); + ri[WS(rs, 12)] = FNMS(KP949179823, T6Q, T6P); + } + { + E T7M, T7O, T7J, T7N, T7H, T7I; + T7M = FMA(KP681693190, T7L, T7K); + T7O = FNMS(KP560319534, T7K, T7L); + T7H = FMA(KP249506682, T7G, T7D); + T7I = FNMS(KP906616052, T7F, T7E); + T7J = FMA(KP557913902, T7I, T7H); + T7N = FNMS(KP557913902, T7I, T7H); + ii[WS(rs, 7)] = FMA(KP860541664, T7M, T7J); + ii[WS(rs, 17)] = FMA(KP949179823, T7O, T7N); + ii[WS(rs, 22)] = FNMS(KP860541664, T7M, T7J); + ii[WS(rs, 12)] = FNMS(KP949179823, T7O, T7N); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 25}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 25, "t1_25", twinstr, &GENUS, {84, 48, 316, 0}, 0, 0, 0 }; + +void X(codelet_t1_25) (planner *p) { + X(kdft_dit_register) (p, t1_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 25 -name t1_25 -include dft/scalar/t.h */ + +/* + * This function contains 400 FP additions, 280 FP multiplications, + * (or, 260 additions, 140 multiplications, 140 fused multiply/add), + * 101 stack variables, 20 constants, and 100 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 48); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 48, MAKE_VOLATILE_STRIDE(50, rs)) { + E T1, T6b, T2l, T6o, To, T2m, T6a, T6p, T6t, T6S, T2u, T4I, T2i, T60, T3O; + E T5D, T4r, T58, T3Z, T5C, T4q, T5b, TS, T5W, T2G, T5s, T4g, T4M, T2R, T5t; + E T4h, T4P, T1l, T5X, T33, T5w, T4j, T4W, T3e, T5v, T4k, T4T, T1P, T5Z, T3r; + E T5z, T4o, T51, T3C, T5A, T4n, T54; + { + E T6, T2o, Tb, T2p, Tc, T68, Th, T2r, Tm, T2s, Tn, T69; + T1 = ri[0]; + T6b = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 5)]; + T5 = ii[WS(rs, 5)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T2o = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 20)]; + Ta = ii[WS(rs, 20)]; + T7 = W[38]; + T9 = W[39]; + Tb = FMA(T7, T8, T9 * Ta); + T2p = FNMS(T9, T8, T7 * Ta); + } + Tc = T6 + Tb; + T68 = T2o + T2p; + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 10)]; + Tg = ii[WS(rs, 10)]; + Td = W[18]; + Tf = W[19]; + Th = FMA(Td, Te, Tf * Tg); + T2r = FNMS(Tf, Te, Td * Tg); + } + { + E Tj, Tl, Ti, Tk; + Tj = ri[WS(rs, 15)]; + Tl = ii[WS(rs, 15)]; + Ti = W[28]; + Tk = W[29]; + Tm = FMA(Ti, Tj, Tk * Tl); + T2s = FNMS(Tk, Tj, Ti * Tl); + } + Tn = Th + Tm; + T69 = T2r + T2s; + T2l = KP559016994 * (Tc - Tn); + T6o = KP559016994 * (T68 - T69); + To = Tc + Tn; + T2m = FNMS(KP250000000, To, T1); + T6a = T68 + T69; + T6p = FNMS(KP250000000, T6a, T6b); + { + E T6r, T6s, T2q, T2t; + T6r = T6 - Tb; + T6s = Th - Tm; + T6t = FMA(KP951056516, T6r, KP587785252 * T6s); + T6S = FNMS(KP587785252, T6r, KP951056516 * T6s); + T2q = T2o - T2p; + T2t = T2r - T2s; + T2u = FMA(KP951056516, T2q, KP587785252 * T2t); + T4I = FNMS(KP587785252, T2q, KP951056516 * T2t); + } + } + { + E T1U, T3S, T3J, T3M, T3X, T3W, T3P, T3Q, T3T, T25, T2g, T2h; + { + E T1R, T1T, T1Q, T1S; + T1R = ri[WS(rs, 3)]; + T1T = ii[WS(rs, 3)]; + T1Q = W[4]; + T1S = W[5]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T3S = FNMS(T1S, T1R, T1Q * T1T); + } + { + E T1Z, T3H, T2f, T3L, T24, T3I, T2a, T3K; + { + E T1W, T1Y, T1V, T1X; + T1W = ri[WS(rs, 8)]; + T1Y = ii[WS(rs, 8)]; + T1V = W[14]; + T1X = W[15]; + T1Z = FMA(T1V, T1W, T1X * T1Y); + T3H = FNMS(T1X, T1W, T1V * T1Y); + } + { + E T2c, T2e, T2b, T2d; + T2c = ri[WS(rs, 18)]; + T2e = ii[WS(rs, 18)]; + T2b = W[34]; + T2d = W[35]; + T2f = FMA(T2b, T2c, T2d * T2e); + T3L = FNMS(T2d, T2c, T2b * T2e); + } + { + E T21, T23, T20, T22; + T21 = ri[WS(rs, 23)]; + T23 = ii[WS(rs, 23)]; + T20 = W[44]; + T22 = W[45]; + T24 = FMA(T20, T21, T22 * T23); + T3I = FNMS(T22, T21, T20 * T23); + } + { + E T27, T29, T26, T28; + T27 = ri[WS(rs, 13)]; + T29 = ii[WS(rs, 13)]; + T26 = W[24]; + T28 = W[25]; + T2a = FMA(T26, T27, T28 * T29); + T3K = FNMS(T28, T27, T26 * T29); + } + T3J = T3H - T3I; + T3M = T3K - T3L; + T3X = T2a - T2f; + T3W = T1Z - T24; + T3P = T3H + T3I; + T3Q = T3K + T3L; + T3T = T3P + T3Q; + T25 = T1Z + T24; + T2g = T2a + T2f; + T2h = T25 + T2g; + } + T2i = T1U + T2h; + T60 = T3S + T3T; + { + E T3N, T57, T3G, T56, T3E, T3F; + T3N = FMA(KP951056516, T3J, KP587785252 * T3M); + T57 = FNMS(KP587785252, T3J, KP951056516 * T3M); + T3E = KP559016994 * (T25 - T2g); + T3F = FNMS(KP250000000, T2h, T1U); + T3G = T3E + T3F; + T56 = T3F - T3E; + T3O = T3G + T3N; + T5D = T56 + T57; + T4r = T3G - T3N; + T58 = T56 - T57; + } + { + E T3Y, T59, T3V, T5a, T3R, T3U; + T3Y = FMA(KP951056516, T3W, KP587785252 * T3X); + T59 = FNMS(KP587785252, T3W, KP951056516 * T3X); + T3R = KP559016994 * (T3P - T3Q); + T3U = FNMS(KP250000000, T3T, T3S); + T3V = T3R + T3U; + T5a = T3U - T3R; + T3Z = T3V - T3Y; + T5C = T5a - T59; + T4q = T3Y + T3V; + T5b = T59 + T5a; + } + } + { + E Tu, T2K, T2B, T2E, T2P, T2O, T2H, T2I, T2L, TF, TQ, TR; + { + E Tr, Tt, Tq, Ts; + Tr = ri[WS(rs, 1)]; + Tt = ii[WS(rs, 1)]; + Tq = W[0]; + Ts = W[1]; + Tu = FMA(Tq, Tr, Ts * Tt); + T2K = FNMS(Ts, Tr, Tq * Tt); + } + { + E Tz, T2z, TP, T2D, TE, T2A, TK, T2C; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 6)]; + Ty = ii[WS(rs, 6)]; + Tv = W[10]; + Tx = W[11]; + Tz = FMA(Tv, Tw, Tx * Ty); + T2z = FNMS(Tx, Tw, Tv * Ty); + } + { + E TM, TO, TL, TN; + TM = ri[WS(rs, 16)]; + TO = ii[WS(rs, 16)]; + TL = W[30]; + TN = W[31]; + TP = FMA(TL, TM, TN * TO); + T2D = FNMS(TN, TM, TL * TO); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 21)]; + TD = ii[WS(rs, 21)]; + TA = W[40]; + TC = W[41]; + TE = FMA(TA, TB, TC * TD); + T2A = FNMS(TC, TB, TA * TD); + } + { + E TH, TJ, TG, TI; + TH = ri[WS(rs, 11)]; + TJ = ii[WS(rs, 11)]; + TG = W[20]; + TI = W[21]; + TK = FMA(TG, TH, TI * TJ); + T2C = FNMS(TI, TH, TG * TJ); + } + T2B = T2z - T2A; + T2E = T2C - T2D; + T2P = TK - TP; + T2O = Tz - TE; + T2H = T2z + T2A; + T2I = T2C + T2D; + T2L = T2H + T2I; + TF = Tz + TE; + TQ = TK + TP; + TR = TF + TQ; + } + TS = Tu + TR; + T5W = T2K + T2L; + { + E T2F, T4L, T2y, T4K, T2w, T2x; + T2F = FMA(KP951056516, T2B, KP587785252 * T2E); + T4L = FNMS(KP587785252, T2B, KP951056516 * T2E); + T2w = KP559016994 * (TF - TQ); + T2x = FNMS(KP250000000, TR, Tu); + T2y = T2w + T2x; + T4K = T2x - T2w; + T2G = T2y + T2F; + T5s = T4K + T4L; + T4g = T2y - T2F; + T4M = T4K - T4L; + } + { + E T2Q, T4N, T2N, T4O, T2J, T2M; + T2Q = FMA(KP951056516, T2O, KP587785252 * T2P); + T4N = FNMS(KP587785252, T2O, KP951056516 * T2P); + T2J = KP559016994 * (T2H - T2I); + T2M = FNMS(KP250000000, T2L, T2K); + T2N = T2J + T2M; + T4O = T2M - T2J; + T2R = T2N - T2Q; + T5t = T4O - T4N; + T4h = T2Q + T2N; + T4P = T4N + T4O; + } + } + { + E TX, T37, T2Y, T31, T3c, T3b, T34, T35, T38, T18, T1j, T1k; + { + E TU, TW, TT, TV; + TU = ri[WS(rs, 4)]; + TW = ii[WS(rs, 4)]; + TT = W[6]; + TV = W[7]; + TX = FMA(TT, TU, TV * TW); + T37 = FNMS(TV, TU, TT * TW); + } + { + E T12, T2W, T1i, T30, T17, T2X, T1d, T2Z; + { + E TZ, T11, TY, T10; + TZ = ri[WS(rs, 9)]; + T11 = ii[WS(rs, 9)]; + TY = W[16]; + T10 = W[17]; + T12 = FMA(TY, TZ, T10 * T11); + T2W = FNMS(T10, TZ, TY * T11); + } + { + E T1f, T1h, T1e, T1g; + T1f = ri[WS(rs, 19)]; + T1h = ii[WS(rs, 19)]; + T1e = W[36]; + T1g = W[37]; + T1i = FMA(T1e, T1f, T1g * T1h); + T30 = FNMS(T1g, T1f, T1e * T1h); + } + { + E T14, T16, T13, T15; + T14 = ri[WS(rs, 24)]; + T16 = ii[WS(rs, 24)]; + T13 = W[46]; + T15 = W[47]; + T17 = FMA(T13, T14, T15 * T16); + T2X = FNMS(T15, T14, T13 * T16); + } + { + E T1a, T1c, T19, T1b; + T1a = ri[WS(rs, 14)]; + T1c = ii[WS(rs, 14)]; + T19 = W[26]; + T1b = W[27]; + T1d = FMA(T19, T1a, T1b * T1c); + T2Z = FNMS(T1b, T1a, T19 * T1c); + } + T2Y = T2W - T2X; + T31 = T2Z - T30; + T3c = T1d - T1i; + T3b = T12 - T17; + T34 = T2W + T2X; + T35 = T2Z + T30; + T38 = T34 + T35; + T18 = T12 + T17; + T1j = T1d + T1i; + T1k = T18 + T1j; + } + T1l = TX + T1k; + T5X = T37 + T38; + { + E T32, T4V, T2V, T4U, T2T, T2U; + T32 = FMA(KP951056516, T2Y, KP587785252 * T31); + T4V = FNMS(KP587785252, T2Y, KP951056516 * T31); + T2T = KP559016994 * (T18 - T1j); + T2U = FNMS(KP250000000, T1k, TX); + T2V = T2T + T2U; + T4U = T2U - T2T; + T33 = T2V + T32; + T5w = T4U + T4V; + T4j = T2V - T32; + T4W = T4U - T4V; + } + { + E T3d, T4R, T3a, T4S, T36, T39; + T3d = FMA(KP951056516, T3b, KP587785252 * T3c); + T4R = FNMS(KP587785252, T3b, KP951056516 * T3c); + T36 = KP559016994 * (T34 - T35); + T39 = FNMS(KP250000000, T38, T37); + T3a = T36 + T39; + T4S = T39 - T36; + T3e = T3a - T3d; + T5v = T4S - T4R; + T4k = T3d + T3a; + T4T = T4R + T4S; + } + } + { + E T1r, T3v, T3m, T3p, T3A, T3z, T3s, T3t, T3w, T1C, T1N, T1O; + { + E T1o, T1q, T1n, T1p; + T1o = ri[WS(rs, 2)]; + T1q = ii[WS(rs, 2)]; + T1n = W[2]; + T1p = W[3]; + T1r = FMA(T1n, T1o, T1p * T1q); + T3v = FNMS(T1p, T1o, T1n * T1q); + } + { + E T1w, T3k, T1M, T3o, T1B, T3l, T1H, T3n; + { + E T1t, T1v, T1s, T1u; + T1t = ri[WS(rs, 7)]; + T1v = ii[WS(rs, 7)]; + T1s = W[12]; + T1u = W[13]; + T1w = FMA(T1s, T1t, T1u * T1v); + T3k = FNMS(T1u, T1t, T1s * T1v); + } + { + E T1J, T1L, T1I, T1K; + T1J = ri[WS(rs, 17)]; + T1L = ii[WS(rs, 17)]; + T1I = W[32]; + T1K = W[33]; + T1M = FMA(T1I, T1J, T1K * T1L); + T3o = FNMS(T1K, T1J, T1I * T1L); + } + { + E T1y, T1A, T1x, T1z; + T1y = ri[WS(rs, 22)]; + T1A = ii[WS(rs, 22)]; + T1x = W[42]; + T1z = W[43]; + T1B = FMA(T1x, T1y, T1z * T1A); + T3l = FNMS(T1z, T1y, T1x * T1A); + } + { + E T1E, T1G, T1D, T1F; + T1E = ri[WS(rs, 12)]; + T1G = ii[WS(rs, 12)]; + T1D = W[22]; + T1F = W[23]; + T1H = FMA(T1D, T1E, T1F * T1G); + T3n = FNMS(T1F, T1E, T1D * T1G); + } + T3m = T3k - T3l; + T3p = T3n - T3o; + T3A = T1H - T1M; + T3z = T1w - T1B; + T3s = T3k + T3l; + T3t = T3n + T3o; + T3w = T3s + T3t; + T1C = T1w + T1B; + T1N = T1H + T1M; + T1O = T1C + T1N; + } + T1P = T1r + T1O; + T5Z = T3v + T3w; + { + E T3q, T50, T3j, T4Z, T3h, T3i; + T3q = FMA(KP951056516, T3m, KP587785252 * T3p); + T50 = FNMS(KP587785252, T3m, KP951056516 * T3p); + T3h = KP559016994 * (T1C - T1N); + T3i = FNMS(KP250000000, T1O, T1r); + T3j = T3h + T3i; + T4Z = T3i - T3h; + T3r = T3j + T3q; + T5z = T4Z + T50; + T4o = T3j - T3q; + T51 = T4Z - T50; + } + { + E T3B, T52, T3y, T53, T3u, T3x; + T3B = FMA(KP951056516, T3z, KP587785252 * T3A); + T52 = FNMS(KP587785252, T3z, KP951056516 * T3A); + T3u = KP559016994 * (T3s - T3t); + T3x = FNMS(KP250000000, T3w, T3v); + T3y = T3u + T3x; + T53 = T3x - T3u; + T3C = T3y - T3B; + T5A = T53 - T52; + T4n = T3B + T3y; + T54 = T52 + T53; + } + } + { + E T62, T64, Tp, T2k, T5T, T5U, T63, T5V; + { + E T5Y, T61, T1m, T2j; + T5Y = T5W - T5X; + T61 = T5Z - T60; + T62 = FMA(KP951056516, T5Y, KP587785252 * T61); + T64 = FNMS(KP587785252, T5Y, KP951056516 * T61); + Tp = T1 + To; + T1m = TS + T1l; + T2j = T1P + T2i; + T2k = T1m + T2j; + T5T = KP559016994 * (T1m - T2j); + T5U = FNMS(KP250000000, T2k, Tp); + } + ri[0] = Tp + T2k; + T63 = T5U - T5T; + ri[WS(rs, 10)] = T63 - T64; + ri[WS(rs, 15)] = T63 + T64; + T5V = T5T + T5U; + ri[WS(rs, 20)] = T5V - T62; + ri[WS(rs, 5)] = T5V + T62; + } + { + E T6i, T6j, T6c, T67, T6d, T6e, T6k, T6f; + { + E T6g, T6h, T65, T66; + T6g = TS - T1l; + T6h = T1P - T2i; + T6i = FMA(KP951056516, T6g, KP587785252 * T6h); + T6j = FNMS(KP587785252, T6g, KP951056516 * T6h); + T6c = T6a + T6b; + T65 = T5W + T5X; + T66 = T5Z + T60; + T67 = T65 + T66; + T6d = KP559016994 * (T65 - T66); + T6e = FNMS(KP250000000, T67, T6c); + } + ii[0] = T67 + T6c; + T6k = T6e - T6d; + ii[WS(rs, 10)] = T6j + T6k; + ii[WS(rs, 15)] = T6k - T6j; + T6f = T6d + T6e; + ii[WS(rs, 5)] = T6f - T6i; + ii[WS(rs, 20)] = T6i + T6f; + } + { + E T2v, T4f, T6u, T6G, T42, T6z, T43, T6y, T4A, T6H, T4D, T6F, T4u, T6L, T4v; + E T6K, T48, T6v, T4b, T6n, T2n, T6q; + T2n = T2l + T2m; + T2v = T2n + T2u; + T4f = T2n - T2u; + T6q = T6o + T6p; + T6u = T6q - T6t; + T6G = T6t + T6q; + { + E T2S, T3f, T3g, T3D, T40, T41; + T2S = FMA(KP968583161, T2G, KP248689887 * T2R); + T3f = FMA(KP535826794, T33, KP844327925 * T3e); + T3g = T2S + T3f; + T3D = FMA(KP876306680, T3r, KP481753674 * T3C); + T40 = FMA(KP728968627, T3O, KP684547105 * T3Z); + T41 = T3D + T40; + T42 = T3g + T41; + T6z = T3D - T40; + T43 = KP559016994 * (T3g - T41); + T6y = T2S - T3f; + } + { + E T4y, T4z, T6D, T4B, T4C, T6E; + T4y = FNMS(KP844327925, T4g, KP535826794 * T4h); + T4z = FNMS(KP637423989, T4k, KP770513242 * T4j); + T6D = T4y + T4z; + T4B = FMA(KP125333233, T4r, KP992114701 * T4q); + T4C = FMA(KP904827052, T4o, KP425779291 * T4n); + T6E = T4C + T4B; + T4A = T4y - T4z; + T6H = KP559016994 * (T6D + T6E); + T4D = T4B - T4C; + T6F = T6D - T6E; + } + { + E T4i, T4l, T4m, T4p, T4s, T4t; + T4i = FMA(KP535826794, T4g, KP844327925 * T4h); + T4l = FMA(KP637423989, T4j, KP770513242 * T4k); + T4m = T4i - T4l; + T4p = FNMS(KP425779291, T4o, KP904827052 * T4n); + T4s = FNMS(KP992114701, T4r, KP125333233 * T4q); + T4t = T4p + T4s; + T4u = T4m + T4t; + T6L = T4p - T4s; + T4v = KP559016994 * (T4m - T4t); + T6K = T4i + T4l; + } + { + E T46, T47, T6l, T49, T4a, T6m; + T46 = FNMS(KP248689887, T2G, KP968583161 * T2R); + T47 = FNMS(KP844327925, T33, KP535826794 * T3e); + T6l = T46 + T47; + T49 = FNMS(KP481753674, T3r, KP876306680 * T3C); + T4a = FNMS(KP684547105, T3O, KP728968627 * T3Z); + T6m = T49 + T4a; + T48 = T46 - T47; + T6v = KP559016994 * (T6l - T6m); + T4b = T49 - T4a; + T6n = T6l + T6m; + } + ri[WS(rs, 1)] = T2v + T42; + ii[WS(rs, 1)] = T6n + T6u; + ri[WS(rs, 4)] = T4f + T4u; + ii[WS(rs, 4)] = T6F + T6G; + { + E T4c, T4e, T45, T4d, T44; + T4c = FMA(KP951056516, T48, KP587785252 * T4b); + T4e = FNMS(KP587785252, T48, KP951056516 * T4b); + T44 = FNMS(KP250000000, T42, T2v); + T45 = T43 + T44; + T4d = T44 - T43; + ri[WS(rs, 21)] = T45 - T4c; + ri[WS(rs, 16)] = T4d + T4e; + ri[WS(rs, 6)] = T45 + T4c; + ri[WS(rs, 11)] = T4d - T4e; + } + { + E T6A, T6B, T6x, T6C, T6w; + T6A = FMA(KP951056516, T6y, KP587785252 * T6z); + T6B = FNMS(KP587785252, T6y, KP951056516 * T6z); + T6w = FNMS(KP250000000, T6n, T6u); + T6x = T6v + T6w; + T6C = T6w - T6v; + ii[WS(rs, 6)] = T6x - T6A; + ii[WS(rs, 16)] = T6C - T6B; + ii[WS(rs, 21)] = T6A + T6x; + ii[WS(rs, 11)] = T6B + T6C; + } + { + E T4E, T4G, T4x, T4F, T4w; + T4E = FMA(KP951056516, T4A, KP587785252 * T4D); + T4G = FNMS(KP587785252, T4A, KP951056516 * T4D); + T4w = FNMS(KP250000000, T4u, T4f); + T4x = T4v + T4w; + T4F = T4w - T4v; + ri[WS(rs, 24)] = T4x - T4E; + ri[WS(rs, 19)] = T4F + T4G; + ri[WS(rs, 9)] = T4x + T4E; + ri[WS(rs, 14)] = T4F - T4G; + } + { + E T6M, T6N, T6J, T6O, T6I; + T6M = FMA(KP951056516, T6K, KP587785252 * T6L); + T6N = FNMS(KP587785252, T6K, KP951056516 * T6L); + T6I = FNMS(KP250000000, T6F, T6G); + T6J = T6H + T6I; + T6O = T6I - T6H; + ii[WS(rs, 9)] = T6J - T6M; + ii[WS(rs, 19)] = T6O - T6N; + ii[WS(rs, 24)] = T6M + T6J; + ii[WS(rs, 14)] = T6N + T6O; + } + } + { + E T4J, T5r, T6U, T76, T5e, T6Z, T5f, T6Y, T5M, T77, T5P, T75, T5G, T7b, T5H; + E T7a, T5k, T6V, T5n, T6R, T4H, T6T; + T4H = T2m - T2l; + T4J = T4H - T4I; + T5r = T4H + T4I; + T6T = T6p - T6o; + T6U = T6S + T6T; + T76 = T6T - T6S; + { + E T4Q, T4X, T4Y, T55, T5c, T5d; + T4Q = FMA(KP876306680, T4M, KP481753674 * T4P); + T4X = FNMS(KP425779291, T4W, KP904827052 * T4T); + T4Y = T4Q + T4X; + T55 = FMA(KP535826794, T51, KP844327925 * T54); + T5c = FMA(KP062790519, T58, KP998026728 * T5b); + T5d = T55 + T5c; + T5e = T4Y + T5d; + T6Z = T55 - T5c; + T5f = KP559016994 * (T4Y - T5d); + T6Y = T4Q - T4X; + } + { + E T5K, T5L, T73, T5N, T5O, T74; + T5K = FNMS(KP684547105, T5s, KP728968627 * T5t); + T5L = FMA(KP125333233, T5w, KP992114701 * T5v); + T73 = T5K - T5L; + T5N = FNMS(KP998026728, T5z, KP062790519 * T5A); + T5O = FMA(KP770513242, T5D, KP637423989 * T5C); + T74 = T5N - T5O; + T5M = T5K + T5L; + T77 = KP559016994 * (T73 - T74); + T5P = T5N + T5O; + T75 = T73 + T74; + } + { + E T5u, T5x, T5y, T5B, T5E, T5F; + T5u = FMA(KP728968627, T5s, KP684547105 * T5t); + T5x = FNMS(KP992114701, T5w, KP125333233 * T5v); + T5y = T5u + T5x; + T5B = FMA(KP062790519, T5z, KP998026728 * T5A); + T5E = FNMS(KP637423989, T5D, KP770513242 * T5C); + T5F = T5B + T5E; + T5G = T5y + T5F; + T7b = T5B - T5E; + T5H = KP559016994 * (T5y - T5F); + T7a = T5u - T5x; + } + { + E T5i, T5j, T6P, T5l, T5m, T6Q; + T5i = FNMS(KP481753674, T4M, KP876306680 * T4P); + T5j = FMA(KP904827052, T4W, KP425779291 * T4T); + T6P = T5i - T5j; + T5l = FNMS(KP844327925, T51, KP535826794 * T54); + T5m = FNMS(KP998026728, T58, KP062790519 * T5b); + T6Q = T5l + T5m; + T5k = T5i + T5j; + T6V = KP559016994 * (T6P - T6Q); + T5n = T5l - T5m; + T6R = T6P + T6Q; + } + ri[WS(rs, 2)] = T4J + T5e; + ii[WS(rs, 2)] = T6R + T6U; + ri[WS(rs, 3)] = T5r + T5G; + ii[WS(rs, 3)] = T75 + T76; + { + E T5o, T5q, T5h, T5p, T5g; + T5o = FMA(KP951056516, T5k, KP587785252 * T5n); + T5q = FNMS(KP587785252, T5k, KP951056516 * T5n); + T5g = FNMS(KP250000000, T5e, T4J); + T5h = T5f + T5g; + T5p = T5g - T5f; + ri[WS(rs, 22)] = T5h - T5o; + ri[WS(rs, 17)] = T5p + T5q; + ri[WS(rs, 7)] = T5h + T5o; + ri[WS(rs, 12)] = T5p - T5q; + } + { + E T70, T71, T6X, T72, T6W; + T70 = FMA(KP951056516, T6Y, KP587785252 * T6Z); + T71 = FNMS(KP587785252, T6Y, KP951056516 * T6Z); + T6W = FNMS(KP250000000, T6R, T6U); + T6X = T6V + T6W; + T72 = T6W - T6V; + ii[WS(rs, 7)] = T6X - T70; + ii[WS(rs, 17)] = T72 - T71; + ii[WS(rs, 22)] = T70 + T6X; + ii[WS(rs, 12)] = T71 + T72; + } + { + E T5Q, T5S, T5J, T5R, T5I; + T5Q = FMA(KP951056516, T5M, KP587785252 * T5P); + T5S = FNMS(KP587785252, T5M, KP951056516 * T5P); + T5I = FNMS(KP250000000, T5G, T5r); + T5J = T5H + T5I; + T5R = T5I - T5H; + ri[WS(rs, 23)] = T5J - T5Q; + ri[WS(rs, 18)] = T5R + T5S; + ri[WS(rs, 8)] = T5J + T5Q; + ri[WS(rs, 13)] = T5R - T5S; + } + { + E T7c, T7d, T79, T7e, T78; + T7c = FMA(KP951056516, T7a, KP587785252 * T7b); + T7d = FNMS(KP587785252, T7a, KP951056516 * T7b); + T78 = FNMS(KP250000000, T75, T76); + T79 = T77 + T78; + T7e = T78 - T77; + ii[WS(rs, 8)] = T79 - T7c; + ii[WS(rs, 18)] = T7e - T7d; + ii[WS(rs, 23)] = T7c + T79; + ii[WS(rs, 13)] = T7d + T7e; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 25}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 25, "t1_25", twinstr, &GENUS, {260, 140, 140, 0}, 0, 0, 0 }; + +void X(codelet_t1_25) (planner *p) { + X(kdft_dit_register) (p, t1_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_3.c new file mode 100644 index 000000000..a50dd1c88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_3.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 3 -name t1_3 -include dft/scalar/t.h */ + +/* + * This function contains 16 FP additions, 14 FP multiplications, + * (or, 6 additions, 4 multiplications, 10 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs)) { + E T1, Tm, T7, Th, Td, Tj; + T1 = ri[0]; + Tm = ii[0]; + { + E T3, T6, T4, Tg, T2, T5; + T3 = ri[WS(rs, 1)]; + T6 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + Tg = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Th = FNMS(T5, T3, Tg); + } + { + E T9, Tc, Ta, Ti, T8, Tb; + T9 = ri[WS(rs, 2)]; + Tc = ii[WS(rs, 2)]; + T8 = W[2]; + Ta = T8 * T9; + Ti = T8 * Tc; + Tb = W[3]; + Td = FMA(Tb, Tc, Ta); + Tj = FNMS(Tb, T9, Ti); + } + { + E Tk, Te, Tf, To, Tl, Tn; + Tk = Th - Tj; + Te = T7 + Td; + Tf = FNMS(KP500000000, Te, T1); + ri[0] = T1 + Te; + ri[WS(rs, 1)] = FMA(KP866025403, Tk, Tf); + ri[WS(rs, 2)] = FNMS(KP866025403, Tk, Tf); + To = Td - T7; + Tl = Th + Tj; + Tn = FNMS(KP500000000, Tl, Tm); + ii[0] = Tl + Tm; + ii[WS(rs, 2)] = FNMS(KP866025403, To, Tn); + ii[WS(rs, 1)] = FMA(KP866025403, To, Tn); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 3, "t1_3", twinstr, &GENUS, {6, 4, 10, 0}, 0, 0, 0 }; + +void X(codelet_t1_3) (planner *p) { + X(kdft_dit_register) (p, t1_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 3 -name t1_3 -include dft/scalar/t.h */ + +/* + * This function contains 16 FP additions, 12 FP multiplications, + * (or, 10 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs)) { + E T1, Ti, T6, Te, Tb, Tf, Tc, Th; + T1 = ri[0]; + Ti = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 1)]; + T5 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + Te = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 2)]; + Ta = ii[WS(rs, 2)]; + T7 = W[2]; + T9 = W[3]; + Tb = FMA(T7, T8, T9 * Ta); + Tf = FNMS(T9, T8, T7 * Ta); + } + Tc = T6 + Tb; + Th = Te + Tf; + ri[0] = T1 + Tc; + ii[0] = Th + Ti; + { + E Td, Tg, Tj, Tk; + Td = FNMS(KP500000000, Tc, T1); + Tg = KP866025403 * (Te - Tf); + ri[WS(rs, 2)] = Td - Tg; + ri[WS(rs, 1)] = Td + Tg; + Tj = KP866025403 * (Tb - T6); + Tk = FNMS(KP500000000, Th, Ti); + ii[WS(rs, 1)] = Tj + Tk; + ii[WS(rs, 2)] = Tk - Tj; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 3, "t1_3", twinstr, &GENUS, {10, 6, 6, 0}, 0, 0, 0 }; + +void X(codelet_t1_3) (planner *p) { + X(kdft_dit_register) (p, t1_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_32.c new file mode 100644 index 000000000..147094610 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_32.c @@ -0,0 +1,1809 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:15 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -name t1_32 -include dft/scalar/t.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 236 additions, 62 multiplications, 198 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 62); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 62, MAKE_VOLATILE_STRIDE(64, rs)) { + E T8, T8x, T3w, T87, Tl, T8y, T3B, T83, Tz, T6F, T3J, T5T, TM, T6G, T3Q; + E T5U, T11, T1e, T6M, T6J, T6K, T6L, T3Z, T5X, T46, T5Y, T1s, T1F, T6O, T6P; + E T6Q, T6R, T4e, T60, T4l, T61, T32, T7b, T78, T7N, T54, T6f, T5r, T6c, T29; + E T70, T6X, T7I, T4v, T68, T4S, T65, T3t, T79, T7e, T7O, T5b, T5s, T5i, T5t; + E T2A, T6Y, T73, T7J, T4C, T4T, T4J, T4U; + { + E T1, T86, T3, T6, T4, T84, T2, T7, T85, T5; + T1 = ri[0]; + T86 = ii[0]; + T3 = ri[WS(rs, 16)]; + T6 = ii[WS(rs, 16)]; + T2 = W[30]; + T4 = T2 * T3; + T84 = T2 * T6; + T5 = W[31]; + T7 = FMA(T5, T6, T4); + T85 = FNMS(T5, T3, T84); + T8 = T1 + T7; + T8x = T86 - T85; + T3w = T1 - T7; + T87 = T85 + T86; + } + { + E Ta, Td, Tb, T3x, Tg, Tj, Th, T3z, T9, Tf; + Ta = ri[WS(rs, 8)]; + Td = ii[WS(rs, 8)]; + T9 = W[14]; + Tb = T9 * Ta; + T3x = T9 * Td; + Tg = ri[WS(rs, 24)]; + Tj = ii[WS(rs, 24)]; + Tf = W[46]; + Th = Tf * Tg; + T3z = Tf * Tj; + { + E Te, T3y, Tk, T3A, Tc, Ti; + Tc = W[15]; + Te = FMA(Tc, Td, Tb); + T3y = FNMS(Tc, Ta, T3x); + Ti = W[47]; + Tk = FMA(Ti, Tj, Th); + T3A = FNMS(Ti, Tg, T3z); + Tl = Te + Tk; + T8y = Te - Tk; + T3B = T3y - T3A; + T83 = T3y + T3A; + } + } + { + E Ts, T3F, Ty, T3H, T3D, T3I; + { + E To, Tr, Tp, T3E, Tn, Tq; + To = ri[WS(rs, 4)]; + Tr = ii[WS(rs, 4)]; + Tn = W[6]; + Tp = Tn * To; + T3E = Tn * Tr; + Tq = W[7]; + Ts = FMA(Tq, Tr, Tp); + T3F = FNMS(Tq, To, T3E); + } + { + E Tu, Tx, Tv, T3G, Tt, Tw; + Tu = ri[WS(rs, 20)]; + Tx = ii[WS(rs, 20)]; + Tt = W[38]; + Tv = Tt * Tu; + T3G = Tt * Tx; + Tw = W[39]; + Ty = FMA(Tw, Tx, Tv); + T3H = FNMS(Tw, Tu, T3G); + } + Tz = Ts + Ty; + T6F = T3F + T3H; + T3D = Ts - Ty; + T3I = T3F - T3H; + T3J = T3D + T3I; + T5T = T3I - T3D; + } + { + E TF, T3M, TL, T3O, T3K, T3P; + { + E TB, TE, TC, T3L, TA, TD; + TB = ri[WS(rs, 28)]; + TE = ii[WS(rs, 28)]; + TA = W[54]; + TC = TA * TB; + T3L = TA * TE; + TD = W[55]; + TF = FMA(TD, TE, TC); + T3M = FNMS(TD, TB, T3L); + } + { + E TH, TK, TI, T3N, TG, TJ; + TH = ri[WS(rs, 12)]; + TK = ii[WS(rs, 12)]; + TG = W[22]; + TI = TG * TH; + T3N = TG * TK; + TJ = W[23]; + TL = FMA(TJ, TK, TI); + T3O = FNMS(TJ, TH, T3N); + } + TM = TF + TL; + T6G = T3M + T3O; + T3K = TF - TL; + T3P = T3M - T3O; + T3Q = T3K - T3P; + T5U = T3K + T3P; + } + { + E TU, T3U, T1d, T44, T10, T3W, T17, T42; + { + E TQ, TT, TR, T3T, TP, TS; + TQ = ri[WS(rs, 2)]; + TT = ii[WS(rs, 2)]; + TP = W[2]; + TR = TP * TQ; + T3T = TP * TT; + TS = W[3]; + TU = FMA(TS, TT, TR); + T3U = FNMS(TS, TQ, T3T); + } + { + E T19, T1c, T1a, T43, T18, T1b; + T19 = ri[WS(rs, 26)]; + T1c = ii[WS(rs, 26)]; + T18 = W[50]; + T1a = T18 * T19; + T43 = T18 * T1c; + T1b = W[51]; + T1d = FMA(T1b, T1c, T1a); + T44 = FNMS(T1b, T19, T43); + } + { + E TW, TZ, TX, T3V, TV, TY; + TW = ri[WS(rs, 18)]; + TZ = ii[WS(rs, 18)]; + TV = W[34]; + TX = TV * TW; + T3V = TV * TZ; + TY = W[35]; + T10 = FMA(TY, TZ, TX); + T3W = FNMS(TY, TW, T3V); + } + { + E T13, T16, T14, T41, T12, T15; + T13 = ri[WS(rs, 10)]; + T16 = ii[WS(rs, 10)]; + T12 = W[18]; + T14 = T12 * T13; + T41 = T12 * T16; + T15 = W[19]; + T17 = FMA(T15, T16, T14); + T42 = FNMS(T15, T13, T41); + } + T11 = TU + T10; + T1e = T17 + T1d; + T6M = T11 - T1e; + T6J = T3U + T3W; + T6K = T42 + T44; + T6L = T6J - T6K; + { + E T3X, T3Y, T40, T45; + T3X = T3U - T3W; + T3Y = T17 - T1d; + T3Z = T3X - T3Y; + T5X = T3X + T3Y; + T40 = TU - T10; + T45 = T42 - T44; + T46 = T40 + T45; + T5Y = T40 - T45; + } + } + { + E T1l, T49, T1E, T4j, T1r, T4b, T1y, T4h; + { + E T1h, T1k, T1i, T48, T1g, T1j; + T1h = ri[WS(rs, 30)]; + T1k = ii[WS(rs, 30)]; + T1g = W[58]; + T1i = T1g * T1h; + T48 = T1g * T1k; + T1j = W[59]; + T1l = FMA(T1j, T1k, T1i); + T49 = FNMS(T1j, T1h, T48); + } + { + E T1A, T1D, T1B, T4i, T1z, T1C; + T1A = ri[WS(rs, 22)]; + T1D = ii[WS(rs, 22)]; + T1z = W[42]; + T1B = T1z * T1A; + T4i = T1z * T1D; + T1C = W[43]; + T1E = FMA(T1C, T1D, T1B); + T4j = FNMS(T1C, T1A, T4i); + } + { + E T1n, T1q, T1o, T4a, T1m, T1p; + T1n = ri[WS(rs, 14)]; + T1q = ii[WS(rs, 14)]; + T1m = W[26]; + T1o = T1m * T1n; + T4a = T1m * T1q; + T1p = W[27]; + T1r = FMA(T1p, T1q, T1o); + T4b = FNMS(T1p, T1n, T4a); + } + { + E T1u, T1x, T1v, T4g, T1t, T1w; + T1u = ri[WS(rs, 6)]; + T1x = ii[WS(rs, 6)]; + T1t = W[10]; + T1v = T1t * T1u; + T4g = T1t * T1x; + T1w = W[11]; + T1y = FMA(T1w, T1x, T1v); + T4h = FNMS(T1w, T1u, T4g); + } + T1s = T1l + T1r; + T1F = T1y + T1E; + T6O = T1s - T1F; + T6P = T49 + T4b; + T6Q = T4h + T4j; + T6R = T6P - T6Q; + { + E T4c, T4d, T4f, T4k; + T4c = T49 - T4b; + T4d = T1y - T1E; + T4e = T4c - T4d; + T60 = T4c + T4d; + T4f = T1l - T1r; + T4k = T4h - T4j; + T4l = T4f + T4k; + T61 = T4f - T4k; + } + } + { + E T2H, T4Z, T30, T5p, T2N, T51, T2U, T5n; + { + E T2D, T2G, T2E, T4Y, T2C, T2F; + T2D = ri[WS(rs, 31)]; + T2G = ii[WS(rs, 31)]; + T2C = W[60]; + T2E = T2C * T2D; + T4Y = T2C * T2G; + T2F = W[61]; + T2H = FMA(T2F, T2G, T2E); + T4Z = FNMS(T2F, T2D, T4Y); + } + { + E T2W, T2Z, T2X, T5o, T2V, T2Y; + T2W = ri[WS(rs, 23)]; + T2Z = ii[WS(rs, 23)]; + T2V = W[44]; + T2X = T2V * T2W; + T5o = T2V * T2Z; + T2Y = W[45]; + T30 = FMA(T2Y, T2Z, T2X); + T5p = FNMS(T2Y, T2W, T5o); + } + { + E T2J, T2M, T2K, T50, T2I, T2L; + T2J = ri[WS(rs, 15)]; + T2M = ii[WS(rs, 15)]; + T2I = W[28]; + T2K = T2I * T2J; + T50 = T2I * T2M; + T2L = W[29]; + T2N = FMA(T2L, T2M, T2K); + T51 = FNMS(T2L, T2J, T50); + } + { + E T2Q, T2T, T2R, T5m, T2P, T2S; + T2Q = ri[WS(rs, 7)]; + T2T = ii[WS(rs, 7)]; + T2P = W[12]; + T2R = T2P * T2Q; + T5m = T2P * T2T; + T2S = W[13]; + T2U = FMA(T2S, T2T, T2R); + T5n = FNMS(T2S, T2Q, T5m); + } + { + E T2O, T31, T76, T77; + T2O = T2H + T2N; + T31 = T2U + T30; + T32 = T2O + T31; + T7b = T2O - T31; + T76 = T4Z + T51; + T77 = T5n + T5p; + T78 = T76 - T77; + T7N = T76 + T77; + } + { + E T52, T53, T5l, T5q; + T52 = T4Z - T51; + T53 = T2U - T30; + T54 = T52 - T53; + T6f = T52 + T53; + T5l = T2H - T2N; + T5q = T5n - T5p; + T5r = T5l + T5q; + T6c = T5l - T5q; + } + } + { + E T1O, T4q, T27, T4Q, T1U, T4s, T21, T4O; + { + E T1K, T1N, T1L, T4p, T1J, T1M; + T1K = ri[WS(rs, 1)]; + T1N = ii[WS(rs, 1)]; + T1J = W[0]; + T1L = T1J * T1K; + T4p = T1J * T1N; + T1M = W[1]; + T1O = FMA(T1M, T1N, T1L); + T4q = FNMS(T1M, T1K, T4p); + } + { + E T23, T26, T24, T4P, T22, T25; + T23 = ri[WS(rs, 25)]; + T26 = ii[WS(rs, 25)]; + T22 = W[48]; + T24 = T22 * T23; + T4P = T22 * T26; + T25 = W[49]; + T27 = FMA(T25, T26, T24); + T4Q = FNMS(T25, T23, T4P); + } + { + E T1Q, T1T, T1R, T4r, T1P, T1S; + T1Q = ri[WS(rs, 17)]; + T1T = ii[WS(rs, 17)]; + T1P = W[32]; + T1R = T1P * T1Q; + T4r = T1P * T1T; + T1S = W[33]; + T1U = FMA(T1S, T1T, T1R); + T4s = FNMS(T1S, T1Q, T4r); + } + { + E T1X, T20, T1Y, T4N, T1W, T1Z; + T1X = ri[WS(rs, 9)]; + T20 = ii[WS(rs, 9)]; + T1W = W[16]; + T1Y = T1W * T1X; + T4N = T1W * T20; + T1Z = W[17]; + T21 = FMA(T1Z, T20, T1Y); + T4O = FNMS(T1Z, T1X, T4N); + } + { + E T1V, T28, T6V, T6W; + T1V = T1O + T1U; + T28 = T21 + T27; + T29 = T1V + T28; + T70 = T1V - T28; + T6V = T4q + T4s; + T6W = T4O + T4Q; + T6X = T6V - T6W; + T7I = T6V + T6W; + } + { + E T4t, T4u, T4M, T4R; + T4t = T4q - T4s; + T4u = T21 - T27; + T4v = T4t - T4u; + T68 = T4t + T4u; + T4M = T1O - T1U; + T4R = T4O - T4Q; + T4S = T4M + T4R; + T65 = T4M - T4R; + } + } + { + E T38, T56, T3r, T5g, T3e, T58, T3l, T5e; + { + E T34, T37, T35, T55, T33, T36; + T34 = ri[WS(rs, 3)]; + T37 = ii[WS(rs, 3)]; + T33 = W[4]; + T35 = T33 * T34; + T55 = T33 * T37; + T36 = W[5]; + T38 = FMA(T36, T37, T35); + T56 = FNMS(T36, T34, T55); + } + { + E T3n, T3q, T3o, T5f, T3m, T3p; + T3n = ri[WS(rs, 11)]; + T3q = ii[WS(rs, 11)]; + T3m = W[20]; + T3o = T3m * T3n; + T5f = T3m * T3q; + T3p = W[21]; + T3r = FMA(T3p, T3q, T3o); + T5g = FNMS(T3p, T3n, T5f); + } + { + E T3a, T3d, T3b, T57, T39, T3c; + T3a = ri[WS(rs, 19)]; + T3d = ii[WS(rs, 19)]; + T39 = W[36]; + T3b = T39 * T3a; + T57 = T39 * T3d; + T3c = W[37]; + T3e = FMA(T3c, T3d, T3b); + T58 = FNMS(T3c, T3a, T57); + } + { + E T3h, T3k, T3i, T5d, T3g, T3j; + T3h = ri[WS(rs, 27)]; + T3k = ii[WS(rs, 27)]; + T3g = W[52]; + T3i = T3g * T3h; + T5d = T3g * T3k; + T3j = W[53]; + T3l = FMA(T3j, T3k, T3i); + T5e = FNMS(T3j, T3h, T5d); + } + { + E T3f, T3s, T7c, T7d; + T3f = T38 + T3e; + T3s = T3l + T3r; + T3t = T3f + T3s; + T79 = T3s - T3f; + T7c = T56 + T58; + T7d = T5e + T5g; + T7e = T7c - T7d; + T7O = T7c + T7d; + } + { + E T59, T5a, T5c, T5h; + T59 = T56 - T58; + T5a = T38 - T3e; + T5b = T59 - T5a; + T5s = T5a + T59; + T5c = T3l - T3r; + T5h = T5e - T5g; + T5i = T5c + T5h; + T5t = T5c - T5h; + } + } + { + E T2f, T4x, T2y, T4H, T2l, T4z, T2s, T4F; + { + E T2b, T2e, T2c, T4w, T2a, T2d; + T2b = ri[WS(rs, 5)]; + T2e = ii[WS(rs, 5)]; + T2a = W[8]; + T2c = T2a * T2b; + T4w = T2a * T2e; + T2d = W[9]; + T2f = FMA(T2d, T2e, T2c); + T4x = FNMS(T2d, T2b, T4w); + } + { + E T2u, T2x, T2v, T4G, T2t, T2w; + T2u = ri[WS(rs, 13)]; + T2x = ii[WS(rs, 13)]; + T2t = W[24]; + T2v = T2t * T2u; + T4G = T2t * T2x; + T2w = W[25]; + T2y = FMA(T2w, T2x, T2v); + T4H = FNMS(T2w, T2u, T4G); + } + { + E T2h, T2k, T2i, T4y, T2g, T2j; + T2h = ri[WS(rs, 21)]; + T2k = ii[WS(rs, 21)]; + T2g = W[40]; + T2i = T2g * T2h; + T4y = T2g * T2k; + T2j = W[41]; + T2l = FMA(T2j, T2k, T2i); + T4z = FNMS(T2j, T2h, T4y); + } + { + E T2o, T2r, T2p, T4E, T2n, T2q; + T2o = ri[WS(rs, 29)]; + T2r = ii[WS(rs, 29)]; + T2n = W[56]; + T2p = T2n * T2o; + T4E = T2n * T2r; + T2q = W[57]; + T2s = FMA(T2q, T2r, T2p); + T4F = FNMS(T2q, T2o, T4E); + } + { + E T2m, T2z, T71, T72; + T2m = T2f + T2l; + T2z = T2s + T2y; + T2A = T2m + T2z; + T6Y = T2z - T2m; + T71 = T4x + T4z; + T72 = T4F + T4H; + T73 = T71 - T72; + T7J = T71 + T72; + } + { + E T4A, T4B, T4D, T4I; + T4A = T4x - T4z; + T4B = T2f - T2l; + T4C = T4A - T4B; + T4T = T4B + T4A; + T4D = T2s - T2y; + T4I = T4F - T4H; + T4J = T4D + T4I; + T4U = T4D - T4I; + } + } + { + E TO, T7C, T7Z, T80, T89, T8e, T1H, T8d, T3v, T8b, T7L, T7T, T7Q, T7U, T7F; + E T81; + { + E Tm, TN, T7X, T7Y; + Tm = T8 + Tl; + TN = Tz + TM; + TO = Tm + TN; + T7C = Tm - TN; + T7X = T7I + T7J; + T7Y = T7N + T7O; + T7Z = T7X - T7Y; + T80 = T7X + T7Y; + } + { + E T82, T88, T1f, T1G; + T82 = T6F + T6G; + T88 = T83 + T87; + T89 = T82 + T88; + T8e = T88 - T82; + T1f = T11 + T1e; + T1G = T1s + T1F; + T1H = T1f + T1G; + T8d = T1G - T1f; + } + { + E T2B, T3u, T7H, T7K; + T2B = T29 + T2A; + T3u = T32 + T3t; + T3v = T2B + T3u; + T8b = T3u - T2B; + T7H = T29 - T2A; + T7K = T7I - T7J; + T7L = T7H + T7K; + T7T = T7K - T7H; + } + { + E T7M, T7P, T7D, T7E; + T7M = T32 - T3t; + T7P = T7N - T7O; + T7Q = T7M - T7P; + T7U = T7M + T7P; + T7D = T6J + T6K; + T7E = T6P + T6Q; + T7F = T7D - T7E; + T81 = T7D + T7E; + } + { + E T1I, T8a, T7W, T8c; + T1I = TO + T1H; + ri[WS(rs, 16)] = T1I - T3v; + ri[0] = T1I + T3v; + T8a = T81 + T89; + ii[0] = T80 + T8a; + ii[WS(rs, 16)] = T8a - T80; + T7W = TO - T1H; + ri[WS(rs, 24)] = T7W - T7Z; + ri[WS(rs, 8)] = T7W + T7Z; + T8c = T89 - T81; + ii[WS(rs, 8)] = T8b + T8c; + ii[WS(rs, 24)] = T8c - T8b; + } + { + E T7G, T7R, T8f, T8g; + T7G = T7C + T7F; + T7R = T7L + T7Q; + ri[WS(rs, 20)] = FNMS(KP707106781, T7R, T7G); + ri[WS(rs, 4)] = FMA(KP707106781, T7R, T7G); + T8f = T8d + T8e; + T8g = T7T + T7U; + ii[WS(rs, 4)] = FMA(KP707106781, T8g, T8f); + ii[WS(rs, 20)] = FNMS(KP707106781, T8g, T8f); + } + { + E T7S, T7V, T8h, T8i; + T7S = T7C - T7F; + T7V = T7T - T7U; + ri[WS(rs, 28)] = FNMS(KP707106781, T7V, T7S); + ri[WS(rs, 12)] = FMA(KP707106781, T7V, T7S); + T8h = T8e - T8d; + T8i = T7Q - T7L; + ii[WS(rs, 12)] = FMA(KP707106781, T8i, T8h); + ii[WS(rs, 28)] = FNMS(KP707106781, T8i, T8h); + } + } + { + E T6I, T7m, T7w, T7A, T8l, T8r, T6T, T8m, T75, T7j, T7p, T8s, T7t, T7z, T7g; + E T7k; + { + E T6E, T6H, T7u, T7v; + T6E = T8 - Tl; + T6H = T6F - T6G; + T6I = T6E - T6H; + T7m = T6E + T6H; + T7u = T7b + T7e; + T7v = T78 + T79; + T7w = FNMS(KP414213562, T7v, T7u); + T7A = FMA(KP414213562, T7u, T7v); + } + { + E T8j, T8k, T6N, T6S; + T8j = TM - Tz; + T8k = T87 - T83; + T8l = T8j + T8k; + T8r = T8k - T8j; + T6N = T6L - T6M; + T6S = T6O + T6R; + T6T = T6N - T6S; + T8m = T6N + T6S; + } + { + E T6Z, T74, T7n, T7o; + T6Z = T6X - T6Y; + T74 = T70 - T73; + T75 = FMA(KP414213562, T74, T6Z); + T7j = FNMS(KP414213562, T6Z, T74); + T7n = T6M + T6L; + T7o = T6O - T6R; + T7p = T7n + T7o; + T8s = T7o - T7n; + } + { + E T7r, T7s, T7a, T7f; + T7r = T70 + T73; + T7s = T6X + T6Y; + T7t = FMA(KP414213562, T7s, T7r); + T7z = FNMS(KP414213562, T7r, T7s); + T7a = T78 - T79; + T7f = T7b - T7e; + T7g = FNMS(KP414213562, T7f, T7a); + T7k = FMA(KP414213562, T7a, T7f); + } + { + E T6U, T7h, T8t, T8u; + T6U = FMA(KP707106781, T6T, T6I); + T7h = T75 - T7g; + ri[WS(rs, 22)] = FNMS(KP923879532, T7h, T6U); + ri[WS(rs, 6)] = FMA(KP923879532, T7h, T6U); + T8t = FMA(KP707106781, T8s, T8r); + T8u = T7k - T7j; + ii[WS(rs, 6)] = FMA(KP923879532, T8u, T8t); + ii[WS(rs, 22)] = FNMS(KP923879532, T8u, T8t); + } + { + E T7i, T7l, T8v, T8w; + T7i = FNMS(KP707106781, T6T, T6I); + T7l = T7j + T7k; + ri[WS(rs, 14)] = FNMS(KP923879532, T7l, T7i); + ri[WS(rs, 30)] = FMA(KP923879532, T7l, T7i); + T8v = FNMS(KP707106781, T8s, T8r); + T8w = T75 + T7g; + ii[WS(rs, 14)] = FNMS(KP923879532, T8w, T8v); + ii[WS(rs, 30)] = FMA(KP923879532, T8w, T8v); + } + { + E T7q, T7x, T8n, T8o; + T7q = FMA(KP707106781, T7p, T7m); + T7x = T7t + T7w; + ri[WS(rs, 18)] = FNMS(KP923879532, T7x, T7q); + ri[WS(rs, 2)] = FMA(KP923879532, T7x, T7q); + T8n = FMA(KP707106781, T8m, T8l); + T8o = T7z + T7A; + ii[WS(rs, 2)] = FMA(KP923879532, T8o, T8n); + ii[WS(rs, 18)] = FNMS(KP923879532, T8o, T8n); + } + { + E T7y, T7B, T8p, T8q; + T7y = FNMS(KP707106781, T7p, T7m); + T7B = T7z - T7A; + ri[WS(rs, 26)] = FNMS(KP923879532, T7B, T7y); + ri[WS(rs, 10)] = FMA(KP923879532, T7B, T7y); + T8p = FNMS(KP707106781, T8m, T8l); + T8q = T7w - T7t; + ii[WS(rs, 10)] = FMA(KP923879532, T8q, T8p); + ii[WS(rs, 26)] = FNMS(KP923879532, T8q, T8p); + } + } + { + E T3S, T5C, T4n, T8C, T8B, T8H, T5F, T8I, T5w, T5Q, T5A, T5M, T4X, T5P, T5z; + E T5J; + { + E T3C, T3R, T5D, T5E; + T3C = T3w + T3B; + T3R = T3J + T3Q; + T3S = FNMS(KP707106781, T3R, T3C); + T5C = FMA(KP707106781, T3R, T3C); + { + E T47, T4m, T8z, T8A; + T47 = FNMS(KP414213562, T46, T3Z); + T4m = FMA(KP414213562, T4l, T4e); + T4n = T47 - T4m; + T8C = T47 + T4m; + T8z = T8x - T8y; + T8A = T5T + T5U; + T8B = FMA(KP707106781, T8A, T8z); + T8H = FNMS(KP707106781, T8A, T8z); + } + T5D = FMA(KP414213562, T3Z, T46); + T5E = FNMS(KP414213562, T4e, T4l); + T5F = T5D + T5E; + T8I = T5E - T5D; + { + E T5k, T5L, T5v, T5K, T5j, T5u; + T5j = T5b + T5i; + T5k = FNMS(KP707106781, T5j, T54); + T5L = FMA(KP707106781, T5j, T54); + T5u = T5s + T5t; + T5v = FNMS(KP707106781, T5u, T5r); + T5K = FMA(KP707106781, T5u, T5r); + T5w = FNMS(KP668178637, T5v, T5k); + T5Q = FMA(KP198912367, T5K, T5L); + T5A = FMA(KP668178637, T5k, T5v); + T5M = FNMS(KP198912367, T5L, T5K); + } + { + E T4L, T5I, T4W, T5H, T4K, T4V; + T4K = T4C + T4J; + T4L = FNMS(KP707106781, T4K, T4v); + T5I = FMA(KP707106781, T4K, T4v); + T4V = T4T + T4U; + T4W = FNMS(KP707106781, T4V, T4S); + T5H = FMA(KP707106781, T4V, T4S); + T4X = FMA(KP668178637, T4W, T4L); + T5P = FNMS(KP198912367, T5H, T5I); + T5z = FNMS(KP668178637, T4L, T4W); + T5J = FMA(KP198912367, T5I, T5H); + } + } + { + E T4o, T5x, T8J, T8K; + T4o = FMA(KP923879532, T4n, T3S); + T5x = T4X - T5w; + ri[WS(rs, 21)] = FNMS(KP831469612, T5x, T4o); + ri[WS(rs, 5)] = FMA(KP831469612, T5x, T4o); + T8J = FMA(KP923879532, T8I, T8H); + T8K = T5A - T5z; + ii[WS(rs, 5)] = FMA(KP831469612, T8K, T8J); + ii[WS(rs, 21)] = FNMS(KP831469612, T8K, T8J); + } + { + E T5y, T5B, T8L, T8M; + T5y = FNMS(KP923879532, T4n, T3S); + T5B = T5z + T5A; + ri[WS(rs, 13)] = FNMS(KP831469612, T5B, T5y); + ri[WS(rs, 29)] = FMA(KP831469612, T5B, T5y); + T8L = FNMS(KP923879532, T8I, T8H); + T8M = T4X + T5w; + ii[WS(rs, 13)] = FNMS(KP831469612, T8M, T8L); + ii[WS(rs, 29)] = FMA(KP831469612, T8M, T8L); + } + { + E T5G, T5N, T8D, T8E; + T5G = FMA(KP923879532, T5F, T5C); + T5N = T5J + T5M; + ri[WS(rs, 17)] = FNMS(KP980785280, T5N, T5G); + ri[WS(rs, 1)] = FMA(KP980785280, T5N, T5G); + T8D = FMA(KP923879532, T8C, T8B); + T8E = T5P + T5Q; + ii[WS(rs, 1)] = FMA(KP980785280, T8E, T8D); + ii[WS(rs, 17)] = FNMS(KP980785280, T8E, T8D); + } + { + E T5O, T5R, T8F, T8G; + T5O = FNMS(KP923879532, T5F, T5C); + T5R = T5P - T5Q; + ri[WS(rs, 25)] = FNMS(KP980785280, T5R, T5O); + ri[WS(rs, 9)] = FMA(KP980785280, T5R, T5O); + T8F = FNMS(KP923879532, T8C, T8B); + T8G = T5M - T5J; + ii[WS(rs, 9)] = FMA(KP980785280, T8G, T8F); + ii[WS(rs, 25)] = FNMS(KP980785280, T8G, T8F); + } + } + { + E T5W, T6o, T63, T8W, T8P, T8V, T6r, T8Q, T6i, T6C, T6m, T6y, T6b, T6B, T6l; + E T6v; + { + E T5S, T5V, T6p, T6q; + T5S = T3w - T3B; + T5V = T5T - T5U; + T5W = FMA(KP707106781, T5V, T5S); + T6o = FNMS(KP707106781, T5V, T5S); + { + E T5Z, T62, T8N, T8O; + T5Z = FMA(KP414213562, T5Y, T5X); + T62 = FNMS(KP414213562, T61, T60); + T63 = T5Z - T62; + T8W = T5Z + T62; + T8N = T8y + T8x; + T8O = T3Q - T3J; + T8P = FMA(KP707106781, T8O, T8N); + T8V = FNMS(KP707106781, T8O, T8N); + } + T6p = FNMS(KP414213562, T5X, T5Y); + T6q = FMA(KP414213562, T60, T61); + T6r = T6p + T6q; + T8Q = T6q - T6p; + { + E T6e, T6x, T6h, T6w, T6d, T6g; + T6d = T5i - T5b; + T6e = FNMS(KP707106781, T6d, T6c); + T6x = FMA(KP707106781, T6d, T6c); + T6g = T5s - T5t; + T6h = FNMS(KP707106781, T6g, T6f); + T6w = FMA(KP707106781, T6g, T6f); + T6i = FNMS(KP668178637, T6h, T6e); + T6C = FMA(KP198912367, T6w, T6x); + T6m = FMA(KP668178637, T6e, T6h); + T6y = FNMS(KP198912367, T6x, T6w); + } + { + E T67, T6u, T6a, T6t, T66, T69; + T66 = T4J - T4C; + T67 = FNMS(KP707106781, T66, T65); + T6u = FMA(KP707106781, T66, T65); + T69 = T4T - T4U; + T6a = FNMS(KP707106781, T69, T68); + T6t = FMA(KP707106781, T69, T68); + T6b = FMA(KP668178637, T6a, T67); + T6B = FNMS(KP198912367, T6t, T6u); + T6l = FNMS(KP668178637, T67, T6a); + T6v = FMA(KP198912367, T6u, T6t); + } + } + { + E T64, T6j, T8R, T8S; + T64 = FMA(KP923879532, T63, T5W); + T6j = T6b + T6i; + ri[WS(rs, 19)] = FNMS(KP831469612, T6j, T64); + ri[WS(rs, 3)] = FMA(KP831469612, T6j, T64); + T8R = FMA(KP923879532, T8Q, T8P); + T8S = T6l + T6m; + ii[WS(rs, 3)] = FMA(KP831469612, T8S, T8R); + ii[WS(rs, 19)] = FNMS(KP831469612, T8S, T8R); + } + { + E T6k, T6n, T8T, T8U; + T6k = FNMS(KP923879532, T63, T5W); + T6n = T6l - T6m; + ri[WS(rs, 27)] = FNMS(KP831469612, T6n, T6k); + ri[WS(rs, 11)] = FMA(KP831469612, T6n, T6k); + T8T = FNMS(KP923879532, T8Q, T8P); + T8U = T6i - T6b; + ii[WS(rs, 11)] = FMA(KP831469612, T8U, T8T); + ii[WS(rs, 27)] = FNMS(KP831469612, T8U, T8T); + } + { + E T6s, T6z, T8X, T8Y; + T6s = FNMS(KP923879532, T6r, T6o); + T6z = T6v - T6y; + ri[WS(rs, 23)] = FNMS(KP980785280, T6z, T6s); + ri[WS(rs, 7)] = FMA(KP980785280, T6z, T6s); + T8X = FNMS(KP923879532, T8W, T8V); + T8Y = T6C - T6B; + ii[WS(rs, 7)] = FMA(KP980785280, T8Y, T8X); + ii[WS(rs, 23)] = FNMS(KP980785280, T8Y, T8X); + } + { + E T6A, T6D, T8Z, T90; + T6A = FMA(KP923879532, T6r, T6o); + T6D = T6B + T6C; + ri[WS(rs, 15)] = FNMS(KP980785280, T6D, T6A); + ri[WS(rs, 31)] = FMA(KP980785280, T6D, T6A); + T8Z = FMA(KP923879532, T8W, T8V); + T90 = T6v + T6y; + ii[WS(rs, 15)] = FNMS(KP980785280, T90, T8Z); + ii[WS(rs, 31)] = FMA(KP980785280, T90, T8Z); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 32}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 32, "t1_32", twinstr, &GENUS, {236, 62, 198, 0}, 0, 0, 0 }; + +void X(codelet_t1_32) (planner *p) { + X(kdft_dit_register) (p, t1_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 32 -name t1_32 -include dft/scalar/t.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 340 additions, 114 multiplications, 94 fused multiply/add), + * 96 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 62); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 62, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tj, T5F, T7C, T7Q, T35, T4T, T78, T7m, T1Q, T61, T5Y, T6J, T3K, T59, T41; + E T56, T2B, T67, T6e, T6O, T4b, T5d, T4s, T5g, TG, T7l, T5I, T73, T3a, T4U; + E T3f, T4V, T14, T5N, T5M, T6E, T3m, T4Y, T3r, T4Z, T1r, T5P, T5S, T6F, T3x; + E T51, T3C, T52, T2d, T5Z, T64, T6K, T3V, T57, T44, T5a, T2Y, T6f, T6a, T6P; + E T4m, T5h, T4v, T5e; + { + E T1, T76, T6, T75, Tc, T32, Th, T33; + T1 = ri[0]; + T76 = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 16)]; + T5 = ii[WS(rs, 16)]; + T2 = W[30]; + T4 = W[31]; + T6 = FMA(T2, T3, T4 * T5); + T75 = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 8)]; + Tb = ii[WS(rs, 8)]; + T8 = W[14]; + Ta = W[15]; + Tc = FMA(T8, T9, Ta * Tb); + T32 = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 24)]; + Tg = ii[WS(rs, 24)]; + Td = W[46]; + Tf = W[47]; + Th = FMA(Td, Te, Tf * Tg); + T33 = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, T7A, T7B; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 + Ti; + T5F = T7 - Ti; + T7A = T76 - T75; + T7B = Tc - Th; + T7C = T7A - T7B; + T7Q = T7B + T7A; + } + { + E T31, T34, T74, T77; + T31 = T1 - T6; + T34 = T32 - T33; + T35 = T31 - T34; + T4T = T31 + T34; + T74 = T32 + T33; + T77 = T75 + T76; + T78 = T74 + T77; + T7m = T77 - T74; + } + } + { + E T1y, T3G, T1O, T3Z, T1D, T3H, T1J, T3Y; + { + E T1v, T1x, T1u, T1w; + T1v = ri[WS(rs, 1)]; + T1x = ii[WS(rs, 1)]; + T1u = W[0]; + T1w = W[1]; + T1y = FMA(T1u, T1v, T1w * T1x); + T3G = FNMS(T1w, T1v, T1u * T1x); + } + { + E T1L, T1N, T1K, T1M; + T1L = ri[WS(rs, 25)]; + T1N = ii[WS(rs, 25)]; + T1K = W[48]; + T1M = W[49]; + T1O = FMA(T1K, T1L, T1M * T1N); + T3Z = FNMS(T1M, T1L, T1K * T1N); + } + { + E T1A, T1C, T1z, T1B; + T1A = ri[WS(rs, 17)]; + T1C = ii[WS(rs, 17)]; + T1z = W[32]; + T1B = W[33]; + T1D = FMA(T1z, T1A, T1B * T1C); + T3H = FNMS(T1B, T1A, T1z * T1C); + } + { + E T1G, T1I, T1F, T1H; + T1G = ri[WS(rs, 9)]; + T1I = ii[WS(rs, 9)]; + T1F = W[16]; + T1H = W[17]; + T1J = FMA(T1F, T1G, T1H * T1I); + T3Y = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1E, T1P, T5W, T5X; + T1E = T1y + T1D; + T1P = T1J + T1O; + T1Q = T1E + T1P; + T61 = T1E - T1P; + T5W = T3G + T3H; + T5X = T3Y + T3Z; + T5Y = T5W - T5X; + T6J = T5W + T5X; + } + { + E T3I, T3J, T3X, T40; + T3I = T3G - T3H; + T3J = T1J - T1O; + T3K = T3I + T3J; + T59 = T3I - T3J; + T3X = T1y - T1D; + T40 = T3Y - T3Z; + T41 = T3X - T40; + T56 = T3X + T40; + } + } + { + E T2j, T4o, T2z, T49, T2o, T4p, T2u, T48; + { + E T2g, T2i, T2f, T2h; + T2g = ri[WS(rs, 31)]; + T2i = ii[WS(rs, 31)]; + T2f = W[60]; + T2h = W[61]; + T2j = FMA(T2f, T2g, T2h * T2i); + T4o = FNMS(T2h, T2g, T2f * T2i); + } + { + E T2w, T2y, T2v, T2x; + T2w = ri[WS(rs, 23)]; + T2y = ii[WS(rs, 23)]; + T2v = W[44]; + T2x = W[45]; + T2z = FMA(T2v, T2w, T2x * T2y); + T49 = FNMS(T2x, T2w, T2v * T2y); + } + { + E T2l, T2n, T2k, T2m; + T2l = ri[WS(rs, 15)]; + T2n = ii[WS(rs, 15)]; + T2k = W[28]; + T2m = W[29]; + T2o = FMA(T2k, T2l, T2m * T2n); + T4p = FNMS(T2m, T2l, T2k * T2n); + } + { + E T2r, T2t, T2q, T2s; + T2r = ri[WS(rs, 7)]; + T2t = ii[WS(rs, 7)]; + T2q = W[12]; + T2s = W[13]; + T2u = FMA(T2q, T2r, T2s * T2t); + T48 = FNMS(T2s, T2r, T2q * T2t); + } + { + E T2p, T2A, T6c, T6d; + T2p = T2j + T2o; + T2A = T2u + T2z; + T2B = T2p + T2A; + T67 = T2p - T2A; + T6c = T4o + T4p; + T6d = T48 + T49; + T6e = T6c - T6d; + T6O = T6c + T6d; + } + { + E T47, T4a, T4q, T4r; + T47 = T2j - T2o; + T4a = T48 - T49; + T4b = T47 - T4a; + T5d = T47 + T4a; + T4q = T4o - T4p; + T4r = T2u - T2z; + T4s = T4q + T4r; + T5g = T4q - T4r; + } + } + { + E To, T36, TE, T3d, Tt, T37, Tz, T3c; + { + E Tl, Tn, Tk, Tm; + Tl = ri[WS(rs, 4)]; + Tn = ii[WS(rs, 4)]; + Tk = W[6]; + Tm = W[7]; + To = FMA(Tk, Tl, Tm * Tn); + T36 = FNMS(Tm, Tl, Tk * Tn); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 12)]; + TD = ii[WS(rs, 12)]; + TA = W[22]; + TC = W[23]; + TE = FMA(TA, TB, TC * TD); + T3d = FNMS(TC, TB, TA * TD); + } + { + E Tq, Ts, Tp, Tr; + Tq = ri[WS(rs, 20)]; + Ts = ii[WS(rs, 20)]; + Tp = W[38]; + Tr = W[39]; + Tt = FMA(Tp, Tq, Tr * Ts); + T37 = FNMS(Tr, Tq, Tp * Ts); + } + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 28)]; + Ty = ii[WS(rs, 28)]; + Tv = W[54]; + Tx = W[55]; + Tz = FMA(Tv, Tw, Tx * Ty); + T3c = FNMS(Tx, Tw, Tv * Ty); + } + { + E Tu, TF, T5G, T5H; + Tu = To + Tt; + TF = Tz + TE; + TG = Tu + TF; + T7l = TF - Tu; + T5G = T36 + T37; + T5H = T3c + T3d; + T5I = T5G - T5H; + T73 = T5G + T5H; + } + { + E T38, T39, T3b, T3e; + T38 = T36 - T37; + T39 = To - Tt; + T3a = T38 - T39; + T4U = T39 + T38; + T3b = Tz - TE; + T3e = T3c - T3d; + T3f = T3b + T3e; + T4V = T3b - T3e; + } + } + { + E TM, T3i, T12, T3p, TR, T3j, TX, T3o; + { + E TJ, TL, TI, TK; + TJ = ri[WS(rs, 2)]; + TL = ii[WS(rs, 2)]; + TI = W[2]; + TK = W[3]; + TM = FMA(TI, TJ, TK * TL); + T3i = FNMS(TK, TJ, TI * TL); + } + { + E TZ, T11, TY, T10; + TZ = ri[WS(rs, 26)]; + T11 = ii[WS(rs, 26)]; + TY = W[50]; + T10 = W[51]; + T12 = FMA(TY, TZ, T10 * T11); + T3p = FNMS(T10, TZ, TY * T11); + } + { + E TO, TQ, TN, TP; + TO = ri[WS(rs, 18)]; + TQ = ii[WS(rs, 18)]; + TN = W[34]; + TP = W[35]; + TR = FMA(TN, TO, TP * TQ); + T3j = FNMS(TP, TO, TN * TQ); + } + { + E TU, TW, TT, TV; + TU = ri[WS(rs, 10)]; + TW = ii[WS(rs, 10)]; + TT = W[18]; + TV = W[19]; + TX = FMA(TT, TU, TV * TW); + T3o = FNMS(TV, TU, TT * TW); + } + { + E TS, T13, T5K, T5L; + TS = TM + TR; + T13 = TX + T12; + T14 = TS + T13; + T5N = TS - T13; + T5K = T3i + T3j; + T5L = T3o + T3p; + T5M = T5K - T5L; + T6E = T5K + T5L; + } + { + E T3k, T3l, T3n, T3q; + T3k = T3i - T3j; + T3l = TX - T12; + T3m = T3k + T3l; + T4Y = T3k - T3l; + T3n = TM - TR; + T3q = T3o - T3p; + T3r = T3n - T3q; + T4Z = T3n + T3q; + } + } + { + E T19, T3t, T1p, T3A, T1e, T3u, T1k, T3z; + { + E T16, T18, T15, T17; + T16 = ri[WS(rs, 30)]; + T18 = ii[WS(rs, 30)]; + T15 = W[58]; + T17 = W[59]; + T19 = FMA(T15, T16, T17 * T18); + T3t = FNMS(T17, T16, T15 * T18); + } + { + E T1m, T1o, T1l, T1n; + T1m = ri[WS(rs, 22)]; + T1o = ii[WS(rs, 22)]; + T1l = W[42]; + T1n = W[43]; + T1p = FMA(T1l, T1m, T1n * T1o); + T3A = FNMS(T1n, T1m, T1l * T1o); + } + { + E T1b, T1d, T1a, T1c; + T1b = ri[WS(rs, 14)]; + T1d = ii[WS(rs, 14)]; + T1a = W[26]; + T1c = W[27]; + T1e = FMA(T1a, T1b, T1c * T1d); + T3u = FNMS(T1c, T1b, T1a * T1d); + } + { + E T1h, T1j, T1g, T1i; + T1h = ri[WS(rs, 6)]; + T1j = ii[WS(rs, 6)]; + T1g = W[10]; + T1i = W[11]; + T1k = FMA(T1g, T1h, T1i * T1j); + T3z = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1f, T1q, T5Q, T5R; + T1f = T19 + T1e; + T1q = T1k + T1p; + T1r = T1f + T1q; + T5P = T1f - T1q; + T5Q = T3t + T3u; + T5R = T3z + T3A; + T5S = T5Q - T5R; + T6F = T5Q + T5R; + } + { + E T3v, T3w, T3y, T3B; + T3v = T3t - T3u; + T3w = T1k - T1p; + T3x = T3v + T3w; + T51 = T3v - T3w; + T3y = T19 - T1e; + T3B = T3z - T3A; + T3C = T3y - T3B; + T52 = T3y + T3B; + } + } + { + E T1V, T3R, T20, T3S, T3Q, T3T, T26, T3M, T2b, T3N, T3L, T3O; + { + E T1S, T1U, T1R, T1T; + T1S = ri[WS(rs, 5)]; + T1U = ii[WS(rs, 5)]; + T1R = W[8]; + T1T = W[9]; + T1V = FMA(T1R, T1S, T1T * T1U); + T3R = FNMS(T1T, T1S, T1R * T1U); + } + { + E T1X, T1Z, T1W, T1Y; + T1X = ri[WS(rs, 21)]; + T1Z = ii[WS(rs, 21)]; + T1W = W[40]; + T1Y = W[41]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T3S = FNMS(T1Y, T1X, T1W * T1Z); + } + T3Q = T1V - T20; + T3T = T3R - T3S; + { + E T23, T25, T22, T24; + T23 = ri[WS(rs, 29)]; + T25 = ii[WS(rs, 29)]; + T22 = W[56]; + T24 = W[57]; + T26 = FMA(T22, T23, T24 * T25); + T3M = FNMS(T24, T23, T22 * T25); + } + { + E T28, T2a, T27, T29; + T28 = ri[WS(rs, 13)]; + T2a = ii[WS(rs, 13)]; + T27 = W[24]; + T29 = W[25]; + T2b = FMA(T27, T28, T29 * T2a); + T3N = FNMS(T29, T28, T27 * T2a); + } + T3L = T26 - T2b; + T3O = T3M - T3N; + { + E T21, T2c, T62, T63; + T21 = T1V + T20; + T2c = T26 + T2b; + T2d = T21 + T2c; + T5Z = T2c - T21; + T62 = T3R + T3S; + T63 = T3M + T3N; + T64 = T62 - T63; + T6K = T62 + T63; + } + { + E T3P, T3U, T42, T43; + T3P = T3L - T3O; + T3U = T3Q + T3T; + T3V = KP707106781 * (T3P - T3U); + T57 = KP707106781 * (T3U + T3P); + T42 = T3T - T3Q; + T43 = T3L + T3O; + T44 = KP707106781 * (T42 - T43); + T5a = KP707106781 * (T42 + T43); + } + } + { + E T2G, T4c, T2L, T4d, T4e, T4f, T2R, T4i, T2W, T4j, T4h, T4k; + { + E T2D, T2F, T2C, T2E; + T2D = ri[WS(rs, 3)]; + T2F = ii[WS(rs, 3)]; + T2C = W[4]; + T2E = W[5]; + T2G = FMA(T2C, T2D, T2E * T2F); + T4c = FNMS(T2E, T2D, T2C * T2F); + } + { + E T2I, T2K, T2H, T2J; + T2I = ri[WS(rs, 19)]; + T2K = ii[WS(rs, 19)]; + T2H = W[36]; + T2J = W[37]; + T2L = FMA(T2H, T2I, T2J * T2K); + T4d = FNMS(T2J, T2I, T2H * T2K); + } + T4e = T4c - T4d; + T4f = T2G - T2L; + { + E T2O, T2Q, T2N, T2P; + T2O = ri[WS(rs, 27)]; + T2Q = ii[WS(rs, 27)]; + T2N = W[52]; + T2P = W[53]; + T2R = FMA(T2N, T2O, T2P * T2Q); + T4i = FNMS(T2P, T2O, T2N * T2Q); + } + { + E T2T, T2V, T2S, T2U; + T2T = ri[WS(rs, 11)]; + T2V = ii[WS(rs, 11)]; + T2S = W[20]; + T2U = W[21]; + T2W = FMA(T2S, T2T, T2U * T2V); + T4j = FNMS(T2U, T2T, T2S * T2V); + } + T4h = T2R - T2W; + T4k = T4i - T4j; + { + E T2M, T2X, T68, T69; + T2M = T2G + T2L; + T2X = T2R + T2W; + T2Y = T2M + T2X; + T6f = T2X - T2M; + T68 = T4c + T4d; + T69 = T4i + T4j; + T6a = T68 - T69; + T6P = T68 + T69; + } + { + E T4g, T4l, T4t, T4u; + T4g = T4e - T4f; + T4l = T4h + T4k; + T4m = KP707106781 * (T4g - T4l); + T5h = KP707106781 * (T4g + T4l); + T4t = T4h - T4k; + T4u = T4f + T4e; + T4v = KP707106781 * (T4t - T4u); + T5e = KP707106781 * (T4u + T4t); + } + } + { + E T1t, T6X, T7a, T7c, T30, T7b, T70, T71; + { + E TH, T1s, T72, T79; + TH = Tj + TG; + T1s = T14 + T1r; + T1t = TH + T1s; + T6X = TH - T1s; + T72 = T6E + T6F; + T79 = T73 + T78; + T7a = T72 + T79; + T7c = T79 - T72; + } + { + E T2e, T2Z, T6Y, T6Z; + T2e = T1Q + T2d; + T2Z = T2B + T2Y; + T30 = T2e + T2Z; + T7b = T2Z - T2e; + T6Y = T6J + T6K; + T6Z = T6O + T6P; + T70 = T6Y - T6Z; + T71 = T6Y + T6Z; + } + ri[WS(rs, 16)] = T1t - T30; + ii[WS(rs, 16)] = T7a - T71; + ri[0] = T1t + T30; + ii[0] = T71 + T7a; + ri[WS(rs, 24)] = T6X - T70; + ii[WS(rs, 24)] = T7c - T7b; + ri[WS(rs, 8)] = T6X + T70; + ii[WS(rs, 8)] = T7b + T7c; + } + { + E T6H, T6T, T7g, T7i, T6M, T6U, T6R, T6V; + { + E T6D, T6G, T7e, T7f; + T6D = Tj - TG; + T6G = T6E - T6F; + T6H = T6D + T6G; + T6T = T6D - T6G; + T7e = T1r - T14; + T7f = T78 - T73; + T7g = T7e + T7f; + T7i = T7f - T7e; + } + { + E T6I, T6L, T6N, T6Q; + T6I = T1Q - T2d; + T6L = T6J - T6K; + T6M = T6I + T6L; + T6U = T6L - T6I; + T6N = T2B - T2Y; + T6Q = T6O - T6P; + T6R = T6N - T6Q; + T6V = T6N + T6Q; + } + { + E T6S, T7d, T6W, T7h; + T6S = KP707106781 * (T6M + T6R); + ri[WS(rs, 20)] = T6H - T6S; + ri[WS(rs, 4)] = T6H + T6S; + T7d = KP707106781 * (T6U + T6V); + ii[WS(rs, 4)] = T7d + T7g; + ii[WS(rs, 20)] = T7g - T7d; + T6W = KP707106781 * (T6U - T6V); + ri[WS(rs, 28)] = T6T - T6W; + ri[WS(rs, 12)] = T6T + T6W; + T7h = KP707106781 * (T6R - T6M); + ii[WS(rs, 12)] = T7h + T7i; + ii[WS(rs, 28)] = T7i - T7h; + } + } + { + E T5J, T7n, T7t, T6n, T5U, T7k, T6x, T6B, T6q, T7s, T66, T6k, T6u, T6A, T6h; + E T6l; + { + E T5O, T5T, T60, T65; + T5J = T5F - T5I; + T7n = T7l + T7m; + T7t = T7m - T7l; + T6n = T5F + T5I; + T5O = T5M - T5N; + T5T = T5P + T5S; + T5U = KP707106781 * (T5O - T5T); + T7k = KP707106781 * (T5O + T5T); + { + E T6v, T6w, T6o, T6p; + T6v = T67 + T6a; + T6w = T6e + T6f; + T6x = FNMS(KP382683432, T6w, KP923879532 * T6v); + T6B = FMA(KP923879532, T6w, KP382683432 * T6v); + T6o = T5N + T5M; + T6p = T5P - T5S; + T6q = KP707106781 * (T6o + T6p); + T7s = KP707106781 * (T6p - T6o); + } + T60 = T5Y - T5Z; + T65 = T61 - T64; + T66 = FMA(KP923879532, T60, KP382683432 * T65); + T6k = FNMS(KP923879532, T65, KP382683432 * T60); + { + E T6s, T6t, T6b, T6g; + T6s = T5Y + T5Z; + T6t = T61 + T64; + T6u = FMA(KP382683432, T6s, KP923879532 * T6t); + T6A = FNMS(KP382683432, T6t, KP923879532 * T6s); + T6b = T67 - T6a; + T6g = T6e - T6f; + T6h = FNMS(KP923879532, T6g, KP382683432 * T6b); + T6l = FMA(KP382683432, T6g, KP923879532 * T6b); + } + } + { + E T5V, T6i, T7r, T7u; + T5V = T5J + T5U; + T6i = T66 + T6h; + ri[WS(rs, 22)] = T5V - T6i; + ri[WS(rs, 6)] = T5V + T6i; + T7r = T6k + T6l; + T7u = T7s + T7t; + ii[WS(rs, 6)] = T7r + T7u; + ii[WS(rs, 22)] = T7u - T7r; + } + { + E T6j, T6m, T7v, T7w; + T6j = T5J - T5U; + T6m = T6k - T6l; + ri[WS(rs, 30)] = T6j - T6m; + ri[WS(rs, 14)] = T6j + T6m; + T7v = T6h - T66; + T7w = T7t - T7s; + ii[WS(rs, 14)] = T7v + T7w; + ii[WS(rs, 30)] = T7w - T7v; + } + { + E T6r, T6y, T7j, T7o; + T6r = T6n + T6q; + T6y = T6u + T6x; + ri[WS(rs, 18)] = T6r - T6y; + ri[WS(rs, 2)] = T6r + T6y; + T7j = T6A + T6B; + T7o = T7k + T7n; + ii[WS(rs, 2)] = T7j + T7o; + ii[WS(rs, 18)] = T7o - T7j; + } + { + E T6z, T6C, T7p, T7q; + T6z = T6n - T6q; + T6C = T6A - T6B; + ri[WS(rs, 26)] = T6z - T6C; + ri[WS(rs, 10)] = T6z + T6C; + T7p = T6x - T6u; + T7q = T7n - T7k; + ii[WS(rs, 10)] = T7p + T7q; + ii[WS(rs, 26)] = T7q - T7p; + } + } + { + E T3h, T4D, T7R, T7X, T3E, T7O, T4N, T4R, T46, T4A, T4G, T7W, T4K, T4Q, T4x; + E T4B, T3g, T7P; + T3g = KP707106781 * (T3a - T3f); + T3h = T35 - T3g; + T4D = T35 + T3g; + T7P = KP707106781 * (T4V - T4U); + T7R = T7P + T7Q; + T7X = T7Q - T7P; + { + E T3s, T3D, T4L, T4M; + T3s = FNMS(KP923879532, T3r, KP382683432 * T3m); + T3D = FMA(KP382683432, T3x, KP923879532 * T3C); + T3E = T3s - T3D; + T7O = T3s + T3D; + T4L = T4b + T4m; + T4M = T4s + T4v; + T4N = FNMS(KP555570233, T4M, KP831469612 * T4L); + T4R = FMA(KP831469612, T4M, KP555570233 * T4L); + } + { + E T3W, T45, T4E, T4F; + T3W = T3K - T3V; + T45 = T41 - T44; + T46 = FMA(KP980785280, T3W, KP195090322 * T45); + T4A = FNMS(KP980785280, T45, KP195090322 * T3W); + T4E = FMA(KP923879532, T3m, KP382683432 * T3r); + T4F = FNMS(KP923879532, T3x, KP382683432 * T3C); + T4G = T4E + T4F; + T7W = T4F - T4E; + } + { + E T4I, T4J, T4n, T4w; + T4I = T3K + T3V; + T4J = T41 + T44; + T4K = FMA(KP555570233, T4I, KP831469612 * T4J); + T4Q = FNMS(KP555570233, T4J, KP831469612 * T4I); + T4n = T4b - T4m; + T4w = T4s - T4v; + T4x = FNMS(KP980785280, T4w, KP195090322 * T4n); + T4B = FMA(KP195090322, T4w, KP980785280 * T4n); + } + { + E T3F, T4y, T7V, T7Y; + T3F = T3h + T3E; + T4y = T46 + T4x; + ri[WS(rs, 23)] = T3F - T4y; + ri[WS(rs, 7)] = T3F + T4y; + T7V = T4A + T4B; + T7Y = T7W + T7X; + ii[WS(rs, 7)] = T7V + T7Y; + ii[WS(rs, 23)] = T7Y - T7V; + } + { + E T4z, T4C, T7Z, T80; + T4z = T3h - T3E; + T4C = T4A - T4B; + ri[WS(rs, 31)] = T4z - T4C; + ri[WS(rs, 15)] = T4z + T4C; + T7Z = T4x - T46; + T80 = T7X - T7W; + ii[WS(rs, 15)] = T7Z + T80; + ii[WS(rs, 31)] = T80 - T7Z; + } + { + E T4H, T4O, T7N, T7S; + T4H = T4D + T4G; + T4O = T4K + T4N; + ri[WS(rs, 19)] = T4H - T4O; + ri[WS(rs, 3)] = T4H + T4O; + T7N = T4Q + T4R; + T7S = T7O + T7R; + ii[WS(rs, 3)] = T7N + T7S; + ii[WS(rs, 19)] = T7S - T7N; + } + { + E T4P, T4S, T7T, T7U; + T4P = T4D - T4G; + T4S = T4Q - T4R; + ri[WS(rs, 27)] = T4P - T4S; + ri[WS(rs, 11)] = T4P + T4S; + T7T = T4N - T4K; + T7U = T7R - T7O; + ii[WS(rs, 11)] = T7T + T7U; + ii[WS(rs, 27)] = T7U - T7T; + } + } + { + E T4X, T5p, T7D, T7J, T54, T7y, T5z, T5D, T5c, T5m, T5s, T7I, T5w, T5C, T5j; + E T5n, T4W, T7z; + T4W = KP707106781 * (T4U + T4V); + T4X = T4T - T4W; + T5p = T4T + T4W; + T7z = KP707106781 * (T3a + T3f); + T7D = T7z + T7C; + T7J = T7C - T7z; + { + E T50, T53, T5x, T5y; + T50 = FNMS(KP382683432, T4Z, KP923879532 * T4Y); + T53 = FMA(KP923879532, T51, KP382683432 * T52); + T54 = T50 - T53; + T7y = T50 + T53; + T5x = T5d + T5e; + T5y = T5g + T5h; + T5z = FNMS(KP195090322, T5y, KP980785280 * T5x); + T5D = FMA(KP195090322, T5x, KP980785280 * T5y); + } + { + E T58, T5b, T5q, T5r; + T58 = T56 - T57; + T5b = T59 - T5a; + T5c = FMA(KP555570233, T58, KP831469612 * T5b); + T5m = FNMS(KP831469612, T58, KP555570233 * T5b); + T5q = FMA(KP382683432, T4Y, KP923879532 * T4Z); + T5r = FNMS(KP382683432, T51, KP923879532 * T52); + T5s = T5q + T5r; + T7I = T5r - T5q; + } + { + E T5u, T5v, T5f, T5i; + T5u = T56 + T57; + T5v = T59 + T5a; + T5w = FMA(KP980785280, T5u, KP195090322 * T5v); + T5C = FNMS(KP195090322, T5u, KP980785280 * T5v); + T5f = T5d - T5e; + T5i = T5g - T5h; + T5j = FNMS(KP831469612, T5i, KP555570233 * T5f); + T5n = FMA(KP831469612, T5f, KP555570233 * T5i); + } + { + E T55, T5k, T7H, T7K; + T55 = T4X + T54; + T5k = T5c + T5j; + ri[WS(rs, 21)] = T55 - T5k; + ri[WS(rs, 5)] = T55 + T5k; + T7H = T5m + T5n; + T7K = T7I + T7J; + ii[WS(rs, 5)] = T7H + T7K; + ii[WS(rs, 21)] = T7K - T7H; + } + { + E T5l, T5o, T7L, T7M; + T5l = T4X - T54; + T5o = T5m - T5n; + ri[WS(rs, 29)] = T5l - T5o; + ri[WS(rs, 13)] = T5l + T5o; + T7L = T5j - T5c; + T7M = T7J - T7I; + ii[WS(rs, 13)] = T7L + T7M; + ii[WS(rs, 29)] = T7M - T7L; + } + { + E T5t, T5A, T7x, T7E; + T5t = T5p + T5s; + T5A = T5w + T5z; + ri[WS(rs, 17)] = T5t - T5A; + ri[WS(rs, 1)] = T5t + T5A; + T7x = T5C + T5D; + T7E = T7y + T7D; + ii[WS(rs, 1)] = T7x + T7E; + ii[WS(rs, 17)] = T7E - T7x; + } + { + E T5B, T5E, T7F, T7G; + T5B = T5p - T5s; + T5E = T5C - T5D; + ri[WS(rs, 25)] = T5B - T5E; + ri[WS(rs, 9)] = T5B + T5E; + T7F = T5z - T5w; + T7G = T7D - T7y; + ii[WS(rs, 9)] = T7F + T7G; + ii[WS(rs, 25)] = T7G - T7F; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 32}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 32, "t1_32", twinstr, &GENUS, {340, 114, 94, 0}, 0, 0, 0 }; + +void X(codelet_t1_32) (planner *p) { + X(kdft_dit_register) (p, t1_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_4.c new file mode 100644 index 000000000..5a25e8303 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_4.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -name t1_4 -include dft/scalar/t.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, Tv, T7, Tu, Te, To, Tk, Tq; + T1 = ri[0]; + Tv = ii[0]; + { + E T3, T6, T4, Tt, T2, T5; + T3 = ri[WS(rs, 2)]; + T6 = ii[WS(rs, 2)]; + T2 = W[2]; + T4 = T2 * T3; + Tt = T2 * T6; + T5 = W[3]; + T7 = FMA(T5, T6, T4); + Tu = FNMS(T5, T3, Tt); + } + { + E Ta, Td, Tb, Tn, T9, Tc; + Ta = ri[WS(rs, 1)]; + Td = ii[WS(rs, 1)]; + T9 = W[0]; + Tb = T9 * Ta; + Tn = T9 * Td; + Tc = W[1]; + Te = FMA(Tc, Td, Tb); + To = FNMS(Tc, Ta, Tn); + } + { + E Tg, Tj, Th, Tp, Tf, Ti; + Tg = ri[WS(rs, 3)]; + Tj = ii[WS(rs, 3)]; + Tf = W[4]; + Th = Tf * Tg; + Tp = Tf * Tj; + Ti = W[5]; + Tk = FMA(Ti, Tj, Th); + Tq = FNMS(Ti, Tg, Tp); + } + { + E T8, Tl, Ts, Tw; + T8 = T1 + T7; + Tl = Te + Tk; + ri[WS(rs, 2)] = T8 - Tl; + ri[0] = T8 + Tl; + Ts = To + Tq; + Tw = Tu + Tv; + ii[0] = Ts + Tw; + ii[WS(rs, 2)] = Tw - Ts; + } + { + E Tm, Tr, Tx, Ty; + Tm = T1 - T7; + Tr = To - Tq; + ri[WS(rs, 3)] = Tm - Tr; + ri[WS(rs, 1)] = Tm + Tr; + Tx = Tv - Tu; + Ty = Te - Tk; + ii[WS(rs, 1)] = Tx - Ty; + ii[WS(rs, 3)] = Ty + Tx; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 4}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 4, "t1_4", twinstr, &GENUS, {16, 6, 6, 0}, 0, 0, 0 }; + +void X(codelet_t1_4) (planner *p) { + X(kdft_dit_register) (p, t1_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 4 -name t1_4 -include dft/scalar/t.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, Tp, T6, To, Tc, Tk, Th, Tl; + T1 = ri[0]; + Tp = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 2)]; + T5 = ii[WS(rs, 2)]; + T2 = W[2]; + T4 = W[3]; + T6 = FMA(T2, T3, T4 * T5); + To = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 1)]; + Tb = ii[WS(rs, 1)]; + T8 = W[0]; + Ta = W[1]; + Tc = FMA(T8, T9, Ta * Tb); + Tk = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 3)]; + Tg = ii[WS(rs, 3)]; + Td = W[4]; + Tf = W[5]; + Th = FMA(Td, Te, Tf * Tg); + Tl = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, Tn, Tq; + T7 = T1 + T6; + Ti = Tc + Th; + ri[WS(rs, 2)] = T7 - Ti; + ri[0] = T7 + Ti; + Tn = Tk + Tl; + Tq = To + Tp; + ii[0] = Tn + Tq; + ii[WS(rs, 2)] = Tq - Tn; + } + { + E Tj, Tm, Tr, Ts; + Tj = T1 - T6; + Tm = Tk - Tl; + ri[WS(rs, 3)] = Tj - Tm; + ri[WS(rs, 1)] = Tj + Tm; + Tr = Tp - To; + Ts = Tc - Th; + ii[WS(rs, 1)] = Tr - Ts; + ii[WS(rs, 3)] = Ts + Tr; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 4}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 4, "t1_4", twinstr, &GENUS, {16, 6, 6, 0}, 0, 0, 0 }; + +void X(codelet_t1_4) (planner *p) { + X(kdft_dit_register) (p, t1_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_5.c new file mode 100644 index 000000000..e833bcbdf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_5.c @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 5 -name t1_5 -include dft/scalar/t.h */ + +/* + * This function contains 40 FP additions, 34 FP multiplications, + * (or, 14 additions, 8 multiplications, 26 fused multiply/add), + * 31 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs)) { + E T1, TM, T7, Tx, Td, Tz, Te, TJ, Tk, TC, Tq, TE, Tr, TK; + T1 = ri[0]; + TM = ii[0]; + { + E T3, T6, T4, Tw, T9, Tc, Ta, Ty, T2, T8, T5, Tb; + T3 = ri[WS(rs, 1)]; + T6 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + Tw = T2 * T6; + T9 = ri[WS(rs, 4)]; + Tc = ii[WS(rs, 4)]; + T8 = W[6]; + Ta = T8 * T9; + Ty = T8 * Tc; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Tx = FNMS(T5, T3, Tw); + Tb = W[7]; + Td = FMA(Tb, Tc, Ta); + Tz = FNMS(Tb, T9, Ty); + Te = T7 + Td; + TJ = Tx + Tz; + } + { + E Tg, Tj, Th, TB, Tm, Tp, Tn, TD, Tf, Tl, Ti, To; + Tg = ri[WS(rs, 2)]; + Tj = ii[WS(rs, 2)]; + Tf = W[2]; + Th = Tf * Tg; + TB = Tf * Tj; + Tm = ri[WS(rs, 3)]; + Tp = ii[WS(rs, 3)]; + Tl = W[4]; + Tn = Tl * Tm; + TD = Tl * Tp; + Ti = W[3]; + Tk = FMA(Ti, Tj, Th); + TC = FNMS(Ti, Tg, TB); + To = W[5]; + Tq = FMA(To, Tp, Tn); + TE = FNMS(To, Tm, TD); + Tr = Tk + Tq; + TK = TC + TE; + } + { + E Tu, Ts, Tt, TG, TI, TA, TF, TH, Tv; + Tu = Te - Tr; + Ts = Te + Tr; + Tt = FNMS(KP250000000, Ts, T1); + TA = Tx - Tz; + TF = TC - TE; + TG = FMA(KP618033988, TF, TA); + TI = FNMS(KP618033988, TA, TF); + ri[0] = T1 + Ts; + TH = FNMS(KP559016994, Tu, Tt); + ri[WS(rs, 2)] = FNMS(KP951056516, TI, TH); + ri[WS(rs, 3)] = FMA(KP951056516, TI, TH); + Tv = FMA(KP559016994, Tu, Tt); + ri[WS(rs, 4)] = FNMS(KP951056516, TG, Tv); + ri[WS(rs, 1)] = FMA(KP951056516, TG, Tv); + } + { + E TO, TL, TN, TS, TU, TQ, TR, TT, TP; + TO = TJ - TK; + TL = TJ + TK; + TN = FNMS(KP250000000, TL, TM); + TQ = T7 - Td; + TR = Tk - Tq; + TS = FMA(KP618033988, TR, TQ); + TU = FNMS(KP618033988, TQ, TR); + ii[0] = TL + TM; + TT = FNMS(KP559016994, TO, TN); + ii[WS(rs, 2)] = FMA(KP951056516, TU, TT); + ii[WS(rs, 3)] = FNMS(KP951056516, TU, TT); + TP = FMA(KP559016994, TO, TN); + ii[WS(rs, 1)] = FNMS(KP951056516, TS, TP); + ii[WS(rs, 4)] = FMA(KP951056516, TS, TP); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 5}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 5, "t1_5", twinstr, &GENUS, {14, 8, 26, 0}, 0, 0, 0 }; + +void X(codelet_t1_5) (planner *p) { + X(kdft_dit_register) (p, t1_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 5 -name t1_5 -include dft/scalar/t.h */ + +/* + * This function contains 40 FP additions, 28 FP multiplications, + * (or, 26 additions, 14 multiplications, 14 fused multiply/add), + * 29 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs)) { + E T1, TE, Tu, Tx, TJ, TI, TB, TC, TD, Tc, Tn, To; + T1 = ri[0]; + TE = ii[0]; + { + E T6, Ts, Tm, Tw, Tb, Tt, Th, Tv; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 1)]; + T5 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + Ts = FNMS(T4, T3, T2 * T5); + } + { + E Tj, Tl, Ti, Tk; + Tj = ri[WS(rs, 3)]; + Tl = ii[WS(rs, 3)]; + Ti = W[4]; + Tk = W[5]; + Tm = FMA(Ti, Tj, Tk * Tl); + Tw = FNMS(Tk, Tj, Ti * Tl); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 4)]; + Ta = ii[WS(rs, 4)]; + T7 = W[6]; + T9 = W[7]; + Tb = FMA(T7, T8, T9 * Ta); + Tt = FNMS(T9, T8, T7 * Ta); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 2)]; + Tg = ii[WS(rs, 2)]; + Td = W[2]; + Tf = W[3]; + Th = FMA(Td, Te, Tf * Tg); + Tv = FNMS(Tf, Te, Td * Tg); + } + Tu = Ts - Tt; + Tx = Tv - Tw; + TJ = Th - Tm; + TI = T6 - Tb; + TB = Ts + Tt; + TC = Tv + Tw; + TD = TB + TC; + Tc = T6 + Tb; + Tn = Th + Tm; + To = Tc + Tn; + } + ri[0] = T1 + To; + ii[0] = TD + TE; + { + E Ty, TA, Tr, Tz, Tp, Tq; + Ty = FMA(KP951056516, Tu, KP587785252 * Tx); + TA = FNMS(KP587785252, Tu, KP951056516 * Tx); + Tp = KP559016994 * (Tc - Tn); + Tq = FNMS(KP250000000, To, T1); + Tr = Tp + Tq; + Tz = Tq - Tp; + ri[WS(rs, 4)] = Tr - Ty; + ri[WS(rs, 3)] = Tz + TA; + ri[WS(rs, 1)] = Tr + Ty; + ri[WS(rs, 2)] = Tz - TA; + } + { + E TK, TL, TH, TM, TF, TG; + TK = FMA(KP951056516, TI, KP587785252 * TJ); + TL = FNMS(KP587785252, TI, KP951056516 * TJ); + TF = KP559016994 * (TB - TC); + TG = FNMS(KP250000000, TD, TE); + TH = TF + TG; + TM = TG - TF; + ii[WS(rs, 1)] = TH - TK; + ii[WS(rs, 3)] = TM - TL; + ii[WS(rs, 4)] = TK + TH; + ii[WS(rs, 2)] = TL + TM; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 5}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 5, "t1_5", twinstr, &GENUS, {26, 14, 14, 0}, 0, 0, 0 }; + +void X(codelet_t1_5) (planner *p) { + X(kdft_dit_register) (p, t1_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_6.c new file mode 100644 index 000000000..b596b7613 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_6.c @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -name t1_6 -include dft/scalar/t.h */ + +/* + * This function contains 46 FP additions, 32 FP multiplications, + * (or, 24 additions, 10 multiplications, 22 fused multiply/add), + * 31 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 10); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs)) { + E T1, TX, T7, TW, Tl, TR, TB, TJ, Ty, TS, TC, TO; + T1 = ri[0]; + TX = ii[0]; + { + E T3, T6, T4, TV, T2, T5; + T3 = ri[WS(rs, 3)]; + T6 = ii[WS(rs, 3)]; + T2 = W[4]; + T4 = T2 * T3; + TV = T2 * T6; + T5 = W[5]; + T7 = FMA(T5, T6, T4); + TW = FNMS(T5, T3, TV); + } + { + E Ta, Td, Tb, TF, Tg, Tj, Th, TH, T9, Tf; + Ta = ri[WS(rs, 2)]; + Td = ii[WS(rs, 2)]; + T9 = W[2]; + Tb = T9 * Ta; + TF = T9 * Td; + Tg = ri[WS(rs, 5)]; + Tj = ii[WS(rs, 5)]; + Tf = W[8]; + Th = Tf * Tg; + TH = Tf * Tj; + { + E Te, TG, Tk, TI, Tc, Ti; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + TG = FNMS(Tc, Ta, TF); + Ti = W[9]; + Tk = FMA(Ti, Tj, Th); + TI = FNMS(Ti, Tg, TH); + Tl = Te - Tk; + TR = TG + TI; + TB = Te + Tk; + TJ = TG - TI; + } + } + { + E Tn, Tq, To, TK, Tt, Tw, Tu, TM, Tm, Ts; + Tn = ri[WS(rs, 4)]; + Tq = ii[WS(rs, 4)]; + Tm = W[6]; + To = Tm * Tn; + TK = Tm * Tq; + Tt = ri[WS(rs, 1)]; + Tw = ii[WS(rs, 1)]; + Ts = W[0]; + Tu = Ts * Tt; + TM = Ts * Tw; + { + E Tr, TL, Tx, TN, Tp, Tv; + Tp = W[7]; + Tr = FMA(Tp, Tq, To); + TL = FNMS(Tp, Tn, TK); + Tv = W[1]; + Tx = FMA(Tv, Tw, Tu); + TN = FNMS(Tv, Tt, TM); + Ty = Tr - Tx; + TS = TL + TN; + TC = Tr + Tx; + TO = TL - TN; + } + } + { + E TP, T8, Tz, TE; + TP = TJ - TO; + T8 = T1 - T7; + Tz = Tl + Ty; + TE = FNMS(KP500000000, Tz, T8); + ri[WS(rs, 3)] = T8 + Tz; + ri[WS(rs, 1)] = FMA(KP866025403, TP, TE); + ri[WS(rs, 5)] = FNMS(KP866025403, TP, TE); + } + { + E T14, T11, T12, T13; + T14 = Ty - Tl; + T11 = TX - TW; + T12 = TJ + TO; + T13 = FNMS(KP500000000, T12, T11); + ii[WS(rs, 1)] = FMA(KP866025403, T14, T13); + ii[WS(rs, 3)] = T12 + T11; + ii[WS(rs, 5)] = FNMS(KP866025403, T14, T13); + } + { + E TT, TA, TD, TQ; + TT = TR - TS; + TA = T1 + T7; + TD = TB + TC; + TQ = FNMS(KP500000000, TD, TA); + ri[0] = TA + TD; + ri[WS(rs, 4)] = FMA(KP866025403, TT, TQ); + ri[WS(rs, 2)] = FNMS(KP866025403, TT, TQ); + } + { + E T10, TU, TY, TZ; + T10 = TC - TB; + TU = TR + TS; + TY = TW + TX; + TZ = FNMS(KP500000000, TU, TY); + ii[0] = TU + TY; + ii[WS(rs, 4)] = FMA(KP866025403, T10, TZ); + ii[WS(rs, 2)] = FNMS(KP866025403, T10, TZ); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 6}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 6, "t1_6", twinstr, &GENUS, {24, 10, 22, 0}, 0, 0, 0 }; + +void X(codelet_t1_6) (planner *p) { + X(kdft_dit_register) (p, t1_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 6 -name t1_6 -include dft/scalar/t.h */ + +/* + * This function contains 46 FP additions, 28 FP multiplications, + * (or, 32 additions, 14 multiplications, 14 fused multiply/add), + * 23 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + (mb * 10); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs)) { + E T7, TS, Tv, TO, Tt, TJ, Tx, TF, Ti, TI, Tw, TC; + { + E T1, TN, T6, TM; + T1 = ri[0]; + TN = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 3)]; + T5 = ii[WS(rs, 3)]; + T2 = W[4]; + T4 = W[5]; + T6 = FMA(T2, T3, T4 * T5); + TM = FNMS(T4, T3, T2 * T5); + } + T7 = T1 - T6; + TS = TN - TM; + Tv = T1 + T6; + TO = TM + TN; + } + { + E Tn, TD, Ts, TE; + { + E Tk, Tm, Tj, Tl; + Tk = ri[WS(rs, 4)]; + Tm = ii[WS(rs, 4)]; + Tj = W[6]; + Tl = W[7]; + Tn = FMA(Tj, Tk, Tl * Tm); + TD = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = ri[WS(rs, 1)]; + Tr = ii[WS(rs, 1)]; + To = W[0]; + Tq = W[1]; + Ts = FMA(To, Tp, Tq * Tr); + TE = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn - Ts; + TJ = TD + TE; + Tx = Tn + Ts; + TF = TD - TE; + } + { + E Tc, TA, Th, TB; + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 2)]; + Tb = ii[WS(rs, 2)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + TA = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 5)]; + Tg = ii[WS(rs, 5)]; + Td = W[8]; + Tf = W[9]; + Th = FMA(Td, Te, Tf * Tg); + TB = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc - Th; + TI = TA + TB; + Tw = Tc + Th; + TC = TA - TB; + } + { + E TG, Tu, Tz, TR, TT, TU; + TG = KP866025403 * (TC - TF); + Tu = Ti + Tt; + Tz = FNMS(KP500000000, Tu, T7); + ri[WS(rs, 3)] = T7 + Tu; + ri[WS(rs, 1)] = Tz + TG; + ri[WS(rs, 5)] = Tz - TG; + TR = KP866025403 * (Tt - Ti); + TT = TC + TF; + TU = FNMS(KP500000000, TT, TS); + ii[WS(rs, 1)] = TR + TU; + ii[WS(rs, 3)] = TT + TS; + ii[WS(rs, 5)] = TU - TR; + } + { + E TK, Ty, TH, TQ, TL, TP; + TK = KP866025403 * (TI - TJ); + Ty = Tw + Tx; + TH = FNMS(KP500000000, Ty, Tv); + ri[0] = Tv + Ty; + ri[WS(rs, 4)] = TH + TK; + ri[WS(rs, 2)] = TH - TK; + TQ = KP866025403 * (Tx - Tw); + TL = TI + TJ; + TP = FNMS(KP500000000, TL, TO); + ii[0] = TL + TO; + ii[WS(rs, 4)] = TQ + TP; + ii[WS(rs, 2)] = TP - TQ; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 6}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 6, "t1_6", twinstr, &GENUS, {32, 14, 14, 0}, 0, 0, 0 }; + +void X(codelet_t1_6) (planner *p) { + X(kdft_dit_register) (p, t1_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_64.c new file mode 100644 index 000000000..4d5c667d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_64.c @@ -0,0 +1,4105 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:15 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 64 -name t1_64 -include dft/scalar/t.h */ + +/* + * This function contains 1038 FP additions, 644 FP multiplications, + * (or, 520 additions, 126 multiplications, 518 fused multiply/add), + * 190 stack variables, 15 constants, and 256 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + (mb * 126); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 126, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tm, TeM, TjR, Tkl, T7e, TcA, TiV, Tjm, T1G, TeW, TeZ, Ths, T7Q, TcJ, T7X; + E TcI, T29, Tf8, Tf5, Thv, T87, TcN, T8u, TcQ, T5K, Tg9, TfU, ThS, Taq, Tdm; + E Tbj, Tdx, TN, Tjl, TeP, TiP, T7l, TcB, T7s, TcC, T1f, TeR, TeU, Thr, T7B; + E TcG, T7I, TcF, T32, Tfj, Tfg, ThB, T8G, TcU, T93, TcX, T3X, TfI, Tft, ThH; + E T9h, Td3, Taa, Tde, T2A, Tf6, Tfb, Thw, T8m, TcR, T8x, TcO, T3t, Tfh, Tfm; + E ThC, T8V, TcY, T96, TcV, T4o, Tfu, TfL, ThI, T9w, Tdf, Tad, Td4, T6b, TfV; + E Tgc, ThT, TaF, Tdy, Tbm, Tdn, T4Q, ThN, TfA, TfN, Ta1, Tdh, Taf, Td8, T5h; + E ThO, TfF, TfO, T9M, Tdi, Tag, Tdb, T6D, ThY, Tg1, Tge, Tba, TdA, Tbo, Tdr; + E T74, ThZ, Tg6, Tgf, TaV, TdB, Tbp, Tdu; + { + E T1, TiT, T7, TiS, Te, T7a, Tk, T7c; + T1 = ri[0]; + TiT = ii[0]; + { + E T3, T6, T4, TiR, T2, T5; + T3 = ri[WS(rs, 32)]; + T6 = ii[WS(rs, 32)]; + T2 = W[62]; + T4 = T2 * T3; + TiR = T2 * T6; + T5 = W[63]; + T7 = FMA(T5, T6, T4); + TiS = FNMS(T5, T3, TiR); + } + { + E Ta, Td, Tb, T79, T9, Tc; + Ta = ri[WS(rs, 16)]; + Td = ii[WS(rs, 16)]; + T9 = W[30]; + Tb = T9 * Ta; + T79 = T9 * Td; + Tc = W[31]; + Te = FMA(Tc, Td, Tb); + T7a = FNMS(Tc, Ta, T79); + } + { + E Tg, Tj, Th, T7b, Tf, Ti; + Tg = ri[WS(rs, 48)]; + Tj = ii[WS(rs, 48)]; + Tf = W[94]; + Th = Tf * Tg; + T7b = Tf * Tj; + Ti = W[95]; + Tk = FMA(Ti, Tj, Th); + T7c = FNMS(Ti, Tg, T7b); + } + { + E T8, Tl, TjP, TjQ; + T8 = T1 + T7; + Tl = Te + Tk; + Tm = T8 + Tl; + TeM = T8 - Tl; + TjP = TiT - TiS; + TjQ = Te - Tk; + TjR = TjP - TjQ; + Tkl = TjQ + TjP; + } + { + E T78, T7d, TiQ, TiU; + T78 = T1 - T7; + T7d = T7a - T7c; + T7e = T78 - T7d; + TcA = T78 + T7d; + TiQ = T7a + T7c; + TiU = TiS + TiT; + TiV = TiQ + TiU; + Tjm = TiU - TiQ; + } + } + { + E T1l, T7L, T1E, T7V, T1r, T7N, T1y, T7T; + { + E T1h, T1k, T1i, T7K, T1g, T1j; + T1h = ri[WS(rs, 60)]; + T1k = ii[WS(rs, 60)]; + T1g = W[118]; + T1i = T1g * T1h; + T7K = T1g * T1k; + T1j = W[119]; + T1l = FMA(T1j, T1k, T1i); + T7L = FNMS(T1j, T1h, T7K); + } + { + E T1A, T1D, T1B, T7U, T1z, T1C; + T1A = ri[WS(rs, 44)]; + T1D = ii[WS(rs, 44)]; + T1z = W[86]; + T1B = T1z * T1A; + T7U = T1z * T1D; + T1C = W[87]; + T1E = FMA(T1C, T1D, T1B); + T7V = FNMS(T1C, T1A, T7U); + } + { + E T1n, T1q, T1o, T7M, T1m, T1p; + T1n = ri[WS(rs, 28)]; + T1q = ii[WS(rs, 28)]; + T1m = W[54]; + T1o = T1m * T1n; + T7M = T1m * T1q; + T1p = W[55]; + T1r = FMA(T1p, T1q, T1o); + T7N = FNMS(T1p, T1n, T7M); + } + { + E T1u, T1x, T1v, T7S, T1t, T1w; + T1u = ri[WS(rs, 12)]; + T1x = ii[WS(rs, 12)]; + T1t = W[22]; + T1v = T1t * T1u; + T7S = T1t * T1x; + T1w = W[23]; + T1y = FMA(T1w, T1x, T1v); + T7T = FNMS(T1w, T1u, T7S); + } + { + E T1s, T1F, TeX, TeY; + T1s = T1l + T1r; + T1F = T1y + T1E; + T1G = T1s + T1F; + TeW = T1s - T1F; + TeX = T7L + T7N; + TeY = T7T + T7V; + TeZ = TeX - TeY; + Ths = TeX + TeY; + } + { + E T7O, T7P, T7R, T7W; + T7O = T7L - T7N; + T7P = T1y - T1E; + T7Q = T7O + T7P; + TcJ = T7O - T7P; + T7R = T1l - T1r; + T7W = T7T - T7V; + T7X = T7R - T7W; + TcI = T7R + T7W; + } + } + { + E T1O, T82, T27, T8s, T1U, T84, T21, T8q; + { + E T1K, T1N, T1L, T81, T1J, T1M; + T1K = ri[WS(rs, 2)]; + T1N = ii[WS(rs, 2)]; + T1J = W[2]; + T1L = T1J * T1K; + T81 = T1J * T1N; + T1M = W[3]; + T1O = FMA(T1M, T1N, T1L); + T82 = FNMS(T1M, T1K, T81); + } + { + E T23, T26, T24, T8r, T22, T25; + T23 = ri[WS(rs, 50)]; + T26 = ii[WS(rs, 50)]; + T22 = W[98]; + T24 = T22 * T23; + T8r = T22 * T26; + T25 = W[99]; + T27 = FMA(T25, T26, T24); + T8s = FNMS(T25, T23, T8r); + } + { + E T1Q, T1T, T1R, T83, T1P, T1S; + T1Q = ri[WS(rs, 34)]; + T1T = ii[WS(rs, 34)]; + T1P = W[66]; + T1R = T1P * T1Q; + T83 = T1P * T1T; + T1S = W[67]; + T1U = FMA(T1S, T1T, T1R); + T84 = FNMS(T1S, T1Q, T83); + } + { + E T1X, T20, T1Y, T8p, T1W, T1Z; + T1X = ri[WS(rs, 18)]; + T20 = ii[WS(rs, 18)]; + T1W = W[34]; + T1Y = T1W * T1X; + T8p = T1W * T20; + T1Z = W[35]; + T21 = FMA(T1Z, T20, T1Y); + T8q = FNMS(T1Z, T1X, T8p); + } + { + E T1V, T28, Tf3, Tf4; + T1V = T1O + T1U; + T28 = T21 + T27; + T29 = T1V + T28; + Tf8 = T1V - T28; + Tf3 = T82 + T84; + Tf4 = T8q + T8s; + Tf5 = Tf3 - Tf4; + Thv = Tf3 + Tf4; + } + { + E T85, T86, T8o, T8t; + T85 = T82 - T84; + T86 = T21 - T27; + T87 = T85 + T86; + TcN = T85 - T86; + T8o = T1O - T1U; + T8t = T8q - T8s; + T8u = T8o - T8t; + TcQ = T8o + T8t; + } + } + { + E T5p, Tal, T5I, Tbh, T5v, Tan, T5C, Tbf; + { + E T5l, T5o, T5m, Tak, T5k, T5n; + T5l = ri[WS(rs, 63)]; + T5o = ii[WS(rs, 63)]; + T5k = W[124]; + T5m = T5k * T5l; + Tak = T5k * T5o; + T5n = W[125]; + T5p = FMA(T5n, T5o, T5m); + Tal = FNMS(T5n, T5l, Tak); + } + { + E T5E, T5H, T5F, Tbg, T5D, T5G; + T5E = ri[WS(rs, 47)]; + T5H = ii[WS(rs, 47)]; + T5D = W[92]; + T5F = T5D * T5E; + Tbg = T5D * T5H; + T5G = W[93]; + T5I = FMA(T5G, T5H, T5F); + Tbh = FNMS(T5G, T5E, Tbg); + } + { + E T5r, T5u, T5s, Tam, T5q, T5t; + T5r = ri[WS(rs, 31)]; + T5u = ii[WS(rs, 31)]; + T5q = W[60]; + T5s = T5q * T5r; + Tam = T5q * T5u; + T5t = W[61]; + T5v = FMA(T5t, T5u, T5s); + Tan = FNMS(T5t, T5r, Tam); + } + { + E T5y, T5B, T5z, Tbe, T5x, T5A; + T5y = ri[WS(rs, 15)]; + T5B = ii[WS(rs, 15)]; + T5x = W[28]; + T5z = T5x * T5y; + Tbe = T5x * T5B; + T5A = W[29]; + T5C = FMA(T5A, T5B, T5z); + Tbf = FNMS(T5A, T5y, Tbe); + } + { + E T5w, T5J, TfS, TfT; + T5w = T5p + T5v; + T5J = T5C + T5I; + T5K = T5w + T5J; + Tg9 = T5w - T5J; + TfS = Tal + Tan; + TfT = Tbf + Tbh; + TfU = TfS - TfT; + ThS = TfS + TfT; + } + { + E Tao, Tap, Tbd, Tbi; + Tao = Tal - Tan; + Tap = T5C - T5I; + Taq = Tao + Tap; + Tdm = Tao - Tap; + Tbd = T5p - T5v; + Tbi = Tbf - Tbh; + Tbj = Tbd - Tbi; + Tdx = Tbd + Tbi; + } + } + { + E Ts, T7g, TL, T7q, Ty, T7i, TF, T7o; + { + E To, Tr, Tp, T7f, Tn, Tq; + To = ri[WS(rs, 8)]; + Tr = ii[WS(rs, 8)]; + Tn = W[14]; + Tp = Tn * To; + T7f = Tn * Tr; + Tq = W[15]; + Ts = FMA(Tq, Tr, Tp); + T7g = FNMS(Tq, To, T7f); + } + { + E TH, TK, TI, T7p, TG, TJ; + TH = ri[WS(rs, 24)]; + TK = ii[WS(rs, 24)]; + TG = W[46]; + TI = TG * TH; + T7p = TG * TK; + TJ = W[47]; + TL = FMA(TJ, TK, TI); + T7q = FNMS(TJ, TH, T7p); + } + { + E Tu, Tx, Tv, T7h, Tt, Tw; + Tu = ri[WS(rs, 40)]; + Tx = ii[WS(rs, 40)]; + Tt = W[78]; + Tv = Tt * Tu; + T7h = Tt * Tx; + Tw = W[79]; + Ty = FMA(Tw, Tx, Tv); + T7i = FNMS(Tw, Tu, T7h); + } + { + E TB, TE, TC, T7n, TA, TD; + TB = ri[WS(rs, 56)]; + TE = ii[WS(rs, 56)]; + TA = W[110]; + TC = TA * TB; + T7n = TA * TE; + TD = W[111]; + TF = FMA(TD, TE, TC); + T7o = FNMS(TD, TB, T7n); + } + { + E Tz, TM, TeN, TeO; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz + TM; + Tjl = TM - Tz; + TeN = T7g + T7i; + TeO = T7o + T7q; + TeP = TeN - TeO; + TiP = TeN + TeO; + } + { + E T7j, T7k, T7m, T7r; + T7j = T7g - T7i; + T7k = Ts - Ty; + T7l = T7j - T7k; + TcB = T7k + T7j; + T7m = TF - TL; + T7r = T7o - T7q; + T7s = T7m + T7r; + TcC = T7m - T7r; + } + } + { + E TU, T7w, T1d, T7G, T10, T7y, T17, T7E; + { + E TQ, TT, TR, T7v, TP, TS; + TQ = ri[WS(rs, 4)]; + TT = ii[WS(rs, 4)]; + TP = W[6]; + TR = TP * TQ; + T7v = TP * TT; + TS = W[7]; + TU = FMA(TS, TT, TR); + T7w = FNMS(TS, TQ, T7v); + } + { + E T19, T1c, T1a, T7F, T18, T1b; + T19 = ri[WS(rs, 52)]; + T1c = ii[WS(rs, 52)]; + T18 = W[102]; + T1a = T18 * T19; + T7F = T18 * T1c; + T1b = W[103]; + T1d = FMA(T1b, T1c, T1a); + T7G = FNMS(T1b, T19, T7F); + } + { + E TW, TZ, TX, T7x, TV, TY; + TW = ri[WS(rs, 36)]; + TZ = ii[WS(rs, 36)]; + TV = W[70]; + TX = TV * TW; + T7x = TV * TZ; + TY = W[71]; + T10 = FMA(TY, TZ, TX); + T7y = FNMS(TY, TW, T7x); + } + { + E T13, T16, T14, T7D, T12, T15; + T13 = ri[WS(rs, 20)]; + T16 = ii[WS(rs, 20)]; + T12 = W[38]; + T14 = T12 * T13; + T7D = T12 * T16; + T15 = W[39]; + T17 = FMA(T15, T16, T14); + T7E = FNMS(T15, T13, T7D); + } + { + E T11, T1e, TeS, TeT; + T11 = TU + T10; + T1e = T17 + T1d; + T1f = T11 + T1e; + TeR = T11 - T1e; + TeS = T7w + T7y; + TeT = T7E + T7G; + TeU = TeS - TeT; + Thr = TeS + TeT; + } + { + E T7z, T7A, T7C, T7H; + T7z = T7w - T7y; + T7A = T17 - T1d; + T7B = T7z + T7A; + TcG = T7z - T7A; + T7C = TU - T10; + T7H = T7E - T7G; + T7I = T7C - T7H; + TcF = T7C + T7H; + } + } + { + E T2H, T8B, T30, T91, T2N, T8D, T2U, T8Z; + { + E T2D, T2G, T2E, T8A, T2C, T2F; + T2D = ri[WS(rs, 62)]; + T2G = ii[WS(rs, 62)]; + T2C = W[122]; + T2E = T2C * T2D; + T8A = T2C * T2G; + T2F = W[123]; + T2H = FMA(T2F, T2G, T2E); + T8B = FNMS(T2F, T2D, T8A); + } + { + E T2W, T2Z, T2X, T90, T2V, T2Y; + T2W = ri[WS(rs, 46)]; + T2Z = ii[WS(rs, 46)]; + T2V = W[90]; + T2X = T2V * T2W; + T90 = T2V * T2Z; + T2Y = W[91]; + T30 = FMA(T2Y, T2Z, T2X); + T91 = FNMS(T2Y, T2W, T90); + } + { + E T2J, T2M, T2K, T8C, T2I, T2L; + T2J = ri[WS(rs, 30)]; + T2M = ii[WS(rs, 30)]; + T2I = W[58]; + T2K = T2I * T2J; + T8C = T2I * T2M; + T2L = W[59]; + T2N = FMA(T2L, T2M, T2K); + T8D = FNMS(T2L, T2J, T8C); + } + { + E T2Q, T2T, T2R, T8Y, T2P, T2S; + T2Q = ri[WS(rs, 14)]; + T2T = ii[WS(rs, 14)]; + T2P = W[26]; + T2R = T2P * T2Q; + T8Y = T2P * T2T; + T2S = W[27]; + T2U = FMA(T2S, T2T, T2R); + T8Z = FNMS(T2S, T2Q, T8Y); + } + { + E T2O, T31, Tfe, Tff; + T2O = T2H + T2N; + T31 = T2U + T30; + T32 = T2O + T31; + Tfj = T2O - T31; + Tfe = T8B + T8D; + Tff = T8Z + T91; + Tfg = Tfe - Tff; + ThB = Tfe + Tff; + } + { + E T8E, T8F, T8X, T92; + T8E = T8B - T8D; + T8F = T2U - T30; + T8G = T8E + T8F; + TcU = T8E - T8F; + T8X = T2H - T2N; + T92 = T8Z - T91; + T93 = T8X - T92; + TcX = T8X + T92; + } + } + { + E T3C, T9c, T3V, Ta8, T3I, T9e, T3P, Ta6; + { + E T3y, T3B, T3z, T9b, T3x, T3A; + T3y = ri[WS(rs, 1)]; + T3B = ii[WS(rs, 1)]; + T3x = W[0]; + T3z = T3x * T3y; + T9b = T3x * T3B; + T3A = W[1]; + T3C = FMA(T3A, T3B, T3z); + T9c = FNMS(T3A, T3y, T9b); + } + { + E T3R, T3U, T3S, Ta7, T3Q, T3T; + T3R = ri[WS(rs, 49)]; + T3U = ii[WS(rs, 49)]; + T3Q = W[96]; + T3S = T3Q * T3R; + Ta7 = T3Q * T3U; + T3T = W[97]; + T3V = FMA(T3T, T3U, T3S); + Ta8 = FNMS(T3T, T3R, Ta7); + } + { + E T3E, T3H, T3F, T9d, T3D, T3G; + T3E = ri[WS(rs, 33)]; + T3H = ii[WS(rs, 33)]; + T3D = W[64]; + T3F = T3D * T3E; + T9d = T3D * T3H; + T3G = W[65]; + T3I = FMA(T3G, T3H, T3F); + T9e = FNMS(T3G, T3E, T9d); + } + { + E T3L, T3O, T3M, Ta5, T3K, T3N; + T3L = ri[WS(rs, 17)]; + T3O = ii[WS(rs, 17)]; + T3K = W[32]; + T3M = T3K * T3L; + Ta5 = T3K * T3O; + T3N = W[33]; + T3P = FMA(T3N, T3O, T3M); + Ta6 = FNMS(T3N, T3L, Ta5); + } + { + E T3J, T3W, Tfr, Tfs; + T3J = T3C + T3I; + T3W = T3P + T3V; + T3X = T3J + T3W; + TfI = T3J - T3W; + Tfr = T9c + T9e; + Tfs = Ta6 + Ta8; + Tft = Tfr - Tfs; + ThH = Tfr + Tfs; + } + { + E T9f, T9g, Ta4, Ta9; + T9f = T9c - T9e; + T9g = T3P - T3V; + T9h = T9f + T9g; + Td3 = T9f - T9g; + Ta4 = T3C - T3I; + Ta9 = Ta6 - Ta8; + Taa = Ta4 - Ta9; + Tde = Ta4 + Ta9; + } + } + { + E T2f, T8a, T2y, T8j, T2l, T8c, T2s, T8h; + { + E T2b, T2e, T2c, T89, T2a, T2d; + T2b = ri[WS(rs, 10)]; + T2e = ii[WS(rs, 10)]; + T2a = W[18]; + T2c = T2a * T2b; + T89 = T2a * T2e; + T2d = W[19]; + T2f = FMA(T2d, T2e, T2c); + T8a = FNMS(T2d, T2b, T89); + } + { + E T2u, T2x, T2v, T8i, T2t, T2w; + T2u = ri[WS(rs, 26)]; + T2x = ii[WS(rs, 26)]; + T2t = W[50]; + T2v = T2t * T2u; + T8i = T2t * T2x; + T2w = W[51]; + T2y = FMA(T2w, T2x, T2v); + T8j = FNMS(T2w, T2u, T8i); + } + { + E T2h, T2k, T2i, T8b, T2g, T2j; + T2h = ri[WS(rs, 42)]; + T2k = ii[WS(rs, 42)]; + T2g = W[82]; + T2i = T2g * T2h; + T8b = T2g * T2k; + T2j = W[83]; + T2l = FMA(T2j, T2k, T2i); + T8c = FNMS(T2j, T2h, T8b); + } + { + E T2o, T2r, T2p, T8g, T2n, T2q; + T2o = ri[WS(rs, 58)]; + T2r = ii[WS(rs, 58)]; + T2n = W[114]; + T2p = T2n * T2o; + T8g = T2n * T2r; + T2q = W[115]; + T2s = FMA(T2q, T2r, T2p); + T8h = FNMS(T2q, T2o, T8g); + } + { + E T2m, T2z, Tf9, Tfa; + T2m = T2f + T2l; + T2z = T2s + T2y; + T2A = T2m + T2z; + Tf6 = T2z - T2m; + Tf9 = T8a + T8c; + Tfa = T8h + T8j; + Tfb = Tf9 - Tfa; + Thw = Tf9 + Tfa; + { + E T8e, T8w, T8l, T8v; + { + E T88, T8d, T8f, T8k; + T88 = T2f - T2l; + T8d = T8a - T8c; + T8e = T88 + T8d; + T8w = T8d - T88; + T8f = T2s - T2y; + T8k = T8h - T8j; + T8l = T8f - T8k; + T8v = T8f + T8k; + } + T8m = T8e - T8l; + TcR = T8e + T8l; + T8x = T8v - T8w; + TcO = T8w + T8v; + } + } + } + { + E T38, T8J, T3r, T8S, T3e, T8L, T3l, T8Q; + { + E T34, T37, T35, T8I, T33, T36; + T34 = ri[WS(rs, 6)]; + T37 = ii[WS(rs, 6)]; + T33 = W[10]; + T35 = T33 * T34; + T8I = T33 * T37; + T36 = W[11]; + T38 = FMA(T36, T37, T35); + T8J = FNMS(T36, T34, T8I); + } + { + E T3n, T3q, T3o, T8R, T3m, T3p; + T3n = ri[WS(rs, 22)]; + T3q = ii[WS(rs, 22)]; + T3m = W[42]; + T3o = T3m * T3n; + T8R = T3m * T3q; + T3p = W[43]; + T3r = FMA(T3p, T3q, T3o); + T8S = FNMS(T3p, T3n, T8R); + } + { + E T3a, T3d, T3b, T8K, T39, T3c; + T3a = ri[WS(rs, 38)]; + T3d = ii[WS(rs, 38)]; + T39 = W[74]; + T3b = T39 * T3a; + T8K = T39 * T3d; + T3c = W[75]; + T3e = FMA(T3c, T3d, T3b); + T8L = FNMS(T3c, T3a, T8K); + } + { + E T3h, T3k, T3i, T8P, T3g, T3j; + T3h = ri[WS(rs, 54)]; + T3k = ii[WS(rs, 54)]; + T3g = W[106]; + T3i = T3g * T3h; + T8P = T3g * T3k; + T3j = W[107]; + T3l = FMA(T3j, T3k, T3i); + T8Q = FNMS(T3j, T3h, T8P); + } + { + E T3f, T3s, Tfk, Tfl; + T3f = T38 + T3e; + T3s = T3l + T3r; + T3t = T3f + T3s; + Tfh = T3s - T3f; + Tfk = T8J + T8L; + Tfl = T8Q + T8S; + Tfm = Tfk - Tfl; + ThC = Tfk + Tfl; + { + E T8N, T95, T8U, T94; + { + E T8H, T8M, T8O, T8T; + T8H = T38 - T3e; + T8M = T8J - T8L; + T8N = T8H + T8M; + T95 = T8M - T8H; + T8O = T3l - T3r; + T8T = T8Q - T8S; + T8U = T8O - T8T; + T94 = T8O + T8T; + } + T8V = T8N - T8U; + TcY = T8N + T8U; + T96 = T94 - T95; + TcV = T95 + T94; + } + } + } + { + E T43, T9k, T4m, T9t, T49, T9m, T4g, T9r; + { + E T3Z, T42, T40, T9j, T3Y, T41; + T3Z = ri[WS(rs, 9)]; + T42 = ii[WS(rs, 9)]; + T3Y = W[16]; + T40 = T3Y * T3Z; + T9j = T3Y * T42; + T41 = W[17]; + T43 = FMA(T41, T42, T40); + T9k = FNMS(T41, T3Z, T9j); + } + { + E T4i, T4l, T4j, T9s, T4h, T4k; + T4i = ri[WS(rs, 25)]; + T4l = ii[WS(rs, 25)]; + T4h = W[48]; + T4j = T4h * T4i; + T9s = T4h * T4l; + T4k = W[49]; + T4m = FMA(T4k, T4l, T4j); + T9t = FNMS(T4k, T4i, T9s); + } + { + E T45, T48, T46, T9l, T44, T47; + T45 = ri[WS(rs, 41)]; + T48 = ii[WS(rs, 41)]; + T44 = W[80]; + T46 = T44 * T45; + T9l = T44 * T48; + T47 = W[81]; + T49 = FMA(T47, T48, T46); + T9m = FNMS(T47, T45, T9l); + } + { + E T4c, T4f, T4d, T9q, T4b, T4e; + T4c = ri[WS(rs, 57)]; + T4f = ii[WS(rs, 57)]; + T4b = W[112]; + T4d = T4b * T4c; + T9q = T4b * T4f; + T4e = W[113]; + T4g = FMA(T4e, T4f, T4d); + T9r = FNMS(T4e, T4c, T9q); + } + { + E T4a, T4n, TfJ, TfK; + T4a = T43 + T49; + T4n = T4g + T4m; + T4o = T4a + T4n; + Tfu = T4n - T4a; + TfJ = T9k + T9m; + TfK = T9r + T9t; + TfL = TfJ - TfK; + ThI = TfJ + TfK; + { + E T9o, Tac, T9v, Tab; + { + E T9i, T9n, T9p, T9u; + T9i = T43 - T49; + T9n = T9k - T9m; + T9o = T9i + T9n; + Tac = T9n - T9i; + T9p = T4g - T4m; + T9u = T9r - T9t; + T9v = T9p - T9u; + Tab = T9p + T9u; + } + T9w = T9o - T9v; + Tdf = T9o + T9v; + Tad = Tab - Tac; + Td4 = Tac + Tab; + } + } + } + { + E T5Q, Tat, T69, TaC, T5W, Tav, T63, TaA; + { + E T5M, T5P, T5N, Tas, T5L, T5O; + T5M = ri[WS(rs, 7)]; + T5P = ii[WS(rs, 7)]; + T5L = W[12]; + T5N = T5L * T5M; + Tas = T5L * T5P; + T5O = W[13]; + T5Q = FMA(T5O, T5P, T5N); + Tat = FNMS(T5O, T5M, Tas); + } + { + E T65, T68, T66, TaB, T64, T67; + T65 = ri[WS(rs, 23)]; + T68 = ii[WS(rs, 23)]; + T64 = W[44]; + T66 = T64 * T65; + TaB = T64 * T68; + T67 = W[45]; + T69 = FMA(T67, T68, T66); + TaC = FNMS(T67, T65, TaB); + } + { + E T5S, T5V, T5T, Tau, T5R, T5U; + T5S = ri[WS(rs, 39)]; + T5V = ii[WS(rs, 39)]; + T5R = W[76]; + T5T = T5R * T5S; + Tau = T5R * T5V; + T5U = W[77]; + T5W = FMA(T5U, T5V, T5T); + Tav = FNMS(T5U, T5S, Tau); + } + { + E T5Z, T62, T60, Taz, T5Y, T61; + T5Z = ri[WS(rs, 55)]; + T62 = ii[WS(rs, 55)]; + T5Y = W[108]; + T60 = T5Y * T5Z; + Taz = T5Y * T62; + T61 = W[109]; + T63 = FMA(T61, T62, T60); + TaA = FNMS(T61, T5Z, Taz); + } + { + E T5X, T6a, Tga, Tgb; + T5X = T5Q + T5W; + T6a = T63 + T69; + T6b = T5X + T6a; + TfV = T6a - T5X; + Tga = Tat + Tav; + Tgb = TaA + TaC; + Tgc = Tga - Tgb; + ThT = Tga + Tgb; + { + E Tax, Tbl, TaE, Tbk; + { + E Tar, Taw, Tay, TaD; + Tar = T5Q - T5W; + Taw = Tat - Tav; + Tax = Tar + Taw; + Tbl = Taw - Tar; + Tay = T63 - T69; + TaD = TaA - TaC; + TaE = Tay - TaD; + Tbk = Tay + TaD; + } + TaF = Tax - TaE; + Tdy = Tax + TaE; + Tbm = Tbk - Tbl; + Tdn = Tbl + Tbk; + } + } + } + { + E T4v, T9V, T4O, T9R, T4B, T9X, T4I, T9P; + { + E T4r, T4u, T4s, T9U, T4q, T4t; + T4r = ri[WS(rs, 5)]; + T4u = ii[WS(rs, 5)]; + T4q = W[8]; + T4s = T4q * T4r; + T9U = T4q * T4u; + T4t = W[9]; + T4v = FMA(T4t, T4u, T4s); + T9V = FNMS(T4t, T4r, T9U); + } + { + E T4K, T4N, T4L, T9Q, T4J, T4M; + T4K = ri[WS(rs, 53)]; + T4N = ii[WS(rs, 53)]; + T4J = W[104]; + T4L = T4J * T4K; + T9Q = T4J * T4N; + T4M = W[105]; + T4O = FMA(T4M, T4N, T4L); + T9R = FNMS(T4M, T4K, T9Q); + } + { + E T4x, T4A, T4y, T9W, T4w, T4z; + T4x = ri[WS(rs, 37)]; + T4A = ii[WS(rs, 37)]; + T4w = W[72]; + T4y = T4w * T4x; + T9W = T4w * T4A; + T4z = W[73]; + T4B = FMA(T4z, T4A, T4y); + T9X = FNMS(T4z, T4x, T9W); + } + { + E T4E, T4H, T4F, T9O, T4D, T4G; + T4E = ri[WS(rs, 21)]; + T4H = ii[WS(rs, 21)]; + T4D = W[40]; + T4F = T4D * T4E; + T9O = T4D * T4H; + T4G = W[41]; + T4I = FMA(T4G, T4H, T4F); + T9P = FNMS(T4G, T4E, T9O); + } + { + E T4C, T4P, Tfz, Tfw, Tfx, Tfy; + T4C = T4v + T4B; + T4P = T4I + T4O; + Tfz = T4C - T4P; + Tfw = T9V + T9X; + Tfx = T9P + T9R; + Tfy = Tfw - Tfx; + T4Q = T4C + T4P; + ThN = Tfw + Tfx; + TfA = Tfy - Tfz; + TfN = Tfz + Tfy; + } + { + E T9T, Td7, Ta0, Td6; + { + E T9N, T9S, T9Y, T9Z; + T9N = T4v - T4B; + T9S = T9P - T9R; + T9T = T9N - T9S; + Td7 = T9N + T9S; + T9Y = T9V - T9X; + T9Z = T4I - T4O; + Ta0 = T9Y + T9Z; + Td6 = T9Y - T9Z; + } + Ta1 = FNMS(KP414213562, Ta0, T9T); + Tdh = FMA(KP414213562, Td6, Td7); + Taf = FMA(KP414213562, T9T, Ta0); + Td8 = FNMS(KP414213562, Td7, Td6); + } + } + { + E T4W, T9G, T5f, T9C, T52, T9I, T59, T9A; + { + E T4S, T4V, T4T, T9F, T4R, T4U; + T4S = ri[WS(rs, 61)]; + T4V = ii[WS(rs, 61)]; + T4R = W[120]; + T4T = T4R * T4S; + T9F = T4R * T4V; + T4U = W[121]; + T4W = FMA(T4U, T4V, T4T); + T9G = FNMS(T4U, T4S, T9F); + } + { + E T5b, T5e, T5c, T9B, T5a, T5d; + T5b = ri[WS(rs, 45)]; + T5e = ii[WS(rs, 45)]; + T5a = W[88]; + T5c = T5a * T5b; + T9B = T5a * T5e; + T5d = W[89]; + T5f = FMA(T5d, T5e, T5c); + T9C = FNMS(T5d, T5b, T9B); + } + { + E T4Y, T51, T4Z, T9H, T4X, T50; + T4Y = ri[WS(rs, 29)]; + T51 = ii[WS(rs, 29)]; + T4X = W[56]; + T4Z = T4X * T4Y; + T9H = T4X * T51; + T50 = W[57]; + T52 = FMA(T50, T51, T4Z); + T9I = FNMS(T50, T4Y, T9H); + } + { + E T55, T58, T56, T9z, T54, T57; + T55 = ri[WS(rs, 13)]; + T58 = ii[WS(rs, 13)]; + T54 = W[24]; + T56 = T54 * T55; + T9z = T54 * T58; + T57 = W[25]; + T59 = FMA(T57, T58, T56); + T9A = FNMS(T57, T55, T9z); + } + { + E T53, T5g, TfB, TfC, TfD, TfE; + T53 = T4W + T52; + T5g = T59 + T5f; + TfB = T53 - T5g; + TfC = T9G + T9I; + TfD = T9A + T9C; + TfE = TfC - TfD; + T5h = T53 + T5g; + ThO = TfC + TfD; + TfF = TfB + TfE; + TfO = TfB - TfE; + } + { + E T9E, Tda, T9L, Td9; + { + E T9y, T9D, T9J, T9K; + T9y = T4W - T52; + T9D = T9A - T9C; + T9E = T9y - T9D; + Tda = T9y + T9D; + T9J = T9G - T9I; + T9K = T59 - T5f; + T9L = T9J + T9K; + Td9 = T9J - T9K; + } + T9M = FMA(KP414213562, T9L, T9E); + Tdi = FNMS(KP414213562, Td9, Tda); + Tag = FNMS(KP414213562, T9E, T9L); + Tdb = FMA(KP414213562, Tda, Td9); + } + } + { + E T6i, Tb4, T6B, Tb0, T6o, Tb6, T6v, TaY; + { + E T6e, T6h, T6f, Tb3, T6d, T6g; + T6e = ri[WS(rs, 3)]; + T6h = ii[WS(rs, 3)]; + T6d = W[4]; + T6f = T6d * T6e; + Tb3 = T6d * T6h; + T6g = W[5]; + T6i = FMA(T6g, T6h, T6f); + Tb4 = FNMS(T6g, T6e, Tb3); + } + { + E T6x, T6A, T6y, TaZ, T6w, T6z; + T6x = ri[WS(rs, 51)]; + T6A = ii[WS(rs, 51)]; + T6w = W[100]; + T6y = T6w * T6x; + TaZ = T6w * T6A; + T6z = W[101]; + T6B = FMA(T6z, T6A, T6y); + Tb0 = FNMS(T6z, T6x, TaZ); + } + { + E T6k, T6n, T6l, Tb5, T6j, T6m; + T6k = ri[WS(rs, 35)]; + T6n = ii[WS(rs, 35)]; + T6j = W[68]; + T6l = T6j * T6k; + Tb5 = T6j * T6n; + T6m = W[69]; + T6o = FMA(T6m, T6n, T6l); + Tb6 = FNMS(T6m, T6k, Tb5); + } + { + E T6r, T6u, T6s, TaX, T6q, T6t; + T6r = ri[WS(rs, 19)]; + T6u = ii[WS(rs, 19)]; + T6q = W[36]; + T6s = T6q * T6r; + TaX = T6q * T6u; + T6t = W[37]; + T6v = FMA(T6t, T6u, T6s); + TaY = FNMS(T6t, T6r, TaX); + } + { + E T6p, T6C, Tg0, TfX, TfY, TfZ; + T6p = T6i + T6o; + T6C = T6v + T6B; + Tg0 = T6p - T6C; + TfX = Tb4 + Tb6; + TfY = TaY + Tb0; + TfZ = TfX - TfY; + T6D = T6p + T6C; + ThY = TfX + TfY; + Tg1 = TfZ - Tg0; + Tge = Tg0 + TfZ; + } + { + E Tb2, Tdq, Tb9, Tdp; + { + E TaW, Tb1, Tb7, Tb8; + TaW = T6i - T6o; + Tb1 = TaY - Tb0; + Tb2 = TaW - Tb1; + Tdq = TaW + Tb1; + Tb7 = Tb4 - Tb6; + Tb8 = T6v - T6B; + Tb9 = Tb7 + Tb8; + Tdp = Tb7 - Tb8; + } + Tba = FNMS(KP414213562, Tb9, Tb2); + TdA = FMA(KP414213562, Tdp, Tdq); + Tbo = FMA(KP414213562, Tb2, Tb9); + Tdr = FNMS(KP414213562, Tdq, Tdp); + } + } + { + E T6J, TaP, T72, TaL, T6P, TaR, T6W, TaJ; + { + E T6F, T6I, T6G, TaO, T6E, T6H; + T6F = ri[WS(rs, 59)]; + T6I = ii[WS(rs, 59)]; + T6E = W[116]; + T6G = T6E * T6F; + TaO = T6E * T6I; + T6H = W[117]; + T6J = FMA(T6H, T6I, T6G); + TaP = FNMS(T6H, T6F, TaO); + } + { + E T6Y, T71, T6Z, TaK, T6X, T70; + T6Y = ri[WS(rs, 43)]; + T71 = ii[WS(rs, 43)]; + T6X = W[84]; + T6Z = T6X * T6Y; + TaK = T6X * T71; + T70 = W[85]; + T72 = FMA(T70, T71, T6Z); + TaL = FNMS(T70, T6Y, TaK); + } + { + E T6L, T6O, T6M, TaQ, T6K, T6N; + T6L = ri[WS(rs, 27)]; + T6O = ii[WS(rs, 27)]; + T6K = W[52]; + T6M = T6K * T6L; + TaQ = T6K * T6O; + T6N = W[53]; + T6P = FMA(T6N, T6O, T6M); + TaR = FNMS(T6N, T6L, TaQ); + } + { + E T6S, T6V, T6T, TaI, T6R, T6U; + T6S = ri[WS(rs, 11)]; + T6V = ii[WS(rs, 11)]; + T6R = W[20]; + T6T = T6R * T6S; + TaI = T6R * T6V; + T6U = W[21]; + T6W = FMA(T6U, T6V, T6T); + TaJ = FNMS(T6U, T6S, TaI); + } + { + E T6Q, T73, Tg2, Tg3, Tg4, Tg5; + T6Q = T6J + T6P; + T73 = T6W + T72; + Tg2 = T6Q - T73; + Tg3 = TaP + TaR; + Tg4 = TaJ + TaL; + Tg5 = Tg3 - Tg4; + T74 = T6Q + T73; + ThZ = Tg3 + Tg4; + Tg6 = Tg2 + Tg5; + Tgf = Tg2 - Tg5; + } + { + E TaN, Tdt, TaU, Tds; + { + E TaH, TaM, TaS, TaT; + TaH = T6J - T6P; + TaM = TaJ - TaL; + TaN = TaH - TaM; + Tdt = TaH + TaM; + TaS = TaP - TaR; + TaT = T6W - T72; + TaU = TaS + TaT; + Tds = TaS - TaT; + } + TaV = FMA(KP414213562, TaU, TaN); + TdB = FNMS(KP414213562, Tds, Tdt); + Tbp = FNMS(KP414213562, TaN, TaU); + Tdu = FMA(KP414213562, Tdt, Tds); + } + } + { + E T1I, Tio, T3v, Tj1, TiX, Tj2, Tir, TiN, T76, TiK, TiC, TiG, T5j, TiJ, Tix; + E TiF; + { + E TO, T1H, Tip, Tiq; + TO = Tm + TN; + T1H = T1f + T1G; + T1I = TO + T1H; + Tio = TO - T1H; + { + E T2B, T3u, TiO, TiW; + T2B = T29 + T2A; + T3u = T32 + T3t; + T3v = T2B + T3u; + Tj1 = T3u - T2B; + TiO = Thr + Ths; + TiW = TiP + TiV; + TiX = TiO + TiW; + Tj2 = TiW - TiO; + } + Tip = Thv + Thw; + Tiq = ThB + ThC; + Tir = Tip - Tiq; + TiN = Tip + Tiq; + { + E T6c, T75, Tiy, Tiz, TiA, TiB; + T6c = T5K + T6b; + T75 = T6D + T74; + Tiy = T6c - T75; + Tiz = ThS + ThT; + TiA = ThY + ThZ; + TiB = Tiz - TiA; + T76 = T6c + T75; + TiK = Tiz + TiA; + TiC = Tiy - TiB; + TiG = Tiy + TiB; + } + { + E T4p, T5i, Tit, Tiu, Tiv, Tiw; + T4p = T3X + T4o; + T5i = T4Q + T5h; + Tit = T4p - T5i; + Tiu = ThH + ThI; + Tiv = ThN + ThO; + Tiw = Tiu - Tiv; + T5j = T4p + T5i; + TiJ = Tiu + Tiv; + Tix = Tit + Tiw; + TiF = Tiw - Tit; + } + } + { + E T3w, T77, TiM, TiY; + T3w = T1I + T3v; + T77 = T5j + T76; + ri[WS(rs, 32)] = T3w - T77; + ri[0] = T3w + T77; + TiM = TiJ + TiK; + TiY = TiN + TiX; + ii[0] = TiM + TiY; + ii[WS(rs, 32)] = TiY - TiM; + } + { + E Tis, TiD, Tj3, Tj4; + Tis = Tio + Tir; + TiD = Tix + TiC; + ri[WS(rs, 40)] = FNMS(KP707106781, TiD, Tis); + ri[WS(rs, 8)] = FMA(KP707106781, TiD, Tis); + Tj3 = Tj1 + Tj2; + Tj4 = TiF + TiG; + ii[WS(rs, 8)] = FMA(KP707106781, Tj4, Tj3); + ii[WS(rs, 40)] = FNMS(KP707106781, Tj4, Tj3); + } + { + E TiE, TiH, Tj5, Tj6; + TiE = Tio - Tir; + TiH = TiF - TiG; + ri[WS(rs, 56)] = FNMS(KP707106781, TiH, TiE); + ri[WS(rs, 24)] = FMA(KP707106781, TiH, TiE); + Tj5 = Tj2 - Tj1; + Tj6 = TiC - Tix; + ii[WS(rs, 24)] = FMA(KP707106781, Tj6, Tj5); + ii[WS(rs, 56)] = FNMS(KP707106781, Tj6, Tj5); + } + { + E TiI, TiL, TiZ, Tj0; + TiI = T1I - T3v; + TiL = TiJ - TiK; + ri[WS(rs, 48)] = TiI - TiL; + ri[WS(rs, 16)] = TiI + TiL; + TiZ = T76 - T5j; + Tj0 = TiX - TiN; + ii[WS(rs, 16)] = TiZ + Tj0; + ii[WS(rs, 48)] = Tj0 - TiZ; + } + } + { + E Thu, Ti8, Tj9, Tjf, ThF, Tjg, Tib, Tja, ThR, Til, Ti5, Tif, Ti2, Tim, Ti6; + E Tii; + { + E Thq, Tht, Tj7, Tj8; + Thq = Tm - TN; + Tht = Thr - Ths; + Thu = Thq - Tht; + Ti8 = Thq + Tht; + Tj7 = T1G - T1f; + Tj8 = TiV - TiP; + Tj9 = Tj7 + Tj8; + Tjf = Tj8 - Tj7; + } + { + E Thz, Ti9, ThE, Tia; + { + E Thx, Thy, ThA, ThD; + Thx = Thv - Thw; + Thy = T29 - T2A; + Thz = Thx - Thy; + Ti9 = Thy + Thx; + ThA = T32 - T3t; + ThD = ThB - ThC; + ThE = ThA + ThD; + Tia = ThA - ThD; + } + ThF = Thz - ThE; + Tjg = Tia - Ti9; + Tib = Ti9 + Tia; + Tja = Thz + ThE; + } + { + E ThL, Tie, ThQ, Tid; + { + E ThJ, ThK, ThM, ThP; + ThJ = ThH - ThI; + ThK = T5h - T4Q; + ThL = ThJ - ThK; + Tie = ThJ + ThK; + ThM = T3X - T4o; + ThP = ThN - ThO; + ThQ = ThM - ThP; + Tid = ThM + ThP; + } + ThR = FMA(KP414213562, ThQ, ThL); + Til = FNMS(KP414213562, Tid, Tie); + Ti5 = FNMS(KP414213562, ThL, ThQ); + Tif = FMA(KP414213562, Tie, Tid); + } + { + E ThW, Tih, Ti1, Tig; + { + E ThU, ThV, ThX, Ti0; + ThU = ThS - ThT; + ThV = T74 - T6D; + ThW = ThU - ThV; + Tih = ThU + ThV; + ThX = T5K - T6b; + Ti0 = ThY - ThZ; + Ti1 = ThX - Ti0; + Tig = ThX + Ti0; + } + Ti2 = FNMS(KP414213562, Ti1, ThW); + Tim = FMA(KP414213562, Tig, Tih); + Ti6 = FMA(KP414213562, ThW, Ti1); + Tii = FNMS(KP414213562, Tih, Tig); + } + { + E ThG, Ti3, Tjh, Tji; + ThG = FMA(KP707106781, ThF, Thu); + Ti3 = ThR - Ti2; + ri[WS(rs, 44)] = FNMS(KP923879532, Ti3, ThG); + ri[WS(rs, 12)] = FMA(KP923879532, Ti3, ThG); + Tjh = FMA(KP707106781, Tjg, Tjf); + Tji = Ti6 - Ti5; + ii[WS(rs, 12)] = FMA(KP923879532, Tji, Tjh); + ii[WS(rs, 44)] = FNMS(KP923879532, Tji, Tjh); + } + { + E Ti4, Ti7, Tjj, Tjk; + Ti4 = FNMS(KP707106781, ThF, Thu); + Ti7 = Ti5 + Ti6; + ri[WS(rs, 28)] = FNMS(KP923879532, Ti7, Ti4); + ri[WS(rs, 60)] = FMA(KP923879532, Ti7, Ti4); + Tjj = FNMS(KP707106781, Tjg, Tjf); + Tjk = ThR + Ti2; + ii[WS(rs, 28)] = FNMS(KP923879532, Tjk, Tjj); + ii[WS(rs, 60)] = FMA(KP923879532, Tjk, Tjj); + } + { + E Tic, Tij, Tjb, Tjc; + Tic = FMA(KP707106781, Tib, Ti8); + Tij = Tif + Tii; + ri[WS(rs, 36)] = FNMS(KP923879532, Tij, Tic); + ri[WS(rs, 4)] = FMA(KP923879532, Tij, Tic); + Tjb = FMA(KP707106781, Tja, Tj9); + Tjc = Til + Tim; + ii[WS(rs, 4)] = FMA(KP923879532, Tjc, Tjb); + ii[WS(rs, 36)] = FNMS(KP923879532, Tjc, Tjb); + } + { + E Tik, Tin, Tjd, Tje; + Tik = FNMS(KP707106781, Tib, Ti8); + Tin = Til - Tim; + ri[WS(rs, 52)] = FNMS(KP923879532, Tin, Tik); + ri[WS(rs, 20)] = FMA(KP923879532, Tin, Tik); + Tjd = FNMS(KP707106781, Tja, Tj9); + Tje = Tii - Tif; + ii[WS(rs, 20)] = FMA(KP923879532, Tje, Tjd); + ii[WS(rs, 52)] = FNMS(KP923879532, Tje, Tjd); + } + } + { + E Tf2, TjJ, Tgo, TjD, TgI, Tjv, Tha, Tjp, Tfp, Tjw, Tgr, Tjq, Th4, Tho, Th8; + E Thk, TfR, TgB, Tgl, Tgv, TgP, TjK, Thd, TjE, TgX, Thn, Th7, Thh, Tgi, TgC; + E Tgm, Tgy; + { + E TeQ, TjB, Tf1, TjC, TeV, Tf0; + TeQ = TeM + TeP; + TjB = Tjm - Tjl; + TeV = TeR + TeU; + Tf0 = TeW - TeZ; + Tf1 = TeV + Tf0; + TjC = Tf0 - TeV; + Tf2 = FNMS(KP707106781, Tf1, TeQ); + TjJ = FNMS(KP707106781, TjC, TjB); + Tgo = FMA(KP707106781, Tf1, TeQ); + TjD = FMA(KP707106781, TjC, TjB); + } + { + E TgE, Tjn, TgH, Tjo, TgF, TgG; + TgE = TeM - TeP; + Tjn = Tjl + Tjm; + TgF = TeU - TeR; + TgG = TeW + TeZ; + TgH = TgF - TgG; + Tjo = TgF + TgG; + TgI = FMA(KP707106781, TgH, TgE); + Tjv = FNMS(KP707106781, Tjo, Tjn); + Tha = FNMS(KP707106781, TgH, TgE); + Tjp = FMA(KP707106781, Tjo, Tjn); + } + { + E Tfd, Tgp, Tfo, Tgq; + { + E Tf7, Tfc, Tfi, Tfn; + Tf7 = Tf5 + Tf6; + Tfc = Tf8 + Tfb; + Tfd = FNMS(KP414213562, Tfc, Tf7); + Tgp = FMA(KP414213562, Tf7, Tfc); + Tfi = Tfg + Tfh; + Tfn = Tfj + Tfm; + Tfo = FMA(KP414213562, Tfn, Tfi); + Tgq = FNMS(KP414213562, Tfi, Tfn); + } + Tfp = Tfd - Tfo; + Tjw = Tgq - Tgp; + Tgr = Tgp + Tgq; + Tjq = Tfd + Tfo; + } + { + E Th0, Thj, Th3, Thi; + { + E TgY, TgZ, Th1, Th2; + TgY = Tg9 - Tgc; + TgZ = Tg6 - Tg1; + Th0 = FNMS(KP707106781, TgZ, TgY); + Thj = FMA(KP707106781, TgZ, TgY); + Th1 = TfU - TfV; + Th2 = Tge - Tgf; + Th3 = FNMS(KP707106781, Th2, Th1); + Thi = FMA(KP707106781, Th2, Th1); + } + Th4 = FNMS(KP668178637, Th3, Th0); + Tho = FMA(KP198912367, Thi, Thj); + Th8 = FMA(KP668178637, Th0, Th3); + Thk = FNMS(KP198912367, Thj, Thi); + } + { + E TfH, Tgu, TfQ, Tgt; + { + E Tfv, TfG, TfM, TfP; + Tfv = Tft + Tfu; + TfG = TfA + TfF; + TfH = FNMS(KP707106781, TfG, Tfv); + Tgu = FMA(KP707106781, TfG, Tfv); + TfM = TfI + TfL; + TfP = TfN + TfO; + TfQ = FNMS(KP707106781, TfP, TfM); + Tgt = FMA(KP707106781, TfP, TfM); + } + TfR = FMA(KP668178637, TfQ, TfH); + TgB = FNMS(KP198912367, Tgt, Tgu); + Tgl = FNMS(KP668178637, TfH, TfQ); + Tgv = FMA(KP198912367, Tgu, Tgt); + } + { + E TgL, Thb, TgO, Thc; + { + E TgJ, TgK, TgM, TgN; + TgJ = Tf5 - Tf6; + TgK = Tf8 - Tfb; + TgL = FMA(KP414213562, TgK, TgJ); + Thb = FNMS(KP414213562, TgJ, TgK); + TgM = Tfg - Tfh; + TgN = Tfj - Tfm; + TgO = FNMS(KP414213562, TgN, TgM); + Thc = FMA(KP414213562, TgM, TgN); + } + TgP = TgL - TgO; + TjK = TgL + TgO; + Thd = Thb + Thc; + TjE = Thc - Thb; + } + { + E TgT, Thg, TgW, Thf; + { + E TgR, TgS, TgU, TgV; + TgR = TfI - TfL; + TgS = TfF - TfA; + TgT = FNMS(KP707106781, TgS, TgR); + Thg = FMA(KP707106781, TgS, TgR); + TgU = Tft - Tfu; + TgV = TfN - TfO; + TgW = FNMS(KP707106781, TgV, TgU); + Thf = FMA(KP707106781, TgV, TgU); + } + TgX = FMA(KP668178637, TgW, TgT); + Thn = FNMS(KP198912367, Thf, Thg); + Th7 = FNMS(KP668178637, TgT, TgW); + Thh = FMA(KP198912367, Thg, Thf); + } + { + E Tg8, Tgx, Tgh, Tgw; + { + E TfW, Tg7, Tgd, Tgg; + TfW = TfU + TfV; + Tg7 = Tg1 + Tg6; + Tg8 = FNMS(KP707106781, Tg7, TfW); + Tgx = FMA(KP707106781, Tg7, TfW); + Tgd = Tg9 + Tgc; + Tgg = Tge + Tgf; + Tgh = FNMS(KP707106781, Tgg, Tgd); + Tgw = FMA(KP707106781, Tgg, Tgd); + } + Tgi = FNMS(KP668178637, Tgh, Tg8); + TgC = FMA(KP198912367, Tgw, Tgx); + Tgm = FMA(KP668178637, Tg8, Tgh); + Tgy = FNMS(KP198912367, Tgx, Tgw); + } + { + E Tfq, Tgj, Tjx, Tjy; + Tfq = FMA(KP923879532, Tfp, Tf2); + Tgj = TfR - Tgi; + ri[WS(rs, 42)] = FNMS(KP831469612, Tgj, Tfq); + ri[WS(rs, 10)] = FMA(KP831469612, Tgj, Tfq); + Tjx = FMA(KP923879532, Tjw, Tjv); + Tjy = Tgm - Tgl; + ii[WS(rs, 10)] = FMA(KP831469612, Tjy, Tjx); + ii[WS(rs, 42)] = FNMS(KP831469612, Tjy, Tjx); + } + { + E Tgk, Tgn, Tjz, TjA; + Tgk = FNMS(KP923879532, Tfp, Tf2); + Tgn = Tgl + Tgm; + ri[WS(rs, 26)] = FNMS(KP831469612, Tgn, Tgk); + ri[WS(rs, 58)] = FMA(KP831469612, Tgn, Tgk); + Tjz = FNMS(KP923879532, Tjw, Tjv); + TjA = TfR + Tgi; + ii[WS(rs, 26)] = FNMS(KP831469612, TjA, Tjz); + ii[WS(rs, 58)] = FMA(KP831469612, TjA, Tjz); + } + { + E Tgs, Tgz, Tjr, Tjs; + Tgs = FMA(KP923879532, Tgr, Tgo); + Tgz = Tgv + Tgy; + ri[WS(rs, 34)] = FNMS(KP980785280, Tgz, Tgs); + ri[WS(rs, 2)] = FMA(KP980785280, Tgz, Tgs); + Tjr = FMA(KP923879532, Tjq, Tjp); + Tjs = TgB + TgC; + ii[WS(rs, 2)] = FMA(KP980785280, Tjs, Tjr); + ii[WS(rs, 34)] = FNMS(KP980785280, Tjs, Tjr); + } + { + E TgA, TgD, Tjt, Tju; + TgA = FNMS(KP923879532, Tgr, Tgo); + TgD = TgB - TgC; + ri[WS(rs, 50)] = FNMS(KP980785280, TgD, TgA); + ri[WS(rs, 18)] = FMA(KP980785280, TgD, TgA); + Tjt = FNMS(KP923879532, Tjq, Tjp); + Tju = Tgy - Tgv; + ii[WS(rs, 18)] = FMA(KP980785280, Tju, Tjt); + ii[WS(rs, 50)] = FNMS(KP980785280, Tju, Tjt); + } + { + E TgQ, Th5, TjF, TjG; + TgQ = FMA(KP923879532, TgP, TgI); + Th5 = TgX + Th4; + ri[WS(rs, 38)] = FNMS(KP831469612, Th5, TgQ); + ri[WS(rs, 6)] = FMA(KP831469612, Th5, TgQ); + TjF = FMA(KP923879532, TjE, TjD); + TjG = Th7 + Th8; + ii[WS(rs, 6)] = FMA(KP831469612, TjG, TjF); + ii[WS(rs, 38)] = FNMS(KP831469612, TjG, TjF); + } + { + E Th6, Th9, TjH, TjI; + Th6 = FNMS(KP923879532, TgP, TgI); + Th9 = Th7 - Th8; + ri[WS(rs, 54)] = FNMS(KP831469612, Th9, Th6); + ri[WS(rs, 22)] = FMA(KP831469612, Th9, Th6); + TjH = FNMS(KP923879532, TjE, TjD); + TjI = Th4 - TgX; + ii[WS(rs, 22)] = FMA(KP831469612, TjI, TjH); + ii[WS(rs, 54)] = FNMS(KP831469612, TjI, TjH); + } + { + E The, Thl, TjL, TjM; + The = FNMS(KP923879532, Thd, Tha); + Thl = Thh - Thk; + ri[WS(rs, 46)] = FNMS(KP980785280, Thl, The); + ri[WS(rs, 14)] = FMA(KP980785280, Thl, The); + TjL = FNMS(KP923879532, TjK, TjJ); + TjM = Tho - Thn; + ii[WS(rs, 14)] = FMA(KP980785280, TjM, TjL); + ii[WS(rs, 46)] = FNMS(KP980785280, TjM, TjL); + } + { + E Thm, Thp, TjN, TjO; + Thm = FMA(KP923879532, Thd, Tha); + Thp = Thn + Tho; + ri[WS(rs, 30)] = FNMS(KP980785280, Thp, Thm); + ri[WS(rs, 62)] = FMA(KP980785280, Thp, Thm); + TjN = FMA(KP923879532, TjK, TjJ); + TjO = Thh + Thk; + ii[WS(rs, 30)] = FNMS(KP980785280, TjO, TjN); + ii[WS(rs, 62)] = FMA(KP980785280, TjO, TjN); + } + } + { + E T99, Tkw, TbB, Tkq, Taj, TbL, Tbv, TbF, Tce, Tcy, Tci, Tcu, Tc7, Tcx, Tch; + E Tcr, TbZ, TkK, Tcn, TkE, Tbs, TbM, Tbw, TbI, T80, TkD, TkJ, Tby, TbS, Tkp; + E Tkv, Tck; + { + E T8z, Tbz, T98, TbA; + { + E T8n, T8y, T8W, T97; + T8n = FNMS(KP707106781, T8m, T87); + T8y = FNMS(KP707106781, T8x, T8u); + T8z = FNMS(KP668178637, T8y, T8n); + Tbz = FMA(KP668178637, T8n, T8y); + T8W = FNMS(KP707106781, T8V, T8G); + T97 = FNMS(KP707106781, T96, T93); + T98 = FMA(KP668178637, T97, T8W); + TbA = FNMS(KP668178637, T8W, T97); + } + T99 = T8z - T98; + Tkw = TbA - Tbz; + TbB = Tbz + TbA; + Tkq = T8z + T98; + } + { + E Ta3, TbE, Tai, TbD; + { + E T9x, Ta2, Tae, Tah; + T9x = FNMS(KP707106781, T9w, T9h); + Ta2 = T9M - Ta1; + Ta3 = FNMS(KP923879532, Ta2, T9x); + TbE = FMA(KP923879532, Ta2, T9x); + Tae = FNMS(KP707106781, Tad, Taa); + Tah = Taf - Tag; + Tai = FNMS(KP923879532, Tah, Tae); + TbD = FMA(KP923879532, Tah, Tae); + } + Taj = FMA(KP534511135, Tai, Ta3); + TbL = FNMS(KP303346683, TbD, TbE); + Tbv = FNMS(KP534511135, Ta3, Tai); + TbF = FMA(KP303346683, TbE, TbD); + } + { + E Tca, Tct, Tcd, Tcs; + { + E Tc8, Tc9, Tcb, Tcc; + Tc8 = FMA(KP707106781, Tbm, Tbj); + Tc9 = Tba + TaV; + Tca = FNMS(KP923879532, Tc9, Tc8); + Tct = FMA(KP923879532, Tc9, Tc8); + Tcb = FMA(KP707106781, TaF, Taq); + Tcc = Tbo + Tbp; + Tcd = FNMS(KP923879532, Tcc, Tcb); + Tcs = FMA(KP923879532, Tcc, Tcb); + } + Tce = FNMS(KP820678790, Tcd, Tca); + Tcy = FMA(KP098491403, Tcs, Tct); + Tci = FMA(KP820678790, Tca, Tcd); + Tcu = FNMS(KP098491403, Tct, Tcs); + } + { + E Tc3, Tcq, Tc6, Tcp; + { + E Tc1, Tc2, Tc4, Tc5; + Tc1 = FMA(KP707106781, Tad, Taa); + Tc2 = Ta1 + T9M; + Tc3 = FNMS(KP923879532, Tc2, Tc1); + Tcq = FMA(KP923879532, Tc2, Tc1); + Tc4 = FMA(KP707106781, T9w, T9h); + Tc5 = Taf + Tag; + Tc6 = FNMS(KP923879532, Tc5, Tc4); + Tcp = FMA(KP923879532, Tc5, Tc4); + } + Tc7 = FMA(KP820678790, Tc6, Tc3); + Tcx = FNMS(KP098491403, Tcp, Tcq); + Tch = FNMS(KP820678790, Tc3, Tc6); + Tcr = FMA(KP098491403, Tcq, Tcp); + } + { + E TbV, Tcl, TbY, Tcm; + { + E TbT, TbU, TbW, TbX; + TbT = FMA(KP707106781, T8m, T87); + TbU = FMA(KP707106781, T8x, T8u); + TbV = FMA(KP198912367, TbU, TbT); + Tcl = FNMS(KP198912367, TbT, TbU); + TbW = FMA(KP707106781, T8V, T8G); + TbX = FMA(KP707106781, T96, T93); + TbY = FNMS(KP198912367, TbX, TbW); + Tcm = FMA(KP198912367, TbW, TbX); + } + TbZ = TbV - TbY; + TkK = TbV + TbY; + Tcn = Tcl + Tcm; + TkE = Tcm - Tcl; + } + { + E Tbc, TbH, Tbr, TbG; + { + E TaG, Tbb, Tbn, Tbq; + TaG = FNMS(KP707106781, TaF, Taq); + Tbb = TaV - Tba; + Tbc = FNMS(KP923879532, Tbb, TaG); + TbH = FMA(KP923879532, Tbb, TaG); + Tbn = FNMS(KP707106781, Tbm, Tbj); + Tbq = Tbo - Tbp; + Tbr = FNMS(KP923879532, Tbq, Tbn); + TbG = FMA(KP923879532, Tbq, Tbn); + } + Tbs = FNMS(KP534511135, Tbr, Tbc); + TbM = FMA(KP303346683, TbG, TbH); + Tbw = FMA(KP534511135, Tbc, Tbr); + TbI = FNMS(KP303346683, TbH, TbG); + } + { + E T7u, TbO, Tkn, TkB, T7Z, TkC, TbR, Tko, T7t, Tkm; + T7t = T7l - T7s; + T7u = FMA(KP707106781, T7t, T7e); + TbO = FNMS(KP707106781, T7t, T7e); + Tkm = TcC - TcB; + Tkn = FMA(KP707106781, Tkm, Tkl); + TkB = FNMS(KP707106781, Tkm, Tkl); + { + E T7J, T7Y, TbP, TbQ; + T7J = FMA(KP414213562, T7I, T7B); + T7Y = FNMS(KP414213562, T7X, T7Q); + T7Z = T7J - T7Y; + TkC = T7J + T7Y; + TbP = FNMS(KP414213562, T7B, T7I); + TbQ = FMA(KP414213562, T7Q, T7X); + TbR = TbP + TbQ; + Tko = TbQ - TbP; + } + T80 = FNMS(KP923879532, T7Z, T7u); + TkD = FNMS(KP923879532, TkC, TkB); + TkJ = FMA(KP923879532, TkC, TkB); + Tby = FMA(KP923879532, T7Z, T7u); + TbS = FNMS(KP923879532, TbR, TbO); + Tkp = FMA(KP923879532, Tko, Tkn); + Tkv = FNMS(KP923879532, Tko, Tkn); + Tck = FMA(KP923879532, TbR, TbO); + } + { + E T9a, Tbt, Tkx, Tky; + T9a = FMA(KP831469612, T99, T80); + Tbt = Taj - Tbs; + ri[WS(rs, 43)] = FNMS(KP881921264, Tbt, T9a); + ri[WS(rs, 11)] = FMA(KP881921264, Tbt, T9a); + Tkx = FMA(KP831469612, Tkw, Tkv); + Tky = Tbw - Tbv; + ii[WS(rs, 11)] = FMA(KP881921264, Tky, Tkx); + ii[WS(rs, 43)] = FNMS(KP881921264, Tky, Tkx); + } + { + E Tbu, Tbx, Tkz, TkA; + Tbu = FNMS(KP831469612, T99, T80); + Tbx = Tbv + Tbw; + ri[WS(rs, 27)] = FNMS(KP881921264, Tbx, Tbu); + ri[WS(rs, 59)] = FMA(KP881921264, Tbx, Tbu); + Tkz = FNMS(KP831469612, Tkw, Tkv); + TkA = Taj + Tbs; + ii[WS(rs, 27)] = FNMS(KP881921264, TkA, Tkz); + ii[WS(rs, 59)] = FMA(KP881921264, TkA, Tkz); + } + { + E TbC, TbJ, Tkr, Tks; + TbC = FMA(KP831469612, TbB, Tby); + TbJ = TbF + TbI; + ri[WS(rs, 35)] = FNMS(KP956940335, TbJ, TbC); + ri[WS(rs, 3)] = FMA(KP956940335, TbJ, TbC); + Tkr = FMA(KP831469612, Tkq, Tkp); + Tks = TbL + TbM; + ii[WS(rs, 3)] = FMA(KP956940335, Tks, Tkr); + ii[WS(rs, 35)] = FNMS(KP956940335, Tks, Tkr); + } + { + E TbK, TbN, Tkt, Tku; + TbK = FNMS(KP831469612, TbB, Tby); + TbN = TbL - TbM; + ri[WS(rs, 51)] = FNMS(KP956940335, TbN, TbK); + ri[WS(rs, 19)] = FMA(KP956940335, TbN, TbK); + Tkt = FNMS(KP831469612, Tkq, Tkp); + Tku = TbI - TbF; + ii[WS(rs, 19)] = FMA(KP956940335, Tku, Tkt); + ii[WS(rs, 51)] = FNMS(KP956940335, Tku, Tkt); + } + { + E Tc0, Tcf, TkF, TkG; + Tc0 = FMA(KP980785280, TbZ, TbS); + Tcf = Tc7 + Tce; + ri[WS(rs, 39)] = FNMS(KP773010453, Tcf, Tc0); + ri[WS(rs, 7)] = FMA(KP773010453, Tcf, Tc0); + TkF = FMA(KP980785280, TkE, TkD); + TkG = Tch + Tci; + ii[WS(rs, 7)] = FMA(KP773010453, TkG, TkF); + ii[WS(rs, 39)] = FNMS(KP773010453, TkG, TkF); + } + { + E Tcg, Tcj, TkH, TkI; + Tcg = FNMS(KP980785280, TbZ, TbS); + Tcj = Tch - Tci; + ri[WS(rs, 55)] = FNMS(KP773010453, Tcj, Tcg); + ri[WS(rs, 23)] = FMA(KP773010453, Tcj, Tcg); + TkH = FNMS(KP980785280, TkE, TkD); + TkI = Tce - Tc7; + ii[WS(rs, 23)] = FMA(KP773010453, TkI, TkH); + ii[WS(rs, 55)] = FNMS(KP773010453, TkI, TkH); + } + { + E Tco, Tcv, TkL, TkM; + Tco = FNMS(KP980785280, Tcn, Tck); + Tcv = Tcr - Tcu; + ri[WS(rs, 47)] = FNMS(KP995184726, Tcv, Tco); + ri[WS(rs, 15)] = FMA(KP995184726, Tcv, Tco); + TkL = FNMS(KP980785280, TkK, TkJ); + TkM = Tcy - Tcx; + ii[WS(rs, 15)] = FMA(KP995184726, TkM, TkL); + ii[WS(rs, 47)] = FNMS(KP995184726, TkM, TkL); + } + { + E Tcw, Tcz, TkN, TkO; + Tcw = FMA(KP980785280, Tcn, Tck); + Tcz = Tcx + Tcy; + ri[WS(rs, 31)] = FNMS(KP995184726, Tcz, Tcw); + ri[WS(rs, 63)] = FMA(KP995184726, Tcz, Tcw); + TkN = FMA(KP980785280, TkK, TkJ); + TkO = Tcr + Tcu; + ii[WS(rs, 31)] = FNMS(KP995184726, TkO, TkN); + ii[WS(rs, 63)] = FMA(KP995184726, TkO, TkN); + } + } + { + E Td1, Tk2, TdN, TjW, Tdl, TdX, TdH, TdR, Teq, TeK, Teu, TeG, Tej, TeJ, Tet; + E TeD, Teb, Tkg, Tez, Tka, TdE, TdY, TdI, TdU, TcM, Tk9, Tkf, TdK, Te4, TjV; + E Tk1, Tew; + { + E TcT, TdL, Td0, TdM; + { + E TcP, TcS, TcW, TcZ; + TcP = FMA(KP707106781, TcO, TcN); + TcS = FMA(KP707106781, TcR, TcQ); + TcT = FNMS(KP198912367, TcS, TcP); + TdL = FMA(KP198912367, TcP, TcS); + TcW = FMA(KP707106781, TcV, TcU); + TcZ = FMA(KP707106781, TcY, TcX); + Td0 = FMA(KP198912367, TcZ, TcW); + TdM = FNMS(KP198912367, TcW, TcZ); + } + Td1 = TcT - Td0; + Tk2 = TdM - TdL; + TdN = TdL + TdM; + TjW = TcT + Td0; + } + { + E Tdd, TdQ, Tdk, TdP; + { + E Td5, Tdc, Tdg, Tdj; + Td5 = FMA(KP707106781, Td4, Td3); + Tdc = Td8 + Tdb; + Tdd = FNMS(KP923879532, Tdc, Td5); + TdQ = FMA(KP923879532, Tdc, Td5); + Tdg = FMA(KP707106781, Tdf, Tde); + Tdj = Tdh + Tdi; + Tdk = FNMS(KP923879532, Tdj, Tdg); + TdP = FMA(KP923879532, Tdj, Tdg); + } + Tdl = FMA(KP820678790, Tdk, Tdd); + TdX = FNMS(KP098491403, TdP, TdQ); + TdH = FNMS(KP820678790, Tdd, Tdk); + TdR = FMA(KP098491403, TdQ, TdP); + } + { + E Tem, TeF, Tep, TeE; + { + E Tek, Tel, Ten, Teo; + Tek = FNMS(KP707106781, Tdy, Tdx); + Tel = Tdu - Tdr; + Tem = FNMS(KP923879532, Tel, Tek); + TeF = FMA(KP923879532, Tel, Tek); + Ten = FNMS(KP707106781, Tdn, Tdm); + Teo = TdA - TdB; + Tep = FNMS(KP923879532, Teo, Ten); + TeE = FMA(KP923879532, Teo, Ten); + } + Teq = FNMS(KP534511135, Tep, Tem); + TeK = FMA(KP303346683, TeE, TeF); + Teu = FMA(KP534511135, Tem, Tep); + TeG = FNMS(KP303346683, TeF, TeE); + } + { + E Tef, TeC, Tei, TeB; + { + E Ted, Tee, Teg, Teh; + Ted = FNMS(KP707106781, Tdf, Tde); + Tee = Tdb - Td8; + Tef = FNMS(KP923879532, Tee, Ted); + TeC = FMA(KP923879532, Tee, Ted); + Teg = FNMS(KP707106781, Td4, Td3); + Teh = Tdh - Tdi; + Tei = FNMS(KP923879532, Teh, Teg); + TeB = FMA(KP923879532, Teh, Teg); + } + Tej = FMA(KP534511135, Tei, Tef); + TeJ = FNMS(KP303346683, TeB, TeC); + Tet = FNMS(KP534511135, Tef, Tei); + TeD = FMA(KP303346683, TeC, TeB); + } + { + E Te7, Tex, Tea, Tey; + { + E Te5, Te6, Te8, Te9; + Te5 = FNMS(KP707106781, TcO, TcN); + Te6 = FNMS(KP707106781, TcR, TcQ); + Te7 = FMA(KP668178637, Te6, Te5); + Tex = FNMS(KP668178637, Te5, Te6); + Te8 = FNMS(KP707106781, TcV, TcU); + Te9 = FNMS(KP707106781, TcY, TcX); + Tea = FNMS(KP668178637, Te9, Te8); + Tey = FMA(KP668178637, Te8, Te9); + } + Teb = Te7 - Tea; + Tkg = Te7 + Tea; + Tez = Tex + Tey; + Tka = Tey - Tex; + } + { + E Tdw, TdT, TdD, TdS; + { + E Tdo, Tdv, Tdz, TdC; + Tdo = FMA(KP707106781, Tdn, Tdm); + Tdv = Tdr + Tdu; + Tdw = FNMS(KP923879532, Tdv, Tdo); + TdT = FMA(KP923879532, Tdv, Tdo); + Tdz = FMA(KP707106781, Tdy, Tdx); + TdC = TdA + TdB; + TdD = FNMS(KP923879532, TdC, Tdz); + TdS = FMA(KP923879532, TdC, Tdz); + } + TdE = FNMS(KP820678790, TdD, Tdw); + TdY = FMA(KP098491403, TdS, TdT); + TdI = FMA(KP820678790, Tdw, TdD); + TdU = FNMS(KP098491403, TdT, TdS); + } + { + E TcE, Te0, TjT, Tk7, TcL, Tk8, Te3, TjU, TcD, TjS; + TcD = TcB + TcC; + TcE = FMA(KP707106781, TcD, TcA); + Te0 = FNMS(KP707106781, TcD, TcA); + TjS = T7l + T7s; + TjT = FMA(KP707106781, TjS, TjR); + Tk7 = FNMS(KP707106781, TjS, TjR); + { + E TcH, TcK, Te1, Te2; + TcH = FMA(KP414213562, TcG, TcF); + TcK = FNMS(KP414213562, TcJ, TcI); + TcL = TcH + TcK; + Tk8 = TcK - TcH; + Te1 = FNMS(KP414213562, TcF, TcG); + Te2 = FMA(KP414213562, TcI, TcJ); + Te3 = Te1 - Te2; + TjU = Te1 + Te2; + } + TcM = FNMS(KP923879532, TcL, TcE); + Tk9 = FMA(KP923879532, Tk8, Tk7); + Tkf = FNMS(KP923879532, Tk8, Tk7); + TdK = FMA(KP923879532, TcL, TcE); + Te4 = FMA(KP923879532, Te3, Te0); + TjV = FMA(KP923879532, TjU, TjT); + Tk1 = FNMS(KP923879532, TjU, TjT); + Tew = FNMS(KP923879532, Te3, Te0); + } + { + E Td2, TdF, Tk3, Tk4; + Td2 = FMA(KP980785280, Td1, TcM); + TdF = Tdl - TdE; + ri[WS(rs, 41)] = FNMS(KP773010453, TdF, Td2); + ri[WS(rs, 9)] = FMA(KP773010453, TdF, Td2); + Tk3 = FMA(KP980785280, Tk2, Tk1); + Tk4 = TdI - TdH; + ii[WS(rs, 9)] = FMA(KP773010453, Tk4, Tk3); + ii[WS(rs, 41)] = FNMS(KP773010453, Tk4, Tk3); + } + { + E TdG, TdJ, Tk5, Tk6; + TdG = FNMS(KP980785280, Td1, TcM); + TdJ = TdH + TdI; + ri[WS(rs, 25)] = FNMS(KP773010453, TdJ, TdG); + ri[WS(rs, 57)] = FMA(KP773010453, TdJ, TdG); + Tk5 = FNMS(KP980785280, Tk2, Tk1); + Tk6 = Tdl + TdE; + ii[WS(rs, 25)] = FNMS(KP773010453, Tk6, Tk5); + ii[WS(rs, 57)] = FMA(KP773010453, Tk6, Tk5); + } + { + E TdO, TdV, TjX, TjY; + TdO = FMA(KP980785280, TdN, TdK); + TdV = TdR + TdU; + ri[WS(rs, 33)] = FNMS(KP995184726, TdV, TdO); + ri[WS(rs, 1)] = FMA(KP995184726, TdV, TdO); + TjX = FMA(KP980785280, TjW, TjV); + TjY = TdX + TdY; + ii[WS(rs, 1)] = FMA(KP995184726, TjY, TjX); + ii[WS(rs, 33)] = FNMS(KP995184726, TjY, TjX); + } + { + E TdW, TdZ, TjZ, Tk0; + TdW = FNMS(KP980785280, TdN, TdK); + TdZ = TdX - TdY; + ri[WS(rs, 49)] = FNMS(KP995184726, TdZ, TdW); + ri[WS(rs, 17)] = FMA(KP995184726, TdZ, TdW); + TjZ = FNMS(KP980785280, TjW, TjV); + Tk0 = TdU - TdR; + ii[WS(rs, 17)] = FMA(KP995184726, Tk0, TjZ); + ii[WS(rs, 49)] = FNMS(KP995184726, Tk0, TjZ); + } + { + E Tec, Ter, Tkb, Tkc; + Tec = FMA(KP831469612, Teb, Te4); + Ter = Tej + Teq; + ri[WS(rs, 37)] = FNMS(KP881921264, Ter, Tec); + ri[WS(rs, 5)] = FMA(KP881921264, Ter, Tec); + Tkb = FMA(KP831469612, Tka, Tk9); + Tkc = Tet + Teu; + ii[WS(rs, 5)] = FMA(KP881921264, Tkc, Tkb); + ii[WS(rs, 37)] = FNMS(KP881921264, Tkc, Tkb); + } + { + E Tes, Tev, Tkd, Tke; + Tes = FNMS(KP831469612, Teb, Te4); + Tev = Tet - Teu; + ri[WS(rs, 53)] = FNMS(KP881921264, Tev, Tes); + ri[WS(rs, 21)] = FMA(KP881921264, Tev, Tes); + Tkd = FNMS(KP831469612, Tka, Tk9); + Tke = Teq - Tej; + ii[WS(rs, 21)] = FMA(KP881921264, Tke, Tkd); + ii[WS(rs, 53)] = FNMS(KP881921264, Tke, Tkd); + } + { + E TeA, TeH, Tkh, Tki; + TeA = FNMS(KP831469612, Tez, Tew); + TeH = TeD - TeG; + ri[WS(rs, 45)] = FNMS(KP956940335, TeH, TeA); + ri[WS(rs, 13)] = FMA(KP956940335, TeH, TeA); + Tkh = FNMS(KP831469612, Tkg, Tkf); + Tki = TeK - TeJ; + ii[WS(rs, 13)] = FMA(KP956940335, Tki, Tkh); + ii[WS(rs, 45)] = FNMS(KP956940335, Tki, Tkh); + } + { + E TeI, TeL, Tkj, Tkk; + TeI = FMA(KP831469612, Tez, Tew); + TeL = TeJ + TeK; + ri[WS(rs, 29)] = FNMS(KP956940335, TeL, TeI); + ri[WS(rs, 61)] = FMA(KP956940335, TeL, TeI); + Tkj = FMA(KP831469612, Tkg, Tkf); + Tkk = TeD + TeG; + ii[WS(rs, 29)] = FNMS(KP956940335, Tkk, Tkj); + ii[WS(rs, 61)] = FMA(KP956940335, Tkk, Tkj); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 64}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 64, "t1_64", twinstr, &GENUS, {520, 126, 518, 0}, 0, 0, 0 }; + +void X(codelet_t1_64) (planner *p) { + X(kdft_dit_register) (p, t1_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 64 -name t1_64 -include dft/scalar/t.h */ + +/* + * This function contains 1038 FP additions, 500 FP multiplications, + * (or, 808 additions, 270 multiplications, 230 fused multiply/add), + * 176 stack variables, 15 constants, and 256 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 126); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 126, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tj, TcL, ThT, Tin, T6b, Taz, TgT, Thn, TG, Thm, TcO, TgO, T6m, ThQ, TaC; + E Tim, T14, Tfq, T6y, T9O, TaG, Tc0, TcU, TeE, T1r, Tfr, T6J, T9P, TaJ, Tc1; + E TcZ, TeF, T1Q, T2d, Tfx, Tfu, Tfv, Tfw, T6Q, TaM, Tdb, TeJ, T71, TaQ, T7a; + E TaN, Td6, TeI, T77, TaP, T2B, T2Y, Tfz, TfA, TfB, TfC, T7h, TaW, Tdm, TeM; + E T7s, TaU, T7B, TaX, Tdh, TeL, T7y, TaT, T5j, TfR, Tec, Tf0, TfY, Tgy, T8D; + E Tbl, T8O, Tbx, T9l, Tbm, TdV, TeX, T9i, Tbw, T3M, TfL, TdL, TeQ, TfI, Tgt; + E T7K, Tb2, T7V, Tbe, T8s, Tb3, Tdu, TeT, T8p, Tbd, T4x, TfJ, TdE, TdM, TfO; + E Tgu, T87, T8v, T8i, T8u, Tba, Tbg, Tdz, TdN, Tb7, Tbh, T64, TfZ, Te5, Ted; + E TfU, Tgz, T90, T9o, T9b, T9n, Tbt, Tbz, Te0, Tee, Tbq, TbA; + { + E T1, TgR, T6, TgQ, Tc, T68, Th, T69; + T1 = ri[0]; + TgR = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 32)]; + T5 = ii[WS(rs, 32)]; + T2 = W[62]; + T4 = W[63]; + T6 = FMA(T2, T3, T4 * T5); + TgQ = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 16)]; + Tb = ii[WS(rs, 16)]; + T8 = W[30]; + Ta = W[31]; + Tc = FMA(T8, T9, Ta * Tb); + T68 = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 48)]; + Tg = ii[WS(rs, 48)]; + Td = W[94]; + Tf = W[95]; + Th = FMA(Td, Te, Tf * Tg); + T69 = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, ThR, ThS; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 + Ti; + TcL = T7 - Ti; + ThR = TgR - TgQ; + ThS = Tc - Th; + ThT = ThR - ThS; + Tin = ThS + ThR; + } + { + E T67, T6a, TgP, TgS; + T67 = T1 - T6; + T6a = T68 - T69; + T6b = T67 - T6a; + Taz = T67 + T6a; + TgP = T68 + T69; + TgS = TgQ + TgR; + TgT = TgP + TgS; + Thn = TgS - TgP; + } + } + { + E To, T6c, Tt, T6d, T6e, T6f, Tz, T6i, TE, T6j, T6h, T6k; + { + E Tl, Tn, Tk, Tm; + Tl = ri[WS(rs, 8)]; + Tn = ii[WS(rs, 8)]; + Tk = W[14]; + Tm = W[15]; + To = FMA(Tk, Tl, Tm * Tn); + T6c = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = ri[WS(rs, 40)]; + Ts = ii[WS(rs, 40)]; + Tp = W[78]; + Tr = W[79]; + Tt = FMA(Tp, Tq, Tr * Ts); + T6d = FNMS(Tr, Tq, Tp * Ts); + } + T6e = T6c - T6d; + T6f = To - Tt; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 56)]; + Ty = ii[WS(rs, 56)]; + Tv = W[110]; + Tx = W[111]; + Tz = FMA(Tv, Tw, Tx * Ty); + T6i = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 24)]; + TD = ii[WS(rs, 24)]; + TA = W[46]; + TC = W[47]; + TE = FMA(TA, TB, TC * TD); + T6j = FNMS(TC, TB, TA * TD); + } + T6h = Tz - TE; + T6k = T6i - T6j; + { + E Tu, TF, TcM, TcN; + Tu = To + Tt; + TF = Tz + TE; + TG = Tu + TF; + Thm = TF - Tu; + TcM = T6c + T6d; + TcN = T6i + T6j; + TcO = TcM - TcN; + TgO = TcM + TcN; + } + { + E T6g, T6l, TaA, TaB; + T6g = T6e - T6f; + T6l = T6h + T6k; + T6m = KP707106781 * (T6g - T6l); + ThQ = KP707106781 * (T6g + T6l); + TaA = T6f + T6e; + TaB = T6h - T6k; + TaC = KP707106781 * (TaA + TaB); + Tim = KP707106781 * (TaB - TaA); + } + } + { + E TS, TcQ, T6q, T6t, T13, TcR, T6r, T6w, T6s, T6x; + { + E TM, T6o, TR, T6p; + { + E TJ, TL, TI, TK; + TJ = ri[WS(rs, 4)]; + TL = ii[WS(rs, 4)]; + TI = W[6]; + TK = W[7]; + TM = FMA(TI, TJ, TK * TL); + T6o = FNMS(TK, TJ, TI * TL); + } + { + E TO, TQ, TN, TP; + TO = ri[WS(rs, 36)]; + TQ = ii[WS(rs, 36)]; + TN = W[70]; + TP = W[71]; + TR = FMA(TN, TO, TP * TQ); + T6p = FNMS(TP, TO, TN * TQ); + } + TS = TM + TR; + TcQ = T6o + T6p; + T6q = T6o - T6p; + T6t = TM - TR; + } + { + E TX, T6u, T12, T6v; + { + E TU, TW, TT, TV; + TU = ri[WS(rs, 20)]; + TW = ii[WS(rs, 20)]; + TT = W[38]; + TV = W[39]; + TX = FMA(TT, TU, TV * TW); + T6u = FNMS(TV, TU, TT * TW); + } + { + E TZ, T11, TY, T10; + TZ = ri[WS(rs, 52)]; + T11 = ii[WS(rs, 52)]; + TY = W[102]; + T10 = W[103]; + T12 = FMA(TY, TZ, T10 * T11); + T6v = FNMS(T10, TZ, TY * T11); + } + T13 = TX + T12; + TcR = T6u + T6v; + T6r = TX - T12; + T6w = T6u - T6v; + } + T14 = TS + T13; + Tfq = TcQ + TcR; + T6s = T6q + T6r; + T6x = T6t - T6w; + T6y = FNMS(KP923879532, T6x, KP382683432 * T6s); + T9O = FMA(KP923879532, T6s, KP382683432 * T6x); + { + E TaE, TaF, TcS, TcT; + TaE = T6q - T6r; + TaF = T6t + T6w; + TaG = FNMS(KP382683432, TaF, KP923879532 * TaE); + Tc0 = FMA(KP382683432, TaE, KP923879532 * TaF); + TcS = TcQ - TcR; + TcT = TS - T13; + TcU = TcS - TcT; + TeE = TcT + TcS; + } + } + { + E T1f, TcW, T6B, T6E, T1q, TcX, T6C, T6H, T6D, T6I; + { + E T19, T6z, T1e, T6A; + { + E T16, T18, T15, T17; + T16 = ri[WS(rs, 60)]; + T18 = ii[WS(rs, 60)]; + T15 = W[118]; + T17 = W[119]; + T19 = FMA(T15, T16, T17 * T18); + T6z = FNMS(T17, T16, T15 * T18); + } + { + E T1b, T1d, T1a, T1c; + T1b = ri[WS(rs, 28)]; + T1d = ii[WS(rs, 28)]; + T1a = W[54]; + T1c = W[55]; + T1e = FMA(T1a, T1b, T1c * T1d); + T6A = FNMS(T1c, T1b, T1a * T1d); + } + T1f = T19 + T1e; + TcW = T6z + T6A; + T6B = T6z - T6A; + T6E = T19 - T1e; + } + { + E T1k, T6F, T1p, T6G; + { + E T1h, T1j, T1g, T1i; + T1h = ri[WS(rs, 12)]; + T1j = ii[WS(rs, 12)]; + T1g = W[22]; + T1i = W[23]; + T1k = FMA(T1g, T1h, T1i * T1j); + T6F = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1m, T1o, T1l, T1n; + T1m = ri[WS(rs, 44)]; + T1o = ii[WS(rs, 44)]; + T1l = W[86]; + T1n = W[87]; + T1p = FMA(T1l, T1m, T1n * T1o); + T6G = FNMS(T1n, T1m, T1l * T1o); + } + T1q = T1k + T1p; + TcX = T6F + T6G; + T6C = T1k - T1p; + T6H = T6F - T6G; + } + T1r = T1f + T1q; + Tfr = TcW + TcX; + T6D = T6B + T6C; + T6I = T6E - T6H; + T6J = FMA(KP382683432, T6D, KP923879532 * T6I); + T9P = FNMS(KP923879532, T6D, KP382683432 * T6I); + { + E TaH, TaI, TcV, TcY; + TaH = T6B - T6C; + TaI = T6E + T6H; + TaJ = FMA(KP923879532, TaH, KP382683432 * TaI); + Tc1 = FNMS(KP382683432, TaH, KP923879532 * TaI); + TcV = T1f - T1q; + TcY = TcW - TcX; + TcZ = TcV + TcY; + TeF = TcV - TcY; + } + } + { + E T1y, T6M, T1D, T6N, T1E, Td2, T1J, T74, T1O, T75, T1P, Td3, T21, Td8, T6W; + E T6Z, T2c, Td9, T6R, T6U; + { + E T1v, T1x, T1u, T1w; + T1v = ri[WS(rs, 2)]; + T1x = ii[WS(rs, 2)]; + T1u = W[2]; + T1w = W[3]; + T1y = FMA(T1u, T1v, T1w * T1x); + T6M = FNMS(T1w, T1v, T1u * T1x); + } + { + E T1A, T1C, T1z, T1B; + T1A = ri[WS(rs, 34)]; + T1C = ii[WS(rs, 34)]; + T1z = W[66]; + T1B = W[67]; + T1D = FMA(T1z, T1A, T1B * T1C); + T6N = FNMS(T1B, T1A, T1z * T1C); + } + T1E = T1y + T1D; + Td2 = T6M + T6N; + { + E T1G, T1I, T1F, T1H; + T1G = ri[WS(rs, 18)]; + T1I = ii[WS(rs, 18)]; + T1F = W[34]; + T1H = W[35]; + T1J = FMA(T1F, T1G, T1H * T1I); + T74 = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1L, T1N, T1K, T1M; + T1L = ri[WS(rs, 50)]; + T1N = ii[WS(rs, 50)]; + T1K = W[98]; + T1M = W[99]; + T1O = FMA(T1K, T1L, T1M * T1N); + T75 = FNMS(T1M, T1L, T1K * T1N); + } + T1P = T1J + T1O; + Td3 = T74 + T75; + { + E T1V, T6X, T20, T6Y; + { + E T1S, T1U, T1R, T1T; + T1S = ri[WS(rs, 10)]; + T1U = ii[WS(rs, 10)]; + T1R = W[18]; + T1T = W[19]; + T1V = FMA(T1R, T1S, T1T * T1U); + T6X = FNMS(T1T, T1S, T1R * T1U); + } + { + E T1X, T1Z, T1W, T1Y; + T1X = ri[WS(rs, 42)]; + T1Z = ii[WS(rs, 42)]; + T1W = W[82]; + T1Y = W[83]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T6Y = FNMS(T1Y, T1X, T1W * T1Z); + } + T21 = T1V + T20; + Td8 = T6X + T6Y; + T6W = T1V - T20; + T6Z = T6X - T6Y; + } + { + E T26, T6S, T2b, T6T; + { + E T23, T25, T22, T24; + T23 = ri[WS(rs, 58)]; + T25 = ii[WS(rs, 58)]; + T22 = W[114]; + T24 = W[115]; + T26 = FMA(T22, T23, T24 * T25); + T6S = FNMS(T24, T23, T22 * T25); + } + { + E T28, T2a, T27, T29; + T28 = ri[WS(rs, 26)]; + T2a = ii[WS(rs, 26)]; + T27 = W[50]; + T29 = W[51]; + T2b = FMA(T27, T28, T29 * T2a); + T6T = FNMS(T29, T28, T27 * T2a); + } + T2c = T26 + T2b; + Td9 = T6S + T6T; + T6R = T26 - T2b; + T6U = T6S - T6T; + } + T1Q = T1E + T1P; + T2d = T21 + T2c; + Tfx = T1Q - T2d; + Tfu = Td2 + Td3; + Tfv = Td8 + Td9; + Tfw = Tfu - Tfv; + { + E T6O, T6P, Td7, Tda; + T6O = T6M - T6N; + T6P = T1J - T1O; + T6Q = T6O + T6P; + TaM = T6O - T6P; + Td7 = T1E - T1P; + Tda = Td8 - Td9; + Tdb = Td7 - Tda; + TeJ = Td7 + Tda; + } + { + E T6V, T70, T78, T79; + T6V = T6R - T6U; + T70 = T6W + T6Z; + T71 = KP707106781 * (T6V - T70); + TaQ = KP707106781 * (T70 + T6V); + T78 = T6Z - T6W; + T79 = T6R + T6U; + T7a = KP707106781 * (T78 - T79); + TaN = KP707106781 * (T78 + T79); + } + { + E Td4, Td5, T73, T76; + Td4 = Td2 - Td3; + Td5 = T2c - T21; + Td6 = Td4 - Td5; + TeI = Td4 + Td5; + T73 = T1y - T1D; + T76 = T74 - T75; + T77 = T73 - T76; + TaP = T73 + T76; + } + } + { + E T2j, T7d, T2o, T7e, T2p, Tdd, T2u, T7v, T2z, T7w, T2A, Tde, T2M, Tdj, T7n; + E T7q, T2X, Tdk, T7i, T7l; + { + E T2g, T2i, T2f, T2h; + T2g = ri[WS(rs, 62)]; + T2i = ii[WS(rs, 62)]; + T2f = W[122]; + T2h = W[123]; + T2j = FMA(T2f, T2g, T2h * T2i); + T7d = FNMS(T2h, T2g, T2f * T2i); + } + { + E T2l, T2n, T2k, T2m; + T2l = ri[WS(rs, 30)]; + T2n = ii[WS(rs, 30)]; + T2k = W[58]; + T2m = W[59]; + T2o = FMA(T2k, T2l, T2m * T2n); + T7e = FNMS(T2m, T2l, T2k * T2n); + } + T2p = T2j + T2o; + Tdd = T7d + T7e; + { + E T2r, T2t, T2q, T2s; + T2r = ri[WS(rs, 14)]; + T2t = ii[WS(rs, 14)]; + T2q = W[26]; + T2s = W[27]; + T2u = FMA(T2q, T2r, T2s * T2t); + T7v = FNMS(T2s, T2r, T2q * T2t); + } + { + E T2w, T2y, T2v, T2x; + T2w = ri[WS(rs, 46)]; + T2y = ii[WS(rs, 46)]; + T2v = W[90]; + T2x = W[91]; + T2z = FMA(T2v, T2w, T2x * T2y); + T7w = FNMS(T2x, T2w, T2v * T2y); + } + T2A = T2u + T2z; + Tde = T7v + T7w; + { + E T2G, T7o, T2L, T7p; + { + E T2D, T2F, T2C, T2E; + T2D = ri[WS(rs, 6)]; + T2F = ii[WS(rs, 6)]; + T2C = W[10]; + T2E = W[11]; + T2G = FMA(T2C, T2D, T2E * T2F); + T7o = FNMS(T2E, T2D, T2C * T2F); + } + { + E T2I, T2K, T2H, T2J; + T2I = ri[WS(rs, 38)]; + T2K = ii[WS(rs, 38)]; + T2H = W[74]; + T2J = W[75]; + T2L = FMA(T2H, T2I, T2J * T2K); + T7p = FNMS(T2J, T2I, T2H * T2K); + } + T2M = T2G + T2L; + Tdj = T7o + T7p; + T7n = T2G - T2L; + T7q = T7o - T7p; + } + { + E T2R, T7j, T2W, T7k; + { + E T2O, T2Q, T2N, T2P; + T2O = ri[WS(rs, 54)]; + T2Q = ii[WS(rs, 54)]; + T2N = W[106]; + T2P = W[107]; + T2R = FMA(T2N, T2O, T2P * T2Q); + T7j = FNMS(T2P, T2O, T2N * T2Q); + } + { + E T2T, T2V, T2S, T2U; + T2T = ri[WS(rs, 22)]; + T2V = ii[WS(rs, 22)]; + T2S = W[42]; + T2U = W[43]; + T2W = FMA(T2S, T2T, T2U * T2V); + T7k = FNMS(T2U, T2T, T2S * T2V); + } + T2X = T2R + T2W; + Tdk = T7j + T7k; + T7i = T2R - T2W; + T7l = T7j - T7k; + } + T2B = T2p + T2A; + T2Y = T2M + T2X; + Tfz = T2B - T2Y; + TfA = Tdd + Tde; + TfB = Tdj + Tdk; + TfC = TfA - TfB; + { + E T7f, T7g, Tdi, Tdl; + T7f = T7d - T7e; + T7g = T2u - T2z; + T7h = T7f + T7g; + TaW = T7f - T7g; + Tdi = T2p - T2A; + Tdl = Tdj - Tdk; + Tdm = Tdi - Tdl; + TeM = Tdi + Tdl; + } + { + E T7m, T7r, T7z, T7A; + T7m = T7i - T7l; + T7r = T7n + T7q; + T7s = KP707106781 * (T7m - T7r); + TaU = KP707106781 * (T7r + T7m); + T7z = T7q - T7n; + T7A = T7i + T7l; + T7B = KP707106781 * (T7z - T7A); + TaX = KP707106781 * (T7z + T7A); + } + { + E Tdf, Tdg, T7u, T7x; + Tdf = Tdd - Tde; + Tdg = T2X - T2M; + Tdh = Tdf - Tdg; + TeL = Tdf + Tdg; + T7u = T2j - T2o; + T7x = T7v - T7w; + T7y = T7u - T7x; + TaT = T7u + T7x; + } + } + { + E T4D, T9e, T4I, T9f, T4J, Te8, T4O, T8A, T4T, T8B, T4U, Te9, T56, TdS, T8G; + E T8H, T5h, TdT, T8J, T8M; + { + E T4A, T4C, T4z, T4B; + T4A = ri[WS(rs, 63)]; + T4C = ii[WS(rs, 63)]; + T4z = W[124]; + T4B = W[125]; + T4D = FMA(T4z, T4A, T4B * T4C); + T9e = FNMS(T4B, T4A, T4z * T4C); + } + { + E T4F, T4H, T4E, T4G; + T4F = ri[WS(rs, 31)]; + T4H = ii[WS(rs, 31)]; + T4E = W[60]; + T4G = W[61]; + T4I = FMA(T4E, T4F, T4G * T4H); + T9f = FNMS(T4G, T4F, T4E * T4H); + } + T4J = T4D + T4I; + Te8 = T9e + T9f; + { + E T4L, T4N, T4K, T4M; + T4L = ri[WS(rs, 15)]; + T4N = ii[WS(rs, 15)]; + T4K = W[28]; + T4M = W[29]; + T4O = FMA(T4K, T4L, T4M * T4N); + T8A = FNMS(T4M, T4L, T4K * T4N); + } + { + E T4Q, T4S, T4P, T4R; + T4Q = ri[WS(rs, 47)]; + T4S = ii[WS(rs, 47)]; + T4P = W[92]; + T4R = W[93]; + T4T = FMA(T4P, T4Q, T4R * T4S); + T8B = FNMS(T4R, T4Q, T4P * T4S); + } + T4U = T4O + T4T; + Te9 = T8A + T8B; + { + E T50, T8E, T55, T8F; + { + E T4X, T4Z, T4W, T4Y; + T4X = ri[WS(rs, 7)]; + T4Z = ii[WS(rs, 7)]; + T4W = W[12]; + T4Y = W[13]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T8E = FNMS(T4Y, T4X, T4W * T4Z); + } + { + E T52, T54, T51, T53; + T52 = ri[WS(rs, 39)]; + T54 = ii[WS(rs, 39)]; + T51 = W[76]; + T53 = W[77]; + T55 = FMA(T51, T52, T53 * T54); + T8F = FNMS(T53, T52, T51 * T54); + } + T56 = T50 + T55; + TdS = T8E + T8F; + T8G = T8E - T8F; + T8H = T50 - T55; + } + { + E T5b, T8K, T5g, T8L; + { + E T58, T5a, T57, T59; + T58 = ri[WS(rs, 55)]; + T5a = ii[WS(rs, 55)]; + T57 = W[108]; + T59 = W[109]; + T5b = FMA(T57, T58, T59 * T5a); + T8K = FNMS(T59, T58, T57 * T5a); + } + { + E T5d, T5f, T5c, T5e; + T5d = ri[WS(rs, 23)]; + T5f = ii[WS(rs, 23)]; + T5c = W[44]; + T5e = W[45]; + T5g = FMA(T5c, T5d, T5e * T5f); + T8L = FNMS(T5e, T5d, T5c * T5f); + } + T5h = T5b + T5g; + TdT = T8K + T8L; + T8J = T5b - T5g; + T8M = T8K - T8L; + } + { + E T4V, T5i, Tea, Teb; + T4V = T4J + T4U; + T5i = T56 + T5h; + T5j = T4V + T5i; + TfR = T4V - T5i; + Tea = Te8 - Te9; + Teb = T5h - T56; + Tec = Tea - Teb; + Tf0 = Tea + Teb; + } + { + E TfW, TfX, T8z, T8C; + TfW = Te8 + Te9; + TfX = TdS + TdT; + TfY = TfW - TfX; + Tgy = TfW + TfX; + T8z = T4D - T4I; + T8C = T8A - T8B; + T8D = T8z - T8C; + Tbl = T8z + T8C; + } + { + E T8I, T8N, T9j, T9k; + T8I = T8G - T8H; + T8N = T8J + T8M; + T8O = KP707106781 * (T8I - T8N); + Tbx = KP707106781 * (T8I + T8N); + T9j = T8J - T8M; + T9k = T8H + T8G; + T9l = KP707106781 * (T9j - T9k); + Tbm = KP707106781 * (T9k + T9j); + } + { + E TdR, TdU, T9g, T9h; + TdR = T4J - T4U; + TdU = TdS - TdT; + TdV = TdR - TdU; + TeX = TdR + TdU; + T9g = T9e - T9f; + T9h = T4O - T4T; + T9i = T9g + T9h; + Tbw = T9g - T9h; + } + } + { + E T36, T7G, T3b, T7H, T3c, Tdq, T3h, T8m, T3m, T8n, T3n, Tdr, T3z, TdI, T7Q; + E T7T, T3K, TdJ, T7L, T7O; + { + E T33, T35, T32, T34; + T33 = ri[WS(rs, 1)]; + T35 = ii[WS(rs, 1)]; + T32 = W[0]; + T34 = W[1]; + T36 = FMA(T32, T33, T34 * T35); + T7G = FNMS(T34, T33, T32 * T35); + } + { + E T38, T3a, T37, T39; + T38 = ri[WS(rs, 33)]; + T3a = ii[WS(rs, 33)]; + T37 = W[64]; + T39 = W[65]; + T3b = FMA(T37, T38, T39 * T3a); + T7H = FNMS(T39, T38, T37 * T3a); + } + T3c = T36 + T3b; + Tdq = T7G + T7H; + { + E T3e, T3g, T3d, T3f; + T3e = ri[WS(rs, 17)]; + T3g = ii[WS(rs, 17)]; + T3d = W[32]; + T3f = W[33]; + T3h = FMA(T3d, T3e, T3f * T3g); + T8m = FNMS(T3f, T3e, T3d * T3g); + } + { + E T3j, T3l, T3i, T3k; + T3j = ri[WS(rs, 49)]; + T3l = ii[WS(rs, 49)]; + T3i = W[96]; + T3k = W[97]; + T3m = FMA(T3i, T3j, T3k * T3l); + T8n = FNMS(T3k, T3j, T3i * T3l); + } + T3n = T3h + T3m; + Tdr = T8m + T8n; + { + E T3t, T7R, T3y, T7S; + { + E T3q, T3s, T3p, T3r; + T3q = ri[WS(rs, 9)]; + T3s = ii[WS(rs, 9)]; + T3p = W[16]; + T3r = W[17]; + T3t = FMA(T3p, T3q, T3r * T3s); + T7R = FNMS(T3r, T3q, T3p * T3s); + } + { + E T3v, T3x, T3u, T3w; + T3v = ri[WS(rs, 41)]; + T3x = ii[WS(rs, 41)]; + T3u = W[80]; + T3w = W[81]; + T3y = FMA(T3u, T3v, T3w * T3x); + T7S = FNMS(T3w, T3v, T3u * T3x); + } + T3z = T3t + T3y; + TdI = T7R + T7S; + T7Q = T3t - T3y; + T7T = T7R - T7S; + } + { + E T3E, T7M, T3J, T7N; + { + E T3B, T3D, T3A, T3C; + T3B = ri[WS(rs, 57)]; + T3D = ii[WS(rs, 57)]; + T3A = W[112]; + T3C = W[113]; + T3E = FMA(T3A, T3B, T3C * T3D); + T7M = FNMS(T3C, T3B, T3A * T3D); + } + { + E T3G, T3I, T3F, T3H; + T3G = ri[WS(rs, 25)]; + T3I = ii[WS(rs, 25)]; + T3F = W[48]; + T3H = W[49]; + T3J = FMA(T3F, T3G, T3H * T3I); + T7N = FNMS(T3H, T3G, T3F * T3I); + } + T3K = T3E + T3J; + TdJ = T7M + T7N; + T7L = T3E - T3J; + T7O = T7M - T7N; + } + { + E T3o, T3L, TdH, TdK; + T3o = T3c + T3n; + T3L = T3z + T3K; + T3M = T3o + T3L; + TfL = T3o - T3L; + TdH = T3c - T3n; + TdK = TdI - TdJ; + TdL = TdH - TdK; + TeQ = TdH + TdK; + } + { + E TfG, TfH, T7I, T7J; + TfG = Tdq + Tdr; + TfH = TdI + TdJ; + TfI = TfG - TfH; + Tgt = TfG + TfH; + T7I = T7G - T7H; + T7J = T3h - T3m; + T7K = T7I + T7J; + Tb2 = T7I - T7J; + } + { + E T7P, T7U, T8q, T8r; + T7P = T7L - T7O; + T7U = T7Q + T7T; + T7V = KP707106781 * (T7P - T7U); + Tbe = KP707106781 * (T7U + T7P); + T8q = T7T - T7Q; + T8r = T7L + T7O; + T8s = KP707106781 * (T8q - T8r); + Tb3 = KP707106781 * (T8q + T8r); + } + { + E Tds, Tdt, T8l, T8o; + Tds = Tdq - Tdr; + Tdt = T3K - T3z; + Tdu = Tds - Tdt; + TeT = Tds + Tdt; + T8l = T36 - T3b; + T8o = T8m - T8n; + T8p = T8l - T8o; + Tbd = T8l + T8o; + } + } + { + E T3X, TdB, T8a, T8d, T4v, Tdx, T80, T85, T48, TdC, T8b, T8g, T4k, Tdw, T7X; + E T84; + { + E T3R, T88, T3W, T89; + { + E T3O, T3Q, T3N, T3P; + T3O = ri[WS(rs, 5)]; + T3Q = ii[WS(rs, 5)]; + T3N = W[8]; + T3P = W[9]; + T3R = FMA(T3N, T3O, T3P * T3Q); + T88 = FNMS(T3P, T3O, T3N * T3Q); + } + { + E T3T, T3V, T3S, T3U; + T3T = ri[WS(rs, 37)]; + T3V = ii[WS(rs, 37)]; + T3S = W[72]; + T3U = W[73]; + T3W = FMA(T3S, T3T, T3U * T3V); + T89 = FNMS(T3U, T3T, T3S * T3V); + } + T3X = T3R + T3W; + TdB = T88 + T89; + T8a = T88 - T89; + T8d = T3R - T3W; + } + { + E T4p, T7Y, T4u, T7Z; + { + E T4m, T4o, T4l, T4n; + T4m = ri[WS(rs, 13)]; + T4o = ii[WS(rs, 13)]; + T4l = W[24]; + T4n = W[25]; + T4p = FMA(T4l, T4m, T4n * T4o); + T7Y = FNMS(T4n, T4m, T4l * T4o); + } + { + E T4r, T4t, T4q, T4s; + T4r = ri[WS(rs, 45)]; + T4t = ii[WS(rs, 45)]; + T4q = W[88]; + T4s = W[89]; + T4u = FMA(T4q, T4r, T4s * T4t); + T7Z = FNMS(T4s, T4r, T4q * T4t); + } + T4v = T4p + T4u; + Tdx = T7Y + T7Z; + T80 = T7Y - T7Z; + T85 = T4p - T4u; + } + { + E T42, T8e, T47, T8f; + { + E T3Z, T41, T3Y, T40; + T3Z = ri[WS(rs, 21)]; + T41 = ii[WS(rs, 21)]; + T3Y = W[40]; + T40 = W[41]; + T42 = FMA(T3Y, T3Z, T40 * T41); + T8e = FNMS(T40, T3Z, T3Y * T41); + } + { + E T44, T46, T43, T45; + T44 = ri[WS(rs, 53)]; + T46 = ii[WS(rs, 53)]; + T43 = W[104]; + T45 = W[105]; + T47 = FMA(T43, T44, T45 * T46); + T8f = FNMS(T45, T44, T43 * T46); + } + T48 = T42 + T47; + TdC = T8e + T8f; + T8b = T42 - T47; + T8g = T8e - T8f; + } + { + E T4e, T82, T4j, T83; + { + E T4b, T4d, T4a, T4c; + T4b = ri[WS(rs, 61)]; + T4d = ii[WS(rs, 61)]; + T4a = W[120]; + T4c = W[121]; + T4e = FMA(T4a, T4b, T4c * T4d); + T82 = FNMS(T4c, T4b, T4a * T4d); + } + { + E T4g, T4i, T4f, T4h; + T4g = ri[WS(rs, 29)]; + T4i = ii[WS(rs, 29)]; + T4f = W[56]; + T4h = W[57]; + T4j = FMA(T4f, T4g, T4h * T4i); + T83 = FNMS(T4h, T4g, T4f * T4i); + } + T4k = T4e + T4j; + Tdw = T82 + T83; + T7X = T4e - T4j; + T84 = T82 - T83; + } + { + E T49, T4w, TdA, TdD; + T49 = T3X + T48; + T4w = T4k + T4v; + T4x = T49 + T4w; + TfJ = T4w - T49; + TdA = T3X - T48; + TdD = TdB - TdC; + TdE = TdA + TdD; + TdM = TdD - TdA; + } + { + E TfM, TfN, T81, T86; + TfM = TdB + TdC; + TfN = Tdw + Tdx; + TfO = TfM - TfN; + Tgu = TfM + TfN; + T81 = T7X - T80; + T86 = T84 + T85; + T87 = FNMS(KP923879532, T86, KP382683432 * T81); + T8v = FMA(KP382683432, T86, KP923879532 * T81); + } + { + E T8c, T8h, Tb8, Tb9; + T8c = T8a + T8b; + T8h = T8d - T8g; + T8i = FMA(KP923879532, T8c, KP382683432 * T8h); + T8u = FNMS(KP923879532, T8h, KP382683432 * T8c); + Tb8 = T8a - T8b; + Tb9 = T8d + T8g; + Tba = FMA(KP382683432, Tb8, KP923879532 * Tb9); + Tbg = FNMS(KP382683432, Tb9, KP923879532 * Tb8); + } + { + E Tdv, Tdy, Tb5, Tb6; + Tdv = T4k - T4v; + Tdy = Tdw - Tdx; + Tdz = Tdv - Tdy; + TdN = Tdv + Tdy; + Tb5 = T7X + T80; + Tb6 = T84 - T85; + Tb7 = FNMS(KP382683432, Tb6, KP923879532 * Tb5); + Tbh = FMA(KP923879532, Tb6, KP382683432 * Tb5); + } + } + { + E T5u, TdW, T8S, T8V, T62, Te3, T94, T99, T5F, TdX, T8T, T8Y, T5R, Te2, T93; + E T96; + { + E T5o, T8Q, T5t, T8R; + { + E T5l, T5n, T5k, T5m; + T5l = ri[WS(rs, 3)]; + T5n = ii[WS(rs, 3)]; + T5k = W[4]; + T5m = W[5]; + T5o = FMA(T5k, T5l, T5m * T5n); + T8Q = FNMS(T5m, T5l, T5k * T5n); + } + { + E T5q, T5s, T5p, T5r; + T5q = ri[WS(rs, 35)]; + T5s = ii[WS(rs, 35)]; + T5p = W[68]; + T5r = W[69]; + T5t = FMA(T5p, T5q, T5r * T5s); + T8R = FNMS(T5r, T5q, T5p * T5s); + } + T5u = T5o + T5t; + TdW = T8Q + T8R; + T8S = T8Q - T8R; + T8V = T5o - T5t; + } + { + E T5W, T97, T61, T98; + { + E T5T, T5V, T5S, T5U; + T5T = ri[WS(rs, 11)]; + T5V = ii[WS(rs, 11)]; + T5S = W[20]; + T5U = W[21]; + T5W = FMA(T5S, T5T, T5U * T5V); + T97 = FNMS(T5U, T5T, T5S * T5V); + } + { + E T5Y, T60, T5X, T5Z; + T5Y = ri[WS(rs, 43)]; + T60 = ii[WS(rs, 43)]; + T5X = W[84]; + T5Z = W[85]; + T61 = FMA(T5X, T5Y, T5Z * T60); + T98 = FNMS(T5Z, T5Y, T5X * T60); + } + T62 = T5W + T61; + Te3 = T97 + T98; + T94 = T5W - T61; + T99 = T97 - T98; + } + { + E T5z, T8W, T5E, T8X; + { + E T5w, T5y, T5v, T5x; + T5w = ri[WS(rs, 19)]; + T5y = ii[WS(rs, 19)]; + T5v = W[36]; + T5x = W[37]; + T5z = FMA(T5v, T5w, T5x * T5y); + T8W = FNMS(T5x, T5w, T5v * T5y); + } + { + E T5B, T5D, T5A, T5C; + T5B = ri[WS(rs, 51)]; + T5D = ii[WS(rs, 51)]; + T5A = W[100]; + T5C = W[101]; + T5E = FMA(T5A, T5B, T5C * T5D); + T8X = FNMS(T5C, T5B, T5A * T5D); + } + T5F = T5z + T5E; + TdX = T8W + T8X; + T8T = T5z - T5E; + T8Y = T8W - T8X; + } + { + E T5L, T91, T5Q, T92; + { + E T5I, T5K, T5H, T5J; + T5I = ri[WS(rs, 59)]; + T5K = ii[WS(rs, 59)]; + T5H = W[116]; + T5J = W[117]; + T5L = FMA(T5H, T5I, T5J * T5K); + T91 = FNMS(T5J, T5I, T5H * T5K); + } + { + E T5N, T5P, T5M, T5O; + T5N = ri[WS(rs, 27)]; + T5P = ii[WS(rs, 27)]; + T5M = W[52]; + T5O = W[53]; + T5Q = FMA(T5M, T5N, T5O * T5P); + T92 = FNMS(T5O, T5N, T5M * T5P); + } + T5R = T5L + T5Q; + Te2 = T91 + T92; + T93 = T91 - T92; + T96 = T5L - T5Q; + } + { + E T5G, T63, Te1, Te4; + T5G = T5u + T5F; + T63 = T5R + T62; + T64 = T5G + T63; + TfZ = T63 - T5G; + Te1 = T5R - T62; + Te4 = Te2 - Te3; + Te5 = Te1 + Te4; + Ted = Te1 - Te4; + } + { + E TfS, TfT, T8U, T8Z; + TfS = TdW + TdX; + TfT = Te2 + Te3; + TfU = TfS - TfT; + Tgz = TfS + TfT; + T8U = T8S + T8T; + T8Z = T8V - T8Y; + T90 = FNMS(KP923879532, T8Z, KP382683432 * T8U); + T9o = FMA(KP923879532, T8U, KP382683432 * T8Z); + } + { + E T95, T9a, Tbr, Tbs; + T95 = T93 + T94; + T9a = T96 - T99; + T9b = FMA(KP382683432, T95, KP923879532 * T9a); + T9n = FNMS(KP923879532, T95, KP382683432 * T9a); + Tbr = T93 - T94; + Tbs = T96 + T99; + Tbt = FMA(KP923879532, Tbr, KP382683432 * Tbs); + Tbz = FNMS(KP382683432, Tbr, KP923879532 * Tbs); + } + { + E TdY, TdZ, Tbo, Tbp; + TdY = TdW - TdX; + TdZ = T5u - T5F; + Te0 = TdY - TdZ; + Tee = TdZ + TdY; + Tbo = T8S - T8T; + Tbp = T8V + T8Y; + Tbq = FNMS(KP382683432, Tbp, KP923879532 * Tbo); + TbA = FMA(KP382683432, Tbo, KP923879532 * Tbp); + } + } + { + E T1t, Tgn, TgK, TgL, TgV, Th1, T30, Th0, T66, TgX, Tgw, TgE, TgB, TgF, Tgq; + E TgM; + { + E TH, T1s, TgI, TgJ; + TH = Tj + TG; + T1s = T14 + T1r; + T1t = TH + T1s; + Tgn = TH - T1s; + TgI = Tgt + Tgu; + TgJ = Tgy + Tgz; + TgK = TgI - TgJ; + TgL = TgI + TgJ; + } + { + E TgN, TgU, T2e, T2Z; + TgN = Tfq + Tfr; + TgU = TgO + TgT; + TgV = TgN + TgU; + Th1 = TgU - TgN; + T2e = T1Q + T2d; + T2Z = T2B + T2Y; + T30 = T2e + T2Z; + Th0 = T2Z - T2e; + } + { + E T4y, T65, Tgs, Tgv; + T4y = T3M + T4x; + T65 = T5j + T64; + T66 = T4y + T65; + TgX = T65 - T4y; + Tgs = T3M - T4x; + Tgv = Tgt - Tgu; + Tgw = Tgs + Tgv; + TgE = Tgv - Tgs; + } + { + E Tgx, TgA, Tgo, Tgp; + Tgx = T5j - T64; + TgA = Tgy - Tgz; + TgB = Tgx - TgA; + TgF = Tgx + TgA; + Tgo = Tfu + Tfv; + Tgp = TfA + TfB; + Tgq = Tgo - Tgp; + TgM = Tgo + Tgp; + } + { + E T31, TgW, TgH, TgY; + T31 = T1t + T30; + ri[WS(rs, 32)] = T31 - T66; + ri[0] = T31 + T66; + TgW = TgM + TgV; + ii[0] = TgL + TgW; + ii[WS(rs, 32)] = TgW - TgL; + TgH = T1t - T30; + ri[WS(rs, 48)] = TgH - TgK; + ri[WS(rs, 16)] = TgH + TgK; + TgY = TgV - TgM; + ii[WS(rs, 16)] = TgX + TgY; + ii[WS(rs, 48)] = TgY - TgX; + } + { + E Tgr, TgC, TgZ, Th2; + Tgr = Tgn + Tgq; + TgC = KP707106781 * (Tgw + TgB); + ri[WS(rs, 40)] = Tgr - TgC; + ri[WS(rs, 8)] = Tgr + TgC; + TgZ = KP707106781 * (TgE + TgF); + Th2 = Th0 + Th1; + ii[WS(rs, 8)] = TgZ + Th2; + ii[WS(rs, 40)] = Th2 - TgZ; + } + { + E TgD, TgG, Th3, Th4; + TgD = Tgn - Tgq; + TgG = KP707106781 * (TgE - TgF); + ri[WS(rs, 56)] = TgD - TgG; + ri[WS(rs, 24)] = TgD + TgG; + Th3 = KP707106781 * (TgB - Tgw); + Th4 = Th1 - Th0; + ii[WS(rs, 24)] = Th3 + Th4; + ii[WS(rs, 56)] = Th4 - Th3; + } + } + { + E Tft, Tg7, Tgh, Tgl, Th9, Thf, TfE, Th6, TfQ, Tg4, Tga, The, Tge, Tgk, Tg1; + E Tg5; + { + E Tfp, Tfs, Tgf, Tgg; + Tfp = Tj - TG; + Tfs = Tfq - Tfr; + Tft = Tfp - Tfs; + Tg7 = Tfp + Tfs; + Tgf = TfR + TfU; + Tgg = TfY + TfZ; + Tgh = FNMS(KP382683432, Tgg, KP923879532 * Tgf); + Tgl = FMA(KP923879532, Tgg, KP382683432 * Tgf); + } + { + E Th7, Th8, Tfy, TfD; + Th7 = T1r - T14; + Th8 = TgT - TgO; + Th9 = Th7 + Th8; + Thf = Th8 - Th7; + Tfy = Tfw - Tfx; + TfD = Tfz + TfC; + TfE = KP707106781 * (Tfy - TfD); + Th6 = KP707106781 * (Tfy + TfD); + } + { + E TfK, TfP, Tg8, Tg9; + TfK = TfI - TfJ; + TfP = TfL - TfO; + TfQ = FMA(KP923879532, TfK, KP382683432 * TfP); + Tg4 = FNMS(KP923879532, TfP, KP382683432 * TfK); + Tg8 = Tfx + Tfw; + Tg9 = Tfz - TfC; + Tga = KP707106781 * (Tg8 + Tg9); + The = KP707106781 * (Tg9 - Tg8); + } + { + E Tgc, Tgd, TfV, Tg0; + Tgc = TfI + TfJ; + Tgd = TfL + TfO; + Tge = FMA(KP382683432, Tgc, KP923879532 * Tgd); + Tgk = FNMS(KP382683432, Tgd, KP923879532 * Tgc); + TfV = TfR - TfU; + Tg0 = TfY - TfZ; + Tg1 = FNMS(KP923879532, Tg0, KP382683432 * TfV); + Tg5 = FMA(KP382683432, Tg0, KP923879532 * TfV); + } + { + E TfF, Tg2, Thd, Thg; + TfF = Tft + TfE; + Tg2 = TfQ + Tg1; + ri[WS(rs, 44)] = TfF - Tg2; + ri[WS(rs, 12)] = TfF + Tg2; + Thd = Tg4 + Tg5; + Thg = The + Thf; + ii[WS(rs, 12)] = Thd + Thg; + ii[WS(rs, 44)] = Thg - Thd; + } + { + E Tg3, Tg6, Thh, Thi; + Tg3 = Tft - TfE; + Tg6 = Tg4 - Tg5; + ri[WS(rs, 60)] = Tg3 - Tg6; + ri[WS(rs, 28)] = Tg3 + Tg6; + Thh = Tg1 - TfQ; + Thi = Thf - The; + ii[WS(rs, 28)] = Thh + Thi; + ii[WS(rs, 60)] = Thi - Thh; + } + { + E Tgb, Tgi, Th5, Tha; + Tgb = Tg7 + Tga; + Tgi = Tge + Tgh; + ri[WS(rs, 36)] = Tgb - Tgi; + ri[WS(rs, 4)] = Tgb + Tgi; + Th5 = Tgk + Tgl; + Tha = Th6 + Th9; + ii[WS(rs, 4)] = Th5 + Tha; + ii[WS(rs, 36)] = Tha - Th5; + } + { + E Tgj, Tgm, Thb, Thc; + Tgj = Tg7 - Tga; + Tgm = Tgk - Tgl; + ri[WS(rs, 52)] = Tgj - Tgm; + ri[WS(rs, 20)] = Tgj + Tgm; + Thb = Tgh - Tge; + Thc = Th9 - Th6; + ii[WS(rs, 20)] = Thb + Thc; + ii[WS(rs, 52)] = Thc - Thb; + } + } + { + E Td1, Ten, Tdo, ThA, ThD, ThJ, Teq, ThI, Teh, TeB, Tel, Tex, TdQ, TeA, Tek; + E Teu; + { + E TcP, Td0, Teo, Tep; + TcP = TcL - TcO; + Td0 = KP707106781 * (TcU - TcZ); + Td1 = TcP - Td0; + Ten = TcP + Td0; + { + E Tdc, Tdn, ThB, ThC; + Tdc = FNMS(KP923879532, Tdb, KP382683432 * Td6); + Tdn = FMA(KP382683432, Tdh, KP923879532 * Tdm); + Tdo = Tdc - Tdn; + ThA = Tdc + Tdn; + ThB = KP707106781 * (TeF - TeE); + ThC = Thn - Thm; + ThD = ThB + ThC; + ThJ = ThC - ThB; + } + Teo = FMA(KP923879532, Td6, KP382683432 * Tdb); + Tep = FNMS(KP923879532, Tdh, KP382683432 * Tdm); + Teq = Teo + Tep; + ThI = Tep - Teo; + { + E Te7, Tev, Teg, Tew, Te6, Tef; + Te6 = KP707106781 * (Te0 - Te5); + Te7 = TdV - Te6; + Tev = TdV + Te6; + Tef = KP707106781 * (Ted - Tee); + Teg = Tec - Tef; + Tew = Tec + Tef; + Teh = FNMS(KP980785280, Teg, KP195090322 * Te7); + TeB = FMA(KP831469612, Tew, KP555570233 * Tev); + Tel = FMA(KP195090322, Teg, KP980785280 * Te7); + Tex = FNMS(KP555570233, Tew, KP831469612 * Tev); + } + { + E TdG, Tes, TdP, Tet, TdF, TdO; + TdF = KP707106781 * (Tdz - TdE); + TdG = Tdu - TdF; + Tes = Tdu + TdF; + TdO = KP707106781 * (TdM - TdN); + TdP = TdL - TdO; + Tet = TdL + TdO; + TdQ = FMA(KP980785280, TdG, KP195090322 * TdP); + TeA = FNMS(KP555570233, Tet, KP831469612 * Tes); + Tek = FNMS(KP980785280, TdP, KP195090322 * TdG); + Teu = FMA(KP555570233, Tes, KP831469612 * Tet); + } + } + { + E Tdp, Tei, ThH, ThK; + Tdp = Td1 + Tdo; + Tei = TdQ + Teh; + ri[WS(rs, 46)] = Tdp - Tei; + ri[WS(rs, 14)] = Tdp + Tei; + ThH = Tek + Tel; + ThK = ThI + ThJ; + ii[WS(rs, 14)] = ThH + ThK; + ii[WS(rs, 46)] = ThK - ThH; + } + { + E Tej, Tem, ThL, ThM; + Tej = Td1 - Tdo; + Tem = Tek - Tel; + ri[WS(rs, 62)] = Tej - Tem; + ri[WS(rs, 30)] = Tej + Tem; + ThL = Teh - TdQ; + ThM = ThJ - ThI; + ii[WS(rs, 30)] = ThL + ThM; + ii[WS(rs, 62)] = ThM - ThL; + } + { + E Ter, Tey, Thz, ThE; + Ter = Ten + Teq; + Tey = Teu + Tex; + ri[WS(rs, 38)] = Ter - Tey; + ri[WS(rs, 6)] = Ter + Tey; + Thz = TeA + TeB; + ThE = ThA + ThD; + ii[WS(rs, 6)] = Thz + ThE; + ii[WS(rs, 38)] = ThE - Thz; + } + { + E Tez, TeC, ThF, ThG; + Tez = Ten - Teq; + TeC = TeA - TeB; + ri[WS(rs, 54)] = Tez - TeC; + ri[WS(rs, 22)] = Tez + TeC; + ThF = Tex - Teu; + ThG = ThD - ThA; + ii[WS(rs, 22)] = ThF + ThG; + ii[WS(rs, 54)] = ThG - ThF; + } + } + { + E TeH, Tf9, TeO, Thk, Thp, Thv, Tfc, Thu, Tf3, Tfn, Tf7, Tfj, TeW, Tfm, Tf6; + E Tfg; + { + E TeD, TeG, Tfa, Tfb; + TeD = TcL + TcO; + TeG = KP707106781 * (TeE + TeF); + TeH = TeD - TeG; + Tf9 = TeD + TeG; + { + E TeK, TeN, Thl, Tho; + TeK = FNMS(KP382683432, TeJ, KP923879532 * TeI); + TeN = FMA(KP923879532, TeL, KP382683432 * TeM); + TeO = TeK - TeN; + Thk = TeK + TeN; + Thl = KP707106781 * (TcU + TcZ); + Tho = Thm + Thn; + Thp = Thl + Tho; + Thv = Tho - Thl; + } + Tfa = FMA(KP382683432, TeI, KP923879532 * TeJ); + Tfb = FNMS(KP382683432, TeL, KP923879532 * TeM); + Tfc = Tfa + Tfb; + Thu = Tfb - Tfa; + { + E TeZ, Tfh, Tf2, Tfi, TeY, Tf1; + TeY = KP707106781 * (Tee + Ted); + TeZ = TeX - TeY; + Tfh = TeX + TeY; + Tf1 = KP707106781 * (Te0 + Te5); + Tf2 = Tf0 - Tf1; + Tfi = Tf0 + Tf1; + Tf3 = FNMS(KP831469612, Tf2, KP555570233 * TeZ); + Tfn = FMA(KP195090322, Tfh, KP980785280 * Tfi); + Tf7 = FMA(KP831469612, TeZ, KP555570233 * Tf2); + Tfj = FNMS(KP195090322, Tfi, KP980785280 * Tfh); + } + { + E TeS, Tfe, TeV, Tff, TeR, TeU; + TeR = KP707106781 * (TdE + Tdz); + TeS = TeQ - TeR; + Tfe = TeQ + TeR; + TeU = KP707106781 * (TdM + TdN); + TeV = TeT - TeU; + Tff = TeT + TeU; + TeW = FMA(KP555570233, TeS, KP831469612 * TeV); + Tfm = FNMS(KP195090322, Tfe, KP980785280 * Tff); + Tf6 = FNMS(KP831469612, TeS, KP555570233 * TeV); + Tfg = FMA(KP980785280, Tfe, KP195090322 * Tff); + } + } + { + E TeP, Tf4, Tht, Thw; + TeP = TeH + TeO; + Tf4 = TeW + Tf3; + ri[WS(rs, 42)] = TeP - Tf4; + ri[WS(rs, 10)] = TeP + Tf4; + Tht = Tf6 + Tf7; + Thw = Thu + Thv; + ii[WS(rs, 10)] = Tht + Thw; + ii[WS(rs, 42)] = Thw - Tht; + } + { + E Tf5, Tf8, Thx, Thy; + Tf5 = TeH - TeO; + Tf8 = Tf6 - Tf7; + ri[WS(rs, 58)] = Tf5 - Tf8; + ri[WS(rs, 26)] = Tf5 + Tf8; + Thx = Tf3 - TeW; + Thy = Thv - Thu; + ii[WS(rs, 26)] = Thx + Thy; + ii[WS(rs, 58)] = Thy - Thx; + } + { + E Tfd, Tfk, Thj, Thq; + Tfd = Tf9 + Tfc; + Tfk = Tfg + Tfj; + ri[WS(rs, 34)] = Tfd - Tfk; + ri[WS(rs, 2)] = Tfd + Tfk; + Thj = Tfm + Tfn; + Thq = Thk + Thp; + ii[WS(rs, 2)] = Thj + Thq; + ii[WS(rs, 34)] = Thq - Thj; + } + { + E Tfl, Tfo, Thr, Ths; + Tfl = Tf9 - Tfc; + Tfo = Tfm - Tfn; + ri[WS(rs, 50)] = Tfl - Tfo; + ri[WS(rs, 18)] = Tfl + Tfo; + Thr = Tfj - Tfg; + Ths = Thp - Thk; + ii[WS(rs, 18)] = Thr + Ths; + ii[WS(rs, 50)] = Ths - Thr; + } + } + { + E T6L, T9x, TiD, TiJ, T7E, TiI, T9A, TiA, T8y, T9K, T9u, T9E, T9r, T9L, T9v; + E T9H; + { + E T6n, T6K, TiB, TiC; + T6n = T6b - T6m; + T6K = T6y - T6J; + T6L = T6n - T6K; + T9x = T6n + T6K; + TiB = T9P - T9O; + TiC = Tin - Tim; + TiD = TiB + TiC; + TiJ = TiC - TiB; + } + { + E T7c, T9y, T7D, T9z; + { + E T72, T7b, T7t, T7C; + T72 = T6Q - T71; + T7b = T77 - T7a; + T7c = FNMS(KP980785280, T7b, KP195090322 * T72); + T9y = FMA(KP980785280, T72, KP195090322 * T7b); + T7t = T7h - T7s; + T7C = T7y - T7B; + T7D = FMA(KP195090322, T7t, KP980785280 * T7C); + T9z = FNMS(KP980785280, T7t, KP195090322 * T7C); + } + T7E = T7c - T7D; + TiI = T9z - T9y; + T9A = T9y + T9z; + TiA = T7c + T7D; + } + { + E T8k, T9C, T8x, T9D; + { + E T7W, T8j, T8t, T8w; + T7W = T7K - T7V; + T8j = T87 - T8i; + T8k = T7W - T8j; + T9C = T7W + T8j; + T8t = T8p - T8s; + T8w = T8u - T8v; + T8x = T8t - T8w; + T9D = T8t + T8w; + } + T8y = FMA(KP995184726, T8k, KP098017140 * T8x); + T9K = FNMS(KP634393284, T9D, KP773010453 * T9C); + T9u = FNMS(KP995184726, T8x, KP098017140 * T8k); + T9E = FMA(KP634393284, T9C, KP773010453 * T9D); + } + { + E T9d, T9F, T9q, T9G; + { + E T8P, T9c, T9m, T9p; + T8P = T8D - T8O; + T9c = T90 - T9b; + T9d = T8P - T9c; + T9F = T8P + T9c; + T9m = T9i - T9l; + T9p = T9n - T9o; + T9q = T9m - T9p; + T9G = T9m + T9p; + } + T9r = FNMS(KP995184726, T9q, KP098017140 * T9d); + T9L = FMA(KP773010453, T9G, KP634393284 * T9F); + T9v = FMA(KP098017140, T9q, KP995184726 * T9d); + T9H = FNMS(KP634393284, T9G, KP773010453 * T9F); + } + { + E T7F, T9s, TiH, TiK; + T7F = T6L + T7E; + T9s = T8y + T9r; + ri[WS(rs, 47)] = T7F - T9s; + ri[WS(rs, 15)] = T7F + T9s; + TiH = T9u + T9v; + TiK = TiI + TiJ; + ii[WS(rs, 15)] = TiH + TiK; + ii[WS(rs, 47)] = TiK - TiH; + } + { + E T9t, T9w, TiL, TiM; + T9t = T6L - T7E; + T9w = T9u - T9v; + ri[WS(rs, 63)] = T9t - T9w; + ri[WS(rs, 31)] = T9t + T9w; + TiL = T9r - T8y; + TiM = TiJ - TiI; + ii[WS(rs, 31)] = TiL + TiM; + ii[WS(rs, 63)] = TiM - TiL; + } + { + E T9B, T9I, Tiz, TiE; + T9B = T9x + T9A; + T9I = T9E + T9H; + ri[WS(rs, 39)] = T9B - T9I; + ri[WS(rs, 7)] = T9B + T9I; + Tiz = T9K + T9L; + TiE = TiA + TiD; + ii[WS(rs, 7)] = Tiz + TiE; + ii[WS(rs, 39)] = TiE - Tiz; + } + { + E T9J, T9M, TiF, TiG; + T9J = T9x - T9A; + T9M = T9K - T9L; + ri[WS(rs, 55)] = T9J - T9M; + ri[WS(rs, 23)] = T9J + T9M; + TiF = T9H - T9E; + TiG = TiD - TiA; + ii[WS(rs, 23)] = TiF + TiG; + ii[WS(rs, 55)] = TiG - TiF; + } + } + { + E TaL, TbJ, Ti9, Tif, Tb0, Tie, TbM, Ti6, Tbk, TbW, TbG, TbQ, TbD, TbX, TbH; + E TbT; + { + E TaD, TaK, Ti7, Ti8; + TaD = Taz - TaC; + TaK = TaG - TaJ; + TaL = TaD - TaK; + TbJ = TaD + TaK; + Ti7 = Tc1 - Tc0; + Ti8 = ThT - ThQ; + Ti9 = Ti7 + Ti8; + Tif = Ti8 - Ti7; + } + { + E TaS, TbK, TaZ, TbL; + { + E TaO, TaR, TaV, TaY; + TaO = TaM - TaN; + TaR = TaP - TaQ; + TaS = FNMS(KP831469612, TaR, KP555570233 * TaO); + TbK = FMA(KP555570233, TaR, KP831469612 * TaO); + TaV = TaT - TaU; + TaY = TaW - TaX; + TaZ = FMA(KP831469612, TaV, KP555570233 * TaY); + TbL = FNMS(KP831469612, TaY, KP555570233 * TaV); + } + Tb0 = TaS - TaZ; + Tie = TbL - TbK; + TbM = TbK + TbL; + Ti6 = TaS + TaZ; + } + { + E Tbc, TbO, Tbj, TbP; + { + E Tb4, Tbb, Tbf, Tbi; + Tb4 = Tb2 - Tb3; + Tbb = Tb7 - Tba; + Tbc = Tb4 - Tbb; + TbO = Tb4 + Tbb; + Tbf = Tbd - Tbe; + Tbi = Tbg - Tbh; + Tbj = Tbf - Tbi; + TbP = Tbf + Tbi; + } + Tbk = FMA(KP956940335, Tbc, KP290284677 * Tbj); + TbW = FNMS(KP471396736, TbP, KP881921264 * TbO); + TbG = FNMS(KP956940335, Tbj, KP290284677 * Tbc); + TbQ = FMA(KP471396736, TbO, KP881921264 * TbP); + } + { + E Tbv, TbR, TbC, TbS; + { + E Tbn, Tbu, Tby, TbB; + Tbn = Tbl - Tbm; + Tbu = Tbq - Tbt; + Tbv = Tbn - Tbu; + TbR = Tbn + Tbu; + Tby = Tbw - Tbx; + TbB = Tbz - TbA; + TbC = Tby - TbB; + TbS = Tby + TbB; + } + TbD = FNMS(KP956940335, TbC, KP290284677 * Tbv); + TbX = FMA(KP881921264, TbS, KP471396736 * TbR); + TbH = FMA(KP290284677, TbC, KP956940335 * Tbv); + TbT = FNMS(KP471396736, TbS, KP881921264 * TbR); + } + { + E Tb1, TbE, Tid, Tig; + Tb1 = TaL + Tb0; + TbE = Tbk + TbD; + ri[WS(rs, 45)] = Tb1 - TbE; + ri[WS(rs, 13)] = Tb1 + TbE; + Tid = TbG + TbH; + Tig = Tie + Tif; + ii[WS(rs, 13)] = Tid + Tig; + ii[WS(rs, 45)] = Tig - Tid; + } + { + E TbF, TbI, Tih, Tii; + TbF = TaL - Tb0; + TbI = TbG - TbH; + ri[WS(rs, 61)] = TbF - TbI; + ri[WS(rs, 29)] = TbF + TbI; + Tih = TbD - Tbk; + Tii = Tif - Tie; + ii[WS(rs, 29)] = Tih + Tii; + ii[WS(rs, 61)] = Tii - Tih; + } + { + E TbN, TbU, Ti5, Tia; + TbN = TbJ + TbM; + TbU = TbQ + TbT; + ri[WS(rs, 37)] = TbN - TbU; + ri[WS(rs, 5)] = TbN + TbU; + Ti5 = TbW + TbX; + Tia = Ti6 + Ti9; + ii[WS(rs, 5)] = Ti5 + Tia; + ii[WS(rs, 37)] = Tia - Ti5; + } + { + E TbV, TbY, Tib, Tic; + TbV = TbJ - TbM; + TbY = TbW - TbX; + ri[WS(rs, 53)] = TbV - TbY; + ri[WS(rs, 21)] = TbV + TbY; + Tib = TbT - TbQ; + Tic = Ti9 - Ti6; + ii[WS(rs, 21)] = Tib + Tic; + ii[WS(rs, 53)] = Tic - Tib; + } + } + { + E Tc3, Tcv, ThV, Ti1, Tca, Ti0, Tcy, ThO, Tci, TcI, Tcs, TcC, Tcp, TcJ, Tct; + E TcF; + { + E TbZ, Tc2, ThP, ThU; + TbZ = Taz + TaC; + Tc2 = Tc0 + Tc1; + Tc3 = TbZ - Tc2; + Tcv = TbZ + Tc2; + ThP = TaG + TaJ; + ThU = ThQ + ThT; + ThV = ThP + ThU; + Ti1 = ThU - ThP; + } + { + E Tc6, Tcw, Tc9, Tcx; + { + E Tc4, Tc5, Tc7, Tc8; + Tc4 = TaM + TaN; + Tc5 = TaP + TaQ; + Tc6 = FNMS(KP195090322, Tc5, KP980785280 * Tc4); + Tcw = FMA(KP980785280, Tc5, KP195090322 * Tc4); + Tc7 = TaT + TaU; + Tc8 = TaW + TaX; + Tc9 = FMA(KP195090322, Tc7, KP980785280 * Tc8); + Tcx = FNMS(KP195090322, Tc8, KP980785280 * Tc7); + } + Tca = Tc6 - Tc9; + Ti0 = Tcx - Tcw; + Tcy = Tcw + Tcx; + ThO = Tc6 + Tc9; + } + { + E Tce, TcA, Tch, TcB; + { + E Tcc, Tcd, Tcf, Tcg; + Tcc = Tbd + Tbe; + Tcd = Tba + Tb7; + Tce = Tcc - Tcd; + TcA = Tcc + Tcd; + Tcf = Tb2 + Tb3; + Tcg = Tbg + Tbh; + Tch = Tcf - Tcg; + TcB = Tcf + Tcg; + } + Tci = FMA(KP634393284, Tce, KP773010453 * Tch); + TcI = FNMS(KP098017140, TcA, KP995184726 * TcB); + Tcs = FNMS(KP773010453, Tce, KP634393284 * Tch); + TcC = FMA(KP995184726, TcA, KP098017140 * TcB); + } + { + E Tcl, TcD, Tco, TcE; + { + E Tcj, Tck, Tcm, Tcn; + Tcj = Tbl + Tbm; + Tck = TbA + Tbz; + Tcl = Tcj - Tck; + TcD = Tcj + Tck; + Tcm = Tbw + Tbx; + Tcn = Tbq + Tbt; + Tco = Tcm - Tcn; + TcE = Tcm + Tcn; + } + Tcp = FNMS(KP773010453, Tco, KP634393284 * Tcl); + TcJ = FMA(KP098017140, TcD, KP995184726 * TcE); + Tct = FMA(KP773010453, Tcl, KP634393284 * Tco); + TcF = FNMS(KP098017140, TcE, KP995184726 * TcD); + } + { + E Tcb, Tcq, ThZ, Ti2; + Tcb = Tc3 + Tca; + Tcq = Tci + Tcp; + ri[WS(rs, 41)] = Tcb - Tcq; + ri[WS(rs, 9)] = Tcb + Tcq; + ThZ = Tcs + Tct; + Ti2 = Ti0 + Ti1; + ii[WS(rs, 9)] = ThZ + Ti2; + ii[WS(rs, 41)] = Ti2 - ThZ; + } + { + E Tcr, Tcu, Ti3, Ti4; + Tcr = Tc3 - Tca; + Tcu = Tcs - Tct; + ri[WS(rs, 57)] = Tcr - Tcu; + ri[WS(rs, 25)] = Tcr + Tcu; + Ti3 = Tcp - Tci; + Ti4 = Ti1 - Ti0; + ii[WS(rs, 25)] = Ti3 + Ti4; + ii[WS(rs, 57)] = Ti4 - Ti3; + } + { + E Tcz, TcG, ThN, ThW; + Tcz = Tcv + Tcy; + TcG = TcC + TcF; + ri[WS(rs, 33)] = Tcz - TcG; + ri[WS(rs, 1)] = Tcz + TcG; + ThN = TcI + TcJ; + ThW = ThO + ThV; + ii[WS(rs, 1)] = ThN + ThW; + ii[WS(rs, 33)] = ThW - ThN; + } + { + E TcH, TcK, ThX, ThY; + TcH = Tcv - Tcy; + TcK = TcI - TcJ; + ri[WS(rs, 49)] = TcH - TcK; + ri[WS(rs, 17)] = TcH + TcK; + ThX = TcF - TcC; + ThY = ThV - ThO; + ii[WS(rs, 17)] = ThX + ThY; + ii[WS(rs, 49)] = ThY - ThX; + } + } + { + E T9R, Taj, Tip, Tiv, T9Y, Tiu, Tam, Tik, Ta6, Taw, Tag, Taq, Tad, Tax, Tah; + E Tat; + { + E T9N, T9Q, Til, Tio; + T9N = T6b + T6m; + T9Q = T9O + T9P; + T9R = T9N - T9Q; + Taj = T9N + T9Q; + Til = T6y + T6J; + Tio = Tim + Tin; + Tip = Til + Tio; + Tiv = Tio - Til; + } + { + E T9U, Tak, T9X, Tal; + { + E T9S, T9T, T9V, T9W; + T9S = T6Q + T71; + T9T = T77 + T7a; + T9U = FNMS(KP555570233, T9T, KP831469612 * T9S); + Tak = FMA(KP555570233, T9S, KP831469612 * T9T); + T9V = T7h + T7s; + T9W = T7y + T7B; + T9X = FMA(KP831469612, T9V, KP555570233 * T9W); + Tal = FNMS(KP555570233, T9V, KP831469612 * T9W); + } + T9Y = T9U - T9X; + Tiu = Tal - Tak; + Tam = Tak + Tal; + Tik = T9U + T9X; + } + { + E Ta2, Tao, Ta5, Tap; + { + E Ta0, Ta1, Ta3, Ta4; + Ta0 = T8p + T8s; + Ta1 = T8i + T87; + Ta2 = Ta0 - Ta1; + Tao = Ta0 + Ta1; + Ta3 = T7K + T7V; + Ta4 = T8u + T8v; + Ta5 = Ta3 - Ta4; + Tap = Ta3 + Ta4; + } + Ta6 = FMA(KP471396736, Ta2, KP881921264 * Ta5); + Taw = FNMS(KP290284677, Tao, KP956940335 * Tap); + Tag = FNMS(KP881921264, Ta2, KP471396736 * Ta5); + Taq = FMA(KP956940335, Tao, KP290284677 * Tap); + } + { + E Ta9, Tar, Tac, Tas; + { + E Ta7, Ta8, Taa, Tab; + Ta7 = T8D + T8O; + Ta8 = T9o + T9n; + Ta9 = Ta7 - Ta8; + Tar = Ta7 + Ta8; + Taa = T9i + T9l; + Tab = T90 + T9b; + Tac = Taa - Tab; + Tas = Taa + Tab; + } + Tad = FNMS(KP881921264, Tac, KP471396736 * Ta9); + Tax = FMA(KP290284677, Tar, KP956940335 * Tas); + Tah = FMA(KP881921264, Ta9, KP471396736 * Tac); + Tat = FNMS(KP290284677, Tas, KP956940335 * Tar); + } + { + E T9Z, Tae, Tit, Tiw; + T9Z = T9R + T9Y; + Tae = Ta6 + Tad; + ri[WS(rs, 43)] = T9Z - Tae; + ri[WS(rs, 11)] = T9Z + Tae; + Tit = Tag + Tah; + Tiw = Tiu + Tiv; + ii[WS(rs, 11)] = Tit + Tiw; + ii[WS(rs, 43)] = Tiw - Tit; + } + { + E Taf, Tai, Tix, Tiy; + Taf = T9R - T9Y; + Tai = Tag - Tah; + ri[WS(rs, 59)] = Taf - Tai; + ri[WS(rs, 27)] = Taf + Tai; + Tix = Tad - Ta6; + Tiy = Tiv - Tiu; + ii[WS(rs, 27)] = Tix + Tiy; + ii[WS(rs, 59)] = Tiy - Tix; + } + { + E Tan, Tau, Tij, Tiq; + Tan = Taj + Tam; + Tau = Taq + Tat; + ri[WS(rs, 35)] = Tan - Tau; + ri[WS(rs, 3)] = Tan + Tau; + Tij = Taw + Tax; + Tiq = Tik + Tip; + ii[WS(rs, 3)] = Tij + Tiq; + ii[WS(rs, 35)] = Tiq - Tij; + } + { + E Tav, Tay, Tir, Tis; + Tav = Taj - Tam; + Tay = Taw - Tax; + ri[WS(rs, 51)] = Tav - Tay; + ri[WS(rs, 19)] = Tav + Tay; + Tir = Tat - Taq; + Tis = Tip - Tik; + ii[WS(rs, 19)] = Tir + Tis; + ii[WS(rs, 51)] = Tis - Tir; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 64}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 64, "t1_64", twinstr, &GENUS, {808, 270, 230, 0}, 0, 0, 0 }; + +void X(codelet_t1_64) (planner *p) { + X(kdft_dit_register) (p, t1_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_7.c new file mode 100644 index 000000000..f11db10f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_7.c @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 7 -name t1_7 -include dft/scalar/t.h */ + +/* + * This function contains 72 FP additions, 66 FP multiplications, + * (or, 18 additions, 12 multiplications, 54 fused multiply/add), + * 37 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT m; + for (m = mb, W = W + (mb * 12); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 12, MAKE_VOLATILE_STRIDE(14, rs)) { + E T1, T1c, Te, T1h, TR, T19, Tr, T1g, TM, T1a, TE, T1i, TW, T1b; + T1 = ri[0]; + T1c = ii[0]; + { + E T3, T6, T4, TN, T9, Tc, Ta, TP, T2, T8; + T3 = ri[WS(rs, 1)]; + T6 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + TN = T2 * T6; + T9 = ri[WS(rs, 6)]; + Tc = ii[WS(rs, 6)]; + T8 = W[10]; + Ta = T8 * T9; + TP = T8 * Tc; + { + E T7, TO, Td, TQ, T5, Tb; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + TO = FNMS(T5, T3, TN); + Tb = W[11]; + Td = FMA(Tb, Tc, Ta); + TQ = FNMS(Tb, T9, TP); + Te = T7 + Td; + T1h = Td - T7; + TR = TO - TQ; + T19 = TO + TQ; + } + } + { + E Tg, Tj, Th, TI, Tm, Tp, Tn, TK, Tf, Tl; + Tg = ri[WS(rs, 2)]; + Tj = ii[WS(rs, 2)]; + Tf = W[2]; + Th = Tf * Tg; + TI = Tf * Tj; + Tm = ri[WS(rs, 5)]; + Tp = ii[WS(rs, 5)]; + Tl = W[8]; + Tn = Tl * Tm; + TK = Tl * Tp; + { + E Tk, TJ, Tq, TL, Ti, To; + Ti = W[3]; + Tk = FMA(Ti, Tj, Th); + TJ = FNMS(Ti, Tg, TI); + To = W[9]; + Tq = FMA(To, Tp, Tn); + TL = FNMS(To, Tm, TK); + Tr = Tk + Tq; + T1g = Tq - Tk; + TM = TJ - TL; + T1a = TJ + TL; + } + } + { + E Tt, Tw, Tu, TS, Tz, TC, TA, TU, Ts, Ty; + Tt = ri[WS(rs, 3)]; + Tw = ii[WS(rs, 3)]; + Ts = W[4]; + Tu = Ts * Tt; + TS = Ts * Tw; + Tz = ri[WS(rs, 4)]; + TC = ii[WS(rs, 4)]; + Ty = W[6]; + TA = Ty * Tz; + TU = Ty * TC; + { + E Tx, TT, TD, TV, Tv, TB; + Tv = W[5]; + Tx = FMA(Tv, Tw, Tu); + TT = FNMS(Tv, Tt, TS); + TB = W[7]; + TD = FMA(TB, TC, TA); + TV = FNMS(TB, Tz, TU); + TE = Tx + TD; + T1i = TD - Tx; + TW = TT - TV; + T1b = TT + TV; + } + } + ri[0] = T1 + Te + Tr + TE; + ii[0] = T19 + T1a + T1b + T1c; + { + E TG, TY, TF, TX, TH; + TF = FNMS(KP356895867, Tr, Te); + TG = FNMS(KP692021471, TF, TE); + TX = FMA(KP554958132, TW, TR); + TY = FMA(KP801937735, TX, TM); + TH = FNMS(KP900968867, TG, T1); + ri[WS(rs, 6)] = FNMS(KP974927912, TY, TH); + ri[WS(rs, 1)] = FMA(KP974927912, TY, TH); + } + { + E T1e, T1k, T1d, T1j, T1f; + T1d = FNMS(KP356895867, T1a, T19); + T1e = FNMS(KP692021471, T1d, T1b); + T1j = FMA(KP554958132, T1i, T1h); + T1k = FMA(KP801937735, T1j, T1g); + T1f = FNMS(KP900968867, T1e, T1c); + ii[WS(rs, 1)] = FMA(KP974927912, T1k, T1f); + ii[WS(rs, 6)] = FNMS(KP974927912, T1k, T1f); + } + { + E T10, T13, TZ, T12, T11; + TZ = FNMS(KP356895867, Te, TE); + T10 = FNMS(KP692021471, TZ, Tr); + T12 = FMA(KP554958132, TM, TW); + T13 = FNMS(KP801937735, T12, TR); + T11 = FNMS(KP900968867, T10, T1); + ri[WS(rs, 5)] = FNMS(KP974927912, T13, T11); + ri[WS(rs, 2)] = FMA(KP974927912, T13, T11); + } + { + E T1m, T1p, T1l, T1o, T1n; + T1l = FNMS(KP356895867, T19, T1b); + T1m = FNMS(KP692021471, T1l, T1a); + T1o = FMA(KP554958132, T1g, T1i); + T1p = FNMS(KP801937735, T1o, T1h); + T1n = FNMS(KP900968867, T1m, T1c); + ii[WS(rs, 2)] = FMA(KP974927912, T1p, T1n); + ii[WS(rs, 5)] = FNMS(KP974927912, T1p, T1n); + } + { + E T15, T18, T14, T17, T16; + T14 = FNMS(KP356895867, TE, Tr); + T15 = FNMS(KP692021471, T14, Te); + T17 = FNMS(KP554958132, TR, TM); + T18 = FNMS(KP801937735, T17, TW); + T16 = FNMS(KP900968867, T15, T1); + ri[WS(rs, 4)] = FNMS(KP974927912, T18, T16); + ri[WS(rs, 3)] = FMA(KP974927912, T18, T16); + } + { + E T1r, T1u, T1q, T1t, T1s; + T1q = FNMS(KP356895867, T1b, T1a); + T1r = FNMS(KP692021471, T1q, T19); + T1t = FNMS(KP554958132, T1h, T1g); + T1u = FNMS(KP801937735, T1t, T1i); + T1s = FNMS(KP900968867, T1r, T1c); + ii[WS(rs, 3)] = FMA(KP974927912, T1u, T1s); + ii[WS(rs, 4)] = FNMS(KP974927912, T1u, T1s); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 7}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 7, "t1_7", twinstr, &GENUS, {18, 12, 54, 0}, 0, 0, 0 }; + +void X(codelet_t1_7) (planner *p) { + X(kdft_dit_register) (p, t1_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 7 -name t1_7 -include dft/scalar/t.h */ + +/* + * This function contains 72 FP additions, 60 FP multiplications, + * (or, 36 additions, 24 multiplications, 36 fused multiply/add), + * 29 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT m; + for (m = mb, W = W + (mb * 12); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 12, MAKE_VOLATILE_STRIDE(14, rs)) { + E T1, TR, Tc, TS, TC, TO, Tn, TT, TI, TP, Ty, TU, TF, TQ; + T1 = ri[0]; + TR = ii[0]; + { + E T6, TA, Tb, TB; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 1)]; + T5 = ii[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + TA = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 6)]; + Ta = ii[WS(rs, 6)]; + T7 = W[10]; + T9 = W[11]; + Tb = FMA(T7, T8, T9 * Ta); + TB = FNMS(T9, T8, T7 * Ta); + } + Tc = T6 + Tb; + TS = Tb - T6; + TC = TA - TB; + TO = TA + TB; + } + { + E Th, TG, Tm, TH; + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 2)]; + Tg = ii[WS(rs, 2)]; + Td = W[2]; + Tf = W[3]; + Th = FMA(Td, Te, Tf * Tg); + TG = FNMS(Tf, Te, Td * Tg); + } + { + E Tj, Tl, Ti, Tk; + Tj = ri[WS(rs, 5)]; + Tl = ii[WS(rs, 5)]; + Ti = W[8]; + Tk = W[9]; + Tm = FMA(Ti, Tj, Tk * Tl); + TH = FNMS(Tk, Tj, Ti * Tl); + } + Tn = Th + Tm; + TT = Tm - Th; + TI = TG - TH; + TP = TG + TH; + } + { + E Ts, TD, Tx, TE; + { + E Tp, Tr, To, Tq; + Tp = ri[WS(rs, 3)]; + Tr = ii[WS(rs, 3)]; + To = W[4]; + Tq = W[5]; + Ts = FMA(To, Tp, Tq * Tr); + TD = FNMS(Tq, Tp, To * Tr); + } + { + E Tu, Tw, Tt, Tv; + Tu = ri[WS(rs, 4)]; + Tw = ii[WS(rs, 4)]; + Tt = W[6]; + Tv = W[7]; + Tx = FMA(Tt, Tu, Tv * Tw); + TE = FNMS(Tv, Tu, Tt * Tw); + } + Ty = Ts + Tx; + TU = Tx - Ts; + TF = TD - TE; + TQ = TD + TE; + } + ri[0] = T1 + Tc + Tn + Ty; + ii[0] = TO + TP + TQ + TR; + { + E TJ, Tz, TX, TY; + TJ = FNMS(KP781831482, TF, KP974927912 * TC) - (KP433883739 * TI); + Tz = FMA(KP623489801, Ty, T1) + FNMA(KP900968867, Tn, KP222520933 * Tc); + ri[WS(rs, 5)] = Tz - TJ; + ri[WS(rs, 2)] = Tz + TJ; + TX = FNMS(KP781831482, TU, KP974927912 * TS) - (KP433883739 * TT); + TY = FMA(KP623489801, TQ, TR) + FNMA(KP900968867, TP, KP222520933 * TO); + ii[WS(rs, 2)] = TX + TY; + ii[WS(rs, 5)] = TY - TX; + } + { + E TL, TK, TV, TW; + TL = FMA(KP781831482, TC, KP974927912 * TI) + (KP433883739 * TF); + TK = FMA(KP623489801, Tc, T1) + FNMA(KP900968867, Ty, KP222520933 * Tn); + ri[WS(rs, 6)] = TK - TL; + ri[WS(rs, 1)] = TK + TL; + TV = FMA(KP781831482, TS, KP974927912 * TT) + (KP433883739 * TU); + TW = FMA(KP623489801, TO, TR) + FNMA(KP900968867, TQ, KP222520933 * TP); + ii[WS(rs, 1)] = TV + TW; + ii[WS(rs, 6)] = TW - TV; + } + { + E TN, TM, TZ, T10; + TN = FMA(KP433883739, TC, KP974927912 * TF) - (KP781831482 * TI); + TM = FMA(KP623489801, Tn, T1) + FNMA(KP222520933, Ty, KP900968867 * Tc); + ri[WS(rs, 4)] = TM - TN; + ri[WS(rs, 3)] = TM + TN; + TZ = FMA(KP433883739, TS, KP974927912 * TU) - (KP781831482 * TT); + T10 = FMA(KP623489801, TP, TR) + FNMA(KP222520933, TQ, KP900968867 * TO); + ii[WS(rs, 3)] = TZ + T10; + ii[WS(rs, 4)] = T10 - TZ; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 7}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 7, "t1_7", twinstr, &GENUS, {36, 24, 36, 0}, 0, 0, 0 }; + +void X(codelet_t1_7) (planner *p) { + X(kdft_dit_register) (p, t1_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_8.c new file mode 100644 index 000000000..613c126a3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_8.c @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -name t1_8 -include dft/scalar/t.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 44 additions, 14 multiplications, 22 fused multiply/add), + * 34 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 14); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs)) { + E T1, T1m, T7, T1l, Tk, TS, Te, TQ, TF, T14, TL, T16, T12, T17, Ts; + E TX, Ty, TZ, TV, T10; + T1 = ri[0]; + T1m = ii[0]; + { + E T3, T6, T4, T1k, T2, T5; + T3 = ri[WS(rs, 4)]; + T6 = ii[WS(rs, 4)]; + T2 = W[6]; + T4 = T2 * T3; + T1k = T2 * T6; + T5 = W[7]; + T7 = FMA(T5, T6, T4); + T1l = FNMS(T5, T3, T1k); + } + { + E Tg, Tj, Th, TR, Tf, Ti; + Tg = ri[WS(rs, 6)]; + Tj = ii[WS(rs, 6)]; + Tf = W[10]; + Th = Tf * Tg; + TR = Tf * Tj; + Ti = W[11]; + Tk = FMA(Ti, Tj, Th); + TS = FNMS(Ti, Tg, TR); + } + { + E Ta, Td, Tb, TP, T9, Tc; + Ta = ri[WS(rs, 2)]; + Td = ii[WS(rs, 2)]; + T9 = W[2]; + Tb = T9 * Ta; + TP = T9 * Td; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + TQ = FNMS(Tc, Ta, TP); + } + { + E TB, TE, TC, T13, TH, TK, TI, T15, TA, TG, TD, TJ; + TB = ri[WS(rs, 7)]; + TE = ii[WS(rs, 7)]; + TA = W[12]; + TC = TA * TB; + T13 = TA * TE; + TH = ri[WS(rs, 3)]; + TK = ii[WS(rs, 3)]; + TG = W[4]; + TI = TG * TH; + T15 = TG * TK; + TD = W[13]; + TF = FMA(TD, TE, TC); + T14 = FNMS(TD, TB, T13); + TJ = W[5]; + TL = FMA(TJ, TK, TI); + T16 = FNMS(TJ, TH, T15); + T12 = TF - TL; + T17 = T14 - T16; + } + { + E To, Tr, Tp, TW, Tu, Tx, Tv, TY, Tn, Tt, Tq, Tw; + To = ri[WS(rs, 1)]; + Tr = ii[WS(rs, 1)]; + Tn = W[0]; + Tp = Tn * To; + TW = Tn * Tr; + Tu = ri[WS(rs, 5)]; + Tx = ii[WS(rs, 5)]; + Tt = W[8]; + Tv = Tt * Tu; + TY = Tt * Tx; + Tq = W[1]; + Ts = FMA(Tq, Tr, Tp); + TX = FNMS(Tq, To, TW); + Tw = W[9]; + Ty = FMA(Tw, Tx, Tv); + TZ = FNMS(Tw, Tu, TY); + TV = Ts - Ty; + T10 = TX - TZ; + } + { + E TU, T1a, T1t, T1v, T19, T1w, T1d, T1u; + { + E TO, TT, T1r, T1s; + TO = T1 - T7; + TT = TQ - TS; + TU = TO + TT; + T1a = TO - TT; + T1r = T1m - T1l; + T1s = Te - Tk; + T1t = T1r - T1s; + T1v = T1s + T1r; + } + { + E T11, T18, T1b, T1c; + T11 = TV + T10; + T18 = T12 - T17; + T19 = T11 + T18; + T1w = T18 - T11; + T1b = T10 - TV; + T1c = T12 + T17; + T1d = T1b - T1c; + T1u = T1b + T1c; + } + ri[WS(rs, 5)] = FNMS(KP707106781, T19, TU); + ii[WS(rs, 5)] = FNMS(KP707106781, T1u, T1t); + ri[WS(rs, 1)] = FMA(KP707106781, T19, TU); + ii[WS(rs, 1)] = FMA(KP707106781, T1u, T1t); + ri[WS(rs, 7)] = FNMS(KP707106781, T1d, T1a); + ii[WS(rs, 7)] = FNMS(KP707106781, T1w, T1v); + ri[WS(rs, 3)] = FMA(KP707106781, T1d, T1a); + ii[WS(rs, 3)] = FMA(KP707106781, T1w, T1v); + } + { + E Tm, T1e, T1o, T1q, TN, T1p, T1h, T1i; + { + E T8, Tl, T1j, T1n; + T8 = T1 + T7; + Tl = Te + Tk; + Tm = T8 + Tl; + T1e = T8 - Tl; + T1j = TQ + TS; + T1n = T1l + T1m; + T1o = T1j + T1n; + T1q = T1n - T1j; + } + { + E Tz, TM, T1f, T1g; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz + TM; + T1p = TM - Tz; + T1f = TX + TZ; + T1g = T14 + T16; + T1h = T1f - T1g; + T1i = T1f + T1g; + } + ri[WS(rs, 4)] = Tm - TN; + ii[WS(rs, 4)] = T1o - T1i; + ri[0] = Tm + TN; + ii[0] = T1i + T1o; + ri[WS(rs, 6)] = T1e - T1h; + ii[WS(rs, 6)] = T1q - T1p; + ri[WS(rs, 2)] = T1e + T1h; + ii[WS(rs, 2)] = T1p + T1q; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 8}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 8, "t1_8", twinstr, &GENUS, {44, 14, 22, 0}, 0, 0, 0 }; + +void X(codelet_t1_8) (planner *p) { + X(kdft_dit_register) (p, t1_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 8 -name t1_8 -include dft/scalar/t.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 52 additions, 18 multiplications, 14 fused multiply/add), + * 28 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 14); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs)) { + E T7, T1e, TH, T19, TF, T13, TR, TU, Ti, T1f, TK, T16, Tu, T12, TM; + E TP; + { + E T1, T18, T6, T17; + T1 = ri[0]; + T18 = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 4)]; + T5 = ii[WS(rs, 4)]; + T2 = W[6]; + T4 = W[7]; + T6 = FMA(T2, T3, T4 * T5); + T17 = FNMS(T4, T3, T2 * T5); + } + T7 = T1 + T6; + T1e = T18 - T17; + TH = T1 - T6; + T19 = T17 + T18; + } + { + E Tz, TS, TE, TT; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 7)]; + Ty = ii[WS(rs, 7)]; + Tv = W[12]; + Tx = W[13]; + Tz = FMA(Tv, Tw, Tx * Ty); + TS = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 3)]; + TD = ii[WS(rs, 3)]; + TA = W[4]; + TC = W[5]; + TE = FMA(TA, TB, TC * TD); + TT = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T13 = TS + TT; + TR = Tz - TE; + TU = TS - TT; + } + { + E Tc, TI, Th, TJ; + { + E T9, Tb, T8, Ta; + T9 = ri[WS(rs, 2)]; + Tb = ii[WS(rs, 2)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + TI = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = ri[WS(rs, 6)]; + Tg = ii[WS(rs, 6)]; + Td = W[10]; + Tf = W[11]; + Th = FMA(Td, Te, Tf * Tg); + TJ = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc + Th; + T1f = Tc - Th; + TK = TI - TJ; + T16 = TI + TJ; + } + { + E To, TN, Tt, TO; + { + E Tl, Tn, Tk, Tm; + Tl = ri[WS(rs, 1)]; + Tn = ii[WS(rs, 1)]; + Tk = W[0]; + Tm = W[1]; + To = FMA(Tk, Tl, Tm * Tn); + TN = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = ri[WS(rs, 5)]; + Ts = ii[WS(rs, 5)]; + Tp = W[8]; + Tr = W[9]; + Tt = FMA(Tp, Tq, Tr * Ts); + TO = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T12 = TN + TO; + TM = To - Tt; + TP = TN - TO; + } + { + E Tj, TG, T1b, T1c; + Tj = T7 + Ti; + TG = Tu + TF; + ri[WS(rs, 4)] = Tj - TG; + ri[0] = Tj + TG; + { + E T15, T1a, T11, T14; + T15 = T12 + T13; + T1a = T16 + T19; + ii[0] = T15 + T1a; + ii[WS(rs, 4)] = T1a - T15; + T11 = T7 - Ti; + T14 = T12 - T13; + ri[WS(rs, 6)] = T11 - T14; + ri[WS(rs, 2)] = T11 + T14; + } + T1b = TF - Tu; + T1c = T19 - T16; + ii[WS(rs, 2)] = T1b + T1c; + ii[WS(rs, 6)] = T1c - T1b; + { + E TX, T1g, T10, T1d, TY, TZ; + TX = TH - TK; + T1g = T1e - T1f; + TY = TP - TM; + TZ = TR + TU; + T10 = KP707106781 * (TY - TZ); + T1d = KP707106781 * (TY + TZ); + ri[WS(rs, 7)] = TX - T10; + ii[WS(rs, 5)] = T1g - T1d; + ri[WS(rs, 3)] = TX + T10; + ii[WS(rs, 1)] = T1d + T1g; + } + { + E TL, T1i, TW, T1h, TQ, TV; + TL = TH + TK; + T1i = T1f + T1e; + TQ = TM + TP; + TV = TR - TU; + TW = KP707106781 * (TQ + TV); + T1h = KP707106781 * (TV - TQ); + ri[WS(rs, 5)] = TL - TW; + ii[WS(rs, 7)] = T1i - T1h; + ri[WS(rs, 1)] = TL + TW; + ii[WS(rs, 3)] = T1h + T1i; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 8}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 8, "t1_8", twinstr, &GENUS, {52, 18, 14, 0}, 0, 0, 0 }; + +void X(codelet_t1_8) (planner *p) { + X(kdft_dit_register) (p, t1_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_9.c new file mode 100644 index 000000000..d02b2dade --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t1_9.c @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -n 9 -name t1_9 -include dft/scalar/t.h */ + +/* + * This function contains 96 FP additions, 88 FP multiplications, + * (or, 24 additions, 16 multiplications, 72 fused multiply/add), + * 55 stack variables, 10 constants, and 36 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP492403876, +0.492403876506104029683371512294761506835321626); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP954188894, +0.954188894138671133499268364187245676532219158); + DK(KP363970234, +0.363970234266202361351047882776834043890471784); + DK(KP777861913, +0.777861913430206160028177977318626690410586096); + DK(KP839099631, +0.839099631177280011763127298123181364687434283); + DK(KP176326980, +0.176326980708464973471090386868618986121633062); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 16); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 16, MAKE_VOLATILE_STRIDE(18, rs)) { + E T1, T1R, Te, T1W, T10, T1Q, T1l, T1r, Ty, T1p, Tl, T1o, T1g, T1q, T1a; + E T1d, TS, T18, TF, T13, T19, T1c; + T1 = ri[0]; + T1R = ii[0]; + { + E T3, T6, T4, TW, T9, Tc, Ta, TY, T2, T8; + T3 = ri[WS(rs, 3)]; + T6 = ii[WS(rs, 3)]; + T2 = W[4]; + T4 = T2 * T3; + TW = T2 * T6; + T9 = ri[WS(rs, 6)]; + Tc = ii[WS(rs, 6)]; + T8 = W[10]; + Ta = T8 * T9; + TY = T8 * Tc; + { + E T7, TX, Td, TZ, T5, Tb; + T5 = W[5]; + T7 = FMA(T5, T6, T4); + TX = FNMS(T5, T3, TW); + Tb = W[11]; + Td = FMA(Tb, Tc, Ta); + TZ = FNMS(Tb, T9, TY); + Te = T7 + Td; + T1W = Td - T7; + T10 = TX - TZ; + T1Q = TX + TZ; + } + } + { + E Th, Tk, Ti, T1n, Tx, T1i, Tr, T1k, Tg, Tj; + Th = ri[WS(rs, 1)]; + Tk = ii[WS(rs, 1)]; + Tg = W[0]; + Ti = Tg * Th; + T1n = Tg * Tk; + { + E Tt, Tw, Tu, T1h, Ts, Tv; + Tt = ri[WS(rs, 7)]; + Tw = ii[WS(rs, 7)]; + Ts = W[12]; + Tu = Ts * Tt; + T1h = Ts * Tw; + Tv = W[13]; + Tx = FMA(Tv, Tw, Tu); + T1i = FNMS(Tv, Tt, T1h); + } + { + E Tn, Tq, To, T1j, Tm, Tp; + Tn = ri[WS(rs, 4)]; + Tq = ii[WS(rs, 4)]; + Tm = W[6]; + To = Tm * Tn; + T1j = Tm * Tq; + Tp = W[7]; + Tr = FMA(Tp, Tq, To); + T1k = FNMS(Tp, Tn, T1j); + } + T1l = T1i - T1k; + T1r = Tr - Tx; + Ty = Tr + Tx; + T1p = T1k + T1i; + Tj = W[1]; + Tl = FMA(Tj, Tk, Ti); + T1o = FNMS(Tj, Th, T1n); + T1g = FNMS(KP500000000, Ty, Tl); + T1q = FNMS(KP500000000, T1p, T1o); + } + { + E TB, TE, TC, T12, TR, T17, TL, T15, TA, TD; + TB = ri[WS(rs, 2)]; + TE = ii[WS(rs, 2)]; + TA = W[2]; + TC = TA * TB; + T12 = TA * TE; + { + E TN, TQ, TO, T16, TM, TP; + TN = ri[WS(rs, 8)]; + TQ = ii[WS(rs, 8)]; + TM = W[14]; + TO = TM * TN; + T16 = TM * TQ; + TP = W[15]; + TR = FMA(TP, TQ, TO); + T17 = FNMS(TP, TN, T16); + } + { + E TH, TK, TI, T14, TG, TJ; + TH = ri[WS(rs, 5)]; + TK = ii[WS(rs, 5)]; + TG = W[8]; + TI = TG * TH; + T14 = TG * TK; + TJ = W[9]; + TL = FMA(TJ, TK, TI); + T15 = FNMS(TJ, TH, T14); + } + T1a = TR - TL; + T1d = T15 - T17; + TS = TL + TR; + T18 = T15 + T17; + TD = W[3]; + TF = FMA(TD, TE, TC); + T13 = FNMS(TD, TB, T12); + T19 = FNMS(KP500000000, T18, T13); + T1c = FNMS(KP500000000, TS, TF); + } + { + E Tf, T1S, TU, T1U, T1O, T1P, T1L, T1T; + Tf = T1 + Te; + T1S = T1Q + T1R; + { + E Tz, TT, T1M, T1N; + Tz = Tl + Ty; + TT = TF + TS; + TU = Tz + TT; + T1U = TT - Tz; + T1M = T1o + T1p; + T1N = T13 + T18; + T1O = T1M - T1N; + T1P = T1M + T1N; + } + ri[0] = Tf + TU; + ii[0] = T1P + T1S; + T1L = FNMS(KP500000000, TU, Tf); + ri[WS(rs, 6)] = FNMS(KP866025403, T1O, T1L); + ri[WS(rs, 3)] = FMA(KP866025403, T1O, T1L); + T1T = FNMS(KP500000000, T1P, T1S); + ii[WS(rs, 3)] = FMA(KP866025403, T1U, T1T); + ii[WS(rs, 6)] = FNMS(KP866025403, T1U, T1T); + } + { + E T11, T1z, T1X, T21, T1f, T1w, T1t, T1x, T1u, T1Y, T1C, T1I, T1F, T1J, T1G; + E T22, TV, T1V; + TV = FNMS(KP500000000, Te, T1); + T11 = FMA(KP866025403, T10, TV); + T1z = FNMS(KP866025403, T10, TV); + T1V = FNMS(KP500000000, T1Q, T1R); + T1X = FMA(KP866025403, T1W, T1V); + T21 = FNMS(KP866025403, T1W, T1V); + { + E T1b, T1e, T1m, T1s; + T1b = FMA(KP866025403, T1a, T19); + T1e = FMA(KP866025403, T1d, T1c); + T1f = FMA(KP176326980, T1e, T1b); + T1w = FNMS(KP176326980, T1b, T1e); + T1m = FNMS(KP866025403, T1l, T1g); + T1s = FNMS(KP866025403, T1r, T1q); + T1t = FMA(KP839099631, T1s, T1m); + T1x = FNMS(KP839099631, T1m, T1s); + } + T1u = FMA(KP777861913, T1t, T1f); + T1Y = FNMS(KP777861913, T1x, T1w); + { + E T1A, T1B, T1D, T1E; + T1A = FMA(KP866025403, T1r, T1q); + T1B = FMA(KP866025403, T1l, T1g); + T1C = FMA(KP176326980, T1B, T1A); + T1I = FNMS(KP176326980, T1A, T1B); + T1D = FNMS(KP866025403, T1d, T1c); + T1E = FNMS(KP866025403, T1a, T19); + T1F = FNMS(KP363970234, T1E, T1D); + T1J = FMA(KP363970234, T1D, T1E); + } + T1G = FNMS(KP954188894, T1F, T1C); + T22 = FMA(KP954188894, T1J, T1I); + ri[WS(rs, 1)] = FMA(KP984807753, T1u, T11); + ii[WS(rs, 1)] = FNMS(KP984807753, T1Y, T1X); + ri[WS(rs, 2)] = FMA(KP984807753, T1G, T1z); + ii[WS(rs, 2)] = FNMS(KP984807753, T22, T21); + { + E T1v, T1y, T1Z, T20; + T1v = FNMS(KP492403876, T1u, T11); + T1y = FMA(KP777861913, T1x, T1w); + ri[WS(rs, 4)] = FMA(KP852868531, T1y, T1v); + ri[WS(rs, 7)] = FNMS(KP852868531, T1y, T1v); + T1Z = FMA(KP492403876, T1Y, T1X); + T20 = FNMS(KP777861913, T1t, T1f); + ii[WS(rs, 4)] = FMA(KP852868531, T20, T1Z); + ii[WS(rs, 7)] = FNMS(KP852868531, T20, T1Z); + } + { + E T1H, T1K, T23, T24; + T1H = FNMS(KP492403876, T1G, T1z); + T1K = FNMS(KP954188894, T1J, T1I); + ri[WS(rs, 5)] = FNMS(KP852868531, T1K, T1H); + ri[WS(rs, 8)] = FMA(KP852868531, T1K, T1H); + T23 = FMA(KP492403876, T22, T21); + T24 = FMA(KP954188894, T1F, T1C); + ii[WS(rs, 5)] = FNMS(KP852868531, T24, T23); + ii[WS(rs, 8)] = FMA(KP852868531, T24, T23); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 9}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 9, "t1_9", twinstr, &GENUS, {24, 16, 72, 0}, 0, 0, 0 }; + +void X(codelet_t1_9) (planner *p) { + X(kdft_dit_register) (p, t1_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -n 9 -name t1_9 -include dft/scalar/t.h */ + +/* + * This function contains 96 FP additions, 72 FP multiplications, + * (or, 60 additions, 36 multiplications, 36 fused multiply/add), + * 41 stack variables, 8 constants, and 36 memory accesses + */ +#include "dft/scalar/t.h" + +static void t1_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP342020143, +0.342020143325668733044099614682259580763083368); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + (mb * 16); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 16, MAKE_VOLATILE_STRIDE(18, rs)) { + E T1, T1B, TQ, T1G, Tc, TN, T1A, T1H, TL, T1x, T17, T1o, T1c, T1n, Tu; + E T1w, TW, T1k, T11, T1l; + { + E T6, TO, Tb, TP; + T1 = ri[0]; + T1B = ii[0]; + { + E T3, T5, T2, T4; + T3 = ri[WS(rs, 3)]; + T5 = ii[WS(rs, 3)]; + T2 = W[4]; + T4 = W[5]; + T6 = FMA(T2, T3, T4 * T5); + TO = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = ri[WS(rs, 6)]; + Ta = ii[WS(rs, 6)]; + T7 = W[10]; + T9 = W[11]; + Tb = FMA(T7, T8, T9 * Ta); + TP = FNMS(T9, T8, T7 * Ta); + } + TQ = KP866025403 * (TO - TP); + T1G = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + TN = FNMS(KP500000000, Tc, T1); + T1A = TO + TP; + T1H = FNMS(KP500000000, T1A, T1B); + } + { + E Tz, T19, TE, T14, TJ, T15, TK, T1a; + { + E Tw, Ty, Tv, Tx; + Tw = ri[WS(rs, 2)]; + Ty = ii[WS(rs, 2)]; + Tv = W[2]; + Tx = W[3]; + Tz = FMA(Tv, Tw, Tx * Ty); + T19 = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = ri[WS(rs, 5)]; + TD = ii[WS(rs, 5)]; + TA = W[8]; + TC = W[9]; + TE = FMA(TA, TB, TC * TD); + T14 = FNMS(TC, TB, TA * TD); + } + { + E TG, TI, TF, TH; + TG = ri[WS(rs, 8)]; + TI = ii[WS(rs, 8)]; + TF = W[14]; + TH = W[15]; + TJ = FMA(TF, TG, TH * TI); + T15 = FNMS(TH, TG, TF * TI); + } + TK = TE + TJ; + T1a = T14 + T15; + TL = Tz + TK; + T1x = T19 + T1a; + { + E T13, T16, T18, T1b; + T13 = FNMS(KP500000000, TK, Tz); + T16 = KP866025403 * (T14 - T15); + T17 = T13 + T16; + T1o = T13 - T16; + T18 = KP866025403 * (TJ - TE); + T1b = FNMS(KP500000000, T1a, T19); + T1c = T18 + T1b; + T1n = T1b - T18; + } + } + { + E Ti, TY, Tn, TT, Ts, TU, Tt, TZ; + { + E Tf, Th, Te, Tg; + Tf = ri[WS(rs, 1)]; + Th = ii[WS(rs, 1)]; + Te = W[0]; + Tg = W[1]; + Ti = FMA(Te, Tf, Tg * Th); + TY = FNMS(Tg, Tf, Te * Th); + } + { + E Tk, Tm, Tj, Tl; + Tk = ri[WS(rs, 4)]; + Tm = ii[WS(rs, 4)]; + Tj = W[6]; + Tl = W[7]; + Tn = FMA(Tj, Tk, Tl * Tm); + TT = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = ri[WS(rs, 7)]; + Tr = ii[WS(rs, 7)]; + To = W[12]; + Tq = W[13]; + Ts = FMA(To, Tp, Tq * Tr); + TU = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn + Ts; + TZ = TT + TU; + Tu = Ti + Tt; + T1w = TY + TZ; + { + E TS, TV, TX, T10; + TS = FNMS(KP500000000, Tt, Ti); + TV = KP866025403 * (TT - TU); + TW = TS + TV; + T1k = TS - TV; + TX = KP866025403 * (Ts - Tn); + T10 = FNMS(KP500000000, TZ, TY); + T11 = TX + T10; + T1l = T10 - TX; + } + } + { + E T1y, Td, TM, T1v; + T1y = KP866025403 * (T1w - T1x); + Td = T1 + Tc; + TM = Tu + TL; + T1v = FNMS(KP500000000, TM, Td); + ri[0] = Td + TM; + ri[WS(rs, 3)] = T1v + T1y; + ri[WS(rs, 6)] = T1v - T1y; + } + { + E T1D, T1z, T1C, T1E; + T1D = KP866025403 * (TL - Tu); + T1z = T1w + T1x; + T1C = T1A + T1B; + T1E = FNMS(KP500000000, T1z, T1C); + ii[0] = T1z + T1C; + ii[WS(rs, 6)] = T1E - T1D; + ii[WS(rs, 3)] = T1D + T1E; + } + { + E TR, T1I, T1e, T1J, T1i, T1F, T1f, T1K; + TR = TN + TQ; + T1I = T1G + T1H; + { + E T12, T1d, T1g, T1h; + T12 = FMA(KP766044443, TW, KP642787609 * T11); + T1d = FMA(KP173648177, T17, KP984807753 * T1c); + T1e = T12 + T1d; + T1J = KP866025403 * (T1d - T12); + T1g = FNMS(KP642787609, TW, KP766044443 * T11); + T1h = FNMS(KP984807753, T17, KP173648177 * T1c); + T1i = KP866025403 * (T1g - T1h); + T1F = T1g + T1h; + } + ri[WS(rs, 1)] = TR + T1e; + ii[WS(rs, 1)] = T1F + T1I; + T1f = FNMS(KP500000000, T1e, TR); + ri[WS(rs, 7)] = T1f - T1i; + ri[WS(rs, 4)] = T1f + T1i; + T1K = FNMS(KP500000000, T1F, T1I); + ii[WS(rs, 4)] = T1J + T1K; + ii[WS(rs, 7)] = T1K - T1J; + } + { + E T1j, T1M, T1q, T1N, T1u, T1L, T1r, T1O; + T1j = TN - TQ; + T1M = T1H - T1G; + { + E T1m, T1p, T1s, T1t; + T1m = FMA(KP173648177, T1k, KP984807753 * T1l); + T1p = FNMS(KP939692620, T1o, KP342020143 * T1n); + T1q = T1m + T1p; + T1N = KP866025403 * (T1p - T1m); + T1s = FNMS(KP984807753, T1k, KP173648177 * T1l); + T1t = FMA(KP342020143, T1o, KP939692620 * T1n); + T1u = KP866025403 * (T1s + T1t); + T1L = T1s - T1t; + } + ri[WS(rs, 2)] = T1j + T1q; + ii[WS(rs, 2)] = T1L + T1M; + T1r = FNMS(KP500000000, T1q, T1j); + ri[WS(rs, 8)] = T1r - T1u; + ri[WS(rs, 5)] = T1r + T1u; + T1O = FNMS(KP500000000, T1L, T1M); + ii[WS(rs, 5)] = T1N + T1O; + ii[WS(rs, 8)] = T1O - T1N; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 0, 9}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 9, "t1_9", twinstr, &GENUS, {60, 36, 36, 0}, 0, 0, 0 }; + +void X(codelet_t1_9) (planner *p) { + X(kdft_dit_register) (p, t1_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_10.c new file mode 100644 index 000000000..3d5204618 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_10.c @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 10 -name t2_10 -include dft/scalar/t.h */ + +/* + * This function contains 114 FP additions, 94 FP multiplications, + * (or, 48 additions, 28 multiplications, 66 fused multiply/add), + * 63 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 6, MAKE_VOLATILE_STRIDE(20, rs)) { + E T2, T3, T8, Tc, T5, T6, Tl, T7, TB, TF, T12, TY, To, Ts, Tw; + E Tb, Td, Th; + { + E TA, TX, TE, T11, Ta, T4; + T2 = W[0]; + T3 = W[2]; + T4 = T2 * T3; + T8 = W[4]; + TA = T2 * T8; + TX = T3 * T8; + Tc = W[5]; + TE = T2 * Tc; + T11 = T3 * Tc; + T5 = W[1]; + T6 = W[3]; + Ta = T2 * T6; + Tl = FMA(T5, T6, T4); + T7 = FNMS(T5, T6, T4); + TB = FMA(T5, Tc, TA); + TF = FNMS(T5, T8, TE); + T12 = FNMS(T6, T8, T11); + TY = FMA(T6, Tc, TX); + { + E Tr, Tv, T9, Tg; + Tr = Tl * T8; + Tv = Tl * Tc; + To = FNMS(T5, T3, Ta); + Ts = FMA(To, Tc, Tr); + Tw = FNMS(To, T8, Tv); + T9 = T7 * T8; + Tg = T7 * Tc; + Tb = FMA(T5, T3, Ta); + Td = FMA(Tb, Tc, T9); + Th = FNMS(Tb, T8, Tg); + } + } + { + E Tk, T1c, T24, T2d, TW, T19, T1a, T1P, T1Q, T1Z, T1g, T1h, T1i, T1C, T1H; + E T2f, Tz, TM, TN, T1S, T1T, T1Y, T1d, T1e, T1f, T1r, T1w, T2e; + { + E T1, T23, Te, Tf, Ti, T21, Tj, T22; + T1 = ri[0]; + T23 = ii[0]; + Te = ri[WS(rs, 5)]; + Tf = Td * Te; + Ti = ii[WS(rs, 5)]; + T21 = Td * Ti; + Tj = FMA(Th, Ti, Tf); + Tk = T1 - Tj; + T1c = T1 + Tj; + T22 = FNMS(Th, Te, T21); + T24 = T22 + T23; + T2d = T23 - T22; + } + { + E TR, T1z, T18, T1G, TV, T1B, T14, T1E; + { + E TO, TP, TQ, T1y; + TO = ri[WS(rs, 4)]; + TP = T7 * TO; + TQ = ii[WS(rs, 4)]; + T1y = T7 * TQ; + TR = FMA(Tb, TQ, TP); + T1z = FNMS(Tb, TO, T1y); + } + { + E T15, T16, T17, T1F; + T15 = ri[WS(rs, 1)]; + T16 = T2 * T15; + T17 = ii[WS(rs, 1)]; + T1F = T2 * T17; + T18 = FMA(T5, T17, T16); + T1G = FNMS(T5, T15, T1F); + } + { + E TS, TT, TU, T1A; + TS = ri[WS(rs, 9)]; + TT = T8 * TS; + TU = ii[WS(rs, 9)]; + T1A = T8 * TU; + TV = FMA(Tc, TU, TT); + T1B = FNMS(Tc, TS, T1A); + } + { + E TZ, T10, T13, T1D; + TZ = ri[WS(rs, 6)]; + T10 = TY * TZ; + T13 = ii[WS(rs, 6)]; + T1D = TY * T13; + T14 = FMA(T12, T13, T10); + T1E = FNMS(T12, TZ, T1D); + } + TW = TR - TV; + T19 = T14 - T18; + T1a = TW + T19; + T1P = T1z + T1B; + T1Q = T1E + T1G; + T1Z = T1P + T1Q; + T1g = TR + TV; + T1h = T14 + T18; + T1i = T1g + T1h; + T1C = T1z - T1B; + T1H = T1E - T1G; + T2f = T1C + T1H; + } + { + E Tq, T1o, TL, T1v, Ty, T1q, TH, T1t; + { + E Tm, Tn, Tp, T1n; + Tm = ri[WS(rs, 2)]; + Tn = Tl * Tm; + Tp = ii[WS(rs, 2)]; + T1n = Tl * Tp; + Tq = FMA(To, Tp, Tn); + T1o = FNMS(To, Tm, T1n); + } + { + E TI, TJ, TK, T1u; + TI = ri[WS(rs, 3)]; + TJ = T3 * TI; + TK = ii[WS(rs, 3)]; + T1u = T3 * TK; + TL = FMA(T6, TK, TJ); + T1v = FNMS(T6, TI, T1u); + } + { + E Tt, Tu, Tx, T1p; + Tt = ri[WS(rs, 7)]; + Tu = Ts * Tt; + Tx = ii[WS(rs, 7)]; + T1p = Ts * Tx; + Ty = FMA(Tw, Tx, Tu); + T1q = FNMS(Tw, Tt, T1p); + } + { + E TC, TD, TG, T1s; + TC = ri[WS(rs, 8)]; + TD = TB * TC; + TG = ii[WS(rs, 8)]; + T1s = TB * TG; + TH = FMA(TF, TG, TD); + T1t = FNMS(TF, TC, T1s); + } + Tz = Tq - Ty; + TM = TH - TL; + TN = Tz + TM; + T1S = T1o + T1q; + T1T = T1t + T1v; + T1Y = T1S + T1T; + T1d = Tq + Ty; + T1e = TH + TL; + T1f = T1d + T1e; + T1r = T1o - T1q; + T1w = T1t - T1v; + T2e = T1r + T1w; + } + { + E T1l, T1b, T1k, T1J, T1L, T1x, T1I, T1K, T1m; + T1l = TN - T1a; + T1b = TN + T1a; + T1k = FNMS(KP250000000, T1b, Tk); + T1x = T1r - T1w; + T1I = T1C - T1H; + T1J = FMA(KP618033988, T1I, T1x); + T1L = FNMS(KP618033988, T1x, T1I); + ri[WS(rs, 5)] = Tk + T1b; + T1K = FNMS(KP559016994, T1l, T1k); + ri[WS(rs, 7)] = FNMS(KP951056516, T1L, T1K); + ri[WS(rs, 3)] = FMA(KP951056516, T1L, T1K); + T1m = FMA(KP559016994, T1l, T1k); + ri[WS(rs, 9)] = FNMS(KP951056516, T1J, T1m); + ri[WS(rs, 1)] = FMA(KP951056516, T1J, T1m); + } + { + E T2i, T2g, T2h, T2m, T2o, T2k, T2l, T2n, T2j; + T2i = T2e - T2f; + T2g = T2e + T2f; + T2h = FNMS(KP250000000, T2g, T2d); + T2k = Tz - TM; + T2l = TW - T19; + T2m = FMA(KP618033988, T2l, T2k); + T2o = FNMS(KP618033988, T2k, T2l); + ii[WS(rs, 5)] = T2g + T2d; + T2n = FNMS(KP559016994, T2i, T2h); + ii[WS(rs, 3)] = FNMS(KP951056516, T2o, T2n); + ii[WS(rs, 7)] = FMA(KP951056516, T2o, T2n); + T2j = FMA(KP559016994, T2i, T2h); + ii[WS(rs, 1)] = FNMS(KP951056516, T2m, T2j); + ii[WS(rs, 9)] = FMA(KP951056516, T2m, T2j); + } + { + E T1N, T1j, T1M, T1V, T1X, T1R, T1U, T1W, T1O; + T1N = T1f - T1i; + T1j = T1f + T1i; + T1M = FNMS(KP250000000, T1j, T1c); + T1R = T1P - T1Q; + T1U = T1S - T1T; + T1V = FNMS(KP618033988, T1U, T1R); + T1X = FMA(KP618033988, T1R, T1U); + ri[0] = T1c + T1j; + T1W = FMA(KP559016994, T1N, T1M); + ri[WS(rs, 4)] = FNMS(KP951056516, T1X, T1W); + ri[WS(rs, 6)] = FMA(KP951056516, T1X, T1W); + T1O = FNMS(KP559016994, T1N, T1M); + ri[WS(rs, 2)] = FNMS(KP951056516, T1V, T1O); + ri[WS(rs, 8)] = FMA(KP951056516, T1V, T1O); + } + { + E T26, T20, T25, T2a, T2c, T28, T29, T2b, T27; + T26 = T1Y - T1Z; + T20 = T1Y + T1Z; + T25 = FNMS(KP250000000, T20, T24); + T28 = T1g - T1h; + T29 = T1d - T1e; + T2a = FNMS(KP618033988, T29, T28); + T2c = FMA(KP618033988, T28, T29); + ii[0] = T20 + T24; + T2b = FMA(KP559016994, T26, T25); + ii[WS(rs, 4)] = FMA(KP951056516, T2c, T2b); + ii[WS(rs, 6)] = FNMS(KP951056516, T2c, T2b); + T27 = FNMS(KP559016994, T26, T25); + ii[WS(rs, 2)] = FMA(KP951056516, T2a, T27); + ii[WS(rs, 8)] = FNMS(KP951056516, T2a, T27); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 10, "t2_10", twinstr, &GENUS, {48, 28, 66, 0}, 0, 0, 0 }; + +void X(codelet_t2_10) (planner *p) { + X(kdft_dit_register) (p, t2_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 10 -name t2_10 -include dft/scalar/t.h */ + +/* + * This function contains 114 FP additions, 80 FP multiplications, + * (or, 76 additions, 42 multiplications, 38 fused multiply/add), + * 63 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 6, MAKE_VOLATILE_STRIDE(20, rs)) { + E T2, T5, T3, T6, T8, Tm, Tc, Tk, T9, Td, Te, TM, TO, Tg, Tp; + E Tv, Tx, Tr; + { + E T4, Tb, T7, Ta; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tb = T5 * T3; + T7 = T5 * T6; + Ta = T2 * T6; + T8 = T4 - T7; + Tm = Ta - Tb; + Tc = Ta + Tb; + Tk = T4 + T7; + T9 = W[4]; + Td = W[5]; + Te = FMA(T8, T9, Tc * Td); + TM = FMA(T3, T9, T6 * Td); + TO = FNMS(T6, T9, T3 * Td); + Tg = FNMS(Tc, T9, T8 * Td); + Tp = FMA(Tk, T9, Tm * Td); + Tv = FMA(T2, T9, T5 * Td); + Tx = FNMS(T5, T9, T2 * Td); + Tr = FNMS(Tm, T9, Tk * Td); + } + { + E Tj, T1S, TX, T1G, TL, TU, TV, T1s, T1t, T1C, T11, T12, T13, T1h, T1k; + E T1Q, Tu, TD, TE, T1v, T1w, T1B, TY, TZ, T10, T1a, T1d, T1P; + { + E T1, T1F, Ti, T1E, Tf, Th; + T1 = ri[0]; + T1F = ii[0]; + Tf = ri[WS(rs, 5)]; + Th = ii[WS(rs, 5)]; + Ti = FMA(Te, Tf, Tg * Th); + T1E = FNMS(Tg, Tf, Te * Th); + Tj = T1 - Ti; + T1S = T1F - T1E; + TX = T1 + Ti; + T1G = T1E + T1F; + } + { + E TH, T1f, TT, T1j, TK, T1g, TQ, T1i; + { + E TF, TG, TR, TS; + TF = ri[WS(rs, 4)]; + TG = ii[WS(rs, 4)]; + TH = FMA(T8, TF, Tc * TG); + T1f = FNMS(Tc, TF, T8 * TG); + TR = ri[WS(rs, 1)]; + TS = ii[WS(rs, 1)]; + TT = FMA(T2, TR, T5 * TS); + T1j = FNMS(T5, TR, T2 * TS); + } + { + E TI, TJ, TN, TP; + TI = ri[WS(rs, 9)]; + TJ = ii[WS(rs, 9)]; + TK = FMA(T9, TI, Td * TJ); + T1g = FNMS(Td, TI, T9 * TJ); + TN = ri[WS(rs, 6)]; + TP = ii[WS(rs, 6)]; + TQ = FMA(TM, TN, TO * TP); + T1i = FNMS(TO, TN, TM * TP); + } + TL = TH - TK; + TU = TQ - TT; + TV = TL + TU; + T1s = T1f + T1g; + T1t = T1i + T1j; + T1C = T1s + T1t; + T11 = TH + TK; + T12 = TQ + TT; + T13 = T11 + T12; + T1h = T1f - T1g; + T1k = T1i - T1j; + T1Q = T1h + T1k; + } + { + E To, T18, TC, T1c, Tt, T19, Tz, T1b; + { + E Tl, Tn, TA, TB; + Tl = ri[WS(rs, 2)]; + Tn = ii[WS(rs, 2)]; + To = FMA(Tk, Tl, Tm * Tn); + T18 = FNMS(Tm, Tl, Tk * Tn); + TA = ri[WS(rs, 3)]; + TB = ii[WS(rs, 3)]; + TC = FMA(T3, TA, T6 * TB); + T1c = FNMS(T6, TA, T3 * TB); + } + { + E Tq, Ts, Tw, Ty; + Tq = ri[WS(rs, 7)]; + Ts = ii[WS(rs, 7)]; + Tt = FMA(Tp, Tq, Tr * Ts); + T19 = FNMS(Tr, Tq, Tp * Ts); + Tw = ri[WS(rs, 8)]; + Ty = ii[WS(rs, 8)]; + Tz = FMA(Tv, Tw, Tx * Ty); + T1b = FNMS(Tx, Tw, Tv * Ty); + } + Tu = To - Tt; + TD = Tz - TC; + TE = Tu + TD; + T1v = T18 + T19; + T1w = T1b + T1c; + T1B = T1v + T1w; + TY = To + Tt; + TZ = Tz + TC; + T10 = TY + TZ; + T1a = T18 - T19; + T1d = T1b - T1c; + T1P = T1a + T1d; + } + { + E T15, TW, T16, T1m, T1o, T1e, T1l, T1n, T17; + T15 = KP559016994 * (TE - TV); + TW = TE + TV; + T16 = FNMS(KP250000000, TW, Tj); + T1e = T1a - T1d; + T1l = T1h - T1k; + T1m = FMA(KP951056516, T1e, KP587785252 * T1l); + T1o = FNMS(KP587785252, T1e, KP951056516 * T1l); + ri[WS(rs, 5)] = Tj + TW; + T1n = T16 - T15; + ri[WS(rs, 7)] = T1n - T1o; + ri[WS(rs, 3)] = T1n + T1o; + T17 = T15 + T16; + ri[WS(rs, 9)] = T17 - T1m; + ri[WS(rs, 1)] = T17 + T1m; + } + { + E T1R, T1T, T1U, T1Y, T20, T1W, T1X, T1Z, T1V; + T1R = KP559016994 * (T1P - T1Q); + T1T = T1P + T1Q; + T1U = FNMS(KP250000000, T1T, T1S); + T1W = Tu - TD; + T1X = TL - TU; + T1Y = FMA(KP951056516, T1W, KP587785252 * T1X); + T20 = FNMS(KP587785252, T1W, KP951056516 * T1X); + ii[WS(rs, 5)] = T1T + T1S; + T1Z = T1U - T1R; + ii[WS(rs, 3)] = T1Z - T20; + ii[WS(rs, 7)] = T20 + T1Z; + T1V = T1R + T1U; + ii[WS(rs, 1)] = T1V - T1Y; + ii[WS(rs, 9)] = T1Y + T1V; + } + { + E T1q, T14, T1p, T1y, T1A, T1u, T1x, T1z, T1r; + T1q = KP559016994 * (T10 - T13); + T14 = T10 + T13; + T1p = FNMS(KP250000000, T14, TX); + T1u = T1s - T1t; + T1x = T1v - T1w; + T1y = FNMS(KP587785252, T1x, KP951056516 * T1u); + T1A = FMA(KP951056516, T1x, KP587785252 * T1u); + ri[0] = TX + T14; + T1z = T1q + T1p; + ri[WS(rs, 4)] = T1z - T1A; + ri[WS(rs, 6)] = T1z + T1A; + T1r = T1p - T1q; + ri[WS(rs, 2)] = T1r - T1y; + ri[WS(rs, 8)] = T1r + T1y; + } + { + E T1L, T1D, T1K, T1J, T1N, T1H, T1I, T1O, T1M; + T1L = KP559016994 * (T1B - T1C); + T1D = T1B + T1C; + T1K = FNMS(KP250000000, T1D, T1G); + T1H = T11 - T12; + T1I = TY - TZ; + T1J = FNMS(KP587785252, T1I, KP951056516 * T1H); + T1N = FMA(KP951056516, T1I, KP587785252 * T1H); + ii[0] = T1D + T1G; + T1O = T1L + T1K; + ii[WS(rs, 4)] = T1N + T1O; + ii[WS(rs, 6)] = T1O - T1N; + T1M = T1K - T1L; + ii[WS(rs, 2)] = T1J + T1M; + ii[WS(rs, 8)] = T1M - T1J; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 10, "t2_10", twinstr, &GENUS, {76, 42, 38, 0}, 0, 0, 0 }; + +void X(codelet_t2_10) (planner *p) { + X(kdft_dit_register) (p, t2_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_16.c new file mode 100644 index 000000000..382bace93 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_16.c @@ -0,0 +1,836 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -name t2_16 -include dft/scalar/t.h */ + +/* + * This function contains 196 FP additions, 134 FP multiplications, + * (or, 104 additions, 42 multiplications, 92 fused multiply/add), + * 90 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(32, rs)) { + E T2, Tf, TM, TO, T3, T6, T5, Th, Tz, Ti, T7, TZ, TT, Tq, TW; + E Tb, Tu, TP, TI, TF, TC, T1z, T1O, T1D, T1L, Tm, T1f, T1p, T1j, T1m; + { + E TN, TS, T4, Tp, Ta, Tt, Tl, Tg; + T2 = W[0]; + Tf = W[2]; + Tg = T2 * Tf; + TM = W[6]; + TN = T2 * TM; + TO = W[7]; + TS = T2 * TO; + T3 = W[4]; + T4 = T2 * T3; + Tp = Tf * T3; + T6 = W[5]; + Ta = T2 * T6; + Tt = Tf * T6; + T5 = W[1]; + Th = W[3]; + Tl = T2 * Th; + Tz = FMA(T5, Th, Tg); + Ti = FNMS(T5, Th, Tg); + T7 = FMA(T5, T6, T4); + TZ = FNMS(Th, T3, Tt); + TT = FNMS(T5, TM, TS); + Tq = FNMS(Th, T6, Tp); + TW = FMA(Th, T6, Tp); + Tb = FNMS(T5, T3, Ta); + Tu = FMA(Th, T3, Tt); + TP = FMA(T5, TO, TN); + TI = FMA(T5, T3, Ta); + TF = FNMS(T5, T6, T4); + { + E T1y, T1C, T1e, T1i; + T1y = Tz * T3; + T1C = Tz * T6; + TC = FNMS(T5, Tf, Tl); + T1z = FMA(TC, T6, T1y); + T1O = FMA(TC, T3, T1C); + T1D = FNMS(TC, T3, T1C); + T1L = FNMS(TC, T6, T1y); + T1e = Ti * T3; + T1i = Ti * T6; + Tm = FMA(T5, Tf, Tl); + T1f = FMA(Tm, T6, T1e); + T1p = FMA(Tm, T3, T1i); + T1j = FNMS(Tm, T3, T1i); + T1m = FNMS(Tm, T6, T1e); + } + } + { + E Te, T1U, T3A, T3L, T1G, T2D, T2A, T3h, T1R, T2B, T2I, T3i, Tx, T3M, T1Z; + E T3w, TL, T26, T25, T37, T1d, T2o, T2l, T3c, T1s, T2m, T2t, T3d, T12, T28; + E T2d, T38; + { + E T1, T3z, T8, T9, Tc, T3x, Td, T3y; + T1 = ri[0]; + T3z = ii[0]; + T8 = ri[WS(rs, 8)]; + T9 = T7 * T8; + Tc = ii[WS(rs, 8)]; + T3x = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Te = T1 + Td; + T1U = T1 - Td; + T3y = FNMS(Tb, T8, T3x); + T3A = T3y + T3z; + T3L = T3z - T3y; + } + { + E T1u, T1v, T1w, T2w, T1A, T1B, T1E, T2y; + T1u = ri[WS(rs, 15)]; + T1v = TM * T1u; + T1w = ii[WS(rs, 15)]; + T2w = TM * T1w; + T1A = ri[WS(rs, 7)]; + T1B = T1z * T1A; + T1E = ii[WS(rs, 7)]; + T2y = T1z * T1E; + { + E T1x, T1F, T2x, T2z; + T1x = FMA(TO, T1w, T1v); + T1F = FMA(T1D, T1E, T1B); + T1G = T1x + T1F; + T2D = T1x - T1F; + T2x = FNMS(TO, T1u, T2w); + T2z = FNMS(T1D, T1A, T2y); + T2A = T2x - T2z; + T3h = T2x + T2z; + } + } + { + E T1H, T1I, T1J, T2E, T1M, T1N, T1P, T2G; + T1H = ri[WS(rs, 3)]; + T1I = Tf * T1H; + T1J = ii[WS(rs, 3)]; + T2E = Tf * T1J; + T1M = ri[WS(rs, 11)]; + T1N = T1L * T1M; + T1P = ii[WS(rs, 11)]; + T2G = T1L * T1P; + { + E T1K, T1Q, T2F, T2H; + T1K = FMA(Th, T1J, T1I); + T1Q = FMA(T1O, T1P, T1N); + T1R = T1K + T1Q; + T2B = T1K - T1Q; + T2F = FNMS(Th, T1H, T2E); + T2H = FNMS(T1O, T1M, T2G); + T2I = T2F - T2H; + T3i = T2F + T2H; + } + } + { + E Tj, Tk, Tn, T1V, Tr, Ts, Tv, T1X; + Tj = ri[WS(rs, 4)]; + Tk = Ti * Tj; + Tn = ii[WS(rs, 4)]; + T1V = Ti * Tn; + Tr = ri[WS(rs, 12)]; + Ts = Tq * Tr; + Tv = ii[WS(rs, 12)]; + T1X = Tq * Tv; + { + E To, Tw, T1W, T1Y; + To = FMA(Tm, Tn, Tk); + Tw = FMA(Tu, Tv, Ts); + Tx = To + Tw; + T3M = To - Tw; + T1W = FNMS(Tm, Tj, T1V); + T1Y = FNMS(Tu, Tr, T1X); + T1Z = T1W - T1Y; + T3w = T1W + T1Y; + } + } + { + E TA, TB, TD, T21, TG, TH, TJ, T23; + TA = ri[WS(rs, 2)]; + TB = Tz * TA; + TD = ii[WS(rs, 2)]; + T21 = Tz * TD; + TG = ri[WS(rs, 10)]; + TH = TF * TG; + TJ = ii[WS(rs, 10)]; + T23 = TF * TJ; + { + E TE, TK, T22, T24; + TE = FMA(TC, TD, TB); + TK = FMA(TI, TJ, TH); + TL = TE + TK; + T26 = TE - TK; + T22 = FNMS(TC, TA, T21); + T24 = FNMS(TI, TG, T23); + T25 = T22 - T24; + T37 = T22 + T24; + } + } + { + E T15, T16, T17, T2h, T19, T1a, T1b, T2j; + T15 = ri[WS(rs, 1)]; + T16 = T2 * T15; + T17 = ii[WS(rs, 1)]; + T2h = T2 * T17; + T19 = ri[WS(rs, 9)]; + T1a = T3 * T19; + T1b = ii[WS(rs, 9)]; + T2j = T3 * T1b; + { + E T18, T1c, T2i, T2k; + T18 = FMA(T5, T17, T16); + T1c = FMA(T6, T1b, T1a); + T1d = T18 + T1c; + T2o = T18 - T1c; + T2i = FNMS(T5, T15, T2h); + T2k = FNMS(T6, T19, T2j); + T2l = T2i - T2k; + T3c = T2i + T2k; + } + } + { + E T1g, T1h, T1k, T2p, T1n, T1o, T1q, T2r; + T1g = ri[WS(rs, 5)]; + T1h = T1f * T1g; + T1k = ii[WS(rs, 5)]; + T2p = T1f * T1k; + T1n = ri[WS(rs, 13)]; + T1o = T1m * T1n; + T1q = ii[WS(rs, 13)]; + T2r = T1m * T1q; + { + E T1l, T1r, T2q, T2s; + T1l = FMA(T1j, T1k, T1h); + T1r = FMA(T1p, T1q, T1o); + T1s = T1l + T1r; + T2m = T1l - T1r; + T2q = FNMS(T1j, T1g, T2p); + T2s = FNMS(T1p, T1n, T2r); + T2t = T2q - T2s; + T3d = T2q + T2s; + } + } + { + E TQ, TR, TU, T29, TX, TY, T10, T2b; + TQ = ri[WS(rs, 14)]; + TR = TP * TQ; + TU = ii[WS(rs, 14)]; + T29 = TP * TU; + TX = ri[WS(rs, 6)]; + TY = TW * TX; + T10 = ii[WS(rs, 6)]; + T2b = TW * T10; + { + E TV, T11, T2a, T2c; + TV = FMA(TT, TU, TR); + T11 = FMA(TZ, T10, TY); + T12 = TV + T11; + T28 = TV - T11; + T2a = FNMS(TT, TQ, T29); + T2c = FNMS(TZ, TX, T2b); + T2d = T2a - T2c; + T38 = T2a + T2c; + } + } + { + E T14, T3q, T3C, T3E, T1T, T3D, T3t, T3u; + { + E Ty, T13, T3v, T3B; + Ty = Te + Tx; + T13 = TL + T12; + T14 = Ty + T13; + T3q = Ty - T13; + T3v = T37 + T38; + T3B = T3w + T3A; + T3C = T3v + T3B; + T3E = T3B - T3v; + } + { + E T1t, T1S, T3r, T3s; + T1t = T1d + T1s; + T1S = T1G + T1R; + T1T = T1t + T1S; + T3D = T1S - T1t; + T3r = T3c + T3d; + T3s = T3h + T3i; + T3t = T3r - T3s; + T3u = T3r + T3s; + } + ri[WS(rs, 8)] = T14 - T1T; + ii[WS(rs, 8)] = T3C - T3u; + ri[0] = T14 + T1T; + ii[0] = T3u + T3C; + ri[WS(rs, 12)] = T3q - T3t; + ii[WS(rs, 12)] = T3E - T3D; + ri[WS(rs, 4)] = T3q + T3t; + ii[WS(rs, 4)] = T3D + T3E; + } + { + E T3a, T3m, T3H, T3J, T3f, T3n, T3k, T3o; + { + E T36, T39, T3F, T3G; + T36 = Te - Tx; + T39 = T37 - T38; + T3a = T36 + T39; + T3m = T36 - T39; + T3F = T12 - TL; + T3G = T3A - T3w; + T3H = T3F + T3G; + T3J = T3G - T3F; + } + { + E T3b, T3e, T3g, T3j; + T3b = T1d - T1s; + T3e = T3c - T3d; + T3f = T3b + T3e; + T3n = T3e - T3b; + T3g = T1G - T1R; + T3j = T3h - T3i; + T3k = T3g - T3j; + T3o = T3g + T3j; + } + { + E T3l, T3I, T3p, T3K; + T3l = T3f + T3k; + ri[WS(rs, 10)] = FNMS(KP707106781, T3l, T3a); + ri[WS(rs, 2)] = FMA(KP707106781, T3l, T3a); + T3I = T3n + T3o; + ii[WS(rs, 2)] = FMA(KP707106781, T3I, T3H); + ii[WS(rs, 10)] = FNMS(KP707106781, T3I, T3H); + T3p = T3n - T3o; + ri[WS(rs, 14)] = FNMS(KP707106781, T3p, T3m); + ri[WS(rs, 6)] = FMA(KP707106781, T3p, T3m); + T3K = T3k - T3f; + ii[WS(rs, 6)] = FMA(KP707106781, T3K, T3J); + ii[WS(rs, 14)] = FNMS(KP707106781, T3K, T3J); + } + } + { + E T20, T3N, T3T, T2Q, T2f, T3O, T30, T34, T2T, T3U, T2v, T2N, T2X, T33, T2K; + E T2O; + { + E T27, T2e, T2n, T2u; + T20 = T1U - T1Z; + T3N = T3L - T3M; + T3T = T3M + T3L; + T2Q = T1U + T1Z; + T27 = T25 - T26; + T2e = T28 + T2d; + T2f = T27 - T2e; + T3O = T27 + T2e; + { + E T2Y, T2Z, T2R, T2S; + T2Y = T2D + T2I; + T2Z = T2A - T2B; + T30 = FNMS(KP414213562, T2Z, T2Y); + T34 = FMA(KP414213562, T2Y, T2Z); + T2R = T26 + T25; + T2S = T28 - T2d; + T2T = T2R + T2S; + T3U = T2S - T2R; + } + T2n = T2l + T2m; + T2u = T2o - T2t; + T2v = FMA(KP414213562, T2u, T2n); + T2N = FNMS(KP414213562, T2n, T2u); + { + E T2V, T2W, T2C, T2J; + T2V = T2o + T2t; + T2W = T2l - T2m; + T2X = FMA(KP414213562, T2W, T2V); + T33 = FNMS(KP414213562, T2V, T2W); + T2C = T2A + T2B; + T2J = T2D - T2I; + T2K = FNMS(KP414213562, T2J, T2C); + T2O = FMA(KP414213562, T2C, T2J); + } + } + { + E T2g, T2L, T3V, T3W; + T2g = FMA(KP707106781, T2f, T20); + T2L = T2v - T2K; + ri[WS(rs, 11)] = FNMS(KP923879532, T2L, T2g); + ri[WS(rs, 3)] = FMA(KP923879532, T2L, T2g); + T3V = FMA(KP707106781, T3U, T3T); + T3W = T2O - T2N; + ii[WS(rs, 3)] = FMA(KP923879532, T3W, T3V); + ii[WS(rs, 11)] = FNMS(KP923879532, T3W, T3V); + } + { + E T2M, T2P, T3X, T3Y; + T2M = FNMS(KP707106781, T2f, T20); + T2P = T2N + T2O; + ri[WS(rs, 7)] = FNMS(KP923879532, T2P, T2M); + ri[WS(rs, 15)] = FMA(KP923879532, T2P, T2M); + T3X = FNMS(KP707106781, T3U, T3T); + T3Y = T2v + T2K; + ii[WS(rs, 7)] = FNMS(KP923879532, T3Y, T3X); + ii[WS(rs, 15)] = FMA(KP923879532, T3Y, T3X); + } + { + E T2U, T31, T3P, T3Q; + T2U = FMA(KP707106781, T2T, T2Q); + T31 = T2X + T30; + ri[WS(rs, 9)] = FNMS(KP923879532, T31, T2U); + ri[WS(rs, 1)] = FMA(KP923879532, T31, T2U); + T3P = FMA(KP707106781, T3O, T3N); + T3Q = T33 + T34; + ii[WS(rs, 1)] = FMA(KP923879532, T3Q, T3P); + ii[WS(rs, 9)] = FNMS(KP923879532, T3Q, T3P); + } + { + E T32, T35, T3R, T3S; + T32 = FNMS(KP707106781, T2T, T2Q); + T35 = T33 - T34; + ri[WS(rs, 13)] = FNMS(KP923879532, T35, T32); + ri[WS(rs, 5)] = FMA(KP923879532, T35, T32); + T3R = FNMS(KP707106781, T3O, T3N); + T3S = T30 - T2X; + ii[WS(rs, 5)] = FMA(KP923879532, T3S, T3R); + ii[WS(rs, 13)] = FNMS(KP923879532, T3S, T3R); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 15}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 16, "t2_16", twinstr, &GENUS, {104, 42, 92, 0}, 0, 0, 0 }; + +void X(codelet_t2_16) (planner *p) { + X(kdft_dit_register) (p, t2_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -name t2_16 -include dft/scalar/t.h */ + +/* + * This function contains 196 FP additions, 108 FP multiplications, + * (or, 156 additions, 68 multiplications, 40 fused multiply/add), + * 82 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(32, rs)) { + E T2, T5, Tg, Ti, Tk, To, TE, TC, T6, T3, T8, TW, TJ, Tt, TU; + E Tc, Tx, TH, TN, TO, TP, TR, T1f, T1k, T1b, T1i, T1y, T1H, T1u, T1F; + { + E T7, Tv, Ta, Ts, T4, Tw, Tb, Tr; + { + E Th, Tn, Tj, Tm; + T2 = W[0]; + T5 = W[1]; + Tg = W[2]; + Ti = W[3]; + Th = T2 * Tg; + Tn = T5 * Tg; + Tj = T5 * Ti; + Tm = T2 * Ti; + Tk = Th - Tj; + To = Tm + Tn; + TE = Tm - Tn; + TC = Th + Tj; + T6 = W[5]; + T7 = T5 * T6; + Tv = Tg * T6; + Ta = T2 * T6; + Ts = Ti * T6; + T3 = W[4]; + T4 = T2 * T3; + Tw = Ti * T3; + Tb = T5 * T3; + Tr = Tg * T3; + } + T8 = T4 + T7; + TW = Tv - Tw; + TJ = Ta + Tb; + Tt = Tr - Ts; + TU = Tr + Ts; + Tc = Ta - Tb; + Tx = Tv + Tw; + TH = T4 - T7; + TN = W[6]; + TO = W[7]; + TP = FMA(T2, TN, T5 * TO); + TR = FNMS(T5, TN, T2 * TO); + { + E T1d, T1e, T19, T1a; + T1d = Tk * T6; + T1e = To * T3; + T1f = T1d - T1e; + T1k = T1d + T1e; + T19 = Tk * T3; + T1a = To * T6; + T1b = T19 + T1a; + T1i = T19 - T1a; + } + { + E T1w, T1x, T1s, T1t; + T1w = TC * T6; + T1x = TE * T3; + T1y = T1w - T1x; + T1H = T1w + T1x; + T1s = TC * T3; + T1t = TE * T6; + T1u = T1s + T1t; + T1F = T1s - T1t; + } + } + { + E Tf, T3r, T1N, T3e, TA, T3s, T1Q, T3b, TM, T2M, T1W, T2w, TZ, T2N, T21; + E T2x, T1B, T1K, T2V, T2W, T2X, T2Y, T2j, T2D, T2o, T2E, T18, T1n, T2Q, T2R; + E T2S, T2T, T28, T2A, T2d, T2B; + { + E T1, T3d, Te, T3c, T9, Td; + T1 = ri[0]; + T3d = ii[0]; + T9 = ri[WS(rs, 8)]; + Td = ii[WS(rs, 8)]; + Te = FMA(T8, T9, Tc * Td); + T3c = FNMS(Tc, T9, T8 * Td); + Tf = T1 + Te; + T3r = T3d - T3c; + T1N = T1 - Te; + T3e = T3c + T3d; + } + { + E Tq, T1O, Tz, T1P; + { + E Tl, Tp, Tu, Ty; + Tl = ri[WS(rs, 4)]; + Tp = ii[WS(rs, 4)]; + Tq = FMA(Tk, Tl, To * Tp); + T1O = FNMS(To, Tl, Tk * Tp); + Tu = ri[WS(rs, 12)]; + Ty = ii[WS(rs, 12)]; + Tz = FMA(Tt, Tu, Tx * Ty); + T1P = FNMS(Tx, Tu, Tt * Ty); + } + TA = Tq + Tz; + T3s = Tq - Tz; + T1Q = T1O - T1P; + T3b = T1O + T1P; + } + { + E TG, T1S, TL, T1T, T1U, T1V; + { + E TD, TF, TI, TK; + TD = ri[WS(rs, 2)]; + TF = ii[WS(rs, 2)]; + TG = FMA(TC, TD, TE * TF); + T1S = FNMS(TE, TD, TC * TF); + TI = ri[WS(rs, 10)]; + TK = ii[WS(rs, 10)]; + TL = FMA(TH, TI, TJ * TK); + T1T = FNMS(TJ, TI, TH * TK); + } + TM = TG + TL; + T2M = T1S + T1T; + T1U = T1S - T1T; + T1V = TG - TL; + T1W = T1U - T1V; + T2w = T1V + T1U; + } + { + E TT, T1Y, TY, T1Z, T1X, T20; + { + E TQ, TS, TV, TX; + TQ = ri[WS(rs, 14)]; + TS = ii[WS(rs, 14)]; + TT = FMA(TP, TQ, TR * TS); + T1Y = FNMS(TR, TQ, TP * TS); + TV = ri[WS(rs, 6)]; + TX = ii[WS(rs, 6)]; + TY = FMA(TU, TV, TW * TX); + T1Z = FNMS(TW, TV, TU * TX); + } + TZ = TT + TY; + T2N = T1Y + T1Z; + T1X = TT - TY; + T20 = T1Y - T1Z; + T21 = T1X + T20; + T2x = T1X - T20; + } + { + E T1r, T2k, T1J, T2h, T1A, T2l, T1E, T2g; + { + E T1p, T1q, T1G, T1I; + T1p = ri[WS(rs, 15)]; + T1q = ii[WS(rs, 15)]; + T1r = FMA(TN, T1p, TO * T1q); + T2k = FNMS(TO, T1p, TN * T1q); + T1G = ri[WS(rs, 11)]; + T1I = ii[WS(rs, 11)]; + T1J = FMA(T1F, T1G, T1H * T1I); + T2h = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1v, T1z, T1C, T1D; + T1v = ri[WS(rs, 7)]; + T1z = ii[WS(rs, 7)]; + T1A = FMA(T1u, T1v, T1y * T1z); + T2l = FNMS(T1y, T1v, T1u * T1z); + T1C = ri[WS(rs, 3)]; + T1D = ii[WS(rs, 3)]; + T1E = FMA(Tg, T1C, Ti * T1D); + T2g = FNMS(Ti, T1C, Tg * T1D); + } + T1B = T1r + T1A; + T1K = T1E + T1J; + T2V = T1B - T1K; + T2W = T2k + T2l; + T2X = T2g + T2h; + T2Y = T2W - T2X; + { + E T2f, T2i, T2m, T2n; + T2f = T1r - T1A; + T2i = T2g - T2h; + T2j = T2f - T2i; + T2D = T2f + T2i; + T2m = T2k - T2l; + T2n = T1E - T1J; + T2o = T2m + T2n; + T2E = T2m - T2n; + } + } + { + E T14, T24, T1m, T2b, T17, T25, T1h, T2a; + { + E T12, T13, T1j, T1l; + T12 = ri[WS(rs, 1)]; + T13 = ii[WS(rs, 1)]; + T14 = FMA(T2, T12, T5 * T13); + T24 = FNMS(T5, T12, T2 * T13); + T1j = ri[WS(rs, 13)]; + T1l = ii[WS(rs, 13)]; + T1m = FMA(T1i, T1j, T1k * T1l); + T2b = FNMS(T1k, T1j, T1i * T1l); + } + { + E T15, T16, T1c, T1g; + T15 = ri[WS(rs, 9)]; + T16 = ii[WS(rs, 9)]; + T17 = FMA(T3, T15, T6 * T16); + T25 = FNMS(T6, T15, T3 * T16); + T1c = ri[WS(rs, 5)]; + T1g = ii[WS(rs, 5)]; + T1h = FMA(T1b, T1c, T1f * T1g); + T2a = FNMS(T1f, T1c, T1b * T1g); + } + T18 = T14 + T17; + T1n = T1h + T1m; + T2Q = T18 - T1n; + T2R = T24 + T25; + T2S = T2a + T2b; + T2T = T2R - T2S; + { + E T26, T27, T29, T2c; + T26 = T24 - T25; + T27 = T1h - T1m; + T28 = T26 + T27; + T2A = T26 - T27; + T29 = T14 - T17; + T2c = T2a - T2b; + T2d = T29 - T2c; + T2B = T29 + T2c; + } + } + { + E T23, T2r, T3A, T3C, T2q, T3B, T2u, T3x; + { + E T1R, T22, T3y, T3z; + T1R = T1N - T1Q; + T22 = KP707106781 * (T1W - T21); + T23 = T1R + T22; + T2r = T1R - T22; + T3y = KP707106781 * (T2x - T2w); + T3z = T3s + T3r; + T3A = T3y + T3z; + T3C = T3z - T3y; + } + { + E T2e, T2p, T2s, T2t; + T2e = FMA(KP923879532, T28, KP382683432 * T2d); + T2p = FNMS(KP923879532, T2o, KP382683432 * T2j); + T2q = T2e + T2p; + T3B = T2p - T2e; + T2s = FNMS(KP923879532, T2d, KP382683432 * T28); + T2t = FMA(KP382683432, T2o, KP923879532 * T2j); + T2u = T2s - T2t; + T3x = T2s + T2t; + } + ri[WS(rs, 11)] = T23 - T2q; + ii[WS(rs, 11)] = T3A - T3x; + ri[WS(rs, 3)] = T23 + T2q; + ii[WS(rs, 3)] = T3x + T3A; + ri[WS(rs, 15)] = T2r - T2u; + ii[WS(rs, 15)] = T3C - T3B; + ri[WS(rs, 7)] = T2r + T2u; + ii[WS(rs, 7)] = T3B + T3C; + } + { + E T2P, T31, T3m, T3o, T30, T3n, T34, T3j; + { + E T2L, T2O, T3k, T3l; + T2L = Tf - TA; + T2O = T2M - T2N; + T2P = T2L + T2O; + T31 = T2L - T2O; + T3k = TZ - TM; + T3l = T3e - T3b; + T3m = T3k + T3l; + T3o = T3l - T3k; + } + { + E T2U, T2Z, T32, T33; + T2U = T2Q + T2T; + T2Z = T2V - T2Y; + T30 = KP707106781 * (T2U + T2Z); + T3n = KP707106781 * (T2Z - T2U); + T32 = T2T - T2Q; + T33 = T2V + T2Y; + T34 = KP707106781 * (T32 - T33); + T3j = KP707106781 * (T32 + T33); + } + ri[WS(rs, 10)] = T2P - T30; + ii[WS(rs, 10)] = T3m - T3j; + ri[WS(rs, 2)] = T2P + T30; + ii[WS(rs, 2)] = T3j + T3m; + ri[WS(rs, 14)] = T31 - T34; + ii[WS(rs, 14)] = T3o - T3n; + ri[WS(rs, 6)] = T31 + T34; + ii[WS(rs, 6)] = T3n + T3o; + } + { + E T2z, T2H, T3u, T3w, T2G, T3v, T2K, T3p; + { + E T2v, T2y, T3q, T3t; + T2v = T1N + T1Q; + T2y = KP707106781 * (T2w + T2x); + T2z = T2v + T2y; + T2H = T2v - T2y; + T3q = KP707106781 * (T1W + T21); + T3t = T3r - T3s; + T3u = T3q + T3t; + T3w = T3t - T3q; + } + { + E T2C, T2F, T2I, T2J; + T2C = FMA(KP382683432, T2A, KP923879532 * T2B); + T2F = FNMS(KP382683432, T2E, KP923879532 * T2D); + T2G = T2C + T2F; + T3v = T2F - T2C; + T2I = FNMS(KP382683432, T2B, KP923879532 * T2A); + T2J = FMA(KP923879532, T2E, KP382683432 * T2D); + T2K = T2I - T2J; + T3p = T2I + T2J; + } + ri[WS(rs, 9)] = T2z - T2G; + ii[WS(rs, 9)] = T3u - T3p; + ri[WS(rs, 1)] = T2z + T2G; + ii[WS(rs, 1)] = T3p + T3u; + ri[WS(rs, 13)] = T2H - T2K; + ii[WS(rs, 13)] = T3w - T3v; + ri[WS(rs, 5)] = T2H + T2K; + ii[WS(rs, 5)] = T3v + T3w; + } + { + E T11, T35, T3g, T3i, T1M, T3h, T38, T39; + { + E TB, T10, T3a, T3f; + TB = Tf + TA; + T10 = TM + TZ; + T11 = TB + T10; + T35 = TB - T10; + T3a = T2M + T2N; + T3f = T3b + T3e; + T3g = T3a + T3f; + T3i = T3f - T3a; + } + { + E T1o, T1L, T36, T37; + T1o = T18 + T1n; + T1L = T1B + T1K; + T1M = T1o + T1L; + T3h = T1L - T1o; + T36 = T2R + T2S; + T37 = T2W + T2X; + T38 = T36 - T37; + T39 = T36 + T37; + } + ri[WS(rs, 8)] = T11 - T1M; + ii[WS(rs, 8)] = T3g - T39; + ri[0] = T11 + T1M; + ii[0] = T39 + T3g; + ri[WS(rs, 12)] = T35 - T38; + ii[WS(rs, 12)] = T3i - T3h; + ri[WS(rs, 4)] = T35 + T38; + ii[WS(rs, 4)] = T3h + T3i; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 15}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 16, "t2_16", twinstr, &GENUS, {156, 68, 40, 0}, 0, 0, 0 }; + +void X(codelet_t2_16) (planner *p) { + X(kdft_dit_register) (p, t2_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_20.c new file mode 100644 index 000000000..3d9cc1793 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_20.c @@ -0,0 +1,1097 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -name t2_20 -include dft/scalar/t.h */ + +/* + * This function contains 276 FP additions, 198 FP multiplications, + * (or, 136 additions, 58 multiplications, 140 fused multiply/add), + * 95 stack variables, 4 constants, and 80 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(40, rs)) { + E T2, Th, Tf, T6, T5, Ti, Tl, T1n, T3, Tt, Tv, T7, T17, T1L, T24; + E Tb, T13, T1P, T21, T1b, T1D, T1A, T1H, T1f, TA, Tw, Tq, Tm, TK, T1S; + E TO, T1p, T1q, T1u, T2n, T2k, T2h, T2d; + { + E Tk, Ta, T1e, T4, T1a, Tj, T12, T1G, T16, T1K, Tg, Tz; + T2 = W[0]; + Th = W[3]; + Tf = W[2]; + Tg = T2 * Tf; + Tk = T2 * Th; + T6 = W[5]; + Ta = T2 * T6; + T1e = Tf * T6; + T5 = W[1]; + Ti = FNMS(T5, Th, Tg); + Tl = FMA(T5, Tf, Tk); + T1n = FMA(T5, Th, Tg); + T3 = W[4]; + T4 = T2 * T3; + T1a = Tf * T3; + Tj = Ti * T3; + Tt = W[6]; + T12 = Tf * Tt; + T1G = T2 * Tt; + Tv = W[7]; + T16 = Tf * Tv; + T1K = T2 * Tv; + T7 = FNMS(T5, T6, T4); + T17 = FNMS(Th, Tt, T16); + T1L = FNMS(T5, Tt, T1K); + T24 = FMA(Th, T3, T1e); + Tb = FMA(T5, T3, Ta); + T13 = FMA(Th, Tv, T12); + T1P = FNMS(Tl, T6, Tj); + T21 = FNMS(Th, T6, T1a); + T1b = FMA(Th, T6, T1a); + T1D = FNMS(T5, T3, Ta); + T1A = FMA(T5, T6, T4); + T1H = FMA(T5, Tv, T1G); + T1f = FNMS(Th, T3, T1e); + Tz = Ti * Tv; + TA = FNMS(Tl, Tt, Tz); + { + E Tu, Tp, TJ, TN; + Tu = Ti * Tt; + Tw = FMA(Tl, Tv, Tu); + Tp = Ti * T6; + Tq = FNMS(Tl, T3, Tp); + Tm = FMA(Tl, T6, Tj); + TJ = Tm * Tt; + TN = Tm * Tv; + TK = FMA(Tq, Tv, TJ); + T1S = FMA(Tl, T3, Tp); + TO = FNMS(Tq, Tt, TN); + { + E T1o, T2g, T1t, T2c; + T1o = T1n * T3; + T2g = T1n * Tv; + T1t = T1n * T6; + T2c = T1n * Tt; + T1p = FNMS(T5, Tf, Tk); + T1q = FNMS(T1p, T6, T1o); + T1u = FMA(T1p, T3, T1t); + T2n = FNMS(T1p, T3, T1t); + T2k = FMA(T1p, T6, T1o); + T2h = FNMS(T1p, Tt, T2g); + T2d = FMA(T1p, Tv, T2c); + } + } + } + { + E Te, T2C, T4L, T57, TD, T58, T2H, T4H, T11, T2v, T4k, T4v, T2P, T3P, T3C; + E T3Z, T2r, T2z, T4g, T4z, T3b, T3T, T3u, T43, T20, T2y, T4d, T4y, T34, T3S; + E T3n, T42, T1y, T2w, T4n, T4w, T2W, T3Q, T3J, T40; + { + E T1, T4K, T8, T9, Tc, T4I, Td, T4J; + T1 = ri[0]; + T4K = ii[0]; + T8 = ri[WS(rs, 10)]; + T9 = T7 * T8; + Tc = ii[WS(rs, 10)]; + T4I = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Te = T1 + Td; + T2C = T1 - Td; + T4J = FNMS(Tb, T8, T4I); + T4L = T4J + T4K; + T57 = T4K - T4J; + } + { + E Tn, To, Tr, T2D, Tx, Ty, TB, T2F; + Tn = ri[WS(rs, 5)]; + To = Tm * Tn; + Tr = ii[WS(rs, 5)]; + T2D = Tm * Tr; + Tx = ri[WS(rs, 15)]; + Ty = Tw * Tx; + TB = ii[WS(rs, 15)]; + T2F = Tw * TB; + { + E Ts, TC, T2E, T2G; + Ts = FMA(Tq, Tr, To); + TC = FMA(TA, TB, Ty); + TD = Ts + TC; + T58 = Ts - TC; + T2E = FNMS(Tq, Tn, T2D); + T2G = FNMS(TA, Tx, T2F); + T2H = T2E - T2G; + T4H = T2E + T2G; + } + } + { + E TI, T3x, TZ, T2N, TQ, T3z, TV, T2L; + { + E TF, TG, TH, T3w; + TF = ri[WS(rs, 4)]; + TG = Ti * TF; + TH = ii[WS(rs, 4)]; + T3w = Ti * TH; + TI = FMA(Tl, TH, TG); + T3x = FNMS(Tl, TF, T3w); + } + { + E TW, TX, TY, T2M; + TW = ri[WS(rs, 19)]; + TX = Tt * TW; + TY = ii[WS(rs, 19)]; + T2M = Tt * TY; + TZ = FMA(Tv, TY, TX); + T2N = FNMS(Tv, TW, T2M); + } + { + E TL, TM, TP, T3y; + TL = ri[WS(rs, 14)]; + TM = TK * TL; + TP = ii[WS(rs, 14)]; + T3y = TK * TP; + TQ = FMA(TO, TP, TM); + T3z = FNMS(TO, TL, T3y); + } + { + E TS, TT, TU, T2K; + TS = ri[WS(rs, 9)]; + TT = T3 * TS; + TU = ii[WS(rs, 9)]; + T2K = T3 * TU; + TV = FMA(T6, TU, TT); + T2L = FNMS(T6, TS, T2K); + } + { + E TR, T10, T4i, T4j; + TR = TI + TQ; + T10 = TV + TZ; + T11 = TR - T10; + T2v = TR + T10; + T4i = T3x + T3z; + T4j = T2L + T2N; + T4k = T4i - T4j; + T4v = T4i + T4j; + } + { + E T2J, T2O, T3A, T3B; + T2J = TI - TQ; + T2O = T2L - T2N; + T2P = T2J - T2O; + T3P = T2J + T2O; + T3A = T3x - T3z; + T3B = TV - TZ; + T3C = T3A + T3B; + T3Z = T3A - T3B; + } + } + { + E T26, T3p, T2p, T39, T2a, T3r, T2j, T37; + { + E T22, T23, T25, T3o; + T22 = ri[WS(rs, 12)]; + T23 = T21 * T22; + T25 = ii[WS(rs, 12)]; + T3o = T21 * T25; + T26 = FMA(T24, T25, T23); + T3p = FNMS(T24, T22, T3o); + } + { + E T2l, T2m, T2o, T38; + T2l = ri[WS(rs, 7)]; + T2m = T2k * T2l; + T2o = ii[WS(rs, 7)]; + T38 = T2k * T2o; + T2p = FMA(T2n, T2o, T2m); + T39 = FNMS(T2n, T2l, T38); + } + { + E T27, T28, T29, T3q; + T27 = ri[WS(rs, 2)]; + T28 = T1n * T27; + T29 = ii[WS(rs, 2)]; + T3q = T1n * T29; + T2a = FMA(T1p, T29, T28); + T3r = FNMS(T1p, T27, T3q); + } + { + E T2e, T2f, T2i, T36; + T2e = ri[WS(rs, 17)]; + T2f = T2d * T2e; + T2i = ii[WS(rs, 17)]; + T36 = T2d * T2i; + T2j = FMA(T2h, T2i, T2f); + T37 = FNMS(T2h, T2e, T36); + } + { + E T2b, T2q, T4e, T4f; + T2b = T26 + T2a; + T2q = T2j + T2p; + T2r = T2b - T2q; + T2z = T2b + T2q; + T4e = T3p + T3r; + T4f = T37 + T39; + T4g = T4e - T4f; + T4z = T4e + T4f; + } + { + E T35, T3a, T3s, T3t; + T35 = T26 - T2a; + T3a = T37 - T39; + T3b = T35 - T3a; + T3T = T35 + T3a; + T3s = T3p - T3r; + T3t = T2j - T2p; + T3u = T3s + T3t; + T43 = T3s - T3t; + } + } + { + E T1F, T3i, T1Y, T32, T1N, T3k, T1U, T30; + { + E T1B, T1C, T1E, T3h; + T1B = ri[WS(rs, 8)]; + T1C = T1A * T1B; + T1E = ii[WS(rs, 8)]; + T3h = T1A * T1E; + T1F = FMA(T1D, T1E, T1C); + T3i = FNMS(T1D, T1B, T3h); + } + { + E T1V, T1W, T1X, T31; + T1V = ri[WS(rs, 3)]; + T1W = Tf * T1V; + T1X = ii[WS(rs, 3)]; + T31 = Tf * T1X; + T1Y = FMA(Th, T1X, T1W); + T32 = FNMS(Th, T1V, T31); + } + { + E T1I, T1J, T1M, T3j; + T1I = ri[WS(rs, 18)]; + T1J = T1H * T1I; + T1M = ii[WS(rs, 18)]; + T3j = T1H * T1M; + T1N = FMA(T1L, T1M, T1J); + T3k = FNMS(T1L, T1I, T3j); + } + { + E T1Q, T1R, T1T, T2Z; + T1Q = ri[WS(rs, 13)]; + T1R = T1P * T1Q; + T1T = ii[WS(rs, 13)]; + T2Z = T1P * T1T; + T1U = FMA(T1S, T1T, T1R); + T30 = FNMS(T1S, T1Q, T2Z); + } + { + E T1O, T1Z, T4b, T4c; + T1O = T1F + T1N; + T1Z = T1U + T1Y; + T20 = T1O - T1Z; + T2y = T1O + T1Z; + T4b = T3i + T3k; + T4c = T30 + T32; + T4d = T4b - T4c; + T4y = T4b + T4c; + } + { + E T2Y, T33, T3l, T3m; + T2Y = T1F - T1N; + T33 = T30 - T32; + T34 = T2Y - T33; + T3S = T2Y + T33; + T3l = T3i - T3k; + T3m = T1U - T1Y; + T3n = T3l + T3m; + T42 = T3l - T3m; + } + } + { + E T19, T3E, T1w, T2U, T1h, T3G, T1m, T2S; + { + E T14, T15, T18, T3D; + T14 = ri[WS(rs, 16)]; + T15 = T13 * T14; + T18 = ii[WS(rs, 16)]; + T3D = T13 * T18; + T19 = FMA(T17, T18, T15); + T3E = FNMS(T17, T14, T3D); + } + { + E T1r, T1s, T1v, T2T; + T1r = ri[WS(rs, 11)]; + T1s = T1q * T1r; + T1v = ii[WS(rs, 11)]; + T2T = T1q * T1v; + T1w = FMA(T1u, T1v, T1s); + T2U = FNMS(T1u, T1r, T2T); + } + { + E T1c, T1d, T1g, T3F; + T1c = ri[WS(rs, 6)]; + T1d = T1b * T1c; + T1g = ii[WS(rs, 6)]; + T3F = T1b * T1g; + T1h = FMA(T1f, T1g, T1d); + T3G = FNMS(T1f, T1c, T3F); + } + { + E T1j, T1k, T1l, T2R; + T1j = ri[WS(rs, 1)]; + T1k = T2 * T1j; + T1l = ii[WS(rs, 1)]; + T2R = T2 * T1l; + T1m = FMA(T5, T1l, T1k); + T2S = FNMS(T5, T1j, T2R); + } + { + E T1i, T1x, T4l, T4m; + T1i = T19 + T1h; + T1x = T1m + T1w; + T1y = T1i - T1x; + T2w = T1i + T1x; + T4l = T3E + T3G; + T4m = T2S + T2U; + T4n = T4l - T4m; + T4w = T4l + T4m; + } + { + E T2Q, T2V, T3H, T3I; + T2Q = T19 - T1h; + T2V = T2S - T2U; + T2W = T2Q - T2V; + T3Q = T2Q + T2V; + T3H = T3E - T3G; + T3I = T1m - T1w; + T3J = T3H + T3I; + T40 = T3H - T3I; + } + } + { + E T4p, T4r, TE, T2t, T48, T49, T4q, T4a; + { + E T4h, T4o, T1z, T2s; + T4h = T4d - T4g; + T4o = T4k - T4n; + T4p = FNMS(KP618033988, T4o, T4h); + T4r = FMA(KP618033988, T4h, T4o); + TE = Te - TD; + T1z = T11 + T1y; + T2s = T20 + T2r; + T2t = T1z + T2s; + T48 = FNMS(KP250000000, T2t, TE); + T49 = T1z - T2s; + } + ri[WS(rs, 10)] = TE + T2t; + T4q = FMA(KP559016994, T49, T48); + ri[WS(rs, 14)] = FNMS(KP951056516, T4r, T4q); + ri[WS(rs, 6)] = FMA(KP951056516, T4r, T4q); + T4a = FNMS(KP559016994, T49, T48); + ri[WS(rs, 2)] = FNMS(KP951056516, T4p, T4a); + ri[WS(rs, 18)] = FMA(KP951056516, T4p, T4a); + } + { + E T54, T56, T4V, T4Y, T4Z, T50, T55, T51; + { + E T52, T53, T4W, T4X; + T52 = T20 - T2r; + T53 = T11 - T1y; + T54 = FNMS(KP618033988, T53, T52); + T56 = FMA(KP618033988, T52, T53); + T4V = T4L - T4H; + T4W = T4k + T4n; + T4X = T4d + T4g; + T4Y = T4W + T4X; + T4Z = FNMS(KP250000000, T4Y, T4V); + T50 = T4W - T4X; + } + ii[WS(rs, 10)] = T4Y + T4V; + T55 = FMA(KP559016994, T50, T4Z); + ii[WS(rs, 6)] = FNMS(KP951056516, T56, T55); + ii[WS(rs, 14)] = FMA(KP951056516, T56, T55); + T51 = FNMS(KP559016994, T50, T4Z); + ii[WS(rs, 2)] = FMA(KP951056516, T54, T51); + ii[WS(rs, 18)] = FNMS(KP951056516, T54, T51); + } + { + E T4B, T4D, T2u, T2B, T4s, T4t, T4C, T4u; + { + E T4x, T4A, T2x, T2A; + T4x = T4v - T4w; + T4A = T4y - T4z; + T4B = FMA(KP618033988, T4A, T4x); + T4D = FNMS(KP618033988, T4x, T4A); + T2u = Te + TD; + T2x = T2v + T2w; + T2A = T2y + T2z; + T2B = T2x + T2A; + T4s = FNMS(KP250000000, T2B, T2u); + T4t = T2x - T2A; + } + ri[0] = T2u + T2B; + T4C = FNMS(KP559016994, T4t, T4s); + ri[WS(rs, 12)] = FNMS(KP951056516, T4D, T4C); + ri[WS(rs, 8)] = FMA(KP951056516, T4D, T4C); + T4u = FMA(KP559016994, T4t, T4s); + ri[WS(rs, 4)] = FNMS(KP951056516, T4B, T4u); + ri[WS(rs, 16)] = FMA(KP951056516, T4B, T4u); + } + { + E T4S, T4U, T4M, T4G, T4N, T4O, T4T, T4P; + { + E T4Q, T4R, T4E, T4F; + T4Q = T2v - T2w; + T4R = T2y - T2z; + T4S = FMA(KP618033988, T4R, T4Q); + T4U = FNMS(KP618033988, T4Q, T4R); + T4M = T4H + T4L; + T4E = T4v + T4w; + T4F = T4y + T4z; + T4G = T4E + T4F; + T4N = FNMS(KP250000000, T4G, T4M); + T4O = T4E - T4F; + } + ii[0] = T4G + T4M; + T4T = FNMS(KP559016994, T4O, T4N); + ii[WS(rs, 8)] = FNMS(KP951056516, T4U, T4T); + ii[WS(rs, 12)] = FMA(KP951056516, T4U, T4T); + T4P = FMA(KP559016994, T4O, T4N); + ii[WS(rs, 4)] = FMA(KP951056516, T4S, T4P); + ii[WS(rs, 16)] = FNMS(KP951056516, T4S, T4P); + } + { + E T3L, T3N, T2I, T3d, T3e, T3f, T3M, T3g; + { + E T3v, T3K, T2X, T3c; + T3v = T3n - T3u; + T3K = T3C - T3J; + T3L = FNMS(KP618033988, T3K, T3v); + T3N = FMA(KP618033988, T3v, T3K); + T2I = T2C - T2H; + T2X = T2P + T2W; + T3c = T34 + T3b; + T3d = T2X + T3c; + T3e = FNMS(KP250000000, T3d, T2I); + T3f = T2X - T3c; + } + ri[WS(rs, 15)] = T2I + T3d; + T3M = FMA(KP559016994, T3f, T3e); + ri[WS(rs, 11)] = FMA(KP951056516, T3N, T3M); + ri[WS(rs, 19)] = FNMS(KP951056516, T3N, T3M); + T3g = FNMS(KP559016994, T3f, T3e); + ri[WS(rs, 3)] = FMA(KP951056516, T3L, T3g); + ri[WS(rs, 7)] = FNMS(KP951056516, T3L, T3g); + } + { + E T5u, T5w, T5l, T5o, T5p, T5q, T5v, T5r; + { + E T5s, T5t, T5m, T5n; + T5s = T34 - T3b; + T5t = T2P - T2W; + T5u = FNMS(KP618033988, T5t, T5s); + T5w = FMA(KP618033988, T5s, T5t); + T5l = T58 + T57; + T5m = T3C + T3J; + T5n = T3n + T3u; + T5o = T5m + T5n; + T5p = FNMS(KP250000000, T5o, T5l); + T5q = T5m - T5n; + } + ii[WS(rs, 15)] = T5o + T5l; + T5v = FMA(KP559016994, T5q, T5p); + ii[WS(rs, 11)] = FNMS(KP951056516, T5w, T5v); + ii[WS(rs, 19)] = FMA(KP951056516, T5w, T5v); + T5r = FNMS(KP559016994, T5q, T5p); + ii[WS(rs, 3)] = FNMS(KP951056516, T5u, T5r); + ii[WS(rs, 7)] = FMA(KP951056516, T5u, T5r); + } + { + E T45, T47, T3O, T3V, T3W, T3X, T46, T3Y; + { + E T41, T44, T3R, T3U; + T41 = T3Z - T40; + T44 = T42 - T43; + T45 = FMA(KP618033988, T44, T41); + T47 = FNMS(KP618033988, T41, T44); + T3O = T2C + T2H; + T3R = T3P + T3Q; + T3U = T3S + T3T; + T3V = T3R + T3U; + T3W = FNMS(KP250000000, T3V, T3O); + T3X = T3R - T3U; + } + ri[WS(rs, 5)] = T3O + T3V; + T46 = FNMS(KP559016994, T3X, T3W); + ri[WS(rs, 13)] = FMA(KP951056516, T47, T46); + ri[WS(rs, 17)] = FNMS(KP951056516, T47, T46); + T3Y = FMA(KP559016994, T3X, T3W); + ri[WS(rs, 1)] = FMA(KP951056516, T45, T3Y); + ri[WS(rs, 9)] = FNMS(KP951056516, T45, T3Y); + } + { + E T5i, T5k, T59, T5c, T5d, T5e, T5j, T5f; + { + E T5g, T5h, T5a, T5b; + T5g = T3P - T3Q; + T5h = T3S - T3T; + T5i = FMA(KP618033988, T5h, T5g); + T5k = FNMS(KP618033988, T5g, T5h); + T59 = T57 - T58; + T5a = T3Z + T40; + T5b = T42 + T43; + T5c = T5a + T5b; + T5d = FNMS(KP250000000, T5c, T59); + T5e = T5a - T5b; + } + ii[WS(rs, 5)] = T5c + T59; + T5j = FNMS(KP559016994, T5e, T5d); + ii[WS(rs, 13)] = FNMS(KP951056516, T5k, T5j); + ii[WS(rs, 17)] = FMA(KP951056516, T5k, T5j); + T5f = FMA(KP559016994, T5e, T5d); + ii[WS(rs, 1)] = FNMS(KP951056516, T5i, T5f); + ii[WS(rs, 9)] = FMA(KP951056516, T5i, T5f); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 19}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 20, "t2_20", twinstr, &GENUS, {136, 58, 140, 0}, 0, 0, 0 }; + +void X(codelet_t2_20) (planner *p) { + X(kdft_dit_register) (p, t2_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -name t2_20 -include dft/scalar/t.h */ + +/* + * This function contains 276 FP additions, 164 FP multiplications, + * (or, 204 additions, 92 multiplications, 72 fused multiply/add), + * 123 stack variables, 4 constants, and 80 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(40, rs)) { + E T2, T5, Tg, Ti, Tk, To, T1h, T1f, T6, T3, T8, T14, T1Q, Tc, T1O; + E T1v, T18, T1t, T1n, T24, T1j, T22, Tq, Tu, T1E, T1G, Tx, Ty, Tz, TJ; + E T1Z, TB, T1X, T1A, TZ, TL, T1y, TX; + { + E T7, T16, Ta, T13, T4, T17, Tb, T12; + { + E Th, Tn, Tj, Tm; + T2 = W[0]; + T5 = W[1]; + Tg = W[2]; + Ti = W[3]; + Th = T2 * Tg; + Tn = T5 * Tg; + Tj = T5 * Ti; + Tm = T2 * Ti; + Tk = Th - Tj; + To = Tm + Tn; + T1h = Tm - Tn; + T1f = Th + Tj; + T6 = W[5]; + T7 = T5 * T6; + T16 = Tg * T6; + Ta = T2 * T6; + T13 = Ti * T6; + T3 = W[4]; + T4 = T2 * T3; + T17 = Ti * T3; + Tb = T5 * T3; + T12 = Tg * T3; + } + T8 = T4 - T7; + T14 = T12 + T13; + T1Q = T16 + T17; + Tc = Ta + Tb; + T1O = T12 - T13; + T1v = Ta - Tb; + T18 = T16 - T17; + T1t = T4 + T7; + { + E T1l, T1m, T1g, T1i; + T1l = T1f * T6; + T1m = T1h * T3; + T1n = T1l + T1m; + T24 = T1l - T1m; + T1g = T1f * T3; + T1i = T1h * T6; + T1j = T1g - T1i; + T22 = T1g + T1i; + { + E Tl, Tp, Ts, Tt; + Tl = Tk * T3; + Tp = To * T6; + Tq = Tl + Tp; + Ts = Tk * T6; + Tt = To * T3; + Tu = Ts - Tt; + T1E = Tl - Tp; + T1G = Ts + Tt; + Tx = W[6]; + Ty = W[7]; + Tz = FMA(Tk, Tx, To * Ty); + TJ = FMA(Tq, Tx, Tu * Ty); + T1Z = FNMS(T1h, Tx, T1f * Ty); + TB = FNMS(To, Tx, Tk * Ty); + T1X = FMA(T1f, Tx, T1h * Ty); + T1A = FNMS(T5, Tx, T2 * Ty); + TZ = FNMS(Ti, Tx, Tg * Ty); + TL = FNMS(Tu, Tx, Tq * Ty); + T1y = FMA(T2, Tx, T5 * Ty); + TX = FMA(Tg, Tx, Ti * Ty); + } + } + } + { + E TF, T2b, T4A, T4J, T2K, T3r, T4a, T4m, T1N, T28, T29, T3C, T3F, T4o, T3X; + E T3Y, T44, T2f, T2g, T2h, T2n, T2s, T4L, T3g, T3h, T4w, T3n, T3o, T3p, T30; + E T35, T36, TW, T1r, T1s, T3J, T3M, T4n, T3U, T3V, T43, T2c, T2d, T2e, T2y; + E T2D, T4K, T3d, T3e, T4v, T3k, T3l, T3m, T2P, T2U, T2V; + { + E T1, T48, Te, T47, Tw, T2H, TD, T2I, T9, Td; + T1 = ri[0]; + T48 = ii[0]; + T9 = ri[WS(rs, 10)]; + Td = ii[WS(rs, 10)]; + Te = FMA(T8, T9, Tc * Td); + T47 = FNMS(Tc, T9, T8 * Td); + { + E Tr, Tv, TA, TC; + Tr = ri[WS(rs, 5)]; + Tv = ii[WS(rs, 5)]; + Tw = FMA(Tq, Tr, Tu * Tv); + T2H = FNMS(Tu, Tr, Tq * Tv); + TA = ri[WS(rs, 15)]; + TC = ii[WS(rs, 15)]; + TD = FMA(Tz, TA, TB * TC); + T2I = FNMS(TB, TA, Tz * TC); + } + { + E Tf, TE, T4y, T4z; + Tf = T1 + Te; + TE = Tw + TD; + TF = Tf - TE; + T2b = Tf + TE; + T4y = T48 - T47; + T4z = Tw - TD; + T4A = T4y - T4z; + T4J = T4z + T4y; + } + { + E T2G, T2J, T46, T49; + T2G = T1 - Te; + T2J = T2H - T2I; + T2K = T2G - T2J; + T3r = T2G + T2J; + T46 = T2H + T2I; + T49 = T47 + T48; + T4a = T46 + T49; + T4m = T49 - T46; + } + } + { + E T1D, T3A, T2l, T2W, T27, T3E, T2r, T34, T1M, T3B, T2m, T2Z, T1W, T3D, T2q; + E T31; + { + E T1x, T2j, T1C, T2k; + { + E T1u, T1w, T1z, T1B; + T1u = ri[WS(rs, 8)]; + T1w = ii[WS(rs, 8)]; + T1x = FMA(T1t, T1u, T1v * T1w); + T2j = FNMS(T1v, T1u, T1t * T1w); + T1z = ri[WS(rs, 18)]; + T1B = ii[WS(rs, 18)]; + T1C = FMA(T1y, T1z, T1A * T1B); + T2k = FNMS(T1A, T1z, T1y * T1B); + } + T1D = T1x + T1C; + T3A = T2j + T2k; + T2l = T2j - T2k; + T2W = T1x - T1C; + } + { + E T21, T32, T26, T33; + { + E T1Y, T20, T23, T25; + T1Y = ri[WS(rs, 17)]; + T20 = ii[WS(rs, 17)]; + T21 = FMA(T1X, T1Y, T1Z * T20); + T32 = FNMS(T1Z, T1Y, T1X * T20); + T23 = ri[WS(rs, 7)]; + T25 = ii[WS(rs, 7)]; + T26 = FMA(T22, T23, T24 * T25); + T33 = FNMS(T24, T23, T22 * T25); + } + T27 = T21 + T26; + T3E = T32 + T33; + T2r = T21 - T26; + T34 = T32 - T33; + } + { + E T1I, T2X, T1L, T2Y; + { + E T1F, T1H, T1J, T1K; + T1F = ri[WS(rs, 13)]; + T1H = ii[WS(rs, 13)]; + T1I = FMA(T1E, T1F, T1G * T1H); + T2X = FNMS(T1G, T1F, T1E * T1H); + T1J = ri[WS(rs, 3)]; + T1K = ii[WS(rs, 3)]; + T1L = FMA(Tg, T1J, Ti * T1K); + T2Y = FNMS(Ti, T1J, Tg * T1K); + } + T1M = T1I + T1L; + T3B = T2X + T2Y; + T2m = T1I - T1L; + T2Z = T2X - T2Y; + } + { + E T1S, T2o, T1V, T2p; + { + E T1P, T1R, T1T, T1U; + T1P = ri[WS(rs, 12)]; + T1R = ii[WS(rs, 12)]; + T1S = FMA(T1O, T1P, T1Q * T1R); + T2o = FNMS(T1Q, T1P, T1O * T1R); + T1T = ri[WS(rs, 2)]; + T1U = ii[WS(rs, 2)]; + T1V = FMA(T1f, T1T, T1h * T1U); + T2p = FNMS(T1h, T1T, T1f * T1U); + } + T1W = T1S + T1V; + T3D = T2o + T2p; + T2q = T2o - T2p; + T31 = T1S - T1V; + } + T1N = T1D - T1M; + T28 = T1W - T27; + T29 = T1N + T28; + T3C = T3A - T3B; + T3F = T3D - T3E; + T4o = T3C + T3F; + T3X = T3A + T3B; + T3Y = T3D + T3E; + T44 = T3X + T3Y; + T2f = T1D + T1M; + T2g = T1W + T27; + T2h = T2f + T2g; + T2n = T2l + T2m; + T2s = T2q + T2r; + T4L = T2n + T2s; + T3g = T2l - T2m; + T3h = T2q - T2r; + T4w = T3g + T3h; + T3n = T2W + T2Z; + T3o = T31 + T34; + T3p = T3n + T3o; + T30 = T2W - T2Z; + T35 = T31 - T34; + T36 = T30 + T35; + } + { + E TO, T3H, T2w, T2L, T1q, T3L, T2C, T2T, TV, T3I, T2x, T2O, T1b, T3K, T2B; + E T2Q; + { + E TI, T2u, TN, T2v; + { + E TG, TH, TK, TM; + TG = ri[WS(rs, 4)]; + TH = ii[WS(rs, 4)]; + TI = FMA(Tk, TG, To * TH); + T2u = FNMS(To, TG, Tk * TH); + TK = ri[WS(rs, 14)]; + TM = ii[WS(rs, 14)]; + TN = FMA(TJ, TK, TL * TM); + T2v = FNMS(TL, TK, TJ * TM); + } + TO = TI + TN; + T3H = T2u + T2v; + T2w = T2u - T2v; + T2L = TI - TN; + } + { + E T1e, T2R, T1p, T2S; + { + E T1c, T1d, T1k, T1o; + T1c = ri[WS(rs, 1)]; + T1d = ii[WS(rs, 1)]; + T1e = FMA(T2, T1c, T5 * T1d); + T2R = FNMS(T5, T1c, T2 * T1d); + T1k = ri[WS(rs, 11)]; + T1o = ii[WS(rs, 11)]; + T1p = FMA(T1j, T1k, T1n * T1o); + T2S = FNMS(T1n, T1k, T1j * T1o); + } + T1q = T1e + T1p; + T3L = T2R + T2S; + T2C = T1e - T1p; + T2T = T2R - T2S; + } + { + E TR, T2M, TU, T2N; + { + E TP, TQ, TS, TT; + TP = ri[WS(rs, 9)]; + TQ = ii[WS(rs, 9)]; + TR = FMA(T3, TP, T6 * TQ); + T2M = FNMS(T6, TP, T3 * TQ); + TS = ri[WS(rs, 19)]; + TT = ii[WS(rs, 19)]; + TU = FMA(Tx, TS, Ty * TT); + T2N = FNMS(Ty, TS, Tx * TT); + } + TV = TR + TU; + T3I = T2M + T2N; + T2x = TR - TU; + T2O = T2M - T2N; + } + { + E T11, T2z, T1a, T2A; + { + E TY, T10, T15, T19; + TY = ri[WS(rs, 16)]; + T10 = ii[WS(rs, 16)]; + T11 = FMA(TX, TY, TZ * T10); + T2z = FNMS(TZ, TY, TX * T10); + T15 = ri[WS(rs, 6)]; + T19 = ii[WS(rs, 6)]; + T1a = FMA(T14, T15, T18 * T19); + T2A = FNMS(T18, T15, T14 * T19); + } + T1b = T11 + T1a; + T3K = T2z + T2A; + T2B = T2z - T2A; + T2Q = T11 - T1a; + } + TW = TO - TV; + T1r = T1b - T1q; + T1s = TW + T1r; + T3J = T3H - T3I; + T3M = T3K - T3L; + T4n = T3J + T3M; + T3U = T3H + T3I; + T3V = T3K + T3L; + T43 = T3U + T3V; + T2c = TO + TV; + T2d = T1b + T1q; + T2e = T2c + T2d; + T2y = T2w + T2x; + T2D = T2B + T2C; + T4K = T2y + T2D; + T3d = T2w - T2x; + T3e = T2B - T2C; + T4v = T3d + T3e; + T3k = T2L + T2O; + T3l = T2Q + T2T; + T3m = T3k + T3l; + T2P = T2L - T2O; + T2U = T2Q - T2T; + T2V = T2P + T2U; + } + { + E T3y, T2a, T3x, T3O, T3Q, T3G, T3N, T3P, T3z; + T3y = KP559016994 * (T1s - T29); + T2a = T1s + T29; + T3x = FNMS(KP250000000, T2a, TF); + T3G = T3C - T3F; + T3N = T3J - T3M; + T3O = FNMS(KP587785252, T3N, KP951056516 * T3G); + T3Q = FMA(KP951056516, T3N, KP587785252 * T3G); + ri[WS(rs, 10)] = TF + T2a; + T3P = T3y + T3x; + ri[WS(rs, 14)] = T3P - T3Q; + ri[WS(rs, 6)] = T3P + T3Q; + T3z = T3x - T3y; + ri[WS(rs, 2)] = T3z - T3O; + ri[WS(rs, 18)] = T3z + T3O; + } + { + E T4r, T4p, T4q, T4l, T4u, T4j, T4k, T4t, T4s; + T4r = KP559016994 * (T4n - T4o); + T4p = T4n + T4o; + T4q = FNMS(KP250000000, T4p, T4m); + T4j = T1N - T28; + T4k = TW - T1r; + T4l = FNMS(KP587785252, T4k, KP951056516 * T4j); + T4u = FMA(KP951056516, T4k, KP587785252 * T4j); + ii[WS(rs, 10)] = T4p + T4m; + T4t = T4r + T4q; + ii[WS(rs, 6)] = T4t - T4u; + ii[WS(rs, 14)] = T4u + T4t; + T4s = T4q - T4r; + ii[WS(rs, 2)] = T4l + T4s; + ii[WS(rs, 18)] = T4s - T4l; + } + { + E T3R, T2i, T3S, T40, T42, T3W, T3Z, T41, T3T; + T3R = KP559016994 * (T2e - T2h); + T2i = T2e + T2h; + T3S = FNMS(KP250000000, T2i, T2b); + T3W = T3U - T3V; + T3Z = T3X - T3Y; + T40 = FMA(KP951056516, T3W, KP587785252 * T3Z); + T42 = FNMS(KP587785252, T3W, KP951056516 * T3Z); + ri[0] = T2b + T2i; + T41 = T3S - T3R; + ri[WS(rs, 12)] = T41 - T42; + ri[WS(rs, 8)] = T41 + T42; + T3T = T3R + T3S; + ri[WS(rs, 4)] = T3T - T40; + ri[WS(rs, 16)] = T3T + T40; + } + { + E T4e, T45, T4f, T4d, T4i, T4b, T4c, T4h, T4g; + T4e = KP559016994 * (T43 - T44); + T45 = T43 + T44; + T4f = FNMS(KP250000000, T45, T4a); + T4b = T2c - T2d; + T4c = T2f - T2g; + T4d = FMA(KP951056516, T4b, KP587785252 * T4c); + T4i = FNMS(KP587785252, T4b, KP951056516 * T4c); + ii[0] = T45 + T4a; + T4h = T4f - T4e; + ii[WS(rs, 8)] = T4h - T4i; + ii[WS(rs, 12)] = T4i + T4h; + T4g = T4e + T4f; + ii[WS(rs, 4)] = T4d + T4g; + ii[WS(rs, 16)] = T4g - T4d; + } + { + E T39, T37, T38, T2F, T3b, T2t, T2E, T3c, T3a; + T39 = KP559016994 * (T2V - T36); + T37 = T2V + T36; + T38 = FNMS(KP250000000, T37, T2K); + T2t = T2n - T2s; + T2E = T2y - T2D; + T2F = FNMS(KP587785252, T2E, KP951056516 * T2t); + T3b = FMA(KP951056516, T2E, KP587785252 * T2t); + ri[WS(rs, 15)] = T2K + T37; + T3c = T39 + T38; + ri[WS(rs, 11)] = T3b + T3c; + ri[WS(rs, 19)] = T3c - T3b; + T3a = T38 - T39; + ri[WS(rs, 3)] = T2F + T3a; + ri[WS(rs, 7)] = T3a - T2F; + } + { + E T4O, T4M, T4N, T4S, T4U, T4Q, T4R, T4T, T4P; + T4O = KP559016994 * (T4K - T4L); + T4M = T4K + T4L; + T4N = FNMS(KP250000000, T4M, T4J); + T4Q = T30 - T35; + T4R = T2P - T2U; + T4S = FNMS(KP587785252, T4R, KP951056516 * T4Q); + T4U = FMA(KP951056516, T4R, KP587785252 * T4Q); + ii[WS(rs, 15)] = T4M + T4J; + T4T = T4O + T4N; + ii[WS(rs, 11)] = T4T - T4U; + ii[WS(rs, 19)] = T4U + T4T; + T4P = T4N - T4O; + ii[WS(rs, 3)] = T4P - T4S; + ii[WS(rs, 7)] = T4S + T4P; + } + { + E T3q, T3s, T3t, T3j, T3v, T3f, T3i, T3w, T3u; + T3q = KP559016994 * (T3m - T3p); + T3s = T3m + T3p; + T3t = FNMS(KP250000000, T3s, T3r); + T3f = T3d - T3e; + T3i = T3g - T3h; + T3j = FMA(KP951056516, T3f, KP587785252 * T3i); + T3v = FNMS(KP587785252, T3f, KP951056516 * T3i); + ri[WS(rs, 5)] = T3r + T3s; + T3w = T3t - T3q; + ri[WS(rs, 13)] = T3v + T3w; + ri[WS(rs, 17)] = T3w - T3v; + T3u = T3q + T3t; + ri[WS(rs, 1)] = T3j + T3u; + ri[WS(rs, 9)] = T3u - T3j; + } + { + E T4x, T4B, T4C, T4G, T4I, T4E, T4F, T4H, T4D; + T4x = KP559016994 * (T4v - T4w); + T4B = T4v + T4w; + T4C = FNMS(KP250000000, T4B, T4A); + T4E = T3k - T3l; + T4F = T3n - T3o; + T4G = FMA(KP951056516, T4E, KP587785252 * T4F); + T4I = FNMS(KP587785252, T4E, KP951056516 * T4F); + ii[WS(rs, 5)] = T4B + T4A; + T4H = T4C - T4x; + ii[WS(rs, 13)] = T4H - T4I; + ii[WS(rs, 17)] = T4I + T4H; + T4D = T4x + T4C; + ii[WS(rs, 1)] = T4D - T4G; + ii[WS(rs, 9)] = T4G + T4D; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 19}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 20, "t2_20", twinstr, &GENUS, {204, 92, 72, 0}, 0, 0, 0 }; + +void X(codelet_t2_20) (planner *p) { + X(kdft_dit_register) (p, t2_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_25.c new file mode 100644 index 000000000..0ff4acdc9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_25.c @@ -0,0 +1,1620 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:27 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 25 -name t2_25 -include dft/scalar/t.h */ + +/* + * This function contains 440 FP additions, 434 FP multiplications, + * (or, 84 additions, 78 multiplications, 356 fused multiply/add), + * 186 stack variables, 47 constants, and 100 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(50, rs)) { + E T2, T8, T3, T6, Tk, Tm, T5, T7, T19, Tb, T1b, Tc, Tw, TT, T1j; + E TE, T2p, T1c, T2U, TI, T11, T15, T2Q, T2M, T2m, T2i, T2e, Tn, Tr, TX; + E T31, T35, T1l, T1m, T1q, TA, T1K, T1O, T2a, T27, T1g, T2x, T2t, Th, Td; + E T1S, T2X, T1W; + { + E TS, TD, T2L, T10, TH, T2P, T14, T9, T1a, Tz, TW, T4, Ta, Tv, T1J; + E T1N; + T2 = W[0]; + T8 = W[4]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + TS = T3 * T8; + Ta = T2 * T6; + Tv = T2 * T8; + Tk = W[6]; + TD = T8 * Tk; + T2L = T2 * Tk; + T10 = T3 * Tk; + Tm = W[7]; + TH = T8 * Tm; + T2P = T2 * Tm; + T14 = T3 * Tm; + T5 = W[1]; + T7 = FNMS(T5, T6, T4); + T19 = FMA(T5, T6, T4); + T9 = T7 * T8; + T1a = T19 * T8; + Tb = FMA(T5, T3, Ta); + T1b = FNMS(T5, T3, Ta); + Tc = W[5]; + Tz = T2 * Tc; + TW = T3 * Tc; + Tw = FNMS(T5, Tc, Tv); + TT = FMA(T6, Tc, TS); + T1j = FMA(T5, Tc, Tv); + TE = FMA(Tc, Tm, TD); + T2p = FMA(T6, T8, TW); + T1c = FNMS(T1b, Tc, T1a); + T2U = FNMS(Tb, Tc, T9); + TI = FNMS(Tc, Tk, TH); + T11 = FMA(T6, Tm, T10); + T15 = FNMS(T6, Tk, T14); + T2Q = FNMS(T5, Tk, T2P); + T2M = FMA(T5, Tm, T2L); + { + E T2h, T2d, Tl, Tq; + T2m = FNMS(T6, Tc, TS); + T2h = T19 * Tm; + T2i = FNMS(T1b, Tk, T2h); + T2d = T19 * Tk; + T2e = FMA(T1b, Tm, T2d); + Tl = T7 * Tk; + Tn = FMA(Tb, Tm, Tl); + Tq = T7 * Tm; + Tr = FNMS(Tb, Tk, Tq); + } + { + E T30, T34, T1k, T1p; + T30 = TT * Tk; + T34 = TT * Tm; + TX = FNMS(T6, T8, TW); + T31 = FMA(TX, Tm, T30); + T35 = FNMS(TX, Tk, T34); + T1k = T1j * Tk; + T1p = T1j * Tm; + T1l = FNMS(T5, T8, Tz); + T1m = FMA(T1l, Tm, T1k); + T1q = FNMS(T1l, Tk, T1p); + } + T1J = Tw * Tk; + T1N = Tw * Tm; + TA = FMA(T5, T8, Tz); + T1K = FMA(TA, Tm, T1J); + T1O = FNMS(TA, Tk, T1N); + { + E T1f, T2s, T2w, Tg, T1R, T1V; + T1f = T19 * Tc; + T2a = FNMS(T1b, T8, T1f); + T27 = FMA(T1b, Tc, T1a); + T2s = T27 * Tk; + T2w = T27 * Tm; + T1g = FMA(T1b, T8, T1f); + T2x = FNMS(T2a, Tk, T2w); + T2t = FMA(T2a, Tm, T2s); + Tg = T7 * Tc; + Th = FNMS(Tb, T8, Tg); + Td = FMA(Tb, Tc, T9); + T1R = Td * Tk; + T1V = Td * Tm; + T1S = FMA(Th, Tm, T1R); + T2X = FMA(Tb, T8, Tg); + T1W = FNMS(Th, Tk, T1V); + } + } + { + E T1, T7r, T4s, T6a, T7G, T86, TM, T4f, T4g, T7q, T7B, T7C, T5j, T6n, T5q; + E T6k, T3a, T6m, T5g, T4a, T6j, T5n, T4z, T6z, T4G, T6C, T1v, T6y, T4w, T3t; + E T6B, T4D, T4O, T6v, T4V, T6s, T21, T6r, T4S, T3H, T6u, T4L, T54, T6g, T5b; + E T6d, T2C, T6f, T51, T3W, T6c, T58; + { + E Tj, T4j, TK, T4q, TC, T4o, Tt, T4l; + T1 = ri[0]; + T7r = ii[0]; + { + E Te, Tf, Ti, T4i; + Te = ri[WS(rs, 5)]; + Tf = Td * Te; + Ti = ii[WS(rs, 5)]; + T4i = Td * Ti; + Tj = FMA(Th, Ti, Tf); + T4j = FNMS(Th, Te, T4i); + } + { + E TF, TG, TJ, T4p; + TF = ri[WS(rs, 15)]; + TG = TE * TF; + TJ = ii[WS(rs, 15)]; + T4p = TE * TJ; + TK = FMA(TI, TJ, TG); + T4q = FNMS(TI, TF, T4p); + } + { + E Tx, Ty, TB, T4n; + Tx = ri[WS(rs, 10)]; + Ty = Tw * Tx; + TB = ii[WS(rs, 10)]; + T4n = Tw * TB; + TC = FMA(TA, TB, Ty); + T4o = FNMS(TA, Tx, T4n); + } + { + E To, Tp, Ts, T4k; + To = ri[WS(rs, 20)]; + Tp = Tn * To; + Ts = ii[WS(rs, 20)]; + T4k = Tn * Ts; + Tt = FMA(Tr, Ts, Tp); + T4l = FNMS(Tr, To, T4k); + } + { + E T4m, T4r, T7E, T7F; + T4m = T4j - T4l; + T4r = T4o - T4q; + T4s = FMA(KP618033988, T4r, T4m); + T6a = FNMS(KP618033988, T4m, T4r); + T7E = Tj - Tt; + T7F = TC - TK; + T7G = FMA(KP618033988, T7F, T7E); + T86 = FNMS(KP618033988, T7E, T7F); + } + { + E Tu, TL, T7o, T7p; + Tu = Tj + Tt; + TL = TC + TK; + TM = Tu + TL; + T4f = FNMS(KP250000000, TM, T1); + T4g = Tu - TL; + T7o = T4j + T4l; + T7p = T4o + T4q; + T7q = T7o + T7p; + T7B = FNMS(KP250000000, T7q, T7r); + T7C = T7o - T7p; + } + } + { + E T2G, T3Y, T2Z, T37, T38, T45, T47, T48, T2K, T2S, T2T, T40, T42, T43; + { + E T2D, T2E, T2F, T3X; + T2D = ri[WS(rs, 3)]; + T2E = T3 * T2D; + T2F = ii[WS(rs, 3)]; + T3X = T3 * T2F; + T2G = FMA(T6, T2F, T2E); + T3Y = FNMS(T6, T2D, T3X); + } + { + E T2V, T2W, T2Y, T44, T32, T33, T36, T46; + T2V = ri[WS(rs, 13)]; + T2W = T2U * T2V; + T2Y = ii[WS(rs, 13)]; + T44 = T2U * T2Y; + T32 = ri[WS(rs, 18)]; + T33 = T31 * T32; + T36 = ii[WS(rs, 18)]; + T46 = T31 * T36; + T2Z = FMA(T2X, T2Y, T2W); + T37 = FMA(T35, T36, T33); + T38 = T2Z + T37; + T45 = FNMS(T2X, T2V, T44); + T47 = FNMS(T35, T32, T46); + T48 = T45 + T47; + } + { + E T2H, T2I, T2J, T3Z, T2N, T2O, T2R, T41; + T2H = ri[WS(rs, 8)]; + T2I = T1j * T2H; + T2J = ii[WS(rs, 8)]; + T3Z = T1j * T2J; + T2N = ri[WS(rs, 23)]; + T2O = T2M * T2N; + T2R = ii[WS(rs, 23)]; + T41 = T2M * T2R; + T2K = FMA(T1l, T2J, T2I); + T2S = FMA(T2Q, T2R, T2O); + T2T = T2K + T2S; + T40 = FNMS(T1l, T2H, T3Z); + T42 = FNMS(T2Q, T2N, T41); + T43 = T40 + T42; + } + { + E T5h, T5i, T5o, T5p; + T5h = T42 - T40; + T5i = T47 - T45; + T5j = FMA(KP618033988, T5i, T5h); + T6n = FNMS(KP618033988, T5h, T5i); + T5o = T2K - T2S; + T5p = T2Z - T37; + T5q = FMA(KP618033988, T5p, T5o); + T6k = FNMS(KP618033988, T5o, T5p); + } + { + E T5f, T39, T5e, T5m, T49, T5l; + T5f = T38 - T2T; + T39 = T2T + T38; + T5e = FNMS(KP250000000, T39, T2G); + T3a = T2G + T39; + T6m = FMA(KP559016994, T5f, T5e); + T5g = FNMS(KP559016994, T5f, T5e); + T5m = T48 - T43; + T49 = T43 + T48; + T5l = FNMS(KP250000000, T49, T3Y); + T4a = T3Y + T49; + T6j = FMA(KP559016994, T5m, T5l); + T5n = FNMS(KP559016994, T5m, T5l); + } + } + { + E TR, T3h, T1i, T1s, T1t, T3o, T3q, T3r, TZ, T17, T18, T3j, T3l, T3m; + { + E TO, TP, TQ, T3g; + TO = ri[WS(rs, 1)]; + TP = T2 * TO; + TQ = ii[WS(rs, 1)]; + T3g = T2 * TQ; + TR = FMA(T5, TQ, TP); + T3h = FNMS(T5, TO, T3g); + } + { + E T1d, T1e, T1h, T3n, T1n, T1o, T1r, T3p; + T1d = ri[WS(rs, 11)]; + T1e = T1c * T1d; + T1h = ii[WS(rs, 11)]; + T3n = T1c * T1h; + T1n = ri[WS(rs, 16)]; + T1o = T1m * T1n; + T1r = ii[WS(rs, 16)]; + T3p = T1m * T1r; + T1i = FMA(T1g, T1h, T1e); + T1s = FMA(T1q, T1r, T1o); + T1t = T1i + T1s; + T3o = FNMS(T1g, T1d, T3n); + T3q = FNMS(T1q, T1n, T3p); + T3r = T3o + T3q; + } + { + E TU, TV, TY, T3i, T12, T13, T16, T3k; + TU = ri[WS(rs, 6)]; + TV = TT * TU; + TY = ii[WS(rs, 6)]; + T3i = TT * TY; + T12 = ri[WS(rs, 21)]; + T13 = T11 * T12; + T16 = ii[WS(rs, 21)]; + T3k = T11 * T16; + TZ = FMA(TX, TY, TV); + T17 = FMA(T15, T16, T13); + T18 = TZ + T17; + T3j = FNMS(TX, TU, T3i); + T3l = FNMS(T15, T12, T3k); + T3m = T3j + T3l; + } + { + E T4x, T4y, T4E, T4F; + T4x = T3j - T3l; + T4y = T3q - T3o; + T4z = FNMS(KP618033988, T4y, T4x); + T6z = FMA(KP618033988, T4x, T4y); + T4E = T17 - TZ; + T4F = T1s - T1i; + T4G = FMA(KP618033988, T4F, T4E); + T6C = FNMS(KP618033988, T4E, T4F); + } + { + E T4v, T1u, T4u, T4C, T3s, T4B; + T4v = T18 - T1t; + T1u = T18 + T1t; + T4u = FNMS(KP250000000, T1u, TR); + T1v = TR + T1u; + T6y = FNMS(KP559016994, T4v, T4u); + T4w = FMA(KP559016994, T4v, T4u); + T4C = T3m - T3r; + T3s = T3m + T3r; + T4B = FNMS(KP250000000, T3s, T3h); + T3t = T3h + T3s; + T6B = FNMS(KP559016994, T4C, T4B); + T4D = FMA(KP559016994, T4C, T4B); + } + } + { + E T1z, T3v, T1Q, T1Y, T1Z, T3C, T3E, T3F, T1D, T1H, T1I, T3x, T3z, T3A; + { + E T1w, T1x, T1y, T3u; + T1w = ri[WS(rs, 4)]; + T1x = T7 * T1w; + T1y = ii[WS(rs, 4)]; + T3u = T7 * T1y; + T1z = FMA(Tb, T1y, T1x); + T3v = FNMS(Tb, T1w, T3u); + } + { + E T1L, T1M, T1P, T3B, T1T, T1U, T1X, T3D; + T1L = ri[WS(rs, 14)]; + T1M = T1K * T1L; + T1P = ii[WS(rs, 14)]; + T3B = T1K * T1P; + T1T = ri[WS(rs, 19)]; + T1U = T1S * T1T; + T1X = ii[WS(rs, 19)]; + T3D = T1S * T1X; + T1Q = FMA(T1O, T1P, T1M); + T1Y = FMA(T1W, T1X, T1U); + T1Z = T1Q + T1Y; + T3C = FNMS(T1O, T1L, T3B); + T3E = FNMS(T1W, T1T, T3D); + T3F = T3C + T3E; + } + { + E T1A, T1B, T1C, T3w, T1E, T1F, T1G, T3y; + T1A = ri[WS(rs, 9)]; + T1B = T8 * T1A; + T1C = ii[WS(rs, 9)]; + T3w = T8 * T1C; + T1E = ri[WS(rs, 24)]; + T1F = Tk * T1E; + T1G = ii[WS(rs, 24)]; + T3y = Tk * T1G; + T1D = FMA(Tc, T1C, T1B); + T1H = FMA(Tm, T1G, T1F); + T1I = T1D + T1H; + T3x = FNMS(Tc, T1A, T3w); + T3z = FNMS(Tm, T1E, T3y); + T3A = T3x + T3z; + } + { + E T4M, T4N, T4T, T4U; + T4M = T1H - T1D; + T4N = T1Y - T1Q; + T4O = FMA(KP618033988, T4N, T4M); + T6v = FNMS(KP618033988, T4M, T4N); + T4T = T3z - T3x; + T4U = T3E - T3C; + T4V = FMA(KP618033988, T4U, T4T); + T6s = FNMS(KP618033988, T4T, T4U); + } + { + E T4R, T20, T4Q, T4K, T3G, T4J; + T4R = T1I - T1Z; + T20 = T1I + T1Z; + T4Q = FNMS(KP250000000, T20, T1z); + T21 = T1z + T20; + T6r = FNMS(KP559016994, T4R, T4Q); + T4S = FMA(KP559016994, T4R, T4Q); + T4K = T3F - T3A; + T3G = T3A + T3F; + T4J = FNMS(KP250000000, T3G, T3v); + T3H = T3v + T3G; + T6u = FMA(KP559016994, T4K, T4J); + T4L = FNMS(KP559016994, T4K, T4J); + } + } + { + E T26, T3K, T2r, T2z, T2A, T3R, T3T, T3U, T2c, T2k, T2l, T3M, T3O, T3P; + { + E T23, T24, T25, T3J; + T23 = ri[WS(rs, 2)]; + T24 = T19 * T23; + T25 = ii[WS(rs, 2)]; + T3J = T19 * T25; + T26 = FMA(T1b, T25, T24); + T3K = FNMS(T1b, T23, T3J); + } + { + E T2n, T2o, T2q, T3Q, T2u, T2v, T2y, T3S; + T2n = ri[WS(rs, 12)]; + T2o = T2m * T2n; + T2q = ii[WS(rs, 12)]; + T3Q = T2m * T2q; + T2u = ri[WS(rs, 17)]; + T2v = T2t * T2u; + T2y = ii[WS(rs, 17)]; + T3S = T2t * T2y; + T2r = FMA(T2p, T2q, T2o); + T2z = FMA(T2x, T2y, T2v); + T2A = T2r + T2z; + T3R = FNMS(T2p, T2n, T3Q); + T3T = FNMS(T2x, T2u, T3S); + T3U = T3R + T3T; + } + { + E T28, T29, T2b, T3L, T2f, T2g, T2j, T3N; + T28 = ri[WS(rs, 7)]; + T29 = T27 * T28; + T2b = ii[WS(rs, 7)]; + T3L = T27 * T2b; + T2f = ri[WS(rs, 22)]; + T2g = T2e * T2f; + T2j = ii[WS(rs, 22)]; + T3N = T2e * T2j; + T2c = FMA(T2a, T2b, T29); + T2k = FMA(T2i, T2j, T2g); + T2l = T2c + T2k; + T3M = FNMS(T2a, T28, T3L); + T3O = FNMS(T2i, T2f, T3N); + T3P = T3M + T3O; + } + { + E T52, T53, T59, T5a; + T52 = T3O - T3M; + T53 = T3R - T3T; + T54 = FNMS(KP618033988, T53, T52); + T6g = FMA(KP618033988, T52, T53); + T59 = T2k - T2c; + T5a = T2z - T2r; + T5b = FMA(KP618033988, T5a, T59); + T6d = FNMS(KP618033988, T59, T5a); + } + { + E T50, T2B, T4Z, T57, T3V, T56; + T50 = T2A - T2l; + T2B = T2l + T2A; + T4Z = FNMS(KP250000000, T2B, T26); + T2C = T26 + T2B; + T6f = FMA(KP559016994, T50, T4Z); + T51 = FNMS(KP559016994, T50, T4Z); + T57 = T3U - T3P; + T3V = T3P + T3U; + T56 = FNMS(KP250000000, T3V, T3K); + T3W = T3K + T3V; + T6c = FMA(KP559016994, T57, T56); + T58 = FNMS(KP559016994, T57, T56); + } + } + { + E T4c, T4e, TN, T3c, T3d, T3e, T4d, T3f; + { + E T3I, T4b, T22, T3b; + T3I = T3t - T3H; + T4b = T3W - T4a; + T4c = FMA(KP618033988, T4b, T3I); + T4e = FNMS(KP618033988, T3I, T4b); + TN = T1 + TM; + T22 = T1v + T21; + T3b = T2C + T3a; + T3c = T22 + T3b; + T3d = FNMS(KP250000000, T3c, TN); + T3e = T22 - T3b; + } + ri[0] = TN + T3c; + T4d = FNMS(KP559016994, T3e, T3d); + ri[WS(rs, 10)] = FNMS(KP951056516, T4e, T4d); + ri[WS(rs, 15)] = FMA(KP951056516, T4e, T4d); + T3f = FMA(KP559016994, T3e, T3d); + ri[WS(rs, 20)] = FNMS(KP951056516, T4c, T3f); + ri[WS(rs, 5)] = FMA(KP951056516, T4c, T3f); + } + { + E T7y, T7A, T7s, T7n, T7t, T7u, T7z, T7v; + { + E T7w, T7x, T7l, T7m; + T7w = T1v - T21; + T7x = T2C - T3a; + T7y = FMA(KP618033988, T7x, T7w); + T7A = FNMS(KP618033988, T7w, T7x); + T7s = T7q + T7r; + T7l = T3t + T3H; + T7m = T3W + T4a; + T7n = T7l + T7m; + T7t = FNMS(KP250000000, T7n, T7s); + T7u = T7l - T7m; + } + ii[0] = T7n + T7s; + T7z = FNMS(KP559016994, T7u, T7t); + ii[WS(rs, 10)] = FMA(KP951056516, T7A, T7z); + ii[WS(rs, 15)] = FNMS(KP951056516, T7A, T7z); + T7v = FMA(KP559016994, T7u, T7t); + ii[WS(rs, 5)] = FNMS(KP951056516, T7y, T7v); + ii[WS(rs, 20)] = FMA(KP951056516, T7y, T7v); + } + { + E T4t, T5H, T7H, T7T, T5A, T5D, T7P, T7O, T7I, T7J, T7K, T4Y, T5t, T5u, T62; + E T65, T81, T80, T7U, T7V, T7W, T5O, T5V, T5W, T4h, T7D; + T4h = FMA(KP559016994, T4g, T4f); + T4t = FMA(KP951056516, T4s, T4h); + T5H = FNMS(KP951056516, T4s, T4h); + T7D = FMA(KP559016994, T7C, T7B); + T7H = FNMS(KP951056516, T7G, T7D); + T7T = FMA(KP951056516, T7G, T7D); + { + E T4I, T5y, T5s, T5C, T4X, T5z, T5d, T5B; + { + E T4A, T4H, T5k, T5r; + T4A = FMA(KP951056516, T4z, T4w); + T4H = FMA(KP951056516, T4G, T4D); + T4I = FMA(KP256756360, T4H, T4A); + T5y = FNMS(KP256756360, T4A, T4H); + T5k = FNMS(KP951056516, T5j, T5g); + T5r = FNMS(KP951056516, T5q, T5n); + T5s = FMA(KP939062505, T5r, T5k); + T5C = FNMS(KP939062505, T5k, T5r); + } + { + E T4P, T4W, T55, T5c; + T4P = FMA(KP951056516, T4O, T4L); + T4W = FNMS(KP951056516, T4V, T4S); + T4X = FMA(KP634619297, T4W, T4P); + T5z = FNMS(KP634619297, T4P, T4W); + T55 = FNMS(KP951056516, T54, T51); + T5c = FMA(KP951056516, T5b, T58); + T5d = FMA(KP549754652, T5c, T55); + T5B = FNMS(KP549754652, T55, T5c); + } + T5A = FMA(KP871714437, T5z, T5y); + T5D = FNMS(KP831864738, T5C, T5B); + T7P = FNMS(KP831864738, T5s, T5d); + T7O = FNMS(KP871714437, T4X, T4I); + T7I = FNMS(KP871714437, T5z, T5y); + T7J = FMA(KP831864738, T5C, T5B); + T7K = FMA(KP904730450, T7J, T7I); + T4Y = FMA(KP871714437, T4X, T4I); + T5t = FMA(KP831864738, T5s, T5d); + T5u = FMA(KP904730450, T5t, T4Y); + } + { + E T5K, T63, T5U, T61, T5N, T64, T5R, T60; + { + E T5I, T5J, T5S, T5T; + T5I = FMA(KP951056516, T5j, T5g); + T5J = FMA(KP951056516, T5q, T5n); + T5K = FNMS(KP126329378, T5J, T5I); + T63 = FMA(KP126329378, T5I, T5J); + T5S = FNMS(KP951056516, T4O, T4L); + T5T = FMA(KP951056516, T4V, T4S); + T5U = FMA(KP827271945, T5T, T5S); + T61 = FNMS(KP827271945, T5S, T5T); + } + { + E T5L, T5M, T5P, T5Q; + T5L = FNMS(KP951056516, T5b, T58); + T5M = FMA(KP951056516, T54, T51); + T5N = FNMS(KP470564281, T5M, T5L); + T64 = FMA(KP470564281, T5L, T5M); + T5P = FNMS(KP951056516, T4G, T4D); + T5Q = FNMS(KP951056516, T4z, T4w); + T5R = FMA(KP634619297, T5Q, T5P); + T60 = FNMS(KP634619297, T5P, T5Q); + } + T62 = FMA(KP912575812, T61, T60); + T65 = FNMS(KP912018591, T64, T63); + T81 = FMA(KP912018591, T5N, T5K); + T80 = FMA(KP912575812, T5U, T5R); + T7U = FMA(KP912018591, T64, T63); + T7V = FNMS(KP912575812, T61, T60); + T7W = FMA(KP851038619, T7V, T7U); + T5O = FNMS(KP912018591, T5N, T5K); + T5V = FNMS(KP912575812, T5U, T5R); + T5W = FNMS(KP851038619, T5V, T5O); + } + ri[WS(rs, 1)] = FMA(KP968583161, T5u, T4t); + ii[WS(rs, 1)] = FMA(KP968583161, T7K, T7H); + ri[WS(rs, 4)] = FNMS(KP992114701, T5W, T5H); + ii[WS(rs, 4)] = FNMS(KP992114701, T7W, T7T); + { + E T5E, T5G, T5x, T5F, T5v, T5w; + T5E = FMA(KP559154169, T5D, T5A); + T5G = FNMS(KP683113946, T5A, T5D); + T5v = FNMS(KP242145790, T5u, T4t); + T5w = FNMS(KP904730450, T5t, T4Y); + T5x = FMA(KP541454447, T5w, T5v); + T5F = FNMS(KP541454447, T5w, T5v); + ri[WS(rs, 6)] = FMA(KP921177326, T5E, T5x); + ri[WS(rs, 16)] = FMA(KP833417178, T5G, T5F); + ri[WS(rs, 21)] = FNMS(KP921177326, T5E, T5x); + ri[WS(rs, 11)] = FNMS(KP833417178, T5G, T5F); + } + { + E T7Q, T7S, T7N, T7R, T7L, T7M; + T7Q = FMA(KP559154169, T7P, T7O); + T7S = FNMS(KP683113946, T7O, T7P); + T7L = FNMS(KP242145790, T7K, T7H); + T7M = FNMS(KP904730450, T7J, T7I); + T7N = FMA(KP541454447, T7M, T7L); + T7R = FNMS(KP541454447, T7M, T7L); + ii[WS(rs, 6)] = FNMS(KP921177326, T7Q, T7N); + ii[WS(rs, 16)] = FNMS(KP833417178, T7S, T7R); + ii[WS(rs, 21)] = FMA(KP921177326, T7Q, T7N); + ii[WS(rs, 11)] = FMA(KP833417178, T7S, T7R); + } + { + E T66, T68, T5Z, T67, T5X, T5Y; + T66 = FNMS(KP726211448, T65, T62); + T68 = FMA(KP525970792, T62, T65); + T5X = FMA(KP248028675, T5W, T5H); + T5Y = FMA(KP851038619, T5V, T5O); + T5Z = FMA(KP554608978, T5Y, T5X); + T67 = FNMS(KP554608978, T5Y, T5X); + ri[WS(rs, 9)] = FNMS(KP803003575, T66, T5Z); + ri[WS(rs, 19)] = FMA(KP943557151, T68, T67); + ri[WS(rs, 24)] = FMA(KP803003575, T66, T5Z); + ri[WS(rs, 14)] = FNMS(KP943557151, T68, T67); + } + { + E T82, T84, T7Z, T83, T7X, T7Y; + T82 = FMA(KP726211448, T81, T80); + T84 = FNMS(KP525970792, T80, T81); + T7X = FMA(KP248028675, T7W, T7T); + T7Y = FNMS(KP851038619, T7V, T7U); + T7Z = FMA(KP554608978, T7Y, T7X); + T83 = FNMS(KP554608978, T7Y, T7X); + ii[WS(rs, 9)] = FNMS(KP803003575, T82, T7Z); + ii[WS(rs, 19)] = FNMS(KP943557151, T84, T83); + ii[WS(rs, 24)] = FMA(KP803003575, T82, T7Z); + ii[WS(rs, 14)] = FMA(KP943557151, T84, T83); + } + } + { + E T6b, T6T, T87, T8j, T6M, T6P, T8r, T8q, T8k, T8l, T8m, T6q, T6F, T6G, T7e; + E T7h, T8f, T8e, T88, T89, T8a, T70, T77, T78, T69, T85; + T69 = FNMS(KP559016994, T4g, T4f); + T6b = FMA(KP951056516, T6a, T69); + T6T = FNMS(KP951056516, T6a, T69); + T85 = FNMS(KP559016994, T7C, T7B); + T87 = FMA(KP951056516, T86, T85); + T8j = FNMS(KP951056516, T86, T85); + { + E T6i, T6N, T6E, T6L, T6p, T6O, T6x, T6K; + { + E T6e, T6h, T6A, T6D; + T6e = FMA(KP951056516, T6d, T6c); + T6h = FMA(KP951056516, T6g, T6f); + T6i = FMA(KP062914667, T6h, T6e); + T6N = FNMS(KP062914667, T6e, T6h); + T6A = FNMS(KP951056516, T6z, T6y); + T6D = FMA(KP951056516, T6C, T6B); + T6E = FMA(KP939062505, T6D, T6A); + T6L = FNMS(KP939062505, T6A, T6D); + } + { + E T6l, T6o, T6t, T6w; + T6l = FNMS(KP951056516, T6k, T6j); + T6o = FNMS(KP951056516, T6n, T6m); + T6p = FNMS(KP827271945, T6o, T6l); + T6O = FMA(KP827271945, T6l, T6o); + T6t = FNMS(KP951056516, T6s, T6r); + T6w = FMA(KP951056516, T6v, T6u); + T6x = FNMS(KP126329378, T6w, T6t); + T6K = FMA(KP126329378, T6t, T6w); + } + T6M = FMA(KP734762448, T6L, T6K); + T6P = FNMS(KP772036680, T6O, T6N); + T8r = FNMS(KP772036680, T6p, T6i); + T8q = FMA(KP734762448, T6E, T6x); + T8k = FMA(KP772036680, T6O, T6N); + T8l = FNMS(KP734762448, T6L, T6K); + T8m = FMA(KP994076283, T8l, T8k); + T6q = FMA(KP772036680, T6p, T6i); + T6F = FNMS(KP734762448, T6E, T6x); + T6G = FNMS(KP994076283, T6F, T6q); + } + { + E T6W, T7f, T76, T7d, T6Z, T7g, T73, T7c; + { + E T6U, T6V, T74, T75; + T6U = FMA(KP951056516, T6k, T6j); + T6V = FMA(KP951056516, T6n, T6m); + T6W = FMA(KP062914667, T6V, T6U); + T7f = FNMS(KP062914667, T6U, T6V); + T74 = FMA(KP951056516, T6z, T6y); + T75 = FNMS(KP951056516, T6C, T6B); + T76 = FMA(KP549754652, T75, T74); + T7d = FNMS(KP549754652, T74, T75); + } + { + E T6X, T6Y, T71, T72; + T6X = FNMS(KP951056516, T6d, T6c); + T6Y = FNMS(KP951056516, T6g, T6f); + T6Z = FMA(KP634619297, T6Y, T6X); + T7g = FNMS(KP634619297, T6X, T6Y); + T71 = FNMS(KP951056516, T6v, T6u); + T72 = FMA(KP951056516, T6s, T6r); + T73 = FNMS(KP470564281, T72, T71); + T7c = FMA(KP470564281, T71, T72); + } + T7e = FMA(KP968479752, T7d, T7c); + T7h = FNMS(KP845997307, T7g, T7f); + T8f = FNMS(KP845997307, T6Z, T6W); + T8e = FNMS(KP968479752, T76, T73); + T88 = FMA(KP845997307, T7g, T7f); + T89 = FNMS(KP968479752, T7d, T7c); + T8a = FMA(KP906616052, T89, T88); + T70 = FMA(KP845997307, T6Z, T6W); + T77 = FMA(KP968479752, T76, T73); + T78 = FMA(KP906616052, T77, T70); + } + ri[WS(rs, 3)] = FMA(KP998026728, T6G, T6b); + ii[WS(rs, 3)] = FNMS(KP998026728, T8m, T8j); + ri[WS(rs, 2)] = FMA(KP998026728, T78, T6T); + ii[WS(rs, 2)] = FNMS(KP998026728, T8a, T87); + { + E T6Q, T6S, T6J, T6R, T6H, T6I; + T6Q = FNMS(KP621716863, T6P, T6M); + T6S = FMA(KP614372930, T6M, T6P); + T6H = FNMS(KP249506682, T6G, T6b); + T6I = FMA(KP994076283, T6F, T6q); + T6J = FNMS(KP557913902, T6I, T6H); + T6R = FMA(KP557913902, T6I, T6H); + ri[WS(rs, 23)] = FNMS(KP943557151, T6Q, T6J); + ri[WS(rs, 13)] = FMA(KP949179823, T6S, T6R); + ri[WS(rs, 8)] = FMA(KP943557151, T6Q, T6J); + ri[WS(rs, 18)] = FNMS(KP949179823, T6S, T6R); + } + { + E T8s, T8u, T8p, T8t, T8n, T8o; + T8s = FMA(KP621716863, T8r, T8q); + T8u = FNMS(KP614372930, T8q, T8r); + T8n = FMA(KP249506682, T8m, T8j); + T8o = FNMS(KP994076283, T8l, T8k); + T8p = FMA(KP557913902, T8o, T8n); + T8t = FNMS(KP557913902, T8o, T8n); + ii[WS(rs, 8)] = FNMS(KP943557151, T8s, T8p); + ii[WS(rs, 18)] = FNMS(KP949179823, T8u, T8t); + ii[WS(rs, 23)] = FMA(KP943557151, T8s, T8p); + ii[WS(rs, 13)] = FMA(KP949179823, T8u, T8t); + } + { + E T7i, T7k, T7b, T7j, T79, T7a; + T7i = FMA(KP681693190, T7h, T7e); + T7k = FNMS(KP560319534, T7e, T7h); + T79 = FNMS(KP249506682, T78, T6T); + T7a = FNMS(KP906616052, T77, T70); + T7b = FNMS(KP557913902, T7a, T79); + T7j = FMA(KP557913902, T7a, T79); + ri[WS(rs, 22)] = FNMS(KP860541664, T7i, T7b); + ri[WS(rs, 17)] = FMA(KP949179823, T7k, T7j); + ri[WS(rs, 7)] = FMA(KP860541664, T7i, T7b); + ri[WS(rs, 12)] = FNMS(KP949179823, T7k, T7j); + } + { + E T8g, T8i, T8d, T8h, T8b, T8c; + T8g = FMA(KP681693190, T8f, T8e); + T8i = FNMS(KP560319534, T8e, T8f); + T8b = FMA(KP249506682, T8a, T87); + T8c = FNMS(KP906616052, T89, T88); + T8d = FMA(KP557913902, T8c, T8b); + T8h = FNMS(KP557913902, T8c, T8b); + ii[WS(rs, 7)] = FMA(KP860541664, T8g, T8d); + ii[WS(rs, 17)] = FMA(KP949179823, T8i, T8h); + ii[WS(rs, 22)] = FNMS(KP860541664, T8g, T8d); + ii[WS(rs, 12)] = FNMS(KP949179823, T8i, T8h); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 24}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 25, "t2_25", twinstr, &GENUS, {84, 78, 356, 0}, 0, 0, 0 }; + +void X(codelet_t2_25) (planner *p) { + X(kdft_dit_register) (p, t2_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 25 -name t2_25 -include dft/scalar/t.h */ + +/* + * This function contains 440 FP additions, 340 FP multiplications, + * (or, 280 additions, 180 multiplications, 160 fused multiply/add), + * 149 stack variables, 20 constants, and 100 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(50, rs)) { + E T2, T5, T3, T6, T8, Td, T16, T14, Te, T9, T21, T23, Tx, TR, T1g; + E TB, T1f, TV, T1Q, Tg, T1S, Tk, T18, T2s, T1c, T2q, Tn, To, Tp, Tr; + E T28, T2x, TY, T2k, T2m, T2v, TG, TE, T10, T1h, T1E, T26, T1B, T1G, T1V; + E T1X, T1z, T1j; + { + E Tw, TT, Tz, TQ, Tv, TU, TA, TP; + { + E T4, Tc, T7, Tb; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tc = T5 * T3; + T7 = T5 * T6; + Tb = T2 * T6; + T8 = T4 - T7; + Td = Tb + Tc; + T16 = Tb - Tc; + T14 = T4 + T7; + Te = W[5]; + Tw = T5 * Te; + TT = T3 * Te; + Tz = T2 * Te; + TQ = T6 * Te; + T9 = W[4]; + Tv = T2 * T9; + TU = T6 * T9; + TA = T5 * T9; + TP = T3 * T9; + } + T21 = TP - TQ; + T23 = TT + TU; + { + E T15, T17, Ta, Tf, T1a, T1b, Ti, Tj; + Tx = Tv - Tw; + TR = TP + TQ; + T1g = Tz - TA; + TB = Tz + TA; + T1f = Tv + Tw; + TV = TT - TU; + T15 = T14 * T9; + T17 = T16 * Te; + T1Q = T15 + T17; + Ta = T8 * T9; + Tf = Td * Te; + Tg = Ta + Tf; + T1a = T14 * Te; + T1b = T16 * T9; + T1S = T1a - T1b; + Ti = T8 * Te; + Tj = Td * T9; + Tk = Ti - Tj; + T18 = T15 - T17; + T2s = Ti + Tj; + T1c = T1a + T1b; + T2q = Ta - Tf; + Tn = W[6]; + To = W[7]; + Tp = FMA(T8, Tn, Td * To); + Tr = FNMS(Td, Tn, T8 * To); + T28 = FNMS(T1S, Tn, T1Q * To); + T2x = FNMS(TV, Tn, TR * To); + TY = FMA(T3, Tn, T6 * To); + T2k = FMA(T2, Tn, T5 * To); + T2m = FNMS(T5, Tn, T2 * To); + T2v = FMA(TR, Tn, TV * To); + TG = FNMS(Te, Tn, T9 * To); + TE = FMA(T9, Tn, Te * To); + T10 = FNMS(T6, Tn, T3 * To); + T1h = FMA(T1f, Tn, T1g * To); + T1E = FMA(Tg, Tn, Tk * To); + T26 = FMA(T1Q, Tn, T1S * To); + T1B = FNMS(TB, Tn, Tx * To); + T1G = FNMS(Tk, Tn, Tg * To); + T1V = FMA(T14, Tn, T16 * To); + T1X = FNMS(T16, Tn, T14 * To); + T1z = FMA(Tx, Tn, TB * To); + T1j = FNMS(T1g, Tn, T1f * To); + } + } + { + E T1, T6v, T2F, T6I, TK, T2G, T6u, T6J, T6N, T7c, T2O, T52, T2C, T6k, T48; + E T5X, T4L, T5s, T4j, T5W, T4K, T5v, T1o, T6g, T30, T5M, T4A, T56, T3b, T5N; + E T4B, T59, T1L, T6h, T3n, T5Q, T4D, T5g, T3y, T5P, T4E, T5d, T2d, T6j, T3L; + E T5T, T4I, T5l, T3W, T5U, T4H, T5o; + { + E Tm, T2I, Tt, T2J, Tu, T6s, TD, T2L, TI, T2M, TJ, T6t; + T1 = ri[0]; + T6v = ii[0]; + { + E Th, Tl, Tq, Ts; + Th = ri[WS(rs, 5)]; + Tl = ii[WS(rs, 5)]; + Tm = FMA(Tg, Th, Tk * Tl); + T2I = FNMS(Tk, Th, Tg * Tl); + Tq = ri[WS(rs, 20)]; + Ts = ii[WS(rs, 20)]; + Tt = FMA(Tp, Tq, Tr * Ts); + T2J = FNMS(Tr, Tq, Tp * Ts); + } + Tu = Tm + Tt; + T6s = T2I + T2J; + { + E Ty, TC, TF, TH; + Ty = ri[WS(rs, 10)]; + TC = ii[WS(rs, 10)]; + TD = FMA(Tx, Ty, TB * TC); + T2L = FNMS(TB, Ty, Tx * TC); + TF = ri[WS(rs, 15)]; + TH = ii[WS(rs, 15)]; + TI = FMA(TE, TF, TG * TH); + T2M = FNMS(TG, TF, TE * TH); + } + TJ = TD + TI; + T6t = T2L + T2M; + T2F = KP559016994 * (Tu - TJ); + T6I = KP559016994 * (T6s - T6t); + TK = Tu + TJ; + T2G = FNMS(KP250000000, TK, T1); + T6u = T6s + T6t; + T6J = FNMS(KP250000000, T6u, T6v); + { + E T6L, T6M, T2K, T2N; + T6L = Tm - Tt; + T6M = TD - TI; + T6N = FMA(KP951056516, T6L, KP587785252 * T6M); + T7c = FNMS(KP587785252, T6L, KP951056516 * T6M); + T2K = T2I - T2J; + T2N = T2L - T2M; + T2O = FMA(KP951056516, T2K, KP587785252 * T2N); + T52 = FNMS(KP587785252, T2K, KP951056516 * T2N); + } + } + { + E T2g, T4c, T43, T46, T4h, T4g, T49, T4a, T4d, T2p, T2A, T2B, T2e, T2f; + T2e = ri[WS(rs, 3)]; + T2f = ii[WS(rs, 3)]; + T2g = FMA(T3, T2e, T6 * T2f); + T4c = FNMS(T6, T2e, T3 * T2f); + { + E T2j, T41, T2z, T45, T2o, T42, T2u, T44; + { + E T2h, T2i, T2w, T2y; + T2h = ri[WS(rs, 8)]; + T2i = ii[WS(rs, 8)]; + T2j = FMA(T1f, T2h, T1g * T2i); + T41 = FNMS(T1g, T2h, T1f * T2i); + T2w = ri[WS(rs, 18)]; + T2y = ii[WS(rs, 18)]; + T2z = FMA(T2v, T2w, T2x * T2y); + T45 = FNMS(T2x, T2w, T2v * T2y); + } + { + E T2l, T2n, T2r, T2t; + T2l = ri[WS(rs, 23)]; + T2n = ii[WS(rs, 23)]; + T2o = FMA(T2k, T2l, T2m * T2n); + T42 = FNMS(T2m, T2l, T2k * T2n); + T2r = ri[WS(rs, 13)]; + T2t = ii[WS(rs, 13)]; + T2u = FMA(T2q, T2r, T2s * T2t); + T44 = FNMS(T2s, T2r, T2q * T2t); + } + T43 = T41 - T42; + T46 = T44 - T45; + T4h = T2u - T2z; + T4g = T2j - T2o; + T49 = T41 + T42; + T4a = T44 + T45; + T4d = T49 + T4a; + T2p = T2j + T2o; + T2A = T2u + T2z; + T2B = T2p + T2A; + } + T2C = T2g + T2B; + T6k = T4c + T4d; + { + E T47, T5r, T40, T5q, T3Y, T3Z; + T47 = FMA(KP951056516, T43, KP587785252 * T46); + T5r = FNMS(KP587785252, T43, KP951056516 * T46); + T3Y = KP559016994 * (T2p - T2A); + T3Z = FNMS(KP250000000, T2B, T2g); + T40 = T3Y + T3Z; + T5q = T3Z - T3Y; + T48 = T40 + T47; + T5X = T5q + T5r; + T4L = T40 - T47; + T5s = T5q - T5r; + } + { + E T4i, T5t, T4f, T5u, T4b, T4e; + T4i = FMA(KP951056516, T4g, KP587785252 * T4h); + T5t = FNMS(KP587785252, T4g, KP951056516 * T4h); + T4b = KP559016994 * (T49 - T4a); + T4e = FNMS(KP250000000, T4d, T4c); + T4f = T4b + T4e; + T5u = T4e - T4b; + T4j = T4f - T4i; + T5W = T5u - T5t; + T4K = T4i + T4f; + T5v = T5t + T5u; + } + } + { + E TO, T34, T2V, T2Y, T39, T38, T31, T32, T35, T13, T1m, T1n, TM, TN; + TM = ri[WS(rs, 1)]; + TN = ii[WS(rs, 1)]; + TO = FMA(T2, TM, T5 * TN); + T34 = FNMS(T5, TM, T2 * TN); + { + E TX, T2T, T1l, T2X, T12, T2U, T1e, T2W; + { + E TS, TW, T1i, T1k; + TS = ri[WS(rs, 6)]; + TW = ii[WS(rs, 6)]; + TX = FMA(TR, TS, TV * TW); + T2T = FNMS(TV, TS, TR * TW); + T1i = ri[WS(rs, 16)]; + T1k = ii[WS(rs, 16)]; + T1l = FMA(T1h, T1i, T1j * T1k); + T2X = FNMS(T1j, T1i, T1h * T1k); + } + { + E TZ, T11, T19, T1d; + TZ = ri[WS(rs, 21)]; + T11 = ii[WS(rs, 21)]; + T12 = FMA(TY, TZ, T10 * T11); + T2U = FNMS(T10, TZ, TY * T11); + T19 = ri[WS(rs, 11)]; + T1d = ii[WS(rs, 11)]; + T1e = FMA(T18, T19, T1c * T1d); + T2W = FNMS(T1c, T19, T18 * T1d); + } + T2V = T2T - T2U; + T2Y = T2W - T2X; + T39 = T1e - T1l; + T38 = TX - T12; + T31 = T2T + T2U; + T32 = T2W + T2X; + T35 = T31 + T32; + T13 = TX + T12; + T1m = T1e + T1l; + T1n = T13 + T1m; + } + T1o = TO + T1n; + T6g = T34 + T35; + { + E T2Z, T55, T2S, T54, T2Q, T2R; + T2Z = FMA(KP951056516, T2V, KP587785252 * T2Y); + T55 = FNMS(KP587785252, T2V, KP951056516 * T2Y); + T2Q = KP559016994 * (T13 - T1m); + T2R = FNMS(KP250000000, T1n, TO); + T2S = T2Q + T2R; + T54 = T2R - T2Q; + T30 = T2S + T2Z; + T5M = T54 + T55; + T4A = T2S - T2Z; + T56 = T54 - T55; + } + { + E T3a, T57, T37, T58, T33, T36; + T3a = FMA(KP951056516, T38, KP587785252 * T39); + T57 = FNMS(KP587785252, T38, KP951056516 * T39); + T33 = KP559016994 * (T31 - T32); + T36 = FNMS(KP250000000, T35, T34); + T37 = T33 + T36; + T58 = T36 - T33; + T3b = T37 - T3a; + T5N = T58 - T57; + T4B = T3a + T37; + T59 = T57 + T58; + } + } + { + E T1r, T3r, T3i, T3l, T3w, T3v, T3o, T3p, T3s, T1y, T1J, T1K, T1p, T1q; + T1p = ri[WS(rs, 4)]; + T1q = ii[WS(rs, 4)]; + T1r = FMA(T8, T1p, Td * T1q); + T3r = FNMS(Td, T1p, T8 * T1q); + { + E T1u, T3g, T1I, T3k, T1x, T3h, T1D, T3j; + { + E T1s, T1t, T1F, T1H; + T1s = ri[WS(rs, 9)]; + T1t = ii[WS(rs, 9)]; + T1u = FMA(T9, T1s, Te * T1t); + T3g = FNMS(Te, T1s, T9 * T1t); + T1F = ri[WS(rs, 19)]; + T1H = ii[WS(rs, 19)]; + T1I = FMA(T1E, T1F, T1G * T1H); + T3k = FNMS(T1G, T1F, T1E * T1H); + } + { + E T1v, T1w, T1A, T1C; + T1v = ri[WS(rs, 24)]; + T1w = ii[WS(rs, 24)]; + T1x = FMA(Tn, T1v, To * T1w); + T3h = FNMS(To, T1v, Tn * T1w); + T1A = ri[WS(rs, 14)]; + T1C = ii[WS(rs, 14)]; + T1D = FMA(T1z, T1A, T1B * T1C); + T3j = FNMS(T1B, T1A, T1z * T1C); + } + T3i = T3g - T3h; + T3l = T3j - T3k; + T3w = T1D - T1I; + T3v = T1u - T1x; + T3o = T3g + T3h; + T3p = T3j + T3k; + T3s = T3o + T3p; + T1y = T1u + T1x; + T1J = T1D + T1I; + T1K = T1y + T1J; + } + T1L = T1r + T1K; + T6h = T3r + T3s; + { + E T3m, T5f, T3f, T5e, T3d, T3e; + T3m = FMA(KP951056516, T3i, KP587785252 * T3l); + T5f = FNMS(KP587785252, T3i, KP951056516 * T3l); + T3d = KP559016994 * (T1y - T1J); + T3e = FNMS(KP250000000, T1K, T1r); + T3f = T3d + T3e; + T5e = T3e - T3d; + T3n = T3f + T3m; + T5Q = T5e + T5f; + T4D = T3f - T3m; + T5g = T5e - T5f; + } + { + E T3x, T5b, T3u, T5c, T3q, T3t; + T3x = FMA(KP951056516, T3v, KP587785252 * T3w); + T5b = FNMS(KP587785252, T3v, KP951056516 * T3w); + T3q = KP559016994 * (T3o - T3p); + T3t = FNMS(KP250000000, T3s, T3r); + T3u = T3q + T3t; + T5c = T3t - T3q; + T3y = T3u - T3x; + T5P = T5c - T5b; + T4E = T3x + T3u; + T5d = T5b + T5c; + } + } + { + E T1P, T3P, T3G, T3J, T3U, T3T, T3M, T3N, T3Q, T20, T2b, T2c, T1N, T1O; + T1N = ri[WS(rs, 2)]; + T1O = ii[WS(rs, 2)]; + T1P = FMA(T14, T1N, T16 * T1O); + T3P = FNMS(T16, T1N, T14 * T1O); + { + E T1U, T3E, T2a, T3I, T1Z, T3F, T25, T3H; + { + E T1R, T1T, T27, T29; + T1R = ri[WS(rs, 7)]; + T1T = ii[WS(rs, 7)]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T3E = FNMS(T1S, T1R, T1Q * T1T); + T27 = ri[WS(rs, 17)]; + T29 = ii[WS(rs, 17)]; + T2a = FMA(T26, T27, T28 * T29); + T3I = FNMS(T28, T27, T26 * T29); + } + { + E T1W, T1Y, T22, T24; + T1W = ri[WS(rs, 22)]; + T1Y = ii[WS(rs, 22)]; + T1Z = FMA(T1V, T1W, T1X * T1Y); + T3F = FNMS(T1X, T1W, T1V * T1Y); + T22 = ri[WS(rs, 12)]; + T24 = ii[WS(rs, 12)]; + T25 = FMA(T21, T22, T23 * T24); + T3H = FNMS(T23, T22, T21 * T24); + } + T3G = T3E - T3F; + T3J = T3H - T3I; + T3U = T25 - T2a; + T3T = T1U - T1Z; + T3M = T3E + T3F; + T3N = T3H + T3I; + T3Q = T3M + T3N; + T20 = T1U + T1Z; + T2b = T25 + T2a; + T2c = T20 + T2b; + } + T2d = T1P + T2c; + T6j = T3P + T3Q; + { + E T3K, T5k, T3D, T5j, T3B, T3C; + T3K = FMA(KP951056516, T3G, KP587785252 * T3J); + T5k = FNMS(KP587785252, T3G, KP951056516 * T3J); + T3B = KP559016994 * (T20 - T2b); + T3C = FNMS(KP250000000, T2c, T1P); + T3D = T3B + T3C; + T5j = T3C - T3B; + T3L = T3D + T3K; + T5T = T5j + T5k; + T4I = T3D - T3K; + T5l = T5j - T5k; + } + { + E T3V, T5m, T3S, T5n, T3O, T3R; + T3V = FMA(KP951056516, T3T, KP587785252 * T3U); + T5m = FNMS(KP587785252, T3T, KP951056516 * T3U); + T3O = KP559016994 * (T3M - T3N); + T3R = FNMS(KP250000000, T3Q, T3P); + T3S = T3O + T3R; + T5n = T3R - T3O; + T3W = T3S - T3V; + T5U = T5n - T5m; + T4H = T3V + T3S; + T5o = T5m + T5n; + } + } + { + E T6m, T6o, TL, T2E, T6d, T6e, T6n, T6f; + { + E T6i, T6l, T1M, T2D; + T6i = T6g - T6h; + T6l = T6j - T6k; + T6m = FMA(KP951056516, T6i, KP587785252 * T6l); + T6o = FNMS(KP587785252, T6i, KP951056516 * T6l); + TL = T1 + TK; + T1M = T1o + T1L; + T2D = T2d + T2C; + T2E = T1M + T2D; + T6d = KP559016994 * (T1M - T2D); + T6e = FNMS(KP250000000, T2E, TL); + } + ri[0] = TL + T2E; + T6n = T6e - T6d; + ri[WS(rs, 10)] = T6n - T6o; + ri[WS(rs, 15)] = T6n + T6o; + T6f = T6d + T6e; + ri[WS(rs, 20)] = T6f - T6m; + ri[WS(rs, 5)] = T6f + T6m; + } + { + E T6C, T6D, T6w, T6r, T6x, T6y, T6E, T6z; + { + E T6A, T6B, T6p, T6q; + T6A = T1o - T1L; + T6B = T2d - T2C; + T6C = FMA(KP951056516, T6A, KP587785252 * T6B); + T6D = FNMS(KP587785252, T6A, KP951056516 * T6B); + T6w = T6u + T6v; + T6p = T6g + T6h; + T6q = T6j + T6k; + T6r = T6p + T6q; + T6x = KP559016994 * (T6p - T6q); + T6y = FNMS(KP250000000, T6r, T6w); + } + ii[0] = T6r + T6w; + T6E = T6y - T6x; + ii[WS(rs, 10)] = T6D + T6E; + ii[WS(rs, 15)] = T6E - T6D; + T6z = T6x + T6y; + ii[WS(rs, 5)] = T6z - T6C; + ii[WS(rs, 20)] = T6C + T6z; + } + { + E T2P, T4z, T6O, T70, T4m, T6T, T4n, T6S, T4U, T71, T4X, T6Z, T4O, T75, T4P; + E T74, T4s, T6P, T4v, T6H, T2H, T6K; + T2H = T2F + T2G; + T2P = T2H + T2O; + T4z = T2H - T2O; + T6K = T6I + T6J; + T6O = T6K - T6N; + T70 = T6N + T6K; + { + E T3c, T3z, T3A, T3X, T4k, T4l; + T3c = FMA(KP968583161, T30, KP248689887 * T3b); + T3z = FMA(KP535826794, T3n, KP844327925 * T3y); + T3A = T3c + T3z; + T3X = FMA(KP876306680, T3L, KP481753674 * T3W); + T4k = FMA(KP728968627, T48, KP684547105 * T4j); + T4l = T3X + T4k; + T4m = T3A + T4l; + T6T = T3X - T4k; + T4n = KP559016994 * (T3A - T4l); + T6S = T3c - T3z; + } + { + E T4S, T4T, T6X, T4V, T4W, T6Y; + T4S = FNMS(KP844327925, T4A, KP535826794 * T4B); + T4T = FNMS(KP637423989, T4E, KP770513242 * T4D); + T6X = T4S + T4T; + T4V = FMA(KP125333233, T4L, KP992114701 * T4K); + T4W = FMA(KP904827052, T4I, KP425779291 * T4H); + T6Y = T4W + T4V; + T4U = T4S - T4T; + T71 = KP559016994 * (T6X + T6Y); + T4X = T4V - T4W; + T6Z = T6X - T6Y; + } + { + E T4C, T4F, T4G, T4J, T4M, T4N; + T4C = FMA(KP535826794, T4A, KP844327925 * T4B); + T4F = FMA(KP637423989, T4D, KP770513242 * T4E); + T4G = T4C - T4F; + T4J = FNMS(KP425779291, T4I, KP904827052 * T4H); + T4M = FNMS(KP992114701, T4L, KP125333233 * T4K); + T4N = T4J + T4M; + T4O = T4G + T4N; + T75 = T4J - T4M; + T4P = KP559016994 * (T4G - T4N); + T74 = T4C + T4F; + } + { + E T4q, T4r, T6F, T4t, T4u, T6G; + T4q = FNMS(KP248689887, T30, KP968583161 * T3b); + T4r = FNMS(KP844327925, T3n, KP535826794 * T3y); + T6F = T4q + T4r; + T4t = FNMS(KP481753674, T3L, KP876306680 * T3W); + T4u = FNMS(KP684547105, T48, KP728968627 * T4j); + T6G = T4t + T4u; + T4s = T4q - T4r; + T6P = KP559016994 * (T6F - T6G); + T4v = T4t - T4u; + T6H = T6F + T6G; + } + ri[WS(rs, 1)] = T2P + T4m; + ii[WS(rs, 1)] = T6H + T6O; + ri[WS(rs, 4)] = T4z + T4O; + ii[WS(rs, 4)] = T6Z + T70; + { + E T4w, T4y, T4p, T4x, T4o; + T4w = FMA(KP951056516, T4s, KP587785252 * T4v); + T4y = FNMS(KP587785252, T4s, KP951056516 * T4v); + T4o = FNMS(KP250000000, T4m, T2P); + T4p = T4n + T4o; + T4x = T4o - T4n; + ri[WS(rs, 21)] = T4p - T4w; + ri[WS(rs, 16)] = T4x + T4y; + ri[WS(rs, 6)] = T4p + T4w; + ri[WS(rs, 11)] = T4x - T4y; + } + { + E T6U, T6V, T6R, T6W, T6Q; + T6U = FMA(KP951056516, T6S, KP587785252 * T6T); + T6V = FNMS(KP587785252, T6S, KP951056516 * T6T); + T6Q = FNMS(KP250000000, T6H, T6O); + T6R = T6P + T6Q; + T6W = T6Q - T6P; + ii[WS(rs, 6)] = T6R - T6U; + ii[WS(rs, 16)] = T6W - T6V; + ii[WS(rs, 21)] = T6U + T6R; + ii[WS(rs, 11)] = T6V + T6W; + } + { + E T4Y, T50, T4R, T4Z, T4Q; + T4Y = FMA(KP951056516, T4U, KP587785252 * T4X); + T50 = FNMS(KP587785252, T4U, KP951056516 * T4X); + T4Q = FNMS(KP250000000, T4O, T4z); + T4R = T4P + T4Q; + T4Z = T4Q - T4P; + ri[WS(rs, 24)] = T4R - T4Y; + ri[WS(rs, 19)] = T4Z + T50; + ri[WS(rs, 9)] = T4R + T4Y; + ri[WS(rs, 14)] = T4Z - T50; + } + { + E T76, T77, T73, T78, T72; + T76 = FMA(KP951056516, T74, KP587785252 * T75); + T77 = FNMS(KP587785252, T74, KP951056516 * T75); + T72 = FNMS(KP250000000, T6Z, T70); + T73 = T71 + T72; + T78 = T72 - T71; + ii[WS(rs, 9)] = T73 - T76; + ii[WS(rs, 19)] = T78 - T77; + ii[WS(rs, 24)] = T76 + T73; + ii[WS(rs, 14)] = T77 + T78; + } + } + { + E T53, T5L, T7e, T7q, T5y, T7j, T5z, T7i, T66, T7r, T69, T7p, T60, T7v, T61; + E T7u, T5E, T7f, T5H, T7b, T51, T7d; + T51 = T2G - T2F; + T53 = T51 - T52; + T5L = T51 + T52; + T7d = T6J - T6I; + T7e = T7c + T7d; + T7q = T7d - T7c; + { + E T5a, T5h, T5i, T5p, T5w, T5x; + T5a = FMA(KP876306680, T56, KP481753674 * T59); + T5h = FNMS(KP425779291, T5g, KP904827052 * T5d); + T5i = T5a + T5h; + T5p = FMA(KP535826794, T5l, KP844327925 * T5o); + T5w = FMA(KP062790519, T5s, KP998026728 * T5v); + T5x = T5p + T5w; + T5y = T5i + T5x; + T7j = T5p - T5w; + T5z = KP559016994 * (T5i - T5x); + T7i = T5a - T5h; + } + { + E T64, T65, T7n, T67, T68, T7o; + T64 = FNMS(KP684547105, T5M, KP728968627 * T5N); + T65 = FMA(KP125333233, T5Q, KP992114701 * T5P); + T7n = T64 - T65; + T67 = FNMS(KP998026728, T5T, KP062790519 * T5U); + T68 = FMA(KP770513242, T5X, KP637423989 * T5W); + T7o = T67 - T68; + T66 = T64 + T65; + T7r = KP559016994 * (T7n - T7o); + T69 = T67 + T68; + T7p = T7n + T7o; + } + { + E T5O, T5R, T5S, T5V, T5Y, T5Z; + T5O = FMA(KP728968627, T5M, KP684547105 * T5N); + T5R = FNMS(KP992114701, T5Q, KP125333233 * T5P); + T5S = T5O + T5R; + T5V = FMA(KP062790519, T5T, KP998026728 * T5U); + T5Y = FNMS(KP637423989, T5X, KP770513242 * T5W); + T5Z = T5V + T5Y; + T60 = T5S + T5Z; + T7v = T5V - T5Y; + T61 = KP559016994 * (T5S - T5Z); + T7u = T5O - T5R; + } + { + E T5C, T5D, T79, T5F, T5G, T7a; + T5C = FNMS(KP481753674, T56, KP876306680 * T59); + T5D = FMA(KP904827052, T5g, KP425779291 * T5d); + T79 = T5C - T5D; + T5F = FNMS(KP844327925, T5l, KP535826794 * T5o); + T5G = FNMS(KP998026728, T5s, KP062790519 * T5v); + T7a = T5F + T5G; + T5E = T5C + T5D; + T7f = KP559016994 * (T79 - T7a); + T5H = T5F - T5G; + T7b = T79 + T7a; + } + ri[WS(rs, 2)] = T53 + T5y; + ii[WS(rs, 2)] = T7b + T7e; + ri[WS(rs, 3)] = T5L + T60; + ii[WS(rs, 3)] = T7p + T7q; + { + E T5I, T5K, T5B, T5J, T5A; + T5I = FMA(KP951056516, T5E, KP587785252 * T5H); + T5K = FNMS(KP587785252, T5E, KP951056516 * T5H); + T5A = FNMS(KP250000000, T5y, T53); + T5B = T5z + T5A; + T5J = T5A - T5z; + ri[WS(rs, 22)] = T5B - T5I; + ri[WS(rs, 17)] = T5J + T5K; + ri[WS(rs, 7)] = T5B + T5I; + ri[WS(rs, 12)] = T5J - T5K; + } + { + E T7k, T7l, T7h, T7m, T7g; + T7k = FMA(KP951056516, T7i, KP587785252 * T7j); + T7l = FNMS(KP587785252, T7i, KP951056516 * T7j); + T7g = FNMS(KP250000000, T7b, T7e); + T7h = T7f + T7g; + T7m = T7g - T7f; + ii[WS(rs, 7)] = T7h - T7k; + ii[WS(rs, 17)] = T7m - T7l; + ii[WS(rs, 22)] = T7k + T7h; + ii[WS(rs, 12)] = T7l + T7m; + } + { + E T6a, T6c, T63, T6b, T62; + T6a = FMA(KP951056516, T66, KP587785252 * T69); + T6c = FNMS(KP587785252, T66, KP951056516 * T69); + T62 = FNMS(KP250000000, T60, T5L); + T63 = T61 + T62; + T6b = T62 - T61; + ri[WS(rs, 23)] = T63 - T6a; + ri[WS(rs, 18)] = T6b + T6c; + ri[WS(rs, 8)] = T63 + T6a; + ri[WS(rs, 13)] = T6b - T6c; + } + { + E T7w, T7x, T7t, T7y, T7s; + T7w = FMA(KP951056516, T7u, KP587785252 * T7v); + T7x = FNMS(KP587785252, T7u, KP951056516 * T7v); + T7s = FNMS(KP250000000, T7p, T7q); + T7t = T7r + T7s; + T7y = T7s - T7r; + ii[WS(rs, 8)] = T7t - T7w; + ii[WS(rs, 18)] = T7y - T7x; + ii[WS(rs, 23)] = T7w + T7t; + ii[WS(rs, 13)] = T7x + T7y; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 24}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 25, "t2_25", twinstr, &GENUS, {280, 180, 160, 0}, 0, 0, 0 }; + +void X(codelet_t2_25) (planner *p) { + X(kdft_dit_register) (p, t2_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_32.c new file mode 100644 index 000000000..22d1de993 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_32.c @@ -0,0 +1,1893 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:20 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -name t2_32 -include dft/scalar/t.h */ + +/* + * This function contains 488 FP additions, 350 FP multiplications, + * (or, 236 additions, 98 multiplications, 252 fused multiply/add), + * 164 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T2, T8, T3, T6, Te, Ti, T5, T7, TJ, Tb, TM, Tc, Ts, T23, T1w; + E T19, TA, TE, T1s, T1N, T1o, T1C, T1F, T1K, T15, T11, T2F, T31, T2J, T34; + E T3f, T3z, T3j, T3C, Tw, T3M, T3Q, T1z, T2s, T2w, T1d, T3n, T3r, T26, T2T; + E T2X, Th, TR, TP, Td, Tj, TW, Tn, TS, T1U, T2b, T29, T1R, T1V, T2g; + E T1Z, T2c; + { + E Tz, T1n, T10, TD, T1r, T14, T9, T1Q, Tv, T1c; + { + E T4, T18, Ta, Tr; + T2 = W[0]; + T8 = W[4]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + T18 = T3 * T8; + Ta = T2 * T6; + Tr = T2 * T8; + Te = W[6]; + Tz = T3 * Te; + T1n = T8 * Te; + T10 = T2 * Te; + Ti = W[7]; + TD = T3 * Ti; + T1r = T8 * Ti; + T14 = T2 * Ti; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + TJ = FNMS(T5, T6, T4); + T9 = T7 * T8; + T1Q = TJ * T8; + Tb = FNMS(T5, T3, Ta); + TM = FMA(T5, T3, Ta); + Tc = W[5]; + Tv = T2 * Tc; + T1c = T3 * Tc; + Ts = FMA(T5, Tc, Tr); + T23 = FMA(T6, Tc, T18); + T1w = FNMS(T5, Tc, Tr); + T19 = FNMS(T6, Tc, T18); + } + TA = FMA(T6, Ti, Tz); + TE = FNMS(T6, Te, TD); + T1s = FNMS(Tc, Te, T1r); + T1N = FMA(T6, Te, TD); + T1o = FMA(Tc, Ti, T1n); + T1C = FMA(T5, Ti, T10); + T1F = FNMS(T5, Te, T14); + T1K = FNMS(T6, Ti, Tz); + T15 = FMA(T5, Te, T14); + T11 = FNMS(T5, Ti, T10); + { + E T2E, T2I, T2S, T2W; + T2E = T7 * Te; + T2F = FMA(Tb, Ti, T2E); + T31 = FNMS(Tb, Ti, T2E); + T2I = T7 * Ti; + T2J = FNMS(Tb, Te, T2I); + T34 = FMA(Tb, Te, T2I); + { + E T3e, T3i, T3L, T3P; + T3e = TJ * Te; + T3f = FNMS(TM, Ti, T3e); + T3z = FMA(TM, Ti, T3e); + T3i = TJ * Ti; + T3j = FMA(TM, Te, T3i); + T3C = FNMS(TM, Te, T3i); + T3L = Ts * Te; + T3P = Ts * Ti; + Tw = FNMS(T5, T8, Tv); + T3M = FMA(Tw, Ti, T3L); + T3Q = FNMS(Tw, Te, T3P); + } + { + E T2r, T2v, T3m, T3q; + T2r = T1w * Te; + T2v = T1w * Ti; + T1z = FMA(T5, T8, Tv); + T2s = FMA(T1z, Ti, T2r); + T2w = FNMS(T1z, Te, T2v); + T3m = T19 * Te; + T3q = T19 * Ti; + T1d = FMA(T6, T8, T1c); + T3n = FMA(T1d, Ti, T3m); + T3r = FNMS(T1d, Te, T3q); + } + T2S = T23 * Te; + T2W = T23 * Ti; + T26 = FNMS(T6, T8, T1c); + T2T = FMA(T26, Ti, T2S); + T2X = FNMS(T26, Te, T2W); + { + E TQ, TV, Tf, Tm, Tg; + Tg = T7 * Tc; + Th = FMA(Tb, T8, Tg); + TR = FNMS(Tb, T8, Tg); + TP = FMA(Tb, Tc, T9); + TQ = TP * Te; + TV = TP * Ti; + Td = FNMS(Tb, Tc, T9); + Tf = Td * Te; + Tm = Td * Ti; + Tj = FMA(Th, Ti, Tf); + TW = FNMS(TR, Te, TV); + Tn = FNMS(Th, Te, Tm); + TS = FMA(TR, Ti, TQ); + } + { + E T2a, T2f, T1S, T1Y, T1T; + T1T = TJ * Tc; + T1U = FMA(TM, T8, T1T); + T2b = FNMS(TM, T8, T1T); + T29 = FMA(TM, Tc, T1Q); + T2a = T29 * Te; + T2f = T29 * Ti; + T1R = FNMS(TM, Tc, T1Q); + T1S = T1R * Te; + T1Y = T1R * Ti; + T1V = FMA(T1U, Ti, T1S); + T2g = FNMS(T2b, Te, T2f); + T1Z = FNMS(T1U, Te, T1Y); + T2c = FMA(T2b, Ti, T2a); + } + } + } + { + E Tq, T46, T8H, T97, TH, T98, T4b, T8D, TZ, T7f, T4j, T6t, T1g, T7g, T4q; + E T6u, T1v, T1I, T7m, T7j, T7k, T7l, T4z, T6x, T4G, T6y, T22, T2j, T7o, T7p; + E T7q, T7r, T4O, T6A, T4V, T6B, T3G, T7L, T7I, T8n, T5E, T6P, T61, T6M, T2N; + E T7A, T7x, T8i, T55, T6I, T5s, T6F, T43, T7J, T7O, T8o, T5L, T62, T5S, T63; + E T3c, T7y, T7D, T8j, T5c, T5t, T5j, T5u; + { + E T1, T8G, Tk, Tl, To, T8E, Tp, T8F; + T1 = ri[0]; + T8G = ii[0]; + Tk = ri[WS(rs, 16)]; + Tl = Tj * Tk; + To = ii[WS(rs, 16)]; + T8E = Tj * To; + Tp = FMA(Tn, To, Tl); + Tq = T1 + Tp; + T46 = T1 - Tp; + T8F = FNMS(Tn, Tk, T8E); + T8H = T8F + T8G; + T97 = T8G - T8F; + } + { + E Tt, Tu, Tx, T47, TB, TC, TF, T49; + Tt = ri[WS(rs, 8)]; + Tu = Ts * Tt; + Tx = ii[WS(rs, 8)]; + T47 = Ts * Tx; + TB = ri[WS(rs, 24)]; + TC = TA * TB; + TF = ii[WS(rs, 24)]; + T49 = TA * TF; + { + E Ty, TG, T48, T4a; + Ty = FMA(Tw, Tx, Tu); + TG = FMA(TE, TF, TC); + TH = Ty + TG; + T98 = Ty - TG; + T48 = FNMS(Tw, Tt, T47); + T4a = FNMS(TE, TB, T49); + T4b = T48 - T4a; + T8D = T48 + T4a; + } + } + { + E TO, T4f, TY, T4h, T4d, T4i; + { + E TK, TL, TN, T4e; + TK = ri[WS(rs, 4)]; + TL = TJ * TK; + TN = ii[WS(rs, 4)]; + T4e = TJ * TN; + TO = FMA(TM, TN, TL); + T4f = FNMS(TM, TK, T4e); + } + { + E TT, TU, TX, T4g; + TT = ri[WS(rs, 20)]; + TU = TS * TT; + TX = ii[WS(rs, 20)]; + T4g = TS * TX; + TY = FMA(TW, TX, TU); + T4h = FNMS(TW, TT, T4g); + } + TZ = TO + TY; + T7f = T4f + T4h; + T4d = TO - TY; + T4i = T4f - T4h; + T4j = T4d + T4i; + T6t = T4i - T4d; + } + { + E T17, T4m, T1f, T4o, T4k, T4p; + { + E T12, T13, T16, T4l; + T12 = ri[WS(rs, 28)]; + T13 = T11 * T12; + T16 = ii[WS(rs, 28)]; + T4l = T11 * T16; + T17 = FMA(T15, T16, T13); + T4m = FNMS(T15, T12, T4l); + } + { + E T1a, T1b, T1e, T4n; + T1a = ri[WS(rs, 12)]; + T1b = T19 * T1a; + T1e = ii[WS(rs, 12)]; + T4n = T19 * T1e; + T1f = FMA(T1d, T1e, T1b); + T4o = FNMS(T1d, T1a, T4n); + } + T1g = T17 + T1f; + T7g = T4m + T4o; + T4k = T17 - T1f; + T4p = T4m - T4o; + T4q = T4k - T4p; + T6u = T4k + T4p; + } + { + E T1m, T4u, T1H, T4E, T1u, T4w, T1B, T4C; + { + E T1j, T1k, T1l, T4t; + T1j = ri[WS(rs, 2)]; + T1k = T7 * T1j; + T1l = ii[WS(rs, 2)]; + T4t = T7 * T1l; + T1m = FMA(Tb, T1l, T1k); + T4u = FNMS(Tb, T1j, T4t); + } + { + E T1D, T1E, T1G, T4D; + T1D = ri[WS(rs, 26)]; + T1E = T1C * T1D; + T1G = ii[WS(rs, 26)]; + T4D = T1C * T1G; + T1H = FMA(T1F, T1G, T1E); + T4E = FNMS(T1F, T1D, T4D); + } + { + E T1p, T1q, T1t, T4v; + T1p = ri[WS(rs, 18)]; + T1q = T1o * T1p; + T1t = ii[WS(rs, 18)]; + T4v = T1o * T1t; + T1u = FMA(T1s, T1t, T1q); + T4w = FNMS(T1s, T1p, T4v); + } + { + E T1x, T1y, T1A, T4B; + T1x = ri[WS(rs, 10)]; + T1y = T1w * T1x; + T1A = ii[WS(rs, 10)]; + T4B = T1w * T1A; + T1B = FMA(T1z, T1A, T1y); + T4C = FNMS(T1z, T1x, T4B); + } + T1v = T1m + T1u; + T1I = T1B + T1H; + T7m = T1v - T1I; + T7j = T4u + T4w; + T7k = T4C + T4E; + T7l = T7j - T7k; + { + E T4x, T4y, T4A, T4F; + T4x = T4u - T4w; + T4y = T1B - T1H; + T4z = T4x - T4y; + T6x = T4x + T4y; + T4A = T1m - T1u; + T4F = T4C - T4E; + T4G = T4A + T4F; + T6y = T4A - T4F; + } + } + { + E T1P, T4J, T2i, T4T, T21, T4L, T28, T4R; + { + E T1L, T1M, T1O, T4I; + T1L = ri[WS(rs, 30)]; + T1M = T1K * T1L; + T1O = ii[WS(rs, 30)]; + T4I = T1K * T1O; + T1P = FMA(T1N, T1O, T1M); + T4J = FNMS(T1N, T1L, T4I); + } + { + E T2d, T2e, T2h, T4S; + T2d = ri[WS(rs, 22)]; + T2e = T2c * T2d; + T2h = ii[WS(rs, 22)]; + T4S = T2c * T2h; + T2i = FMA(T2g, T2h, T2e); + T4T = FNMS(T2g, T2d, T4S); + } + { + E T1W, T1X, T20, T4K; + T1W = ri[WS(rs, 14)]; + T1X = T1V * T1W; + T20 = ii[WS(rs, 14)]; + T4K = T1V * T20; + T21 = FMA(T1Z, T20, T1X); + T4L = FNMS(T1Z, T1W, T4K); + } + { + E T24, T25, T27, T4Q; + T24 = ri[WS(rs, 6)]; + T25 = T23 * T24; + T27 = ii[WS(rs, 6)]; + T4Q = T23 * T27; + T28 = FMA(T26, T27, T25); + T4R = FNMS(T26, T24, T4Q); + } + T22 = T1P + T21; + T2j = T28 + T2i; + T7o = T22 - T2j; + T7p = T4J + T4L; + T7q = T4R + T4T; + T7r = T7p - T7q; + { + E T4M, T4N, T4P, T4U; + T4M = T4J - T4L; + T4N = T28 - T2i; + T4O = T4M - T4N; + T6A = T4M + T4N; + T4P = T1P - T21; + T4U = T4R - T4T; + T4V = T4P + T4U; + T6B = T4P - T4U; + } + } + { + E T3l, T5z, T3E, T5Z, T3t, T5B, T3y, T5X; + { + E T3g, T3h, T3k, T5y; + T3g = ri[WS(rs, 31)]; + T3h = T3f * T3g; + T3k = ii[WS(rs, 31)]; + T5y = T3f * T3k; + T3l = FMA(T3j, T3k, T3h); + T5z = FNMS(T3j, T3g, T5y); + } + { + E T3A, T3B, T3D, T5Y; + T3A = ri[WS(rs, 23)]; + T3B = T3z * T3A; + T3D = ii[WS(rs, 23)]; + T5Y = T3z * T3D; + T3E = FMA(T3C, T3D, T3B); + T5Z = FNMS(T3C, T3A, T5Y); + } + { + E T3o, T3p, T3s, T5A; + T3o = ri[WS(rs, 15)]; + T3p = T3n * T3o; + T3s = ii[WS(rs, 15)]; + T5A = T3n * T3s; + T3t = FMA(T3r, T3s, T3p); + T5B = FNMS(T3r, T3o, T5A); + } + { + E T3v, T3w, T3x, T5W; + T3v = ri[WS(rs, 7)]; + T3w = TP * T3v; + T3x = ii[WS(rs, 7)]; + T5W = TP * T3x; + T3y = FMA(TR, T3x, T3w); + T5X = FNMS(TR, T3v, T5W); + } + { + E T3u, T3F, T7G, T7H; + T3u = T3l + T3t; + T3F = T3y + T3E; + T3G = T3u + T3F; + T7L = T3u - T3F; + T7G = T5z + T5B; + T7H = T5X + T5Z; + T7I = T7G - T7H; + T8n = T7G + T7H; + } + { + E T5C, T5D, T5V, T60; + T5C = T5z - T5B; + T5D = T3y - T3E; + T5E = T5C - T5D; + T6P = T5C + T5D; + T5V = T3l - T3t; + T60 = T5X - T5Z; + T61 = T5V + T60; + T6M = T5V - T60; + } + } + { + E T2q, T50, T2L, T5q, T2y, T52, T2D, T5o; + { + E T2n, T2o, T2p, T4Z; + T2n = ri[WS(rs, 1)]; + T2o = T2 * T2n; + T2p = ii[WS(rs, 1)]; + T4Z = T2 * T2p; + T2q = FMA(T5, T2p, T2o); + T50 = FNMS(T5, T2n, T4Z); + } + { + E T2G, T2H, T2K, T5p; + T2G = ri[WS(rs, 25)]; + T2H = T2F * T2G; + T2K = ii[WS(rs, 25)]; + T5p = T2F * T2K; + T2L = FMA(T2J, T2K, T2H); + T5q = FNMS(T2J, T2G, T5p); + } + { + E T2t, T2u, T2x, T51; + T2t = ri[WS(rs, 17)]; + T2u = T2s * T2t; + T2x = ii[WS(rs, 17)]; + T51 = T2s * T2x; + T2y = FMA(T2w, T2x, T2u); + T52 = FNMS(T2w, T2t, T51); + } + { + E T2A, T2B, T2C, T5n; + T2A = ri[WS(rs, 9)]; + T2B = T8 * T2A; + T2C = ii[WS(rs, 9)]; + T5n = T8 * T2C; + T2D = FMA(Tc, T2C, T2B); + T5o = FNMS(Tc, T2A, T5n); + } + { + E T2z, T2M, T7v, T7w; + T2z = T2q + T2y; + T2M = T2D + T2L; + T2N = T2z + T2M; + T7A = T2z - T2M; + T7v = T50 + T52; + T7w = T5o + T5q; + T7x = T7v - T7w; + T8i = T7v + T7w; + } + { + E T53, T54, T5m, T5r; + T53 = T50 - T52; + T54 = T2D - T2L; + T55 = T53 - T54; + T6I = T53 + T54; + T5m = T2q - T2y; + T5r = T5o - T5q; + T5s = T5m + T5r; + T6F = T5m - T5r; + } + } + { + E T3K, T5G, T41, T5Q, T3S, T5I, T3X, T5O; + { + E T3H, T3I, T3J, T5F; + T3H = ri[WS(rs, 3)]; + T3I = T3 * T3H; + T3J = ii[WS(rs, 3)]; + T5F = T3 * T3J; + T3K = FMA(T6, T3J, T3I); + T5G = FNMS(T6, T3H, T5F); + } + { + E T3Y, T3Z, T40, T5P; + T3Y = ri[WS(rs, 11)]; + T3Z = Td * T3Y; + T40 = ii[WS(rs, 11)]; + T5P = Td * T40; + T41 = FMA(Th, T40, T3Z); + T5Q = FNMS(Th, T3Y, T5P); + } + { + E T3N, T3O, T3R, T5H; + T3N = ri[WS(rs, 19)]; + T3O = T3M * T3N; + T3R = ii[WS(rs, 19)]; + T5H = T3M * T3R; + T3S = FMA(T3Q, T3R, T3O); + T5I = FNMS(T3Q, T3N, T5H); + } + { + E T3U, T3V, T3W, T5N; + T3U = ri[WS(rs, 27)]; + T3V = Te * T3U; + T3W = ii[WS(rs, 27)]; + T5N = Te * T3W; + T3X = FMA(Ti, T3W, T3V); + T5O = FNMS(Ti, T3U, T5N); + } + { + E T3T, T42, T7M, T7N; + T3T = T3K + T3S; + T42 = T3X + T41; + T43 = T3T + T42; + T7J = T42 - T3T; + T7M = T5G + T5I; + T7N = T5O + T5Q; + T7O = T7M - T7N; + T8o = T7M + T7N; + } + { + E T5J, T5K, T5M, T5R; + T5J = T5G - T5I; + T5K = T3K - T3S; + T5L = T5J - T5K; + T62 = T5K + T5J; + T5M = T3X - T41; + T5R = T5O - T5Q; + T5S = T5M + T5R; + T63 = T5M - T5R; + } + } + { + E T2R, T57, T3a, T5h, T2Z, T59, T36, T5f; + { + E T2O, T2P, T2Q, T56; + T2O = ri[WS(rs, 5)]; + T2P = T29 * T2O; + T2Q = ii[WS(rs, 5)]; + T56 = T29 * T2Q; + T2R = FMA(T2b, T2Q, T2P); + T57 = FNMS(T2b, T2O, T56); + } + { + E T37, T38, T39, T5g; + T37 = ri[WS(rs, 13)]; + T38 = T1R * T37; + T39 = ii[WS(rs, 13)]; + T5g = T1R * T39; + T3a = FMA(T1U, T39, T38); + T5h = FNMS(T1U, T37, T5g); + } + { + E T2U, T2V, T2Y, T58; + T2U = ri[WS(rs, 21)]; + T2V = T2T * T2U; + T2Y = ii[WS(rs, 21)]; + T58 = T2T * T2Y; + T2Z = FMA(T2X, T2Y, T2V); + T59 = FNMS(T2X, T2U, T58); + } + { + E T32, T33, T35, T5e; + T32 = ri[WS(rs, 29)]; + T33 = T31 * T32; + T35 = ii[WS(rs, 29)]; + T5e = T31 * T35; + T36 = FMA(T34, T35, T33); + T5f = FNMS(T34, T32, T5e); + } + { + E T30, T3b, T7B, T7C; + T30 = T2R + T2Z; + T3b = T36 + T3a; + T3c = T30 + T3b; + T7y = T3b - T30; + T7B = T57 + T59; + T7C = T5f + T5h; + T7D = T7B - T7C; + T8j = T7B + T7C; + } + { + E T5a, T5b, T5d, T5i; + T5a = T57 - T59; + T5b = T2R - T2Z; + T5c = T5a - T5b; + T5t = T5b + T5a; + T5d = T36 - T3a; + T5i = T5f - T5h; + T5j = T5d + T5i; + T5u = T5d - T5i; + } + } + { + E T1i, T8c, T8z, T8A, T8J, T8O, T2l, T8N, T45, T8L, T8l, T8t, T8q, T8u, T8f; + E T8B; + { + E TI, T1h, T8x, T8y; + TI = Tq + TH; + T1h = TZ + T1g; + T1i = TI + T1h; + T8c = TI - T1h; + T8x = T8i + T8j; + T8y = T8n + T8o; + T8z = T8x - T8y; + T8A = T8x + T8y; + } + { + E T8C, T8I, T1J, T2k; + T8C = T7f + T7g; + T8I = T8D + T8H; + T8J = T8C + T8I; + T8O = T8I - T8C; + T1J = T1v + T1I; + T2k = T22 + T2j; + T2l = T1J + T2k; + T8N = T2k - T1J; + } + { + E T3d, T44, T8h, T8k; + T3d = T2N + T3c; + T44 = T3G + T43; + T45 = T3d + T44; + T8L = T44 - T3d; + T8h = T2N - T3c; + T8k = T8i - T8j; + T8l = T8h + T8k; + T8t = T8k - T8h; + } + { + E T8m, T8p, T8d, T8e; + T8m = T3G - T43; + T8p = T8n - T8o; + T8q = T8m - T8p; + T8u = T8m + T8p; + T8d = T7j + T7k; + T8e = T7p + T7q; + T8f = T8d - T8e; + T8B = T8d + T8e; + } + { + E T2m, T8K, T8w, T8M; + T2m = T1i + T2l; + ri[WS(rs, 16)] = T2m - T45; + ri[0] = T2m + T45; + T8K = T8B + T8J; + ii[0] = T8A + T8K; + ii[WS(rs, 16)] = T8K - T8A; + T8w = T1i - T2l; + ri[WS(rs, 24)] = T8w - T8z; + ri[WS(rs, 8)] = T8w + T8z; + T8M = T8J - T8B; + ii[WS(rs, 8)] = T8L + T8M; + ii[WS(rs, 24)] = T8M - T8L; + } + { + E T8g, T8r, T8P, T8Q; + T8g = T8c + T8f; + T8r = T8l + T8q; + ri[WS(rs, 20)] = FNMS(KP707106781, T8r, T8g); + ri[WS(rs, 4)] = FMA(KP707106781, T8r, T8g); + T8P = T8N + T8O; + T8Q = T8t + T8u; + ii[WS(rs, 4)] = FMA(KP707106781, T8Q, T8P); + ii[WS(rs, 20)] = FNMS(KP707106781, T8Q, T8P); + } + { + E T8s, T8v, T8R, T8S; + T8s = T8c - T8f; + T8v = T8t - T8u; + ri[WS(rs, 28)] = FNMS(KP707106781, T8v, T8s); + ri[WS(rs, 12)] = FMA(KP707106781, T8v, T8s); + T8R = T8O - T8N; + T8S = T8q - T8l; + ii[WS(rs, 12)] = FMA(KP707106781, T8S, T8R); + ii[WS(rs, 28)] = FNMS(KP707106781, T8S, T8R); + } + } + { + E T7i, T7W, T86, T8a, T8V, T91, T7t, T8W, T7F, T7T, T7Z, T92, T83, T89, T7Q; + E T7U; + { + E T7e, T7h, T84, T85; + T7e = Tq - TH; + T7h = T7f - T7g; + T7i = T7e - T7h; + T7W = T7e + T7h; + T84 = T7L + T7O; + T85 = T7I + T7J; + T86 = FNMS(KP414213562, T85, T84); + T8a = FMA(KP414213562, T84, T85); + } + { + E T8T, T8U, T7n, T7s; + T8T = T1g - TZ; + T8U = T8H - T8D; + T8V = T8T + T8U; + T91 = T8U - T8T; + T7n = T7l - T7m; + T7s = T7o + T7r; + T7t = T7n - T7s; + T8W = T7n + T7s; + } + { + E T7z, T7E, T7X, T7Y; + T7z = T7x - T7y; + T7E = T7A - T7D; + T7F = FMA(KP414213562, T7E, T7z); + T7T = FNMS(KP414213562, T7z, T7E); + T7X = T7m + T7l; + T7Y = T7o - T7r; + T7Z = T7X + T7Y; + T92 = T7Y - T7X; + } + { + E T81, T82, T7K, T7P; + T81 = T7A + T7D; + T82 = T7x + T7y; + T83 = FMA(KP414213562, T82, T81); + T89 = FNMS(KP414213562, T81, T82); + T7K = T7I - T7J; + T7P = T7L - T7O; + T7Q = FNMS(KP414213562, T7P, T7K); + T7U = FMA(KP414213562, T7K, T7P); + } + { + E T7u, T7R, T93, T94; + T7u = FMA(KP707106781, T7t, T7i); + T7R = T7F - T7Q; + ri[WS(rs, 22)] = FNMS(KP923879532, T7R, T7u); + ri[WS(rs, 6)] = FMA(KP923879532, T7R, T7u); + T93 = FMA(KP707106781, T92, T91); + T94 = T7U - T7T; + ii[WS(rs, 6)] = FMA(KP923879532, T94, T93); + ii[WS(rs, 22)] = FNMS(KP923879532, T94, T93); + } + { + E T7S, T7V, T95, T96; + T7S = FNMS(KP707106781, T7t, T7i); + T7V = T7T + T7U; + ri[WS(rs, 14)] = FNMS(KP923879532, T7V, T7S); + ri[WS(rs, 30)] = FMA(KP923879532, T7V, T7S); + T95 = FNMS(KP707106781, T92, T91); + T96 = T7F + T7Q; + ii[WS(rs, 14)] = FNMS(KP923879532, T96, T95); + ii[WS(rs, 30)] = FMA(KP923879532, T96, T95); + } + { + E T80, T87, T8X, T8Y; + T80 = FMA(KP707106781, T7Z, T7W); + T87 = T83 + T86; + ri[WS(rs, 18)] = FNMS(KP923879532, T87, T80); + ri[WS(rs, 2)] = FMA(KP923879532, T87, T80); + T8X = FMA(KP707106781, T8W, T8V); + T8Y = T89 + T8a; + ii[WS(rs, 2)] = FMA(KP923879532, T8Y, T8X); + ii[WS(rs, 18)] = FNMS(KP923879532, T8Y, T8X); + } + { + E T88, T8b, T8Z, T90; + T88 = FNMS(KP707106781, T7Z, T7W); + T8b = T89 - T8a; + ri[WS(rs, 26)] = FNMS(KP923879532, T8b, T88); + ri[WS(rs, 10)] = FMA(KP923879532, T8b, T88); + T8Z = FNMS(KP707106781, T8W, T8V); + T90 = T86 - T83; + ii[WS(rs, 10)] = FMA(KP923879532, T90, T8Z); + ii[WS(rs, 26)] = FNMS(KP923879532, T90, T8Z); + } + } + { + E T4s, T6c, T4X, T9c, T9b, T9h, T6f, T9i, T66, T6q, T6a, T6m, T5x, T6p, T69; + E T6j; + { + E T4c, T4r, T6d, T6e; + T4c = T46 + T4b; + T4r = T4j + T4q; + T4s = FNMS(KP707106781, T4r, T4c); + T6c = FMA(KP707106781, T4r, T4c); + { + E T4H, T4W, T99, T9a; + T4H = FNMS(KP414213562, T4G, T4z); + T4W = FMA(KP414213562, T4V, T4O); + T4X = T4H - T4W; + T9c = T4H + T4W; + T99 = T97 - T98; + T9a = T6t + T6u; + T9b = FMA(KP707106781, T9a, T99); + T9h = FNMS(KP707106781, T9a, T99); + } + T6d = FMA(KP414213562, T4z, T4G); + T6e = FNMS(KP414213562, T4O, T4V); + T6f = T6d + T6e; + T9i = T6e - T6d; + { + E T5U, T6l, T65, T6k, T5T, T64; + T5T = T5L + T5S; + T5U = FNMS(KP707106781, T5T, T5E); + T6l = FMA(KP707106781, T5T, T5E); + T64 = T62 + T63; + T65 = FNMS(KP707106781, T64, T61); + T6k = FMA(KP707106781, T64, T61); + T66 = FNMS(KP668178637, T65, T5U); + T6q = FMA(KP198912367, T6k, T6l); + T6a = FMA(KP668178637, T5U, T65); + T6m = FNMS(KP198912367, T6l, T6k); + } + { + E T5l, T6i, T5w, T6h, T5k, T5v; + T5k = T5c + T5j; + T5l = FNMS(KP707106781, T5k, T55); + T6i = FMA(KP707106781, T5k, T55); + T5v = T5t + T5u; + T5w = FNMS(KP707106781, T5v, T5s); + T6h = FMA(KP707106781, T5v, T5s); + T5x = FMA(KP668178637, T5w, T5l); + T6p = FNMS(KP198912367, T6h, T6i); + T69 = FNMS(KP668178637, T5l, T5w); + T6j = FMA(KP198912367, T6i, T6h); + } + } + { + E T4Y, T67, T9j, T9k; + T4Y = FMA(KP923879532, T4X, T4s); + T67 = T5x - T66; + ri[WS(rs, 21)] = FNMS(KP831469612, T67, T4Y); + ri[WS(rs, 5)] = FMA(KP831469612, T67, T4Y); + T9j = FMA(KP923879532, T9i, T9h); + T9k = T6a - T69; + ii[WS(rs, 5)] = FMA(KP831469612, T9k, T9j); + ii[WS(rs, 21)] = FNMS(KP831469612, T9k, T9j); + } + { + E T68, T6b, T9l, T9m; + T68 = FNMS(KP923879532, T4X, T4s); + T6b = T69 + T6a; + ri[WS(rs, 13)] = FNMS(KP831469612, T6b, T68); + ri[WS(rs, 29)] = FMA(KP831469612, T6b, T68); + T9l = FNMS(KP923879532, T9i, T9h); + T9m = T5x + T66; + ii[WS(rs, 13)] = FNMS(KP831469612, T9m, T9l); + ii[WS(rs, 29)] = FMA(KP831469612, T9m, T9l); + } + { + E T6g, T6n, T9d, T9e; + T6g = FMA(KP923879532, T6f, T6c); + T6n = T6j + T6m; + ri[WS(rs, 17)] = FNMS(KP980785280, T6n, T6g); + ri[WS(rs, 1)] = FMA(KP980785280, T6n, T6g); + T9d = FMA(KP923879532, T9c, T9b); + T9e = T6p + T6q; + ii[WS(rs, 1)] = FMA(KP980785280, T9e, T9d); + ii[WS(rs, 17)] = FNMS(KP980785280, T9e, T9d); + } + { + E T6o, T6r, T9f, T9g; + T6o = FNMS(KP923879532, T6f, T6c); + T6r = T6p - T6q; + ri[WS(rs, 25)] = FNMS(KP980785280, T6r, T6o); + ri[WS(rs, 9)] = FMA(KP980785280, T6r, T6o); + T9f = FNMS(KP923879532, T9c, T9b); + T9g = T6m - T6j; + ii[WS(rs, 9)] = FMA(KP980785280, T9g, T9f); + ii[WS(rs, 25)] = FNMS(KP980785280, T9g, T9f); + } + } + { + E T6w, T6Y, T6D, T9w, T9p, T9v, T71, T9q, T6S, T7c, T6W, T78, T6L, T7b, T6V; + E T75; + { + E T6s, T6v, T6Z, T70; + T6s = T46 - T4b; + T6v = T6t - T6u; + T6w = FMA(KP707106781, T6v, T6s); + T6Y = FNMS(KP707106781, T6v, T6s); + { + E T6z, T6C, T9n, T9o; + T6z = FMA(KP414213562, T6y, T6x); + T6C = FNMS(KP414213562, T6B, T6A); + T6D = T6z - T6C; + T9w = T6z + T6C; + T9n = T98 + T97; + T9o = T4q - T4j; + T9p = FMA(KP707106781, T9o, T9n); + T9v = FNMS(KP707106781, T9o, T9n); + } + T6Z = FNMS(KP414213562, T6x, T6y); + T70 = FMA(KP414213562, T6A, T6B); + T71 = T6Z + T70; + T9q = T70 - T6Z; + { + E T6O, T77, T6R, T76, T6N, T6Q; + T6N = T5S - T5L; + T6O = FNMS(KP707106781, T6N, T6M); + T77 = FMA(KP707106781, T6N, T6M); + T6Q = T62 - T63; + T6R = FNMS(KP707106781, T6Q, T6P); + T76 = FMA(KP707106781, T6Q, T6P); + T6S = FNMS(KP668178637, T6R, T6O); + T7c = FMA(KP198912367, T76, T77); + T6W = FMA(KP668178637, T6O, T6R); + T78 = FNMS(KP198912367, T77, T76); + } + { + E T6H, T74, T6K, T73, T6G, T6J; + T6G = T5j - T5c; + T6H = FNMS(KP707106781, T6G, T6F); + T74 = FMA(KP707106781, T6G, T6F); + T6J = T5t - T5u; + T6K = FNMS(KP707106781, T6J, T6I); + T73 = FMA(KP707106781, T6J, T6I); + T6L = FMA(KP668178637, T6K, T6H); + T7b = FNMS(KP198912367, T73, T74); + T6V = FNMS(KP668178637, T6H, T6K); + T75 = FMA(KP198912367, T74, T73); + } + } + { + E T6E, T6T, T9r, T9s; + T6E = FMA(KP923879532, T6D, T6w); + T6T = T6L + T6S; + ri[WS(rs, 19)] = FNMS(KP831469612, T6T, T6E); + ri[WS(rs, 3)] = FMA(KP831469612, T6T, T6E); + T9r = FMA(KP923879532, T9q, T9p); + T9s = T6V + T6W; + ii[WS(rs, 3)] = FMA(KP831469612, T9s, T9r); + ii[WS(rs, 19)] = FNMS(KP831469612, T9s, T9r); + } + { + E T6U, T6X, T9t, T9u; + T6U = FNMS(KP923879532, T6D, T6w); + T6X = T6V - T6W; + ri[WS(rs, 27)] = FNMS(KP831469612, T6X, T6U); + ri[WS(rs, 11)] = FMA(KP831469612, T6X, T6U); + T9t = FNMS(KP923879532, T9q, T9p); + T9u = T6S - T6L; + ii[WS(rs, 11)] = FMA(KP831469612, T9u, T9t); + ii[WS(rs, 27)] = FNMS(KP831469612, T9u, T9t); + } + { + E T72, T79, T9x, T9y; + T72 = FNMS(KP923879532, T71, T6Y); + T79 = T75 - T78; + ri[WS(rs, 23)] = FNMS(KP980785280, T79, T72); + ri[WS(rs, 7)] = FMA(KP980785280, T79, T72); + T9x = FNMS(KP923879532, T9w, T9v); + T9y = T7c - T7b; + ii[WS(rs, 7)] = FMA(KP980785280, T9y, T9x); + ii[WS(rs, 23)] = FNMS(KP980785280, T9y, T9x); + } + { + E T7a, T7d, T9z, T9A; + T7a = FMA(KP923879532, T71, T6Y); + T7d = T7b + T7c; + ri[WS(rs, 15)] = FNMS(KP980785280, T7d, T7a); + ri[WS(rs, 31)] = FMA(KP980785280, T7d, T7a); + T9z = FMA(KP923879532, T9w, T9v); + T9A = T75 + T78; + ii[WS(rs, 15)] = FNMS(KP980785280, T9A, T9z); + ii[WS(rs, 31)] = FMA(KP980785280, T9A, T9z); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 27}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 32, "t2_32", twinstr, &GENUS, {236, 98, 252, 0}, 0, 0, 0 }; + +void X(codelet_t2_32) (planner *p) { + X(kdft_dit_register) (p, t2_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -name t2_32 -include dft/scalar/t.h */ + +/* + * This function contains 488 FP additions, 280 FP multiplications, + * (or, 376 additions, 168 multiplications, 112 fused multiply/add), + * 158 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T2, T5, T3, T6, T8, TM, TO, Td, T9, Te, Th, Tl, TD, TH, T1y; + E T1H, T15, T1A, T11, T1F, T1n, T1p, T2q, T2I, T2u, T2K, T2V, T3b, T2Z, T3d; + E Tu, Ty, T3l, T3n, T1t, T1v, T2f, T2h, T1a, T1e, T32, T34, T1W, T1Y, T2C; + E T2E, Tg, TR, Tk, TS, Tm, TV, To, TT, T1M, T21, T1P, T22, T1Q, T25; + E T1S, T23; + { + E Ts, T1d, Tx, T18, Tt, T1c, Tw, T19, TB, T14, TG, TZ, TC, T13, TF; + E T10; + { + E T4, Tc, T7, Tb; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tc = T5 * T3; + T7 = T5 * T6; + Tb = T2 * T6; + T8 = T4 + T7; + TM = T4 - T7; + TO = Tb + Tc; + Td = Tb - Tc; + T9 = W[4]; + Ts = T2 * T9; + T1d = T6 * T9; + Tx = T5 * T9; + T18 = T3 * T9; + Te = W[5]; + Tt = T5 * Te; + T1c = T3 * Te; + Tw = T2 * Te; + T19 = T6 * Te; + Th = W[6]; + TB = T3 * Th; + T14 = T5 * Th; + TG = T6 * Th; + TZ = T2 * Th; + Tl = W[7]; + TC = T6 * Tl; + T13 = T2 * Tl; + TF = T3 * Tl; + T10 = T5 * Tl; + } + TD = TB + TC; + TH = TF - TG; + T1y = TZ + T10; + T1H = TF + TG; + T15 = T13 + T14; + T1A = T13 - T14; + T11 = TZ - T10; + T1F = TB - TC; + T1n = FMA(T9, Th, Te * Tl); + T1p = FNMS(Te, Th, T9 * Tl); + { + E T2o, T2p, T2s, T2t; + T2o = T8 * Th; + T2p = Td * Tl; + T2q = T2o + T2p; + T2I = T2o - T2p; + T2s = T8 * Tl; + T2t = Td * Th; + T2u = T2s - T2t; + T2K = T2s + T2t; + } + { + E T2T, T2U, T2X, T2Y; + T2T = TM * Th; + T2U = TO * Tl; + T2V = T2T - T2U; + T3b = T2T + T2U; + T2X = TM * Tl; + T2Y = TO * Th; + T2Z = T2X + T2Y; + T3d = T2X - T2Y; + Tu = Ts + Tt; + Ty = Tw - Tx; + T3l = FMA(Tu, Th, Ty * Tl); + T3n = FNMS(Ty, Th, Tu * Tl); + } + T1t = Ts - Tt; + T1v = Tw + Tx; + T2f = FMA(T1t, Th, T1v * Tl); + T2h = FNMS(T1v, Th, T1t * Tl); + T1a = T18 - T19; + T1e = T1c + T1d; + T32 = FMA(T1a, Th, T1e * Tl); + T34 = FNMS(T1e, Th, T1a * Tl); + T1W = T18 + T19; + T1Y = T1c - T1d; + T2C = FMA(T1W, Th, T1Y * Tl); + T2E = FNMS(T1Y, Th, T1W * Tl); + { + E Ta, Tf, Ti, Tj; + Ta = T8 * T9; + Tf = Td * Te; + Tg = Ta - Tf; + TR = Ta + Tf; + Ti = T8 * Te; + Tj = Td * T9; + Tk = Ti + Tj; + TS = Ti - Tj; + } + Tm = FMA(Tg, Th, Tk * Tl); + TV = FNMS(TS, Th, TR * Tl); + To = FNMS(Tk, Th, Tg * Tl); + TT = FMA(TR, Th, TS * Tl); + { + E T1K, T1L, T1N, T1O; + T1K = TM * T9; + T1L = TO * Te; + T1M = T1K - T1L; + T21 = T1K + T1L; + T1N = TM * Te; + T1O = TO * T9; + T1P = T1N + T1O; + T22 = T1N - T1O; + } + T1Q = FMA(T1M, Th, T1P * Tl); + T25 = FNMS(T22, Th, T21 * Tl); + T1S = FNMS(T1P, Th, T1M * Tl); + T23 = FMA(T21, Th, T22 * Tl); + } + { + E TL, T6f, T8c, T8q, T3F, T5t, T7I, T7W, T2y, T6B, T6y, T7j, T4k, T5J, T4B; + E T5G, T3h, T6H, T6O, T7o, T4L, T5N, T52, T5Q, T1i, T7V, T6i, T7D, T3K, T5u; + E T3P, T5v, T1E, T6n, T6m, T7e, T3W, T5y, T41, T5z, T29, T6p, T6s, T7f, T47; + E T5B, T4c, T5C, T2R, T6z, T6E, T7k, T4v, T5H, T4E, T5K, T3y, T6P, T6K, T7p; + E T4W, T5R, T55, T5O; + { + E T1, T7G, Tq, T7F, TA, T3C, TJ, T3D, Tn, Tp; + T1 = ri[0]; + T7G = ii[0]; + Tn = ri[WS(rs, 16)]; + Tp = ii[WS(rs, 16)]; + Tq = FMA(Tm, Tn, To * Tp); + T7F = FNMS(To, Tn, Tm * Tp); + { + E Tv, Tz, TE, TI; + Tv = ri[WS(rs, 8)]; + Tz = ii[WS(rs, 8)]; + TA = FMA(Tu, Tv, Ty * Tz); + T3C = FNMS(Ty, Tv, Tu * Tz); + TE = ri[WS(rs, 24)]; + TI = ii[WS(rs, 24)]; + TJ = FMA(TD, TE, TH * TI); + T3D = FNMS(TH, TE, TD * TI); + } + { + E Tr, TK, T8a, T8b; + Tr = T1 + Tq; + TK = TA + TJ; + TL = Tr + TK; + T6f = Tr - TK; + T8a = T7G - T7F; + T8b = TA - TJ; + T8c = T8a - T8b; + T8q = T8b + T8a; + } + { + E T3B, T3E, T7E, T7H; + T3B = T1 - Tq; + T3E = T3C - T3D; + T3F = T3B - T3E; + T5t = T3B + T3E; + T7E = T3C + T3D; + T7H = T7F + T7G; + T7I = T7E + T7H; + T7W = T7H - T7E; + } + } + { + E T2e, T4g, T2w, T4z, T2j, T4h, T2n, T4y; + { + E T2c, T2d, T2r, T2v; + T2c = ri[WS(rs, 1)]; + T2d = ii[WS(rs, 1)]; + T2e = FMA(T2, T2c, T5 * T2d); + T4g = FNMS(T5, T2c, T2 * T2d); + T2r = ri[WS(rs, 25)]; + T2v = ii[WS(rs, 25)]; + T2w = FMA(T2q, T2r, T2u * T2v); + T4z = FNMS(T2u, T2r, T2q * T2v); + } + { + E T2g, T2i, T2l, T2m; + T2g = ri[WS(rs, 17)]; + T2i = ii[WS(rs, 17)]; + T2j = FMA(T2f, T2g, T2h * T2i); + T4h = FNMS(T2h, T2g, T2f * T2i); + T2l = ri[WS(rs, 9)]; + T2m = ii[WS(rs, 9)]; + T2n = FMA(T9, T2l, Te * T2m); + T4y = FNMS(Te, T2l, T9 * T2m); + } + { + E T2k, T2x, T6w, T6x; + T2k = T2e + T2j; + T2x = T2n + T2w; + T2y = T2k + T2x; + T6B = T2k - T2x; + T6w = T4g + T4h; + T6x = T4y + T4z; + T6y = T6w - T6x; + T7j = T6w + T6x; + } + { + E T4i, T4j, T4x, T4A; + T4i = T4g - T4h; + T4j = T2n - T2w; + T4k = T4i + T4j; + T5J = T4i - T4j; + T4x = T2e - T2j; + T4A = T4y - T4z; + T4B = T4x - T4A; + T5G = T4x + T4A; + } + } + { + E T31, T4Y, T3f, T4J, T36, T4Z, T3a, T4I; + { + E T2W, T30, T3c, T3e; + T2W = ri[WS(rs, 31)]; + T30 = ii[WS(rs, 31)]; + T31 = FMA(T2V, T2W, T2Z * T30); + T4Y = FNMS(T2Z, T2W, T2V * T30); + T3c = ri[WS(rs, 23)]; + T3e = ii[WS(rs, 23)]; + T3f = FMA(T3b, T3c, T3d * T3e); + T4J = FNMS(T3d, T3c, T3b * T3e); + } + { + E T33, T35, T38, T39; + T33 = ri[WS(rs, 15)]; + T35 = ii[WS(rs, 15)]; + T36 = FMA(T32, T33, T34 * T35); + T4Z = FNMS(T34, T33, T32 * T35); + T38 = ri[WS(rs, 7)]; + T39 = ii[WS(rs, 7)]; + T3a = FMA(TR, T38, TS * T39); + T4I = FNMS(TS, T38, TR * T39); + } + { + E T37, T3g, T6M, T6N; + T37 = T31 + T36; + T3g = T3a + T3f; + T3h = T37 + T3g; + T6H = T37 - T3g; + T6M = T4Y + T4Z; + T6N = T4I + T4J; + T6O = T6M - T6N; + T7o = T6M + T6N; + } + { + E T4H, T4K, T50, T51; + T4H = T31 - T36; + T4K = T4I - T4J; + T4L = T4H - T4K; + T5N = T4H + T4K; + T50 = T4Y - T4Z; + T51 = T3a - T3f; + T52 = T50 + T51; + T5Q = T50 - T51; + } + } + { + E TQ, T3G, T1g, T3N, TX, T3H, T17, T3M; + { + E TN, TP, T1b, T1f; + TN = ri[WS(rs, 4)]; + TP = ii[WS(rs, 4)]; + TQ = FMA(TM, TN, TO * TP); + T3G = FNMS(TO, TN, TM * TP); + T1b = ri[WS(rs, 12)]; + T1f = ii[WS(rs, 12)]; + T1g = FMA(T1a, T1b, T1e * T1f); + T3N = FNMS(T1e, T1b, T1a * T1f); + } + { + E TU, TW, T12, T16; + TU = ri[WS(rs, 20)]; + TW = ii[WS(rs, 20)]; + TX = FMA(TT, TU, TV * TW); + T3H = FNMS(TV, TU, TT * TW); + T12 = ri[WS(rs, 28)]; + T16 = ii[WS(rs, 28)]; + T17 = FMA(T11, T12, T15 * T16); + T3M = FNMS(T15, T12, T11 * T16); + } + { + E TY, T1h, T6g, T6h; + TY = TQ + TX; + T1h = T17 + T1g; + T1i = TY + T1h; + T7V = T1h - TY; + T6g = T3G + T3H; + T6h = T3M + T3N; + T6i = T6g - T6h; + T7D = T6g + T6h; + } + { + E T3I, T3J, T3L, T3O; + T3I = T3G - T3H; + T3J = TQ - TX; + T3K = T3I - T3J; + T5u = T3J + T3I; + T3L = T17 - T1g; + T3O = T3M - T3N; + T3P = T3L + T3O; + T5v = T3L - T3O; + } + } + { + E T1m, T3S, T1C, T3Z, T1r, T3T, T1x, T3Y; + { + E T1k, T1l, T1z, T1B; + T1k = ri[WS(rs, 2)]; + T1l = ii[WS(rs, 2)]; + T1m = FMA(T8, T1k, Td * T1l); + T3S = FNMS(Td, T1k, T8 * T1l); + T1z = ri[WS(rs, 26)]; + T1B = ii[WS(rs, 26)]; + T1C = FMA(T1y, T1z, T1A * T1B); + T3Z = FNMS(T1A, T1z, T1y * T1B); + } + { + E T1o, T1q, T1u, T1w; + T1o = ri[WS(rs, 18)]; + T1q = ii[WS(rs, 18)]; + T1r = FMA(T1n, T1o, T1p * T1q); + T3T = FNMS(T1p, T1o, T1n * T1q); + T1u = ri[WS(rs, 10)]; + T1w = ii[WS(rs, 10)]; + T1x = FMA(T1t, T1u, T1v * T1w); + T3Y = FNMS(T1v, T1u, T1t * T1w); + } + { + E T1s, T1D, T6k, T6l; + T1s = T1m + T1r; + T1D = T1x + T1C; + T1E = T1s + T1D; + T6n = T1s - T1D; + T6k = T3S + T3T; + T6l = T3Y + T3Z; + T6m = T6k - T6l; + T7e = T6k + T6l; + } + { + E T3U, T3V, T3X, T40; + T3U = T3S - T3T; + T3V = T1x - T1C; + T3W = T3U + T3V; + T5y = T3U - T3V; + T3X = T1m - T1r; + T40 = T3Y - T3Z; + T41 = T3X - T40; + T5z = T3X + T40; + } + } + { + E T1J, T43, T27, T4a, T1U, T44, T20, T49; + { + E T1G, T1I, T24, T26; + T1G = ri[WS(rs, 30)]; + T1I = ii[WS(rs, 30)]; + T1J = FMA(T1F, T1G, T1H * T1I); + T43 = FNMS(T1H, T1G, T1F * T1I); + T24 = ri[WS(rs, 22)]; + T26 = ii[WS(rs, 22)]; + T27 = FMA(T23, T24, T25 * T26); + T4a = FNMS(T25, T24, T23 * T26); + } + { + E T1R, T1T, T1X, T1Z; + T1R = ri[WS(rs, 14)]; + T1T = ii[WS(rs, 14)]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T44 = FNMS(T1S, T1R, T1Q * T1T); + T1X = ri[WS(rs, 6)]; + T1Z = ii[WS(rs, 6)]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T49 = FNMS(T1Y, T1X, T1W * T1Z); + } + { + E T1V, T28, T6q, T6r; + T1V = T1J + T1U; + T28 = T20 + T27; + T29 = T1V + T28; + T6p = T1V - T28; + T6q = T43 + T44; + T6r = T49 + T4a; + T6s = T6q - T6r; + T7f = T6q + T6r; + } + { + E T45, T46, T48, T4b; + T45 = T43 - T44; + T46 = T20 - T27; + T47 = T45 + T46; + T5B = T45 - T46; + T48 = T1J - T1U; + T4b = T49 - T4a; + T4c = T48 - T4b; + T5C = T48 + T4b; + } + } + { + E T2B, T4r, T2G, T4s, T4q, T4t, T2M, T4m, T2P, T4n, T4l, T4o; + { + E T2z, T2A, T2D, T2F; + T2z = ri[WS(rs, 5)]; + T2A = ii[WS(rs, 5)]; + T2B = FMA(T21, T2z, T22 * T2A); + T4r = FNMS(T22, T2z, T21 * T2A); + T2D = ri[WS(rs, 21)]; + T2F = ii[WS(rs, 21)]; + T2G = FMA(T2C, T2D, T2E * T2F); + T4s = FNMS(T2E, T2D, T2C * T2F); + } + T4q = T2B - T2G; + T4t = T4r - T4s; + { + E T2J, T2L, T2N, T2O; + T2J = ri[WS(rs, 29)]; + T2L = ii[WS(rs, 29)]; + T2M = FMA(T2I, T2J, T2K * T2L); + T4m = FNMS(T2K, T2J, T2I * T2L); + T2N = ri[WS(rs, 13)]; + T2O = ii[WS(rs, 13)]; + T2P = FMA(T1M, T2N, T1P * T2O); + T4n = FNMS(T1P, T2N, T1M * T2O); + } + T4l = T2M - T2P; + T4o = T4m - T4n; + { + E T2H, T2Q, T6C, T6D; + T2H = T2B + T2G; + T2Q = T2M + T2P; + T2R = T2H + T2Q; + T6z = T2Q - T2H; + T6C = T4r + T4s; + T6D = T4m + T4n; + T6E = T6C - T6D; + T7k = T6C + T6D; + } + { + E T4p, T4u, T4C, T4D; + T4p = T4l - T4o; + T4u = T4q + T4t; + T4v = KP707106781 * (T4p - T4u); + T5H = KP707106781 * (T4u + T4p); + T4C = T4t - T4q; + T4D = T4l + T4o; + T4E = KP707106781 * (T4C - T4D); + T5K = KP707106781 * (T4C + T4D); + } + } + { + E T3k, T4M, T3p, T4N, T4O, T4P, T3t, T4S, T3w, T4T, T4R, T4U; + { + E T3i, T3j, T3m, T3o; + T3i = ri[WS(rs, 3)]; + T3j = ii[WS(rs, 3)]; + T3k = FMA(T3, T3i, T6 * T3j); + T4M = FNMS(T6, T3i, T3 * T3j); + T3m = ri[WS(rs, 19)]; + T3o = ii[WS(rs, 19)]; + T3p = FMA(T3l, T3m, T3n * T3o); + T4N = FNMS(T3n, T3m, T3l * T3o); + } + T4O = T4M - T4N; + T4P = T3k - T3p; + { + E T3r, T3s, T3u, T3v; + T3r = ri[WS(rs, 27)]; + T3s = ii[WS(rs, 27)]; + T3t = FMA(Th, T3r, Tl * T3s); + T4S = FNMS(Tl, T3r, Th * T3s); + T3u = ri[WS(rs, 11)]; + T3v = ii[WS(rs, 11)]; + T3w = FMA(Tg, T3u, Tk * T3v); + T4T = FNMS(Tk, T3u, Tg * T3v); + } + T4R = T3t - T3w; + T4U = T4S - T4T; + { + E T3q, T3x, T6I, T6J; + T3q = T3k + T3p; + T3x = T3t + T3w; + T3y = T3q + T3x; + T6P = T3x - T3q; + T6I = T4M + T4N; + T6J = T4S + T4T; + T6K = T6I - T6J; + T7p = T6I + T6J; + } + { + E T4Q, T4V, T53, T54; + T4Q = T4O - T4P; + T4V = T4R + T4U; + T4W = KP707106781 * (T4Q - T4V); + T5R = KP707106781 * (T4Q + T4V); + T53 = T4R - T4U; + T54 = T4P + T4O; + T55 = KP707106781 * (T53 - T54); + T5O = KP707106781 * (T54 + T53); + } + } + { + E T2b, T7x, T7K, T7M, T3A, T7L, T7A, T7B; + { + E T1j, T2a, T7C, T7J; + T1j = TL + T1i; + T2a = T1E + T29; + T2b = T1j + T2a; + T7x = T1j - T2a; + T7C = T7e + T7f; + T7J = T7D + T7I; + T7K = T7C + T7J; + T7M = T7J - T7C; + } + { + E T2S, T3z, T7y, T7z; + T2S = T2y + T2R; + T3z = T3h + T3y; + T3A = T2S + T3z; + T7L = T3z - T2S; + T7y = T7j + T7k; + T7z = T7o + T7p; + T7A = T7y - T7z; + T7B = T7y + T7z; + } + ri[WS(rs, 16)] = T2b - T3A; + ii[WS(rs, 16)] = T7K - T7B; + ri[0] = T2b + T3A; + ii[0] = T7B + T7K; + ri[WS(rs, 24)] = T7x - T7A; + ii[WS(rs, 24)] = T7M - T7L; + ri[WS(rs, 8)] = T7x + T7A; + ii[WS(rs, 8)] = T7L + T7M; + } + { + E T7h, T7t, T7Q, T7S, T7m, T7u, T7r, T7v; + { + E T7d, T7g, T7O, T7P; + T7d = TL - T1i; + T7g = T7e - T7f; + T7h = T7d + T7g; + T7t = T7d - T7g; + T7O = T29 - T1E; + T7P = T7I - T7D; + T7Q = T7O + T7P; + T7S = T7P - T7O; + } + { + E T7i, T7l, T7n, T7q; + T7i = T2y - T2R; + T7l = T7j - T7k; + T7m = T7i + T7l; + T7u = T7l - T7i; + T7n = T3h - T3y; + T7q = T7o - T7p; + T7r = T7n - T7q; + T7v = T7n + T7q; + } + { + E T7s, T7N, T7w, T7R; + T7s = KP707106781 * (T7m + T7r); + ri[WS(rs, 20)] = T7h - T7s; + ri[WS(rs, 4)] = T7h + T7s; + T7N = KP707106781 * (T7u + T7v); + ii[WS(rs, 4)] = T7N + T7Q; + ii[WS(rs, 20)] = T7Q - T7N; + T7w = KP707106781 * (T7u - T7v); + ri[WS(rs, 28)] = T7t - T7w; + ri[WS(rs, 12)] = T7t + T7w; + T7R = KP707106781 * (T7r - T7m); + ii[WS(rs, 12)] = T7R + T7S; + ii[WS(rs, 28)] = T7S - T7R; + } + } + { + E T6j, T7X, T83, T6X, T6u, T7U, T77, T7b, T70, T82, T6G, T6U, T74, T7a, T6R; + E T6V; + { + E T6o, T6t, T6A, T6F; + T6j = T6f - T6i; + T7X = T7V + T7W; + T83 = T7W - T7V; + T6X = T6f + T6i; + T6o = T6m - T6n; + T6t = T6p + T6s; + T6u = KP707106781 * (T6o - T6t); + T7U = KP707106781 * (T6o + T6t); + { + E T75, T76, T6Y, T6Z; + T75 = T6H + T6K; + T76 = T6O + T6P; + T77 = FNMS(KP382683432, T76, KP923879532 * T75); + T7b = FMA(KP923879532, T76, KP382683432 * T75); + T6Y = T6n + T6m; + T6Z = T6p - T6s; + T70 = KP707106781 * (T6Y + T6Z); + T82 = KP707106781 * (T6Z - T6Y); + } + T6A = T6y - T6z; + T6F = T6B - T6E; + T6G = FMA(KP923879532, T6A, KP382683432 * T6F); + T6U = FNMS(KP923879532, T6F, KP382683432 * T6A); + { + E T72, T73, T6L, T6Q; + T72 = T6y + T6z; + T73 = T6B + T6E; + T74 = FMA(KP382683432, T72, KP923879532 * T73); + T7a = FNMS(KP382683432, T73, KP923879532 * T72); + T6L = T6H - T6K; + T6Q = T6O - T6P; + T6R = FNMS(KP923879532, T6Q, KP382683432 * T6L); + T6V = FMA(KP382683432, T6Q, KP923879532 * T6L); + } + } + { + E T6v, T6S, T81, T84; + T6v = T6j + T6u; + T6S = T6G + T6R; + ri[WS(rs, 22)] = T6v - T6S; + ri[WS(rs, 6)] = T6v + T6S; + T81 = T6U + T6V; + T84 = T82 + T83; + ii[WS(rs, 6)] = T81 + T84; + ii[WS(rs, 22)] = T84 - T81; + } + { + E T6T, T6W, T85, T86; + T6T = T6j - T6u; + T6W = T6U - T6V; + ri[WS(rs, 30)] = T6T - T6W; + ri[WS(rs, 14)] = T6T + T6W; + T85 = T6R - T6G; + T86 = T83 - T82; + ii[WS(rs, 14)] = T85 + T86; + ii[WS(rs, 30)] = T86 - T85; + } + { + E T71, T78, T7T, T7Y; + T71 = T6X + T70; + T78 = T74 + T77; + ri[WS(rs, 18)] = T71 - T78; + ri[WS(rs, 2)] = T71 + T78; + T7T = T7a + T7b; + T7Y = T7U + T7X; + ii[WS(rs, 2)] = T7T + T7Y; + ii[WS(rs, 18)] = T7Y - T7T; + } + { + E T79, T7c, T7Z, T80; + T79 = T6X - T70; + T7c = T7a - T7b; + ri[WS(rs, 26)] = T79 - T7c; + ri[WS(rs, 10)] = T79 + T7c; + T7Z = T77 - T74; + T80 = T7X - T7U; + ii[WS(rs, 10)] = T7Z + T80; + ii[WS(rs, 26)] = T80 - T7Z; + } + } + { + E T3R, T5d, T8r, T8x, T4e, T8o, T5n, T5r, T4G, T5a, T5g, T8w, T5k, T5q, T57; + E T5b, T3Q, T8p; + T3Q = KP707106781 * (T3K - T3P); + T3R = T3F - T3Q; + T5d = T3F + T3Q; + T8p = KP707106781 * (T5v - T5u); + T8r = T8p + T8q; + T8x = T8q - T8p; + { + E T42, T4d, T5l, T5m; + T42 = FNMS(KP923879532, T41, KP382683432 * T3W); + T4d = FMA(KP382683432, T47, KP923879532 * T4c); + T4e = T42 - T4d; + T8o = T42 + T4d; + T5l = T4L + T4W; + T5m = T52 + T55; + T5n = FNMS(KP555570233, T5m, KP831469612 * T5l); + T5r = FMA(KP831469612, T5m, KP555570233 * T5l); + } + { + E T4w, T4F, T5e, T5f; + T4w = T4k - T4v; + T4F = T4B - T4E; + T4G = FMA(KP980785280, T4w, KP195090322 * T4F); + T5a = FNMS(KP980785280, T4F, KP195090322 * T4w); + T5e = FMA(KP923879532, T3W, KP382683432 * T41); + T5f = FNMS(KP923879532, T47, KP382683432 * T4c); + T5g = T5e + T5f; + T8w = T5f - T5e; + } + { + E T5i, T5j, T4X, T56; + T5i = T4k + T4v; + T5j = T4B + T4E; + T5k = FMA(KP555570233, T5i, KP831469612 * T5j); + T5q = FNMS(KP555570233, T5j, KP831469612 * T5i); + T4X = T4L - T4W; + T56 = T52 - T55; + T57 = FNMS(KP980785280, T56, KP195090322 * T4X); + T5b = FMA(KP195090322, T56, KP980785280 * T4X); + } + { + E T4f, T58, T8v, T8y; + T4f = T3R + T4e; + T58 = T4G + T57; + ri[WS(rs, 23)] = T4f - T58; + ri[WS(rs, 7)] = T4f + T58; + T8v = T5a + T5b; + T8y = T8w + T8x; + ii[WS(rs, 7)] = T8v + T8y; + ii[WS(rs, 23)] = T8y - T8v; + } + { + E T59, T5c, T8z, T8A; + T59 = T3R - T4e; + T5c = T5a - T5b; + ri[WS(rs, 31)] = T59 - T5c; + ri[WS(rs, 15)] = T59 + T5c; + T8z = T57 - T4G; + T8A = T8x - T8w; + ii[WS(rs, 15)] = T8z + T8A; + ii[WS(rs, 31)] = T8A - T8z; + } + { + E T5h, T5o, T8n, T8s; + T5h = T5d + T5g; + T5o = T5k + T5n; + ri[WS(rs, 19)] = T5h - T5o; + ri[WS(rs, 3)] = T5h + T5o; + T8n = T5q + T5r; + T8s = T8o + T8r; + ii[WS(rs, 3)] = T8n + T8s; + ii[WS(rs, 19)] = T8s - T8n; + } + { + E T5p, T5s, T8t, T8u; + T5p = T5d - T5g; + T5s = T5q - T5r; + ri[WS(rs, 27)] = T5p - T5s; + ri[WS(rs, 11)] = T5p + T5s; + T8t = T5n - T5k; + T8u = T8r - T8o; + ii[WS(rs, 11)] = T8t + T8u; + ii[WS(rs, 27)] = T8u - T8t; + } + } + { + E T5x, T5Z, T8d, T8j, T5E, T88, T69, T6d, T5M, T5W, T62, T8i, T66, T6c, T5T; + E T5X, T5w, T89; + T5w = KP707106781 * (T5u + T5v); + T5x = T5t - T5w; + T5Z = T5t + T5w; + T89 = KP707106781 * (T3K + T3P); + T8d = T89 + T8c; + T8j = T8c - T89; + { + E T5A, T5D, T67, T68; + T5A = FNMS(KP382683432, T5z, KP923879532 * T5y); + T5D = FMA(KP923879532, T5B, KP382683432 * T5C); + T5E = T5A - T5D; + T88 = T5A + T5D; + T67 = T5N + T5O; + T68 = T5Q + T5R; + T69 = FNMS(KP195090322, T68, KP980785280 * T67); + T6d = FMA(KP195090322, T67, KP980785280 * T68); + } + { + E T5I, T5L, T60, T61; + T5I = T5G - T5H; + T5L = T5J - T5K; + T5M = FMA(KP555570233, T5I, KP831469612 * T5L); + T5W = FNMS(KP831469612, T5I, KP555570233 * T5L); + T60 = FMA(KP382683432, T5y, KP923879532 * T5z); + T61 = FNMS(KP382683432, T5B, KP923879532 * T5C); + T62 = T60 + T61; + T8i = T61 - T60; + } + { + E T64, T65, T5P, T5S; + T64 = T5G + T5H; + T65 = T5J + T5K; + T66 = FMA(KP980785280, T64, KP195090322 * T65); + T6c = FNMS(KP195090322, T64, KP980785280 * T65); + T5P = T5N - T5O; + T5S = T5Q - T5R; + T5T = FNMS(KP831469612, T5S, KP555570233 * T5P); + T5X = FMA(KP831469612, T5P, KP555570233 * T5S); + } + { + E T5F, T5U, T8h, T8k; + T5F = T5x + T5E; + T5U = T5M + T5T; + ri[WS(rs, 21)] = T5F - T5U; + ri[WS(rs, 5)] = T5F + T5U; + T8h = T5W + T5X; + T8k = T8i + T8j; + ii[WS(rs, 5)] = T8h + T8k; + ii[WS(rs, 21)] = T8k - T8h; + } + { + E T5V, T5Y, T8l, T8m; + T5V = T5x - T5E; + T5Y = T5W - T5X; + ri[WS(rs, 29)] = T5V - T5Y; + ri[WS(rs, 13)] = T5V + T5Y; + T8l = T5T - T5M; + T8m = T8j - T8i; + ii[WS(rs, 13)] = T8l + T8m; + ii[WS(rs, 29)] = T8m - T8l; + } + { + E T63, T6a, T87, T8e; + T63 = T5Z + T62; + T6a = T66 + T69; + ri[WS(rs, 17)] = T63 - T6a; + ri[WS(rs, 1)] = T63 + T6a; + T87 = T6c + T6d; + T8e = T88 + T8d; + ii[WS(rs, 1)] = T87 + T8e; + ii[WS(rs, 17)] = T8e - T87; + } + { + E T6b, T6e, T8f, T8g; + T6b = T5Z - T62; + T6e = T6c - T6d; + ri[WS(rs, 25)] = T6b - T6e; + ri[WS(rs, 9)] = T6b + T6e; + T8f = T69 - T66; + T8g = T8d - T88; + ii[WS(rs, 9)] = T8f + T8g; + ii[WS(rs, 25)] = T8g - T8f; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 27}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 32, "t2_32", twinstr, &GENUS, {376, 168, 112, 0}, 0, 0, 0 }; + +void X(codelet_t2_32) (planner *p) { + X(kdft_dit_register) (p, t2_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_4.c new file mode 100644 index 000000000..502b45eef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_4.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -name t2_4 -include dft/scalar/t.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 4, MAKE_VOLATILE_STRIDE(8, rs)) { + E T2, T6, T3, T5, T7, Tb, T4, Ta; + T2 = W[0]; + T6 = W[3]; + T3 = W[2]; + T4 = T2 * T3; + Ta = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Tb = FNMS(T5, T3, Ta); + { + E T1, Tx, Td, Tw, Ti, Tq, Tm, Ts; + T1 = ri[0]; + Tx = ii[0]; + { + E T8, T9, Tc, Tv; + T8 = ri[WS(rs, 2)]; + T9 = T7 * T8; + Tc = ii[WS(rs, 2)]; + Tv = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Tw = FNMS(Tb, T8, Tv); + } + { + E Tf, Tg, Th, Tp; + Tf = ri[WS(rs, 1)]; + Tg = T2 * Tf; + Th = ii[WS(rs, 1)]; + Tp = T2 * Th; + Ti = FMA(T5, Th, Tg); + Tq = FNMS(T5, Tf, Tp); + } + { + E Tj, Tk, Tl, Tr; + Tj = ri[WS(rs, 3)]; + Tk = T3 * Tj; + Tl = ii[WS(rs, 3)]; + Tr = T3 * Tl; + Tm = FMA(T6, Tl, Tk); + Ts = FNMS(T6, Tj, Tr); + } + { + E Te, Tn, Tu, Ty; + Te = T1 + Td; + Tn = Ti + Tm; + ri[WS(rs, 2)] = Te - Tn; + ri[0] = Te + Tn; + Tu = Tq + Ts; + Ty = Tw + Tx; + ii[0] = Tu + Ty; + ii[WS(rs, 2)] = Ty - Tu; + } + { + E To, Tt, Tz, TA; + To = T1 - Td; + Tt = Tq - Ts; + ri[WS(rs, 3)] = To - Tt; + ri[WS(rs, 1)] = To + Tt; + Tz = Tx - Tw; + TA = Ti - Tm; + ii[WS(rs, 1)] = Tz - TA; + ii[WS(rs, 3)] = TA + Tz; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 4, "t2_4", twinstr, &GENUS, {16, 8, 8, 0}, 0, 0, 0 }; + +void X(codelet_t2_4) (planner *p) { + X(kdft_dit_register) (p, t2_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -name t2_4 -include dft/scalar/t.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 4, MAKE_VOLATILE_STRIDE(8, rs)) { + E T2, T4, T3, T5, T6, T8; + T2 = W[0]; + T4 = W[1]; + T3 = W[2]; + T5 = W[3]; + T6 = FMA(T2, T3, T4 * T5); + T8 = FNMS(T4, T3, T2 * T5); + { + E T1, Tp, Ta, To, Te, Tk, Th, Tl, T7, T9; + T1 = ri[0]; + Tp = ii[0]; + T7 = ri[WS(rs, 2)]; + T9 = ii[WS(rs, 2)]; + Ta = FMA(T6, T7, T8 * T9); + To = FNMS(T8, T7, T6 * T9); + { + E Tc, Td, Tf, Tg; + Tc = ri[WS(rs, 1)]; + Td = ii[WS(rs, 1)]; + Te = FMA(T2, Tc, T4 * Td); + Tk = FNMS(T4, Tc, T2 * Td); + Tf = ri[WS(rs, 3)]; + Tg = ii[WS(rs, 3)]; + Th = FMA(T3, Tf, T5 * Tg); + Tl = FNMS(T5, Tf, T3 * Tg); + } + { + E Tb, Ti, Tn, Tq; + Tb = T1 + Ta; + Ti = Te + Th; + ri[WS(rs, 2)] = Tb - Ti; + ri[0] = Tb + Ti; + Tn = Tk + Tl; + Tq = To + Tp; + ii[0] = Tn + Tq; + ii[WS(rs, 2)] = Tq - Tn; + } + { + E Tj, Tm, Tr, Ts; + Tj = T1 - Ta; + Tm = Tk - Tl; + ri[WS(rs, 3)] = Tj - Tm; + ri[WS(rs, 1)] = Tj + Tm; + Tr = Tp - To; + Ts = Te - Th; + ii[WS(rs, 1)] = Tr - Ts; + ii[WS(rs, 3)] = Ts + Tr; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 4, "t2_4", twinstr, &GENUS, {16, 8, 8, 0}, 0, 0, 0 }; + +void X(codelet_t2_4) (planner *p) { + X(kdft_dit_register) (p, t2_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_5.c new file mode 100644 index 000000000..fd336b7c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_5.c @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 5 -name t2_5 -include dft/scalar/t.h */ + +/* + * This function contains 44 FP additions, 40 FP multiplications, + * (or, 14 additions, 10 multiplications, 30 fused multiply/add), + * 38 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 4, MAKE_VOLATILE_STRIDE(10, rs)) { + E T2, Ta, T8, T5, Tb, Tm, Tf, Tj, T9, Te; + T2 = W[0]; + Ta = W[3]; + T8 = W[2]; + T9 = T2 * T8; + Te = T2 * Ta; + T5 = W[1]; + Tb = FNMS(T5, Ta, T9); + Tm = FNMS(T5, T8, Te); + Tf = FMA(T5, T8, Te); + Tj = FMA(T5, Ta, T9); + { + E T1, TO, T7, Th, Ti, Tz, TB, TL, To, Ts, Tt, TE, TG, TM; + T1 = ri[0]; + TO = ii[0]; + { + E T3, T4, T6, Ty, Tc, Td, Tg, TA; + T3 = ri[WS(rs, 1)]; + T4 = T2 * T3; + T6 = ii[WS(rs, 1)]; + Ty = T2 * T6; + Tc = ri[WS(rs, 4)]; + Td = Tb * Tc; + Tg = ii[WS(rs, 4)]; + TA = Tb * Tg; + T7 = FMA(T5, T6, T4); + Th = FMA(Tf, Tg, Td); + Ti = T7 + Th; + Tz = FNMS(T5, T3, Ty); + TB = FNMS(Tf, Tc, TA); + TL = Tz + TB; + } + { + E Tk, Tl, Tn, TD, Tp, Tq, Tr, TF; + Tk = ri[WS(rs, 2)]; + Tl = Tj * Tk; + Tn = ii[WS(rs, 2)]; + TD = Tj * Tn; + Tp = ri[WS(rs, 3)]; + Tq = T8 * Tp; + Tr = ii[WS(rs, 3)]; + TF = T8 * Tr; + To = FMA(Tm, Tn, Tl); + Ts = FMA(Ta, Tr, Tq); + Tt = To + Ts; + TE = FNMS(Tm, Tk, TD); + TG = FNMS(Ta, Tp, TF); + TM = TE + TG; + } + { + E Tw, Tu, Tv, TI, TK, TC, TH, TJ, Tx; + Tw = Ti - Tt; + Tu = Ti + Tt; + Tv = FNMS(KP250000000, Tu, T1); + TC = Tz - TB; + TH = TE - TG; + TI = FMA(KP618033988, TH, TC); + TK = FNMS(KP618033988, TC, TH); + ri[0] = T1 + Tu; + TJ = FNMS(KP559016994, Tw, Tv); + ri[WS(rs, 2)] = FNMS(KP951056516, TK, TJ); + ri[WS(rs, 3)] = FMA(KP951056516, TK, TJ); + Tx = FMA(KP559016994, Tw, Tv); + ri[WS(rs, 4)] = FNMS(KP951056516, TI, Tx); + ri[WS(rs, 1)] = FMA(KP951056516, TI, Tx); + } + { + E TQ, TN, TP, TU, TW, TS, TT, TV, TR; + TQ = TL - TM; + TN = TL + TM; + TP = FNMS(KP250000000, TN, TO); + TS = T7 - Th; + TT = To - Ts; + TU = FMA(KP618033988, TT, TS); + TW = FNMS(KP618033988, TS, TT); + ii[0] = TN + TO; + TV = FNMS(KP559016994, TQ, TP); + ii[WS(rs, 2)] = FMA(KP951056516, TW, TV); + ii[WS(rs, 3)] = FNMS(KP951056516, TW, TV); + TR = FMA(KP559016994, TQ, TP); + ii[WS(rs, 1)] = FNMS(KP951056516, TU, TR); + ii[WS(rs, 4)] = FMA(KP951056516, TU, TR); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 5, "t2_5", twinstr, &GENUS, {14, 10, 30, 0}, 0, 0, 0 }; + +void X(codelet_t2_5) (planner *p) { + X(kdft_dit_register) (p, t2_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 5 -name t2_5 -include dft/scalar/t.h */ + +/* + * This function contains 44 FP additions, 32 FP multiplications, + * (or, 30 additions, 18 multiplications, 14 fused multiply/add), + * 37 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 4, MAKE_VOLATILE_STRIDE(10, rs)) { + E T2, T4, T7, T9, Tb, Tl, Tf, Tj; + { + E T8, Te, Ta, Td; + T2 = W[0]; + T4 = W[1]; + T7 = W[2]; + T9 = W[3]; + T8 = T2 * T7; + Te = T4 * T7; + Ta = T4 * T9; + Td = T2 * T9; + Tb = T8 - Ta; + Tl = Td - Te; + Tf = Td + Te; + Tj = T8 + Ta; + } + { + E T1, TI, Ty, TB, TN, TM, TF, TG, TH, Ti, Tr, Ts; + T1 = ri[0]; + TI = ii[0]; + { + E T6, Tw, Tq, TA, Th, Tx, Tn, Tz; + { + E T3, T5, To, Tp; + T3 = ri[WS(rs, 1)]; + T5 = ii[WS(rs, 1)]; + T6 = FMA(T2, T3, T4 * T5); + Tw = FNMS(T4, T3, T2 * T5); + To = ri[WS(rs, 3)]; + Tp = ii[WS(rs, 3)]; + Tq = FMA(T7, To, T9 * Tp); + TA = FNMS(T9, To, T7 * Tp); + } + { + E Tc, Tg, Tk, Tm; + Tc = ri[WS(rs, 4)]; + Tg = ii[WS(rs, 4)]; + Th = FMA(Tb, Tc, Tf * Tg); + Tx = FNMS(Tf, Tc, Tb * Tg); + Tk = ri[WS(rs, 2)]; + Tm = ii[WS(rs, 2)]; + Tn = FMA(Tj, Tk, Tl * Tm); + Tz = FNMS(Tl, Tk, Tj * Tm); + } + Ty = Tw - Tx; + TB = Tz - TA; + TN = Tn - Tq; + TM = T6 - Th; + TF = Tw + Tx; + TG = Tz + TA; + TH = TF + TG; + Ti = T6 + Th; + Tr = Tn + Tq; + Ts = Ti + Tr; + } + ri[0] = T1 + Ts; + ii[0] = TH + TI; + { + E TC, TE, Tv, TD, Tt, Tu; + TC = FMA(KP951056516, Ty, KP587785252 * TB); + TE = FNMS(KP587785252, Ty, KP951056516 * TB); + Tt = KP559016994 * (Ti - Tr); + Tu = FNMS(KP250000000, Ts, T1); + Tv = Tt + Tu; + TD = Tu - Tt; + ri[WS(rs, 4)] = Tv - TC; + ri[WS(rs, 3)] = TD + TE; + ri[WS(rs, 1)] = Tv + TC; + ri[WS(rs, 2)] = TD - TE; + } + { + E TO, TP, TL, TQ, TJ, TK; + TO = FMA(KP951056516, TM, KP587785252 * TN); + TP = FNMS(KP587785252, TM, KP951056516 * TN); + TJ = KP559016994 * (TF - TG); + TK = FNMS(KP250000000, TH, TI); + TL = TJ + TK; + TQ = TK - TJ; + ii[WS(rs, 1)] = TL - TO; + ii[WS(rs, 3)] = TQ - TP; + ii[WS(rs, 4)] = TO + TL; + ii[WS(rs, 2)] = TP + TQ; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 5, "t2_5", twinstr, &GENUS, {30, 18, 14, 0}, 0, 0, 0 }; + +void X(codelet_t2_5) (planner *p) { + X(kdft_dit_register) (p, t2_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_64.c new file mode 100644 index 000000000..138c50cd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_64.c @@ -0,0 +1,4243 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:21 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 64 -name t2_64 -include dft/scalar/t.h */ + +/* + * This function contains 1154 FP additions, 840 FP multiplications, + * (or, 520 additions, 206 multiplications, 634 fused multiply/add), + * 316 stack variables, 15 constants, and 256 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + (mb * 10); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 10, MAKE_VOLATILE_STRIDE(128, rs)) { + E T2, T3, Tc, T8, Te, T5, T6, Tr, T7, TJ, T14, T3d, T3i, TG, T10; + E T3a, T3g, TL, TP, Tb, Td, T17, Tt, Tu, T1i, Ti, T2U, T1t, T7B, T5O; + E T3N, T3U, T1I, T3G, T3R, T79, T1x, T3D, T2l, T3X, T2d, T1M, T4B, T4x, T4T; + E T2h, T29, T5s, T81, T5w, T7X, T7N, T7h, T64, T6a, T6e, T7l, T60, T7R, T5A; + E T6h, T6J, T7o, T5E, T6k, T6N, T7r, T2X, T6t, T6x, TO, TK, TQ, T7c, TU; + E T2x, T2u, T2y, T7E, T2C, T4b, T48, T4c, T5R, T4g, T3m, T3j, T3n, T4W, T3r; + E Tx, Ty, TC, T1Z, T23, T4s, T4p, T70, T6W, T19, T41, T44, T1a, T1e, T35; + E T31, T59, T55, T1k, T1R, T1V, T1l, T1p, T2Q, T2N, T8i, T8e, Th, T4E, T4H; + E Tj, Tn, T3A, T3w, T5n, T5j; + { + E T1H, Tg, Tw, T1s, T2g, TH, T2t, T47, T3h, T28, T4w, T3M, T2c, T4A, T3Q; + E T1w, T2k, T1L, T5r, T80; + { + E TI, T13, TF, TZ, Ta, T4, T9, Ts; + T2 = W[0]; + T3 = W[2]; + T4 = T2 * T3; + Tc = W[5]; + TI = T3 * Tc; + T13 = T2 * Tc; + T8 = W[4]; + Te = W[6]; + TF = T3 * T8; + T1H = T8 * Te; + TZ = T2 * T8; + T5 = W[1]; + T6 = W[3]; + Ta = T2 * T6; + Tr = FMA(T5, T6, T4); + T7 = FNMS(T5, T6, T4); + Tg = T7 * Tc; + Tw = Tr * Tc; + T1s = T3 * Te; + T2g = T2 * Te; + TJ = FMA(T6, T8, TI); + T14 = FNMS(T5, T8, T13); + T3d = FMA(T5, T8, T13); + T3i = FNMS(T6, T8, TI); + TG = FNMS(T6, Tc, TF); + TH = TG * Te; + T10 = FMA(T5, Tc, TZ); + T2t = T10 * Te; + T3a = FNMS(T5, Tc, TZ); + T47 = T3a * Te; + T3g = FMA(T6, Tc, TF); + T3h = T3g * Te; + TL = W[8]; + T28 = T3 * TL; + T4w = T8 * TL; + T3M = T2 * TL; + TP = W[9]; + T2c = T3 * TP; + T4A = T8 * TP; + T3Q = T2 * TP; + T9 = T7 * T8; + Tb = FMA(T5, T3, Ta); + Td = FMA(Tb, Tc, T9); + T17 = FNMS(Tb, Tc, T9); + Ts = Tr * T8; + Tt = FNMS(T5, T3, Ta); + Tu = FNMS(Tt, Tc, Ts); + T1i = FMA(Tt, Tc, Ts); + Ti = W[7]; + T1w = T3 * Ti; + T2k = T2 * Ti; + T1L = T8 * Ti; + T2U = FMA(Tc, Ti, T1H); + } + T1t = FMA(T6, Ti, T1s); + T7B = FNMS(T14, Ti, T2t); + T5O = FNMS(T3d, Ti, T47); + T3N = FMA(T5, TP, T3M); + T3U = FNMS(T6, Ti, T1s); + T1I = FNMS(Tc, Ti, T1H); + T3G = FNMS(T5, Te, T2k); + T3R = FNMS(T5, TL, T3Q); + T79 = FNMS(TJ, Ti, TH); + T1x = FNMS(T6, Te, T1w); + T3D = FMA(T5, Ti, T2g); + T2l = FMA(T5, Te, T2k); + T3X = FMA(T6, Te, T1w); + T2d = FNMS(T6, TL, T2c); + T1M = FMA(Tc, Te, T1L); + T4B = FNMS(Tc, TL, T4A); + T4x = FMA(Tc, TP, T4w); + T4T = FNMS(T3i, Ti, T3h); + T2h = FNMS(T5, Ti, T2g); + T29 = FMA(T6, TP, T28); + T5r = T3g * TL; + T5s = FMA(T3i, TP, T5r); + T80 = T7 * TP; + T81 = FNMS(Tb, TL, T80); + { + E T5v, T7W, T7M, T7g, T63; + T5v = T3g * TP; + T5w = FNMS(T3i, TL, T5v); + T7W = T7 * TL; + T7X = FMA(Tb, TP, T7W); + T7M = TG * TL; + T7N = FMA(TJ, TP, T7M); + T7g = T10 * TL; + T7h = FMA(T14, TP, T7g); + T63 = T3a * TP; + T64 = FNMS(T3d, TL, T63); + } + { + E T69, T6d, T7k, T5Z, T7Q, T5z; + T69 = Tr * TL; + T6a = FMA(Tt, TP, T69); + T6d = Tr * TP; + T6e = FNMS(Tt, TL, T6d); + T7k = T10 * TP; + T7l = FNMS(T14, TL, T7k); + T5Z = T3a * TL; + T60 = FMA(T3d, TP, T5Z); + T7Q = TG * TP; + T7R = FNMS(TJ, TL, T7Q); + T5z = Tr * Te; + T5A = FMA(Tt, Ti, T5z); + T6h = FNMS(Tt, Ti, T5z); + } + { + E T6I, T5D, T6M, T6s, T6w; + T6I = T7 * Te; + T6J = FNMS(Tb, Ti, T6I); + T7o = FMA(Tb, Ti, T6I); + T5D = Tr * Ti; + T5E = FNMS(Tt, Te, T5D); + T6k = FMA(Tt, Te, T5D); + T6M = T7 * Ti; + T6N = FMA(Tb, Te, T6M); + T7r = FNMS(Tb, Te, T6M); + T6s = T2U * TL; + T6w = T2U * TP; + T2X = FNMS(Tc, Te, T1L); + T6t = FMA(T2X, TP, T6s); + T6x = FNMS(T2X, TL, T6w); + { + E TN, TM, TT, T2w, T2v, T2B; + TN = TG * Ti; + TO = FNMS(TJ, Te, TN); + TK = FMA(TJ, Ti, TH); + TM = TK * TL; + TT = TK * TP; + TQ = FMA(TO, TP, TM); + T7c = FMA(TJ, Te, TN); + TU = FNMS(TO, TL, TT); + T2w = T10 * Ti; + T2x = FNMS(T14, Te, T2w); + T2u = FMA(T14, Ti, T2t); + T2v = T2u * TL; + T2B = T2u * TP; + T2y = FMA(T2x, TP, T2v); + T7E = FMA(T14, Te, T2w); + T2C = FNMS(T2x, TL, T2B); + } + } + { + E T4a, T49, T4f, T3l, T3k, T3q; + T4a = T3a * Ti; + T4b = FNMS(T3d, Te, T4a); + T48 = FMA(T3d, Ti, T47); + T49 = T48 * TL; + T4f = T48 * TP; + T4c = FMA(T4b, TP, T49); + T5R = FMA(T3d, Te, T4a); + T4g = FNMS(T4b, TL, T4f); + T3l = T3g * Ti; + T3m = FNMS(T3i, Te, T3l); + T3j = FMA(T3i, Ti, T3h); + T3k = T3j * TL; + T3q = T3j * TP; + T3n = FMA(T3m, TP, T3k); + T4W = FMA(T3i, Te, T3l); + T3r = FNMS(T3m, TL, T3q); + { + E T1Y, T22, Tv, TB, T6Z, T6V; + T1Y = Tu * TL; + T22 = Tu * TP; + Tv = Tu * Te; + TB = Tu * Ti; + Tx = FMA(Tt, T8, Tw); + Ty = FMA(Tx, Ti, Tv); + TC = FNMS(Tx, Te, TB); + T1Z = FMA(Tx, TP, T1Y); + T23 = FNMS(Tx, TL, T22); + T4s = FMA(Tx, Te, TB); + T4p = FNMS(Tx, Ti, Tv); + T6Z = Ty * TP; + T70 = FNMS(TC, TL, T6Z); + T6V = Ty * TL; + T6W = FMA(TC, TP, T6V); + } + } + { + E T30, T34, T18, T1d, T58, T54; + T30 = T17 * TL; + T34 = T17 * TP; + T18 = T17 * Te; + T1d = T17 * Ti; + T19 = FMA(Tb, T8, Tg); + T41 = FMA(T19, Ti, T18); + T44 = FNMS(T19, Te, T1d); + T1a = FNMS(T19, Ti, T18); + T1e = FMA(T19, Te, T1d); + T35 = FNMS(T19, TL, T34); + T31 = FMA(T19, TP, T30); + T58 = T41 * TP; + T59 = FNMS(T44, TL, T58); + T54 = T41 * TL; + T55 = FMA(T44, TP, T54); + } + { + E T1j, T1o, T1Q, T1U, T8h, T8d; + T1j = T1i * TL; + T1o = T1i * TP; + T1Q = T1i * Te; + T1U = T1i * Ti; + T1k = FNMS(Tt, T8, Tw); + T1R = FMA(T1k, Ti, T1Q); + T1V = FNMS(T1k, Te, T1U); + T1l = FMA(T1k, TP, T1j); + T1p = FNMS(T1k, TL, T1o); + T2Q = FMA(T1k, Te, T1U); + T2N = FNMS(T1k, Ti, T1Q); + T8h = T1R * TP; + T8i = FNMS(T1V, TL, T8h); + T8d = T1R * TL; + T8e = FMA(T1V, TP, T8d); + } + { + E T3v, T3z, Tf, Tm, T5m, T5i; + T3v = Td * TL; + T3z = Td * TP; + Tf = Td * Te; + Tm = Td * Ti; + Th = FNMS(Tb, T8, Tg); + T4E = FMA(Th, Ti, Tf); + T4H = FNMS(Th, Te, Tm); + Tj = FNMS(Th, Ti, Tf); + Tn = FMA(Th, Te, Tm); + T3A = FNMS(Th, TL, T3z); + T3w = FMA(Th, TP, T3v); + T5m = T4E * TP; + T5n = FNMS(T4H, TL, T5m); + T5i = T4E * TL; + T5j = FMA(T4H, TP, T5i); + } + } + { + E TY, Tg4, Tl9, TlD, T8w, TdS, Tkd, TkE, T2G, Tge, Tgh, TiK, T98, Te1, T9f; + E Te0, T39, Tgq, Tgn, TiN, T9p, Te5, T9M, Te8, T74, Thr, Thc, Tja, TbI, TeE; + E TcB, TeP, T1B, TkD, Tg7, Tk7, T8D, TdT, T8K, TdU, T27, Tg9, Tgc, TiJ, T8T; + E TdY, T90, TdX, T4k, TgB, Tgy, TiT, T9Y, Tec, Tal, Tef, T5d, Th0, TgL, TiZ; + E Taz, Tel, Tbs, Tew, T3K, Tgo, Tgt, TiO, T9E, Te9, T9P, Te6, T4L, Tgz, TgE; + E TiU, Tad, Teg, Tao, Ted, T5I, TgM, Th3, Tj0, TaO, Tex, Tbv, Tem, T7v, Thd; + E Thu, Tjb, TbX, TeQ, TcE, TeF, T68, Tj5, TgS, Th5, Tbj, Tez, Tbx, Teq, T6B; + E Tj6, TgX, Th6, Tb4, TeA, Tby, Tet, T7V, Tjg, Thj, Thw, Tcs, TeS, TcG, TeJ; + E T8m, Tjh, Tho, Thx, Tcd, TeT, TcH, TeM; + { + E T1, Tkb, Tp, Tka, TE, T8s, TW, T8u; + T1 = ri[0]; + Tkb = ii[0]; + { + E Tk, Tl, To, Tk9; + Tk = ri[WS(rs, 32)]; + Tl = Tj * Tk; + To = ii[WS(rs, 32)]; + Tk9 = Tj * To; + Tp = FMA(Tn, To, Tl); + Tka = FNMS(Tn, Tk, Tk9); + } + { + E Tz, TA, TD, T8r; + Tz = ri[WS(rs, 16)]; + TA = Ty * Tz; + TD = ii[WS(rs, 16)]; + T8r = Ty * TD; + TE = FMA(TC, TD, TA); + T8s = FNMS(TC, Tz, T8r); + } + { + E TR, TS, TV, T8t; + TR = ri[WS(rs, 48)]; + TS = TQ * TR; + TV = ii[WS(rs, 48)]; + T8t = TQ * TV; + TW = FMA(TU, TV, TS); + T8u = FNMS(TU, TR, T8t); + } + { + E Tq, TX, Tl7, Tl8; + Tq = T1 + Tp; + TX = TE + TW; + TY = Tq + TX; + Tg4 = Tq - TX; + Tl7 = Tkb - Tka; + Tl8 = TE - TW; + Tl9 = Tl7 - Tl8; + TlD = Tl8 + Tl7; + } + { + E T8q, T8v, Tk8, Tkc; + T8q = T1 - Tp; + T8v = T8s - T8u; + T8w = T8q - T8v; + TdS = T8q + T8v; + Tk8 = T8s + T8u; + Tkc = Tka + Tkb; + Tkd = Tk8 + Tkc; + TkE = Tkc - Tk8; + } + } + { + E T2f, T93, T2E, T9d, T2n, T95, T2s, T9b; + { + E T2a, T2b, T2e, T92; + T2a = ri[WS(rs, 60)]; + T2b = T29 * T2a; + T2e = ii[WS(rs, 60)]; + T92 = T29 * T2e; + T2f = FMA(T2d, T2e, T2b); + T93 = FNMS(T2d, T2a, T92); + } + { + E T2z, T2A, T2D, T9c; + T2z = ri[WS(rs, 44)]; + T2A = T2y * T2z; + T2D = ii[WS(rs, 44)]; + T9c = T2y * T2D; + T2E = FMA(T2C, T2D, T2A); + T9d = FNMS(T2C, T2z, T9c); + } + { + E T2i, T2j, T2m, T94; + T2i = ri[WS(rs, 28)]; + T2j = T2h * T2i; + T2m = ii[WS(rs, 28)]; + T94 = T2h * T2m; + T2n = FMA(T2l, T2m, T2j); + T95 = FNMS(T2l, T2i, T94); + } + { + E T2p, T2q, T2r, T9a; + T2p = ri[WS(rs, 12)]; + T2q = TG * T2p; + T2r = ii[WS(rs, 12)]; + T9a = TG * T2r; + T2s = FMA(TJ, T2r, T2q); + T9b = FNMS(TJ, T2p, T9a); + } + { + E T2o, T2F, Tgf, Tgg; + T2o = T2f + T2n; + T2F = T2s + T2E; + T2G = T2o + T2F; + Tge = T2o - T2F; + Tgf = T93 + T95; + Tgg = T9b + T9d; + Tgh = Tgf - Tgg; + TiK = Tgf + Tgg; + } + { + E T96, T97, T99, T9e; + T96 = T93 - T95; + T97 = T2s - T2E; + T98 = T96 + T97; + Te1 = T96 - T97; + T99 = T2f - T2n; + T9e = T9b - T9d; + T9f = T99 - T9e; + Te0 = T99 + T9e; + } + } + { + E T2M, T9k, T37, T9K, T2S, T9m, T2Z, T9I; + { + E T2J, T2K, T2L, T9j; + T2J = ri[WS(rs, 2)]; + T2K = Tr * T2J; + T2L = ii[WS(rs, 2)]; + T9j = Tr * T2L; + T2M = FMA(Tt, T2L, T2K); + T9k = FNMS(Tt, T2J, T9j); + } + { + E T32, T33, T36, T9J; + T32 = ri[WS(rs, 50)]; + T33 = T31 * T32; + T36 = ii[WS(rs, 50)]; + T9J = T31 * T36; + T37 = FMA(T35, T36, T33); + T9K = FNMS(T35, T32, T9J); + } + { + E T2O, T2P, T2R, T9l; + T2O = ri[WS(rs, 34)]; + T2P = T2N * T2O; + T2R = ii[WS(rs, 34)]; + T9l = T2N * T2R; + T2S = FMA(T2Q, T2R, T2P); + T9m = FNMS(T2Q, T2O, T9l); + } + { + E T2V, T2W, T2Y, T9H; + T2V = ri[WS(rs, 18)]; + T2W = T2U * T2V; + T2Y = ii[WS(rs, 18)]; + T9H = T2U * T2Y; + T2Z = FMA(T2X, T2Y, T2W); + T9I = FNMS(T2X, T2V, T9H); + } + { + E T2T, T38, Tgl, Tgm; + T2T = T2M + T2S; + T38 = T2Z + T37; + T39 = T2T + T38; + Tgq = T2T - T38; + Tgl = T9k + T9m; + Tgm = T9I + T9K; + Tgn = Tgl - Tgm; + TiN = Tgl + Tgm; + } + { + E T9n, T9o, T9G, T9L; + T9n = T9k - T9m; + T9o = T2Z - T37; + T9p = T9n + T9o; + Te5 = T9n - T9o; + T9G = T2M - T2S; + T9L = T9I - T9K; + T9M = T9G - T9L; + Te8 = T9G + T9L; + } + } + { + E T6H, TbD, T72, Tcz, T6P, TbF, T6U, Tcx; + { + E T6E, T6F, T6G, TbC; + T6E = ri[WS(rs, 63)]; + T6F = TL * T6E; + T6G = ii[WS(rs, 63)]; + TbC = TL * T6G; + T6H = FMA(TP, T6G, T6F); + TbD = FNMS(TP, T6E, TbC); + } + { + E T6X, T6Y, T71, Tcy; + T6X = ri[WS(rs, 47)]; + T6Y = T6W * T6X; + T71 = ii[WS(rs, 47)]; + Tcy = T6W * T71; + T72 = FMA(T70, T71, T6Y); + Tcz = FNMS(T70, T6X, Tcy); + } + { + E T6K, T6L, T6O, TbE; + T6K = ri[WS(rs, 31)]; + T6L = T6J * T6K; + T6O = ii[WS(rs, 31)]; + TbE = T6J * T6O; + T6P = FMA(T6N, T6O, T6L); + TbF = FNMS(T6N, T6K, TbE); + } + { + E T6R, T6S, T6T, Tcw; + T6R = ri[WS(rs, 15)]; + T6S = TK * T6R; + T6T = ii[WS(rs, 15)]; + Tcw = TK * T6T; + T6U = FMA(TO, T6T, T6S); + Tcx = FNMS(TO, T6R, Tcw); + } + { + E T6Q, T73, Tha, Thb; + T6Q = T6H + T6P; + T73 = T6U + T72; + T74 = T6Q + T73; + Thr = T6Q - T73; + Tha = TbD + TbF; + Thb = Tcx + Tcz; + Thc = Tha - Thb; + Tja = Tha + Thb; + } + { + E TbG, TbH, Tcv, TcA; + TbG = TbD - TbF; + TbH = T6U - T72; + TbI = TbG + TbH; + TeE = TbG - TbH; + Tcv = T6H - T6P; + TcA = Tcx - Tcz; + TcB = Tcv - TcA; + TeP = Tcv + TcA; + } + } + { + E T16, T8y, T1z, T8I, T1g, T8A, T1r, T8G; + { + E T11, T12, T15, T8x; + T11 = ri[WS(rs, 8)]; + T12 = T10 * T11; + T15 = ii[WS(rs, 8)]; + T8x = T10 * T15; + T16 = FMA(T14, T15, T12); + T8y = FNMS(T14, T11, T8x); + } + { + E T1u, T1v, T1y, T8H; + T1u = ri[WS(rs, 24)]; + T1v = T1t * T1u; + T1y = ii[WS(rs, 24)]; + T8H = T1t * T1y; + T1z = FMA(T1x, T1y, T1v); + T8I = FNMS(T1x, T1u, T8H); + } + { + E T1b, T1c, T1f, T8z; + T1b = ri[WS(rs, 40)]; + T1c = T1a * T1b; + T1f = ii[WS(rs, 40)]; + T8z = T1a * T1f; + T1g = FMA(T1e, T1f, T1c); + T8A = FNMS(T1e, T1b, T8z); + } + { + E T1m, T1n, T1q, T8F; + T1m = ri[WS(rs, 56)]; + T1n = T1l * T1m; + T1q = ii[WS(rs, 56)]; + T8F = T1l * T1q; + T1r = FMA(T1p, T1q, T1n); + T8G = FNMS(T1p, T1m, T8F); + } + { + E T1h, T1A, Tg5, Tg6; + T1h = T16 + T1g; + T1A = T1r + T1z; + T1B = T1h + T1A; + TkD = T1A - T1h; + Tg5 = T8y + T8A; + Tg6 = T8G + T8I; + Tg7 = Tg5 - Tg6; + Tk7 = Tg5 + Tg6; + } + { + E T8B, T8C, T8E, T8J; + T8B = T8y - T8A; + T8C = T16 - T1g; + T8D = T8B - T8C; + TdT = T8C + T8B; + T8E = T1r - T1z; + T8J = T8G - T8I; + T8K = T8E + T8J; + TdU = T8E - T8J; + } + } + { + E T1G, T8O, T25, T8Y, T1O, T8Q, T1X, T8W; + { + E T1D, T1E, T1F, T8N; + T1D = ri[WS(rs, 4)]; + T1E = T7 * T1D; + T1F = ii[WS(rs, 4)]; + T8N = T7 * T1F; + T1G = FMA(Tb, T1F, T1E); + T8O = FNMS(Tb, T1D, T8N); + } + { + E T20, T21, T24, T8X; + T20 = ri[WS(rs, 52)]; + T21 = T1Z * T20; + T24 = ii[WS(rs, 52)]; + T8X = T1Z * T24; + T25 = FMA(T23, T24, T21); + T8Y = FNMS(T23, T20, T8X); + } + { + E T1J, T1K, T1N, T8P; + T1J = ri[WS(rs, 36)]; + T1K = T1I * T1J; + T1N = ii[WS(rs, 36)]; + T8P = T1I * T1N; + T1O = FMA(T1M, T1N, T1K); + T8Q = FNMS(T1M, T1J, T8P); + } + { + E T1S, T1T, T1W, T8V; + T1S = ri[WS(rs, 20)]; + T1T = T1R * T1S; + T1W = ii[WS(rs, 20)]; + T8V = T1R * T1W; + T1X = FMA(T1V, T1W, T1T); + T8W = FNMS(T1V, T1S, T8V); + } + { + E T1P, T26, Tga, Tgb; + T1P = T1G + T1O; + T26 = T1X + T25; + T27 = T1P + T26; + Tg9 = T1P - T26; + Tga = T8O + T8Q; + Tgb = T8W + T8Y; + Tgc = Tga - Tgb; + TiJ = Tga + Tgb; + } + { + E T8R, T8S, T8U, T8Z; + T8R = T8O - T8Q; + T8S = T1X - T25; + T8T = T8R + T8S; + TdY = T8R - T8S; + T8U = T1G - T1O; + T8Z = T8W - T8Y; + T90 = T8U - T8Z; + TdX = T8U + T8Z; + } + } + { + E T3T, T9T, T4i, Taj, T3Z, T9V, T46, Tah; + { + E T3O, T3P, T3S, T9S; + T3O = ri[WS(rs, 62)]; + T3P = T3N * T3O; + T3S = ii[WS(rs, 62)]; + T9S = T3N * T3S; + T3T = FMA(T3R, T3S, T3P); + T9T = FNMS(T3R, T3O, T9S); + } + { + E T4d, T4e, T4h, Tai; + T4d = ri[WS(rs, 46)]; + T4e = T4c * T4d; + T4h = ii[WS(rs, 46)]; + Tai = T4c * T4h; + T4i = FMA(T4g, T4h, T4e); + Taj = FNMS(T4g, T4d, Tai); + } + { + E T3V, T3W, T3Y, T9U; + T3V = ri[WS(rs, 30)]; + T3W = T3U * T3V; + T3Y = ii[WS(rs, 30)]; + T9U = T3U * T3Y; + T3Z = FMA(T3X, T3Y, T3W); + T9V = FNMS(T3X, T3V, T9U); + } + { + E T42, T43, T45, Tag; + T42 = ri[WS(rs, 14)]; + T43 = T41 * T42; + T45 = ii[WS(rs, 14)]; + Tag = T41 * T45; + T46 = FMA(T44, T45, T43); + Tah = FNMS(T44, T42, Tag); + } + { + E T40, T4j, Tgw, Tgx; + T40 = T3T + T3Z; + T4j = T46 + T4i; + T4k = T40 + T4j; + TgB = T40 - T4j; + Tgw = T9T + T9V; + Tgx = Tah + Taj; + Tgy = Tgw - Tgx; + TiT = Tgw + Tgx; + } + { + E T9W, T9X, Taf, Tak; + T9W = T9T - T9V; + T9X = T46 - T4i; + T9Y = T9W + T9X; + Tec = T9W - T9X; + Taf = T3T - T3Z; + Tak = Tah - Taj; + Tal = Taf - Tak; + Tef = Taf + Tak; + } + } + { + E T4S, Tau, T5b, Tbq, T4Y, Taw, T53, Tbo; + { + E T4P, T4Q, T4R, Tat; + T4P = ri[WS(rs, 1)]; + T4Q = T2 * T4P; + T4R = ii[WS(rs, 1)]; + Tat = T2 * T4R; + T4S = FMA(T5, T4R, T4Q); + Tau = FNMS(T5, T4P, Tat); + } + { + E T56, T57, T5a, Tbp; + T56 = ri[WS(rs, 49)]; + T57 = T55 * T56; + T5a = ii[WS(rs, 49)]; + Tbp = T55 * T5a; + T5b = FMA(T59, T5a, T57); + Tbq = FNMS(T59, T56, Tbp); + } + { + E T4U, T4V, T4X, Tav; + T4U = ri[WS(rs, 33)]; + T4V = T4T * T4U; + T4X = ii[WS(rs, 33)]; + Tav = T4T * T4X; + T4Y = FMA(T4W, T4X, T4V); + Taw = FNMS(T4W, T4U, Tav); + } + { + E T50, T51, T52, Tbn; + T50 = ri[WS(rs, 17)]; + T51 = T48 * T50; + T52 = ii[WS(rs, 17)]; + Tbn = T48 * T52; + T53 = FMA(T4b, T52, T51); + Tbo = FNMS(T4b, T50, Tbn); + } + { + E T4Z, T5c, TgJ, TgK; + T4Z = T4S + T4Y; + T5c = T53 + T5b; + T5d = T4Z + T5c; + Th0 = T4Z - T5c; + TgJ = Tau + Taw; + TgK = Tbo + Tbq; + TgL = TgJ - TgK; + TiZ = TgJ + TgK; + } + { + E Tax, Tay, Tbm, Tbr; + Tax = Tau - Taw; + Tay = T53 - T5b; + Taz = Tax + Tay; + Tel = Tax - Tay; + Tbm = T4S - T4Y; + Tbr = Tbo - Tbq; + Tbs = Tbm - Tbr; + Tew = Tbm + Tbr; + } + } + { + E T3f, T9s, T3I, T9B, T3t, T9u, T3C, T9z; + { + E T3b, T3c, T3e, T9r; + T3b = ri[WS(rs, 10)]; + T3c = T3a * T3b; + T3e = ii[WS(rs, 10)]; + T9r = T3a * T3e; + T3f = FMA(T3d, T3e, T3c); + T9s = FNMS(T3d, T3b, T9r); + } + { + E T3E, T3F, T3H, T9A; + T3E = ri[WS(rs, 26)]; + T3F = T3D * T3E; + T3H = ii[WS(rs, 26)]; + T9A = T3D * T3H; + T3I = FMA(T3G, T3H, T3F); + T9B = FNMS(T3G, T3E, T9A); + } + { + E T3o, T3p, T3s, T9t; + T3o = ri[WS(rs, 42)]; + T3p = T3n * T3o; + T3s = ii[WS(rs, 42)]; + T9t = T3n * T3s; + T3t = FMA(T3r, T3s, T3p); + T9u = FNMS(T3r, T3o, T9t); + } + { + E T3x, T3y, T3B, T9y; + T3x = ri[WS(rs, 58)]; + T3y = T3w * T3x; + T3B = ii[WS(rs, 58)]; + T9y = T3w * T3B; + T3C = FMA(T3A, T3B, T3y); + T9z = FNMS(T3A, T3x, T9y); + } + { + E T3u, T3J, Tgr, Tgs; + T3u = T3f + T3t; + T3J = T3C + T3I; + T3K = T3u + T3J; + Tgo = T3J - T3u; + Tgr = T9s + T9u; + Tgs = T9z + T9B; + Tgt = Tgr - Tgs; + TiO = Tgr + Tgs; + { + E T9w, T9O, T9D, T9N; + { + E T9q, T9v, T9x, T9C; + T9q = T3f - T3t; + T9v = T9s - T9u; + T9w = T9q + T9v; + T9O = T9v - T9q; + T9x = T3C - T3I; + T9C = T9z - T9B; + T9D = T9x - T9C; + T9N = T9x + T9C; + } + T9E = T9w - T9D; + Te9 = T9w + T9D; + T9P = T9N - T9O; + Te6 = T9O + T9N; + } + } + } + { + E T4o, Ta1, T4J, Taa, T4u, Ta3, T4D, Ta8; + { + E T4l, T4m, T4n, Ta0; + T4l = ri[WS(rs, 6)]; + T4m = T3g * T4l; + T4n = ii[WS(rs, 6)]; + Ta0 = T3g * T4n; + T4o = FMA(T3i, T4n, T4m); + Ta1 = FNMS(T3i, T4l, Ta0); + } + { + E T4F, T4G, T4I, Ta9; + T4F = ri[WS(rs, 22)]; + T4G = T4E * T4F; + T4I = ii[WS(rs, 22)]; + Ta9 = T4E * T4I; + T4J = FMA(T4H, T4I, T4G); + Taa = FNMS(T4H, T4F, Ta9); + } + { + E T4q, T4r, T4t, Ta2; + T4q = ri[WS(rs, 38)]; + T4r = T4p * T4q; + T4t = ii[WS(rs, 38)]; + Ta2 = T4p * T4t; + T4u = FMA(T4s, T4t, T4r); + Ta3 = FNMS(T4s, T4q, Ta2); + } + { + E T4y, T4z, T4C, Ta7; + T4y = ri[WS(rs, 54)]; + T4z = T4x * T4y; + T4C = ii[WS(rs, 54)]; + Ta7 = T4x * T4C; + T4D = FMA(T4B, T4C, T4z); + Ta8 = FNMS(T4B, T4y, Ta7); + } + { + E T4v, T4K, TgC, TgD; + T4v = T4o + T4u; + T4K = T4D + T4J; + T4L = T4v + T4K; + Tgz = T4K - T4v; + TgC = Ta1 + Ta3; + TgD = Ta8 + Taa; + TgE = TgC - TgD; + TiU = TgC + TgD; + { + E Ta5, Tan, Tac, Tam; + { + E T9Z, Ta4, Ta6, Tab; + T9Z = T4o - T4u; + Ta4 = Ta1 - Ta3; + Ta5 = T9Z + Ta4; + Tan = Ta4 - T9Z; + Ta6 = T4D - T4J; + Tab = Ta8 - Taa; + Tac = Ta6 - Tab; + Tam = Ta6 + Tab; + } + Tad = Ta5 - Tac; + Teg = Ta5 + Tac; + Tao = Tam - Tan; + Ted = Tan + Tam; + } + } + } + { + E T5h, TaC, T5G, TaL, T5p, TaE, T5y, TaJ; + { + E T5e, T5f, T5g, TaB; + T5e = ri[WS(rs, 9)]; + T5f = T8 * T5e; + T5g = ii[WS(rs, 9)]; + TaB = T8 * T5g; + T5h = FMA(Tc, T5g, T5f); + TaC = FNMS(Tc, T5e, TaB); + } + { + E T5B, T5C, T5F, TaK; + T5B = ri[WS(rs, 25)]; + T5C = T5A * T5B; + T5F = ii[WS(rs, 25)]; + TaK = T5A * T5F; + T5G = FMA(T5E, T5F, T5C); + TaL = FNMS(T5E, T5B, TaK); + } + { + E T5k, T5l, T5o, TaD; + T5k = ri[WS(rs, 41)]; + T5l = T5j * T5k; + T5o = ii[WS(rs, 41)]; + TaD = T5j * T5o; + T5p = FMA(T5n, T5o, T5l); + TaE = FNMS(T5n, T5k, TaD); + } + { + E T5t, T5u, T5x, TaI; + T5t = ri[WS(rs, 57)]; + T5u = T5s * T5t; + T5x = ii[WS(rs, 57)]; + TaI = T5s * T5x; + T5y = FMA(T5w, T5x, T5u); + TaJ = FNMS(T5w, T5t, TaI); + } + { + E T5q, T5H, Th1, Th2; + T5q = T5h + T5p; + T5H = T5y + T5G; + T5I = T5q + T5H; + TgM = T5H - T5q; + Th1 = TaC + TaE; + Th2 = TaJ + TaL; + Th3 = Th1 - Th2; + Tj0 = Th1 + Th2; + { + E TaG, Tbu, TaN, Tbt; + { + E TaA, TaF, TaH, TaM; + TaA = T5h - T5p; + TaF = TaC - TaE; + TaG = TaA + TaF; + Tbu = TaF - TaA; + TaH = T5y - T5G; + TaM = TaJ - TaL; + TaN = TaH - TaM; + Tbt = TaH + TaM; + } + TaO = TaG - TaN; + Tex = TaG + TaN; + Tbv = Tbt - Tbu; + Tem = Tbu + Tbt; + } + } + } + { + E T78, TbL, T7t, TbU, T7e, TbN, T7n, TbS; + { + E T75, T76, T77, TbK; + T75 = ri[WS(rs, 7)]; + T76 = T1i * T75; + T77 = ii[WS(rs, 7)]; + TbK = T1i * T77; + T78 = FMA(T1k, T77, T76); + TbL = FNMS(T1k, T75, TbK); + } + { + E T7p, T7q, T7s, TbT; + T7p = ri[WS(rs, 23)]; + T7q = T7o * T7p; + T7s = ii[WS(rs, 23)]; + TbT = T7o * T7s; + T7t = FMA(T7r, T7s, T7q); + TbU = FNMS(T7r, T7p, TbT); + } + { + E T7a, T7b, T7d, TbM; + T7a = ri[WS(rs, 39)]; + T7b = T79 * T7a; + T7d = ii[WS(rs, 39)]; + TbM = T79 * T7d; + T7e = FMA(T7c, T7d, T7b); + TbN = FNMS(T7c, T7a, TbM); + } + { + E T7i, T7j, T7m, TbR; + T7i = ri[WS(rs, 55)]; + T7j = T7h * T7i; + T7m = ii[WS(rs, 55)]; + TbR = T7h * T7m; + T7n = FMA(T7l, T7m, T7j); + TbS = FNMS(T7l, T7i, TbR); + } + { + E T7f, T7u, Ths, Tht; + T7f = T78 + T7e; + T7u = T7n + T7t; + T7v = T7f + T7u; + Thd = T7u - T7f; + Ths = TbL + TbN; + Tht = TbS + TbU; + Thu = Ths - Tht; + Tjb = Ths + Tht; + { + E TbP, TcD, TbW, TcC; + { + E TbJ, TbO, TbQ, TbV; + TbJ = T78 - T7e; + TbO = TbL - TbN; + TbP = TbJ + TbO; + TcD = TbO - TbJ; + TbQ = T7n - T7t; + TbV = TbS - TbU; + TbW = TbQ - TbV; + TcC = TbQ + TbV; + } + TbX = TbP - TbW; + TeQ = TbP + TbW; + TcE = TcC - TcD; + TeF = TcD + TcC; + } + } + } + { + E T5N, Tbd, T66, Tb9, T5T, Tbf, T5Y, Tb7; + { + E T5K, T5L, T5M, Tbc; + T5K = ri[WS(rs, 5)]; + T5L = Td * T5K; + T5M = ii[WS(rs, 5)]; + Tbc = Td * T5M; + T5N = FMA(Th, T5M, T5L); + Tbd = FNMS(Th, T5K, Tbc); + } + { + E T61, T62, T65, Tb8; + T61 = ri[WS(rs, 53)]; + T62 = T60 * T61; + T65 = ii[WS(rs, 53)]; + Tb8 = T60 * T65; + T66 = FMA(T64, T65, T62); + Tb9 = FNMS(T64, T61, Tb8); + } + { + E T5P, T5Q, T5S, Tbe; + T5P = ri[WS(rs, 37)]; + T5Q = T5O * T5P; + T5S = ii[WS(rs, 37)]; + Tbe = T5O * T5S; + T5T = FMA(T5R, T5S, T5Q); + Tbf = FNMS(T5R, T5P, Tbe); + } + { + E T5V, T5W, T5X, Tb6; + T5V = ri[WS(rs, 21)]; + T5W = T3j * T5V; + T5X = ii[WS(rs, 21)]; + Tb6 = T3j * T5X; + T5Y = FMA(T3m, T5X, T5W); + Tb7 = FNMS(T3m, T5V, Tb6); + } + { + E T5U, T67, TgR, TgO, TgP, TgQ; + T5U = T5N + T5T; + T67 = T5Y + T66; + TgR = T5U - T67; + TgO = Tbd + Tbf; + TgP = Tb7 + Tb9; + TgQ = TgO - TgP; + T68 = T5U + T67; + Tj5 = TgO + TgP; + TgS = TgQ - TgR; + Th5 = TgR + TgQ; + } + { + E Tbb, Tep, Tbi, Teo; + { + E Tb5, Tba, Tbg, Tbh; + Tb5 = T5N - T5T; + Tba = Tb7 - Tb9; + Tbb = Tb5 - Tba; + Tep = Tb5 + Tba; + Tbg = Tbd - Tbf; + Tbh = T5Y - T66; + Tbi = Tbg + Tbh; + Teo = Tbg - Tbh; + } + Tbj = FNMS(KP414213562, Tbi, Tbb); + Tez = FMA(KP414213562, Teo, Tep); + Tbx = FMA(KP414213562, Tbb, Tbi); + Teq = FNMS(KP414213562, Tep, Teo); + } + } + { + E T6g, TaY, T6z, TaU, T6m, Tb0, T6r, TaS; + { + E T6b, T6c, T6f, TaX; + T6b = ri[WS(rs, 61)]; + T6c = T6a * T6b; + T6f = ii[WS(rs, 61)]; + TaX = T6a * T6f; + T6g = FMA(T6e, T6f, T6c); + TaY = FNMS(T6e, T6b, TaX); + } + { + E T6u, T6v, T6y, TaT; + T6u = ri[WS(rs, 45)]; + T6v = T6t * T6u; + T6y = ii[WS(rs, 45)]; + TaT = T6t * T6y; + T6z = FMA(T6x, T6y, T6v); + TaU = FNMS(T6x, T6u, TaT); + } + { + E T6i, T6j, T6l, TaZ; + T6i = ri[WS(rs, 29)]; + T6j = T6h * T6i; + T6l = ii[WS(rs, 29)]; + TaZ = T6h * T6l; + T6m = FMA(T6k, T6l, T6j); + Tb0 = FNMS(T6k, T6i, TaZ); + } + { + E T6o, T6p, T6q, TaR; + T6o = ri[WS(rs, 13)]; + T6p = T17 * T6o; + T6q = ii[WS(rs, 13)]; + TaR = T17 * T6q; + T6r = FMA(T19, T6q, T6p); + TaS = FNMS(T19, T6o, TaR); + } + { + E T6n, T6A, TgT, TgU, TgV, TgW; + T6n = T6g + T6m; + T6A = T6r + T6z; + TgT = T6n - T6A; + TgU = TaY + Tb0; + TgV = TaS + TaU; + TgW = TgU - TgV; + T6B = T6n + T6A; + Tj6 = TgU + TgV; + TgX = TgT + TgW; + Th6 = TgT - TgW; + } + { + E TaW, Tes, Tb3, Ter; + { + E TaQ, TaV, Tb1, Tb2; + TaQ = T6g - T6m; + TaV = TaS - TaU; + TaW = TaQ - TaV; + Tes = TaQ + TaV; + Tb1 = TaY - Tb0; + Tb2 = T6r - T6z; + Tb3 = Tb1 + Tb2; + Ter = Tb1 - Tb2; + } + Tb4 = FMA(KP414213562, Tb3, TaW); + TeA = FNMS(KP414213562, Ter, Tes); + Tby = FNMS(KP414213562, TaW, Tb3); + Tet = FMA(KP414213562, Tes, Ter); + } + } + { + E T7A, Tcm, T7T, Tci, T7G, Tco, T7L, Tcg; + { + E T7x, T7y, T7z, Tcl; + T7x = ri[WS(rs, 3)]; + T7y = T3 * T7x; + T7z = ii[WS(rs, 3)]; + Tcl = T3 * T7z; + T7A = FMA(T6, T7z, T7y); + Tcm = FNMS(T6, T7x, Tcl); + } + { + E T7O, T7P, T7S, Tch; + T7O = ri[WS(rs, 51)]; + T7P = T7N * T7O; + T7S = ii[WS(rs, 51)]; + Tch = T7N * T7S; + T7T = FMA(T7R, T7S, T7P); + Tci = FNMS(T7R, T7O, Tch); + } + { + E T7C, T7D, T7F, Tcn; + T7C = ri[WS(rs, 35)]; + T7D = T7B * T7C; + T7F = ii[WS(rs, 35)]; + Tcn = T7B * T7F; + T7G = FMA(T7E, T7F, T7D); + Tco = FNMS(T7E, T7C, Tcn); + } + { + E T7I, T7J, T7K, Tcf; + T7I = ri[WS(rs, 19)]; + T7J = T2u * T7I; + T7K = ii[WS(rs, 19)]; + Tcf = T2u * T7K; + T7L = FMA(T2x, T7K, T7J); + Tcg = FNMS(T2x, T7I, Tcf); + } + { + E T7H, T7U, Thi, Thf, Thg, Thh; + T7H = T7A + T7G; + T7U = T7L + T7T; + Thi = T7H - T7U; + Thf = Tcm + Tco; + Thg = Tcg + Tci; + Thh = Thf - Thg; + T7V = T7H + T7U; + Tjg = Thf + Thg; + Thj = Thh - Thi; + Thw = Thi + Thh; + } + { + E Tck, TeI, Tcr, TeH; + { + E Tce, Tcj, Tcp, Tcq; + Tce = T7A - T7G; + Tcj = Tcg - Tci; + Tck = Tce - Tcj; + TeI = Tce + Tcj; + Tcp = Tcm - Tco; + Tcq = T7L - T7T; + Tcr = Tcp + Tcq; + TeH = Tcp - Tcq; + } + Tcs = FNMS(KP414213562, Tcr, Tck); + TeS = FMA(KP414213562, TeH, TeI); + TcG = FMA(KP414213562, Tck, Tcr); + TeJ = FNMS(KP414213562, TeI, TeH); + } + } + { + E T83, Tc7, T8k, Tc3, T87, Tc9, T8c, Tc1; + { + E T7Y, T7Z, T82, Tc6; + T7Y = ri[WS(rs, 59)]; + T7Z = T7X * T7Y; + T82 = ii[WS(rs, 59)]; + Tc6 = T7X * T82; + T83 = FMA(T81, T82, T7Z); + Tc7 = FNMS(T81, T7Y, Tc6); + } + { + E T8f, T8g, T8j, Tc2; + T8f = ri[WS(rs, 43)]; + T8g = T8e * T8f; + T8j = ii[WS(rs, 43)]; + Tc2 = T8e * T8j; + T8k = FMA(T8i, T8j, T8g); + Tc3 = FNMS(T8i, T8f, Tc2); + } + { + E T84, T85, T86, Tc8; + T84 = ri[WS(rs, 27)]; + T85 = Te * T84; + T86 = ii[WS(rs, 27)]; + Tc8 = Te * T86; + T87 = FMA(Ti, T86, T85); + Tc9 = FNMS(Ti, T84, Tc8); + } + { + E T89, T8a, T8b, Tc0; + T89 = ri[WS(rs, 11)]; + T8a = Tu * T89; + T8b = ii[WS(rs, 11)]; + Tc0 = Tu * T8b; + T8c = FMA(Tx, T8b, T8a); + Tc1 = FNMS(Tx, T89, Tc0); + } + { + E T88, T8l, Thk, Thl, Thm, Thn; + T88 = T83 + T87; + T8l = T8c + T8k; + Thk = T88 - T8l; + Thl = Tc7 + Tc9; + Thm = Tc1 + Tc3; + Thn = Thl - Thm; + T8m = T88 + T8l; + Tjh = Thl + Thm; + Tho = Thk + Thn; + Thx = Thk - Thn; + } + { + E Tc5, TeL, Tcc, TeK; + { + E TbZ, Tc4, Tca, Tcb; + TbZ = T83 - T87; + Tc4 = Tc1 - Tc3; + Tc5 = TbZ - Tc4; + TeL = TbZ + Tc4; + Tca = Tc7 - Tc9; + Tcb = T8c - T8k; + Tcc = Tca + Tcb; + TeK = Tca - Tcb; + } + Tcd = FMA(KP414213562, Tcc, Tc5); + TeT = FNMS(KP414213562, TeK, TeL); + TcH = FNMS(KP414213562, Tc5, Tcc); + TeM = FMA(KP414213562, TeL, TeK); + } + } + { + E T2I, TjG, T4N, Tkj, Tkf, Tkk, TjJ, Tk5, T8o, Tk2, TjU, TjY, T6D, Tk1, TjP; + E TjX; + { + E T1C, T2H, TjH, TjI; + T1C = TY + T1B; + T2H = T27 + T2G; + T2I = T1C + T2H; + TjG = T1C - T2H; + { + E T3L, T4M, Tk6, Tke; + T3L = T39 + T3K; + T4M = T4k + T4L; + T4N = T3L + T4M; + Tkj = T4M - T3L; + Tk6 = TiJ + TiK; + Tke = Tk7 + Tkd; + Tkf = Tk6 + Tke; + Tkk = Tke - Tk6; + } + TjH = TiN + TiO; + TjI = TiT + TiU; + TjJ = TjH - TjI; + Tk5 = TjH + TjI; + { + E T7w, T8n, TjQ, TjR, TjS, TjT; + T7w = T74 + T7v; + T8n = T7V + T8m; + TjQ = T7w - T8n; + TjR = Tja + Tjb; + TjS = Tjg + Tjh; + TjT = TjR - TjS; + T8o = T7w + T8n; + Tk2 = TjR + TjS; + TjU = TjQ - TjT; + TjY = TjQ + TjT; + } + { + E T5J, T6C, TjL, TjM, TjN, TjO; + T5J = T5d + T5I; + T6C = T68 + T6B; + TjL = T5J - T6C; + TjM = TiZ + Tj0; + TjN = Tj5 + Tj6; + TjO = TjM - TjN; + T6D = T5J + T6C; + Tk1 = TjM + TjN; + TjP = TjL + TjO; + TjX = TjO - TjL; + } + } + { + E T4O, T8p, Tk4, Tkg; + T4O = T2I + T4N; + T8p = T6D + T8o; + ri[WS(rs, 32)] = T4O - T8p; + ri[0] = T4O + T8p; + Tk4 = Tk1 + Tk2; + Tkg = Tk5 + Tkf; + ii[0] = Tk4 + Tkg; + ii[WS(rs, 32)] = Tkg - Tk4; + } + { + E TjK, TjV, Tkl, Tkm; + TjK = TjG + TjJ; + TjV = TjP + TjU; + ri[WS(rs, 40)] = FNMS(KP707106781, TjV, TjK); + ri[WS(rs, 8)] = FMA(KP707106781, TjV, TjK); + Tkl = Tkj + Tkk; + Tkm = TjX + TjY; + ii[WS(rs, 8)] = FMA(KP707106781, Tkm, Tkl); + ii[WS(rs, 40)] = FNMS(KP707106781, Tkm, Tkl); + } + { + E TjW, TjZ, Tkn, Tko; + TjW = TjG - TjJ; + TjZ = TjX - TjY; + ri[WS(rs, 56)] = FNMS(KP707106781, TjZ, TjW); + ri[WS(rs, 24)] = FMA(KP707106781, TjZ, TjW); + Tkn = Tkk - Tkj; + Tko = TjU - TjP; + ii[WS(rs, 24)] = FMA(KP707106781, Tko, Tkn); + ii[WS(rs, 56)] = FNMS(KP707106781, Tko, Tkn); + } + { + E Tk0, Tk3, Tkh, Tki; + Tk0 = T2I - T4N; + Tk3 = Tk1 - Tk2; + ri[WS(rs, 48)] = Tk0 - Tk3; + ri[WS(rs, 16)] = Tk0 + Tk3; + Tkh = T8o - T6D; + Tki = Tkf - Tk5; + ii[WS(rs, 16)] = Tkh + Tki; + ii[WS(rs, 48)] = Tki - Tkh; + } + } + { + E TiM, Tjq, Tkr, Tkx, TiX, Tky, Tjt, Tks, Tj9, TjD, Tjn, Tjx, Tjk, TjE, Tjo; + E TjA; + { + E TiI, TiL, Tkp, Tkq; + TiI = TY - T1B; + TiL = TiJ - TiK; + TiM = TiI - TiL; + Tjq = TiI + TiL; + Tkp = T2G - T27; + Tkq = Tkd - Tk7; + Tkr = Tkp + Tkq; + Tkx = Tkq - Tkp; + } + { + E TiR, Tjr, TiW, Tjs; + { + E TiP, TiQ, TiS, TiV; + TiP = TiN - TiO; + TiQ = T39 - T3K; + TiR = TiP - TiQ; + Tjr = TiQ + TiP; + TiS = T4k - T4L; + TiV = TiT - TiU; + TiW = TiS + TiV; + Tjs = TiS - TiV; + } + TiX = TiR - TiW; + Tky = Tjs - Tjr; + Tjt = Tjr + Tjs; + Tks = TiR + TiW; + } + { + E Tj3, Tjw, Tj8, Tjv; + { + E Tj1, Tj2, Tj4, Tj7; + Tj1 = TiZ - Tj0; + Tj2 = T6B - T68; + Tj3 = Tj1 - Tj2; + Tjw = Tj1 + Tj2; + Tj4 = T5d - T5I; + Tj7 = Tj5 - Tj6; + Tj8 = Tj4 - Tj7; + Tjv = Tj4 + Tj7; + } + Tj9 = FMA(KP414213562, Tj8, Tj3); + TjD = FNMS(KP414213562, Tjv, Tjw); + Tjn = FNMS(KP414213562, Tj3, Tj8); + Tjx = FMA(KP414213562, Tjw, Tjv); + } + { + E Tje, Tjz, Tjj, Tjy; + { + E Tjc, Tjd, Tjf, Tji; + Tjc = Tja - Tjb; + Tjd = T8m - T7V; + Tje = Tjc - Tjd; + Tjz = Tjc + Tjd; + Tjf = T74 - T7v; + Tji = Tjg - Tjh; + Tjj = Tjf - Tji; + Tjy = Tjf + Tji; + } + Tjk = FNMS(KP414213562, Tjj, Tje); + TjE = FMA(KP414213562, Tjy, Tjz); + Tjo = FMA(KP414213562, Tje, Tjj); + TjA = FNMS(KP414213562, Tjz, Tjy); + } + { + E TiY, Tjl, Tkz, TkA; + TiY = FMA(KP707106781, TiX, TiM); + Tjl = Tj9 - Tjk; + ri[WS(rs, 44)] = FNMS(KP923879532, Tjl, TiY); + ri[WS(rs, 12)] = FMA(KP923879532, Tjl, TiY); + Tkz = FMA(KP707106781, Tky, Tkx); + TkA = Tjo - Tjn; + ii[WS(rs, 12)] = FMA(KP923879532, TkA, Tkz); + ii[WS(rs, 44)] = FNMS(KP923879532, TkA, Tkz); + } + { + E Tjm, Tjp, TkB, TkC; + Tjm = FNMS(KP707106781, TiX, TiM); + Tjp = Tjn + Tjo; + ri[WS(rs, 28)] = FNMS(KP923879532, Tjp, Tjm); + ri[WS(rs, 60)] = FMA(KP923879532, Tjp, Tjm); + TkB = FNMS(KP707106781, Tky, Tkx); + TkC = Tj9 + Tjk; + ii[WS(rs, 28)] = FNMS(KP923879532, TkC, TkB); + ii[WS(rs, 60)] = FMA(KP923879532, TkC, TkB); + } + { + E Tju, TjB, Tkt, Tku; + Tju = FMA(KP707106781, Tjt, Tjq); + TjB = Tjx + TjA; + ri[WS(rs, 36)] = FNMS(KP923879532, TjB, Tju); + ri[WS(rs, 4)] = FMA(KP923879532, TjB, Tju); + Tkt = FMA(KP707106781, Tks, Tkr); + Tku = TjD + TjE; + ii[WS(rs, 4)] = FMA(KP923879532, Tku, Tkt); + ii[WS(rs, 36)] = FNMS(KP923879532, Tku, Tkt); + } + { + E TjC, TjF, Tkv, Tkw; + TjC = FNMS(KP707106781, Tjt, Tjq); + TjF = TjD - TjE; + ri[WS(rs, 52)] = FNMS(KP923879532, TjF, TjC); + ri[WS(rs, 20)] = FMA(KP923879532, TjF, TjC); + Tkv = FNMS(KP707106781, Tks, Tkr); + Tkw = TjA - Tjx; + ii[WS(rs, 20)] = FMA(KP923879532, Tkw, Tkv); + ii[WS(rs, 52)] = FNMS(KP923879532, Tkw, Tkv); + } + } + { + E Tgk, Tl1, ThG, TkV, Ti0, TkN, Tis, TkH, TgH, TkO, ThJ, TkI, Tim, TiG, Tiq; + E TiC, Th9, ThT, ThD, ThN, Ti7, Tl2, Tiv, TkW, Tif, TiF, Tip, Tiz, ThA, ThU; + E ThE, ThQ; + { + E Tg8, TkT, Tgj, TkU, Tgd, Tgi; + Tg8 = Tg4 + Tg7; + TkT = TkE - TkD; + Tgd = Tg9 + Tgc; + Tgi = Tge - Tgh; + Tgj = Tgd + Tgi; + TkU = Tgi - Tgd; + Tgk = FNMS(KP707106781, Tgj, Tg8); + Tl1 = FNMS(KP707106781, TkU, TkT); + ThG = FMA(KP707106781, Tgj, Tg8); + TkV = FMA(KP707106781, TkU, TkT); + } + { + E ThW, TkF, ThZ, TkG, ThX, ThY; + ThW = Tg4 - Tg7; + TkF = TkD + TkE; + ThX = Tgc - Tg9; + ThY = Tge + Tgh; + ThZ = ThX - ThY; + TkG = ThX + ThY; + Ti0 = FMA(KP707106781, ThZ, ThW); + TkN = FNMS(KP707106781, TkG, TkF); + Tis = FNMS(KP707106781, ThZ, ThW); + TkH = FMA(KP707106781, TkG, TkF); + } + { + E Tgv, ThH, TgG, ThI; + { + E Tgp, Tgu, TgA, TgF; + Tgp = Tgn + Tgo; + Tgu = Tgq + Tgt; + Tgv = FNMS(KP414213562, Tgu, Tgp); + ThH = FMA(KP414213562, Tgp, Tgu); + TgA = Tgy + Tgz; + TgF = TgB + TgE; + TgG = FMA(KP414213562, TgF, TgA); + ThI = FNMS(KP414213562, TgA, TgF); + } + TgH = Tgv - TgG; + TkO = ThI - ThH; + ThJ = ThH + ThI; + TkI = Tgv + TgG; + } + { + E Tii, TiB, Til, TiA; + { + E Tig, Tih, Tij, Tik; + Tig = Thr - Thu; + Tih = Tho - Thj; + Tii = FNMS(KP707106781, Tih, Tig); + TiB = FMA(KP707106781, Tih, Tig); + Tij = Thc - Thd; + Tik = Thw - Thx; + Til = FNMS(KP707106781, Tik, Tij); + TiA = FMA(KP707106781, Tik, Tij); + } + Tim = FNMS(KP668178637, Til, Tii); + TiG = FMA(KP198912367, TiA, TiB); + Tiq = FMA(KP668178637, Tii, Til); + TiC = FNMS(KP198912367, TiB, TiA); + } + { + E TgZ, ThM, Th8, ThL; + { + E TgN, TgY, Th4, Th7; + TgN = TgL + TgM; + TgY = TgS + TgX; + TgZ = FNMS(KP707106781, TgY, TgN); + ThM = FMA(KP707106781, TgY, TgN); + Th4 = Th0 + Th3; + Th7 = Th5 + Th6; + Th8 = FNMS(KP707106781, Th7, Th4); + ThL = FMA(KP707106781, Th7, Th4); + } + Th9 = FMA(KP668178637, Th8, TgZ); + ThT = FNMS(KP198912367, ThL, ThM); + ThD = FNMS(KP668178637, TgZ, Th8); + ThN = FMA(KP198912367, ThM, ThL); + } + { + E Ti3, Tit, Ti6, Tiu; + { + E Ti1, Ti2, Ti4, Ti5; + Ti1 = Tgn - Tgo; + Ti2 = Tgq - Tgt; + Ti3 = FMA(KP414213562, Ti2, Ti1); + Tit = FNMS(KP414213562, Ti1, Ti2); + Ti4 = Tgy - Tgz; + Ti5 = TgB - TgE; + Ti6 = FNMS(KP414213562, Ti5, Ti4); + Tiu = FMA(KP414213562, Ti4, Ti5); + } + Ti7 = Ti3 - Ti6; + Tl2 = Ti3 + Ti6; + Tiv = Tit + Tiu; + TkW = Tiu - Tit; + } + { + E Tib, Tiy, Tie, Tix; + { + E Ti9, Tia, Tic, Tid; + Ti9 = Th0 - Th3; + Tia = TgX - TgS; + Tib = FNMS(KP707106781, Tia, Ti9); + Tiy = FMA(KP707106781, Tia, Ti9); + Tic = TgL - TgM; + Tid = Th5 - Th6; + Tie = FNMS(KP707106781, Tid, Tic); + Tix = FMA(KP707106781, Tid, Tic); + } + Tif = FMA(KP668178637, Tie, Tib); + TiF = FNMS(KP198912367, Tix, Tiy); + Tip = FNMS(KP668178637, Tib, Tie); + Tiz = FMA(KP198912367, Tiy, Tix); + } + { + E Thq, ThP, Thz, ThO; + { + E The, Thp, Thv, Thy; + The = Thc + Thd; + Thp = Thj + Tho; + Thq = FNMS(KP707106781, Thp, The); + ThP = FMA(KP707106781, Thp, The); + Thv = Thr + Thu; + Thy = Thw + Thx; + Thz = FNMS(KP707106781, Thy, Thv); + ThO = FMA(KP707106781, Thy, Thv); + } + ThA = FNMS(KP668178637, Thz, Thq); + ThU = FMA(KP198912367, ThO, ThP); + ThE = FMA(KP668178637, Thq, Thz); + ThQ = FNMS(KP198912367, ThP, ThO); + } + { + E TgI, ThB, TkP, TkQ; + TgI = FMA(KP923879532, TgH, Tgk); + ThB = Th9 - ThA; + ri[WS(rs, 42)] = FNMS(KP831469612, ThB, TgI); + ri[WS(rs, 10)] = FMA(KP831469612, ThB, TgI); + TkP = FMA(KP923879532, TkO, TkN); + TkQ = ThE - ThD; + ii[WS(rs, 10)] = FMA(KP831469612, TkQ, TkP); + ii[WS(rs, 42)] = FNMS(KP831469612, TkQ, TkP); + } + { + E ThC, ThF, TkR, TkS; + ThC = FNMS(KP923879532, TgH, Tgk); + ThF = ThD + ThE; + ri[WS(rs, 26)] = FNMS(KP831469612, ThF, ThC); + ri[WS(rs, 58)] = FMA(KP831469612, ThF, ThC); + TkR = FNMS(KP923879532, TkO, TkN); + TkS = Th9 + ThA; + ii[WS(rs, 26)] = FNMS(KP831469612, TkS, TkR); + ii[WS(rs, 58)] = FMA(KP831469612, TkS, TkR); + } + { + E ThK, ThR, TkJ, TkK; + ThK = FMA(KP923879532, ThJ, ThG); + ThR = ThN + ThQ; + ri[WS(rs, 34)] = FNMS(KP980785280, ThR, ThK); + ri[WS(rs, 2)] = FMA(KP980785280, ThR, ThK); + TkJ = FMA(KP923879532, TkI, TkH); + TkK = ThT + ThU; + ii[WS(rs, 2)] = FMA(KP980785280, TkK, TkJ); + ii[WS(rs, 34)] = FNMS(KP980785280, TkK, TkJ); + } + { + E ThS, ThV, TkL, TkM; + ThS = FNMS(KP923879532, ThJ, ThG); + ThV = ThT - ThU; + ri[WS(rs, 50)] = FNMS(KP980785280, ThV, ThS); + ri[WS(rs, 18)] = FMA(KP980785280, ThV, ThS); + TkL = FNMS(KP923879532, TkI, TkH); + TkM = ThQ - ThN; + ii[WS(rs, 18)] = FMA(KP980785280, TkM, TkL); + ii[WS(rs, 50)] = FNMS(KP980785280, TkM, TkL); + } + { + E Ti8, Tin, TkX, TkY; + Ti8 = FMA(KP923879532, Ti7, Ti0); + Tin = Tif + Tim; + ri[WS(rs, 38)] = FNMS(KP831469612, Tin, Ti8); + ri[WS(rs, 6)] = FMA(KP831469612, Tin, Ti8); + TkX = FMA(KP923879532, TkW, TkV); + TkY = Tip + Tiq; + ii[WS(rs, 6)] = FMA(KP831469612, TkY, TkX); + ii[WS(rs, 38)] = FNMS(KP831469612, TkY, TkX); + } + { + E Tio, Tir, TkZ, Tl0; + Tio = FNMS(KP923879532, Ti7, Ti0); + Tir = Tip - Tiq; + ri[WS(rs, 54)] = FNMS(KP831469612, Tir, Tio); + ri[WS(rs, 22)] = FMA(KP831469612, Tir, Tio); + TkZ = FNMS(KP923879532, TkW, TkV); + Tl0 = Tim - Tif; + ii[WS(rs, 22)] = FMA(KP831469612, Tl0, TkZ); + ii[WS(rs, 54)] = FNMS(KP831469612, Tl0, TkZ); + } + { + E Tiw, TiD, Tl3, Tl4; + Tiw = FNMS(KP923879532, Tiv, Tis); + TiD = Tiz - TiC; + ri[WS(rs, 46)] = FNMS(KP980785280, TiD, Tiw); + ri[WS(rs, 14)] = FMA(KP980785280, TiD, Tiw); + Tl3 = FNMS(KP923879532, Tl2, Tl1); + Tl4 = TiG - TiF; + ii[WS(rs, 14)] = FMA(KP980785280, Tl4, Tl3); + ii[WS(rs, 46)] = FNMS(KP980785280, Tl4, Tl3); + } + { + E TiE, TiH, Tl5, Tl6; + TiE = FMA(KP923879532, Tiv, Tis); + TiH = TiF + TiG; + ri[WS(rs, 30)] = FNMS(KP980785280, TiH, TiE); + ri[WS(rs, 62)] = FMA(KP980785280, TiH, TiE); + Tl5 = FMA(KP923879532, Tl2, Tl1); + Tl6 = Tiz + TiC; + ii[WS(rs, 30)] = FNMS(KP980785280, Tl6, Tl5); + ii[WS(rs, 62)] = FMA(KP980785280, Tl6, Tl5); + } + } + { + E Tar, TlO, TcT, TlI, TbB, Td3, TcN, TcX, Tdw, TdQ, TdA, TdM, Tdp, TdP, Tdz; + E TdJ, Tdh, Tm2, TdF, TlW, TcK, Td4, TcO, Td0, T9i, TlV, Tm1, TcQ, Tda, TlH; + E TlN, TdC; + { + E T9R, TcR, Taq, TcS; + { + E T9F, T9Q, Tae, Tap; + T9F = FNMS(KP707106781, T9E, T9p); + T9Q = FNMS(KP707106781, T9P, T9M); + T9R = FNMS(KP668178637, T9Q, T9F); + TcR = FMA(KP668178637, T9F, T9Q); + Tae = FNMS(KP707106781, Tad, T9Y); + Tap = FNMS(KP707106781, Tao, Tal); + Taq = FMA(KP668178637, Tap, Tae); + TcS = FNMS(KP668178637, Tae, Tap); + } + Tar = T9R - Taq; + TlO = TcS - TcR; + TcT = TcR + TcS; + TlI = T9R + Taq; + } + { + E Tbl, TcW, TbA, TcV; + { + E TaP, Tbk, Tbw, Tbz; + TaP = FNMS(KP707106781, TaO, Taz); + Tbk = Tb4 - Tbj; + Tbl = FNMS(KP923879532, Tbk, TaP); + TcW = FMA(KP923879532, Tbk, TaP); + Tbw = FNMS(KP707106781, Tbv, Tbs); + Tbz = Tbx - Tby; + TbA = FNMS(KP923879532, Tbz, Tbw); + TcV = FMA(KP923879532, Tbz, Tbw); + } + TbB = FMA(KP534511135, TbA, Tbl); + Td3 = FNMS(KP303346683, TcV, TcW); + TcN = FNMS(KP534511135, Tbl, TbA); + TcX = FMA(KP303346683, TcW, TcV); + } + { + E Tds, TdL, Tdv, TdK; + { + E Tdq, Tdr, Tdt, Tdu; + Tdq = FMA(KP707106781, TcE, TcB); + Tdr = Tcs + Tcd; + Tds = FNMS(KP923879532, Tdr, Tdq); + TdL = FMA(KP923879532, Tdr, Tdq); + Tdt = FMA(KP707106781, TbX, TbI); + Tdu = TcG + TcH; + Tdv = FNMS(KP923879532, Tdu, Tdt); + TdK = FMA(KP923879532, Tdu, Tdt); + } + Tdw = FNMS(KP820678790, Tdv, Tds); + TdQ = FMA(KP098491403, TdK, TdL); + TdA = FMA(KP820678790, Tds, Tdv); + TdM = FNMS(KP098491403, TdL, TdK); + } + { + E Tdl, TdI, Tdo, TdH; + { + E Tdj, Tdk, Tdm, Tdn; + Tdj = FMA(KP707106781, Tbv, Tbs); + Tdk = Tbj + Tb4; + Tdl = FNMS(KP923879532, Tdk, Tdj); + TdI = FMA(KP923879532, Tdk, Tdj); + Tdm = FMA(KP707106781, TaO, Taz); + Tdn = Tbx + Tby; + Tdo = FNMS(KP923879532, Tdn, Tdm); + TdH = FMA(KP923879532, Tdn, Tdm); + } + Tdp = FMA(KP820678790, Tdo, Tdl); + TdP = FNMS(KP098491403, TdH, TdI); + Tdz = FNMS(KP820678790, Tdl, Tdo); + TdJ = FMA(KP098491403, TdI, TdH); + } + { + E Tdd, TdD, Tdg, TdE; + { + E Tdb, Tdc, Tde, Tdf; + Tdb = FMA(KP707106781, T9E, T9p); + Tdc = FMA(KP707106781, T9P, T9M); + Tdd = FMA(KP198912367, Tdc, Tdb); + TdD = FNMS(KP198912367, Tdb, Tdc); + Tde = FMA(KP707106781, Tad, T9Y); + Tdf = FMA(KP707106781, Tao, Tal); + Tdg = FNMS(KP198912367, Tdf, Tde); + TdE = FMA(KP198912367, Tde, Tdf); + } + Tdh = Tdd - Tdg; + Tm2 = Tdd + Tdg; + TdF = TdD + TdE; + TlW = TdE - TdD; + } + { + E Tcu, TcZ, TcJ, TcY; + { + E TbY, Tct, TcF, TcI; + TbY = FNMS(KP707106781, TbX, TbI); + Tct = Tcd - Tcs; + Tcu = FNMS(KP923879532, Tct, TbY); + TcZ = FMA(KP923879532, Tct, TbY); + TcF = FNMS(KP707106781, TcE, TcB); + TcI = TcG - TcH; + TcJ = FNMS(KP923879532, TcI, TcF); + TcY = FMA(KP923879532, TcI, TcF); + } + TcK = FNMS(KP534511135, TcJ, Tcu); + Td4 = FMA(KP303346683, TcY, TcZ); + TcO = FMA(KP534511135, Tcu, TcJ); + Td0 = FNMS(KP303346683, TcZ, TcY); + } + { + E T8M, Td6, TlF, TlT, T9h, TlU, Td9, TlG, T8L, TlE; + T8L = T8D - T8K; + T8M = FMA(KP707106781, T8L, T8w); + Td6 = FNMS(KP707106781, T8L, T8w); + TlE = TdU - TdT; + TlF = FMA(KP707106781, TlE, TlD); + TlT = FNMS(KP707106781, TlE, TlD); + { + E T91, T9g, Td7, Td8; + T91 = FMA(KP414213562, T90, T8T); + T9g = FNMS(KP414213562, T9f, T98); + T9h = T91 - T9g; + TlU = T91 + T9g; + Td7 = FNMS(KP414213562, T8T, T90); + Td8 = FMA(KP414213562, T98, T9f); + Td9 = Td7 + Td8; + TlG = Td8 - Td7; + } + T9i = FNMS(KP923879532, T9h, T8M); + TlV = FNMS(KP923879532, TlU, TlT); + Tm1 = FMA(KP923879532, TlU, TlT); + TcQ = FMA(KP923879532, T9h, T8M); + Tda = FNMS(KP923879532, Td9, Td6); + TlH = FMA(KP923879532, TlG, TlF); + TlN = FNMS(KP923879532, TlG, TlF); + TdC = FMA(KP923879532, Td9, Td6); + } + { + E Tas, TcL, TlP, TlQ; + Tas = FMA(KP831469612, Tar, T9i); + TcL = TbB - TcK; + ri[WS(rs, 43)] = FNMS(KP881921264, TcL, Tas); + ri[WS(rs, 11)] = FMA(KP881921264, TcL, Tas); + TlP = FMA(KP831469612, TlO, TlN); + TlQ = TcO - TcN; + ii[WS(rs, 11)] = FMA(KP881921264, TlQ, TlP); + ii[WS(rs, 43)] = FNMS(KP881921264, TlQ, TlP); + } + { + E TcM, TcP, TlR, TlS; + TcM = FNMS(KP831469612, Tar, T9i); + TcP = TcN + TcO; + ri[WS(rs, 27)] = FNMS(KP881921264, TcP, TcM); + ri[WS(rs, 59)] = FMA(KP881921264, TcP, TcM); + TlR = FNMS(KP831469612, TlO, TlN); + TlS = TbB + TcK; + ii[WS(rs, 27)] = FNMS(KP881921264, TlS, TlR); + ii[WS(rs, 59)] = FMA(KP881921264, TlS, TlR); + } + { + E TcU, Td1, TlJ, TlK; + TcU = FMA(KP831469612, TcT, TcQ); + Td1 = TcX + Td0; + ri[WS(rs, 35)] = FNMS(KP956940335, Td1, TcU); + ri[WS(rs, 3)] = FMA(KP956940335, Td1, TcU); + TlJ = FMA(KP831469612, TlI, TlH); + TlK = Td3 + Td4; + ii[WS(rs, 3)] = FMA(KP956940335, TlK, TlJ); + ii[WS(rs, 35)] = FNMS(KP956940335, TlK, TlJ); + } + { + E Td2, Td5, TlL, TlM; + Td2 = FNMS(KP831469612, TcT, TcQ); + Td5 = Td3 - Td4; + ri[WS(rs, 51)] = FNMS(KP956940335, Td5, Td2); + ri[WS(rs, 19)] = FMA(KP956940335, Td5, Td2); + TlL = FNMS(KP831469612, TlI, TlH); + TlM = Td0 - TcX; + ii[WS(rs, 19)] = FMA(KP956940335, TlM, TlL); + ii[WS(rs, 51)] = FNMS(KP956940335, TlM, TlL); + } + { + E Tdi, Tdx, TlX, TlY; + Tdi = FMA(KP980785280, Tdh, Tda); + Tdx = Tdp + Tdw; + ri[WS(rs, 39)] = FNMS(KP773010453, Tdx, Tdi); + ri[WS(rs, 7)] = FMA(KP773010453, Tdx, Tdi); + TlX = FMA(KP980785280, TlW, TlV); + TlY = Tdz + TdA; + ii[WS(rs, 7)] = FMA(KP773010453, TlY, TlX); + ii[WS(rs, 39)] = FNMS(KP773010453, TlY, TlX); + } + { + E Tdy, TdB, TlZ, Tm0; + Tdy = FNMS(KP980785280, Tdh, Tda); + TdB = Tdz - TdA; + ri[WS(rs, 55)] = FNMS(KP773010453, TdB, Tdy); + ri[WS(rs, 23)] = FMA(KP773010453, TdB, Tdy); + TlZ = FNMS(KP980785280, TlW, TlV); + Tm0 = Tdw - Tdp; + ii[WS(rs, 23)] = FMA(KP773010453, Tm0, TlZ); + ii[WS(rs, 55)] = FNMS(KP773010453, Tm0, TlZ); + } + { + E TdG, TdN, Tm3, Tm4; + TdG = FNMS(KP980785280, TdF, TdC); + TdN = TdJ - TdM; + ri[WS(rs, 47)] = FNMS(KP995184726, TdN, TdG); + ri[WS(rs, 15)] = FMA(KP995184726, TdN, TdG); + Tm3 = FNMS(KP980785280, Tm2, Tm1); + Tm4 = TdQ - TdP; + ii[WS(rs, 15)] = FMA(KP995184726, Tm4, Tm3); + ii[WS(rs, 47)] = FNMS(KP995184726, Tm4, Tm3); + } + { + E TdO, TdR, Tm5, Tm6; + TdO = FMA(KP980785280, TdF, TdC); + TdR = TdP + TdQ; + ri[WS(rs, 31)] = FNMS(KP995184726, TdR, TdO); + ri[WS(rs, 63)] = FMA(KP995184726, TdR, TdO); + Tm5 = FMA(KP980785280, Tm2, Tm1); + Tm6 = TdJ + TdM; + ii[WS(rs, 31)] = FNMS(KP995184726, Tm6, Tm5); + ii[WS(rs, 63)] = FMA(KP995184726, Tm6, Tm5); + } + } + { + E Tej, Tlk, Tf5, Tle, TeD, Tff, TeZ, Tf9, TfI, Tg2, TfM, TfY, TfB, Tg1, TfL; + E TfV, Tft, Tly, TfR, Tls, TeW, Tfg, Tf0, Tfc, Te4, Tlr, Tlx, Tf2, Tfm, Tld; + E Tlj, TfO; + { + E Teb, Tf3, Tei, Tf4; + { + E Te7, Tea, Tee, Teh; + Te7 = FMA(KP707106781, Te6, Te5); + Tea = FMA(KP707106781, Te9, Te8); + Teb = FNMS(KP198912367, Tea, Te7); + Tf3 = FMA(KP198912367, Te7, Tea); + Tee = FMA(KP707106781, Ted, Tec); + Teh = FMA(KP707106781, Teg, Tef); + Tei = FMA(KP198912367, Teh, Tee); + Tf4 = FNMS(KP198912367, Tee, Teh); + } + Tej = Teb - Tei; + Tlk = Tf4 - Tf3; + Tf5 = Tf3 + Tf4; + Tle = Teb + Tei; + } + { + E Tev, Tf8, TeC, Tf7; + { + E Ten, Teu, Tey, TeB; + Ten = FMA(KP707106781, Tem, Tel); + Teu = Teq + Tet; + Tev = FNMS(KP923879532, Teu, Ten); + Tf8 = FMA(KP923879532, Teu, Ten); + Tey = FMA(KP707106781, Tex, Tew); + TeB = Tez + TeA; + TeC = FNMS(KP923879532, TeB, Tey); + Tf7 = FMA(KP923879532, TeB, Tey); + } + TeD = FMA(KP820678790, TeC, Tev); + Tff = FNMS(KP098491403, Tf7, Tf8); + TeZ = FNMS(KP820678790, Tev, TeC); + Tf9 = FMA(KP098491403, Tf8, Tf7); + } + { + E TfE, TfX, TfH, TfW; + { + E TfC, TfD, TfF, TfG; + TfC = FNMS(KP707106781, TeQ, TeP); + TfD = TeM - TeJ; + TfE = FNMS(KP923879532, TfD, TfC); + TfX = FMA(KP923879532, TfD, TfC); + TfF = FNMS(KP707106781, TeF, TeE); + TfG = TeS - TeT; + TfH = FNMS(KP923879532, TfG, TfF); + TfW = FMA(KP923879532, TfG, TfF); + } + TfI = FNMS(KP534511135, TfH, TfE); + Tg2 = FMA(KP303346683, TfW, TfX); + TfM = FMA(KP534511135, TfE, TfH); + TfY = FNMS(KP303346683, TfX, TfW); + } + { + E Tfx, TfU, TfA, TfT; + { + E Tfv, Tfw, Tfy, Tfz; + Tfv = FNMS(KP707106781, Tex, Tew); + Tfw = Tet - Teq; + Tfx = FNMS(KP923879532, Tfw, Tfv); + TfU = FMA(KP923879532, Tfw, Tfv); + Tfy = FNMS(KP707106781, Tem, Tel); + Tfz = Tez - TeA; + TfA = FNMS(KP923879532, Tfz, Tfy); + TfT = FMA(KP923879532, Tfz, Tfy); + } + TfB = FMA(KP534511135, TfA, Tfx); + Tg1 = FNMS(KP303346683, TfT, TfU); + TfL = FNMS(KP534511135, Tfx, TfA); + TfV = FMA(KP303346683, TfU, TfT); + } + { + E Tfp, TfP, Tfs, TfQ; + { + E Tfn, Tfo, Tfq, Tfr; + Tfn = FNMS(KP707106781, Te6, Te5); + Tfo = FNMS(KP707106781, Te9, Te8); + Tfp = FMA(KP668178637, Tfo, Tfn); + TfP = FNMS(KP668178637, Tfn, Tfo); + Tfq = FNMS(KP707106781, Ted, Tec); + Tfr = FNMS(KP707106781, Teg, Tef); + Tfs = FNMS(KP668178637, Tfr, Tfq); + TfQ = FMA(KP668178637, Tfq, Tfr); + } + Tft = Tfp - Tfs; + Tly = Tfp + Tfs; + TfR = TfP + TfQ; + Tls = TfQ - TfP; + } + { + E TeO, Tfb, TeV, Tfa; + { + E TeG, TeN, TeR, TeU; + TeG = FMA(KP707106781, TeF, TeE); + TeN = TeJ + TeM; + TeO = FNMS(KP923879532, TeN, TeG); + Tfb = FMA(KP923879532, TeN, TeG); + TeR = FMA(KP707106781, TeQ, TeP); + TeU = TeS + TeT; + TeV = FNMS(KP923879532, TeU, TeR); + Tfa = FMA(KP923879532, TeU, TeR); + } + TeW = FNMS(KP820678790, TeV, TeO); + Tfg = FMA(KP098491403, Tfa, Tfb); + Tf0 = FMA(KP820678790, TeO, TeV); + Tfc = FNMS(KP098491403, Tfb, Tfa); + } + { + E TdW, Tfi, Tlb, Tlp, Te3, Tlq, Tfl, Tlc, TdV, Tla; + TdV = TdT + TdU; + TdW = FMA(KP707106781, TdV, TdS); + Tfi = FNMS(KP707106781, TdV, TdS); + Tla = T8D + T8K; + Tlb = FMA(KP707106781, Tla, Tl9); + Tlp = FNMS(KP707106781, Tla, Tl9); + { + E TdZ, Te2, Tfj, Tfk; + TdZ = FMA(KP414213562, TdY, TdX); + Te2 = FNMS(KP414213562, Te1, Te0); + Te3 = TdZ + Te2; + Tlq = Te2 - TdZ; + Tfj = FNMS(KP414213562, TdX, TdY); + Tfk = FMA(KP414213562, Te0, Te1); + Tfl = Tfj - Tfk; + Tlc = Tfj + Tfk; + } + Te4 = FNMS(KP923879532, Te3, TdW); + Tlr = FMA(KP923879532, Tlq, Tlp); + Tlx = FNMS(KP923879532, Tlq, Tlp); + Tf2 = FMA(KP923879532, Te3, TdW); + Tfm = FMA(KP923879532, Tfl, Tfi); + Tld = FMA(KP923879532, Tlc, Tlb); + Tlj = FNMS(KP923879532, Tlc, Tlb); + TfO = FNMS(KP923879532, Tfl, Tfi); + } + { + E Tek, TeX, Tll, Tlm; + Tek = FMA(KP980785280, Tej, Te4); + TeX = TeD - TeW; + ri[WS(rs, 41)] = FNMS(KP773010453, TeX, Tek); + ri[WS(rs, 9)] = FMA(KP773010453, TeX, Tek); + Tll = FMA(KP980785280, Tlk, Tlj); + Tlm = Tf0 - TeZ; + ii[WS(rs, 9)] = FMA(KP773010453, Tlm, Tll); + ii[WS(rs, 41)] = FNMS(KP773010453, Tlm, Tll); + } + { + E TeY, Tf1, Tln, Tlo; + TeY = FNMS(KP980785280, Tej, Te4); + Tf1 = TeZ + Tf0; + ri[WS(rs, 25)] = FNMS(KP773010453, Tf1, TeY); + ri[WS(rs, 57)] = FMA(KP773010453, Tf1, TeY); + Tln = FNMS(KP980785280, Tlk, Tlj); + Tlo = TeD + TeW; + ii[WS(rs, 25)] = FNMS(KP773010453, Tlo, Tln); + ii[WS(rs, 57)] = FMA(KP773010453, Tlo, Tln); + } + { + E Tf6, Tfd, Tlf, Tlg; + Tf6 = FMA(KP980785280, Tf5, Tf2); + Tfd = Tf9 + Tfc; + ri[WS(rs, 33)] = FNMS(KP995184726, Tfd, Tf6); + ri[WS(rs, 1)] = FMA(KP995184726, Tfd, Tf6); + Tlf = FMA(KP980785280, Tle, Tld); + Tlg = Tff + Tfg; + ii[WS(rs, 1)] = FMA(KP995184726, Tlg, Tlf); + ii[WS(rs, 33)] = FNMS(KP995184726, Tlg, Tlf); + } + { + E Tfe, Tfh, Tlh, Tli; + Tfe = FNMS(KP980785280, Tf5, Tf2); + Tfh = Tff - Tfg; + ri[WS(rs, 49)] = FNMS(KP995184726, Tfh, Tfe); + ri[WS(rs, 17)] = FMA(KP995184726, Tfh, Tfe); + Tlh = FNMS(KP980785280, Tle, Tld); + Tli = Tfc - Tf9; + ii[WS(rs, 17)] = FMA(KP995184726, Tli, Tlh); + ii[WS(rs, 49)] = FNMS(KP995184726, Tli, Tlh); + } + { + E Tfu, TfJ, Tlt, Tlu; + Tfu = FMA(KP831469612, Tft, Tfm); + TfJ = TfB + TfI; + ri[WS(rs, 37)] = FNMS(KP881921264, TfJ, Tfu); + ri[WS(rs, 5)] = FMA(KP881921264, TfJ, Tfu); + Tlt = FMA(KP831469612, Tls, Tlr); + Tlu = TfL + TfM; + ii[WS(rs, 5)] = FMA(KP881921264, Tlu, Tlt); + ii[WS(rs, 37)] = FNMS(KP881921264, Tlu, Tlt); + } + { + E TfK, TfN, Tlv, Tlw; + TfK = FNMS(KP831469612, Tft, Tfm); + TfN = TfL - TfM; + ri[WS(rs, 53)] = FNMS(KP881921264, TfN, TfK); + ri[WS(rs, 21)] = FMA(KP881921264, TfN, TfK); + Tlv = FNMS(KP831469612, Tls, Tlr); + Tlw = TfI - TfB; + ii[WS(rs, 21)] = FMA(KP881921264, Tlw, Tlv); + ii[WS(rs, 53)] = FNMS(KP881921264, Tlw, Tlv); + } + { + E TfS, TfZ, Tlz, TlA; + TfS = FNMS(KP831469612, TfR, TfO); + TfZ = TfV - TfY; + ri[WS(rs, 45)] = FNMS(KP956940335, TfZ, TfS); + ri[WS(rs, 13)] = FMA(KP956940335, TfZ, TfS); + Tlz = FNMS(KP831469612, Tly, Tlx); + TlA = Tg2 - Tg1; + ii[WS(rs, 13)] = FMA(KP956940335, TlA, Tlz); + ii[WS(rs, 45)] = FNMS(KP956940335, TlA, Tlz); + } + { + E Tg0, Tg3, TlB, TlC; + Tg0 = FMA(KP831469612, TfR, TfO); + Tg3 = Tg1 + Tg2; + ri[WS(rs, 29)] = FNMS(KP956940335, Tg3, Tg0); + ri[WS(rs, 61)] = FMA(KP956940335, Tg3, Tg0); + TlB = FMA(KP831469612, Tly, Tlx); + TlC = TfV + TfY; + ii[WS(rs, 29)] = FNMS(KP956940335, TlC, TlB); + ii[WS(rs, 61)] = FMA(KP956940335, TlC, TlB); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 27}, + {TW_CEXP, 0, 63}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 64, "t2_64", twinstr, &GENUS, {520, 206, 634, 0}, 0, 0, 0 }; + +void X(codelet_t2_64) (planner *p) { + X(kdft_dit_register) (p, t2_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 64 -name t2_64 -include dft/scalar/t.h */ + +/* + * This function contains 1154 FP additions, 660 FP multiplications, + * (or, 880 additions, 386 multiplications, 274 fused multiply/add), + * 302 stack variables, 15 constants, and 256 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 10); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 10, MAKE_VOLATILE_STRIDE(128, rs)) { + E T2, T5, T3, T6, Te, T9, TP, T3e, T1e, T39, T3c, TT, T1a, T37, T8; + E Tw, Td, Ty, Tm, Th, T1C, T3K, T1V, T3x, T3I, T1G, T1R, T3v, T2m, T2q; + E T5Y, T6u, T53, T5B, T62, T6w, T57, T5D, T2V, T2X, Tg, TE, T3Y, T3V, T3j; + E Tl, TA, T3g, T1j, T1t, TV, T2C, T2z, T1u, TZ, T1h, To, T1p, T6j, T6H; + E Ts, T1l, T6l, T6F, T2P, T4b, T4x, T5i, T2R, T49, T4z, T5g, TG, T4k, T4m; + E TK, T21, T3O, T3Q, T25, TW, T10, T11, T79, T6X, T5M, T6b, T1v, T30, T69; + E T77, T13, T2F, T2D, T6p, T6O, T1x, T2a, T2f, T6V, T28, T6r, T2h, T6Q, T32; + E T5K, T5w, T4G, T4Q, T3m, T4h, T4I, T5y, T3k, T4f, T41, T4S, T4Y, T3q, T3D; + E T3F, T5r, T3s, T4W, T3Z, T5p; + { + E Ta, Tj, Tx, TC, Tf, Tk, Tz, TD, T1B, T1E, T2o, T2l, T1T, T1Q, T1A; + E T1F, T2p, T2k, T1U, T1P; + { + E T4, T1d, T19, Tb, T1c, T7, Tc, T18, TR, TO, TS, TN; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + Te = W[5]; + T9 = W[4]; + T4 = T2 * T3; + T1d = T5 * T9; + T19 = T5 * Te; + Tb = T2 * T6; + T1c = T2 * Te; + T7 = T5 * T6; + Tc = T5 * T3; + T18 = T2 * T9; + TR = T3 * Te; + TO = T6 * Te; + TS = T6 * T9; + TN = T3 * T9; + TP = TN - TO; + T3e = TR - TS; + T1e = T1c - T1d; + T39 = T1c + T1d; + T3c = TN + TO; + TT = TR + TS; + T1a = T18 + T19; + T37 = T18 - T19; + T8 = T4 - T7; + Ta = T8 * T9; + Tj = T8 * Te; + Tw = T4 + T7; + Tx = Tw * T9; + TC = Tw * Te; + Td = Tb + Tc; + Tf = Td * Te; + Tk = Td * T9; + Ty = Tb - Tc; + Tz = Ty * Te; + TD = Ty * T9; + Tm = W[7]; + T1B = T6 * Tm; + T1E = T3 * Tm; + T2o = T2 * Tm; + T2l = T5 * Tm; + T1T = T9 * Tm; + T1Q = Te * Tm; + Th = W[6]; + T1A = T3 * Th; + T1F = T6 * Th; + T2p = T5 * Th; + T2k = T2 * Th; + T1U = Te * Th; + T1P = T9 * Th; + } + T1C = T1A + T1B; + T3K = T1E + T1F; + T1V = T1T + T1U; + T3x = T2o - T2p; + T3I = T1A - T1B; + T1G = T1E - T1F; + T1R = T1P - T1Q; + { + E T5W, T5X, T55, T56; + T3v = T2k + T2l; + T2m = T2k - T2l; + T2q = T2o + T2p; + T5W = T8 * Th; + T5X = Td * Tm; + T5Y = T5W - T5X; + T6u = T5W + T5X; + { + E T51, T52, T60, T61; + T51 = Tw * Th; + T52 = Ty * Tm; + T53 = T51 + T52; + T5B = T51 - T52; + T60 = T8 * Tm; + T61 = Td * Th; + T62 = T60 + T61; + T6w = T60 - T61; + } + T55 = Tw * Tm; + T56 = Ty * Th; + T57 = T55 - T56; + T5D = T55 + T56; + { + E Ti, Tq, TF, TJ, T3W, T3X, T3T, T3U, T3h, T3i, Tn, Tr, TB, TI, T3d; + E T3f, T1k, T1o, T1Z, T23, TQ, TU, T2A, T2B, T2x, T2y, T20, T24, TX, TY; + E T1i, T1n; + T2V = T1P + T1Q; + T2X = T1T - T1U; + Tg = Ta + Tf; + Ti = Tg * Th; + Tq = Tg * Tm; + TE = TC + TD; + TF = TE * Tm; + TJ = TE * Th; + T3W = T37 * Tm; + T3X = T39 * Th; + T3Y = T3W - T3X; + T3T = T37 * Th; + T3U = T39 * Tm; + T3V = T3T + T3U; + T3h = T3c * Tm; + T3i = T3e * Th; + T3j = T3h - T3i; + Tl = Tj - Tk; + Tn = Tl * Tm; + Tr = Tl * Th; + TA = Tx - Tz; + TB = TA * Th; + TI = TA * Tm; + T3d = T3c * Th; + T3f = T3e * Tm; + T3g = T3d + T3f; + T1j = Tj + Tk; + T1k = T1j * Tm; + T1o = T1j * Th; + T1t = Tx + Tz; + T1Z = T1t * Th; + T23 = T1t * Tm; + TQ = TP * Th; + TU = TT * Tm; + TV = TQ + TU; + T2A = T1a * Tm; + T2B = T1e * Th; + T2C = T2A - T2B; + T2x = T1a * Th; + T2y = T1e * Tm; + T2z = T2x + T2y; + T1u = TC - TD; + T20 = T1u * Tm; + T24 = T1u * Th; + TX = TP * Tm; + TY = TT * Th; + TZ = TX - TY; + T1h = Ta - Tf; + T1i = T1h * Th; + T1n = T1h * Tm; + To = Ti - Tn; + T1p = T1n + T1o; + T6j = TQ - TU; + T6H = T2A + T2B; + Ts = Tq + Tr; + T1l = T1i - T1k; + T6l = TX + TY; + T6F = T2x - T2y; + T2P = T1Z - T20; + T4b = TI + TJ; + T4x = T3d - T3f; + T5i = T3W + T3X; + T2R = T23 + T24; + T49 = TB - TF; + T4z = T3h + T3i; + T5g = T3T - T3U; + TG = TB + TF; + T4k = Ti + Tn; + T4m = Tq - Tr; + TK = TI - TJ; + T21 = T1Z + T20; + T3O = T1i + T1k; + T3Q = T1n - T1o; + T25 = T23 - T24; + TW = W[8]; + T10 = W[9]; + T11 = FMA(TV, TW, TZ * T10); + T79 = FNMS(T25, TW, T21 * T10); + T6X = FNMS(Td, TW, T8 * T10); + T5M = FNMS(T2X, TW, T2V * T10); + T6b = FNMS(TK, TW, TG * T10); + T1v = FMA(T1t, TW, T1u * T10); + T30 = FMA(T1h, TW, T1j * T10); + T69 = FMA(TG, TW, TK * T10); + T77 = FMA(T21, TW, T25 * T10); + T13 = FNMS(TZ, TW, TV * T10); + T2F = FNMS(T2C, TW, T2z * T10); + T2D = FMA(T2z, TW, T2C * T10); + T6p = FMA(T1a, TW, T1e * T10); + T6O = FMA(TP, TW, TT * T10); + T1x = FNMS(T1u, TW, T1t * T10); + T2a = FNMS(TE, TW, TA * T10); + T2f = FMA(T3, TW, T6 * T10); + T6V = FMA(T8, TW, Td * T10); + T28 = FMA(TA, TW, TE * T10); + T6r = FNMS(T1e, TW, T1a * T10); + T2h = FNMS(T6, TW, T3 * T10); + T6Q = FNMS(TT, TW, TP * T10); + T32 = FNMS(T1j, TW, T1h * T10); + T5K = FMA(T2V, TW, T2X * T10); + T5w = FMA(Tw, TW, Ty * T10); + T4G = FMA(T3O, TW, T3Q * T10); + T4Q = FMA(T4k, TW, T4m * T10); + T3m = FNMS(T3j, TW, T3g * T10); + T4h = FNMS(Te, TW, T9 * T10); + T4I = FNMS(T3Q, TW, T3O * T10); + T5y = FNMS(Ty, TW, Tw * T10); + T3k = FMA(T3g, TW, T3j * T10); + T4f = FMA(T9, TW, Te * T10); + T41 = FNMS(T3Y, TW, T3V * T10); + T4S = FNMS(T4m, TW, T4k * T10); + T4Y = FNMS(T3e, TW, T3c * T10); + T3q = FMA(Tg, TW, Tl * T10); + T3D = FMA(T2, TW, T5 * T10); + T3F = FNMS(T5, TW, T2 * T10); + T5r = FNMS(T39, TW, T37 * T10); + T3s = FNMS(Tl, TW, Tg * T10); + T4W = FMA(T3c, TW, T3e * T10); + T3Z = FMA(T3V, TW, T3Y * T10); + T5p = FMA(T37, TW, T39 * T10); + } + } + } + { + E T17, TdV, Tj3, Tjx, T7l, TbJ, Ti3, Tix, T1K, Tiw, TdY, ThY, T7w, Tj0, TbM; + E Tjw, T2e, TgA, T7I, TaY, TbQ, Tda, Te4, TfO, T2J, TgB, T7T, TaZ, TbT, Tdb; + E Te9, TfP, T36, T3B, TgH, TgE, TgF, TgG, T80, TbW, Tel, TfT, T8b, Tc0, T8k; + E TbX, Teg, TfS, T8h, TbZ, T45, T4q, TgJ, TgK, TgL, TgM, T8r, Tc6, Tew, TfW; + E T8C, Tc4, T8L, Tc7, Ter, TfV, T8I, Tc3, T6B, Th1, Tfm, Tga, Th8, ThI, T9N; + E Tcv, T9Y, TcH, Tav, Tcw, Tf5, Tg7, Tas, TcG, T5c, TgV, TeV, Tg0, TgS, ThD; + E T8U, Tcc, T95, Tco, T9C, Tcd, TeE, Tg3, T9z, Tcn, T5R, TgT, TeO, TeW, TgY; + E ThE, T9h, T9F, T9s, T9E, Tck, Tcq, TeJ, TeX, Tch, Tcr, T7e, Th9, Tff, Tfn; + E Th4, ThJ, Taa, Tay, Tal, Tax, TcD, TcJ, Tfa, Tfo, TcA, TcK; + { + E T1, Ti1, Tu, Ti0, TM, T7i, T15, T7j, Tp, Tt; + T1 = ri[0]; + Ti1 = ii[0]; + Tp = ri[WS(rs, 32)]; + Tt = ii[WS(rs, 32)]; + Tu = FMA(To, Tp, Ts * Tt); + Ti0 = FNMS(Ts, Tp, To * Tt); + { + E TH, TL, T12, T14; + TH = ri[WS(rs, 16)]; + TL = ii[WS(rs, 16)]; + TM = FMA(TG, TH, TK * TL); + T7i = FNMS(TK, TH, TG * TL); + T12 = ri[WS(rs, 48)]; + T14 = ii[WS(rs, 48)]; + T15 = FMA(T11, T12, T13 * T14); + T7j = FNMS(T13, T12, T11 * T14); + } + { + E Tv, T16, Tj1, Tj2; + Tv = T1 + Tu; + T16 = TM + T15; + T17 = Tv + T16; + TdV = Tv - T16; + Tj1 = Ti1 - Ti0; + Tj2 = TM - T15; + Tj3 = Tj1 - Tj2; + Tjx = Tj2 + Tj1; + } + { + E T7h, T7k, ThZ, Ti2; + T7h = T1 - Tu; + T7k = T7i - T7j; + T7l = T7h - T7k; + TbJ = T7h + T7k; + ThZ = T7i + T7j; + Ti2 = Ti0 + Ti1; + Ti3 = ThZ + Ti2; + Tix = Ti2 - ThZ; + } + } + { + E T1g, T7m, T1r, T7n, T7o, T7p, T1z, T7s, T1I, T7t, T7r, T7u; + { + E T1b, T1f, T1m, T1q; + T1b = ri[WS(rs, 8)]; + T1f = ii[WS(rs, 8)]; + T1g = FMA(T1a, T1b, T1e * T1f); + T7m = FNMS(T1e, T1b, T1a * T1f); + T1m = ri[WS(rs, 40)]; + T1q = ii[WS(rs, 40)]; + T1r = FMA(T1l, T1m, T1p * T1q); + T7n = FNMS(T1p, T1m, T1l * T1q); + } + T7o = T7m - T7n; + T7p = T1g - T1r; + { + E T1w, T1y, T1D, T1H; + T1w = ri[WS(rs, 56)]; + T1y = ii[WS(rs, 56)]; + T1z = FMA(T1v, T1w, T1x * T1y); + T7s = FNMS(T1x, T1w, T1v * T1y); + T1D = ri[WS(rs, 24)]; + T1H = ii[WS(rs, 24)]; + T1I = FMA(T1C, T1D, T1G * T1H); + T7t = FNMS(T1G, T1D, T1C * T1H); + } + T7r = T1z - T1I; + T7u = T7s - T7t; + { + E T1s, T1J, TdW, TdX; + T1s = T1g + T1r; + T1J = T1z + T1I; + T1K = T1s + T1J; + Tiw = T1J - T1s; + TdW = T7m + T7n; + TdX = T7s + T7t; + TdY = TdW - TdX; + ThY = TdW + TdX; + } + { + E T7q, T7v, TbK, TbL; + T7q = T7o - T7p; + T7v = T7r + T7u; + T7w = KP707106781 * (T7q - T7v); + Tj0 = KP707106781 * (T7q + T7v); + TbK = T7p + T7o; + TbL = T7r - T7u; + TbM = KP707106781 * (TbK + TbL); + Tjw = KP707106781 * (TbL - TbK); + } + } + { + E T1Y, Te0, T7A, T7D, T2d, Te1, T7B, T7G, T7C, T7H; + { + E T1O, T7y, T1X, T7z; + { + E T1M, T1N, T1S, T1W; + T1M = ri[WS(rs, 4)]; + T1N = ii[WS(rs, 4)]; + T1O = FMA(T8, T1M, Td * T1N); + T7y = FNMS(Td, T1M, T8 * T1N); + T1S = ri[WS(rs, 36)]; + T1W = ii[WS(rs, 36)]; + T1X = FMA(T1R, T1S, T1V * T1W); + T7z = FNMS(T1V, T1S, T1R * T1W); + } + T1Y = T1O + T1X; + Te0 = T7y + T7z; + T7A = T7y - T7z; + T7D = T1O - T1X; + } + { + E T27, T7E, T2c, T7F; + { + E T22, T26, T29, T2b; + T22 = ri[WS(rs, 20)]; + T26 = ii[WS(rs, 20)]; + T27 = FMA(T21, T22, T25 * T26); + T7E = FNMS(T25, T22, T21 * T26); + T29 = ri[WS(rs, 52)]; + T2b = ii[WS(rs, 52)]; + T2c = FMA(T28, T29, T2a * T2b); + T7F = FNMS(T2a, T29, T28 * T2b); + } + T2d = T27 + T2c; + Te1 = T7E + T7F; + T7B = T27 - T2c; + T7G = T7E - T7F; + } + T2e = T1Y + T2d; + TgA = Te0 + Te1; + T7C = T7A + T7B; + T7H = T7D - T7G; + T7I = FNMS(KP923879532, T7H, KP382683432 * T7C); + TaY = FMA(KP923879532, T7C, KP382683432 * T7H); + { + E TbO, TbP, Te2, Te3; + TbO = T7A - T7B; + TbP = T7D + T7G; + TbQ = FNMS(KP382683432, TbP, KP923879532 * TbO); + Tda = FMA(KP382683432, TbO, KP923879532 * TbP); + Te2 = Te0 - Te1; + Te3 = T1Y - T2d; + Te4 = Te2 - Te3; + TfO = Te3 + Te2; + } + } + { + E T2t, Te6, T7L, T7O, T2I, Te7, T7M, T7R, T7N, T7S; + { + E T2j, T7J, T2s, T7K; + { + E T2g, T2i, T2n, T2r; + T2g = ri[WS(rs, 60)]; + T2i = ii[WS(rs, 60)]; + T2j = FMA(T2f, T2g, T2h * T2i); + T7J = FNMS(T2h, T2g, T2f * T2i); + T2n = ri[WS(rs, 28)]; + T2r = ii[WS(rs, 28)]; + T2s = FMA(T2m, T2n, T2q * T2r); + T7K = FNMS(T2q, T2n, T2m * T2r); + } + T2t = T2j + T2s; + Te6 = T7J + T7K; + T7L = T7J - T7K; + T7O = T2j - T2s; + } + { + E T2w, T7P, T2H, T7Q; + { + E T2u, T2v, T2E, T2G; + T2u = ri[WS(rs, 12)]; + T2v = ii[WS(rs, 12)]; + T2w = FMA(TP, T2u, TT * T2v); + T7P = FNMS(TT, T2u, TP * T2v); + T2E = ri[WS(rs, 44)]; + T2G = ii[WS(rs, 44)]; + T2H = FMA(T2D, T2E, T2F * T2G); + T7Q = FNMS(T2F, T2E, T2D * T2G); + } + T2I = T2w + T2H; + Te7 = T7P + T7Q; + T7M = T2w - T2H; + T7R = T7P - T7Q; + } + T2J = T2t + T2I; + TgB = Te6 + Te7; + T7N = T7L + T7M; + T7S = T7O - T7R; + T7T = FMA(KP382683432, T7N, KP923879532 * T7S); + TaZ = FNMS(KP923879532, T7N, KP382683432 * T7S); + { + E TbR, TbS, Te5, Te8; + TbR = T7L - T7M; + TbS = T7O + T7R; + TbT = FMA(KP923879532, TbR, KP382683432 * TbS); + Tdb = FNMS(KP382683432, TbR, KP923879532 * TbS); + Te5 = T2t - T2I; + Te8 = Te6 - Te7; + Te9 = Te5 + Te8; + TfP = Te5 - Te8; + } + } + { + E T2O, T7W, T2T, T7X, T2U, Tec, T2Z, T8e, T34, T8f, T35, Ted, T3p, Tei, T86; + E T89, T3A, Tej, T81, T84; + { + E T2M, T2N, T2Q, T2S; + T2M = ri[WS(rs, 2)]; + T2N = ii[WS(rs, 2)]; + T2O = FMA(Tw, T2M, Ty * T2N); + T7W = FNMS(Ty, T2M, Tw * T2N); + T2Q = ri[WS(rs, 34)]; + T2S = ii[WS(rs, 34)]; + T2T = FMA(T2P, T2Q, T2R * T2S); + T7X = FNMS(T2R, T2Q, T2P * T2S); + } + T2U = T2O + T2T; + Tec = T7W + T7X; + { + E T2W, T2Y, T31, T33; + T2W = ri[WS(rs, 18)]; + T2Y = ii[WS(rs, 18)]; + T2Z = FMA(T2V, T2W, T2X * T2Y); + T8e = FNMS(T2X, T2W, T2V * T2Y); + T31 = ri[WS(rs, 50)]; + T33 = ii[WS(rs, 50)]; + T34 = FMA(T30, T31, T32 * T33); + T8f = FNMS(T32, T31, T30 * T33); + } + T35 = T2Z + T34; + Ted = T8e + T8f; + { + E T3b, T87, T3o, T88; + { + E T38, T3a, T3l, T3n; + T38 = ri[WS(rs, 10)]; + T3a = ii[WS(rs, 10)]; + T3b = FMA(T37, T38, T39 * T3a); + T87 = FNMS(T39, T38, T37 * T3a); + T3l = ri[WS(rs, 42)]; + T3n = ii[WS(rs, 42)]; + T3o = FMA(T3k, T3l, T3m * T3n); + T88 = FNMS(T3m, T3l, T3k * T3n); + } + T3p = T3b + T3o; + Tei = T87 + T88; + T86 = T3b - T3o; + T89 = T87 - T88; + } + { + E T3u, T82, T3z, T83; + { + E T3r, T3t, T3w, T3y; + T3r = ri[WS(rs, 58)]; + T3t = ii[WS(rs, 58)]; + T3u = FMA(T3q, T3r, T3s * T3t); + T82 = FNMS(T3s, T3r, T3q * T3t); + T3w = ri[WS(rs, 26)]; + T3y = ii[WS(rs, 26)]; + T3z = FMA(T3v, T3w, T3x * T3y); + T83 = FNMS(T3x, T3w, T3v * T3y); + } + T3A = T3u + T3z; + Tej = T82 + T83; + T81 = T3u - T3z; + T84 = T82 - T83; + } + T36 = T2U + T35; + T3B = T3p + T3A; + TgH = T36 - T3B; + TgE = Tec + Ted; + TgF = Tei + Tej; + TgG = TgE - TgF; + { + E T7Y, T7Z, Teh, Tek; + T7Y = T7W - T7X; + T7Z = T2Z - T34; + T80 = T7Y + T7Z; + TbW = T7Y - T7Z; + Teh = T2U - T35; + Tek = Tei - Tej; + Tel = Teh - Tek; + TfT = Teh + Tek; + } + { + E T85, T8a, T8i, T8j; + T85 = T81 - T84; + T8a = T86 + T89; + T8b = KP707106781 * (T85 - T8a); + Tc0 = KP707106781 * (T8a + T85); + T8i = T89 - T86; + T8j = T81 + T84; + T8k = KP707106781 * (T8i - T8j); + TbX = KP707106781 * (T8i + T8j); + } + { + E Tee, Tef, T8d, T8g; + Tee = Tec - Ted; + Tef = T3A - T3p; + Teg = Tee - Tef; + TfS = Tee + Tef; + T8d = T2O - T2T; + T8g = T8e - T8f; + T8h = T8d - T8g; + TbZ = T8d + T8g; + } + } + { + E T3H, T8n, T3M, T8o, T3N, Ten, T3S, T8F, T43, T8G, T44, Teo, T4e, Tet, T8x; + E T8A, T4p, Teu, T8s, T8v; + { + E T3E, T3G, T3J, T3L; + T3E = ri[WS(rs, 62)]; + T3G = ii[WS(rs, 62)]; + T3H = FMA(T3D, T3E, T3F * T3G); + T8n = FNMS(T3F, T3E, T3D * T3G); + T3J = ri[WS(rs, 30)]; + T3L = ii[WS(rs, 30)]; + T3M = FMA(T3I, T3J, T3K * T3L); + T8o = FNMS(T3K, T3J, T3I * T3L); + } + T3N = T3H + T3M; + Ten = T8n + T8o; + { + E T3P, T3R, T40, T42; + T3P = ri[WS(rs, 14)]; + T3R = ii[WS(rs, 14)]; + T3S = FMA(T3O, T3P, T3Q * T3R); + T8F = FNMS(T3Q, T3P, T3O * T3R); + T40 = ri[WS(rs, 46)]; + T42 = ii[WS(rs, 46)]; + T43 = FMA(T3Z, T40, T41 * T42); + T8G = FNMS(T41, T40, T3Z * T42); + } + T44 = T3S + T43; + Teo = T8F + T8G; + { + E T48, T8y, T4d, T8z; + { + E T46, T47, T4a, T4c; + T46 = ri[WS(rs, 6)]; + T47 = ii[WS(rs, 6)]; + T48 = FMA(T3c, T46, T3e * T47); + T8y = FNMS(T3e, T46, T3c * T47); + T4a = ri[WS(rs, 38)]; + T4c = ii[WS(rs, 38)]; + T4d = FMA(T49, T4a, T4b * T4c); + T8z = FNMS(T4b, T4a, T49 * T4c); + } + T4e = T48 + T4d; + Tet = T8y + T8z; + T8x = T48 - T4d; + T8A = T8y - T8z; + } + { + E T4j, T8t, T4o, T8u; + { + E T4g, T4i, T4l, T4n; + T4g = ri[WS(rs, 54)]; + T4i = ii[WS(rs, 54)]; + T4j = FMA(T4f, T4g, T4h * T4i); + T8t = FNMS(T4h, T4g, T4f * T4i); + T4l = ri[WS(rs, 22)]; + T4n = ii[WS(rs, 22)]; + T4o = FMA(T4k, T4l, T4m * T4n); + T8u = FNMS(T4m, T4l, T4k * T4n); + } + T4p = T4j + T4o; + Teu = T8t + T8u; + T8s = T4j - T4o; + T8v = T8t - T8u; + } + T45 = T3N + T44; + T4q = T4e + T4p; + TgJ = T45 - T4q; + TgK = Ten + Teo; + TgL = Tet + Teu; + TgM = TgK - TgL; + { + E T8p, T8q, Tes, Tev; + T8p = T8n - T8o; + T8q = T3S - T43; + T8r = T8p + T8q; + Tc6 = T8p - T8q; + Tes = T3N - T44; + Tev = Tet - Teu; + Tew = Tes - Tev; + TfW = Tes + Tev; + } + { + E T8w, T8B, T8J, T8K; + T8w = T8s - T8v; + T8B = T8x + T8A; + T8C = KP707106781 * (T8w - T8B); + Tc4 = KP707106781 * (T8B + T8w); + T8J = T8A - T8x; + T8K = T8s + T8v; + T8L = KP707106781 * (T8J - T8K); + Tc7 = KP707106781 * (T8J + T8K); + } + { + E Tep, Teq, T8E, T8H; + Tep = Ten - Teo; + Teq = T4p - T4e; + Ter = Tep - Teq; + TfV = Tep + Teq; + T8E = T3H - T3M; + T8H = T8F - T8G; + T8I = T8E - T8H; + Tc3 = T8E + T8H; + } + } + { + E T5V, Tao, T64, Tap, T65, Tfi, T68, T9K, T6d, T9L, T6e, Tfj, T6o, Tf2, T9Q; + E T9R, T6z, Tf3, T9T, T9W; + { + E T5T, T5U, T5Z, T63; + T5T = ri[WS(rs, 63)]; + T5U = ii[WS(rs, 63)]; + T5V = FMA(TW, T5T, T10 * T5U); + Tao = FNMS(T10, T5T, TW * T5U); + T5Z = ri[WS(rs, 31)]; + T63 = ii[WS(rs, 31)]; + T64 = FMA(T5Y, T5Z, T62 * T63); + Tap = FNMS(T62, T5Z, T5Y * T63); + } + T65 = T5V + T64; + Tfi = Tao + Tap; + { + E T66, T67, T6a, T6c; + T66 = ri[WS(rs, 15)]; + T67 = ii[WS(rs, 15)]; + T68 = FMA(TV, T66, TZ * T67); + T9K = FNMS(TZ, T66, TV * T67); + T6a = ri[WS(rs, 47)]; + T6c = ii[WS(rs, 47)]; + T6d = FMA(T69, T6a, T6b * T6c); + T9L = FNMS(T6b, T6a, T69 * T6c); + } + T6e = T68 + T6d; + Tfj = T9K + T9L; + { + E T6i, T9O, T6n, T9P; + { + E T6g, T6h, T6k, T6m; + T6g = ri[WS(rs, 7)]; + T6h = ii[WS(rs, 7)]; + T6i = FMA(T1t, T6g, T1u * T6h); + T9O = FNMS(T1u, T6g, T1t * T6h); + T6k = ri[WS(rs, 39)]; + T6m = ii[WS(rs, 39)]; + T6n = FMA(T6j, T6k, T6l * T6m); + T9P = FNMS(T6l, T6k, T6j * T6m); + } + T6o = T6i + T6n; + Tf2 = T9O + T9P; + T9Q = T9O - T9P; + T9R = T6i - T6n; + } + { + E T6t, T9U, T6y, T9V; + { + E T6q, T6s, T6v, T6x; + T6q = ri[WS(rs, 55)]; + T6s = ii[WS(rs, 55)]; + T6t = FMA(T6p, T6q, T6r * T6s); + T9U = FNMS(T6r, T6q, T6p * T6s); + T6v = ri[WS(rs, 23)]; + T6x = ii[WS(rs, 23)]; + T6y = FMA(T6u, T6v, T6w * T6x); + T9V = FNMS(T6w, T6v, T6u * T6x); + } + T6z = T6t + T6y; + Tf3 = T9U + T9V; + T9T = T6t - T6y; + T9W = T9U - T9V; + } + { + E T6f, T6A, Tfk, Tfl; + T6f = T65 + T6e; + T6A = T6o + T6z; + T6B = T6f + T6A; + Th1 = T6f - T6A; + Tfk = Tfi - Tfj; + Tfl = T6z - T6o; + Tfm = Tfk - Tfl; + Tga = Tfk + Tfl; + } + { + E Th6, Th7, T9J, T9M; + Th6 = Tfi + Tfj; + Th7 = Tf2 + Tf3; + Th8 = Th6 - Th7; + ThI = Th6 + Th7; + T9J = T5V - T64; + T9M = T9K - T9L; + T9N = T9J - T9M; + Tcv = T9J + T9M; + } + { + E T9S, T9X, Tat, Tau; + T9S = T9Q - T9R; + T9X = T9T + T9W; + T9Y = KP707106781 * (T9S - T9X); + TcH = KP707106781 * (T9S + T9X); + Tat = T9T - T9W; + Tau = T9R + T9Q; + Tav = KP707106781 * (Tat - Tau); + Tcw = KP707106781 * (Tau + Tat); + } + { + E Tf1, Tf4, Taq, Tar; + Tf1 = T65 - T6e; + Tf4 = Tf2 - Tf3; + Tf5 = Tf1 - Tf4; + Tg7 = Tf1 + Tf4; + Taq = Tao - Tap; + Tar = T68 - T6d; + Tas = Taq + Tar; + TcG = Taq - Tar; + } + } + { + E T4w, T8Q, T4B, T8R, T4C, TeA, T4F, T9w, T4K, T9x, T4L, TeB, T4V, TeS, T90; + E T93, T5a, TeT, T8V, T8Y; + { + E T4u, T4v, T4y, T4A; + T4u = ri[WS(rs, 1)]; + T4v = ii[WS(rs, 1)]; + T4w = FMA(T2, T4u, T5 * T4v); + T8Q = FNMS(T5, T4u, T2 * T4v); + T4y = ri[WS(rs, 33)]; + T4A = ii[WS(rs, 33)]; + T4B = FMA(T4x, T4y, T4z * T4A); + T8R = FNMS(T4z, T4y, T4x * T4A); + } + T4C = T4w + T4B; + TeA = T8Q + T8R; + { + E T4D, T4E, T4H, T4J; + T4D = ri[WS(rs, 17)]; + T4E = ii[WS(rs, 17)]; + T4F = FMA(T3V, T4D, T3Y * T4E); + T9w = FNMS(T3Y, T4D, T3V * T4E); + T4H = ri[WS(rs, 49)]; + T4J = ii[WS(rs, 49)]; + T4K = FMA(T4G, T4H, T4I * T4J); + T9x = FNMS(T4I, T4H, T4G * T4J); + } + T4L = T4F + T4K; + TeB = T9w + T9x; + { + E T4P, T91, T4U, T92; + { + E T4N, T4O, T4R, T4T; + T4N = ri[WS(rs, 9)]; + T4O = ii[WS(rs, 9)]; + T4P = FMA(T9, T4N, Te * T4O); + T91 = FNMS(Te, T4N, T9 * T4O); + T4R = ri[WS(rs, 41)]; + T4T = ii[WS(rs, 41)]; + T4U = FMA(T4Q, T4R, T4S * T4T); + T92 = FNMS(T4S, T4R, T4Q * T4T); + } + T4V = T4P + T4U; + TeS = T91 + T92; + T90 = T4P - T4U; + T93 = T91 - T92; + } + { + E T50, T8W, T59, T8X; + { + E T4X, T4Z, T54, T58; + T4X = ri[WS(rs, 57)]; + T4Z = ii[WS(rs, 57)]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T8W = FNMS(T4Y, T4X, T4W * T4Z); + T54 = ri[WS(rs, 25)]; + T58 = ii[WS(rs, 25)]; + T59 = FMA(T53, T54, T57 * T58); + T8X = FNMS(T57, T54, T53 * T58); + } + T5a = T50 + T59; + TeT = T8W + T8X; + T8V = T50 - T59; + T8Y = T8W - T8X; + } + { + E T4M, T5b, TeR, TeU; + T4M = T4C + T4L; + T5b = T4V + T5a; + T5c = T4M + T5b; + TgV = T4M - T5b; + TeR = T4C - T4L; + TeU = TeS - TeT; + TeV = TeR - TeU; + Tg0 = TeR + TeU; + } + { + E TgQ, TgR, T8S, T8T; + TgQ = TeA + TeB; + TgR = TeS + TeT; + TgS = TgQ - TgR; + ThD = TgQ + TgR; + T8S = T8Q - T8R; + T8T = T4F - T4K; + T8U = T8S + T8T; + Tcc = T8S - T8T; + } + { + E T8Z, T94, T9A, T9B; + T8Z = T8V - T8Y; + T94 = T90 + T93; + T95 = KP707106781 * (T8Z - T94); + Tco = KP707106781 * (T94 + T8Z); + T9A = T93 - T90; + T9B = T8V + T8Y; + T9C = KP707106781 * (T9A - T9B); + Tcd = KP707106781 * (T9A + T9B); + } + { + E TeC, TeD, T9v, T9y; + TeC = TeA - TeB; + TeD = T5a - T4V; + TeE = TeC - TeD; + Tg3 = TeC + TeD; + T9v = T4w - T4B; + T9y = T9w - T9x; + T9z = T9v - T9y; + Tcn = T9v + T9y; + } + } + { + E T5l, TeL, T9k, T9n, T5P, TeH, T9a, T9f, T5u, TeM, T9l, T9q, T5G, TeG, T97; + E T9e; + { + E T5f, T9i, T5k, T9j; + { + E T5d, T5e, T5h, T5j; + T5d = ri[WS(rs, 5)]; + T5e = ii[WS(rs, 5)]; + T5f = FMA(Tg, T5d, Tl * T5e); + T9i = FNMS(Tl, T5d, Tg * T5e); + T5h = ri[WS(rs, 37)]; + T5j = ii[WS(rs, 37)]; + T5k = FMA(T5g, T5h, T5i * T5j); + T9j = FNMS(T5i, T5h, T5g * T5j); + } + T5l = T5f + T5k; + TeL = T9i + T9j; + T9k = T9i - T9j; + T9n = T5f - T5k; + } + { + E T5J, T98, T5O, T99; + { + E T5H, T5I, T5L, T5N; + T5H = ri[WS(rs, 13)]; + T5I = ii[WS(rs, 13)]; + T5J = FMA(T1h, T5H, T1j * T5I); + T98 = FNMS(T1j, T5H, T1h * T5I); + T5L = ri[WS(rs, 45)]; + T5N = ii[WS(rs, 45)]; + T5O = FMA(T5K, T5L, T5M * T5N); + T99 = FNMS(T5M, T5L, T5K * T5N); + } + T5P = T5J + T5O; + TeH = T98 + T99; + T9a = T98 - T99; + T9f = T5J - T5O; + } + { + E T5o, T9o, T5t, T9p; + { + E T5m, T5n, T5q, T5s; + T5m = ri[WS(rs, 21)]; + T5n = ii[WS(rs, 21)]; + T5o = FMA(T3g, T5m, T3j * T5n); + T9o = FNMS(T3j, T5m, T3g * T5n); + T5q = ri[WS(rs, 53)]; + T5s = ii[WS(rs, 53)]; + T5t = FMA(T5p, T5q, T5r * T5s); + T9p = FNMS(T5r, T5q, T5p * T5s); + } + T5u = T5o + T5t; + TeM = T9o + T9p; + T9l = T5o - T5t; + T9q = T9o - T9p; + } + { + E T5A, T9c, T5F, T9d; + { + E T5x, T5z, T5C, T5E; + T5x = ri[WS(rs, 61)]; + T5z = ii[WS(rs, 61)]; + T5A = FMA(T5w, T5x, T5y * T5z); + T9c = FNMS(T5y, T5x, T5w * T5z); + T5C = ri[WS(rs, 29)]; + T5E = ii[WS(rs, 29)]; + T5F = FMA(T5B, T5C, T5D * T5E); + T9d = FNMS(T5D, T5C, T5B * T5E); + } + T5G = T5A + T5F; + TeG = T9c + T9d; + T97 = T5A - T5F; + T9e = T9c - T9d; + } + { + E T5v, T5Q, TeK, TeN; + T5v = T5l + T5u; + T5Q = T5G + T5P; + T5R = T5v + T5Q; + TgT = T5Q - T5v; + TeK = T5l - T5u; + TeN = TeL - TeM; + TeO = TeK + TeN; + TeW = TeN - TeK; + } + { + E TgW, TgX, T9b, T9g; + TgW = TeL + TeM; + TgX = TeG + TeH; + TgY = TgW - TgX; + ThE = TgW + TgX; + T9b = T97 - T9a; + T9g = T9e + T9f; + T9h = FNMS(KP923879532, T9g, KP382683432 * T9b); + T9F = FMA(KP382683432, T9g, KP923879532 * T9b); + } + { + E T9m, T9r, Tci, Tcj; + T9m = T9k + T9l; + T9r = T9n - T9q; + T9s = FMA(KP923879532, T9m, KP382683432 * T9r); + T9E = FNMS(KP923879532, T9r, KP382683432 * T9m); + Tci = T9k - T9l; + Tcj = T9n + T9q; + Tck = FMA(KP382683432, Tci, KP923879532 * Tcj); + Tcq = FNMS(KP382683432, Tcj, KP923879532 * Tci); + } + { + E TeF, TeI, Tcf, Tcg; + TeF = T5G - T5P; + TeI = TeG - TeH; + TeJ = TeF - TeI; + TeX = TeF + TeI; + Tcf = T97 + T9a; + Tcg = T9e - T9f; + Tch = FNMS(KP382683432, Tcg, KP923879532 * Tcf); + Tcr = FMA(KP923879532, Tcg, KP382683432 * Tcf); + } + } + { + E T6K, Tf6, Ta2, Ta5, T7c, Tfd, Tae, Taj, T6T, Tf7, Ta3, Ta8, T73, Tfc, Tad; + E Tag; + { + E T6E, Ta0, T6J, Ta1; + { + E T6C, T6D, T6G, T6I; + T6C = ri[WS(rs, 3)]; + T6D = ii[WS(rs, 3)]; + T6E = FMA(T3, T6C, T6 * T6D); + Ta0 = FNMS(T6, T6C, T3 * T6D); + T6G = ri[WS(rs, 35)]; + T6I = ii[WS(rs, 35)]; + T6J = FMA(T6F, T6G, T6H * T6I); + Ta1 = FNMS(T6H, T6G, T6F * T6I); + } + T6K = T6E + T6J; + Tf6 = Ta0 + Ta1; + Ta2 = Ta0 - Ta1; + Ta5 = T6E - T6J; + } + { + E T76, Tah, T7b, Tai; + { + E T74, T75, T78, T7a; + T74 = ri[WS(rs, 11)]; + T75 = ii[WS(rs, 11)]; + T76 = FMA(TA, T74, TE * T75); + Tah = FNMS(TE, T74, TA * T75); + T78 = ri[WS(rs, 43)]; + T7a = ii[WS(rs, 43)]; + T7b = FMA(T77, T78, T79 * T7a); + Tai = FNMS(T79, T78, T77 * T7a); + } + T7c = T76 + T7b; + Tfd = Tah + Tai; + Tae = T76 - T7b; + Taj = Tah - Tai; + } + { + E T6N, Ta6, T6S, Ta7; + { + E T6L, T6M, T6P, T6R; + T6L = ri[WS(rs, 19)]; + T6M = ii[WS(rs, 19)]; + T6N = FMA(T2z, T6L, T2C * T6M); + Ta6 = FNMS(T2C, T6L, T2z * T6M); + T6P = ri[WS(rs, 51)]; + T6R = ii[WS(rs, 51)]; + T6S = FMA(T6O, T6P, T6Q * T6R); + Ta7 = FNMS(T6Q, T6P, T6O * T6R); + } + T6T = T6N + T6S; + Tf7 = Ta6 + Ta7; + Ta3 = T6N - T6S; + Ta8 = Ta6 - Ta7; + } + { + E T6Z, Tab, T72, Tac; + { + E T6W, T6Y, T70, T71; + T6W = ri[WS(rs, 59)]; + T6Y = ii[WS(rs, 59)]; + T6Z = FMA(T6V, T6W, T6X * T6Y); + Tab = FNMS(T6X, T6W, T6V * T6Y); + T70 = ri[WS(rs, 27)]; + T71 = ii[WS(rs, 27)]; + T72 = FMA(Th, T70, Tm * T71); + Tac = FNMS(Tm, T70, Th * T71); + } + T73 = T6Z + T72; + Tfc = Tab + Tac; + Tad = Tab - Tac; + Tag = T6Z - T72; + } + { + E T6U, T7d, Tfb, Tfe; + T6U = T6K + T6T; + T7d = T73 + T7c; + T7e = T6U + T7d; + Th9 = T7d - T6U; + Tfb = T73 - T7c; + Tfe = Tfc - Tfd; + Tff = Tfb + Tfe; + Tfn = Tfb - Tfe; + } + { + E Th2, Th3, Ta4, Ta9; + Th2 = Tf6 + Tf7; + Th3 = Tfc + Tfd; + Th4 = Th2 - Th3; + ThJ = Th2 + Th3; + Ta4 = Ta2 + Ta3; + Ta9 = Ta5 - Ta8; + Taa = FNMS(KP923879532, Ta9, KP382683432 * Ta4); + Tay = FMA(KP923879532, Ta4, KP382683432 * Ta9); + } + { + E Taf, Tak, TcB, TcC; + Taf = Tad + Tae; + Tak = Tag - Taj; + Tal = FMA(KP382683432, Taf, KP923879532 * Tak); + Tax = FNMS(KP923879532, Taf, KP382683432 * Tak); + TcB = Tad - Tae; + TcC = Tag + Taj; + TcD = FMA(KP923879532, TcB, KP382683432 * TcC); + TcJ = FNMS(KP382683432, TcB, KP923879532 * TcC); + } + { + E Tf8, Tf9, Tcy, Tcz; + Tf8 = Tf6 - Tf7; + Tf9 = T6K - T6T; + Tfa = Tf8 - Tf9; + Tfo = Tf9 + Tf8; + Tcy = Ta2 - Ta3; + Tcz = Ta5 + Ta8; + TcA = FNMS(KP382683432, Tcz, KP923879532 * Tcy); + TcK = FMA(KP382683432, Tcy, KP923879532 * Tcz); + } + } + { + E T2L, Thx, ThU, ThV, Ti5, Tib, T4s, Tia, T7g, Ti7, ThG, ThO, ThL, ThP, ThA; + E ThW; + { + E T1L, T2K, ThS, ThT; + T1L = T17 + T1K; + T2K = T2e + T2J; + T2L = T1L + T2K; + Thx = T1L - T2K; + ThS = ThD + ThE; + ThT = ThI + ThJ; + ThU = ThS - ThT; + ThV = ThS + ThT; + } + { + E ThX, Ti4, T3C, T4r; + ThX = TgA + TgB; + Ti4 = ThY + Ti3; + Ti5 = ThX + Ti4; + Tib = Ti4 - ThX; + T3C = T36 + T3B; + T4r = T45 + T4q; + T4s = T3C + T4r; + Tia = T4r - T3C; + } + { + E T5S, T7f, ThC, ThF; + T5S = T5c + T5R; + T7f = T6B + T7e; + T7g = T5S + T7f; + Ti7 = T7f - T5S; + ThC = T5c - T5R; + ThF = ThD - ThE; + ThG = ThC + ThF; + ThO = ThF - ThC; + } + { + E ThH, ThK, Thy, Thz; + ThH = T6B - T7e; + ThK = ThI - ThJ; + ThL = ThH - ThK; + ThP = ThH + ThK; + Thy = TgE + TgF; + Thz = TgK + TgL; + ThA = Thy - Thz; + ThW = Thy + Thz; + } + { + E T4t, Ti6, ThR, Ti8; + T4t = T2L + T4s; + ri[WS(rs, 32)] = T4t - T7g; + ri[0] = T4t + T7g; + Ti6 = ThW + Ti5; + ii[0] = ThV + Ti6; + ii[WS(rs, 32)] = Ti6 - ThV; + ThR = T2L - T4s; + ri[WS(rs, 48)] = ThR - ThU; + ri[WS(rs, 16)] = ThR + ThU; + Ti8 = Ti5 - ThW; + ii[WS(rs, 16)] = Ti7 + Ti8; + ii[WS(rs, 48)] = Ti8 - Ti7; + } + { + E ThB, ThM, Ti9, Tic; + ThB = Thx + ThA; + ThM = KP707106781 * (ThG + ThL); + ri[WS(rs, 40)] = ThB - ThM; + ri[WS(rs, 8)] = ThB + ThM; + Ti9 = KP707106781 * (ThO + ThP); + Tic = Tia + Tib; + ii[WS(rs, 8)] = Ti9 + Tic; + ii[WS(rs, 40)] = Tic - Ti9; + } + { + E ThN, ThQ, Tid, Tie; + ThN = Thx - ThA; + ThQ = KP707106781 * (ThO - ThP); + ri[WS(rs, 56)] = ThN - ThQ; + ri[WS(rs, 24)] = ThN + ThQ; + Tid = KP707106781 * (ThL - ThG); + Tie = Tib - Tia; + ii[WS(rs, 24)] = Tid + Tie; + ii[WS(rs, 56)] = Tie - Tid; + } + } + { + E TgD, Thh, Thr, Thv, Tij, Tip, TgO, Tig, Th0, The, Thk, Tio, Tho, Thu, Thb; + E Thf; + { + E Tgz, TgC, Thp, Thq; + Tgz = T17 - T1K; + TgC = TgA - TgB; + TgD = Tgz - TgC; + Thh = Tgz + TgC; + Thp = Th1 + Th4; + Thq = Th8 + Th9; + Thr = FNMS(KP382683432, Thq, KP923879532 * Thp); + Thv = FMA(KP923879532, Thq, KP382683432 * Thp); + } + { + E Tih, Tii, TgI, TgN; + Tih = T2J - T2e; + Tii = Ti3 - ThY; + Tij = Tih + Tii; + Tip = Tii - Tih; + TgI = TgG - TgH; + TgN = TgJ + TgM; + TgO = KP707106781 * (TgI - TgN); + Tig = KP707106781 * (TgI + TgN); + } + { + E TgU, TgZ, Thi, Thj; + TgU = TgS - TgT; + TgZ = TgV - TgY; + Th0 = FMA(KP923879532, TgU, KP382683432 * TgZ); + The = FNMS(KP923879532, TgZ, KP382683432 * TgU); + Thi = TgH + TgG; + Thj = TgJ - TgM; + Thk = KP707106781 * (Thi + Thj); + Tio = KP707106781 * (Thj - Thi); + } + { + E Thm, Thn, Th5, Tha; + Thm = TgS + TgT; + Thn = TgV + TgY; + Tho = FMA(KP382683432, Thm, KP923879532 * Thn); + Thu = FNMS(KP382683432, Thn, KP923879532 * Thm); + Th5 = Th1 - Th4; + Tha = Th8 - Th9; + Thb = FNMS(KP923879532, Tha, KP382683432 * Th5); + Thf = FMA(KP382683432, Tha, KP923879532 * Th5); + } + { + E TgP, Thc, Tin, Tiq; + TgP = TgD + TgO; + Thc = Th0 + Thb; + ri[WS(rs, 44)] = TgP - Thc; + ri[WS(rs, 12)] = TgP + Thc; + Tin = The + Thf; + Tiq = Tio + Tip; + ii[WS(rs, 12)] = Tin + Tiq; + ii[WS(rs, 44)] = Tiq - Tin; + } + { + E Thd, Thg, Tir, Tis; + Thd = TgD - TgO; + Thg = The - Thf; + ri[WS(rs, 60)] = Thd - Thg; + ri[WS(rs, 28)] = Thd + Thg; + Tir = Thb - Th0; + Tis = Tip - Tio; + ii[WS(rs, 28)] = Tir + Tis; + ii[WS(rs, 60)] = Tis - Tir; + } + { + E Thl, Ths, Tif, Tik; + Thl = Thh + Thk; + Ths = Tho + Thr; + ri[WS(rs, 36)] = Thl - Ths; + ri[WS(rs, 4)] = Thl + Ths; + Tif = Thu + Thv; + Tik = Tig + Tij; + ii[WS(rs, 4)] = Tif + Tik; + ii[WS(rs, 36)] = Tik - Tif; + } + { + E Tht, Thw, Til, Tim; + Tht = Thh - Thk; + Thw = Thu - Thv; + ri[WS(rs, 52)] = Tht - Thw; + ri[WS(rs, 20)] = Tht + Thw; + Til = Thr - Tho; + Tim = Tij - Tig; + ii[WS(rs, 20)] = Til + Tim; + ii[WS(rs, 52)] = Tim - Til; + } + } + { + E Teb, Tfx, Tey, TiK, TiN, TiT, TfA, TiS, Tfr, TfL, Tfv, TfH, Tf0, TfK, Tfu; + E TfE; + { + E TdZ, Tea, Tfy, Tfz; + TdZ = TdV - TdY; + Tea = KP707106781 * (Te4 - Te9); + Teb = TdZ - Tea; + Tfx = TdZ + Tea; + { + E Tem, Tex, TiL, TiM; + Tem = FNMS(KP923879532, Tel, KP382683432 * Teg); + Tex = FMA(KP382683432, Ter, KP923879532 * Tew); + Tey = Tem - Tex; + TiK = Tem + Tex; + TiL = KP707106781 * (TfP - TfO); + TiM = Tix - Tiw; + TiN = TiL + TiM; + TiT = TiM - TiL; + } + Tfy = FMA(KP923879532, Teg, KP382683432 * Tel); + Tfz = FNMS(KP923879532, Ter, KP382683432 * Tew); + TfA = Tfy + Tfz; + TiS = Tfz - Tfy; + { + E Tfh, TfF, Tfq, TfG, Tfg, Tfp; + Tfg = KP707106781 * (Tfa - Tff); + Tfh = Tf5 - Tfg; + TfF = Tf5 + Tfg; + Tfp = KP707106781 * (Tfn - Tfo); + Tfq = Tfm - Tfp; + TfG = Tfm + Tfp; + Tfr = FNMS(KP980785280, Tfq, KP195090322 * Tfh); + TfL = FMA(KP831469612, TfG, KP555570233 * TfF); + Tfv = FMA(KP195090322, Tfq, KP980785280 * Tfh); + TfH = FNMS(KP555570233, TfG, KP831469612 * TfF); + } + { + E TeQ, TfC, TeZ, TfD, TeP, TeY; + TeP = KP707106781 * (TeJ - TeO); + TeQ = TeE - TeP; + TfC = TeE + TeP; + TeY = KP707106781 * (TeW - TeX); + TeZ = TeV - TeY; + TfD = TeV + TeY; + Tf0 = FMA(KP980785280, TeQ, KP195090322 * TeZ); + TfK = FNMS(KP555570233, TfD, KP831469612 * TfC); + Tfu = FNMS(KP980785280, TeZ, KP195090322 * TeQ); + TfE = FMA(KP555570233, TfC, KP831469612 * TfD); + } + } + { + E Tez, Tfs, TiR, TiU; + Tez = Teb + Tey; + Tfs = Tf0 + Tfr; + ri[WS(rs, 46)] = Tez - Tfs; + ri[WS(rs, 14)] = Tez + Tfs; + TiR = Tfu + Tfv; + TiU = TiS + TiT; + ii[WS(rs, 14)] = TiR + TiU; + ii[WS(rs, 46)] = TiU - TiR; + } + { + E Tft, Tfw, TiV, TiW; + Tft = Teb - Tey; + Tfw = Tfu - Tfv; + ri[WS(rs, 62)] = Tft - Tfw; + ri[WS(rs, 30)] = Tft + Tfw; + TiV = Tfr - Tf0; + TiW = TiT - TiS; + ii[WS(rs, 30)] = TiV + TiW; + ii[WS(rs, 62)] = TiW - TiV; + } + { + E TfB, TfI, TiJ, TiO; + TfB = Tfx + TfA; + TfI = TfE + TfH; + ri[WS(rs, 38)] = TfB - TfI; + ri[WS(rs, 6)] = TfB + TfI; + TiJ = TfK + TfL; + TiO = TiK + TiN; + ii[WS(rs, 6)] = TiJ + TiO; + ii[WS(rs, 38)] = TiO - TiJ; + } + { + E TfJ, TfM, TiP, TiQ; + TfJ = Tfx - TfA; + TfM = TfK - TfL; + ri[WS(rs, 54)] = TfJ - TfM; + ri[WS(rs, 22)] = TfJ + TfM; + TiP = TfH - TfE; + TiQ = TiN - TiK; + ii[WS(rs, 22)] = TiP + TiQ; + ii[WS(rs, 54)] = TiQ - TiP; + } + } + { + E TfR, Tgj, TfY, Tiu, Tiz, TiF, Tgm, TiE, Tgd, Tgx, Tgh, Tgt, Tg6, Tgw, Tgg; + E Tgq; + { + E TfN, TfQ, Tgk, Tgl; + TfN = TdV + TdY; + TfQ = KP707106781 * (TfO + TfP); + TfR = TfN - TfQ; + Tgj = TfN + TfQ; + { + E TfU, TfX, Tiv, Tiy; + TfU = FNMS(KP382683432, TfT, KP923879532 * TfS); + TfX = FMA(KP923879532, TfV, KP382683432 * TfW); + TfY = TfU - TfX; + Tiu = TfU + TfX; + Tiv = KP707106781 * (Te4 + Te9); + Tiy = Tiw + Tix; + Tiz = Tiv + Tiy; + TiF = Tiy - Tiv; + } + Tgk = FMA(KP382683432, TfS, KP923879532 * TfT); + Tgl = FNMS(KP382683432, TfV, KP923879532 * TfW); + Tgm = Tgk + Tgl; + TiE = Tgl - Tgk; + { + E Tg9, Tgr, Tgc, Tgs, Tg8, Tgb; + Tg8 = KP707106781 * (Tfo + Tfn); + Tg9 = Tg7 - Tg8; + Tgr = Tg7 + Tg8; + Tgb = KP707106781 * (Tfa + Tff); + Tgc = Tga - Tgb; + Tgs = Tga + Tgb; + Tgd = FNMS(KP831469612, Tgc, KP555570233 * Tg9); + Tgx = FMA(KP195090322, Tgr, KP980785280 * Tgs); + Tgh = FMA(KP831469612, Tg9, KP555570233 * Tgc); + Tgt = FNMS(KP195090322, Tgs, KP980785280 * Tgr); + } + { + E Tg2, Tgo, Tg5, Tgp, Tg1, Tg4; + Tg1 = KP707106781 * (TeO + TeJ); + Tg2 = Tg0 - Tg1; + Tgo = Tg0 + Tg1; + Tg4 = KP707106781 * (TeW + TeX); + Tg5 = Tg3 - Tg4; + Tgp = Tg3 + Tg4; + Tg6 = FMA(KP555570233, Tg2, KP831469612 * Tg5); + Tgw = FNMS(KP195090322, Tgo, KP980785280 * Tgp); + Tgg = FNMS(KP831469612, Tg2, KP555570233 * Tg5); + Tgq = FMA(KP980785280, Tgo, KP195090322 * Tgp); + } + } + { + E TfZ, Tge, TiD, TiG; + TfZ = TfR + TfY; + Tge = Tg6 + Tgd; + ri[WS(rs, 42)] = TfZ - Tge; + ri[WS(rs, 10)] = TfZ + Tge; + TiD = Tgg + Tgh; + TiG = TiE + TiF; + ii[WS(rs, 10)] = TiD + TiG; + ii[WS(rs, 42)] = TiG - TiD; + } + { + E Tgf, Tgi, TiH, TiI; + Tgf = TfR - TfY; + Tgi = Tgg - Tgh; + ri[WS(rs, 58)] = Tgf - Tgi; + ri[WS(rs, 26)] = Tgf + Tgi; + TiH = Tgd - Tg6; + TiI = TiF - TiE; + ii[WS(rs, 26)] = TiH + TiI; + ii[WS(rs, 58)] = TiI - TiH; + } + { + E Tgn, Tgu, Tit, TiA; + Tgn = Tgj + Tgm; + Tgu = Tgq + Tgt; + ri[WS(rs, 34)] = Tgn - Tgu; + ri[WS(rs, 2)] = Tgn + Tgu; + Tit = Tgw + Tgx; + TiA = Tiu + Tiz; + ii[WS(rs, 2)] = Tit + TiA; + ii[WS(rs, 34)] = TiA - Tit; + } + { + E Tgv, Tgy, TiB, TiC; + Tgv = Tgj - Tgm; + Tgy = Tgw - Tgx; + ri[WS(rs, 50)] = Tgv - Tgy; + ri[WS(rs, 18)] = Tgv + Tgy; + TiB = Tgt - Tgq; + TiC = Tiz - Tiu; + ii[WS(rs, 18)] = TiB + TiC; + ii[WS(rs, 50)] = TiC - TiB; + } + } + { + E T7V, TaH, TjN, TjT, T8O, TjS, TaK, TjK, T9I, TaU, TaE, TaO, TaB, TaV, TaF; + E TaR; + { + E T7x, T7U, TjL, TjM; + T7x = T7l - T7w; + T7U = T7I - T7T; + T7V = T7x - T7U; + TaH = T7x + T7U; + TjL = TaZ - TaY; + TjM = Tjx - Tjw; + TjN = TjL + TjM; + TjT = TjM - TjL; + } + { + E T8m, TaI, T8N, TaJ; + { + E T8c, T8l, T8D, T8M; + T8c = T80 - T8b; + T8l = T8h - T8k; + T8m = FNMS(KP980785280, T8l, KP195090322 * T8c); + TaI = FMA(KP980785280, T8c, KP195090322 * T8l); + T8D = T8r - T8C; + T8M = T8I - T8L; + T8N = FMA(KP195090322, T8D, KP980785280 * T8M); + TaJ = FNMS(KP980785280, T8D, KP195090322 * T8M); + } + T8O = T8m - T8N; + TjS = TaJ - TaI; + TaK = TaI + TaJ; + TjK = T8m + T8N; + } + { + E T9u, TaM, T9H, TaN; + { + E T96, T9t, T9D, T9G; + T96 = T8U - T95; + T9t = T9h - T9s; + T9u = T96 - T9t; + TaM = T96 + T9t; + T9D = T9z - T9C; + T9G = T9E - T9F; + T9H = T9D - T9G; + TaN = T9D + T9G; + } + T9I = FMA(KP995184726, T9u, KP098017140 * T9H); + TaU = FNMS(KP634393284, TaN, KP773010453 * TaM); + TaE = FNMS(KP995184726, T9H, KP098017140 * T9u); + TaO = FMA(KP634393284, TaM, KP773010453 * TaN); + } + { + E Tan, TaP, TaA, TaQ; + { + E T9Z, Tam, Taw, Taz; + T9Z = T9N - T9Y; + Tam = Taa - Tal; + Tan = T9Z - Tam; + TaP = T9Z + Tam; + Taw = Tas - Tav; + Taz = Tax - Tay; + TaA = Taw - Taz; + TaQ = Taw + Taz; + } + TaB = FNMS(KP995184726, TaA, KP098017140 * Tan); + TaV = FMA(KP773010453, TaQ, KP634393284 * TaP); + TaF = FMA(KP098017140, TaA, KP995184726 * Tan); + TaR = FNMS(KP634393284, TaQ, KP773010453 * TaP); + } + { + E T8P, TaC, TjR, TjU; + T8P = T7V + T8O; + TaC = T9I + TaB; + ri[WS(rs, 47)] = T8P - TaC; + ri[WS(rs, 15)] = T8P + TaC; + TjR = TaE + TaF; + TjU = TjS + TjT; + ii[WS(rs, 15)] = TjR + TjU; + ii[WS(rs, 47)] = TjU - TjR; + } + { + E TaD, TaG, TjV, TjW; + TaD = T7V - T8O; + TaG = TaE - TaF; + ri[WS(rs, 63)] = TaD - TaG; + ri[WS(rs, 31)] = TaD + TaG; + TjV = TaB - T9I; + TjW = TjT - TjS; + ii[WS(rs, 31)] = TjV + TjW; + ii[WS(rs, 63)] = TjW - TjV; + } + { + E TaL, TaS, TjJ, TjO; + TaL = TaH + TaK; + TaS = TaO + TaR; + ri[WS(rs, 39)] = TaL - TaS; + ri[WS(rs, 7)] = TaL + TaS; + TjJ = TaU + TaV; + TjO = TjK + TjN; + ii[WS(rs, 7)] = TjJ + TjO; + ii[WS(rs, 39)] = TjO - TjJ; + } + { + E TaT, TaW, TjP, TjQ; + TaT = TaH - TaK; + TaW = TaU - TaV; + ri[WS(rs, 55)] = TaT - TaW; + ri[WS(rs, 23)] = TaT + TaW; + TjP = TaR - TaO; + TjQ = TjN - TjK; + ii[WS(rs, 23)] = TjP + TjQ; + ii[WS(rs, 55)] = TjQ - TjP; + } + } + { + E TbV, TcT, Tjj, Tjp, Tca, Tjo, TcW, Tjg, Tcu, Td6, TcQ, Td0, TcN, Td7, TcR; + E Td3; + { + E TbN, TbU, Tjh, Tji; + TbN = TbJ - TbM; + TbU = TbQ - TbT; + TbV = TbN - TbU; + TcT = TbN + TbU; + Tjh = Tdb - Tda; + Tji = Tj3 - Tj0; + Tjj = Tjh + Tji; + Tjp = Tji - Tjh; + } + { + E Tc2, TcU, Tc9, TcV; + { + E TbY, Tc1, Tc5, Tc8; + TbY = TbW - TbX; + Tc1 = TbZ - Tc0; + Tc2 = FNMS(KP831469612, Tc1, KP555570233 * TbY); + TcU = FMA(KP555570233, Tc1, KP831469612 * TbY); + Tc5 = Tc3 - Tc4; + Tc8 = Tc6 - Tc7; + Tc9 = FMA(KP831469612, Tc5, KP555570233 * Tc8); + TcV = FNMS(KP831469612, Tc8, KP555570233 * Tc5); + } + Tca = Tc2 - Tc9; + Tjo = TcV - TcU; + TcW = TcU + TcV; + Tjg = Tc2 + Tc9; + } + { + E Tcm, TcY, Tct, TcZ; + { + E Tce, Tcl, Tcp, Tcs; + Tce = Tcc - Tcd; + Tcl = Tch - Tck; + Tcm = Tce - Tcl; + TcY = Tce + Tcl; + Tcp = Tcn - Tco; + Tcs = Tcq - Tcr; + Tct = Tcp - Tcs; + TcZ = Tcp + Tcs; + } + Tcu = FMA(KP956940335, Tcm, KP290284677 * Tct); + Td6 = FNMS(KP471396736, TcZ, KP881921264 * TcY); + TcQ = FNMS(KP956940335, Tct, KP290284677 * Tcm); + Td0 = FMA(KP471396736, TcY, KP881921264 * TcZ); + } + { + E TcF, Td1, TcM, Td2; + { + E Tcx, TcE, TcI, TcL; + Tcx = Tcv - Tcw; + TcE = TcA - TcD; + TcF = Tcx - TcE; + Td1 = Tcx + TcE; + TcI = TcG - TcH; + TcL = TcJ - TcK; + TcM = TcI - TcL; + Td2 = TcI + TcL; + } + TcN = FNMS(KP956940335, TcM, KP290284677 * TcF); + Td7 = FMA(KP881921264, Td2, KP471396736 * Td1); + TcR = FMA(KP290284677, TcM, KP956940335 * TcF); + Td3 = FNMS(KP471396736, Td2, KP881921264 * Td1); + } + { + E Tcb, TcO, Tjn, Tjq; + Tcb = TbV + Tca; + TcO = Tcu + TcN; + ri[WS(rs, 45)] = Tcb - TcO; + ri[WS(rs, 13)] = Tcb + TcO; + Tjn = TcQ + TcR; + Tjq = Tjo + Tjp; + ii[WS(rs, 13)] = Tjn + Tjq; + ii[WS(rs, 45)] = Tjq - Tjn; + } + { + E TcP, TcS, Tjr, Tjs; + TcP = TbV - Tca; + TcS = TcQ - TcR; + ri[WS(rs, 61)] = TcP - TcS; + ri[WS(rs, 29)] = TcP + TcS; + Tjr = TcN - Tcu; + Tjs = Tjp - Tjo; + ii[WS(rs, 29)] = Tjr + Tjs; + ii[WS(rs, 61)] = Tjs - Tjr; + } + { + E TcX, Td4, Tjf, Tjk; + TcX = TcT + TcW; + Td4 = Td0 + Td3; + ri[WS(rs, 37)] = TcX - Td4; + ri[WS(rs, 5)] = TcX + Td4; + Tjf = Td6 + Td7; + Tjk = Tjg + Tjj; + ii[WS(rs, 5)] = Tjf + Tjk; + ii[WS(rs, 37)] = Tjk - Tjf; + } + { + E Td5, Td8, Tjl, Tjm; + Td5 = TcT - TcW; + Td8 = Td6 - Td7; + ri[WS(rs, 53)] = Td5 - Td8; + ri[WS(rs, 21)] = Td5 + Td8; + Tjl = Td3 - Td0; + Tjm = Tjj - Tjg; + ii[WS(rs, 21)] = Tjl + Tjm; + ii[WS(rs, 53)] = Tjm - Tjl; + } + } + { + E Tdd, TdF, Tj5, Tjb, Tdk, Tja, TdI, TiY, Tds, TdS, TdC, TdM, Tdz, TdT, TdD; + E TdP; + { + E Td9, Tdc, TiZ, Tj4; + Td9 = TbJ + TbM; + Tdc = Tda + Tdb; + Tdd = Td9 - Tdc; + TdF = Td9 + Tdc; + TiZ = TbQ + TbT; + Tj4 = Tj0 + Tj3; + Tj5 = TiZ + Tj4; + Tjb = Tj4 - TiZ; + } + { + E Tdg, TdG, Tdj, TdH; + { + E Tde, Tdf, Tdh, Tdi; + Tde = TbW + TbX; + Tdf = TbZ + Tc0; + Tdg = FNMS(KP195090322, Tdf, KP980785280 * Tde); + TdG = FMA(KP980785280, Tdf, KP195090322 * Tde); + Tdh = Tc3 + Tc4; + Tdi = Tc6 + Tc7; + Tdj = FMA(KP195090322, Tdh, KP980785280 * Tdi); + TdH = FNMS(KP195090322, Tdi, KP980785280 * Tdh); + } + Tdk = Tdg - Tdj; + Tja = TdH - TdG; + TdI = TdG + TdH; + TiY = Tdg + Tdj; + } + { + E Tdo, TdK, Tdr, TdL; + { + E Tdm, Tdn, Tdp, Tdq; + Tdm = Tcn + Tco; + Tdn = Tck + Tch; + Tdo = Tdm - Tdn; + TdK = Tdm + Tdn; + Tdp = Tcc + Tcd; + Tdq = Tcq + Tcr; + Tdr = Tdp - Tdq; + TdL = Tdp + Tdq; + } + Tds = FMA(KP634393284, Tdo, KP773010453 * Tdr); + TdS = FNMS(KP098017140, TdK, KP995184726 * TdL); + TdC = FNMS(KP773010453, Tdo, KP634393284 * Tdr); + TdM = FMA(KP995184726, TdK, KP098017140 * TdL); + } + { + E Tdv, TdN, Tdy, TdO; + { + E Tdt, Tdu, Tdw, Tdx; + Tdt = Tcv + Tcw; + Tdu = TcK + TcJ; + Tdv = Tdt - Tdu; + TdN = Tdt + Tdu; + Tdw = TcG + TcH; + Tdx = TcA + TcD; + Tdy = Tdw - Tdx; + TdO = Tdw + Tdx; + } + Tdz = FNMS(KP773010453, Tdy, KP634393284 * Tdv); + TdT = FMA(KP098017140, TdN, KP995184726 * TdO); + TdD = FMA(KP773010453, Tdv, KP634393284 * Tdy); + TdP = FNMS(KP098017140, TdO, KP995184726 * TdN); + } + { + E Tdl, TdA, Tj9, Tjc; + Tdl = Tdd + Tdk; + TdA = Tds + Tdz; + ri[WS(rs, 41)] = Tdl - TdA; + ri[WS(rs, 9)] = Tdl + TdA; + Tj9 = TdC + TdD; + Tjc = Tja + Tjb; + ii[WS(rs, 9)] = Tj9 + Tjc; + ii[WS(rs, 41)] = Tjc - Tj9; + } + { + E TdB, TdE, Tjd, Tje; + TdB = Tdd - Tdk; + TdE = TdC - TdD; + ri[WS(rs, 57)] = TdB - TdE; + ri[WS(rs, 25)] = TdB + TdE; + Tjd = Tdz - Tds; + Tje = Tjb - Tja; + ii[WS(rs, 25)] = Tjd + Tje; + ii[WS(rs, 57)] = Tje - Tjd; + } + { + E TdJ, TdQ, TiX, Tj6; + TdJ = TdF + TdI; + TdQ = TdM + TdP; + ri[WS(rs, 33)] = TdJ - TdQ; + ri[WS(rs, 1)] = TdJ + TdQ; + TiX = TdS + TdT; + Tj6 = TiY + Tj5; + ii[WS(rs, 1)] = TiX + Tj6; + ii[WS(rs, 33)] = Tj6 - TiX; + } + { + E TdR, TdU, Tj7, Tj8; + TdR = TdF - TdI; + TdU = TdS - TdT; + ri[WS(rs, 49)] = TdR - TdU; + ri[WS(rs, 17)] = TdR + TdU; + Tj7 = TdP - TdM; + Tj8 = Tj5 - TiY; + ii[WS(rs, 17)] = Tj7 + Tj8; + ii[WS(rs, 49)] = Tj8 - Tj7; + } + } + { + E Tb1, Tbt, Tjz, TjF, Tb8, TjE, Tbw, Tju, Tbg, TbG, Tbq, TbA, Tbn, TbH, Tbr; + E TbD; + { + E TaX, Tb0, Tjv, Tjy; + TaX = T7l + T7w; + Tb0 = TaY + TaZ; + Tb1 = TaX - Tb0; + Tbt = TaX + Tb0; + Tjv = T7I + T7T; + Tjy = Tjw + Tjx; + Tjz = Tjv + Tjy; + TjF = Tjy - Tjv; + } + { + E Tb4, Tbu, Tb7, Tbv; + { + E Tb2, Tb3, Tb5, Tb6; + Tb2 = T80 + T8b; + Tb3 = T8h + T8k; + Tb4 = FNMS(KP555570233, Tb3, KP831469612 * Tb2); + Tbu = FMA(KP555570233, Tb2, KP831469612 * Tb3); + Tb5 = T8r + T8C; + Tb6 = T8I + T8L; + Tb7 = FMA(KP831469612, Tb5, KP555570233 * Tb6); + Tbv = FNMS(KP555570233, Tb5, KP831469612 * Tb6); + } + Tb8 = Tb4 - Tb7; + TjE = Tbv - Tbu; + Tbw = Tbu + Tbv; + Tju = Tb4 + Tb7; + } + { + E Tbc, Tby, Tbf, Tbz; + { + E Tba, Tbb, Tbd, Tbe; + Tba = T9z + T9C; + Tbb = T9s + T9h; + Tbc = Tba - Tbb; + Tby = Tba + Tbb; + Tbd = T8U + T95; + Tbe = T9E + T9F; + Tbf = Tbd - Tbe; + Tbz = Tbd + Tbe; + } + Tbg = FMA(KP471396736, Tbc, KP881921264 * Tbf); + TbG = FNMS(KP290284677, Tby, KP956940335 * Tbz); + Tbq = FNMS(KP881921264, Tbc, KP471396736 * Tbf); + TbA = FMA(KP956940335, Tby, KP290284677 * Tbz); + } + { + E Tbj, TbB, Tbm, TbC; + { + E Tbh, Tbi, Tbk, Tbl; + Tbh = T9N + T9Y; + Tbi = Tay + Tax; + Tbj = Tbh - Tbi; + TbB = Tbh + Tbi; + Tbk = Tas + Tav; + Tbl = Taa + Tal; + Tbm = Tbk - Tbl; + TbC = Tbk + Tbl; + } + Tbn = FNMS(KP881921264, Tbm, KP471396736 * Tbj); + TbH = FMA(KP290284677, TbB, KP956940335 * TbC); + Tbr = FMA(KP881921264, Tbj, KP471396736 * Tbm); + TbD = FNMS(KP290284677, TbC, KP956940335 * TbB); + } + { + E Tb9, Tbo, TjD, TjG; + Tb9 = Tb1 + Tb8; + Tbo = Tbg + Tbn; + ri[WS(rs, 43)] = Tb9 - Tbo; + ri[WS(rs, 11)] = Tb9 + Tbo; + TjD = Tbq + Tbr; + TjG = TjE + TjF; + ii[WS(rs, 11)] = TjD + TjG; + ii[WS(rs, 43)] = TjG - TjD; + } + { + E Tbp, Tbs, TjH, TjI; + Tbp = Tb1 - Tb8; + Tbs = Tbq - Tbr; + ri[WS(rs, 59)] = Tbp - Tbs; + ri[WS(rs, 27)] = Tbp + Tbs; + TjH = Tbn - Tbg; + TjI = TjF - TjE; + ii[WS(rs, 27)] = TjH + TjI; + ii[WS(rs, 59)] = TjI - TjH; + } + { + E Tbx, TbE, Tjt, TjA; + Tbx = Tbt + Tbw; + TbE = TbA + TbD; + ri[WS(rs, 35)] = Tbx - TbE; + ri[WS(rs, 3)] = Tbx + TbE; + Tjt = TbG + TbH; + TjA = Tju + Tjz; + ii[WS(rs, 3)] = Tjt + TjA; + ii[WS(rs, 35)] = TjA - Tjt; + } + { + E TbF, TbI, TjB, TjC; + TbF = Tbt - Tbw; + TbI = TbG - TbH; + ri[WS(rs, 51)] = TbF - TbI; + ri[WS(rs, 19)] = TbF + TbI; + TjB = TbD - TbA; + TjC = Tjz - Tju; + ii[WS(rs, 19)] = TjB + TjC; + ii[WS(rs, 51)] = TjC - TjB; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 9}, + {TW_CEXP, 0, 27}, + {TW_CEXP, 0, 63}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 64, "t2_64", twinstr, &GENUS, {880, 386, 274, 0}, 0, 0, 0 }; + +void X(codelet_t2_64) (planner *p) { + X(kdft_dit_register) (p, t2_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_8.c new file mode 100644 index 000000000..16e95ecd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/codelets/t2_8.c @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -name t2_8 -include dft/scalar/t.h */ + +/* + * This function contains 74 FP additions, 50 FP multiplications, + * (or, 44 additions, 20 multiplications, 30 fused multiply/add), + * 48 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T2, T3, Tl, Tn, T5, T6, Tf, T7, Ts, Tb, To, Ti, TC, TG; + { + E T4, Tm, Tr, Ta, TB, TF; + T2 = W[0]; + T3 = W[2]; + T4 = T2 * T3; + Tl = W[4]; + Tm = T2 * Tl; + Tn = W[5]; + Tr = T2 * Tn; + T5 = W[1]; + T6 = W[3]; + Ta = T2 * T6; + Tf = FMA(T5, T6, T4); + T7 = FNMS(T5, T6, T4); + Ts = FNMS(T5, Tl, Tr); + Tb = FMA(T5, T3, Ta); + To = FMA(T5, Tn, Tm); + TB = Tf * Tl; + TF = Tf * Tn; + Ti = FNMS(T5, T3, Ta); + TC = FMA(Ti, Tn, TB); + TG = FNMS(Ti, Tl, TF); + } + { + E T1, T1s, Td, T1r, Tu, TY, Tk, TW, TN, TR, T18, T1a, T1c, T1d, TA; + E TI, T11, T13, T15, T16; + T1 = ri[0]; + T1s = ii[0]; + { + E T8, T9, Tc, T1q; + T8 = ri[WS(rs, 4)]; + T9 = T7 * T8; + Tc = ii[WS(rs, 4)]; + T1q = T7 * Tc; + Td = FMA(Tb, Tc, T9); + T1r = FNMS(Tb, T8, T1q); + } + { + E Tp, Tq, Tt, TX; + Tp = ri[WS(rs, 6)]; + Tq = To * Tp; + Tt = ii[WS(rs, 6)]; + TX = To * Tt; + Tu = FMA(Ts, Tt, Tq); + TY = FNMS(Ts, Tp, TX); + } + { + E Tg, Th, Tj, TV; + Tg = ri[WS(rs, 2)]; + Th = Tf * Tg; + Tj = ii[WS(rs, 2)]; + TV = Tf * Tj; + Tk = FMA(Ti, Tj, Th); + TW = FNMS(Ti, Tg, TV); + } + { + E TK, TL, TM, T19, TO, TP, TQ, T1b; + TK = ri[WS(rs, 7)]; + TL = Tl * TK; + TM = ii[WS(rs, 7)]; + T19 = Tl * TM; + TO = ri[WS(rs, 3)]; + TP = T3 * TO; + TQ = ii[WS(rs, 3)]; + T1b = T3 * TQ; + TN = FMA(Tn, TM, TL); + TR = FMA(T6, TQ, TP); + T18 = TN - TR; + T1a = FNMS(Tn, TK, T19); + T1c = FNMS(T6, TO, T1b); + T1d = T1a - T1c; + } + { + E Tx, Ty, Tz, T12, TD, TE, TH, T14; + Tx = ri[WS(rs, 1)]; + Ty = T2 * Tx; + Tz = ii[WS(rs, 1)]; + T12 = T2 * Tz; + TD = ri[WS(rs, 5)]; + TE = TC * TD; + TH = ii[WS(rs, 5)]; + T14 = TC * TH; + TA = FMA(T5, Tz, Ty); + TI = FMA(TG, TH, TE); + T11 = TA - TI; + T13 = FNMS(T5, Tx, T12); + T15 = FNMS(TG, TD, T14); + T16 = T13 - T15; + } + { + E T10, T1g, T1z, T1B, T1f, T1C, T1j, T1A; + { + E TU, TZ, T1x, T1y; + TU = T1 - Td; + TZ = TW - TY; + T10 = TU + TZ; + T1g = TU - TZ; + T1x = T1s - T1r; + T1y = Tk - Tu; + T1z = T1x - T1y; + T1B = T1y + T1x; + } + { + E T17, T1e, T1h, T1i; + T17 = T11 + T16; + T1e = T18 - T1d; + T1f = T17 + T1e; + T1C = T1e - T17; + T1h = T16 - T11; + T1i = T18 + T1d; + T1j = T1h - T1i; + T1A = T1h + T1i; + } + ri[WS(rs, 5)] = FNMS(KP707106781, T1f, T10); + ii[WS(rs, 5)] = FNMS(KP707106781, T1A, T1z); + ri[WS(rs, 1)] = FMA(KP707106781, T1f, T10); + ii[WS(rs, 1)] = FMA(KP707106781, T1A, T1z); + ri[WS(rs, 7)] = FNMS(KP707106781, T1j, T1g); + ii[WS(rs, 7)] = FNMS(KP707106781, T1C, T1B); + ri[WS(rs, 3)] = FMA(KP707106781, T1j, T1g); + ii[WS(rs, 3)] = FMA(KP707106781, T1C, T1B); + } + { + E Tw, T1k, T1u, T1w, TT, T1v, T1n, T1o; + { + E Te, Tv, T1p, T1t; + Te = T1 + Td; + Tv = Tk + Tu; + Tw = Te + Tv; + T1k = Te - Tv; + T1p = TW + TY; + T1t = T1r + T1s; + T1u = T1p + T1t; + T1w = T1t - T1p; + } + { + E TJ, TS, T1l, T1m; + TJ = TA + TI; + TS = TN + TR; + TT = TJ + TS; + T1v = TS - TJ; + T1l = T13 + T15; + T1m = T1a + T1c; + T1n = T1l - T1m; + T1o = T1l + T1m; + } + ri[WS(rs, 4)] = Tw - TT; + ii[WS(rs, 4)] = T1u - T1o; + ri[0] = Tw + TT; + ii[0] = T1o + T1u; + ri[WS(rs, 6)] = T1k - T1n; + ii[WS(rs, 6)] = T1w - T1v; + ri[WS(rs, 2)] = T1k + T1n; + ii[WS(rs, 2)] = T1v + T1w; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 7}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 8, "t2_8", twinstr, &GENUS, {44, 20, 30, 0}, 0, 0, 0 }; + +void X(codelet_t2_8) (planner *p) { + X(kdft_dit_register) (p, t2_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -name t2_8 -include dft/scalar/t.h */ + +/* + * This function contains 74 FP additions, 44 FP multiplications, + * (or, 56 additions, 26 multiplications, 18 fused multiply/add), + * 42 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/scalar/t.h" + +static void t2_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + 1, ri = ri + ms, ii = ii + ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T2, T5, T3, T6, T8, Tc, Tg, Ti, Tl, Tm, Tn, Tz, Tp, Tx; + { + E T4, Tb, T7, Ta; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tb = T5 * T3; + T7 = T5 * T6; + Ta = T2 * T6; + T8 = T4 - T7; + Tc = Ta + Tb; + Tg = T4 + T7; + Ti = Ta - Tb; + Tl = W[4]; + Tm = W[5]; + Tn = FMA(T2, Tl, T5 * Tm); + Tz = FNMS(Ti, Tl, Tg * Tm); + Tp = FNMS(T5, Tl, T2 * Tm); + Tx = FMA(Tg, Tl, Ti * Tm); + } + { + E Tf, T1i, TL, T1d, TJ, T17, TV, TY, Ts, T1j, TO, T1a, TC, T16, TQ; + E TT; + { + E T1, T1c, Te, T1b, T9, Td; + T1 = ri[0]; + T1c = ii[0]; + T9 = ri[WS(rs, 4)]; + Td = ii[WS(rs, 4)]; + Te = FMA(T8, T9, Tc * Td); + T1b = FNMS(Tc, T9, T8 * Td); + Tf = T1 + Te; + T1i = T1c - T1b; + TL = T1 - Te; + T1d = T1b + T1c; + } + { + E TF, TW, TI, TX; + { + E TD, TE, TG, TH; + TD = ri[WS(rs, 7)]; + TE = ii[WS(rs, 7)]; + TF = FMA(Tl, TD, Tm * TE); + TW = FNMS(Tm, TD, Tl * TE); + TG = ri[WS(rs, 3)]; + TH = ii[WS(rs, 3)]; + TI = FMA(T3, TG, T6 * TH); + TX = FNMS(T6, TG, T3 * TH); + } + TJ = TF + TI; + T17 = TW + TX; + TV = TF - TI; + TY = TW - TX; + } + { + E Tk, TM, Tr, TN; + { + E Th, Tj, To, Tq; + Th = ri[WS(rs, 2)]; + Tj = ii[WS(rs, 2)]; + Tk = FMA(Tg, Th, Ti * Tj); + TM = FNMS(Ti, Th, Tg * Tj); + To = ri[WS(rs, 6)]; + Tq = ii[WS(rs, 6)]; + Tr = FMA(Tn, To, Tp * Tq); + TN = FNMS(Tp, To, Tn * Tq); + } + Ts = Tk + Tr; + T1j = Tk - Tr; + TO = TM - TN; + T1a = TM + TN; + } + { + E Tw, TR, TB, TS; + { + E Tu, Tv, Ty, TA; + Tu = ri[WS(rs, 1)]; + Tv = ii[WS(rs, 1)]; + Tw = FMA(T2, Tu, T5 * Tv); + TR = FNMS(T5, Tu, T2 * Tv); + Ty = ri[WS(rs, 5)]; + TA = ii[WS(rs, 5)]; + TB = FMA(Tx, Ty, Tz * TA); + TS = FNMS(Tz, Ty, Tx * TA); + } + TC = Tw + TB; + T16 = TR + TS; + TQ = Tw - TB; + TT = TR - TS; + } + { + E Tt, TK, T1f, T1g; + Tt = Tf + Ts; + TK = TC + TJ; + ri[WS(rs, 4)] = Tt - TK; + ri[0] = Tt + TK; + { + E T19, T1e, T15, T18; + T19 = T16 + T17; + T1e = T1a + T1d; + ii[0] = T19 + T1e; + ii[WS(rs, 4)] = T1e - T19; + T15 = Tf - Ts; + T18 = T16 - T17; + ri[WS(rs, 6)] = T15 - T18; + ri[WS(rs, 2)] = T15 + T18; + } + T1f = TJ - TC; + T1g = T1d - T1a; + ii[WS(rs, 2)] = T1f + T1g; + ii[WS(rs, 6)] = T1g - T1f; + { + E T11, T1k, T14, T1h, T12, T13; + T11 = TL - TO; + T1k = T1i - T1j; + T12 = TT - TQ; + T13 = TV + TY; + T14 = KP707106781 * (T12 - T13); + T1h = KP707106781 * (T12 + T13); + ri[WS(rs, 7)] = T11 - T14; + ii[WS(rs, 5)] = T1k - T1h; + ri[WS(rs, 3)] = T11 + T14; + ii[WS(rs, 1)] = T1h + T1k; + } + { + E TP, T1m, T10, T1l, TU, TZ; + TP = TL + TO; + T1m = T1j + T1i; + TU = TQ + TT; + TZ = TV - TY; + T10 = KP707106781 * (TU + TZ); + T1l = KP707106781 * (TZ - TU); + ri[WS(rs, 5)] = TP - T10; + ii[WS(rs, 7)] = T1m - T1l; + ri[WS(rs, 1)] = TP + T10; + ii[WS(rs, 3)] = T1l + T1m; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 0, 1}, + {TW_CEXP, 0, 3}, + {TW_CEXP, 0, 7}, + {TW_NEXT, 1, 0} +}; + +static const ct_desc desc = { 8, "t2_8", twinstr, &GENUS, {56, 26, 18, 0}, 0, 0, 0 }; + +void X(codelet_t2_8) (planner *p) { + X(kdft_dit_register) (p, t2_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/f.h new file mode 100644 index 000000000..3512ca573 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/f.h @@ -0,0 +1 @@ +#include "dft/scalar/t.h" /* same stuff, no need to duplicate */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/n.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/n.c new file mode 100644 index 000000000..48d240592 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/n.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/codelet-dft.h" +#include "dft/scalar/n.h" + +static int okp(const kdft_desc *d, + const R *ri, const R *ii, + const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr) +{ + UNUSED(ri); UNUSED(ii); UNUSED(ro); UNUSED(io); UNUSED(vl); UNUSED(plnr); + return (1 + && (!d->is || (d->is == is)) + && (!d->os || (d->os == os)) + && (!d->ivs || (d->ivs == ivs)) + && (!d->ovs || (d->ovs == ovs)) + ); +} + +const kdft_genus GENUS = { okp, 1 }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/n.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/n.h new file mode 100644 index 000000000..98136ae83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/n.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(dft_n_genus) +extern const kdft_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/q.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/q.h new file mode 100644 index 000000000..3512ca573 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/q.h @@ -0,0 +1 @@ +#include "dft/scalar/t.h" /* same stuff, no need to duplicate */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/t.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/t.c new file mode 100644 index 000000000..26b985266 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/t.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/codelet-dft.h" +#include "dft/scalar/t.h" + +static int okp(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + UNUSED(rio); UNUSED(iio); UNUSED(m); UNUSED(mb); UNUSED(me); UNUSED(plnr); + return (1 + && (!d->rs || (d->rs == rs)) + && (!d->vs || (d->vs == vs)) + && (!d->ms || (d->ms == ms)) + ); +} + +const ct_genus GENUS = { okp, 1 }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/t.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/t.h new file mode 100644 index 000000000..c4cc0422c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/scalar/t.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(dft_t_genus) +extern const ct_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/Makefile.am new file mode 100644 index 000000000..315d74474 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/Makefile.am @@ -0,0 +1,4 @@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = common sse2 avx avx-128-fma avx2 avx2-128 avx512 kcvi altivec vsx neon generic-simd128 generic-simd256 +EXTRA_DIST = n1b.h n1f.h n2b.h n2f.h n2s.h q1b.h q1f.h t1b.h t1bu.h \ +t1f.h t1fu.h t2b.h t2f.h t3b.h t3f.h ts.h codlist.mk simd.mk diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/Makefile.in new file mode 100644 index 000000000..a90dc3378 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/Makefile.in @@ -0,0 +1,663 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = common sse2 avx avx-128-fma avx2 avx2-128 avx512 kcvi altivec vsx neon generic-simd128 generic-simd256 +EXTRA_DIST = n1b.h n1f.h n2b.h n2f.h n2s.h q1b.h q1f.h t1b.h t1bu.h \ +t1f.h t1fu.h t2b.h t2f.h t3b.h t3f.h ts.h codlist.mk simd.mk + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/Makefile.am new file mode 100644 index 000000000..c827a17a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(ALTIVEC_CFLAGS) +SIMD_HEADER=simd-support/simd-altivec.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_ALTIVEC + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_altivec_codelets.la +libdft_altivec_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/Makefile.in new file mode 100644 index 000000000..38f03b2b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/altivec +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_altivec_codelets_la_LIBADD = +am__libdft_altivec_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c \ + n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c \ + n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ + n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c \ + n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ + n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c \ + n1bv_15.c n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c \ + n1bv_25.c n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c \ + n2fv_12.c n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c \ + n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ + n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c \ + n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c \ + t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c \ + t1fuv_10.c t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c \ + t1fv_7.c t1fv_8.c t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c \ + t1fv_16.c t1fv_32.c t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c \ + t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c \ + t2fv_10.c t2fv_20.c t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c \ + t3fv_32.c t3fv_5.c t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c \ + t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c \ + t1buv_9.c t1buv_10.c t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c \ + t1bv_6.c t1bv_7.c t1bv_8.c t1bv_9.c t1bv_10.c t1bv_12.c \ + t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c t1bv_20.c t1bv_25.c \ + t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ + t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c t3bv_4.c t3bv_8.c \ + t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c t3bv_20.c t3bv_25.c \ + t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c t2sv_4.c \ + t2sv_8.c t2sv_16.c t2sv_32.c q1fv_2.c q1fv_4.c q1fv_5.c \ + q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_ALTIVEC_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_ALTIVEC_TRUE@am_libdft_altivec_codelets_la_OBJECTS = \ +@HAVE_ALTIVEC_TRUE@ $(am__objects_20) +libdft_altivec_codelets_la_OBJECTS = \ + $(am_libdft_altivec_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_ALTIVEC_TRUE@am_libdft_altivec_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_altivec_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_altivec_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(ALTIVEC_CFLAGS) +SIMD_HEADER = simd-support/simd-altivec.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_ALTIVEC_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_ALTIVEC_TRUE@noinst_LTLIBRARIES = libdft_altivec_codelets.la +@HAVE_ALTIVEC_TRUE@libdft_altivec_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/altivec/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/altivec/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_altivec_codelets.la: $(libdft_altivec_codelets_la_OBJECTS) $(libdft_altivec_codelets_la_DEPENDENCIES) $(EXTRA_libdft_altivec_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_altivec_codelets_la_rpath) $(libdft_altivec_codelets_la_OBJECTS) $(libdft_altivec_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/codlist.c new file mode 100644 index 000000000..6a6a6d689 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/genus.c new file mode 100644 index 000000000..5a6600d90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_10.c new file mode 100644 index 000000000..b4e67d942 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_11.c new file mode 100644 index 000000000..4c5611151 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_12.c new file mode 100644 index 000000000..9fc20bb3a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_128.c new file mode 100644 index 000000000..08c34f58f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_13.c new file mode 100644 index 000000000..ba638b191 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_14.c new file mode 100644 index 000000000..171d44e71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_15.c new file mode 100644 index 000000000..62e59410f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_16.c new file mode 100644 index 000000000..f9dae8c5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_2.c new file mode 100644 index 000000000..e70a8b620 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_20.c new file mode 100644 index 000000000..99fe9a259 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_25.c new file mode 100644 index 000000000..991eeb63d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_3.c new file mode 100644 index 000000000..340130c90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_32.c new file mode 100644 index 000000000..490553520 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_4.c new file mode 100644 index 000000000..78da6c64f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_5.c new file mode 100644 index 000000000..7d77ef43e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_6.c new file mode 100644 index 000000000..399397450 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_64.c new file mode 100644 index 000000000..b7d5a1f19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_7.c new file mode 100644 index 000000000..a12624b72 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_8.c new file mode 100644 index 000000000..cbf92cea1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_9.c new file mode 100644 index 000000000..dc9c43e84 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_10.c new file mode 100644 index 000000000..1c4c87526 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_11.c new file mode 100644 index 000000000..30bab182b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_12.c new file mode 100644 index 000000000..718643be3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_128.c new file mode 100644 index 000000000..d011f9f4b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_13.c new file mode 100644 index 000000000..6a5bce000 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_14.c new file mode 100644 index 000000000..ea9f0975c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_15.c new file mode 100644 index 000000000..7285bfc02 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_16.c new file mode 100644 index 000000000..1cc7335b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_2.c new file mode 100644 index 000000000..e5357dfe5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_20.c new file mode 100644 index 000000000..15b318c20 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_25.c new file mode 100644 index 000000000..8b3d56f88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_3.c new file mode 100644 index 000000000..9d7414312 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_32.c new file mode 100644 index 000000000..a0ee9535e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_4.c new file mode 100644 index 000000000..d437c870e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_5.c new file mode 100644 index 000000000..6d3bfb509 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_6.c new file mode 100644 index 000000000..a7d4cfd58 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_64.c new file mode 100644 index 000000000..49db94272 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_7.c new file mode 100644 index 000000000..f91db8292 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_8.c new file mode 100644 index 000000000..006f15fe7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_9.c new file mode 100644 index 000000000..4f69d46c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_10.c new file mode 100644 index 000000000..3a7fee2e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_12.c new file mode 100644 index 000000000..9d013d466 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_14.c new file mode 100644 index 000000000..da462b0d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_16.c new file mode 100644 index 000000000..2a06d8cfe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_2.c new file mode 100644 index 000000000..a8ede20f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_20.c new file mode 100644 index 000000000..e8d951c4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_32.c new file mode 100644 index 000000000..7881d19c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_4.c new file mode 100644 index 000000000..52b901686 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_6.c new file mode 100644 index 000000000..ad8dd435f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_64.c new file mode 100644 index 000000000..d37bc7b3b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_8.c new file mode 100644 index 000000000..f1fe2cd90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_10.c new file mode 100644 index 000000000..54b4cba9b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_12.c new file mode 100644 index 000000000..572aefe77 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_14.c new file mode 100644 index 000000000..21e30a706 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_16.c new file mode 100644 index 000000000..817886cf1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_2.c new file mode 100644 index 000000000..14944227e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_20.c new file mode 100644 index 000000000..af391d558 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_32.c new file mode 100644 index 000000000..abe10e6a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_4.c new file mode 100644 index 000000000..6c995b0c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_6.c new file mode 100644 index 000000000..40438d83b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_64.c new file mode 100644 index 000000000..b6fc44329 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_8.c new file mode 100644 index 000000000..99d82598b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_16.c new file mode 100644 index 000000000..c406e7159 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_32.c new file mode 100644 index 000000000..2d1162c7e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_4.c new file mode 100644 index 000000000..91d1370ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_64.c new file mode 100644 index 000000000..f74e8352a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_8.c new file mode 100644 index 000000000..4b88db104 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_2.c new file mode 100644 index 000000000..6328954d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_4.c new file mode 100644 index 000000000..88f9d4d57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_5.c new file mode 100644 index 000000000..997e2d408 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_8.c new file mode 100644 index 000000000..aba5bc65c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_2.c new file mode 100644 index 000000000..339f636f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_4.c new file mode 100644 index 000000000..985b4a1c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_5.c new file mode 100644 index 000000000..8e59d4a13 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_8.c new file mode 100644 index 000000000..121383b8b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_10.c new file mode 100644 index 000000000..af5fb1e90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_2.c new file mode 100644 index 000000000..db4804279 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_3.c new file mode 100644 index 000000000..85c2e04bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_4.c new file mode 100644 index 000000000..0814e7229 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_5.c new file mode 100644 index 000000000..ab54c1d65 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_6.c new file mode 100644 index 000000000..0b33c4c81 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_7.c new file mode 100644 index 000000000..a065115d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_8.c new file mode 100644 index 000000000..0303f98af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_9.c new file mode 100644 index 000000000..fc1c05b3e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_10.c new file mode 100644 index 000000000..6905d6911 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_12.c new file mode 100644 index 000000000..129885ca7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_15.c new file mode 100644 index 000000000..09f2b2264 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_16.c new file mode 100644 index 000000000..cdf6bc73c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_2.c new file mode 100644 index 000000000..a0a7e4695 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_20.c new file mode 100644 index 000000000..b1d528f0c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_25.c new file mode 100644 index 000000000..35f7cd285 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_3.c new file mode 100644 index 000000000..c7487b931 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_32.c new file mode 100644 index 000000000..359dde2f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_4.c new file mode 100644 index 000000000..146d04f2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_5.c new file mode 100644 index 000000000..b3371a31a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_6.c new file mode 100644 index 000000000..017798f85 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_64.c new file mode 100644 index 000000000..a41e959b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_7.c new file mode 100644 index 000000000..eb1786709 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_8.c new file mode 100644 index 000000000..0af55a5a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_9.c new file mode 100644 index 000000000..8ea15959b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_10.c new file mode 100644 index 000000000..52da40376 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_2.c new file mode 100644 index 000000000..2e5ded69e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_3.c new file mode 100644 index 000000000..2221f0909 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_4.c new file mode 100644 index 000000000..3bc64b4a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_5.c new file mode 100644 index 000000000..83d1cec92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_6.c new file mode 100644 index 000000000..b4bd18eb4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_7.c new file mode 100644 index 000000000..cc86e3dad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_8.c new file mode 100644 index 000000000..a7f5a68a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_9.c new file mode 100644 index 000000000..7f7df964c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_10.c new file mode 100644 index 000000000..8875fc614 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_12.c new file mode 100644 index 000000000..eeef4dda7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_15.c new file mode 100644 index 000000000..95e06795d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_16.c new file mode 100644 index 000000000..85e7824ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_2.c new file mode 100644 index 000000000..2578e1a41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_20.c new file mode 100644 index 000000000..f52ffb829 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_25.c new file mode 100644 index 000000000..703217508 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_3.c new file mode 100644 index 000000000..07faa2745 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_32.c new file mode 100644 index 000000000..32b83f8a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_4.c new file mode 100644 index 000000000..b60eda792 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_5.c new file mode 100644 index 000000000..fa889f8e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_6.c new file mode 100644 index 000000000..ffdb7ce3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_64.c new file mode 100644 index 000000000..7f4d99660 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_7.c new file mode 100644 index 000000000..e8d4c7a2e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_8.c new file mode 100644 index 000000000..d25cb652f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_9.c new file mode 100644 index 000000000..573cc3576 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_16.c new file mode 100644 index 000000000..6298d3c36 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_2.c new file mode 100644 index 000000000..077ae7a8b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_32.c new file mode 100644 index 000000000..fd93afc12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_4.c new file mode 100644 index 000000000..e530cc9ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_8.c new file mode 100644 index 000000000..14fb0839c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_10.c new file mode 100644 index 000000000..adf18df28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_16.c new file mode 100644 index 000000000..efaca57c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_2.c new file mode 100644 index 000000000..ec9f796ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_20.c new file mode 100644 index 000000000..e541134d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_25.c new file mode 100644 index 000000000..be8f18a4b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_32.c new file mode 100644 index 000000000..09f717b1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_4.c new file mode 100644 index 000000000..f0151f1bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_5.c new file mode 100644 index 000000000..5f5f756c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_64.c new file mode 100644 index 000000000..991f363db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_8.c new file mode 100644 index 000000000..a07dd7338 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_10.c new file mode 100644 index 000000000..4e05edc97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_16.c new file mode 100644 index 000000000..8a641d49f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_2.c new file mode 100644 index 000000000..3c2bb17b0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_20.c new file mode 100644 index 000000000..a9bb4aed6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_25.c new file mode 100644 index 000000000..8e947920f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_32.c new file mode 100644 index 000000000..8651e72e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_4.c new file mode 100644 index 000000000..6237f9d30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_5.c new file mode 100644 index 000000000..7dbad1107 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_64.c new file mode 100644 index 000000000..e603a0876 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_8.c new file mode 100644 index 000000000..d2c666933 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_16.c new file mode 100644 index 000000000..1fe60876b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_32.c new file mode 100644 index 000000000..4d879dcf1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_4.c new file mode 100644 index 000000000..179bf9045 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_8.c new file mode 100644 index 000000000..17ac2a5dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_10.c new file mode 100644 index 000000000..f6d15b7b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_16.c new file mode 100644 index 000000000..83fd75ef2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_20.c new file mode 100644 index 000000000..bbf6c1983 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_25.c new file mode 100644 index 000000000..522fb4d65 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_32.c new file mode 100644 index 000000000..a6d5ee032 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_4.c new file mode 100644 index 000000000..dd3295bfe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_5.c new file mode 100644 index 000000000..c7aee1314 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_8.c new file mode 100644 index 000000000..793fc57d5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_10.c new file mode 100644 index 000000000..ea9d5c5e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_16.c new file mode 100644 index 000000000..7e1d0ca79 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_20.c new file mode 100644 index 000000000..aa816d733 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_25.c new file mode 100644 index 000000000..6c2b6114a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_32.c new file mode 100644 index 000000000..e882bb761 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_4.c new file mode 100644 index 000000000..db894f642 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_5.c new file mode 100644 index 000000000..f9e018dc8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_8.c new file mode 100644 index 000000000..bf5254e22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/altivec/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/Makefile.am new file mode 100644 index 000000000..01f1ed28d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(AVX_128_FMA_CFLAGS) +SIMD_HEADER=simd-support/simd-avx-128-fma.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_AVX_128_FMA + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_avx_128_fma_codelets.la +libdft_avx_128_fma_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/Makefile.in new file mode 100644 index 000000000..44ad068f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/avx-128-fma +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_avx_128_fma_codelets_la_LIBADD = +am__libdft_avx_128_fma_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c \ + n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c \ + n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ + n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c \ + n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ + n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c \ + n1bv_15.c n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c \ + n1bv_25.c n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c \ + n2fv_12.c n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c \ + n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ + n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c \ + n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c \ + t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c \ + t1fuv_10.c t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c \ + t1fv_7.c t1fv_8.c t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c \ + t1fv_16.c t1fv_32.c t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c \ + t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c \ + t2fv_10.c t2fv_20.c t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c \ + t3fv_32.c t3fv_5.c t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c \ + t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c \ + t1buv_9.c t1buv_10.c t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c \ + t1bv_6.c t1bv_7.c t1bv_8.c t1bv_9.c t1bv_10.c t1bv_12.c \ + t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c t1bv_20.c t1bv_25.c \ + t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ + t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c t3bv_4.c t3bv_8.c \ + t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c t3bv_20.c t3bv_25.c \ + t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c t2sv_4.c \ + t2sv_8.c t2sv_16.c t2sv_32.c q1fv_2.c q1fv_4.c q1fv_5.c \ + q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_AVX_128_FMA_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_AVX_128_FMA_TRUE@am_libdft_avx_128_fma_codelets_la_OBJECTS = \ +@HAVE_AVX_128_FMA_TRUE@ $(am__objects_20) +libdft_avx_128_fma_codelets_la_OBJECTS = \ + $(am_libdft_avx_128_fma_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX_128_FMA_TRUE@am_libdft_avx_128_fma_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_avx_128_fma_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_avx_128_fma_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX_128_FMA_CFLAGS) +SIMD_HEADER = simd-support/simd-avx-128-fma.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX_128_FMA_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX_128_FMA_TRUE@noinst_LTLIBRARIES = libdft_avx_128_fma_codelets.la +@HAVE_AVX_128_FMA_TRUE@libdft_avx_128_fma_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/avx-128-fma/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/avx-128-fma/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_avx_128_fma_codelets.la: $(libdft_avx_128_fma_codelets_la_OBJECTS) $(libdft_avx_128_fma_codelets_la_DEPENDENCIES) $(EXTRA_libdft_avx_128_fma_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_avx_128_fma_codelets_la_rpath) $(libdft_avx_128_fma_codelets_la_OBJECTS) $(libdft_avx_128_fma_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/codlist.c new file mode 100644 index 000000000..98f09a717 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/genus.c new file mode 100644 index 000000000..bdca18e83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_10.c new file mode 100644 index 000000000..7f81cb939 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_11.c new file mode 100644 index 000000000..526d381cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_12.c new file mode 100644 index 000000000..8cf89b11c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_128.c new file mode 100644 index 000000000..23f76a0a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_13.c new file mode 100644 index 000000000..f44e9991d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_14.c new file mode 100644 index 000000000..792444e61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_15.c new file mode 100644 index 000000000..968983a12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_16.c new file mode 100644 index 000000000..f0f6f723d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_2.c new file mode 100644 index 000000000..563579c00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_20.c new file mode 100644 index 000000000..7f0d55641 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_25.c new file mode 100644 index 000000000..511b63ea3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_3.c new file mode 100644 index 000000000..373d97082 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_32.c new file mode 100644 index 000000000..c54479d12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_4.c new file mode 100644 index 000000000..041d4fc61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_5.c new file mode 100644 index 000000000..8676f7de7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_6.c new file mode 100644 index 000000000..87734cfe2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_64.c new file mode 100644 index 000000000..0e3c8dc52 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_7.c new file mode 100644 index 000000000..6f95bd7a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_8.c new file mode 100644 index 000000000..c58663078 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_9.c new file mode 100644 index 000000000..c27bcbd64 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_10.c new file mode 100644 index 000000000..53de2b831 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_11.c new file mode 100644 index 000000000..9abce90c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_12.c new file mode 100644 index 000000000..c630634f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_128.c new file mode 100644 index 000000000..1baf152b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_13.c new file mode 100644 index 000000000..fa2337cb6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_14.c new file mode 100644 index 000000000..65c555626 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_15.c new file mode 100644 index 000000000..46221b7f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_16.c new file mode 100644 index 000000000..6a40bd39d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_2.c new file mode 100644 index 000000000..884377614 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_20.c new file mode 100644 index 000000000..8138d308b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_25.c new file mode 100644 index 000000000..0d4338458 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_3.c new file mode 100644 index 000000000..20ee3ef6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_32.c new file mode 100644 index 000000000..69c6fbc0c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_4.c new file mode 100644 index 000000000..d0bfafeec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_5.c new file mode 100644 index 000000000..bf7142d38 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_6.c new file mode 100644 index 000000000..7b85ab46a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_64.c new file mode 100644 index 000000000..f5c9e153b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_7.c new file mode 100644 index 000000000..cb5a005e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_8.c new file mode 100644 index 000000000..b1a3ef4a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_9.c new file mode 100644 index 000000000..38fff3840 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_10.c new file mode 100644 index 000000000..4f494f1de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_12.c new file mode 100644 index 000000000..87b2b0231 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_14.c new file mode 100644 index 000000000..38ffd9927 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_16.c new file mode 100644 index 000000000..1af946834 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_2.c new file mode 100644 index 000000000..252ecee84 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_20.c new file mode 100644 index 000000000..c479694da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_32.c new file mode 100644 index 000000000..d01fb39d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_4.c new file mode 100644 index 000000000..e9043d64f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_6.c new file mode 100644 index 000000000..63aa2f774 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_64.c new file mode 100644 index 000000000..e689e2aaa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_8.c new file mode 100644 index 000000000..53d8851a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_10.c new file mode 100644 index 000000000..a04e3f3ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_12.c new file mode 100644 index 000000000..53566d796 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_14.c new file mode 100644 index 000000000..243c15dae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_16.c new file mode 100644 index 000000000..6163ab8b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_2.c new file mode 100644 index 000000000..339482d4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_20.c new file mode 100644 index 000000000..6bbd590d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_32.c new file mode 100644 index 000000000..8b3d25ab1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_4.c new file mode 100644 index 000000000..dc6e76f7d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_6.c new file mode 100644 index 000000000..c8d688c59 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_64.c new file mode 100644 index 000000000..e6f500102 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_8.c new file mode 100644 index 000000000..fc46dd87d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_16.c new file mode 100644 index 000000000..09171cff3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_32.c new file mode 100644 index 000000000..dd2621d5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_4.c new file mode 100644 index 000000000..f27ebcabf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_64.c new file mode 100644 index 000000000..672e17d42 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_8.c new file mode 100644 index 000000000..03cb5fca9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_2.c new file mode 100644 index 000000000..4db8dc09e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_4.c new file mode 100644 index 000000000..5d78ee1c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_5.c new file mode 100644 index 000000000..16fbed0cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_8.c new file mode 100644 index 000000000..0e2cc51c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_2.c new file mode 100644 index 000000000..db0eed4c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_4.c new file mode 100644 index 000000000..fed756c29 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_5.c new file mode 100644 index 000000000..4b6d8d3dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_8.c new file mode 100644 index 000000000..ec87ecda8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_10.c new file mode 100644 index 000000000..9e8301ad6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_2.c new file mode 100644 index 000000000..4e2ba4ccf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_3.c new file mode 100644 index 000000000..07ee55be7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_4.c new file mode 100644 index 000000000..9fbed4caf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_5.c new file mode 100644 index 000000000..f6bc8f545 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_6.c new file mode 100644 index 000000000..53e22f2e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_7.c new file mode 100644 index 000000000..e3bdba3dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_8.c new file mode 100644 index 000000000..2126ad3eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_9.c new file mode 100644 index 000000000..7aa7d5afc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_10.c new file mode 100644 index 000000000..7d6bfda2f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_12.c new file mode 100644 index 000000000..98f22d6ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_15.c new file mode 100644 index 000000000..c35247000 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_16.c new file mode 100644 index 000000000..f3b232158 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_2.c new file mode 100644 index 000000000..4a6bb9565 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_20.c new file mode 100644 index 000000000..63dc0ed65 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_25.c new file mode 100644 index 000000000..27f389f22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_3.c new file mode 100644 index 000000000..b3ea10a69 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_32.c new file mode 100644 index 000000000..b8fca278a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_4.c new file mode 100644 index 000000000..7cb89da71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_5.c new file mode 100644 index 000000000..2fa1498ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_6.c new file mode 100644 index 000000000..c00bca4f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_64.c new file mode 100644 index 000000000..c96be3fb6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_7.c new file mode 100644 index 000000000..86f45c881 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_8.c new file mode 100644 index 000000000..587d8dab0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_9.c new file mode 100644 index 000000000..1d68bbded --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_10.c new file mode 100644 index 000000000..d250adf30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_2.c new file mode 100644 index 000000000..81fa9ed73 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_3.c new file mode 100644 index 000000000..5ac349b75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_4.c new file mode 100644 index 000000000..ebe83c14b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_5.c new file mode 100644 index 000000000..d354d6cfc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_6.c new file mode 100644 index 000000000..9bfe16119 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_7.c new file mode 100644 index 000000000..2c94015e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_8.c new file mode 100644 index 000000000..b4146d526 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_9.c new file mode 100644 index 000000000..6f7e678bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_10.c new file mode 100644 index 000000000..f8ede98d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_12.c new file mode 100644 index 000000000..75ccc87f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_15.c new file mode 100644 index 000000000..6dce295c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_16.c new file mode 100644 index 000000000..b2efa841f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_2.c new file mode 100644 index 000000000..731106cf6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_20.c new file mode 100644 index 000000000..425358889 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_25.c new file mode 100644 index 000000000..53dfd9b56 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_3.c new file mode 100644 index 000000000..df988cbb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_32.c new file mode 100644 index 000000000..9545044c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_4.c new file mode 100644 index 000000000..5b465ff43 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_5.c new file mode 100644 index 000000000..bacd248b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_6.c new file mode 100644 index 000000000..27448a3c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_64.c new file mode 100644 index 000000000..e9ac48edb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_7.c new file mode 100644 index 000000000..77a27c310 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_8.c new file mode 100644 index 000000000..c4271c8b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_9.c new file mode 100644 index 000000000..40f364705 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_16.c new file mode 100644 index 000000000..4048d9dcd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_2.c new file mode 100644 index 000000000..fbd45aed4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_32.c new file mode 100644 index 000000000..9d2b2c78f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_4.c new file mode 100644 index 000000000..2a71326d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_8.c new file mode 100644 index 000000000..1db3c4883 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_10.c new file mode 100644 index 000000000..61a570596 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_16.c new file mode 100644 index 000000000..678893825 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_2.c new file mode 100644 index 000000000..5693aa4c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_20.c new file mode 100644 index 000000000..d81f3a2a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_25.c new file mode 100644 index 000000000..f28ce6542 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_32.c new file mode 100644 index 000000000..a3d94cb19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_4.c new file mode 100644 index 000000000..401f7e17e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_5.c new file mode 100644 index 000000000..a397d0bcc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_64.c new file mode 100644 index 000000000..8f213206b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_8.c new file mode 100644 index 000000000..d0f03b5b5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_10.c new file mode 100644 index 000000000..a8636e3a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_16.c new file mode 100644 index 000000000..ce1c7efba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_2.c new file mode 100644 index 000000000..54f8b8418 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_20.c new file mode 100644 index 000000000..c52b3651b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_25.c new file mode 100644 index 000000000..b7d668f5d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_32.c new file mode 100644 index 000000000..291639e5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_4.c new file mode 100644 index 000000000..3e8d7df00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_5.c new file mode 100644 index 000000000..db783a648 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_64.c new file mode 100644 index 000000000..2b373ae7f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_8.c new file mode 100644 index 000000000..5e2b082d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_16.c new file mode 100644 index 000000000..e4d89f21c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_32.c new file mode 100644 index 000000000..a36afab41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_4.c new file mode 100644 index 000000000..b5edc843f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_8.c new file mode 100644 index 000000000..89ec6512e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_10.c new file mode 100644 index 000000000..fc25d84c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_16.c new file mode 100644 index 000000000..efdb9f6bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_20.c new file mode 100644 index 000000000..5591fae83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_25.c new file mode 100644 index 000000000..0e40054d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_32.c new file mode 100644 index 000000000..cde86ed1c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_4.c new file mode 100644 index 000000000..5496719c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_5.c new file mode 100644 index 000000000..115ec0528 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_8.c new file mode 100644 index 000000000..0f23b8c83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_10.c new file mode 100644 index 000000000..1c3b2a0ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_16.c new file mode 100644 index 000000000..42573f7a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_20.c new file mode 100644 index 000000000..7b9325369 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_25.c new file mode 100644 index 000000000..f43b1ce03 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_32.c new file mode 100644 index 000000000..b15fd9448 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_4.c new file mode 100644 index 000000000..706597e4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_5.c new file mode 100644 index 000000000..bcc709474 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_8.c new file mode 100644 index 000000000..2382ade67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx-128-fma/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/Makefile.am new file mode 100644 index 000000000..8bc1e524b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(AVX_CFLAGS) +SIMD_HEADER=simd-support/simd-avx.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_AVX + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_avx_codelets.la +libdft_avx_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/Makefile.in new file mode 100644 index 000000000..a0c50d962 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/Makefile.in @@ -0,0 +1,983 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/avx +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_avx_codelets_la_LIBADD = +am__libdft_avx_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c n1fv_4.c \ + n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c n1fv_10.c \ + n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c n1fv_16.c \ + n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c n1bv_2.c \ + n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c n1bv_9.c \ + n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ + n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c \ + n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ + n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c n2bv_2.c \ + n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c n2bv_14.c \ + n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c n2sv_8.c \ + n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c t1fuv_4.c \ + t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c t1fuv_10.c \ + t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ + t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c \ + t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c t2fv_4.c t2fv_8.c \ + t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c t2fv_10.c t2fv_20.c \ + t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c \ + t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c t1buv_3.c t1buv_4.c \ + t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c t1buv_9.c t1buv_10.c \ + t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ + t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c \ + t1bv_64.c t1bv_20.c t1bv_25.c t2bv_2.c t2bv_4.c t2bv_8.c \ + t2bv_16.c t2bv_32.c t2bv_64.c t2bv_5.c t2bv_10.c t2bv_20.c \ + t2bv_25.c t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c \ + t3bv_10.c t3bv_20.c t3bv_25.c t1sv_2.c t1sv_4.c t1sv_8.c \ + t1sv_16.c t1sv_32.c t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c \ + q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c \ + q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_AVX_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_AVX_TRUE@am_libdft_avx_codelets_la_OBJECTS = $(am__objects_20) +libdft_avx_codelets_la_OBJECTS = $(am_libdft_avx_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX_TRUE@am_libdft_avx_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_avx_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_avx_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX_CFLAGS) +SIMD_HEADER = simd-support/simd-avx.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX_TRUE@noinst_LTLIBRARIES = libdft_avx_codelets.la +@HAVE_AVX_TRUE@libdft_avx_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/avx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/avx/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_avx_codelets.la: $(libdft_avx_codelets_la_OBJECTS) $(libdft_avx_codelets_la_DEPENDENCIES) $(EXTRA_libdft_avx_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_avx_codelets_la_rpath) $(libdft_avx_codelets_la_OBJECTS) $(libdft_avx_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/codlist.c new file mode 100644 index 000000000..0f86e6984 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/genus.c new file mode 100644 index 000000000..08165fb90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_10.c new file mode 100644 index 000000000..b68f11301 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_11.c new file mode 100644 index 000000000..6aeb31124 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_12.c new file mode 100644 index 000000000..408e58589 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_128.c new file mode 100644 index 000000000..2552eb7ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_13.c new file mode 100644 index 000000000..d40c8ff2f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_14.c new file mode 100644 index 000000000..27c805bfd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_15.c new file mode 100644 index 000000000..082ddb3d5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_16.c new file mode 100644 index 000000000..148be7908 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_2.c new file mode 100644 index 000000000..f661662ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_20.c new file mode 100644 index 000000000..053cf0341 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_25.c new file mode 100644 index 000000000..55ac2bcf9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_3.c new file mode 100644 index 000000000..59a12f2f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_32.c new file mode 100644 index 000000000..1909e037a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_4.c new file mode 100644 index 000000000..4a5052632 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_5.c new file mode 100644 index 000000000..22c737110 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_6.c new file mode 100644 index 000000000..94d2cf42d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_64.c new file mode 100644 index 000000000..c28f3b098 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_7.c new file mode 100644 index 000000000..9563cb53a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_8.c new file mode 100644 index 000000000..41a459f82 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_9.c new file mode 100644 index 000000000..bd1214312 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_10.c new file mode 100644 index 000000000..795809fc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_11.c new file mode 100644 index 000000000..1192a4eb5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_12.c new file mode 100644 index 000000000..4fd274325 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_128.c new file mode 100644 index 000000000..6461eb4cf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_13.c new file mode 100644 index 000000000..b161ee9fc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_14.c new file mode 100644 index 000000000..c6d202088 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_15.c new file mode 100644 index 000000000..e6d960468 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_16.c new file mode 100644 index 000000000..0822ff19a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_2.c new file mode 100644 index 000000000..0b8510ec9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_20.c new file mode 100644 index 000000000..bbb38dba7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_25.c new file mode 100644 index 000000000..3cfc1faee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_3.c new file mode 100644 index 000000000..25b12b6e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_32.c new file mode 100644 index 000000000..c1f453323 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_4.c new file mode 100644 index 000000000..8030cb407 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_5.c new file mode 100644 index 000000000..98d1d8205 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_6.c new file mode 100644 index 000000000..be38256bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_64.c new file mode 100644 index 000000000..e4ac4df1c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_7.c new file mode 100644 index 000000000..6a5e49d80 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_8.c new file mode 100644 index 000000000..533351e2e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_9.c new file mode 100644 index 000000000..27ed921e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_10.c new file mode 100644 index 000000000..bc3e4435d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_12.c new file mode 100644 index 000000000..697cf71f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_14.c new file mode 100644 index 000000000..863b08bc2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_16.c new file mode 100644 index 000000000..a1318c0b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_2.c new file mode 100644 index 000000000..d15b980aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_20.c new file mode 100644 index 000000000..4a9d5c5b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_32.c new file mode 100644 index 000000000..e6e3f7259 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_4.c new file mode 100644 index 000000000..e8d6ba236 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_6.c new file mode 100644 index 000000000..0b7c26c55 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_64.c new file mode 100644 index 000000000..9b643085e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_8.c new file mode 100644 index 000000000..7d7af8f0b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_10.c new file mode 100644 index 000000000..239cb4935 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_12.c new file mode 100644 index 000000000..24f70db76 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_14.c new file mode 100644 index 000000000..c5aecdcf4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_16.c new file mode 100644 index 000000000..1dc0fac30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_2.c new file mode 100644 index 000000000..c7e4771a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_20.c new file mode 100644 index 000000000..5dc514e54 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_32.c new file mode 100644 index 000000000..99fe6d853 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_4.c new file mode 100644 index 000000000..bbb2d1a2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_6.c new file mode 100644 index 000000000..1939949dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_64.c new file mode 100644 index 000000000..8e9fff32c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_8.c new file mode 100644 index 000000000..702c43e0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_16.c new file mode 100644 index 000000000..44b7c1753 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_32.c new file mode 100644 index 000000000..4af4d553d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_4.c new file mode 100644 index 000000000..a6bb5b0c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_64.c new file mode 100644 index 000000000..bcc39d8b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_8.c new file mode 100644 index 000000000..48920e5a9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_2.c new file mode 100644 index 000000000..26cba3877 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_4.c new file mode 100644 index 000000000..15ed9584d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_5.c new file mode 100644 index 000000000..fbb492eb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_8.c new file mode 100644 index 000000000..45e992772 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_2.c new file mode 100644 index 000000000..bf214c2b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_4.c new file mode 100644 index 000000000..f6b0908d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_5.c new file mode 100644 index 000000000..7d6b41806 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_8.c new file mode 100644 index 000000000..16a2b93a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_10.c new file mode 100644 index 000000000..df56b8bad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_2.c new file mode 100644 index 000000000..33793be53 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_3.c new file mode 100644 index 000000000..d21e0ea5c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_4.c new file mode 100644 index 000000000..6fdd402af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_5.c new file mode 100644 index 000000000..ebef3c889 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_6.c new file mode 100644 index 000000000..e87db23d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_7.c new file mode 100644 index 000000000..c2ba83160 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_8.c new file mode 100644 index 000000000..4965f2acc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_9.c new file mode 100644 index 000000000..f9fe98052 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_10.c new file mode 100644 index 000000000..8822221de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_12.c new file mode 100644 index 000000000..12373485d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_15.c new file mode 100644 index 000000000..b6497e7e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_16.c new file mode 100644 index 000000000..bb13dc780 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_2.c new file mode 100644 index 000000000..0ff7109b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_20.c new file mode 100644 index 000000000..d278987ce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_25.c new file mode 100644 index 000000000..23c5b2515 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_3.c new file mode 100644 index 000000000..684845dd1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_32.c new file mode 100644 index 000000000..b07e8d973 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_4.c new file mode 100644 index 000000000..b5a5efa41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_5.c new file mode 100644 index 000000000..834cb9177 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_6.c new file mode 100644 index 000000000..834f57d62 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_64.c new file mode 100644 index 000000000..aa5a0f490 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_7.c new file mode 100644 index 000000000..9bfd5592c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_8.c new file mode 100644 index 000000000..3f4c850c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_9.c new file mode 100644 index 000000000..4b92698b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_10.c new file mode 100644 index 000000000..fe3468f2e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_2.c new file mode 100644 index 000000000..ff87ff7b5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_3.c new file mode 100644 index 000000000..d0b57148e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_4.c new file mode 100644 index 000000000..71f1bced5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_5.c new file mode 100644 index 000000000..ec55005cf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_6.c new file mode 100644 index 000000000..57e026ccf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_7.c new file mode 100644 index 000000000..de7c50b28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_8.c new file mode 100644 index 000000000..65436bb1c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_9.c new file mode 100644 index 000000000..643574a22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_10.c new file mode 100644 index 000000000..081a6c03e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_12.c new file mode 100644 index 000000000..02231eedc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_15.c new file mode 100644 index 000000000..1e8cdfc78 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_16.c new file mode 100644 index 000000000..86205b910 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_2.c new file mode 100644 index 000000000..c2043ecef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_20.c new file mode 100644 index 000000000..9265fa5fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_25.c new file mode 100644 index 000000000..1420820e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_3.c new file mode 100644 index 000000000..83c17fe8a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_32.c new file mode 100644 index 000000000..224e2ba5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_4.c new file mode 100644 index 000000000..22bf1b5f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_5.c new file mode 100644 index 000000000..cfff381a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_6.c new file mode 100644 index 000000000..8c7512b39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_64.c new file mode 100644 index 000000000..00b9daa87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_7.c new file mode 100644 index 000000000..c24399baf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_8.c new file mode 100644 index 000000000..97ee8fcbe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_9.c new file mode 100644 index 000000000..3aecb0652 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_16.c new file mode 100644 index 000000000..615f7a7da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_2.c new file mode 100644 index 000000000..481caab9c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_32.c new file mode 100644 index 000000000..b9df15d5a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_4.c new file mode 100644 index 000000000..f5b6d6bd8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_8.c new file mode 100644 index 000000000..eabd65aba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_10.c new file mode 100644 index 000000000..7d28dd65c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_16.c new file mode 100644 index 000000000..40744e461 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_2.c new file mode 100644 index 000000000..138e608ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_20.c new file mode 100644 index 000000000..28cf7c87e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_25.c new file mode 100644 index 000000000..691b4520b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_32.c new file mode 100644 index 000000000..59cb91023 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_4.c new file mode 100644 index 000000000..d71c0f3f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_5.c new file mode 100644 index 000000000..1e2be9f97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_64.c new file mode 100644 index 000000000..3f08d0fba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_8.c new file mode 100644 index 000000000..f44605cea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_10.c new file mode 100644 index 000000000..8c9e69550 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_16.c new file mode 100644 index 000000000..368995e7a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_2.c new file mode 100644 index 000000000..6287beacd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_20.c new file mode 100644 index 000000000..13329eb7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_25.c new file mode 100644 index 000000000..4e86e1b87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_32.c new file mode 100644 index 000000000..665053276 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_4.c new file mode 100644 index 000000000..d023ce21d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_5.c new file mode 100644 index 000000000..4037665ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_64.c new file mode 100644 index 000000000..c4f670a90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_8.c new file mode 100644 index 000000000..888d66c1e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_16.c new file mode 100644 index 000000000..328a3af0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_32.c new file mode 100644 index 000000000..7368431ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_4.c new file mode 100644 index 000000000..42e0f4cea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_8.c new file mode 100644 index 000000000..ee61aecc9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_10.c new file mode 100644 index 000000000..3ad3fc54b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_16.c new file mode 100644 index 000000000..5ed59325e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_20.c new file mode 100644 index 000000000..75531b84c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_25.c new file mode 100644 index 000000000..5390981a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_32.c new file mode 100644 index 000000000..00f1fbcc7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_4.c new file mode 100644 index 000000000..53132c0a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_5.c new file mode 100644 index 000000000..3576e68dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_8.c new file mode 100644 index 000000000..d610c3887 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_10.c new file mode 100644 index 000000000..5db450066 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_16.c new file mode 100644 index 000000000..7bc2d96e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_20.c new file mode 100644 index 000000000..82acb3264 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_25.c new file mode 100644 index 000000000..3c80fd892 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_32.c new file mode 100644 index 000000000..ab768937e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_4.c new file mode 100644 index 000000000..c43648ab0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_5.c new file mode 100644 index 000000000..0c083ffad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_8.c new file mode 100644 index 000000000..85cde15bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/Makefile.am new file mode 100644 index 000000000..7947739ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER=simd-support/simd-avx2-128.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_AVX2 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_avx2_128_codelets.la +libdft_avx2_128_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/Makefile.in new file mode 100644 index 000000000..1b093a51d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/avx2-128 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_avx2_128_codelets_la_LIBADD = +am__libdft_avx2_128_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c \ + n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c \ + n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ + n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c \ + n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ + n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c \ + n1bv_15.c n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c \ + n1bv_25.c n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c \ + n2fv_12.c n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c \ + n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ + n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c \ + n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c \ + t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c \ + t1fuv_10.c t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c \ + t1fv_7.c t1fv_8.c t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c \ + t1fv_16.c t1fv_32.c t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c \ + t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c \ + t2fv_10.c t2fv_20.c t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c \ + t3fv_32.c t3fv_5.c t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c \ + t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c \ + t1buv_9.c t1buv_10.c t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c \ + t1bv_6.c t1bv_7.c t1bv_8.c t1bv_9.c t1bv_10.c t1bv_12.c \ + t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c t1bv_20.c t1bv_25.c \ + t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ + t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c t3bv_4.c t3bv_8.c \ + t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c t3bv_20.c t3bv_25.c \ + t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c t2sv_4.c \ + t2sv_8.c t2sv_16.c t2sv_32.c q1fv_2.c q1fv_4.c q1fv_5.c \ + q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_AVX2_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_AVX2_TRUE@am_libdft_avx2_128_codelets_la_OBJECTS = \ +@HAVE_AVX2_TRUE@ $(am__objects_20) +libdft_avx2_128_codelets_la_OBJECTS = \ + $(am_libdft_avx2_128_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX2_TRUE@am_libdft_avx2_128_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_avx2_128_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_avx2_128_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER = simd-support/simd-avx2-128.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX2_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX2_TRUE@noinst_LTLIBRARIES = libdft_avx2_128_codelets.la +@HAVE_AVX2_TRUE@libdft_avx2_128_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/avx2-128/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/avx2-128/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_avx2_128_codelets.la: $(libdft_avx2_128_codelets_la_OBJECTS) $(libdft_avx2_128_codelets_la_DEPENDENCIES) $(EXTRA_libdft_avx2_128_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_avx2_128_codelets_la_rpath) $(libdft_avx2_128_codelets_la_OBJECTS) $(libdft_avx2_128_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/codlist.c new file mode 100644 index 000000000..43c4ee445 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/genus.c new file mode 100644 index 000000000..a012fa48f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_10.c new file mode 100644 index 000000000..1ef76e8a9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_11.c new file mode 100644 index 000000000..4fb4cbae2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_12.c new file mode 100644 index 000000000..eb8e6ee27 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_128.c new file mode 100644 index 000000000..879136121 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_13.c new file mode 100644 index 000000000..aa9bfd355 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_14.c new file mode 100644 index 000000000..2544a6a68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_15.c new file mode 100644 index 000000000..20903b6cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_16.c new file mode 100644 index 000000000..80bc099b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_2.c new file mode 100644 index 000000000..d0217947d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_20.c new file mode 100644 index 000000000..8c534f386 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_25.c new file mode 100644 index 000000000..b3a7bd455 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_3.c new file mode 100644 index 000000000..9656ba6b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_32.c new file mode 100644 index 000000000..093b5f5bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_4.c new file mode 100644 index 000000000..81a39d503 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_5.c new file mode 100644 index 000000000..8bc5e65cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_6.c new file mode 100644 index 000000000..2a88d887b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_64.c new file mode 100644 index 000000000..c5eff2e92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_7.c new file mode 100644 index 000000000..72138c093 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_8.c new file mode 100644 index 000000000..6e571a8c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_9.c new file mode 100644 index 000000000..337be826a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_10.c new file mode 100644 index 000000000..9e96de7dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_11.c new file mode 100644 index 000000000..7f51e0509 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_12.c new file mode 100644 index 000000000..e2a222b28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_128.c new file mode 100644 index 000000000..952267795 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_13.c new file mode 100644 index 000000000..9d6bffac7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_14.c new file mode 100644 index 000000000..fe7d47186 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_15.c new file mode 100644 index 000000000..30bba1407 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_16.c new file mode 100644 index 000000000..134804e33 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_2.c new file mode 100644 index 000000000..3b1ac0196 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_20.c new file mode 100644 index 000000000..3da9a86a3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_25.c new file mode 100644 index 000000000..d32f608a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_3.c new file mode 100644 index 000000000..dd30a5e4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_32.c new file mode 100644 index 000000000..a040efa2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_4.c new file mode 100644 index 000000000..401447b55 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_5.c new file mode 100644 index 000000000..5735dc683 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_6.c new file mode 100644 index 000000000..f1be2e71b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_64.c new file mode 100644 index 000000000..bdf3ac672 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_7.c new file mode 100644 index 000000000..4d07faad1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_8.c new file mode 100644 index 000000000..3b157bcfd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_9.c new file mode 100644 index 000000000..5a7ed51d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_10.c new file mode 100644 index 000000000..554d581a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_12.c new file mode 100644 index 000000000..92809696a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_14.c new file mode 100644 index 000000000..691431efa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_16.c new file mode 100644 index 000000000..c4a1e9e96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_2.c new file mode 100644 index 000000000..b65aa9ccf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_20.c new file mode 100644 index 000000000..5d6dc09d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_32.c new file mode 100644 index 000000000..b20d8373d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_4.c new file mode 100644 index 000000000..c3463faf4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_6.c new file mode 100644 index 000000000..d3d68a4aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_64.c new file mode 100644 index 000000000..d2ce3a8c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_8.c new file mode 100644 index 000000000..606d37477 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_10.c new file mode 100644 index 000000000..e54873b4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_12.c new file mode 100644 index 000000000..008f2b09a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_14.c new file mode 100644 index 000000000..312999eaf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_16.c new file mode 100644 index 000000000..b53bb96a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_2.c new file mode 100644 index 000000000..afb9f9fcd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_20.c new file mode 100644 index 000000000..e2a9227cd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_32.c new file mode 100644 index 000000000..101e8c140 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_4.c new file mode 100644 index 000000000..077de57fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_6.c new file mode 100644 index 000000000..46ff19758 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_64.c new file mode 100644 index 000000000..c422b2049 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_8.c new file mode 100644 index 000000000..bb06db350 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_16.c new file mode 100644 index 000000000..64aa59f27 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_32.c new file mode 100644 index 000000000..7cc8ebd97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_4.c new file mode 100644 index 000000000..0976e1097 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_64.c new file mode 100644 index 000000000..cda433091 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_8.c new file mode 100644 index 000000000..13c1480a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_2.c new file mode 100644 index 000000000..961aa2700 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_4.c new file mode 100644 index 000000000..75950cc14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_5.c new file mode 100644 index 000000000..0b738e7e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_8.c new file mode 100644 index 000000000..8366b3730 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_2.c new file mode 100644 index 000000000..e37067a95 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_4.c new file mode 100644 index 000000000..a293fefdf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_5.c new file mode 100644 index 000000000..fab20025b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_8.c new file mode 100644 index 000000000..28b80771d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_10.c new file mode 100644 index 000000000..eec570856 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_2.c new file mode 100644 index 000000000..31ce7e700 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_3.c new file mode 100644 index 000000000..6194f6f5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_4.c new file mode 100644 index 000000000..a16e27e1e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_5.c new file mode 100644 index 000000000..7b63e5a2a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_6.c new file mode 100644 index 000000000..344cf8f56 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_7.c new file mode 100644 index 000000000..b224e9039 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_8.c new file mode 100644 index 000000000..87d59c830 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_9.c new file mode 100644 index 000000000..083b40102 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_10.c new file mode 100644 index 000000000..fd3436f73 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_12.c new file mode 100644 index 000000000..29d5c65e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_15.c new file mode 100644 index 000000000..436a025aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_16.c new file mode 100644 index 000000000..d57bf28d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_2.c new file mode 100644 index 000000000..3a378f7f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_20.c new file mode 100644 index 000000000..a9d4a125d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_25.c new file mode 100644 index 000000000..fa1ee4919 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_3.c new file mode 100644 index 000000000..c6b580d5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_32.c new file mode 100644 index 000000000..35e4ce25f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_4.c new file mode 100644 index 000000000..42754dcdd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_5.c new file mode 100644 index 000000000..94f2a70df --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_6.c new file mode 100644 index 000000000..9f14aa854 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_64.c new file mode 100644 index 000000000..45f5edb3b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_7.c new file mode 100644 index 000000000..8c40176d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_8.c new file mode 100644 index 000000000..098d7bf35 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_9.c new file mode 100644 index 000000000..a944a167d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_10.c new file mode 100644 index 000000000..73fabad16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_2.c new file mode 100644 index 000000000..358f09c3a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_3.c new file mode 100644 index 000000000..6545bb88a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_4.c new file mode 100644 index 000000000..b518d2dbd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_5.c new file mode 100644 index 000000000..6affce75c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_6.c new file mode 100644 index 000000000..9ff0de5e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_7.c new file mode 100644 index 000000000..189a606da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_8.c new file mode 100644 index 000000000..564ee4d9b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_9.c new file mode 100644 index 000000000..d46b15e2c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_10.c new file mode 100644 index 000000000..e4f87a13b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_12.c new file mode 100644 index 000000000..d20e25426 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_15.c new file mode 100644 index 000000000..a33249af0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_16.c new file mode 100644 index 000000000..5043c1fb1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_2.c new file mode 100644 index 000000000..81011d5d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_20.c new file mode 100644 index 000000000..90cc029ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_25.c new file mode 100644 index 000000000..52f358dd9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_3.c new file mode 100644 index 000000000..8011079ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_32.c new file mode 100644 index 000000000..db0cad854 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_4.c new file mode 100644 index 000000000..1c8c65d39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_5.c new file mode 100644 index 000000000..55ee81f26 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_6.c new file mode 100644 index 000000000..0ae81060e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_64.c new file mode 100644 index 000000000..ce0f4854e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_7.c new file mode 100644 index 000000000..b05553009 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_8.c new file mode 100644 index 000000000..e2feb756f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_9.c new file mode 100644 index 000000000..dff09136b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_16.c new file mode 100644 index 000000000..50ba2877f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_2.c new file mode 100644 index 000000000..803494867 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_32.c new file mode 100644 index 000000000..af81ad7e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_4.c new file mode 100644 index 000000000..72e6cbd2f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_8.c new file mode 100644 index 000000000..b5b34a985 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_10.c new file mode 100644 index 000000000..92acc83e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_16.c new file mode 100644 index 000000000..705100dca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_2.c new file mode 100644 index 000000000..f7d6a6333 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_20.c new file mode 100644 index 000000000..c844d0d6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_25.c new file mode 100644 index 000000000..27d3a5eac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_32.c new file mode 100644 index 000000000..786829199 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_4.c new file mode 100644 index 000000000..657ad3d92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_5.c new file mode 100644 index 000000000..fff671dad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_64.c new file mode 100644 index 000000000..baba3f8d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_8.c new file mode 100644 index 000000000..b7aba9015 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_10.c new file mode 100644 index 000000000..070850a1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_16.c new file mode 100644 index 000000000..0aef2a073 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_2.c new file mode 100644 index 000000000..cc50ead57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_20.c new file mode 100644 index 000000000..99d9cb77d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_25.c new file mode 100644 index 000000000..21b26e311 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_32.c new file mode 100644 index 000000000..befff955a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_4.c new file mode 100644 index 000000000..e6fe3f183 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_5.c new file mode 100644 index 000000000..d8410b3ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_64.c new file mode 100644 index 000000000..8af507d3c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_8.c new file mode 100644 index 000000000..e1223e63d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_16.c new file mode 100644 index 000000000..c00c39299 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_32.c new file mode 100644 index 000000000..c5716ff85 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_4.c new file mode 100644 index 000000000..14def7c16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_8.c new file mode 100644 index 000000000..1eb792738 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_10.c new file mode 100644 index 000000000..db51c0bb4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_16.c new file mode 100644 index 000000000..44bf3ed5f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_20.c new file mode 100644 index 000000000..94e8de230 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_25.c new file mode 100644 index 000000000..9cb7874b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_32.c new file mode 100644 index 000000000..f570d445c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_4.c new file mode 100644 index 000000000..54404d978 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_5.c new file mode 100644 index 000000000..2c6cf0f92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_8.c new file mode 100644 index 000000000..636ebbf06 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_10.c new file mode 100644 index 000000000..01c310f27 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_16.c new file mode 100644 index 000000000..020b040e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_20.c new file mode 100644 index 000000000..01f1160b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_25.c new file mode 100644 index 000000000..1cf9ac12b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_32.c new file mode 100644 index 000000000..ab7f21b16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_4.c new file mode 100644 index 000000000..70ee32634 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_5.c new file mode 100644 index 000000000..25860a6fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_8.c new file mode 100644 index 000000000..b8ccd3254 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2-128/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/Makefile.am new file mode 100644 index 000000000..8f97d4881 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER=simd-support/simd-avx2.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_AVX2 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_avx2_codelets.la +libdft_avx2_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/Makefile.in new file mode 100644 index 000000000..7d380172a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/avx2 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_avx2_codelets_la_LIBADD = +am__libdft_avx2_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c n1fv_4.c \ + n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c n1fv_10.c \ + n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c n1fv_16.c \ + n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c n1bv_2.c \ + n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c n1bv_9.c \ + n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ + n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c \ + n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ + n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c n2bv_2.c \ + n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c n2bv_14.c \ + n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c n2sv_8.c \ + n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c t1fuv_4.c \ + t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c t1fuv_10.c \ + t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ + t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c \ + t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c t2fv_4.c t2fv_8.c \ + t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c t2fv_10.c t2fv_20.c \ + t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c \ + t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c t1buv_3.c t1buv_4.c \ + t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c t1buv_9.c t1buv_10.c \ + t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ + t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c \ + t1bv_64.c t1bv_20.c t1bv_25.c t2bv_2.c t2bv_4.c t2bv_8.c \ + t2bv_16.c t2bv_32.c t2bv_64.c t2bv_5.c t2bv_10.c t2bv_20.c \ + t2bv_25.c t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c \ + t3bv_10.c t3bv_20.c t3bv_25.c t1sv_2.c t1sv_4.c t1sv_8.c \ + t1sv_16.c t1sv_32.c t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c \ + q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c \ + q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_AVX2_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_AVX2_TRUE@am_libdft_avx2_codelets_la_OBJECTS = \ +@HAVE_AVX2_TRUE@ $(am__objects_20) +libdft_avx2_codelets_la_OBJECTS = \ + $(am_libdft_avx2_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX2_TRUE@am_libdft_avx2_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_avx2_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_avx2_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER = simd-support/simd-avx2.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX2_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX2_TRUE@noinst_LTLIBRARIES = libdft_avx2_codelets.la +@HAVE_AVX2_TRUE@libdft_avx2_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/avx2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/avx2/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_avx2_codelets.la: $(libdft_avx2_codelets_la_OBJECTS) $(libdft_avx2_codelets_la_DEPENDENCIES) $(EXTRA_libdft_avx2_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_avx2_codelets_la_rpath) $(libdft_avx2_codelets_la_OBJECTS) $(libdft_avx2_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/codlist.c new file mode 100644 index 000000000..887efa3af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/genus.c new file mode 100644 index 000000000..3f31c3733 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_10.c new file mode 100644 index 000000000..b7925e2a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_11.c new file mode 100644 index 000000000..4f831533c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_12.c new file mode 100644 index 000000000..3bb540b29 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_128.c new file mode 100644 index 000000000..1dd6d5c3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_13.c new file mode 100644 index 000000000..f05a467d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_14.c new file mode 100644 index 000000000..2a36785b0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_15.c new file mode 100644 index 000000000..78bf7258f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_16.c new file mode 100644 index 000000000..5c51a7e70 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_2.c new file mode 100644 index 000000000..7889fe662 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_20.c new file mode 100644 index 000000000..c9818d7af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_25.c new file mode 100644 index 000000000..e97ce75f7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_3.c new file mode 100644 index 000000000..e609c52c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_32.c new file mode 100644 index 000000000..36b866f20 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_4.c new file mode 100644 index 000000000..6a56b892b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_5.c new file mode 100644 index 000000000..15ea78b40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_6.c new file mode 100644 index 000000000..b0394b434 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_64.c new file mode 100644 index 000000000..f28713ff8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_7.c new file mode 100644 index 000000000..6e33e72aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_8.c new file mode 100644 index 000000000..d7a7e5823 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_9.c new file mode 100644 index 000000000..e20d3ee5a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_10.c new file mode 100644 index 000000000..746f203e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_11.c new file mode 100644 index 000000000..40a3fd0e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_12.c new file mode 100644 index 000000000..ba973cd3a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_128.c new file mode 100644 index 000000000..73088ca86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_13.c new file mode 100644 index 000000000..5cb2abb59 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_14.c new file mode 100644 index 000000000..4990f68d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_15.c new file mode 100644 index 000000000..c10cc2c0c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_16.c new file mode 100644 index 000000000..85ff9cd36 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_2.c new file mode 100644 index 000000000..c96060006 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_20.c new file mode 100644 index 000000000..7153d0628 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_25.c new file mode 100644 index 000000000..dd0063ce9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_3.c new file mode 100644 index 000000000..3970329cd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_32.c new file mode 100644 index 000000000..42808db89 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_4.c new file mode 100644 index 000000000..88f2b720a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_5.c new file mode 100644 index 000000000..fe855cfad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_6.c new file mode 100644 index 000000000..3bc4a1663 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_64.c new file mode 100644 index 000000000..47662ccc0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_7.c new file mode 100644 index 000000000..c160b1588 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_8.c new file mode 100644 index 000000000..746f90198 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_9.c new file mode 100644 index 000000000..3f2400223 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_10.c new file mode 100644 index 000000000..19d5b6869 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_12.c new file mode 100644 index 000000000..74872bec6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_14.c new file mode 100644 index 000000000..8b7b2b93b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_16.c new file mode 100644 index 000000000..7e0304721 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_2.c new file mode 100644 index 000000000..b9efa898d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_20.c new file mode 100644 index 000000000..204a418ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_32.c new file mode 100644 index 000000000..fa35fcb6e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_4.c new file mode 100644 index 000000000..df4e1ebc3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_6.c new file mode 100644 index 000000000..4997b08e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_64.c new file mode 100644 index 000000000..e7508529b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_8.c new file mode 100644 index 000000000..9e3764974 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_10.c new file mode 100644 index 000000000..e3348bdb2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_12.c new file mode 100644 index 000000000..cff022e7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_14.c new file mode 100644 index 000000000..14629c14d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_16.c new file mode 100644 index 000000000..3eb7f3363 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_2.c new file mode 100644 index 000000000..92a339790 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_20.c new file mode 100644 index 000000000..e3f054c86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_32.c new file mode 100644 index 000000000..b5ec4b2ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_4.c new file mode 100644 index 000000000..fa2c5e11c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_6.c new file mode 100644 index 000000000..23b40b5f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_64.c new file mode 100644 index 000000000..bb87d1eb6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_8.c new file mode 100644 index 000000000..380efee99 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_16.c new file mode 100644 index 000000000..2986a69e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_32.c new file mode 100644 index 000000000..4bcd0a767 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_4.c new file mode 100644 index 000000000..61d8f0570 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_64.c new file mode 100644 index 000000000..411194b36 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_8.c new file mode 100644 index 000000000..28a8189f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_2.c new file mode 100644 index 000000000..8ae4436df --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_4.c new file mode 100644 index 000000000..ecf2c69d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_5.c new file mode 100644 index 000000000..f495edc0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_8.c new file mode 100644 index 000000000..e073e2154 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_2.c new file mode 100644 index 000000000..63afdd7a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_4.c new file mode 100644 index 000000000..ae1da6fb1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_5.c new file mode 100644 index 000000000..9970a30d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_8.c new file mode 100644 index 000000000..30e7c26de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_10.c new file mode 100644 index 000000000..1947cf14b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_2.c new file mode 100644 index 000000000..74ce87353 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_3.c new file mode 100644 index 000000000..59836eadb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_4.c new file mode 100644 index 000000000..6d17a4253 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_5.c new file mode 100644 index 000000000..49832eb83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_6.c new file mode 100644 index 000000000..db24454ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_7.c new file mode 100644 index 000000000..616bfd5a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_8.c new file mode 100644 index 000000000..52a5f9d43 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_9.c new file mode 100644 index 000000000..34dd52271 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_10.c new file mode 100644 index 000000000..c3abe3844 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_12.c new file mode 100644 index 000000000..7913c6d60 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_15.c new file mode 100644 index 000000000..26401a0b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_16.c new file mode 100644 index 000000000..e7effb847 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_2.c new file mode 100644 index 000000000..af39b95c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_20.c new file mode 100644 index 000000000..58e3c11eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_25.c new file mode 100644 index 000000000..50368887e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_3.c new file mode 100644 index 000000000..b24cdef1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_32.c new file mode 100644 index 000000000..20f4ce890 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_4.c new file mode 100644 index 000000000..913f29419 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_5.c new file mode 100644 index 000000000..12bd4a874 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_6.c new file mode 100644 index 000000000..7496805f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_64.c new file mode 100644 index 000000000..14a9e2f58 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_7.c new file mode 100644 index 000000000..804c05d61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_8.c new file mode 100644 index 000000000..06a9b0c27 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_9.c new file mode 100644 index 000000000..941ac6560 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_10.c new file mode 100644 index 000000000..ba06eb5f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_2.c new file mode 100644 index 000000000..55925844c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_3.c new file mode 100644 index 000000000..5b31e48bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_4.c new file mode 100644 index 000000000..13b292dfc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_5.c new file mode 100644 index 000000000..46ddb8ad3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_6.c new file mode 100644 index 000000000..783d78806 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_7.c new file mode 100644 index 000000000..670191075 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_8.c new file mode 100644 index 000000000..9a33d4721 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_9.c new file mode 100644 index 000000000..19b33a825 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_10.c new file mode 100644 index 000000000..7ac142a0c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_12.c new file mode 100644 index 000000000..a5857661c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_15.c new file mode 100644 index 000000000..9007b2685 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_16.c new file mode 100644 index 000000000..d8a36be23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_2.c new file mode 100644 index 000000000..03492ad8b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_20.c new file mode 100644 index 000000000..3523f457f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_25.c new file mode 100644 index 000000000..2cc2271fb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_3.c new file mode 100644 index 000000000..3873b812b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_32.c new file mode 100644 index 000000000..a06094f1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_4.c new file mode 100644 index 000000000..3f05baa06 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_5.c new file mode 100644 index 000000000..6a9324f8e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_6.c new file mode 100644 index 000000000..53766a486 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_64.c new file mode 100644 index 000000000..bb545cb9f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_7.c new file mode 100644 index 000000000..455fc5d37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_8.c new file mode 100644 index 000000000..ce0b9a675 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_9.c new file mode 100644 index 000000000..d10a2f09b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_16.c new file mode 100644 index 000000000..6b52e86bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_2.c new file mode 100644 index 000000000..bead93d32 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_32.c new file mode 100644 index 000000000..53eb1fd3c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_4.c new file mode 100644 index 000000000..1a1ef9e83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_8.c new file mode 100644 index 000000000..7c9af5cfb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_10.c new file mode 100644 index 000000000..54b5fc3e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_16.c new file mode 100644 index 000000000..d594cf183 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_2.c new file mode 100644 index 000000000..44c1c280d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_20.c new file mode 100644 index 000000000..895763258 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_25.c new file mode 100644 index 000000000..6269a9ae6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_32.c new file mode 100644 index 000000000..327e400ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_4.c new file mode 100644 index 000000000..f23b9ed12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_5.c new file mode 100644 index 000000000..757c4dbc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_64.c new file mode 100644 index 000000000..78457aa1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_8.c new file mode 100644 index 000000000..3ea127af0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_10.c new file mode 100644 index 000000000..00a0059b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_16.c new file mode 100644 index 000000000..b39d94f39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_2.c new file mode 100644 index 000000000..728cac866 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_20.c new file mode 100644 index 000000000..b654d9823 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_25.c new file mode 100644 index 000000000..0503dbbf6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_32.c new file mode 100644 index 000000000..83fcdf0d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_4.c new file mode 100644 index 000000000..5d5541c99 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_5.c new file mode 100644 index 000000000..4a71a7bbf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_64.c new file mode 100644 index 000000000..52d3ec3a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_8.c new file mode 100644 index 000000000..3d6d99fb1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_16.c new file mode 100644 index 000000000..354f5388d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_32.c new file mode 100644 index 000000000..4bdb1e5c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_4.c new file mode 100644 index 000000000..a888fe2b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_8.c new file mode 100644 index 000000000..0b71fb67b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_10.c new file mode 100644 index 000000000..aeceb0e64 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_16.c new file mode 100644 index 000000000..bb8c65c89 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_20.c new file mode 100644 index 000000000..f91cc4c72 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_25.c new file mode 100644 index 000000000..ac4c4f5d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_32.c new file mode 100644 index 000000000..3c7ba9f44 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_4.c new file mode 100644 index 000000000..9e4de06db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_5.c new file mode 100644 index 000000000..c3b94f428 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_8.c new file mode 100644 index 000000000..842701b1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_10.c new file mode 100644 index 000000000..262d2d6ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_16.c new file mode 100644 index 000000000..017b2f43e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_20.c new file mode 100644 index 000000000..f9ceffbfd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_25.c new file mode 100644 index 000000000..c2d67ab04 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_32.c new file mode 100644 index 000000000..cd094be6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_4.c new file mode 100644 index 000000000..3b9248cce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_5.c new file mode 100644 index 000000000..3a1af2995 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_8.c new file mode 100644 index 000000000..b8c882da8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx2/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/Makefile.am new file mode 100644 index 000000000..5e1baf8cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(AVX512_CFLAGS) +SIMD_HEADER=simd-support/simd-avx512.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_AVX512 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_avx512_codelets.la +libdft_avx512_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/Makefile.in new file mode 100644 index 000000000..19ae704b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/avx512 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_avx512_codelets_la_LIBADD = +am__libdft_avx512_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c \ + n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c \ + n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ + n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c \ + n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ + n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c \ + n1bv_15.c n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c \ + n1bv_25.c n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c \ + n2fv_12.c n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c \ + n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ + n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c \ + n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c \ + t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c \ + t1fuv_10.c t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c \ + t1fv_7.c t1fv_8.c t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c \ + t1fv_16.c t1fv_32.c t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c \ + t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c \ + t2fv_10.c t2fv_20.c t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c \ + t3fv_32.c t3fv_5.c t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c \ + t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c \ + t1buv_9.c t1buv_10.c t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c \ + t1bv_6.c t1bv_7.c t1bv_8.c t1bv_9.c t1bv_10.c t1bv_12.c \ + t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c t1bv_20.c t1bv_25.c \ + t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ + t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c t3bv_4.c t3bv_8.c \ + t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c t3bv_20.c t3bv_25.c \ + t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c t2sv_4.c \ + t2sv_8.c t2sv_16.c t2sv_32.c q1fv_2.c q1fv_4.c q1fv_5.c \ + q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_AVX512_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_AVX512_TRUE@am_libdft_avx512_codelets_la_OBJECTS = \ +@HAVE_AVX512_TRUE@ $(am__objects_20) +libdft_avx512_codelets_la_OBJECTS = \ + $(am_libdft_avx512_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX512_TRUE@am_libdft_avx512_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_avx512_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_avx512_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX512_CFLAGS) +SIMD_HEADER = simd-support/simd-avx512.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX512_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX512_TRUE@noinst_LTLIBRARIES = libdft_avx512_codelets.la +@HAVE_AVX512_TRUE@libdft_avx512_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/avx512/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/avx512/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_avx512_codelets.la: $(libdft_avx512_codelets_la_OBJECTS) $(libdft_avx512_codelets_la_DEPENDENCIES) $(EXTRA_libdft_avx512_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_avx512_codelets_la_rpath) $(libdft_avx512_codelets_la_OBJECTS) $(libdft_avx512_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/codlist.c new file mode 100644 index 000000000..30adb1241 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/genus.c new file mode 100644 index 000000000..c44b372d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_10.c new file mode 100644 index 000000000..b397eb30c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_11.c new file mode 100644 index 000000000..1a58cb17d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_12.c new file mode 100644 index 000000000..503cb7660 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_128.c new file mode 100644 index 000000000..7d6bd35d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_13.c new file mode 100644 index 000000000..f3f9879db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_14.c new file mode 100644 index 000000000..61d558728 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_15.c new file mode 100644 index 000000000..cc59f67ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_16.c new file mode 100644 index 000000000..98125a4ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_2.c new file mode 100644 index 000000000..402c8de3d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_20.c new file mode 100644 index 000000000..4065c8826 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_25.c new file mode 100644 index 000000000..a808ecf51 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_3.c new file mode 100644 index 000000000..d3ae6fedb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_32.c new file mode 100644 index 000000000..ce0861bcd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_4.c new file mode 100644 index 000000000..80502918d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_5.c new file mode 100644 index 000000000..0ca86d65e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_6.c new file mode 100644 index 000000000..3de87c42a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_64.c new file mode 100644 index 000000000..d33e954f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_7.c new file mode 100644 index 000000000..d242a538e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_8.c new file mode 100644 index 000000000..c78872bf3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_9.c new file mode 100644 index 000000000..5578e3c4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_10.c new file mode 100644 index 000000000..45d1f9f88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_11.c new file mode 100644 index 000000000..bb88a3fa5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_12.c new file mode 100644 index 000000000..3e137888c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_128.c new file mode 100644 index 000000000..5ab1e82ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_13.c new file mode 100644 index 000000000..819753e03 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_14.c new file mode 100644 index 000000000..c115be1b5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_15.c new file mode 100644 index 000000000..fce8856e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_16.c new file mode 100644 index 000000000..1a8c828b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_2.c new file mode 100644 index 000000000..660c59e39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_20.c new file mode 100644 index 000000000..94523fb8a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_25.c new file mode 100644 index 000000000..b2f181ef8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_3.c new file mode 100644 index 000000000..e5367d076 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_32.c new file mode 100644 index 000000000..41078be2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_4.c new file mode 100644 index 000000000..81fb75d52 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_5.c new file mode 100644 index 000000000..760c04e3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_6.c new file mode 100644 index 000000000..54aee1952 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_64.c new file mode 100644 index 000000000..5b3428f0f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_7.c new file mode 100644 index 000000000..2a4f0c36c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_8.c new file mode 100644 index 000000000..85c3b260d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_9.c new file mode 100644 index 000000000..935e5f924 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_10.c new file mode 100644 index 000000000..6e33abc8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_12.c new file mode 100644 index 000000000..5a86acc8a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_14.c new file mode 100644 index 000000000..a06cc2e28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_16.c new file mode 100644 index 000000000..69aedadab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_2.c new file mode 100644 index 000000000..c6ea4f4b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_20.c new file mode 100644 index 000000000..fdc6d3d3a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_32.c new file mode 100644 index 000000000..c7b803456 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_4.c new file mode 100644 index 000000000..b43f678d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_6.c new file mode 100644 index 000000000..fb064be21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_64.c new file mode 100644 index 000000000..327965f17 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_8.c new file mode 100644 index 000000000..15042518b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_10.c new file mode 100644 index 000000000..d0d5b9f2c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_12.c new file mode 100644 index 000000000..7c1102c61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_14.c new file mode 100644 index 000000000..dfc382115 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_16.c new file mode 100644 index 000000000..7c3f87229 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_2.c new file mode 100644 index 000000000..cd5b90149 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_20.c new file mode 100644 index 000000000..bf410302e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_32.c new file mode 100644 index 000000000..c8aefe6c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_4.c new file mode 100644 index 000000000..1a053bc42 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_6.c new file mode 100644 index 000000000..367f01abd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_64.c new file mode 100644 index 000000000..ffc14216d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_8.c new file mode 100644 index 000000000..9daf12574 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_16.c new file mode 100644 index 000000000..c57793152 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_32.c new file mode 100644 index 000000000..6d7ea2bd2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_4.c new file mode 100644 index 000000000..5cc166469 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_64.c new file mode 100644 index 000000000..a4c889393 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_8.c new file mode 100644 index 000000000..f69dfa661 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_2.c new file mode 100644 index 000000000..00de79c01 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_4.c new file mode 100644 index 000000000..75de7ff40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_5.c new file mode 100644 index 000000000..bea6182ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_8.c new file mode 100644 index 000000000..1ec1f325f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_2.c new file mode 100644 index 000000000..8418a1742 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_4.c new file mode 100644 index 000000000..bcc3088e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_5.c new file mode 100644 index 000000000..f982077af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_8.c new file mode 100644 index 000000000..36649c3d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_10.c new file mode 100644 index 000000000..6a0b4c714 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_2.c new file mode 100644 index 000000000..94cb82373 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_3.c new file mode 100644 index 000000000..660df210f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_4.c new file mode 100644 index 000000000..55e7f1130 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_5.c new file mode 100644 index 000000000..e99e5400d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_6.c new file mode 100644 index 000000000..68462c3dd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_7.c new file mode 100644 index 000000000..fccb4ee69 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_8.c new file mode 100644 index 000000000..c5fd2220f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_9.c new file mode 100644 index 000000000..73a2c7ede --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_10.c new file mode 100644 index 000000000..077df765e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_12.c new file mode 100644 index 000000000..6fd9b2ec0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_15.c new file mode 100644 index 000000000..9c9e34e62 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_16.c new file mode 100644 index 000000000..856bb8a82 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_2.c new file mode 100644 index 000000000..65ecf2d67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_20.c new file mode 100644 index 000000000..30a3e09eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_25.c new file mode 100644 index 000000000..efb2f5cf2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_3.c new file mode 100644 index 000000000..9b3d8921b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_32.c new file mode 100644 index 000000000..83bc2c9f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_4.c new file mode 100644 index 000000000..edc2363a9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_5.c new file mode 100644 index 000000000..1d6db94a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_6.c new file mode 100644 index 000000000..d5dd46651 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_64.c new file mode 100644 index 000000000..a8516b631 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_7.c new file mode 100644 index 000000000..17b369c3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_8.c new file mode 100644 index 000000000..11da94216 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_9.c new file mode 100644 index 000000000..99fd41dbd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_10.c new file mode 100644 index 000000000..8a97a3305 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_2.c new file mode 100644 index 000000000..61251719c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_3.c new file mode 100644 index 000000000..7668343ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_4.c new file mode 100644 index 000000000..1c55aef38 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_5.c new file mode 100644 index 000000000..c7998d658 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_6.c new file mode 100644 index 000000000..a58a9234c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_7.c new file mode 100644 index 000000000..3e35ae43f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_8.c new file mode 100644 index 000000000..866f80251 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_9.c new file mode 100644 index 000000000..4b711c5d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_10.c new file mode 100644 index 000000000..85cf72642 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_12.c new file mode 100644 index 000000000..bcb88e299 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_15.c new file mode 100644 index 000000000..e0613583e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_16.c new file mode 100644 index 000000000..c1538d320 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_2.c new file mode 100644 index 000000000..747f5ac13 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_20.c new file mode 100644 index 000000000..5ee7d1b8a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_25.c new file mode 100644 index 000000000..2a2827aea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_3.c new file mode 100644 index 000000000..2aa11ff6e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_32.c new file mode 100644 index 000000000..8eef707cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_4.c new file mode 100644 index 000000000..2e21ebd15 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_5.c new file mode 100644 index 000000000..2f9b74359 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_6.c new file mode 100644 index 000000000..87cc73b2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_64.c new file mode 100644 index 000000000..698b56bc3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_7.c new file mode 100644 index 000000000..060086d88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_8.c new file mode 100644 index 000000000..077e3450e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_9.c new file mode 100644 index 000000000..7bff41ed6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_16.c new file mode 100644 index 000000000..08549cffe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_2.c new file mode 100644 index 000000000..c3e5ade92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_32.c new file mode 100644 index 000000000..fcdd5c79d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_4.c new file mode 100644 index 000000000..f9b755e14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_8.c new file mode 100644 index 000000000..e04dfc59d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_10.c new file mode 100644 index 000000000..411c28a2a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_16.c new file mode 100644 index 000000000..a52a0cc24 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_2.c new file mode 100644 index 000000000..108ba6e6c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_20.c new file mode 100644 index 000000000..192ecbb2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_25.c new file mode 100644 index 000000000..ea22ba60b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_32.c new file mode 100644 index 000000000..4c5d3ccf8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_4.c new file mode 100644 index 000000000..809fb2f4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_5.c new file mode 100644 index 000000000..39fdd8ae5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_64.c new file mode 100644 index 000000000..4836cd889 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_8.c new file mode 100644 index 000000000..55336bc8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_10.c new file mode 100644 index 000000000..94062f145 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_16.c new file mode 100644 index 000000000..cc2dcad79 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_2.c new file mode 100644 index 000000000..bffbac668 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_20.c new file mode 100644 index 000000000..22899d321 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_25.c new file mode 100644 index 000000000..b26a1cb2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_32.c new file mode 100644 index 000000000..3cd24de6a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_4.c new file mode 100644 index 000000000..9a879e8f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_5.c new file mode 100644 index 000000000..750cd2647 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_64.c new file mode 100644 index 000000000..097d4b51f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_8.c new file mode 100644 index 000000000..b2ef2acb2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_16.c new file mode 100644 index 000000000..49ca2b109 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_32.c new file mode 100644 index 000000000..86e593dd8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_4.c new file mode 100644 index 000000000..3e1988f91 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_8.c new file mode 100644 index 000000000..113effd88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_10.c new file mode 100644 index 000000000..1ad5b6859 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_16.c new file mode 100644 index 000000000..91ef4cf22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_20.c new file mode 100644 index 000000000..de41d1c83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_25.c new file mode 100644 index 000000000..ec7623901 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_32.c new file mode 100644 index 000000000..110ab579c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_4.c new file mode 100644 index 000000000..25a200065 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_5.c new file mode 100644 index 000000000..3cdcf067c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_8.c new file mode 100644 index 000000000..d35ca8a29 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_10.c new file mode 100644 index 000000000..73ad3c637 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_16.c new file mode 100644 index 000000000..5e39da58e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_20.c new file mode 100644 index 000000000..9a49cc2d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_25.c new file mode 100644 index 000000000..4e2382319 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_32.c new file mode 100644 index 000000000..8696a9fa8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_4.c new file mode 100644 index 000000000..7a4fa0667 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_5.c new file mode 100644 index 000000000..518d8cbbd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_8.c new file mode 100644 index 000000000..de08abd3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/avx512/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/codlist.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/codlist.mk new file mode 100644 index 000000000..27fa32987 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/codlist.mk @@ -0,0 +1,79 @@ +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/Makefile.am new file mode 100644 index 000000000..4ff4469cf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/Makefile.am @@ -0,0 +1,73 @@ +# include the list of codelets + +include $(top_srcdir)/dft/simd/codlist.mk + +ALL_CODELETS = $(SIMD_CODELETS) +BUILT_SOURCES= $(SIMD_CODELETS) $(CODLIST) +EXTRA_DIST = $(BUILT_SOURCES) genus.c +INCLUDE_SIMD_HEADER="\#include SIMD_HEADER" +XRENAME=XSIMD +SOLVTAB_NAME = XSIMD(solvtab_dft) + +# include special rules for regenerating codelets. +include $(top_srcdir)/support/Makefile.codelets + +if MAINTAINER_MODE + +GFLAGS = -simd $(FLAGS_COMMON) -pipeline-latency 8 +FLAGS_T2S=-twiddle-log3 -precompute-twiddles +FLAGS_T3=-twiddle-log3 -precompute-twiddles -no-generate-bytw + +n1fv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -n $* -name n1fv_$* -include "dft/simd/n1f.h") | $(ADD_DATE) | $(INDENT) >$@ + +n2fv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -n $* -name n2fv_$* -with-ostride 2 -include "dft/simd/n2f.h" -store-multiple 2) | $(ADD_DATE) | $(INDENT) >$@ + +n1bv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -sign 1 -n $* -name n1bv_$* -include "dft/simd/n1b.h") | $(ADD_DATE) | $(INDENT) >$@ + +n2bv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -sign 1 -n $* -name n2bv_$* -with-ostride 2 -include "dft/simd/n2b.h" -store-multiple 2) | $(ADD_DATE) | $(INDENT) >$@ + +n2sv_%.c: $(CODELET_DEPS) $(GEN_NOTW) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW) $(GFLAGS) -n $* -name n2sv_$* -with-ostride 1 -include "dft/simd/n2s.h" -store-multiple 4) | $(ADD_DATE) | $(INDENT) >$@ + +t1fv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1fv_$* -include "dft/simd/t1f.h") | $(ADD_DATE) | $(INDENT) >$@ + +t1fuv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1fuv_$* -include "dft/simd/t1fu.h") | $(ADD_DATE) | $(INDENT) >$@ + +t2fv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t2fv_$* -include "dft/simd/t2f.h") | $(ADD_DATE) | $(INDENT) >$@ + +t3fv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) $(FLAGS_T3) -n $* -name t3fv_$* -include "dft/simd/t3f.h") | $(ADD_DATE) | $(INDENT) >$@ + +t1bv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1bv_$* -include "dft/simd/t1b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +t1buv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1buv_$* -include "dft/simd/t1bu.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +t2bv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t2bv_$* -include "dft/simd/t2b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +t3bv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) $(FLAGS_T3) -n $* -name t3bv_$* -include "dft/simd/t3b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +t1sv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(GFLAGS) -n $* -name t1sv_$* -include "dft/simd/ts.h") | $(ADD_DATE) | $(INDENT) >$@ + +t2sv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(GFLAGS) $(FLAGS_T2S) -n $* -name t2sv_$* -include "dft/simd/ts.h") | $(ADD_DATE) | $(INDENT) >$@ + +q1fv_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ_C) $(GFLAGS) -n $* -dif -name q1fv_$* -include "dft/simd/q1f.h") | $(ADD_DATE) | $(INDENT) >$@ + +q1bv_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ_C) + ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ_C) $(GFLAGS) -n $* -dif -name q1bv_$* -include "dft/simd/q1b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/Makefile.in new file mode 100644 index 000000000..a7a185654 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/Makefile.in @@ -0,0 +1,713 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# include the list of codelets + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/common +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/support/Makefile.codelets +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +ALL_CODELETS = $(SIMD_CODELETS) +BUILT_SOURCES = $(SIMD_CODELETS) $(CODLIST) +EXTRA_DIST = $(BUILT_SOURCES) genus.c +INCLUDE_SIMD_HEADER = "\#include SIMD_HEADER" +XRENAME = XSIMD +SOLVTAB_NAME = XSIMD(solvtab_dft) +CODLIST = codlist.c +CODELET_NAME = codelet_ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +@MAINTAINER_MODE_TRUE@TWOVERS = sh ${top_srcdir}/support/twovers.sh +@MAINTAINER_MODE_TRUE@GENFFTDIR = ${top_builddir}/genfft +@MAINTAINER_MODE_TRUE@GEN_NOTW = ${GENFFTDIR}/gen_notw.native +@MAINTAINER_MODE_TRUE@GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +@MAINTAINER_MODE_TRUE@GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +@MAINTAINER_MODE_TRUE@GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +@MAINTAINER_MODE_TRUE@GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +@MAINTAINER_MODE_TRUE@GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +@MAINTAINER_MODE_TRUE@GEN_R2R = ${GENFFTDIR}/gen_r2r.native +@MAINTAINER_MODE_TRUE@PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +@MAINTAINER_MODE_TRUE@PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +@MAINTAINER_MODE_TRUE@ADD_DATE = sed -e s/@DATE@/"`date`"/ +@MAINTAINER_MODE_TRUE@COPYRIGHT = ${top_srcdir}/COPYRIGHT +@MAINTAINER_MODE_TRUE@CODELET_DEPS = $(COPYRIGHT) $(PRELUDE) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_DFT = cat $(COPYRIGHT) $(PRELUDE_DFT) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_RDFT = cat $(COPYRIGHT) $(PRELUDE_RDFT) +@MAINTAINER_MODE_TRUE@FLAGS_COMMON = -compact -variables 4 +@MAINTAINER_MODE_TRUE@DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +@MAINTAINER_MODE_TRUE@RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# include special rules for regenerating codelets. +@MAINTAINER_MODE_TRUE@GFLAGS = -simd $(FLAGS_COMMON) -pipeline-latency 8 +@MAINTAINER_MODE_TRUE@FLAGS_T2S = -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_T3 = -twiddle-log3 -precompute-twiddles -no-generate-bytw +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/support/Makefile.codelets $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/common/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/common/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/support/Makefile.codelets $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +# rule to build codlist +@MAINTAINER_MODE_TRUE@$(CODLIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "#include \"kernel/ifftw.h\""; \ +@MAINTAINER_MODE_TRUE@ echo $(INCLUDE_SIMD_HEADER); \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo "extern const solvtab $(SOLVTAB_NAME);"; \ +@MAINTAINER_MODE_TRUE@ echo "const solvtab $(SOLVTAB_NAME) = {"; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB_END"; \ +@MAINTAINER_MODE_TRUE@ echo "};"; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# cancel the hideous builtin rules that cause an infinite loop +@MAINTAINER_MODE_TRUE@%: %.o +@MAINTAINER_MODE_TRUE@%: %.s +@MAINTAINER_MODE_TRUE@%: %.c +@MAINTAINER_MODE_TRUE@%: %.S + +@MAINTAINER_MODE_TRUE@n1fv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -n $* -name n1fv_$* -include "dft/simd/n1f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@n2fv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -n $* -name n2fv_$* -with-ostride 2 -include "dft/simd/n2f.h" -store-multiple 2) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@n1bv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -sign 1 -n $* -name n1bv_$* -include "dft/simd/n1b.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@n2bv_%.c: $(CODELET_DEPS) $(GEN_NOTW_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW_C) $(GFLAGS) -sign 1 -n $* -name n2bv_$* -with-ostride 2 -include "dft/simd/n2b.h" -store-multiple 2) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@n2sv_%.c: $(CODELET_DEPS) $(GEN_NOTW) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW) $(GFLAGS) -n $* -name n2sv_$* -with-ostride 1 -include "dft/simd/n2s.h" -store-multiple 4) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t1fv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1fv_$* -include "dft/simd/t1f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t1fuv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1fuv_$* -include "dft/simd/t1fu.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t2fv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t2fv_$* -include "dft/simd/t2f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t3fv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) $(FLAGS_T3) -n $* -name t3fv_$* -include "dft/simd/t3f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t1bv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1bv_$* -include "dft/simd/t1b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t1buv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t1buv_$* -include "dft/simd/t1bu.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t2bv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) -n $* -name t2bv_$* -include "dft/simd/t2b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t3bv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE_C) $(GFLAGS) $(FLAGS_T3) -n $* -name t3bv_$* -include "dft/simd/t3b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t1sv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(GFLAGS) -n $* -name t1sv_$* -include "dft/simd/ts.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@t2sv_%.c: $(CODELET_DEPS) $(GEN_TWIDDLE) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDDLE) $(GFLAGS) $(FLAGS_T2S) -n $* -name t2sv_$* -include "dft/simd/ts.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@q1fv_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ_C) $(GFLAGS) -n $* -dif -name q1fv_$* -include "dft/simd/q1f.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@q1bv_%.c: $(CODELET_DEPS) $(GEN_TWIDSQ_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_TWIDSQ_C) $(GFLAGS) -n $* -dif -name q1bv_$* -include "dft/simd/q1b.h" -sign 1) | $(ADD_DATE) | $(INDENT) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/codlist.c new file mode 100644 index 000000000..0d1a6f936 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/codlist.c @@ -0,0 +1,349 @@ +#include "kernel/ifftw.h" +#include SIMD_HEADER + +extern void XSIMD(codelet_n1fv_2)(planner *); +extern void XSIMD(codelet_n1fv_3)(planner *); +extern void XSIMD(codelet_n1fv_4)(planner *); +extern void XSIMD(codelet_n1fv_5)(planner *); +extern void XSIMD(codelet_n1fv_6)(planner *); +extern void XSIMD(codelet_n1fv_7)(planner *); +extern void XSIMD(codelet_n1fv_8)(planner *); +extern void XSIMD(codelet_n1fv_9)(planner *); +extern void XSIMD(codelet_n1fv_10)(planner *); +extern void XSIMD(codelet_n1fv_11)(planner *); +extern void XSIMD(codelet_n1fv_12)(planner *); +extern void XSIMD(codelet_n1fv_13)(planner *); +extern void XSIMD(codelet_n1fv_14)(planner *); +extern void XSIMD(codelet_n1fv_15)(planner *); +extern void XSIMD(codelet_n1fv_16)(planner *); +extern void XSIMD(codelet_n1fv_32)(planner *); +extern void XSIMD(codelet_n1fv_64)(planner *); +extern void XSIMD(codelet_n1fv_128)(planner *); +extern void XSIMD(codelet_n1fv_20)(planner *); +extern void XSIMD(codelet_n1fv_25)(planner *); +extern void XSIMD(codelet_n1bv_2)(planner *); +extern void XSIMD(codelet_n1bv_3)(planner *); +extern void XSIMD(codelet_n1bv_4)(planner *); +extern void XSIMD(codelet_n1bv_5)(planner *); +extern void XSIMD(codelet_n1bv_6)(planner *); +extern void XSIMD(codelet_n1bv_7)(planner *); +extern void XSIMD(codelet_n1bv_8)(planner *); +extern void XSIMD(codelet_n1bv_9)(planner *); +extern void XSIMD(codelet_n1bv_10)(planner *); +extern void XSIMD(codelet_n1bv_11)(planner *); +extern void XSIMD(codelet_n1bv_12)(planner *); +extern void XSIMD(codelet_n1bv_13)(planner *); +extern void XSIMD(codelet_n1bv_14)(planner *); +extern void XSIMD(codelet_n1bv_15)(planner *); +extern void XSIMD(codelet_n1bv_16)(planner *); +extern void XSIMD(codelet_n1bv_32)(planner *); +extern void XSIMD(codelet_n1bv_64)(planner *); +extern void XSIMD(codelet_n1bv_128)(planner *); +extern void XSIMD(codelet_n1bv_20)(planner *); +extern void XSIMD(codelet_n1bv_25)(planner *); +extern void XSIMD(codelet_n2fv_2)(planner *); +extern void XSIMD(codelet_n2fv_4)(planner *); +extern void XSIMD(codelet_n2fv_6)(planner *); +extern void XSIMD(codelet_n2fv_8)(planner *); +extern void XSIMD(codelet_n2fv_10)(planner *); +extern void XSIMD(codelet_n2fv_12)(planner *); +extern void XSIMD(codelet_n2fv_14)(planner *); +extern void XSIMD(codelet_n2fv_16)(planner *); +extern void XSIMD(codelet_n2fv_32)(planner *); +extern void XSIMD(codelet_n2fv_64)(planner *); +extern void XSIMD(codelet_n2fv_20)(planner *); +extern void XSIMD(codelet_n2bv_2)(planner *); +extern void XSIMD(codelet_n2bv_4)(planner *); +extern void XSIMD(codelet_n2bv_6)(planner *); +extern void XSIMD(codelet_n2bv_8)(planner *); +extern void XSIMD(codelet_n2bv_10)(planner *); +extern void XSIMD(codelet_n2bv_12)(planner *); +extern void XSIMD(codelet_n2bv_14)(planner *); +extern void XSIMD(codelet_n2bv_16)(planner *); +extern void XSIMD(codelet_n2bv_32)(planner *); +extern void XSIMD(codelet_n2bv_64)(planner *); +extern void XSIMD(codelet_n2bv_20)(planner *); +extern void XSIMD(codelet_n2sv_4)(planner *); +extern void XSIMD(codelet_n2sv_8)(planner *); +extern void XSIMD(codelet_n2sv_16)(planner *); +extern void XSIMD(codelet_n2sv_32)(planner *); +extern void XSIMD(codelet_n2sv_64)(planner *); +extern void XSIMD(codelet_t1fuv_2)(planner *); +extern void XSIMD(codelet_t1fuv_3)(planner *); +extern void XSIMD(codelet_t1fuv_4)(planner *); +extern void XSIMD(codelet_t1fuv_5)(planner *); +extern void XSIMD(codelet_t1fuv_6)(planner *); +extern void XSIMD(codelet_t1fuv_7)(planner *); +extern void XSIMD(codelet_t1fuv_8)(planner *); +extern void XSIMD(codelet_t1fuv_9)(planner *); +extern void XSIMD(codelet_t1fuv_10)(planner *); +extern void XSIMD(codelet_t1fv_2)(planner *); +extern void XSIMD(codelet_t1fv_3)(planner *); +extern void XSIMD(codelet_t1fv_4)(planner *); +extern void XSIMD(codelet_t1fv_5)(planner *); +extern void XSIMD(codelet_t1fv_6)(planner *); +extern void XSIMD(codelet_t1fv_7)(planner *); +extern void XSIMD(codelet_t1fv_8)(planner *); +extern void XSIMD(codelet_t1fv_9)(planner *); +extern void XSIMD(codelet_t1fv_10)(planner *); +extern void XSIMD(codelet_t1fv_12)(planner *); +extern void XSIMD(codelet_t1fv_15)(planner *); +extern void XSIMD(codelet_t1fv_16)(planner *); +extern void XSIMD(codelet_t1fv_32)(planner *); +extern void XSIMD(codelet_t1fv_64)(planner *); +extern void XSIMD(codelet_t1fv_20)(planner *); +extern void XSIMD(codelet_t1fv_25)(planner *); +extern void XSIMD(codelet_t2fv_2)(planner *); +extern void XSIMD(codelet_t2fv_4)(planner *); +extern void XSIMD(codelet_t2fv_8)(planner *); +extern void XSIMD(codelet_t2fv_16)(planner *); +extern void XSIMD(codelet_t2fv_32)(planner *); +extern void XSIMD(codelet_t2fv_64)(planner *); +extern void XSIMD(codelet_t2fv_5)(planner *); +extern void XSIMD(codelet_t2fv_10)(planner *); +extern void XSIMD(codelet_t2fv_20)(planner *); +extern void XSIMD(codelet_t2fv_25)(planner *); +extern void XSIMD(codelet_t3fv_4)(planner *); +extern void XSIMD(codelet_t3fv_8)(planner *); +extern void XSIMD(codelet_t3fv_16)(planner *); +extern void XSIMD(codelet_t3fv_32)(planner *); +extern void XSIMD(codelet_t3fv_5)(planner *); +extern void XSIMD(codelet_t3fv_10)(planner *); +extern void XSIMD(codelet_t3fv_20)(planner *); +extern void XSIMD(codelet_t3fv_25)(planner *); +extern void XSIMD(codelet_t1buv_2)(planner *); +extern void XSIMD(codelet_t1buv_3)(planner *); +extern void XSIMD(codelet_t1buv_4)(planner *); +extern void XSIMD(codelet_t1buv_5)(planner *); +extern void XSIMD(codelet_t1buv_6)(planner *); +extern void XSIMD(codelet_t1buv_7)(planner *); +extern void XSIMD(codelet_t1buv_8)(planner *); +extern void XSIMD(codelet_t1buv_9)(planner *); +extern void XSIMD(codelet_t1buv_10)(planner *); +extern void XSIMD(codelet_t1bv_2)(planner *); +extern void XSIMD(codelet_t1bv_3)(planner *); +extern void XSIMD(codelet_t1bv_4)(planner *); +extern void XSIMD(codelet_t1bv_5)(planner *); +extern void XSIMD(codelet_t1bv_6)(planner *); +extern void XSIMD(codelet_t1bv_7)(planner *); +extern void XSIMD(codelet_t1bv_8)(planner *); +extern void XSIMD(codelet_t1bv_9)(planner *); +extern void XSIMD(codelet_t1bv_10)(planner *); +extern void XSIMD(codelet_t1bv_12)(planner *); +extern void XSIMD(codelet_t1bv_15)(planner *); +extern void XSIMD(codelet_t1bv_16)(planner *); +extern void XSIMD(codelet_t1bv_32)(planner *); +extern void XSIMD(codelet_t1bv_64)(planner *); +extern void XSIMD(codelet_t1bv_20)(planner *); +extern void XSIMD(codelet_t1bv_25)(planner *); +extern void XSIMD(codelet_t2bv_2)(planner *); +extern void XSIMD(codelet_t2bv_4)(planner *); +extern void XSIMD(codelet_t2bv_8)(planner *); +extern void XSIMD(codelet_t2bv_16)(planner *); +extern void XSIMD(codelet_t2bv_32)(planner *); +extern void XSIMD(codelet_t2bv_64)(planner *); +extern void XSIMD(codelet_t2bv_5)(planner *); +extern void XSIMD(codelet_t2bv_10)(planner *); +extern void XSIMD(codelet_t2bv_20)(planner *); +extern void XSIMD(codelet_t2bv_25)(planner *); +extern void XSIMD(codelet_t3bv_4)(planner *); +extern void XSIMD(codelet_t3bv_8)(planner *); +extern void XSIMD(codelet_t3bv_16)(planner *); +extern void XSIMD(codelet_t3bv_32)(planner *); +extern void XSIMD(codelet_t3bv_5)(planner *); +extern void XSIMD(codelet_t3bv_10)(planner *); +extern void XSIMD(codelet_t3bv_20)(planner *); +extern void XSIMD(codelet_t3bv_25)(planner *); +extern void XSIMD(codelet_t1sv_2)(planner *); +extern void XSIMD(codelet_t1sv_4)(planner *); +extern void XSIMD(codelet_t1sv_8)(planner *); +extern void XSIMD(codelet_t1sv_16)(planner *); +extern void XSIMD(codelet_t1sv_32)(planner *); +extern void XSIMD(codelet_t2sv_4)(planner *); +extern void XSIMD(codelet_t2sv_8)(planner *); +extern void XSIMD(codelet_t2sv_16)(planner *); +extern void XSIMD(codelet_t2sv_32)(planner *); +extern void XSIMD(codelet_q1fv_2)(planner *); +extern void XSIMD(codelet_q1fv_4)(planner *); +extern void XSIMD(codelet_q1fv_5)(planner *); +extern void XSIMD(codelet_q1fv_8)(planner *); +extern void XSIMD(codelet_q1bv_2)(planner *); +extern void XSIMD(codelet_q1bv_4)(planner *); +extern void XSIMD(codelet_q1bv_5)(planner *); +extern void XSIMD(codelet_q1bv_8)(planner *); + + +extern const solvtab XSIMD(solvtab_dft); +const solvtab XSIMD(solvtab_dft) = { + SOLVTAB(XSIMD(codelet_n1fv_2)), + SOLVTAB(XSIMD(codelet_n1fv_3)), + SOLVTAB(XSIMD(codelet_n1fv_4)), + SOLVTAB(XSIMD(codelet_n1fv_5)), + SOLVTAB(XSIMD(codelet_n1fv_6)), + SOLVTAB(XSIMD(codelet_n1fv_7)), + SOLVTAB(XSIMD(codelet_n1fv_8)), + SOLVTAB(XSIMD(codelet_n1fv_9)), + SOLVTAB(XSIMD(codelet_n1fv_10)), + SOLVTAB(XSIMD(codelet_n1fv_11)), + SOLVTAB(XSIMD(codelet_n1fv_12)), + SOLVTAB(XSIMD(codelet_n1fv_13)), + SOLVTAB(XSIMD(codelet_n1fv_14)), + SOLVTAB(XSIMD(codelet_n1fv_15)), + SOLVTAB(XSIMD(codelet_n1fv_16)), + SOLVTAB(XSIMD(codelet_n1fv_32)), + SOLVTAB(XSIMD(codelet_n1fv_64)), + SOLVTAB(XSIMD(codelet_n1fv_128)), + SOLVTAB(XSIMD(codelet_n1fv_20)), + SOLVTAB(XSIMD(codelet_n1fv_25)), + SOLVTAB(XSIMD(codelet_n1bv_2)), + SOLVTAB(XSIMD(codelet_n1bv_3)), + SOLVTAB(XSIMD(codelet_n1bv_4)), + SOLVTAB(XSIMD(codelet_n1bv_5)), + SOLVTAB(XSIMD(codelet_n1bv_6)), + SOLVTAB(XSIMD(codelet_n1bv_7)), + SOLVTAB(XSIMD(codelet_n1bv_8)), + SOLVTAB(XSIMD(codelet_n1bv_9)), + SOLVTAB(XSIMD(codelet_n1bv_10)), + SOLVTAB(XSIMD(codelet_n1bv_11)), + SOLVTAB(XSIMD(codelet_n1bv_12)), + SOLVTAB(XSIMD(codelet_n1bv_13)), + SOLVTAB(XSIMD(codelet_n1bv_14)), + SOLVTAB(XSIMD(codelet_n1bv_15)), + SOLVTAB(XSIMD(codelet_n1bv_16)), + SOLVTAB(XSIMD(codelet_n1bv_32)), + SOLVTAB(XSIMD(codelet_n1bv_64)), + SOLVTAB(XSIMD(codelet_n1bv_128)), + SOLVTAB(XSIMD(codelet_n1bv_20)), + SOLVTAB(XSIMD(codelet_n1bv_25)), + SOLVTAB(XSIMD(codelet_n2fv_2)), + SOLVTAB(XSIMD(codelet_n2fv_4)), + SOLVTAB(XSIMD(codelet_n2fv_6)), + SOLVTAB(XSIMD(codelet_n2fv_8)), + SOLVTAB(XSIMD(codelet_n2fv_10)), + SOLVTAB(XSIMD(codelet_n2fv_12)), + SOLVTAB(XSIMD(codelet_n2fv_14)), + SOLVTAB(XSIMD(codelet_n2fv_16)), + SOLVTAB(XSIMD(codelet_n2fv_32)), + SOLVTAB(XSIMD(codelet_n2fv_64)), + SOLVTAB(XSIMD(codelet_n2fv_20)), + SOLVTAB(XSIMD(codelet_n2bv_2)), + SOLVTAB(XSIMD(codelet_n2bv_4)), + SOLVTAB(XSIMD(codelet_n2bv_6)), + SOLVTAB(XSIMD(codelet_n2bv_8)), + SOLVTAB(XSIMD(codelet_n2bv_10)), + SOLVTAB(XSIMD(codelet_n2bv_12)), + SOLVTAB(XSIMD(codelet_n2bv_14)), + SOLVTAB(XSIMD(codelet_n2bv_16)), + SOLVTAB(XSIMD(codelet_n2bv_32)), + SOLVTAB(XSIMD(codelet_n2bv_64)), + SOLVTAB(XSIMD(codelet_n2bv_20)), + SOLVTAB(XSIMD(codelet_n2sv_4)), + SOLVTAB(XSIMD(codelet_n2sv_8)), + SOLVTAB(XSIMD(codelet_n2sv_16)), + SOLVTAB(XSIMD(codelet_n2sv_32)), + SOLVTAB(XSIMD(codelet_n2sv_64)), + SOLVTAB(XSIMD(codelet_t1fuv_2)), + SOLVTAB(XSIMD(codelet_t1fuv_3)), + SOLVTAB(XSIMD(codelet_t1fuv_4)), + SOLVTAB(XSIMD(codelet_t1fuv_5)), + SOLVTAB(XSIMD(codelet_t1fuv_6)), + SOLVTAB(XSIMD(codelet_t1fuv_7)), + SOLVTAB(XSIMD(codelet_t1fuv_8)), + SOLVTAB(XSIMD(codelet_t1fuv_9)), + SOLVTAB(XSIMD(codelet_t1fuv_10)), + SOLVTAB(XSIMD(codelet_t1fv_2)), + SOLVTAB(XSIMD(codelet_t1fv_3)), + SOLVTAB(XSIMD(codelet_t1fv_4)), + SOLVTAB(XSIMD(codelet_t1fv_5)), + SOLVTAB(XSIMD(codelet_t1fv_6)), + SOLVTAB(XSIMD(codelet_t1fv_7)), + SOLVTAB(XSIMD(codelet_t1fv_8)), + SOLVTAB(XSIMD(codelet_t1fv_9)), + SOLVTAB(XSIMD(codelet_t1fv_10)), + SOLVTAB(XSIMD(codelet_t1fv_12)), + SOLVTAB(XSIMD(codelet_t1fv_15)), + SOLVTAB(XSIMD(codelet_t1fv_16)), + SOLVTAB(XSIMD(codelet_t1fv_32)), + SOLVTAB(XSIMD(codelet_t1fv_64)), + SOLVTAB(XSIMD(codelet_t1fv_20)), + SOLVTAB(XSIMD(codelet_t1fv_25)), + SOLVTAB(XSIMD(codelet_t2fv_2)), + SOLVTAB(XSIMD(codelet_t2fv_4)), + SOLVTAB(XSIMD(codelet_t2fv_8)), + SOLVTAB(XSIMD(codelet_t2fv_16)), + SOLVTAB(XSIMD(codelet_t2fv_32)), + SOLVTAB(XSIMD(codelet_t2fv_64)), + SOLVTAB(XSIMD(codelet_t2fv_5)), + SOLVTAB(XSIMD(codelet_t2fv_10)), + SOLVTAB(XSIMD(codelet_t2fv_20)), + SOLVTAB(XSIMD(codelet_t2fv_25)), + SOLVTAB(XSIMD(codelet_t3fv_4)), + SOLVTAB(XSIMD(codelet_t3fv_8)), + SOLVTAB(XSIMD(codelet_t3fv_16)), + SOLVTAB(XSIMD(codelet_t3fv_32)), + SOLVTAB(XSIMD(codelet_t3fv_5)), + SOLVTAB(XSIMD(codelet_t3fv_10)), + SOLVTAB(XSIMD(codelet_t3fv_20)), + SOLVTAB(XSIMD(codelet_t3fv_25)), + SOLVTAB(XSIMD(codelet_t1buv_2)), + SOLVTAB(XSIMD(codelet_t1buv_3)), + SOLVTAB(XSIMD(codelet_t1buv_4)), + SOLVTAB(XSIMD(codelet_t1buv_5)), + SOLVTAB(XSIMD(codelet_t1buv_6)), + SOLVTAB(XSIMD(codelet_t1buv_7)), + SOLVTAB(XSIMD(codelet_t1buv_8)), + SOLVTAB(XSIMD(codelet_t1buv_9)), + SOLVTAB(XSIMD(codelet_t1buv_10)), + SOLVTAB(XSIMD(codelet_t1bv_2)), + SOLVTAB(XSIMD(codelet_t1bv_3)), + SOLVTAB(XSIMD(codelet_t1bv_4)), + SOLVTAB(XSIMD(codelet_t1bv_5)), + SOLVTAB(XSIMD(codelet_t1bv_6)), + SOLVTAB(XSIMD(codelet_t1bv_7)), + SOLVTAB(XSIMD(codelet_t1bv_8)), + SOLVTAB(XSIMD(codelet_t1bv_9)), + SOLVTAB(XSIMD(codelet_t1bv_10)), + SOLVTAB(XSIMD(codelet_t1bv_12)), + SOLVTAB(XSIMD(codelet_t1bv_15)), + SOLVTAB(XSIMD(codelet_t1bv_16)), + SOLVTAB(XSIMD(codelet_t1bv_32)), + SOLVTAB(XSIMD(codelet_t1bv_64)), + SOLVTAB(XSIMD(codelet_t1bv_20)), + SOLVTAB(XSIMD(codelet_t1bv_25)), + SOLVTAB(XSIMD(codelet_t2bv_2)), + SOLVTAB(XSIMD(codelet_t2bv_4)), + SOLVTAB(XSIMD(codelet_t2bv_8)), + SOLVTAB(XSIMD(codelet_t2bv_16)), + SOLVTAB(XSIMD(codelet_t2bv_32)), + SOLVTAB(XSIMD(codelet_t2bv_64)), + SOLVTAB(XSIMD(codelet_t2bv_5)), + SOLVTAB(XSIMD(codelet_t2bv_10)), + SOLVTAB(XSIMD(codelet_t2bv_20)), + SOLVTAB(XSIMD(codelet_t2bv_25)), + SOLVTAB(XSIMD(codelet_t3bv_4)), + SOLVTAB(XSIMD(codelet_t3bv_8)), + SOLVTAB(XSIMD(codelet_t3bv_16)), + SOLVTAB(XSIMD(codelet_t3bv_32)), + SOLVTAB(XSIMD(codelet_t3bv_5)), + SOLVTAB(XSIMD(codelet_t3bv_10)), + SOLVTAB(XSIMD(codelet_t3bv_20)), + SOLVTAB(XSIMD(codelet_t3bv_25)), + SOLVTAB(XSIMD(codelet_t1sv_2)), + SOLVTAB(XSIMD(codelet_t1sv_4)), + SOLVTAB(XSIMD(codelet_t1sv_8)), + SOLVTAB(XSIMD(codelet_t1sv_16)), + SOLVTAB(XSIMD(codelet_t1sv_32)), + SOLVTAB(XSIMD(codelet_t2sv_4)), + SOLVTAB(XSIMD(codelet_t2sv_8)), + SOLVTAB(XSIMD(codelet_t2sv_16)), + SOLVTAB(XSIMD(codelet_t2sv_32)), + SOLVTAB(XSIMD(codelet_q1fv_2)), + SOLVTAB(XSIMD(codelet_q1fv_4)), + SOLVTAB(XSIMD(codelet_q1fv_5)), + SOLVTAB(XSIMD(codelet_q1fv_8)), + SOLVTAB(XSIMD(codelet_q1bv_2)), + SOLVTAB(XSIMD(codelet_q1bv_4)), + SOLVTAB(XSIMD(codelet_q1bv_5)), + SOLVTAB(XSIMD(codelet_q1bv_8)), + SOLVTAB_END +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/genus.c new file mode 100644 index 000000000..a7001fec4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/genus.c @@ -0,0 +1,331 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "dft/codelet-dft.h" +#include SIMD_HEADER + +#define EXTERN_CONST(t, x) extern const t x; const t x + +static int n1b_okp(const kdft_desc *d, + const R *ri, const R *ii, const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr) +{ + return (1 + && ALIGNED(ii) + && ALIGNED(io) + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(is) + && SIMD_STRIDE_OK(os) + && SIMD_VSTRIDE_OK(ivs) + && SIMD_VSTRIDE_OK(ovs) + && ri == ii + 1 + && ro == io + 1 + && (vl % VL) == 0 + && (!d->is || (d->is == is)) + && (!d->os || (d->os == os)) + && (!d->ivs || (d->ivs == ivs)) + && (!d->ovs || (d->ovs == ovs)) + ); +} + +EXTERN_CONST(kdft_genus, XSIMD(dft_n1bsimd_genus)) = { n1b_okp, VL }; + +static int n1f_okp(const kdft_desc *d, + const R *ri, const R *ii, const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr) +{ + return (1 + && ALIGNED(ri) + && ALIGNED(ro) + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(is) + && SIMD_STRIDE_OK(os) + && SIMD_VSTRIDE_OK(ivs) + && SIMD_VSTRIDE_OK(ovs) + && ii == ri + 1 + && io == ro + 1 + && (vl % VL) == 0 + && (!d->is || (d->is == is)) + && (!d->os || (d->os == os)) + && (!d->ivs || (d->ivs == ivs)) + && (!d->ovs || (d->ovs == ovs)) + ); +} + +EXTERN_CONST(kdft_genus, XSIMD(dft_n1fsimd_genus)) = { n1f_okp, VL }; + +static int n2b_okp(const kdft_desc *d, + const R *ri, const R *ii, const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr) +{ + return (1 + && ALIGNEDA(ii) + && ALIGNEDA(io) + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OKA(is) + && SIMD_VSTRIDE_OKA(ivs) + && SIMD_VSTRIDE_OKA(os) /* os == 2 enforced by codelet */ + && SIMD_STRIDE_OKPAIR(ovs) + && ri == ii + 1 + && ro == io + 1 + && (vl % VL) == 0 + && (!d->is || (d->is == is)) + && (!d->os || (d->os == os)) + && (!d->ivs || (d->ivs == ivs)) + && (!d->ovs || (d->ovs == ovs)) + ); +} + +EXTERN_CONST(kdft_genus, XSIMD(dft_n2bsimd_genus)) = { n2b_okp, VL }; + +static int n2f_okp(const kdft_desc *d, + const R *ri, const R *ii, const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr) +{ + return (1 + && ALIGNEDA(ri) + && ALIGNEDA(ro) + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OKA(is) + && SIMD_VSTRIDE_OKA(ivs) + && SIMD_VSTRIDE_OKA(os) /* os == 2 enforced by codelet */ + && SIMD_STRIDE_OKPAIR(ovs) + && ii == ri + 1 + && io == ro + 1 + && (vl % VL) == 0 + && (!d->is || (d->is == is)) + && (!d->os || (d->os == os)) + && (!d->ivs || (d->ivs == ivs)) + && (!d->ovs || (d->ovs == ovs)) + ); +} + +EXTERN_CONST(kdft_genus, XSIMD(dft_n2fsimd_genus)) = { n2f_okp, VL }; + +static int n2s_okp(const kdft_desc *d, + const R *ri, const R *ii, const R *ro, const R *io, + INT is, INT os, INT vl, INT ivs, INT ovs, + const planner *plnr) +{ + return (1 + && !NO_SIMDP(plnr) + && ALIGNEDA(ri) + && ALIGNEDA(ii) + && ALIGNEDA(ro) + && ALIGNEDA(io) + && SIMD_STRIDE_OKA(is) + && ivs == 1 + && os == 1 + && SIMD_STRIDE_OKA(ovs) + && (vl % (2 * VL)) == 0 + && (!d->is || (d->is == is)) + && (!d->os || (d->os == os)) + && (!d->ivs || (d->ivs == ivs)) + && (!d->ovs || (d->ovs == ovs)) + ); +} + +EXTERN_CONST(kdft_genus, XSIMD(dft_n2ssimd_genus)) = { n2s_okp, 2 * VL }; + +static int q1b_okp(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return (1 + && ALIGNED(iio) + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(rs) + && SIMD_STRIDE_OK(vs) + && SIMD_VSTRIDE_OK(ms) + && rio == iio + 1 + && (m % VL) == 0 + && (mb % VL) == 0 + && (me % VL) == 0 + && (!d->rs || (d->rs == rs)) + && (!d->vs || (d->vs == vs)) + && (!d->ms || (d->ms == ms)) + ); +} +EXTERN_CONST(ct_genus, XSIMD(dft_q1bsimd_genus)) = { q1b_okp, VL }; + +static int q1f_okp(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return (1 + && ALIGNED(rio) + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(rs) + && SIMD_STRIDE_OK(vs) + && SIMD_VSTRIDE_OK(ms) + && iio == rio + 1 + && (m % VL) == 0 + && (mb % VL) == 0 + && (me % VL) == 0 + && (!d->rs || (d->rs == rs)) + && (!d->vs || (d->vs == vs)) + && (!d->ms || (d->ms == ms)) + ); +} +EXTERN_CONST(ct_genus, XSIMD(dft_q1fsimd_genus)) = { q1f_okp, VL }; + +static int t_okp_common(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + UNUSED(rio); UNUSED(iio); + return (1 + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OKA(rs) + && SIMD_VSTRIDE_OKA(ms) + && (m % VL) == 0 + && (mb % VL) == 0 + && (me % VL) == 0 + && (!d->rs || (d->rs == rs)) + && (!d->vs || (d->vs == vs)) + && (!d->ms || (d->ms == ms)) + ); +} + +static int t_okp_commonu(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + UNUSED(rio); UNUSED(iio); UNUSED(m); + return (1 + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(rs) + && SIMD_VSTRIDE_OK(ms) + && (mb % VL) == 0 + && (me % VL) == 0 + && (!d->rs || (d->rs == rs)) + && (!d->vs || (d->vs == vs)) + && (!d->ms || (d->ms == ms)) + ); +} + +static int t_okp_t1f(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return t_okp_common(d, rio, iio, rs, vs, m, mb, me, ms, plnr) + && iio == rio + 1 + && ALIGNEDA(rio); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_t1fsimd_genus)) = { t_okp_t1f, VL }; + +static int t_okp_t1fu(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return t_okp_commonu(d, rio, iio, rs, vs, m, mb, me, ms, plnr) + && iio == rio + 1 + && ALIGNED(rio); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_t1fusimd_genus)) = { t_okp_t1fu, VL }; + +static int t_okp_t1b(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return t_okp_common(d, rio, iio, rs, vs, m, mb, me, ms, plnr) + && rio == iio + 1 + && ALIGNEDA(iio); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_t1bsimd_genus)) = { t_okp_t1b, VL }; + +static int t_okp_t1bu(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return t_okp_commonu(d, rio, iio, rs, vs, m, mb, me, ms, plnr) + && rio == iio + 1 + && ALIGNED(iio); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_t1busimd_genus)) = { t_okp_t1bu, VL }; + +/* use t2* codelets only when n = m*radix is small, because + t2* codelets use ~2n twiddle factors (instead of ~n) */ +static int small_enough(const ct_desc *d, INT m) +{ + return m * d->radix <= 16384; +} + +static int t_okp_t2f(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return t_okp_t1f(d, rio, iio, rs, vs, m, mb, me, ms, plnr) + && small_enough(d, m); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_t2fsimd_genus)) = { t_okp_t2f, VL }; + +static int t_okp_t2b(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + return t_okp_t1b(d, rio, iio, rs, vs, m, mb, me, ms, plnr) + && small_enough(d, m); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_t2bsimd_genus)) = { t_okp_t2b, VL }; + +static int ts_okp(const ct_desc *d, + const R *rio, const R *iio, + INT rs, INT vs, INT m, INT mb, INT me, INT ms, + const planner *plnr) +{ + UNUSED(rio); + UNUSED(iio); + return (1 + && !NO_SIMDP(plnr) + && ALIGNEDA(rio) + && ALIGNEDA(iio) + && SIMD_STRIDE_OKA(rs) + && ms == 1 + && (m % (2 * VL)) == 0 + && (mb % (2 * VL)) == 0 + && (me % (2 * VL)) == 0 + && (!d->rs || (d->rs == rs)) + && (!d->vs || (d->vs == vs)) + && (!d->ms || (d->ms == ms)) + ); +} + +EXTERN_CONST(ct_genus, XSIMD(dft_tssimd_genus)) = { ts_okp, 2 * VL }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_10.c new file mode 100644 index 000000000..788f0032a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_10.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:55 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 10 -name n1bv_10 -include dft/simd/n1b.h */ + +/* + * This function contains 42 FP additions, 22 FP multiplications, + * (or, 24 additions, 4 multiplications, 18 fused multiply/add), + * 33 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V T3, Tr, Tm, Tn, TD, TC, Tu, Tx, Ty, Ta, Th, Ti, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tr = VADD(T1, T2); + { + V T6, Ts, Tg, Tw, T9, Tt, Td, Tv; + { + V T4, T5, Te, Tf; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Ts = VADD(T4, T5); + Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + Tw = VADD(Te, Tf); + } + { + V T7, T8, Tb, Tc; + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tt = VADD(T7, T8); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tv = VADD(Tb, Tc); + } + Tm = VSUB(T6, T9); + Tn = VSUB(Td, Tg); + TD = VSUB(Ts, Tt); + TC = VSUB(Tv, Tw); + Tu = VADD(Ts, Tt); + Tx = VADD(Tv, Tw); + Ty = VADD(Tu, Tx); + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + } + ST(&(xo[WS(os, 5)]), VADD(T3, Ti), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Tr, Ty), ovs, &(xo[0])); + { + V To, Tq, Tl, Tp, Tj, Tk; + To = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tn, Tm)); + Tq = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tm, Tn)); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tk = VSUB(Ta, Th); + Tl = VFMA(LDK(KP559016994), Tk, Tj); + Tp = VFNMS(LDK(KP559016994), Tk, Tj); + ST(&(xo[WS(os, 1)]), VFMAI(To, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFNMSI(Tq, Tp), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFNMSI(To, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(Tq, Tp), ovs, &(xo[WS(os, 1)])); + } + { + V TE, TG, TB, TF, Tz, TA; + TE = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TD, TC)); + TG = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TC, TD)); + Tz = VFNMS(LDK(KP250000000), Ty, Tr); + TA = VSUB(Tu, Tx); + TB = VFNMS(LDK(KP559016994), TA, Tz); + TF = VFMA(LDK(KP559016994), TA, Tz); + ST(&(xo[WS(os, 2)]), VFNMSI(TE, TB), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VFMAI(TG, TF), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFMAI(TE, TB), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFNMSI(TG, TF), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n1bv_10"), {24, 4, 18, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_10) (planner *p) { + X(kdft_register) (p, n1bv_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 10 -name n1bv_10 -include dft/simd/n1b.h */ + +/* + * This function contains 42 FP additions, 12 FP multiplications, + * (or, 36 additions, 6 multiplications, 6 fused multiply/add), + * 33 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V Tl, Ty, T7, Te, Tw, Tt, Tz, TA, TB, Tg, Th, Tm, Tj, Tk; + Tj = LD(&(xi[0]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tl = VSUB(Tj, Tk); + Ty = VADD(Tj, Tk); + { + V T3, Tr, Td, Tv, T6, Ts, Ta, Tu; + { + V T1, T2, Tb, Tc; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tr = VADD(T1, T2); + Tb = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tv = VADD(Tb, Tc); + } + { + V T4, T5, T8, T9; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Ts = VADD(T4, T5); + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + Tu = VADD(T8, T9); + } + T7 = VSUB(T3, T6); + Te = VSUB(Ta, Td); + Tw = VSUB(Tu, Tv); + Tt = VSUB(Tr, Ts); + Tz = VADD(Tr, Ts); + TA = VADD(Tu, Tv); + TB = VADD(Tz, TA); + Tg = VADD(T3, T6); + Th = VADD(Ta, Td); + Tm = VADD(Tg, Th); + } + ST(&(xo[WS(os, 5)]), VADD(Tl, Tm), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Ty, TB), ovs, &(xo[0])); + { + V Tf, Tq, To, Tp, Ti, Tn; + Tf = VBYI(VFMA(LDK(KP951056516), T7, VMUL(LDK(KP587785252), Te))); + Tq = VBYI(VFNMS(LDK(KP951056516), Te, VMUL(LDK(KP587785252), T7))); + Ti = VMUL(LDK(KP559016994), VSUB(Tg, Th)); + Tn = VFNMS(LDK(KP250000000), Tm, Tl); + To = VADD(Ti, Tn); + Tp = VSUB(Tn, Ti); + ST(&(xo[WS(os, 1)]), VADD(Tf, To), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(Tq, Tp), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VSUB(To, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VSUB(Tp, Tq), ovs, &(xo[WS(os, 1)])); + } + { + V Tx, TG, TE, TF, TC, TD; + Tx = VBYI(VFNMS(LDK(KP951056516), Tw, VMUL(LDK(KP587785252), Tt))); + TG = VBYI(VFMA(LDK(KP951056516), Tt, VMUL(LDK(KP587785252), Tw))); + TC = VFNMS(LDK(KP250000000), TB, Ty); + TD = VMUL(LDK(KP559016994), VSUB(Tz, TA)); + TE = VSUB(TC, TD); + TF = VADD(TD, TC); + ST(&(xo[WS(os, 2)]), VADD(Tx, TE), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VADD(TG, TF), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VSUB(TE, Tx), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VSUB(TF, TG), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n1bv_10"), {36, 6, 6, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_10) (planner *p) { + X(kdft_register) (p, n1bv_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_11.c new file mode 100644 index 000000000..af83ba8ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_11.c @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 11 -name n1bv_11 -include dft/simd/n1b.h */ + +/* + * This function contains 70 FP additions, 60 FP multiplications, + * (or, 15 additions, 5 multiplications, 55 fused multiply/add), + * 42 stack variables, 11 constants, and 22 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_11(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP959492973, +0.959492973614497389890368057066327699062454848); + DVK(KP918985947, +0.918985947228994779780736114132655398124909697); + DVK(KP989821441, +0.989821441880932732376092037776718787376519372); + DVK(KP830830026, +0.830830026003772851058548298459246407048009821); + DVK(KP876768831, +0.876768831002589333891339807079336796764054852); + DVK(KP778434453, +0.778434453334651800608337670740821884709317477); + DVK(KP372785597, +0.372785597771792209609773152906148328659002598); + DVK(KP715370323, +0.715370323453429719112414662767260662417897278); + DVK(KP521108558, +0.521108558113202722944698153526659300680427422); + DVK(KP634356270, +0.634356270682424498893150776899916060542806975); + DVK(KP342584725, +0.342584725681637509502641509861112333758894680); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(22, is), MAKE_VOLATILE_STRIDE(22, os)) { + V T1, T4, Tq, Tg, Tm, T7, Tp, Ta, To, Td, Tn, Ti, Tw, T12, Ts; + V TX, TT, TK, TB, TO, TF, T5, T6; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T2, T3, Te, Tf; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tq = VSUB(T2, T3); + Te = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tf = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tg = VADD(Te, Tf); + Tm = VSUB(Te, Tf); + } + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + Tp = VSUB(T5, T6); + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + To = VSUB(T8, T9); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + Tn = VSUB(Tb, Tc); + } + { + V Th, Tv, T11, Tr, TW; + Th = VFNMS(LDK(KP342584725), Tg, Td); + Ti = VFNMS(LDK(KP634356270), Th, Ta); + Tv = VFNMS(LDK(KP342584725), T7, Tg); + Tw = VFNMS(LDK(KP634356270), Tv, T4); + T11 = VFMA(LDK(KP521108558), Tm, Tq); + T12 = VFMA(LDK(KP715370323), T11, Tn); + Tr = VFNMS(LDK(KP521108558), Tq, Tp); + Ts = VFNMS(LDK(KP715370323), Tr, To); + TW = VFNMS(LDK(KP342584725), Ta, T7); + TX = VFNMS(LDK(KP634356270), TW, Td); + } + { + V TS, TJ, TA, TN, TE; + TS = VFMA(LDK(KP521108558), To, Tm); + TT = VFNMS(LDK(KP715370323), TS, Tp); + TJ = VFNMS(LDK(KP521108558), Tp, Tn); + TK = VFMA(LDK(KP715370323), TJ, Tm); + TA = VFMA(LDK(KP715370323), To, Tq); + TB = VFMA(LDK(KP372785597), Tn, TA); + TN = VFNMS(LDK(KP342584725), Td, T4); + TO = VFNMS(LDK(KP634356270), TN, T7); + TE = VFNMS(LDK(KP342584725), T4, Ta); + TF = VFNMS(LDK(KP634356270), TE, Tg); + } + ST(&(xo[0]), VADD(Tg, VADD(Td, VADD(Ta, VADD(T7, VADD(T4, T1))))), ovs, &(xo[0])); + { + V Tk, Tu, Tj, Tt, Tl; + Tj = VFNMS(LDK(KP778434453), Ti, T7); + Tk = VFNMS(LDK(KP876768831), Tj, T4); + Tt = VFNMS(LDK(KP830830026), Ts, Tn); + Tu = VMUL(LDK(KP989821441), VFNMS(LDK(KP918985947), Tt, Tm)); + Tl = VFNMS(LDK(KP959492973), Tk, T1); + ST(&(xo[WS(os, 5)]), VFMAI(Tu, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VFNMSI(Tu, Tl), ovs, &(xo[0])); + } + { + V TZ, T14, TY, T13, T10; + TY = VFNMS(LDK(KP778434453), TX, T4); + TZ = VFNMS(LDK(KP876768831), TY, Tg); + T13 = VFMA(LDK(KP830830026), T12, Tp); + T14 = VMUL(LDK(KP989821441), VFMA(LDK(KP918985947), T13, To)); + T10 = VFNMS(LDK(KP959492973), TZ, T1); + ST(&(xo[WS(os, 1)]), VFMAI(T14, T10), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VFNMSI(T14, T10), ovs, &(xo[0])); + } + { + V TQ, TV, TP, TU, TR; + TP = VFNMS(LDK(KP778434453), TO, Tg); + TQ = VFNMS(LDK(KP876768831), TP, Ta); + TU = VFMA(LDK(KP830830026), TT, Tq); + TV = VMUL(LDK(KP989821441), VFNMS(LDK(KP918985947), TU, Tn)); + TR = VFNMS(LDK(KP959492973), TQ, T1); + ST(&(xo[WS(os, 2)]), VFNMSI(TV, TR), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFMAI(TV, TR), ovs, &(xo[WS(os, 1)])); + } + { + V TH, TM, TG, TL, TI; + TG = VFNMS(LDK(KP778434453), TF, Td); + TH = VFNMS(LDK(KP876768831), TG, T7); + TL = VFNMS(LDK(KP830830026), TK, To); + TM = VMUL(LDK(KP989821441), VFNMS(LDK(KP918985947), TL, Tq)); + TI = VFNMS(LDK(KP959492973), TH, T1); + ST(&(xo[WS(os, 3)]), VFMAI(TM, TI), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VFNMSI(TM, TI), ovs, &(xo[0])); + } + { + V Ty, TD, Tx, TC, Tz; + Tx = VFNMS(LDK(KP778434453), Tw, Ta); + Ty = VFNMS(LDK(KP876768831), Tx, Td); + TC = VFNMS(LDK(KP830830026), TB, Tm); + TD = VMUL(LDK(KP989821441), VFMA(LDK(KP918985947), TC, Tp)); + Tz = VFNMS(LDK(KP959492973), Ty, T1); + ST(&(xo[WS(os, 4)]), VFNMSI(TD, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFMAI(TD, Tz), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 11, XSIMD_STRING("n1bv_11"), {15, 5, 55, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_11) (planner *p) { + X(kdft_register) (p, n1bv_11, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 11 -name n1bv_11 -include dft/simd/n1b.h */ + +/* + * This function contains 70 FP additions, 50 FP multiplications, + * (or, 30 additions, 10 multiplications, 40 fused multiply/add), + * 32 stack variables, 10 constants, and 22 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_11(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP959492973, +0.959492973614497389890368057066327699062454848); + DVK(KP654860733, +0.654860733945285064056925072466293553183791199); + DVK(KP142314838, +0.142314838273285140443792668616369668791051361); + DVK(KP415415013, +0.415415013001886425529274149229623203524004910); + DVK(KP841253532, +0.841253532831181168861811648919367717513292498); + DVK(KP540640817, +0.540640817455597582107635954318691695431770608); + DVK(KP909631995, +0.909631995354518371411715383079028460060241051); + DVK(KP989821441, +0.989821441880932732376092037776718787376519372); + DVK(KP755749574, +0.755749574354258283774035843972344420179717445); + DVK(KP281732556, +0.281732556841429697711417915346616899035777899); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(22, is), MAKE_VOLATILE_STRIDE(22, os)) { + V Th, T3, Tm, Tf, Ti, Tc, Tj, T9, Tk, T6, Tl, Ta, Tb, Ts, Tt; + Th = LD(&(xi[0]), ivs, &(xi[0])); + { + V T1, T2, Td, Te; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tm = VADD(T1, T2); + Td = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tf = VSUB(Td, Te); + Ti = VADD(Td, Te); + } + Ta = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tb = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tc = VSUB(Ta, Tb); + Tj = VADD(Ta, Tb); + { + V T7, T8, T4, T5; + T7 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + Tk = VADD(T7, T8); + T4 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + Tl = VADD(T4, T5); + } + ST(&(xo[0]), VADD(Th, VADD(Tm, VADD(Ti, VADD(Tl, VADD(Tj, Tk))))), ovs, &(xo[0])); + { + V Tg, Tn, Tu, Tv; + Tg = VBYI(VFMA(LDK(KP281732556), T3, VFMA(LDK(KP755749574), T6, VFNMS(LDK(KP909631995), Tc, VFNMS(LDK(KP540640817), Tf, VMUL(LDK(KP989821441), T9)))))); + Tn = VFMA(LDK(KP841253532), Ti, VFMA(LDK(KP415415013), Tj, VFNMS(LDK(KP142314838), Tk, VFNMS(LDK(KP654860733), Tl, VFNMS(LDK(KP959492973), Tm, Th))))); + ST(&(xo[WS(os, 5)]), VADD(Tg, Tn), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VSUB(Tn, Tg), ovs, &(xo[0])); + Tu = VBYI(VFMA(LDK(KP755749574), T3, VFMA(LDK(KP540640817), T6, VFNMS(LDK(KP909631995), T9, VFNMS(LDK(KP989821441), Tf, VMUL(LDK(KP281732556), Tc)))))); + Tv = VFMA(LDK(KP841253532), Tl, VFMA(LDK(KP415415013), Tk, VFNMS(LDK(KP959492973), Tj, VFNMS(LDK(KP142314838), Ti, VFNMS(LDK(KP654860733), Tm, Th))))); + ST(&(xo[WS(os, 4)]), VADD(Tu, Tv), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VSUB(Tv, Tu), ovs, &(xo[WS(os, 1)])); + } + Ts = VBYI(VFMA(LDK(KP909631995), T3, VFNMS(LDK(KP540640817), T9, VFNMS(LDK(KP989821441), Tc, VFNMS(LDK(KP281732556), T6, VMUL(LDK(KP755749574), Tf)))))); + Tt = VFMA(LDK(KP415415013), Tm, VFMA(LDK(KP841253532), Tk, VFNMS(LDK(KP142314838), Tj, VFNMS(LDK(KP959492973), Tl, VFNMS(LDK(KP654860733), Ti, Th))))); + ST(&(xo[WS(os, 2)]), VADD(Ts, Tt), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VSUB(Tt, Ts), ovs, &(xo[WS(os, 1)])); + { + V Tq, Tr, To, Tp; + Tq = VBYI(VFMA(LDK(KP540640817), T3, VFMA(LDK(KP909631995), Tf, VFMA(LDK(KP989821441), T6, VFMA(LDK(KP755749574), Tc, VMUL(LDK(KP281732556), T9)))))); + Tr = VFMA(LDK(KP841253532), Tm, VFMA(LDK(KP415415013), Ti, VFNMS(LDK(KP959492973), Tk, VFNMS(LDK(KP654860733), Tj, VFNMS(LDK(KP142314838), Tl, Th))))); + ST(&(xo[WS(os, 1)]), VADD(Tq, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VSUB(Tr, Tq), ovs, &(xo[0])); + To = VBYI(VFMA(LDK(KP989821441), T3, VFMA(LDK(KP540640817), Tc, VFNMS(LDK(KP909631995), T6, VFNMS(LDK(KP281732556), Tf, VMUL(LDK(KP755749574), T9)))))); + Tp = VFMA(LDK(KP415415013), Tl, VFMA(LDK(KP841253532), Tj, VFNMS(LDK(KP654860733), Tk, VFNMS(LDK(KP959492973), Ti, VFNMS(LDK(KP142314838), Tm, Th))))); + ST(&(xo[WS(os, 3)]), VADD(To, Tp), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VSUB(Tp, To), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 11, XSIMD_STRING("n1bv_11"), {30, 10, 40, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_11) (planner *p) { + X(kdft_register) (p, n1bv_11, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_12.c new file mode 100644 index 000000000..8952193e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_12.c @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 12 -name n1bv_12 -include dft/simd/n1b.h */ + +/* + * This function contains 48 FP additions, 20 FP multiplications, + * (or, 30 additions, 2 multiplications, 18 fused multiply/add), + * 27 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TJ, TB, Tq, Tp, Tg, Tl, TG, Ty, Tt, Ts; + { + V T1, T6, T4, Tz, T9, TA; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tz = VSUB(T2, T3); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + TA = VSUB(T7, T8); + } + T5 = VADD(T1, T4); + Ta = VADD(T6, T9); + TJ = VSUB(Tz, TA); + TB = VADD(Tz, TA); + Tq = VFNMS(LDK(KP500000000), T9, T6); + Tp = VFNMS(LDK(KP500000000), T4, T1); + } + { + V Tc, Th, Tf, Tw, Tk, Tx; + Tc = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Td, Te, Ti, Tj; + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Tw = VSUB(Td, Te); + Ti = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + Tx = VSUB(Tj, Ti); + } + Tg = VADD(Tc, Tf); + Tl = VADD(Th, Tk); + TG = VADD(Tw, Tx); + Ty = VSUB(Tw, Tx); + Tt = VFNMS(LDK(KP500000000), Tk, Th); + Ts = VFNMS(LDK(KP500000000), Tf, Tc); + } + { + V Tb, Tm, Tn, To; + Tb = VSUB(T5, Ta); + Tm = VSUB(Tg, Tl); + ST(&(xo[WS(os, 3)]), VFNMSI(Tm, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(Tm, Tb), ovs, &(xo[WS(os, 1)])); + Tn = VADD(T5, Ta); + To = VADD(Tg, Tl); + ST(&(xo[WS(os, 6)]), VSUB(Tn, To), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tn, To), ovs, &(xo[0])); + } + { + V TC, TE, Tv, TD, Tr, Tu; + TC = VMUL(LDK(KP866025403), VSUB(Ty, TB)); + TE = VMUL(LDK(KP866025403), VADD(TB, Ty)); + Tr = VADD(Tp, Tq); + Tu = VADD(Ts, Tt); + Tv = VSUB(Tr, Tu); + TD = VADD(Tr, Tu); + ST(&(xo[WS(os, 10)]), VFNMSI(TC, Tv), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(TE, TD), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(TC, Tv), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFNMSI(TE, TD), ovs, &(xo[0])); + } + { + V TH, TL, TK, TM, TF, TI; + TF = VSUB(Tp, Tq); + TH = VFNMS(LDK(KP866025403), TG, TF); + TL = VFMA(LDK(KP866025403), TG, TF); + TI = VSUB(Ts, Tt); + TK = VFMA(LDK(KP866025403), TJ, TI); + TM = VFNMS(LDK(KP866025403), TJ, TI); + ST(&(xo[WS(os, 1)]), VFMAI(TK, TH), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFNMSI(TM, TL), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFNMSI(TK, TH), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFMAI(TM, TL), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n1bv_12"), {30, 2, 18, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_12) (planner *p) { + X(kdft_register) (p, n1bv_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 12 -name n1bv_12 -include dft/simd/n1b.h */ + +/* + * This function contains 48 FP additions, 8 FP multiplications, + * (or, 44 additions, 4 multiplications, 4 fused multiply/add), + * 27 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TG, TF, Ty, Tm, Ti, Tp, TJ, TI, Tx, Ts; + { + V T1, T6, T4, Tk, T9, Tl; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tk = VSUB(T2, T3); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Tl = VSUB(T7, T8); + } + T5 = VFNMS(LDK(KP500000000), T4, T1); + Ta = VFNMS(LDK(KP500000000), T9, T6); + TG = VADD(T6, T9); + TF = VADD(T1, T4); + Ty = VADD(Tk, Tl); + Tm = VMUL(LDK(KP866025403), VSUB(Tk, Tl)); + } + { + V Tn, Tq, Te, To, Th, Tr; + Tn = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tq = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Te = VSUB(Tc, Td); + To = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + Tr = VADD(Tf, Tg); + } + Ti = VMUL(LDK(KP866025403), VSUB(Te, Th)); + Tp = VFNMS(LDK(KP500000000), To, Tn); + TJ = VADD(Tq, Tr); + TI = VADD(Tn, To); + Tx = VADD(Te, Th); + Ts = VFNMS(LDK(KP500000000), Tr, Tq); + } + { + V TH, TK, TL, TM; + TH = VSUB(TF, TG); + TK = VBYI(VSUB(TI, TJ)); + ST(&(xo[WS(os, 3)]), VSUB(TH, TK), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(TH, TK), ovs, &(xo[WS(os, 1)])); + TL = VADD(TF, TG); + TM = VADD(TI, TJ); + ST(&(xo[WS(os, 6)]), VSUB(TL, TM), ovs, &(xo[0])); + ST(&(xo[0]), VADD(TL, TM), ovs, &(xo[0])); + } + { + V Tj, Tv, Tu, Tw, Tb, Tt; + Tb = VSUB(T5, Ta); + Tj = VSUB(Tb, Ti); + Tv = VADD(Tb, Ti); + Tt = VSUB(Tp, Ts); + Tu = VBYI(VADD(Tm, Tt)); + Tw = VBYI(VSUB(Tt, Tm)); + ST(&(xo[WS(os, 11)]), VSUB(Tj, Tu), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(Tv, Tw), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(Tj, Tu), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VSUB(Tv, Tw), ovs, &(xo[WS(os, 1)])); + } + { + V Tz, TD, TC, TE, TA, TB; + Tz = VBYI(VMUL(LDK(KP866025403), VSUB(Tx, Ty))); + TD = VBYI(VMUL(LDK(KP866025403), VADD(Ty, Tx))); + TA = VADD(T5, Ta); + TB = VADD(Tp, Ts); + TC = VSUB(TA, TB); + TE = VADD(TA, TB); + ST(&(xo[WS(os, 2)]), VADD(Tz, TC), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VSUB(TE, TD), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VSUB(TC, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(TD, TE), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n1bv_12"), {44, 4, 4, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_12) (planner *p) { + X(kdft_register) (p, n1bv_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_128.c new file mode 100644 index 000000000..2880e73b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_128.c @@ -0,0 +1,3654 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:00 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 128 -name n1bv_128 -include dft/simd/n1b.h */ + +/* + * This function contains 1082 FP additions, 642 FP multiplications, + * (or, 440 additions, 0 multiplications, 642 fused multiply/add), + * 194 stack variables, 31 constants, and 256 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_128(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP941544065, +0.941544065183020778412509402599502357185589796); + DVK(KP903989293, +0.903989293123443331586200297230537048710132025); + DVK(KP357805721, +0.357805721314524104672487743774474392487532769); + DVK(KP472964775, +0.472964775891319928124438237972992463904131113); + DVK(KP970031253, +0.970031253194543992603984207286100251456865962); + DVK(KP857728610, +0.857728610000272069902269984284770137042490799); + DVK(KP250486960, +0.250486960191305461595702160124721208578685568); + DVK(KP599376933, +0.599376933681923766271389869014404232837890546); + DVK(KP740951125, +0.740951125354959091175616897495162729728955309); + DVK(KP998795456, +0.998795456205172392714771604759100694443203615); + DVK(KP906347169, +0.906347169019147157946142717268914412664134293); + DVK(KP049126849, +0.049126849769467254105343321271313617079695752); + DVK(KP803207531, +0.803207531480644909806676512963141923879569427); + DVK(KP989176509, +0.989176509964780973451673738016243063983689533); + DVK(KP741650546, +0.741650546272035369581266691172079863842265220); + DVK(KP148335987, +0.148335987538347428753676511486911367000625355); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + V Tr, T5J, Ted, Tgf, Tfq, TgG, T4U, T6a, T6Z, T8T, Tad, TcZ, Tcc, Td0, T84; + V T9k, Tb6, Tbt, T2G, T5U, TeV, Tgt, T3p, T5X, T7B, T97, TeK, Tgq, T7q, T94; + V Td8, TdK, TbD, Tc0, T3V, T61, Tfg, TgA, T4E, T64, T7U, T9e, Tf5, Tgx, T7J; + V T9b, Tdf, TdN, Td2, Td3, TI, T4V, Tft, Tgg, TZ, T4W, T75, T86, Tek, TgH; + V T72, T85, Tas, Tcd, Tdm, Tdn, TdG, Teq, Tgj, Tet, Tgi, T1s, T5N, T1B, T5M; + V T7d, T8W, TaI, Tcf, T7a, T8X, Tdp, Tdq, TdH, Tez, Tgm, TeC, Tgl, T23, T5Q; + V T2c, T5P, T7k, T8Z, TaX, Tcg, T7h, T90, Tbl, Tbu, Tdb, TdL, TeY, Tgr, TeR; + V Tgu, T7x, T98, T7E, T95, T3f, T5Y, T3s, T5V, TbS, Tc1, Tdi, TdO, Tfj, Tgy; + V Tfc, TgB, T7Q, T9f, T7X, T9c, T4u, T65, T4H, T62; + { + V T3, Ta7, T4O, Ta8, Ta, Tab, T4P, Taa, Tc6, Tc7, Ti, Tea, T4R, Tc9, Tca; + V Tp, Teb, T4S; + { + V T1, T2, T4M, T4N; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 64)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Ta7 = VADD(T1, T2); + T4M = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T4N = LD(&(xi[WS(is, 96)]), ivs, &(xi[0])); + T4O = VSUB(T4M, T4N); + Ta8 = VADD(T4M, T4N); + } + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 80)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 112)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + Ta = VADD(T6, T9); + Tab = VADD(T7, T8); + T4P = VSUB(T6, T9); + Taa = VADD(T4, T5); + } + { + V Te, Th, Tl, To; + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 72)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tc6 = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 104)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + Tc7 = VADD(Tf, Tg); + } + Ti = VFNMS(LDK(KP414213562), Th, Te); + Tea = VSUB(Tc6, Tc7); + T4R = VFMA(LDK(KP414213562), Te, Th); + { + V Tj, Tk, Tm, Tn; + Tj = LD(&(xi[WS(is, 120)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + Tc9 = VADD(Tj, Tk); + Tm = LD(&(xi[WS(is, 88)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + Tca = VADD(Tn, Tm); + } + Tp = VFNMS(LDK(KP414213562), To, Tl); + Teb = VSUB(Tc9, Tca); + T4S = VFMA(LDK(KP414213562), Tl, To); + } + { + V Tb, Tq, Te9, Tec; + Tb = VFMA(LDK(KP707106781), Ta, T3); + Tq = VADD(Ti, Tp); + Tr = VFMA(LDK(KP923879532), Tq, Tb); + T5J = VFNMS(LDK(KP923879532), Tq, Tb); + Te9 = VSUB(Ta7, Ta8); + Tec = VADD(Tea, Teb); + Ted = VFMA(LDK(KP707106781), Tec, Te9); + Tgf = VFNMS(LDK(KP707106781), Tec, Te9); + } + { + V Tfo, Tfp, T4Q, T4T; + Tfo = VSUB(Taa, Tab); + Tfp = VSUB(Tea, Teb); + Tfq = VFMA(LDK(KP707106781), Tfp, Tfo); + TgG = VFNMS(LDK(KP707106781), Tfp, Tfo); + T4Q = VFMA(LDK(KP707106781), T4P, T4O); + T4T = VSUB(T4R, T4S); + T4U = VFMA(LDK(KP923879532), T4T, T4Q); + T6a = VFNMS(LDK(KP923879532), T4T, T4Q); + } + { + V T6X, T6Y, Ta9, Tac; + T6X = VFNMS(LDK(KP707106781), Ta, T3); + T6Y = VADD(T4R, T4S); + T6Z = VFMA(LDK(KP923879532), T6Y, T6X); + T8T = VFNMS(LDK(KP923879532), T6Y, T6X); + Ta9 = VADD(Ta7, Ta8); + Tac = VADD(Taa, Tab); + Tad = VSUB(Ta9, Tac); + TcZ = VADD(Ta9, Tac); + } + { + V Tc8, Tcb, T82, T83; + Tc8 = VADD(Tc6, Tc7); + Tcb = VADD(Tc9, Tca); + Tcc = VSUB(Tc8, Tcb); + Td0 = VADD(Tc8, Tcb); + T82 = VFNMS(LDK(KP707106781), T4P, T4O); + T83 = VSUB(Ti, Tp); + T84 = VFNMS(LDK(KP923879532), T83, T82); + T9k = VFMA(LDK(KP923879532), T83, T82); + } + } + { + V Tb0, Tb1, T2i, Tb2, T3j, Tb3, Tb4, T2p, Tb5, T3k, T2x, TeH, T3m, Tbp, T2E; + V TeI, T3n, Tbs, T2l, T2o, TeG, TeJ; + { + V T2g, T2h, T3h, T3i; + T2g = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2h = LD(&(xi[WS(is, 65)]), ivs, &(xi[WS(is, 1)])); + Tb0 = VADD(T2g, T2h); + T3h = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T3i = LD(&(xi[WS(is, 97)]), ivs, &(xi[WS(is, 1)])); + Tb1 = VADD(T3h, T3i); + T2i = VSUB(T2g, T2h); + Tb2 = VADD(Tb0, Tb1); + T3j = VSUB(T3h, T3i); + } + { + V T2j, T2k, T2m, T2n; + T2j = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T2k = LD(&(xi[WS(is, 81)]), ivs, &(xi[WS(is, 1)])); + T2l = VSUB(T2j, T2k); + Tb3 = VADD(T2j, T2k); + T2m = LD(&(xi[WS(is, 113)]), ivs, &(xi[WS(is, 1)])); + T2n = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T2o = VSUB(T2m, T2n); + Tb4 = VADD(T2m, T2n); + } + T2p = VADD(T2l, T2o); + Tb5 = VADD(Tb3, Tb4); + T3k = VSUB(T2l, T2o); + { + V T2t, Tbn, T2w, Tbo; + { + V T2r, T2s, T2u, T2v; + T2r = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T2s = LD(&(xi[WS(is, 73)]), ivs, &(xi[WS(is, 1)])); + T2t = VSUB(T2r, T2s); + Tbn = VADD(T2r, T2s); + T2u = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T2v = LD(&(xi[WS(is, 105)]), ivs, &(xi[WS(is, 1)])); + T2w = VSUB(T2u, T2v); + Tbo = VADD(T2u, T2v); + } + T2x = VFNMS(LDK(KP414213562), T2w, T2t); + TeH = VSUB(Tbn, Tbo); + T3m = VFMA(LDK(KP414213562), T2t, T2w); + Tbp = VADD(Tbn, Tbo); + } + { + V T2A, Tbq, T2D, Tbr; + { + V T2y, T2z, T2B, T2C; + T2y = LD(&(xi[WS(is, 121)]), ivs, &(xi[WS(is, 1)])); + T2z = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T2A = VSUB(T2y, T2z); + Tbq = VADD(T2y, T2z); + T2B = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T2C = LD(&(xi[WS(is, 89)]), ivs, &(xi[WS(is, 1)])); + T2D = VSUB(T2B, T2C); + Tbr = VADD(T2B, T2C); + } + T2E = VFMA(LDK(KP414213562), T2D, T2A); + TeI = VSUB(Tbq, Tbr); + T3n = VFNMS(LDK(KP414213562), T2A, T2D); + Tbs = VADD(Tbq, Tbr); + } + Tb6 = VSUB(Tb2, Tb5); + Tbt = VSUB(Tbp, Tbs); + { + V T2q, T2F, TeT, TeU; + T2q = VFMA(LDK(KP707106781), T2p, T2i); + T2F = VADD(T2x, T2E); + T2G = VFMA(LDK(KP923879532), T2F, T2q); + T5U = VFNMS(LDK(KP923879532), T2F, T2q); + TeT = VSUB(Tb3, Tb4); + TeU = VSUB(TeH, TeI); + TeV = VFMA(LDK(KP707106781), TeU, TeT); + Tgt = VFNMS(LDK(KP707106781), TeU, TeT); + } + { + V T3l, T3o, T7z, T7A; + T3l = VFMA(LDK(KP707106781), T3k, T3j); + T3o = VADD(T3m, T3n); + T3p = VFMA(LDK(KP923879532), T3o, T3l); + T5X = VFNMS(LDK(KP923879532), T3o, T3l); + T7z = VFNMS(LDK(KP707106781), T3k, T3j); + T7A = VSUB(T2x, T2E); + T7B = VFNMS(LDK(KP923879532), T7A, T7z); + T97 = VFMA(LDK(KP923879532), T7A, T7z); + } + TeG = VSUB(Tb0, Tb1); + TeJ = VADD(TeH, TeI); + TeK = VFMA(LDK(KP707106781), TeJ, TeG); + Tgq = VFNMS(LDK(KP707106781), TeJ, TeG); + { + V T7o, T7p, Td6, Td7; + T7o = VFNMS(LDK(KP707106781), T2p, T2i); + T7p = VSUB(T3m, T3n); + T7q = VFMA(LDK(KP923879532), T7p, T7o); + T94 = VFNMS(LDK(KP923879532), T7p, T7o); + Td6 = VADD(Tb2, Tb5); + Td7 = VADD(Tbp, Tbs); + Td8 = VADD(Td6, Td7); + TdK = VSUB(Td6, Td7); + } + } + { + V Tbx, Tby, T3x, Tbz, T4y, TbA, TbB, T3E, TbC, T4z, T3M, Tf2, T4B, TbZ, T3T; + V Tf3, T4C, TbW, T3A, T3D, Tf1, Tf4; + { + V T3v, T3w, T4w, T4x; + T3v = LD(&(xi[WS(is, 127)]), ivs, &(xi[WS(is, 1)])); + T3w = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + Tbx = VADD(T3v, T3w); + T4w = LD(&(xi[WS(is, 95)]), ivs, &(xi[WS(is, 1)])); + T4x = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + Tby = VADD(T4x, T4w); + T3x = VSUB(T3v, T3w); + Tbz = VADD(Tbx, Tby); + T4y = VSUB(T4w, T4x); + } + { + V T3y, T3z, T3B, T3C; + T3y = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T3z = LD(&(xi[WS(is, 79)]), ivs, &(xi[WS(is, 1)])); + T3A = VSUB(T3y, T3z); + TbA = VADD(T3y, T3z); + T3B = LD(&(xi[WS(is, 111)]), ivs, &(xi[WS(is, 1)])); + T3C = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T3D = VSUB(T3B, T3C); + TbB = VADD(T3B, T3C); + } + T3E = VADD(T3A, T3D); + TbC = VADD(TbA, TbB); + T4z = VSUB(T3D, T3A); + { + V T3I, TbX, T3L, TbY; + { + V T3G, T3H, T3J, T3K; + T3G = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3H = LD(&(xi[WS(is, 71)]), ivs, &(xi[WS(is, 1)])); + T3I = VSUB(T3G, T3H); + TbX = VADD(T3G, T3H); + T3J = LD(&(xi[WS(is, 103)]), ivs, &(xi[WS(is, 1)])); + T3K = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T3L = VSUB(T3J, T3K); + TbY = VADD(T3K, T3J); + } + T3M = VFMA(LDK(KP414213562), T3L, T3I); + Tf2 = VSUB(TbX, TbY); + T4B = VFNMS(LDK(KP414213562), T3I, T3L); + TbZ = VADD(TbX, TbY); + } + { + V T3P, TbU, T3S, TbV; + { + V T3N, T3O, T3Q, T3R; + T3N = LD(&(xi[WS(is, 119)]), ivs, &(xi[WS(is, 1)])); + T3O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T3P = VSUB(T3N, T3O); + TbU = VADD(T3N, T3O); + T3Q = LD(&(xi[WS(is, 87)]), ivs, &(xi[WS(is, 1)])); + T3R = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T3S = VSUB(T3Q, T3R); + TbV = VADD(T3R, T3Q); + } + T3T = VFNMS(LDK(KP414213562), T3S, T3P); + Tf3 = VSUB(TbU, TbV); + T4C = VFMA(LDK(KP414213562), T3P, T3S); + TbW = VADD(TbU, TbV); + } + TbD = VSUB(Tbz, TbC); + Tc0 = VSUB(TbW, TbZ); + { + V T3F, T3U, Tfe, Tff; + T3F = VFMA(LDK(KP707106781), T3E, T3x); + T3U = VADD(T3M, T3T); + T3V = VFMA(LDK(KP923879532), T3U, T3F); + T61 = VFNMS(LDK(KP923879532), T3U, T3F); + Tfe = VSUB(TbB, TbA); + Tff = VSUB(Tf3, Tf2); + Tfg = VFMA(LDK(KP707106781), Tff, Tfe); + TgA = VFNMS(LDK(KP707106781), Tff, Tfe); + } + { + V T4A, T4D, T7S, T7T; + T4A = VFMA(LDK(KP707106781), T4z, T4y); + T4D = VADD(T4B, T4C); + T4E = VFMA(LDK(KP923879532), T4D, T4A); + T64 = VFNMS(LDK(KP923879532), T4D, T4A); + T7S = VFNMS(LDK(KP707106781), T4z, T4y); + T7T = VSUB(T3T, T3M); + T7U = VFNMS(LDK(KP923879532), T7T, T7S); + T9e = VFMA(LDK(KP923879532), T7T, T7S); + } + Tf1 = VSUB(Tbx, Tby); + Tf4 = VADD(Tf2, Tf3); + Tf5 = VFMA(LDK(KP707106781), Tf4, Tf1); + Tgx = VFNMS(LDK(KP707106781), Tf4, Tf1); + { + V T7H, T7I, Tdd, Tde; + T7H = VFNMS(LDK(KP707106781), T3E, T3x); + T7I = VSUB(T4C, T4B); + T7J = VFMA(LDK(KP923879532), T7I, T7H); + T9b = VFNMS(LDK(KP923879532), T7I, T7H); + Tdd = VADD(Tbz, TbC); + Tde = VADD(TbZ, TbW); + Tdf = VADD(Tdd, Tde); + TdN = VSUB(Tdd, Tde); + } + } + { + V Tu, Tee, TF, Tag, TL, Teh, TW, Tan, TB, Tef, TG, Taj, TS, Tei, TX; + V Taq, Teg, Tej; + { + V Ts, Tt, Tae, TD, TE, Taf; + Ts = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 68)]), ivs, &(xi[0])); + Tae = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 100)]), ivs, &(xi[0])); + Taf = VADD(TD, TE); + Tu = VSUB(Ts, Tt); + Tee = VSUB(Tae, Taf); + TF = VSUB(TD, TE); + Tag = VADD(Tae, Taf); + } + { + V TJ, TK, Tal, TU, TV, Tam; + TJ = LD(&(xi[WS(is, 124)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tal = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 92)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Tam = VADD(TV, TU); + TL = VSUB(TJ, TK); + Teh = VSUB(Tal, Tam); + TW = VSUB(TU, TV); + Tan = VADD(Tal, Tam); + } + { + V Tx, Tah, TA, Tai; + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 84)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Tah = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 116)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + TA = VSUB(Ty, Tz); + Tai = VADD(Ty, Tz); + } + TB = VADD(Tx, TA); + Tef = VSUB(Tah, Tai); + TG = VSUB(Tx, TA); + Taj = VADD(Tah, Tai); + } + { + V TO, Tao, TR, Tap; + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 76)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + Tao = VADD(TM, TN); + TP = LD(&(xi[WS(is, 108)]), ivs, &(xi[0])); + TQ = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + TR = VSUB(TP, TQ); + Tap = VADD(TP, TQ); + } + TS = VADD(TO, TR); + Tei = VSUB(Tap, Tao); + TX = VSUB(TR, TO); + Taq = VADD(Tao, Tap); + } + Td2 = VADD(Tag, Taj); + Td3 = VADD(Tan, Taq); + { + V TC, TH, Tfr, Tfs; + TC = VFMA(LDK(KP707106781), TB, Tu); + TH = VFMA(LDK(KP707106781), TG, TF); + TI = VFNMS(LDK(KP198912367), TH, TC); + T4V = VFMA(LDK(KP198912367), TC, TH); + Tfr = VFMA(LDK(KP414213562), Tee, Tef); + Tfs = VFMA(LDK(KP414213562), Teh, Tei); + Tft = VSUB(Tfr, Tfs); + Tgg = VADD(Tfr, Tfs); + } + { + V TT, TY, T73, T74; + TT = VFMA(LDK(KP707106781), TS, TL); + TY = VFMA(LDK(KP707106781), TX, TW); + TZ = VFNMS(LDK(KP198912367), TY, TT); + T4W = VFMA(LDK(KP198912367), TT, TY); + T73 = VFNMS(LDK(KP707106781), TS, TL); + T74 = VFNMS(LDK(KP707106781), TX, TW); + T75 = VFMA(LDK(KP668178637), T74, T73); + T86 = VFNMS(LDK(KP668178637), T73, T74); + } + Teg = VFNMS(LDK(KP414213562), Tef, Tee); + Tej = VFNMS(LDK(KP414213562), Tei, Teh); + Tek = VADD(Teg, Tej); + TgH = VSUB(Teg, Tej); + { + V T70, T71, Tak, Tar; + T70 = VFNMS(LDK(KP707106781), TB, Tu); + T71 = VFNMS(LDK(KP707106781), TG, TF); + T72 = VFMA(LDK(KP668178637), T71, T70); + T85 = VFNMS(LDK(KP668178637), T70, T71); + Tak = VSUB(Tag, Taj); + Tar = VSUB(Tan, Taq); + Tas = VADD(Tak, Tar); + Tcd = VSUB(Tak, Tar); + } + } + { + V Tau, Tav, T14, Taw, T1v, Tax, Tay, T1b, Taz, T1w, T1j, Ten, T1y, TaD, T1q; + V Teo, T1z, TaG, T17, T1a, Tem, Tep; + { + V T12, T13, T1t, T1u; + T12 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 66)]), ivs, &(xi[0])); + Tau = VADD(T12, T13); + T1t = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + T1u = LD(&(xi[WS(is, 98)]), ivs, &(xi[0])); + Tav = VADD(T1t, T1u); + T14 = VSUB(T12, T13); + Taw = VADD(Tau, Tav); + T1v = VSUB(T1t, T1u); + } + { + V T15, T16, T18, T19; + T15 = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T16 = LD(&(xi[WS(is, 82)]), ivs, &(xi[0])); + T17 = VSUB(T15, T16); + Tax = VADD(T15, T16); + T18 = LD(&(xi[WS(is, 114)]), ivs, &(xi[0])); + T19 = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + T1a = VSUB(T18, T19); + Tay = VADD(T18, T19); + } + T1b = VADD(T17, T1a); + Taz = VADD(Tax, Tay); + T1w = VSUB(T17, T1a); + { + V T1f, TaB, T1i, TaC; + { + V T1d, T1e, T1g, T1h; + T1d = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1e = LD(&(xi[WS(is, 74)]), ivs, &(xi[0])); + T1f = VSUB(T1d, T1e); + TaB = VADD(T1d, T1e); + T1g = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T1h = LD(&(xi[WS(is, 106)]), ivs, &(xi[0])); + T1i = VSUB(T1g, T1h); + TaC = VADD(T1g, T1h); + } + T1j = VFNMS(LDK(KP414213562), T1i, T1f); + Ten = VSUB(TaB, TaC); + T1y = VFMA(LDK(KP414213562), T1f, T1i); + TaD = VADD(TaB, TaC); + } + { + V T1m, TaE, T1p, TaF; + { + V T1k, T1l, T1n, T1o; + T1k = LD(&(xi[WS(is, 122)]), ivs, &(xi[0])); + T1l = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + T1m = VSUB(T1k, T1l); + TaE = VADD(T1k, T1l); + T1n = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T1o = LD(&(xi[WS(is, 90)]), ivs, &(xi[0])); + T1p = VSUB(T1n, T1o); + TaF = VADD(T1n, T1o); + } + T1q = VFMA(LDK(KP414213562), T1p, T1m); + Teo = VSUB(TaE, TaF); + T1z = VFNMS(LDK(KP414213562), T1m, T1p); + TaG = VADD(TaE, TaF); + } + Tdm = VADD(Taw, Taz); + Tdn = VADD(TaD, TaG); + TdG = VSUB(Tdm, Tdn); + Tem = VSUB(Tau, Tav); + Tep = VADD(Ten, Teo); + Teq = VFMA(LDK(KP707106781), Tep, Tem); + Tgj = VFNMS(LDK(KP707106781), Tep, Tem); + { + V Ter, Tes, T1c, T1r; + Ter = VSUB(Tax, Tay); + Tes = VSUB(Ten, Teo); + Tet = VFMA(LDK(KP707106781), Tes, Ter); + Tgi = VFNMS(LDK(KP707106781), Tes, Ter); + T1c = VFMA(LDK(KP707106781), T1b, T14); + T1r = VADD(T1j, T1q); + T1s = VFMA(LDK(KP923879532), T1r, T1c); + T5N = VFNMS(LDK(KP923879532), T1r, T1c); + } + { + V T1x, T1A, T7b, T7c; + T1x = VFMA(LDK(KP707106781), T1w, T1v); + T1A = VADD(T1y, T1z); + T1B = VFMA(LDK(KP923879532), T1A, T1x); + T5M = VFNMS(LDK(KP923879532), T1A, T1x); + T7b = VFNMS(LDK(KP707106781), T1w, T1v); + T7c = VSUB(T1j, T1q); + T7d = VFNMS(LDK(KP923879532), T7c, T7b); + T8W = VFMA(LDK(KP923879532), T7c, T7b); + } + { + V TaA, TaH, T78, T79; + TaA = VSUB(Taw, Taz); + TaH = VSUB(TaD, TaG); + TaI = VFNMS(LDK(KP414213562), TaH, TaA); + Tcf = VFMA(LDK(KP414213562), TaA, TaH); + T78 = VFNMS(LDK(KP707106781), T1b, T14); + T79 = VSUB(T1y, T1z); + T7a = VFMA(LDK(KP923879532), T79, T78); + T8X = VFNMS(LDK(KP923879532), T79, T78); + } + } + { + V TaJ, TaK, T1F, TaL, T26, TaM, TaN, T1M, TaO, T27, T1U, Tew, T29, TaV, T21; + V Tex, T2a, TaS, T1I, T1L, Tev, Tey; + { + V T1D, T1E, T24, T25; + T1D = LD(&(xi[WS(is, 126)]), ivs, &(xi[0])); + T1E = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TaJ = VADD(T1D, T1E); + T24 = LD(&(xi[WS(is, 94)]), ivs, &(xi[0])); + T25 = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TaK = VADD(T25, T24); + T1F = VSUB(T1D, T1E); + TaL = VADD(TaJ, TaK); + T26 = VSUB(T24, T25); + } + { + V T1G, T1H, T1J, T1K; + T1G = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T1H = LD(&(xi[WS(is, 78)]), ivs, &(xi[0])); + T1I = VSUB(T1G, T1H); + TaM = VADD(T1G, T1H); + T1J = LD(&(xi[WS(is, 110)]), ivs, &(xi[0])); + T1K = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + T1L = VSUB(T1J, T1K); + TaN = VADD(T1J, T1K); + } + T1M = VADD(T1I, T1L); + TaO = VADD(TaM, TaN); + T27 = VSUB(T1L, T1I); + { + V T1Q, TaT, T1T, TaU; + { + V T1O, T1P, T1R, T1S; + T1O = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T1P = LD(&(xi[WS(is, 70)]), ivs, &(xi[0])); + T1Q = VSUB(T1O, T1P); + TaT = VADD(T1O, T1P); + T1R = LD(&(xi[WS(is, 102)]), ivs, &(xi[0])); + T1S = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T1T = VSUB(T1R, T1S); + TaU = VADD(T1S, T1R); + } + T1U = VFMA(LDK(KP414213562), T1T, T1Q); + Tew = VSUB(TaT, TaU); + T29 = VFNMS(LDK(KP414213562), T1Q, T1T); + TaV = VADD(TaT, TaU); + } + { + V T1X, TaQ, T20, TaR; + { + V T1V, T1W, T1Y, T1Z; + T1V = LD(&(xi[WS(is, 118)]), ivs, &(xi[0])); + T1W = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + T1X = VSUB(T1V, T1W); + TaQ = VADD(T1V, T1W); + T1Y = LD(&(xi[WS(is, 86)]), ivs, &(xi[0])); + T1Z = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T20 = VSUB(T1Y, T1Z); + TaR = VADD(T1Z, T1Y); + } + T21 = VFNMS(LDK(KP414213562), T20, T1X); + Tex = VSUB(TaQ, TaR); + T2a = VFMA(LDK(KP414213562), T1X, T20); + TaS = VADD(TaQ, TaR); + } + Tdp = VADD(TaL, TaO); + Tdq = VADD(TaV, TaS); + TdH = VSUB(Tdp, Tdq); + Tev = VSUB(TaJ, TaK); + Tey = VADD(Tew, Tex); + Tez = VFMA(LDK(KP707106781), Tey, Tev); + Tgm = VFNMS(LDK(KP707106781), Tey, Tev); + { + V TeA, TeB, T1N, T22; + TeA = VSUB(TaN, TaM); + TeB = VSUB(Tex, Tew); + TeC = VFMA(LDK(KP707106781), TeB, TeA); + Tgl = VFNMS(LDK(KP707106781), TeB, TeA); + T1N = VFMA(LDK(KP707106781), T1M, T1F); + T22 = VADD(T1U, T21); + T23 = VFMA(LDK(KP923879532), T22, T1N); + T5Q = VFNMS(LDK(KP923879532), T22, T1N); + } + { + V T28, T2b, T7i, T7j; + T28 = VFMA(LDK(KP707106781), T27, T26); + T2b = VADD(T29, T2a); + T2c = VFMA(LDK(KP923879532), T2b, T28); + T5P = VFNMS(LDK(KP923879532), T2b, T28); + T7i = VFNMS(LDK(KP707106781), T27, T26); + T7j = VSUB(T21, T1U); + T7k = VFNMS(LDK(KP923879532), T7j, T7i); + T8Z = VFMA(LDK(KP923879532), T7j, T7i); + } + { + V TaP, TaW, T7f, T7g; + TaP = VSUB(TaL, TaO); + TaW = VSUB(TaS, TaV); + TaX = VFNMS(LDK(KP414213562), TaW, TaP); + Tcg = VFMA(LDK(KP414213562), TaP, TaW); + T7f = VFNMS(LDK(KP707106781), T1M, T1F); + T7g = VSUB(T2a, T29); + T7h = VFMA(LDK(KP923879532), T7g, T7f); + T90 = VFNMS(LDK(KP923879532), T7g, T7f); + } + } + { + V T2J, TeL, T2U, Tb9, T30, TeO, T3b, Tbg, T2Q, TeM, T2V, Tbc, T37, TeP, T3c; + V Tbj; + { + V T2H, T2I, Tb7, T2S, T2T, Tb8; + T2H = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T2I = LD(&(xi[WS(is, 69)]), ivs, &(xi[WS(is, 1)])); + Tb7 = VADD(T2H, T2I); + T2S = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T2T = LD(&(xi[WS(is, 101)]), ivs, &(xi[WS(is, 1)])); + Tb8 = VADD(T2S, T2T); + T2J = VSUB(T2H, T2I); + TeL = VSUB(Tb7, Tb8); + T2U = VSUB(T2S, T2T); + Tb9 = VADD(Tb7, Tb8); + } + { + V T2Y, T2Z, Tbe, T39, T3a, Tbf; + T2Y = LD(&(xi[WS(is, 125)]), ivs, &(xi[WS(is, 1)])); + T2Z = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + Tbe = VADD(T2Y, T2Z); + T39 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T3a = LD(&(xi[WS(is, 93)]), ivs, &(xi[WS(is, 1)])); + Tbf = VADD(T39, T3a); + T30 = VSUB(T2Y, T2Z); + TeO = VSUB(Tbe, Tbf); + T3b = VSUB(T39, T3a); + Tbg = VADD(Tbe, Tbf); + } + { + V T2M, Tba, T2P, Tbb; + { + V T2K, T2L, T2N, T2O; + T2K = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T2L = LD(&(xi[WS(is, 85)]), ivs, &(xi[WS(is, 1)])); + T2M = VSUB(T2K, T2L); + Tba = VADD(T2K, T2L); + T2N = LD(&(xi[WS(is, 117)]), ivs, &(xi[WS(is, 1)])); + T2O = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T2P = VSUB(T2N, T2O); + Tbb = VADD(T2N, T2O); + } + T2Q = VADD(T2M, T2P); + TeM = VSUB(Tba, Tbb); + T2V = VSUB(T2M, T2P); + Tbc = VADD(Tba, Tbb); + } + { + V T33, Tbh, T36, Tbi; + { + V T31, T32, T34, T35; + T31 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T32 = LD(&(xi[WS(is, 77)]), ivs, &(xi[WS(is, 1)])); + T33 = VSUB(T31, T32); + Tbh = VADD(T31, T32); + T34 = LD(&(xi[WS(is, 109)]), ivs, &(xi[WS(is, 1)])); + T35 = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T36 = VSUB(T34, T35); + Tbi = VADD(T34, T35); + } + T37 = VADD(T33, T36); + TeP = VSUB(Tbh, Tbi); + T3c = VSUB(T33, T36); + Tbj = VADD(Tbh, Tbi); + } + { + V Tbd, Tbk, TeN, TeQ; + Tbd = VSUB(Tb9, Tbc); + Tbk = VSUB(Tbg, Tbj); + Tbl = VADD(Tbd, Tbk); + Tbu = VSUB(Tbd, Tbk); + { + V Td9, Tda, TeW, TeX; + Td9 = VADD(Tb9, Tbc); + Tda = VADD(Tbg, Tbj); + Tdb = VADD(Td9, Tda); + TdL = VSUB(Td9, Tda); + TeW = VFMA(LDK(KP414213562), TeL, TeM); + TeX = VFNMS(LDK(KP414213562), TeO, TeP); + TeY = VADD(TeW, TeX); + Tgr = VSUB(TeW, TeX); + } + TeN = VFNMS(LDK(KP414213562), TeM, TeL); + TeQ = VFMA(LDK(KP414213562), TeP, TeO); + TeR = VADD(TeN, TeQ); + Tgu = VSUB(TeN, TeQ); + { + V T7t, T7C, T7w, T7D; + { + V T7r, T7s, T7u, T7v; + T7r = VFNMS(LDK(KP707106781), T2Q, T2J); + T7s = VFNMS(LDK(KP707106781), T2V, T2U); + T7t = VFMA(LDK(KP668178637), T7s, T7r); + T7C = VFNMS(LDK(KP668178637), T7r, T7s); + T7u = VFNMS(LDK(KP707106781), T37, T30); + T7v = VFNMS(LDK(KP707106781), T3c, T3b); + T7w = VFNMS(LDK(KP668178637), T7v, T7u); + T7D = VFMA(LDK(KP668178637), T7u, T7v); + } + T7x = VADD(T7t, T7w); + T98 = VSUB(T7t, T7w); + T7E = VADD(T7C, T7D); + T95 = VSUB(T7D, T7C); + } + { + V T2X, T3q, T3e, T3r; + { + V T2R, T2W, T38, T3d; + T2R = VFMA(LDK(KP707106781), T2Q, T2J); + T2W = VFMA(LDK(KP707106781), T2V, T2U); + T2X = VFNMS(LDK(KP198912367), T2W, T2R); + T3q = VFMA(LDK(KP198912367), T2R, T2W); + T38 = VFMA(LDK(KP707106781), T37, T30); + T3d = VFMA(LDK(KP707106781), T3c, T3b); + T3e = VFMA(LDK(KP198912367), T3d, T38); + T3r = VFNMS(LDK(KP198912367), T38, T3d); + } + T3f = VADD(T2X, T3e); + T5Y = VSUB(T2X, T3e); + T3s = VADD(T3q, T3r); + T5V = VSUB(T3q, T3r); + } + } + } + { + V T3Y, Tf6, T49, TbG, T4f, Tf9, T4q, TbN, T45, Tf7, T4a, TbJ, T4m, Tfa, T4r; + V TbQ; + { + V T3W, T3X, TbE, T47, T48, TbF; + T3W = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3X = LD(&(xi[WS(is, 67)]), ivs, &(xi[WS(is, 1)])); + TbE = VADD(T3W, T3X); + T47 = LD(&(xi[WS(is, 99)]), ivs, &(xi[WS(is, 1)])); + T48 = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + TbF = VADD(T48, T47); + T3Y = VSUB(T3W, T3X); + Tf6 = VSUB(TbE, TbF); + T49 = VSUB(T47, T48); + TbG = VADD(TbE, TbF); + } + { + V T4d, T4e, TbL, T4o, T4p, TbM; + T4d = LD(&(xi[WS(is, 123)]), ivs, &(xi[WS(is, 1)])); + T4e = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + TbL = VADD(T4d, T4e); + T4o = LD(&(xi[WS(is, 91)]), ivs, &(xi[WS(is, 1)])); + T4p = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TbM = VADD(T4p, T4o); + T4f = VSUB(T4d, T4e); + Tf9 = VSUB(TbL, TbM); + T4q = VSUB(T4o, T4p); + TbN = VADD(TbL, TbM); + } + { + V T41, TbH, T44, TbI; + { + V T3Z, T40, T42, T43; + T3Z = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T40 = LD(&(xi[WS(is, 83)]), ivs, &(xi[WS(is, 1)])); + T41 = VSUB(T3Z, T40); + TbH = VADD(T3Z, T40); + T42 = LD(&(xi[WS(is, 115)]), ivs, &(xi[WS(is, 1)])); + T43 = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T44 = VSUB(T42, T43); + TbI = VADD(T42, T43); + } + T45 = VADD(T41, T44); + Tf7 = VSUB(TbI, TbH); + T4a = VSUB(T44, T41); + TbJ = VADD(TbH, TbI); + } + { + V T4i, TbO, T4l, TbP; + { + V T4g, T4h, T4j, T4k; + T4g = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T4h = LD(&(xi[WS(is, 75)]), ivs, &(xi[WS(is, 1)])); + T4i = VSUB(T4g, T4h); + TbO = VADD(T4g, T4h); + T4j = LD(&(xi[WS(is, 107)]), ivs, &(xi[WS(is, 1)])); + T4k = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T4l = VSUB(T4j, T4k); + TbP = VADD(T4j, T4k); + } + T4m = VADD(T4i, T4l); + Tfa = VSUB(TbP, TbO); + T4r = VSUB(T4l, T4i); + TbQ = VADD(TbO, TbP); + } + { + V TbK, TbR, Tf8, Tfb; + TbK = VSUB(TbG, TbJ); + TbR = VSUB(TbN, TbQ); + TbS = VADD(TbK, TbR); + Tc1 = VSUB(TbR, TbK); + { + V Tdg, Tdh, Tfh, Tfi; + Tdg = VADD(TbG, TbJ); + Tdh = VADD(TbN, TbQ); + Tdi = VADD(Tdg, Tdh); + TdO = VSUB(Tdh, Tdg); + Tfh = VFNMS(LDK(KP414213562), Tf6, Tf7); + Tfi = VFMA(LDK(KP414213562), Tf9, Tfa); + Tfj = VADD(Tfh, Tfi); + Tgy = VSUB(Tfi, Tfh); + } + Tf8 = VFMA(LDK(KP414213562), Tf7, Tf6); + Tfb = VFNMS(LDK(KP414213562), Tfa, Tf9); + Tfc = VADD(Tf8, Tfb); + TgB = VSUB(Tfb, Tf8); + { + V T7M, T7V, T7P, T7W; + { + V T7K, T7L, T7N, T7O; + T7K = VFNMS(LDK(KP707106781), T45, T3Y); + T7L = VFNMS(LDK(KP707106781), T4a, T49); + T7M = VFNMS(LDK(KP668178637), T7L, T7K); + T7V = VFMA(LDK(KP668178637), T7K, T7L); + T7N = VFNMS(LDK(KP707106781), T4m, T4f); + T7O = VFNMS(LDK(KP707106781), T4r, T4q); + T7P = VFMA(LDK(KP668178637), T7O, T7N); + T7W = VFNMS(LDK(KP668178637), T7N, T7O); + } + T7Q = VADD(T7M, T7P); + T9f = VSUB(T7P, T7M); + T7X = VADD(T7V, T7W); + T9c = VSUB(T7V, T7W); + } + { + V T4c, T4F, T4t, T4G; + { + V T46, T4b, T4n, T4s; + T46 = VFMA(LDK(KP707106781), T45, T3Y); + T4b = VFMA(LDK(KP707106781), T4a, T49); + T4c = VFMA(LDK(KP198912367), T4b, T46); + T4F = VFNMS(LDK(KP198912367), T46, T4b); + T4n = VFMA(LDK(KP707106781), T4m, T4f); + T4s = VFMA(LDK(KP707106781), T4r, T4q); + T4t = VFNMS(LDK(KP198912367), T4s, T4n); + T4G = VFMA(LDK(KP198912367), T4n, T4s); + } + T4u = VADD(T4c, T4t); + T65 = VSUB(T4t, T4c); + T4H = VADD(T4F, T4G); + T62 = VSUB(T4G, T4F); + } + } + } + { + V Td5, Tdx, TdC, TdE, Tdk, Tdt, Tds, Tdy, Tdz, TdD; + { + V Td1, Td4, TdA, TdB; + Td1 = VADD(TcZ, Td0); + Td4 = VADD(Td2, Td3); + Td5 = VSUB(Td1, Td4); + Tdx = VADD(Td1, Td4); + TdA = VADD(Td8, Tdb); + TdB = VADD(Tdf, Tdi); + TdC = VSUB(TdA, TdB); + TdE = VADD(TdA, TdB); + } + { + V Tdc, Tdj, Tdo, Tdr; + Tdc = VSUB(Td8, Tdb); + Tdj = VSUB(Tdf, Tdi); + Tdk = VADD(Tdc, Tdj); + Tdt = VSUB(Tdc, Tdj); + Tdo = VADD(Tdm, Tdn); + Tdr = VADD(Tdp, Tdq); + Tds = VSUB(Tdo, Tdr); + Tdy = VADD(Tdo, Tdr); + } + Tdz = VSUB(Tdx, Tdy); + ST(&(xo[WS(os, 96)]), VFNMSI(TdC, Tdz), ovs, &(xo[0])); + ST(&(xo[WS(os, 32)]), VFMAI(TdC, Tdz), ovs, &(xo[0])); + TdD = VADD(Tdx, Tdy); + ST(&(xo[WS(os, 64)]), VSUB(TdD, TdE), ovs, &(xo[0])); + ST(&(xo[0]), VADD(TdD, TdE), ovs, &(xo[0])); + { + V Tdl, Tdu, Tdv, Tdw; + Tdl = VFNMS(LDK(KP707106781), Tdk, Td5); + Tdu = VFNMS(LDK(KP707106781), Tdt, Tds); + ST(&(xo[WS(os, 48)]), VFNMSI(Tdu, Tdl), ovs, &(xo[0])); + ST(&(xo[WS(os, 80)]), VFMAI(Tdu, Tdl), ovs, &(xo[0])); + Tdv = VFMA(LDK(KP707106781), Tdk, Td5); + Tdw = VFMA(LDK(KP707106781), Tdt, Tds); + ST(&(xo[WS(os, 16)]), VFMAI(Tdw, Tdv), ovs, &(xo[0])); + ST(&(xo[WS(os, 112)]), VFNMSI(Tdw, Tdv), ovs, &(xo[0])); + } + } + { + V TdJ, Te1, TdX, Te2, TdQ, Te5, TdU, Te4; + { + V TdF, TdI, TdV, TdW; + TdF = VSUB(TcZ, Td0); + TdI = VADD(TdG, TdH); + TdJ = VFMA(LDK(KP707106781), TdI, TdF); + Te1 = VFNMS(LDK(KP707106781), TdI, TdF); + TdV = VFMA(LDK(KP414213562), TdK, TdL); + TdW = VFMA(LDK(KP414213562), TdN, TdO); + TdX = VSUB(TdV, TdW); + Te2 = VADD(TdV, TdW); + } + { + V TdM, TdP, TdS, TdT; + TdM = VFNMS(LDK(KP414213562), TdL, TdK); + TdP = VFNMS(LDK(KP414213562), TdO, TdN); + TdQ = VADD(TdM, TdP); + Te5 = VSUB(TdM, TdP); + TdS = VSUB(Td2, Td3); + TdT = VSUB(TdG, TdH); + TdU = VFMA(LDK(KP707106781), TdT, TdS); + Te4 = VFNMS(LDK(KP707106781), TdT, TdS); + } + { + V TdR, TdY, Te7, Te8; + TdR = VFNMS(LDK(KP923879532), TdQ, TdJ); + TdY = VFNMS(LDK(KP923879532), TdX, TdU); + ST(&(xo[WS(os, 56)]), VFNMSI(TdY, TdR), ovs, &(xo[0])); + ST(&(xo[WS(os, 72)]), VFMAI(TdY, TdR), ovs, &(xo[0])); + Te7 = VFMA(LDK(KP923879532), Te2, Te1); + Te8 = VFNMS(LDK(KP923879532), Te5, Te4); + ST(&(xo[WS(os, 24)]), VFNMSI(Te8, Te7), ovs, &(xo[0])); + ST(&(xo[WS(os, 104)]), VFMAI(Te8, Te7), ovs, &(xo[0])); + } + { + V TdZ, Te0, Te3, Te6; + TdZ = VFMA(LDK(KP923879532), TdQ, TdJ); + Te0 = VFMA(LDK(KP923879532), TdX, TdU); + ST(&(xo[WS(os, 120)]), VFNMSI(Te0, TdZ), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFMAI(Te0, TdZ), ovs, &(xo[0])); + Te3 = VFNMS(LDK(KP923879532), Te2, Te1); + Te6 = VFMA(LDK(KP923879532), Te5, Te4); + ST(&(xo[WS(os, 40)]), VFMAI(Te6, Te3), ovs, &(xo[0])); + ST(&(xo[WS(os, 88)]), VFNMSI(Te6, Te3), ovs, &(xo[0])); + } + } + { + V TaZ, Tcp, Tci, Tcs, Tc4, Tct, Tcl, Tcq; + { + V Tat, TaY, Tce, Tch; + Tat = VFMA(LDK(KP707106781), Tas, Tad); + TaY = VADD(TaI, TaX); + TaZ = VFMA(LDK(KP923879532), TaY, Tat); + Tcp = VFNMS(LDK(KP923879532), TaY, Tat); + Tce = VFMA(LDK(KP707106781), Tcd, Tcc); + Tch = VSUB(Tcf, Tcg); + Tci = VFMA(LDK(KP923879532), Tch, Tce); + Tcs = VFNMS(LDK(KP923879532), Tch, Tce); + { + V Tbw, Tcj, Tc3, Tck; + { + V Tbm, Tbv, TbT, Tc2; + Tbm = VFMA(LDK(KP707106781), Tbl, Tb6); + Tbv = VFMA(LDK(KP707106781), Tbu, Tbt); + Tbw = VFNMS(LDK(KP198912367), Tbv, Tbm); + Tcj = VFMA(LDK(KP198912367), Tbm, Tbv); + TbT = VFMA(LDK(KP707106781), TbS, TbD); + Tc2 = VFMA(LDK(KP707106781), Tc1, Tc0); + Tc3 = VFNMS(LDK(KP198912367), Tc2, TbT); + Tck = VFMA(LDK(KP198912367), TbT, Tc2); + } + Tc4 = VADD(Tbw, Tc3); + Tct = VSUB(Tbw, Tc3); + Tcl = VSUB(Tcj, Tck); + Tcq = VADD(Tcj, Tck); + } + } + { + V Tc5, Tcm, Tcv, Tcw; + Tc5 = VFNMS(LDK(KP980785280), Tc4, TaZ); + Tcm = VFNMS(LDK(KP980785280), Tcl, Tci); + ST(&(xo[WS(os, 60)]), VFNMSI(Tcm, Tc5), ovs, &(xo[0])); + ST(&(xo[WS(os, 68)]), VFMAI(Tcm, Tc5), ovs, &(xo[0])); + Tcv = VFMA(LDK(KP980785280), Tcq, Tcp); + Tcw = VFNMS(LDK(KP980785280), Tct, Tcs); + ST(&(xo[WS(os, 28)]), VFNMSI(Tcw, Tcv), ovs, &(xo[0])); + ST(&(xo[WS(os, 100)]), VFMAI(Tcw, Tcv), ovs, &(xo[0])); + } + { + V Tcn, Tco, Tcr, Tcu; + Tcn = VFMA(LDK(KP980785280), Tc4, TaZ); + Tco = VFMA(LDK(KP980785280), Tcl, Tci); + ST(&(xo[WS(os, 124)]), VFNMSI(Tco, Tcn), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(Tco, Tcn), ovs, &(xo[0])); + Tcr = VFNMS(LDK(KP980785280), Tcq, Tcp); + Tcu = VFMA(LDK(KP980785280), Tct, Tcs); + ST(&(xo[WS(os, 36)]), VFMAI(Tcu, Tcr), ovs, &(xo[0])); + ST(&(xo[WS(os, 92)]), VFNMSI(Tcu, Tcr), ovs, &(xo[0])); + } + } + { + V Tcz, TcR, TcK, TcU, TcG, TcV, TcN, TcS; + { + V Tcx, Tcy, TcI, TcJ; + Tcx = VFNMS(LDK(KP707106781), Tas, Tad); + Tcy = VADD(Tcf, Tcg); + Tcz = VFMA(LDK(KP923879532), Tcy, Tcx); + TcR = VFNMS(LDK(KP923879532), Tcy, Tcx); + TcI = VFNMS(LDK(KP707106781), Tcd, Tcc); + TcJ = VSUB(TaI, TaX); + TcK = VFNMS(LDK(KP923879532), TcJ, TcI); + TcU = VFMA(LDK(KP923879532), TcJ, TcI); + { + V TcC, TcL, TcF, TcM; + { + V TcA, TcB, TcD, TcE; + TcA = VFNMS(LDK(KP707106781), Tbl, Tb6); + TcB = VFNMS(LDK(KP707106781), Tbu, Tbt); + TcC = VFMA(LDK(KP668178637), TcB, TcA); + TcL = VFNMS(LDK(KP668178637), TcA, TcB); + TcD = VFNMS(LDK(KP707106781), TbS, TbD); + TcE = VFNMS(LDK(KP707106781), Tc1, Tc0); + TcF = VFMA(LDK(KP668178637), TcE, TcD); + TcM = VFNMS(LDK(KP668178637), TcD, TcE); + } + TcG = VADD(TcC, TcF); + TcV = VSUB(TcC, TcF); + TcN = VSUB(TcL, TcM); + TcS = VADD(TcL, TcM); + } + } + { + V TcH, TcO, TcX, TcY; + TcH = VFNMS(LDK(KP831469612), TcG, Tcz); + TcO = VFNMS(LDK(KP831469612), TcN, TcK); + ST(&(xo[WS(os, 76)]), VFNMSI(TcO, TcH), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VFMAI(TcO, TcH), ovs, &(xo[0])); + TcX = VFNMS(LDK(KP831469612), TcS, TcR); + TcY = VFMA(LDK(KP831469612), TcV, TcU); + ST(&(xo[WS(os, 20)]), VFMAI(TcY, TcX), ovs, &(xo[0])); + ST(&(xo[WS(os, 108)]), VFNMSI(TcY, TcX), ovs, &(xo[0])); + } + { + V TcP, TcQ, TcT, TcW; + TcP = VFMA(LDK(KP831469612), TcG, Tcz); + TcQ = VFMA(LDK(KP831469612), TcN, TcK); + ST(&(xo[WS(os, 12)]), VFNMSI(TcQ, TcP), ovs, &(xo[0])); + ST(&(xo[WS(os, 116)]), VFMAI(TcQ, TcP), ovs, &(xo[0])); + TcT = VFMA(LDK(KP831469612), TcS, TcR); + TcW = VFNMS(LDK(KP831469612), TcV, TcU); + ST(&(xo[WS(os, 44)]), VFNMSI(TcW, TcT), ovs, &(xo[0])); + ST(&(xo[WS(os, 84)]), VFMAI(TcW, TcT), ovs, &(xo[0])); + } + } + { + V TeF, Tga, TfF, Tg0, Tfy, Tg7, TfI, TfP, Tfm, TfJ, TfB, TfG, TfW, Tgb, Tg3; + V Tg8; + { + V Tel, TfY, TeE, TfZ, Teu, TeD; + Tel = VFMA(LDK(KP923879532), Tek, Ted); + TfY = VFNMS(LDK(KP923879532), Tft, Tfq); + Teu = VFNMS(LDK(KP198912367), Tet, Teq); + TeD = VFNMS(LDK(KP198912367), TeC, Tez); + TeE = VADD(Teu, TeD); + TfZ = VSUB(Teu, TeD); + TeF = VFMA(LDK(KP980785280), TeE, Tel); + Tga = VFMA(LDK(KP980785280), TfZ, TfY); + TfF = VFNMS(LDK(KP980785280), TeE, Tel); + Tg0 = VFNMS(LDK(KP980785280), TfZ, TfY); + } + { + V Tfu, TfN, Tfx, TfO, Tfv, Tfw; + Tfu = VFMA(LDK(KP923879532), Tft, Tfq); + TfN = VFNMS(LDK(KP923879532), Tek, Ted); + Tfv = VFMA(LDK(KP198912367), Teq, Tet); + Tfw = VFMA(LDK(KP198912367), Tez, TeC); + Tfx = VSUB(Tfv, Tfw); + TfO = VADD(Tfv, Tfw); + Tfy = VFMA(LDK(KP980785280), Tfx, Tfu); + Tg7 = VFNMS(LDK(KP980785280), TfO, TfN); + TfI = VFNMS(LDK(KP980785280), Tfx, Tfu); + TfP = VFMA(LDK(KP980785280), TfO, TfN); + } + { + V Tf0, Tfz, Tfl, TfA; + { + V TeS, TeZ, Tfd, Tfk; + TeS = VFMA(LDK(KP923879532), TeR, TeK); + TeZ = VFMA(LDK(KP923879532), TeY, TeV); + Tf0 = VFNMS(LDK(KP098491403), TeZ, TeS); + Tfz = VFMA(LDK(KP098491403), TeS, TeZ); + Tfd = VFMA(LDK(KP923879532), Tfc, Tf5); + Tfk = VFMA(LDK(KP923879532), Tfj, Tfg); + Tfl = VFNMS(LDK(KP098491403), Tfk, Tfd); + TfA = VFMA(LDK(KP098491403), Tfd, Tfk); + } + Tfm = VADD(Tf0, Tfl); + TfJ = VSUB(Tf0, Tfl); + TfB = VSUB(Tfz, TfA); + TfG = VADD(Tfz, TfA); + } + { + V TfS, Tg1, TfV, Tg2; + { + V TfQ, TfR, TfT, TfU; + TfQ = VFNMS(LDK(KP923879532), TeR, TeK); + TfR = VFNMS(LDK(KP923879532), TeY, TeV); + TfS = VFMA(LDK(KP820678790), TfR, TfQ); + Tg1 = VFNMS(LDK(KP820678790), TfQ, TfR); + TfT = VFNMS(LDK(KP923879532), Tfc, Tf5); + TfU = VFNMS(LDK(KP923879532), Tfj, Tfg); + TfV = VFMA(LDK(KP820678790), TfU, TfT); + Tg2 = VFNMS(LDK(KP820678790), TfT, TfU); + } + TfW = VADD(TfS, TfV); + Tgb = VSUB(TfS, TfV); + Tg3 = VSUB(Tg1, Tg2); + Tg8 = VADD(Tg1, Tg2); + } + { + V Tfn, TfC, Tg9, Tgc; + Tfn = VFNMS(LDK(KP995184726), Tfm, TeF); + TfC = VFNMS(LDK(KP995184726), TfB, Tfy); + ST(&(xo[WS(os, 62)]), VFNMSI(TfC, Tfn), ovs, &(xo[0])); + ST(&(xo[WS(os, 66)]), VFMAI(TfC, Tfn), ovs, &(xo[0])); + Tg9 = VFMA(LDK(KP773010453), Tg8, Tg7); + Tgc = VFNMS(LDK(KP773010453), Tgb, Tga); + ST(&(xo[WS(os, 46)]), VFNMSI(Tgc, Tg9), ovs, &(xo[0])); + ST(&(xo[WS(os, 82)]), VFMAI(Tgc, Tg9), ovs, &(xo[0])); + } + { + V Tgd, Tge, TfD, TfE; + Tgd = VFNMS(LDK(KP773010453), Tg8, Tg7); + Tge = VFMA(LDK(KP773010453), Tgb, Tga); + ST(&(xo[WS(os, 18)]), VFMAI(Tge, Tgd), ovs, &(xo[0])); + ST(&(xo[WS(os, 110)]), VFNMSI(Tge, Tgd), ovs, &(xo[0])); + TfD = VFMA(LDK(KP995184726), Tfm, TeF); + TfE = VFMA(LDK(KP995184726), TfB, Tfy); + ST(&(xo[WS(os, 126)]), VFNMSI(TfE, TfD), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(TfE, TfD), ovs, &(xo[0])); + } + { + V TfH, TfK, TfX, Tg4; + TfH = VFNMS(LDK(KP995184726), TfG, TfF); + TfK = VFMA(LDK(KP995184726), TfJ, TfI); + ST(&(xo[WS(os, 34)]), VFMAI(TfK, TfH), ovs, &(xo[0])); + ST(&(xo[WS(os, 94)]), VFNMSI(TfK, TfH), ovs, &(xo[0])); + TfX = VFNMS(LDK(KP773010453), TfW, TfP); + Tg4 = VFNMS(LDK(KP773010453), Tg3, Tg0); + ST(&(xo[WS(os, 78)]), VFNMSI(Tg4, TfX), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VFMAI(Tg4, TfX), ovs, &(xo[0])); + } + { + V Tg5, Tg6, TfL, TfM; + Tg5 = VFMA(LDK(KP773010453), TfW, TfP); + Tg6 = VFMA(LDK(KP773010453), Tg3, Tg0); + ST(&(xo[WS(os, 14)]), VFNMSI(Tg6, Tg5), ovs, &(xo[0])); + ST(&(xo[WS(os, 114)]), VFMAI(Tg6, Tg5), ovs, &(xo[0])); + TfL = VFMA(LDK(KP995184726), TfG, TfF); + TfM = VFNMS(LDK(KP995184726), TfJ, TfI); + ST(&(xo[WS(os, 30)]), VFNMSI(TfM, TfL), ovs, &(xo[0])); + ST(&(xo[WS(os, 98)]), VFMAI(TfM, TfL), ovs, &(xo[0])); + } + } + { + V Tgp, Tho, TgT, The, TgM, Thl, TgW, Th3, TgE, TgX, TgP, TgU, Tha, Thp, Thh; + V Thm; + { + V Tgh, Thc, Tgo, Thd, Tgk, Tgn; + Tgh = VFNMS(LDK(KP923879532), Tgg, Tgf); + Thc = VFNMS(LDK(KP923879532), TgH, TgG); + Tgk = VFNMS(LDK(KP668178637), Tgj, Tgi); + Tgn = VFNMS(LDK(KP668178637), Tgm, Tgl); + Tgo = VADD(Tgk, Tgn); + Thd = VSUB(Tgk, Tgn); + Tgp = VFNMS(LDK(KP831469612), Tgo, Tgh); + Tho = VFNMS(LDK(KP831469612), Thd, Thc); + TgT = VFMA(LDK(KP831469612), Tgo, Tgh); + The = VFMA(LDK(KP831469612), Thd, Thc); + } + { + V TgI, Th1, TgL, Th2, TgJ, TgK; + TgI = VFMA(LDK(KP923879532), TgH, TgG); + Th1 = VFMA(LDK(KP923879532), Tgg, Tgf); + TgJ = VFMA(LDK(KP668178637), Tgi, Tgj); + TgK = VFMA(LDK(KP668178637), Tgl, Tgm); + TgL = VSUB(TgJ, TgK); + Th2 = VADD(TgJ, TgK); + TgM = VFMA(LDK(KP831469612), TgL, TgI); + Thl = VFNMS(LDK(KP831469612), Th2, Th1); + TgW = VFNMS(LDK(KP831469612), TgL, TgI); + Th3 = VFMA(LDK(KP831469612), Th2, Th1); + } + { + V Tgw, TgN, TgD, TgO; + { + V Tgs, Tgv, Tgz, TgC; + Tgs = VFNMS(LDK(KP923879532), Tgr, Tgq); + Tgv = VFMA(LDK(KP923879532), Tgu, Tgt); + Tgw = VFNMS(LDK(KP534511135), Tgv, Tgs); + TgN = VFMA(LDK(KP534511135), Tgs, Tgv); + Tgz = VFNMS(LDK(KP923879532), Tgy, Tgx); + TgC = VFMA(LDK(KP923879532), TgB, TgA); + TgD = VFNMS(LDK(KP534511135), TgC, Tgz); + TgO = VFMA(LDK(KP534511135), Tgz, TgC); + } + TgE = VADD(Tgw, TgD); + TgX = VSUB(Tgw, TgD); + TgP = VSUB(TgN, TgO); + TgU = VADD(TgN, TgO); + } + { + V Th6, Thf, Th9, Thg; + { + V Th4, Th5, Th7, Th8; + Th4 = VFMA(LDK(KP923879532), Tgr, Tgq); + Th5 = VFNMS(LDK(KP923879532), Tgu, Tgt); + Th6 = VFMA(LDK(KP303346683), Th5, Th4); + Thf = VFNMS(LDK(KP303346683), Th4, Th5); + Th7 = VFMA(LDK(KP923879532), Tgy, Tgx); + Th8 = VFNMS(LDK(KP923879532), TgB, TgA); + Th9 = VFMA(LDK(KP303346683), Th8, Th7); + Thg = VFNMS(LDK(KP303346683), Th7, Th8); + } + Tha = VADD(Th6, Th9); + Thp = VSUB(Th6, Th9); + Thh = VSUB(Thf, Thg); + Thm = VADD(Thf, Thg); + } + { + V TgF, TgQ, Thn, Thq; + TgF = VFNMS(LDK(KP881921264), TgE, Tgp); + TgQ = VFNMS(LDK(KP881921264), TgP, TgM); + ST(&(xo[WS(os, 54)]), VFNMSI(TgQ, TgF), ovs, &(xo[0])); + ST(&(xo[WS(os, 74)]), VFMAI(TgQ, TgF), ovs, &(xo[0])); + Thn = VFMA(LDK(KP956940335), Thm, Thl); + Thq = VFNMS(LDK(KP956940335), Thp, Tho); + ST(&(xo[WS(os, 38)]), VFNMSI(Thq, Thn), ovs, &(xo[0])); + ST(&(xo[WS(os, 90)]), VFMAI(Thq, Thn), ovs, &(xo[0])); + } + { + V Thr, Ths, TgR, TgS; + Thr = VFNMS(LDK(KP956940335), Thm, Thl); + Ths = VFMA(LDK(KP956940335), Thp, Tho); + ST(&(xo[WS(os, 26)]), VFMAI(Ths, Thr), ovs, &(xo[0])); + ST(&(xo[WS(os, 102)]), VFNMSI(Ths, Thr), ovs, &(xo[0])); + TgR = VFMA(LDK(KP881921264), TgE, Tgp); + TgS = VFMA(LDK(KP881921264), TgP, TgM); + ST(&(xo[WS(os, 118)]), VFNMSI(TgS, TgR), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VFMAI(TgS, TgR), ovs, &(xo[0])); + } + { + V TgV, TgY, Thb, Thi; + TgV = VFNMS(LDK(KP881921264), TgU, TgT); + TgY = VFMA(LDK(KP881921264), TgX, TgW); + ST(&(xo[WS(os, 42)]), VFMAI(TgY, TgV), ovs, &(xo[0])); + ST(&(xo[WS(os, 86)]), VFNMSI(TgY, TgV), ovs, &(xo[0])); + Thb = VFNMS(LDK(KP956940335), Tha, Th3); + Thi = VFNMS(LDK(KP956940335), Thh, The); + ST(&(xo[WS(os, 70)]), VFNMSI(Thi, Thb), ovs, &(xo[0])); + ST(&(xo[WS(os, 58)]), VFMAI(Thi, Thb), ovs, &(xo[0])); + } + { + V Thj, Thk, TgZ, Th0; + Thj = VFMA(LDK(KP956940335), Tha, Th3); + Thk = VFMA(LDK(KP956940335), Thh, The); + ST(&(xo[WS(os, 6)]), VFNMSI(Thk, Thj), ovs, &(xo[0])); + ST(&(xo[WS(os, 122)]), VFMAI(Thk, Thj), ovs, &(xo[0])); + TgZ = VFMA(LDK(KP881921264), TgU, TgT); + Th0 = VFNMS(LDK(KP881921264), TgX, TgW); + ST(&(xo[WS(os, 22)]), VFNMSI(Th0, TgZ), ovs, &(xo[0])); + ST(&(xo[WS(os, 106)]), VFMAI(Th0, TgZ), ovs, &(xo[0])); + } + } + { + V T80, T8n, T8f, T8k, T8A, T8P, T8H, T8M, T7n, T8L, T8O, T8c, T8j, T8t, T8E; + V T8m; + { + V T7G, T8d, T7Z, T8e; + { + V T7y, T7F, T7R, T7Y; + T7y = VFMA(LDK(KP831469612), T7x, T7q); + T7F = VFMA(LDK(KP831469612), T7E, T7B); + T7G = VFMA(LDK(KP148335987), T7F, T7y); + T8d = VFNMS(LDK(KP148335987), T7y, T7F); + T7R = VFMA(LDK(KP831469612), T7Q, T7J); + T7Y = VFMA(LDK(KP831469612), T7X, T7U); + T7Z = VFMA(LDK(KP148335987), T7Y, T7R); + T8e = VFNMS(LDK(KP148335987), T7R, T7Y); + } + T80 = VADD(T7G, T7Z); + T8n = VSUB(T7G, T7Z); + T8f = VSUB(T8d, T8e); + T8k = VADD(T8d, T8e); + } + { + V T8w, T8F, T8z, T8G; + { + V T8u, T8v, T8x, T8y; + T8u = VFNMS(LDK(KP831469612), T7x, T7q); + T8v = VFNMS(LDK(KP831469612), T7E, T7B); + T8w = VFNMS(LDK(KP741650546), T8v, T8u); + T8F = VFMA(LDK(KP741650546), T8u, T8v); + T8x = VFNMS(LDK(KP831469612), T7Q, T7J); + T8y = VFNMS(LDK(KP831469612), T7X, T7U); + T8z = VFNMS(LDK(KP741650546), T8y, T8x); + T8G = VFMA(LDK(KP741650546), T8x, T8y); + } + T8A = VADD(T8w, T8z); + T8P = VSUB(T8w, T8z); + T8H = VSUB(T8F, T8G); + T8M = VADD(T8F, T8G); + } + { + V T77, T8r, T88, T8C, T7m, T8D, T8b, T8s, T76, T87; + T76 = VADD(T72, T75); + T77 = VFMA(LDK(KP831469612), T76, T6Z); + T8r = VFNMS(LDK(KP831469612), T76, T6Z); + T87 = VSUB(T85, T86); + T88 = VFMA(LDK(KP831469612), T87, T84); + T8C = VFNMS(LDK(KP831469612), T87, T84); + { + V T7e, T7l, T89, T8a; + T7e = VFMA(LDK(KP303346683), T7d, T7a); + T7l = VFMA(LDK(KP303346683), T7k, T7h); + T7m = VADD(T7e, T7l); + T8D = VSUB(T7e, T7l); + T89 = VFNMS(LDK(KP303346683), T7a, T7d); + T8a = VFNMS(LDK(KP303346683), T7h, T7k); + T8b = VSUB(T89, T8a); + T8s = VADD(T89, T8a); + } + T7n = VFMA(LDK(KP956940335), T7m, T77); + T8L = VFMA(LDK(KP956940335), T8s, T8r); + T8O = VFNMS(LDK(KP956940335), T8D, T8C); + T8c = VFMA(LDK(KP956940335), T8b, T88); + T8j = VFNMS(LDK(KP956940335), T7m, T77); + T8t = VFNMS(LDK(KP956940335), T8s, T8r); + T8E = VFMA(LDK(KP956940335), T8D, T8C); + T8m = VFNMS(LDK(KP956940335), T8b, T88); + } + { + V T81, T8g, T8N, T8Q; + T81 = VFNMS(LDK(KP989176509), T80, T7n); + T8g = VFNMS(LDK(KP989176509), T8f, T8c); + ST(&(xo[WS(os, 67)]), VFNMSI(T8g, T81), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 61)]), VFMAI(T8g, T81), ovs, &(xo[WS(os, 1)])); + T8N = VFNMS(LDK(KP803207531), T8M, T8L); + T8Q = VFMA(LDK(KP803207531), T8P, T8O); + ST(&(xo[WS(os, 45)]), VFMAI(T8Q, T8N), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 83)]), VFNMSI(T8Q, T8N), ovs, &(xo[WS(os, 1)])); + } + { + V T8R, T8S, T8h, T8i; + T8R = VFMA(LDK(KP803207531), T8M, T8L); + T8S = VFNMS(LDK(KP803207531), T8P, T8O); + ST(&(xo[WS(os, 19)]), VFNMSI(T8S, T8R), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 109)]), VFMAI(T8S, T8R), ovs, &(xo[WS(os, 1)])); + T8h = VFMA(LDK(KP989176509), T80, T7n); + T8i = VFMA(LDK(KP989176509), T8f, T8c); + ST(&(xo[WS(os, 3)]), VFNMSI(T8i, T8h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 125)]), VFMAI(T8i, T8h), ovs, &(xo[WS(os, 1)])); + } + { + V T8l, T8o, T8B, T8I; + T8l = VFMA(LDK(KP989176509), T8k, T8j); + T8o = VFNMS(LDK(KP989176509), T8n, T8m); + ST(&(xo[WS(os, 35)]), VFNMSI(T8o, T8l), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 93)]), VFMAI(T8o, T8l), ovs, &(xo[WS(os, 1)])); + T8B = VFNMS(LDK(KP803207531), T8A, T8t); + T8I = VFNMS(LDK(KP803207531), T8H, T8E); + ST(&(xo[WS(os, 51)]), VFNMSI(T8I, T8B), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 77)]), VFMAI(T8I, T8B), ovs, &(xo[WS(os, 1)])); + } + { + V T8J, T8K, T8p, T8q; + T8J = VFMA(LDK(KP803207531), T8A, T8t); + T8K = VFMA(LDK(KP803207531), T8H, T8E); + ST(&(xo[WS(os, 115)]), VFNMSI(T8K, T8J), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VFMAI(T8K, T8J), ovs, &(xo[WS(os, 1)])); + T8p = VFNMS(LDK(KP989176509), T8k, T8j); + T8q = VFMA(LDK(KP989176509), T8n, T8m); + ST(&(xo[WS(os, 29)]), VFMAI(T8q, T8p), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 99)]), VFNMSI(T8q, T8p), ovs, &(xo[WS(os, 1)])); + } + } + { + V T4K, T5d, T55, T5a, T5q, T5F, T5x, T5C, T2f, T5B, T5E, T52, T59, T5j, T5u; + V T5c; + { + V T3u, T53, T4J, T54; + { + V T3g, T3t, T4v, T4I; + T3g = VFMA(LDK(KP980785280), T3f, T2G); + T3t = VFMA(LDK(KP980785280), T3s, T3p); + T3u = VFNMS(LDK(KP049126849), T3t, T3g); + T53 = VFMA(LDK(KP049126849), T3g, T3t); + T4v = VFMA(LDK(KP980785280), T4u, T3V); + T4I = VFMA(LDK(KP980785280), T4H, T4E); + T4J = VFNMS(LDK(KP049126849), T4I, T4v); + T54 = VFMA(LDK(KP049126849), T4v, T4I); + } + T4K = VADD(T3u, T4J); + T5d = VSUB(T3u, T4J); + T55 = VSUB(T53, T54); + T5a = VADD(T53, T54); + } + { + V T5m, T5v, T5p, T5w; + { + V T5k, T5l, T5n, T5o; + T5k = VFNMS(LDK(KP980785280), T3f, T2G); + T5l = VFNMS(LDK(KP980785280), T3s, T3p); + T5m = VFMA(LDK(KP906347169), T5l, T5k); + T5v = VFNMS(LDK(KP906347169), T5k, T5l); + T5n = VFNMS(LDK(KP980785280), T4u, T3V); + T5o = VFNMS(LDK(KP980785280), T4H, T4E); + T5p = VFMA(LDK(KP906347169), T5o, T5n); + T5w = VFNMS(LDK(KP906347169), T5n, T5o); + } + T5q = VADD(T5m, T5p); + T5F = VSUB(T5m, T5p); + T5x = VSUB(T5v, T5w); + T5C = VADD(T5v, T5w); + } + { + V T11, T5h, T4Y, T5s, T2e, T5t, T51, T5i, T10, T4X; + T10 = VADD(TI, TZ); + T11 = VFMA(LDK(KP980785280), T10, Tr); + T5h = VFNMS(LDK(KP980785280), T10, Tr); + T4X = VSUB(T4V, T4W); + T4Y = VFMA(LDK(KP980785280), T4X, T4U); + T5s = VFNMS(LDK(KP980785280), T4X, T4U); + { + V T1C, T2d, T4Z, T50; + T1C = VFNMS(LDK(KP098491403), T1B, T1s); + T2d = VFNMS(LDK(KP098491403), T2c, T23); + T2e = VADD(T1C, T2d); + T5t = VSUB(T1C, T2d); + T4Z = VFMA(LDK(KP098491403), T1s, T1B); + T50 = VFMA(LDK(KP098491403), T23, T2c); + T51 = VSUB(T4Z, T50); + T5i = VADD(T4Z, T50); + } + T2f = VFMA(LDK(KP995184726), T2e, T11); + T5B = VFNMS(LDK(KP995184726), T5i, T5h); + T5E = VFMA(LDK(KP995184726), T5t, T5s); + T52 = VFMA(LDK(KP995184726), T51, T4Y); + T59 = VFNMS(LDK(KP995184726), T2e, T11); + T5j = VFMA(LDK(KP995184726), T5i, T5h); + T5u = VFNMS(LDK(KP995184726), T5t, T5s); + T5c = VFNMS(LDK(KP995184726), T51, T4Y); + } + { + V T4L, T56, T5D, T5G; + T4L = VFNMS(LDK(KP998795456), T4K, T2f); + T56 = VFNMS(LDK(KP998795456), T55, T52); + ST(&(xo[WS(os, 63)]), VFNMSI(T56, T4L), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 65)]), VFMAI(T56, T4L), ovs, &(xo[WS(os, 1)])); + T5D = VFMA(LDK(KP740951125), T5C, T5B); + T5G = VFNMS(LDK(KP740951125), T5F, T5E); + ST(&(xo[WS(os, 47)]), VFNMSI(T5G, T5D), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 81)]), VFMAI(T5G, T5D), ovs, &(xo[WS(os, 1)])); + } + { + V T5H, T5I, T57, T58; + T5H = VFNMS(LDK(KP740951125), T5C, T5B); + T5I = VFMA(LDK(KP740951125), T5F, T5E); + ST(&(xo[WS(os, 17)]), VFMAI(T5I, T5H), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 111)]), VFNMSI(T5I, T5H), ovs, &(xo[WS(os, 1)])); + T57 = VFMA(LDK(KP998795456), T4K, T2f); + T58 = VFMA(LDK(KP998795456), T55, T52); + ST(&(xo[WS(os, 127)]), VFNMSI(T58, T57), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(T58, T57), ovs, &(xo[WS(os, 1)])); + } + { + V T5b, T5e, T5r, T5y; + T5b = VFNMS(LDK(KP998795456), T5a, T59); + T5e = VFMA(LDK(KP998795456), T5d, T5c); + ST(&(xo[WS(os, 33)]), VFMAI(T5e, T5b), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 95)]), VFNMSI(T5e, T5b), ovs, &(xo[WS(os, 1)])); + T5r = VFNMS(LDK(KP740951125), T5q, T5j); + T5y = VFNMS(LDK(KP740951125), T5x, T5u); + ST(&(xo[WS(os, 79)]), VFNMSI(T5y, T5r), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 49)]), VFMAI(T5y, T5r), ovs, &(xo[WS(os, 1)])); + } + { + V T5z, T5A, T5f, T5g; + T5z = VFMA(LDK(KP740951125), T5q, T5j); + T5A = VFMA(LDK(KP740951125), T5x, T5u); + ST(&(xo[WS(os, 15)]), VFNMSI(T5A, T5z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 113)]), VFMAI(T5A, T5z), ovs, &(xo[WS(os, 1)])); + T5f = VFMA(LDK(KP998795456), T5a, T59); + T5g = VFNMS(LDK(KP998795456), T5d, T5c); + ST(&(xo[WS(os, 31)]), VFNMSI(T5g, T5f), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 97)]), VFMAI(T5g, T5f), ovs, &(xo[WS(os, 1)])); + } + } + { + V T9i, T9B, T9t, T9y, T9O, Ta3, T9V, Ta0, T93, T9Z, Ta2, T9q, T9x, T9H, T9S; + V T9A; + { + V T9a, T9r, T9h, T9s; + { + V T96, T99, T9d, T9g; + T96 = VFNMS(LDK(KP831469612), T95, T94); + T99 = VFNMS(LDK(KP831469612), T98, T97); + T9a = VFMA(LDK(KP599376933), T99, T96); + T9r = VFNMS(LDK(KP599376933), T96, T99); + T9d = VFNMS(LDK(KP831469612), T9c, T9b); + T9g = VFNMS(LDK(KP831469612), T9f, T9e); + T9h = VFMA(LDK(KP599376933), T9g, T9d); + T9s = VFNMS(LDK(KP599376933), T9d, T9g); + } + T9i = VADD(T9a, T9h); + T9B = VSUB(T9a, T9h); + T9t = VSUB(T9r, T9s); + T9y = VADD(T9r, T9s); + } + { + V T9K, T9T, T9N, T9U; + { + V T9I, T9J, T9L, T9M; + T9I = VFMA(LDK(KP831469612), T95, T94); + T9J = VFMA(LDK(KP831469612), T98, T97); + T9K = VFNMS(LDK(KP250486960), T9J, T9I); + T9T = VFMA(LDK(KP250486960), T9I, T9J); + T9L = VFMA(LDK(KP831469612), T9c, T9b); + T9M = VFMA(LDK(KP831469612), T9f, T9e); + T9N = VFNMS(LDK(KP250486960), T9M, T9L); + T9U = VFMA(LDK(KP250486960), T9L, T9M); + } + T9O = VADD(T9K, T9N); + Ta3 = VSUB(T9K, T9N); + T9V = VSUB(T9T, T9U); + Ta0 = VADD(T9T, T9U); + } + { + V T8V, T9F, T9m, T9Q, T92, T9R, T9p, T9G, T8U, T9l; + T8U = VADD(T85, T86); + T8V = VFMA(LDK(KP831469612), T8U, T8T); + T9F = VFNMS(LDK(KP831469612), T8U, T8T); + T9l = VSUB(T72, T75); + T9m = VFNMS(LDK(KP831469612), T9l, T9k); + T9Q = VFMA(LDK(KP831469612), T9l, T9k); + { + V T8Y, T91, T9n, T9o; + T8Y = VFMA(LDK(KP534511135), T8X, T8W); + T91 = VFMA(LDK(KP534511135), T90, T8Z); + T92 = VADD(T8Y, T91); + T9R = VSUB(T8Y, T91); + T9n = VFNMS(LDK(KP534511135), T8W, T8X); + T9o = VFNMS(LDK(KP534511135), T8Z, T90); + T9p = VSUB(T9n, T9o); + T9G = VADD(T9n, T9o); + } + T93 = VFMA(LDK(KP881921264), T92, T8V); + T9Z = VFNMS(LDK(KP881921264), T9G, T9F); + Ta2 = VFNMS(LDK(KP881921264), T9R, T9Q); + T9q = VFNMS(LDK(KP881921264), T9p, T9m); + T9x = VFNMS(LDK(KP881921264), T92, T8V); + T9H = VFMA(LDK(KP881921264), T9G, T9F); + T9S = VFMA(LDK(KP881921264), T9R, T9Q); + T9A = VFMA(LDK(KP881921264), T9p, T9m); + } + { + V T9j, T9u, Ta1, Ta4; + T9j = VFNMS(LDK(KP857728610), T9i, T93); + T9u = VFNMS(LDK(KP857728610), T9t, T9q); + ST(&(xo[WS(os, 75)]), VFNMSI(T9u, T9j), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 53)]), VFMAI(T9u, T9j), ovs, &(xo[WS(os, 1)])); + Ta1 = VFNMS(LDK(KP970031253), Ta0, T9Z); + Ta4 = VFMA(LDK(KP970031253), Ta3, Ta2); + ST(&(xo[WS(os, 37)]), VFMAI(Ta4, Ta1), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 91)]), VFNMSI(Ta4, Ta1), ovs, &(xo[WS(os, 1)])); + } + { + V Ta5, Ta6, T9v, T9w; + Ta5 = VFMA(LDK(KP970031253), Ta0, T9Z); + Ta6 = VFNMS(LDK(KP970031253), Ta3, Ta2); + ST(&(xo[WS(os, 27)]), VFNMSI(Ta6, Ta5), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 101)]), VFMAI(Ta6, Ta5), ovs, &(xo[WS(os, 1)])); + T9v = VFMA(LDK(KP857728610), T9i, T93); + T9w = VFMA(LDK(KP857728610), T9t, T9q); + ST(&(xo[WS(os, 11)]), VFNMSI(T9w, T9v), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 117)]), VFMAI(T9w, T9v), ovs, &(xo[WS(os, 1)])); + } + { + V T9z, T9C, T9P, T9W; + T9z = VFMA(LDK(KP857728610), T9y, T9x); + T9C = VFNMS(LDK(KP857728610), T9B, T9A); + ST(&(xo[WS(os, 43)]), VFNMSI(T9C, T9z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 85)]), VFMAI(T9C, T9z), ovs, &(xo[WS(os, 1)])); + T9P = VFNMS(LDK(KP970031253), T9O, T9H); + T9W = VFNMS(LDK(KP970031253), T9V, T9S); + ST(&(xo[WS(os, 59)]), VFNMSI(T9W, T9P), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 69)]), VFMAI(T9W, T9P), ovs, &(xo[WS(os, 1)])); + } + { + V T9X, T9Y, T9D, T9E; + T9X = VFMA(LDK(KP970031253), T9O, T9H); + T9Y = VFMA(LDK(KP970031253), T9V, T9S); + ST(&(xo[WS(os, 123)]), VFNMSI(T9Y, T9X), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFMAI(T9Y, T9X), ovs, &(xo[WS(os, 1)])); + T9D = VFNMS(LDK(KP857728610), T9y, T9x); + T9E = VFMA(LDK(KP857728610), T9B, T9A); + ST(&(xo[WS(os, 21)]), VFMAI(T9E, T9D), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 107)]), VFNMSI(T9E, T9D), ovs, &(xo[WS(os, 1)])); + } + } + { + V T68, T6r, T6j, T6o, T6E, T6T, T6L, T6Q, T5T, T6P, T6S, T6g, T6n, T6x, T6I; + V T6q; + { + V T60, T6h, T67, T6i; + { + V T5W, T5Z, T63, T66; + T5W = VFNMS(LDK(KP980785280), T5V, T5U); + T5Z = VFMA(LDK(KP980785280), T5Y, T5X); + T60 = VFNMS(LDK(KP472964775), T5Z, T5W); + T6h = VFMA(LDK(KP472964775), T5W, T5Z); + T63 = VFNMS(LDK(KP980785280), T62, T61); + T66 = VFMA(LDK(KP980785280), T65, T64); + T67 = VFNMS(LDK(KP472964775), T66, T63); + T6i = VFMA(LDK(KP472964775), T63, T66); + } + T68 = VADD(T60, T67); + T6r = VSUB(T60, T67); + T6j = VSUB(T6h, T6i); + T6o = VADD(T6h, T6i); + } + { + V T6A, T6J, T6D, T6K; + { + V T6y, T6z, T6B, T6C; + T6y = VFMA(LDK(KP980785280), T5V, T5U); + T6z = VFNMS(LDK(KP980785280), T5Y, T5X); + T6A = VFMA(LDK(KP357805721), T6z, T6y); + T6J = VFNMS(LDK(KP357805721), T6y, T6z); + T6B = VFMA(LDK(KP980785280), T62, T61); + T6C = VFNMS(LDK(KP980785280), T65, T64); + T6D = VFMA(LDK(KP357805721), T6C, T6B); + T6K = VFNMS(LDK(KP357805721), T6B, T6C); + } + T6E = VADD(T6A, T6D); + T6T = VSUB(T6A, T6D); + T6L = VSUB(T6J, T6K); + T6Q = VADD(T6J, T6K); + } + { + V T5L, T6v, T6c, T6G, T5S, T6H, T6f, T6w, T5K, T6b; + T5K = VADD(T4V, T4W); + T5L = VFNMS(LDK(KP980785280), T5K, T5J); + T6v = VFMA(LDK(KP980785280), T5K, T5J); + T6b = VSUB(TI, TZ); + T6c = VFMA(LDK(KP980785280), T6b, T6a); + T6G = VFNMS(LDK(KP980785280), T6b, T6a); + { + V T5O, T5R, T6d, T6e; + T5O = VFNMS(LDK(KP820678790), T5N, T5M); + T5R = VFNMS(LDK(KP820678790), T5Q, T5P); + T5S = VADD(T5O, T5R); + T6H = VSUB(T5O, T5R); + T6d = VFMA(LDK(KP820678790), T5M, T5N); + T6e = VFMA(LDK(KP820678790), T5P, T5Q); + T6f = VSUB(T6d, T6e); + T6w = VADD(T6d, T6e); + } + T5T = VFNMS(LDK(KP773010453), T5S, T5L); + T6P = VFNMS(LDK(KP773010453), T6w, T6v); + T6S = VFNMS(LDK(KP773010453), T6H, T6G); + T6g = VFMA(LDK(KP773010453), T6f, T6c); + T6n = VFMA(LDK(KP773010453), T5S, T5L); + T6x = VFMA(LDK(KP773010453), T6w, T6v); + T6I = VFMA(LDK(KP773010453), T6H, T6G); + T6q = VFNMS(LDK(KP773010453), T6f, T6c); + } + { + V T69, T6k, T6R, T6U; + T69 = VFNMS(LDK(KP903989293), T68, T5T); + T6k = VFNMS(LDK(KP903989293), T6j, T6g); + ST(&(xo[WS(os, 55)]), VFNMSI(T6k, T69), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 73)]), VFMAI(T6k, T69), ovs, &(xo[WS(os, 1)])); + T6R = VFMA(LDK(KP941544065), T6Q, T6P); + T6U = VFNMS(LDK(KP941544065), T6T, T6S); + ST(&(xo[WS(os, 39)]), VFNMSI(T6U, T6R), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 89)]), VFMAI(T6U, T6R), ovs, &(xo[WS(os, 1)])); + } + { + V T6V, T6W, T6l, T6m; + T6V = VFNMS(LDK(KP941544065), T6Q, T6P); + T6W = VFMA(LDK(KP941544065), T6T, T6S); + ST(&(xo[WS(os, 25)]), VFMAI(T6W, T6V), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 103)]), VFNMSI(T6W, T6V), ovs, &(xo[WS(os, 1)])); + T6l = VFMA(LDK(KP903989293), T68, T5T); + T6m = VFMA(LDK(KP903989293), T6j, T6g); + ST(&(xo[WS(os, 119)]), VFNMSI(T6m, T6l), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(T6m, T6l), ovs, &(xo[WS(os, 1)])); + } + { + V T6p, T6s, T6F, T6M; + T6p = VFNMS(LDK(KP903989293), T6o, T6n); + T6s = VFMA(LDK(KP903989293), T6r, T6q); + ST(&(xo[WS(os, 41)]), VFMAI(T6s, T6p), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 87)]), VFNMSI(T6s, T6p), ovs, &(xo[WS(os, 1)])); + T6F = VFNMS(LDK(KP941544065), T6E, T6x); + T6M = VFNMS(LDK(KP941544065), T6L, T6I); + ST(&(xo[WS(os, 71)]), VFNMSI(T6M, T6F), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 57)]), VFMAI(T6M, T6F), ovs, &(xo[WS(os, 1)])); + } + { + V T6N, T6O, T6t, T6u; + T6N = VFMA(LDK(KP941544065), T6E, T6x); + T6O = VFMA(LDK(KP941544065), T6L, T6I); + ST(&(xo[WS(os, 7)]), VFNMSI(T6O, T6N), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 121)]), VFMAI(T6O, T6N), ovs, &(xo[WS(os, 1)])); + T6t = VFMA(LDK(KP903989293), T6o, T6n); + T6u = VFNMS(LDK(KP903989293), T6r, T6q); + ST(&(xo[WS(os, 23)]), VFNMSI(T6u, T6t), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 105)]), VFMAI(T6u, T6t), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 128, XSIMD_STRING("n1bv_128"), {440, 0, 642, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_128) (planner *p) { + X(kdft_register) (p, n1bv_128, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 128 -name n1bv_128 -include dft/simd/n1b.h */ + +/* + * This function contains 1082 FP additions, 330 FP multiplications, + * (or, 938 additions, 186 multiplications, 144 fused multiply/add), + * 194 stack variables, 31 constants, and 256 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_128(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP146730474, +0.146730474455361751658850129646717819706215317); + DVK(KP989176509, +0.989176509964780973451673738016243063983689533); + DVK(KP595699304, +0.595699304492433343467036528829969889511926338); + DVK(KP803207531, +0.803207531480644909806676512963141923879569427); + DVK(KP049067674, +0.049067674327418014254954976942682658314745363); + DVK(KP998795456, +0.998795456205172392714771604759100694443203615); + DVK(KP671558954, +0.671558954847018400625376850427421803228750632); + DVK(KP740951125, +0.740951125354959091175616897495162729728955309); + DVK(KP514102744, +0.514102744193221726593693838968815772608049120); + DVK(KP857728610, +0.857728610000272069902269984284770137042490799); + DVK(KP242980179, +0.242980179903263889948274162077471118320990783); + DVK(KP970031253, +0.970031253194543992603984207286100251456865962); + DVK(KP427555093, +0.427555093430282094320966856888798534304578629); + DVK(KP903989293, +0.903989293123443331586200297230537048710132025); + DVK(KP336889853, +0.336889853392220050689253212619147570477766780); + DVK(KP941544065, +0.941544065183020778412509402599502357185589796); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + V T49, T6e, Tev, TgK, TfA, TgL, T4U, T5J, T7R, T9o, Tah, TdG, Tcw, TdB, T84; + V T8T, Tfk, Tfo, T1G, T64, Tgs, Th6, T2p, T62, T7t, T9c, Tce, Tdm, T7i, T9e; + V Tc8, Tdp, TgF, TgG, T4q, T4V, TeC, Tfx, T4H, T4W, T7X, T86, Tcr, TdH, T7U; + V T85, Taw, TdC, Tf3, Tf7, Tr, T5X, Tgl, Th3, T1a, T5V, T7a, T95, TbD, Tdf; + V T6Z, T97, Tbx, Tdi, Tgy, Tgz, TgA, TaN, Tdv, TeK, Tfu, T2W, T5M, T35, T5N; + V T7F, T8X, TaI, Tdu, T7C, T8W, TgB, TgC, TgD, Tb4, Tdy, TeR, Tfv, T3x, T5P; + V T3G, T5Q, T7M, T90, TaZ, Tdx, T7J, T8Z, Tbm, Tdg, TbG, Tdj, Tgo, Th4, Tf0; + V Tf8, T76, T98, T7d, T94, T10, T5Y, T1d, T5U, TbX, Tdn, Tch, Tdq, Tgv, Th7; + V Tfh, Tfp, T7p, T9f, T7w, T9b, T2f, T65, T2s, T61; + { + V T47, Ta8, T4O, Ta7, T44, Tcu, T4P, Tct, Taa, Tab, T3P, Tac, T4R, Tad, Tae; + V T3W, Taf, T4S; + { + V T45, T46, T4M, T4N; + T45 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T46 = LD(&(xi[WS(is, 96)]), ivs, &(xi[0])); + T47 = VSUB(T45, T46); + Ta8 = VADD(T45, T46); + T4M = LD(&(xi[0]), ivs, &(xi[0])); + T4N = LD(&(xi[WS(is, 64)]), ivs, &(xi[0])); + T4O = VSUB(T4M, T4N); + Ta7 = VADD(T4M, T4N); + } + { + V T3Y, T3Z, T40, T41, T42, T43; + T3Y = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3Z = LD(&(xi[WS(is, 80)]), ivs, &(xi[0])); + T40 = VSUB(T3Y, T3Z); + T41 = LD(&(xi[WS(is, 112)]), ivs, &(xi[0])); + T42 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T43 = VSUB(T41, T42); + T44 = VMUL(LDK(KP707106781), VSUB(T40, T43)); + Tcu = VADD(T41, T42); + T4P = VMUL(LDK(KP707106781), VADD(T40, T43)); + Tct = VADD(T3Y, T3Z); + } + { + V T3L, T3O, T3S, T3V; + { + V T3J, T3K, T3M, T3N; + T3J = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T3K = LD(&(xi[WS(is, 72)]), ivs, &(xi[0])); + T3L = VSUB(T3J, T3K); + Taa = VADD(T3J, T3K); + T3M = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T3N = LD(&(xi[WS(is, 104)]), ivs, &(xi[0])); + T3O = VSUB(T3M, T3N); + Tab = VADD(T3M, T3N); + } + T3P = VFNMS(LDK(KP382683432), T3O, VMUL(LDK(KP923879532), T3L)); + Tac = VSUB(Taa, Tab); + T4R = VFMA(LDK(KP382683432), T3L, VMUL(LDK(KP923879532), T3O)); + { + V T3Q, T3R, T3T, T3U; + T3Q = LD(&(xi[WS(is, 120)]), ivs, &(xi[0])); + T3R = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T3S = VSUB(T3Q, T3R); + Tad = VADD(T3Q, T3R); + T3T = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T3U = LD(&(xi[WS(is, 88)]), ivs, &(xi[0])); + T3V = VSUB(T3T, T3U); + Tae = VADD(T3T, T3U); + } + T3W = VFMA(LDK(KP923879532), T3S, VMUL(LDK(KP382683432), T3V)); + Taf = VSUB(Tad, Tae); + T4S = VFNMS(LDK(KP382683432), T3S, VMUL(LDK(KP923879532), T3V)); + } + { + V T3X, T48, Tet, Teu; + T3X = VSUB(T3P, T3W); + T48 = VSUB(T44, T47); + T49 = VSUB(T3X, T48); + T6e = VADD(T48, T3X); + Tet = VADD(Ta7, Ta8); + Teu = VADD(Tct, Tcu); + Tev = VSUB(Tet, Teu); + TgK = VADD(Tet, Teu); + } + { + V Tfy, Tfz, T4Q, T4T; + Tfy = VADD(Taa, Tab); + Tfz = VADD(Tad, Tae); + TfA = VSUB(Tfy, Tfz); + TgL = VADD(Tfy, Tfz); + T4Q = VSUB(T4O, T4P); + T4T = VSUB(T4R, T4S); + T4U = VSUB(T4Q, T4T); + T5J = VADD(T4Q, T4T); + } + { + V T7P, T7Q, Ta9, Tag; + T7P = VADD(T4R, T4S); + T7Q = VADD(T47, T44); + T7R = VSUB(T7P, T7Q); + T9o = VADD(T7Q, T7P); + Ta9 = VSUB(Ta7, Ta8); + Tag = VMUL(LDK(KP707106781), VADD(Tac, Taf)); + Tah = VSUB(Ta9, Tag); + TdG = VADD(Ta9, Tag); + } + { + V Tcs, Tcv, T82, T83; + Tcs = VMUL(LDK(KP707106781), VSUB(Tac, Taf)); + Tcv = VSUB(Tct, Tcu); + Tcw = VSUB(Tcs, Tcv); + TdB = VADD(Tcv, Tcs); + T82 = VADD(T4O, T4P); + T83 = VADD(T3P, T3W); + T84 = VSUB(T82, T83); + T8T = VADD(T82, T83); + } + } + { + V Tca, Tcb, T1i, Tfm, T2n, Tc5, Tc6, T1p, Tfn, T2k, T1x, Tfi, T2h, Tc0, T1E; + V Tfj, T2i, Tc3, T1l, T1o, Tcc, Tcd; + { + V T1g, T1h, T2l, T2m; + T1g = LD(&(xi[WS(is, 127)]), ivs, &(xi[WS(is, 1)])); + T1h = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + Tca = VADD(T1g, T1h); + T2l = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T2m = LD(&(xi[WS(is, 95)]), ivs, &(xi[WS(is, 1)])); + Tcb = VADD(T2l, T2m); + T1i = VSUB(T1g, T1h); + Tfm = VADD(Tca, Tcb); + T2n = VSUB(T2l, T2m); + } + { + V T1j, T1k, T1m, T1n; + T1j = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1k = LD(&(xi[WS(is, 79)]), ivs, &(xi[WS(is, 1)])); + T1l = VSUB(T1j, T1k); + Tc5 = VADD(T1j, T1k); + T1m = LD(&(xi[WS(is, 111)]), ivs, &(xi[WS(is, 1)])); + T1n = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T1o = VSUB(T1m, T1n); + Tc6 = VADD(T1m, T1n); + } + T1p = VMUL(LDK(KP707106781), VADD(T1l, T1o)); + Tfn = VADD(Tc5, Tc6); + T2k = VMUL(LDK(KP707106781), VSUB(T1l, T1o)); + { + V T1t, TbY, T1w, TbZ; + { + V T1r, T1s, T1u, T1v; + T1r = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1s = LD(&(xi[WS(is, 71)]), ivs, &(xi[WS(is, 1)])); + T1t = VSUB(T1r, T1s); + TbY = VADD(T1r, T1s); + T1u = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T1v = LD(&(xi[WS(is, 103)]), ivs, &(xi[WS(is, 1)])); + T1w = VSUB(T1u, T1v); + TbZ = VADD(T1u, T1v); + } + T1x = VFMA(LDK(KP382683432), T1t, VMUL(LDK(KP923879532), T1w)); + Tfi = VADD(TbY, TbZ); + T2h = VFNMS(LDK(KP382683432), T1w, VMUL(LDK(KP923879532), T1t)); + Tc0 = VSUB(TbY, TbZ); + } + { + V T1A, Tc2, T1D, Tc1; + { + V T1y, T1z, T1B, T1C; + T1y = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T1z = LD(&(xi[WS(is, 87)]), ivs, &(xi[WS(is, 1)])); + T1A = VSUB(T1y, T1z); + Tc2 = VADD(T1y, T1z); + T1B = LD(&(xi[WS(is, 119)]), ivs, &(xi[WS(is, 1)])); + T1C = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1D = VSUB(T1B, T1C); + Tc1 = VADD(T1B, T1C); + } + T1E = VFNMS(LDK(KP382683432), T1D, VMUL(LDK(KP923879532), T1A)); + Tfj = VADD(Tc1, Tc2); + T2i = VFMA(LDK(KP923879532), T1D, VMUL(LDK(KP382683432), T1A)); + Tc3 = VSUB(Tc1, Tc2); + } + Tfk = VSUB(Tfi, Tfj); + Tfo = VSUB(Tfm, Tfn); + { + V T1q, T1F, Tgq, Tgr; + T1q = VSUB(T1i, T1p); + T1F = VSUB(T1x, T1E); + T1G = VSUB(T1q, T1F); + T64 = VADD(T1q, T1F); + Tgq = VADD(Tfm, Tfn); + Tgr = VADD(Tfi, Tfj); + Tgs = VSUB(Tgq, Tgr); + Th6 = VADD(Tgq, Tgr); + } + { + V T2j, T2o, T7r, T7s; + T2j = VSUB(T2h, T2i); + T2o = VSUB(T2k, T2n); + T2p = VSUB(T2j, T2o); + T62 = VADD(T2o, T2j); + T7r = VADD(T1x, T1E); + T7s = VADD(T2n, T2k); + T7t = VSUB(T7r, T7s); + T9c = VADD(T7s, T7r); + } + Tcc = VSUB(Tca, Tcb); + Tcd = VMUL(LDK(KP707106781), VADD(Tc0, Tc3)); + Tce = VSUB(Tcc, Tcd); + Tdm = VADD(Tcc, Tcd); + { + V T7g, T7h, Tc4, Tc7; + T7g = VADD(T1i, T1p); + T7h = VADD(T2h, T2i); + T7i = VSUB(T7g, T7h); + T9e = VADD(T7g, T7h); + Tc4 = VMUL(LDK(KP707106781), VSUB(Tc0, Tc3)); + Tc7 = VSUB(Tc5, Tc6); + Tc8 = VSUB(Tc4, Tc7); + Tdp = VADD(Tc7, Tc4); + } + } + { + V T4c, Tew, T4o, Tak, T4A, Tez, T4E, Tau, T4j, Tex, T4l, Tan, T4x, TeA, T4F; + V Tar, Tcp, Tcq; + { + V T4a, T4b, Tai, T4m, T4n, Taj; + T4a = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T4b = LD(&(xi[WS(is, 68)]), ivs, &(xi[0])); + Tai = VADD(T4a, T4b); + T4m = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + T4n = LD(&(xi[WS(is, 100)]), ivs, &(xi[0])); + Taj = VADD(T4m, T4n); + T4c = VSUB(T4a, T4b); + Tew = VADD(Tai, Taj); + T4o = VSUB(T4m, T4n); + Tak = VSUB(Tai, Taj); + } + { + V T4y, T4z, Tat, T4C, T4D, Tas; + T4y = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T4z = LD(&(xi[WS(is, 92)]), ivs, &(xi[0])); + Tat = VADD(T4y, T4z); + T4C = LD(&(xi[WS(is, 124)]), ivs, &(xi[0])); + T4D = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tas = VADD(T4C, T4D); + T4A = VSUB(T4y, T4z); + Tez = VADD(Tas, Tat); + T4E = VSUB(T4C, T4D); + Tau = VSUB(Tas, Tat); + } + { + V T4f, Tal, T4i, Tam; + { + V T4d, T4e, T4g, T4h; + T4d = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T4e = LD(&(xi[WS(is, 84)]), ivs, &(xi[0])); + T4f = VSUB(T4d, T4e); + Tal = VADD(T4d, T4e); + T4g = LD(&(xi[WS(is, 116)]), ivs, &(xi[0])); + T4h = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + T4i = VSUB(T4g, T4h); + Tam = VADD(T4g, T4h); + } + T4j = VMUL(LDK(KP707106781), VADD(T4f, T4i)); + Tex = VADD(Tal, Tam); + T4l = VMUL(LDK(KP707106781), VSUB(T4f, T4i)); + Tan = VSUB(Tal, Tam); + } + { + V T4t, Tap, T4w, Taq; + { + V T4r, T4s, T4u, T4v; + T4r = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T4s = LD(&(xi[WS(is, 76)]), ivs, &(xi[0])); + T4t = VSUB(T4r, T4s); + Tap = VADD(T4r, T4s); + T4u = LD(&(xi[WS(is, 108)]), ivs, &(xi[0])); + T4v = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + T4w = VSUB(T4u, T4v); + Taq = VADD(T4u, T4v); + } + T4x = VMUL(LDK(KP707106781), VSUB(T4t, T4w)); + TeA = VADD(Tap, Taq); + T4F = VMUL(LDK(KP707106781), VADD(T4t, T4w)); + Tar = VSUB(Tap, Taq); + } + TgF = VADD(Tew, Tex); + TgG = VADD(Tez, TeA); + { + V T4k, T4p, Tey, TeB; + T4k = VSUB(T4c, T4j); + T4p = VSUB(T4l, T4o); + T4q = VFNMS(LDK(KP555570233), T4p, VMUL(LDK(KP831469612), T4k)); + T4V = VFMA(LDK(KP831469612), T4p, VMUL(LDK(KP555570233), T4k)); + Tey = VSUB(Tew, Tex); + TeB = VSUB(Tez, TeA); + TeC = VMUL(LDK(KP707106781), VADD(Tey, TeB)); + Tfx = VMUL(LDK(KP707106781), VSUB(Tey, TeB)); + } + { + V T4B, T4G, T7V, T7W; + T4B = VSUB(T4x, T4A); + T4G = VSUB(T4E, T4F); + T4H = VFMA(LDK(KP555570233), T4B, VMUL(LDK(KP831469612), T4G)); + T4W = VFNMS(LDK(KP555570233), T4G, VMUL(LDK(KP831469612), T4B)); + T7V = VADD(T4A, T4x); + T7W = VADD(T4E, T4F); + T7X = VFMA(LDK(KP195090322), T7V, VMUL(LDK(KP980785280), T7W)); + T86 = VFNMS(LDK(KP195090322), T7W, VMUL(LDK(KP980785280), T7V)); + } + Tcp = VFNMS(LDK(KP382683432), Tan, VMUL(LDK(KP923879532), Tak)); + Tcq = VFMA(LDK(KP923879532), Tau, VMUL(LDK(KP382683432), Tar)); + Tcr = VSUB(Tcp, Tcq); + TdH = VADD(Tcp, Tcq); + { + V T7S, T7T, Tao, Tav; + T7S = VADD(T4c, T4j); + T7T = VADD(T4o, T4l); + T7U = VFNMS(LDK(KP195090322), T7T, VMUL(LDK(KP980785280), T7S)); + T85 = VFMA(LDK(KP980785280), T7T, VMUL(LDK(KP195090322), T7S)); + Tao = VFMA(LDK(KP382683432), Tak, VMUL(LDK(KP923879532), Tan)); + Tav = VFNMS(LDK(KP382683432), Tau, VMUL(LDK(KP923879532), Tar)); + Taw = VSUB(Tao, Tav); + TdC = VADD(Tao, Tav); + } + } + { + V Tbz, TbA, T3, Tf5, T18, Tbu, Tbv, Ta, Tf6, T15, Ti, Tf1, T12, Tbp, Tp; + V Tf2, T13, Tbs, T6, T9, TbB, TbC; + { + V T1, T2, T16, T17; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 65)]), ivs, &(xi[WS(is, 1)])); + Tbz = VADD(T1, T2); + T16 = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T17 = LD(&(xi[WS(is, 97)]), ivs, &(xi[WS(is, 1)])); + TbA = VADD(T16, T17); + T3 = VSUB(T1, T2); + Tf5 = VADD(Tbz, TbA); + T18 = VSUB(T16, T17); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 81)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tbu = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 113)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tbv = VADD(T7, T8); + } + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tf6 = VADD(Tbu, Tbv); + T15 = VMUL(LDK(KP707106781), VSUB(T6, T9)); + { + V Te, Tbn, Th, Tbo; + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 73)]), ivs, &(xi[WS(is, 1)])); + Te = VSUB(Tc, Td); + Tbn = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 105)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + Tbo = VADD(Tf, Tg); + } + Ti = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + Tf1 = VADD(Tbn, Tbo); + T12 = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + Tbp = VSUB(Tbn, Tbo); + } + { + V Tl, Tbr, To, Tbq; + { + V Tj, Tk, Tm, Tn; + Tj = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + Tk = LD(&(xi[WS(is, 89)]), ivs, &(xi[WS(is, 1)])); + Tl = VSUB(Tj, Tk); + Tbr = VADD(Tj, Tk); + Tm = LD(&(xi[WS(is, 121)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + To = VSUB(Tm, Tn); + Tbq = VADD(Tm, Tn); + } + Tp = VFNMS(LDK(KP382683432), To, VMUL(LDK(KP923879532), Tl)); + Tf2 = VADD(Tbq, Tbr); + T13 = VFMA(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + Tbs = VSUB(Tbq, Tbr); + } + Tf3 = VSUB(Tf1, Tf2); + Tf7 = VSUB(Tf5, Tf6); + { + V Tb, Tq, Tgj, Tgk; + Tb = VSUB(T3, Ta); + Tq = VSUB(Ti, Tp); + Tr = VSUB(Tb, Tq); + T5X = VADD(Tb, Tq); + Tgj = VADD(Tf5, Tf6); + Tgk = VADD(Tf1, Tf2); + Tgl = VSUB(Tgj, Tgk); + Th3 = VADD(Tgj, Tgk); + } + { + V T14, T19, T78, T79; + T14 = VSUB(T12, T13); + T19 = VSUB(T15, T18); + T1a = VSUB(T14, T19); + T5V = VADD(T19, T14); + T78 = VADD(Ti, Tp); + T79 = VADD(T18, T15); + T7a = VSUB(T78, T79); + T95 = VADD(T79, T78); + } + TbB = VSUB(Tbz, TbA); + TbC = VMUL(LDK(KP707106781), VADD(Tbp, Tbs)); + TbD = VSUB(TbB, TbC); + Tdf = VADD(TbB, TbC); + { + V T6X, T6Y, Tbt, Tbw; + T6X = VADD(T3, Ta); + T6Y = VADD(T12, T13); + T6Z = VSUB(T6X, T6Y); + T97 = VADD(T6X, T6Y); + Tbt = VMUL(LDK(KP707106781), VSUB(Tbp, Tbs)); + Tbw = VSUB(Tbu, Tbv); + Tbx = VSUB(Tbt, Tbw); + Tdi = VADD(Tbw, Tbt); + } + } + { + V TaK, TaJ, T2U, TeE, T2Z, TaF, TaG, T2R, TeF, T30, T2C, TeH, T32, TaA, T2J; + V TeI, T33, TaD, T2N, T2Q, TaL, TaM; + { + V T2S, T2T, T2X, T2Y; + T2S = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + T2T = LD(&(xi[WS(is, 98)]), ivs, &(xi[0])); + TaK = VADD(T2S, T2T); + T2X = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2Y = LD(&(xi[WS(is, 66)]), ivs, &(xi[0])); + TaJ = VADD(T2X, T2Y); + T2U = VSUB(T2S, T2T); + TeE = VADD(TaJ, TaK); + T2Z = VSUB(T2X, T2Y); + } + { + V T2L, T2M, T2O, T2P; + T2L = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T2M = LD(&(xi[WS(is, 82)]), ivs, &(xi[0])); + T2N = VSUB(T2L, T2M); + TaF = VADD(T2L, T2M); + T2O = LD(&(xi[WS(is, 114)]), ivs, &(xi[0])); + T2P = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + T2Q = VSUB(T2O, T2P); + TaG = VADD(T2O, T2P); + } + T2R = VMUL(LDK(KP707106781), VSUB(T2N, T2Q)); + TeF = VADD(TaF, TaG); + T30 = VMUL(LDK(KP707106781), VADD(T2N, T2Q)); + { + V T2y, Tay, T2B, Taz; + { + V T2w, T2x, T2z, T2A; + T2w = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T2x = LD(&(xi[WS(is, 74)]), ivs, &(xi[0])); + T2y = VSUB(T2w, T2x); + Tay = VADD(T2w, T2x); + T2z = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T2A = LD(&(xi[WS(is, 106)]), ivs, &(xi[0])); + T2B = VSUB(T2z, T2A); + Taz = VADD(T2z, T2A); + } + T2C = VFNMS(LDK(KP382683432), T2B, VMUL(LDK(KP923879532), T2y)); + TeH = VADD(Tay, Taz); + T32 = VFMA(LDK(KP382683432), T2y, VMUL(LDK(KP923879532), T2B)); + TaA = VSUB(Tay, Taz); + } + { + V T2F, TaB, T2I, TaC; + { + V T2D, T2E, T2G, T2H; + T2D = LD(&(xi[WS(is, 122)]), ivs, &(xi[0])); + T2E = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + T2F = VSUB(T2D, T2E); + TaB = VADD(T2D, T2E); + T2G = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T2H = LD(&(xi[WS(is, 90)]), ivs, &(xi[0])); + T2I = VSUB(T2G, T2H); + TaC = VADD(T2G, T2H); + } + T2J = VFMA(LDK(KP923879532), T2F, VMUL(LDK(KP382683432), T2I)); + TeI = VADD(TaB, TaC); + T33 = VFNMS(LDK(KP382683432), T2F, VMUL(LDK(KP923879532), T2I)); + TaD = VSUB(TaB, TaC); + } + Tgy = VADD(TeE, TeF); + Tgz = VADD(TeH, TeI); + TgA = VSUB(Tgy, Tgz); + TaL = VSUB(TaJ, TaK); + TaM = VMUL(LDK(KP707106781), VADD(TaA, TaD)); + TaN = VSUB(TaL, TaM); + Tdv = VADD(TaL, TaM); + { + V TeG, TeJ, T2K, T2V; + TeG = VSUB(TeE, TeF); + TeJ = VSUB(TeH, TeI); + TeK = VFMA(LDK(KP382683432), TeG, VMUL(LDK(KP923879532), TeJ)); + Tfu = VFNMS(LDK(KP382683432), TeJ, VMUL(LDK(KP923879532), TeG)); + T2K = VSUB(T2C, T2J); + T2V = VSUB(T2R, T2U); + T2W = VSUB(T2K, T2V); + T5M = VADD(T2V, T2K); + } + { + V T31, T34, T7D, T7E; + T31 = VSUB(T2Z, T30); + T34 = VSUB(T32, T33); + T35 = VSUB(T31, T34); + T5N = VADD(T31, T34); + T7D = VADD(T32, T33); + T7E = VADD(T2U, T2R); + T7F = VSUB(T7D, T7E); + T8X = VADD(T7E, T7D); + } + { + V TaE, TaH, T7A, T7B; + TaE = VMUL(LDK(KP707106781), VSUB(TaA, TaD)); + TaH = VSUB(TaF, TaG); + TaI = VSUB(TaE, TaH); + Tdu = VADD(TaH, TaE); + T7A = VADD(T2Z, T30); + T7B = VADD(T2C, T2J); + T7C = VSUB(T7A, T7B); + T8W = VADD(T7A, T7B); + } + } + { + V Tb1, Tb0, T3v, TeO, T3A, TaW, TaX, T3s, TeP, T3B, T3d, TeL, T3D, TaR, T3k; + V TeM, T3E, TaU, T3o, T3r, Tb2, Tb3; + { + V T3t, T3u, T3y, T3z; + T3t = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + T3u = LD(&(xi[WS(is, 94)]), ivs, &(xi[0])); + Tb1 = VADD(T3t, T3u); + T3y = LD(&(xi[WS(is, 126)]), ivs, &(xi[0])); + T3z = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + Tb0 = VADD(T3y, T3z); + T3v = VSUB(T3t, T3u); + TeO = VADD(Tb0, Tb1); + T3A = VSUB(T3y, T3z); + } + { + V T3m, T3n, T3p, T3q; + T3m = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T3n = LD(&(xi[WS(is, 78)]), ivs, &(xi[0])); + T3o = VSUB(T3m, T3n); + TaW = VADD(T3m, T3n); + T3p = LD(&(xi[WS(is, 110)]), ivs, &(xi[0])); + T3q = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + T3r = VSUB(T3p, T3q); + TaX = VADD(T3p, T3q); + } + T3s = VMUL(LDK(KP707106781), VSUB(T3o, T3r)); + TeP = VADD(TaW, TaX); + T3B = VMUL(LDK(KP707106781), VADD(T3o, T3r)); + { + V T39, TaP, T3c, TaQ; + { + V T37, T38, T3a, T3b; + T37 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T38 = LD(&(xi[WS(is, 70)]), ivs, &(xi[0])); + T39 = VSUB(T37, T38); + TaP = VADD(T37, T38); + T3a = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T3b = LD(&(xi[WS(is, 102)]), ivs, &(xi[0])); + T3c = VSUB(T3a, T3b); + TaQ = VADD(T3a, T3b); + } + T3d = VFNMS(LDK(KP382683432), T3c, VMUL(LDK(KP923879532), T39)); + TeL = VADD(TaP, TaQ); + T3D = VFMA(LDK(KP382683432), T39, VMUL(LDK(KP923879532), T3c)); + TaR = VSUB(TaP, TaQ); + } + { + V T3g, TaS, T3j, TaT; + { + V T3e, T3f, T3h, T3i; + T3e = LD(&(xi[WS(is, 118)]), ivs, &(xi[0])); + T3f = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + T3g = VSUB(T3e, T3f); + TaS = VADD(T3e, T3f); + T3h = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T3i = LD(&(xi[WS(is, 86)]), ivs, &(xi[0])); + T3j = VSUB(T3h, T3i); + TaT = VADD(T3h, T3i); + } + T3k = VFMA(LDK(KP923879532), T3g, VMUL(LDK(KP382683432), T3j)); + TeM = VADD(TaS, TaT); + T3E = VFNMS(LDK(KP382683432), T3g, VMUL(LDK(KP923879532), T3j)); + TaU = VSUB(TaS, TaT); + } + TgB = VADD(TeO, TeP); + TgC = VADD(TeL, TeM); + TgD = VSUB(TgB, TgC); + Tb2 = VSUB(Tb0, Tb1); + Tb3 = VMUL(LDK(KP707106781), VADD(TaR, TaU)); + Tb4 = VSUB(Tb2, Tb3); + Tdy = VADD(Tb2, Tb3); + { + V TeN, TeQ, T3l, T3w; + TeN = VSUB(TeL, TeM); + TeQ = VSUB(TeO, TeP); + TeR = VFNMS(LDK(KP382683432), TeQ, VMUL(LDK(KP923879532), TeN)); + Tfv = VFMA(LDK(KP923879532), TeQ, VMUL(LDK(KP382683432), TeN)); + T3l = VSUB(T3d, T3k); + T3w = VSUB(T3s, T3v); + T3x = VSUB(T3l, T3w); + T5P = VADD(T3w, T3l); + } + { + V T3C, T3F, T7K, T7L; + T3C = VSUB(T3A, T3B); + T3F = VSUB(T3D, T3E); + T3G = VSUB(T3C, T3F); + T5Q = VADD(T3C, T3F); + T7K = VADD(T3A, T3B); + T7L = VADD(T3d, T3k); + T7M = VSUB(T7K, T7L); + T90 = VADD(T7K, T7L); + } + { + V TaV, TaY, T7H, T7I; + TaV = VMUL(LDK(KP707106781), VSUB(TaR, TaU)); + TaY = VSUB(TaW, TaX); + TaZ = VSUB(TaV, TaY); + Tdx = VADD(TaY, TaV); + T7H = VADD(T3D, T3E); + T7I = VADD(T3v, T3s); + T7J = VSUB(T7H, T7I); + T8Z = VADD(T7I, T7H); + } + } + { + V TB, TeU, TF, Tba, TS, TeX, TW, Tbh, Ty, TeV, TG, Tbd, TP, TeY, TX; + V Tbk; + { + V Tz, TA, Tb9, TD, TE, Tb8; + Tz = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + TA = LD(&(xi[WS(is, 101)]), ivs, &(xi[WS(is, 1)])); + Tb9 = VADD(Tz, TA); + TD = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 69)]), ivs, &(xi[WS(is, 1)])); + Tb8 = VADD(TD, TE); + TB = VSUB(Tz, TA); + TeU = VADD(Tb8, Tb9); + TF = VSUB(TD, TE); + Tba = VSUB(Tb8, Tb9); + } + { + V TQ, TR, Tbg, TU, TV, Tbf; + TQ = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + TR = LD(&(xi[WS(is, 93)]), ivs, &(xi[WS(is, 1)])); + Tbg = VADD(TQ, TR); + TU = LD(&(xi[WS(is, 125)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + Tbf = VADD(TU, TV); + TS = VSUB(TQ, TR); + TeX = VADD(Tbf, Tbg); + TW = VSUB(TU, TV); + Tbh = VSUB(Tbf, Tbg); + } + { + V Tu, Tbb, Tx, Tbc; + { + V Ts, Tt, Tv, Tw; + Ts = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 85)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + Tbb = VADD(Ts, Tt); + Tv = LD(&(xi[WS(is, 117)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + Tbc = VADD(Tv, Tw); + } + Ty = VMUL(LDK(KP707106781), VSUB(Tu, Tx)); + TeV = VADD(Tbb, Tbc); + TG = VMUL(LDK(KP707106781), VADD(Tu, Tx)); + Tbd = VSUB(Tbb, Tbc); + } + { + V TL, Tbi, TO, Tbj; + { + V TJ, TK, TM, TN; + TJ = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 77)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + Tbi = VADD(TJ, TK); + TM = LD(&(xi[WS(is, 109)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + Tbj = VADD(TM, TN); + } + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + TeY = VADD(Tbi, Tbj); + TX = VMUL(LDK(KP707106781), VADD(TL, TO)); + Tbk = VSUB(Tbi, Tbj); + } + { + V Tbe, Tbl, TeW, TeZ; + Tbe = VFNMS(LDK(KP382683432), Tbd, VMUL(LDK(KP923879532), Tba)); + Tbl = VFMA(LDK(KP923879532), Tbh, VMUL(LDK(KP382683432), Tbk)); + Tbm = VSUB(Tbe, Tbl); + Tdg = VADD(Tbe, Tbl); + { + V TbE, TbF, Tgm, Tgn; + TbE = VFMA(LDK(KP382683432), Tba, VMUL(LDK(KP923879532), Tbd)); + TbF = VFNMS(LDK(KP382683432), Tbh, VMUL(LDK(KP923879532), Tbk)); + TbG = VSUB(TbE, TbF); + Tdj = VADD(TbE, TbF); + Tgm = VADD(TeU, TeV); + Tgn = VADD(TeX, TeY); + Tgo = VSUB(Tgm, Tgn); + Th4 = VADD(Tgm, Tgn); + } + TeW = VSUB(TeU, TeV); + TeZ = VSUB(TeX, TeY); + Tf0 = VMUL(LDK(KP707106781), VSUB(TeW, TeZ)); + Tf8 = VMUL(LDK(KP707106781), VADD(TeW, TeZ)); + { + V T72, T7b, T75, T7c; + { + V T70, T71, T73, T74; + T70 = VADD(TB, Ty); + T71 = VADD(TF, TG); + T72 = VFMA(LDK(KP980785280), T70, VMUL(LDK(KP195090322), T71)); + T7b = VFNMS(LDK(KP195090322), T70, VMUL(LDK(KP980785280), T71)); + T73 = VADD(TS, TP); + T74 = VADD(TW, TX); + T75 = VFNMS(LDK(KP195090322), T74, VMUL(LDK(KP980785280), T73)); + T7c = VFMA(LDK(KP195090322), T73, VMUL(LDK(KP980785280), T74)); + } + T76 = VSUB(T72, T75); + T98 = VADD(T7b, T7c); + T7d = VSUB(T7b, T7c); + T94 = VADD(T72, T75); + } + { + V TI, T1b, TZ, T1c; + { + V TC, TH, TT, TY; + TC = VSUB(Ty, TB); + TH = VSUB(TF, TG); + TI = VFMA(LDK(KP831469612), TC, VMUL(LDK(KP555570233), TH)); + T1b = VFNMS(LDK(KP555570233), TC, VMUL(LDK(KP831469612), TH)); + TT = VSUB(TP, TS); + TY = VSUB(TW, TX); + TZ = VFNMS(LDK(KP555570233), TY, VMUL(LDK(KP831469612), TT)); + T1c = VFMA(LDK(KP555570233), TT, VMUL(LDK(KP831469612), TY)); + } + T10 = VSUB(TI, TZ); + T5Y = VADD(T1b, T1c); + T1d = VSUB(T1b, T1c); + T5U = VADD(TI, TZ); + } + } + } + { + V T1Q, Tfb, T1U, TbL, T27, Tfe, T2b, TbS, T1N, Tfc, T1V, TbO, T24, Tff, T2c; + V TbV; + { + V T1O, T1P, TbK, T1S, T1T, TbJ; + T1O = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 99)]), ivs, &(xi[WS(is, 1)])); + TbK = VADD(T1O, T1P); + T1S = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1T = LD(&(xi[WS(is, 67)]), ivs, &(xi[WS(is, 1)])); + TbJ = VADD(T1S, T1T); + T1Q = VSUB(T1O, T1P); + Tfb = VADD(TbJ, TbK); + T1U = VSUB(T1S, T1T); + TbL = VSUB(TbJ, TbK); + } + { + V T25, T26, TbR, T29, T2a, TbQ; + T25 = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T26 = LD(&(xi[WS(is, 91)]), ivs, &(xi[WS(is, 1)])); + TbR = VADD(T25, T26); + T29 = LD(&(xi[WS(is, 123)]), ivs, &(xi[WS(is, 1)])); + T2a = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + TbQ = VADD(T29, T2a); + T27 = VSUB(T25, T26); + Tfe = VADD(TbQ, TbR); + T2b = VSUB(T29, T2a); + TbS = VSUB(TbQ, TbR); + } + { + V T1J, TbM, T1M, TbN; + { + V T1H, T1I, T1K, T1L; + T1H = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1I = LD(&(xi[WS(is, 83)]), ivs, &(xi[WS(is, 1)])); + T1J = VSUB(T1H, T1I); + TbM = VADD(T1H, T1I); + T1K = LD(&(xi[WS(is, 115)]), ivs, &(xi[WS(is, 1)])); + T1L = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1M = VSUB(T1K, T1L); + TbN = VADD(T1K, T1L); + } + T1N = VMUL(LDK(KP707106781), VSUB(T1J, T1M)); + Tfc = VADD(TbM, TbN); + T1V = VMUL(LDK(KP707106781), VADD(T1J, T1M)); + TbO = VSUB(TbM, TbN); + } + { + V T20, TbT, T23, TbU; + { + V T1Y, T1Z, T21, T22; + T1Y = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1Z = LD(&(xi[WS(is, 75)]), ivs, &(xi[WS(is, 1)])); + T20 = VSUB(T1Y, T1Z); + TbT = VADD(T1Y, T1Z); + T21 = LD(&(xi[WS(is, 107)]), ivs, &(xi[WS(is, 1)])); + T22 = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T23 = VSUB(T21, T22); + TbU = VADD(T21, T22); + } + T24 = VMUL(LDK(KP707106781), VSUB(T20, T23)); + Tff = VADD(TbT, TbU); + T2c = VMUL(LDK(KP707106781), VADD(T20, T23)); + TbV = VSUB(TbT, TbU); + } + { + V TbP, TbW, Tfd, Tfg; + TbP = VFNMS(LDK(KP382683432), TbO, VMUL(LDK(KP923879532), TbL)); + TbW = VFMA(LDK(KP923879532), TbS, VMUL(LDK(KP382683432), TbV)); + TbX = VSUB(TbP, TbW); + Tdn = VADD(TbP, TbW); + { + V Tcf, Tcg, Tgt, Tgu; + Tcf = VFMA(LDK(KP382683432), TbL, VMUL(LDK(KP923879532), TbO)); + Tcg = VFNMS(LDK(KP382683432), TbS, VMUL(LDK(KP923879532), TbV)); + Tch = VSUB(Tcf, Tcg); + Tdq = VADD(Tcf, Tcg); + Tgt = VADD(Tfb, Tfc); + Tgu = VADD(Tfe, Tff); + Tgv = VSUB(Tgt, Tgu); + Th7 = VADD(Tgt, Tgu); + } + Tfd = VSUB(Tfb, Tfc); + Tfg = VSUB(Tfe, Tff); + Tfh = VMUL(LDK(KP707106781), VSUB(Tfd, Tfg)); + Tfp = VMUL(LDK(KP707106781), VADD(Tfd, Tfg)); + { + V T7l, T7u, T7o, T7v; + { + V T7j, T7k, T7m, T7n; + T7j = VADD(T1Q, T1N); + T7k = VADD(T1U, T1V); + T7l = VFMA(LDK(KP980785280), T7j, VMUL(LDK(KP195090322), T7k)); + T7u = VFNMS(LDK(KP195090322), T7j, VMUL(LDK(KP980785280), T7k)); + T7m = VADD(T27, T24); + T7n = VADD(T2b, T2c); + T7o = VFNMS(LDK(KP195090322), T7n, VMUL(LDK(KP980785280), T7m)); + T7v = VFMA(LDK(KP195090322), T7m, VMUL(LDK(KP980785280), T7n)); + } + T7p = VSUB(T7l, T7o); + T9f = VADD(T7u, T7v); + T7w = VSUB(T7u, T7v); + T9b = VADD(T7l, T7o); + } + { + V T1X, T2q, T2e, T2r; + { + V T1R, T1W, T28, T2d; + T1R = VSUB(T1N, T1Q); + T1W = VSUB(T1U, T1V); + T1X = VFMA(LDK(KP831469612), T1R, VMUL(LDK(KP555570233), T1W)); + T2q = VFNMS(LDK(KP555570233), T1R, VMUL(LDK(KP831469612), T1W)); + T28 = VSUB(T24, T27); + T2d = VSUB(T2b, T2c); + T2e = VFNMS(LDK(KP555570233), T2d, VMUL(LDK(KP831469612), T28)); + T2r = VFMA(LDK(KP555570233), T28, VMUL(LDK(KP831469612), T2d)); + } + T2f = VSUB(T1X, T2e); + T65 = VADD(T2q, T2r); + T2s = VSUB(T2q, T2r); + T61 = VADD(T1X, T2e); + } + } + } + { + V Tgx, TgW, TgR, TgZ, TgI, TgY, TgO, TgV; + { + V Tgp, Tgw, TgP, TgQ; + Tgp = VFNMS(LDK(KP382683432), Tgo, VMUL(LDK(KP923879532), Tgl)); + Tgw = VFMA(LDK(KP923879532), Tgs, VMUL(LDK(KP382683432), Tgv)); + Tgx = VSUB(Tgp, Tgw); + TgW = VADD(Tgp, Tgw); + TgP = VFMA(LDK(KP382683432), Tgl, VMUL(LDK(KP923879532), Tgo)); + TgQ = VFNMS(LDK(KP382683432), Tgs, VMUL(LDK(KP923879532), Tgv)); + TgR = VSUB(TgP, TgQ); + TgZ = VADD(TgP, TgQ); + } + { + V TgE, TgH, TgM, TgN; + TgE = VMUL(LDK(KP707106781), VSUB(TgA, TgD)); + TgH = VSUB(TgF, TgG); + TgI = VSUB(TgE, TgH); + TgY = VADD(TgH, TgE); + TgM = VSUB(TgK, TgL); + TgN = VMUL(LDK(KP707106781), VADD(TgA, TgD)); + TgO = VSUB(TgM, TgN); + TgV = VADD(TgM, TgN); + } + { + V TgJ, TgS, Th1, Th2; + TgJ = VBYI(VSUB(Tgx, TgI)); + TgS = VSUB(TgO, TgR); + ST(&(xo[WS(os, 40)]), VADD(TgJ, TgS), ovs, &(xo[0])); + ST(&(xo[WS(os, 88)]), VSUB(TgS, TgJ), ovs, &(xo[0])); + Th1 = VSUB(TgV, TgW); + Th2 = VBYI(VSUB(TgZ, TgY)); + ST(&(xo[WS(os, 72)]), VSUB(Th1, Th2), ovs, &(xo[0])); + ST(&(xo[WS(os, 56)]), VADD(Th1, Th2), ovs, &(xo[0])); + } + { + V TgT, TgU, TgX, Th0; + TgT = VBYI(VADD(TgI, Tgx)); + TgU = VADD(TgO, TgR); + ST(&(xo[WS(os, 24)]), VADD(TgT, TgU), ovs, &(xo[0])); + ST(&(xo[WS(os, 104)]), VSUB(TgU, TgT), ovs, &(xo[0])); + TgX = VADD(TgV, TgW); + Th0 = VBYI(VADD(TgY, TgZ)); + ST(&(xo[WS(os, 120)]), VSUB(TgX, Th0), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(TgX, Th0), ovs, &(xo[0])); + } + } + { + V Th9, Thh, Thq, Ths, Thc, Thm, Thg, Thl, Thn, Thr; + { + V Th5, Th8, Tho, Thp; + Th5 = VSUB(Th3, Th4); + Th8 = VSUB(Th6, Th7); + Th9 = VMUL(LDK(KP707106781), VSUB(Th5, Th8)); + Thh = VMUL(LDK(KP707106781), VADD(Th5, Th8)); + Tho = VADD(Th3, Th4); + Thp = VADD(Th6, Th7); + Thq = VBYI(VSUB(Tho, Thp)); + Ths = VADD(Tho, Thp); + } + { + V Tha, Thb, The, Thf; + Tha = VADD(Tgy, Tgz); + Thb = VADD(TgB, TgC); + Thc = VSUB(Tha, Thb); + Thm = VADD(Tha, Thb); + The = VADD(TgK, TgL); + Thf = VADD(TgF, TgG); + Thg = VSUB(The, Thf); + Thl = VADD(The, Thf); + } + Thn = VSUB(Thl, Thm); + ST(&(xo[WS(os, 96)]), VSUB(Thn, Thq), ovs, &(xo[0])); + ST(&(xo[WS(os, 32)]), VADD(Thn, Thq), ovs, &(xo[0])); + Thr = VADD(Thl, Thm); + ST(&(xo[WS(os, 64)]), VSUB(Thr, Ths), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Thr, Ths), ovs, &(xo[0])); + { + V Thd, Thi, Thj, Thk; + Thd = VBYI(VSUB(Th9, Thc)); + Thi = VSUB(Thg, Thh); + ST(&(xo[WS(os, 48)]), VADD(Thd, Thi), ovs, &(xo[0])); + ST(&(xo[WS(os, 80)]), VSUB(Thi, Thd), ovs, &(xo[0])); + Thj = VBYI(VADD(Thc, Th9)); + Thk = VADD(Thg, Thh); + ST(&(xo[WS(os, 16)]), VADD(Thj, Thk), ovs, &(xo[0])); + ST(&(xo[WS(os, 112)]), VSUB(Thk, Thj), ovs, &(xo[0])); + } + } + { + V TeT, TfM, TfC, TfK, Tfs, TfN, TfF, TfJ; + { + V TeD, TeS, Tfw, TfB; + TeD = VSUB(Tev, TeC); + TeS = VSUB(TeK, TeR); + TeT = VSUB(TeD, TeS); + TfM = VADD(TeD, TeS); + Tfw = VSUB(Tfu, Tfv); + TfB = VSUB(Tfx, TfA); + TfC = VSUB(Tfw, TfB); + TfK = VADD(TfB, Tfw); + { + V Tfa, TfD, Tfr, TfE; + { + V Tf4, Tf9, Tfl, Tfq; + Tf4 = VSUB(Tf0, Tf3); + Tf9 = VSUB(Tf7, Tf8); + Tfa = VFMA(LDK(KP831469612), Tf4, VMUL(LDK(KP555570233), Tf9)); + TfD = VFNMS(LDK(KP555570233), Tf4, VMUL(LDK(KP831469612), Tf9)); + Tfl = VSUB(Tfh, Tfk); + Tfq = VSUB(Tfo, Tfp); + Tfr = VFNMS(LDK(KP555570233), Tfq, VMUL(LDK(KP831469612), Tfl)); + TfE = VFMA(LDK(KP555570233), Tfl, VMUL(LDK(KP831469612), Tfq)); + } + Tfs = VSUB(Tfa, Tfr); + TfN = VADD(TfD, TfE); + TfF = VSUB(TfD, TfE); + TfJ = VADD(Tfa, Tfr); + } + } + { + V Tft, TfG, TfP, TfQ; + Tft = VADD(TeT, Tfs); + TfG = VBYI(VADD(TfC, TfF)); + ST(&(xo[WS(os, 108)]), VSUB(Tft, TfG), ovs, &(xo[0])); + ST(&(xo[WS(os, 20)]), VADD(Tft, TfG), ovs, &(xo[0])); + TfP = VBYI(VADD(TfK, TfJ)); + TfQ = VADD(TfM, TfN); + ST(&(xo[WS(os, 12)]), VADD(TfP, TfQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 116)]), VSUB(TfQ, TfP), ovs, &(xo[0])); + } + { + V TfH, TfI, TfL, TfO; + TfH = VSUB(TeT, Tfs); + TfI = VBYI(VSUB(TfF, TfC)); + ST(&(xo[WS(os, 84)]), VSUB(TfH, TfI), ovs, &(xo[0])); + ST(&(xo[WS(os, 44)]), VADD(TfH, TfI), ovs, &(xo[0])); + TfL = VBYI(VSUB(TfJ, TfK)); + TfO = VSUB(TfM, TfN); + ST(&(xo[WS(os, 52)]), VADD(TfL, TfO), ovs, &(xo[0])); + ST(&(xo[WS(os, 76)]), VSUB(TfO, TfL), ovs, &(xo[0])); + } + } + { + V TfT, Tge, Tg4, Tgc, Tg0, Tgf, Tg7, Tgb; + { + V TfR, TfS, Tg2, Tg3; + TfR = VADD(Tev, TeC); + TfS = VADD(Tfu, Tfv); + TfT = VSUB(TfR, TfS); + Tge = VADD(TfR, TfS); + Tg2 = VADD(TeK, TeR); + Tg3 = VADD(TfA, Tfx); + Tg4 = VSUB(Tg2, Tg3); + Tgc = VADD(Tg3, Tg2); + { + V TfW, Tg5, TfZ, Tg6; + { + V TfU, TfV, TfX, TfY; + TfU = VADD(Tf3, Tf0); + TfV = VADD(Tf7, Tf8); + TfW = VFMA(LDK(KP980785280), TfU, VMUL(LDK(KP195090322), TfV)); + Tg5 = VFNMS(LDK(KP195090322), TfU, VMUL(LDK(KP980785280), TfV)); + TfX = VADD(Tfk, Tfh); + TfY = VADD(Tfo, Tfp); + TfZ = VFNMS(LDK(KP195090322), TfY, VMUL(LDK(KP980785280), TfX)); + Tg6 = VFMA(LDK(KP195090322), TfX, VMUL(LDK(KP980785280), TfY)); + } + Tg0 = VSUB(TfW, TfZ); + Tgf = VADD(Tg5, Tg6); + Tg7 = VSUB(Tg5, Tg6); + Tgb = VADD(TfW, TfZ); + } + } + { + V Tg1, Tg8, Tgh, Tgi; + Tg1 = VADD(TfT, Tg0); + Tg8 = VBYI(VADD(Tg4, Tg7)); + ST(&(xo[WS(os, 100)]), VSUB(Tg1, Tg8), ovs, &(xo[0])); + ST(&(xo[WS(os, 28)]), VADD(Tg1, Tg8), ovs, &(xo[0])); + Tgh = VBYI(VADD(Tgc, Tgb)); + Tgi = VADD(Tge, Tgf); + ST(&(xo[WS(os, 4)]), VADD(Tgh, Tgi), ovs, &(xo[0])); + ST(&(xo[WS(os, 124)]), VSUB(Tgi, Tgh), ovs, &(xo[0])); + } + { + V Tg9, Tga, Tgd, Tgg; + Tg9 = VSUB(TfT, Tg0); + Tga = VBYI(VSUB(Tg7, Tg4)); + ST(&(xo[WS(os, 92)]), VSUB(Tg9, Tga), ovs, &(xo[0])); + ST(&(xo[WS(os, 36)]), VADD(Tg9, Tga), ovs, &(xo[0])); + Tgd = VBYI(VSUB(Tgb, Tgc)); + Tgg = VSUB(Tge, Tgf); + ST(&(xo[WS(os, 60)]), VADD(Tgd, Tgg), ovs, &(xo[0])); + ST(&(xo[WS(os, 68)]), VSUB(Tgg, Tgd), ovs, &(xo[0])); + } + } + { + V Tb7, Td8, TcI, Td0, Tcy, Tda, TcG, TcP, Tck, TcJ, TcB, TcF, TcW, Tdb, Td3; + V Td7; + { + V Tax, TcZ, Tb6, TcY, TaO, Tb5; + Tax = VSUB(Tah, Taw); + TcZ = VADD(Tcw, Tcr); + TaO = VFMA(LDK(KP831469612), TaI, VMUL(LDK(KP555570233), TaN)); + Tb5 = VFNMS(LDK(KP555570233), Tb4, VMUL(LDK(KP831469612), TaZ)); + Tb6 = VSUB(TaO, Tb5); + TcY = VADD(TaO, Tb5); + Tb7 = VSUB(Tax, Tb6); + Td8 = VADD(TcZ, TcY); + TcI = VADD(Tax, Tb6); + Td0 = VSUB(TcY, TcZ); + } + { + V Tcx, TcN, Tco, TcO, Tcm, Tcn; + Tcx = VSUB(Tcr, Tcw); + TcN = VADD(Tah, Taw); + Tcm = VFNMS(LDK(KP555570233), TaI, VMUL(LDK(KP831469612), TaN)); + Tcn = VFMA(LDK(KP555570233), TaZ, VMUL(LDK(KP831469612), Tb4)); + Tco = VSUB(Tcm, Tcn); + TcO = VADD(Tcm, Tcn); + Tcy = VSUB(Tco, Tcx); + Tda = VADD(TcN, TcO); + TcG = VADD(Tcx, Tco); + TcP = VSUB(TcN, TcO); + } + { + V TbI, Tcz, Tcj, TcA; + { + V Tby, TbH, Tc9, Tci; + Tby = VSUB(Tbm, Tbx); + TbH = VSUB(TbD, TbG); + TbI = VFMA(LDK(KP881921264), Tby, VMUL(LDK(KP471396736), TbH)); + Tcz = VFNMS(LDK(KP471396736), Tby, VMUL(LDK(KP881921264), TbH)); + Tc9 = VSUB(TbX, Tc8); + Tci = VSUB(Tce, Tch); + Tcj = VFNMS(LDK(KP471396736), Tci, VMUL(LDK(KP881921264), Tc9)); + TcA = VFMA(LDK(KP471396736), Tc9, VMUL(LDK(KP881921264), Tci)); + } + Tck = VSUB(TbI, Tcj); + TcJ = VADD(Tcz, TcA); + TcB = VSUB(Tcz, TcA); + TcF = VADD(TbI, Tcj); + } + { + V TcS, Td1, TcV, Td2; + { + V TcQ, TcR, TcT, TcU; + TcQ = VADD(Tbx, Tbm); + TcR = VADD(TbD, TbG); + TcS = VFMA(LDK(KP956940335), TcQ, VMUL(LDK(KP290284677), TcR)); + Td1 = VFNMS(LDK(KP290284677), TcQ, VMUL(LDK(KP956940335), TcR)); + TcT = VADD(Tc8, TbX); + TcU = VADD(Tce, Tch); + TcV = VFNMS(LDK(KP290284677), TcU, VMUL(LDK(KP956940335), TcT)); + Td2 = VFMA(LDK(KP290284677), TcT, VMUL(LDK(KP956940335), TcU)); + } + TcW = VSUB(TcS, TcV); + Tdb = VADD(Td1, Td2); + Td3 = VSUB(Td1, Td2); + Td7 = VADD(TcS, TcV); + } + { + V Tcl, TcC, Td9, Tdc; + Tcl = VADD(Tb7, Tck); + TcC = VBYI(VADD(Tcy, TcB)); + ST(&(xo[WS(os, 106)]), VSUB(Tcl, TcC), ovs, &(xo[0])); + ST(&(xo[WS(os, 22)]), VADD(Tcl, TcC), ovs, &(xo[0])); + Td9 = VBYI(VSUB(Td7, Td8)); + Tdc = VSUB(Tda, Tdb); + ST(&(xo[WS(os, 58)]), VADD(Td9, Tdc), ovs, &(xo[0])); + ST(&(xo[WS(os, 70)]), VSUB(Tdc, Td9), ovs, &(xo[0])); + } + { + V Tdd, Tde, TcD, TcE; + Tdd = VBYI(VADD(Td8, Td7)); + Tde = VADD(Tda, Tdb); + ST(&(xo[WS(os, 6)]), VADD(Tdd, Tde), ovs, &(xo[0])); + ST(&(xo[WS(os, 122)]), VSUB(Tde, Tdd), ovs, &(xo[0])); + TcD = VSUB(Tb7, Tck); + TcE = VBYI(VSUB(TcB, Tcy)); + ST(&(xo[WS(os, 86)]), VSUB(TcD, TcE), ovs, &(xo[0])); + ST(&(xo[WS(os, 42)]), VADD(TcD, TcE), ovs, &(xo[0])); + } + { + V TcH, TcK, TcX, Td4; + TcH = VBYI(VSUB(TcF, TcG)); + TcK = VSUB(TcI, TcJ); + ST(&(xo[WS(os, 54)]), VADD(TcH, TcK), ovs, &(xo[0])); + ST(&(xo[WS(os, 74)]), VSUB(TcK, TcH), ovs, &(xo[0])); + TcX = VADD(TcP, TcW); + Td4 = VBYI(VADD(Td0, Td3)); + ST(&(xo[WS(os, 102)]), VSUB(TcX, Td4), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VADD(TcX, Td4), ovs, &(xo[0])); + } + { + V Td5, Td6, TcL, TcM; + Td5 = VSUB(TcP, TcW); + Td6 = VBYI(VSUB(Td3, Td0)); + ST(&(xo[WS(os, 90)]), VSUB(Td5, Td6), ovs, &(xo[0])); + ST(&(xo[WS(os, 38)]), VADD(Td5, Td6), ovs, &(xo[0])); + TcL = VBYI(VADD(TcG, TcF)); + TcM = VADD(TcI, TcJ); + ST(&(xo[WS(os, 10)]), VADD(TcL, TcM), ovs, &(xo[0])); + ST(&(xo[WS(os, 118)]), VSUB(TcM, TcL), ovs, &(xo[0])); + } + } + { + V TdE, Tel, TdW, Tee, TdM, Teo, TdT, Tea, Tdt, TdX, TdP, TdU, Te7, Tep, Teh; + V Tem; + { + V TdD, Tec, TdA, Ted, Tdw, Tdz; + TdD = VADD(TdB, TdC); + Tec = VSUB(TdG, TdH); + Tdw = VFMA(LDK(KP980785280), Tdu, VMUL(LDK(KP195090322), Tdv)); + Tdz = VFNMS(LDK(KP195090322), Tdy, VMUL(LDK(KP980785280), Tdx)); + TdA = VADD(Tdw, Tdz); + Ted = VSUB(Tdw, Tdz); + TdE = VSUB(TdA, TdD); + Tel = VADD(Tec, Ted); + TdW = VADD(TdD, TdA); + Tee = VSUB(Tec, Ted); + } + { + V TdI, Te9, TdL, Te8, TdJ, TdK; + TdI = VADD(TdG, TdH); + Te9 = VSUB(TdC, TdB); + TdJ = VFNMS(LDK(KP195090322), Tdu, VMUL(LDK(KP980785280), Tdv)); + TdK = VFMA(LDK(KP195090322), Tdx, VMUL(LDK(KP980785280), Tdy)); + TdL = VADD(TdJ, TdK); + Te8 = VSUB(TdJ, TdK); + TdM = VSUB(TdI, TdL); + Teo = VADD(Te9, Te8); + TdT = VADD(TdI, TdL); + Tea = VSUB(Te8, Te9); + } + { + V Tdl, TdN, Tds, TdO; + { + V Tdh, Tdk, Tdo, Tdr; + Tdh = VADD(Tdf, Tdg); + Tdk = VADD(Tdi, Tdj); + Tdl = VFNMS(LDK(KP098017140), Tdk, VMUL(LDK(KP995184726), Tdh)); + TdN = VFMA(LDK(KP098017140), Tdh, VMUL(LDK(KP995184726), Tdk)); + Tdo = VADD(Tdm, Tdn); + Tdr = VADD(Tdp, Tdq); + Tds = VFMA(LDK(KP995184726), Tdo, VMUL(LDK(KP098017140), Tdr)); + TdO = VFNMS(LDK(KP098017140), Tdo, VMUL(LDK(KP995184726), Tdr)); + } + Tdt = VSUB(Tdl, Tds); + TdX = VADD(TdN, TdO); + TdP = VSUB(TdN, TdO); + TdU = VADD(Tdl, Tds); + } + { + V Te3, Tef, Te6, Teg; + { + V Te1, Te2, Te4, Te5; + Te1 = VSUB(Tdf, Tdg); + Te2 = VSUB(Tdj, Tdi); + Te3 = VFNMS(LDK(KP634393284), Te2, VMUL(LDK(KP773010453), Te1)); + Tef = VFMA(LDK(KP634393284), Te1, VMUL(LDK(KP773010453), Te2)); + Te4 = VSUB(Tdm, Tdn); + Te5 = VSUB(Tdq, Tdp); + Te6 = VFMA(LDK(KP773010453), Te4, VMUL(LDK(KP634393284), Te5)); + Teg = VFNMS(LDK(KP634393284), Te4, VMUL(LDK(KP773010453), Te5)); + } + Te7 = VSUB(Te3, Te6); + Tep = VADD(Tef, Teg); + Teh = VSUB(Tef, Teg); + Tem = VADD(Te3, Te6); + } + { + V TdF, TdQ, Ten, Teq; + TdF = VBYI(VSUB(Tdt, TdE)); + TdQ = VSUB(TdM, TdP); + ST(&(xo[WS(os, 34)]), VADD(TdF, TdQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 94)]), VSUB(TdQ, TdF), ovs, &(xo[0])); + Ten = VADD(Tel, Tem); + Teq = VBYI(VADD(Teo, Tep)); + ST(&(xo[WS(os, 114)]), VSUB(Ten, Teq), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VADD(Ten, Teq), ovs, &(xo[0])); + } + { + V Ter, Tes, TdR, TdS; + Ter = VSUB(Tel, Tem); + Tes = VBYI(VSUB(Tep, Teo)); + ST(&(xo[WS(os, 78)]), VSUB(Ter, Tes), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VADD(Ter, Tes), ovs, &(xo[0])); + TdR = VBYI(VADD(TdE, Tdt)); + TdS = VADD(TdM, TdP); + ST(&(xo[WS(os, 30)]), VADD(TdR, TdS), ovs, &(xo[0])); + ST(&(xo[WS(os, 98)]), VSUB(TdS, TdR), ovs, &(xo[0])); + } + { + V TdV, TdY, Teb, Tei; + TdV = VADD(TdT, TdU); + TdY = VBYI(VADD(TdW, TdX)); + ST(&(xo[WS(os, 126)]), VSUB(TdV, TdY), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(TdV, TdY), ovs, &(xo[0])); + Teb = VBYI(VSUB(Te7, Tea)); + Tei = VSUB(Tee, Teh); + ST(&(xo[WS(os, 46)]), VADD(Teb, Tei), ovs, &(xo[0])); + ST(&(xo[WS(os, 82)]), VSUB(Tei, Teb), ovs, &(xo[0])); + } + { + V Tej, Tek, TdZ, Te0; + Tej = VBYI(VADD(Tea, Te7)); + Tek = VADD(Tee, Teh); + ST(&(xo[WS(os, 18)]), VADD(Tej, Tek), ovs, &(xo[0])); + ST(&(xo[WS(os, 110)]), VSUB(Tek, Tej), ovs, &(xo[0])); + TdZ = VSUB(TdT, TdU); + Te0 = VBYI(VSUB(TdX, TdW)); + ST(&(xo[WS(os, 66)]), VSUB(TdZ, Te0), ovs, &(xo[0])); + ST(&(xo[WS(os, 62)]), VADD(TdZ, Te0), ovs, &(xo[0])); + } + } + { + V T7z, T8n, T8f, T8k, T8x, T8P, T8H, T8M, T80, T8L, T8O, T8c, T8j, T8A, T8E; + V T8m; + { + V T7f, T8d, T7y, T8e; + { + V T77, T7e, T7q, T7x; + T77 = VADD(T6Z, T76); + T7e = VADD(T7a, T7d); + T7f = VFNMS(LDK(KP336889853), T7e, VMUL(LDK(KP941544065), T77)); + T8d = VFMA(LDK(KP336889853), T77, VMUL(LDK(KP941544065), T7e)); + T7q = VADD(T7i, T7p); + T7x = VADD(T7t, T7w); + T7y = VFMA(LDK(KP941544065), T7q, VMUL(LDK(KP336889853), T7x)); + T8e = VFNMS(LDK(KP336889853), T7q, VMUL(LDK(KP941544065), T7x)); + } + T7z = VSUB(T7f, T7y); + T8n = VADD(T8d, T8e); + T8f = VSUB(T8d, T8e); + T8k = VADD(T7f, T7y); + } + { + V T8t, T8F, T8w, T8G; + { + V T8r, T8s, T8u, T8v; + T8r = VSUB(T6Z, T76); + T8s = VSUB(T7d, T7a); + T8t = VFNMS(LDK(KP427555093), T8s, VMUL(LDK(KP903989293), T8r)); + T8F = VFMA(LDK(KP427555093), T8r, VMUL(LDK(KP903989293), T8s)); + T8u = VSUB(T7i, T7p); + T8v = VSUB(T7w, T7t); + T8w = VFMA(LDK(KP903989293), T8u, VMUL(LDK(KP427555093), T8v)); + T8G = VFNMS(LDK(KP427555093), T8u, VMUL(LDK(KP903989293), T8v)); + } + T8x = VSUB(T8t, T8w); + T8P = VADD(T8F, T8G); + T8H = VSUB(T8F, T8G); + T8M = VADD(T8t, T8w); + } + { + V T7Z, T8z, T88, T8C, T7O, T8D, T8b, T8y, T7Y, T87; + T7Y = VSUB(T7U, T7X); + T7Z = VADD(T7R, T7Y); + T8z = VSUB(T7Y, T7R); + T87 = VSUB(T85, T86); + T88 = VADD(T84, T87); + T8C = VSUB(T84, T87); + { + V T7G, T7N, T89, T8a; + T7G = VFMA(LDK(KP634393284), T7C, VMUL(LDK(KP773010453), T7F)); + T7N = VFNMS(LDK(KP634393284), T7M, VMUL(LDK(KP773010453), T7J)); + T7O = VADD(T7G, T7N); + T8D = VSUB(T7G, T7N); + T89 = VFNMS(LDK(KP634393284), T7F, VMUL(LDK(KP773010453), T7C)); + T8a = VFMA(LDK(KP773010453), T7M, VMUL(LDK(KP634393284), T7J)); + T8b = VADD(T89, T8a); + T8y = VSUB(T89, T8a); + } + T80 = VSUB(T7O, T7Z); + T8L = VADD(T8C, T8D); + T8O = VADD(T8z, T8y); + T8c = VSUB(T88, T8b); + T8j = VADD(T88, T8b); + T8A = VSUB(T8y, T8z); + T8E = VSUB(T8C, T8D); + T8m = VADD(T7Z, T7O); + } + { + V T81, T8g, T8N, T8Q; + T81 = VBYI(VSUB(T7z, T80)); + T8g = VSUB(T8c, T8f); + ST(&(xo[WS(os, 39)]), VADD(T81, T8g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 89)]), VSUB(T8g, T81), ovs, &(xo[WS(os, 1)])); + T8N = VADD(T8L, T8M); + T8Q = VBYI(VADD(T8O, T8P)); + ST(&(xo[WS(os, 119)]), VSUB(T8N, T8Q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(T8N, T8Q), ovs, &(xo[WS(os, 1)])); + } + { + V T8R, T8S, T8h, T8i; + T8R = VSUB(T8L, T8M); + T8S = VBYI(VSUB(T8P, T8O)); + ST(&(xo[WS(os, 73)]), VSUB(T8R, T8S), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VADD(T8R, T8S), ovs, &(xo[WS(os, 1)])); + T8h = VBYI(VADD(T80, T7z)); + T8i = VADD(T8c, T8f); + ST(&(xo[WS(os, 25)]), VADD(T8h, T8i), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 103)]), VSUB(T8i, T8h), ovs, &(xo[WS(os, 1)])); + } + { + V T8l, T8o, T8B, T8I; + T8l = VADD(T8j, T8k); + T8o = VBYI(VADD(T8m, T8n)); + ST(&(xo[WS(os, 121)]), VSUB(T8l, T8o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(T8l, T8o), ovs, &(xo[WS(os, 1)])); + T8B = VBYI(VSUB(T8x, T8A)); + T8I = VSUB(T8E, T8H); + ST(&(xo[WS(os, 41)]), VADD(T8B, T8I), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 87)]), VSUB(T8I, T8B), ovs, &(xo[WS(os, 1)])); + } + { + V T8J, T8K, T8p, T8q; + T8J = VBYI(VADD(T8A, T8x)); + T8K = VADD(T8E, T8H); + ST(&(xo[WS(os, 23)]), VADD(T8J, T8K), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 105)]), VSUB(T8K, T8J), ovs, &(xo[WS(os, 1)])); + T8p = VSUB(T8j, T8k); + T8q = VBYI(VSUB(T8n, T8m)); + ST(&(xo[WS(os, 71)]), VSUB(T8p, T8q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 57)]), VADD(T8p, T8q), ovs, &(xo[WS(os, 1)])); + } + } + { + V T2v, T5d, T55, T5a, T5n, T5F, T5x, T5C, T4K, T5B, T5E, T52, T59, T5q, T5u; + V T5c; + { + V T1f, T53, T2u, T54; + { + V T11, T1e, T2g, T2t; + T11 = VADD(Tr, T10); + T1e = VADD(T1a, T1d); + T1f = VFNMS(LDK(KP242980179), T1e, VMUL(LDK(KP970031253), T11)); + T53 = VFMA(LDK(KP242980179), T11, VMUL(LDK(KP970031253), T1e)); + T2g = VADD(T1G, T2f); + T2t = VADD(T2p, T2s); + T2u = VFMA(LDK(KP970031253), T2g, VMUL(LDK(KP242980179), T2t)); + T54 = VFNMS(LDK(KP242980179), T2g, VMUL(LDK(KP970031253), T2t)); + } + T2v = VSUB(T1f, T2u); + T5d = VADD(T53, T54); + T55 = VSUB(T53, T54); + T5a = VADD(T1f, T2u); + } + { + V T5j, T5v, T5m, T5w; + { + V T5h, T5i, T5k, T5l; + T5h = VSUB(Tr, T10); + T5i = VSUB(T1d, T1a); + T5j = VFNMS(LDK(KP514102744), T5i, VMUL(LDK(KP857728610), T5h)); + T5v = VFMA(LDK(KP514102744), T5h, VMUL(LDK(KP857728610), T5i)); + T5k = VSUB(T1G, T2f); + T5l = VSUB(T2s, T2p); + T5m = VFMA(LDK(KP857728610), T5k, VMUL(LDK(KP514102744), T5l)); + T5w = VFNMS(LDK(KP514102744), T5k, VMUL(LDK(KP857728610), T5l)); + } + T5n = VSUB(T5j, T5m); + T5F = VADD(T5v, T5w); + T5x = VSUB(T5v, T5w); + T5C = VADD(T5j, T5m); + } + { + V T4J, T5p, T4Y, T5s, T3I, T5t, T51, T5o, T4I, T4X; + T4I = VSUB(T4q, T4H); + T4J = VADD(T49, T4I); + T5p = VSUB(T4I, T49); + T4X = VSUB(T4V, T4W); + T4Y = VADD(T4U, T4X); + T5s = VSUB(T4U, T4X); + { + V T36, T3H, T4Z, T50; + T36 = VFMA(LDK(KP881921264), T2W, VMUL(LDK(KP471396736), T35)); + T3H = VFNMS(LDK(KP471396736), T3G, VMUL(LDK(KP881921264), T3x)); + T3I = VADD(T36, T3H); + T5t = VSUB(T36, T3H); + T4Z = VFNMS(LDK(KP471396736), T2W, VMUL(LDK(KP881921264), T35)); + T50 = VFMA(LDK(KP471396736), T3x, VMUL(LDK(KP881921264), T3G)); + T51 = VADD(T4Z, T50); + T5o = VSUB(T4Z, T50); + } + T4K = VSUB(T3I, T4J); + T5B = VADD(T5s, T5t); + T5E = VADD(T5p, T5o); + T52 = VSUB(T4Y, T51); + T59 = VADD(T4Y, T51); + T5q = VSUB(T5o, T5p); + T5u = VSUB(T5s, T5t); + T5c = VADD(T4J, T3I); + } + { + V T4L, T56, T5D, T5G; + T4L = VBYI(VSUB(T2v, T4K)); + T56 = VSUB(T52, T55); + ST(&(xo[WS(os, 37)]), VADD(T4L, T56), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 91)]), VSUB(T56, T4L), ovs, &(xo[WS(os, 1)])); + T5D = VADD(T5B, T5C); + T5G = VBYI(VADD(T5E, T5F)); + ST(&(xo[WS(os, 117)]), VSUB(T5D, T5G), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VADD(T5D, T5G), ovs, &(xo[WS(os, 1)])); + } + { + V T5H, T5I, T57, T58; + T5H = VSUB(T5B, T5C); + T5I = VBYI(VSUB(T5F, T5E)); + ST(&(xo[WS(os, 75)]), VSUB(T5H, T5I), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 53)]), VADD(T5H, T5I), ovs, &(xo[WS(os, 1)])); + T57 = VBYI(VADD(T4K, T2v)); + T58 = VADD(T52, T55); + ST(&(xo[WS(os, 27)]), VADD(T57, T58), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 101)]), VSUB(T58, T57), ovs, &(xo[WS(os, 1)])); + } + { + V T5b, T5e, T5r, T5y; + T5b = VADD(T59, T5a); + T5e = VBYI(VADD(T5c, T5d)); + ST(&(xo[WS(os, 123)]), VSUB(T5b, T5e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(T5b, T5e), ovs, &(xo[WS(os, 1)])); + T5r = VBYI(VSUB(T5n, T5q)); + T5y = VSUB(T5u, T5x); + ST(&(xo[WS(os, 43)]), VADD(T5r, T5y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 85)]), VSUB(T5y, T5r), ovs, &(xo[WS(os, 1)])); + } + { + V T5z, T5A, T5f, T5g; + T5z = VBYI(VADD(T5q, T5n)); + T5A = VADD(T5u, T5x); + ST(&(xo[WS(os, 21)]), VADD(T5z, T5A), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 107)]), VSUB(T5A, T5z), ovs, &(xo[WS(os, 1)])); + T5f = VSUB(T59, T5a); + T5g = VBYI(VSUB(T5d, T5c)); + ST(&(xo[WS(os, 69)]), VSUB(T5f, T5g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 59)]), VADD(T5f, T5g), ovs, &(xo[WS(os, 1)])); + } + } + { + V T9i, T9B, T9t, T9x, T9O, Ta3, T9V, T9Z, T93, Ta0, Ta2, T9q, T9y, T9H, T9S; + V T9A; + { + V T9a, T9r, T9h, T9s; + { + V T96, T99, T9d, T9g; + T96 = VSUB(T94, T95); + T99 = VSUB(T97, T98); + T9a = VFMA(LDK(KP740951125), T96, VMUL(LDK(KP671558954), T99)); + T9r = VFNMS(LDK(KP671558954), T96, VMUL(LDK(KP740951125), T99)); + T9d = VSUB(T9b, T9c); + T9g = VSUB(T9e, T9f); + T9h = VFNMS(LDK(KP671558954), T9g, VMUL(LDK(KP740951125), T9d)); + T9s = VFMA(LDK(KP671558954), T9d, VMUL(LDK(KP740951125), T9g)); + } + T9i = VSUB(T9a, T9h); + T9B = VADD(T9r, T9s); + T9t = VSUB(T9r, T9s); + T9x = VADD(T9a, T9h); + } + { + V T9K, T9T, T9N, T9U; + { + V T9I, T9J, T9L, T9M; + T9I = VADD(T95, T94); + T9J = VADD(T97, T98); + T9K = VFMA(LDK(KP998795456), T9I, VMUL(LDK(KP049067674), T9J)); + T9T = VFNMS(LDK(KP049067674), T9I, VMUL(LDK(KP998795456), T9J)); + T9L = VADD(T9c, T9b); + T9M = VADD(T9e, T9f); + T9N = VFNMS(LDK(KP049067674), T9M, VMUL(LDK(KP998795456), T9L)); + T9U = VFMA(LDK(KP049067674), T9L, VMUL(LDK(KP998795456), T9M)); + } + T9O = VSUB(T9K, T9N); + Ta3 = VADD(T9T, T9U); + T9V = VSUB(T9T, T9U); + T9Z = VADD(T9K, T9N); + } + { + V T8V, T9F, T9p, T9R, T92, T9Q, T9m, T9G, T8U, T9n; + T8U = VADD(T7U, T7X); + T8V = VSUB(T8T, T8U); + T9F = VADD(T8T, T8U); + T9n = VADD(T85, T86); + T9p = VSUB(T9n, T9o); + T9R = VADD(T9o, T9n); + { + V T8Y, T91, T9k, T9l; + T8Y = VFMA(LDK(KP098017140), T8W, VMUL(LDK(KP995184726), T8X)); + T91 = VFNMS(LDK(KP098017140), T90, VMUL(LDK(KP995184726), T8Z)); + T92 = VSUB(T8Y, T91); + T9Q = VADD(T8Y, T91); + T9k = VFNMS(LDK(KP098017140), T8X, VMUL(LDK(KP995184726), T8W)); + T9l = VFMA(LDK(KP995184726), T90, VMUL(LDK(KP098017140), T8Z)); + T9m = VSUB(T9k, T9l); + T9G = VADD(T9k, T9l); + } + T93 = VSUB(T8V, T92); + Ta0 = VADD(T9R, T9Q); + Ta2 = VADD(T9F, T9G); + T9q = VSUB(T9m, T9p); + T9y = VADD(T9p, T9m); + T9H = VSUB(T9F, T9G); + T9S = VSUB(T9Q, T9R); + T9A = VADD(T8V, T92); + } + { + V T9j, T9u, Ta1, Ta4; + T9j = VADD(T93, T9i); + T9u = VBYI(VADD(T9q, T9t)); + ST(&(xo[WS(os, 111)]), VSUB(T9j, T9u), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 17)]), VADD(T9j, T9u), ovs, &(xo[WS(os, 1)])); + Ta1 = VBYI(VSUB(T9Z, Ta0)); + Ta4 = VSUB(Ta2, Ta3); + ST(&(xo[WS(os, 63)]), VADD(Ta1, Ta4), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 65)]), VSUB(Ta4, Ta1), ovs, &(xo[WS(os, 1)])); + } + { + V Ta5, Ta6, T9v, T9w; + Ta5 = VBYI(VADD(Ta0, T9Z)); + Ta6 = VADD(Ta2, Ta3); + ST(&(xo[WS(os, 1)]), VADD(Ta5, Ta6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 127)]), VSUB(Ta6, Ta5), ovs, &(xo[WS(os, 1)])); + T9v = VSUB(T93, T9i); + T9w = VBYI(VSUB(T9t, T9q)); + ST(&(xo[WS(os, 81)]), VSUB(T9v, T9w), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 47)]), VADD(T9v, T9w), ovs, &(xo[WS(os, 1)])); + } + { + V T9z, T9C, T9P, T9W; + T9z = VBYI(VSUB(T9x, T9y)); + T9C = VSUB(T9A, T9B); + ST(&(xo[WS(os, 49)]), VADD(T9z, T9C), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 79)]), VSUB(T9C, T9z), ovs, &(xo[WS(os, 1)])); + T9P = VADD(T9H, T9O); + T9W = VBYI(VADD(T9S, T9V)); + ST(&(xo[WS(os, 97)]), VSUB(T9P, T9W), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 31)]), VADD(T9P, T9W), ovs, &(xo[WS(os, 1)])); + } + { + V T9X, T9Y, T9D, T9E; + T9X = VSUB(T9H, T9O); + T9Y = VBYI(VSUB(T9V, T9S)); + ST(&(xo[WS(os, 95)]), VSUB(T9X, T9Y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 33)]), VADD(T9X, T9Y), ovs, &(xo[WS(os, 1)])); + T9D = VBYI(VADD(T9y, T9x)); + T9E = VADD(T9A, T9B); + ST(&(xo[WS(os, 15)]), VADD(T9D, T9E), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 113)]), VSUB(T9E, T9D), ovs, &(xo[WS(os, 1)])); + } + } + { + V T68, T6r, T6j, T6n, T6E, T6T, T6L, T6P, T5T, T6Q, T6S, T6g, T6o, T6x, T6I; + V T6q; + { + V T60, T6h, T67, T6i; + { + V T5W, T5Z, T63, T66; + T5W = VSUB(T5U, T5V); + T5Z = VSUB(T5X, T5Y); + T60 = VFMA(LDK(KP803207531), T5W, VMUL(LDK(KP595699304), T5Z)); + T6h = VFNMS(LDK(KP595699304), T5W, VMUL(LDK(KP803207531), T5Z)); + T63 = VSUB(T61, T62); + T66 = VSUB(T64, T65); + T67 = VFNMS(LDK(KP595699304), T66, VMUL(LDK(KP803207531), T63)); + T6i = VFMA(LDK(KP595699304), T63, VMUL(LDK(KP803207531), T66)); + } + T68 = VSUB(T60, T67); + T6r = VADD(T6h, T6i); + T6j = VSUB(T6h, T6i); + T6n = VADD(T60, T67); + } + { + V T6A, T6J, T6D, T6K; + { + V T6y, T6z, T6B, T6C; + T6y = VADD(T5V, T5U); + T6z = VADD(T5X, T5Y); + T6A = VFMA(LDK(KP989176509), T6y, VMUL(LDK(KP146730474), T6z)); + T6J = VFNMS(LDK(KP146730474), T6y, VMUL(LDK(KP989176509), T6z)); + T6B = VADD(T62, T61); + T6C = VADD(T64, T65); + T6D = VFNMS(LDK(KP146730474), T6C, VMUL(LDK(KP989176509), T6B)); + T6K = VFMA(LDK(KP146730474), T6B, VMUL(LDK(KP989176509), T6C)); + } + T6E = VSUB(T6A, T6D); + T6T = VADD(T6J, T6K); + T6L = VSUB(T6J, T6K); + T6P = VADD(T6A, T6D); + } + { + V T5L, T6v, T6f, T6H, T5S, T6G, T6c, T6w, T5K, T6d; + T5K = VADD(T4q, T4H); + T5L = VSUB(T5J, T5K); + T6v = VADD(T5J, T5K); + T6d = VADD(T4V, T4W); + T6f = VSUB(T6d, T6e); + T6H = VADD(T6e, T6d); + { + V T5O, T5R, T6a, T6b; + T5O = VFMA(LDK(KP956940335), T5M, VMUL(LDK(KP290284677), T5N)); + T5R = VFNMS(LDK(KP290284677), T5Q, VMUL(LDK(KP956940335), T5P)); + T5S = VSUB(T5O, T5R); + T6G = VADD(T5O, T5R); + T6a = VFNMS(LDK(KP290284677), T5M, VMUL(LDK(KP956940335), T5N)); + T6b = VFMA(LDK(KP290284677), T5P, VMUL(LDK(KP956940335), T5Q)); + T6c = VSUB(T6a, T6b); + T6w = VADD(T6a, T6b); + } + T5T = VSUB(T5L, T5S); + T6Q = VADD(T6H, T6G); + T6S = VADD(T6v, T6w); + T6g = VSUB(T6c, T6f); + T6o = VADD(T6f, T6c); + T6x = VSUB(T6v, T6w); + T6I = VSUB(T6G, T6H); + T6q = VADD(T5L, T5S); + } + { + V T69, T6k, T6R, T6U; + T69 = VADD(T5T, T68); + T6k = VBYI(VADD(T6g, T6j)); + ST(&(xo[WS(os, 109)]), VSUB(T69, T6k), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 19)]), VADD(T69, T6k), ovs, &(xo[WS(os, 1)])); + T6R = VBYI(VSUB(T6P, T6Q)); + T6U = VSUB(T6S, T6T); + ST(&(xo[WS(os, 61)]), VADD(T6R, T6U), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 67)]), VSUB(T6U, T6R), ovs, &(xo[WS(os, 1)])); + } + { + V T6V, T6W, T6l, T6m; + T6V = VBYI(VADD(T6Q, T6P)); + T6W = VADD(T6S, T6T); + ST(&(xo[WS(os, 3)]), VADD(T6V, T6W), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 125)]), VSUB(T6W, T6V), ovs, &(xo[WS(os, 1)])); + T6l = VSUB(T5T, T68); + T6m = VBYI(VSUB(T6j, T6g)); + ST(&(xo[WS(os, 83)]), VSUB(T6l, T6m), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 45)]), VADD(T6l, T6m), ovs, &(xo[WS(os, 1)])); + } + { + V T6p, T6s, T6F, T6M; + T6p = VBYI(VSUB(T6n, T6o)); + T6s = VSUB(T6q, T6r); + ST(&(xo[WS(os, 51)]), VADD(T6p, T6s), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 77)]), VSUB(T6s, T6p), ovs, &(xo[WS(os, 1)])); + T6F = VADD(T6x, T6E); + T6M = VBYI(VADD(T6I, T6L)); + ST(&(xo[WS(os, 99)]), VSUB(T6F, T6M), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 29)]), VADD(T6F, T6M), ovs, &(xo[WS(os, 1)])); + } + { + V T6N, T6O, T6t, T6u; + T6N = VSUB(T6x, T6E); + T6O = VBYI(VSUB(T6L, T6I)); + ST(&(xo[WS(os, 93)]), VSUB(T6N, T6O), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 35)]), VADD(T6N, T6O), ovs, &(xo[WS(os, 1)])); + T6t = VBYI(VADD(T6o, T6n)); + T6u = VADD(T6q, T6r); + ST(&(xo[WS(os, 13)]), VADD(T6t, T6u), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 115)]), VSUB(T6u, T6t), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 128, XSIMD_STRING("n1bv_128"), {938, 186, 144, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_128) (planner *p) { + X(kdft_register) (p, n1bv_128, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_13.c new file mode 100644 index 000000000..ac328f558 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_13.c @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 13 -name n1bv_13 -include dft/simd/n1b.h */ + +/* + * This function contains 88 FP additions, 63 FP multiplications, + * (or, 31 additions, 6 multiplications, 57 fused multiply/add), + * 63 stack variables, 23 constants, and 26 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_13(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP904176221, +0.904176221990848204433795481776887926501523162); + DVK(KP575140729, +0.575140729474003121368385547455453388461001608); + DVK(KP957805992, +0.957805992594665126462521754605754580515587217); + DVK(KP600477271, +0.600477271932665282925769253334763009352012849); + DVK(KP516520780, +0.516520780623489722840901288569017135705033622); + DVK(KP581704778, +0.581704778510515730456870384989698884939833902); + DVK(KP300462606, +0.300462606288665774426601772289207995520941381); + DVK(KP503537032, +0.503537032863766627246873853868466977093348562); + DVK(KP251768516, +0.251768516431883313623436926934233488546674281); + DVK(KP301479260, +0.301479260047709873958013540496673347309208464); + DVK(KP083333333, +0.083333333333333333333333333333333333333333333); + DVK(KP859542535, +0.859542535098774820163672132761689612766401925); + DVK(KP514918778, +0.514918778086315755491789696138117261566051239); + DVK(KP522026385, +0.522026385161275033714027226654165028300441940); + DVK(KP853480001, +0.853480001859823990758994934970528322872359049); + DVK(KP612264650, +0.612264650376756543746494474777125408779395514); + DVK(KP038632954, +0.038632954644348171955506895830342264440241080); + DVK(KP302775637, +0.302775637731994646559610633735247973125648287); + DVK(KP769338817, +0.769338817572980603471413688209101117038278899); + DVK(KP686558370, +0.686558370781754340655719594850823015421401653); + DVK(KP226109445, +0.226109445035782405468510155372505010481906348); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(26, is), MAKE_VOLATILE_STRIDE(26, os)) { + V T1, TX, TY, To, TH, TR, TU, TB, TE, Tw, TF, TM, TT; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V Tf, TN, Tb, Ty, Tq, T6, Tx, Tr, Ti, Tt, Tl, Tu, Tm, TO, Td; + V Te, Tc, Tn; + Td = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + TN = VSUB(Td, Te); + { + V T7, T8, T9, Ta; + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Tb = VADD(T7, Ta); + Ty = VFMS(LDK(KP500000000), Ta, T7); + Tq = VSUB(T8, T9); + } + { + V T2, T3, T4, T5; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T4 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T5 = VADD(T3, T4); + T6 = VADD(T2, T5); + Tx = VFNMS(LDK(KP500000000), T5, T2); + Tr = VSUB(T4, T3); + } + { + V Tg, Th, Tj, Tk; + Tg = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = VADD(Tg, Th); + Tt = VSUB(Tg, Th); + Tj = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tk = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tl = VADD(Tj, Tk); + Tu = VSUB(Tj, Tk); + } + Tm = VADD(Ti, Tl); + TO = VADD(Tt, Tu); + TX = VSUB(T6, Tb); + TY = VADD(TN, TO); + Tc = VADD(T6, Tb); + Tn = VADD(Tf, Tm); + To = VADD(Tc, Tn); + TH = VSUB(Tc, Tn); + { + V TP, TQ, Tz, TA; + TP = VFNMS(LDK(KP500000000), TO, TN); + TQ = VADD(Tr, Tq); + TR = VFMA(LDK(KP866025403), TQ, TP); + TU = VFNMS(LDK(KP866025403), TQ, TP); + Tz = VSUB(Tx, Ty); + TA = VFNMS(LDK(KP500000000), Tm, Tf); + TB = VADD(Tz, TA); + TE = VSUB(Tz, TA); + } + { + V Ts, Tv, TK, TL; + Ts = VSUB(Tq, Tr); + Tv = VSUB(Tt, Tu); + Tw = VADD(Ts, Tv); + TF = VSUB(Ts, Tv); + TK = VADD(Tx, Ty); + TL = VSUB(Ti, Tl); + TM = VFMA(LDK(KP866025403), TL, TK); + TT = VFNMS(LDK(KP866025403), TL, TK); + } + } + ST(&(xo[0]), VADD(T1, To), ovs, &(xo[0])); + { + V T1c, T1k, T15, T14, T1e, T1n, TZ, TW, T1f, T1m, TD, T1j, TI, T19, TS; + V TV; + { + V T1a, T1b, T12, T13; + T1a = VFNMS(LDK(KP226109445), Tw, TB); + T1b = VFMA(LDK(KP686558370), TE, TF); + T1c = VFNMS(LDK(KP769338817), T1b, T1a); + T1k = VFMA(LDK(KP769338817), T1b, T1a); + T15 = VFNMS(LDK(KP302775637), TX, TY); + T12 = VFMA(LDK(KP038632954), TM, TR); + T13 = VFMA(LDK(KP612264650), TT, TU); + T14 = VFNMS(LDK(KP853480001), T13, T12); + T1e = VFNMS(LDK(KP522026385), T14, T15); + T1n = VFMA(LDK(KP853480001), T13, T12); + } + TZ = VFMA(LDK(KP302775637), TY, TX); + TS = VFNMS(LDK(KP038632954), TR, TM); + TV = VFNMS(LDK(KP612264650), TU, TT); + TW = VFNMS(LDK(KP853480001), TV, TS); + T1f = VFMA(LDK(KP853480001), TV, TS); + T1m = VFNMS(LDK(KP522026385), TW, TZ); + { + V TG, T18, Tp, TC, T17; + TG = VFNMS(LDK(KP514918778), TF, TE); + T18 = VFNMS(LDK(KP859542535), TG, TH); + Tp = VFNMS(LDK(KP083333333), To, T1); + TC = VFMA(LDK(KP301479260), TB, Tw); + T17 = VFNMS(LDK(KP251768516), TC, Tp); + TD = VFMA(LDK(KP503537032), TC, Tp); + T1j = VFNMS(LDK(KP300462606), T18, T17); + TI = VFMA(LDK(KP581704778), TH, TG); + T19 = VFMA(LDK(KP300462606), T18, T17); + } + { + V TJ, T10, T1l, T1o; + TJ = VFNMS(LDK(KP516520780), TI, TD); + T10 = VMUL(LDK(KP600477271), VFMA(LDK(KP957805992), TZ, TW)); + ST(&(xo[WS(os, 5)]), VFMAI(T10, TJ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VFNMSI(T10, TJ), ovs, &(xo[0])); + { + V T11, T16, T1p, T1q; + T11 = VFMA(LDK(KP516520780), TI, TD); + T16 = VMUL(LDK(KP600477271), VFMA(LDK(KP957805992), T15, T14)); + ST(&(xo[WS(os, 1)]), VFNMSI(T16, T11), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VFMAI(T16, T11), ovs, &(xo[0])); + T1p = VFMA(LDK(KP503537032), T1k, T1j); + T1q = VMUL(LDK(KP575140729), VFMA(LDK(KP904176221), T1n, T1m)); + ST(&(xo[WS(os, 2)]), VFMAI(T1q, T1p), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VFNMSI(T1q, T1p), ovs, &(xo[WS(os, 1)])); + } + T1l = VFNMS(LDK(KP503537032), T1k, T1j); + T1o = VMUL(LDK(KP575140729), VFNMS(LDK(KP904176221), T1n, T1m)); + ST(&(xo[WS(os, 6)]), VFMAI(T1o, T1l), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFNMSI(T1o, T1l), ovs, &(xo[WS(os, 1)])); + { + V T1h, T1i, T1d, T1g; + T1h = VFMA(LDK(KP503537032), T1c, T19); + T1i = VMUL(LDK(KP575140729), VFNMS(LDK(KP904176221), T1f, T1e)); + ST(&(xo[WS(os, 3)]), VFNMSI(T1i, T1h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VFMAI(T1i, T1h), ovs, &(xo[0])); + T1d = VFNMS(LDK(KP503537032), T1c, T19); + T1g = VMUL(LDK(KP575140729), VFMA(LDK(KP904176221), T1f, T1e)); + ST(&(xo[WS(os, 4)]), VFMAI(T1g, T1d), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFNMSI(T1g, T1d), ovs, &(xo[WS(os, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 13, XSIMD_STRING("n1bv_13"), {31, 6, 57, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_13) (planner *p) { + X(kdft_register) (p, n1bv_13, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 13 -name n1bv_13 -include dft/simd/n1b.h */ + +/* + * This function contains 88 FP additions, 34 FP multiplications, + * (or, 69 additions, 15 multiplications, 19 fused multiply/add), + * 60 stack variables, 20 constants, and 26 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_13(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DVK(KP083333333, +0.083333333333333333333333333333333333333333333); + DVK(KP075902986, +0.075902986037193865983102897245103540356428373); + DVK(KP251768516, +0.251768516431883313623436926934233488546674281); + DVK(KP132983124, +0.132983124607418643793760531921092974399165133); + DVK(KP258260390, +0.258260390311744861420450644284508567852516811); + DVK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DVK(KP300238635, +0.300238635966332641462884626667381504676006424); + DVK(KP011599105, +0.011599105605768290721655456654083252189827041); + DVK(KP256247671, +0.256247671582936600958684654061725059144125175); + DVK(KP156891391, +0.156891391051584611046832726756003269660212636); + DVK(KP174138601, +0.174138601152135905005660794929264742616964676); + DVK(KP575140729, +0.575140729474003121368385547455453388461001608); + DVK(KP503537032, +0.503537032863766627246873853868466977093348562); + DVK(KP113854479, +0.113854479055790798974654345867655310534642560); + DVK(KP265966249, +0.265966249214837287587521063842185948798330267); + DVK(KP387390585, +0.387390585467617292130675966426762851778775217); + DVK(KP300462606, +0.300462606288665774426601772289207995520941381); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(26, is), MAKE_VOLATILE_STRIDE(26, os)) { + V TW, Tb, Tm, Ts, TB, TR, TX, TK, TU, Tz, TC, TN, TT; + TW = LD(&(xi[0]), ivs, &(xi[0])); + { + V Te, TH, Ta, Tu, Tp, T5, Tt, To, Th, Tw, Tk, Tx, Tl, TI, Tc; + V Td, Tq, Tr; + Tc = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Te = VSUB(Tc, Td); + TH = VADD(Tc, Td); + { + V T6, T7, T8, T9; + T6 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Ta = VADD(T6, T9); + Tu = VFNMS(LDK(KP500000000), T9, T6); + Tp = VSUB(T7, T8); + } + { + V T1, T2, T3, T4; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T4 = VADD(T2, T3); + T5 = VADD(T1, T4); + Tt = VFNMS(LDK(KP500000000), T4, T1); + To = VSUB(T2, T3); + } + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + Tw = VADD(Tf, Tg); + Ti = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tk = VSUB(Ti, Tj); + Tx = VADD(Ti, Tj); + } + Tl = VADD(Th, Tk); + TI = VADD(Tw, Tx); + Tb = VSUB(T5, Ta); + Tm = VADD(Te, Tl); + Tq = VMUL(LDK(KP866025403), VSUB(To, Tp)); + Tr = VFNMS(LDK(KP500000000), Tl, Te); + Ts = VADD(Tq, Tr); + TB = VSUB(Tq, Tr); + { + V TP, TQ, TG, TJ; + TP = VADD(T5, Ta); + TQ = VADD(TH, TI); + TR = VMUL(LDK(KP300462606), VSUB(TP, TQ)); + TX = VADD(TP, TQ); + TG = VADD(Tt, Tu); + TJ = VFNMS(LDK(KP500000000), TI, TH); + TK = VSUB(TG, TJ); + TU = VADD(TG, TJ); + } + { + V Tv, Ty, TL, TM; + Tv = VSUB(Tt, Tu); + Ty = VMUL(LDK(KP866025403), VSUB(Tw, Tx)); + Tz = VSUB(Tv, Ty); + TC = VADD(Tv, Ty); + TL = VADD(To, Tp); + TM = VSUB(Th, Tk); + TN = VSUB(TL, TM); + TT = VADD(TL, TM); + } + } + ST(&(xo[0]), VADD(TW, TX), ovs, &(xo[0])); + { + V T1c, T1n, T11, T14, T17, T1k, Tn, TE, T18, T1j, TS, T1m, TZ, T1f, TA; + V TD; + { + V T1a, T1b, T12, T13; + T1a = VFMA(LDK(KP387390585), TN, VMUL(LDK(KP265966249), TK)); + T1b = VFNMS(LDK(KP503537032), TU, VMUL(LDK(KP113854479), TT)); + T1c = VSUB(T1a, T1b); + T1n = VADD(T1a, T1b); + T11 = VFMA(LDK(KP575140729), Tb, VMUL(LDK(KP174138601), Tm)); + T12 = VFNMS(LDK(KP256247671), Tz, VMUL(LDK(KP156891391), Ts)); + T13 = VFMA(LDK(KP011599105), TB, VMUL(LDK(KP300238635), TC)); + T14 = VADD(T12, T13); + T17 = VSUB(T11, T14); + T1k = VMUL(LDK(KP1_732050807), VSUB(T12, T13)); + } + Tn = VFNMS(LDK(KP575140729), Tm, VMUL(LDK(KP174138601), Tb)); + TA = VFMA(LDK(KP256247671), Ts, VMUL(LDK(KP156891391), Tz)); + TD = VFNMS(LDK(KP011599105), TC, VMUL(LDK(KP300238635), TB)); + TE = VADD(TA, TD); + T18 = VMUL(LDK(KP1_732050807), VSUB(TD, TA)); + T1j = VSUB(Tn, TE); + { + V TO, T1e, TV, TY, T1d; + TO = VFNMS(LDK(KP132983124), TN, VMUL(LDK(KP258260390), TK)); + T1e = VSUB(TR, TO); + TV = VFMA(LDK(KP251768516), TT, VMUL(LDK(KP075902986), TU)); + TY = VFNMS(LDK(KP083333333), TX, TW); + T1d = VSUB(TY, TV); + TS = VFMA(LDK(KP2_000000000), TO, TR); + T1m = VADD(T1e, T1d); + TZ = VFMA(LDK(KP2_000000000), TV, TY); + T1f = VSUB(T1d, T1e); + } + { + V TF, T10, T1l, T1o; + TF = VBYI(VFMA(LDK(KP2_000000000), TE, Tn)); + T10 = VADD(TS, TZ); + ST(&(xo[WS(os, 1)]), VADD(TF, T10), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VSUB(T10, TF), ovs, &(xo[0])); + { + V T15, T16, T1p, T1q; + T15 = VBYI(VFMA(LDK(KP2_000000000), T14, T11)); + T16 = VSUB(TZ, TS); + ST(&(xo[WS(os, 5)]), VADD(T15, T16), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VSUB(T16, T15), ovs, &(xo[0])); + T1p = VADD(T1n, T1m); + T1q = VBYI(VADD(T1j, T1k)); + ST(&(xo[WS(os, 4)]), VSUB(T1p, T1q), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VADD(T1q, T1p), ovs, &(xo[WS(os, 1)])); + } + T1l = VBYI(VSUB(T1j, T1k)); + T1o = VSUB(T1m, T1n); + ST(&(xo[WS(os, 3)]), VADD(T1l, T1o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VSUB(T1o, T1l), ovs, &(xo[0])); + { + V T1h, T1i, T19, T1g; + T1h = VBYI(VADD(T18, T17)); + T1i = VSUB(T1f, T1c); + ST(&(xo[WS(os, 6)]), VADD(T1h, T1i), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VSUB(T1i, T1h), ovs, &(xo[WS(os, 1)])); + T19 = VBYI(VSUB(T17, T18)); + T1g = VADD(T1c, T1f); + ST(&(xo[WS(os, 2)]), VADD(T19, T1g), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VSUB(T1g, T19), ovs, &(xo[WS(os, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 13, XSIMD_STRING("n1bv_13"), {69, 15, 19, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_13) (planner *p) { + X(kdft_register) (p, n1bv_13, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_14.c new file mode 100644 index 000000000..fd6932847 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_14.c @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 14 -name n1bv_14 -include dft/simd/n1b.h */ + +/* + * This function contains 74 FP additions, 48 FP multiplications, + * (or, 32 additions, 6 multiplications, 42 fused multiply/add), + * 51 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V T3, TH, Ts, TV, TW, Tt, Tu, TU, Ta, To, Th, Tp, TC, Tx, TK; + V TQ, TN, TR, T14, TZ, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TH = VADD(T1, T2); + { + V T6, TI, T9, TJ, Tn, TP, Tk, TO, Tg, TM, Td, TL; + { + V T4, T5, Ti, Tj; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TI = VADD(T4, T5); + { + V T7, T8, Tl, Tm; + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + TJ = VADD(T7, T8); + Tl = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tm = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tn = VSUB(Tl, Tm); + TP = VADD(Tl, Tm); + } + Ti = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TO = VADD(Ti, Tj); + { + V Te, Tf, Tb, Tc; + Te = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + TM = VADD(Te, Tf); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TL = VADD(Tb, Tc); + } + } + Ts = VSUB(Tk, Tn); + TV = VSUB(TP, TO); + TW = VSUB(TM, TL); + Tt = VSUB(Td, Tg); + Tu = VSUB(T6, T9); + TU = VSUB(TI, TJ); + Ta = VADD(T6, T9); + To = VADD(Tk, Tn); + Th = VADD(Td, Tg); + Tp = VFNMS(LDK(KP356895867), To, Th); + TC = VFNMS(LDK(KP356895867), Th, Ta); + Tx = VFNMS(LDK(KP356895867), Ta, To); + TK = VADD(TI, TJ); + TQ = VADD(TO, TP); + TN = VADD(TL, TM); + TR = VFNMS(LDK(KP356895867), TK, TQ); + T14 = VFNMS(LDK(KP356895867), TQ, TN); + TZ = VFNMS(LDK(KP356895867), TN, TK); + } + ST(&(xo[WS(os, 7)]), VADD(T3, VADD(Ta, VADD(Th, To))), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(TH, VADD(TK, VADD(TN, TQ))), ovs, &(xo[0])); + { + V Tr, Tw, Tq, Tv; + Tq = VFNMS(LDK(KP692021471), Tp, Ta); + Tr = VFNMS(LDK(KP900968867), Tq, T3); + Tv = VFNMS(LDK(KP554958132), Tu, Tt); + Tw = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tv, Ts)); + ST(&(xo[WS(os, 3)]), VFMAI(Tw, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFNMSI(Tw, Tr), ovs, &(xo[WS(os, 1)])); + } + { + V T16, T18, T15, T17; + T15 = VFNMS(LDK(KP692021471), T14, TK); + T16 = VFNMS(LDK(KP900968867), T15, TH); + T17 = VFMA(LDK(KP554958132), TU, TW); + T18 = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), T17, TV)); + ST(&(xo[WS(os, 10)]), VFNMSI(T18, T16), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(T18, T16), ovs, &(xo[0])); + } + { + V Tz, TB, Ty, TA; + Ty = VFNMS(LDK(KP692021471), Tx, Th); + Tz = VFNMS(LDK(KP900968867), Ty, T3); + TA = VFMA(LDK(KP554958132), Tt, Ts); + TB = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), TA, Tu)); + ST(&(xo[WS(os, 5)]), VFNMSI(TB, Tz), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(TB, Tz), ovs, &(xo[WS(os, 1)])); + } + { + V TT, TY, TS, TX; + TS = VFNMS(LDK(KP692021471), TR, TN); + TT = VFNMS(LDK(KP900968867), TS, TH); + TX = VFMA(LDK(KP554958132), TW, TV); + TY = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), TX, TU)); + ST(&(xo[WS(os, 12)]), VFNMSI(TY, TT), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(TY, TT), ovs, &(xo[0])); + } + { + V T11, T13, T10, T12; + T10 = VFNMS(LDK(KP692021471), TZ, TQ); + T11 = VFNMS(LDK(KP900968867), T10, TH); + T12 = VFNMS(LDK(KP554958132), TV, TU); + T13 = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), T12, TW)); + ST(&(xo[WS(os, 8)]), VFNMSI(T13, T11), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VFMAI(T13, T11), ovs, &(xo[0])); + } + { + V TE, TG, TD, TF; + TD = VFNMS(LDK(KP692021471), TC, To); + TE = VFNMS(LDK(KP900968867), TD, T3); + TF = VFMA(LDK(KP554958132), Ts, Tu); + TG = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), TF, Tt)); + ST(&(xo[WS(os, 1)]), VFMAI(TG, TE), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VFNMSI(TG, TE), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n1bv_14"), {32, 6, 42, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_14) (planner *p) { + X(kdft_register) (p, n1bv_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 14 -name n1bv_14 -include dft/simd/n1b.h */ + +/* + * This function contains 74 FP additions, 36 FP multiplications, + * (or, 50 additions, 12 multiplications, 24 fused multiply/add), + * 33 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V Tp, Ty, Tl, TL, Tq, TE, T7, TJ, Ts, TB, Te, TK, Tr, TH, Tn; + V To; + Tn = LD(&(xi[0]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tp = VSUB(Tn, To); + Ty = VADD(Tn, To); + { + V Th, TC, Tk, TD; + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + TC = VADD(Tf, Tg); + Ti = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TD = VADD(Ti, Tj); + } + Tl = VSUB(Th, Tk); + TL = VSUB(TD, TC); + Tq = VADD(Th, Tk); + TE = VADD(TC, TD); + } + { + V T3, Tz, T6, TA; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tz = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TA = VADD(T4, T5); + } + T7 = VSUB(T3, T6); + TJ = VSUB(Tz, TA); + Ts = VADD(T3, T6); + TB = VADD(Tz, TA); + } + { + V Ta, TF, Td, TG; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + TF = VADD(T8, T9); + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TG = VADD(Tb, Tc); + } + Te = VSUB(Ta, Td); + TK = VSUB(TG, TF); + Tr = VADD(Ta, Td); + TH = VADD(TF, TG); + } + ST(&(xo[WS(os, 7)]), VADD(Tp, VADD(Ts, VADD(Tq, Tr))), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Ty, VADD(TB, VADD(TE, TH))), ovs, &(xo[0])); + { + V Tm, Tt, TQ, TP; + Tm = VBYI(VFMA(LDK(KP433883739), T7, VFNMS(LDK(KP781831482), Tl, VMUL(LDK(KP974927912), Te)))); + Tt = VFMA(LDK(KP623489801), Tq, VFNMS(LDK(KP222520933), Tr, VFNMS(LDK(KP900968867), Ts, Tp))); + ST(&(xo[WS(os, 3)]), VADD(Tm, Tt), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VSUB(Tt, Tm), ovs, &(xo[WS(os, 1)])); + TQ = VBYI(VFMA(LDK(KP974927912), TJ, VFMA(LDK(KP433883739), TL, VMUL(LDK(KP781831482), TK)))); + TP = VFMA(LDK(KP623489801), TH, VFNMS(LDK(KP900968867), TE, VFNMS(LDK(KP222520933), TB, Ty))); + ST(&(xo[WS(os, 12)]), VSUB(TP, TQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(TP, TQ), ovs, &(xo[0])); + } + { + V Tu, Tv, TM, TI; + Tu = VBYI(VFMA(LDK(KP781831482), T7, VFMA(LDK(KP974927912), Tl, VMUL(LDK(KP433883739), Te)))); + Tv = VFMA(LDK(KP623489801), Ts, VFNMS(LDK(KP900968867), Tr, VFNMS(LDK(KP222520933), Tq, Tp))); + ST(&(xo[WS(os, 1)]), VADD(Tu, Tv), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VSUB(Tv, Tu), ovs, &(xo[WS(os, 1)])); + TM = VBYI(VFNMS(LDK(KP433883739), TK, VFNMS(LDK(KP974927912), TL, VMUL(LDK(KP781831482), TJ)))); + TI = VFMA(LDK(KP623489801), TB, VFNMS(LDK(KP900968867), TH, VFNMS(LDK(KP222520933), TE, Ty))); + ST(&(xo[WS(os, 6)]), VSUB(TI, TM), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(TI, TM), ovs, &(xo[0])); + } + { + V TO, TN, Tx, Tw; + TO = VBYI(VFMA(LDK(KP433883739), TJ, VFNMS(LDK(KP974927912), TK, VMUL(LDK(KP781831482), TL)))); + TN = VFMA(LDK(KP623489801), TE, VFNMS(LDK(KP222520933), TH, VFNMS(LDK(KP900968867), TB, Ty))); + ST(&(xo[WS(os, 4)]), VSUB(TN, TO), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VADD(TN, TO), ovs, &(xo[0])); + Tx = VBYI(VFNMS(LDK(KP781831482), Te, VFNMS(LDK(KP433883739), Tl, VMUL(LDK(KP974927912), T7)))); + Tw = VFMA(LDK(KP623489801), Tr, VFNMS(LDK(KP900968867), Tq, VFNMS(LDK(KP222520933), Ts, Tp))); + ST(&(xo[WS(os, 5)]), VSUB(Tw, Tx), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(Tx, Tw), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n1bv_14"), {50, 12, 24, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_14) (planner *p) { + X(kdft_register) (p, n1bv_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_15.c new file mode 100644 index 000000000..0213087ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_15.c @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 15 -name n1bv_15 -include dft/simd/n1b.h */ + +/* + * This function contains 78 FP additions, 49 FP multiplications, + * (or, 36 additions, 7 multiplications, 42 fused multiply/add), + * 53 stack variables, 8 constants, and 30 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_15(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP910592997, +0.910592997310029334643087372129977886038870291); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(30, is), MAKE_VOLATILE_STRIDE(30, os)) { + V T5, T11, TH, Ty, TE, TF, TB, Tg, Tr, Ts, T12, T13, T14, T15, T16; + V T17, TK, TM, TZ, T10; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VFNMS(LDK(KP500000000), T4, T1); + T11 = VADD(T1, T4); + TH = VSUB(T2, T3); + } + { + V T6, T9, Ta, Tw, Tm, Tp, Tq, TA, Tb, Te, Tf, Tx, Th, Tk, Tl; + V Tz, TI, TJ; + { + V T7, T8, Tn, To; + T6 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T7, T8); + Ta = VFNMS(LDK(KP500000000), T9, T6); + Tw = VSUB(T7, T8); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tp = VADD(Tn, To); + Tq = VFNMS(LDK(KP500000000), Tp, Tm); + TA = VSUB(Tn, To); + } + { + V Tc, Td, Ti, Tj; + Tb = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = VADD(Tc, Td); + Tf = VFNMS(LDK(KP500000000), Te, Tb); + Tx = VSUB(Tc, Td); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + Tl = VFNMS(LDK(KP500000000), Tk, Th); + Tz = VSUB(Ti, Tj); + } + Ty = VSUB(Tw, Tx); + TE = VSUB(Ta, Tf); + TF = VSUB(Tl, Tq); + TB = VSUB(Tz, TA); + Tg = VADD(Ta, Tf); + Tr = VADD(Tl, Tq); + Ts = VADD(Tg, Tr); + T12 = VADD(T6, T9); + T13 = VADD(Tb, Te); + T14 = VADD(T12, T13); + T15 = VADD(Th, Tk); + T16 = VADD(Tm, Tp); + T17 = VADD(T15, T16); + TI = VADD(Tw, Tx); + TJ = VADD(Tz, TA); + TK = VADD(TI, TJ); + TM = VSUB(TI, TJ); + } + TZ = VADD(T5, Ts); + T10 = VMUL(LDK(KP866025403), VADD(TH, TK)); + ST(&(xo[WS(os, 5)]), VFNMSI(T10, TZ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VFMAI(T10, TZ), ovs, &(xo[0])); + { + V T1a, T18, T19, T1e, T1g, T1c, T1d, T1f, T1b; + T1a = VSUB(T14, T17); + T18 = VADD(T14, T17); + T19 = VFNMS(LDK(KP250000000), T18, T11); + T1c = VSUB(T15, T16); + T1d = VSUB(T12, T13); + T1e = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1d, T1c)); + T1g = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1c, T1d)); + ST(&(xo[0]), VADD(T11, T18), ovs, &(xo[0])); + T1f = VFMA(LDK(KP559016994), T1a, T19); + ST(&(xo[WS(os, 6)]), VFMAI(T1g, T1f), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFNMSI(T1g, T1f), ovs, &(xo[WS(os, 1)])); + T1b = VFNMS(LDK(KP559016994), T1a, T19); + ST(&(xo[WS(os, 3)]), VFMAI(T1e, T1b), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VFNMSI(T1e, T1b), ovs, &(xo[0])); + } + { + V TC, TG, TU, TS, TN, TV, Tv, TR, TL, Tt, Tu; + TC = VFMA(LDK(KP618033988), TB, Ty); + TG = VFMA(LDK(KP618033988), TF, TE); + TU = VFNMS(LDK(KP618033988), TE, TF); + TS = VFNMS(LDK(KP618033988), Ty, TB); + TL = VFNMS(LDK(KP250000000), TK, TH); + TN = VFMA(LDK(KP559016994), TM, TL); + TV = VFNMS(LDK(KP559016994), TM, TL); + Tt = VFNMS(LDK(KP250000000), Ts, T5); + Tu = VSUB(Tg, Tr); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + TR = VFNMS(LDK(KP559016994), Tu, Tt); + { + V TD, TO, TX, TY; + TD = VFNMS(LDK(KP823639103), TC, Tv); + TO = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), TN, TG)); + ST(&(xo[WS(os, 1)]), VFMAI(TO, TD), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 14)]), VFNMSI(TO, TD), ovs, &(xo[0])); + TX = VFMA(LDK(KP823639103), TS, TR); + TY = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), TV, TU)); + ST(&(xo[WS(os, 7)]), VFNMSI(TY, TX), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VFMAI(TY, TX), ovs, &(xo[0])); + } + { + V TP, TQ, TT, TW; + TP = VFMA(LDK(KP823639103), TC, Tv); + TQ = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), TN, TG)); + ST(&(xo[WS(os, 4)]), VFNMSI(TQ, TP), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VFMAI(TQ, TP), ovs, &(xo[WS(os, 1)])); + TT = VFNMS(LDK(KP823639103), TS, TR); + TW = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), TV, TU)); + ST(&(xo[WS(os, 2)]), VFNMSI(TW, TT), ovs, &(xo[0])); + ST(&(xo[WS(os, 13)]), VFMAI(TW, TT), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 15, XSIMD_STRING("n1bv_15"), {36, 7, 42, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_15) (planner *p) { + X(kdft_register) (p, n1bv_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 15 -name n1bv_15 -include dft/simd/n1b.h */ + +/* + * This function contains 78 FP additions, 25 FP multiplications, + * (or, 64 additions, 11 multiplications, 14 fused multiply/add), + * 55 stack variables, 10 constants, and 30 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_15(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP216506350, +0.216506350946109661690930792688234045867850657); + DVK(KP509036960, +0.509036960455127183450980863393907648510733164); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP484122918, +0.484122918275927110647408174972799951354115213); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(30, is), MAKE_VOLATILE_STRIDE(30, os)) { + V Ti, T11, TH, Ts, TL, TM, Tz, TC, TD, TI, T12, T13, T14, T15, T16; + V T17, Tf, Tj, TZ, T10; + { + V TF, Tg, Th, TG; + TF = LD(&(xi[0]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + TG = VADD(Tg, Th); + Ti = VSUB(Tg, Th); + T11 = VADD(TF, TG); + TH = VFNMS(LDK(KP500000000), TG, TF); + } + { + V Tm, Tn, T3, To, Tw, Tx, Td, Ty, Tp, Tq, T6, Tr, Tt, Tu, Ta; + V Tv, T7, Te; + { + V T1, T2, Tb, Tc; + Tm = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tn = VADD(T1, T2); + T3 = VSUB(T1, T2); + To = VFNMS(LDK(KP500000000), Tn, Tm); + Tw = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tb = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tx = VADD(Tb, Tc); + Td = VSUB(Tb, Tc); + Ty = VFNMS(LDK(KP500000000), Tx, Tw); + } + { + V T4, T5, T8, T9; + Tp = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tq = VADD(T4, T5); + T6 = VSUB(T4, T5); + Tr = VFNMS(LDK(KP500000000), Tq, Tp); + Tt = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tu = VADD(T8, T9); + Ta = VSUB(T8, T9); + Tv = VFNMS(LDK(KP500000000), Tu, Tt); + } + Ts = VSUB(To, Tr); + TL = VSUB(T3, T6); + TM = VSUB(Ta, Td); + Tz = VSUB(Tv, Ty); + TC = VADD(To, Tr); + TD = VADD(Tv, Ty); + TI = VADD(TC, TD); + T12 = VADD(Tm, Tn); + T13 = VADD(Tp, Tq); + T14 = VADD(T12, T13); + T15 = VADD(Tt, Tu); + T16 = VADD(Tw, Tx); + T17 = VADD(T15, T16); + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + Tf = VMUL(LDK(KP484122918), VSUB(T7, Te)); + Tj = VADD(T7, Te); + } + TZ = VADD(TH, TI); + T10 = VBYI(VMUL(LDK(KP866025403), VADD(Ti, Tj))); + ST(&(xo[WS(os, 5)]), VSUB(TZ, T10), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VADD(T10, TZ), ovs, &(xo[0])); + { + V T1a, T18, T19, T1e, T1f, T1c, T1d, T1g, T1b; + T1a = VMUL(LDK(KP559016994), VSUB(T14, T17)); + T18 = VADD(T14, T17); + T19 = VFNMS(LDK(KP250000000), T18, T11); + T1c = VSUB(T12, T13); + T1d = VSUB(T15, T16); + T1e = VBYI(VFNMS(LDK(KP951056516), T1d, VMUL(LDK(KP587785252), T1c))); + T1f = VBYI(VFMA(LDK(KP951056516), T1c, VMUL(LDK(KP587785252), T1d))); + ST(&(xo[0]), VADD(T11, T18), ovs, &(xo[0])); + T1g = VADD(T1a, T19); + ST(&(xo[WS(os, 6)]), VADD(T1f, T1g), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VSUB(T1g, T1f), ovs, &(xo[WS(os, 1)])); + T1b = VSUB(T19, T1a); + ST(&(xo[WS(os, 3)]), VSUB(T1b, T1e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VADD(T1e, T1b), ovs, &(xo[0])); + } + { + V TA, TN, TU, TS, Tl, TR, TK, TV, Tk, TE, TJ; + TA = VFMA(LDK(KP951056516), Ts, VMUL(LDK(KP587785252), Tz)); + TN = VFMA(LDK(KP823639103), TL, VMUL(LDK(KP509036960), TM)); + TU = VFNMS(LDK(KP823639103), TM, VMUL(LDK(KP509036960), TL)); + TS = VFNMS(LDK(KP951056516), Tz, VMUL(LDK(KP587785252), Ts)); + Tk = VFNMS(LDK(KP216506350), Tj, VMUL(LDK(KP866025403), Ti)); + Tl = VADD(Tf, Tk); + TR = VSUB(Tf, Tk); + TE = VMUL(LDK(KP559016994), VSUB(TC, TD)); + TJ = VFNMS(LDK(KP250000000), TI, TH); + TK = VADD(TE, TJ); + TV = VSUB(TJ, TE); + { + V TB, TO, TX, TY; + TB = VBYI(VADD(Tl, TA)); + TO = VSUB(TK, TN); + ST(&(xo[WS(os, 1)]), VADD(TB, TO), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 14)]), VSUB(TO, TB), ovs, &(xo[0])); + TX = VBYI(VSUB(TS, TR)); + TY = VSUB(TV, TU); + ST(&(xo[WS(os, 7)]), VADD(TX, TY), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VSUB(TY, TX), ovs, &(xo[0])); + } + { + V TP, TQ, TT, TW; + TP = VBYI(VSUB(Tl, TA)); + TQ = VADD(TN, TK); + ST(&(xo[WS(os, 4)]), VADD(TP, TQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VSUB(TQ, TP), ovs, &(xo[WS(os, 1)])); + TT = VBYI(VADD(TR, TS)); + TW = VADD(TU, TV); + ST(&(xo[WS(os, 2)]), VADD(TT, TW), ovs, &(xo[0])); + ST(&(xo[WS(os, 13)]), VSUB(TW, TT), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 15, XSIMD_STRING("n1bv_15"), {64, 11, 14, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_15) (planner *p) { + X(kdft_register) (p, n1bv_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_16.c new file mode 100644 index 000000000..2edbbc492 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_16.c @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 16 -name n1bv_16 -include dft/simd/n1b.h */ + +/* + * This function contains 72 FP additions, 34 FP multiplications, + * (or, 38 additions, 0 multiplications, 34 fused multiply/add), + * 30 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V T7, TU, Tz, TH, Tu, TV, TA, TK, Te, TX, TC, TO, Tl, TY, TD; + V TR; + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T7 = VSUB(T3, T6); + TU = VSUB(T4, T5); + Tz = VADD(T3, T6); + TH = VSUB(T1, T2); + } + { + V Tq, TI, Tt, TJ; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + TI = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + TJ = VSUB(Tr, Ts); + } + Tu = VSUB(Tq, Tt); + TV = VSUB(TI, TJ); + TA = VADD(Tq, Tt); + TK = VADD(TI, TJ); + } + { + V Ta, TM, Td, TN; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VADD(T8, T9); + TM = VSUB(T8, T9); + Tb = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + TN = VSUB(Tb, Tc); + } + Te = VSUB(Ta, Td); + TX = VFMA(LDK(KP414213562), TM, TN); + TC = VADD(Ta, Td); + TO = VFNMS(LDK(KP414213562), TN, TM); + } + { + V Th, TP, Tk, TQ; + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Th = VADD(Tf, Tg); + TP = VSUB(Tf, Tg); + Ti = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + TQ = VSUB(Tj, Ti); + } + Tl = VSUB(Th, Tk); + TY = VFMA(LDK(KP414213562), TP, TQ); + TD = VADD(Th, Tk); + TR = VFNMS(LDK(KP414213562), TQ, TP); + } + { + V TB, TE, TF, TG; + TB = VSUB(Tz, TA); + TE = VSUB(TC, TD); + ST(&(xo[WS(os, 12)]), VFNMSI(TE, TB), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(TE, TB), ovs, &(xo[0])); + TF = VADD(Tz, TA); + TG = VADD(TC, TD); + ST(&(xo[WS(os, 8)]), VSUB(TF, TG), ovs, &(xo[0])); + ST(&(xo[0]), VADD(TF, TG), ovs, &(xo[0])); + } + { + V Tn, Tx, Tw, Ty, Tm, Tv; + Tm = VADD(Te, Tl); + Tn = VFNMS(LDK(KP707106781), Tm, T7); + Tx = VFMA(LDK(KP707106781), Tm, T7); + Tv = VSUB(Te, Tl); + Tw = VFNMS(LDK(KP707106781), Tv, Tu); + Ty = VFMA(LDK(KP707106781), Tv, Tu); + ST(&(xo[WS(os, 6)]), VFNMSI(Tw, Tn), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VFNMSI(Ty, Tx), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VFMAI(Tw, Tn), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(Ty, Tx), ovs, &(xo[0])); + } + { + V TT, T11, T10, T12; + { + V TL, TS, TW, TZ; + TL = VFMA(LDK(KP707106781), TK, TH); + TS = VADD(TO, TR); + TT = VFNMS(LDK(KP923879532), TS, TL); + T11 = VFMA(LDK(KP923879532), TS, TL); + TW = VFMA(LDK(KP707106781), TV, TU); + TZ = VSUB(TX, TY); + T10 = VFNMS(LDK(KP923879532), TZ, TW); + T12 = VFMA(LDK(KP923879532), TZ, TW); + } + ST(&(xo[WS(os, 7)]), VFNMSI(T10, TT), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(T12, T11), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(T10, TT), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VFNMSI(T12, T11), ovs, &(xo[WS(os, 1)])); + } + { + V T15, T19, T18, T1a; + { + V T13, T14, T16, T17; + T13 = VFNMS(LDK(KP707106781), TK, TH); + T14 = VADD(TX, TY); + T15 = VFNMS(LDK(KP923879532), T14, T13); + T19 = VFMA(LDK(KP923879532), T14, T13); + T16 = VFNMS(LDK(KP707106781), TV, TU); + T17 = VSUB(TO, TR); + T18 = VFMA(LDK(KP923879532), T17, T16); + T1a = VFNMS(LDK(KP923879532), T17, T16); + } + ST(&(xo[WS(os, 5)]), VFMAI(T18, T15), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VFMAI(T1a, T19), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFNMSI(T18, T15), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFNMSI(T1a, T19), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n1bv_16"), {38, 0, 34, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_16) (planner *p) { + X(kdft_register) (p, n1bv_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 16 -name n1bv_16 -include dft/simd/n1b.h */ + +/* + * This function contains 72 FP additions, 12 FP multiplications, + * (or, 68 additions, 8 multiplications, 4 fused multiply/add), + * 30 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V Tp, T13, Tu, TY, Tm, T14, Tv, TU, T7, T16, Tx, TN, Te, T17, Ty; + V TQ; + { + V Tn, To, TX, Ts, Tt, TW; + Tn = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TX = VADD(Tn, To); + Ts = LD(&(xi[0]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TW = VADD(Ts, Tt); + Tp = VSUB(Tn, To); + T13 = VADD(TW, TX); + Tu = VSUB(Ts, Tt); + TY = VSUB(TW, TX); + } + { + V Ti, TS, Tl, TT; + { + V Tg, Th, Tj, Tk; + Tg = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Ti = VSUB(Tg, Th); + TS = VADD(Tg, Th); + Tj = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + TT = VADD(Tj, Tk); + } + Tm = VMUL(LDK(KP707106781), VSUB(Ti, Tl)); + T14 = VADD(TS, TT); + Tv = VMUL(LDK(KP707106781), VADD(Ti, Tl)); + TU = VSUB(TS, TT); + } + { + V T3, TL, T6, TM; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TL = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TM = VADD(T4, T5); + } + T7 = VFNMS(LDK(KP382683432), T6, VMUL(LDK(KP923879532), T3)); + T16 = VADD(TL, TM); + Tx = VFMA(LDK(KP382683432), T3, VMUL(LDK(KP923879532), T6)); + TN = VSUB(TL, TM); + } + { + V Ta, TO, Td, TP; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + TO = VADD(T8, T9); + Tb = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TP = VADD(Tb, Tc); + } + Te = VFMA(LDK(KP923879532), Ta, VMUL(LDK(KP382683432), Td)); + T17 = VADD(TO, TP); + Ty = VFNMS(LDK(KP382683432), Ta, VMUL(LDK(KP923879532), Td)); + TQ = VSUB(TO, TP); + } + { + V T15, T18, T19, T1a; + T15 = VSUB(T13, T14); + T18 = VBYI(VSUB(T16, T17)); + ST(&(xo[WS(os, 12)]), VSUB(T15, T18), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(T15, T18), ovs, &(xo[0])); + T19 = VADD(T13, T14); + T1a = VADD(T16, T17); + ST(&(xo[WS(os, 8)]), VSUB(T19, T1a), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T19, T1a), ovs, &(xo[0])); + } + { + V TV, T11, T10, T12, TR, TZ; + TR = VMUL(LDK(KP707106781), VSUB(TN, TQ)); + TV = VBYI(VSUB(TR, TU)); + T11 = VBYI(VADD(TU, TR)); + TZ = VMUL(LDK(KP707106781), VADD(TN, TQ)); + T10 = VSUB(TY, TZ); + T12 = VADD(TY, TZ); + ST(&(xo[WS(os, 6)]), VADD(TV, T10), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VSUB(T12, T11), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VSUB(T10, TV), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(T11, T12), ovs, &(xo[0])); + } + { + V Tr, TB, TA, TC; + { + V Tf, Tq, Tw, Tz; + Tf = VSUB(T7, Te); + Tq = VSUB(Tm, Tp); + Tr = VBYI(VSUB(Tf, Tq)); + TB = VBYI(VADD(Tq, Tf)); + Tw = VSUB(Tu, Tv); + Tz = VSUB(Tx, Ty); + TA = VSUB(Tw, Tz); + TC = VADD(Tw, Tz); + } + ST(&(xo[WS(os, 5)]), VADD(Tr, TA), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VSUB(TC, TB), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VSUB(TA, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(TB, TC), ovs, &(xo[WS(os, 1)])); + } + { + V TF, TJ, TI, TK; + { + V TD, TE, TG, TH; + TD = VADD(Tu, Tv); + TE = VADD(T7, Te); + TF = VADD(TD, TE); + TJ = VSUB(TD, TE); + TG = VADD(Tp, Tm); + TH = VADD(Tx, Ty); + TI = VBYI(VADD(TG, TH)); + TK = VBYI(VSUB(TH, TG)); + } + ST(&(xo[WS(os, 15)]), VSUB(TF, TI), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(TJ, TK), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(TF, TI), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VSUB(TJ, TK), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n1bv_16"), {68, 8, 4, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_16) (planner *p) { + X(kdft_register) (p, n1bv_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_2.c new file mode 100644 index 000000000..7e0694d46 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_2.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 2 -name n1bv_2 -include dft/simd/n1b.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + ST(&(xo[WS(os, 1)]), VSUB(T1, T2), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T1, T2), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n1bv_2"), {2, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_2) (planner *p) { + X(kdft_register) (p, n1bv_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 2 -name n1bv_2 -include dft/simd/n1b.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + ST(&(xo[WS(os, 1)]), VSUB(T1, T2), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T1, T2), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n1bv_2"), {2, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_2) (planner *p) { + X(kdft_register) (p, n1bv_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_20.c new file mode 100644 index 000000000..52519a302 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_20.c @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:02 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 20 -name n1bv_20 -include dft/simd/n1b.h */ + +/* + * This function contains 104 FP additions, 50 FP multiplications, + * (or, 58 additions, 4 multiplications, 46 fused multiply/add), + * 53 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1r, TE, T13, Ts, TL, TM, Tz, T16, T19, T1a, T1v, T1w, T1x, T1s; + V T1t, T1u, T1d, T1g, T1h, Ti, Tk, TH, TJ, TZ, T10; + { + V T1, T2, T11, TC, TD, T12; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T11 = VADD(T1, T2); + TC = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + TD = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T12 = VADD(TC, TD); + T3 = VSUB(T1, T2); + T1r = VADD(T11, T12); + TE = VSUB(TC, TD); + T13 = VSUB(T11, T12); + } + { + V T6, T14, Tv, T1c, Ty, T1f, T9, T17, Td, T1b, To, T15, Tr, T18, Tg; + V T1e; + { + V T4, T5, Tt, Tu; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T14 = VADD(T4, T5); + Tt = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tu = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tv = VSUB(Tt, Tu); + T1c = VADD(Tt, Tu); + } + { + V Tw, Tx, T7, T8; + Tw = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tx = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Ty = VSUB(Tw, Tx); + T1f = VADD(Tw, Tx); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T17 = VADD(T7, T8); + } + { + V Tb, Tc, Tm, Tn; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T1b = VADD(Tb, Tc); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + To = VSUB(Tm, Tn); + T15 = VADD(Tm, Tn); + } + { + V Tp, Tq, Te, Tf; + Tp = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tq = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tr = VSUB(Tp, Tq); + T18 = VADD(Tp, Tq); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T1e = VADD(Te, Tf); + } + Ts = VSUB(To, Tr); + TL = VSUB(T6, T9); + TM = VSUB(Td, Tg); + Tz = VSUB(Tv, Ty); + T16 = VSUB(T14, T15); + T19 = VSUB(T17, T18); + T1a = VADD(T16, T19); + T1v = VADD(T1b, T1c); + T1w = VADD(T1e, T1f); + T1x = VADD(T1v, T1w); + T1s = VADD(T14, T15); + T1t = VADD(T17, T18); + T1u = VADD(T1s, T1t); + T1d = VSUB(T1b, T1c); + T1g = VSUB(T1e, T1f); + T1h = VADD(T1d, T1g); + { + V Ta, Th, TF, TG; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + Tk = VSUB(Ta, Th); + TF = VADD(To, Tr); + TG = VADD(Tv, Ty); + TH = VADD(TF, TG); + TJ = VSUB(TF, TG); + } + } + TZ = VADD(T3, Ti); + T10 = VADD(TE, TH); + ST(&(xo[WS(os, 15)]), VFNMSI(T10, TZ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFMAI(T10, TZ), ovs, &(xo[WS(os, 1)])); + { + V T1A, T1y, T1z, T1E, T1G, T1C, T1D, T1F, T1B; + T1A = VSUB(T1u, T1x); + T1y = VADD(T1u, T1x); + T1z = VFNMS(LDK(KP250000000), T1y, T1r); + T1C = VSUB(T1s, T1t); + T1D = VSUB(T1v, T1w); + T1E = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1D, T1C)); + T1G = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1C, T1D)); + ST(&(xo[0]), VADD(T1r, T1y), ovs, &(xo[0])); + T1F = VFNMS(LDK(KP559016994), T1A, T1z); + ST(&(xo[WS(os, 8)]), VFMAI(T1G, T1F), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VFNMSI(T1G, T1F), ovs, &(xo[0])); + T1B = VFMA(LDK(KP559016994), T1A, T1z); + ST(&(xo[WS(os, 4)]), VFNMSI(T1E, T1B), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VFMAI(T1E, T1B), ovs, &(xo[0])); + } + { + V T1k, T1i, T1j, T1o, T1q, T1m, T1n, T1p, T1l; + T1k = VSUB(T1a, T1h); + T1i = VADD(T1a, T1h); + T1j = VFNMS(LDK(KP250000000), T1i, T13); + T1m = VSUB(T1d, T1g); + T1n = VSUB(T16, T19); + T1o = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1n, T1m)); + T1q = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1m, T1n)); + ST(&(xo[WS(os, 10)]), VADD(T13, T1i), ovs, &(xo[0])); + T1p = VFMA(LDK(KP559016994), T1k, T1j); + ST(&(xo[WS(os, 6)]), VFMAI(T1q, T1p), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VFNMSI(T1q, T1p), ovs, &(xo[0])); + T1l = VFNMS(LDK(KP559016994), T1k, T1j); + ST(&(xo[WS(os, 2)]), VFNMSI(T1o, T1l), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VFMAI(T1o, T1l), ovs, &(xo[0])); + } + { + V TA, TN, TV, TS, TK, TU, Tl, TR, TI, Tj; + TA = VFMA(LDK(KP618033988), Tz, Ts); + TN = VFMA(LDK(KP618033988), TM, TL); + TV = VFNMS(LDK(KP618033988), TL, TM); + TS = VFNMS(LDK(KP618033988), Ts, Tz); + TI = VFNMS(LDK(KP250000000), TH, TE); + TK = VFMA(LDK(KP559016994), TJ, TI); + TU = VFNMS(LDK(KP559016994), TJ, TI); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tl = VFMA(LDK(KP559016994), Tk, Tj); + TR = VFNMS(LDK(KP559016994), Tk, Tj); + { + V TB, TO, TX, TY; + TB = VFNMS(LDK(KP951056516), TA, Tl); + TO = VFMA(LDK(KP951056516), TN, TK); + ST(&(xo[WS(os, 19)]), VFNMSI(TO, TB), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(TO, TB), ovs, &(xo[WS(os, 1)])); + TX = VFNMS(LDK(KP951056516), TS, TR); + TY = VFMA(LDK(KP951056516), TV, TU); + ST(&(xo[WS(os, 7)]), VFNMSI(TY, TX), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VFMAI(TY, TX), ovs, &(xo[WS(os, 1)])); + } + { + V TP, TQ, TT, TW; + TP = VFMA(LDK(KP951056516), TA, Tl); + TQ = VFNMS(LDK(KP951056516), TN, TK); + ST(&(xo[WS(os, 11)]), VFNMSI(TQ, TP), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(TQ, TP), ovs, &(xo[WS(os, 1)])); + TT = VFMA(LDK(KP951056516), TS, TR); + TW = VFNMS(LDK(KP951056516), TV, TU); + ST(&(xo[WS(os, 3)]), VFNMSI(TW, TT), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 17)]), VFMAI(TW, TT), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n1bv_20"), {58, 4, 46, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_20) (planner *p) { + X(kdft_register) (p, n1bv_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 20 -name n1bv_20 -include dft/simd/n1b.h */ + +/* + * This function contains 104 FP additions, 24 FP multiplications, + * (or, 92 additions, 12 multiplications, 12 fused multiply/add), + * 53 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1y, TH, T1i, Ts, TL, TM, Tz, T13, T16, T1j, T1u, T1v, T1w, T1r; + V T1s, T1t, T1a, T1d, T1k, Ti, Tk, TE, TI, TZ, T10; + { + V T1, T2, T1g, TF, TG, T1h; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1g = VADD(T1, T2); + TF = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + TG = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1h = VADD(TF, TG); + T3 = VSUB(T1, T2); + T1y = VADD(T1g, T1h); + TH = VSUB(TF, TG); + T1i = VSUB(T1g, T1h); + } + { + V T6, T11, Tv, T19, Ty, T1c, T9, T14, Td, T18, To, T12, Tr, T15, Tg; + V T1b; + { + V T4, T5, Tt, Tu; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T11 = VADD(T4, T5); + Tt = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tu = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tv = VSUB(Tt, Tu); + T19 = VADD(Tt, Tu); + } + { + V Tw, Tx, T7, T8; + Tw = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tx = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Ty = VSUB(Tw, Tx); + T1c = VADD(Tw, Tx); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T14 = VADD(T7, T8); + } + { + V Tb, Tc, Tm, Tn; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T18 = VADD(Tb, Tc); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + To = VSUB(Tm, Tn); + T12 = VADD(Tm, Tn); + } + { + V Tp, Tq, Te, Tf; + Tp = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tq = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tr = VSUB(Tp, Tq); + T15 = VADD(Tp, Tq); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T1b = VADD(Te, Tf); + } + Ts = VSUB(To, Tr); + TL = VSUB(T6, T9); + TM = VSUB(Td, Tg); + Tz = VSUB(Tv, Ty); + T13 = VSUB(T11, T12); + T16 = VSUB(T14, T15); + T1j = VADD(T13, T16); + T1u = VADD(T18, T19); + T1v = VADD(T1b, T1c); + T1w = VADD(T1u, T1v); + T1r = VADD(T11, T12); + T1s = VADD(T14, T15); + T1t = VADD(T1r, T1s); + T1a = VSUB(T18, T19); + T1d = VSUB(T1b, T1c); + T1k = VADD(T1a, T1d); + { + V Ta, Th, TC, TD; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + Tk = VMUL(LDK(KP559016994), VSUB(Ta, Th)); + TC = VADD(To, Tr); + TD = VADD(Tv, Ty); + TE = VMUL(LDK(KP559016994), VSUB(TC, TD)); + TI = VADD(TC, TD); + } + } + TZ = VADD(T3, Ti); + T10 = VBYI(VADD(TH, TI)); + ST(&(xo[WS(os, 15)]), VSUB(TZ, T10), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(TZ, T10), ovs, &(xo[WS(os, 1)])); + { + V T1x, T1z, T1A, T1E, T1G, T1C, T1D, T1F, T1B; + T1x = VMUL(LDK(KP559016994), VSUB(T1t, T1w)); + T1z = VADD(T1t, T1w); + T1A = VFNMS(LDK(KP250000000), T1z, T1y); + T1C = VSUB(T1r, T1s); + T1D = VSUB(T1u, T1v); + T1E = VBYI(VFMA(LDK(KP951056516), T1C, VMUL(LDK(KP587785252), T1D))); + T1G = VBYI(VFNMS(LDK(KP951056516), T1D, VMUL(LDK(KP587785252), T1C))); + ST(&(xo[0]), VADD(T1y, T1z), ovs, &(xo[0])); + T1F = VSUB(T1A, T1x); + ST(&(xo[WS(os, 8)]), VSUB(T1F, T1G), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VADD(T1G, T1F), ovs, &(xo[0])); + T1B = VADD(T1x, T1A); + ST(&(xo[WS(os, 4)]), VSUB(T1B, T1E), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VADD(T1E, T1B), ovs, &(xo[0])); + } + { + V T1n, T1l, T1m, T1f, T1p, T17, T1e, T1q, T1o; + T1n = VMUL(LDK(KP559016994), VSUB(T1j, T1k)); + T1l = VADD(T1j, T1k); + T1m = VFNMS(LDK(KP250000000), T1l, T1i); + T17 = VSUB(T13, T16); + T1e = VSUB(T1a, T1d); + T1f = VBYI(VFNMS(LDK(KP951056516), T1e, VMUL(LDK(KP587785252), T17))); + T1p = VBYI(VFMA(LDK(KP951056516), T17, VMUL(LDK(KP587785252), T1e))); + ST(&(xo[WS(os, 10)]), VADD(T1i, T1l), ovs, &(xo[0])); + T1q = VADD(T1n, T1m); + ST(&(xo[WS(os, 6)]), VADD(T1p, T1q), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VSUB(T1q, T1p), ovs, &(xo[0])); + T1o = VSUB(T1m, T1n); + ST(&(xo[WS(os, 2)]), VADD(T1f, T1o), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VSUB(T1o, T1f), ovs, &(xo[0])); + } + { + V TA, TN, TU, TS, TK, TV, Tl, TR, TJ, Tj; + TA = VFNMS(LDK(KP951056516), Tz, VMUL(LDK(KP587785252), Ts)); + TN = VFNMS(LDK(KP951056516), TM, VMUL(LDK(KP587785252), TL)); + TU = VFMA(LDK(KP951056516), TL, VMUL(LDK(KP587785252), TM)); + TS = VFMA(LDK(KP951056516), Ts, VMUL(LDK(KP587785252), Tz)); + TJ = VFNMS(LDK(KP250000000), TI, TH); + TK = VSUB(TE, TJ); + TV = VADD(TE, TJ); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tl = VSUB(Tj, Tk); + TR = VADD(Tk, Tj); + { + V TB, TO, TX, TY; + TB = VSUB(Tl, TA); + TO = VBYI(VSUB(TK, TN)); + ST(&(xo[WS(os, 17)]), VSUB(TB, TO), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(TB, TO), ovs, &(xo[WS(os, 1)])); + TX = VADD(TR, TS); + TY = VBYI(VSUB(TV, TU)); + ST(&(xo[WS(os, 11)]), VSUB(TX, TY), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(TX, TY), ovs, &(xo[WS(os, 1)])); + } + { + V TP, TQ, TT, TW; + TP = VADD(Tl, TA); + TQ = VBYI(VADD(TN, TK)); + ST(&(xo[WS(os, 13)]), VSUB(TP, TQ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(TP, TQ), ovs, &(xo[WS(os, 1)])); + TT = VSUB(TR, TS); + TW = VBYI(VADD(TU, TV)); + ST(&(xo[WS(os, 19)]), VSUB(TT, TW), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(TT, TW), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n1bv_20"), {92, 12, 12, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_20) (planner *p) { + X(kdft_register) (p, n1bv_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_25.c new file mode 100644 index 000000000..a50cb4d24 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_25.c @@ -0,0 +1,807 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:03 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 25 -name n1bv_25 -include dft/simd/n1b.h */ + +/* + * This function contains 224 FP additions, 193 FP multiplications, + * (or, 43 additions, 12 multiplications, 181 fused multiply/add), + * 140 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_25(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(50, is), MAKE_VOLATILE_STRIDE(50, os)) { + V Ta, T2z, T1q, T9, T3n, T3r, T3s, T3t, T1a, T2N, T2V, T1j, T1J, T2o, T2t; + V T1R, TV, T2O, T2W, T1i, T1K, T2l, T2s, T1S, T3o, T3p, T3q, TF, T2R, T2Y; + V T1f, T1N, T2e, T2v, T1V, Tq, T2Q, T2Z, T1e, T1M, T2h, T2w, T1U; + { + V T1, T7, T1p, T4, T1o, T8; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T5, T6, T2, T3; + T5 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + T1p = VSUB(T5, T6); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T1o = VSUB(T2, T3); + } + Ta = VSUB(T4, T7); + T2z = VFNMS(LDK(KP618033988), T1o, T1p); + T1q = VFMA(LDK(KP618033988), T1p, T1o); + T8 = VADD(T4, T7); + T9 = VFNMS(LDK(KP250000000), T8, T1); + T3n = VADD(T1, T8); + } + { + V TH, TW, TO, TT, TQ, TS, T13, T18, T15, T17; + TH = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TW = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + { + V TI, TJ, TK, TL, TM, TN; + TI = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TJ = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TK = VADD(TI, TJ); + TL = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TM = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TN = VADD(TL, TM); + TO = VADD(TK, TN); + TT = VSUB(TM, TL); + TQ = VSUB(TN, TK); + TS = VSUB(TI, TJ); + } + { + V TX, TY, TZ, T10, T11, T12; + TX = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TY = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TZ = VADD(TX, TY); + T10 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T11 = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T12 = VADD(T10, T11); + T13 = VADD(TZ, T12); + T18 = VSUB(T10, T11); + T15 = VSUB(T12, TZ); + T17 = VSUB(TX, TY); + } + T3r = VADD(TH, TO); + T3s = VADD(TW, T13); + T3t = VADD(T3r, T3s); + { + V T19, T2m, T16, T2n, T14; + T19 = VFMA(LDK(KP618033988), T18, T17); + T2m = VFNMS(LDK(KP618033988), T17, T18); + T14 = VFNMS(LDK(KP250000000), T13, TW); + T16 = VFNMS(LDK(KP559016994), T15, T14); + T2n = VFMA(LDK(KP559016994), T15, T14); + T1a = VFNMS(LDK(KP893101515), T19, T16); + T2N = VFMA(LDK(KP066152395), T2n, T2m); + T2V = VFNMS(LDK(KP059835404), T2m, T2n); + T1j = VFMA(LDK(KP987388751), T16, T19); + T1J = VFNMS(LDK(KP120146378), T19, T16); + T2o = VFMA(LDK(KP869845200), T2n, T2m); + T2t = VFNMS(LDK(KP786782374), T2m, T2n); + T1R = VFMA(LDK(KP132830569), T16, T19); + } + { + V TU, T2j, TR, T2k, TP; + TU = VFNMS(LDK(KP618033988), TT, TS); + T2j = VFMA(LDK(KP618033988), TS, TT); + TP = VFNMS(LDK(KP250000000), TO, TH); + TR = VFNMS(LDK(KP559016994), TQ, TP); + T2k = VFMA(LDK(KP559016994), TQ, TP); + TV = VFNMS(LDK(KP522847744), TU, TR); + T2O = VFNMS(LDK(KP667278218), T2k, T2j); + T2W = VFMA(LDK(KP603558818), T2j, T2k); + T1i = VFMA(LDK(KP578046249), TR, TU); + T1K = VFNMS(LDK(KP494780565), TR, TU); + T2l = VFMA(LDK(KP066152395), T2k, T2j); + T2s = VFNMS(LDK(KP059835404), T2j, T2k); + T1S = VFMA(LDK(KP447533225), TU, TR); + } + } + { + V Tc, Ty, Tj, To, Tl, Tn, Tt, TD, Tw, TB; + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + { + V Td, Te, Tf, Tg, Th, Ti; + Td = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Tg = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + Ti = VADD(Tg, Th); + Tj = VADD(Tf, Ti); + To = VSUB(Th, Tg); + Tl = VSUB(Tf, Ti); + Tn = VSUB(Td, Te); + } + { + V Tr, Ts, Tz, Tu, Tv, TA; + Tr = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tz = VADD(Ts, Tr); + Tu = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tv = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TA = VADD(Tv, Tu); + Tt = VSUB(Tr, Ts); + TD = VSUB(Tz, TA); + Tw = VSUB(Tu, Tv); + TB = VADD(Tz, TA); + } + T3o = VADD(Tc, Tj); + T3p = VADD(Ty, TB); + T3q = VADD(T3o, T3p); + { + V Tx, T2d, TE, T2c, TC; + Tx = VFMA(LDK(KP618033988), Tw, Tt); + T2d = VFNMS(LDK(KP618033988), Tt, Tw); + TC = VFMS(LDK(KP250000000), TB, Ty); + TE = VFNMS(LDK(KP559016994), TD, TC); + T2c = VFMA(LDK(KP559016994), TD, TC); + TF = VFNMS(LDK(KP667278218), TE, Tx); + T2R = VFNMS(LDK(KP494780565), T2c, T2d); + T2Y = VFMA(LDK(KP447533225), T2d, T2c); + T1f = VFMA(LDK(KP603558818), Tx, TE); + T1N = VFMA(LDK(KP869845200), TE, Tx); + T2e = VFMA(LDK(KP120146378), T2d, T2c); + T2v = VFNMS(LDK(KP132830569), T2c, T2d); + T1V = VFNMS(LDK(KP786782374), Tx, TE); + } + { + V Tp, T2g, Tm, T2f, Tk; + Tp = VFNMS(LDK(KP618033988), To, Tn); + T2g = VFMA(LDK(KP618033988), Tn, To); + Tk = VFNMS(LDK(KP250000000), Tj, Tc); + Tm = VFMA(LDK(KP559016994), Tl, Tk); + T2f = VFNMS(LDK(KP559016994), Tl, Tk); + Tq = VFNMS(LDK(KP244189809), Tp, Tm); + T2Q = VFNMS(LDK(KP522847744), T2g, T2f); + T2Z = VFMA(LDK(KP578046249), T2f, T2g); + T1e = VFMA(LDK(KP269969613), Tm, Tp); + T1M = VFMA(LDK(KP667278218), Tm, Tp); + T2h = VFMA(LDK(KP893101515), T2g, T2f); + T2w = VFNMS(LDK(KP987388751), T2f, T2g); + T1U = VFNMS(LDK(KP603558818), Tp, Tm); + } + } + { + V T3w, T3u, T3v, T3A, T3C, T3y, T3z, T3B, T3x; + T3w = VSUB(T3q, T3t); + T3u = VADD(T3q, T3t); + T3v = VFNMS(LDK(KP250000000), T3u, T3n); + T3y = VSUB(T3o, T3p); + T3z = VSUB(T3r, T3s); + T3A = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T3z, T3y)); + T3C = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T3y, T3z)); + ST(&(xo[0]), VADD(T3u, T3n), ovs, &(xo[0])); + T3B = VFNMS(LDK(KP559016994), T3w, T3v); + ST(&(xo[WS(os, 10)]), VFNMSI(T3C, T3B), ovs, &(xo[0])); + ST(&(xo[WS(os, 15)]), VFMAI(T3C, T3B), ovs, &(xo[WS(os, 1)])); + T3x = VFMA(LDK(KP559016994), T3w, T3v); + ST(&(xo[WS(os, 5)]), VFMAI(T3A, T3x), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 20)]), VFNMSI(T3A, T3x), ovs, &(xo[0])); + } + { + V T2B, T2H, T2q, T2E, T2y, T2K, T31, T3a, T3l, T3f, T2b, T35, T34, T2T, T33; + V T3h, T37; + T2B = VFMA(LDK(KP734762448), T2w, T2v); + T2H = VFNMS(LDK(KP734762448), T2h, T2e); + { + V T2p, T2i, T2D, T2C; + T2p = VFNMS(LDK(KP772036680), T2o, T2l); + T2i = VFMA(LDK(KP734762448), T2h, T2e); + T2C = VFNMS(LDK(KP772036680), T2t, T2s); + T2D = VFNMS(LDK(KP522616830), T2i, T2C); + T2q = VFMA(LDK(KP956723877), T2p, T2i); + T2E = VFMA(LDK(KP763932022), T2D, T2p); + } + { + V T2u, T2x, T2J, T2I; + T2u = VFMA(LDK(KP772036680), T2t, T2s); + T2x = VFNMS(LDK(KP734762448), T2w, T2v); + T2I = VFMA(LDK(KP772036680), T2o, T2l); + T2J = VFMA(LDK(KP522616830), T2x, T2I); + T2y = VFMA(LDK(KP945422727), T2x, T2u); + T2K = VFNMS(LDK(KP690983005), T2J, T2u); + } + { + V T3e, T3d, T3k, T36, T2P, T2S; + { + V T2X, T30, T3b, T3c; + T2X = VFMA(LDK(KP845997307), T2W, T2V); + T30 = VFNMS(LDK(KP921078979), T2Z, T2Y); + T31 = VFNMS(LDK(KP906616052), T30, T2X); + T3e = VFMA(LDK(KP906616052), T30, T2X); + T3b = VFMA(LDK(KP845997307), T2O, T2N); + T3c = VFMA(LDK(KP982009705), T2R, T2Q); + T3d = VFMA(LDK(KP570584518), T3c, T3b); + T3k = VFNMS(LDK(KP669429328), T3b, T3c); + } + T3a = VFMA(LDK(KP262346850), T31, T2z); + T3l = VFNMS(LDK(KP669429328), T3e, T3k); + T3f = VFMA(LDK(KP618033988), T3e, T3d); + T2b = VFNMS(LDK(KP559016994), Ta, T9); + T35 = VFMA(LDK(KP921078979), T2Z, T2Y); + T34 = VFNMS(LDK(KP845997307), T2W, T2V); + T2P = VFNMS(LDK(KP845997307), T2O, T2N); + T2S = VFNMS(LDK(KP982009705), T2R, T2Q); + T2T = VFMA(LDK(KP923225144), T2S, T2P); + T36 = VFNMS(LDK(KP923225144), T2S, T2P); + T33 = VFNMS(LDK(KP237294955), T2T, T2b); + T3h = VFNMS(LDK(KP904508497), T36, T34); + T37 = VFNMS(LDK(KP997675361), T36, T35); + } + { + V T2r, T2A, T2U, T32; + T2r = VFMA(LDK(KP992114701), T2q, T2b); + T2A = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T2z, T2y)); + ST(&(xo[WS(os, 22)]), VFNMSI(T2A, T2r), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VFMAI(T2A, T2r), ovs, &(xo[WS(os, 1)])); + T2U = VFMA(LDK(KP949179823), T2T, T2b); + T32 = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T2z, T31)); + ST(&(xo[WS(os, 23)]), VFNMSI(T32, T2U), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VFMAI(T32, T2U), ovs, &(xo[0])); + } + { + V T3g, T39, T38, T3m, T3j, T3i; + T3g = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T3f, T3a)); + T38 = VFMA(LDK(KP560319534), T37, T34); + T39 = VFNMS(LDK(KP949179823), T38, T33); + ST(&(xo[WS(os, 12)]), VFNMSI(T3g, T39), ovs, &(xo[0])); + ST(&(xo[WS(os, 13)]), VFMAI(T3g, T39), ovs, &(xo[WS(os, 1)])); + T3m = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T3l, T3a)); + T3i = VFNMS(LDK(KP681693190), T3h, T35); + T3j = VFNMS(LDK(KP860541664), T3i, T33); + ST(&(xo[WS(os, 7)]), VFNMSI(T3m, T3j), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 18)]), VFMAI(T3m, T3j), ovs, &(xo[0])); + { + V T2G, T2M, T2F, T2L; + T2F = VFNMS(LDK(KP855719849), T2E, T2B); + T2G = VFMA(LDK(KP897376177), T2F, T2b); + T2L = VFMA(LDK(KP855719849), T2K, T2H); + T2M = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2L, T2z)); + ST(&(xo[WS(os, 8)]), VFMAI(T2M, T2G), ovs, &(xo[0])); + ST(&(xo[WS(os, 17)]), VFNMSI(T2M, T2G), ovs, &(xo[WS(os, 1)])); + } + } + } + { + V T1Z, T25, T1P, T22, T1X, T28, T1t, T1u, T1F, T1z, Tb, T1k, T1g, T1c, T1d; + V T1B, T1l; + T1Z = VFNMS(LDK(KP912575812), T1V, T1U); + T25 = VFNMS(LDK(KP912575812), T1N, T1M); + { + V T1L, T1O, T21, T20; + T1L = VFNMS(LDK(KP867381224), T1K, T1J); + T1O = VFMA(LDK(KP912575812), T1N, T1M); + T20 = VFNMS(LDK(KP958953096), T1S, T1R); + T21 = VFMA(LDK(KP447417479), T1O, T20); + T1P = VFNMS(LDK(KP809385824), T1O, T1L); + T22 = VFMA(LDK(KP690983005), T21, T1L); + } + { + V T1T, T1W, T27, T26; + T1T = VFMA(LDK(KP958953096), T1S, T1R); + T1W = VFMA(LDK(KP912575812), T1V, T1U); + T26 = VFMA(LDK(KP867381224), T1K, T1J); + T27 = VFMA(LDK(KP447417479), T1W, T26); + T1X = VFMA(LDK(KP894834959), T1W, T1T); + T28 = VFNMS(LDK(KP763932022), T27, T1T); + } + { + V T1y, T1x, T1E, T1h, TG, T1b; + { + V T1r, T1s, T1v, T1w; + T1r = VFNMS(LDK(KP916574801), T1f, T1e); + T1s = VFMA(LDK(KP831864738), T1j, T1i); + T1t = VFMA(LDK(KP904730450), T1s, T1r); + T1y = VFNMS(LDK(KP904730450), T1s, T1r); + T1v = VFNMS(LDK(KP829049696), TF, Tq); + T1w = VFNMS(LDK(KP831864738), T1a, TV); + T1x = VFMA(LDK(KP559154169), T1w, T1v); + T1E = VFNMS(LDK(KP683113946), T1v, T1w); + } + T1u = VFNMS(LDK(KP242145790), T1t, T1q); + T1F = VFMA(LDK(KP617882369), T1y, T1E); + T1z = VFMA(LDK(KP559016994), T1y, T1x); + Tb = VFMA(LDK(KP559016994), Ta, T9); + T1k = VFNMS(LDK(KP831864738), T1j, T1i); + T1g = VFMA(LDK(KP916574801), T1f, T1e); + TG = VFMA(LDK(KP829049696), TF, Tq); + T1b = VFMA(LDK(KP831864738), T1a, TV); + T1c = VFMA(LDK(KP904730450), T1b, TG); + T1h = VFNMS(LDK(KP904730450), T1b, TG); + T1d = VFNMS(LDK(KP242145790), T1c, Tb); + T1B = VADD(T1g, T1h); + T1l = VFNMS(LDK(KP904730450), T1k, T1h); + } + { + V T1H, T1I, T1Q, T1Y; + T1H = VFMA(LDK(KP968583161), T1c, Tb); + T1I = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1t, T1q)); + ST(&(xo[WS(os, 1)]), VFMAI(T1I, T1H), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 24)]), VFNMSI(T1I, T1H), ovs, &(xo[0])); + T1Q = VFNMS(LDK(KP992114701), T1P, Tb); + T1Y = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T1X, T1q)); + ST(&(xo[WS(os, 4)]), VFNMSI(T1Y, T1Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 21)]), VFMAI(T1Y, T1Q), ovs, &(xo[WS(os, 1)])); + } + { + V T1A, T1n, T1m, T1G, T1D, T1C; + T1A = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1z, T1u)); + T1m = VFNMS(LDK(KP618033988), T1l, T1g); + T1n = VFNMS(LDK(KP876091699), T1m, T1d); + ST(&(xo[WS(os, 6)]), VFMAI(T1A, T1n), ovs, &(xo[0])); + ST(&(xo[WS(os, 19)]), VFNMSI(T1A, T1n), ovs, &(xo[WS(os, 1)])); + T1G = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T1F, T1u)); + T1C = VFNMS(LDK(KP683113946), T1B, T1k); + T1D = VFMA(LDK(KP792626838), T1C, T1d); + ST(&(xo[WS(os, 11)]), VFMAI(T1G, T1D), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 14)]), VFNMSI(T1G, T1D), ovs, &(xo[0])); + { + V T24, T2a, T23, T29; + T23 = VFNMS(LDK(KP999544308), T22, T1Z); + T24 = VFNMS(LDK(KP803003575), T23, Tb); + T29 = VFNMS(LDK(KP999544308), T28, T25); + T2a = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T29, T1q)); + ST(&(xo[WS(os, 9)]), VFNMSI(T2a, T24), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 16)]), VFMAI(T2a, T24), ovs, &(xo[0])); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 25, XSIMD_STRING("n1bv_25"), {43, 12, 181, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_25) (planner *p) { + X(kdft_register) (p, n1bv_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 25 -name n1bv_25 -include dft/simd/n1b.h */ + +/* + * This function contains 224 FP additions, 140 FP multiplications, + * (or, 147 additions, 63 multiplications, 77 fused multiply/add), + * 115 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_25(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(50, is), MAKE_VOLATILE_STRIDE(50, os)) { + V T1b, T2o, T1v, T1e, T2W, T2P, T2Q, T2U, T11, T27, TY, T26, T12, T2f, T1j; + V T28, TM, T24, TJ, T23, TN, T2e, T1i, T25, T2M, T2N, T2T, Tm, T1W, Tt; + V T1X, Tu, T20, Tw, T1Y, T7, T1U, Te, T1T, Tf, T21, Tx, T1V; + { + V T1c, T1a, T1t, T17, T1r; + T1c = LD(&(xi[0]), ivs, &(xi[0])); + { + V T18, T19, T15, T16; + T18 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T19 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1a = VADD(T18, T19); + T1t = VSUB(T18, T19); + T15 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T16 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T17 = VADD(T15, T16); + T1r = VSUB(T15, T16); + } + { + V T2n, T1s, T1u, T1d; + T1b = VMUL(LDK(KP559016994), VSUB(T17, T1a)); + T2n = VMUL(LDK(KP587785252), T1r); + T2o = VFNMS(LDK(KP951056516), T1t, T2n); + T1s = VMUL(LDK(KP951056516), T1r); + T1u = VMUL(LDK(KP587785252), T1t); + T1v = VADD(T1s, T1u); + T1d = VADD(T17, T1a); + T1e = VFNMS(LDK(KP250000000), T1d, T1c); + T2W = VADD(T1c, T1d); + } + } + { + V TG, TV, TF, TL, TH, TK, TU, T10, TW, TZ, TX, TI; + TG = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + { + V Tz, TA, TB, TC, TD, TE; + Tz = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TA = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TB = VADD(Tz, TA); + TC = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TD = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TE = VADD(TC, TD); + TF = VMUL(LDK(KP559016994), VSUB(TB, TE)); + TL = VSUB(TC, TD); + TH = VADD(TB, TE); + TK = VSUB(Tz, TA); + } + { + V TO, TP, TQ, TR, TS, TT; + TO = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TP = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TQ = VADD(TO, TP); + TR = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TS = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + TT = VADD(TR, TS); + TU = VMUL(LDK(KP559016994), VSUB(TQ, TT)); + T10 = VSUB(TR, TS); + TW = VADD(TQ, TT); + TZ = VSUB(TO, TP); + } + T2P = VADD(TG, TH); + T2Q = VADD(TV, TW); + T2U = VADD(T2P, T2Q); + T11 = VFMA(LDK(KP475528258), TZ, VMUL(LDK(KP293892626), T10)); + T27 = VFNMS(LDK(KP475528258), T10, VMUL(LDK(KP293892626), TZ)); + TX = VFNMS(LDK(KP250000000), TW, TV); + TY = VADD(TU, TX); + T26 = VSUB(TX, TU); + T12 = VFNMS(LDK(KP1_369094211), T11, VMUL(LDK(KP728968627), TY)); + T2f = VFMA(LDK(KP125581039), T27, VMUL(LDK(KP998026728), T26)); + T1j = VFMA(LDK(KP1_457937254), T11, VMUL(LDK(KP684547105), TY)); + T28 = VFNMS(LDK(KP1_996053456), T27, VMUL(LDK(KP062790519), T26)); + TM = VFMA(LDK(KP475528258), TK, VMUL(LDK(KP293892626), TL)); + T24 = VFNMS(LDK(KP475528258), TL, VMUL(LDK(KP293892626), TK)); + TI = VFNMS(LDK(KP250000000), TH, TG); + TJ = VADD(TF, TI); + T23 = VSUB(TI, TF); + TN = VFNMS(LDK(KP963507348), TM, VMUL(LDK(KP876306680), TJ)); + T2e = VFMA(LDK(KP1_071653589), T24, VMUL(LDK(KP844327925), T23)); + T1i = VFMA(LDK(KP1_752613360), TM, VMUL(LDK(KP481753674), TJ)); + T25 = VFNMS(LDK(KP1_688655851), T24, VMUL(LDK(KP535826794), T23)); + } + { + V Tb, Tq, T3, Tc, T6, Ta, Ti, Tr, Tl, Tp, Ts, Td; + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tq = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + { + V T1, T2, T8, T4, T5, T9; + T1 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T8 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T4, T5); + T3 = VSUB(T1, T2); + Tc = VADD(T8, T9); + T6 = VSUB(T4, T5); + Ta = VMUL(LDK(KP559016994), VSUB(T8, T9)); + } + { + V Tg, Th, Tn, Tj, Tk, To; + Tg = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tn = VADD(Tg, Th); + Tj = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tk = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + To = VADD(Tj, Tk); + Ti = VSUB(Tg, Th); + Tr = VADD(Tn, To); + Tl = VSUB(Tj, Tk); + Tp = VMUL(LDK(KP559016994), VSUB(Tn, To)); + } + T2M = VADD(Tq, Tr); + T2N = VADD(Tb, Tc); + T2T = VADD(T2M, T2N); + Tm = VFMA(LDK(KP475528258), Ti, VMUL(LDK(KP293892626), Tl)); + T1W = VFNMS(LDK(KP475528258), Tl, VMUL(LDK(KP293892626), Ti)); + Ts = VFNMS(LDK(KP250000000), Tr, Tq); + Tt = VADD(Tp, Ts); + T1X = VSUB(Ts, Tp); + Tu = VFMA(LDK(KP1_937166322), Tm, VMUL(LDK(KP248689887), Tt)); + T20 = VFNMS(LDK(KP963507348), T1W, VMUL(LDK(KP876306680), T1X)); + Tw = VFNMS(LDK(KP497379774), Tm, VMUL(LDK(KP968583161), Tt)); + T1Y = VFMA(LDK(KP1_752613360), T1W, VMUL(LDK(KP481753674), T1X)); + T7 = VFMA(LDK(KP475528258), T3, VMUL(LDK(KP293892626), T6)); + T1U = VFNMS(LDK(KP475528258), T6, VMUL(LDK(KP293892626), T3)); + Td = VFNMS(LDK(KP250000000), Tc, Tb); + Te = VADD(Ta, Td); + T1T = VSUB(Td, Ta); + Tf = VFMA(LDK(KP1_071653589), T7, VMUL(LDK(KP844327925), Te)); + T21 = VFMA(LDK(KP1_809654104), T1U, VMUL(LDK(KP425779291), T1T)); + Tx = VFNMS(LDK(KP1_688655851), T7, VMUL(LDK(KP535826794), Te)); + T1V = VFNMS(LDK(KP851558583), T1U, VMUL(LDK(KP904827052), T1T)); + } + { + V T2V, T2X, T2Y, T2S, T30, T2O, T2R, T31, T2Z; + T2V = VMUL(LDK(KP559016994), VSUB(T2T, T2U)); + T2X = VADD(T2T, T2U); + T2Y = VFNMS(LDK(KP250000000), T2X, T2W); + T2O = VSUB(T2M, T2N); + T2R = VSUB(T2P, T2Q); + T2S = VBYI(VFMA(LDK(KP951056516), T2O, VMUL(LDK(KP587785252), T2R))); + T30 = VBYI(VFNMS(LDK(KP951056516), T2R, VMUL(LDK(KP587785252), T2O))); + ST(&(xo[0]), VADD(T2W, T2X), ovs, &(xo[0])); + T31 = VSUB(T2Y, T2V); + ST(&(xo[WS(os, 10)]), VADD(T30, T31), ovs, &(xo[0])); + ST(&(xo[WS(os, 15)]), VSUB(T31, T30), ovs, &(xo[WS(os, 1)])); + T2Z = VADD(T2V, T2Y); + ST(&(xo[WS(os, 5)]), VADD(T2S, T2Z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 20)]), VSUB(T2Z, T2S), ovs, &(xo[0])); + } + { + V T1Z, T2i, T2j, T2g, T2w, T2x, T2y, T2G, T2H, T2I, T2D, T2E, T2F, T2z, T2A; + V T2B, T2p, T2m, T2q, T2b, T2c, T2a, T2d, T2h, T2r; + T1Z = VSUB(T1V, T1Y); + T2i = VADD(T20, T21); + T2j = VSUB(T25, T28); + T2g = VSUB(T2e, T2f); + T2w = VFMA(LDK(KP1_369094211), T1W, VMUL(LDK(KP728968627), T1X)); + T2x = VFNMS(LDK(KP992114701), T1T, VMUL(LDK(KP250666467), T1U)); + T2y = VADD(T2w, T2x); + T2G = VFNMS(LDK(KP125581039), T24, VMUL(LDK(KP998026728), T23)); + T2H = VFMA(LDK(KP1_274847979), T27, VMUL(LDK(KP770513242), T26)); + T2I = VADD(T2G, T2H); + T2D = VFNMS(LDK(KP1_457937254), T1W, VMUL(LDK(KP684547105), T1X)); + T2E = VFMA(LDK(KP1_984229402), T1U, VMUL(LDK(KP125333233), T1T)); + T2F = VADD(T2D, T2E); + T2z = VFMA(LDK(KP1_996053456), T24, VMUL(LDK(KP062790519), T23)); + T2A = VFNMS(LDK(KP637423989), T26, VMUL(LDK(KP1_541026485), T27)); + T2B = VADD(T2z, T2A); + { + V T2k, T2l, T22, T29; + T2k = VADD(T1Y, T1V); + T2l = VADD(T2e, T2f); + T2p = VADD(T2k, T2l); + T2m = VMUL(LDK(KP559016994), VSUB(T2k, T2l)); + T2q = VFNMS(LDK(KP250000000), T2p, T2o); + T2b = VSUB(T1e, T1b); + T22 = VSUB(T20, T21); + T29 = VADD(T25, T28); + T2c = VADD(T22, T29); + T2a = VMUL(LDK(KP559016994), VSUB(T22, T29)); + T2d = VFNMS(LDK(KP250000000), T2c, T2b); + } + { + V T2u, T2v, T2C, T2J; + T2u = VADD(T2b, T2c); + T2v = VBYI(VADD(T2o, T2p)); + ST(&(xo[WS(os, 23)]), VSUB(T2u, T2v), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VADD(T2u, T2v), ovs, &(xo[0])); + T2C = VADD(T2b, VADD(T2y, T2B)); + T2J = VBYI(VSUB(VADD(T2F, T2I), T2o)); + ST(&(xo[WS(os, 22)]), VSUB(T2C, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VADD(T2C, T2J), ovs, &(xo[WS(os, 1)])); + } + T2h = VFMA(LDK(KP951056516), T1Z, VADD(T2a, VFNMS(LDK(KP587785252), T2g, T2d))); + T2r = VBYI(VADD(VFMA(LDK(KP951056516), T2i, VMUL(LDK(KP587785252), T2j)), VADD(T2m, T2q))); + ST(&(xo[WS(os, 18)]), VSUB(T2h, T2r), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VADD(T2h, T2r), ovs, &(xo[WS(os, 1)])); + { + V T2s, T2t, T2K, T2L; + T2s = VFMA(LDK(KP587785252), T1Z, VFMA(LDK(KP951056516), T2g, VSUB(T2d, T2a))); + T2t = VBYI(VADD(VFNMS(LDK(KP951056516), T2j, VMUL(LDK(KP587785252), T2i)), VSUB(T2q, T2m))); + ST(&(xo[WS(os, 13)]), VSUB(T2s, T2t), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VADD(T2s, T2t), ovs, &(xo[0])); + T2K = VBYI(VSUB(VFMA(LDK(KP951056516), VSUB(T2w, T2x), VFMA(LDK(KP309016994), T2F, VFNMS(LDK(KP809016994), T2I, VMUL(LDK(KP587785252), VSUB(T2z, T2A))))), T2o)); + T2L = VFMA(LDK(KP309016994), T2y, VFMA(LDK(KP951056516), VSUB(T2E, T2D), VFMA(LDK(KP587785252), VSUB(T2H, T2G), VFNMS(LDK(KP809016994), T2B, T2b)))); + ST(&(xo[WS(os, 8)]), VADD(T2K, T2L), ovs, &(xo[0])); + ST(&(xo[WS(os, 17)]), VSUB(T2L, T2K), ovs, &(xo[WS(os, 1)])); + } + } + { + V Tv, T1m, T1n, T1k, T1D, T1E, T1F, T1N, T1O, T1P, T1K, T1L, T1M, T1G, T1H; + V T1I, T1w, T1q, T1x, T1f, T1g, T14, T1h, T1l, T1y; + Tv = VSUB(Tf, Tu); + T1m = VSUB(Tw, Tx); + T1n = VSUB(TN, T12); + T1k = VSUB(T1i, T1j); + T1D = VFMA(LDK(KP1_688655851), Tm, VMUL(LDK(KP535826794), Tt)); + T1E = VFMA(LDK(KP1_541026485), T7, VMUL(LDK(KP637423989), Te)); + T1F = VSUB(T1D, T1E); + T1N = VFMA(LDK(KP851558583), TM, VMUL(LDK(KP904827052), TJ)); + T1O = VFMA(LDK(KP1_984229402), T11, VMUL(LDK(KP125333233), TY)); + T1P = VADD(T1N, T1O); + T1K = VFNMS(LDK(KP1_071653589), Tm, VMUL(LDK(KP844327925), Tt)); + T1L = VFNMS(LDK(KP770513242), Te, VMUL(LDK(KP1_274847979), T7)); + T1M = VADD(T1K, T1L); + T1G = VFNMS(LDK(KP425779291), TJ, VMUL(LDK(KP1_809654104), TM)); + T1H = VFNMS(LDK(KP992114701), TY, VMUL(LDK(KP250666467), T11)); + T1I = VADD(T1G, T1H); + { + V T1o, T1p, Ty, T13; + T1o = VADD(Tu, Tf); + T1p = VADD(T1i, T1j); + T1w = VADD(T1o, T1p); + T1q = VMUL(LDK(KP559016994), VSUB(T1o, T1p)); + T1x = VFNMS(LDK(KP250000000), T1w, T1v); + T1f = VADD(T1b, T1e); + Ty = VADD(Tw, Tx); + T13 = VADD(TN, T12); + T1g = VADD(Ty, T13); + T14 = VMUL(LDK(KP559016994), VSUB(Ty, T13)); + T1h = VFNMS(LDK(KP250000000), T1g, T1f); + } + { + V T1B, T1C, T1J, T1Q; + T1B = VADD(T1f, T1g); + T1C = VBYI(VADD(T1v, T1w)); + ST(&(xo[WS(os, 24)]), VSUB(T1B, T1C), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(T1B, T1C), ovs, &(xo[WS(os, 1)])); + T1J = VADD(T1f, VADD(T1F, T1I)); + T1Q = VBYI(VSUB(VADD(T1M, T1P), T1v)); + ST(&(xo[WS(os, 21)]), VSUB(T1J, T1Q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VADD(T1J, T1Q), ovs, &(xo[0])); + } + T1l = VFMA(LDK(KP951056516), Tv, VADD(T14, VFNMS(LDK(KP587785252), T1k, T1h))); + T1y = VBYI(VADD(VFMA(LDK(KP951056516), T1m, VMUL(LDK(KP587785252), T1n)), VADD(T1q, T1x))); + ST(&(xo[WS(os, 19)]), VSUB(T1l, T1y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VADD(T1l, T1y), ovs, &(xo[0])); + { + V T1z, T1A, T1R, T1S; + T1z = VFMA(LDK(KP587785252), Tv, VFMA(LDK(KP951056516), T1k, VSUB(T1h, T14))); + T1A = VBYI(VADD(VFNMS(LDK(KP951056516), T1n, VMUL(LDK(KP587785252), T1m)), VSUB(T1x, T1q))); + ST(&(xo[WS(os, 14)]), VSUB(T1z, T1A), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VADD(T1z, T1A), ovs, &(xo[WS(os, 1)])); + T1R = VBYI(VSUB(VFMA(LDK(KP309016994), T1M, VFMA(LDK(KP951056516), VADD(T1D, T1E), VFNMS(LDK(KP809016994), T1P, VMUL(LDK(KP587785252), VSUB(T1G, T1H))))), T1v)); + T1S = VFMA(LDK(KP951056516), VSUB(T1L, T1K), VFMA(LDK(KP309016994), T1F, VFMA(LDK(KP587785252), VSUB(T1O, T1N), VFNMS(LDK(KP809016994), T1I, T1f)))); + ST(&(xo[WS(os, 9)]), VADD(T1R, T1S), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 16)]), VSUB(T1S, T1R), ovs, &(xo[0])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 25, XSIMD_STRING("n1bv_25"), {147, 63, 77, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_25) (planner *p) { + X(kdft_register) (p, n1bv_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_3.c new file mode 100644 index 000000000..6b0d20195 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_3.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 3 -name n1bv_3 -include dft/simd/n1b.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 3 additions, 1 multiplications, 3 fused multiply/add), + * 11 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_3(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(6, is), MAKE_VOLATILE_STRIDE(6, os)) { + V T1, T4, T6, T2, T3, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T6 = VMUL(LDK(KP866025403), VSUB(T2, T3)); + ST(&(xo[0]), VADD(T1, T4), ovs, &(xo[0])); + T5 = VFNMS(LDK(KP500000000), T4, T1); + ST(&(xo[WS(os, 1)]), VFMAI(T6, T5), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VFNMSI(T6, T5), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 3, XSIMD_STRING("n1bv_3"), {3, 1, 3, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_3) (planner *p) { + X(kdft_register) (p, n1bv_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 3 -name n1bv_3 -include dft/simd/n1b.h */ + +/* + * This function contains 6 FP additions, 2 FP multiplications, + * (or, 5 additions, 1 multiplications, 1 fused multiply/add), + * 11 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_3(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(6, is), MAKE_VOLATILE_STRIDE(6, os)) { + V T4, T3, T5, T1, T2, T6; + T4 = LD(&(xi[0]), ivs, &(xi[0])); + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VBYI(VMUL(LDK(KP866025403), VSUB(T1, T2))); + T5 = VADD(T1, T2); + ST(&(xo[0]), VADD(T4, T5), ovs, &(xo[0])); + T6 = VFNMS(LDK(KP500000000), T5, T4); + ST(&(xo[WS(os, 1)]), VADD(T3, T6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VSUB(T6, T3), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 3, XSIMD_STRING("n1bv_3"), {5, 1, 1, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_3) (planner *p) { + X(kdft_register) (p, n1bv_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_32.c new file mode 100644 index 000000000..b4d9f13c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_32.c @@ -0,0 +1,730 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 32 -name n1bv_32 -include dft/simd/n1b.h */ + +/* + * This function contains 186 FP additions, 98 FP multiplications, + * (or, 88 additions, 0 multiplications, 98 fused multiply/add), + * 58 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T1T, T1W, T2K, T2x, T16, T1A, Tb, T1p, TT, T1v, TY, T1w, T27, T2a, T2b; + V T2H, T2O, TC, T1s, TH, T1t, T20, T23, T24, T2E, T2N, T2g, T2j, Tq, T1B; + V T19, T1q, T2A, T2L; + { + V T3, T1R, T14, T1S, T6, T1U, T9, T1V, T15, Ta; + { + V T1, T2, T12, T13; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T1R = VADD(T1, T2); + T12 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T14 = VSUB(T12, T13); + T1S = VADD(T12, T13); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T1U = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1V = VADD(T7, T8); + } + T1T = VADD(T1R, T1S); + T1W = VADD(T1U, T1V); + T2K = VSUB(T1U, T1V); + T2x = VSUB(T1R, T1S); + T15 = VSUB(T6, T9); + T16 = VFMA(LDK(KP707106781), T15, T14); + T1A = VFNMS(LDK(KP707106781), T15, T14); + Ta = VADD(T6, T9); + Tb = VFMA(LDK(KP707106781), Ta, T3); + T1p = VFNMS(LDK(KP707106781), Ta, T3); + } + { + V TL, T25, TW, T26, TO, T28, TR, T29; + { + V TJ, TK, TU, TV; + TJ = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T25 = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TW = VSUB(TU, TV); + T26 = VADD(TV, TU); + } + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T28 = VADD(TM, TN); + TP = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TQ = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TR = VSUB(TP, TQ); + T29 = VADD(TP, TQ); + } + { + V TS, TX, T2F, T2G; + TS = VADD(TO, TR); + TT = VFMA(LDK(KP707106781), TS, TL); + T1v = VFNMS(LDK(KP707106781), TS, TL); + TX = VSUB(TR, TO); + TY = VFMA(LDK(KP707106781), TX, TW); + T1w = VFNMS(LDK(KP707106781), TX, TW); + T27 = VADD(T25, T26); + T2a = VADD(T28, T29); + T2b = VSUB(T27, T2a); + T2F = VSUB(T25, T26); + T2G = VSUB(T29, T28); + T2H = VFNMS(LDK(KP414213562), T2G, T2F); + T2O = VFMA(LDK(KP414213562), T2F, T2G); + } + } + { + V Tu, T1Y, TF, T1Z, Tx, T21, TA, T22; + { + V Ts, Tt, TD, TE; + Ts = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1Y = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TF = VSUB(TD, TE); + T1Z = VADD(TD, TE); + } + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T21 = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tz = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TA = VSUB(Ty, Tz); + T22 = VADD(Ty, Tz); + } + { + V TB, TG, T2C, T2D; + TB = VADD(Tx, TA); + TC = VFMA(LDK(KP707106781), TB, Tu); + T1s = VFNMS(LDK(KP707106781), TB, Tu); + TG = VSUB(Tx, TA); + TH = VFMA(LDK(KP707106781), TG, TF); + T1t = VFNMS(LDK(KP707106781), TG, TF); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VSUB(T20, T23); + T2C = VSUB(T1Y, T1Z); + T2D = VSUB(T21, T22); + T2E = VFNMS(LDK(KP414213562), T2D, T2C); + T2N = VFMA(LDK(KP414213562), T2C, T2D); + } + } + { + V Te, T2e, To, T2i, Th, T2f, Tl, T2h, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T2e = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T2i = VADD(Tn, Tm); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T2f = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2h = VADD(Tj, Tk); + } + T2g = VADD(T2e, T2f); + T2j = VADD(T2h, T2i); + Ti = VFNMS(LDK(KP414213562), Th, Te); + Tp = VFNMS(LDK(KP414213562), To, Tl); + Tq = VADD(Ti, Tp); + T1B = VSUB(Ti, Tp); + { + V T17, T18, T2y, T2z; + T17 = VFMA(LDK(KP414213562), Te, Th); + T18 = VFMA(LDK(KP414213562), Tl, To); + T19 = VSUB(T17, T18); + T1q = VADD(T17, T18); + T2y = VSUB(T2e, T2f); + T2z = VSUB(T2h, T2i); + T2A = VADD(T2y, T2z); + T2L = VSUB(T2y, T2z); + } + } + { + V T2d, T2n, T2m, T2o; + { + V T1X, T2c, T2k, T2l; + T1X = VSUB(T1T, T1W); + T2c = VADD(T24, T2b); + T2d = VFNMS(LDK(KP707106781), T2c, T1X); + T2n = VFMA(LDK(KP707106781), T2c, T1X); + T2k = VSUB(T2g, T2j); + T2l = VSUB(T24, T2b); + T2m = VFNMS(LDK(KP707106781), T2l, T2k); + T2o = VFMA(LDK(KP707106781), T2l, T2k); + } + ST(&(xo[WS(os, 12)]), VFNMSI(T2m, T2d), ovs, &(xo[0])); + ST(&(xo[WS(os, 28)]), VFNMSI(T2o, T2n), ovs, &(xo[0])); + ST(&(xo[WS(os, 20)]), VFMAI(T2m, T2d), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(T2o, T2n), ovs, &(xo[0])); + } + { + V T2r, T2v, T2u, T2w; + { + V T2p, T2q, T2s, T2t; + T2p = VADD(T1T, T1W); + T2q = VADD(T2g, T2j); + T2r = VSUB(T2p, T2q); + T2v = VADD(T2p, T2q); + T2s = VADD(T20, T23); + T2t = VADD(T27, T2a); + T2u = VSUB(T2s, T2t); + T2w = VADD(T2s, T2t); + } + ST(&(xo[WS(os, 24)]), VFNMSI(T2u, T2r), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T2v, T2w), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFMAI(T2u, T2r), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VSUB(T2v, T2w), ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VFNMS(LDK(KP707106781), T2A, T2x); + T2U = VADD(T2N, T2O); + T2V = VFNMS(LDK(KP923879532), T2U, T2T); + T2Z = VFMA(LDK(KP923879532), T2U, T2T); + T2W = VFNMS(LDK(KP707106781), T2L, T2K); + T2X = VSUB(T2E, T2H); + T2Y = VFMA(LDK(KP923879532), T2X, T2W); + T30 = VFNMS(LDK(KP923879532), T2X, T2W); + } + ST(&(xo[WS(os, 10)]), VFMAI(T2Y, T2V), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VFMAI(T30, T2Z), ovs, &(xo[0])); + ST(&(xo[WS(os, 22)]), VFNMSI(T2Y, T2V), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VFNMSI(T30, T2Z), ovs, &(xo[0])); + } + { + V T2J, T2R, T2Q, T2S; + { + V T2B, T2I, T2M, T2P; + T2B = VFMA(LDK(KP707106781), T2A, T2x); + T2I = VADD(T2E, T2H); + T2J = VFNMS(LDK(KP923879532), T2I, T2B); + T2R = VFMA(LDK(KP923879532), T2I, T2B); + T2M = VFMA(LDK(KP707106781), T2L, T2K); + T2P = VSUB(T2N, T2O); + T2Q = VFNMS(LDK(KP923879532), T2P, T2M); + T2S = VFMA(LDK(KP923879532), T2P, T2M); + } + ST(&(xo[WS(os, 14)]), VFNMSI(T2Q, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(T2S, T2R), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VFMAI(T2Q, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 30)]), VFNMSI(T2S, T2R), ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1J, T1F, T1K, T1y, T1N; + T1r = VFMA(LDK(KP923879532), T1q, T1p); + T1C = VFNMS(LDK(KP923879532), T1B, T1A); + T1M = VFMA(LDK(KP923879532), T1B, T1A); + T1J = VFNMS(LDK(KP923879532), T1q, T1p); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP668178637), T1s, T1t); + T1E = VFNMS(LDK(KP668178637), T1v, T1w); + T1F = VSUB(T1D, T1E); + T1K = VADD(T1D, T1E); + T1u = VFMA(LDK(KP668178637), T1t, T1s); + T1x = VFMA(LDK(KP668178637), T1w, T1v); + T1y = VADD(T1u, T1x); + T1N = VSUB(T1u, T1x); + } + { + V T1z, T1G, T1P, T1Q; + T1z = VFNMS(LDK(KP831469612), T1y, T1r); + T1G = VFNMS(LDK(KP831469612), T1F, T1C); + ST(&(xo[WS(os, 19)]), VFNMSI(T1G, T1z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VFMAI(T1G, T1z), ovs, &(xo[WS(os, 1)])); + T1P = VFNMS(LDK(KP831469612), T1K, T1J); + T1Q = VFMA(LDK(KP831469612), T1N, T1M); + ST(&(xo[WS(os, 5)]), VFMAI(T1Q, T1P), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 27)]), VFNMSI(T1Q, T1P), ovs, &(xo[WS(os, 1)])); + } + { + V T1H, T1I, T1L, T1O; + T1H = VFMA(LDK(KP831469612), T1y, T1r); + T1I = VFMA(LDK(KP831469612), T1F, T1C); + ST(&(xo[WS(os, 3)]), VFNMSI(T1I, T1H), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 29)]), VFMAI(T1I, T1H), ovs, &(xo[WS(os, 1)])); + T1L = VFMA(LDK(KP831469612), T1K, T1J); + T1O = VFNMS(LDK(KP831469612), T1N, T1M); + ST(&(xo[WS(os, 11)]), VFNMSI(T1O, T1L), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 21)]), VFMAI(T1O, T1L), ovs, &(xo[WS(os, 1)])); + } + } + { + V Tr, T1a, T1k, T1h, T1d, T1i, T10, T1l; + Tr = VFMA(LDK(KP923879532), Tq, Tb); + T1a = VFMA(LDK(KP923879532), T19, T16); + T1k = VFNMS(LDK(KP923879532), T19, T16); + T1h = VFNMS(LDK(KP923879532), Tq, Tb); + { + V T1b, T1c, TI, TZ; + T1b = VFMA(LDK(KP198912367), TC, TH); + T1c = VFMA(LDK(KP198912367), TT, TY); + T1d = VSUB(T1b, T1c); + T1i = VADD(T1b, T1c); + TI = VFNMS(LDK(KP198912367), TH, TC); + TZ = VFNMS(LDK(KP198912367), TY, TT); + T10 = VADD(TI, TZ); + T1l = VSUB(TI, TZ); + } + { + V T11, T1e, T1n, T1o; + T11 = VFNMS(LDK(KP980785280), T10, Tr); + T1e = VFNMS(LDK(KP980785280), T1d, T1a); + ST(&(xo[WS(os, 15)]), VFNMSI(T1e, T11), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 17)]), VFMAI(T1e, T11), ovs, &(xo[WS(os, 1)])); + T1n = VFMA(LDK(KP980785280), T1i, T1h); + T1o = VFNMS(LDK(KP980785280), T1l, T1k); + ST(&(xo[WS(os, 7)]), VFNMSI(T1o, T1n), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 25)]), VFMAI(T1o, T1n), ovs, &(xo[WS(os, 1)])); + } + { + V T1f, T1g, T1j, T1m; + T1f = VFMA(LDK(KP980785280), T10, Tr); + T1g = VFMA(LDK(KP980785280), T1d, T1a); + ST(&(xo[WS(os, 31)]), VFNMSI(T1g, T1f), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(T1g, T1f), ovs, &(xo[WS(os, 1)])); + T1j = VFNMS(LDK(KP980785280), T1i, T1h); + T1m = VFMA(LDK(KP980785280), T1l, T1k); + ST(&(xo[WS(os, 9)]), VFMAI(T1m, T1j), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 23)]), VFNMSI(T1m, T1j), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n1bv_32"), {88, 0, 98, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_32) (planner *p) { + X(kdft_register) (p, n1bv_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 32 -name n1bv_32 -include dft/simd/n1b.h */ + +/* + * This function contains 186 FP additions, 42 FP multiplications, + * (or, 170 additions, 26 multiplications, 16 fused multiply/add), + * 58 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T2f, T2k, T2N, T2M, T19, T1B, Tb, T1p, TT, T1v, TY, T1w, T2E, T2F, T2G; + V T24, T2o, TC, T1s, TH, T1t, T2B, T2C, T2D, T1X, T2n, T2I, T2J, Tq, T1A; + V T14, T1q, T2c, T2l; + { + V T3, T2i, T18, T2j, T6, T2d, T9, T2e, T15, Ta; + { + V T1, T2, T16, T17; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T2i = VADD(T1, T2); + T16 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T17 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T18 = VSUB(T16, T17); + T2j = VADD(T16, T17); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T2d = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T2e = VADD(T7, T8); + } + T2f = VSUB(T2d, T2e); + T2k = VSUB(T2i, T2j); + T2N = VADD(T2d, T2e); + T2M = VADD(T2i, T2j); + T15 = VMUL(LDK(KP707106781), VSUB(T6, T9)); + T19 = VSUB(T15, T18); + T1B = VADD(T18, T15); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VSUB(T3, Ta); + T1p = VADD(T3, Ta); + } + { + V TL, T21, TW, T1Y, TO, T22, TS, T1Z; + { + V TJ, TK, TU, TV; + TJ = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T21 = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TW = VSUB(TU, TV); + T1Y = VADD(TU, TV); + } + { + V TM, TN, TQ, TR; + TM = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T22 = VADD(TM, TN); + TQ = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TR = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TS = VSUB(TQ, TR); + T1Z = VADD(TQ, TR); + } + { + V TP, TX, T20, T23; + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + TT = VSUB(TP, TS); + T1v = VADD(TS, TP); + TX = VMUL(LDK(KP707106781), VADD(TL, TO)); + TY = VSUB(TW, TX); + T1w = VADD(TW, TX); + T2E = VADD(T1Y, T1Z); + T2F = VADD(T21, T22); + T2G = VSUB(T2E, T2F); + T20 = VSUB(T1Y, T1Z); + T23 = VSUB(T21, T22); + T24 = VFMA(LDK(KP923879532), T20, VMUL(LDK(KP382683432), T23)); + T2o = VFNMS(LDK(KP382683432), T20, VMUL(LDK(KP923879532), T23)); + } + } + { + V Tu, T1U, TF, T1R, Tx, T1V, TB, T1S; + { + V Ts, Tt, TD, TE; + Ts = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1U = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TF = VSUB(TD, TE); + T1R = VADD(TD, TE); + } + { + V Tv, Tw, Tz, TA; + Tv = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T1V = VADD(Tv, Tw); + Tz = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TA = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TB = VSUB(Tz, TA); + T1S = VADD(Tz, TA); + } + { + V Ty, TG, T1T, T1W; + Ty = VMUL(LDK(KP707106781), VSUB(Tu, Tx)); + TC = VSUB(Ty, TB); + T1s = VADD(TB, Ty); + TG = VMUL(LDK(KP707106781), VADD(Tu, Tx)); + TH = VSUB(TF, TG); + T1t = VADD(TF, TG); + T2B = VADD(T1R, T1S); + T2C = VADD(T1U, T1V); + T2D = VSUB(T2B, T2C); + T1T = VSUB(T1R, T1S); + T1W = VSUB(T1U, T1V); + T1X = VFNMS(LDK(KP382683432), T1W, VMUL(LDK(KP923879532), T1T)); + T2n = VFMA(LDK(KP382683432), T1T, VMUL(LDK(KP923879532), T1W)); + } + } + { + V Te, T26, To, T29, Th, T27, Tl, T2a, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T26 = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T29 = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T27 = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2a = VADD(Tj, Tk); + } + T2I = VADD(T26, T27); + T2J = VADD(T29, T2a); + Ti = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + Tp = VFNMS(LDK(KP382683432), To, VMUL(LDK(KP923879532), Tl)); + Tq = VSUB(Ti, Tp); + T1A = VADD(Ti, Tp); + { + V T12, T13, T28, T2b; + T12 = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + T13 = VFMA(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T14 = VSUB(T12, T13); + T1q = VADD(T12, T13); + T28 = VSUB(T26, T27); + T2b = VSUB(T29, T2a); + T2c = VMUL(LDK(KP707106781), VSUB(T28, T2b)); + T2l = VMUL(LDK(KP707106781), VADD(T28, T2b)); + } + } + { + V T2L, T2R, T2Q, T2S; + { + V T2H, T2K, T2O, T2P; + T2H = VMUL(LDK(KP707106781), VSUB(T2D, T2G)); + T2K = VSUB(T2I, T2J); + T2L = VBYI(VSUB(T2H, T2K)); + T2R = VBYI(VADD(T2K, T2H)); + T2O = VSUB(T2M, T2N); + T2P = VMUL(LDK(KP707106781), VADD(T2D, T2G)); + T2Q = VSUB(T2O, T2P); + T2S = VADD(T2O, T2P); + } + ST(&(xo[WS(os, 12)]), VADD(T2L, T2Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 28)]), VSUB(T2S, T2R), ovs, &(xo[0])); + ST(&(xo[WS(os, 20)]), VSUB(T2Q, T2L), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(T2R, T2S), ovs, &(xo[0])); + } + { + V T2h, T2r, T2q, T2s; + { + V T25, T2g, T2m, T2p; + T25 = VSUB(T1X, T24); + T2g = VSUB(T2c, T2f); + T2h = VBYI(VSUB(T25, T2g)); + T2r = VBYI(VADD(T2g, T25)); + T2m = VSUB(T2k, T2l); + T2p = VSUB(T2n, T2o); + T2q = VSUB(T2m, T2p); + T2s = VADD(T2m, T2p); + } + ST(&(xo[WS(os, 10)]), VADD(T2h, T2q), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VSUB(T2s, T2r), ovs, &(xo[0])); + ST(&(xo[WS(os, 22)]), VSUB(T2q, T2h), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VADD(T2r, T2s), ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VADD(T2M, T2N); + T2U = VADD(T2I, T2J); + T2V = VSUB(T2T, T2U); + T2Z = VADD(T2T, T2U); + T2W = VADD(T2B, T2C); + T2X = VADD(T2E, T2F); + T2Y = VBYI(VSUB(T2W, T2X)); + T30 = VADD(T2W, T2X); + } + ST(&(xo[WS(os, 24)]), VSUB(T2V, T2Y), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T2Z, T30), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(T2V, T2Y), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VSUB(T2Z, T30), ovs, &(xo[0])); + } + { + V T2v, T2z, T2y, T2A; + { + V T2t, T2u, T2w, T2x; + T2t = VADD(T2k, T2l); + T2u = VADD(T1X, T24); + T2v = VADD(T2t, T2u); + T2z = VSUB(T2t, T2u); + T2w = VADD(T2f, T2c); + T2x = VADD(T2n, T2o); + T2y = VBYI(VADD(T2w, T2x)); + T2A = VBYI(VSUB(T2x, T2w)); + } + ST(&(xo[WS(os, 30)]), VSUB(T2v, T2y), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VADD(T2z, T2A), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(T2v, T2y), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VSUB(T2z, T2A), ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1K, T1F, T1N, T1y, T1J; + T1r = VSUB(T1p, T1q); + T1C = VSUB(T1A, T1B); + T1M = VADD(T1p, T1q); + T1K = VADD(T1B, T1A); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP195090322), T1s, VMUL(LDK(KP980785280), T1t)); + T1E = VFMA(LDK(KP195090322), T1v, VMUL(LDK(KP980785280), T1w)); + T1F = VSUB(T1D, T1E); + T1N = VADD(T1D, T1E); + T1u = VFMA(LDK(KP980785280), T1s, VMUL(LDK(KP195090322), T1t)); + T1x = VFNMS(LDK(KP195090322), T1w, VMUL(LDK(KP980785280), T1v)); + T1y = VSUB(T1u, T1x); + T1J = VADD(T1u, T1x); + } + { + V T1z, T1G, T1P, T1Q; + T1z = VADD(T1r, T1y); + T1G = VBYI(VADD(T1C, T1F)); + ST(&(xo[WS(os, 25)]), VSUB(T1z, T1G), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(T1z, T1G), ovs, &(xo[WS(os, 1)])); + T1P = VBYI(VADD(T1K, T1J)); + T1Q = VADD(T1M, T1N); + ST(&(xo[WS(os, 1)]), VADD(T1P, T1Q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 31)]), VSUB(T1Q, T1P), ovs, &(xo[WS(os, 1)])); + } + { + V T1H, T1I, T1L, T1O; + T1H = VSUB(T1r, T1y); + T1I = VBYI(VSUB(T1F, T1C)); + ST(&(xo[WS(os, 23)]), VSUB(T1H, T1I), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(T1H, T1I), ovs, &(xo[WS(os, 1)])); + T1L = VBYI(VSUB(T1J, T1K)); + T1O = VSUB(T1M, T1N); + ST(&(xo[WS(os, 15)]), VADD(T1L, T1O), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 17)]), VSUB(T1O, T1L), ovs, &(xo[WS(os, 1)])); + } + } + { + V Tr, T1a, T1k, T1i, T1d, T1l, T10, T1h; + Tr = VSUB(Tb, Tq); + T1a = VSUB(T14, T19); + T1k = VADD(Tb, Tq); + T1i = VADD(T19, T14); + { + V T1b, T1c, TI, TZ; + T1b = VFNMS(LDK(KP555570233), TC, VMUL(LDK(KP831469612), TH)); + T1c = VFMA(LDK(KP555570233), TT, VMUL(LDK(KP831469612), TY)); + T1d = VSUB(T1b, T1c); + T1l = VADD(T1b, T1c); + TI = VFMA(LDK(KP831469612), TC, VMUL(LDK(KP555570233), TH)); + TZ = VFNMS(LDK(KP555570233), TY, VMUL(LDK(KP831469612), TT)); + T10 = VSUB(TI, TZ); + T1h = VADD(TI, TZ); + } + { + V T11, T1e, T1n, T1o; + T11 = VADD(Tr, T10); + T1e = VBYI(VADD(T1a, T1d)); + ST(&(xo[WS(os, 27)]), VSUB(T11, T1e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(T11, T1e), ovs, &(xo[WS(os, 1)])); + T1n = VBYI(VADD(T1i, T1h)); + T1o = VADD(T1k, T1l); + ST(&(xo[WS(os, 3)]), VADD(T1n, T1o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 29)]), VSUB(T1o, T1n), ovs, &(xo[WS(os, 1)])); + } + { + V T1f, T1g, T1j, T1m; + T1f = VSUB(Tr, T10); + T1g = VBYI(VSUB(T1d, T1a)); + ST(&(xo[WS(os, 21)]), VSUB(T1f, T1g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VADD(T1f, T1g), ovs, &(xo[WS(os, 1)])); + T1j = VBYI(VSUB(T1h, T1i)); + T1m = VSUB(T1k, T1l); + ST(&(xo[WS(os, 13)]), VADD(T1j, T1m), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 19)]), VSUB(T1m, T1j), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n1bv_32"), {170, 26, 16, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_32) (planner *p) { + X(kdft_register) (p, n1bv_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_4.c new file mode 100644 index 000000000..c6ed8c7ce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_4.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 4 -name n1bv_4 -include dft/simd/n1b.h */ + +/* + * This function contains 8 FP additions, 2 FP multiplications, + * (or, 6 additions, 0 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T8 = VADD(T4, T5); + } + ST(&(xo[WS(os, 3)]), VFNMSI(T6, T3), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T7, T8), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VFMAI(T6, T3), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VSUB(T7, T8), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n1bv_4"), {6, 0, 2, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_4) (planner *p) { + X(kdft_register) (p, n1bv_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 4 -name n1bv_4 -include dft/simd/n1b.h */ + +/* + * This function contains 8 FP additions, 0 FP multiplications, + * (or, 8 additions, 0 multiplications, 0 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VBYI(VSUB(T4, T5)); + T8 = VADD(T4, T5); + } + ST(&(xo[WS(os, 3)]), VSUB(T3, T6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T7, T8), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(T3, T6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VSUB(T7, T8), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n1bv_4"), {8, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_4) (planner *p) { + X(kdft_register) (p, n1bv_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_5.c new file mode 100644 index 000000000..0e852bd97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_5.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 5 -name n1bv_5 -include dft/simd/n1b.h */ + +/* + * This function contains 16 FP additions, 11 FP multiplications, + * (or, 7 additions, 2 multiplications, 9 fused multiply/add), + * 18 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_5(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(10, is), MAKE_VOLATILE_STRIDE(10, os)) { + V T1, T8, Td, Ta, Tc; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T2, T3, T4, T5, T6, T7; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + T8 = VADD(T4, T7); + Td = VSUB(T5, T6); + Ta = VSUB(T4, T7); + Tc = VSUB(T2, T3); + } + ST(&(xo[0]), VADD(T1, T8), ovs, &(xo[0])); + { + V Te, Tg, Tb, Tf, T9; + Te = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Td, Tc)); + Tg = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tc, Td)); + T9 = VFNMS(LDK(KP250000000), T8, T1); + Tb = VFMA(LDK(KP559016994), Ta, T9); + Tf = VFNMS(LDK(KP559016994), Ta, T9); + ST(&(xo[WS(os, 1)]), VFMAI(Te, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(Tg, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VFNMSI(Te, Tb), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFNMSI(Tg, Tf), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 5, XSIMD_STRING("n1bv_5"), {7, 2, 9, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_5) (planner *p) { + X(kdft_register) (p, n1bv_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 5 -name n1bv_5 -include dft/simd/n1b.h */ + +/* + * This function contains 16 FP additions, 6 FP multiplications, + * (or, 13 additions, 3 multiplications, 3 fused multiply/add), + * 18 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_5(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(10, is), MAKE_VOLATILE_STRIDE(10, os)) { + V Tb, T3, Tc, T6, Ta; + Tb = LD(&(xi[0]), ivs, &(xi[0])); + { + V T1, T2, T8, T4, T5, T9; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T4, T5); + T3 = VSUB(T1, T2); + Tc = VADD(T8, T9); + T6 = VSUB(T4, T5); + Ta = VMUL(LDK(KP559016994), VSUB(T8, T9)); + } + ST(&(xo[0]), VADD(Tb, Tc), ovs, &(xo[0])); + { + V T7, Tf, Te, Tg, Td; + T7 = VBYI(VFMA(LDK(KP951056516), T3, VMUL(LDK(KP587785252), T6))); + Tf = VBYI(VFNMS(LDK(KP951056516), T6, VMUL(LDK(KP587785252), T3))); + Td = VFNMS(LDK(KP250000000), Tc, Tb); + Te = VADD(Ta, Td); + Tg = VSUB(Td, Ta); + ST(&(xo[WS(os, 1)]), VADD(T7, Te), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VSUB(Tg, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VSUB(Te, T7), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(Tf, Tg), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 5, XSIMD_STRING("n1bv_5"), {13, 3, 3, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_5) (planner *p) { + X(kdft_register) (p, n1bv_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_6.c new file mode 100644 index 000000000..763e1ff3c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_6.c @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:55 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 6 -name n1bv_6 -include dft/simd/n1b.h */ + +/* + * This function contains 18 FP additions, 8 FP multiplications, + * (or, 12 additions, 2 multiplications, 6 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V T3, Td, T6, Te, T9, Tf, Ta, Tg, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Td = VADD(T1, T2); + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Te = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tg = VADD(Te, Tf); + ST(&(xo[WS(os, 3)]), VADD(T3, Ta), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Td, Tg), ovs, &(xo[0])); + { + V Tb, Tc, Th, Ti; + Tb = VFNMS(LDK(KP500000000), Ta, T3); + Tc = VMUL(LDK(KP866025403), VSUB(T6, T9)); + ST(&(xo[WS(os, 1)]), VFMAI(Tc, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFNMSI(Tc, Tb), ovs, &(xo[WS(os, 1)])); + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VMUL(LDK(KP866025403), VSUB(Te, Tf)); + ST(&(xo[WS(os, 2)]), VFNMSI(Ti, Th), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(Ti, Th), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n1bv_6"), {12, 2, 6, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_6) (planner *p) { + X(kdft_register) (p, n1bv_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 6 -name n1bv_6 -include dft/simd/n1b.h */ + +/* + * This function contains 18 FP additions, 4 FP multiplications, + * (or, 16 additions, 2 multiplications, 2 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V Ta, Td, T3, Te, T6, Tf, Tb, Tg, T8, T9; + T8 = LD(&(xi[0]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + Td = VADD(T8, T9); + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Te = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tf = VADD(T4, T5); + } + Tb = VADD(T3, T6); + Tg = VADD(Te, Tf); + ST(&(xo[WS(os, 3)]), VADD(Ta, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Td, Tg), ovs, &(xo[0])); + { + V T7, Tc, Th, Ti; + T7 = VBYI(VMUL(LDK(KP866025403), VSUB(T3, T6))); + Tc = VFNMS(LDK(KP500000000), Tb, Ta); + ST(&(xo[WS(os, 1)]), VADD(T7, Tc), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VSUB(Tc, T7), ovs, &(xo[WS(os, 1)])); + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VBYI(VMUL(LDK(KP866025403), VSUB(Te, Tf))); + ST(&(xo[WS(os, 2)]), VSUB(Th, Ti), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(Ti, Th), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n1bv_6"), {16, 2, 2, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_6) (planner *p) { + X(kdft_register) (p, n1bv_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_64.c new file mode 100644 index 000000000..43a410f44 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_64.c @@ -0,0 +1,1634 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 64 -name n1bv_64 -include dft/simd/n1b.h */ + +/* + * This function contains 456 FP additions, 258 FP multiplications, + * (or, 198 additions, 0 multiplications, 258 fused multiply/add), + * 108 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T7, T26, T47, T69, T5k, T6A, T2V, T3z, Tm, T27, T5n, T6a, T2Y, T3M, T4e; + V T6B, TC, T29, T6e, T6D, T3i, T3A, T4o, T5p, TR, T2a, T6h, T6E, T3l, T3B; + V T4x, T5q, T1N, T2x, T6t, T71, T6w, T72, T1W, T2y, T39, T3H, T57, T5N, T5e; + V T5O, T3c, T3I, T1g, T2u, T6m, T6Y, T6p, T6Z, T1p, T2v, T32, T3E, T4M, T5K; + V T4T, T5L, T35, T3F; + { + V T3, T43, T25, T45, T6, T5i, T22, T44; + { + V T1, T2, T23, T24; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T43 = VSUB(T1, T2); + T23 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T24 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T25 = VADD(T23, T24); + T45 = VSUB(T23, T24); + } + { + V T4, T5, T20, T21; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T5i = VSUB(T4, T5); + T20 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T21 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T22 = VADD(T20, T21); + T44 = VSUB(T20, T21); + } + T7 = VSUB(T3, T6); + T26 = VSUB(T22, T25); + { + V T46, T5j, T2T, T2U; + T46 = VADD(T44, T45); + T47 = VFMA(LDK(KP707106781), T46, T43); + T69 = VFNMS(LDK(KP707106781), T46, T43); + T5j = VSUB(T44, T45); + T5k = VFMA(LDK(KP707106781), T5j, T5i); + T6A = VFNMS(LDK(KP707106781), T5j, T5i); + T2T = VADD(T3, T6); + T2U = VADD(T22, T25); + T2V = VADD(T2T, T2U); + T3z = VSUB(T2T, T2U); + } + } + { + V Ta, T48, Tk, T4c, Td, T49, Th, T4b; + { + V T8, T9, Ti, Tj; + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + T48 = VSUB(T8, T9); + Ti = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + Tk = VADD(Ti, Tj); + T4c = VSUB(Tj, Ti); + } + { + V Tb, Tc, Tf, Tg; + Tb = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Td = VADD(Tb, Tc); + T49 = VSUB(Tb, Tc); + Tf = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Th = VADD(Tf, Tg); + T4b = VSUB(Tf, Tg); + } + { + V Te, Tl, T5l, T5m; + Te = VSUB(Ta, Td); + Tl = VSUB(Th, Tk); + Tm = VADD(Te, Tl); + T27 = VSUB(Te, Tl); + T5l = VFMA(LDK(KP414213562), T48, T49); + T5m = VFMA(LDK(KP414213562), T4b, T4c); + T5n = VSUB(T5l, T5m); + T6a = VADD(T5l, T5m); + } + { + V T2W, T2X, T4a, T4d; + T2W = VADD(Ta, Td); + T2X = VADD(Th, Tk); + T2Y = VADD(T2W, T2X); + T3M = VSUB(T2W, T2X); + T4a = VFNMS(LDK(KP414213562), T49, T48); + T4d = VFNMS(LDK(KP414213562), T4c, T4b); + T4e = VADD(T4a, T4d); + T6B = VSUB(T4a, T4d); + } + } + { + V Tq, T4g, Tt, T4l, Tx, T4m, TA, T4j; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + T4g = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + T4l = VSUB(Tr, Ts); + { + V Tv, Tw, T4h, Ty, Tz, T4i; + Tv = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T4h = VSUB(Tv, Tw); + Ty = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T4i = VSUB(Ty, Tz); + Tx = VADD(Tv, Tw); + T4m = VSUB(T4h, T4i); + TA = VADD(Ty, Tz); + T4j = VADD(T4h, T4i); + } + } + { + V Tu, TB, T6c, T6d; + Tu = VSUB(Tq, Tt); + TB = VSUB(Tx, TA); + TC = VFNMS(LDK(KP414213562), TB, Tu); + T29 = VFMA(LDK(KP414213562), Tu, TB); + T6c = VFNMS(LDK(KP707106781), T4m, T4l); + T6d = VFNMS(LDK(KP707106781), T4j, T4g); + T6e = VFNMS(LDK(KP668178637), T6d, T6c); + T6D = VFMA(LDK(KP668178637), T6c, T6d); + } + { + V T3g, T3h, T4k, T4n; + T3g = VADD(Tq, Tt); + T3h = VADD(Tx, TA); + T3i = VADD(T3g, T3h); + T3A = VSUB(T3g, T3h); + T4k = VFMA(LDK(KP707106781), T4j, T4g); + T4n = VFMA(LDK(KP707106781), T4m, T4l); + T4o = VFNMS(LDK(KP198912367), T4n, T4k); + T5p = VFMA(LDK(KP198912367), T4k, T4n); + } + } + { + V TF, T4p, TI, T4u, TM, T4v, TP, T4s; + { + V TD, TE, TG, TH; + TD = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TF = VADD(TD, TE); + T4p = VSUB(TD, TE); + TG = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TH = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TI = VADD(TG, TH); + T4u = VSUB(TH, TG); + { + V TK, TL, T4r, TN, TO, T4q; + TK = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + TL = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T4r = VSUB(TK, TL); + TN = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + TO = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T4q = VSUB(TN, TO); + TM = VADD(TK, TL); + T4v = VSUB(T4r, T4q); + TP = VADD(TN, TO); + T4s = VADD(T4q, T4r); + } + } + { + V TJ, TQ, T6f, T6g; + TJ = VSUB(TF, TI); + TQ = VSUB(TM, TP); + TR = VFNMS(LDK(KP414213562), TQ, TJ); + T2a = VFMA(LDK(KP414213562), TJ, TQ); + T6f = VFNMS(LDK(KP707106781), T4v, T4u); + T6g = VFNMS(LDK(KP707106781), T4s, T4p); + T6h = VFNMS(LDK(KP668178637), T6g, T6f); + T6E = VFMA(LDK(KP668178637), T6f, T6g); + } + { + V T3j, T3k, T4t, T4w; + T3j = VADD(TF, TI); + T3k = VADD(TP, TM); + T3l = VADD(T3j, T3k); + T3B = VSUB(T3j, T3k); + T4t = VFMA(LDK(KP707106781), T4s, T4p); + T4w = VFMA(LDK(KP707106781), T4v, T4u); + T4x = VFNMS(LDK(KP198912367), T4w, T4t); + T5q = VFMA(LDK(KP198912367), T4t, T4w); + } + } + { + V T1t, T4V, T1w, T58, T1Q, T59, T1T, T4Y, T1A, T1D, T1E, T5b, T52, T1H, T1K; + V T1L, T5c, T55; + { + V T1r, T1s, T1u, T1v; + T1r = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T1s = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T1t = VADD(T1r, T1s); + T4V = VSUB(T1r, T1s); + T1u = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1v = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T1w = VADD(T1u, T1v); + T58 = VSUB(T1v, T1u); + } + { + V T1O, T1P, T4X, T1R, T1S, T4W; + T1O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T4X = VSUB(T1O, T1P); + T1R = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1S = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T4W = VSUB(T1R, T1S); + T1Q = VADD(T1O, T1P); + T59 = VSUB(T4X, T4W); + T1T = VADD(T1R, T1S); + T4Y = VADD(T4W, T4X); + } + { + V T50, T51, T53, T54; + { + V T1y, T1z, T1B, T1C; + T1y = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1z = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1A = VADD(T1y, T1z); + T50 = VSUB(T1y, T1z); + T1B = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1C = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1D = VADD(T1B, T1C); + T51 = VSUB(T1C, T1B); + } + T1E = VSUB(T1A, T1D); + T5b = VFNMS(LDK(KP414213562), T50, T51); + T52 = VFMA(LDK(KP414213562), T51, T50); + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1G = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1H = VADD(T1F, T1G); + T53 = VSUB(T1F, T1G); + T1I = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1J = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T1K = VADD(T1I, T1J); + T54 = VSUB(T1J, T1I); + } + T1L = VSUB(T1H, T1K); + T5c = VFMA(LDK(KP414213562), T53, T54); + T55 = VFNMS(LDK(KP414213562), T54, T53); + } + { + V T1x, T1M, T6r, T6s; + T1x = VSUB(T1t, T1w); + T1M = VADD(T1E, T1L); + T1N = VFMA(LDK(KP707106781), T1M, T1x); + T2x = VFNMS(LDK(KP707106781), T1M, T1x); + T6r = VFNMS(LDK(KP707106781), T4Y, T4V); + T6s = VSUB(T5c, T5b); + T6t = VFNMS(LDK(KP923879532), T6s, T6r); + T71 = VFMA(LDK(KP923879532), T6s, T6r); + } + { + V T6u, T6v, T1U, T1V; + T6u = VFNMS(LDK(KP707106781), T59, T58); + T6v = VSUB(T55, T52); + T6w = VFMA(LDK(KP923879532), T6v, T6u); + T72 = VFNMS(LDK(KP923879532), T6v, T6u); + T1U = VSUB(T1Q, T1T); + T1V = VSUB(T1L, T1E); + T1W = VFMA(LDK(KP707106781), T1V, T1U); + T2y = VFNMS(LDK(KP707106781), T1V, T1U); + } + { + V T37, T38, T4Z, T56; + T37 = VADD(T1t, T1w); + T38 = VADD(T1T, T1Q); + T39 = VADD(T37, T38); + T3H = VSUB(T37, T38); + T4Z = VFMA(LDK(KP707106781), T4Y, T4V); + T56 = VADD(T52, T55); + T57 = VFMA(LDK(KP923879532), T56, T4Z); + T5N = VFNMS(LDK(KP923879532), T56, T4Z); + } + { + V T5a, T5d, T3a, T3b; + T5a = VFMA(LDK(KP707106781), T59, T58); + T5d = VADD(T5b, T5c); + T5e = VFMA(LDK(KP923879532), T5d, T5a); + T5O = VFNMS(LDK(KP923879532), T5d, T5a); + T3a = VADD(T1A, T1D); + T3b = VADD(T1H, T1K); + T3c = VADD(T3a, T3b); + T3I = VSUB(T3b, T3a); + } + } + { + V TW, T4A, TZ, T4N, T1j, T4O, T1m, T4D, T13, T16, T17, T4Q, T4H, T1a, T1d; + V T1e, T4R, T4K; + { + V TU, TV, TX, TY; + TU = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + TW = VADD(TU, TV); + T4A = VSUB(TU, TV); + TX = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TY = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + TZ = VADD(TX, TY); + T4N = VSUB(TX, TY); + } + { + V T1h, T1i, T4B, T1k, T1l, T4C; + T1h = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T4B = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T4C = VSUB(T1k, T1l); + T1j = VADD(T1h, T1i); + T4O = VSUB(T4B, T4C); + T1m = VADD(T1k, T1l); + T4D = VADD(T4B, T4C); + } + { + V T4F, T4G, T4I, T4J; + { + V T11, T12, T14, T15; + T11 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T12 = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T13 = VADD(T11, T12); + T4F = VSUB(T11, T12); + T14 = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T15 = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T16 = VADD(T14, T15); + T4G = VSUB(T14, T15); + } + T17 = VSUB(T13, T16); + T4Q = VFMA(LDK(KP414213562), T4F, T4G); + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + { + V T18, T19, T1b, T1c; + T18 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T19 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T1a = VADD(T18, T19); + T4I = VSUB(T18, T19); + T1b = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T1c = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T1d = VADD(T1b, T1c); + T4J = VSUB(T1b, T1c); + } + T1e = VSUB(T1a, T1d); + T4R = VFNMS(LDK(KP414213562), T4I, T4J); + T4K = VFMA(LDK(KP414213562), T4J, T4I); + } + { + V T10, T1f, T6k, T6l; + T10 = VSUB(TW, TZ); + T1f = VADD(T17, T1e); + T1g = VFMA(LDK(KP707106781), T1f, T10); + T2u = VFNMS(LDK(KP707106781), T1f, T10); + T6k = VFNMS(LDK(KP707106781), T4D, T4A); + T6l = VSUB(T4Q, T4R); + T6m = VFNMS(LDK(KP923879532), T6l, T6k); + T6Y = VFMA(LDK(KP923879532), T6l, T6k); + } + { + V T6n, T6o, T1n, T1o; + T6n = VFNMS(LDK(KP707106781), T4O, T4N); + T6o = VSUB(T4H, T4K); + T6p = VFMA(LDK(KP923879532), T6o, T6n); + T6Z = VFNMS(LDK(KP923879532), T6o, T6n); + T1n = VSUB(T1j, T1m); + T1o = VSUB(T17, T1e); + T1p = VFMA(LDK(KP707106781), T1o, T1n); + T2v = VFNMS(LDK(KP707106781), T1o, T1n); + } + { + V T30, T31, T4E, T4L; + T30 = VADD(TW, TZ); + T31 = VADD(T1j, T1m); + T32 = VADD(T30, T31); + T3E = VSUB(T30, T31); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4L = VADD(T4H, T4K); + T4M = VFMA(LDK(KP923879532), T4L, T4E); + T5K = VFNMS(LDK(KP923879532), T4L, T4E); + } + { + V T4P, T4S, T33, T34; + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4S = VADD(T4Q, T4R); + T4T = VFMA(LDK(KP923879532), T4S, T4P); + T5L = VFNMS(LDK(KP923879532), T4S, T4P); + T33 = VADD(T13, T16); + T34 = VADD(T1a, T1d); + T35 = VADD(T33, T34); + T3F = VSUB(T33, T34); + } + } + { + V T3t, T3x, T3w, T3y; + { + V T3r, T3s, T3u, T3v; + T3r = VADD(T2V, T2Y); + T3s = VADD(T3i, T3l); + T3t = VSUB(T3r, T3s); + T3x = VADD(T3r, T3s); + T3u = VADD(T32, T35); + T3v = VADD(T39, T3c); + T3w = VSUB(T3u, T3v); + T3y = VADD(T3u, T3v); + } + ST(&(xo[WS(os, 48)]), VFNMSI(T3w, T3t), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T3x, T3y), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VFMAI(T3w, T3t), ovs, &(xo[0])); + ST(&(xo[WS(os, 32)]), VSUB(T3x, T3y), ovs, &(xo[0])); + } + { + V T2Z, T3m, T3e, T3n, T36, T3d; + T2Z = VSUB(T2V, T2Y); + T3m = VSUB(T3i, T3l); + T36 = VSUB(T32, T35); + T3d = VSUB(T39, T3c); + T3e = VADD(T36, T3d); + T3n = VSUB(T36, T3d); + { + V T3f, T3o, T3p, T3q; + T3f = VFNMS(LDK(KP707106781), T3e, T2Z); + T3o = VFNMS(LDK(KP707106781), T3n, T3m); + ST(&(xo[WS(os, 24)]), VFNMSI(T3o, T3f), ovs, &(xo[0])); + ST(&(xo[WS(os, 40)]), VFMAI(T3o, T3f), ovs, &(xo[0])); + T3p = VFMA(LDK(KP707106781), T3e, T2Z); + T3q = VFMA(LDK(KP707106781), T3n, T3m); + ST(&(xo[WS(os, 8)]), VFMAI(T3q, T3p), ovs, &(xo[0])); + ST(&(xo[WS(os, 56)]), VFNMSI(T3q, T3p), ovs, &(xo[0])); + } + } + { + V T3D, T3V, T3O, T3Y, T3K, T3Z, T3R, T3W, T3C, T3N; + T3C = VADD(T3A, T3B); + T3D = VFMA(LDK(KP707106781), T3C, T3z); + T3V = VFNMS(LDK(KP707106781), T3C, T3z); + T3N = VSUB(T3A, T3B); + T3O = VFMA(LDK(KP707106781), T3N, T3M); + T3Y = VFNMS(LDK(KP707106781), T3N, T3M); + { + V T3G, T3J, T3P, T3Q; + T3G = VFNMS(LDK(KP414213562), T3F, T3E); + T3J = VFNMS(LDK(KP414213562), T3I, T3H); + T3K = VADD(T3G, T3J); + T3Z = VSUB(T3G, T3J); + T3P = VFMA(LDK(KP414213562), T3E, T3F); + T3Q = VFMA(LDK(KP414213562), T3H, T3I); + T3R = VSUB(T3P, T3Q); + T3W = VADD(T3P, T3Q); + } + { + V T3L, T3S, T41, T42; + T3L = VFNMS(LDK(KP923879532), T3K, T3D); + T3S = VFNMS(LDK(KP923879532), T3R, T3O); + ST(&(xo[WS(os, 28)]), VFNMSI(T3S, T3L), ovs, &(xo[0])); + ST(&(xo[WS(os, 36)]), VFMAI(T3S, T3L), ovs, &(xo[0])); + T41 = VFMA(LDK(KP923879532), T3W, T3V); + T42 = VFNMS(LDK(KP923879532), T3Z, T3Y); + ST(&(xo[WS(os, 12)]), VFNMSI(T42, T41), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VFMAI(T42, T41), ovs, &(xo[0])); + } + { + V T3T, T3U, T3X, T40; + T3T = VFMA(LDK(KP923879532), T3K, T3D); + T3U = VFMA(LDK(KP923879532), T3R, T3O); + ST(&(xo[WS(os, 60)]), VFNMSI(T3U, T3T), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(T3U, T3T), ovs, &(xo[0])); + T3X = VFNMS(LDK(KP923879532), T3W, T3V); + T40 = VFMA(LDK(KP923879532), T3Z, T3Y); + ST(&(xo[WS(os, 20)]), VFMAI(T40, T3X), ovs, &(xo[0])); + ST(&(xo[WS(os, 44)]), VFNMSI(T40, T3X), ovs, &(xo[0])); + } + } + { + V T6X, T7f, T7b, T7g, T74, T7j, T78, T7i; + { + V T6V, T6W, T79, T7a; + T6V = VFMA(LDK(KP923879532), T6a, T69); + T6W = VADD(T6D, T6E); + T6X = VFMA(LDK(KP831469612), T6W, T6V); + T7f = VFNMS(LDK(KP831469612), T6W, T6V); + T79 = VFNMS(LDK(KP303346683), T6Y, T6Z); + T7a = VFNMS(LDK(KP303346683), T71, T72); + T7b = VSUB(T79, T7a); + T7g = VADD(T79, T7a); + } + { + V T70, T73, T76, T77; + T70 = VFMA(LDK(KP303346683), T6Z, T6Y); + T73 = VFMA(LDK(KP303346683), T72, T71); + T74 = VADD(T70, T73); + T7j = VSUB(T70, T73); + T76 = VFNMS(LDK(KP923879532), T6B, T6A); + T77 = VSUB(T6e, T6h); + T78 = VFMA(LDK(KP831469612), T77, T76); + T7i = VFNMS(LDK(KP831469612), T77, T76); + } + { + V T75, T7c, T7l, T7m; + T75 = VFNMS(LDK(KP956940335), T74, T6X); + T7c = VFNMS(LDK(KP956940335), T7b, T78); + ST(&(xo[WS(os, 35)]), VFNMSI(T7c, T75), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 29)]), VFMAI(T7c, T75), ovs, &(xo[WS(os, 1)])); + T7l = VFNMS(LDK(KP956940335), T7g, T7f); + T7m = VFMA(LDK(KP956940335), T7j, T7i); + ST(&(xo[WS(os, 13)]), VFMAI(T7m, T7l), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 51)]), VFNMSI(T7m, T7l), ovs, &(xo[WS(os, 1)])); + } + { + V T7d, T7e, T7h, T7k; + T7d = VFMA(LDK(KP956940335), T74, T6X); + T7e = VFMA(LDK(KP956940335), T7b, T78); + ST(&(xo[WS(os, 3)]), VFNMSI(T7e, T7d), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 61)]), VFMAI(T7e, T7d), ovs, &(xo[WS(os, 1)])); + T7h = VFMA(LDK(KP956940335), T7g, T7f); + T7k = VFNMS(LDK(KP956940335), T7j, T7i); + ST(&(xo[WS(os, 19)]), VFNMSI(T7k, T7h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 45)]), VFMAI(T7k, T7h), ovs, &(xo[WS(os, 1)])); + } + } + { + V TT, T2j, T2f, T2k, T1Y, T2n, T2c, T2m; + { + V Tn, TS, T2d, T2e; + Tn = VFMA(LDK(KP707106781), Tm, T7); + TS = VADD(TC, TR); + TT = VFMA(LDK(KP923879532), TS, Tn); + T2j = VFNMS(LDK(KP923879532), TS, Tn); + T2d = VFMA(LDK(KP198912367), T1g, T1p); + T2e = VFMA(LDK(KP198912367), T1N, T1W); + T2f = VSUB(T2d, T2e); + T2k = VADD(T2d, T2e); + } + { + V T1q, T1X, T28, T2b; + T1q = VFNMS(LDK(KP198912367), T1p, T1g); + T1X = VFNMS(LDK(KP198912367), T1W, T1N); + T1Y = VADD(T1q, T1X); + T2n = VSUB(T1q, T1X); + T28 = VFMA(LDK(KP707106781), T27, T26); + T2b = VSUB(T29, T2a); + T2c = VFMA(LDK(KP923879532), T2b, T28); + T2m = VFNMS(LDK(KP923879532), T2b, T28); + } + { + V T1Z, T2g, T2p, T2q; + T1Z = VFNMS(LDK(KP980785280), T1Y, TT); + T2g = VFNMS(LDK(KP980785280), T2f, T2c); + ST(&(xo[WS(os, 30)]), VFNMSI(T2g, T1Z), ovs, &(xo[0])); + ST(&(xo[WS(os, 34)]), VFMAI(T2g, T1Z), ovs, &(xo[0])); + T2p = VFMA(LDK(KP980785280), T2k, T2j); + T2q = VFNMS(LDK(KP980785280), T2n, T2m); + ST(&(xo[WS(os, 14)]), VFNMSI(T2q, T2p), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VFMAI(T2q, T2p), ovs, &(xo[0])); + } + { + V T2h, T2i, T2l, T2o; + T2h = VFMA(LDK(KP980785280), T1Y, TT); + T2i = VFMA(LDK(KP980785280), T2f, T2c); + ST(&(xo[WS(os, 62)]), VFNMSI(T2i, T2h), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(T2i, T2h), ovs, &(xo[0])); + T2l = VFNMS(LDK(KP980785280), T2k, T2j); + T2o = VFMA(LDK(KP980785280), T2n, T2m); + ST(&(xo[WS(os, 18)]), VFMAI(T2o, T2l), ovs, &(xo[0])); + ST(&(xo[WS(os, 46)]), VFNMSI(T2o, T2l), ovs, &(xo[0])); + } + } + { + V T4z, T5z, T5v, T5A, T5g, T5D, T5s, T5C; + { + V T4f, T4y, T5t, T5u; + T4f = VFMA(LDK(KP923879532), T4e, T47); + T4y = VADD(T4o, T4x); + T4z = VFMA(LDK(KP980785280), T4y, T4f); + T5z = VFNMS(LDK(KP980785280), T4y, T4f); + T5t = VFMA(LDK(KP098491403), T4M, T4T); + T5u = VFMA(LDK(KP098491403), T57, T5e); + T5v = VSUB(T5t, T5u); + T5A = VADD(T5t, T5u); + } + { + V T4U, T5f, T5o, T5r; + T4U = VFNMS(LDK(KP098491403), T4T, T4M); + T5f = VFNMS(LDK(KP098491403), T5e, T57); + T5g = VADD(T4U, T5f); + T5D = VSUB(T4U, T5f); + T5o = VFMA(LDK(KP923879532), T5n, T5k); + T5r = VSUB(T5p, T5q); + T5s = VFMA(LDK(KP980785280), T5r, T5o); + T5C = VFNMS(LDK(KP980785280), T5r, T5o); + } + { + V T5h, T5w, T5F, T5G; + T5h = VFNMS(LDK(KP995184726), T5g, T4z); + T5w = VFNMS(LDK(KP995184726), T5v, T5s); + ST(&(xo[WS(os, 31)]), VFNMSI(T5w, T5h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 33)]), VFMAI(T5w, T5h), ovs, &(xo[WS(os, 1)])); + T5F = VFMA(LDK(KP995184726), T5A, T5z); + T5G = VFNMS(LDK(KP995184726), T5D, T5C); + ST(&(xo[WS(os, 15)]), VFNMSI(T5G, T5F), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 49)]), VFMAI(T5G, T5F), ovs, &(xo[WS(os, 1)])); + } + { + V T5x, T5y, T5B, T5E; + T5x = VFMA(LDK(KP995184726), T5g, T4z); + T5y = VFMA(LDK(KP995184726), T5v, T5s); + ST(&(xo[WS(os, 63)]), VFNMSI(T5y, T5x), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(T5y, T5x), ovs, &(xo[WS(os, 1)])); + T5B = VFNMS(LDK(KP995184726), T5A, T5z); + T5E = VFMA(LDK(KP995184726), T5D, T5C); + ST(&(xo[WS(os, 17)]), VFMAI(T5E, T5B), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 47)]), VFNMSI(T5E, T5B), ovs, &(xo[WS(os, 1)])); + } + } + { + V T6j, T6N, T6J, T6O, T6y, T6R, T6G, T6Q; + { + V T6b, T6i, T6H, T6I; + T6b = VFNMS(LDK(KP923879532), T6a, T69); + T6i = VADD(T6e, T6h); + T6j = VFNMS(LDK(KP831469612), T6i, T6b); + T6N = VFMA(LDK(KP831469612), T6i, T6b); + T6H = VFMA(LDK(KP534511135), T6m, T6p); + T6I = VFMA(LDK(KP534511135), T6t, T6w); + T6J = VSUB(T6H, T6I); + T6O = VADD(T6H, T6I); + } + { + V T6q, T6x, T6C, T6F; + T6q = VFNMS(LDK(KP534511135), T6p, T6m); + T6x = VFNMS(LDK(KP534511135), T6w, T6t); + T6y = VADD(T6q, T6x); + T6R = VSUB(T6q, T6x); + T6C = VFMA(LDK(KP923879532), T6B, T6A); + T6F = VSUB(T6D, T6E); + T6G = VFMA(LDK(KP831469612), T6F, T6C); + T6Q = VFNMS(LDK(KP831469612), T6F, T6C); + } + { + V T6z, T6K, T6T, T6U; + T6z = VFNMS(LDK(KP881921264), T6y, T6j); + T6K = VFNMS(LDK(KP881921264), T6J, T6G); + ST(&(xo[WS(os, 27)]), VFNMSI(T6K, T6z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 37)]), VFMAI(T6K, T6z), ovs, &(xo[WS(os, 1)])); + T6T = VFMA(LDK(KP881921264), T6O, T6N); + T6U = VFNMS(LDK(KP881921264), T6R, T6Q); + ST(&(xo[WS(os, 11)]), VFNMSI(T6U, T6T), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 53)]), VFMAI(T6U, T6T), ovs, &(xo[WS(os, 1)])); + } + { + V T6L, T6M, T6P, T6S; + T6L = VFMA(LDK(KP881921264), T6y, T6j); + T6M = VFMA(LDK(KP881921264), T6J, T6G); + ST(&(xo[WS(os, 59)]), VFNMSI(T6M, T6L), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFMAI(T6M, T6L), ovs, &(xo[WS(os, 1)])); + T6P = VFNMS(LDK(KP881921264), T6O, T6N); + T6S = VFMA(LDK(KP881921264), T6R, T6Q); + ST(&(xo[WS(os, 21)]), VFMAI(T6S, T6P), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 43)]), VFNMSI(T6S, T6P), ovs, &(xo[WS(os, 1)])); + } + } + { + V T2t, T2L, T2H, T2M, T2A, T2P, T2E, T2O; + { + V T2r, T2s, T2F, T2G; + T2r = VFNMS(LDK(KP707106781), Tm, T7); + T2s = VADD(T29, T2a); + T2t = VFMA(LDK(KP923879532), T2s, T2r); + T2L = VFNMS(LDK(KP923879532), T2s, T2r); + T2F = VFNMS(LDK(KP668178637), T2u, T2v); + T2G = VFNMS(LDK(KP668178637), T2x, T2y); + T2H = VSUB(T2F, T2G); + T2M = VADD(T2F, T2G); + } + { + V T2w, T2z, T2C, T2D; + T2w = VFMA(LDK(KP668178637), T2v, T2u); + T2z = VFMA(LDK(KP668178637), T2y, T2x); + T2A = VADD(T2w, T2z); + T2P = VSUB(T2w, T2z); + T2C = VFNMS(LDK(KP707106781), T27, T26); + T2D = VSUB(TC, TR); + T2E = VFNMS(LDK(KP923879532), T2D, T2C); + T2O = VFMA(LDK(KP923879532), T2D, T2C); + } + { + V T2B, T2I, T2R, T2S; + T2B = VFNMS(LDK(KP831469612), T2A, T2t); + T2I = VFNMS(LDK(KP831469612), T2H, T2E); + ST(&(xo[WS(os, 38)]), VFNMSI(T2I, T2B), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VFMAI(T2I, T2B), ovs, &(xo[0])); + T2R = VFNMS(LDK(KP831469612), T2M, T2L); + T2S = VFMA(LDK(KP831469612), T2P, T2O); + ST(&(xo[WS(os, 10)]), VFMAI(T2S, T2R), ovs, &(xo[0])); + ST(&(xo[WS(os, 54)]), VFNMSI(T2S, T2R), ovs, &(xo[0])); + } + { + V T2J, T2K, T2N, T2Q; + T2J = VFMA(LDK(KP831469612), T2A, T2t); + T2K = VFMA(LDK(KP831469612), T2H, T2E); + ST(&(xo[WS(os, 6)]), VFNMSI(T2K, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 58)]), VFMAI(T2K, T2J), ovs, &(xo[0])); + T2N = VFMA(LDK(KP831469612), T2M, T2L); + T2Q = VFNMS(LDK(KP831469612), T2P, T2O); + ST(&(xo[WS(os, 22)]), VFNMSI(T2Q, T2N), ovs, &(xo[0])); + ST(&(xo[WS(os, 42)]), VFMAI(T2Q, T2N), ovs, &(xo[0])); + } + } + { + V T5J, T61, T5X, T62, T5Q, T65, T5U, T64; + { + V T5H, T5I, T5V, T5W; + T5H = VFNMS(LDK(KP923879532), T4e, T47); + T5I = VADD(T5p, T5q); + T5J = VFMA(LDK(KP980785280), T5I, T5H); + T61 = VFNMS(LDK(KP980785280), T5I, T5H); + T5V = VFNMS(LDK(KP820678790), T5K, T5L); + T5W = VFNMS(LDK(KP820678790), T5N, T5O); + T5X = VSUB(T5V, T5W); + T62 = VADD(T5V, T5W); + } + { + V T5M, T5P, T5S, T5T; + T5M = VFMA(LDK(KP820678790), T5L, T5K); + T5P = VFMA(LDK(KP820678790), T5O, T5N); + T5Q = VADD(T5M, T5P); + T65 = VSUB(T5M, T5P); + T5S = VFNMS(LDK(KP923879532), T5n, T5k); + T5T = VSUB(T4o, T4x); + T5U = VFNMS(LDK(KP980785280), T5T, T5S); + T64 = VFMA(LDK(KP980785280), T5T, T5S); + } + { + V T5R, T5Y, T67, T68; + T5R = VFNMS(LDK(KP773010453), T5Q, T5J); + T5Y = VFNMS(LDK(KP773010453), T5X, T5U); + ST(&(xo[WS(os, 39)]), VFNMSI(T5Y, T5R), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 25)]), VFMAI(T5Y, T5R), ovs, &(xo[WS(os, 1)])); + T67 = VFNMS(LDK(KP773010453), T62, T61); + T68 = VFMA(LDK(KP773010453), T65, T64); + ST(&(xo[WS(os, 9)]), VFMAI(T68, T67), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VFNMSI(T68, T67), ovs, &(xo[WS(os, 1)])); + } + { + V T5Z, T60, T63, T66; + T5Z = VFMA(LDK(KP773010453), T5Q, T5J); + T60 = VFMA(LDK(KP773010453), T5X, T5U); + ST(&(xo[WS(os, 7)]), VFNMSI(T60, T5Z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 57)]), VFMAI(T60, T5Z), ovs, &(xo[WS(os, 1)])); + T63 = VFMA(LDK(KP773010453), T62, T61); + T66 = VFNMS(LDK(KP773010453), T65, T64); + ST(&(xo[WS(os, 23)]), VFNMSI(T66, T63), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 41)]), VFMAI(T66, T63), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n1bv_64"), {198, 0, 258, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_64) (planner *p) { + X(kdft_register) (p, n1bv_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 64 -name n1bv_64 -include dft/simd/n1b.h */ + +/* + * This function contains 456 FP additions, 124 FP multiplications, + * (or, 404 additions, 72 multiplications, 52 fused multiply/add), + * 108 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T4p, T5u, Tb, T3A, T2q, T3v, T6G, T78, Tq, T3w, T6B, T79, T2l, T3B, T4w; + V T5r, TI, T2g, T6u, T74, T3q, T3D, T4E, T5o, TZ, T2h, T6x, T75, T3t, T3E; + V T4L, T5p, T23, T2N, T6m, T70, T6p, T71, T2c, T2O, T3i, T3Y, T5f, T5R, T5k; + V T5S, T3l, T3Z, T1s, T2K, T6f, T6X, T6i, T6Y, T1B, T2L, T3b, T3V, T4Y, T5O; + V T53, T5P, T3e, T3W; + { + V T3, T4n, T2p, T4o, T6, T5s, T9, T5t; + { + V T1, T2, T2n, T2o; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T4n = VADD(T1, T2); + T2n = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T2o = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T2p = VSUB(T2n, T2o); + T4o = VADD(T2n, T2o); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T5s = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T5t = VADD(T7, T8); + } + T4p = VSUB(T4n, T4o); + T5u = VSUB(T5s, T5t); + { + V Ta, T2m, T6E, T6F; + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VSUB(T3, Ta); + T3A = VADD(T3, Ta); + T2m = VMUL(LDK(KP707106781), VSUB(T6, T9)); + T2q = VSUB(T2m, T2p); + T3v = VADD(T2p, T2m); + T6E = VADD(T4n, T4o); + T6F = VADD(T5s, T5t); + T6G = VSUB(T6E, T6F); + T78 = VADD(T6E, T6F); + } + } + { + V Te, T4q, To, T4t, Th, T4r, Tl, T4u; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T4q = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T4t = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T4r = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T4u = VADD(Tj, Tk); + } + { + V Ti, Tp, T6z, T6A; + Ti = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + Tp = VFNMS(LDK(KP382683432), To, VMUL(LDK(KP923879532), Tl)); + Tq = VSUB(Ti, Tp); + T3w = VADD(Ti, Tp); + T6z = VADD(T4q, T4r); + T6A = VADD(T4t, T4u); + T6B = VSUB(T6z, T6A); + T79 = VADD(T6z, T6A); + } + { + V T2j, T2k, T4s, T4v; + T2j = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + T2k = VFMA(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T2l = VSUB(T2j, T2k); + T3B = VADD(T2j, T2k); + T4s = VSUB(T4q, T4r); + T4v = VSUB(T4t, T4u); + T4w = VMUL(LDK(KP707106781), VADD(T4s, T4v)); + T5r = VMUL(LDK(KP707106781), VSUB(T4s, T4v)); + } + } + { + V TB, T4z, TF, T4y, Ty, T4C, TG, T4B; + { + V Tz, TA, TD, TE; + Tz = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + TA = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + TB = VSUB(Tz, TA); + T4z = VADD(Tz, TA); + TD = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + TF = VSUB(TD, TE); + T4y = VADD(TD, TE); + { + V Ts, Tt, Tu, Tv, Tw, Tx; + Ts = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + Tu = VSUB(Ts, Tt); + Tv = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Ty = VMUL(LDK(KP707106781), VSUB(Tu, Tx)); + T4C = VADD(Tv, Tw); + TG = VMUL(LDK(KP707106781), VADD(Tu, Tx)); + T4B = VADD(Ts, Tt); + } + } + { + V TC, TH, T6s, T6t; + TC = VSUB(Ty, TB); + TH = VSUB(TF, TG); + TI = VFMA(LDK(KP831469612), TC, VMUL(LDK(KP555570233), TH)); + T2g = VFNMS(LDK(KP555570233), TC, VMUL(LDK(KP831469612), TH)); + T6s = VADD(T4y, T4z); + T6t = VADD(T4B, T4C); + T6u = VSUB(T6s, T6t); + T74 = VADD(T6s, T6t); + } + { + V T3o, T3p, T4A, T4D; + T3o = VADD(TB, Ty); + T3p = VADD(TF, TG); + T3q = VFMA(LDK(KP980785280), T3o, VMUL(LDK(KP195090322), T3p)); + T3D = VFNMS(LDK(KP195090322), T3o, VMUL(LDK(KP980785280), T3p)); + T4A = VSUB(T4y, T4z); + T4D = VSUB(T4B, T4C); + T4E = VFMA(LDK(KP382683432), T4A, VMUL(LDK(KP923879532), T4D)); + T5o = VFNMS(LDK(KP382683432), T4D, VMUL(LDK(KP923879532), T4A)); + } + } + { + V TS, T4J, TW, T4I, TP, T4G, TX, T4F; + { + V TQ, TR, TU, TV; + TQ = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TR = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TS = VSUB(TQ, TR); + T4J = VADD(TQ, TR); + TU = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TW = VSUB(TU, TV); + T4I = VADD(TU, TV); + { + V TJ, TK, TL, TM, TN, TO; + TJ = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + TL = VSUB(TJ, TK); + TM = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + T4G = VADD(TM, TN); + TX = VMUL(LDK(KP707106781), VADD(TL, TO)); + T4F = VADD(TJ, TK); + } + } + { + V TT, TY, T6v, T6w; + TT = VSUB(TP, TS); + TY = VSUB(TW, TX); + TZ = VFNMS(LDK(KP555570233), TY, VMUL(LDK(KP831469612), TT)); + T2h = VFMA(LDK(KP555570233), TT, VMUL(LDK(KP831469612), TY)); + T6v = VADD(T4I, T4J); + T6w = VADD(T4F, T4G); + T6x = VSUB(T6v, T6w); + T75 = VADD(T6v, T6w); + } + { + V T3r, T3s, T4H, T4K; + T3r = VADD(TS, TP); + T3s = VADD(TW, TX); + T3t = VFNMS(LDK(KP195090322), T3s, VMUL(LDK(KP980785280), T3r)); + T3E = VFMA(LDK(KP195090322), T3r, VMUL(LDK(KP980785280), T3s)); + T4H = VSUB(T4F, T4G); + T4K = VSUB(T4I, T4J); + T4L = VFNMS(LDK(KP382683432), T4K, VMUL(LDK(KP923879532), T4H)); + T5p = VFMA(LDK(KP923879532), T4K, VMUL(LDK(KP382683432), T4H)); + } + } + { + V T21, T5h, T26, T5g, T1Y, T5d, T27, T5c, T55, T56, T1J, T57, T29, T58, T59; + V T1Q, T5a, T2a; + { + V T1Z, T20, T24, T25; + T1Z = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T20 = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T21 = VSUB(T1Z, T20); + T5h = VADD(T1Z, T20); + T24 = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T25 = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T26 = VSUB(T24, T25); + T5g = VADD(T24, T25); + } + { + V T1S, T1T, T1U, T1V, T1W, T1X; + T1S = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1T = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T1U = VSUB(T1S, T1T); + T1V = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1W = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T1X = VSUB(T1V, T1W); + T1Y = VMUL(LDK(KP707106781), VSUB(T1U, T1X)); + T5d = VADD(T1V, T1W); + T27 = VMUL(LDK(KP707106781), VADD(T1U, T1X)); + T5c = VADD(T1S, T1T); + } + { + V T1F, T1I, T1M, T1P; + { + V T1D, T1E, T1G, T1H; + T1D = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1E = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1F = VSUB(T1D, T1E); + T55 = VADD(T1D, T1E); + T1G = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1H = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1I = VSUB(T1G, T1H); + T56 = VADD(T1G, T1H); + } + T1J = VFNMS(LDK(KP382683432), T1I, VMUL(LDK(KP923879532), T1F)); + T57 = VSUB(T55, T56); + T29 = VFMA(LDK(KP382683432), T1F, VMUL(LDK(KP923879532), T1I)); + { + V T1K, T1L, T1N, T1O; + T1K = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1L = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1M = VSUB(T1K, T1L); + T58 = VADD(T1K, T1L); + T1N = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1O = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T1P = VSUB(T1N, T1O); + T59 = VADD(T1N, T1O); + } + T1Q = VFMA(LDK(KP923879532), T1M, VMUL(LDK(KP382683432), T1P)); + T5a = VSUB(T58, T59); + T2a = VFNMS(LDK(KP382683432), T1M, VMUL(LDK(KP923879532), T1P)); + } + { + V T1R, T22, T6k, T6l; + T1R = VSUB(T1J, T1Q); + T22 = VSUB(T1Y, T21); + T23 = VSUB(T1R, T22); + T2N = VADD(T22, T1R); + T6k = VADD(T5g, T5h); + T6l = VADD(T5c, T5d); + T6m = VSUB(T6k, T6l); + T70 = VADD(T6k, T6l); + } + { + V T6n, T6o, T28, T2b; + T6n = VADD(T55, T56); + T6o = VADD(T58, T59); + T6p = VSUB(T6n, T6o); + T71 = VADD(T6n, T6o); + T28 = VSUB(T26, T27); + T2b = VSUB(T29, T2a); + T2c = VSUB(T28, T2b); + T2O = VADD(T28, T2b); + } + { + V T3g, T3h, T5b, T5e; + T3g = VADD(T26, T27); + T3h = VADD(T1J, T1Q); + T3i = VADD(T3g, T3h); + T3Y = VSUB(T3g, T3h); + T5b = VMUL(LDK(KP707106781), VSUB(T57, T5a)); + T5e = VSUB(T5c, T5d); + T5f = VSUB(T5b, T5e); + T5R = VADD(T5e, T5b); + } + { + V T5i, T5j, T3j, T3k; + T5i = VSUB(T5g, T5h); + T5j = VMUL(LDK(KP707106781), VADD(T57, T5a)); + T5k = VSUB(T5i, T5j); + T5S = VADD(T5i, T5j); + T3j = VADD(T21, T1Y); + T3k = VADD(T29, T2a); + T3l = VADD(T3j, T3k); + T3Z = VSUB(T3k, T3j); + } + } + { + V T1q, T50, T1v, T4Z, T1n, T4W, T1w, T4V, T4O, T4P, T18, T4Q, T1y, T4R, T4S; + V T1f, T4T, T1z; + { + V T1o, T1p, T1t, T1u; + T1o = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T1p = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T1q = VSUB(T1o, T1p); + T50 = VADD(T1o, T1p); + T1t = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T1u = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T1v = VSUB(T1t, T1u); + T4Z = VADD(T1t, T1u); + } + { + V T1h, T1i, T1j, T1k, T1l, T1m; + T1h = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T1j = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T1m = VSUB(T1k, T1l); + T1n = VMUL(LDK(KP707106781), VSUB(T1j, T1m)); + T4W = VADD(T1k, T1l); + T1w = VMUL(LDK(KP707106781), VADD(T1j, T1m)); + T4V = VADD(T1h, T1i); + } + { + V T14, T17, T1b, T1e; + { + V T12, T13, T15, T16; + T12 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T13 = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T14 = VSUB(T12, T13); + T4O = VADD(T12, T13); + T15 = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T16 = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T17 = VSUB(T15, T16); + T4P = VADD(T15, T16); + } + T18 = VFNMS(LDK(KP382683432), T17, VMUL(LDK(KP923879532), T14)); + T4Q = VSUB(T4O, T4P); + T1y = VFMA(LDK(KP382683432), T14, VMUL(LDK(KP923879532), T17)); + { + V T19, T1a, T1c, T1d; + T19 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T1a = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T1b = VSUB(T19, T1a); + T4R = VADD(T19, T1a); + T1c = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T1d = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T1e = VSUB(T1c, T1d); + T4S = VADD(T1c, T1d); + } + T1f = VFMA(LDK(KP923879532), T1b, VMUL(LDK(KP382683432), T1e)); + T4T = VSUB(T4R, T4S); + T1z = VFNMS(LDK(KP382683432), T1b, VMUL(LDK(KP923879532), T1e)); + } + { + V T1g, T1r, T6d, T6e; + T1g = VSUB(T18, T1f); + T1r = VSUB(T1n, T1q); + T1s = VSUB(T1g, T1r); + T2K = VADD(T1r, T1g); + T6d = VADD(T4Z, T50); + T6e = VADD(T4V, T4W); + T6f = VSUB(T6d, T6e); + T6X = VADD(T6d, T6e); + } + { + V T6g, T6h, T1x, T1A; + T6g = VADD(T4O, T4P); + T6h = VADD(T4R, T4S); + T6i = VSUB(T6g, T6h); + T6Y = VADD(T6g, T6h); + T1x = VSUB(T1v, T1w); + T1A = VSUB(T1y, T1z); + T1B = VSUB(T1x, T1A); + T2L = VADD(T1x, T1A); + } + { + V T39, T3a, T4U, T4X; + T39 = VADD(T1v, T1w); + T3a = VADD(T18, T1f); + T3b = VADD(T39, T3a); + T3V = VSUB(T39, T3a); + T4U = VMUL(LDK(KP707106781), VSUB(T4Q, T4T)); + T4X = VSUB(T4V, T4W); + T4Y = VSUB(T4U, T4X); + T5O = VADD(T4X, T4U); + } + { + V T51, T52, T3c, T3d; + T51 = VSUB(T4Z, T50); + T52 = VMUL(LDK(KP707106781), VADD(T4Q, T4T)); + T53 = VSUB(T51, T52); + T5P = VADD(T51, T52); + T3c = VADD(T1q, T1n); + T3d = VADD(T1y, T1z); + T3e = VADD(T3c, T3d); + T3W = VSUB(T3d, T3c); + } + } + { + V T7h, T7l, T7k, T7m; + { + V T7f, T7g, T7i, T7j; + T7f = VADD(T78, T79); + T7g = VADD(T74, T75); + T7h = VSUB(T7f, T7g); + T7l = VADD(T7f, T7g); + T7i = VADD(T6X, T6Y); + T7j = VADD(T70, T71); + T7k = VBYI(VSUB(T7i, T7j)); + T7m = VADD(T7i, T7j); + } + ST(&(xo[WS(os, 48)]), VSUB(T7h, T7k), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T7l, T7m), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VADD(T7h, T7k), ovs, &(xo[0])); + ST(&(xo[WS(os, 32)]), VSUB(T7l, T7m), ovs, &(xo[0])); + } + { + V T76, T7a, T73, T7b, T6Z, T72; + T76 = VSUB(T74, T75); + T7a = VSUB(T78, T79); + T6Z = VSUB(T6X, T6Y); + T72 = VSUB(T70, T71); + T73 = VMUL(LDK(KP707106781), VSUB(T6Z, T72)); + T7b = VMUL(LDK(KP707106781), VADD(T6Z, T72)); + { + V T77, T7c, T7d, T7e; + T77 = VBYI(VSUB(T73, T76)); + T7c = VSUB(T7a, T7b); + ST(&(xo[WS(os, 24)]), VADD(T77, T7c), ovs, &(xo[0])); + ST(&(xo[WS(os, 40)]), VSUB(T7c, T77), ovs, &(xo[0])); + T7d = VBYI(VADD(T76, T73)); + T7e = VADD(T7a, T7b); + ST(&(xo[WS(os, 8)]), VADD(T7d, T7e), ovs, &(xo[0])); + ST(&(xo[WS(os, 56)]), VSUB(T7e, T7d), ovs, &(xo[0])); + } + } + { + V T6C, T6S, T6I, T6P, T6r, T6Q, T6L, T6T, T6y, T6H; + T6y = VMUL(LDK(KP707106781), VSUB(T6u, T6x)); + T6C = VSUB(T6y, T6B); + T6S = VADD(T6B, T6y); + T6H = VMUL(LDK(KP707106781), VADD(T6u, T6x)); + T6I = VSUB(T6G, T6H); + T6P = VADD(T6G, T6H); + { + V T6j, T6q, T6J, T6K; + T6j = VFNMS(LDK(KP382683432), T6i, VMUL(LDK(KP923879532), T6f)); + T6q = VFMA(LDK(KP923879532), T6m, VMUL(LDK(KP382683432), T6p)); + T6r = VSUB(T6j, T6q); + T6Q = VADD(T6j, T6q); + T6J = VFMA(LDK(KP382683432), T6f, VMUL(LDK(KP923879532), T6i)); + T6K = VFNMS(LDK(KP382683432), T6m, VMUL(LDK(KP923879532), T6p)); + T6L = VSUB(T6J, T6K); + T6T = VADD(T6J, T6K); + } + { + V T6D, T6M, T6V, T6W; + T6D = VBYI(VSUB(T6r, T6C)); + T6M = VSUB(T6I, T6L); + ST(&(xo[WS(os, 20)]), VADD(T6D, T6M), ovs, &(xo[0])); + ST(&(xo[WS(os, 44)]), VSUB(T6M, T6D), ovs, &(xo[0])); + T6V = VSUB(T6P, T6Q); + T6W = VBYI(VSUB(T6T, T6S)); + ST(&(xo[WS(os, 36)]), VSUB(T6V, T6W), ovs, &(xo[0])); + ST(&(xo[WS(os, 28)]), VADD(T6V, T6W), ovs, &(xo[0])); + } + { + V T6N, T6O, T6R, T6U; + T6N = VBYI(VADD(T6C, T6r)); + T6O = VADD(T6I, T6L); + ST(&(xo[WS(os, 12)]), VADD(T6N, T6O), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VSUB(T6O, T6N), ovs, &(xo[0])); + T6R = VADD(T6P, T6Q); + T6U = VBYI(VADD(T6S, T6T)); + ST(&(xo[WS(os, 60)]), VSUB(T6R, T6U), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(T6R, T6U), ovs, &(xo[0])); + } + } + { + V T5N, T68, T61, T69, T5U, T65, T5Y, T66; + { + V T5L, T5M, T5Z, T60; + T5L = VADD(T4p, T4w); + T5M = VADD(T5o, T5p); + T5N = VSUB(T5L, T5M); + T68 = VADD(T5L, T5M); + T5Z = VFNMS(LDK(KP195090322), T5O, VMUL(LDK(KP980785280), T5P)); + T60 = VFMA(LDK(KP195090322), T5R, VMUL(LDK(KP980785280), T5S)); + T61 = VSUB(T5Z, T60); + T69 = VADD(T5Z, T60); + } + { + V T5Q, T5T, T5W, T5X; + T5Q = VFMA(LDK(KP980785280), T5O, VMUL(LDK(KP195090322), T5P)); + T5T = VFNMS(LDK(KP195090322), T5S, VMUL(LDK(KP980785280), T5R)); + T5U = VSUB(T5Q, T5T); + T65 = VADD(T5Q, T5T); + T5W = VADD(T4E, T4L); + T5X = VADD(T5u, T5r); + T5Y = VSUB(T5W, T5X); + T66 = VADD(T5X, T5W); + } + { + V T5V, T62, T6b, T6c; + T5V = VADD(T5N, T5U); + T62 = VBYI(VADD(T5Y, T61)); + ST(&(xo[WS(os, 50)]), VSUB(T5V, T62), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VADD(T5V, T62), ovs, &(xo[0])); + T6b = VBYI(VADD(T66, T65)); + T6c = VADD(T68, T69); + ST(&(xo[WS(os, 2)]), VADD(T6b, T6c), ovs, &(xo[0])); + ST(&(xo[WS(os, 62)]), VSUB(T6c, T6b), ovs, &(xo[0])); + } + { + V T63, T64, T67, T6a; + T63 = VSUB(T5N, T5U); + T64 = VBYI(VSUB(T61, T5Y)); + ST(&(xo[WS(os, 46)]), VSUB(T63, T64), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VADD(T63, T64), ovs, &(xo[0])); + T67 = VBYI(VSUB(T65, T66)); + T6a = VSUB(T68, T69); + ST(&(xo[WS(os, 30)]), VADD(T67, T6a), ovs, &(xo[0])); + ST(&(xo[WS(os, 34)]), VSUB(T6a, T67), ovs, &(xo[0])); + } + } + { + V T11, T2C, T2v, T2D, T2e, T2z, T2s, T2A; + { + V Tr, T10, T2t, T2u; + Tr = VSUB(Tb, Tq); + T10 = VSUB(TI, TZ); + T11 = VSUB(Tr, T10); + T2C = VADD(Tr, T10); + T2t = VFNMS(LDK(KP471396736), T1s, VMUL(LDK(KP881921264), T1B)); + T2u = VFMA(LDK(KP471396736), T23, VMUL(LDK(KP881921264), T2c)); + T2v = VSUB(T2t, T2u); + T2D = VADD(T2t, T2u); + } + { + V T1C, T2d, T2i, T2r; + T1C = VFMA(LDK(KP881921264), T1s, VMUL(LDK(KP471396736), T1B)); + T2d = VFNMS(LDK(KP471396736), T2c, VMUL(LDK(KP881921264), T23)); + T2e = VSUB(T1C, T2d); + T2z = VADD(T1C, T2d); + T2i = VSUB(T2g, T2h); + T2r = VSUB(T2l, T2q); + T2s = VSUB(T2i, T2r); + T2A = VADD(T2r, T2i); + } + { + V T2f, T2w, T2F, T2G; + T2f = VADD(T11, T2e); + T2w = VBYI(VADD(T2s, T2v)); + ST(&(xo[WS(os, 53)]), VSUB(T2f, T2w), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VADD(T2f, T2w), ovs, &(xo[WS(os, 1)])); + T2F = VBYI(VADD(T2A, T2z)); + T2G = VADD(T2C, T2D); + ST(&(xo[WS(os, 5)]), VADD(T2F, T2G), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 59)]), VSUB(T2G, T2F), ovs, &(xo[WS(os, 1)])); + } + { + V T2x, T2y, T2B, T2E; + T2x = VSUB(T11, T2e); + T2y = VBYI(VSUB(T2v, T2s)); + ST(&(xo[WS(os, 43)]), VSUB(T2x, T2y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 21)]), VADD(T2x, T2y), ovs, &(xo[WS(os, 1)])); + T2B = VBYI(VSUB(T2z, T2A)); + T2E = VSUB(T2C, T2D); + ST(&(xo[WS(os, 27)]), VADD(T2B, T2E), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 37)]), VSUB(T2E, T2B), ovs, &(xo[WS(os, 1)])); + } + } + { + V T3n, T3O, T3J, T3R, T3y, T3Q, T3G, T3N; + { + V T3f, T3m, T3H, T3I; + T3f = VFNMS(LDK(KP098017140), T3e, VMUL(LDK(KP995184726), T3b)); + T3m = VFMA(LDK(KP995184726), T3i, VMUL(LDK(KP098017140), T3l)); + T3n = VSUB(T3f, T3m); + T3O = VADD(T3f, T3m); + T3H = VFMA(LDK(KP098017140), T3b, VMUL(LDK(KP995184726), T3e)); + T3I = VFNMS(LDK(KP098017140), T3i, VMUL(LDK(KP995184726), T3l)); + T3J = VSUB(T3H, T3I); + T3R = VADD(T3H, T3I); + } + { + V T3u, T3x, T3C, T3F; + T3u = VADD(T3q, T3t); + T3x = VADD(T3v, T3w); + T3y = VSUB(T3u, T3x); + T3Q = VADD(T3x, T3u); + T3C = VADD(T3A, T3B); + T3F = VADD(T3D, T3E); + T3G = VSUB(T3C, T3F); + T3N = VADD(T3C, T3F); + } + { + V T3z, T3K, T3T, T3U; + T3z = VBYI(VSUB(T3n, T3y)); + T3K = VSUB(T3G, T3J); + ST(&(xo[WS(os, 17)]), VADD(T3z, T3K), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 47)]), VSUB(T3K, T3z), ovs, &(xo[WS(os, 1)])); + T3T = VSUB(T3N, T3O); + T3U = VBYI(VSUB(T3R, T3Q)); + ST(&(xo[WS(os, 33)]), VSUB(T3T, T3U), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 31)]), VADD(T3T, T3U), ovs, &(xo[WS(os, 1)])); + } + { + V T3L, T3M, T3P, T3S; + T3L = VBYI(VADD(T3y, T3n)); + T3M = VADD(T3G, T3J); + ST(&(xo[WS(os, 15)]), VADD(T3L, T3M), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 49)]), VSUB(T3M, T3L), ovs, &(xo[WS(os, 1)])); + T3P = VADD(T3N, T3O); + T3S = VBYI(VADD(T3Q, T3R)); + ST(&(xo[WS(os, 63)]), VSUB(T3P, T3S), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(T3P, T3S), ovs, &(xo[WS(os, 1)])); + } + } + { + V T4N, T5G, T5z, T5H, T5m, T5D, T5w, T5E; + { + V T4x, T4M, T5x, T5y; + T4x = VSUB(T4p, T4w); + T4M = VSUB(T4E, T4L); + T4N = VSUB(T4x, T4M); + T5G = VADD(T4x, T4M); + T5x = VFNMS(LDK(KP555570233), T4Y, VMUL(LDK(KP831469612), T53)); + T5y = VFMA(LDK(KP555570233), T5f, VMUL(LDK(KP831469612), T5k)); + T5z = VSUB(T5x, T5y); + T5H = VADD(T5x, T5y); + } + { + V T54, T5l, T5q, T5v; + T54 = VFMA(LDK(KP831469612), T4Y, VMUL(LDK(KP555570233), T53)); + T5l = VFNMS(LDK(KP555570233), T5k, VMUL(LDK(KP831469612), T5f)); + T5m = VSUB(T54, T5l); + T5D = VADD(T54, T5l); + T5q = VSUB(T5o, T5p); + T5v = VSUB(T5r, T5u); + T5w = VSUB(T5q, T5v); + T5E = VADD(T5v, T5q); + } + { + V T5n, T5A, T5J, T5K; + T5n = VADD(T4N, T5m); + T5A = VBYI(VADD(T5w, T5z)); + ST(&(xo[WS(os, 54)]), VSUB(T5n, T5A), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VADD(T5n, T5A), ovs, &(xo[0])); + T5J = VBYI(VADD(T5E, T5D)); + T5K = VADD(T5G, T5H); + ST(&(xo[WS(os, 6)]), VADD(T5J, T5K), ovs, &(xo[0])); + ST(&(xo[WS(os, 58)]), VSUB(T5K, T5J), ovs, &(xo[0])); + } + { + V T5B, T5C, T5F, T5I; + T5B = VSUB(T4N, T5m); + T5C = VBYI(VSUB(T5z, T5w)); + ST(&(xo[WS(os, 42)]), VSUB(T5B, T5C), ovs, &(xo[0])); + ST(&(xo[WS(os, 22)]), VADD(T5B, T5C), ovs, &(xo[0])); + T5F = VBYI(VSUB(T5D, T5E)); + T5I = VSUB(T5G, T5H); + ST(&(xo[WS(os, 26)]), VADD(T5F, T5I), ovs, &(xo[0])); + ST(&(xo[WS(os, 38)]), VSUB(T5I, T5F), ovs, &(xo[0])); + } + } + { + V T2J, T34, T2X, T35, T2Q, T31, T2U, T32; + { + V T2H, T2I, T2V, T2W; + T2H = VADD(Tb, Tq); + T2I = VADD(T2g, T2h); + T2J = VSUB(T2H, T2I); + T34 = VADD(T2H, T2I); + T2V = VFNMS(LDK(KP290284677), T2K, VMUL(LDK(KP956940335), T2L)); + T2W = VFMA(LDK(KP290284677), T2N, VMUL(LDK(KP956940335), T2O)); + T2X = VSUB(T2V, T2W); + T35 = VADD(T2V, T2W); + } + { + V T2M, T2P, T2S, T2T; + T2M = VFMA(LDK(KP956940335), T2K, VMUL(LDK(KP290284677), T2L)); + T2P = VFNMS(LDK(KP290284677), T2O, VMUL(LDK(KP956940335), T2N)); + T2Q = VSUB(T2M, T2P); + T31 = VADD(T2M, T2P); + T2S = VADD(TI, TZ); + T2T = VADD(T2q, T2l); + T2U = VSUB(T2S, T2T); + T32 = VADD(T2T, T2S); + } + { + V T2R, T2Y, T37, T38; + T2R = VADD(T2J, T2Q); + T2Y = VBYI(VADD(T2U, T2X)); + ST(&(xo[WS(os, 51)]), VSUB(T2R, T2Y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VADD(T2R, T2Y), ovs, &(xo[WS(os, 1)])); + T37 = VBYI(VADD(T32, T31)); + T38 = VADD(T34, T35); + ST(&(xo[WS(os, 3)]), VADD(T37, T38), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 61)]), VSUB(T38, T37), ovs, &(xo[WS(os, 1)])); + } + { + V T2Z, T30, T33, T36; + T2Z = VSUB(T2J, T2Q); + T30 = VBYI(VSUB(T2X, T2U)); + ST(&(xo[WS(os, 45)]), VSUB(T2Z, T30), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 19)]), VADD(T2Z, T30), ovs, &(xo[WS(os, 1)])); + T33 = VBYI(VSUB(T31, T32)); + T36 = VSUB(T34, T35); + ST(&(xo[WS(os, 29)]), VADD(T33, T36), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 35)]), VSUB(T36, T33), ovs, &(xo[WS(os, 1)])); + } + } + { + V T41, T4g, T4b, T4j, T44, T4i, T48, T4f; + { + V T3X, T40, T49, T4a; + T3X = VFNMS(LDK(KP634393284), T3W, VMUL(LDK(KP773010453), T3V)); + T40 = VFMA(LDK(KP773010453), T3Y, VMUL(LDK(KP634393284), T3Z)); + T41 = VSUB(T3X, T40); + T4g = VADD(T3X, T40); + T49 = VFMA(LDK(KP634393284), T3V, VMUL(LDK(KP773010453), T3W)); + T4a = VFNMS(LDK(KP634393284), T3Y, VMUL(LDK(KP773010453), T3Z)); + T4b = VSUB(T49, T4a); + T4j = VADD(T49, T4a); + } + { + V T42, T43, T46, T47; + T42 = VSUB(T3D, T3E); + T43 = VSUB(T3w, T3v); + T44 = VSUB(T42, T43); + T4i = VADD(T43, T42); + T46 = VSUB(T3A, T3B); + T47 = VSUB(T3q, T3t); + T48 = VSUB(T46, T47); + T4f = VADD(T46, T47); + } + { + V T45, T4c, T4l, T4m; + T45 = VBYI(VSUB(T41, T44)); + T4c = VSUB(T48, T4b); + ST(&(xo[WS(os, 23)]), VADD(T45, T4c), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 41)]), VSUB(T4c, T45), ovs, &(xo[WS(os, 1)])); + T4l = VSUB(T4f, T4g); + T4m = VBYI(VSUB(T4j, T4i)); + ST(&(xo[WS(os, 39)]), VSUB(T4l, T4m), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 25)]), VADD(T4l, T4m), ovs, &(xo[WS(os, 1)])); + } + { + V T4d, T4e, T4h, T4k; + T4d = VBYI(VADD(T44, T41)); + T4e = VADD(T48, T4b); + ST(&(xo[WS(os, 9)]), VADD(T4d, T4e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VSUB(T4e, T4d), ovs, &(xo[WS(os, 1)])); + T4h = VADD(T4f, T4g); + T4k = VBYI(VADD(T4i, T4j)); + ST(&(xo[WS(os, 57)]), VSUB(T4h, T4k), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(T4h, T4k), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n1bv_64"), {404, 72, 52, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_64) (planner *p) { + X(kdft_register) (p, n1bv_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_7.c new file mode 100644 index 000000000..479aecf5f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_7.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:55 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 7 -name n1bv_7 -include dft/simd/n1b.h */ + +/* + * This function contains 30 FP additions, 24 FP multiplications, + * (or, 9 additions, 3 multiplications, 21 fused multiply/add), + * 33 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_7(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(14, is), MAKE_VOLATILE_STRIDE(14, os)) { + V T1, T4, Tg, Ta, Te, T7, Tf, Tb, Th, Tr, To, Tm, Tj, T2, T3; + V Ts, Tq, Tp; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tg = VSUB(T2, T3); + { + V T8, T9, T5, T6; + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Te = VSUB(T8, T9); + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + Tf = VSUB(T5, T6); + } + Tb = VFNMS(LDK(KP356895867), Ta, T7); + Th = VFNMS(LDK(KP554958132), Tg, Tf); + Tr = VFMA(LDK(KP554958132), Te, Tg); + To = VFNMS(LDK(KP356895867), T7, T4); + Tm = VFMA(LDK(KP554958132), Tf, Te); + Tj = VFNMS(LDK(KP356895867), T4, Ta); + ST(&(xo[0]), VADD(T1, VADD(T4, VADD(T7, Ta))), ovs, &(xo[0])); + Ts = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), Tr, Tf)); + Tp = VFNMS(LDK(KP692021471), To, Ta); + Tq = VFNMS(LDK(KP900968867), Tp, T1); + ST(&(xo[WS(os, 1)]), VFMAI(Ts, Tq), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VFNMSI(Ts, Tq), ovs, &(xo[0])); + { + V Ti, Td, Tc, Tn, Tl, Tk; + Ti = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Th, Te)); + Tc = VFNMS(LDK(KP692021471), Tb, T4); + Td = VFNMS(LDK(KP900968867), Tc, T1); + ST(&(xo[WS(os, 3)]), VFMAI(Ti, Td), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VFNMSI(Ti, Td), ovs, &(xo[0])); + Tn = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tm, Tg)); + Tk = VFNMS(LDK(KP692021471), Tj, T7); + Tl = VFNMS(LDK(KP900968867), Tk, T1); + ST(&(xo[WS(os, 2)]), VFMAI(Tn, Tl), ovs, &(xo[0])); + ST(&(xo[WS(os, 5)]), VFNMSI(Tn, Tl), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 7, XSIMD_STRING("n1bv_7"), {9, 3, 21, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_7) (planner *p) { + X(kdft_register) (p, n1bv_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 7 -name n1bv_7 -include dft/simd/n1b.h */ + +/* + * This function contains 30 FP additions, 18 FP multiplications, + * (or, 18 additions, 6 multiplications, 12 fused multiply/add), + * 24 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_7(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(14, is), MAKE_VOLATILE_STRIDE(14, os)) { + V Tb, T9, Tc, T3, Te, T6, Td, T7, T8, Ti, Tj; + Tb = LD(&(xi[0]), ivs, &(xi[0])); + T7 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tc = VADD(T7, T8); + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Te = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + Td = VADD(T4, T5); + } + ST(&(xo[0]), VADD(Tb, VADD(Te, VADD(Tc, Td))), ovs, &(xo[0])); + Ti = VBYI(VFNMS(LDK(KP781831482), T6, VFNMS(LDK(KP433883739), T9, VMUL(LDK(KP974927912), T3)))); + Tj = VFMA(LDK(KP623489801), Td, VFNMS(LDK(KP900968867), Tc, VFNMS(LDK(KP222520933), Te, Tb))); + ST(&(xo[WS(os, 2)]), VADD(Ti, Tj), ovs, &(xo[0])); + ST(&(xo[WS(os, 5)]), VSUB(Tj, Ti), ovs, &(xo[WS(os, 1)])); + { + V Ta, Tf, Tg, Th; + Ta = VBYI(VFMA(LDK(KP433883739), T3, VFNMS(LDK(KP781831482), T9, VMUL(LDK(KP974927912), T6)))); + Tf = VFMA(LDK(KP623489801), Tc, VFNMS(LDK(KP222520933), Td, VFNMS(LDK(KP900968867), Te, Tb))); + ST(&(xo[WS(os, 3)]), VADD(Ta, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VSUB(Tf, Ta), ovs, &(xo[0])); + Tg = VBYI(VFMA(LDK(KP781831482), T3, VFMA(LDK(KP974927912), T9, VMUL(LDK(KP433883739), T6)))); + Th = VFMA(LDK(KP623489801), Te, VFNMS(LDK(KP900968867), Td, VFNMS(LDK(KP222520933), Tc, Tb))); + ST(&(xo[WS(os, 1)]), VADD(Tg, Th), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VSUB(Th, Tg), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 7, XSIMD_STRING("n1bv_7"), {18, 6, 12, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_7) (planner *p) { + X(kdft_register) (p, n1bv_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_8.c new file mode 100644 index 000000000..4f7830dc8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_8.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:55 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 8 -name n1bv_8 -include dft/simd/n1b.h */ + +/* + * This function contains 26 FP additions, 10 FP multiplications, + * (or, 16 additions, 0 multiplications, 10 fused multiply/add), + * 22 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tj, Te, Tk, Ta, Tn, Tf, Tm; + { + V T1, T2, Tc, Td; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tj = VADD(T1, T2); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Ta = VADD(T6, T9); + Tn = VADD(T7, T8); + Tf = VSUB(T6, T9); + Tm = VADD(T4, T5); + } + } + { + V Tb, Tg, Tp, Tq; + Tb = VFNMS(LDK(KP707106781), Ta, T3); + Tg = VFNMS(LDK(KP707106781), Tf, Te); + ST(&(xo[WS(os, 3)]), VFNMSI(Tg, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFMAI(Tg, Tb), ovs, &(xo[WS(os, 1)])); + Tp = VADD(Tj, Tk); + Tq = VADD(Tm, Tn); + ST(&(xo[WS(os, 4)]), VSUB(Tp, Tq), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tp, Tq), ovs, &(xo[0])); + } + { + V Th, Ti, Tl, To; + Th = VFMA(LDK(KP707106781), Ta, T3); + Ti = VFMA(LDK(KP707106781), Tf, Te); + ST(&(xo[WS(os, 1)]), VFMAI(Ti, Th), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFNMSI(Ti, Th), ovs, &(xo[WS(os, 1)])); + Tl = VSUB(Tj, Tk); + To = VSUB(Tm, Tn); + ST(&(xo[WS(os, 6)]), VFNMSI(To, Tl), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(To, Tl), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n1bv_8"), {16, 0, 10, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_8) (planner *p) { + X(kdft_register) (p, n1bv_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 8 -name n1bv_8 -include dft/simd/n1b.h */ + +/* + * This function contains 26 FP additions, 2 FP multiplications, + * (or, 26 additions, 2 multiplications, 0 fused multiply/add), + * 22 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V Ta, Tk, Te, Tj, T7, Tn, Tf, Tm; + { + V T8, T9, Tc, Td; + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ta = VSUB(T8, T9); + Tk = VADD(T8, T9); + Tc = LD(&(xi[0]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tj = VADD(Tc, Td); + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + T4 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = VMUL(LDK(KP707106781), VSUB(T3, T6)); + Tn = VADD(T4, T5); + Tf = VMUL(LDK(KP707106781), VADD(T3, T6)); + Tm = VADD(T1, T2); + } + } + { + V Tb, Tg, Tp, Tq; + Tb = VBYI(VSUB(T7, Ta)); + Tg = VSUB(Te, Tf); + ST(&(xo[WS(os, 3)]), VADD(Tb, Tg), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VSUB(Tg, Tb), ovs, &(xo[WS(os, 1)])); + Tp = VADD(Tj, Tk); + Tq = VADD(Tm, Tn); + ST(&(xo[WS(os, 4)]), VSUB(Tp, Tq), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tp, Tq), ovs, &(xo[0])); + } + { + V Th, Ti, Tl, To; + Th = VBYI(VADD(Ta, T7)); + Ti = VADD(Te, Tf); + ST(&(xo[WS(os, 1)]), VADD(Th, Ti), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VSUB(Ti, Th), ovs, &(xo[WS(os, 1)])); + Tl = VSUB(Tj, Tk); + To = VBYI(VSUB(Tm, Tn)); + ST(&(xo[WS(os, 6)]), VSUB(Tl, To), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(Tl, To), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n1bv_8"), {26, 2, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_8) (planner *p) { + X(kdft_register) (p, n1bv_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_9.c new file mode 100644 index 000000000..88b753b89 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1bv_9.c @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:55 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 9 -name n1bv_9 -include dft/simd/n1b.h */ + +/* + * This function contains 46 FP additions, 38 FP multiplications, + * (or, 12 additions, 4 multiplications, 34 fused multiply/add), + * 50 stack variables, 19 constants, and 18 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_9(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP666666666, +0.666666666666666666666666666666666666666666667); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP898197570, +0.898197570222573798468955502359086394667167570); + DVK(KP673648177, +0.673648177666930348851716626769314796000375677); + DVK(KP879385241, +0.879385241571816768108218554649462939872416269); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP826351822, +0.826351822333069651148283373230685203999624323); + DVK(KP420276625, +0.420276625461206169731530603237061658838781920); + DVK(KP907603734, +0.907603734547952313649323976213898122064543220); + DVK(KP347296355, +0.347296355333860697703433253538629592000751354); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP968908795, +0.968908795874236621082202410917456709164223497); + DVK(KP726681596, +0.726681596905677465811651808188092531873167623); + DVK(KP586256827, +0.586256827714544512072145703099641959914944179); + DVK(KP152703644, +0.152703644666139302296566746461370407999248646); + DVK(KP203604859, +0.203604859554852403062088995281827210665664861); + DVK(KP439692620, +0.439692620785908384054109277324731469936208134); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(18, is), MAKE_VOLATILE_STRIDE(18, os)) { + V T5, TF, Tp, Te, Td, TG, TH, Ta, Tm, Tu, Tr, Th, Ti, Tv, Ts; + V TK, TI, TJ; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VFNMS(LDK(KP500000000), T4, T1); + TF = VADD(T1, T4); + Tp = VSUB(T2, T3); + } + { + V T6, Tf, T9, Tg; + T6 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + { + V T7, T8, Tb, Tc; + T7 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Te = VSUB(T8, T7); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tg = VADD(Tb, Tc); + } + TG = VADD(Tf, Tg); + TH = VADD(T6, T9); + Ta = VFNMS(LDK(KP500000000), T9, T6); + Tm = VFNMS(LDK(KP439692620), Td, Ta); + Tu = VFMA(LDK(KP203604859), Ta, Te); + Tr = VFNMS(LDK(KP152703644), Te, Ta); + Th = VFNMS(LDK(KP500000000), Tg, Tf); + Ti = VFNMS(LDK(KP586256827), Th, Te); + Tv = VFNMS(LDK(KP726681596), Td, Th); + Ts = VFMA(LDK(KP968908795), Th, Td); + } + TK = VMUL(LDK(KP866025403), VSUB(TG, TH)); + TI = VADD(TG, TH); + TJ = VFNMS(LDK(KP500000000), TI, TF); + ST(&(xo[WS(os, 3)]), VFMAI(TK, TJ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(TI, TF), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VFNMSI(TK, TJ), ovs, &(xo[0])); + { + V Tk, To, Tj, Tn, Tl, Tq; + Tj = VFNMS(LDK(KP347296355), Ti, Td); + Tk = VFNMS(LDK(KP907603734), Tj, Ta); + Tn = VFNMS(LDK(KP420276625), Tm, Te); + To = VFNMS(LDK(KP826351822), Tn, Th); + Tl = VFNMS(LDK(KP939692620), Tk, T5); + Tq = VMUL(LDK(KP984807753), VFNMS(LDK(KP879385241), Tp, To)); + ST(&(xo[WS(os, 7)]), VFNMSI(Tq, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VFMAI(Tq, Tl), ovs, &(xo[0])); + } + { + V Tx, TD, TB, TE, Ty, TC; + { + V Tt, Tw, Tz, TA; + Tt = VFNMS(LDK(KP673648177), Ts, Tr); + Tw = VFMA(LDK(KP898197570), Tv, Tu); + Tx = VFNMS(LDK(KP500000000), Tw, Tt); + TD = VFMA(LDK(KP852868531), Tw, T5); + Tz = VFNMS(LDK(KP898197570), Tv, Tu); + TA = VFMA(LDK(KP673648177), Ts, Tr); + TB = VFMA(LDK(KP666666666), TA, Tz); + TE = VMUL(LDK(KP984807753), VFMA(LDK(KP879385241), Tp, TA)); + } + ST(&(xo[WS(os, 1)]), VFMAI(TE, TD), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VFNMSI(TE, TD), ovs, &(xo[0])); + Ty = VFMA(LDK(KP852868531), Tx, T5); + TC = VMUL(LDK(KP866025403), VFNMS(LDK(KP852868531), TB, Tp)); + ST(&(xo[WS(os, 4)]), VFMAI(TC, Ty), ovs, &(xo[0])); + ST(&(xo[WS(os, 5)]), VFNMSI(TC, Ty), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 9, XSIMD_STRING("n1bv_9"), {12, 4, 34, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_9) (planner *p) { + X(kdft_register) (p, n1bv_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 9 -name n1bv_9 -include dft/simd/n1b.h */ + +/* + * This function contains 46 FP additions, 26 FP multiplications, + * (or, 30 additions, 10 multiplications, 16 fused multiply/add), + * 41 stack variables, 14 constants, and 18 memory accesses + */ +#include "dft/simd/n1b.h" + +static void n1bv_9(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP342020143, +0.342020143325668733044099614682259580763083368); + DVK(KP813797681, +0.813797681349373692844693217248393223289101568); + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP296198132, +0.296198132726023843175338011893050938967728390); + DVK(KP642787609, +0.642787609686539326322643409907263432907559884); + DVK(KP663413948, +0.663413948168938396205421319635891297216863310); + DVK(KP556670399, +0.556670399226419366452912952047023132968291906); + DVK(KP766044443, +0.766044443118978035202392650555416673935832457); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP150383733, +0.150383733180435296639271897612501926072238258); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP173648177, +0.173648177666930348851716626769314796000375677); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(18, is), MAKE_VOLATILE_STRIDE(18, os)) { + V T5, Ty, Tm, Ti, Tw, Th, Tj, To, Tb, Tv, Ta, Tc, Tn; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VFNMS(LDK(KP500000000), T4, T1); + Ty = VADD(T1, T4); + Tm = VMUL(LDK(KP866025403), VSUB(T2, T3)); + } + { + V Td, Tg, Te, Tf; + Td = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tf = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tg = VADD(Te, Tf); + Ti = VSUB(Te, Tf); + Tw = VADD(Td, Tg); + Th = VFNMS(LDK(KP500000000), Tg, Td); + Tj = VFNMS(LDK(KP852868531), Ti, VMUL(LDK(KP173648177), Th)); + To = VFMA(LDK(KP150383733), Ti, VMUL(LDK(KP984807753), Th)); + } + { + V T6, T9, T7, T8; + T6 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T7, T8); + Tb = VSUB(T7, T8); + Tv = VADD(T6, T9); + Ta = VFNMS(LDK(KP500000000), T9, T6); + Tc = VFNMS(LDK(KP556670399), Tb, VMUL(LDK(KP766044443), Ta)); + Tn = VFMA(LDK(KP663413948), Tb, VMUL(LDK(KP642787609), Ta)); + } + { + V Tx, Tz, TA, Tt, Tu; + Tx = VBYI(VMUL(LDK(KP866025403), VSUB(Tv, Tw))); + Tz = VADD(Tv, Tw); + TA = VFNMS(LDK(KP500000000), Tz, Ty); + ST(&(xo[WS(os, 3)]), VADD(Tx, TA), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Ty, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VSUB(TA, Tx), ovs, &(xo[0])); + Tt = VFMA(LDK(KP852868531), Tb, VFMA(LDK(KP173648177), Ta, VFMA(LDK(KP296198132), Ti, VFNMS(LDK(KP939692620), Th, T5)))); + Tu = VBYI(VSUB(VFMA(LDK(KP984807753), Ta, VFMA(LDK(KP813797681), Ti, VFNMS(LDK(KP150383733), Tb, VMUL(LDK(KP342020143), Th)))), Tm)); + ST(&(xo[WS(os, 7)]), VSUB(Tt, Tu), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VADD(Tt, Tu), ovs, &(xo[0])); + { + V Tl, Ts, Tq, Tr, Tk, Tp; + Tk = VADD(Tc, Tj); + Tl = VADD(T5, Tk); + Ts = VFMA(LDK(KP866025403), VSUB(To, Tn), VFNMS(LDK(KP500000000), Tk, T5)); + Tp = VADD(Tn, To); + Tq = VBYI(VADD(Tm, Tp)); + Tr = VBYI(VADD(Tm, VFNMS(LDK(KP500000000), Tp, VMUL(LDK(KP866025403), VSUB(Tc, Tj))))); + ST(&(xo[WS(os, 8)]), VSUB(Tl, Tq), ovs, &(xo[0])); + ST(&(xo[WS(os, 5)]), VSUB(Ts, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(Tl, Tq), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VADD(Tr, Ts), ovs, &(xo[0])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 9, XSIMD_STRING("n1bv_9"), {30, 10, 16, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1bv_9) (planner *p) { + X(kdft_register) (p, n1bv_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_10.c new file mode 100644 index 000000000..320071c89 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_10.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name n1fv_10 -include dft/simd/n1f.h */ + +/* + * This function contains 42 FP additions, 22 FP multiplications, + * (or, 24 additions, 4 multiplications, 18 fused multiply/add), + * 33 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V T3, Tr, Tm, Tn, TD, TC, Tu, Tx, Ty, Ta, Th, Ti, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tr = VADD(T1, T2); + { + V T6, Ts, Tg, Tw, T9, Tt, Td, Tv; + { + V T4, T5, Te, Tf; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Ts = VADD(T4, T5); + Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + Tw = VADD(Te, Tf); + } + { + V T7, T8, Tb, Tc; + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tt = VADD(T7, T8); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tv = VADD(Tb, Tc); + } + Tm = VSUB(T6, T9); + Tn = VSUB(Td, Tg); + TD = VSUB(Ts, Tt); + TC = VSUB(Tv, Tw); + Tu = VADD(Ts, Tt); + Tx = VADD(Tv, Tw); + Ty = VADD(Tu, Tx); + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + } + ST(&(xo[WS(os, 5)]), VADD(T3, Ti), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Tr, Ty), ovs, &(xo[0])); + { + V To, Tq, Tl, Tp, Tj, Tk; + To = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tn, Tm)); + Tq = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tm, Tn)); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tk = VSUB(Ta, Th); + Tl = VFMA(LDK(KP559016994), Tk, Tj); + Tp = VFNMS(LDK(KP559016994), Tk, Tj); + ST(&(xo[WS(os, 1)]), VFNMSI(To, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(Tq, Tp), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(To, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFNMSI(Tq, Tp), ovs, &(xo[WS(os, 1)])); + } + { + V TE, TG, TB, TF, Tz, TA; + TE = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TD, TC)); + TG = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TC, TD)); + Tz = VFNMS(LDK(KP250000000), Ty, Tr); + TA = VSUB(Tu, Tx); + TB = VFNMS(LDK(KP559016994), TA, Tz); + TF = VFMA(LDK(KP559016994), TA, Tz); + ST(&(xo[WS(os, 2)]), VFMAI(TE, TB), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VFNMSI(TG, TF), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFNMSI(TE, TB), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(TG, TF), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n1fv_10"), {24, 4, 18, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_10) (planner *p) { + X(kdft_register) (p, n1fv_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name n1fv_10 -include dft/simd/n1f.h */ + +/* + * This function contains 42 FP additions, 12 FP multiplications, + * (or, 36 additions, 6 multiplications, 6 fused multiply/add), + * 33 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V Ti, Ty, Tm, Tn, Tw, Tt, Tz, TA, TB, T7, Te, Tj, Tg, Th; + Tg = LD(&(xi[0]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Ti = VSUB(Tg, Th); + Ty = VADD(Tg, Th); + { + V T3, Tu, Td, Ts, T6, Tv, Ta, Tr; + { + V T1, T2, Tb, Tc; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tu = VADD(T1, T2); + Tb = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Ts = VADD(Tb, Tc); + } + { + V T4, T5, T8, T9; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tv = VADD(T4, T5); + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + Tr = VADD(T8, T9); + } + Tm = VSUB(T3, T6); + Tn = VSUB(Ta, Td); + Tw = VSUB(Tu, Tv); + Tt = VSUB(Tr, Ts); + Tz = VADD(Tu, Tv); + TA = VADD(Tr, Ts); + TB = VADD(Tz, TA); + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + Tj = VADD(T7, Te); + } + ST(&(xo[WS(os, 5)]), VADD(Ti, Tj), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Ty, TB), ovs, &(xo[0])); + { + V To, Tq, Tl, Tp, Tf, Tk; + To = VBYI(VFMA(LDK(KP951056516), Tm, VMUL(LDK(KP587785252), Tn))); + Tq = VBYI(VFNMS(LDK(KP587785252), Tm, VMUL(LDK(KP951056516), Tn))); + Tf = VMUL(LDK(KP559016994), VSUB(T7, Te)); + Tk = VFNMS(LDK(KP250000000), Tj, Ti); + Tl = VADD(Tf, Tk); + Tp = VSUB(Tk, Tf); + ST(&(xo[WS(os, 1)]), VSUB(Tl, To), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(Tq, Tp), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(To, Tl), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VSUB(Tp, Tq), ovs, &(xo[WS(os, 1)])); + } + { + V Tx, TF, TE, TG, TC, TD; + Tx = VBYI(VFNMS(LDK(KP587785252), Tw, VMUL(LDK(KP951056516), Tt))); + TF = VBYI(VFMA(LDK(KP951056516), Tw, VMUL(LDK(KP587785252), Tt))); + TC = VFNMS(LDK(KP250000000), TB, Ty); + TD = VMUL(LDK(KP559016994), VSUB(Tz, TA)); + TE = VSUB(TC, TD); + TG = VADD(TD, TC); + ST(&(xo[WS(os, 2)]), VADD(Tx, TE), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VSUB(TG, TF), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VSUB(TE, Tx), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(TF, TG), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n1fv_10"), {36, 6, 6, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_10) (planner *p) { + X(kdft_register) (p, n1fv_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_11.c new file mode 100644 index 000000000..ec2427d2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_11.c @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 11 -name n1fv_11 -include dft/simd/n1f.h */ + +/* + * This function contains 70 FP additions, 60 FP multiplications, + * (or, 15 additions, 5 multiplications, 55 fused multiply/add), + * 42 stack variables, 11 constants, and 22 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_11(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP959492973, +0.959492973614497389890368057066327699062454848); + DVK(KP918985947, +0.918985947228994779780736114132655398124909697); + DVK(KP989821441, +0.989821441880932732376092037776718787376519372); + DVK(KP830830026, +0.830830026003772851058548298459246407048009821); + DVK(KP876768831, +0.876768831002589333891339807079336796764054852); + DVK(KP778434453, +0.778434453334651800608337670740821884709317477); + DVK(KP372785597, +0.372785597771792209609773152906148328659002598); + DVK(KP715370323, +0.715370323453429719112414662767260662417897278); + DVK(KP521108558, +0.521108558113202722944698153526659300680427422); + DVK(KP634356270, +0.634356270682424498893150776899916060542806975); + DVK(KP342584725, +0.342584725681637509502641509861112333758894680); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(22, is), MAKE_VOLATILE_STRIDE(22, os)) { + V T1, T4, Tp, Tg, Tq, T7, Tn, Ta, Tm, Td, To, Ti, Tw, T12, Ts; + V TX, TT, TK, TB, TO, TF, T5, T6; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T2, T3, Te, Tf; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tp = VSUB(T3, T2); + Te = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tf = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tg = VADD(Te, Tf); + Tq = VSUB(Tf, Te); + } + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + Tn = VSUB(T6, T5); + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Tm = VSUB(T9, T8); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + To = VSUB(Tc, Tb); + } + { + V Th, Tv, T11, Tr, TW; + Th = VFNMS(LDK(KP342584725), Ta, T7); + Ti = VFNMS(LDK(KP634356270), Th, Td); + Tv = VFNMS(LDK(KP342584725), Td, T4); + Tw = VFNMS(LDK(KP634356270), Tv, T7); + T11 = VFNMS(LDK(KP521108558), Tp, Tn); + T12 = VFNMS(LDK(KP715370323), T11, Tm); + Tr = VFMA(LDK(KP521108558), Tq, Tp); + Ts = VFMA(LDK(KP715370323), Tr, To); + TW = VFNMS(LDK(KP342584725), Tg, Td); + TX = VFNMS(LDK(KP634356270), TW, Ta); + } + { + V TS, TJ, TA, TN, TE; + TS = VFMA(LDK(KP715370323), Tm, Tp); + TT = VFMA(LDK(KP372785597), To, TS); + TJ = VFNMS(LDK(KP521108558), Tn, To); + TK = VFMA(LDK(KP715370323), TJ, Tq); + TA = VFMA(LDK(KP521108558), Tm, Tq); + TB = VFNMS(LDK(KP715370323), TA, Tn); + TN = VFNMS(LDK(KP342584725), T7, Tg); + TO = VFNMS(LDK(KP634356270), TN, T4); + TE = VFNMS(LDK(KP342584725), T4, Ta); + TF = VFNMS(LDK(KP634356270), TE, Tg); + } + ST(&(xo[0]), VADD(T1, VADD(T4, VADD(T7, VADD(Ta, VADD(Td, Tg))))), ovs, &(xo[0])); + { + V Tk, Tu, Tj, Tt, Tl; + Tj = VFNMS(LDK(KP778434453), Ti, T4); + Tk = VFNMS(LDK(KP876768831), Tj, Tg); + Tt = VFMA(LDK(KP830830026), Ts, Tn); + Tu = VMUL(LDK(KP989821441), VFMA(LDK(KP918985947), Tt, Tm)); + Tl = VFNMS(LDK(KP959492973), Tk, T1); + ST(&(xo[WS(os, 10)]), VFNMSI(Tu, Tl), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VFMAI(Tu, Tl), ovs, &(xo[WS(os, 1)])); + } + { + V TZ, T14, TY, T13, T10; + TY = VFNMS(LDK(KP778434453), TX, T7); + TZ = VFNMS(LDK(KP876768831), TY, T4); + T13 = VFNMS(LDK(KP830830026), T12, To); + T14 = VMUL(LDK(KP989821441), VFNMS(LDK(KP918985947), T13, Tq)); + T10 = VFNMS(LDK(KP959492973), TZ, T1); + ST(&(xo[WS(os, 6)]), VFNMSI(T14, T10), ovs, &(xo[0])); + ST(&(xo[WS(os, 5)]), VFMAI(T14, T10), ovs, &(xo[WS(os, 1)])); + } + { + V TQ, TV, TP, TU, TR; + TP = VFNMS(LDK(KP778434453), TO, Ta); + TQ = VFNMS(LDK(KP876768831), TP, Td); + TU = VFNMS(LDK(KP830830026), TT, Tq); + TV = VMUL(LDK(KP989821441), VFMA(LDK(KP918985947), TU, Tn)); + TR = VFNMS(LDK(KP959492973), TQ, T1); + ST(&(xo[WS(os, 4)]), VFNMSI(TV, TR), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFMAI(TV, TR), ovs, &(xo[WS(os, 1)])); + } + { + V TH, TM, TG, TL, TI; + TG = VFNMS(LDK(KP778434453), TF, Td); + TH = VFNMS(LDK(KP876768831), TG, T7); + TL = VFNMS(LDK(KP830830026), TK, Tm); + TM = VMUL(LDK(KP989821441), VFNMS(LDK(KP918985947), TL, Tp)); + TI = VFNMS(LDK(KP959492973), TH, T1); + ST(&(xo[WS(os, 8)]), VFNMSI(TM, TI), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VFMAI(TM, TI), ovs, &(xo[WS(os, 1)])); + } + { + V Ty, TD, Tx, TC, Tz; + Tx = VFNMS(LDK(KP778434453), Tw, Tg); + Ty = VFNMS(LDK(KP876768831), Tx, Ta); + TC = VFMA(LDK(KP830830026), TB, Tp); + TD = VMUL(LDK(KP989821441), VFNMS(LDK(KP918985947), TC, To)); + Tz = VFNMS(LDK(KP959492973), Ty, T1); + ST(&(xo[WS(os, 2)]), VFNMSI(TD, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFMAI(TD, Tz), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 11, XSIMD_STRING("n1fv_11"), {15, 5, 55, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_11) (planner *p) { + X(kdft_register) (p, n1fv_11, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 11 -name n1fv_11 -include dft/simd/n1f.h */ + +/* + * This function contains 70 FP additions, 50 FP multiplications, + * (or, 30 additions, 10 multiplications, 40 fused multiply/add), + * 32 stack variables, 10 constants, and 22 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_11(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP654860733, +0.654860733945285064056925072466293553183791199); + DVK(KP142314838, +0.142314838273285140443792668616369668791051361); + DVK(KP959492973, +0.959492973614497389890368057066327699062454848); + DVK(KP415415013, +0.415415013001886425529274149229623203524004910); + DVK(KP841253532, +0.841253532831181168861811648919367717513292498); + DVK(KP989821441, +0.989821441880932732376092037776718787376519372); + DVK(KP909631995, +0.909631995354518371411715383079028460060241051); + DVK(KP281732556, +0.281732556841429697711417915346616899035777899); + DVK(KP540640817, +0.540640817455597582107635954318691695431770608); + DVK(KP755749574, +0.755749574354258283774035843972344420179717445); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(22, is), MAKE_VOLATILE_STRIDE(22, os)) { + V T1, T4, Ti, Tg, Tl, Td, Tk, Ta, Tj, T7, Tm, Tb, Tc, Tt, Ts; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T2, T3, Te, Tf; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Ti = VSUB(T3, T2); + Te = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tf = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tg = VADD(Te, Tf); + Tl = VSUB(Tf, Te); + } + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + Tk = VSUB(Tc, Tb); + { + V T8, T9, T5, T6; + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Tj = VSUB(T9, T8); + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + Tm = VSUB(T6, T5); + } + ST(&(xo[0]), VADD(T1, VADD(T4, VADD(T7, VADD(Ta, VADD(Td, Tg))))), ovs, &(xo[0])); + { + V Tn, Th, Tv, Tu; + Tn = VBYI(VFMA(LDK(KP755749574), Ti, VFMA(LDK(KP540640817), Tj, VFNMS(LDK(KP909631995), Tl, VFNMS(LDK(KP989821441), Tm, VMUL(LDK(KP281732556), Tk)))))); + Th = VFMA(LDK(KP841253532), Ta, VFMA(LDK(KP415415013), Tg, VFNMS(LDK(KP959492973), Td, VFNMS(LDK(KP142314838), T7, VFNMS(LDK(KP654860733), T4, T1))))); + ST(&(xo[WS(os, 7)]), VSUB(Th, Tn), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VADD(Th, Tn), ovs, &(xo[0])); + Tv = VBYI(VFMA(LDK(KP281732556), Ti, VFMA(LDK(KP755749574), Tj, VFNMS(LDK(KP909631995), Tk, VFNMS(LDK(KP540640817), Tm, VMUL(LDK(KP989821441), Tl)))))); + Tu = VFMA(LDK(KP841253532), T7, VFMA(LDK(KP415415013), Td, VFNMS(LDK(KP142314838), Tg, VFNMS(LDK(KP654860733), Ta, VFNMS(LDK(KP959492973), T4, T1))))); + ST(&(xo[WS(os, 6)]), VSUB(Tu, Tv), ovs, &(xo[0])); + ST(&(xo[WS(os, 5)]), VADD(Tu, Tv), ovs, &(xo[WS(os, 1)])); + } + Tt = VBYI(VFMA(LDK(KP989821441), Ti, VFMA(LDK(KP540640817), Tk, VFNMS(LDK(KP909631995), Tj, VFNMS(LDK(KP281732556), Tm, VMUL(LDK(KP755749574), Tl)))))); + Ts = VFMA(LDK(KP415415013), Ta, VFMA(LDK(KP841253532), Td, VFNMS(LDK(KP654860733), Tg, VFNMS(LDK(KP959492973), T7, VFNMS(LDK(KP142314838), T4, T1))))); + ST(&(xo[WS(os, 8)]), VSUB(Ts, Tt), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VADD(Ts, Tt), ovs, &(xo[WS(os, 1)])); + { + V Tr, Tq, Tp, To; + Tr = VBYI(VFMA(LDK(KP540640817), Ti, VFMA(LDK(KP909631995), Tm, VFMA(LDK(KP989821441), Tj, VFMA(LDK(KP755749574), Tk, VMUL(LDK(KP281732556), Tl)))))); + Tq = VFMA(LDK(KP841253532), T4, VFMA(LDK(KP415415013), T7, VFNMS(LDK(KP959492973), Tg, VFNMS(LDK(KP654860733), Td, VFNMS(LDK(KP142314838), Ta, T1))))); + ST(&(xo[WS(os, 10)]), VSUB(Tq, Tr), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(Tq, Tr), ovs, &(xo[WS(os, 1)])); + Tp = VBYI(VFMA(LDK(KP909631995), Ti, VFNMS(LDK(KP540640817), Tl, VFNMS(LDK(KP989821441), Tk, VFNMS(LDK(KP281732556), Tj, VMUL(LDK(KP755749574), Tm)))))); + To = VFMA(LDK(KP415415013), T4, VFMA(LDK(KP841253532), Tg, VFNMS(LDK(KP142314838), Td, VFNMS(LDK(KP959492973), Ta, VFNMS(LDK(KP654860733), T7, T1))))); + ST(&(xo[WS(os, 9)]), VSUB(To, Tp), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VADD(To, Tp), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 11, XSIMD_STRING("n1fv_11"), {30, 10, 40, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_11) (planner *p) { + X(kdft_register) (p, n1fv_11, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_12.c new file mode 100644 index 000000000..1a3b25836 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_12.c @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name n1fv_12 -include dft/simd/n1f.h */ + +/* + * This function contains 48 FP additions, 20 FP multiplications, + * (or, 30 additions, 2 multiplications, 18 fused multiply/add), + * 27 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TG, TF, TB, Tt, Ti, Tm, TJ, TI, TA, Tp; + { + V T1, T6, T4, Tr, T9, Ts; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tr = VSUB(T3, T2); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Ts = VSUB(T8, T7); + } + T5 = VFNMS(LDK(KP500000000), T4, T1); + Ta = VFNMS(LDK(KP500000000), T9, T6); + TG = VADD(T6, T9); + TF = VADD(T1, T4); + TB = VADD(Tr, Ts); + Tt = VSUB(Tr, Ts); + } + { + V Tk, Tn, Te, Tl, Th, To; + Tk = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = VSUB(Tc, Td); + Tl = VADD(Td, Tc); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + To = VADD(Tf, Tg); + } + Ti = VADD(Te, Th); + Tm = VFNMS(LDK(KP500000000), Tl, Tk); + TJ = VADD(Tn, To); + TI = VADD(Tk, Tl); + TA = VSUB(Te, Th); + Tp = VFNMS(LDK(KP500000000), To, Tn); + } + { + V TH, TK, TL, TM; + TH = VSUB(TF, TG); + TK = VSUB(TI, TJ); + ST(&(xo[WS(os, 9)]), VFNMSI(TK, TH), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(TK, TH), ovs, &(xo[WS(os, 1)])); + TL = VADD(TF, TG); + TM = VADD(TI, TJ); + ST(&(xo[WS(os, 6)]), VSUB(TL, TM), ovs, &(xo[0])); + ST(&(xo[0]), VADD(TL, TM), ovs, &(xo[0])); + } + { + V Tj, Tv, Tu, Tw, Tb, Tq; + Tb = VSUB(T5, Ta); + Tj = VFMA(LDK(KP866025403), Ti, Tb); + Tv = VFNMS(LDK(KP866025403), Ti, Tb); + Tq = VSUB(Tm, Tp); + Tu = VFNMS(LDK(KP866025403), Tt, Tq); + Tw = VFMA(LDK(KP866025403), Tt, Tq); + ST(&(xo[WS(os, 1)]), VFNMSI(Tu, Tj), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(Tw, Tv), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFMAI(Tu, Tj), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VFNMSI(Tw, Tv), ovs, &(xo[WS(os, 1)])); + } + { + V TC, TE, Tz, TD, Tx, Ty; + TC = VMUL(LDK(KP866025403), VSUB(TA, TB)); + TE = VMUL(LDK(KP866025403), VADD(TB, TA)); + Tx = VADD(T5, Ta); + Ty = VADD(Tm, Tp); + Tz = VSUB(Tx, Ty); + TD = VADD(Tx, Ty); + ST(&(xo[WS(os, 2)]), VFMAI(TC, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFNMSI(TE, TD), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VFNMSI(TC, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(TE, TD), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n1fv_12"), {30, 2, 18, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_12) (planner *p) { + X(kdft_register) (p, n1fv_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name n1fv_12 -include dft/simd/n1f.h */ + +/* + * This function contains 48 FP additions, 8 FP multiplications, + * (or, 44 additions, 4 multiplications, 4 fused multiply/add), + * 27 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TJ, Ty, Tq, Tp, Tg, Tl, TI, TA, Tz, Tu; + { + V T1, T6, T4, Tw, T9, Tx; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tw = VSUB(T3, T2); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Tx = VSUB(T8, T7); + } + T5 = VADD(T1, T4); + Ta = VADD(T6, T9); + TJ = VADD(Tw, Tx); + Ty = VMUL(LDK(KP866025403), VSUB(Tw, Tx)); + Tq = VFNMS(LDK(KP500000000), T9, T6); + Tp = VFNMS(LDK(KP500000000), T4, T1); + } + { + V Tc, Th, Tf, Ts, Tk, Tt; + Tc = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Td, Te, Ti, Tj; + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Ts = VSUB(Te, Td); + Ti = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + Tt = VSUB(Tj, Ti); + } + Tg = VADD(Tc, Tf); + Tl = VADD(Th, Tk); + TI = VADD(Ts, Tt); + TA = VFNMS(LDK(KP500000000), Tk, Th); + Tz = VFNMS(LDK(KP500000000), Tf, Tc); + Tu = VMUL(LDK(KP866025403), VSUB(Ts, Tt)); + } + { + V Tb, Tm, Tn, To; + Tb = VSUB(T5, Ta); + Tm = VBYI(VSUB(Tg, Tl)); + ST(&(xo[WS(os, 9)]), VSUB(Tb, Tm), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(Tb, Tm), ovs, &(xo[WS(os, 1)])); + Tn = VADD(T5, Ta); + To = VADD(Tg, Tl); + ST(&(xo[WS(os, 6)]), VSUB(Tn, To), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tn, To), ovs, &(xo[0])); + } + { + V Tv, TE, TC, TD, Tr, TB; + Tr = VSUB(Tp, Tq); + Tv = VSUB(Tr, Tu); + TE = VADD(Tr, Tu); + TB = VSUB(Tz, TA); + TC = VBYI(VADD(Ty, TB)); + TD = VBYI(VSUB(Ty, TB)); + ST(&(xo[WS(os, 5)]), VSUB(Tv, TC), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VSUB(TE, TD), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(TC, Tv), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(TD, TE), ovs, &(xo[WS(os, 1)])); + } + { + V TK, TM, TH, TL, TF, TG; + TK = VBYI(VMUL(LDK(KP866025403), VSUB(TI, TJ))); + TM = VBYI(VMUL(LDK(KP866025403), VADD(TJ, TI))); + TF = VADD(Tp, Tq); + TG = VADD(Tz, TA); + TH = VSUB(TF, TG); + TL = VADD(TF, TG); + ST(&(xo[WS(os, 10)]), VSUB(TH, TK), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(TL, TM), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(TH, TK), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VSUB(TL, TM), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n1fv_12"), {44, 4, 4, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_12) (planner *p) { + X(kdft_register) (p, n1fv_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_128.c new file mode 100644 index 000000000..180d6c2e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_128.c @@ -0,0 +1,3654 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:53 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 128 -name n1fv_128 -include dft/simd/n1f.h */ + +/* + * This function contains 1082 FP additions, 642 FP multiplications, + * (or, 440 additions, 0 multiplications, 642 fused multiply/add), + * 194 stack variables, 31 constants, and 256 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_128(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP941544065, +0.941544065183020778412509402599502357185589796); + DVK(KP903989293, +0.903989293123443331586200297230537048710132025); + DVK(KP357805721, +0.357805721314524104672487743774474392487532769); + DVK(KP472964775, +0.472964775891319928124438237972992463904131113); + DVK(KP970031253, +0.970031253194543992603984207286100251456865962); + DVK(KP857728610, +0.857728610000272069902269984284770137042490799); + DVK(KP250486960, +0.250486960191305461595702160124721208578685568); + DVK(KP599376933, +0.599376933681923766271389869014404232837890546); + DVK(KP740951125, +0.740951125354959091175616897495162729728955309); + DVK(KP998795456, +0.998795456205172392714771604759100694443203615); + DVK(KP906347169, +0.906347169019147157946142717268914412664134293); + DVK(KP049126849, +0.049126849769467254105343321271313617079695752); + DVK(KP803207531, +0.803207531480644909806676512963141923879569427); + DVK(KP989176509, +0.989176509964780973451673738016243063983689533); + DVK(KP741650546, +0.741650546272035369581266691172079863842265220); + DVK(KP148335987, +0.148335987538347428753676511486911367000625355); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + V Tr, T5J, Ted, Tgf, Tfq, TgG, T4U, T6a, T6Z, T8T, Tad, TcZ, Tcc, Td0, T84; + V T9k, Tb6, Tbt, T2G, T5U, TeV, Tgt, T3p, T5X, T7B, T97, TeK, Tgq, T7q, T94; + V Td8, TdK, TbD, Tc0, T3V, T61, Tfg, TgA, T4E, T64, T7U, T9e, Tf5, Tgx, T7J; + V T9b, Tdf, TdN, Td2, Td3, TI, T4V, Tft, Tgg, TZ, T4W, T75, T86, Tek, TgH; + V T72, T85, Tas, Tcd, Tdp, Tdq, TdG, Teq, Tgj, Tet, Tgi, T1s, T5N, T1B, T5M; + V T7d, T8W, TaI, Tcg, T7a, T8X, Tdm, Tdn, TdH, Tez, Tgm, TeC, Tgl, T23, T5Q; + V T2c, T5P, T7k, T8Z, TaX, Tcf, T7h, T90, Tbl, Tbu, Tdb, TdL, TeY, Tgr, TeR; + V Tgu, T7x, T98, T7E, T95, T3f, T5Y, T3s, T5V, TbS, Tc1, Tdi, TdO, Tfj, Tgy; + V Tfc, TgB, T7Q, T9f, T7X, T9c, T4u, T65, T4H, T62; + { + V T3, Ta7, T4O, Ta8, Ta, Tab, T4P, Taa, Tc9, Tca, Ti, Tea, T4R, Tc6, Tc7; + V Tp, Teb, T4S; + { + V T1, T2, T4M, T4N; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 64)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Ta7 = VADD(T1, T2); + T4M = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T4N = LD(&(xi[WS(is, 96)]), ivs, &(xi[0])); + T4O = VSUB(T4M, T4N); + Ta8 = VADD(T4M, T4N); + } + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 80)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 112)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + Ta = VADD(T6, T9); + Tab = VADD(T7, T8); + T4P = VSUB(T9, T6); + Taa = VADD(T4, T5); + } + { + V Te, Th, Tl, To; + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 72)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tc9 = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 104)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + Tca = VADD(Tf, Tg); + } + Ti = VFNMS(LDK(KP414213562), Th, Te); + Tea = VSUB(Tc9, Tca); + T4R = VFMA(LDK(KP414213562), Te, Th); + { + V Tj, Tk, Tm, Tn; + Tj = LD(&(xi[WS(is, 120)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + Tc6 = VADD(Tj, Tk); + Tm = LD(&(xi[WS(is, 88)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + Tc7 = VADD(Tn, Tm); + } + Tp = VFNMS(LDK(KP414213562), To, Tl); + Teb = VSUB(Tc6, Tc7); + T4S = VFMA(LDK(KP414213562), Tl, To); + } + { + V Tb, Tq, Te9, Tec; + Tb = VFMA(LDK(KP707106781), Ta, T3); + Tq = VADD(Ti, Tp); + Tr = VFMA(LDK(KP923879532), Tq, Tb); + T5J = VFNMS(LDK(KP923879532), Tq, Tb); + Te9 = VSUB(Ta7, Ta8); + Tec = VADD(Tea, Teb); + Ted = VFMA(LDK(KP707106781), Tec, Te9); + Tgf = VFNMS(LDK(KP707106781), Tec, Te9); + } + { + V Tfo, Tfp, T4Q, T4T; + Tfo = VSUB(Tab, Taa); + Tfp = VSUB(Teb, Tea); + Tfq = VFMA(LDK(KP707106781), Tfp, Tfo); + TgG = VFNMS(LDK(KP707106781), Tfp, Tfo); + T4Q = VFNMS(LDK(KP707106781), T4P, T4O); + T4T = VSUB(T4R, T4S); + T4U = VFMA(LDK(KP923879532), T4T, T4Q); + T6a = VFNMS(LDK(KP923879532), T4T, T4Q); + } + { + V T6X, T6Y, Ta9, Tac; + T6X = VFNMS(LDK(KP707106781), Ta, T3); + T6Y = VADD(T4R, T4S); + T6Z = VFMA(LDK(KP923879532), T6Y, T6X); + T8T = VFNMS(LDK(KP923879532), T6Y, T6X); + Ta9 = VADD(Ta7, Ta8); + Tac = VADD(Taa, Tab); + Tad = VSUB(Ta9, Tac); + TcZ = VADD(Ta9, Tac); + } + { + V Tc8, Tcb, T82, T83; + Tc8 = VADD(Tc6, Tc7); + Tcb = VADD(Tc9, Tca); + Tcc = VSUB(Tc8, Tcb); + Td0 = VADD(Tcb, Tc8); + T82 = VFMA(LDK(KP707106781), T4P, T4O); + T83 = VSUB(Tp, Ti); + T84 = VFMA(LDK(KP923879532), T83, T82); + T9k = VFNMS(LDK(KP923879532), T83, T82); + } + } + { + V Tb0, Tb1, T2i, Tb2, T3j, Tb3, Tb4, T2p, Tb5, T3k, T2x, TeH, T3m, Tbp, T2E; + V TeI, T3n, Tbs, T2l, T2o, TeG, TeJ; + { + V T2g, T2h, T3h, T3i; + T2g = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2h = LD(&(xi[WS(is, 65)]), ivs, &(xi[WS(is, 1)])); + Tb0 = VADD(T2g, T2h); + T3h = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T3i = LD(&(xi[WS(is, 97)]), ivs, &(xi[WS(is, 1)])); + Tb1 = VADD(T3h, T3i); + T2i = VSUB(T2g, T2h); + Tb2 = VADD(Tb0, Tb1); + T3j = VSUB(T3h, T3i); + } + { + V T2j, T2k, T2m, T2n; + T2j = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T2k = LD(&(xi[WS(is, 81)]), ivs, &(xi[WS(is, 1)])); + T2l = VSUB(T2j, T2k); + Tb3 = VADD(T2j, T2k); + T2m = LD(&(xi[WS(is, 113)]), ivs, &(xi[WS(is, 1)])); + T2n = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T2o = VSUB(T2m, T2n); + Tb4 = VADD(T2m, T2n); + } + T2p = VADD(T2l, T2o); + Tb5 = VADD(Tb3, Tb4); + T3k = VSUB(T2l, T2o); + { + V T2t, Tbn, T2w, Tbo; + { + V T2r, T2s, T2u, T2v; + T2r = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T2s = LD(&(xi[WS(is, 73)]), ivs, &(xi[WS(is, 1)])); + T2t = VSUB(T2r, T2s); + Tbn = VADD(T2r, T2s); + T2u = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T2v = LD(&(xi[WS(is, 105)]), ivs, &(xi[WS(is, 1)])); + T2w = VSUB(T2u, T2v); + Tbo = VADD(T2u, T2v); + } + T2x = VFNMS(LDK(KP414213562), T2w, T2t); + TeH = VSUB(Tbn, Tbo); + T3m = VFMA(LDK(KP414213562), T2t, T2w); + Tbp = VADD(Tbn, Tbo); + } + { + V T2A, Tbq, T2D, Tbr; + { + V T2y, T2z, T2B, T2C; + T2y = LD(&(xi[WS(is, 121)]), ivs, &(xi[WS(is, 1)])); + T2z = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T2A = VSUB(T2y, T2z); + Tbq = VADD(T2y, T2z); + T2B = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T2C = LD(&(xi[WS(is, 89)]), ivs, &(xi[WS(is, 1)])); + T2D = VSUB(T2B, T2C); + Tbr = VADD(T2B, T2C); + } + T2E = VFMA(LDK(KP414213562), T2D, T2A); + TeI = VSUB(Tbq, Tbr); + T3n = VFNMS(LDK(KP414213562), T2A, T2D); + Tbs = VADD(Tbq, Tbr); + } + Tb6 = VSUB(Tb2, Tb5); + Tbt = VSUB(Tbp, Tbs); + { + V T2q, T2F, TeT, TeU; + T2q = VFMA(LDK(KP707106781), T2p, T2i); + T2F = VADD(T2x, T2E); + T2G = VFMA(LDK(KP923879532), T2F, T2q); + T5U = VFNMS(LDK(KP923879532), T2F, T2q); + TeT = VSUB(Tb3, Tb4); + TeU = VSUB(TeH, TeI); + TeV = VFMA(LDK(KP707106781), TeU, TeT); + Tgt = VFNMS(LDK(KP707106781), TeU, TeT); + } + { + V T3l, T3o, T7z, T7A; + T3l = VFMA(LDK(KP707106781), T3k, T3j); + T3o = VADD(T3m, T3n); + T3p = VFMA(LDK(KP923879532), T3o, T3l); + T5X = VFNMS(LDK(KP923879532), T3o, T3l); + T7z = VFNMS(LDK(KP707106781), T3k, T3j); + T7A = VSUB(T2x, T2E); + T7B = VFNMS(LDK(KP923879532), T7A, T7z); + T97 = VFMA(LDK(KP923879532), T7A, T7z); + } + TeG = VSUB(Tb0, Tb1); + TeJ = VADD(TeH, TeI); + TeK = VFMA(LDK(KP707106781), TeJ, TeG); + Tgq = VFNMS(LDK(KP707106781), TeJ, TeG); + { + V T7o, T7p, Td6, Td7; + T7o = VFNMS(LDK(KP707106781), T2p, T2i); + T7p = VSUB(T3m, T3n); + T7q = VFMA(LDK(KP923879532), T7p, T7o); + T94 = VFNMS(LDK(KP923879532), T7p, T7o); + Td6 = VADD(Tb2, Tb5); + Td7 = VADD(Tbp, Tbs); + Td8 = VADD(Td6, Td7); + TdK = VSUB(Td6, Td7); + } + } + { + V Tbx, Tby, T3x, Tbz, T4y, TbA, TbB, T3E, TbC, T4z, T3M, Tf2, T4B, TbZ, T3T; + V Tf3, T4C, TbW, T3A, T3D, Tf1, Tf4; + { + V T3v, T3w, T4w, T4x; + T3v = LD(&(xi[WS(is, 127)]), ivs, &(xi[WS(is, 1)])); + T3w = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + Tbx = VADD(T3v, T3w); + T4w = LD(&(xi[WS(is, 95)]), ivs, &(xi[WS(is, 1)])); + T4x = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + Tby = VADD(T4x, T4w); + T3x = VSUB(T3v, T3w); + Tbz = VADD(Tbx, Tby); + T4y = VSUB(T4w, T4x); + } + { + V T3y, T3z, T3B, T3C; + T3y = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T3z = LD(&(xi[WS(is, 79)]), ivs, &(xi[WS(is, 1)])); + T3A = VSUB(T3y, T3z); + TbA = VADD(T3y, T3z); + T3B = LD(&(xi[WS(is, 111)]), ivs, &(xi[WS(is, 1)])); + T3C = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T3D = VSUB(T3B, T3C); + TbB = VADD(T3B, T3C); + } + T3E = VADD(T3A, T3D); + TbC = VADD(TbA, TbB); + T4z = VSUB(T3D, T3A); + { + V T3I, TbX, T3L, TbY; + { + V T3G, T3H, T3J, T3K; + T3G = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3H = LD(&(xi[WS(is, 71)]), ivs, &(xi[WS(is, 1)])); + T3I = VSUB(T3G, T3H); + TbX = VADD(T3G, T3H); + T3J = LD(&(xi[WS(is, 103)]), ivs, &(xi[WS(is, 1)])); + T3K = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T3L = VSUB(T3J, T3K); + TbY = VADD(T3K, T3J); + } + T3M = VFMA(LDK(KP414213562), T3L, T3I); + Tf2 = VSUB(TbX, TbY); + T4B = VFNMS(LDK(KP414213562), T3I, T3L); + TbZ = VADD(TbX, TbY); + } + { + V T3P, TbU, T3S, TbV; + { + V T3N, T3O, T3Q, T3R; + T3N = LD(&(xi[WS(is, 119)]), ivs, &(xi[WS(is, 1)])); + T3O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T3P = VSUB(T3N, T3O); + TbU = VADD(T3N, T3O); + T3Q = LD(&(xi[WS(is, 87)]), ivs, &(xi[WS(is, 1)])); + T3R = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T3S = VSUB(T3Q, T3R); + TbV = VADD(T3R, T3Q); + } + T3T = VFNMS(LDK(KP414213562), T3S, T3P); + Tf3 = VSUB(TbU, TbV); + T4C = VFMA(LDK(KP414213562), T3P, T3S); + TbW = VADD(TbU, TbV); + } + TbD = VSUB(Tbz, TbC); + Tc0 = VSUB(TbW, TbZ); + { + V T3F, T3U, Tfe, Tff; + T3F = VFMA(LDK(KP707106781), T3E, T3x); + T3U = VADD(T3M, T3T); + T3V = VFMA(LDK(KP923879532), T3U, T3F); + T61 = VFNMS(LDK(KP923879532), T3U, T3F); + Tfe = VSUB(TbB, TbA); + Tff = VSUB(Tf3, Tf2); + Tfg = VFMA(LDK(KP707106781), Tff, Tfe); + TgA = VFNMS(LDK(KP707106781), Tff, Tfe); + } + { + V T4A, T4D, T7S, T7T; + T4A = VFMA(LDK(KP707106781), T4z, T4y); + T4D = VADD(T4B, T4C); + T4E = VFMA(LDK(KP923879532), T4D, T4A); + T64 = VFNMS(LDK(KP923879532), T4D, T4A); + T7S = VFNMS(LDK(KP707106781), T4z, T4y); + T7T = VSUB(T3T, T3M); + T7U = VFNMS(LDK(KP923879532), T7T, T7S); + T9e = VFMA(LDK(KP923879532), T7T, T7S); + } + Tf1 = VSUB(Tbx, Tby); + Tf4 = VADD(Tf2, Tf3); + Tf5 = VFMA(LDK(KP707106781), Tf4, Tf1); + Tgx = VFNMS(LDK(KP707106781), Tf4, Tf1); + { + V T7H, T7I, Tdd, Tde; + T7H = VFNMS(LDK(KP707106781), T3E, T3x); + T7I = VSUB(T4C, T4B); + T7J = VFMA(LDK(KP923879532), T7I, T7H); + T9b = VFNMS(LDK(KP923879532), T7I, T7H); + Tdd = VADD(Tbz, TbC); + Tde = VADD(TbZ, TbW); + Tdf = VADD(Tdd, Tde); + TdN = VSUB(Tdd, Tde); + } + } + { + V Tu, Tee, TF, Tag, TL, Teh, TW, Tan, TB, Tef, TG, Taj, TS, Tei, TX; + V Taq, Teg, Tej; + { + V Ts, Tt, Tae, TD, TE, Taf; + Ts = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 68)]), ivs, &(xi[0])); + Tae = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 100)]), ivs, &(xi[0])); + Taf = VADD(TD, TE); + Tu = VSUB(Ts, Tt); + Tee = VSUB(Tae, Taf); + TF = VSUB(TD, TE); + Tag = VADD(Tae, Taf); + } + { + V TJ, TK, Tal, TU, TV, Tam; + TJ = LD(&(xi[WS(is, 124)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tal = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 92)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Tam = VADD(TV, TU); + TL = VSUB(TJ, TK); + Teh = VSUB(Tal, Tam); + TW = VSUB(TU, TV); + Tan = VADD(Tal, Tam); + } + { + V Tx, Tah, TA, Tai; + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 84)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Tah = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 116)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + TA = VSUB(Ty, Tz); + Tai = VADD(Ty, Tz); + } + TB = VADD(Tx, TA); + Tef = VSUB(Tah, Tai); + TG = VSUB(Tx, TA); + Taj = VADD(Tah, Tai); + } + { + V TO, Tao, TR, Tap; + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 76)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + Tao = VADD(TM, TN); + TP = LD(&(xi[WS(is, 108)]), ivs, &(xi[0])); + TQ = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + TR = VSUB(TP, TQ); + Tap = VADD(TP, TQ); + } + TS = VADD(TO, TR); + Tei = VSUB(Tap, Tao); + TX = VSUB(TR, TO); + Taq = VADD(Tao, Tap); + } + Td2 = VADD(Tag, Taj); + Td3 = VADD(Tan, Taq); + { + V TC, TH, Tfr, Tfs; + TC = VFMA(LDK(KP707106781), TB, Tu); + TH = VFMA(LDK(KP707106781), TG, TF); + TI = VFNMS(LDK(KP198912367), TH, TC); + T4V = VFMA(LDK(KP198912367), TC, TH); + Tfr = VFMA(LDK(KP414213562), Teh, Tei); + Tfs = VFMA(LDK(KP414213562), Tee, Tef); + Tft = VSUB(Tfr, Tfs); + Tgg = VADD(Tfs, Tfr); + } + { + V TT, TY, T73, T74; + TT = VFMA(LDK(KP707106781), TS, TL); + TY = VFMA(LDK(KP707106781), TX, TW); + TZ = VFNMS(LDK(KP198912367), TY, TT); + T4W = VFMA(LDK(KP198912367), TT, TY); + T73 = VFNMS(LDK(KP707106781), TS, TL); + T74 = VFNMS(LDK(KP707106781), TX, TW); + T75 = VFMA(LDK(KP668178637), T74, T73); + T86 = VFNMS(LDK(KP668178637), T73, T74); + } + Teg = VFNMS(LDK(KP414213562), Tef, Tee); + Tej = VFNMS(LDK(KP414213562), Tei, Teh); + Tek = VADD(Teg, Tej); + TgH = VSUB(Tej, Teg); + { + V T70, T71, Tak, Tar; + T70 = VFNMS(LDK(KP707106781), TB, Tu); + T71 = VFNMS(LDK(KP707106781), TG, TF); + T72 = VFMA(LDK(KP668178637), T71, T70); + T85 = VFNMS(LDK(KP668178637), T70, T71); + Tak = VSUB(Tag, Taj); + Tar = VSUB(Tan, Taq); + Tas = VADD(Tak, Tar); + Tcd = VSUB(Tar, Tak); + } + } + { + V Tau, Tav, T14, Taw, T1v, Tax, Tay, T1b, Taz, T1w, T1j, Ten, T1y, TaD, T1q; + V Teo, T1z, TaG, T17, T1a, Tem, Tep; + { + V T12, T13, T1t, T1u; + T12 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 66)]), ivs, &(xi[0])); + Tau = VADD(T12, T13); + T1t = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + T1u = LD(&(xi[WS(is, 98)]), ivs, &(xi[0])); + Tav = VADD(T1t, T1u); + T14 = VSUB(T12, T13); + Taw = VADD(Tau, Tav); + T1v = VSUB(T1t, T1u); + } + { + V T15, T16, T18, T19; + T15 = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T16 = LD(&(xi[WS(is, 82)]), ivs, &(xi[0])); + T17 = VSUB(T15, T16); + Tax = VADD(T15, T16); + T18 = LD(&(xi[WS(is, 114)]), ivs, &(xi[0])); + T19 = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + T1a = VSUB(T18, T19); + Tay = VADD(T18, T19); + } + T1b = VADD(T17, T1a); + Taz = VADD(Tax, Tay); + T1w = VSUB(T17, T1a); + { + V T1f, TaB, T1i, TaC; + { + V T1d, T1e, T1g, T1h; + T1d = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1e = LD(&(xi[WS(is, 74)]), ivs, &(xi[0])); + T1f = VSUB(T1d, T1e); + TaB = VADD(T1d, T1e); + T1g = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T1h = LD(&(xi[WS(is, 106)]), ivs, &(xi[0])); + T1i = VSUB(T1g, T1h); + TaC = VADD(T1g, T1h); + } + T1j = VFNMS(LDK(KP414213562), T1i, T1f); + Ten = VSUB(TaB, TaC); + T1y = VFMA(LDK(KP414213562), T1f, T1i); + TaD = VADD(TaB, TaC); + } + { + V T1m, TaE, T1p, TaF; + { + V T1k, T1l, T1n, T1o; + T1k = LD(&(xi[WS(is, 122)]), ivs, &(xi[0])); + T1l = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + T1m = VSUB(T1k, T1l); + TaE = VADD(T1k, T1l); + T1n = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T1o = LD(&(xi[WS(is, 90)]), ivs, &(xi[0])); + T1p = VSUB(T1n, T1o); + TaF = VADD(T1n, T1o); + } + T1q = VFMA(LDK(KP414213562), T1p, T1m); + Teo = VSUB(TaE, TaF); + T1z = VFNMS(LDK(KP414213562), T1m, T1p); + TaG = VADD(TaE, TaF); + } + Tdp = VADD(Taw, Taz); + Tdq = VADD(TaD, TaG); + TdG = VSUB(Tdp, Tdq); + Tem = VSUB(Tau, Tav); + Tep = VADD(Ten, Teo); + Teq = VFMA(LDK(KP707106781), Tep, Tem); + Tgj = VFNMS(LDK(KP707106781), Tep, Tem); + { + V Ter, Tes, T1c, T1r; + Ter = VSUB(Tax, Tay); + Tes = VSUB(Ten, Teo); + Tet = VFMA(LDK(KP707106781), Tes, Ter); + Tgi = VFNMS(LDK(KP707106781), Tes, Ter); + T1c = VFMA(LDK(KP707106781), T1b, T14); + T1r = VADD(T1j, T1q); + T1s = VFMA(LDK(KP923879532), T1r, T1c); + T5N = VFNMS(LDK(KP923879532), T1r, T1c); + } + { + V T1x, T1A, T7b, T7c; + T1x = VFMA(LDK(KP707106781), T1w, T1v); + T1A = VADD(T1y, T1z); + T1B = VFMA(LDK(KP923879532), T1A, T1x); + T5M = VFNMS(LDK(KP923879532), T1A, T1x); + T7b = VFNMS(LDK(KP707106781), T1w, T1v); + T7c = VSUB(T1j, T1q); + T7d = VFNMS(LDK(KP923879532), T7c, T7b); + T8W = VFMA(LDK(KP923879532), T7c, T7b); + } + { + V TaA, TaH, T78, T79; + TaA = VSUB(Taw, Taz); + TaH = VSUB(TaD, TaG); + TaI = VFNMS(LDK(KP414213562), TaH, TaA); + Tcg = VFMA(LDK(KP414213562), TaA, TaH); + T78 = VFNMS(LDK(KP707106781), T1b, T14); + T79 = VSUB(T1y, T1z); + T7a = VFMA(LDK(KP923879532), T79, T78); + T8X = VFNMS(LDK(KP923879532), T79, T78); + } + } + { + V TaJ, TaK, T1F, TaL, T26, TaM, TaN, T1M, TaO, T27, T1U, Tew, T29, TaV, T21; + V Tex, T2a, TaS, T1I, T1L, Tev, Tey; + { + V T1D, T1E, T24, T25; + T1D = LD(&(xi[WS(is, 126)]), ivs, &(xi[0])); + T1E = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TaJ = VADD(T1D, T1E); + T24 = LD(&(xi[WS(is, 94)]), ivs, &(xi[0])); + T25 = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TaK = VADD(T25, T24); + T1F = VSUB(T1D, T1E); + TaL = VADD(TaJ, TaK); + T26 = VSUB(T24, T25); + } + { + V T1G, T1H, T1J, T1K; + T1G = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T1H = LD(&(xi[WS(is, 78)]), ivs, &(xi[0])); + T1I = VSUB(T1G, T1H); + TaM = VADD(T1G, T1H); + T1J = LD(&(xi[WS(is, 110)]), ivs, &(xi[0])); + T1K = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + T1L = VSUB(T1J, T1K); + TaN = VADD(T1J, T1K); + } + T1M = VADD(T1I, T1L); + TaO = VADD(TaM, TaN); + T27 = VSUB(T1L, T1I); + { + V T1Q, TaT, T1T, TaU; + { + V T1O, T1P, T1R, T1S; + T1O = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T1P = LD(&(xi[WS(is, 70)]), ivs, &(xi[0])); + T1Q = VSUB(T1O, T1P); + TaT = VADD(T1O, T1P); + T1R = LD(&(xi[WS(is, 102)]), ivs, &(xi[0])); + T1S = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T1T = VSUB(T1R, T1S); + TaU = VADD(T1S, T1R); + } + T1U = VFMA(LDK(KP414213562), T1T, T1Q); + Tew = VSUB(TaT, TaU); + T29 = VFNMS(LDK(KP414213562), T1Q, T1T); + TaV = VADD(TaT, TaU); + } + { + V T1X, TaQ, T20, TaR; + { + V T1V, T1W, T1Y, T1Z; + T1V = LD(&(xi[WS(is, 118)]), ivs, &(xi[0])); + T1W = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + T1X = VSUB(T1V, T1W); + TaQ = VADD(T1V, T1W); + T1Y = LD(&(xi[WS(is, 86)]), ivs, &(xi[0])); + T1Z = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T20 = VSUB(T1Y, T1Z); + TaR = VADD(T1Z, T1Y); + } + T21 = VFNMS(LDK(KP414213562), T20, T1X); + Tex = VSUB(TaQ, TaR); + T2a = VFMA(LDK(KP414213562), T1X, T20); + TaS = VADD(TaQ, TaR); + } + Tdm = VADD(TaL, TaO); + Tdn = VADD(TaV, TaS); + TdH = VSUB(Tdm, Tdn); + Tev = VSUB(TaJ, TaK); + Tey = VADD(Tew, Tex); + Tez = VFMA(LDK(KP707106781), Tey, Tev); + Tgm = VFNMS(LDK(KP707106781), Tey, Tev); + { + V TeA, TeB, T1N, T22; + TeA = VSUB(TaN, TaM); + TeB = VSUB(Tex, Tew); + TeC = VFMA(LDK(KP707106781), TeB, TeA); + Tgl = VFNMS(LDK(KP707106781), TeB, TeA); + T1N = VFMA(LDK(KP707106781), T1M, T1F); + T22 = VADD(T1U, T21); + T23 = VFMA(LDK(KP923879532), T22, T1N); + T5Q = VFNMS(LDK(KP923879532), T22, T1N); + } + { + V T28, T2b, T7i, T7j; + T28 = VFMA(LDK(KP707106781), T27, T26); + T2b = VADD(T29, T2a); + T2c = VFMA(LDK(KP923879532), T2b, T28); + T5P = VFNMS(LDK(KP923879532), T2b, T28); + T7i = VFNMS(LDK(KP707106781), T27, T26); + T7j = VSUB(T21, T1U); + T7k = VFNMS(LDK(KP923879532), T7j, T7i); + T8Z = VFMA(LDK(KP923879532), T7j, T7i); + } + { + V TaP, TaW, T7f, T7g; + TaP = VSUB(TaL, TaO); + TaW = VSUB(TaS, TaV); + TaX = VFNMS(LDK(KP414213562), TaW, TaP); + Tcf = VFMA(LDK(KP414213562), TaP, TaW); + T7f = VFNMS(LDK(KP707106781), T1M, T1F); + T7g = VSUB(T2a, T29); + T7h = VFMA(LDK(KP923879532), T7g, T7f); + T90 = VFNMS(LDK(KP923879532), T7g, T7f); + } + } + { + V T2J, TeL, T2U, Tb9, T30, TeO, T3b, Tbg, T2Q, TeM, T2V, Tbc, T37, TeP, T3c; + V Tbj; + { + V T2H, T2I, Tb7, T2S, T2T, Tb8; + T2H = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T2I = LD(&(xi[WS(is, 69)]), ivs, &(xi[WS(is, 1)])); + Tb7 = VADD(T2H, T2I); + T2S = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T2T = LD(&(xi[WS(is, 101)]), ivs, &(xi[WS(is, 1)])); + Tb8 = VADD(T2S, T2T); + T2J = VSUB(T2H, T2I); + TeL = VSUB(Tb7, Tb8); + T2U = VSUB(T2S, T2T); + Tb9 = VADD(Tb7, Tb8); + } + { + V T2Y, T2Z, Tbe, T39, T3a, Tbf; + T2Y = LD(&(xi[WS(is, 125)]), ivs, &(xi[WS(is, 1)])); + T2Z = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + Tbe = VADD(T2Y, T2Z); + T39 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T3a = LD(&(xi[WS(is, 93)]), ivs, &(xi[WS(is, 1)])); + Tbf = VADD(T39, T3a); + T30 = VSUB(T2Y, T2Z); + TeO = VSUB(Tbe, Tbf); + T3b = VSUB(T39, T3a); + Tbg = VADD(Tbe, Tbf); + } + { + V T2M, Tba, T2P, Tbb; + { + V T2K, T2L, T2N, T2O; + T2K = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T2L = LD(&(xi[WS(is, 85)]), ivs, &(xi[WS(is, 1)])); + T2M = VSUB(T2K, T2L); + Tba = VADD(T2K, T2L); + T2N = LD(&(xi[WS(is, 117)]), ivs, &(xi[WS(is, 1)])); + T2O = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T2P = VSUB(T2N, T2O); + Tbb = VADD(T2N, T2O); + } + T2Q = VADD(T2M, T2P); + TeM = VSUB(Tba, Tbb); + T2V = VSUB(T2M, T2P); + Tbc = VADD(Tba, Tbb); + } + { + V T33, Tbh, T36, Tbi; + { + V T31, T32, T34, T35; + T31 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T32 = LD(&(xi[WS(is, 77)]), ivs, &(xi[WS(is, 1)])); + T33 = VSUB(T31, T32); + Tbh = VADD(T31, T32); + T34 = LD(&(xi[WS(is, 109)]), ivs, &(xi[WS(is, 1)])); + T35 = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T36 = VSUB(T34, T35); + Tbi = VADD(T34, T35); + } + T37 = VADD(T33, T36); + TeP = VSUB(Tbh, Tbi); + T3c = VSUB(T33, T36); + Tbj = VADD(Tbh, Tbi); + } + { + V Tbd, Tbk, TeN, TeQ; + Tbd = VSUB(Tb9, Tbc); + Tbk = VSUB(Tbg, Tbj); + Tbl = VADD(Tbd, Tbk); + Tbu = VSUB(Tbd, Tbk); + { + V Td9, Tda, TeW, TeX; + Td9 = VADD(Tb9, Tbc); + Tda = VADD(Tbg, Tbj); + Tdb = VADD(Td9, Tda); + TdL = VSUB(Td9, Tda); + TeW = VFMA(LDK(KP414213562), TeL, TeM); + TeX = VFNMS(LDK(KP414213562), TeO, TeP); + TeY = VADD(TeW, TeX); + Tgr = VSUB(TeW, TeX); + } + TeN = VFNMS(LDK(KP414213562), TeM, TeL); + TeQ = VFMA(LDK(KP414213562), TeP, TeO); + TeR = VADD(TeN, TeQ); + Tgu = VSUB(TeN, TeQ); + { + V T7t, T7C, T7w, T7D; + { + V T7r, T7s, T7u, T7v; + T7r = VFNMS(LDK(KP707106781), T2Q, T2J); + T7s = VFNMS(LDK(KP707106781), T2V, T2U); + T7t = VFMA(LDK(KP668178637), T7s, T7r); + T7C = VFNMS(LDK(KP668178637), T7r, T7s); + T7u = VFNMS(LDK(KP707106781), T37, T30); + T7v = VFNMS(LDK(KP707106781), T3c, T3b); + T7w = VFNMS(LDK(KP668178637), T7v, T7u); + T7D = VFMA(LDK(KP668178637), T7u, T7v); + } + T7x = VADD(T7t, T7w); + T98 = VSUB(T7t, T7w); + T7E = VADD(T7C, T7D); + T95 = VSUB(T7D, T7C); + } + { + V T2X, T3q, T3e, T3r; + { + V T2R, T2W, T38, T3d; + T2R = VFMA(LDK(KP707106781), T2Q, T2J); + T2W = VFMA(LDK(KP707106781), T2V, T2U); + T2X = VFNMS(LDK(KP198912367), T2W, T2R); + T3q = VFMA(LDK(KP198912367), T2R, T2W); + T38 = VFMA(LDK(KP707106781), T37, T30); + T3d = VFMA(LDK(KP707106781), T3c, T3b); + T3e = VFMA(LDK(KP198912367), T3d, T38); + T3r = VFNMS(LDK(KP198912367), T38, T3d); + } + T3f = VADD(T2X, T3e); + T5Y = VSUB(T2X, T3e); + T3s = VADD(T3q, T3r); + T5V = VSUB(T3q, T3r); + } + } + } + { + V T3Y, Tf6, T49, TbG, T4f, Tf9, T4q, TbN, T45, Tf7, T4a, TbJ, T4m, Tfa, T4r; + V TbQ; + { + V T3W, T3X, TbE, T47, T48, TbF; + T3W = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3X = LD(&(xi[WS(is, 67)]), ivs, &(xi[WS(is, 1)])); + TbE = VADD(T3W, T3X); + T47 = LD(&(xi[WS(is, 99)]), ivs, &(xi[WS(is, 1)])); + T48 = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + TbF = VADD(T48, T47); + T3Y = VSUB(T3W, T3X); + Tf6 = VSUB(TbE, TbF); + T49 = VSUB(T47, T48); + TbG = VADD(TbE, TbF); + } + { + V T4d, T4e, TbL, T4o, T4p, TbM; + T4d = LD(&(xi[WS(is, 123)]), ivs, &(xi[WS(is, 1)])); + T4e = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + TbL = VADD(T4d, T4e); + T4o = LD(&(xi[WS(is, 91)]), ivs, &(xi[WS(is, 1)])); + T4p = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TbM = VADD(T4p, T4o); + T4f = VSUB(T4d, T4e); + Tf9 = VSUB(TbL, TbM); + T4q = VSUB(T4o, T4p); + TbN = VADD(TbL, TbM); + } + { + V T41, TbH, T44, TbI; + { + V T3Z, T40, T42, T43; + T3Z = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T40 = LD(&(xi[WS(is, 83)]), ivs, &(xi[WS(is, 1)])); + T41 = VSUB(T3Z, T40); + TbH = VADD(T3Z, T40); + T42 = LD(&(xi[WS(is, 115)]), ivs, &(xi[WS(is, 1)])); + T43 = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T44 = VSUB(T42, T43); + TbI = VADD(T42, T43); + } + T45 = VADD(T41, T44); + Tf7 = VSUB(TbI, TbH); + T4a = VSUB(T44, T41); + TbJ = VADD(TbH, TbI); + } + { + V T4i, TbO, T4l, TbP; + { + V T4g, T4h, T4j, T4k; + T4g = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T4h = LD(&(xi[WS(is, 75)]), ivs, &(xi[WS(is, 1)])); + T4i = VSUB(T4g, T4h); + TbO = VADD(T4g, T4h); + T4j = LD(&(xi[WS(is, 107)]), ivs, &(xi[WS(is, 1)])); + T4k = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T4l = VSUB(T4j, T4k); + TbP = VADD(T4j, T4k); + } + T4m = VADD(T4i, T4l); + Tfa = VSUB(TbP, TbO); + T4r = VSUB(T4l, T4i); + TbQ = VADD(TbO, TbP); + } + { + V TbK, TbR, Tf8, Tfb; + TbK = VSUB(TbG, TbJ); + TbR = VSUB(TbN, TbQ); + TbS = VADD(TbK, TbR); + Tc1 = VSUB(TbR, TbK); + { + V Tdg, Tdh, Tfh, Tfi; + Tdg = VADD(TbG, TbJ); + Tdh = VADD(TbN, TbQ); + Tdi = VADD(Tdg, Tdh); + TdO = VSUB(Tdh, Tdg); + Tfh = VFNMS(LDK(KP414213562), Tf6, Tf7); + Tfi = VFMA(LDK(KP414213562), Tf9, Tfa); + Tfj = VADD(Tfh, Tfi); + Tgy = VSUB(Tfi, Tfh); + } + Tf8 = VFMA(LDK(KP414213562), Tf7, Tf6); + Tfb = VFNMS(LDK(KP414213562), Tfa, Tf9); + Tfc = VADD(Tf8, Tfb); + TgB = VSUB(Tfb, Tf8); + { + V T7M, T7V, T7P, T7W; + { + V T7K, T7L, T7N, T7O; + T7K = VFNMS(LDK(KP707106781), T45, T3Y); + T7L = VFNMS(LDK(KP707106781), T4a, T49); + T7M = VFNMS(LDK(KP668178637), T7L, T7K); + T7V = VFMA(LDK(KP668178637), T7K, T7L); + T7N = VFNMS(LDK(KP707106781), T4m, T4f); + T7O = VFNMS(LDK(KP707106781), T4r, T4q); + T7P = VFMA(LDK(KP668178637), T7O, T7N); + T7W = VFNMS(LDK(KP668178637), T7N, T7O); + } + T7Q = VADD(T7M, T7P); + T9f = VSUB(T7P, T7M); + T7X = VADD(T7V, T7W); + T9c = VSUB(T7V, T7W); + } + { + V T4c, T4F, T4t, T4G; + { + V T46, T4b, T4n, T4s; + T46 = VFMA(LDK(KP707106781), T45, T3Y); + T4b = VFMA(LDK(KP707106781), T4a, T49); + T4c = VFMA(LDK(KP198912367), T4b, T46); + T4F = VFNMS(LDK(KP198912367), T46, T4b); + T4n = VFMA(LDK(KP707106781), T4m, T4f); + T4s = VFMA(LDK(KP707106781), T4r, T4q); + T4t = VFNMS(LDK(KP198912367), T4s, T4n); + T4G = VFMA(LDK(KP198912367), T4n, T4s); + } + T4u = VADD(T4c, T4t); + T65 = VSUB(T4t, T4c); + T4H = VADD(T4F, T4G); + T62 = VSUB(T4G, T4F); + } + } + } + { + V Td5, Tdx, TdC, TdE, Tdk, Tdt, Tds, Tdy, Tdz, TdD; + { + V Td1, Td4, TdA, TdB; + Td1 = VADD(TcZ, Td0); + Td4 = VADD(Td2, Td3); + Td5 = VSUB(Td1, Td4); + Tdx = VADD(Td1, Td4); + TdA = VADD(Td8, Tdb); + TdB = VADD(Tdf, Tdi); + TdC = VADD(TdA, TdB); + TdE = VSUB(TdB, TdA); + } + { + V Tdc, Tdj, Tdo, Tdr; + Tdc = VSUB(Td8, Tdb); + Tdj = VSUB(Tdf, Tdi); + Tdk = VADD(Tdc, Tdj); + Tdt = VSUB(Tdj, Tdc); + Tdo = VADD(Tdm, Tdn); + Tdr = VADD(Tdp, Tdq); + Tds = VSUB(Tdo, Tdr); + Tdy = VADD(Tdr, Tdo); + } + Tdz = VADD(Tdx, Tdy); + ST(&(xo[WS(os, 64)]), VSUB(Tdz, TdC), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tdz, TdC), ovs, &(xo[0])); + TdD = VSUB(Tdx, Tdy); + ST(&(xo[WS(os, 96)]), VFNMSI(TdE, TdD), ovs, &(xo[0])); + ST(&(xo[WS(os, 32)]), VFMAI(TdE, TdD), ovs, &(xo[0])); + { + V Tdl, Tdu, Tdv, Tdw; + Tdl = VFNMS(LDK(KP707106781), Tdk, Td5); + Tdu = VFNMS(LDK(KP707106781), Tdt, Tds); + ST(&(xo[WS(os, 48)]), VFNMSI(Tdu, Tdl), ovs, &(xo[0])); + ST(&(xo[WS(os, 80)]), VFMAI(Tdu, Tdl), ovs, &(xo[0])); + Tdv = VFMA(LDK(KP707106781), Tdk, Td5); + Tdw = VFMA(LDK(KP707106781), Tdt, Tds); + ST(&(xo[WS(os, 112)]), VFNMSI(Tdw, Tdv), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VFMAI(Tdw, Tdv), ovs, &(xo[0])); + } + } + { + V TdJ, Te1, TdX, Te2, TdQ, Te5, TdU, Te4; + { + V TdF, TdI, TdV, TdW; + TdF = VSUB(TcZ, Td0); + TdI = VADD(TdG, TdH); + TdJ = VFMA(LDK(KP707106781), TdI, TdF); + Te1 = VFNMS(LDK(KP707106781), TdI, TdF); + TdV = VFMA(LDK(KP414213562), TdN, TdO); + TdW = VFMA(LDK(KP414213562), TdK, TdL); + TdX = VSUB(TdV, TdW); + Te2 = VADD(TdW, TdV); + } + { + V TdM, TdP, TdS, TdT; + TdM = VFNMS(LDK(KP414213562), TdL, TdK); + TdP = VFNMS(LDK(KP414213562), TdO, TdN); + TdQ = VADD(TdM, TdP); + Te5 = VSUB(TdP, TdM); + TdS = VSUB(Td3, Td2); + TdT = VSUB(TdH, TdG); + TdU = VFMA(LDK(KP707106781), TdT, TdS); + Te4 = VFNMS(LDK(KP707106781), TdT, TdS); + } + { + V TdR, TdY, Te7, Te8; + TdR = VFNMS(LDK(KP923879532), TdQ, TdJ); + TdY = VFNMS(LDK(KP923879532), TdX, TdU); + ST(&(xo[WS(os, 56)]), VFNMSI(TdY, TdR), ovs, &(xo[0])); + ST(&(xo[WS(os, 72)]), VFMAI(TdY, TdR), ovs, &(xo[0])); + Te7 = VFMA(LDK(KP923879532), Te2, Te1); + Te8 = VFNMS(LDK(KP923879532), Te5, Te4); + ST(&(xo[WS(os, 24)]), VFNMSI(Te8, Te7), ovs, &(xo[0])); + ST(&(xo[WS(os, 104)]), VFMAI(Te8, Te7), ovs, &(xo[0])); + } + { + V TdZ, Te0, Te3, Te6; + TdZ = VFMA(LDK(KP923879532), TdQ, TdJ); + Te0 = VFMA(LDK(KP923879532), TdX, TdU); + ST(&(xo[WS(os, 120)]), VFNMSI(Te0, TdZ), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFMAI(Te0, TdZ), ovs, &(xo[0])); + Te3 = VFNMS(LDK(KP923879532), Te2, Te1); + Te6 = VFMA(LDK(KP923879532), Te5, Te4); + ST(&(xo[WS(os, 40)]), VFMAI(Te6, Te3), ovs, &(xo[0])); + ST(&(xo[WS(os, 88)]), VFNMSI(Te6, Te3), ovs, &(xo[0])); + } + } + { + V TaZ, Tcp, Tci, Tcs, Tc4, Tct, Tcl, Tcq; + { + V Tat, TaY, Tce, Tch; + Tat = VFMA(LDK(KP707106781), Tas, Tad); + TaY = VADD(TaI, TaX); + TaZ = VFMA(LDK(KP923879532), TaY, Tat); + Tcp = VFNMS(LDK(KP923879532), TaY, Tat); + Tce = VFMA(LDK(KP707106781), Tcd, Tcc); + Tch = VSUB(Tcf, Tcg); + Tci = VFMA(LDK(KP923879532), Tch, Tce); + Tcs = VFNMS(LDK(KP923879532), Tch, Tce); + { + V Tbw, Tck, Tc3, Tcj; + { + V Tbm, Tbv, TbT, Tc2; + Tbm = VFMA(LDK(KP707106781), Tbl, Tb6); + Tbv = VFMA(LDK(KP707106781), Tbu, Tbt); + Tbw = VFNMS(LDK(KP198912367), Tbv, Tbm); + Tck = VFMA(LDK(KP198912367), Tbm, Tbv); + TbT = VFMA(LDK(KP707106781), TbS, TbD); + Tc2 = VFMA(LDK(KP707106781), Tc1, Tc0); + Tc3 = VFNMS(LDK(KP198912367), Tc2, TbT); + Tcj = VFMA(LDK(KP198912367), TbT, Tc2); + } + Tc4 = VADD(Tbw, Tc3); + Tct = VSUB(Tc3, Tbw); + Tcl = VSUB(Tcj, Tck); + Tcq = VADD(Tck, Tcj); + } + } + { + V Tc5, Tcm, Tcv, Tcw; + Tc5 = VFNMS(LDK(KP980785280), Tc4, TaZ); + Tcm = VFNMS(LDK(KP980785280), Tcl, Tci); + ST(&(xo[WS(os, 60)]), VFNMSI(Tcm, Tc5), ovs, &(xo[0])); + ST(&(xo[WS(os, 68)]), VFMAI(Tcm, Tc5), ovs, &(xo[0])); + Tcv = VFMA(LDK(KP980785280), Tcq, Tcp); + Tcw = VFNMS(LDK(KP980785280), Tct, Tcs); + ST(&(xo[WS(os, 28)]), VFNMSI(Tcw, Tcv), ovs, &(xo[0])); + ST(&(xo[WS(os, 100)]), VFMAI(Tcw, Tcv), ovs, &(xo[0])); + } + { + V Tcn, Tco, Tcr, Tcu; + Tcn = VFMA(LDK(KP980785280), Tc4, TaZ); + Tco = VFMA(LDK(KP980785280), Tcl, Tci); + ST(&(xo[WS(os, 124)]), VFNMSI(Tco, Tcn), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(Tco, Tcn), ovs, &(xo[0])); + Tcr = VFNMS(LDK(KP980785280), Tcq, Tcp); + Tcu = VFMA(LDK(KP980785280), Tct, Tcs); + ST(&(xo[WS(os, 36)]), VFMAI(Tcu, Tcr), ovs, &(xo[0])); + ST(&(xo[WS(os, 92)]), VFNMSI(Tcu, Tcr), ovs, &(xo[0])); + } + } + { + V Tcz, TcR, TcK, TcU, TcG, TcV, TcN, TcS; + { + V Tcx, Tcy, TcI, TcJ; + Tcx = VFNMS(LDK(KP707106781), Tas, Tad); + Tcy = VADD(Tcg, Tcf); + Tcz = VFMA(LDK(KP923879532), Tcy, Tcx); + TcR = VFNMS(LDK(KP923879532), Tcy, Tcx); + TcI = VFNMS(LDK(KP707106781), Tcd, Tcc); + TcJ = VSUB(TaX, TaI); + TcK = VFNMS(LDK(KP923879532), TcJ, TcI); + TcU = VFMA(LDK(KP923879532), TcJ, TcI); + { + V TcC, TcM, TcF, TcL; + { + V TcA, TcB, TcD, TcE; + TcA = VFNMS(LDK(KP707106781), Tbl, Tb6); + TcB = VFNMS(LDK(KP707106781), Tbu, Tbt); + TcC = VFMA(LDK(KP668178637), TcB, TcA); + TcM = VFNMS(LDK(KP668178637), TcA, TcB); + TcD = VFNMS(LDK(KP707106781), TbS, TbD); + TcE = VFNMS(LDK(KP707106781), Tc1, Tc0); + TcF = VFMA(LDK(KP668178637), TcE, TcD); + TcL = VFNMS(LDK(KP668178637), TcD, TcE); + } + TcG = VADD(TcC, TcF); + TcV = VSUB(TcF, TcC); + TcN = VSUB(TcL, TcM); + TcS = VADD(TcM, TcL); + } + } + { + V TcH, TcO, TcX, TcY; + TcH = VFNMS(LDK(KP831469612), TcG, Tcz); + TcO = VFNMS(LDK(KP831469612), TcN, TcK); + ST(&(xo[WS(os, 76)]), VFNMSI(TcO, TcH), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VFMAI(TcO, TcH), ovs, &(xo[0])); + TcX = VFNMS(LDK(KP831469612), TcS, TcR); + TcY = VFMA(LDK(KP831469612), TcV, TcU); + ST(&(xo[WS(os, 20)]), VFMAI(TcY, TcX), ovs, &(xo[0])); + ST(&(xo[WS(os, 108)]), VFNMSI(TcY, TcX), ovs, &(xo[0])); + } + { + V TcP, TcQ, TcT, TcW; + TcP = VFMA(LDK(KP831469612), TcG, Tcz); + TcQ = VFMA(LDK(KP831469612), TcN, TcK); + ST(&(xo[WS(os, 12)]), VFNMSI(TcQ, TcP), ovs, &(xo[0])); + ST(&(xo[WS(os, 116)]), VFMAI(TcQ, TcP), ovs, &(xo[0])); + TcT = VFMA(LDK(KP831469612), TcS, TcR); + TcW = VFNMS(LDK(KP831469612), TcV, TcU); + ST(&(xo[WS(os, 44)]), VFNMSI(TcW, TcT), ovs, &(xo[0])); + ST(&(xo[WS(os, 84)]), VFMAI(TcW, TcT), ovs, &(xo[0])); + } + } + { + V TeF, Tga, TfF, Tg0, Tfy, Tg7, TfI, TfP, Tfm, TfJ, TfB, TfG, TfW, Tgb, Tg3; + V Tg8; + { + V Tel, TfY, TeE, TfZ, Teu, TeD; + Tel = VFMA(LDK(KP923879532), Tek, Ted); + TfY = VFNMS(LDK(KP923879532), Tft, Tfq); + Teu = VFNMS(LDK(KP198912367), Tet, Teq); + TeD = VFNMS(LDK(KP198912367), TeC, Tez); + TeE = VADD(Teu, TeD); + TfZ = VSUB(TeD, Teu); + TeF = VFMA(LDK(KP980785280), TeE, Tel); + Tga = VFMA(LDK(KP980785280), TfZ, TfY); + TfF = VFNMS(LDK(KP980785280), TeE, Tel); + Tg0 = VFNMS(LDK(KP980785280), TfZ, TfY); + } + { + V Tfu, TfN, Tfx, TfO, Tfv, Tfw; + Tfu = VFMA(LDK(KP923879532), Tft, Tfq); + TfN = VFNMS(LDK(KP923879532), Tek, Ted); + Tfv = VFMA(LDK(KP198912367), Tez, TeC); + Tfw = VFMA(LDK(KP198912367), Teq, Tet); + Tfx = VSUB(Tfv, Tfw); + TfO = VADD(Tfw, Tfv); + Tfy = VFMA(LDK(KP980785280), Tfx, Tfu); + Tg7 = VFNMS(LDK(KP980785280), TfO, TfN); + TfI = VFNMS(LDK(KP980785280), Tfx, Tfu); + TfP = VFMA(LDK(KP980785280), TfO, TfN); + } + { + V Tf0, TfA, Tfl, Tfz; + { + V TeS, TeZ, Tfd, Tfk; + TeS = VFMA(LDK(KP923879532), TeR, TeK); + TeZ = VFMA(LDK(KP923879532), TeY, TeV); + Tf0 = VFNMS(LDK(KP098491403), TeZ, TeS); + TfA = VFMA(LDK(KP098491403), TeS, TeZ); + Tfd = VFMA(LDK(KP923879532), Tfc, Tf5); + Tfk = VFMA(LDK(KP923879532), Tfj, Tfg); + Tfl = VFNMS(LDK(KP098491403), Tfk, Tfd); + Tfz = VFMA(LDK(KP098491403), Tfd, Tfk); + } + Tfm = VADD(Tf0, Tfl); + TfJ = VSUB(Tfl, Tf0); + TfB = VSUB(Tfz, TfA); + TfG = VADD(TfA, Tfz); + } + { + V TfS, Tg2, TfV, Tg1; + { + V TfQ, TfR, TfT, TfU; + TfQ = VFNMS(LDK(KP923879532), TeR, TeK); + TfR = VFNMS(LDK(KP923879532), TeY, TeV); + TfS = VFMA(LDK(KP820678790), TfR, TfQ); + Tg2 = VFNMS(LDK(KP820678790), TfQ, TfR); + TfT = VFNMS(LDK(KP923879532), Tfc, Tf5); + TfU = VFNMS(LDK(KP923879532), Tfj, Tfg); + TfV = VFMA(LDK(KP820678790), TfU, TfT); + Tg1 = VFNMS(LDK(KP820678790), TfT, TfU); + } + TfW = VADD(TfS, TfV); + Tgb = VSUB(TfV, TfS); + Tg3 = VSUB(Tg1, Tg2); + Tg8 = VADD(Tg2, Tg1); + } + { + V Tfn, TfC, Tg9, Tgc; + Tfn = VFNMS(LDK(KP995184726), Tfm, TeF); + TfC = VFNMS(LDK(KP995184726), TfB, Tfy); + ST(&(xo[WS(os, 62)]), VFNMSI(TfC, Tfn), ovs, &(xo[0])); + ST(&(xo[WS(os, 66)]), VFMAI(TfC, Tfn), ovs, &(xo[0])); + Tg9 = VFMA(LDK(KP773010453), Tg8, Tg7); + Tgc = VFNMS(LDK(KP773010453), Tgb, Tga); + ST(&(xo[WS(os, 46)]), VFNMSI(Tgc, Tg9), ovs, &(xo[0])); + ST(&(xo[WS(os, 82)]), VFMAI(Tgc, Tg9), ovs, &(xo[0])); + } + { + V Tgd, Tge, TfD, TfE; + Tgd = VFNMS(LDK(KP773010453), Tg8, Tg7); + Tge = VFMA(LDK(KP773010453), Tgb, Tga); + ST(&(xo[WS(os, 18)]), VFMAI(Tge, Tgd), ovs, &(xo[0])); + ST(&(xo[WS(os, 110)]), VFNMSI(Tge, Tgd), ovs, &(xo[0])); + TfD = VFMA(LDK(KP995184726), Tfm, TeF); + TfE = VFMA(LDK(KP995184726), TfB, Tfy); + ST(&(xo[WS(os, 126)]), VFNMSI(TfE, TfD), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(TfE, TfD), ovs, &(xo[0])); + } + { + V TfH, TfK, TfX, Tg4; + TfH = VFNMS(LDK(KP995184726), TfG, TfF); + TfK = VFMA(LDK(KP995184726), TfJ, TfI); + ST(&(xo[WS(os, 34)]), VFMAI(TfK, TfH), ovs, &(xo[0])); + ST(&(xo[WS(os, 94)]), VFNMSI(TfK, TfH), ovs, &(xo[0])); + TfX = VFNMS(LDK(KP773010453), TfW, TfP); + Tg4 = VFNMS(LDK(KP773010453), Tg3, Tg0); + ST(&(xo[WS(os, 78)]), VFNMSI(Tg4, TfX), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VFMAI(Tg4, TfX), ovs, &(xo[0])); + } + { + V Tg5, Tg6, TfL, TfM; + Tg5 = VFMA(LDK(KP773010453), TfW, TfP); + Tg6 = VFMA(LDK(KP773010453), Tg3, Tg0); + ST(&(xo[WS(os, 14)]), VFNMSI(Tg6, Tg5), ovs, &(xo[0])); + ST(&(xo[WS(os, 114)]), VFMAI(Tg6, Tg5), ovs, &(xo[0])); + TfL = VFMA(LDK(KP995184726), TfG, TfF); + TfM = VFNMS(LDK(KP995184726), TfJ, TfI); + ST(&(xo[WS(os, 30)]), VFNMSI(TfM, TfL), ovs, &(xo[0])); + ST(&(xo[WS(os, 98)]), VFMAI(TfM, TfL), ovs, &(xo[0])); + } + } + { + V Tgp, Tho, TgT, The, TgM, Thl, TgW, Th3, TgE, TgX, TgP, TgU, Tha, Thp, Thh; + V Thm; + { + V Tgh, Thc, Tgo, Thd, Tgk, Tgn; + Tgh = VFNMS(LDK(KP923879532), Tgg, Tgf); + Thc = VFNMS(LDK(KP923879532), TgH, TgG); + Tgk = VFNMS(LDK(KP668178637), Tgj, Tgi); + Tgn = VFNMS(LDK(KP668178637), Tgm, Tgl); + Tgo = VADD(Tgk, Tgn); + Thd = VSUB(Tgn, Tgk); + Tgp = VFNMS(LDK(KP831469612), Tgo, Tgh); + Tho = VFNMS(LDK(KP831469612), Thd, Thc); + TgT = VFMA(LDK(KP831469612), Tgo, Tgh); + The = VFMA(LDK(KP831469612), Thd, Thc); + } + { + V TgI, Th1, TgL, Th2, TgJ, TgK; + TgI = VFMA(LDK(KP923879532), TgH, TgG); + Th1 = VFMA(LDK(KP923879532), Tgg, Tgf); + TgJ = VFMA(LDK(KP668178637), Tgl, Tgm); + TgK = VFMA(LDK(KP668178637), Tgi, Tgj); + TgL = VSUB(TgJ, TgK); + Th2 = VADD(TgK, TgJ); + TgM = VFMA(LDK(KP831469612), TgL, TgI); + Thl = VFNMS(LDK(KP831469612), Th2, Th1); + TgW = VFNMS(LDK(KP831469612), TgL, TgI); + Th3 = VFMA(LDK(KP831469612), Th2, Th1); + } + { + V Tgw, TgO, TgD, TgN; + { + V Tgs, Tgv, Tgz, TgC; + Tgs = VFNMS(LDK(KP923879532), Tgr, Tgq); + Tgv = VFMA(LDK(KP923879532), Tgu, Tgt); + Tgw = VFNMS(LDK(KP534511135), Tgv, Tgs); + TgO = VFMA(LDK(KP534511135), Tgs, Tgv); + Tgz = VFNMS(LDK(KP923879532), Tgy, Tgx); + TgC = VFMA(LDK(KP923879532), TgB, TgA); + TgD = VFNMS(LDK(KP534511135), TgC, Tgz); + TgN = VFMA(LDK(KP534511135), Tgz, TgC); + } + TgE = VADD(Tgw, TgD); + TgX = VSUB(TgD, Tgw); + TgP = VSUB(TgN, TgO); + TgU = VADD(TgO, TgN); + } + { + V Th6, Thg, Th9, Thf; + { + V Th4, Th5, Th7, Th8; + Th4 = VFMA(LDK(KP923879532), Tgr, Tgq); + Th5 = VFNMS(LDK(KP923879532), Tgu, Tgt); + Th6 = VFMA(LDK(KP303346683), Th5, Th4); + Thg = VFNMS(LDK(KP303346683), Th4, Th5); + Th7 = VFMA(LDK(KP923879532), Tgy, Tgx); + Th8 = VFNMS(LDK(KP923879532), TgB, TgA); + Th9 = VFMA(LDK(KP303346683), Th8, Th7); + Thf = VFNMS(LDK(KP303346683), Th7, Th8); + } + Tha = VADD(Th6, Th9); + Thp = VSUB(Th9, Th6); + Thh = VSUB(Thf, Thg); + Thm = VADD(Thg, Thf); + } + { + V TgF, TgQ, Thn, Thq; + TgF = VFNMS(LDK(KP881921264), TgE, Tgp); + TgQ = VFNMS(LDK(KP881921264), TgP, TgM); + ST(&(xo[WS(os, 54)]), VFNMSI(TgQ, TgF), ovs, &(xo[0])); + ST(&(xo[WS(os, 74)]), VFMAI(TgQ, TgF), ovs, &(xo[0])); + Thn = VFMA(LDK(KP956940335), Thm, Thl); + Thq = VFNMS(LDK(KP956940335), Thp, Tho); + ST(&(xo[WS(os, 38)]), VFNMSI(Thq, Thn), ovs, &(xo[0])); + ST(&(xo[WS(os, 90)]), VFMAI(Thq, Thn), ovs, &(xo[0])); + } + { + V Thr, Ths, TgR, TgS; + Thr = VFNMS(LDK(KP956940335), Thm, Thl); + Ths = VFMA(LDK(KP956940335), Thp, Tho); + ST(&(xo[WS(os, 26)]), VFMAI(Ths, Thr), ovs, &(xo[0])); + ST(&(xo[WS(os, 102)]), VFNMSI(Ths, Thr), ovs, &(xo[0])); + TgR = VFMA(LDK(KP881921264), TgE, Tgp); + TgS = VFMA(LDK(KP881921264), TgP, TgM); + ST(&(xo[WS(os, 118)]), VFNMSI(TgS, TgR), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VFMAI(TgS, TgR), ovs, &(xo[0])); + } + { + V TgV, TgY, Thb, Thi; + TgV = VFNMS(LDK(KP881921264), TgU, TgT); + TgY = VFMA(LDK(KP881921264), TgX, TgW); + ST(&(xo[WS(os, 42)]), VFMAI(TgY, TgV), ovs, &(xo[0])); + ST(&(xo[WS(os, 86)]), VFNMSI(TgY, TgV), ovs, &(xo[0])); + Thb = VFNMS(LDK(KP956940335), Tha, Th3); + Thi = VFNMS(LDK(KP956940335), Thh, The); + ST(&(xo[WS(os, 70)]), VFNMSI(Thi, Thb), ovs, &(xo[0])); + ST(&(xo[WS(os, 58)]), VFMAI(Thi, Thb), ovs, &(xo[0])); + } + { + V Thj, Thk, TgZ, Th0; + Thj = VFMA(LDK(KP956940335), Tha, Th3); + Thk = VFMA(LDK(KP956940335), Thh, The); + ST(&(xo[WS(os, 6)]), VFNMSI(Thk, Thj), ovs, &(xo[0])); + ST(&(xo[WS(os, 122)]), VFMAI(Thk, Thj), ovs, &(xo[0])); + TgZ = VFMA(LDK(KP881921264), TgU, TgT); + Th0 = VFNMS(LDK(KP881921264), TgX, TgW); + ST(&(xo[WS(os, 22)]), VFNMSI(Th0, TgZ), ovs, &(xo[0])); + ST(&(xo[WS(os, 106)]), VFMAI(Th0, TgZ), ovs, &(xo[0])); + } + } + { + V T80, T8n, T8f, T8k, T8A, T8P, T8H, T8M, T7n, T8L, T8O, T8c, T8j, T8t, T8E; + V T8m; + { + V T7G, T8d, T7Z, T8e; + { + V T7y, T7F, T7R, T7Y; + T7y = VFMA(LDK(KP831469612), T7x, T7q); + T7F = VFMA(LDK(KP831469612), T7E, T7B); + T7G = VFMA(LDK(KP148335987), T7F, T7y); + T8d = VFNMS(LDK(KP148335987), T7y, T7F); + T7R = VFMA(LDK(KP831469612), T7Q, T7J); + T7Y = VFMA(LDK(KP831469612), T7X, T7U); + T7Z = VFMA(LDK(KP148335987), T7Y, T7R); + T8e = VFNMS(LDK(KP148335987), T7R, T7Y); + } + T80 = VADD(T7G, T7Z); + T8n = VSUB(T7Z, T7G); + T8f = VSUB(T8d, T8e); + T8k = VADD(T8d, T8e); + } + { + V T8w, T8F, T8z, T8G; + { + V T8u, T8v, T8x, T8y; + T8u = VFNMS(LDK(KP831469612), T7x, T7q); + T8v = VFNMS(LDK(KP831469612), T7E, T7B); + T8w = VFNMS(LDK(KP741650546), T8v, T8u); + T8F = VFMA(LDK(KP741650546), T8u, T8v); + T8x = VFNMS(LDK(KP831469612), T7Q, T7J); + T8y = VFNMS(LDK(KP831469612), T7X, T7U); + T8z = VFNMS(LDK(KP741650546), T8y, T8x); + T8G = VFMA(LDK(KP741650546), T8x, T8y); + } + T8A = VADD(T8w, T8z); + T8P = VSUB(T8z, T8w); + T8H = VSUB(T8F, T8G); + T8M = VADD(T8F, T8G); + } + { + V T77, T8r, T88, T8C, T7m, T8D, T8b, T8s, T76, T87; + T76 = VADD(T72, T75); + T77 = VFMA(LDK(KP831469612), T76, T6Z); + T8r = VFNMS(LDK(KP831469612), T76, T6Z); + T87 = VSUB(T85, T86); + T88 = VFMA(LDK(KP831469612), T87, T84); + T8C = VFNMS(LDK(KP831469612), T87, T84); + { + V T7e, T7l, T89, T8a; + T7e = VFMA(LDK(KP303346683), T7d, T7a); + T7l = VFMA(LDK(KP303346683), T7k, T7h); + T7m = VADD(T7e, T7l); + T8D = VSUB(T7l, T7e); + T89 = VFNMS(LDK(KP303346683), T7a, T7d); + T8a = VFNMS(LDK(KP303346683), T7h, T7k); + T8b = VSUB(T89, T8a); + T8s = VADD(T89, T8a); + } + T7n = VFMA(LDK(KP956940335), T7m, T77); + T8L = VFMA(LDK(KP956940335), T8s, T8r); + T8O = VFMA(LDK(KP956940335), T8D, T8C); + T8c = VFMA(LDK(KP956940335), T8b, T88); + T8j = VFNMS(LDK(KP956940335), T7m, T77); + T8t = VFNMS(LDK(KP956940335), T8s, T8r); + T8E = VFNMS(LDK(KP956940335), T8D, T8C); + T8m = VFNMS(LDK(KP956940335), T8b, T88); + } + { + V T81, T8g, T8N, T8Q; + T81 = VFNMS(LDK(KP989176509), T80, T7n); + T8g = VFNMS(LDK(KP989176509), T8f, T8c); + ST(&(xo[WS(os, 61)]), VFNMSI(T8g, T81), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 67)]), VFMAI(T8g, T81), ovs, &(xo[WS(os, 1)])); + T8N = VFNMS(LDK(KP803207531), T8M, T8L); + T8Q = VFNMS(LDK(KP803207531), T8P, T8O); + ST(&(xo[WS(os, 45)]), VFNMSI(T8Q, T8N), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 83)]), VFMAI(T8Q, T8N), ovs, &(xo[WS(os, 1)])); + } + { + V T8R, T8S, T8h, T8i; + T8R = VFMA(LDK(KP803207531), T8M, T8L); + T8S = VFMA(LDK(KP803207531), T8P, T8O); + ST(&(xo[WS(os, 19)]), VFMAI(T8S, T8R), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 109)]), VFNMSI(T8S, T8R), ovs, &(xo[WS(os, 1)])); + T8h = VFMA(LDK(KP989176509), T80, T7n); + T8i = VFMA(LDK(KP989176509), T8f, T8c); + ST(&(xo[WS(os, 125)]), VFNMSI(T8i, T8h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(T8i, T8h), ovs, &(xo[WS(os, 1)])); + } + { + V T8l, T8o, T8B, T8I; + T8l = VFMA(LDK(KP989176509), T8k, T8j); + T8o = VFMA(LDK(KP989176509), T8n, T8m); + ST(&(xo[WS(os, 35)]), VFMAI(T8o, T8l), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 93)]), VFNMSI(T8o, T8l), ovs, &(xo[WS(os, 1)])); + T8B = VFNMS(LDK(KP803207531), T8A, T8t); + T8I = VFNMS(LDK(KP803207531), T8H, T8E); + ST(&(xo[WS(os, 77)]), VFNMSI(T8I, T8B), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 51)]), VFMAI(T8I, T8B), ovs, &(xo[WS(os, 1)])); + } + { + V T8J, T8K, T8p, T8q; + T8J = VFMA(LDK(KP803207531), T8A, T8t); + T8K = VFMA(LDK(KP803207531), T8H, T8E); + ST(&(xo[WS(os, 13)]), VFNMSI(T8K, T8J), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 115)]), VFMAI(T8K, T8J), ovs, &(xo[WS(os, 1)])); + T8p = VFNMS(LDK(KP989176509), T8k, T8j); + T8q = VFNMS(LDK(KP989176509), T8n, T8m); + ST(&(xo[WS(os, 29)]), VFNMSI(T8q, T8p), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 99)]), VFMAI(T8q, T8p), ovs, &(xo[WS(os, 1)])); + } + } + { + V T4K, T5d, T55, T5a, T5q, T5F, T5x, T5C, T2f, T5B, T5E, T52, T59, T5j, T5u; + V T5c; + { + V T3u, T53, T4J, T54; + { + V T3g, T3t, T4v, T4I; + T3g = VFMA(LDK(KP980785280), T3f, T2G); + T3t = VFMA(LDK(KP980785280), T3s, T3p); + T3u = VFNMS(LDK(KP049126849), T3t, T3g); + T53 = VFMA(LDK(KP049126849), T3g, T3t); + T4v = VFMA(LDK(KP980785280), T4u, T3V); + T4I = VFMA(LDK(KP980785280), T4H, T4E); + T4J = VFNMS(LDK(KP049126849), T4I, T4v); + T54 = VFMA(LDK(KP049126849), T4v, T4I); + } + T4K = VADD(T3u, T4J); + T5d = VSUB(T4J, T3u); + T55 = VSUB(T53, T54); + T5a = VADD(T53, T54); + } + { + V T5m, T5v, T5p, T5w; + { + V T5k, T5l, T5n, T5o; + T5k = VFNMS(LDK(KP980785280), T3f, T2G); + T5l = VFNMS(LDK(KP980785280), T3s, T3p); + T5m = VFMA(LDK(KP906347169), T5l, T5k); + T5v = VFNMS(LDK(KP906347169), T5k, T5l); + T5n = VFNMS(LDK(KP980785280), T4u, T3V); + T5o = VFNMS(LDK(KP980785280), T4H, T4E); + T5p = VFMA(LDK(KP906347169), T5o, T5n); + T5w = VFNMS(LDK(KP906347169), T5n, T5o); + } + T5q = VADD(T5m, T5p); + T5F = VSUB(T5p, T5m); + T5x = VSUB(T5v, T5w); + T5C = VADD(T5v, T5w); + } + { + V T11, T5h, T4Y, T5s, T2e, T5t, T51, T5i, T10, T4X; + T10 = VADD(TI, TZ); + T11 = VFMA(LDK(KP980785280), T10, Tr); + T5h = VFNMS(LDK(KP980785280), T10, Tr); + T4X = VSUB(T4V, T4W); + T4Y = VFMA(LDK(KP980785280), T4X, T4U); + T5s = VFNMS(LDK(KP980785280), T4X, T4U); + { + V T1C, T2d, T4Z, T50; + T1C = VFNMS(LDK(KP098491403), T1B, T1s); + T2d = VFNMS(LDK(KP098491403), T2c, T23); + T2e = VADD(T1C, T2d); + T5t = VSUB(T2d, T1C); + T4Z = VFMA(LDK(KP098491403), T1s, T1B); + T50 = VFMA(LDK(KP098491403), T23, T2c); + T51 = VSUB(T4Z, T50); + T5i = VADD(T4Z, T50); + } + T2f = VFMA(LDK(KP995184726), T2e, T11); + T5B = VFNMS(LDK(KP995184726), T5i, T5h); + T5E = VFNMS(LDK(KP995184726), T5t, T5s); + T52 = VFMA(LDK(KP995184726), T51, T4Y); + T59 = VFNMS(LDK(KP995184726), T2e, T11); + T5j = VFMA(LDK(KP995184726), T5i, T5h); + T5u = VFMA(LDK(KP995184726), T5t, T5s); + T5c = VFNMS(LDK(KP995184726), T51, T4Y); + } + { + V T4L, T56, T5D, T5G; + T4L = VFNMS(LDK(KP998795456), T4K, T2f); + T56 = VFNMS(LDK(KP998795456), T55, T52); + ST(&(xo[WS(os, 65)]), VFNMSI(T56, T4L), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 63)]), VFMAI(T56, T4L), ovs, &(xo[WS(os, 1)])); + T5D = VFMA(LDK(KP740951125), T5C, T5B); + T5G = VFMA(LDK(KP740951125), T5F, T5E); + ST(&(xo[WS(os, 47)]), VFMAI(T5G, T5D), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 81)]), VFNMSI(T5G, T5D), ovs, &(xo[WS(os, 1)])); + } + { + V T5H, T5I, T57, T58; + T5H = VFNMS(LDK(KP740951125), T5C, T5B); + T5I = VFNMS(LDK(KP740951125), T5F, T5E); + ST(&(xo[WS(os, 17)]), VFNMSI(T5I, T5H), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 111)]), VFMAI(T5I, T5H), ovs, &(xo[WS(os, 1)])); + T57 = VFMA(LDK(KP998795456), T4K, T2f); + T58 = VFMA(LDK(KP998795456), T55, T52); + ST(&(xo[WS(os, 1)]), VFNMSI(T58, T57), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 127)]), VFMAI(T58, T57), ovs, &(xo[WS(os, 1)])); + } + { + V T5b, T5e, T5r, T5y; + T5b = VFNMS(LDK(KP998795456), T5a, T59); + T5e = VFNMS(LDK(KP998795456), T5d, T5c); + ST(&(xo[WS(os, 33)]), VFNMSI(T5e, T5b), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 95)]), VFMAI(T5e, T5b), ovs, &(xo[WS(os, 1)])); + T5r = VFNMS(LDK(KP740951125), T5q, T5j); + T5y = VFNMS(LDK(KP740951125), T5x, T5u); + ST(&(xo[WS(os, 49)]), VFNMSI(T5y, T5r), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 79)]), VFMAI(T5y, T5r), ovs, &(xo[WS(os, 1)])); + } + { + V T5z, T5A, T5f, T5g; + T5z = VFMA(LDK(KP740951125), T5q, T5j); + T5A = VFMA(LDK(KP740951125), T5x, T5u); + ST(&(xo[WS(os, 113)]), VFNMSI(T5A, T5z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VFMAI(T5A, T5z), ovs, &(xo[WS(os, 1)])); + T5f = VFMA(LDK(KP998795456), T5a, T59); + T5g = VFMA(LDK(KP998795456), T5d, T5c); + ST(&(xo[WS(os, 31)]), VFMAI(T5g, T5f), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 97)]), VFNMSI(T5g, T5f), ovs, &(xo[WS(os, 1)])); + } + } + { + V T9i, T9B, T9t, T9y, T9O, Ta3, T9V, Ta0, T93, T9Z, Ta2, T9q, T9x, T9H, T9S; + V T9A; + { + V T9a, T9r, T9h, T9s; + { + V T96, T99, T9d, T9g; + T96 = VFNMS(LDK(KP831469612), T95, T94); + T99 = VFNMS(LDK(KP831469612), T98, T97); + T9a = VFMA(LDK(KP599376933), T99, T96); + T9r = VFNMS(LDK(KP599376933), T96, T99); + T9d = VFNMS(LDK(KP831469612), T9c, T9b); + T9g = VFNMS(LDK(KP831469612), T9f, T9e); + T9h = VFMA(LDK(KP599376933), T9g, T9d); + T9s = VFNMS(LDK(KP599376933), T9d, T9g); + } + T9i = VADD(T9a, T9h); + T9B = VSUB(T9h, T9a); + T9t = VSUB(T9r, T9s); + T9y = VADD(T9r, T9s); + } + { + V T9K, T9T, T9N, T9U; + { + V T9I, T9J, T9L, T9M; + T9I = VFMA(LDK(KP831469612), T95, T94); + T9J = VFMA(LDK(KP831469612), T98, T97); + T9K = VFNMS(LDK(KP250486960), T9J, T9I); + T9T = VFMA(LDK(KP250486960), T9I, T9J); + T9L = VFMA(LDK(KP831469612), T9c, T9b); + T9M = VFMA(LDK(KP831469612), T9f, T9e); + T9N = VFNMS(LDK(KP250486960), T9M, T9L); + T9U = VFMA(LDK(KP250486960), T9L, T9M); + } + T9O = VADD(T9K, T9N); + Ta3 = VSUB(T9N, T9K); + T9V = VSUB(T9T, T9U); + Ta0 = VADD(T9T, T9U); + } + { + V T8V, T9F, T9m, T9Q, T92, T9R, T9p, T9G, T8U, T9l; + T8U = VADD(T85, T86); + T8V = VFMA(LDK(KP831469612), T8U, T8T); + T9F = VFNMS(LDK(KP831469612), T8U, T8T); + T9l = VSUB(T75, T72); + T9m = VFMA(LDK(KP831469612), T9l, T9k); + T9Q = VFNMS(LDK(KP831469612), T9l, T9k); + { + V T8Y, T91, T9n, T9o; + T8Y = VFMA(LDK(KP534511135), T8X, T8W); + T91 = VFMA(LDK(KP534511135), T90, T8Z); + T92 = VADD(T8Y, T91); + T9R = VSUB(T8Y, T91); + T9n = VFNMS(LDK(KP534511135), T8Z, T90); + T9o = VFNMS(LDK(KP534511135), T8W, T8X); + T9p = VSUB(T9n, T9o); + T9G = VADD(T9o, T9n); + } + T93 = VFMA(LDK(KP881921264), T92, T8V); + T9Z = VFNMS(LDK(KP881921264), T9G, T9F); + Ta2 = VFNMS(LDK(KP881921264), T9R, T9Q); + T9q = VFMA(LDK(KP881921264), T9p, T9m); + T9x = VFNMS(LDK(KP881921264), T92, T8V); + T9H = VFMA(LDK(KP881921264), T9G, T9F); + T9S = VFMA(LDK(KP881921264), T9R, T9Q); + T9A = VFNMS(LDK(KP881921264), T9p, T9m); + } + { + V T9j, T9u, Ta1, Ta4; + T9j = VFNMS(LDK(KP857728610), T9i, T93); + T9u = VFNMS(LDK(KP857728610), T9t, T9q); + ST(&(xo[WS(os, 53)]), VFNMSI(T9u, T9j), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 75)]), VFMAI(T9u, T9j), ovs, &(xo[WS(os, 1)])); + Ta1 = VFNMS(LDK(KP970031253), Ta0, T9Z); + Ta4 = VFNMS(LDK(KP970031253), Ta3, Ta2); + ST(&(xo[WS(os, 37)]), VFNMSI(Ta4, Ta1), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 91)]), VFMAI(Ta4, Ta1), ovs, &(xo[WS(os, 1)])); + } + { + V Ta5, Ta6, T9v, T9w; + Ta5 = VFMA(LDK(KP970031253), Ta0, T9Z); + Ta6 = VFMA(LDK(KP970031253), Ta3, Ta2); + ST(&(xo[WS(os, 27)]), VFMAI(Ta6, Ta5), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 101)]), VFNMSI(Ta6, Ta5), ovs, &(xo[WS(os, 1)])); + T9v = VFMA(LDK(KP857728610), T9i, T93); + T9w = VFMA(LDK(KP857728610), T9t, T9q); + ST(&(xo[WS(os, 117)]), VFNMSI(T9w, T9v), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFMAI(T9w, T9v), ovs, &(xo[WS(os, 1)])); + } + { + V T9z, T9C, T9P, T9W; + T9z = VFMA(LDK(KP857728610), T9y, T9x); + T9C = VFMA(LDK(KP857728610), T9B, T9A); + ST(&(xo[WS(os, 43)]), VFMAI(T9C, T9z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 85)]), VFNMSI(T9C, T9z), ovs, &(xo[WS(os, 1)])); + T9P = VFNMS(LDK(KP970031253), T9O, T9H); + T9W = VFNMS(LDK(KP970031253), T9V, T9S); + ST(&(xo[WS(os, 69)]), VFNMSI(T9W, T9P), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 59)]), VFMAI(T9W, T9P), ovs, &(xo[WS(os, 1)])); + } + { + V T9X, T9Y, T9D, T9E; + T9X = VFMA(LDK(KP970031253), T9O, T9H); + T9Y = VFMA(LDK(KP970031253), T9V, T9S); + ST(&(xo[WS(os, 5)]), VFNMSI(T9Y, T9X), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 123)]), VFMAI(T9Y, T9X), ovs, &(xo[WS(os, 1)])); + T9D = VFNMS(LDK(KP857728610), T9y, T9x); + T9E = VFNMS(LDK(KP857728610), T9B, T9A); + ST(&(xo[WS(os, 21)]), VFNMSI(T9E, T9D), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 107)]), VFMAI(T9E, T9D), ovs, &(xo[WS(os, 1)])); + } + } + { + V T68, T6r, T6j, T6o, T6E, T6T, T6L, T6Q, T5T, T6P, T6S, T6g, T6n, T6x, T6I; + V T6q; + { + V T60, T6h, T67, T6i; + { + V T5W, T5Z, T63, T66; + T5W = VFNMS(LDK(KP980785280), T5V, T5U); + T5Z = VFMA(LDK(KP980785280), T5Y, T5X); + T60 = VFNMS(LDK(KP472964775), T5Z, T5W); + T6h = VFMA(LDK(KP472964775), T5W, T5Z); + T63 = VFNMS(LDK(KP980785280), T62, T61); + T66 = VFMA(LDK(KP980785280), T65, T64); + T67 = VFNMS(LDK(KP472964775), T66, T63); + T6i = VFMA(LDK(KP472964775), T63, T66); + } + T68 = VADD(T60, T67); + T6r = VSUB(T67, T60); + T6j = VSUB(T6h, T6i); + T6o = VADD(T6h, T6i); + } + { + V T6A, T6J, T6D, T6K; + { + V T6y, T6z, T6B, T6C; + T6y = VFMA(LDK(KP980785280), T5V, T5U); + T6z = VFNMS(LDK(KP980785280), T5Y, T5X); + T6A = VFMA(LDK(KP357805721), T6z, T6y); + T6J = VFNMS(LDK(KP357805721), T6y, T6z); + T6B = VFMA(LDK(KP980785280), T62, T61); + T6C = VFNMS(LDK(KP980785280), T65, T64); + T6D = VFMA(LDK(KP357805721), T6C, T6B); + T6K = VFNMS(LDK(KP357805721), T6B, T6C); + } + T6E = VADD(T6A, T6D); + T6T = VSUB(T6D, T6A); + T6L = VSUB(T6J, T6K); + T6Q = VADD(T6J, T6K); + } + { + V T5L, T6v, T6c, T6G, T5S, T6H, T6f, T6w, T5K, T6b; + T5K = VADD(T4V, T4W); + T5L = VFNMS(LDK(KP980785280), T5K, T5J); + T6v = VFMA(LDK(KP980785280), T5K, T5J); + T6b = VSUB(TZ, TI); + T6c = VFNMS(LDK(KP980785280), T6b, T6a); + T6G = VFMA(LDK(KP980785280), T6b, T6a); + { + V T5O, T5R, T6d, T6e; + T5O = VFNMS(LDK(KP820678790), T5N, T5M); + T5R = VFNMS(LDK(KP820678790), T5Q, T5P); + T5S = VADD(T5O, T5R); + T6H = VSUB(T5O, T5R); + T6d = VFMA(LDK(KP820678790), T5P, T5Q); + T6e = VFMA(LDK(KP820678790), T5M, T5N); + T6f = VSUB(T6d, T6e); + T6w = VADD(T6e, T6d); + } + T5T = VFNMS(LDK(KP773010453), T5S, T5L); + T6P = VFNMS(LDK(KP773010453), T6w, T6v); + T6S = VFNMS(LDK(KP773010453), T6H, T6G); + T6g = VFNMS(LDK(KP773010453), T6f, T6c); + T6n = VFMA(LDK(KP773010453), T5S, T5L); + T6x = VFMA(LDK(KP773010453), T6w, T6v); + T6I = VFMA(LDK(KP773010453), T6H, T6G); + T6q = VFMA(LDK(KP773010453), T6f, T6c); + } + { + V T69, T6k, T6R, T6U; + T69 = VFNMS(LDK(KP903989293), T68, T5T); + T6k = VFNMS(LDK(KP903989293), T6j, T6g); + ST(&(xo[WS(os, 73)]), VFNMSI(T6k, T69), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VFMAI(T6k, T69), ovs, &(xo[WS(os, 1)])); + T6R = VFMA(LDK(KP941544065), T6Q, T6P); + T6U = VFMA(LDK(KP941544065), T6T, T6S); + ST(&(xo[WS(os, 39)]), VFMAI(T6U, T6R), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 89)]), VFNMSI(T6U, T6R), ovs, &(xo[WS(os, 1)])); + } + { + V T6V, T6W, T6l, T6m; + T6V = VFNMS(LDK(KP941544065), T6Q, T6P); + T6W = VFNMS(LDK(KP941544065), T6T, T6S); + ST(&(xo[WS(os, 25)]), VFNMSI(T6W, T6V), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 103)]), VFMAI(T6W, T6V), ovs, &(xo[WS(os, 1)])); + T6l = VFMA(LDK(KP903989293), T68, T5T); + T6m = VFMA(LDK(KP903989293), T6j, T6g); + ST(&(xo[WS(os, 9)]), VFNMSI(T6m, T6l), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 119)]), VFMAI(T6m, T6l), ovs, &(xo[WS(os, 1)])); + } + { + V T6p, T6s, T6F, T6M; + T6p = VFNMS(LDK(KP903989293), T6o, T6n); + T6s = VFNMS(LDK(KP903989293), T6r, T6q); + ST(&(xo[WS(os, 41)]), VFNMSI(T6s, T6p), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 87)]), VFMAI(T6s, T6p), ovs, &(xo[WS(os, 1)])); + T6F = VFNMS(LDK(KP941544065), T6E, T6x); + T6M = VFNMS(LDK(KP941544065), T6L, T6I); + ST(&(xo[WS(os, 57)]), VFNMSI(T6M, T6F), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 71)]), VFMAI(T6M, T6F), ovs, &(xo[WS(os, 1)])); + } + { + V T6N, T6O, T6t, T6u; + T6N = VFMA(LDK(KP941544065), T6E, T6x); + T6O = VFMA(LDK(KP941544065), T6L, T6I); + ST(&(xo[WS(os, 121)]), VFNMSI(T6O, T6N), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(T6O, T6N), ovs, &(xo[WS(os, 1)])); + T6t = VFMA(LDK(KP903989293), T6o, T6n); + T6u = VFMA(LDK(KP903989293), T6r, T6q); + ST(&(xo[WS(os, 23)]), VFMAI(T6u, T6t), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 105)]), VFNMSI(T6u, T6t), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 128, XSIMD_STRING("n1fv_128"), {440, 0, 642, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_128) (planner *p) { + X(kdft_register) (p, n1fv_128, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 128 -name n1fv_128 -include dft/simd/n1f.h */ + +/* + * This function contains 1082 FP additions, 330 FP multiplications, + * (or, 938 additions, 186 multiplications, 144 fused multiply/add), + * 194 stack variables, 31 constants, and 256 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_128(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP941544065, +0.941544065183020778412509402599502357185589796); + DVK(KP336889853, +0.336889853392220050689253212619147570477766780); + DVK(KP903989293, +0.903989293123443331586200297230537048710132025); + DVK(KP427555093, +0.427555093430282094320966856888798534304578629); + DVK(KP970031253, +0.970031253194543992603984207286100251456865962); + DVK(KP242980179, +0.242980179903263889948274162077471118320990783); + DVK(KP857728610, +0.857728610000272069902269984284770137042490799); + DVK(KP514102744, +0.514102744193221726593693838968815772608049120); + DVK(KP671558954, +0.671558954847018400625376850427421803228750632); + DVK(KP740951125, +0.740951125354959091175616897495162729728955309); + DVK(KP049067674, +0.049067674327418014254954976942682658314745363); + DVK(KP998795456, +0.998795456205172392714771604759100694443203615); + DVK(KP595699304, +0.595699304492433343467036528829969889511926338); + DVK(KP803207531, +0.803207531480644909806676512963141923879569427); + DVK(KP146730474, +0.146730474455361751658850129646717819706215317); + DVK(KP989176509, +0.989176509964780973451673738016243063983689533); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + V Tr, T5J, Ted, Tgf, Tfq, TgH, T4U, T6b, T6Z, T8T, Tad, TcZ, Tcc, Td0, T84; + V T9l, Tb6, Tbt, T2G, T5X, TeV, Tgr, T3p, T5V, T7B, T95, TeK, Tgt, T7q, T97; + V Td8, TdK, TbD, Tc0, T3V, T61, Tfg, TgB, T4E, T65, T7U, T9f, Tf5, Tgx, T7J; + V T9b, Tdf, TdN, Td2, Td3, TI, T4V, Tft, Tgg, TZ, T4W, T75, T86, Tek, TgG; + V T72, T85, Tas, Tcd, Tdp, Tdq, TdG, Teq, Tgm, Tet, Tgl, T1s, T5P, T1B, T5Q; + V T7d, T8Z, TaI, Tcf, T7a, T90, Tdm, Tdn, TdH, Tez, Tgi, TeC, Tgj, T23, T5N; + V T2c, T5M, T7k, T8X, TaX, Tcg, T7h, T8W, Tbl, Tbu, Tdb, TdL, TeY, Tgu, TeR; + V Tgq, T7x, T98, T7E, T94, T3f, T5Y, T3s, T5U, TbS, Tc1, Tdi, TdO, Tfj, Tgy; + V Tfc, TgA, T7Q, T9e, T7X, T9c, T4u, T64, T4H, T62; + { + V T3, Ta7, T4P, Ta8, Ta, Tab, T4M, Taa, Tc9, Tca, Ti, Tea, T4S, Tc6, Tc7; + V Tp, Teb, T4R; + { + V T1, T2, T4N, T4O; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 64)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Ta7 = VADD(T1, T2); + T4N = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T4O = LD(&(xi[WS(is, 96)]), ivs, &(xi[0])); + T4P = VSUB(T4N, T4O); + Ta8 = VADD(T4N, T4O); + } + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 80)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 112)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tab = VADD(T7, T8); + T4M = VMUL(LDK(KP707106781), VSUB(T9, T6)); + Taa = VADD(T4, T5); + } + { + V Te, Th, Tl, To; + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 72)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tc9 = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 104)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + Tca = VADD(Tf, Tg); + } + Ti = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + Tea = VSUB(Tc9, Tca); + T4S = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + { + V Tj, Tk, Tm, Tn; + Tj = LD(&(xi[WS(is, 120)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + Tc6 = VADD(Tj, Tk); + Tm = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 88)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + Tc7 = VADD(Tm, Tn); + } + Tp = VFMA(LDK(KP923879532), Tl, VMUL(LDK(KP382683432), To)); + Teb = VSUB(Tc6, Tc7); + T4R = VFNMS(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + } + { + V Tb, Tq, Te9, Tec; + Tb = VADD(T3, Ta); + Tq = VADD(Ti, Tp); + Tr = VADD(Tb, Tq); + T5J = VSUB(Tb, Tq); + Te9 = VSUB(Ta7, Ta8); + Tec = VMUL(LDK(KP707106781), VADD(Tea, Teb)); + Ted = VADD(Te9, Tec); + Tgf = VSUB(Te9, Tec); + } + { + V Tfo, Tfp, T4Q, T4T; + Tfo = VSUB(Tab, Taa); + Tfp = VMUL(LDK(KP707106781), VSUB(Teb, Tea)); + Tfq = VADD(Tfo, Tfp); + TgH = VSUB(Tfp, Tfo); + T4Q = VSUB(T4M, T4P); + T4T = VSUB(T4R, T4S); + T4U = VADD(T4Q, T4T); + T6b = VSUB(T4T, T4Q); + } + { + V T6X, T6Y, Ta9, Tac; + T6X = VSUB(T3, Ta); + T6Y = VADD(T4S, T4R); + T6Z = VADD(T6X, T6Y); + T8T = VSUB(T6X, T6Y); + Ta9 = VADD(Ta7, Ta8); + Tac = VADD(Taa, Tab); + Tad = VSUB(Ta9, Tac); + TcZ = VADD(Ta9, Tac); + } + { + V Tc8, Tcb, T82, T83; + Tc8 = VADD(Tc6, Tc7); + Tcb = VADD(Tc9, Tca); + Tcc = VSUB(Tc8, Tcb); + Td0 = VADD(Tcb, Tc8); + T82 = VADD(T4P, T4M); + T83 = VSUB(Tp, Ti); + T84 = VADD(T82, T83); + T9l = VSUB(T83, T82); + } + } + { + V Tb0, Tb1, T2i, Tb2, T3k, Tb3, Tb4, T2p, Tb5, T3h, T2x, TeH, T3n, Tbs, T2E; + V TeI, T3m, Tbp, T2l, T2o, TeG, TeJ; + { + V T2g, T2h, T3i, T3j; + T2g = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2h = LD(&(xi[WS(is, 65)]), ivs, &(xi[WS(is, 1)])); + Tb0 = VADD(T2g, T2h); + T3i = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T3j = LD(&(xi[WS(is, 97)]), ivs, &(xi[WS(is, 1)])); + Tb1 = VADD(T3i, T3j); + T2i = VSUB(T2g, T2h); + Tb2 = VADD(Tb0, Tb1); + T3k = VSUB(T3i, T3j); + } + { + V T2j, T2k, T2m, T2n; + T2j = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T2k = LD(&(xi[WS(is, 81)]), ivs, &(xi[WS(is, 1)])); + T2l = VSUB(T2j, T2k); + Tb3 = VADD(T2j, T2k); + T2m = LD(&(xi[WS(is, 113)]), ivs, &(xi[WS(is, 1)])); + T2n = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T2o = VSUB(T2m, T2n); + Tb4 = VADD(T2m, T2n); + } + T2p = VMUL(LDK(KP707106781), VADD(T2l, T2o)); + Tb5 = VADD(Tb3, Tb4); + T3h = VMUL(LDK(KP707106781), VSUB(T2o, T2l)); + { + V T2t, Tbq, T2w, Tbr; + { + V T2r, T2s, T2u, T2v; + T2r = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T2s = LD(&(xi[WS(is, 73)]), ivs, &(xi[WS(is, 1)])); + T2t = VSUB(T2r, T2s); + Tbq = VADD(T2r, T2s); + T2u = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T2v = LD(&(xi[WS(is, 105)]), ivs, &(xi[WS(is, 1)])); + T2w = VSUB(T2u, T2v); + Tbr = VADD(T2u, T2v); + } + T2x = VFNMS(LDK(KP382683432), T2w, VMUL(LDK(KP923879532), T2t)); + TeH = VSUB(Tbq, Tbr); + T3n = VFMA(LDK(KP382683432), T2t, VMUL(LDK(KP923879532), T2w)); + Tbs = VADD(Tbq, Tbr); + } + { + V T2A, Tbn, T2D, Tbo; + { + V T2y, T2z, T2B, T2C; + T2y = LD(&(xi[WS(is, 121)]), ivs, &(xi[WS(is, 1)])); + T2z = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T2A = VSUB(T2y, T2z); + Tbn = VADD(T2y, T2z); + T2B = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T2C = LD(&(xi[WS(is, 89)]), ivs, &(xi[WS(is, 1)])); + T2D = VSUB(T2B, T2C); + Tbo = VADD(T2B, T2C); + } + T2E = VFMA(LDK(KP923879532), T2A, VMUL(LDK(KP382683432), T2D)); + TeI = VSUB(Tbn, Tbo); + T3m = VFNMS(LDK(KP923879532), T2D, VMUL(LDK(KP382683432), T2A)); + Tbp = VADD(Tbn, Tbo); + } + Tb6 = VSUB(Tb2, Tb5); + Tbt = VSUB(Tbp, Tbs); + { + V T2q, T2F, TeT, TeU; + T2q = VADD(T2i, T2p); + T2F = VADD(T2x, T2E); + T2G = VADD(T2q, T2F); + T5X = VSUB(T2q, T2F); + TeT = VSUB(Tb4, Tb3); + TeU = VMUL(LDK(KP707106781), VSUB(TeI, TeH)); + TeV = VADD(TeT, TeU); + Tgr = VSUB(TeU, TeT); + } + { + V T3l, T3o, T7z, T7A; + T3l = VSUB(T3h, T3k); + T3o = VSUB(T3m, T3n); + T3p = VADD(T3l, T3o); + T5V = VSUB(T3o, T3l); + T7z = VADD(T3k, T3h); + T7A = VSUB(T2E, T2x); + T7B = VADD(T7z, T7A); + T95 = VSUB(T7A, T7z); + } + TeG = VSUB(Tb0, Tb1); + TeJ = VMUL(LDK(KP707106781), VADD(TeH, TeI)); + TeK = VADD(TeG, TeJ); + Tgt = VSUB(TeG, TeJ); + { + V T7o, T7p, Td6, Td7; + T7o = VSUB(T2i, T2p); + T7p = VADD(T3n, T3m); + T7q = VADD(T7o, T7p); + T97 = VSUB(T7o, T7p); + Td6 = VADD(Tb2, Tb5); + Td7 = VADD(Tbs, Tbp); + Td8 = VADD(Td6, Td7); + TdK = VSUB(Td6, Td7); + } + } + { + V Tbx, Tby, T3x, Tbz, T4z, TbA, TbB, T3E, TbC, T4w, T3M, Tf2, T4C, TbZ, T3T; + V Tf3, T4B, TbW, T3A, T3D, Tf1, Tf4; + { + V T3v, T3w, T4x, T4y; + T3v = LD(&(xi[WS(is, 127)]), ivs, &(xi[WS(is, 1)])); + T3w = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + Tbx = VADD(T3v, T3w); + T4x = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T4y = LD(&(xi[WS(is, 95)]), ivs, &(xi[WS(is, 1)])); + Tby = VADD(T4x, T4y); + T3x = VSUB(T3v, T3w); + Tbz = VADD(Tbx, Tby); + T4z = VSUB(T4x, T4y); + } + { + V T3y, T3z, T3B, T3C; + T3y = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T3z = LD(&(xi[WS(is, 79)]), ivs, &(xi[WS(is, 1)])); + T3A = VSUB(T3y, T3z); + TbA = VADD(T3y, T3z); + T3B = LD(&(xi[WS(is, 111)]), ivs, &(xi[WS(is, 1)])); + T3C = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T3D = VSUB(T3B, T3C); + TbB = VADD(T3B, T3C); + } + T3E = VMUL(LDK(KP707106781), VADD(T3A, T3D)); + TbC = VADD(TbA, TbB); + T4w = VMUL(LDK(KP707106781), VSUB(T3D, T3A)); + { + V T3I, TbX, T3L, TbY; + { + V T3G, T3H, T3J, T3K; + T3G = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3H = LD(&(xi[WS(is, 71)]), ivs, &(xi[WS(is, 1)])); + T3I = VSUB(T3G, T3H); + TbX = VADD(T3G, T3H); + T3J = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T3K = LD(&(xi[WS(is, 103)]), ivs, &(xi[WS(is, 1)])); + T3L = VSUB(T3J, T3K); + TbY = VADD(T3J, T3K); + } + T3M = VFNMS(LDK(KP382683432), T3L, VMUL(LDK(KP923879532), T3I)); + Tf2 = VSUB(TbX, TbY); + T4C = VFMA(LDK(KP382683432), T3I, VMUL(LDK(KP923879532), T3L)); + TbZ = VADD(TbX, TbY); + } + { + V T3P, TbU, T3S, TbV; + { + V T3N, T3O, T3Q, T3R; + T3N = LD(&(xi[WS(is, 119)]), ivs, &(xi[WS(is, 1)])); + T3O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T3P = VSUB(T3N, T3O); + TbU = VADD(T3N, T3O); + T3Q = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T3R = LD(&(xi[WS(is, 87)]), ivs, &(xi[WS(is, 1)])); + T3S = VSUB(T3Q, T3R); + TbV = VADD(T3Q, T3R); + } + T3T = VFMA(LDK(KP923879532), T3P, VMUL(LDK(KP382683432), T3S)); + Tf3 = VSUB(TbU, TbV); + T4B = VFNMS(LDK(KP923879532), T3S, VMUL(LDK(KP382683432), T3P)); + TbW = VADD(TbU, TbV); + } + TbD = VSUB(Tbz, TbC); + Tc0 = VSUB(TbW, TbZ); + { + V T3F, T3U, Tfe, Tff; + T3F = VADD(T3x, T3E); + T3U = VADD(T3M, T3T); + T3V = VADD(T3F, T3U); + T61 = VSUB(T3F, T3U); + Tfe = VSUB(TbB, TbA); + Tff = VMUL(LDK(KP707106781), VSUB(Tf3, Tf2)); + Tfg = VADD(Tfe, Tff); + TgB = VSUB(Tff, Tfe); + } + { + V T4A, T4D, T7S, T7T; + T4A = VSUB(T4w, T4z); + T4D = VSUB(T4B, T4C); + T4E = VADD(T4A, T4D); + T65 = VSUB(T4D, T4A); + T7S = VADD(T4z, T4w); + T7T = VSUB(T3T, T3M); + T7U = VADD(T7S, T7T); + T9f = VSUB(T7T, T7S); + } + Tf1 = VSUB(Tbx, Tby); + Tf4 = VMUL(LDK(KP707106781), VADD(Tf2, Tf3)); + Tf5 = VADD(Tf1, Tf4); + Tgx = VSUB(Tf1, Tf4); + { + V T7H, T7I, Tdd, Tde; + T7H = VSUB(T3x, T3E); + T7I = VADD(T4C, T4B); + T7J = VADD(T7H, T7I); + T9b = VSUB(T7H, T7I); + Tdd = VADD(Tbz, TbC); + Tde = VADD(TbZ, TbW); + Tdf = VADD(Tdd, Tde); + TdN = VSUB(Tdd, Tde); + } + } + { + V Tu, Tee, TG, Tag, TL, Teh, TX, Tan, TB, Tef, TD, Taj, TS, Tei, TU; + V Taq, Teg, Tej; + { + V Ts, Tt, Tae, TE, TF, Taf; + Ts = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 68)]), ivs, &(xi[0])); + Tae = VADD(Ts, Tt); + TE = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + TF = LD(&(xi[WS(is, 100)]), ivs, &(xi[0])); + Taf = VADD(TE, TF); + Tu = VSUB(Ts, Tt); + Tee = VSUB(Tae, Taf); + TG = VSUB(TE, TF); + Tag = VADD(Tae, Taf); + } + { + V TJ, TK, Tal, TV, TW, Tam; + TJ = LD(&(xi[WS(is, 124)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tal = VADD(TJ, TK); + TV = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + TW = LD(&(xi[WS(is, 92)]), ivs, &(xi[0])); + Tam = VADD(TV, TW); + TL = VSUB(TJ, TK); + Teh = VSUB(Tal, Tam); + TX = VSUB(TV, TW); + Tan = VADD(Tal, Tam); + } + { + V Tx, Tah, TA, Tai; + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 84)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Tah = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 116)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + TA = VSUB(Ty, Tz); + Tai = VADD(Ty, Tz); + } + TB = VMUL(LDK(KP707106781), VADD(Tx, TA)); + Tef = VSUB(Tai, Tah); + TD = VMUL(LDK(KP707106781), VSUB(TA, Tx)); + Taj = VADD(Tah, Tai); + } + { + V TO, Tao, TR, Tap; + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 76)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + Tao = VADD(TM, TN); + TP = LD(&(xi[WS(is, 108)]), ivs, &(xi[0])); + TQ = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + TR = VSUB(TP, TQ); + Tap = VADD(TP, TQ); + } + TS = VMUL(LDK(KP707106781), VADD(TO, TR)); + Tei = VSUB(Tap, Tao); + TU = VMUL(LDK(KP707106781), VSUB(TR, TO)); + Taq = VADD(Tao, Tap); + } + Td2 = VADD(Tag, Taj); + Td3 = VADD(Tan, Taq); + { + V TC, TH, Tfr, Tfs; + TC = VADD(Tu, TB); + TH = VSUB(TD, TG); + TI = VFMA(LDK(KP980785280), TC, VMUL(LDK(KP195090322), TH)); + T4V = VFNMS(LDK(KP195090322), TC, VMUL(LDK(KP980785280), TH)); + Tfr = VFNMS(LDK(KP382683432), Tee, VMUL(LDK(KP923879532), Tef)); + Tfs = VFMA(LDK(KP382683432), Teh, VMUL(LDK(KP923879532), Tei)); + Tft = VADD(Tfr, Tfs); + Tgg = VSUB(Tfs, Tfr); + } + { + V TT, TY, T73, T74; + TT = VADD(TL, TS); + TY = VSUB(TU, TX); + TZ = VFNMS(LDK(KP195090322), TY, VMUL(LDK(KP980785280), TT)); + T4W = VFMA(LDK(KP195090322), TT, VMUL(LDK(KP980785280), TY)); + T73 = VSUB(TL, TS); + T74 = VADD(TX, TU); + T75 = VFNMS(LDK(KP555570233), T74, VMUL(LDK(KP831469612), T73)); + T86 = VFMA(LDK(KP555570233), T73, VMUL(LDK(KP831469612), T74)); + } + Teg = VFMA(LDK(KP923879532), Tee, VMUL(LDK(KP382683432), Tef)); + Tej = VFNMS(LDK(KP382683432), Tei, VMUL(LDK(KP923879532), Teh)); + Tek = VADD(Teg, Tej); + TgG = VSUB(Tej, Teg); + { + V T70, T71, Tak, Tar; + T70 = VSUB(Tu, TB); + T71 = VADD(TG, TD); + T72 = VFMA(LDK(KP831469612), T70, VMUL(LDK(KP555570233), T71)); + T85 = VFNMS(LDK(KP555570233), T70, VMUL(LDK(KP831469612), T71)); + Tak = VSUB(Tag, Taj); + Tar = VSUB(Tan, Taq); + Tas = VMUL(LDK(KP707106781), VADD(Tak, Tar)); + Tcd = VMUL(LDK(KP707106781), VSUB(Tar, Tak)); + } + } + { + V Tav, Tau, T1b, Taw, T1v, Tay, Tax, T18, Taz, T1w, T1j, Teo, T1z, TaD, T1q; + V Ten, T1y, TaG, T14, T17, Tem, Tep; + { + V T19, T1a, T1t, T1u; + T19 = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + T1a = LD(&(xi[WS(is, 98)]), ivs, &(xi[0])); + Tav = VADD(T19, T1a); + T1t = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T1u = LD(&(xi[WS(is, 66)]), ivs, &(xi[0])); + Tau = VADD(T1t, T1u); + T1b = VSUB(T19, T1a); + Taw = VADD(Tau, Tav); + T1v = VSUB(T1t, T1u); + } + { + V T12, T13, T15, T16; + T12 = LD(&(xi[WS(is, 114)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + T14 = VSUB(T12, T13); + Tay = VADD(T12, T13); + T15 = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T16 = LD(&(xi[WS(is, 82)]), ivs, &(xi[0])); + T17 = VSUB(T15, T16); + Tax = VADD(T15, T16); + } + T18 = VMUL(LDK(KP707106781), VSUB(T14, T17)); + Taz = VADD(Tax, Tay); + T1w = VMUL(LDK(KP707106781), VADD(T17, T14)); + { + V T1f, TaB, T1i, TaC; + { + V T1d, T1e, T1g, T1h; + T1d = LD(&(xi[WS(is, 122)]), ivs, &(xi[0])); + T1e = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + T1f = VSUB(T1d, T1e); + TaB = VADD(T1d, T1e); + T1g = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T1h = LD(&(xi[WS(is, 90)]), ivs, &(xi[0])); + T1i = VSUB(T1g, T1h); + TaC = VADD(T1g, T1h); + } + T1j = VFNMS(LDK(KP923879532), T1i, VMUL(LDK(KP382683432), T1f)); + Teo = VSUB(TaB, TaC); + T1z = VFMA(LDK(KP923879532), T1f, VMUL(LDK(KP382683432), T1i)); + TaD = VADD(TaB, TaC); + } + { + V T1m, TaE, T1p, TaF; + { + V T1k, T1l, T1n, T1o; + T1k = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1l = LD(&(xi[WS(is, 74)]), ivs, &(xi[0])); + T1m = VSUB(T1k, T1l); + TaE = VADD(T1k, T1l); + T1n = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T1o = LD(&(xi[WS(is, 106)]), ivs, &(xi[0])); + T1p = VSUB(T1n, T1o); + TaF = VADD(T1n, T1o); + } + T1q = VFMA(LDK(KP382683432), T1m, VMUL(LDK(KP923879532), T1p)); + Ten = VSUB(TaE, TaF); + T1y = VFNMS(LDK(KP382683432), T1p, VMUL(LDK(KP923879532), T1m)); + TaG = VADD(TaE, TaF); + } + Tdp = VADD(Taw, Taz); + Tdq = VADD(TaG, TaD); + TdG = VSUB(Tdp, Tdq); + Tem = VSUB(Tau, Tav); + Tep = VMUL(LDK(KP707106781), VADD(Ten, Teo)); + Teq = VADD(Tem, Tep); + Tgm = VSUB(Tem, Tep); + { + V Ter, Tes, T1c, T1r; + Ter = VSUB(Tay, Tax); + Tes = VMUL(LDK(KP707106781), VSUB(Teo, Ten)); + Tet = VADD(Ter, Tes); + Tgl = VSUB(Tes, Ter); + T1c = VSUB(T18, T1b); + T1r = VSUB(T1j, T1q); + T1s = VADD(T1c, T1r); + T5P = VSUB(T1r, T1c); + } + { + V T1x, T1A, T7b, T7c; + T1x = VADD(T1v, T1w); + T1A = VADD(T1y, T1z); + T1B = VADD(T1x, T1A); + T5Q = VSUB(T1x, T1A); + T7b = VADD(T1b, T18); + T7c = VSUB(T1z, T1y); + T7d = VADD(T7b, T7c); + T8Z = VSUB(T7c, T7b); + } + { + V TaA, TaH, T78, T79; + TaA = VSUB(Taw, Taz); + TaH = VSUB(TaD, TaG); + TaI = VFMA(LDK(KP923879532), TaA, VMUL(LDK(KP382683432), TaH)); + Tcf = VFNMS(LDK(KP382683432), TaA, VMUL(LDK(KP923879532), TaH)); + T78 = VSUB(T1v, T1w); + T79 = VADD(T1q, T1j); + T7a = VADD(T78, T79); + T90 = VSUB(T78, T79); + } + } + { + V TaJ, TaK, T1F, TaL, T27, TaM, TaN, T1M, TaO, T24, T1U, Tew, T2a, TaV, T21; + V Tex, T29, TaS, T1I, T1L, Tev, Tey; + { + V T1D, T1E, T25, T26; + T1D = LD(&(xi[WS(is, 126)]), ivs, &(xi[0])); + T1E = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TaJ = VADD(T1D, T1E); + T25 = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + T26 = LD(&(xi[WS(is, 94)]), ivs, &(xi[0])); + TaK = VADD(T25, T26); + T1F = VSUB(T1D, T1E); + TaL = VADD(TaJ, TaK); + T27 = VSUB(T25, T26); + } + { + V T1G, T1H, T1J, T1K; + T1G = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T1H = LD(&(xi[WS(is, 78)]), ivs, &(xi[0])); + T1I = VSUB(T1G, T1H); + TaM = VADD(T1G, T1H); + T1J = LD(&(xi[WS(is, 110)]), ivs, &(xi[0])); + T1K = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + T1L = VSUB(T1J, T1K); + TaN = VADD(T1J, T1K); + } + T1M = VMUL(LDK(KP707106781), VADD(T1I, T1L)); + TaO = VADD(TaM, TaN); + T24 = VMUL(LDK(KP707106781), VSUB(T1L, T1I)); + { + V T1Q, TaT, T1T, TaU; + { + V T1O, T1P, T1R, T1S; + T1O = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T1P = LD(&(xi[WS(is, 70)]), ivs, &(xi[0])); + T1Q = VSUB(T1O, T1P); + TaT = VADD(T1O, T1P); + T1R = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T1S = LD(&(xi[WS(is, 102)]), ivs, &(xi[0])); + T1T = VSUB(T1R, T1S); + TaU = VADD(T1R, T1S); + } + T1U = VFNMS(LDK(KP382683432), T1T, VMUL(LDK(KP923879532), T1Q)); + Tew = VSUB(TaT, TaU); + T2a = VFMA(LDK(KP382683432), T1Q, VMUL(LDK(KP923879532), T1T)); + TaV = VADD(TaT, TaU); + } + { + V T1X, TaQ, T20, TaR; + { + V T1V, T1W, T1Y, T1Z; + T1V = LD(&(xi[WS(is, 118)]), ivs, &(xi[0])); + T1W = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + T1X = VSUB(T1V, T1W); + TaQ = VADD(T1V, T1W); + T1Y = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T1Z = LD(&(xi[WS(is, 86)]), ivs, &(xi[0])); + T20 = VSUB(T1Y, T1Z); + TaR = VADD(T1Y, T1Z); + } + T21 = VFMA(LDK(KP923879532), T1X, VMUL(LDK(KP382683432), T20)); + Tex = VSUB(TaQ, TaR); + T29 = VFNMS(LDK(KP923879532), T20, VMUL(LDK(KP382683432), T1X)); + TaS = VADD(TaQ, TaR); + } + Tdm = VADD(TaL, TaO); + Tdn = VADD(TaV, TaS); + TdH = VSUB(Tdm, Tdn); + Tev = VSUB(TaJ, TaK); + Tey = VMUL(LDK(KP707106781), VADD(Tew, Tex)); + Tez = VADD(Tev, Tey); + Tgi = VSUB(Tev, Tey); + { + V TeA, TeB, T1N, T22; + TeA = VSUB(TaN, TaM); + TeB = VMUL(LDK(KP707106781), VSUB(Tex, Tew)); + TeC = VADD(TeA, TeB); + Tgj = VSUB(TeB, TeA); + T1N = VADD(T1F, T1M); + T22 = VADD(T1U, T21); + T23 = VADD(T1N, T22); + T5N = VSUB(T1N, T22); + } + { + V T28, T2b, T7i, T7j; + T28 = VSUB(T24, T27); + T2b = VSUB(T29, T2a); + T2c = VADD(T28, T2b); + T5M = VSUB(T2b, T28); + T7i = VADD(T27, T24); + T7j = VSUB(T21, T1U); + T7k = VADD(T7i, T7j); + T8X = VSUB(T7j, T7i); + } + { + V TaP, TaW, T7f, T7g; + TaP = VSUB(TaL, TaO); + TaW = VSUB(TaS, TaV); + TaX = VFNMS(LDK(KP382683432), TaW, VMUL(LDK(KP923879532), TaP)); + Tcg = VFMA(LDK(KP382683432), TaP, VMUL(LDK(KP923879532), TaW)); + T7f = VSUB(T1F, T1M); + T7g = VADD(T2a, T29); + T7h = VADD(T7f, T7g); + T8W = VSUB(T7f, T7g); + } + } + { + V T2J, TeL, T2V, Tb9, T30, TeO, T3c, Tbg, T2Q, TeM, T2S, Tbc, T37, TeP, T39; + V Tbj; + { + V T2H, T2I, Tb7, T2T, T2U, Tb8; + T2H = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T2I = LD(&(xi[WS(is, 69)]), ivs, &(xi[WS(is, 1)])); + Tb7 = VADD(T2H, T2I); + T2T = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T2U = LD(&(xi[WS(is, 101)]), ivs, &(xi[WS(is, 1)])); + Tb8 = VADD(T2T, T2U); + T2J = VSUB(T2H, T2I); + TeL = VSUB(Tb7, Tb8); + T2V = VSUB(T2T, T2U); + Tb9 = VADD(Tb7, Tb8); + } + { + V T2Y, T2Z, Tbe, T3a, T3b, Tbf; + T2Y = LD(&(xi[WS(is, 125)]), ivs, &(xi[WS(is, 1)])); + T2Z = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + Tbe = VADD(T2Y, T2Z); + T3a = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T3b = LD(&(xi[WS(is, 93)]), ivs, &(xi[WS(is, 1)])); + Tbf = VADD(T3a, T3b); + T30 = VSUB(T2Y, T2Z); + TeO = VSUB(Tbe, Tbf); + T3c = VSUB(T3a, T3b); + Tbg = VADD(Tbe, Tbf); + } + { + V T2M, Tba, T2P, Tbb; + { + V T2K, T2L, T2N, T2O; + T2K = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T2L = LD(&(xi[WS(is, 85)]), ivs, &(xi[WS(is, 1)])); + T2M = VSUB(T2K, T2L); + Tba = VADD(T2K, T2L); + T2N = LD(&(xi[WS(is, 117)]), ivs, &(xi[WS(is, 1)])); + T2O = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T2P = VSUB(T2N, T2O); + Tbb = VADD(T2N, T2O); + } + T2Q = VMUL(LDK(KP707106781), VADD(T2M, T2P)); + TeM = VSUB(Tbb, Tba); + T2S = VMUL(LDK(KP707106781), VSUB(T2P, T2M)); + Tbc = VADD(Tba, Tbb); + } + { + V T33, Tbh, T36, Tbi; + { + V T31, T32, T34, T35; + T31 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T32 = LD(&(xi[WS(is, 77)]), ivs, &(xi[WS(is, 1)])); + T33 = VSUB(T31, T32); + Tbh = VADD(T31, T32); + T34 = LD(&(xi[WS(is, 109)]), ivs, &(xi[WS(is, 1)])); + T35 = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T36 = VSUB(T34, T35); + Tbi = VADD(T34, T35); + } + T37 = VMUL(LDK(KP707106781), VADD(T33, T36)); + TeP = VSUB(Tbi, Tbh); + T39 = VMUL(LDK(KP707106781), VSUB(T36, T33)); + Tbj = VADD(Tbh, Tbi); + } + { + V Tbd, Tbk, TeN, TeQ; + Tbd = VSUB(Tb9, Tbc); + Tbk = VSUB(Tbg, Tbj); + Tbl = VMUL(LDK(KP707106781), VADD(Tbd, Tbk)); + Tbu = VMUL(LDK(KP707106781), VSUB(Tbk, Tbd)); + { + V Td9, Tda, TeW, TeX; + Td9 = VADD(Tb9, Tbc); + Tda = VADD(Tbg, Tbj); + Tdb = VADD(Td9, Tda); + TdL = VSUB(Tda, Td9); + TeW = VFNMS(LDK(KP382683432), TeL, VMUL(LDK(KP923879532), TeM)); + TeX = VFMA(LDK(KP382683432), TeO, VMUL(LDK(KP923879532), TeP)); + TeY = VADD(TeW, TeX); + Tgu = VSUB(TeX, TeW); + } + TeN = VFMA(LDK(KP923879532), TeL, VMUL(LDK(KP382683432), TeM)); + TeQ = VFNMS(LDK(KP382683432), TeP, VMUL(LDK(KP923879532), TeO)); + TeR = VADD(TeN, TeQ); + Tgq = VSUB(TeQ, TeN); + { + V T7t, T7C, T7w, T7D; + { + V T7r, T7s, T7u, T7v; + T7r = VSUB(T2J, T2Q); + T7s = VADD(T2V, T2S); + T7t = VFMA(LDK(KP831469612), T7r, VMUL(LDK(KP555570233), T7s)); + T7C = VFNMS(LDK(KP555570233), T7r, VMUL(LDK(KP831469612), T7s)); + T7u = VSUB(T30, T37); + T7v = VADD(T3c, T39); + T7w = VFNMS(LDK(KP555570233), T7v, VMUL(LDK(KP831469612), T7u)); + T7D = VFMA(LDK(KP555570233), T7u, VMUL(LDK(KP831469612), T7v)); + } + T7x = VADD(T7t, T7w); + T98 = VSUB(T7D, T7C); + T7E = VADD(T7C, T7D); + T94 = VSUB(T7w, T7t); + } + { + V T2X, T3q, T3e, T3r; + { + V T2R, T2W, T38, T3d; + T2R = VADD(T2J, T2Q); + T2W = VSUB(T2S, T2V); + T2X = VFMA(LDK(KP980785280), T2R, VMUL(LDK(KP195090322), T2W)); + T3q = VFNMS(LDK(KP195090322), T2R, VMUL(LDK(KP980785280), T2W)); + T38 = VADD(T30, T37); + T3d = VSUB(T39, T3c); + T3e = VFNMS(LDK(KP195090322), T3d, VMUL(LDK(KP980785280), T38)); + T3r = VFMA(LDK(KP195090322), T38, VMUL(LDK(KP980785280), T3d)); + } + T3f = VADD(T2X, T3e); + T5Y = VSUB(T3r, T3q); + T3s = VADD(T3q, T3r); + T5U = VSUB(T3e, T2X); + } + } + } + { + V T3Y, Tf6, T4a, TbG, T4f, Tf9, T4r, TbN, T45, Tf7, T47, TbJ, T4m, Tfa, T4o; + V TbQ; + { + V T3W, T3X, TbE, T48, T49, TbF; + T3W = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3X = LD(&(xi[WS(is, 67)]), ivs, &(xi[WS(is, 1)])); + TbE = VADD(T3W, T3X); + T48 = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T49 = LD(&(xi[WS(is, 99)]), ivs, &(xi[WS(is, 1)])); + TbF = VADD(T48, T49); + T3Y = VSUB(T3W, T3X); + Tf6 = VSUB(TbE, TbF); + T4a = VSUB(T48, T49); + TbG = VADD(TbE, TbF); + } + { + V T4d, T4e, TbL, T4p, T4q, TbM; + T4d = LD(&(xi[WS(is, 123)]), ivs, &(xi[WS(is, 1)])); + T4e = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + TbL = VADD(T4d, T4e); + T4p = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T4q = LD(&(xi[WS(is, 91)]), ivs, &(xi[WS(is, 1)])); + TbM = VADD(T4p, T4q); + T4f = VSUB(T4d, T4e); + Tf9 = VSUB(TbL, TbM); + T4r = VSUB(T4p, T4q); + TbN = VADD(TbL, TbM); + } + { + V T41, TbH, T44, TbI; + { + V T3Z, T40, T42, T43; + T3Z = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T40 = LD(&(xi[WS(is, 83)]), ivs, &(xi[WS(is, 1)])); + T41 = VSUB(T3Z, T40); + TbH = VADD(T3Z, T40); + T42 = LD(&(xi[WS(is, 115)]), ivs, &(xi[WS(is, 1)])); + T43 = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T44 = VSUB(T42, T43); + TbI = VADD(T42, T43); + } + T45 = VMUL(LDK(KP707106781), VADD(T41, T44)); + Tf7 = VSUB(TbI, TbH); + T47 = VMUL(LDK(KP707106781), VSUB(T44, T41)); + TbJ = VADD(TbH, TbI); + } + { + V T4i, TbO, T4l, TbP; + { + V T4g, T4h, T4j, T4k; + T4g = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T4h = LD(&(xi[WS(is, 75)]), ivs, &(xi[WS(is, 1)])); + T4i = VSUB(T4g, T4h); + TbO = VADD(T4g, T4h); + T4j = LD(&(xi[WS(is, 107)]), ivs, &(xi[WS(is, 1)])); + T4k = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T4l = VSUB(T4j, T4k); + TbP = VADD(T4j, T4k); + } + T4m = VMUL(LDK(KP707106781), VADD(T4i, T4l)); + Tfa = VSUB(TbP, TbO); + T4o = VMUL(LDK(KP707106781), VSUB(T4l, T4i)); + TbQ = VADD(TbO, TbP); + } + { + V TbK, TbR, Tf8, Tfb; + TbK = VSUB(TbG, TbJ); + TbR = VSUB(TbN, TbQ); + TbS = VMUL(LDK(KP707106781), VADD(TbK, TbR)); + Tc1 = VMUL(LDK(KP707106781), VSUB(TbR, TbK)); + { + V Tdg, Tdh, Tfh, Tfi; + Tdg = VADD(TbG, TbJ); + Tdh = VADD(TbN, TbQ); + Tdi = VADD(Tdg, Tdh); + TdO = VSUB(Tdh, Tdg); + Tfh = VFNMS(LDK(KP382683432), Tf6, VMUL(LDK(KP923879532), Tf7)); + Tfi = VFMA(LDK(KP382683432), Tf9, VMUL(LDK(KP923879532), Tfa)); + Tfj = VADD(Tfh, Tfi); + Tgy = VSUB(Tfi, Tfh); + } + Tf8 = VFMA(LDK(KP923879532), Tf6, VMUL(LDK(KP382683432), Tf7)); + Tfb = VFNMS(LDK(KP382683432), Tfa, VMUL(LDK(KP923879532), Tf9)); + Tfc = VADD(Tf8, Tfb); + TgA = VSUB(Tfb, Tf8); + { + V T7M, T7V, T7P, T7W; + { + V T7K, T7L, T7N, T7O; + T7K = VSUB(T3Y, T45); + T7L = VADD(T4a, T47); + T7M = VFMA(LDK(KP831469612), T7K, VMUL(LDK(KP555570233), T7L)); + T7V = VFNMS(LDK(KP555570233), T7K, VMUL(LDK(KP831469612), T7L)); + T7N = VSUB(T4f, T4m); + T7O = VADD(T4r, T4o); + T7P = VFNMS(LDK(KP555570233), T7O, VMUL(LDK(KP831469612), T7N)); + T7W = VFMA(LDK(KP555570233), T7N, VMUL(LDK(KP831469612), T7O)); + } + T7Q = VADD(T7M, T7P); + T9e = VSUB(T7P, T7M); + T7X = VADD(T7V, T7W); + T9c = VSUB(T7W, T7V); + } + { + V T4c, T4F, T4t, T4G; + { + V T46, T4b, T4n, T4s; + T46 = VADD(T3Y, T45); + T4b = VSUB(T47, T4a); + T4c = VFMA(LDK(KP980785280), T46, VMUL(LDK(KP195090322), T4b)); + T4F = VFNMS(LDK(KP195090322), T46, VMUL(LDK(KP980785280), T4b)); + T4n = VADD(T4f, T4m); + T4s = VSUB(T4o, T4r); + T4t = VFNMS(LDK(KP195090322), T4s, VMUL(LDK(KP980785280), T4n)); + T4G = VFMA(LDK(KP195090322), T4n, VMUL(LDK(KP980785280), T4s)); + } + T4u = VADD(T4c, T4t); + T64 = VSUB(T4t, T4c); + T4H = VADD(T4F, T4G); + T62 = VSUB(T4G, T4F); + } + } + } + { + V Td5, Tdx, TdC, TdE, Tdk, Tdt, Tds, Tdy, Tdz, TdD; + { + V Td1, Td4, TdA, TdB; + Td1 = VADD(TcZ, Td0); + Td4 = VADD(Td2, Td3); + Td5 = VSUB(Td1, Td4); + Tdx = VADD(Td1, Td4); + TdA = VADD(Td8, Tdb); + TdB = VADD(Tdf, Tdi); + TdC = VADD(TdA, TdB); + TdE = VBYI(VSUB(TdB, TdA)); + } + { + V Tdc, Tdj, Tdo, Tdr; + Tdc = VSUB(Td8, Tdb); + Tdj = VSUB(Tdf, Tdi); + Tdk = VMUL(LDK(KP707106781), VADD(Tdc, Tdj)); + Tdt = VMUL(LDK(KP707106781), VSUB(Tdj, Tdc)); + Tdo = VADD(Tdm, Tdn); + Tdr = VADD(Tdp, Tdq); + Tds = VSUB(Tdo, Tdr); + Tdy = VADD(Tdr, Tdo); + } + Tdz = VADD(Tdx, Tdy); + ST(&(xo[WS(os, 64)]), VSUB(Tdz, TdC), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tdz, TdC), ovs, &(xo[0])); + TdD = VSUB(Tdx, Tdy); + ST(&(xo[WS(os, 96)]), VSUB(TdD, TdE), ovs, &(xo[0])); + ST(&(xo[WS(os, 32)]), VADD(TdD, TdE), ovs, &(xo[0])); + { + V Tdl, Tdu, Tdv, Tdw; + Tdl = VADD(Td5, Tdk); + Tdu = VBYI(VADD(Tds, Tdt)); + ST(&(xo[WS(os, 112)]), VSUB(Tdl, Tdu), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VADD(Tdl, Tdu), ovs, &(xo[0])); + Tdv = VSUB(Td5, Tdk); + Tdw = VBYI(VSUB(Tdt, Tds)); + ST(&(xo[WS(os, 80)]), VSUB(Tdv, Tdw), ovs, &(xo[0])); + ST(&(xo[WS(os, 48)]), VADD(Tdv, Tdw), ovs, &(xo[0])); + } + } + { + V TdJ, Te4, TdX, Te5, TdQ, Te1, TdU, Te2; + { + V TdF, TdI, TdV, TdW; + TdF = VSUB(TcZ, Td0); + TdI = VMUL(LDK(KP707106781), VADD(TdG, TdH)); + TdJ = VADD(TdF, TdI); + Te4 = VSUB(TdF, TdI); + TdV = VFNMS(LDK(KP382683432), TdK, VMUL(LDK(KP923879532), TdL)); + TdW = VFMA(LDK(KP382683432), TdN, VMUL(LDK(KP923879532), TdO)); + TdX = VADD(TdV, TdW); + Te5 = VSUB(TdW, TdV); + } + { + V TdM, TdP, TdS, TdT; + TdM = VFMA(LDK(KP923879532), TdK, VMUL(LDK(KP382683432), TdL)); + TdP = VFNMS(LDK(KP382683432), TdO, VMUL(LDK(KP923879532), TdN)); + TdQ = VADD(TdM, TdP); + Te1 = VSUB(TdP, TdM); + TdS = VSUB(Td3, Td2); + TdT = VMUL(LDK(KP707106781), VSUB(TdH, TdG)); + TdU = VADD(TdS, TdT); + Te2 = VSUB(TdT, TdS); + } + { + V TdR, TdY, Te7, Te8; + TdR = VADD(TdJ, TdQ); + TdY = VBYI(VADD(TdU, TdX)); + ST(&(xo[WS(os, 120)]), VSUB(TdR, TdY), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(TdR, TdY), ovs, &(xo[0])); + Te7 = VBYI(VADD(Te2, Te1)); + Te8 = VADD(Te4, Te5); + ST(&(xo[WS(os, 24)]), VADD(Te7, Te8), ovs, &(xo[0])); + ST(&(xo[WS(os, 104)]), VSUB(Te8, Te7), ovs, &(xo[0])); + } + { + V TdZ, Te0, Te3, Te6; + TdZ = VSUB(TdJ, TdQ); + Te0 = VBYI(VSUB(TdX, TdU)); + ST(&(xo[WS(os, 72)]), VSUB(TdZ, Te0), ovs, &(xo[0])); + ST(&(xo[WS(os, 56)]), VADD(TdZ, Te0), ovs, &(xo[0])); + Te3 = VBYI(VSUB(Te1, Te2)); + Te6 = VSUB(Te4, Te5); + ST(&(xo[WS(os, 40)]), VADD(Te3, Te6), ovs, &(xo[0])); + ST(&(xo[WS(os, 88)]), VSUB(Te6, Te3), ovs, &(xo[0])); + } + } + { + V TaZ, Tcs, Tci, Tcq, Tc4, Tct, Tcl, Tcp; + { + V Tat, TaY, Tce, Tch; + Tat = VADD(Tad, Tas); + TaY = VADD(TaI, TaX); + TaZ = VADD(Tat, TaY); + Tcs = VSUB(Tat, TaY); + Tce = VADD(Tcc, Tcd); + Tch = VADD(Tcf, Tcg); + Tci = VADD(Tce, Tch); + Tcq = VSUB(Tch, Tce); + { + V Tbw, Tcj, Tc3, Tck; + { + V Tbm, Tbv, TbT, Tc2; + Tbm = VADD(Tb6, Tbl); + Tbv = VADD(Tbt, Tbu); + Tbw = VFMA(LDK(KP980785280), Tbm, VMUL(LDK(KP195090322), Tbv)); + Tcj = VFNMS(LDK(KP195090322), Tbm, VMUL(LDK(KP980785280), Tbv)); + TbT = VADD(TbD, TbS); + Tc2 = VADD(Tc0, Tc1); + Tc3 = VFNMS(LDK(KP195090322), Tc2, VMUL(LDK(KP980785280), TbT)); + Tck = VFMA(LDK(KP195090322), TbT, VMUL(LDK(KP980785280), Tc2)); + } + Tc4 = VADD(Tbw, Tc3); + Tct = VSUB(Tck, Tcj); + Tcl = VADD(Tcj, Tck); + Tcp = VSUB(Tc3, Tbw); + } + } + { + V Tc5, Tcm, Tcv, Tcw; + Tc5 = VADD(TaZ, Tc4); + Tcm = VBYI(VADD(Tci, Tcl)); + ST(&(xo[WS(os, 124)]), VSUB(Tc5, Tcm), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(Tc5, Tcm), ovs, &(xo[0])); + Tcv = VBYI(VADD(Tcq, Tcp)); + Tcw = VADD(Tcs, Tct); + ST(&(xo[WS(os, 28)]), VADD(Tcv, Tcw), ovs, &(xo[0])); + ST(&(xo[WS(os, 100)]), VSUB(Tcw, Tcv), ovs, &(xo[0])); + } + { + V Tcn, Tco, Tcr, Tcu; + Tcn = VSUB(TaZ, Tc4); + Tco = VBYI(VSUB(Tcl, Tci)); + ST(&(xo[WS(os, 68)]), VSUB(Tcn, Tco), ovs, &(xo[0])); + ST(&(xo[WS(os, 60)]), VADD(Tcn, Tco), ovs, &(xo[0])); + Tcr = VBYI(VSUB(Tcp, Tcq)); + Tcu = VSUB(Tcs, Tct); + ST(&(xo[WS(os, 36)]), VADD(Tcr, Tcu), ovs, &(xo[0])); + ST(&(xo[WS(os, 92)]), VSUB(Tcu, Tcr), ovs, &(xo[0])); + } + } + { + V Tcz, TcU, TcK, TcS, TcG, TcV, TcN, TcR; + { + V Tcx, Tcy, TcI, TcJ; + Tcx = VSUB(Tad, Tas); + Tcy = VSUB(Tcg, Tcf); + Tcz = VADD(Tcx, Tcy); + TcU = VSUB(Tcx, Tcy); + TcI = VSUB(Tcd, Tcc); + TcJ = VSUB(TaX, TaI); + TcK = VADD(TcI, TcJ); + TcS = VSUB(TcJ, TcI); + { + V TcC, TcL, TcF, TcM; + { + V TcA, TcB, TcD, TcE; + TcA = VSUB(Tb6, Tbl); + TcB = VSUB(Tbu, Tbt); + TcC = VFMA(LDK(KP831469612), TcA, VMUL(LDK(KP555570233), TcB)); + TcL = VFNMS(LDK(KP555570233), TcA, VMUL(LDK(KP831469612), TcB)); + TcD = VSUB(TbD, TbS); + TcE = VSUB(Tc1, Tc0); + TcF = VFNMS(LDK(KP555570233), TcE, VMUL(LDK(KP831469612), TcD)); + TcM = VFMA(LDK(KP555570233), TcD, VMUL(LDK(KP831469612), TcE)); + } + TcG = VADD(TcC, TcF); + TcV = VSUB(TcM, TcL); + TcN = VADD(TcL, TcM); + TcR = VSUB(TcF, TcC); + } + } + { + V TcH, TcO, TcX, TcY; + TcH = VADD(Tcz, TcG); + TcO = VBYI(VADD(TcK, TcN)); + ST(&(xo[WS(os, 116)]), VSUB(TcH, TcO), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VADD(TcH, TcO), ovs, &(xo[0])); + TcX = VBYI(VADD(TcS, TcR)); + TcY = VADD(TcU, TcV); + ST(&(xo[WS(os, 20)]), VADD(TcX, TcY), ovs, &(xo[0])); + ST(&(xo[WS(os, 108)]), VSUB(TcY, TcX), ovs, &(xo[0])); + } + { + V TcP, TcQ, TcT, TcW; + TcP = VSUB(Tcz, TcG); + TcQ = VBYI(VSUB(TcN, TcK)); + ST(&(xo[WS(os, 76)]), VSUB(TcP, TcQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VADD(TcP, TcQ), ovs, &(xo[0])); + TcT = VBYI(VSUB(TcR, TcS)); + TcW = VSUB(TcU, TcV); + ST(&(xo[WS(os, 44)]), VADD(TcT, TcW), ovs, &(xo[0])); + ST(&(xo[WS(os, 84)]), VSUB(TcW, TcT), ovs, &(xo[0])); + } + } + { + V TeF, Tg8, TfI, Tg0, Tfy, Tga, TfG, TfP, Tfm, TfJ, TfB, TfF, TfW, Tgb, Tg3; + V Tg7; + { + V Tel, TfY, TeE, TfZ, Teu, TeD; + Tel = VADD(Ted, Tek); + TfY = VSUB(Tft, Tfq); + Teu = VFMA(LDK(KP980785280), Teq, VMUL(LDK(KP195090322), Tet)); + TeD = VFNMS(LDK(KP195090322), TeC, VMUL(LDK(KP980785280), Tez)); + TeE = VADD(Teu, TeD); + TfZ = VSUB(TeD, Teu); + TeF = VADD(Tel, TeE); + Tg8 = VSUB(TfZ, TfY); + TfI = VSUB(Tel, TeE); + Tg0 = VADD(TfY, TfZ); + } + { + V Tfu, TfN, Tfx, TfO, Tfv, Tfw; + Tfu = VADD(Tfq, Tft); + TfN = VSUB(Ted, Tek); + Tfv = VFNMS(LDK(KP195090322), Teq, VMUL(LDK(KP980785280), Tet)); + Tfw = VFMA(LDK(KP195090322), Tez, VMUL(LDK(KP980785280), TeC)); + Tfx = VADD(Tfv, Tfw); + TfO = VSUB(Tfw, Tfv); + Tfy = VADD(Tfu, Tfx); + Tga = VSUB(TfN, TfO); + TfG = VSUB(Tfx, Tfu); + TfP = VADD(TfN, TfO); + } + { + V Tf0, Tfz, Tfl, TfA; + { + V TeS, TeZ, Tfd, Tfk; + TeS = VADD(TeK, TeR); + TeZ = VADD(TeV, TeY); + Tf0 = VFMA(LDK(KP995184726), TeS, VMUL(LDK(KP098017140), TeZ)); + Tfz = VFNMS(LDK(KP098017140), TeS, VMUL(LDK(KP995184726), TeZ)); + Tfd = VADD(Tf5, Tfc); + Tfk = VADD(Tfg, Tfj); + Tfl = VFNMS(LDK(KP098017140), Tfk, VMUL(LDK(KP995184726), Tfd)); + TfA = VFMA(LDK(KP098017140), Tfd, VMUL(LDK(KP995184726), Tfk)); + } + Tfm = VADD(Tf0, Tfl); + TfJ = VSUB(TfA, Tfz); + TfB = VADD(Tfz, TfA); + TfF = VSUB(Tfl, Tf0); + } + { + V TfS, Tg1, TfV, Tg2; + { + V TfQ, TfR, TfT, TfU; + TfQ = VSUB(TeK, TeR); + TfR = VSUB(TeY, TeV); + TfS = VFMA(LDK(KP773010453), TfQ, VMUL(LDK(KP634393284), TfR)); + Tg1 = VFNMS(LDK(KP634393284), TfQ, VMUL(LDK(KP773010453), TfR)); + TfT = VSUB(Tf5, Tfc); + TfU = VSUB(Tfj, Tfg); + TfV = VFNMS(LDK(KP634393284), TfU, VMUL(LDK(KP773010453), TfT)); + Tg2 = VFMA(LDK(KP634393284), TfT, VMUL(LDK(KP773010453), TfU)); + } + TfW = VADD(TfS, TfV); + Tgb = VSUB(Tg2, Tg1); + Tg3 = VADD(Tg1, Tg2); + Tg7 = VSUB(TfV, TfS); + } + { + V Tfn, TfC, Tg9, Tgc; + Tfn = VADD(TeF, Tfm); + TfC = VBYI(VADD(Tfy, TfB)); + ST(&(xo[WS(os, 126)]), VSUB(Tfn, TfC), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(Tfn, TfC), ovs, &(xo[0])); + Tg9 = VBYI(VSUB(Tg7, Tg8)); + Tgc = VSUB(Tga, Tgb); + ST(&(xo[WS(os, 46)]), VADD(Tg9, Tgc), ovs, &(xo[0])); + ST(&(xo[WS(os, 82)]), VSUB(Tgc, Tg9), ovs, &(xo[0])); + } + { + V Tgd, Tge, TfD, TfE; + Tgd = VBYI(VADD(Tg8, Tg7)); + Tge = VADD(Tga, Tgb); + ST(&(xo[WS(os, 18)]), VADD(Tgd, Tge), ovs, &(xo[0])); + ST(&(xo[WS(os, 110)]), VSUB(Tge, Tgd), ovs, &(xo[0])); + TfD = VSUB(TeF, Tfm); + TfE = VBYI(VSUB(TfB, Tfy)); + ST(&(xo[WS(os, 66)]), VSUB(TfD, TfE), ovs, &(xo[0])); + ST(&(xo[WS(os, 62)]), VADD(TfD, TfE), ovs, &(xo[0])); + } + { + V TfH, TfK, TfX, Tg4; + TfH = VBYI(VSUB(TfF, TfG)); + TfK = VSUB(TfI, TfJ); + ST(&(xo[WS(os, 34)]), VADD(TfH, TfK), ovs, &(xo[0])); + ST(&(xo[WS(os, 94)]), VSUB(TfK, TfH), ovs, &(xo[0])); + TfX = VADD(TfP, TfW); + Tg4 = VBYI(VADD(Tg0, Tg3)); + ST(&(xo[WS(os, 114)]), VSUB(TfX, Tg4), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VADD(TfX, Tg4), ovs, &(xo[0])); + } + { + V Tg5, Tg6, TfL, TfM; + Tg5 = VSUB(TfP, TfW); + Tg6 = VBYI(VSUB(Tg3, Tg0)); + ST(&(xo[WS(os, 78)]), VSUB(Tg5, Tg6), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VADD(Tg5, Tg6), ovs, &(xo[0])); + TfL = VBYI(VADD(TfG, TfF)); + TfM = VADD(TfI, TfJ); + ST(&(xo[WS(os, 30)]), VADD(TfL, TfM), ovs, &(xo[0])); + ST(&(xo[WS(os, 98)]), VSUB(TfM, TfL), ovs, &(xo[0])); + } + } + { + V Tgp, Thm, TgW, The, TgM, Tho, TgU, Th3, TgE, TgX, TgP, TgT, Tha, Thp, Thh; + V Thl; + { + V Tgh, Thc, Tgo, Thd, Tgk, Tgn; + Tgh = VSUB(Tgf, Tgg); + Thc = VADD(TgH, TgG); + Tgk = VFMA(LDK(KP555570233), Tgi, VMUL(LDK(KP831469612), Tgj)); + Tgn = VFNMS(LDK(KP555570233), Tgm, VMUL(LDK(KP831469612), Tgl)); + Tgo = VSUB(Tgk, Tgn); + Thd = VADD(Tgn, Tgk); + Tgp = VADD(Tgh, Tgo); + Thm = VSUB(Thd, Thc); + TgW = VSUB(Tgh, Tgo); + The = VADD(Thc, Thd); + } + { + V TgI, Th1, TgL, Th2, TgJ, TgK; + TgI = VSUB(TgG, TgH); + Th1 = VADD(Tgf, Tgg); + TgJ = VFNMS(LDK(KP555570233), Tgj, VMUL(LDK(KP831469612), Tgi)); + TgK = VFMA(LDK(KP831469612), Tgm, VMUL(LDK(KP555570233), Tgl)); + TgL = VSUB(TgJ, TgK); + Th2 = VADD(TgK, TgJ); + TgM = VADD(TgI, TgL); + Tho = VSUB(Th1, Th2); + TgU = VSUB(TgL, TgI); + Th3 = VADD(Th1, Th2); + } + { + V Tgw, TgN, TgD, TgO; + { + V Tgs, Tgv, Tgz, TgC; + Tgs = VSUB(Tgq, Tgr); + Tgv = VSUB(Tgt, Tgu); + Tgw = VFMA(LDK(KP471396736), Tgs, VMUL(LDK(KP881921264), Tgv)); + TgN = VFNMS(LDK(KP471396736), Tgv, VMUL(LDK(KP881921264), Tgs)); + Tgz = VSUB(Tgx, Tgy); + TgC = VSUB(TgA, TgB); + TgD = VFNMS(LDK(KP471396736), TgC, VMUL(LDK(KP881921264), Tgz)); + TgO = VFMA(LDK(KP881921264), TgC, VMUL(LDK(KP471396736), Tgz)); + } + TgE = VADD(Tgw, TgD); + TgX = VSUB(TgO, TgN); + TgP = VADD(TgN, TgO); + TgT = VSUB(TgD, Tgw); + } + { + V Th6, Thf, Th9, Thg; + { + V Th4, Th5, Th7, Th8; + Th4 = VADD(Tgr, Tgq); + Th5 = VADD(Tgt, Tgu); + Th6 = VFMA(LDK(KP290284677), Th4, VMUL(LDK(KP956940335), Th5)); + Thf = VFNMS(LDK(KP290284677), Th5, VMUL(LDK(KP956940335), Th4)); + Th7 = VADD(Tgx, Tgy); + Th8 = VADD(TgB, TgA); + Th9 = VFNMS(LDK(KP290284677), Th8, VMUL(LDK(KP956940335), Th7)); + Thg = VFMA(LDK(KP956940335), Th8, VMUL(LDK(KP290284677), Th7)); + } + Tha = VADD(Th6, Th9); + Thp = VSUB(Thg, Thf); + Thh = VADD(Thf, Thg); + Thl = VSUB(Th9, Th6); + } + { + V TgF, TgQ, Thn, Thq; + TgF = VADD(Tgp, TgE); + TgQ = VBYI(VADD(TgM, TgP)); + ST(&(xo[WS(os, 118)]), VSUB(TgF, TgQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VADD(TgF, TgQ), ovs, &(xo[0])); + Thn = VBYI(VSUB(Thl, Thm)); + Thq = VSUB(Tho, Thp); + ST(&(xo[WS(os, 38)]), VADD(Thn, Thq), ovs, &(xo[0])); + ST(&(xo[WS(os, 90)]), VSUB(Thq, Thn), ovs, &(xo[0])); + } + { + V Thr, Ths, TgR, TgS; + Thr = VBYI(VADD(Thm, Thl)); + Ths = VADD(Tho, Thp); + ST(&(xo[WS(os, 26)]), VADD(Thr, Ths), ovs, &(xo[0])); + ST(&(xo[WS(os, 102)]), VSUB(Ths, Thr), ovs, &(xo[0])); + TgR = VSUB(Tgp, TgE); + TgS = VBYI(VSUB(TgP, TgM)); + ST(&(xo[WS(os, 74)]), VSUB(TgR, TgS), ovs, &(xo[0])); + ST(&(xo[WS(os, 54)]), VADD(TgR, TgS), ovs, &(xo[0])); + } + { + V TgV, TgY, Thb, Thi; + TgV = VBYI(VSUB(TgT, TgU)); + TgY = VSUB(TgW, TgX); + ST(&(xo[WS(os, 42)]), VADD(TgV, TgY), ovs, &(xo[0])); + ST(&(xo[WS(os, 86)]), VSUB(TgY, TgV), ovs, &(xo[0])); + Thb = VADD(Th3, Tha); + Thi = VBYI(VADD(The, Thh)); + ST(&(xo[WS(os, 122)]), VSUB(Thb, Thi), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VADD(Thb, Thi), ovs, &(xo[0])); + } + { + V Thj, Thk, TgZ, Th0; + Thj = VSUB(Th3, Tha); + Thk = VBYI(VSUB(Thh, The)); + ST(&(xo[WS(os, 70)]), VSUB(Thj, Thk), ovs, &(xo[0])); + ST(&(xo[WS(os, 58)]), VADD(Thj, Thk), ovs, &(xo[0])); + TgZ = VBYI(VADD(TgU, TgT)); + Th0 = VADD(TgW, TgX); + ST(&(xo[WS(os, 22)]), VADD(TgZ, Th0), ovs, &(xo[0])); + ST(&(xo[WS(os, 106)]), VSUB(Th0, TgZ), ovs, &(xo[0])); + } + } + { + V T80, T8n, T8f, T8j, T8A, T8P, T8H, T8L, T7n, T8M, T8O, T8c, T8k, T8t, T8E; + V T8m; + { + V T7G, T8d, T7Z, T8e; + { + V T7y, T7F, T7R, T7Y; + T7y = VADD(T7q, T7x); + T7F = VADD(T7B, T7E); + T7G = VFMA(LDK(KP989176509), T7y, VMUL(LDK(KP146730474), T7F)); + T8d = VFNMS(LDK(KP146730474), T7y, VMUL(LDK(KP989176509), T7F)); + T7R = VADD(T7J, T7Q); + T7Y = VADD(T7U, T7X); + T7Z = VFNMS(LDK(KP146730474), T7Y, VMUL(LDK(KP989176509), T7R)); + T8e = VFMA(LDK(KP146730474), T7R, VMUL(LDK(KP989176509), T7Y)); + } + T80 = VADD(T7G, T7Z); + T8n = VSUB(T8e, T8d); + T8f = VADD(T8d, T8e); + T8j = VSUB(T7Z, T7G); + } + { + V T8w, T8F, T8z, T8G; + { + V T8u, T8v, T8x, T8y; + T8u = VSUB(T7q, T7x); + T8v = VSUB(T7E, T7B); + T8w = VFMA(LDK(KP803207531), T8u, VMUL(LDK(KP595699304), T8v)); + T8F = VFNMS(LDK(KP595699304), T8u, VMUL(LDK(KP803207531), T8v)); + T8x = VSUB(T7J, T7Q); + T8y = VSUB(T7X, T7U); + T8z = VFNMS(LDK(KP595699304), T8y, VMUL(LDK(KP803207531), T8x)); + T8G = VFMA(LDK(KP595699304), T8x, VMUL(LDK(KP803207531), T8y)); + } + T8A = VADD(T8w, T8z); + T8P = VSUB(T8G, T8F); + T8H = VADD(T8F, T8G); + T8L = VSUB(T8z, T8w); + } + { + V T77, T8r, T88, T8C, T7m, T8D, T8b, T8s, T76, T87; + T76 = VADD(T72, T75); + T77 = VADD(T6Z, T76); + T8r = VSUB(T6Z, T76); + T87 = VADD(T85, T86); + T88 = VADD(T84, T87); + T8C = VSUB(T87, T84); + { + V T7e, T7l, T89, T8a; + T7e = VFMA(LDK(KP956940335), T7a, VMUL(LDK(KP290284677), T7d)); + T7l = VFNMS(LDK(KP290284677), T7k, VMUL(LDK(KP956940335), T7h)); + T7m = VADD(T7e, T7l); + T8D = VSUB(T7l, T7e); + T89 = VFNMS(LDK(KP290284677), T7a, VMUL(LDK(KP956940335), T7d)); + T8a = VFMA(LDK(KP290284677), T7h, VMUL(LDK(KP956940335), T7k)); + T8b = VADD(T89, T8a); + T8s = VSUB(T8a, T89); + } + T7n = VADD(T77, T7m); + T8M = VSUB(T8D, T8C); + T8O = VSUB(T8r, T8s); + T8c = VADD(T88, T8b); + T8k = VSUB(T8b, T88); + T8t = VADD(T8r, T8s); + T8E = VADD(T8C, T8D); + T8m = VSUB(T77, T7m); + } + { + V T81, T8g, T8N, T8Q; + T81 = VADD(T7n, T80); + T8g = VBYI(VADD(T8c, T8f)); + ST(&(xo[WS(os, 125)]), VSUB(T81, T8g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(T81, T8g), ovs, &(xo[WS(os, 1)])); + T8N = VBYI(VSUB(T8L, T8M)); + T8Q = VSUB(T8O, T8P); + ST(&(xo[WS(os, 45)]), VADD(T8N, T8Q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 83)]), VSUB(T8Q, T8N), ovs, &(xo[WS(os, 1)])); + } + { + V T8R, T8S, T8h, T8i; + T8R = VBYI(VADD(T8M, T8L)); + T8S = VADD(T8O, T8P); + ST(&(xo[WS(os, 19)]), VADD(T8R, T8S), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 109)]), VSUB(T8S, T8R), ovs, &(xo[WS(os, 1)])); + T8h = VSUB(T7n, T80); + T8i = VBYI(VSUB(T8f, T8c)); + ST(&(xo[WS(os, 67)]), VSUB(T8h, T8i), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 61)]), VADD(T8h, T8i), ovs, &(xo[WS(os, 1)])); + } + { + V T8l, T8o, T8B, T8I; + T8l = VBYI(VSUB(T8j, T8k)); + T8o = VSUB(T8m, T8n); + ST(&(xo[WS(os, 35)]), VADD(T8l, T8o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 93)]), VSUB(T8o, T8l), ovs, &(xo[WS(os, 1)])); + T8B = VADD(T8t, T8A); + T8I = VBYI(VADD(T8E, T8H)); + ST(&(xo[WS(os, 115)]), VSUB(T8B, T8I), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VADD(T8B, T8I), ovs, &(xo[WS(os, 1)])); + } + { + V T8J, T8K, T8p, T8q; + T8J = VSUB(T8t, T8A); + T8K = VBYI(VSUB(T8H, T8E)); + ST(&(xo[WS(os, 77)]), VSUB(T8J, T8K), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 51)]), VADD(T8J, T8K), ovs, &(xo[WS(os, 1)])); + T8p = VBYI(VADD(T8k, T8j)); + T8q = VADD(T8m, T8n); + ST(&(xo[WS(os, 29)]), VADD(T8p, T8q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 99)]), VSUB(T8q, T8p), ovs, &(xo[WS(os, 1)])); + } + } + { + V T4K, T5d, T55, T59, T5q, T5F, T5x, T5B, T2f, T5C, T5E, T52, T5a, T5j, T5u; + V T5c; + { + V T3u, T53, T4J, T54; + { + V T3g, T3t, T4v, T4I; + T3g = VADD(T2G, T3f); + T3t = VADD(T3p, T3s); + T3u = VFMA(LDK(KP998795456), T3g, VMUL(LDK(KP049067674), T3t)); + T53 = VFNMS(LDK(KP049067674), T3g, VMUL(LDK(KP998795456), T3t)); + T4v = VADD(T3V, T4u); + T4I = VADD(T4E, T4H); + T4J = VFNMS(LDK(KP049067674), T4I, VMUL(LDK(KP998795456), T4v)); + T54 = VFMA(LDK(KP049067674), T4v, VMUL(LDK(KP998795456), T4I)); + } + T4K = VADD(T3u, T4J); + T5d = VSUB(T54, T53); + T55 = VADD(T53, T54); + T59 = VSUB(T4J, T3u); + } + { + V T5m, T5v, T5p, T5w; + { + V T5k, T5l, T5n, T5o; + T5k = VSUB(T2G, T3f); + T5l = VSUB(T3s, T3p); + T5m = VFMA(LDK(KP740951125), T5k, VMUL(LDK(KP671558954), T5l)); + T5v = VFNMS(LDK(KP671558954), T5k, VMUL(LDK(KP740951125), T5l)); + T5n = VSUB(T3V, T4u); + T5o = VSUB(T4H, T4E); + T5p = VFNMS(LDK(KP671558954), T5o, VMUL(LDK(KP740951125), T5n)); + T5w = VFMA(LDK(KP671558954), T5n, VMUL(LDK(KP740951125), T5o)); + } + T5q = VADD(T5m, T5p); + T5F = VSUB(T5w, T5v); + T5x = VADD(T5v, T5w); + T5B = VSUB(T5p, T5m); + } + { + V T11, T5h, T4Y, T5s, T2e, T5t, T51, T5i, T10, T4X; + T10 = VADD(TI, TZ); + T11 = VADD(Tr, T10); + T5h = VSUB(Tr, T10); + T4X = VADD(T4V, T4W); + T4Y = VADD(T4U, T4X); + T5s = VSUB(T4X, T4U); + { + V T1C, T2d, T4Z, T50; + T1C = VFMA(LDK(KP098017140), T1s, VMUL(LDK(KP995184726), T1B)); + T2d = VFNMS(LDK(KP098017140), T2c, VMUL(LDK(KP995184726), T23)); + T2e = VADD(T1C, T2d); + T5t = VSUB(T2d, T1C); + T4Z = VFNMS(LDK(KP098017140), T1B, VMUL(LDK(KP995184726), T1s)); + T50 = VFMA(LDK(KP995184726), T2c, VMUL(LDK(KP098017140), T23)); + T51 = VADD(T4Z, T50); + T5i = VSUB(T50, T4Z); + } + T2f = VADD(T11, T2e); + T5C = VSUB(T5t, T5s); + T5E = VSUB(T5h, T5i); + T52 = VADD(T4Y, T51); + T5a = VSUB(T51, T4Y); + T5j = VADD(T5h, T5i); + T5u = VADD(T5s, T5t); + T5c = VSUB(T11, T2e); + } + { + V T4L, T56, T5D, T5G; + T4L = VADD(T2f, T4K); + T56 = VBYI(VADD(T52, T55)); + ST(&(xo[WS(os, 127)]), VSUB(T4L, T56), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(T4L, T56), ovs, &(xo[WS(os, 1)])); + T5D = VBYI(VSUB(T5B, T5C)); + T5G = VSUB(T5E, T5F); + ST(&(xo[WS(os, 47)]), VADD(T5D, T5G), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 81)]), VSUB(T5G, T5D), ovs, &(xo[WS(os, 1)])); + } + { + V T5H, T5I, T57, T58; + T5H = VBYI(VADD(T5C, T5B)); + T5I = VADD(T5E, T5F); + ST(&(xo[WS(os, 17)]), VADD(T5H, T5I), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 111)]), VSUB(T5I, T5H), ovs, &(xo[WS(os, 1)])); + T57 = VSUB(T2f, T4K); + T58 = VBYI(VSUB(T55, T52)); + ST(&(xo[WS(os, 65)]), VSUB(T57, T58), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 63)]), VADD(T57, T58), ovs, &(xo[WS(os, 1)])); + } + { + V T5b, T5e, T5r, T5y; + T5b = VBYI(VSUB(T59, T5a)); + T5e = VSUB(T5c, T5d); + ST(&(xo[WS(os, 33)]), VADD(T5b, T5e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 95)]), VSUB(T5e, T5b), ovs, &(xo[WS(os, 1)])); + T5r = VADD(T5j, T5q); + T5y = VBYI(VADD(T5u, T5x)); + ST(&(xo[WS(os, 113)]), VSUB(T5r, T5y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VADD(T5r, T5y), ovs, &(xo[WS(os, 1)])); + } + { + V T5z, T5A, T5f, T5g; + T5z = VSUB(T5j, T5q); + T5A = VBYI(VSUB(T5x, T5u)); + ST(&(xo[WS(os, 79)]), VSUB(T5z, T5A), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 49)]), VADD(T5z, T5A), ovs, &(xo[WS(os, 1)])); + T5f = VBYI(VADD(T5a, T59)); + T5g = VADD(T5c, T5d); + ST(&(xo[WS(os, 31)]), VADD(T5f, T5g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 97)]), VSUB(T5g, T5f), ovs, &(xo[WS(os, 1)])); + } + } + { + V T9i, T9B, T9t, T9x, T9O, Ta3, T9V, T9Z, T93, Ta0, Ta2, T9q, T9y, T9H, T9S; + V T9A; + { + V T9a, T9r, T9h, T9s; + { + V T96, T99, T9d, T9g; + T96 = VSUB(T94, T95); + T99 = VSUB(T97, T98); + T9a = VFMA(LDK(KP514102744), T96, VMUL(LDK(KP857728610), T99)); + T9r = VFNMS(LDK(KP514102744), T99, VMUL(LDK(KP857728610), T96)); + T9d = VSUB(T9b, T9c); + T9g = VSUB(T9e, T9f); + T9h = VFNMS(LDK(KP514102744), T9g, VMUL(LDK(KP857728610), T9d)); + T9s = VFMA(LDK(KP857728610), T9g, VMUL(LDK(KP514102744), T9d)); + } + T9i = VADD(T9a, T9h); + T9B = VSUB(T9s, T9r); + T9t = VADD(T9r, T9s); + T9x = VSUB(T9h, T9a); + } + { + V T9K, T9T, T9N, T9U; + { + V T9I, T9J, T9L, T9M; + T9I = VADD(T95, T94); + T9J = VADD(T97, T98); + T9K = VFMA(LDK(KP242980179), T9I, VMUL(LDK(KP970031253), T9J)); + T9T = VFNMS(LDK(KP242980179), T9J, VMUL(LDK(KP970031253), T9I)); + T9L = VADD(T9b, T9c); + T9M = VADD(T9f, T9e); + T9N = VFNMS(LDK(KP242980179), T9M, VMUL(LDK(KP970031253), T9L)); + T9U = VFMA(LDK(KP970031253), T9M, VMUL(LDK(KP242980179), T9L)); + } + T9O = VADD(T9K, T9N); + Ta3 = VSUB(T9U, T9T); + T9V = VADD(T9T, T9U); + T9Z = VSUB(T9N, T9K); + } + { + V T8V, T9F, T9m, T9Q, T92, T9R, T9p, T9G, T8U, T9k; + T8U = VSUB(T86, T85); + T8V = VSUB(T8T, T8U); + T9F = VADD(T8T, T8U); + T9k = VSUB(T75, T72); + T9m = VSUB(T9k, T9l); + T9Q = VADD(T9l, T9k); + { + V T8Y, T91, T9n, T9o; + T8Y = VFMA(LDK(KP471396736), T8W, VMUL(LDK(KP881921264), T8X)); + T91 = VFNMS(LDK(KP471396736), T90, VMUL(LDK(KP881921264), T8Z)); + T92 = VSUB(T8Y, T91); + T9R = VADD(T91, T8Y); + T9n = VFNMS(LDK(KP471396736), T8X, VMUL(LDK(KP881921264), T8W)); + T9o = VFMA(LDK(KP881921264), T90, VMUL(LDK(KP471396736), T8Z)); + T9p = VSUB(T9n, T9o); + T9G = VADD(T9o, T9n); + } + T93 = VADD(T8V, T92); + Ta0 = VSUB(T9R, T9Q); + Ta2 = VSUB(T9F, T9G); + T9q = VADD(T9m, T9p); + T9y = VSUB(T9p, T9m); + T9H = VADD(T9F, T9G); + T9S = VADD(T9Q, T9R); + T9A = VSUB(T8V, T92); + } + { + V T9j, T9u, Ta1, Ta4; + T9j = VADD(T93, T9i); + T9u = VBYI(VADD(T9q, T9t)); + ST(&(xo[WS(os, 117)]), VSUB(T9j, T9u), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VADD(T9j, T9u), ovs, &(xo[WS(os, 1)])); + Ta1 = VBYI(VSUB(T9Z, Ta0)); + Ta4 = VSUB(Ta2, Ta3); + ST(&(xo[WS(os, 37)]), VADD(Ta1, Ta4), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 91)]), VSUB(Ta4, Ta1), ovs, &(xo[WS(os, 1)])); + } + { + V Ta5, Ta6, T9v, T9w; + Ta5 = VBYI(VADD(Ta0, T9Z)); + Ta6 = VADD(Ta2, Ta3); + ST(&(xo[WS(os, 27)]), VADD(Ta5, Ta6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 101)]), VSUB(Ta6, Ta5), ovs, &(xo[WS(os, 1)])); + T9v = VSUB(T93, T9i); + T9w = VBYI(VSUB(T9t, T9q)); + ST(&(xo[WS(os, 75)]), VSUB(T9v, T9w), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 53)]), VADD(T9v, T9w), ovs, &(xo[WS(os, 1)])); + } + { + V T9z, T9C, T9P, T9W; + T9z = VBYI(VSUB(T9x, T9y)); + T9C = VSUB(T9A, T9B); + ST(&(xo[WS(os, 43)]), VADD(T9z, T9C), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 85)]), VSUB(T9C, T9z), ovs, &(xo[WS(os, 1)])); + T9P = VADD(T9H, T9O); + T9W = VBYI(VADD(T9S, T9V)); + ST(&(xo[WS(os, 123)]), VSUB(T9P, T9W), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(T9P, T9W), ovs, &(xo[WS(os, 1)])); + } + { + V T9X, T9Y, T9D, T9E; + T9X = VSUB(T9H, T9O); + T9Y = VBYI(VSUB(T9V, T9S)); + ST(&(xo[WS(os, 69)]), VSUB(T9X, T9Y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 59)]), VADD(T9X, T9Y), ovs, &(xo[WS(os, 1)])); + T9D = VBYI(VADD(T9y, T9x)); + T9E = VADD(T9A, T9B); + ST(&(xo[WS(os, 21)]), VADD(T9D, T9E), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 107)]), VSUB(T9E, T9D), ovs, &(xo[WS(os, 1)])); + } + } + { + V T68, T6r, T6j, T6n, T6E, T6T, T6L, T6P, T5T, T6Q, T6S, T6g, T6o, T6x, T6I; + V T6q; + { + V T60, T6h, T67, T6i; + { + V T5W, T5Z, T63, T66; + T5W = VSUB(T5U, T5V); + T5Z = VSUB(T5X, T5Y); + T60 = VFMA(LDK(KP427555093), T5W, VMUL(LDK(KP903989293), T5Z)); + T6h = VFNMS(LDK(KP427555093), T5Z, VMUL(LDK(KP903989293), T5W)); + T63 = VSUB(T61, T62); + T66 = VSUB(T64, T65); + T67 = VFNMS(LDK(KP427555093), T66, VMUL(LDK(KP903989293), T63)); + T6i = VFMA(LDK(KP903989293), T66, VMUL(LDK(KP427555093), T63)); + } + T68 = VADD(T60, T67); + T6r = VSUB(T6i, T6h); + T6j = VADD(T6h, T6i); + T6n = VSUB(T67, T60); + } + { + V T6A, T6J, T6D, T6K; + { + V T6y, T6z, T6B, T6C; + T6y = VADD(T5V, T5U); + T6z = VADD(T5X, T5Y); + T6A = VFMA(LDK(KP336889853), T6y, VMUL(LDK(KP941544065), T6z)); + T6J = VFNMS(LDK(KP336889853), T6z, VMUL(LDK(KP941544065), T6y)); + T6B = VADD(T61, T62); + T6C = VADD(T65, T64); + T6D = VFNMS(LDK(KP336889853), T6C, VMUL(LDK(KP941544065), T6B)); + T6K = VFMA(LDK(KP941544065), T6C, VMUL(LDK(KP336889853), T6B)); + } + T6E = VADD(T6A, T6D); + T6T = VSUB(T6K, T6J); + T6L = VADD(T6J, T6K); + T6P = VSUB(T6D, T6A); + } + { + V T5L, T6v, T6c, T6G, T5S, T6H, T6f, T6w, T5K, T6a; + T5K = VSUB(T4W, T4V); + T5L = VSUB(T5J, T5K); + T6v = VADD(T5J, T5K); + T6a = VSUB(TZ, TI); + T6c = VSUB(T6a, T6b); + T6G = VADD(T6b, T6a); + { + V T5O, T5R, T6d, T6e; + T5O = VFMA(LDK(KP773010453), T5M, VMUL(LDK(KP634393284), T5N)); + T5R = VFNMS(LDK(KP634393284), T5Q, VMUL(LDK(KP773010453), T5P)); + T5S = VSUB(T5O, T5R); + T6H = VADD(T5R, T5O); + T6d = VFNMS(LDK(KP634393284), T5M, VMUL(LDK(KP773010453), T5N)); + T6e = VFMA(LDK(KP634393284), T5P, VMUL(LDK(KP773010453), T5Q)); + T6f = VSUB(T6d, T6e); + T6w = VADD(T6e, T6d); + } + T5T = VADD(T5L, T5S); + T6Q = VSUB(T6H, T6G); + T6S = VSUB(T6v, T6w); + T6g = VADD(T6c, T6f); + T6o = VSUB(T6f, T6c); + T6x = VADD(T6v, T6w); + T6I = VADD(T6G, T6H); + T6q = VSUB(T5L, T5S); + } + { + V T69, T6k, T6R, T6U; + T69 = VADD(T5T, T68); + T6k = VBYI(VADD(T6g, T6j)); + ST(&(xo[WS(os, 119)]), VSUB(T69, T6k), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(T69, T6k), ovs, &(xo[WS(os, 1)])); + T6R = VBYI(VSUB(T6P, T6Q)); + T6U = VSUB(T6S, T6T); + ST(&(xo[WS(os, 39)]), VADD(T6R, T6U), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 89)]), VSUB(T6U, T6R), ovs, &(xo[WS(os, 1)])); + } + { + V T6V, T6W, T6l, T6m; + T6V = VBYI(VADD(T6Q, T6P)); + T6W = VADD(T6S, T6T); + ST(&(xo[WS(os, 25)]), VADD(T6V, T6W), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 103)]), VSUB(T6W, T6V), ovs, &(xo[WS(os, 1)])); + T6l = VSUB(T5T, T68); + T6m = VBYI(VSUB(T6j, T6g)); + ST(&(xo[WS(os, 73)]), VSUB(T6l, T6m), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VADD(T6l, T6m), ovs, &(xo[WS(os, 1)])); + } + { + V T6p, T6s, T6F, T6M; + T6p = VBYI(VSUB(T6n, T6o)); + T6s = VSUB(T6q, T6r); + ST(&(xo[WS(os, 41)]), VADD(T6p, T6s), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 87)]), VSUB(T6s, T6p), ovs, &(xo[WS(os, 1)])); + T6F = VADD(T6x, T6E); + T6M = VBYI(VADD(T6I, T6L)); + ST(&(xo[WS(os, 121)]), VSUB(T6F, T6M), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(T6F, T6M), ovs, &(xo[WS(os, 1)])); + } + { + V T6N, T6O, T6t, T6u; + T6N = VSUB(T6x, T6E); + T6O = VBYI(VSUB(T6L, T6I)); + ST(&(xo[WS(os, 71)]), VSUB(T6N, T6O), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 57)]), VADD(T6N, T6O), ovs, &(xo[WS(os, 1)])); + T6t = VBYI(VADD(T6o, T6n)); + T6u = VADD(T6q, T6r); + ST(&(xo[WS(os, 23)]), VADD(T6t, T6u), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 105)]), VSUB(T6u, T6t), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 128, XSIMD_STRING("n1fv_128"), {938, 186, 144, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_128) (planner *p) { + X(kdft_register) (p, n1fv_128, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_13.c new file mode 100644 index 000000000..d4c82b53d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_13.c @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 13 -name n1fv_13 -include dft/simd/n1f.h */ + +/* + * This function contains 88 FP additions, 63 FP multiplications, + * (or, 31 additions, 6 multiplications, 57 fused multiply/add), + * 63 stack variables, 23 constants, and 26 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_13(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP904176221, +0.904176221990848204433795481776887926501523162); + DVK(KP575140729, +0.575140729474003121368385547455453388461001608); + DVK(KP957805992, +0.957805992594665126462521754605754580515587217); + DVK(KP600477271, +0.600477271932665282925769253334763009352012849); + DVK(KP516520780, +0.516520780623489722840901288569017135705033622); + DVK(KP581704778, +0.581704778510515730456870384989698884939833902); + DVK(KP300462606, +0.300462606288665774426601772289207995520941381); + DVK(KP503537032, +0.503537032863766627246873853868466977093348562); + DVK(KP251768516, +0.251768516431883313623436926934233488546674281); + DVK(KP301479260, +0.301479260047709873958013540496673347309208464); + DVK(KP083333333, +0.083333333333333333333333333333333333333333333); + DVK(KP859542535, +0.859542535098774820163672132761689612766401925); + DVK(KP514918778, +0.514918778086315755491789696138117261566051239); + DVK(KP522026385, +0.522026385161275033714027226654165028300441940); + DVK(KP853480001, +0.853480001859823990758994934970528322872359049); + DVK(KP612264650, +0.612264650376756543746494474777125408779395514); + DVK(KP038632954, +0.038632954644348171955506895830342264440241080); + DVK(KP302775637, +0.302775637731994646559610633735247973125648287); + DVK(KP769338817, +0.769338817572980603471413688209101117038278899); + DVK(KP686558370, +0.686558370781754340655719594850823015421401653); + DVK(KP226109445, +0.226109445035782405468510155372505010481906348); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(26, is), MAKE_VOLATILE_STRIDE(26, os)) { + V T1, TX, TY, To, TH, TR, TU, TB, TE, Tw, TF, TM, TT; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V Tf, TN, Tb, Ty, Tq, T6, Tx, Tr, Ti, Tt, Tl, Tu, Tm, TO, Td; + V Te, Tc, Tn; + Td = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + TN = VSUB(Td, Te); + { + V T7, T8, T9, Ta; + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Tb = VADD(T7, Ta); + Ty = VFMS(LDK(KP500000000), Ta, T7); + Tq = VSUB(T8, T9); + } + { + V T2, T3, T4, T5; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T4 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T5 = VADD(T3, T4); + T6 = VADD(T2, T5); + Tx = VFNMS(LDK(KP500000000), T5, T2); + Tr = VSUB(T4, T3); + } + { + V Tg, Th, Tj, Tk; + Tg = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = VADD(Tg, Th); + Tt = VSUB(Tg, Th); + Tj = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tk = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tl = VADD(Tj, Tk); + Tu = VSUB(Tj, Tk); + } + Tm = VADD(Ti, Tl); + TO = VADD(Tt, Tu); + TX = VSUB(T6, Tb); + TY = VADD(TN, TO); + Tc = VADD(T6, Tb); + Tn = VADD(Tf, Tm); + To = VADD(Tc, Tn); + TH = VSUB(Tc, Tn); + { + V TP, TQ, Tz, TA; + TP = VFNMS(LDK(KP500000000), TO, TN); + TQ = VADD(Tr, Tq); + TR = VFMA(LDK(KP866025403), TQ, TP); + TU = VFNMS(LDK(KP866025403), TQ, TP); + Tz = VSUB(Tx, Ty); + TA = VFNMS(LDK(KP500000000), Tm, Tf); + TB = VADD(Tz, TA); + TE = VSUB(Tz, TA); + } + { + V Ts, Tv, TK, TL; + Ts = VSUB(Tq, Tr); + Tv = VSUB(Tt, Tu); + Tw = VADD(Ts, Tv); + TF = VSUB(Ts, Tv); + TK = VADD(Tx, Ty); + TL = VSUB(Ti, Tl); + TM = VFMA(LDK(KP866025403), TL, TK); + TT = VFNMS(LDK(KP866025403), TL, TK); + } + } + ST(&(xo[0]), VADD(T1, To), ovs, &(xo[0])); + { + V T1c, T1k, T15, T14, T1e, T1n, TZ, TW, T1f, T1m, TD, T1j, TI, T19, TS; + V TV; + { + V T1a, T1b, T12, T13; + T1a = VFNMS(LDK(KP226109445), Tw, TB); + T1b = VFMA(LDK(KP686558370), TE, TF); + T1c = VFNMS(LDK(KP769338817), T1b, T1a); + T1k = VFMA(LDK(KP769338817), T1b, T1a); + T15 = VFNMS(LDK(KP302775637), TX, TY); + T12 = VFMA(LDK(KP038632954), TM, TR); + T13 = VFMA(LDK(KP612264650), TT, TU); + T14 = VFNMS(LDK(KP853480001), T13, T12); + T1e = VFNMS(LDK(KP522026385), T14, T15); + T1n = VFMA(LDK(KP853480001), T13, T12); + } + TZ = VFMA(LDK(KP302775637), TY, TX); + TS = VFNMS(LDK(KP038632954), TR, TM); + TV = VFNMS(LDK(KP612264650), TU, TT); + TW = VFNMS(LDK(KP853480001), TV, TS); + T1f = VFMA(LDK(KP853480001), TV, TS); + T1m = VFNMS(LDK(KP522026385), TW, TZ); + { + V TG, T18, Tp, TC, T17; + TG = VFNMS(LDK(KP514918778), TF, TE); + T18 = VFNMS(LDK(KP859542535), TG, TH); + Tp = VFNMS(LDK(KP083333333), To, T1); + TC = VFMA(LDK(KP301479260), TB, Tw); + T17 = VFNMS(LDK(KP251768516), TC, Tp); + TD = VFMA(LDK(KP503537032), TC, Tp); + T1j = VFNMS(LDK(KP300462606), T18, T17); + TI = VFMA(LDK(KP581704778), TH, TG); + T19 = VFMA(LDK(KP300462606), T18, T17); + } + { + V TJ, T10, T1l, T1o; + TJ = VFNMS(LDK(KP516520780), TI, TD); + T10 = VMUL(LDK(KP600477271), VFMA(LDK(KP957805992), TZ, TW)); + ST(&(xo[WS(os, 5)]), VFNMSI(T10, TJ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VFMAI(T10, TJ), ovs, &(xo[0])); + { + V T11, T16, T1p, T1q; + T11 = VFMA(LDK(KP516520780), TI, TD); + T16 = VMUL(LDK(KP600477271), VFMA(LDK(KP957805992), T15, T14)); + ST(&(xo[WS(os, 1)]), VFMAI(T16, T11), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VFNMSI(T16, T11), ovs, &(xo[0])); + T1p = VFMA(LDK(KP503537032), T1k, T1j); + T1q = VMUL(LDK(KP575140729), VFMA(LDK(KP904176221), T1n, T1m)); + ST(&(xo[WS(os, 2)]), VFNMSI(T1q, T1p), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VFMAI(T1q, T1p), ovs, &(xo[WS(os, 1)])); + } + T1l = VFNMS(LDK(KP503537032), T1k, T1j); + T1o = VMUL(LDK(KP575140729), VFNMS(LDK(KP904176221), T1n, T1m)); + ST(&(xo[WS(os, 6)]), VFNMSI(T1o, T1l), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFMAI(T1o, T1l), ovs, &(xo[WS(os, 1)])); + { + V T1h, T1i, T1d, T1g; + T1h = VFMA(LDK(KP503537032), T1c, T19); + T1i = VMUL(LDK(KP575140729), VFNMS(LDK(KP904176221), T1f, T1e)); + ST(&(xo[WS(os, 3)]), VFMAI(T1i, T1h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VFNMSI(T1i, T1h), ovs, &(xo[0])); + T1d = VFNMS(LDK(KP503537032), T1c, T19); + T1g = VMUL(LDK(KP575140729), VFMA(LDK(KP904176221), T1f, T1e)); + ST(&(xo[WS(os, 4)]), VFNMSI(T1g, T1d), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFMAI(T1g, T1d), ovs, &(xo[WS(os, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 13, XSIMD_STRING("n1fv_13"), {31, 6, 57, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_13) (planner *p) { + X(kdft_register) (p, n1fv_13, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 13 -name n1fv_13 -include dft/simd/n1f.h */ + +/* + * This function contains 88 FP additions, 34 FP multiplications, + * (or, 69 additions, 15 multiplications, 19 fused multiply/add), + * 60 stack variables, 20 constants, and 26 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_13(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DVK(KP083333333, +0.083333333333333333333333333333333333333333333); + DVK(KP075902986, +0.075902986037193865983102897245103540356428373); + DVK(KP251768516, +0.251768516431883313623436926934233488546674281); + DVK(KP132983124, +0.132983124607418643793760531921092974399165133); + DVK(KP258260390, +0.258260390311744861420450644284508567852516811); + DVK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DVK(KP300238635, +0.300238635966332641462884626667381504676006424); + DVK(KP011599105, +0.011599105605768290721655456654083252189827041); + DVK(KP156891391, +0.156891391051584611046832726756003269660212636); + DVK(KP256247671, +0.256247671582936600958684654061725059144125175); + DVK(KP174138601, +0.174138601152135905005660794929264742616964676); + DVK(KP575140729, +0.575140729474003121368385547455453388461001608); + DVK(KP503537032, +0.503537032863766627246873853868466977093348562); + DVK(KP113854479, +0.113854479055790798974654345867655310534642560); + DVK(KP265966249, +0.265966249214837287587521063842185948798330267); + DVK(KP387390585, +0.387390585467617292130675966426762851778775217); + DVK(KP300462606, +0.300462606288665774426601772289207995520941381); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(26, is), MAKE_VOLATILE_STRIDE(26, os)) { + V TW, Tb, Tm, Tu, TC, TR, TX, TK, TU, Tz, TB, TN, TT; + TW = LD(&(xi[0]), ivs, &(xi[0])); + { + V T3, TH, Tl, Tw, Tp, Tg, Tv, To, T6, Tr, T9, Ts, Ta, TI, T1; + V T2, Tq, Tt; + T1 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TH = VADD(T1, T2); + { + V Th, Ti, Tj, Tk; + Th = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Ti = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tk = VADD(Ti, Tj); + Tl = VADD(Th, Tk); + Tw = VSUB(Ti, Tj); + Tp = VFNMS(LDK(KP500000000), Tk, Th); + } + { + V Tc, Td, Te, Tf; + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Te = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Tg = VADD(Tc, Tf); + Tv = VSUB(Td, Te); + To = VFNMS(LDK(KP500000000), Tf, Tc); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + Tr = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + Ts = VADD(T7, T8); + } + Ta = VADD(T6, T9); + TI = VADD(Tr, Ts); + Tb = VADD(T3, Ta); + Tm = VSUB(Tg, Tl); + Tq = VSUB(To, Tp); + Tt = VMUL(LDK(KP866025403), VSUB(Tr, Ts)); + Tu = VADD(Tq, Tt); + TC = VSUB(Tq, Tt); + { + V TP, TQ, TG, TJ; + TP = VADD(Tg, Tl); + TQ = VADD(TH, TI); + TR = VMUL(LDK(KP300462606), VSUB(TP, TQ)); + TX = VADD(TP, TQ); + TG = VADD(To, Tp); + TJ = VFNMS(LDK(KP500000000), TI, TH); + TK = VSUB(TG, TJ); + TU = VADD(TG, TJ); + } + { + V Tx, Ty, TL, TM; + Tx = VMUL(LDK(KP866025403), VSUB(Tv, Tw)); + Ty = VFNMS(LDK(KP500000000), Ta, T3); + Tz = VSUB(Tx, Ty); + TB = VADD(Tx, Ty); + TL = VADD(Tv, Tw); + TM = VSUB(T6, T9); + TN = VSUB(TL, TM); + TT = VADD(TL, TM); + } + } + ST(&(xo[0]), VADD(TW, TX), ovs, &(xo[0])); + { + V T19, T1n, T14, T13, T1f, T1k, Tn, TE, T1e, T1j, TS, T1m, TZ, T1c, TA; + V TD; + { + V T17, T18, T11, T12; + T17 = VFMA(LDK(KP387390585), TN, VMUL(LDK(KP265966249), TK)); + T18 = VFNMS(LDK(KP503537032), TU, VMUL(LDK(KP113854479), TT)); + T19 = VSUB(T17, T18); + T1n = VADD(T17, T18); + T14 = VFMA(LDK(KP575140729), Tm, VMUL(LDK(KP174138601), Tb)); + T11 = VFNMS(LDK(KP156891391), TB, VMUL(LDK(KP256247671), TC)); + T12 = VFMA(LDK(KP011599105), Tz, VMUL(LDK(KP300238635), Tu)); + T13 = VSUB(T11, T12); + T1f = VADD(T14, T13); + T1k = VMUL(LDK(KP1_732050807), VADD(T11, T12)); + } + Tn = VFNMS(LDK(KP174138601), Tm, VMUL(LDK(KP575140729), Tb)); + TA = VFNMS(LDK(KP300238635), Tz, VMUL(LDK(KP011599105), Tu)); + TD = VFMA(LDK(KP256247671), TB, VMUL(LDK(KP156891391), TC)); + TE = VSUB(TA, TD); + T1e = VMUL(LDK(KP1_732050807), VADD(TD, TA)); + T1j = VSUB(Tn, TE); + { + V TO, T1b, TV, TY, T1a; + TO = VFNMS(LDK(KP132983124), TN, VMUL(LDK(KP258260390), TK)); + T1b = VSUB(TR, TO); + TV = VFMA(LDK(KP251768516), TT, VMUL(LDK(KP075902986), TU)); + TY = VFNMS(LDK(KP083333333), TX, TW); + T1a = VSUB(TY, TV); + TS = VFMA(LDK(KP2_000000000), TO, TR); + T1m = VADD(T1b, T1a); + TZ = VFMA(LDK(KP2_000000000), TV, TY); + T1c = VSUB(T1a, T1b); + } + { + V TF, T10, T1l, T1o; + TF = VBYI(VFMA(LDK(KP2_000000000), TE, Tn)); + T10 = VADD(TS, TZ); + ST(&(xo[WS(os, 1)]), VADD(TF, T10), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VSUB(T10, TF), ovs, &(xo[0])); + { + V T15, T16, T1p, T1q; + T15 = VBYI(VFMS(LDK(KP2_000000000), T13, T14)); + T16 = VSUB(TZ, TS); + ST(&(xo[WS(os, 5)]), VADD(T15, T16), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VSUB(T16, T15), ovs, &(xo[0])); + T1p = VADD(T1n, T1m); + T1q = VBYI(VADD(T1j, T1k)); + ST(&(xo[WS(os, 4)]), VSUB(T1p, T1q), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VADD(T1q, T1p), ovs, &(xo[WS(os, 1)])); + } + T1l = VBYI(VSUB(T1j, T1k)); + T1o = VSUB(T1m, T1n); + ST(&(xo[WS(os, 3)]), VADD(T1l, T1o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VSUB(T1o, T1l), ovs, &(xo[0])); + { + V T1h, T1i, T1d, T1g; + T1h = VBYI(VSUB(T1e, T1f)); + T1i = VSUB(T1c, T19); + ST(&(xo[WS(os, 6)]), VADD(T1h, T1i), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VSUB(T1i, T1h), ovs, &(xo[WS(os, 1)])); + T1d = VADD(T19, T1c); + T1g = VBYI(VADD(T1e, T1f)); + ST(&(xo[WS(os, 2)]), VSUB(T1d, T1g), ovs, &(xo[0])); + ST(&(xo[WS(os, 11)]), VADD(T1g, T1d), ovs, &(xo[WS(os, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 13, XSIMD_STRING("n1fv_13"), {69, 15, 19, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_13) (planner *p) { + X(kdft_register) (p, n1fv_13, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_14.c new file mode 100644 index 000000000..da5e72a47 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_14.c @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 14 -name n1fv_14 -include dft/simd/n1f.h */ + +/* + * This function contains 74 FP additions, 48 FP multiplications, + * (or, 32 additions, 6 multiplications, 42 fused multiply/add), + * 51 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V T3, TH, Ts, TV, TW, Tt, Tu, TU, Ta, To, Th, Tp, TC, Tx, TK; + V TQ, TN, TR, T14, TZ, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TH = VADD(T1, T2); + { + V T6, TI, T9, TJ, Tn, TP, Tk, TO, Tg, TM, Td, TL; + { + V T4, T5, Ti, Tj; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TI = VADD(T4, T5); + { + V T7, T8, Tl, Tm; + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + TJ = VADD(T7, T8); + Tl = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tm = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tn = VSUB(Tl, Tm); + TP = VADD(Tl, Tm); + } + Ti = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TO = VADD(Ti, Tj); + { + V Te, Tf, Tb, Tc; + Te = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + TM = VADD(Te, Tf); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TL = VADD(Tb, Tc); + } + } + Ts = VSUB(T9, T6); + TV = VSUB(TL, TM); + TW = VSUB(TJ, TI); + Tt = VSUB(Tn, Tk); + Tu = VSUB(Tg, Td); + TU = VSUB(TO, TP); + Ta = VADD(T6, T9); + To = VADD(Tk, Tn); + Th = VADD(Td, Tg); + Tp = VFNMS(LDK(KP356895867), Ta, To); + TC = VFNMS(LDK(KP356895867), To, Th); + Tx = VFNMS(LDK(KP356895867), Th, Ta); + TK = VADD(TI, TJ); + TQ = VADD(TO, TP); + TN = VADD(TL, TM); + TR = VFNMS(LDK(KP356895867), TQ, TN); + T14 = VFNMS(LDK(KP356895867), TN, TK); + TZ = VFNMS(LDK(KP356895867), TK, TQ); + } + ST(&(xo[WS(os, 7)]), VADD(T3, VADD(Ta, VADD(Th, To))), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(TH, VADD(TK, VADD(TN, TQ))), ovs, &(xo[0])); + { + V Tr, Tw, Tq, Tv; + Tq = VFNMS(LDK(KP692021471), Tp, Th); + Tr = VFNMS(LDK(KP900968867), Tq, T3); + Tv = VFMA(LDK(KP554958132), Tu, Tt); + Tw = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tv, Ts)); + ST(&(xo[WS(os, 5)]), VFNMSI(Tw, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VFMAI(Tw, Tr), ovs, &(xo[WS(os, 1)])); + } + { + V T16, T18, T15, T17; + T15 = VFNMS(LDK(KP692021471), T14, TQ); + T16 = VFNMS(LDK(KP900968867), T15, TH); + T17 = VFNMS(LDK(KP554958132), TU, TW); + T18 = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), T17, TV)); + ST(&(xo[WS(os, 6)]), VFMAI(T18, T16), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFNMSI(T18, T16), ovs, &(xo[0])); + } + { + V Tz, TB, Ty, TA; + Ty = VFNMS(LDK(KP692021471), Tx, To); + Tz = VFNMS(LDK(KP900968867), Ty, T3); + TA = VFMA(LDK(KP554958132), Tt, Ts); + TB = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), TA, Tu)); + ST(&(xo[WS(os, 13)]), VFNMSI(TB, Tz), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(TB, Tz), ovs, &(xo[WS(os, 1)])); + } + { + V TT, TY, TS, TX; + TS = VFNMS(LDK(KP692021471), TR, TK); + TT = VFNMS(LDK(KP900968867), TS, TH); + TX = VFMA(LDK(KP554958132), TW, TV); + TY = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), TX, TU)); + ST(&(xo[WS(os, 4)]), VFMAI(TY, TT), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VFNMSI(TY, TT), ovs, &(xo[0])); + } + { + V T11, T13, T10, T12; + T10 = VFNMS(LDK(KP692021471), TZ, TN); + T11 = VFNMS(LDK(KP900968867), T10, TH); + T12 = VFMA(LDK(KP554958132), TV, TU); + T13 = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), T12, TW)); + ST(&(xo[WS(os, 2)]), VFMAI(T13, T11), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VFNMSI(T13, T11), ovs, &(xo[0])); + } + { + V TE, TG, TD, TF; + TD = VFNMS(LDK(KP692021471), TC, Ta); + TE = VFNMS(LDK(KP900968867), TD, T3); + TF = VFNMS(LDK(KP554958132), Ts, Tu); + TG = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), TF, Tt)); + ST(&(xo[WS(os, 11)]), VFNMSI(TG, TE), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(TG, TE), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n1fv_14"), {32, 6, 42, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_14) (planner *p) { + X(kdft_register) (p, n1fv_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 14 -name n1fv_14 -include dft/simd/n1f.h */ + +/* + * This function contains 74 FP additions, 36 FP multiplications, + * (or, 50 additions, 12 multiplications, 24 fused multiply/add), + * 33 stack variables, 6 constants, and 28 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V T3, Ty, To, TK, Tr, TE, Ta, TJ, Tq, TB, Th, TL, Ts, TH, T1; + V T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Ty = VADD(T1, T2); + { + V Tk, TC, Tn, TD; + { + V Ti, Tj, Tl, Tm; + Ti = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TC = VADD(Ti, Tj); + Tl = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tm = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tn = VSUB(Tl, Tm); + TD = VADD(Tl, Tm); + } + To = VADD(Tk, Tn); + TK = VSUB(TC, TD); + Tr = VSUB(Tn, Tk); + TE = VADD(TC, TD); + } + { + V T6, Tz, T9, TA; + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tz = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + TA = VADD(T7, T8); + } + Ta = VADD(T6, T9); + TJ = VSUB(TA, Tz); + Tq = VSUB(T9, T6); + TB = VADD(Tz, TA); + } + { + V Td, TF, Tg, TG; + { + V Tb, Tc, Te, Tf; + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TF = VADD(Tb, Tc); + Te = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + TG = VADD(Te, Tf); + } + Th = VADD(Td, Tg); + TL = VSUB(TF, TG); + Ts = VSUB(Tg, Td); + TH = VADD(TF, TG); + } + ST(&(xo[WS(os, 7)]), VADD(T3, VADD(Ta, VADD(Th, To))), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Ty, VADD(TB, VADD(TH, TE))), ovs, &(xo[0])); + { + V Tt, Tp, TP, TQ; + Tt = VBYI(VFNMS(LDK(KP781831482), Tr, VFNMS(LDK(KP433883739), Ts, VMUL(LDK(KP974927912), Tq)))); + Tp = VFMA(LDK(KP623489801), To, VFNMS(LDK(KP900968867), Th, VFNMS(LDK(KP222520933), Ta, T3))); + ST(&(xo[WS(os, 5)]), VSUB(Tp, Tt), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(Tp, Tt), ovs, &(xo[WS(os, 1)])); + TP = VBYI(VFMA(LDK(KP974927912), TJ, VFMA(LDK(KP433883739), TL, VMUL(LDK(KP781831482), TK)))); + TQ = VFMA(LDK(KP623489801), TE, VFNMS(LDK(KP900968867), TH, VFNMS(LDK(KP222520933), TB, Ty))); + ST(&(xo[WS(os, 2)]), VADD(TP, TQ), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VSUB(TQ, TP), ovs, &(xo[0])); + } + { + V Tv, Tu, TM, TI; + Tv = VBYI(VFMA(LDK(KP781831482), Tq, VFMA(LDK(KP974927912), Ts, VMUL(LDK(KP433883739), Tr)))); + Tu = VFMA(LDK(KP623489801), Ta, VFNMS(LDK(KP900968867), To, VFNMS(LDK(KP222520933), Th, T3))); + ST(&(xo[WS(os, 13)]), VSUB(Tu, Tv), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(Tu, Tv), ovs, &(xo[WS(os, 1)])); + TM = VBYI(VFNMS(LDK(KP433883739), TK, VFNMS(LDK(KP974927912), TL, VMUL(LDK(KP781831482), TJ)))); + TI = VFMA(LDK(KP623489801), TB, VFNMS(LDK(KP900968867), TE, VFNMS(LDK(KP222520933), TH, Ty))); + ST(&(xo[WS(os, 6)]), VSUB(TI, TM), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(TM, TI), ovs, &(xo[0])); + } + { + V TO, TN, Tx, Tw; + TO = VBYI(VFMA(LDK(KP433883739), TJ, VFNMS(LDK(KP974927912), TK, VMUL(LDK(KP781831482), TL)))); + TN = VFMA(LDK(KP623489801), TH, VFNMS(LDK(KP222520933), TE, VFNMS(LDK(KP900968867), TB, Ty))); + ST(&(xo[WS(os, 4)]), VSUB(TN, TO), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VADD(TO, TN), ovs, &(xo[0])); + Tx = VBYI(VFMA(LDK(KP433883739), Tq, VFNMS(LDK(KP781831482), Ts, VMUL(LDK(KP974927912), Tr)))); + Tw = VFMA(LDK(KP623489801), Th, VFNMS(LDK(KP222520933), To, VFNMS(LDK(KP900968867), Ta, T3))); + ST(&(xo[WS(os, 11)]), VSUB(Tw, Tx), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(Tw, Tx), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n1fv_14"), {50, 12, 24, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_14) (planner *p) { + X(kdft_register) (p, n1fv_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_15.c new file mode 100644 index 000000000..28ddda4d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_15.c @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:52 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 15 -name n1fv_15 -include dft/simd/n1f.h */ + +/* + * This function contains 78 FP additions, 49 FP multiplications, + * (or, 36 additions, 7 multiplications, 42 fused multiply/add), + * 53 stack variables, 8 constants, and 30 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_15(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP910592997, +0.910592997310029334643087372129977886038870291); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(30, is), MAKE_VOLATILE_STRIDE(30, os)) { + V T5, TX, TB, TO, TU, TV, TR, Ta, Tf, Tg, Tl, Tq, Tr, TE, TH; + V TI, T10, T12, T1f, T1g; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VADD(T1, T4); + TX = VSUB(T3, T2); + TB = VFNMS(LDK(KP500000000), T4, T1); + } + { + V T6, T9, TC, TM, Tm, Tp, TG, TQ, Tb, Te, TD, TN, Th, Tk, TF; + V TP, TY, TZ; + { + V T7, T8, Tn, To; + T6 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T7, T8); + TC = VFNMS(LDK(KP500000000), T9, T6); + TM = VSUB(T8, T7); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tp = VADD(Tn, To); + TG = VFNMS(LDK(KP500000000), Tp, Tm); + TQ = VSUB(To, Tn); + } + { + V Tc, Td, Ti, Tj; + Tb = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = VADD(Tc, Td); + TD = VFNMS(LDK(KP500000000), Te, Tb); + TN = VSUB(Td, Tc); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + TF = VFNMS(LDK(KP500000000), Tk, Th); + TP = VSUB(Tj, Ti); + } + TO = VSUB(TM, TN); + TU = VSUB(TC, TD); + TV = VSUB(TF, TG); + TR = VSUB(TP, TQ); + Ta = VADD(T6, T9); + Tf = VADD(Tb, Te); + Tg = VADD(Ta, Tf); + Tl = VADD(Th, Tk); + Tq = VADD(Tm, Tp); + Tr = VADD(Tl, Tq); + TE = VADD(TC, TD); + TH = VADD(TF, TG); + TI = VADD(TE, TH); + TY = VADD(TM, TN); + TZ = VADD(TP, TQ); + T10 = VADD(TY, TZ); + T12 = VSUB(TY, TZ); + } + T1f = VADD(TB, TI); + T1g = VMUL(LDK(KP866025403), VADD(TX, T10)); + ST(&(xo[WS(os, 5)]), VFNMSI(T1g, T1f), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VFMAI(T1g, T1f), ovs, &(xo[0])); + { + V Tu, Ts, Tt, Ty, TA, Tw, Tx, Tz, Tv; + Tu = VSUB(Tg, Tr); + Ts = VADD(Tg, Tr); + Tt = VFNMS(LDK(KP250000000), Ts, T5); + Tw = VSUB(Tl, Tq); + Tx = VSUB(Ta, Tf); + Ty = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tx, Tw)); + TA = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tx)); + ST(&(xo[0]), VADD(T5, Ts), ovs, &(xo[0])); + Tz = VFMA(LDK(KP559016994), Tu, Tt); + ST(&(xo[WS(os, 6)]), VFNMSI(TA, Tz), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFMAI(TA, Tz), ovs, &(xo[WS(os, 1)])); + Tv = VFNMS(LDK(KP559016994), Tu, Tt); + ST(&(xo[WS(os, 3)]), VFNMSI(Ty, Tv), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VFMAI(Ty, Tv), ovs, &(xo[0])); + } + { + V TS, TW, T1a, T18, T13, T1b, TL, T17, T11, TJ, TK; + TS = VFMA(LDK(KP618033988), TR, TO); + TW = VFMA(LDK(KP618033988), TV, TU); + T1a = VFNMS(LDK(KP618033988), TU, TV); + T18 = VFNMS(LDK(KP618033988), TO, TR); + T11 = VFNMS(LDK(KP250000000), T10, TX); + T13 = VFMA(LDK(KP559016994), T12, T11); + T1b = VFNMS(LDK(KP559016994), T12, T11); + TJ = VFNMS(LDK(KP250000000), TI, TB); + TK = VSUB(TE, TH); + TL = VFMA(LDK(KP559016994), TK, TJ); + T17 = VFNMS(LDK(KP559016994), TK, TJ); + { + V TT, T14, T1d, T1e; + TT = VFMA(LDK(KP823639103), TS, TL); + T14 = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), T13, TW)); + ST(&(xo[WS(os, 1)]), VFNMSI(T14, TT), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 14)]), VFMAI(T14, TT), ovs, &(xo[0])); + T1d = VFNMS(LDK(KP823639103), T18, T17); + T1e = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), T1b, T1a)); + ST(&(xo[WS(os, 8)]), VFNMSI(T1e, T1d), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFMAI(T1e, T1d), ovs, &(xo[WS(os, 1)])); + } + { + V T15, T16, T19, T1c; + T15 = VFNMS(LDK(KP823639103), TS, TL); + T16 = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), T13, TW)); + ST(&(xo[WS(os, 11)]), VFNMSI(T16, T15), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VFMAI(T16, T15), ovs, &(xo[0])); + T19 = VFMA(LDK(KP823639103), T18, T17); + T1c = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), T1b, T1a)); + ST(&(xo[WS(os, 13)]), VFNMSI(T1c, T19), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VFMAI(T1c, T19), ovs, &(xo[0])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 15, XSIMD_STRING("n1fv_15"), {36, 7, 42, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_15) (planner *p) { + X(kdft_register) (p, n1fv_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 15 -name n1fv_15 -include dft/simd/n1f.h */ + +/* + * This function contains 78 FP additions, 25 FP multiplications, + * (or, 64 additions, 11 multiplications, 14 fused multiply/add), + * 55 stack variables, 10 constants, and 30 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_15(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP216506350, +0.216506350946109661690930792688234045867850657); + DVK(KP509036960, +0.509036960455127183450980863393907648510733164); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP484122918, +0.484122918275927110647408174972799951354115213); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(30, is), MAKE_VOLATILE_STRIDE(30, os)) { + V T5, T10, TB, TO, TU, TV, TR, Ta, Tf, Tg, Tl, Tq, Tr, TE, TH; + V TI, TZ, T11, T1f, T1g; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VADD(T1, T4); + T10 = VSUB(T3, T2); + TB = VFNMS(LDK(KP500000000), T4, T1); + } + { + V T6, T9, TC, TP, Tm, Tp, TG, TN, Tb, Te, TD, TQ, Th, Tk, TF; + V TM, TX, TY; + { + V T7, T8, Tn, To; + T6 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T7, T8); + TC = VFNMS(LDK(KP500000000), T9, T6); + TP = VSUB(T8, T7); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tp = VADD(Tn, To); + TG = VFNMS(LDK(KP500000000), Tp, Tm); + TN = VSUB(To, Tn); + } + { + V Tc, Td, Ti, Tj; + Tb = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = VADD(Tc, Td); + TD = VFNMS(LDK(KP500000000), Te, Tb); + TQ = VSUB(Td, Tc); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + TF = VFNMS(LDK(KP500000000), Tk, Th); + TM = VSUB(Tj, Ti); + } + TO = VSUB(TM, TN); + TU = VSUB(TF, TG); + TV = VSUB(TC, TD); + TR = VSUB(TP, TQ); + Ta = VADD(T6, T9); + Tf = VADD(Tb, Te); + Tg = VADD(Ta, Tf); + Tl = VADD(Th, Tk); + Tq = VADD(Tm, Tp); + Tr = VADD(Tl, Tq); + TE = VADD(TC, TD); + TH = VADD(TF, TG); + TI = VADD(TE, TH); + TX = VADD(TP, TQ); + TY = VADD(TM, TN); + TZ = VMUL(LDK(KP484122918), VSUB(TX, TY)); + T11 = VADD(TX, TY); + } + T1f = VADD(TB, TI); + T1g = VBYI(VMUL(LDK(KP866025403), VADD(T10, T11))); + ST(&(xo[WS(os, 5)]), VSUB(T1f, T1g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 10)]), VADD(T1f, T1g), ovs, &(xo[0])); + { + V Tu, Ts, Tt, Ty, TA, Tw, Tx, Tz, Tv; + Tu = VMUL(LDK(KP559016994), VSUB(Tg, Tr)); + Ts = VADD(Tg, Tr); + Tt = VFNMS(LDK(KP250000000), Ts, T5); + Tw = VSUB(Tl, Tq); + Tx = VSUB(Ta, Tf); + Ty = VBYI(VFNMS(LDK(KP587785252), Tx, VMUL(LDK(KP951056516), Tw))); + TA = VBYI(VFMA(LDK(KP951056516), Tx, VMUL(LDK(KP587785252), Tw))); + ST(&(xo[0]), VADD(T5, Ts), ovs, &(xo[0])); + Tz = VADD(Tu, Tt); + ST(&(xo[WS(os, 6)]), VSUB(Tz, TA), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VADD(TA, Tz), ovs, &(xo[WS(os, 1)])); + Tv = VSUB(Tt, Tu); + ST(&(xo[WS(os, 3)]), VSUB(Tv, Ty), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VADD(Ty, Tv), ovs, &(xo[0])); + } + { + V TS, TW, T1b, T18, T13, T1a, TL, T17, T12, TJ, TK; + TS = VFNMS(LDK(KP509036960), TR, VMUL(LDK(KP823639103), TO)); + TW = VFNMS(LDK(KP587785252), TV, VMUL(LDK(KP951056516), TU)); + T1b = VFMA(LDK(KP951056516), TV, VMUL(LDK(KP587785252), TU)); + T18 = VFMA(LDK(KP823639103), TR, VMUL(LDK(KP509036960), TO)); + T12 = VFNMS(LDK(KP216506350), T11, VMUL(LDK(KP866025403), T10)); + T13 = VSUB(TZ, T12); + T1a = VADD(TZ, T12); + TJ = VFNMS(LDK(KP250000000), TI, TB); + TK = VMUL(LDK(KP559016994), VSUB(TE, TH)); + TL = VSUB(TJ, TK); + T17 = VADD(TK, TJ); + { + V TT, T14, T1d, T1e; + TT = VSUB(TL, TS); + T14 = VBYI(VSUB(TW, T13)); + ST(&(xo[WS(os, 8)]), VSUB(TT, T14), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VADD(TT, T14), ovs, &(xo[WS(os, 1)])); + T1d = VSUB(T17, T18); + T1e = VBYI(VADD(T1b, T1a)); + ST(&(xo[WS(os, 11)]), VSUB(T1d, T1e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VADD(T1d, T1e), ovs, &(xo[0])); + } + { + V T15, T16, T19, T1c; + T15 = VADD(TL, TS); + T16 = VBYI(VADD(TW, T13)); + ST(&(xo[WS(os, 13)]), VSUB(T15, T16), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VADD(T15, T16), ovs, &(xo[0])); + T19 = VADD(T17, T18); + T1c = VBYI(VSUB(T1a, T1b)); + ST(&(xo[WS(os, 14)]), VSUB(T19, T1c), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(T19, T1c), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 15, XSIMD_STRING("n1fv_15"), {64, 11, 14, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_15) (planner *p) { + X(kdft_register) (p, n1fv_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_16.c new file mode 100644 index 000000000..cb7e3644f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_16.c @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:52 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name n1fv_16 -include dft/simd/n1f.h */ + +/* + * This function contains 72 FP additions, 34 FP multiplications, + * (or, 38 additions, 0 multiplications, 34 fused multiply/add), + * 30 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V T7, TU, Tz, TH, Tu, TV, TA, TK, Te, TX, TC, TO, Tl, TY, TD; + V TR; + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T7 = VSUB(T3, T6); + TU = VSUB(T4, T5); + Tz = VADD(T3, T6); + TH = VSUB(T1, T2); + } + { + V Tq, TJ, Tt, TI; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + TJ = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + TI = VSUB(Tr, Ts); + } + Tu = VSUB(Tq, Tt); + TV = VSUB(TJ, TI); + TA = VADD(Tt, Tq); + TK = VADD(TI, TJ); + } + { + V Ta, TM, Td, TN; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VADD(T8, T9); + TM = VSUB(T8, T9); + Tb = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + TN = VSUB(Tb, Tc); + } + Te = VSUB(Ta, Td); + TX = VFMA(LDK(KP414213562), TM, TN); + TC = VADD(Ta, Td); + TO = VFNMS(LDK(KP414213562), TN, TM); + } + { + V Th, TP, Tk, TQ; + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Th = VADD(Tf, Tg); + TP = VSUB(Tf, Tg); + Ti = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + TQ = VSUB(Tj, Ti); + } + Tl = VSUB(Th, Tk); + TY = VFMA(LDK(KP414213562), TP, TQ); + TD = VADD(Th, Tk); + TR = VFNMS(LDK(KP414213562), TQ, TP); + } + { + V TB, TE, TF, TG; + TB = VADD(Tz, TA); + TE = VADD(TC, TD); + ST(&(xo[WS(os, 8)]), VSUB(TB, TE), ovs, &(xo[0])); + ST(&(xo[0]), VADD(TB, TE), ovs, &(xo[0])); + TF = VSUB(Tz, TA); + TG = VSUB(TD, TC); + ST(&(xo[WS(os, 12)]), VFNMSI(TG, TF), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(TG, TF), ovs, &(xo[0])); + } + { + V Tn, Tx, Tw, Ty, Tm, Tv; + Tm = VADD(Te, Tl); + Tn = VFNMS(LDK(KP707106781), Tm, T7); + Tx = VFMA(LDK(KP707106781), Tm, T7); + Tv = VSUB(Tl, Te); + Tw = VFNMS(LDK(KP707106781), Tv, Tu); + Ty = VFMA(LDK(KP707106781), Tv, Tu); + ST(&(xo[WS(os, 6)]), VFNMSI(Tw, Tn), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(Ty, Tx), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VFMAI(Tw, Tn), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VFNMSI(Ty, Tx), ovs, &(xo[0])); + } + { + V TT, T11, T10, T12; + { + V TL, TS, TW, TZ; + TL = VFMA(LDK(KP707106781), TK, TH); + TS = VADD(TO, TR); + TT = VFNMS(LDK(KP923879532), TS, TL); + T11 = VFMA(LDK(KP923879532), TS, TL); + TW = VFNMS(LDK(KP707106781), TV, TU); + TZ = VSUB(TX, TY); + T10 = VFNMS(LDK(KP923879532), TZ, TW); + T12 = VFMA(LDK(KP923879532), TZ, TW); + } + ST(&(xo[WS(os, 9)]), VFNMSI(T10, TT), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VFMAI(T12, T11), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(T10, TT), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFNMSI(T12, T11), ovs, &(xo[WS(os, 1)])); + } + { + V T15, T19, T18, T1a; + { + V T13, T14, T16, T17; + T13 = VFNMS(LDK(KP707106781), TK, TH); + T14 = VADD(TX, TY); + T15 = VFNMS(LDK(KP923879532), T14, T13); + T19 = VFMA(LDK(KP923879532), T14, T13); + T16 = VFMA(LDK(KP707106781), TV, TU); + T17 = VSUB(TR, TO); + T18 = VFNMS(LDK(KP923879532), T17, T16); + T1a = VFMA(LDK(KP923879532), T17, T16); + } + ST(&(xo[WS(os, 5)]), VFNMSI(T18, T15), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VFNMSI(T1a, T19), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFMAI(T18, T15), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(T1a, T19), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n1fv_16"), {38, 0, 34, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_16) (planner *p) { + X(kdft_register) (p, n1fv_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name n1fv_16 -include dft/simd/n1f.h */ + +/* + * This function contains 72 FP additions, 12 FP multiplications, + * (or, 68 additions, 8 multiplications, 4 fused multiply/add), + * 30 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V Tp, T13, Tu, TN, Tm, T14, Tv, TY, T7, T17, Ty, TT, Te, T16, Tx; + V TQ; + { + V Tn, To, TM, Ts, Tt, TL; + Tn = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TM = VADD(Tn, To); + Ts = LD(&(xi[0]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TL = VADD(Ts, Tt); + Tp = VSUB(Tn, To); + T13 = VADD(TL, TM); + Tu = VSUB(Ts, Tt); + TN = VSUB(TL, TM); + } + { + V Ti, TW, Tl, TX; + { + V Tg, Th, Tj, Tk; + Tg = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = VSUB(Tg, Th); + TW = VADD(Tg, Th); + Tj = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + TX = VADD(Tj, Tk); + } + Tm = VMUL(LDK(KP707106781), VSUB(Ti, Tl)); + T14 = VADD(TX, TW); + Tv = VMUL(LDK(KP707106781), VADD(Tl, Ti)); + TY = VSUB(TW, TX); + } + { + V T3, TR, T6, TS; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TR = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TS = VADD(T4, T5); + } + T7 = VFNMS(LDK(KP923879532), T6, VMUL(LDK(KP382683432), T3)); + T17 = VADD(TR, TS); + Ty = VFMA(LDK(KP923879532), T3, VMUL(LDK(KP382683432), T6)); + TT = VSUB(TR, TS); + } + { + V Ta, TO, Td, TP; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + TO = VADD(T8, T9); + Tb = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TP = VADD(Tb, Tc); + } + Te = VFMA(LDK(KP382683432), Ta, VMUL(LDK(KP923879532), Td)); + T16 = VADD(TO, TP); + Tx = VFNMS(LDK(KP382683432), Td, VMUL(LDK(KP923879532), Ta)); + TQ = VSUB(TO, TP); + } + { + V T15, T18, T19, T1a; + T15 = VADD(T13, T14); + T18 = VADD(T16, T17); + ST(&(xo[WS(os, 8)]), VSUB(T15, T18), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T15, T18), ovs, &(xo[0])); + T19 = VSUB(T13, T14); + T1a = VBYI(VSUB(T17, T16)); + ST(&(xo[WS(os, 12)]), VSUB(T19, T1a), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(T19, T1a), ovs, &(xo[0])); + } + { + V TV, T11, T10, T12, TU, TZ; + TU = VMUL(LDK(KP707106781), VADD(TQ, TT)); + TV = VADD(TN, TU); + T11 = VSUB(TN, TU); + TZ = VMUL(LDK(KP707106781), VSUB(TT, TQ)); + T10 = VBYI(VADD(TY, TZ)); + T12 = VBYI(VSUB(TZ, TY)); + ST(&(xo[WS(os, 14)]), VSUB(TV, T10), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VADD(T11, T12), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(TV, T10), ovs, &(xo[0])); + ST(&(xo[WS(os, 10)]), VSUB(T11, T12), ovs, &(xo[0])); + } + { + V Tr, TB, TA, TC; + { + V Tf, Tq, Tw, Tz; + Tf = VSUB(T7, Te); + Tq = VSUB(Tm, Tp); + Tr = VBYI(VSUB(Tf, Tq)); + TB = VBYI(VADD(Tq, Tf)); + Tw = VADD(Tu, Tv); + Tz = VADD(Tx, Ty); + TA = VSUB(Tw, Tz); + TC = VADD(Tw, Tz); + } + ST(&(xo[WS(os, 7)]), VADD(Tr, TA), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VSUB(TC, TB), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VSUB(TA, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(TB, TC), ovs, &(xo[WS(os, 1)])); + } + { + V TF, TJ, TI, TK; + { + V TD, TE, TG, TH; + TD = VSUB(Tu, Tv); + TE = VADD(Te, T7); + TF = VADD(TD, TE); + TJ = VSUB(TD, TE); + TG = VADD(Tp, Tm); + TH = VSUB(Ty, Tx); + TI = VBYI(VADD(TG, TH)); + TK = VBYI(VSUB(TH, TG)); + } + ST(&(xo[WS(os, 13)]), VSUB(TF, TI), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(TJ, TK), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(TF, TI), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VSUB(TJ, TK), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n1fv_16"), {68, 8, 4, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_16) (planner *p) { + X(kdft_register) (p, n1fv_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_2.c new file mode 100644 index 000000000..79d5f7af4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_2.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name n1fv_2 -include dft/simd/n1f.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + ST(&(xo[WS(os, 1)]), VSUB(T1, T2), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T1, T2), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n1fv_2"), {2, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_2) (planner *p) { + X(kdft_register) (p, n1fv_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name n1fv_2 -include dft/simd/n1f.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + ST(&(xo[WS(os, 1)]), VSUB(T1, T2), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T1, T2), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n1fv_2"), {2, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_2) (planner *p) { + X(kdft_register) (p, n1fv_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_20.c new file mode 100644 index 000000000..0bb8926d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_20.c @@ -0,0 +1,422 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:53 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name n1fv_20 -include dft/simd/n1f.h */ + +/* + * This function contains 104 FP additions, 50 FP multiplications, + * (or, 58 additions, 4 multiplications, 46 fused multiply/add), + * 53 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1r, Tm, T13, TG, TN, TO, TH, T16, T19, T1a, T1v, T1w, T1x, T1s; + V T1t, T1u, T1d, T1g, T1h, Ti, TE, TB, TL, Tj, TC; + { + V T1, T2, T11, Tk, Tl, T12; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T11 = VADD(T1, T2); + Tk = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tl = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T12 = VADD(Tk, Tl); + T3 = VSUB(T1, T2); + T1r = VADD(T11, T12); + Tm = VSUB(Tk, Tl); + T13 = VSUB(T11, T12); + } + { + V T6, T14, Tw, T1c, Tz, T1f, T9, T17, Td, T1b, Tp, T15, Ts, T18, Tg; + V T1e; + { + V T4, T5, Tu, Tv; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T14 = VADD(T4, T5); + Tu = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tv = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tw = VSUB(Tu, Tv); + T1c = VADD(Tu, Tv); + } + { + V Tx, Ty, T7, T8; + Tx = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tz = VSUB(Tx, Ty); + T1f = VADD(Tx, Ty); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T17 = VADD(T7, T8); + } + { + V Tb, Tc, Tn, To; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T1b = VADD(Tb, Tc); + Tn = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + To = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tp = VSUB(Tn, To); + T15 = VADD(Tn, To); + } + { + V Tq, Tr, Te, Tf; + Tq = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tr = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Ts = VSUB(Tq, Tr); + T18 = VADD(Tq, Tr); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T1e = VADD(Te, Tf); + } + TG = VSUB(Ts, Tp); + TN = VSUB(T6, T9); + TO = VSUB(Td, Tg); + TH = VSUB(Tz, Tw); + T16 = VSUB(T14, T15); + T19 = VSUB(T17, T18); + T1a = VADD(T16, T19); + T1v = VADD(T1b, T1c); + T1w = VADD(T1e, T1f); + T1x = VADD(T1v, T1w); + T1s = VADD(T14, T15); + T1t = VADD(T17, T18); + T1u = VADD(T1s, T1t); + T1d = VSUB(T1b, T1c); + T1g = VSUB(T1e, T1f); + T1h = VADD(T1d, T1g); + { + V Ta, Th, Tt, TA; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + TE = VSUB(Ta, Th); + Tt = VADD(Tp, Ts); + TA = VADD(Tw, Tz); + TB = VADD(Tt, TA); + TL = VSUB(TA, Tt); + } + } + Tj = VADD(T3, Ti); + TC = VADD(Tm, TB); + ST(&(xo[WS(os, 5)]), VFNMSI(TC, Tj), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VFMAI(TC, Tj), ovs, &(xo[WS(os, 1)])); + { + V T1A, T1y, T1z, T1E, T1G, T1C, T1D, T1F, T1B; + T1A = VSUB(T1u, T1x); + T1y = VADD(T1u, T1x); + T1z = VFNMS(LDK(KP250000000), T1y, T1r); + T1C = VSUB(T1s, T1t); + T1D = VSUB(T1v, T1w); + T1E = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1D, T1C)); + T1G = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1C, T1D)); + ST(&(xo[0]), VADD(T1r, T1y), ovs, &(xo[0])); + T1F = VFNMS(LDK(KP559016994), T1A, T1z); + ST(&(xo[WS(os, 8)]), VFNMSI(T1G, T1F), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VFMAI(T1G, T1F), ovs, &(xo[0])); + T1B = VFMA(LDK(KP559016994), T1A, T1z); + ST(&(xo[WS(os, 4)]), VFMAI(T1E, T1B), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VFNMSI(T1E, T1B), ovs, &(xo[0])); + } + { + V T1k, T1i, T1j, T1o, T1q, T1m, T1n, T1p, T1l; + T1k = VSUB(T1a, T1h); + T1i = VADD(T1a, T1h); + T1j = VFNMS(LDK(KP250000000), T1i, T13); + T1m = VSUB(T1d, T1g); + T1n = VSUB(T16, T19); + T1o = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1n, T1m)); + T1q = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1m, T1n)); + ST(&(xo[WS(os, 10)]), VADD(T13, T1i), ovs, &(xo[0])); + T1p = VFMA(LDK(KP559016994), T1k, T1j); + ST(&(xo[WS(os, 6)]), VFNMSI(T1q, T1p), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VFMAI(T1q, T1p), ovs, &(xo[0])); + T1l = VFNMS(LDK(KP559016994), T1k, T1j); + ST(&(xo[WS(os, 2)]), VFMAI(T1o, T1l), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VFNMSI(T1o, T1l), ovs, &(xo[0])); + } + { + V TI, TP, TX, TU, TM, TW, TF, TT, TK, TD; + TI = VFMA(LDK(KP618033988), TH, TG); + TP = VFMA(LDK(KP618033988), TO, TN); + TX = VFNMS(LDK(KP618033988), TN, TO); + TU = VFNMS(LDK(KP618033988), TG, TH); + TK = VFNMS(LDK(KP250000000), TB, Tm); + TM = VFNMS(LDK(KP559016994), TL, TK); + TW = VFMA(LDK(KP559016994), TL, TK); + TD = VFNMS(LDK(KP250000000), Ti, T3); + TF = VFMA(LDK(KP559016994), TE, TD); + TT = VFNMS(LDK(KP559016994), TE, TD); + { + V TJ, TQ, TZ, T10; + TJ = VFMA(LDK(KP951056516), TI, TF); + TQ = VFMA(LDK(KP951056516), TP, TM); + ST(&(xo[WS(os, 1)]), VFNMSI(TQ, TJ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 19)]), VFMAI(TQ, TJ), ovs, &(xo[WS(os, 1)])); + TZ = VFMA(LDK(KP951056516), TU, TT); + T10 = VFMA(LDK(KP951056516), TX, TW); + ST(&(xo[WS(os, 13)]), VFNMSI(T10, TZ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(T10, TZ), ovs, &(xo[WS(os, 1)])); + } + { + V TR, TS, TV, TY; + TR = VFNMS(LDK(KP951056516), TI, TF); + TS = VFNMS(LDK(KP951056516), TP, TM); + ST(&(xo[WS(os, 9)]), VFNMSI(TS, TR), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 11)]), VFMAI(TS, TR), ovs, &(xo[WS(os, 1)])); + TV = VFNMS(LDK(KP951056516), TU, TT); + TY = VFNMS(LDK(KP951056516), TX, TW); + ST(&(xo[WS(os, 17)]), VFNMSI(TY, TV), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(TY, TV), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n1fv_20"), {58, 4, 46, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_20) (planner *p) { + X(kdft_register) (p, n1fv_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name n1fv_20 -include dft/simd/n1f.h */ + +/* + * This function contains 104 FP additions, 24 FP multiplications, + * (or, 92 additions, 12 multiplications, 12 fused multiply/add), + * 53 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1B, Tm, T1i, TG, TN, TO, TH, T13, T16, T1k, T1u, T1v, T1z, T1r; + V T1s, T1y, T1a, T1d, T1j, Ti, TD, TB, TL, Tj, TC; + { + V T1, T2, T1g, Tk, Tl, T1h; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1g = VADD(T1, T2); + Tk = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tl = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1h = VADD(Tk, Tl); + T3 = VSUB(T1, T2); + T1B = VADD(T1g, T1h); + Tm = VSUB(Tk, Tl); + T1i = VSUB(T1g, T1h); + } + { + V T6, T18, Tw, T12, Tz, T15, T9, T1b, Td, T11, Tp, T19, Ts, T1c, Tg; + V T14; + { + V T4, T5, Tu, Tv; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T18 = VADD(T4, T5); + Tu = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tv = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tw = VSUB(Tu, Tv); + T12 = VADD(Tu, Tv); + } + { + V Tx, Ty, T7, T8; + Tx = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tz = VSUB(Tx, Ty); + T15 = VADD(Tx, Ty); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1b = VADD(T7, T8); + } + { + V Tb, Tc, Tn, To; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T11 = VADD(Tb, Tc); + Tn = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + To = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tp = VSUB(Tn, To); + T19 = VADD(Tn, To); + } + { + V Tq, Tr, Te, Tf; + Tq = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tr = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Ts = VSUB(Tq, Tr); + T1c = VADD(Tq, Tr); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T14 = VADD(Te, Tf); + } + TG = VSUB(Ts, Tp); + TN = VSUB(T6, T9); + TO = VSUB(Td, Tg); + TH = VSUB(Tz, Tw); + T13 = VSUB(T11, T12); + T16 = VSUB(T14, T15); + T1k = VADD(T13, T16); + T1u = VADD(T11, T12); + T1v = VADD(T14, T15); + T1z = VADD(T1u, T1v); + T1r = VADD(T18, T19); + T1s = VADD(T1b, T1c); + T1y = VADD(T1r, T1s); + T1a = VSUB(T18, T19); + T1d = VSUB(T1b, T1c); + T1j = VADD(T1a, T1d); + { + V Ta, Th, Tt, TA; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + TD = VMUL(LDK(KP559016994), VSUB(Ta, Th)); + Tt = VADD(Tp, Ts); + TA = VADD(Tw, Tz); + TB = VADD(Tt, TA); + TL = VMUL(LDK(KP559016994), VSUB(TA, Tt)); + } + } + Tj = VADD(T3, Ti); + TC = VBYI(VADD(Tm, TB)); + ST(&(xo[WS(os, 5)]), VSUB(Tj, TC), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VADD(Tj, TC), ovs, &(xo[WS(os, 1)])); + { + V T1A, T1C, T1D, T1x, T1G, T1t, T1w, T1F, T1E; + T1A = VMUL(LDK(KP559016994), VSUB(T1y, T1z)); + T1C = VADD(T1y, T1z); + T1D = VFNMS(LDK(KP250000000), T1C, T1B); + T1t = VSUB(T1r, T1s); + T1w = VSUB(T1u, T1v); + T1x = VBYI(VFMA(LDK(KP951056516), T1t, VMUL(LDK(KP587785252), T1w))); + T1G = VBYI(VFNMS(LDK(KP587785252), T1t, VMUL(LDK(KP951056516), T1w))); + ST(&(xo[0]), VADD(T1B, T1C), ovs, &(xo[0])); + T1F = VSUB(T1D, T1A); + ST(&(xo[WS(os, 8)]), VSUB(T1F, T1G), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VADD(T1G, T1F), ovs, &(xo[0])); + T1E = VADD(T1A, T1D); + ST(&(xo[WS(os, 4)]), VADD(T1x, T1E), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VSUB(T1E, T1x), ovs, &(xo[0])); + } + { + V T1n, T1l, T1m, T1f, T1q, T17, T1e, T1p, T1o; + T1n = VMUL(LDK(KP559016994), VSUB(T1j, T1k)); + T1l = VADD(T1j, T1k); + T1m = VFNMS(LDK(KP250000000), T1l, T1i); + T17 = VSUB(T13, T16); + T1e = VSUB(T1a, T1d); + T1f = VBYI(VFNMS(LDK(KP587785252), T1e, VMUL(LDK(KP951056516), T17))); + T1q = VBYI(VFMA(LDK(KP951056516), T1e, VMUL(LDK(KP587785252), T17))); + ST(&(xo[WS(os, 10)]), VADD(T1i, T1l), ovs, &(xo[0])); + T1p = VADD(T1n, T1m); + ST(&(xo[WS(os, 6)]), VSUB(T1p, T1q), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VADD(T1q, T1p), ovs, &(xo[0])); + T1o = VSUB(T1m, T1n); + ST(&(xo[WS(os, 2)]), VADD(T1f, T1o), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VSUB(T1o, T1f), ovs, &(xo[0])); + } + { + V TI, TP, TX, TU, TM, TW, TF, TT, TK, TE; + TI = VFMA(LDK(KP951056516), TG, VMUL(LDK(KP587785252), TH)); + TP = VFMA(LDK(KP951056516), TN, VMUL(LDK(KP587785252), TO)); + TX = VFNMS(LDK(KP587785252), TN, VMUL(LDK(KP951056516), TO)); + TU = VFNMS(LDK(KP587785252), TG, VMUL(LDK(KP951056516), TH)); + TK = VFMS(LDK(KP250000000), TB, Tm); + TM = VADD(TK, TL); + TW = VSUB(TL, TK); + TE = VFNMS(LDK(KP250000000), Ti, T3); + TF = VADD(TD, TE); + TT = VSUB(TE, TD); + { + V TJ, TQ, TZ, T10; + TJ = VADD(TF, TI); + TQ = VBYI(VSUB(TM, TP)); + ST(&(xo[WS(os, 19)]), VSUB(TJ, TQ), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(TJ, TQ), ovs, &(xo[WS(os, 1)])); + TZ = VADD(TT, TU); + T10 = VBYI(VADD(TX, TW)); + ST(&(xo[WS(os, 13)]), VSUB(TZ, T10), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(TZ, T10), ovs, &(xo[WS(os, 1)])); + } + { + V TR, TS, TV, TY; + TR = VSUB(TF, TI); + TS = VBYI(VADD(TP, TM)); + ST(&(xo[WS(os, 11)]), VSUB(TR, TS), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 9)]), VADD(TR, TS), ovs, &(xo[WS(os, 1)])); + TV = VSUB(TT, TU); + TY = VBYI(VSUB(TW, TX)); + ST(&(xo[WS(os, 17)]), VSUB(TV, TY), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(TV, TY), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n1fv_20"), {92, 12, 12, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_20) (planner *p) { + X(kdft_register) (p, n1fv_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_25.c new file mode 100644 index 000000000..b7f5b6e4d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_25.c @@ -0,0 +1,802 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:53 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name n1fv_25 -include dft/simd/n1f.h */ + +/* + * This function contains 224 FP additions, 193 FP multiplications, + * (or, 43 additions, 12 multiplications, 181 fused multiply/add), + * 140 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_25(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(50, is), MAKE_VOLATILE_STRIDE(50, os)) { + V Ta, T2z, T1q, T9, T3n, T3r, T3s, T3t, T1a, T2N, T2V, T1j, T1J, T2o, T2t; + V T1R, TV, T2O, T2W, T1i, T1K, T2l, T2s, T1S, T3o, T3p, T3q, TF, T2R, T2Y; + V T1f, T1N, T2e, T2v, T1V, Tq, T2Q, T2Z, T1e, T1M, T2h, T2w, T1U; + { + V T1, T7, T1p, T4, T1o, T8; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T5, T6, T2, T3; + T5 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + T1p = VSUB(T5, T6); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T1o = VSUB(T2, T3); + } + Ta = VSUB(T4, T7); + T2z = VFNMS(LDK(KP618033988), T1o, T1p); + T1q = VFMA(LDK(KP618033988), T1p, T1o); + T8 = VADD(T4, T7); + T9 = VFNMS(LDK(KP250000000), T8, T1); + T3n = VADD(T1, T8); + } + { + V TH, TW, TO, TT, TQ, TS, T13, T18, T15, T17; + TH = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TW = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + { + V TI, TJ, TK, TL, TM, TN; + TI = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TJ = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TK = VADD(TI, TJ); + TL = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TM = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TN = VADD(TL, TM); + TO = VADD(TK, TN); + TT = VSUB(TM, TL); + TQ = VSUB(TN, TK); + TS = VSUB(TI, TJ); + } + { + V TX, TY, TZ, T10, T11, T12; + TX = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TY = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TZ = VADD(TX, TY); + T10 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T11 = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T12 = VADD(T10, T11); + T13 = VADD(TZ, T12); + T18 = VSUB(T10, T11); + T15 = VSUB(T12, TZ); + T17 = VSUB(TX, TY); + } + T3r = VADD(TH, TO); + T3s = VADD(TW, T13); + T3t = VADD(T3r, T3s); + { + V T19, T2m, T16, T2n, T14; + T19 = VFMA(LDK(KP618033988), T18, T17); + T2m = VFNMS(LDK(KP618033988), T17, T18); + T14 = VFNMS(LDK(KP250000000), T13, TW); + T16 = VFNMS(LDK(KP559016994), T15, T14); + T2n = VFMA(LDK(KP559016994), T15, T14); + T1a = VFNMS(LDK(KP893101515), T19, T16); + T2N = VFMA(LDK(KP066152395), T2n, T2m); + T2V = VFNMS(LDK(KP059835404), T2m, T2n); + T1j = VFMA(LDK(KP987388751), T16, T19); + T1J = VFNMS(LDK(KP120146378), T19, T16); + T2o = VFMA(LDK(KP869845200), T2n, T2m); + T2t = VFNMS(LDK(KP786782374), T2m, T2n); + T1R = VFMA(LDK(KP132830569), T16, T19); + } + { + V TU, T2j, TR, T2k, TP; + TU = VFNMS(LDK(KP618033988), TT, TS); + T2j = VFMA(LDK(KP618033988), TS, TT); + TP = VFNMS(LDK(KP250000000), TO, TH); + TR = VFNMS(LDK(KP559016994), TQ, TP); + T2k = VFMA(LDK(KP559016994), TQ, TP); + TV = VFNMS(LDK(KP522847744), TU, TR); + T2O = VFNMS(LDK(KP667278218), T2k, T2j); + T2W = VFMA(LDK(KP603558818), T2j, T2k); + T1i = VFMA(LDK(KP578046249), TR, TU); + T1K = VFNMS(LDK(KP494780565), TR, TU); + T2l = VFMA(LDK(KP066152395), T2k, T2j); + T2s = VFNMS(LDK(KP059835404), T2j, T2k); + T1S = VFMA(LDK(KP447533225), TU, TR); + } + } + { + V Tc, Ty, Tj, To, Tl, Tn, Tt, TD, Tw, TB; + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + { + V Td, Te, Tf, Tg, Th, Ti; + Td = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Tg = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + Ti = VADD(Tg, Th); + Tj = VADD(Tf, Ti); + To = VSUB(Th, Tg); + Tl = VSUB(Tf, Ti); + Tn = VSUB(Td, Te); + } + { + V Tr, Ts, Tz, Tu, Tv, TA; + Tr = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tz = VADD(Ts, Tr); + Tu = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tv = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TA = VADD(Tv, Tu); + Tt = VSUB(Tr, Ts); + TD = VSUB(Tz, TA); + Tw = VSUB(Tu, Tv); + TB = VADD(Tz, TA); + } + T3o = VADD(Tc, Tj); + T3p = VADD(Ty, TB); + T3q = VADD(T3o, T3p); + { + V Tx, T2d, TE, T2c, TC; + Tx = VFMA(LDK(KP618033988), Tw, Tt); + T2d = VFNMS(LDK(KP618033988), Tt, Tw); + TC = VFMS(LDK(KP250000000), TB, Ty); + TE = VFNMS(LDK(KP559016994), TD, TC); + T2c = VFMA(LDK(KP559016994), TD, TC); + TF = VFNMS(LDK(KP667278218), TE, Tx); + T2R = VFNMS(LDK(KP494780565), T2c, T2d); + T2Y = VFMA(LDK(KP447533225), T2d, T2c); + T1f = VFMA(LDK(KP603558818), Tx, TE); + T1N = VFMA(LDK(KP869845200), TE, Tx); + T2e = VFMA(LDK(KP120146378), T2d, T2c); + T2v = VFNMS(LDK(KP132830569), T2c, T2d); + T1V = VFNMS(LDK(KP786782374), Tx, TE); + } + { + V Tp, T2g, Tm, T2f, Tk; + Tp = VFNMS(LDK(KP618033988), To, Tn); + T2g = VFMA(LDK(KP618033988), Tn, To); + Tk = VFNMS(LDK(KP250000000), Tj, Tc); + Tm = VFMA(LDK(KP559016994), Tl, Tk); + T2f = VFNMS(LDK(KP559016994), Tl, Tk); + Tq = VFNMS(LDK(KP244189809), Tp, Tm); + T2Q = VFNMS(LDK(KP522847744), T2g, T2f); + T2Z = VFMA(LDK(KP578046249), T2f, T2g); + T1e = VFMA(LDK(KP269969613), Tm, Tp); + T1M = VFMA(LDK(KP667278218), Tm, Tp); + T2h = VFMA(LDK(KP893101515), T2g, T2f); + T2w = VFNMS(LDK(KP987388751), T2f, T2g); + T1U = VFNMS(LDK(KP603558818), Tp, Tm); + } + } + { + V T3w, T3u, T3v, T3A, T3C, T3y, T3z, T3B, T3x; + T3w = VSUB(T3q, T3t); + T3u = VADD(T3q, T3t); + T3v = VFNMS(LDK(KP250000000), T3u, T3n); + T3y = VSUB(T3o, T3p); + T3z = VSUB(T3r, T3s); + T3A = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T3z, T3y)); + T3C = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T3y, T3z)); + ST(&(xo[0]), VADD(T3u, T3n), ovs, &(xo[0])); + T3B = VFNMS(LDK(KP559016994), T3w, T3v); + ST(&(xo[WS(os, 10)]), VFMAI(T3C, T3B), ovs, &(xo[0])); + ST(&(xo[WS(os, 15)]), VFNMSI(T3C, T3B), ovs, &(xo[WS(os, 1)])); + T3x = VFMA(LDK(KP559016994), T3w, T3v); + ST(&(xo[WS(os, 5)]), VFNMSI(T3A, T3x), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 20)]), VFMAI(T3A, T3x), ovs, &(xo[0])); + } + { + V T2B, T2H, T2q, T2E, T2y, T2K, T31, T3a, T3l, T3f, T2b, T35, T34, T2T, T33; + V T3h, T37; + T2B = VFMA(LDK(KP734762448), T2w, T2v); + T2H = VFNMS(LDK(KP734762448), T2h, T2e); + { + V T2p, T2i, T2D, T2C; + T2p = VFNMS(LDK(KP772036680), T2o, T2l); + T2i = VFMA(LDK(KP734762448), T2h, T2e); + T2C = VFNMS(LDK(KP772036680), T2t, T2s); + T2D = VFNMS(LDK(KP522616830), T2i, T2C); + T2q = VFMA(LDK(KP956723877), T2p, T2i); + T2E = VFMA(LDK(KP763932022), T2D, T2p); + } + { + V T2u, T2x, T2J, T2I; + T2u = VFMA(LDK(KP772036680), T2t, T2s); + T2x = VFNMS(LDK(KP734762448), T2w, T2v); + T2I = VFMA(LDK(KP772036680), T2o, T2l); + T2J = VFMA(LDK(KP522616830), T2x, T2I); + T2y = VFMA(LDK(KP945422727), T2x, T2u); + T2K = VFNMS(LDK(KP690983005), T2J, T2u); + } + { + V T3e, T3d, T3k, T36, T2P, T2S; + { + V T2X, T30, T3b, T3c; + T2X = VFMA(LDK(KP845997307), T2W, T2V); + T30 = VFNMS(LDK(KP921078979), T2Z, T2Y); + T31 = VFNMS(LDK(KP906616052), T30, T2X); + T3e = VFMA(LDK(KP906616052), T30, T2X); + T3b = VFMA(LDK(KP845997307), T2O, T2N); + T3c = VFMA(LDK(KP982009705), T2R, T2Q); + T3d = VFMA(LDK(KP570584518), T3c, T3b); + T3k = VFNMS(LDK(KP669429328), T3b, T3c); + } + T3a = VFMA(LDK(KP262346850), T31, T2z); + T3l = VFNMS(LDK(KP669429328), T3e, T3k); + T3f = VFMA(LDK(KP618033988), T3e, T3d); + T2b = VFNMS(LDK(KP559016994), Ta, T9); + T35 = VFMA(LDK(KP921078979), T2Z, T2Y); + T34 = VFNMS(LDK(KP845997307), T2W, T2V); + T2P = VFNMS(LDK(KP845997307), T2O, T2N); + T2S = VFNMS(LDK(KP982009705), T2R, T2Q); + T2T = VFMA(LDK(KP923225144), T2S, T2P); + T36 = VFNMS(LDK(KP923225144), T2S, T2P); + T33 = VFNMS(LDK(KP237294955), T2T, T2b); + T3h = VFNMS(LDK(KP904508497), T36, T34); + T37 = VFNMS(LDK(KP997675361), T36, T35); + } + { + V T2r, T2A, T2U, T32; + T2r = VFMA(LDK(KP992114701), T2q, T2b); + T2A = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T2z, T2y)); + ST(&(xo[WS(os, 3)]), VFNMSI(T2A, T2r), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 22)]), VFMAI(T2A, T2r), ovs, &(xo[0])); + T2U = VFMA(LDK(KP949179823), T2T, T2b); + T32 = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T2z, T31)); + ST(&(xo[WS(os, 2)]), VFNMSI(T32, T2U), ovs, &(xo[0])); + ST(&(xo[WS(os, 23)]), VFMAI(T32, T2U), ovs, &(xo[WS(os, 1)])); + } + { + V T3g, T39, T38, T3m, T3j, T3i; + T3g = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T3f, T3a)); + T38 = VFMA(LDK(KP560319534), T37, T34); + T39 = VFNMS(LDK(KP949179823), T38, T33); + ST(&(xo[WS(os, 13)]), VFNMSI(T3g, T39), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 12)]), VFMAI(T3g, T39), ovs, &(xo[0])); + T3m = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T3l, T3a)); + T3i = VFNMS(LDK(KP681693190), T3h, T35); + T3j = VFNMS(LDK(KP860541664), T3i, T33); + ST(&(xo[WS(os, 18)]), VFNMSI(T3m, T3j), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFMAI(T3m, T3j), ovs, &(xo[WS(os, 1)])); + { + V T2G, T2M, T2F, T2L; + T2F = VFNMS(LDK(KP855719849), T2E, T2B); + T2G = VFMA(LDK(KP897376177), T2F, T2b); + T2L = VFMA(LDK(KP855719849), T2K, T2H); + T2M = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2L, T2z)); + ST(&(xo[WS(os, 8)]), VFNMSI(T2M, T2G), ovs, &(xo[0])); + ST(&(xo[WS(os, 17)]), VFMAI(T2M, T2G), ovs, &(xo[WS(os, 1)])); + } + } + } + { + V T1Z, T25, T1P, T22, T1X, T28, T1t, T1u, T1F, T1z, Tb, T1k, T1g, T1c, T1d; + V T1B, T1l; + T1Z = VFNMS(LDK(KP912575812), T1V, T1U); + T25 = VFNMS(LDK(KP912575812), T1N, T1M); + { + V T1L, T1O, T21, T20; + T1L = VFNMS(LDK(KP867381224), T1K, T1J); + T1O = VFMA(LDK(KP912575812), T1N, T1M); + T20 = VFNMS(LDK(KP958953096), T1S, T1R); + T21 = VFMA(LDK(KP447417479), T1O, T20); + T1P = VFNMS(LDK(KP809385824), T1O, T1L); + T22 = VFMA(LDK(KP690983005), T21, T1L); + } + { + V T1T, T1W, T27, T26; + T1T = VFMA(LDK(KP958953096), T1S, T1R); + T1W = VFMA(LDK(KP912575812), T1V, T1U); + T26 = VFMA(LDK(KP867381224), T1K, T1J); + T27 = VFMA(LDK(KP447417479), T1W, T26); + T1X = VFMA(LDK(KP894834959), T1W, T1T); + T28 = VFNMS(LDK(KP763932022), T27, T1T); + } + { + V T1y, T1x, T1E, T1h, TG, T1b; + { + V T1r, T1s, T1v, T1w; + T1r = VFNMS(LDK(KP916574801), T1f, T1e); + T1s = VFMA(LDK(KP831864738), T1j, T1i); + T1t = VFMA(LDK(KP904730450), T1s, T1r); + T1y = VFNMS(LDK(KP904730450), T1s, T1r); + T1v = VFNMS(LDK(KP829049696), TF, Tq); + T1w = VFNMS(LDK(KP831864738), T1a, TV); + T1x = VFMA(LDK(KP559154169), T1w, T1v); + T1E = VFNMS(LDK(KP683113946), T1v, T1w); + } + T1u = VFNMS(LDK(KP242145790), T1t, T1q); + T1F = VFMA(LDK(KP617882369), T1y, T1E); + T1z = VFMA(LDK(KP559016994), T1y, T1x); + Tb = VFMA(LDK(KP559016994), Ta, T9); + T1k = VFNMS(LDK(KP831864738), T1j, T1i); + T1g = VFMA(LDK(KP916574801), T1f, T1e); + TG = VFMA(LDK(KP829049696), TF, Tq); + T1b = VFMA(LDK(KP831864738), T1a, TV); + T1c = VFMA(LDK(KP904730450), T1b, TG); + T1h = VFNMS(LDK(KP904730450), T1b, TG); + T1d = VFNMS(LDK(KP242145790), T1c, Tb); + T1B = VADD(T1g, T1h); + T1l = VFNMS(LDK(KP904730450), T1k, T1h); + } + { + V T1H, T1I, T1Q, T1Y; + T1H = VFMA(LDK(KP968583161), T1c, Tb); + T1I = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1t, T1q)); + ST(&(xo[WS(os, 1)]), VFNMSI(T1I, T1H), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 24)]), VFMAI(T1I, T1H), ovs, &(xo[0])); + T1Q = VFNMS(LDK(KP992114701), T1P, Tb); + T1Y = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T1X, T1q)); + ST(&(xo[WS(os, 4)]), VFMAI(T1Y, T1Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 21)]), VFNMSI(T1Y, T1Q), ovs, &(xo[WS(os, 1)])); + } + { + V T1A, T1n, T1m, T1G, T1D, T1C; + T1A = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1z, T1u)); + T1m = VFNMS(LDK(KP618033988), T1l, T1g); + T1n = VFNMS(LDK(KP876091699), T1m, T1d); + ST(&(xo[WS(os, 6)]), VFNMSI(T1A, T1n), ovs, &(xo[0])); + ST(&(xo[WS(os, 19)]), VFMAI(T1A, T1n), ovs, &(xo[WS(os, 1)])); + T1G = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T1F, T1u)); + T1C = VFNMS(LDK(KP683113946), T1B, T1k); + T1D = VFMA(LDK(KP792626838), T1C, T1d); + ST(&(xo[WS(os, 11)]), VFNMSI(T1G, T1D), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 14)]), VFMAI(T1G, T1D), ovs, &(xo[0])); + { + V T24, T2a, T23, T29; + T23 = VFNMS(LDK(KP999544308), T22, T1Z); + T24 = VFNMS(LDK(KP803003575), T23, Tb); + T29 = VFNMS(LDK(KP999544308), T28, T25); + T2a = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T29, T1q)); + ST(&(xo[WS(os, 16)]), VFNMSI(T2a, T24), ovs, &(xo[0])); + ST(&(xo[WS(os, 9)]), VFMAI(T2a, T24), ovs, &(xo[WS(os, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 25, XSIMD_STRING("n1fv_25"), {43, 12, 181, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_25) (planner *p) { + X(kdft_register) (p, n1fv_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name n1fv_25 -include dft/simd/n1f.h */ + +/* + * This function contains 224 FP additions, 140 FP multiplications, + * (or, 146 additions, 62 multiplications, 78 fused multiply/add), + * 115 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_25(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(50, is), MAKE_VOLATILE_STRIDE(50, os)) { + V T7, T1g, T26, Ta, T2R, T2N, T2O, T2P, T19, T1Y, T16, T1Z, T1a, T2v, T1l; + V T2m, TU, T21, TR, T22, TV, T2u, T1k, T2l, T2K, T2L, T2M, TE, T1R, TB; + V T1S, TF, T2r, T1i, T2j, Tp, T1U, Tm, T1V, Tq, T2s, T1h, T2i; + { + V T8, T6, T1f, T3, T1e, T25, T9; + T8 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T4, T5, T1, T2; + T4 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T6 = VADD(T4, T5); + T1f = VSUB(T4, T5); + T1 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T1e = VSUB(T1, T2); + } + T7 = VMUL(LDK(KP559016994), VSUB(T3, T6)); + T1g = VFMA(LDK(KP951056516), T1e, VMUL(LDK(KP587785252), T1f)); + T25 = VMUL(LDK(KP951056516), T1f); + T26 = VFNMS(LDK(KP587785252), T1e, T25); + T9 = VADD(T3, T6); + Ta = VFNMS(LDK(KP250000000), T9, T8); + T2R = VADD(T8, T9); + } + { + V TO, T13, TN, TT, TP, TS, T12, T18, T14, T17, T15, TQ; + TO = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + { + V TH, TI, TJ, TK, TL, TM; + TH = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TI = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TJ = VADD(TH, TI); + TK = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TL = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TM = VADD(TK, TL); + TN = VMUL(LDK(KP559016994), VSUB(TJ, TM)); + TT = VSUB(TK, TL); + TP = VADD(TJ, TM); + TS = VSUB(TH, TI); + } + { + V TW, TX, TY, TZ, T10, T11; + TW = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TX = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TY = VADD(TW, TX); + TZ = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T10 = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + T11 = VADD(TZ, T10); + T12 = VMUL(LDK(KP559016994), VSUB(TY, T11)); + T18 = VSUB(TZ, T10); + T14 = VADD(TY, T11); + T17 = VSUB(TW, TX); + } + T2N = VADD(TO, TP); + T2O = VADD(T13, T14); + T2P = VADD(T2N, T2O); + T19 = VFMA(LDK(KP475528258), T17, VMUL(LDK(KP293892626), T18)); + T1Y = VFNMS(LDK(KP293892626), T17, VMUL(LDK(KP475528258), T18)); + T15 = VFNMS(LDK(KP250000000), T14, T13); + T16 = VADD(T12, T15); + T1Z = VSUB(T15, T12); + T1a = VFNMS(LDK(KP1_369094211), T19, VMUL(LDK(KP728968627), T16)); + T2v = VFMA(LDK(KP1_996053456), T1Y, VMUL(LDK(KP062790519), T1Z)); + T1l = VFMA(LDK(KP1_457937254), T19, VMUL(LDK(KP684547105), T16)); + T2m = VFNMS(LDK(KP998026728), T1Z, VMUL(LDK(KP125581039), T1Y)); + TU = VFMA(LDK(KP475528258), TS, VMUL(LDK(KP293892626), TT)); + T21 = VFNMS(LDK(KP293892626), TS, VMUL(LDK(KP475528258), TT)); + TQ = VFNMS(LDK(KP250000000), TP, TO); + TR = VADD(TN, TQ); + T22 = VSUB(TQ, TN); + TV = VFNMS(LDK(KP963507348), TU, VMUL(LDK(KP876306680), TR)); + T2u = VFMA(LDK(KP1_688655851), T21, VMUL(LDK(KP535826794), T22)); + T1k = VFMA(LDK(KP1_752613360), TU, VMUL(LDK(KP481753674), TR)); + T2l = VFNMS(LDK(KP844327925), T22, VMUL(LDK(KP1_071653589), T21)); + } + { + V Tj, Ty, Ti, To, Tk, Tn, Tx, TD, Tz, TC, TA, Tl; + Tj = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + { + V Tc, Td, Te, Tf, Tg, Th; + Tc = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Te = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + Th = VADD(Tf, Tg); + Ti = VMUL(LDK(KP559016994), VSUB(Te, Th)); + To = VSUB(Tf, Tg); + Tk = VADD(Te, Th); + Tn = VSUB(Tc, Td); + } + { + V Tr, Ts, Tt, Tu, Tv, Tw; + Tr = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ts = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + Tu = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tv = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tw = VADD(Tu, Tv); + Tx = VMUL(LDK(KP559016994), VSUB(Tt, Tw)); + TD = VSUB(Tu, Tv); + Tz = VADD(Tt, Tw); + TC = VSUB(Tr, Ts); + } + T2K = VADD(Tj, Tk); + T2L = VADD(Ty, Tz); + T2M = VADD(T2K, T2L); + TE = VFMA(LDK(KP475528258), TC, VMUL(LDK(KP293892626), TD)); + T1R = VFNMS(LDK(KP293892626), TC, VMUL(LDK(KP475528258), TD)); + TA = VFNMS(LDK(KP250000000), Tz, Ty); + TB = VADD(Tx, TA); + T1S = VSUB(TA, Tx); + TF = VFNMS(LDK(KP1_688655851), TE, VMUL(LDK(KP535826794), TB)); + T2r = VFNMS(LDK(KP425779291), T1S, VMUL(LDK(KP1_809654104), T1R)); + T1i = VFMA(LDK(KP1_071653589), TE, VMUL(LDK(KP844327925), TB)); + T2j = VFMA(LDK(KP851558583), T1R, VMUL(LDK(KP904827052), T1S)); + Tp = VFMA(LDK(KP475528258), Tn, VMUL(LDK(KP293892626), To)); + T1U = VFNMS(LDK(KP293892626), Tn, VMUL(LDK(KP475528258), To)); + Tl = VFNMS(LDK(KP250000000), Tk, Tj); + Tm = VADD(Ti, Tl); + T1V = VSUB(Tl, Ti); + Tq = VFNMS(LDK(KP497379774), Tp, VMUL(LDK(KP968583161), Tm)); + T2s = VFMA(LDK(KP963507348), T1U, VMUL(LDK(KP876306680), T1V)); + T1h = VFMA(LDK(KP1_937166322), Tp, VMUL(LDK(KP248689887), Tm)); + T2i = VFNMS(LDK(KP481753674), T1V, VMUL(LDK(KP1_752613360), T1U)); + } + { + V T2Q, T2S, T2T, T2X, T2Y, T2V, T2W, T2Z, T2U; + T2Q = VMUL(LDK(KP559016994), VSUB(T2M, T2P)); + T2S = VADD(T2M, T2P); + T2T = VFNMS(LDK(KP250000000), T2S, T2R); + T2V = VSUB(T2K, T2L); + T2W = VSUB(T2N, T2O); + T2X = VBYI(VFMA(LDK(KP951056516), T2V, VMUL(LDK(KP587785252), T2W))); + T2Y = VBYI(VFNMS(LDK(KP587785252), T2V, VMUL(LDK(KP951056516), T2W))); + ST(&(xo[0]), VADD(T2R, T2S), ovs, &(xo[0])); + T2Z = VSUB(T2T, T2Q); + ST(&(xo[WS(os, 10)]), VADD(T2Y, T2Z), ovs, &(xo[0])); + ST(&(xo[WS(os, 15)]), VSUB(T2Z, T2Y), ovs, &(xo[WS(os, 1)])); + T2U = VADD(T2Q, T2T); + ST(&(xo[WS(os, 5)]), VSUB(T2U, T2X), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 20)]), VADD(T2X, T2U), ovs, &(xo[0])); + } + { + V T2t, T2y, T2z, T2w, T1T, T1W, T1X, T2c, T2d, T2e, T29, T2a, T2b, T20, T23; + V T24, T2p, T2o, T2q, T28, T2D, T2C, T2E, T2x, T2F; + T2t = VSUB(T2r, T2s); + T2y = VADD(T2i, T2j); + T2z = VSUB(T2l, T2m); + T2w = VSUB(T2u, T2v); + T1T = VFNMS(LDK(KP125333233), T1S, VMUL(LDK(KP1_984229402), T1R)); + T1W = VFMA(LDK(KP1_457937254), T1U, VMUL(LDK(KP684547105), T1V)); + T1X = VSUB(T1T, T1W); + T2c = VFNMS(LDK(KP1_996053456), T21, VMUL(LDK(KP062790519), T22)); + T2d = VFMA(LDK(KP1_541026485), T1Y, VMUL(LDK(KP637423989), T1Z)); + T2e = VSUB(T2c, T2d); + T29 = VFNMS(LDK(KP1_369094211), T1U, VMUL(LDK(KP728968627), T1V)); + T2a = VFMA(LDK(KP250666467), T1R, VMUL(LDK(KP992114701), T1S)); + T2b = VSUB(T29, T2a); + T20 = VFNMS(LDK(KP770513242), T1Z, VMUL(LDK(KP1_274847979), T1Y)); + T23 = VFMA(LDK(KP125581039), T21, VMUL(LDK(KP998026728), T22)); + T24 = VSUB(T20, T23); + { + V T2k, T2n, T2A, T2B; + T2k = VSUB(T2i, T2j); + T2n = VADD(T2l, T2m); + T2p = VADD(T2k, T2n); + T2o = VMUL(LDK(KP559016994), VSUB(T2k, T2n)); + T2q = VFNMS(LDK(KP250000000), T2p, T26); + T28 = VSUB(Ta, T7); + T2A = VADD(T2s, T2r); + T2B = VADD(T2u, T2v); + T2D = VADD(T2A, T2B); + T2C = VMUL(LDK(KP559016994), VSUB(T2A, T2B)); + T2E = VFNMS(LDK(KP250000000), T2D, T28); + } + { + V T2I, T2J, T27, T2f; + T2I = VBYI(VADD(T26, T2p)); + T2J = VADD(T28, T2D); + ST(&(xo[WS(os, 2)]), VADD(T2I, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 23)]), VSUB(T2J, T2I), ovs, &(xo[WS(os, 1)])); + T27 = VBYI(VSUB(VADD(T1X, T24), T26)); + T2f = VADD(T28, VADD(T2b, T2e)); + ST(&(xo[WS(os, 3)]), VADD(T27, T2f), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 22)]), VSUB(T2f, T27), ovs, &(xo[0])); + } + T2x = VBYI(VADD(T2o, VADD(T2q, VFNMS(LDK(KP587785252), T2w, VMUL(LDK(KP951056516), T2t))))); + T2F = VFMA(LDK(KP951056516), T2y, VFMA(LDK(KP587785252), T2z, VADD(T2C, T2E))); + ST(&(xo[WS(os, 7)]), VADD(T2x, T2F), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 18)]), VSUB(T2F, T2x), ovs, &(xo[0])); + { + V T2G, T2H, T2g, T2h; + T2G = VBYI(VADD(T2q, VSUB(VFMA(LDK(KP587785252), T2t, VMUL(LDK(KP951056516), T2w)), T2o))); + T2H = VFMA(LDK(KP587785252), T2y, VSUB(VFNMS(LDK(KP951056516), T2z, T2E), T2C)); + ST(&(xo[WS(os, 12)]), VADD(T2G, T2H), ovs, &(xo[0])); + ST(&(xo[WS(os, 13)]), VSUB(T2H, T2G), ovs, &(xo[WS(os, 1)])); + T2g = VFMA(LDK(KP309016994), T2b, VFNMS(LDK(KP809016994), T2e, VFNMS(LDK(KP587785252), VADD(T23, T20), VFNMS(LDK(KP951056516), VADD(T1W, T1T), T28)))); + T2h = VBYI(VSUB(VFNMS(LDK(KP587785252), VADD(T2c, T2d), VFNMS(LDK(KP809016994), T24, VFNMS(LDK(KP951056516), VADD(T29, T2a), VMUL(LDK(KP309016994), T1X)))), T26)); + ST(&(xo[WS(os, 17)]), VSUB(T2g, T2h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VADD(T2g, T2h), ovs, &(xo[0])); + } + } + { + V T1p, T1u, T1w, T1q, T1B, T1C, T1D, T1L, T1M, T1N, T1I, T1J, T1K, T1E, T1F; + V T1G, T1n, T1r, T1s, Tb, T1c, T1v, T1x, T1t, T1y; + T1p = VSUB(TF, Tq); + T1u = VSUB(T1i, T1h); + T1w = VSUB(T1l, T1k); + T1q = VSUB(TV, T1a); + T1B = VFMA(LDK(KP1_688655851), Tp, VMUL(LDK(KP535826794), Tm)); + T1C = VFMA(LDK(KP1_541026485), TE, VMUL(LDK(KP637423989), TB)); + T1D = VSUB(T1B, T1C); + T1L = VFMA(LDK(KP851558583), TU, VMUL(LDK(KP904827052), TR)); + T1M = VFMA(LDK(KP1_984229402), T19, VMUL(LDK(KP125333233), T16)); + T1N = VADD(T1L, T1M); + T1I = VFNMS(LDK(KP844327925), Tm, VMUL(LDK(KP1_071653589), Tp)); + T1J = VFNMS(LDK(KP1_274847979), TE, VMUL(LDK(KP770513242), TB)); + T1K = VADD(T1I, T1J); + T1E = VFNMS(LDK(KP425779291), TR, VMUL(LDK(KP1_809654104), TU)); + T1F = VFNMS(LDK(KP992114701), T16, VMUL(LDK(KP250666467), T19)); + T1G = VADD(T1E, T1F); + { + V T1j, T1m, TG, T1b; + T1j = VADD(T1h, T1i); + T1m = VADD(T1k, T1l); + T1n = VADD(T1j, T1m); + T1r = VFMS(LDK(KP250000000), T1n, T1g); + T1s = VMUL(LDK(KP559016994), VSUB(T1m, T1j)); + Tb = VADD(T7, Ta); + TG = VADD(Tq, TF); + T1b = VADD(TV, T1a); + T1c = VADD(TG, T1b); + T1v = VFNMS(LDK(KP250000000), T1c, Tb); + T1x = VMUL(LDK(KP559016994), VSUB(TG, T1b)); + } + { + V T1d, T1o, T1H, T1O; + T1d = VADD(Tb, T1c); + T1o = VBYI(VADD(T1g, T1n)); + ST(&(xo[WS(os, 1)]), VSUB(T1d, T1o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 24)]), VADD(T1d, T1o), ovs, &(xo[0])); + T1H = VADD(Tb, VADD(T1D, T1G)); + T1O = VBYI(VADD(T1g, VSUB(T1K, T1N))); + ST(&(xo[WS(os, 21)]), VSUB(T1H, T1O), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VADD(T1H, T1O), ovs, &(xo[0])); + } + T1t = VBYI(VADD(VFMA(LDK(KP587785252), T1p, VMUL(LDK(KP951056516), T1q)), VSUB(T1r, T1s))); + T1y = VFMA(LDK(KP587785252), T1u, VFNMS(LDK(KP951056516), T1w, VSUB(T1v, T1x))); + ST(&(xo[WS(os, 11)]), VADD(T1t, T1y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 14)]), VSUB(T1y, T1t), ovs, &(xo[0])); + { + V T1z, T1A, T1P, T1Q; + T1z = VBYI(VADD(VFNMS(LDK(KP587785252), T1q, VMUL(LDK(KP951056516), T1p)), VADD(T1r, T1s))); + T1A = VFMA(LDK(KP951056516), T1u, VADD(T1x, VFMA(LDK(KP587785252), T1w, T1v))); + ST(&(xo[WS(os, 6)]), VADD(T1z, T1A), ovs, &(xo[0])); + ST(&(xo[WS(os, 19)]), VSUB(T1A, T1z), ovs, &(xo[WS(os, 1)])); + T1P = VBYI(VADD(T1g, VFMA(LDK(KP309016994), T1K, VFMA(LDK(KP587785252), VSUB(T1F, T1E), VFNMS(LDK(KP951056516), VADD(T1B, T1C), VMUL(LDK(KP809016994), T1N)))))); + T1Q = VFMA(LDK(KP309016994), T1D, VFMA(LDK(KP951056516), VSUB(T1I, T1J), VFMA(LDK(KP587785252), VSUB(T1M, T1L), VFNMS(LDK(KP809016994), T1G, Tb)))); + ST(&(xo[WS(os, 9)]), VADD(T1P, T1Q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 16)]), VSUB(T1Q, T1P), ovs, &(xo[0])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 25, XSIMD_STRING("n1fv_25"), {146, 62, 78, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_25) (planner *p) { + X(kdft_register) (p, n1fv_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_3.c new file mode 100644 index 000000000..b5e5a9c50 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_3.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name n1fv_3 -include dft/simd/n1f.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 3 additions, 1 multiplications, 3 fused multiply/add), + * 11 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_3(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(6, is), MAKE_VOLATILE_STRIDE(6, os)) { + V T1, T4, T6, T2, T3, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T6 = VMUL(LDK(KP866025403), VSUB(T3, T2)); + ST(&(xo[0]), VADD(T1, T4), ovs, &(xo[0])); + T5 = VFNMS(LDK(KP500000000), T4, T1); + ST(&(xo[WS(os, 2)]), VFNMSI(T6, T5), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VFMAI(T6, T5), ovs, &(xo[WS(os, 1)])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 3, XSIMD_STRING("n1fv_3"), {3, 1, 3, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_3) (planner *p) { + X(kdft_register) (p, n1fv_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name n1fv_3 -include dft/simd/n1f.h */ + +/* + * This function contains 6 FP additions, 2 FP multiplications, + * (or, 5 additions, 1 multiplications, 1 fused multiply/add), + * 11 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_3(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(6, is), MAKE_VOLATILE_STRIDE(6, os)) { + V T1, T4, T6, T2, T3, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T6 = VBYI(VMUL(LDK(KP866025403), VSUB(T3, T2))); + ST(&(xo[0]), VADD(T1, T4), ovs, &(xo[0])); + T5 = VFNMS(LDK(KP500000000), T4, T1); + ST(&(xo[WS(os, 2)]), VSUB(T5, T6), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(T5, T6), ovs, &(xo[WS(os, 1)])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 3, XSIMD_STRING("n1fv_3"), {5, 1, 1, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_3) (planner *p) { + X(kdft_register) (p, n1fv_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_32.c new file mode 100644 index 000000000..9c64fb729 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_32.c @@ -0,0 +1,730 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:52 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name n1fv_32 -include dft/simd/n1f.h */ + +/* + * This function contains 186 FP additions, 98 FP multiplications, + * (or, 88 additions, 0 multiplications, 98 fused multiply/add), + * 58 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T1T, T1W, T2K, T2x, T16, T1A, Tb, T1p, TT, T1v, TY, T1w, T27, T2a, T2b; + V T2H, T2N, TC, T1s, TH, T1t, T20, T23, T24, T2E, T2O, T2g, T2j, Tq, T1B; + V T19, T1q, T2A, T2L; + { + V T3, T1R, T14, T1S, T6, T1U, T9, T1V, T15, Ta; + { + V T1, T2, T12, T13; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T1R = VADD(T1, T2); + T12 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T14 = VSUB(T12, T13); + T1S = VADD(T12, T13); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T1U = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1V = VADD(T7, T8); + } + T1T = VADD(T1R, T1S); + T1W = VADD(T1U, T1V); + T2K = VSUB(T1V, T1U); + T2x = VSUB(T1R, T1S); + T15 = VSUB(T9, T6); + T16 = VFNMS(LDK(KP707106781), T15, T14); + T1A = VFMA(LDK(KP707106781), T15, T14); + Ta = VADD(T6, T9); + Tb = VFMA(LDK(KP707106781), Ta, T3); + T1p = VFNMS(LDK(KP707106781), Ta, T3); + } + { + V TL, T25, TW, T26, TO, T28, TR, T29; + { + V TJ, TK, TU, TV; + TJ = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T25 = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TW = VSUB(TU, TV); + T26 = VADD(TV, TU); + } + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T28 = VADD(TM, TN); + TP = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TQ = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TR = VSUB(TP, TQ); + T29 = VADD(TP, TQ); + } + { + V TS, TX, T2F, T2G; + TS = VADD(TO, TR); + TT = VFMA(LDK(KP707106781), TS, TL); + T1v = VFNMS(LDK(KP707106781), TS, TL); + TX = VSUB(TR, TO); + TY = VFMA(LDK(KP707106781), TX, TW); + T1w = VFNMS(LDK(KP707106781), TX, TW); + T27 = VADD(T25, T26); + T2a = VADD(T28, T29); + T2b = VSUB(T27, T2a); + T2F = VSUB(T25, T26); + T2G = VSUB(T29, T28); + T2H = VFNMS(LDK(KP414213562), T2G, T2F); + T2N = VFMA(LDK(KP414213562), T2F, T2G); + } + } + { + V Tu, T1Y, TF, T1Z, Tx, T21, TA, T22; + { + V Ts, Tt, TD, TE; + Ts = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1Y = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TF = VSUB(TD, TE); + T1Z = VADD(TD, TE); + } + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T21 = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tz = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TA = VSUB(Ty, Tz); + T22 = VADD(Ty, Tz); + } + { + V TB, TG, T2C, T2D; + TB = VADD(Tx, TA); + TC = VFMA(LDK(KP707106781), TB, Tu); + T1s = VFNMS(LDK(KP707106781), TB, Tu); + TG = VSUB(Tx, TA); + TH = VFMA(LDK(KP707106781), TG, TF); + T1t = VFNMS(LDK(KP707106781), TG, TF); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VSUB(T20, T23); + T2C = VSUB(T1Y, T1Z); + T2D = VSUB(T21, T22); + T2E = VFNMS(LDK(KP414213562), T2D, T2C); + T2O = VFMA(LDK(KP414213562), T2C, T2D); + } + } + { + V Te, T2h, To, T2f, Th, T2i, Tl, T2e, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T2h = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T2f = VADD(Tn, Tm); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T2i = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2e = VADD(Tj, Tk); + } + T2g = VADD(T2e, T2f); + T2j = VADD(T2h, T2i); + Ti = VFNMS(LDK(KP414213562), Th, Te); + Tp = VFNMS(LDK(KP414213562), To, Tl); + Tq = VADD(Ti, Tp); + T1B = VSUB(Tp, Ti); + { + V T17, T18, T2y, T2z; + T17 = VFMA(LDK(KP414213562), Te, Th); + T18 = VFMA(LDK(KP414213562), Tl, To); + T19 = VSUB(T17, T18); + T1q = VADD(T17, T18); + T2y = VSUB(T2h, T2i); + T2z = VSUB(T2e, T2f); + T2A = VADD(T2y, T2z); + T2L = VSUB(T2z, T2y); + } + } + { + V T2d, T2n, T2m, T2o; + { + V T1X, T2c, T2k, T2l; + T1X = VSUB(T1T, T1W); + T2c = VADD(T24, T2b); + T2d = VFNMS(LDK(KP707106781), T2c, T1X); + T2n = VFMA(LDK(KP707106781), T2c, T1X); + T2k = VSUB(T2g, T2j); + T2l = VSUB(T2b, T24); + T2m = VFNMS(LDK(KP707106781), T2l, T2k); + T2o = VFMA(LDK(KP707106781), T2l, T2k); + } + ST(&(xo[WS(os, 12)]), VFNMSI(T2m, T2d), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(T2o, T2n), ovs, &(xo[0])); + ST(&(xo[WS(os, 20)]), VFMAI(T2m, T2d), ovs, &(xo[0])); + ST(&(xo[WS(os, 28)]), VFNMSI(T2o, T2n), ovs, &(xo[0])); + } + { + V T2r, T2v, T2u, T2w; + { + V T2p, T2q, T2s, T2t; + T2p = VADD(T1T, T1W); + T2q = VADD(T2j, T2g); + T2r = VADD(T2p, T2q); + T2v = VSUB(T2p, T2q); + T2s = VADD(T20, T23); + T2t = VADD(T27, T2a); + T2u = VADD(T2s, T2t); + T2w = VSUB(T2t, T2s); + } + ST(&(xo[WS(os, 16)]), VSUB(T2r, T2u), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFMAI(T2w, T2v), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T2r, T2u), ovs, &(xo[0])); + ST(&(xo[WS(os, 24)]), VFNMSI(T2w, T2v), ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VFNMS(LDK(KP707106781), T2A, T2x); + T2U = VADD(T2O, T2N); + T2V = VFNMS(LDK(KP923879532), T2U, T2T); + T2Z = VFMA(LDK(KP923879532), T2U, T2T); + T2W = VFNMS(LDK(KP707106781), T2L, T2K); + T2X = VSUB(T2H, T2E); + T2Y = VFMA(LDK(KP923879532), T2X, T2W); + T30 = VFNMS(LDK(KP923879532), T2X, T2W); + } + ST(&(xo[WS(os, 10)]), VFMAI(T2Y, T2V), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VFMAI(T30, T2Z), ovs, &(xo[0])); + ST(&(xo[WS(os, 22)]), VFNMSI(T2Y, T2V), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VFNMSI(T30, T2Z), ovs, &(xo[0])); + } + { + V T2J, T2R, T2Q, T2S; + { + V T2B, T2I, T2M, T2P; + T2B = VFMA(LDK(KP707106781), T2A, T2x); + T2I = VADD(T2E, T2H); + T2J = VFNMS(LDK(KP923879532), T2I, T2B); + T2R = VFMA(LDK(KP923879532), T2I, T2B); + T2M = VFMA(LDK(KP707106781), T2L, T2K); + T2P = VSUB(T2N, T2O); + T2Q = VFNMS(LDK(KP923879532), T2P, T2M); + T2S = VFMA(LDK(KP923879532), T2P, T2M); + } + ST(&(xo[WS(os, 14)]), VFNMSI(T2Q, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(T2S, T2R), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VFMAI(T2Q, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 30)]), VFNMSI(T2S, T2R), ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1J, T1F, T1K, T1y, T1N; + T1r = VFMA(LDK(KP923879532), T1q, T1p); + T1C = VFMA(LDK(KP923879532), T1B, T1A); + T1M = VFNMS(LDK(KP923879532), T1B, T1A); + T1J = VFNMS(LDK(KP923879532), T1q, T1p); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP668178637), T1s, T1t); + T1E = VFNMS(LDK(KP668178637), T1v, T1w); + T1F = VSUB(T1D, T1E); + T1K = VADD(T1D, T1E); + T1u = VFMA(LDK(KP668178637), T1t, T1s); + T1x = VFMA(LDK(KP668178637), T1w, T1v); + T1y = VADD(T1u, T1x); + T1N = VSUB(T1x, T1u); + } + { + V T1z, T1G, T1P, T1Q; + T1z = VFNMS(LDK(KP831469612), T1y, T1r); + T1G = VFNMS(LDK(KP831469612), T1F, T1C); + ST(&(xo[WS(os, 13)]), VFNMSI(T1G, T1z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 19)]), VFMAI(T1G, T1z), ovs, &(xo[WS(os, 1)])); + T1P = VFNMS(LDK(KP831469612), T1K, T1J); + T1Q = VFNMS(LDK(KP831469612), T1N, T1M); + ST(&(xo[WS(os, 5)]), VFNMSI(T1Q, T1P), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 27)]), VFMAI(T1Q, T1P), ovs, &(xo[WS(os, 1)])); + } + { + V T1H, T1I, T1L, T1O; + T1H = VFMA(LDK(KP831469612), T1y, T1r); + T1I = VFMA(LDK(KP831469612), T1F, T1C); + ST(&(xo[WS(os, 29)]), VFNMSI(T1I, T1H), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(T1I, T1H), ovs, &(xo[WS(os, 1)])); + T1L = VFMA(LDK(KP831469612), T1K, T1J); + T1O = VFMA(LDK(KP831469612), T1N, T1M); + ST(&(xo[WS(os, 11)]), VFMAI(T1O, T1L), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 21)]), VFNMSI(T1O, T1L), ovs, &(xo[WS(os, 1)])); + } + } + { + V Tr, T1a, T1k, T1h, T1d, T1i, T10, T1l; + Tr = VFMA(LDK(KP923879532), Tq, Tb); + T1a = VFMA(LDK(KP923879532), T19, T16); + T1k = VFNMS(LDK(KP923879532), T19, T16); + T1h = VFNMS(LDK(KP923879532), Tq, Tb); + { + V T1b, T1c, TI, TZ; + T1b = VFMA(LDK(KP198912367), TC, TH); + T1c = VFMA(LDK(KP198912367), TT, TY); + T1d = VSUB(T1b, T1c); + T1i = VADD(T1b, T1c); + TI = VFNMS(LDK(KP198912367), TH, TC); + TZ = VFNMS(LDK(KP198912367), TY, TT); + T10 = VADD(TI, TZ); + T1l = VSUB(TZ, TI); + } + { + V T11, T1e, T1n, T1o; + T11 = VFNMS(LDK(KP980785280), T10, Tr); + T1e = VFNMS(LDK(KP980785280), T1d, T1a); + ST(&(xo[WS(os, 17)]), VFNMSI(T1e, T11), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VFMAI(T1e, T11), ovs, &(xo[WS(os, 1)])); + T1n = VFMA(LDK(KP980785280), T1i, T1h); + T1o = VFMA(LDK(KP980785280), T1l, T1k); + ST(&(xo[WS(os, 7)]), VFMAI(T1o, T1n), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 25)]), VFNMSI(T1o, T1n), ovs, &(xo[WS(os, 1)])); + } + { + V T1f, T1g, T1j, T1m; + T1f = VFMA(LDK(KP980785280), T10, Tr); + T1g = VFMA(LDK(KP980785280), T1d, T1a); + ST(&(xo[WS(os, 1)]), VFNMSI(T1g, T1f), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 31)]), VFMAI(T1g, T1f), ovs, &(xo[WS(os, 1)])); + T1j = VFNMS(LDK(KP980785280), T1i, T1h); + T1m = VFNMS(LDK(KP980785280), T1l, T1k); + ST(&(xo[WS(os, 9)]), VFNMSI(T1m, T1j), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 23)]), VFMAI(T1m, T1j), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n1fv_32"), {88, 0, 98, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_32) (planner *p) { + X(kdft_register) (p, n1fv_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name n1fv_32 -include dft/simd/n1f.h */ + +/* + * This function contains 186 FP additions, 42 FP multiplications, + * (or, 170 additions, 26 multiplications, 16 fused multiply/add), + * 58 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T1T, T1W, T2K, T2x, T16, T1A, Tb, T1p, TT, T1v, TY, T1w, T27, T2a, T2b; + V T2H, T2O, TC, T1s, TH, T1t, T20, T23, T24, T2E, T2N, T2g, T2j, Tq, T1B; + V T19, T1q, T2A, T2L; + { + V T3, T1R, T15, T1S, T6, T1U, T9, T1V, T12, Ta; + { + V T1, T2, T13, T14; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T1R = VADD(T1, T2); + T13 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T14 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T15 = VSUB(T13, T14); + T1S = VADD(T13, T14); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T1U = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1V = VADD(T7, T8); + } + T1T = VADD(T1R, T1S); + T1W = VADD(T1U, T1V); + T2K = VSUB(T1V, T1U); + T2x = VSUB(T1R, T1S); + T12 = VMUL(LDK(KP707106781), VSUB(T9, T6)); + T16 = VSUB(T12, T15); + T1A = VADD(T15, T12); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VADD(T3, Ta); + T1p = VSUB(T3, Ta); + } + { + V TL, T25, TX, T26, TO, T28, TR, T29; + { + V TJ, TK, TV, TW; + TJ = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T25 = VADD(TJ, TK); + TV = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TW = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TX = VSUB(TV, TW); + T26 = VADD(TV, TW); + } + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T28 = VADD(TM, TN); + TP = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TQ = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TR = VSUB(TP, TQ); + T29 = VADD(TP, TQ); + } + { + V TS, TU, T2F, T2G; + TS = VMUL(LDK(KP707106781), VADD(TO, TR)); + TT = VADD(TL, TS); + T1v = VSUB(TL, TS); + TU = VMUL(LDK(KP707106781), VSUB(TR, TO)); + TY = VSUB(TU, TX); + T1w = VADD(TX, TU); + T27 = VADD(T25, T26); + T2a = VADD(T28, T29); + T2b = VSUB(T27, T2a); + T2F = VSUB(T25, T26); + T2G = VSUB(T29, T28); + T2H = VFNMS(LDK(KP382683432), T2G, VMUL(LDK(KP923879532), T2F)); + T2O = VFMA(LDK(KP382683432), T2F, VMUL(LDK(KP923879532), T2G)); + } + } + { + V Tu, T1Y, TG, T1Z, Tx, T21, TA, T22; + { + V Ts, Tt, TE, TF; + Ts = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1Y = VADD(Ts, Tt); + TE = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TF = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TG = VSUB(TE, TF); + T1Z = VADD(TE, TF); + } + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T21 = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tz = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TA = VSUB(Ty, Tz); + T22 = VADD(Ty, Tz); + } + { + V TB, TD, T2C, T2D; + TB = VMUL(LDK(KP707106781), VADD(Tx, TA)); + TC = VADD(Tu, TB); + T1s = VSUB(Tu, TB); + TD = VMUL(LDK(KP707106781), VSUB(TA, Tx)); + TH = VSUB(TD, TG); + T1t = VADD(TG, TD); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VSUB(T20, T23); + T2C = VSUB(T1Y, T1Z); + T2D = VSUB(T22, T21); + T2E = VFMA(LDK(KP923879532), T2C, VMUL(LDK(KP382683432), T2D)); + T2N = VFNMS(LDK(KP382683432), T2C, VMUL(LDK(KP923879532), T2D)); + } + } + { + V Te, T2h, To, T2f, Th, T2i, Tl, T2e, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T2h = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T2f = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T2i = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2e = VADD(Tj, Tk); + } + T2g = VADD(T2e, T2f); + T2j = VADD(T2h, T2i); + Ti = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + Tp = VFMA(LDK(KP923879532), Tl, VMUL(LDK(KP382683432), To)); + Tq = VADD(Ti, Tp); + T1B = VSUB(Tp, Ti); + { + V T17, T18, T2y, T2z; + T17 = VFNMS(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T18 = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + T19 = VSUB(T17, T18); + T1q = VADD(T18, T17); + T2y = VSUB(T2h, T2i); + T2z = VSUB(T2e, T2f); + T2A = VMUL(LDK(KP707106781), VADD(T2y, T2z)); + T2L = VMUL(LDK(KP707106781), VSUB(T2z, T2y)); + } + } + { + V T2d, T2n, T2m, T2o; + { + V T1X, T2c, T2k, T2l; + T1X = VSUB(T1T, T1W); + T2c = VMUL(LDK(KP707106781), VADD(T24, T2b)); + T2d = VADD(T1X, T2c); + T2n = VSUB(T1X, T2c); + T2k = VSUB(T2g, T2j); + T2l = VMUL(LDK(KP707106781), VSUB(T2b, T24)); + T2m = VBYI(VADD(T2k, T2l)); + T2o = VBYI(VSUB(T2l, T2k)); + } + ST(&(xo[WS(os, 28)]), VSUB(T2d, T2m), ovs, &(xo[0])); + ST(&(xo[WS(os, 12)]), VADD(T2n, T2o), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(T2d, T2m), ovs, &(xo[0])); + ST(&(xo[WS(os, 20)]), VSUB(T2n, T2o), ovs, &(xo[0])); + } + { + V T2r, T2v, T2u, T2w; + { + V T2p, T2q, T2s, T2t; + T2p = VADD(T1T, T1W); + T2q = VADD(T2j, T2g); + T2r = VADD(T2p, T2q); + T2v = VSUB(T2p, T2q); + T2s = VADD(T20, T23); + T2t = VADD(T27, T2a); + T2u = VADD(T2s, T2t); + T2w = VBYI(VSUB(T2t, T2s)); + } + ST(&(xo[WS(os, 16)]), VSUB(T2r, T2u), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(T2v, T2w), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T2r, T2u), ovs, &(xo[0])); + ST(&(xo[WS(os, 24)]), VSUB(T2v, T2w), ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VSUB(T2H, T2E); + T2U = VSUB(T2L, T2K); + T2V = VBYI(VSUB(T2T, T2U)); + T2Z = VBYI(VADD(T2U, T2T)); + T2W = VSUB(T2x, T2A); + T2X = VSUB(T2O, T2N); + T2Y = VSUB(T2W, T2X); + T30 = VADD(T2W, T2X); + } + ST(&(xo[WS(os, 10)]), VADD(T2V, T2Y), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VSUB(T30, T2Z), ovs, &(xo[0])); + ST(&(xo[WS(os, 22)]), VSUB(T2Y, T2V), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VADD(T2Z, T30), ovs, &(xo[0])); + } + { + V T2J, T2R, T2Q, T2S; + { + V T2B, T2I, T2M, T2P; + T2B = VADD(T2x, T2A); + T2I = VADD(T2E, T2H); + T2J = VADD(T2B, T2I); + T2R = VSUB(T2B, T2I); + T2M = VADD(T2K, T2L); + T2P = VADD(T2N, T2O); + T2Q = VBYI(VADD(T2M, T2P)); + T2S = VBYI(VSUB(T2P, T2M)); + } + ST(&(xo[WS(os, 30)]), VSUB(T2J, T2Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 14)]), VADD(T2R, T2S), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(T2J, T2Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 18)]), VSUB(T2R, T2S), ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1K, T1F, T1N, T1y, T1J; + T1r = VADD(T1p, T1q); + T1C = VADD(T1A, T1B); + T1M = VSUB(T1p, T1q); + T1K = VSUB(T1B, T1A); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP555570233), T1s, VMUL(LDK(KP831469612), T1t)); + T1E = VFMA(LDK(KP555570233), T1v, VMUL(LDK(KP831469612), T1w)); + T1F = VADD(T1D, T1E); + T1N = VSUB(T1E, T1D); + T1u = VFMA(LDK(KP831469612), T1s, VMUL(LDK(KP555570233), T1t)); + T1x = VFNMS(LDK(KP555570233), T1w, VMUL(LDK(KP831469612), T1v)); + T1y = VADD(T1u, T1x); + T1J = VSUB(T1x, T1u); + } + { + V T1z, T1G, T1P, T1Q; + T1z = VADD(T1r, T1y); + T1G = VBYI(VADD(T1C, T1F)); + ST(&(xo[WS(os, 29)]), VSUB(T1z, T1G), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(T1z, T1G), ovs, &(xo[WS(os, 1)])); + T1P = VBYI(VADD(T1K, T1J)); + T1Q = VADD(T1M, T1N); + ST(&(xo[WS(os, 5)]), VADD(T1P, T1Q), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 27)]), VSUB(T1Q, T1P), ovs, &(xo[WS(os, 1)])); + } + { + V T1H, T1I, T1L, T1O; + T1H = VSUB(T1r, T1y); + T1I = VBYI(VSUB(T1F, T1C)); + ST(&(xo[WS(os, 19)]), VSUB(T1H, T1I), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 13)]), VADD(T1H, T1I), ovs, &(xo[WS(os, 1)])); + T1L = VBYI(VSUB(T1J, T1K)); + T1O = VSUB(T1M, T1N); + ST(&(xo[WS(os, 11)]), VADD(T1L, T1O), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 21)]), VSUB(T1O, T1L), ovs, &(xo[WS(os, 1)])); + } + } + { + V Tr, T1a, T1k, T1i, T1d, T1l, T10, T1h; + Tr = VADD(Tb, Tq); + T1a = VADD(T16, T19); + T1k = VSUB(Tb, Tq); + T1i = VSUB(T19, T16); + { + V T1b, T1c, TI, TZ; + T1b = VFNMS(LDK(KP195090322), TC, VMUL(LDK(KP980785280), TH)); + T1c = VFMA(LDK(KP195090322), TT, VMUL(LDK(KP980785280), TY)); + T1d = VADD(T1b, T1c); + T1l = VSUB(T1c, T1b); + TI = VFMA(LDK(KP980785280), TC, VMUL(LDK(KP195090322), TH)); + TZ = VFNMS(LDK(KP195090322), TY, VMUL(LDK(KP980785280), TT)); + T10 = VADD(TI, TZ); + T1h = VSUB(TZ, TI); + } + { + V T11, T1e, T1n, T1o; + T11 = VADD(Tr, T10); + T1e = VBYI(VADD(T1a, T1d)); + ST(&(xo[WS(os, 31)]), VSUB(T11, T1e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(T11, T1e), ovs, &(xo[WS(os, 1)])); + T1n = VBYI(VADD(T1i, T1h)); + T1o = VADD(T1k, T1l); + ST(&(xo[WS(os, 7)]), VADD(T1n, T1o), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 25)]), VSUB(T1o, T1n), ovs, &(xo[WS(os, 1)])); + } + { + V T1f, T1g, T1j, T1m; + T1f = VSUB(Tr, T10); + T1g = VBYI(VSUB(T1d, T1a)); + ST(&(xo[WS(os, 17)]), VSUB(T1f, T1g), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 15)]), VADD(T1f, T1g), ovs, &(xo[WS(os, 1)])); + T1j = VBYI(VSUB(T1h, T1i)); + T1m = VSUB(T1k, T1l); + ST(&(xo[WS(os, 9)]), VADD(T1j, T1m), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 23)]), VSUB(T1m, T1j), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n1fv_32"), {170, 26, 16, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_32) (planner *p) { + X(kdft_register) (p, n1fv_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_4.c new file mode 100644 index 000000000..22624eb83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_4.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name n1fv_4 -include dft/simd/n1f.h */ + +/* + * This function contains 8 FP additions, 2 FP multiplications, + * (or, 6 additions, 0 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T8 = VADD(T4, T5); + } + ST(&(xo[WS(os, 1)]), VFNMSI(T6, T3), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T7, T8), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VFMAI(T6, T3), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VSUB(T7, T8), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n1fv_4"), {6, 0, 2, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_4) (planner *p) { + X(kdft_register) (p, n1fv_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name n1fv_4 -include dft/simd/n1f.h */ + +/* + * This function contains 8 FP additions, 0 FP multiplications, + * (or, 8 additions, 0 multiplications, 0 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VBYI(VSUB(T4, T5)); + T8 = VADD(T4, T5); + } + ST(&(xo[WS(os, 1)]), VSUB(T3, T6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(T7, T8), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VADD(T3, T6), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VSUB(T7, T8), ovs, &(xo[0])); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n1fv_4"), {8, 0, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_4) (planner *p) { + X(kdft_register) (p, n1fv_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_5.c new file mode 100644 index 000000000..6ee9240e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_5.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name n1fv_5 -include dft/simd/n1f.h */ + +/* + * This function contains 16 FP additions, 11 FP multiplications, + * (or, 7 additions, 2 multiplications, 9 fused multiply/add), + * 18 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_5(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(10, is), MAKE_VOLATILE_STRIDE(10, os)) { + V T1, T8, Td, Ta, Tc; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T2, T3, T4, T5, T6, T7; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + T8 = VADD(T4, T7); + Td = VSUB(T5, T6); + Ta = VSUB(T4, T7); + Tc = VSUB(T2, T3); + } + ST(&(xo[0]), VADD(T1, T8), ovs, &(xo[0])); + { + V Te, Tg, Tb, Tf, T9; + Te = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Td, Tc)); + Tg = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tc, Td)); + T9 = VFNMS(LDK(KP250000000), T8, T1); + Tb = VFMA(LDK(KP559016994), Ta, T9); + Tf = VFNMS(LDK(KP559016994), Ta, T9); + ST(&(xo[WS(os, 1)]), VFNMSI(Te, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFNMSI(Tg, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VFMAI(Te, Tb), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(Tg, Tf), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 5, XSIMD_STRING("n1fv_5"), {7, 2, 9, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_5) (planner *p) { + X(kdft_register) (p, n1fv_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name n1fv_5 -include dft/simd/n1f.h */ + +/* + * This function contains 16 FP additions, 6 FP multiplications, + * (or, 13 additions, 3 multiplications, 3 fused multiply/add), + * 18 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_5(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(10, is), MAKE_VOLATILE_STRIDE(10, os)) { + V T8, T7, Td, T9, Tc; + T8 = LD(&(xi[0]), ivs, &(xi[0])); + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VADD(T4, T5); + T7 = VMUL(LDK(KP559016994), VSUB(T3, T6)); + Td = VSUB(T4, T5); + T9 = VADD(T3, T6); + Tc = VSUB(T1, T2); + } + ST(&(xo[0]), VADD(T8, T9), ovs, &(xo[0])); + { + V Te, Tf, Tb, Tg, Ta; + Te = VBYI(VFMA(LDK(KP951056516), Tc, VMUL(LDK(KP587785252), Td))); + Tf = VBYI(VFNMS(LDK(KP587785252), Tc, VMUL(LDK(KP951056516), Td))); + Ta = VFNMS(LDK(KP250000000), T9, T8); + Tb = VADD(T7, Ta); + Tg = VSUB(Ta, T7); + ST(&(xo[WS(os, 1)]), VSUB(Tb, Te), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VSUB(Tg, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VADD(Te, Tb), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(Tf, Tg), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 5, XSIMD_STRING("n1fv_5"), {13, 3, 3, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_5) (planner *p) { + X(kdft_register) (p, n1fv_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_6.c new file mode 100644 index 000000000..5445792c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_6.c @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name n1fv_6 -include dft/simd/n1f.h */ + +/* + * This function contains 18 FP additions, 8 FP multiplications, + * (or, 12 additions, 2 multiplications, 6 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V T3, Td, T6, Te, T9, Tf, Ta, Tg, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Td = VADD(T1, T2); + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Te = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tg = VADD(Te, Tf); + ST(&(xo[WS(os, 3)]), VADD(T3, Ta), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Td, Tg), ovs, &(xo[0])); + { + V Tb, Tc, Th, Ti; + Tb = VFNMS(LDK(KP500000000), Ta, T3); + Tc = VMUL(LDK(KP866025403), VSUB(T9, T6)); + ST(&(xo[WS(os, 5)]), VFNMSI(Tc, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VFMAI(Tc, Tb), ovs, &(xo[WS(os, 1)])); + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VMUL(LDK(KP866025403), VSUB(Tf, Te)); + ST(&(xo[WS(os, 2)]), VFNMSI(Ti, Th), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(Ti, Th), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n1fv_6"), {12, 2, 6, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_6) (planner *p) { + X(kdft_register) (p, n1fv_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name n1fv_6 -include dft/simd/n1f.h */ + +/* + * This function contains 18 FP additions, 4 FP multiplications, + * (or, 16 additions, 2 multiplications, 2 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V T3, Td, T6, Te, T9, Tf, Ta, Tg, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Td = VADD(T1, T2); + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Te = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tg = VADD(Te, Tf); + ST(&(xo[WS(os, 3)]), VADD(T3, Ta), ovs, &(xo[WS(os, 1)])); + ST(&(xo[0]), VADD(Td, Tg), ovs, &(xo[0])); + { + V Tb, Tc, Th, Ti; + Tb = VFNMS(LDK(KP500000000), Ta, T3); + Tc = VBYI(VMUL(LDK(KP866025403), VSUB(T9, T6))); + ST(&(xo[WS(os, 5)]), VSUB(Tb, Tc), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(Tb, Tc), ovs, &(xo[WS(os, 1)])); + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VBYI(VMUL(LDK(KP866025403), VSUB(Tf, Te))); + ST(&(xo[WS(os, 2)]), VSUB(Th, Ti), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(Th, Ti), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n1fv_6"), {16, 2, 2, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_6) (planner *p) { + X(kdft_register) (p, n1fv_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_64.c new file mode 100644 index 000000000..c6157b819 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_64.c @@ -0,0 +1,1634 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:52 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name n1fv_64 -include dft/simd/n1f.h */ + +/* + * This function contains 456 FP additions, 258 FP multiplications, + * (or, 198 additions, 0 multiplications, 258 fused multiply/add), + * 108 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T7, T26, T47, T69, T5k, T6A, T2V, T3z, Tm, T27, T5n, T6a, T2Y, T3M, T4e; + V T6B, TC, T2a, T6e, T6E, T3l, T3A, T4o, T5p, TR, T29, T6h, T6D, T3i, T3B; + V T4x, T5q, T1N, T2x, T6t, T71, T6w, T72, T1W, T2y, T39, T3H, T57, T5N, T5e; + V T5O, T3c, T3I, T1g, T2u, T6m, T6Y, T6p, T6Z, T1p, T2v, T32, T3E, T4M, T5K; + V T4T, T5L, T35, T3F; + { + V T3, T43, T25, T44, T6, T5i, T22, T45; + { + V T1, T2, T23, T24; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T43 = VSUB(T1, T2); + T23 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T24 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T25 = VADD(T23, T24); + T44 = VSUB(T23, T24); + } + { + V T4, T5, T20, T21; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T5i = VSUB(T4, T5); + T20 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T21 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T22 = VADD(T20, T21); + T45 = VSUB(T20, T21); + } + T7 = VSUB(T3, T6); + T26 = VSUB(T22, T25); + { + V T46, T5j, T2T, T2U; + T46 = VADD(T44, T45); + T47 = VFMA(LDK(KP707106781), T46, T43); + T69 = VFNMS(LDK(KP707106781), T46, T43); + T5j = VSUB(T45, T44); + T5k = VFNMS(LDK(KP707106781), T5j, T5i); + T6A = VFMA(LDK(KP707106781), T5j, T5i); + T2T = VADD(T3, T6); + T2U = VADD(T25, T22); + T2V = VADD(T2T, T2U); + T3z = VSUB(T2T, T2U); + } + } + { + V Ta, T48, Tk, T4c, Td, T49, Th, T4b; + { + V T8, T9, Ti, Tj; + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + T48 = VSUB(T8, T9); + Ti = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + Tk = VADD(Ti, Tj); + T4c = VSUB(Tj, Ti); + } + { + V Tb, Tc, Tf, Tg; + Tb = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Td = VADD(Tb, Tc); + T49 = VSUB(Tb, Tc); + Tf = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Th = VADD(Tf, Tg); + T4b = VSUB(Tf, Tg); + } + { + V Te, Tl, T5l, T5m; + Te = VSUB(Ta, Td); + Tl = VSUB(Th, Tk); + Tm = VADD(Te, Tl); + T27 = VSUB(Tl, Te); + T5l = VFMA(LDK(KP414213562), T48, T49); + T5m = VFMA(LDK(KP414213562), T4b, T4c); + T5n = VSUB(T5l, T5m); + T6a = VADD(T5l, T5m); + } + { + V T2W, T2X, T4a, T4d; + T2W = VADD(Ta, Td); + T2X = VADD(Th, Tk); + T2Y = VADD(T2W, T2X); + T3M = VSUB(T2X, T2W); + T4a = VFNMS(LDK(KP414213562), T49, T48); + T4d = VFNMS(LDK(KP414213562), T4c, T4b); + T4e = VADD(T4a, T4d); + T6B = VSUB(T4d, T4a); + } + } + { + V Tq, T4g, Tt, T4l, Tx, T4m, TA, T4j; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + T4g = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + T4l = VSUB(Tr, Ts); + { + V Tv, Tw, T4h, Ty, Tz, T4i; + Tv = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T4h = VSUB(Tv, Tw); + Ty = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T4i = VSUB(Ty, Tz); + Tx = VADD(Tv, Tw); + T4m = VSUB(T4h, T4i); + TA = VADD(Ty, Tz); + T4j = VADD(T4h, T4i); + } + } + { + V Tu, TB, T6c, T6d; + Tu = VSUB(Tq, Tt); + TB = VSUB(Tx, TA); + TC = VFNMS(LDK(KP414213562), TB, Tu); + T2a = VFMA(LDK(KP414213562), Tu, TB); + T6c = VFNMS(LDK(KP707106781), T4m, T4l); + T6d = VFNMS(LDK(KP707106781), T4j, T4g); + T6e = VFNMS(LDK(KP668178637), T6d, T6c); + T6E = VFMA(LDK(KP668178637), T6c, T6d); + } + { + V T3j, T3k, T4k, T4n; + T3j = VADD(Tq, Tt); + T3k = VADD(Tx, TA); + T3l = VADD(T3j, T3k); + T3A = VSUB(T3j, T3k); + T4k = VFMA(LDK(KP707106781), T4j, T4g); + T4n = VFMA(LDK(KP707106781), T4m, T4l); + T4o = VFNMS(LDK(KP198912367), T4n, T4k); + T5p = VFMA(LDK(KP198912367), T4k, T4n); + } + } + { + V TF, T4p, TI, T4u, TM, T4v, TP, T4s; + { + V TD, TE, TG, TH; + TD = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TF = VADD(TD, TE); + T4p = VSUB(TD, TE); + TG = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TH = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TI = VADD(TG, TH); + T4u = VSUB(TH, TG); + { + V TK, TL, T4r, TN, TO, T4q; + TK = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + TL = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T4r = VSUB(TK, TL); + TN = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + TO = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T4q = VSUB(TN, TO); + TM = VADD(TK, TL); + T4v = VSUB(T4r, T4q); + TP = VADD(TN, TO); + T4s = VADD(T4q, T4r); + } + } + { + V TJ, TQ, T6f, T6g; + TJ = VSUB(TF, TI); + TQ = VSUB(TM, TP); + TR = VFNMS(LDK(KP414213562), TQ, TJ); + T29 = VFMA(LDK(KP414213562), TJ, TQ); + T6f = VFNMS(LDK(KP707106781), T4v, T4u); + T6g = VFNMS(LDK(KP707106781), T4s, T4p); + T6h = VFNMS(LDK(KP668178637), T6g, T6f); + T6D = VFMA(LDK(KP668178637), T6f, T6g); + } + { + V T3g, T3h, T4t, T4w; + T3g = VADD(TF, TI); + T3h = VADD(TP, TM); + T3i = VADD(T3g, T3h); + T3B = VSUB(T3g, T3h); + T4t = VFMA(LDK(KP707106781), T4s, T4p); + T4w = VFMA(LDK(KP707106781), T4v, T4u); + T4x = VFNMS(LDK(KP198912367), T4w, T4t); + T5q = VFMA(LDK(KP198912367), T4t, T4w); + } + } + { + V T1t, T4V, T1w, T58, T1Q, T59, T1T, T4Y, T1A, T1D, T1E, T5b, T52, T1H, T1K; + V T1L, T5c, T55; + { + V T1r, T1s, T1u, T1v; + T1r = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T1s = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T1t = VADD(T1r, T1s); + T4V = VSUB(T1r, T1s); + T1u = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1v = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T1w = VADD(T1u, T1v); + T58 = VSUB(T1v, T1u); + } + { + V T1O, T1P, T4X, T1R, T1S, T4W; + T1O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T4X = VSUB(T1O, T1P); + T1R = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1S = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T4W = VSUB(T1R, T1S); + T1Q = VADD(T1O, T1P); + T59 = VSUB(T4X, T4W); + T1T = VADD(T1R, T1S); + T4Y = VADD(T4W, T4X); + } + { + V T50, T51, T53, T54; + { + V T1y, T1z, T1B, T1C; + T1y = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1z = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1A = VADD(T1y, T1z); + T50 = VSUB(T1y, T1z); + T1B = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1C = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1D = VADD(T1B, T1C); + T51 = VSUB(T1C, T1B); + } + T1E = VSUB(T1A, T1D); + T5b = VFNMS(LDK(KP414213562), T50, T51); + T52 = VFMA(LDK(KP414213562), T51, T50); + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1G = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1H = VADD(T1F, T1G); + T53 = VSUB(T1F, T1G); + T1I = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1J = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T1K = VADD(T1I, T1J); + T54 = VSUB(T1J, T1I); + } + T1L = VSUB(T1H, T1K); + T5c = VFMA(LDK(KP414213562), T53, T54); + T55 = VFNMS(LDK(KP414213562), T54, T53); + } + { + V T1x, T1M, T6r, T6s; + T1x = VSUB(T1t, T1w); + T1M = VADD(T1E, T1L); + T1N = VFMA(LDK(KP707106781), T1M, T1x); + T2x = VFNMS(LDK(KP707106781), T1M, T1x); + T6r = VFNMS(LDK(KP707106781), T4Y, T4V); + T6s = VSUB(T5c, T5b); + T6t = VFNMS(LDK(KP923879532), T6s, T6r); + T71 = VFMA(LDK(KP923879532), T6s, T6r); + } + { + V T6u, T6v, T1U, T1V; + T6u = VFNMS(LDK(KP707106781), T59, T58); + T6v = VSUB(T55, T52); + T6w = VFMA(LDK(KP923879532), T6v, T6u); + T72 = VFNMS(LDK(KP923879532), T6v, T6u); + T1U = VSUB(T1Q, T1T); + T1V = VSUB(T1L, T1E); + T1W = VFMA(LDK(KP707106781), T1V, T1U); + T2y = VFNMS(LDK(KP707106781), T1V, T1U); + } + { + V T37, T38, T4Z, T56; + T37 = VADD(T1t, T1w); + T38 = VADD(T1T, T1Q); + T39 = VADD(T37, T38); + T3H = VSUB(T37, T38); + T4Z = VFMA(LDK(KP707106781), T4Y, T4V); + T56 = VADD(T52, T55); + T57 = VFMA(LDK(KP923879532), T56, T4Z); + T5N = VFNMS(LDK(KP923879532), T56, T4Z); + } + { + V T5a, T5d, T3a, T3b; + T5a = VFMA(LDK(KP707106781), T59, T58); + T5d = VADD(T5b, T5c); + T5e = VFMA(LDK(KP923879532), T5d, T5a); + T5O = VFNMS(LDK(KP923879532), T5d, T5a); + T3a = VADD(T1A, T1D); + T3b = VADD(T1H, T1K); + T3c = VADD(T3a, T3b); + T3I = VSUB(T3b, T3a); + } + } + { + V TW, T4A, TZ, T4N, T1j, T4O, T1m, T4D, T13, T16, T17, T4Q, T4H, T1a, T1d; + V T1e, T4R, T4K; + { + V TU, TV, TX, TY; + TU = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + TW = VADD(TU, TV); + T4A = VSUB(TU, TV); + TX = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TY = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + TZ = VADD(TX, TY); + T4N = VSUB(TX, TY); + } + { + V T1h, T1i, T4B, T1k, T1l, T4C; + T1h = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T4B = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T4C = VSUB(T1k, T1l); + T1j = VADD(T1h, T1i); + T4O = VSUB(T4B, T4C); + T1m = VADD(T1k, T1l); + T4D = VADD(T4B, T4C); + } + { + V T4F, T4G, T4I, T4J; + { + V T11, T12, T14, T15; + T11 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T12 = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T13 = VADD(T11, T12); + T4F = VSUB(T11, T12); + T14 = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T15 = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T16 = VADD(T14, T15); + T4G = VSUB(T14, T15); + } + T17 = VSUB(T13, T16); + T4Q = VFMA(LDK(KP414213562), T4F, T4G); + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + { + V T18, T19, T1b, T1c; + T18 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T19 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T1a = VADD(T18, T19); + T4I = VSUB(T18, T19); + T1b = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T1c = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T1d = VADD(T1b, T1c); + T4J = VSUB(T1b, T1c); + } + T1e = VSUB(T1a, T1d); + T4R = VFNMS(LDK(KP414213562), T4I, T4J); + T4K = VFMA(LDK(KP414213562), T4J, T4I); + } + { + V T10, T1f, T6k, T6l; + T10 = VSUB(TW, TZ); + T1f = VADD(T17, T1e); + T1g = VFMA(LDK(KP707106781), T1f, T10); + T2u = VFNMS(LDK(KP707106781), T1f, T10); + T6k = VFNMS(LDK(KP707106781), T4D, T4A); + T6l = VSUB(T4Q, T4R); + T6m = VFNMS(LDK(KP923879532), T6l, T6k); + T6Y = VFMA(LDK(KP923879532), T6l, T6k); + } + { + V T6n, T6o, T1n, T1o; + T6n = VFNMS(LDK(KP707106781), T4O, T4N); + T6o = VSUB(T4H, T4K); + T6p = VFMA(LDK(KP923879532), T6o, T6n); + T6Z = VFNMS(LDK(KP923879532), T6o, T6n); + T1n = VSUB(T1j, T1m); + T1o = VSUB(T17, T1e); + T1p = VFMA(LDK(KP707106781), T1o, T1n); + T2v = VFNMS(LDK(KP707106781), T1o, T1n); + } + { + V T30, T31, T4E, T4L; + T30 = VADD(TW, TZ); + T31 = VADD(T1j, T1m); + T32 = VADD(T30, T31); + T3E = VSUB(T30, T31); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4L = VADD(T4H, T4K); + T4M = VFMA(LDK(KP923879532), T4L, T4E); + T5K = VFNMS(LDK(KP923879532), T4L, T4E); + } + { + V T4P, T4S, T33, T34; + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4S = VADD(T4Q, T4R); + T4T = VFMA(LDK(KP923879532), T4S, T4P); + T5L = VFNMS(LDK(KP923879532), T4S, T4P); + T33 = VADD(T13, T16); + T34 = VADD(T1a, T1d); + T35 = VADD(T33, T34); + T3F = VSUB(T33, T34); + } + } + { + V T3t, T3x, T3w, T3y; + { + V T3r, T3s, T3u, T3v; + T3r = VADD(T2V, T2Y); + T3s = VADD(T3l, T3i); + T3t = VADD(T3r, T3s); + T3x = VSUB(T3r, T3s); + T3u = VADD(T32, T35); + T3v = VADD(T39, T3c); + T3w = VADD(T3u, T3v); + T3y = VSUB(T3v, T3u); + } + ST(&(xo[WS(os, 32)]), VSUB(T3t, T3w), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VFMAI(T3y, T3x), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T3t, T3w), ovs, &(xo[0])); + ST(&(xo[WS(os, 48)]), VFNMSI(T3y, T3x), ovs, &(xo[0])); + } + { + V T2Z, T3m, T3e, T3n, T36, T3d; + T2Z = VSUB(T2V, T2Y); + T3m = VSUB(T3i, T3l); + T36 = VSUB(T32, T35); + T3d = VSUB(T39, T3c); + T3e = VADD(T36, T3d); + T3n = VSUB(T3d, T36); + { + V T3f, T3o, T3p, T3q; + T3f = VFNMS(LDK(KP707106781), T3e, T2Z); + T3o = VFNMS(LDK(KP707106781), T3n, T3m); + ST(&(xo[WS(os, 24)]), VFNMSI(T3o, T3f), ovs, &(xo[0])); + ST(&(xo[WS(os, 40)]), VFMAI(T3o, T3f), ovs, &(xo[0])); + T3p = VFMA(LDK(KP707106781), T3e, T2Z); + T3q = VFMA(LDK(KP707106781), T3n, T3m); + ST(&(xo[WS(os, 56)]), VFNMSI(T3q, T3p), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VFMAI(T3q, T3p), ovs, &(xo[0])); + } + } + { + V T3D, T3V, T3O, T3Y, T3K, T3Z, T3R, T3W, T3C, T3N; + T3C = VADD(T3A, T3B); + T3D = VFMA(LDK(KP707106781), T3C, T3z); + T3V = VFNMS(LDK(KP707106781), T3C, T3z); + T3N = VSUB(T3B, T3A); + T3O = VFMA(LDK(KP707106781), T3N, T3M); + T3Y = VFNMS(LDK(KP707106781), T3N, T3M); + { + V T3G, T3J, T3P, T3Q; + T3G = VFNMS(LDK(KP414213562), T3F, T3E); + T3J = VFNMS(LDK(KP414213562), T3I, T3H); + T3K = VADD(T3G, T3J); + T3Z = VSUB(T3J, T3G); + T3P = VFMA(LDK(KP414213562), T3H, T3I); + T3Q = VFMA(LDK(KP414213562), T3E, T3F); + T3R = VSUB(T3P, T3Q); + T3W = VADD(T3Q, T3P); + } + { + V T3L, T3S, T41, T42; + T3L = VFNMS(LDK(KP923879532), T3K, T3D); + T3S = VFNMS(LDK(KP923879532), T3R, T3O); + ST(&(xo[WS(os, 28)]), VFNMSI(T3S, T3L), ovs, &(xo[0])); + ST(&(xo[WS(os, 36)]), VFMAI(T3S, T3L), ovs, &(xo[0])); + T41 = VFMA(LDK(KP923879532), T3W, T3V); + T42 = VFNMS(LDK(KP923879532), T3Z, T3Y); + ST(&(xo[WS(os, 12)]), VFNMSI(T42, T41), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VFMAI(T42, T41), ovs, &(xo[0])); + } + { + V T3T, T3U, T3X, T40; + T3T = VFMA(LDK(KP923879532), T3K, T3D); + T3U = VFMA(LDK(KP923879532), T3R, T3O); + ST(&(xo[WS(os, 60)]), VFNMSI(T3U, T3T), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VFMAI(T3U, T3T), ovs, &(xo[0])); + T3X = VFNMS(LDK(KP923879532), T3W, T3V); + T40 = VFMA(LDK(KP923879532), T3Z, T3Y); + ST(&(xo[WS(os, 20)]), VFMAI(T40, T3X), ovs, &(xo[0])); + ST(&(xo[WS(os, 44)]), VFNMSI(T40, T3X), ovs, &(xo[0])); + } + } + { + V T6X, T7f, T7b, T7g, T74, T7j, T78, T7i; + { + V T6V, T6W, T79, T7a; + T6V = VFMA(LDK(KP923879532), T6a, T69); + T6W = VADD(T6E, T6D); + T6X = VFMA(LDK(KP831469612), T6W, T6V); + T7f = VFNMS(LDK(KP831469612), T6W, T6V); + T79 = VFNMS(LDK(KP303346683), T6Y, T6Z); + T7a = VFNMS(LDK(KP303346683), T71, T72); + T7b = VSUB(T79, T7a); + T7g = VADD(T79, T7a); + } + { + V T70, T73, T76, T77; + T70 = VFMA(LDK(KP303346683), T6Z, T6Y); + T73 = VFMA(LDK(KP303346683), T72, T71); + T74 = VADD(T70, T73); + T7j = VSUB(T73, T70); + T76 = VFMA(LDK(KP923879532), T6B, T6A); + T77 = VSUB(T6e, T6h); + T78 = VFMA(LDK(KP831469612), T77, T76); + T7i = VFNMS(LDK(KP831469612), T77, T76); + } + { + V T75, T7c, T7l, T7m; + T75 = VFNMS(LDK(KP956940335), T74, T6X); + T7c = VFNMS(LDK(KP956940335), T7b, T78); + ST(&(xo[WS(os, 29)]), VFNMSI(T7c, T75), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 35)]), VFMAI(T7c, T75), ovs, &(xo[WS(os, 1)])); + T7l = VFNMS(LDK(KP956940335), T7g, T7f); + T7m = VFNMS(LDK(KP956940335), T7j, T7i); + ST(&(xo[WS(os, 13)]), VFNMSI(T7m, T7l), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 51)]), VFMAI(T7m, T7l), ovs, &(xo[WS(os, 1)])); + } + { + V T7d, T7e, T7h, T7k; + T7d = VFMA(LDK(KP956940335), T74, T6X); + T7e = VFMA(LDK(KP956940335), T7b, T78); + ST(&(xo[WS(os, 61)]), VFNMSI(T7e, T7d), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(T7e, T7d), ovs, &(xo[WS(os, 1)])); + T7h = VFMA(LDK(KP956940335), T7g, T7f); + T7k = VFMA(LDK(KP956940335), T7j, T7i); + ST(&(xo[WS(os, 19)]), VFMAI(T7k, T7h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 45)]), VFNMSI(T7k, T7h), ovs, &(xo[WS(os, 1)])); + } + } + { + V TT, T2j, T2f, T2k, T1Y, T2n, T2c, T2m; + { + V Tn, TS, T2d, T2e; + Tn = VFMA(LDK(KP707106781), Tm, T7); + TS = VADD(TC, TR); + TT = VFMA(LDK(KP923879532), TS, Tn); + T2j = VFNMS(LDK(KP923879532), TS, Tn); + T2d = VFMA(LDK(KP198912367), T1N, T1W); + T2e = VFMA(LDK(KP198912367), T1g, T1p); + T2f = VSUB(T2d, T2e); + T2k = VADD(T2e, T2d); + } + { + V T1q, T1X, T28, T2b; + T1q = VFNMS(LDK(KP198912367), T1p, T1g); + T1X = VFNMS(LDK(KP198912367), T1W, T1N); + T1Y = VADD(T1q, T1X); + T2n = VSUB(T1X, T1q); + T28 = VFMA(LDK(KP707106781), T27, T26); + T2b = VSUB(T29, T2a); + T2c = VFMA(LDK(KP923879532), T2b, T28); + T2m = VFNMS(LDK(KP923879532), T2b, T28); + } + { + V T1Z, T2g, T2p, T2q; + T1Z = VFNMS(LDK(KP980785280), T1Y, TT); + T2g = VFNMS(LDK(KP980785280), T2f, T2c); + ST(&(xo[WS(os, 30)]), VFNMSI(T2g, T1Z), ovs, &(xo[0])); + ST(&(xo[WS(os, 34)]), VFMAI(T2g, T1Z), ovs, &(xo[0])); + T2p = VFMA(LDK(KP980785280), T2k, T2j); + T2q = VFNMS(LDK(KP980785280), T2n, T2m); + ST(&(xo[WS(os, 14)]), VFNMSI(T2q, T2p), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VFMAI(T2q, T2p), ovs, &(xo[0])); + } + { + V T2h, T2i, T2l, T2o; + T2h = VFMA(LDK(KP980785280), T1Y, TT); + T2i = VFMA(LDK(KP980785280), T2f, T2c); + ST(&(xo[WS(os, 62)]), VFNMSI(T2i, T2h), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(T2i, T2h), ovs, &(xo[0])); + T2l = VFNMS(LDK(KP980785280), T2k, T2j); + T2o = VFMA(LDK(KP980785280), T2n, T2m); + ST(&(xo[WS(os, 18)]), VFMAI(T2o, T2l), ovs, &(xo[0])); + ST(&(xo[WS(os, 46)]), VFNMSI(T2o, T2l), ovs, &(xo[0])); + } + } + { + V T4z, T5z, T5v, T5A, T5g, T5D, T5s, T5C; + { + V T4f, T4y, T5t, T5u; + T4f = VFMA(LDK(KP923879532), T4e, T47); + T4y = VADD(T4o, T4x); + T4z = VFMA(LDK(KP980785280), T4y, T4f); + T5z = VFNMS(LDK(KP980785280), T4y, T4f); + T5t = VFMA(LDK(KP098491403), T4M, T4T); + T5u = VFMA(LDK(KP098491403), T57, T5e); + T5v = VSUB(T5t, T5u); + T5A = VADD(T5t, T5u); + } + { + V T4U, T5f, T5o, T5r; + T4U = VFNMS(LDK(KP098491403), T4T, T4M); + T5f = VFNMS(LDK(KP098491403), T5e, T57); + T5g = VADD(T4U, T5f); + T5D = VSUB(T5f, T4U); + T5o = VFMA(LDK(KP923879532), T5n, T5k); + T5r = VSUB(T5p, T5q); + T5s = VFMA(LDK(KP980785280), T5r, T5o); + T5C = VFNMS(LDK(KP980785280), T5r, T5o); + } + { + V T5h, T5w, T5F, T5G; + T5h = VFNMS(LDK(KP995184726), T5g, T4z); + T5w = VFNMS(LDK(KP995184726), T5v, T5s); + ST(&(xo[WS(os, 33)]), VFNMSI(T5w, T5h), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 31)]), VFMAI(T5w, T5h), ovs, &(xo[WS(os, 1)])); + T5F = VFMA(LDK(KP995184726), T5A, T5z); + T5G = VFMA(LDK(KP995184726), T5D, T5C); + ST(&(xo[WS(os, 15)]), VFMAI(T5G, T5F), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 49)]), VFNMSI(T5G, T5F), ovs, &(xo[WS(os, 1)])); + } + { + V T5x, T5y, T5B, T5E; + T5x = VFMA(LDK(KP995184726), T5g, T4z); + T5y = VFMA(LDK(KP995184726), T5v, T5s); + ST(&(xo[WS(os, 1)]), VFNMSI(T5y, T5x), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 63)]), VFMAI(T5y, T5x), ovs, &(xo[WS(os, 1)])); + T5B = VFNMS(LDK(KP995184726), T5A, T5z); + T5E = VFNMS(LDK(KP995184726), T5D, T5C); + ST(&(xo[WS(os, 17)]), VFNMSI(T5E, T5B), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 47)]), VFMAI(T5E, T5B), ovs, &(xo[WS(os, 1)])); + } + } + { + V T6j, T6N, T6J, T6O, T6y, T6R, T6G, T6Q; + { + V T6b, T6i, T6H, T6I; + T6b = VFNMS(LDK(KP923879532), T6a, T69); + T6i = VADD(T6e, T6h); + T6j = VFNMS(LDK(KP831469612), T6i, T6b); + T6N = VFMA(LDK(KP831469612), T6i, T6b); + T6H = VFMA(LDK(KP534511135), T6m, T6p); + T6I = VFMA(LDK(KP534511135), T6t, T6w); + T6J = VSUB(T6H, T6I); + T6O = VADD(T6H, T6I); + } + { + V T6q, T6x, T6C, T6F; + T6q = VFNMS(LDK(KP534511135), T6p, T6m); + T6x = VFNMS(LDK(KP534511135), T6w, T6t); + T6y = VADD(T6q, T6x); + T6R = VSUB(T6x, T6q); + T6C = VFNMS(LDK(KP923879532), T6B, T6A); + T6F = VSUB(T6D, T6E); + T6G = VFNMS(LDK(KP831469612), T6F, T6C); + T6Q = VFMA(LDK(KP831469612), T6F, T6C); + } + { + V T6z, T6K, T6T, T6U; + T6z = VFNMS(LDK(KP881921264), T6y, T6j); + T6K = VFNMS(LDK(KP881921264), T6J, T6G); + ST(&(xo[WS(os, 37)]), VFNMSI(T6K, T6z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 27)]), VFMAI(T6K, T6z), ovs, &(xo[WS(os, 1)])); + T6T = VFMA(LDK(KP881921264), T6O, T6N); + T6U = VFMA(LDK(KP881921264), T6R, T6Q); + ST(&(xo[WS(os, 11)]), VFMAI(T6U, T6T), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 53)]), VFNMSI(T6U, T6T), ovs, &(xo[WS(os, 1)])); + } + { + V T6L, T6M, T6P, T6S; + T6L = VFMA(LDK(KP881921264), T6y, T6j); + T6M = VFMA(LDK(KP881921264), T6J, T6G); + ST(&(xo[WS(os, 5)]), VFNMSI(T6M, T6L), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 59)]), VFMAI(T6M, T6L), ovs, &(xo[WS(os, 1)])); + T6P = VFNMS(LDK(KP881921264), T6O, T6N); + T6S = VFNMS(LDK(KP881921264), T6R, T6Q); + ST(&(xo[WS(os, 21)]), VFNMSI(T6S, T6P), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 43)]), VFMAI(T6S, T6P), ovs, &(xo[WS(os, 1)])); + } + } + { + V T2t, T2L, T2H, T2M, T2A, T2P, T2E, T2O; + { + V T2r, T2s, T2F, T2G; + T2r = VFNMS(LDK(KP707106781), Tm, T7); + T2s = VADD(T2a, T29); + T2t = VFMA(LDK(KP923879532), T2s, T2r); + T2L = VFNMS(LDK(KP923879532), T2s, T2r); + T2F = VFNMS(LDK(KP668178637), T2x, T2y); + T2G = VFNMS(LDK(KP668178637), T2u, T2v); + T2H = VSUB(T2F, T2G); + T2M = VADD(T2G, T2F); + } + { + V T2w, T2z, T2C, T2D; + T2w = VFMA(LDK(KP668178637), T2v, T2u); + T2z = VFMA(LDK(KP668178637), T2y, T2x); + T2A = VADD(T2w, T2z); + T2P = VSUB(T2z, T2w); + T2C = VFNMS(LDK(KP707106781), T27, T26); + T2D = VSUB(TR, TC); + T2E = VFNMS(LDK(KP923879532), T2D, T2C); + T2O = VFMA(LDK(KP923879532), T2D, T2C); + } + { + V T2B, T2I, T2R, T2S; + T2B = VFNMS(LDK(KP831469612), T2A, T2t); + T2I = VFNMS(LDK(KP831469612), T2H, T2E); + ST(&(xo[WS(os, 38)]), VFNMSI(T2I, T2B), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VFMAI(T2I, T2B), ovs, &(xo[0])); + T2R = VFNMS(LDK(KP831469612), T2M, T2L); + T2S = VFMA(LDK(KP831469612), T2P, T2O); + ST(&(xo[WS(os, 10)]), VFMAI(T2S, T2R), ovs, &(xo[0])); + ST(&(xo[WS(os, 54)]), VFNMSI(T2S, T2R), ovs, &(xo[0])); + } + { + V T2J, T2K, T2N, T2Q; + T2J = VFMA(LDK(KP831469612), T2A, T2t); + T2K = VFMA(LDK(KP831469612), T2H, T2E); + ST(&(xo[WS(os, 6)]), VFNMSI(T2K, T2J), ovs, &(xo[0])); + ST(&(xo[WS(os, 58)]), VFMAI(T2K, T2J), ovs, &(xo[0])); + T2N = VFMA(LDK(KP831469612), T2M, T2L); + T2Q = VFNMS(LDK(KP831469612), T2P, T2O); + ST(&(xo[WS(os, 22)]), VFNMSI(T2Q, T2N), ovs, &(xo[0])); + ST(&(xo[WS(os, 42)]), VFMAI(T2Q, T2N), ovs, &(xo[0])); + } + } + { + V T5J, T61, T5X, T62, T5Q, T65, T5U, T64; + { + V T5H, T5I, T5V, T5W; + T5H = VFNMS(LDK(KP923879532), T4e, T47); + T5I = VADD(T5p, T5q); + T5J = VFMA(LDK(KP980785280), T5I, T5H); + T61 = VFNMS(LDK(KP980785280), T5I, T5H); + T5V = VFNMS(LDK(KP820678790), T5K, T5L); + T5W = VFNMS(LDK(KP820678790), T5N, T5O); + T5X = VSUB(T5V, T5W); + T62 = VADD(T5V, T5W); + } + { + V T5M, T5P, T5S, T5T; + T5M = VFMA(LDK(KP820678790), T5L, T5K); + T5P = VFMA(LDK(KP820678790), T5O, T5N); + T5Q = VADD(T5M, T5P); + T65 = VSUB(T5P, T5M); + T5S = VFNMS(LDK(KP923879532), T5n, T5k); + T5T = VSUB(T4x, T4o); + T5U = VFMA(LDK(KP980785280), T5T, T5S); + T64 = VFNMS(LDK(KP980785280), T5T, T5S); + } + { + V T5R, T5Y, T67, T68; + T5R = VFNMS(LDK(KP773010453), T5Q, T5J); + T5Y = VFNMS(LDK(KP773010453), T5X, T5U); + ST(&(xo[WS(os, 25)]), VFNMSI(T5Y, T5R), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 39)]), VFMAI(T5Y, T5R), ovs, &(xo[WS(os, 1)])); + T67 = VFNMS(LDK(KP773010453), T62, T61); + T68 = VFNMS(LDK(KP773010453), T65, T64); + ST(&(xo[WS(os, 9)]), VFNMSI(T68, T67), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VFMAI(T68, T67), ovs, &(xo[WS(os, 1)])); + } + { + V T5Z, T60, T63, T66; + T5Z = VFMA(LDK(KP773010453), T5Q, T5J); + T60 = VFMA(LDK(KP773010453), T5X, T5U); + ST(&(xo[WS(os, 57)]), VFNMSI(T60, T5Z), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(T60, T5Z), ovs, &(xo[WS(os, 1)])); + T63 = VFMA(LDK(KP773010453), T62, T61); + T66 = VFMA(LDK(KP773010453), T65, T64); + ST(&(xo[WS(os, 23)]), VFMAI(T66, T63), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 41)]), VFNMSI(T66, T63), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n1fv_64"), {198, 0, 258, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_64) (planner *p) { + X(kdft_register) (p, n1fv_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name n1fv_64 -include dft/simd/n1f.h */ + +/* + * This function contains 456 FP additions, 124 FP multiplications, + * (or, 404 additions, 72 multiplications, 52 fused multiply/add), + * 108 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T4p, T5q, Tb, T39, T2n, T3A, T6f, T6T, Tq, T3B, T6i, T76, T2i, T3a, T4w; + V T5r, TI, T2p, T6C, T6V, T3h, T3E, T4L, T5u, TZ, T2q, T6F, T6U, T3e, T3D; + V T4E, T5t, T23, T2N, T6t, T71, T6w, T72, T2c, T2O, T3t, T41, T5f, T5R, T5k; + V T5S, T3w, T42, T1s, T2K, T6m, T6Y, T6p, T6Z, T1B, T2L, T3m, T3Y, T4Y, T5O; + V T53, T5P, T3p, T3Z; + { + V T3, T4n, T2m, T4o, T6, T5p, T9, T5o; + { + V T1, T2, T2k, T2l; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T4n = VADD(T1, T2); + T2k = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T2l = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T2m = VSUB(T2k, T2l); + T4o = VADD(T2k, T2l); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T5p = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T5o = VADD(T7, T8); + } + T4p = VSUB(T4n, T4o); + T5q = VSUB(T5o, T5p); + { + V Ta, T2j, T6d, T6e; + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VADD(T3, Ta); + T39 = VSUB(T3, Ta); + T2j = VMUL(LDK(KP707106781), VSUB(T9, T6)); + T2n = VSUB(T2j, T2m); + T3A = VADD(T2m, T2j); + T6d = VADD(T4n, T4o); + T6e = VADD(T5p, T5o); + T6f = VADD(T6d, T6e); + T6T = VSUB(T6d, T6e); + } + } + { + V Te, T4q, To, T4u, Th, T4r, Tl, T4t; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T4q = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T4u = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T4r = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T4t = VADD(Tj, Tk); + } + { + V Ti, Tp, T6g, T6h; + Ti = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + Tp = VFMA(LDK(KP923879532), Tl, VMUL(LDK(KP382683432), To)); + Tq = VADD(Ti, Tp); + T3B = VSUB(Tp, Ti); + T6g = VADD(T4q, T4r); + T6h = VADD(T4t, T4u); + T6i = VADD(T6g, T6h); + T76 = VSUB(T6h, T6g); + } + { + V T2g, T2h, T4s, T4v; + T2g = VFNMS(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T2h = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + T2i = VSUB(T2g, T2h); + T3a = VADD(T2h, T2g); + T4s = VSUB(T4q, T4r); + T4v = VSUB(T4t, T4u); + T4w = VMUL(LDK(KP707106781), VADD(T4s, T4v)); + T5r = VMUL(LDK(KP707106781), VSUB(T4v, T4s)); + } + } + { + V Tu, T4F, TG, T4G, TB, T4J, TD, T4I; + { + V Ts, Tt, TE, TF; + Ts = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tu = VSUB(Ts, Tt); + T4F = VADD(Ts, Tt); + TE = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TF = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TG = VSUB(TE, TF); + T4G = VADD(TE, TF); + { + V Tv, Tw, Tx, Ty, Tz, TA; + Tv = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Ty = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TA = VSUB(Ty, Tz); + TB = VMUL(LDK(KP707106781), VADD(Tx, TA)); + T4J = VADD(Tv, Tw); + TD = VMUL(LDK(KP707106781), VSUB(TA, Tx)); + T4I = VADD(Ty, Tz); + } + } + { + V TC, TH, T6A, T6B; + TC = VADD(Tu, TB); + TH = VSUB(TD, TG); + TI = VFMA(LDK(KP195090322), TC, VMUL(LDK(KP980785280), TH)); + T2p = VFNMS(LDK(KP195090322), TH, VMUL(LDK(KP980785280), TC)); + T6A = VADD(T4F, T4G); + T6B = VADD(T4J, T4I); + T6C = VADD(T6A, T6B); + T6V = VSUB(T6A, T6B); + } + { + V T3f, T3g, T4H, T4K; + T3f = VSUB(Tu, TB); + T3g = VADD(TG, TD); + T3h = VFNMS(LDK(KP555570233), T3g, VMUL(LDK(KP831469612), T3f)); + T3E = VFMA(LDK(KP555570233), T3f, VMUL(LDK(KP831469612), T3g)); + T4H = VSUB(T4F, T4G); + T4K = VSUB(T4I, T4J); + T4L = VFNMS(LDK(KP382683432), T4K, VMUL(LDK(KP923879532), T4H)); + T5u = VFMA(LDK(KP382683432), T4H, VMUL(LDK(KP923879532), T4K)); + } + } + { + V TS, T4z, TW, T4y, TP, T4C, TX, T4B; + { + V TQ, TR, TU, TV; + TQ = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + TR = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + TS = VSUB(TQ, TR); + T4z = VADD(TQ, TR); + TU = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + TW = VSUB(TU, TV); + T4y = VADD(TU, TV); + { + V TJ, TK, TL, TM, TN, TO; + TJ = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + TL = VSUB(TJ, TK); + TM = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + T4C = VADD(TM, TN); + TX = VMUL(LDK(KP707106781), VADD(TO, TL)); + T4B = VADD(TJ, TK); + } + } + { + V TT, TY, T6D, T6E; + TT = VSUB(TP, TS); + TY = VADD(TW, TX); + TZ = VFNMS(LDK(KP195090322), TY, VMUL(LDK(KP980785280), TT)); + T2q = VFMA(LDK(KP980785280), TY, VMUL(LDK(KP195090322), TT)); + T6D = VADD(T4y, T4z); + T6E = VADD(T4C, T4B); + T6F = VADD(T6D, T6E); + T6U = VSUB(T6D, T6E); + } + { + V T3c, T3d, T4A, T4D; + T3c = VSUB(TW, TX); + T3d = VADD(TS, TP); + T3e = VFMA(LDK(KP831469612), T3c, VMUL(LDK(KP555570233), T3d)); + T3D = VFNMS(LDK(KP555570233), T3c, VMUL(LDK(KP831469612), T3d)); + T4A = VSUB(T4y, T4z); + T4D = VSUB(T4B, T4C); + T4E = VFMA(LDK(KP923879532), T4A, VMUL(LDK(KP382683432), T4D)); + T5t = VFNMS(LDK(KP382683432), T4A, VMUL(LDK(KP923879532), T4D)); + } + } + { + V T1F, T55, T2a, T56, T1M, T5h, T27, T5g, T58, T59, T1U, T5a, T25, T5b, T5c; + V T21, T5d, T24; + { + V T1D, T1E, T28, T29; + T1D = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T1E = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T1F = VSUB(T1D, T1E); + T55 = VADD(T1D, T1E); + T28 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T29 = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T2a = VSUB(T28, T29); + T56 = VADD(T28, T29); + } + { + V T1G, T1H, T1I, T1J, T1K, T1L; + T1G = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1H = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T1I = VSUB(T1G, T1H); + T1J = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1K = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T1L = VSUB(T1J, T1K); + T1M = VMUL(LDK(KP707106781), VADD(T1I, T1L)); + T5h = VADD(T1G, T1H); + T27 = VMUL(LDK(KP707106781), VSUB(T1L, T1I)); + T5g = VADD(T1J, T1K); + } + { + V T1Q, T1T, T1X, T20; + { + V T1O, T1P, T1R, T1S; + T1O = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1Q = VSUB(T1O, T1P); + T58 = VADD(T1O, T1P); + T1R = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1S = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1T = VSUB(T1R, T1S); + T59 = VADD(T1R, T1S); + } + T1U = VFNMS(LDK(KP382683432), T1T, VMUL(LDK(KP923879532), T1Q)); + T5a = VSUB(T58, T59); + T25 = VFMA(LDK(KP382683432), T1Q, VMUL(LDK(KP923879532), T1T)); + { + V T1V, T1W, T1Y, T1Z; + T1V = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1W = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1X = VSUB(T1V, T1W); + T5b = VADD(T1V, T1W); + T1Y = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1Z = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T20 = VSUB(T1Y, T1Z); + T5c = VADD(T1Y, T1Z); + } + T21 = VFMA(LDK(KP923879532), T1X, VMUL(LDK(KP382683432), T20)); + T5d = VSUB(T5b, T5c); + T24 = VFNMS(LDK(KP923879532), T20, VMUL(LDK(KP382683432), T1X)); + } + { + V T1N, T22, T6r, T6s; + T1N = VADD(T1F, T1M); + T22 = VADD(T1U, T21); + T23 = VSUB(T1N, T22); + T2N = VADD(T1N, T22); + T6r = VADD(T55, T56); + T6s = VADD(T5h, T5g); + T6t = VADD(T6r, T6s); + T71 = VSUB(T6r, T6s); + } + { + V T6u, T6v, T26, T2b; + T6u = VADD(T58, T59); + T6v = VADD(T5b, T5c); + T6w = VADD(T6u, T6v); + T72 = VSUB(T6v, T6u); + T26 = VSUB(T24, T25); + T2b = VSUB(T27, T2a); + T2c = VSUB(T26, T2b); + T2O = VADD(T2b, T26); + } + { + V T3r, T3s, T57, T5e; + T3r = VSUB(T1F, T1M); + T3s = VADD(T25, T24); + T3t = VADD(T3r, T3s); + T41 = VSUB(T3r, T3s); + T57 = VSUB(T55, T56); + T5e = VMUL(LDK(KP707106781), VADD(T5a, T5d)); + T5f = VADD(T57, T5e); + T5R = VSUB(T57, T5e); + } + { + V T5i, T5j, T3u, T3v; + T5i = VSUB(T5g, T5h); + T5j = VMUL(LDK(KP707106781), VSUB(T5d, T5a)); + T5k = VADD(T5i, T5j); + T5S = VSUB(T5j, T5i); + T3u = VADD(T2a, T27); + T3v = VSUB(T21, T1U); + T3w = VADD(T3u, T3v); + T42 = VSUB(T3v, T3u); + } + } + { + V T1q, T4P, T1v, T4O, T1n, T50, T1w, T4Z, T4U, T4V, T18, T4W, T1z, T4R, T4S; + V T1f, T4T, T1y; + { + V T1o, T1p, T1t, T1u; + T1o = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T1p = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T1q = VSUB(T1o, T1p); + T4P = VADD(T1o, T1p); + T1t = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T1u = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T1v = VSUB(T1t, T1u); + T4O = VADD(T1t, T1u); + } + { + V T1h, T1i, T1j, T1k, T1l, T1m; + T1h = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T1j = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T1m = VSUB(T1k, T1l); + T1n = VMUL(LDK(KP707106781), VSUB(T1j, T1m)); + T50 = VADD(T1k, T1l); + T1w = VMUL(LDK(KP707106781), VADD(T1m, T1j)); + T4Z = VADD(T1h, T1i); + } + { + V T14, T17, T1b, T1e; + { + V T12, T13, T15, T16; + T12 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T13 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T14 = VSUB(T12, T13); + T4U = VADD(T12, T13); + T15 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T16 = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T17 = VSUB(T15, T16); + T4V = VADD(T15, T16); + } + T18 = VFNMS(LDK(KP923879532), T17, VMUL(LDK(KP382683432), T14)); + T4W = VSUB(T4U, T4V); + T1z = VFMA(LDK(KP923879532), T14, VMUL(LDK(KP382683432), T17)); + { + V T19, T1a, T1c, T1d; + T19 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T1a = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T1b = VSUB(T19, T1a); + T4R = VADD(T19, T1a); + T1c = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T1d = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T1e = VSUB(T1c, T1d); + T4S = VADD(T1c, T1d); + } + T1f = VFMA(LDK(KP382683432), T1b, VMUL(LDK(KP923879532), T1e)); + T4T = VSUB(T4R, T4S); + T1y = VFNMS(LDK(KP382683432), T1e, VMUL(LDK(KP923879532), T1b)); + } + { + V T1g, T1r, T6k, T6l; + T1g = VSUB(T18, T1f); + T1r = VSUB(T1n, T1q); + T1s = VSUB(T1g, T1r); + T2K = VADD(T1r, T1g); + T6k = VADD(T4O, T4P); + T6l = VADD(T50, T4Z); + T6m = VADD(T6k, T6l); + T6Y = VSUB(T6k, T6l); + } + { + V T6n, T6o, T1x, T1A; + T6n = VADD(T4R, T4S); + T6o = VADD(T4U, T4V); + T6p = VADD(T6n, T6o); + T6Z = VSUB(T6o, T6n); + T1x = VADD(T1v, T1w); + T1A = VADD(T1y, T1z); + T1B = VSUB(T1x, T1A); + T2L = VADD(T1x, T1A); + } + { + V T3k, T3l, T4Q, T4X; + T3k = VSUB(T1v, T1w); + T3l = VADD(T1f, T18); + T3m = VADD(T3k, T3l); + T3Y = VSUB(T3k, T3l); + T4Q = VSUB(T4O, T4P); + T4X = VMUL(LDK(KP707106781), VADD(T4T, T4W)); + T4Y = VADD(T4Q, T4X); + T5O = VSUB(T4Q, T4X); + } + { + V T51, T52, T3n, T3o; + T51 = VSUB(T4Z, T50); + T52 = VMUL(LDK(KP707106781), VSUB(T4W, T4T)); + T53 = VADD(T51, T52); + T5P = VSUB(T52, T51); + T3n = VADD(T1q, T1n); + T3o = VSUB(T1z, T1y); + T3p = VADD(T3n, T3o); + T3Z = VSUB(T3o, T3n); + } + } + { + V T6N, T6R, T6Q, T6S; + { + V T6L, T6M, T6O, T6P; + T6L = VADD(T6f, T6i); + T6M = VADD(T6F, T6C); + T6N = VADD(T6L, T6M); + T6R = VSUB(T6L, T6M); + T6O = VADD(T6m, T6p); + T6P = VADD(T6t, T6w); + T6Q = VADD(T6O, T6P); + T6S = VBYI(VSUB(T6P, T6O)); + } + ST(&(xo[WS(os, 32)]), VSUB(T6N, T6Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 16)]), VADD(T6R, T6S), ovs, &(xo[0])); + ST(&(xo[0]), VADD(T6N, T6Q), ovs, &(xo[0])); + ST(&(xo[WS(os, 48)]), VSUB(T6R, T6S), ovs, &(xo[0])); + } + { + V T6j, T6G, T6y, T6H, T6q, T6x; + T6j = VSUB(T6f, T6i); + T6G = VSUB(T6C, T6F); + T6q = VSUB(T6m, T6p); + T6x = VSUB(T6t, T6w); + T6y = VMUL(LDK(KP707106781), VADD(T6q, T6x)); + T6H = VMUL(LDK(KP707106781), VSUB(T6x, T6q)); + { + V T6z, T6I, T6J, T6K; + T6z = VADD(T6j, T6y); + T6I = VBYI(VADD(T6G, T6H)); + ST(&(xo[WS(os, 56)]), VSUB(T6z, T6I), ovs, &(xo[0])); + ST(&(xo[WS(os, 8)]), VADD(T6z, T6I), ovs, &(xo[0])); + T6J = VSUB(T6j, T6y); + T6K = VBYI(VSUB(T6H, T6G)); + ST(&(xo[WS(os, 40)]), VSUB(T6J, T6K), ovs, &(xo[0])); + ST(&(xo[WS(os, 24)]), VADD(T6J, T6K), ovs, &(xo[0])); + } + } + { + V T6X, T7i, T78, T7g, T74, T7f, T7b, T7j, T6W, T77; + T6W = VMUL(LDK(KP707106781), VADD(T6U, T6V)); + T6X = VADD(T6T, T6W); + T7i = VSUB(T6T, T6W); + T77 = VMUL(LDK(KP707106781), VSUB(T6V, T6U)); + T78 = VADD(T76, T77); + T7g = VSUB(T77, T76); + { + V T70, T73, T79, T7a; + T70 = VFMA(LDK(KP923879532), T6Y, VMUL(LDK(KP382683432), T6Z)); + T73 = VFNMS(LDK(KP382683432), T72, VMUL(LDK(KP923879532), T71)); + T74 = VADD(T70, T73); + T7f = VSUB(T73, T70); + T79 = VFNMS(LDK(KP382683432), T6Y, VMUL(LDK(KP923879532), T6Z)); + T7a = VFMA(LDK(KP382683432), T71, VMUL(LDK(KP923879532), T72)); + T7b = VADD(T79, T7a); + T7j = VSUB(T7a, T79); + } + { + V T75, T7c, T7l, T7m; + T75 = VADD(T6X, T74); + T7c = VBYI(VADD(T78, T7b)); + ST(&(xo[WS(os, 60)]), VSUB(T75, T7c), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(T75, T7c), ovs, &(xo[0])); + T7l = VBYI(VADD(T7g, T7f)); + T7m = VADD(T7i, T7j); + ST(&(xo[WS(os, 12)]), VADD(T7l, T7m), ovs, &(xo[0])); + ST(&(xo[WS(os, 52)]), VSUB(T7m, T7l), ovs, &(xo[0])); + } + { + V T7d, T7e, T7h, T7k; + T7d = VSUB(T6X, T74); + T7e = VBYI(VSUB(T7b, T78)); + ST(&(xo[WS(os, 36)]), VSUB(T7d, T7e), ovs, &(xo[0])); + ST(&(xo[WS(os, 28)]), VADD(T7d, T7e), ovs, &(xo[0])); + T7h = VBYI(VSUB(T7f, T7g)); + T7k = VSUB(T7i, T7j); + ST(&(xo[WS(os, 20)]), VADD(T7h, T7k), ovs, &(xo[0])); + ST(&(xo[WS(os, 44)]), VSUB(T7k, T7h), ovs, &(xo[0])); + } + } + { + V T5N, T68, T61, T69, T5U, T65, T5Y, T66; + { + V T5L, T5M, T5Z, T60; + T5L = VSUB(T4p, T4w); + T5M = VSUB(T5u, T5t); + T5N = VADD(T5L, T5M); + T68 = VSUB(T5L, T5M); + T5Z = VFNMS(LDK(KP555570233), T5O, VMUL(LDK(KP831469612), T5P)); + T60 = VFMA(LDK(KP555570233), T5R, VMUL(LDK(KP831469612), T5S)); + T61 = VADD(T5Z, T60); + T69 = VSUB(T60, T5Z); + } + { + V T5Q, T5T, T5W, T5X; + T5Q = VFMA(LDK(KP831469612), T5O, VMUL(LDK(KP555570233), T5P)); + T5T = VFNMS(LDK(KP555570233), T5S, VMUL(LDK(KP831469612), T5R)); + T5U = VADD(T5Q, T5T); + T65 = VSUB(T5T, T5Q); + T5W = VSUB(T5r, T5q); + T5X = VSUB(T4L, T4E); + T5Y = VADD(T5W, T5X); + T66 = VSUB(T5X, T5W); + } + { + V T5V, T62, T6b, T6c; + T5V = VADD(T5N, T5U); + T62 = VBYI(VADD(T5Y, T61)); + ST(&(xo[WS(os, 58)]), VSUB(T5V, T62), ovs, &(xo[0])); + ST(&(xo[WS(os, 6)]), VADD(T5V, T62), ovs, &(xo[0])); + T6b = VBYI(VADD(T66, T65)); + T6c = VADD(T68, T69); + ST(&(xo[WS(os, 10)]), VADD(T6b, T6c), ovs, &(xo[0])); + ST(&(xo[WS(os, 54)]), VSUB(T6c, T6b), ovs, &(xo[0])); + } + { + V T63, T64, T67, T6a; + T63 = VSUB(T5N, T5U); + T64 = VBYI(VSUB(T61, T5Y)); + ST(&(xo[WS(os, 38)]), VSUB(T63, T64), ovs, &(xo[0])); + ST(&(xo[WS(os, 26)]), VADD(T63, T64), ovs, &(xo[0])); + T67 = VBYI(VSUB(T65, T66)); + T6a = VSUB(T68, T69); + ST(&(xo[WS(os, 22)]), VADD(T67, T6a), ovs, &(xo[0])); + ST(&(xo[WS(os, 42)]), VSUB(T6a, T67), ovs, &(xo[0])); + } + } + { + V T11, T2C, T2v, T2D, T2e, T2z, T2s, T2A; + { + V Tr, T10, T2t, T2u; + Tr = VSUB(Tb, Tq); + T10 = VSUB(TI, TZ); + T11 = VADD(Tr, T10); + T2C = VSUB(Tr, T10); + T2t = VFNMS(LDK(KP634393284), T1B, VMUL(LDK(KP773010453), T1s)); + T2u = VFMA(LDK(KP773010453), T2c, VMUL(LDK(KP634393284), T23)); + T2v = VADD(T2t, T2u); + T2D = VSUB(T2u, T2t); + } + { + V T1C, T2d, T2o, T2r; + T1C = VFMA(LDK(KP634393284), T1s, VMUL(LDK(KP773010453), T1B)); + T2d = VFNMS(LDK(KP634393284), T2c, VMUL(LDK(KP773010453), T23)); + T2e = VADD(T1C, T2d); + T2z = VSUB(T2d, T1C); + T2o = VSUB(T2i, T2n); + T2r = VSUB(T2p, T2q); + T2s = VADD(T2o, T2r); + T2A = VSUB(T2r, T2o); + } + { + V T2f, T2w, T2F, T2G; + T2f = VADD(T11, T2e); + T2w = VBYI(VADD(T2s, T2v)); + ST(&(xo[WS(os, 57)]), VSUB(T2f, T2w), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VADD(T2f, T2w), ovs, &(xo[WS(os, 1)])); + T2F = VBYI(VADD(T2A, T2z)); + T2G = VADD(T2C, T2D); + ST(&(xo[WS(os, 9)]), VADD(T2F, T2G), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 55)]), VSUB(T2G, T2F), ovs, &(xo[WS(os, 1)])); + } + { + V T2x, T2y, T2B, T2E; + T2x = VSUB(T11, T2e); + T2y = VBYI(VSUB(T2v, T2s)); + ST(&(xo[WS(os, 39)]), VSUB(T2x, T2y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 25)]), VADD(T2x, T2y), ovs, &(xo[WS(os, 1)])); + T2B = VBYI(VSUB(T2z, T2A)); + T2E = VSUB(T2C, T2D); + ST(&(xo[WS(os, 23)]), VADD(T2B, T2E), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 41)]), VSUB(T2E, T2B), ovs, &(xo[WS(os, 1)])); + } + } + { + V T3j, T3Q, T3J, T3R, T3y, T3N, T3G, T3O; + { + V T3b, T3i, T3H, T3I; + T3b = VADD(T39, T3a); + T3i = VADD(T3e, T3h); + T3j = VADD(T3b, T3i); + T3Q = VSUB(T3b, T3i); + T3H = VFNMS(LDK(KP290284677), T3m, VMUL(LDK(KP956940335), T3p)); + T3I = VFMA(LDK(KP290284677), T3t, VMUL(LDK(KP956940335), T3w)); + T3J = VADD(T3H, T3I); + T3R = VSUB(T3I, T3H); + } + { + V T3q, T3x, T3C, T3F; + T3q = VFMA(LDK(KP956940335), T3m, VMUL(LDK(KP290284677), T3p)); + T3x = VFNMS(LDK(KP290284677), T3w, VMUL(LDK(KP956940335), T3t)); + T3y = VADD(T3q, T3x); + T3N = VSUB(T3x, T3q); + T3C = VADD(T3A, T3B); + T3F = VADD(T3D, T3E); + T3G = VADD(T3C, T3F); + T3O = VSUB(T3F, T3C); + } + { + V T3z, T3K, T3T, T3U; + T3z = VADD(T3j, T3y); + T3K = VBYI(VADD(T3G, T3J)); + ST(&(xo[WS(os, 61)]), VSUB(T3z, T3K), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(T3z, T3K), ovs, &(xo[WS(os, 1)])); + T3T = VBYI(VADD(T3O, T3N)); + T3U = VADD(T3Q, T3R); + ST(&(xo[WS(os, 13)]), VADD(T3T, T3U), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 51)]), VSUB(T3U, T3T), ovs, &(xo[WS(os, 1)])); + } + { + V T3L, T3M, T3P, T3S; + T3L = VSUB(T3j, T3y); + T3M = VBYI(VSUB(T3J, T3G)); + ST(&(xo[WS(os, 35)]), VSUB(T3L, T3M), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 29)]), VADD(T3L, T3M), ovs, &(xo[WS(os, 1)])); + T3P = VBYI(VSUB(T3N, T3O)); + T3S = VSUB(T3Q, T3R); + ST(&(xo[WS(os, 19)]), VADD(T3P, T3S), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 45)]), VSUB(T3S, T3P), ovs, &(xo[WS(os, 1)])); + } + } + { + V T4N, T5G, T5z, T5H, T5m, T5D, T5w, T5E; + { + V T4x, T4M, T5x, T5y; + T4x = VADD(T4p, T4w); + T4M = VADD(T4E, T4L); + T4N = VADD(T4x, T4M); + T5G = VSUB(T4x, T4M); + T5x = VFNMS(LDK(KP195090322), T4Y, VMUL(LDK(KP980785280), T53)); + T5y = VFMA(LDK(KP195090322), T5f, VMUL(LDK(KP980785280), T5k)); + T5z = VADD(T5x, T5y); + T5H = VSUB(T5y, T5x); + } + { + V T54, T5l, T5s, T5v; + T54 = VFMA(LDK(KP980785280), T4Y, VMUL(LDK(KP195090322), T53)); + T5l = VFNMS(LDK(KP195090322), T5k, VMUL(LDK(KP980785280), T5f)); + T5m = VADD(T54, T5l); + T5D = VSUB(T5l, T54); + T5s = VADD(T5q, T5r); + T5v = VADD(T5t, T5u); + T5w = VADD(T5s, T5v); + T5E = VSUB(T5v, T5s); + } + { + V T5n, T5A, T5J, T5K; + T5n = VADD(T4N, T5m); + T5A = VBYI(VADD(T5w, T5z)); + ST(&(xo[WS(os, 62)]), VSUB(T5n, T5A), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(T5n, T5A), ovs, &(xo[0])); + T5J = VBYI(VADD(T5E, T5D)); + T5K = VADD(T5G, T5H); + ST(&(xo[WS(os, 14)]), VADD(T5J, T5K), ovs, &(xo[0])); + ST(&(xo[WS(os, 50)]), VSUB(T5K, T5J), ovs, &(xo[0])); + } + { + V T5B, T5C, T5F, T5I; + T5B = VSUB(T4N, T5m); + T5C = VBYI(VSUB(T5z, T5w)); + ST(&(xo[WS(os, 34)]), VSUB(T5B, T5C), ovs, &(xo[0])); + ST(&(xo[WS(os, 30)]), VADD(T5B, T5C), ovs, &(xo[0])); + T5F = VBYI(VSUB(T5D, T5E)); + T5I = VSUB(T5G, T5H); + ST(&(xo[WS(os, 18)]), VADD(T5F, T5I), ovs, &(xo[0])); + ST(&(xo[WS(os, 46)]), VSUB(T5I, T5F), ovs, &(xo[0])); + } + } + { + V T2J, T34, T2X, T35, T2Q, T31, T2U, T32; + { + V T2H, T2I, T2V, T2W; + T2H = VADD(Tb, Tq); + T2I = VADD(T2q, T2p); + T2J = VADD(T2H, T2I); + T34 = VSUB(T2H, T2I); + T2V = VFNMS(LDK(KP098017140), T2L, VMUL(LDK(KP995184726), T2K)); + T2W = VFMA(LDK(KP995184726), T2O, VMUL(LDK(KP098017140), T2N)); + T2X = VADD(T2V, T2W); + T35 = VSUB(T2W, T2V); + } + { + V T2M, T2P, T2S, T2T; + T2M = VFMA(LDK(KP098017140), T2K, VMUL(LDK(KP995184726), T2L)); + T2P = VFNMS(LDK(KP098017140), T2O, VMUL(LDK(KP995184726), T2N)); + T2Q = VADD(T2M, T2P); + T31 = VSUB(T2P, T2M); + T2S = VADD(T2n, T2i); + T2T = VADD(TZ, TI); + T2U = VADD(T2S, T2T); + T32 = VSUB(T2T, T2S); + } + { + V T2R, T2Y, T37, T38; + T2R = VADD(T2J, T2Q); + T2Y = VBYI(VADD(T2U, T2X)); + ST(&(xo[WS(os, 63)]), VSUB(T2R, T2Y), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(T2R, T2Y), ovs, &(xo[WS(os, 1)])); + T37 = VBYI(VADD(T32, T31)); + T38 = VADD(T34, T35); + ST(&(xo[WS(os, 15)]), VADD(T37, T38), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 49)]), VSUB(T38, T37), ovs, &(xo[WS(os, 1)])); + } + { + V T2Z, T30, T33, T36; + T2Z = VSUB(T2J, T2Q); + T30 = VBYI(VSUB(T2X, T2U)); + ST(&(xo[WS(os, 33)]), VSUB(T2Z, T30), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 31)]), VADD(T2Z, T30), ovs, &(xo[WS(os, 1)])); + T33 = VBYI(VSUB(T31, T32)); + T36 = VSUB(T34, T35); + ST(&(xo[WS(os, 17)]), VADD(T33, T36), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 47)]), VSUB(T36, T33), ovs, &(xo[WS(os, 1)])); + } + } + { + V T3X, T4i, T4b, T4j, T44, T4f, T48, T4g; + { + V T3V, T3W, T49, T4a; + T3V = VSUB(T39, T3a); + T3W = VSUB(T3E, T3D); + T3X = VADD(T3V, T3W); + T4i = VSUB(T3V, T3W); + T49 = VFNMS(LDK(KP471396736), T3Y, VMUL(LDK(KP881921264), T3Z)); + T4a = VFMA(LDK(KP471396736), T41, VMUL(LDK(KP881921264), T42)); + T4b = VADD(T49, T4a); + T4j = VSUB(T4a, T49); + } + { + V T40, T43, T46, T47; + T40 = VFMA(LDK(KP881921264), T3Y, VMUL(LDK(KP471396736), T3Z)); + T43 = VFNMS(LDK(KP471396736), T42, VMUL(LDK(KP881921264), T41)); + T44 = VADD(T40, T43); + T4f = VSUB(T43, T40); + T46 = VSUB(T3B, T3A); + T47 = VSUB(T3h, T3e); + T48 = VADD(T46, T47); + T4g = VSUB(T47, T46); + } + { + V T45, T4c, T4l, T4m; + T45 = VADD(T3X, T44); + T4c = VBYI(VADD(T48, T4b)); + ST(&(xo[WS(os, 59)]), VSUB(T45, T4c), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VADD(T45, T4c), ovs, &(xo[WS(os, 1)])); + T4l = VBYI(VADD(T4g, T4f)); + T4m = VADD(T4i, T4j); + ST(&(xo[WS(os, 11)]), VADD(T4l, T4m), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 53)]), VSUB(T4m, T4l), ovs, &(xo[WS(os, 1)])); + } + { + V T4d, T4e, T4h, T4k; + T4d = VSUB(T3X, T44); + T4e = VBYI(VSUB(T4b, T48)); + ST(&(xo[WS(os, 37)]), VSUB(T4d, T4e), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 27)]), VADD(T4d, T4e), ovs, &(xo[WS(os, 1)])); + T4h = VBYI(VSUB(T4f, T4g)); + T4k = VSUB(T4i, T4j); + ST(&(xo[WS(os, 21)]), VADD(T4h, T4k), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 43)]), VSUB(T4k, T4h), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n1fv_64"), {404, 72, 52, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_64) (planner *p) { + X(kdft_register) (p, n1fv_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_7.c new file mode 100644 index 000000000..7e34acdea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_7.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name n1fv_7 -include dft/simd/n1f.h */ + +/* + * This function contains 30 FP additions, 24 FP multiplications, + * (or, 9 additions, 3 multiplications, 21 fused multiply/add), + * 33 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_7(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(14, is), MAKE_VOLATILE_STRIDE(14, os)) { + V T1, T4, Te, Ta, Tf, T7, Tg, Tb, Th, Tr, To, Tm, Tj, T2, T3; + V Ts, Tq, Tp; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Te = VSUB(T3, T2); + { + V T8, T9, T5, T6; + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Tf = VSUB(T9, T8); + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + Tg = VSUB(T6, T5); + } + Tb = VFNMS(LDK(KP356895867), T4, Ta); + Th = VFMA(LDK(KP554958132), Tg, Tf); + Tr = VFNMS(LDK(KP554958132), Te, Tg); + To = VFNMS(LDK(KP356895867), Ta, T7); + Tm = VFMA(LDK(KP554958132), Tf, Te); + Tj = VFNMS(LDK(KP356895867), T7, T4); + ST(&(xo[0]), VADD(T1, VADD(T4, VADD(T7, Ta))), ovs, &(xo[0])); + Ts = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tr, Tf)); + Tp = VFNMS(LDK(KP692021471), To, T4); + Tq = VFNMS(LDK(KP900968867), Tp, T1); + ST(&(xo[WS(os, 4)]), VFNMSI(Ts, Tq), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VFMAI(Ts, Tq), ovs, &(xo[WS(os, 1)])); + { + V Ti, Td, Tc, Tn, Tl, Tk; + Ti = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Th, Te)); + Tc = VFNMS(LDK(KP692021471), Tb, T7); + Td = VFNMS(LDK(KP900968867), Tc, T1); + ST(&(xo[WS(os, 5)]), VFNMSI(Ti, Td), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VFMAI(Ti, Td), ovs, &(xo[0])); + Tn = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), Tm, Tg)); + Tk = VFNMS(LDK(KP692021471), Tj, Ta); + Tl = VFNMS(LDK(KP900968867), Tk, T1); + ST(&(xo[WS(os, 6)]), VFNMSI(Tn, Tl), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VFMAI(Tn, Tl), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 7, XSIMD_STRING("n1fv_7"), {9, 3, 21, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_7) (planner *p) { + X(kdft_register) (p, n1fv_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name n1fv_7 -include dft/simd/n1f.h */ + +/* + * This function contains 30 FP additions, 18 FP multiplications, + * (or, 18 additions, 6 multiplications, 12 fused multiply/add), + * 24 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_7(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(14, is), MAKE_VOLATILE_STRIDE(14, os)) { + V T1, Ta, Td, T4, Tc, T7, Te, T8, T9, Tj, Ti; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + Td = VSUB(T9, T8); + { + V T2, T3, T5, T6; + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tc = VSUB(T3, T2); + T5 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T7 = VADD(T5, T6); + Te = VSUB(T6, T5); + } + ST(&(xo[0]), VADD(T1, VADD(T4, VADD(T7, Ta))), ovs, &(xo[0])); + Tj = VBYI(VFMA(LDK(KP433883739), Tc, VFNMS(LDK(KP781831482), Te, VMUL(LDK(KP974927912), Td)))); + Ti = VFMA(LDK(KP623489801), T7, VFNMS(LDK(KP222520933), Ta, VFNMS(LDK(KP900968867), T4, T1))); + ST(&(xo[WS(os, 4)]), VSUB(Ti, Tj), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VADD(Ti, Tj), ovs, &(xo[WS(os, 1)])); + { + V Tf, Tb, Th, Tg; + Tf = VBYI(VFNMS(LDK(KP781831482), Td, VFNMS(LDK(KP433883739), Te, VMUL(LDK(KP974927912), Tc)))); + Tb = VFMA(LDK(KP623489801), Ta, VFNMS(LDK(KP900968867), T7, VFNMS(LDK(KP222520933), T4, T1))); + ST(&(xo[WS(os, 5)]), VSUB(Tb, Tf), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VADD(Tb, Tf), ovs, &(xo[0])); + Th = VBYI(VFMA(LDK(KP781831482), Tc, VFMA(LDK(KP974927912), Te, VMUL(LDK(KP433883739), Td)))); + Tg = VFMA(LDK(KP623489801), T4, VFNMS(LDK(KP900968867), Ta, VFNMS(LDK(KP222520933), T7, T1))); + ST(&(xo[WS(os, 6)]), VSUB(Tg, Th), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(Tg, Th), ovs, &(xo[WS(os, 1)])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 7, XSIMD_STRING("n1fv_7"), {18, 6, 12, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_7) (planner *p) { + X(kdft_register) (p, n1fv_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_8.c new file mode 100644 index 000000000..70b5607c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_8.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name n1fv_8 -include dft/simd/n1f.h */ + +/* + * This function contains 26 FP additions, 10 FP multiplications, + * (or, 16 additions, 0 multiplications, 10 fused multiply/add), + * 22 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tj, Te, Tk, Ta, Tn, Tf, Tm; + { + V T1, T2, Tc, Td; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tj = VADD(T1, T2); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Ta = VADD(T6, T9); + Tn = VADD(T7, T8); + Tf = VSUB(T9, T6); + Tm = VADD(T4, T5); + } + } + { + V Tb, Tg, Tp, Tq; + Tb = VFMA(LDK(KP707106781), Ta, T3); + Tg = VFNMS(LDK(KP707106781), Tf, Te); + ST(&(xo[WS(os, 1)]), VFNMSI(Tg, Tb), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 7)]), VFMAI(Tg, Tb), ovs, &(xo[WS(os, 1)])); + Tp = VSUB(Tj, Tk); + Tq = VSUB(Tn, Tm); + ST(&(xo[WS(os, 6)]), VFNMSI(Tq, Tp), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VFMAI(Tq, Tp), ovs, &(xo[0])); + } + { + V Th, Ti, Tl, To; + Th = VFNMS(LDK(KP707106781), Ta, T3); + Ti = VFMA(LDK(KP707106781), Tf, Te); + ST(&(xo[WS(os, 5)]), VFNMSI(Ti, Th), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VFMAI(Ti, Th), ovs, &(xo[WS(os, 1)])); + Tl = VADD(Tj, Tk); + To = VADD(Tm, Tn); + ST(&(xo[WS(os, 4)]), VSUB(Tl, To), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tl, To), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n1fv_8"), {16, 0, 10, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_8) (planner *p) { + X(kdft_register) (p, n1fv_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name n1fv_8 -include dft/simd/n1f.h */ + +/* + * This function contains 26 FP additions, 2 FP multiplications, + * (or, 26 additions, 2 multiplications, 0 fused multiply/add), + * 22 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tj, Tf, Tk, Ta, Tn, Tc, Tm; + { + V T1, T2, Td, Te; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tj = VADD(T1, T2); + Td = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tf = VSUB(Td, Te); + Tk = VADD(Td, Te); + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tn = VADD(T7, T8); + Tc = VMUL(LDK(KP707106781), VSUB(T9, T6)); + Tm = VADD(T4, T5); + } + } + { + V Tb, Tg, Tp, Tq; + Tb = VADD(T3, Ta); + Tg = VBYI(VSUB(Tc, Tf)); + ST(&(xo[WS(os, 7)]), VSUB(Tb, Tg), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 1)]), VADD(Tb, Tg), ovs, &(xo[WS(os, 1)])); + Tp = VSUB(Tj, Tk); + Tq = VBYI(VSUB(Tn, Tm)); + ST(&(xo[WS(os, 6)]), VSUB(Tp, Tq), ovs, &(xo[0])); + ST(&(xo[WS(os, 2)]), VADD(Tp, Tq), ovs, &(xo[0])); + } + { + V Th, Ti, Tl, To; + Th = VSUB(T3, Ta); + Ti = VBYI(VADD(Tf, Tc)); + ST(&(xo[WS(os, 5)]), VSUB(Th, Ti), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 3)]), VADD(Th, Ti), ovs, &(xo[WS(os, 1)])); + Tl = VADD(Tj, Tk); + To = VADD(Tm, Tn); + ST(&(xo[WS(os, 4)]), VSUB(Tl, To), ovs, &(xo[0])); + ST(&(xo[0]), VADD(Tl, To), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n1fv_8"), {26, 2, 0, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_8) (planner *p) { + X(kdft_register) (p, n1fv_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_9.c new file mode 100644 index 000000000..7eb2650f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n1fv_9.c @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:04:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name n1fv_9 -include dft/simd/n1f.h */ + +/* + * This function contains 46 FP additions, 38 FP multiplications, + * (or, 12 additions, 4 multiplications, 34 fused multiply/add), + * 50 stack variables, 19 constants, and 18 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_9(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP666666666, +0.666666666666666666666666666666666666666666667); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP673648177, +0.673648177666930348851716626769314796000375677); + DVK(KP898197570, +0.898197570222573798468955502359086394667167570); + DVK(KP879385241, +0.879385241571816768108218554649462939872416269); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP826351822, +0.826351822333069651148283373230685203999624323); + DVK(KP420276625, +0.420276625461206169731530603237061658838781920); + DVK(KP907603734, +0.907603734547952313649323976213898122064543220); + DVK(KP347296355, +0.347296355333860697703433253538629592000751354); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP726681596, +0.726681596905677465811651808188092531873167623); + DVK(KP968908795, +0.968908795874236621082202410917456709164223497); + DVK(KP586256827, +0.586256827714544512072145703099641959914944179); + DVK(KP203604859, +0.203604859554852403062088995281827210665664861); + DVK(KP152703644, +0.152703644666139302296566746461370407999248646); + DVK(KP439692620, +0.439692620785908384054109277324731469936208134); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(18, is), MAKE_VOLATILE_STRIDE(18, os)) { + V T5, Tv, Tj, Tl, Tm, Ta, Tf, Tk, Ts, TB, Tx, Tn, To, TC, Ty; + V Ti, Tg, Th; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VADD(T1, T4); + Tv = VSUB(T3, T2); + Tj = VFNMS(LDK(KP500000000), T4, T1); + } + { + V T6, Tb, T9, Te; + T6 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tb = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + { + V T7, T8, Tc, Td; + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T7, T8); + Tl = VSUB(T7, T8); + Tc = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Te = VADD(Tc, Td); + Tm = VSUB(Td, Tc); + } + Ta = VADD(T6, T9); + Tf = VADD(Tb, Te); + Tk = VFNMS(LDK(KP500000000), Te, Tb); + Ts = VFNMS(LDK(KP439692620), Tl, Tk); + TB = VFNMS(LDK(KP152703644), Tm, Tk); + Tx = VFMA(LDK(KP203604859), Tk, Tm); + Tn = VFNMS(LDK(KP500000000), T9, T6); + To = VFNMS(LDK(KP586256827), Tn, Tm); + TC = VFMA(LDK(KP968908795), Tn, Tl); + Ty = VFNMS(LDK(KP726681596), Tl, Tn); + } + Ti = VMUL(LDK(KP866025403), VSUB(Tf, Ta)); + Tg = VADD(Ta, Tf); + Th = VFNMS(LDK(KP500000000), Tg, T5); + ST(&(xo[0]), VADD(T5, Tg), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VFMAI(Ti, Th), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VFNMSI(Ti, Th), ovs, &(xo[0])); + { + V Tq, Tu, Tp, Tt, Tr, Tw; + Tp = VFNMS(LDK(KP347296355), To, Tl); + Tq = VFNMS(LDK(KP907603734), Tp, Tk); + Tt = VFNMS(LDK(KP420276625), Ts, Tm); + Tu = VFNMS(LDK(KP826351822), Tt, Tn); + Tr = VFNMS(LDK(KP939692620), Tq, Tj); + Tw = VMUL(LDK(KP984807753), VFMA(LDK(KP879385241), Tv, Tu)); + ST(&(xo[WS(os, 2)]), VFNMSI(Tw, Tr), ovs, &(xo[0])); + ST(&(xo[WS(os, 7)]), VFMAI(Tw, Tr), ovs, &(xo[WS(os, 1)])); + } + { + V TA, TG, TE, TJ, TH, TK; + { + V Tz, TF, TD, TI; + Tz = VFMA(LDK(KP898197570), Ty, Tx); + TF = VFNMS(LDK(KP673648177), TC, TB); + TA = VFMA(LDK(KP852868531), Tz, Tj); + TG = VFNMS(LDK(KP500000000), Tz, TF); + TD = VFMA(LDK(KP673648177), TC, TB); + TI = VFNMS(LDK(KP898197570), Ty, Tx); + TE = VMUL(LDK(KP984807753), VFNMS(LDK(KP879385241), Tv, TD)); + TJ = VFMA(LDK(KP666666666), TD, TI); + } + ST(&(xo[WS(os, 1)]), VFNMSI(TE, TA), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 8)]), VFMAI(TE, TA), ovs, &(xo[0])); + TH = VFMA(LDK(KP852868531), TG, Tj); + TK = VMUL(LDK(KP866025403), VFMA(LDK(KP852868531), TJ, Tv)); + ST(&(xo[WS(os, 5)]), VFNMSI(TK, TH), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 4)]), VFMAI(TK, TH), ovs, &(xo[0])); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 9, XSIMD_STRING("n1fv_9"), {12, 4, 34, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_9) (planner *p) { + X(kdft_register) (p, n1fv_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name n1fv_9 -include dft/simd/n1f.h */ + +/* + * This function contains 46 FP additions, 26 FP multiplications, + * (or, 30 additions, 10 multiplications, 16 fused multiply/add), + * 41 stack variables, 14 constants, and 18 memory accesses + */ +#include "dft/simd/n1f.h" + +static void n1fv_9(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP342020143, +0.342020143325668733044099614682259580763083368); + DVK(KP813797681, +0.813797681349373692844693217248393223289101568); + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP296198132, +0.296198132726023843175338011893050938967728390); + DVK(KP642787609, +0.642787609686539326322643409907263432907559884); + DVK(KP663413948, +0.663413948168938396205421319635891297216863310); + DVK(KP556670399, +0.556670399226419366452912952047023132968291906); + DVK(KP766044443, +0.766044443118978035202392650555416673935832457); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP150383733, +0.150383733180435296639271897612501926072238258); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP173648177, +0.173648177666930348851716626769314796000375677); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(18, is), MAKE_VOLATILE_STRIDE(18, os)) { + V T5, Ts, Tj, To, Tf, Tn, Tp, Tu, Tl, Ta, Tk, Tm, Tt; + { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + T5 = VADD(T1, T4); + Ts = VMUL(LDK(KP866025403), VSUB(T3, T2)); + Tj = VFNMS(LDK(KP500000000), T4, T1); + } + { + V Tb, Te, Tc, Td; + Tb = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Te = VADD(Tc, Td); + To = VSUB(Td, Tc); + Tf = VADD(Tb, Te); + Tn = VFNMS(LDK(KP500000000), Te, Tb); + Tp = VFMA(LDK(KP173648177), Tn, VMUL(LDK(KP852868531), To)); + Tu = VFNMS(LDK(KP984807753), Tn, VMUL(LDK(KP150383733), To)); + } + { + V T6, T9, T7, T8; + T6 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T9 = VADD(T7, T8); + Tl = VSUB(T8, T7); + Ta = VADD(T6, T9); + Tk = VFNMS(LDK(KP500000000), T9, T6); + Tm = VFMA(LDK(KP766044443), Tk, VMUL(LDK(KP556670399), Tl)); + Tt = VFNMS(LDK(KP642787609), Tk, VMUL(LDK(KP663413948), Tl)); + } + { + V Ti, Tg, Th, Tz, TA; + Ti = VBYI(VMUL(LDK(KP866025403), VSUB(Tf, Ta))); + Tg = VADD(Ta, Tf); + Th = VFNMS(LDK(KP500000000), Tg, T5); + ST(&(xo[0]), VADD(T5, Tg), ovs, &(xo[0])); + ST(&(xo[WS(os, 3)]), VADD(Th, Ti), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 6)]), VSUB(Th, Ti), ovs, &(xo[0])); + Tz = VFMA(LDK(KP173648177), Tk, VFNMS(LDK(KP296198132), To, VFNMS(LDK(KP939692620), Tn, VFNMS(LDK(KP852868531), Tl, Tj)))); + TA = VBYI(VSUB(VFNMS(LDK(KP342020143), Tn, VFNMS(LDK(KP150383733), Tl, VFNMS(LDK(KP984807753), Tk, VMUL(LDK(KP813797681), To)))), Ts)); + ST(&(xo[WS(os, 7)]), VSUB(Tz, TA), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 2)]), VADD(Tz, TA), ovs, &(xo[0])); + { + V Tr, Tx, Tw, Ty, Tq, Tv; + Tq = VADD(Tm, Tp); + Tr = VADD(Tj, Tq); + Tx = VFMA(LDK(KP866025403), VSUB(Tt, Tu), VFNMS(LDK(KP500000000), Tq, Tj)); + Tv = VADD(Tt, Tu); + Tw = VBYI(VADD(Ts, Tv)); + Ty = VBYI(VADD(Ts, VFNMS(LDK(KP500000000), Tv, VMUL(LDK(KP866025403), VSUB(Tp, Tm))))); + ST(&(xo[WS(os, 8)]), VSUB(Tr, Tw), ovs, &(xo[0])); + ST(&(xo[WS(os, 4)]), VADD(Tx, Ty), ovs, &(xo[0])); + ST(&(xo[WS(os, 1)]), VADD(Tw, Tr), ovs, &(xo[WS(os, 1)])); + ST(&(xo[WS(os, 5)]), VSUB(Tx, Ty), ovs, &(xo[WS(os, 1)])); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 9, XSIMD_STRING("n1fv_9"), {30, 10, 16, 0}, &GENUS, 0, 0, 0, 0 }; + +void XSIMD(codelet_n1fv_9) (planner *p) { + X(kdft_register) (p, n1fv_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_10.c new file mode 100644 index 000000000..405edd331 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_10.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 10 -name n2bv_10 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 42 FP additions, 22 FP multiplications, + * (or, 24 additions, 4 multiplications, 18 fused multiply/add), + * 36 stack variables, 4 constants, and 25 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V T3, Tr, Tm, Tn, TD, TC, Tu, Tx, Ty, Ta, Th, Ti, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tr = VADD(T1, T2); + { + V T6, Ts, Tg, Tw, T9, Tt, Td, Tv; + { + V T4, T5, Te, Tf; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Ts = VADD(T4, T5); + Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + Tw = VADD(Te, Tf); + } + { + V T7, T8, Tb, Tc; + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tt = VADD(T7, T8); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tv = VADD(Tb, Tc); + } + Tm = VSUB(T6, T9); + Tn = VSUB(Td, Tg); + TD = VSUB(Ts, Tt); + TC = VSUB(Tv, Tw); + Tu = VADD(Ts, Tt); + Tx = VADD(Tv, Tw); + Ty = VADD(Tu, Tx); + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + } + { + V TH, TI, TK, TL, TM; + TH = VADD(T3, Ti); + STM2(&(xo[10]), TH, ovs, &(xo[2])); + TI = VADD(Tr, Ty); + STM2(&(xo[0]), TI, ovs, &(xo[0])); + { + V To, Tq, Tl, Tp, Tj, Tk, TJ; + To = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tn, Tm)); + Tq = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tm, Tn)); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tk = VSUB(Ta, Th); + Tl = VFMA(LDK(KP559016994), Tk, Tj); + Tp = VFNMS(LDK(KP559016994), Tk, Tj); + TJ = VFMAI(To, Tl); + STM2(&(xo[2]), TJ, ovs, &(xo[2])); + STN2(&(xo[0]), TI, TJ, ovs); + TK = VFNMSI(Tq, Tp); + STM2(&(xo[14]), TK, ovs, &(xo[2])); + TL = VFNMSI(To, Tl); + STM2(&(xo[18]), TL, ovs, &(xo[2])); + TM = VFMAI(Tq, Tp); + STM2(&(xo[6]), TM, ovs, &(xo[2])); + } + { + V TE, TG, TB, TF, Tz, TA; + TE = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TD, TC)); + TG = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TC, TD)); + Tz = VFNMS(LDK(KP250000000), Ty, Tr); + TA = VSUB(Tu, Tx); + TB = VFNMS(LDK(KP559016994), TA, Tz); + TF = VFMA(LDK(KP559016994), TA, Tz); + { + V TN, TO, TP, TQ; + TN = VFNMSI(TE, TB); + STM2(&(xo[4]), TN, ovs, &(xo[0])); + STN2(&(xo[4]), TN, TM, ovs); + TO = VFMAI(TG, TF); + STM2(&(xo[12]), TO, ovs, &(xo[0])); + STN2(&(xo[12]), TO, TK, ovs); + TP = VFMAI(TE, TB); + STM2(&(xo[16]), TP, ovs, &(xo[0])); + STN2(&(xo[16]), TP, TL, ovs); + TQ = VFNMSI(TG, TF); + STM2(&(xo[8]), TQ, ovs, &(xo[0])); + STN2(&(xo[8]), TQ, TH, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n2bv_10"), {24, 4, 18, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_10) (planner *p) { + X(kdft_register) (p, n2bv_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 10 -name n2bv_10 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 42 FP additions, 12 FP multiplications, + * (or, 36 additions, 6 multiplications, 6 fused multiply/add), + * 36 stack variables, 4 constants, and 25 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V Tl, Ty, T7, Te, Tw, Tt, Tz, TA, TB, Tg, Th, Tm, Tj, Tk; + Tj = LD(&(xi[0]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tl = VSUB(Tj, Tk); + Ty = VADD(Tj, Tk); + { + V T3, Tr, Td, Tv, T6, Ts, Ta, Tu; + { + V T1, T2, Tb, Tc; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tr = VADD(T1, T2); + Tb = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tv = VADD(Tb, Tc); + } + { + V T4, T5, T8, T9; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Ts = VADD(T4, T5); + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + Tu = VADD(T8, T9); + } + T7 = VSUB(T3, T6); + Te = VSUB(Ta, Td); + Tw = VSUB(Tu, Tv); + Tt = VSUB(Tr, Ts); + Tz = VADD(Tr, Ts); + TA = VADD(Tu, Tv); + TB = VADD(Tz, TA); + Tg = VADD(T3, T6); + Th = VADD(Ta, Td); + Tm = VADD(Tg, Th); + } + { + V TH, TI, TK, TL, TM; + TH = VADD(Tl, Tm); + STM2(&(xo[10]), TH, ovs, &(xo[2])); + TI = VADD(Ty, TB); + STM2(&(xo[0]), TI, ovs, &(xo[0])); + { + V Tf, Tq, To, Tp, Ti, Tn, TJ; + Tf = VBYI(VFMA(LDK(KP951056516), T7, VMUL(LDK(KP587785252), Te))); + Tq = VBYI(VFNMS(LDK(KP951056516), Te, VMUL(LDK(KP587785252), T7))); + Ti = VMUL(LDK(KP559016994), VSUB(Tg, Th)); + Tn = VFNMS(LDK(KP250000000), Tm, Tl); + To = VADD(Ti, Tn); + Tp = VSUB(Tn, Ti); + TJ = VADD(Tf, To); + STM2(&(xo[2]), TJ, ovs, &(xo[2])); + STN2(&(xo[0]), TI, TJ, ovs); + TK = VADD(Tq, Tp); + STM2(&(xo[14]), TK, ovs, &(xo[2])); + TL = VSUB(To, Tf); + STM2(&(xo[18]), TL, ovs, &(xo[2])); + TM = VSUB(Tp, Tq); + STM2(&(xo[6]), TM, ovs, &(xo[2])); + } + { + V Tx, TG, TE, TF, TC, TD; + Tx = VBYI(VFNMS(LDK(KP951056516), Tw, VMUL(LDK(KP587785252), Tt))); + TG = VBYI(VFMA(LDK(KP951056516), Tt, VMUL(LDK(KP587785252), Tw))); + TC = VFNMS(LDK(KP250000000), TB, Ty); + TD = VMUL(LDK(KP559016994), VSUB(Tz, TA)); + TE = VSUB(TC, TD); + TF = VADD(TD, TC); + { + V TN, TO, TP, TQ; + TN = VADD(Tx, TE); + STM2(&(xo[4]), TN, ovs, &(xo[0])); + STN2(&(xo[4]), TN, TM, ovs); + TO = VADD(TG, TF); + STM2(&(xo[12]), TO, ovs, &(xo[0])); + STN2(&(xo[12]), TO, TK, ovs); + TP = VSUB(TE, Tx); + STM2(&(xo[16]), TP, ovs, &(xo[0])); + STN2(&(xo[16]), TP, TL, ovs); + TQ = VSUB(TF, TG); + STM2(&(xo[8]), TQ, ovs, &(xo[0])); + STN2(&(xo[8]), TQ, TH, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n2bv_10"), {36, 6, 6, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_10) (planner *p) { + X(kdft_register) (p, n2bv_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_12.c new file mode 100644 index 000000000..79f222b07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_12.c @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 12 -name n2bv_12 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 48 FP additions, 20 FP multiplications, + * (or, 30 additions, 2 multiplications, 18 fused multiply/add), + * 33 stack variables, 2 constants, and 30 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TJ, TB, Tq, Tp, Tg, Tl, TG, Ty, Tt, Ts; + { + V T1, T6, T4, Tz, T9, TA; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tz = VSUB(T2, T3); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + TA = VSUB(T7, T8); + } + T5 = VADD(T1, T4); + Ta = VADD(T6, T9); + TJ = VSUB(Tz, TA); + TB = VADD(Tz, TA); + Tq = VFNMS(LDK(KP500000000), T9, T6); + Tp = VFNMS(LDK(KP500000000), T4, T1); + } + { + V Tc, Th, Tf, Tw, Tk, Tx; + Tc = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Td, Te, Ti, Tj; + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Tw = VSUB(Td, Te); + Ti = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + Tx = VSUB(Tj, Ti); + } + Tg = VADD(Tc, Tf); + Tl = VADD(Th, Tk); + TG = VADD(Tw, Tx); + Ty = VSUB(Tw, Tx); + Tt = VFNMS(LDK(KP500000000), Tk, Th); + Ts = VFNMS(LDK(KP500000000), Tf, Tc); + } + { + V TN, TO, TP, TQ, TR, TS; + { + V Tb, Tm, Tn, To; + Tb = VSUB(T5, Ta); + Tm = VSUB(Tg, Tl); + TN = VFNMSI(Tm, Tb); + STM2(&(xo[6]), TN, ovs, &(xo[2])); + TO = VFMAI(Tm, Tb); + STM2(&(xo[18]), TO, ovs, &(xo[2])); + Tn = VADD(T5, Ta); + To = VADD(Tg, Tl); + TP = VSUB(Tn, To); + STM2(&(xo[12]), TP, ovs, &(xo[0])); + TQ = VADD(Tn, To); + STM2(&(xo[0]), TQ, ovs, &(xo[0])); + } + { + V TC, TE, Tv, TD, Tr, Tu, TT, TU; + TC = VMUL(LDK(KP866025403), VSUB(Ty, TB)); + TE = VMUL(LDK(KP866025403), VADD(TB, Ty)); + Tr = VADD(Tp, Tq); + Tu = VADD(Ts, Tt); + Tv = VSUB(Tr, Tu); + TD = VADD(Tr, Tu); + TR = VFNMSI(TC, Tv); + STM2(&(xo[20]), TR, ovs, &(xo[0])); + TS = VFMAI(TE, TD); + STM2(&(xo[8]), TS, ovs, &(xo[0])); + TT = VFMAI(TC, Tv); + STM2(&(xo[4]), TT, ovs, &(xo[0])); + STN2(&(xo[4]), TT, TN, ovs); + TU = VFNMSI(TE, TD); + STM2(&(xo[16]), TU, ovs, &(xo[0])); + STN2(&(xo[16]), TU, TO, ovs); + } + { + V TH, TL, TK, TM, TF, TI; + TF = VSUB(Tp, Tq); + TH = VFNMS(LDK(KP866025403), TG, TF); + TL = VFMA(LDK(KP866025403), TG, TF); + TI = VSUB(Ts, Tt); + TK = VFMA(LDK(KP866025403), TJ, TI); + TM = VFNMS(LDK(KP866025403), TJ, TI); + { + V TV, TW, TX, TY; + TV = VFMAI(TK, TH); + STM2(&(xo[2]), TV, ovs, &(xo[2])); + STN2(&(xo[0]), TQ, TV, ovs); + TW = VFNMSI(TM, TL); + STM2(&(xo[14]), TW, ovs, &(xo[2])); + STN2(&(xo[12]), TP, TW, ovs); + TX = VFNMSI(TK, TH); + STM2(&(xo[22]), TX, ovs, &(xo[2])); + STN2(&(xo[20]), TR, TX, ovs); + TY = VFMAI(TM, TL); + STM2(&(xo[10]), TY, ovs, &(xo[2])); + STN2(&(xo[8]), TS, TY, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n2bv_12"), {30, 2, 18, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_12) (planner *p) { + X(kdft_register) (p, n2bv_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 12 -name n2bv_12 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 48 FP additions, 8 FP multiplications, + * (or, 44 additions, 4 multiplications, 4 fused multiply/add), + * 33 stack variables, 2 constants, and 30 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TG, TF, Ty, Tm, Ti, Tp, TJ, TI, Tx, Ts; + { + V T1, T6, T4, Tk, T9, Tl; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tk = VSUB(T2, T3); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Tl = VSUB(T7, T8); + } + T5 = VFNMS(LDK(KP500000000), T4, T1); + Ta = VFNMS(LDK(KP500000000), T9, T6); + TG = VADD(T6, T9); + TF = VADD(T1, T4); + Ty = VADD(Tk, Tl); + Tm = VMUL(LDK(KP866025403), VSUB(Tk, Tl)); + } + { + V Tn, Tq, Te, To, Th, Tr; + Tn = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tq = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Te = VSUB(Tc, Td); + To = VADD(Tc, Td); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + Tr = VADD(Tf, Tg); + } + Ti = VMUL(LDK(KP866025403), VSUB(Te, Th)); + Tp = VFNMS(LDK(KP500000000), To, Tn); + TJ = VADD(Tq, Tr); + TI = VADD(Tn, To); + Tx = VADD(Te, Th); + Ts = VFNMS(LDK(KP500000000), Tr, Tq); + } + { + V TN, TO, TP, TQ, TR, TS; + { + V TH, TK, TL, TM; + TH = VSUB(TF, TG); + TK = VBYI(VSUB(TI, TJ)); + TN = VSUB(TH, TK); + STM2(&(xo[6]), TN, ovs, &(xo[2])); + TO = VADD(TH, TK); + STM2(&(xo[18]), TO, ovs, &(xo[2])); + TL = VADD(TF, TG); + TM = VADD(TI, TJ); + TP = VSUB(TL, TM); + STM2(&(xo[12]), TP, ovs, &(xo[0])); + TQ = VADD(TL, TM); + STM2(&(xo[0]), TQ, ovs, &(xo[0])); + } + { + V Tj, Tv, Tu, Tw, Tb, Tt, TT, TU; + Tb = VSUB(T5, Ta); + Tj = VSUB(Tb, Ti); + Tv = VADD(Tb, Ti); + Tt = VSUB(Tp, Ts); + Tu = VBYI(VADD(Tm, Tt)); + Tw = VBYI(VSUB(Tt, Tm)); + TR = VSUB(Tj, Tu); + STM2(&(xo[22]), TR, ovs, &(xo[2])); + TS = VADD(Tv, Tw); + STM2(&(xo[10]), TS, ovs, &(xo[2])); + TT = VADD(Tj, Tu); + STM2(&(xo[2]), TT, ovs, &(xo[2])); + STN2(&(xo[0]), TQ, TT, ovs); + TU = VSUB(Tv, Tw); + STM2(&(xo[14]), TU, ovs, &(xo[2])); + STN2(&(xo[12]), TP, TU, ovs); + } + { + V Tz, TD, TC, TE, TA, TB; + Tz = VBYI(VMUL(LDK(KP866025403), VSUB(Tx, Ty))); + TD = VBYI(VMUL(LDK(KP866025403), VADD(Ty, Tx))); + TA = VADD(T5, Ta); + TB = VADD(Tp, Ts); + TC = VSUB(TA, TB); + TE = VADD(TA, TB); + { + V TV, TW, TX, TY; + TV = VADD(Tz, TC); + STM2(&(xo[4]), TV, ovs, &(xo[0])); + STN2(&(xo[4]), TV, TN, ovs); + TW = VSUB(TE, TD); + STM2(&(xo[16]), TW, ovs, &(xo[0])); + STN2(&(xo[16]), TW, TO, ovs); + TX = VSUB(TC, Tz); + STM2(&(xo[20]), TX, ovs, &(xo[0])); + STN2(&(xo[20]), TX, TR, ovs); + TY = VADD(TD, TE); + STM2(&(xo[8]), TY, ovs, &(xo[0])); + STN2(&(xo[8]), TY, TS, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n2bv_12"), {44, 4, 4, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_12) (planner *p) { + X(kdft_register) (p, n2bv_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_14.c new file mode 100644 index 000000000..66496a966 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_14.c @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 14 -name n2bv_14 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 74 FP additions, 48 FP multiplications, + * (or, 32 additions, 6 multiplications, 42 fused multiply/add), + * 51 stack variables, 6 constants, and 35 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V T3, TH, Ts, TV, TW, Tt, Tu, TU, Ta, To, Th, Tp, TC, Tx, TK; + V TQ, TN, TR, T14, TZ, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TH = VADD(T1, T2); + { + V T6, TI, T9, TJ, Tn, TP, Tk, TO, Tg, TM, Td, TL; + { + V T4, T5, Ti, Tj; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TI = VADD(T4, T5); + { + V T7, T8, Tl, Tm; + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + TJ = VADD(T7, T8); + Tl = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tm = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tn = VSUB(Tl, Tm); + TP = VADD(Tl, Tm); + } + Ti = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TO = VADD(Ti, Tj); + { + V Te, Tf, Tb, Tc; + Te = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + TM = VADD(Te, Tf); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TL = VADD(Tb, Tc); + } + } + Ts = VSUB(Tk, Tn); + TV = VSUB(TP, TO); + TW = VSUB(TM, TL); + Tt = VSUB(Td, Tg); + Tu = VSUB(T6, T9); + TU = VSUB(TI, TJ); + Ta = VADD(T6, T9); + To = VADD(Tk, Tn); + Th = VADD(Td, Tg); + Tp = VFNMS(LDK(KP356895867), To, Th); + TC = VFNMS(LDK(KP356895867), Th, Ta); + Tx = VFNMS(LDK(KP356895867), Ta, To); + TK = VADD(TI, TJ); + TQ = VADD(TO, TP); + TN = VADD(TL, TM); + TR = VFNMS(LDK(KP356895867), TK, TQ); + T14 = VFNMS(LDK(KP356895867), TQ, TN); + TZ = VFNMS(LDK(KP356895867), TN, TK); + } + { + V T19, T1a, T1b, T1e, T1c, T1g, T1h; + T19 = VADD(T3, VADD(Ta, VADD(Th, To))); + STM2(&(xo[14]), T19, ovs, &(xo[2])); + T1a = VADD(TH, VADD(TK, VADD(TN, TQ))); + STM2(&(xo[0]), T1a, ovs, &(xo[0])); + { + V Tr, Tw, Tq, Tv; + Tq = VFNMS(LDK(KP692021471), Tp, Ta); + Tr = VFNMS(LDK(KP900968867), Tq, T3); + Tv = VFNMS(LDK(KP554958132), Tu, Tt); + Tw = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tv, Ts)); + T1b = VFMAI(Tw, Tr); + STM2(&(xo[6]), T1b, ovs, &(xo[2])); + T1c = VFNMSI(Tw, Tr); + STM2(&(xo[22]), T1c, ovs, &(xo[2])); + } + { + V T16, T18, T15, T17, T1d; + T15 = VFNMS(LDK(KP692021471), T14, TK); + T16 = VFNMS(LDK(KP900968867), T15, TH); + T17 = VFMA(LDK(KP554958132), TU, TW); + T18 = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), T17, TV)); + T1d = VFNMSI(T18, T16); + STM2(&(xo[20]), T1d, ovs, &(xo[0])); + STN2(&(xo[20]), T1d, T1c, ovs); + T1e = VFMAI(T18, T16); + STM2(&(xo[8]), T1e, ovs, &(xo[0])); + } + { + V Tz, TB, Ty, TA, T1f; + Ty = VFNMS(LDK(KP692021471), Tx, Th); + Tz = VFNMS(LDK(KP900968867), Ty, T3); + TA = VFMA(LDK(KP554958132), Tt, Ts); + TB = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), TA, Tu)); + T1f = VFNMSI(TB, Tz); + STM2(&(xo[10]), T1f, ovs, &(xo[2])); + STN2(&(xo[8]), T1e, T1f, ovs); + T1g = VFMAI(TB, Tz); + STM2(&(xo[18]), T1g, ovs, &(xo[2])); + } + { + V TT, TY, TS, TX, T1i; + TS = VFNMS(LDK(KP692021471), TR, TN); + TT = VFNMS(LDK(KP900968867), TS, TH); + TX = VFMA(LDK(KP554958132), TW, TV); + TY = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), TX, TU)); + T1h = VFNMSI(TY, TT); + STM2(&(xo[24]), T1h, ovs, &(xo[0])); + T1i = VFMAI(TY, TT); + STM2(&(xo[4]), T1i, ovs, &(xo[0])); + STN2(&(xo[4]), T1i, T1b, ovs); + } + { + V T11, T13, T10, T12, T1j, T1k; + T10 = VFNMS(LDK(KP692021471), TZ, TQ); + T11 = VFNMS(LDK(KP900968867), T10, TH); + T12 = VFNMS(LDK(KP554958132), TV, TU); + T13 = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), T12, TW)); + T1j = VFNMSI(T13, T11); + STM2(&(xo[16]), T1j, ovs, &(xo[0])); + STN2(&(xo[16]), T1j, T1g, ovs); + T1k = VFMAI(T13, T11); + STM2(&(xo[12]), T1k, ovs, &(xo[0])); + STN2(&(xo[12]), T1k, T19, ovs); + } + { + V TE, TG, TD, TF, T1l, T1m; + TD = VFNMS(LDK(KP692021471), TC, To); + TE = VFNMS(LDK(KP900968867), TD, T3); + TF = VFMA(LDK(KP554958132), Ts, Tu); + TG = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), TF, Tt)); + T1l = VFMAI(TG, TE); + STM2(&(xo[2]), T1l, ovs, &(xo[2])); + STN2(&(xo[0]), T1a, T1l, ovs); + T1m = VFNMSI(TG, TE); + STM2(&(xo[26]), T1m, ovs, &(xo[2])); + STN2(&(xo[24]), T1h, T1m, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n2bv_14"), {32, 6, 42, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_14) (planner *p) { + X(kdft_register) (p, n2bv_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 14 -name n2bv_14 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 74 FP additions, 36 FP multiplications, + * (or, 50 additions, 12 multiplications, 24 fused multiply/add), + * 41 stack variables, 6 constants, and 35 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V Tp, Ty, Tl, TL, Tq, TE, T7, TJ, Ts, TB, Te, TK, Tr, TH, Tn; + V To; + Tn = LD(&(xi[0]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tp = VSUB(Tn, To); + Ty = VADD(Tn, To); + { + V Th, TC, Tk, TD; + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + TC = VADD(Tf, Tg); + Ti = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TD = VADD(Ti, Tj); + } + Tl = VSUB(Th, Tk); + TL = VSUB(TD, TC); + Tq = VADD(Th, Tk); + TE = VADD(TC, TD); + } + { + V T3, Tz, T6, TA; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tz = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TA = VADD(T4, T5); + } + T7 = VSUB(T3, T6); + TJ = VSUB(Tz, TA); + Ts = VADD(T3, T6); + TB = VADD(Tz, TA); + } + { + V Ta, TF, Td, TG; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + TF = VADD(T8, T9); + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TG = VADD(Tb, Tc); + } + Te = VSUB(Ta, Td); + TK = VSUB(TG, TF); + Tr = VADD(Ta, Td); + TH = VADD(TF, TG); + } + { + V TR, TS, TU, TV; + TR = VADD(Tp, VADD(Ts, VADD(Tq, Tr))); + STM2(&(xo[14]), TR, ovs, &(xo[2])); + TS = VADD(Ty, VADD(TB, VADD(TE, TH))); + STM2(&(xo[0]), TS, ovs, &(xo[0])); + { + V TT, Tm, Tt, TQ, TP, TW; + Tm = VBYI(VFMA(LDK(KP433883739), T7, VFNMS(LDK(KP781831482), Tl, VMUL(LDK(KP974927912), Te)))); + Tt = VFMA(LDK(KP623489801), Tq, VFNMS(LDK(KP222520933), Tr, VFNMS(LDK(KP900968867), Ts, Tp))); + TT = VADD(Tm, Tt); + STM2(&(xo[6]), TT, ovs, &(xo[2])); + TU = VSUB(Tt, Tm); + STM2(&(xo[22]), TU, ovs, &(xo[2])); + TQ = VBYI(VFMA(LDK(KP974927912), TJ, VFMA(LDK(KP433883739), TL, VMUL(LDK(KP781831482), TK)))); + TP = VFMA(LDK(KP623489801), TH, VFNMS(LDK(KP900968867), TE, VFNMS(LDK(KP222520933), TB, Ty))); + TV = VSUB(TP, TQ); + STM2(&(xo[24]), TV, ovs, &(xo[0])); + TW = VADD(TP, TQ); + STM2(&(xo[4]), TW, ovs, &(xo[0])); + STN2(&(xo[4]), TW, TT, ovs); + } + { + V T10, TM, TI, TZ; + { + V Tu, Tv, TX, TY; + Tu = VBYI(VFMA(LDK(KP781831482), T7, VFMA(LDK(KP974927912), Tl, VMUL(LDK(KP433883739), Te)))); + Tv = VFMA(LDK(KP623489801), Ts, VFNMS(LDK(KP900968867), Tr, VFNMS(LDK(KP222520933), Tq, Tp))); + TX = VADD(Tu, Tv); + STM2(&(xo[2]), TX, ovs, &(xo[2])); + STN2(&(xo[0]), TS, TX, ovs); + TY = VSUB(Tv, Tu); + STM2(&(xo[26]), TY, ovs, &(xo[2])); + STN2(&(xo[24]), TV, TY, ovs); + } + TM = VBYI(VFNMS(LDK(KP433883739), TK, VFNMS(LDK(KP974927912), TL, VMUL(LDK(KP781831482), TJ)))); + TI = VFMA(LDK(KP623489801), TB, VFNMS(LDK(KP900968867), TH, VFNMS(LDK(KP222520933), TE, Ty))); + TZ = VSUB(TI, TM); + STM2(&(xo[12]), TZ, ovs, &(xo[0])); + STN2(&(xo[12]), TZ, TR, ovs); + T10 = VADD(TI, TM); + STM2(&(xo[16]), T10, ovs, &(xo[0])); + { + V T11, TO, TN, T12; + TO = VBYI(VFMA(LDK(KP433883739), TJ, VFNMS(LDK(KP974927912), TK, VMUL(LDK(KP781831482), TL)))); + TN = VFMA(LDK(KP623489801), TE, VFNMS(LDK(KP222520933), TH, VFNMS(LDK(KP900968867), TB, Ty))); + T11 = VSUB(TN, TO); + STM2(&(xo[8]), T11, ovs, &(xo[0])); + T12 = VADD(TN, TO); + STM2(&(xo[20]), T12, ovs, &(xo[0])); + STN2(&(xo[20]), T12, TU, ovs); + { + V Tx, Tw, T13, T14; + Tx = VBYI(VFNMS(LDK(KP781831482), Te, VFNMS(LDK(KP433883739), Tl, VMUL(LDK(KP974927912), T7)))); + Tw = VFMA(LDK(KP623489801), Tr, VFNMS(LDK(KP900968867), Tq, VFNMS(LDK(KP222520933), Ts, Tp))); + T13 = VSUB(Tw, Tx); + STM2(&(xo[10]), T13, ovs, &(xo[2])); + STN2(&(xo[8]), T11, T13, ovs); + T14 = VADD(Tx, Tw); + STM2(&(xo[18]), T14, ovs, &(xo[2])); + STN2(&(xo[16]), T10, T14, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n2bv_14"), {50, 12, 24, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_14) (planner *p) { + X(kdft_register) (p, n2bv_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_16.c new file mode 100644 index 000000000..3ab329394 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_16.c @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 16 -name n2bv_16 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 72 FP additions, 34 FP multiplications, + * (or, 38 additions, 0 multiplications, 34 fused multiply/add), + * 38 stack variables, 3 constants, and 40 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V T7, TU, Tz, TH, Tu, TV, TA, TK, Te, TX, TC, TO, Tl, TY, TD; + V TR; + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T7 = VSUB(T3, T6); + TU = VSUB(T4, T5); + Tz = VADD(T3, T6); + TH = VSUB(T1, T2); + } + { + V Tq, TI, Tt, TJ; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + TI = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + TJ = VSUB(Tr, Ts); + } + Tu = VSUB(Tq, Tt); + TV = VSUB(TI, TJ); + TA = VADD(Tq, Tt); + TK = VADD(TI, TJ); + } + { + V Ta, TM, Td, TN; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VADD(T8, T9); + TM = VSUB(T8, T9); + Tb = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + TN = VSUB(Tb, Tc); + } + Te = VSUB(Ta, Td); + TX = VFMA(LDK(KP414213562), TM, TN); + TC = VADD(Ta, Td); + TO = VFNMS(LDK(KP414213562), TN, TM); + } + { + V Th, TP, Tk, TQ; + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Th = VADD(Tf, Tg); + TP = VSUB(Tf, Tg); + Ti = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + TQ = VSUB(Tj, Ti); + } + Tl = VSUB(Th, Tk); + TY = VFMA(LDK(KP414213562), TP, TQ); + TD = VADD(Th, Tk); + TR = VFNMS(LDK(KP414213562), TQ, TP); + } + { + V T1b, T1c, T1d, T1e; + { + V TB, TE, TF, TG; + TB = VSUB(Tz, TA); + TE = VSUB(TC, TD); + T1b = VFNMSI(TE, TB); + STM2(&(xo[24]), T1b, ovs, &(xo[0])); + T1c = VFMAI(TE, TB); + STM2(&(xo[8]), T1c, ovs, &(xo[0])); + TF = VADD(Tz, TA); + TG = VADD(TC, TD); + T1d = VSUB(TF, TG); + STM2(&(xo[16]), T1d, ovs, &(xo[0])); + T1e = VADD(TF, TG); + STM2(&(xo[0]), T1e, ovs, &(xo[0])); + } + { + V T1f, T1g, T1h, T1i; + { + V Tn, Tx, Tw, Ty, Tm, Tv; + Tm = VADD(Te, Tl); + Tn = VFNMS(LDK(KP707106781), Tm, T7); + Tx = VFMA(LDK(KP707106781), Tm, T7); + Tv = VSUB(Te, Tl); + Tw = VFNMS(LDK(KP707106781), Tv, Tu); + Ty = VFMA(LDK(KP707106781), Tv, Tu); + T1f = VFNMSI(Tw, Tn); + STM2(&(xo[12]), T1f, ovs, &(xo[0])); + T1g = VFNMSI(Ty, Tx); + STM2(&(xo[28]), T1g, ovs, &(xo[0])); + T1h = VFMAI(Tw, Tn); + STM2(&(xo[20]), T1h, ovs, &(xo[0])); + T1i = VFMAI(Ty, Tx); + STM2(&(xo[4]), T1i, ovs, &(xo[0])); + } + { + V TT, T11, T10, T12; + { + V TL, TS, TW, TZ; + TL = VFMA(LDK(KP707106781), TK, TH); + TS = VADD(TO, TR); + TT = VFNMS(LDK(KP923879532), TS, TL); + T11 = VFMA(LDK(KP923879532), TS, TL); + TW = VFMA(LDK(KP707106781), TV, TU); + TZ = VSUB(TX, TY); + T10 = VFNMS(LDK(KP923879532), TZ, TW); + T12 = VFMA(LDK(KP923879532), TZ, TW); + } + { + V T1j, T1k, T1l, T1m; + T1j = VFNMSI(T10, TT); + STM2(&(xo[14]), T1j, ovs, &(xo[2])); + STN2(&(xo[12]), T1f, T1j, ovs); + T1k = VFMAI(T12, T11); + STM2(&(xo[2]), T1k, ovs, &(xo[2])); + STN2(&(xo[0]), T1e, T1k, ovs); + T1l = VFMAI(T10, TT); + STM2(&(xo[18]), T1l, ovs, &(xo[2])); + STN2(&(xo[16]), T1d, T1l, ovs); + T1m = VFNMSI(T12, T11); + STM2(&(xo[30]), T1m, ovs, &(xo[2])); + STN2(&(xo[28]), T1g, T1m, ovs); + } + } + { + V T15, T19, T18, T1a; + { + V T13, T14, T16, T17; + T13 = VFNMS(LDK(KP707106781), TK, TH); + T14 = VADD(TX, TY); + T15 = VFNMS(LDK(KP923879532), T14, T13); + T19 = VFMA(LDK(KP923879532), T14, T13); + T16 = VFNMS(LDK(KP707106781), TV, TU); + T17 = VSUB(TO, TR); + T18 = VFMA(LDK(KP923879532), T17, T16); + T1a = VFNMS(LDK(KP923879532), T17, T16); + } + { + V T1n, T1o, T1p, T1q; + T1n = VFMAI(T18, T15); + STM2(&(xo[10]), T1n, ovs, &(xo[2])); + STN2(&(xo[8]), T1c, T1n, ovs); + T1o = VFMAI(T1a, T19); + STM2(&(xo[26]), T1o, ovs, &(xo[2])); + STN2(&(xo[24]), T1b, T1o, ovs); + T1p = VFNMSI(T18, T15); + STM2(&(xo[22]), T1p, ovs, &(xo[2])); + STN2(&(xo[20]), T1h, T1p, ovs); + T1q = VFNMSI(T1a, T19); + STM2(&(xo[6]), T1q, ovs, &(xo[2])); + STN2(&(xo[4]), T1i, T1q, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n2bv_16"), {38, 0, 34, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_16) (planner *p) { + X(kdft_register) (p, n2bv_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 16 -name n2bv_16 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 72 FP additions, 12 FP multiplications, + * (or, 68 additions, 8 multiplications, 4 fused multiply/add), + * 38 stack variables, 3 constants, and 40 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V Tp, T13, Tu, TY, Tm, T14, Tv, TU, T7, T16, Tx, TN, Te, T17, Ty; + V TQ; + { + V Tn, To, TX, Ts, Tt, TW; + Tn = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TX = VADD(Tn, To); + Ts = LD(&(xi[0]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TW = VADD(Ts, Tt); + Tp = VSUB(Tn, To); + T13 = VADD(TW, TX); + Tu = VSUB(Ts, Tt); + TY = VSUB(TW, TX); + } + { + V Ti, TS, Tl, TT; + { + V Tg, Th, Tj, Tk; + Tg = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Ti = VSUB(Tg, Th); + TS = VADD(Tg, Th); + Tj = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + TT = VADD(Tj, Tk); + } + Tm = VMUL(LDK(KP707106781), VSUB(Ti, Tl)); + T14 = VADD(TS, TT); + Tv = VMUL(LDK(KP707106781), VADD(Ti, Tl)); + TU = VSUB(TS, TT); + } + { + V T3, TL, T6, TM; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TL = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TM = VADD(T4, T5); + } + T7 = VFNMS(LDK(KP382683432), T6, VMUL(LDK(KP923879532), T3)); + T16 = VADD(TL, TM); + Tx = VFMA(LDK(KP382683432), T3, VMUL(LDK(KP923879532), T6)); + TN = VSUB(TL, TM); + } + { + V Ta, TO, Td, TP; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + TO = VADD(T8, T9); + Tb = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TP = VADD(Tb, Tc); + } + Te = VFMA(LDK(KP923879532), Ta, VMUL(LDK(KP382683432), Td)); + T17 = VADD(TO, TP); + Ty = VFNMS(LDK(KP382683432), Ta, VMUL(LDK(KP923879532), Td)); + TQ = VSUB(TO, TP); + } + { + V T1b, T1c, T1d, T1e; + { + V T15, T18, T19, T1a; + T15 = VSUB(T13, T14); + T18 = VBYI(VSUB(T16, T17)); + T1b = VSUB(T15, T18); + STM2(&(xo[24]), T1b, ovs, &(xo[0])); + T1c = VADD(T15, T18); + STM2(&(xo[8]), T1c, ovs, &(xo[0])); + T19 = VADD(T13, T14); + T1a = VADD(T16, T17); + T1d = VSUB(T19, T1a); + STM2(&(xo[16]), T1d, ovs, &(xo[0])); + T1e = VADD(T19, T1a); + STM2(&(xo[0]), T1e, ovs, &(xo[0])); + } + { + V T1f, T1g, T1h, T1i; + { + V TV, T11, T10, T12, TR, TZ; + TR = VMUL(LDK(KP707106781), VSUB(TN, TQ)); + TV = VBYI(VSUB(TR, TU)); + T11 = VBYI(VADD(TU, TR)); + TZ = VMUL(LDK(KP707106781), VADD(TN, TQ)); + T10 = VSUB(TY, TZ); + T12 = VADD(TY, TZ); + T1f = VADD(TV, T10); + STM2(&(xo[12]), T1f, ovs, &(xo[0])); + T1g = VSUB(T12, T11); + STM2(&(xo[28]), T1g, ovs, &(xo[0])); + T1h = VSUB(T10, TV); + STM2(&(xo[20]), T1h, ovs, &(xo[0])); + T1i = VADD(T11, T12); + STM2(&(xo[4]), T1i, ovs, &(xo[0])); + } + { + V Tr, TB, TA, TC; + { + V Tf, Tq, Tw, Tz; + Tf = VSUB(T7, Te); + Tq = VSUB(Tm, Tp); + Tr = VBYI(VSUB(Tf, Tq)); + TB = VBYI(VADD(Tq, Tf)); + Tw = VSUB(Tu, Tv); + Tz = VSUB(Tx, Ty); + TA = VSUB(Tw, Tz); + TC = VADD(Tw, Tz); + } + { + V T1j, T1k, T1l, T1m; + T1j = VADD(Tr, TA); + STM2(&(xo[10]), T1j, ovs, &(xo[2])); + STN2(&(xo[8]), T1c, T1j, ovs); + T1k = VSUB(TC, TB); + STM2(&(xo[26]), T1k, ovs, &(xo[2])); + STN2(&(xo[24]), T1b, T1k, ovs); + T1l = VSUB(TA, Tr); + STM2(&(xo[22]), T1l, ovs, &(xo[2])); + STN2(&(xo[20]), T1h, T1l, ovs); + T1m = VADD(TB, TC); + STM2(&(xo[6]), T1m, ovs, &(xo[2])); + STN2(&(xo[4]), T1i, T1m, ovs); + } + } + { + V TF, TJ, TI, TK; + { + V TD, TE, TG, TH; + TD = VADD(Tu, Tv); + TE = VADD(T7, Te); + TF = VADD(TD, TE); + TJ = VSUB(TD, TE); + TG = VADD(Tp, Tm); + TH = VADD(Tx, Ty); + TI = VBYI(VADD(TG, TH)); + TK = VBYI(VSUB(TH, TG)); + } + { + V T1n, T1o, T1p, T1q; + T1n = VSUB(TF, TI); + STM2(&(xo[30]), T1n, ovs, &(xo[2])); + STN2(&(xo[28]), T1g, T1n, ovs); + T1o = VADD(TJ, TK); + STM2(&(xo[14]), T1o, ovs, &(xo[2])); + STN2(&(xo[12]), T1f, T1o, ovs); + T1p = VADD(TF, TI); + STM2(&(xo[2]), T1p, ovs, &(xo[2])); + STN2(&(xo[0]), T1e, T1p, ovs); + T1q = VSUB(TJ, TK); + STM2(&(xo[18]), T1q, ovs, &(xo[2])); + STN2(&(xo[16]), T1d, T1q, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n2bv_16"), {68, 8, 4, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_16) (planner *p) { + X(kdft_register) (p, n2bv_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_2.c new file mode 100644 index 000000000..a7a341279 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 2 -name n2bv_2 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 7 stack variables, 0 constants, and 5 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + STM2(&(xo[2]), T3, ovs, &(xo[2])); + T4 = VADD(T1, T2); + STM2(&(xo[0]), T4, ovs, &(xo[0])); + STN2(&(xo[0]), T4, T3, ovs); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n2bv_2"), {2, 0, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_2) (planner *p) { + X(kdft_register) (p, n2bv_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 2 -name n2bv_2 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 7 stack variables, 0 constants, and 5 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + STM2(&(xo[2]), T3, ovs, &(xo[2])); + T4 = VADD(T1, T2); + STM2(&(xo[0]), T4, ovs, &(xo[0])); + STN2(&(xo[0]), T4, T3, ovs); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n2bv_2"), {2, 0, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_2) (planner *p) { + X(kdft_register) (p, n2bv_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_20.c new file mode 100644 index 000000000..ca4a433d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_20.c @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 20 -name n2bv_20 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 104 FP additions, 50 FP multiplications, + * (or, 58 additions, 4 multiplications, 46 fused multiply/add), + * 57 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1r, TE, T13, Ts, TL, TM, Tz, T16, T19, T1a, T1v, T1w, T1x, T1s; + V T1t, T1u, T1d, T1g, T1h, Ti, Tk, TH, TJ; + { + V T1, T2, T11, TC, TD, T12; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T11 = VADD(T1, T2); + TC = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + TD = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T12 = VADD(TC, TD); + T3 = VSUB(T1, T2); + T1r = VADD(T11, T12); + TE = VSUB(TC, TD); + T13 = VSUB(T11, T12); + } + { + V T6, T14, Tv, T1c, Ty, T1f, T9, T17, Td, T1b, To, T15, Tr, T18, Tg; + V T1e; + { + V T4, T5, Tt, Tu; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T14 = VADD(T4, T5); + Tt = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tu = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tv = VSUB(Tt, Tu); + T1c = VADD(Tt, Tu); + } + { + V Tw, Tx, T7, T8; + Tw = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tx = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Ty = VSUB(Tw, Tx); + T1f = VADD(Tw, Tx); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T17 = VADD(T7, T8); + } + { + V Tb, Tc, Tm, Tn; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T1b = VADD(Tb, Tc); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + To = VSUB(Tm, Tn); + T15 = VADD(Tm, Tn); + } + { + V Tp, Tq, Te, Tf; + Tp = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tq = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tr = VSUB(Tp, Tq); + T18 = VADD(Tp, Tq); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T1e = VADD(Te, Tf); + } + Ts = VSUB(To, Tr); + TL = VSUB(T6, T9); + TM = VSUB(Td, Tg); + Tz = VSUB(Tv, Ty); + T16 = VSUB(T14, T15); + T19 = VSUB(T17, T18); + T1a = VADD(T16, T19); + T1v = VADD(T1b, T1c); + T1w = VADD(T1e, T1f); + T1x = VADD(T1v, T1w); + T1s = VADD(T14, T15); + T1t = VADD(T17, T18); + T1u = VADD(T1s, T1t); + T1d = VSUB(T1b, T1c); + T1g = VSUB(T1e, T1f); + T1h = VADD(T1d, T1g); + { + V Ta, Th, TF, TG; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + Tk = VSUB(Ta, Th); + TF = VADD(To, Tr); + TG = VADD(Tv, Ty); + TH = VADD(TF, TG); + TJ = VSUB(TF, TG); + } + } + { + V T1H, T1J, T1K, T1L, T1N, T1I, TZ, T10; + TZ = VADD(T3, Ti); + T10 = VADD(TE, TH); + T1H = VFNMSI(T10, TZ); + STM2(&(xo[30]), T1H, ovs, &(xo[2])); + T1I = VFMAI(T10, TZ); + STM2(&(xo[10]), T1I, ovs, &(xo[2])); + { + V T1A, T1y, T1z, T1E, T1G, T1C, T1D, T1F, T1B, T1M; + T1A = VSUB(T1u, T1x); + T1y = VADD(T1u, T1x); + T1z = VFNMS(LDK(KP250000000), T1y, T1r); + T1C = VSUB(T1s, T1t); + T1D = VSUB(T1v, T1w); + T1E = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1D, T1C)); + T1G = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1C, T1D)); + T1J = VADD(T1r, T1y); + STM2(&(xo[0]), T1J, ovs, &(xo[0])); + T1F = VFNMS(LDK(KP559016994), T1A, T1z); + T1K = VFMAI(T1G, T1F); + STM2(&(xo[16]), T1K, ovs, &(xo[0])); + T1L = VFNMSI(T1G, T1F); + STM2(&(xo[24]), T1L, ovs, &(xo[0])); + T1B = VFMA(LDK(KP559016994), T1A, T1z); + T1M = VFNMSI(T1E, T1B); + STM2(&(xo[8]), T1M, ovs, &(xo[0])); + STN2(&(xo[8]), T1M, T1I, ovs); + T1N = VFMAI(T1E, T1B); + STM2(&(xo[32]), T1N, ovs, &(xo[0])); + } + { + V T1O, T1P, T1R, T1S; + { + V T1k, T1i, T1j, T1o, T1q, T1m, T1n, T1p, T1Q, T1l; + T1k = VSUB(T1a, T1h); + T1i = VADD(T1a, T1h); + T1j = VFNMS(LDK(KP250000000), T1i, T13); + T1m = VSUB(T1d, T1g); + T1n = VSUB(T16, T19); + T1o = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1n, T1m)); + T1q = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1m, T1n)); + T1O = VADD(T13, T1i); + STM2(&(xo[20]), T1O, ovs, &(xo[0])); + T1p = VFMA(LDK(KP559016994), T1k, T1j); + T1P = VFMAI(T1q, T1p); + STM2(&(xo[12]), T1P, ovs, &(xo[0])); + T1Q = VFNMSI(T1q, T1p); + STM2(&(xo[28]), T1Q, ovs, &(xo[0])); + STN2(&(xo[28]), T1Q, T1H, ovs); + T1l = VFNMS(LDK(KP559016994), T1k, T1j); + T1R = VFNMSI(T1o, T1l); + STM2(&(xo[4]), T1R, ovs, &(xo[0])); + T1S = VFMAI(T1o, T1l); + STM2(&(xo[36]), T1S, ovs, &(xo[0])); + } + { + V TA, TN, TV, TS, TK, TU, Tl, TR, TI, Tj; + TA = VFMA(LDK(KP618033988), Tz, Ts); + TN = VFMA(LDK(KP618033988), TM, TL); + TV = VFNMS(LDK(KP618033988), TL, TM); + TS = VFNMS(LDK(KP618033988), Ts, Tz); + TI = VFNMS(LDK(KP250000000), TH, TE); + TK = VFMA(LDK(KP559016994), TJ, TI); + TU = VFNMS(LDK(KP559016994), TJ, TI); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tl = VFMA(LDK(KP559016994), Tk, Tj); + TR = VFNMS(LDK(KP559016994), Tk, Tj); + { + V TB, TO, T1T, T1U; + TB = VFNMS(LDK(KP951056516), TA, Tl); + TO = VFMA(LDK(KP951056516), TN, TK); + T1T = VFNMSI(TO, TB); + STM2(&(xo[38]), T1T, ovs, &(xo[2])); + STN2(&(xo[36]), T1S, T1T, ovs); + T1U = VFMAI(TO, TB); + STM2(&(xo[2]), T1U, ovs, &(xo[2])); + STN2(&(xo[0]), T1J, T1U, ovs); + } + { + V TX, TY, T1V, T1W; + TX = VFNMS(LDK(KP951056516), TS, TR); + TY = VFMA(LDK(KP951056516), TV, TU); + T1V = VFNMSI(TY, TX); + STM2(&(xo[14]), T1V, ovs, &(xo[2])); + STN2(&(xo[12]), T1P, T1V, ovs); + T1W = VFMAI(TY, TX); + STM2(&(xo[26]), T1W, ovs, &(xo[2])); + STN2(&(xo[24]), T1L, T1W, ovs); + } + { + V TP, TQ, T1X, T1Y; + TP = VFMA(LDK(KP951056516), TA, Tl); + TQ = VFNMS(LDK(KP951056516), TN, TK); + T1X = VFNMSI(TQ, TP); + STM2(&(xo[22]), T1X, ovs, &(xo[2])); + STN2(&(xo[20]), T1O, T1X, ovs); + T1Y = VFMAI(TQ, TP); + STM2(&(xo[18]), T1Y, ovs, &(xo[2])); + STN2(&(xo[16]), T1K, T1Y, ovs); + } + { + V TT, TW, T1Z, T20; + TT = VFMA(LDK(KP951056516), TS, TR); + TW = VFNMS(LDK(KP951056516), TV, TU); + T1Z = VFNMSI(TW, TT); + STM2(&(xo[6]), T1Z, ovs, &(xo[2])); + STN2(&(xo[4]), T1R, T1Z, ovs); + T20 = VFMAI(TW, TT); + STM2(&(xo[34]), T20, ovs, &(xo[2])); + STN2(&(xo[32]), T1N, T20, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n2bv_20"), {58, 4, 46, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_20) (planner *p) { + X(kdft_register) (p, n2bv_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 20 -name n2bv_20 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 104 FP additions, 24 FP multiplications, + * (or, 92 additions, 12 multiplications, 12 fused multiply/add), + * 57 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1y, TH, T1i, Ts, TL, TM, Tz, T13, T16, T1j, T1u, T1v, T1w, T1r; + V T1s, T1t, T1a, T1d, T1k, Ti, Tk, TE, TI; + { + V T1, T2, T1g, TF, TG, T1h; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1g = VADD(T1, T2); + TF = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + TG = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1h = VADD(TF, TG); + T3 = VSUB(T1, T2); + T1y = VADD(T1g, T1h); + TH = VSUB(TF, TG); + T1i = VSUB(T1g, T1h); + } + { + V T6, T11, Tv, T19, Ty, T1c, T9, T14, Td, T18, To, T12, Tr, T15, Tg; + V T1b; + { + V T4, T5, Tt, Tu; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T11 = VADD(T4, T5); + Tt = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tu = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tv = VSUB(Tt, Tu); + T19 = VADD(Tt, Tu); + } + { + V Tw, Tx, T7, T8; + Tw = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tx = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Ty = VSUB(Tw, Tx); + T1c = VADD(Tw, Tx); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T14 = VADD(T7, T8); + } + { + V Tb, Tc, Tm, Tn; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T18 = VADD(Tb, Tc); + Tm = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + To = VSUB(Tm, Tn); + T12 = VADD(Tm, Tn); + } + { + V Tp, Tq, Te, Tf; + Tp = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tq = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tr = VSUB(Tp, Tq); + T15 = VADD(Tp, Tq); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T1b = VADD(Te, Tf); + } + Ts = VSUB(To, Tr); + TL = VSUB(T6, T9); + TM = VSUB(Td, Tg); + Tz = VSUB(Tv, Ty); + T13 = VSUB(T11, T12); + T16 = VSUB(T14, T15); + T1j = VADD(T13, T16); + T1u = VADD(T18, T19); + T1v = VADD(T1b, T1c); + T1w = VADD(T1u, T1v); + T1r = VADD(T11, T12); + T1s = VADD(T14, T15); + T1t = VADD(T1r, T1s); + T1a = VSUB(T18, T19); + T1d = VSUB(T1b, T1c); + T1k = VADD(T1a, T1d); + { + V Ta, Th, TC, TD; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + Tk = VMUL(LDK(KP559016994), VSUB(Ta, Th)); + TC = VADD(To, Tr); + TD = VADD(Tv, Ty); + TE = VMUL(LDK(KP559016994), VSUB(TC, TD)); + TI = VADD(TC, TD); + } + } + { + V T1H, T1J, T1K, T1L, T1N, T1I, TZ, T10; + TZ = VADD(T3, Ti); + T10 = VBYI(VADD(TH, TI)); + T1H = VSUB(TZ, T10); + STM2(&(xo[30]), T1H, ovs, &(xo[2])); + T1I = VADD(TZ, T10); + STM2(&(xo[10]), T1I, ovs, &(xo[2])); + { + V T1x, T1z, T1A, T1E, T1G, T1C, T1D, T1F, T1B, T1M; + T1x = VMUL(LDK(KP559016994), VSUB(T1t, T1w)); + T1z = VADD(T1t, T1w); + T1A = VFNMS(LDK(KP250000000), T1z, T1y); + T1C = VSUB(T1r, T1s); + T1D = VSUB(T1u, T1v); + T1E = VBYI(VFMA(LDK(KP951056516), T1C, VMUL(LDK(KP587785252), T1D))); + T1G = VBYI(VFNMS(LDK(KP951056516), T1D, VMUL(LDK(KP587785252), T1C))); + T1J = VADD(T1y, T1z); + STM2(&(xo[0]), T1J, ovs, &(xo[0])); + T1F = VSUB(T1A, T1x); + T1K = VSUB(T1F, T1G); + STM2(&(xo[16]), T1K, ovs, &(xo[0])); + T1L = VADD(T1G, T1F); + STM2(&(xo[24]), T1L, ovs, &(xo[0])); + T1B = VADD(T1x, T1A); + T1M = VSUB(T1B, T1E); + STM2(&(xo[8]), T1M, ovs, &(xo[0])); + STN2(&(xo[8]), T1M, T1I, ovs); + T1N = VADD(T1E, T1B); + STM2(&(xo[32]), T1N, ovs, &(xo[0])); + } + { + V T1O, T1P, T1R, T1S; + { + V T1n, T1l, T1m, T1f, T1p, T17, T1e, T1q, T1Q, T1o; + T1n = VMUL(LDK(KP559016994), VSUB(T1j, T1k)); + T1l = VADD(T1j, T1k); + T1m = VFNMS(LDK(KP250000000), T1l, T1i); + T17 = VSUB(T13, T16); + T1e = VSUB(T1a, T1d); + T1f = VBYI(VFNMS(LDK(KP951056516), T1e, VMUL(LDK(KP587785252), T17))); + T1p = VBYI(VFMA(LDK(KP951056516), T17, VMUL(LDK(KP587785252), T1e))); + T1O = VADD(T1i, T1l); + STM2(&(xo[20]), T1O, ovs, &(xo[0])); + T1q = VADD(T1n, T1m); + T1P = VADD(T1p, T1q); + STM2(&(xo[12]), T1P, ovs, &(xo[0])); + T1Q = VSUB(T1q, T1p); + STM2(&(xo[28]), T1Q, ovs, &(xo[0])); + STN2(&(xo[28]), T1Q, T1H, ovs); + T1o = VSUB(T1m, T1n); + T1R = VADD(T1f, T1o); + STM2(&(xo[4]), T1R, ovs, &(xo[0])); + T1S = VSUB(T1o, T1f); + STM2(&(xo[36]), T1S, ovs, &(xo[0])); + } + { + V TA, TN, TU, TS, TK, TV, Tl, TR, TJ, Tj; + TA = VFNMS(LDK(KP951056516), Tz, VMUL(LDK(KP587785252), Ts)); + TN = VFNMS(LDK(KP951056516), TM, VMUL(LDK(KP587785252), TL)); + TU = VFMA(LDK(KP951056516), TL, VMUL(LDK(KP587785252), TM)); + TS = VFMA(LDK(KP951056516), Ts, VMUL(LDK(KP587785252), Tz)); + TJ = VFNMS(LDK(KP250000000), TI, TH); + TK = VSUB(TE, TJ); + TV = VADD(TE, TJ); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tl = VSUB(Tj, Tk); + TR = VADD(Tk, Tj); + { + V TB, TO, T1T, T1U; + TB = VSUB(Tl, TA); + TO = VBYI(VSUB(TK, TN)); + T1T = VSUB(TB, TO); + STM2(&(xo[34]), T1T, ovs, &(xo[2])); + STN2(&(xo[32]), T1N, T1T, ovs); + T1U = VADD(TB, TO); + STM2(&(xo[6]), T1U, ovs, &(xo[2])); + STN2(&(xo[4]), T1R, T1U, ovs); + } + { + V TX, TY, T1V, T1W; + TX = VADD(TR, TS); + TY = VBYI(VSUB(TV, TU)); + T1V = VSUB(TX, TY); + STM2(&(xo[22]), T1V, ovs, &(xo[2])); + STN2(&(xo[20]), T1O, T1V, ovs); + T1W = VADD(TX, TY); + STM2(&(xo[18]), T1W, ovs, &(xo[2])); + STN2(&(xo[16]), T1K, T1W, ovs); + } + { + V TP, TQ, T1X, T1Y; + TP = VADD(Tl, TA); + TQ = VBYI(VADD(TN, TK)); + T1X = VSUB(TP, TQ); + STM2(&(xo[26]), T1X, ovs, &(xo[2])); + STN2(&(xo[24]), T1L, T1X, ovs); + T1Y = VADD(TP, TQ); + STM2(&(xo[14]), T1Y, ovs, &(xo[2])); + STN2(&(xo[12]), T1P, T1Y, ovs); + } + { + V TT, TW, T1Z, T20; + TT = VSUB(TR, TS); + TW = VBYI(VADD(TU, TV)); + T1Z = VSUB(TT, TW); + STM2(&(xo[38]), T1Z, ovs, &(xo[2])); + STN2(&(xo[36]), T1S, T1Z, ovs); + T20 = VADD(TT, TW); + STM2(&(xo[2]), T20, ovs, &(xo[2])); + STN2(&(xo[0]), T1J, T20, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n2bv_20"), {92, 12, 12, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_20) (planner *p) { + X(kdft_register) (p, n2bv_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_32.c new file mode 100644 index 000000000..2c7e5ef80 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_32.c @@ -0,0 +1,862 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 32 -name n2bv_32 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 186 FP additions, 98 FP multiplications, + * (or, 88 additions, 0 multiplications, 98 fused multiply/add), + * 72 stack variables, 7 constants, and 80 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T1T, T1W, T2K, T2x, T16, T1A, Tb, T1p, TT, T1v, TY, T1w, T27, T2a, T2b; + V T2H, T2O, TC, T1s, TH, T1t, T20, T23, T24, T2E, T2N, T2g, T2j, Tq, T1B; + V T19, T1q, T2A, T2L; + { + V T3, T1R, T14, T1S, T6, T1U, T9, T1V, T15, Ta; + { + V T1, T2, T12, T13; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T1R = VADD(T1, T2); + T12 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T14 = VSUB(T12, T13); + T1S = VADD(T12, T13); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T1U = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1V = VADD(T7, T8); + } + T1T = VADD(T1R, T1S); + T1W = VADD(T1U, T1V); + T2K = VSUB(T1U, T1V); + T2x = VSUB(T1R, T1S); + T15 = VSUB(T6, T9); + T16 = VFMA(LDK(KP707106781), T15, T14); + T1A = VFNMS(LDK(KP707106781), T15, T14); + Ta = VADD(T6, T9); + Tb = VFMA(LDK(KP707106781), Ta, T3); + T1p = VFNMS(LDK(KP707106781), Ta, T3); + } + { + V TL, T25, TW, T26, TO, T28, TR, T29; + { + V TJ, TK, TU, TV; + TJ = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T25 = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TW = VSUB(TU, TV); + T26 = VADD(TV, TU); + } + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T28 = VADD(TM, TN); + TP = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TQ = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TR = VSUB(TP, TQ); + T29 = VADD(TP, TQ); + } + { + V TS, TX, T2F, T2G; + TS = VADD(TO, TR); + TT = VFMA(LDK(KP707106781), TS, TL); + T1v = VFNMS(LDK(KP707106781), TS, TL); + TX = VSUB(TR, TO); + TY = VFMA(LDK(KP707106781), TX, TW); + T1w = VFNMS(LDK(KP707106781), TX, TW); + T27 = VADD(T25, T26); + T2a = VADD(T28, T29); + T2b = VSUB(T27, T2a); + T2F = VSUB(T25, T26); + T2G = VSUB(T29, T28); + T2H = VFNMS(LDK(KP414213562), T2G, T2F); + T2O = VFMA(LDK(KP414213562), T2F, T2G); + } + } + { + V Tu, T1Y, TF, T1Z, Tx, T21, TA, T22; + { + V Ts, Tt, TD, TE; + Ts = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1Y = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TF = VSUB(TD, TE); + T1Z = VADD(TD, TE); + } + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T21 = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tz = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TA = VSUB(Ty, Tz); + T22 = VADD(Ty, Tz); + } + { + V TB, TG, T2C, T2D; + TB = VADD(Tx, TA); + TC = VFMA(LDK(KP707106781), TB, Tu); + T1s = VFNMS(LDK(KP707106781), TB, Tu); + TG = VSUB(Tx, TA); + TH = VFMA(LDK(KP707106781), TG, TF); + T1t = VFNMS(LDK(KP707106781), TG, TF); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VSUB(T20, T23); + T2C = VSUB(T1Y, T1Z); + T2D = VSUB(T21, T22); + T2E = VFNMS(LDK(KP414213562), T2D, T2C); + T2N = VFMA(LDK(KP414213562), T2C, T2D); + } + } + { + V Te, T2e, To, T2i, Th, T2f, Tl, T2h, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T2e = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T2i = VADD(Tn, Tm); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T2f = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2h = VADD(Tj, Tk); + } + T2g = VADD(T2e, T2f); + T2j = VADD(T2h, T2i); + Ti = VFNMS(LDK(KP414213562), Th, Te); + Tp = VFNMS(LDK(KP414213562), To, Tl); + Tq = VADD(Ti, Tp); + T1B = VSUB(Ti, Tp); + { + V T17, T18, T2y, T2z; + T17 = VFMA(LDK(KP414213562), Te, Th); + T18 = VFMA(LDK(KP414213562), Tl, To); + T19 = VSUB(T17, T18); + T1q = VADD(T17, T18); + T2y = VSUB(T2e, T2f); + T2z = VSUB(T2h, T2i); + T2A = VADD(T2y, T2z); + T2L = VSUB(T2y, T2z); + } + } + { + V T31, T32, T33, T34, T35, T36, T37, T38, T39, T3a, T3b, T3c; + { + V T2d, T2n, T2m, T2o; + { + V T1X, T2c, T2k, T2l; + T1X = VSUB(T1T, T1W); + T2c = VADD(T24, T2b); + T2d = VFNMS(LDK(KP707106781), T2c, T1X); + T2n = VFMA(LDK(KP707106781), T2c, T1X); + T2k = VSUB(T2g, T2j); + T2l = VSUB(T24, T2b); + T2m = VFNMS(LDK(KP707106781), T2l, T2k); + T2o = VFMA(LDK(KP707106781), T2l, T2k); + } + T31 = VFNMSI(T2m, T2d); + STM2(&(xo[24]), T31, ovs, &(xo[0])); + T32 = VFNMSI(T2o, T2n); + STM2(&(xo[56]), T32, ovs, &(xo[0])); + T33 = VFMAI(T2m, T2d); + STM2(&(xo[40]), T33, ovs, &(xo[0])); + T34 = VFMAI(T2o, T2n); + STM2(&(xo[8]), T34, ovs, &(xo[0])); + } + { + V T2r, T2v, T2u, T2w; + { + V T2p, T2q, T2s, T2t; + T2p = VADD(T1T, T1W); + T2q = VADD(T2g, T2j); + T2r = VSUB(T2p, T2q); + T2v = VADD(T2p, T2q); + T2s = VADD(T20, T23); + T2t = VADD(T27, T2a); + T2u = VSUB(T2s, T2t); + T2w = VADD(T2s, T2t); + } + T35 = VFNMSI(T2u, T2r); + STM2(&(xo[48]), T35, ovs, &(xo[0])); + T36 = VADD(T2v, T2w); + STM2(&(xo[0]), T36, ovs, &(xo[0])); + T37 = VFMAI(T2u, T2r); + STM2(&(xo[16]), T37, ovs, &(xo[0])); + T38 = VSUB(T2v, T2w); + STM2(&(xo[32]), T38, ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VFNMS(LDK(KP707106781), T2A, T2x); + T2U = VADD(T2N, T2O); + T2V = VFNMS(LDK(KP923879532), T2U, T2T); + T2Z = VFMA(LDK(KP923879532), T2U, T2T); + T2W = VFNMS(LDK(KP707106781), T2L, T2K); + T2X = VSUB(T2E, T2H); + T2Y = VFMA(LDK(KP923879532), T2X, T2W); + T30 = VFNMS(LDK(KP923879532), T2X, T2W); + } + T39 = VFMAI(T2Y, T2V); + STM2(&(xo[20]), T39, ovs, &(xo[0])); + T3a = VFMAI(T30, T2Z); + STM2(&(xo[52]), T3a, ovs, &(xo[0])); + T3b = VFNMSI(T2Y, T2V); + STM2(&(xo[44]), T3b, ovs, &(xo[0])); + T3c = VFNMSI(T30, T2Z); + STM2(&(xo[12]), T3c, ovs, &(xo[0])); + } + { + V T3d, T3e, T3f, T3g; + { + V T2J, T2R, T2Q, T2S; + { + V T2B, T2I, T2M, T2P; + T2B = VFMA(LDK(KP707106781), T2A, T2x); + T2I = VADD(T2E, T2H); + T2J = VFNMS(LDK(KP923879532), T2I, T2B); + T2R = VFMA(LDK(KP923879532), T2I, T2B); + T2M = VFMA(LDK(KP707106781), T2L, T2K); + T2P = VSUB(T2N, T2O); + T2Q = VFNMS(LDK(KP923879532), T2P, T2M); + T2S = VFMA(LDK(KP923879532), T2P, T2M); + } + T3d = VFNMSI(T2Q, T2J); + STM2(&(xo[28]), T3d, ovs, &(xo[0])); + T3e = VFMAI(T2S, T2R); + STM2(&(xo[4]), T3e, ovs, &(xo[0])); + T3f = VFMAI(T2Q, T2J); + STM2(&(xo[36]), T3f, ovs, &(xo[0])); + T3g = VFNMSI(T2S, T2R); + STM2(&(xo[60]), T3g, ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1J, T1F, T1K, T1y, T1N; + T1r = VFMA(LDK(KP923879532), T1q, T1p); + T1C = VFNMS(LDK(KP923879532), T1B, T1A); + T1M = VFMA(LDK(KP923879532), T1B, T1A); + T1J = VFNMS(LDK(KP923879532), T1q, T1p); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP668178637), T1s, T1t); + T1E = VFNMS(LDK(KP668178637), T1v, T1w); + T1F = VSUB(T1D, T1E); + T1K = VADD(T1D, T1E); + T1u = VFMA(LDK(KP668178637), T1t, T1s); + T1x = VFMA(LDK(KP668178637), T1w, T1v); + T1y = VADD(T1u, T1x); + T1N = VSUB(T1u, T1x); + } + { + V T1z, T1G, T3h, T3i; + T1z = VFNMS(LDK(KP831469612), T1y, T1r); + T1G = VFNMS(LDK(KP831469612), T1F, T1C); + T3h = VFNMSI(T1G, T1z); + STM2(&(xo[38]), T3h, ovs, &(xo[2])); + STN2(&(xo[36]), T3f, T3h, ovs); + T3i = VFMAI(T1G, T1z); + STM2(&(xo[26]), T3i, ovs, &(xo[2])); + STN2(&(xo[24]), T31, T3i, ovs); + } + { + V T1P, T1Q, T3j, T3k; + T1P = VFNMS(LDK(KP831469612), T1K, T1J); + T1Q = VFMA(LDK(KP831469612), T1N, T1M); + T3j = VFMAI(T1Q, T1P); + STM2(&(xo[10]), T3j, ovs, &(xo[2])); + STN2(&(xo[8]), T34, T3j, ovs); + T3k = VFNMSI(T1Q, T1P); + STM2(&(xo[54]), T3k, ovs, &(xo[2])); + STN2(&(xo[52]), T3a, T3k, ovs); + } + { + V T1H, T1I, T3l, T3m; + T1H = VFMA(LDK(KP831469612), T1y, T1r); + T1I = VFMA(LDK(KP831469612), T1F, T1C); + T3l = VFNMSI(T1I, T1H); + STM2(&(xo[6]), T3l, ovs, &(xo[2])); + STN2(&(xo[4]), T3e, T3l, ovs); + T3m = VFMAI(T1I, T1H); + STM2(&(xo[58]), T3m, ovs, &(xo[2])); + STN2(&(xo[56]), T32, T3m, ovs); + } + { + V T1L, T1O, T3n, T3o; + T1L = VFMA(LDK(KP831469612), T1K, T1J); + T1O = VFNMS(LDK(KP831469612), T1N, T1M); + T3n = VFNMSI(T1O, T1L); + STM2(&(xo[22]), T3n, ovs, &(xo[2])); + STN2(&(xo[20]), T39, T3n, ovs); + T3o = VFMAI(T1O, T1L); + STM2(&(xo[42]), T3o, ovs, &(xo[2])); + STN2(&(xo[40]), T33, T3o, ovs); + } + } + { + V Tr, T1a, T1k, T1h, T1d, T1i, T10, T1l; + Tr = VFMA(LDK(KP923879532), Tq, Tb); + T1a = VFMA(LDK(KP923879532), T19, T16); + T1k = VFNMS(LDK(KP923879532), T19, T16); + T1h = VFNMS(LDK(KP923879532), Tq, Tb); + { + V T1b, T1c, TI, TZ; + T1b = VFMA(LDK(KP198912367), TC, TH); + T1c = VFMA(LDK(KP198912367), TT, TY); + T1d = VSUB(T1b, T1c); + T1i = VADD(T1b, T1c); + TI = VFNMS(LDK(KP198912367), TH, TC); + TZ = VFNMS(LDK(KP198912367), TY, TT); + T10 = VADD(TI, TZ); + T1l = VSUB(TI, TZ); + } + { + V T11, T1e, T3p, T3q; + T11 = VFNMS(LDK(KP980785280), T10, Tr); + T1e = VFNMS(LDK(KP980785280), T1d, T1a); + T3p = VFNMSI(T1e, T11); + STM2(&(xo[30]), T3p, ovs, &(xo[2])); + STN2(&(xo[28]), T3d, T3p, ovs); + T3q = VFMAI(T1e, T11); + STM2(&(xo[34]), T3q, ovs, &(xo[2])); + STN2(&(xo[32]), T38, T3q, ovs); + } + { + V T1n, T1o, T3r, T3s; + T1n = VFMA(LDK(KP980785280), T1i, T1h); + T1o = VFNMS(LDK(KP980785280), T1l, T1k); + T3r = VFNMSI(T1o, T1n); + STM2(&(xo[14]), T3r, ovs, &(xo[2])); + STN2(&(xo[12]), T3c, T3r, ovs); + T3s = VFMAI(T1o, T1n); + STM2(&(xo[50]), T3s, ovs, &(xo[2])); + STN2(&(xo[48]), T35, T3s, ovs); + } + { + V T1f, T1g, T3t, T3u; + T1f = VFMA(LDK(KP980785280), T10, Tr); + T1g = VFMA(LDK(KP980785280), T1d, T1a); + T3t = VFNMSI(T1g, T1f); + STM2(&(xo[62]), T3t, ovs, &(xo[2])); + STN2(&(xo[60]), T3g, T3t, ovs); + T3u = VFMAI(T1g, T1f); + STM2(&(xo[2]), T3u, ovs, &(xo[2])); + STN2(&(xo[0]), T36, T3u, ovs); + } + { + V T1j, T1m, T3v, T3w; + T1j = VFNMS(LDK(KP980785280), T1i, T1h); + T1m = VFMA(LDK(KP980785280), T1l, T1k); + T3v = VFMAI(T1m, T1j); + STM2(&(xo[18]), T3v, ovs, &(xo[2])); + STN2(&(xo[16]), T37, T3v, ovs); + T3w = VFNMSI(T1m, T1j); + STM2(&(xo[46]), T3w, ovs, &(xo[2])); + STN2(&(xo[44]), T3b, T3w, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n2bv_32"), {88, 0, 98, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_32) (planner *p) { + X(kdft_register) (p, n2bv_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 32 -name n2bv_32 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 186 FP additions, 42 FP multiplications, + * (or, 170 additions, 26 multiplications, 16 fused multiply/add), + * 72 stack variables, 7 constants, and 80 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T2f, T2k, T2N, T2M, T19, T1B, Tb, T1p, TT, T1v, TY, T1w, T2E, T2F, T2G; + V T24, T2o, TC, T1s, TH, T1t, T2B, T2C, T2D, T1X, T2n, T2I, T2J, Tq, T1A; + V T14, T1q, T2c, T2l; + { + V T3, T2i, T18, T2j, T6, T2d, T9, T2e, T15, Ta; + { + V T1, T2, T16, T17; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T2i = VADD(T1, T2); + T16 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T17 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T18 = VSUB(T16, T17); + T2j = VADD(T16, T17); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T2d = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T2e = VADD(T7, T8); + } + T2f = VSUB(T2d, T2e); + T2k = VSUB(T2i, T2j); + T2N = VADD(T2d, T2e); + T2M = VADD(T2i, T2j); + T15 = VMUL(LDK(KP707106781), VSUB(T6, T9)); + T19 = VSUB(T15, T18); + T1B = VADD(T18, T15); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VSUB(T3, Ta); + T1p = VADD(T3, Ta); + } + { + V TL, T21, TW, T1Y, TO, T22, TS, T1Z; + { + V TJ, TK, TU, TV; + TJ = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T21 = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TW = VSUB(TU, TV); + T1Y = VADD(TU, TV); + } + { + V TM, TN, TQ, TR; + TM = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T22 = VADD(TM, TN); + TQ = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TR = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TS = VSUB(TQ, TR); + T1Z = VADD(TQ, TR); + } + { + V TP, TX, T20, T23; + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + TT = VSUB(TP, TS); + T1v = VADD(TS, TP); + TX = VMUL(LDK(KP707106781), VADD(TL, TO)); + TY = VSUB(TW, TX); + T1w = VADD(TW, TX); + T2E = VADD(T1Y, T1Z); + T2F = VADD(T21, T22); + T2G = VSUB(T2E, T2F); + T20 = VSUB(T1Y, T1Z); + T23 = VSUB(T21, T22); + T24 = VFMA(LDK(KP923879532), T20, VMUL(LDK(KP382683432), T23)); + T2o = VFNMS(LDK(KP382683432), T20, VMUL(LDK(KP923879532), T23)); + } + } + { + V Tu, T1U, TF, T1R, Tx, T1V, TB, T1S; + { + V Ts, Tt, TD, TE; + Ts = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1U = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TF = VSUB(TD, TE); + T1R = VADD(TD, TE); + } + { + V Tv, Tw, Tz, TA; + Tv = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T1V = VADD(Tv, Tw); + Tz = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TA = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TB = VSUB(Tz, TA); + T1S = VADD(Tz, TA); + } + { + V Ty, TG, T1T, T1W; + Ty = VMUL(LDK(KP707106781), VSUB(Tu, Tx)); + TC = VSUB(Ty, TB); + T1s = VADD(TB, Ty); + TG = VMUL(LDK(KP707106781), VADD(Tu, Tx)); + TH = VSUB(TF, TG); + T1t = VADD(TF, TG); + T2B = VADD(T1R, T1S); + T2C = VADD(T1U, T1V); + T2D = VSUB(T2B, T2C); + T1T = VSUB(T1R, T1S); + T1W = VSUB(T1U, T1V); + T1X = VFNMS(LDK(KP382683432), T1W, VMUL(LDK(KP923879532), T1T)); + T2n = VFMA(LDK(KP382683432), T1T, VMUL(LDK(KP923879532), T1W)); + } + } + { + V Te, T26, To, T29, Th, T27, Tl, T2a, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T26 = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T29 = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T27 = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2a = VADD(Tj, Tk); + } + T2I = VADD(T26, T27); + T2J = VADD(T29, T2a); + Ti = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + Tp = VFNMS(LDK(KP382683432), To, VMUL(LDK(KP923879532), Tl)); + Tq = VSUB(Ti, Tp); + T1A = VADD(Ti, Tp); + { + V T12, T13, T28, T2b; + T12 = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + T13 = VFMA(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T14 = VSUB(T12, T13); + T1q = VADD(T12, T13); + T28 = VSUB(T26, T27); + T2b = VSUB(T29, T2a); + T2c = VMUL(LDK(KP707106781), VSUB(T28, T2b)); + T2l = VMUL(LDK(KP707106781), VADD(T28, T2b)); + } + } + { + V T31, T32, T33, T34, T35, T36, T37, T38, T39, T3a, T3b, T3c; + { + V T2L, T2R, T2Q, T2S; + { + V T2H, T2K, T2O, T2P; + T2H = VMUL(LDK(KP707106781), VSUB(T2D, T2G)); + T2K = VSUB(T2I, T2J); + T2L = VBYI(VSUB(T2H, T2K)); + T2R = VBYI(VADD(T2K, T2H)); + T2O = VSUB(T2M, T2N); + T2P = VMUL(LDK(KP707106781), VADD(T2D, T2G)); + T2Q = VSUB(T2O, T2P); + T2S = VADD(T2O, T2P); + } + T31 = VADD(T2L, T2Q); + STM2(&(xo[24]), T31, ovs, &(xo[0])); + T32 = VSUB(T2S, T2R); + STM2(&(xo[56]), T32, ovs, &(xo[0])); + T33 = VSUB(T2Q, T2L); + STM2(&(xo[40]), T33, ovs, &(xo[0])); + T34 = VADD(T2R, T2S); + STM2(&(xo[8]), T34, ovs, &(xo[0])); + } + { + V T2h, T2r, T2q, T2s; + { + V T25, T2g, T2m, T2p; + T25 = VSUB(T1X, T24); + T2g = VSUB(T2c, T2f); + T2h = VBYI(VSUB(T25, T2g)); + T2r = VBYI(VADD(T2g, T25)); + T2m = VSUB(T2k, T2l); + T2p = VSUB(T2n, T2o); + T2q = VSUB(T2m, T2p); + T2s = VADD(T2m, T2p); + } + T35 = VADD(T2h, T2q); + STM2(&(xo[20]), T35, ovs, &(xo[0])); + T36 = VSUB(T2s, T2r); + STM2(&(xo[52]), T36, ovs, &(xo[0])); + T37 = VSUB(T2q, T2h); + STM2(&(xo[44]), T37, ovs, &(xo[0])); + T38 = VADD(T2r, T2s); + STM2(&(xo[12]), T38, ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VADD(T2M, T2N); + T2U = VADD(T2I, T2J); + T2V = VSUB(T2T, T2U); + T2Z = VADD(T2T, T2U); + T2W = VADD(T2B, T2C); + T2X = VADD(T2E, T2F); + T2Y = VBYI(VSUB(T2W, T2X)); + T30 = VADD(T2W, T2X); + } + T39 = VSUB(T2V, T2Y); + STM2(&(xo[48]), T39, ovs, &(xo[0])); + T3a = VADD(T2Z, T30); + STM2(&(xo[0]), T3a, ovs, &(xo[0])); + T3b = VADD(T2V, T2Y); + STM2(&(xo[16]), T3b, ovs, &(xo[0])); + T3c = VSUB(T2Z, T30); + STM2(&(xo[32]), T3c, ovs, &(xo[0])); + } + { + V T3d, T3e, T3f, T3g; + { + V T2v, T2z, T2y, T2A; + { + V T2t, T2u, T2w, T2x; + T2t = VADD(T2k, T2l); + T2u = VADD(T1X, T24); + T2v = VADD(T2t, T2u); + T2z = VSUB(T2t, T2u); + T2w = VADD(T2f, T2c); + T2x = VADD(T2n, T2o); + T2y = VBYI(VADD(T2w, T2x)); + T2A = VBYI(VSUB(T2x, T2w)); + } + T3d = VSUB(T2v, T2y); + STM2(&(xo[60]), T3d, ovs, &(xo[0])); + T3e = VADD(T2z, T2A); + STM2(&(xo[28]), T3e, ovs, &(xo[0])); + T3f = VADD(T2v, T2y); + STM2(&(xo[4]), T3f, ovs, &(xo[0])); + T3g = VSUB(T2z, T2A); + STM2(&(xo[36]), T3g, ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1K, T1F, T1N, T1y, T1J; + T1r = VSUB(T1p, T1q); + T1C = VSUB(T1A, T1B); + T1M = VADD(T1p, T1q); + T1K = VADD(T1B, T1A); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP195090322), T1s, VMUL(LDK(KP980785280), T1t)); + T1E = VFMA(LDK(KP195090322), T1v, VMUL(LDK(KP980785280), T1w)); + T1F = VSUB(T1D, T1E); + T1N = VADD(T1D, T1E); + T1u = VFMA(LDK(KP980785280), T1s, VMUL(LDK(KP195090322), T1t)); + T1x = VFNMS(LDK(KP195090322), T1w, VMUL(LDK(KP980785280), T1v)); + T1y = VSUB(T1u, T1x); + T1J = VADD(T1u, T1x); + } + { + V T1z, T1G, T3h, T3i; + T1z = VADD(T1r, T1y); + T1G = VBYI(VADD(T1C, T1F)); + T3h = VSUB(T1z, T1G); + STM2(&(xo[50]), T3h, ovs, &(xo[2])); + STN2(&(xo[48]), T39, T3h, ovs); + T3i = VADD(T1z, T1G); + STM2(&(xo[14]), T3i, ovs, &(xo[2])); + STN2(&(xo[12]), T38, T3i, ovs); + } + { + V T1P, T1Q, T3j, T3k; + T1P = VBYI(VADD(T1K, T1J)); + T1Q = VADD(T1M, T1N); + T3j = VADD(T1P, T1Q); + STM2(&(xo[2]), T3j, ovs, &(xo[2])); + STN2(&(xo[0]), T3a, T3j, ovs); + T3k = VSUB(T1Q, T1P); + STM2(&(xo[62]), T3k, ovs, &(xo[2])); + STN2(&(xo[60]), T3d, T3k, ovs); + } + { + V T1H, T1I, T3l, T3m; + T1H = VSUB(T1r, T1y); + T1I = VBYI(VSUB(T1F, T1C)); + T3l = VSUB(T1H, T1I); + STM2(&(xo[46]), T3l, ovs, &(xo[2])); + STN2(&(xo[44]), T37, T3l, ovs); + T3m = VADD(T1H, T1I); + STM2(&(xo[18]), T3m, ovs, &(xo[2])); + STN2(&(xo[16]), T3b, T3m, ovs); + } + { + V T1L, T1O, T3n, T3o; + T1L = VBYI(VSUB(T1J, T1K)); + T1O = VSUB(T1M, T1N); + T3n = VADD(T1L, T1O); + STM2(&(xo[30]), T3n, ovs, &(xo[2])); + STN2(&(xo[28]), T3e, T3n, ovs); + T3o = VSUB(T1O, T1L); + STM2(&(xo[34]), T3o, ovs, &(xo[2])); + STN2(&(xo[32]), T3c, T3o, ovs); + } + } + { + V Tr, T1a, T1k, T1i, T1d, T1l, T10, T1h; + Tr = VSUB(Tb, Tq); + T1a = VSUB(T14, T19); + T1k = VADD(Tb, Tq); + T1i = VADD(T19, T14); + { + V T1b, T1c, TI, TZ; + T1b = VFNMS(LDK(KP555570233), TC, VMUL(LDK(KP831469612), TH)); + T1c = VFMA(LDK(KP555570233), TT, VMUL(LDK(KP831469612), TY)); + T1d = VSUB(T1b, T1c); + T1l = VADD(T1b, T1c); + TI = VFMA(LDK(KP831469612), TC, VMUL(LDK(KP555570233), TH)); + TZ = VFNMS(LDK(KP555570233), TY, VMUL(LDK(KP831469612), TT)); + T10 = VSUB(TI, TZ); + T1h = VADD(TI, TZ); + } + { + V T11, T1e, T3p, T3q; + T11 = VADD(Tr, T10); + T1e = VBYI(VADD(T1a, T1d)); + T3p = VSUB(T11, T1e); + STM2(&(xo[54]), T3p, ovs, &(xo[2])); + STN2(&(xo[52]), T36, T3p, ovs); + T3q = VADD(T11, T1e); + STM2(&(xo[10]), T3q, ovs, &(xo[2])); + STN2(&(xo[8]), T34, T3q, ovs); + } + { + V T1n, T1o, T3r, T3s; + T1n = VBYI(VADD(T1i, T1h)); + T1o = VADD(T1k, T1l); + T3r = VADD(T1n, T1o); + STM2(&(xo[6]), T3r, ovs, &(xo[2])); + STN2(&(xo[4]), T3f, T3r, ovs); + T3s = VSUB(T1o, T1n); + STM2(&(xo[58]), T3s, ovs, &(xo[2])); + STN2(&(xo[56]), T32, T3s, ovs); + } + { + V T1f, T1g, T3t, T3u; + T1f = VSUB(Tr, T10); + T1g = VBYI(VSUB(T1d, T1a)); + T3t = VSUB(T1f, T1g); + STM2(&(xo[42]), T3t, ovs, &(xo[2])); + STN2(&(xo[40]), T33, T3t, ovs); + T3u = VADD(T1f, T1g); + STM2(&(xo[22]), T3u, ovs, &(xo[2])); + STN2(&(xo[20]), T35, T3u, ovs); + } + { + V T1j, T1m, T3v, T3w; + T1j = VBYI(VSUB(T1h, T1i)); + T1m = VSUB(T1k, T1l); + T3v = VADD(T1j, T1m); + STM2(&(xo[26]), T3v, ovs, &(xo[2])); + STN2(&(xo[24]), T31, T3v, ovs); + T3w = VSUB(T1m, T1j); + STM2(&(xo[38]), T3w, ovs, &(xo[2])); + STN2(&(xo[36]), T3g, T3w, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n2bv_32"), {170, 26, 16, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_32) (planner *p) { + X(kdft_register) (p, n2bv_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_4.c new file mode 100644 index 000000000..bfb70a650 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_4.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 4 -name n2bv_4 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 8 FP additions, 2 FP multiplications, + * (or, 6 additions, 0 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 10 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T8 = VADD(T4, T5); + } + { + V T9, Ta, Tb, Tc; + T9 = VFNMSI(T6, T3); + STM2(&(xo[6]), T9, ovs, &(xo[2])); + Ta = VADD(T7, T8); + STM2(&(xo[0]), Ta, ovs, &(xo[0])); + Tb = VFMAI(T6, T3); + STM2(&(xo[2]), Tb, ovs, &(xo[2])); + STN2(&(xo[0]), Ta, Tb, ovs); + Tc = VSUB(T7, T8); + STM2(&(xo[4]), Tc, ovs, &(xo[0])); + STN2(&(xo[4]), Tc, T9, ovs); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n2bv_4"), {6, 0, 2, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_4) (planner *p) { + X(kdft_register) (p, n2bv_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 4 -name n2bv_4 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 8 FP additions, 0 FP multiplications, + * (or, 8 additions, 0 multiplications, 0 fused multiply/add), + * 11 stack variables, 0 constants, and 10 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VBYI(VSUB(T4, T5)); + T8 = VADD(T4, T5); + } + { + V T9, Ta, Tb, Tc; + T9 = VSUB(T3, T6); + STM2(&(xo[6]), T9, ovs, &(xo[2])); + Ta = VADD(T7, T8); + STM2(&(xo[0]), Ta, ovs, &(xo[0])); + Tb = VADD(T3, T6); + STM2(&(xo[2]), Tb, ovs, &(xo[2])); + STN2(&(xo[0]), Ta, Tb, ovs); + Tc = VSUB(T7, T8); + STM2(&(xo[4]), Tc, ovs, &(xo[0])); + STN2(&(xo[4]), Tc, T9, ovs); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n2bv_4"), {8, 0, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_4) (planner *p) { + X(kdft_register) (p, n2bv_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_6.c new file mode 100644 index 000000000..303a41c14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_6.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 6 -name n2bv_6 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 18 FP additions, 8 FP multiplications, + * (or, 12 additions, 2 multiplications, 6 fused multiply/add), + * 25 stack variables, 2 constants, and 15 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V T3, Td, T6, Te, T9, Tf, Ta, Tg, T1, T2, Tj, Tk; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Td = VADD(T1, T2); + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Te = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tg = VADD(Te, Tf); + Tj = VADD(T3, Ta); + STM2(&(xo[6]), Tj, ovs, &(xo[2])); + Tk = VADD(Td, Tg); + STM2(&(xo[0]), Tk, ovs, &(xo[0])); + { + V Tm, Tb, Tc, Tl; + Tb = VFNMS(LDK(KP500000000), Ta, T3); + Tc = VMUL(LDK(KP866025403), VSUB(T6, T9)); + Tl = VFMAI(Tc, Tb); + STM2(&(xo[2]), Tl, ovs, &(xo[2])); + STN2(&(xo[0]), Tk, Tl, ovs); + Tm = VFNMSI(Tc, Tb); + STM2(&(xo[10]), Tm, ovs, &(xo[2])); + { + V Th, Ti, Tn, To; + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VMUL(LDK(KP866025403), VSUB(Te, Tf)); + Tn = VFNMSI(Ti, Th); + STM2(&(xo[4]), Tn, ovs, &(xo[0])); + STN2(&(xo[4]), Tn, Tj, ovs); + To = VFMAI(Ti, Th); + STM2(&(xo[8]), To, ovs, &(xo[0])); + STN2(&(xo[8]), To, Tm, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n2bv_6"), {12, 2, 6, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_6) (planner *p) { + X(kdft_register) (p, n2bv_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 6 -name n2bv_6 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 18 FP additions, 4 FP multiplications, + * (or, 16 additions, 2 multiplications, 2 fused multiply/add), + * 25 stack variables, 2 constants, and 15 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V Ta, Td, T3, Te, T6, Tf, Tb, Tg, T8, T9, Tj, Tk; + T8 = LD(&(xi[0]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + Td = VADD(T8, T9); + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Te = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tf = VADD(T4, T5); + } + Tb = VADD(T3, T6); + Tg = VADD(Te, Tf); + Tj = VADD(Ta, Tb); + STM2(&(xo[6]), Tj, ovs, &(xo[2])); + Tk = VADD(Td, Tg); + STM2(&(xo[0]), Tk, ovs, &(xo[0])); + { + V Tm, T7, Tc, Tl; + T7 = VBYI(VMUL(LDK(KP866025403), VSUB(T3, T6))); + Tc = VFNMS(LDK(KP500000000), Tb, Ta); + Tl = VADD(T7, Tc); + STM2(&(xo[2]), Tl, ovs, &(xo[2])); + STN2(&(xo[0]), Tk, Tl, ovs); + Tm = VSUB(Tc, T7); + STM2(&(xo[10]), Tm, ovs, &(xo[2])); + { + V Th, Ti, Tn, To; + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VBYI(VMUL(LDK(KP866025403), VSUB(Te, Tf))); + Tn = VSUB(Th, Ti); + STM2(&(xo[4]), Tn, ovs, &(xo[0])); + STN2(&(xo[4]), Tn, Tj, ovs); + To = VADD(Ti, Th); + STM2(&(xo[8]), To, ovs, &(xo[0])); + STN2(&(xo[8]), To, Tm, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n2bv_6"), {16, 2, 2, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_6) (planner *p) { + X(kdft_register) (p, n2bv_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_64.c new file mode 100644 index 000000000..d68724db4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_64.c @@ -0,0 +1,1882 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:15 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 64 -name n2bv_64 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 456 FP additions, 258 FP multiplications, + * (or, 198 additions, 0 multiplications, 258 fused multiply/add), + * 120 stack variables, 15 constants, and 160 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T7, T26, T47, T69, T5k, T6A, T2V, T3z, Tm, T27, T5n, T6a, T2Y, T3M, T4e; + V T6B, TC, T29, T6e, T6D, T3i, T3A, T4o, T5p, TR, T2a, T6h, T6E, T3l, T3B; + V T4x, T5q, T1N, T2x, T6t, T71, T6w, T72, T1W, T2y, T39, T3H, T57, T5N, T5e; + V T5O, T3c, T3I, T1g, T2u, T6m, T6Y, T6p, T6Z, T1p, T2v, T32, T3E, T4M, T5K; + V T4T, T5L, T35, T3F; + { + V T3, T43, T25, T45, T6, T5i, T22, T44; + { + V T1, T2, T23, T24; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T43 = VSUB(T1, T2); + T23 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T24 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T25 = VADD(T23, T24); + T45 = VSUB(T23, T24); + } + { + V T4, T5, T20, T21; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T5i = VSUB(T4, T5); + T20 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T21 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T22 = VADD(T20, T21); + T44 = VSUB(T20, T21); + } + T7 = VSUB(T3, T6); + T26 = VSUB(T22, T25); + { + V T46, T5j, T2T, T2U; + T46 = VADD(T44, T45); + T47 = VFMA(LDK(KP707106781), T46, T43); + T69 = VFNMS(LDK(KP707106781), T46, T43); + T5j = VSUB(T44, T45); + T5k = VFMA(LDK(KP707106781), T5j, T5i); + T6A = VFNMS(LDK(KP707106781), T5j, T5i); + T2T = VADD(T3, T6); + T2U = VADD(T22, T25); + T2V = VADD(T2T, T2U); + T3z = VSUB(T2T, T2U); + } + } + { + V Ta, T48, Tk, T4c, Td, T49, Th, T4b; + { + V T8, T9, Ti, Tj; + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + T48 = VSUB(T8, T9); + Ti = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + Tk = VADD(Ti, Tj); + T4c = VSUB(Tj, Ti); + } + { + V Tb, Tc, Tf, Tg; + Tb = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Td = VADD(Tb, Tc); + T49 = VSUB(Tb, Tc); + Tf = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Th = VADD(Tf, Tg); + T4b = VSUB(Tf, Tg); + } + { + V Te, Tl, T5l, T5m; + Te = VSUB(Ta, Td); + Tl = VSUB(Th, Tk); + Tm = VADD(Te, Tl); + T27 = VSUB(Te, Tl); + T5l = VFMA(LDK(KP414213562), T48, T49); + T5m = VFMA(LDK(KP414213562), T4b, T4c); + T5n = VSUB(T5l, T5m); + T6a = VADD(T5l, T5m); + } + { + V T2W, T2X, T4a, T4d; + T2W = VADD(Ta, Td); + T2X = VADD(Th, Tk); + T2Y = VADD(T2W, T2X); + T3M = VSUB(T2W, T2X); + T4a = VFNMS(LDK(KP414213562), T49, T48); + T4d = VFNMS(LDK(KP414213562), T4c, T4b); + T4e = VADD(T4a, T4d); + T6B = VSUB(T4a, T4d); + } + } + { + V Tq, T4g, Tt, T4l, Tx, T4m, TA, T4j; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + T4g = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + T4l = VSUB(Tr, Ts); + { + V Tv, Tw, T4h, Ty, Tz, T4i; + Tv = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T4h = VSUB(Tv, Tw); + Ty = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T4i = VSUB(Ty, Tz); + Tx = VADD(Tv, Tw); + T4m = VSUB(T4h, T4i); + TA = VADD(Ty, Tz); + T4j = VADD(T4h, T4i); + } + } + { + V Tu, TB, T6c, T6d; + Tu = VSUB(Tq, Tt); + TB = VSUB(Tx, TA); + TC = VFNMS(LDK(KP414213562), TB, Tu); + T29 = VFMA(LDK(KP414213562), Tu, TB); + T6c = VFNMS(LDK(KP707106781), T4m, T4l); + T6d = VFNMS(LDK(KP707106781), T4j, T4g); + T6e = VFNMS(LDK(KP668178637), T6d, T6c); + T6D = VFMA(LDK(KP668178637), T6c, T6d); + } + { + V T3g, T3h, T4k, T4n; + T3g = VADD(Tq, Tt); + T3h = VADD(Tx, TA); + T3i = VADD(T3g, T3h); + T3A = VSUB(T3g, T3h); + T4k = VFMA(LDK(KP707106781), T4j, T4g); + T4n = VFMA(LDK(KP707106781), T4m, T4l); + T4o = VFNMS(LDK(KP198912367), T4n, T4k); + T5p = VFMA(LDK(KP198912367), T4k, T4n); + } + } + { + V TF, T4p, TI, T4u, TM, T4v, TP, T4s; + { + V TD, TE, TG, TH; + TD = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TF = VADD(TD, TE); + T4p = VSUB(TD, TE); + TG = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TH = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TI = VADD(TG, TH); + T4u = VSUB(TH, TG); + { + V TK, TL, T4r, TN, TO, T4q; + TK = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + TL = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T4r = VSUB(TK, TL); + TN = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + TO = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T4q = VSUB(TN, TO); + TM = VADD(TK, TL); + T4v = VSUB(T4r, T4q); + TP = VADD(TN, TO); + T4s = VADD(T4q, T4r); + } + } + { + V TJ, TQ, T6f, T6g; + TJ = VSUB(TF, TI); + TQ = VSUB(TM, TP); + TR = VFNMS(LDK(KP414213562), TQ, TJ); + T2a = VFMA(LDK(KP414213562), TJ, TQ); + T6f = VFNMS(LDK(KP707106781), T4v, T4u); + T6g = VFNMS(LDK(KP707106781), T4s, T4p); + T6h = VFNMS(LDK(KP668178637), T6g, T6f); + T6E = VFMA(LDK(KP668178637), T6f, T6g); + } + { + V T3j, T3k, T4t, T4w; + T3j = VADD(TF, TI); + T3k = VADD(TP, TM); + T3l = VADD(T3j, T3k); + T3B = VSUB(T3j, T3k); + T4t = VFMA(LDK(KP707106781), T4s, T4p); + T4w = VFMA(LDK(KP707106781), T4v, T4u); + T4x = VFNMS(LDK(KP198912367), T4w, T4t); + T5q = VFMA(LDK(KP198912367), T4t, T4w); + } + } + { + V T1t, T4V, T1w, T58, T1Q, T59, T1T, T4Y, T1A, T1D, T1E, T5b, T52, T1H, T1K; + V T1L, T5c, T55; + { + V T1r, T1s, T1u, T1v; + T1r = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T1s = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T1t = VADD(T1r, T1s); + T4V = VSUB(T1r, T1s); + T1u = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1v = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T1w = VADD(T1u, T1v); + T58 = VSUB(T1v, T1u); + } + { + V T1O, T1P, T4X, T1R, T1S, T4W; + T1O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T4X = VSUB(T1O, T1P); + T1R = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1S = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T4W = VSUB(T1R, T1S); + T1Q = VADD(T1O, T1P); + T59 = VSUB(T4X, T4W); + T1T = VADD(T1R, T1S); + T4Y = VADD(T4W, T4X); + } + { + V T50, T51, T53, T54; + { + V T1y, T1z, T1B, T1C; + T1y = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1z = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1A = VADD(T1y, T1z); + T50 = VSUB(T1y, T1z); + T1B = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1C = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1D = VADD(T1B, T1C); + T51 = VSUB(T1C, T1B); + } + T1E = VSUB(T1A, T1D); + T5b = VFNMS(LDK(KP414213562), T50, T51); + T52 = VFMA(LDK(KP414213562), T51, T50); + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1G = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1H = VADD(T1F, T1G); + T53 = VSUB(T1F, T1G); + T1I = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1J = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T1K = VADD(T1I, T1J); + T54 = VSUB(T1J, T1I); + } + T1L = VSUB(T1H, T1K); + T5c = VFMA(LDK(KP414213562), T53, T54); + T55 = VFNMS(LDK(KP414213562), T54, T53); + } + { + V T1x, T1M, T6r, T6s; + T1x = VSUB(T1t, T1w); + T1M = VADD(T1E, T1L); + T1N = VFMA(LDK(KP707106781), T1M, T1x); + T2x = VFNMS(LDK(KP707106781), T1M, T1x); + T6r = VFNMS(LDK(KP707106781), T4Y, T4V); + T6s = VSUB(T5c, T5b); + T6t = VFNMS(LDK(KP923879532), T6s, T6r); + T71 = VFMA(LDK(KP923879532), T6s, T6r); + } + { + V T6u, T6v, T1U, T1V; + T6u = VFNMS(LDK(KP707106781), T59, T58); + T6v = VSUB(T55, T52); + T6w = VFMA(LDK(KP923879532), T6v, T6u); + T72 = VFNMS(LDK(KP923879532), T6v, T6u); + T1U = VSUB(T1Q, T1T); + T1V = VSUB(T1L, T1E); + T1W = VFMA(LDK(KP707106781), T1V, T1U); + T2y = VFNMS(LDK(KP707106781), T1V, T1U); + } + { + V T37, T38, T4Z, T56; + T37 = VADD(T1t, T1w); + T38 = VADD(T1T, T1Q); + T39 = VADD(T37, T38); + T3H = VSUB(T37, T38); + T4Z = VFMA(LDK(KP707106781), T4Y, T4V); + T56 = VADD(T52, T55); + T57 = VFMA(LDK(KP923879532), T56, T4Z); + T5N = VFNMS(LDK(KP923879532), T56, T4Z); + } + { + V T5a, T5d, T3a, T3b; + T5a = VFMA(LDK(KP707106781), T59, T58); + T5d = VADD(T5b, T5c); + T5e = VFMA(LDK(KP923879532), T5d, T5a); + T5O = VFNMS(LDK(KP923879532), T5d, T5a); + T3a = VADD(T1A, T1D); + T3b = VADD(T1H, T1K); + T3c = VADD(T3a, T3b); + T3I = VSUB(T3b, T3a); + } + } + { + V TW, T4A, TZ, T4N, T1j, T4O, T1m, T4D, T13, T16, T17, T4Q, T4H, T1a, T1d; + V T1e, T4R, T4K; + { + V TU, TV, TX, TY; + TU = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + TW = VADD(TU, TV); + T4A = VSUB(TU, TV); + TX = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TY = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + TZ = VADD(TX, TY); + T4N = VSUB(TX, TY); + } + { + V T1h, T1i, T4B, T1k, T1l, T4C; + T1h = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T4B = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T4C = VSUB(T1k, T1l); + T1j = VADD(T1h, T1i); + T4O = VSUB(T4B, T4C); + T1m = VADD(T1k, T1l); + T4D = VADD(T4B, T4C); + } + { + V T4F, T4G, T4I, T4J; + { + V T11, T12, T14, T15; + T11 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T12 = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T13 = VADD(T11, T12); + T4F = VSUB(T11, T12); + T14 = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T15 = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T16 = VADD(T14, T15); + T4G = VSUB(T14, T15); + } + T17 = VSUB(T13, T16); + T4Q = VFMA(LDK(KP414213562), T4F, T4G); + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + { + V T18, T19, T1b, T1c; + T18 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T19 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T1a = VADD(T18, T19); + T4I = VSUB(T18, T19); + T1b = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T1c = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T1d = VADD(T1b, T1c); + T4J = VSUB(T1b, T1c); + } + T1e = VSUB(T1a, T1d); + T4R = VFNMS(LDK(KP414213562), T4I, T4J); + T4K = VFMA(LDK(KP414213562), T4J, T4I); + } + { + V T10, T1f, T6k, T6l; + T10 = VSUB(TW, TZ); + T1f = VADD(T17, T1e); + T1g = VFMA(LDK(KP707106781), T1f, T10); + T2u = VFNMS(LDK(KP707106781), T1f, T10); + T6k = VFNMS(LDK(KP707106781), T4D, T4A); + T6l = VSUB(T4Q, T4R); + T6m = VFNMS(LDK(KP923879532), T6l, T6k); + T6Y = VFMA(LDK(KP923879532), T6l, T6k); + } + { + V T6n, T6o, T1n, T1o; + T6n = VFNMS(LDK(KP707106781), T4O, T4N); + T6o = VSUB(T4H, T4K); + T6p = VFMA(LDK(KP923879532), T6o, T6n); + T6Z = VFNMS(LDK(KP923879532), T6o, T6n); + T1n = VSUB(T1j, T1m); + T1o = VSUB(T17, T1e); + T1p = VFMA(LDK(KP707106781), T1o, T1n); + T2v = VFNMS(LDK(KP707106781), T1o, T1n); + } + { + V T30, T31, T4E, T4L; + T30 = VADD(TW, TZ); + T31 = VADD(T1j, T1m); + T32 = VADD(T30, T31); + T3E = VSUB(T30, T31); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4L = VADD(T4H, T4K); + T4M = VFMA(LDK(KP923879532), T4L, T4E); + T5K = VFNMS(LDK(KP923879532), T4L, T4E); + } + { + V T4P, T4S, T33, T34; + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4S = VADD(T4Q, T4R); + T4T = VFMA(LDK(KP923879532), T4S, T4P); + T5L = VFNMS(LDK(KP923879532), T4S, T4P); + T33 = VADD(T13, T16); + T34 = VADD(T1a, T1d); + T35 = VADD(T33, T34); + T3F = VSUB(T33, T34); + } + } + { + V T7n, T7o, T7p, T7q, T7r, T7s, T7t, T7u, T7w, T7y, T7A, T7B, T7D, T7G, T7H; + V T7J; + { + V T3t, T3x, T3w, T3y; + { + V T3r, T3s, T3u, T3v; + T3r = VADD(T2V, T2Y); + T3s = VADD(T3i, T3l); + T3t = VSUB(T3r, T3s); + T3x = VADD(T3r, T3s); + T3u = VADD(T32, T35); + T3v = VADD(T39, T3c); + T3w = VSUB(T3u, T3v); + T3y = VADD(T3u, T3v); + } + T7n = VFNMSI(T3w, T3t); + STM2(&(xo[96]), T7n, ovs, &(xo[0])); + T7o = VADD(T3x, T3y); + STM2(&(xo[0]), T7o, ovs, &(xo[0])); + T7p = VFMAI(T3w, T3t); + STM2(&(xo[32]), T7p, ovs, &(xo[0])); + T7q = VSUB(T3x, T3y); + STM2(&(xo[64]), T7q, ovs, &(xo[0])); + } + { + V T2Z, T3m, T3e, T3n, T36, T3d; + T2Z = VSUB(T2V, T2Y); + T3m = VSUB(T3i, T3l); + T36 = VSUB(T32, T35); + T3d = VSUB(T39, T3c); + T3e = VADD(T36, T3d); + T3n = VSUB(T36, T3d); + { + V T3f, T3o, T3p, T3q; + T3f = VFNMS(LDK(KP707106781), T3e, T2Z); + T3o = VFNMS(LDK(KP707106781), T3n, T3m); + T7r = VFNMSI(T3o, T3f); + STM2(&(xo[48]), T7r, ovs, &(xo[0])); + T7s = VFMAI(T3o, T3f); + STM2(&(xo[80]), T7s, ovs, &(xo[0])); + T3p = VFMA(LDK(KP707106781), T3e, T2Z); + T3q = VFMA(LDK(KP707106781), T3n, T3m); + T7t = VFMAI(T3q, T3p); + STM2(&(xo[16]), T7t, ovs, &(xo[0])); + T7u = VFNMSI(T3q, T3p); + STM2(&(xo[112]), T7u, ovs, &(xo[0])); + } + } + { + V T7v, T7x, T7z, T7C; + { + V T3D, T3V, T3O, T3Y, T3K, T3Z, T3R, T3W, T3C, T3N; + T3C = VADD(T3A, T3B); + T3D = VFMA(LDK(KP707106781), T3C, T3z); + T3V = VFNMS(LDK(KP707106781), T3C, T3z); + T3N = VSUB(T3A, T3B); + T3O = VFMA(LDK(KP707106781), T3N, T3M); + T3Y = VFNMS(LDK(KP707106781), T3N, T3M); + { + V T3G, T3J, T3P, T3Q; + T3G = VFNMS(LDK(KP414213562), T3F, T3E); + T3J = VFNMS(LDK(KP414213562), T3I, T3H); + T3K = VADD(T3G, T3J); + T3Z = VSUB(T3G, T3J); + T3P = VFMA(LDK(KP414213562), T3E, T3F); + T3Q = VFMA(LDK(KP414213562), T3H, T3I); + T3R = VSUB(T3P, T3Q); + T3W = VADD(T3P, T3Q); + } + { + V T3L, T3S, T41, T42; + T3L = VFNMS(LDK(KP923879532), T3K, T3D); + T3S = VFNMS(LDK(KP923879532), T3R, T3O); + T7v = VFNMSI(T3S, T3L); + STM2(&(xo[56]), T7v, ovs, &(xo[0])); + T7w = VFMAI(T3S, T3L); + STM2(&(xo[72]), T7w, ovs, &(xo[0])); + T41 = VFMA(LDK(KP923879532), T3W, T3V); + T42 = VFNMS(LDK(KP923879532), T3Z, T3Y); + T7x = VFNMSI(T42, T41); + STM2(&(xo[24]), T7x, ovs, &(xo[0])); + T7y = VFMAI(T42, T41); + STM2(&(xo[104]), T7y, ovs, &(xo[0])); + } + { + V T3T, T3U, T3X, T40; + T3T = VFMA(LDK(KP923879532), T3K, T3D); + T3U = VFMA(LDK(KP923879532), T3R, T3O); + T7z = VFNMSI(T3U, T3T); + STM2(&(xo[120]), T7z, ovs, &(xo[0])); + T7A = VFMAI(T3U, T3T); + STM2(&(xo[8]), T7A, ovs, &(xo[0])); + T3X = VFNMS(LDK(KP923879532), T3W, T3V); + T40 = VFMA(LDK(KP923879532), T3Z, T3Y); + T7B = VFMAI(T40, T3X); + STM2(&(xo[40]), T7B, ovs, &(xo[0])); + T7C = VFNMSI(T40, T3X); + STM2(&(xo[88]), T7C, ovs, &(xo[0])); + } + } + { + V T6X, T7f, T7b, T7g, T74, T7j, T78, T7i; + { + V T6V, T6W, T79, T7a; + T6V = VFMA(LDK(KP923879532), T6a, T69); + T6W = VADD(T6D, T6E); + T6X = VFMA(LDK(KP831469612), T6W, T6V); + T7f = VFNMS(LDK(KP831469612), T6W, T6V); + T79 = VFNMS(LDK(KP303346683), T6Y, T6Z); + T7a = VFNMS(LDK(KP303346683), T71, T72); + T7b = VSUB(T79, T7a); + T7g = VADD(T79, T7a); + } + { + V T70, T73, T76, T77; + T70 = VFMA(LDK(KP303346683), T6Z, T6Y); + T73 = VFMA(LDK(KP303346683), T72, T71); + T74 = VADD(T70, T73); + T7j = VSUB(T70, T73); + T76 = VFNMS(LDK(KP923879532), T6B, T6A); + T77 = VSUB(T6e, T6h); + T78 = VFMA(LDK(KP831469612), T77, T76); + T7i = VFNMS(LDK(KP831469612), T77, T76); + } + { + V T75, T7c, T7E, T7l, T7m, T7F; + T75 = VFNMS(LDK(KP956940335), T74, T6X); + T7c = VFNMS(LDK(KP956940335), T7b, T78); + T7D = VFNMSI(T7c, T75); + STM2(&(xo[70]), T7D, ovs, &(xo[2])); + T7E = VFMAI(T7c, T75); + STM2(&(xo[58]), T7E, ovs, &(xo[2])); + STN2(&(xo[56]), T7v, T7E, ovs); + T7l = VFNMS(LDK(KP956940335), T7g, T7f); + T7m = VFMA(LDK(KP956940335), T7j, T7i); + T7F = VFMAI(T7m, T7l); + STM2(&(xo[26]), T7F, ovs, &(xo[2])); + STN2(&(xo[24]), T7x, T7F, ovs); + T7G = VFNMSI(T7m, T7l); + STM2(&(xo[102]), T7G, ovs, &(xo[2])); + } + { + V T7d, T7e, T7I, T7h, T7k, T7K; + T7d = VFMA(LDK(KP956940335), T74, T6X); + T7e = VFMA(LDK(KP956940335), T7b, T78); + T7H = VFNMSI(T7e, T7d); + STM2(&(xo[6]), T7H, ovs, &(xo[2])); + T7I = VFMAI(T7e, T7d); + STM2(&(xo[122]), T7I, ovs, &(xo[2])); + STN2(&(xo[120]), T7z, T7I, ovs); + T7h = VFMA(LDK(KP956940335), T7g, T7f); + T7k = VFNMS(LDK(KP956940335), T7j, T7i); + T7J = VFNMSI(T7k, T7h); + STM2(&(xo[38]), T7J, ovs, &(xo[2])); + T7K = VFMAI(T7k, T7h); + STM2(&(xo[90]), T7K, ovs, &(xo[2])); + STN2(&(xo[88]), T7C, T7K, ovs); + } + } + } + { + V T7L, T7N, T7P, T7S; + { + V TT, T2j, T2f, T2k, T1Y, T2n, T2c, T2m; + { + V Tn, TS, T2d, T2e; + Tn = VFMA(LDK(KP707106781), Tm, T7); + TS = VADD(TC, TR); + TT = VFMA(LDK(KP923879532), TS, Tn); + T2j = VFNMS(LDK(KP923879532), TS, Tn); + T2d = VFMA(LDK(KP198912367), T1g, T1p); + T2e = VFMA(LDK(KP198912367), T1N, T1W); + T2f = VSUB(T2d, T2e); + T2k = VADD(T2d, T2e); + } + { + V T1q, T1X, T28, T2b; + T1q = VFNMS(LDK(KP198912367), T1p, T1g); + T1X = VFNMS(LDK(KP198912367), T1W, T1N); + T1Y = VADD(T1q, T1X); + T2n = VSUB(T1q, T1X); + T28 = VFMA(LDK(KP707106781), T27, T26); + T2b = VSUB(T29, T2a); + T2c = VFMA(LDK(KP923879532), T2b, T28); + T2m = VFNMS(LDK(KP923879532), T2b, T28); + } + { + V T1Z, T2g, T7M, T2p, T2q, T7O; + T1Z = VFNMS(LDK(KP980785280), T1Y, TT); + T2g = VFNMS(LDK(KP980785280), T2f, T2c); + T7L = VFNMSI(T2g, T1Z); + STM2(&(xo[60]), T7L, ovs, &(xo[0])); + T7M = VFMAI(T2g, T1Z); + STM2(&(xo[68]), T7M, ovs, &(xo[0])); + STN2(&(xo[68]), T7M, T7D, ovs); + T2p = VFMA(LDK(KP980785280), T2k, T2j); + T2q = VFNMS(LDK(KP980785280), T2n, T2m); + T7N = VFNMSI(T2q, T2p); + STM2(&(xo[28]), T7N, ovs, &(xo[0])); + T7O = VFMAI(T2q, T2p); + STM2(&(xo[100]), T7O, ovs, &(xo[0])); + STN2(&(xo[100]), T7O, T7G, ovs); + } + { + V T2h, T2i, T7Q, T2l, T2o, T7R; + T2h = VFMA(LDK(KP980785280), T1Y, TT); + T2i = VFMA(LDK(KP980785280), T2f, T2c); + T7P = VFNMSI(T2i, T2h); + STM2(&(xo[124]), T7P, ovs, &(xo[0])); + T7Q = VFMAI(T2i, T2h); + STM2(&(xo[4]), T7Q, ovs, &(xo[0])); + STN2(&(xo[4]), T7Q, T7H, ovs); + T2l = VFNMS(LDK(KP980785280), T2k, T2j); + T2o = VFMA(LDK(KP980785280), T2n, T2m); + T7R = VFMAI(T2o, T2l); + STM2(&(xo[36]), T7R, ovs, &(xo[0])); + STN2(&(xo[36]), T7R, T7J, ovs); + T7S = VFNMSI(T2o, T2l); + STM2(&(xo[92]), T7S, ovs, &(xo[0])); + } + } + { + V T4z, T5z, T5v, T5A, T5g, T5D, T5s, T5C; + { + V T4f, T4y, T5t, T5u; + T4f = VFMA(LDK(KP923879532), T4e, T47); + T4y = VADD(T4o, T4x); + T4z = VFMA(LDK(KP980785280), T4y, T4f); + T5z = VFNMS(LDK(KP980785280), T4y, T4f); + T5t = VFMA(LDK(KP098491403), T4M, T4T); + T5u = VFMA(LDK(KP098491403), T57, T5e); + T5v = VSUB(T5t, T5u); + T5A = VADD(T5t, T5u); + } + { + V T4U, T5f, T5o, T5r; + T4U = VFNMS(LDK(KP098491403), T4T, T4M); + T5f = VFNMS(LDK(KP098491403), T5e, T57); + T5g = VADD(T4U, T5f); + T5D = VSUB(T4U, T5f); + T5o = VFMA(LDK(KP923879532), T5n, T5k); + T5r = VSUB(T5p, T5q); + T5s = VFMA(LDK(KP980785280), T5r, T5o); + T5C = VFNMS(LDK(KP980785280), T5r, T5o); + } + { + V T5h, T5w, T7T, T7U; + T5h = VFNMS(LDK(KP995184726), T5g, T4z); + T5w = VFNMS(LDK(KP995184726), T5v, T5s); + T7T = VFNMSI(T5w, T5h); + STM2(&(xo[62]), T7T, ovs, &(xo[2])); + STN2(&(xo[60]), T7L, T7T, ovs); + T7U = VFMAI(T5w, T5h); + STM2(&(xo[66]), T7U, ovs, &(xo[2])); + STN2(&(xo[64]), T7q, T7U, ovs); + } + { + V T5F, T5G, T7V, T7W; + T5F = VFMA(LDK(KP995184726), T5A, T5z); + T5G = VFNMS(LDK(KP995184726), T5D, T5C); + T7V = VFNMSI(T5G, T5F); + STM2(&(xo[30]), T7V, ovs, &(xo[2])); + STN2(&(xo[28]), T7N, T7V, ovs); + T7W = VFMAI(T5G, T5F); + STM2(&(xo[98]), T7W, ovs, &(xo[2])); + STN2(&(xo[96]), T7n, T7W, ovs); + } + { + V T5x, T5y, T7X, T7Y; + T5x = VFMA(LDK(KP995184726), T5g, T4z); + T5y = VFMA(LDK(KP995184726), T5v, T5s); + T7X = VFNMSI(T5y, T5x); + STM2(&(xo[126]), T7X, ovs, &(xo[2])); + STN2(&(xo[124]), T7P, T7X, ovs); + T7Y = VFMAI(T5y, T5x); + STM2(&(xo[2]), T7Y, ovs, &(xo[2])); + STN2(&(xo[0]), T7o, T7Y, ovs); + } + { + V T5B, T5E, T7Z, T80; + T5B = VFNMS(LDK(KP995184726), T5A, T5z); + T5E = VFMA(LDK(KP995184726), T5D, T5C); + T7Z = VFMAI(T5E, T5B); + STM2(&(xo[34]), T7Z, ovs, &(xo[2])); + STN2(&(xo[32]), T7p, T7Z, ovs); + T80 = VFNMSI(T5E, T5B); + STM2(&(xo[94]), T80, ovs, &(xo[2])); + STN2(&(xo[92]), T7S, T80, ovs); + } + } + } + { + V T81, T83, T85, T88; + { + V T6j, T6N, T6J, T6O, T6y, T6R, T6G, T6Q; + { + V T6b, T6i, T6H, T6I; + T6b = VFNMS(LDK(KP923879532), T6a, T69); + T6i = VADD(T6e, T6h); + T6j = VFNMS(LDK(KP831469612), T6i, T6b); + T6N = VFMA(LDK(KP831469612), T6i, T6b); + T6H = VFMA(LDK(KP534511135), T6m, T6p); + T6I = VFMA(LDK(KP534511135), T6t, T6w); + T6J = VSUB(T6H, T6I); + T6O = VADD(T6H, T6I); + } + { + V T6q, T6x, T6C, T6F; + T6q = VFNMS(LDK(KP534511135), T6p, T6m); + T6x = VFNMS(LDK(KP534511135), T6w, T6t); + T6y = VADD(T6q, T6x); + T6R = VSUB(T6q, T6x); + T6C = VFMA(LDK(KP923879532), T6B, T6A); + T6F = VSUB(T6D, T6E); + T6G = VFMA(LDK(KP831469612), T6F, T6C); + T6Q = VFNMS(LDK(KP831469612), T6F, T6C); + } + { + V T6z, T6K, T82, T6T, T6U, T84; + T6z = VFNMS(LDK(KP881921264), T6y, T6j); + T6K = VFNMS(LDK(KP881921264), T6J, T6G); + T81 = VFNMSI(T6K, T6z); + STM2(&(xo[54]), T81, ovs, &(xo[2])); + T82 = VFMAI(T6K, T6z); + STM2(&(xo[74]), T82, ovs, &(xo[2])); + STN2(&(xo[72]), T7w, T82, ovs); + T6T = VFMA(LDK(KP881921264), T6O, T6N); + T6U = VFNMS(LDK(KP881921264), T6R, T6Q); + T83 = VFNMSI(T6U, T6T); + STM2(&(xo[22]), T83, ovs, &(xo[2])); + T84 = VFMAI(T6U, T6T); + STM2(&(xo[106]), T84, ovs, &(xo[2])); + STN2(&(xo[104]), T7y, T84, ovs); + } + { + V T6L, T6M, T86, T6P, T6S, T87; + T6L = VFMA(LDK(KP881921264), T6y, T6j); + T6M = VFMA(LDK(KP881921264), T6J, T6G); + T85 = VFNMSI(T6M, T6L); + STM2(&(xo[118]), T85, ovs, &(xo[2])); + T86 = VFMAI(T6M, T6L); + STM2(&(xo[10]), T86, ovs, &(xo[2])); + STN2(&(xo[8]), T7A, T86, ovs); + T6P = VFNMS(LDK(KP881921264), T6O, T6N); + T6S = VFMA(LDK(KP881921264), T6R, T6Q); + T87 = VFMAI(T6S, T6P); + STM2(&(xo[42]), T87, ovs, &(xo[2])); + STN2(&(xo[40]), T7B, T87, ovs); + T88 = VFNMSI(T6S, T6P); + STM2(&(xo[86]), T88, ovs, &(xo[2])); + } + } + { + V T89, T8c, T8d, T8f; + { + V T2t, T2L, T2H, T2M, T2A, T2P, T2E, T2O; + { + V T2r, T2s, T2F, T2G; + T2r = VFNMS(LDK(KP707106781), Tm, T7); + T2s = VADD(T29, T2a); + T2t = VFMA(LDK(KP923879532), T2s, T2r); + T2L = VFNMS(LDK(KP923879532), T2s, T2r); + T2F = VFNMS(LDK(KP668178637), T2u, T2v); + T2G = VFNMS(LDK(KP668178637), T2x, T2y); + T2H = VSUB(T2F, T2G); + T2M = VADD(T2F, T2G); + } + { + V T2w, T2z, T2C, T2D; + T2w = VFMA(LDK(KP668178637), T2v, T2u); + T2z = VFMA(LDK(KP668178637), T2y, T2x); + T2A = VADD(T2w, T2z); + T2P = VSUB(T2w, T2z); + T2C = VFNMS(LDK(KP707106781), T27, T26); + T2D = VSUB(TC, TR); + T2E = VFNMS(LDK(KP923879532), T2D, T2C); + T2O = VFMA(LDK(KP923879532), T2D, T2C); + } + { + V T2B, T2I, T8a, T2R, T2S, T8b; + T2B = VFNMS(LDK(KP831469612), T2A, T2t); + T2I = VFNMS(LDK(KP831469612), T2H, T2E); + T89 = VFNMSI(T2I, T2B); + STM2(&(xo[76]), T89, ovs, &(xo[0])); + T8a = VFMAI(T2I, T2B); + STM2(&(xo[52]), T8a, ovs, &(xo[0])); + STN2(&(xo[52]), T8a, T81, ovs); + T2R = VFNMS(LDK(KP831469612), T2M, T2L); + T2S = VFMA(LDK(KP831469612), T2P, T2O); + T8b = VFMAI(T2S, T2R); + STM2(&(xo[20]), T8b, ovs, &(xo[0])); + STN2(&(xo[20]), T8b, T83, ovs); + T8c = VFNMSI(T2S, T2R); + STM2(&(xo[108]), T8c, ovs, &(xo[0])); + } + { + V T2J, T2K, T8e, T2N, T2Q, T8g; + T2J = VFMA(LDK(KP831469612), T2A, T2t); + T2K = VFMA(LDK(KP831469612), T2H, T2E); + T8d = VFNMSI(T2K, T2J); + STM2(&(xo[12]), T8d, ovs, &(xo[0])); + T8e = VFMAI(T2K, T2J); + STM2(&(xo[116]), T8e, ovs, &(xo[0])); + STN2(&(xo[116]), T8e, T85, ovs); + T2N = VFMA(LDK(KP831469612), T2M, T2L); + T2Q = VFNMS(LDK(KP831469612), T2P, T2O); + T8f = VFNMSI(T2Q, T2N); + STM2(&(xo[44]), T8f, ovs, &(xo[0])); + T8g = VFMAI(T2Q, T2N); + STM2(&(xo[84]), T8g, ovs, &(xo[0])); + STN2(&(xo[84]), T8g, T88, ovs); + } + } + { + V T5J, T61, T5X, T62, T5Q, T65, T5U, T64; + { + V T5H, T5I, T5V, T5W; + T5H = VFNMS(LDK(KP923879532), T4e, T47); + T5I = VADD(T5p, T5q); + T5J = VFMA(LDK(KP980785280), T5I, T5H); + T61 = VFNMS(LDK(KP980785280), T5I, T5H); + T5V = VFNMS(LDK(KP820678790), T5K, T5L); + T5W = VFNMS(LDK(KP820678790), T5N, T5O); + T5X = VSUB(T5V, T5W); + T62 = VADD(T5V, T5W); + } + { + V T5M, T5P, T5S, T5T; + T5M = VFMA(LDK(KP820678790), T5L, T5K); + T5P = VFMA(LDK(KP820678790), T5O, T5N); + T5Q = VADD(T5M, T5P); + T65 = VSUB(T5M, T5P); + T5S = VFNMS(LDK(KP923879532), T5n, T5k); + T5T = VSUB(T4o, T4x); + T5U = VFNMS(LDK(KP980785280), T5T, T5S); + T64 = VFMA(LDK(KP980785280), T5T, T5S); + } + { + V T5R, T5Y, T8h, T8i; + T5R = VFNMS(LDK(KP773010453), T5Q, T5J); + T5Y = VFNMS(LDK(KP773010453), T5X, T5U); + T8h = VFNMSI(T5Y, T5R); + STM2(&(xo[78]), T8h, ovs, &(xo[2])); + STN2(&(xo[76]), T89, T8h, ovs); + T8i = VFMAI(T5Y, T5R); + STM2(&(xo[50]), T8i, ovs, &(xo[2])); + STN2(&(xo[48]), T7r, T8i, ovs); + } + { + V T67, T68, T8j, T8k; + T67 = VFNMS(LDK(KP773010453), T62, T61); + T68 = VFMA(LDK(KP773010453), T65, T64); + T8j = VFMAI(T68, T67); + STM2(&(xo[18]), T8j, ovs, &(xo[2])); + STN2(&(xo[16]), T7t, T8j, ovs); + T8k = VFNMSI(T68, T67); + STM2(&(xo[110]), T8k, ovs, &(xo[2])); + STN2(&(xo[108]), T8c, T8k, ovs); + } + { + V T5Z, T60, T8l, T8m; + T5Z = VFMA(LDK(KP773010453), T5Q, T5J); + T60 = VFMA(LDK(KP773010453), T5X, T5U); + T8l = VFNMSI(T60, T5Z); + STM2(&(xo[14]), T8l, ovs, &(xo[2])); + STN2(&(xo[12]), T8d, T8l, ovs); + T8m = VFMAI(T60, T5Z); + STM2(&(xo[114]), T8m, ovs, &(xo[2])); + STN2(&(xo[112]), T7u, T8m, ovs); + } + { + V T63, T66, T8n, T8o; + T63 = VFMA(LDK(KP773010453), T62, T61); + T66 = VFNMS(LDK(KP773010453), T65, T64); + T8n = VFNMSI(T66, T63); + STM2(&(xo[46]), T8n, ovs, &(xo[2])); + STN2(&(xo[44]), T8f, T8n, ovs); + T8o = VFMAI(T66, T63); + STM2(&(xo[82]), T8o, ovs, &(xo[2])); + STN2(&(xo[80]), T7s, T8o, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n2bv_64"), {198, 0, 258, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_64) (planner *p) { + X(kdft_register) (p, n2bv_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 64 -name n2bv_64 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 456 FP additions, 124 FP multiplications, + * (or, 404 additions, 72 multiplications, 52 fused multiply/add), + * 128 stack variables, 15 constants, and 160 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T4p, T5u, Tb, T3A, T2q, T3v, T6G, T78, Tq, T3w, T6B, T79, T2l, T3B, T4w; + V T5r, TI, T2g, T6u, T74, T3q, T3D, T4E, T5o, TZ, T2h, T6x, T75, T3t, T3E; + V T4L, T5p, T23, T2N, T6m, T70, T6p, T71, T2c, T2O, T3i, T3Y, T5f, T5R, T5k; + V T5S, T3l, T3Z, T1s, T2K, T6f, T6X, T6i, T6Y, T1B, T2L, T3b, T3V, T4Y, T5O; + V T53, T5P, T3e, T3W; + { + V T3, T4n, T2p, T4o, T6, T5s, T9, T5t; + { + V T1, T2, T2n, T2o; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T4n = VADD(T1, T2); + T2n = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T2o = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T2p = VSUB(T2n, T2o); + T4o = VADD(T2n, T2o); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T5s = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T5t = VADD(T7, T8); + } + T4p = VSUB(T4n, T4o); + T5u = VSUB(T5s, T5t); + { + V Ta, T2m, T6E, T6F; + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VSUB(T3, Ta); + T3A = VADD(T3, Ta); + T2m = VMUL(LDK(KP707106781), VSUB(T6, T9)); + T2q = VSUB(T2m, T2p); + T3v = VADD(T2p, T2m); + T6E = VADD(T4n, T4o); + T6F = VADD(T5s, T5t); + T6G = VSUB(T6E, T6F); + T78 = VADD(T6E, T6F); + } + } + { + V Te, T4q, To, T4t, Th, T4r, Tl, T4u; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T4q = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T4t = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T4r = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T4u = VADD(Tj, Tk); + } + { + V Ti, Tp, T6z, T6A; + Ti = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + Tp = VFNMS(LDK(KP382683432), To, VMUL(LDK(KP923879532), Tl)); + Tq = VSUB(Ti, Tp); + T3w = VADD(Ti, Tp); + T6z = VADD(T4q, T4r); + T6A = VADD(T4t, T4u); + T6B = VSUB(T6z, T6A); + T79 = VADD(T6z, T6A); + } + { + V T2j, T2k, T4s, T4v; + T2j = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + T2k = VFMA(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T2l = VSUB(T2j, T2k); + T3B = VADD(T2j, T2k); + T4s = VSUB(T4q, T4r); + T4v = VSUB(T4t, T4u); + T4w = VMUL(LDK(KP707106781), VADD(T4s, T4v)); + T5r = VMUL(LDK(KP707106781), VSUB(T4s, T4v)); + } + } + { + V TB, T4z, TF, T4y, Ty, T4C, TG, T4B; + { + V Tz, TA, TD, TE; + Tz = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + TA = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + TB = VSUB(Tz, TA); + T4z = VADD(Tz, TA); + TD = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + TF = VSUB(TD, TE); + T4y = VADD(TD, TE); + { + V Ts, Tt, Tu, Tv, Tw, Tx; + Ts = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + Tu = VSUB(Ts, Tt); + Tv = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Ty = VMUL(LDK(KP707106781), VSUB(Tu, Tx)); + T4C = VADD(Tv, Tw); + TG = VMUL(LDK(KP707106781), VADD(Tu, Tx)); + T4B = VADD(Ts, Tt); + } + } + { + V TC, TH, T6s, T6t; + TC = VSUB(Ty, TB); + TH = VSUB(TF, TG); + TI = VFMA(LDK(KP831469612), TC, VMUL(LDK(KP555570233), TH)); + T2g = VFNMS(LDK(KP555570233), TC, VMUL(LDK(KP831469612), TH)); + T6s = VADD(T4y, T4z); + T6t = VADD(T4B, T4C); + T6u = VSUB(T6s, T6t); + T74 = VADD(T6s, T6t); + } + { + V T3o, T3p, T4A, T4D; + T3o = VADD(TB, Ty); + T3p = VADD(TF, TG); + T3q = VFMA(LDK(KP980785280), T3o, VMUL(LDK(KP195090322), T3p)); + T3D = VFNMS(LDK(KP195090322), T3o, VMUL(LDK(KP980785280), T3p)); + T4A = VSUB(T4y, T4z); + T4D = VSUB(T4B, T4C); + T4E = VFMA(LDK(KP382683432), T4A, VMUL(LDK(KP923879532), T4D)); + T5o = VFNMS(LDK(KP382683432), T4D, VMUL(LDK(KP923879532), T4A)); + } + } + { + V TS, T4J, TW, T4I, TP, T4G, TX, T4F; + { + V TQ, TR, TU, TV; + TQ = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TR = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TS = VSUB(TQ, TR); + T4J = VADD(TQ, TR); + TU = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TW = VSUB(TU, TV); + T4I = VADD(TU, TV); + { + V TJ, TK, TL, TM, TN, TO; + TJ = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + TL = VSUB(TJ, TK); + TM = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + T4G = VADD(TM, TN); + TX = VMUL(LDK(KP707106781), VADD(TL, TO)); + T4F = VADD(TJ, TK); + } + } + { + V TT, TY, T6v, T6w; + TT = VSUB(TP, TS); + TY = VSUB(TW, TX); + TZ = VFNMS(LDK(KP555570233), TY, VMUL(LDK(KP831469612), TT)); + T2h = VFMA(LDK(KP555570233), TT, VMUL(LDK(KP831469612), TY)); + T6v = VADD(T4I, T4J); + T6w = VADD(T4F, T4G); + T6x = VSUB(T6v, T6w); + T75 = VADD(T6v, T6w); + } + { + V T3r, T3s, T4H, T4K; + T3r = VADD(TS, TP); + T3s = VADD(TW, TX); + T3t = VFNMS(LDK(KP195090322), T3s, VMUL(LDK(KP980785280), T3r)); + T3E = VFMA(LDK(KP195090322), T3r, VMUL(LDK(KP980785280), T3s)); + T4H = VSUB(T4F, T4G); + T4K = VSUB(T4I, T4J); + T4L = VFNMS(LDK(KP382683432), T4K, VMUL(LDK(KP923879532), T4H)); + T5p = VFMA(LDK(KP923879532), T4K, VMUL(LDK(KP382683432), T4H)); + } + } + { + V T21, T5h, T26, T5g, T1Y, T5d, T27, T5c, T55, T56, T1J, T57, T29, T58, T59; + V T1Q, T5a, T2a; + { + V T1Z, T20, T24, T25; + T1Z = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T20 = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T21 = VSUB(T1Z, T20); + T5h = VADD(T1Z, T20); + T24 = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T25 = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T26 = VSUB(T24, T25); + T5g = VADD(T24, T25); + } + { + V T1S, T1T, T1U, T1V, T1W, T1X; + T1S = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1T = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T1U = VSUB(T1S, T1T); + T1V = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1W = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T1X = VSUB(T1V, T1W); + T1Y = VMUL(LDK(KP707106781), VSUB(T1U, T1X)); + T5d = VADD(T1V, T1W); + T27 = VMUL(LDK(KP707106781), VADD(T1U, T1X)); + T5c = VADD(T1S, T1T); + } + { + V T1F, T1I, T1M, T1P; + { + V T1D, T1E, T1G, T1H; + T1D = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1E = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1F = VSUB(T1D, T1E); + T55 = VADD(T1D, T1E); + T1G = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1H = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1I = VSUB(T1G, T1H); + T56 = VADD(T1G, T1H); + } + T1J = VFNMS(LDK(KP382683432), T1I, VMUL(LDK(KP923879532), T1F)); + T57 = VSUB(T55, T56); + T29 = VFMA(LDK(KP382683432), T1F, VMUL(LDK(KP923879532), T1I)); + { + V T1K, T1L, T1N, T1O; + T1K = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1L = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1M = VSUB(T1K, T1L); + T58 = VADD(T1K, T1L); + T1N = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1O = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T1P = VSUB(T1N, T1O); + T59 = VADD(T1N, T1O); + } + T1Q = VFMA(LDK(KP923879532), T1M, VMUL(LDK(KP382683432), T1P)); + T5a = VSUB(T58, T59); + T2a = VFNMS(LDK(KP382683432), T1M, VMUL(LDK(KP923879532), T1P)); + } + { + V T1R, T22, T6k, T6l; + T1R = VSUB(T1J, T1Q); + T22 = VSUB(T1Y, T21); + T23 = VSUB(T1R, T22); + T2N = VADD(T22, T1R); + T6k = VADD(T5g, T5h); + T6l = VADD(T5c, T5d); + T6m = VSUB(T6k, T6l); + T70 = VADD(T6k, T6l); + } + { + V T6n, T6o, T28, T2b; + T6n = VADD(T55, T56); + T6o = VADD(T58, T59); + T6p = VSUB(T6n, T6o); + T71 = VADD(T6n, T6o); + T28 = VSUB(T26, T27); + T2b = VSUB(T29, T2a); + T2c = VSUB(T28, T2b); + T2O = VADD(T28, T2b); + } + { + V T3g, T3h, T5b, T5e; + T3g = VADD(T26, T27); + T3h = VADD(T1J, T1Q); + T3i = VADD(T3g, T3h); + T3Y = VSUB(T3g, T3h); + T5b = VMUL(LDK(KP707106781), VSUB(T57, T5a)); + T5e = VSUB(T5c, T5d); + T5f = VSUB(T5b, T5e); + T5R = VADD(T5e, T5b); + } + { + V T5i, T5j, T3j, T3k; + T5i = VSUB(T5g, T5h); + T5j = VMUL(LDK(KP707106781), VADD(T57, T5a)); + T5k = VSUB(T5i, T5j); + T5S = VADD(T5i, T5j); + T3j = VADD(T21, T1Y); + T3k = VADD(T29, T2a); + T3l = VADD(T3j, T3k); + T3Z = VSUB(T3k, T3j); + } + } + { + V T1q, T50, T1v, T4Z, T1n, T4W, T1w, T4V, T4O, T4P, T18, T4Q, T1y, T4R, T4S; + V T1f, T4T, T1z; + { + V T1o, T1p, T1t, T1u; + T1o = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T1p = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T1q = VSUB(T1o, T1p); + T50 = VADD(T1o, T1p); + T1t = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T1u = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T1v = VSUB(T1t, T1u); + T4Z = VADD(T1t, T1u); + } + { + V T1h, T1i, T1j, T1k, T1l, T1m; + T1h = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T1j = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T1m = VSUB(T1k, T1l); + T1n = VMUL(LDK(KP707106781), VSUB(T1j, T1m)); + T4W = VADD(T1k, T1l); + T1w = VMUL(LDK(KP707106781), VADD(T1j, T1m)); + T4V = VADD(T1h, T1i); + } + { + V T14, T17, T1b, T1e; + { + V T12, T13, T15, T16; + T12 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T13 = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T14 = VSUB(T12, T13); + T4O = VADD(T12, T13); + T15 = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T16 = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T17 = VSUB(T15, T16); + T4P = VADD(T15, T16); + } + T18 = VFNMS(LDK(KP382683432), T17, VMUL(LDK(KP923879532), T14)); + T4Q = VSUB(T4O, T4P); + T1y = VFMA(LDK(KP382683432), T14, VMUL(LDK(KP923879532), T17)); + { + V T19, T1a, T1c, T1d; + T19 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T1a = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T1b = VSUB(T19, T1a); + T4R = VADD(T19, T1a); + T1c = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T1d = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T1e = VSUB(T1c, T1d); + T4S = VADD(T1c, T1d); + } + T1f = VFMA(LDK(KP923879532), T1b, VMUL(LDK(KP382683432), T1e)); + T4T = VSUB(T4R, T4S); + T1z = VFNMS(LDK(KP382683432), T1b, VMUL(LDK(KP923879532), T1e)); + } + { + V T1g, T1r, T6d, T6e; + T1g = VSUB(T18, T1f); + T1r = VSUB(T1n, T1q); + T1s = VSUB(T1g, T1r); + T2K = VADD(T1r, T1g); + T6d = VADD(T4Z, T50); + T6e = VADD(T4V, T4W); + T6f = VSUB(T6d, T6e); + T6X = VADD(T6d, T6e); + } + { + V T6g, T6h, T1x, T1A; + T6g = VADD(T4O, T4P); + T6h = VADD(T4R, T4S); + T6i = VSUB(T6g, T6h); + T6Y = VADD(T6g, T6h); + T1x = VSUB(T1v, T1w); + T1A = VSUB(T1y, T1z); + T1B = VSUB(T1x, T1A); + T2L = VADD(T1x, T1A); + } + { + V T39, T3a, T4U, T4X; + T39 = VADD(T1v, T1w); + T3a = VADD(T18, T1f); + T3b = VADD(T39, T3a); + T3V = VSUB(T39, T3a); + T4U = VMUL(LDK(KP707106781), VSUB(T4Q, T4T)); + T4X = VSUB(T4V, T4W); + T4Y = VSUB(T4U, T4X); + T5O = VADD(T4X, T4U); + } + { + V T51, T52, T3c, T3d; + T51 = VSUB(T4Z, T50); + T52 = VMUL(LDK(KP707106781), VADD(T4Q, T4T)); + T53 = VSUB(T51, T52); + T5P = VADD(T51, T52); + T3c = VADD(T1q, T1n); + T3d = VADD(T1y, T1z); + T3e = VADD(T3c, T3d); + T3W = VSUB(T3d, T3c); + } + } + { + V T7n, T7o, T7p, T7q, T7r, T7s, T7t, T7u, T7v, T7w, T7x, T7y, T7z, T7A, T7B; + V T7C, T7D, T7E, T7F, T7G, T7H, T7I, T7J, T7K; + { + V T7h, T7l, T7k, T7m; + { + V T7f, T7g, T7i, T7j; + T7f = VADD(T78, T79); + T7g = VADD(T74, T75); + T7h = VSUB(T7f, T7g); + T7l = VADD(T7f, T7g); + T7i = VADD(T6X, T6Y); + T7j = VADD(T70, T71); + T7k = VBYI(VSUB(T7i, T7j)); + T7m = VADD(T7i, T7j); + } + T7n = VSUB(T7h, T7k); + STM2(&(xo[96]), T7n, ovs, &(xo[0])); + T7o = VADD(T7l, T7m); + STM2(&(xo[0]), T7o, ovs, &(xo[0])); + T7p = VADD(T7h, T7k); + STM2(&(xo[32]), T7p, ovs, &(xo[0])); + T7q = VSUB(T7l, T7m); + STM2(&(xo[64]), T7q, ovs, &(xo[0])); + } + { + V T76, T7a, T73, T7b, T6Z, T72; + T76 = VSUB(T74, T75); + T7a = VSUB(T78, T79); + T6Z = VSUB(T6X, T6Y); + T72 = VSUB(T70, T71); + T73 = VMUL(LDK(KP707106781), VSUB(T6Z, T72)); + T7b = VMUL(LDK(KP707106781), VADD(T6Z, T72)); + { + V T77, T7c, T7d, T7e; + T77 = VBYI(VSUB(T73, T76)); + T7c = VSUB(T7a, T7b); + T7r = VADD(T77, T7c); + STM2(&(xo[48]), T7r, ovs, &(xo[0])); + T7s = VSUB(T7c, T77); + STM2(&(xo[80]), T7s, ovs, &(xo[0])); + T7d = VBYI(VADD(T76, T73)); + T7e = VADD(T7a, T7b); + T7t = VADD(T7d, T7e); + STM2(&(xo[16]), T7t, ovs, &(xo[0])); + T7u = VSUB(T7e, T7d); + STM2(&(xo[112]), T7u, ovs, &(xo[0])); + } + } + { + V T6C, T6S, T6I, T6P, T6r, T6Q, T6L, T6T, T6y, T6H; + T6y = VMUL(LDK(KP707106781), VSUB(T6u, T6x)); + T6C = VSUB(T6y, T6B); + T6S = VADD(T6B, T6y); + T6H = VMUL(LDK(KP707106781), VADD(T6u, T6x)); + T6I = VSUB(T6G, T6H); + T6P = VADD(T6G, T6H); + { + V T6j, T6q, T6J, T6K; + T6j = VFNMS(LDK(KP382683432), T6i, VMUL(LDK(KP923879532), T6f)); + T6q = VFMA(LDK(KP923879532), T6m, VMUL(LDK(KP382683432), T6p)); + T6r = VSUB(T6j, T6q); + T6Q = VADD(T6j, T6q); + T6J = VFMA(LDK(KP382683432), T6f, VMUL(LDK(KP923879532), T6i)); + T6K = VFNMS(LDK(KP382683432), T6m, VMUL(LDK(KP923879532), T6p)); + T6L = VSUB(T6J, T6K); + T6T = VADD(T6J, T6K); + } + { + V T6D, T6M, T6V, T6W; + T6D = VBYI(VSUB(T6r, T6C)); + T6M = VSUB(T6I, T6L); + T7v = VADD(T6D, T6M); + STM2(&(xo[40]), T7v, ovs, &(xo[0])); + T7w = VSUB(T6M, T6D); + STM2(&(xo[88]), T7w, ovs, &(xo[0])); + T6V = VSUB(T6P, T6Q); + T6W = VBYI(VSUB(T6T, T6S)); + T7x = VSUB(T6V, T6W); + STM2(&(xo[72]), T7x, ovs, &(xo[0])); + T7y = VADD(T6V, T6W); + STM2(&(xo[56]), T7y, ovs, &(xo[0])); + } + { + V T6N, T6O, T6R, T6U; + T6N = VBYI(VADD(T6C, T6r)); + T6O = VADD(T6I, T6L); + T7z = VADD(T6N, T6O); + STM2(&(xo[24]), T7z, ovs, &(xo[0])); + T7A = VSUB(T6O, T6N); + STM2(&(xo[104]), T7A, ovs, &(xo[0])); + T6R = VADD(T6P, T6Q); + T6U = VBYI(VADD(T6S, T6T)); + T7B = VSUB(T6R, T6U); + STM2(&(xo[120]), T7B, ovs, &(xo[0])); + T7C = VADD(T6R, T6U); + STM2(&(xo[8]), T7C, ovs, &(xo[0])); + } + } + { + V T5N, T68, T61, T69, T5U, T65, T5Y, T66; + { + V T5L, T5M, T5Z, T60; + T5L = VADD(T4p, T4w); + T5M = VADD(T5o, T5p); + T5N = VSUB(T5L, T5M); + T68 = VADD(T5L, T5M); + T5Z = VFNMS(LDK(KP195090322), T5O, VMUL(LDK(KP980785280), T5P)); + T60 = VFMA(LDK(KP195090322), T5R, VMUL(LDK(KP980785280), T5S)); + T61 = VSUB(T5Z, T60); + T69 = VADD(T5Z, T60); + } + { + V T5Q, T5T, T5W, T5X; + T5Q = VFMA(LDK(KP980785280), T5O, VMUL(LDK(KP195090322), T5P)); + T5T = VFNMS(LDK(KP195090322), T5S, VMUL(LDK(KP980785280), T5R)); + T5U = VSUB(T5Q, T5T); + T65 = VADD(T5Q, T5T); + T5W = VADD(T4E, T4L); + T5X = VADD(T5u, T5r); + T5Y = VSUB(T5W, T5X); + T66 = VADD(T5X, T5W); + } + { + V T5V, T62, T6b, T6c; + T5V = VADD(T5N, T5U); + T62 = VBYI(VADD(T5Y, T61)); + T7D = VSUB(T5V, T62); + STM2(&(xo[100]), T7D, ovs, &(xo[0])); + T7E = VADD(T5V, T62); + STM2(&(xo[28]), T7E, ovs, &(xo[0])); + T6b = VBYI(VADD(T66, T65)); + T6c = VADD(T68, T69); + T7F = VADD(T6b, T6c); + STM2(&(xo[4]), T7F, ovs, &(xo[0])); + T7G = VSUB(T6c, T6b); + STM2(&(xo[124]), T7G, ovs, &(xo[0])); + } + { + V T63, T64, T67, T6a; + T63 = VSUB(T5N, T5U); + T64 = VBYI(VSUB(T61, T5Y)); + T7H = VSUB(T63, T64); + STM2(&(xo[92]), T7H, ovs, &(xo[0])); + T7I = VADD(T63, T64); + STM2(&(xo[36]), T7I, ovs, &(xo[0])); + T67 = VBYI(VSUB(T65, T66)); + T6a = VSUB(T68, T69); + T7J = VADD(T67, T6a); + STM2(&(xo[60]), T7J, ovs, &(xo[0])); + T7K = VSUB(T6a, T67); + STM2(&(xo[68]), T7K, ovs, &(xo[0])); + } + } + { + V T7M, T7O, T7P, T7R; + { + V T11, T2C, T2v, T2D, T2e, T2z, T2s, T2A; + { + V Tr, T10, T2t, T2u; + Tr = VSUB(Tb, Tq); + T10 = VSUB(TI, TZ); + T11 = VSUB(Tr, T10); + T2C = VADD(Tr, T10); + T2t = VFNMS(LDK(KP471396736), T1s, VMUL(LDK(KP881921264), T1B)); + T2u = VFMA(LDK(KP471396736), T23, VMUL(LDK(KP881921264), T2c)); + T2v = VSUB(T2t, T2u); + T2D = VADD(T2t, T2u); + } + { + V T1C, T2d, T2i, T2r; + T1C = VFMA(LDK(KP881921264), T1s, VMUL(LDK(KP471396736), T1B)); + T2d = VFNMS(LDK(KP471396736), T2c, VMUL(LDK(KP881921264), T23)); + T2e = VSUB(T1C, T2d); + T2z = VADD(T1C, T2d); + T2i = VSUB(T2g, T2h); + T2r = VSUB(T2l, T2q); + T2s = VSUB(T2i, T2r); + T2A = VADD(T2r, T2i); + } + { + V T2f, T2w, T7L, T2F, T2G, T7N; + T2f = VADD(T11, T2e); + T2w = VBYI(VADD(T2s, T2v)); + T7L = VSUB(T2f, T2w); + STM2(&(xo[106]), T7L, ovs, &(xo[2])); + STN2(&(xo[104]), T7A, T7L, ovs); + T7M = VADD(T2f, T2w); + STM2(&(xo[22]), T7M, ovs, &(xo[2])); + T2F = VBYI(VADD(T2A, T2z)); + T2G = VADD(T2C, T2D); + T7N = VADD(T2F, T2G); + STM2(&(xo[10]), T7N, ovs, &(xo[2])); + STN2(&(xo[8]), T7C, T7N, ovs); + T7O = VSUB(T2G, T2F); + STM2(&(xo[118]), T7O, ovs, &(xo[2])); + } + { + V T2x, T2y, T7Q, T2B, T2E, T7S; + T2x = VSUB(T11, T2e); + T2y = VBYI(VSUB(T2v, T2s)); + T7P = VSUB(T2x, T2y); + STM2(&(xo[86]), T7P, ovs, &(xo[2])); + T7Q = VADD(T2x, T2y); + STM2(&(xo[42]), T7Q, ovs, &(xo[2])); + STN2(&(xo[40]), T7v, T7Q, ovs); + T2B = VBYI(VSUB(T2z, T2A)); + T2E = VSUB(T2C, T2D); + T7R = VADD(T2B, T2E); + STM2(&(xo[54]), T7R, ovs, &(xo[2])); + T7S = VSUB(T2E, T2B); + STM2(&(xo[74]), T7S, ovs, &(xo[2])); + STN2(&(xo[72]), T7x, T7S, ovs); + } + } + { + V T3n, T3O, T3J, T3R, T3y, T3Q, T3G, T3N; + { + V T3f, T3m, T3H, T3I; + T3f = VFNMS(LDK(KP098017140), T3e, VMUL(LDK(KP995184726), T3b)); + T3m = VFMA(LDK(KP995184726), T3i, VMUL(LDK(KP098017140), T3l)); + T3n = VSUB(T3f, T3m); + T3O = VADD(T3f, T3m); + T3H = VFMA(LDK(KP098017140), T3b, VMUL(LDK(KP995184726), T3e)); + T3I = VFNMS(LDK(KP098017140), T3i, VMUL(LDK(KP995184726), T3l)); + T3J = VSUB(T3H, T3I); + T3R = VADD(T3H, T3I); + } + { + V T3u, T3x, T3C, T3F; + T3u = VADD(T3q, T3t); + T3x = VADD(T3v, T3w); + T3y = VSUB(T3u, T3x); + T3Q = VADD(T3x, T3u); + T3C = VADD(T3A, T3B); + T3F = VADD(T3D, T3E); + T3G = VSUB(T3C, T3F); + T3N = VADD(T3C, T3F); + } + { + V T3z, T3K, T7T, T7U; + T3z = VBYI(VSUB(T3n, T3y)); + T3K = VSUB(T3G, T3J); + T7T = VADD(T3z, T3K); + STM2(&(xo[34]), T7T, ovs, &(xo[2])); + STN2(&(xo[32]), T7p, T7T, ovs); + T7U = VSUB(T3K, T3z); + STM2(&(xo[94]), T7U, ovs, &(xo[2])); + STN2(&(xo[92]), T7H, T7U, ovs); + } + { + V T3T, T3U, T7V, T7W; + T3T = VSUB(T3N, T3O); + T3U = VBYI(VSUB(T3R, T3Q)); + T7V = VSUB(T3T, T3U); + STM2(&(xo[66]), T7V, ovs, &(xo[2])); + STN2(&(xo[64]), T7q, T7V, ovs); + T7W = VADD(T3T, T3U); + STM2(&(xo[62]), T7W, ovs, &(xo[2])); + STN2(&(xo[60]), T7J, T7W, ovs); + } + { + V T3L, T3M, T7X, T7Y; + T3L = VBYI(VADD(T3y, T3n)); + T3M = VADD(T3G, T3J); + T7X = VADD(T3L, T3M); + STM2(&(xo[30]), T7X, ovs, &(xo[2])); + STN2(&(xo[28]), T7E, T7X, ovs); + T7Y = VSUB(T3M, T3L); + STM2(&(xo[98]), T7Y, ovs, &(xo[2])); + STN2(&(xo[96]), T7n, T7Y, ovs); + } + { + V T3P, T3S, T7Z, T80; + T3P = VADD(T3N, T3O); + T3S = VBYI(VADD(T3Q, T3R)); + T7Z = VSUB(T3P, T3S); + STM2(&(xo[126]), T7Z, ovs, &(xo[2])); + STN2(&(xo[124]), T7G, T7Z, ovs); + T80 = VADD(T3P, T3S); + STM2(&(xo[2]), T80, ovs, &(xo[2])); + STN2(&(xo[0]), T7o, T80, ovs); + } + } + { + V T81, T83, T86, T88; + { + V T4N, T5G, T5z, T5H, T5m, T5D, T5w, T5E; + { + V T4x, T4M, T5x, T5y; + T4x = VSUB(T4p, T4w); + T4M = VSUB(T4E, T4L); + T4N = VSUB(T4x, T4M); + T5G = VADD(T4x, T4M); + T5x = VFNMS(LDK(KP555570233), T4Y, VMUL(LDK(KP831469612), T53)); + T5y = VFMA(LDK(KP555570233), T5f, VMUL(LDK(KP831469612), T5k)); + T5z = VSUB(T5x, T5y); + T5H = VADD(T5x, T5y); + } + { + V T54, T5l, T5q, T5v; + T54 = VFMA(LDK(KP831469612), T4Y, VMUL(LDK(KP555570233), T53)); + T5l = VFNMS(LDK(KP555570233), T5k, VMUL(LDK(KP831469612), T5f)); + T5m = VSUB(T54, T5l); + T5D = VADD(T54, T5l); + T5q = VSUB(T5o, T5p); + T5v = VSUB(T5r, T5u); + T5w = VSUB(T5q, T5v); + T5E = VADD(T5v, T5q); + } + { + V T5n, T5A, T82, T5J, T5K, T84; + T5n = VADD(T4N, T5m); + T5A = VBYI(VADD(T5w, T5z)); + T81 = VSUB(T5n, T5A); + STM2(&(xo[108]), T81, ovs, &(xo[0])); + T82 = VADD(T5n, T5A); + STM2(&(xo[20]), T82, ovs, &(xo[0])); + STN2(&(xo[20]), T82, T7M, ovs); + T5J = VBYI(VADD(T5E, T5D)); + T5K = VADD(T5G, T5H); + T83 = VADD(T5J, T5K); + STM2(&(xo[12]), T83, ovs, &(xo[0])); + T84 = VSUB(T5K, T5J); + STM2(&(xo[116]), T84, ovs, &(xo[0])); + STN2(&(xo[116]), T84, T7O, ovs); + } + { + V T5B, T5C, T85, T5F, T5I, T87; + T5B = VSUB(T4N, T5m); + T5C = VBYI(VSUB(T5z, T5w)); + T85 = VSUB(T5B, T5C); + STM2(&(xo[84]), T85, ovs, &(xo[0])); + STN2(&(xo[84]), T85, T7P, ovs); + T86 = VADD(T5B, T5C); + STM2(&(xo[44]), T86, ovs, &(xo[0])); + T5F = VBYI(VSUB(T5D, T5E)); + T5I = VSUB(T5G, T5H); + T87 = VADD(T5F, T5I); + STM2(&(xo[52]), T87, ovs, &(xo[0])); + STN2(&(xo[52]), T87, T7R, ovs); + T88 = VSUB(T5I, T5F); + STM2(&(xo[76]), T88, ovs, &(xo[0])); + } + } + { + V T2J, T34, T2X, T35, T2Q, T31, T2U, T32; + { + V T2H, T2I, T2V, T2W; + T2H = VADD(Tb, Tq); + T2I = VADD(T2g, T2h); + T2J = VSUB(T2H, T2I); + T34 = VADD(T2H, T2I); + T2V = VFNMS(LDK(KP290284677), T2K, VMUL(LDK(KP956940335), T2L)); + T2W = VFMA(LDK(KP290284677), T2N, VMUL(LDK(KP956940335), T2O)); + T2X = VSUB(T2V, T2W); + T35 = VADD(T2V, T2W); + } + { + V T2M, T2P, T2S, T2T; + T2M = VFMA(LDK(KP956940335), T2K, VMUL(LDK(KP290284677), T2L)); + T2P = VFNMS(LDK(KP290284677), T2O, VMUL(LDK(KP956940335), T2N)); + T2Q = VSUB(T2M, T2P); + T31 = VADD(T2M, T2P); + T2S = VADD(TI, TZ); + T2T = VADD(T2q, T2l); + T2U = VSUB(T2S, T2T); + T32 = VADD(T2T, T2S); + } + { + V T2R, T2Y, T89, T8a; + T2R = VADD(T2J, T2Q); + T2Y = VBYI(VADD(T2U, T2X)); + T89 = VSUB(T2R, T2Y); + STM2(&(xo[102]), T89, ovs, &(xo[2])); + STN2(&(xo[100]), T7D, T89, ovs); + T8a = VADD(T2R, T2Y); + STM2(&(xo[26]), T8a, ovs, &(xo[2])); + STN2(&(xo[24]), T7z, T8a, ovs); + } + { + V T37, T38, T8b, T8c; + T37 = VBYI(VADD(T32, T31)); + T38 = VADD(T34, T35); + T8b = VADD(T37, T38); + STM2(&(xo[6]), T8b, ovs, &(xo[2])); + STN2(&(xo[4]), T7F, T8b, ovs); + T8c = VSUB(T38, T37); + STM2(&(xo[122]), T8c, ovs, &(xo[2])); + STN2(&(xo[120]), T7B, T8c, ovs); + } + { + V T2Z, T30, T8d, T8e; + T2Z = VSUB(T2J, T2Q); + T30 = VBYI(VSUB(T2X, T2U)); + T8d = VSUB(T2Z, T30); + STM2(&(xo[90]), T8d, ovs, &(xo[2])); + STN2(&(xo[88]), T7w, T8d, ovs); + T8e = VADD(T2Z, T30); + STM2(&(xo[38]), T8e, ovs, &(xo[2])); + STN2(&(xo[36]), T7I, T8e, ovs); + } + { + V T33, T36, T8f, T8g; + T33 = VBYI(VSUB(T31, T32)); + T36 = VSUB(T34, T35); + T8f = VADD(T33, T36); + STM2(&(xo[58]), T8f, ovs, &(xo[2])); + STN2(&(xo[56]), T7y, T8f, ovs); + T8g = VSUB(T36, T33); + STM2(&(xo[70]), T8g, ovs, &(xo[2])); + STN2(&(xo[68]), T7K, T8g, ovs); + } + } + { + V T41, T4g, T4b, T4j, T44, T4i, T48, T4f; + { + V T3X, T40, T49, T4a; + T3X = VFNMS(LDK(KP634393284), T3W, VMUL(LDK(KP773010453), T3V)); + T40 = VFMA(LDK(KP773010453), T3Y, VMUL(LDK(KP634393284), T3Z)); + T41 = VSUB(T3X, T40); + T4g = VADD(T3X, T40); + T49 = VFMA(LDK(KP634393284), T3V, VMUL(LDK(KP773010453), T3W)); + T4a = VFNMS(LDK(KP634393284), T3Y, VMUL(LDK(KP773010453), T3Z)); + T4b = VSUB(T49, T4a); + T4j = VADD(T49, T4a); + } + { + V T42, T43, T46, T47; + T42 = VSUB(T3D, T3E); + T43 = VSUB(T3w, T3v); + T44 = VSUB(T42, T43); + T4i = VADD(T43, T42); + T46 = VSUB(T3A, T3B); + T47 = VSUB(T3q, T3t); + T48 = VSUB(T46, T47); + T4f = VADD(T46, T47); + } + { + V T45, T4c, T8h, T8i; + T45 = VBYI(VSUB(T41, T44)); + T4c = VSUB(T48, T4b); + T8h = VADD(T45, T4c); + STM2(&(xo[46]), T8h, ovs, &(xo[2])); + STN2(&(xo[44]), T86, T8h, ovs); + T8i = VSUB(T4c, T45); + STM2(&(xo[82]), T8i, ovs, &(xo[2])); + STN2(&(xo[80]), T7s, T8i, ovs); + } + { + V T4l, T4m, T8j, T8k; + T4l = VSUB(T4f, T4g); + T4m = VBYI(VSUB(T4j, T4i)); + T8j = VSUB(T4l, T4m); + STM2(&(xo[78]), T8j, ovs, &(xo[2])); + STN2(&(xo[76]), T88, T8j, ovs); + T8k = VADD(T4l, T4m); + STM2(&(xo[50]), T8k, ovs, &(xo[2])); + STN2(&(xo[48]), T7r, T8k, ovs); + } + { + V T4d, T4e, T8l, T8m; + T4d = VBYI(VADD(T44, T41)); + T4e = VADD(T48, T4b); + T8l = VADD(T4d, T4e); + STM2(&(xo[18]), T8l, ovs, &(xo[2])); + STN2(&(xo[16]), T7t, T8l, ovs); + T8m = VSUB(T4e, T4d); + STM2(&(xo[110]), T8m, ovs, &(xo[2])); + STN2(&(xo[108]), T81, T8m, ovs); + } + { + V T4h, T4k, T8n, T8o; + T4h = VADD(T4f, T4g); + T4k = VBYI(VADD(T4i, T4j)); + T8n = VSUB(T4h, T4k); + STM2(&(xo[114]), T8n, ovs, &(xo[2])); + STN2(&(xo[112]), T7u, T8n, ovs); + T8o = VADD(T4h, T4k); + STM2(&(xo[14]), T8o, ovs, &(xo[2])); + STN2(&(xo[12]), T83, T8o, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n2bv_64"), {404, 72, 52, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_64) (planner *p) { + X(kdft_register) (p, n2bv_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_8.c new file mode 100644 index 000000000..576f81de6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2bv_8.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 8 -name n2bv_8 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 26 FP additions, 10 FP multiplications, + * (or, 16 additions, 0 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 20 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tj, Te, Tk, Ta, Tn, Tf, Tm, Tr, Tu; + { + V T1, T2, Tc, Td; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tj = VADD(T1, T2); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Ta = VADD(T6, T9); + Tn = VADD(T7, T8); + Tf = VSUB(T6, T9); + Tm = VADD(T4, T5); + } + } + { + V Ts, Tb, Tg, Tp, Tq, Tt; + Tb = VFNMS(LDK(KP707106781), Ta, T3); + Tg = VFNMS(LDK(KP707106781), Tf, Te); + Tr = VFNMSI(Tg, Tb); + STM2(&(xo[6]), Tr, ovs, &(xo[2])); + Ts = VFMAI(Tg, Tb); + STM2(&(xo[10]), Ts, ovs, &(xo[2])); + Tp = VADD(Tj, Tk); + Tq = VADD(Tm, Tn); + Tt = VSUB(Tp, Tq); + STM2(&(xo[8]), Tt, ovs, &(xo[0])); + STN2(&(xo[8]), Tt, Ts, ovs); + Tu = VADD(Tp, Tq); + STM2(&(xo[0]), Tu, ovs, &(xo[0])); + } + { + V Tw, Th, Ti, Tv; + Th = VFMA(LDK(KP707106781), Ta, T3); + Ti = VFMA(LDK(KP707106781), Tf, Te); + Tv = VFMAI(Ti, Th); + STM2(&(xo[2]), Tv, ovs, &(xo[2])); + STN2(&(xo[0]), Tu, Tv, ovs); + Tw = VFNMSI(Ti, Th); + STM2(&(xo[14]), Tw, ovs, &(xo[2])); + { + V Tl, To, Tx, Ty; + Tl = VSUB(Tj, Tk); + To = VSUB(Tm, Tn); + Tx = VFNMSI(To, Tl); + STM2(&(xo[12]), Tx, ovs, &(xo[0])); + STN2(&(xo[12]), Tx, Tw, ovs); + Ty = VFMAI(To, Tl); + STM2(&(xo[4]), Ty, ovs, &(xo[0])); + STN2(&(xo[4]), Ty, Tr, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n2bv_8"), {16, 0, 10, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_8) (planner *p) { + X(kdft_register) (p, n2bv_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -sign 1 -n 8 -name n2bv_8 -with-ostride 2 -include dft/simd/n2b.h -store-multiple 2 */ + +/* + * This function contains 26 FP additions, 2 FP multiplications, + * (or, 26 additions, 2 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 20 memory accesses + */ +#include "dft/simd/n2b.h" + +static void n2bv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ii; + xo = io; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V Ta, Tk, Te, Tj, T7, Tn, Tf, Tm, Tr, Tu; + { + V T8, T9, Tc, Td; + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ta = VSUB(T8, T9); + Tk = VADD(T8, T9); + Tc = LD(&(xi[0]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tj = VADD(Tc, Td); + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + T4 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = VMUL(LDK(KP707106781), VSUB(T3, T6)); + Tn = VADD(T4, T5); + Tf = VMUL(LDK(KP707106781), VADD(T3, T6)); + Tm = VADD(T1, T2); + } + } + { + V Ts, Tb, Tg, Tp, Tq, Tt; + Tb = VBYI(VSUB(T7, Ta)); + Tg = VSUB(Te, Tf); + Tr = VADD(Tb, Tg); + STM2(&(xo[6]), Tr, ovs, &(xo[2])); + Ts = VSUB(Tg, Tb); + STM2(&(xo[10]), Ts, ovs, &(xo[2])); + Tp = VADD(Tj, Tk); + Tq = VADD(Tm, Tn); + Tt = VSUB(Tp, Tq); + STM2(&(xo[8]), Tt, ovs, &(xo[0])); + STN2(&(xo[8]), Tt, Ts, ovs); + Tu = VADD(Tp, Tq); + STM2(&(xo[0]), Tu, ovs, &(xo[0])); + } + { + V Tw, Th, Ti, Tv; + Th = VBYI(VADD(Ta, T7)); + Ti = VADD(Te, Tf); + Tv = VADD(Th, Ti); + STM2(&(xo[2]), Tv, ovs, &(xo[2])); + STN2(&(xo[0]), Tu, Tv, ovs); + Tw = VSUB(Ti, Th); + STM2(&(xo[14]), Tw, ovs, &(xo[2])); + { + V Tl, To, Tx, Ty; + Tl = VSUB(Tj, Tk); + To = VBYI(VSUB(Tm, Tn)); + Tx = VSUB(Tl, To); + STM2(&(xo[12]), Tx, ovs, &(xo[0])); + STN2(&(xo[12]), Tx, Tw, ovs); + Ty = VADD(Tl, To); + STM2(&(xo[4]), Ty, ovs, &(xo[0])); + STN2(&(xo[4]), Ty, Tr, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n2bv_8"), {26, 2, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2bv_8) (planner *p) { + X(kdft_register) (p, n2bv_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_10.c new file mode 100644 index 000000000..e5e604263 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_10.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name n2fv_10 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 42 FP additions, 22 FP multiplications, + * (or, 24 additions, 4 multiplications, 18 fused multiply/add), + * 36 stack variables, 4 constants, and 25 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V T3, Tr, Tm, Tn, TD, TC, Tu, Tx, Ty, Ta, Th, Ti, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tr = VADD(T1, T2); + { + V T6, Ts, Tg, Tw, T9, Tt, Td, Tv; + { + V T4, T5, Te, Tf; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Ts = VADD(T4, T5); + Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + Tw = VADD(Te, Tf); + } + { + V T7, T8, Tb, Tc; + T7 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tt = VADD(T7, T8); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Tv = VADD(Tb, Tc); + } + Tm = VSUB(T6, T9); + Tn = VSUB(Td, Tg); + TD = VSUB(Ts, Tt); + TC = VSUB(Tv, Tw); + Tu = VADD(Ts, Tt); + Tx = VADD(Tv, Tw); + Ty = VADD(Tu, Tx); + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + } + { + V TH, TI, TK, TL, TM; + TH = VADD(T3, Ti); + STM2(&(xo[10]), TH, ovs, &(xo[2])); + TI = VADD(Tr, Ty); + STM2(&(xo[0]), TI, ovs, &(xo[0])); + { + V To, Tq, Tl, Tp, Tj, Tk, TJ; + To = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tn, Tm)); + Tq = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tm, Tn)); + Tj = VFNMS(LDK(KP250000000), Ti, T3); + Tk = VSUB(Ta, Th); + Tl = VFMA(LDK(KP559016994), Tk, Tj); + Tp = VFNMS(LDK(KP559016994), Tk, Tj); + TJ = VFNMSI(To, Tl); + STM2(&(xo[2]), TJ, ovs, &(xo[2])); + STN2(&(xo[0]), TI, TJ, ovs); + TK = VFMAI(Tq, Tp); + STM2(&(xo[14]), TK, ovs, &(xo[2])); + TL = VFMAI(To, Tl); + STM2(&(xo[18]), TL, ovs, &(xo[2])); + TM = VFNMSI(Tq, Tp); + STM2(&(xo[6]), TM, ovs, &(xo[2])); + } + { + V TE, TG, TB, TF, Tz, TA; + TE = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TD, TC)); + TG = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TC, TD)); + Tz = VFNMS(LDK(KP250000000), Ty, Tr); + TA = VSUB(Tu, Tx); + TB = VFNMS(LDK(KP559016994), TA, Tz); + TF = VFMA(LDK(KP559016994), TA, Tz); + { + V TN, TO, TP, TQ; + TN = VFMAI(TE, TB); + STM2(&(xo[4]), TN, ovs, &(xo[0])); + STN2(&(xo[4]), TN, TM, ovs); + TO = VFNMSI(TG, TF); + STM2(&(xo[12]), TO, ovs, &(xo[0])); + STN2(&(xo[12]), TO, TK, ovs); + TP = VFNMSI(TE, TB); + STM2(&(xo[16]), TP, ovs, &(xo[0])); + STN2(&(xo[16]), TP, TL, ovs); + TQ = VFMAI(TG, TF); + STM2(&(xo[8]), TQ, ovs, &(xo[0])); + STN2(&(xo[8]), TQ, TH, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n2fv_10"), {24, 4, 18, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_10) (planner *p) { + X(kdft_register) (p, n2fv_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name n2fv_10 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 42 FP additions, 12 FP multiplications, + * (or, 36 additions, 6 multiplications, 6 fused multiply/add), + * 36 stack variables, 4 constants, and 25 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_10(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(20, is), MAKE_VOLATILE_STRIDE(20, os)) { + V Ti, Ty, Tm, Tn, Tw, Tt, Tz, TA, TB, T7, Te, Tj, Tg, Th; + Tg = LD(&(xi[0]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Ti = VSUB(Tg, Th); + Ty = VADD(Tg, Th); + { + V T3, Tu, Td, Ts, T6, Tv, Ta, Tr; + { + V T1, T2, Tb, Tc; + T1 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Tu = VADD(T1, T2); + Tb = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + Ts = VADD(Tb, Tc); + } + { + V T4, T5, T8, T9; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tv = VADD(T4, T5); + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + Tr = VADD(T8, T9); + } + Tm = VSUB(T3, T6); + Tn = VSUB(Ta, Td); + Tw = VSUB(Tu, Tv); + Tt = VSUB(Tr, Ts); + Tz = VADD(Tu, Tv); + TA = VADD(Tr, Ts); + TB = VADD(Tz, TA); + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + Tj = VADD(T7, Te); + } + { + V TH, TI, TK, TL, TM; + TH = VADD(Ti, Tj); + STM2(&(xo[10]), TH, ovs, &(xo[2])); + TI = VADD(Ty, TB); + STM2(&(xo[0]), TI, ovs, &(xo[0])); + { + V To, Tq, Tl, Tp, Tf, Tk, TJ; + To = VBYI(VFMA(LDK(KP951056516), Tm, VMUL(LDK(KP587785252), Tn))); + Tq = VBYI(VFNMS(LDK(KP587785252), Tm, VMUL(LDK(KP951056516), Tn))); + Tf = VMUL(LDK(KP559016994), VSUB(T7, Te)); + Tk = VFNMS(LDK(KP250000000), Tj, Ti); + Tl = VADD(Tf, Tk); + Tp = VSUB(Tk, Tf); + TJ = VSUB(Tl, To); + STM2(&(xo[2]), TJ, ovs, &(xo[2])); + STN2(&(xo[0]), TI, TJ, ovs); + TK = VADD(Tq, Tp); + STM2(&(xo[14]), TK, ovs, &(xo[2])); + TL = VADD(To, Tl); + STM2(&(xo[18]), TL, ovs, &(xo[2])); + TM = VSUB(Tp, Tq); + STM2(&(xo[6]), TM, ovs, &(xo[2])); + } + { + V Tx, TF, TE, TG, TC, TD; + Tx = VBYI(VFNMS(LDK(KP587785252), Tw, VMUL(LDK(KP951056516), Tt))); + TF = VBYI(VFMA(LDK(KP951056516), Tw, VMUL(LDK(KP587785252), Tt))); + TC = VFNMS(LDK(KP250000000), TB, Ty); + TD = VMUL(LDK(KP559016994), VSUB(Tz, TA)); + TE = VSUB(TC, TD); + TG = VADD(TD, TC); + { + V TN, TO, TP, TQ; + TN = VADD(Tx, TE); + STM2(&(xo[4]), TN, ovs, &(xo[0])); + STN2(&(xo[4]), TN, TM, ovs); + TO = VSUB(TG, TF); + STM2(&(xo[12]), TO, ovs, &(xo[0])); + STN2(&(xo[12]), TO, TK, ovs); + TP = VSUB(TE, Tx); + STM2(&(xo[16]), TP, ovs, &(xo[0])); + STN2(&(xo[16]), TP, TL, ovs); + TQ = VADD(TF, TG); + STM2(&(xo[8]), TQ, ovs, &(xo[0])); + STN2(&(xo[8]), TQ, TH, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 10, XSIMD_STRING("n2fv_10"), {36, 6, 6, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_10) (planner *p) { + X(kdft_register) (p, n2fv_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_12.c new file mode 100644 index 000000000..15c46d356 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_12.c @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name n2fv_12 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 48 FP additions, 20 FP multiplications, + * (or, 30 additions, 2 multiplications, 18 fused multiply/add), + * 33 stack variables, 2 constants, and 30 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TG, TF, TB, Tt, Ti, Tm, TJ, TI, TA, Tp; + { + V T1, T6, T4, Tr, T9, Ts; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tr = VSUB(T3, T2); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Ts = VSUB(T8, T7); + } + T5 = VFNMS(LDK(KP500000000), T4, T1); + Ta = VFNMS(LDK(KP500000000), T9, T6); + TG = VADD(T6, T9); + TF = VADD(T1, T4); + TB = VADD(Tr, Ts); + Tt = VSUB(Tr, Ts); + } + { + V Tk, Tn, Te, Tl, Th, To; + Tk = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tn = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Tc, Td, Tf, Tg; + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = VSUB(Tc, Td); + Tl = VADD(Td, Tc); + Tf = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Th = VSUB(Tf, Tg); + To = VADD(Tf, Tg); + } + Ti = VADD(Te, Th); + Tm = VFNMS(LDK(KP500000000), Tl, Tk); + TJ = VADD(Tn, To); + TI = VADD(Tk, Tl); + TA = VSUB(Te, Th); + Tp = VFNMS(LDK(KP500000000), To, Tn); + } + { + V TN, TO, TP, TQ, TT, TU; + { + V TH, TK, TL, TM; + TH = VSUB(TF, TG); + TK = VSUB(TI, TJ); + TN = VFNMSI(TK, TH); + STM2(&(xo[18]), TN, ovs, &(xo[2])); + TO = VFMAI(TK, TH); + STM2(&(xo[6]), TO, ovs, &(xo[2])); + TL = VADD(TF, TG); + TM = VADD(TI, TJ); + TP = VSUB(TL, TM); + STM2(&(xo[12]), TP, ovs, &(xo[0])); + TQ = VADD(TL, TM); + STM2(&(xo[0]), TQ, ovs, &(xo[0])); + } + { + V Tj, Tv, Tu, Tw, Tb, Tq, TR, TS; + Tb = VSUB(T5, Ta); + Tj = VFMA(LDK(KP866025403), Ti, Tb); + Tv = VFNMS(LDK(KP866025403), Ti, Tb); + Tq = VSUB(Tm, Tp); + Tu = VFNMS(LDK(KP866025403), Tt, Tq); + Tw = VFMA(LDK(KP866025403), Tt, Tq); + TR = VFNMSI(Tu, Tj); + STM2(&(xo[2]), TR, ovs, &(xo[2])); + STN2(&(xo[0]), TQ, TR, ovs); + TS = VFMAI(Tw, Tv); + STM2(&(xo[14]), TS, ovs, &(xo[2])); + STN2(&(xo[12]), TP, TS, ovs); + TT = VFMAI(Tu, Tj); + STM2(&(xo[22]), TT, ovs, &(xo[2])); + TU = VFNMSI(Tw, Tv); + STM2(&(xo[10]), TU, ovs, &(xo[2])); + } + { + V TC, TE, Tz, TD, Tx, Ty; + TC = VMUL(LDK(KP866025403), VSUB(TA, TB)); + TE = VMUL(LDK(KP866025403), VADD(TB, TA)); + Tx = VADD(T5, Ta); + Ty = VADD(Tm, Tp); + Tz = VSUB(Tx, Ty); + TD = VADD(Tx, Ty); + { + V TV, TW, TX, TY; + TV = VFMAI(TC, Tz); + STM2(&(xo[4]), TV, ovs, &(xo[0])); + STN2(&(xo[4]), TV, TO, ovs); + TW = VFNMSI(TE, TD); + STM2(&(xo[16]), TW, ovs, &(xo[0])); + STN2(&(xo[16]), TW, TN, ovs); + TX = VFNMSI(TC, Tz); + STM2(&(xo[20]), TX, ovs, &(xo[0])); + STN2(&(xo[20]), TX, TT, ovs); + TY = VFMAI(TE, TD); + STM2(&(xo[8]), TY, ovs, &(xo[0])); + STN2(&(xo[8]), TY, TU, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n2fv_12"), {30, 2, 18, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_12) (planner *p) { + X(kdft_register) (p, n2fv_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name n2fv_12 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 48 FP additions, 8 FP multiplications, + * (or, 44 additions, 4 multiplications, 4 fused multiply/add), + * 33 stack variables, 2 constants, and 30 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_12(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(24, is), MAKE_VOLATILE_STRIDE(24, os)) { + V T5, Ta, TJ, Ty, Tq, Tp, Tg, Tl, TI, TA, Tz, Tu; + { + V T1, T6, T4, Tw, T9, Tx; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T6 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + { + V T2, T3, T7, T8; + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T4 = VADD(T2, T3); + Tw = VSUB(T3, T2); + T7 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T9 = VADD(T7, T8); + Tx = VSUB(T8, T7); + } + T5 = VADD(T1, T4); + Ta = VADD(T6, T9); + TJ = VADD(Tw, Tx); + Ty = VMUL(LDK(KP866025403), VSUB(Tw, Tx)); + Tq = VFNMS(LDK(KP500000000), T9, T6); + Tp = VFNMS(LDK(KP500000000), T4, T1); + } + { + V Tc, Th, Tf, Ts, Tk, Tt; + Tc = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Th = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + { + V Td, Te, Ti, Tj; + Td = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Te = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tf = VADD(Td, Te); + Ts = VSUB(Te, Td); + Ti = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + Tt = VSUB(Tj, Ti); + } + Tg = VADD(Tc, Tf); + Tl = VADD(Th, Tk); + TI = VADD(Ts, Tt); + TA = VFNMS(LDK(KP500000000), Tk, Th); + Tz = VFNMS(LDK(KP500000000), Tf, Tc); + Tu = VMUL(LDK(KP866025403), VSUB(Ts, Tt)); + } + { + V TN, TO, TP, TQ, TR, TS; + { + V Tb, Tm, Tn, To; + Tb = VSUB(T5, Ta); + Tm = VBYI(VSUB(Tg, Tl)); + TN = VSUB(Tb, Tm); + STM2(&(xo[18]), TN, ovs, &(xo[2])); + TO = VADD(Tb, Tm); + STM2(&(xo[6]), TO, ovs, &(xo[2])); + Tn = VADD(T5, Ta); + To = VADD(Tg, Tl); + TP = VSUB(Tn, To); + STM2(&(xo[12]), TP, ovs, &(xo[0])); + TQ = VADD(Tn, To); + STM2(&(xo[0]), TQ, ovs, &(xo[0])); + } + { + V Tv, TE, TC, TD, Tr, TB, TT, TU; + Tr = VSUB(Tp, Tq); + Tv = VSUB(Tr, Tu); + TE = VADD(Tr, Tu); + TB = VSUB(Tz, TA); + TC = VBYI(VADD(Ty, TB)); + TD = VBYI(VSUB(Ty, TB)); + TR = VSUB(Tv, TC); + STM2(&(xo[10]), TR, ovs, &(xo[2])); + TS = VSUB(TE, TD); + STM2(&(xo[22]), TS, ovs, &(xo[2])); + TT = VADD(TC, Tv); + STM2(&(xo[14]), TT, ovs, &(xo[2])); + STN2(&(xo[12]), TP, TT, ovs); + TU = VADD(TD, TE); + STM2(&(xo[2]), TU, ovs, &(xo[2])); + STN2(&(xo[0]), TQ, TU, ovs); + } + { + V TK, TM, TH, TL, TF, TG; + TK = VBYI(VMUL(LDK(KP866025403), VSUB(TI, TJ))); + TM = VBYI(VMUL(LDK(KP866025403), VADD(TJ, TI))); + TF = VADD(Tp, Tq); + TG = VADD(Tz, TA); + TH = VSUB(TF, TG); + TL = VADD(TF, TG); + { + V TV, TW, TX, TY; + TV = VSUB(TH, TK); + STM2(&(xo[20]), TV, ovs, &(xo[0])); + STN2(&(xo[20]), TV, TS, ovs); + TW = VADD(TL, TM); + STM2(&(xo[8]), TW, ovs, &(xo[0])); + STN2(&(xo[8]), TW, TR, ovs); + TX = VADD(TH, TK); + STM2(&(xo[4]), TX, ovs, &(xo[0])); + STN2(&(xo[4]), TX, TO, ovs); + TY = VSUB(TL, TM); + STM2(&(xo[16]), TY, ovs, &(xo[0])); + STN2(&(xo[16]), TY, TN, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 12, XSIMD_STRING("n2fv_12"), {44, 4, 4, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_12) (planner *p) { + X(kdft_register) (p, n2fv_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_14.c new file mode 100644 index 000000000..19838ea4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_14.c @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 14 -name n2fv_14 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 74 FP additions, 48 FP multiplications, + * (or, 32 additions, 6 multiplications, 42 fused multiply/add), + * 51 stack variables, 6 constants, and 35 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V T3, TH, Ts, TV, TW, Tt, Tu, TU, Ta, To, Th, Tp, TC, Tx, TK; + V TQ, TN, TR, T14, TZ, T1, T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TH = VADD(T1, T2); + { + V T6, TI, T9, TJ, Tn, TP, Tk, TO, Tg, TM, Td, TL; + { + V T4, T5, Ti, Tj; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TI = VADD(T4, T5); + { + V T7, T8, Tl, Tm; + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + TJ = VADD(T7, T8); + Tl = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tm = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tn = VSUB(Tl, Tm); + TP = VADD(Tl, Tm); + } + Ti = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TO = VADD(Ti, Tj); + { + V Te, Tf, Tb, Tc; + Te = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + TM = VADD(Te, Tf); + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TL = VADD(Tb, Tc); + } + } + Ts = VSUB(T9, T6); + TV = VSUB(TL, TM); + TW = VSUB(TJ, TI); + Tt = VSUB(Tn, Tk); + Tu = VSUB(Tg, Td); + TU = VSUB(TO, TP); + Ta = VADD(T6, T9); + To = VADD(Tk, Tn); + Th = VADD(Td, Tg); + Tp = VFNMS(LDK(KP356895867), Ta, To); + TC = VFNMS(LDK(KP356895867), To, Th); + Tx = VFNMS(LDK(KP356895867), Th, Ta); + TK = VADD(TI, TJ); + TQ = VADD(TO, TP); + TN = VADD(TL, TM); + TR = VFNMS(LDK(KP356895867), TQ, TN); + T14 = VFNMS(LDK(KP356895867), TN, TK); + TZ = VFNMS(LDK(KP356895867), TK, TQ); + } + { + V T1a, T1b, T19, T1c, T1f, T1i, T1j; + T19 = VADD(T3, VADD(Ta, VADD(Th, To))); + STM2(&(xo[14]), T19, ovs, &(xo[2])); + T1a = VADD(TH, VADD(TK, VADD(TN, TQ))); + STM2(&(xo[0]), T1a, ovs, &(xo[0])); + { + V Tr, Tw, Tq, Tv; + Tq = VFNMS(LDK(KP692021471), Tp, Th); + Tr = VFNMS(LDK(KP900968867), Tq, T3); + Tv = VFMA(LDK(KP554958132), Tu, Tt); + Tw = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tv, Ts)); + T1b = VFNMSI(Tw, Tr); + STM2(&(xo[10]), T1b, ovs, &(xo[2])); + T1c = VFMAI(Tw, Tr); + STM2(&(xo[18]), T1c, ovs, &(xo[2])); + } + { + V T16, T18, T15, T17, T1d, T1e; + T15 = VFNMS(LDK(KP692021471), T14, TQ); + T16 = VFNMS(LDK(KP900968867), T15, TH); + T17 = VFNMS(LDK(KP554958132), TU, TW); + T18 = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), T17, TV)); + T1d = VFMAI(T18, T16); + STM2(&(xo[12]), T1d, ovs, &(xo[0])); + STN2(&(xo[12]), T1d, T19, ovs); + T1e = VFNMSI(T18, T16); + STM2(&(xo[16]), T1e, ovs, &(xo[0])); + STN2(&(xo[16]), T1e, T1c, ovs); + } + { + V Tz, TB, Ty, TA, T1g; + Ty = VFNMS(LDK(KP692021471), Tx, To); + Tz = VFNMS(LDK(KP900968867), Ty, T3); + TA = VFMA(LDK(KP554958132), Tt, Ts); + TB = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), TA, Tu)); + T1f = VFNMSI(TB, Tz); + STM2(&(xo[26]), T1f, ovs, &(xo[2])); + T1g = VFMAI(TB, Tz); + STM2(&(xo[2]), T1g, ovs, &(xo[2])); + STN2(&(xo[0]), T1a, T1g, ovs); + } + { + V TT, TY, TS, TX, T1h; + TS = VFNMS(LDK(KP692021471), TR, TK); + TT = VFNMS(LDK(KP900968867), TS, TH); + TX = VFMA(LDK(KP554958132), TW, TV); + TY = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), TX, TU)); + T1h = VFMAI(TY, TT); + STM2(&(xo[8]), T1h, ovs, &(xo[0])); + STN2(&(xo[8]), T1h, T1b, ovs); + T1i = VFNMSI(TY, TT); + STM2(&(xo[20]), T1i, ovs, &(xo[0])); + } + { + V T11, T13, T10, T12, T1k; + T10 = VFNMS(LDK(KP692021471), TZ, TN); + T11 = VFNMS(LDK(KP900968867), T10, TH); + T12 = VFMA(LDK(KP554958132), TV, TU); + T13 = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), T12, TW)); + T1j = VFMAI(T13, T11); + STM2(&(xo[4]), T1j, ovs, &(xo[0])); + T1k = VFNMSI(T13, T11); + STM2(&(xo[24]), T1k, ovs, &(xo[0])); + STN2(&(xo[24]), T1k, T1f, ovs); + } + { + V TE, TG, TD, TF, T1l, T1m; + TD = VFNMS(LDK(KP692021471), TC, Ta); + TE = VFNMS(LDK(KP900968867), TD, T3); + TF = VFNMS(LDK(KP554958132), Ts, Tu); + TG = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), TF, Tt)); + T1l = VFNMSI(TG, TE); + STM2(&(xo[22]), T1l, ovs, &(xo[2])); + STN2(&(xo[20]), T1i, T1l, ovs); + T1m = VFMAI(TG, TE); + STM2(&(xo[6]), T1m, ovs, &(xo[2])); + STN2(&(xo[4]), T1j, T1m, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n2fv_14"), {32, 6, 42, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_14) (planner *p) { + X(kdft_register) (p, n2fv_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 14 -name n2fv_14 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 74 FP additions, 36 FP multiplications, + * (or, 50 additions, 12 multiplications, 24 fused multiply/add), + * 39 stack variables, 6 constants, and 35 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_14(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(28, is), MAKE_VOLATILE_STRIDE(28, os)) { + V T3, Ty, To, TK, Tr, TE, Ta, TJ, Tq, TB, Th, TL, Ts, TH, T1; + V T2; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Ty = VADD(T1, T2); + { + V Tk, TC, Tn, TD; + { + V Ti, Tj, Tl, Tm; + Ti = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tk = VSUB(Ti, Tj); + TC = VADD(Ti, Tj); + Tl = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tm = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tn = VSUB(Tl, Tm); + TD = VADD(Tl, Tm); + } + To = VADD(Tk, Tn); + TK = VSUB(TC, TD); + Tr = VSUB(Tn, Tk); + TE = VADD(TC, TD); + } + { + V T6, Tz, T9, TA; + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Tz = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + TA = VADD(T7, T8); + } + Ta = VADD(T6, T9); + TJ = VSUB(TA, Tz); + Tq = VSUB(T9, T6); + TB = VADD(Tz, TA); + } + { + V Td, TF, Tg, TG; + { + V Tb, Tc, Te, Tf; + Tb = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TF = VADD(Tb, Tc); + Te = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tg = VSUB(Te, Tf); + TG = VADD(Te, Tf); + } + Th = VADD(Td, Tg); + TL = VSUB(TF, TG); + Ts = VSUB(Tg, Td); + TH = VADD(TF, TG); + } + { + V TR, TS, TT, TU, TV, TW; + TR = VADD(T3, VADD(Ta, VADD(Th, To))); + STM2(&(xo[14]), TR, ovs, &(xo[2])); + TS = VADD(Ty, VADD(TB, VADD(TH, TE))); + STM2(&(xo[0]), TS, ovs, &(xo[0])); + { + V Tt, Tp, TP, TQ; + Tt = VBYI(VFNMS(LDK(KP781831482), Tr, VFNMS(LDK(KP433883739), Ts, VMUL(LDK(KP974927912), Tq)))); + Tp = VFMA(LDK(KP623489801), To, VFNMS(LDK(KP900968867), Th, VFNMS(LDK(KP222520933), Ta, T3))); + TT = VSUB(Tp, Tt); + STM2(&(xo[10]), TT, ovs, &(xo[2])); + TU = VADD(Tp, Tt); + STM2(&(xo[18]), TU, ovs, &(xo[2])); + TP = VBYI(VFMA(LDK(KP974927912), TJ, VFMA(LDK(KP433883739), TL, VMUL(LDK(KP781831482), TK)))); + TQ = VFMA(LDK(KP623489801), TE, VFNMS(LDK(KP900968867), TH, VFNMS(LDK(KP222520933), TB, Ty))); + TV = VADD(TP, TQ); + STM2(&(xo[4]), TV, ovs, &(xo[0])); + TW = VSUB(TQ, TP); + STM2(&(xo[24]), TW, ovs, &(xo[0])); + } + { + V Tv, Tu, TX, TY; + Tv = VBYI(VFMA(LDK(KP781831482), Tq, VFMA(LDK(KP974927912), Ts, VMUL(LDK(KP433883739), Tr)))); + Tu = VFMA(LDK(KP623489801), Ta, VFNMS(LDK(KP900968867), To, VFNMS(LDK(KP222520933), Th, T3))); + TX = VSUB(Tu, Tv); + STM2(&(xo[26]), TX, ovs, &(xo[2])); + STN2(&(xo[24]), TW, TX, ovs); + TY = VADD(Tu, Tv); + STM2(&(xo[2]), TY, ovs, &(xo[2])); + STN2(&(xo[0]), TS, TY, ovs); + } + { + V TM, TI, TZ, T10; + TM = VBYI(VFNMS(LDK(KP433883739), TK, VFNMS(LDK(KP974927912), TL, VMUL(LDK(KP781831482), TJ)))); + TI = VFMA(LDK(KP623489801), TB, VFNMS(LDK(KP900968867), TE, VFNMS(LDK(KP222520933), TH, Ty))); + TZ = VSUB(TI, TM); + STM2(&(xo[12]), TZ, ovs, &(xo[0])); + STN2(&(xo[12]), TZ, TR, ovs); + T10 = VADD(TM, TI); + STM2(&(xo[16]), T10, ovs, &(xo[0])); + STN2(&(xo[16]), T10, TU, ovs); + } + { + V T12, TO, TN, T11; + TO = VBYI(VFMA(LDK(KP433883739), TJ, VFNMS(LDK(KP974927912), TK, VMUL(LDK(KP781831482), TL)))); + TN = VFMA(LDK(KP623489801), TH, VFNMS(LDK(KP222520933), TE, VFNMS(LDK(KP900968867), TB, Ty))); + T11 = VSUB(TN, TO); + STM2(&(xo[8]), T11, ovs, &(xo[0])); + STN2(&(xo[8]), T11, TT, ovs); + T12 = VADD(TO, TN); + STM2(&(xo[20]), T12, ovs, &(xo[0])); + { + V Tx, Tw, T13, T14; + Tx = VBYI(VFMA(LDK(KP433883739), Tq, VFNMS(LDK(KP781831482), Ts, VMUL(LDK(KP974927912), Tr)))); + Tw = VFMA(LDK(KP623489801), Th, VFNMS(LDK(KP222520933), To, VFNMS(LDK(KP900968867), Ta, T3))); + T13 = VSUB(Tw, Tx); + STM2(&(xo[22]), T13, ovs, &(xo[2])); + STN2(&(xo[20]), T12, T13, ovs); + T14 = VADD(Tw, Tx); + STM2(&(xo[6]), T14, ovs, &(xo[2])); + STN2(&(xo[4]), TV, T14, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 14, XSIMD_STRING("n2fv_14"), {50, 12, 24, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_14) (planner *p) { + X(kdft_register) (p, n2fv_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_16.c new file mode 100644 index 000000000..deb8e38bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_16.c @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:08 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name n2fv_16 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 72 FP additions, 34 FP multiplications, + * (or, 38 additions, 0 multiplications, 34 fused multiply/add), + * 38 stack variables, 3 constants, and 40 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V T7, TU, Tz, TH, Tu, TV, TA, TK, Te, TX, TC, TO, Tl, TY, TD; + V TR; + { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T7 = VSUB(T3, T6); + TU = VSUB(T4, T5); + Tz = VADD(T3, T6); + TH = VSUB(T1, T2); + } + { + V Tq, TJ, Tt, TI; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + TJ = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + TI = VSUB(Tr, Ts); + } + Tu = VSUB(Tq, Tt); + TV = VSUB(TJ, TI); + TA = VADD(Tt, Tq); + TK = VADD(TI, TJ); + } + { + V Ta, TM, Td, TN; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VADD(T8, T9); + TM = VSUB(T8, T9); + Tb = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Td = VADD(Tb, Tc); + TN = VSUB(Tb, Tc); + } + Te = VSUB(Ta, Td); + TX = VFMA(LDK(KP414213562), TM, TN); + TC = VADD(Ta, Td); + TO = VFNMS(LDK(KP414213562), TN, TM); + } + { + V Th, TP, Tk, TQ; + { + V Tf, Tg, Ti, Tj; + Tf = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + Tg = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Th = VADD(Tf, Tg); + TP = VSUB(Tf, Tg); + Ti = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tj = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Tk = VADD(Ti, Tj); + TQ = VSUB(Tj, Ti); + } + Tl = VSUB(Th, Tk); + TY = VFMA(LDK(KP414213562), TP, TQ); + TD = VADD(Th, Tk); + TR = VFNMS(LDK(KP414213562), TQ, TP); + } + { + V T1b, T1c, T1d, T1e; + { + V TB, TE, TF, TG; + TB = VADD(Tz, TA); + TE = VADD(TC, TD); + T1b = VSUB(TB, TE); + STM2(&(xo[16]), T1b, ovs, &(xo[0])); + T1c = VADD(TB, TE); + STM2(&(xo[0]), T1c, ovs, &(xo[0])); + TF = VSUB(Tz, TA); + TG = VSUB(TD, TC); + T1d = VFNMSI(TG, TF); + STM2(&(xo[24]), T1d, ovs, &(xo[0])); + T1e = VFMAI(TG, TF); + STM2(&(xo[8]), T1e, ovs, &(xo[0])); + } + { + V T1f, T1g, T1h, T1i; + { + V Tn, Tx, Tw, Ty, Tm, Tv; + Tm = VADD(Te, Tl); + Tn = VFNMS(LDK(KP707106781), Tm, T7); + Tx = VFMA(LDK(KP707106781), Tm, T7); + Tv = VSUB(Tl, Te); + Tw = VFNMS(LDK(KP707106781), Tv, Tu); + Ty = VFMA(LDK(KP707106781), Tv, Tu); + T1f = VFNMSI(Tw, Tn); + STM2(&(xo[12]), T1f, ovs, &(xo[0])); + T1g = VFMAI(Ty, Tx); + STM2(&(xo[4]), T1g, ovs, &(xo[0])); + T1h = VFMAI(Tw, Tn); + STM2(&(xo[20]), T1h, ovs, &(xo[0])); + T1i = VFNMSI(Ty, Tx); + STM2(&(xo[28]), T1i, ovs, &(xo[0])); + } + { + V TT, T11, T10, T12; + { + V TL, TS, TW, TZ; + TL = VFMA(LDK(KP707106781), TK, TH); + TS = VADD(TO, TR); + TT = VFNMS(LDK(KP923879532), TS, TL); + T11 = VFMA(LDK(KP923879532), TS, TL); + TW = VFNMS(LDK(KP707106781), TV, TU); + TZ = VSUB(TX, TY); + T10 = VFNMS(LDK(KP923879532), TZ, TW); + T12 = VFMA(LDK(KP923879532), TZ, TW); + } + { + V T1j, T1k, T1l, T1m; + T1j = VFNMSI(T10, TT); + STM2(&(xo[18]), T1j, ovs, &(xo[2])); + STN2(&(xo[16]), T1b, T1j, ovs); + T1k = VFMAI(T12, T11); + STM2(&(xo[30]), T1k, ovs, &(xo[2])); + STN2(&(xo[28]), T1i, T1k, ovs); + T1l = VFMAI(T10, TT); + STM2(&(xo[14]), T1l, ovs, &(xo[2])); + STN2(&(xo[12]), T1f, T1l, ovs); + T1m = VFNMSI(T12, T11); + STM2(&(xo[2]), T1m, ovs, &(xo[2])); + STN2(&(xo[0]), T1c, T1m, ovs); + } + } + { + V T15, T19, T18, T1a; + { + V T13, T14, T16, T17; + T13 = VFNMS(LDK(KP707106781), TK, TH); + T14 = VADD(TX, TY); + T15 = VFNMS(LDK(KP923879532), T14, T13); + T19 = VFMA(LDK(KP923879532), T14, T13); + T16 = VFMA(LDK(KP707106781), TV, TU); + T17 = VSUB(TR, TO); + T18 = VFNMS(LDK(KP923879532), T17, T16); + T1a = VFMA(LDK(KP923879532), T17, T16); + } + { + V T1n, T1o, T1p, T1q; + T1n = VFNMSI(T18, T15); + STM2(&(xo[10]), T1n, ovs, &(xo[2])); + STN2(&(xo[8]), T1e, T1n, ovs); + T1o = VFNMSI(T1a, T19); + STM2(&(xo[26]), T1o, ovs, &(xo[2])); + STN2(&(xo[24]), T1d, T1o, ovs); + T1p = VFMAI(T18, T15); + STM2(&(xo[22]), T1p, ovs, &(xo[2])); + STN2(&(xo[20]), T1h, T1p, ovs); + T1q = VFMAI(T1a, T19); + STM2(&(xo[6]), T1q, ovs, &(xo[2])); + STN2(&(xo[4]), T1g, T1q, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n2fv_16"), {38, 0, 34, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_16) (planner *p) { + X(kdft_register) (p, n2fv_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name n2fv_16 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 72 FP additions, 12 FP multiplications, + * (or, 68 additions, 8 multiplications, 4 fused multiply/add), + * 38 stack variables, 3 constants, and 40 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V Tp, T13, Tu, TN, Tm, T14, Tv, TY, T7, T17, Ty, TT, Te, T16, Tx; + V TQ; + { + V Tn, To, TM, Ts, Tt, TL; + Tn = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + To = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + TM = VADD(Tn, To); + Ts = LD(&(xi[0]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + TL = VADD(Ts, Tt); + Tp = VSUB(Tn, To); + T13 = VADD(TL, TM); + Tu = VSUB(Ts, Tt); + TN = VSUB(TL, TM); + } + { + V Ti, TW, Tl, TX; + { + V Tg, Th, Tj, Tk; + Tg = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Th = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Ti = VSUB(Tg, Th); + TW = VADD(Tg, Th); + Tj = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + TX = VADD(Tj, Tk); + } + Tm = VMUL(LDK(KP707106781), VSUB(Ti, Tl)); + T14 = VADD(TX, TW); + Tv = VMUL(LDK(KP707106781), VADD(Tl, Ti)); + TY = VSUB(TW, TX); + } + { + V T3, TR, T6, TS; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T2 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + TR = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + TS = VADD(T4, T5); + } + T7 = VFNMS(LDK(KP923879532), T6, VMUL(LDK(KP382683432), T3)); + T17 = VADD(TR, TS); + Ty = VFMA(LDK(KP923879532), T3, VMUL(LDK(KP382683432), T6)); + TT = VSUB(TR, TS); + } + { + V Ta, TO, Td, TP; + { + V T8, T9, Tb, Tc; + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + Ta = VSUB(T8, T9); + TO = VADD(T8, T9); + Tb = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tc = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Td = VSUB(Tb, Tc); + TP = VADD(Tb, Tc); + } + Te = VFMA(LDK(KP382683432), Ta, VMUL(LDK(KP923879532), Td)); + T16 = VADD(TO, TP); + Tx = VFNMS(LDK(KP382683432), Td, VMUL(LDK(KP923879532), Ta)); + TQ = VSUB(TO, TP); + } + { + V T1b, T1c, T1d, T1e; + { + V T15, T18, T19, T1a; + T15 = VADD(T13, T14); + T18 = VADD(T16, T17); + T1b = VSUB(T15, T18); + STM2(&(xo[16]), T1b, ovs, &(xo[0])); + T1c = VADD(T15, T18); + STM2(&(xo[0]), T1c, ovs, &(xo[0])); + T19 = VSUB(T13, T14); + T1a = VBYI(VSUB(T17, T16)); + T1d = VSUB(T19, T1a); + STM2(&(xo[24]), T1d, ovs, &(xo[0])); + T1e = VADD(T19, T1a); + STM2(&(xo[8]), T1e, ovs, &(xo[0])); + } + { + V T1f, T1g, T1h, T1i; + { + V TV, T11, T10, T12, TU, TZ; + TU = VMUL(LDK(KP707106781), VADD(TQ, TT)); + TV = VADD(TN, TU); + T11 = VSUB(TN, TU); + TZ = VMUL(LDK(KP707106781), VSUB(TT, TQ)); + T10 = VBYI(VADD(TY, TZ)); + T12 = VBYI(VSUB(TZ, TY)); + T1f = VSUB(TV, T10); + STM2(&(xo[28]), T1f, ovs, &(xo[0])); + T1g = VADD(T11, T12); + STM2(&(xo[12]), T1g, ovs, &(xo[0])); + T1h = VADD(TV, T10); + STM2(&(xo[4]), T1h, ovs, &(xo[0])); + T1i = VSUB(T11, T12); + STM2(&(xo[20]), T1i, ovs, &(xo[0])); + } + { + V Tr, TB, TA, TC; + { + V Tf, Tq, Tw, Tz; + Tf = VSUB(T7, Te); + Tq = VSUB(Tm, Tp); + Tr = VBYI(VSUB(Tf, Tq)); + TB = VBYI(VADD(Tq, Tf)); + Tw = VADD(Tu, Tv); + Tz = VADD(Tx, Ty); + TA = VSUB(Tw, Tz); + TC = VADD(Tw, Tz); + } + { + V T1j, T1k, T1l, T1m; + T1j = VADD(Tr, TA); + STM2(&(xo[14]), T1j, ovs, &(xo[2])); + STN2(&(xo[12]), T1g, T1j, ovs); + T1k = VSUB(TC, TB); + STM2(&(xo[30]), T1k, ovs, &(xo[2])); + STN2(&(xo[28]), T1f, T1k, ovs); + T1l = VSUB(TA, Tr); + STM2(&(xo[18]), T1l, ovs, &(xo[2])); + STN2(&(xo[16]), T1b, T1l, ovs); + T1m = VADD(TB, TC); + STM2(&(xo[2]), T1m, ovs, &(xo[2])); + STN2(&(xo[0]), T1c, T1m, ovs); + } + } + { + V TF, TJ, TI, TK; + { + V TD, TE, TG, TH; + TD = VSUB(Tu, Tv); + TE = VADD(Te, T7); + TF = VADD(TD, TE); + TJ = VSUB(TD, TE); + TG = VADD(Tp, Tm); + TH = VSUB(Ty, Tx); + TI = VBYI(VADD(TG, TH)); + TK = VBYI(VSUB(TH, TG)); + } + { + V T1n, T1o, T1p, T1q; + T1n = VSUB(TF, TI); + STM2(&(xo[26]), T1n, ovs, &(xo[2])); + STN2(&(xo[24]), T1d, T1n, ovs); + T1o = VADD(TJ, TK); + STM2(&(xo[10]), T1o, ovs, &(xo[2])); + STN2(&(xo[8]), T1e, T1o, ovs); + T1p = VADD(TF, TI); + STM2(&(xo[6]), T1p, ovs, &(xo[2])); + STN2(&(xo[4]), T1h, T1p, ovs); + T1q = VSUB(TJ, TK); + STM2(&(xo[22]), T1q, ovs, &(xo[2])); + STN2(&(xo[20]), T1i, T1q, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n2fv_16"), {68, 8, 4, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_16) (planner *p) { + X(kdft_register) (p, n2fv_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_2.c new file mode 100644 index 000000000..a79fcaae2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name n2fv_2 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 7 stack variables, 0 constants, and 5 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + STM2(&(xo[2]), T3, ovs, &(xo[2])); + T4 = VADD(T1, T2); + STM2(&(xo[0]), T4, ovs, &(xo[0])); + STN2(&(xo[0]), T4, T3, ovs); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n2fv_2"), {2, 0, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_2) (planner *p) { + X(kdft_register) (p, n2fv_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name n2fv_2 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 7 stack variables, 0 constants, and 5 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_2(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(4, is), MAKE_VOLATILE_STRIDE(4, os)) { + V T1, T2, T3, T4; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + STM2(&(xo[2]), T3, ovs, &(xo[2])); + T4 = VADD(T1, T2); + STM2(&(xo[0]), T4, ovs, &(xo[0])); + STN2(&(xo[0]), T4, T3, ovs); + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 2, XSIMD_STRING("n2fv_2"), {2, 0, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_2) (planner *p) { + X(kdft_register) (p, n2fv_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_20.c new file mode 100644 index 000000000..da51961e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_20.c @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name n2fv_20 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 104 FP additions, 50 FP multiplications, + * (or, 58 additions, 4 multiplications, 46 fused multiply/add), + * 57 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1r, Tm, T13, TG, TN, TO, TH, T16, T19, T1a, T1v, T1w, T1x, T1s; + V T1t, T1u, T1d, T1g, T1h, Ti, TE, TB, TL; + { + V T1, T2, T11, Tk, Tl, T12; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T11 = VADD(T1, T2); + Tk = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tl = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T12 = VADD(Tk, Tl); + T3 = VSUB(T1, T2); + T1r = VADD(T11, T12); + Tm = VSUB(Tk, Tl); + T13 = VSUB(T11, T12); + } + { + V T6, T14, Tw, T1c, Tz, T1f, T9, T17, Td, T1b, Tp, T15, Ts, T18, Tg; + V T1e; + { + V T4, T5, Tu, Tv; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T14 = VADD(T4, T5); + Tu = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tv = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tw = VSUB(Tu, Tv); + T1c = VADD(Tu, Tv); + } + { + V Tx, Ty, T7, T8; + Tx = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tz = VSUB(Tx, Ty); + T1f = VADD(Tx, Ty); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T17 = VADD(T7, T8); + } + { + V Tb, Tc, Tn, To; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T1b = VADD(Tb, Tc); + Tn = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + To = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tp = VSUB(Tn, To); + T15 = VADD(Tn, To); + } + { + V Tq, Tr, Te, Tf; + Tq = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tr = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Ts = VSUB(Tq, Tr); + T18 = VADD(Tq, Tr); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T1e = VADD(Te, Tf); + } + TG = VSUB(Ts, Tp); + TN = VSUB(T6, T9); + TO = VSUB(Td, Tg); + TH = VSUB(Tz, Tw); + T16 = VSUB(T14, T15); + T19 = VSUB(T17, T18); + T1a = VADD(T16, T19); + T1v = VADD(T1b, T1c); + T1w = VADD(T1e, T1f); + T1x = VADD(T1v, T1w); + T1s = VADD(T14, T15); + T1t = VADD(T17, T18); + T1u = VADD(T1s, T1t); + T1d = VSUB(T1b, T1c); + T1g = VSUB(T1e, T1f); + T1h = VADD(T1d, T1g); + { + V Ta, Th, Tt, TA; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + TE = VSUB(Ta, Th); + Tt = VADD(Tp, Ts); + TA = VADD(Tw, Tz); + TB = VADD(Tt, TA); + TL = VSUB(TA, Tt); + } + } + { + V T1I, T1J, T1K, T1L, T1N, T1H, Tj, TC; + Tj = VADD(T3, Ti); + TC = VADD(Tm, TB); + T1H = VFNMSI(TC, Tj); + STM2(&(xo[10]), T1H, ovs, &(xo[2])); + T1I = VFMAI(TC, Tj); + STM2(&(xo[30]), T1I, ovs, &(xo[2])); + { + V T1A, T1y, T1z, T1E, T1G, T1C, T1D, T1F, T1B, T1M; + T1A = VSUB(T1u, T1x); + T1y = VADD(T1u, T1x); + T1z = VFNMS(LDK(KP250000000), T1y, T1r); + T1C = VSUB(T1s, T1t); + T1D = VSUB(T1v, T1w); + T1E = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1D, T1C)); + T1G = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1C, T1D)); + T1J = VADD(T1r, T1y); + STM2(&(xo[0]), T1J, ovs, &(xo[0])); + T1F = VFNMS(LDK(KP559016994), T1A, T1z); + T1K = VFNMSI(T1G, T1F); + STM2(&(xo[16]), T1K, ovs, &(xo[0])); + T1L = VFMAI(T1G, T1F); + STM2(&(xo[24]), T1L, ovs, &(xo[0])); + T1B = VFMA(LDK(KP559016994), T1A, T1z); + T1M = VFMAI(T1E, T1B); + STM2(&(xo[8]), T1M, ovs, &(xo[0])); + STN2(&(xo[8]), T1M, T1H, ovs); + T1N = VFNMSI(T1E, T1B); + STM2(&(xo[32]), T1N, ovs, &(xo[0])); + } + { + V T1O, T1P, T1R, T1S; + { + V T1k, T1i, T1j, T1o, T1q, T1m, T1n, T1p, T1Q, T1l; + T1k = VSUB(T1a, T1h); + T1i = VADD(T1a, T1h); + T1j = VFNMS(LDK(KP250000000), T1i, T13); + T1m = VSUB(T1d, T1g); + T1n = VSUB(T16, T19); + T1o = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1n, T1m)); + T1q = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1m, T1n)); + T1O = VADD(T13, T1i); + STM2(&(xo[20]), T1O, ovs, &(xo[0])); + T1p = VFMA(LDK(KP559016994), T1k, T1j); + T1P = VFNMSI(T1q, T1p); + STM2(&(xo[12]), T1P, ovs, &(xo[0])); + T1Q = VFMAI(T1q, T1p); + STM2(&(xo[28]), T1Q, ovs, &(xo[0])); + STN2(&(xo[28]), T1Q, T1I, ovs); + T1l = VFNMS(LDK(KP559016994), T1k, T1j); + T1R = VFMAI(T1o, T1l); + STM2(&(xo[4]), T1R, ovs, &(xo[0])); + T1S = VFNMSI(T1o, T1l); + STM2(&(xo[36]), T1S, ovs, &(xo[0])); + } + { + V TI, TP, TX, TU, TM, TW, TF, TT, TK, TD; + TI = VFMA(LDK(KP618033988), TH, TG); + TP = VFMA(LDK(KP618033988), TO, TN); + TX = VFNMS(LDK(KP618033988), TN, TO); + TU = VFNMS(LDK(KP618033988), TG, TH); + TK = VFNMS(LDK(KP250000000), TB, Tm); + TM = VFNMS(LDK(KP559016994), TL, TK); + TW = VFMA(LDK(KP559016994), TL, TK); + TD = VFNMS(LDK(KP250000000), Ti, T3); + TF = VFMA(LDK(KP559016994), TE, TD); + TT = VFNMS(LDK(KP559016994), TE, TD); + { + V TJ, TQ, T1T, T1U; + TJ = VFMA(LDK(KP951056516), TI, TF); + TQ = VFMA(LDK(KP951056516), TP, TM); + T1T = VFNMSI(TQ, TJ); + STM2(&(xo[2]), T1T, ovs, &(xo[2])); + STN2(&(xo[0]), T1J, T1T, ovs); + T1U = VFMAI(TQ, TJ); + STM2(&(xo[38]), T1U, ovs, &(xo[2])); + STN2(&(xo[36]), T1S, T1U, ovs); + } + { + V TZ, T10, T1V, T1W; + TZ = VFMA(LDK(KP951056516), TU, TT); + T10 = VFMA(LDK(KP951056516), TX, TW); + T1V = VFNMSI(T10, TZ); + STM2(&(xo[26]), T1V, ovs, &(xo[2])); + STN2(&(xo[24]), T1L, T1V, ovs); + T1W = VFMAI(T10, TZ); + STM2(&(xo[14]), T1W, ovs, &(xo[2])); + STN2(&(xo[12]), T1P, T1W, ovs); + } + { + V TR, TS, T1X, T1Y; + TR = VFNMS(LDK(KP951056516), TI, TF); + TS = VFNMS(LDK(KP951056516), TP, TM); + T1X = VFNMSI(TS, TR); + STM2(&(xo[18]), T1X, ovs, &(xo[2])); + STN2(&(xo[16]), T1K, T1X, ovs); + T1Y = VFMAI(TS, TR); + STM2(&(xo[22]), T1Y, ovs, &(xo[2])); + STN2(&(xo[20]), T1O, T1Y, ovs); + } + { + V TV, TY, T1Z, T20; + TV = VFNMS(LDK(KP951056516), TU, TT); + TY = VFNMS(LDK(KP951056516), TX, TW); + T1Z = VFNMSI(TY, TV); + STM2(&(xo[34]), T1Z, ovs, &(xo[2])); + STN2(&(xo[32]), T1N, T1Z, ovs); + T20 = VFMAI(TY, TV); + STM2(&(xo[6]), T20, ovs, &(xo[2])); + STN2(&(xo[4]), T1R, T20, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n2fv_20"), {58, 4, 46, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_20) (planner *p) { + X(kdft_register) (p, n2fv_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name n2fv_20 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 104 FP additions, 24 FP multiplications, + * (or, 92 additions, 12 multiplications, 12 fused multiply/add), + * 57 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_20(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(40, is), MAKE_VOLATILE_STRIDE(40, os)) { + V T3, T1B, Tm, T1i, TG, TN, TO, TH, T13, T16, T1k, T1u, T1v, T1z, T1r; + V T1s, T1y, T1a, T1d, T1j, Ti, TD, TB, TL; + { + V T1, T2, T1g, Tk, Tl, T1h; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + T1g = VADD(T1, T2); + Tk = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tl = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1h = VADD(Tk, Tl); + T3 = VSUB(T1, T2); + T1B = VADD(T1g, T1h); + Tm = VSUB(Tk, Tl); + T1i = VSUB(T1g, T1h); + } + { + V T6, T18, Tw, T12, Tz, T15, T9, T1b, Td, T11, Tp, T19, Ts, T1c, Tg; + V T14; + { + V T4, T5, Tu, Tv; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T18 = VADD(T4, T5); + Tu = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + Tv = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + Tw = VSUB(Tu, Tv); + T12 = VADD(Tu, Tv); + } + { + V Tx, Ty, T7, T8; + Tx = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Ty = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + Tz = VSUB(Tx, Ty); + T15 = VADD(Tx, Ty); + T7 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1b = VADD(T7, T8); + } + { + V Tb, Tc, Tn, To; + Tb = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Td = VSUB(Tb, Tc); + T11 = VADD(Tb, Tc); + Tn = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + To = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + Tp = VSUB(Tn, To); + T19 = VADD(Tn, To); + } + { + V Tq, Tr, Te, Tf; + Tq = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tr = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + Ts = VSUB(Tq, Tr); + T1c = VADD(Tq, Tr); + Te = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tf = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tg = VSUB(Te, Tf); + T14 = VADD(Te, Tf); + } + TG = VSUB(Ts, Tp); + TN = VSUB(T6, T9); + TO = VSUB(Td, Tg); + TH = VSUB(Tz, Tw); + T13 = VSUB(T11, T12); + T16 = VSUB(T14, T15); + T1k = VADD(T13, T16); + T1u = VADD(T11, T12); + T1v = VADD(T14, T15); + T1z = VADD(T1u, T1v); + T1r = VADD(T18, T19); + T1s = VADD(T1b, T1c); + T1y = VADD(T1r, T1s); + T1a = VSUB(T18, T19); + T1d = VSUB(T1b, T1c); + T1j = VADD(T1a, T1d); + { + V Ta, Th, Tt, TA; + Ta = VADD(T6, T9); + Th = VADD(Td, Tg); + Ti = VADD(Ta, Th); + TD = VMUL(LDK(KP559016994), VSUB(Ta, Th)); + Tt = VADD(Tp, Ts); + TA = VADD(Tw, Tz); + TB = VADD(Tt, TA); + TL = VMUL(LDK(KP559016994), VSUB(TA, Tt)); + } + } + { + V T1I, T1J, T1K, T1L, T1N, T1H, Tj, TC; + Tj = VADD(T3, Ti); + TC = VBYI(VADD(Tm, TB)); + T1H = VSUB(Tj, TC); + STM2(&(xo[10]), T1H, ovs, &(xo[2])); + T1I = VADD(Tj, TC); + STM2(&(xo[30]), T1I, ovs, &(xo[2])); + { + V T1A, T1C, T1D, T1x, T1G, T1t, T1w, T1F, T1E, T1M; + T1A = VMUL(LDK(KP559016994), VSUB(T1y, T1z)); + T1C = VADD(T1y, T1z); + T1D = VFNMS(LDK(KP250000000), T1C, T1B); + T1t = VSUB(T1r, T1s); + T1w = VSUB(T1u, T1v); + T1x = VBYI(VFMA(LDK(KP951056516), T1t, VMUL(LDK(KP587785252), T1w))); + T1G = VBYI(VFNMS(LDK(KP587785252), T1t, VMUL(LDK(KP951056516), T1w))); + T1J = VADD(T1B, T1C); + STM2(&(xo[0]), T1J, ovs, &(xo[0])); + T1F = VSUB(T1D, T1A); + T1K = VSUB(T1F, T1G); + STM2(&(xo[16]), T1K, ovs, &(xo[0])); + T1L = VADD(T1G, T1F); + STM2(&(xo[24]), T1L, ovs, &(xo[0])); + T1E = VADD(T1A, T1D); + T1M = VADD(T1x, T1E); + STM2(&(xo[8]), T1M, ovs, &(xo[0])); + STN2(&(xo[8]), T1M, T1H, ovs); + T1N = VSUB(T1E, T1x); + STM2(&(xo[32]), T1N, ovs, &(xo[0])); + } + { + V T1O, T1P, T1R, T1S; + { + V T1n, T1l, T1m, T1f, T1q, T17, T1e, T1p, T1Q, T1o; + T1n = VMUL(LDK(KP559016994), VSUB(T1j, T1k)); + T1l = VADD(T1j, T1k); + T1m = VFNMS(LDK(KP250000000), T1l, T1i); + T17 = VSUB(T13, T16); + T1e = VSUB(T1a, T1d); + T1f = VBYI(VFNMS(LDK(KP587785252), T1e, VMUL(LDK(KP951056516), T17))); + T1q = VBYI(VFMA(LDK(KP951056516), T1e, VMUL(LDK(KP587785252), T17))); + T1O = VADD(T1i, T1l); + STM2(&(xo[20]), T1O, ovs, &(xo[0])); + T1p = VADD(T1n, T1m); + T1P = VSUB(T1p, T1q); + STM2(&(xo[12]), T1P, ovs, &(xo[0])); + T1Q = VADD(T1q, T1p); + STM2(&(xo[28]), T1Q, ovs, &(xo[0])); + STN2(&(xo[28]), T1Q, T1I, ovs); + T1o = VSUB(T1m, T1n); + T1R = VADD(T1f, T1o); + STM2(&(xo[4]), T1R, ovs, &(xo[0])); + T1S = VSUB(T1o, T1f); + STM2(&(xo[36]), T1S, ovs, &(xo[0])); + } + { + V TI, TP, TX, TU, TM, TW, TF, TT, TK, TE; + TI = VFMA(LDK(KP951056516), TG, VMUL(LDK(KP587785252), TH)); + TP = VFMA(LDK(KP951056516), TN, VMUL(LDK(KP587785252), TO)); + TX = VFNMS(LDK(KP587785252), TN, VMUL(LDK(KP951056516), TO)); + TU = VFNMS(LDK(KP587785252), TG, VMUL(LDK(KP951056516), TH)); + TK = VFMS(LDK(KP250000000), TB, Tm); + TM = VADD(TK, TL); + TW = VSUB(TL, TK); + TE = VFNMS(LDK(KP250000000), Ti, T3); + TF = VADD(TD, TE); + TT = VSUB(TE, TD); + { + V TJ, TQ, T1T, T1U; + TJ = VADD(TF, TI); + TQ = VBYI(VSUB(TM, TP)); + T1T = VSUB(TJ, TQ); + STM2(&(xo[38]), T1T, ovs, &(xo[2])); + STN2(&(xo[36]), T1S, T1T, ovs); + T1U = VADD(TJ, TQ); + STM2(&(xo[2]), T1U, ovs, &(xo[2])); + STN2(&(xo[0]), T1J, T1U, ovs); + } + { + V TZ, T10, T1V, T1W; + TZ = VADD(TT, TU); + T10 = VBYI(VADD(TX, TW)); + T1V = VSUB(TZ, T10); + STM2(&(xo[26]), T1V, ovs, &(xo[2])); + STN2(&(xo[24]), T1L, T1V, ovs); + T1W = VADD(TZ, T10); + STM2(&(xo[14]), T1W, ovs, &(xo[2])); + STN2(&(xo[12]), T1P, T1W, ovs); + } + { + V TR, TS, T1X, T1Y; + TR = VSUB(TF, TI); + TS = VBYI(VADD(TP, TM)); + T1X = VSUB(TR, TS); + STM2(&(xo[22]), T1X, ovs, &(xo[2])); + STN2(&(xo[20]), T1O, T1X, ovs); + T1Y = VADD(TR, TS); + STM2(&(xo[18]), T1Y, ovs, &(xo[2])); + STN2(&(xo[16]), T1K, T1Y, ovs); + } + { + V TV, TY, T1Z, T20; + TV = VSUB(TT, TU); + TY = VBYI(VSUB(TW, TX)); + T1Z = VSUB(TV, TY); + STM2(&(xo[34]), T1Z, ovs, &(xo[2])); + STN2(&(xo[32]), T1N, T1Z, ovs); + T20 = VADD(TV, TY); + STM2(&(xo[6]), T20, ovs, &(xo[2])); + STN2(&(xo[4]), T1R, T20, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 20, XSIMD_STRING("n2fv_20"), {92, 12, 12, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_20) (planner *p) { + X(kdft_register) (p, n2fv_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_32.c new file mode 100644 index 000000000..ec759dcaf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_32.c @@ -0,0 +1,862 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:08 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name n2fv_32 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 186 FP additions, 98 FP multiplications, + * (or, 88 additions, 0 multiplications, 98 fused multiply/add), + * 72 stack variables, 7 constants, and 80 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T1T, T1W, T2K, T2x, T16, T1A, Tb, T1p, TT, T1v, TY, T1w, T27, T2a, T2b; + V T2H, T2N, TC, T1s, TH, T1t, T20, T23, T24, T2E, T2O, T2g, T2j, Tq, T1B; + V T19, T1q, T2A, T2L; + { + V T3, T1R, T14, T1S, T6, T1U, T9, T1V, T15, Ta; + { + V T1, T2, T12, T13; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T1R = VADD(T1, T2); + T12 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T13 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T14 = VSUB(T12, T13); + T1S = VADD(T12, T13); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T1U = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1V = VADD(T7, T8); + } + T1T = VADD(T1R, T1S); + T1W = VADD(T1U, T1V); + T2K = VSUB(T1V, T1U); + T2x = VSUB(T1R, T1S); + T15 = VSUB(T9, T6); + T16 = VFNMS(LDK(KP707106781), T15, T14); + T1A = VFMA(LDK(KP707106781), T15, T14); + Ta = VADD(T6, T9); + Tb = VFMA(LDK(KP707106781), Ta, T3); + T1p = VFNMS(LDK(KP707106781), Ta, T3); + } + { + V TL, T25, TW, T26, TO, T28, TR, T29; + { + V TJ, TK, TU, TV; + TJ = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T25 = VADD(TJ, TK); + TU = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TW = VSUB(TU, TV); + T26 = VADD(TV, TU); + } + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T28 = VADD(TM, TN); + TP = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TQ = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TR = VSUB(TP, TQ); + T29 = VADD(TP, TQ); + } + { + V TS, TX, T2F, T2G; + TS = VADD(TO, TR); + TT = VFMA(LDK(KP707106781), TS, TL); + T1v = VFNMS(LDK(KP707106781), TS, TL); + TX = VSUB(TR, TO); + TY = VFMA(LDK(KP707106781), TX, TW); + T1w = VFNMS(LDK(KP707106781), TX, TW); + T27 = VADD(T25, T26); + T2a = VADD(T28, T29); + T2b = VSUB(T27, T2a); + T2F = VSUB(T25, T26); + T2G = VSUB(T29, T28); + T2H = VFNMS(LDK(KP414213562), T2G, T2F); + T2N = VFMA(LDK(KP414213562), T2F, T2G); + } + } + { + V Tu, T1Y, TF, T1Z, Tx, T21, TA, T22; + { + V Ts, Tt, TD, TE; + Ts = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1Y = VADD(Ts, Tt); + TD = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TE = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TF = VSUB(TD, TE); + T1Z = VADD(TD, TE); + } + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T21 = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tz = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TA = VSUB(Ty, Tz); + T22 = VADD(Ty, Tz); + } + { + V TB, TG, T2C, T2D; + TB = VADD(Tx, TA); + TC = VFMA(LDK(KP707106781), TB, Tu); + T1s = VFNMS(LDK(KP707106781), TB, Tu); + TG = VSUB(Tx, TA); + TH = VFMA(LDK(KP707106781), TG, TF); + T1t = VFNMS(LDK(KP707106781), TG, TF); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VSUB(T20, T23); + T2C = VSUB(T1Y, T1Z); + T2D = VSUB(T21, T22); + T2E = VFNMS(LDK(KP414213562), T2D, T2C); + T2O = VFMA(LDK(KP414213562), T2C, T2D); + } + } + { + V Te, T2h, To, T2f, Th, T2i, Tl, T2e, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T2h = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T2f = VADD(Tn, Tm); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T2i = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2e = VADD(Tj, Tk); + } + T2g = VADD(T2e, T2f); + T2j = VADD(T2h, T2i); + Ti = VFNMS(LDK(KP414213562), Th, Te); + Tp = VFNMS(LDK(KP414213562), To, Tl); + Tq = VADD(Ti, Tp); + T1B = VSUB(Tp, Ti); + { + V T17, T18, T2y, T2z; + T17 = VFMA(LDK(KP414213562), Te, Th); + T18 = VFMA(LDK(KP414213562), Tl, To); + T19 = VSUB(T17, T18); + T1q = VADD(T17, T18); + T2y = VSUB(T2h, T2i); + T2z = VSUB(T2e, T2f); + T2A = VADD(T2y, T2z); + T2L = VSUB(T2z, T2y); + } + } + { + V T31, T32, T33, T34, T35, T36, T37, T38, T39, T3a, T3b, T3c; + { + V T2d, T2n, T2m, T2o; + { + V T1X, T2c, T2k, T2l; + T1X = VSUB(T1T, T1W); + T2c = VADD(T24, T2b); + T2d = VFNMS(LDK(KP707106781), T2c, T1X); + T2n = VFMA(LDK(KP707106781), T2c, T1X); + T2k = VSUB(T2g, T2j); + T2l = VSUB(T2b, T24); + T2m = VFNMS(LDK(KP707106781), T2l, T2k); + T2o = VFMA(LDK(KP707106781), T2l, T2k); + } + T31 = VFNMSI(T2m, T2d); + STM2(&(xo[24]), T31, ovs, &(xo[0])); + T32 = VFMAI(T2o, T2n); + STM2(&(xo[8]), T32, ovs, &(xo[0])); + T33 = VFMAI(T2m, T2d); + STM2(&(xo[40]), T33, ovs, &(xo[0])); + T34 = VFNMSI(T2o, T2n); + STM2(&(xo[56]), T34, ovs, &(xo[0])); + } + { + V T2r, T2v, T2u, T2w; + { + V T2p, T2q, T2s, T2t; + T2p = VADD(T1T, T1W); + T2q = VADD(T2j, T2g); + T2r = VADD(T2p, T2q); + T2v = VSUB(T2p, T2q); + T2s = VADD(T20, T23); + T2t = VADD(T27, T2a); + T2u = VADD(T2s, T2t); + T2w = VSUB(T2t, T2s); + } + T35 = VSUB(T2r, T2u); + STM2(&(xo[32]), T35, ovs, &(xo[0])); + T36 = VFMAI(T2w, T2v); + STM2(&(xo[16]), T36, ovs, &(xo[0])); + T37 = VADD(T2r, T2u); + STM2(&(xo[0]), T37, ovs, &(xo[0])); + T38 = VFNMSI(T2w, T2v); + STM2(&(xo[48]), T38, ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VFNMS(LDK(KP707106781), T2A, T2x); + T2U = VADD(T2O, T2N); + T2V = VFNMS(LDK(KP923879532), T2U, T2T); + T2Z = VFMA(LDK(KP923879532), T2U, T2T); + T2W = VFNMS(LDK(KP707106781), T2L, T2K); + T2X = VSUB(T2H, T2E); + T2Y = VFMA(LDK(KP923879532), T2X, T2W); + T30 = VFNMS(LDK(KP923879532), T2X, T2W); + } + T39 = VFMAI(T2Y, T2V); + STM2(&(xo[20]), T39, ovs, &(xo[0])); + T3a = VFMAI(T30, T2Z); + STM2(&(xo[52]), T3a, ovs, &(xo[0])); + T3b = VFNMSI(T2Y, T2V); + STM2(&(xo[44]), T3b, ovs, &(xo[0])); + T3c = VFNMSI(T30, T2Z); + STM2(&(xo[12]), T3c, ovs, &(xo[0])); + } + { + V T3d, T3e, T3f, T3g; + { + V T2J, T2R, T2Q, T2S; + { + V T2B, T2I, T2M, T2P; + T2B = VFMA(LDK(KP707106781), T2A, T2x); + T2I = VADD(T2E, T2H); + T2J = VFNMS(LDK(KP923879532), T2I, T2B); + T2R = VFMA(LDK(KP923879532), T2I, T2B); + T2M = VFMA(LDK(KP707106781), T2L, T2K); + T2P = VSUB(T2N, T2O); + T2Q = VFNMS(LDK(KP923879532), T2P, T2M); + T2S = VFMA(LDK(KP923879532), T2P, T2M); + } + T3d = VFNMSI(T2Q, T2J); + STM2(&(xo[28]), T3d, ovs, &(xo[0])); + T3e = VFMAI(T2S, T2R); + STM2(&(xo[4]), T3e, ovs, &(xo[0])); + T3f = VFMAI(T2Q, T2J); + STM2(&(xo[36]), T3f, ovs, &(xo[0])); + T3g = VFNMSI(T2S, T2R); + STM2(&(xo[60]), T3g, ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1J, T1F, T1K, T1y, T1N; + T1r = VFMA(LDK(KP923879532), T1q, T1p); + T1C = VFMA(LDK(KP923879532), T1B, T1A); + T1M = VFNMS(LDK(KP923879532), T1B, T1A); + T1J = VFNMS(LDK(KP923879532), T1q, T1p); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP668178637), T1s, T1t); + T1E = VFNMS(LDK(KP668178637), T1v, T1w); + T1F = VSUB(T1D, T1E); + T1K = VADD(T1D, T1E); + T1u = VFMA(LDK(KP668178637), T1t, T1s); + T1x = VFMA(LDK(KP668178637), T1w, T1v); + T1y = VADD(T1u, T1x); + T1N = VSUB(T1x, T1u); + } + { + V T1z, T1G, T3h, T3i; + T1z = VFNMS(LDK(KP831469612), T1y, T1r); + T1G = VFNMS(LDK(KP831469612), T1F, T1C); + T3h = VFNMSI(T1G, T1z); + STM2(&(xo[26]), T3h, ovs, &(xo[2])); + STN2(&(xo[24]), T31, T3h, ovs); + T3i = VFMAI(T1G, T1z); + STM2(&(xo[38]), T3i, ovs, &(xo[2])); + STN2(&(xo[36]), T3f, T3i, ovs); + } + { + V T1P, T1Q, T3j, T3k; + T1P = VFNMS(LDK(KP831469612), T1K, T1J); + T1Q = VFNMS(LDK(KP831469612), T1N, T1M); + T3j = VFNMSI(T1Q, T1P); + STM2(&(xo[10]), T3j, ovs, &(xo[2])); + STN2(&(xo[8]), T32, T3j, ovs); + T3k = VFMAI(T1Q, T1P); + STM2(&(xo[54]), T3k, ovs, &(xo[2])); + STN2(&(xo[52]), T3a, T3k, ovs); + } + { + V T1H, T1I, T3l, T3m; + T1H = VFMA(LDK(KP831469612), T1y, T1r); + T1I = VFMA(LDK(KP831469612), T1F, T1C); + T3l = VFNMSI(T1I, T1H); + STM2(&(xo[58]), T3l, ovs, &(xo[2])); + STN2(&(xo[56]), T34, T3l, ovs); + T3m = VFMAI(T1I, T1H); + STM2(&(xo[6]), T3m, ovs, &(xo[2])); + STN2(&(xo[4]), T3e, T3m, ovs); + } + { + V T1L, T1O, T3n, T3o; + T1L = VFMA(LDK(KP831469612), T1K, T1J); + T1O = VFMA(LDK(KP831469612), T1N, T1M); + T3n = VFMAI(T1O, T1L); + STM2(&(xo[22]), T3n, ovs, &(xo[2])); + STN2(&(xo[20]), T39, T3n, ovs); + T3o = VFNMSI(T1O, T1L); + STM2(&(xo[42]), T3o, ovs, &(xo[2])); + STN2(&(xo[40]), T33, T3o, ovs); + } + } + { + V Tr, T1a, T1k, T1h, T1d, T1i, T10, T1l; + Tr = VFMA(LDK(KP923879532), Tq, Tb); + T1a = VFMA(LDK(KP923879532), T19, T16); + T1k = VFNMS(LDK(KP923879532), T19, T16); + T1h = VFNMS(LDK(KP923879532), Tq, Tb); + { + V T1b, T1c, TI, TZ; + T1b = VFMA(LDK(KP198912367), TC, TH); + T1c = VFMA(LDK(KP198912367), TT, TY); + T1d = VSUB(T1b, T1c); + T1i = VADD(T1b, T1c); + TI = VFNMS(LDK(KP198912367), TH, TC); + TZ = VFNMS(LDK(KP198912367), TY, TT); + T10 = VADD(TI, TZ); + T1l = VSUB(TZ, TI); + } + { + V T11, T1e, T3p, T3q; + T11 = VFNMS(LDK(KP980785280), T10, Tr); + T1e = VFNMS(LDK(KP980785280), T1d, T1a); + T3p = VFNMSI(T1e, T11); + STM2(&(xo[34]), T3p, ovs, &(xo[2])); + STN2(&(xo[32]), T35, T3p, ovs); + T3q = VFMAI(T1e, T11); + STM2(&(xo[30]), T3q, ovs, &(xo[2])); + STN2(&(xo[28]), T3d, T3q, ovs); + } + { + V T1n, T1o, T3r, T3s; + T1n = VFMA(LDK(KP980785280), T1i, T1h); + T1o = VFMA(LDK(KP980785280), T1l, T1k); + T3r = VFMAI(T1o, T1n); + STM2(&(xo[14]), T3r, ovs, &(xo[2])); + STN2(&(xo[12]), T3c, T3r, ovs); + T3s = VFNMSI(T1o, T1n); + STM2(&(xo[50]), T3s, ovs, &(xo[2])); + STN2(&(xo[48]), T38, T3s, ovs); + } + { + V T1f, T1g, T3t, T3u; + T1f = VFMA(LDK(KP980785280), T10, Tr); + T1g = VFMA(LDK(KP980785280), T1d, T1a); + T3t = VFNMSI(T1g, T1f); + STM2(&(xo[2]), T3t, ovs, &(xo[2])); + STN2(&(xo[0]), T37, T3t, ovs); + T3u = VFMAI(T1g, T1f); + STM2(&(xo[62]), T3u, ovs, &(xo[2])); + STN2(&(xo[60]), T3g, T3u, ovs); + } + { + V T1j, T1m, T3v, T3w; + T1j = VFNMS(LDK(KP980785280), T1i, T1h); + T1m = VFNMS(LDK(KP980785280), T1l, T1k); + T3v = VFNMSI(T1m, T1j); + STM2(&(xo[18]), T3v, ovs, &(xo[2])); + STN2(&(xo[16]), T36, T3v, ovs); + T3w = VFMAI(T1m, T1j); + STM2(&(xo[46]), T3w, ovs, &(xo[2])); + STN2(&(xo[44]), T3b, T3w, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n2fv_32"), {88, 0, 98, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_32) (planner *p) { + X(kdft_register) (p, n2fv_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name n2fv_32 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 186 FP additions, 42 FP multiplications, + * (or, 170 additions, 26 multiplications, 16 fused multiply/add), + * 72 stack variables, 7 constants, and 80 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T1T, T1W, T2K, T2x, T16, T1A, Tb, T1p, TT, T1v, TY, T1w, T27, T2a, T2b; + V T2H, T2O, TC, T1s, TH, T1t, T20, T23, T24, T2E, T2N, T2g, T2j, Tq, T1B; + V T19, T1q, T2A, T2L; + { + V T3, T1R, T15, T1S, T6, T1U, T9, T1V, T12, Ta; + { + V T1, T2, T13, T14; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T1R = VADD(T1, T2); + T13 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T14 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T15 = VSUB(T13, T14); + T1S = VADD(T13, T14); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T1U = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T1V = VADD(T7, T8); + } + T1T = VADD(T1R, T1S); + T1W = VADD(T1U, T1V); + T2K = VSUB(T1V, T1U); + T2x = VSUB(T1R, T1S); + T12 = VMUL(LDK(KP707106781), VSUB(T9, T6)); + T16 = VSUB(T12, T15); + T1A = VADD(T15, T12); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VADD(T3, Ta); + T1p = VSUB(T3, Ta); + } + { + V TL, T25, TX, T26, TO, T28, TR, T29; + { + V TJ, TK, TV, TW; + TJ = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + TK = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + TL = VSUB(TJ, TK); + T25 = VADD(TJ, TK); + TV = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + TW = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + TX = VSUB(TV, TW); + T26 = VADD(TV, TW); + } + { + V TM, TN, TP, TQ; + TM = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + TN = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + TO = VSUB(TM, TN); + T28 = VADD(TM, TN); + TP = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + TQ = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + TR = VSUB(TP, TQ); + T29 = VADD(TP, TQ); + } + { + V TS, TU, T2F, T2G; + TS = VMUL(LDK(KP707106781), VADD(TO, TR)); + TT = VADD(TL, TS); + T1v = VSUB(TL, TS); + TU = VMUL(LDK(KP707106781), VSUB(TR, TO)); + TY = VSUB(TU, TX); + T1w = VADD(TX, TU); + T27 = VADD(T25, T26); + T2a = VADD(T28, T29); + T2b = VSUB(T27, T2a); + T2F = VSUB(T25, T26); + T2G = VSUB(T29, T28); + T2H = VFNMS(LDK(KP382683432), T2G, VMUL(LDK(KP923879532), T2F)); + T2O = VFMA(LDK(KP382683432), T2F, VMUL(LDK(KP923879532), T2G)); + } + } + { + V Tu, T1Y, TG, T1Z, Tx, T21, TA, T22; + { + V Ts, Tt, TE, TF; + Ts = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + Tt = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + Tu = VSUB(Ts, Tt); + T1Y = VADD(Ts, Tt); + TE = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + TF = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + TG = VSUB(TE, TF); + T1Z = VADD(TE, TF); + } + { + V Tv, Tw, Ty, Tz; + Tv = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + Tw = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + Tx = VSUB(Tv, Tw); + T21 = VADD(Tv, Tw); + Ty = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + Tz = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + TA = VSUB(Ty, Tz); + T22 = VADD(Ty, Tz); + } + { + V TB, TD, T2C, T2D; + TB = VMUL(LDK(KP707106781), VADD(Tx, TA)); + TC = VADD(Tu, TB); + T1s = VSUB(Tu, TB); + TD = VMUL(LDK(KP707106781), VSUB(TA, Tx)); + TH = VSUB(TD, TG); + T1t = VADD(TG, TD); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VSUB(T20, T23); + T2C = VSUB(T1Y, T1Z); + T2D = VSUB(T22, T21); + T2E = VFMA(LDK(KP923879532), T2C, VMUL(LDK(KP382683432), T2D)); + T2N = VFNMS(LDK(KP382683432), T2C, VMUL(LDK(KP923879532), T2D)); + } + } + { + V Te, T2h, To, T2f, Th, T2i, Tl, T2e, Ti, Tp; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T2h = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T2f = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T2i = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T2e = VADD(Tj, Tk); + } + T2g = VADD(T2e, T2f); + T2j = VADD(T2h, T2i); + Ti = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + Tp = VFMA(LDK(KP923879532), Tl, VMUL(LDK(KP382683432), To)); + Tq = VADD(Ti, Tp); + T1B = VSUB(Tp, Ti); + { + V T17, T18, T2y, T2z; + T17 = VFNMS(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T18 = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + T19 = VSUB(T17, T18); + T1q = VADD(T18, T17); + T2y = VSUB(T2h, T2i); + T2z = VSUB(T2e, T2f); + T2A = VMUL(LDK(KP707106781), VADD(T2y, T2z)); + T2L = VMUL(LDK(KP707106781), VSUB(T2z, T2y)); + } + } + { + V T31, T32, T33, T34, T35, T36, T37, T38, T39, T3a, T3b, T3c; + { + V T2d, T2n, T2m, T2o; + { + V T1X, T2c, T2k, T2l; + T1X = VSUB(T1T, T1W); + T2c = VMUL(LDK(KP707106781), VADD(T24, T2b)); + T2d = VADD(T1X, T2c); + T2n = VSUB(T1X, T2c); + T2k = VSUB(T2g, T2j); + T2l = VMUL(LDK(KP707106781), VSUB(T2b, T24)); + T2m = VBYI(VADD(T2k, T2l)); + T2o = VBYI(VSUB(T2l, T2k)); + } + T31 = VSUB(T2d, T2m); + STM2(&(xo[56]), T31, ovs, &(xo[0])); + T32 = VADD(T2n, T2o); + STM2(&(xo[24]), T32, ovs, &(xo[0])); + T33 = VADD(T2d, T2m); + STM2(&(xo[8]), T33, ovs, &(xo[0])); + T34 = VSUB(T2n, T2o); + STM2(&(xo[40]), T34, ovs, &(xo[0])); + } + { + V T2r, T2v, T2u, T2w; + { + V T2p, T2q, T2s, T2t; + T2p = VADD(T1T, T1W); + T2q = VADD(T2j, T2g); + T2r = VADD(T2p, T2q); + T2v = VSUB(T2p, T2q); + T2s = VADD(T20, T23); + T2t = VADD(T27, T2a); + T2u = VADD(T2s, T2t); + T2w = VBYI(VSUB(T2t, T2s)); + } + T35 = VSUB(T2r, T2u); + STM2(&(xo[32]), T35, ovs, &(xo[0])); + T36 = VADD(T2v, T2w); + STM2(&(xo[16]), T36, ovs, &(xo[0])); + T37 = VADD(T2r, T2u); + STM2(&(xo[0]), T37, ovs, &(xo[0])); + T38 = VSUB(T2v, T2w); + STM2(&(xo[48]), T38, ovs, &(xo[0])); + } + { + V T2V, T2Z, T2Y, T30; + { + V T2T, T2U, T2W, T2X; + T2T = VSUB(T2H, T2E); + T2U = VSUB(T2L, T2K); + T2V = VBYI(VSUB(T2T, T2U)); + T2Z = VBYI(VADD(T2U, T2T)); + T2W = VSUB(T2x, T2A); + T2X = VSUB(T2O, T2N); + T2Y = VSUB(T2W, T2X); + T30 = VADD(T2W, T2X); + } + T39 = VADD(T2V, T2Y); + STM2(&(xo[20]), T39, ovs, &(xo[0])); + T3a = VSUB(T30, T2Z); + STM2(&(xo[52]), T3a, ovs, &(xo[0])); + T3b = VSUB(T2Y, T2V); + STM2(&(xo[44]), T3b, ovs, &(xo[0])); + T3c = VADD(T2Z, T30); + STM2(&(xo[12]), T3c, ovs, &(xo[0])); + } + { + V T3d, T3e, T3f, T3g; + { + V T2J, T2R, T2Q, T2S; + { + V T2B, T2I, T2M, T2P; + T2B = VADD(T2x, T2A); + T2I = VADD(T2E, T2H); + T2J = VADD(T2B, T2I); + T2R = VSUB(T2B, T2I); + T2M = VADD(T2K, T2L); + T2P = VADD(T2N, T2O); + T2Q = VBYI(VADD(T2M, T2P)); + T2S = VBYI(VSUB(T2P, T2M)); + } + T3d = VSUB(T2J, T2Q); + STM2(&(xo[60]), T3d, ovs, &(xo[0])); + T3e = VADD(T2R, T2S); + STM2(&(xo[28]), T3e, ovs, &(xo[0])); + T3f = VADD(T2J, T2Q); + STM2(&(xo[4]), T3f, ovs, &(xo[0])); + T3g = VSUB(T2R, T2S); + STM2(&(xo[36]), T3g, ovs, &(xo[0])); + } + { + V T1r, T1C, T1M, T1K, T1F, T1N, T1y, T1J; + T1r = VADD(T1p, T1q); + T1C = VADD(T1A, T1B); + T1M = VSUB(T1p, T1q); + T1K = VSUB(T1B, T1A); + { + V T1D, T1E, T1u, T1x; + T1D = VFNMS(LDK(KP555570233), T1s, VMUL(LDK(KP831469612), T1t)); + T1E = VFMA(LDK(KP555570233), T1v, VMUL(LDK(KP831469612), T1w)); + T1F = VADD(T1D, T1E); + T1N = VSUB(T1E, T1D); + T1u = VFMA(LDK(KP831469612), T1s, VMUL(LDK(KP555570233), T1t)); + T1x = VFNMS(LDK(KP555570233), T1w, VMUL(LDK(KP831469612), T1v)); + T1y = VADD(T1u, T1x); + T1J = VSUB(T1x, T1u); + } + { + V T1z, T1G, T3h, T3i; + T1z = VADD(T1r, T1y); + T1G = VBYI(VADD(T1C, T1F)); + T3h = VSUB(T1z, T1G); + STM2(&(xo[58]), T3h, ovs, &(xo[2])); + STN2(&(xo[56]), T31, T3h, ovs); + T3i = VADD(T1z, T1G); + STM2(&(xo[6]), T3i, ovs, &(xo[2])); + STN2(&(xo[4]), T3f, T3i, ovs); + } + { + V T1P, T1Q, T3j, T3k; + T1P = VBYI(VADD(T1K, T1J)); + T1Q = VADD(T1M, T1N); + T3j = VADD(T1P, T1Q); + STM2(&(xo[10]), T3j, ovs, &(xo[2])); + STN2(&(xo[8]), T33, T3j, ovs); + T3k = VSUB(T1Q, T1P); + STM2(&(xo[54]), T3k, ovs, &(xo[2])); + STN2(&(xo[52]), T3a, T3k, ovs); + } + { + V T1H, T1I, T3l, T3m; + T1H = VSUB(T1r, T1y); + T1I = VBYI(VSUB(T1F, T1C)); + T3l = VSUB(T1H, T1I); + STM2(&(xo[38]), T3l, ovs, &(xo[2])); + STN2(&(xo[36]), T3g, T3l, ovs); + T3m = VADD(T1H, T1I); + STM2(&(xo[26]), T3m, ovs, &(xo[2])); + STN2(&(xo[24]), T32, T3m, ovs); + } + { + V T1L, T1O, T3n, T3o; + T1L = VBYI(VSUB(T1J, T1K)); + T1O = VSUB(T1M, T1N); + T3n = VADD(T1L, T1O); + STM2(&(xo[22]), T3n, ovs, &(xo[2])); + STN2(&(xo[20]), T39, T3n, ovs); + T3o = VSUB(T1O, T1L); + STM2(&(xo[42]), T3o, ovs, &(xo[2])); + STN2(&(xo[40]), T34, T3o, ovs); + } + } + { + V Tr, T1a, T1k, T1i, T1d, T1l, T10, T1h; + Tr = VADD(Tb, Tq); + T1a = VADD(T16, T19); + T1k = VSUB(Tb, Tq); + T1i = VSUB(T19, T16); + { + V T1b, T1c, TI, TZ; + T1b = VFNMS(LDK(KP195090322), TC, VMUL(LDK(KP980785280), TH)); + T1c = VFMA(LDK(KP195090322), TT, VMUL(LDK(KP980785280), TY)); + T1d = VADD(T1b, T1c); + T1l = VSUB(T1c, T1b); + TI = VFMA(LDK(KP980785280), TC, VMUL(LDK(KP195090322), TH)); + TZ = VFNMS(LDK(KP195090322), TY, VMUL(LDK(KP980785280), TT)); + T10 = VADD(TI, TZ); + T1h = VSUB(TZ, TI); + } + { + V T11, T1e, T3p, T3q; + T11 = VADD(Tr, T10); + T1e = VBYI(VADD(T1a, T1d)); + T3p = VSUB(T11, T1e); + STM2(&(xo[62]), T3p, ovs, &(xo[2])); + STN2(&(xo[60]), T3d, T3p, ovs); + T3q = VADD(T11, T1e); + STM2(&(xo[2]), T3q, ovs, &(xo[2])); + STN2(&(xo[0]), T37, T3q, ovs); + } + { + V T1n, T1o, T3r, T3s; + T1n = VBYI(VADD(T1i, T1h)); + T1o = VADD(T1k, T1l); + T3r = VADD(T1n, T1o); + STM2(&(xo[14]), T3r, ovs, &(xo[2])); + STN2(&(xo[12]), T3c, T3r, ovs); + T3s = VSUB(T1o, T1n); + STM2(&(xo[50]), T3s, ovs, &(xo[2])); + STN2(&(xo[48]), T38, T3s, ovs); + } + { + V T1f, T1g, T3t, T3u; + T1f = VSUB(Tr, T10); + T1g = VBYI(VSUB(T1d, T1a)); + T3t = VSUB(T1f, T1g); + STM2(&(xo[34]), T3t, ovs, &(xo[2])); + STN2(&(xo[32]), T35, T3t, ovs); + T3u = VADD(T1f, T1g); + STM2(&(xo[30]), T3u, ovs, &(xo[2])); + STN2(&(xo[28]), T3e, T3u, ovs); + } + { + V T1j, T1m, T3v, T3w; + T1j = VBYI(VSUB(T1h, T1i)); + T1m = VSUB(T1k, T1l); + T3v = VADD(T1j, T1m); + STM2(&(xo[18]), T3v, ovs, &(xo[2])); + STN2(&(xo[16]), T36, T3v, ovs); + T3w = VSUB(T1m, T1j); + STM2(&(xo[46]), T3w, ovs, &(xo[2])); + STN2(&(xo[44]), T3b, T3w, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n2fv_32"), {170, 26, 16, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_32) (planner *p) { + X(kdft_register) (p, n2fv_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_4.c new file mode 100644 index 000000000..a3d664b0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_4.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name n2fv_4 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 8 FP additions, 2 FP multiplications, + * (or, 6 additions, 0 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 10 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T8 = VADD(T4, T5); + } + { + V T9, Ta, Tb, Tc; + T9 = VFNMSI(T6, T3); + STM2(&(xo[2]), T9, ovs, &(xo[2])); + Ta = VADD(T7, T8); + STM2(&(xo[0]), Ta, ovs, &(xo[0])); + STN2(&(xo[0]), Ta, T9, ovs); + Tb = VFMAI(T6, T3); + STM2(&(xo[6]), Tb, ovs, &(xo[2])); + Tc = VSUB(T7, T8); + STM2(&(xo[4]), Tc, ovs, &(xo[0])); + STN2(&(xo[4]), Tc, Tb, ovs); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n2fv_4"), {6, 0, 2, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_4) (planner *p) { + X(kdft_register) (p, n2fv_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name n2fv_4 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 8 FP additions, 0 FP multiplications, + * (or, 8 additions, 0 multiplications, 0 fused multiply/add), + * 11 stack variables, 0 constants, and 10 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(8, is), MAKE_VOLATILE_STRIDE(8, os)) { + V T3, T7, T6, T8; + { + V T1, T2, T4, T5; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T7 = VADD(T1, T2); + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T6 = VBYI(VSUB(T4, T5)); + T8 = VADD(T4, T5); + } + { + V T9, Ta, Tb, Tc; + T9 = VSUB(T3, T6); + STM2(&(xo[2]), T9, ovs, &(xo[2])); + Ta = VADD(T7, T8); + STM2(&(xo[0]), Ta, ovs, &(xo[0])); + STN2(&(xo[0]), Ta, T9, ovs); + Tb = VADD(T3, T6); + STM2(&(xo[6]), Tb, ovs, &(xo[2])); + Tc = VSUB(T7, T8); + STM2(&(xo[4]), Tc, ovs, &(xo[0])); + STN2(&(xo[4]), Tc, Tb, ovs); + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n2fv_4"), {8, 0, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_4) (planner *p) { + X(kdft_register) (p, n2fv_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_6.c new file mode 100644 index 000000000..2a5afadea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_6.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name n2fv_6 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 18 FP additions, 8 FP multiplications, + * (or, 12 additions, 2 multiplications, 6 fused multiply/add), + * 25 stack variables, 2 constants, and 15 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V T3, Td, T6, Te, T9, Tf, Ta, Tg, T1, T2, Tj, Tk; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Td = VADD(T1, T2); + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Te = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tg = VADD(Te, Tf); + Tj = VADD(T3, Ta); + STM2(&(xo[6]), Tj, ovs, &(xo[2])); + Tk = VADD(Td, Tg); + STM2(&(xo[0]), Tk, ovs, &(xo[0])); + { + V Tl, Tb, Tc, Tm; + Tb = VFNMS(LDK(KP500000000), Ta, T3); + Tc = VMUL(LDK(KP866025403), VSUB(T9, T6)); + Tl = VFNMSI(Tc, Tb); + STM2(&(xo[10]), Tl, ovs, &(xo[2])); + Tm = VFMAI(Tc, Tb); + STM2(&(xo[2]), Tm, ovs, &(xo[2])); + STN2(&(xo[0]), Tk, Tm, ovs); + { + V Th, Ti, Tn, To; + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VMUL(LDK(KP866025403), VSUB(Tf, Te)); + Tn = VFNMSI(Ti, Th); + STM2(&(xo[4]), Tn, ovs, &(xo[0])); + STN2(&(xo[4]), Tn, Tj, ovs); + To = VFMAI(Ti, Th); + STM2(&(xo[8]), To, ovs, &(xo[0])); + STN2(&(xo[8]), To, Tl, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n2fv_6"), {12, 2, 6, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_6) (planner *p) { + X(kdft_register) (p, n2fv_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name n2fv_6 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 18 FP additions, 4 FP multiplications, + * (or, 16 additions, 2 multiplications, 2 fused multiply/add), + * 25 stack variables, 2 constants, and 15 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_6(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(12, is), MAKE_VOLATILE_STRIDE(12, os)) { + V T3, Td, T6, Te, T9, Tf, Ta, Tg, T1, T2, Tj, Tk; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T3 = VSUB(T1, T2); + Td = VADD(T1, T2); + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + Te = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tg = VADD(Te, Tf); + Tj = VADD(T3, Ta); + STM2(&(xo[6]), Tj, ovs, &(xo[2])); + Tk = VADD(Td, Tg); + STM2(&(xo[0]), Tk, ovs, &(xo[0])); + { + V Tl, Tb, Tc, Tm; + Tb = VFNMS(LDK(KP500000000), Ta, T3); + Tc = VBYI(VMUL(LDK(KP866025403), VSUB(T9, T6))); + Tl = VSUB(Tb, Tc); + STM2(&(xo[10]), Tl, ovs, &(xo[2])); + Tm = VADD(Tb, Tc); + STM2(&(xo[2]), Tm, ovs, &(xo[2])); + STN2(&(xo[0]), Tk, Tm, ovs); + { + V Th, Ti, Tn, To; + Th = VFNMS(LDK(KP500000000), Tg, Td); + Ti = VBYI(VMUL(LDK(KP866025403), VSUB(Tf, Te))); + Tn = VSUB(Th, Ti); + STM2(&(xo[4]), Tn, ovs, &(xo[0])); + STN2(&(xo[4]), Tn, Tj, ovs); + To = VADD(Th, Ti); + STM2(&(xo[8]), To, ovs, &(xo[0])); + STN2(&(xo[8]), To, Tl, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 6, XSIMD_STRING("n2fv_6"), {16, 2, 2, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_6) (planner *p) { + X(kdft_register) (p, n2fv_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_64.c new file mode 100644 index 000000000..280f25eea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_64.c @@ -0,0 +1,1882 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name n2fv_64 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 456 FP additions, 258 FP multiplications, + * (or, 198 additions, 0 multiplications, 258 fused multiply/add), + * 120 stack variables, 15 constants, and 160 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T7, T26, T47, T69, T5k, T6A, T2V, T3z, Tm, T27, T5n, T6a, T2Y, T3M, T4e; + V T6B, TC, T2a, T6e, T6E, T3l, T3A, T4o, T5p, TR, T29, T6h, T6D, T3i, T3B; + V T4x, T5q, T1N, T2x, T6t, T71, T6w, T72, T1W, T2y, T39, T3H, T57, T5N, T5e; + V T5O, T3c, T3I, T1g, T2u, T6m, T6Y, T6p, T6Z, T1p, T2v, T32, T3E, T4M, T5K; + V T4T, T5L, T35, T3F; + { + V T3, T43, T25, T44, T6, T5i, T22, T45; + { + V T1, T2, T23, T24; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VADD(T1, T2); + T43 = VSUB(T1, T2); + T23 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T24 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T25 = VADD(T23, T24); + T44 = VSUB(T23, T24); + } + { + V T4, T5, T20, T21; + T4 = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T6 = VADD(T4, T5); + T5i = VSUB(T4, T5); + T20 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T21 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T22 = VADD(T20, T21); + T45 = VSUB(T20, T21); + } + T7 = VSUB(T3, T6); + T26 = VSUB(T22, T25); + { + V T46, T5j, T2T, T2U; + T46 = VADD(T44, T45); + T47 = VFMA(LDK(KP707106781), T46, T43); + T69 = VFNMS(LDK(KP707106781), T46, T43); + T5j = VSUB(T45, T44); + T5k = VFNMS(LDK(KP707106781), T5j, T5i); + T6A = VFMA(LDK(KP707106781), T5j, T5i); + T2T = VADD(T3, T6); + T2U = VADD(T25, T22); + T2V = VADD(T2T, T2U); + T3z = VSUB(T2T, T2U); + } + } + { + V Ta, T48, Tk, T4c, Td, T49, Th, T4b; + { + V T8, T9, Ti, Tj; + T8 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T9 = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Ta = VADD(T8, T9); + T48 = VSUB(T8, T9); + Ti = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tj = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + Tk = VADD(Ti, Tj); + T4c = VSUB(Tj, Ti); + } + { + V Tb, Tc, Tf, Tg; + Tb = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tc = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Td = VADD(Tb, Tc); + T49 = VSUB(Tb, Tc); + Tf = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Th = VADD(Tf, Tg); + T4b = VSUB(Tf, Tg); + } + { + V Te, Tl, T5l, T5m; + Te = VSUB(Ta, Td); + Tl = VSUB(Th, Tk); + Tm = VADD(Te, Tl); + T27 = VSUB(Tl, Te); + T5l = VFMA(LDK(KP414213562), T48, T49); + T5m = VFMA(LDK(KP414213562), T4b, T4c); + T5n = VSUB(T5l, T5m); + T6a = VADD(T5l, T5m); + } + { + V T2W, T2X, T4a, T4d; + T2W = VADD(Ta, Td); + T2X = VADD(Th, Tk); + T2Y = VADD(T2W, T2X); + T3M = VSUB(T2X, T2W); + T4a = VFNMS(LDK(KP414213562), T49, T48); + T4d = VFNMS(LDK(KP414213562), T4c, T4b); + T4e = VADD(T4a, T4d); + T6B = VSUB(T4d, T4a); + } + } + { + V Tq, T4g, Tt, T4l, Tx, T4m, TA, T4j; + { + V To, Tp, Tr, Ts; + To = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Tp = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + Tq = VADD(To, Tp); + T4g = VSUB(To, Tp); + Tr = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + Ts = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + Tt = VADD(Tr, Ts); + T4l = VSUB(Tr, Ts); + { + V Tv, Tw, T4h, Ty, Tz, T4i; + Tv = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + T4h = VSUB(Tv, Tw); + Ty = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + T4i = VSUB(Ty, Tz); + Tx = VADD(Tv, Tw); + T4m = VSUB(T4h, T4i); + TA = VADD(Ty, Tz); + T4j = VADD(T4h, T4i); + } + } + { + V Tu, TB, T6c, T6d; + Tu = VSUB(Tq, Tt); + TB = VSUB(Tx, TA); + TC = VFNMS(LDK(KP414213562), TB, Tu); + T2a = VFMA(LDK(KP414213562), Tu, TB); + T6c = VFNMS(LDK(KP707106781), T4m, T4l); + T6d = VFNMS(LDK(KP707106781), T4j, T4g); + T6e = VFNMS(LDK(KP668178637), T6d, T6c); + T6E = VFMA(LDK(KP668178637), T6c, T6d); + } + { + V T3j, T3k, T4k, T4n; + T3j = VADD(Tq, Tt); + T3k = VADD(Tx, TA); + T3l = VADD(T3j, T3k); + T3A = VSUB(T3j, T3k); + T4k = VFMA(LDK(KP707106781), T4j, T4g); + T4n = VFMA(LDK(KP707106781), T4m, T4l); + T4o = VFNMS(LDK(KP198912367), T4n, T4k); + T5p = VFMA(LDK(KP198912367), T4k, T4n); + } + } + { + V TF, T4p, TI, T4u, TM, T4v, TP, T4s; + { + V TD, TE, TG, TH; + TD = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + TE = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + TF = VADD(TD, TE); + T4p = VSUB(TD, TE); + TG = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TH = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TI = VADD(TG, TH); + T4u = VSUB(TH, TG); + { + V TK, TL, T4r, TN, TO, T4q; + TK = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + TL = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + T4r = VSUB(TK, TL); + TN = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + TO = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + T4q = VSUB(TN, TO); + TM = VADD(TK, TL); + T4v = VSUB(T4r, T4q); + TP = VADD(TN, TO); + T4s = VADD(T4q, T4r); + } + } + { + V TJ, TQ, T6f, T6g; + TJ = VSUB(TF, TI); + TQ = VSUB(TM, TP); + TR = VFNMS(LDK(KP414213562), TQ, TJ); + T29 = VFMA(LDK(KP414213562), TJ, TQ); + T6f = VFNMS(LDK(KP707106781), T4v, T4u); + T6g = VFNMS(LDK(KP707106781), T4s, T4p); + T6h = VFNMS(LDK(KP668178637), T6g, T6f); + T6D = VFMA(LDK(KP668178637), T6f, T6g); + } + { + V T3g, T3h, T4t, T4w; + T3g = VADD(TF, TI); + T3h = VADD(TP, TM); + T3i = VADD(T3g, T3h); + T3B = VSUB(T3g, T3h); + T4t = VFMA(LDK(KP707106781), T4s, T4p); + T4w = VFMA(LDK(KP707106781), T4v, T4u); + T4x = VFNMS(LDK(KP198912367), T4w, T4t); + T5q = VFMA(LDK(KP198912367), T4t, T4w); + } + } + { + V T1t, T4V, T1w, T58, T1Q, T59, T1T, T4Y, T1A, T1D, T1E, T5b, T52, T1H, T1K; + V T1L, T5c, T55; + { + V T1r, T1s, T1u, T1v; + T1r = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T1s = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T1t = VADD(T1r, T1s); + T4V = VSUB(T1r, T1s); + T1u = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T1v = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T1w = VADD(T1u, T1v); + T58 = VSUB(T1v, T1u); + } + { + V T1O, T1P, T4X, T1R, T1S, T4W; + T1O = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T4X = VSUB(T1O, T1P); + T1R = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1S = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T4W = VSUB(T1R, T1S); + T1Q = VADD(T1O, T1P); + T59 = VSUB(T4X, T4W); + T1T = VADD(T1R, T1S); + T4Y = VADD(T4W, T4X); + } + { + V T50, T51, T53, T54; + { + V T1y, T1z, T1B, T1C; + T1y = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1z = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1A = VADD(T1y, T1z); + T50 = VSUB(T1y, T1z); + T1B = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1C = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1D = VADD(T1B, T1C); + T51 = VSUB(T1C, T1B); + } + T1E = VSUB(T1A, T1D); + T5b = VFNMS(LDK(KP414213562), T50, T51); + T52 = VFMA(LDK(KP414213562), T51, T50); + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1G = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1H = VADD(T1F, T1G); + T53 = VSUB(T1F, T1G); + T1I = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1J = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T1K = VADD(T1I, T1J); + T54 = VSUB(T1J, T1I); + } + T1L = VSUB(T1H, T1K); + T5c = VFMA(LDK(KP414213562), T53, T54); + T55 = VFNMS(LDK(KP414213562), T54, T53); + } + { + V T1x, T1M, T6r, T6s; + T1x = VSUB(T1t, T1w); + T1M = VADD(T1E, T1L); + T1N = VFMA(LDK(KP707106781), T1M, T1x); + T2x = VFNMS(LDK(KP707106781), T1M, T1x); + T6r = VFNMS(LDK(KP707106781), T4Y, T4V); + T6s = VSUB(T5c, T5b); + T6t = VFNMS(LDK(KP923879532), T6s, T6r); + T71 = VFMA(LDK(KP923879532), T6s, T6r); + } + { + V T6u, T6v, T1U, T1V; + T6u = VFNMS(LDK(KP707106781), T59, T58); + T6v = VSUB(T55, T52); + T6w = VFMA(LDK(KP923879532), T6v, T6u); + T72 = VFNMS(LDK(KP923879532), T6v, T6u); + T1U = VSUB(T1Q, T1T); + T1V = VSUB(T1L, T1E); + T1W = VFMA(LDK(KP707106781), T1V, T1U); + T2y = VFNMS(LDK(KP707106781), T1V, T1U); + } + { + V T37, T38, T4Z, T56; + T37 = VADD(T1t, T1w); + T38 = VADD(T1T, T1Q); + T39 = VADD(T37, T38); + T3H = VSUB(T37, T38); + T4Z = VFMA(LDK(KP707106781), T4Y, T4V); + T56 = VADD(T52, T55); + T57 = VFMA(LDK(KP923879532), T56, T4Z); + T5N = VFNMS(LDK(KP923879532), T56, T4Z); + } + { + V T5a, T5d, T3a, T3b; + T5a = VFMA(LDK(KP707106781), T59, T58); + T5d = VADD(T5b, T5c); + T5e = VFMA(LDK(KP923879532), T5d, T5a); + T5O = VFNMS(LDK(KP923879532), T5d, T5a); + T3a = VADD(T1A, T1D); + T3b = VADD(T1H, T1K); + T3c = VADD(T3a, T3b); + T3I = VSUB(T3b, T3a); + } + } + { + V TW, T4A, TZ, T4N, T1j, T4O, T1m, T4D, T13, T16, T17, T4Q, T4H, T1a, T1d; + V T1e, T4R, T4K; + { + V TU, TV, TX, TY; + TU = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + TV = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + TW = VADD(TU, TV); + T4A = VSUB(TU, TV); + TX = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + TY = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + TZ = VADD(TX, TY); + T4N = VSUB(TX, TY); + } + { + V T1h, T1i, T4B, T1k, T1l, T4C; + T1h = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T4B = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T4C = VSUB(T1k, T1l); + T1j = VADD(T1h, T1i); + T4O = VSUB(T4B, T4C); + T1m = VADD(T1k, T1l); + T4D = VADD(T4B, T4C); + } + { + V T4F, T4G, T4I, T4J; + { + V T11, T12, T14, T15; + T11 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T12 = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T13 = VADD(T11, T12); + T4F = VSUB(T11, T12); + T14 = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T15 = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T16 = VADD(T14, T15); + T4G = VSUB(T14, T15); + } + T17 = VSUB(T13, T16); + T4Q = VFMA(LDK(KP414213562), T4F, T4G); + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + { + V T18, T19, T1b, T1c; + T18 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T19 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T1a = VADD(T18, T19); + T4I = VSUB(T18, T19); + T1b = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T1c = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T1d = VADD(T1b, T1c); + T4J = VSUB(T1b, T1c); + } + T1e = VSUB(T1a, T1d); + T4R = VFNMS(LDK(KP414213562), T4I, T4J); + T4K = VFMA(LDK(KP414213562), T4J, T4I); + } + { + V T10, T1f, T6k, T6l; + T10 = VSUB(TW, TZ); + T1f = VADD(T17, T1e); + T1g = VFMA(LDK(KP707106781), T1f, T10); + T2u = VFNMS(LDK(KP707106781), T1f, T10); + T6k = VFNMS(LDK(KP707106781), T4D, T4A); + T6l = VSUB(T4Q, T4R); + T6m = VFNMS(LDK(KP923879532), T6l, T6k); + T6Y = VFMA(LDK(KP923879532), T6l, T6k); + } + { + V T6n, T6o, T1n, T1o; + T6n = VFNMS(LDK(KP707106781), T4O, T4N); + T6o = VSUB(T4H, T4K); + T6p = VFMA(LDK(KP923879532), T6o, T6n); + T6Z = VFNMS(LDK(KP923879532), T6o, T6n); + T1n = VSUB(T1j, T1m); + T1o = VSUB(T17, T1e); + T1p = VFMA(LDK(KP707106781), T1o, T1n); + T2v = VFNMS(LDK(KP707106781), T1o, T1n); + } + { + V T30, T31, T4E, T4L; + T30 = VADD(TW, TZ); + T31 = VADD(T1j, T1m); + T32 = VADD(T30, T31); + T3E = VSUB(T30, T31); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4L = VADD(T4H, T4K); + T4M = VFMA(LDK(KP923879532), T4L, T4E); + T5K = VFNMS(LDK(KP923879532), T4L, T4E); + } + { + V T4P, T4S, T33, T34; + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4S = VADD(T4Q, T4R); + T4T = VFMA(LDK(KP923879532), T4S, T4P); + T5L = VFNMS(LDK(KP923879532), T4S, T4P); + T33 = VADD(T13, T16); + T34 = VADD(T1a, T1d); + T35 = VADD(T33, T34); + T3F = VSUB(T33, T34); + } + } + { + V T7n, T7o, T7p, T7q, T7r, T7s, T7t, T7u, T7w, T7y, T7A, T7B, T7E, T7G, T7I; + V T7J; + { + V T3t, T3x, T3w, T3y; + { + V T3r, T3s, T3u, T3v; + T3r = VADD(T2V, T2Y); + T3s = VADD(T3l, T3i); + T3t = VADD(T3r, T3s); + T3x = VSUB(T3r, T3s); + T3u = VADD(T32, T35); + T3v = VADD(T39, T3c); + T3w = VADD(T3u, T3v); + T3y = VSUB(T3v, T3u); + } + T7n = VSUB(T3t, T3w); + STM2(&(xo[64]), T7n, ovs, &(xo[0])); + T7o = VFMAI(T3y, T3x); + STM2(&(xo[32]), T7o, ovs, &(xo[0])); + T7p = VADD(T3t, T3w); + STM2(&(xo[0]), T7p, ovs, &(xo[0])); + T7q = VFNMSI(T3y, T3x); + STM2(&(xo[96]), T7q, ovs, &(xo[0])); + } + { + V T2Z, T3m, T3e, T3n, T36, T3d; + T2Z = VSUB(T2V, T2Y); + T3m = VSUB(T3i, T3l); + T36 = VSUB(T32, T35); + T3d = VSUB(T39, T3c); + T3e = VADD(T36, T3d); + T3n = VSUB(T3d, T36); + { + V T3f, T3o, T3p, T3q; + T3f = VFNMS(LDK(KP707106781), T3e, T2Z); + T3o = VFNMS(LDK(KP707106781), T3n, T3m); + T7r = VFNMSI(T3o, T3f); + STM2(&(xo[48]), T7r, ovs, &(xo[0])); + T7s = VFMAI(T3o, T3f); + STM2(&(xo[80]), T7s, ovs, &(xo[0])); + T3p = VFMA(LDK(KP707106781), T3e, T2Z); + T3q = VFMA(LDK(KP707106781), T3n, T3m); + T7t = VFNMSI(T3q, T3p); + STM2(&(xo[112]), T7t, ovs, &(xo[0])); + T7u = VFMAI(T3q, T3p); + STM2(&(xo[16]), T7u, ovs, &(xo[0])); + } + } + { + V T7v, T7x, T7z, T7C; + { + V T3D, T3V, T3O, T3Y, T3K, T3Z, T3R, T3W, T3C, T3N; + T3C = VADD(T3A, T3B); + T3D = VFMA(LDK(KP707106781), T3C, T3z); + T3V = VFNMS(LDK(KP707106781), T3C, T3z); + T3N = VSUB(T3B, T3A); + T3O = VFMA(LDK(KP707106781), T3N, T3M); + T3Y = VFNMS(LDK(KP707106781), T3N, T3M); + { + V T3G, T3J, T3P, T3Q; + T3G = VFNMS(LDK(KP414213562), T3F, T3E); + T3J = VFNMS(LDK(KP414213562), T3I, T3H); + T3K = VADD(T3G, T3J); + T3Z = VSUB(T3J, T3G); + T3P = VFMA(LDK(KP414213562), T3H, T3I); + T3Q = VFMA(LDK(KP414213562), T3E, T3F); + T3R = VSUB(T3P, T3Q); + T3W = VADD(T3Q, T3P); + } + { + V T3L, T3S, T41, T42; + T3L = VFNMS(LDK(KP923879532), T3K, T3D); + T3S = VFNMS(LDK(KP923879532), T3R, T3O); + T7v = VFNMSI(T3S, T3L); + STM2(&(xo[56]), T7v, ovs, &(xo[0])); + T7w = VFMAI(T3S, T3L); + STM2(&(xo[72]), T7w, ovs, &(xo[0])); + T41 = VFMA(LDK(KP923879532), T3W, T3V); + T42 = VFNMS(LDK(KP923879532), T3Z, T3Y); + T7x = VFNMSI(T42, T41); + STM2(&(xo[24]), T7x, ovs, &(xo[0])); + T7y = VFMAI(T42, T41); + STM2(&(xo[104]), T7y, ovs, &(xo[0])); + } + { + V T3T, T3U, T3X, T40; + T3T = VFMA(LDK(KP923879532), T3K, T3D); + T3U = VFMA(LDK(KP923879532), T3R, T3O); + T7z = VFNMSI(T3U, T3T); + STM2(&(xo[120]), T7z, ovs, &(xo[0])); + T7A = VFMAI(T3U, T3T); + STM2(&(xo[8]), T7A, ovs, &(xo[0])); + T3X = VFNMS(LDK(KP923879532), T3W, T3V); + T40 = VFMA(LDK(KP923879532), T3Z, T3Y); + T7B = VFMAI(T40, T3X); + STM2(&(xo[40]), T7B, ovs, &(xo[0])); + T7C = VFNMSI(T40, T3X); + STM2(&(xo[88]), T7C, ovs, &(xo[0])); + } + } + { + V T6X, T7f, T7b, T7g, T74, T7j, T78, T7i; + { + V T6V, T6W, T79, T7a; + T6V = VFMA(LDK(KP923879532), T6a, T69); + T6W = VADD(T6E, T6D); + T6X = VFMA(LDK(KP831469612), T6W, T6V); + T7f = VFNMS(LDK(KP831469612), T6W, T6V); + T79 = VFNMS(LDK(KP303346683), T6Y, T6Z); + T7a = VFNMS(LDK(KP303346683), T71, T72); + T7b = VSUB(T79, T7a); + T7g = VADD(T79, T7a); + } + { + V T70, T73, T76, T77; + T70 = VFMA(LDK(KP303346683), T6Z, T6Y); + T73 = VFMA(LDK(KP303346683), T72, T71); + T74 = VADD(T70, T73); + T7j = VSUB(T73, T70); + T76 = VFMA(LDK(KP923879532), T6B, T6A); + T77 = VSUB(T6e, T6h); + T78 = VFMA(LDK(KP831469612), T77, T76); + T7i = VFNMS(LDK(KP831469612), T77, T76); + } + { + V T75, T7c, T7D, T7l, T7m, T7F; + T75 = VFNMS(LDK(KP956940335), T74, T6X); + T7c = VFNMS(LDK(KP956940335), T7b, T78); + T7D = VFNMSI(T7c, T75); + STM2(&(xo[58]), T7D, ovs, &(xo[2])); + STN2(&(xo[56]), T7v, T7D, ovs); + T7E = VFMAI(T7c, T75); + STM2(&(xo[70]), T7E, ovs, &(xo[2])); + T7l = VFNMS(LDK(KP956940335), T7g, T7f); + T7m = VFNMS(LDK(KP956940335), T7j, T7i); + T7F = VFNMSI(T7m, T7l); + STM2(&(xo[26]), T7F, ovs, &(xo[2])); + STN2(&(xo[24]), T7x, T7F, ovs); + T7G = VFMAI(T7m, T7l); + STM2(&(xo[102]), T7G, ovs, &(xo[2])); + } + { + V T7d, T7e, T7H, T7h, T7k, T7K; + T7d = VFMA(LDK(KP956940335), T74, T6X); + T7e = VFMA(LDK(KP956940335), T7b, T78); + T7H = VFNMSI(T7e, T7d); + STM2(&(xo[122]), T7H, ovs, &(xo[2])); + STN2(&(xo[120]), T7z, T7H, ovs); + T7I = VFMAI(T7e, T7d); + STM2(&(xo[6]), T7I, ovs, &(xo[2])); + T7h = VFMA(LDK(KP956940335), T7g, T7f); + T7k = VFMA(LDK(KP956940335), T7j, T7i); + T7J = VFMAI(T7k, T7h); + STM2(&(xo[38]), T7J, ovs, &(xo[2])); + T7K = VFNMSI(T7k, T7h); + STM2(&(xo[90]), T7K, ovs, &(xo[2])); + STN2(&(xo[88]), T7C, T7K, ovs); + } + } + } + { + V T7L, T7N, T7P, T7S; + { + V TT, T2j, T2f, T2k, T1Y, T2n, T2c, T2m; + { + V Tn, TS, T2d, T2e; + Tn = VFMA(LDK(KP707106781), Tm, T7); + TS = VADD(TC, TR); + TT = VFMA(LDK(KP923879532), TS, Tn); + T2j = VFNMS(LDK(KP923879532), TS, Tn); + T2d = VFMA(LDK(KP198912367), T1N, T1W); + T2e = VFMA(LDK(KP198912367), T1g, T1p); + T2f = VSUB(T2d, T2e); + T2k = VADD(T2e, T2d); + } + { + V T1q, T1X, T28, T2b; + T1q = VFNMS(LDK(KP198912367), T1p, T1g); + T1X = VFNMS(LDK(KP198912367), T1W, T1N); + T1Y = VADD(T1q, T1X); + T2n = VSUB(T1X, T1q); + T28 = VFMA(LDK(KP707106781), T27, T26); + T2b = VSUB(T29, T2a); + T2c = VFMA(LDK(KP923879532), T2b, T28); + T2m = VFNMS(LDK(KP923879532), T2b, T28); + } + { + V T1Z, T2g, T7M, T2p, T2q, T7O; + T1Z = VFNMS(LDK(KP980785280), T1Y, TT); + T2g = VFNMS(LDK(KP980785280), T2f, T2c); + T7L = VFNMSI(T2g, T1Z); + STM2(&(xo[60]), T7L, ovs, &(xo[0])); + T7M = VFMAI(T2g, T1Z); + STM2(&(xo[68]), T7M, ovs, &(xo[0])); + STN2(&(xo[68]), T7M, T7E, ovs); + T2p = VFMA(LDK(KP980785280), T2k, T2j); + T2q = VFNMS(LDK(KP980785280), T2n, T2m); + T7N = VFNMSI(T2q, T2p); + STM2(&(xo[28]), T7N, ovs, &(xo[0])); + T7O = VFMAI(T2q, T2p); + STM2(&(xo[100]), T7O, ovs, &(xo[0])); + STN2(&(xo[100]), T7O, T7G, ovs); + } + { + V T2h, T2i, T7Q, T2l, T2o, T7R; + T2h = VFMA(LDK(KP980785280), T1Y, TT); + T2i = VFMA(LDK(KP980785280), T2f, T2c); + T7P = VFNMSI(T2i, T2h); + STM2(&(xo[124]), T7P, ovs, &(xo[0])); + T7Q = VFMAI(T2i, T2h); + STM2(&(xo[4]), T7Q, ovs, &(xo[0])); + STN2(&(xo[4]), T7Q, T7I, ovs); + T2l = VFNMS(LDK(KP980785280), T2k, T2j); + T2o = VFMA(LDK(KP980785280), T2n, T2m); + T7R = VFMAI(T2o, T2l); + STM2(&(xo[36]), T7R, ovs, &(xo[0])); + STN2(&(xo[36]), T7R, T7J, ovs); + T7S = VFNMSI(T2o, T2l); + STM2(&(xo[92]), T7S, ovs, &(xo[0])); + } + } + { + V T4z, T5z, T5v, T5A, T5g, T5D, T5s, T5C; + { + V T4f, T4y, T5t, T5u; + T4f = VFMA(LDK(KP923879532), T4e, T47); + T4y = VADD(T4o, T4x); + T4z = VFMA(LDK(KP980785280), T4y, T4f); + T5z = VFNMS(LDK(KP980785280), T4y, T4f); + T5t = VFMA(LDK(KP098491403), T4M, T4T); + T5u = VFMA(LDK(KP098491403), T57, T5e); + T5v = VSUB(T5t, T5u); + T5A = VADD(T5t, T5u); + } + { + V T4U, T5f, T5o, T5r; + T4U = VFNMS(LDK(KP098491403), T4T, T4M); + T5f = VFNMS(LDK(KP098491403), T5e, T57); + T5g = VADD(T4U, T5f); + T5D = VSUB(T5f, T4U); + T5o = VFMA(LDK(KP923879532), T5n, T5k); + T5r = VSUB(T5p, T5q); + T5s = VFMA(LDK(KP980785280), T5r, T5o); + T5C = VFNMS(LDK(KP980785280), T5r, T5o); + } + { + V T5h, T5w, T7T, T7U; + T5h = VFNMS(LDK(KP995184726), T5g, T4z); + T5w = VFNMS(LDK(KP995184726), T5v, T5s); + T7T = VFNMSI(T5w, T5h); + STM2(&(xo[66]), T7T, ovs, &(xo[2])); + STN2(&(xo[64]), T7n, T7T, ovs); + T7U = VFMAI(T5w, T5h); + STM2(&(xo[62]), T7U, ovs, &(xo[2])); + STN2(&(xo[60]), T7L, T7U, ovs); + } + { + V T5F, T5G, T7V, T7W; + T5F = VFMA(LDK(KP995184726), T5A, T5z); + T5G = VFMA(LDK(KP995184726), T5D, T5C); + T7V = VFMAI(T5G, T5F); + STM2(&(xo[30]), T7V, ovs, &(xo[2])); + STN2(&(xo[28]), T7N, T7V, ovs); + T7W = VFNMSI(T5G, T5F); + STM2(&(xo[98]), T7W, ovs, &(xo[2])); + STN2(&(xo[96]), T7q, T7W, ovs); + } + { + V T5x, T5y, T7X, T7Y; + T5x = VFMA(LDK(KP995184726), T5g, T4z); + T5y = VFMA(LDK(KP995184726), T5v, T5s); + T7X = VFNMSI(T5y, T5x); + STM2(&(xo[2]), T7X, ovs, &(xo[2])); + STN2(&(xo[0]), T7p, T7X, ovs); + T7Y = VFMAI(T5y, T5x); + STM2(&(xo[126]), T7Y, ovs, &(xo[2])); + STN2(&(xo[124]), T7P, T7Y, ovs); + } + { + V T5B, T5E, T7Z, T80; + T5B = VFNMS(LDK(KP995184726), T5A, T5z); + T5E = VFNMS(LDK(KP995184726), T5D, T5C); + T7Z = VFNMSI(T5E, T5B); + STM2(&(xo[34]), T7Z, ovs, &(xo[2])); + STN2(&(xo[32]), T7o, T7Z, ovs); + T80 = VFMAI(T5E, T5B); + STM2(&(xo[94]), T80, ovs, &(xo[2])); + STN2(&(xo[92]), T7S, T80, ovs); + } + } + } + { + V T82, T83, T86, T88; + { + V T6j, T6N, T6J, T6O, T6y, T6R, T6G, T6Q; + { + V T6b, T6i, T6H, T6I; + T6b = VFNMS(LDK(KP923879532), T6a, T69); + T6i = VADD(T6e, T6h); + T6j = VFNMS(LDK(KP831469612), T6i, T6b); + T6N = VFMA(LDK(KP831469612), T6i, T6b); + T6H = VFMA(LDK(KP534511135), T6m, T6p); + T6I = VFMA(LDK(KP534511135), T6t, T6w); + T6J = VSUB(T6H, T6I); + T6O = VADD(T6H, T6I); + } + { + V T6q, T6x, T6C, T6F; + T6q = VFNMS(LDK(KP534511135), T6p, T6m); + T6x = VFNMS(LDK(KP534511135), T6w, T6t); + T6y = VADD(T6q, T6x); + T6R = VSUB(T6x, T6q); + T6C = VFNMS(LDK(KP923879532), T6B, T6A); + T6F = VSUB(T6D, T6E); + T6G = VFNMS(LDK(KP831469612), T6F, T6C); + T6Q = VFMA(LDK(KP831469612), T6F, T6C); + } + { + V T6z, T6K, T81, T6T, T6U, T84; + T6z = VFNMS(LDK(KP881921264), T6y, T6j); + T6K = VFNMS(LDK(KP881921264), T6J, T6G); + T81 = VFNMSI(T6K, T6z); + STM2(&(xo[74]), T81, ovs, &(xo[2])); + STN2(&(xo[72]), T7w, T81, ovs); + T82 = VFMAI(T6K, T6z); + STM2(&(xo[54]), T82, ovs, &(xo[2])); + T6T = VFMA(LDK(KP881921264), T6O, T6N); + T6U = VFMA(LDK(KP881921264), T6R, T6Q); + T83 = VFMAI(T6U, T6T); + STM2(&(xo[22]), T83, ovs, &(xo[2])); + T84 = VFNMSI(T6U, T6T); + STM2(&(xo[106]), T84, ovs, &(xo[2])); + STN2(&(xo[104]), T7y, T84, ovs); + } + { + V T6L, T6M, T85, T6P, T6S, T87; + T6L = VFMA(LDK(KP881921264), T6y, T6j); + T6M = VFMA(LDK(KP881921264), T6J, T6G); + T85 = VFNMSI(T6M, T6L); + STM2(&(xo[10]), T85, ovs, &(xo[2])); + STN2(&(xo[8]), T7A, T85, ovs); + T86 = VFMAI(T6M, T6L); + STM2(&(xo[118]), T86, ovs, &(xo[2])); + T6P = VFNMS(LDK(KP881921264), T6O, T6N); + T6S = VFNMS(LDK(KP881921264), T6R, T6Q); + T87 = VFNMSI(T6S, T6P); + STM2(&(xo[42]), T87, ovs, &(xo[2])); + STN2(&(xo[40]), T7B, T87, ovs); + T88 = VFMAI(T6S, T6P); + STM2(&(xo[86]), T88, ovs, &(xo[2])); + } + } + { + V T89, T8c, T8d, T8f; + { + V T2t, T2L, T2H, T2M, T2A, T2P, T2E, T2O; + { + V T2r, T2s, T2F, T2G; + T2r = VFNMS(LDK(KP707106781), Tm, T7); + T2s = VADD(T2a, T29); + T2t = VFMA(LDK(KP923879532), T2s, T2r); + T2L = VFNMS(LDK(KP923879532), T2s, T2r); + T2F = VFNMS(LDK(KP668178637), T2x, T2y); + T2G = VFNMS(LDK(KP668178637), T2u, T2v); + T2H = VSUB(T2F, T2G); + T2M = VADD(T2G, T2F); + } + { + V T2w, T2z, T2C, T2D; + T2w = VFMA(LDK(KP668178637), T2v, T2u); + T2z = VFMA(LDK(KP668178637), T2y, T2x); + T2A = VADD(T2w, T2z); + T2P = VSUB(T2z, T2w); + T2C = VFNMS(LDK(KP707106781), T27, T26); + T2D = VSUB(TR, TC); + T2E = VFNMS(LDK(KP923879532), T2D, T2C); + T2O = VFMA(LDK(KP923879532), T2D, T2C); + } + { + V T2B, T2I, T8a, T2R, T2S, T8b; + T2B = VFNMS(LDK(KP831469612), T2A, T2t); + T2I = VFNMS(LDK(KP831469612), T2H, T2E); + T89 = VFNMSI(T2I, T2B); + STM2(&(xo[76]), T89, ovs, &(xo[0])); + T8a = VFMAI(T2I, T2B); + STM2(&(xo[52]), T8a, ovs, &(xo[0])); + STN2(&(xo[52]), T8a, T82, ovs); + T2R = VFNMS(LDK(KP831469612), T2M, T2L); + T2S = VFMA(LDK(KP831469612), T2P, T2O); + T8b = VFMAI(T2S, T2R); + STM2(&(xo[20]), T8b, ovs, &(xo[0])); + STN2(&(xo[20]), T8b, T83, ovs); + T8c = VFNMSI(T2S, T2R); + STM2(&(xo[108]), T8c, ovs, &(xo[0])); + } + { + V T2J, T2K, T8e, T2N, T2Q, T8g; + T2J = VFMA(LDK(KP831469612), T2A, T2t); + T2K = VFMA(LDK(KP831469612), T2H, T2E); + T8d = VFNMSI(T2K, T2J); + STM2(&(xo[12]), T8d, ovs, &(xo[0])); + T8e = VFMAI(T2K, T2J); + STM2(&(xo[116]), T8e, ovs, &(xo[0])); + STN2(&(xo[116]), T8e, T86, ovs); + T2N = VFMA(LDK(KP831469612), T2M, T2L); + T2Q = VFNMS(LDK(KP831469612), T2P, T2O); + T8f = VFNMSI(T2Q, T2N); + STM2(&(xo[44]), T8f, ovs, &(xo[0])); + T8g = VFMAI(T2Q, T2N); + STM2(&(xo[84]), T8g, ovs, &(xo[0])); + STN2(&(xo[84]), T8g, T88, ovs); + } + } + { + V T5J, T61, T5X, T62, T5Q, T65, T5U, T64; + { + V T5H, T5I, T5V, T5W; + T5H = VFNMS(LDK(KP923879532), T4e, T47); + T5I = VADD(T5p, T5q); + T5J = VFMA(LDK(KP980785280), T5I, T5H); + T61 = VFNMS(LDK(KP980785280), T5I, T5H); + T5V = VFNMS(LDK(KP820678790), T5K, T5L); + T5W = VFNMS(LDK(KP820678790), T5N, T5O); + T5X = VSUB(T5V, T5W); + T62 = VADD(T5V, T5W); + } + { + V T5M, T5P, T5S, T5T; + T5M = VFMA(LDK(KP820678790), T5L, T5K); + T5P = VFMA(LDK(KP820678790), T5O, T5N); + T5Q = VADD(T5M, T5P); + T65 = VSUB(T5P, T5M); + T5S = VFNMS(LDK(KP923879532), T5n, T5k); + T5T = VSUB(T4x, T4o); + T5U = VFMA(LDK(KP980785280), T5T, T5S); + T64 = VFNMS(LDK(KP980785280), T5T, T5S); + } + { + V T5R, T5Y, T8h, T8i; + T5R = VFNMS(LDK(KP773010453), T5Q, T5J); + T5Y = VFNMS(LDK(KP773010453), T5X, T5U); + T8h = VFNMSI(T5Y, T5R); + STM2(&(xo[50]), T8h, ovs, &(xo[2])); + STN2(&(xo[48]), T7r, T8h, ovs); + T8i = VFMAI(T5Y, T5R); + STM2(&(xo[78]), T8i, ovs, &(xo[2])); + STN2(&(xo[76]), T89, T8i, ovs); + } + { + V T67, T68, T8j, T8k; + T67 = VFNMS(LDK(KP773010453), T62, T61); + T68 = VFNMS(LDK(KP773010453), T65, T64); + T8j = VFNMSI(T68, T67); + STM2(&(xo[18]), T8j, ovs, &(xo[2])); + STN2(&(xo[16]), T7u, T8j, ovs); + T8k = VFMAI(T68, T67); + STM2(&(xo[110]), T8k, ovs, &(xo[2])); + STN2(&(xo[108]), T8c, T8k, ovs); + } + { + V T5Z, T60, T8l, T8m; + T5Z = VFMA(LDK(KP773010453), T5Q, T5J); + T60 = VFMA(LDK(KP773010453), T5X, T5U); + T8l = VFNMSI(T60, T5Z); + STM2(&(xo[114]), T8l, ovs, &(xo[2])); + STN2(&(xo[112]), T7t, T8l, ovs); + T8m = VFMAI(T60, T5Z); + STM2(&(xo[14]), T8m, ovs, &(xo[2])); + STN2(&(xo[12]), T8d, T8m, ovs); + } + { + V T63, T66, T8n, T8o; + T63 = VFMA(LDK(KP773010453), T62, T61); + T66 = VFMA(LDK(KP773010453), T65, T64); + T8n = VFMAI(T66, T63); + STM2(&(xo[46]), T8n, ovs, &(xo[2])); + STN2(&(xo[44]), T8f, T8n, ovs); + T8o = VFNMSI(T66, T63); + STM2(&(xo[82]), T8o, ovs, &(xo[2])); + STN2(&(xo[80]), T7s, T8o, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n2fv_64"), {198, 0, 258, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_64) (planner *p) { + X(kdft_register) (p, n2fv_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name n2fv_64 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 456 FP additions, 124 FP multiplications, + * (or, 404 additions, 72 multiplications, 52 fused multiply/add), + * 128 stack variables, 15 constants, and 160 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T4p, T5q, Tb, T39, T2n, T3A, T6f, T6T, Tq, T3B, T6i, T76, T2i, T3a, T4w; + V T5r, TI, T2p, T6C, T6V, T3h, T3E, T4L, T5u, TZ, T2q, T6F, T6U, T3e, T3D; + V T4E, T5t, T23, T2N, T6t, T71, T6w, T72, T2c, T2O, T3t, T41, T5f, T5R, T5k; + V T5S, T3w, T42, T1s, T2K, T6m, T6Y, T6p, T6Z, T1B, T2L, T3m, T3Y, T4Y, T5O; + V T53, T5P, T3p, T3Z; + { + V T3, T4n, T2m, T4o, T6, T5p, T9, T5o; + { + V T1, T2, T2k, T2l; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 32)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + T4n = VADD(T1, T2); + T2k = LD(&(xi[WS(is, 16)]), ivs, &(xi[0])); + T2l = LD(&(xi[WS(is, 48)]), ivs, &(xi[0])); + T2m = VSUB(T2k, T2l); + T4o = VADD(T2k, T2l); + } + { + V T4, T5, T7, T8; + T4 = LD(&(xi[WS(is, 8)]), ivs, &(xi[0])); + T5 = LD(&(xi[WS(is, 40)]), ivs, &(xi[0])); + T6 = VSUB(T4, T5); + T5p = VADD(T4, T5); + T7 = LD(&(xi[WS(is, 56)]), ivs, &(xi[0])); + T8 = LD(&(xi[WS(is, 24)]), ivs, &(xi[0])); + T9 = VSUB(T7, T8); + T5o = VADD(T7, T8); + } + T4p = VSUB(T4n, T4o); + T5q = VSUB(T5o, T5p); + { + V Ta, T2j, T6d, T6e; + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tb = VADD(T3, Ta); + T39 = VSUB(T3, Ta); + T2j = VMUL(LDK(KP707106781), VSUB(T9, T6)); + T2n = VSUB(T2j, T2m); + T3A = VADD(T2m, T2j); + T6d = VADD(T4n, T4o); + T6e = VADD(T5p, T5o); + T6f = VADD(T6d, T6e); + T6T = VSUB(T6d, T6e); + } + } + { + V Te, T4q, To, T4u, Th, T4r, Tl, T4t; + { + V Tc, Td, Tm, Tn; + Tc = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 36)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + T4q = VADD(Tc, Td); + Tm = LD(&(xi[WS(is, 12)]), ivs, &(xi[0])); + Tn = LD(&(xi[WS(is, 44)]), ivs, &(xi[0])); + To = VSUB(Tm, Tn); + T4u = VADD(Tm, Tn); + } + { + V Tf, Tg, Tj, Tk; + Tf = LD(&(xi[WS(is, 20)]), ivs, &(xi[0])); + Tg = LD(&(xi[WS(is, 52)]), ivs, &(xi[0])); + Th = VSUB(Tf, Tg); + T4r = VADD(Tf, Tg); + Tj = LD(&(xi[WS(is, 60)]), ivs, &(xi[0])); + Tk = LD(&(xi[WS(is, 28)]), ivs, &(xi[0])); + Tl = VSUB(Tj, Tk); + T4t = VADD(Tj, Tk); + } + { + V Ti, Tp, T6g, T6h; + Ti = VFNMS(LDK(KP382683432), Th, VMUL(LDK(KP923879532), Te)); + Tp = VFMA(LDK(KP923879532), Tl, VMUL(LDK(KP382683432), To)); + Tq = VADD(Ti, Tp); + T3B = VSUB(Tp, Ti); + T6g = VADD(T4q, T4r); + T6h = VADD(T4t, T4u); + T6i = VADD(T6g, T6h); + T76 = VSUB(T6h, T6g); + } + { + V T2g, T2h, T4s, T4v; + T2g = VFNMS(LDK(KP923879532), To, VMUL(LDK(KP382683432), Tl)); + T2h = VFMA(LDK(KP382683432), Te, VMUL(LDK(KP923879532), Th)); + T2i = VSUB(T2g, T2h); + T3a = VADD(T2h, T2g); + T4s = VSUB(T4q, T4r); + T4v = VSUB(T4t, T4u); + T4w = VMUL(LDK(KP707106781), VADD(T4s, T4v)); + T5r = VMUL(LDK(KP707106781), VSUB(T4v, T4s)); + } + } + { + V Tu, T4F, TG, T4G, TB, T4J, TD, T4I; + { + V Ts, Tt, TE, TF; + Ts = LD(&(xi[WS(is, 62)]), ivs, &(xi[0])); + Tt = LD(&(xi[WS(is, 30)]), ivs, &(xi[0])); + Tu = VSUB(Ts, Tt); + T4F = VADD(Ts, Tt); + TE = LD(&(xi[WS(is, 14)]), ivs, &(xi[0])); + TF = LD(&(xi[WS(is, 46)]), ivs, &(xi[0])); + TG = VSUB(TE, TF); + T4G = VADD(TE, TF); + { + V Tv, Tw, Tx, Ty, Tz, TA; + Tv = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tw = LD(&(xi[WS(is, 38)]), ivs, &(xi[0])); + Tx = VSUB(Tv, Tw); + Ty = LD(&(xi[WS(is, 54)]), ivs, &(xi[0])); + Tz = LD(&(xi[WS(is, 22)]), ivs, &(xi[0])); + TA = VSUB(Ty, Tz); + TB = VMUL(LDK(KP707106781), VADD(Tx, TA)); + T4J = VADD(Tv, Tw); + TD = VMUL(LDK(KP707106781), VSUB(TA, Tx)); + T4I = VADD(Ty, Tz); + } + } + { + V TC, TH, T6A, T6B; + TC = VADD(Tu, TB); + TH = VSUB(TD, TG); + TI = VFMA(LDK(KP195090322), TC, VMUL(LDK(KP980785280), TH)); + T2p = VFNMS(LDK(KP195090322), TH, VMUL(LDK(KP980785280), TC)); + T6A = VADD(T4F, T4G); + T6B = VADD(T4J, T4I); + T6C = VADD(T6A, T6B); + T6V = VSUB(T6A, T6B); + } + { + V T3f, T3g, T4H, T4K; + T3f = VSUB(Tu, TB); + T3g = VADD(TG, TD); + T3h = VFNMS(LDK(KP555570233), T3g, VMUL(LDK(KP831469612), T3f)); + T3E = VFMA(LDK(KP555570233), T3f, VMUL(LDK(KP831469612), T3g)); + T4H = VSUB(T4F, T4G); + T4K = VSUB(T4I, T4J); + T4L = VFNMS(LDK(KP382683432), T4K, VMUL(LDK(KP923879532), T4H)); + T5u = VFMA(LDK(KP382683432), T4H, VMUL(LDK(KP923879532), T4K)); + } + } + { + V TS, T4z, TW, T4y, TP, T4C, TX, T4B; + { + V TQ, TR, TU, TV; + TQ = LD(&(xi[WS(is, 18)]), ivs, &(xi[0])); + TR = LD(&(xi[WS(is, 50)]), ivs, &(xi[0])); + TS = VSUB(TQ, TR); + T4z = VADD(TQ, TR); + TU = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + TV = LD(&(xi[WS(is, 34)]), ivs, &(xi[0])); + TW = VSUB(TU, TV); + T4y = VADD(TU, TV); + { + V TJ, TK, TL, TM, TN, TO; + TJ = LD(&(xi[WS(is, 58)]), ivs, &(xi[0])); + TK = LD(&(xi[WS(is, 26)]), ivs, &(xi[0])); + TL = VSUB(TJ, TK); + TM = LD(&(xi[WS(is, 10)]), ivs, &(xi[0])); + TN = LD(&(xi[WS(is, 42)]), ivs, &(xi[0])); + TO = VSUB(TM, TN); + TP = VMUL(LDK(KP707106781), VSUB(TL, TO)); + T4C = VADD(TM, TN); + TX = VMUL(LDK(KP707106781), VADD(TO, TL)); + T4B = VADD(TJ, TK); + } + } + { + V TT, TY, T6D, T6E; + TT = VSUB(TP, TS); + TY = VADD(TW, TX); + TZ = VFNMS(LDK(KP195090322), TY, VMUL(LDK(KP980785280), TT)); + T2q = VFMA(LDK(KP980785280), TY, VMUL(LDK(KP195090322), TT)); + T6D = VADD(T4y, T4z); + T6E = VADD(T4C, T4B); + T6F = VADD(T6D, T6E); + T6U = VSUB(T6D, T6E); + } + { + V T3c, T3d, T4A, T4D; + T3c = VSUB(TW, TX); + T3d = VADD(TS, TP); + T3e = VFMA(LDK(KP831469612), T3c, VMUL(LDK(KP555570233), T3d)); + T3D = VFNMS(LDK(KP555570233), T3c, VMUL(LDK(KP831469612), T3d)); + T4A = VSUB(T4y, T4z); + T4D = VSUB(T4B, T4C); + T4E = VFMA(LDK(KP923879532), T4A, VMUL(LDK(KP382683432), T4D)); + T5t = VFNMS(LDK(KP382683432), T4A, VMUL(LDK(KP923879532), T4D)); + } + } + { + V T1F, T55, T2a, T56, T1M, T5h, T27, T5g, T58, T59, T1U, T5a, T25, T5b, T5c; + V T21, T5d, T24; + { + V T1D, T1E, T28, T29; + T1D = LD(&(xi[WS(is, 63)]), ivs, &(xi[WS(is, 1)])); + T1E = LD(&(xi[WS(is, 31)]), ivs, &(xi[WS(is, 1)])); + T1F = VSUB(T1D, T1E); + T55 = VADD(T1D, T1E); + T28 = LD(&(xi[WS(is, 15)]), ivs, &(xi[WS(is, 1)])); + T29 = LD(&(xi[WS(is, 47)]), ivs, &(xi[WS(is, 1)])); + T2a = VSUB(T28, T29); + T56 = VADD(T28, T29); + } + { + V T1G, T1H, T1I, T1J, T1K, T1L; + T1G = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T1H = LD(&(xi[WS(is, 39)]), ivs, &(xi[WS(is, 1)])); + T1I = VSUB(T1G, T1H); + T1J = LD(&(xi[WS(is, 55)]), ivs, &(xi[WS(is, 1)])); + T1K = LD(&(xi[WS(is, 23)]), ivs, &(xi[WS(is, 1)])); + T1L = VSUB(T1J, T1K); + T1M = VMUL(LDK(KP707106781), VADD(T1I, T1L)); + T5h = VADD(T1G, T1H); + T27 = VMUL(LDK(KP707106781), VSUB(T1L, T1I)); + T5g = VADD(T1J, T1K); + } + { + V T1Q, T1T, T1X, T20; + { + V T1O, T1P, T1R, T1S; + T1O = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T1P = LD(&(xi[WS(is, 35)]), ivs, &(xi[WS(is, 1)])); + T1Q = VSUB(T1O, T1P); + T58 = VADD(T1O, T1P); + T1R = LD(&(xi[WS(is, 19)]), ivs, &(xi[WS(is, 1)])); + T1S = LD(&(xi[WS(is, 51)]), ivs, &(xi[WS(is, 1)])); + T1T = VSUB(T1R, T1S); + T59 = VADD(T1R, T1S); + } + T1U = VFNMS(LDK(KP382683432), T1T, VMUL(LDK(KP923879532), T1Q)); + T5a = VSUB(T58, T59); + T25 = VFMA(LDK(KP382683432), T1Q, VMUL(LDK(KP923879532), T1T)); + { + V T1V, T1W, T1Y, T1Z; + T1V = LD(&(xi[WS(is, 59)]), ivs, &(xi[WS(is, 1)])); + T1W = LD(&(xi[WS(is, 27)]), ivs, &(xi[WS(is, 1)])); + T1X = VSUB(T1V, T1W); + T5b = VADD(T1V, T1W); + T1Y = LD(&(xi[WS(is, 11)]), ivs, &(xi[WS(is, 1)])); + T1Z = LD(&(xi[WS(is, 43)]), ivs, &(xi[WS(is, 1)])); + T20 = VSUB(T1Y, T1Z); + T5c = VADD(T1Y, T1Z); + } + T21 = VFMA(LDK(KP923879532), T1X, VMUL(LDK(KP382683432), T20)); + T5d = VSUB(T5b, T5c); + T24 = VFNMS(LDK(KP923879532), T20, VMUL(LDK(KP382683432), T1X)); + } + { + V T1N, T22, T6r, T6s; + T1N = VADD(T1F, T1M); + T22 = VADD(T1U, T21); + T23 = VSUB(T1N, T22); + T2N = VADD(T1N, T22); + T6r = VADD(T55, T56); + T6s = VADD(T5h, T5g); + T6t = VADD(T6r, T6s); + T71 = VSUB(T6r, T6s); + } + { + V T6u, T6v, T26, T2b; + T6u = VADD(T58, T59); + T6v = VADD(T5b, T5c); + T6w = VADD(T6u, T6v); + T72 = VSUB(T6v, T6u); + T26 = VSUB(T24, T25); + T2b = VSUB(T27, T2a); + T2c = VSUB(T26, T2b); + T2O = VADD(T2b, T26); + } + { + V T3r, T3s, T57, T5e; + T3r = VSUB(T1F, T1M); + T3s = VADD(T25, T24); + T3t = VADD(T3r, T3s); + T41 = VSUB(T3r, T3s); + T57 = VSUB(T55, T56); + T5e = VMUL(LDK(KP707106781), VADD(T5a, T5d)); + T5f = VADD(T57, T5e); + T5R = VSUB(T57, T5e); + } + { + V T5i, T5j, T3u, T3v; + T5i = VSUB(T5g, T5h); + T5j = VMUL(LDK(KP707106781), VSUB(T5d, T5a)); + T5k = VADD(T5i, T5j); + T5S = VSUB(T5j, T5i); + T3u = VADD(T2a, T27); + T3v = VSUB(T21, T1U); + T3w = VADD(T3u, T3v); + T42 = VSUB(T3v, T3u); + } + } + { + V T1q, T4P, T1v, T4O, T1n, T50, T1w, T4Z, T4U, T4V, T18, T4W, T1z, T4R, T4S; + V T1f, T4T, T1y; + { + V T1o, T1p, T1t, T1u; + T1o = LD(&(xi[WS(is, 17)]), ivs, &(xi[WS(is, 1)])); + T1p = LD(&(xi[WS(is, 49)]), ivs, &(xi[WS(is, 1)])); + T1q = VSUB(T1o, T1p); + T4P = VADD(T1o, T1p); + T1t = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T1u = LD(&(xi[WS(is, 33)]), ivs, &(xi[WS(is, 1)])); + T1v = VSUB(T1t, T1u); + T4O = VADD(T1t, T1u); + } + { + V T1h, T1i, T1j, T1k, T1l, T1m; + T1h = LD(&(xi[WS(is, 57)]), ivs, &(xi[WS(is, 1)])); + T1i = LD(&(xi[WS(is, 25)]), ivs, &(xi[WS(is, 1)])); + T1j = VSUB(T1h, T1i); + T1k = LD(&(xi[WS(is, 9)]), ivs, &(xi[WS(is, 1)])); + T1l = LD(&(xi[WS(is, 41)]), ivs, &(xi[WS(is, 1)])); + T1m = VSUB(T1k, T1l); + T1n = VMUL(LDK(KP707106781), VSUB(T1j, T1m)); + T50 = VADD(T1k, T1l); + T1w = VMUL(LDK(KP707106781), VADD(T1m, T1j)); + T4Z = VADD(T1h, T1i); + } + { + V T14, T17, T1b, T1e; + { + V T12, T13, T15, T16; + T12 = LD(&(xi[WS(is, 61)]), ivs, &(xi[WS(is, 1)])); + T13 = LD(&(xi[WS(is, 29)]), ivs, &(xi[WS(is, 1)])); + T14 = VSUB(T12, T13); + T4U = VADD(T12, T13); + T15 = LD(&(xi[WS(is, 13)]), ivs, &(xi[WS(is, 1)])); + T16 = LD(&(xi[WS(is, 45)]), ivs, &(xi[WS(is, 1)])); + T17 = VSUB(T15, T16); + T4V = VADD(T15, T16); + } + T18 = VFNMS(LDK(KP923879532), T17, VMUL(LDK(KP382683432), T14)); + T4W = VSUB(T4U, T4V); + T1z = VFMA(LDK(KP923879532), T14, VMUL(LDK(KP382683432), T17)); + { + V T19, T1a, T1c, T1d; + T19 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T1a = LD(&(xi[WS(is, 37)]), ivs, &(xi[WS(is, 1)])); + T1b = VSUB(T19, T1a); + T4R = VADD(T19, T1a); + T1c = LD(&(xi[WS(is, 21)]), ivs, &(xi[WS(is, 1)])); + T1d = LD(&(xi[WS(is, 53)]), ivs, &(xi[WS(is, 1)])); + T1e = VSUB(T1c, T1d); + T4S = VADD(T1c, T1d); + } + T1f = VFMA(LDK(KP382683432), T1b, VMUL(LDK(KP923879532), T1e)); + T4T = VSUB(T4R, T4S); + T1y = VFNMS(LDK(KP382683432), T1e, VMUL(LDK(KP923879532), T1b)); + } + { + V T1g, T1r, T6k, T6l; + T1g = VSUB(T18, T1f); + T1r = VSUB(T1n, T1q); + T1s = VSUB(T1g, T1r); + T2K = VADD(T1r, T1g); + T6k = VADD(T4O, T4P); + T6l = VADD(T50, T4Z); + T6m = VADD(T6k, T6l); + T6Y = VSUB(T6k, T6l); + } + { + V T6n, T6o, T1x, T1A; + T6n = VADD(T4R, T4S); + T6o = VADD(T4U, T4V); + T6p = VADD(T6n, T6o); + T6Z = VSUB(T6o, T6n); + T1x = VADD(T1v, T1w); + T1A = VADD(T1y, T1z); + T1B = VSUB(T1x, T1A); + T2L = VADD(T1x, T1A); + } + { + V T3k, T3l, T4Q, T4X; + T3k = VSUB(T1v, T1w); + T3l = VADD(T1f, T18); + T3m = VADD(T3k, T3l); + T3Y = VSUB(T3k, T3l); + T4Q = VSUB(T4O, T4P); + T4X = VMUL(LDK(KP707106781), VADD(T4T, T4W)); + T4Y = VADD(T4Q, T4X); + T5O = VSUB(T4Q, T4X); + } + { + V T51, T52, T3n, T3o; + T51 = VSUB(T4Z, T50); + T52 = VMUL(LDK(KP707106781), VSUB(T4W, T4T)); + T53 = VADD(T51, T52); + T5P = VSUB(T52, T51); + T3n = VADD(T1q, T1n); + T3o = VSUB(T1z, T1y); + T3p = VADD(T3n, T3o); + T3Z = VSUB(T3o, T3n); + } + } + { + V T7n, T7o, T7p, T7q, T7r, T7s, T7t, T7u, T7v, T7w, T7x, T7y, T7z, T7A, T7B; + V T7C, T7D, T7E, T7F, T7G, T7H, T7I, T7J, T7K; + { + V T6N, T6R, T6Q, T6S; + { + V T6L, T6M, T6O, T6P; + T6L = VADD(T6f, T6i); + T6M = VADD(T6F, T6C); + T6N = VADD(T6L, T6M); + T6R = VSUB(T6L, T6M); + T6O = VADD(T6m, T6p); + T6P = VADD(T6t, T6w); + T6Q = VADD(T6O, T6P); + T6S = VBYI(VSUB(T6P, T6O)); + } + T7n = VSUB(T6N, T6Q); + STM2(&(xo[64]), T7n, ovs, &(xo[0])); + T7o = VADD(T6R, T6S); + STM2(&(xo[32]), T7o, ovs, &(xo[0])); + T7p = VADD(T6N, T6Q); + STM2(&(xo[0]), T7p, ovs, &(xo[0])); + T7q = VSUB(T6R, T6S); + STM2(&(xo[96]), T7q, ovs, &(xo[0])); + } + { + V T6j, T6G, T6y, T6H, T6q, T6x; + T6j = VSUB(T6f, T6i); + T6G = VSUB(T6C, T6F); + T6q = VSUB(T6m, T6p); + T6x = VSUB(T6t, T6w); + T6y = VMUL(LDK(KP707106781), VADD(T6q, T6x)); + T6H = VMUL(LDK(KP707106781), VSUB(T6x, T6q)); + { + V T6z, T6I, T6J, T6K; + T6z = VADD(T6j, T6y); + T6I = VBYI(VADD(T6G, T6H)); + T7r = VSUB(T6z, T6I); + STM2(&(xo[112]), T7r, ovs, &(xo[0])); + T7s = VADD(T6z, T6I); + STM2(&(xo[16]), T7s, ovs, &(xo[0])); + T6J = VSUB(T6j, T6y); + T6K = VBYI(VSUB(T6H, T6G)); + T7t = VSUB(T6J, T6K); + STM2(&(xo[80]), T7t, ovs, &(xo[0])); + T7u = VADD(T6J, T6K); + STM2(&(xo[48]), T7u, ovs, &(xo[0])); + } + } + { + V T6X, T7i, T78, T7g, T74, T7f, T7b, T7j, T6W, T77; + T6W = VMUL(LDK(KP707106781), VADD(T6U, T6V)); + T6X = VADD(T6T, T6W); + T7i = VSUB(T6T, T6W); + T77 = VMUL(LDK(KP707106781), VSUB(T6V, T6U)); + T78 = VADD(T76, T77); + T7g = VSUB(T77, T76); + { + V T70, T73, T79, T7a; + T70 = VFMA(LDK(KP923879532), T6Y, VMUL(LDK(KP382683432), T6Z)); + T73 = VFNMS(LDK(KP382683432), T72, VMUL(LDK(KP923879532), T71)); + T74 = VADD(T70, T73); + T7f = VSUB(T73, T70); + T79 = VFNMS(LDK(KP382683432), T6Y, VMUL(LDK(KP923879532), T6Z)); + T7a = VFMA(LDK(KP382683432), T71, VMUL(LDK(KP923879532), T72)); + T7b = VADD(T79, T7a); + T7j = VSUB(T7a, T79); + } + { + V T75, T7c, T7l, T7m; + T75 = VADD(T6X, T74); + T7c = VBYI(VADD(T78, T7b)); + T7v = VSUB(T75, T7c); + STM2(&(xo[120]), T7v, ovs, &(xo[0])); + T7w = VADD(T75, T7c); + STM2(&(xo[8]), T7w, ovs, &(xo[0])); + T7l = VBYI(VADD(T7g, T7f)); + T7m = VADD(T7i, T7j); + T7x = VADD(T7l, T7m); + STM2(&(xo[24]), T7x, ovs, &(xo[0])); + T7y = VSUB(T7m, T7l); + STM2(&(xo[104]), T7y, ovs, &(xo[0])); + } + { + V T7d, T7e, T7h, T7k; + T7d = VSUB(T6X, T74); + T7e = VBYI(VSUB(T7b, T78)); + T7z = VSUB(T7d, T7e); + STM2(&(xo[72]), T7z, ovs, &(xo[0])); + T7A = VADD(T7d, T7e); + STM2(&(xo[56]), T7A, ovs, &(xo[0])); + T7h = VBYI(VSUB(T7f, T7g)); + T7k = VSUB(T7i, T7j); + T7B = VADD(T7h, T7k); + STM2(&(xo[40]), T7B, ovs, &(xo[0])); + T7C = VSUB(T7k, T7h); + STM2(&(xo[88]), T7C, ovs, &(xo[0])); + } + } + { + V T5N, T68, T61, T69, T5U, T65, T5Y, T66; + { + V T5L, T5M, T5Z, T60; + T5L = VSUB(T4p, T4w); + T5M = VSUB(T5u, T5t); + T5N = VADD(T5L, T5M); + T68 = VSUB(T5L, T5M); + T5Z = VFNMS(LDK(KP555570233), T5O, VMUL(LDK(KP831469612), T5P)); + T60 = VFMA(LDK(KP555570233), T5R, VMUL(LDK(KP831469612), T5S)); + T61 = VADD(T5Z, T60); + T69 = VSUB(T60, T5Z); + } + { + V T5Q, T5T, T5W, T5X; + T5Q = VFMA(LDK(KP831469612), T5O, VMUL(LDK(KP555570233), T5P)); + T5T = VFNMS(LDK(KP555570233), T5S, VMUL(LDK(KP831469612), T5R)); + T5U = VADD(T5Q, T5T); + T65 = VSUB(T5T, T5Q); + T5W = VSUB(T5r, T5q); + T5X = VSUB(T4L, T4E); + T5Y = VADD(T5W, T5X); + T66 = VSUB(T5X, T5W); + } + { + V T5V, T62, T6b, T6c; + T5V = VADD(T5N, T5U); + T62 = VBYI(VADD(T5Y, T61)); + T7D = VSUB(T5V, T62); + STM2(&(xo[116]), T7D, ovs, &(xo[0])); + T7E = VADD(T5V, T62); + STM2(&(xo[12]), T7E, ovs, &(xo[0])); + T6b = VBYI(VADD(T66, T65)); + T6c = VADD(T68, T69); + T7F = VADD(T6b, T6c); + STM2(&(xo[20]), T7F, ovs, &(xo[0])); + T7G = VSUB(T6c, T6b); + STM2(&(xo[108]), T7G, ovs, &(xo[0])); + } + { + V T63, T64, T67, T6a; + T63 = VSUB(T5N, T5U); + T64 = VBYI(VSUB(T61, T5Y)); + T7H = VSUB(T63, T64); + STM2(&(xo[76]), T7H, ovs, &(xo[0])); + T7I = VADD(T63, T64); + STM2(&(xo[52]), T7I, ovs, &(xo[0])); + T67 = VBYI(VSUB(T65, T66)); + T6a = VSUB(T68, T69); + T7J = VADD(T67, T6a); + STM2(&(xo[44]), T7J, ovs, &(xo[0])); + T7K = VSUB(T6a, T67); + STM2(&(xo[84]), T7K, ovs, &(xo[0])); + } + } + { + V T7U, T7W, T7X, T7Z; + { + V T11, T2C, T2v, T2D, T2e, T2z, T2s, T2A; + { + V Tr, T10, T2t, T2u; + Tr = VSUB(Tb, Tq); + T10 = VSUB(TI, TZ); + T11 = VADD(Tr, T10); + T2C = VSUB(Tr, T10); + T2t = VFNMS(LDK(KP634393284), T1B, VMUL(LDK(KP773010453), T1s)); + T2u = VFMA(LDK(KP773010453), T2c, VMUL(LDK(KP634393284), T23)); + T2v = VADD(T2t, T2u); + T2D = VSUB(T2u, T2t); + } + { + V T1C, T2d, T2o, T2r; + T1C = VFMA(LDK(KP634393284), T1s, VMUL(LDK(KP773010453), T1B)); + T2d = VFNMS(LDK(KP634393284), T2c, VMUL(LDK(KP773010453), T23)); + T2e = VADD(T1C, T2d); + T2z = VSUB(T2d, T1C); + T2o = VSUB(T2i, T2n); + T2r = VSUB(T2p, T2q); + T2s = VADD(T2o, T2r); + T2A = VSUB(T2r, T2o); + } + { + V T2f, T2w, T7L, T7M; + T2f = VADD(T11, T2e); + T2w = VBYI(VADD(T2s, T2v)); + T7L = VSUB(T2f, T2w); + STM2(&(xo[114]), T7L, ovs, &(xo[2])); + STN2(&(xo[112]), T7r, T7L, ovs); + T7M = VADD(T2f, T2w); + STM2(&(xo[14]), T7M, ovs, &(xo[2])); + STN2(&(xo[12]), T7E, T7M, ovs); + } + { + V T2F, T2G, T7N, T7O; + T2F = VBYI(VADD(T2A, T2z)); + T2G = VADD(T2C, T2D); + T7N = VADD(T2F, T2G); + STM2(&(xo[18]), T7N, ovs, &(xo[2])); + STN2(&(xo[16]), T7s, T7N, ovs); + T7O = VSUB(T2G, T2F); + STM2(&(xo[110]), T7O, ovs, &(xo[2])); + STN2(&(xo[108]), T7G, T7O, ovs); + } + { + V T2x, T2y, T7P, T7Q; + T2x = VSUB(T11, T2e); + T2y = VBYI(VSUB(T2v, T2s)); + T7P = VSUB(T2x, T2y); + STM2(&(xo[78]), T7P, ovs, &(xo[2])); + STN2(&(xo[76]), T7H, T7P, ovs); + T7Q = VADD(T2x, T2y); + STM2(&(xo[50]), T7Q, ovs, &(xo[2])); + STN2(&(xo[48]), T7u, T7Q, ovs); + } + { + V T2B, T2E, T7R, T7S; + T2B = VBYI(VSUB(T2z, T2A)); + T2E = VSUB(T2C, T2D); + T7R = VADD(T2B, T2E); + STM2(&(xo[46]), T7R, ovs, &(xo[2])); + STN2(&(xo[44]), T7J, T7R, ovs); + T7S = VSUB(T2E, T2B); + STM2(&(xo[82]), T7S, ovs, &(xo[2])); + STN2(&(xo[80]), T7t, T7S, ovs); + } + } + { + V T3j, T3Q, T3J, T3R, T3y, T3N, T3G, T3O; + { + V T3b, T3i, T3H, T3I; + T3b = VADD(T39, T3a); + T3i = VADD(T3e, T3h); + T3j = VADD(T3b, T3i); + T3Q = VSUB(T3b, T3i); + T3H = VFNMS(LDK(KP290284677), T3m, VMUL(LDK(KP956940335), T3p)); + T3I = VFMA(LDK(KP290284677), T3t, VMUL(LDK(KP956940335), T3w)); + T3J = VADD(T3H, T3I); + T3R = VSUB(T3I, T3H); + } + { + V T3q, T3x, T3C, T3F; + T3q = VFMA(LDK(KP956940335), T3m, VMUL(LDK(KP290284677), T3p)); + T3x = VFNMS(LDK(KP290284677), T3w, VMUL(LDK(KP956940335), T3t)); + T3y = VADD(T3q, T3x); + T3N = VSUB(T3x, T3q); + T3C = VADD(T3A, T3B); + T3F = VADD(T3D, T3E); + T3G = VADD(T3C, T3F); + T3O = VSUB(T3F, T3C); + } + { + V T3z, T3K, T7T, T3T, T3U, T7V; + T3z = VADD(T3j, T3y); + T3K = VBYI(VADD(T3G, T3J)); + T7T = VSUB(T3z, T3K); + STM2(&(xo[122]), T7T, ovs, &(xo[2])); + STN2(&(xo[120]), T7v, T7T, ovs); + T7U = VADD(T3z, T3K); + STM2(&(xo[6]), T7U, ovs, &(xo[2])); + T3T = VBYI(VADD(T3O, T3N)); + T3U = VADD(T3Q, T3R); + T7V = VADD(T3T, T3U); + STM2(&(xo[26]), T7V, ovs, &(xo[2])); + STN2(&(xo[24]), T7x, T7V, ovs); + T7W = VSUB(T3U, T3T); + STM2(&(xo[102]), T7W, ovs, &(xo[2])); + } + { + V T3L, T3M, T7Y, T3P, T3S, T80; + T3L = VSUB(T3j, T3y); + T3M = VBYI(VSUB(T3J, T3G)); + T7X = VSUB(T3L, T3M); + STM2(&(xo[70]), T7X, ovs, &(xo[2])); + T7Y = VADD(T3L, T3M); + STM2(&(xo[58]), T7Y, ovs, &(xo[2])); + STN2(&(xo[56]), T7A, T7Y, ovs); + T3P = VBYI(VSUB(T3N, T3O)); + T3S = VSUB(T3Q, T3R); + T7Z = VADD(T3P, T3S); + STM2(&(xo[38]), T7Z, ovs, &(xo[2])); + T80 = VSUB(T3S, T3P); + STM2(&(xo[90]), T80, ovs, &(xo[2])); + STN2(&(xo[88]), T7C, T80, ovs); + } + } + { + V T81, T83, T86, T88; + { + V T4N, T5G, T5z, T5H, T5m, T5D, T5w, T5E; + { + V T4x, T4M, T5x, T5y; + T4x = VADD(T4p, T4w); + T4M = VADD(T4E, T4L); + T4N = VADD(T4x, T4M); + T5G = VSUB(T4x, T4M); + T5x = VFNMS(LDK(KP195090322), T4Y, VMUL(LDK(KP980785280), T53)); + T5y = VFMA(LDK(KP195090322), T5f, VMUL(LDK(KP980785280), T5k)); + T5z = VADD(T5x, T5y); + T5H = VSUB(T5y, T5x); + } + { + V T54, T5l, T5s, T5v; + T54 = VFMA(LDK(KP980785280), T4Y, VMUL(LDK(KP195090322), T53)); + T5l = VFNMS(LDK(KP195090322), T5k, VMUL(LDK(KP980785280), T5f)); + T5m = VADD(T54, T5l); + T5D = VSUB(T5l, T54); + T5s = VADD(T5q, T5r); + T5v = VADD(T5t, T5u); + T5w = VADD(T5s, T5v); + T5E = VSUB(T5v, T5s); + } + { + V T5n, T5A, T82, T5J, T5K, T84; + T5n = VADD(T4N, T5m); + T5A = VBYI(VADD(T5w, T5z)); + T81 = VSUB(T5n, T5A); + STM2(&(xo[124]), T81, ovs, &(xo[0])); + T82 = VADD(T5n, T5A); + STM2(&(xo[4]), T82, ovs, &(xo[0])); + STN2(&(xo[4]), T82, T7U, ovs); + T5J = VBYI(VADD(T5E, T5D)); + T5K = VADD(T5G, T5H); + T83 = VADD(T5J, T5K); + STM2(&(xo[28]), T83, ovs, &(xo[0])); + T84 = VSUB(T5K, T5J); + STM2(&(xo[100]), T84, ovs, &(xo[0])); + STN2(&(xo[100]), T84, T7W, ovs); + } + { + V T5B, T5C, T85, T5F, T5I, T87; + T5B = VSUB(T4N, T5m); + T5C = VBYI(VSUB(T5z, T5w)); + T85 = VSUB(T5B, T5C); + STM2(&(xo[68]), T85, ovs, &(xo[0])); + STN2(&(xo[68]), T85, T7X, ovs); + T86 = VADD(T5B, T5C); + STM2(&(xo[60]), T86, ovs, &(xo[0])); + T5F = VBYI(VSUB(T5D, T5E)); + T5I = VSUB(T5G, T5H); + T87 = VADD(T5F, T5I); + STM2(&(xo[36]), T87, ovs, &(xo[0])); + STN2(&(xo[36]), T87, T7Z, ovs); + T88 = VSUB(T5I, T5F); + STM2(&(xo[92]), T88, ovs, &(xo[0])); + } + } + { + V T2J, T34, T2X, T35, T2Q, T31, T2U, T32; + { + V T2H, T2I, T2V, T2W; + T2H = VADD(Tb, Tq); + T2I = VADD(T2q, T2p); + T2J = VADD(T2H, T2I); + T34 = VSUB(T2H, T2I); + T2V = VFNMS(LDK(KP098017140), T2L, VMUL(LDK(KP995184726), T2K)); + T2W = VFMA(LDK(KP995184726), T2O, VMUL(LDK(KP098017140), T2N)); + T2X = VADD(T2V, T2W); + T35 = VSUB(T2W, T2V); + } + { + V T2M, T2P, T2S, T2T; + T2M = VFMA(LDK(KP098017140), T2K, VMUL(LDK(KP995184726), T2L)); + T2P = VFNMS(LDK(KP098017140), T2O, VMUL(LDK(KP995184726), T2N)); + T2Q = VADD(T2M, T2P); + T31 = VSUB(T2P, T2M); + T2S = VADD(T2n, T2i); + T2T = VADD(TZ, TI); + T2U = VADD(T2S, T2T); + T32 = VSUB(T2T, T2S); + } + { + V T2R, T2Y, T89, T8a; + T2R = VADD(T2J, T2Q); + T2Y = VBYI(VADD(T2U, T2X)); + T89 = VSUB(T2R, T2Y); + STM2(&(xo[126]), T89, ovs, &(xo[2])); + STN2(&(xo[124]), T81, T89, ovs); + T8a = VADD(T2R, T2Y); + STM2(&(xo[2]), T8a, ovs, &(xo[2])); + STN2(&(xo[0]), T7p, T8a, ovs); + } + { + V T37, T38, T8b, T8c; + T37 = VBYI(VADD(T32, T31)); + T38 = VADD(T34, T35); + T8b = VADD(T37, T38); + STM2(&(xo[30]), T8b, ovs, &(xo[2])); + STN2(&(xo[28]), T83, T8b, ovs); + T8c = VSUB(T38, T37); + STM2(&(xo[98]), T8c, ovs, &(xo[2])); + STN2(&(xo[96]), T7q, T8c, ovs); + } + { + V T2Z, T30, T8d, T8e; + T2Z = VSUB(T2J, T2Q); + T30 = VBYI(VSUB(T2X, T2U)); + T8d = VSUB(T2Z, T30); + STM2(&(xo[66]), T8d, ovs, &(xo[2])); + STN2(&(xo[64]), T7n, T8d, ovs); + T8e = VADD(T2Z, T30); + STM2(&(xo[62]), T8e, ovs, &(xo[2])); + STN2(&(xo[60]), T86, T8e, ovs); + } + { + V T33, T36, T8f, T8g; + T33 = VBYI(VSUB(T31, T32)); + T36 = VSUB(T34, T35); + T8f = VADD(T33, T36); + STM2(&(xo[34]), T8f, ovs, &(xo[2])); + STN2(&(xo[32]), T7o, T8f, ovs); + T8g = VSUB(T36, T33); + STM2(&(xo[94]), T8g, ovs, &(xo[2])); + STN2(&(xo[92]), T88, T8g, ovs); + } + } + { + V T3X, T4i, T4b, T4j, T44, T4f, T48, T4g; + { + V T3V, T3W, T49, T4a; + T3V = VSUB(T39, T3a); + T3W = VSUB(T3E, T3D); + T3X = VADD(T3V, T3W); + T4i = VSUB(T3V, T3W); + T49 = VFNMS(LDK(KP471396736), T3Y, VMUL(LDK(KP881921264), T3Z)); + T4a = VFMA(LDK(KP471396736), T41, VMUL(LDK(KP881921264), T42)); + T4b = VADD(T49, T4a); + T4j = VSUB(T4a, T49); + } + { + V T40, T43, T46, T47; + T40 = VFMA(LDK(KP881921264), T3Y, VMUL(LDK(KP471396736), T3Z)); + T43 = VFNMS(LDK(KP471396736), T42, VMUL(LDK(KP881921264), T41)); + T44 = VADD(T40, T43); + T4f = VSUB(T43, T40); + T46 = VSUB(T3B, T3A); + T47 = VSUB(T3h, T3e); + T48 = VADD(T46, T47); + T4g = VSUB(T47, T46); + } + { + V T45, T4c, T8h, T8i; + T45 = VADD(T3X, T44); + T4c = VBYI(VADD(T48, T4b)); + T8h = VSUB(T45, T4c); + STM2(&(xo[118]), T8h, ovs, &(xo[2])); + STN2(&(xo[116]), T7D, T8h, ovs); + T8i = VADD(T45, T4c); + STM2(&(xo[10]), T8i, ovs, &(xo[2])); + STN2(&(xo[8]), T7w, T8i, ovs); + } + { + V T4l, T4m, T8j, T8k; + T4l = VBYI(VADD(T4g, T4f)); + T4m = VADD(T4i, T4j); + T8j = VADD(T4l, T4m); + STM2(&(xo[22]), T8j, ovs, &(xo[2])); + STN2(&(xo[20]), T7F, T8j, ovs); + T8k = VSUB(T4m, T4l); + STM2(&(xo[106]), T8k, ovs, &(xo[2])); + STN2(&(xo[104]), T7y, T8k, ovs); + } + { + V T4d, T4e, T8l, T8m; + T4d = VSUB(T3X, T44); + T4e = VBYI(VSUB(T4b, T48)); + T8l = VSUB(T4d, T4e); + STM2(&(xo[74]), T8l, ovs, &(xo[2])); + STN2(&(xo[72]), T7z, T8l, ovs); + T8m = VADD(T4d, T4e); + STM2(&(xo[54]), T8m, ovs, &(xo[2])); + STN2(&(xo[52]), T7I, T8m, ovs); + } + { + V T4h, T4k, T8n, T8o; + T4h = VBYI(VSUB(T4f, T4g)); + T4k = VSUB(T4i, T4j); + T8n = VADD(T4h, T4k); + STM2(&(xo[42]), T8n, ovs, &(xo[2])); + STN2(&(xo[40]), T7B, T8n, ovs); + T8o = VSUB(T4k, T4h); + STM2(&(xo[86]), T8o, ovs, &(xo[2])); + STN2(&(xo[84]), T7K, T8o, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n2fv_64"), {404, 72, 52, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_64) (planner *p) { + X(kdft_register) (p, n2fv_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_8.c new file mode 100644 index 000000000..b109c6a3e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2fv_8.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:07 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name n2fv_8 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 26 FP additions, 10 FP multiplications, + * (or, 16 additions, 0 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 20 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tj, Te, Tk, Ta, Tn, Tf, Tm, Tr, Tu; + { + V T1, T2, Tc, Td; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tj = VADD(T1, T2); + Tc = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Td = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Ta = VADD(T6, T9); + Tn = VADD(T7, T8); + Tf = VSUB(T9, T6); + Tm = VADD(T4, T5); + } + } + { + V Ts, Tb, Tg, Tp, Tq, Tt; + Tb = VFMA(LDK(KP707106781), Ta, T3); + Tg = VFNMS(LDK(KP707106781), Tf, Te); + Tr = VFNMSI(Tg, Tb); + STM2(&(xo[2]), Tr, ovs, &(xo[2])); + Ts = VFMAI(Tg, Tb); + STM2(&(xo[14]), Ts, ovs, &(xo[2])); + Tp = VSUB(Tj, Tk); + Tq = VSUB(Tn, Tm); + Tt = VFNMSI(Tq, Tp); + STM2(&(xo[12]), Tt, ovs, &(xo[0])); + STN2(&(xo[12]), Tt, Ts, ovs); + Tu = VFMAI(Tq, Tp); + STM2(&(xo[4]), Tu, ovs, &(xo[0])); + } + { + V Tv, Th, Ti, Tw; + Th = VFNMS(LDK(KP707106781), Ta, T3); + Ti = VFMA(LDK(KP707106781), Tf, Te); + Tv = VFNMSI(Ti, Th); + STM2(&(xo[10]), Tv, ovs, &(xo[2])); + Tw = VFMAI(Ti, Th); + STM2(&(xo[6]), Tw, ovs, &(xo[2])); + STN2(&(xo[4]), Tu, Tw, ovs); + { + V Tl, To, Tx, Ty; + Tl = VADD(Tj, Tk); + To = VADD(Tm, Tn); + Tx = VSUB(Tl, To); + STM2(&(xo[8]), Tx, ovs, &(xo[0])); + STN2(&(xo[8]), Tx, Tv, ovs); + Ty = VADD(Tl, To); + STM2(&(xo[0]), Ty, ovs, &(xo[0])); + STN2(&(xo[0]), Ty, Tr, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n2fv_8"), {16, 0, 10, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_8) (planner *p) { + X(kdft_register) (p, n2fv_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name n2fv_8 -with-ostride 2 -include dft/simd/n2f.h -store-multiple 2 */ + +/* + * This function contains 26 FP additions, 2 FP multiplications, + * (or, 26 additions, 2 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 20 memory accesses + */ +#include "dft/simd/n2f.h" + +static void n2fv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + const R *xi; + R *xo; + xi = ri; + xo = ro; + for (i = v; i > 0; i = i - VL, xi = xi + (VL * ivs), xo = xo + (VL * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tj, Tf, Tk, Ta, Tn, Tc, Tm, Ts, Tu; + { + V T1, T2, Td, Te; + T1 = LD(&(xi[0]), ivs, &(xi[0])); + T2 = LD(&(xi[WS(is, 4)]), ivs, &(xi[0])); + T3 = VSUB(T1, T2); + Tj = VADD(T1, T2); + Td = LD(&(xi[WS(is, 2)]), ivs, &(xi[0])); + Te = LD(&(xi[WS(is, 6)]), ivs, &(xi[0])); + Tf = VSUB(Td, Te); + Tk = VADD(Td, Te); + { + V T4, T5, T6, T7, T8, T9; + T4 = LD(&(xi[WS(is, 1)]), ivs, &(xi[WS(is, 1)])); + T5 = LD(&(xi[WS(is, 5)]), ivs, &(xi[WS(is, 1)])); + T6 = VSUB(T4, T5); + T7 = LD(&(xi[WS(is, 7)]), ivs, &(xi[WS(is, 1)])); + T8 = LD(&(xi[WS(is, 3)]), ivs, &(xi[WS(is, 1)])); + T9 = VSUB(T7, T8); + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tn = VADD(T7, T8); + Tc = VMUL(LDK(KP707106781), VSUB(T9, T6)); + Tm = VADD(T4, T5); + } + } + { + V Tr, Tb, Tg, Tp, Tq, Tt; + Tb = VADD(T3, Ta); + Tg = VBYI(VSUB(Tc, Tf)); + Tr = VSUB(Tb, Tg); + STM2(&(xo[14]), Tr, ovs, &(xo[2])); + Ts = VADD(Tb, Tg); + STM2(&(xo[2]), Ts, ovs, &(xo[2])); + Tp = VSUB(Tj, Tk); + Tq = VBYI(VSUB(Tn, Tm)); + Tt = VSUB(Tp, Tq); + STM2(&(xo[12]), Tt, ovs, &(xo[0])); + STN2(&(xo[12]), Tt, Tr, ovs); + Tu = VADD(Tp, Tq); + STM2(&(xo[4]), Tu, ovs, &(xo[0])); + } + { + V Tv, Th, Ti, Tw; + Th = VSUB(T3, Ta); + Ti = VBYI(VADD(Tf, Tc)); + Tv = VSUB(Th, Ti); + STM2(&(xo[10]), Tv, ovs, &(xo[2])); + Tw = VADD(Th, Ti); + STM2(&(xo[6]), Tw, ovs, &(xo[2])); + STN2(&(xo[4]), Tu, Tw, ovs); + { + V Tl, To, Tx, Ty; + Tl = VADD(Tj, Tk); + To = VADD(Tm, Tn); + Tx = VSUB(Tl, To); + STM2(&(xo[8]), Tx, ovs, &(xo[0])); + STN2(&(xo[8]), Tx, Tv, ovs); + Ty = VADD(Tl, To); + STM2(&(xo[0]), Ty, ovs, &(xo[0])); + STN2(&(xo[0]), Ty, Ts, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n2fv_8"), {26, 2, 0, 0}, &GENUS, 0, 2, 0, 0 }; + +void XSIMD(codelet_n2fv_8) (planner *p) { + X(kdft_register) (p, n2fv_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_16.c new file mode 100644 index 000000000..75296a760 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_16.c @@ -0,0 +1,674 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name n2sv_16 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 144 FP additions, 40 FP multiplications, + * (or, 104 additions, 0 multiplications, 40 fused multiply/add), + * 74 stack variables, 3 constants, and 72 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T7, T1R, T25, TC, TN, T1x, T1H, T1l, Tt, T22, T2h, T1b, T1g, T1E, T1Z; + V T1D, Te, T1S, T26, TJ, TQ, T1m, T1n, TT, Tm, T1X, T2g, T10, T15, T1B; + V T1U, T1A; + { + V T3, TL, Ty, T1k, T6, T1j, TB, TM; + { + V T1, T2, Tw, Tx; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 8)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + TL = VSUB(T1, T2); + Tw = LD(&(ii[0]), ivs, &(ii[0])); + Tx = LD(&(ii[WS(is, 8)]), ivs, &(ii[0])); + Ty = VADD(Tw, Tx); + T1k = VSUB(Tw, Tx); + } + { + V T4, T5, Tz, TA; + T4 = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 12)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + T1j = VSUB(T4, T5); + Tz = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + TA = LD(&(ii[WS(is, 12)]), ivs, &(ii[0])); + TB = VADD(Tz, TA); + TM = VSUB(Tz, TA); + } + T7 = VADD(T3, T6); + T1R = VSUB(T3, T6); + T25 = VSUB(Ty, TB); + TC = VADD(Ty, TB); + TN = VSUB(TL, TM); + T1x = VADD(TL, TM); + T1H = VSUB(T1k, T1j); + T1l = VADD(T1j, T1k); + } + { + V Tp, T1c, T1a, T20, Ts, T17, T1f, T21; + { + V Tn, To, T18, T19; + Tn = LD(&(ri[WS(is, 15)]), ivs, &(ri[WS(is, 1)])); + To = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + Tp = VADD(Tn, To); + T1c = VSUB(Tn, To); + T18 = LD(&(ii[WS(is, 15)]), ivs, &(ii[WS(is, 1)])); + T19 = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + T1a = VSUB(T18, T19); + T20 = VADD(T18, T19); + } + { + V Tq, Tr, T1d, T1e; + Tq = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + Tr = LD(&(ri[WS(is, 11)]), ivs, &(ri[WS(is, 1)])); + Ts = VADD(Tq, Tr); + T17 = VSUB(Tq, Tr); + T1d = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + T1e = LD(&(ii[WS(is, 11)]), ivs, &(ii[WS(is, 1)])); + T1f = VSUB(T1d, T1e); + T21 = VADD(T1d, T1e); + } + Tt = VADD(Tp, Ts); + T22 = VSUB(T20, T21); + T2h = VADD(T20, T21); + T1b = VADD(T17, T1a); + T1g = VSUB(T1c, T1f); + T1E = VSUB(T1a, T17); + T1Z = VSUB(Tp, Ts); + T1D = VADD(T1c, T1f); + } + { + V Ta, TP, TF, TO, Td, TR, TI, TS; + { + V T8, T9, TD, TE; + T8 = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + T9 = LD(&(ri[WS(is, 10)]), ivs, &(ri[0])); + Ta = VADD(T8, T9); + TP = VSUB(T8, T9); + TD = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + TE = LD(&(ii[WS(is, 10)]), ivs, &(ii[0])); + TF = VADD(TD, TE); + TO = VSUB(TD, TE); + } + { + V Tb, Tc, TG, TH; + Tb = LD(&(ri[WS(is, 14)]), ivs, &(ri[0])); + Tc = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + Td = VADD(Tb, Tc); + TR = VSUB(Tb, Tc); + TG = LD(&(ii[WS(is, 14)]), ivs, &(ii[0])); + TH = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + TI = VADD(TG, TH); + TS = VSUB(TG, TH); + } + Te = VADD(Ta, Td); + T1S = VSUB(TF, TI); + T26 = VSUB(Td, Ta); + TJ = VADD(TF, TI); + TQ = VSUB(TO, TP); + T1m = VSUB(TR, TS); + T1n = VADD(TP, TO); + TT = VADD(TR, TS); + } + { + V Ti, T11, TZ, T1V, Tl, TW, T14, T1W; + { + V Tg, Th, TX, TY; + Tg = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + Th = LD(&(ri[WS(is, 9)]), ivs, &(ri[WS(is, 1)])); + Ti = VADD(Tg, Th); + T11 = VSUB(Tg, Th); + TX = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + TY = LD(&(ii[WS(is, 9)]), ivs, &(ii[WS(is, 1)])); + TZ = VSUB(TX, TY); + T1V = VADD(TX, TY); + } + { + V Tj, Tk, T12, T13; + Tj = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + Tk = LD(&(ri[WS(is, 13)]), ivs, &(ri[WS(is, 1)])); + Tl = VADD(Tj, Tk); + TW = VSUB(Tj, Tk); + T12 = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + T13 = LD(&(ii[WS(is, 13)]), ivs, &(ii[WS(is, 1)])); + T14 = VSUB(T12, T13); + T1W = VADD(T12, T13); + } + Tm = VADD(Ti, Tl); + T1X = VSUB(T1V, T1W); + T2g = VADD(T1V, T1W); + T10 = VADD(TW, TZ); + T15 = VSUB(T11, T14); + T1B = VSUB(TZ, TW); + T1U = VSUB(Ti, Tl); + T1A = VADD(T11, T14); + } + { + V T2l, T2m, T2n, T2o, T2p, T2q, T2r, T2s; + { + V Tf, Tu, T2j, T2k; + Tf = VADD(T7, Te); + Tu = VADD(Tm, Tt); + T2l = VSUB(Tf, Tu); + STM4(&(ro[8]), T2l, ovs, &(ro[0])); + T2m = VADD(Tf, Tu); + STM4(&(ro[0]), T2m, ovs, &(ro[0])); + T2j = VADD(TC, TJ); + T2k = VADD(T2g, T2h); + T2n = VSUB(T2j, T2k); + STM4(&(io[8]), T2n, ovs, &(io[0])); + T2o = VADD(T2j, T2k); + STM4(&(io[0]), T2o, ovs, &(io[0])); + } + { + V Tv, TK, T2f, T2i; + Tv = VSUB(Tt, Tm); + TK = VSUB(TC, TJ); + T2p = VADD(Tv, TK); + STM4(&(io[4]), T2p, ovs, &(io[0])); + T2q = VSUB(TK, Tv); + STM4(&(io[12]), T2q, ovs, &(io[0])); + T2f = VSUB(T7, Te); + T2i = VSUB(T2g, T2h); + T2r = VSUB(T2f, T2i); + STM4(&(ro[12]), T2r, ovs, &(ro[0])); + T2s = VADD(T2f, T2i); + STM4(&(ro[4]), T2s, ovs, &(ro[0])); + } + { + V T2t, T2u, T2v, T2w, T2x, T2y, T2z, T2A; + { + V T1T, T27, T24, T28, T1Y, T23; + T1T = VADD(T1R, T1S); + T27 = VSUB(T25, T26); + T1Y = VADD(T1U, T1X); + T23 = VSUB(T1Z, T22); + T24 = VADD(T1Y, T23); + T28 = VSUB(T23, T1Y); + T2t = VFNMS(LDK(KP707106781), T24, T1T); + STM4(&(ro[10]), T2t, ovs, &(ro[0])); + T2u = VFMA(LDK(KP707106781), T28, T27); + STM4(&(io[6]), T2u, ovs, &(io[0])); + T2v = VFMA(LDK(KP707106781), T24, T1T); + STM4(&(ro[2]), T2v, ovs, &(ro[0])); + T2w = VFNMS(LDK(KP707106781), T28, T27); + STM4(&(io[14]), T2w, ovs, &(io[0])); + } + { + V T29, T2d, T2c, T2e, T2a, T2b; + T29 = VSUB(T1R, T1S); + T2d = VADD(T26, T25); + T2a = VSUB(T1X, T1U); + T2b = VADD(T1Z, T22); + T2c = VSUB(T2a, T2b); + T2e = VADD(T2a, T2b); + T2x = VFNMS(LDK(KP707106781), T2c, T29); + STM4(&(ro[14]), T2x, ovs, &(ro[0])); + T2y = VFMA(LDK(KP707106781), T2e, T2d); + STM4(&(io[2]), T2y, ovs, &(io[0])); + T2z = VFMA(LDK(KP707106781), T2c, T29); + STM4(&(ro[6]), T2z, ovs, &(ro[0])); + T2A = VFNMS(LDK(KP707106781), T2e, T2d); + STM4(&(io[10]), T2A, ovs, &(io[0])); + } + { + V T2B, T2C, T2D, T2E, T2F, T2G, T2H, T2I; + { + V TV, T1v, T1p, T1r, T1i, T1q, T1u, T1w, TU, T1o; + TU = VSUB(TQ, TT); + TV = VFMA(LDK(KP707106781), TU, TN); + T1v = VFNMS(LDK(KP707106781), TU, TN); + T1o = VSUB(T1m, T1n); + T1p = VFNMS(LDK(KP707106781), T1o, T1l); + T1r = VFMA(LDK(KP707106781), T1o, T1l); + { + V T16, T1h, T1s, T1t; + T16 = VFMA(LDK(KP414213562), T15, T10); + T1h = VFNMS(LDK(KP414213562), T1g, T1b); + T1i = VSUB(T16, T1h); + T1q = VADD(T16, T1h); + T1s = VFMA(LDK(KP414213562), T1b, T1g); + T1t = VFNMS(LDK(KP414213562), T10, T15); + T1u = VSUB(T1s, T1t); + T1w = VADD(T1t, T1s); + } + T2B = VFNMS(LDK(KP923879532), T1i, TV); + STM4(&(ro[11]), T2B, ovs, &(ro[1])); + T2C = VFNMS(LDK(KP923879532), T1u, T1r); + STM4(&(io[11]), T2C, ovs, &(io[1])); + T2D = VFMA(LDK(KP923879532), T1i, TV); + STM4(&(ro[3]), T2D, ovs, &(ro[1])); + T2E = VFMA(LDK(KP923879532), T1u, T1r); + STM4(&(io[3]), T2E, ovs, &(io[1])); + T2F = VFNMS(LDK(KP923879532), T1q, T1p); + STM4(&(io[7]), T2F, ovs, &(io[1])); + T2G = VFNMS(LDK(KP923879532), T1w, T1v); + STM4(&(ro[7]), T2G, ovs, &(ro[1])); + T2H = VFMA(LDK(KP923879532), T1q, T1p); + STM4(&(io[15]), T2H, ovs, &(io[1])); + T2I = VFMA(LDK(KP923879532), T1w, T1v); + STM4(&(ro[15]), T2I, ovs, &(ro[1])); + } + { + V T1z, T1L, T1J, T1P, T1G, T1K, T1O, T1Q, T1y, T1I; + T1y = VADD(T1n, T1m); + T1z = VFMA(LDK(KP707106781), T1y, T1x); + T1L = VFNMS(LDK(KP707106781), T1y, T1x); + T1I = VADD(TQ, TT); + T1J = VFNMS(LDK(KP707106781), T1I, T1H); + T1P = VFMA(LDK(KP707106781), T1I, T1H); + { + V T1C, T1F, T1M, T1N; + T1C = VFMA(LDK(KP414213562), T1B, T1A); + T1F = VFNMS(LDK(KP414213562), T1E, T1D); + T1G = VADD(T1C, T1F); + T1K = VSUB(T1F, T1C); + T1M = VFNMS(LDK(KP414213562), T1A, T1B); + T1N = VFMA(LDK(KP414213562), T1D, T1E); + T1O = VSUB(T1M, T1N); + T1Q = VADD(T1M, T1N); + } + { + V T2J, T2K, T2L, T2M; + T2J = VFNMS(LDK(KP923879532), T1G, T1z); + STM4(&(ro[9]), T2J, ovs, &(ro[1])); + STN4(&(ro[8]), T2l, T2J, T2t, T2B, ovs); + T2K = VFNMS(LDK(KP923879532), T1Q, T1P); + STM4(&(io[9]), T2K, ovs, &(io[1])); + STN4(&(io[8]), T2n, T2K, T2A, T2C, ovs); + T2L = VFMA(LDK(KP923879532), T1G, T1z); + STM4(&(ro[1]), T2L, ovs, &(ro[1])); + STN4(&(ro[0]), T2m, T2L, T2v, T2D, ovs); + T2M = VFMA(LDK(KP923879532), T1Q, T1P); + STM4(&(io[1]), T2M, ovs, &(io[1])); + STN4(&(io[0]), T2o, T2M, T2y, T2E, ovs); + } + { + V T2N, T2O, T2P, T2Q; + T2N = VFNMS(LDK(KP923879532), T1K, T1J); + STM4(&(io[13]), T2N, ovs, &(io[1])); + STN4(&(io[12]), T2q, T2N, T2w, T2H, ovs); + T2O = VFNMS(LDK(KP923879532), T1O, T1L); + STM4(&(ro[13]), T2O, ovs, &(ro[1])); + STN4(&(ro[12]), T2r, T2O, T2x, T2I, ovs); + T2P = VFMA(LDK(KP923879532), T1K, T1J); + STM4(&(io[5]), T2P, ovs, &(io[1])); + STN4(&(io[4]), T2p, T2P, T2u, T2F, ovs); + T2Q = VFMA(LDK(KP923879532), T1O, T1L); + STM4(&(ro[5]), T2Q, ovs, &(ro[1])); + STN4(&(ro[4]), T2s, T2Q, T2z, T2G, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n2sv_16"), {104, 0, 40, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_16) (planner *p) { + X(kdft_register) (p, n2sv_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name n2sv_16 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 144 FP additions, 24 FP multiplications, + * (or, 136 additions, 16 multiplications, 8 fused multiply/add), + * 74 stack variables, 3 constants, and 72 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_16(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(64, is), MAKE_VOLATILE_STRIDE(64, os)) { + V T7, T1R, T25, TC, TN, T1x, T1H, T1l, Tt, T22, T2h, T1b, T1g, T1E, T1Z; + V T1D, Te, T1S, T26, TJ, TQ, T1m, T1n, TT, Tm, T1X, T2g, T10, T15, T1B; + V T1U, T1A; + { + V T3, TL, Ty, T1k, T6, T1j, TB, TM; + { + V T1, T2, Tw, Tx; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 8)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + TL = VSUB(T1, T2); + Tw = LD(&(ii[0]), ivs, &(ii[0])); + Tx = LD(&(ii[WS(is, 8)]), ivs, &(ii[0])); + Ty = VADD(Tw, Tx); + T1k = VSUB(Tw, Tx); + } + { + V T4, T5, Tz, TA; + T4 = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 12)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + T1j = VSUB(T4, T5); + Tz = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + TA = LD(&(ii[WS(is, 12)]), ivs, &(ii[0])); + TB = VADD(Tz, TA); + TM = VSUB(Tz, TA); + } + T7 = VADD(T3, T6); + T1R = VSUB(T3, T6); + T25 = VSUB(Ty, TB); + TC = VADD(Ty, TB); + TN = VSUB(TL, TM); + T1x = VADD(TL, TM); + T1H = VSUB(T1k, T1j); + T1l = VADD(T1j, T1k); + } + { + V Tp, T17, T1f, T20, Ts, T1c, T1a, T21; + { + V Tn, To, T1d, T1e; + Tn = LD(&(ri[WS(is, 15)]), ivs, &(ri[WS(is, 1)])); + To = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + Tp = VADD(Tn, To); + T17 = VSUB(Tn, To); + T1d = LD(&(ii[WS(is, 15)]), ivs, &(ii[WS(is, 1)])); + T1e = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + T1f = VSUB(T1d, T1e); + T20 = VADD(T1d, T1e); + } + { + V Tq, Tr, T18, T19; + Tq = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + Tr = LD(&(ri[WS(is, 11)]), ivs, &(ri[WS(is, 1)])); + Ts = VADD(Tq, Tr); + T1c = VSUB(Tq, Tr); + T18 = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + T19 = LD(&(ii[WS(is, 11)]), ivs, &(ii[WS(is, 1)])); + T1a = VSUB(T18, T19); + T21 = VADD(T18, T19); + } + Tt = VADD(Tp, Ts); + T22 = VSUB(T20, T21); + T2h = VADD(T20, T21); + T1b = VSUB(T17, T1a); + T1g = VADD(T1c, T1f); + T1E = VSUB(T1f, T1c); + T1Z = VSUB(Tp, Ts); + T1D = VADD(T17, T1a); + } + { + V Ta, TP, TF, TO, Td, TR, TI, TS; + { + V T8, T9, TD, TE; + T8 = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + T9 = LD(&(ri[WS(is, 10)]), ivs, &(ri[0])); + Ta = VADD(T8, T9); + TP = VSUB(T8, T9); + TD = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + TE = LD(&(ii[WS(is, 10)]), ivs, &(ii[0])); + TF = VADD(TD, TE); + TO = VSUB(TD, TE); + } + { + V Tb, Tc, TG, TH; + Tb = LD(&(ri[WS(is, 14)]), ivs, &(ri[0])); + Tc = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + Td = VADD(Tb, Tc); + TR = VSUB(Tb, Tc); + TG = LD(&(ii[WS(is, 14)]), ivs, &(ii[0])); + TH = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + TI = VADD(TG, TH); + TS = VSUB(TG, TH); + } + Te = VADD(Ta, Td); + T1S = VSUB(TF, TI); + T26 = VSUB(Td, Ta); + TJ = VADD(TF, TI); + TQ = VSUB(TO, TP); + T1m = VSUB(TR, TS); + T1n = VADD(TP, TO); + TT = VADD(TR, TS); + } + { + V Ti, T11, TZ, T1V, Tl, TW, T14, T1W; + { + V Tg, Th, TX, TY; + Tg = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + Th = LD(&(ri[WS(is, 9)]), ivs, &(ri[WS(is, 1)])); + Ti = VADD(Tg, Th); + T11 = VSUB(Tg, Th); + TX = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + TY = LD(&(ii[WS(is, 9)]), ivs, &(ii[WS(is, 1)])); + TZ = VSUB(TX, TY); + T1V = VADD(TX, TY); + } + { + V Tj, Tk, T12, T13; + Tj = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + Tk = LD(&(ri[WS(is, 13)]), ivs, &(ri[WS(is, 1)])); + Tl = VADD(Tj, Tk); + TW = VSUB(Tj, Tk); + T12 = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + T13 = LD(&(ii[WS(is, 13)]), ivs, &(ii[WS(is, 1)])); + T14 = VSUB(T12, T13); + T1W = VADD(T12, T13); + } + Tm = VADD(Ti, Tl); + T1X = VSUB(T1V, T1W); + T2g = VADD(T1V, T1W); + T10 = VADD(TW, TZ); + T15 = VSUB(T11, T14); + T1B = VADD(T11, T14); + T1U = VSUB(Ti, Tl); + T1A = VSUB(TZ, TW); + } + { + V T2l, T2m, T2n, T2o, T2p, T2q, T2r, T2s; + { + V Tf, Tu, T2j, T2k; + Tf = VADD(T7, Te); + Tu = VADD(Tm, Tt); + T2l = VSUB(Tf, Tu); + STM4(&(ro[8]), T2l, ovs, &(ro[0])); + T2m = VADD(Tf, Tu); + STM4(&(ro[0]), T2m, ovs, &(ro[0])); + T2j = VADD(TC, TJ); + T2k = VADD(T2g, T2h); + T2n = VSUB(T2j, T2k); + STM4(&(io[8]), T2n, ovs, &(io[0])); + T2o = VADD(T2j, T2k); + STM4(&(io[0]), T2o, ovs, &(io[0])); + } + { + V Tv, TK, T2f, T2i; + Tv = VSUB(Tt, Tm); + TK = VSUB(TC, TJ); + T2p = VADD(Tv, TK); + STM4(&(io[4]), T2p, ovs, &(io[0])); + T2q = VSUB(TK, Tv); + STM4(&(io[12]), T2q, ovs, &(io[0])); + T2f = VSUB(T7, Te); + T2i = VSUB(T2g, T2h); + T2r = VSUB(T2f, T2i); + STM4(&(ro[12]), T2r, ovs, &(ro[0])); + T2s = VADD(T2f, T2i); + STM4(&(ro[4]), T2s, ovs, &(ro[0])); + } + { + V T2t, T2u, T2v, T2w, T2x, T2y, T2z, T2A; + { + V T1T, T27, T24, T28, T1Y, T23; + T1T = VADD(T1R, T1S); + T27 = VSUB(T25, T26); + T1Y = VADD(T1U, T1X); + T23 = VSUB(T1Z, T22); + T24 = VMUL(LDK(KP707106781), VADD(T1Y, T23)); + T28 = VMUL(LDK(KP707106781), VSUB(T23, T1Y)); + T2t = VSUB(T1T, T24); + STM4(&(ro[10]), T2t, ovs, &(ro[0])); + T2u = VADD(T27, T28); + STM4(&(io[6]), T2u, ovs, &(io[0])); + T2v = VADD(T1T, T24); + STM4(&(ro[2]), T2v, ovs, &(ro[0])); + T2w = VSUB(T27, T28); + STM4(&(io[14]), T2w, ovs, &(io[0])); + } + { + V T29, T2d, T2c, T2e, T2a, T2b; + T29 = VSUB(T1R, T1S); + T2d = VADD(T26, T25); + T2a = VSUB(T1X, T1U); + T2b = VADD(T1Z, T22); + T2c = VMUL(LDK(KP707106781), VSUB(T2a, T2b)); + T2e = VMUL(LDK(KP707106781), VADD(T2a, T2b)); + T2x = VSUB(T29, T2c); + STM4(&(ro[14]), T2x, ovs, &(ro[0])); + T2y = VADD(T2d, T2e); + STM4(&(io[2]), T2y, ovs, &(io[0])); + T2z = VADD(T29, T2c); + STM4(&(ro[6]), T2z, ovs, &(ro[0])); + T2A = VSUB(T2d, T2e); + STM4(&(io[10]), T2A, ovs, &(io[0])); + } + { + V T2B, T2C, T2D, T2E, T2F, T2G, T2H, T2I; + { + V TV, T1r, T1p, T1v, T1i, T1q, T1u, T1w, TU, T1o; + TU = VMUL(LDK(KP707106781), VSUB(TQ, TT)); + TV = VADD(TN, TU); + T1r = VSUB(TN, TU); + T1o = VMUL(LDK(KP707106781), VSUB(T1m, T1n)); + T1p = VSUB(T1l, T1o); + T1v = VADD(T1l, T1o); + { + V T16, T1h, T1s, T1t; + T16 = VFMA(LDK(KP923879532), T10, VMUL(LDK(KP382683432), T15)); + T1h = VFNMS(LDK(KP923879532), T1g, VMUL(LDK(KP382683432), T1b)); + T1i = VADD(T16, T1h); + T1q = VSUB(T1h, T16); + T1s = VFNMS(LDK(KP923879532), T15, VMUL(LDK(KP382683432), T10)); + T1t = VFMA(LDK(KP382683432), T1g, VMUL(LDK(KP923879532), T1b)); + T1u = VSUB(T1s, T1t); + T1w = VADD(T1s, T1t); + } + T2B = VSUB(TV, T1i); + STM4(&(ro[11]), T2B, ovs, &(ro[1])); + T2C = VSUB(T1v, T1w); + STM4(&(io[11]), T2C, ovs, &(io[1])); + T2D = VADD(TV, T1i); + STM4(&(ro[3]), T2D, ovs, &(ro[1])); + T2E = VADD(T1v, T1w); + STM4(&(io[3]), T2E, ovs, &(io[1])); + T2F = VSUB(T1p, T1q); + STM4(&(io[15]), T2F, ovs, &(io[1])); + T2G = VSUB(T1r, T1u); + STM4(&(ro[15]), T2G, ovs, &(ro[1])); + T2H = VADD(T1p, T1q); + STM4(&(io[7]), T2H, ovs, &(io[1])); + T2I = VADD(T1r, T1u); + STM4(&(ro[7]), T2I, ovs, &(ro[1])); + } + { + V T1z, T1L, T1J, T1P, T1G, T1K, T1O, T1Q, T1y, T1I; + T1y = VMUL(LDK(KP707106781), VADD(T1n, T1m)); + T1z = VADD(T1x, T1y); + T1L = VSUB(T1x, T1y); + T1I = VMUL(LDK(KP707106781), VADD(TQ, TT)); + T1J = VSUB(T1H, T1I); + T1P = VADD(T1H, T1I); + { + V T1C, T1F, T1M, T1N; + T1C = VFMA(LDK(KP382683432), T1A, VMUL(LDK(KP923879532), T1B)); + T1F = VFNMS(LDK(KP382683432), T1E, VMUL(LDK(KP923879532), T1D)); + T1G = VADD(T1C, T1F); + T1K = VSUB(T1F, T1C); + T1M = VFNMS(LDK(KP382683432), T1B, VMUL(LDK(KP923879532), T1A)); + T1N = VFMA(LDK(KP923879532), T1E, VMUL(LDK(KP382683432), T1D)); + T1O = VSUB(T1M, T1N); + T1Q = VADD(T1M, T1N); + } + { + V T2J, T2K, T2L, T2M; + T2J = VSUB(T1z, T1G); + STM4(&(ro[9]), T2J, ovs, &(ro[1])); + STN4(&(ro[8]), T2l, T2J, T2t, T2B, ovs); + T2K = VSUB(T1P, T1Q); + STM4(&(io[9]), T2K, ovs, &(io[1])); + STN4(&(io[8]), T2n, T2K, T2A, T2C, ovs); + T2L = VADD(T1z, T1G); + STM4(&(ro[1]), T2L, ovs, &(ro[1])); + STN4(&(ro[0]), T2m, T2L, T2v, T2D, ovs); + T2M = VADD(T1P, T1Q); + STM4(&(io[1]), T2M, ovs, &(io[1])); + STN4(&(io[0]), T2o, T2M, T2y, T2E, ovs); + } + { + V T2N, T2O, T2P, T2Q; + T2N = VSUB(T1J, T1K); + STM4(&(io[13]), T2N, ovs, &(io[1])); + STN4(&(io[12]), T2q, T2N, T2w, T2F, ovs); + T2O = VSUB(T1L, T1O); + STM4(&(ro[13]), T2O, ovs, &(ro[1])); + STN4(&(ro[12]), T2r, T2O, T2x, T2G, ovs); + T2P = VADD(T1J, T1K); + STM4(&(io[5]), T2P, ovs, &(io[1])); + STN4(&(io[4]), T2p, T2P, T2u, T2H, ovs); + T2Q = VADD(T1L, T1O); + STM4(&(ro[5]), T2Q, ovs, &(ro[1])); + STN4(&(ro[4]), T2s, T2Q, T2z, T2I, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 16, XSIMD_STRING("n2sv_16"), {136, 16, 8, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_16) (planner *p) { + X(kdft_register) (p, n2sv_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_32.c new file mode 100644 index 000000000..453828dbc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_32.c @@ -0,0 +1,1514 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:20 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name n2sv_32 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 372 FP additions, 136 FP multiplications, + * (or, 236 additions, 0 multiplications, 136 fused multiply/add), + * 138 stack variables, 7 constants, and 144 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T7, T4r, T4Z, T18, T1z, T3t, T3T, T2T, Te, T1f, T50, T4s, T2W, T3u, T1G; + V T3U, Tm, T1n, T1O, T2Z, T3y, T3X, T4w, T53, Tt, T1u, T1V, T2Y, T3B, T3W; + V T4z, T52, T2t, T3L, T3O, T2K, TR, TY, T5F, T5G, T5H, T5I, T4R, T5k, T2E; + V T3M, T4W, T5j, T2N, T3P, T22, T3E, T3H, T2j, TC, TJ, T5A, T5B, T5C, T5D; + V T4G, T5h, T2d, T3F, T4L, T5g, T2m, T3I; + { + V T3, T1x, T14, T2R, T6, T2S, T17, T1y; + { + V T1, T2, T12, T13; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 16)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + T1x = VSUB(T1, T2); + T12 = LD(&(ii[0]), ivs, &(ii[0])); + T13 = LD(&(ii[WS(is, 16)]), ivs, &(ii[0])); + T14 = VADD(T12, T13); + T2R = VSUB(T12, T13); + } + { + V T4, T5, T15, T16; + T4 = LD(&(ri[WS(is, 8)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 24)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + T2S = VSUB(T4, T5); + T15 = LD(&(ii[WS(is, 8)]), ivs, &(ii[0])); + T16 = LD(&(ii[WS(is, 24)]), ivs, &(ii[0])); + T17 = VADD(T15, T16); + T1y = VSUB(T15, T16); + } + T7 = VADD(T3, T6); + T4r = VSUB(T3, T6); + T4Z = VSUB(T14, T17); + T18 = VADD(T14, T17); + T1z = VADD(T1x, T1y); + T3t = VSUB(T1x, T1y); + T3T = VADD(T2S, T2R); + T2T = VSUB(T2R, T2S); + } + { + V Ta, T1A, T1b, T1B, Td, T1D, T1e, T1E; + { + V T8, T9, T19, T1a; + T8 = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + T9 = LD(&(ri[WS(is, 20)]), ivs, &(ri[0])); + Ta = VADD(T8, T9); + T1A = VSUB(T8, T9); + T19 = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + T1a = LD(&(ii[WS(is, 20)]), ivs, &(ii[0])); + T1b = VADD(T19, T1a); + T1B = VSUB(T19, T1a); + } + { + V Tb, Tc, T1c, T1d; + Tb = LD(&(ri[WS(is, 28)]), ivs, &(ri[0])); + Tc = LD(&(ri[WS(is, 12)]), ivs, &(ri[0])); + Td = VADD(Tb, Tc); + T1D = VSUB(Tb, Tc); + T1c = LD(&(ii[WS(is, 28)]), ivs, &(ii[0])); + T1d = LD(&(ii[WS(is, 12)]), ivs, &(ii[0])); + T1e = VADD(T1c, T1d); + T1E = VSUB(T1c, T1d); + } + Te = VADD(Ta, Td); + T1f = VADD(T1b, T1e); + T50 = VSUB(Td, Ta); + T4s = VSUB(T1b, T1e); + { + V T2U, T2V, T1C, T1F; + T2U = VSUB(T1B, T1A); + T2V = VADD(T1D, T1E); + T2W = VADD(T2U, T2V); + T3u = VSUB(T2U, T2V); + T1C = VADD(T1A, T1B); + T1F = VSUB(T1D, T1E); + T1G = VADD(T1C, T1F); + T3U = VSUB(T1F, T1C); + } + } + { + V Ti, T1L, T1j, T1I, Tl, T1J, T1m, T1M, T1K, T1N; + { + V Tg, Th, T1h, T1i; + Tg = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + Th = LD(&(ri[WS(is, 18)]), ivs, &(ri[0])); + Ti = VADD(Tg, Th); + T1L = VSUB(Tg, Th); + T1h = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + T1i = LD(&(ii[WS(is, 18)]), ivs, &(ii[0])); + T1j = VADD(T1h, T1i); + T1I = VSUB(T1h, T1i); + } + { + V Tj, Tk, T1k, T1l; + Tj = LD(&(ri[WS(is, 10)]), ivs, &(ri[0])); + Tk = LD(&(ri[WS(is, 26)]), ivs, &(ri[0])); + Tl = VADD(Tj, Tk); + T1J = VSUB(Tj, Tk); + T1k = LD(&(ii[WS(is, 10)]), ivs, &(ii[0])); + T1l = LD(&(ii[WS(is, 26)]), ivs, &(ii[0])); + T1m = VADD(T1k, T1l); + T1M = VSUB(T1k, T1l); + } + Tm = VADD(Ti, Tl); + T1n = VADD(T1j, T1m); + T1K = VSUB(T1I, T1J); + T1N = VADD(T1L, T1M); + T1O = VFNMS(LDK(KP414213562), T1N, T1K); + T2Z = VFMA(LDK(KP414213562), T1K, T1N); + { + V T3w, T3x, T4u, T4v; + T3w = VADD(T1J, T1I); + T3x = VSUB(T1L, T1M); + T3y = VFMA(LDK(KP414213562), T3x, T3w); + T3X = VFNMS(LDK(KP414213562), T3w, T3x); + T4u = VSUB(T1j, T1m); + T4v = VSUB(Ti, Tl); + T4w = VSUB(T4u, T4v); + T53 = VADD(T4v, T4u); + } + } + { + V Tp, T1S, T1q, T1P, Ts, T1Q, T1t, T1T, T1R, T1U; + { + V Tn, To, T1o, T1p; + Tn = LD(&(ri[WS(is, 30)]), ivs, &(ri[0])); + To = LD(&(ri[WS(is, 14)]), ivs, &(ri[0])); + Tp = VADD(Tn, To); + T1S = VSUB(Tn, To); + T1o = LD(&(ii[WS(is, 30)]), ivs, &(ii[0])); + T1p = LD(&(ii[WS(is, 14)]), ivs, &(ii[0])); + T1q = VADD(T1o, T1p); + T1P = VSUB(T1o, T1p); + } + { + V Tq, Tr, T1r, T1s; + Tq = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + Tr = LD(&(ri[WS(is, 22)]), ivs, &(ri[0])); + Ts = VADD(Tq, Tr); + T1Q = VSUB(Tq, Tr); + T1r = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + T1s = LD(&(ii[WS(is, 22)]), ivs, &(ii[0])); + T1t = VADD(T1r, T1s); + T1T = VSUB(T1r, T1s); + } + Tt = VADD(Tp, Ts); + T1u = VADD(T1q, T1t); + T1R = VSUB(T1P, T1Q); + T1U = VADD(T1S, T1T); + T1V = VFMA(LDK(KP414213562), T1U, T1R); + T2Y = VFNMS(LDK(KP414213562), T1R, T1U); + { + V T3z, T3A, T4x, T4y; + T3z = VADD(T1Q, T1P); + T3A = VSUB(T1S, T1T); + T3B = VFNMS(LDK(KP414213562), T3A, T3z); + T3W = VFMA(LDK(KP414213562), T3z, T3A); + T4x = VSUB(Tp, Ts); + T4y = VSUB(T1q, T1t); + T4z = VADD(T4x, T4y); + T52 = VSUB(T4x, T4y); + } + } + { + V TN, T2G, T2r, T4N, TQ, T2s, T2J, T4O, TU, T2x, T2w, T4T, TX, T2z, T2C; + V T4U; + { + V TL, TM, T2p, T2q; + TL = LD(&(ri[WS(is, 31)]), ivs, &(ri[WS(is, 1)])); + TM = LD(&(ri[WS(is, 15)]), ivs, &(ri[WS(is, 1)])); + TN = VADD(TL, TM); + T2G = VSUB(TL, TM); + T2p = LD(&(ii[WS(is, 31)]), ivs, &(ii[WS(is, 1)])); + T2q = LD(&(ii[WS(is, 15)]), ivs, &(ii[WS(is, 1)])); + T2r = VSUB(T2p, T2q); + T4N = VADD(T2p, T2q); + } + { + V TO, TP, T2H, T2I; + TO = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + TP = LD(&(ri[WS(is, 23)]), ivs, &(ri[WS(is, 1)])); + TQ = VADD(TO, TP); + T2s = VSUB(TO, TP); + T2H = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + T2I = LD(&(ii[WS(is, 23)]), ivs, &(ii[WS(is, 1)])); + T2J = VSUB(T2H, T2I); + T4O = VADD(T2H, T2I); + } + { + V TS, TT, T2u, T2v; + TS = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + TT = LD(&(ri[WS(is, 19)]), ivs, &(ri[WS(is, 1)])); + TU = VADD(TS, TT); + T2x = VSUB(TS, TT); + T2u = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + T2v = LD(&(ii[WS(is, 19)]), ivs, &(ii[WS(is, 1)])); + T2w = VSUB(T2u, T2v); + T4T = VADD(T2u, T2v); + } + { + V TV, TW, T2A, T2B; + TV = LD(&(ri[WS(is, 27)]), ivs, &(ri[WS(is, 1)])); + TW = LD(&(ri[WS(is, 11)]), ivs, &(ri[WS(is, 1)])); + TX = VADD(TV, TW); + T2z = VSUB(TV, TW); + T2A = LD(&(ii[WS(is, 27)]), ivs, &(ii[WS(is, 1)])); + T2B = LD(&(ii[WS(is, 11)]), ivs, &(ii[WS(is, 1)])); + T2C = VSUB(T2A, T2B); + T4U = VADD(T2A, T2B); + } + T2t = VSUB(T2r, T2s); + T3L = VSUB(T2G, T2J); + T3O = VADD(T2s, T2r); + T2K = VADD(T2G, T2J); + TR = VADD(TN, TQ); + TY = VADD(TU, TX); + T5F = VSUB(TR, TY); + { + V T4P, T4Q, T2y, T2D; + T5G = VADD(T4N, T4O); + T5H = VADD(T4T, T4U); + T5I = VSUB(T5G, T5H); + T4P = VSUB(T4N, T4O); + T4Q = VSUB(TX, TU); + T4R = VSUB(T4P, T4Q); + T5k = VADD(T4Q, T4P); + T2y = VSUB(T2w, T2x); + T2D = VADD(T2z, T2C); + T2E = VADD(T2y, T2D); + T3M = VSUB(T2D, T2y); + { + V T4S, T4V, T2L, T2M; + T4S = VSUB(TN, TQ); + T4V = VSUB(T4T, T4U); + T4W = VSUB(T4S, T4V); + T5j = VADD(T4S, T4V); + T2L = VADD(T2x, T2w); + T2M = VSUB(T2z, T2C); + T2N = VADD(T2L, T2M); + T3P = VSUB(T2L, T2M); + } + } + } + { + V Ty, T2f, T20, T4C, TB, T21, T2i, T4D, TF, T26, T25, T4I, TI, T28, T2b; + V T4J; + { + V Tw, Tx, T1Y, T1Z; + Tw = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + Tx = LD(&(ri[WS(is, 17)]), ivs, &(ri[WS(is, 1)])); + Ty = VADD(Tw, Tx); + T2f = VSUB(Tw, Tx); + T1Y = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + T1Z = LD(&(ii[WS(is, 17)]), ivs, &(ii[WS(is, 1)])); + T20 = VSUB(T1Y, T1Z); + T4C = VADD(T1Y, T1Z); + } + { + V Tz, TA, T2g, T2h; + Tz = LD(&(ri[WS(is, 9)]), ivs, &(ri[WS(is, 1)])); + TA = LD(&(ri[WS(is, 25)]), ivs, &(ri[WS(is, 1)])); + TB = VADD(Tz, TA); + T21 = VSUB(Tz, TA); + T2g = LD(&(ii[WS(is, 9)]), ivs, &(ii[WS(is, 1)])); + T2h = LD(&(ii[WS(is, 25)]), ivs, &(ii[WS(is, 1)])); + T2i = VSUB(T2g, T2h); + T4D = VADD(T2g, T2h); + } + { + V TD, TE, T23, T24; + TD = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + TE = LD(&(ri[WS(is, 21)]), ivs, &(ri[WS(is, 1)])); + TF = VADD(TD, TE); + T26 = VSUB(TD, TE); + T23 = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + T24 = LD(&(ii[WS(is, 21)]), ivs, &(ii[WS(is, 1)])); + T25 = VSUB(T23, T24); + T4I = VADD(T23, T24); + } + { + V TG, TH, T29, T2a; + TG = LD(&(ri[WS(is, 29)]), ivs, &(ri[WS(is, 1)])); + TH = LD(&(ri[WS(is, 13)]), ivs, &(ri[WS(is, 1)])); + TI = VADD(TG, TH); + T28 = VSUB(TG, TH); + T29 = LD(&(ii[WS(is, 29)]), ivs, &(ii[WS(is, 1)])); + T2a = LD(&(ii[WS(is, 13)]), ivs, &(ii[WS(is, 1)])); + T2b = VSUB(T29, T2a); + T4J = VADD(T29, T2a); + } + T22 = VSUB(T20, T21); + T3E = VSUB(T2f, T2i); + T3H = VADD(T21, T20); + T2j = VADD(T2f, T2i); + TC = VADD(Ty, TB); + TJ = VADD(TF, TI); + T5A = VSUB(TC, TJ); + { + V T4E, T4F, T27, T2c; + T5B = VADD(T4C, T4D); + T5C = VADD(T4I, T4J); + T5D = VSUB(T5B, T5C); + T4E = VSUB(T4C, T4D); + T4F = VSUB(TI, TF); + T4G = VSUB(T4E, T4F); + T5h = VADD(T4F, T4E); + T27 = VSUB(T25, T26); + T2c = VADD(T28, T2b); + T2d = VADD(T27, T2c); + T3F = VSUB(T2c, T27); + { + V T4H, T4K, T2k, T2l; + T4H = VSUB(Ty, TB); + T4K = VSUB(T4I, T4J); + T4L = VSUB(T4H, T4K); + T5g = VADD(T4H, T4K); + T2k = VADD(T26, T25); + T2l = VSUB(T28, T2b); + T2m = VADD(T2k, T2l); + T3I = VSUB(T2k, T2l); + } + } + } + { + V T61, T62, T63, T64, T65, T66, T67, T68, T69, T6a, T6b, T6c, T6d, T6e, T6f; + V T6g, T6h, T6i, T6j, T6k, T6l, T6m, T6n, T6o, T6p, T6q, T6r, T6s, T6t, T6u; + V T6v, T6w; + { + V T4B, T5b, T5a, T5c, T4Y, T56, T55, T57; + { + V T4t, T4A, T58, T59; + T4t = VSUB(T4r, T4s); + T4A = VSUB(T4w, T4z); + T4B = VFMA(LDK(KP707106781), T4A, T4t); + T5b = VFNMS(LDK(KP707106781), T4A, T4t); + T58 = VFMA(LDK(KP414213562), T4R, T4W); + T59 = VFNMS(LDK(KP414213562), T4G, T4L); + T5a = VSUB(T58, T59); + T5c = VADD(T59, T58); + } + { + V T4M, T4X, T51, T54; + T4M = VFMA(LDK(KP414213562), T4L, T4G); + T4X = VFNMS(LDK(KP414213562), T4W, T4R); + T4Y = VSUB(T4M, T4X); + T56 = VADD(T4M, T4X); + T51 = VSUB(T4Z, T50); + T54 = VSUB(T52, T53); + T55 = VFNMS(LDK(KP707106781), T54, T51); + T57 = VFMA(LDK(KP707106781), T54, T51); + } + T61 = VFNMS(LDK(KP923879532), T4Y, T4B); + STM4(&(ro[22]), T61, ovs, &(ro[0])); + T62 = VFNMS(LDK(KP923879532), T5a, T57); + STM4(&(io[22]), T62, ovs, &(io[0])); + T63 = VFMA(LDK(KP923879532), T4Y, T4B); + STM4(&(ro[6]), T63, ovs, &(ro[0])); + T64 = VFMA(LDK(KP923879532), T5a, T57); + STM4(&(io[6]), T64, ovs, &(io[0])); + T65 = VFNMS(LDK(KP923879532), T56, T55); + STM4(&(io[14]), T65, ovs, &(io[0])); + T66 = VFNMS(LDK(KP923879532), T5c, T5b); + STM4(&(ro[14]), T66, ovs, &(ro[0])); + T67 = VFMA(LDK(KP923879532), T56, T55); + STM4(&(io[30]), T67, ovs, &(io[0])); + T68 = VFMA(LDK(KP923879532), T5c, T5b); + STM4(&(ro[30]), T68, ovs, &(ro[0])); + } + { + V T5f, T5r, T5u, T5w, T5m, T5q, T5p, T5v; + { + V T5d, T5e, T5s, T5t; + T5d = VADD(T4r, T4s); + T5e = VADD(T53, T52); + T5f = VFMA(LDK(KP707106781), T5e, T5d); + T5r = VFNMS(LDK(KP707106781), T5e, T5d); + T5s = VFNMS(LDK(KP414213562), T5g, T5h); + T5t = VFMA(LDK(KP414213562), T5j, T5k); + T5u = VSUB(T5s, T5t); + T5w = VADD(T5s, T5t); + } + { + V T5i, T5l, T5n, T5o; + T5i = VFMA(LDK(KP414213562), T5h, T5g); + T5l = VFNMS(LDK(KP414213562), T5k, T5j); + T5m = VADD(T5i, T5l); + T5q = VSUB(T5l, T5i); + T5n = VADD(T50, T4Z); + T5o = VADD(T4w, T4z); + T5p = VFNMS(LDK(KP707106781), T5o, T5n); + T5v = VFMA(LDK(KP707106781), T5o, T5n); + } + T69 = VFNMS(LDK(KP923879532), T5m, T5f); + STM4(&(ro[18]), T69, ovs, &(ro[0])); + T6a = VFNMS(LDK(KP923879532), T5w, T5v); + STM4(&(io[18]), T6a, ovs, &(io[0])); + T6b = VFMA(LDK(KP923879532), T5m, T5f); + STM4(&(ro[2]), T6b, ovs, &(ro[0])); + T6c = VFMA(LDK(KP923879532), T5w, T5v); + STM4(&(io[2]), T6c, ovs, &(io[0])); + T6d = VFNMS(LDK(KP923879532), T5q, T5p); + STM4(&(io[26]), T6d, ovs, &(io[0])); + T6e = VFNMS(LDK(KP923879532), T5u, T5r); + STM4(&(ro[26]), T6e, ovs, &(ro[0])); + T6f = VFMA(LDK(KP923879532), T5q, T5p); + STM4(&(io[10]), T6f, ovs, &(io[0])); + T6g = VFMA(LDK(KP923879532), T5u, T5r); + STM4(&(ro[10]), T6g, ovs, &(ro[0])); + } + { + V T5z, T5P, T5S, T5U, T5K, T5O, T5N, T5T; + { + V T5x, T5y, T5Q, T5R; + T5x = VSUB(T7, Te); + T5y = VSUB(T1n, T1u); + T5z = VADD(T5x, T5y); + T5P = VSUB(T5x, T5y); + T5Q = VSUB(T5D, T5A); + T5R = VADD(T5F, T5I); + T5S = VSUB(T5Q, T5R); + T5U = VADD(T5Q, T5R); + } + { + V T5E, T5J, T5L, T5M; + T5E = VADD(T5A, T5D); + T5J = VSUB(T5F, T5I); + T5K = VADD(T5E, T5J); + T5O = VSUB(T5J, T5E); + T5L = VSUB(T18, T1f); + T5M = VSUB(Tt, Tm); + T5N = VSUB(T5L, T5M); + T5T = VADD(T5M, T5L); + } + T6h = VFNMS(LDK(KP707106781), T5K, T5z); + STM4(&(ro[20]), T6h, ovs, &(ro[0])); + T6i = VFNMS(LDK(KP707106781), T5U, T5T); + STM4(&(io[20]), T6i, ovs, &(io[0])); + T6j = VFMA(LDK(KP707106781), T5K, T5z); + STM4(&(ro[4]), T6j, ovs, &(ro[0])); + T6k = VFMA(LDK(KP707106781), T5U, T5T); + STM4(&(io[4]), T6k, ovs, &(io[0])); + T6l = VFNMS(LDK(KP707106781), T5O, T5N); + STM4(&(io[28]), T6l, ovs, &(io[0])); + T6m = VFNMS(LDK(KP707106781), T5S, T5P); + STM4(&(ro[28]), T6m, ovs, &(ro[0])); + T6n = VFMA(LDK(KP707106781), T5O, T5N); + STM4(&(io[12]), T6n, ovs, &(io[0])); + T6o = VFMA(LDK(KP707106781), T5S, T5P); + STM4(&(ro[12]), T6o, ovs, &(ro[0])); + } + { + V Tv, T5V, T5Y, T60, T10, T11, T1w, T5Z; + { + V Tf, Tu, T5W, T5X; + Tf = VADD(T7, Te); + Tu = VADD(Tm, Tt); + Tv = VADD(Tf, Tu); + T5V = VSUB(Tf, Tu); + T5W = VADD(T5B, T5C); + T5X = VADD(T5G, T5H); + T5Y = VSUB(T5W, T5X); + T60 = VADD(T5W, T5X); + } + { + V TK, TZ, T1g, T1v; + TK = VADD(TC, TJ); + TZ = VADD(TR, TY); + T10 = VADD(TK, TZ); + T11 = VSUB(TZ, TK); + T1g = VADD(T18, T1f); + T1v = VADD(T1n, T1u); + T1w = VSUB(T1g, T1v); + T5Z = VADD(T1g, T1v); + } + T6p = VSUB(Tv, T10); + STM4(&(ro[16]), T6p, ovs, &(ro[0])); + T6q = VSUB(T5Z, T60); + STM4(&(io[16]), T6q, ovs, &(io[0])); + T6r = VADD(Tv, T10); + STM4(&(ro[0]), T6r, ovs, &(ro[0])); + T6s = VADD(T5Z, T60); + STM4(&(io[0]), T6s, ovs, &(io[0])); + T6t = VADD(T11, T1w); + STM4(&(io[8]), T6t, ovs, &(io[0])); + T6u = VADD(T5V, T5Y); + STM4(&(ro[8]), T6u, ovs, &(ro[0])); + T6v = VSUB(T1w, T11); + STM4(&(io[24]), T6v, ovs, &(io[0])); + T6w = VSUB(T5V, T5Y); + STM4(&(ro[24]), T6w, ovs, &(ro[0])); + } + { + V T6x, T6y, T6z, T6A, T6B, T6C, T6D, T6E, T6F, T6G, T6H, T6I, T6J, T6K, T6L; + V T6M; + { + V T1X, T37, T31, T33, T2o, T35, T2P, T34; + { + V T1H, T1W, T2X, T30; + T1H = VFNMS(LDK(KP707106781), T1G, T1z); + T1W = VSUB(T1O, T1V); + T1X = VFMA(LDK(KP923879532), T1W, T1H); + T37 = VFNMS(LDK(KP923879532), T1W, T1H); + T2X = VFNMS(LDK(KP707106781), T2W, T2T); + T30 = VSUB(T2Y, T2Z); + T31 = VFNMS(LDK(KP923879532), T30, T2X); + T33 = VFMA(LDK(KP923879532), T30, T2X); + } + { + V T2e, T2n, T2F, T2O; + T2e = VFNMS(LDK(KP707106781), T2d, T22); + T2n = VFNMS(LDK(KP707106781), T2m, T2j); + T2o = VFMA(LDK(KP668178637), T2n, T2e); + T35 = VFNMS(LDK(KP668178637), T2e, T2n); + T2F = VFNMS(LDK(KP707106781), T2E, T2t); + T2O = VFNMS(LDK(KP707106781), T2N, T2K); + T2P = VFNMS(LDK(KP668178637), T2O, T2F); + T34 = VFMA(LDK(KP668178637), T2F, T2O); + } + { + V T2Q, T36, T32, T38; + T2Q = VSUB(T2o, T2P); + T6x = VFNMS(LDK(KP831469612), T2Q, T1X); + STM4(&(ro[21]), T6x, ovs, &(ro[1])); + T6y = VFMA(LDK(KP831469612), T2Q, T1X); + STM4(&(ro[5]), T6y, ovs, &(ro[1])); + T36 = VSUB(T34, T35); + T6z = VFNMS(LDK(KP831469612), T36, T33); + STM4(&(io[21]), T6z, ovs, &(io[1])); + T6A = VFMA(LDK(KP831469612), T36, T33); + STM4(&(io[5]), T6A, ovs, &(io[1])); + T32 = VADD(T2o, T2P); + T6B = VFNMS(LDK(KP831469612), T32, T31); + STM4(&(io[13]), T6B, ovs, &(io[1])); + T6C = VFMA(LDK(KP831469612), T32, T31); + STM4(&(io[29]), T6C, ovs, &(io[1])); + T38 = VADD(T35, T34); + T6D = VFNMS(LDK(KP831469612), T38, T37); + STM4(&(ro[13]), T6D, ovs, &(ro[1])); + T6E = VFMA(LDK(KP831469612), T38, T37); + STM4(&(ro[29]), T6E, ovs, &(ro[1])); + } + } + { + V T3D, T41, T3Z, T45, T3K, T42, T3R, T43; + { + V T3v, T3C, T3V, T3Y; + T3v = VFMA(LDK(KP707106781), T3u, T3t); + T3C = VSUB(T3y, T3B); + T3D = VFMA(LDK(KP923879532), T3C, T3v); + T41 = VFNMS(LDK(KP923879532), T3C, T3v); + T3V = VFMA(LDK(KP707106781), T3U, T3T); + T3Y = VSUB(T3W, T3X); + T3Z = VFNMS(LDK(KP923879532), T3Y, T3V); + T45 = VFMA(LDK(KP923879532), T3Y, T3V); + } + { + V T3G, T3J, T3N, T3Q; + T3G = VFNMS(LDK(KP707106781), T3F, T3E); + T3J = VFNMS(LDK(KP707106781), T3I, T3H); + T3K = VFMA(LDK(KP668178637), T3J, T3G); + T42 = VFNMS(LDK(KP668178637), T3G, T3J); + T3N = VFNMS(LDK(KP707106781), T3M, T3L); + T3Q = VFNMS(LDK(KP707106781), T3P, T3O); + T3R = VFNMS(LDK(KP668178637), T3Q, T3N); + T43 = VFMA(LDK(KP668178637), T3N, T3Q); + } + { + V T3S, T46, T40, T44; + T3S = VADD(T3K, T3R); + T6F = VFNMS(LDK(KP831469612), T3S, T3D); + STM4(&(ro[19]), T6F, ovs, &(ro[1])); + T6G = VFMA(LDK(KP831469612), T3S, T3D); + STM4(&(ro[3]), T6G, ovs, &(ro[1])); + T46 = VADD(T42, T43); + T6H = VFNMS(LDK(KP831469612), T46, T45); + STM4(&(io[19]), T6H, ovs, &(io[1])); + T6I = VFMA(LDK(KP831469612), T46, T45); + STM4(&(io[3]), T6I, ovs, &(io[1])); + T40 = VSUB(T3R, T3K); + T6J = VFNMS(LDK(KP831469612), T40, T3Z); + STM4(&(io[27]), T6J, ovs, &(io[1])); + T6K = VFMA(LDK(KP831469612), T40, T3Z); + STM4(&(io[11]), T6K, ovs, &(io[1])); + T44 = VSUB(T42, T43); + T6L = VFNMS(LDK(KP831469612), T44, T41); + STM4(&(ro[27]), T6L, ovs, &(ro[1])); + T6M = VFMA(LDK(KP831469612), T44, T41); + STM4(&(ro[11]), T6M, ovs, &(ro[1])); + } + } + { + V T49, T4p, T4j, T4l, T4c, T4n, T4f, T4m; + { + V T47, T48, T4h, T4i; + T47 = VFNMS(LDK(KP707106781), T3u, T3t); + T48 = VADD(T3X, T3W); + T49 = VFNMS(LDK(KP923879532), T48, T47); + T4p = VFMA(LDK(KP923879532), T48, T47); + T4h = VFNMS(LDK(KP707106781), T3U, T3T); + T4i = VADD(T3y, T3B); + T4j = VFMA(LDK(KP923879532), T4i, T4h); + T4l = VFNMS(LDK(KP923879532), T4i, T4h); + } + { + V T4a, T4b, T4d, T4e; + T4a = VFMA(LDK(KP707106781), T3I, T3H); + T4b = VFMA(LDK(KP707106781), T3F, T3E); + T4c = VFMA(LDK(KP198912367), T4b, T4a); + T4n = VFNMS(LDK(KP198912367), T4a, T4b); + T4d = VFMA(LDK(KP707106781), T3P, T3O); + T4e = VFMA(LDK(KP707106781), T3M, T3L); + T4f = VFNMS(LDK(KP198912367), T4e, T4d); + T4m = VFMA(LDK(KP198912367), T4d, T4e); + } + { + V T4g, T6N, T6O, T4o, T6P, T6Q; + T4g = VSUB(T4c, T4f); + T6N = VFNMS(LDK(KP980785280), T4g, T49); + STM4(&(ro[23]), T6N, ovs, &(ro[1])); + STN4(&(ro[20]), T6h, T6x, T61, T6N, ovs); + T6O = VFMA(LDK(KP980785280), T4g, T49); + STM4(&(ro[7]), T6O, ovs, &(ro[1])); + STN4(&(ro[4]), T6j, T6y, T63, T6O, ovs); + T4o = VSUB(T4m, T4n); + T6P = VFNMS(LDK(KP980785280), T4o, T4l); + STM4(&(io[23]), T6P, ovs, &(io[1])); + STN4(&(io[20]), T6i, T6z, T62, T6P, ovs); + T6Q = VFMA(LDK(KP980785280), T4o, T4l); + STM4(&(io[7]), T6Q, ovs, &(io[1])); + STN4(&(io[4]), T6k, T6A, T64, T6Q, ovs); + } + { + V T4k, T6R, T6S, T4q, T6T, T6U; + T4k = VADD(T4c, T4f); + T6R = VFNMS(LDK(KP980785280), T4k, T4j); + STM4(&(io[15]), T6R, ovs, &(io[1])); + STN4(&(io[12]), T6n, T6B, T65, T6R, ovs); + T6S = VFMA(LDK(KP980785280), T4k, T4j); + STM4(&(io[31]), T6S, ovs, &(io[1])); + STN4(&(io[28]), T6l, T6C, T67, T6S, ovs); + T4q = VADD(T4n, T4m); + T6T = VFNMS(LDK(KP980785280), T4q, T4p); + STM4(&(ro[15]), T6T, ovs, &(ro[1])); + STN4(&(ro[12]), T6o, T6D, T66, T6T, ovs); + T6U = VFMA(LDK(KP980785280), T4q, T4p); + STM4(&(ro[31]), T6U, ovs, &(ro[1])); + STN4(&(ro[28]), T6m, T6E, T68, T6U, ovs); + } + } + { + V T3b, T3n, T3l, T3r, T3e, T3o, T3h, T3p; + { + V T39, T3a, T3j, T3k; + T39 = VFMA(LDK(KP707106781), T1G, T1z); + T3a = VADD(T2Z, T2Y); + T3b = VFMA(LDK(KP923879532), T3a, T39); + T3n = VFNMS(LDK(KP923879532), T3a, T39); + T3j = VFMA(LDK(KP707106781), T2W, T2T); + T3k = VADD(T1O, T1V); + T3l = VFNMS(LDK(KP923879532), T3k, T3j); + T3r = VFMA(LDK(KP923879532), T3k, T3j); + } + { + V T3c, T3d, T3f, T3g; + T3c = VFMA(LDK(KP707106781), T2m, T2j); + T3d = VFMA(LDK(KP707106781), T2d, T22); + T3e = VFMA(LDK(KP198912367), T3d, T3c); + T3o = VFNMS(LDK(KP198912367), T3c, T3d); + T3f = VFMA(LDK(KP707106781), T2N, T2K); + T3g = VFMA(LDK(KP707106781), T2E, T2t); + T3h = VFNMS(LDK(KP198912367), T3g, T3f); + T3p = VFMA(LDK(KP198912367), T3f, T3g); + } + { + V T3i, T6V, T6W, T3s, T6X, T6Y; + T3i = VADD(T3e, T3h); + T6V = VFNMS(LDK(KP980785280), T3i, T3b); + STM4(&(ro[17]), T6V, ovs, &(ro[1])); + STN4(&(ro[16]), T6p, T6V, T69, T6F, ovs); + T6W = VFMA(LDK(KP980785280), T3i, T3b); + STM4(&(ro[1]), T6W, ovs, &(ro[1])); + STN4(&(ro[0]), T6r, T6W, T6b, T6G, ovs); + T3s = VADD(T3o, T3p); + T6X = VFNMS(LDK(KP980785280), T3s, T3r); + STM4(&(io[17]), T6X, ovs, &(io[1])); + STN4(&(io[16]), T6q, T6X, T6a, T6H, ovs); + T6Y = VFMA(LDK(KP980785280), T3s, T3r); + STM4(&(io[1]), T6Y, ovs, &(io[1])); + STN4(&(io[0]), T6s, T6Y, T6c, T6I, ovs); + } + { + V T3m, T6Z, T70, T3q, T71, T72; + T3m = VSUB(T3h, T3e); + T6Z = VFNMS(LDK(KP980785280), T3m, T3l); + STM4(&(io[25]), T6Z, ovs, &(io[1])); + STN4(&(io[24]), T6v, T6Z, T6d, T6J, ovs); + T70 = VFMA(LDK(KP980785280), T3m, T3l); + STM4(&(io[9]), T70, ovs, &(io[1])); + STN4(&(io[8]), T6t, T70, T6f, T6K, ovs); + T3q = VSUB(T3o, T3p); + T71 = VFNMS(LDK(KP980785280), T3q, T3n); + STM4(&(ro[25]), T71, ovs, &(ro[1])); + STN4(&(ro[24]), T6w, T71, T6e, T6L, ovs); + T72 = VFMA(LDK(KP980785280), T3q, T3n); + STM4(&(ro[9]), T72, ovs, &(ro[1])); + STN4(&(ro[8]), T6u, T72, T6g, T6M, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n2sv_32"), {236, 0, 136, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_32) (planner *p) { + X(kdft_register) (p, n2sv_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name n2sv_32 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 372 FP additions, 84 FP multiplications, + * (or, 340 additions, 52 multiplications, 32 fused multiply/add), + * 130 stack variables, 7 constants, and 144 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_32(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(128, is), MAKE_VOLATILE_STRIDE(128, os)) { + V T7, T4r, T4Z, T18, T1z, T3t, T3T, T2T, Te, T1f, T50, T4s, T2W, T3u, T1G; + V T3U, Tm, T1n, T1O, T2Z, T3y, T3X, T4w, T53, Tt, T1u, T1V, T2Y, T3B, T3W; + V T4z, T52, T2t, T3L, T3O, T2K, TR, TY, T5F, T5G, T5H, T5I, T4R, T5j, T2E; + V T3P, T4W, T5k, T2N, T3M, T22, T3E, T3H, T2j, TC, TJ, T5A, T5B, T5C, T5D; + V T4G, T5g, T2d, T3F, T4L, T5h, T2m, T3I; + { + V T3, T1x, T14, T2S, T6, T2R, T17, T1y; + { + V T1, T2, T12, T13; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 16)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + T1x = VSUB(T1, T2); + T12 = LD(&(ii[0]), ivs, &(ii[0])); + T13 = LD(&(ii[WS(is, 16)]), ivs, &(ii[0])); + T14 = VADD(T12, T13); + T2S = VSUB(T12, T13); + } + { + V T4, T5, T15, T16; + T4 = LD(&(ri[WS(is, 8)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 24)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + T2R = VSUB(T4, T5); + T15 = LD(&(ii[WS(is, 8)]), ivs, &(ii[0])); + T16 = LD(&(ii[WS(is, 24)]), ivs, &(ii[0])); + T17 = VADD(T15, T16); + T1y = VSUB(T15, T16); + } + T7 = VADD(T3, T6); + T4r = VSUB(T3, T6); + T4Z = VSUB(T14, T17); + T18 = VADD(T14, T17); + T1z = VSUB(T1x, T1y); + T3t = VADD(T1x, T1y); + T3T = VSUB(T2S, T2R); + T2T = VADD(T2R, T2S); + } + { + V Ta, T1B, T1b, T1A, Td, T1D, T1e, T1E; + { + V T8, T9, T19, T1a; + T8 = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + T9 = LD(&(ri[WS(is, 20)]), ivs, &(ri[0])); + Ta = VADD(T8, T9); + T1B = VSUB(T8, T9); + T19 = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + T1a = LD(&(ii[WS(is, 20)]), ivs, &(ii[0])); + T1b = VADD(T19, T1a); + T1A = VSUB(T19, T1a); + } + { + V Tb, Tc, T1c, T1d; + Tb = LD(&(ri[WS(is, 28)]), ivs, &(ri[0])); + Tc = LD(&(ri[WS(is, 12)]), ivs, &(ri[0])); + Td = VADD(Tb, Tc); + T1D = VSUB(Tb, Tc); + T1c = LD(&(ii[WS(is, 28)]), ivs, &(ii[0])); + T1d = LD(&(ii[WS(is, 12)]), ivs, &(ii[0])); + T1e = VADD(T1c, T1d); + T1E = VSUB(T1c, T1d); + } + Te = VADD(Ta, Td); + T1f = VADD(T1b, T1e); + T50 = VSUB(Td, Ta); + T4s = VSUB(T1b, T1e); + { + V T2U, T2V, T1C, T1F; + T2U = VSUB(T1D, T1E); + T2V = VADD(T1B, T1A); + T2W = VMUL(LDK(KP707106781), VSUB(T2U, T2V)); + T3u = VMUL(LDK(KP707106781), VADD(T2V, T2U)); + T1C = VSUB(T1A, T1B); + T1F = VADD(T1D, T1E); + T1G = VMUL(LDK(KP707106781), VSUB(T1C, T1F)); + T3U = VMUL(LDK(KP707106781), VADD(T1C, T1F)); + } + } + { + V Ti, T1L, T1j, T1J, Tl, T1I, T1m, T1M, T1K, T1N; + { + V Tg, Th, T1h, T1i; + Tg = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + Th = LD(&(ri[WS(is, 18)]), ivs, &(ri[0])); + Ti = VADD(Tg, Th); + T1L = VSUB(Tg, Th); + T1h = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + T1i = LD(&(ii[WS(is, 18)]), ivs, &(ii[0])); + T1j = VADD(T1h, T1i); + T1J = VSUB(T1h, T1i); + } + { + V Tj, Tk, T1k, T1l; + Tj = LD(&(ri[WS(is, 10)]), ivs, &(ri[0])); + Tk = LD(&(ri[WS(is, 26)]), ivs, &(ri[0])); + Tl = VADD(Tj, Tk); + T1I = VSUB(Tj, Tk); + T1k = LD(&(ii[WS(is, 10)]), ivs, &(ii[0])); + T1l = LD(&(ii[WS(is, 26)]), ivs, &(ii[0])); + T1m = VADD(T1k, T1l); + T1M = VSUB(T1k, T1l); + } + Tm = VADD(Ti, Tl); + T1n = VADD(T1j, T1m); + T1K = VADD(T1I, T1J); + T1N = VSUB(T1L, T1M); + T1O = VFNMS(LDK(KP923879532), T1N, VMUL(LDK(KP382683432), T1K)); + T2Z = VFMA(LDK(KP923879532), T1K, VMUL(LDK(KP382683432), T1N)); + { + V T3w, T3x, T4u, T4v; + T3w = VSUB(T1J, T1I); + T3x = VADD(T1L, T1M); + T3y = VFNMS(LDK(KP382683432), T3x, VMUL(LDK(KP923879532), T3w)); + T3X = VFMA(LDK(KP382683432), T3w, VMUL(LDK(KP923879532), T3x)); + T4u = VSUB(T1j, T1m); + T4v = VSUB(Ti, Tl); + T4w = VSUB(T4u, T4v); + T53 = VADD(T4v, T4u); + } + } + { + V Tp, T1S, T1q, T1Q, Ts, T1P, T1t, T1T, T1R, T1U; + { + V Tn, To, T1o, T1p; + Tn = LD(&(ri[WS(is, 30)]), ivs, &(ri[0])); + To = LD(&(ri[WS(is, 14)]), ivs, &(ri[0])); + Tp = VADD(Tn, To); + T1S = VSUB(Tn, To); + T1o = LD(&(ii[WS(is, 30)]), ivs, &(ii[0])); + T1p = LD(&(ii[WS(is, 14)]), ivs, &(ii[0])); + T1q = VADD(T1o, T1p); + T1Q = VSUB(T1o, T1p); + } + { + V Tq, Tr, T1r, T1s; + Tq = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + Tr = LD(&(ri[WS(is, 22)]), ivs, &(ri[0])); + Ts = VADD(Tq, Tr); + T1P = VSUB(Tq, Tr); + T1r = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + T1s = LD(&(ii[WS(is, 22)]), ivs, &(ii[0])); + T1t = VADD(T1r, T1s); + T1T = VSUB(T1r, T1s); + } + Tt = VADD(Tp, Ts); + T1u = VADD(T1q, T1t); + T1R = VADD(T1P, T1Q); + T1U = VSUB(T1S, T1T); + T1V = VFMA(LDK(KP382683432), T1R, VMUL(LDK(KP923879532), T1U)); + T2Y = VFNMS(LDK(KP923879532), T1R, VMUL(LDK(KP382683432), T1U)); + { + V T3z, T3A, T4x, T4y; + T3z = VSUB(T1Q, T1P); + T3A = VADD(T1S, T1T); + T3B = VFMA(LDK(KP923879532), T3z, VMUL(LDK(KP382683432), T3A)); + T3W = VFNMS(LDK(KP382683432), T3z, VMUL(LDK(KP923879532), T3A)); + T4x = VSUB(Tp, Ts); + T4y = VSUB(T1q, T1t); + T4z = VADD(T4x, T4y); + T52 = VSUB(T4x, T4y); + } + } + { + V TN, T2p, T2J, T4S, TQ, T2G, T2s, T4T, TU, T2x, T2w, T4O, TX, T2z, T2C; + V T4P; + { + V TL, TM, T2H, T2I; + TL = LD(&(ri[WS(is, 31)]), ivs, &(ri[WS(is, 1)])); + TM = LD(&(ri[WS(is, 15)]), ivs, &(ri[WS(is, 1)])); + TN = VADD(TL, TM); + T2p = VSUB(TL, TM); + T2H = LD(&(ii[WS(is, 31)]), ivs, &(ii[WS(is, 1)])); + T2I = LD(&(ii[WS(is, 15)]), ivs, &(ii[WS(is, 1)])); + T2J = VSUB(T2H, T2I); + T4S = VADD(T2H, T2I); + } + { + V TO, TP, T2q, T2r; + TO = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + TP = LD(&(ri[WS(is, 23)]), ivs, &(ri[WS(is, 1)])); + TQ = VADD(TO, TP); + T2G = VSUB(TO, TP); + T2q = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + T2r = LD(&(ii[WS(is, 23)]), ivs, &(ii[WS(is, 1)])); + T2s = VSUB(T2q, T2r); + T4T = VADD(T2q, T2r); + } + { + V TS, TT, T2u, T2v; + TS = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + TT = LD(&(ri[WS(is, 19)]), ivs, &(ri[WS(is, 1)])); + TU = VADD(TS, TT); + T2x = VSUB(TS, TT); + T2u = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + T2v = LD(&(ii[WS(is, 19)]), ivs, &(ii[WS(is, 1)])); + T2w = VSUB(T2u, T2v); + T4O = VADD(T2u, T2v); + } + { + V TV, TW, T2A, T2B; + TV = LD(&(ri[WS(is, 27)]), ivs, &(ri[WS(is, 1)])); + TW = LD(&(ri[WS(is, 11)]), ivs, &(ri[WS(is, 1)])); + TX = VADD(TV, TW); + T2z = VSUB(TV, TW); + T2A = LD(&(ii[WS(is, 27)]), ivs, &(ii[WS(is, 1)])); + T2B = LD(&(ii[WS(is, 11)]), ivs, &(ii[WS(is, 1)])); + T2C = VSUB(T2A, T2B); + T4P = VADD(T2A, T2B); + } + T2t = VSUB(T2p, T2s); + T3L = VADD(T2p, T2s); + T3O = VSUB(T2J, T2G); + T2K = VADD(T2G, T2J); + TR = VADD(TN, TQ); + TY = VADD(TU, TX); + T5F = VSUB(TR, TY); + { + V T4N, T4Q, T2y, T2D; + T5G = VADD(T4S, T4T); + T5H = VADD(T4O, T4P); + T5I = VSUB(T5G, T5H); + T4N = VSUB(TN, TQ); + T4Q = VSUB(T4O, T4P); + T4R = VSUB(T4N, T4Q); + T5j = VADD(T4N, T4Q); + T2y = VSUB(T2w, T2x); + T2D = VADD(T2z, T2C); + T2E = VMUL(LDK(KP707106781), VSUB(T2y, T2D)); + T3P = VMUL(LDK(KP707106781), VADD(T2y, T2D)); + { + V T4U, T4V, T2L, T2M; + T4U = VSUB(T4S, T4T); + T4V = VSUB(TX, TU); + T4W = VSUB(T4U, T4V); + T5k = VADD(T4V, T4U); + T2L = VSUB(T2z, T2C); + T2M = VADD(T2x, T2w); + T2N = VMUL(LDK(KP707106781), VSUB(T2L, T2M)); + T3M = VMUL(LDK(KP707106781), VADD(T2M, T2L)); + } + } + } + { + V Ty, T2f, T21, T4C, TB, T1Y, T2i, T4D, TF, T28, T2b, T4I, TI, T23, T26; + V T4J; + { + V Tw, Tx, T1Z, T20; + Tw = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + Tx = LD(&(ri[WS(is, 17)]), ivs, &(ri[WS(is, 1)])); + Ty = VADD(Tw, Tx); + T2f = VSUB(Tw, Tx); + T1Z = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + T20 = LD(&(ii[WS(is, 17)]), ivs, &(ii[WS(is, 1)])); + T21 = VSUB(T1Z, T20); + T4C = VADD(T1Z, T20); + } + { + V Tz, TA, T2g, T2h; + Tz = LD(&(ri[WS(is, 9)]), ivs, &(ri[WS(is, 1)])); + TA = LD(&(ri[WS(is, 25)]), ivs, &(ri[WS(is, 1)])); + TB = VADD(Tz, TA); + T1Y = VSUB(Tz, TA); + T2g = LD(&(ii[WS(is, 9)]), ivs, &(ii[WS(is, 1)])); + T2h = LD(&(ii[WS(is, 25)]), ivs, &(ii[WS(is, 1)])); + T2i = VSUB(T2g, T2h); + T4D = VADD(T2g, T2h); + } + { + V TD, TE, T29, T2a; + TD = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + TE = LD(&(ri[WS(is, 21)]), ivs, &(ri[WS(is, 1)])); + TF = VADD(TD, TE); + T28 = VSUB(TD, TE); + T29 = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + T2a = LD(&(ii[WS(is, 21)]), ivs, &(ii[WS(is, 1)])); + T2b = VSUB(T29, T2a); + T4I = VADD(T29, T2a); + } + { + V TG, TH, T24, T25; + TG = LD(&(ri[WS(is, 29)]), ivs, &(ri[WS(is, 1)])); + TH = LD(&(ri[WS(is, 13)]), ivs, &(ri[WS(is, 1)])); + TI = VADD(TG, TH); + T23 = VSUB(TG, TH); + T24 = LD(&(ii[WS(is, 29)]), ivs, &(ii[WS(is, 1)])); + T25 = LD(&(ii[WS(is, 13)]), ivs, &(ii[WS(is, 1)])); + T26 = VSUB(T24, T25); + T4J = VADD(T24, T25); + } + T22 = VADD(T1Y, T21); + T3E = VADD(T2f, T2i); + T3H = VSUB(T21, T1Y); + T2j = VSUB(T2f, T2i); + TC = VADD(Ty, TB); + TJ = VADD(TF, TI); + T5A = VSUB(TC, TJ); + { + V T4E, T4F, T27, T2c; + T5B = VADD(T4C, T4D); + T5C = VADD(T4I, T4J); + T5D = VSUB(T5B, T5C); + T4E = VSUB(T4C, T4D); + T4F = VSUB(TI, TF); + T4G = VSUB(T4E, T4F); + T5g = VADD(T4F, T4E); + T27 = VSUB(T23, T26); + T2c = VADD(T28, T2b); + T2d = VMUL(LDK(KP707106781), VSUB(T27, T2c)); + T3F = VMUL(LDK(KP707106781), VADD(T2c, T27)); + { + V T4H, T4K, T2k, T2l; + T4H = VSUB(Ty, TB); + T4K = VSUB(T4I, T4J); + T4L = VSUB(T4H, T4K); + T5h = VADD(T4H, T4K); + T2k = VSUB(T2b, T28); + T2l = VADD(T23, T26); + T2m = VMUL(LDK(KP707106781), VSUB(T2k, T2l)); + T3I = VMUL(LDK(KP707106781), VADD(T2k, T2l)); + } + } + } + { + V T61, T62, T63, T64, T65, T66, T67, T68, T69, T6a, T6b, T6c, T6d, T6e, T6f; + V T6g, T6h, T6i, T6j, T6k, T6l, T6m, T6n, T6o, T6p, T6q, T6r, T6s, T6t, T6u; + V T6v, T6w; + { + V T4B, T57, T5a, T5c, T4Y, T56, T55, T5b; + { + V T4t, T4A, T58, T59; + T4t = VSUB(T4r, T4s); + T4A = VMUL(LDK(KP707106781), VSUB(T4w, T4z)); + T4B = VADD(T4t, T4A); + T57 = VSUB(T4t, T4A); + T58 = VFNMS(LDK(KP923879532), T4L, VMUL(LDK(KP382683432), T4G)); + T59 = VFMA(LDK(KP382683432), T4W, VMUL(LDK(KP923879532), T4R)); + T5a = VSUB(T58, T59); + T5c = VADD(T58, T59); + } + { + V T4M, T4X, T51, T54; + T4M = VFMA(LDK(KP923879532), T4G, VMUL(LDK(KP382683432), T4L)); + T4X = VFNMS(LDK(KP923879532), T4W, VMUL(LDK(KP382683432), T4R)); + T4Y = VADD(T4M, T4X); + T56 = VSUB(T4X, T4M); + T51 = VSUB(T4Z, T50); + T54 = VMUL(LDK(KP707106781), VSUB(T52, T53)); + T55 = VSUB(T51, T54); + T5b = VADD(T51, T54); + } + T61 = VSUB(T4B, T4Y); + STM4(&(ro[22]), T61, ovs, &(ro[0])); + T62 = VSUB(T5b, T5c); + STM4(&(io[22]), T62, ovs, &(io[0])); + T63 = VADD(T4B, T4Y); + STM4(&(ro[6]), T63, ovs, &(ro[0])); + T64 = VADD(T5b, T5c); + STM4(&(io[6]), T64, ovs, &(io[0])); + T65 = VSUB(T55, T56); + STM4(&(io[30]), T65, ovs, &(io[0])); + T66 = VSUB(T57, T5a); + STM4(&(ro[30]), T66, ovs, &(ro[0])); + T67 = VADD(T55, T56); + STM4(&(io[14]), T67, ovs, &(io[0])); + T68 = VADD(T57, T5a); + STM4(&(ro[14]), T68, ovs, &(ro[0])); + } + { + V T5f, T5r, T5u, T5w, T5m, T5q, T5p, T5v; + { + V T5d, T5e, T5s, T5t; + T5d = VADD(T4r, T4s); + T5e = VMUL(LDK(KP707106781), VADD(T53, T52)); + T5f = VADD(T5d, T5e); + T5r = VSUB(T5d, T5e); + T5s = VFNMS(LDK(KP382683432), T5h, VMUL(LDK(KP923879532), T5g)); + T5t = VFMA(LDK(KP923879532), T5k, VMUL(LDK(KP382683432), T5j)); + T5u = VSUB(T5s, T5t); + T5w = VADD(T5s, T5t); + } + { + V T5i, T5l, T5n, T5o; + T5i = VFMA(LDK(KP382683432), T5g, VMUL(LDK(KP923879532), T5h)); + T5l = VFNMS(LDK(KP382683432), T5k, VMUL(LDK(KP923879532), T5j)); + T5m = VADD(T5i, T5l); + T5q = VSUB(T5l, T5i); + T5n = VADD(T50, T4Z); + T5o = VMUL(LDK(KP707106781), VADD(T4w, T4z)); + T5p = VSUB(T5n, T5o); + T5v = VADD(T5n, T5o); + } + T69 = VSUB(T5f, T5m); + STM4(&(ro[18]), T69, ovs, &(ro[0])); + T6a = VSUB(T5v, T5w); + STM4(&(io[18]), T6a, ovs, &(io[0])); + T6b = VADD(T5f, T5m); + STM4(&(ro[2]), T6b, ovs, &(ro[0])); + T6c = VADD(T5v, T5w); + STM4(&(io[2]), T6c, ovs, &(io[0])); + T6d = VSUB(T5p, T5q); + STM4(&(io[26]), T6d, ovs, &(io[0])); + T6e = VSUB(T5r, T5u); + STM4(&(ro[26]), T6e, ovs, &(ro[0])); + T6f = VADD(T5p, T5q); + STM4(&(io[10]), T6f, ovs, &(io[0])); + T6g = VADD(T5r, T5u); + STM4(&(ro[10]), T6g, ovs, &(ro[0])); + } + { + V T5z, T5P, T5S, T5U, T5K, T5O, T5N, T5T; + { + V T5x, T5y, T5Q, T5R; + T5x = VSUB(T7, Te); + T5y = VSUB(T1n, T1u); + T5z = VADD(T5x, T5y); + T5P = VSUB(T5x, T5y); + T5Q = VSUB(T5D, T5A); + T5R = VADD(T5F, T5I); + T5S = VMUL(LDK(KP707106781), VSUB(T5Q, T5R)); + T5U = VMUL(LDK(KP707106781), VADD(T5Q, T5R)); + } + { + V T5E, T5J, T5L, T5M; + T5E = VADD(T5A, T5D); + T5J = VSUB(T5F, T5I); + T5K = VMUL(LDK(KP707106781), VADD(T5E, T5J)); + T5O = VMUL(LDK(KP707106781), VSUB(T5J, T5E)); + T5L = VSUB(T18, T1f); + T5M = VSUB(Tt, Tm); + T5N = VSUB(T5L, T5M); + T5T = VADD(T5M, T5L); + } + T6h = VSUB(T5z, T5K); + STM4(&(ro[20]), T6h, ovs, &(ro[0])); + T6i = VSUB(T5T, T5U); + STM4(&(io[20]), T6i, ovs, &(io[0])); + T6j = VADD(T5z, T5K); + STM4(&(ro[4]), T6j, ovs, &(ro[0])); + T6k = VADD(T5T, T5U); + STM4(&(io[4]), T6k, ovs, &(io[0])); + T6l = VSUB(T5N, T5O); + STM4(&(io[28]), T6l, ovs, &(io[0])); + T6m = VSUB(T5P, T5S); + STM4(&(ro[28]), T6m, ovs, &(ro[0])); + T6n = VADD(T5N, T5O); + STM4(&(io[12]), T6n, ovs, &(io[0])); + T6o = VADD(T5P, T5S); + STM4(&(ro[12]), T6o, ovs, &(ro[0])); + } + { + V Tv, T5V, T5Y, T60, T10, T11, T1w, T5Z; + { + V Tf, Tu, T5W, T5X; + Tf = VADD(T7, Te); + Tu = VADD(Tm, Tt); + Tv = VADD(Tf, Tu); + T5V = VSUB(Tf, Tu); + T5W = VADD(T5B, T5C); + T5X = VADD(T5G, T5H); + T5Y = VSUB(T5W, T5X); + T60 = VADD(T5W, T5X); + } + { + V TK, TZ, T1g, T1v; + TK = VADD(TC, TJ); + TZ = VADD(TR, TY); + T10 = VADD(TK, TZ); + T11 = VSUB(TZ, TK); + T1g = VADD(T18, T1f); + T1v = VADD(T1n, T1u); + T1w = VSUB(T1g, T1v); + T5Z = VADD(T1g, T1v); + } + T6p = VSUB(Tv, T10); + STM4(&(ro[16]), T6p, ovs, &(ro[0])); + T6q = VSUB(T5Z, T60); + STM4(&(io[16]), T6q, ovs, &(io[0])); + T6r = VADD(Tv, T10); + STM4(&(ro[0]), T6r, ovs, &(ro[0])); + T6s = VADD(T5Z, T60); + STM4(&(io[0]), T6s, ovs, &(io[0])); + T6t = VADD(T11, T1w); + STM4(&(io[8]), T6t, ovs, &(io[0])); + T6u = VADD(T5V, T5Y); + STM4(&(ro[8]), T6u, ovs, &(ro[0])); + T6v = VSUB(T1w, T11); + STM4(&(io[24]), T6v, ovs, &(io[0])); + T6w = VSUB(T5V, T5Y); + STM4(&(ro[24]), T6w, ovs, &(ro[0])); + } + { + V T6x, T6y, T6z, T6A, T6B, T6C, T6D, T6E; + { + V T1X, T33, T31, T37, T2o, T34, T2P, T35; + { + V T1H, T1W, T2X, T30; + T1H = VSUB(T1z, T1G); + T1W = VSUB(T1O, T1V); + T1X = VADD(T1H, T1W); + T33 = VSUB(T1H, T1W); + T2X = VSUB(T2T, T2W); + T30 = VSUB(T2Y, T2Z); + T31 = VSUB(T2X, T30); + T37 = VADD(T2X, T30); + } + { + V T2e, T2n, T2F, T2O; + T2e = VSUB(T22, T2d); + T2n = VSUB(T2j, T2m); + T2o = VFMA(LDK(KP980785280), T2e, VMUL(LDK(KP195090322), T2n)); + T34 = VFNMS(LDK(KP980785280), T2n, VMUL(LDK(KP195090322), T2e)); + T2F = VSUB(T2t, T2E); + T2O = VSUB(T2K, T2N); + T2P = VFNMS(LDK(KP980785280), T2O, VMUL(LDK(KP195090322), T2F)); + T35 = VFMA(LDK(KP195090322), T2O, VMUL(LDK(KP980785280), T2F)); + } + { + V T2Q, T38, T32, T36; + T2Q = VADD(T2o, T2P); + T6x = VSUB(T1X, T2Q); + STM4(&(ro[23]), T6x, ovs, &(ro[1])); + T6y = VADD(T1X, T2Q); + STM4(&(ro[7]), T6y, ovs, &(ro[1])); + T38 = VADD(T34, T35); + T6z = VSUB(T37, T38); + STM4(&(io[23]), T6z, ovs, &(io[1])); + T6A = VADD(T37, T38); + STM4(&(io[7]), T6A, ovs, &(io[1])); + T32 = VSUB(T2P, T2o); + T6B = VSUB(T31, T32); + STM4(&(io[31]), T6B, ovs, &(io[1])); + T6C = VADD(T31, T32); + STM4(&(io[15]), T6C, ovs, &(io[1])); + T36 = VSUB(T34, T35); + T6D = VSUB(T33, T36); + STM4(&(ro[31]), T6D, ovs, &(ro[1])); + T6E = VADD(T33, T36); + STM4(&(ro[15]), T6E, ovs, &(ro[1])); + } + } + { + V T3D, T41, T3Z, T45, T3K, T42, T3R, T43; + { + V T3v, T3C, T3V, T3Y; + T3v = VSUB(T3t, T3u); + T3C = VSUB(T3y, T3B); + T3D = VADD(T3v, T3C); + T41 = VSUB(T3v, T3C); + T3V = VSUB(T3T, T3U); + T3Y = VSUB(T3W, T3X); + T3Z = VSUB(T3V, T3Y); + T45 = VADD(T3V, T3Y); + } + { + V T3G, T3J, T3N, T3Q; + T3G = VSUB(T3E, T3F); + T3J = VSUB(T3H, T3I); + T3K = VFMA(LDK(KP555570233), T3G, VMUL(LDK(KP831469612), T3J)); + T42 = VFNMS(LDK(KP831469612), T3G, VMUL(LDK(KP555570233), T3J)); + T3N = VSUB(T3L, T3M); + T3Q = VSUB(T3O, T3P); + T3R = VFNMS(LDK(KP831469612), T3Q, VMUL(LDK(KP555570233), T3N)); + T43 = VFMA(LDK(KP831469612), T3N, VMUL(LDK(KP555570233), T3Q)); + } + { + V T3S, T6F, T6G, T46, T6H, T6I; + T3S = VADD(T3K, T3R); + T6F = VSUB(T3D, T3S); + STM4(&(ro[21]), T6F, ovs, &(ro[1])); + STN4(&(ro[20]), T6h, T6F, T61, T6x, ovs); + T6G = VADD(T3D, T3S); + STM4(&(ro[5]), T6G, ovs, &(ro[1])); + STN4(&(ro[4]), T6j, T6G, T63, T6y, ovs); + T46 = VADD(T42, T43); + T6H = VSUB(T45, T46); + STM4(&(io[21]), T6H, ovs, &(io[1])); + STN4(&(io[20]), T6i, T6H, T62, T6z, ovs); + T6I = VADD(T45, T46); + STM4(&(io[5]), T6I, ovs, &(io[1])); + STN4(&(io[4]), T6k, T6I, T64, T6A, ovs); + } + { + V T40, T6J, T6K, T44, T6L, T6M; + T40 = VSUB(T3R, T3K); + T6J = VSUB(T3Z, T40); + STM4(&(io[29]), T6J, ovs, &(io[1])); + STN4(&(io[28]), T6l, T6J, T65, T6B, ovs); + T6K = VADD(T3Z, T40); + STM4(&(io[13]), T6K, ovs, &(io[1])); + STN4(&(io[12]), T6n, T6K, T67, T6C, ovs); + T44 = VSUB(T42, T43); + T6L = VSUB(T41, T44); + STM4(&(ro[29]), T6L, ovs, &(ro[1])); + STN4(&(ro[28]), T6m, T6L, T66, T6D, ovs); + T6M = VADD(T41, T44); + STM4(&(ro[13]), T6M, ovs, &(ro[1])); + STN4(&(ro[12]), T6o, T6M, T68, T6E, ovs); + } + } + } + { + V T6N, T6O, T6P, T6Q, T6R, T6S, T6T, T6U; + { + V T49, T4l, T4j, T4p, T4c, T4m, T4f, T4n; + { + V T47, T48, T4h, T4i; + T47 = VADD(T3t, T3u); + T48 = VADD(T3X, T3W); + T49 = VADD(T47, T48); + T4l = VSUB(T47, T48); + T4h = VADD(T3T, T3U); + T4i = VADD(T3y, T3B); + T4j = VSUB(T4h, T4i); + T4p = VADD(T4h, T4i); + } + { + V T4a, T4b, T4d, T4e; + T4a = VADD(T3E, T3F); + T4b = VADD(T3H, T3I); + T4c = VFMA(LDK(KP980785280), T4a, VMUL(LDK(KP195090322), T4b)); + T4m = VFNMS(LDK(KP195090322), T4a, VMUL(LDK(KP980785280), T4b)); + T4d = VADD(T3L, T3M); + T4e = VADD(T3O, T3P); + T4f = VFNMS(LDK(KP195090322), T4e, VMUL(LDK(KP980785280), T4d)); + T4n = VFMA(LDK(KP195090322), T4d, VMUL(LDK(KP980785280), T4e)); + } + { + V T4g, T4q, T4k, T4o; + T4g = VADD(T4c, T4f); + T6N = VSUB(T49, T4g); + STM4(&(ro[17]), T6N, ovs, &(ro[1])); + T6O = VADD(T49, T4g); + STM4(&(ro[1]), T6O, ovs, &(ro[1])); + T4q = VADD(T4m, T4n); + T6P = VSUB(T4p, T4q); + STM4(&(io[17]), T6P, ovs, &(io[1])); + T6Q = VADD(T4p, T4q); + STM4(&(io[1]), T6Q, ovs, &(io[1])); + T4k = VSUB(T4f, T4c); + T6R = VSUB(T4j, T4k); + STM4(&(io[25]), T6R, ovs, &(io[1])); + T6S = VADD(T4j, T4k); + STM4(&(io[9]), T6S, ovs, &(io[1])); + T4o = VSUB(T4m, T4n); + T6T = VSUB(T4l, T4o); + STM4(&(ro[25]), T6T, ovs, &(ro[1])); + T6U = VADD(T4l, T4o); + STM4(&(ro[9]), T6U, ovs, &(ro[1])); + } + } + { + V T3b, T3n, T3l, T3r, T3e, T3o, T3h, T3p; + { + V T39, T3a, T3j, T3k; + T39 = VADD(T1z, T1G); + T3a = VADD(T2Z, T2Y); + T3b = VADD(T39, T3a); + T3n = VSUB(T39, T3a); + T3j = VADD(T2T, T2W); + T3k = VADD(T1O, T1V); + T3l = VSUB(T3j, T3k); + T3r = VADD(T3j, T3k); + } + { + V T3c, T3d, T3f, T3g; + T3c = VADD(T22, T2d); + T3d = VADD(T2j, T2m); + T3e = VFMA(LDK(KP555570233), T3c, VMUL(LDK(KP831469612), T3d)); + T3o = VFNMS(LDK(KP555570233), T3d, VMUL(LDK(KP831469612), T3c)); + T3f = VADD(T2t, T2E); + T3g = VADD(T2K, T2N); + T3h = VFNMS(LDK(KP555570233), T3g, VMUL(LDK(KP831469612), T3f)); + T3p = VFMA(LDK(KP831469612), T3g, VMUL(LDK(KP555570233), T3f)); + } + { + V T3i, T6V, T6W, T3s, T6X, T6Y; + T3i = VADD(T3e, T3h); + T6V = VSUB(T3b, T3i); + STM4(&(ro[19]), T6V, ovs, &(ro[1])); + STN4(&(ro[16]), T6p, T6N, T69, T6V, ovs); + T6W = VADD(T3b, T3i); + STM4(&(ro[3]), T6W, ovs, &(ro[1])); + STN4(&(ro[0]), T6r, T6O, T6b, T6W, ovs); + T3s = VADD(T3o, T3p); + T6X = VSUB(T3r, T3s); + STM4(&(io[19]), T6X, ovs, &(io[1])); + STN4(&(io[16]), T6q, T6P, T6a, T6X, ovs); + T6Y = VADD(T3r, T3s); + STM4(&(io[3]), T6Y, ovs, &(io[1])); + STN4(&(io[0]), T6s, T6Q, T6c, T6Y, ovs); + } + { + V T3m, T6Z, T70, T3q, T71, T72; + T3m = VSUB(T3h, T3e); + T6Z = VSUB(T3l, T3m); + STM4(&(io[27]), T6Z, ovs, &(io[1])); + STN4(&(io[24]), T6v, T6R, T6d, T6Z, ovs); + T70 = VADD(T3l, T3m); + STM4(&(io[11]), T70, ovs, &(io[1])); + STN4(&(io[8]), T6t, T6S, T6f, T70, ovs); + T3q = VSUB(T3o, T3p); + T71 = VSUB(T3n, T3q); + STM4(&(ro[27]), T71, ovs, &(ro[1])); + STN4(&(ro[24]), T6w, T6T, T6e, T71, ovs); + T72 = VADD(T3n, T3q); + STM4(&(ro[11]), T72, ovs, &(ro[1])); + STN4(&(ro[8]), T6u, T6U, T6g, T72, ovs); + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 32, XSIMD_STRING("n2sv_32"), {340, 52, 32, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_32) (planner *p) { + X(kdft_register) (p, n2sv_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_4.c new file mode 100644 index 000000000..6d38c2f4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_4.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name n2sv_4 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 16 FP additions, 0 FP multiplications, + * (or, 16 additions, 0 multiplications, 0 fused multiply/add), + * 17 stack variables, 0 constants, and 18 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tb, T9, Tf, T6, Ta, Te, Tg; + { + V T1, T2, T7, T8; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + Tb = VSUB(T1, T2); + T7 = LD(&(ii[0]), ivs, &(ii[0])); + T8 = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + { + V T4, T5, Tc, Td; + T4 = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + T5 = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + T6 = VADD(T4, T5); + Ta = VSUB(T4, T5); + Tc = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + Td = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + Te = VSUB(Tc, Td); + Tg = VADD(Tc, Td); + } + { + V Th, Ti, Tj, Tk; + Th = VSUB(T3, T6); + STM4(&(ro[2]), Th, ovs, &(ro[0])); + Ti = VSUB(Tf, Tg); + STM4(&(io[2]), Ti, ovs, &(io[0])); + Tj = VADD(T3, T6); + STM4(&(ro[0]), Tj, ovs, &(ro[0])); + Tk = VADD(Tf, Tg); + STM4(&(io[0]), Tk, ovs, &(io[0])); + { + V Tl, Tm, Tn, To; + Tl = VSUB(T9, Ta); + STM4(&(io[1]), Tl, ovs, &(io[1])); + Tm = VADD(Tb, Te); + STM4(&(ro[1]), Tm, ovs, &(ro[1])); + Tn = VADD(Ta, T9); + STM4(&(io[3]), Tn, ovs, &(io[1])); + STN4(&(io[0]), Tk, Tl, Ti, Tn, ovs); + To = VSUB(Tb, Te); + STM4(&(ro[3]), To, ovs, &(ro[1])); + STN4(&(ro[0]), Tj, Tm, Th, To, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n2sv_4"), {16, 0, 0, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_4) (planner *p) { + X(kdft_register) (p, n2sv_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name n2sv_4 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 16 FP additions, 0 FP multiplications, + * (or, 16 additions, 0 multiplications, 0 fused multiply/add), + * 17 stack variables, 0 constants, and 18 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_4(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + V T3, Tb, T9, Tf, T6, Ta, Te, Tg; + { + V T1, T2, T7, T8; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + Tb = VSUB(T1, T2); + T7 = LD(&(ii[0]), ivs, &(ii[0])); + T8 = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + T9 = VSUB(T7, T8); + Tf = VADD(T7, T8); + } + { + V T4, T5, Tc, Td; + T4 = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + T5 = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + T6 = VADD(T4, T5); + Ta = VSUB(T4, T5); + Tc = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + Td = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + Te = VSUB(Tc, Td); + Tg = VADD(Tc, Td); + } + { + V Th, Ti, Tj, Tk; + Th = VSUB(T3, T6); + STM4(&(ro[2]), Th, ovs, &(ro[0])); + Ti = VSUB(Tf, Tg); + STM4(&(io[2]), Ti, ovs, &(io[0])); + Tj = VADD(T3, T6); + STM4(&(ro[0]), Tj, ovs, &(ro[0])); + Tk = VADD(Tf, Tg); + STM4(&(io[0]), Tk, ovs, &(io[0])); + { + V Tl, Tm, Tn, To; + Tl = VSUB(T9, Ta); + STM4(&(io[1]), Tl, ovs, &(io[1])); + Tm = VADD(Tb, Te); + STM4(&(ro[1]), Tm, ovs, &(ro[1])); + Tn = VADD(Ta, T9); + STM4(&(io[3]), Tn, ovs, &(io[1])); + STN4(&(io[0]), Tk, Tl, Ti, Tn, ovs); + To = VSUB(Tb, Te); + STM4(&(ro[3]), To, ovs, &(ro[1])); + STN4(&(ro[0]), Tj, Tm, Th, To, ovs); + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 4, XSIMD_STRING("n2sv_4"), {16, 0, 0, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_4) (planner *p) { + X(kdft_register) (p, n2sv_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_64.c new file mode 100644 index 000000000..9a8423202 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_64.c @@ -0,0 +1,3488 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:24 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name n2sv_64 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 912 FP additions, 392 FP multiplications, + * (or, 520 additions, 0 multiplications, 392 fused multiply/add), + * 260 stack variables, 15 constants, and 288 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + V T37, T7B, T8F, T5Z, Tf, Td9, TbB, TcB, T62, T7C, T2i, TdH, Tah, Tcb, T3e; + V T8G, Tu, TdI, Tak, TbC, Tan, TbD, T2x, Tda, T3m, T65, T7G, T8I, T7J, T8J; + V T3t, T64, TK, Tdd, Tas, Tce, Tav, Tcf, T2N, Tdc, T3G, T6G, T7O, T9k, T7R; + V T9l, T3N, T6H, T1L, TdA, Tbs, Tct, Tdx, Teo, T5j, T6Y, T5Q, T6V, T8y, T9z; + V Tbb, Tcw, T8n, T9C, TZ, Tdf, Taz, Tch, TaC, Tci, T32, Tdg, T3Z, T6J, T7V; + V T9n, T7Y, T9o, T46, T6K, T1g, Tdp, Tb1, Tcm, Tdm, Tej, T4q, T6R, T4X, T6O; + V T8f, T9s, TaK, Tcp, T84, T9v, T1v, Tdn, Tb4, Tcq, Tds, Tek, T4N, T6P, T50; + V T6S, T8i, T9w, TaV, Tcn, T8b, T9t, T20, Tdy, Tbv, Tcx, TdD, Tep, T5G, T6W; + V T5T, T6Z, T8B, T9D, Tbm, Tcu, T8u, T9A; + { + V T3, T35, T26, T5Y, T6, T5X, T29, T36, Ta, T39, T2d, T38, Td, T3b, T2g; + V T3c; + { + V T1, T2, T24, T25; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 32)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + T35 = VSUB(T1, T2); + T24 = LD(&(ii[0]), ivs, &(ii[0])); + T25 = LD(&(ii[WS(is, 32)]), ivs, &(ii[0])); + T26 = VADD(T24, T25); + T5Y = VSUB(T24, T25); + } + { + V T4, T5, T27, T28; + T4 = LD(&(ri[WS(is, 16)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 48)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + T5X = VSUB(T4, T5); + T27 = LD(&(ii[WS(is, 16)]), ivs, &(ii[0])); + T28 = LD(&(ii[WS(is, 48)]), ivs, &(ii[0])); + T29 = VADD(T27, T28); + T36 = VSUB(T27, T28); + } + { + V T8, T9, T2b, T2c; + T8 = LD(&(ri[WS(is, 8)]), ivs, &(ri[0])); + T9 = LD(&(ri[WS(is, 40)]), ivs, &(ri[0])); + Ta = VADD(T8, T9); + T39 = VSUB(T8, T9); + T2b = LD(&(ii[WS(is, 8)]), ivs, &(ii[0])); + T2c = LD(&(ii[WS(is, 40)]), ivs, &(ii[0])); + T2d = VADD(T2b, T2c); + T38 = VSUB(T2b, T2c); + } + { + V Tb, Tc, T2e, T2f; + Tb = LD(&(ri[WS(is, 56)]), ivs, &(ri[0])); + Tc = LD(&(ri[WS(is, 24)]), ivs, &(ri[0])); + Td = VADD(Tb, Tc); + T3b = VSUB(Tb, Tc); + T2e = LD(&(ii[WS(is, 56)]), ivs, &(ii[0])); + T2f = LD(&(ii[WS(is, 24)]), ivs, &(ii[0])); + T2g = VADD(T2e, T2f); + T3c = VSUB(T2e, T2f); + } + { + V T7, Te, T2a, T2h; + T37 = VSUB(T35, T36); + T7B = VADD(T35, T36); + T8F = VSUB(T5Y, T5X); + T5Z = VADD(T5X, T5Y); + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + Tf = VADD(T7, Te); + Td9 = VSUB(T7, Te); + { + V Tbz, TbA, T60, T61; + Tbz = VSUB(Td, Ta); + TbA = VSUB(T26, T29); + TbB = VADD(Tbz, TbA); + TcB = VSUB(TbA, Tbz); + T60 = VSUB(T3b, T3c); + T61 = VADD(T39, T38); + T62 = VSUB(T60, T61); + T7C = VADD(T61, T60); + } + T2a = VADD(T26, T29); + T2h = VADD(T2d, T2g); + T2i = VADD(T2a, T2h); + TdH = VSUB(T2a, T2h); + { + V Taf, Tag, T3a, T3d; + Taf = VSUB(T3, T6); + Tag = VSUB(T2d, T2g); + Tah = VADD(Taf, Tag); + Tcb = VSUB(Taf, Tag); + T3a = VSUB(T38, T39); + T3d = VADD(T3b, T3c); + T3e = VSUB(T3a, T3d); + T8G = VADD(T3a, T3d); + } + } + } + { + V Ti, T3j, T2l, T3h, Tl, T3g, T2o, T3k, Tp, T3q, T2s, T3o, Ts, T3n, T2v; + V T3r; + { + V Tg, Th, T2j, T2k; + Tg = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + Th = LD(&(ri[WS(is, 36)]), ivs, &(ri[0])); + Ti = VADD(Tg, Th); + T3j = VSUB(Tg, Th); + T2j = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + T2k = LD(&(ii[WS(is, 36)]), ivs, &(ii[0])); + T2l = VADD(T2j, T2k); + T3h = VSUB(T2j, T2k); + } + { + V Tj, Tk, T2m, T2n; + Tj = LD(&(ri[WS(is, 20)]), ivs, &(ri[0])); + Tk = LD(&(ri[WS(is, 52)]), ivs, &(ri[0])); + Tl = VADD(Tj, Tk); + T3g = VSUB(Tj, Tk); + T2m = LD(&(ii[WS(is, 20)]), ivs, &(ii[0])); + T2n = LD(&(ii[WS(is, 52)]), ivs, &(ii[0])); + T2o = VADD(T2m, T2n); + T3k = VSUB(T2m, T2n); + } + { + V Tn, To, T2q, T2r; + Tn = LD(&(ri[WS(is, 60)]), ivs, &(ri[0])); + To = LD(&(ri[WS(is, 28)]), ivs, &(ri[0])); + Tp = VADD(Tn, To); + T3q = VSUB(Tn, To); + T2q = LD(&(ii[WS(is, 60)]), ivs, &(ii[0])); + T2r = LD(&(ii[WS(is, 28)]), ivs, &(ii[0])); + T2s = VADD(T2q, T2r); + T3o = VSUB(T2q, T2r); + } + { + V Tq, Tr, T2t, T2u; + Tq = LD(&(ri[WS(is, 12)]), ivs, &(ri[0])); + Tr = LD(&(ri[WS(is, 44)]), ivs, &(ri[0])); + Ts = VADD(Tq, Tr); + T3n = VSUB(Tq, Tr); + T2t = LD(&(ii[WS(is, 12)]), ivs, &(ii[0])); + T2u = LD(&(ii[WS(is, 44)]), ivs, &(ii[0])); + T2v = VADD(T2t, T2u); + T3r = VSUB(T2t, T2u); + } + { + V Tm, Tt, Tai, Taj; + Tm = VADD(Ti, Tl); + Tt = VADD(Tp, Ts); + Tu = VADD(Tm, Tt); + TdI = VSUB(Tt, Tm); + Tai = VSUB(Ti, Tl); + Taj = VSUB(T2l, T2o); + Tak = VADD(Tai, Taj); + TbC = VSUB(Taj, Tai); + } + { + V Tal, Tam, T2p, T2w; + Tal = VSUB(Tp, Ts); + Tam = VSUB(T2s, T2v); + Tan = VSUB(Tal, Tam); + TbD = VADD(Tal, Tam); + T2p = VADD(T2l, T2o); + T2w = VADD(T2s, T2v); + T2x = VADD(T2p, T2w); + Tda = VSUB(T2p, T2w); + } + { + V T3i, T3l, T7E, T7F; + T3i = VADD(T3g, T3h); + T3l = VSUB(T3j, T3k); + T3m = VFMA(LDK(KP414213562), T3l, T3i); + T65 = VFNMS(LDK(KP414213562), T3i, T3l); + T7E = VADD(T3j, T3k); + T7F = VSUB(T3h, T3g); + T7G = VFMA(LDK(KP414213562), T7F, T7E); + T8I = VFNMS(LDK(KP414213562), T7E, T7F); + } + { + V T7H, T7I, T3p, T3s; + T7H = VADD(T3q, T3r); + T7I = VSUB(T3o, T3n); + T7J = VFNMS(LDK(KP414213562), T7I, T7H); + T8J = VFMA(LDK(KP414213562), T7H, T7I); + T3p = VADD(T3n, T3o); + T3s = VSUB(T3q, T3r); + T3t = VFNMS(LDK(KP414213562), T3s, T3p); + T64 = VFMA(LDK(KP414213562), T3p, T3s); + } + } + { + V Ty, T3H, T2B, T3x, TB, T3w, T2E, T3I, TI, T3K, T2L, T3E, TF, T3L, T2I; + V T3B; + { + V Tw, Tx, T2C, T2D; + Tw = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + Tx = LD(&(ri[WS(is, 34)]), ivs, &(ri[0])); + Ty = VADD(Tw, Tx); + T3H = VSUB(Tw, Tx); + { + V T2z, T2A, Tz, TA; + T2z = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + T2A = LD(&(ii[WS(is, 34)]), ivs, &(ii[0])); + T2B = VADD(T2z, T2A); + T3x = VSUB(T2z, T2A); + Tz = LD(&(ri[WS(is, 18)]), ivs, &(ri[0])); + TA = LD(&(ri[WS(is, 50)]), ivs, &(ri[0])); + TB = VADD(Tz, TA); + T3w = VSUB(Tz, TA); + } + T2C = LD(&(ii[WS(is, 18)]), ivs, &(ii[0])); + T2D = LD(&(ii[WS(is, 50)]), ivs, &(ii[0])); + T2E = VADD(T2C, T2D); + T3I = VSUB(T2C, T2D); + { + V TG, TH, T3C, T2J, T2K, T3D; + TG = LD(&(ri[WS(is, 58)]), ivs, &(ri[0])); + TH = LD(&(ri[WS(is, 26)]), ivs, &(ri[0])); + T3C = VSUB(TG, TH); + T2J = LD(&(ii[WS(is, 58)]), ivs, &(ii[0])); + T2K = LD(&(ii[WS(is, 26)]), ivs, &(ii[0])); + T3D = VSUB(T2J, T2K); + TI = VADD(TG, TH); + T3K = VADD(T3C, T3D); + T2L = VADD(T2J, T2K); + T3E = VSUB(T3C, T3D); + } + { + V TD, TE, T3z, T2G, T2H, T3A; + TD = LD(&(ri[WS(is, 10)]), ivs, &(ri[0])); + TE = LD(&(ri[WS(is, 42)]), ivs, &(ri[0])); + T3z = VSUB(TD, TE); + T2G = LD(&(ii[WS(is, 10)]), ivs, &(ii[0])); + T2H = LD(&(ii[WS(is, 42)]), ivs, &(ii[0])); + T3A = VSUB(T2G, T2H); + TF = VADD(TD, TE); + T3L = VSUB(T3A, T3z); + T2I = VADD(T2G, T2H); + T3B = VADD(T3z, T3A); + } + } + { + V TC, TJ, Taq, Tar; + TC = VADD(Ty, TB); + TJ = VADD(TF, TI); + TK = VADD(TC, TJ); + Tdd = VSUB(TC, TJ); + Taq = VSUB(TI, TF); + Tar = VSUB(T2B, T2E); + Tas = VADD(Taq, Tar); + Tce = VSUB(Tar, Taq); + } + { + V Tat, Tau, T2F, T2M; + Tat = VSUB(Ty, TB); + Tau = VSUB(T2I, T2L); + Tav = VADD(Tat, Tau); + Tcf = VSUB(Tat, Tau); + T2F = VADD(T2B, T2E); + T2M = VADD(T2I, T2L); + T2N = VADD(T2F, T2M); + Tdc = VSUB(T2F, T2M); + } + { + V T3y, T3F, T7M, T7N; + T3y = VADD(T3w, T3x); + T3F = VSUB(T3B, T3E); + T3G = VFNMS(LDK(KP707106781), T3F, T3y); + T6G = VFMA(LDK(KP707106781), T3F, T3y); + T7M = VSUB(T3x, T3w); + T7N = VADD(T3L, T3K); + T7O = VFMA(LDK(KP707106781), T7N, T7M); + T9k = VFNMS(LDK(KP707106781), T7N, T7M); + } + { + V T7P, T7Q, T3J, T3M; + T7P = VADD(T3H, T3I); + T7Q = VADD(T3B, T3E); + T7R = VFMA(LDK(KP707106781), T7Q, T7P); + T9l = VFNMS(LDK(KP707106781), T7Q, T7P); + T3J = VSUB(T3H, T3I); + T3M = VSUB(T3K, T3L); + T3N = VFNMS(LDK(KP707106781), T3M, T3J); + T6H = VFMA(LDK(KP707106781), T3M, T3J); + } + } + { + V T1z, T5I, T56, Tb8, T1C, T53, T5L, Tb9, T1J, Tbq, T5h, T5N, T1G, Tbp, T5c; + V T5O; + { + V T1x, T1y, T5J, T5K; + T1x = LD(&(ri[WS(is, 63)]), ivs, &(ri[WS(is, 1)])); + T1y = LD(&(ri[WS(is, 31)]), ivs, &(ri[WS(is, 1)])); + T1z = VADD(T1x, T1y); + T5I = VSUB(T1x, T1y); + { + V T54, T55, T1A, T1B; + T54 = LD(&(ii[WS(is, 63)]), ivs, &(ii[WS(is, 1)])); + T55 = LD(&(ii[WS(is, 31)]), ivs, &(ii[WS(is, 1)])); + T56 = VSUB(T54, T55); + Tb8 = VADD(T54, T55); + T1A = LD(&(ri[WS(is, 15)]), ivs, &(ri[WS(is, 1)])); + T1B = LD(&(ri[WS(is, 47)]), ivs, &(ri[WS(is, 1)])); + T1C = VADD(T1A, T1B); + T53 = VSUB(T1A, T1B); + } + T5J = LD(&(ii[WS(is, 15)]), ivs, &(ii[WS(is, 1)])); + T5K = LD(&(ii[WS(is, 47)]), ivs, &(ii[WS(is, 1)])); + T5L = VSUB(T5J, T5K); + Tb9 = VADD(T5J, T5K); + { + V T1H, T1I, T5d, T5e, T5f, T5g; + T1H = LD(&(ri[WS(is, 55)]), ivs, &(ri[WS(is, 1)])); + T1I = LD(&(ri[WS(is, 23)]), ivs, &(ri[WS(is, 1)])); + T5d = VSUB(T1H, T1I); + T5e = LD(&(ii[WS(is, 55)]), ivs, &(ii[WS(is, 1)])); + T5f = LD(&(ii[WS(is, 23)]), ivs, &(ii[WS(is, 1)])); + T5g = VSUB(T5e, T5f); + T1J = VADD(T1H, T1I); + Tbq = VADD(T5e, T5f); + T5h = VSUB(T5d, T5g); + T5N = VADD(T5d, T5g); + } + { + V T1E, T1F, T58, T59, T5a, T5b; + T1E = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + T1F = LD(&(ri[WS(is, 39)]), ivs, &(ri[WS(is, 1)])); + T58 = VSUB(T1E, T1F); + T59 = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + T5a = LD(&(ii[WS(is, 39)]), ivs, &(ii[WS(is, 1)])); + T5b = VSUB(T59, T5a); + T1G = VADD(T1E, T1F); + Tbp = VADD(T59, T5a); + T5c = VADD(T58, T5b); + T5O = VSUB(T5b, T58); + } + } + { + V T1D, T1K, Tbo, Tbr; + T1D = VADD(T1z, T1C); + T1K = VADD(T1G, T1J); + T1L = VADD(T1D, T1K); + TdA = VSUB(T1D, T1K); + Tbo = VSUB(T1z, T1C); + Tbr = VSUB(Tbp, Tbq); + Tbs = VADD(Tbo, Tbr); + Tct = VSUB(Tbo, Tbr); + } + { + V Tdv, Tdw, T57, T5i; + Tdv = VADD(Tb8, Tb9); + Tdw = VADD(Tbp, Tbq); + Tdx = VSUB(Tdv, Tdw); + Teo = VADD(Tdv, Tdw); + T57 = VADD(T53, T56); + T5i = VSUB(T5c, T5h); + T5j = VFNMS(LDK(KP707106781), T5i, T57); + T6Y = VFMA(LDK(KP707106781), T5i, T57); + } + { + V T5M, T5P, T8w, T8x; + T5M = VSUB(T5I, T5L); + T5P = VSUB(T5N, T5O); + T5Q = VFNMS(LDK(KP707106781), T5P, T5M); + T6V = VFMA(LDK(KP707106781), T5P, T5M); + T8w = VADD(T5I, T5L); + T8x = VADD(T5c, T5h); + T8y = VFMA(LDK(KP707106781), T8x, T8w); + T9z = VFNMS(LDK(KP707106781), T8x, T8w); + } + { + V Tb7, Tba, T8l, T8m; + Tb7 = VSUB(T1J, T1G); + Tba = VSUB(Tb8, Tb9); + Tbb = VADD(Tb7, Tba); + Tcw = VSUB(Tba, Tb7); + T8l = VSUB(T56, T53); + T8m = VADD(T5O, T5N); + T8n = VFMA(LDK(KP707106781), T8m, T8l); + T9C = VFNMS(LDK(KP707106781), T8m, T8l); + } + } + { + V TN, T40, T2Q, T3Q, TQ, T3P, T2T, T41, TX, T43, T30, T3X, TU, T44, T2X; + V T3U; + { + V TL, TM, T2R, T2S; + TL = LD(&(ri[WS(is, 62)]), ivs, &(ri[0])); + TM = LD(&(ri[WS(is, 30)]), ivs, &(ri[0])); + TN = VADD(TL, TM); + T40 = VSUB(TL, TM); + { + V T2O, T2P, TO, TP; + T2O = LD(&(ii[WS(is, 62)]), ivs, &(ii[0])); + T2P = LD(&(ii[WS(is, 30)]), ivs, &(ii[0])); + T2Q = VADD(T2O, T2P); + T3Q = VSUB(T2O, T2P); + TO = LD(&(ri[WS(is, 14)]), ivs, &(ri[0])); + TP = LD(&(ri[WS(is, 46)]), ivs, &(ri[0])); + TQ = VADD(TO, TP); + T3P = VSUB(TO, TP); + } + T2R = LD(&(ii[WS(is, 14)]), ivs, &(ii[0])); + T2S = LD(&(ii[WS(is, 46)]), ivs, &(ii[0])); + T2T = VADD(T2R, T2S); + T41 = VSUB(T2R, T2S); + { + V TV, TW, T3V, T2Y, T2Z, T3W; + TV = LD(&(ri[WS(is, 54)]), ivs, &(ri[0])); + TW = LD(&(ri[WS(is, 22)]), ivs, &(ri[0])); + T3V = VSUB(TV, TW); + T2Y = LD(&(ii[WS(is, 54)]), ivs, &(ii[0])); + T2Z = LD(&(ii[WS(is, 22)]), ivs, &(ii[0])); + T3W = VSUB(T2Y, T2Z); + TX = VADD(TV, TW); + T43 = VADD(T3V, T3W); + T30 = VADD(T2Y, T2Z); + T3X = VSUB(T3V, T3W); + } + { + V TS, TT, T3S, T2V, T2W, T3T; + TS = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + TT = LD(&(ri[WS(is, 38)]), ivs, &(ri[0])); + T3S = VSUB(TS, TT); + T2V = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + T2W = LD(&(ii[WS(is, 38)]), ivs, &(ii[0])); + T3T = VSUB(T2V, T2W); + TU = VADD(TS, TT); + T44 = VSUB(T3T, T3S); + T2X = VADD(T2V, T2W); + T3U = VADD(T3S, T3T); + } + } + { + V TR, TY, Tax, Tay; + TR = VADD(TN, TQ); + TY = VADD(TU, TX); + TZ = VADD(TR, TY); + Tdf = VSUB(TR, TY); + Tax = VSUB(TX, TU); + Tay = VSUB(T2Q, T2T); + Taz = VADD(Tax, Tay); + Tch = VSUB(Tay, Tax); + } + { + V TaA, TaB, T2U, T31; + TaA = VSUB(TN, TQ); + TaB = VSUB(T2X, T30); + TaC = VADD(TaA, TaB); + Tci = VSUB(TaA, TaB); + T2U = VADD(T2Q, T2T); + T31 = VADD(T2X, T30); + T32 = VADD(T2U, T31); + Tdg = VSUB(T2U, T31); + } + { + V T3R, T3Y, T7T, T7U; + T3R = VADD(T3P, T3Q); + T3Y = VSUB(T3U, T3X); + T3Z = VFNMS(LDK(KP707106781), T3Y, T3R); + T6J = VFMA(LDK(KP707106781), T3Y, T3R); + T7T = VSUB(T3Q, T3P); + T7U = VADD(T44, T43); + T7V = VFMA(LDK(KP707106781), T7U, T7T); + T9n = VFNMS(LDK(KP707106781), T7U, T7T); + } + { + V T7W, T7X, T42, T45; + T7W = VADD(T40, T41); + T7X = VADD(T3U, T3X); + T7Y = VFMA(LDK(KP707106781), T7X, T7W); + T9o = VFNMS(LDK(KP707106781), T7X, T7W); + T42 = VSUB(T40, T41); + T45 = VSUB(T43, T44); + T46 = VFNMS(LDK(KP707106781), T45, T42); + T6K = VFMA(LDK(KP707106781), T45, T42); + } + } + { + V T14, T4P, T4d, TaH, T17, T4a, T4S, TaI, T1e, TaZ, T4o, T4U, T1b, TaY, T4j; + V T4V; + { + V T12, T13, T4Q, T4R; + T12 = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + T13 = LD(&(ri[WS(is, 33)]), ivs, &(ri[WS(is, 1)])); + T14 = VADD(T12, T13); + T4P = VSUB(T12, T13); + { + V T4b, T4c, T15, T16; + T4b = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + T4c = LD(&(ii[WS(is, 33)]), ivs, &(ii[WS(is, 1)])); + T4d = VSUB(T4b, T4c); + TaH = VADD(T4b, T4c); + T15 = LD(&(ri[WS(is, 17)]), ivs, &(ri[WS(is, 1)])); + T16 = LD(&(ri[WS(is, 49)]), ivs, &(ri[WS(is, 1)])); + T17 = VADD(T15, T16); + T4a = VSUB(T15, T16); + } + T4Q = LD(&(ii[WS(is, 17)]), ivs, &(ii[WS(is, 1)])); + T4R = LD(&(ii[WS(is, 49)]), ivs, &(ii[WS(is, 1)])); + T4S = VSUB(T4Q, T4R); + TaI = VADD(T4Q, T4R); + { + V T1c, T1d, T4k, T4l, T4m, T4n; + T1c = LD(&(ri[WS(is, 57)]), ivs, &(ri[WS(is, 1)])); + T1d = LD(&(ri[WS(is, 25)]), ivs, &(ri[WS(is, 1)])); + T4k = VSUB(T1c, T1d); + T4l = LD(&(ii[WS(is, 57)]), ivs, &(ii[WS(is, 1)])); + T4m = LD(&(ii[WS(is, 25)]), ivs, &(ii[WS(is, 1)])); + T4n = VSUB(T4l, T4m); + T1e = VADD(T1c, T1d); + TaZ = VADD(T4l, T4m); + T4o = VSUB(T4k, T4n); + T4U = VADD(T4k, T4n); + } + { + V T19, T1a, T4f, T4g, T4h, T4i; + T19 = LD(&(ri[WS(is, 9)]), ivs, &(ri[WS(is, 1)])); + T1a = LD(&(ri[WS(is, 41)]), ivs, &(ri[WS(is, 1)])); + T4f = VSUB(T19, T1a); + T4g = LD(&(ii[WS(is, 9)]), ivs, &(ii[WS(is, 1)])); + T4h = LD(&(ii[WS(is, 41)]), ivs, &(ii[WS(is, 1)])); + T4i = VSUB(T4g, T4h); + T1b = VADD(T19, T1a); + TaY = VADD(T4g, T4h); + T4j = VADD(T4f, T4i); + T4V = VSUB(T4i, T4f); + } + } + { + V T18, T1f, TaX, Tb0; + T18 = VADD(T14, T17); + T1f = VADD(T1b, T1e); + T1g = VADD(T18, T1f); + Tdp = VSUB(T18, T1f); + TaX = VSUB(T14, T17); + Tb0 = VSUB(TaY, TaZ); + Tb1 = VADD(TaX, Tb0); + Tcm = VSUB(TaX, Tb0); + } + { + V Tdk, Tdl, T4e, T4p; + Tdk = VADD(TaH, TaI); + Tdl = VADD(TaY, TaZ); + Tdm = VSUB(Tdk, Tdl); + Tej = VADD(Tdk, Tdl); + T4e = VADD(T4a, T4d); + T4p = VSUB(T4j, T4o); + T4q = VFNMS(LDK(KP707106781), T4p, T4e); + T6R = VFMA(LDK(KP707106781), T4p, T4e); + } + { + V T4T, T4W, T8d, T8e; + T4T = VSUB(T4P, T4S); + T4W = VSUB(T4U, T4V); + T4X = VFNMS(LDK(KP707106781), T4W, T4T); + T6O = VFMA(LDK(KP707106781), T4W, T4T); + T8d = VADD(T4P, T4S); + T8e = VADD(T4j, T4o); + T8f = VFMA(LDK(KP707106781), T8e, T8d); + T9s = VFNMS(LDK(KP707106781), T8e, T8d); + } + { + V TaG, TaJ, T82, T83; + TaG = VSUB(T1e, T1b); + TaJ = VSUB(TaH, TaI); + TaK = VADD(TaG, TaJ); + Tcp = VSUB(TaJ, TaG); + T82 = VSUB(T4d, T4a); + T83 = VADD(T4V, T4U); + T84 = VFMA(LDK(KP707106781), T83, T82); + T9v = VFNMS(LDK(KP707106781), T83, T82); + } + } + { + V T1j, TaL, T1m, TaM, T4G, T4L, TaO, TaN, T86, T85, T1q, TaR, T1t, TaS, T4v; + V T4A, TaT, TaQ, T89, T88; + { + V T4C, T4K, T4H, T4F; + { + V T1h, T1i, T4I, T4J; + T1h = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + T1i = LD(&(ri[WS(is, 37)]), ivs, &(ri[WS(is, 1)])); + T1j = VADD(T1h, T1i); + T4C = VSUB(T1h, T1i); + T4I = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + T4J = LD(&(ii[WS(is, 37)]), ivs, &(ii[WS(is, 1)])); + T4K = VSUB(T4I, T4J); + TaL = VADD(T4I, T4J); + } + { + V T1k, T1l, T4D, T4E; + T1k = LD(&(ri[WS(is, 21)]), ivs, &(ri[WS(is, 1)])); + T1l = LD(&(ri[WS(is, 53)]), ivs, &(ri[WS(is, 1)])); + T1m = VADD(T1k, T1l); + T4H = VSUB(T1k, T1l); + T4D = LD(&(ii[WS(is, 21)]), ivs, &(ii[WS(is, 1)])); + T4E = LD(&(ii[WS(is, 53)]), ivs, &(ii[WS(is, 1)])); + T4F = VSUB(T4D, T4E); + TaM = VADD(T4D, T4E); + } + T4G = VSUB(T4C, T4F); + T4L = VADD(T4H, T4K); + TaO = VSUB(T1j, T1m); + TaN = VSUB(TaL, TaM); + T86 = VADD(T4C, T4F); + T85 = VSUB(T4K, T4H); + } + { + V T4r, T4z, T4w, T4u; + { + V T1o, T1p, T4x, T4y; + T1o = LD(&(ri[WS(is, 61)]), ivs, &(ri[WS(is, 1)])); + T1p = LD(&(ri[WS(is, 29)]), ivs, &(ri[WS(is, 1)])); + T1q = VADD(T1o, T1p); + T4r = VSUB(T1o, T1p); + T4x = LD(&(ii[WS(is, 61)]), ivs, &(ii[WS(is, 1)])); + T4y = LD(&(ii[WS(is, 29)]), ivs, &(ii[WS(is, 1)])); + T4z = VSUB(T4x, T4y); + TaR = VADD(T4x, T4y); + } + { + V T1r, T1s, T4s, T4t; + T1r = LD(&(ri[WS(is, 13)]), ivs, &(ri[WS(is, 1)])); + T1s = LD(&(ri[WS(is, 45)]), ivs, &(ri[WS(is, 1)])); + T1t = VADD(T1r, T1s); + T4w = VSUB(T1r, T1s); + T4s = LD(&(ii[WS(is, 13)]), ivs, &(ii[WS(is, 1)])); + T4t = LD(&(ii[WS(is, 45)]), ivs, &(ii[WS(is, 1)])); + T4u = VSUB(T4s, T4t); + TaS = VADD(T4s, T4t); + } + T4v = VSUB(T4r, T4u); + T4A = VADD(T4w, T4z); + TaT = VSUB(TaR, TaS); + TaQ = VSUB(T1q, T1t); + T89 = VADD(T4r, T4u); + T88 = VSUB(T4z, T4w); + } + { + V T1n, T1u, Tb2, Tb3; + T1n = VADD(T1j, T1m); + T1u = VADD(T1q, T1t); + T1v = VADD(T1n, T1u); + Tdn = VSUB(T1u, T1n); + Tb2 = VADD(TaO, TaN); + Tb3 = VSUB(TaQ, TaT); + Tb4 = VADD(Tb2, Tb3); + Tcq = VSUB(Tb2, Tb3); + } + { + V Tdq, Tdr, T4B, T4M; + Tdq = VADD(TaL, TaM); + Tdr = VADD(TaR, TaS); + Tds = VSUB(Tdq, Tdr); + Tek = VADD(Tdq, Tdr); + T4B = VFMA(LDK(KP414213562), T4A, T4v); + T4M = VFNMS(LDK(KP414213562), T4L, T4G); + T4N = VSUB(T4B, T4M); + T6P = VADD(T4M, T4B); + } + { + V T4Y, T4Z, T8g, T8h; + T4Y = VFMA(LDK(KP414213562), T4G, T4L); + T4Z = VFNMS(LDK(KP414213562), T4v, T4A); + T50 = VSUB(T4Y, T4Z); + T6S = VADD(T4Y, T4Z); + T8g = VFMA(LDK(KP414213562), T85, T86); + T8h = VFNMS(LDK(KP414213562), T88, T89); + T8i = VADD(T8g, T8h); + T9w = VSUB(T8g, T8h); + } + { + V TaP, TaU, T87, T8a; + TaP = VSUB(TaN, TaO); + TaU = VADD(TaQ, TaT); + TaV = VADD(TaP, TaU); + Tcn = VSUB(TaU, TaP); + T87 = VFNMS(LDK(KP414213562), T86, T85); + T8a = VFMA(LDK(KP414213562), T89, T88); + T8b = VADD(T87, T8a); + T9t = VSUB(T8a, T87); + } + } + { + V T1O, Tbc, T1R, Tbd, T5z, T5E, Tbf, Tbe, T8p, T8o, T1V, Tbi, T1Y, Tbj, T5o; + V T5t, Tbk, Tbh, T8s, T8r; + { + V T5v, T5D, T5A, T5y; + { + V T1M, T1N, T5B, T5C; + T1M = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + T1N = LD(&(ri[WS(is, 35)]), ivs, &(ri[WS(is, 1)])); + T1O = VADD(T1M, T1N); + T5v = VSUB(T1M, T1N); + T5B = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + T5C = LD(&(ii[WS(is, 35)]), ivs, &(ii[WS(is, 1)])); + T5D = VSUB(T5B, T5C); + Tbc = VADD(T5B, T5C); + } + { + V T1P, T1Q, T5w, T5x; + T1P = LD(&(ri[WS(is, 19)]), ivs, &(ri[WS(is, 1)])); + T1Q = LD(&(ri[WS(is, 51)]), ivs, &(ri[WS(is, 1)])); + T1R = VADD(T1P, T1Q); + T5A = VSUB(T1P, T1Q); + T5w = LD(&(ii[WS(is, 19)]), ivs, &(ii[WS(is, 1)])); + T5x = LD(&(ii[WS(is, 51)]), ivs, &(ii[WS(is, 1)])); + T5y = VSUB(T5w, T5x); + Tbd = VADD(T5w, T5x); + } + T5z = VSUB(T5v, T5y); + T5E = VADD(T5A, T5D); + Tbf = VSUB(T1O, T1R); + Tbe = VSUB(Tbc, Tbd); + T8p = VADD(T5v, T5y); + T8o = VSUB(T5D, T5A); + } + { + V T5k, T5s, T5p, T5n; + { + V T1T, T1U, T5q, T5r; + T1T = LD(&(ri[WS(is, 59)]), ivs, &(ri[WS(is, 1)])); + T1U = LD(&(ri[WS(is, 27)]), ivs, &(ri[WS(is, 1)])); + T1V = VADD(T1T, T1U); + T5k = VSUB(T1T, T1U); + T5q = LD(&(ii[WS(is, 59)]), ivs, &(ii[WS(is, 1)])); + T5r = LD(&(ii[WS(is, 27)]), ivs, &(ii[WS(is, 1)])); + T5s = VSUB(T5q, T5r); + Tbi = VADD(T5q, T5r); + } + { + V T1W, T1X, T5l, T5m; + T1W = LD(&(ri[WS(is, 11)]), ivs, &(ri[WS(is, 1)])); + T1X = LD(&(ri[WS(is, 43)]), ivs, &(ri[WS(is, 1)])); + T1Y = VADD(T1W, T1X); + T5p = VSUB(T1W, T1X); + T5l = LD(&(ii[WS(is, 11)]), ivs, &(ii[WS(is, 1)])); + T5m = LD(&(ii[WS(is, 43)]), ivs, &(ii[WS(is, 1)])); + T5n = VSUB(T5l, T5m); + Tbj = VADD(T5l, T5m); + } + T5o = VSUB(T5k, T5n); + T5t = VADD(T5p, T5s); + Tbk = VSUB(Tbi, Tbj); + Tbh = VSUB(T1V, T1Y); + T8s = VADD(T5k, T5n); + T8r = VSUB(T5s, T5p); + } + { + V T1S, T1Z, Tbt, Tbu; + T1S = VADD(T1O, T1R); + T1Z = VADD(T1V, T1Y); + T20 = VADD(T1S, T1Z); + Tdy = VSUB(T1Z, T1S); + Tbt = VADD(Tbf, Tbe); + Tbu = VSUB(Tbh, Tbk); + Tbv = VADD(Tbt, Tbu); + Tcx = VSUB(Tbt, Tbu); + } + { + V TdB, TdC, T5u, T5F; + TdB = VADD(Tbc, Tbd); + TdC = VADD(Tbi, Tbj); + TdD = VSUB(TdB, TdC); + Tep = VADD(TdB, TdC); + T5u = VFMA(LDK(KP414213562), T5t, T5o); + T5F = VFNMS(LDK(KP414213562), T5E, T5z); + T5G = VSUB(T5u, T5F); + T6W = VADD(T5F, T5u); + } + { + V T5R, T5S, T8z, T8A; + T5R = VFMA(LDK(KP414213562), T5z, T5E); + T5S = VFNMS(LDK(KP414213562), T5o, T5t); + T5T = VSUB(T5R, T5S); + T6Z = VADD(T5R, T5S); + T8z = VFMA(LDK(KP414213562), T8o, T8p); + T8A = VFNMS(LDK(KP414213562), T8r, T8s); + T8B = VADD(T8z, T8A); + T9D = VSUB(T8z, T8A); + } + { + V Tbg, Tbl, T8q, T8t; + Tbg = VSUB(Tbe, Tbf); + Tbl = VADD(Tbh, Tbk); + Tbm = VADD(Tbg, Tbl); + Tcu = VSUB(Tbl, Tbg); + T8q = VFNMS(LDK(KP414213562), T8p, T8o); + T8t = VFMA(LDK(KP414213562), T8s, T8r); + T8u = VADD(T8q, T8t); + T9A = VSUB(T8t, T8q); + } + } + { + V TeJ, TeK, TeL, TeM, TeN, TeO, TeP, TeQ, TeR, TeS, TeT, TeU, TeV, TeW, TeX; + V TeY, TeZ, Tf0, Tf1, Tf2, Tf3, Tf4, Tf5, Tf6, Tf7, Tf8, Tf9, Tfa, Tfb, Tfc; + V Tfd, Tfe, Tff, Tfg, Tfh, Tfi, Tfj, Tfk, Tfl, Tfm, Tfn, Tfo, Tfp, Tfq, Tfr; + V Tfs, Tft, Tfu; + { + V T11, TeD, TeG, TeI, T22, T23, T34, TeH; + { + V Tv, T10, TeE, TeF; + Tv = VADD(Tf, Tu); + T10 = VADD(TK, TZ); + T11 = VADD(Tv, T10); + TeD = VSUB(Tv, T10); + TeE = VADD(Tej, Tek); + TeF = VADD(Teo, Tep); + TeG = VSUB(TeE, TeF); + TeI = VADD(TeE, TeF); + } + { + V T1w, T21, T2y, T33; + T1w = VADD(T1g, T1v); + T21 = VADD(T1L, T20); + T22 = VADD(T1w, T21); + T23 = VSUB(T21, T1w); + T2y = VADD(T2i, T2x); + T33 = VADD(T2N, T32); + T34 = VSUB(T2y, T33); + TeH = VADD(T2y, T33); + } + TeJ = VSUB(T11, T22); + STM4(&(ro[32]), TeJ, ovs, &(ro[0])); + TeK = VSUB(TeH, TeI); + STM4(&(io[32]), TeK, ovs, &(io[0])); + TeL = VADD(T11, T22); + STM4(&(ro[0]), TeL, ovs, &(ro[0])); + TeM = VADD(TeH, TeI); + STM4(&(io[0]), TeM, ovs, &(io[0])); + TeN = VADD(T23, T34); + STM4(&(io[16]), TeN, ovs, &(io[0])); + TeO = VADD(TeD, TeG); + STM4(&(ro[16]), TeO, ovs, &(ro[0])); + TeP = VSUB(T34, T23); + STM4(&(io[48]), TeP, ovs, &(io[0])); + TeQ = VSUB(TeD, TeG); + STM4(&(ro[48]), TeQ, ovs, &(ro[0])); + } + { + V Teh, Tex, Tev, TeB, Tem, Tey, Ter, Tez; + { + V Tef, Teg, Tet, Teu; + Tef = VSUB(Tf, Tu); + Teg = VSUB(T2N, T32); + Teh = VADD(Tef, Teg); + Tex = VSUB(Tef, Teg); + Tet = VSUB(T2i, T2x); + Teu = VSUB(TZ, TK); + Tev = VSUB(Tet, Teu); + TeB = VADD(Teu, Tet); + } + { + V Tei, Tel, Ten, Teq; + Tei = VSUB(T1g, T1v); + Tel = VSUB(Tej, Tek); + Tem = VADD(Tei, Tel); + Tey = VSUB(Tel, Tei); + Ten = VSUB(T1L, T20); + Teq = VSUB(Teo, Tep); + Ter = VSUB(Ten, Teq); + Tez = VADD(Ten, Teq); + } + { + V Tes, TeC, Tew, TeA; + Tes = VADD(Tem, Ter); + TeR = VFNMS(LDK(KP707106781), Tes, Teh); + STM4(&(ro[40]), TeR, ovs, &(ro[0])); + TeS = VFMA(LDK(KP707106781), Tes, Teh); + STM4(&(ro[8]), TeS, ovs, &(ro[0])); + TeC = VADD(Tey, Tez); + TeT = VFNMS(LDK(KP707106781), TeC, TeB); + STM4(&(io[40]), TeT, ovs, &(io[0])); + TeU = VFMA(LDK(KP707106781), TeC, TeB); + STM4(&(io[8]), TeU, ovs, &(io[0])); + Tew = VSUB(Ter, Tem); + TeV = VFNMS(LDK(KP707106781), Tew, Tev); + STM4(&(io[56]), TeV, ovs, &(io[0])); + TeW = VFMA(LDK(KP707106781), Tew, Tev); + STM4(&(io[24]), TeW, ovs, &(io[0])); + TeA = VSUB(Tey, Tez); + TeX = VFNMS(LDK(KP707106781), TeA, Tex); + STM4(&(ro[56]), TeX, ovs, &(ro[0])); + TeY = VFMA(LDK(KP707106781), TeA, Tex); + STM4(&(ro[24]), TeY, ovs, &(ro[0])); + } + } + { + V Tdb, TdV, Te5, TdJ, Tdi, Te6, Te3, Teb, TdM, TdW, Tdu, TdR, Te0, Tea, TdF; + V TdQ; + { + V Tde, Tdh, Tdo, Tdt; + Tdb = VSUB(Td9, Tda); + TdV = VADD(Td9, Tda); + Te5 = VADD(TdI, TdH); + TdJ = VSUB(TdH, TdI); + Tde = VSUB(Tdc, Tdd); + Tdh = VADD(Tdf, Tdg); + Tdi = VSUB(Tde, Tdh); + Te6 = VADD(Tde, Tdh); + { + V Te1, Te2, TdK, TdL; + Te1 = VADD(TdA, TdD); + Te2 = VADD(Tdy, Tdx); + Te3 = VFNMS(LDK(KP414213562), Te2, Te1); + Teb = VFMA(LDK(KP414213562), Te1, Te2); + TdK = VSUB(Tdf, Tdg); + TdL = VADD(Tdd, Tdc); + TdM = VSUB(TdK, TdL); + TdW = VADD(TdL, TdK); + } + Tdo = VSUB(Tdm, Tdn); + Tdt = VSUB(Tdp, Tds); + Tdu = VFMA(LDK(KP414213562), Tdt, Tdo); + TdR = VFNMS(LDK(KP414213562), Tdo, Tdt); + { + V TdY, TdZ, Tdz, TdE; + TdY = VADD(Tdp, Tds); + TdZ = VADD(Tdn, Tdm); + Te0 = VFMA(LDK(KP414213562), TdZ, TdY); + Tea = VFNMS(LDK(KP414213562), TdY, TdZ); + Tdz = VSUB(Tdx, Tdy); + TdE = VSUB(TdA, TdD); + TdF = VFNMS(LDK(KP414213562), TdE, Tdz); + TdQ = VFMA(LDK(KP414213562), Tdz, TdE); + } + } + { + V Tdj, TdG, TdP, TdS; + Tdj = VFMA(LDK(KP707106781), Tdi, Tdb); + TdG = VSUB(Tdu, TdF); + TeZ = VFNMS(LDK(KP923879532), TdG, Tdj); + STM4(&(ro[44]), TeZ, ovs, &(ro[0])); + Tf0 = VFMA(LDK(KP923879532), TdG, Tdj); + STM4(&(ro[12]), Tf0, ovs, &(ro[0])); + TdP = VFMA(LDK(KP707106781), TdM, TdJ); + TdS = VSUB(TdQ, TdR); + Tf1 = VFNMS(LDK(KP923879532), TdS, TdP); + STM4(&(io[44]), Tf1, ovs, &(io[0])); + Tf2 = VFMA(LDK(KP923879532), TdS, TdP); + STM4(&(io[12]), Tf2, ovs, &(io[0])); + } + { + V TdN, TdO, TdT, TdU; + TdN = VFNMS(LDK(KP707106781), TdM, TdJ); + TdO = VADD(Tdu, TdF); + Tf3 = VFNMS(LDK(KP923879532), TdO, TdN); + STM4(&(io[28]), Tf3, ovs, &(io[0])); + Tf4 = VFMA(LDK(KP923879532), TdO, TdN); + STM4(&(io[60]), Tf4, ovs, &(io[0])); + TdT = VFNMS(LDK(KP707106781), Tdi, Tdb); + TdU = VADD(TdR, TdQ); + Tf5 = VFNMS(LDK(KP923879532), TdU, TdT); + STM4(&(ro[28]), Tf5, ovs, &(ro[0])); + Tf6 = VFMA(LDK(KP923879532), TdU, TdT); + STM4(&(ro[60]), Tf6, ovs, &(ro[0])); + } + { + V TdX, Te4, Ted, Tee; + TdX = VFMA(LDK(KP707106781), TdW, TdV); + Te4 = VADD(Te0, Te3); + Tf7 = VFNMS(LDK(KP923879532), Te4, TdX); + STM4(&(ro[36]), Tf7, ovs, &(ro[0])); + Tf8 = VFMA(LDK(KP923879532), Te4, TdX); + STM4(&(ro[4]), Tf8, ovs, &(ro[0])); + Ted = VFMA(LDK(KP707106781), Te6, Te5); + Tee = VADD(Tea, Teb); + Tf9 = VFNMS(LDK(KP923879532), Tee, Ted); + STM4(&(io[36]), Tf9, ovs, &(io[0])); + Tfa = VFMA(LDK(KP923879532), Tee, Ted); + STM4(&(io[4]), Tfa, ovs, &(io[0])); + } + { + V Te7, Te8, Te9, Tec; + Te7 = VFNMS(LDK(KP707106781), Te6, Te5); + Te8 = VSUB(Te3, Te0); + Tfb = VFNMS(LDK(KP923879532), Te8, Te7); + STM4(&(io[52]), Tfb, ovs, &(io[0])); + Tfc = VFMA(LDK(KP923879532), Te8, Te7); + STM4(&(io[20]), Tfc, ovs, &(io[0])); + Te9 = VFNMS(LDK(KP707106781), TdW, TdV); + Tec = VSUB(Tea, Teb); + Tfd = VFNMS(LDK(KP923879532), Tec, Te9); + STM4(&(ro[52]), Tfd, ovs, &(ro[0])); + Tfe = VFMA(LDK(KP923879532), Tec, Te9); + STM4(&(ro[20]), Tfe, ovs, &(ro[0])); + } + } + { + V Tcd, TcP, TcD, TcZ, Tck, Td0, TcX, Td4, Tcs, TcK, TcG, TcQ, TcU, Td5, Tcz; + V TcL, Tcc, TcC; + Tcc = VSUB(TbC, TbD); + Tcd = VFMA(LDK(KP707106781), Tcc, Tcb); + TcP = VFNMS(LDK(KP707106781), Tcc, Tcb); + TcC = VSUB(Tan, Tak); + TcD = VFMA(LDK(KP707106781), TcC, TcB); + TcZ = VFNMS(LDK(KP707106781), TcC, TcB); + { + V Tcg, Tcj, TcV, TcW; + Tcg = VFMA(LDK(KP414213562), Tcf, Tce); + Tcj = VFNMS(LDK(KP414213562), Tci, Tch); + Tck = VSUB(Tcg, Tcj); + Td0 = VADD(Tcg, Tcj); + TcV = VFMA(LDK(KP707106781), Tcx, Tcw); + TcW = VFMA(LDK(KP707106781), Tcu, Tct); + TcX = VFNMS(LDK(KP198912367), TcW, TcV); + Td4 = VFMA(LDK(KP198912367), TcV, TcW); + } + { + V Tco, Tcr, TcE, TcF; + Tco = VFNMS(LDK(KP707106781), Tcn, Tcm); + Tcr = VFNMS(LDK(KP707106781), Tcq, Tcp); + Tcs = VFMA(LDK(KP668178637), Tcr, Tco); + TcK = VFNMS(LDK(KP668178637), Tco, Tcr); + TcE = VFMA(LDK(KP414213562), Tch, Tci); + TcF = VFNMS(LDK(KP414213562), Tce, Tcf); + TcG = VSUB(TcE, TcF); + TcQ = VADD(TcF, TcE); + } + { + V TcS, TcT, Tcv, Tcy; + TcS = VFMA(LDK(KP707106781), Tcq, Tcp); + TcT = VFMA(LDK(KP707106781), Tcn, Tcm); + TcU = VFMA(LDK(KP198912367), TcT, TcS); + Td5 = VFNMS(LDK(KP198912367), TcS, TcT); + Tcv = VFNMS(LDK(KP707106781), Tcu, Tct); + Tcy = VFNMS(LDK(KP707106781), Tcx, Tcw); + Tcz = VFNMS(LDK(KP668178637), Tcy, Tcv); + TcL = VFMA(LDK(KP668178637), Tcv, Tcy); + } + { + V Tcl, TcA, TcN, TcO; + Tcl = VFMA(LDK(KP923879532), Tck, Tcd); + TcA = VADD(Tcs, Tcz); + Tff = VFNMS(LDK(KP831469612), TcA, Tcl); + STM4(&(ro[38]), Tff, ovs, &(ro[0])); + Tfg = VFMA(LDK(KP831469612), TcA, Tcl); + STM4(&(ro[6]), Tfg, ovs, &(ro[0])); + TcN = VFMA(LDK(KP923879532), TcG, TcD); + TcO = VADD(TcK, TcL); + Tfh = VFNMS(LDK(KP831469612), TcO, TcN); + STM4(&(io[38]), Tfh, ovs, &(io[0])); + Tfi = VFMA(LDK(KP831469612), TcO, TcN); + STM4(&(io[6]), Tfi, ovs, &(io[0])); + } + { + V TcH, TcI, TcJ, TcM; + TcH = VFNMS(LDK(KP923879532), TcG, TcD); + TcI = VSUB(Tcz, Tcs); + Tfj = VFNMS(LDK(KP831469612), TcI, TcH); + STM4(&(io[54]), Tfj, ovs, &(io[0])); + Tfk = VFMA(LDK(KP831469612), TcI, TcH); + STM4(&(io[22]), Tfk, ovs, &(io[0])); + TcJ = VFNMS(LDK(KP923879532), Tck, Tcd); + TcM = VSUB(TcK, TcL); + Tfl = VFNMS(LDK(KP831469612), TcM, TcJ); + STM4(&(ro[54]), Tfl, ovs, &(ro[0])); + Tfm = VFMA(LDK(KP831469612), TcM, TcJ); + STM4(&(ro[22]), Tfm, ovs, &(ro[0])); + } + { + V TcR, TcY, Td3, Td6; + TcR = VFNMS(LDK(KP923879532), TcQ, TcP); + TcY = VSUB(TcU, TcX); + Tfn = VFNMS(LDK(KP980785280), TcY, TcR); + STM4(&(ro[46]), Tfn, ovs, &(ro[0])); + Tfo = VFMA(LDK(KP980785280), TcY, TcR); + STM4(&(ro[14]), Tfo, ovs, &(ro[0])); + Td3 = VFNMS(LDK(KP923879532), Td0, TcZ); + Td6 = VSUB(Td4, Td5); + Tfp = VFNMS(LDK(KP980785280), Td6, Td3); + STM4(&(io[46]), Tfp, ovs, &(io[0])); + Tfq = VFMA(LDK(KP980785280), Td6, Td3); + STM4(&(io[14]), Tfq, ovs, &(io[0])); + } + { + V Td1, Td2, Td7, Td8; + Td1 = VFMA(LDK(KP923879532), Td0, TcZ); + Td2 = VADD(TcU, TcX); + Tfr = VFNMS(LDK(KP980785280), Td2, Td1); + STM4(&(io[30]), Tfr, ovs, &(io[0])); + Tfs = VFMA(LDK(KP980785280), Td2, Td1); + STM4(&(io[62]), Tfs, ovs, &(io[0])); + Td7 = VFMA(LDK(KP923879532), TcQ, TcP); + Td8 = VADD(Td5, Td4); + Tft = VFNMS(LDK(KP980785280), Td8, Td7); + STM4(&(ro[30]), Tft, ovs, &(ro[0])); + Tfu = VFMA(LDK(KP980785280), Td8, Td7); + STM4(&(ro[62]), Tfu, ovs, &(ro[0])); + } + } + { + V Tfv, Tfw, Tfx, Tfy, Tfz, TfA, TfB, TfC, TfD, TfE, TfF, TfG, TfH, TfI, TfJ; + V TfK, TfL, TfM, TfN, TfO, TfP, TfQ, TfR, TfS, TfT, TfU, TfV, TfW, TfX, TfY; + V TfZ, Tg0; + { + V Tap, TbR, TbF, Tc1, TaE, Tc2, TbZ, Tc7, Tb6, TbN, TbI, TbS, TbW, Tc6, Tbx; + V TbM, Tao, TbE; + Tao = VADD(Tak, Tan); + Tap = VFNMS(LDK(KP707106781), Tao, Tah); + TbR = VFMA(LDK(KP707106781), Tao, Tah); + TbE = VADD(TbC, TbD); + TbF = VFNMS(LDK(KP707106781), TbE, TbB); + Tc1 = VFMA(LDK(KP707106781), TbE, TbB); + { + V Taw, TaD, TbX, TbY; + Taw = VFNMS(LDK(KP414213562), Tav, Tas); + TaD = VFMA(LDK(KP414213562), TaC, Taz); + TaE = VSUB(Taw, TaD); + Tc2 = VADD(Taw, TaD); + TbX = VFMA(LDK(KP707106781), Tbv, Tbs); + TbY = VFMA(LDK(KP707106781), Tbm, Tbb); + TbZ = VFNMS(LDK(KP198912367), TbY, TbX); + Tc7 = VFMA(LDK(KP198912367), TbX, TbY); + } + { + V TaW, Tb5, TbG, TbH; + TaW = VFNMS(LDK(KP707106781), TaV, TaK); + Tb5 = VFNMS(LDK(KP707106781), Tb4, Tb1); + Tb6 = VFMA(LDK(KP668178637), Tb5, TaW); + TbN = VFNMS(LDK(KP668178637), TaW, Tb5); + TbG = VFNMS(LDK(KP414213562), Taz, TaC); + TbH = VFMA(LDK(KP414213562), Tas, Tav); + TbI = VSUB(TbG, TbH); + TbS = VADD(TbH, TbG); + } + { + V TbU, TbV, Tbn, Tbw; + TbU = VFMA(LDK(KP707106781), Tb4, Tb1); + TbV = VFMA(LDK(KP707106781), TaV, TaK); + TbW = VFMA(LDK(KP198912367), TbV, TbU); + Tc6 = VFNMS(LDK(KP198912367), TbU, TbV); + Tbn = VFNMS(LDK(KP707106781), Tbm, Tbb); + Tbw = VFNMS(LDK(KP707106781), Tbv, Tbs); + Tbx = VFNMS(LDK(KP668178637), Tbw, Tbn); + TbM = VFMA(LDK(KP668178637), Tbn, Tbw); + } + { + V TaF, Tby, TbL, TbO; + TaF = VFMA(LDK(KP923879532), TaE, Tap); + Tby = VSUB(Tb6, Tbx); + Tfv = VFNMS(LDK(KP831469612), Tby, TaF); + STM4(&(ro[42]), Tfv, ovs, &(ro[0])); + Tfw = VFMA(LDK(KP831469612), Tby, TaF); + STM4(&(ro[10]), Tfw, ovs, &(ro[0])); + TbL = VFMA(LDK(KP923879532), TbI, TbF); + TbO = VSUB(TbM, TbN); + Tfx = VFNMS(LDK(KP831469612), TbO, TbL); + STM4(&(io[42]), Tfx, ovs, &(io[0])); + Tfy = VFMA(LDK(KP831469612), TbO, TbL); + STM4(&(io[10]), Tfy, ovs, &(io[0])); + } + { + V TbJ, TbK, TbP, TbQ; + TbJ = VFNMS(LDK(KP923879532), TbI, TbF); + TbK = VADD(Tb6, Tbx); + Tfz = VFNMS(LDK(KP831469612), TbK, TbJ); + STM4(&(io[26]), Tfz, ovs, &(io[0])); + TfA = VFMA(LDK(KP831469612), TbK, TbJ); + STM4(&(io[58]), TfA, ovs, &(io[0])); + TbP = VFNMS(LDK(KP923879532), TaE, Tap); + TbQ = VADD(TbN, TbM); + TfB = VFNMS(LDK(KP831469612), TbQ, TbP); + STM4(&(ro[26]), TfB, ovs, &(ro[0])); + TfC = VFMA(LDK(KP831469612), TbQ, TbP); + STM4(&(ro[58]), TfC, ovs, &(ro[0])); + } + { + V TbT, Tc0, Tc9, Tca; + TbT = VFMA(LDK(KP923879532), TbS, TbR); + Tc0 = VADD(TbW, TbZ); + TfD = VFNMS(LDK(KP980785280), Tc0, TbT); + STM4(&(ro[34]), TfD, ovs, &(ro[0])); + TfE = VFMA(LDK(KP980785280), Tc0, TbT); + STM4(&(ro[2]), TfE, ovs, &(ro[0])); + Tc9 = VFMA(LDK(KP923879532), Tc2, Tc1); + Tca = VADD(Tc6, Tc7); + TfF = VFNMS(LDK(KP980785280), Tca, Tc9); + STM4(&(io[34]), TfF, ovs, &(io[0])); + TfG = VFMA(LDK(KP980785280), Tca, Tc9); + STM4(&(io[2]), TfG, ovs, &(io[0])); + } + { + V Tc3, Tc4, Tc5, Tc8; + Tc3 = VFNMS(LDK(KP923879532), Tc2, Tc1); + Tc4 = VSUB(TbZ, TbW); + TfH = VFNMS(LDK(KP980785280), Tc4, Tc3); + STM4(&(io[50]), TfH, ovs, &(io[0])); + TfI = VFMA(LDK(KP980785280), Tc4, Tc3); + STM4(&(io[18]), TfI, ovs, &(io[0])); + Tc5 = VFNMS(LDK(KP923879532), TbS, TbR); + Tc8 = VSUB(Tc6, Tc7); + TfJ = VFNMS(LDK(KP980785280), Tc8, Tc5); + STM4(&(ro[50]), TfJ, ovs, &(ro[0])); + TfK = VFMA(LDK(KP980785280), Tc8, Tc5); + STM4(&(ro[18]), TfK, ovs, &(ro[0])); + } + } + { + V T6F, T7h, T7m, T7x, T7p, T7w, T6M, T7s, T6U, T7c, T75, T7r, T78, T7i, T71; + V T7d; + { + V T6D, T6E, T7k, T7l; + T6D = VFNMS(LDK(KP707106781), T3e, T37); + T6E = VADD(T65, T64); + T6F = VFNMS(LDK(KP923879532), T6E, T6D); + T7h = VFMA(LDK(KP923879532), T6E, T6D); + T7k = VFMA(LDK(KP923879532), T6S, T6R); + T7l = VFMA(LDK(KP923879532), T6P, T6O); + T7m = VFMA(LDK(KP098491403), T7l, T7k); + T7x = VFNMS(LDK(KP098491403), T7k, T7l); + } + { + V T7n, T7o, T6I, T6L; + T7n = VFMA(LDK(KP923879532), T6Z, T6Y); + T7o = VFMA(LDK(KP923879532), T6W, T6V); + T7p = VFNMS(LDK(KP098491403), T7o, T7n); + T7w = VFMA(LDK(KP098491403), T7n, T7o); + T6I = VFMA(LDK(KP198912367), T6H, T6G); + T6L = VFNMS(LDK(KP198912367), T6K, T6J); + T6M = VSUB(T6I, T6L); + T7s = VADD(T6I, T6L); + } + { + V T6Q, T6T, T73, T74; + T6Q = VFNMS(LDK(KP923879532), T6P, T6O); + T6T = VFNMS(LDK(KP923879532), T6S, T6R); + T6U = VFMA(LDK(KP820678790), T6T, T6Q); + T7c = VFNMS(LDK(KP820678790), T6Q, T6T); + T73 = VFNMS(LDK(KP707106781), T62, T5Z); + T74 = VADD(T3m, T3t); + T75 = VFNMS(LDK(KP923879532), T74, T73); + T7r = VFMA(LDK(KP923879532), T74, T73); + } + { + V T76, T77, T6X, T70; + T76 = VFMA(LDK(KP198912367), T6J, T6K); + T77 = VFNMS(LDK(KP198912367), T6G, T6H); + T78 = VSUB(T76, T77); + T7i = VADD(T77, T76); + T6X = VFNMS(LDK(KP923879532), T6W, T6V); + T70 = VFNMS(LDK(KP923879532), T6Z, T6Y); + T71 = VFNMS(LDK(KP820678790), T70, T6X); + T7d = VFMA(LDK(KP820678790), T6X, T70); + } + { + V T6N, T72, T7f, T7g; + T6N = VFMA(LDK(KP980785280), T6M, T6F); + T72 = VADD(T6U, T71); + TfL = VFNMS(LDK(KP773010453), T72, T6N); + STM4(&(ro[39]), TfL, ovs, &(ro[1])); + TfM = VFMA(LDK(KP773010453), T72, T6N); + STM4(&(ro[7]), TfM, ovs, &(ro[1])); + T7f = VFMA(LDK(KP980785280), T78, T75); + T7g = VADD(T7c, T7d); + TfN = VFNMS(LDK(KP773010453), T7g, T7f); + STM4(&(io[39]), TfN, ovs, &(io[1])); + TfO = VFMA(LDK(KP773010453), T7g, T7f); + STM4(&(io[7]), TfO, ovs, &(io[1])); + } + { + V T79, T7a, T7b, T7e; + T79 = VFNMS(LDK(KP980785280), T78, T75); + T7a = VSUB(T71, T6U); + TfP = VFNMS(LDK(KP773010453), T7a, T79); + STM4(&(io[55]), TfP, ovs, &(io[1])); + TfQ = VFMA(LDK(KP773010453), T7a, T79); + STM4(&(io[23]), TfQ, ovs, &(io[1])); + T7b = VFNMS(LDK(KP980785280), T6M, T6F); + T7e = VSUB(T7c, T7d); + TfR = VFNMS(LDK(KP773010453), T7e, T7b); + STM4(&(ro[55]), TfR, ovs, &(ro[1])); + TfS = VFMA(LDK(KP773010453), T7e, T7b); + STM4(&(ro[23]), TfS, ovs, &(ro[1])); + } + { + V T7j, T7q, T7v, T7y; + T7j = VFNMS(LDK(KP980785280), T7i, T7h); + T7q = VSUB(T7m, T7p); + TfT = VFNMS(LDK(KP995184726), T7q, T7j); + STM4(&(ro[47]), TfT, ovs, &(ro[1])); + TfU = VFMA(LDK(KP995184726), T7q, T7j); + STM4(&(ro[15]), TfU, ovs, &(ro[1])); + T7v = VFNMS(LDK(KP980785280), T7s, T7r); + T7y = VSUB(T7w, T7x); + TfV = VFNMS(LDK(KP995184726), T7y, T7v); + STM4(&(io[47]), TfV, ovs, &(io[1])); + TfW = VFMA(LDK(KP995184726), T7y, T7v); + STM4(&(io[15]), TfW, ovs, &(io[1])); + } + { + V T7t, T7u, T7z, T7A; + T7t = VFMA(LDK(KP980785280), T7s, T7r); + T7u = VADD(T7m, T7p); + TfX = VFNMS(LDK(KP995184726), T7u, T7t); + STM4(&(io[31]), TfX, ovs, &(io[1])); + TfY = VFMA(LDK(KP995184726), T7u, T7t); + STM4(&(io[63]), TfY, ovs, &(io[1])); + T7z = VFMA(LDK(KP980785280), T7i, T7h); + T7A = VADD(T7x, T7w); + TfZ = VFNMS(LDK(KP995184726), T7A, T7z); + STM4(&(ro[31]), TfZ, ovs, &(ro[1])); + Tg0 = VFMA(LDK(KP995184726), T7A, T7z); + STM4(&(ro[63]), Tg0, ovs, &(ro[1])); + } + } + { + V T9j, T9V, Ta0, Tab, Ta3, Taa, T9q, Ta6, T9y, T9Q, T9J, Ta5, T9M, T9W, T9F; + V T9R; + { + V T9h, T9i, T9Y, T9Z; + T9h = VFNMS(LDK(KP707106781), T7C, T7B); + T9i = VSUB(T8I, T8J); + T9j = VFMA(LDK(KP923879532), T9i, T9h); + T9V = VFNMS(LDK(KP923879532), T9i, T9h); + T9Y = VFMA(LDK(KP923879532), T9w, T9v); + T9Z = VFMA(LDK(KP923879532), T9t, T9s); + Ta0 = VFMA(LDK(KP303346683), T9Z, T9Y); + Tab = VFNMS(LDK(KP303346683), T9Y, T9Z); + } + { + V Ta1, Ta2, T9m, T9p; + Ta1 = VFMA(LDK(KP923879532), T9D, T9C); + Ta2 = VFMA(LDK(KP923879532), T9A, T9z); + Ta3 = VFNMS(LDK(KP303346683), Ta2, Ta1); + Taa = VFMA(LDK(KP303346683), Ta1, Ta2); + T9m = VFMA(LDK(KP668178637), T9l, T9k); + T9p = VFNMS(LDK(KP668178637), T9o, T9n); + T9q = VSUB(T9m, T9p); + Ta6 = VADD(T9m, T9p); + } + { + V T9u, T9x, T9H, T9I; + T9u = VFNMS(LDK(KP923879532), T9t, T9s); + T9x = VFNMS(LDK(KP923879532), T9w, T9v); + T9y = VFMA(LDK(KP534511135), T9x, T9u); + T9Q = VFNMS(LDK(KP534511135), T9u, T9x); + T9H = VFNMS(LDK(KP707106781), T8G, T8F); + T9I = VSUB(T7J, T7G); + T9J = VFMA(LDK(KP923879532), T9I, T9H); + Ta5 = VFNMS(LDK(KP923879532), T9I, T9H); + } + { + V T9K, T9L, T9B, T9E; + T9K = VFMA(LDK(KP668178637), T9n, T9o); + T9L = VFNMS(LDK(KP668178637), T9k, T9l); + T9M = VSUB(T9K, T9L); + T9W = VADD(T9L, T9K); + T9B = VFNMS(LDK(KP923879532), T9A, T9z); + T9E = VFNMS(LDK(KP923879532), T9D, T9C); + T9F = VFNMS(LDK(KP534511135), T9E, T9B); + T9R = VFMA(LDK(KP534511135), T9B, T9E); + } + { + V T9r, T9G, Tg1, Tg2; + T9r = VFMA(LDK(KP831469612), T9q, T9j); + T9G = VADD(T9y, T9F); + Tg1 = VFNMS(LDK(KP881921264), T9G, T9r); + STM4(&(ro[37]), Tg1, ovs, &(ro[1])); + STN4(&(ro[36]), Tf7, Tg1, Tff, TfL, ovs); + Tg2 = VFMA(LDK(KP881921264), T9G, T9r); + STM4(&(ro[5]), Tg2, ovs, &(ro[1])); + STN4(&(ro[4]), Tf8, Tg2, Tfg, TfM, ovs); + } + { + V T9T, T9U, Tg3, Tg4; + T9T = VFMA(LDK(KP831469612), T9M, T9J); + T9U = VADD(T9Q, T9R); + Tg3 = VFNMS(LDK(KP881921264), T9U, T9T); + STM4(&(io[37]), Tg3, ovs, &(io[1])); + STN4(&(io[36]), Tf9, Tg3, Tfh, TfN, ovs); + Tg4 = VFMA(LDK(KP881921264), T9U, T9T); + STM4(&(io[5]), Tg4, ovs, &(io[1])); + STN4(&(io[4]), Tfa, Tg4, Tfi, TfO, ovs); + } + { + V T9N, T9O, Tg5, Tg6; + T9N = VFNMS(LDK(KP831469612), T9M, T9J); + T9O = VSUB(T9F, T9y); + Tg5 = VFNMS(LDK(KP881921264), T9O, T9N); + STM4(&(io[53]), Tg5, ovs, &(io[1])); + STN4(&(io[52]), Tfb, Tg5, Tfj, TfP, ovs); + Tg6 = VFMA(LDK(KP881921264), T9O, T9N); + STM4(&(io[21]), Tg6, ovs, &(io[1])); + STN4(&(io[20]), Tfc, Tg6, Tfk, TfQ, ovs); + } + { + V T9P, T9S, Tg7, Tg8; + T9P = VFNMS(LDK(KP831469612), T9q, T9j); + T9S = VSUB(T9Q, T9R); + Tg7 = VFNMS(LDK(KP881921264), T9S, T9P); + STM4(&(ro[53]), Tg7, ovs, &(ro[1])); + STN4(&(ro[52]), Tfd, Tg7, Tfl, TfR, ovs); + Tg8 = VFMA(LDK(KP881921264), T9S, T9P); + STM4(&(ro[21]), Tg8, ovs, &(ro[1])); + STN4(&(ro[20]), Tfe, Tg8, Tfm, TfS, ovs); + } + { + V T9X, Ta4, Tg9, Tga; + T9X = VFNMS(LDK(KP831469612), T9W, T9V); + Ta4 = VSUB(Ta0, Ta3); + Tg9 = VFNMS(LDK(KP956940335), Ta4, T9X); + STM4(&(ro[45]), Tg9, ovs, &(ro[1])); + STN4(&(ro[44]), TeZ, Tg9, Tfn, TfT, ovs); + Tga = VFMA(LDK(KP956940335), Ta4, T9X); + STM4(&(ro[13]), Tga, ovs, &(ro[1])); + STN4(&(ro[12]), Tf0, Tga, Tfo, TfU, ovs); + } + { + V Ta9, Tac, Tgb, Tgc; + Ta9 = VFNMS(LDK(KP831469612), Ta6, Ta5); + Tac = VSUB(Taa, Tab); + Tgb = VFNMS(LDK(KP956940335), Tac, Ta9); + STM4(&(io[45]), Tgb, ovs, &(io[1])); + STN4(&(io[44]), Tf1, Tgb, Tfp, TfV, ovs); + Tgc = VFMA(LDK(KP956940335), Tac, Ta9); + STM4(&(io[13]), Tgc, ovs, &(io[1])); + STN4(&(io[12]), Tf2, Tgc, Tfq, TfW, ovs); + } + { + V Ta7, Ta8, Tgd, Tge; + Ta7 = VFMA(LDK(KP831469612), Ta6, Ta5); + Ta8 = VADD(Ta0, Ta3); + Tgd = VFNMS(LDK(KP956940335), Ta8, Ta7); + STM4(&(io[29]), Tgd, ovs, &(io[1])); + STN4(&(io[28]), Tf3, Tgd, Tfr, TfX, ovs); + Tge = VFMA(LDK(KP956940335), Ta8, Ta7); + STM4(&(io[61]), Tge, ovs, &(io[1])); + STN4(&(io[60]), Tf4, Tge, Tfs, TfY, ovs); + } + { + V Tad, Tae, Tgf, Tgg; + Tad = VFMA(LDK(KP831469612), T9W, T9V); + Tae = VADD(Tab, Taa); + Tgf = VFNMS(LDK(KP956940335), Tae, Tad); + STM4(&(ro[29]), Tgf, ovs, &(ro[1])); + STN4(&(ro[28]), Tf5, Tgf, Tft, TfZ, ovs); + Tgg = VFMA(LDK(KP956940335), Tae, Tad); + STM4(&(ro[61]), Tgg, ovs, &(ro[1])); + STN4(&(ro[60]), Tf6, Tgg, Tfu, Tg0, ovs); + } + } + { + V Tgh, Tgi, Tgj, Tgk, Tgl, Tgm, Tgn, Tgo, Tgp, Tgq, Tgr, Tgs, Tgt, Tgu, Tgv; + V Tgw; + { + V T3v, T6j, T6o, T6y, T6r, T6z, T48, T6u, T52, T6f, T67, T6t, T6a, T6k, T5V; + V T6e; + { + V T3f, T3u, T6m, T6n; + T3f = VFMA(LDK(KP707106781), T3e, T37); + T3u = VSUB(T3m, T3t); + T3v = VFNMS(LDK(KP923879532), T3u, T3f); + T6j = VFMA(LDK(KP923879532), T3u, T3f); + T6m = VFMA(LDK(KP923879532), T50, T4X); + T6n = VFMA(LDK(KP923879532), T4N, T4q); + T6o = VFMA(LDK(KP303346683), T6n, T6m); + T6y = VFNMS(LDK(KP303346683), T6m, T6n); + } + { + V T6p, T6q, T3O, T47; + T6p = VFMA(LDK(KP923879532), T5T, T5Q); + T6q = VFMA(LDK(KP923879532), T5G, T5j); + T6r = VFNMS(LDK(KP303346683), T6q, T6p); + T6z = VFMA(LDK(KP303346683), T6p, T6q); + T3O = VFNMS(LDK(KP668178637), T3N, T3G); + T47 = VFMA(LDK(KP668178637), T46, T3Z); + T48 = VSUB(T3O, T47); + T6u = VADD(T3O, T47); + } + { + V T4O, T51, T63, T66; + T4O = VFNMS(LDK(KP923879532), T4N, T4q); + T51 = VFNMS(LDK(KP923879532), T50, T4X); + T52 = VFMA(LDK(KP534511135), T51, T4O); + T6f = VFNMS(LDK(KP534511135), T4O, T51); + T63 = VFMA(LDK(KP707106781), T62, T5Z); + T66 = VSUB(T64, T65); + T67 = VFNMS(LDK(KP923879532), T66, T63); + T6t = VFMA(LDK(KP923879532), T66, T63); + } + { + V T68, T69, T5H, T5U; + T68 = VFNMS(LDK(KP668178637), T3Z, T46); + T69 = VFMA(LDK(KP668178637), T3G, T3N); + T6a = VSUB(T68, T69); + T6k = VADD(T69, T68); + T5H = VFNMS(LDK(KP923879532), T5G, T5j); + T5U = VFNMS(LDK(KP923879532), T5T, T5Q); + T5V = VFNMS(LDK(KP534511135), T5U, T5H); + T6e = VFMA(LDK(KP534511135), T5H, T5U); + } + { + V T49, T5W, T6d, T6g; + T49 = VFMA(LDK(KP831469612), T48, T3v); + T5W = VSUB(T52, T5V); + Tgh = VFNMS(LDK(KP881921264), T5W, T49); + STM4(&(ro[43]), Tgh, ovs, &(ro[1])); + Tgi = VFMA(LDK(KP881921264), T5W, T49); + STM4(&(ro[11]), Tgi, ovs, &(ro[1])); + T6d = VFMA(LDK(KP831469612), T6a, T67); + T6g = VSUB(T6e, T6f); + Tgj = VFNMS(LDK(KP881921264), T6g, T6d); + STM4(&(io[43]), Tgj, ovs, &(io[1])); + Tgk = VFMA(LDK(KP881921264), T6g, T6d); + STM4(&(io[11]), Tgk, ovs, &(io[1])); + } + { + V T6b, T6c, T6h, T6i; + T6b = VFNMS(LDK(KP831469612), T6a, T67); + T6c = VADD(T52, T5V); + Tgl = VFNMS(LDK(KP881921264), T6c, T6b); + STM4(&(io[27]), Tgl, ovs, &(io[1])); + Tgm = VFMA(LDK(KP881921264), T6c, T6b); + STM4(&(io[59]), Tgm, ovs, &(io[1])); + T6h = VFNMS(LDK(KP831469612), T48, T3v); + T6i = VADD(T6f, T6e); + Tgn = VFNMS(LDK(KP881921264), T6i, T6h); + STM4(&(ro[27]), Tgn, ovs, &(ro[1])); + Tgo = VFMA(LDK(KP881921264), T6i, T6h); + STM4(&(ro[59]), Tgo, ovs, &(ro[1])); + } + { + V T6l, T6s, T6B, T6C; + T6l = VFMA(LDK(KP831469612), T6k, T6j); + T6s = VADD(T6o, T6r); + Tgp = VFNMS(LDK(KP956940335), T6s, T6l); + STM4(&(ro[35]), Tgp, ovs, &(ro[1])); + Tgq = VFMA(LDK(KP956940335), T6s, T6l); + STM4(&(ro[3]), Tgq, ovs, &(ro[1])); + T6B = VFMA(LDK(KP831469612), T6u, T6t); + T6C = VADD(T6y, T6z); + Tgr = VFNMS(LDK(KP956940335), T6C, T6B); + STM4(&(io[35]), Tgr, ovs, &(io[1])); + Tgs = VFMA(LDK(KP956940335), T6C, T6B); + STM4(&(io[3]), Tgs, ovs, &(io[1])); + } + { + V T6v, T6w, T6x, T6A; + T6v = VFNMS(LDK(KP831469612), T6u, T6t); + T6w = VSUB(T6r, T6o); + Tgt = VFNMS(LDK(KP956940335), T6w, T6v); + STM4(&(io[51]), Tgt, ovs, &(io[1])); + Tgu = VFMA(LDK(KP956940335), T6w, T6v); + STM4(&(io[19]), Tgu, ovs, &(io[1])); + T6x = VFNMS(LDK(KP831469612), T6k, T6j); + T6A = VSUB(T6y, T6z); + Tgv = VFNMS(LDK(KP956940335), T6A, T6x); + STM4(&(ro[51]), Tgv, ovs, &(ro[1])); + Tgw = VFMA(LDK(KP956940335), T6A, T6x); + STM4(&(ro[19]), Tgw, ovs, &(ro[1])); + } + } + { + V T7L, T8X, T92, T9c, T95, T9d, T80, T98, T8k, T8T, T8L, T97, T8O, T8Y, T8D; + V T8S; + { + V T7D, T7K, T90, T91; + T7D = VFMA(LDK(KP707106781), T7C, T7B); + T7K = VADD(T7G, T7J); + T7L = VFNMS(LDK(KP923879532), T7K, T7D); + T8X = VFMA(LDK(KP923879532), T7K, T7D); + T90 = VFMA(LDK(KP923879532), T8i, T8f); + T91 = VFMA(LDK(KP923879532), T8b, T84); + T92 = VFMA(LDK(KP098491403), T91, T90); + T9c = VFNMS(LDK(KP098491403), T90, T91); + } + { + V T93, T94, T7S, T7Z; + T93 = VFMA(LDK(KP923879532), T8B, T8y); + T94 = VFMA(LDK(KP923879532), T8u, T8n); + T95 = VFNMS(LDK(KP098491403), T94, T93); + T9d = VFMA(LDK(KP098491403), T93, T94); + T7S = VFNMS(LDK(KP198912367), T7R, T7O); + T7Z = VFMA(LDK(KP198912367), T7Y, T7V); + T80 = VSUB(T7S, T7Z); + T98 = VADD(T7S, T7Z); + } + { + V T8c, T8j, T8H, T8K; + T8c = VFNMS(LDK(KP923879532), T8b, T84); + T8j = VFNMS(LDK(KP923879532), T8i, T8f); + T8k = VFMA(LDK(KP820678790), T8j, T8c); + T8T = VFNMS(LDK(KP820678790), T8c, T8j); + T8H = VFMA(LDK(KP707106781), T8G, T8F); + T8K = VADD(T8I, T8J); + T8L = VFNMS(LDK(KP923879532), T8K, T8H); + T97 = VFMA(LDK(KP923879532), T8K, T8H); + } + { + V T8M, T8N, T8v, T8C; + T8M = VFNMS(LDK(KP198912367), T7V, T7Y); + T8N = VFMA(LDK(KP198912367), T7O, T7R); + T8O = VSUB(T8M, T8N); + T8Y = VADD(T8N, T8M); + T8v = VFNMS(LDK(KP923879532), T8u, T8n); + T8C = VFNMS(LDK(KP923879532), T8B, T8y); + T8D = VFNMS(LDK(KP820678790), T8C, T8v); + T8S = VFMA(LDK(KP820678790), T8v, T8C); + } + { + V T81, T8E, Tgx, Tgy; + T81 = VFMA(LDK(KP980785280), T80, T7L); + T8E = VSUB(T8k, T8D); + Tgx = VFNMS(LDK(KP773010453), T8E, T81); + STM4(&(ro[41]), Tgx, ovs, &(ro[1])); + STN4(&(ro[40]), TeR, Tgx, Tfv, Tgh, ovs); + Tgy = VFMA(LDK(KP773010453), T8E, T81); + STM4(&(ro[9]), Tgy, ovs, &(ro[1])); + STN4(&(ro[8]), TeS, Tgy, Tfw, Tgi, ovs); + } + { + V T8R, T8U, Tgz, TgA; + T8R = VFMA(LDK(KP980785280), T8O, T8L); + T8U = VSUB(T8S, T8T); + Tgz = VFNMS(LDK(KP773010453), T8U, T8R); + STM4(&(io[41]), Tgz, ovs, &(io[1])); + STN4(&(io[40]), TeT, Tgz, Tfx, Tgj, ovs); + TgA = VFMA(LDK(KP773010453), T8U, T8R); + STM4(&(io[9]), TgA, ovs, &(io[1])); + STN4(&(io[8]), TeU, TgA, Tfy, Tgk, ovs); + } + { + V T8P, T8Q, TgB, TgC; + T8P = VFNMS(LDK(KP980785280), T8O, T8L); + T8Q = VADD(T8k, T8D); + TgB = VFNMS(LDK(KP773010453), T8Q, T8P); + STM4(&(io[25]), TgB, ovs, &(io[1])); + STN4(&(io[24]), TeW, TgB, Tfz, Tgl, ovs); + TgC = VFMA(LDK(KP773010453), T8Q, T8P); + STM4(&(io[57]), TgC, ovs, &(io[1])); + STN4(&(io[56]), TeV, TgC, TfA, Tgm, ovs); + } + { + V T8V, T8W, TgD, TgE; + T8V = VFNMS(LDK(KP980785280), T80, T7L); + T8W = VADD(T8T, T8S); + TgD = VFNMS(LDK(KP773010453), T8W, T8V); + STM4(&(ro[25]), TgD, ovs, &(ro[1])); + STN4(&(ro[24]), TeY, TgD, TfB, Tgn, ovs); + TgE = VFMA(LDK(KP773010453), T8W, T8V); + STM4(&(ro[57]), TgE, ovs, &(ro[1])); + STN4(&(ro[56]), TeX, TgE, TfC, Tgo, ovs); + } + { + V T8Z, T96, TgF, TgG; + T8Z = VFMA(LDK(KP980785280), T8Y, T8X); + T96 = VADD(T92, T95); + TgF = VFNMS(LDK(KP995184726), T96, T8Z); + STM4(&(ro[33]), TgF, ovs, &(ro[1])); + STN4(&(ro[32]), TeJ, TgF, TfD, Tgp, ovs); + TgG = VFMA(LDK(KP995184726), T96, T8Z); + STM4(&(ro[1]), TgG, ovs, &(ro[1])); + STN4(&(ro[0]), TeL, TgG, TfE, Tgq, ovs); + } + { + V T9f, T9g, TgH, TgI; + T9f = VFMA(LDK(KP980785280), T98, T97); + T9g = VADD(T9c, T9d); + TgH = VFNMS(LDK(KP995184726), T9g, T9f); + STM4(&(io[33]), TgH, ovs, &(io[1])); + STN4(&(io[32]), TeK, TgH, TfF, Tgr, ovs); + TgI = VFMA(LDK(KP995184726), T9g, T9f); + STM4(&(io[1]), TgI, ovs, &(io[1])); + STN4(&(io[0]), TeM, TgI, TfG, Tgs, ovs); + } + { + V T99, T9a, TgJ, TgK; + T99 = VFNMS(LDK(KP980785280), T98, T97); + T9a = VSUB(T95, T92); + TgJ = VFNMS(LDK(KP995184726), T9a, T99); + STM4(&(io[49]), TgJ, ovs, &(io[1])); + STN4(&(io[48]), TeP, TgJ, TfH, Tgt, ovs); + TgK = VFMA(LDK(KP995184726), T9a, T99); + STM4(&(io[17]), TgK, ovs, &(io[1])); + STN4(&(io[16]), TeN, TgK, TfI, Tgu, ovs); + } + { + V T9b, T9e, TgL, TgM; + T9b = VFNMS(LDK(KP980785280), T8Y, T8X); + T9e = VSUB(T9c, T9d); + TgL = VFNMS(LDK(KP995184726), T9e, T9b); + STM4(&(ro[49]), TgL, ovs, &(ro[1])); + STN4(&(ro[48]), TeQ, TgL, TfJ, Tgv, ovs); + TgM = VFMA(LDK(KP995184726), T9e, T9b); + STM4(&(ro[17]), TgM, ovs, &(ro[1])); + STN4(&(ro[16]), TeO, TgM, TfK, Tgw, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n2sv_64"), {520, 0, 392, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_64) (planner *p) { + X(kdft_register) (p, n2sv_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name n2sv_64 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 912 FP additions, 248 FP multiplications, + * (or, 808 additions, 144 multiplications, 104 fused multiply/add), + * 260 stack variables, 15 constants, and 288 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_64(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(256, is), MAKE_VOLATILE_STRIDE(256, os)) { + V T37, T7B, T8F, T5Z, Tf, Td9, TbB, TcB, T62, T7C, T2i, TdH, Tah, Tcb, T3e; + V T8G, Tu, TdI, Tak, TbD, Tan, TbC, T2x, Tda, T3m, T65, T7G, T8J, T7J, T8I; + V T3t, T64, TK, Tdd, Tas, Tce, Tav, Tcf, T2N, Tdc, T3G, T6G, T7O, T9k, T7R; + V T9l, T3N, T6H, T1L, Tdv, Tbs, Tcw, TdC, Teo, T5j, T6V, T5Q, T6Y, T8y, T9C; + V Tbb, Tct, T8n, T9z, TZ, Tdf, Taz, Tch, TaC, Tci, T32, Tdg, T3Z, T6J, T7V; + V T9n, T7Y, T9o, T46, T6K, T1g, Tdp, Tb1, Tcm, Tdm, Tej, T4q, T6R, T4X, T6O; + V T8f, T9s, TaK, Tcp, T84, T9v, T1v, Tdn, Tb4, Tcq, Tds, Tek, T4N, T6P, T50; + V T6S, T8i, T9w, TaV, Tcn, T8b, T9t, T20, TdD, Tbv, Tcu, Tdy, Tep, T5G, T6Z; + V T5T, T6W, T8B, T9A, Tbm, Tcx, T8u, T9D; + { + V T3, T35, T26, T5Y, T6, T5X, T29, T36, Ta, T39, T2d, T38, Td, T3b, T2g; + V T3c; + { + V T1, T2, T24, T25; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 32)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + T35 = VSUB(T1, T2); + T24 = LD(&(ii[0]), ivs, &(ii[0])); + T25 = LD(&(ii[WS(is, 32)]), ivs, &(ii[0])); + T26 = VADD(T24, T25); + T5Y = VSUB(T24, T25); + } + { + V T4, T5, T27, T28; + T4 = LD(&(ri[WS(is, 16)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 48)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + T5X = VSUB(T4, T5); + T27 = LD(&(ii[WS(is, 16)]), ivs, &(ii[0])); + T28 = LD(&(ii[WS(is, 48)]), ivs, &(ii[0])); + T29 = VADD(T27, T28); + T36 = VSUB(T27, T28); + } + { + V T8, T9, T2b, T2c; + T8 = LD(&(ri[WS(is, 8)]), ivs, &(ri[0])); + T9 = LD(&(ri[WS(is, 40)]), ivs, &(ri[0])); + Ta = VADD(T8, T9); + T39 = VSUB(T8, T9); + T2b = LD(&(ii[WS(is, 8)]), ivs, &(ii[0])); + T2c = LD(&(ii[WS(is, 40)]), ivs, &(ii[0])); + T2d = VADD(T2b, T2c); + T38 = VSUB(T2b, T2c); + } + { + V Tb, Tc, T2e, T2f; + Tb = LD(&(ri[WS(is, 56)]), ivs, &(ri[0])); + Tc = LD(&(ri[WS(is, 24)]), ivs, &(ri[0])); + Td = VADD(Tb, Tc); + T3b = VSUB(Tb, Tc); + T2e = LD(&(ii[WS(is, 56)]), ivs, &(ii[0])); + T2f = LD(&(ii[WS(is, 24)]), ivs, &(ii[0])); + T2g = VADD(T2e, T2f); + T3c = VSUB(T2e, T2f); + } + { + V T7, Te, T2a, T2h; + T37 = VSUB(T35, T36); + T7B = VADD(T35, T36); + T8F = VSUB(T5Y, T5X); + T5Z = VADD(T5X, T5Y); + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + Tf = VADD(T7, Te); + Td9 = VSUB(T7, Te); + { + V Tbz, TbA, T60, T61; + Tbz = VSUB(T26, T29); + TbA = VSUB(Td, Ta); + TbB = VSUB(Tbz, TbA); + TcB = VADD(TbA, Tbz); + T60 = VSUB(T3b, T3c); + T61 = VADD(T39, T38); + T62 = VMUL(LDK(KP707106781), VSUB(T60, T61)); + T7C = VMUL(LDK(KP707106781), VADD(T61, T60)); + } + T2a = VADD(T26, T29); + T2h = VADD(T2d, T2g); + T2i = VADD(T2a, T2h); + TdH = VSUB(T2a, T2h); + { + V Taf, Tag, T3a, T3d; + Taf = VSUB(T3, T6); + Tag = VSUB(T2d, T2g); + Tah = VSUB(Taf, Tag); + Tcb = VADD(Taf, Tag); + T3a = VSUB(T38, T39); + T3d = VADD(T3b, T3c); + T3e = VMUL(LDK(KP707106781), VSUB(T3a, T3d)); + T8G = VMUL(LDK(KP707106781), VADD(T3a, T3d)); + } + } + } + { + V Ti, T3j, T2l, T3h, Tl, T3g, T2o, T3k, Tp, T3q, T2s, T3o, Ts, T3n, T2v; + V T3r; + { + V Tg, Th, T2j, T2k; + Tg = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + Th = LD(&(ri[WS(is, 36)]), ivs, &(ri[0])); + Ti = VADD(Tg, Th); + T3j = VSUB(Tg, Th); + T2j = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + T2k = LD(&(ii[WS(is, 36)]), ivs, &(ii[0])); + T2l = VADD(T2j, T2k); + T3h = VSUB(T2j, T2k); + } + { + V Tj, Tk, T2m, T2n; + Tj = LD(&(ri[WS(is, 20)]), ivs, &(ri[0])); + Tk = LD(&(ri[WS(is, 52)]), ivs, &(ri[0])); + Tl = VADD(Tj, Tk); + T3g = VSUB(Tj, Tk); + T2m = LD(&(ii[WS(is, 20)]), ivs, &(ii[0])); + T2n = LD(&(ii[WS(is, 52)]), ivs, &(ii[0])); + T2o = VADD(T2m, T2n); + T3k = VSUB(T2m, T2n); + } + { + V Tn, To, T2q, T2r; + Tn = LD(&(ri[WS(is, 60)]), ivs, &(ri[0])); + To = LD(&(ri[WS(is, 28)]), ivs, &(ri[0])); + Tp = VADD(Tn, To); + T3q = VSUB(Tn, To); + T2q = LD(&(ii[WS(is, 60)]), ivs, &(ii[0])); + T2r = LD(&(ii[WS(is, 28)]), ivs, &(ii[0])); + T2s = VADD(T2q, T2r); + T3o = VSUB(T2q, T2r); + } + { + V Tq, Tr, T2t, T2u; + Tq = LD(&(ri[WS(is, 12)]), ivs, &(ri[0])); + Tr = LD(&(ri[WS(is, 44)]), ivs, &(ri[0])); + Ts = VADD(Tq, Tr); + T3n = VSUB(Tq, Tr); + T2t = LD(&(ii[WS(is, 12)]), ivs, &(ii[0])); + T2u = LD(&(ii[WS(is, 44)]), ivs, &(ii[0])); + T2v = VADD(T2t, T2u); + T3r = VSUB(T2t, T2u); + } + { + V Tm, Tt, Tai, Taj; + Tm = VADD(Ti, Tl); + Tt = VADD(Tp, Ts); + Tu = VADD(Tm, Tt); + TdI = VSUB(Tt, Tm); + Tai = VSUB(T2l, T2o); + Taj = VSUB(Ti, Tl); + Tak = VSUB(Tai, Taj); + TbD = VADD(Taj, Tai); + } + { + V Tal, Tam, T2p, T2w; + Tal = VSUB(Tp, Ts); + Tam = VSUB(T2s, T2v); + Tan = VADD(Tal, Tam); + TbC = VSUB(Tal, Tam); + T2p = VADD(T2l, T2o); + T2w = VADD(T2s, T2v); + T2x = VADD(T2p, T2w); + Tda = VSUB(T2p, T2w); + } + { + V T3i, T3l, T7E, T7F; + T3i = VADD(T3g, T3h); + T3l = VSUB(T3j, T3k); + T3m = VFNMS(LDK(KP923879532), T3l, VMUL(LDK(KP382683432), T3i)); + T65 = VFMA(LDK(KP923879532), T3i, VMUL(LDK(KP382683432), T3l)); + T7E = VSUB(T3h, T3g); + T7F = VADD(T3j, T3k); + T7G = VFNMS(LDK(KP382683432), T7F, VMUL(LDK(KP923879532), T7E)); + T8J = VFMA(LDK(KP382683432), T7E, VMUL(LDK(KP923879532), T7F)); + } + { + V T7H, T7I, T3p, T3s; + T7H = VSUB(T3o, T3n); + T7I = VADD(T3q, T3r); + T7J = VFMA(LDK(KP923879532), T7H, VMUL(LDK(KP382683432), T7I)); + T8I = VFNMS(LDK(KP382683432), T7H, VMUL(LDK(KP923879532), T7I)); + T3p = VADD(T3n, T3o); + T3s = VSUB(T3q, T3r); + T3t = VFMA(LDK(KP382683432), T3p, VMUL(LDK(KP923879532), T3s)); + T64 = VFNMS(LDK(KP923879532), T3p, VMUL(LDK(KP382683432), T3s)); + } + } + { + V Ty, T3H, T2B, T3x, TB, T3w, T2E, T3I, TI, T3L, T2L, T3B, TF, T3K, T2I; + V T3E; + { + V Tw, Tx, T2C, T2D; + Tw = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + Tx = LD(&(ri[WS(is, 34)]), ivs, &(ri[0])); + Ty = VADD(Tw, Tx); + T3H = VSUB(Tw, Tx); + { + V T2z, T2A, Tz, TA; + T2z = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + T2A = LD(&(ii[WS(is, 34)]), ivs, &(ii[0])); + T2B = VADD(T2z, T2A); + T3x = VSUB(T2z, T2A); + Tz = LD(&(ri[WS(is, 18)]), ivs, &(ri[0])); + TA = LD(&(ri[WS(is, 50)]), ivs, &(ri[0])); + TB = VADD(Tz, TA); + T3w = VSUB(Tz, TA); + } + T2C = LD(&(ii[WS(is, 18)]), ivs, &(ii[0])); + T2D = LD(&(ii[WS(is, 50)]), ivs, &(ii[0])); + T2E = VADD(T2C, T2D); + T3I = VSUB(T2C, T2D); + { + V TG, TH, T3z, T2J, T2K, T3A; + TG = LD(&(ri[WS(is, 58)]), ivs, &(ri[0])); + TH = LD(&(ri[WS(is, 26)]), ivs, &(ri[0])); + T3z = VSUB(TG, TH); + T2J = LD(&(ii[WS(is, 58)]), ivs, &(ii[0])); + T2K = LD(&(ii[WS(is, 26)]), ivs, &(ii[0])); + T3A = VSUB(T2J, T2K); + TI = VADD(TG, TH); + T3L = VADD(T3z, T3A); + T2L = VADD(T2J, T2K); + T3B = VSUB(T3z, T3A); + } + { + V TD, TE, T3C, T2G, T2H, T3D; + TD = LD(&(ri[WS(is, 10)]), ivs, &(ri[0])); + TE = LD(&(ri[WS(is, 42)]), ivs, &(ri[0])); + T3C = VSUB(TD, TE); + T2G = LD(&(ii[WS(is, 10)]), ivs, &(ii[0])); + T2H = LD(&(ii[WS(is, 42)]), ivs, &(ii[0])); + T3D = VSUB(T2G, T2H); + TF = VADD(TD, TE); + T3K = VSUB(T3D, T3C); + T2I = VADD(T2G, T2H); + T3E = VADD(T3C, T3D); + } + } + { + V TC, TJ, Taq, Tar; + TC = VADD(Ty, TB); + TJ = VADD(TF, TI); + TK = VADD(TC, TJ); + Tdd = VSUB(TC, TJ); + Taq = VSUB(T2B, T2E); + Tar = VSUB(TI, TF); + Tas = VSUB(Taq, Tar); + Tce = VADD(Tar, Taq); + } + { + V Tat, Tau, T2F, T2M; + Tat = VSUB(Ty, TB); + Tau = VSUB(T2I, T2L); + Tav = VSUB(Tat, Tau); + Tcf = VADD(Tat, Tau); + T2F = VADD(T2B, T2E); + T2M = VADD(T2I, T2L); + T2N = VADD(T2F, T2M); + Tdc = VSUB(T2F, T2M); + } + { + V T3y, T3F, T7M, T7N; + T3y = VADD(T3w, T3x); + T3F = VMUL(LDK(KP707106781), VSUB(T3B, T3E)); + T3G = VSUB(T3y, T3F); + T6G = VADD(T3y, T3F); + T7M = VSUB(T3x, T3w); + T7N = VMUL(LDK(KP707106781), VADD(T3K, T3L)); + T7O = VSUB(T7M, T7N); + T9k = VADD(T7M, T7N); + } + { + V T7P, T7Q, T3J, T3M; + T7P = VADD(T3H, T3I); + T7Q = VMUL(LDK(KP707106781), VADD(T3E, T3B)); + T7R = VSUB(T7P, T7Q); + T9l = VADD(T7P, T7Q); + T3J = VSUB(T3H, T3I); + T3M = VMUL(LDK(KP707106781), VSUB(T3K, T3L)); + T3N = VSUB(T3J, T3M); + T6H = VADD(T3J, T3M); + } + } + { + V T1z, T53, T5L, Tbo, T1C, T5I, T56, Tbp, T1J, Tb9, T5h, T5N, T1G, Tb8, T5c; + V T5O; + { + V T1x, T1y, T54, T55; + T1x = LD(&(ri[WS(is, 63)]), ivs, &(ri[WS(is, 1)])); + T1y = LD(&(ri[WS(is, 31)]), ivs, &(ri[WS(is, 1)])); + T1z = VADD(T1x, T1y); + T53 = VSUB(T1x, T1y); + { + V T5J, T5K, T1A, T1B; + T5J = LD(&(ii[WS(is, 63)]), ivs, &(ii[WS(is, 1)])); + T5K = LD(&(ii[WS(is, 31)]), ivs, &(ii[WS(is, 1)])); + T5L = VSUB(T5J, T5K); + Tbo = VADD(T5J, T5K); + T1A = LD(&(ri[WS(is, 15)]), ivs, &(ri[WS(is, 1)])); + T1B = LD(&(ri[WS(is, 47)]), ivs, &(ri[WS(is, 1)])); + T1C = VADD(T1A, T1B); + T5I = VSUB(T1A, T1B); + } + T54 = LD(&(ii[WS(is, 15)]), ivs, &(ii[WS(is, 1)])); + T55 = LD(&(ii[WS(is, 47)]), ivs, &(ii[WS(is, 1)])); + T56 = VSUB(T54, T55); + Tbp = VADD(T54, T55); + { + V T1H, T1I, T5d, T5e, T5f, T5g; + T1H = LD(&(ri[WS(is, 55)]), ivs, &(ri[WS(is, 1)])); + T1I = LD(&(ri[WS(is, 23)]), ivs, &(ri[WS(is, 1)])); + T5d = VSUB(T1H, T1I); + T5e = LD(&(ii[WS(is, 55)]), ivs, &(ii[WS(is, 1)])); + T5f = LD(&(ii[WS(is, 23)]), ivs, &(ii[WS(is, 1)])); + T5g = VSUB(T5e, T5f); + T1J = VADD(T1H, T1I); + Tb9 = VADD(T5e, T5f); + T5h = VADD(T5d, T5g); + T5N = VSUB(T5d, T5g); + } + { + V T1E, T1F, T5b, T58, T59, T5a; + T1E = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + T1F = LD(&(ri[WS(is, 39)]), ivs, &(ri[WS(is, 1)])); + T5b = VSUB(T1E, T1F); + T58 = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + T59 = LD(&(ii[WS(is, 39)]), ivs, &(ii[WS(is, 1)])); + T5a = VSUB(T58, T59); + T1G = VADD(T1E, T1F); + Tb8 = VADD(T58, T59); + T5c = VSUB(T5a, T5b); + T5O = VADD(T5b, T5a); + } + } + { + V T1D, T1K, Tbq, Tbr; + T1D = VADD(T1z, T1C); + T1K = VADD(T1G, T1J); + T1L = VADD(T1D, T1K); + Tdv = VSUB(T1D, T1K); + Tbq = VSUB(Tbo, Tbp); + Tbr = VSUB(T1J, T1G); + Tbs = VSUB(Tbq, Tbr); + Tcw = VADD(Tbr, Tbq); + } + { + V TdA, TdB, T57, T5i; + TdA = VADD(Tbo, Tbp); + TdB = VADD(Tb8, Tb9); + TdC = VSUB(TdA, TdB); + Teo = VADD(TdA, TdB); + T57 = VSUB(T53, T56); + T5i = VMUL(LDK(KP707106781), VSUB(T5c, T5h)); + T5j = VSUB(T57, T5i); + T6V = VADD(T57, T5i); + } + { + V T5M, T5P, T8w, T8x; + T5M = VADD(T5I, T5L); + T5P = VMUL(LDK(KP707106781), VSUB(T5N, T5O)); + T5Q = VSUB(T5M, T5P); + T6Y = VADD(T5M, T5P); + T8w = VSUB(T5L, T5I); + T8x = VMUL(LDK(KP707106781), VADD(T5c, T5h)); + T8y = VSUB(T8w, T8x); + T9C = VADD(T8w, T8x); + } + { + V Tb7, Tba, T8l, T8m; + Tb7 = VSUB(T1z, T1C); + Tba = VSUB(Tb8, Tb9); + Tbb = VSUB(Tb7, Tba); + Tct = VADD(Tb7, Tba); + T8l = VADD(T53, T56); + T8m = VMUL(LDK(KP707106781), VADD(T5O, T5N)); + T8n = VSUB(T8l, T8m); + T9z = VADD(T8l, T8m); + } + } + { + V TN, T40, T2Q, T3Q, TQ, T3P, T2T, T41, TX, T44, T30, T3U, TU, T43, T2X; + V T3X; + { + V TL, TM, T2R, T2S; + TL = LD(&(ri[WS(is, 62)]), ivs, &(ri[0])); + TM = LD(&(ri[WS(is, 30)]), ivs, &(ri[0])); + TN = VADD(TL, TM); + T40 = VSUB(TL, TM); + { + V T2O, T2P, TO, TP; + T2O = LD(&(ii[WS(is, 62)]), ivs, &(ii[0])); + T2P = LD(&(ii[WS(is, 30)]), ivs, &(ii[0])); + T2Q = VADD(T2O, T2P); + T3Q = VSUB(T2O, T2P); + TO = LD(&(ri[WS(is, 14)]), ivs, &(ri[0])); + TP = LD(&(ri[WS(is, 46)]), ivs, &(ri[0])); + TQ = VADD(TO, TP); + T3P = VSUB(TO, TP); + } + T2R = LD(&(ii[WS(is, 14)]), ivs, &(ii[0])); + T2S = LD(&(ii[WS(is, 46)]), ivs, &(ii[0])); + T2T = VADD(T2R, T2S); + T41 = VSUB(T2R, T2S); + { + V TV, TW, T3S, T2Y, T2Z, T3T; + TV = LD(&(ri[WS(is, 54)]), ivs, &(ri[0])); + TW = LD(&(ri[WS(is, 22)]), ivs, &(ri[0])); + T3S = VSUB(TV, TW); + T2Y = LD(&(ii[WS(is, 54)]), ivs, &(ii[0])); + T2Z = LD(&(ii[WS(is, 22)]), ivs, &(ii[0])); + T3T = VSUB(T2Y, T2Z); + TX = VADD(TV, TW); + T44 = VADD(T3S, T3T); + T30 = VADD(T2Y, T2Z); + T3U = VSUB(T3S, T3T); + } + { + V TS, TT, T3V, T2V, T2W, T3W; + TS = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + TT = LD(&(ri[WS(is, 38)]), ivs, &(ri[0])); + T3V = VSUB(TS, TT); + T2V = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + T2W = LD(&(ii[WS(is, 38)]), ivs, &(ii[0])); + T3W = VSUB(T2V, T2W); + TU = VADD(TS, TT); + T43 = VSUB(T3W, T3V); + T2X = VADD(T2V, T2W); + T3X = VADD(T3V, T3W); + } + } + { + V TR, TY, Tax, Tay; + TR = VADD(TN, TQ); + TY = VADD(TU, TX); + TZ = VADD(TR, TY); + Tdf = VSUB(TR, TY); + Tax = VSUB(T2Q, T2T); + Tay = VSUB(TX, TU); + Taz = VSUB(Tax, Tay); + Tch = VADD(Tay, Tax); + } + { + V TaA, TaB, T2U, T31; + TaA = VSUB(TN, TQ); + TaB = VSUB(T2X, T30); + TaC = VSUB(TaA, TaB); + Tci = VADD(TaA, TaB); + T2U = VADD(T2Q, T2T); + T31 = VADD(T2X, T30); + T32 = VADD(T2U, T31); + Tdg = VSUB(T2U, T31); + } + { + V T3R, T3Y, T7T, T7U; + T3R = VADD(T3P, T3Q); + T3Y = VMUL(LDK(KP707106781), VSUB(T3U, T3X)); + T3Z = VSUB(T3R, T3Y); + T6J = VADD(T3R, T3Y); + T7T = VADD(T40, T41); + T7U = VMUL(LDK(KP707106781), VADD(T3X, T3U)); + T7V = VSUB(T7T, T7U); + T9n = VADD(T7T, T7U); + } + { + V T7W, T7X, T42, T45; + T7W = VSUB(T3Q, T3P); + T7X = VMUL(LDK(KP707106781), VADD(T43, T44)); + T7Y = VSUB(T7W, T7X); + T9o = VADD(T7W, T7X); + T42 = VSUB(T40, T41); + T45 = VMUL(LDK(KP707106781), VSUB(T43, T44)); + T46 = VSUB(T42, T45); + T6K = VADD(T42, T45); + } + } + { + V T14, T4P, T4d, TaG, T17, T4a, T4S, TaH, T1e, TaZ, T4j, T4V, T1b, TaY, T4o; + V T4U; + { + V T12, T13, T4Q, T4R; + T12 = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + T13 = LD(&(ri[WS(is, 33)]), ivs, &(ri[WS(is, 1)])); + T14 = VADD(T12, T13); + T4P = VSUB(T12, T13); + { + V T4b, T4c, T15, T16; + T4b = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + T4c = LD(&(ii[WS(is, 33)]), ivs, &(ii[WS(is, 1)])); + T4d = VSUB(T4b, T4c); + TaG = VADD(T4b, T4c); + T15 = LD(&(ri[WS(is, 17)]), ivs, &(ri[WS(is, 1)])); + T16 = LD(&(ri[WS(is, 49)]), ivs, &(ri[WS(is, 1)])); + T17 = VADD(T15, T16); + T4a = VSUB(T15, T16); + } + T4Q = LD(&(ii[WS(is, 17)]), ivs, &(ii[WS(is, 1)])); + T4R = LD(&(ii[WS(is, 49)]), ivs, &(ii[WS(is, 1)])); + T4S = VSUB(T4Q, T4R); + TaH = VADD(T4Q, T4R); + { + V T1c, T1d, T4f, T4g, T4h, T4i; + T1c = LD(&(ri[WS(is, 57)]), ivs, &(ri[WS(is, 1)])); + T1d = LD(&(ri[WS(is, 25)]), ivs, &(ri[WS(is, 1)])); + T4f = VSUB(T1c, T1d); + T4g = LD(&(ii[WS(is, 57)]), ivs, &(ii[WS(is, 1)])); + T4h = LD(&(ii[WS(is, 25)]), ivs, &(ii[WS(is, 1)])); + T4i = VSUB(T4g, T4h); + T1e = VADD(T1c, T1d); + TaZ = VADD(T4g, T4h); + T4j = VSUB(T4f, T4i); + T4V = VADD(T4f, T4i); + } + { + V T19, T1a, T4k, T4l, T4m, T4n; + T19 = LD(&(ri[WS(is, 9)]), ivs, &(ri[WS(is, 1)])); + T1a = LD(&(ri[WS(is, 41)]), ivs, &(ri[WS(is, 1)])); + T4k = VSUB(T19, T1a); + T4l = LD(&(ii[WS(is, 9)]), ivs, &(ii[WS(is, 1)])); + T4m = LD(&(ii[WS(is, 41)]), ivs, &(ii[WS(is, 1)])); + T4n = VSUB(T4l, T4m); + T1b = VADD(T19, T1a); + TaY = VADD(T4l, T4m); + T4o = VADD(T4k, T4n); + T4U = VSUB(T4n, T4k); + } + } + { + V T18, T1f, TaX, Tb0; + T18 = VADD(T14, T17); + T1f = VADD(T1b, T1e); + T1g = VADD(T18, T1f); + Tdp = VSUB(T18, T1f); + TaX = VSUB(T14, T17); + Tb0 = VSUB(TaY, TaZ); + Tb1 = VSUB(TaX, Tb0); + Tcm = VADD(TaX, Tb0); + } + { + V Tdk, Tdl, T4e, T4p; + Tdk = VADD(TaG, TaH); + Tdl = VADD(TaY, TaZ); + Tdm = VSUB(Tdk, Tdl); + Tej = VADD(Tdk, Tdl); + T4e = VADD(T4a, T4d); + T4p = VMUL(LDK(KP707106781), VSUB(T4j, T4o)); + T4q = VSUB(T4e, T4p); + T6R = VADD(T4e, T4p); + } + { + V T4T, T4W, T8d, T8e; + T4T = VSUB(T4P, T4S); + T4W = VMUL(LDK(KP707106781), VSUB(T4U, T4V)); + T4X = VSUB(T4T, T4W); + T6O = VADD(T4T, T4W); + T8d = VADD(T4P, T4S); + T8e = VMUL(LDK(KP707106781), VADD(T4o, T4j)); + T8f = VSUB(T8d, T8e); + T9s = VADD(T8d, T8e); + } + { + V TaI, TaJ, T82, T83; + TaI = VSUB(TaG, TaH); + TaJ = VSUB(T1e, T1b); + TaK = VSUB(TaI, TaJ); + Tcp = VADD(TaJ, TaI); + T82 = VSUB(T4d, T4a); + T83 = VMUL(LDK(KP707106781), VADD(T4U, T4V)); + T84 = VSUB(T82, T83); + T9v = VADD(T82, T83); + } + } + { + V T1j, TaR, T1m, TaS, T4G, T4L, TaT, TaQ, T89, T88, T1q, TaM, T1t, TaN, T4v; + V T4A, TaO, TaL, T86, T85; + { + V T4H, T4F, T4C, T4K; + { + V T1h, T1i, T4D, T4E; + T1h = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + T1i = LD(&(ri[WS(is, 37)]), ivs, &(ri[WS(is, 1)])); + T1j = VADD(T1h, T1i); + T4H = VSUB(T1h, T1i); + T4D = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + T4E = LD(&(ii[WS(is, 37)]), ivs, &(ii[WS(is, 1)])); + T4F = VSUB(T4D, T4E); + TaR = VADD(T4D, T4E); + } + { + V T1k, T1l, T4I, T4J; + T1k = LD(&(ri[WS(is, 21)]), ivs, &(ri[WS(is, 1)])); + T1l = LD(&(ri[WS(is, 53)]), ivs, &(ri[WS(is, 1)])); + T1m = VADD(T1k, T1l); + T4C = VSUB(T1k, T1l); + T4I = LD(&(ii[WS(is, 21)]), ivs, &(ii[WS(is, 1)])); + T4J = LD(&(ii[WS(is, 53)]), ivs, &(ii[WS(is, 1)])); + T4K = VSUB(T4I, T4J); + TaS = VADD(T4I, T4J); + } + T4G = VADD(T4C, T4F); + T4L = VSUB(T4H, T4K); + TaT = VSUB(TaR, TaS); + TaQ = VSUB(T1j, T1m); + T89 = VADD(T4H, T4K); + T88 = VSUB(T4F, T4C); + } + { + V T4r, T4z, T4w, T4u; + { + V T1o, T1p, T4x, T4y; + T1o = LD(&(ri[WS(is, 61)]), ivs, &(ri[WS(is, 1)])); + T1p = LD(&(ri[WS(is, 29)]), ivs, &(ri[WS(is, 1)])); + T1q = VADD(T1o, T1p); + T4r = VSUB(T1o, T1p); + T4x = LD(&(ii[WS(is, 61)]), ivs, &(ii[WS(is, 1)])); + T4y = LD(&(ii[WS(is, 29)]), ivs, &(ii[WS(is, 1)])); + T4z = VSUB(T4x, T4y); + TaM = VADD(T4x, T4y); + } + { + V T1r, T1s, T4s, T4t; + T1r = LD(&(ri[WS(is, 13)]), ivs, &(ri[WS(is, 1)])); + T1s = LD(&(ri[WS(is, 45)]), ivs, &(ri[WS(is, 1)])); + T1t = VADD(T1r, T1s); + T4w = VSUB(T1r, T1s); + T4s = LD(&(ii[WS(is, 13)]), ivs, &(ii[WS(is, 1)])); + T4t = LD(&(ii[WS(is, 45)]), ivs, &(ii[WS(is, 1)])); + T4u = VSUB(T4s, T4t); + TaN = VADD(T4s, T4t); + } + T4v = VSUB(T4r, T4u); + T4A = VADD(T4w, T4z); + TaO = VSUB(TaM, TaN); + TaL = VSUB(T1q, T1t); + T86 = VSUB(T4z, T4w); + T85 = VADD(T4r, T4u); + } + { + V T1n, T1u, Tb2, Tb3; + T1n = VADD(T1j, T1m); + T1u = VADD(T1q, T1t); + T1v = VADD(T1n, T1u); + Tdn = VSUB(T1u, T1n); + Tb2 = VSUB(TaT, TaQ); + Tb3 = VADD(TaL, TaO); + Tb4 = VMUL(LDK(KP707106781), VSUB(Tb2, Tb3)); + Tcq = VMUL(LDK(KP707106781), VADD(Tb2, Tb3)); + } + { + V Tdq, Tdr, T4B, T4M; + Tdq = VADD(TaR, TaS); + Tdr = VADD(TaM, TaN); + Tds = VSUB(Tdq, Tdr); + Tek = VADD(Tdq, Tdr); + T4B = VFNMS(LDK(KP923879532), T4A, VMUL(LDK(KP382683432), T4v)); + T4M = VFMA(LDK(KP923879532), T4G, VMUL(LDK(KP382683432), T4L)); + T4N = VSUB(T4B, T4M); + T6P = VADD(T4M, T4B); + } + { + V T4Y, T4Z, T8g, T8h; + T4Y = VFNMS(LDK(KP923879532), T4L, VMUL(LDK(KP382683432), T4G)); + T4Z = VFMA(LDK(KP382683432), T4A, VMUL(LDK(KP923879532), T4v)); + T50 = VSUB(T4Y, T4Z); + T6S = VADD(T4Y, T4Z); + T8g = VFNMS(LDK(KP382683432), T89, VMUL(LDK(KP923879532), T88)); + T8h = VFMA(LDK(KP923879532), T86, VMUL(LDK(KP382683432), T85)); + T8i = VSUB(T8g, T8h); + T9w = VADD(T8g, T8h); + } + { + V TaP, TaU, T87, T8a; + TaP = VSUB(TaL, TaO); + TaU = VADD(TaQ, TaT); + TaV = VMUL(LDK(KP707106781), VSUB(TaP, TaU)); + Tcn = VMUL(LDK(KP707106781), VADD(TaU, TaP)); + T87 = VFNMS(LDK(KP382683432), T86, VMUL(LDK(KP923879532), T85)); + T8a = VFMA(LDK(KP382683432), T88, VMUL(LDK(KP923879532), T89)); + T8b = VSUB(T87, T8a); + T9t = VADD(T8a, T87); + } + } + { + V T1O, Tbc, T1R, Tbd, T5o, T5t, Tbf, Tbe, T8p, T8o, T1V, Tbi, T1Y, Tbj, T5z; + V T5E, Tbk, Tbh, T8s, T8r; + { + V T5p, T5n, T5k, T5s; + { + V T1M, T1N, T5l, T5m; + T1M = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + T1N = LD(&(ri[WS(is, 35)]), ivs, &(ri[WS(is, 1)])); + T1O = VADD(T1M, T1N); + T5p = VSUB(T1M, T1N); + T5l = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + T5m = LD(&(ii[WS(is, 35)]), ivs, &(ii[WS(is, 1)])); + T5n = VSUB(T5l, T5m); + Tbc = VADD(T5l, T5m); + } + { + V T1P, T1Q, T5q, T5r; + T1P = LD(&(ri[WS(is, 19)]), ivs, &(ri[WS(is, 1)])); + T1Q = LD(&(ri[WS(is, 51)]), ivs, &(ri[WS(is, 1)])); + T1R = VADD(T1P, T1Q); + T5k = VSUB(T1P, T1Q); + T5q = LD(&(ii[WS(is, 19)]), ivs, &(ii[WS(is, 1)])); + T5r = LD(&(ii[WS(is, 51)]), ivs, &(ii[WS(is, 1)])); + T5s = VSUB(T5q, T5r); + Tbd = VADD(T5q, T5r); + } + T5o = VADD(T5k, T5n); + T5t = VSUB(T5p, T5s); + Tbf = VSUB(T1O, T1R); + Tbe = VSUB(Tbc, Tbd); + T8p = VADD(T5p, T5s); + T8o = VSUB(T5n, T5k); + } + { + V T5A, T5y, T5v, T5D; + { + V T1T, T1U, T5w, T5x; + T1T = LD(&(ri[WS(is, 59)]), ivs, &(ri[WS(is, 1)])); + T1U = LD(&(ri[WS(is, 27)]), ivs, &(ri[WS(is, 1)])); + T1V = VADD(T1T, T1U); + T5A = VSUB(T1T, T1U); + T5w = LD(&(ii[WS(is, 59)]), ivs, &(ii[WS(is, 1)])); + T5x = LD(&(ii[WS(is, 27)]), ivs, &(ii[WS(is, 1)])); + T5y = VSUB(T5w, T5x); + Tbi = VADD(T5w, T5x); + } + { + V T1W, T1X, T5B, T5C; + T1W = LD(&(ri[WS(is, 11)]), ivs, &(ri[WS(is, 1)])); + T1X = LD(&(ri[WS(is, 43)]), ivs, &(ri[WS(is, 1)])); + T1Y = VADD(T1W, T1X); + T5v = VSUB(T1W, T1X); + T5B = LD(&(ii[WS(is, 11)]), ivs, &(ii[WS(is, 1)])); + T5C = LD(&(ii[WS(is, 43)]), ivs, &(ii[WS(is, 1)])); + T5D = VSUB(T5B, T5C); + Tbj = VADD(T5B, T5C); + } + T5z = VADD(T5v, T5y); + T5E = VSUB(T5A, T5D); + Tbk = VSUB(Tbi, Tbj); + Tbh = VSUB(T1V, T1Y); + T8s = VADD(T5A, T5D); + T8r = VSUB(T5y, T5v); + } + { + V T1S, T1Z, Tbt, Tbu; + T1S = VADD(T1O, T1R); + T1Z = VADD(T1V, T1Y); + T20 = VADD(T1S, T1Z); + TdD = VSUB(T1Z, T1S); + Tbt = VSUB(Tbh, Tbk); + Tbu = VADD(Tbf, Tbe); + Tbv = VMUL(LDK(KP707106781), VSUB(Tbt, Tbu)); + Tcu = VMUL(LDK(KP707106781), VADD(Tbu, Tbt)); + } + { + V Tdw, Tdx, T5u, T5F; + Tdw = VADD(Tbc, Tbd); + Tdx = VADD(Tbi, Tbj); + Tdy = VSUB(Tdw, Tdx); + Tep = VADD(Tdw, Tdx); + T5u = VFNMS(LDK(KP923879532), T5t, VMUL(LDK(KP382683432), T5o)); + T5F = VFMA(LDK(KP382683432), T5z, VMUL(LDK(KP923879532), T5E)); + T5G = VSUB(T5u, T5F); + T6Z = VADD(T5u, T5F); + } + { + V T5R, T5S, T8z, T8A; + T5R = VFNMS(LDK(KP923879532), T5z, VMUL(LDK(KP382683432), T5E)); + T5S = VFMA(LDK(KP923879532), T5o, VMUL(LDK(KP382683432), T5t)); + T5T = VSUB(T5R, T5S); + T6W = VADD(T5S, T5R); + T8z = VFNMS(LDK(KP382683432), T8r, VMUL(LDK(KP923879532), T8s)); + T8A = VFMA(LDK(KP382683432), T8o, VMUL(LDK(KP923879532), T8p)); + T8B = VSUB(T8z, T8A); + T9A = VADD(T8A, T8z); + } + { + V Tbg, Tbl, T8q, T8t; + Tbg = VSUB(Tbe, Tbf); + Tbl = VADD(Tbh, Tbk); + Tbm = VMUL(LDK(KP707106781), VSUB(Tbg, Tbl)); + Tcx = VMUL(LDK(KP707106781), VADD(Tbg, Tbl)); + T8q = VFNMS(LDK(KP382683432), T8p, VMUL(LDK(KP923879532), T8o)); + T8t = VFMA(LDK(KP923879532), T8r, VMUL(LDK(KP382683432), T8s)); + T8u = VSUB(T8q, T8t); + T9D = VADD(T8q, T8t); + } + } + { + V TeJ, TeK, TeL, TeM, TeN, TeO, TeP, TeQ, TeR, TeS, TeT, TeU, TeV, TeW, TeX; + V TeY, TeZ, Tf0, Tf1, Tf2, Tf3, Tf4, Tf5, Tf6, Tf7, Tf8, Tf9, Tfa, Tfb, Tfc; + V Tfd, Tfe, Tff, Tfg, Tfh, Tfi, Tfj, Tfk, Tfl, Tfm, Tfn, Tfo, Tfp, Tfq, Tfr; + V Tfs, Tft, Tfu; + { + V T11, TeD, TeG, TeI, T22, T23, T34, TeH; + { + V Tv, T10, TeE, TeF; + Tv = VADD(Tf, Tu); + T10 = VADD(TK, TZ); + T11 = VADD(Tv, T10); + TeD = VSUB(Tv, T10); + TeE = VADD(Tej, Tek); + TeF = VADD(Teo, Tep); + TeG = VSUB(TeE, TeF); + TeI = VADD(TeE, TeF); + } + { + V T1w, T21, T2y, T33; + T1w = VADD(T1g, T1v); + T21 = VADD(T1L, T20); + T22 = VADD(T1w, T21); + T23 = VSUB(T21, T1w); + T2y = VADD(T2i, T2x); + T33 = VADD(T2N, T32); + T34 = VSUB(T2y, T33); + TeH = VADD(T2y, T33); + } + TeJ = VSUB(T11, T22); + STM4(&(ro[32]), TeJ, ovs, &(ro[0])); + TeK = VSUB(TeH, TeI); + STM4(&(io[32]), TeK, ovs, &(io[0])); + TeL = VADD(T11, T22); + STM4(&(ro[0]), TeL, ovs, &(ro[0])); + TeM = VADD(TeH, TeI); + STM4(&(io[0]), TeM, ovs, &(io[0])); + TeN = VADD(T23, T34); + STM4(&(io[16]), TeN, ovs, &(io[0])); + TeO = VADD(TeD, TeG); + STM4(&(ro[16]), TeO, ovs, &(ro[0])); + TeP = VSUB(T34, T23); + STM4(&(io[48]), TeP, ovs, &(io[0])); + TeQ = VSUB(TeD, TeG); + STM4(&(ro[48]), TeQ, ovs, &(ro[0])); + } + { + V Teh, Tex, Tev, TeB, Tem, Tey, Ter, Tez; + { + V Tef, Teg, Tet, Teu; + Tef = VSUB(Tf, Tu); + Teg = VSUB(T2N, T32); + Teh = VADD(Tef, Teg); + Tex = VSUB(Tef, Teg); + Tet = VSUB(T2i, T2x); + Teu = VSUB(TZ, TK); + Tev = VSUB(Tet, Teu); + TeB = VADD(Teu, Tet); + } + { + V Tei, Tel, Ten, Teq; + Tei = VSUB(T1g, T1v); + Tel = VSUB(Tej, Tek); + Tem = VADD(Tei, Tel); + Tey = VSUB(Tel, Tei); + Ten = VSUB(T1L, T20); + Teq = VSUB(Teo, Tep); + Ter = VSUB(Ten, Teq); + Tez = VADD(Ten, Teq); + } + { + V Tes, TeC, Tew, TeA; + Tes = VMUL(LDK(KP707106781), VADD(Tem, Ter)); + TeR = VSUB(Teh, Tes); + STM4(&(ro[40]), TeR, ovs, &(ro[0])); + TeS = VADD(Teh, Tes); + STM4(&(ro[8]), TeS, ovs, &(ro[0])); + TeC = VMUL(LDK(KP707106781), VADD(Tey, Tez)); + TeT = VSUB(TeB, TeC); + STM4(&(io[40]), TeT, ovs, &(io[0])); + TeU = VADD(TeB, TeC); + STM4(&(io[8]), TeU, ovs, &(io[0])); + Tew = VMUL(LDK(KP707106781), VSUB(Ter, Tem)); + TeV = VSUB(Tev, Tew); + STM4(&(io[56]), TeV, ovs, &(io[0])); + TeW = VADD(Tev, Tew); + STM4(&(io[24]), TeW, ovs, &(io[0])); + TeA = VMUL(LDK(KP707106781), VSUB(Tey, Tez)); + TeX = VSUB(Tex, TeA); + STM4(&(ro[56]), TeX, ovs, &(ro[0])); + TeY = VADD(Tex, TeA); + STM4(&(ro[24]), TeY, ovs, &(ro[0])); + } + } + { + V Tdb, TdV, Te5, TdJ, Tdi, Te6, Te3, Teb, TdM, TdW, Tdu, TdQ, Te0, Tea, TdF; + V TdR; + { + V Tde, Tdh, Tdo, Tdt; + Tdb = VSUB(Td9, Tda); + TdV = VADD(Td9, Tda); + Te5 = VADD(TdI, TdH); + TdJ = VSUB(TdH, TdI); + Tde = VSUB(Tdc, Tdd); + Tdh = VADD(Tdf, Tdg); + Tdi = VMUL(LDK(KP707106781), VSUB(Tde, Tdh)); + Te6 = VMUL(LDK(KP707106781), VADD(Tde, Tdh)); + { + V Te1, Te2, TdK, TdL; + Te1 = VADD(Tdv, Tdy); + Te2 = VADD(TdD, TdC); + Te3 = VFNMS(LDK(KP382683432), Te2, VMUL(LDK(KP923879532), Te1)); + Teb = VFMA(LDK(KP923879532), Te2, VMUL(LDK(KP382683432), Te1)); + TdK = VSUB(Tdf, Tdg); + TdL = VADD(Tdd, Tdc); + TdM = VMUL(LDK(KP707106781), VSUB(TdK, TdL)); + TdW = VMUL(LDK(KP707106781), VADD(TdL, TdK)); + } + Tdo = VSUB(Tdm, Tdn); + Tdt = VSUB(Tdp, Tds); + Tdu = VFMA(LDK(KP923879532), Tdo, VMUL(LDK(KP382683432), Tdt)); + TdQ = VFNMS(LDK(KP923879532), Tdt, VMUL(LDK(KP382683432), Tdo)); + { + V TdY, TdZ, Tdz, TdE; + TdY = VADD(Tdn, Tdm); + TdZ = VADD(Tdp, Tds); + Te0 = VFMA(LDK(KP382683432), TdY, VMUL(LDK(KP923879532), TdZ)); + Tea = VFNMS(LDK(KP382683432), TdZ, VMUL(LDK(KP923879532), TdY)); + Tdz = VSUB(Tdv, Tdy); + TdE = VSUB(TdC, TdD); + TdF = VFNMS(LDK(KP923879532), TdE, VMUL(LDK(KP382683432), Tdz)); + TdR = VFMA(LDK(KP382683432), TdE, VMUL(LDK(KP923879532), Tdz)); + } + } + { + V Tdj, TdG, TdT, TdU; + Tdj = VADD(Tdb, Tdi); + TdG = VADD(Tdu, TdF); + TeZ = VSUB(Tdj, TdG); + STM4(&(ro[44]), TeZ, ovs, &(ro[0])); + Tf0 = VADD(Tdj, TdG); + STM4(&(ro[12]), Tf0, ovs, &(ro[0])); + TdT = VADD(TdJ, TdM); + TdU = VADD(TdQ, TdR); + Tf1 = VSUB(TdT, TdU); + STM4(&(io[44]), Tf1, ovs, &(io[0])); + Tf2 = VADD(TdT, TdU); + STM4(&(io[12]), Tf2, ovs, &(io[0])); + } + { + V TdN, TdO, TdP, TdS; + TdN = VSUB(TdJ, TdM); + TdO = VSUB(TdF, Tdu); + Tf3 = VSUB(TdN, TdO); + STM4(&(io[60]), Tf3, ovs, &(io[0])); + Tf4 = VADD(TdN, TdO); + STM4(&(io[28]), Tf4, ovs, &(io[0])); + TdP = VSUB(Tdb, Tdi); + TdS = VSUB(TdQ, TdR); + Tf5 = VSUB(TdP, TdS); + STM4(&(ro[60]), Tf5, ovs, &(ro[0])); + Tf6 = VADD(TdP, TdS); + STM4(&(ro[28]), Tf6, ovs, &(ro[0])); + } + { + V TdX, Te4, Ted, Tee; + TdX = VADD(TdV, TdW); + Te4 = VADD(Te0, Te3); + Tf7 = VSUB(TdX, Te4); + STM4(&(ro[36]), Tf7, ovs, &(ro[0])); + Tf8 = VADD(TdX, Te4); + STM4(&(ro[4]), Tf8, ovs, &(ro[0])); + Ted = VADD(Te5, Te6); + Tee = VADD(Tea, Teb); + Tf9 = VSUB(Ted, Tee); + STM4(&(io[36]), Tf9, ovs, &(io[0])); + Tfa = VADD(Ted, Tee); + STM4(&(io[4]), Tfa, ovs, &(io[0])); + } + { + V Te7, Te8, Te9, Tec; + Te7 = VSUB(Te5, Te6); + Te8 = VSUB(Te3, Te0); + Tfb = VSUB(Te7, Te8); + STM4(&(io[52]), Tfb, ovs, &(io[0])); + Tfc = VADD(Te7, Te8); + STM4(&(io[20]), Tfc, ovs, &(io[0])); + Te9 = VSUB(TdV, TdW); + Tec = VSUB(Tea, Teb); + Tfd = VSUB(Te9, Tec); + STM4(&(ro[52]), Tfd, ovs, &(ro[0])); + Tfe = VADD(Te9, Tec); + STM4(&(ro[20]), Tfe, ovs, &(ro[0])); + } + } + { + V Tcd, TcP, TcD, TcZ, Tck, Td0, TcX, Td5, Tcs, TcK, TcG, TcQ, TcU, Td4, Tcz; + V TcL, Tcc, TcC; + Tcc = VMUL(LDK(KP707106781), VADD(TbD, TbC)); + Tcd = VSUB(Tcb, Tcc); + TcP = VADD(Tcb, Tcc); + TcC = VMUL(LDK(KP707106781), VADD(Tak, Tan)); + TcD = VSUB(TcB, TcC); + TcZ = VADD(TcB, TcC); + { + V Tcg, Tcj, TcV, TcW; + Tcg = VFNMS(LDK(KP382683432), Tcf, VMUL(LDK(KP923879532), Tce)); + Tcj = VFMA(LDK(KP923879532), Tch, VMUL(LDK(KP382683432), Tci)); + Tck = VSUB(Tcg, Tcj); + Td0 = VADD(Tcg, Tcj); + TcV = VADD(Tct, Tcu); + TcW = VADD(Tcw, Tcx); + TcX = VFNMS(LDK(KP195090322), TcW, VMUL(LDK(KP980785280), TcV)); + Td5 = VFMA(LDK(KP195090322), TcV, VMUL(LDK(KP980785280), TcW)); + } + { + V Tco, Tcr, TcE, TcF; + Tco = VSUB(Tcm, Tcn); + Tcr = VSUB(Tcp, Tcq); + Tcs = VFMA(LDK(KP555570233), Tco, VMUL(LDK(KP831469612), Tcr)); + TcK = VFNMS(LDK(KP831469612), Tco, VMUL(LDK(KP555570233), Tcr)); + TcE = VFNMS(LDK(KP382683432), Tch, VMUL(LDK(KP923879532), Tci)); + TcF = VFMA(LDK(KP382683432), Tce, VMUL(LDK(KP923879532), Tcf)); + TcG = VSUB(TcE, TcF); + TcQ = VADD(TcF, TcE); + } + { + V TcS, TcT, Tcv, Tcy; + TcS = VADD(Tcm, Tcn); + TcT = VADD(Tcp, Tcq); + TcU = VFMA(LDK(KP980785280), TcS, VMUL(LDK(KP195090322), TcT)); + Td4 = VFNMS(LDK(KP195090322), TcS, VMUL(LDK(KP980785280), TcT)); + Tcv = VSUB(Tct, Tcu); + Tcy = VSUB(Tcw, Tcx); + Tcz = VFNMS(LDK(KP831469612), Tcy, VMUL(LDK(KP555570233), Tcv)); + TcL = VFMA(LDK(KP831469612), Tcv, VMUL(LDK(KP555570233), Tcy)); + } + { + V Tcl, TcA, TcN, TcO; + Tcl = VADD(Tcd, Tck); + TcA = VADD(Tcs, Tcz); + Tff = VSUB(Tcl, TcA); + STM4(&(ro[42]), Tff, ovs, &(ro[0])); + Tfg = VADD(Tcl, TcA); + STM4(&(ro[10]), Tfg, ovs, &(ro[0])); + TcN = VADD(TcD, TcG); + TcO = VADD(TcK, TcL); + Tfh = VSUB(TcN, TcO); + STM4(&(io[42]), Tfh, ovs, &(io[0])); + Tfi = VADD(TcN, TcO); + STM4(&(io[10]), Tfi, ovs, &(io[0])); + } + { + V TcH, TcI, TcJ, TcM; + TcH = VSUB(TcD, TcG); + TcI = VSUB(Tcz, Tcs); + Tfj = VSUB(TcH, TcI); + STM4(&(io[58]), Tfj, ovs, &(io[0])); + Tfk = VADD(TcH, TcI); + STM4(&(io[26]), Tfk, ovs, &(io[0])); + TcJ = VSUB(Tcd, Tck); + TcM = VSUB(TcK, TcL); + Tfl = VSUB(TcJ, TcM); + STM4(&(ro[58]), Tfl, ovs, &(ro[0])); + Tfm = VADD(TcJ, TcM); + STM4(&(ro[26]), Tfm, ovs, &(ro[0])); + } + { + V TcR, TcY, Td7, Td8; + TcR = VADD(TcP, TcQ); + TcY = VADD(TcU, TcX); + Tfn = VSUB(TcR, TcY); + STM4(&(ro[34]), Tfn, ovs, &(ro[0])); + Tfo = VADD(TcR, TcY); + STM4(&(ro[2]), Tfo, ovs, &(ro[0])); + Td7 = VADD(TcZ, Td0); + Td8 = VADD(Td4, Td5); + Tfp = VSUB(Td7, Td8); + STM4(&(io[34]), Tfp, ovs, &(io[0])); + Tfq = VADD(Td7, Td8); + STM4(&(io[2]), Tfq, ovs, &(io[0])); + } + { + V Td1, Td2, Td3, Td6; + Td1 = VSUB(TcZ, Td0); + Td2 = VSUB(TcX, TcU); + Tfr = VSUB(Td1, Td2); + STM4(&(io[50]), Tfr, ovs, &(io[0])); + Tfs = VADD(Td1, Td2); + STM4(&(io[18]), Tfs, ovs, &(io[0])); + Td3 = VSUB(TcP, TcQ); + Td6 = VSUB(Td4, Td5); + Tft = VSUB(Td3, Td6); + STM4(&(ro[50]), Tft, ovs, &(ro[0])); + Tfu = VADD(Td3, Td6); + STM4(&(ro[18]), Tfu, ovs, &(ro[0])); + } + } + { + V Tfv, Tfw, Tfx, Tfy, Tfz, TfA, TfB, TfC, TfD, TfE, TfF, TfG, TfH, TfI, TfJ; + V TfK, TfL, TfM, TfN, TfO, TfP, TfQ, TfR, TfS, TfT, TfU, TfV, TfW, TfX, TfY; + V TfZ, Tg0; + { + V Tap, TbR, TbF, Tc1, TaE, Tc2, TbZ, Tc7, Tb6, TbM, TbI, TbS, TbW, Tc6, Tbx; + V TbN, Tao, TbE; + Tao = VMUL(LDK(KP707106781), VSUB(Tak, Tan)); + Tap = VSUB(Tah, Tao); + TbR = VADD(Tah, Tao); + TbE = VMUL(LDK(KP707106781), VSUB(TbC, TbD)); + TbF = VSUB(TbB, TbE); + Tc1 = VADD(TbB, TbE); + { + V Taw, TaD, TbX, TbY; + Taw = VFNMS(LDK(KP923879532), Tav, VMUL(LDK(KP382683432), Tas)); + TaD = VFMA(LDK(KP382683432), Taz, VMUL(LDK(KP923879532), TaC)); + TaE = VSUB(Taw, TaD); + Tc2 = VADD(Taw, TaD); + TbX = VADD(Tbb, Tbm); + TbY = VADD(Tbs, Tbv); + TbZ = VFNMS(LDK(KP555570233), TbY, VMUL(LDK(KP831469612), TbX)); + Tc7 = VFMA(LDK(KP831469612), TbY, VMUL(LDK(KP555570233), TbX)); + } + { + V TaW, Tb5, TbG, TbH; + TaW = VSUB(TaK, TaV); + Tb5 = VSUB(Tb1, Tb4); + Tb6 = VFMA(LDK(KP980785280), TaW, VMUL(LDK(KP195090322), Tb5)); + TbM = VFNMS(LDK(KP980785280), Tb5, VMUL(LDK(KP195090322), TaW)); + TbG = VFNMS(LDK(KP923879532), Taz, VMUL(LDK(KP382683432), TaC)); + TbH = VFMA(LDK(KP923879532), Tas, VMUL(LDK(KP382683432), Tav)); + TbI = VSUB(TbG, TbH); + TbS = VADD(TbH, TbG); + } + { + V TbU, TbV, Tbn, Tbw; + TbU = VADD(TaK, TaV); + TbV = VADD(Tb1, Tb4); + TbW = VFMA(LDK(KP555570233), TbU, VMUL(LDK(KP831469612), TbV)); + Tc6 = VFNMS(LDK(KP555570233), TbV, VMUL(LDK(KP831469612), TbU)); + Tbn = VSUB(Tbb, Tbm); + Tbw = VSUB(Tbs, Tbv); + Tbx = VFNMS(LDK(KP980785280), Tbw, VMUL(LDK(KP195090322), Tbn)); + TbN = VFMA(LDK(KP195090322), Tbw, VMUL(LDK(KP980785280), Tbn)); + } + { + V TaF, Tby, TbP, TbQ; + TaF = VADD(Tap, TaE); + Tby = VADD(Tb6, Tbx); + Tfv = VSUB(TaF, Tby); + STM4(&(ro[46]), Tfv, ovs, &(ro[0])); + Tfw = VADD(TaF, Tby); + STM4(&(ro[14]), Tfw, ovs, &(ro[0])); + TbP = VADD(TbF, TbI); + TbQ = VADD(TbM, TbN); + Tfx = VSUB(TbP, TbQ); + STM4(&(io[46]), Tfx, ovs, &(io[0])); + Tfy = VADD(TbP, TbQ); + STM4(&(io[14]), Tfy, ovs, &(io[0])); + } + { + V TbJ, TbK, TbL, TbO; + TbJ = VSUB(TbF, TbI); + TbK = VSUB(Tbx, Tb6); + Tfz = VSUB(TbJ, TbK); + STM4(&(io[62]), Tfz, ovs, &(io[0])); + TfA = VADD(TbJ, TbK); + STM4(&(io[30]), TfA, ovs, &(io[0])); + TbL = VSUB(Tap, TaE); + TbO = VSUB(TbM, TbN); + TfB = VSUB(TbL, TbO); + STM4(&(ro[62]), TfB, ovs, &(ro[0])); + TfC = VADD(TbL, TbO); + STM4(&(ro[30]), TfC, ovs, &(ro[0])); + } + { + V TbT, Tc0, Tc9, Tca; + TbT = VADD(TbR, TbS); + Tc0 = VADD(TbW, TbZ); + TfD = VSUB(TbT, Tc0); + STM4(&(ro[38]), TfD, ovs, &(ro[0])); + TfE = VADD(TbT, Tc0); + STM4(&(ro[6]), TfE, ovs, &(ro[0])); + Tc9 = VADD(Tc1, Tc2); + Tca = VADD(Tc6, Tc7); + TfF = VSUB(Tc9, Tca); + STM4(&(io[38]), TfF, ovs, &(io[0])); + TfG = VADD(Tc9, Tca); + STM4(&(io[6]), TfG, ovs, &(io[0])); + } + { + V Tc3, Tc4, Tc5, Tc8; + Tc3 = VSUB(Tc1, Tc2); + Tc4 = VSUB(TbZ, TbW); + TfH = VSUB(Tc3, Tc4); + STM4(&(io[54]), TfH, ovs, &(io[0])); + TfI = VADD(Tc3, Tc4); + STM4(&(io[22]), TfI, ovs, &(io[0])); + Tc5 = VSUB(TbR, TbS); + Tc8 = VSUB(Tc6, Tc7); + TfJ = VSUB(Tc5, Tc8); + STM4(&(ro[54]), TfJ, ovs, &(ro[0])); + TfK = VADD(Tc5, Tc8); + STM4(&(ro[22]), TfK, ovs, &(ro[0])); + } + } + { + V T6F, T7h, T7m, T7w, T7p, T7x, T6M, T7s, T6U, T7c, T75, T7r, T78, T7i, T71; + V T7d; + { + V T6D, T6E, T7k, T7l; + T6D = VADD(T37, T3e); + T6E = VADD(T65, T64); + T6F = VSUB(T6D, T6E); + T7h = VADD(T6D, T6E); + T7k = VADD(T6O, T6P); + T7l = VADD(T6R, T6S); + T7m = VFMA(LDK(KP956940335), T7k, VMUL(LDK(KP290284677), T7l)); + T7w = VFNMS(LDK(KP290284677), T7k, VMUL(LDK(KP956940335), T7l)); + } + { + V T7n, T7o, T6I, T6L; + T7n = VADD(T6V, T6W); + T7o = VADD(T6Y, T6Z); + T7p = VFNMS(LDK(KP290284677), T7o, VMUL(LDK(KP956940335), T7n)); + T7x = VFMA(LDK(KP290284677), T7n, VMUL(LDK(KP956940335), T7o)); + T6I = VFNMS(LDK(KP555570233), T6H, VMUL(LDK(KP831469612), T6G)); + T6L = VFMA(LDK(KP831469612), T6J, VMUL(LDK(KP555570233), T6K)); + T6M = VSUB(T6I, T6L); + T7s = VADD(T6I, T6L); + } + { + V T6Q, T6T, T73, T74; + T6Q = VSUB(T6O, T6P); + T6T = VSUB(T6R, T6S); + T6U = VFMA(LDK(KP471396736), T6Q, VMUL(LDK(KP881921264), T6T)); + T7c = VFNMS(LDK(KP881921264), T6Q, VMUL(LDK(KP471396736), T6T)); + T73 = VADD(T5Z, T62); + T74 = VADD(T3m, T3t); + T75 = VSUB(T73, T74); + T7r = VADD(T73, T74); + } + { + V T76, T77, T6X, T70; + T76 = VFNMS(LDK(KP555570233), T6J, VMUL(LDK(KP831469612), T6K)); + T77 = VFMA(LDK(KP555570233), T6G, VMUL(LDK(KP831469612), T6H)); + T78 = VSUB(T76, T77); + T7i = VADD(T77, T76); + T6X = VSUB(T6V, T6W); + T70 = VSUB(T6Y, T6Z); + T71 = VFNMS(LDK(KP881921264), T70, VMUL(LDK(KP471396736), T6X)); + T7d = VFMA(LDK(KP881921264), T6X, VMUL(LDK(KP471396736), T70)); + } + { + V T6N, T72, T7f, T7g; + T6N = VADD(T6F, T6M); + T72 = VADD(T6U, T71); + TfL = VSUB(T6N, T72); + STM4(&(ro[43]), TfL, ovs, &(ro[1])); + TfM = VADD(T6N, T72); + STM4(&(ro[11]), TfM, ovs, &(ro[1])); + T7f = VADD(T75, T78); + T7g = VADD(T7c, T7d); + TfN = VSUB(T7f, T7g); + STM4(&(io[43]), TfN, ovs, &(io[1])); + TfO = VADD(T7f, T7g); + STM4(&(io[11]), TfO, ovs, &(io[1])); + } + { + V T79, T7a, T7b, T7e; + T79 = VSUB(T75, T78); + T7a = VSUB(T71, T6U); + TfP = VSUB(T79, T7a); + STM4(&(io[59]), TfP, ovs, &(io[1])); + TfQ = VADD(T79, T7a); + STM4(&(io[27]), TfQ, ovs, &(io[1])); + T7b = VSUB(T6F, T6M); + T7e = VSUB(T7c, T7d); + TfR = VSUB(T7b, T7e); + STM4(&(ro[59]), TfR, ovs, &(ro[1])); + TfS = VADD(T7b, T7e); + STM4(&(ro[27]), TfS, ovs, &(ro[1])); + } + { + V T7j, T7q, T7z, T7A; + T7j = VADD(T7h, T7i); + T7q = VADD(T7m, T7p); + TfT = VSUB(T7j, T7q); + STM4(&(ro[35]), TfT, ovs, &(ro[1])); + TfU = VADD(T7j, T7q); + STM4(&(ro[3]), TfU, ovs, &(ro[1])); + T7z = VADD(T7r, T7s); + T7A = VADD(T7w, T7x); + TfV = VSUB(T7z, T7A); + STM4(&(io[35]), TfV, ovs, &(io[1])); + TfW = VADD(T7z, T7A); + STM4(&(io[3]), TfW, ovs, &(io[1])); + } + { + V T7t, T7u, T7v, T7y; + T7t = VSUB(T7r, T7s); + T7u = VSUB(T7p, T7m); + TfX = VSUB(T7t, T7u); + STM4(&(io[51]), TfX, ovs, &(io[1])); + TfY = VADD(T7t, T7u); + STM4(&(io[19]), TfY, ovs, &(io[1])); + T7v = VSUB(T7h, T7i); + T7y = VSUB(T7w, T7x); + TfZ = VSUB(T7v, T7y); + STM4(&(ro[51]), TfZ, ovs, &(ro[1])); + Tg0 = VADD(T7v, T7y); + STM4(&(ro[19]), Tg0, ovs, &(ro[1])); + } + } + { + V T9j, T9V, Ta0, Taa, Ta3, Tab, T9q, Ta6, T9y, T9Q, T9J, Ta5, T9M, T9W, T9F; + V T9R; + { + V T9h, T9i, T9Y, T9Z; + T9h = VADD(T7B, T7C); + T9i = VADD(T8J, T8I); + T9j = VSUB(T9h, T9i); + T9V = VADD(T9h, T9i); + T9Y = VADD(T9s, T9t); + T9Z = VADD(T9v, T9w); + Ta0 = VFMA(LDK(KP995184726), T9Y, VMUL(LDK(KP098017140), T9Z)); + Taa = VFNMS(LDK(KP098017140), T9Y, VMUL(LDK(KP995184726), T9Z)); + } + { + V Ta1, Ta2, T9m, T9p; + Ta1 = VADD(T9z, T9A); + Ta2 = VADD(T9C, T9D); + Ta3 = VFNMS(LDK(KP098017140), Ta2, VMUL(LDK(KP995184726), Ta1)); + Tab = VFMA(LDK(KP098017140), Ta1, VMUL(LDK(KP995184726), Ta2)); + T9m = VFNMS(LDK(KP195090322), T9l, VMUL(LDK(KP980785280), T9k)); + T9p = VFMA(LDK(KP195090322), T9n, VMUL(LDK(KP980785280), T9o)); + T9q = VSUB(T9m, T9p); + Ta6 = VADD(T9m, T9p); + } + { + V T9u, T9x, T9H, T9I; + T9u = VSUB(T9s, T9t); + T9x = VSUB(T9v, T9w); + T9y = VFMA(LDK(KP634393284), T9u, VMUL(LDK(KP773010453), T9x)); + T9Q = VFNMS(LDK(KP773010453), T9u, VMUL(LDK(KP634393284), T9x)); + T9H = VADD(T8F, T8G); + T9I = VADD(T7G, T7J); + T9J = VSUB(T9H, T9I); + Ta5 = VADD(T9H, T9I); + } + { + V T9K, T9L, T9B, T9E; + T9K = VFNMS(LDK(KP195090322), T9o, VMUL(LDK(KP980785280), T9n)); + T9L = VFMA(LDK(KP980785280), T9l, VMUL(LDK(KP195090322), T9k)); + T9M = VSUB(T9K, T9L); + T9W = VADD(T9L, T9K); + T9B = VSUB(T9z, T9A); + T9E = VSUB(T9C, T9D); + T9F = VFNMS(LDK(KP773010453), T9E, VMUL(LDK(KP634393284), T9B)); + T9R = VFMA(LDK(KP773010453), T9B, VMUL(LDK(KP634393284), T9E)); + } + { + V T9r, T9G, Tg1, Tg2; + T9r = VADD(T9j, T9q); + T9G = VADD(T9y, T9F); + Tg1 = VSUB(T9r, T9G); + STM4(&(ro[41]), Tg1, ovs, &(ro[1])); + STN4(&(ro[40]), TeR, Tg1, Tff, TfL, ovs); + Tg2 = VADD(T9r, T9G); + STM4(&(ro[9]), Tg2, ovs, &(ro[1])); + STN4(&(ro[8]), TeS, Tg2, Tfg, TfM, ovs); + } + { + V T9T, T9U, Tg3, Tg4; + T9T = VADD(T9J, T9M); + T9U = VADD(T9Q, T9R); + Tg3 = VSUB(T9T, T9U); + STM4(&(io[41]), Tg3, ovs, &(io[1])); + STN4(&(io[40]), TeT, Tg3, Tfh, TfN, ovs); + Tg4 = VADD(T9T, T9U); + STM4(&(io[9]), Tg4, ovs, &(io[1])); + STN4(&(io[8]), TeU, Tg4, Tfi, TfO, ovs); + } + { + V T9N, T9O, Tg5, Tg6; + T9N = VSUB(T9J, T9M); + T9O = VSUB(T9F, T9y); + Tg5 = VSUB(T9N, T9O); + STM4(&(io[57]), Tg5, ovs, &(io[1])); + STN4(&(io[56]), TeV, Tg5, Tfj, TfP, ovs); + Tg6 = VADD(T9N, T9O); + STM4(&(io[25]), Tg6, ovs, &(io[1])); + STN4(&(io[24]), TeW, Tg6, Tfk, TfQ, ovs); + } + { + V T9P, T9S, Tg7, Tg8; + T9P = VSUB(T9j, T9q); + T9S = VSUB(T9Q, T9R); + Tg7 = VSUB(T9P, T9S); + STM4(&(ro[57]), Tg7, ovs, &(ro[1])); + STN4(&(ro[56]), TeX, Tg7, Tfl, TfR, ovs); + Tg8 = VADD(T9P, T9S); + STM4(&(ro[25]), Tg8, ovs, &(ro[1])); + STN4(&(ro[24]), TeY, Tg8, Tfm, TfS, ovs); + } + { + V T9X, Ta4, Tg9, Tga; + T9X = VADD(T9V, T9W); + Ta4 = VADD(Ta0, Ta3); + Tg9 = VSUB(T9X, Ta4); + STM4(&(ro[33]), Tg9, ovs, &(ro[1])); + STN4(&(ro[32]), TeJ, Tg9, Tfn, TfT, ovs); + Tga = VADD(T9X, Ta4); + STM4(&(ro[1]), Tga, ovs, &(ro[1])); + STN4(&(ro[0]), TeL, Tga, Tfo, TfU, ovs); + } + { + V Tad, Tae, Tgb, Tgc; + Tad = VADD(Ta5, Ta6); + Tae = VADD(Taa, Tab); + Tgb = VSUB(Tad, Tae); + STM4(&(io[33]), Tgb, ovs, &(io[1])); + STN4(&(io[32]), TeK, Tgb, Tfp, TfV, ovs); + Tgc = VADD(Tad, Tae); + STM4(&(io[1]), Tgc, ovs, &(io[1])); + STN4(&(io[0]), TeM, Tgc, Tfq, TfW, ovs); + } + { + V Ta7, Ta8, Tgd, Tge; + Ta7 = VSUB(Ta5, Ta6); + Ta8 = VSUB(Ta3, Ta0); + Tgd = VSUB(Ta7, Ta8); + STM4(&(io[49]), Tgd, ovs, &(io[1])); + STN4(&(io[48]), TeP, Tgd, Tfr, TfX, ovs); + Tge = VADD(Ta7, Ta8); + STM4(&(io[17]), Tge, ovs, &(io[1])); + STN4(&(io[16]), TeN, Tge, Tfs, TfY, ovs); + } + { + V Ta9, Tac, Tgf, Tgg; + Ta9 = VSUB(T9V, T9W); + Tac = VSUB(Taa, Tab); + Tgf = VSUB(Ta9, Tac); + STM4(&(ro[49]), Tgf, ovs, &(ro[1])); + STN4(&(ro[48]), TeQ, Tgf, Tft, TfZ, ovs); + Tgg = VADD(Ta9, Tac); + STM4(&(ro[17]), Tgg, ovs, &(ro[1])); + STN4(&(ro[16]), TeO, Tgg, Tfu, Tg0, ovs); + } + } + { + V Tgh, Tgi, Tgj, Tgk, Tgl, Tgm, Tgn, Tgo, Tgp, Tgq, Tgr, Tgs, Tgt, Tgu, Tgv; + V Tgw; + { + V T3v, T6j, T6o, T6y, T6r, T6z, T48, T6u, T52, T6e, T67, T6t, T6a, T6k, T5V; + V T6f; + { + V T3f, T3u, T6m, T6n; + T3f = VSUB(T37, T3e); + T3u = VSUB(T3m, T3t); + T3v = VSUB(T3f, T3u); + T6j = VADD(T3f, T3u); + T6m = VADD(T4q, T4N); + T6n = VADD(T4X, T50); + T6o = VFMA(LDK(KP634393284), T6m, VMUL(LDK(KP773010453), T6n)); + T6y = VFNMS(LDK(KP634393284), T6n, VMUL(LDK(KP773010453), T6m)); + } + { + V T6p, T6q, T3O, T47; + T6p = VADD(T5j, T5G); + T6q = VADD(T5Q, T5T); + T6r = VFNMS(LDK(KP634393284), T6q, VMUL(LDK(KP773010453), T6p)); + T6z = VFMA(LDK(KP773010453), T6q, VMUL(LDK(KP634393284), T6p)); + T3O = VFNMS(LDK(KP980785280), T3N, VMUL(LDK(KP195090322), T3G)); + T47 = VFMA(LDK(KP195090322), T3Z, VMUL(LDK(KP980785280), T46)); + T48 = VSUB(T3O, T47); + T6u = VADD(T3O, T47); + } + { + V T4O, T51, T63, T66; + T4O = VSUB(T4q, T4N); + T51 = VSUB(T4X, T50); + T52 = VFMA(LDK(KP995184726), T4O, VMUL(LDK(KP098017140), T51)); + T6e = VFNMS(LDK(KP995184726), T51, VMUL(LDK(KP098017140), T4O)); + T63 = VSUB(T5Z, T62); + T66 = VSUB(T64, T65); + T67 = VSUB(T63, T66); + T6t = VADD(T63, T66); + } + { + V T68, T69, T5H, T5U; + T68 = VFNMS(LDK(KP980785280), T3Z, VMUL(LDK(KP195090322), T46)); + T69 = VFMA(LDK(KP980785280), T3G, VMUL(LDK(KP195090322), T3N)); + T6a = VSUB(T68, T69); + T6k = VADD(T69, T68); + T5H = VSUB(T5j, T5G); + T5U = VSUB(T5Q, T5T); + T5V = VFNMS(LDK(KP995184726), T5U, VMUL(LDK(KP098017140), T5H)); + T6f = VFMA(LDK(KP098017140), T5U, VMUL(LDK(KP995184726), T5H)); + } + { + V T49, T5W, T6h, T6i; + T49 = VADD(T3v, T48); + T5W = VADD(T52, T5V); + Tgh = VSUB(T49, T5W); + STM4(&(ro[47]), Tgh, ovs, &(ro[1])); + Tgi = VADD(T49, T5W); + STM4(&(ro[15]), Tgi, ovs, &(ro[1])); + T6h = VADD(T67, T6a); + T6i = VADD(T6e, T6f); + Tgj = VSUB(T6h, T6i); + STM4(&(io[47]), Tgj, ovs, &(io[1])); + Tgk = VADD(T6h, T6i); + STM4(&(io[15]), Tgk, ovs, &(io[1])); + } + { + V T6b, T6c, T6d, T6g; + T6b = VSUB(T67, T6a); + T6c = VSUB(T5V, T52); + Tgl = VSUB(T6b, T6c); + STM4(&(io[63]), Tgl, ovs, &(io[1])); + Tgm = VADD(T6b, T6c); + STM4(&(io[31]), Tgm, ovs, &(io[1])); + T6d = VSUB(T3v, T48); + T6g = VSUB(T6e, T6f); + Tgn = VSUB(T6d, T6g); + STM4(&(ro[63]), Tgn, ovs, &(ro[1])); + Tgo = VADD(T6d, T6g); + STM4(&(ro[31]), Tgo, ovs, &(ro[1])); + } + { + V T6l, T6s, T6B, T6C; + T6l = VADD(T6j, T6k); + T6s = VADD(T6o, T6r); + Tgp = VSUB(T6l, T6s); + STM4(&(ro[39]), Tgp, ovs, &(ro[1])); + Tgq = VADD(T6l, T6s); + STM4(&(ro[7]), Tgq, ovs, &(ro[1])); + T6B = VADD(T6t, T6u); + T6C = VADD(T6y, T6z); + Tgr = VSUB(T6B, T6C); + STM4(&(io[39]), Tgr, ovs, &(io[1])); + Tgs = VADD(T6B, T6C); + STM4(&(io[7]), Tgs, ovs, &(io[1])); + } + { + V T6v, T6w, T6x, T6A; + T6v = VSUB(T6t, T6u); + T6w = VSUB(T6r, T6o); + Tgt = VSUB(T6v, T6w); + STM4(&(io[55]), Tgt, ovs, &(io[1])); + Tgu = VADD(T6v, T6w); + STM4(&(io[23]), Tgu, ovs, &(io[1])); + T6x = VSUB(T6j, T6k); + T6A = VSUB(T6y, T6z); + Tgv = VSUB(T6x, T6A); + STM4(&(ro[55]), Tgv, ovs, &(ro[1])); + Tgw = VADD(T6x, T6A); + STM4(&(ro[23]), Tgw, ovs, &(ro[1])); + } + } + { + V T7L, T8X, T92, T9c, T95, T9d, T80, T98, T8k, T8S, T8L, T97, T8O, T8Y, T8D; + V T8T; + { + V T7D, T7K, T90, T91; + T7D = VSUB(T7B, T7C); + T7K = VSUB(T7G, T7J); + T7L = VSUB(T7D, T7K); + T8X = VADD(T7D, T7K); + T90 = VADD(T84, T8b); + T91 = VADD(T8f, T8i); + T92 = VFMA(LDK(KP471396736), T90, VMUL(LDK(KP881921264), T91)); + T9c = VFNMS(LDK(KP471396736), T91, VMUL(LDK(KP881921264), T90)); + } + { + V T93, T94, T7S, T7Z; + T93 = VADD(T8n, T8u); + T94 = VADD(T8y, T8B); + T95 = VFNMS(LDK(KP471396736), T94, VMUL(LDK(KP881921264), T93)); + T9d = VFMA(LDK(KP881921264), T94, VMUL(LDK(KP471396736), T93)); + T7S = VFNMS(LDK(KP831469612), T7R, VMUL(LDK(KP555570233), T7O)); + T7Z = VFMA(LDK(KP831469612), T7V, VMUL(LDK(KP555570233), T7Y)); + T80 = VSUB(T7S, T7Z); + T98 = VADD(T7S, T7Z); + } + { + V T8c, T8j, T8H, T8K; + T8c = VSUB(T84, T8b); + T8j = VSUB(T8f, T8i); + T8k = VFMA(LDK(KP956940335), T8c, VMUL(LDK(KP290284677), T8j)); + T8S = VFNMS(LDK(KP956940335), T8j, VMUL(LDK(KP290284677), T8c)); + T8H = VSUB(T8F, T8G); + T8K = VSUB(T8I, T8J); + T8L = VSUB(T8H, T8K); + T97 = VADD(T8H, T8K); + } + { + V T8M, T8N, T8v, T8C; + T8M = VFNMS(LDK(KP831469612), T7Y, VMUL(LDK(KP555570233), T7V)); + T8N = VFMA(LDK(KP555570233), T7R, VMUL(LDK(KP831469612), T7O)); + T8O = VSUB(T8M, T8N); + T8Y = VADD(T8N, T8M); + T8v = VSUB(T8n, T8u); + T8C = VSUB(T8y, T8B); + T8D = VFNMS(LDK(KP956940335), T8C, VMUL(LDK(KP290284677), T8v)); + T8T = VFMA(LDK(KP290284677), T8C, VMUL(LDK(KP956940335), T8v)); + } + { + V T81, T8E, Tgx, Tgy; + T81 = VADD(T7L, T80); + T8E = VADD(T8k, T8D); + Tgx = VSUB(T81, T8E); + STM4(&(ro[45]), Tgx, ovs, &(ro[1])); + STN4(&(ro[44]), TeZ, Tgx, Tfv, Tgh, ovs); + Tgy = VADD(T81, T8E); + STM4(&(ro[13]), Tgy, ovs, &(ro[1])); + STN4(&(ro[12]), Tf0, Tgy, Tfw, Tgi, ovs); + } + { + V T8V, T8W, Tgz, TgA; + T8V = VADD(T8L, T8O); + T8W = VADD(T8S, T8T); + Tgz = VSUB(T8V, T8W); + STM4(&(io[45]), Tgz, ovs, &(io[1])); + STN4(&(io[44]), Tf1, Tgz, Tfx, Tgj, ovs); + TgA = VADD(T8V, T8W); + STM4(&(io[13]), TgA, ovs, &(io[1])); + STN4(&(io[12]), Tf2, TgA, Tfy, Tgk, ovs); + } + { + V T8P, T8Q, TgB, TgC; + T8P = VSUB(T8L, T8O); + T8Q = VSUB(T8D, T8k); + TgB = VSUB(T8P, T8Q); + STM4(&(io[61]), TgB, ovs, &(io[1])); + STN4(&(io[60]), Tf3, TgB, Tfz, Tgl, ovs); + TgC = VADD(T8P, T8Q); + STM4(&(io[29]), TgC, ovs, &(io[1])); + STN4(&(io[28]), Tf4, TgC, TfA, Tgm, ovs); + } + { + V T8R, T8U, TgD, TgE; + T8R = VSUB(T7L, T80); + T8U = VSUB(T8S, T8T); + TgD = VSUB(T8R, T8U); + STM4(&(ro[61]), TgD, ovs, &(ro[1])); + STN4(&(ro[60]), Tf5, TgD, TfB, Tgn, ovs); + TgE = VADD(T8R, T8U); + STM4(&(ro[29]), TgE, ovs, &(ro[1])); + STN4(&(ro[28]), Tf6, TgE, TfC, Tgo, ovs); + } + { + V T8Z, T96, TgF, TgG; + T8Z = VADD(T8X, T8Y); + T96 = VADD(T92, T95); + TgF = VSUB(T8Z, T96); + STM4(&(ro[37]), TgF, ovs, &(ro[1])); + STN4(&(ro[36]), Tf7, TgF, TfD, Tgp, ovs); + TgG = VADD(T8Z, T96); + STM4(&(ro[5]), TgG, ovs, &(ro[1])); + STN4(&(ro[4]), Tf8, TgG, TfE, Tgq, ovs); + } + { + V T9f, T9g, TgH, TgI; + T9f = VADD(T97, T98); + T9g = VADD(T9c, T9d); + TgH = VSUB(T9f, T9g); + STM4(&(io[37]), TgH, ovs, &(io[1])); + STN4(&(io[36]), Tf9, TgH, TfF, Tgr, ovs); + TgI = VADD(T9f, T9g); + STM4(&(io[5]), TgI, ovs, &(io[1])); + STN4(&(io[4]), Tfa, TgI, TfG, Tgs, ovs); + } + { + V T99, T9a, TgJ, TgK; + T99 = VSUB(T97, T98); + T9a = VSUB(T95, T92); + TgJ = VSUB(T99, T9a); + STM4(&(io[53]), TgJ, ovs, &(io[1])); + STN4(&(io[52]), Tfb, TgJ, TfH, Tgt, ovs); + TgK = VADD(T99, T9a); + STM4(&(io[21]), TgK, ovs, &(io[1])); + STN4(&(io[20]), Tfc, TgK, TfI, Tgu, ovs); + } + { + V T9b, T9e, TgL, TgM; + T9b = VSUB(T8X, T8Y); + T9e = VSUB(T9c, T9d); + TgL = VSUB(T9b, T9e); + STM4(&(ro[53]), TgL, ovs, &(ro[1])); + STN4(&(ro[52]), Tfd, TgL, TfJ, Tgv, ovs); + TgM = VADD(T9b, T9e); + STM4(&(ro[21]), TgM, ovs, &(ro[1])); + STN4(&(ro[20]), Tfe, TgM, TfK, Tgw, ovs); + } + } + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 64, XSIMD_STRING("n2sv_64"), {808, 144, 104, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_64) (planner *p) { + X(kdft_register) (p, n2sv_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_8.c new file mode 100644 index 000000000..08f61e9ba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/n2sv_8.c @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:19 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_notw.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name n2sv_8 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 52 FP additions, 8 FP multiplications, + * (or, 44 additions, 0 multiplications, 8 fused multiply/add), + * 34 stack variables, 1 constants, and 36 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V T3, Tn, Ti, TC, T6, TB, Tl, To, Td, TN, Tz, TH, Ta, TM, Tu; + V TG; + { + V T1, T2, Tj, Tk; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + Tn = VSUB(T1, T2); + { + V Tg, Th, T4, T5; + Tg = LD(&(ii[0]), ivs, &(ii[0])); + Th = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + Ti = VADD(Tg, Th); + TC = VSUB(Tg, Th); + T4 = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + TB = VSUB(T4, T5); + } + Tj = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + Tk = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + Tl = VADD(Tj, Tk); + To = VSUB(Tj, Tk); + { + V Tb, Tc, Tv, Tw, Tx, Ty; + Tb = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + Tc = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + Tv = VSUB(Tb, Tc); + Tw = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + Tx = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + Ty = VSUB(Tw, Tx); + Td = VADD(Tb, Tc); + TN = VADD(Tw, Tx); + Tz = VSUB(Tv, Ty); + TH = VADD(Tv, Ty); + } + { + V T8, T9, Tq, Tr, Ts, Tt; + T8 = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + T9 = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + Tq = VSUB(T8, T9); + Tr = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + Ts = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + Tt = VSUB(Tr, Ts); + Ta = VADD(T8, T9); + TM = VADD(Tr, Ts); + Tu = VADD(Tq, Tt); + TG = VSUB(Tt, Tq); + } + } + { + V TR, TS, TT, TU, TV, TW, TX, TY; + { + V T7, Te, TP, TQ; + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + TR = VSUB(T7, Te); + STM4(&(ro[4]), TR, ovs, &(ro[0])); + TS = VADD(T7, Te); + STM4(&(ro[0]), TS, ovs, &(ro[0])); + TP = VADD(Ti, Tl); + TQ = VADD(TM, TN); + TT = VSUB(TP, TQ); + STM4(&(io[4]), TT, ovs, &(io[0])); + TU = VADD(TP, TQ); + STM4(&(io[0]), TU, ovs, &(io[0])); + } + { + V Tf, Tm, TL, TO; + Tf = VSUB(Td, Ta); + Tm = VSUB(Ti, Tl); + TV = VADD(Tf, Tm); + STM4(&(io[2]), TV, ovs, &(io[0])); + TW = VSUB(Tm, Tf); + STM4(&(io[6]), TW, ovs, &(io[0])); + TL = VSUB(T3, T6); + TO = VSUB(TM, TN); + TX = VSUB(TL, TO); + STM4(&(ro[6]), TX, ovs, &(ro[0])); + TY = VADD(TL, TO); + STM4(&(ro[2]), TY, ovs, &(ro[0])); + } + { + V TZ, T10, T11, T12; + { + V Tp, TA, TJ, TK; + Tp = VADD(Tn, To); + TA = VADD(Tu, Tz); + TZ = VFNMS(LDK(KP707106781), TA, Tp); + STM4(&(ro[5]), TZ, ovs, &(ro[1])); + T10 = VFMA(LDK(KP707106781), TA, Tp); + STM4(&(ro[1]), T10, ovs, &(ro[1])); + TJ = VSUB(TC, TB); + TK = VADD(TG, TH); + T11 = VFNMS(LDK(KP707106781), TK, TJ); + STM4(&(io[5]), T11, ovs, &(io[1])); + T12 = VFMA(LDK(KP707106781), TK, TJ); + STM4(&(io[1]), T12, ovs, &(io[1])); + } + { + V TD, TE, T13, T14; + TD = VADD(TB, TC); + TE = VSUB(Tz, Tu); + T13 = VFNMS(LDK(KP707106781), TE, TD); + STM4(&(io[7]), T13, ovs, &(io[1])); + STN4(&(io[4]), TT, T11, TW, T13, ovs); + T14 = VFMA(LDK(KP707106781), TE, TD); + STM4(&(io[3]), T14, ovs, &(io[1])); + STN4(&(io[0]), TU, T12, TV, T14, ovs); + } + { + V TF, TI, T15, T16; + TF = VSUB(Tn, To); + TI = VSUB(TG, TH); + T15 = VFNMS(LDK(KP707106781), TI, TF); + STM4(&(ro[7]), T15, ovs, &(ro[1])); + STN4(&(ro[4]), TR, TZ, TX, T15, ovs); + T16 = VFMA(LDK(KP707106781), TI, TF); + STM4(&(ro[3]), T16, ovs, &(ro[1])); + STN4(&(ro[0]), TS, T10, TY, T16, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n2sv_8"), {44, 0, 8, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_8) (planner *p) { + X(kdft_register) (p, n2sv_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_notw.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name n2sv_8 -with-ostride 1 -include dft/simd/n2s.h -store-multiple 4 */ + +/* + * This function contains 52 FP additions, 4 FP multiplications, + * (or, 52 additions, 4 multiplications, 0 fused multiply/add), + * 34 stack variables, 1 constants, and 36 memory accesses + */ +#include "dft/simd/n2s.h" + +static void n2sv_8(const R *ri, const R *ii, R *ro, R *io, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - (2 * VL), ri = ri + ((2 * VL) * ivs), ii = ii + ((2 * VL) * ivs), ro = ro + ((2 * VL) * ovs), io = io + ((2 * VL) * ovs), MAKE_VOLATILE_STRIDE(32, is), MAKE_VOLATILE_STRIDE(32, os)) { + V T3, Tn, Ti, TC, T6, TB, Tl, To, Td, TN, Tz, TH, Ta, TM, Tu; + V TG; + { + V T1, T2, Tj, Tk; + T1 = LD(&(ri[0]), ivs, &(ri[0])); + T2 = LD(&(ri[WS(is, 4)]), ivs, &(ri[0])); + T3 = VADD(T1, T2); + Tn = VSUB(T1, T2); + { + V Tg, Th, T4, T5; + Tg = LD(&(ii[0]), ivs, &(ii[0])); + Th = LD(&(ii[WS(is, 4)]), ivs, &(ii[0])); + Ti = VADD(Tg, Th); + TC = VSUB(Tg, Th); + T4 = LD(&(ri[WS(is, 2)]), ivs, &(ri[0])); + T5 = LD(&(ri[WS(is, 6)]), ivs, &(ri[0])); + T6 = VADD(T4, T5); + TB = VSUB(T4, T5); + } + Tj = LD(&(ii[WS(is, 2)]), ivs, &(ii[0])); + Tk = LD(&(ii[WS(is, 6)]), ivs, &(ii[0])); + Tl = VADD(Tj, Tk); + To = VSUB(Tj, Tk); + { + V Tb, Tc, Tv, Tw, Tx, Ty; + Tb = LD(&(ri[WS(is, 7)]), ivs, &(ri[WS(is, 1)])); + Tc = LD(&(ri[WS(is, 3)]), ivs, &(ri[WS(is, 1)])); + Tv = VSUB(Tb, Tc); + Tw = LD(&(ii[WS(is, 7)]), ivs, &(ii[WS(is, 1)])); + Tx = LD(&(ii[WS(is, 3)]), ivs, &(ii[WS(is, 1)])); + Ty = VSUB(Tw, Tx); + Td = VADD(Tb, Tc); + TN = VADD(Tw, Tx); + Tz = VSUB(Tv, Ty); + TH = VADD(Tv, Ty); + } + { + V T8, T9, Tq, Tr, Ts, Tt; + T8 = LD(&(ri[WS(is, 1)]), ivs, &(ri[WS(is, 1)])); + T9 = LD(&(ri[WS(is, 5)]), ivs, &(ri[WS(is, 1)])); + Tq = VSUB(T8, T9); + Tr = LD(&(ii[WS(is, 1)]), ivs, &(ii[WS(is, 1)])); + Ts = LD(&(ii[WS(is, 5)]), ivs, &(ii[WS(is, 1)])); + Tt = VSUB(Tr, Ts); + Ta = VADD(T8, T9); + TM = VADD(Tr, Ts); + Tu = VADD(Tq, Tt); + TG = VSUB(Tt, Tq); + } + } + { + V TR, TS, TT, TU, TV, TW, TX, TY; + { + V T7, Te, TP, TQ; + T7 = VADD(T3, T6); + Te = VADD(Ta, Td); + TR = VSUB(T7, Te); + STM4(&(ro[4]), TR, ovs, &(ro[0])); + TS = VADD(T7, Te); + STM4(&(ro[0]), TS, ovs, &(ro[0])); + TP = VADD(Ti, Tl); + TQ = VADD(TM, TN); + TT = VSUB(TP, TQ); + STM4(&(io[4]), TT, ovs, &(io[0])); + TU = VADD(TP, TQ); + STM4(&(io[0]), TU, ovs, &(io[0])); + } + { + V Tf, Tm, TL, TO; + Tf = VSUB(Td, Ta); + Tm = VSUB(Ti, Tl); + TV = VADD(Tf, Tm); + STM4(&(io[2]), TV, ovs, &(io[0])); + TW = VSUB(Tm, Tf); + STM4(&(io[6]), TW, ovs, &(io[0])); + TL = VSUB(T3, T6); + TO = VSUB(TM, TN); + TX = VSUB(TL, TO); + STM4(&(ro[6]), TX, ovs, &(ro[0])); + TY = VADD(TL, TO); + STM4(&(ro[2]), TY, ovs, &(ro[0])); + } + { + V TZ, T10, T11, T12; + { + V Tp, TA, TJ, TK; + Tp = VADD(Tn, To); + TA = VMUL(LDK(KP707106781), VADD(Tu, Tz)); + TZ = VSUB(Tp, TA); + STM4(&(ro[5]), TZ, ovs, &(ro[1])); + T10 = VADD(Tp, TA); + STM4(&(ro[1]), T10, ovs, &(ro[1])); + TJ = VSUB(TC, TB); + TK = VMUL(LDK(KP707106781), VADD(TG, TH)); + T11 = VSUB(TJ, TK); + STM4(&(io[5]), T11, ovs, &(io[1])); + T12 = VADD(TJ, TK); + STM4(&(io[1]), T12, ovs, &(io[1])); + } + { + V TD, TE, T13, T14; + TD = VADD(TB, TC); + TE = VMUL(LDK(KP707106781), VSUB(Tz, Tu)); + T13 = VSUB(TD, TE); + STM4(&(io[7]), T13, ovs, &(io[1])); + STN4(&(io[4]), TT, T11, TW, T13, ovs); + T14 = VADD(TD, TE); + STM4(&(io[3]), T14, ovs, &(io[1])); + STN4(&(io[0]), TU, T12, TV, T14, ovs); + } + { + V TF, TI, T15, T16; + TF = VSUB(Tn, To); + TI = VMUL(LDK(KP707106781), VSUB(TG, TH)); + T15 = VSUB(TF, TI); + STM4(&(ro[7]), T15, ovs, &(ro[1])); + STN4(&(ro[4]), TR, TZ, TX, T15, ovs); + T16 = VADD(TF, TI); + STM4(&(ro[3]), T16, ovs, &(ro[1])); + STN4(&(ro[0]), TS, T10, TY, T16, ovs); + } + } + } + } + } + VLEAVE(); +} + +static const kdft_desc desc = { 8, XSIMD_STRING("n2sv_8"), {52, 4, 0, 0}, &GENUS, 0, 1, 0, 0 }; + +void XSIMD(codelet_n2sv_8) (planner *p) { + X(kdft_register) (p, n2sv_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_2.c new file mode 100644 index 000000000..0190a7ebc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_2.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -dif -name q1bv_2 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 6 additions, 4 multiplications, 0 fused multiply/add), + * 8 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_2(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(4, rs), MAKE_VOLATILE_STRIDE(4, vs)) { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), VSUB(T1, T2)); + T4 = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + T5 = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + T6 = BYTW(&(W[0]), VSUB(T4, T5)); + ST(&(x[WS(vs, 1)]), T3, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), T6, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T2), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T4, T5), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("q1bv_2"), twinstr, &GENUS, {6, 4, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_2) (planner *p) { + X(kdft_difsq_register) (p, q1bv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -dif -name q1bv_2 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 6 additions, 4 multiplications, 0 fused multiply/add), + * 8 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_2(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(4, rs), MAKE_VOLATILE_STRIDE(4, vs)) { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), VSUB(T1, T2)); + T4 = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + T5 = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + T6 = BYTW(&(W[0]), VSUB(T4, T5)); + ST(&(x[WS(vs, 1)]), T3, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), T6, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T2), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T4, T5), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("q1bv_2"), twinstr, &GENUS, {6, 4, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_2) (planner *p) { + X(kdft_difsq_register) (p, q1bv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_4.c new file mode 100644 index 000000000..130c203ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_4.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -dif -name q1bv_4 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 44 FP additions, 32 FP multiplications, + * (or, 36 additions, 24 multiplications, 8 fused multiply/add), + * 22 stack variables, 0 constants, and 32 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_4(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, vs)) { + V T3, T9, TA, TG, TD, TH, T6, Ta, Te, Tk, Tp, Tv, Ts, Tw, Th; + V Tl; + { + V T1, T2, Ty, Tz; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = VSUB(T1, T2); + T9 = VADD(T1, T2); + Ty = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + Tz = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + TA = VSUB(Ty, Tz); + TG = VADD(Ty, Tz); + } + { + V TB, TC, T4, T5; + TB = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TD = VSUB(TB, TC); + TH = VADD(TB, TC); + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + Ta = VADD(T4, T5); + } + { + V Tc, Td, Tn, To; + Tc = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Td = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + Tn = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + To = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + Tp = VSUB(Tn, To); + Tv = VADD(Tn, To); + } + { + V Tq, Tr, Tf, Tg; + Tq = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tr = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Ts = VSUB(Tq, Tr); + Tw = VADD(Tq, Tr); + Tf = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tg = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Th = VSUB(Tf, Tg); + Tl = VADD(Tf, Tg); + } + ST(&(x[0]), VADD(T9, Ta), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tk, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(Tv, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(TG, TH), ms, &(x[WS(rs, 1)])); + { + V T7, Ti, Tt, TE; + T7 = BYTW(&(W[TWVL * 4]), VFNMSI(T6, T3)); + ST(&(x[WS(vs, 3)]), T7, ms, &(x[WS(vs, 3)])); + Ti = BYTW(&(W[TWVL * 4]), VFNMSI(Th, Te)); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), Ti, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 4]), VFNMSI(Ts, Tp)); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), Tt, ms, &(x[WS(vs, 3)])); + TE = BYTW(&(W[TWVL * 4]), VFNMSI(TD, TA)); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), TE, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T8, Tj, Tu, TF; + T8 = BYTW(&(W[0]), VFMAI(T6, T3)); + ST(&(x[WS(vs, 1)]), T8, ms, &(x[WS(vs, 1)])); + Tj = BYTW(&(W[0]), VFMAI(Th, Te)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Tj, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tu = BYTW(&(W[0]), VFMAI(Ts, Tp)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), Tu, ms, &(x[WS(vs, 1)])); + TF = BYTW(&(W[0]), VFMAI(TD, TA)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), TF, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V Tb, Tm, Tx, TI; + Tb = BYTW(&(W[TWVL * 2]), VSUB(T9, Ta)); + ST(&(x[WS(vs, 2)]), Tb, ms, &(x[WS(vs, 2)])); + Tm = BYTW(&(W[TWVL * 2]), VSUB(Tk, Tl)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), Tm, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tx = BYTW(&(W[TWVL * 2]), VSUB(Tv, Tw)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), Tx, ms, &(x[WS(vs, 2)])); + TI = BYTW(&(W[TWVL * 2]), VSUB(TG, TH)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), TI, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("q1bv_4"), twinstr, &GENUS, {36, 24, 8, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_4) (planner *p) { + X(kdft_difsq_register) (p, q1bv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -dif -name q1bv_4 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 44 FP additions, 24 FP multiplications, + * (or, 44 additions, 24 multiplications, 0 fused multiply/add), + * 22 stack variables, 0 constants, and 32 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_4(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, vs)) { + V T3, T9, TA, TG, TD, TH, T6, Ta, Te, Tk, Tp, Tv, Ts, Tw, Th; + V Tl; + { + V T1, T2, Ty, Tz; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = VSUB(T1, T2); + T9 = VADD(T1, T2); + Ty = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + Tz = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + TA = VSUB(Ty, Tz); + TG = VADD(Ty, Tz); + } + { + V TB, TC, T4, T5; + TB = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TD = VBYI(VSUB(TB, TC)); + TH = VADD(TB, TC); + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VBYI(VSUB(T4, T5)); + Ta = VADD(T4, T5); + } + { + V Tc, Td, Tn, To; + Tc = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Td = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + Tn = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + To = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + Tp = VSUB(Tn, To); + Tv = VADD(Tn, To); + } + { + V Tq, Tr, Tf, Tg; + Tq = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tr = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Ts = VBYI(VSUB(Tq, Tr)); + Tw = VADD(Tq, Tr); + Tf = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tg = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Th = VBYI(VSUB(Tf, Tg)); + Tl = VADD(Tf, Tg); + } + ST(&(x[0]), VADD(T9, Ta), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tk, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(Tv, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(TG, TH), ms, &(x[WS(rs, 1)])); + { + V T7, Ti, Tt, TE; + T7 = BYTW(&(W[TWVL * 4]), VSUB(T3, T6)); + ST(&(x[WS(vs, 3)]), T7, ms, &(x[WS(vs, 3)])); + Ti = BYTW(&(W[TWVL * 4]), VSUB(Te, Th)); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), Ti, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 4]), VSUB(Tp, Ts)); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), Tt, ms, &(x[WS(vs, 3)])); + TE = BYTW(&(W[TWVL * 4]), VSUB(TA, TD)); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), TE, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T8, Tj, Tu, TF; + T8 = BYTW(&(W[0]), VADD(T3, T6)); + ST(&(x[WS(vs, 1)]), T8, ms, &(x[WS(vs, 1)])); + Tj = BYTW(&(W[0]), VADD(Te, Th)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Tj, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tu = BYTW(&(W[0]), VADD(Tp, Ts)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), Tu, ms, &(x[WS(vs, 1)])); + TF = BYTW(&(W[0]), VADD(TA, TD)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), TF, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V Tb, Tm, Tx, TI; + Tb = BYTW(&(W[TWVL * 2]), VSUB(T9, Ta)); + ST(&(x[WS(vs, 2)]), Tb, ms, &(x[WS(vs, 2)])); + Tm = BYTW(&(W[TWVL * 2]), VSUB(Tk, Tl)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), Tm, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tx = BYTW(&(W[TWVL * 2]), VSUB(Tv, Tw)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), Tx, ms, &(x[WS(vs, 2)])); + TI = BYTW(&(W[TWVL * 2]), VSUB(TG, TH)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), TI, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("q1bv_4"), twinstr, &GENUS, {44, 24, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_4) (planner *p) { + X(kdft_difsq_register) (p, q1bv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_5.c new file mode 100644 index 000000000..012c3c0b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_5.c @@ -0,0 +1,450 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -dif -name q1bv_5 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 100 FP additions, 95 FP multiplications, + * (or, 55 additions, 50 multiplications, 45 fused multiply/add), + * 44 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_5(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(10, rs), MAKE_VOLATILE_STRIDE(10, vs)) { + V T1, Ta, Ti, Te, T8, T9, T1j, T1s, T1A, T1w, T1q, T1r, Tl, Tu, TC; + V Ty, Ts, Tt, TF, TO, TW, TS, TM, TN, TZ, T18, T1g, T1c, T16, T17; + { + V T7, Td, T4, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T5, T6, T2, T3; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T7 = VADD(T5, T6); + Td = VSUB(T5, T6); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = VADD(T2, T3); + Tc = VSUB(T2, T3); + } + Ta = VSUB(T4, T7); + Ti = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tc, Td)); + Te = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Td, Tc)); + T8 = VADD(T4, T7); + T9 = VFNMS(LDK(KP250000000), T8, T1); + } + { + V T1p, T1v, T1m, T1u; + T1j = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + { + V T1n, T1o, T1k, T1l; + T1n = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T1o = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1p = VADD(T1n, T1o); + T1v = VSUB(T1n, T1o); + T1k = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1l = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T1m = VADD(T1k, T1l); + T1u = VSUB(T1k, T1l); + } + T1s = VSUB(T1m, T1p); + T1A = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1u, T1v)); + T1w = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1v, T1u)); + T1q = VADD(T1m, T1p); + T1r = VFNMS(LDK(KP250000000), T1q, T1j); + } + { + V Tr, Tx, To, Tw; + Tl = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + { + V Tp, Tq, Tm, Tn; + Tp = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Tq = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tr = VADD(Tp, Tq); + Tx = VSUB(Tp, Tq); + Tm = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tn = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + To = VADD(Tm, Tn); + Tw = VSUB(Tm, Tn); + } + Tu = VSUB(To, Tr); + TC = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tw, Tx)); + Ty = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tx, Tw)); + Ts = VADD(To, Tr); + Tt = VFNMS(LDK(KP250000000), Ts, Tl); + } + { + V TL, TR, TI, TQ; + TF = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + { + V TJ, TK, TG, TH; + TJ = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + TK = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TL = VADD(TJ, TK); + TR = VSUB(TJ, TK); + TG = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TH = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + TI = VADD(TG, TH); + TQ = VSUB(TG, TH); + } + TO = VSUB(TI, TL); + TW = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TQ, TR)); + TS = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TR, TQ)); + TM = VADD(TI, TL); + TN = VFNMS(LDK(KP250000000), TM, TF); + } + { + V T15, T1b, T12, T1a; + TZ = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + { + V T13, T14, T10, T11; + T13 = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T14 = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T15 = VADD(T13, T14); + T1b = VSUB(T13, T14); + T10 = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T11 = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T12 = VADD(T10, T11); + T1a = VSUB(T10, T11); + } + T18 = VSUB(T12, T15); + T1g = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1a, T1b)); + T1c = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1b, T1a)); + T16 = VADD(T12, T15); + T17 = VFNMS(LDK(KP250000000), T16, TZ); + } + ST(&(x[0]), VADD(T1, T8), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1j, T1q), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(TF, TM), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(TZ, T16), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tl, Ts), ms, &(x[WS(rs, 1)])); + { + V Tj, Tk, Th, T1B, T1C, T1z; + Th = VFNMS(LDK(KP559016994), Ta, T9); + Tj = BYTW(&(W[TWVL * 2]), VFNMSI(Ti, Th)); + Tk = BYTW(&(W[TWVL * 4]), VFMAI(Ti, Th)); + ST(&(x[WS(vs, 2)]), Tj, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3)]), Tk, ms, &(x[WS(vs, 3)])); + T1z = VFNMS(LDK(KP559016994), T1s, T1r); + T1B = BYTW(&(W[TWVL * 2]), VFNMSI(T1A, T1z)); + T1C = BYTW(&(W[TWVL * 4]), VFMAI(T1A, T1z)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T1B, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T1C, ms, &(x[WS(vs, 3)])); + } + { + V T1h, T1i, T1f, TD, TE, TB; + T1f = VFNMS(LDK(KP559016994), T18, T17); + T1h = BYTW(&(W[TWVL * 2]), VFNMSI(T1g, T1f)); + T1i = BYTW(&(W[TWVL * 4]), VFMAI(T1g, T1f)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T1h, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1i, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TB = VFNMS(LDK(KP559016994), Tu, Tt); + TD = BYTW(&(W[TWVL * 2]), VFNMSI(TC, TB)); + TE = BYTW(&(W[TWVL * 4]), VFMAI(TC, TB)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), TD, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TE, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V TX, TY, TV, TT, TU, TP; + TV = VFNMS(LDK(KP559016994), TO, TN); + TX = BYTW(&(W[TWVL * 2]), VFNMSI(TW, TV)); + TY = BYTW(&(W[TWVL * 4]), VFMAI(TW, TV)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), TX, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), TY, ms, &(x[WS(vs, 3)])); + TP = VFMA(LDK(KP559016994), TO, TN); + TT = BYTW(&(W[0]), VFMAI(TS, TP)); + TU = BYTW(&(W[TWVL * 6]), VFNMSI(TS, TP)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), TT, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), TU, ms, &(x[WS(vs, 4)])); + } + { + V Tf, Tg, Tb, Tz, TA, Tv; + Tb = VFMA(LDK(KP559016994), Ta, T9); + Tf = BYTW(&(W[0]), VFMAI(Te, Tb)); + Tg = BYTW(&(W[TWVL * 6]), VFNMSI(Te, Tb)); + ST(&(x[WS(vs, 1)]), Tf, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4)]), Tg, ms, &(x[WS(vs, 4)])); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + Tz = BYTW(&(W[0]), VFMAI(Ty, Tv)); + TA = BYTW(&(W[TWVL * 6]), VFNMSI(Ty, Tv)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Tz, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), TA, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + } + { + V T1d, T1e, T19, T1x, T1y, T1t; + T19 = VFMA(LDK(KP559016994), T18, T17); + T1d = BYTW(&(W[0]), VFMAI(T1c, T19)); + T1e = BYTW(&(W[TWVL * 6]), VFNMSI(T1c, T19)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1d, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T1e, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1t = VFMA(LDK(KP559016994), T1s, T1r); + T1x = BYTW(&(W[0]), VFMAI(T1w, T1t)); + T1y = BYTW(&(W[TWVL * 6]), VFNMSI(T1w, T1t)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T1x, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T1y, ms, &(x[WS(vs, 4)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("q1bv_5"), twinstr, &GENUS, {55, 50, 45, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_5) (planner *p) { + X(kdft_difsq_register) (p, q1bv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -dif -name q1bv_5 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 100 FP additions, 70 FP multiplications, + * (or, 85 additions, 55 multiplications, 15 fused multiply/add), + * 44 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_5(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(10, rs), MAKE_VOLATILE_STRIDE(10, vs)) { + V Tb, T7, Th, Ta, Tc, Td, T1t, T1p, T1z, T1s, T1u, T1v, Tv, Tr, TB; + V Tu, Tw, Tx, TP, TL, TV, TO, TQ, TR, T19, T15, T1f, T18, T1a, T1b; + { + V T6, T9, T3, T8; + Tb = LD(&(x[0]), ms, &(x[0])); + { + V T4, T5, T1, T2; + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + T9 = VADD(T4, T5); + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = VSUB(T1, T2); + T8 = VADD(T1, T2); + } + T7 = VBYI(VFMA(LDK(KP951056516), T3, VMUL(LDK(KP587785252), T6))); + Th = VBYI(VFNMS(LDK(KP951056516), T6, VMUL(LDK(KP587785252), T3))); + Ta = VMUL(LDK(KP559016994), VSUB(T8, T9)); + Tc = VADD(T8, T9); + Td = VFNMS(LDK(KP250000000), Tc, Tb); + } + { + V T1o, T1r, T1l, T1q; + T1t = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + { + V T1m, T1n, T1j, T1k; + T1m = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T1n = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1o = VSUB(T1m, T1n); + T1r = VADD(T1m, T1n); + T1j = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1k = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T1l = VSUB(T1j, T1k); + T1q = VADD(T1j, T1k); + } + T1p = VBYI(VFMA(LDK(KP951056516), T1l, VMUL(LDK(KP587785252), T1o))); + T1z = VBYI(VFNMS(LDK(KP951056516), T1o, VMUL(LDK(KP587785252), T1l))); + T1s = VMUL(LDK(KP559016994), VSUB(T1q, T1r)); + T1u = VADD(T1q, T1r); + T1v = VFNMS(LDK(KP250000000), T1u, T1t); + } + { + V Tq, Tt, Tn, Ts; + Tv = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + { + V To, Tp, Tl, Tm; + To = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Tp = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tq = VSUB(To, Tp); + Tt = VADD(To, Tp); + Tl = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tm = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + Tn = VSUB(Tl, Tm); + Ts = VADD(Tl, Tm); + } + Tr = VBYI(VFMA(LDK(KP951056516), Tn, VMUL(LDK(KP587785252), Tq))); + TB = VBYI(VFNMS(LDK(KP951056516), Tq, VMUL(LDK(KP587785252), Tn))); + Tu = VMUL(LDK(KP559016994), VSUB(Ts, Tt)); + Tw = VADD(Ts, Tt); + Tx = VFNMS(LDK(KP250000000), Tw, Tv); + } + { + V TK, TN, TH, TM; + TP = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + { + V TI, TJ, TF, TG; + TI = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + TJ = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TK = VSUB(TI, TJ); + TN = VADD(TI, TJ); + TF = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TG = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + TH = VSUB(TF, TG); + TM = VADD(TF, TG); + } + TL = VBYI(VFMA(LDK(KP951056516), TH, VMUL(LDK(KP587785252), TK))); + TV = VBYI(VFNMS(LDK(KP951056516), TK, VMUL(LDK(KP587785252), TH))); + TO = VMUL(LDK(KP559016994), VSUB(TM, TN)); + TQ = VADD(TM, TN); + TR = VFNMS(LDK(KP250000000), TQ, TP); + } + { + V T14, T17, T11, T16; + T19 = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + { + V T12, T13, TZ, T10; + T12 = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T13 = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T14 = VSUB(T12, T13); + T17 = VADD(T12, T13); + TZ = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T10 = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T11 = VSUB(TZ, T10); + T16 = VADD(TZ, T10); + } + T15 = VBYI(VFMA(LDK(KP951056516), T11, VMUL(LDK(KP587785252), T14))); + T1f = VBYI(VFNMS(LDK(KP951056516), T14, VMUL(LDK(KP587785252), T11))); + T18 = VMUL(LDK(KP559016994), VSUB(T16, T17)); + T1a = VADD(T16, T17); + T1b = VFNMS(LDK(KP250000000), T1a, T19); + } + ST(&(x[0]), VADD(Tb, Tc), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1t, T1u), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(TP, TQ), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(T19, T1a), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tv, Tw), ms, &(x[WS(rs, 1)])); + { + V Tj, Tk, Ti, T1B, T1C, T1A; + Ti = VSUB(Td, Ta); + Tj = BYTW(&(W[TWVL * 2]), VADD(Th, Ti)); + Tk = BYTW(&(W[TWVL * 4]), VSUB(Ti, Th)); + ST(&(x[WS(vs, 2)]), Tj, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3)]), Tk, ms, &(x[WS(vs, 3)])); + T1A = VSUB(T1v, T1s); + T1B = BYTW(&(W[TWVL * 2]), VADD(T1z, T1A)); + T1C = BYTW(&(W[TWVL * 4]), VSUB(T1A, T1z)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T1B, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T1C, ms, &(x[WS(vs, 3)])); + } + { + V T1h, T1i, T1g, TD, TE, TC; + T1g = VSUB(T1b, T18); + T1h = BYTW(&(W[TWVL * 2]), VADD(T1f, T1g)); + T1i = BYTW(&(W[TWVL * 4]), VSUB(T1g, T1f)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T1h, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1i, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TC = VSUB(Tx, Tu); + TD = BYTW(&(W[TWVL * 2]), VADD(TB, TC)); + TE = BYTW(&(W[TWVL * 4]), VSUB(TC, TB)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), TD, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TE, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V TX, TY, TW, TT, TU, TS; + TW = VSUB(TR, TO); + TX = BYTW(&(W[TWVL * 2]), VADD(TV, TW)); + TY = BYTW(&(W[TWVL * 4]), VSUB(TW, TV)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), TX, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), TY, ms, &(x[WS(vs, 3)])); + TS = VADD(TO, TR); + TT = BYTW(&(W[0]), VADD(TL, TS)); + TU = BYTW(&(W[TWVL * 6]), VSUB(TS, TL)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), TT, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), TU, ms, &(x[WS(vs, 4)])); + } + { + V Tf, Tg, Te, Tz, TA, Ty; + Te = VADD(Ta, Td); + Tf = BYTW(&(W[0]), VADD(T7, Te)); + Tg = BYTW(&(W[TWVL * 6]), VSUB(Te, T7)); + ST(&(x[WS(vs, 1)]), Tf, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4)]), Tg, ms, &(x[WS(vs, 4)])); + Ty = VADD(Tu, Tx); + Tz = BYTW(&(W[0]), VADD(Tr, Ty)); + TA = BYTW(&(W[TWVL * 6]), VSUB(Ty, Tr)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Tz, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), TA, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + } + { + V T1d, T1e, T1c, T1x, T1y, T1w; + T1c = VADD(T18, T1b); + T1d = BYTW(&(W[0]), VADD(T15, T1c)); + T1e = BYTW(&(W[TWVL * 6]), VSUB(T1c, T15)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1d, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T1e, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1w = VADD(T1s, T1v); + T1x = BYTW(&(W[0]), VADD(T1p, T1w)); + T1y = BYTW(&(W[TWVL * 6]), VSUB(T1w, T1p)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T1x, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T1y, ms, &(x[WS(vs, 4)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("q1bv_5"), twinstr, &GENUS, {85, 55, 15, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_5) (planner *p) { + X(kdft_difsq_register) (p, q1bv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_8.c new file mode 100644 index 000000000..182332c71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1bv_8.c @@ -0,0 +1,1036 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:15 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -dif -name q1bv_8 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 264 FP additions, 192 FP multiplications, + * (or, 184 additions, 112 multiplications, 80 fused multiply/add), + * 77 stack variables, 1 constants, and 128 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_8(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, vs)) { + V T3, Tv, Te, Tp, T1E, T26, T1P, T20, T2b, T2D, T2m, T2x, T3M, T4e, T3X; + V T48, TA, T12, TL, TW, T17, T1z, T1i, T1t, T2I, T3a, T2T, T34, T3f, T3H; + V T3q, T3B, Ta, Tw, Tf, Ts, T1L, T27, T1Q, T23, T2i, T2E, T2n, T2A, T3T; + V T4f, T3Y, T4b, TH, T13, TM, TZ, T1e, T1A, T1j, T1w, T2P, T3b, T2U, T37; + V T3m, T3I, T3r, T3E, T28, T14; + { + V T1, T2, Tn, Tc, Td, To; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tn = VADD(T1, T2); + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + To = VADD(Tc, Td); + T3 = VSUB(T1, T2); + Tv = VADD(Tn, To); + Te = VSUB(Tc, Td); + Tp = VSUB(Tn, To); + } + { + V T1C, T1D, T1Y, T1N, T1O, T1Z; + T1C = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + T1D = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T1Y = VADD(T1C, T1D); + T1N = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T1O = LD(&(x[WS(vs, 3) + WS(rs, 6)]), ms, &(x[WS(vs, 3)])); + T1Z = VADD(T1N, T1O); + T1E = VSUB(T1C, T1D); + T26 = VADD(T1Y, T1Z); + T1P = VSUB(T1N, T1O); + T20 = VSUB(T1Y, T1Z); + } + { + V T29, T2a, T2v, T2k, T2l, T2w; + T29 = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + T2a = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T2v = VADD(T29, T2a); + T2k = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T2l = LD(&(x[WS(vs, 4) + WS(rs, 6)]), ms, &(x[WS(vs, 4)])); + T2w = VADD(T2k, T2l); + T2b = VSUB(T29, T2a); + T2D = VADD(T2v, T2w); + T2m = VSUB(T2k, T2l); + T2x = VSUB(T2v, T2w); + } + { + V T3K, T3L, T46, T3V, T3W, T47; + T3K = LD(&(x[WS(vs, 7)]), ms, &(x[WS(vs, 7)])); + T3L = LD(&(x[WS(vs, 7) + WS(rs, 4)]), ms, &(x[WS(vs, 7)])); + T46 = VADD(T3K, T3L); + T3V = LD(&(x[WS(vs, 7) + WS(rs, 2)]), ms, &(x[WS(vs, 7)])); + T3W = LD(&(x[WS(vs, 7) + WS(rs, 6)]), ms, &(x[WS(vs, 7)])); + T47 = VADD(T3V, T3W); + T3M = VSUB(T3K, T3L); + T4e = VADD(T46, T47); + T3X = VSUB(T3V, T3W); + T48 = VSUB(T46, T47); + } + { + V Ty, Tz, TU, TJ, TK, TV; + Ty = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Tz = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + TU = VADD(Ty, Tz); + TJ = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + TK = LD(&(x[WS(vs, 1) + WS(rs, 6)]), ms, &(x[WS(vs, 1)])); + TV = VADD(TJ, TK); + TA = VSUB(Ty, Tz); + T12 = VADD(TU, TV); + TL = VSUB(TJ, TK); + TW = VSUB(TU, TV); + } + { + V T15, T16, T1r, T1g, T1h, T1s; + T15 = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + T16 = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + T1r = VADD(T15, T16); + T1g = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + T1h = LD(&(x[WS(vs, 2) + WS(rs, 6)]), ms, &(x[WS(vs, 2)])); + T1s = VADD(T1g, T1h); + T17 = VSUB(T15, T16); + T1z = VADD(T1r, T1s); + T1i = VSUB(T1g, T1h); + T1t = VSUB(T1r, T1s); + } + { + V T2G, T2H, T32, T2R, T2S, T33; + T2G = LD(&(x[WS(vs, 5)]), ms, &(x[WS(vs, 5)])); + T2H = LD(&(x[WS(vs, 5) + WS(rs, 4)]), ms, &(x[WS(vs, 5)])); + T32 = VADD(T2G, T2H); + T2R = LD(&(x[WS(vs, 5) + WS(rs, 2)]), ms, &(x[WS(vs, 5)])); + T2S = LD(&(x[WS(vs, 5) + WS(rs, 6)]), ms, &(x[WS(vs, 5)])); + T33 = VADD(T2R, T2S); + T2I = VSUB(T2G, T2H); + T3a = VADD(T32, T33); + T2T = VSUB(T2R, T2S); + T34 = VSUB(T32, T33); + } + { + V T3d, T3e, T3z, T3o, T3p, T3A; + T3d = LD(&(x[WS(vs, 6)]), ms, &(x[WS(vs, 6)])); + T3e = LD(&(x[WS(vs, 6) + WS(rs, 4)]), ms, &(x[WS(vs, 6)])); + T3z = VADD(T3d, T3e); + T3o = LD(&(x[WS(vs, 6) + WS(rs, 2)]), ms, &(x[WS(vs, 6)])); + T3p = LD(&(x[WS(vs, 6) + WS(rs, 6)]), ms, &(x[WS(vs, 6)])); + T3A = VADD(T3o, T3p); + T3f = VSUB(T3d, T3e); + T3H = VADD(T3z, T3A); + T3q = VSUB(T3o, T3p); + T3B = VSUB(T3z, T3A); + } + { + V T6, Tq, T9, Tr; + { + V T4, T5, T7, T8; + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + Tq = VADD(T4, T5); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = VSUB(T7, T8); + Tr = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tw = VADD(Tq, Tr); + Tf = VSUB(T6, T9); + Ts = VSUB(Tq, Tr); + } + { + V T1H, T21, T1K, T22; + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1G = LD(&(x[WS(vs, 3) + WS(rs, 5)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1H = VSUB(T1F, T1G); + T21 = VADD(T1F, T1G); + T1I = LD(&(x[WS(vs, 3) + WS(rs, 7)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1J = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1K = VSUB(T1I, T1J); + T22 = VADD(T1I, T1J); + } + T1L = VADD(T1H, T1K); + T27 = VADD(T21, T22); + T1Q = VSUB(T1H, T1K); + T23 = VSUB(T21, T22); + } + { + V T2e, T2y, T2h, T2z; + { + V T2c, T2d, T2f, T2g; + T2c = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2d = LD(&(x[WS(vs, 4) + WS(rs, 5)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2e = VSUB(T2c, T2d); + T2y = VADD(T2c, T2d); + T2f = LD(&(x[WS(vs, 4) + WS(rs, 7)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2g = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2h = VSUB(T2f, T2g); + T2z = VADD(T2f, T2g); + } + T2i = VADD(T2e, T2h); + T2E = VADD(T2y, T2z); + T2n = VSUB(T2e, T2h); + T2A = VSUB(T2y, T2z); + } + { + V T3P, T49, T3S, T4a; + { + V T3N, T3O, T3Q, T3R; + T3N = LD(&(x[WS(vs, 7) + WS(rs, 1)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3O = LD(&(x[WS(vs, 7) + WS(rs, 5)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3P = VSUB(T3N, T3O); + T49 = VADD(T3N, T3O); + T3Q = LD(&(x[WS(vs, 7) + WS(rs, 7)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3R = LD(&(x[WS(vs, 7) + WS(rs, 3)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3S = VSUB(T3Q, T3R); + T4a = VADD(T3Q, T3R); + } + T3T = VADD(T3P, T3S); + T4f = VADD(T49, T4a); + T3Y = VSUB(T3P, T3S); + T4b = VSUB(T49, T4a); + } + { + V TD, TX, TG, TY; + { + V TB, TC, TE, TF; + TB = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 1) + WS(rs, 5)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TD = VSUB(TB, TC); + TX = VADD(TB, TC); + TE = LD(&(x[WS(vs, 1) + WS(rs, 7)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TF = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TG = VSUB(TE, TF); + TY = VADD(TE, TF); + } + TH = VADD(TD, TG); + T13 = VADD(TX, TY); + TM = VSUB(TD, TG); + TZ = VSUB(TX, TY); + } + { + V T1a, T1u, T1d, T1v; + { + V T18, T19, T1b, T1c; + T18 = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T19 = LD(&(x[WS(vs, 2) + WS(rs, 5)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1a = VSUB(T18, T19); + T1u = VADD(T18, T19); + T1b = LD(&(x[WS(vs, 2) + WS(rs, 7)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1c = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1d = VSUB(T1b, T1c); + T1v = VADD(T1b, T1c); + } + T1e = VADD(T1a, T1d); + T1A = VADD(T1u, T1v); + T1j = VSUB(T1a, T1d); + T1w = VSUB(T1u, T1v); + } + { + V T2L, T35, T2O, T36; + { + V T2J, T2K, T2M, T2N; + T2J = LD(&(x[WS(vs, 5) + WS(rs, 1)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2K = LD(&(x[WS(vs, 5) + WS(rs, 5)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2L = VSUB(T2J, T2K); + T35 = VADD(T2J, T2K); + T2M = LD(&(x[WS(vs, 5) + WS(rs, 7)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2N = LD(&(x[WS(vs, 5) + WS(rs, 3)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2O = VSUB(T2M, T2N); + T36 = VADD(T2M, T2N); + } + T2P = VADD(T2L, T2O); + T3b = VADD(T35, T36); + T2U = VSUB(T2L, T2O); + T37 = VSUB(T35, T36); + } + { + V T3i, T3C, T3l, T3D; + { + V T3g, T3h, T3j, T3k; + T3g = LD(&(x[WS(vs, 6) + WS(rs, 1)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3h = LD(&(x[WS(vs, 6) + WS(rs, 5)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3i = VSUB(T3g, T3h); + T3C = VADD(T3g, T3h); + T3j = LD(&(x[WS(vs, 6) + WS(rs, 7)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3k = LD(&(x[WS(vs, 6) + WS(rs, 3)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3l = VSUB(T3j, T3k); + T3D = VADD(T3j, T3k); + } + T3m = VADD(T3i, T3l); + T3I = VADD(T3C, T3D); + T3r = VSUB(T3i, T3l); + T3E = VSUB(T3C, T3D); + } + ST(&(x[0]), VADD(Tv, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1z, T1A), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VADD(T3a, T3b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T4e, T4f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T3H, T3I), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T2D, T2E), ms, &(x[0])); + { + V Tt, T4c, T2B, T24; + ST(&(x[WS(rs, 3)]), VADD(T26, T27), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T12, T13), ms, &(x[WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 10]), VFNMSI(Ts, Tp)); + ST(&(x[WS(vs, 6)]), Tt, ms, &(x[WS(vs, 6)])); + T4c = BYTW(&(W[TWVL * 10]), VFNMSI(T4b, T48)); + ST(&(x[WS(vs, 6) + WS(rs, 7)]), T4c, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T2B = BYTW(&(W[TWVL * 10]), VFNMSI(T2A, T2x)); + ST(&(x[WS(vs, 6) + WS(rs, 4)]), T2B, ms, &(x[WS(vs, 6)])); + T24 = BYTW(&(W[TWVL * 10]), VFNMSI(T23, T20)); + ST(&(x[WS(vs, 6) + WS(rs, 3)]), T24, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + } + { + V T10, T1x, T3F, T38, T1y, Tu; + T10 = BYTW(&(W[TWVL * 10]), VFNMSI(TZ, TW)); + ST(&(x[WS(vs, 6) + WS(rs, 1)]), T10, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T1x = BYTW(&(W[TWVL * 10]), VFNMSI(T1w, T1t)); + ST(&(x[WS(vs, 6) + WS(rs, 2)]), T1x, ms, &(x[WS(vs, 6)])); + T3F = BYTW(&(W[TWVL * 10]), VFNMSI(T3E, T3B)); + ST(&(x[WS(vs, 6) + WS(rs, 6)]), T3F, ms, &(x[WS(vs, 6)])); + T38 = BYTW(&(W[TWVL * 10]), VFNMSI(T37, T34)); + ST(&(x[WS(vs, 6) + WS(rs, 5)]), T38, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T1y = BYTW(&(W[TWVL * 2]), VFMAI(T1w, T1t)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), T1y, ms, &(x[WS(vs, 2)])); + Tu = BYTW(&(W[TWVL * 2]), VFMAI(Ts, Tp)); + ST(&(x[WS(vs, 2)]), Tu, ms, &(x[WS(vs, 2)])); + } + { + V T2C, T3G, T11, T25, T39, T4d; + T2C = BYTW(&(W[TWVL * 2]), VFMAI(T2A, T2x)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T2C, ms, &(x[WS(vs, 2)])); + T3G = BYTW(&(W[TWVL * 2]), VFMAI(T3E, T3B)); + ST(&(x[WS(vs, 2) + WS(rs, 6)]), T3G, ms, &(x[WS(vs, 2)])); + T11 = BYTW(&(W[TWVL * 2]), VFMAI(TZ, TW)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), T11, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T25 = BYTW(&(W[TWVL * 2]), VFMAI(T23, T20)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T25, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T39 = BYTW(&(W[TWVL * 2]), VFMAI(T37, T34)); + ST(&(x[WS(vs, 2) + WS(rs, 5)]), T39, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T4d = BYTW(&(W[TWVL * 2]), VFMAI(T4b, T48)); + ST(&(x[WS(vs, 2) + WS(rs, 7)]), T4d, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + } + { + V Tx, T1B, T3c, T4g, T3J, T2F; + Tx = BYTW(&(W[TWVL * 6]), VSUB(Tv, Tw)); + ST(&(x[WS(vs, 4)]), Tx, ms, &(x[WS(vs, 4)])); + T1B = BYTW(&(W[TWVL * 6]), VSUB(T1z, T1A)); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), T1B, ms, &(x[WS(vs, 4)])); + T3c = BYTW(&(W[TWVL * 6]), VSUB(T3a, T3b)); + ST(&(x[WS(vs, 4) + WS(rs, 5)]), T3c, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T4g = BYTW(&(W[TWVL * 6]), VSUB(T4e, T4f)); + ST(&(x[WS(vs, 4) + WS(rs, 7)]), T4g, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T3J = BYTW(&(W[TWVL * 6]), VSUB(T3H, T3I)); + ST(&(x[WS(vs, 4) + WS(rs, 6)]), T3J, ms, &(x[WS(vs, 4)])); + T2F = BYTW(&(W[TWVL * 6]), VSUB(T2D, T2E)); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T2F, ms, &(x[WS(vs, 4)])); + } + T28 = BYTW(&(W[TWVL * 6]), VSUB(T26, T27)); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T28, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T14 = BYTW(&(W[TWVL * 6]), VSUB(T12, T13)); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), T14, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + { + V Th, Ti, Tb, Tg; + Tb = VFNMS(LDK(KP707106781), Ta, T3); + Tg = VFNMS(LDK(KP707106781), Tf, Te); + Th = BYTW(&(W[TWVL * 4]), VFNMSI(Tg, Tb)); + Ti = BYTW(&(W[TWVL * 8]), VFMAI(Tg, Tb)); + ST(&(x[WS(vs, 3)]), Th, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5)]), Ti, ms, &(x[WS(vs, 5)])); + } + { + V T40, T41, T3U, T3Z; + T3U = VFNMS(LDK(KP707106781), T3T, T3M); + T3Z = VFNMS(LDK(KP707106781), T3Y, T3X); + T40 = BYTW(&(W[TWVL * 4]), VFNMSI(T3Z, T3U)); + T41 = BYTW(&(W[TWVL * 8]), VFMAI(T3Z, T3U)); + ST(&(x[WS(vs, 3) + WS(rs, 7)]), T40, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 7)]), T41, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V T2p, T2q, T2j, T2o; + T2j = VFNMS(LDK(KP707106781), T2i, T2b); + T2o = VFNMS(LDK(KP707106781), T2n, T2m); + T2p = BYTW(&(W[TWVL * 4]), VFNMSI(T2o, T2j)); + T2q = BYTW(&(W[TWVL * 8]), VFMAI(T2o, T2j)); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T2p, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5) + WS(rs, 4)]), T2q, ms, &(x[WS(vs, 5)])); + } + { + V T1S, T1T, T1M, T1R; + T1M = VFNMS(LDK(KP707106781), T1L, T1E); + T1R = VFNMS(LDK(KP707106781), T1Q, T1P); + T1S = BYTW(&(W[TWVL * 4]), VFNMSI(T1R, T1M)); + T1T = BYTW(&(W[TWVL * 8]), VFMAI(T1R, T1M)); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1S, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 3)]), T1T, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V TO, TP, TI, TN; + TI = VFNMS(LDK(KP707106781), TH, TA); + TN = VFNMS(LDK(KP707106781), TM, TL); + TO = BYTW(&(W[TWVL * 4]), VFNMSI(TN, TI)); + TP = BYTW(&(W[TWVL * 8]), VFMAI(TN, TI)); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TO, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 1)]), TP, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V T1l, T1m, T1f, T1k; + T1f = VFNMS(LDK(KP707106781), T1e, T17); + T1k = VFNMS(LDK(KP707106781), T1j, T1i); + T1l = BYTW(&(W[TWVL * 4]), VFNMSI(T1k, T1f)); + T1m = BYTW(&(W[TWVL * 8]), VFMAI(T1k, T1f)); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), T1l, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5) + WS(rs, 2)]), T1m, ms, &(x[WS(vs, 5)])); + } + { + V T3t, T3u, T3n, T3s; + T3n = VFNMS(LDK(KP707106781), T3m, T3f); + T3s = VFNMS(LDK(KP707106781), T3r, T3q); + T3t = BYTW(&(W[TWVL * 4]), VFNMSI(T3s, T3n)); + T3u = BYTW(&(W[TWVL * 8]), VFMAI(T3s, T3n)); + ST(&(x[WS(vs, 3) + WS(rs, 6)]), T3t, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5) + WS(rs, 6)]), T3u, ms, &(x[WS(vs, 5)])); + } + { + V T2W, T2X, T2Q, T2V; + T2Q = VFNMS(LDK(KP707106781), T2P, T2I); + T2V = VFNMS(LDK(KP707106781), T2U, T2T); + T2W = BYTW(&(W[TWVL * 4]), VFNMSI(T2V, T2Q)); + T2X = BYTW(&(W[TWVL * 8]), VFMAI(T2V, T2Q)); + ST(&(x[WS(vs, 3) + WS(rs, 5)]), T2W, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 5)]), T2X, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V T1p, T1q, T1n, T1o; + T1n = VFMA(LDK(KP707106781), T1e, T17); + T1o = VFMA(LDK(KP707106781), T1j, T1i); + T1p = BYTW(&(W[0]), VFMAI(T1o, T1n)); + T1q = BYTW(&(W[TWVL * 12]), VFNMSI(T1o, T1n)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), T1p, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 2)]), T1q, ms, &(x[WS(vs, 7)])); + } + { + V Tl, Tm, Tj, Tk; + Tj = VFMA(LDK(KP707106781), Ta, T3); + Tk = VFMA(LDK(KP707106781), Tf, Te); + Tl = BYTW(&(W[0]), VFMAI(Tk, Tj)); + Tm = BYTW(&(W[TWVL * 12]), VFNMSI(Tk, Tj)); + ST(&(x[WS(vs, 1)]), Tl, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7)]), Tm, ms, &(x[WS(vs, 7)])); + } + { + V T2t, T2u, T2r, T2s; + T2r = VFMA(LDK(KP707106781), T2i, T2b); + T2s = VFMA(LDK(KP707106781), T2n, T2m); + T2t = BYTW(&(W[0]), VFMAI(T2s, T2r)); + T2u = BYTW(&(W[TWVL * 12]), VFNMSI(T2s, T2r)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T2t, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 4)]), T2u, ms, &(x[WS(vs, 7)])); + } + { + V T3x, T3y, T3v, T3w; + T3v = VFMA(LDK(KP707106781), T3m, T3f); + T3w = VFMA(LDK(KP707106781), T3r, T3q); + T3x = BYTW(&(W[0]), VFMAI(T3w, T3v)); + T3y = BYTW(&(W[TWVL * 12]), VFNMSI(T3w, T3v)); + ST(&(x[WS(vs, 1) + WS(rs, 6)]), T3x, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 6)]), T3y, ms, &(x[WS(vs, 7)])); + } + { + V TS, TT, TQ, TR; + TQ = VFMA(LDK(KP707106781), TH, TA); + TR = VFMA(LDK(KP707106781), TM, TL); + TS = BYTW(&(W[0]), VFMAI(TR, TQ)); + TT = BYTW(&(W[TWVL * 12]), VFNMSI(TR, TQ)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), TS, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 1)]), TT, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T1W, T1X, T1U, T1V; + T1U = VFMA(LDK(KP707106781), T1L, T1E); + T1V = VFMA(LDK(KP707106781), T1Q, T1P); + T1W = BYTW(&(W[0]), VFMAI(T1V, T1U)); + T1X = BYTW(&(W[TWVL * 12]), VFNMSI(T1V, T1U)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1W, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 3)]), T1X, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T30, T31, T2Y, T2Z; + T2Y = VFMA(LDK(KP707106781), T2P, T2I); + T2Z = VFMA(LDK(KP707106781), T2U, T2T); + T30 = BYTW(&(W[0]), VFMAI(T2Z, T2Y)); + T31 = BYTW(&(W[TWVL * 12]), VFNMSI(T2Z, T2Y)); + ST(&(x[WS(vs, 1) + WS(rs, 5)]), T30, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 5)]), T31, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T44, T45, T42, T43; + T42 = VFMA(LDK(KP707106781), T3T, T3M); + T43 = VFMA(LDK(KP707106781), T3Y, T3X); + T44 = BYTW(&(W[0]), VFMAI(T43, T42)); + T45 = BYTW(&(W[TWVL * 12]), VFNMSI(T43, T42)); + ST(&(x[WS(vs, 1) + WS(rs, 7)]), T44, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 7)]), T45, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("q1bv_8"), twinstr, &GENUS, {184, 112, 80, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_8) (planner *p) { + X(kdft_difsq_register) (p, q1bv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -dif -name q1bv_8 -include dft/simd/q1b.h -sign 1 */ + +/* + * This function contains 264 FP additions, 128 FP multiplications, + * (or, 264 additions, 128 multiplications, 0 fused multiply/add), + * 77 stack variables, 1 constants, and 128 memory accesses + */ +#include "dft/simd/q1b.h" + +static void q1bv_8(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, vs)) { + V Ta, Tv, Te, Tp, T1L, T26, T1P, T20, T2i, T2D, T2m, T2x, T3T, T4e, T3X; + V T48, TH, T12, TL, TW, T1e, T1z, T1i, T1t, T2P, T3a, T2T, T34, T3m, T3H; + V T3q, T3B, T7, Tw, Tf, Ts, T1I, T27, T1Q, T23, T2f, T2E, T2n, T2A, T3Q; + V T4f, T3Y, T4b, TE, T13, TM, TZ, T1b, T1A, T1j, T1w, T2M, T3b, T2U, T37; + V T3j, T3I, T3r, T3E, T28, T14; + { + V T8, T9, To, Tc, Td, Tn; + T8 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T9 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + To = VADD(T8, T9); + Tc = LD(&(x[0]), ms, &(x[0])); + Td = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tn = VADD(Tc, Td); + Ta = VSUB(T8, T9); + Tv = VADD(Tn, To); + Te = VSUB(Tc, Td); + Tp = VSUB(Tn, To); + } + { + V T1J, T1K, T1Z, T1N, T1O, T1Y; + T1J = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T1K = LD(&(x[WS(vs, 3) + WS(rs, 6)]), ms, &(x[WS(vs, 3)])); + T1Z = VADD(T1J, T1K); + T1N = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + T1O = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T1Y = VADD(T1N, T1O); + T1L = VSUB(T1J, T1K); + T26 = VADD(T1Y, T1Z); + T1P = VSUB(T1N, T1O); + T20 = VSUB(T1Y, T1Z); + } + { + V T2g, T2h, T2w, T2k, T2l, T2v; + T2g = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T2h = LD(&(x[WS(vs, 4) + WS(rs, 6)]), ms, &(x[WS(vs, 4)])); + T2w = VADD(T2g, T2h); + T2k = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + T2l = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T2v = VADD(T2k, T2l); + T2i = VSUB(T2g, T2h); + T2D = VADD(T2v, T2w); + T2m = VSUB(T2k, T2l); + T2x = VSUB(T2v, T2w); + } + { + V T3R, T3S, T47, T3V, T3W, T46; + T3R = LD(&(x[WS(vs, 7) + WS(rs, 2)]), ms, &(x[WS(vs, 7)])); + T3S = LD(&(x[WS(vs, 7) + WS(rs, 6)]), ms, &(x[WS(vs, 7)])); + T47 = VADD(T3R, T3S); + T3V = LD(&(x[WS(vs, 7)]), ms, &(x[WS(vs, 7)])); + T3W = LD(&(x[WS(vs, 7) + WS(rs, 4)]), ms, &(x[WS(vs, 7)])); + T46 = VADD(T3V, T3W); + T3T = VSUB(T3R, T3S); + T4e = VADD(T46, T47); + T3X = VSUB(T3V, T3W); + T48 = VSUB(T46, T47); + } + { + V TF, TG, TV, TJ, TK, TU; + TF = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + TG = LD(&(x[WS(vs, 1) + WS(rs, 6)]), ms, &(x[WS(vs, 1)])); + TV = VADD(TF, TG); + TJ = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + TK = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + TU = VADD(TJ, TK); + TH = VSUB(TF, TG); + T12 = VADD(TU, TV); + TL = VSUB(TJ, TK); + TW = VSUB(TU, TV); + } + { + V T1c, T1d, T1s, T1g, T1h, T1r; + T1c = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + T1d = LD(&(x[WS(vs, 2) + WS(rs, 6)]), ms, &(x[WS(vs, 2)])); + T1s = VADD(T1c, T1d); + T1g = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + T1h = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + T1r = VADD(T1g, T1h); + T1e = VSUB(T1c, T1d); + T1z = VADD(T1r, T1s); + T1i = VSUB(T1g, T1h); + T1t = VSUB(T1r, T1s); + } + { + V T2N, T2O, T33, T2R, T2S, T32; + T2N = LD(&(x[WS(vs, 5) + WS(rs, 2)]), ms, &(x[WS(vs, 5)])); + T2O = LD(&(x[WS(vs, 5) + WS(rs, 6)]), ms, &(x[WS(vs, 5)])); + T33 = VADD(T2N, T2O); + T2R = LD(&(x[WS(vs, 5)]), ms, &(x[WS(vs, 5)])); + T2S = LD(&(x[WS(vs, 5) + WS(rs, 4)]), ms, &(x[WS(vs, 5)])); + T32 = VADD(T2R, T2S); + T2P = VSUB(T2N, T2O); + T3a = VADD(T32, T33); + T2T = VSUB(T2R, T2S); + T34 = VSUB(T32, T33); + } + { + V T3k, T3l, T3A, T3o, T3p, T3z; + T3k = LD(&(x[WS(vs, 6) + WS(rs, 2)]), ms, &(x[WS(vs, 6)])); + T3l = LD(&(x[WS(vs, 6) + WS(rs, 6)]), ms, &(x[WS(vs, 6)])); + T3A = VADD(T3k, T3l); + T3o = LD(&(x[WS(vs, 6)]), ms, &(x[WS(vs, 6)])); + T3p = LD(&(x[WS(vs, 6) + WS(rs, 4)]), ms, &(x[WS(vs, 6)])); + T3z = VADD(T3o, T3p); + T3m = VSUB(T3k, T3l); + T3H = VADD(T3z, T3A); + T3q = VSUB(T3o, T3p); + T3B = VSUB(T3z, T3A); + } + { + V T3, Tq, T6, Tr; + { + V T1, T2, T4, T5; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = VSUB(T1, T2); + Tq = VADD(T1, T2); + T4 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + Tr = VADD(T4, T5); + } + T7 = VMUL(LDK(KP707106781), VSUB(T3, T6)); + Tw = VADD(Tq, Tr); + Tf = VMUL(LDK(KP707106781), VADD(T3, T6)); + Ts = VBYI(VSUB(Tq, Tr)); + } + { + V T1E, T21, T1H, T22; + { + V T1C, T1D, T1F, T1G; + T1C = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1D = LD(&(x[WS(vs, 3) + WS(rs, 5)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1E = VSUB(T1C, T1D); + T21 = VADD(T1C, T1D); + T1F = LD(&(x[WS(vs, 3) + WS(rs, 7)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1G = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1H = VSUB(T1F, T1G); + T22 = VADD(T1F, T1G); + } + T1I = VMUL(LDK(KP707106781), VSUB(T1E, T1H)); + T27 = VADD(T21, T22); + T1Q = VMUL(LDK(KP707106781), VADD(T1E, T1H)); + T23 = VBYI(VSUB(T21, T22)); + } + { + V T2b, T2y, T2e, T2z; + { + V T29, T2a, T2c, T2d; + T29 = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2a = LD(&(x[WS(vs, 4) + WS(rs, 5)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2b = VSUB(T29, T2a); + T2y = VADD(T29, T2a); + T2c = LD(&(x[WS(vs, 4) + WS(rs, 7)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2d = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2e = VSUB(T2c, T2d); + T2z = VADD(T2c, T2d); + } + T2f = VMUL(LDK(KP707106781), VSUB(T2b, T2e)); + T2E = VADD(T2y, T2z); + T2n = VMUL(LDK(KP707106781), VADD(T2b, T2e)); + T2A = VBYI(VSUB(T2y, T2z)); + } + { + V T3M, T49, T3P, T4a; + { + V T3K, T3L, T3N, T3O; + T3K = LD(&(x[WS(vs, 7) + WS(rs, 1)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3L = LD(&(x[WS(vs, 7) + WS(rs, 5)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3M = VSUB(T3K, T3L); + T49 = VADD(T3K, T3L); + T3N = LD(&(x[WS(vs, 7) + WS(rs, 7)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3O = LD(&(x[WS(vs, 7) + WS(rs, 3)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3P = VSUB(T3N, T3O); + T4a = VADD(T3N, T3O); + } + T3Q = VMUL(LDK(KP707106781), VSUB(T3M, T3P)); + T4f = VADD(T49, T4a); + T3Y = VMUL(LDK(KP707106781), VADD(T3M, T3P)); + T4b = VBYI(VSUB(T49, T4a)); + } + { + V TA, TX, TD, TY; + { + V Ty, Tz, TB, TC; + Ty = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tz = LD(&(x[WS(vs, 1) + WS(rs, 5)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TA = VSUB(Ty, Tz); + TX = VADD(Ty, Tz); + TB = LD(&(x[WS(vs, 1) + WS(rs, 7)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TD = VSUB(TB, TC); + TY = VADD(TB, TC); + } + TE = VMUL(LDK(KP707106781), VSUB(TA, TD)); + T13 = VADD(TX, TY); + TM = VMUL(LDK(KP707106781), VADD(TA, TD)); + TZ = VBYI(VSUB(TX, TY)); + } + { + V T17, T1u, T1a, T1v; + { + V T15, T16, T18, T19; + T15 = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T16 = LD(&(x[WS(vs, 2) + WS(rs, 5)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T17 = VSUB(T15, T16); + T1u = VADD(T15, T16); + T18 = LD(&(x[WS(vs, 2) + WS(rs, 7)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T19 = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1a = VSUB(T18, T19); + T1v = VADD(T18, T19); + } + T1b = VMUL(LDK(KP707106781), VSUB(T17, T1a)); + T1A = VADD(T1u, T1v); + T1j = VMUL(LDK(KP707106781), VADD(T17, T1a)); + T1w = VBYI(VSUB(T1u, T1v)); + } + { + V T2I, T35, T2L, T36; + { + V T2G, T2H, T2J, T2K; + T2G = LD(&(x[WS(vs, 5) + WS(rs, 1)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2H = LD(&(x[WS(vs, 5) + WS(rs, 5)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2I = VSUB(T2G, T2H); + T35 = VADD(T2G, T2H); + T2J = LD(&(x[WS(vs, 5) + WS(rs, 7)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2K = LD(&(x[WS(vs, 5) + WS(rs, 3)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2L = VSUB(T2J, T2K); + T36 = VADD(T2J, T2K); + } + T2M = VMUL(LDK(KP707106781), VSUB(T2I, T2L)); + T3b = VADD(T35, T36); + T2U = VMUL(LDK(KP707106781), VADD(T2I, T2L)); + T37 = VBYI(VSUB(T35, T36)); + } + { + V T3f, T3C, T3i, T3D; + { + V T3d, T3e, T3g, T3h; + T3d = LD(&(x[WS(vs, 6) + WS(rs, 1)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3e = LD(&(x[WS(vs, 6) + WS(rs, 5)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3f = VSUB(T3d, T3e); + T3C = VADD(T3d, T3e); + T3g = LD(&(x[WS(vs, 6) + WS(rs, 7)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3h = LD(&(x[WS(vs, 6) + WS(rs, 3)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3i = VSUB(T3g, T3h); + T3D = VADD(T3g, T3h); + } + T3j = VMUL(LDK(KP707106781), VSUB(T3f, T3i)); + T3I = VADD(T3C, T3D); + T3r = VMUL(LDK(KP707106781), VADD(T3f, T3i)); + T3E = VBYI(VSUB(T3C, T3D)); + } + ST(&(x[0]), VADD(Tv, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1z, T1A), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VADD(T3a, T3b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T4e, T4f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T3H, T3I), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T2D, T2E), ms, &(x[0])); + { + V Tt, T4c, T2B, T24; + ST(&(x[WS(rs, 3)]), VADD(T26, T27), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T12, T13), ms, &(x[WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 10]), VSUB(Tp, Ts)); + ST(&(x[WS(vs, 6)]), Tt, ms, &(x[WS(vs, 6)])); + T4c = BYTW(&(W[TWVL * 10]), VSUB(T48, T4b)); + ST(&(x[WS(vs, 6) + WS(rs, 7)]), T4c, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T2B = BYTW(&(W[TWVL * 10]), VSUB(T2x, T2A)); + ST(&(x[WS(vs, 6) + WS(rs, 4)]), T2B, ms, &(x[WS(vs, 6)])); + T24 = BYTW(&(W[TWVL * 10]), VSUB(T20, T23)); + ST(&(x[WS(vs, 6) + WS(rs, 3)]), T24, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + } + { + V T10, T1x, T3F, T38, T1y, Tu; + T10 = BYTW(&(W[TWVL * 10]), VSUB(TW, TZ)); + ST(&(x[WS(vs, 6) + WS(rs, 1)]), T10, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T1x = BYTW(&(W[TWVL * 10]), VSUB(T1t, T1w)); + ST(&(x[WS(vs, 6) + WS(rs, 2)]), T1x, ms, &(x[WS(vs, 6)])); + T3F = BYTW(&(W[TWVL * 10]), VSUB(T3B, T3E)); + ST(&(x[WS(vs, 6) + WS(rs, 6)]), T3F, ms, &(x[WS(vs, 6)])); + T38 = BYTW(&(W[TWVL * 10]), VSUB(T34, T37)); + ST(&(x[WS(vs, 6) + WS(rs, 5)]), T38, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T1y = BYTW(&(W[TWVL * 2]), VADD(T1t, T1w)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), T1y, ms, &(x[WS(vs, 2)])); + Tu = BYTW(&(W[TWVL * 2]), VADD(Tp, Ts)); + ST(&(x[WS(vs, 2)]), Tu, ms, &(x[WS(vs, 2)])); + } + { + V T2C, T3G, T11, T25, T39, T4d; + T2C = BYTW(&(W[TWVL * 2]), VADD(T2x, T2A)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T2C, ms, &(x[WS(vs, 2)])); + T3G = BYTW(&(W[TWVL * 2]), VADD(T3B, T3E)); + ST(&(x[WS(vs, 2) + WS(rs, 6)]), T3G, ms, &(x[WS(vs, 2)])); + T11 = BYTW(&(W[TWVL * 2]), VADD(TW, TZ)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), T11, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T25 = BYTW(&(W[TWVL * 2]), VADD(T20, T23)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T25, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T39 = BYTW(&(W[TWVL * 2]), VADD(T34, T37)); + ST(&(x[WS(vs, 2) + WS(rs, 5)]), T39, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T4d = BYTW(&(W[TWVL * 2]), VADD(T48, T4b)); + ST(&(x[WS(vs, 2) + WS(rs, 7)]), T4d, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + } + { + V Tx, T1B, T3c, T4g, T3J, T2F; + Tx = BYTW(&(W[TWVL * 6]), VSUB(Tv, Tw)); + ST(&(x[WS(vs, 4)]), Tx, ms, &(x[WS(vs, 4)])); + T1B = BYTW(&(W[TWVL * 6]), VSUB(T1z, T1A)); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), T1B, ms, &(x[WS(vs, 4)])); + T3c = BYTW(&(W[TWVL * 6]), VSUB(T3a, T3b)); + ST(&(x[WS(vs, 4) + WS(rs, 5)]), T3c, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T4g = BYTW(&(W[TWVL * 6]), VSUB(T4e, T4f)); + ST(&(x[WS(vs, 4) + WS(rs, 7)]), T4g, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T3J = BYTW(&(W[TWVL * 6]), VSUB(T3H, T3I)); + ST(&(x[WS(vs, 4) + WS(rs, 6)]), T3J, ms, &(x[WS(vs, 4)])); + T2F = BYTW(&(W[TWVL * 6]), VSUB(T2D, T2E)); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T2F, ms, &(x[WS(vs, 4)])); + } + T28 = BYTW(&(W[TWVL * 6]), VSUB(T26, T27)); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T28, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T14 = BYTW(&(W[TWVL * 6]), VSUB(T12, T13)); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), T14, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + { + V Th, Ti, Tb, Tg; + Tb = VBYI(VSUB(T7, Ta)); + Tg = VSUB(Te, Tf); + Th = BYTW(&(W[TWVL * 4]), VADD(Tb, Tg)); + Ti = BYTW(&(W[TWVL * 8]), VSUB(Tg, Tb)); + ST(&(x[WS(vs, 3)]), Th, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5)]), Ti, ms, &(x[WS(vs, 5)])); + } + { + V T40, T41, T3U, T3Z; + T3U = VBYI(VSUB(T3Q, T3T)); + T3Z = VSUB(T3X, T3Y); + T40 = BYTW(&(W[TWVL * 4]), VADD(T3U, T3Z)); + T41 = BYTW(&(W[TWVL * 8]), VSUB(T3Z, T3U)); + ST(&(x[WS(vs, 3) + WS(rs, 7)]), T40, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 7)]), T41, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V T2p, T2q, T2j, T2o; + T2j = VBYI(VSUB(T2f, T2i)); + T2o = VSUB(T2m, T2n); + T2p = BYTW(&(W[TWVL * 4]), VADD(T2j, T2o)); + T2q = BYTW(&(W[TWVL * 8]), VSUB(T2o, T2j)); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T2p, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5) + WS(rs, 4)]), T2q, ms, &(x[WS(vs, 5)])); + } + { + V T1S, T1T, T1M, T1R; + T1M = VBYI(VSUB(T1I, T1L)); + T1R = VSUB(T1P, T1Q); + T1S = BYTW(&(W[TWVL * 4]), VADD(T1M, T1R)); + T1T = BYTW(&(W[TWVL * 8]), VSUB(T1R, T1M)); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1S, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 3)]), T1T, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V TO, TP, TI, TN; + TI = VBYI(VSUB(TE, TH)); + TN = VSUB(TL, TM); + TO = BYTW(&(W[TWVL * 4]), VADD(TI, TN)); + TP = BYTW(&(W[TWVL * 8]), VSUB(TN, TI)); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TO, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 1)]), TP, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V T1l, T1m, T1f, T1k; + T1f = VBYI(VSUB(T1b, T1e)); + T1k = VSUB(T1i, T1j); + T1l = BYTW(&(W[TWVL * 4]), VADD(T1f, T1k)); + T1m = BYTW(&(W[TWVL * 8]), VSUB(T1k, T1f)); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), T1l, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5) + WS(rs, 2)]), T1m, ms, &(x[WS(vs, 5)])); + } + { + V T3t, T3u, T3n, T3s; + T3n = VBYI(VSUB(T3j, T3m)); + T3s = VSUB(T3q, T3r); + T3t = BYTW(&(W[TWVL * 4]), VADD(T3n, T3s)); + T3u = BYTW(&(W[TWVL * 8]), VSUB(T3s, T3n)); + ST(&(x[WS(vs, 3) + WS(rs, 6)]), T3t, ms, &(x[WS(vs, 3)])); + ST(&(x[WS(vs, 5) + WS(rs, 6)]), T3u, ms, &(x[WS(vs, 5)])); + } + { + V T2W, T2X, T2Q, T2V; + T2Q = VBYI(VSUB(T2M, T2P)); + T2V = VSUB(T2T, T2U); + T2W = BYTW(&(W[TWVL * 4]), VADD(T2Q, T2V)); + T2X = BYTW(&(W[TWVL * 8]), VSUB(T2V, T2Q)); + ST(&(x[WS(vs, 3) + WS(rs, 5)]), T2W, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + ST(&(x[WS(vs, 5) + WS(rs, 5)]), T2X, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + } + { + V T1p, T1q, T1n, T1o; + T1n = VBYI(VADD(T1e, T1b)); + T1o = VADD(T1i, T1j); + T1p = BYTW(&(W[0]), VADD(T1n, T1o)); + T1q = BYTW(&(W[TWVL * 12]), VSUB(T1o, T1n)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), T1p, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 2)]), T1q, ms, &(x[WS(vs, 7)])); + } + { + V Tl, Tm, Tj, Tk; + Tj = VBYI(VADD(Ta, T7)); + Tk = VADD(Te, Tf); + Tl = BYTW(&(W[0]), VADD(Tj, Tk)); + Tm = BYTW(&(W[TWVL * 12]), VSUB(Tk, Tj)); + ST(&(x[WS(vs, 1)]), Tl, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7)]), Tm, ms, &(x[WS(vs, 7)])); + } + { + V T2t, T2u, T2r, T2s; + T2r = VBYI(VADD(T2i, T2f)); + T2s = VADD(T2m, T2n); + T2t = BYTW(&(W[0]), VADD(T2r, T2s)); + T2u = BYTW(&(W[TWVL * 12]), VSUB(T2s, T2r)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T2t, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 4)]), T2u, ms, &(x[WS(vs, 7)])); + } + { + V T3x, T3y, T3v, T3w; + T3v = VBYI(VADD(T3m, T3j)); + T3w = VADD(T3q, T3r); + T3x = BYTW(&(W[0]), VADD(T3v, T3w)); + T3y = BYTW(&(W[TWVL * 12]), VSUB(T3w, T3v)); + ST(&(x[WS(vs, 1) + WS(rs, 6)]), T3x, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 6)]), T3y, ms, &(x[WS(vs, 7)])); + } + { + V TS, TT, TQ, TR; + TQ = VBYI(VADD(TH, TE)); + TR = VADD(TL, TM); + TS = BYTW(&(W[0]), VADD(TQ, TR)); + TT = BYTW(&(W[TWVL * 12]), VSUB(TR, TQ)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), TS, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 1)]), TT, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T1W, T1X, T1U, T1V; + T1U = VBYI(VADD(T1L, T1I)); + T1V = VADD(T1P, T1Q); + T1W = BYTW(&(W[0]), VADD(T1U, T1V)); + T1X = BYTW(&(W[TWVL * 12]), VSUB(T1V, T1U)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1W, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 3)]), T1X, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T30, T31, T2Y, T2Z; + T2Y = VBYI(VADD(T2P, T2M)); + T2Z = VADD(T2T, T2U); + T30 = BYTW(&(W[0]), VADD(T2Y, T2Z)); + T31 = BYTW(&(W[TWVL * 12]), VSUB(T2Z, T2Y)); + ST(&(x[WS(vs, 1) + WS(rs, 5)]), T30, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 5)]), T31, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T44, T45, T42, T43; + T42 = VBYI(VADD(T3T, T3Q)); + T43 = VADD(T3X, T3Y); + T44 = BYTW(&(W[0]), VADD(T42, T43)); + T45 = BYTW(&(W[TWVL * 12]), VSUB(T43, T42)); + ST(&(x[WS(vs, 1) + WS(rs, 7)]), T44, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 7)]), T45, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("q1bv_8"), twinstr, &GENUS, {264, 128, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1bv_8) (planner *p) { + X(kdft_difsq_register) (p, q1bv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_2.c new file mode 100644 index 000000000..c42f9af6c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_2.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -dif -name q1fv_2 -include dft/simd/q1f.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 6 additions, 4 multiplications, 0 fused multiply/add), + * 8 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_2(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(4, rs), MAKE_VOLATILE_STRIDE(4, vs)) { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), VSUB(T1, T2)); + T4 = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + T5 = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), VSUB(T4, T5)); + ST(&(x[WS(vs, 1)]), T3, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), T6, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T2), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T4, T5), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("q1fv_2"), twinstr, &GENUS, {6, 4, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_2) (planner *p) { + X(kdft_difsq_register) (p, q1fv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -dif -name q1fv_2 -include dft/simd/q1f.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 6 additions, 4 multiplications, 0 fused multiply/add), + * 8 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_2(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(4, rs), MAKE_VOLATILE_STRIDE(4, vs)) { + V T1, T2, T3, T4, T5, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), VSUB(T1, T2)); + T4 = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + T5 = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), VSUB(T4, T5)); + ST(&(x[WS(vs, 1)]), T3, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), T6, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T2), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T4, T5), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("q1fv_2"), twinstr, &GENUS, {6, 4, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_2) (planner *p) { + X(kdft_difsq_register) (p, q1fv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_4.c new file mode 100644 index 000000000..1a5a46b5f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_4.c @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -dif -name q1fv_4 -include dft/simd/q1f.h */ + +/* + * This function contains 44 FP additions, 32 FP multiplications, + * (or, 36 additions, 24 multiplications, 8 fused multiply/add), + * 22 stack variables, 0 constants, and 32 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_4(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, vs)) { + V T3, T9, TA, TG, TD, TH, T6, Ta, Te, Tk, Tp, Tv, Ts, Tw, Th; + V Tl; + { + V T1, T2, Ty, Tz; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = VSUB(T1, T2); + T9 = VADD(T1, T2); + Ty = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + Tz = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + TA = VSUB(Ty, Tz); + TG = VADD(Ty, Tz); + } + { + V TB, TC, T4, T5; + TB = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TD = VSUB(TB, TC); + TH = VADD(TB, TC); + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + Ta = VADD(T4, T5); + } + { + V Tc, Td, Tn, To; + Tc = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Td = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + Tn = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + To = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + Tp = VSUB(Tn, To); + Tv = VADD(Tn, To); + } + { + V Tq, Tr, Tf, Tg; + Tq = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tr = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Ts = VSUB(Tq, Tr); + Tw = VADD(Tq, Tr); + Tf = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tg = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Th = VSUB(Tf, Tg); + Tl = VADD(Tf, Tg); + } + ST(&(x[0]), VADD(T9, Ta), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tk, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(Tv, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(TG, TH), ms, &(x[WS(rs, 1)])); + { + V T7, Ti, Tt, TE; + T7 = BYTWJ(&(W[0]), VFNMSI(T6, T3)); + ST(&(x[WS(vs, 1)]), T7, ms, &(x[WS(vs, 1)])); + Ti = BYTWJ(&(W[0]), VFNMSI(Th, Te)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Ti, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tt = BYTWJ(&(W[0]), VFNMSI(Ts, Tp)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), Tt, ms, &(x[WS(vs, 1)])); + TE = BYTWJ(&(W[0]), VFNMSI(TD, TA)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), TE, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V T8, Tj, Tu, TF; + T8 = BYTWJ(&(W[TWVL * 4]), VFMAI(T6, T3)); + ST(&(x[WS(vs, 3)]), T8, ms, &(x[WS(vs, 3)])); + Tj = BYTWJ(&(W[TWVL * 4]), VFMAI(Th, Te)); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), Tj, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 4]), VFMAI(Ts, Tp)); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), Tu, ms, &(x[WS(vs, 3)])); + TF = BYTWJ(&(W[TWVL * 4]), VFMAI(TD, TA)); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), TF, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V Tb, Tm, Tx, TI; + Tb = BYTWJ(&(W[TWVL * 2]), VSUB(T9, Ta)); + ST(&(x[WS(vs, 2)]), Tb, ms, &(x[WS(vs, 2)])); + Tm = BYTWJ(&(W[TWVL * 2]), VSUB(Tk, Tl)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), Tm, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tx = BYTWJ(&(W[TWVL * 2]), VSUB(Tv, Tw)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), Tx, ms, &(x[WS(vs, 2)])); + TI = BYTWJ(&(W[TWVL * 2]), VSUB(TG, TH)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), TI, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("q1fv_4"), twinstr, &GENUS, {36, 24, 8, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_4) (planner *p) { + X(kdft_difsq_register) (p, q1fv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -dif -name q1fv_4 -include dft/simd/q1f.h */ + +/* + * This function contains 44 FP additions, 24 FP multiplications, + * (or, 44 additions, 24 multiplications, 0 fused multiply/add), + * 22 stack variables, 0 constants, and 32 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_4(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, vs)) { + V T3, T9, TA, TG, TD, TH, T6, Ta, Te, Tk, Tp, Tv, Ts, Tw, Th; + V Tl; + { + V T1, T2, Ty, Tz; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = VSUB(T1, T2); + T9 = VADD(T1, T2); + Ty = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + Tz = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + TA = VSUB(Ty, Tz); + TG = VADD(Ty, Tz); + } + { + V TB, TC, T4, T5; + TB = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TD = VBYI(VSUB(TB, TC)); + TH = VADD(TB, TC); + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VBYI(VSUB(T4, T5)); + Ta = VADD(T4, T5); + } + { + V Tc, Td, Tn, To; + Tc = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Td = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Te = VSUB(Tc, Td); + Tk = VADD(Tc, Td); + Tn = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + To = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + Tp = VSUB(Tn, To); + Tv = VADD(Tn, To); + } + { + V Tq, Tr, Tf, Tg; + Tq = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tr = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Ts = VBYI(VSUB(Tq, Tr)); + Tw = VADD(Tq, Tr); + Tf = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tg = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Th = VBYI(VSUB(Tf, Tg)); + Tl = VADD(Tf, Tg); + } + ST(&(x[0]), VADD(T9, Ta), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tk, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(Tv, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(TG, TH), ms, &(x[WS(rs, 1)])); + { + V T7, Ti, Tt, TE; + T7 = BYTWJ(&(W[0]), VSUB(T3, T6)); + ST(&(x[WS(vs, 1)]), T7, ms, &(x[WS(vs, 1)])); + Ti = BYTWJ(&(W[0]), VSUB(Te, Th)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Ti, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tt = BYTWJ(&(W[0]), VSUB(Tp, Ts)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), Tt, ms, &(x[WS(vs, 1)])); + TE = BYTWJ(&(W[0]), VSUB(TA, TD)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), TE, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V T8, Tj, Tu, TF; + T8 = BYTWJ(&(W[TWVL * 4]), VADD(T3, T6)); + ST(&(x[WS(vs, 3)]), T8, ms, &(x[WS(vs, 3)])); + Tj = BYTWJ(&(W[TWVL * 4]), VADD(Te, Th)); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), Tj, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 4]), VADD(Tp, Ts)); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), Tu, ms, &(x[WS(vs, 3)])); + TF = BYTWJ(&(W[TWVL * 4]), VADD(TA, TD)); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), TF, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V Tb, Tm, Tx, TI; + Tb = BYTWJ(&(W[TWVL * 2]), VSUB(T9, Ta)); + ST(&(x[WS(vs, 2)]), Tb, ms, &(x[WS(vs, 2)])); + Tm = BYTWJ(&(W[TWVL * 2]), VSUB(Tk, Tl)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), Tm, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + Tx = BYTWJ(&(W[TWVL * 2]), VSUB(Tv, Tw)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), Tx, ms, &(x[WS(vs, 2)])); + TI = BYTWJ(&(W[TWVL * 2]), VSUB(TG, TH)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), TI, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("q1fv_4"), twinstr, &GENUS, {44, 24, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_4) (planner *p) { + X(kdft_difsq_register) (p, q1fv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_5.c new file mode 100644 index 000000000..9bf9c3266 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_5.c @@ -0,0 +1,450 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:13 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -dif -name q1fv_5 -include dft/simd/q1f.h */ + +/* + * This function contains 100 FP additions, 95 FP multiplications, + * (or, 55 additions, 50 multiplications, 45 fused multiply/add), + * 44 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_5(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(10, rs), MAKE_VOLATILE_STRIDE(10, vs)) { + V T1, Ta, Ti, Te, T8, T9, T1j, T1s, T1A, T1w, T1q, T1r, Tl, Tu, TC; + V Ty, Ts, Tt, TF, TO, TW, TS, TM, TN, TZ, T18, T1g, T1c, T16, T17; + { + V T7, Td, T4, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T5, T6, T2, T3; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T7 = VADD(T5, T6); + Td = VSUB(T5, T6); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = VADD(T2, T3); + Tc = VSUB(T2, T3); + } + Ta = VSUB(T4, T7); + Ti = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tc, Td)); + Te = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Td, Tc)); + T8 = VADD(T4, T7); + T9 = VFNMS(LDK(KP250000000), T8, T1); + } + { + V T1p, T1v, T1m, T1u; + T1j = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + { + V T1n, T1o, T1k, T1l; + T1n = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T1o = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1p = VADD(T1n, T1o); + T1v = VSUB(T1n, T1o); + T1k = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1l = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T1m = VADD(T1k, T1l); + T1u = VSUB(T1k, T1l); + } + T1s = VSUB(T1m, T1p); + T1A = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1u, T1v)); + T1w = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1v, T1u)); + T1q = VADD(T1m, T1p); + T1r = VFNMS(LDK(KP250000000), T1q, T1j); + } + { + V Tr, Tx, To, Tw; + Tl = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + { + V Tp, Tq, Tm, Tn; + Tp = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Tq = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tr = VADD(Tp, Tq); + Tx = VSUB(Tp, Tq); + Tm = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tn = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + To = VADD(Tm, Tn); + Tw = VSUB(Tm, Tn); + } + Tu = VSUB(To, Tr); + TC = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tw, Tx)); + Ty = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tx, Tw)); + Ts = VADD(To, Tr); + Tt = VFNMS(LDK(KP250000000), Ts, Tl); + } + { + V TL, TR, TI, TQ; + TF = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + { + V TJ, TK, TG, TH; + TJ = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + TK = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TL = VADD(TJ, TK); + TR = VSUB(TJ, TK); + TG = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TH = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + TI = VADD(TG, TH); + TQ = VSUB(TG, TH); + } + TO = VSUB(TI, TL); + TW = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TQ, TR)); + TS = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TR, TQ)); + TM = VADD(TI, TL); + TN = VFNMS(LDK(KP250000000), TM, TF); + } + { + V T15, T1b, T12, T1a; + TZ = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + { + V T13, T14, T10, T11; + T13 = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T14 = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T15 = VADD(T13, T14); + T1b = VSUB(T13, T14); + T10 = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T11 = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T12 = VADD(T10, T11); + T1a = VSUB(T10, T11); + } + T18 = VSUB(T12, T15); + T1g = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1a, T1b)); + T1c = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1b, T1a)); + T16 = VADD(T12, T15); + T17 = VFNMS(LDK(KP250000000), T16, TZ); + } + ST(&(x[0]), VADD(T1, T8), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1j, T1q), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(TF, TM), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(TZ, T16), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tl, Ts), ms, &(x[WS(rs, 1)])); + { + V Tj, Tk, Th, T1B, T1C, T1z; + Th = VFNMS(LDK(KP559016994), Ta, T9); + Tj = BYTWJ(&(W[TWVL * 2]), VFMAI(Ti, Th)); + Tk = BYTWJ(&(W[TWVL * 4]), VFNMSI(Ti, Th)); + ST(&(x[WS(vs, 2)]), Tj, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3)]), Tk, ms, &(x[WS(vs, 3)])); + T1z = VFNMS(LDK(KP559016994), T1s, T1r); + T1B = BYTWJ(&(W[TWVL * 2]), VFMAI(T1A, T1z)); + T1C = BYTWJ(&(W[TWVL * 4]), VFNMSI(T1A, T1z)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T1B, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T1C, ms, &(x[WS(vs, 3)])); + } + { + V T1h, T1i, T1f, TD, TE, TB; + T1f = VFNMS(LDK(KP559016994), T18, T17); + T1h = BYTWJ(&(W[TWVL * 2]), VFMAI(T1g, T1f)); + T1i = BYTWJ(&(W[TWVL * 4]), VFNMSI(T1g, T1f)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T1h, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1i, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TB = VFNMS(LDK(KP559016994), Tu, Tt); + TD = BYTWJ(&(W[TWVL * 2]), VFMAI(TC, TB)); + TE = BYTWJ(&(W[TWVL * 4]), VFNMSI(TC, TB)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), TD, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TE, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V TX, TY, TV, TT, TU, TP; + TV = VFNMS(LDK(KP559016994), TO, TN); + TX = BYTWJ(&(W[TWVL * 2]), VFMAI(TW, TV)); + TY = BYTWJ(&(W[TWVL * 4]), VFNMSI(TW, TV)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), TX, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), TY, ms, &(x[WS(vs, 3)])); + TP = VFMA(LDK(KP559016994), TO, TN); + TT = BYTWJ(&(W[0]), VFNMSI(TS, TP)); + TU = BYTWJ(&(W[TWVL * 6]), VFMAI(TS, TP)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), TT, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), TU, ms, &(x[WS(vs, 4)])); + } + { + V Tf, Tg, Tb, Tz, TA, Tv; + Tb = VFMA(LDK(KP559016994), Ta, T9); + Tf = BYTWJ(&(W[0]), VFNMSI(Te, Tb)); + Tg = BYTWJ(&(W[TWVL * 6]), VFMAI(Te, Tb)); + ST(&(x[WS(vs, 1)]), Tf, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4)]), Tg, ms, &(x[WS(vs, 4)])); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + Tz = BYTWJ(&(W[0]), VFNMSI(Ty, Tv)); + TA = BYTWJ(&(W[TWVL * 6]), VFMAI(Ty, Tv)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Tz, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), TA, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + } + { + V T1d, T1e, T19, T1x, T1y, T1t; + T19 = VFMA(LDK(KP559016994), T18, T17); + T1d = BYTWJ(&(W[0]), VFNMSI(T1c, T19)); + T1e = BYTWJ(&(W[TWVL * 6]), VFMAI(T1c, T19)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1d, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T1e, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1t = VFMA(LDK(KP559016994), T1s, T1r); + T1x = BYTWJ(&(W[0]), VFNMSI(T1w, T1t)); + T1y = BYTWJ(&(W[TWVL * 6]), VFMAI(T1w, T1t)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T1x, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T1y, ms, &(x[WS(vs, 4)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("q1fv_5"), twinstr, &GENUS, {55, 50, 45, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_5) (planner *p) { + X(kdft_difsq_register) (p, q1fv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -dif -name q1fv_5 -include dft/simd/q1f.h */ + +/* + * This function contains 100 FP additions, 70 FP multiplications, + * (or, 85 additions, 55 multiplications, 15 fused multiply/add), + * 44 stack variables, 4 constants, and 50 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_5(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(10, rs), MAKE_VOLATILE_STRIDE(10, vs)) { + V T8, T7, Th, Te, T9, Ta, T1q, T1p, T1z, T1w, T1r, T1s, Ts, Tr, TB; + V Ty, Tt, Tu, TM, TL, TV, TS, TN, TO, T16, T15, T1f, T1c, T17, T18; + { + V T6, Td, T3, Tc; + T8 = LD(&(x[0]), ms, &(x[0])); + { + V T4, T5, T1, T2; + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T6 = VADD(T4, T5); + Td = VSUB(T4, T5); + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = VADD(T1, T2); + Tc = VSUB(T1, T2); + } + T7 = VMUL(LDK(KP559016994), VSUB(T3, T6)); + Th = VBYI(VFNMS(LDK(KP587785252), Tc, VMUL(LDK(KP951056516), Td))); + Te = VBYI(VFMA(LDK(KP951056516), Tc, VMUL(LDK(KP587785252), Td))); + T9 = VADD(T3, T6); + Ta = VFNMS(LDK(KP250000000), T9, T8); + } + { + V T1o, T1v, T1l, T1u; + T1q = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + { + V T1m, T1n, T1j, T1k; + T1m = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T1n = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1o = VADD(T1m, T1n); + T1v = VSUB(T1m, T1n); + T1j = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1k = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T1l = VADD(T1j, T1k); + T1u = VSUB(T1j, T1k); + } + T1p = VMUL(LDK(KP559016994), VSUB(T1l, T1o)); + T1z = VBYI(VFNMS(LDK(KP587785252), T1u, VMUL(LDK(KP951056516), T1v))); + T1w = VBYI(VFMA(LDK(KP951056516), T1u, VMUL(LDK(KP587785252), T1v))); + T1r = VADD(T1l, T1o); + T1s = VFNMS(LDK(KP250000000), T1r, T1q); + } + { + V Tq, Tx, Tn, Tw; + Ts = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + { + V To, Tp, Tl, Tm; + To = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + Tp = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tq = VADD(To, Tp); + Tx = VSUB(To, Tp); + Tl = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + Tm = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + Tn = VADD(Tl, Tm); + Tw = VSUB(Tl, Tm); + } + Tr = VMUL(LDK(KP559016994), VSUB(Tn, Tq)); + TB = VBYI(VFNMS(LDK(KP587785252), Tw, VMUL(LDK(KP951056516), Tx))); + Ty = VBYI(VFMA(LDK(KP951056516), Tw, VMUL(LDK(KP587785252), Tx))); + Tt = VADD(Tn, Tq); + Tu = VFNMS(LDK(KP250000000), Tt, Ts); + } + { + V TK, TR, TH, TQ; + TM = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + { + V TI, TJ, TF, TG; + TI = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + TJ = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TK = VADD(TI, TJ); + TR = VSUB(TI, TJ); + TF = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + TG = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + TH = VADD(TF, TG); + TQ = VSUB(TF, TG); + } + TL = VMUL(LDK(KP559016994), VSUB(TH, TK)); + TV = VBYI(VFNMS(LDK(KP587785252), TQ, VMUL(LDK(KP951056516), TR))); + TS = VBYI(VFMA(LDK(KP951056516), TQ, VMUL(LDK(KP587785252), TR))); + TN = VADD(TH, TK); + TO = VFNMS(LDK(KP250000000), TN, TM); + } + { + V T14, T1b, T11, T1a; + T16 = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + { + V T12, T13, TZ, T10; + T12 = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T13 = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T14 = VADD(T12, T13); + T1b = VSUB(T12, T13); + TZ = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T10 = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T11 = VADD(TZ, T10); + T1a = VSUB(TZ, T10); + } + T15 = VMUL(LDK(KP559016994), VSUB(T11, T14)); + T1f = VBYI(VFNMS(LDK(KP587785252), T1a, VMUL(LDK(KP951056516), T1b))); + T1c = VBYI(VFMA(LDK(KP951056516), T1a, VMUL(LDK(KP587785252), T1b))); + T17 = VADD(T11, T14); + T18 = VFNMS(LDK(KP250000000), T17, T16); + } + ST(&(x[0]), VADD(T8, T9), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1q, T1r), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(TM, TN), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(T16, T17), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Ts, Tt), ms, &(x[WS(rs, 1)])); + { + V Tj, Tk, Ti, T1B, T1C, T1A; + Ti = VSUB(Ta, T7); + Tj = BYTWJ(&(W[TWVL * 2]), VADD(Th, Ti)); + Tk = BYTWJ(&(W[TWVL * 4]), VSUB(Ti, Th)); + ST(&(x[WS(vs, 2)]), Tj, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3)]), Tk, ms, &(x[WS(vs, 3)])); + T1A = VSUB(T1s, T1p); + T1B = BYTWJ(&(W[TWVL * 2]), VADD(T1z, T1A)); + T1C = BYTWJ(&(W[TWVL * 4]), VSUB(T1A, T1z)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T1B, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T1C, ms, &(x[WS(vs, 3)])); + } + { + V T1h, T1i, T1g, TD, TE, TC; + T1g = VSUB(T18, T15); + T1h = BYTWJ(&(W[TWVL * 2]), VADD(T1f, T1g)); + T1i = BYTWJ(&(W[TWVL * 4]), VSUB(T1g, T1f)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T1h, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1i, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + TC = VSUB(Tu, Tr); + TD = BYTWJ(&(W[TWVL * 2]), VADD(TB, TC)); + TE = BYTWJ(&(W[TWVL * 4]), VSUB(TC, TB)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), TD, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TE, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V TX, TY, TW, TT, TU, TP; + TW = VSUB(TO, TL); + TX = BYTWJ(&(W[TWVL * 2]), VADD(TV, TW)); + TY = BYTWJ(&(W[TWVL * 4]), VSUB(TW, TV)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), TX, ms, &(x[WS(vs, 2)])); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), TY, ms, &(x[WS(vs, 3)])); + TP = VADD(TL, TO); + TT = BYTWJ(&(W[0]), VSUB(TP, TS)); + TU = BYTWJ(&(W[TWVL * 6]), VADD(TS, TP)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), TT, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), TU, ms, &(x[WS(vs, 4)])); + } + { + V Tf, Tg, Tb, Tz, TA, Tv; + Tb = VADD(T7, Ta); + Tf = BYTWJ(&(W[0]), VSUB(Tb, Te)); + Tg = BYTWJ(&(W[TWVL * 6]), VADD(Te, Tb)); + ST(&(x[WS(vs, 1)]), Tf, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4)]), Tg, ms, &(x[WS(vs, 4)])); + Tv = VADD(Tr, Tu); + Tz = BYTWJ(&(W[0]), VSUB(Tv, Ty)); + TA = BYTWJ(&(W[TWVL * 6]), VADD(Ty, Tv)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), Tz, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), TA, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + } + { + V T1d, T1e, T19, T1x, T1y, T1t; + T19 = VADD(T15, T18); + T1d = BYTWJ(&(W[0]), VSUB(T19, T1c)); + T1e = BYTWJ(&(W[TWVL * 6]), VADD(T1c, T19)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1d, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T1e, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1t = VADD(T1p, T1s); + T1x = BYTWJ(&(W[0]), VSUB(T1t, T1w)); + T1y = BYTWJ(&(W[TWVL * 6]), VADD(T1w, T1t)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T1x, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T1y, ms, &(x[WS(vs, 4)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("q1fv_5"), twinstr, &GENUS, {85, 55, 15, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_5) (planner *p) { + X(kdft_difsq_register) (p, q1fv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_8.c new file mode 100644 index 000000000..2894a8048 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/q1fv_8.c @@ -0,0 +1,1036 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:14 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twidsq_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -dif -name q1fv_8 -include dft/simd/q1f.h */ + +/* + * This function contains 264 FP additions, 192 FP multiplications, + * (or, 184 additions, 112 multiplications, 80 fused multiply/add), + * 77 stack variables, 1 constants, and 128 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_8(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, vs)) { + V T3, Tu, Te, Tp, T1E, T25, T1P, T20, T2b, T2C, T2m, T2x, T3M, T4d, T3X; + V T48, TA, T11, TL, TW, T17, T1y, T1i, T1t, T2I, T39, T2T, T34, T3f, T3G; + V T3q, T3B, Ta, Tv, Tf, Ts, T1L, T26, T1Q, T23, T2i, T2D, T2n, T2A, T3T; + V T4e, T3Y, T4b, TH, T12, TM, TZ, T1e, T1z, T1j, T1w, T2P, T3a, T2U, T37; + V T3m, T3H, T3r, T3E, T28, T14; + { + V T1, T2, Tn, Tc, Td, To; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tn = VADD(T1, T2); + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + To = VADD(Tc, Td); + T3 = VSUB(T1, T2); + Tu = VSUB(Tn, To); + Te = VSUB(Tc, Td); + Tp = VADD(Tn, To); + } + { + V T1C, T1D, T1Y, T1N, T1O, T1Z; + T1C = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + T1D = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T1Y = VADD(T1C, T1D); + T1N = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T1O = LD(&(x[WS(vs, 3) + WS(rs, 6)]), ms, &(x[WS(vs, 3)])); + T1Z = VADD(T1N, T1O); + T1E = VSUB(T1C, T1D); + T25 = VSUB(T1Y, T1Z); + T1P = VSUB(T1N, T1O); + T20 = VADD(T1Y, T1Z); + } + { + V T29, T2a, T2v, T2k, T2l, T2w; + T29 = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + T2a = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T2v = VADD(T29, T2a); + T2k = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T2l = LD(&(x[WS(vs, 4) + WS(rs, 6)]), ms, &(x[WS(vs, 4)])); + T2w = VADD(T2k, T2l); + T2b = VSUB(T29, T2a); + T2C = VSUB(T2v, T2w); + T2m = VSUB(T2k, T2l); + T2x = VADD(T2v, T2w); + } + { + V T3K, T3L, T46, T3V, T3W, T47; + T3K = LD(&(x[WS(vs, 7)]), ms, &(x[WS(vs, 7)])); + T3L = LD(&(x[WS(vs, 7) + WS(rs, 4)]), ms, &(x[WS(vs, 7)])); + T46 = VADD(T3K, T3L); + T3V = LD(&(x[WS(vs, 7) + WS(rs, 2)]), ms, &(x[WS(vs, 7)])); + T3W = LD(&(x[WS(vs, 7) + WS(rs, 6)]), ms, &(x[WS(vs, 7)])); + T47 = VADD(T3V, T3W); + T3M = VSUB(T3K, T3L); + T4d = VSUB(T46, T47); + T3X = VSUB(T3V, T3W); + T48 = VADD(T46, T47); + } + { + V Ty, Tz, TU, TJ, TK, TV; + Ty = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Tz = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + TU = VADD(Ty, Tz); + TJ = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + TK = LD(&(x[WS(vs, 1) + WS(rs, 6)]), ms, &(x[WS(vs, 1)])); + TV = VADD(TJ, TK); + TA = VSUB(Ty, Tz); + T11 = VSUB(TU, TV); + TL = VSUB(TJ, TK); + TW = VADD(TU, TV); + } + { + V T15, T16, T1r, T1g, T1h, T1s; + T15 = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + T16 = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + T1r = VADD(T15, T16); + T1g = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + T1h = LD(&(x[WS(vs, 2) + WS(rs, 6)]), ms, &(x[WS(vs, 2)])); + T1s = VADD(T1g, T1h); + T17 = VSUB(T15, T16); + T1y = VSUB(T1r, T1s); + T1i = VSUB(T1g, T1h); + T1t = VADD(T1r, T1s); + } + { + V T2G, T2H, T32, T2R, T2S, T33; + T2G = LD(&(x[WS(vs, 5)]), ms, &(x[WS(vs, 5)])); + T2H = LD(&(x[WS(vs, 5) + WS(rs, 4)]), ms, &(x[WS(vs, 5)])); + T32 = VADD(T2G, T2H); + T2R = LD(&(x[WS(vs, 5) + WS(rs, 2)]), ms, &(x[WS(vs, 5)])); + T2S = LD(&(x[WS(vs, 5) + WS(rs, 6)]), ms, &(x[WS(vs, 5)])); + T33 = VADD(T2R, T2S); + T2I = VSUB(T2G, T2H); + T39 = VSUB(T32, T33); + T2T = VSUB(T2R, T2S); + T34 = VADD(T32, T33); + } + { + V T3d, T3e, T3z, T3o, T3p, T3A; + T3d = LD(&(x[WS(vs, 6)]), ms, &(x[WS(vs, 6)])); + T3e = LD(&(x[WS(vs, 6) + WS(rs, 4)]), ms, &(x[WS(vs, 6)])); + T3z = VADD(T3d, T3e); + T3o = LD(&(x[WS(vs, 6) + WS(rs, 2)]), ms, &(x[WS(vs, 6)])); + T3p = LD(&(x[WS(vs, 6) + WS(rs, 6)]), ms, &(x[WS(vs, 6)])); + T3A = VADD(T3o, T3p); + T3f = VSUB(T3d, T3e); + T3G = VSUB(T3z, T3A); + T3q = VSUB(T3o, T3p); + T3B = VADD(T3z, T3A); + } + { + V T6, Tq, T9, Tr; + { + V T4, T5, T7, T8; + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + Tq = VADD(T4, T5); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = VSUB(T7, T8); + Tr = VADD(T7, T8); + } + Ta = VADD(T6, T9); + Tv = VSUB(Tr, Tq); + Tf = VSUB(T9, T6); + Ts = VADD(Tq, Tr); + } + { + V T1H, T21, T1K, T22; + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1G = LD(&(x[WS(vs, 3) + WS(rs, 5)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1H = VSUB(T1F, T1G); + T21 = VADD(T1F, T1G); + T1I = LD(&(x[WS(vs, 3) + WS(rs, 7)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1J = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1K = VSUB(T1I, T1J); + T22 = VADD(T1I, T1J); + } + T1L = VADD(T1H, T1K); + T26 = VSUB(T22, T21); + T1Q = VSUB(T1K, T1H); + T23 = VADD(T21, T22); + } + { + V T2e, T2y, T2h, T2z; + { + V T2c, T2d, T2f, T2g; + T2c = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2d = LD(&(x[WS(vs, 4) + WS(rs, 5)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2e = VSUB(T2c, T2d); + T2y = VADD(T2c, T2d); + T2f = LD(&(x[WS(vs, 4) + WS(rs, 7)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2g = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2h = VSUB(T2f, T2g); + T2z = VADD(T2f, T2g); + } + T2i = VADD(T2e, T2h); + T2D = VSUB(T2z, T2y); + T2n = VSUB(T2h, T2e); + T2A = VADD(T2y, T2z); + } + { + V T3P, T49, T3S, T4a; + { + V T3N, T3O, T3Q, T3R; + T3N = LD(&(x[WS(vs, 7) + WS(rs, 1)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3O = LD(&(x[WS(vs, 7) + WS(rs, 5)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3P = VSUB(T3N, T3O); + T49 = VADD(T3N, T3O); + T3Q = LD(&(x[WS(vs, 7) + WS(rs, 7)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3R = LD(&(x[WS(vs, 7) + WS(rs, 3)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3S = VSUB(T3Q, T3R); + T4a = VADD(T3Q, T3R); + } + T3T = VADD(T3P, T3S); + T4e = VSUB(T4a, T49); + T3Y = VSUB(T3S, T3P); + T4b = VADD(T49, T4a); + } + { + V TD, TX, TG, TY; + { + V TB, TC, TE, TF; + TB = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 1) + WS(rs, 5)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TD = VSUB(TB, TC); + TX = VADD(TB, TC); + TE = LD(&(x[WS(vs, 1) + WS(rs, 7)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TF = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TG = VSUB(TE, TF); + TY = VADD(TE, TF); + } + TH = VADD(TD, TG); + T12 = VSUB(TY, TX); + TM = VSUB(TG, TD); + TZ = VADD(TX, TY); + } + { + V T1a, T1u, T1d, T1v; + { + V T18, T19, T1b, T1c; + T18 = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T19 = LD(&(x[WS(vs, 2) + WS(rs, 5)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1a = VSUB(T18, T19); + T1u = VADD(T18, T19); + T1b = LD(&(x[WS(vs, 2) + WS(rs, 7)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1c = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1d = VSUB(T1b, T1c); + T1v = VADD(T1b, T1c); + } + T1e = VADD(T1a, T1d); + T1z = VSUB(T1v, T1u); + T1j = VSUB(T1d, T1a); + T1w = VADD(T1u, T1v); + } + { + V T2L, T35, T2O, T36; + { + V T2J, T2K, T2M, T2N; + T2J = LD(&(x[WS(vs, 5) + WS(rs, 1)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2K = LD(&(x[WS(vs, 5) + WS(rs, 5)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2L = VSUB(T2J, T2K); + T35 = VADD(T2J, T2K); + T2M = LD(&(x[WS(vs, 5) + WS(rs, 7)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2N = LD(&(x[WS(vs, 5) + WS(rs, 3)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2O = VSUB(T2M, T2N); + T36 = VADD(T2M, T2N); + } + T2P = VADD(T2L, T2O); + T3a = VSUB(T36, T35); + T2U = VSUB(T2O, T2L); + T37 = VADD(T35, T36); + } + { + V T3i, T3C, T3l, T3D; + { + V T3g, T3h, T3j, T3k; + T3g = LD(&(x[WS(vs, 6) + WS(rs, 1)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3h = LD(&(x[WS(vs, 6) + WS(rs, 5)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3i = VSUB(T3g, T3h); + T3C = VADD(T3g, T3h); + T3j = LD(&(x[WS(vs, 6) + WS(rs, 7)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3k = LD(&(x[WS(vs, 6) + WS(rs, 3)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3l = VSUB(T3j, T3k); + T3D = VADD(T3j, T3k); + } + T3m = VADD(T3i, T3l); + T3H = VSUB(T3D, T3C); + T3r = VSUB(T3l, T3i); + T3E = VADD(T3C, T3D); + } + ST(&(x[0]), VADD(Tp, Ts), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1t, T1w), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VADD(T34, T37), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T48, T4b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T3B, T3E), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T2x, T2A), ms, &(x[0])); + { + V Tt, T4c, T2B, T24; + ST(&(x[WS(rs, 3)]), VADD(T20, T23), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TW, TZ), ms, &(x[WS(rs, 1)])); + Tt = BYTWJ(&(W[TWVL * 6]), VSUB(Tp, Ts)); + ST(&(x[WS(vs, 4)]), Tt, ms, &(x[WS(vs, 4)])); + T4c = BYTWJ(&(W[TWVL * 6]), VSUB(T48, T4b)); + ST(&(x[WS(vs, 4) + WS(rs, 7)]), T4c, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2B = BYTWJ(&(W[TWVL * 6]), VSUB(T2x, T2A)); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T2B, ms, &(x[WS(vs, 4)])); + T24 = BYTWJ(&(W[TWVL * 6]), VSUB(T20, T23)); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T24, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + } + { + V T10, T1x, T3F, T38, T1A, Tw; + T10 = BYTWJ(&(W[TWVL * 6]), VSUB(TW, TZ)); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), T10, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1x = BYTWJ(&(W[TWVL * 6]), VSUB(T1t, T1w)); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), T1x, ms, &(x[WS(vs, 4)])); + T3F = BYTWJ(&(W[TWVL * 6]), VSUB(T3B, T3E)); + ST(&(x[WS(vs, 4) + WS(rs, 6)]), T3F, ms, &(x[WS(vs, 4)])); + T38 = BYTWJ(&(W[TWVL * 6]), VSUB(T34, T37)); + ST(&(x[WS(vs, 4) + WS(rs, 5)]), T38, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1A = BYTWJ(&(W[TWVL * 10]), VFNMSI(T1z, T1y)); + ST(&(x[WS(vs, 6) + WS(rs, 2)]), T1A, ms, &(x[WS(vs, 6)])); + Tw = BYTWJ(&(W[TWVL * 10]), VFNMSI(Tv, Tu)); + ST(&(x[WS(vs, 6)]), Tw, ms, &(x[WS(vs, 6)])); + } + { + V T2E, T3I, T13, T27, T3b, T4f; + T2E = BYTWJ(&(W[TWVL * 10]), VFNMSI(T2D, T2C)); + ST(&(x[WS(vs, 6) + WS(rs, 4)]), T2E, ms, &(x[WS(vs, 6)])); + T3I = BYTWJ(&(W[TWVL * 10]), VFNMSI(T3H, T3G)); + ST(&(x[WS(vs, 6) + WS(rs, 6)]), T3I, ms, &(x[WS(vs, 6)])); + T13 = BYTWJ(&(W[TWVL * 10]), VFNMSI(T12, T11)); + ST(&(x[WS(vs, 6) + WS(rs, 1)]), T13, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T27 = BYTWJ(&(W[TWVL * 10]), VFNMSI(T26, T25)); + ST(&(x[WS(vs, 6) + WS(rs, 3)]), T27, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3b = BYTWJ(&(W[TWVL * 10]), VFNMSI(T3a, T39)); + ST(&(x[WS(vs, 6) + WS(rs, 5)]), T3b, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T4f = BYTWJ(&(W[TWVL * 10]), VFNMSI(T4e, T4d)); + ST(&(x[WS(vs, 6) + WS(rs, 7)]), T4f, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + } + { + V Tx, T1B, T3c, T4g, T3J, T2F; + Tx = BYTWJ(&(W[TWVL * 2]), VFMAI(Tv, Tu)); + ST(&(x[WS(vs, 2)]), Tx, ms, &(x[WS(vs, 2)])); + T1B = BYTWJ(&(W[TWVL * 2]), VFMAI(T1z, T1y)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), T1B, ms, &(x[WS(vs, 2)])); + T3c = BYTWJ(&(W[TWVL * 2]), VFMAI(T3a, T39)); + ST(&(x[WS(vs, 2) + WS(rs, 5)]), T3c, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T4g = BYTWJ(&(W[TWVL * 2]), VFMAI(T4e, T4d)); + ST(&(x[WS(vs, 2) + WS(rs, 7)]), T4g, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T3J = BYTWJ(&(W[TWVL * 2]), VFMAI(T3H, T3G)); + ST(&(x[WS(vs, 2) + WS(rs, 6)]), T3J, ms, &(x[WS(vs, 2)])); + T2F = BYTWJ(&(W[TWVL * 2]), VFMAI(T2D, T2C)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T2F, ms, &(x[WS(vs, 2)])); + } + T28 = BYTWJ(&(W[TWVL * 2]), VFMAI(T26, T25)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T28, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T14 = BYTWJ(&(W[TWVL * 2]), VFMAI(T12, T11)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), T14, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + { + V Th, Ti, Tb, Tg; + Tb = VFMA(LDK(KP707106781), Ta, T3); + Tg = VFNMS(LDK(KP707106781), Tf, Te); + Th = BYTWJ(&(W[0]), VFNMSI(Tg, Tb)); + Ti = BYTWJ(&(W[TWVL * 12]), VFMAI(Tg, Tb)); + ST(&(x[WS(vs, 1)]), Th, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7)]), Ti, ms, &(x[WS(vs, 7)])); + } + { + V T40, T41, T3U, T3Z; + T3U = VFMA(LDK(KP707106781), T3T, T3M); + T3Z = VFNMS(LDK(KP707106781), T3Y, T3X); + T40 = BYTWJ(&(W[0]), VFNMSI(T3Z, T3U)); + T41 = BYTWJ(&(W[TWVL * 12]), VFMAI(T3Z, T3U)); + ST(&(x[WS(vs, 1) + WS(rs, 7)]), T40, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 7)]), T41, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T2p, T2q, T2j, T2o; + T2j = VFMA(LDK(KP707106781), T2i, T2b); + T2o = VFNMS(LDK(KP707106781), T2n, T2m); + T2p = BYTWJ(&(W[0]), VFNMSI(T2o, T2j)); + T2q = BYTWJ(&(W[TWVL * 12]), VFMAI(T2o, T2j)); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T2p, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 4)]), T2q, ms, &(x[WS(vs, 7)])); + } + { + V T1S, T1T, T1M, T1R; + T1M = VFMA(LDK(KP707106781), T1L, T1E); + T1R = VFNMS(LDK(KP707106781), T1Q, T1P); + T1S = BYTWJ(&(W[0]), VFNMSI(T1R, T1M)); + T1T = BYTWJ(&(W[TWVL * 12]), VFMAI(T1R, T1M)); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1S, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 3)]), T1T, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V TO, TP, TI, TN; + TI = VFMA(LDK(KP707106781), TH, TA); + TN = VFNMS(LDK(KP707106781), TM, TL); + TO = BYTWJ(&(W[0]), VFNMSI(TN, TI)); + TP = BYTWJ(&(W[TWVL * 12]), VFMAI(TN, TI)); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), TO, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 1)]), TP, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T1l, T1m, T1f, T1k; + T1f = VFMA(LDK(KP707106781), T1e, T17); + T1k = VFNMS(LDK(KP707106781), T1j, T1i); + T1l = BYTWJ(&(W[0]), VFNMSI(T1k, T1f)); + T1m = BYTWJ(&(W[TWVL * 12]), VFMAI(T1k, T1f)); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), T1l, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 2)]), T1m, ms, &(x[WS(vs, 7)])); + } + { + V T3t, T3u, T3n, T3s; + T3n = VFMA(LDK(KP707106781), T3m, T3f); + T3s = VFNMS(LDK(KP707106781), T3r, T3q); + T3t = BYTWJ(&(W[0]), VFNMSI(T3s, T3n)); + T3u = BYTWJ(&(W[TWVL * 12]), VFMAI(T3s, T3n)); + ST(&(x[WS(vs, 1) + WS(rs, 6)]), T3t, ms, &(x[WS(vs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 6)]), T3u, ms, &(x[WS(vs, 7)])); + } + { + V T2W, T2X, T2Q, T2V; + T2Q = VFMA(LDK(KP707106781), T2P, T2I); + T2V = VFNMS(LDK(KP707106781), T2U, T2T); + T2W = BYTWJ(&(W[0]), VFNMSI(T2V, T2Q)); + T2X = BYTWJ(&(W[TWVL * 12]), VFMAI(T2V, T2Q)); + ST(&(x[WS(vs, 1) + WS(rs, 5)]), T2W, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + ST(&(x[WS(vs, 7) + WS(rs, 5)]), T2X, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + } + { + V T1p, T1q, T1n, T1o; + T1n = VFNMS(LDK(KP707106781), T1e, T17); + T1o = VFMA(LDK(KP707106781), T1j, T1i); + T1p = BYTWJ(&(W[TWVL * 8]), VFNMSI(T1o, T1n)); + T1q = BYTWJ(&(W[TWVL * 4]), VFMAI(T1o, T1n)); + ST(&(x[WS(vs, 5) + WS(rs, 2)]), T1p, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), T1q, ms, &(x[WS(vs, 3)])); + } + { + V Tl, Tm, Tj, Tk; + Tj = VFNMS(LDK(KP707106781), Ta, T3); + Tk = VFMA(LDK(KP707106781), Tf, Te); + Tl = BYTWJ(&(W[TWVL * 8]), VFNMSI(Tk, Tj)); + Tm = BYTWJ(&(W[TWVL * 4]), VFMAI(Tk, Tj)); + ST(&(x[WS(vs, 5)]), Tl, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3)]), Tm, ms, &(x[WS(vs, 3)])); + } + { + V T2t, T2u, T2r, T2s; + T2r = VFNMS(LDK(KP707106781), T2i, T2b); + T2s = VFMA(LDK(KP707106781), T2n, T2m); + T2t = BYTWJ(&(W[TWVL * 8]), VFNMSI(T2s, T2r)); + T2u = BYTWJ(&(W[TWVL * 4]), VFMAI(T2s, T2r)); + ST(&(x[WS(vs, 5) + WS(rs, 4)]), T2t, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T2u, ms, &(x[WS(vs, 3)])); + } + { + V T3x, T3y, T3v, T3w; + T3v = VFNMS(LDK(KP707106781), T3m, T3f); + T3w = VFMA(LDK(KP707106781), T3r, T3q); + T3x = BYTWJ(&(W[TWVL * 8]), VFNMSI(T3w, T3v)); + T3y = BYTWJ(&(W[TWVL * 4]), VFMAI(T3w, T3v)); + ST(&(x[WS(vs, 5) + WS(rs, 6)]), T3x, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3) + WS(rs, 6)]), T3y, ms, &(x[WS(vs, 3)])); + } + { + V TS, TT, TQ, TR; + TQ = VFNMS(LDK(KP707106781), TH, TA); + TR = VFMA(LDK(KP707106781), TM, TL); + TS = BYTWJ(&(W[TWVL * 8]), VFNMSI(TR, TQ)); + TT = BYTWJ(&(W[TWVL * 4]), VFMAI(TR, TQ)); + ST(&(x[WS(vs, 5) + WS(rs, 1)]), TS, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TT, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T1W, T1X, T1U, T1V; + T1U = VFNMS(LDK(KP707106781), T1L, T1E); + T1V = VFMA(LDK(KP707106781), T1Q, T1P); + T1W = BYTWJ(&(W[TWVL * 8]), VFNMSI(T1V, T1U)); + T1X = BYTWJ(&(W[TWVL * 4]), VFMAI(T1V, T1U)); + ST(&(x[WS(vs, 5) + WS(rs, 3)]), T1W, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1X, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T30, T31, T2Y, T2Z; + T2Y = VFNMS(LDK(KP707106781), T2P, T2I); + T2Z = VFMA(LDK(KP707106781), T2U, T2T); + T30 = BYTWJ(&(W[TWVL * 8]), VFNMSI(T2Z, T2Y)); + T31 = BYTWJ(&(W[TWVL * 4]), VFMAI(T2Z, T2Y)); + ST(&(x[WS(vs, 5) + WS(rs, 5)]), T30, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 5)]), T31, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T44, T45, T42, T43; + T42 = VFNMS(LDK(KP707106781), T3T, T3M); + T43 = VFMA(LDK(KP707106781), T3Y, T3X); + T44 = BYTWJ(&(W[TWVL * 8]), VFNMSI(T43, T42)); + T45 = BYTWJ(&(W[TWVL * 4]), VFMAI(T43, T42)); + ST(&(x[WS(vs, 5) + WS(rs, 7)]), T44, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 7)]), T45, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("q1fv_8"), twinstr, &GENUS, {184, 112, 80, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_8) (planner *p) { + X(kdft_difsq_register) (p, q1fv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twidsq_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -dif -name q1fv_8 -include dft/simd/q1f.h */ + +/* + * This function contains 264 FP additions, 128 FP multiplications, + * (or, 264 additions, 128 multiplications, 0 fused multiply/add), + * 77 stack variables, 1 constants, and 128 memory accesses + */ +#include "dft/simd/q1f.h" + +static void q1fv_8(R *ri, R *ii, const R *W, stride rs, stride vs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, vs)) { + V T3, Tu, Tf, Tp, T1E, T25, T1Q, T20, T2b, T2C, T2n, T2x, T3M, T4d, T3Y; + V T48, TA, T11, TM, TW, T17, T1y, T1j, T1t, T2I, T39, T2U, T34, T3f, T3G; + V T3r, T3B, Ta, Tv, Tc, Ts, T1L, T26, T1N, T23, T2i, T2D, T2k, T2A, T3T; + V T4e, T3V, T4b, TH, T12, TJ, TZ, T1e, T1z, T1g, T1w, T2P, T3a, T2R, T37; + V T3m, T3H, T3o, T3E, T28, T14; + { + V T1, T2, Tn, Td, Te, To; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tn = VADD(T1, T2); + Td = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Te = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + To = VADD(Td, Te); + T3 = VSUB(T1, T2); + Tu = VSUB(Tn, To); + Tf = VSUB(Td, Te); + Tp = VADD(Tn, To); + } + { + V T1C, T1D, T1Y, T1O, T1P, T1Z; + T1C = LD(&(x[WS(vs, 3)]), ms, &(x[WS(vs, 3)])); + T1D = LD(&(x[WS(vs, 3) + WS(rs, 4)]), ms, &(x[WS(vs, 3)])); + T1Y = VADD(T1C, T1D); + T1O = LD(&(x[WS(vs, 3) + WS(rs, 2)]), ms, &(x[WS(vs, 3)])); + T1P = LD(&(x[WS(vs, 3) + WS(rs, 6)]), ms, &(x[WS(vs, 3)])); + T1Z = VADD(T1O, T1P); + T1E = VSUB(T1C, T1D); + T25 = VSUB(T1Y, T1Z); + T1Q = VSUB(T1O, T1P); + T20 = VADD(T1Y, T1Z); + } + { + V T29, T2a, T2v, T2l, T2m, T2w; + T29 = LD(&(x[WS(vs, 4)]), ms, &(x[WS(vs, 4)])); + T2a = LD(&(x[WS(vs, 4) + WS(rs, 4)]), ms, &(x[WS(vs, 4)])); + T2v = VADD(T29, T2a); + T2l = LD(&(x[WS(vs, 4) + WS(rs, 2)]), ms, &(x[WS(vs, 4)])); + T2m = LD(&(x[WS(vs, 4) + WS(rs, 6)]), ms, &(x[WS(vs, 4)])); + T2w = VADD(T2l, T2m); + T2b = VSUB(T29, T2a); + T2C = VSUB(T2v, T2w); + T2n = VSUB(T2l, T2m); + T2x = VADD(T2v, T2w); + } + { + V T3K, T3L, T46, T3W, T3X, T47; + T3K = LD(&(x[WS(vs, 7)]), ms, &(x[WS(vs, 7)])); + T3L = LD(&(x[WS(vs, 7) + WS(rs, 4)]), ms, &(x[WS(vs, 7)])); + T46 = VADD(T3K, T3L); + T3W = LD(&(x[WS(vs, 7) + WS(rs, 2)]), ms, &(x[WS(vs, 7)])); + T3X = LD(&(x[WS(vs, 7) + WS(rs, 6)]), ms, &(x[WS(vs, 7)])); + T47 = VADD(T3W, T3X); + T3M = VSUB(T3K, T3L); + T4d = VSUB(T46, T47); + T3Y = VSUB(T3W, T3X); + T48 = VADD(T46, T47); + } + { + V Ty, Tz, TU, TK, TL, TV; + Ty = LD(&(x[WS(vs, 1)]), ms, &(x[WS(vs, 1)])); + Tz = LD(&(x[WS(vs, 1) + WS(rs, 4)]), ms, &(x[WS(vs, 1)])); + TU = VADD(Ty, Tz); + TK = LD(&(x[WS(vs, 1) + WS(rs, 2)]), ms, &(x[WS(vs, 1)])); + TL = LD(&(x[WS(vs, 1) + WS(rs, 6)]), ms, &(x[WS(vs, 1)])); + TV = VADD(TK, TL); + TA = VSUB(Ty, Tz); + T11 = VSUB(TU, TV); + TM = VSUB(TK, TL); + TW = VADD(TU, TV); + } + { + V T15, T16, T1r, T1h, T1i, T1s; + T15 = LD(&(x[WS(vs, 2)]), ms, &(x[WS(vs, 2)])); + T16 = LD(&(x[WS(vs, 2) + WS(rs, 4)]), ms, &(x[WS(vs, 2)])); + T1r = VADD(T15, T16); + T1h = LD(&(x[WS(vs, 2) + WS(rs, 2)]), ms, &(x[WS(vs, 2)])); + T1i = LD(&(x[WS(vs, 2) + WS(rs, 6)]), ms, &(x[WS(vs, 2)])); + T1s = VADD(T1h, T1i); + T17 = VSUB(T15, T16); + T1y = VSUB(T1r, T1s); + T1j = VSUB(T1h, T1i); + T1t = VADD(T1r, T1s); + } + { + V T2G, T2H, T32, T2S, T2T, T33; + T2G = LD(&(x[WS(vs, 5)]), ms, &(x[WS(vs, 5)])); + T2H = LD(&(x[WS(vs, 5) + WS(rs, 4)]), ms, &(x[WS(vs, 5)])); + T32 = VADD(T2G, T2H); + T2S = LD(&(x[WS(vs, 5) + WS(rs, 2)]), ms, &(x[WS(vs, 5)])); + T2T = LD(&(x[WS(vs, 5) + WS(rs, 6)]), ms, &(x[WS(vs, 5)])); + T33 = VADD(T2S, T2T); + T2I = VSUB(T2G, T2H); + T39 = VSUB(T32, T33); + T2U = VSUB(T2S, T2T); + T34 = VADD(T32, T33); + } + { + V T3d, T3e, T3z, T3p, T3q, T3A; + T3d = LD(&(x[WS(vs, 6)]), ms, &(x[WS(vs, 6)])); + T3e = LD(&(x[WS(vs, 6) + WS(rs, 4)]), ms, &(x[WS(vs, 6)])); + T3z = VADD(T3d, T3e); + T3p = LD(&(x[WS(vs, 6) + WS(rs, 2)]), ms, &(x[WS(vs, 6)])); + T3q = LD(&(x[WS(vs, 6) + WS(rs, 6)]), ms, &(x[WS(vs, 6)])); + T3A = VADD(T3p, T3q); + T3f = VSUB(T3d, T3e); + T3G = VSUB(T3z, T3A); + T3r = VSUB(T3p, T3q); + T3B = VADD(T3z, T3A); + } + { + V T6, Tq, T9, Tr; + { + V T4, T5, T7, T8; + T4 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T5 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T6 = VSUB(T4, T5); + Tq = VADD(T4, T5); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = VSUB(T7, T8); + Tr = VADD(T7, T8); + } + Ta = VMUL(LDK(KP707106781), VADD(T6, T9)); + Tv = VBYI(VSUB(Tr, Tq)); + Tc = VMUL(LDK(KP707106781), VSUB(T9, T6)); + Ts = VADD(Tq, Tr); + } + { + V T1H, T21, T1K, T22; + { + V T1F, T1G, T1I, T1J; + T1F = LD(&(x[WS(vs, 3) + WS(rs, 1)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1G = LD(&(x[WS(vs, 3) + WS(rs, 5)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1H = VSUB(T1F, T1G); + T21 = VADD(T1F, T1G); + T1I = LD(&(x[WS(vs, 3) + WS(rs, 7)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1J = LD(&(x[WS(vs, 3) + WS(rs, 3)]), ms, &(x[WS(vs, 3) + WS(rs, 1)])); + T1K = VSUB(T1I, T1J); + T22 = VADD(T1I, T1J); + } + T1L = VMUL(LDK(KP707106781), VADD(T1H, T1K)); + T26 = VBYI(VSUB(T22, T21)); + T1N = VMUL(LDK(KP707106781), VSUB(T1K, T1H)); + T23 = VADD(T21, T22); + } + { + V T2e, T2y, T2h, T2z; + { + V T2c, T2d, T2f, T2g; + T2c = LD(&(x[WS(vs, 4) + WS(rs, 1)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2d = LD(&(x[WS(vs, 4) + WS(rs, 5)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2e = VSUB(T2c, T2d); + T2y = VADD(T2c, T2d); + T2f = LD(&(x[WS(vs, 4) + WS(rs, 7)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2g = LD(&(x[WS(vs, 4) + WS(rs, 3)]), ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2h = VSUB(T2f, T2g); + T2z = VADD(T2f, T2g); + } + T2i = VMUL(LDK(KP707106781), VADD(T2e, T2h)); + T2D = VBYI(VSUB(T2z, T2y)); + T2k = VMUL(LDK(KP707106781), VSUB(T2h, T2e)); + T2A = VADD(T2y, T2z); + } + { + V T3P, T49, T3S, T4a; + { + V T3N, T3O, T3Q, T3R; + T3N = LD(&(x[WS(vs, 7) + WS(rs, 1)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3O = LD(&(x[WS(vs, 7) + WS(rs, 5)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3P = VSUB(T3N, T3O); + T49 = VADD(T3N, T3O); + T3Q = LD(&(x[WS(vs, 7) + WS(rs, 7)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3R = LD(&(x[WS(vs, 7) + WS(rs, 3)]), ms, &(x[WS(vs, 7) + WS(rs, 1)])); + T3S = VSUB(T3Q, T3R); + T4a = VADD(T3Q, T3R); + } + T3T = VMUL(LDK(KP707106781), VADD(T3P, T3S)); + T4e = VBYI(VSUB(T4a, T49)); + T3V = VMUL(LDK(KP707106781), VSUB(T3S, T3P)); + T4b = VADD(T49, T4a); + } + { + V TD, TX, TG, TY; + { + V TB, TC, TE, TF; + TB = LD(&(x[WS(vs, 1) + WS(rs, 1)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TC = LD(&(x[WS(vs, 1) + WS(rs, 5)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TD = VSUB(TB, TC); + TX = VADD(TB, TC); + TE = LD(&(x[WS(vs, 1) + WS(rs, 7)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TF = LD(&(x[WS(vs, 1) + WS(rs, 3)]), ms, &(x[WS(vs, 1) + WS(rs, 1)])); + TG = VSUB(TE, TF); + TY = VADD(TE, TF); + } + TH = VMUL(LDK(KP707106781), VADD(TD, TG)); + T12 = VBYI(VSUB(TY, TX)); + TJ = VMUL(LDK(KP707106781), VSUB(TG, TD)); + TZ = VADD(TX, TY); + } + { + V T1a, T1u, T1d, T1v; + { + V T18, T19, T1b, T1c; + T18 = LD(&(x[WS(vs, 2) + WS(rs, 1)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T19 = LD(&(x[WS(vs, 2) + WS(rs, 5)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1a = VSUB(T18, T19); + T1u = VADD(T18, T19); + T1b = LD(&(x[WS(vs, 2) + WS(rs, 7)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1c = LD(&(x[WS(vs, 2) + WS(rs, 3)]), ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T1d = VSUB(T1b, T1c); + T1v = VADD(T1b, T1c); + } + T1e = VMUL(LDK(KP707106781), VADD(T1a, T1d)); + T1z = VBYI(VSUB(T1v, T1u)); + T1g = VMUL(LDK(KP707106781), VSUB(T1d, T1a)); + T1w = VADD(T1u, T1v); + } + { + V T2L, T35, T2O, T36; + { + V T2J, T2K, T2M, T2N; + T2J = LD(&(x[WS(vs, 5) + WS(rs, 1)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2K = LD(&(x[WS(vs, 5) + WS(rs, 5)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2L = VSUB(T2J, T2K); + T35 = VADD(T2J, T2K); + T2M = LD(&(x[WS(vs, 5) + WS(rs, 7)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2N = LD(&(x[WS(vs, 5) + WS(rs, 3)]), ms, &(x[WS(vs, 5) + WS(rs, 1)])); + T2O = VSUB(T2M, T2N); + T36 = VADD(T2M, T2N); + } + T2P = VMUL(LDK(KP707106781), VADD(T2L, T2O)); + T3a = VBYI(VSUB(T36, T35)); + T2R = VMUL(LDK(KP707106781), VSUB(T2O, T2L)); + T37 = VADD(T35, T36); + } + { + V T3i, T3C, T3l, T3D; + { + V T3g, T3h, T3j, T3k; + T3g = LD(&(x[WS(vs, 6) + WS(rs, 1)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3h = LD(&(x[WS(vs, 6) + WS(rs, 5)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3i = VSUB(T3g, T3h); + T3C = VADD(T3g, T3h); + T3j = LD(&(x[WS(vs, 6) + WS(rs, 7)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3k = LD(&(x[WS(vs, 6) + WS(rs, 3)]), ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3l = VSUB(T3j, T3k); + T3D = VADD(T3j, T3k); + } + T3m = VMUL(LDK(KP707106781), VADD(T3i, T3l)); + T3H = VBYI(VSUB(T3D, T3C)); + T3o = VMUL(LDK(KP707106781), VSUB(T3l, T3i)); + T3E = VADD(T3C, T3D); + } + ST(&(x[0]), VADD(Tp, Ts), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1t, T1w), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VADD(T34, T37), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T48, T4b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T3B, T3E), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T2x, T2A), ms, &(x[0])); + { + V Tt, T4c, T2B, T24; + ST(&(x[WS(rs, 3)]), VADD(T20, T23), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TW, TZ), ms, &(x[WS(rs, 1)])); + Tt = BYTWJ(&(W[TWVL * 6]), VSUB(Tp, Ts)); + ST(&(x[WS(vs, 4)]), Tt, ms, &(x[WS(vs, 4)])); + T4c = BYTWJ(&(W[TWVL * 6]), VSUB(T48, T4b)); + ST(&(x[WS(vs, 4) + WS(rs, 7)]), T4c, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T2B = BYTWJ(&(W[TWVL * 6]), VSUB(T2x, T2A)); + ST(&(x[WS(vs, 4) + WS(rs, 4)]), T2B, ms, &(x[WS(vs, 4)])); + T24 = BYTWJ(&(W[TWVL * 6]), VSUB(T20, T23)); + ST(&(x[WS(vs, 4) + WS(rs, 3)]), T24, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + } + { + V T10, T1x, T3F, T38, T1A, Tw; + T10 = BYTWJ(&(W[TWVL * 6]), VSUB(TW, TZ)); + ST(&(x[WS(vs, 4) + WS(rs, 1)]), T10, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1x = BYTWJ(&(W[TWVL * 6]), VSUB(T1t, T1w)); + ST(&(x[WS(vs, 4) + WS(rs, 2)]), T1x, ms, &(x[WS(vs, 4)])); + T3F = BYTWJ(&(W[TWVL * 6]), VSUB(T3B, T3E)); + ST(&(x[WS(vs, 4) + WS(rs, 6)]), T3F, ms, &(x[WS(vs, 4)])); + T38 = BYTWJ(&(W[TWVL * 6]), VSUB(T34, T37)); + ST(&(x[WS(vs, 4) + WS(rs, 5)]), T38, ms, &(x[WS(vs, 4) + WS(rs, 1)])); + T1A = BYTWJ(&(W[TWVL * 10]), VSUB(T1y, T1z)); + ST(&(x[WS(vs, 6) + WS(rs, 2)]), T1A, ms, &(x[WS(vs, 6)])); + Tw = BYTWJ(&(W[TWVL * 10]), VSUB(Tu, Tv)); + ST(&(x[WS(vs, 6)]), Tw, ms, &(x[WS(vs, 6)])); + } + { + V T2E, T3I, T13, T27, T3b, T4f; + T2E = BYTWJ(&(W[TWVL * 10]), VSUB(T2C, T2D)); + ST(&(x[WS(vs, 6) + WS(rs, 4)]), T2E, ms, &(x[WS(vs, 6)])); + T3I = BYTWJ(&(W[TWVL * 10]), VSUB(T3G, T3H)); + ST(&(x[WS(vs, 6) + WS(rs, 6)]), T3I, ms, &(x[WS(vs, 6)])); + T13 = BYTWJ(&(W[TWVL * 10]), VSUB(T11, T12)); + ST(&(x[WS(vs, 6) + WS(rs, 1)]), T13, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T27 = BYTWJ(&(W[TWVL * 10]), VSUB(T25, T26)); + ST(&(x[WS(vs, 6) + WS(rs, 3)]), T27, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T3b = BYTWJ(&(W[TWVL * 10]), VSUB(T39, T3a)); + ST(&(x[WS(vs, 6) + WS(rs, 5)]), T3b, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + T4f = BYTWJ(&(W[TWVL * 10]), VSUB(T4d, T4e)); + ST(&(x[WS(vs, 6) + WS(rs, 7)]), T4f, ms, &(x[WS(vs, 6) + WS(rs, 1)])); + } + { + V Tx, T1B, T3c, T4g, T3J, T2F; + Tx = BYTWJ(&(W[TWVL * 2]), VADD(Tu, Tv)); + ST(&(x[WS(vs, 2)]), Tx, ms, &(x[WS(vs, 2)])); + T1B = BYTWJ(&(W[TWVL * 2]), VADD(T1y, T1z)); + ST(&(x[WS(vs, 2) + WS(rs, 2)]), T1B, ms, &(x[WS(vs, 2)])); + T3c = BYTWJ(&(W[TWVL * 2]), VADD(T39, T3a)); + ST(&(x[WS(vs, 2) + WS(rs, 5)]), T3c, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T4g = BYTWJ(&(W[TWVL * 2]), VADD(T4d, T4e)); + ST(&(x[WS(vs, 2) + WS(rs, 7)]), T4g, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T3J = BYTWJ(&(W[TWVL * 2]), VADD(T3G, T3H)); + ST(&(x[WS(vs, 2) + WS(rs, 6)]), T3J, ms, &(x[WS(vs, 2)])); + T2F = BYTWJ(&(W[TWVL * 2]), VADD(T2C, T2D)); + ST(&(x[WS(vs, 2) + WS(rs, 4)]), T2F, ms, &(x[WS(vs, 2)])); + } + T28 = BYTWJ(&(W[TWVL * 2]), VADD(T25, T26)); + ST(&(x[WS(vs, 2) + WS(rs, 3)]), T28, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + T14 = BYTWJ(&(W[TWVL * 2]), VADD(T11, T12)); + ST(&(x[WS(vs, 2) + WS(rs, 1)]), T14, ms, &(x[WS(vs, 2) + WS(rs, 1)])); + { + V Th, Ti, Tb, Tg; + Tb = VADD(T3, Ta); + Tg = VBYI(VSUB(Tc, Tf)); + Th = BYTWJ(&(W[TWVL * 12]), VSUB(Tb, Tg)); + Ti = BYTWJ(&(W[0]), VADD(Tb, Tg)); + ST(&(x[WS(vs, 7)]), Th, ms, &(x[WS(vs, 7)])); + ST(&(x[WS(vs, 1)]), Ti, ms, &(x[WS(vs, 1)])); + } + { + V T40, T41, T3U, T3Z; + T3U = VADD(T3M, T3T); + T3Z = VBYI(VSUB(T3V, T3Y)); + T40 = BYTWJ(&(W[TWVL * 12]), VSUB(T3U, T3Z)); + T41 = BYTWJ(&(W[0]), VADD(T3U, T3Z)); + ST(&(x[WS(vs, 7) + WS(rs, 7)]), T40, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 7)]), T41, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V T2p, T2q, T2j, T2o; + T2j = VADD(T2b, T2i); + T2o = VBYI(VSUB(T2k, T2n)); + T2p = BYTWJ(&(W[TWVL * 12]), VSUB(T2j, T2o)); + T2q = BYTWJ(&(W[0]), VADD(T2j, T2o)); + ST(&(x[WS(vs, 7) + WS(rs, 4)]), T2p, ms, &(x[WS(vs, 7)])); + ST(&(x[WS(vs, 1) + WS(rs, 4)]), T2q, ms, &(x[WS(vs, 1)])); + } + { + V T1S, T1T, T1M, T1R; + T1M = VADD(T1E, T1L); + T1R = VBYI(VSUB(T1N, T1Q)); + T1S = BYTWJ(&(W[TWVL * 12]), VSUB(T1M, T1R)); + T1T = BYTWJ(&(W[0]), VADD(T1M, T1R)); + ST(&(x[WS(vs, 7) + WS(rs, 3)]), T1S, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 3)]), T1T, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V TO, TP, TI, TN; + TI = VADD(TA, TH); + TN = VBYI(VSUB(TJ, TM)); + TO = BYTWJ(&(W[TWVL * 12]), VSUB(TI, TN)); + TP = BYTWJ(&(W[0]), VADD(TI, TN)); + ST(&(x[WS(vs, 7) + WS(rs, 1)]), TO, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 1)]), TP, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V T1l, T1m, T1f, T1k; + T1f = VADD(T17, T1e); + T1k = VBYI(VSUB(T1g, T1j)); + T1l = BYTWJ(&(W[TWVL * 12]), VSUB(T1f, T1k)); + T1m = BYTWJ(&(W[0]), VADD(T1f, T1k)); + ST(&(x[WS(vs, 7) + WS(rs, 2)]), T1l, ms, &(x[WS(vs, 7)])); + ST(&(x[WS(vs, 1) + WS(rs, 2)]), T1m, ms, &(x[WS(vs, 1)])); + } + { + V T3t, T3u, T3n, T3s; + T3n = VADD(T3f, T3m); + T3s = VBYI(VSUB(T3o, T3r)); + T3t = BYTWJ(&(W[TWVL * 12]), VSUB(T3n, T3s)); + T3u = BYTWJ(&(W[0]), VADD(T3n, T3s)); + ST(&(x[WS(vs, 7) + WS(rs, 6)]), T3t, ms, &(x[WS(vs, 7)])); + ST(&(x[WS(vs, 1) + WS(rs, 6)]), T3u, ms, &(x[WS(vs, 1)])); + } + { + V T2W, T2X, T2Q, T2V; + T2Q = VADD(T2I, T2P); + T2V = VBYI(VSUB(T2R, T2U)); + T2W = BYTWJ(&(W[TWVL * 12]), VSUB(T2Q, T2V)); + T2X = BYTWJ(&(W[0]), VADD(T2Q, T2V)); + ST(&(x[WS(vs, 7) + WS(rs, 5)]), T2W, ms, &(x[WS(vs, 7) + WS(rs, 1)])); + ST(&(x[WS(vs, 1) + WS(rs, 5)]), T2X, ms, &(x[WS(vs, 1) + WS(rs, 1)])); + } + { + V T1p, T1q, T1n, T1o; + T1n = VSUB(T17, T1e); + T1o = VBYI(VADD(T1j, T1g)); + T1p = BYTWJ(&(W[TWVL * 8]), VSUB(T1n, T1o)); + T1q = BYTWJ(&(W[TWVL * 4]), VADD(T1n, T1o)); + ST(&(x[WS(vs, 5) + WS(rs, 2)]), T1p, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3) + WS(rs, 2)]), T1q, ms, &(x[WS(vs, 3)])); + } + { + V Tl, Tm, Tj, Tk; + Tj = VSUB(T3, Ta); + Tk = VBYI(VADD(Tf, Tc)); + Tl = BYTWJ(&(W[TWVL * 8]), VSUB(Tj, Tk)); + Tm = BYTWJ(&(W[TWVL * 4]), VADD(Tj, Tk)); + ST(&(x[WS(vs, 5)]), Tl, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3)]), Tm, ms, &(x[WS(vs, 3)])); + } + { + V T2t, T2u, T2r, T2s; + T2r = VSUB(T2b, T2i); + T2s = VBYI(VADD(T2n, T2k)); + T2t = BYTWJ(&(W[TWVL * 8]), VSUB(T2r, T2s)); + T2u = BYTWJ(&(W[TWVL * 4]), VADD(T2r, T2s)); + ST(&(x[WS(vs, 5) + WS(rs, 4)]), T2t, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3) + WS(rs, 4)]), T2u, ms, &(x[WS(vs, 3)])); + } + { + V T3x, T3y, T3v, T3w; + T3v = VSUB(T3f, T3m); + T3w = VBYI(VADD(T3r, T3o)); + T3x = BYTWJ(&(W[TWVL * 8]), VSUB(T3v, T3w)); + T3y = BYTWJ(&(W[TWVL * 4]), VADD(T3v, T3w)); + ST(&(x[WS(vs, 5) + WS(rs, 6)]), T3x, ms, &(x[WS(vs, 5)])); + ST(&(x[WS(vs, 3) + WS(rs, 6)]), T3y, ms, &(x[WS(vs, 3)])); + } + { + V TS, TT, TQ, TR; + TQ = VSUB(TA, TH); + TR = VBYI(VADD(TM, TJ)); + TS = BYTWJ(&(W[TWVL * 8]), VSUB(TQ, TR)); + TT = BYTWJ(&(W[TWVL * 4]), VADD(TQ, TR)); + ST(&(x[WS(vs, 5) + WS(rs, 1)]), TS, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 1)]), TT, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T1W, T1X, T1U, T1V; + T1U = VSUB(T1E, T1L); + T1V = VBYI(VADD(T1Q, T1N)); + T1W = BYTWJ(&(W[TWVL * 8]), VSUB(T1U, T1V)); + T1X = BYTWJ(&(W[TWVL * 4]), VADD(T1U, T1V)); + ST(&(x[WS(vs, 5) + WS(rs, 3)]), T1W, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 3)]), T1X, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T30, T31, T2Y, T2Z; + T2Y = VSUB(T2I, T2P); + T2Z = VBYI(VADD(T2U, T2R)); + T30 = BYTWJ(&(W[TWVL * 8]), VSUB(T2Y, T2Z)); + T31 = BYTWJ(&(W[TWVL * 4]), VADD(T2Y, T2Z)); + ST(&(x[WS(vs, 5) + WS(rs, 5)]), T30, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 5)]), T31, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + { + V T44, T45, T42, T43; + T42 = VSUB(T3M, T3T); + T43 = VBYI(VADD(T3Y, T3V)); + T44 = BYTWJ(&(W[TWVL * 8]), VSUB(T42, T43)); + T45 = BYTWJ(&(W[TWVL * 4]), VADD(T42, T43)); + ST(&(x[WS(vs, 5) + WS(rs, 7)]), T44, ms, &(x[WS(vs, 5) + WS(rs, 1)])); + ST(&(x[WS(vs, 3) + WS(rs, 7)]), T45, ms, &(x[WS(vs, 3) + WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("q1fv_8"), twinstr, &GENUS, {264, 128, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_q1fv_8) (planner *p) { + X(kdft_difsq_register) (p, q1fv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_10.c new file mode 100644 index 000000000..bcd36b604 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_10.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1buv_10 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 51 FP additions, 40 FP multiplications, + * (or, 33 additions, 22 multiplications, 18 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V T4, TA, Tk, Tp, Tq, TE, TF, TG, T9, Te, Tf, TB, TC, TD, T1; + V T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 8]), T2); + T4 = VSUB(T1, T3); + TA = VADD(T1, T3); + { + V Th, To, Tj, Tm; + { + V Tg, Tn, Ti, Tl; + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 6]), Tg); + Tn = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[0]), Tn); + Ti = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 16]), Ti); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 10]), Tl); + } + Tk = VSUB(Th, Tj); + Tp = VSUB(Tm, To); + Tq = VADD(Tk, Tp); + TE = VADD(Th, Tj); + TF = VADD(Tm, To); + TG = VADD(TE, TF); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 2]), T5); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 12]), T7); + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 14]), Ta); + } + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + TB = VADD(T6, T8); + TC = VADD(Tb, Td); + TD = VADD(TB, TC); + } + { + V Tt, Tr, Ts, Tx, Tz, Tv, Tw, Ty, Tu; + Tt = VSUB(Tf, Tq); + Tr = VADD(Tf, Tq); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tv = VSUB(T9, Te); + Tw = VSUB(Tk, Tp); + Tx = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tv)); + Tz = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tv, Tw)); + ST(&(x[WS(rs, 5)]), VADD(T4, Tr), ms, &(x[WS(rs, 1)])); + Ty = VFNMS(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFMAI(Tz, Ty), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFMAI(Tx, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFNMSI(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TJ, TH, TI, TN, TP, TL, TM, TO, TK; + TJ = VSUB(TD, TG); + TH = VADD(TD, TG); + TI = VFNMS(LDK(KP250000000), TH, TA); + TL = VSUB(TE, TF); + TM = VSUB(TB, TC); + TN = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TM, TL)); + TP = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TL, TM)); + ST(&(x[0]), VADD(TA, TH), ms, &(x[0])); + TO = VFMA(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 4)]), VFNMSI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFMAI(TP, TO), ms, &(x[0])); + TK = VFNMS(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 2)]), VFNMSI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(TN, TK), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1buv_10"), twinstr, &GENUS, {33, 22, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_10) (planner *p) { + X(kdft_dit_register) (p, t1buv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1buv_10 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 51 FP additions, 30 FP multiplications, + * (or, 45 additions, 24 multiplications, 6 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V Tu, TH, Tg, Tl, Tp, TD, TE, TJ, T5, Ta, To, TA, TB, TI, Tr; + V Tt, Ts; + Tr = LD(&(x[0]), ms, &(x[0])); + Ts = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 8]), Ts); + Tu = VSUB(Tr, Tt); + TH = VADD(Tr, Tt); + { + V Td, Tk, Tf, Ti; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 6]), Tc); + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[0]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTW(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 10]), Th); + } + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tp = VADD(Tg, Tl); + TD = VADD(Td, Tf); + TE = VADD(Ti, Tk); + TJ = VADD(TD, TE); + } + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTW(&(W[TWVL * 2]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 14]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + To = VADD(T5, Ta); + TA = VADD(T2, T4); + TB = VADD(T7, T9); + TI = VADD(TA, TB); + } + { + V Tq, Tv, Tw, Tn, Tz, Tb, Tm, Ty, Tx; + Tq = VMUL(LDK(KP559016994), VSUB(To, Tp)); + Tv = VADD(To, Tp); + Tw = VFNMS(LDK(KP250000000), Tv, Tu); + Tb = VSUB(T5, Ta); + Tm = VSUB(Tg, Tl); + Tn = VBYI(VFMA(LDK(KP951056516), Tb, VMUL(LDK(KP587785252), Tm))); + Tz = VBYI(VFNMS(LDK(KP951056516), Tm, VMUL(LDK(KP587785252), Tb))); + ST(&(x[WS(rs, 5)]), VADD(Tu, Tv), ms, &(x[WS(rs, 1)])); + Ty = VSUB(Tw, Tq); + ST(&(x[WS(rs, 3)]), VSUB(Ty, Tz), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tx = VADD(Tq, Tw); + ST(&(x[WS(rs, 1)]), VADD(Tn, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(Tx, Tn), ms, &(x[WS(rs, 1)])); + } + { + V TM, TK, TL, TG, TP, TC, TF, TO, TN; + TM = VMUL(LDK(KP559016994), VSUB(TI, TJ)); + TK = VADD(TI, TJ); + TL = VFNMS(LDK(KP250000000), TK, TH); + TC = VSUB(TA, TB); + TF = VSUB(TD, TE); + TG = VBYI(VFNMS(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TC))); + TP = VBYI(VFMA(LDK(KP951056516), TC, VMUL(LDK(KP587785252), TF))); + ST(&(x[0]), VADD(TH, TK), ms, &(x[0])); + TO = VADD(TM, TL); + ST(&(x[WS(rs, 4)]), VSUB(TO, TP), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(TP, TO), ms, &(x[0])); + TN = VSUB(TL, TM); + ST(&(x[WS(rs, 2)]), VADD(TG, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TN, TG), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1buv_10"), twinstr, &GENUS, {45, 24, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_10) (planner *p) { + X(kdft_dit_register) (p, t1buv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_2.c new file mode 100644 index 000000000..805462048 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1buv_2 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1buv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_2) (planner *p) { + X(kdft_dit_register) (p, t1buv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1buv_2 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1buv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_2) (planner *p) { + X(kdft_dit_register) (p, t1buv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_3.c new file mode 100644 index 000000000..2b4262e12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_3.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1buv_3 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 8 FP additions, 8 FP multiplications, + * (or, 5 additions, 5 multiplications, 3 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T1, T3, T5, T6, T2, T4, T7, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 2]), T4); + T6 = VADD(T3, T5); + ST(&(x[0]), VADD(T1, T6), ms, &(x[0])); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T8 = VMUL(LDK(KP866025403), VSUB(T3, T5)); + ST(&(x[WS(rs, 1)]), VFMAI(T8, T7), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFNMSI(T8, T7), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1buv_3"), twinstr, &GENUS, {5, 5, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_3) (planner *p) { + X(kdft_dit_register) (p, t1buv_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1buv_3 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 8 FP additions, 6 FP multiplications, + * (or, 7 additions, 5 multiplications, 1 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T6, T2, T4, T7, T1, T3, T5, T8; + T6 = LD(&(x[0]), ms, &(x[0])); + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 2]), T3); + T7 = VADD(T2, T4); + ST(&(x[0]), VADD(T6, T7), ms, &(x[0])); + T5 = VBYI(VMUL(LDK(KP866025403), VSUB(T2, T4))); + T8 = VFNMS(LDK(KP500000000), T7, T6); + ST(&(x[WS(rs, 1)]), VADD(T5, T8), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VSUB(T8, T5), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1buv_3"), twinstr, &GENUS, {7, 5, 1, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_3) (planner *p) { + X(kdft_dit_register) (p, t1buv_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_4.c new file mode 100644 index 000000000..a65ac4ab0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_4.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1buv_4 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 11 FP additions, 8 FP multiplications, + * (or, 9 additions, 6 multiplications, 2 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VSUB(T6, T8); + ST(&(x[WS(rs, 3)]), VFNMSI(T9, T4), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T9, T4), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1buv_4"), twinstr, &GENUS, {9, 6, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_4) (planner *p) { + X(kdft_dit_register) (p, t1buv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1buv_4 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 11 FP additions, 6 FP multiplications, + * (or, 11 additions, 6 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VBYI(VSUB(T6, T8)); + ST(&(x[WS(rs, 3)]), VSUB(T4, T9), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T4, T9), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1buv_4"), twinstr, &GENUS, {11, 6, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_4) (planner *p) { + X(kdft_dit_register) (p, t1buv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_5.c new file mode 100644 index 000000000..e49e25f11 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_5.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1buv_5 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 20 FP additions, 19 FP multiplications, + * (or, 11 additions, 10 multiplications, 9 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, Tg, Th, T6, Tb, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, Ta, T5, T8; + { + V T2, T9, T4, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T9 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 4]), T9); + T4 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 6]), T4); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 2]), T7); + } + Tg = VSUB(T3, T5); + Th = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tb = VADD(T8, Ta); + Tc = VADD(T6, Tb); + } + ST(&(x[0]), VADD(T1, Tc), ms, &(x[0])); + { + V Ti, Tk, Tf, Tj, Td, Te; + Ti = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Th, Tg)); + Tk = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tg, Th)); + Td = VFNMS(LDK(KP250000000), Tc, T1); + Te = VSUB(T6, Tb); + Tf = VFMA(LDK(KP559016994), Te, Td); + Tj = VFNMS(LDK(KP559016994), Te, Td); + ST(&(x[WS(rs, 1)]), VFMAI(Ti, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFNMSI(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFNMSI(Tk, Tj), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1buv_5"), twinstr, &GENUS, {11, 10, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_5) (planner *p) { + X(kdft_dit_register) (p, t1buv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1buv_5 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 20 FP additions, 14 FP multiplications, + * (or, 17 additions, 11 multiplications, 3 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V Tf, T5, Ta, Tc, Td, Tg; + Tf = LD(&(x[0]), ms, &(x[0])); + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 6]), T3); + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 2]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tc = VADD(T2, T4); + Td = VADD(T7, T9); + Tg = VADD(Tc, Td); + } + ST(&(x[0]), VADD(Tf, Tg), ms, &(x[0])); + { + V Tb, Tj, Ti, Tk, Te, Th; + Tb = VBYI(VFMA(LDK(KP951056516), T5, VMUL(LDK(KP587785252), Ta))); + Tj = VBYI(VFNMS(LDK(KP951056516), Ta, VMUL(LDK(KP587785252), T5))); + Te = VMUL(LDK(KP559016994), VSUB(Tc, Td)); + Th = VFNMS(LDK(KP250000000), Tg, Tf); + Ti = VADD(Te, Th); + Tk = VSUB(Th, Te); + ST(&(x[WS(rs, 1)]), VADD(Tb, Ti), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VSUB(Ti, Tb), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tj, Tk), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1buv_5"), twinstr, &GENUS, {17, 11, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_5) (planner *p) { + X(kdft_dit_register) (p, t1buv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_6.c new file mode 100644 index 000000000..8613487eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_6.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1buv_6 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 23 FP additions, 18 FP multiplications, + * (or, 17 additions, 12 multiplications, 6 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V T4, Ti, Te, Tk, T9, Tj, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 4]), T2); + T4 = VSUB(T1, T3); + Ti = VADD(T1, T3); + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[0]), Tc); + Te = VSUB(Tb, Td); + Tk = VADD(Tb, Td); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 2]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tj = VADD(T6, T8); + } + { + V Th, Tf, Tg, Tn, Tl, Tm; + Th = VMUL(LDK(KP866025403), VSUB(T9, Te)); + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP500000000), Tf, T4); + ST(&(x[WS(rs, 1)]), VFMAI(Th, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Th, Tg), ms, &(x[WS(rs, 1)])); + Tn = VMUL(LDK(KP866025403), VSUB(Tj, Tk)); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[WS(rs, 2)]), VFNMSI(Tn, Tm), ms, &(x[0])); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1buv_6"), twinstr, &GENUS, {17, 12, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_6) (planner *p) { + X(kdft_dit_register) (p, t1buv_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1buv_6 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 23 FP additions, 14 FP multiplications, + * (or, 21 additions, 12 multiplications, 2 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V Tf, Ti, Ta, Tk, T5, Tj, Tc, Te, Td; + Tc = LD(&(x[0]), ms, &(x[0])); + Td = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Te = BYTW(&(W[TWVL * 4]), Td); + Tf = VSUB(Tc, Te); + Ti = VADD(Tc, Te); + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 6]), T6); + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[0]), T8); + Ta = VSUB(T7, T9); + Tk = VADD(T7, T9); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTW(&(W[TWVL * 2]), T1); + T3 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 8]), T3); + T5 = VSUB(T2, T4); + Tj = VADD(T2, T4); + } + { + V Tb, Tg, Th, Tn, Tl, Tm; + Tb = VBYI(VMUL(LDK(KP866025403), VSUB(T5, Ta))); + Tg = VADD(T5, Ta); + Th = VFNMS(LDK(KP500000000), Tg, Tf); + ST(&(x[WS(rs, 1)]), VADD(Tb, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(Tf, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Th, Tb), ms, &(x[WS(rs, 1)])); + Tn = VBYI(VMUL(LDK(KP866025403), VSUB(Tj, Tk))); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[WS(rs, 2)]), VSUB(Tm, Tn), ms, &(x[0])); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1buv_6"), twinstr, &GENUS, {21, 12, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_6) (planner *p) { + X(kdft_dit_register) (p, t1buv_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_7.c new file mode 100644 index 000000000..619e437a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_7.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1buv_7 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 36 FP additions, 36 FP multiplications, + * (or, 15 additions, 15 multiplications, 21 fused multiply/add), + * 30 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V T1, Tk, Tm, Tl, T6, Tg, Tb, Th, Tu, Tp; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, Tf, Td, Ta, T8; + { + V T2, T4, Te, Tc, T9, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 10]), T4); + Te = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tf = BYTW(&(W[TWVL * 6]), Te); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + T9 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 8]), T9); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 2]), T7); + } + Tk = VSUB(Td, Tf); + Tm = VSUB(T3, T5); + Tl = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tg = VADD(Td, Tf); + Tb = VADD(T8, Ta); + Th = VFNMS(LDK(KP356895867), Tg, Tb); + Tu = VFNMS(LDK(KP356895867), Tb, T6); + Tp = VFNMS(LDK(KP356895867), T6, Tg); + } + ST(&(x[0]), VADD(T1, VADD(T6, VADD(Tb, Tg))), ms, &(x[0])); + { + V Tw, Ty, Tv, Tx; + Tv = VFNMS(LDK(KP692021471), Tu, Tg); + Tw = VFNMS(LDK(KP900968867), Tv, T1); + Tx = VFMA(LDK(KP554958132), Tk, Tm); + Ty = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), Tx, Tl)); + ST(&(x[WS(rs, 1)]), VFMAI(Ty, Tw), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VFNMSI(Ty, Tw), ms, &(x[0])); + } + { + V Tj, To, Ti, Tn; + Ti = VFNMS(LDK(KP692021471), Th, T6); + Tj = VFNMS(LDK(KP900968867), Ti, T1); + Tn = VFNMS(LDK(KP554958132), Tm, Tl); + To = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tn, Tk)); + ST(&(x[WS(rs, 3)]), VFMAI(To, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFNMSI(To, Tj), ms, &(x[0])); + } + { + V Tr, Tt, Tq, Ts; + Tq = VFNMS(LDK(KP692021471), Tp, Tb); + Tr = VFNMS(LDK(KP900968867), Tq, T1); + Ts = VFMA(LDK(KP554958132), Tl, Tk); + Tt = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Ts, Tm)); + ST(&(x[WS(rs, 2)]), VFMAI(Tt, Tr), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VFNMSI(Tt, Tr), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1buv_7"), twinstr, &GENUS, {15, 15, 21, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_7) (planner *p) { + X(kdft_dit_register) (p, t1buv_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1buv_7 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 36 FP additions, 30 FP multiplications, + * (or, 24 additions, 18 multiplications, 12 fused multiply/add), + * 21 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V Th, Tf, Ti, T5, Tk, Ta, Tj, To, Tp; + Th = LD(&(x[0]), ms, &(x[0])); + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tc = BYTW(&(W[TWVL * 2]), Tb); + Td = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Te = BYTW(&(W[TWVL * 8]), Td); + Tf = VSUB(Tc, Te); + Ti = VADD(Tc, Te); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 10]), T3); + T5 = VSUB(T2, T4); + Tk = VADD(T2, T4); + } + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 4]), T6); + T8 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T9 = BYTW(&(W[TWVL * 6]), T8); + Ta = VSUB(T7, T9); + Tj = VADD(T7, T9); + } + ST(&(x[0]), VADD(Th, VADD(Tk, VADD(Ti, Tj))), ms, &(x[0])); + To = VBYI(VFNMS(LDK(KP781831482), Ta, VFNMS(LDK(KP433883739), Tf, VMUL(LDK(KP974927912), T5)))); + Tp = VFMA(LDK(KP623489801), Tj, VFNMS(LDK(KP900968867), Ti, VFNMS(LDK(KP222520933), Tk, Th))); + ST(&(x[WS(rs, 2)]), VADD(To, Tp), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VSUB(Tp, To), ms, &(x[WS(rs, 1)])); + { + V Tg, Tl, Tm, Tn; + Tg = VBYI(VFMA(LDK(KP433883739), T5, VFNMS(LDK(KP781831482), Tf, VMUL(LDK(KP974927912), Ta)))); + Tl = VFMA(LDK(KP623489801), Ti, VFNMS(LDK(KP222520933), Tj, VFNMS(LDK(KP900968867), Tk, Th))); + ST(&(x[WS(rs, 3)]), VADD(Tg, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VSUB(Tl, Tg), ms, &(x[0])); + Tm = VBYI(VFMA(LDK(KP781831482), T5, VFMA(LDK(KP974927912), Tf, VMUL(LDK(KP433883739), Ta)))); + Tn = VFMA(LDK(KP623489801), Tk, VFNMS(LDK(KP900968867), Tj, VFNMS(LDK(KP222520933), Ti, Th))); + ST(&(x[WS(rs, 1)]), VADD(Tm, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1buv_7"), twinstr, &GENUS, {24, 18, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_7) (planner *p) { + X(kdft_dit_register) (p, t1buv_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_8.c new file mode 100644 index 000000000..68e244f9c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_8.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:56 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1buv_8 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 33 FP additions, 24 FP multiplications, + * (or, 23 additions, 14 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tl, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + Tj = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 10]), Tj); + Tl = VSUB(Ti, Tk); + Tr = VADD(Ti, Tk); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTW(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VSUB(Tq, Tr); + Tv = VSUB(Tt, Tu); + ST(&(x[WS(rs, 6)]), VFNMSI(Tv, Ts), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tv, Ts), ms, &(x[0])); + Tw = VADD(Tq, Tr); + Tx = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[0]), VADD(Tw, Tx), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Tm; + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP707106781), Tf, T4); + To = VFMA(LDK(KP707106781), Tf, T4); + Tm = VSUB(T9, Te); + Tn = VFNMS(LDK(KP707106781), Tm, Tl); + Tp = VFMA(LDK(KP707106781), Tm, Tl); + ST(&(x[WS(rs, 3)]), VFNMSI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Tp, To), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1buv_8"), twinstr, &GENUS, {23, 14, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_8) (planner *p) { + X(kdft_dit_register) (p, t1buv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1buv_8 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 33 FP additions, 16 FP multiplications, + * (or, 33 additions, 16 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V Tl, Tq, Tg, Tr, T5, Tt, Ta, Tu, Ti, Tk, Tj; + Ti = LD(&(x[0]), ms, &(x[0])); + Tj = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 6]), Tj); + Tl = VSUB(Ti, Tk); + Tq = VADD(Ti, Tk); + { + V Td, Tf, Tc, Te; + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 2]), Tc); + Te = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tf = BYTW(&(W[TWVL * 10]), Te); + Tg = VSUB(Td, Tf); + Tr = VADD(Td, Tf); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 8]), T3); + T5 = VSUB(T2, T4); + Tt = VADD(T2, T4); + } + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 12]), T6); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + Ta = VSUB(T7, T9); + Tu = VADD(T7, T9); + } + { + V Ts, Tv, Tw, Tx; + Ts = VSUB(Tq, Tr); + Tv = VBYI(VSUB(Tt, Tu)); + ST(&(x[WS(rs, 6)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VADD(Tq, Tr); + Tx = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[0]), VADD(Tw, Tx), ms, &(x[0])); + { + V Th, To, Tn, Tp, Tb, Tm; + Tb = VMUL(LDK(KP707106781), VSUB(T5, Ta)); + Th = VBYI(VSUB(Tb, Tg)); + To = VBYI(VADD(Tg, Tb)); + Tm = VMUL(LDK(KP707106781), VADD(T5, Ta)); + Tn = VSUB(Tl, Tm); + Tp = VADD(Tl, Tm); + ST(&(x[WS(rs, 3)]), VADD(Th, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VSUB(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tn, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1buv_8"), twinstr, &GENUS, {33, 16, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_8) (planner *p) { + X(kdft_dit_register) (p, t1buv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_9.c new file mode 100644 index 000000000..e084c9d7d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1buv_9.c @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1buv_9 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 54 FP additions, 54 FP multiplications, + * (or, 20 additions, 20 multiplications, 34 fused multiply/add), + * 50 stack variables, 19 constants, and 18 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP879385241, +0.879385241571816768108218554649462939872416269); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP666666666, +0.666666666666666666666666666666666666666666667); + DVK(KP673648177, +0.673648177666930348851716626769314796000375677); + DVK(KP898197570, +0.898197570222573798468955502359086394667167570); + DVK(KP826351822, +0.826351822333069651148283373230685203999624323); + DVK(KP420276625, +0.420276625461206169731530603237061658838781920); + DVK(KP907603734, +0.907603734547952313649323976213898122064543220); + DVK(KP347296355, +0.347296355333860697703433253538629592000751354); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP152703644, +0.152703644666139302296566746461370407999248646); + DVK(KP968908795, +0.968908795874236621082202410917456709164223497); + DVK(KP203604859, +0.203604859554852403062088995281827210665664861); + DVK(KP726681596, +0.726681596905677465811651808188092531873167623); + DVK(KP439692620, +0.439692620785908384054109277324731469936208134); + DVK(KP586256827, +0.586256827714544512072145703099641959914944179); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, Tx, TO, TP, Tf, Tp, Tk, Tl, Tq, Tu, TD, TC, TA, Tz; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + Tx = VSUB(T3, T5); + } + { + V T9, Tn, Tb, Td, Te, Th, Tj, To, T8, Tm; + T8 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T9 = BYTW(&(W[TWVL * 2]), T8); + Tm = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tn = BYTW(&(W[0]), Tm); + { + V Ta, Tc, Tg, Ti; + Ta = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tb = BYTW(&(W[TWVL * 8]), Ta); + Tc = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 14]), Tc); + Te = VADD(Tb, Td); + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 6]), Tg); + Ti = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 12]), Ti); + To = VADD(Th, Tj); + } + TO = VADD(Tn, To); + TP = VADD(T9, Te); + Tf = VFNMS(LDK(KP500000000), Te, T9); + Tp = VFNMS(LDK(KP500000000), To, Tn); + Tk = VSUB(Th, Tj); + Tl = VSUB(Td, Tb); + Tq = VFNMS(LDK(KP586256827), Tp, Tl); + Tu = VFNMS(LDK(KP439692620), Tk, Tf); + TD = VFNMS(LDK(KP726681596), Tk, Tp); + TC = VFMA(LDK(KP203604859), Tf, Tl); + TA = VFMA(LDK(KP968908795), Tp, Tk); + Tz = VFNMS(LDK(KP152703644), Tl, Tf); + } + { + V TS, TN, TQ, TR; + TS = VMUL(LDK(KP866025403), VSUB(TO, TP)); + TN = VADD(T1, T6); + TQ = VADD(TO, TP); + TR = VFNMS(LDK(KP500000000), TQ, TN); + ST(&(x[WS(rs, 3)]), VFMAI(TS, TR), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(TQ, TN), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFNMSI(TS, TR), ms, &(x[0])); + } + { + V Ts, Tw, TJ, TM, T7, TF, TL, Tr, Tv; + Tr = VFNMS(LDK(KP347296355), Tq, Tk); + Ts = VFNMS(LDK(KP907603734), Tr, Tf); + Tv = VFNMS(LDK(KP420276625), Tu, Tl); + Tw = VFNMS(LDK(KP826351822), Tv, Tp); + { + V TH, TI, TE, TB; + TH = VFNMS(LDK(KP898197570), TD, TC); + TI = VFMA(LDK(KP673648177), TA, Tz); + TJ = VFMA(LDK(KP666666666), TI, TH); + TM = VMUL(LDK(KP984807753), VFMA(LDK(KP879385241), Tx, TI)); + T7 = VFNMS(LDK(KP500000000), T6, T1); + TE = VFMA(LDK(KP898197570), TD, TC); + TB = VFNMS(LDK(KP673648177), TA, Tz); + TF = VFNMS(LDK(KP500000000), TE, TB); + TL = VFMA(LDK(KP852868531), TE, T7); + } + ST(&(x[WS(rs, 1)]), VFMAI(TM, TL), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VFNMSI(TM, TL), ms, &(x[0])); + { + V Tt, Ty, TG, TK; + Tt = VFNMS(LDK(KP939692620), Ts, T7); + Ty = VMUL(LDK(KP984807753), VFNMS(LDK(KP879385241), Tx, Tw)); + ST(&(x[WS(rs, 7)]), VFNMSI(Ty, Tt), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(Ty, Tt), ms, &(x[0])); + TG = VFMA(LDK(KP852868531), TF, T7); + TK = VMUL(LDK(KP866025403), VFNMS(LDK(KP852868531), TJ, Tx)); + ST(&(x[WS(rs, 4)]), VFMAI(TK, TG), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VFNMSI(TK, TG), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1buv_9"), twinstr, &GENUS, {20, 20, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_9) (planner *p) { + X(kdft_dit_register) (p, t1buv_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1buv_9 -include dft/simd/t1bu.h -sign 1 */ + +/* + * This function contains 54 FP additions, 42 FP multiplications, + * (or, 38 additions, 26 multiplications, 16 fused multiply/add), + * 38 stack variables, 14 constants, and 18 memory accesses + */ +#include "dft/simd/t1bu.h" + +static void t1buv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP296198132, +0.296198132726023843175338011893050938967728390); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP173648177, +0.173648177666930348851716626769314796000375677); + DVK(KP556670399, +0.556670399226419366452912952047023132968291906); + DVK(KP766044443, +0.766044443118978035202392650555416673935832457); + DVK(KP642787609, +0.642787609686539326322643409907263432907559884); + DVK(KP663413948, +0.663413948168938396205421319635891297216863310); + DVK(KP150383733, +0.150383733180435296639271897612501926072238258); + DVK(KP342020143, +0.342020143325668733044099614682259580763083368); + DVK(KP813797681, +0.813797681349373692844693217248393223289101568); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, Tu, Tg, Tf, TD, Tq, Tp, TE; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + Tu = VMUL(LDK(KP866025403), VSUB(T3, T5)); + } + { + V T9, Td, Tb, T8, Tc, Ta, Te; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[0]), T8); + Tc = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 12]), Tc); + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 6]), Ta); + Tg = VSUB(Tb, Td); + Te = VADD(Tb, Td); + Tf = VFNMS(LDK(KP500000000), Te, T9); + TD = VADD(T9, Te); + } + { + V Tj, Tn, Tl, Ti, Tm, Tk, To; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 2]), Ti); + Tm = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 14]), Tm); + Tk = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tl = BYTW(&(W[TWVL * 8]), Tk); + Tq = VSUB(Tl, Tn); + To = VADD(Tl, Tn); + Tp = VFNMS(LDK(KP500000000), To, Tj); + TE = VADD(Tj, To); + } + { + V TF, TG, TH, TI; + TF = VBYI(VMUL(LDK(KP866025403), VSUB(TD, TE))); + TG = VADD(T1, T6); + TH = VADD(TD, TE); + TI = VFNMS(LDK(KP500000000), TH, TG); + ST(&(x[WS(rs, 3)]), VADD(TF, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(TG, TH), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VSUB(TI, TF), ms, &(x[0])); + } + { + V TC, Tv, Tw, Tx, Th, Tr, Ts, T7, TB; + TC = VBYI(VSUB(VFMA(LDK(KP984807753), Tf, VFMA(LDK(KP813797681), Tq, VFNMS(LDK(KP150383733), Tg, VMUL(LDK(KP342020143), Tp)))), Tu)); + Tv = VFMA(LDK(KP663413948), Tg, VMUL(LDK(KP642787609), Tf)); + Tw = VFMA(LDK(KP150383733), Tq, VMUL(LDK(KP984807753), Tp)); + Tx = VADD(Tv, Tw); + Th = VFNMS(LDK(KP556670399), Tg, VMUL(LDK(KP766044443), Tf)); + Tr = VFNMS(LDK(KP852868531), Tq, VMUL(LDK(KP173648177), Tp)); + Ts = VADD(Th, Tr); + T7 = VFNMS(LDK(KP500000000), T6, T1); + TB = VFMA(LDK(KP852868531), Tg, VFMA(LDK(KP173648177), Tf, VFMA(LDK(KP296198132), Tq, VFNMS(LDK(KP939692620), Tp, T7)))); + ST(&(x[WS(rs, 7)]), VSUB(TB, TC), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(TB, TC), ms, &(x[0])); + { + V Tt, Ty, Tz, TA; + Tt = VADD(T7, Ts); + Ty = VBYI(VADD(Tu, Tx)); + ST(&(x[WS(rs, 8)]), VSUB(Tt, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tt, Ty), ms, &(x[WS(rs, 1)])); + Tz = VBYI(VADD(Tu, VFNMS(LDK(KP500000000), Tx, VMUL(LDK(KP866025403), VSUB(Th, Tr))))); + TA = VFMA(LDK(KP866025403), VSUB(Tw, Tv), VFNMS(LDK(KP500000000), Ts, T7)); + ST(&(x[WS(rs, 4)]), VADD(Tz, TA), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VSUB(TA, Tz), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1buv_9"), twinstr, &GENUS, {38, 26, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1buv_9) (planner *p) { + X(kdft_dit_register) (p, t1buv_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_10.c new file mode 100644 index 000000000..94c0afd26 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_10.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1bv_10 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 51 FP additions, 40 FP multiplications, + * (or, 33 additions, 22 multiplications, 18 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V T4, TA, Tk, Tp, Tq, TE, TF, TG, T9, Te, Tf, TB, TC, TD, T1; + V T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 8]), T2); + T4 = VSUB(T1, T3); + TA = VADD(T1, T3); + { + V Th, To, Tj, Tm; + { + V Tg, Tn, Ti, Tl; + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 6]), Tg); + Tn = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[0]), Tn); + Ti = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 16]), Ti); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 10]), Tl); + } + Tk = VSUB(Th, Tj); + Tp = VSUB(Tm, To); + Tq = VADD(Tk, Tp); + TE = VADD(Th, Tj); + TF = VADD(Tm, To); + TG = VADD(TE, TF); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 2]), T5); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 12]), T7); + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 14]), Ta); + } + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + TB = VADD(T6, T8); + TC = VADD(Tb, Td); + TD = VADD(TB, TC); + } + { + V Tt, Tr, Ts, Tx, Tz, Tv, Tw, Ty, Tu; + Tt = VSUB(Tf, Tq); + Tr = VADD(Tf, Tq); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tv = VSUB(T9, Te); + Tw = VSUB(Tk, Tp); + Tx = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tv)); + Tz = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tv, Tw)); + ST(&(x[WS(rs, 5)]), VADD(T4, Tr), ms, &(x[WS(rs, 1)])); + Ty = VFNMS(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFMAI(Tz, Ty), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFMAI(Tx, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFNMSI(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TJ, TH, TI, TN, TP, TL, TM, TO, TK; + TJ = VSUB(TD, TG); + TH = VADD(TD, TG); + TI = VFNMS(LDK(KP250000000), TH, TA); + TL = VSUB(TE, TF); + TM = VSUB(TB, TC); + TN = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TM, TL)); + TP = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TL, TM)); + ST(&(x[0]), VADD(TA, TH), ms, &(x[0])); + TO = VFMA(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 4)]), VFNMSI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFMAI(TP, TO), ms, &(x[0])); + TK = VFNMS(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 2)]), VFNMSI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(TN, TK), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1bv_10"), twinstr, &GENUS, {33, 22, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_10) (planner *p) { + X(kdft_dit_register) (p, t1bv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1bv_10 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 51 FP additions, 30 FP multiplications, + * (or, 45 additions, 24 multiplications, 6 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V Tu, TH, Tg, Tl, Tp, TD, TE, TJ, T5, Ta, To, TA, TB, TI, Tr; + V Tt, Ts; + Tr = LD(&(x[0]), ms, &(x[0])); + Ts = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 8]), Ts); + Tu = VSUB(Tr, Tt); + TH = VADD(Tr, Tt); + { + V Td, Tk, Tf, Ti; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 6]), Tc); + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[0]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTW(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 10]), Th); + } + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tp = VADD(Tg, Tl); + TD = VADD(Td, Tf); + TE = VADD(Ti, Tk); + TJ = VADD(TD, TE); + } + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTW(&(W[TWVL * 2]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 14]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + To = VADD(T5, Ta); + TA = VADD(T2, T4); + TB = VADD(T7, T9); + TI = VADD(TA, TB); + } + { + V Tq, Tv, Tw, Tn, Tz, Tb, Tm, Ty, Tx; + Tq = VMUL(LDK(KP559016994), VSUB(To, Tp)); + Tv = VADD(To, Tp); + Tw = VFNMS(LDK(KP250000000), Tv, Tu); + Tb = VSUB(T5, Ta); + Tm = VSUB(Tg, Tl); + Tn = VBYI(VFMA(LDK(KP951056516), Tb, VMUL(LDK(KP587785252), Tm))); + Tz = VBYI(VFNMS(LDK(KP951056516), Tm, VMUL(LDK(KP587785252), Tb))); + ST(&(x[WS(rs, 5)]), VADD(Tu, Tv), ms, &(x[WS(rs, 1)])); + Ty = VSUB(Tw, Tq); + ST(&(x[WS(rs, 3)]), VSUB(Ty, Tz), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tx = VADD(Tq, Tw); + ST(&(x[WS(rs, 1)]), VADD(Tn, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(Tx, Tn), ms, &(x[WS(rs, 1)])); + } + { + V TM, TK, TL, TG, TP, TC, TF, TO, TN; + TM = VMUL(LDK(KP559016994), VSUB(TI, TJ)); + TK = VADD(TI, TJ); + TL = VFNMS(LDK(KP250000000), TK, TH); + TC = VSUB(TA, TB); + TF = VSUB(TD, TE); + TG = VBYI(VFNMS(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TC))); + TP = VBYI(VFMA(LDK(KP951056516), TC, VMUL(LDK(KP587785252), TF))); + ST(&(x[0]), VADD(TH, TK), ms, &(x[0])); + TO = VADD(TM, TL); + ST(&(x[WS(rs, 4)]), VSUB(TO, TP), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(TP, TO), ms, &(x[0])); + TN = VSUB(TL, TM); + ST(&(x[WS(rs, 2)]), VADD(TG, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TN, TG), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1bv_10"), twinstr, &GENUS, {45, 24, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_10) (planner *p) { + X(kdft_dit_register) (p, t1bv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_12.c new file mode 100644 index 000000000..841c3f6cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_12.c @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name t1bv_12 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 59 FP additions, 42 FP multiplications, + * (or, 41 additions, 24 multiplications, 18 fused multiply/add), + * 28 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_12(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 22)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(12, rs)) { + V T1, TK, T6, TA, Tq, TI, Tv, TE, T9, TL, Te, TB, Ti, TH, Tn; + V TD; + { + V T5, T3, T4, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 14]), T4); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 6]), T2); + TK = VSUB(T3, T5); + T6 = VADD(T3, T5); + TA = VFNMS(LDK(KP500000000), T6, T1); + } + { + V Tu, Ts, Tp, Tt, Tr; + Tp = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tq = BYTW(&(W[TWVL * 16]), Tp); + Tt = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tu = BYTW(&(W[TWVL * 8]), Tt); + Tr = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ts = BYTW(&(W[0]), Tr); + TI = VSUB(Tu, Ts); + Tv = VADD(Ts, Tu); + TE = VFNMS(LDK(KP500000000), Tv, Tq); + } + { + V Td, Tb, T8, Tc, Ta; + T8 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T9 = BYTW(&(W[TWVL * 10]), T8); + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 2]), Tc); + Ta = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 18]), Ta); + TL = VSUB(Tb, Td); + Te = VADD(Tb, Td); + TB = VFNMS(LDK(KP500000000), Te, T9); + } + { + V Tm, Tk, Th, Tl, Tj; + Th = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ti = BYTW(&(W[TWVL * 4]), Th); + Tl = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tm = BYTW(&(W[TWVL * 20]), Tl); + Tj = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[TWVL * 12]), Tj); + TH = VSUB(Tk, Tm); + Tn = VADD(Tk, Tm); + TD = VFNMS(LDK(KP500000000), Tn, Ti); + } + { + V Tg, Ty, Tx, Tz; + { + V T7, Tf, To, Tw; + T7 = VADD(T1, T6); + Tf = VADD(T9, Te); + Tg = VSUB(T7, Tf); + Ty = VADD(T7, Tf); + To = VADD(Ti, Tn); + Tw = VADD(Tq, Tv); + Tx = VSUB(To, Tw); + Tz = VADD(To, Tw); + } + ST(&(x[WS(rs, 3)]), VFNMSI(Tx, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(Ty, Tz), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VFMAI(Tx, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(Ty, Tz), ms, &(x[0])); + } + { + V TS, TW, TV, TX; + { + V TQ, TR, TT, TU; + TQ = VSUB(TA, TB); + TR = VADD(TH, TI); + TS = VFNMS(LDK(KP866025403), TR, TQ); + TW = VFMA(LDK(KP866025403), TR, TQ); + TT = VSUB(TD, TE); + TU = VSUB(TK, TL); + TV = VFMA(LDK(KP866025403), TU, TT); + TX = VFNMS(LDK(KP866025403), TU, TT); + } + ST(&(x[WS(rs, 1)]), VFMAI(TV, TS), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(TX, TW), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(TV, TS), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(TX, TW), ms, &(x[WS(rs, 1)])); + } + { + V TG, TO, TN, TP; + { + V TC, TF, TJ, TM; + TC = VADD(TA, TB); + TF = VADD(TD, TE); + TG = VSUB(TC, TF); + TO = VADD(TC, TF); + TJ = VSUB(TH, TI); + TM = VADD(TK, TL); + TN = VMUL(LDK(KP866025403), VSUB(TJ, TM)); + TP = VMUL(LDK(KP866025403), VADD(TM, TJ)); + } + ST(&(x[WS(rs, 10)]), VFNMSI(TN, TG), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TG), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFNMSI(TP, TO), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 12, XSIMD_STRING("t1bv_12"), twinstr, &GENUS, {41, 24, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_12) (planner *p) { + X(kdft_dit_register) (p, t1bv_12, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name t1bv_12 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 59 FP additions, 30 FP multiplications, + * (or, 55 additions, 26 multiplications, 4 fused multiply/add), + * 28 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_12(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 22)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(12, rs)) { + V T1, Tt, T6, T7, TB, Tq, TC, TD, T9, Tu, Te, Tf, Tx, Tl, Ty; + V Tz; + { + V T5, T3, T4, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 14]), T4); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 6]), T2); + Tt = VSUB(T3, T5); + T6 = VADD(T3, T5); + T7 = VFNMS(LDK(KP500000000), T6, T1); + } + { + V Tn, Tp, Tm, TA, To; + Tm = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tn = BYTW(&(W[0]), Tm); + TA = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TB = BYTW(&(W[TWVL * 16]), TA); + To = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tp = BYTW(&(W[TWVL * 8]), To); + Tq = VSUB(Tn, Tp); + TC = VADD(Tn, Tp); + TD = VFNMS(LDK(KP500000000), TC, TB); + } + { + V Td, Tb, T8, Tc, Ta; + T8 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T9 = BYTW(&(W[TWVL * 10]), T8); + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 2]), Tc); + Ta = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 18]), Ta); + Tu = VSUB(Tb, Td); + Te = VADD(Tb, Td); + Tf = VFNMS(LDK(KP500000000), Te, T9); + } + { + V Ti, Tk, Th, Tw, Tj; + Th = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Ti = BYTW(&(W[TWVL * 12]), Th); + Tw = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tx = BYTW(&(W[TWVL * 4]), Tw); + Tj = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[TWVL * 20]), Tj); + Tl = VSUB(Ti, Tk); + Ty = VADD(Ti, Tk); + Tz = VFNMS(LDK(KP500000000), Ty, Tx); + } + { + V Ts, TG, TF, TH; + { + V Tg, Tr, Tv, TE; + Tg = VSUB(T7, Tf); + Tr = VMUL(LDK(KP866025403), VSUB(Tl, Tq)); + Ts = VSUB(Tg, Tr); + TG = VADD(Tg, Tr); + Tv = VMUL(LDK(KP866025403), VSUB(Tt, Tu)); + TE = VSUB(Tz, TD); + TF = VBYI(VADD(Tv, TE)); + TH = VBYI(VSUB(TE, Tv)); + } + ST(&(x[WS(rs, 11)]), VSUB(Ts, TF), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(TG, TH), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Ts, TF), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VSUB(TG, TH), ms, &(x[WS(rs, 1)])); + } + { + V TS, TW, TV, TX; + { + V TQ, TR, TT, TU; + TQ = VADD(T1, T6); + TR = VADD(T9, Te); + TS = VSUB(TQ, TR); + TW = VADD(TQ, TR); + TT = VADD(Tx, Ty); + TU = VADD(TB, TC); + TV = VBYI(VSUB(TT, TU)); + TX = VADD(TT, TU); + } + ST(&(x[WS(rs, 3)]), VSUB(TS, TV), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(TW, TX), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VADD(TS, TV), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(TW, TX), ms, &(x[0])); + } + { + V TK, TO, TN, TP; + { + V TI, TJ, TL, TM; + TI = VADD(Tl, Tq); + TJ = VADD(Tt, Tu); + TK = VBYI(VMUL(LDK(KP866025403), VSUB(TI, TJ))); + TO = VBYI(VMUL(LDK(KP866025403), VADD(TJ, TI))); + TL = VADD(T7, Tf); + TM = VADD(Tz, TD); + TN = VSUB(TL, TM); + TP = VADD(TL, TM); + } + ST(&(x[WS(rs, 2)]), VADD(TK, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(TO, TP), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 12, XSIMD_STRING("t1bv_12"), twinstr, &GENUS, {55, 26, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_12) (planner *p) { + X(kdft_dit_register) (p, t1bv_12, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_15.c new file mode 100644 index 000000000..26e3d7e32 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_15.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:59 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 15 -name t1bv_15 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 92 FP additions, 77 FP multiplications, + * (or, 50 additions, 35 multiplications, 42 fused multiply/add), + * 50 stack variables, 8 constants, and 30 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_15(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP910592997, +0.910592997310029334643087372129977886038870291); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 28)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 28), MAKE_VOLATILE_STRIDE(15, rs)) { + V TV, T7, T1f, TM, TP, Tf, Tn, To, T1j, T1k, T1l, TW, TX, TY, Tw; + V TE, TF, T1g, T1h, T1i; + { + V T1, T5, T3, T4, T2, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 18]), T4); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 8]), T2); + TV = VSUB(T3, T5); + T6 = VADD(T3, T5); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T1f = VADD(T1, T6); + } + { + V T9, Tq, Ty, Th, Te, TK, Tv, TN, TD, TO, Tm, TL; + { + V T8, Tp, Tx, Tg; + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + Tp = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tq = BYTW(&(W[TWVL * 10]), Tp); + Tx = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Ty = BYTW(&(W[TWVL * 16]), Tx); + Tg = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 22]), Tg); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 14]), Ta); + Tc = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 24]), Tc); + Te = VADD(Tb, Td); + TK = VSUB(Tb, Td); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Ts = BYTW(&(W[TWVL * 20]), Tr); + Tt = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tu = BYTW(&(W[0]), Tt); + Tv = VADD(Ts, Tu); + TN = VSUB(Ts, Tu); + } + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 26]), Tz); + TB = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 6]), TB); + TD = VADD(TA, TC); + TO = VSUB(TA, TC); + } + { + V Tj, Tl, Ti, Tk; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 2]), Ti); + Tk = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tl = BYTW(&(W[TWVL * 12]), Tk); + Tm = VADD(Tj, Tl); + TL = VSUB(Tj, Tl); + } + TM = VSUB(TK, TL); + TP = VSUB(TN, TO); + Tf = VFNMS(LDK(KP500000000), Te, T9); + Tn = VFNMS(LDK(KP500000000), Tm, Th); + To = VADD(Tf, Tn); + T1j = VADD(Tq, Tv); + T1k = VADD(Ty, TD); + T1l = VADD(T1j, T1k); + TW = VADD(TK, TL); + TX = VADD(TN, TO); + TY = VADD(TW, TX); + Tw = VFNMS(LDK(KP500000000), Tv, Tq); + TE = VFNMS(LDK(KP500000000), TD, Ty); + TF = VADD(Tw, TE); + T1g = VADD(T9, Te); + T1h = VADD(Th, Tm); + T1i = VADD(T1g, T1h); + } + { + V T1o, T1m, T1n, T1s, T1u, T1q, T1r, T1t, T1p; + T1o = VSUB(T1i, T1l); + T1m = VADD(T1i, T1l); + T1n = VFNMS(LDK(KP250000000), T1m, T1f); + T1q = VSUB(T1j, T1k); + T1r = VSUB(T1g, T1h); + T1s = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1r, T1q)); + T1u = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1q, T1r)); + ST(&(x[0]), VADD(T1f, T1m), ms, &(x[0])); + T1t = VFMA(LDK(KP559016994), T1o, T1n); + ST(&(x[WS(rs, 6)]), VFMAI(T1u, T1t), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VFNMSI(T1u, T1t), ms, &(x[WS(rs, 1)])); + T1p = VFNMS(LDK(KP559016994), T1o, T1n); + ST(&(x[WS(rs, 3)]), VFMAI(T1s, T1p), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VFNMSI(T1s, T1p), ms, &(x[0])); + } + { + V TQ, T16, T1e, T11, T19, TU, T18, TJ, T1d, T15, TZ, T10; + TQ = VFMA(LDK(KP618033988), TP, TM); + T16 = VFNMS(LDK(KP618033988), TM, TP); + T1e = VMUL(LDK(KP866025403), VADD(TV, TY)); + TZ = VFNMS(LDK(KP250000000), TY, TV); + T10 = VSUB(TW, TX); + T11 = VFMA(LDK(KP559016994), T10, TZ); + T19 = VFNMS(LDK(KP559016994), T10, TZ); + { + V TS, TT, TI, TG, TH; + TS = VSUB(Tf, Tn); + TT = VSUB(Tw, TE); + TU = VFMA(LDK(KP618033988), TT, TS); + T18 = VFNMS(LDK(KP618033988), TS, TT); + TI = VSUB(To, TF); + TG = VADD(To, TF); + TH = VFNMS(LDK(KP250000000), TG, T7); + TJ = VFMA(LDK(KP559016994), TI, TH); + T1d = VADD(T7, TG); + T15 = VFNMS(LDK(KP559016994), TI, TH); + } + { + V TR, T12, T1b, T1c; + ST(&(x[WS(rs, 5)]), VFNMSI(T1e, T1d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 10)]), VFMAI(T1e, T1d), ms, &(x[0])); + TR = VFNMS(LDK(KP823639103), TQ, TJ); + T12 = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), T11, TU)); + ST(&(x[WS(rs, 1)]), VFMAI(T12, TR), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 14)]), VFNMSI(T12, TR), ms, &(x[0])); + T1b = VFMA(LDK(KP823639103), T16, T15); + T1c = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), T19, T18)); + ST(&(x[WS(rs, 7)]), VFNMSI(T1c, T1b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VFMAI(T1c, T1b), ms, &(x[0])); + { + V T17, T1a, T13, T14; + T17 = VFNMS(LDK(KP823639103), T16, T15); + T1a = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), T19, T18)); + ST(&(x[WS(rs, 2)]), VFNMSI(T1a, T17), ms, &(x[0])); + ST(&(x[WS(rs, 13)]), VFMAI(T1a, T17), ms, &(x[WS(rs, 1)])); + T13 = VFMA(LDK(KP823639103), TQ, TJ); + T14 = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), T11, TU)); + ST(&(x[WS(rs, 4)]), VFNMSI(T14, T13), ms, &(x[0])); + ST(&(x[WS(rs, 11)]), VFMAI(T14, T13), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 15, XSIMD_STRING("t1bv_15"), twinstr, &GENUS, {50, 35, 42, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_15) (planner *p) { + X(kdft_dit_register) (p, t1bv_15, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 15 -name t1bv_15 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 92 FP additions, 53 FP multiplications, + * (or, 78 additions, 39 multiplications, 14 fused multiply/add), + * 52 stack variables, 10 constants, and 30 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_15(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP216506350, +0.216506350946109661690930792688234045867850657); + DVK(KP484122918, +0.484122918275927110647408174972799951354115213); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP509036960, +0.509036960455127183450980863393907648510733164); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 28)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 28), MAKE_VOLATILE_STRIDE(15, rs)) { + V Ts, TV, T1f, TZ, T10, Tb, Tm, Tt, T1j, T1k, T1l, TI, TM, TR, Tz; + V TD, TQ, T1g, T1h, T1i; + { + V TT, Tr, Tp, Tq, To, TU; + TT = LD(&(x[0]), ms, &(x[0])); + Tq = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tr = BYTW(&(W[TWVL * 18]), Tq); + To = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tp = BYTW(&(W[TWVL * 8]), To); + Ts = VSUB(Tp, Tr); + TU = VADD(Tp, Tr); + TV = VFNMS(LDK(KP500000000), TU, TT); + T1f = VADD(TT, TU); + } + { + V Tx, TG, TK, TB, T5, Ty, Tg, TH, Tl, TL, Ta, TC; + { + V Tw, TF, TJ, TA; + Tw = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tx = BYTW(&(W[TWVL * 4]), Tw); + TF = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TG = BYTW(&(W[TWVL * 10]), TF); + TJ = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TK = BYTW(&(W[TWVL * 16]), TJ); + TA = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TB = BYTW(&(W[TWVL * 22]), TA); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T2 = BYTW(&(W[TWVL * 14]), T1); + T3 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 24]), T3); + T5 = VSUB(T2, T4); + Ty = VADD(T2, T4); + } + { + V Td, Tf, Tc, Te; + Tc = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 20]), Tc); + Te = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tf = BYTW(&(W[0]), Te); + Tg = VSUB(Td, Tf); + TH = VADD(Td, Tf); + } + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 26]), Th); + Tj = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 6]), Tj); + Tl = VSUB(Ti, Tk); + TL = VADD(Ti, Tk); + } + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 2]), T6); + T8 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 12]), T8); + Ta = VSUB(T7, T9); + TC = VADD(T7, T9); + } + TZ = VSUB(T5, Ta); + T10 = VSUB(Tg, Tl); + Tb = VADD(T5, Ta); + Tm = VADD(Tg, Tl); + Tt = VADD(Tb, Tm); + T1j = VADD(TG, TH); + T1k = VADD(TK, TL); + T1l = VADD(T1j, T1k); + TI = VFNMS(LDK(KP500000000), TH, TG); + TM = VFNMS(LDK(KP500000000), TL, TK); + TR = VADD(TI, TM); + Tz = VFNMS(LDK(KP500000000), Ty, Tx); + TD = VFNMS(LDK(KP500000000), TC, TB); + TQ = VADD(Tz, TD); + T1g = VADD(Tx, Ty); + T1h = VADD(TB, TC); + T1i = VADD(T1g, T1h); + } + { + V T1o, T1m, T1n, T1s, T1t, T1q, T1r, T1u, T1p; + T1o = VMUL(LDK(KP559016994), VSUB(T1i, T1l)); + T1m = VADD(T1i, T1l); + T1n = VFNMS(LDK(KP250000000), T1m, T1f); + T1q = VSUB(T1g, T1h); + T1r = VSUB(T1j, T1k); + T1s = VBYI(VFNMS(LDK(KP951056516), T1r, VMUL(LDK(KP587785252), T1q))); + T1t = VBYI(VFMA(LDK(KP951056516), T1q, VMUL(LDK(KP587785252), T1r))); + ST(&(x[0]), VADD(T1f, T1m), ms, &(x[0])); + T1u = VADD(T1o, T1n); + ST(&(x[WS(rs, 6)]), VADD(T1t, T1u), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VSUB(T1u, T1t), ms, &(x[WS(rs, 1)])); + T1p = VSUB(T1n, T1o); + ST(&(x[WS(rs, 3)]), VSUB(T1p, T1s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VADD(T1s, T1p), ms, &(x[0])); + } + { + V T11, T18, T1e, TO, T16, Tv, T15, TY, T1d, T19, TE, TN; + T11 = VFMA(LDK(KP823639103), TZ, VMUL(LDK(KP509036960), T10)); + T18 = VFNMS(LDK(KP823639103), T10, VMUL(LDK(KP509036960), TZ)); + T1e = VBYI(VMUL(LDK(KP866025403), VADD(Ts, Tt))); + TE = VSUB(Tz, TD); + TN = VSUB(TI, TM); + TO = VFMA(LDK(KP951056516), TE, VMUL(LDK(KP587785252), TN)); + T16 = VFNMS(LDK(KP951056516), TN, VMUL(LDK(KP587785252), TE)); + { + V Tn, Tu, TS, TW, TX; + Tn = VMUL(LDK(KP484122918), VSUB(Tb, Tm)); + Tu = VFNMS(LDK(KP216506350), Tt, VMUL(LDK(KP866025403), Ts)); + Tv = VADD(Tn, Tu); + T15 = VSUB(Tn, Tu); + TS = VMUL(LDK(KP559016994), VSUB(TQ, TR)); + TW = VADD(TQ, TR); + TX = VFNMS(LDK(KP250000000), TW, TV); + TY = VADD(TS, TX); + T1d = VADD(TV, TW); + T19 = VSUB(TX, TS); + } + { + V TP, T12, T1b, T1c; + ST(&(x[WS(rs, 5)]), VSUB(T1d, T1e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 10)]), VADD(T1e, T1d), ms, &(x[0])); + TP = VBYI(VADD(Tv, TO)); + T12 = VSUB(TY, T11); + ST(&(x[WS(rs, 1)]), VADD(TP, T12), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 14)]), VSUB(T12, TP), ms, &(x[0])); + T1b = VBYI(VSUB(T16, T15)); + T1c = VSUB(T19, T18); + ST(&(x[WS(rs, 7)]), VADD(T1b, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VSUB(T1c, T1b), ms, &(x[0])); + { + V T17, T1a, T13, T14; + T17 = VBYI(VADD(T15, T16)); + T1a = VADD(T18, T19); + ST(&(x[WS(rs, 2)]), VADD(T17, T1a), ms, &(x[0])); + ST(&(x[WS(rs, 13)]), VSUB(T1a, T17), ms, &(x[WS(rs, 1)])); + T13 = VBYI(VSUB(Tv, TO)); + T14 = VADD(T11, TY); + ST(&(x[WS(rs, 4)]), VADD(T13, T14), ms, &(x[0])); + ST(&(x[WS(rs, 11)]), VSUB(T14, T13), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 15, XSIMD_STRING("t1bv_15"), twinstr, &GENUS, {78, 39, 14, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_15) (planner *p) { + X(kdft_dit_register) (p, t1bv_15, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_16.c new file mode 100644 index 000000000..a0ce402d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_16.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:59 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t1bv_16 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 87 FP additions, 64 FP multiplications, + * (or, 53 additions, 30 multiplications, 34 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V T4, TW, T9, T19, TD, TI, TZ, T1a, Tf, Tk, Tl, T13, T1c, Tq, Tv; + V Tw, T16, T1d, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 14]), T2); + T4 = VADD(T1, T3); + TW = VSUB(T1, T3); + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 22]), T7); + T9 = VADD(T6, T8); + T19 = VSUB(T6, T8); + } + { + V TA, TH, TC, TF, TX, TY; + { + V Tz, TG, TB, TE; + Tz = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 2]), Tz); + TG = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TH = BYTW(&(W[TWVL * 10]), TG); + TB = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 18]), TB); + TE = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TF = BYTW(&(W[TWVL * 26]), TE); + } + TD = VADD(TA, TC); + TI = VADD(TF, TH); + TX = VSUB(TA, TC); + TY = VSUB(TF, TH); + TZ = VADD(TX, TY); + T1a = VSUB(TX, TY); + } + { + V Tc, Tj, Te, Th, T11, T12; + { + V Tb, Ti, Td, Tg; + Tb = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tc = BYTW(&(W[0]), Tb); + Ti = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 24]), Ti); + Td = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Te = BYTW(&(W[TWVL * 16]), Td); + Tg = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Th = BYTW(&(W[TWVL * 8]), Tg); + } + Tf = VADD(Tc, Te); + Tk = VADD(Th, Tj); + Tl = VSUB(Tf, Tk); + T11 = VSUB(Tc, Te); + T12 = VSUB(Th, Tj); + T13 = VFNMS(LDK(KP414213562), T12, T11); + T1c = VFMA(LDK(KP414213562), T11, T12); + } + { + V Tn, Tu, Tp, Ts, T14, T15; + { + V Tm, Tt, To, Tr; + Tm = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tn = BYTW(&(W[TWVL * 28]), Tm); + Tt = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tu = BYTW(&(W[TWVL * 20]), Tt); + To = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tp = BYTW(&(W[TWVL * 12]), To); + Tr = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ts = BYTW(&(W[TWVL * 4]), Tr); + } + Tq = VADD(Tn, Tp); + Tv = VADD(Ts, Tu); + Tw = VSUB(Tq, Tv); + T14 = VSUB(Tn, Tp); + T15 = VSUB(Tu, Ts); + T16 = VFNMS(LDK(KP414213562), T15, T14); + T1d = VFMA(LDK(KP414213562), T14, T15); + } + { + V Ty, TM, TL, TN; + { + V Ta, Tx, TJ, TK; + Ta = VSUB(T4, T9); + Tx = VADD(Tl, Tw); + Ty = VFNMS(LDK(KP707106781), Tx, Ta); + TM = VFMA(LDK(KP707106781), Tx, Ta); + TJ = VSUB(TD, TI); + TK = VSUB(Tl, Tw); + TL = VFNMS(LDK(KP707106781), TK, TJ); + TN = VFMA(LDK(KP707106781), TK, TJ); + } + ST(&(x[WS(rs, 6)]), VFNMSI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(TN, TM), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFMAI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TM), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VFNMS(LDK(KP707106781), TZ, TW); + T1j = VADD(T1c, T1d); + T1k = VFNMS(LDK(KP923879532), T1j, T1i); + T1o = VFMA(LDK(KP923879532), T1j, T1i); + T1l = VFNMS(LDK(KP707106781), T1a, T19); + T1m = VSUB(T13, T16); + T1n = VFMA(LDK(KP923879532), T1m, T1l); + T1p = VFNMS(LDK(KP923879532), T1m, T1l); + } + ST(&(x[WS(rs, 5)]), VFMAI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T1p, T1o), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(T1p, T1o), ms, &(x[WS(rs, 1)])); + } + { + V TQ, TU, TT, TV; + { + V TO, TP, TR, TS; + TO = VADD(T4, T9); + TP = VADD(TD, TI); + TQ = VSUB(TO, TP); + TU = VADD(TO, TP); + TR = VADD(Tf, Tk); + TS = VADD(Tq, Tv); + TT = VSUB(TR, TS); + TV = VADD(TR, TS); + } + ST(&(x[WS(rs, 12)]), VFNMSI(TT, TQ), ms, &(x[0])); + ST(&(x[0]), VADD(TU, TV), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(TT, TQ), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TU, TV), ms, &(x[0])); + } + { + V T18, T1g, T1f, T1h; + { + V T10, T17, T1b, T1e; + T10 = VFMA(LDK(KP707106781), TZ, TW); + T17 = VADD(T13, T16); + T18 = VFNMS(LDK(KP923879532), T17, T10); + T1g = VFMA(LDK(KP923879532), T17, T10); + T1b = VFMA(LDK(KP707106781), T1a, T19); + T1e = VSUB(T1c, T1d); + T1f = VFNMS(LDK(KP923879532), T1e, T1b); + T1h = VFMA(LDK(KP923879532), T1e, T1b); + } + ST(&(x[WS(rs, 7)]), VFNMSI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T1h, T1g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFNMSI(T1h, T1g), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t1bv_16"), twinstr, &GENUS, {53, 30, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_16) (planner *p) { + X(kdft_dit_register) (p, t1bv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t1bv_16 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 87 FP additions, 42 FP multiplications, + * (or, 83 additions, 38 multiplications, 4 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V TJ, T1b, TD, T1c, T17, T18, Ty, TK, T10, T11, T12, Tb, TM, T13, T14; + V T15, Tm, TN, TG, TI, TH; + TG = LD(&(x[0]), ms, &(x[0])); + TH = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + TI = BYTW(&(W[TWVL * 14]), TH); + TJ = VSUB(TG, TI); + T1b = VADD(TG, TI); + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 6]), Tz); + TB = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 22]), TB); + TD = VSUB(TA, TC); + T1c = VADD(TA, TC); + } + { + V Tp, Tw, Tr, Tu, Ts, Tx; + { + V To, Tv, Tq, Tt; + To = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 2]), To); + Tv = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tw = BYTW(&(W[TWVL * 10]), Tv); + Tq = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tr = BYTW(&(W[TWVL * 18]), Tq); + Tt = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tu = BYTW(&(W[TWVL * 26]), Tt); + } + T17 = VADD(Tp, Tr); + T18 = VADD(Tu, Tw); + Ts = VSUB(Tp, Tr); + Tx = VSUB(Tu, Tw); + Ty = VMUL(LDK(KP707106781), VSUB(Ts, Tx)); + TK = VMUL(LDK(KP707106781), VADD(Ts, Tx)); + } + { + V T2, T9, T4, T7, T5, Ta; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 24]), T8); + T3 = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 16]), T3); + T6 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 8]), T6); + } + T10 = VADD(T2, T4); + T11 = VADD(T7, T9); + T12 = VSUB(T10, T11); + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VFNMS(LDK(KP382683432), Ta, VMUL(LDK(KP923879532), T5)); + TM = VFMA(LDK(KP382683432), T5, VMUL(LDK(KP923879532), Ta)); + } + { + V Td, Tk, Tf, Ti, Tg, Tl; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 28]), Tc); + Tj = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[TWVL * 20]), Tj); + Te = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tf = BYTW(&(W[TWVL * 12]), Te); + Th = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ti = BYTW(&(W[TWVL * 4]), Th); + } + T13 = VADD(Td, Tf); + T14 = VADD(Ti, Tk); + T15 = VSUB(T13, T14); + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VFMA(LDK(KP923879532), Tg, VMUL(LDK(KP382683432), Tl)); + TN = VFNMS(LDK(KP382683432), Tg, VMUL(LDK(KP923879532), Tl)); + } + { + V T1a, T1g, T1f, T1h; + { + V T16, T19, T1d, T1e; + T16 = VMUL(LDK(KP707106781), VSUB(T12, T15)); + T19 = VSUB(T17, T18); + T1a = VBYI(VSUB(T16, T19)); + T1g = VBYI(VADD(T19, T16)); + T1d = VSUB(T1b, T1c); + T1e = VMUL(LDK(KP707106781), VADD(T12, T15)); + T1f = VSUB(T1d, T1e); + T1h = VADD(T1d, T1e); + } + ST(&(x[WS(rs, 6)]), VADD(T1a, T1f), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1h, T1g), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(T1f, T1a), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1g, T1h), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VADD(T1b, T1c); + T1j = VADD(T17, T18); + T1k = VSUB(T1i, T1j); + T1o = VADD(T1i, T1j); + T1l = VADD(T10, T11); + T1m = VADD(T13, T14); + T1n = VBYI(VSUB(T1l, T1m)); + T1p = VADD(T1l, T1m); + } + ST(&(x[WS(rs, 12)]), VSUB(T1k, T1n), ms, &(x[0])); + ST(&(x[0]), VADD(T1o, T1p), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1k, T1n), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(T1o, T1p), ms, &(x[0])); + } + { + V TF, TQ, TP, TR; + { + V Tn, TE, TL, TO; + Tn = VSUB(Tb, Tm); + TE = VSUB(Ty, TD); + TF = VBYI(VSUB(Tn, TE)); + TQ = VBYI(VADD(TE, Tn)); + TL = VSUB(TJ, TK); + TO = VSUB(TM, TN); + TP = VSUB(TL, TO); + TR = VADD(TL, TO); + } + ST(&(x[WS(rs, 5)]), VADD(TF, TP), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(TR, TQ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(TP, TF), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(TQ, TR), ms, &(x[WS(rs, 1)])); + } + { + V TU, TY, TX, TZ; + { + V TS, TT, TV, TW; + TS = VADD(TJ, TK); + TT = VADD(Tb, Tm); + TU = VADD(TS, TT); + TY = VSUB(TS, TT); + TV = VADD(TD, Ty); + TW = VADD(TM, TN); + TX = VBYI(VADD(TV, TW)); + TZ = VBYI(VSUB(TW, TV)); + } + ST(&(x[WS(rs, 15)]), VSUB(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(TY, TZ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(TY, TZ), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t1bv_16"), twinstr, &GENUS, {83, 38, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_16) (planner *p) { + X(kdft_dit_register) (p, t1bv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_2.c new file mode 100644 index 000000000..334816af5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1bv_2 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1bv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_2) (planner *p) { + X(kdft_dit_register) (p, t1bv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1bv_2 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1bv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_2) (planner *p) { + X(kdft_dit_register) (p, t1bv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_20.c new file mode 100644 index 000000000..9e35ac4be --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_20.c @@ -0,0 +1,524 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:01 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t1bv_20 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 123 FP additions, 88 FP multiplications, + * (or, 77 additions, 42 multiplications, 46 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, TX, T1m, T1K, TF, T14, T15, TQ, Tf, Tq, Tr, T1O, T1P, T1Q, T1w; + V T1z, T1A, TY, TZ, T10, T1L, T1M, T1N, T1p, T1s, T1t, T1i, T1j; + { + V T1, TW, T3, TU, TV, T2, TT, T1k, T1l; + T1 = LD(&(x[0]), ms, &(x[0])); + TV = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + TW = BYTW(&(W[TWVL * 28]), TV); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 18]), T2); + TT = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TU = BYTW(&(W[TWVL * 8]), TT); + T4 = VSUB(T1, T3); + TX = VSUB(TU, TW); + T1k = VADD(T1, T3); + T1l = VADD(TU, TW); + T1m = VSUB(T1k, T1l); + T1K = VADD(T1k, T1l); + } + { + V T9, T1n, TK, T1v, TP, T1y, Te, T1q, Tk, T1u, Tz, T1o, TE, T1r, Tp; + V T1x; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1n = VADD(T6, T8); + } + { + V TH, TJ, TG, TI; + TG = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TH = BYTW(&(W[TWVL * 24]), TG); + TI = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TJ = BYTW(&(W[TWVL * 4]), TI); + TK = VSUB(TH, TJ); + T1v = VADD(TH, TJ); + } + { + V TM, TO, TL, TN; + TL = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TM = BYTW(&(W[TWVL * 32]), TL); + TN = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TO = BYTW(&(W[TWVL * 12]), TN); + TP = VSUB(TM, TO); + T1y = VADD(TM, TO); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1q = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1u = VADD(Th, Tj); + } + { + V Tw, Ty, Tv, Tx; + Tv = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tw = BYTW(&(W[TWVL * 16]), Tv); + Tx = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + Ty = BYTW(&(W[TWVL * 36]), Tx); + Tz = VSUB(Tw, Ty); + T1o = VADD(Tw, Ty); + } + { + V TB, TD, TA, TC; + TA = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TB = BYTW(&(W[0]), TA); + TC = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TD = BYTW(&(W[TWVL * 20]), TC); + TE = VSUB(TB, TD); + T1r = VADD(TB, TD); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTW(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1x = VADD(Tm, To); + } + TF = VSUB(Tz, TE); + T14 = VSUB(T9, Te); + T15 = VSUB(Tk, Tp); + TQ = VSUB(TK, TP); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1O = VADD(T1u, T1v); + T1P = VADD(T1x, T1y); + T1Q = VADD(T1O, T1P); + T1w = VSUB(T1u, T1v); + T1z = VSUB(T1x, T1y); + T1A = VADD(T1w, T1z); + TY = VADD(Tz, TE); + TZ = VADD(TK, TP); + T10 = VADD(TY, TZ); + T1L = VADD(T1n, T1o); + T1M = VADD(T1q, T1r); + T1N = VADD(T1L, T1M); + T1p = VSUB(T1n, T1o); + T1s = VSUB(T1q, T1r); + T1t = VADD(T1p, T1s); + } + T1i = VADD(T4, Tr); + T1j = VADD(TX, T10); + ST(&(x[WS(rs, 15)]), VFNMSI(T1j, T1i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(T1j, T1i), ms, &(x[WS(rs, 1)])); + { + V T1T, T1R, T1S, T1X, T1Z, T1V, T1W, T1Y, T1U; + T1T = VSUB(T1N, T1Q); + T1R = VADD(T1N, T1Q); + T1S = VFNMS(LDK(KP250000000), T1R, T1K); + T1V = VSUB(T1L, T1M); + T1W = VSUB(T1O, T1P); + T1X = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1W, T1V)); + T1Z = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1V, T1W)); + ST(&(x[0]), VADD(T1K, T1R), ms, &(x[0])); + T1Y = VFNMS(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 8)]), VFMAI(T1Z, T1Y), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFNMSI(T1Z, T1Y), ms, &(x[0])); + T1U = VFMA(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 4)]), VFNMSI(T1X, T1U), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T1X, T1U), ms, &(x[0])); + } + { + V T1D, T1B, T1C, T1H, T1J, T1F, T1G, T1I, T1E; + T1D = VSUB(T1t, T1A); + T1B = VADD(T1t, T1A); + T1C = VFNMS(LDK(KP250000000), T1B, T1m); + T1F = VSUB(T1w, T1z); + T1G = VSUB(T1p, T1s); + T1H = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1G, T1F)); + T1J = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1F, T1G)); + ST(&(x[WS(rs, 10)]), VADD(T1m, T1B), ms, &(x[0])); + T1I = VFMA(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 6)]), VFMAI(T1J, T1I), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T1J, T1I), ms, &(x[0])); + T1E = VFNMS(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 2)]), VFNMSI(T1H, T1E), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T1H, T1E), ms, &(x[0])); + } + { + V TR, T16, T1e, T1b, T13, T1d, Tu, T1a; + TR = VFMA(LDK(KP618033988), TQ, TF); + T16 = VFMA(LDK(KP618033988), T15, T14); + T1e = VFNMS(LDK(KP618033988), T14, T15); + T1b = VFNMS(LDK(KP618033988), TF, TQ); + { + V T11, T12, Ts, Tt; + T11 = VFNMS(LDK(KP250000000), T10, TX); + T12 = VSUB(TY, TZ); + T13 = VFMA(LDK(KP559016994), T12, T11); + T1d = VFNMS(LDK(KP559016994), T12, T11); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tt = VSUB(Tf, Tq); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + T1a = VFNMS(LDK(KP559016994), Tt, Ts); + } + { + V TS, T17, T1g, T1h; + TS = VFNMS(LDK(KP951056516), TR, Tu); + T17 = VFMA(LDK(KP951056516), T16, T13); + ST(&(x[WS(rs, 19)]), VFNMSI(T17, TS), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T17, TS), ms, &(x[WS(rs, 1)])); + T1g = VFNMS(LDK(KP951056516), T1b, T1a); + T1h = VFMA(LDK(KP951056516), T1e, T1d); + ST(&(x[WS(rs, 7)]), VFNMSI(T1h, T1g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T1h, T1g), ms, &(x[WS(rs, 1)])); + } + { + V T18, T19, T1c, T1f; + T18 = VFMA(LDK(KP951056516), TR, Tu); + T19 = VFNMS(LDK(KP951056516), T16, T13); + ST(&(x[WS(rs, 11)]), VFNMSI(T19, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(T19, T18), ms, &(x[WS(rs, 1)])); + T1c = VFMA(LDK(KP951056516), T1b, T1a); + T1f = VFNMS(LDK(KP951056516), T1e, T1d); + ST(&(x[WS(rs, 3)]), VFNMSI(T1f, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VFMAI(T1f, T1c), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t1bv_20"), twinstr, &GENUS, {77, 42, 46, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_20) (planner *p) { + X(kdft_dit_register) (p, t1bv_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t1bv_20 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 123 FP additions, 62 FP multiplications, + * (or, 111 additions, 50 multiplications, 12 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, T10, T1B, T1R, TF, T14, T15, TQ, Tf, Tq, Tr, T1N, T1O, T1P, T1t; + V T1w, T1D, TT, TU, T11, T1K, T1L, T1M, T1m, T1p, T1C, T1i, T1j; + { + V T1, TZ, T3, TX, TY, T2, TW, T1z, T1A; + T1 = LD(&(x[0]), ms, &(x[0])); + TY = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + TZ = BYTW(&(W[TWVL * 28]), TY); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 18]), T2); + TW = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TX = BYTW(&(W[TWVL * 8]), TW); + T4 = VSUB(T1, T3); + T10 = VSUB(TX, TZ); + T1z = VADD(T1, T3); + T1A = VADD(TX, TZ); + T1B = VSUB(T1z, T1A); + T1R = VADD(T1z, T1A); + } + { + V T9, T1k, TK, T1s, TP, T1v, Te, T1n, Tk, T1r, Tz, T1l, TE, T1o, Tp; + V T1u; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1k = VADD(T6, T8); + } + { + V TH, TJ, TG, TI; + TG = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TH = BYTW(&(W[TWVL * 24]), TG); + TI = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TJ = BYTW(&(W[TWVL * 4]), TI); + TK = VSUB(TH, TJ); + T1s = VADD(TH, TJ); + } + { + V TM, TO, TL, TN; + TL = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TM = BYTW(&(W[TWVL * 32]), TL); + TN = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TO = BYTW(&(W[TWVL * 12]), TN); + TP = VSUB(TM, TO); + T1v = VADD(TM, TO); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1n = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1r = VADD(Th, Tj); + } + { + V Tw, Ty, Tv, Tx; + Tv = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tw = BYTW(&(W[TWVL * 16]), Tv); + Tx = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + Ty = BYTW(&(W[TWVL * 36]), Tx); + Tz = VSUB(Tw, Ty); + T1l = VADD(Tw, Ty); + } + { + V TB, TD, TA, TC; + TA = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TB = BYTW(&(W[0]), TA); + TC = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TD = BYTW(&(W[TWVL * 20]), TC); + TE = VSUB(TB, TD); + T1o = VADD(TB, TD); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTW(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1u = VADD(Tm, To); + } + TF = VSUB(Tz, TE); + T14 = VSUB(T9, Te); + T15 = VSUB(Tk, Tp); + TQ = VSUB(TK, TP); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1N = VADD(T1r, T1s); + T1O = VADD(T1u, T1v); + T1P = VADD(T1N, T1O); + T1t = VSUB(T1r, T1s); + T1w = VSUB(T1u, T1v); + T1D = VADD(T1t, T1w); + TT = VADD(Tz, TE); + TU = VADD(TK, TP); + T11 = VADD(TT, TU); + T1K = VADD(T1k, T1l); + T1L = VADD(T1n, T1o); + T1M = VADD(T1K, T1L); + T1m = VSUB(T1k, T1l); + T1p = VSUB(T1n, T1o); + T1C = VADD(T1m, T1p); + } + T1i = VADD(T4, Tr); + T1j = VBYI(VADD(T10, T11)); + ST(&(x[WS(rs, 15)]), VSUB(T1i, T1j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1i, T1j), ms, &(x[WS(rs, 1)])); + { + V T1Q, T1S, T1T, T1X, T1Z, T1V, T1W, T1Y, T1U; + T1Q = VMUL(LDK(KP559016994), VSUB(T1M, T1P)); + T1S = VADD(T1M, T1P); + T1T = VFNMS(LDK(KP250000000), T1S, T1R); + T1V = VSUB(T1K, T1L); + T1W = VSUB(T1N, T1O); + T1X = VBYI(VFMA(LDK(KP951056516), T1V, VMUL(LDK(KP587785252), T1W))); + T1Z = VBYI(VFNMS(LDK(KP951056516), T1W, VMUL(LDK(KP587785252), T1V))); + ST(&(x[0]), VADD(T1R, T1S), ms, &(x[0])); + T1Y = VSUB(T1T, T1Q); + ST(&(x[WS(rs, 8)]), VSUB(T1Y, T1Z), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T1Z, T1Y), ms, &(x[0])); + T1U = VADD(T1Q, T1T); + ST(&(x[WS(rs, 4)]), VSUB(T1U, T1X), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T1X, T1U), ms, &(x[0])); + } + { + V T1G, T1E, T1F, T1y, T1I, T1q, T1x, T1J, T1H; + T1G = VMUL(LDK(KP559016994), VSUB(T1C, T1D)); + T1E = VADD(T1C, T1D); + T1F = VFNMS(LDK(KP250000000), T1E, T1B); + T1q = VSUB(T1m, T1p); + T1x = VSUB(T1t, T1w); + T1y = VBYI(VFNMS(LDK(KP951056516), T1x, VMUL(LDK(KP587785252), T1q))); + T1I = VBYI(VFMA(LDK(KP951056516), T1q, VMUL(LDK(KP587785252), T1x))); + ST(&(x[WS(rs, 10)]), VADD(T1B, T1E), ms, &(x[0])); + T1J = VADD(T1G, T1F); + ST(&(x[WS(rs, 6)]), VADD(T1I, T1J), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1J, T1I), ms, &(x[0])); + T1H = VSUB(T1F, T1G); + ST(&(x[WS(rs, 2)]), VADD(T1y, T1H), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VSUB(T1H, T1y), ms, &(x[0])); + } + { + V TR, T16, T1d, T1b, T13, T1e, Tu, T1a; + TR = VFNMS(LDK(KP951056516), TQ, VMUL(LDK(KP587785252), TF)); + T16 = VFNMS(LDK(KP951056516), T15, VMUL(LDK(KP587785252), T14)); + T1d = VFMA(LDK(KP951056516), T14, VMUL(LDK(KP587785252), T15)); + T1b = VFMA(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TQ)); + { + V TV, T12, Ts, Tt; + TV = VMUL(LDK(KP559016994), VSUB(TT, TU)); + T12 = VFNMS(LDK(KP250000000), T11, T10); + T13 = VSUB(TV, T12); + T1e = VADD(TV, T12); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tt = VMUL(LDK(KP559016994), VSUB(Tf, Tq)); + Tu = VSUB(Ts, Tt); + T1a = VADD(Tt, Ts); + } + { + V TS, T17, T1g, T1h; + TS = VSUB(Tu, TR); + T17 = VBYI(VSUB(T13, T16)); + ST(&(x[WS(rs, 17)]), VSUB(TS, T17), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(TS, T17), ms, &(x[WS(rs, 1)])); + T1g = VADD(T1a, T1b); + T1h = VBYI(VSUB(T1e, T1d)); + ST(&(x[WS(rs, 11)]), VSUB(T1g, T1h), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T1g, T1h), ms, &(x[WS(rs, 1)])); + } + { + V T18, T19, T1c, T1f; + T18 = VADD(Tu, TR); + T19 = VBYI(VADD(T16, T13)); + ST(&(x[WS(rs, 13)]), VSUB(T18, T19), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T18, T19), ms, &(x[WS(rs, 1)])); + T1c = VSUB(T1a, T1b); + T1f = VBYI(VADD(T1d, T1e)); + ST(&(x[WS(rs, 19)]), VSUB(T1c, T1f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1c, T1f), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t1bv_20"), twinstr, &GENUS, {111, 50, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_20) (planner *p) { + X(kdft_dit_register) (p, t1bv_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_25.c new file mode 100644 index 000000000..dc2a19ff2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_25.c @@ -0,0 +1,944 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:01 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t1bv_25 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 248 FP additions, 241 FP multiplications, + * (or, 67 additions, 60 multiplications, 181 fused multiply/add), + * 147 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1, Te, Tc, Td, T1O, T2X, T3Q, T1x, T2K, T1u, T2L, T1y, T27, T3b, T2R; + V T2M, T2f, T3M, Ty, T2E, Tv, T2D, Tz, T2a, T3e, T2U, T2F, T2i, T3N, TK; + V T2B, TS, T2A, TT, T2b, T3f, T2T, T2C, T2j, T3P, T1d, T2H, T1a, T2I, T1e; + V T28, T3c, T2Q, T2J, T2g; + { + V T8, Ta, Tb, T3, T5, T6, T1M, T1N; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T7, T9, T2, T4; + T7 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 18]), T7); + T9 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 28]), T9); + Tb = VADD(T8, Ta); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 8]), T2); + T4 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 38]), T4); + T6 = VADD(T3, T5); + } + Te = VSUB(T6, Tb); + Tc = VADD(T6, Tb); + Td = VFNMS(LDK(KP250000000), Tc, T1); + T1M = VSUB(T3, T5); + T1N = VSUB(T8, Ta); + T1O = VFMA(LDK(KP618033988), T1N, T1M); + T2X = VFNMS(LDK(KP618033988), T1M, T1N); + } + { + V T1g, T1v, T1w, T1l, T1q, T1r, T1f, T1s, T1t; + T1f = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1g = BYTW(&(W[TWVL * 4]), T1f); + { + V T1i, T1p, T1k, T1n; + { + V T1h, T1o, T1j, T1m; + T1h = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1i = BYTW(&(W[TWVL * 14]), T1h); + T1o = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1p = BYTW(&(W[TWVL * 34]), T1o); + T1j = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1k = BYTW(&(W[TWVL * 44]), T1j); + T1m = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1n = BYTW(&(W[TWVL * 24]), T1m); + } + T1v = VSUB(T1i, T1k); + T1w = VSUB(T1n, T1p); + T1l = VADD(T1i, T1k); + T1q = VADD(T1n, T1p); + T1r = VADD(T1l, T1q); + } + T3Q = VADD(T1g, T1r); + T1x = VFMA(LDK(KP618033988), T1w, T1v); + T2K = VFNMS(LDK(KP618033988), T1v, T1w); + T1s = VFNMS(LDK(KP250000000), T1r, T1g); + T1t = VSUB(T1q, T1l); + T1u = VFNMS(LDK(KP559016994), T1t, T1s); + T2L = VFMA(LDK(KP559016994), T1t, T1s); + T1y = VFNMS(LDK(KP893101515), T1x, T1u); + T27 = VFNMS(LDK(KP120146378), T1x, T1u); + T3b = VFMA(LDK(KP066152395), T2L, T2K); + T2R = VFNMS(LDK(KP786782374), T2K, T2L); + T2M = VFMA(LDK(KP869845200), T2L, T2K); + T2f = VFMA(LDK(KP132830569), T1u, T1x); + } + { + V Th, Tw, Tx, Tm, Tr, Ts, Tg, Tt, Tu; + Tg = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Th = BYTW(&(W[0]), Tg); + { + V Tj, Tq, Tl, To; + { + V Ti, Tp, Tk, Tn; + Ti = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 10]), Ti); + Tp = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tq = BYTW(&(W[TWVL * 30]), Tp); + Tk = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tl = BYTW(&(W[TWVL * 40]), Tk); + Tn = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[TWVL * 20]), Tn); + } + Tw = VSUB(Tj, Tl); + Tx = VSUB(Tq, To); + Tm = VADD(Tj, Tl); + Tr = VADD(To, Tq); + Ts = VADD(Tm, Tr); + } + T3M = VADD(Th, Ts); + Ty = VFNMS(LDK(KP618033988), Tx, Tw); + T2E = VFMA(LDK(KP618033988), Tw, Tx); + Tt = VFNMS(LDK(KP250000000), Ts, Th); + Tu = VSUB(Tm, Tr); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + T2D = VFNMS(LDK(KP559016994), Tu, Tt); + Tz = VFNMS(LDK(KP244189809), Ty, Tv); + T2a = VFMA(LDK(KP667278218), Tv, Ty); + T3e = VFNMS(LDK(KP522847744), T2E, T2D); + T2U = VFNMS(LDK(KP987388751), T2D, T2E); + T2F = VFMA(LDK(KP893101515), T2E, T2D); + T2i = VFNMS(LDK(KP603558818), Ty, Tv); + } + { + V TM, TE, TJ, TN, TO, TP, TL, TQ, TR; + TL = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TM = BYTW(&(W[TWVL * 6]), TL); + { + V TB, TI, TD, TG; + { + V TA, TH, TC, TF; + TA = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TB = BYTW(&(W[TWVL * 46]), TA); + TH = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TI = BYTW(&(W[TWVL * 26]), TH); + TC = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TD = BYTW(&(W[TWVL * 16]), TC); + TF = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TG = BYTW(&(W[TWVL * 36]), TF); + } + TE = VSUB(TB, TD); + TJ = VSUB(TG, TI); + TN = VADD(TD, TB); + TO = VADD(TI, TG); + TP = VADD(TN, TO); + } + T3N = VADD(TM, TP); + TK = VFMA(LDK(KP618033988), TJ, TE); + T2B = VFNMS(LDK(KP618033988), TE, TJ); + TQ = VFMS(LDK(KP250000000), TP, TM); + TR = VSUB(TN, TO); + TS = VFNMS(LDK(KP559016994), TR, TQ); + T2A = VFMA(LDK(KP559016994), TR, TQ); + TT = VFNMS(LDK(KP667278218), TS, TK); + T2b = VFMA(LDK(KP869845200), TS, TK); + T3f = VFNMS(LDK(KP494780565), T2A, T2B); + T2T = VFNMS(LDK(KP132830569), T2A, T2B); + T2C = VFMA(LDK(KP120146378), T2B, T2A); + T2j = VFNMS(LDK(KP786782374), TK, TS); + } + { + V TW, T1b, T1c, T11, T16, T17, TV, T18, T19; + TV = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TW = BYTW(&(W[TWVL * 2]), TV); + { + V TY, T15, T10, T13; + { + V TX, T14, TZ, T12; + TX = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TY = BYTW(&(W[TWVL * 12]), TX); + T14 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T15 = BYTW(&(W[TWVL * 32]), T14); + TZ = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T10 = BYTW(&(W[TWVL * 42]), TZ); + T12 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T13 = BYTW(&(W[TWVL * 22]), T12); + } + T1b = VSUB(TY, T10); + T1c = VSUB(T15, T13); + T11 = VADD(TY, T10); + T16 = VADD(T13, T15); + T17 = VADD(T11, T16); + } + T3P = VADD(TW, T17); + T1d = VFNMS(LDK(KP618033988), T1c, T1b); + T2H = VFMA(LDK(KP618033988), T1b, T1c); + T18 = VFNMS(LDK(KP250000000), T17, TW); + T19 = VSUB(T16, T11); + T1a = VFNMS(LDK(KP559016994), T19, T18); + T2I = VFMA(LDK(KP559016994), T19, T18); + T1e = VFNMS(LDK(KP522847744), T1d, T1a); + T28 = VFNMS(LDK(KP494780565), T1a, T1d); + T3c = VFNMS(LDK(KP667278218), T2I, T2H); + T2Q = VFNMS(LDK(KP059835404), T2H, T2I); + T2J = VFMA(LDK(KP066152395), T2I, T2H); + T2g = VFMA(LDK(KP447533225), T1d, T1a); + } + { + V T3Y, T40, T3L, T3S, T3T, T3U, T3Z, T3V; + { + V T3W, T3X, T3O, T3R; + T3W = VSUB(T3M, T3N); + T3X = VSUB(T3P, T3Q); + T3Y = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T3X, T3W)); + T40 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T3W, T3X)); + T3L = VADD(T1, Tc); + T3O = VADD(T3M, T3N); + T3R = VADD(T3P, T3Q); + T3S = VADD(T3O, T3R); + T3T = VFNMS(LDK(KP250000000), T3S, T3L); + T3U = VSUB(T3O, T3R); + } + ST(&(x[0]), VADD(T3S, T3L), ms, &(x[0])); + T3Z = VFNMS(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 10)]), VFNMSI(T40, T3Z), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VFMAI(T40, T3Z), ms, &(x[WS(rs, 1)])); + T3V = VFMA(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 5)]), VFMAI(T3Y, T3V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VFNMSI(T3Y, T3V), ms, &(x[0])); + } + { + V T2Z, T35, T3B, T3I, T2W, T38, T2O, T32, T2z, T3t, T3h, T3s, T3p, T3F, T3r; + V T3v, T3C, T3z, T3A; + T2Z = VFMA(LDK(KP734762448), T2U, T2T); + T35 = VFNMS(LDK(KP734762448), T2F, T2C); + T3z = VFMA(LDK(KP845997307), T3c, T3b); + T3A = VFMA(LDK(KP982009705), T3f, T3e); + T3B = VFMA(LDK(KP570584518), T3A, T3z); + T3I = VFNMS(LDK(KP669429328), T3z, T3A); + { + V T2S, T2V, T37, T36; + T2S = VFMA(LDK(KP772036680), T2R, T2Q); + T2V = VFNMS(LDK(KP734762448), T2U, T2T); + T36 = VFMA(LDK(KP772036680), T2M, T2J); + T37 = VFMA(LDK(KP522616830), T2V, T36); + T2W = VFMA(LDK(KP945422727), T2V, T2S); + T38 = VFNMS(LDK(KP690983005), T37, T2S); + } + { + V T2N, T2G, T31, T30; + T2N = VFNMS(LDK(KP772036680), T2M, T2J); + T2G = VFMA(LDK(KP734762448), T2F, T2C); + T30 = VFNMS(LDK(KP772036680), T2R, T2Q); + T31 = VFNMS(LDK(KP522616830), T2G, T30); + T2O = VFMA(LDK(KP956723877), T2N, T2G); + T32 = VFMA(LDK(KP763932022), T31, T2N); + } + { + V T3o, T3u, T3l, T3m, T3n; + T2z = VFNMS(LDK(KP559016994), Te, Td); + T3m = VFMA(LDK(KP447533225), T2B, T2A); + T3n = VFMA(LDK(KP578046249), T2D, T2E); + T3o = VFNMS(LDK(KP921078979), T3n, T3m); + T3t = VFMA(LDK(KP921078979), T3n, T3m); + { + V T3d, T3g, T3j, T3k; + T3d = VFNMS(LDK(KP845997307), T3c, T3b); + T3g = VFNMS(LDK(KP982009705), T3f, T3e); + T3h = VFMA(LDK(KP923225144), T3g, T3d); + T3u = VFNMS(LDK(KP923225144), T3g, T3d); + T3j = VFNMS(LDK(KP059835404), T2K, T2L); + T3k = VFMA(LDK(KP603558818), T2H, T2I); + T3l = VFMA(LDK(KP845997307), T3k, T3j); + T3s = VFNMS(LDK(KP845997307), T3k, T3j); + } + T3p = VFNMS(LDK(KP906616052), T3o, T3l); + T3F = VFNMS(LDK(KP904508497), T3u, T3s); + T3r = VFNMS(LDK(KP237294955), T3h, T2z); + T3v = VFNMS(LDK(KP997675361), T3u, T3t); + T3C = VFMA(LDK(KP906616052), T3o, T3l); + } + { + V T2P, T2Y, T3i, T3q; + T2P = VFMA(LDK(KP992114701), T2O, T2z); + T2Y = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T2X, T2W)); + ST(&(x[WS(rs, 22)]), VFNMSI(T2Y, T2P), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(T2Y, T2P), ms, &(x[WS(rs, 1)])); + T3i = VFMA(LDK(KP949179823), T3h, T2z); + T3q = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T2X, T3p)); + ST(&(x[WS(rs, 23)]), VFNMSI(T3q, T3i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(T3q, T3i), ms, &(x[0])); + } + { + V T34, T3a, T33, T39; + T33 = VFNMS(LDK(KP855719849), T32, T2Z); + T34 = VFMA(LDK(KP897376177), T33, T2z); + T39 = VFMA(LDK(KP855719849), T38, T35); + T3a = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T39, T2X)); + ST(&(x[WS(rs, 8)]), VFMAI(T3a, T34), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VFNMSI(T3a, T34), ms, &(x[WS(rs, 1)])); + } + { + V T3x, T3H, T3E, T3K, T3w; + T3w = VFMA(LDK(KP560319534), T3v, T3s); + T3x = VFNMS(LDK(KP949179823), T3w, T3r); + { + V T3G, T3y, T3J, T3D; + T3G = VFNMS(LDK(KP681693190), T3F, T3t); + T3H = VFNMS(LDK(KP860541664), T3G, T3r); + T3y = VFMA(LDK(KP262346850), T3p, T2X); + T3J = VFNMS(LDK(KP669429328), T3C, T3I); + T3D = VFMA(LDK(KP618033988), T3C, T3B); + T3E = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T3D, T3y)); + T3K = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T3J, T3y)); + } + ST(&(x[WS(rs, 12)]), VFNMSI(T3E, T3x), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3K, T3H), ms, &(x[0])); + ST(&(x[WS(rs, 13)]), VFMAI(T3E, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(T3K, T3H), ms, &(x[WS(rs, 1)])); + } + } + { + V T2n, T2t, T1V, T22, T2l, T2w, T2d, T2q, Tf, T1I, T1A, T1E, T1B, T1Z, T1J; + V T1R, T1W, T1T, T1U; + T2n = VFNMS(LDK(KP912575812), T2j, T2i); + T2t = VFNMS(LDK(KP912575812), T2b, T2a); + T1T = VFNMS(LDK(KP829049696), TT, Tz); + T1U = VFNMS(LDK(KP831864738), T1y, T1e); + T1V = VFMA(LDK(KP559154169), T1U, T1T); + T22 = VFNMS(LDK(KP683113946), T1T, T1U); + { + V T2h, T2k, T2v, T2u; + T2h = VFMA(LDK(KP958953096), T2g, T2f); + T2k = VFMA(LDK(KP912575812), T2j, T2i); + T2u = VFMA(LDK(KP867381224), T28, T27); + T2v = VFMA(LDK(KP447417479), T2k, T2u); + T2l = VFMA(LDK(KP894834959), T2k, T2h); + T2w = VFNMS(LDK(KP763932022), T2v, T2h); + } + { + V T29, T2c, T2p, T2o; + T29 = VFNMS(LDK(KP867381224), T28, T27); + T2c = VFMA(LDK(KP912575812), T2b, T2a); + T2o = VFNMS(LDK(KP958953096), T2g, T2f); + T2p = VFMA(LDK(KP447417479), T2c, T2o); + T2d = VFNMS(LDK(KP809385824), T2c, T29); + T2q = VFMA(LDK(KP690983005), T2p, T29); + } + { + V T1Q, T1F, T1P, T1G, T1H; + Tf = VFMA(LDK(KP559016994), Te, Td); + T1G = VFMA(LDK(KP578046249), T1a, T1d); + T1H = VFMA(LDK(KP987388751), T1u, T1x); + T1I = VFNMS(LDK(KP831864738), T1H, T1G); + T1Q = VFMA(LDK(KP831864738), T1H, T1G); + { + V TU, T1z, T1C, T1D; + TU = VFMA(LDK(KP829049696), TT, Tz); + T1z = VFMA(LDK(KP831864738), T1y, T1e); + T1A = VFMA(LDK(KP904730450), T1z, TU); + T1F = VFNMS(LDK(KP904730450), T1z, TU); + T1C = VFMA(LDK(KP269969613), Tv, Ty); + T1D = VFMA(LDK(KP603558818), TK, TS); + T1E = VFMA(LDK(KP916574801), T1D, T1C); + T1P = VFNMS(LDK(KP916574801), T1D, T1C); + } + T1B = VFNMS(LDK(KP242145790), T1A, Tf); + T1Z = VADD(T1E, T1F); + T1J = VFNMS(LDK(KP904730450), T1I, T1F); + T1R = VFMA(LDK(KP904730450), T1Q, T1P); + T1W = VFNMS(LDK(KP904730450), T1Q, T1P); + } + { + V T25, T26, T2e, T2m; + T25 = VFMA(LDK(KP968583161), T1A, Tf); + T26 = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1R, T1O)); + ST(&(x[WS(rs, 1)]), VFMAI(T26, T25), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VFNMSI(T26, T25), ms, &(x[0])); + T2e = VFNMS(LDK(KP992114701), T2d, Tf); + T2m = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2l, T1O)); + ST(&(x[WS(rs, 4)]), VFNMSI(T2m, T2e), ms, &(x[0])); + ST(&(x[WS(rs, 21)]), VFMAI(T2m, T2e), ms, &(x[WS(rs, 1)])); + } + { + V T2s, T2y, T2r, T2x; + T2r = VFNMS(LDK(KP999544308), T2q, T2n); + T2s = VFNMS(LDK(KP803003575), T2r, Tf); + T2x = VFNMS(LDK(KP999544308), T2w, T2t); + T2y = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T2x, T1O)); + ST(&(x[WS(rs, 9)]), VFNMSI(T2y, T2s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VFMAI(T2y, T2s), ms, &(x[0])); + } + { + V T1L, T21, T1Y, T24, T1K; + T1K = VFNMS(LDK(KP618033988), T1J, T1E); + T1L = VFNMS(LDK(KP876091699), T1K, T1B); + { + V T20, T1S, T23, T1X; + T20 = VFNMS(LDK(KP683113946), T1Z, T1I); + T21 = VFMA(LDK(KP792626838), T20, T1B); + T1S = VFNMS(LDK(KP242145790), T1R, T1O); + T23 = VFMA(LDK(KP617882369), T1W, T22); + T1X = VFMA(LDK(KP559016994), T1W, T1V); + T1Y = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1X, T1S)); + T24 = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T23, T1S)); + } + ST(&(x[WS(rs, 6)]), VFMAI(T1Y, T1L), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T24, T21), ms, &(x[0])); + ST(&(x[WS(rs, 19)]), VFNMSI(T1Y, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T24, T21), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t1bv_25"), twinstr, &GENUS, {67, 60, 181, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_25) (planner *p) { + X(kdft_dit_register) (p, t1bv_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t1bv_25 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 248 FP additions, 188 FP multiplications, + * (or, 171 additions, 111 multiplications, 77 fused multiply/add), + * 100 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1A, T1z, T1R, T1S, T1B, T1C, T1Q, T2L, T1l, T2v, T1i, T3e, T2u, Tb, T2i; + V Tj, T3b, T2h, Tv, T2k, TD, T3a, T2l, T11, T2s, TY, T3d, T2r; + { + V T1v, T1x, T1y, T1q, T1s, T1t, T1P; + T1A = LD(&(x[0]), ms, &(x[0])); + { + V T1u, T1w, T1p, T1r; + T1u = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T1v = BYTW(&(W[TWVL * 18]), T1u); + T1w = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1x = BYTW(&(W[TWVL * 28]), T1w); + T1y = VADD(T1v, T1x); + T1p = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1q = BYTW(&(W[TWVL * 8]), T1p); + T1r = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T1s = BYTW(&(W[TWVL * 38]), T1r); + T1t = VADD(T1q, T1s); + } + T1z = VMUL(LDK(KP559016994), VSUB(T1t, T1y)); + T1R = VSUB(T1v, T1x); + T1S = VMUL(LDK(KP587785252), T1R); + T1B = VADD(T1t, T1y); + T1C = VFNMS(LDK(KP250000000), T1B, T1A); + T1P = VSUB(T1q, T1s); + T1Q = VMUL(LDK(KP951056516), T1P); + T2L = VMUL(LDK(KP587785252), T1P); + } + { + V T1f, T19, T1b, T1c, T14, T16, T17, T1e; + T1e = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1f = BYTW(&(W[TWVL * 4]), T1e); + { + V T18, T1a, T13, T15; + T18 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T19 = BYTW(&(W[TWVL * 24]), T18); + T1a = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1b = BYTW(&(W[TWVL * 34]), T1a); + T1c = VADD(T19, T1b); + T13 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T14 = BYTW(&(W[TWVL * 14]), T13); + T15 = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T16 = BYTW(&(W[TWVL * 44]), T15); + T17 = VADD(T14, T16); + } + { + V T1j, T1k, T1d, T1g, T1h; + T1j = VSUB(T14, T16); + T1k = VSUB(T19, T1b); + T1l = VFMA(LDK(KP475528258), T1j, VMUL(LDK(KP293892626), T1k)); + T2v = VFNMS(LDK(KP475528258), T1k, VMUL(LDK(KP293892626), T1j)); + T1d = VMUL(LDK(KP559016994), VSUB(T17, T1c)); + T1g = VADD(T17, T1c); + T1h = VFNMS(LDK(KP250000000), T1g, T1f); + T1i = VADD(T1d, T1h); + T3e = VADD(T1f, T1g); + T2u = VSUB(T1h, T1d); + } + } + { + V Tg, T7, T9, Td, T2, T4, Tc, Tf; + Tf = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tg = BYTW(&(W[TWVL * 6]), Tf); + { + V T6, T8, T1, T3; + T6 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 26]), T6); + T8 = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 36]), T8); + Td = VADD(T7, T9); + T1 = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[TWVL * 16]), T1); + T3 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 46]), T3); + Tc = VADD(T2, T4); + } + { + V T5, Ta, Te, Th, Ti; + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VFMA(LDK(KP475528258), T5, VMUL(LDK(KP293892626), Ta)); + T2i = VFNMS(LDK(KP475528258), Ta, VMUL(LDK(KP293892626), T5)); + Te = VMUL(LDK(KP559016994), VSUB(Tc, Td)); + Th = VADD(Tc, Td); + Ti = VFNMS(LDK(KP250000000), Th, Tg); + Tj = VADD(Te, Ti); + T3b = VADD(Tg, Th); + T2h = VSUB(Ti, Te); + } + } + { + V TA, Tr, Tt, Tx, Tm, To, Tw, Tz; + Tz = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TA = BYTW(&(W[0]), Tz); + { + V Tq, Ts, Tl, Tn; + Tq = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tr = BYTW(&(W[TWVL * 20]), Tq); + Ts = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 30]), Ts); + Tx = VADD(Tr, Tt); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 10]), Tl); + Tn = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[TWVL * 40]), Tn); + Tw = VADD(Tm, To); + } + { + V Tp, Tu, Ty, TB, TC; + Tp = VSUB(Tm, To); + Tu = VSUB(Tr, Tt); + Tv = VFMA(LDK(KP475528258), Tp, VMUL(LDK(KP293892626), Tu)); + T2k = VFNMS(LDK(KP475528258), Tu, VMUL(LDK(KP293892626), Tp)); + Ty = VMUL(LDK(KP559016994), VSUB(Tw, Tx)); + TB = VADD(Tw, Tx); + TC = VFNMS(LDK(KP250000000), TB, TA); + TD = VADD(Ty, TC); + T3a = VADD(TA, TB); + T2l = VSUB(TC, Ty); + } + } + { + V TV, TP, TR, TS, TK, TM, TN, TU; + TU = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TV = BYTW(&(W[TWVL * 2]), TU); + { + V TO, TQ, TJ, TL; + TO = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TP = BYTW(&(W[TWVL * 22]), TO); + TQ = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TR = BYTW(&(W[TWVL * 32]), TQ); + TS = VADD(TP, TR); + TJ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TK = BYTW(&(W[TWVL * 12]), TJ); + TL = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TM = BYTW(&(W[TWVL * 42]), TL); + TN = VADD(TK, TM); + } + { + V TZ, T10, TT, TW, TX; + TZ = VSUB(TK, TM); + T10 = VSUB(TP, TR); + T11 = VFMA(LDK(KP475528258), TZ, VMUL(LDK(KP293892626), T10)); + T2s = VFNMS(LDK(KP475528258), T10, VMUL(LDK(KP293892626), TZ)); + TT = VMUL(LDK(KP559016994), VSUB(TN, TS)); + TW = VADD(TN, TS); + TX = VFNMS(LDK(KP250000000), TW, TV); + TY = VADD(TT, TX); + T3d = VADD(TV, TW); + T2r = VSUB(TX, TT); + } + } + { + V T3g, T3o, T3k, T3l, T3j, T3m, T3p, T3n; + { + V T3c, T3f, T3h, T3i; + T3c = VSUB(T3a, T3b); + T3f = VSUB(T3d, T3e); + T3g = VBYI(VFMA(LDK(KP951056516), T3c, VMUL(LDK(KP587785252), T3f))); + T3o = VBYI(VFNMS(LDK(KP951056516), T3f, VMUL(LDK(KP587785252), T3c))); + T3k = VADD(T1A, T1B); + T3h = VADD(T3a, T3b); + T3i = VADD(T3d, T3e); + T3l = VADD(T3h, T3i); + T3j = VMUL(LDK(KP559016994), VSUB(T3h, T3i)); + T3m = VFNMS(LDK(KP250000000), T3l, T3k); + } + ST(&(x[0]), VADD(T3k, T3l), ms, &(x[0])); + T3p = VSUB(T3m, T3j); + ST(&(x[WS(rs, 10)]), VADD(T3o, T3p), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VSUB(T3p, T3o), ms, &(x[WS(rs, 1)])); + T3n = VADD(T3j, T3m); + ST(&(x[WS(rs, 5)]), VADD(T3g, T3n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VSUB(T3n, T3g), ms, &(x[0])); + } + { + V T2z, T2M, T2U, T2V, T2W, T34, T35, T36, T2X, T2Y, T2Z, T31, T32, T33, T2n; + V T2N, T2E, T2K, T2y, T2H, T2A, T2G, T38, T39; + T2z = VSUB(T1C, T1z); + T2M = VFNMS(LDK(KP951056516), T1R, T2L); + T2U = VFMA(LDK(KP1_369094211), T2k, VMUL(LDK(KP728968627), T2l)); + T2V = VFNMS(LDK(KP992114701), T2h, VMUL(LDK(KP250666467), T2i)); + T2W = VADD(T2U, T2V); + T34 = VFNMS(LDK(KP125581039), T2s, VMUL(LDK(KP998026728), T2r)); + T35 = VFMA(LDK(KP1_274847979), T2v, VMUL(LDK(KP770513242), T2u)); + T36 = VADD(T34, T35); + T2X = VFMA(LDK(KP1_996053456), T2s, VMUL(LDK(KP062790519), T2r)); + T2Y = VFNMS(LDK(KP637423989), T2u, VMUL(LDK(KP1_541026485), T2v)); + T2Z = VADD(T2X, T2Y); + T31 = VFNMS(LDK(KP1_457937254), T2k, VMUL(LDK(KP684547105), T2l)); + T32 = VFMA(LDK(KP1_984229402), T2i, VMUL(LDK(KP125333233), T2h)); + T33 = VADD(T31, T32); + { + V T2j, T2m, T2I, T2C, T2D, T2J; + T2j = VFNMS(LDK(KP851558583), T2i, VMUL(LDK(KP904827052), T2h)); + T2m = VFMA(LDK(KP1_752613360), T2k, VMUL(LDK(KP481753674), T2l)); + T2I = VADD(T2m, T2j); + T2C = VFMA(LDK(KP1_071653589), T2s, VMUL(LDK(KP844327925), T2r)); + T2D = VFMA(LDK(KP125581039), T2v, VMUL(LDK(KP998026728), T2u)); + T2J = VADD(T2C, T2D); + T2n = VSUB(T2j, T2m); + T2N = VADD(T2I, T2J); + T2E = VSUB(T2C, T2D); + T2K = VMUL(LDK(KP559016994), VSUB(T2I, T2J)); + } + { + V T2o, T2p, T2q, T2t, T2w, T2x; + T2o = VFNMS(LDK(KP963507348), T2k, VMUL(LDK(KP876306680), T2l)); + T2p = VFMA(LDK(KP1_809654104), T2i, VMUL(LDK(KP425779291), T2h)); + T2q = VSUB(T2o, T2p); + T2t = VFNMS(LDK(KP1_688655851), T2s, VMUL(LDK(KP535826794), T2r)); + T2w = VFNMS(LDK(KP1_996053456), T2v, VMUL(LDK(KP062790519), T2u)); + T2x = VADD(T2t, T2w); + T2y = VMUL(LDK(KP559016994), VSUB(T2q, T2x)); + T2H = VSUB(T2t, T2w); + T2A = VADD(T2q, T2x); + T2G = VADD(T2o, T2p); + } + { + V T2S, T2T, T30, T37; + T2S = VADD(T2z, T2A); + T2T = VBYI(VADD(T2M, T2N)); + ST(&(x[WS(rs, 23)]), VSUB(T2S, T2T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(T2S, T2T), ms, &(x[0])); + T30 = VADD(T2z, VADD(T2W, T2Z)); + T37 = VBYI(VSUB(VADD(T33, T36), T2M)); + ST(&(x[WS(rs, 22)]), VSUB(T30, T37), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(T30, T37), ms, &(x[WS(rs, 1)])); + } + T38 = VBYI(VSUB(VFMA(LDK(KP951056516), VSUB(T2U, T2V), VFMA(LDK(KP309016994), T33, VFNMS(LDK(KP809016994), T36, VMUL(LDK(KP587785252), VSUB(T2X, T2Y))))), T2M)); + T39 = VFMA(LDK(KP309016994), T2W, VFMA(LDK(KP951056516), VSUB(T32, T31), VFMA(LDK(KP587785252), VSUB(T35, T34), VFNMS(LDK(KP809016994), T2Z, T2z)))); + ST(&(x[WS(rs, 8)]), VADD(T38, T39), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VSUB(T39, T38), ms, &(x[WS(rs, 1)])); + { + V T2F, T2Q, T2P, T2R, T2B, T2O; + T2B = VFNMS(LDK(KP250000000), T2A, T2z); + T2F = VFMA(LDK(KP951056516), T2n, VADD(T2y, VFNMS(LDK(KP587785252), T2E, T2B))); + T2Q = VFMA(LDK(KP587785252), T2n, VFMA(LDK(KP951056516), T2E, VSUB(T2B, T2y))); + T2O = VFNMS(LDK(KP250000000), T2N, T2M); + T2P = VBYI(VADD(VFMA(LDK(KP951056516), T2G, VMUL(LDK(KP587785252), T2H)), VADD(T2K, T2O))); + T2R = VBYI(VADD(VFNMS(LDK(KP951056516), T2H, VMUL(LDK(KP587785252), T2G)), VSUB(T2O, T2K))); + ST(&(x[WS(rs, 18)]), VSUB(T2F, T2P), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T2Q, T2R), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VADD(T2F, T2P), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T2Q, T2R), ms, &(x[WS(rs, 1)])); + } + } + { + V T1D, T1T, T21, T22, T23, T2b, T2c, T2d, T24, T25, T26, T28, T29, T2a, TF; + V T1U, T1I, T1O, T1o, T1L, T1E, T1K, T2f, T2g; + T1D = VADD(T1z, T1C); + T1T = VADD(T1Q, T1S); + T21 = VFMA(LDK(KP1_688655851), Tv, VMUL(LDK(KP535826794), TD)); + T22 = VFMA(LDK(KP1_541026485), Tb, VMUL(LDK(KP637423989), Tj)); + T23 = VSUB(T21, T22); + T2b = VFMA(LDK(KP851558583), T11, VMUL(LDK(KP904827052), TY)); + T2c = VFMA(LDK(KP1_984229402), T1l, VMUL(LDK(KP125333233), T1i)); + T2d = VADD(T2b, T2c); + T24 = VFNMS(LDK(KP425779291), TY, VMUL(LDK(KP1_809654104), T11)); + T25 = VFNMS(LDK(KP992114701), T1i, VMUL(LDK(KP250666467), T1l)); + T26 = VADD(T24, T25); + T28 = VFNMS(LDK(KP1_071653589), Tv, VMUL(LDK(KP844327925), TD)); + T29 = VFNMS(LDK(KP770513242), Tj, VMUL(LDK(KP1_274847979), Tb)); + T2a = VADD(T28, T29); + { + V Tk, TE, T1M, T1G, T1H, T1N; + Tk = VFMA(LDK(KP1_071653589), Tb, VMUL(LDK(KP844327925), Tj)); + TE = VFMA(LDK(KP1_937166322), Tv, VMUL(LDK(KP248689887), TD)); + T1M = VADD(TE, Tk); + T1G = VFMA(LDK(KP1_752613360), T11, VMUL(LDK(KP481753674), TY)); + T1H = VFMA(LDK(KP1_457937254), T1l, VMUL(LDK(KP684547105), T1i)); + T1N = VADD(T1G, T1H); + TF = VSUB(Tk, TE); + T1U = VADD(T1M, T1N); + T1I = VSUB(T1G, T1H); + T1O = VMUL(LDK(KP559016994), VSUB(T1M, T1N)); + } + { + V TG, TH, TI, T12, T1m, T1n; + TG = VFNMS(LDK(KP497379774), Tv, VMUL(LDK(KP968583161), TD)); + TH = VFNMS(LDK(KP1_688655851), Tb, VMUL(LDK(KP535826794), Tj)); + TI = VADD(TG, TH); + T12 = VFNMS(LDK(KP963507348), T11, VMUL(LDK(KP876306680), TY)); + T1m = VFNMS(LDK(KP1_369094211), T1l, VMUL(LDK(KP728968627), T1i)); + T1n = VADD(T12, T1m); + T1o = VMUL(LDK(KP559016994), VSUB(TI, T1n)); + T1L = VSUB(T12, T1m); + T1E = VADD(TI, T1n); + T1K = VSUB(TG, TH); + } + { + V T1Z, T20, T27, T2e; + T1Z = VADD(T1D, T1E); + T20 = VBYI(VADD(T1T, T1U)); + ST(&(x[WS(rs, 24)]), VSUB(T1Z, T20), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T1Z, T20), ms, &(x[WS(rs, 1)])); + T27 = VADD(T1D, VADD(T23, T26)); + T2e = VBYI(VSUB(VADD(T2a, T2d), T1T)); + ST(&(x[WS(rs, 21)]), VSUB(T27, T2e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T27, T2e), ms, &(x[0])); + } + T2f = VBYI(VSUB(VFMA(LDK(KP309016994), T2a, VFMA(LDK(KP951056516), VADD(T21, T22), VFNMS(LDK(KP809016994), T2d, VMUL(LDK(KP587785252), VSUB(T24, T25))))), T1T)); + T2g = VFMA(LDK(KP951056516), VSUB(T29, T28), VFMA(LDK(KP309016994), T23, VFMA(LDK(KP587785252), VSUB(T2c, T2b), VFNMS(LDK(KP809016994), T26, T1D)))); + ST(&(x[WS(rs, 9)]), VADD(T2f, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VSUB(T2g, T2f), ms, &(x[0])); + { + V T1J, T1X, T1W, T1Y, T1F, T1V; + T1F = VFNMS(LDK(KP250000000), T1E, T1D); + T1J = VFMA(LDK(KP951056516), TF, VADD(T1o, VFNMS(LDK(KP587785252), T1I, T1F))); + T1X = VFMA(LDK(KP587785252), TF, VFMA(LDK(KP951056516), T1I, VSUB(T1F, T1o))); + T1V = VFNMS(LDK(KP250000000), T1U, T1T); + T1W = VBYI(VADD(VFMA(LDK(KP951056516), T1K, VMUL(LDK(KP587785252), T1L)), VADD(T1O, T1V))); + T1Y = VBYI(VADD(VFNMS(LDK(KP951056516), T1L, VMUL(LDK(KP587785252), T1K)), VSUB(T1V, T1O))); + ST(&(x[WS(rs, 19)]), VSUB(T1J, T1W), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T1X, T1Y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T1J, T1W), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1X, T1Y), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t1bv_25"), twinstr, &GENUS, {171, 111, 77, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_25) (planner *p) { + X(kdft_dit_register) (p, t1bv_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_3.c new file mode 100644 index 000000000..87f61f98d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_3.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1bv_3 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 8 FP additions, 8 FP multiplications, + * (or, 5 additions, 5 multiplications, 3 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T1, T3, T5, T6, T2, T4, T7, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 2]), T4); + T6 = VADD(T3, T5); + ST(&(x[0]), VADD(T1, T6), ms, &(x[0])); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T8 = VMUL(LDK(KP866025403), VSUB(T3, T5)); + ST(&(x[WS(rs, 1)]), VFMAI(T8, T7), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFNMSI(T8, T7), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1bv_3"), twinstr, &GENUS, {5, 5, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_3) (planner *p) { + X(kdft_dit_register) (p, t1bv_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1bv_3 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 8 FP additions, 6 FP multiplications, + * (or, 7 additions, 5 multiplications, 1 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T6, T2, T4, T7, T1, T3, T5, T8; + T6 = LD(&(x[0]), ms, &(x[0])); + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 2]), T3); + T7 = VADD(T2, T4); + ST(&(x[0]), VADD(T6, T7), ms, &(x[0])); + T5 = VBYI(VMUL(LDK(KP866025403), VSUB(T2, T4))); + T8 = VFNMS(LDK(KP500000000), T7, T6); + ST(&(x[WS(rs, 1)]), VADD(T5, T8), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VSUB(T8, T5), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1bv_3"), twinstr, &GENUS, {7, 5, 1, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_3) (planner *p) { + X(kdft_dit_register) (p, t1bv_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_32.c new file mode 100644 index 000000000..c977fe019 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_32.c @@ -0,0 +1,898 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:59 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t1bv_32 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 217 FP additions, 160 FP multiplications, + * (or, 119 additions, 62 multiplications, 98 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1z, T2o, T32, Tf, T1A, T2r, T3f, TC, T1D, T2O, T34, Tr, T1C, T2L; + V T33, T1k, T20, T2F, T3b, T1r, T21, T2C, T3a, TV, T1X, T2y, T38, T12, T1Y; + V T2v, T37; + { + V T1, T1y, T3, T1w, T1x, T2, T1v, T2m, T2n; + T1 = LD(&(x[0]), ms, &(x[0])); + T1x = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1y = BYTW(&(W[TWVL * 46]), T1x); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 30]), T2); + T1v = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1w = BYTW(&(W[TWVL * 14]), T1v); + T4 = VSUB(T1, T3); + T1z = VSUB(T1w, T1y); + T2m = VADD(T1, T3); + T2n = VADD(T1w, T1y); + T2o = VADD(T2m, T2n); + T32 = VSUB(T2m, T2n); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2p, T2q; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + T1A = VSUB(T9, Te); + T2p = VADD(T6, T8); + T2q = VADD(Tb, Td); + T2r = VADD(T2p, T2q); + T3f = VSUB(T2p, T2q); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 58]), Ts); + Tz = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 10]), Tz); + Tu = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tv = BYTW(&(W[TWVL * 26]), Tu); + Tx = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + Ty = BYTW(&(W[TWVL * 42]), Tx); + } + { + V Tw, TB, T2M, T2N; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFNMS(LDK(KP414213562), TB, Tw); + T1D = VFMA(LDK(KP414213562), Tw, TB); + T2M = VADD(Tt, Tv); + T2N = VADD(TA, Ty); + T2O = VADD(T2M, T2N); + T34 = VSUB(T2M, T2N); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2J, T2K; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFNMS(LDK(KP414213562), Tq, Tl); + T1C = VFMA(LDK(KP414213562), Tl, Tq); + T2J = VADD(Ti, Tk); + T2K = VADD(Tn, Tp); + T2L = VADD(T2J, T2K); + T33 = VSUB(T2J, T2K); + } + } + { + V T15, T17, T1o, T1m, T1f, T1h, T1i, T1a, T1c, T1d; + { + V T14, T16, T1n, T1l; + T14 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T15 = BYTW(&(W[TWVL * 60]), T14); + T16 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T17 = BYTW(&(W[TWVL * 28]), T16); + T1n = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1o = BYTW(&(W[TWVL * 12]), T1n); + T1l = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1m = BYTW(&(W[TWVL * 44]), T1l); + { + V T1e, T1g, T19, T1b; + T1e = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1f = BYTW(&(W[TWVL * 52]), T1e); + T1g = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1h = BYTW(&(W[TWVL * 20]), T1g); + T1i = VSUB(T1f, T1h); + T19 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1a = BYTW(&(W[TWVL * 4]), T19); + T1b = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1c = BYTW(&(W[TWVL * 36]), T1b); + T1d = VSUB(T1a, T1c); + } + } + { + V T18, T1j, T2D, T2E; + T18 = VSUB(T15, T17); + T1j = VADD(T1d, T1i); + T1k = VFMA(LDK(KP707106781), T1j, T18); + T20 = VFNMS(LDK(KP707106781), T1j, T18); + T2D = VADD(T1a, T1c); + T2E = VADD(T1f, T1h); + T2F = VADD(T2D, T2E); + T3b = VSUB(T2E, T2D); + } + { + V T1p, T1q, T2A, T2B; + T1p = VSUB(T1m, T1o); + T1q = VSUB(T1i, T1d); + T1r = VFMA(LDK(KP707106781), T1q, T1p); + T21 = VFNMS(LDK(KP707106781), T1q, T1p); + T2A = VADD(T15, T17); + T2B = VADD(T1o, T1m); + T2C = VADD(T2A, T2B); + T3a = VSUB(T2A, T2B); + } + } + { + V TG, TI, TZ, TX, TQ, TS, TT, TL, TN, TO; + { + V TF, TH, TY, TW; + TF = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TG = BYTW(&(W[0]), TF); + TH = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TI = BYTW(&(W[TWVL * 32]), TH); + TY = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + TZ = BYTW(&(W[TWVL * 48]), TY); + TW = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TX = BYTW(&(W[TWVL * 16]), TW); + { + V TP, TR, TK, TM; + TP = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TQ = BYTW(&(W[TWVL * 56]), TP); + TR = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TS = BYTW(&(W[TWVL * 24]), TR); + TT = VSUB(TQ, TS); + TK = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TL = BYTW(&(W[TWVL * 8]), TK); + TM = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TN = BYTW(&(W[TWVL * 40]), TM); + TO = VSUB(TL, TN); + } + } + { + V TJ, TU, T2w, T2x; + TJ = VSUB(TG, TI); + TU = VADD(TO, TT); + TV = VFMA(LDK(KP707106781), TU, TJ); + T1X = VFNMS(LDK(KP707106781), TU, TJ); + T2w = VADD(TL, TN); + T2x = VADD(TQ, TS); + T2y = VADD(T2w, T2x); + T38 = VSUB(T2w, T2x); + } + { + V T10, T11, T2t, T2u; + T10 = VSUB(TX, TZ); + T11 = VSUB(TO, TT); + T12 = VFMA(LDK(KP707106781), T11, T10); + T1Y = VFNMS(LDK(KP707106781), T11, T10); + T2t = VADD(TG, TI); + T2u = VADD(TX, TZ); + T2v = VADD(T2t, T2u); + T37 = VSUB(T2t, T2u); + } + } + { + V T2W, T30, T2Z, T31; + { + V T2U, T2V, T2X, T2Y; + T2U = VADD(T2o, T2r); + T2V = VADD(T2L, T2O); + T2W = VSUB(T2U, T2V); + T30 = VADD(T2U, T2V); + T2X = VADD(T2v, T2y); + T2Y = VADD(T2C, T2F); + T2Z = VSUB(T2X, T2Y); + T31 = VADD(T2X, T2Y); + } + ST(&(x[WS(rs, 24)]), VFNMSI(T2Z, T2W), ms, &(x[0])); + ST(&(x[0]), VADD(T30, T31), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T2Z, T2W), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T30, T31), ms, &(x[0])); + } + { + V T2s, T2P, T2H, T2Q, T2z, T2G; + T2s = VSUB(T2o, T2r); + T2P = VSUB(T2L, T2O); + T2z = VSUB(T2v, T2y); + T2G = VSUB(T2C, T2F); + T2H = VADD(T2z, T2G); + T2Q = VSUB(T2z, T2G); + { + V T2I, T2R, T2S, T2T; + T2I = VFNMS(LDK(KP707106781), T2H, T2s); + T2R = VFNMS(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 12)]), VFNMSI(T2R, T2I), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VFMAI(T2R, T2I), ms, &(x[0])); + T2S = VFMA(LDK(KP707106781), T2H, T2s); + T2T = VFMA(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 4)]), VFMAI(T2T, T2S), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VFNMSI(T2T, T2S), ms, &(x[0])); + } + } + { + V T36, T3o, T3h, T3r, T3d, T3s, T3k, T3p, T35, T3g; + T35 = VADD(T33, T34); + T36 = VFMA(LDK(KP707106781), T35, T32); + T3o = VFNMS(LDK(KP707106781), T35, T32); + T3g = VSUB(T33, T34); + T3h = VFMA(LDK(KP707106781), T3g, T3f); + T3r = VFNMS(LDK(KP707106781), T3g, T3f); + { + V T39, T3c, T3i, T3j; + T39 = VFNMS(LDK(KP414213562), T38, T37); + T3c = VFNMS(LDK(KP414213562), T3b, T3a); + T3d = VADD(T39, T3c); + T3s = VSUB(T39, T3c); + T3i = VFMA(LDK(KP414213562), T37, T38); + T3j = VFMA(LDK(KP414213562), T3a, T3b); + T3k = VSUB(T3i, T3j); + T3p = VADD(T3i, T3j); + } + { + V T3e, T3l, T3u, T3v; + T3e = VFNMS(LDK(KP923879532), T3d, T36); + T3l = VFNMS(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 14)]), VFNMSI(T3l, T3e), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3l, T3e), ms, &(x[0])); + T3u = VFMA(LDK(KP923879532), T3p, T3o); + T3v = VFNMS(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 6)]), VFNMSI(T3v, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3v, T3u), ms, &(x[0])); + } + { + V T3m, T3n, T3q, T3t; + T3m = VFMA(LDK(KP923879532), T3d, T36); + T3n = VFMA(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 30)]), VFNMSI(T3n, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3n, T3m), ms, &(x[0])); + T3q = VFNMS(LDK(KP923879532), T3p, T3o); + T3t = VFMA(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 10)]), VFMAI(T3t, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VFNMSI(T3t, T3q), ms, &(x[0])); + } + } + { + V TE, T1M, T1I, T1N, T1t, T1Q, T1F, T1P; + { + V Tg, TD, T1G, T1H; + Tg = VFMA(LDK(KP707106781), Tf, T4); + TD = VADD(Tr, TC); + TE = VFMA(LDK(KP923879532), TD, Tg); + T1M = VFNMS(LDK(KP923879532), TD, Tg); + T1G = VFMA(LDK(KP198912367), TV, T12); + T1H = VFMA(LDK(KP198912367), T1k, T1r); + T1I = VSUB(T1G, T1H); + T1N = VADD(T1G, T1H); + } + { + V T13, T1s, T1B, T1E; + T13 = VFNMS(LDK(KP198912367), T12, TV); + T1s = VFNMS(LDK(KP198912367), T1r, T1k); + T1t = VADD(T13, T1s); + T1Q = VSUB(T13, T1s); + T1B = VFMA(LDK(KP707106781), T1A, T1z); + T1E = VSUB(T1C, T1D); + T1F = VFMA(LDK(KP923879532), T1E, T1B); + T1P = VFNMS(LDK(KP923879532), T1E, T1B); + } + { + V T1u, T1J, T1S, T1T; + T1u = VFNMS(LDK(KP980785280), T1t, TE); + T1J = VFNMS(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 15)]), VFNMSI(T1J, T1u), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VFMAI(T1J, T1u), ms, &(x[WS(rs, 1)])); + T1S = VFMA(LDK(KP980785280), T1N, T1M); + T1T = VFNMS(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 7)]), VFNMSI(T1T, T1S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFMAI(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VFMA(LDK(KP980785280), T1t, TE); + T1L = VFMA(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 31)]), VFNMSI(T1L, T1K), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T1L, T1K), ms, &(x[WS(rs, 1)])); + T1O = VFNMS(LDK(KP980785280), T1N, T1M); + T1R = VFMA(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 9)]), VFMAI(T1R, T1O), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VFNMSI(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2e, T2a, T2f, T23, T2i, T27, T2h; + { + V T1U, T1V, T28, T29; + T1U = VFNMS(LDK(KP707106781), Tf, T4); + T1V = VADD(T1C, T1D); + T1W = VFMA(LDK(KP923879532), T1V, T1U); + T2e = VFNMS(LDK(KP923879532), T1V, T1U); + T28 = VFNMS(LDK(KP668178637), T1X, T1Y); + T29 = VFNMS(LDK(KP668178637), T20, T21); + T2a = VSUB(T28, T29); + T2f = VADD(T28, T29); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP668178637), T1Y, T1X); + T22 = VFMA(LDK(KP668178637), T21, T20); + T23 = VADD(T1Z, T22); + T2i = VSUB(T1Z, T22); + T25 = VFNMS(LDK(KP707106781), T1A, T1z); + T26 = VSUB(Tr, TC); + T27 = VFNMS(LDK(KP923879532), T26, T25); + T2h = VFMA(LDK(KP923879532), T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VFNMS(LDK(KP831469612), T23, T1W); + T2b = VFNMS(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 19)]), VFNMSI(T2b, T24), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T2b, T24), ms, &(x[WS(rs, 1)])); + T2k = VFNMS(LDK(KP831469612), T2f, T2e); + T2l = VFMA(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 5)]), VFMAI(T2l, T2k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFNMSI(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VFMA(LDK(KP831469612), T23, T1W); + T2d = VFMA(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 3)]), VFNMSI(T2d, T2c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VFMAI(T2d, T2c), ms, &(x[WS(rs, 1)])); + T2g = VFMA(LDK(KP831469612), T2f, T2e); + T2j = VFNMS(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 11)]), VFNMSI(T2j, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VFMAI(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t1bv_32"), twinstr, &GENUS, {119, 62, 98, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_32) (planner *p) { + X(kdft_dit_register) (p, t1bv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t1bv_32 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 217 FP additions, 104 FP multiplications, + * (or, 201 additions, 88 multiplications, 16 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1D, T2P, T3h, Tf, T1y, T2K, T3i, TC, T1w, T2G, T3e, Tr, T1v, T2D; + V T3d, T1k, T20, T2y, T3a, T1r, T21, T2v, T39, TV, T1X, T2r, T37, T12, T1Y; + V T2o, T36; + { + V T1, T1C, T3, T1A, T1B, T2, T1z, T2N, T2O; + T1 = LD(&(x[0]), ms, &(x[0])); + T1B = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1C = BYTW(&(W[TWVL * 46]), T1B); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 30]), T2); + T1z = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1A = BYTW(&(W[TWVL * 14]), T1z); + T4 = VSUB(T1, T3); + T1D = VSUB(T1A, T1C); + T2N = VADD(T1, T3); + T2O = VADD(T1A, T1C); + T2P = VSUB(T2N, T2O); + T3h = VADD(T2N, T2O); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2I, T2J; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + T1y = VMUL(LDK(KP707106781), VSUB(T9, Te)); + T2I = VADD(T6, T8); + T2J = VADD(Tb, Td); + T2K = VSUB(T2I, T2J); + T3i = VADD(T2I, T2J); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 10]), Ts); + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 26]), Tz); + Tu = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + Tv = BYTW(&(W[TWVL * 42]), Tu); + Tx = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Ty = BYTW(&(W[TWVL * 58]), Tx); + } + { + V Tw, TB, T2E, T2F; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFNMS(LDK(KP382683432), TB, VMUL(LDK(KP923879532), Tw)); + T1w = VFMA(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T2E = VADD(Ty, TA); + T2F = VADD(Tt, Tv); + T2G = VSUB(T2E, T2F); + T3e = VADD(T2E, T2F); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2B, T2C; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + T1v = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + T2B = VADD(Ti, Tk); + T2C = VADD(Tn, Tp); + T2D = VSUB(T2B, T2C); + T3d = VADD(T2B, T2C); + } + } + { + V T1g, T1i, T1o, T1m, T1a, T1c, T1d, T15, T17, T18; + { + V T1f, T1h, T1n, T1l; + T1f = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1g = BYTW(&(W[TWVL * 12]), T1f); + T1h = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1i = BYTW(&(W[TWVL * 44]), T1h); + T1n = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1o = BYTW(&(W[TWVL * 28]), T1n); + T1l = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T1m = BYTW(&(W[TWVL * 60]), T1l); + { + V T19, T1b, T14, T16; + T19 = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1a = BYTW(&(W[TWVL * 52]), T19); + T1b = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1c = BYTW(&(W[TWVL * 20]), T1b); + T1d = VSUB(T1a, T1c); + T14 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T15 = BYTW(&(W[TWVL * 4]), T14); + T16 = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T17 = BYTW(&(W[TWVL * 36]), T16); + T18 = VSUB(T15, T17); + } + } + { + V T1e, T1j, T2w, T2x; + T1e = VMUL(LDK(KP707106781), VSUB(T18, T1d)); + T1j = VSUB(T1g, T1i); + T1k = VSUB(T1e, T1j); + T20 = VADD(T1j, T1e); + T2w = VADD(T15, T17); + T2x = VADD(T1a, T1c); + T2y = VSUB(T2w, T2x); + T3a = VADD(T2w, T2x); + } + { + V T1p, T1q, T2t, T2u; + T1p = VSUB(T1m, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T18, T1d)); + T1r = VSUB(T1p, T1q); + T21 = VADD(T1p, T1q); + T2t = VADD(T1m, T1o); + T2u = VADD(T1g, T1i); + T2v = VSUB(T2t, T2u); + T39 = VADD(T2t, T2u); + } + } + { + V TR, TT, TZ, TX, TL, TN, TO, TG, TI, TJ; + { + V TQ, TS, TY, TW; + TQ = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TR = BYTW(&(W[TWVL * 16]), TQ); + TS = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + TT = BYTW(&(W[TWVL * 48]), TS); + TY = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TZ = BYTW(&(W[TWVL * 32]), TY); + TW = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TX = BYTW(&(W[0]), TW); + { + V TK, TM, TF, TH; + TK = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TL = BYTW(&(W[TWVL * 56]), TK); + TM = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TN = BYTW(&(W[TWVL * 24]), TM); + TO = VSUB(TL, TN); + TF = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TG = BYTW(&(W[TWVL * 8]), TF); + TH = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TI = BYTW(&(W[TWVL * 40]), TH); + TJ = VSUB(TG, TI); + } + } + { + V TP, TU, T2p, T2q; + TP = VMUL(LDK(KP707106781), VSUB(TJ, TO)); + TU = VSUB(TR, TT); + TV = VSUB(TP, TU); + T1X = VADD(TU, TP); + T2p = VADD(TG, TI); + T2q = VADD(TL, TN); + T2r = VSUB(T2p, T2q); + T37 = VADD(T2p, T2q); + } + { + V T10, T11, T2m, T2n; + T10 = VSUB(TX, TZ); + T11 = VMUL(LDK(KP707106781), VADD(TJ, TO)); + T12 = VSUB(T10, T11); + T1Y = VADD(T10, T11); + T2m = VADD(TX, TZ); + T2n = VADD(TR, TT); + T2o = VSUB(T2m, T2n); + T36 = VADD(T2m, T2n); + } + } + { + V T3q, T3u, T3t, T3v; + { + V T3o, T3p, T3r, T3s; + T3o = VADD(T3h, T3i); + T3p = VADD(T3d, T3e); + T3q = VSUB(T3o, T3p); + T3u = VADD(T3o, T3p); + T3r = VADD(T36, T37); + T3s = VADD(T39, T3a); + T3t = VBYI(VSUB(T3r, T3s)); + T3v = VADD(T3r, T3s); + } + ST(&(x[WS(rs, 24)]), VSUB(T3q, T3t), ms, &(x[0])); + ST(&(x[0]), VADD(T3u, T3v), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T3q, T3t), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T3u, T3v), ms, &(x[0])); + } + { + V T3f, T3j, T3c, T3k, T38, T3b; + T3f = VSUB(T3d, T3e); + T3j = VSUB(T3h, T3i); + T38 = VSUB(T36, T37); + T3b = VSUB(T39, T3a); + T3c = VMUL(LDK(KP707106781), VSUB(T38, T3b)); + T3k = VMUL(LDK(KP707106781), VADD(T38, T3b)); + { + V T3g, T3l, T3m, T3n; + T3g = VBYI(VSUB(T3c, T3f)); + T3l = VSUB(T3j, T3k); + ST(&(x[WS(rs, 12)]), VADD(T3g, T3l), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VSUB(T3l, T3g), ms, &(x[0])); + T3m = VBYI(VADD(T3f, T3c)); + T3n = VADD(T3j, T3k); + ST(&(x[WS(rs, 4)]), VADD(T3m, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VSUB(T3n, T3m), ms, &(x[0])); + } + } + { + V T2L, T31, T2R, T2Y, T2A, T2Z, T2U, T32, T2H, T2Q; + T2H = VMUL(LDK(KP707106781), VSUB(T2D, T2G)); + T2L = VSUB(T2H, T2K); + T31 = VADD(T2K, T2H); + T2Q = VMUL(LDK(KP707106781), VADD(T2D, T2G)); + T2R = VSUB(T2P, T2Q); + T2Y = VADD(T2P, T2Q); + { + V T2s, T2z, T2S, T2T; + T2s = VFNMS(LDK(KP382683432), T2r, VMUL(LDK(KP923879532), T2o)); + T2z = VFMA(LDK(KP923879532), T2v, VMUL(LDK(KP382683432), T2y)); + T2A = VSUB(T2s, T2z); + T2Z = VADD(T2s, T2z); + T2S = VFMA(LDK(KP382683432), T2o, VMUL(LDK(KP923879532), T2r)); + T2T = VFNMS(LDK(KP382683432), T2v, VMUL(LDK(KP923879532), T2y)); + T2U = VSUB(T2S, T2T); + T32 = VADD(T2S, T2T); + } + { + V T2M, T2V, T34, T35; + T2M = VBYI(VSUB(T2A, T2L)); + T2V = VSUB(T2R, T2U); + ST(&(x[WS(rs, 10)]), VADD(T2M, T2V), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VSUB(T2V, T2M), ms, &(x[0])); + T34 = VSUB(T2Y, T2Z); + T35 = VBYI(VSUB(T32, T31)); + ST(&(x[WS(rs, 18)]), VSUB(T34, T35), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T34, T35), ms, &(x[0])); + } + { + V T2W, T2X, T30, T33; + T2W = VBYI(VADD(T2L, T2A)); + T2X = VADD(T2R, T2U); + ST(&(x[WS(rs, 6)]), VADD(T2W, T2X), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VSUB(T2X, T2W), ms, &(x[0])); + T30 = VADD(T2Y, T2Z); + T33 = VBYI(VADD(T31, T32)); + ST(&(x[WS(rs, 30)]), VSUB(T30, T33), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T30, T33), ms, &(x[0])); + } + } + { + V TE, T1P, T1I, T1Q, T1t, T1M, T1F, T1N; + { + V Tg, TD, T1G, T1H; + Tg = VSUB(T4, Tf); + TD = VSUB(Tr, TC); + TE = VSUB(Tg, TD); + T1P = VADD(Tg, TD); + T1G = VFNMS(LDK(KP555570233), TV, VMUL(LDK(KP831469612), T12)); + T1H = VFMA(LDK(KP555570233), T1k, VMUL(LDK(KP831469612), T1r)); + T1I = VSUB(T1G, T1H); + T1Q = VADD(T1G, T1H); + } + { + V T13, T1s, T1x, T1E; + T13 = VFMA(LDK(KP831469612), TV, VMUL(LDK(KP555570233), T12)); + T1s = VFNMS(LDK(KP555570233), T1r, VMUL(LDK(KP831469612), T1k)); + T1t = VSUB(T13, T1s); + T1M = VADD(T13, T1s); + T1x = VSUB(T1v, T1w); + T1E = VSUB(T1y, T1D); + T1F = VSUB(T1x, T1E); + T1N = VADD(T1E, T1x); + } + { + V T1u, T1J, T1S, T1T; + T1u = VADD(TE, T1t); + T1J = VBYI(VADD(T1F, T1I)); + ST(&(x[WS(rs, 27)]), VSUB(T1u, T1J), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1u, T1J), ms, &(x[WS(rs, 1)])); + T1S = VBYI(VADD(T1N, T1M)); + T1T = VADD(T1P, T1Q); + ST(&(x[WS(rs, 3)]), VADD(T1S, T1T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VSUB(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VSUB(TE, T1t); + T1L = VBYI(VSUB(T1I, T1F)); + ST(&(x[WS(rs, 21)]), VSUB(T1K, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T1K, T1L), ms, &(x[WS(rs, 1)])); + T1O = VBYI(VSUB(T1M, T1N)); + T1R = VSUB(T1P, T1Q); + ST(&(x[WS(rs, 13)]), VADD(T1O, T1R), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VSUB(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2h, T2a, T2i, T23, T2e, T27, T2f; + { + V T1U, T1V, T28, T29; + T1U = VADD(T4, Tf); + T1V = VADD(T1v, T1w); + T1W = VSUB(T1U, T1V); + T2h = VADD(T1U, T1V); + T28 = VFNMS(LDK(KP195090322), T1X, VMUL(LDK(KP980785280), T1Y)); + T29 = VFMA(LDK(KP195090322), T20, VMUL(LDK(KP980785280), T21)); + T2a = VSUB(T28, T29); + T2i = VADD(T28, T29); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP980785280), T1X, VMUL(LDK(KP195090322), T1Y)); + T22 = VFNMS(LDK(KP195090322), T21, VMUL(LDK(KP980785280), T20)); + T23 = VSUB(T1Z, T22); + T2e = VADD(T1Z, T22); + T25 = VADD(Tr, TC); + T26 = VADD(T1D, T1y); + T27 = VSUB(T25, T26); + T2f = VADD(T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VADD(T1W, T23); + T2b = VBYI(VADD(T27, T2a)); + ST(&(x[WS(rs, 25)]), VSUB(T24, T2b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T24, T2b), ms, &(x[WS(rs, 1)])); + T2k = VBYI(VADD(T2f, T2e)); + T2l = VADD(T2h, T2i); + ST(&(x[WS(rs, 1)]), VADD(T2k, T2l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VSUB(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VSUB(T1W, T23); + T2d = VBYI(VSUB(T2a, T27)); + ST(&(x[WS(rs, 23)]), VSUB(T2c, T2d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T2c, T2d), ms, &(x[WS(rs, 1)])); + T2g = VBYI(VSUB(T2e, T2f)); + T2j = VSUB(T2h, T2i); + ST(&(x[WS(rs, 15)]), VADD(T2g, T2j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VSUB(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t1bv_32"), twinstr, &GENUS, {201, 88, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_32) (planner *p) { + X(kdft_dit_register) (p, t1bv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_4.c new file mode 100644 index 000000000..be69b8cf6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_4.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1bv_4 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 11 FP additions, 8 FP multiplications, + * (or, 9 additions, 6 multiplications, 2 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VSUB(T6, T8); + ST(&(x[WS(rs, 3)]), VFNMSI(T9, T4), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T9, T4), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1bv_4"), twinstr, &GENUS, {9, 6, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_4) (planner *p) { + X(kdft_dit_register) (p, t1bv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1bv_4 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 11 FP additions, 6 FP multiplications, + * (or, 11 additions, 6 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VBYI(VSUB(T6, T8)); + ST(&(x[WS(rs, 3)]), VSUB(T4, T9), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T4, T9), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1bv_4"), twinstr, &GENUS, {11, 6, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_4) (planner *p) { + X(kdft_dit_register) (p, t1bv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_5.c new file mode 100644 index 000000000..723914831 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_5.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1bv_5 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 20 FP additions, 19 FP multiplications, + * (or, 11 additions, 10 multiplications, 9 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, Tg, Th, T6, Tb, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, Ta, T5, T8; + { + V T2, T9, T4, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T9 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 4]), T9); + T4 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 6]), T4); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 2]), T7); + } + Tg = VSUB(T3, T5); + Th = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tb = VADD(T8, Ta); + Tc = VADD(T6, Tb); + } + ST(&(x[0]), VADD(T1, Tc), ms, &(x[0])); + { + V Ti, Tk, Tf, Tj, Td, Te; + Ti = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Th, Tg)); + Tk = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tg, Th)); + Td = VFNMS(LDK(KP250000000), Tc, T1); + Te = VSUB(T6, Tb); + Tf = VFMA(LDK(KP559016994), Te, Td); + Tj = VFNMS(LDK(KP559016994), Te, Td); + ST(&(x[WS(rs, 1)]), VFMAI(Ti, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFNMSI(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFNMSI(Tk, Tj), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1bv_5"), twinstr, &GENUS, {11, 10, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_5) (planner *p) { + X(kdft_dit_register) (p, t1bv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1bv_5 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 20 FP additions, 14 FP multiplications, + * (or, 17 additions, 11 multiplications, 3 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V Tf, T5, Ta, Tc, Td, Tg; + Tf = LD(&(x[0]), ms, &(x[0])); + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 6]), T3); + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 2]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tc = VADD(T2, T4); + Td = VADD(T7, T9); + Tg = VADD(Tc, Td); + } + ST(&(x[0]), VADD(Tf, Tg), ms, &(x[0])); + { + V Tb, Tj, Ti, Tk, Te, Th; + Tb = VBYI(VFMA(LDK(KP951056516), T5, VMUL(LDK(KP587785252), Ta))); + Tj = VBYI(VFNMS(LDK(KP951056516), Ta, VMUL(LDK(KP587785252), T5))); + Te = VMUL(LDK(KP559016994), VSUB(Tc, Td)); + Th = VFNMS(LDK(KP250000000), Tg, Tf); + Ti = VADD(Te, Th); + Tk = VSUB(Th, Te); + ST(&(x[WS(rs, 1)]), VADD(Tb, Ti), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VSUB(Ti, Tb), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tj, Tk), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1bv_5"), twinstr, &GENUS, {17, 11, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_5) (planner *p) { + X(kdft_dit_register) (p, t1bv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_6.c new file mode 100644 index 000000000..622984ebb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_6.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1bv_6 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 23 FP additions, 18 FP multiplications, + * (or, 17 additions, 12 multiplications, 6 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V T4, Ti, Te, Tk, T9, Tj, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 4]), T2); + T4 = VSUB(T1, T3); + Ti = VADD(T1, T3); + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[0]), Tc); + Te = VSUB(Tb, Td); + Tk = VADD(Tb, Td); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 2]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tj = VADD(T6, T8); + } + { + V Th, Tf, Tg, Tn, Tl, Tm; + Th = VMUL(LDK(KP866025403), VSUB(T9, Te)); + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP500000000), Tf, T4); + ST(&(x[WS(rs, 1)]), VFMAI(Th, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Th, Tg), ms, &(x[WS(rs, 1)])); + Tn = VMUL(LDK(KP866025403), VSUB(Tj, Tk)); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[WS(rs, 2)]), VFNMSI(Tn, Tm), ms, &(x[0])); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1bv_6"), twinstr, &GENUS, {17, 12, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_6) (planner *p) { + X(kdft_dit_register) (p, t1bv_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1bv_6 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 23 FP additions, 14 FP multiplications, + * (or, 21 additions, 12 multiplications, 2 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V Tf, Ti, Ta, Tk, T5, Tj, Tc, Te, Td; + Tc = LD(&(x[0]), ms, &(x[0])); + Td = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Te = BYTW(&(W[TWVL * 4]), Td); + Tf = VSUB(Tc, Te); + Ti = VADD(Tc, Te); + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 6]), T6); + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[0]), T8); + Ta = VSUB(T7, T9); + Tk = VADD(T7, T9); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTW(&(W[TWVL * 2]), T1); + T3 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 8]), T3); + T5 = VSUB(T2, T4); + Tj = VADD(T2, T4); + } + { + V Tb, Tg, Th, Tn, Tl, Tm; + Tb = VBYI(VMUL(LDK(KP866025403), VSUB(T5, Ta))); + Tg = VADD(T5, Ta); + Th = VFNMS(LDK(KP500000000), Tg, Tf); + ST(&(x[WS(rs, 1)]), VADD(Tb, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(Tf, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Th, Tb), ms, &(x[WS(rs, 1)])); + Tn = VBYI(VMUL(LDK(KP866025403), VSUB(Tj, Tk))); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[WS(rs, 2)]), VSUB(Tm, Tn), ms, &(x[0])); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1bv_6"), twinstr, &GENUS, {21, 12, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_6) (planner *p) { + X(kdft_dit_register) (p, t1bv_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_64.c new file mode 100644 index 000000000..8e6831c4b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_64.c @@ -0,0 +1,1948 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:59 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t1bv_64 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 519 FP additions, 384 FP multiplications, + * (or, 261 additions, 126 multiplications, 258 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Ta, T3U, T6l, T7B, T37, T3V, T58, T7a, T1v, T24, T43, T4F, T5F, T7l, T5Q; + V T7o, T2i, T2R, T4a, T4I, T60, T7s, T6b, T7v, T4k, T4l, T4C, T5x, T7g, T1i; + V T3b, T5u, T7h, T4h, T4i, T4B, T5o, T7d, TV, T3a, T5l, T7e, T3X, T3Y, Tx; + V T38, T5f, T7C, T6o, T7b, T1S, T25, T5T, T7m, T46, T4G, T5M, T7p, T2F, T2S; + V T6e, T7t, T4d, T4J, T67, T7w; + { + V T1, T3, T8, T6, T33, T35, T56, T2Y, T30, T55, T2, T7, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 62]), T2); + T7 = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 94]), T7); + T5 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 30]), T5); + { + V T32, T34, T2X, T2Z; + T32 = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + T33 = BYTW(&(W[TWVL * 110]), T32); + T34 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T35 = BYTW(&(W[TWVL * 46]), T34); + T56 = VSUB(T33, T35); + T2X = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T2Y = BYTW(&(W[TWVL * 14]), T2X); + T2Z = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T30 = BYTW(&(W[TWVL * 78]), T2Z); + T55 = VSUB(T2Y, T30); + } + { + V T4, T9, T6j, T6k; + T4 = VADD(T1, T3); + T9 = VADD(T6, T8); + Ta = VSUB(T4, T9); + T3U = VADD(T4, T9); + T6j = VSUB(T6, T8); + T6k = VSUB(T55, T56); + T6l = VFMA(LDK(KP707106781), T6k, T6j); + T7B = VFNMS(LDK(KP707106781), T6k, T6j); + } + { + V T31, T36, T54, T57; + T31 = VADD(T2Y, T30); + T36 = VADD(T33, T35); + T37 = VSUB(T31, T36); + T3V = VADD(T31, T36); + T54 = VSUB(T1, T3); + T57 = VADD(T55, T56); + T58 = VFMA(LDK(KP707106781), T57, T54); + T7a = VFNMS(LDK(KP707106781), T57, T54); + } + } + { + V T1m, T1o, T1p, T1r, T1t, T1u, T1Y, T5C, T23, T5D, T41, T42; + { + V T1l, T1n, T1q, T1s; + T1l = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T1m = BYTW(&(W[0]), T1l); + T1n = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T1o = BYTW(&(W[TWVL * 64]), T1n); + T1p = VADD(T1m, T1o); + T1q = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1r = BYTW(&(W[TWVL * 32]), T1q); + T1s = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T1t = BYTW(&(W[TWVL * 96]), T1s); + T1u = VADD(T1r, T1t); + } + { + V T1V, T1X, T1U, T1W; + T1U = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1V = BYTW(&(W[TWVL * 16]), T1U); + T1W = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T1X = BYTW(&(W[TWVL * 80]), T1W); + T1Y = VADD(T1V, T1X); + T5C = VSUB(T1V, T1X); + } + { + V T20, T22, T1Z, T21; + T1Z = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T20 = BYTW(&(W[TWVL * 112]), T1Z); + T21 = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T22 = BYTW(&(W[TWVL * 48]), T21); + T23 = VADD(T20, T22); + T5D = VSUB(T20, T22); + } + T1v = VSUB(T1p, T1u); + T24 = VSUB(T1Y, T23); + T41 = VADD(T1p, T1u); + T42 = VADD(T1Y, T23); + T43 = VADD(T41, T42); + T4F = VSUB(T41, T42); + { + V T5B, T5E, T5O, T5P; + T5B = VSUB(T1m, T1o); + T5E = VADD(T5C, T5D); + T5F = VFMA(LDK(KP707106781), T5E, T5B); + T7l = VFNMS(LDK(KP707106781), T5E, T5B); + T5O = VSUB(T1r, T1t); + T5P = VSUB(T5C, T5D); + T5Q = VFMA(LDK(KP707106781), T5P, T5O); + T7o = VFNMS(LDK(KP707106781), T5P, T5O); + } + } + { + V T29, T2b, T2c, T2e, T2g, T2h, T2L, T5Y, T2Q, T5X, T48, T49; + { + V T28, T2a, T2d, T2f; + T28 = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T29 = BYTW(&(W[TWVL * 124]), T28); + T2a = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T2b = BYTW(&(W[TWVL * 60]), T2a); + T2c = VADD(T29, T2b); + T2d = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2e = BYTW(&(W[TWVL * 28]), T2d); + T2f = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T2g = BYTW(&(W[TWVL * 92]), T2f); + T2h = VADD(T2e, T2g); + } + { + V T2I, T2K, T2H, T2J; + T2H = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2I = BYTW(&(W[TWVL * 108]), T2H); + T2J = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2K = BYTW(&(W[TWVL * 44]), T2J); + T2L = VADD(T2I, T2K); + T5Y = VSUB(T2I, T2K); + } + { + V T2N, T2P, T2M, T2O; + T2M = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2N = BYTW(&(W[TWVL * 12]), T2M); + T2O = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2P = BYTW(&(W[TWVL * 76]), T2O); + T2Q = VADD(T2N, T2P); + T5X = VSUB(T2N, T2P); + } + T2i = VSUB(T2c, T2h); + T2R = VSUB(T2L, T2Q); + T48 = VADD(T2c, T2h); + T49 = VADD(T2Q, T2L); + T4a = VADD(T48, T49); + T4I = VSUB(T48, T49); + { + V T5W, T5Z, T69, T6a; + T5W = VSUB(T29, T2b); + T5Z = VADD(T5X, T5Y); + T60 = VFMA(LDK(KP707106781), T5Z, T5W); + T7s = VFNMS(LDK(KP707106781), T5Z, T5W); + T69 = VSUB(T2g, T2e); + T6a = VSUB(T5Y, T5X); + T6b = VFMA(LDK(KP707106781), T6a, T69); + T7v = VFNMS(LDK(KP707106781), T6a, T69); + } + } + { + V TX, TZ, T10, T12, T14, T15, T1b, T5s, T1g, T5r, T5v, T5w; + { + V TW, TY, T11, T13; + TW = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + TX = BYTW(&(W[TWVL * 122]), TW); + TY = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TZ = BYTW(&(W[TWVL * 58]), TY); + T10 = VADD(TX, TZ); + T11 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T12 = BYTW(&(W[TWVL * 26]), T11); + T13 = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T14 = BYTW(&(W[TWVL * 90]), T13); + T15 = VADD(T12, T14); + } + { + V T18, T1a, T17, T19; + T17 = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + T18 = BYTW(&(W[TWVL * 106]), T17); + T19 = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1a = BYTW(&(W[TWVL * 42]), T19); + T1b = VADD(T18, T1a); + T5s = VSUB(T18, T1a); + } + { + V T1d, T1f, T1c, T1e; + T1c = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T1d = BYTW(&(W[TWVL * 10]), T1c); + T1e = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + T1f = BYTW(&(W[TWVL * 74]), T1e); + T1g = VADD(T1d, T1f); + T5r = VSUB(T1d, T1f); + } + T4k = VADD(T10, T15); + T4l = VADD(T1g, T1b); + T4C = VSUB(T4k, T4l); + T5v = VSUB(T14, T12); + T5w = VSUB(T5s, T5r); + T5x = VFMA(LDK(KP707106781), T5w, T5v); + T7g = VFNMS(LDK(KP707106781), T5w, T5v); + { + V T16, T1h, T5q, T5t; + T16 = VSUB(T10, T15); + T1h = VSUB(T1b, T1g); + T1i = VFNMS(LDK(KP414213562), T1h, T16); + T3b = VFMA(LDK(KP414213562), T16, T1h); + T5q = VSUB(TX, TZ); + T5t = VADD(T5r, T5s); + T5u = VFMA(LDK(KP707106781), T5t, T5q); + T7h = VFNMS(LDK(KP707106781), T5t, T5q); + } + } + { + V TA, TC, TD, TF, TH, TI, TO, T5i, TT, T5j, T5m, T5n; + { + V Tz, TB, TE, TG; + Tz = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 2]), Tz); + TB = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 66]), TB); + TD = VADD(TA, TC); + TE = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + TF = BYTW(&(W[TWVL * 34]), TE); + TG = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + TH = BYTW(&(W[TWVL * 98]), TG); + TI = VADD(TF, TH); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TL = BYTW(&(W[TWVL * 18]), TK); + TM = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + TN = BYTW(&(W[TWVL * 82]), TM); + TO = VADD(TL, TN); + T5i = VSUB(TL, TN); + } + { + V TQ, TS, TP, TR; + TP = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + TQ = BYTW(&(W[TWVL * 114]), TP); + TR = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TS = BYTW(&(W[TWVL * 50]), TR); + TT = VADD(TQ, TS); + T5j = VSUB(TQ, TS); + } + T4h = VADD(TD, TI); + T4i = VADD(TO, TT); + T4B = VSUB(T4h, T4i); + T5m = VSUB(TF, TH); + T5n = VSUB(T5i, T5j); + T5o = VFMA(LDK(KP707106781), T5n, T5m); + T7d = VFNMS(LDK(KP707106781), T5n, T5m); + { + V TJ, TU, T5h, T5k; + TJ = VSUB(TD, TI); + TU = VSUB(TO, TT); + TV = VFNMS(LDK(KP414213562), TU, TJ); + T3a = VFMA(LDK(KP414213562), TJ, TU); + T5h = VSUB(TA, TC); + T5k = VADD(T5i, T5j); + T5l = VFMA(LDK(KP707106781), T5k, T5h); + T7e = VFNMS(LDK(KP707106781), T5k, T5h); + } + } + { + V Tf, T59, Tv, T5d, Tk, T5a, Tq, T5c, Tl, Tw; + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tc = BYTW(&(W[TWVL * 6]), Tb); + Td = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Te = BYTW(&(W[TWVL * 70]), Td); + Tf = VADD(Tc, Te); + T59 = VSUB(Tc, Te); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Ts = BYTW(&(W[TWVL * 22]), Tr); + Tt = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + Tu = BYTW(&(W[TWVL * 86]), Tt); + Tv = VADD(Ts, Tu); + T5d = VSUB(Tu, Ts); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 38]), Tg); + Ti = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 102]), Ti); + Tk = VADD(Th, Tj); + T5a = VSUB(Th, Tj); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 118]), Tm); + To = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 54]), To); + Tq = VADD(Tn, Tp); + T5c = VSUB(Tn, Tp); + } + T3X = VADD(Tf, Tk); + T3Y = VADD(Tq, Tv); + Tl = VSUB(Tf, Tk); + Tw = VSUB(Tq, Tv); + Tx = VADD(Tl, Tw); + T38 = VSUB(Tl, Tw); + { + V T5b, T5e, T6m, T6n; + T5b = VFNMS(LDK(KP414213562), T5a, T59); + T5e = VFNMS(LDK(KP414213562), T5d, T5c); + T5f = VADD(T5b, T5e); + T7C = VSUB(T5b, T5e); + T6m = VFMA(LDK(KP414213562), T59, T5a); + T6n = VFMA(LDK(KP414213562), T5c, T5d); + T6o = VSUB(T6m, T6n); + T7b = VADD(T6m, T6n); + } + } + { + V T1A, T5G, T1Q, T5K, T1F, T5H, T1L, T5J; + { + V T1x, T1z, T1w, T1y; + T1w = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1x = BYTW(&(W[TWVL * 8]), T1w); + T1y = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1z = BYTW(&(W[TWVL * 72]), T1y); + T1A = VADD(T1x, T1z); + T5G = VSUB(T1x, T1z); + } + { + V T1N, T1P, T1M, T1O; + T1M = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1N = BYTW(&(W[TWVL * 24]), T1M); + T1O = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1P = BYTW(&(W[TWVL * 88]), T1O); + T1Q = VADD(T1N, T1P); + T5K = VSUB(T1N, T1P); + } + { + V T1C, T1E, T1B, T1D; + T1B = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1C = BYTW(&(W[TWVL * 40]), T1B); + T1D = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1E = BYTW(&(W[TWVL * 104]), T1D); + T1F = VADD(T1C, T1E); + T5H = VSUB(T1C, T1E); + } + { + V T1I, T1K, T1H, T1J; + T1H = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1I = BYTW(&(W[TWVL * 120]), T1H); + T1J = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1K = BYTW(&(W[TWVL * 56]), T1J); + T1L = VADD(T1I, T1K); + T5J = VSUB(T1I, T1K); + } + { + V T1G, T1R, T5R, T5S; + T1G = VSUB(T1A, T1F); + T1R = VSUB(T1L, T1Q); + T1S = VADD(T1G, T1R); + T25 = VSUB(T1G, T1R); + T5R = VFMA(LDK(KP414213562), T5G, T5H); + T5S = VFNMS(LDK(KP414213562), T5J, T5K); + T5T = VADD(T5R, T5S); + T7m = VSUB(T5R, T5S); + } + { + V T44, T45, T5I, T5L; + T44 = VADD(T1A, T1F); + T45 = VADD(T1L, T1Q); + T46 = VADD(T44, T45); + T4G = VSUB(T44, T45); + T5I = VFNMS(LDK(KP414213562), T5H, T5G); + T5L = VFMA(LDK(KP414213562), T5K, T5J); + T5M = VADD(T5I, T5L); + T7p = VSUB(T5I, T5L); + } + } + { + V T2n, T61, T2D, T65, T2s, T62, T2y, T64; + { + V T2k, T2m, T2j, T2l; + T2j = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2k = BYTW(&(W[TWVL * 4]), T2j); + T2l = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2m = BYTW(&(W[TWVL * 68]), T2l); + T2n = VADD(T2k, T2m); + T61 = VSUB(T2k, T2m); + } + { + V T2A, T2C, T2z, T2B; + T2z = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2A = BYTW(&(W[TWVL * 20]), T2z); + T2B = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2C = BYTW(&(W[TWVL * 84]), T2B); + T2D = VADD(T2A, T2C); + T65 = VSUB(T2C, T2A); + } + { + V T2p, T2r, T2o, T2q; + T2o = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2p = BYTW(&(W[TWVL * 36]), T2o); + T2q = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2r = BYTW(&(W[TWVL * 100]), T2q); + T2s = VADD(T2p, T2r); + T62 = VSUB(T2r, T2p); + } + { + V T2v, T2x, T2u, T2w; + T2u = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2v = BYTW(&(W[TWVL * 116]), T2u); + T2w = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2x = BYTW(&(W[TWVL * 52]), T2w); + T2y = VADD(T2v, T2x); + T64 = VSUB(T2v, T2x); + } + { + V T2t, T2E, T6c, T6d; + T2t = VSUB(T2n, T2s); + T2E = VSUB(T2y, T2D); + T2F = VADD(T2t, T2E); + T2S = VSUB(T2E, T2t); + T6c = VFNMS(LDK(KP414213562), T61, T62); + T6d = VFMA(LDK(KP414213562), T64, T65); + T6e = VADD(T6c, T6d); + T7t = VSUB(T6d, T6c); + } + { + V T4b, T4c, T63, T66; + T4b = VADD(T2n, T2s); + T4c = VADD(T2y, T2D); + T4d = VADD(T4b, T4c); + T4J = VSUB(T4c, T4b); + T63 = VFMA(LDK(KP414213562), T62, T61); + T66 = VFNMS(LDK(KP414213562), T65, T64); + T67 = VADD(T63, T66); + T7w = VSUB(T66, T63); + } + } + { + V T40, T4s, T4x, T4z, T4f, T4o, T4n, T4t, T4u, T4y; + { + V T3W, T3Z, T4v, T4w; + T3W = VADD(T3U, T3V); + T3Z = VADD(T3X, T3Y); + T40 = VSUB(T3W, T3Z); + T4s = VADD(T3W, T3Z); + T4v = VADD(T43, T46); + T4w = VADD(T4a, T4d); + T4x = VSUB(T4v, T4w); + T4z = VADD(T4v, T4w); + } + { + V T47, T4e, T4j, T4m; + T47 = VSUB(T43, T46); + T4e = VSUB(T4a, T4d); + T4f = VADD(T47, T4e); + T4o = VSUB(T47, T4e); + T4j = VADD(T4h, T4i); + T4m = VADD(T4k, T4l); + T4n = VSUB(T4j, T4m); + T4t = VADD(T4j, T4m); + } + T4u = VSUB(T4s, T4t); + ST(&(x[WS(rs, 48)]), VFNMSI(T4x, T4u), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T4x, T4u), ms, &(x[0])); + T4y = VADD(T4s, T4t); + ST(&(x[WS(rs, 32)]), VSUB(T4y, T4z), ms, &(x[0])); + ST(&(x[0]), VADD(T4y, T4z), ms, &(x[0])); + { + V T4g, T4p, T4q, T4r; + T4g = VFNMS(LDK(KP707106781), T4f, T40); + T4p = VFNMS(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 24)]), VFNMSI(T4p, T4g), ms, &(x[0])); + ST(&(x[WS(rs, 40)]), VFMAI(T4p, T4g), ms, &(x[0])); + T4q = VFMA(LDK(KP707106781), T4f, T40); + T4r = VFMA(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 8)]), VFMAI(T4r, T4q), ms, &(x[0])); + ST(&(x[WS(rs, 56)]), VFNMSI(T4r, T4q), ms, &(x[0])); + } + } + { + V T4E, T4W, T4S, T4X, T4L, T50, T4P, T4Z; + { + V T4A, T4D, T4Q, T4R; + T4A = VSUB(T3U, T3V); + T4D = VADD(T4B, T4C); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4W = VFNMS(LDK(KP707106781), T4D, T4A); + T4Q = VFMA(LDK(KP414213562), T4F, T4G); + T4R = VFMA(LDK(KP414213562), T4I, T4J); + T4S = VSUB(T4Q, T4R); + T4X = VADD(T4Q, T4R); + } + { + V T4H, T4K, T4N, T4O; + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + T4K = VFNMS(LDK(KP414213562), T4J, T4I); + T4L = VADD(T4H, T4K); + T50 = VSUB(T4H, T4K); + T4N = VSUB(T3X, T3Y); + T4O = VSUB(T4B, T4C); + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4Z = VFNMS(LDK(KP707106781), T4O, T4N); + } + { + V T4M, T4T, T52, T53; + T4M = VFNMS(LDK(KP923879532), T4L, T4E); + T4T = VFNMS(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 28)]), VFNMSI(T4T, T4M), ms, &(x[0])); + ST(&(x[WS(rs, 36)]), VFMAI(T4T, T4M), ms, &(x[0])); + T52 = VFMA(LDK(KP923879532), T4X, T4W); + T53 = VFNMS(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 12)]), VFNMSI(T53, T52), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VFMAI(T53, T52), ms, &(x[0])); + } + { + V T4U, T4V, T4Y, T51; + T4U = VFMA(LDK(KP923879532), T4L, T4E); + T4V = VFMA(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 60)]), VFNMSI(T4V, T4U), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T4V, T4U), ms, &(x[0])); + T4Y = VFNMS(LDK(KP923879532), T4X, T4W); + T51 = VFMA(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 20)]), VFMAI(T51, T4Y), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VFNMSI(T51, T4Y), ms, &(x[0])); + } + } + { + V T1k, T3k, T3d, T3n, T2V, T3o, T3g, T3l; + { + V Ty, T1j, T39, T3c; + Ty = VFMA(LDK(KP707106781), Tx, Ta); + T1j = VADD(TV, T1i); + T1k = VFMA(LDK(KP923879532), T1j, Ty); + T3k = VFNMS(LDK(KP923879532), T1j, Ty); + T39 = VFMA(LDK(KP707106781), T38, T37); + T3c = VSUB(T3a, T3b); + T3d = VFMA(LDK(KP923879532), T3c, T39); + T3n = VFNMS(LDK(KP923879532), T3c, T39); + { + V T27, T3e, T2U, T3f; + { + V T1T, T26, T2G, T2T; + T1T = VFMA(LDK(KP707106781), T1S, T1v); + T26 = VFMA(LDK(KP707106781), T25, T24); + T27 = VFNMS(LDK(KP198912367), T26, T1T); + T3e = VFMA(LDK(KP198912367), T1T, T26); + T2G = VFMA(LDK(KP707106781), T2F, T2i); + T2T = VFMA(LDK(KP707106781), T2S, T2R); + T2U = VFNMS(LDK(KP198912367), T2T, T2G); + T3f = VFMA(LDK(KP198912367), T2G, T2T); + } + T2V = VADD(T27, T2U); + T3o = VSUB(T27, T2U); + T3g = VSUB(T3e, T3f); + T3l = VADD(T3e, T3f); + } + } + { + V T2W, T3h, T3q, T3r; + T2W = VFNMS(LDK(KP980785280), T2V, T1k); + T3h = VFNMS(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 30)]), VFNMSI(T3h, T2W), ms, &(x[0])); + ST(&(x[WS(rs, 34)]), VFMAI(T3h, T2W), ms, &(x[0])); + T3q = VFMA(LDK(KP980785280), T3l, T3k); + T3r = VFNMS(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 14)]), VFNMSI(T3r, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 50)]), VFMAI(T3r, T3q), ms, &(x[0])); + } + { + V T3i, T3j, T3m, T3p; + T3i = VFMA(LDK(KP980785280), T2V, T1k); + T3j = VFMA(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 62)]), VFNMSI(T3j, T3i), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3j, T3i), ms, &(x[0])); + T3m = VFNMS(LDK(KP980785280), T3l, T3k); + T3p = VFMA(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 18)]), VFMAI(T3p, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 46)]), VFNMSI(T3p, T3m), ms, &(x[0])); + } + } + { + V T3u, T3M, T3F, T3P, T3B, T3Q, T3I, T3N; + { + V T3s, T3t, T3D, T3E; + T3s = VFNMS(LDK(KP707106781), Tx, Ta); + T3t = VADD(T3a, T3b); + T3u = VFMA(LDK(KP923879532), T3t, T3s); + T3M = VFNMS(LDK(KP923879532), T3t, T3s); + T3D = VFNMS(LDK(KP707106781), T38, T37); + T3E = VSUB(TV, T1i); + T3F = VFNMS(LDK(KP923879532), T3E, T3D); + T3P = VFMA(LDK(KP923879532), T3E, T3D); + { + V T3x, T3G, T3A, T3H; + { + V T3v, T3w, T3y, T3z; + T3v = VFNMS(LDK(KP707106781), T1S, T1v); + T3w = VFNMS(LDK(KP707106781), T25, T24); + T3x = VFMA(LDK(KP668178637), T3w, T3v); + T3G = VFNMS(LDK(KP668178637), T3v, T3w); + T3y = VFNMS(LDK(KP707106781), T2F, T2i); + T3z = VFNMS(LDK(KP707106781), T2S, T2R); + T3A = VFMA(LDK(KP668178637), T3z, T3y); + T3H = VFNMS(LDK(KP668178637), T3y, T3z); + } + T3B = VADD(T3x, T3A); + T3Q = VSUB(T3x, T3A); + T3I = VSUB(T3G, T3H); + T3N = VADD(T3G, T3H); + } + } + { + V T3C, T3J, T3S, T3T; + T3C = VFNMS(LDK(KP831469612), T3B, T3u); + T3J = VFNMS(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 38)]), VFNMSI(T3J, T3C), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3J, T3C), ms, &(x[0])); + T3S = VFNMS(LDK(KP831469612), T3N, T3M); + T3T = VFMA(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 10)]), VFMAI(T3T, T3S), ms, &(x[0])); + ST(&(x[WS(rs, 54)]), VFNMSI(T3T, T3S), ms, &(x[0])); + } + { + V T3K, T3L, T3O, T3R; + T3K = VFMA(LDK(KP831469612), T3B, T3u); + T3L = VFMA(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 6)]), VFNMSI(T3L, T3K), ms, &(x[0])); + ST(&(x[WS(rs, 58)]), VFMAI(T3L, T3K), ms, &(x[0])); + T3O = VFMA(LDK(KP831469612), T3N, T3M); + T3R = VFNMS(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 22)]), VFNMSI(T3R, T3O), ms, &(x[0])); + ST(&(x[WS(rs, 42)]), VFMAI(T3R, T3O), ms, &(x[0])); + } + } + { + V T7k, T8j, T7O, T89, T7H, T8g, T7R, T7Y, T7z, T7S, T7K, T7P, T85, T8k, T8c; + V T8h; + { + V T7c, T87, T7j, T88, T7f, T7i; + T7c = VFNMS(LDK(KP923879532), T7b, T7a); + T87 = VFNMS(LDK(KP923879532), T7C, T7B); + T7f = VFNMS(LDK(KP668178637), T7e, T7d); + T7i = VFNMS(LDK(KP668178637), T7h, T7g); + T7j = VADD(T7f, T7i); + T88 = VSUB(T7f, T7i); + T7k = VFNMS(LDK(KP831469612), T7j, T7c); + T8j = VFNMS(LDK(KP831469612), T88, T87); + T7O = VFMA(LDK(KP831469612), T7j, T7c); + T89 = VFMA(LDK(KP831469612), T88, T87); + } + { + V T7D, T7W, T7G, T7X, T7E, T7F; + T7D = VFMA(LDK(KP923879532), T7C, T7B); + T7W = VFMA(LDK(KP923879532), T7b, T7a); + T7E = VFMA(LDK(KP668178637), T7d, T7e); + T7F = VFMA(LDK(KP668178637), T7g, T7h); + T7G = VSUB(T7E, T7F); + T7X = VADD(T7E, T7F); + T7H = VFMA(LDK(KP831469612), T7G, T7D); + T8g = VFNMS(LDK(KP831469612), T7X, T7W); + T7R = VFNMS(LDK(KP831469612), T7G, T7D); + T7Y = VFMA(LDK(KP831469612), T7X, T7W); + } + { + V T7r, T7I, T7y, T7J; + { + V T7n, T7q, T7u, T7x; + T7n = VFNMS(LDK(KP923879532), T7m, T7l); + T7q = VFMA(LDK(KP923879532), T7p, T7o); + T7r = VFNMS(LDK(KP534511135), T7q, T7n); + T7I = VFMA(LDK(KP534511135), T7n, T7q); + T7u = VFNMS(LDK(KP923879532), T7t, T7s); + T7x = VFMA(LDK(KP923879532), T7w, T7v); + T7y = VFNMS(LDK(KP534511135), T7x, T7u); + T7J = VFMA(LDK(KP534511135), T7u, T7x); + } + T7z = VADD(T7r, T7y); + T7S = VSUB(T7r, T7y); + T7K = VSUB(T7I, T7J); + T7P = VADD(T7I, T7J); + } + { + V T81, T8a, T84, T8b; + { + V T7Z, T80, T82, T83; + T7Z = VFMA(LDK(KP923879532), T7m, T7l); + T80 = VFNMS(LDK(KP923879532), T7p, T7o); + T81 = VFMA(LDK(KP303346683), T80, T7Z); + T8a = VFNMS(LDK(KP303346683), T7Z, T80); + T82 = VFMA(LDK(KP923879532), T7t, T7s); + T83 = VFNMS(LDK(KP923879532), T7w, T7v); + T84 = VFMA(LDK(KP303346683), T83, T82); + T8b = VFNMS(LDK(KP303346683), T82, T83); + } + T85 = VADD(T81, T84); + T8k = VSUB(T81, T84); + T8c = VSUB(T8a, T8b); + T8h = VADD(T8a, T8b); + } + { + V T7A, T7L, T8i, T8l; + T7A = VFNMS(LDK(KP881921264), T7z, T7k); + T7L = VFNMS(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 27)]), VFNMSI(T7L, T7A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 37)]), VFMAI(T7L, T7A), ms, &(x[WS(rs, 1)])); + T8i = VFMA(LDK(KP956940335), T8h, T8g); + T8l = VFNMS(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 19)]), VFNMSI(T8l, T8i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 45)]), VFMAI(T8l, T8i), ms, &(x[WS(rs, 1)])); + } + { + V T8m, T8n, T7M, T7N; + T8m = VFNMS(LDK(KP956940335), T8h, T8g); + T8n = VFMA(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 13)]), VFMAI(T8n, T8m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 51)]), VFNMSI(T8n, T8m), ms, &(x[WS(rs, 1)])); + T7M = VFMA(LDK(KP881921264), T7z, T7k); + T7N = VFMA(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 59)]), VFNMSI(T7N, T7M), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(T7N, T7M), ms, &(x[WS(rs, 1)])); + } + { + V T7Q, T7T, T86, T8d; + T7Q = VFNMS(LDK(KP881921264), T7P, T7O); + T7T = VFMA(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 21)]), VFMAI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 43)]), VFNMSI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + T86 = VFNMS(LDK(KP956940335), T85, T7Y); + T8d = VFNMS(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 35)]), VFNMSI(T8d, T86), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VFMAI(T8d, T86), ms, &(x[WS(rs, 1)])); + } + { + V T8e, T8f, T7U, T7V; + T8e = VFMA(LDK(KP956940335), T85, T7Y); + T8f = VFMA(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 3)]), VFNMSI(T8f, T8e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 61)]), VFMAI(T8f, T8e), ms, &(x[WS(rs, 1)])); + T7U = VFMA(LDK(KP881921264), T7P, T7O); + T7V = VFNMS(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 11)]), VFNMSI(T7V, T7U), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 53)]), VFMAI(T7V, T7U), ms, &(x[WS(rs, 1)])); + } + } + { + V T5A, T75, T6A, T6V, T6t, T72, T6D, T6K, T6h, T6E, T6w, T6B, T6R, T76, T6Y; + V T73; + { + V T5g, T6T, T5z, T6U, T5p, T5y; + T5g = VFMA(LDK(KP923879532), T5f, T58); + T6T = VFNMS(LDK(KP923879532), T6o, T6l); + T5p = VFNMS(LDK(KP198912367), T5o, T5l); + T5y = VFNMS(LDK(KP198912367), T5x, T5u); + T5z = VADD(T5p, T5y); + T6U = VSUB(T5p, T5y); + T5A = VFMA(LDK(KP980785280), T5z, T5g); + T75 = VFMA(LDK(KP980785280), T6U, T6T); + T6A = VFNMS(LDK(KP980785280), T5z, T5g); + T6V = VFNMS(LDK(KP980785280), T6U, T6T); + } + { + V T6p, T6I, T6s, T6J, T6q, T6r; + T6p = VFMA(LDK(KP923879532), T6o, T6l); + T6I = VFNMS(LDK(KP923879532), T5f, T58); + T6q = VFMA(LDK(KP198912367), T5l, T5o); + T6r = VFMA(LDK(KP198912367), T5u, T5x); + T6s = VSUB(T6q, T6r); + T6J = VADD(T6q, T6r); + T6t = VFMA(LDK(KP980785280), T6s, T6p); + T72 = VFNMS(LDK(KP980785280), T6J, T6I); + T6D = VFNMS(LDK(KP980785280), T6s, T6p); + T6K = VFMA(LDK(KP980785280), T6J, T6I); + } + { + V T5V, T6u, T6g, T6v; + { + V T5N, T5U, T68, T6f; + T5N = VFMA(LDK(KP923879532), T5M, T5F); + T5U = VFMA(LDK(KP923879532), T5T, T5Q); + T5V = VFNMS(LDK(KP098491403), T5U, T5N); + T6u = VFMA(LDK(KP098491403), T5N, T5U); + T68 = VFMA(LDK(KP923879532), T67, T60); + T6f = VFMA(LDK(KP923879532), T6e, T6b); + T6g = VFNMS(LDK(KP098491403), T6f, T68); + T6v = VFMA(LDK(KP098491403), T68, T6f); + } + T6h = VADD(T5V, T6g); + T6E = VSUB(T5V, T6g); + T6w = VSUB(T6u, T6v); + T6B = VADD(T6u, T6v); + } + { + V T6N, T6W, T6Q, T6X; + { + V T6L, T6M, T6O, T6P; + T6L = VFNMS(LDK(KP923879532), T5M, T5F); + T6M = VFNMS(LDK(KP923879532), T5T, T5Q); + T6N = VFMA(LDK(KP820678790), T6M, T6L); + T6W = VFNMS(LDK(KP820678790), T6L, T6M); + T6O = VFNMS(LDK(KP923879532), T67, T60); + T6P = VFNMS(LDK(KP923879532), T6e, T6b); + T6Q = VFMA(LDK(KP820678790), T6P, T6O); + T6X = VFNMS(LDK(KP820678790), T6O, T6P); + } + T6R = VADD(T6N, T6Q); + T76 = VSUB(T6N, T6Q); + T6Y = VSUB(T6W, T6X); + T73 = VADD(T6W, T6X); + } + { + V T6i, T6x, T74, T77; + T6i = VFNMS(LDK(KP995184726), T6h, T5A); + T6x = VFNMS(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 31)]), VFNMSI(T6x, T6i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 33)]), VFMAI(T6x, T6i), ms, &(x[WS(rs, 1)])); + T74 = VFMA(LDK(KP773010453), T73, T72); + T77 = VFNMS(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 23)]), VFNMSI(T77, T74), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VFMAI(T77, T74), ms, &(x[WS(rs, 1)])); + } + { + V T78, T79, T6y, T6z; + T78 = VFNMS(LDK(KP773010453), T73, T72); + T79 = VFMA(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 9)]), VFMAI(T79, T78), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VFNMSI(T79, T78), ms, &(x[WS(rs, 1)])); + T6y = VFMA(LDK(KP995184726), T6h, T5A); + T6z = VFMA(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 63)]), VFNMSI(T6z, T6y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T6z, T6y), ms, &(x[WS(rs, 1)])); + } + { + V T6C, T6F, T6S, T6Z; + T6C = VFNMS(LDK(KP995184726), T6B, T6A); + T6F = VFMA(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 17)]), VFMAI(T6F, T6C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VFNMSI(T6F, T6C), ms, &(x[WS(rs, 1)])); + T6S = VFNMS(LDK(KP773010453), T6R, T6K); + T6Z = VFNMS(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 39)]), VFNMSI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFMAI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + } + { + V T70, T71, T6G, T6H; + T70 = VFMA(LDK(KP773010453), T6R, T6K); + T71 = VFMA(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 7)]), VFNMSI(T71, T70), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 57)]), VFMAI(T71, T70), ms, &(x[WS(rs, 1)])); + T6G = VFMA(LDK(KP995184726), T6B, T6A); + T6H = VFNMS(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 15)]), VFNMSI(T6H, T6G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VFMAI(T6H, T6G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t1bv_64"), twinstr, &GENUS, {261, 126, 258, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_64) (planner *p) { + X(kdft_dit_register) (p, t1bv_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t1bv_64 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 519 FP additions, 250 FP multiplications, + * (or, 467 additions, 198 multiplications, 52 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Tg, T4B, T6v, T7G, T3r, T4w, T5q, T7F, T5Y, T62, T28, T4d, T2g, T4a, T7g; + V T7Y, T6f, T6j, T2Z, T4k, T37, T4h, T7n, T81, T7w, T7x, T7y, T5M, T6q, T1k; + V T4s, T1r, T4t, T7t, T7u, T7v, T5F, T6p, TV, T4p, T12, T4q, T7A, T7B, TD; + V T4x, T3k, T4C, T5x, T6s, T1R, T4b, T7j, T7Z, T2j, T4e, T5V, T63, T2I, T4i; + V T7q, T82, T3a, T4l, T6c, T6k; + { + V T1, T3, T3p, T3n, Tb, Td, Te, T6, T8, T9, T2, T3o, T3m; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 62]), T2); + T3o = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T3p = BYTW(&(W[TWVL * 94]), T3o); + T3m = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3n = BYTW(&(W[TWVL * 30]), T3m); + { + V Ta, Tc, T5, T7; + Ta = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 110]), Ta); + Tc = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 46]), Tc); + Te = VSUB(Tb, Td); + T5 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 14]), T5); + T7 = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 78]), T7); + T9 = VSUB(T6, T8); + } + { + V T4, Tf, T6t, T6u; + T4 = VSUB(T1, T3); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VSUB(T4, Tf); + T4B = VADD(T4, Tf); + T6t = VADD(T6, T8); + T6u = VADD(Tb, Td); + T6v = VSUB(T6t, T6u); + T7G = VADD(T6t, T6u); + } + { + V T3l, T3q, T5o, T5p; + T3l = VMUL(LDK(KP707106781), VSUB(T9, Te)); + T3q = VSUB(T3n, T3p); + T3r = VSUB(T3l, T3q); + T4w = VADD(T3q, T3l); + T5o = VADD(T1, T3); + T5p = VADD(T3n, T3p); + T5q = VSUB(T5o, T5p); + T7F = VADD(T5o, T5p); + } + } + { + V T24, T26, T61, T2b, T2d, T60, T1W, T5W, T21, T5X, T22, T27; + { + V T23, T25, T2a, T2c; + T23 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T24 = BYTW(&(W[TWVL * 32]), T23); + T25 = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T26 = BYTW(&(W[TWVL * 96]), T25); + T61 = VADD(T24, T26); + T2a = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2b = BYTW(&(W[0]), T2a); + T2c = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T2d = BYTW(&(W[TWVL * 64]), T2c); + T60 = VADD(T2b, T2d); + } + { + V T1T, T1V, T1S, T1U; + T1S = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1T = BYTW(&(W[TWVL * 16]), T1S); + T1U = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T1V = BYTW(&(W[TWVL * 80]), T1U); + T1W = VSUB(T1T, T1V); + T5W = VADD(T1T, T1V); + } + { + V T1Y, T20, T1X, T1Z; + T1X = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T1Y = BYTW(&(W[TWVL * 112]), T1X); + T1Z = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T20 = BYTW(&(W[TWVL * 48]), T1Z); + T21 = VSUB(T1Y, T20); + T5X = VADD(T1Y, T20); + } + T5Y = VSUB(T5W, T5X); + T62 = VSUB(T60, T61); + T22 = VMUL(LDK(KP707106781), VSUB(T1W, T21)); + T27 = VSUB(T24, T26); + T28 = VSUB(T22, T27); + T4d = VADD(T27, T22); + { + V T2e, T2f, T7e, T7f; + T2e = VSUB(T2b, T2d); + T2f = VMUL(LDK(KP707106781), VADD(T1W, T21)); + T2g = VSUB(T2e, T2f); + T4a = VADD(T2e, T2f); + T7e = VADD(T60, T61); + T7f = VADD(T5W, T5X); + T7g = VSUB(T7e, T7f); + T7Y = VADD(T7e, T7f); + } + } + { + V T2V, T2X, T6i, T32, T34, T6h, T2N, T6d, T2S, T6e, T2T, T2Y; + { + V T2U, T2W, T31, T33; + T2U = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2V = BYTW(&(W[TWVL * 28]), T2U); + T2W = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T2X = BYTW(&(W[TWVL * 92]), T2W); + T6i = VADD(T2V, T2X); + T31 = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T32 = BYTW(&(W[TWVL * 124]), T31); + T33 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T34 = BYTW(&(W[TWVL * 60]), T33); + T6h = VADD(T32, T34); + } + { + V T2K, T2M, T2J, T2L; + T2J = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2K = BYTW(&(W[TWVL * 12]), T2J); + T2L = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2M = BYTW(&(W[TWVL * 76]), T2L); + T2N = VSUB(T2K, T2M); + T6d = VADD(T2K, T2M); + } + { + V T2P, T2R, T2O, T2Q; + T2O = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2P = BYTW(&(W[TWVL * 108]), T2O); + T2Q = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2R = BYTW(&(W[TWVL * 44]), T2Q); + T2S = VSUB(T2P, T2R); + T6e = VADD(T2P, T2R); + } + T6f = VSUB(T6d, T6e); + T6j = VSUB(T6h, T6i); + T2T = VMUL(LDK(KP707106781), VSUB(T2N, T2S)); + T2Y = VSUB(T2V, T2X); + T2Z = VSUB(T2T, T2Y); + T4k = VADD(T2Y, T2T); + { + V T35, T36, T7l, T7m; + T35 = VSUB(T32, T34); + T36 = VMUL(LDK(KP707106781), VADD(T2N, T2S)); + T37 = VSUB(T35, T36); + T4h = VADD(T35, T36); + T7l = VADD(T6h, T6i); + T7m = VADD(T6d, T6e); + T7n = VSUB(T7l, T7m); + T81 = VADD(T7l, T7m); + } + } + { + V T1g, T1i, T5K, T1m, T1o, T5J, T18, T5G, T1d, T5H, T5I, T5L; + { + V T1f, T1h, T1l, T1n; + T1f = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T1g = BYTW(&(W[TWVL * 26]), T1f); + T1h = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T1i = BYTW(&(W[TWVL * 90]), T1h); + T5K = VADD(T1g, T1i); + T1l = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + T1m = BYTW(&(W[TWVL * 122]), T1l); + T1n = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + T1o = BYTW(&(W[TWVL * 58]), T1n); + T5J = VADD(T1m, T1o); + } + { + V T15, T17, T14, T16; + T14 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T15 = BYTW(&(W[TWVL * 10]), T14); + T16 = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + T17 = BYTW(&(W[TWVL * 74]), T16); + T18 = VSUB(T15, T17); + T5G = VADD(T15, T17); + } + { + V T1a, T1c, T19, T1b; + T19 = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + T1a = BYTW(&(W[TWVL * 106]), T19); + T1b = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1c = BYTW(&(W[TWVL * 42]), T1b); + T1d = VSUB(T1a, T1c); + T5H = VADD(T1a, T1c); + } + T7w = VADD(T5J, T5K); + T7x = VADD(T5G, T5H); + T7y = VSUB(T7w, T7x); + T5I = VSUB(T5G, T5H); + T5L = VSUB(T5J, T5K); + T5M = VFNMS(LDK(KP382683432), T5L, VMUL(LDK(KP923879532), T5I)); + T6q = VFMA(LDK(KP923879532), T5L, VMUL(LDK(KP382683432), T5I)); + { + V T1e, T1j, T1p, T1q; + T1e = VMUL(LDK(KP707106781), VSUB(T18, T1d)); + T1j = VSUB(T1g, T1i); + T1k = VSUB(T1e, T1j); + T4s = VADD(T1j, T1e); + T1p = VSUB(T1m, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T18, T1d)); + T1r = VSUB(T1p, T1q); + T4t = VADD(T1p, T1q); + } + } + { + V TR, TT, T5A, TX, TZ, T5z, TJ, T5C, TO, T5D, T5B, T5E; + { + V TQ, TS, TW, TY; + TQ = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + TR = BYTW(&(W[TWVL * 34]), TQ); + TS = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + TT = BYTW(&(W[TWVL * 98]), TS); + T5A = VADD(TR, TT); + TW = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TX = BYTW(&(W[TWVL * 2]), TW); + TY = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + TZ = BYTW(&(W[TWVL * 66]), TY); + T5z = VADD(TX, TZ); + } + { + V TG, TI, TF, TH; + TF = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TG = BYTW(&(W[TWVL * 18]), TF); + TH = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + TI = BYTW(&(W[TWVL * 82]), TH); + TJ = VSUB(TG, TI); + T5C = VADD(TG, TI); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + TL = BYTW(&(W[TWVL * 114]), TK); + TM = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TN = BYTW(&(W[TWVL * 50]), TM); + TO = VSUB(TL, TN); + T5D = VADD(TL, TN); + } + T7t = VADD(T5z, T5A); + T7u = VADD(T5C, T5D); + T7v = VSUB(T7t, T7u); + T5B = VSUB(T5z, T5A); + T5E = VSUB(T5C, T5D); + T5F = VFMA(LDK(KP382683432), T5B, VMUL(LDK(KP923879532), T5E)); + T6p = VFNMS(LDK(KP382683432), T5E, VMUL(LDK(KP923879532), T5B)); + { + V TP, TU, T10, T11; + TP = VMUL(LDK(KP707106781), VSUB(TJ, TO)); + TU = VSUB(TR, TT); + TV = VSUB(TP, TU); + T4p = VADD(TU, TP); + T10 = VSUB(TX, TZ); + T11 = VMUL(LDK(KP707106781), VADD(TJ, TO)); + T12 = VSUB(T10, T11); + T4q = VADD(T10, T11); + } + } + { + V Tl, T5r, TB, T5u, Tq, T5s, Tw, T5v, Tr, TC; + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 6]), Th); + Tj = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 70]), Tj); + Tl = VSUB(Ti, Tk); + T5r = VADD(Ti, Tk); + } + { + V Ty, TA, Tx, Tz; + Tx = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Ty = BYTW(&(W[TWVL * 118]), Tx); + Tz = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 54]), Tz); + TB = VSUB(Ty, TA); + T5u = VADD(Ty, TA); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 38]), Tm); + To = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 102]), To); + Tq = VSUB(Tn, Tp); + T5s = VADD(Tn, Tp); + } + { + V Tt, Tv, Ts, Tu; + Ts = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 22]), Ts); + Tu = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + Tv = BYTW(&(W[TWVL * 86]), Tu); + Tw = VSUB(Tt, Tv); + T5v = VADD(Tt, Tv); + } + T7A = VADD(T5r, T5s); + T7B = VADD(T5u, T5v); + Tr = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + TC = VFNMS(LDK(KP382683432), TB, VMUL(LDK(KP923879532), Tw)); + TD = VSUB(Tr, TC); + T4x = VADD(Tr, TC); + { + V T3i, T3j, T5t, T5w; + T3i = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + T3j = VFMA(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T3k = VSUB(T3i, T3j); + T4C = VADD(T3i, T3j); + T5t = VSUB(T5r, T5s); + T5w = VSUB(T5u, T5v); + T5x = VMUL(LDK(KP707106781), VADD(T5t, T5w)); + T6s = VMUL(LDK(KP707106781), VSUB(T5t, T5w)); + } + } + { + V T1z, T5P, T1P, T5T, T1E, T5Q, T1K, T5S; + { + V T1w, T1y, T1v, T1x; + T1v = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1w = BYTW(&(W[TWVL * 8]), T1v); + T1x = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1y = BYTW(&(W[TWVL * 72]), T1x); + T1z = VSUB(T1w, T1y); + T5P = VADD(T1w, T1y); + } + { + V T1M, T1O, T1L, T1N; + T1L = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1M = BYTW(&(W[TWVL * 24]), T1L); + T1N = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1O = BYTW(&(W[TWVL * 88]), T1N); + T1P = VSUB(T1M, T1O); + T5T = VADD(T1M, T1O); + } + { + V T1B, T1D, T1A, T1C; + T1A = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1B = BYTW(&(W[TWVL * 40]), T1A); + T1C = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1D = BYTW(&(W[TWVL * 104]), T1C); + T1E = VSUB(T1B, T1D); + T5Q = VADD(T1B, T1D); + } + { + V T1H, T1J, T1G, T1I; + T1G = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1H = BYTW(&(W[TWVL * 120]), T1G); + T1I = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1J = BYTW(&(W[TWVL * 56]), T1I); + T1K = VSUB(T1H, T1J); + T5S = VADD(T1H, T1J); + } + { + V T1F, T1Q, T7h, T7i; + T1F = VFNMS(LDK(KP382683432), T1E, VMUL(LDK(KP923879532), T1z)); + T1Q = VFMA(LDK(KP923879532), T1K, VMUL(LDK(KP382683432), T1P)); + T1R = VSUB(T1F, T1Q); + T4b = VADD(T1F, T1Q); + T7h = VADD(T5P, T5Q); + T7i = VADD(T5S, T5T); + T7j = VSUB(T7h, T7i); + T7Z = VADD(T7h, T7i); + } + { + V T2h, T2i, T5R, T5U; + T2h = VFMA(LDK(KP382683432), T1z, VMUL(LDK(KP923879532), T1E)); + T2i = VFNMS(LDK(KP382683432), T1K, VMUL(LDK(KP923879532), T1P)); + T2j = VSUB(T2h, T2i); + T4e = VADD(T2h, T2i); + T5R = VSUB(T5P, T5Q); + T5U = VSUB(T5S, T5T); + T5V = VMUL(LDK(KP707106781), VSUB(T5R, T5U)); + T63 = VMUL(LDK(KP707106781), VADD(T5R, T5U)); + } + } + { + V T2q, T66, T2G, T6a, T2v, T67, T2B, T69; + { + V T2n, T2p, T2m, T2o; + T2m = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2n = BYTW(&(W[TWVL * 4]), T2m); + T2o = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2p = BYTW(&(W[TWVL * 68]), T2o); + T2q = VSUB(T2n, T2p); + T66 = VADD(T2n, T2p); + } + { + V T2D, T2F, T2C, T2E; + T2C = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2D = BYTW(&(W[TWVL * 20]), T2C); + T2E = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2F = BYTW(&(W[TWVL * 84]), T2E); + T2G = VSUB(T2D, T2F); + T6a = VADD(T2D, T2F); + } + { + V T2s, T2u, T2r, T2t; + T2r = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2s = BYTW(&(W[TWVL * 36]), T2r); + T2t = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2u = BYTW(&(W[TWVL * 100]), T2t); + T2v = VSUB(T2s, T2u); + T67 = VADD(T2s, T2u); + } + { + V T2y, T2A, T2x, T2z; + T2x = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2y = BYTW(&(W[TWVL * 116]), T2x); + T2z = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2A = BYTW(&(W[TWVL * 52]), T2z); + T2B = VSUB(T2y, T2A); + T69 = VADD(T2y, T2A); + } + { + V T2w, T2H, T7o, T7p; + T2w = VFNMS(LDK(KP382683432), T2v, VMUL(LDK(KP923879532), T2q)); + T2H = VFMA(LDK(KP923879532), T2B, VMUL(LDK(KP382683432), T2G)); + T2I = VSUB(T2w, T2H); + T4i = VADD(T2w, T2H); + T7o = VADD(T66, T67); + T7p = VADD(T69, T6a); + T7q = VSUB(T7o, T7p); + T82 = VADD(T7o, T7p); + } + { + V T38, T39, T68, T6b; + T38 = VFMA(LDK(KP382683432), T2q, VMUL(LDK(KP923879532), T2v)); + T39 = VFNMS(LDK(KP382683432), T2B, VMUL(LDK(KP923879532), T2G)); + T3a = VSUB(T38, T39); + T4l = VADD(T38, T39); + T68 = VSUB(T66, T67); + T6b = VSUB(T69, T6a); + T6c = VMUL(LDK(KP707106781), VSUB(T68, T6b)); + T6k = VMUL(LDK(KP707106781), VADD(T68, T6b)); + } + } + { + V T7s, T7R, T7M, T7U, T7D, T7T, T7J, T7Q; + { + V T7k, T7r, T7K, T7L; + T7k = VFNMS(LDK(KP382683432), T7j, VMUL(LDK(KP923879532), T7g)); + T7r = VFMA(LDK(KP923879532), T7n, VMUL(LDK(KP382683432), T7q)); + T7s = VSUB(T7k, T7r); + T7R = VADD(T7k, T7r); + T7K = VFMA(LDK(KP382683432), T7g, VMUL(LDK(KP923879532), T7j)); + T7L = VFNMS(LDK(KP382683432), T7n, VMUL(LDK(KP923879532), T7q)); + T7M = VSUB(T7K, T7L); + T7U = VADD(T7K, T7L); + } + { + V T7z, T7C, T7H, T7I; + T7z = VMUL(LDK(KP707106781), VSUB(T7v, T7y)); + T7C = VSUB(T7A, T7B); + T7D = VSUB(T7z, T7C); + T7T = VADD(T7C, T7z); + T7H = VSUB(T7F, T7G); + T7I = VMUL(LDK(KP707106781), VADD(T7v, T7y)); + T7J = VSUB(T7H, T7I); + T7Q = VADD(T7H, T7I); + } + { + V T7E, T7N, T7W, T7X; + T7E = VBYI(VSUB(T7s, T7D)); + T7N = VSUB(T7J, T7M); + ST(&(x[WS(rs, 20)]), VADD(T7E, T7N), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VSUB(T7N, T7E), ms, &(x[0])); + T7W = VSUB(T7Q, T7R); + T7X = VBYI(VSUB(T7U, T7T)); + ST(&(x[WS(rs, 36)]), VSUB(T7W, T7X), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VADD(T7W, T7X), ms, &(x[0])); + } + { + V T7O, T7P, T7S, T7V; + T7O = VBYI(VADD(T7D, T7s)); + T7P = VADD(T7J, T7M); + ST(&(x[WS(rs, 12)]), VADD(T7O, T7P), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VSUB(T7P, T7O), ms, &(x[0])); + T7S = VADD(T7Q, T7R); + T7V = VBYI(VADD(T7T, T7U)); + ST(&(x[WS(rs, 60)]), VSUB(T7S, T7V), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T7S, T7V), ms, &(x[0])); + } + } + { + V T84, T8c, T8l, T8n, T87, T8h, T8b, T8g, T8i, T8m; + { + V T80, T83, T8j, T8k; + T80 = VSUB(T7Y, T7Z); + T83 = VSUB(T81, T82); + T84 = VMUL(LDK(KP707106781), VSUB(T80, T83)); + T8c = VMUL(LDK(KP707106781), VADD(T80, T83)); + T8j = VADD(T7Y, T7Z); + T8k = VADD(T81, T82); + T8l = VBYI(VSUB(T8j, T8k)); + T8n = VADD(T8j, T8k); + } + { + V T85, T86, T89, T8a; + T85 = VADD(T7t, T7u); + T86 = VADD(T7w, T7x); + T87 = VSUB(T85, T86); + T8h = VADD(T85, T86); + T89 = VADD(T7F, T7G); + T8a = VADD(T7A, T7B); + T8b = VSUB(T89, T8a); + T8g = VADD(T89, T8a); + } + T8i = VSUB(T8g, T8h); + ST(&(x[WS(rs, 48)]), VSUB(T8i, T8l), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T8i, T8l), ms, &(x[0])); + T8m = VADD(T8g, T8h); + ST(&(x[WS(rs, 32)]), VSUB(T8m, T8n), ms, &(x[0])); + ST(&(x[0]), VADD(T8m, T8n), ms, &(x[0])); + { + V T88, T8d, T8e, T8f; + T88 = VBYI(VSUB(T84, T87)); + T8d = VSUB(T8b, T8c); + ST(&(x[WS(rs, 24)]), VADD(T88, T8d), ms, &(x[0])); + ST(&(x[WS(rs, 40)]), VSUB(T8d, T88), ms, &(x[0])); + T8e = VBYI(VADD(T87, T84)); + T8f = VADD(T8b, T8c); + ST(&(x[WS(rs, 8)]), VADD(T8e, T8f), ms, &(x[0])); + ST(&(x[WS(rs, 56)]), VSUB(T8f, T8e), ms, &(x[0])); + } + } + { + V T5O, T6H, T6x, T6F, T6n, T6I, T6A, T6E; + { + V T5y, T5N, T6r, T6w; + T5y = VSUB(T5q, T5x); + T5N = VSUB(T5F, T5M); + T5O = VSUB(T5y, T5N); + T6H = VADD(T5y, T5N); + T6r = VSUB(T6p, T6q); + T6w = VSUB(T6s, T6v); + T6x = VSUB(T6r, T6w); + T6F = VADD(T6w, T6r); + { + V T65, T6y, T6m, T6z; + { + V T5Z, T64, T6g, T6l; + T5Z = VSUB(T5V, T5Y); + T64 = VSUB(T62, T63); + T65 = VFMA(LDK(KP831469612), T5Z, VMUL(LDK(KP555570233), T64)); + T6y = VFNMS(LDK(KP555570233), T5Z, VMUL(LDK(KP831469612), T64)); + T6g = VSUB(T6c, T6f); + T6l = VSUB(T6j, T6k); + T6m = VFNMS(LDK(KP555570233), T6l, VMUL(LDK(KP831469612), T6g)); + T6z = VFMA(LDK(KP555570233), T6g, VMUL(LDK(KP831469612), T6l)); + } + T6n = VSUB(T65, T6m); + T6I = VADD(T6y, T6z); + T6A = VSUB(T6y, T6z); + T6E = VADD(T65, T6m); + } + } + { + V T6o, T6B, T6K, T6L; + T6o = VADD(T5O, T6n); + T6B = VBYI(VADD(T6x, T6A)); + ST(&(x[WS(rs, 54)]), VSUB(T6o, T6B), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VADD(T6o, T6B), ms, &(x[0])); + T6K = VBYI(VADD(T6F, T6E)); + T6L = VADD(T6H, T6I); + ST(&(x[WS(rs, 6)]), VADD(T6K, T6L), ms, &(x[0])); + ST(&(x[WS(rs, 58)]), VSUB(T6L, T6K), ms, &(x[0])); + } + { + V T6C, T6D, T6G, T6J; + T6C = VSUB(T5O, T6n); + T6D = VBYI(VSUB(T6A, T6x)); + ST(&(x[WS(rs, 42)]), VSUB(T6C, T6D), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VADD(T6C, T6D), ms, &(x[0])); + T6G = VBYI(VSUB(T6E, T6F)); + T6J = VSUB(T6H, T6I); + ST(&(x[WS(rs, 26)]), VADD(T6G, T6J), ms, &(x[0])); + ST(&(x[WS(rs, 38)]), VSUB(T6J, T6G), ms, &(x[0])); + } + } + { + V T6O, T79, T6Z, T77, T6V, T7a, T72, T76; + { + V T6M, T6N, T6X, T6Y; + T6M = VADD(T5q, T5x); + T6N = VADD(T6p, T6q); + T6O = VSUB(T6M, T6N); + T79 = VADD(T6M, T6N); + T6X = VADD(T5F, T5M); + T6Y = VADD(T6v, T6s); + T6Z = VSUB(T6X, T6Y); + T77 = VADD(T6Y, T6X); + { + V T6R, T70, T6U, T71; + { + V T6P, T6Q, T6S, T6T; + T6P = VADD(T5Y, T5V); + T6Q = VADD(T62, T63); + T6R = VFMA(LDK(KP980785280), T6P, VMUL(LDK(KP195090322), T6Q)); + T70 = VFNMS(LDK(KP195090322), T6P, VMUL(LDK(KP980785280), T6Q)); + T6S = VADD(T6f, T6c); + T6T = VADD(T6j, T6k); + T6U = VFNMS(LDK(KP195090322), T6T, VMUL(LDK(KP980785280), T6S)); + T71 = VFMA(LDK(KP195090322), T6S, VMUL(LDK(KP980785280), T6T)); + } + T6V = VSUB(T6R, T6U); + T7a = VADD(T70, T71); + T72 = VSUB(T70, T71); + T76 = VADD(T6R, T6U); + } + } + { + V T6W, T73, T7c, T7d; + T6W = VADD(T6O, T6V); + T73 = VBYI(VADD(T6Z, T72)); + ST(&(x[WS(rs, 50)]), VSUB(T6W, T73), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T6W, T73), ms, &(x[0])); + T7c = VBYI(VADD(T77, T76)); + T7d = VADD(T79, T7a); + ST(&(x[WS(rs, 2)]), VADD(T7c, T7d), ms, &(x[0])); + ST(&(x[WS(rs, 62)]), VSUB(T7d, T7c), ms, &(x[0])); + } + { + V T74, T75, T78, T7b; + T74 = VSUB(T6O, T6V); + T75 = VBYI(VSUB(T72, T6Z)); + ST(&(x[WS(rs, 46)]), VSUB(T74, T75), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VADD(T74, T75), ms, &(x[0])); + T78 = VBYI(VSUB(T76, T77)); + T7b = VSUB(T79, T7a); + ST(&(x[WS(rs, 30)]), VADD(T78, T7b), ms, &(x[0])); + ST(&(x[WS(rs, 34)]), VSUB(T7b, T78), ms, &(x[0])); + } + } + { + V T4z, T5g, T4R, T59, T4H, T5j, T4O, T55, T4o, T4S, T4K, T4P, T52, T5k, T5c; + V T5h; + { + V T4y, T57, T4v, T58, T4r, T4u; + T4y = VADD(T4w, T4x); + T57 = VSUB(T4B, T4C); + T4r = VFMA(LDK(KP980785280), T4p, VMUL(LDK(KP195090322), T4q)); + T4u = VFNMS(LDK(KP195090322), T4t, VMUL(LDK(KP980785280), T4s)); + T4v = VADD(T4r, T4u); + T58 = VSUB(T4r, T4u); + T4z = VSUB(T4v, T4y); + T5g = VADD(T57, T58); + T4R = VADD(T4y, T4v); + T59 = VSUB(T57, T58); + } + { + V T4D, T54, T4G, T53, T4E, T4F; + T4D = VADD(T4B, T4C); + T54 = VSUB(T4x, T4w); + T4E = VFNMS(LDK(KP195090322), T4p, VMUL(LDK(KP980785280), T4q)); + T4F = VFMA(LDK(KP195090322), T4s, VMUL(LDK(KP980785280), T4t)); + T4G = VADD(T4E, T4F); + T53 = VSUB(T4E, T4F); + T4H = VSUB(T4D, T4G); + T5j = VADD(T54, T53); + T4O = VADD(T4D, T4G); + T55 = VSUB(T53, T54); + } + { + V T4g, T4I, T4n, T4J; + { + V T4c, T4f, T4j, T4m; + T4c = VADD(T4a, T4b); + T4f = VADD(T4d, T4e); + T4g = VFNMS(LDK(KP098017140), T4f, VMUL(LDK(KP995184726), T4c)); + T4I = VFMA(LDK(KP098017140), T4c, VMUL(LDK(KP995184726), T4f)); + T4j = VADD(T4h, T4i); + T4m = VADD(T4k, T4l); + T4n = VFMA(LDK(KP995184726), T4j, VMUL(LDK(KP098017140), T4m)); + T4J = VFNMS(LDK(KP098017140), T4j, VMUL(LDK(KP995184726), T4m)); + } + T4o = VSUB(T4g, T4n); + T4S = VADD(T4I, T4J); + T4K = VSUB(T4I, T4J); + T4P = VADD(T4g, T4n); + } + { + V T4Y, T5a, T51, T5b; + { + V T4W, T4X, T4Z, T50; + T4W = VSUB(T4a, T4b); + T4X = VSUB(T4e, T4d); + T4Y = VFNMS(LDK(KP634393284), T4X, VMUL(LDK(KP773010453), T4W)); + T5a = VFMA(LDK(KP634393284), T4W, VMUL(LDK(KP773010453), T4X)); + T4Z = VSUB(T4h, T4i); + T50 = VSUB(T4l, T4k); + T51 = VFMA(LDK(KP773010453), T4Z, VMUL(LDK(KP634393284), T50)); + T5b = VFNMS(LDK(KP634393284), T4Z, VMUL(LDK(KP773010453), T50)); + } + T52 = VSUB(T4Y, T51); + T5k = VADD(T5a, T5b); + T5c = VSUB(T5a, T5b); + T5h = VADD(T4Y, T51); + } + { + V T4A, T4L, T5i, T5l; + T4A = VBYI(VSUB(T4o, T4z)); + T4L = VSUB(T4H, T4K); + ST(&(x[WS(rs, 17)]), VADD(T4A, T4L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VSUB(T4L, T4A), ms, &(x[WS(rs, 1)])); + T5i = VADD(T5g, T5h); + T5l = VBYI(VADD(T5j, T5k)); + ST(&(x[WS(rs, 57)]), VSUB(T5i, T5l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T5i, T5l), ms, &(x[WS(rs, 1)])); + } + { + V T5m, T5n, T4M, T4N; + T5m = VSUB(T5g, T5h); + T5n = VBYI(VSUB(T5k, T5j)); + ST(&(x[WS(rs, 39)]), VSUB(T5m, T5n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VADD(T5m, T5n), ms, &(x[WS(rs, 1)])); + T4M = VBYI(VADD(T4z, T4o)); + T4N = VADD(T4H, T4K); + ST(&(x[WS(rs, 15)]), VADD(T4M, T4N), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VSUB(T4N, T4M), ms, &(x[WS(rs, 1)])); + } + { + V T4Q, T4T, T56, T5d; + T4Q = VADD(T4O, T4P); + T4T = VBYI(VADD(T4R, T4S)); + ST(&(x[WS(rs, 63)]), VSUB(T4Q, T4T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T4Q, T4T), ms, &(x[WS(rs, 1)])); + T56 = VBYI(VSUB(T52, T55)); + T5d = VSUB(T59, T5c); + ST(&(x[WS(rs, 23)]), VADD(T56, T5d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VSUB(T5d, T56), ms, &(x[WS(rs, 1)])); + } + { + V T5e, T5f, T4U, T4V; + T5e = VBYI(VADD(T55, T52)); + T5f = VADD(T59, T5c); + ST(&(x[WS(rs, 9)]), VADD(T5e, T5f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VSUB(T5f, T5e), ms, &(x[WS(rs, 1)])); + T4U = VSUB(T4O, T4P); + T4V = VBYI(VSUB(T4S, T4R)); + ST(&(x[WS(rs, 33)]), VSUB(T4U, T4V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VADD(T4U, T4V), ms, &(x[WS(rs, 1)])); + } + } + { + V T1u, T43, T3D, T3V, T3t, T45, T3B, T3K, T3d, T3E, T3w, T3A, T3R, T46, T3Y; + V T42; + { + V TE, T3U, T1t, T3T, T13, T1s; + TE = VSUB(Tg, TD); + T3U = VADD(T3r, T3k); + T13 = VFMA(LDK(KP831469612), TV, VMUL(LDK(KP555570233), T12)); + T1s = VFNMS(LDK(KP555570233), T1r, VMUL(LDK(KP831469612), T1k)); + T1t = VSUB(T13, T1s); + T3T = VADD(T13, T1s); + T1u = VSUB(TE, T1t); + T43 = VADD(T3U, T3T); + T3D = VADD(TE, T1t); + T3V = VSUB(T3T, T3U); + } + { + V T3s, T3I, T3h, T3J, T3f, T3g; + T3s = VSUB(T3k, T3r); + T3I = VADD(Tg, TD); + T3f = VFNMS(LDK(KP555570233), TV, VMUL(LDK(KP831469612), T12)); + T3g = VFMA(LDK(KP555570233), T1k, VMUL(LDK(KP831469612), T1r)); + T3h = VSUB(T3f, T3g); + T3J = VADD(T3f, T3g); + T3t = VSUB(T3h, T3s); + T45 = VADD(T3I, T3J); + T3B = VADD(T3s, T3h); + T3K = VSUB(T3I, T3J); + } + { + V T2l, T3u, T3c, T3v; + { + V T29, T2k, T30, T3b; + T29 = VSUB(T1R, T28); + T2k = VSUB(T2g, T2j); + T2l = VFMA(LDK(KP881921264), T29, VMUL(LDK(KP471396736), T2k)); + T3u = VFNMS(LDK(KP471396736), T29, VMUL(LDK(KP881921264), T2k)); + T30 = VSUB(T2I, T2Z); + T3b = VSUB(T37, T3a); + T3c = VFNMS(LDK(KP471396736), T3b, VMUL(LDK(KP881921264), T30)); + T3v = VFMA(LDK(KP471396736), T30, VMUL(LDK(KP881921264), T3b)); + } + T3d = VSUB(T2l, T3c); + T3E = VADD(T3u, T3v); + T3w = VSUB(T3u, T3v); + T3A = VADD(T2l, T3c); + } + { + V T3N, T3W, T3Q, T3X; + { + V T3L, T3M, T3O, T3P; + T3L = VADD(T28, T1R); + T3M = VADD(T2g, T2j); + T3N = VFMA(LDK(KP956940335), T3L, VMUL(LDK(KP290284677), T3M)); + T3W = VFNMS(LDK(KP290284677), T3L, VMUL(LDK(KP956940335), T3M)); + T3O = VADD(T2Z, T2I); + T3P = VADD(T37, T3a); + T3Q = VFNMS(LDK(KP290284677), T3P, VMUL(LDK(KP956940335), T3O)); + T3X = VFMA(LDK(KP290284677), T3O, VMUL(LDK(KP956940335), T3P)); + } + T3R = VSUB(T3N, T3Q); + T46 = VADD(T3W, T3X); + T3Y = VSUB(T3W, T3X); + T42 = VADD(T3N, T3Q); + } + { + V T3e, T3x, T44, T47; + T3e = VADD(T1u, T3d); + T3x = VBYI(VADD(T3t, T3w)); + ST(&(x[WS(rs, 53)]), VSUB(T3e, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T3e, T3x), ms, &(x[WS(rs, 1)])); + T44 = VBYI(VSUB(T42, T43)); + T47 = VSUB(T45, T46); + ST(&(x[WS(rs, 29)]), VADD(T44, T47), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 35)]), VSUB(T47, T44), ms, &(x[WS(rs, 1)])); + } + { + V T48, T49, T3y, T3z; + T48 = VBYI(VADD(T43, T42)); + T49 = VADD(T45, T46); + ST(&(x[WS(rs, 3)]), VADD(T48, T49), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 61)]), VSUB(T49, T48), ms, &(x[WS(rs, 1)])); + T3y = VSUB(T1u, T3d); + T3z = VBYI(VSUB(T3w, T3t)); + ST(&(x[WS(rs, 43)]), VSUB(T3y, T3z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VADD(T3y, T3z), ms, &(x[WS(rs, 1)])); + } + { + V T3C, T3F, T3S, T3Z; + T3C = VBYI(VSUB(T3A, T3B)); + T3F = VSUB(T3D, T3E); + ST(&(x[WS(rs, 27)]), VADD(T3C, T3F), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 37)]), VSUB(T3F, T3C), ms, &(x[WS(rs, 1)])); + T3S = VADD(T3K, T3R); + T3Z = VBYI(VADD(T3V, T3Y)); + ST(&(x[WS(rs, 51)]), VSUB(T3S, T3Z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VADD(T3S, T3Z), ms, &(x[WS(rs, 1)])); + } + { + V T40, T41, T3G, T3H; + T40 = VSUB(T3K, T3R); + T41 = VBYI(VSUB(T3Y, T3V)); + ST(&(x[WS(rs, 45)]), VSUB(T40, T41), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VADD(T40, T41), ms, &(x[WS(rs, 1)])); + T3G = VBYI(VADD(T3B, T3A)); + T3H = VADD(T3D, T3E); + ST(&(x[WS(rs, 5)]), VADD(T3G, T3H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 59)]), VSUB(T3H, T3G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t1bv_64"), twinstr, &GENUS, {467, 198, 52, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_64) (planner *p) { + X(kdft_dit_register) (p, t1bv_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_7.c new file mode 100644 index 000000000..3fcb905a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_7.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:57 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1bv_7 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 36 FP additions, 36 FP multiplications, + * (or, 15 additions, 15 multiplications, 21 fused multiply/add), + * 30 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V T1, Tk, Tm, Tl, T6, Tg, Tb, Th, Tu, Tp; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, Tf, Td, Ta, T8; + { + V T2, T4, Te, Tc, T9, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 10]), T4); + Te = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tf = BYTW(&(W[TWVL * 6]), Te); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + T9 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 8]), T9); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 2]), T7); + } + Tk = VSUB(Td, Tf); + Tm = VSUB(T3, T5); + Tl = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tg = VADD(Td, Tf); + Tb = VADD(T8, Ta); + Th = VFNMS(LDK(KP356895867), Tg, Tb); + Tu = VFNMS(LDK(KP356895867), Tb, T6); + Tp = VFNMS(LDK(KP356895867), T6, Tg); + } + ST(&(x[0]), VADD(T1, VADD(T6, VADD(Tb, Tg))), ms, &(x[0])); + { + V Tw, Ty, Tv, Tx; + Tv = VFNMS(LDK(KP692021471), Tu, Tg); + Tw = VFNMS(LDK(KP900968867), Tv, T1); + Tx = VFMA(LDK(KP554958132), Tk, Tm); + Ty = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), Tx, Tl)); + ST(&(x[WS(rs, 1)]), VFMAI(Ty, Tw), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VFNMSI(Ty, Tw), ms, &(x[0])); + } + { + V Tj, To, Ti, Tn; + Ti = VFNMS(LDK(KP692021471), Th, T6); + Tj = VFNMS(LDK(KP900968867), Ti, T1); + Tn = VFNMS(LDK(KP554958132), Tm, Tl); + To = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tn, Tk)); + ST(&(x[WS(rs, 3)]), VFMAI(To, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFNMSI(To, Tj), ms, &(x[0])); + } + { + V Tr, Tt, Tq, Ts; + Tq = VFNMS(LDK(KP692021471), Tp, Tb); + Tr = VFNMS(LDK(KP900968867), Tq, T1); + Ts = VFMA(LDK(KP554958132), Tl, Tk); + Tt = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Ts, Tm)); + ST(&(x[WS(rs, 2)]), VFMAI(Tt, Tr), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VFNMSI(Tt, Tr), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1bv_7"), twinstr, &GENUS, {15, 15, 21, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_7) (planner *p) { + X(kdft_dit_register) (p, t1bv_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1bv_7 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 36 FP additions, 30 FP multiplications, + * (or, 24 additions, 18 multiplications, 12 fused multiply/add), + * 21 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V Th, Tf, Ti, T5, Tk, Ta, Tj, To, Tp; + Th = LD(&(x[0]), ms, &(x[0])); + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tc = BYTW(&(W[TWVL * 2]), Tb); + Td = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Te = BYTW(&(W[TWVL * 8]), Td); + Tf = VSUB(Tc, Te); + Ti = VADD(Tc, Te); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 10]), T3); + T5 = VSUB(T2, T4); + Tk = VADD(T2, T4); + } + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 4]), T6); + T8 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T9 = BYTW(&(W[TWVL * 6]), T8); + Ta = VSUB(T7, T9); + Tj = VADD(T7, T9); + } + ST(&(x[0]), VADD(Th, VADD(Tk, VADD(Ti, Tj))), ms, &(x[0])); + To = VBYI(VFNMS(LDK(KP781831482), Ta, VFNMS(LDK(KP433883739), Tf, VMUL(LDK(KP974927912), T5)))); + Tp = VFMA(LDK(KP623489801), Tj, VFNMS(LDK(KP900968867), Ti, VFNMS(LDK(KP222520933), Tk, Th))); + ST(&(x[WS(rs, 2)]), VADD(To, Tp), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VSUB(Tp, To), ms, &(x[WS(rs, 1)])); + { + V Tg, Tl, Tm, Tn; + Tg = VBYI(VFMA(LDK(KP433883739), T5, VFNMS(LDK(KP781831482), Tf, VMUL(LDK(KP974927912), Ta)))); + Tl = VFMA(LDK(KP623489801), Ti, VFNMS(LDK(KP222520933), Tj, VFNMS(LDK(KP900968867), Tk, Th))); + ST(&(x[WS(rs, 3)]), VADD(Tg, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VSUB(Tl, Tg), ms, &(x[0])); + Tm = VBYI(VFMA(LDK(KP781831482), T5, VFMA(LDK(KP974927912), Tf, VMUL(LDK(KP433883739), Ta)))); + Tn = VFMA(LDK(KP623489801), Tk, VFNMS(LDK(KP900968867), Tj, VFNMS(LDK(KP222520933), Ti, Th))); + ST(&(x[WS(rs, 1)]), VADD(Tm, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1bv_7"), twinstr, &GENUS, {24, 18, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_7) (planner *p) { + X(kdft_dit_register) (p, t1bv_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_8.c new file mode 100644 index 000000000..8b4929a5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_8.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1bv_8 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 33 FP additions, 24 FP multiplications, + * (or, 23 additions, 14 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tl, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + Tj = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 10]), Tj); + Tl = VSUB(Ti, Tk); + Tr = VADD(Ti, Tk); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTW(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VSUB(Tq, Tr); + Tv = VSUB(Tt, Tu); + ST(&(x[WS(rs, 6)]), VFNMSI(Tv, Ts), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tv, Ts), ms, &(x[0])); + Tw = VADD(Tq, Tr); + Tx = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[0]), VADD(Tw, Tx), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Tm; + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP707106781), Tf, T4); + To = VFMA(LDK(KP707106781), Tf, T4); + Tm = VSUB(T9, Te); + Tn = VFNMS(LDK(KP707106781), Tm, Tl); + Tp = VFMA(LDK(KP707106781), Tm, Tl); + ST(&(x[WS(rs, 3)]), VFNMSI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Tp, To), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1bv_8"), twinstr, &GENUS, {23, 14, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_8) (planner *p) { + X(kdft_dit_register) (p, t1bv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1bv_8 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 33 FP additions, 16 FP multiplications, + * (or, 33 additions, 16 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V Tl, Tq, Tg, Tr, T5, Tt, Ta, Tu, Ti, Tk, Tj; + Ti = LD(&(x[0]), ms, &(x[0])); + Tj = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 6]), Tj); + Tl = VSUB(Ti, Tk); + Tq = VADD(Ti, Tk); + { + V Td, Tf, Tc, Te; + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 2]), Tc); + Te = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tf = BYTW(&(W[TWVL * 10]), Te); + Tg = VSUB(Td, Tf); + Tr = VADD(Td, Tf); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 8]), T3); + T5 = VSUB(T2, T4); + Tt = VADD(T2, T4); + } + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 12]), T6); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + Ta = VSUB(T7, T9); + Tu = VADD(T7, T9); + } + { + V Ts, Tv, Tw, Tx; + Ts = VSUB(Tq, Tr); + Tv = VBYI(VSUB(Tt, Tu)); + ST(&(x[WS(rs, 6)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VADD(Tq, Tr); + Tx = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[0]), VADD(Tw, Tx), ms, &(x[0])); + { + V Th, To, Tn, Tp, Tb, Tm; + Tb = VMUL(LDK(KP707106781), VSUB(T5, Ta)); + Th = VBYI(VSUB(Tb, Tg)); + To = VBYI(VADD(Tg, Tb)); + Tm = VMUL(LDK(KP707106781), VADD(T5, Ta)); + Tn = VSUB(Tl, Tm); + Tp = VADD(Tl, Tm); + ST(&(x[WS(rs, 3)]), VADD(Th, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VSUB(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tn, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1bv_8"), twinstr, &GENUS, {33, 16, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_8) (planner *p) { + X(kdft_dit_register) (p, t1bv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_9.c new file mode 100644 index 000000000..b6cf18c30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1bv_9.c @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:58 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1bv_9 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 54 FP additions, 54 FP multiplications, + * (or, 20 additions, 20 multiplications, 34 fused multiply/add), + * 50 stack variables, 19 constants, and 18 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP879385241, +0.879385241571816768108218554649462939872416269); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP666666666, +0.666666666666666666666666666666666666666666667); + DVK(KP673648177, +0.673648177666930348851716626769314796000375677); + DVK(KP898197570, +0.898197570222573798468955502359086394667167570); + DVK(KP826351822, +0.826351822333069651148283373230685203999624323); + DVK(KP420276625, +0.420276625461206169731530603237061658838781920); + DVK(KP907603734, +0.907603734547952313649323976213898122064543220); + DVK(KP347296355, +0.347296355333860697703433253538629592000751354); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP152703644, +0.152703644666139302296566746461370407999248646); + DVK(KP968908795, +0.968908795874236621082202410917456709164223497); + DVK(KP203604859, +0.203604859554852403062088995281827210665664861); + DVK(KP726681596, +0.726681596905677465811651808188092531873167623); + DVK(KP439692620, +0.439692620785908384054109277324731469936208134); + DVK(KP586256827, +0.586256827714544512072145703099641959914944179); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, Tx, TO, TP, Tf, Tp, Tk, Tl, Tq, Tu, TD, TC, TA, Tz; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + Tx = VSUB(T3, T5); + } + { + V T9, Tn, Tb, Td, Te, Th, Tj, To, T8, Tm; + T8 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T9 = BYTW(&(W[TWVL * 2]), T8); + Tm = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tn = BYTW(&(W[0]), Tm); + { + V Ta, Tc, Tg, Ti; + Ta = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tb = BYTW(&(W[TWVL * 8]), Ta); + Tc = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 14]), Tc); + Te = VADD(Tb, Td); + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 6]), Tg); + Ti = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 12]), Ti); + To = VADD(Th, Tj); + } + TO = VADD(Tn, To); + TP = VADD(T9, Te); + Tf = VFNMS(LDK(KP500000000), Te, T9); + Tp = VFNMS(LDK(KP500000000), To, Tn); + Tk = VSUB(Th, Tj); + Tl = VSUB(Td, Tb); + Tq = VFNMS(LDK(KP586256827), Tp, Tl); + Tu = VFNMS(LDK(KP439692620), Tk, Tf); + TD = VFNMS(LDK(KP726681596), Tk, Tp); + TC = VFMA(LDK(KP203604859), Tf, Tl); + TA = VFMA(LDK(KP968908795), Tp, Tk); + Tz = VFNMS(LDK(KP152703644), Tl, Tf); + } + { + V TS, TN, TQ, TR; + TS = VMUL(LDK(KP866025403), VSUB(TO, TP)); + TN = VADD(T1, T6); + TQ = VADD(TO, TP); + TR = VFNMS(LDK(KP500000000), TQ, TN); + ST(&(x[WS(rs, 3)]), VFMAI(TS, TR), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(TQ, TN), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFNMSI(TS, TR), ms, &(x[0])); + } + { + V Ts, Tw, TJ, TM, T7, TF, TL, Tr, Tv; + Tr = VFNMS(LDK(KP347296355), Tq, Tk); + Ts = VFNMS(LDK(KP907603734), Tr, Tf); + Tv = VFNMS(LDK(KP420276625), Tu, Tl); + Tw = VFNMS(LDK(KP826351822), Tv, Tp); + { + V TH, TI, TE, TB; + TH = VFNMS(LDK(KP898197570), TD, TC); + TI = VFMA(LDK(KP673648177), TA, Tz); + TJ = VFMA(LDK(KP666666666), TI, TH); + TM = VMUL(LDK(KP984807753), VFMA(LDK(KP879385241), Tx, TI)); + T7 = VFNMS(LDK(KP500000000), T6, T1); + TE = VFMA(LDK(KP898197570), TD, TC); + TB = VFNMS(LDK(KP673648177), TA, Tz); + TF = VFNMS(LDK(KP500000000), TE, TB); + TL = VFMA(LDK(KP852868531), TE, T7); + } + ST(&(x[WS(rs, 1)]), VFMAI(TM, TL), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VFNMSI(TM, TL), ms, &(x[0])); + { + V Tt, Ty, TG, TK; + Tt = VFNMS(LDK(KP939692620), Ts, T7); + Ty = VMUL(LDK(KP984807753), VFNMS(LDK(KP879385241), Tx, Tw)); + ST(&(x[WS(rs, 7)]), VFNMSI(Ty, Tt), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(Ty, Tt), ms, &(x[0])); + TG = VFMA(LDK(KP852868531), TF, T7); + TK = VMUL(LDK(KP866025403), VFNMS(LDK(KP852868531), TJ, Tx)); + ST(&(x[WS(rs, 4)]), VFMAI(TK, TG), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VFNMSI(TK, TG), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1bv_9"), twinstr, &GENUS, {20, 20, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_9) (planner *p) { + X(kdft_dit_register) (p, t1bv_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1bv_9 -include dft/simd/t1b.h -sign 1 */ + +/* + * This function contains 54 FP additions, 42 FP multiplications, + * (or, 38 additions, 26 multiplications, 16 fused multiply/add), + * 38 stack variables, 14 constants, and 18 memory accesses + */ +#include "dft/simd/t1b.h" + +static void t1bv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP296198132, +0.296198132726023843175338011893050938967728390); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP173648177, +0.173648177666930348851716626769314796000375677); + DVK(KP556670399, +0.556670399226419366452912952047023132968291906); + DVK(KP766044443, +0.766044443118978035202392650555416673935832457); + DVK(KP642787609, +0.642787609686539326322643409907263432907559884); + DVK(KP663413948, +0.663413948168938396205421319635891297216863310); + DVK(KP150383733, +0.150383733180435296639271897612501926072238258); + DVK(KP342020143, +0.342020143325668733044099614682259580763083368); + DVK(KP813797681, +0.813797681349373692844693217248393223289101568); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, Tu, Tg, Tf, TD, Tq, Tp, TE; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + Tu = VMUL(LDK(KP866025403), VSUB(T3, T5)); + } + { + V T9, Td, Tb, T8, Tc, Ta, Te; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[0]), T8); + Tc = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 12]), Tc); + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 6]), Ta); + Tg = VSUB(Tb, Td); + Te = VADD(Tb, Td); + Tf = VFNMS(LDK(KP500000000), Te, T9); + TD = VADD(T9, Te); + } + { + V Tj, Tn, Tl, Ti, Tm, Tk, To; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 2]), Ti); + Tm = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 14]), Tm); + Tk = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tl = BYTW(&(W[TWVL * 8]), Tk); + Tq = VSUB(Tl, Tn); + To = VADD(Tl, Tn); + Tp = VFNMS(LDK(KP500000000), To, Tj); + TE = VADD(Tj, To); + } + { + V TF, TG, TH, TI; + TF = VBYI(VMUL(LDK(KP866025403), VSUB(TD, TE))); + TG = VADD(T1, T6); + TH = VADD(TD, TE); + TI = VFNMS(LDK(KP500000000), TH, TG); + ST(&(x[WS(rs, 3)]), VADD(TF, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(TG, TH), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VSUB(TI, TF), ms, &(x[0])); + } + { + V TC, Tv, Tw, Tx, Th, Tr, Ts, T7, TB; + TC = VBYI(VSUB(VFMA(LDK(KP984807753), Tf, VFMA(LDK(KP813797681), Tq, VFNMS(LDK(KP150383733), Tg, VMUL(LDK(KP342020143), Tp)))), Tu)); + Tv = VFMA(LDK(KP663413948), Tg, VMUL(LDK(KP642787609), Tf)); + Tw = VFMA(LDK(KP150383733), Tq, VMUL(LDK(KP984807753), Tp)); + Tx = VADD(Tv, Tw); + Th = VFNMS(LDK(KP556670399), Tg, VMUL(LDK(KP766044443), Tf)); + Tr = VFNMS(LDK(KP852868531), Tq, VMUL(LDK(KP173648177), Tp)); + Ts = VADD(Th, Tr); + T7 = VFNMS(LDK(KP500000000), T6, T1); + TB = VFMA(LDK(KP852868531), Tg, VFMA(LDK(KP173648177), Tf, VFMA(LDK(KP296198132), Tq, VFNMS(LDK(KP939692620), Tp, T7)))); + ST(&(x[WS(rs, 7)]), VSUB(TB, TC), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(TB, TC), ms, &(x[0])); + { + V Tt, Ty, Tz, TA; + Tt = VADD(T7, Ts); + Ty = VBYI(VADD(Tu, Tx)); + ST(&(x[WS(rs, 8)]), VSUB(Tt, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tt, Ty), ms, &(x[WS(rs, 1)])); + Tz = VBYI(VADD(Tu, VFNMS(LDK(KP500000000), Tx, VMUL(LDK(KP866025403), VSUB(Th, Tr))))); + TA = VFMA(LDK(KP866025403), VSUB(Tw, Tv), VFNMS(LDK(KP500000000), Ts, T7)); + ST(&(x[WS(rs, 4)]), VADD(Tz, TA), ms, &(x[0])); + ST(&(x[WS(rs, 5)]), VSUB(TA, Tz), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1bv_9"), twinstr, &GENUS, {38, 26, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1bv_9) (planner *p) { + X(kdft_dit_register) (p, t1bv_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_10.c new file mode 100644 index 000000000..3a95e85f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_10.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1fuv_10 -include dft/simd/t1fu.h */ + +/* + * This function contains 51 FP additions, 40 FP multiplications, + * (or, 33 additions, 22 multiplications, 18 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V T4, TA, Tk, Tp, Tq, TE, TF, TG, T9, Te, Tf, TB, TC, TD, T1; + V T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T4 = VSUB(T1, T3); + TA = VADD(T1, T3); + { + V Th, To, Tj, Tm; + { + V Tg, Tn, Ti, Tl; + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 6]), Tg); + Tn = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + To = BYTWJ(&(W[0]), Tn); + Ti = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 16]), Ti); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 10]), Tl); + } + Tk = VSUB(Th, Tj); + Tp = VSUB(Tm, To); + Tq = VADD(Tk, Tp); + TE = VADD(Th, Tj); + TF = VADD(Tm, To); + TG = VADD(TE, TF); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 12]), T7); + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 14]), Ta); + } + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + TB = VADD(T6, T8); + TC = VADD(Tb, Td); + TD = VADD(TB, TC); + } + { + V Tt, Tr, Ts, Tx, Tz, Tv, Tw, Ty, Tu; + Tt = VSUB(Tf, Tq); + Tr = VADD(Tf, Tq); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tv = VSUB(T9, Te); + Tw = VSUB(Tk, Tp); + Tx = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tv)); + Tz = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tv, Tw)); + ST(&(x[WS(rs, 5)]), VADD(T4, Tr), ms, &(x[WS(rs, 1)])); + Ty = VFNMS(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFNMSI(Tz, Ty), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFNMSI(Tx, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TJ, TH, TI, TN, TP, TL, TM, TO, TK; + TJ = VSUB(TD, TG); + TH = VADD(TD, TG); + TI = VFNMS(LDK(KP250000000), TH, TA); + TL = VSUB(TE, TF); + TM = VSUB(TB, TC); + TN = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TM, TL)); + TP = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TL, TM)); + ST(&(x[0]), VADD(TA, TH), ms, &(x[0])); + TO = VFMA(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 4)]), VFMAI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFNMSI(TP, TO), ms, &(x[0])); + TK = VFNMS(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFNMSI(TN, TK), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1fuv_10"), twinstr, &GENUS, {33, 22, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_10) (planner *p) { + X(kdft_dit_register) (p, t1fuv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1fuv_10 -include dft/simd/t1fu.h */ + +/* + * This function contains 51 FP additions, 30 FP multiplications, + * (or, 45 additions, 24 multiplications, 6 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V Tr, TH, Tg, Tl, Tm, TA, TB, TJ, T5, Ta, Tb, TD, TE, TI, To; + V Tq, Tp; + To = LD(&(x[0]), ms, &(x[0])); + Tp = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tq = BYTWJ(&(W[TWVL * 8]), Tp); + Tr = VSUB(To, Tq); + TH = VADD(To, Tq); + { + V Td, Tk, Tf, Ti; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 6]), Tc); + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[0]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTWJ(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 10]), Th); + } + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VADD(Tg, Tl); + TA = VADD(Td, Tf); + TB = VADD(Ti, Tk); + TJ = VADD(TA, TB); + } + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTWJ(&(W[TWVL * 2]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTWJ(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 14]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VADD(T5, Ta); + TD = VADD(T2, T4); + TE = VADD(T7, T9); + TI = VADD(TD, TE); + } + { + V Tn, Ts, Tt, Tx, Tz, Tv, Tw, Ty, Tu; + Tn = VMUL(LDK(KP559016994), VSUB(Tb, Tm)); + Ts = VADD(Tb, Tm); + Tt = VFNMS(LDK(KP250000000), Ts, Tr); + Tv = VSUB(T5, Ta); + Tw = VSUB(Tg, Tl); + Tx = VBYI(VFMA(LDK(KP951056516), Tv, VMUL(LDK(KP587785252), Tw))); + Tz = VBYI(VFNMS(LDK(KP587785252), Tv, VMUL(LDK(KP951056516), Tw))); + ST(&(x[WS(rs, 5)]), VADD(Tr, Ts), ms, &(x[WS(rs, 1)])); + Ty = VSUB(Tt, Tn); + ST(&(x[WS(rs, 3)]), VSUB(Ty, Tz), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VADD(Tn, Tt); + ST(&(x[WS(rs, 1)]), VSUB(Tu, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TM, TK, TL, TG, TO, TC, TF, TP, TN; + TM = VMUL(LDK(KP559016994), VSUB(TI, TJ)); + TK = VADD(TI, TJ); + TL = VFNMS(LDK(KP250000000), TK, TH); + TC = VSUB(TA, TB); + TF = VSUB(TD, TE); + TG = VBYI(VFNMS(LDK(KP587785252), TF, VMUL(LDK(KP951056516), TC))); + TO = VBYI(VFMA(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TC))); + ST(&(x[0]), VADD(TH, TK), ms, &(x[0])); + TP = VADD(TM, TL); + ST(&(x[WS(rs, 4)]), VADD(TO, TP), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VSUB(TP, TO), ms, &(x[0])); + TN = VSUB(TL, TM); + ST(&(x[WS(rs, 2)]), VADD(TG, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TN, TG), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1fuv_10"), twinstr, &GENUS, {45, 24, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_10) (planner *p) { + X(kdft_dit_register) (p, t1fuv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_2.c new file mode 100644 index 000000000..4819035dd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1fuv_2 -include dft/simd/t1fu.h */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1fuv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_2) (planner *p) { + X(kdft_dit_register) (p, t1fuv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1fuv_2 -include dft/simd/t1fu.h */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1fuv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_2) (planner *p) { + X(kdft_dit_register) (p, t1fuv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_3.c new file mode 100644 index 000000000..457a2f4cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_3.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1fuv_3 -include dft/simd/t1fu.h */ + +/* + * This function contains 8 FP additions, 8 FP multiplications, + * (or, 5 additions, 5 multiplications, 3 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T1, T3, T5, T6, T2, T4, T7, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 2]), T4); + T6 = VADD(T3, T5); + ST(&(x[0]), VADD(T1, T6), ms, &(x[0])); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T8 = VMUL(LDK(KP866025403), VSUB(T5, T3)); + ST(&(x[WS(rs, 2)]), VFNMSI(T8, T7), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VFMAI(T8, T7), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1fuv_3"), twinstr, &GENUS, {5, 5, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_3) (planner *p) { + X(kdft_dit_register) (p, t1fuv_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1fuv_3 -include dft/simd/t1fu.h */ + +/* + * This function contains 8 FP additions, 6 FP multiplications, + * (or, 7 additions, 5 multiplications, 1 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T1, T3, T5, T6, T2, T4, T7, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 2]), T4); + T6 = VADD(T3, T5); + ST(&(x[0]), VADD(T1, T6), ms, &(x[0])); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T8 = VBYI(VMUL(LDK(KP866025403), VSUB(T5, T3))); + ST(&(x[WS(rs, 2)]), VSUB(T7, T8), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T7, T8), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1fuv_3"), twinstr, &GENUS, {7, 5, 1, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_3) (planner *p) { + X(kdft_dit_register) (p, t1fuv_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_4.c new file mode 100644 index 000000000..740e008e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_4.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1fuv_4 -include dft/simd/t1fu.h */ + +/* + * This function contains 11 FP additions, 8 FP multiplications, + * (or, 9 additions, 6 multiplications, 2 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VSUB(T6, T8); + ST(&(x[WS(rs, 1)]), VFNMSI(T9, T4), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T9, T4), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1fuv_4"), twinstr, &GENUS, {9, 6, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_4) (planner *p) { + X(kdft_dit_register) (p, t1fuv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1fuv_4 -include dft/simd/t1fu.h */ + +/* + * This function contains 11 FP additions, 6 FP multiplications, + * (or, 11 additions, 6 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VBYI(VSUB(T6, T8)); + ST(&(x[WS(rs, 1)]), VSUB(T4, T9), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4, T9), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1fuv_4"), twinstr, &GENUS, {11, 6, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_4) (planner *p) { + X(kdft_dit_register) (p, t1fuv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_5.c new file mode 100644 index 000000000..a8a6f1c4d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_5.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1fuv_5 -include dft/simd/t1fu.h */ + +/* + * This function contains 20 FP additions, 19 FP multiplications, + * (or, 11 additions, 10 multiplications, 9 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, Tg, Th, T6, Tb, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, Ta, T5, T8; + { + V T2, T9, T4, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T9 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 4]), T9); + T4 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 6]), T4); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + } + Tg = VSUB(T3, T5); + Th = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tb = VADD(T8, Ta); + Tc = VADD(T6, Tb); + } + ST(&(x[0]), VADD(T1, Tc), ms, &(x[0])); + { + V Ti, Tk, Tf, Tj, Td, Te; + Ti = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Th, Tg)); + Tk = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tg, Th)); + Td = VFNMS(LDK(KP250000000), Tc, T1); + Te = VSUB(T6, Tb); + Tf = VFMA(LDK(KP559016994), Te, Td); + Tj = VFNMS(LDK(KP559016994), Te, Td); + ST(&(x[WS(rs, 1)]), VFNMSI(Ti, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tk, Tj), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1fuv_5"), twinstr, &GENUS, {11, 10, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_5) (planner *p) { + X(kdft_dit_register) (p, t1fuv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1fuv_5 -include dft/simd/t1fu.h */ + +/* + * This function contains 20 FP additions, 14 FP multiplications, + * (or, 17 additions, 11 multiplications, 3 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V Tc, Tg, Th, T5, Ta, Td; + Tc = LD(&(x[0]), ms, &(x[0])); + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = BYTWJ(&(W[TWVL * 6]), T3); + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 2]), T6); + } + Tg = VSUB(T2, T4); + Th = VSUB(T7, T9); + T5 = VADD(T2, T4); + Ta = VADD(T7, T9); + Td = VADD(T5, Ta); + } + ST(&(x[0]), VADD(Tc, Td), ms, &(x[0])); + { + V Ti, Tj, Tf, Tk, Tb, Te; + Ti = VBYI(VFMA(LDK(KP951056516), Tg, VMUL(LDK(KP587785252), Th))); + Tj = VBYI(VFNMS(LDK(KP587785252), Tg, VMUL(LDK(KP951056516), Th))); + Tb = VMUL(LDK(KP559016994), VSUB(T5, Ta)); + Te = VFNMS(LDK(KP250000000), Td, Tc); + Tf = VADD(Tb, Te); + Tk = VSUB(Te, Tb); + ST(&(x[WS(rs, 1)]), VSUB(Tf, Ti), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tj, Tk), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1fuv_5"), twinstr, &GENUS, {17, 11, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_5) (planner *p) { + X(kdft_dit_register) (p, t1fuv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_6.c new file mode 100644 index 000000000..b6a8c01ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_6.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1fuv_6 -include dft/simd/t1fu.h */ + +/* + * This function contains 23 FP additions, 18 FP multiplications, + * (or, 17 additions, 12 multiplications, 6 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V T4, Ti, Te, Tk, T9, Tj, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = VSUB(T1, T3); + Ti = VADD(T1, T3); + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[0]), Tc); + Te = VSUB(Tb, Td); + Tk = VADD(Tb, Td); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tj = VADD(T6, T8); + } + { + V Th, Tf, Tg, Tn, Tl, Tm; + Th = VMUL(LDK(KP866025403), VSUB(Te, T9)); + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP500000000), Tf, T4); + ST(&(x[WS(rs, 3)]), VADD(T4, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Th, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Th, Tg), ms, &(x[WS(rs, 1)])); + Tn = VMUL(LDK(KP866025403), VSUB(Tk, Tj)); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(Tn, Tm), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFNMSI(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1fuv_6"), twinstr, &GENUS, {17, 12, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_6) (planner *p) { + X(kdft_dit_register) (p, t1fuv_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1fuv_6 -include dft/simd/t1fu.h */ + +/* + * This function contains 23 FP additions, 14 FP multiplications, + * (or, 21 additions, 12 multiplications, 2 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V T4, Ti, Te, Tk, T9, Tj, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = VSUB(T1, T3); + Ti = VADD(T1, T3); + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[0]), Tc); + Te = VSUB(Tb, Td); + Tk = VADD(Tb, Td); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tj = VADD(T6, T8); + } + { + V Th, Tf, Tg, Tn, Tl, Tm; + Th = VBYI(VMUL(LDK(KP866025403), VSUB(Te, T9))); + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP500000000), Tf, T4); + ST(&(x[WS(rs, 3)]), VADD(T4, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tg, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tg, Th), ms, &(x[WS(rs, 1)])); + Tn = VBYI(VMUL(LDK(KP866025403), VSUB(Tk, Tj))); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(Tm, Tn), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VSUB(Tm, Tn), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1fuv_6"), twinstr, &GENUS, {21, 12, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_6) (planner *p) { + X(kdft_dit_register) (p, t1fuv_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_7.c new file mode 100644 index 000000000..8c1621af7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_7.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:25 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1fuv_7 -include dft/simd/t1fu.h */ + +/* + * This function contains 36 FP additions, 36 FP multiplications, + * (or, 15 additions, 15 multiplications, 21 fused multiply/add), + * 30 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V T1, Tk, Tm, Tl, T6, Tg, Tb, Th, Tu, Tp; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, Tf, Td, Ta, T8; + { + V T2, T4, Te, Tc, T9, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + Te = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tf = BYTWJ(&(W[TWVL * 6]), Te); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + T9 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 8]), T9); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + } + Tk = VSUB(T5, T3); + Tm = VSUB(Ta, T8); + Tl = VSUB(Tf, Td); + T6 = VADD(T3, T5); + Tg = VADD(Td, Tf); + Tb = VADD(T8, Ta); + Th = VFNMS(LDK(KP356895867), T6, Tg); + Tu = VFNMS(LDK(KP356895867), Tg, Tb); + Tp = VFNMS(LDK(KP356895867), Tb, T6); + } + ST(&(x[0]), VADD(T1, VADD(T6, VADD(Tb, Tg))), ms, &(x[0])); + { + V Tw, Ty, Tv, Tx; + Tv = VFNMS(LDK(KP692021471), Tu, T6); + Tw = VFNMS(LDK(KP900968867), Tv, T1); + Tx = VFNMS(LDK(KP554958132), Tk, Tm); + Ty = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tx, Tl)); + ST(&(x[WS(rs, 4)]), VFNMSI(Ty, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(Ty, Tw), ms, &(x[WS(rs, 1)])); + } + { + V Tj, To, Ti, Tn; + Ti = VFNMS(LDK(KP692021471), Th, Tb); + Tj = VFNMS(LDK(KP900968867), Ti, T1); + Tn = VFMA(LDK(KP554958132), Tm, Tl); + To = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tn, Tk)); + ST(&(x[WS(rs, 5)]), VFNMSI(To, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(To, Tj), ms, &(x[0])); + } + { + V Tr, Tt, Tq, Ts; + Tq = VFNMS(LDK(KP692021471), Tp, Tg); + Tr = VFNMS(LDK(KP900968867), Tq, T1); + Ts = VFMA(LDK(KP554958132), Tl, Tk); + Tt = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), Ts, Tm)); + ST(&(x[WS(rs, 6)]), VFNMSI(Tt, Tr), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VFMAI(Tt, Tr), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1fuv_7"), twinstr, &GENUS, {15, 15, 21, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_7) (planner *p) { + X(kdft_dit_register) (p, t1fuv_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1fuv_7 -include dft/simd/t1fu.h */ + +/* + * This function contains 36 FP additions, 30 FP multiplications, + * (or, 24 additions, 18 multiplications, 12 fused multiply/add), + * 21 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V T1, Tg, Tj, T6, Ti, Tb, Tk, Tp, To; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V Td, Tf, Tc, Te; + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tf = BYTWJ(&(W[TWVL * 6]), Te); + Tg = VADD(Td, Tf); + Tj = VSUB(Tf, Td); + } + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + Ti = VSUB(T5, T3); + } + { + V T8, Ta, T7, T9; + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + T9 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 8]), T9); + Tb = VADD(T8, Ta); + Tk = VSUB(Ta, T8); + } + ST(&(x[0]), VADD(T1, VADD(T6, VADD(Tb, Tg))), ms, &(x[0])); + Tp = VBYI(VFMA(LDK(KP433883739), Ti, VFNMS(LDK(KP781831482), Tk, VMUL(LDK(KP974927912), Tj)))); + To = VFMA(LDK(KP623489801), Tb, VFNMS(LDK(KP222520933), Tg, VFNMS(LDK(KP900968867), T6, T1))); + ST(&(x[WS(rs, 4)]), VSUB(To, Tp), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + { + V Tl, Th, Tn, Tm; + Tl = VBYI(VFNMS(LDK(KP781831482), Tj, VFNMS(LDK(KP433883739), Tk, VMUL(LDK(KP974927912), Ti)))); + Th = VFMA(LDK(KP623489801), Tg, VFNMS(LDK(KP900968867), Tb, VFNMS(LDK(KP222520933), T6, T1))); + ST(&(x[WS(rs, 5)]), VSUB(Th, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(Th, Tl), ms, &(x[0])); + Tn = VBYI(VFMA(LDK(KP781831482), Ti, VFMA(LDK(KP974927912), Tk, VMUL(LDK(KP433883739), Tj)))); + Tm = VFMA(LDK(KP623489801), T6, VFNMS(LDK(KP900968867), Tg, VFNMS(LDK(KP222520933), Tb, T1))); + ST(&(x[WS(rs, 6)]), VSUB(Tm, Tn), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tm, Tn), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1fuv_7"), twinstr, &GENUS, {24, 18, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_7) (planner *p) { + X(kdft_dit_register) (p, t1fuv_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_8.c new file mode 100644 index 000000000..c9ffb5217 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_8.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1fuv_8 -include dft/simd/t1fu.h */ + +/* + * This function contains 33 FP additions, 24 FP multiplications, + * (or, 23 additions, 14 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tl, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + Tj = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 10]), Tj); + Tl = VSUB(Ti, Tk); + Tr = VADD(Ti, Tk); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTWJ(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VADD(Tq, Tr); + Tv = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[0]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VSUB(Tq, Tr); + Tx = VSUB(Tu, Tt); + ST(&(x[WS(rs, 6)]), VFNMSI(Tx, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tx, Tw), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Tm; + Tf = VADD(T9, Te); + Tg = VFMA(LDK(KP707106781), Tf, T4); + To = VFNMS(LDK(KP707106781), Tf, T4); + Tm = VSUB(Te, T9); + Tn = VFNMS(LDK(KP707106781), Tm, Tl); + Tp = VFMA(LDK(KP707106781), Tm, Tl); + ST(&(x[WS(rs, 1)]), VFNMSI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Tp, To), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1fuv_8"), twinstr, &GENUS, {23, 14, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_8) (planner *p) { + X(kdft_dit_register) (p, t1fuv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1fuv_8 -include dft/simd/t1fu.h */ + +/* + * This function contains 33 FP additions, 16 FP multiplications, + * (or, 33 additions, 16 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tm, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Tj, Tl, Ti, Tk; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 2]), Ti); + Tk = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 10]), Tk); + Tm = VSUB(Tj, Tl); + Tr = VADD(Tj, Tl); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTWJ(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VADD(Tq, Tr); + Tv = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[0]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VSUB(Tq, Tr); + Tx = VBYI(VSUB(Tu, Tt)); + ST(&(x[WS(rs, 6)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tw, Tx), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Th; + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VADD(T4, Tf); + To = VSUB(T4, Tf); + Th = VMUL(LDK(KP707106781), VSUB(Te, T9)); + Tn = VBYI(VSUB(Th, Tm)); + Tp = VBYI(VADD(Tm, Th)); + ST(&(x[WS(rs, 7)]), VSUB(Tg, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tg, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(To, Tp), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1fuv_8"), twinstr, &GENUS, {33, 16, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_8) (planner *p) { + X(kdft_dit_register) (p, t1fuv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_9.c new file mode 100644 index 000000000..42989407e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fuv_9.c @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1fuv_9 -include dft/simd/t1fu.h */ + +/* + * This function contains 54 FP additions, 54 FP multiplications, + * (or, 20 additions, 20 multiplications, 34 fused multiply/add), + * 50 stack variables, 19 constants, and 18 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP666666666, +0.666666666666666666666666666666666666666666667); + DVK(KP879385241, +0.879385241571816768108218554649462939872416269); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP898197570, +0.898197570222573798468955502359086394667167570); + DVK(KP673648177, +0.673648177666930348851716626769314796000375677); + DVK(KP826351822, +0.826351822333069651148283373230685203999624323); + DVK(KP420276625, +0.420276625461206169731530603237061658838781920); + DVK(KP907603734, +0.907603734547952313649323976213898122064543220); + DVK(KP347296355, +0.347296355333860697703433253538629592000751354); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP203604859, +0.203604859554852403062088995281827210665664861); + DVK(KP726681596, +0.726681596905677465811651808188092531873167623); + DVK(KP152703644, +0.152703644666139302296566746461370407999248646); + DVK(KP968908795, +0.968908795874236621082202410917456709164223497); + DVK(KP439692620, +0.439692620785908384054109277324731469936208134); + DVK(KP586256827, +0.586256827714544512072145703099641959914944179); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, TD, Tf, Tn, Ts, Tv, Tt, Tu, Tw, TA, TK, TJ, TG, TF; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + TD = VSUB(T5, T3); + } + { + V T9, Th, Tb, Td, Te, Tj, Tl, Tm, T8, Tg; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[0]), T8); + Tg = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 2]), Tg); + { + V Ta, Tc, Ti, Tk; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 12]), Tc); + Te = VADD(Tb, Td); + Ti = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 8]), Ti); + Tk = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 14]), Tk); + Tm = VADD(Tj, Tl); + } + Tf = VADD(T9, Te); + Tn = VADD(Th, Tm); + Ts = VFNMS(LDK(KP500000000), Tm, Th); + Tv = VFNMS(LDK(KP500000000), Te, T9); + Tt = VSUB(Tb, Td); + Tu = VSUB(Tl, Tj); + Tw = VFNMS(LDK(KP586256827), Tv, Tu); + TA = VFNMS(LDK(KP439692620), Tt, Ts); + TK = VFMA(LDK(KP968908795), Tv, Tt); + TJ = VFNMS(LDK(KP152703644), Tu, Ts); + TG = VFNMS(LDK(KP726681596), Tt, Tv); + TF = VFMA(LDK(KP203604859), Ts, Tu); + } + { + V Tq, T7, To, Tp; + Tq = VMUL(LDK(KP866025403), VSUB(Tn, Tf)); + T7 = VADD(T1, T6); + To = VADD(Tf, Tn); + Tp = VFNMS(LDK(KP500000000), To, T7); + ST(&(x[0]), VADD(T7, To), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(Tq, Tp), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VFNMSI(Tq, Tp), ms, &(x[0])); + } + { + V Ty, TC, TM, TR, Tr, TI, TO, Tx, TB; + Tx = VFNMS(LDK(KP347296355), Tw, Tt); + Ty = VFNMS(LDK(KP907603734), Tx, Ts); + TB = VFNMS(LDK(KP420276625), TA, Tu); + TC = VFNMS(LDK(KP826351822), TB, Tv); + { + V TL, TQ, TN, TH; + TL = VFMA(LDK(KP673648177), TK, TJ); + TQ = VFNMS(LDK(KP898197570), TG, TF); + TM = VMUL(LDK(KP984807753), VFNMS(LDK(KP879385241), TD, TL)); + TR = VFMA(LDK(KP666666666), TL, TQ); + Tr = VFNMS(LDK(KP500000000), T6, T1); + TN = VFNMS(LDK(KP673648177), TK, TJ); + TH = VFMA(LDK(KP898197570), TG, TF); + TI = VFMA(LDK(KP852868531), TH, Tr); + TO = VFNMS(LDK(KP500000000), TH, TN); + } + ST(&(x[WS(rs, 1)]), VFNMSI(TM, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VFMAI(TM, TI), ms, &(x[0])); + { + V Tz, TE, TP, TS; + Tz = VFNMS(LDK(KP939692620), Ty, Tr); + TE = VMUL(LDK(KP984807753), VFMA(LDK(KP879385241), TD, TC)); + ST(&(x[WS(rs, 2)]), VFNMSI(TE, Tz), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VFMAI(TE, Tz), ms, &(x[WS(rs, 1)])); + TP = VFMA(LDK(KP852868531), TO, Tr); + TS = VMUL(LDK(KP866025403), VFMA(LDK(KP852868531), TR, TD)); + ST(&(x[WS(rs, 5)]), VFNMSI(TS, TP), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(TS, TP), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1fuv_9"), twinstr, &GENUS, {20, 20, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_9) (planner *p) { + X(kdft_dit_register) (p, t1fuv_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1fuv_9 -include dft/simd/t1fu.h */ + +/* + * This function contains 54 FP additions, 42 FP multiplications, + * (or, 38 additions, 26 multiplications, 16 fused multiply/add), + * 38 stack variables, 14 constants, and 18 memory accesses + */ +#include "dft/simd/t1fu.h" + +static void t1fuv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP296198132, +0.296198132726023843175338011893050938967728390); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP173648177, +0.173648177666930348851716626769314796000375677); + DVK(KP556670399, +0.556670399226419366452912952047023132968291906); + DVK(KP766044443, +0.766044443118978035202392650555416673935832457); + DVK(KP642787609, +0.642787609686539326322643409907263432907559884); + DVK(KP663413948, +0.663413948168938396205421319635891297216863310); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP150383733, +0.150383733180435296639271897612501926072238258); + DVK(KP342020143, +0.342020143325668733044099614682259580763083368); + DVK(KP813797681, +0.813797681349373692844693217248393223289101568); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, TA, Tt, Tf, Ts, Tw, Tn, Tv; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + TA = VMUL(LDK(KP866025403), VSUB(T5, T3)); + } + { + V T9, Td, Tb, T8, Tc, Ta, Te; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[0]), T8); + Tc = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 12]), Tc); + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tt = VSUB(Td, Tb); + Te = VADD(Tb, Td); + Tf = VADD(T9, Te); + Ts = VFNMS(LDK(KP500000000), Te, T9); + } + { + V Th, Tl, Tj, Tg, Tk, Ti, Tm; + Tg = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 2]), Tg); + Tk = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 14]), Tk); + Ti = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 8]), Ti); + Tw = VSUB(Tl, Tj); + Tm = VADD(Tj, Tl); + Tn = VADD(Th, Tm); + Tv = VFNMS(LDK(KP500000000), Tm, Th); + } + { + V Tq, T7, To, Tp; + Tq = VBYI(VMUL(LDK(KP866025403), VSUB(Tn, Tf))); + T7 = VADD(T1, T6); + To = VADD(Tf, Tn); + Tp = VFNMS(LDK(KP500000000), To, T7); + ST(&(x[0]), VADD(T7, To), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(Tp, Tq), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(Tp, Tq), ms, &(x[0])); + } + { + V TI, TB, TC, TD, Tu, Tx, Ty, Tr, TH; + TI = VBYI(VSUB(VFNMS(LDK(KP342020143), Tv, VFNMS(LDK(KP150383733), Tt, VFNMS(LDK(KP984807753), Ts, VMUL(LDK(KP813797681), Tw)))), TA)); + TB = VFNMS(LDK(KP642787609), Ts, VMUL(LDK(KP663413948), Tt)); + TC = VFNMS(LDK(KP984807753), Tv, VMUL(LDK(KP150383733), Tw)); + TD = VADD(TB, TC); + Tu = VFMA(LDK(KP766044443), Ts, VMUL(LDK(KP556670399), Tt)); + Tx = VFMA(LDK(KP173648177), Tv, VMUL(LDK(KP852868531), Tw)); + Ty = VADD(Tu, Tx); + Tr = VFNMS(LDK(KP500000000), T6, T1); + TH = VFMA(LDK(KP173648177), Ts, VFNMS(LDK(KP296198132), Tw, VFNMS(LDK(KP939692620), Tv, VFNMS(LDK(KP852868531), Tt, Tr)))); + ST(&(x[WS(rs, 7)]), VSUB(TH, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(TH, TI), ms, &(x[0])); + { + V Tz, TE, TF, TG; + Tz = VADD(Tr, Ty); + TE = VBYI(VADD(TA, TD)); + ST(&(x[WS(rs, 8)]), VSUB(Tz, TE), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(TE, Tz), ms, &(x[WS(rs, 1)])); + TF = VFMA(LDK(KP866025403), VSUB(TB, TC), VFNMS(LDK(KP500000000), Ty, Tr)); + TG = VBYI(VADD(TA, VFNMS(LDK(KP500000000), TD, VMUL(LDK(KP866025403), VSUB(Tx, Tu))))); + ST(&(x[WS(rs, 5)]), VSUB(TF, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(TF, TG), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1fuv_9"), twinstr, &GENUS, {38, 26, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fuv_9) (planner *p) { + X(kdft_dit_register) (p, t1fuv_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_10.c new file mode 100644 index 000000000..8ab77c595 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_10.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:27 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1fv_10 -include dft/simd/t1f.h */ + +/* + * This function contains 51 FP additions, 40 FP multiplications, + * (or, 33 additions, 22 multiplications, 18 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V T4, TA, Tk, Tp, Tq, TE, TF, TG, T9, Te, Tf, TB, TC, TD, T1; + V T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T4 = VSUB(T1, T3); + TA = VADD(T1, T3); + { + V Th, To, Tj, Tm; + { + V Tg, Tn, Ti, Tl; + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 6]), Tg); + Tn = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + To = BYTWJ(&(W[0]), Tn); + Ti = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 16]), Ti); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 10]), Tl); + } + Tk = VSUB(Th, Tj); + Tp = VSUB(Tm, To); + Tq = VADD(Tk, Tp); + TE = VADD(Th, Tj); + TF = VADD(Tm, To); + TG = VADD(TE, TF); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 12]), T7); + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 14]), Ta); + } + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + TB = VADD(T6, T8); + TC = VADD(Tb, Td); + TD = VADD(TB, TC); + } + { + V Tt, Tr, Ts, Tx, Tz, Tv, Tw, Ty, Tu; + Tt = VSUB(Tf, Tq); + Tr = VADD(Tf, Tq); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tv = VSUB(T9, Te); + Tw = VSUB(Tk, Tp); + Tx = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tv)); + Tz = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tv, Tw)); + ST(&(x[WS(rs, 5)]), VADD(T4, Tr), ms, &(x[WS(rs, 1)])); + Ty = VFNMS(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFNMSI(Tz, Ty), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFNMSI(Tx, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TJ, TH, TI, TN, TP, TL, TM, TO, TK; + TJ = VSUB(TD, TG); + TH = VADD(TD, TG); + TI = VFNMS(LDK(KP250000000), TH, TA); + TL = VSUB(TE, TF); + TM = VSUB(TB, TC); + TN = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TM, TL)); + TP = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TL, TM)); + ST(&(x[0]), VADD(TA, TH), ms, &(x[0])); + TO = VFMA(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 4)]), VFMAI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFNMSI(TP, TO), ms, &(x[0])); + TK = VFNMS(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFNMSI(TN, TK), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1fv_10"), twinstr, &GENUS, {33, 22, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_10) (planner *p) { + X(kdft_dit_register) (p, t1fv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t1fv_10 -include dft/simd/t1f.h */ + +/* + * This function contains 51 FP additions, 30 FP multiplications, + * (or, 45 additions, 24 multiplications, 6 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V Tr, TH, Tg, Tl, Tm, TA, TB, TJ, T5, Ta, Tb, TD, TE, TI, To; + V Tq, Tp; + To = LD(&(x[0]), ms, &(x[0])); + Tp = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tq = BYTWJ(&(W[TWVL * 8]), Tp); + Tr = VSUB(To, Tq); + TH = VADD(To, Tq); + { + V Td, Tk, Tf, Ti; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 6]), Tc); + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[0]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTWJ(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 10]), Th); + } + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VADD(Tg, Tl); + TA = VADD(Td, Tf); + TB = VADD(Ti, Tk); + TJ = VADD(TA, TB); + } + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTWJ(&(W[TWVL * 2]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTWJ(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 14]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VADD(T5, Ta); + TD = VADD(T2, T4); + TE = VADD(T7, T9); + TI = VADD(TD, TE); + } + { + V Tn, Ts, Tt, Tx, Tz, Tv, Tw, Ty, Tu; + Tn = VMUL(LDK(KP559016994), VSUB(Tb, Tm)); + Ts = VADD(Tb, Tm); + Tt = VFNMS(LDK(KP250000000), Ts, Tr); + Tv = VSUB(T5, Ta); + Tw = VSUB(Tg, Tl); + Tx = VBYI(VFMA(LDK(KP951056516), Tv, VMUL(LDK(KP587785252), Tw))); + Tz = VBYI(VFNMS(LDK(KP587785252), Tv, VMUL(LDK(KP951056516), Tw))); + ST(&(x[WS(rs, 5)]), VADD(Tr, Ts), ms, &(x[WS(rs, 1)])); + Ty = VSUB(Tt, Tn); + ST(&(x[WS(rs, 3)]), VSUB(Ty, Tz), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VADD(Tn, Tt); + ST(&(x[WS(rs, 1)]), VSUB(Tu, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TM, TK, TL, TG, TO, TC, TF, TP, TN; + TM = VMUL(LDK(KP559016994), VSUB(TI, TJ)); + TK = VADD(TI, TJ); + TL = VFNMS(LDK(KP250000000), TK, TH); + TC = VSUB(TA, TB); + TF = VSUB(TD, TE); + TG = VBYI(VFNMS(LDK(KP587785252), TF, VMUL(LDK(KP951056516), TC))); + TO = VBYI(VFMA(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TC))); + ST(&(x[0]), VADD(TH, TK), ms, &(x[0])); + TP = VADD(TM, TL); + ST(&(x[WS(rs, 4)]), VADD(TO, TP), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VSUB(TP, TO), ms, &(x[0])); + TN = VSUB(TL, TM); + ST(&(x[WS(rs, 2)]), VADD(TG, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TN, TG), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t1fv_10"), twinstr, &GENUS, {45, 24, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_10) (planner *p) { + X(kdft_dit_register) (p, t1fv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_12.c new file mode 100644 index 000000000..bf5d62930 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_12.c @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:28 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name t1fv_12 -include dft/simd/t1f.h */ + +/* + * This function contains 59 FP additions, 42 FP multiplications, + * (or, 41 additions, 24 multiplications, 18 fused multiply/add), + * 28 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_12(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 22)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(12, rs)) { + V T1, TC, T6, T7, Ty, Tq, Tz, TA, T9, TD, Te, Tf, Tu, Tl, Tv; + V Tw; + { + V T5, T3, T4, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 14]), T4); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + TC = VSUB(T5, T3); + T6 = VADD(T3, T5); + T7 = VFNMS(LDK(KP500000000), T6, T1); + } + { + V Tn, Tp, Tm, Tx, To; + Tm = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tn = BYTWJ(&(W[0]), Tm); + Tx = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Ty = BYTWJ(&(W[TWVL * 16]), Tx); + To = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tp = BYTWJ(&(W[TWVL * 8]), To); + Tq = VSUB(Tn, Tp); + Tz = VADD(Tn, Tp); + TA = VFNMS(LDK(KP500000000), Tz, Ty); + } + { + V Td, Tb, T8, Tc, Ta; + T8 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T9 = BYTWJ(&(W[TWVL * 10]), T8); + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 2]), Tc); + Ta = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 18]), Ta); + TD = VSUB(Td, Tb); + Te = VADD(Tb, Td); + Tf = VFNMS(LDK(KP500000000), Te, T9); + } + { + V Ti, Tk, Th, Tt, Tj; + Th = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Ti = BYTWJ(&(W[TWVL * 20]), Th); + Tt = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 4]), Tt); + Tj = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[TWVL * 12]), Tj); + Tl = VSUB(Ti, Tk); + Tv = VADD(Tk, Ti); + Tw = VFNMS(LDK(KP500000000), Tv, Tu); + } + { + V Ts, TG, TF, TH; + { + V Tg, Tr, TB, TE; + Tg = VSUB(T7, Tf); + Tr = VADD(Tl, Tq); + Ts = VFMA(LDK(KP866025403), Tr, Tg); + TG = VFNMS(LDK(KP866025403), Tr, Tg); + TB = VSUB(Tw, TA); + TE = VSUB(TC, TD); + TF = VFNMS(LDK(KP866025403), TE, TB); + TH = VFMA(LDK(KP866025403), TE, TB); + } + ST(&(x[WS(rs, 1)]), VFNMSI(TF, Ts), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(TH, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(TF, Ts), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(TH, TG), ms, &(x[WS(rs, 1)])); + } + { + V TS, TW, TV, TX; + { + V TQ, TR, TT, TU; + TQ = VADD(T1, T6); + TR = VADD(T9, Te); + TS = VSUB(TQ, TR); + TW = VADD(TQ, TR); + TT = VADD(Tu, Tv); + TU = VADD(Ty, Tz); + TV = VSUB(TT, TU); + TX = VADD(TT, TU); + } + ST(&(x[WS(rs, 9)]), VFNMSI(TV, TS), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(TW, TX), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(TV, TS), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(TW, TX), ms, &(x[0])); + } + { + V TK, TO, TN, TP; + { + V TI, TJ, TL, TM; + TI = VADD(T7, Tf); + TJ = VADD(Tw, TA); + TK = VSUB(TI, TJ); + TO = VADD(TI, TJ); + TL = VSUB(Tl, Tq); + TM = VADD(TC, TD); + TN = VMUL(LDK(KP866025403), VSUB(TL, TM)); + TP = VMUL(LDK(KP866025403), VADD(TM, TL)); + } + ST(&(x[WS(rs, 2)]), VFMAI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFNMSI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFNMSI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(TP, TO), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 12, XSIMD_STRING("t1fv_12"), twinstr, &GENUS, {41, 24, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_12) (planner *p) { + X(kdft_dit_register) (p, t1fv_12, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 12 -name t1fv_12 -include dft/simd/t1f.h */ + +/* + * This function contains 59 FP additions, 30 FP multiplications, + * (or, 55 additions, 26 multiplications, 4 fused multiply/add), + * 28 stack variables, 2 constants, and 24 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_12(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 22)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(12, rs)) { + V T1, TH, T6, TA, Tq, TE, Tv, TL, T9, TI, Te, TB, Ti, TD, Tn; + V TK; + { + V T5, T3, T4, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 14]), T4); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + TH = VSUB(T5, T3); + T6 = VADD(T3, T5); + TA = VFNMS(LDK(KP500000000), T6, T1); + } + { + V Tu, Ts, Tp, Tt, Tr; + Tp = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tq = BYTWJ(&(W[TWVL * 16]), Tp); + Tt = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 8]), Tt); + Tr = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[0]), Tr); + TE = VSUB(Tu, Ts); + Tv = VADD(Ts, Tu); + TL = VFNMS(LDK(KP500000000), Tv, Tq); + } + { + V Td, Tb, T8, Tc, Ta; + T8 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T9 = BYTWJ(&(W[TWVL * 10]), T8); + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 2]), Tc); + Ta = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 18]), Ta); + TI = VSUB(Td, Tb); + Te = VADD(Tb, Td); + TB = VFNMS(LDK(KP500000000), Te, T9); + } + { + V Tm, Tk, Th, Tl, Tj; + Th = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ti = BYTWJ(&(W[TWVL * 4]), Th); + Tl = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tm = BYTWJ(&(W[TWVL * 20]), Tl); + Tj = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[TWVL * 12]), Tj); + TD = VSUB(Tm, Tk); + Tn = VADD(Tk, Tm); + TK = VFNMS(LDK(KP500000000), Tn, Ti); + } + { + V Tg, Ty, Tx, Tz; + { + V T7, Tf, To, Tw; + T7 = VADD(T1, T6); + Tf = VADD(T9, Te); + Tg = VSUB(T7, Tf); + Ty = VADD(T7, Tf); + To = VADD(Ti, Tn); + Tw = VADD(Tq, Tv); + Tx = VBYI(VSUB(To, Tw)); + Tz = VADD(To, Tw); + } + ST(&(x[WS(rs, 9)]), VSUB(Tg, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(Ty, Tz), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(Tg, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(Ty, Tz), ms, &(x[0])); + } + { + V TS, TW, TV, TX; + { + V TQ, TR, TT, TU; + TQ = VADD(TA, TB); + TR = VADD(TK, TL); + TS = VSUB(TQ, TR); + TW = VADD(TQ, TR); + TT = VADD(TD, TE); + TU = VADD(TH, TI); + TV = VBYI(VMUL(LDK(KP866025403), VSUB(TT, TU))); + TX = VBYI(VMUL(LDK(KP866025403), VADD(TU, TT))); + } + ST(&(x[WS(rs, 10)]), VSUB(TS, TV), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(TW, TX), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(TS, TV), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TW, TX), ms, &(x[0])); + } + { + V TG, TP, TN, TO; + { + V TC, TF, TJ, TM; + TC = VSUB(TA, TB); + TF = VMUL(LDK(KP866025403), VSUB(TD, TE)); + TG = VSUB(TC, TF); + TP = VADD(TC, TF); + TJ = VMUL(LDK(KP866025403), VSUB(TH, TI)); + TM = VSUB(TK, TL); + TN = VBYI(VADD(TJ, TM)); + TO = VBYI(VSUB(TJ, TM)); + } + ST(&(x[WS(rs, 5)]), VSUB(TG, TN), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(TP, TO), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(TN, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TO, TP), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 12, XSIMD_STRING("t1fv_12"), twinstr, &GENUS, {55, 26, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_12) (planner *p) { + X(kdft_dit_register) (p, t1fv_12, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_15.c new file mode 100644 index 000000000..6a302087b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_15.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:28 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 15 -name t1fv_15 -include dft/simd/t1f.h */ + +/* + * This function contains 92 FP additions, 77 FP multiplications, + * (or, 50 additions, 35 multiplications, 42 fused multiply/add), + * 50 stack variables, 8 constants, and 30 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_15(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP910592997, +0.910592997310029334643087372129977886038870291); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 28)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 28), MAKE_VOLATILE_STRIDE(15, rs)) { + V T1b, T7, TP, T12, T15, Tf, Tn, To, T1c, T1d, T1e, TQ, TR, TS, Tw; + V TE, TF, TT, TU, TV; + { + V T1, T5, T3, T4, T2, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 18]), T4); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T1b = VSUB(T5, T3); + T6 = VADD(T3, T5); + T7 = VADD(T1, T6); + TP = VFNMS(LDK(KP500000000), T6, T1); + } + { + V T9, Tq, Ty, Th, Te, T10, Tv, T13, TD, T14, Tm, T11; + { + V T8, Tp, Tx, Tg; + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + Tp = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tq = BYTWJ(&(W[TWVL * 10]), Tp); + Tx = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Ty = BYTWJ(&(W[TWVL * 16]), Tx); + Tg = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 22]), Tg); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 14]), Ta); + Tc = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 24]), Tc); + Te = VADD(Tb, Td); + T10 = VSUB(Td, Tb); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[TWVL * 20]), Tr); + Tt = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[0]), Tt); + Tv = VADD(Ts, Tu); + T13 = VSUB(Tu, Ts); + } + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 26]), Tz); + TB = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 6]), TB); + TD = VADD(TA, TC); + T14 = VSUB(TC, TA); + } + { + V Tj, Tl, Ti, Tk; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 2]), Ti); + Tk = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tl = BYTWJ(&(W[TWVL * 12]), Tk); + Tm = VADD(Tj, Tl); + T11 = VSUB(Tl, Tj); + } + T12 = VSUB(T10, T11); + T15 = VSUB(T13, T14); + Tf = VADD(T9, Te); + Tn = VADD(Th, Tm); + To = VADD(Tf, Tn); + T1c = VADD(T10, T11); + T1d = VADD(T13, T14); + T1e = VADD(T1c, T1d); + TQ = VFNMS(LDK(KP500000000), Te, T9); + TR = VFNMS(LDK(KP500000000), Tm, Th); + TS = VADD(TQ, TR); + Tw = VADD(Tq, Tv); + TE = VADD(Ty, TD); + TF = VADD(Tw, TE); + TT = VFNMS(LDK(KP500000000), Tv, Tq); + TU = VFNMS(LDK(KP500000000), TD, Ty); + TV = VADD(TT, TU); + } + { + V TI, TG, TH, TM, TO, TK, TL, TN, TJ; + TI = VSUB(To, TF); + TG = VADD(To, TF); + TH = VFNMS(LDK(KP250000000), TG, T7); + TK = VSUB(Tw, TE); + TL = VSUB(Tf, Tn); + TM = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TL, TK)); + TO = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TK, TL)); + ST(&(x[0]), VADD(T7, TG), ms, &(x[0])); + TN = VFMA(LDK(KP559016994), TI, TH); + ST(&(x[WS(rs, 6)]), VFNMSI(TO, TN), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VFMAI(TO, TN), ms, &(x[WS(rs, 1)])); + TJ = VFNMS(LDK(KP559016994), TI, TH); + ST(&(x[WS(rs, 3)]), VFNMSI(TM, TJ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VFMAI(TM, TJ), ms, &(x[0])); + } + { + V T16, T1m, T1u, T1h, T1p, T1a, T1o, TZ, T1t, T1l, T1f, T1g; + T16 = VFMA(LDK(KP618033988), T15, T12); + T1m = VFNMS(LDK(KP618033988), T12, T15); + T1u = VMUL(LDK(KP866025403), VADD(T1b, T1e)); + T1f = VFNMS(LDK(KP250000000), T1e, T1b); + T1g = VSUB(T1c, T1d); + T1h = VFMA(LDK(KP559016994), T1g, T1f); + T1p = VFNMS(LDK(KP559016994), T1g, T1f); + { + V T18, T19, TY, TW, TX; + T18 = VSUB(TQ, TR); + T19 = VSUB(TT, TU); + T1a = VFMA(LDK(KP618033988), T19, T18); + T1o = VFNMS(LDK(KP618033988), T18, T19); + TY = VSUB(TS, TV); + TW = VADD(TS, TV); + TX = VFNMS(LDK(KP250000000), TW, TP); + TZ = VFMA(LDK(KP559016994), TY, TX); + T1t = VADD(TP, TW); + T1l = VFNMS(LDK(KP559016994), TY, TX); + } + { + V T17, T1i, T1r, T1s; + ST(&(x[WS(rs, 5)]), VFNMSI(T1u, T1t), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 10)]), VFMAI(T1u, T1t), ms, &(x[0])); + T17 = VFMA(LDK(KP823639103), T16, TZ); + T1i = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), T1h, T1a)); + ST(&(x[WS(rs, 1)]), VFNMSI(T1i, T17), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 14)]), VFMAI(T1i, T17), ms, &(x[0])); + T1r = VFNMS(LDK(KP823639103), T1m, T1l); + T1s = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), T1p, T1o)); + ST(&(x[WS(rs, 8)]), VFNMSI(T1s, T1r), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VFMAI(T1s, T1r), ms, &(x[WS(rs, 1)])); + { + V T1n, T1q, T1j, T1k; + T1n = VFMA(LDK(KP823639103), T1m, T1l); + T1q = VMUL(LDK(KP951056516), VFNMS(LDK(KP910592997), T1p, T1o)); + ST(&(x[WS(rs, 13)]), VFNMSI(T1q, T1n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(T1q, T1n), ms, &(x[0])); + T1j = VFNMS(LDK(KP823639103), T16, TZ); + T1k = VMUL(LDK(KP951056516), VFMA(LDK(KP910592997), T1h, T1a)); + ST(&(x[WS(rs, 11)]), VFNMSI(T1k, T1j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(T1k, T1j), ms, &(x[0])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 15, XSIMD_STRING("t1fv_15"), twinstr, &GENUS, {50, 35, 42, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_15) (planner *p) { + X(kdft_dit_register) (p, t1fv_15, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 15 -name t1fv_15 -include dft/simd/t1f.h */ + +/* + * This function contains 92 FP additions, 53 FP multiplications, + * (or, 78 additions, 39 multiplications, 14 fused multiply/add), + * 52 stack variables, 10 constants, and 30 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_15(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP216506350, +0.216506350946109661690930792688234045867850657); + DVK(KP484122918, +0.484122918275927110647408174972799951354115213); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP509036960, +0.509036960455127183450980863393907648510733164); + DVK(KP823639103, +0.823639103546331925877420039278190003029660514); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 28)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 28), MAKE_VOLATILE_STRIDE(15, rs)) { + V T1e, T7, TP, T12, T15, Tf, Tn, To, T1b, T1c, T1f, TQ, TR, TS, Tw; + V TE, TF, TT, TU, TV; + { + V T1, T5, T3, T4, T2, T6; + T1 = LD(&(x[0]), ms, &(x[0])); + T4 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 18]), T4); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T1e = VSUB(T5, T3); + T6 = VADD(T3, T5); + T7 = VADD(T1, T6); + TP = VFNMS(LDK(KP500000000), T6, T1); + } + { + V T9, Tq, Ty, Th, Te, T13, Tv, T10, TD, T11, Tm, T14; + { + V T8, Tp, Tx, Tg; + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + Tp = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tq = BYTWJ(&(W[TWVL * 10]), Tp); + Tx = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Ty = BYTWJ(&(W[TWVL * 16]), Tx); + Tg = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 22]), Tg); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 14]), Ta); + Tc = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 24]), Tc); + Te = VADD(Tb, Td); + T13 = VSUB(Td, Tb); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[TWVL * 20]), Tr); + Tt = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[0]), Tt); + Tv = VADD(Ts, Tu); + T10 = VSUB(Tu, Ts); + } + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 26]), Tz); + TB = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 6]), TB); + TD = VADD(TA, TC); + T11 = VSUB(TC, TA); + } + { + V Tj, Tl, Ti, Tk; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 2]), Ti); + Tk = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tl = BYTWJ(&(W[TWVL * 12]), Tk); + Tm = VADD(Tj, Tl); + T14 = VSUB(Tl, Tj); + } + T12 = VSUB(T10, T11); + T15 = VSUB(T13, T14); + Tf = VADD(T9, Te); + Tn = VADD(Th, Tm); + To = VADD(Tf, Tn); + T1b = VADD(T13, T14); + T1c = VADD(T10, T11); + T1f = VADD(T1b, T1c); + TQ = VFNMS(LDK(KP500000000), Te, T9); + TR = VFNMS(LDK(KP500000000), Tm, Th); + TS = VADD(TQ, TR); + Tw = VADD(Tq, Tv); + TE = VADD(Ty, TD); + TF = VADD(Tw, TE); + TT = VFNMS(LDK(KP500000000), Tv, Tq); + TU = VFNMS(LDK(KP500000000), TD, Ty); + TV = VADD(TT, TU); + } + { + V TI, TG, TH, TM, TO, TK, TL, TN, TJ; + TI = VMUL(LDK(KP559016994), VSUB(To, TF)); + TG = VADD(To, TF); + TH = VFNMS(LDK(KP250000000), TG, T7); + TK = VSUB(Tw, TE); + TL = VSUB(Tf, Tn); + TM = VBYI(VFNMS(LDK(KP587785252), TL, VMUL(LDK(KP951056516), TK))); + TO = VBYI(VFMA(LDK(KP951056516), TL, VMUL(LDK(KP587785252), TK))); + ST(&(x[0]), VADD(T7, TG), ms, &(x[0])); + TN = VADD(TI, TH); + ST(&(x[WS(rs, 6)]), VSUB(TN, TO), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VADD(TO, TN), ms, &(x[WS(rs, 1)])); + TJ = VSUB(TH, TI); + ST(&(x[WS(rs, 3)]), VSUB(TJ, TM), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VADD(TM, TJ), ms, &(x[0])); + } + { + V T16, T1m, T1u, T1h, T1o, T1a, T1p, TZ, T1t, T1l, T1d, T1g; + T16 = VFNMS(LDK(KP509036960), T15, VMUL(LDK(KP823639103), T12)); + T1m = VFMA(LDK(KP823639103), T15, VMUL(LDK(KP509036960), T12)); + T1u = VBYI(VMUL(LDK(KP866025403), VADD(T1e, T1f))); + T1d = VMUL(LDK(KP484122918), VSUB(T1b, T1c)); + T1g = VFNMS(LDK(KP216506350), T1f, VMUL(LDK(KP866025403), T1e)); + T1h = VSUB(T1d, T1g); + T1o = VADD(T1d, T1g); + { + V T18, T19, TY, TW, TX; + T18 = VSUB(TT, TU); + T19 = VSUB(TQ, TR); + T1a = VFNMS(LDK(KP587785252), T19, VMUL(LDK(KP951056516), T18)); + T1p = VFMA(LDK(KP951056516), T19, VMUL(LDK(KP587785252), T18)); + TY = VMUL(LDK(KP559016994), VSUB(TS, TV)); + TW = VADD(TS, TV); + TX = VFNMS(LDK(KP250000000), TW, TP); + TZ = VSUB(TX, TY); + T1t = VADD(TP, TW); + T1l = VADD(TY, TX); + } + { + V T17, T1i, T1r, T1s; + ST(&(x[WS(rs, 5)]), VSUB(T1t, T1u), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 10)]), VADD(T1t, T1u), ms, &(x[0])); + T17 = VSUB(TZ, T16); + T1i = VBYI(VSUB(T1a, T1h)); + ST(&(x[WS(rs, 8)]), VSUB(T17, T1i), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VADD(T17, T1i), ms, &(x[WS(rs, 1)])); + T1r = VSUB(T1l, T1m); + T1s = VBYI(VADD(T1p, T1o)); + ST(&(x[WS(rs, 11)]), VSUB(T1r, T1s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T1r, T1s), ms, &(x[0])); + { + V T1n, T1q, T1j, T1k; + T1n = VADD(T1l, T1m); + T1q = VBYI(VSUB(T1o, T1p)); + ST(&(x[WS(rs, 14)]), VSUB(T1n, T1q), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T1n, T1q), ms, &(x[WS(rs, 1)])); + T1j = VADD(TZ, T16); + T1k = VBYI(VADD(T1a, T1h)); + ST(&(x[WS(rs, 13)]), VSUB(T1j, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(T1j, T1k), ms, &(x[0])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 15, XSIMD_STRING("t1fv_15"), twinstr, &GENUS, {78, 39, 14, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_15) (planner *p) { + X(kdft_dit_register) (p, t1fv_15, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_16.c new file mode 100644 index 000000000..ce559f9db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_16.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:28 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t1fv_16 -include dft/simd/t1f.h */ + +/* + * This function contains 87 FP additions, 64 FP multiplications, + * (or, 53 additions, 30 multiplications, 34 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V T4, TW, T9, T19, TD, TI, TZ, T1a, Tf, Tk, Tl, T13, T1c, Tq, Tv; + V Tw, T16, T1d, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 14]), T2); + T4 = VADD(T1, T3); + TW = VSUB(T1, T3); + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 22]), T7); + T9 = VADD(T6, T8); + T19 = VSUB(T6, T8); + } + { + V TA, TH, TC, TF, TX, TY; + { + V Tz, TG, TB, TE; + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 26]), Tz); + TG = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TH = BYTWJ(&(W[TWVL * 18]), TG); + TB = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 10]), TB); + TE = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TF = BYTWJ(&(W[TWVL * 2]), TE); + } + TD = VADD(TA, TC); + TI = VADD(TF, TH); + TX = VSUB(TF, TH); + TY = VSUB(TA, TC); + TZ = VADD(TX, TY); + T1a = VSUB(TY, TX); + } + { + V Tc, Tj, Te, Th, T11, T12; + { + V Tb, Ti, Td, Tg; + Tb = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tc = BYTWJ(&(W[0]), Tb); + Ti = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 24]), Ti); + Td = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Te = BYTWJ(&(W[TWVL * 16]), Td); + Tg = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Th = BYTWJ(&(W[TWVL * 8]), Tg); + } + Tf = VADD(Tc, Te); + Tk = VADD(Th, Tj); + Tl = VSUB(Tf, Tk); + T11 = VSUB(Tc, Te); + T12 = VSUB(Th, Tj); + T13 = VFNMS(LDK(KP414213562), T12, T11); + T1c = VFMA(LDK(KP414213562), T11, T12); + } + { + V Tn, Tu, Tp, Ts, T14, T15; + { + V Tm, Tt, To, Tr; + Tm = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tn = BYTWJ(&(W[TWVL * 28]), Tm); + Tt = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 20]), Tt); + To = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tp = BYTWJ(&(W[TWVL * 12]), To); + Tr = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[TWVL * 4]), Tr); + } + Tq = VADD(Tn, Tp); + Tv = VADD(Ts, Tu); + Tw = VSUB(Tq, Tv); + T14 = VSUB(Tn, Tp); + T15 = VSUB(Tu, Ts); + T16 = VFNMS(LDK(KP414213562), T15, T14); + T1d = VFMA(LDK(KP414213562), T14, T15); + } + { + V Ty, TM, TL, TN; + { + V Ta, Tx, TJ, TK; + Ta = VSUB(T4, T9); + Tx = VADD(Tl, Tw); + Ty = VFNMS(LDK(KP707106781), Tx, Ta); + TM = VFMA(LDK(KP707106781), Tx, Ta); + TJ = VSUB(TD, TI); + TK = VSUB(Tw, Tl); + TL = VFNMS(LDK(KP707106781), TK, TJ); + TN = VFMA(LDK(KP707106781), TK, TJ); + } + ST(&(x[WS(rs, 6)]), VFNMSI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TM), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFMAI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(TN, TM), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VFNMS(LDK(KP707106781), TZ, TW); + T1j = VADD(T1c, T1d); + T1k = VFNMS(LDK(KP923879532), T1j, T1i); + T1o = VFMA(LDK(KP923879532), T1j, T1i); + T1l = VFMA(LDK(KP707106781), T1a, T19); + T1m = VSUB(T16, T13); + T1n = VFNMS(LDK(KP923879532), T1m, T1l); + T1p = VFMA(LDK(KP923879532), T1m, T1l); + } + ST(&(x[WS(rs, 5)]), VFNMSI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFNMSI(T1p, T1o), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T1p, T1o), ms, &(x[WS(rs, 1)])); + } + { + V TQ, TU, TT, TV; + { + V TO, TP, TR, TS; + TO = VADD(T4, T9); + TP = VADD(TI, TD); + TQ = VADD(TO, TP); + TU = VSUB(TO, TP); + TR = VADD(Tf, Tk); + TS = VADD(Tq, Tv); + TT = VADD(TR, TS); + TV = VSUB(TS, TR); + } + ST(&(x[WS(rs, 8)]), VSUB(TQ, TT), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(TV, TU), ms, &(x[0])); + ST(&(x[0]), VADD(TQ, TT), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFNMSI(TV, TU), ms, &(x[0])); + } + { + V T18, T1g, T1f, T1h; + { + V T10, T17, T1b, T1e; + T10 = VFMA(LDK(KP707106781), TZ, TW); + T17 = VADD(T13, T16); + T18 = VFNMS(LDK(KP923879532), T17, T10); + T1g = VFMA(LDK(KP923879532), T17, T10); + T1b = VFNMS(LDK(KP707106781), T1a, T19); + T1e = VSUB(T1c, T1d); + T1f = VFNMS(LDK(KP923879532), T1e, T1b); + T1h = VFMA(LDK(KP923879532), T1e, T1b); + } + ST(&(x[WS(rs, 9)]), VFNMSI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T1h, T1g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFNMSI(T1h, T1g), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t1fv_16"), twinstr, &GENUS, {53, 30, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_16) (planner *p) { + X(kdft_dit_register) (p, t1fv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t1fv_16 -include dft/simd/t1f.h */ + +/* + * This function contains 87 FP additions, 42 FP multiplications, + * (or, 83 additions, 38 multiplications, 4 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V TJ, T10, TD, T11, T1b, T1c, Ty, TK, T16, T17, T18, Tb, TN, T13, T14; + V T15, Tm, TM, TG, TI, TH; + TG = LD(&(x[0]), ms, &(x[0])); + TH = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + TI = BYTWJ(&(W[TWVL * 14]), TH); + TJ = VSUB(TG, TI); + T10 = VADD(TG, TI); + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 6]), Tz); + TB = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 22]), TB); + TD = VSUB(TA, TC); + T11 = VADD(TA, TC); + } + { + V Tp, Tw, Tr, Tu, Ts, Tx; + { + V To, Tv, Tq, Tt; + To = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 26]), To); + Tv = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tw = BYTWJ(&(W[TWVL * 18]), Tv); + Tq = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tr = BYTWJ(&(W[TWVL * 10]), Tq); + Tt = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tu = BYTWJ(&(W[TWVL * 2]), Tt); + } + T1b = VADD(Tp, Tr); + T1c = VADD(Tu, Tw); + Ts = VSUB(Tp, Tr); + Tx = VSUB(Tu, Tw); + Ty = VMUL(LDK(KP707106781), VSUB(Ts, Tx)); + TK = VMUL(LDK(KP707106781), VADD(Tx, Ts)); + } + { + V T2, T9, T4, T7, T5, Ta; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[TWVL * 28]), T1); + T8 = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 20]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTWJ(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T7 = BYTWJ(&(W[TWVL * 4]), T6); + } + T16 = VADD(T2, T4); + T17 = VADD(T7, T9); + T18 = VSUB(T16, T17); + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VFNMS(LDK(KP923879532), Ta, VMUL(LDK(KP382683432), T5)); + TN = VFMA(LDK(KP923879532), T5, VMUL(LDK(KP382683432), Ta)); + } + { + V Td, Tk, Tf, Ti, Tg, Tl; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[0]), Tc); + Tj = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[TWVL * 24]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTWJ(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ti = BYTWJ(&(W[TWVL * 8]), Th); + } + T13 = VADD(Td, Tf); + T14 = VADD(Ti, Tk); + T15 = VSUB(T13, T14); + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VFMA(LDK(KP382683432), Tg, VMUL(LDK(KP923879532), Tl)); + TM = VFNMS(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tg)); + } + { + V T1a, T1g, T1f, T1h; + { + V T12, T19, T1d, T1e; + T12 = VSUB(T10, T11); + T19 = VMUL(LDK(KP707106781), VADD(T15, T18)); + T1a = VADD(T12, T19); + T1g = VSUB(T12, T19); + T1d = VSUB(T1b, T1c); + T1e = VMUL(LDK(KP707106781), VSUB(T18, T15)); + T1f = VBYI(VADD(T1d, T1e)); + T1h = VBYI(VSUB(T1e, T1d)); + } + ST(&(x[WS(rs, 14)]), VSUB(T1a, T1f), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T1g, T1h), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1a, T1f), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(T1g, T1h), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VADD(T10, T11); + T1j = VADD(T1c, T1b); + T1k = VADD(T1i, T1j); + T1o = VSUB(T1i, T1j); + T1l = VADD(T13, T14); + T1m = VADD(T16, T17); + T1n = VADD(T1l, T1m); + T1p = VBYI(VSUB(T1m, T1l)); + } + ST(&(x[WS(rs, 8)]), VSUB(T1k, T1n), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1o, T1p), ms, &(x[0])); + ST(&(x[0]), VADD(T1k, T1n), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VSUB(T1o, T1p), ms, &(x[0])); + } + { + V TF, TQ, TP, TR; + { + V Tn, TE, TL, TO; + Tn = VSUB(Tb, Tm); + TE = VSUB(Ty, TD); + TF = VBYI(VSUB(Tn, TE)); + TQ = VBYI(VADD(TE, Tn)); + TL = VADD(TJ, TK); + TO = VADD(TM, TN); + TP = VSUB(TL, TO); + TR = VADD(TL, TO); + } + ST(&(x[WS(rs, 7)]), VADD(TF, TP), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VSUB(TR, TQ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(TP, TF), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TQ, TR), ms, &(x[WS(rs, 1)])); + } + { + V TU, TY, TX, TZ; + { + V TS, TT, TV, TW; + TS = VSUB(TJ, TK); + TT = VADD(Tm, Tb); + TU = VADD(TS, TT); + TY = VSUB(TS, TT); + TV = VADD(TD, Ty); + TW = VSUB(TN, TM); + TX = VBYI(VADD(TV, TW)); + TZ = VBYI(VSUB(TW, TV)); + } + ST(&(x[WS(rs, 13)]), VSUB(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(TY, TZ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(TY, TZ), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t1fv_16"), twinstr, &GENUS, {83, 38, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_16) (planner *p) { + X(kdft_dit_register) (p, t1fv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_2.c new file mode 100644 index 000000000..03d01e654 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1fv_2 -include dft/simd/t1f.h */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1fv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_2) (planner *p) { + X(kdft_dit_register) (p, t1fv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1fv_2 -include dft/simd/t1f.h */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1fv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_2) (planner *p) { + X(kdft_dit_register) (p, t1fv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_20.c new file mode 100644 index 000000000..6dbe156a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_20.c @@ -0,0 +1,524 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:41 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t1fv_20 -include dft/simd/t1f.h */ + +/* + * This function contains 123 FP additions, 88 FP multiplications, + * (or, 77 additions, 42 multiplications, 46 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, Tx, T1m, T1K, TZ, T16, T17, T10, Tf, Tq, Tr, T1O, T1P, T1Q, T1w; + V T1z, T1A, TI, TT, TU, T1L, T1M, T1N, T1p, T1s, T1t, Ts, TV; + { + V T1, Tw, T3, Tu, Tv, T2, Tt, T1k, T1l; + T1 = LD(&(x[0]), ms, &(x[0])); + Tv = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tw = BYTWJ(&(W[TWVL * 28]), Tv); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 18]), T2); + Tt = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 8]), Tt); + T4 = VSUB(T1, T3); + Tx = VSUB(Tu, Tw); + T1k = VADD(T1, T3); + T1l = VADD(Tu, Tw); + T1m = VSUB(T1k, T1l); + T1K = VADD(T1k, T1l); + } + { + V T9, T1n, TN, T1v, TS, T1y, Te, T1q, Tk, T1u, TC, T1o, TH, T1r, Tp; + V T1x; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1n = VADD(T6, T8); + } + { + V TK, TM, TJ, TL; + TJ = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TK = BYTWJ(&(W[TWVL * 24]), TJ); + TL = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TM = BYTWJ(&(W[TWVL * 4]), TL); + TN = VSUB(TK, TM); + T1v = VADD(TK, TM); + } + { + V TP, TR, TO, TQ; + TO = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TP = BYTWJ(&(W[TWVL * 32]), TO); + TQ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TR = BYTWJ(&(W[TWVL * 12]), TQ); + TS = VSUB(TP, TR); + T1y = VADD(TP, TR); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1q = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1u = VADD(Th, Tj); + } + { + V Tz, TB, Ty, TA; + Ty = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tz = BYTWJ(&(W[TWVL * 16]), Ty); + TA = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TB = BYTWJ(&(W[TWVL * 36]), TA); + TC = VSUB(Tz, TB); + T1o = VADD(Tz, TB); + } + { + V TE, TG, TD, TF; + TD = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TE = BYTWJ(&(W[0]), TD); + TF = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[TWVL * 20]), TF); + TH = VSUB(TE, TG); + T1r = VADD(TE, TG); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTWJ(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1x = VADD(Tm, To); + } + TZ = VSUB(TH, TC); + T16 = VSUB(T9, Te); + T17 = VSUB(Tk, Tp); + T10 = VSUB(TS, TN); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1O = VADD(T1u, T1v); + T1P = VADD(T1x, T1y); + T1Q = VADD(T1O, T1P); + T1w = VSUB(T1u, T1v); + T1z = VSUB(T1x, T1y); + T1A = VADD(T1w, T1z); + TI = VADD(TC, TH); + TT = VADD(TN, TS); + TU = VADD(TI, TT); + T1L = VADD(T1n, T1o); + T1M = VADD(T1q, T1r); + T1N = VADD(T1L, T1M); + T1p = VSUB(T1n, T1o); + T1s = VSUB(T1q, T1r); + T1t = VADD(T1p, T1s); + } + Ts = VADD(T4, Tr); + TV = VADD(Tx, TU); + ST(&(x[WS(rs, 5)]), VFNMSI(TV, Ts), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(TV, Ts), ms, &(x[WS(rs, 1)])); + { + V T1T, T1R, T1S, T1X, T1Z, T1V, T1W, T1Y, T1U; + T1T = VSUB(T1N, T1Q); + T1R = VADD(T1N, T1Q); + T1S = VFNMS(LDK(KP250000000), T1R, T1K); + T1V = VSUB(T1L, T1M); + T1W = VSUB(T1O, T1P); + T1X = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1W, T1V)); + T1Z = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1V, T1W)); + ST(&(x[0]), VADD(T1K, T1R), ms, &(x[0])); + T1Y = VFNMS(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 8)]), VFNMSI(T1Z, T1Y), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFMAI(T1Z, T1Y), ms, &(x[0])); + T1U = VFMA(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 4)]), VFMAI(T1X, T1U), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFNMSI(T1X, T1U), ms, &(x[0])); + } + { + V T1D, T1B, T1C, T1H, T1J, T1F, T1G, T1I, T1E; + T1D = VSUB(T1t, T1A); + T1B = VADD(T1t, T1A); + T1C = VFNMS(LDK(KP250000000), T1B, T1m); + T1F = VSUB(T1w, T1z); + T1G = VSUB(T1p, T1s); + T1H = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1G, T1F)); + T1J = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1F, T1G)); + ST(&(x[WS(rs, 10)]), VADD(T1m, T1B), ms, &(x[0])); + T1I = VFMA(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 6)]), VFNMSI(T1J, T1I), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFMAI(T1J, T1I), ms, &(x[0])); + T1E = VFNMS(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 2)]), VFMAI(T1H, T1E), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFNMSI(T1H, T1E), ms, &(x[0])); + } + { + V T11, T18, T1g, T1d, T15, T1f, TY, T1c; + T11 = VFMA(LDK(KP618033988), T10, TZ); + T18 = VFMA(LDK(KP618033988), T17, T16); + T1g = VFNMS(LDK(KP618033988), T16, T17); + T1d = VFNMS(LDK(KP618033988), TZ, T10); + { + V T13, T14, TW, TX; + T13 = VFNMS(LDK(KP250000000), TU, Tx); + T14 = VSUB(TT, TI); + T15 = VFNMS(LDK(KP559016994), T14, T13); + T1f = VFMA(LDK(KP559016994), T14, T13); + TW = VFNMS(LDK(KP250000000), Tr, T4); + TX = VSUB(Tf, Tq); + TY = VFMA(LDK(KP559016994), TX, TW); + T1c = VFNMS(LDK(KP559016994), TX, TW); + } + { + V T12, T19, T1i, T1j; + T12 = VFMA(LDK(KP951056516), T11, TY); + T19 = VFMA(LDK(KP951056516), T18, T15); + ST(&(x[WS(rs, 1)]), VFNMSI(T19, T12), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VFMAI(T19, T12), ms, &(x[WS(rs, 1)])); + T1i = VFMA(LDK(KP951056516), T1d, T1c); + T1j = VFMA(LDK(KP951056516), T1g, T1f); + ST(&(x[WS(rs, 13)]), VFNMSI(T1j, T1i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T1j, T1i), ms, &(x[WS(rs, 1)])); + } + { + V T1a, T1b, T1e, T1h; + T1a = VFNMS(LDK(KP951056516), T11, TY); + T1b = VFNMS(LDK(KP951056516), T18, T15); + ST(&(x[WS(rs, 9)]), VFNMSI(T1b, T1a), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T1b, T1a), ms, &(x[WS(rs, 1)])); + T1e = VFNMS(LDK(KP951056516), T1d, T1c); + T1h = VFNMS(LDK(KP951056516), T1g, T1f); + ST(&(x[WS(rs, 17)]), VFNMSI(T1h, T1e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T1h, T1e), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t1fv_20"), twinstr, &GENUS, {77, 42, 46, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_20) (planner *p) { + X(kdft_dit_register) (p, t1fv_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t1fv_20 -include dft/simd/t1f.h */ + +/* + * This function contains 123 FP additions, 62 FP multiplications, + * (or, 111 additions, 50 multiplications, 12 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, Tx, T1B, T1U, TZ, T16, T17, T10, Tf, Tq, Tr, T1N, T1O, T1S, T1t; + V T1w, T1C, TI, TT, TU, T1K, T1L, T1R, T1m, T1p, T1D, Ts, TV; + { + V T1, Tw, T3, Tu, Tv, T2, Tt, T1z, T1A; + T1 = LD(&(x[0]), ms, &(x[0])); + Tv = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tw = BYTWJ(&(W[TWVL * 28]), Tv); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 18]), T2); + Tt = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 8]), Tt); + T4 = VSUB(T1, T3); + Tx = VSUB(Tu, Tw); + T1z = VADD(T1, T3); + T1A = VADD(Tu, Tw); + T1B = VSUB(T1z, T1A); + T1U = VADD(T1z, T1A); + } + { + V T9, T1r, TN, T1l, TS, T1o, Te, T1u, Tk, T1k, TC, T1s, TH, T1v, Tp; + V T1n; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1r = VADD(T6, T8); + } + { + V TK, TM, TJ, TL; + TJ = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TK = BYTWJ(&(W[TWVL * 24]), TJ); + TL = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TM = BYTWJ(&(W[TWVL * 4]), TL); + TN = VSUB(TK, TM); + T1l = VADD(TK, TM); + } + { + V TP, TR, TO, TQ; + TO = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TP = BYTWJ(&(W[TWVL * 32]), TO); + TQ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TR = BYTWJ(&(W[TWVL * 12]), TQ); + TS = VSUB(TP, TR); + T1o = VADD(TP, TR); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1u = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1k = VADD(Th, Tj); + } + { + V Tz, TB, Ty, TA; + Ty = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tz = BYTWJ(&(W[TWVL * 16]), Ty); + TA = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TB = BYTWJ(&(W[TWVL * 36]), TA); + TC = VSUB(Tz, TB); + T1s = VADD(Tz, TB); + } + { + V TE, TG, TD, TF; + TD = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TE = BYTWJ(&(W[0]), TD); + TF = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[TWVL * 20]), TF); + TH = VSUB(TE, TG); + T1v = VADD(TE, TG); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTWJ(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1n = VADD(Tm, To); + } + TZ = VSUB(TH, TC); + T16 = VSUB(T9, Te); + T17 = VSUB(Tk, Tp); + T10 = VSUB(TS, TN); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1N = VADD(T1k, T1l); + T1O = VADD(T1n, T1o); + T1S = VADD(T1N, T1O); + T1t = VSUB(T1r, T1s); + T1w = VSUB(T1u, T1v); + T1C = VADD(T1t, T1w); + TI = VADD(TC, TH); + TT = VADD(TN, TS); + TU = VADD(TI, TT); + T1K = VADD(T1r, T1s); + T1L = VADD(T1u, T1v); + T1R = VADD(T1K, T1L); + T1m = VSUB(T1k, T1l); + T1p = VSUB(T1n, T1o); + T1D = VADD(T1m, T1p); + } + Ts = VADD(T4, Tr); + TV = VBYI(VADD(Tx, TU)); + ST(&(x[WS(rs, 5)]), VSUB(Ts, TV), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VADD(Ts, TV), ms, &(x[WS(rs, 1)])); + { + V T1T, T1V, T1W, T1Q, T1Z, T1M, T1P, T1Y, T1X; + T1T = VMUL(LDK(KP559016994), VSUB(T1R, T1S)); + T1V = VADD(T1R, T1S); + T1W = VFNMS(LDK(KP250000000), T1V, T1U); + T1M = VSUB(T1K, T1L); + T1P = VSUB(T1N, T1O); + T1Q = VBYI(VFMA(LDK(KP951056516), T1M, VMUL(LDK(KP587785252), T1P))); + T1Z = VBYI(VFNMS(LDK(KP587785252), T1M, VMUL(LDK(KP951056516), T1P))); + ST(&(x[0]), VADD(T1U, T1V), ms, &(x[0])); + T1Y = VSUB(T1W, T1T); + ST(&(x[WS(rs, 8)]), VSUB(T1Y, T1Z), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T1Z, T1Y), ms, &(x[0])); + T1X = VADD(T1T, T1W); + ST(&(x[WS(rs, 4)]), VADD(T1Q, T1X), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T1X, T1Q), ms, &(x[0])); + } + { + V T1G, T1E, T1F, T1y, T1J, T1q, T1x, T1I, T1H; + T1G = VMUL(LDK(KP559016994), VSUB(T1C, T1D)); + T1E = VADD(T1C, T1D); + T1F = VFNMS(LDK(KP250000000), T1E, T1B); + T1q = VSUB(T1m, T1p); + T1x = VSUB(T1t, T1w); + T1y = VBYI(VFNMS(LDK(KP587785252), T1x, VMUL(LDK(KP951056516), T1q))); + T1J = VBYI(VFMA(LDK(KP951056516), T1x, VMUL(LDK(KP587785252), T1q))); + ST(&(x[WS(rs, 10)]), VADD(T1B, T1E), ms, &(x[0])); + T1I = VADD(T1G, T1F); + ST(&(x[WS(rs, 6)]), VSUB(T1I, T1J), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T1J, T1I), ms, &(x[0])); + T1H = VSUB(T1F, T1G); + ST(&(x[WS(rs, 2)]), VADD(T1y, T1H), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VSUB(T1H, T1y), ms, &(x[0])); + } + { + V T11, T18, T1g, T1d, T15, T1f, TY, T1c; + T11 = VFMA(LDK(KP951056516), TZ, VMUL(LDK(KP587785252), T10)); + T18 = VFMA(LDK(KP951056516), T16, VMUL(LDK(KP587785252), T17)); + T1g = VFNMS(LDK(KP587785252), T16, VMUL(LDK(KP951056516), T17)); + T1d = VFNMS(LDK(KP587785252), TZ, VMUL(LDK(KP951056516), T10)); + { + V T13, T14, TW, TX; + T13 = VFMS(LDK(KP250000000), TU, Tx); + T14 = VMUL(LDK(KP559016994), VSUB(TT, TI)); + T15 = VADD(T13, T14); + T1f = VSUB(T14, T13); + TW = VMUL(LDK(KP559016994), VSUB(Tf, Tq)); + TX = VFNMS(LDK(KP250000000), Tr, T4); + TY = VADD(TW, TX); + T1c = VSUB(TX, TW); + } + { + V T12, T19, T1i, T1j; + T12 = VADD(TY, T11); + T19 = VBYI(VSUB(T15, T18)); + ST(&(x[WS(rs, 19)]), VSUB(T12, T19), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T12, T19), ms, &(x[WS(rs, 1)])); + T1i = VADD(T1c, T1d); + T1j = VBYI(VADD(T1g, T1f)); + ST(&(x[WS(rs, 13)]), VSUB(T1i, T1j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T1i, T1j), ms, &(x[WS(rs, 1)])); + } + { + V T1a, T1b, T1e, T1h; + T1a = VSUB(TY, T11); + T1b = VBYI(VADD(T18, T15)); + ST(&(x[WS(rs, 11)]), VSUB(T1a, T1b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T1a, T1b), ms, &(x[WS(rs, 1)])); + T1e = VSUB(T1c, T1d); + T1h = VBYI(VSUB(T1f, T1g)); + ST(&(x[WS(rs, 17)]), VSUB(T1e, T1h), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T1e, T1h), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t1fv_20"), twinstr, &GENUS, {111, 50, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_20) (planner *p) { + X(kdft_dit_register) (p, t1fv_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_25.c new file mode 100644 index 000000000..212e9d3d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_25.c @@ -0,0 +1,942 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:42 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t1fv_25 -include dft/simd/t1f.h */ + +/* + * This function contains 248 FP additions, 241 FP multiplications, + * (or, 67 additions, 60 multiplications, 181 fused multiply/add), + * 147 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1, Te, Tc, Td, T1O, T2X, T3Q, T1x, T2K, T1u, T2L, T1y, T27, T3b, T2R; + V T2M, T2f, T3M, Ty, T2E, Tv, T2D, Tz, T2a, T3e, T2U, T2F, T2i, T3N, TK; + V T2B, TS, T2A, TT, T2b, T3f, T2T, T2C, T2j, T3P, T1d, T2H, T1a, T2I, T1e; + V T28, T3c, T2Q, T2J, T2g; + { + V T8, Ta, Tb, T3, T5, T6, T1M, T1N; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T7, T9, T2, T4; + T7 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 18]), T7); + T9 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 28]), T9); + Tb = VADD(T8, Ta); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T4 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 38]), T4); + T6 = VADD(T3, T5); + } + Te = VSUB(T6, Tb); + Tc = VADD(T6, Tb); + Td = VFNMS(LDK(KP250000000), Tc, T1); + T1M = VSUB(T3, T5); + T1N = VSUB(T8, Ta); + T1O = VFMA(LDK(KP618033988), T1N, T1M); + T2X = VFNMS(LDK(KP618033988), T1M, T1N); + } + { + V T1g, T1v, T1w, T1l, T1q, T1r, T1f, T1s, T1t; + T1f = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1g = BYTWJ(&(W[TWVL * 4]), T1f); + { + V T1i, T1p, T1k, T1n; + { + V T1h, T1o, T1j, T1m; + T1h = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1i = BYTWJ(&(W[TWVL * 14]), T1h); + T1o = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1p = BYTWJ(&(W[TWVL * 34]), T1o); + T1j = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1k = BYTWJ(&(W[TWVL * 44]), T1j); + T1m = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1n = BYTWJ(&(W[TWVL * 24]), T1m); + } + T1v = VSUB(T1i, T1k); + T1w = VSUB(T1n, T1p); + T1l = VADD(T1i, T1k); + T1q = VADD(T1n, T1p); + T1r = VADD(T1l, T1q); + } + T3Q = VADD(T1g, T1r); + T1x = VFMA(LDK(KP618033988), T1w, T1v); + T2K = VFNMS(LDK(KP618033988), T1v, T1w); + T1s = VFNMS(LDK(KP250000000), T1r, T1g); + T1t = VSUB(T1q, T1l); + T1u = VFNMS(LDK(KP559016994), T1t, T1s); + T2L = VFMA(LDK(KP559016994), T1t, T1s); + T1y = VFNMS(LDK(KP893101515), T1x, T1u); + T27 = VFNMS(LDK(KP120146378), T1x, T1u); + T3b = VFMA(LDK(KP066152395), T2L, T2K); + T2R = VFNMS(LDK(KP786782374), T2K, T2L); + T2M = VFMA(LDK(KP869845200), T2L, T2K); + T2f = VFMA(LDK(KP132830569), T1u, T1x); + } + { + V Th, Tw, Tx, Tm, Tr, Ts, Tg, Tt, Tu; + Tg = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Th = BYTWJ(&(W[0]), Tg); + { + V Tj, Tq, Tl, To; + { + V Ti, Tp, Tk, Tn; + Ti = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 10]), Ti); + Tp = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tq = BYTWJ(&(W[TWVL * 30]), Tp); + Tk = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tl = BYTWJ(&(W[TWVL * 40]), Tk); + Tn = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + To = BYTWJ(&(W[TWVL * 20]), Tn); + } + Tw = VSUB(Tj, Tl); + Tx = VSUB(Tq, To); + Tm = VADD(Tj, Tl); + Tr = VADD(To, Tq); + Ts = VADD(Tm, Tr); + } + T3M = VADD(Th, Ts); + Ty = VFNMS(LDK(KP618033988), Tx, Tw); + T2E = VFMA(LDK(KP618033988), Tw, Tx); + Tt = VFNMS(LDK(KP250000000), Ts, Th); + Tu = VSUB(Tm, Tr); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + T2D = VFNMS(LDK(KP559016994), Tu, Tt); + Tz = VFNMS(LDK(KP244189809), Ty, Tv); + T2a = VFMA(LDK(KP667278218), Tv, Ty); + T3e = VFNMS(LDK(KP522847744), T2E, T2D); + T2U = VFNMS(LDK(KP987388751), T2D, T2E); + T2F = VFMA(LDK(KP893101515), T2E, T2D); + T2i = VFNMS(LDK(KP603558818), Ty, Tv); + } + { + V TM, TE, TJ, TN, TO, TP, TL, TQ, TR; + TL = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TM = BYTWJ(&(W[TWVL * 6]), TL); + { + V TB, TI, TD, TG; + { + V TA, TH, TC, TF; + TA = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TB = BYTWJ(&(W[TWVL * 46]), TA); + TH = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TI = BYTWJ(&(W[TWVL * 26]), TH); + TC = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TD = BYTWJ(&(W[TWVL * 16]), TC); + TF = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[TWVL * 36]), TF); + } + TE = VSUB(TB, TD); + TJ = VSUB(TG, TI); + TN = VADD(TD, TB); + TO = VADD(TI, TG); + TP = VADD(TN, TO); + } + T3N = VADD(TM, TP); + TK = VFMA(LDK(KP618033988), TJ, TE); + T2B = VFNMS(LDK(KP618033988), TE, TJ); + TQ = VFMS(LDK(KP250000000), TP, TM); + TR = VSUB(TN, TO); + TS = VFNMS(LDK(KP559016994), TR, TQ); + T2A = VFMA(LDK(KP559016994), TR, TQ); + TT = VFNMS(LDK(KP667278218), TS, TK); + T2b = VFMA(LDK(KP869845200), TS, TK); + T3f = VFNMS(LDK(KP494780565), T2A, T2B); + T2T = VFNMS(LDK(KP132830569), T2A, T2B); + T2C = VFMA(LDK(KP120146378), T2B, T2A); + T2j = VFNMS(LDK(KP786782374), TK, TS); + } + { + V TW, T1b, T1c, T11, T16, T17, TV, T18, T19; + TV = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TW = BYTWJ(&(W[TWVL * 2]), TV); + { + V TY, T15, T10, T13; + { + V TX, T14, TZ, T12; + TX = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TY = BYTWJ(&(W[TWVL * 12]), TX); + T14 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T15 = BYTWJ(&(W[TWVL * 32]), T14); + TZ = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T10 = BYTWJ(&(W[TWVL * 42]), TZ); + T12 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T13 = BYTWJ(&(W[TWVL * 22]), T12); + } + T1b = VSUB(TY, T10); + T1c = VSUB(T15, T13); + T11 = VADD(TY, T10); + T16 = VADD(T13, T15); + T17 = VADD(T11, T16); + } + T3P = VADD(TW, T17); + T1d = VFNMS(LDK(KP618033988), T1c, T1b); + T2H = VFMA(LDK(KP618033988), T1b, T1c); + T18 = VFNMS(LDK(KP250000000), T17, TW); + T19 = VSUB(T16, T11); + T1a = VFNMS(LDK(KP559016994), T19, T18); + T2I = VFMA(LDK(KP559016994), T19, T18); + T1e = VFNMS(LDK(KP522847744), T1d, T1a); + T28 = VFNMS(LDK(KP494780565), T1a, T1d); + T3c = VFNMS(LDK(KP667278218), T2I, T2H); + T2Q = VFNMS(LDK(KP059835404), T2H, T2I); + T2J = VFMA(LDK(KP066152395), T2I, T2H); + T2g = VFMA(LDK(KP447533225), T1d, T1a); + } + { + V T3Y, T40, T3L, T3S, T3T, T3U, T3Z, T3V; + { + V T3W, T3X, T3O, T3R; + T3W = VSUB(T3M, T3N); + T3X = VSUB(T3P, T3Q); + T3Y = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T3X, T3W)); + T40 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T3W, T3X)); + T3L = VADD(T1, Tc); + T3O = VADD(T3M, T3N); + T3R = VADD(T3P, T3Q); + T3S = VADD(T3O, T3R); + T3T = VFNMS(LDK(KP250000000), T3S, T3L); + T3U = VSUB(T3O, T3R); + } + ST(&(x[0]), VADD(T3S, T3L), ms, &(x[0])); + T3Z = VFNMS(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 10)]), VFMAI(T40, T3Z), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VFNMSI(T40, T3Z), ms, &(x[WS(rs, 1)])); + T3V = VFMA(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 5)]), VFNMSI(T3Y, T3V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VFMAI(T3Y, T3V), ms, &(x[0])); + } + { + V T2Z, T35, T3B, T3I, T2W, T38, T2O, T32, T2z, T3t, T3h, T3s, T3p, T3F, T3r; + V T3v, T3C, T3z, T3A; + T2Z = VFMA(LDK(KP734762448), T2U, T2T); + T35 = VFNMS(LDK(KP734762448), T2F, T2C); + T3z = VFMA(LDK(KP845997307), T3c, T3b); + T3A = VFMA(LDK(KP982009705), T3f, T3e); + T3B = VFMA(LDK(KP570584518), T3A, T3z); + T3I = VFNMS(LDK(KP669429328), T3z, T3A); + { + V T2S, T2V, T37, T36; + T2S = VFMA(LDK(KP772036680), T2R, T2Q); + T2V = VFNMS(LDK(KP734762448), T2U, T2T); + T36 = VFMA(LDK(KP772036680), T2M, T2J); + T37 = VFMA(LDK(KP522616830), T2V, T36); + T2W = VFMA(LDK(KP945422727), T2V, T2S); + T38 = VFNMS(LDK(KP690983005), T37, T2S); + } + { + V T2N, T2G, T31, T30; + T2N = VFNMS(LDK(KP772036680), T2M, T2J); + T2G = VFMA(LDK(KP734762448), T2F, T2C); + T30 = VFNMS(LDK(KP772036680), T2R, T2Q); + T31 = VFNMS(LDK(KP522616830), T2G, T30); + T2O = VFMA(LDK(KP956723877), T2N, T2G); + T32 = VFMA(LDK(KP763932022), T31, T2N); + } + { + V T3o, T3u, T3l, T3m, T3n; + T2z = VFNMS(LDK(KP559016994), Te, Td); + T3m = VFMA(LDK(KP447533225), T2B, T2A); + T3n = VFMA(LDK(KP578046249), T2D, T2E); + T3o = VFNMS(LDK(KP921078979), T3n, T3m); + T3t = VFMA(LDK(KP921078979), T3n, T3m); + { + V T3d, T3g, T3j, T3k; + T3d = VFNMS(LDK(KP845997307), T3c, T3b); + T3g = VFNMS(LDK(KP982009705), T3f, T3e); + T3h = VFMA(LDK(KP923225144), T3g, T3d); + T3u = VFNMS(LDK(KP923225144), T3g, T3d); + T3j = VFNMS(LDK(KP059835404), T2K, T2L); + T3k = VFMA(LDK(KP603558818), T2H, T2I); + T3l = VFMA(LDK(KP845997307), T3k, T3j); + T3s = VFNMS(LDK(KP845997307), T3k, T3j); + } + T3p = VFNMS(LDK(KP906616052), T3o, T3l); + T3F = VFNMS(LDK(KP904508497), T3u, T3s); + T3r = VFNMS(LDK(KP237294955), T3h, T2z); + T3v = VFNMS(LDK(KP997675361), T3u, T3t); + T3C = VFMA(LDK(KP906616052), T3o, T3l); + } + { + V T2P, T2Y, T3i, T3q; + T2P = VFMA(LDK(KP992114701), T2O, T2z); + T2Y = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T2X, T2W)); + ST(&(x[WS(rs, 3)]), VFNMSI(T2Y, T2P), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 22)]), VFMAI(T2Y, T2P), ms, &(x[0])); + T3i = VFMA(LDK(KP949179823), T3h, T2z); + T3q = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T2X, T3p)); + ST(&(x[WS(rs, 2)]), VFNMSI(T3q, T3i), ms, &(x[0])); + ST(&(x[WS(rs, 23)]), VFMAI(T3q, T3i), ms, &(x[WS(rs, 1)])); + } + { + V T34, T3a, T33, T39; + T33 = VFNMS(LDK(KP855719849), T32, T2Z); + T34 = VFMA(LDK(KP897376177), T33, T2z); + T39 = VFMA(LDK(KP855719849), T38, T35); + T3a = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T39, T2X)); + ST(&(x[WS(rs, 8)]), VFNMSI(T3a, T34), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VFMAI(T3a, T34), ms, &(x[WS(rs, 1)])); + } + { + V T3x, T3H, T3E, T3K, T3w; + T3w = VFMA(LDK(KP560319534), T3v, T3s); + T3x = VFNMS(LDK(KP949179823), T3w, T3r); + { + V T3G, T3y, T3J, T3D; + T3G = VFNMS(LDK(KP681693190), T3F, T3t); + T3H = VFNMS(LDK(KP860541664), T3G, T3r); + T3y = VFMA(LDK(KP262346850), T3p, T2X); + T3J = VFNMS(LDK(KP669429328), T3C, T3I); + T3D = VFMA(LDK(KP618033988), T3C, T3B); + T3E = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T3D, T3y)); + T3K = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T3J, T3y)); + } + ST(&(x[WS(rs, 13)]), VFNMSI(T3E, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T3K, T3H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VFMAI(T3E, T3x), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFNMSI(T3K, T3H), ms, &(x[0])); + } + } + { + V T2n, T2t, T1V, T22, T2l, T2w, T2d, T2q, Tf, T1I, T1A, T1E, T1B, T1Z, T1J; + V T1R, T1W, T1T, T1U; + T2n = VFNMS(LDK(KP912575812), T2j, T2i); + T2t = VFNMS(LDK(KP912575812), T2b, T2a); + T1T = VFNMS(LDK(KP829049696), TT, Tz); + T1U = VFNMS(LDK(KP831864738), T1y, T1e); + T1V = VFMA(LDK(KP559154169), T1U, T1T); + T22 = VFNMS(LDK(KP683113946), T1T, T1U); + { + V T2h, T2k, T2v, T2u; + T2h = VFMA(LDK(KP958953096), T2g, T2f); + T2k = VFMA(LDK(KP912575812), T2j, T2i); + T2u = VFMA(LDK(KP867381224), T28, T27); + T2v = VFMA(LDK(KP447417479), T2k, T2u); + T2l = VFMA(LDK(KP894834959), T2k, T2h); + T2w = VFNMS(LDK(KP763932022), T2v, T2h); + } + { + V T29, T2c, T2p, T2o; + T29 = VFNMS(LDK(KP867381224), T28, T27); + T2c = VFMA(LDK(KP912575812), T2b, T2a); + T2o = VFNMS(LDK(KP958953096), T2g, T2f); + T2p = VFMA(LDK(KP447417479), T2c, T2o); + T2d = VFNMS(LDK(KP809385824), T2c, T29); + T2q = VFMA(LDK(KP690983005), T2p, T29); + } + { + V T1Q, T1F, T1P, T1G, T1H; + Tf = VFMA(LDK(KP559016994), Te, Td); + T1G = VFMA(LDK(KP578046249), T1a, T1d); + T1H = VFMA(LDK(KP987388751), T1u, T1x); + T1I = VFNMS(LDK(KP831864738), T1H, T1G); + T1Q = VFMA(LDK(KP831864738), T1H, T1G); + { + V TU, T1z, T1C, T1D; + TU = VFMA(LDK(KP829049696), TT, Tz); + T1z = VFMA(LDK(KP831864738), T1y, T1e); + T1A = VFMA(LDK(KP904730450), T1z, TU); + T1F = VFNMS(LDK(KP904730450), T1z, TU); + T1C = VFMA(LDK(KP269969613), Tv, Ty); + T1D = VFMA(LDK(KP603558818), TK, TS); + T1E = VFMA(LDK(KP916574801), T1D, T1C); + T1P = VFNMS(LDK(KP916574801), T1D, T1C); + } + T1B = VFNMS(LDK(KP242145790), T1A, Tf); + T1Z = VADD(T1E, T1F); + T1J = VFNMS(LDK(KP904730450), T1I, T1F); + T1R = VFMA(LDK(KP904730450), T1Q, T1P); + T1W = VFNMS(LDK(KP904730450), T1Q, T1P); + } + { + V T25, T26, T2e, T2m; + T25 = VFMA(LDK(KP968583161), T1A, Tf); + T26 = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1R, T1O)); + ST(&(x[WS(rs, 1)]), VFNMSI(T26, T25), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VFMAI(T26, T25), ms, &(x[0])); + T2e = VFNMS(LDK(KP992114701), T2d, Tf); + T2m = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2l, T1O)); + ST(&(x[WS(rs, 4)]), VFMAI(T2m, T2e), ms, &(x[0])); + ST(&(x[WS(rs, 21)]), VFNMSI(T2m, T2e), ms, &(x[WS(rs, 1)])); + } + { + V T2s, T2y, T2r, T2x; + T2r = VFNMS(LDK(KP999544308), T2q, T2n); + T2s = VFNMS(LDK(KP803003575), T2r, Tf); + T2x = VFNMS(LDK(KP999544308), T2w, T2t); + T2y = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T2x, T1O)); + ST(&(x[WS(rs, 16)]), VFNMSI(T2y, T2s), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VFMAI(T2y, T2s), ms, &(x[WS(rs, 1)])); + } + { + V T1L, T21, T1Y, T24, T1K; + T1K = VFNMS(LDK(KP618033988), T1J, T1E); + T1L = VFNMS(LDK(KP876091699), T1K, T1B); + { + V T20, T1S, T23, T1X; + T20 = VFNMS(LDK(KP683113946), T1Z, T1I); + T21 = VFMA(LDK(KP792626838), T20, T1B); + T1S = VFNMS(LDK(KP242145790), T1R, T1O); + T23 = VFMA(LDK(KP617882369), T1W, T22); + T1X = VFMA(LDK(KP559016994), T1W, T1V); + T1Y = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1X, T1S)); + T24 = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T23, T1S)); + } + ST(&(x[WS(rs, 6)]), VFNMSI(T1Y, T1L), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFMAI(T24, T21), ms, &(x[0])); + ST(&(x[WS(rs, 19)]), VFMAI(T1Y, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(T24, T21), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t1fv_25"), twinstr, &GENUS, {67, 60, 181, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_25) (planner *p) { + X(kdft_dit_register) (p, t1fv_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t1fv_25 -include dft/simd/t1f.h */ + +/* + * This function contains 248 FP additions, 188 FP multiplications, + * (or, 170 additions, 110 multiplications, 78 fused multiply/add), + * 99 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V Tc, Tb, Td, Te, T1C, T2t, T1E, T1x, T2m, T1u, T3c, T2n, Ty, T2i, Tv; + V T38, T2j, TS, T2f, TP, T39, T2g, T1d, T2p, T1a, T3b, T2q; + { + V T7, T9, Ta, T2, T4, T5, T1D; + Tc = LD(&(x[0]), ms, &(x[0])); + { + V T6, T8, T1, T3; + T6 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 18]), T6); + T8 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 28]), T8); + Ta = VADD(T7, T9); + T1 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[TWVL * 8]), T1); + T3 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T4 = BYTWJ(&(W[TWVL * 38]), T3); + T5 = VADD(T2, T4); + } + Tb = VMUL(LDK(KP559016994), VSUB(T5, Ta)); + Td = VADD(T5, Ta); + Te = VFNMS(LDK(KP250000000), Td, Tc); + T1C = VSUB(T2, T4); + T1D = VSUB(T7, T9); + T2t = VMUL(LDK(KP951056516), T1D); + T1E = VFMA(LDK(KP951056516), T1C, VMUL(LDK(KP587785252), T1D)); + } + { + V T1r, T1l, T1n, T1o, T1g, T1i, T1j, T1q; + T1q = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1r = BYTWJ(&(W[TWVL * 4]), T1q); + { + V T1k, T1m, T1f, T1h; + T1k = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1l = BYTWJ(&(W[TWVL * 24]), T1k); + T1m = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1n = BYTWJ(&(W[TWVL * 34]), T1m); + T1o = VADD(T1l, T1n); + T1f = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1g = BYTWJ(&(W[TWVL * 14]), T1f); + T1h = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1i = BYTWJ(&(W[TWVL * 44]), T1h); + T1j = VADD(T1g, T1i); + } + { + V T1v, T1w, T1p, T1s, T1t; + T1v = VSUB(T1g, T1i); + T1w = VSUB(T1l, T1n); + T1x = VFMA(LDK(KP475528258), T1v, VMUL(LDK(KP293892626), T1w)); + T2m = VFNMS(LDK(KP293892626), T1v, VMUL(LDK(KP475528258), T1w)); + T1p = VMUL(LDK(KP559016994), VSUB(T1j, T1o)); + T1s = VADD(T1j, T1o); + T1t = VFNMS(LDK(KP250000000), T1s, T1r); + T1u = VADD(T1p, T1t); + T3c = VADD(T1r, T1s); + T2n = VSUB(T1t, T1p); + } + } + { + V Ts, Tm, To, Tp, Th, Tj, Tk, Tr; + Tr = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[0]), Tr); + { + V Tl, Tn, Tg, Ti; + Tl = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tm = BYTWJ(&(W[TWVL * 20]), Tl); + Tn = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + To = BYTWJ(&(W[TWVL * 30]), Tn); + Tp = VADD(Tm, To); + Tg = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 10]), Tg); + Ti = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 40]), Ti); + Tk = VADD(Th, Tj); + } + { + V Tw, Tx, Tq, Tt, Tu; + Tw = VSUB(Th, Tj); + Tx = VSUB(Tm, To); + Ty = VFMA(LDK(KP475528258), Tw, VMUL(LDK(KP293892626), Tx)); + T2i = VFNMS(LDK(KP293892626), Tw, VMUL(LDK(KP475528258), Tx)); + Tq = VMUL(LDK(KP559016994), VSUB(Tk, Tp)); + Tt = VADD(Tk, Tp); + Tu = VFNMS(LDK(KP250000000), Tt, Ts); + Tv = VADD(Tq, Tu); + T38 = VADD(Ts, Tt); + T2j = VSUB(Tu, Tq); + } + } + { + V TM, TG, TI, TJ, TB, TD, TE, TL; + TL = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TM = BYTWJ(&(W[TWVL * 6]), TL); + { + V TF, TH, TA, TC; + TF = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TG = BYTWJ(&(W[TWVL * 26]), TF); + TH = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TI = BYTWJ(&(W[TWVL * 36]), TH); + TJ = VADD(TG, TI); + TA = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TB = BYTWJ(&(W[TWVL * 16]), TA); + TC = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TD = BYTWJ(&(W[TWVL * 46]), TC); + TE = VADD(TB, TD); + } + { + V TQ, TR, TK, TN, TO; + TQ = VSUB(TB, TD); + TR = VSUB(TG, TI); + TS = VFMA(LDK(KP475528258), TQ, VMUL(LDK(KP293892626), TR)); + T2f = VFNMS(LDK(KP293892626), TQ, VMUL(LDK(KP475528258), TR)); + TK = VMUL(LDK(KP559016994), VSUB(TE, TJ)); + TN = VADD(TE, TJ); + TO = VFNMS(LDK(KP250000000), TN, TM); + TP = VADD(TK, TO); + T39 = VADD(TM, TN); + T2g = VSUB(TO, TK); + } + } + { + V T17, T11, T13, T14, TW, TY, TZ, T16; + T16 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T17 = BYTWJ(&(W[TWVL * 2]), T16); + { + V T10, T12, TV, TX; + T10 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T11 = BYTWJ(&(W[TWVL * 22]), T10); + T12 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T13 = BYTWJ(&(W[TWVL * 32]), T12); + T14 = VADD(T11, T13); + TV = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TW = BYTWJ(&(W[TWVL * 12]), TV); + TX = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TY = BYTWJ(&(W[TWVL * 42]), TX); + TZ = VADD(TW, TY); + } + { + V T1b, T1c, T15, T18, T19; + T1b = VSUB(TW, TY); + T1c = VSUB(T11, T13); + T1d = VFMA(LDK(KP475528258), T1b, VMUL(LDK(KP293892626), T1c)); + T2p = VFNMS(LDK(KP293892626), T1b, VMUL(LDK(KP475528258), T1c)); + T15 = VMUL(LDK(KP559016994), VSUB(TZ, T14)); + T18 = VADD(TZ, T14); + T19 = VFNMS(LDK(KP250000000), T18, T17); + T1a = VADD(T15, T19); + T3b = VADD(T17, T18); + T2q = VSUB(T19, T15); + } + } + { + V T3l, T3m, T3f, T3g, T3e, T3h, T3n, T3i; + { + V T3j, T3k, T3a, T3d; + T3j = VSUB(T38, T39); + T3k = VSUB(T3b, T3c); + T3l = VBYI(VFMA(LDK(KP951056516), T3j, VMUL(LDK(KP587785252), T3k))); + T3m = VBYI(VFNMS(LDK(KP587785252), T3j, VMUL(LDK(KP951056516), T3k))); + T3f = VADD(Tc, Td); + T3a = VADD(T38, T39); + T3d = VADD(T3b, T3c); + T3g = VADD(T3a, T3d); + T3e = VMUL(LDK(KP559016994), VSUB(T3a, T3d)); + T3h = VFNMS(LDK(KP250000000), T3g, T3f); + } + ST(&(x[0]), VADD(T3f, T3g), ms, &(x[0])); + T3n = VSUB(T3h, T3e); + ST(&(x[WS(rs, 10)]), VADD(T3m, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VSUB(T3n, T3m), ms, &(x[WS(rs, 1)])); + T3i = VADD(T3e, T3h); + ST(&(x[WS(rs, 5)]), VSUB(T3i, T3l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VADD(T3l, T3i), ms, &(x[0])); + } + { + V Tf, T1Z, T20, T21, T29, T2a, T2b, T26, T27, T28, T22, T23, T24, T1L, T1U; + V T1Q, T1S, T1A, T1V, T1N, T1O, T2d, T2e; + Tf = VADD(Tb, Te); + T1Z = VFMA(LDK(KP1_688655851), Ty, VMUL(LDK(KP535826794), Tv)); + T20 = VFMA(LDK(KP1_541026485), TS, VMUL(LDK(KP637423989), TP)); + T21 = VSUB(T1Z, T20); + T29 = VFMA(LDK(KP851558583), T1d, VMUL(LDK(KP904827052), T1a)); + T2a = VFMA(LDK(KP1_984229402), T1x, VMUL(LDK(KP125333233), T1u)); + T2b = VADD(T29, T2a); + T26 = VFNMS(LDK(KP844327925), Tv, VMUL(LDK(KP1_071653589), Ty)); + T27 = VFNMS(LDK(KP1_274847979), TS, VMUL(LDK(KP770513242), TP)); + T28 = VADD(T26, T27); + T22 = VFNMS(LDK(KP425779291), T1a, VMUL(LDK(KP1_809654104), T1d)); + T23 = VFNMS(LDK(KP992114701), T1u, VMUL(LDK(KP250666467), T1x)); + T24 = VADD(T22, T23); + { + V T1F, T1G, T1H, T1I, T1J, T1K; + T1F = VFMA(LDK(KP1_937166322), Ty, VMUL(LDK(KP248689887), Tv)); + T1G = VFMA(LDK(KP1_071653589), TS, VMUL(LDK(KP844327925), TP)); + T1H = VADD(T1F, T1G); + T1I = VFMA(LDK(KP1_752613360), T1d, VMUL(LDK(KP481753674), T1a)); + T1J = VFMA(LDK(KP1_457937254), T1x, VMUL(LDK(KP684547105), T1u)); + T1K = VADD(T1I, T1J); + T1L = VADD(T1H, T1K); + T1U = VSUB(T1J, T1I); + T1Q = VMUL(LDK(KP559016994), VSUB(T1K, T1H)); + T1S = VSUB(T1G, T1F); + } + { + V Tz, TT, TU, T1e, T1y, T1z; + Tz = VFNMS(LDK(KP497379774), Ty, VMUL(LDK(KP968583161), Tv)); + TT = VFNMS(LDK(KP1_688655851), TS, VMUL(LDK(KP535826794), TP)); + TU = VADD(Tz, TT); + T1e = VFNMS(LDK(KP963507348), T1d, VMUL(LDK(KP876306680), T1a)); + T1y = VFNMS(LDK(KP1_369094211), T1x, VMUL(LDK(KP728968627), T1u)); + T1z = VADD(T1e, T1y); + T1A = VADD(TU, T1z); + T1V = VMUL(LDK(KP559016994), VSUB(TU, T1z)); + T1N = VSUB(TT, Tz); + T1O = VSUB(T1e, T1y); + } + { + V T1B, T1M, T25, T2c; + T1B = VADD(Tf, T1A); + T1M = VBYI(VADD(T1E, T1L)); + ST(&(x[WS(rs, 1)]), VSUB(T1B, T1M), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VADD(T1B, T1M), ms, &(x[0])); + T25 = VADD(Tf, VADD(T21, T24)); + T2c = VBYI(VADD(T1E, VSUB(T28, T2b))); + ST(&(x[WS(rs, 21)]), VSUB(T25, T2c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T25, T2c), ms, &(x[0])); + } + T2d = VBYI(VADD(T1E, VFMA(LDK(KP309016994), T28, VFMA(LDK(KP587785252), VSUB(T23, T22), VFNMS(LDK(KP951056516), VADD(T1Z, T20), VMUL(LDK(KP809016994), T2b)))))); + T2e = VFMA(LDK(KP309016994), T21, VFMA(LDK(KP951056516), VSUB(T26, T27), VFMA(LDK(KP587785252), VSUB(T2a, T29), VFNMS(LDK(KP809016994), T24, Tf)))); + ST(&(x[WS(rs, 9)]), VADD(T2d, T2e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VSUB(T2e, T2d), ms, &(x[0])); + { + V T1R, T1X, T1W, T1Y, T1P, T1T; + T1P = VFMS(LDK(KP250000000), T1L, T1E); + T1R = VBYI(VADD(VFMA(LDK(KP587785252), T1N, VMUL(LDK(KP951056516), T1O)), VSUB(T1P, T1Q))); + T1X = VBYI(VADD(VFNMS(LDK(KP587785252), T1O, VMUL(LDK(KP951056516), T1N)), VADD(T1P, T1Q))); + T1T = VFNMS(LDK(KP250000000), T1A, Tf); + T1W = VFMA(LDK(KP587785252), T1S, VFNMS(LDK(KP951056516), T1U, VSUB(T1T, T1V))); + T1Y = VFMA(LDK(KP951056516), T1S, VADD(T1V, VFMA(LDK(KP587785252), T1U, T1T))); + ST(&(x[WS(rs, 11)]), VADD(T1R, T1W), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VSUB(T1Y, T1X), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 14)]), VSUB(T1W, T1R), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T1X, T1Y), ms, &(x[0])); + } + } + { + V T2u, T2w, T2h, T2k, T2l, T2A, T2B, T2C, T2o, T2r, T2s, T2x, T2y, T2z, T2M; + V T2X, T2N, T2W, T2R, T31, T2U, T30, T2E, T2F; + T2u = VFNMS(LDK(KP587785252), T1C, T2t); + T2w = VSUB(Te, Tb); + T2h = VFNMS(LDK(KP125333233), T2g, VMUL(LDK(KP1_984229402), T2f)); + T2k = VFMA(LDK(KP1_457937254), T2i, VMUL(LDK(KP684547105), T2j)); + T2l = VSUB(T2h, T2k); + T2A = VFNMS(LDK(KP1_996053456), T2p, VMUL(LDK(KP062790519), T2q)); + T2B = VFMA(LDK(KP1_541026485), T2m, VMUL(LDK(KP637423989), T2n)); + T2C = VSUB(T2A, T2B); + T2o = VFNMS(LDK(KP770513242), T2n, VMUL(LDK(KP1_274847979), T2m)); + T2r = VFMA(LDK(KP125581039), T2p, VMUL(LDK(KP998026728), T2q)); + T2s = VSUB(T2o, T2r); + T2x = VFNMS(LDK(KP1_369094211), T2i, VMUL(LDK(KP728968627), T2j)); + T2y = VFMA(LDK(KP250666467), T2f, VMUL(LDK(KP992114701), T2g)); + T2z = VSUB(T2x, T2y); + { + V T2G, T2H, T2I, T2J, T2K, T2L; + T2G = VFNMS(LDK(KP481753674), T2j, VMUL(LDK(KP1_752613360), T2i)); + T2H = VFMA(LDK(KP851558583), T2f, VMUL(LDK(KP904827052), T2g)); + T2I = VSUB(T2G, T2H); + T2J = VFNMS(LDK(KP844327925), T2q, VMUL(LDK(KP1_071653589), T2p)); + T2K = VFNMS(LDK(KP998026728), T2n, VMUL(LDK(KP125581039), T2m)); + T2L = VADD(T2J, T2K); + T2M = VMUL(LDK(KP559016994), VSUB(T2I, T2L)); + T2X = VSUB(T2J, T2K); + T2N = VADD(T2I, T2L); + T2W = VADD(T2G, T2H); + } + { + V T2P, T2Q, T2Y, T2S, T2T, T2Z; + T2P = VFNMS(LDK(KP425779291), T2g, VMUL(LDK(KP1_809654104), T2f)); + T2Q = VFMA(LDK(KP963507348), T2i, VMUL(LDK(KP876306680), T2j)); + T2Y = VADD(T2Q, T2P); + T2S = VFMA(LDK(KP1_688655851), T2p, VMUL(LDK(KP535826794), T2q)); + T2T = VFMA(LDK(KP1_996053456), T2m, VMUL(LDK(KP062790519), T2n)); + T2Z = VADD(T2S, T2T); + T2R = VSUB(T2P, T2Q); + T31 = VADD(T2Y, T2Z); + T2U = VSUB(T2S, T2T); + T30 = VMUL(LDK(KP559016994), VSUB(T2Y, T2Z)); + } + { + V T36, T37, T2v, T2D; + T36 = VBYI(VADD(T2u, T2N)); + T37 = VADD(T2w, T31); + ST(&(x[WS(rs, 2)]), VADD(T36, T37), ms, &(x[0])); + ST(&(x[WS(rs, 23)]), VSUB(T37, T36), ms, &(x[WS(rs, 1)])); + T2v = VBYI(VSUB(VADD(T2l, T2s), T2u)); + T2D = VADD(T2w, VADD(T2z, T2C)); + ST(&(x[WS(rs, 3)]), VADD(T2v, T2D), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 22)]), VSUB(T2D, T2v), ms, &(x[0])); + } + T2E = VFMA(LDK(KP309016994), T2z, VFNMS(LDK(KP809016994), T2C, VFNMS(LDK(KP587785252), VADD(T2r, T2o), VFNMS(LDK(KP951056516), VADD(T2k, T2h), T2w)))); + T2F = VBYI(VSUB(VFNMS(LDK(KP587785252), VADD(T2A, T2B), VFNMS(LDK(KP809016994), T2s, VFNMS(LDK(KP951056516), VADD(T2x, T2y), VMUL(LDK(KP309016994), T2l)))), T2u)); + ST(&(x[WS(rs, 17)]), VSUB(T2E, T2F), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VADD(T2E, T2F), ms, &(x[0])); + { + V T2V, T34, T33, T35, T2O, T32; + T2O = VFNMS(LDK(KP250000000), T2N, T2u); + T2V = VBYI(VADD(T2M, VADD(T2O, VFNMS(LDK(KP587785252), T2U, VMUL(LDK(KP951056516), T2R))))); + T34 = VBYI(VADD(T2O, VSUB(VFMA(LDK(KP587785252), T2R, VMUL(LDK(KP951056516), T2U)), T2M))); + T32 = VFNMS(LDK(KP250000000), T31, T2w); + T33 = VFMA(LDK(KP951056516), T2W, VFMA(LDK(KP587785252), T2X, VADD(T30, T32))); + T35 = VFMA(LDK(KP587785252), T2W, VSUB(VFNMS(LDK(KP951056516), T2X, T32), T30)); + ST(&(x[WS(rs, 7)]), VADD(T2V, T33), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T35, T34), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 18)]), VSUB(T33, T2V), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T34, T35), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t1fv_25"), twinstr, &GENUS, {170, 110, 78, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_25) (planner *p) { + X(kdft_dit_register) (p, t1fv_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_3.c new file mode 100644 index 000000000..c03272042 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_3.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1fv_3 -include dft/simd/t1f.h */ + +/* + * This function contains 8 FP additions, 8 FP multiplications, + * (or, 5 additions, 5 multiplications, 3 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T1, T3, T5, T6, T2, T4, T7, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 2]), T4); + T6 = VADD(T3, T5); + ST(&(x[0]), VADD(T1, T6), ms, &(x[0])); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T8 = VMUL(LDK(KP866025403), VSUB(T5, T3)); + ST(&(x[WS(rs, 2)]), VFNMSI(T8, T7), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VFMAI(T8, T7), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1fv_3"), twinstr, &GENUS, {5, 5, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_3) (planner *p) { + X(kdft_dit_register) (p, t1fv_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 3 -name t1fv_3 -include dft/simd/t1f.h */ + +/* + * This function contains 8 FP additions, 6 FP multiplications, + * (or, 7 additions, 5 multiplications, 1 fused multiply/add), + * 12 stack variables, 2 constants, and 6 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_3(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(3, rs)) { + V T1, T3, T5, T6, T2, T4, T7, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 2]), T4); + T6 = VADD(T3, T5); + ST(&(x[0]), VADD(T1, T6), ms, &(x[0])); + T7 = VFNMS(LDK(KP500000000), T6, T1); + T8 = VBYI(VMUL(LDK(KP866025403), VSUB(T5, T3))); + ST(&(x[WS(rs, 2)]), VSUB(T7, T8), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T7, T8), ms, &(x[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 3, XSIMD_STRING("t1fv_3"), twinstr, &GENUS, {7, 5, 1, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_3) (planner *p) { + X(kdft_dit_register) (p, t1fv_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_32.c new file mode 100644 index 000000000..b371e286f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_32.c @@ -0,0 +1,898 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:29 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t1fv_32 -include dft/simd/t1f.h */ + +/* + * This function contains 217 FP additions, 160 FP multiplications, + * (or, 119 additions, 62 multiplications, 98 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1z, T2o, T32, Tf, T1A, T2r, T3f, TC, T1D, T2L, T34, Tr, T1C, T2O; + V T33, T1k, T20, T2F, T3b, T1r, T21, T2C, T3a, TV, T1X, T2y, T38, T12, T1Y; + V T2v, T37; + { + V T1, T1y, T3, T1w, T1x, T2, T1v, T2m, T2n; + T1 = LD(&(x[0]), ms, &(x[0])); + T1x = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1y = BYTWJ(&(W[TWVL * 46]), T1x); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 30]), T2); + T1v = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1w = BYTWJ(&(W[TWVL * 14]), T1v); + T4 = VSUB(T1, T3); + T1z = VSUB(T1w, T1y); + T2m = VADD(T1, T3); + T2n = VADD(T1w, T1y); + T2o = VADD(T2m, T2n); + T32 = VSUB(T2m, T2n); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2p, T2q; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + T1A = VSUB(Te, T9); + T2p = VADD(T6, T8); + T2q = VADD(Tb, Td); + T2r = VADD(T2p, T2q); + T3f = VSUB(T2q, T2p); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Tt = BYTWJ(&(W[TWVL * 58]), Ts); + Tz = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 10]), Tz); + Tu = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tv = BYTWJ(&(W[TWVL * 26]), Tu); + Tx = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + Ty = BYTWJ(&(W[TWVL * 42]), Tx); + } + { + V Tw, TB, T2J, T2K; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFNMS(LDK(KP414213562), TB, Tw); + T1D = VFMA(LDK(KP414213562), Tw, TB); + T2J = VADD(Tt, Tv); + T2K = VADD(TA, Ty); + T2L = VADD(T2J, T2K); + T34 = VSUB(T2J, T2K); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2M, T2N; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFNMS(LDK(KP414213562), Tq, Tl); + T1C = VFMA(LDK(KP414213562), Tl, Tq); + T2M = VADD(Ti, Tk); + T2N = VADD(Tn, Tp); + T2O = VADD(T2M, T2N); + T33 = VSUB(T2M, T2N); + } + } + { + V T15, T17, T1o, T1m, T1f, T1h, T1i, T1a, T1c, T1d; + { + V T14, T16, T1n, T1l; + T14 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T15 = BYTWJ(&(W[TWVL * 60]), T14); + T16 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T17 = BYTWJ(&(W[TWVL * 28]), T16); + T1n = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1o = BYTWJ(&(W[TWVL * 12]), T1n); + T1l = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1m = BYTWJ(&(W[TWVL * 44]), T1l); + { + V T1e, T1g, T19, T1b; + T1e = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1f = BYTWJ(&(W[TWVL * 52]), T1e); + T1g = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1h = BYTWJ(&(W[TWVL * 20]), T1g); + T1i = VSUB(T1f, T1h); + T19 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1a = BYTWJ(&(W[TWVL * 4]), T19); + T1b = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1c = BYTWJ(&(W[TWVL * 36]), T1b); + T1d = VSUB(T1a, T1c); + } + } + { + V T18, T1j, T2D, T2E; + T18 = VSUB(T15, T17); + T1j = VADD(T1d, T1i); + T1k = VFMA(LDK(KP707106781), T1j, T18); + T20 = VFNMS(LDK(KP707106781), T1j, T18); + T2D = VADD(T1a, T1c); + T2E = VADD(T1f, T1h); + T2F = VADD(T2D, T2E); + T3b = VSUB(T2E, T2D); + } + { + V T1p, T1q, T2A, T2B; + T1p = VSUB(T1m, T1o); + T1q = VSUB(T1i, T1d); + T1r = VFMA(LDK(KP707106781), T1q, T1p); + T21 = VFNMS(LDK(KP707106781), T1q, T1p); + T2A = VADD(T15, T17); + T2B = VADD(T1o, T1m); + T2C = VADD(T2A, T2B); + T3a = VSUB(T2A, T2B); + } + } + { + V TG, TI, TZ, TX, TQ, TS, TT, TL, TN, TO; + { + V TF, TH, TY, TW; + TF = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[0]), TF); + TH = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TI = BYTWJ(&(W[TWVL * 32]), TH); + TY = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + TZ = BYTWJ(&(W[TWVL * 48]), TY); + TW = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TX = BYTWJ(&(W[TWVL * 16]), TW); + { + V TP, TR, TK, TM; + TP = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TQ = BYTWJ(&(W[TWVL * 56]), TP); + TR = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TS = BYTWJ(&(W[TWVL * 24]), TR); + TT = VSUB(TQ, TS); + TK = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TL = BYTWJ(&(W[TWVL * 8]), TK); + TM = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TN = BYTWJ(&(W[TWVL * 40]), TM); + TO = VSUB(TL, TN); + } + } + { + V TJ, TU, T2w, T2x; + TJ = VSUB(TG, TI); + TU = VADD(TO, TT); + TV = VFMA(LDK(KP707106781), TU, TJ); + T1X = VFNMS(LDK(KP707106781), TU, TJ); + T2w = VADD(TL, TN); + T2x = VADD(TQ, TS); + T2y = VADD(T2w, T2x); + T38 = VSUB(T2w, T2x); + } + { + V T10, T11, T2t, T2u; + T10 = VSUB(TX, TZ); + T11 = VSUB(TO, TT); + T12 = VFMA(LDK(KP707106781), T11, T10); + T1Y = VFNMS(LDK(KP707106781), T11, T10); + T2t = VADD(TG, TI); + T2u = VADD(TX, TZ); + T2v = VADD(T2t, T2u); + T37 = VSUB(T2t, T2u); + } + } + { + V T2W, T30, T2Z, T31; + { + V T2U, T2V, T2X, T2Y; + T2U = VADD(T2o, T2r); + T2V = VADD(T2O, T2L); + T2W = VADD(T2U, T2V); + T30 = VSUB(T2U, T2V); + T2X = VADD(T2v, T2y); + T2Y = VADD(T2C, T2F); + T2Z = VADD(T2X, T2Y); + T31 = VSUB(T2Y, T2X); + } + ST(&(x[WS(rs, 16)]), VSUB(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T31, T30), ms, &(x[0])); + ST(&(x[0]), VADD(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VFNMSI(T31, T30), ms, &(x[0])); + } + { + V T2s, T2P, T2H, T2Q, T2z, T2G; + T2s = VSUB(T2o, T2r); + T2P = VSUB(T2L, T2O); + T2z = VSUB(T2v, T2y); + T2G = VSUB(T2C, T2F); + T2H = VADD(T2z, T2G); + T2Q = VSUB(T2G, T2z); + { + V T2I, T2R, T2S, T2T; + T2I = VFNMS(LDK(KP707106781), T2H, T2s); + T2R = VFNMS(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 12)]), VFNMSI(T2R, T2I), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VFMAI(T2R, T2I), ms, &(x[0])); + T2S = VFMA(LDK(KP707106781), T2H, T2s); + T2T = VFMA(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 28)]), VFNMSI(T2T, T2S), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T2T, T2S), ms, &(x[0])); + } + } + { + V T36, T3o, T3h, T3r, T3d, T3s, T3k, T3p, T35, T3g; + T35 = VADD(T33, T34); + T36 = VFMA(LDK(KP707106781), T35, T32); + T3o = VFNMS(LDK(KP707106781), T35, T32); + T3g = VSUB(T34, T33); + T3h = VFMA(LDK(KP707106781), T3g, T3f); + T3r = VFNMS(LDK(KP707106781), T3g, T3f); + { + V T39, T3c, T3i, T3j; + T39 = VFNMS(LDK(KP414213562), T38, T37); + T3c = VFNMS(LDK(KP414213562), T3b, T3a); + T3d = VADD(T39, T3c); + T3s = VSUB(T3c, T39); + T3i = VFMA(LDK(KP414213562), T3a, T3b); + T3j = VFMA(LDK(KP414213562), T37, T38); + T3k = VSUB(T3i, T3j); + T3p = VADD(T3j, T3i); + } + { + V T3e, T3l, T3u, T3v; + T3e = VFNMS(LDK(KP923879532), T3d, T36); + T3l = VFNMS(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 14)]), VFNMSI(T3l, T3e), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3l, T3e), ms, &(x[0])); + T3u = VFMA(LDK(KP923879532), T3p, T3o); + T3v = VFNMS(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 6)]), VFNMSI(T3v, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3v, T3u), ms, &(x[0])); + } + { + V T3m, T3n, T3q, T3t; + T3m = VFMA(LDK(KP923879532), T3d, T36); + T3n = VFMA(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 30)]), VFNMSI(T3n, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3n, T3m), ms, &(x[0])); + T3q = VFNMS(LDK(KP923879532), T3p, T3o); + T3t = VFMA(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 10)]), VFMAI(T3t, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VFNMSI(T3t, T3q), ms, &(x[0])); + } + } + { + V TE, T1M, T1I, T1N, T1t, T1Q, T1F, T1P; + { + V Tg, TD, T1G, T1H; + Tg = VFMA(LDK(KP707106781), Tf, T4); + TD = VADD(Tr, TC); + TE = VFMA(LDK(KP923879532), TD, Tg); + T1M = VFNMS(LDK(KP923879532), TD, Tg); + T1G = VFMA(LDK(KP198912367), TV, T12); + T1H = VFMA(LDK(KP198912367), T1k, T1r); + T1I = VSUB(T1G, T1H); + T1N = VADD(T1G, T1H); + } + { + V T13, T1s, T1B, T1E; + T13 = VFNMS(LDK(KP198912367), T12, TV); + T1s = VFNMS(LDK(KP198912367), T1r, T1k); + T1t = VADD(T13, T1s); + T1Q = VSUB(T1s, T13); + T1B = VFNMS(LDK(KP707106781), T1A, T1z); + T1E = VSUB(T1C, T1D); + T1F = VFMA(LDK(KP923879532), T1E, T1B); + T1P = VFNMS(LDK(KP923879532), T1E, T1B); + } + { + V T1u, T1J, T1S, T1T; + T1u = VFNMS(LDK(KP980785280), T1t, TE); + T1J = VFNMS(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 17)]), VFNMSI(T1J, T1u), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T1J, T1u), ms, &(x[WS(rs, 1)])); + T1S = VFMA(LDK(KP980785280), T1N, T1M); + T1T = VFMA(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 7)]), VFMAI(T1T, T1S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFNMSI(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VFMA(LDK(KP980785280), T1t, TE); + T1L = VFMA(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 1)]), VFNMSI(T1L, T1K), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VFMAI(T1L, T1K), ms, &(x[WS(rs, 1)])); + T1O = VFNMS(LDK(KP980785280), T1N, T1M); + T1R = VFNMS(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 9)]), VFNMSI(T1R, T1O), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VFMAI(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2e, T2a, T2f, T23, T2i, T27, T2h; + { + V T1U, T1V, T28, T29; + T1U = VFNMS(LDK(KP707106781), Tf, T4); + T1V = VADD(T1C, T1D); + T1W = VFMA(LDK(KP923879532), T1V, T1U); + T2e = VFNMS(LDK(KP923879532), T1V, T1U); + T28 = VFNMS(LDK(KP668178637), T1X, T1Y); + T29 = VFNMS(LDK(KP668178637), T20, T21); + T2a = VSUB(T28, T29); + T2f = VADD(T28, T29); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP668178637), T1Y, T1X); + T22 = VFMA(LDK(KP668178637), T21, T20); + T23 = VADD(T1Z, T22); + T2i = VSUB(T22, T1Z); + T25 = VFMA(LDK(KP707106781), T1A, T1z); + T26 = VSUB(TC, Tr); + T27 = VFMA(LDK(KP923879532), T26, T25); + T2h = VFNMS(LDK(KP923879532), T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VFNMS(LDK(KP831469612), T23, T1W); + T2b = VFNMS(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 13)]), VFNMSI(T2b, T24), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VFMAI(T2b, T24), ms, &(x[WS(rs, 1)])); + T2k = VFNMS(LDK(KP831469612), T2f, T2e); + T2l = VFNMS(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 5)]), VFNMSI(T2l, T2k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFMAI(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VFMA(LDK(KP831469612), T23, T1W); + T2d = VFMA(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 29)]), VFNMSI(T2d, T2c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T2d, T2c), ms, &(x[WS(rs, 1)])); + T2g = VFMA(LDK(KP831469612), T2f, T2e); + T2j = VFMA(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 11)]), VFMAI(T2j, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VFNMSI(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t1fv_32"), twinstr, &GENUS, {119, 62, 98, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_32) (planner *p) { + X(kdft_dit_register) (p, t1fv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t1fv_32 -include dft/simd/t1f.h */ + +/* + * This function contains 217 FP additions, 104 FP multiplications, + * (or, 201 additions, 88 multiplications, 16 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1A, T2o, T32, Tf, T1v, T2r, T3f, TC, T1C, T2L, T34, Tr, T1D, T2O; + V T33, T1k, T20, T2F, T3b, T1r, T21, T2C, T3a, TV, T1X, T2y, T38, T12, T1Y; + V T2v, T37; + { + V T1, T1z, T3, T1x, T1y, T2, T1w, T2m, T2n; + T1 = LD(&(x[0]), ms, &(x[0])); + T1y = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1z = BYTWJ(&(W[TWVL * 46]), T1y); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 30]), T2); + T1w = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1x = BYTWJ(&(W[TWVL * 14]), T1w); + T4 = VSUB(T1, T3); + T1A = VSUB(T1x, T1z); + T2m = VADD(T1, T3); + T2n = VADD(T1x, T1z); + T2o = VADD(T2m, T2n); + T32 = VSUB(T2m, T2n); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2p, T2q; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + T1v = VMUL(LDK(KP707106781), VSUB(Te, T9)); + T2p = VADD(T6, T8); + T2q = VADD(Tb, Td); + T2r = VADD(T2p, T2q); + T3f = VSUB(T2q, T2p); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Tt = BYTWJ(&(W[TWVL * 58]), Ts); + Tz = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 42]), Tz); + Tu = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tv = BYTWJ(&(W[TWVL * 26]), Tu); + Tx = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ty = BYTWJ(&(W[TWVL * 10]), Tx); + } + { + V Tw, TB, T2J, T2K; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFMA(LDK(KP923879532), Tw, VMUL(LDK(KP382683432), TB)); + T1C = VFNMS(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T2J = VADD(Tt, Tv); + T2K = VADD(Ty, TA); + T2L = VADD(T2J, T2K); + T34 = VSUB(T2J, T2K); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2M, T2N; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + T1D = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + T2M = VADD(Ti, Tk); + T2N = VADD(Tn, Tp); + T2O = VADD(T2M, T2N); + T33 = VSUB(T2M, T2N); + } + } + { + V T15, T17, T1p, T1n, T1f, T1h, T1i, T1a, T1c, T1d; + { + V T14, T16, T1o, T1m; + T14 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T15 = BYTWJ(&(W[TWVL * 60]), T14); + T16 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T17 = BYTWJ(&(W[TWVL * 28]), T16); + T1o = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1p = BYTWJ(&(W[TWVL * 44]), T1o); + T1m = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1n = BYTWJ(&(W[TWVL * 12]), T1m); + { + V T1e, T1g, T19, T1b; + T1e = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1f = BYTWJ(&(W[TWVL * 52]), T1e); + T1g = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1h = BYTWJ(&(W[TWVL * 20]), T1g); + T1i = VSUB(T1f, T1h); + T19 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1a = BYTWJ(&(W[TWVL * 4]), T19); + T1b = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1c = BYTWJ(&(W[TWVL * 36]), T1b); + T1d = VSUB(T1a, T1c); + } + } + { + V T18, T1j, T2D, T2E; + T18 = VSUB(T15, T17); + T1j = VMUL(LDK(KP707106781), VADD(T1d, T1i)); + T1k = VADD(T18, T1j); + T20 = VSUB(T18, T1j); + T2D = VADD(T1a, T1c); + T2E = VADD(T1f, T1h); + T2F = VADD(T2D, T2E); + T3b = VSUB(T2E, T2D); + } + { + V T1l, T1q, T2A, T2B; + T1l = VMUL(LDK(KP707106781), VSUB(T1i, T1d)); + T1q = VSUB(T1n, T1p); + T1r = VSUB(T1l, T1q); + T21 = VADD(T1q, T1l); + T2A = VADD(T15, T17); + T2B = VADD(T1n, T1p); + T2C = VADD(T2A, T2B); + T3a = VSUB(T2A, T2B); + } + } + { + V TG, TI, T10, TY, TQ, TS, TT, TL, TN, TO; + { + V TF, TH, TZ, TX; + TF = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[0]), TF); + TH = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TI = BYTWJ(&(W[TWVL * 32]), TH); + TZ = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T10 = BYTWJ(&(W[TWVL * 48]), TZ); + TX = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TY = BYTWJ(&(W[TWVL * 16]), TX); + { + V TP, TR, TK, TM; + TP = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TQ = BYTWJ(&(W[TWVL * 56]), TP); + TR = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TS = BYTWJ(&(W[TWVL * 24]), TR); + TT = VSUB(TQ, TS); + TK = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TL = BYTWJ(&(W[TWVL * 8]), TK); + TM = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TN = BYTWJ(&(W[TWVL * 40]), TM); + TO = VSUB(TL, TN); + } + } + { + V TJ, TU, T2w, T2x; + TJ = VSUB(TG, TI); + TU = VMUL(LDK(KP707106781), VADD(TO, TT)); + TV = VADD(TJ, TU); + T1X = VSUB(TJ, TU); + T2w = VADD(TL, TN); + T2x = VADD(TQ, TS); + T2y = VADD(T2w, T2x); + T38 = VSUB(T2x, T2w); + } + { + V TW, T11, T2t, T2u; + TW = VMUL(LDK(KP707106781), VSUB(TT, TO)); + T11 = VSUB(TY, T10); + T12 = VSUB(TW, T11); + T1Y = VADD(T11, TW); + T2t = VADD(TG, TI); + T2u = VADD(TY, T10); + T2v = VADD(T2t, T2u); + T37 = VSUB(T2t, T2u); + } + } + { + V T2W, T30, T2Z, T31; + { + V T2U, T2V, T2X, T2Y; + T2U = VADD(T2o, T2r); + T2V = VADD(T2O, T2L); + T2W = VADD(T2U, T2V); + T30 = VSUB(T2U, T2V); + T2X = VADD(T2v, T2y); + T2Y = VADD(T2C, T2F); + T2Z = VADD(T2X, T2Y); + T31 = VBYI(VSUB(T2Y, T2X)); + } + ST(&(x[WS(rs, 16)]), VSUB(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T30, T31), ms, &(x[0])); + ST(&(x[0]), VADD(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VSUB(T30, T31), ms, &(x[0])); + } + { + V T2s, T2P, T2H, T2Q, T2z, T2G; + T2s = VSUB(T2o, T2r); + T2P = VSUB(T2L, T2O); + T2z = VSUB(T2v, T2y); + T2G = VSUB(T2C, T2F); + T2H = VMUL(LDK(KP707106781), VADD(T2z, T2G)); + T2Q = VMUL(LDK(KP707106781), VSUB(T2G, T2z)); + { + V T2I, T2R, T2S, T2T; + T2I = VADD(T2s, T2H); + T2R = VBYI(VADD(T2P, T2Q)); + ST(&(x[WS(rs, 28)]), VSUB(T2I, T2R), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T2I, T2R), ms, &(x[0])); + T2S = VSUB(T2s, T2H); + T2T = VBYI(VSUB(T2Q, T2P)); + ST(&(x[WS(rs, 20)]), VSUB(T2S, T2T), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T2S, T2T), ms, &(x[0])); + } + } + { + V T36, T3r, T3h, T3p, T3d, T3o, T3k, T3s, T35, T3g; + T35 = VMUL(LDK(KP707106781), VADD(T33, T34)); + T36 = VADD(T32, T35); + T3r = VSUB(T32, T35); + T3g = VMUL(LDK(KP707106781), VSUB(T34, T33)); + T3h = VADD(T3f, T3g); + T3p = VSUB(T3g, T3f); + { + V T39, T3c, T3i, T3j; + T39 = VFMA(LDK(KP923879532), T37, VMUL(LDK(KP382683432), T38)); + T3c = VFNMS(LDK(KP382683432), T3b, VMUL(LDK(KP923879532), T3a)); + T3d = VADD(T39, T3c); + T3o = VSUB(T3c, T39); + T3i = VFNMS(LDK(KP382683432), T37, VMUL(LDK(KP923879532), T38)); + T3j = VFMA(LDK(KP382683432), T3a, VMUL(LDK(KP923879532), T3b)); + T3k = VADD(T3i, T3j); + T3s = VSUB(T3j, T3i); + } + { + V T3e, T3l, T3u, T3v; + T3e = VADD(T36, T3d); + T3l = VBYI(VADD(T3h, T3k)); + ST(&(x[WS(rs, 30)]), VSUB(T3e, T3l), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T3e, T3l), ms, &(x[0])); + T3u = VBYI(VADD(T3p, T3o)); + T3v = VADD(T3r, T3s); + ST(&(x[WS(rs, 6)]), VADD(T3u, T3v), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VSUB(T3v, T3u), ms, &(x[0])); + } + { + V T3m, T3n, T3q, T3t; + T3m = VSUB(T36, T3d); + T3n = VBYI(VSUB(T3k, T3h)); + ST(&(x[WS(rs, 18)]), VSUB(T3m, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T3m, T3n), ms, &(x[0])); + T3q = VBYI(VSUB(T3o, T3p)); + T3t = VSUB(T3r, T3s); + ST(&(x[WS(rs, 10)]), VADD(T3q, T3t), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VSUB(T3t, T3q), ms, &(x[0])); + } + } + { + V TE, T1P, T1I, T1Q, T1t, T1M, T1F, T1N; + { + V Tg, TD, T1G, T1H; + Tg = VADD(T4, Tf); + TD = VADD(Tr, TC); + TE = VADD(Tg, TD); + T1P = VSUB(Tg, TD); + T1G = VFNMS(LDK(KP195090322), TV, VMUL(LDK(KP980785280), T12)); + T1H = VFMA(LDK(KP195090322), T1k, VMUL(LDK(KP980785280), T1r)); + T1I = VADD(T1G, T1H); + T1Q = VSUB(T1H, T1G); + } + { + V T13, T1s, T1B, T1E; + T13 = VFMA(LDK(KP980785280), TV, VMUL(LDK(KP195090322), T12)); + T1s = VFNMS(LDK(KP195090322), T1r, VMUL(LDK(KP980785280), T1k)); + T1t = VADD(T13, T1s); + T1M = VSUB(T1s, T13); + T1B = VSUB(T1v, T1A); + T1E = VSUB(T1C, T1D); + T1F = VADD(T1B, T1E); + T1N = VSUB(T1E, T1B); + } + { + V T1u, T1J, T1S, T1T; + T1u = VADD(TE, T1t); + T1J = VBYI(VADD(T1F, T1I)); + ST(&(x[WS(rs, 31)]), VSUB(T1u, T1J), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1u, T1J), ms, &(x[WS(rs, 1)])); + T1S = VBYI(VADD(T1N, T1M)); + T1T = VADD(T1P, T1Q); + ST(&(x[WS(rs, 7)]), VADD(T1S, T1T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VSUB(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VSUB(TE, T1t); + T1L = VBYI(VSUB(T1I, T1F)); + ST(&(x[WS(rs, 17)]), VSUB(T1K, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VADD(T1K, T1L), ms, &(x[WS(rs, 1)])); + T1O = VBYI(VSUB(T1M, T1N)); + T1R = VSUB(T1P, T1Q); + ST(&(x[WS(rs, 9)]), VADD(T1O, T1R), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VSUB(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2h, T2a, T2i, T23, T2e, T27, T2f; + { + V T1U, T1V, T28, T29; + T1U = VSUB(T4, Tf); + T1V = VADD(T1D, T1C); + T1W = VADD(T1U, T1V); + T2h = VSUB(T1U, T1V); + T28 = VFNMS(LDK(KP555570233), T1X, VMUL(LDK(KP831469612), T1Y)); + T29 = VFMA(LDK(KP555570233), T20, VMUL(LDK(KP831469612), T21)); + T2a = VADD(T28, T29); + T2i = VSUB(T29, T28); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP831469612), T1X, VMUL(LDK(KP555570233), T1Y)); + T22 = VFNMS(LDK(KP555570233), T21, VMUL(LDK(KP831469612), T20)); + T23 = VADD(T1Z, T22); + T2e = VSUB(T22, T1Z); + T25 = VADD(T1A, T1v); + T26 = VSUB(TC, Tr); + T27 = VADD(T25, T26); + T2f = VSUB(T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VADD(T1W, T23); + T2b = VBYI(VADD(T27, T2a)); + ST(&(x[WS(rs, 29)]), VSUB(T24, T2b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T24, T2b), ms, &(x[WS(rs, 1)])); + T2k = VBYI(VADD(T2f, T2e)); + T2l = VADD(T2h, T2i); + ST(&(x[WS(rs, 5)]), VADD(T2k, T2l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VSUB(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VSUB(T1W, T23); + T2d = VBYI(VSUB(T2a, T27)); + ST(&(x[WS(rs, 19)]), VSUB(T2c, T2d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VADD(T2c, T2d), ms, &(x[WS(rs, 1)])); + T2g = VBYI(VSUB(T2e, T2f)); + T2j = VSUB(T2h, T2i); + ST(&(x[WS(rs, 11)]), VADD(T2g, T2j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VSUB(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t1fv_32"), twinstr, &GENUS, {201, 88, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_32) (planner *p) { + X(kdft_dit_register) (p, t1fv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_4.c new file mode 100644 index 000000000..c89b9502f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_4.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1fv_4 -include dft/simd/t1f.h */ + +/* + * This function contains 11 FP additions, 8 FP multiplications, + * (or, 9 additions, 6 multiplications, 2 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VSUB(T6, T8); + ST(&(x[WS(rs, 1)]), VFNMSI(T9, T4), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T9, T4), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1fv_4"), twinstr, &GENUS, {9, 6, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_4) (planner *p) { + X(kdft_dit_register) (p, t1fv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1fv_4 -include dft/simd/t1f.h */ + +/* + * This function contains 11 FP additions, 6 FP multiplications, + * (or, 11 additions, 6 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VBYI(VSUB(T6, T8)); + ST(&(x[WS(rs, 1)]), VSUB(T4, T9), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4, T9), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1fv_4"), twinstr, &GENUS, {11, 6, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_4) (planner *p) { + X(kdft_dit_register) (p, t1fv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_5.c new file mode 100644 index 000000000..d8ecaea01 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_5.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1fv_5 -include dft/simd/t1f.h */ + +/* + * This function contains 20 FP additions, 19 FP multiplications, + * (or, 11 additions, 10 multiplications, 9 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, Tg, Th, T6, Tb, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, Ta, T5, T8; + { + V T2, T9, T4, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T9 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 4]), T9); + T4 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 6]), T4); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + } + Tg = VSUB(T3, T5); + Th = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tb = VADD(T8, Ta); + Tc = VADD(T6, Tb); + } + ST(&(x[0]), VADD(T1, Tc), ms, &(x[0])); + { + V Ti, Tk, Tf, Tj, Td, Te; + Ti = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Th, Tg)); + Tk = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tg, Th)); + Td = VFNMS(LDK(KP250000000), Tc, T1); + Te = VSUB(T6, Tb); + Tf = VFMA(LDK(KP559016994), Te, Td); + Tj = VFNMS(LDK(KP559016994), Te, Td); + ST(&(x[WS(rs, 1)]), VFNMSI(Ti, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tk, Tj), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1fv_5"), twinstr, &GENUS, {11, 10, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_5) (planner *p) { + X(kdft_dit_register) (p, t1fv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t1fv_5 -include dft/simd/t1f.h */ + +/* + * This function contains 20 FP additions, 14 FP multiplications, + * (or, 17 additions, 11 multiplications, 3 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V Tc, Tg, Th, T5, Ta, Td; + Tc = LD(&(x[0]), ms, &(x[0])); + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = BYTWJ(&(W[TWVL * 6]), T3); + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 2]), T6); + } + Tg = VSUB(T2, T4); + Th = VSUB(T7, T9); + T5 = VADD(T2, T4); + Ta = VADD(T7, T9); + Td = VADD(T5, Ta); + } + ST(&(x[0]), VADD(Tc, Td), ms, &(x[0])); + { + V Ti, Tj, Tf, Tk, Tb, Te; + Ti = VBYI(VFMA(LDK(KP951056516), Tg, VMUL(LDK(KP587785252), Th))); + Tj = VBYI(VFNMS(LDK(KP587785252), Tg, VMUL(LDK(KP951056516), Th))); + Tb = VMUL(LDK(KP559016994), VSUB(T5, Ta)); + Te = VFNMS(LDK(KP250000000), Td, Tc); + Tf = VADD(Tb, Te); + Tk = VSUB(Te, Tb); + ST(&(x[WS(rs, 1)]), VSUB(Tf, Ti), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tj, Tk), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t1fv_5"), twinstr, &GENUS, {17, 11, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_5) (planner *p) { + X(kdft_dit_register) (p, t1fv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_6.c new file mode 100644 index 000000000..6f74da92c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_6.c @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:26 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1fv_6 -include dft/simd/t1f.h */ + +/* + * This function contains 23 FP additions, 18 FP multiplications, + * (or, 17 additions, 12 multiplications, 6 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V T4, Ti, Te, Tk, T9, Tj, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = VSUB(T1, T3); + Ti = VADD(T1, T3); + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[0]), Tc); + Te = VSUB(Tb, Td); + Tk = VADD(Tb, Td); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tj = VADD(T6, T8); + } + { + V Th, Tf, Tg, Tn, Tl, Tm; + Th = VMUL(LDK(KP866025403), VSUB(Te, T9)); + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP500000000), Tf, T4); + ST(&(x[WS(rs, 3)]), VADD(T4, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Th, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Th, Tg), ms, &(x[WS(rs, 1)])); + Tn = VMUL(LDK(KP866025403), VSUB(Tk, Tj)); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(Tn, Tm), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFNMSI(Tn, Tm), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1fv_6"), twinstr, &GENUS, {17, 12, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_6) (planner *p) { + X(kdft_dit_register) (p, t1fv_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 6 -name t1fv_6 -include dft/simd/t1f.h */ + +/* + * This function contains 23 FP additions, 14 FP multiplications, + * (or, 21 additions, 12 multiplications, 2 fused multiply/add), + * 19 stack variables, 2 constants, and 12 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_6(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 10)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(6, rs)) { + V T4, Ti, Te, Tk, T9, Tj, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = VSUB(T1, T3); + Ti = VADD(T1, T3); + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[0]), Tc); + Te = VSUB(Tb, Td); + Tk = VADD(Tb, Td); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tj = VADD(T6, T8); + } + { + V Th, Tf, Tg, Tn, Tl, Tm; + Th = VBYI(VMUL(LDK(KP866025403), VSUB(Te, T9))); + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP500000000), Tf, T4); + ST(&(x[WS(rs, 3)]), VADD(T4, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tg, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tg, Th), ms, &(x[WS(rs, 1)])); + Tn = VBYI(VMUL(LDK(KP866025403), VSUB(Tk, Tj))); + Tl = VADD(Tj, Tk); + Tm = VFNMS(LDK(KP500000000), Tl, Ti); + ST(&(x[0]), VADD(Ti, Tl), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(Tm, Tn), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VSUB(Tm, Tn), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 6, XSIMD_STRING("t1fv_6"), twinstr, &GENUS, {21, 12, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_6) (planner *p) { + X(kdft_dit_register) (p, t1fv_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_64.c new file mode 100644 index 000000000..0bb06db9e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_64.c @@ -0,0 +1,1948 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:31 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t1fv_64 -include dft/simd/t1f.h */ + +/* + * This function contains 519 FP additions, 384 FP multiplications, + * (or, 261 additions, 126 multiplications, 258 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Ta, T3U, T6l, T7B, T37, T3V, T58, T7a, T1v, T24, T43, T4F, T5F, T7l, T5Q; + V T7o, T2i, T2R, T4a, T4I, T60, T7s, T6b, T7v, T4h, T4i, T4C, T5x, T7g, T1i; + V T3a, T5u, T7h, T4k, T4l, T4B, T5o, T7d, TV, T3b, T5l, T7e, T3X, T3Y, Tx; + V T38, T5f, T7C, T6o, T7b, T1S, T25, T5T, T7m, T46, T4G, T5M, T7p, T2F, T2S; + V T6e, T7t, T4d, T4J, T67, T7w; + { + V T1, T3, T8, T6, T33, T35, T55, T2Y, T30, T56, T2, T7, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 62]), T2); + T7 = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 94]), T7); + T5 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 30]), T5); + { + V T32, T34, T2X, T2Z; + T32 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T33 = BYTWJ(&(W[TWVL * 14]), T32); + T34 = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T35 = BYTWJ(&(W[TWVL * 78]), T34); + T55 = VSUB(T33, T35); + T2X = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + T2Y = BYTWJ(&(W[TWVL * 110]), T2X); + T2Z = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T30 = BYTWJ(&(W[TWVL * 46]), T2Z); + T56 = VSUB(T2Y, T30); + } + { + V T4, T9, T6j, T6k; + T4 = VADD(T1, T3); + T9 = VADD(T6, T8); + Ta = VSUB(T4, T9); + T3U = VADD(T4, T9); + T6j = VSUB(T6, T8); + T6k = VSUB(T56, T55); + T6l = VFNMS(LDK(KP707106781), T6k, T6j); + T7B = VFMA(LDK(KP707106781), T6k, T6j); + } + { + V T31, T36, T54, T57; + T31 = VADD(T2Y, T30); + T36 = VADD(T33, T35); + T37 = VSUB(T31, T36); + T3V = VADD(T36, T31); + T54 = VSUB(T1, T3); + T57 = VADD(T55, T56); + T58 = VFMA(LDK(KP707106781), T57, T54); + T7a = VFNMS(LDK(KP707106781), T57, T54); + } + } + { + V T1m, T1o, T1p, T1r, T1t, T1u, T1Y, T5C, T23, T5D, T41, T42; + { + V T1l, T1n, T1q, T1s; + T1l = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T1m = BYTWJ(&(W[0]), T1l); + T1n = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T1o = BYTWJ(&(W[TWVL * 64]), T1n); + T1p = VADD(T1m, T1o); + T1q = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1r = BYTWJ(&(W[TWVL * 32]), T1q); + T1s = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T1t = BYTWJ(&(W[TWVL * 96]), T1s); + T1u = VADD(T1r, T1t); + } + { + V T1V, T1X, T1U, T1W; + T1U = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1V = BYTWJ(&(W[TWVL * 16]), T1U); + T1W = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T1X = BYTWJ(&(W[TWVL * 80]), T1W); + T1Y = VADD(T1V, T1X); + T5C = VSUB(T1V, T1X); + } + { + V T20, T22, T1Z, T21; + T1Z = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T20 = BYTWJ(&(W[TWVL * 112]), T1Z); + T21 = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T22 = BYTWJ(&(W[TWVL * 48]), T21); + T23 = VADD(T20, T22); + T5D = VSUB(T20, T22); + } + T1v = VSUB(T1p, T1u); + T24 = VSUB(T1Y, T23); + T41 = VADD(T1p, T1u); + T42 = VADD(T1Y, T23); + T43 = VADD(T41, T42); + T4F = VSUB(T41, T42); + { + V T5B, T5E, T5O, T5P; + T5B = VSUB(T1m, T1o); + T5E = VADD(T5C, T5D); + T5F = VFMA(LDK(KP707106781), T5E, T5B); + T7l = VFNMS(LDK(KP707106781), T5E, T5B); + T5O = VSUB(T1r, T1t); + T5P = VSUB(T5C, T5D); + T5Q = VFMA(LDK(KP707106781), T5P, T5O); + T7o = VFNMS(LDK(KP707106781), T5P, T5O); + } + } + { + V T29, T2b, T2c, T2e, T2g, T2h, T2L, T5Y, T2Q, T5X, T48, T49; + { + V T28, T2a, T2d, T2f; + T28 = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T29 = BYTWJ(&(W[TWVL * 124]), T28); + T2a = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T2b = BYTWJ(&(W[TWVL * 60]), T2a); + T2c = VADD(T29, T2b); + T2d = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2e = BYTWJ(&(W[TWVL * 28]), T2d); + T2f = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T2g = BYTWJ(&(W[TWVL * 92]), T2f); + T2h = VADD(T2e, T2g); + } + { + V T2I, T2K, T2H, T2J; + T2H = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2I = BYTWJ(&(W[TWVL * 108]), T2H); + T2J = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2K = BYTWJ(&(W[TWVL * 44]), T2J); + T2L = VADD(T2I, T2K); + T5Y = VSUB(T2I, T2K); + } + { + V T2N, T2P, T2M, T2O; + T2M = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2N = BYTWJ(&(W[TWVL * 12]), T2M); + T2O = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2P = BYTWJ(&(W[TWVL * 76]), T2O); + T2Q = VADD(T2N, T2P); + T5X = VSUB(T2N, T2P); + } + T2i = VSUB(T2c, T2h); + T2R = VSUB(T2L, T2Q); + T48 = VADD(T2c, T2h); + T49 = VADD(T2Q, T2L); + T4a = VADD(T48, T49); + T4I = VSUB(T48, T49); + { + V T5W, T5Z, T69, T6a; + T5W = VSUB(T29, T2b); + T5Z = VADD(T5X, T5Y); + T60 = VFMA(LDK(KP707106781), T5Z, T5W); + T7s = VFNMS(LDK(KP707106781), T5Z, T5W); + T69 = VSUB(T2g, T2e); + T6a = VSUB(T5Y, T5X); + T6b = VFMA(LDK(KP707106781), T6a, T69); + T7v = VFNMS(LDK(KP707106781), T6a, T69); + } + } + { + V TX, TZ, T10, T12, T14, T15, T1b, T5s, T1g, T5r, T5v, T5w; + { + V TW, TY, T11, T13; + TW = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + TX = BYTWJ(&(W[TWVL * 122]), TW); + TY = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TZ = BYTWJ(&(W[TWVL * 58]), TY); + T10 = VADD(TX, TZ); + T11 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T12 = BYTWJ(&(W[TWVL * 26]), T11); + T13 = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T14 = BYTWJ(&(W[TWVL * 90]), T13); + T15 = VADD(T12, T14); + } + { + V T18, T1a, T17, T19; + T17 = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + T18 = BYTWJ(&(W[TWVL * 106]), T17); + T19 = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1a = BYTWJ(&(W[TWVL * 42]), T19); + T1b = VADD(T18, T1a); + T5s = VSUB(T18, T1a); + } + { + V T1d, T1f, T1c, T1e; + T1c = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T1d = BYTWJ(&(W[TWVL * 10]), T1c); + T1e = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + T1f = BYTWJ(&(W[TWVL * 74]), T1e); + T1g = VADD(T1d, T1f); + T5r = VSUB(T1d, T1f); + } + T4h = VADD(T10, T15); + T4i = VADD(T1g, T1b); + T4C = VSUB(T4h, T4i); + T5v = VSUB(T14, T12); + T5w = VSUB(T5s, T5r); + T5x = VFMA(LDK(KP707106781), T5w, T5v); + T7g = VFNMS(LDK(KP707106781), T5w, T5v); + { + V T16, T1h, T5q, T5t; + T16 = VSUB(T10, T15); + T1h = VSUB(T1b, T1g); + T1i = VFNMS(LDK(KP414213562), T1h, T16); + T3a = VFMA(LDK(KP414213562), T16, T1h); + T5q = VSUB(TX, TZ); + T5t = VADD(T5r, T5s); + T5u = VFMA(LDK(KP707106781), T5t, T5q); + T7h = VFNMS(LDK(KP707106781), T5t, T5q); + } + } + { + V TA, TC, TD, TF, TH, TI, TO, T5i, TT, T5j, T5m, T5n; + { + V Tz, TB, TE, TG; + Tz = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 2]), Tz); + TB = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 66]), TB); + TD = VADD(TA, TC); + TE = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + TF = BYTWJ(&(W[TWVL * 34]), TE); + TG = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + TH = BYTWJ(&(W[TWVL * 98]), TG); + TI = VADD(TF, TH); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TL = BYTWJ(&(W[TWVL * 18]), TK); + TM = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + TN = BYTWJ(&(W[TWVL * 82]), TM); + TO = VADD(TL, TN); + T5i = VSUB(TL, TN); + } + { + V TQ, TS, TP, TR; + TP = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + TQ = BYTWJ(&(W[TWVL * 114]), TP); + TR = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TS = BYTWJ(&(W[TWVL * 50]), TR); + TT = VADD(TQ, TS); + T5j = VSUB(TQ, TS); + } + T4k = VADD(TD, TI); + T4l = VADD(TO, TT); + T4B = VSUB(T4k, T4l); + T5m = VSUB(TF, TH); + T5n = VSUB(T5i, T5j); + T5o = VFMA(LDK(KP707106781), T5n, T5m); + T7d = VFNMS(LDK(KP707106781), T5n, T5m); + { + V TJ, TU, T5h, T5k; + TJ = VSUB(TD, TI); + TU = VSUB(TO, TT); + TV = VFNMS(LDK(KP414213562), TU, TJ); + T3b = VFMA(LDK(KP414213562), TJ, TU); + T5h = VSUB(TA, TC); + T5k = VADD(T5i, T5j); + T5l = VFMA(LDK(KP707106781), T5k, T5h); + T7e = VFNMS(LDK(KP707106781), T5k, T5h); + } + } + { + V Tf, T59, Tv, T5d, Tk, T5a, Tq, T5c, Tl, Tw; + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tc = BYTWJ(&(W[TWVL * 6]), Tb); + Td = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Te = BYTWJ(&(W[TWVL * 70]), Td); + Tf = VADD(Tc, Te); + T59 = VSUB(Tc, Te); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Ts = BYTWJ(&(W[TWVL * 22]), Tr); + Tt = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + Tu = BYTWJ(&(W[TWVL * 86]), Tt); + Tv = VADD(Ts, Tu); + T5d = VSUB(Tu, Ts); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 38]), Tg); + Ti = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 102]), Ti); + Tk = VADD(Th, Tj); + T5a = VSUB(Th, Tj); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 118]), Tm); + To = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 54]), To); + Tq = VADD(Tn, Tp); + T5c = VSUB(Tn, Tp); + } + T3X = VADD(Tf, Tk); + T3Y = VADD(Tq, Tv); + Tl = VSUB(Tf, Tk); + Tw = VSUB(Tq, Tv); + Tx = VADD(Tl, Tw); + T38 = VSUB(Tw, Tl); + { + V T5b, T5e, T6m, T6n; + T5b = VFNMS(LDK(KP414213562), T5a, T59); + T5e = VFNMS(LDK(KP414213562), T5d, T5c); + T5f = VADD(T5b, T5e); + T7C = VSUB(T5e, T5b); + T6m = VFMA(LDK(KP414213562), T59, T5a); + T6n = VFMA(LDK(KP414213562), T5c, T5d); + T6o = VSUB(T6m, T6n); + T7b = VADD(T6m, T6n); + } + } + { + V T1A, T5G, T1Q, T5K, T1F, T5H, T1L, T5J; + { + V T1x, T1z, T1w, T1y; + T1w = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1x = BYTWJ(&(W[TWVL * 8]), T1w); + T1y = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1z = BYTWJ(&(W[TWVL * 72]), T1y); + T1A = VADD(T1x, T1z); + T5G = VSUB(T1x, T1z); + } + { + V T1N, T1P, T1M, T1O; + T1M = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1N = BYTWJ(&(W[TWVL * 24]), T1M); + T1O = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1P = BYTWJ(&(W[TWVL * 88]), T1O); + T1Q = VADD(T1N, T1P); + T5K = VSUB(T1N, T1P); + } + { + V T1C, T1E, T1B, T1D; + T1B = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1C = BYTWJ(&(W[TWVL * 40]), T1B); + T1D = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1E = BYTWJ(&(W[TWVL * 104]), T1D); + T1F = VADD(T1C, T1E); + T5H = VSUB(T1C, T1E); + } + { + V T1I, T1K, T1H, T1J; + T1H = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1I = BYTWJ(&(W[TWVL * 120]), T1H); + T1J = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1K = BYTWJ(&(W[TWVL * 56]), T1J); + T1L = VADD(T1I, T1K); + T5J = VSUB(T1I, T1K); + } + { + V T1G, T1R, T5R, T5S; + T1G = VSUB(T1A, T1F); + T1R = VSUB(T1L, T1Q); + T1S = VADD(T1G, T1R); + T25 = VSUB(T1G, T1R); + T5R = VFMA(LDK(KP414213562), T5G, T5H); + T5S = VFNMS(LDK(KP414213562), T5J, T5K); + T5T = VADD(T5R, T5S); + T7m = VSUB(T5R, T5S); + } + { + V T44, T45, T5I, T5L; + T44 = VADD(T1A, T1F); + T45 = VADD(T1L, T1Q); + T46 = VADD(T44, T45); + T4G = VSUB(T44, T45); + T5I = VFNMS(LDK(KP414213562), T5H, T5G); + T5L = VFMA(LDK(KP414213562), T5K, T5J); + T5M = VADD(T5I, T5L); + T7p = VSUB(T5I, T5L); + } + } + { + V T2n, T61, T2D, T65, T2s, T62, T2y, T64; + { + V T2k, T2m, T2j, T2l; + T2j = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2k = BYTWJ(&(W[TWVL * 4]), T2j); + T2l = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2m = BYTWJ(&(W[TWVL * 68]), T2l); + T2n = VADD(T2k, T2m); + T61 = VSUB(T2k, T2m); + } + { + V T2A, T2C, T2z, T2B; + T2z = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2A = BYTWJ(&(W[TWVL * 20]), T2z); + T2B = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2C = BYTWJ(&(W[TWVL * 84]), T2B); + T2D = VADD(T2A, T2C); + T65 = VSUB(T2C, T2A); + } + { + V T2p, T2r, T2o, T2q; + T2o = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2p = BYTWJ(&(W[TWVL * 36]), T2o); + T2q = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2r = BYTWJ(&(W[TWVL * 100]), T2q); + T2s = VADD(T2p, T2r); + T62 = VSUB(T2r, T2p); + } + { + V T2v, T2x, T2u, T2w; + T2u = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2v = BYTWJ(&(W[TWVL * 116]), T2u); + T2w = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2x = BYTWJ(&(W[TWVL * 52]), T2w); + T2y = VADD(T2v, T2x); + T64 = VSUB(T2v, T2x); + } + { + V T2t, T2E, T6c, T6d; + T2t = VSUB(T2n, T2s); + T2E = VSUB(T2y, T2D); + T2F = VADD(T2t, T2E); + T2S = VSUB(T2E, T2t); + T6c = VFNMS(LDK(KP414213562), T61, T62); + T6d = VFMA(LDK(KP414213562), T64, T65); + T6e = VADD(T6c, T6d); + T7t = VSUB(T6d, T6c); + } + { + V T4b, T4c, T63, T66; + T4b = VADD(T2n, T2s); + T4c = VADD(T2y, T2D); + T4d = VADD(T4b, T4c); + T4J = VSUB(T4c, T4b); + T63 = VFMA(LDK(KP414213562), T62, T61); + T66 = VFNMS(LDK(KP414213562), T65, T64); + T67 = VADD(T63, T66); + T7w = VSUB(T66, T63); + } + } + { + V T40, T4s, T4x, T4z, T4f, T4o, T4n, T4t, T4u, T4y; + { + V T3W, T3Z, T4v, T4w; + T3W = VADD(T3U, T3V); + T3Z = VADD(T3X, T3Y); + T40 = VSUB(T3W, T3Z); + T4s = VADD(T3W, T3Z); + T4v = VADD(T43, T46); + T4w = VADD(T4a, T4d); + T4x = VADD(T4v, T4w); + T4z = VSUB(T4w, T4v); + } + { + V T47, T4e, T4j, T4m; + T47 = VSUB(T43, T46); + T4e = VSUB(T4a, T4d); + T4f = VADD(T47, T4e); + T4o = VSUB(T4e, T47); + T4j = VADD(T4h, T4i); + T4m = VADD(T4k, T4l); + T4n = VSUB(T4j, T4m); + T4t = VADD(T4m, T4j); + } + T4u = VADD(T4s, T4t); + ST(&(x[WS(rs, 32)]), VSUB(T4u, T4x), ms, &(x[0])); + ST(&(x[0]), VADD(T4u, T4x), ms, &(x[0])); + T4y = VSUB(T4s, T4t); + ST(&(x[WS(rs, 48)]), VFNMSI(T4z, T4y), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T4z, T4y), ms, &(x[0])); + { + V T4g, T4p, T4q, T4r; + T4g = VFNMS(LDK(KP707106781), T4f, T40); + T4p = VFNMS(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 24)]), VFNMSI(T4p, T4g), ms, &(x[0])); + ST(&(x[WS(rs, 40)]), VFMAI(T4p, T4g), ms, &(x[0])); + T4q = VFMA(LDK(KP707106781), T4f, T40); + T4r = VFMA(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 56)]), VFNMSI(T4r, T4q), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T4r, T4q), ms, &(x[0])); + } + } + { + V T4E, T4W, T4S, T4X, T4L, T50, T4P, T4Z; + { + V T4A, T4D, T4Q, T4R; + T4A = VSUB(T3U, T3V); + T4D = VADD(T4B, T4C); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4W = VFNMS(LDK(KP707106781), T4D, T4A); + T4Q = VFMA(LDK(KP414213562), T4I, T4J); + T4R = VFMA(LDK(KP414213562), T4F, T4G); + T4S = VSUB(T4Q, T4R); + T4X = VADD(T4R, T4Q); + } + { + V T4H, T4K, T4N, T4O; + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + T4K = VFNMS(LDK(KP414213562), T4J, T4I); + T4L = VADD(T4H, T4K); + T50 = VSUB(T4K, T4H); + T4N = VSUB(T3Y, T3X); + T4O = VSUB(T4C, T4B); + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4Z = VFNMS(LDK(KP707106781), T4O, T4N); + } + { + V T4M, T4T, T52, T53; + T4M = VFNMS(LDK(KP923879532), T4L, T4E); + T4T = VFNMS(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 28)]), VFNMSI(T4T, T4M), ms, &(x[0])); + ST(&(x[WS(rs, 36)]), VFMAI(T4T, T4M), ms, &(x[0])); + T52 = VFMA(LDK(KP923879532), T4X, T4W); + T53 = VFNMS(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 12)]), VFNMSI(T53, T52), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VFMAI(T53, T52), ms, &(x[0])); + } + { + V T4U, T4V, T4Y, T51; + T4U = VFMA(LDK(KP923879532), T4L, T4E); + T4V = VFMA(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 60)]), VFNMSI(T4V, T4U), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T4V, T4U), ms, &(x[0])); + T4Y = VFNMS(LDK(KP923879532), T4X, T4W); + T51 = VFMA(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 20)]), VFMAI(T51, T4Y), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VFNMSI(T51, T4Y), ms, &(x[0])); + } + } + { + V T1k, T3k, T3d, T3n, T2V, T3o, T3g, T3l; + { + V Ty, T1j, T39, T3c; + Ty = VFMA(LDK(KP707106781), Tx, Ta); + T1j = VADD(TV, T1i); + T1k = VFMA(LDK(KP923879532), T1j, Ty); + T3k = VFNMS(LDK(KP923879532), T1j, Ty); + T39 = VFMA(LDK(KP707106781), T38, T37); + T3c = VSUB(T3a, T3b); + T3d = VFMA(LDK(KP923879532), T3c, T39); + T3n = VFNMS(LDK(KP923879532), T3c, T39); + { + V T27, T3f, T2U, T3e; + { + V T1T, T26, T2G, T2T; + T1T = VFMA(LDK(KP707106781), T1S, T1v); + T26 = VFMA(LDK(KP707106781), T25, T24); + T27 = VFNMS(LDK(KP198912367), T26, T1T); + T3f = VFMA(LDK(KP198912367), T1T, T26); + T2G = VFMA(LDK(KP707106781), T2F, T2i); + T2T = VFMA(LDK(KP707106781), T2S, T2R); + T2U = VFNMS(LDK(KP198912367), T2T, T2G); + T3e = VFMA(LDK(KP198912367), T2G, T2T); + } + T2V = VADD(T27, T2U); + T3o = VSUB(T2U, T27); + T3g = VSUB(T3e, T3f); + T3l = VADD(T3f, T3e); + } + } + { + V T2W, T3h, T3q, T3r; + T2W = VFNMS(LDK(KP980785280), T2V, T1k); + T3h = VFNMS(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 30)]), VFNMSI(T3h, T2W), ms, &(x[0])); + ST(&(x[WS(rs, 34)]), VFMAI(T3h, T2W), ms, &(x[0])); + T3q = VFMA(LDK(KP980785280), T3l, T3k); + T3r = VFNMS(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 14)]), VFNMSI(T3r, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 50)]), VFMAI(T3r, T3q), ms, &(x[0])); + } + { + V T3i, T3j, T3m, T3p; + T3i = VFMA(LDK(KP980785280), T2V, T1k); + T3j = VFMA(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 62)]), VFNMSI(T3j, T3i), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3j, T3i), ms, &(x[0])); + T3m = VFNMS(LDK(KP980785280), T3l, T3k); + T3p = VFMA(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 18)]), VFMAI(T3p, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 46)]), VFNMSI(T3p, T3m), ms, &(x[0])); + } + } + { + V T3u, T3M, T3F, T3P, T3B, T3Q, T3I, T3N; + { + V T3s, T3t, T3D, T3E; + T3s = VFNMS(LDK(KP707106781), Tx, Ta); + T3t = VADD(T3b, T3a); + T3u = VFMA(LDK(KP923879532), T3t, T3s); + T3M = VFNMS(LDK(KP923879532), T3t, T3s); + T3D = VFNMS(LDK(KP707106781), T38, T37); + T3E = VSUB(T1i, TV); + T3F = VFNMS(LDK(KP923879532), T3E, T3D); + T3P = VFMA(LDK(KP923879532), T3E, T3D); + { + V T3x, T3H, T3A, T3G; + { + V T3v, T3w, T3y, T3z; + T3v = VFNMS(LDK(KP707106781), T1S, T1v); + T3w = VFNMS(LDK(KP707106781), T25, T24); + T3x = VFMA(LDK(KP668178637), T3w, T3v); + T3H = VFNMS(LDK(KP668178637), T3v, T3w); + T3y = VFNMS(LDK(KP707106781), T2F, T2i); + T3z = VFNMS(LDK(KP707106781), T2S, T2R); + T3A = VFMA(LDK(KP668178637), T3z, T3y); + T3G = VFNMS(LDK(KP668178637), T3y, T3z); + } + T3B = VADD(T3x, T3A); + T3Q = VSUB(T3A, T3x); + T3I = VSUB(T3G, T3H); + T3N = VADD(T3H, T3G); + } + } + { + V T3C, T3J, T3S, T3T; + T3C = VFNMS(LDK(KP831469612), T3B, T3u); + T3J = VFNMS(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 38)]), VFNMSI(T3J, T3C), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3J, T3C), ms, &(x[0])); + T3S = VFNMS(LDK(KP831469612), T3N, T3M); + T3T = VFMA(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 10)]), VFMAI(T3T, T3S), ms, &(x[0])); + ST(&(x[WS(rs, 54)]), VFNMSI(T3T, T3S), ms, &(x[0])); + } + { + V T3K, T3L, T3O, T3R; + T3K = VFMA(LDK(KP831469612), T3B, T3u); + T3L = VFMA(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 6)]), VFNMSI(T3L, T3K), ms, &(x[0])); + ST(&(x[WS(rs, 58)]), VFMAI(T3L, T3K), ms, &(x[0])); + T3O = VFMA(LDK(KP831469612), T3N, T3M); + T3R = VFNMS(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 22)]), VFNMSI(T3R, T3O), ms, &(x[0])); + ST(&(x[WS(rs, 42)]), VFMAI(T3R, T3O), ms, &(x[0])); + } + } + { + V T7k, T8j, T7O, T89, T7H, T8g, T7R, T7Y, T7z, T7S, T7K, T7P, T85, T8k, T8c; + V T8h; + { + V T7c, T87, T7j, T88, T7f, T7i; + T7c = VFNMS(LDK(KP923879532), T7b, T7a); + T87 = VFMA(LDK(KP923879532), T7C, T7B); + T7f = VFNMS(LDK(KP668178637), T7e, T7d); + T7i = VFNMS(LDK(KP668178637), T7h, T7g); + T7j = VADD(T7f, T7i); + T88 = VSUB(T7f, T7i); + T7k = VFNMS(LDK(KP831469612), T7j, T7c); + T8j = VFNMS(LDK(KP831469612), T88, T87); + T7O = VFMA(LDK(KP831469612), T7j, T7c); + T89 = VFMA(LDK(KP831469612), T88, T87); + } + { + V T7D, T7W, T7G, T7X, T7E, T7F; + T7D = VFNMS(LDK(KP923879532), T7C, T7B); + T7W = VFMA(LDK(KP923879532), T7b, T7a); + T7E = VFMA(LDK(KP668178637), T7g, T7h); + T7F = VFMA(LDK(KP668178637), T7d, T7e); + T7G = VSUB(T7E, T7F); + T7X = VADD(T7F, T7E); + T7H = VFNMS(LDK(KP831469612), T7G, T7D); + T8g = VFNMS(LDK(KP831469612), T7X, T7W); + T7R = VFMA(LDK(KP831469612), T7G, T7D); + T7Y = VFMA(LDK(KP831469612), T7X, T7W); + } + { + V T7r, T7I, T7y, T7J; + { + V T7n, T7q, T7u, T7x; + T7n = VFNMS(LDK(KP923879532), T7m, T7l); + T7q = VFMA(LDK(KP923879532), T7p, T7o); + T7r = VFNMS(LDK(KP534511135), T7q, T7n); + T7I = VFMA(LDK(KP534511135), T7n, T7q); + T7u = VFNMS(LDK(KP923879532), T7t, T7s); + T7x = VFMA(LDK(KP923879532), T7w, T7v); + T7y = VFNMS(LDK(KP534511135), T7x, T7u); + T7J = VFMA(LDK(KP534511135), T7u, T7x); + } + T7z = VADD(T7r, T7y); + T7S = VSUB(T7y, T7r); + T7K = VSUB(T7I, T7J); + T7P = VADD(T7I, T7J); + } + { + V T81, T8a, T84, T8b; + { + V T7Z, T80, T82, T83; + T7Z = VFMA(LDK(KP923879532), T7m, T7l); + T80 = VFNMS(LDK(KP923879532), T7p, T7o); + T81 = VFMA(LDK(KP303346683), T80, T7Z); + T8a = VFNMS(LDK(KP303346683), T7Z, T80); + T82 = VFMA(LDK(KP923879532), T7t, T7s); + T83 = VFNMS(LDK(KP923879532), T7w, T7v); + T84 = VFMA(LDK(KP303346683), T83, T82); + T8b = VFNMS(LDK(KP303346683), T82, T83); + } + T85 = VADD(T81, T84); + T8k = VSUB(T84, T81); + T8c = VSUB(T8a, T8b); + T8h = VADD(T8a, T8b); + } + { + V T7A, T7L, T8i, T8l; + T7A = VFNMS(LDK(KP881921264), T7z, T7k); + T7L = VFNMS(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 37)]), VFNMSI(T7L, T7A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFMAI(T7L, T7A), ms, &(x[WS(rs, 1)])); + T8i = VFMA(LDK(KP956940335), T8h, T8g); + T8l = VFMA(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 19)]), VFMAI(T8l, T8i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 45)]), VFNMSI(T8l, T8i), ms, &(x[WS(rs, 1)])); + } + { + V T8m, T8n, T7M, T7N; + T8m = VFNMS(LDK(KP956940335), T8h, T8g); + T8n = VFNMS(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 13)]), VFNMSI(T8n, T8m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 51)]), VFMAI(T8n, T8m), ms, &(x[WS(rs, 1)])); + T7M = VFMA(LDK(KP881921264), T7z, T7k); + T7N = VFMA(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 5)]), VFNMSI(T7N, T7M), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 59)]), VFMAI(T7N, T7M), ms, &(x[WS(rs, 1)])); + } + { + V T7Q, T7T, T86, T8d; + T7Q = VFNMS(LDK(KP881921264), T7P, T7O); + T7T = VFNMS(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 21)]), VFNMSI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 43)]), VFMAI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + T86 = VFNMS(LDK(KP956940335), T85, T7Y); + T8d = VFNMS(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 29)]), VFNMSI(T8d, T86), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 35)]), VFMAI(T8d, T86), ms, &(x[WS(rs, 1)])); + } + { + V T8e, T8f, T7U, T7V; + T8e = VFMA(LDK(KP956940335), T85, T7Y); + T8f = VFMA(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 61)]), VFNMSI(T8f, T8e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T8f, T8e), ms, &(x[WS(rs, 1)])); + T7U = VFMA(LDK(KP881921264), T7P, T7O); + T7V = VFMA(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 11)]), VFMAI(T7V, T7U), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 53)]), VFNMSI(T7V, T7U), ms, &(x[WS(rs, 1)])); + } + } + { + V T5A, T75, T6A, T6V, T6t, T72, T6D, T6K, T6h, T6E, T6w, T6B, T6R, T76, T6Y; + V T73; + { + V T5g, T6T, T5z, T6U, T5p, T5y; + T5g = VFMA(LDK(KP923879532), T5f, T58); + T6T = VFNMS(LDK(KP923879532), T6o, T6l); + T5p = VFNMS(LDK(KP198912367), T5o, T5l); + T5y = VFNMS(LDK(KP198912367), T5x, T5u); + T5z = VADD(T5p, T5y); + T6U = VSUB(T5y, T5p); + T5A = VFMA(LDK(KP980785280), T5z, T5g); + T75 = VFNMS(LDK(KP980785280), T6U, T6T); + T6A = VFNMS(LDK(KP980785280), T5z, T5g); + T6V = VFMA(LDK(KP980785280), T6U, T6T); + } + { + V T6p, T6I, T6s, T6J, T6q, T6r; + T6p = VFMA(LDK(KP923879532), T6o, T6l); + T6I = VFNMS(LDK(KP923879532), T5f, T58); + T6q = VFMA(LDK(KP198912367), T5l, T5o); + T6r = VFMA(LDK(KP198912367), T5u, T5x); + T6s = VSUB(T6q, T6r); + T6J = VADD(T6q, T6r); + T6t = VFMA(LDK(KP980785280), T6s, T6p); + T72 = VFNMS(LDK(KP980785280), T6J, T6I); + T6D = VFNMS(LDK(KP980785280), T6s, T6p); + T6K = VFMA(LDK(KP980785280), T6J, T6I); + } + { + V T5V, T6u, T6g, T6v; + { + V T5N, T5U, T68, T6f; + T5N = VFMA(LDK(KP923879532), T5M, T5F); + T5U = VFMA(LDK(KP923879532), T5T, T5Q); + T5V = VFNMS(LDK(KP098491403), T5U, T5N); + T6u = VFMA(LDK(KP098491403), T5N, T5U); + T68 = VFMA(LDK(KP923879532), T67, T60); + T6f = VFMA(LDK(KP923879532), T6e, T6b); + T6g = VFNMS(LDK(KP098491403), T6f, T68); + T6v = VFMA(LDK(KP098491403), T68, T6f); + } + T6h = VADD(T5V, T6g); + T6E = VSUB(T6g, T5V); + T6w = VSUB(T6u, T6v); + T6B = VADD(T6u, T6v); + } + { + V T6N, T6W, T6Q, T6X; + { + V T6L, T6M, T6O, T6P; + T6L = VFNMS(LDK(KP923879532), T5M, T5F); + T6M = VFNMS(LDK(KP923879532), T5T, T5Q); + T6N = VFMA(LDK(KP820678790), T6M, T6L); + T6W = VFNMS(LDK(KP820678790), T6L, T6M); + T6O = VFNMS(LDK(KP923879532), T67, T60); + T6P = VFNMS(LDK(KP923879532), T6e, T6b); + T6Q = VFMA(LDK(KP820678790), T6P, T6O); + T6X = VFNMS(LDK(KP820678790), T6O, T6P); + } + T6R = VADD(T6N, T6Q); + T76 = VSUB(T6Q, T6N); + T6Y = VSUB(T6W, T6X); + T73 = VADD(T6W, T6X); + } + { + V T6i, T6x, T74, T77; + T6i = VFNMS(LDK(KP995184726), T6h, T5A); + T6x = VFNMS(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 33)]), VFNMSI(T6x, T6i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VFMAI(T6x, T6i), ms, &(x[WS(rs, 1)])); + T74 = VFMA(LDK(KP773010453), T73, T72); + T77 = VFMA(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 23)]), VFMAI(T77, T74), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VFNMSI(T77, T74), ms, &(x[WS(rs, 1)])); + } + { + V T78, T79, T6y, T6z; + T78 = VFNMS(LDK(KP773010453), T73, T72); + T79 = VFNMS(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 9)]), VFNMSI(T79, T78), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VFMAI(T79, T78), ms, &(x[WS(rs, 1)])); + T6y = VFMA(LDK(KP995184726), T6h, T5A); + T6z = VFMA(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 1)]), VFNMSI(T6z, T6y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 63)]), VFMAI(T6z, T6y), ms, &(x[WS(rs, 1)])); + } + { + V T6C, T6F, T6S, T6Z; + T6C = VFNMS(LDK(KP995184726), T6B, T6A); + T6F = VFNMS(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 17)]), VFNMSI(T6F, T6C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VFMAI(T6F, T6C), ms, &(x[WS(rs, 1)])); + T6S = VFNMS(LDK(KP773010453), T6R, T6K); + T6Z = VFNMS(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 25)]), VFNMSI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 39)]), VFMAI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + } + { + V T70, T71, T6G, T6H; + T70 = VFMA(LDK(KP773010453), T6R, T6K); + T71 = VFMA(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 57)]), VFNMSI(T71, T70), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T71, T70), ms, &(x[WS(rs, 1)])); + T6G = VFMA(LDK(KP995184726), T6B, T6A); + T6H = VFMA(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 15)]), VFMAI(T6H, T6G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VFNMSI(T6H, T6G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t1fv_64"), twinstr, &GENUS, {261, 126, 258, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_64) (planner *p) { + X(kdft_dit_register) (p, t1fv_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t1fv_64 -include dft/simd/t1f.h */ + +/* + * This function contains 519 FP additions, 250 FP multiplications, + * (or, 467 additions, 198 multiplications, 52 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Tg, T4a, T6r, T7f, T3o, T4B, T5q, T7e, T5R, T62, T28, T4o, T2g, T4l, T7n; + V T7Z, T68, T6j, T2C, T4s, T3a, T4v, T7u, T82, T7E, T7F, T7V, T5F, T6u, T1k; + V T4e, T1r, T4d, T7B, T7C, T7W, T5M, T6v, TV, T4g, T12, T4h, T7h, T7i, TD; + V T4C, T3h, T4b, T5x, T6s, T1R, T4m, T7q, T80, T2j, T4p, T5Y, T63, T2Z, T4w; + V T7x, T83, T33, T4t, T6f, T6k; + { + V T1, T3, T3m, T3k, Tb, Td, Te, T6, T8, T9, T2, T3l, T3j; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 62]), T2); + T3l = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T3m = BYTWJ(&(W[TWVL * 94]), T3l); + T3j = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3k = BYTWJ(&(W[TWVL * 30]), T3j); + { + V Ta, Tc, T5, T7; + Ta = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 110]), Ta); + Tc = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 46]), Tc); + Te = VSUB(Tb, Td); + T5 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 14]), T5); + T7 = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 78]), T7); + T9 = VSUB(T6, T8); + } + { + V T4, Tf, T6p, T6q; + T4 = VSUB(T1, T3); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VADD(T4, Tf); + T4a = VSUB(T4, Tf); + T6p = VADD(Tb, Td); + T6q = VADD(T6, T8); + T6r = VSUB(T6p, T6q); + T7f = VADD(T6q, T6p); + } + { + V T3i, T3n, T5o, T5p; + T3i = VMUL(LDK(KP707106781), VSUB(Te, T9)); + T3n = VSUB(T3k, T3m); + T3o = VSUB(T3i, T3n); + T4B = VADD(T3n, T3i); + T5o = VADD(T1, T3); + T5p = VADD(T3k, T3m); + T5q = VSUB(T5o, T5p); + T7e = VADD(T5o, T5p); + } + } + { + V T24, T26, T5Q, T2b, T2d, T5P, T1W, T60, T21, T61, T22, T27; + { + V T23, T25, T2a, T2c; + T23 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T24 = BYTWJ(&(W[TWVL * 32]), T23); + T25 = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T26 = BYTWJ(&(W[TWVL * 96]), T25); + T5Q = VADD(T24, T26); + T2a = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2b = BYTWJ(&(W[0]), T2a); + T2c = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T2d = BYTWJ(&(W[TWVL * 64]), T2c); + T5P = VADD(T2b, T2d); + } + { + V T1T, T1V, T1S, T1U; + T1S = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T1T = BYTWJ(&(W[TWVL * 112]), T1S); + T1U = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T1V = BYTWJ(&(W[TWVL * 48]), T1U); + T1W = VSUB(T1T, T1V); + T60 = VADD(T1T, T1V); + } + { + V T1Y, T20, T1X, T1Z; + T1X = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1Y = BYTWJ(&(W[TWVL * 16]), T1X); + T1Z = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T20 = BYTWJ(&(W[TWVL * 80]), T1Z); + T21 = VSUB(T1Y, T20); + T61 = VADD(T1Y, T20); + } + T5R = VSUB(T5P, T5Q); + T62 = VSUB(T60, T61); + T22 = VMUL(LDK(KP707106781), VSUB(T1W, T21)); + T27 = VSUB(T24, T26); + T28 = VSUB(T22, T27); + T4o = VADD(T27, T22); + { + V T2e, T2f, T7l, T7m; + T2e = VSUB(T2b, T2d); + T2f = VMUL(LDK(KP707106781), VADD(T21, T1W)); + T2g = VADD(T2e, T2f); + T4l = VSUB(T2e, T2f); + T7l = VADD(T5P, T5Q); + T7m = VADD(T61, T60); + T7n = VADD(T7l, T7m); + T7Z = VSUB(T7l, T7m); + } + } + { + V T2n, T2p, T66, T36, T38, T67, T2v, T6i, T2A, T6h, T2q, T2B; + { + V T2m, T2o, T35, T37; + T2m = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T2n = BYTWJ(&(W[TWVL * 124]), T2m); + T2o = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T2p = BYTWJ(&(W[TWVL * 60]), T2o); + T66 = VADD(T2n, T2p); + T35 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T36 = BYTWJ(&(W[TWVL * 28]), T35); + T37 = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T38 = BYTWJ(&(W[TWVL * 92]), T37); + T67 = VADD(T36, T38); + } + { + V T2s, T2u, T2r, T2t; + T2r = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2s = BYTWJ(&(W[TWVL * 12]), T2r); + T2t = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2u = BYTWJ(&(W[TWVL * 76]), T2t); + T2v = VSUB(T2s, T2u); + T6i = VADD(T2s, T2u); + } + { + V T2x, T2z, T2w, T2y; + T2w = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2x = BYTWJ(&(W[TWVL * 108]), T2w); + T2y = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2z = BYTWJ(&(W[TWVL * 44]), T2y); + T2A = VSUB(T2x, T2z); + T6h = VADD(T2x, T2z); + } + T68 = VSUB(T66, T67); + T6j = VSUB(T6h, T6i); + T2q = VSUB(T2n, T2p); + T2B = VMUL(LDK(KP707106781), VADD(T2v, T2A)); + T2C = VADD(T2q, T2B); + T4s = VSUB(T2q, T2B); + { + V T34, T39, T7s, T7t; + T34 = VMUL(LDK(KP707106781), VSUB(T2A, T2v)); + T39 = VSUB(T36, T38); + T3a = VSUB(T34, T39); + T4v = VADD(T39, T34); + T7s = VADD(T66, T67); + T7t = VADD(T6i, T6h); + T7u = VADD(T7s, T7t); + T82 = VSUB(T7s, T7t); + } + } + { + V T1g, T1i, T5A, T1m, T1o, T5z, T18, T5C, T1d, T5D, T5B, T5E; + { + V T1f, T1h, T1l, T1n; + T1f = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1g = BYTWJ(&(W[TWVL * 34]), T1f); + T1h = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + T1i = BYTWJ(&(W[TWVL * 98]), T1h); + T5A = VADD(T1g, T1i); + T1l = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T1m = BYTWJ(&(W[TWVL * 2]), T1l); + T1n = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + T1o = BYTWJ(&(W[TWVL * 66]), T1n); + T5z = VADD(T1m, T1o); + } + { + V T15, T17, T14, T16; + T14 = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + T15 = BYTWJ(&(W[TWVL * 114]), T14); + T16 = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + T17 = BYTWJ(&(W[TWVL * 50]), T16); + T18 = VSUB(T15, T17); + T5C = VADD(T15, T17); + } + { + V T1a, T1c, T19, T1b; + T19 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T1a = BYTWJ(&(W[TWVL * 18]), T19); + T1b = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + T1c = BYTWJ(&(W[TWVL * 82]), T1b); + T1d = VSUB(T1a, T1c); + T5D = VADD(T1a, T1c); + } + T7E = VADD(T5z, T5A); + T7F = VADD(T5D, T5C); + T7V = VSUB(T7E, T7F); + T5B = VSUB(T5z, T5A); + T5E = VSUB(T5C, T5D); + T5F = VFMA(LDK(KP923879532), T5B, VMUL(LDK(KP382683432), T5E)); + T6u = VFNMS(LDK(KP382683432), T5B, VMUL(LDK(KP923879532), T5E)); + { + V T1e, T1j, T1p, T1q; + T1e = VMUL(LDK(KP707106781), VSUB(T18, T1d)); + T1j = VSUB(T1g, T1i); + T1k = VSUB(T1e, T1j); + T4e = VADD(T1j, T1e); + T1p = VSUB(T1m, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T1d, T18)); + T1r = VADD(T1p, T1q); + T4d = VSUB(T1p, T1q); + } + } + { + V TG, TI, T5G, TY, T10, T5H, TO, T5K, TT, T5J, T5I, T5L; + { + V TF, TH, TX, TZ; + TF = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + TG = BYTWJ(&(W[TWVL * 122]), TF); + TH = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TI = BYTWJ(&(W[TWVL * 58]), TH); + T5G = VADD(TG, TI); + TX = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TY = BYTWJ(&(W[TWVL * 26]), TX); + TZ = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T10 = BYTWJ(&(W[TWVL * 90]), TZ); + T5H = VADD(TY, T10); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TL = BYTWJ(&(W[TWVL * 10]), TK); + TM = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + TN = BYTWJ(&(W[TWVL * 74]), TM); + TO = VSUB(TL, TN); + T5K = VADD(TL, TN); + } + { + V TQ, TS, TP, TR; + TP = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + TQ = BYTWJ(&(W[TWVL * 106]), TP); + TR = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TS = BYTWJ(&(W[TWVL * 42]), TR); + TT = VSUB(TQ, TS); + T5J = VADD(TQ, TS); + } + T7B = VADD(T5G, T5H); + T7C = VADD(T5K, T5J); + T7W = VSUB(T7B, T7C); + T5I = VSUB(T5G, T5H); + T5L = VSUB(T5J, T5K); + T5M = VFNMS(LDK(KP382683432), T5L, VMUL(LDK(KP923879532), T5I)); + T6v = VFMA(LDK(KP382683432), T5I, VMUL(LDK(KP923879532), T5L)); + { + V TJ, TU, TW, T11; + TJ = VSUB(TG, TI); + TU = VMUL(LDK(KP707106781), VADD(TO, TT)); + TV = VADD(TJ, TU); + T4g = VSUB(TJ, TU); + TW = VMUL(LDK(KP707106781), VSUB(TT, TO)); + T11 = VSUB(TY, T10); + T12 = VSUB(TW, T11); + T4h = VADD(T11, TW); + } + } + { + V Tl, T5r, TB, T5v, Tq, T5s, Tw, T5u, Tr, TC; + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 6]), Th); + Tj = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 70]), Tj); + Tl = VSUB(Ti, Tk); + T5r = VADD(Ti, Tk); + } + { + V Ty, TA, Tx, Tz; + Tx = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Ty = BYTWJ(&(W[TWVL * 22]), Tx); + Tz = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 86]), Tz); + TB = VSUB(Ty, TA); + T5v = VADD(Ty, TA); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 38]), Tm); + To = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 102]), To); + Tq = VSUB(Tn, Tp); + T5s = VADD(Tn, Tp); + } + { + V Tt, Tv, Ts, Tu; + Ts = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Tt = BYTWJ(&(W[TWVL * 118]), Ts); + Tu = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tv = BYTWJ(&(W[TWVL * 54]), Tu); + Tw = VSUB(Tt, Tv); + T5u = VADD(Tt, Tv); + } + T7h = VADD(T5r, T5s); + T7i = VADD(T5u, T5v); + Tr = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + TC = VFMA(LDK(KP923879532), Tw, VMUL(LDK(KP382683432), TB)); + TD = VADD(Tr, TC); + T4C = VSUB(TC, Tr); + { + V T3f, T3g, T5t, T5w; + T3f = VFNMS(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T3g = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + T3h = VSUB(T3f, T3g); + T4b = VADD(T3g, T3f); + T5t = VSUB(T5r, T5s); + T5w = VSUB(T5u, T5v); + T5x = VMUL(LDK(KP707106781), VADD(T5t, T5w)); + T6s = VMUL(LDK(KP707106781), VSUB(T5w, T5t)); + } + } + { + V T1z, T5V, T1P, T5T, T1E, T5W, T1K, T5S; + { + V T1w, T1y, T1v, T1x; + T1v = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1w = BYTWJ(&(W[TWVL * 120]), T1v); + T1x = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1y = BYTWJ(&(W[TWVL * 56]), T1x); + T1z = VSUB(T1w, T1y); + T5V = VADD(T1w, T1y); + } + { + V T1M, T1O, T1L, T1N; + T1L = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1M = BYTWJ(&(W[TWVL * 40]), T1L); + T1N = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1O = BYTWJ(&(W[TWVL * 104]), T1N); + T1P = VSUB(T1M, T1O); + T5T = VADD(T1M, T1O); + } + { + V T1B, T1D, T1A, T1C; + T1A = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1B = BYTWJ(&(W[TWVL * 24]), T1A); + T1C = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1D = BYTWJ(&(W[TWVL * 88]), T1C); + T1E = VSUB(T1B, T1D); + T5W = VADD(T1B, T1D); + } + { + V T1H, T1J, T1G, T1I; + T1G = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1H = BYTWJ(&(W[TWVL * 8]), T1G); + T1I = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1J = BYTWJ(&(W[TWVL * 72]), T1I); + T1K = VSUB(T1H, T1J); + T5S = VADD(T1H, T1J); + } + { + V T1F, T1Q, T7o, T7p; + T1F = VFNMS(LDK(KP923879532), T1E, VMUL(LDK(KP382683432), T1z)); + T1Q = VFMA(LDK(KP382683432), T1K, VMUL(LDK(KP923879532), T1P)); + T1R = VSUB(T1F, T1Q); + T4m = VADD(T1Q, T1F); + T7o = VADD(T5S, T5T); + T7p = VADD(T5V, T5W); + T7q = VADD(T7o, T7p); + T80 = VSUB(T7p, T7o); + } + { + V T2h, T2i, T5U, T5X; + T2h = VFNMS(LDK(KP382683432), T1P, VMUL(LDK(KP923879532), T1K)); + T2i = VFMA(LDK(KP923879532), T1z, VMUL(LDK(KP382683432), T1E)); + T2j = VADD(T2h, T2i); + T4p = VSUB(T2i, T2h); + T5U = VSUB(T5S, T5T); + T5X = VSUB(T5V, T5W); + T5Y = VMUL(LDK(KP707106781), VADD(T5U, T5X)); + T63 = VMUL(LDK(KP707106781), VSUB(T5X, T5U)); + } + } + { + V T2H, T69, T2X, T6d, T2M, T6a, T2S, T6c; + { + V T2E, T2G, T2D, T2F; + T2D = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2E = BYTWJ(&(W[TWVL * 4]), T2D); + T2F = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2G = BYTWJ(&(W[TWVL * 68]), T2F); + T2H = VSUB(T2E, T2G); + T69 = VADD(T2E, T2G); + } + { + V T2U, T2W, T2T, T2V; + T2T = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2U = BYTWJ(&(W[TWVL * 20]), T2T); + T2V = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2W = BYTWJ(&(W[TWVL * 84]), T2V); + T2X = VSUB(T2U, T2W); + T6d = VADD(T2U, T2W); + } + { + V T2J, T2L, T2I, T2K; + T2I = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2J = BYTWJ(&(W[TWVL * 36]), T2I); + T2K = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2L = BYTWJ(&(W[TWVL * 100]), T2K); + T2M = VSUB(T2J, T2L); + T6a = VADD(T2J, T2L); + } + { + V T2P, T2R, T2O, T2Q; + T2O = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2P = BYTWJ(&(W[TWVL * 116]), T2O); + T2Q = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2R = BYTWJ(&(W[TWVL * 52]), T2Q); + T2S = VSUB(T2P, T2R); + T6c = VADD(T2P, T2R); + } + { + V T2N, T2Y, T7v, T7w; + T2N = VFNMS(LDK(KP382683432), T2M, VMUL(LDK(KP923879532), T2H)); + T2Y = VFMA(LDK(KP923879532), T2S, VMUL(LDK(KP382683432), T2X)); + T2Z = VADD(T2N, T2Y); + T4w = VSUB(T2Y, T2N); + T7v = VADD(T69, T6a); + T7w = VADD(T6c, T6d); + T7x = VADD(T7v, T7w); + T83 = VSUB(T7w, T7v); + } + { + V T31, T32, T6b, T6e; + T31 = VFNMS(LDK(KP923879532), T2X, VMUL(LDK(KP382683432), T2S)); + T32 = VFMA(LDK(KP382683432), T2H, VMUL(LDK(KP923879532), T2M)); + T33 = VSUB(T31, T32); + T4t = VADD(T32, T31); + T6b = VSUB(T69, T6a); + T6e = VSUB(T6c, T6d); + T6f = VMUL(LDK(KP707106781), VADD(T6b, T6e)); + T6k = VMUL(LDK(KP707106781), VSUB(T6e, T6b)); + } + } + { + V T7k, T7M, T7R, T7T, T7z, T7I, T7H, T7N, T7O, T7S; + { + V T7g, T7j, T7P, T7Q; + T7g = VADD(T7e, T7f); + T7j = VADD(T7h, T7i); + T7k = VSUB(T7g, T7j); + T7M = VADD(T7g, T7j); + T7P = VADD(T7n, T7q); + T7Q = VADD(T7u, T7x); + T7R = VADD(T7P, T7Q); + T7T = VBYI(VSUB(T7Q, T7P)); + } + { + V T7r, T7y, T7D, T7G; + T7r = VSUB(T7n, T7q); + T7y = VSUB(T7u, T7x); + T7z = VMUL(LDK(KP707106781), VADD(T7r, T7y)); + T7I = VMUL(LDK(KP707106781), VSUB(T7y, T7r)); + T7D = VADD(T7B, T7C); + T7G = VADD(T7E, T7F); + T7H = VSUB(T7D, T7G); + T7N = VADD(T7G, T7D); + } + T7O = VADD(T7M, T7N); + ST(&(x[WS(rs, 32)]), VSUB(T7O, T7R), ms, &(x[0])); + ST(&(x[0]), VADD(T7O, T7R), ms, &(x[0])); + T7S = VSUB(T7M, T7N); + ST(&(x[WS(rs, 48)]), VSUB(T7S, T7T), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T7S, T7T), ms, &(x[0])); + { + V T7A, T7J, T7K, T7L; + T7A = VADD(T7k, T7z); + T7J = VBYI(VADD(T7H, T7I)); + ST(&(x[WS(rs, 56)]), VSUB(T7A, T7J), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T7A, T7J), ms, &(x[0])); + T7K = VSUB(T7k, T7z); + T7L = VBYI(VSUB(T7I, T7H)); + ST(&(x[WS(rs, 40)]), VSUB(T7K, T7L), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VADD(T7K, T7L), ms, &(x[0])); + } + } + { + V T7Y, T8j, T8c, T8k, T85, T8g, T89, T8h; + { + V T7U, T7X, T8a, T8b; + T7U = VSUB(T7e, T7f); + T7X = VMUL(LDK(KP707106781), VADD(T7V, T7W)); + T7Y = VADD(T7U, T7X); + T8j = VSUB(T7U, T7X); + T8a = VFNMS(LDK(KP382683432), T7Z, VMUL(LDK(KP923879532), T80)); + T8b = VFMA(LDK(KP382683432), T82, VMUL(LDK(KP923879532), T83)); + T8c = VADD(T8a, T8b); + T8k = VSUB(T8b, T8a); + } + { + V T81, T84, T87, T88; + T81 = VFMA(LDK(KP923879532), T7Z, VMUL(LDK(KP382683432), T80)); + T84 = VFNMS(LDK(KP382683432), T83, VMUL(LDK(KP923879532), T82)); + T85 = VADD(T81, T84); + T8g = VSUB(T84, T81); + T87 = VSUB(T7i, T7h); + T88 = VMUL(LDK(KP707106781), VSUB(T7W, T7V)); + T89 = VADD(T87, T88); + T8h = VSUB(T88, T87); + } + { + V T86, T8d, T8m, T8n; + T86 = VADD(T7Y, T85); + T8d = VBYI(VADD(T89, T8c)); + ST(&(x[WS(rs, 60)]), VSUB(T86, T8d), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T86, T8d), ms, &(x[0])); + T8m = VBYI(VADD(T8h, T8g)); + T8n = VADD(T8j, T8k); + ST(&(x[WS(rs, 12)]), VADD(T8m, T8n), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VSUB(T8n, T8m), ms, &(x[0])); + } + { + V T8e, T8f, T8i, T8l; + T8e = VSUB(T7Y, T85); + T8f = VBYI(VSUB(T8c, T89)); + ST(&(x[WS(rs, 36)]), VSUB(T8e, T8f), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VADD(T8e, T8f), ms, &(x[0])); + T8i = VBYI(VSUB(T8g, T8h)); + T8l = VSUB(T8j, T8k); + ST(&(x[WS(rs, 20)]), VADD(T8i, T8l), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VSUB(T8l, T8i), ms, &(x[0])); + } + } + { + V T5O, T6H, T6x, T6F, T6n, T6I, T6A, T6E; + { + V T5y, T5N, T6t, T6w; + T5y = VADD(T5q, T5x); + T5N = VADD(T5F, T5M); + T5O = VADD(T5y, T5N); + T6H = VSUB(T5y, T5N); + T6t = VADD(T6r, T6s); + T6w = VADD(T6u, T6v); + T6x = VADD(T6t, T6w); + T6F = VSUB(T6w, T6t); + { + V T65, T6y, T6m, T6z; + { + V T5Z, T64, T6g, T6l; + T5Z = VADD(T5R, T5Y); + T64 = VADD(T62, T63); + T65 = VFMA(LDK(KP980785280), T5Z, VMUL(LDK(KP195090322), T64)); + T6y = VFNMS(LDK(KP195090322), T5Z, VMUL(LDK(KP980785280), T64)); + T6g = VADD(T68, T6f); + T6l = VADD(T6j, T6k); + T6m = VFNMS(LDK(KP195090322), T6l, VMUL(LDK(KP980785280), T6g)); + T6z = VFMA(LDK(KP195090322), T6g, VMUL(LDK(KP980785280), T6l)); + } + T6n = VADD(T65, T6m); + T6I = VSUB(T6z, T6y); + T6A = VADD(T6y, T6z); + T6E = VSUB(T6m, T65); + } + } + { + V T6o, T6B, T6K, T6L; + T6o = VADD(T5O, T6n); + T6B = VBYI(VADD(T6x, T6A)); + ST(&(x[WS(rs, 62)]), VSUB(T6o, T6B), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T6o, T6B), ms, &(x[0])); + T6K = VBYI(VADD(T6F, T6E)); + T6L = VADD(T6H, T6I); + ST(&(x[WS(rs, 14)]), VADD(T6K, T6L), ms, &(x[0])); + ST(&(x[WS(rs, 50)]), VSUB(T6L, T6K), ms, &(x[0])); + } + { + V T6C, T6D, T6G, T6J; + T6C = VSUB(T5O, T6n); + T6D = VBYI(VSUB(T6A, T6x)); + ST(&(x[WS(rs, 34)]), VSUB(T6C, T6D), ms, &(x[0])); + ST(&(x[WS(rs, 30)]), VADD(T6C, T6D), ms, &(x[0])); + T6G = VBYI(VSUB(T6E, T6F)); + T6J = VSUB(T6H, T6I); + ST(&(x[WS(rs, 18)]), VADD(T6G, T6J), ms, &(x[0])); + ST(&(x[WS(rs, 46)]), VSUB(T6J, T6G), ms, &(x[0])); + } + } + { + V T6O, T79, T6Z, T77, T6V, T7a, T72, T76; + { + V T6M, T6N, T6X, T6Y; + T6M = VSUB(T5q, T5x); + T6N = VSUB(T6v, T6u); + T6O = VADD(T6M, T6N); + T79 = VSUB(T6M, T6N); + T6X = VSUB(T6s, T6r); + T6Y = VSUB(T5M, T5F); + T6Z = VADD(T6X, T6Y); + T77 = VSUB(T6Y, T6X); + { + V T6R, T70, T6U, T71; + { + V T6P, T6Q, T6S, T6T; + T6P = VSUB(T5R, T5Y); + T6Q = VSUB(T63, T62); + T6R = VFMA(LDK(KP831469612), T6P, VMUL(LDK(KP555570233), T6Q)); + T70 = VFNMS(LDK(KP555570233), T6P, VMUL(LDK(KP831469612), T6Q)); + T6S = VSUB(T68, T6f); + T6T = VSUB(T6k, T6j); + T6U = VFNMS(LDK(KP555570233), T6T, VMUL(LDK(KP831469612), T6S)); + T71 = VFMA(LDK(KP555570233), T6S, VMUL(LDK(KP831469612), T6T)); + } + T6V = VADD(T6R, T6U); + T7a = VSUB(T71, T70); + T72 = VADD(T70, T71); + T76 = VSUB(T6U, T6R); + } + } + { + V T6W, T73, T7c, T7d; + T6W = VADD(T6O, T6V); + T73 = VBYI(VADD(T6Z, T72)); + ST(&(x[WS(rs, 58)]), VSUB(T6W, T73), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T6W, T73), ms, &(x[0])); + T7c = VBYI(VADD(T77, T76)); + T7d = VADD(T79, T7a); + ST(&(x[WS(rs, 10)]), VADD(T7c, T7d), ms, &(x[0])); + ST(&(x[WS(rs, 54)]), VSUB(T7d, T7c), ms, &(x[0])); + } + { + V T74, T75, T78, T7b; + T74 = VSUB(T6O, T6V); + T75 = VBYI(VSUB(T72, T6Z)); + ST(&(x[WS(rs, 38)]), VSUB(T74, T75), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VADD(T74, T75), ms, &(x[0])); + T78 = VBYI(VSUB(T76, T77)); + T7b = VSUB(T79, T7a); + ST(&(x[WS(rs, 22)]), VADD(T78, T7b), ms, &(x[0])); + ST(&(x[WS(rs, 42)]), VSUB(T7b, T78), ms, &(x[0])); + } + } + { + V T4k, T5h, T4R, T59, T4H, T5j, T4P, T4Y, T4z, T4S, T4K, T4O, T55, T5k, T5c; + V T5g; + { + V T4c, T57, T4j, T58, T4f, T4i; + T4c = VADD(T4a, T4b); + T57 = VSUB(T4C, T4B); + T4f = VFMA(LDK(KP831469612), T4d, VMUL(LDK(KP555570233), T4e)); + T4i = VFNMS(LDK(KP555570233), T4h, VMUL(LDK(KP831469612), T4g)); + T4j = VADD(T4f, T4i); + T58 = VSUB(T4i, T4f); + T4k = VADD(T4c, T4j); + T5h = VSUB(T58, T57); + T4R = VSUB(T4c, T4j); + T59 = VADD(T57, T58); + } + { + V T4D, T4W, T4G, T4X, T4E, T4F; + T4D = VADD(T4B, T4C); + T4W = VSUB(T4a, T4b); + T4E = VFNMS(LDK(KP555570233), T4d, VMUL(LDK(KP831469612), T4e)); + T4F = VFMA(LDK(KP555570233), T4g, VMUL(LDK(KP831469612), T4h)); + T4G = VADD(T4E, T4F); + T4X = VSUB(T4F, T4E); + T4H = VADD(T4D, T4G); + T5j = VSUB(T4W, T4X); + T4P = VSUB(T4G, T4D); + T4Y = VADD(T4W, T4X); + } + { + V T4r, T4I, T4y, T4J; + { + V T4n, T4q, T4u, T4x; + T4n = VADD(T4l, T4m); + T4q = VADD(T4o, T4p); + T4r = VFMA(LDK(KP956940335), T4n, VMUL(LDK(KP290284677), T4q)); + T4I = VFNMS(LDK(KP290284677), T4n, VMUL(LDK(KP956940335), T4q)); + T4u = VADD(T4s, T4t); + T4x = VADD(T4v, T4w); + T4y = VFNMS(LDK(KP290284677), T4x, VMUL(LDK(KP956940335), T4u)); + T4J = VFMA(LDK(KP290284677), T4u, VMUL(LDK(KP956940335), T4x)); + } + T4z = VADD(T4r, T4y); + T4S = VSUB(T4J, T4I); + T4K = VADD(T4I, T4J); + T4O = VSUB(T4y, T4r); + } + { + V T51, T5a, T54, T5b; + { + V T4Z, T50, T52, T53; + T4Z = VSUB(T4l, T4m); + T50 = VSUB(T4p, T4o); + T51 = VFMA(LDK(KP881921264), T4Z, VMUL(LDK(KP471396736), T50)); + T5a = VFNMS(LDK(KP471396736), T4Z, VMUL(LDK(KP881921264), T50)); + T52 = VSUB(T4s, T4t); + T53 = VSUB(T4w, T4v); + T54 = VFNMS(LDK(KP471396736), T53, VMUL(LDK(KP881921264), T52)); + T5b = VFMA(LDK(KP471396736), T52, VMUL(LDK(KP881921264), T53)); + } + T55 = VADD(T51, T54); + T5k = VSUB(T5b, T5a); + T5c = VADD(T5a, T5b); + T5g = VSUB(T54, T51); + } + { + V T4A, T4L, T5i, T5l; + T4A = VADD(T4k, T4z); + T4L = VBYI(VADD(T4H, T4K)); + ST(&(x[WS(rs, 61)]), VSUB(T4A, T4L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4A, T4L), ms, &(x[WS(rs, 1)])); + T5i = VBYI(VSUB(T5g, T5h)); + T5l = VSUB(T5j, T5k); + ST(&(x[WS(rs, 21)]), VADD(T5i, T5l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 43)]), VSUB(T5l, T5i), ms, &(x[WS(rs, 1)])); + } + { + V T5m, T5n, T4M, T4N; + T5m = VBYI(VADD(T5h, T5g)); + T5n = VADD(T5j, T5k); + ST(&(x[WS(rs, 11)]), VADD(T5m, T5n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 53)]), VSUB(T5n, T5m), ms, &(x[WS(rs, 1)])); + T4M = VSUB(T4k, T4z); + T4N = VBYI(VSUB(T4K, T4H)); + ST(&(x[WS(rs, 35)]), VSUB(T4M, T4N), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VADD(T4M, T4N), ms, &(x[WS(rs, 1)])); + } + { + V T4Q, T4T, T56, T5d; + T4Q = VBYI(VSUB(T4O, T4P)); + T4T = VSUB(T4R, T4S); + ST(&(x[WS(rs, 19)]), VADD(T4Q, T4T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 45)]), VSUB(T4T, T4Q), ms, &(x[WS(rs, 1)])); + T56 = VADD(T4Y, T55); + T5d = VBYI(VADD(T59, T5c)); + ST(&(x[WS(rs, 59)]), VSUB(T56, T5d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T56, T5d), ms, &(x[WS(rs, 1)])); + } + { + V T5e, T5f, T4U, T4V; + T5e = VSUB(T4Y, T55); + T5f = VBYI(VSUB(T5c, T59)); + ST(&(x[WS(rs, 37)]), VSUB(T5e, T5f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VADD(T5e, T5f), ms, &(x[WS(rs, 1)])); + T4U = VBYI(VADD(T4P, T4O)); + T4V = VADD(T4R, T4S); + ST(&(x[WS(rs, 13)]), VADD(T4U, T4V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 51)]), VSUB(T4V, T4U), ms, &(x[WS(rs, 1)])); + } + } + { + V T1u, T43, T3D, T3V, T3t, T45, T3B, T3K, T3d, T3E, T3w, T3A, T3R, T46, T3Y; + V T42; + { + V TE, T3T, T1t, T3U, T13, T1s; + TE = VSUB(Tg, TD); + T3T = VADD(T3o, T3h); + T13 = VFMA(LDK(KP195090322), TV, VMUL(LDK(KP980785280), T12)); + T1s = VFNMS(LDK(KP195090322), T1r, VMUL(LDK(KP980785280), T1k)); + T1t = VSUB(T13, T1s); + T3U = VADD(T1s, T13); + T1u = VADD(TE, T1t); + T43 = VSUB(T3U, T3T); + T3D = VSUB(TE, T1t); + T3V = VADD(T3T, T3U); + } + { + V T3p, T3I, T3s, T3J, T3q, T3r; + T3p = VSUB(T3h, T3o); + T3I = VADD(Tg, TD); + T3q = VFNMS(LDK(KP195090322), T12, VMUL(LDK(KP980785280), TV)); + T3r = VFMA(LDK(KP980785280), T1r, VMUL(LDK(KP195090322), T1k)); + T3s = VSUB(T3q, T3r); + T3J = VADD(T3r, T3q); + T3t = VADD(T3p, T3s); + T45 = VSUB(T3I, T3J); + T3B = VSUB(T3s, T3p); + T3K = VADD(T3I, T3J); + } + { + V T2l, T3u, T3c, T3v; + { + V T29, T2k, T30, T3b; + T29 = VSUB(T1R, T28); + T2k = VSUB(T2g, T2j); + T2l = VFMA(LDK(KP634393284), T29, VMUL(LDK(KP773010453), T2k)); + T3u = VFNMS(LDK(KP634393284), T2k, VMUL(LDK(KP773010453), T29)); + T30 = VSUB(T2C, T2Z); + T3b = VSUB(T33, T3a); + T3c = VFNMS(LDK(KP634393284), T3b, VMUL(LDK(KP773010453), T30)); + T3v = VFMA(LDK(KP773010453), T3b, VMUL(LDK(KP634393284), T30)); + } + T3d = VADD(T2l, T3c); + T3E = VSUB(T3v, T3u); + T3w = VADD(T3u, T3v); + T3A = VSUB(T3c, T2l); + } + { + V T3N, T3W, T3Q, T3X; + { + V T3L, T3M, T3O, T3P; + T3L = VADD(T28, T1R); + T3M = VADD(T2g, T2j); + T3N = VFMA(LDK(KP098017140), T3L, VMUL(LDK(KP995184726), T3M)); + T3W = VFNMS(LDK(KP098017140), T3M, VMUL(LDK(KP995184726), T3L)); + T3O = VADD(T2C, T2Z); + T3P = VADD(T3a, T33); + T3Q = VFNMS(LDK(KP098017140), T3P, VMUL(LDK(KP995184726), T3O)); + T3X = VFMA(LDK(KP995184726), T3P, VMUL(LDK(KP098017140), T3O)); + } + T3R = VADD(T3N, T3Q); + T46 = VSUB(T3X, T3W); + T3Y = VADD(T3W, T3X); + T42 = VSUB(T3Q, T3N); + } + { + V T3e, T3x, T44, T47; + T3e = VADD(T1u, T3d); + T3x = VBYI(VADD(T3t, T3w)); + ST(&(x[WS(rs, 57)]), VSUB(T3e, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T3e, T3x), ms, &(x[WS(rs, 1)])); + T44 = VBYI(VSUB(T42, T43)); + T47 = VSUB(T45, T46); + ST(&(x[WS(rs, 17)]), VADD(T44, T47), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VSUB(T47, T44), ms, &(x[WS(rs, 1)])); + } + { + V T48, T49, T3y, T3z; + T48 = VBYI(VADD(T43, T42)); + T49 = VADD(T45, T46); + ST(&(x[WS(rs, 15)]), VADD(T48, T49), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VSUB(T49, T48), ms, &(x[WS(rs, 1)])); + T3y = VSUB(T1u, T3d); + T3z = VBYI(VSUB(T3w, T3t)); + ST(&(x[WS(rs, 39)]), VSUB(T3y, T3z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VADD(T3y, T3z), ms, &(x[WS(rs, 1)])); + } + { + V T3C, T3F, T3S, T3Z; + T3C = VBYI(VSUB(T3A, T3B)); + T3F = VSUB(T3D, T3E); + ST(&(x[WS(rs, 23)]), VADD(T3C, T3F), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VSUB(T3F, T3C), ms, &(x[WS(rs, 1)])); + T3S = VADD(T3K, T3R); + T3Z = VBYI(VADD(T3V, T3Y)); + ST(&(x[WS(rs, 63)]), VSUB(T3S, T3Z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T3S, T3Z), ms, &(x[WS(rs, 1)])); + } + { + V T40, T41, T3G, T3H; + T40 = VSUB(T3K, T3R); + T41 = VBYI(VSUB(T3Y, T3V)); + ST(&(x[WS(rs, 33)]), VSUB(T40, T41), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VADD(T40, T41), ms, &(x[WS(rs, 1)])); + T3G = VBYI(VADD(T3B, T3A)); + T3H = VADD(T3D, T3E); + ST(&(x[WS(rs, 9)]), VADD(T3G, T3H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VSUB(T3H, T3G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t1fv_64"), twinstr, &GENUS, {467, 198, 52, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_64) (planner *p) { + X(kdft_dit_register) (p, t1fv_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_7.c new file mode 100644 index 000000000..bbe5af324 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_7.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:27 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1fv_7 -include dft/simd/t1f.h */ + +/* + * This function contains 36 FP additions, 36 FP multiplications, + * (or, 15 additions, 15 multiplications, 21 fused multiply/add), + * 30 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP801937735, +0.801937735804838252472204639014890102331838324); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP554958132, +0.554958132087371191422194871006410481067288862); + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP692021471, +0.692021471630095869627814897002069140197260599); + DVK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V T1, Tk, Tm, Tl, T6, Tg, Tb, Th, Tu, Tp; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, Tf, Td, Ta, T8; + { + V T2, T4, Te, Tc, T9, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + Te = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tf = BYTWJ(&(W[TWVL * 6]), Te); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + T9 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 8]), T9); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + } + Tk = VSUB(T5, T3); + Tm = VSUB(Ta, T8); + Tl = VSUB(Tf, Td); + T6 = VADD(T3, T5); + Tg = VADD(Td, Tf); + Tb = VADD(T8, Ta); + Th = VFNMS(LDK(KP356895867), T6, Tg); + Tu = VFNMS(LDK(KP356895867), Tg, Tb); + Tp = VFNMS(LDK(KP356895867), Tb, T6); + } + ST(&(x[0]), VADD(T1, VADD(T6, VADD(Tb, Tg))), ms, &(x[0])); + { + V Tw, Ty, Tv, Tx; + Tv = VFNMS(LDK(KP692021471), Tu, T6); + Tw = VFNMS(LDK(KP900968867), Tv, T1); + Tx = VFNMS(LDK(KP554958132), Tk, Tm); + Ty = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tx, Tl)); + ST(&(x[WS(rs, 4)]), VFNMSI(Ty, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(Ty, Tw), ms, &(x[WS(rs, 1)])); + } + { + V Tj, To, Ti, Tn; + Ti = VFNMS(LDK(KP692021471), Th, Tb); + Tj = VFNMS(LDK(KP900968867), Ti, T1); + Tn = VFMA(LDK(KP554958132), Tm, Tl); + To = VMUL(LDK(KP974927912), VFNMS(LDK(KP801937735), Tn, Tk)); + ST(&(x[WS(rs, 5)]), VFNMSI(To, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(To, Tj), ms, &(x[0])); + } + { + V Tr, Tt, Tq, Ts; + Tq = VFNMS(LDK(KP692021471), Tp, Tg); + Tr = VFNMS(LDK(KP900968867), Tq, T1); + Ts = VFMA(LDK(KP554958132), Tl, Tk); + Tt = VMUL(LDK(KP974927912), VFMA(LDK(KP801937735), Ts, Tm)); + ST(&(x[WS(rs, 6)]), VFNMSI(Tt, Tr), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VFMAI(Tt, Tr), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1fv_7"), twinstr, &GENUS, {15, 15, 21, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_7) (planner *p) { + X(kdft_dit_register) (p, t1fv_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 7 -name t1fv_7 -include dft/simd/t1f.h */ + +/* + * This function contains 36 FP additions, 30 FP multiplications, + * (or, 24 additions, 18 multiplications, 12 fused multiply/add), + * 21 stack variables, 6 constants, and 14 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_7(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP900968867, +0.900968867902419126236102319507445051165919162); + DVK(KP222520933, +0.222520933956314404288902564496794759466355569); + DVK(KP623489801, +0.623489801858733530525004884004239810632274731); + DVK(KP781831482, +0.781831482468029808708444526674057750232334519); + DVK(KP974927912, +0.974927912181823607018131682993931217232785801); + DVK(KP433883739, +0.433883739117558120475768332848358754609990728); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 12)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 12), MAKE_VOLATILE_STRIDE(7, rs)) { + V T1, Tg, Tj, T6, Ti, Tb, Tk, Tp, To; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V Td, Tf, Tc, Te; + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tf = BYTWJ(&(W[TWVL * 6]), Te); + Tg = VADD(Td, Tf); + Tj = VSUB(Tf, Td); + } + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + Ti = VSUB(T5, T3); + } + { + V T8, Ta, T7, T9; + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + T9 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 8]), T9); + Tb = VADD(T8, Ta); + Tk = VSUB(Ta, T8); + } + ST(&(x[0]), VADD(T1, VADD(T6, VADD(Tb, Tg))), ms, &(x[0])); + Tp = VBYI(VFMA(LDK(KP433883739), Ti, VFNMS(LDK(KP781831482), Tk, VMUL(LDK(KP974927912), Tj)))); + To = VFMA(LDK(KP623489801), Tb, VFNMS(LDK(KP222520933), Tg, VFNMS(LDK(KP900968867), T6, T1))); + ST(&(x[WS(rs, 4)]), VSUB(To, Tp), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + { + V Tl, Th, Tn, Tm; + Tl = VBYI(VFNMS(LDK(KP781831482), Tj, VFNMS(LDK(KP433883739), Tk, VMUL(LDK(KP974927912), Ti)))); + Th = VFMA(LDK(KP623489801), Tg, VFNMS(LDK(KP900968867), Tb, VFNMS(LDK(KP222520933), T6, T1))); + ST(&(x[WS(rs, 5)]), VSUB(Th, Tl), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(Th, Tl), ms, &(x[0])); + Tn = VBYI(VFMA(LDK(KP781831482), Ti, VFMA(LDK(KP974927912), Tk, VMUL(LDK(KP433883739), Tj)))); + Tm = VFMA(LDK(KP623489801), T6, VFNMS(LDK(KP900968867), Tg, VFNMS(LDK(KP222520933), Tb, T1))); + ST(&(x[WS(rs, 6)]), VSUB(Tm, Tn), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(Tm, Tn), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 7, XSIMD_STRING("t1fv_7"), twinstr, &GENUS, {24, 18, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_7) (planner *p) { + X(kdft_dit_register) (p, t1fv_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_8.c new file mode 100644 index 000000000..f18f89106 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_8.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:27 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1fv_8 -include dft/simd/t1f.h */ + +/* + * This function contains 33 FP additions, 24 FP multiplications, + * (or, 23 additions, 14 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tl, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + Tj = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 10]), Tj); + Tl = VSUB(Ti, Tk); + Tr = VADD(Ti, Tk); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTWJ(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VADD(Tq, Tr); + Tv = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[0]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VSUB(Tq, Tr); + Tx = VSUB(Tu, Tt); + ST(&(x[WS(rs, 6)]), VFNMSI(Tx, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tx, Tw), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Tm; + Tf = VADD(T9, Te); + Tg = VFMA(LDK(KP707106781), Tf, T4); + To = VFNMS(LDK(KP707106781), Tf, T4); + Tm = VSUB(Te, T9); + Tn = VFNMS(LDK(KP707106781), Tm, Tl); + Tp = VFMA(LDK(KP707106781), Tm, Tl); + ST(&(x[WS(rs, 1)]), VFNMSI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Tp, To), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1fv_8"), twinstr, &GENUS, {23, 14, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_8) (planner *p) { + X(kdft_dit_register) (p, t1fv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1fv_8 -include dft/simd/t1f.h */ + +/* + * This function contains 33 FP additions, 16 FP multiplications, + * (or, 33 additions, 16 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tm, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Tj, Tl, Ti, Tk; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 2]), Ti); + Tk = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 10]), Tk); + Tm = VSUB(Tj, Tl); + Tr = VADD(Tj, Tl); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTWJ(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VADD(Tq, Tr); + Tv = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[0]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VSUB(Tq, Tr); + Tx = VBYI(VSUB(Tu, Tt)); + ST(&(x[WS(rs, 6)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tw, Tx), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Th; + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VADD(T4, Tf); + To = VSUB(T4, Tf); + Th = VMUL(LDK(KP707106781), VSUB(Te, T9)); + Tn = VBYI(VSUB(Th, Tm)); + Tp = VBYI(VADD(Tm, Th)); + ST(&(x[WS(rs, 7)]), VSUB(Tg, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tg, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(To, Tp), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1fv_8"), twinstr, &GENUS, {33, 16, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_8) (planner *p) { + X(kdft_dit_register) (p, t1fv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_9.c new file mode 100644 index 000000000..2dddd7e66 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1fv_9.c @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:27 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1fv_9 -include dft/simd/t1f.h */ + +/* + * This function contains 54 FP additions, 54 FP multiplications, + * (or, 20 additions, 20 multiplications, 34 fused multiply/add), + * 50 stack variables, 19 constants, and 18 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP666666666, +0.666666666666666666666666666666666666666666667); + DVK(KP879385241, +0.879385241571816768108218554649462939872416269); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP898197570, +0.898197570222573798468955502359086394667167570); + DVK(KP673648177, +0.673648177666930348851716626769314796000375677); + DVK(KP826351822, +0.826351822333069651148283373230685203999624323); + DVK(KP420276625, +0.420276625461206169731530603237061658838781920); + DVK(KP907603734, +0.907603734547952313649323976213898122064543220); + DVK(KP347296355, +0.347296355333860697703433253538629592000751354); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP203604859, +0.203604859554852403062088995281827210665664861); + DVK(KP726681596, +0.726681596905677465811651808188092531873167623); + DVK(KP152703644, +0.152703644666139302296566746461370407999248646); + DVK(KP968908795, +0.968908795874236621082202410917456709164223497); + DVK(KP439692620, +0.439692620785908384054109277324731469936208134); + DVK(KP586256827, +0.586256827714544512072145703099641959914944179); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, TD, Tf, Tn, Ts, Tv, Tt, Tu, Tw, TA, TK, TJ, TG, TF; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + TD = VSUB(T5, T3); + } + { + V T9, Th, Tb, Td, Te, Tj, Tl, Tm, T8, Tg; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[0]), T8); + Tg = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 2]), Tg); + { + V Ta, Tc, Ti, Tk; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tc = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 12]), Tc); + Te = VADD(Tb, Td); + Ti = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 8]), Ti); + Tk = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 14]), Tk); + Tm = VADD(Tj, Tl); + } + Tf = VADD(T9, Te); + Tn = VADD(Th, Tm); + Ts = VFNMS(LDK(KP500000000), Tm, Th); + Tv = VFNMS(LDK(KP500000000), Te, T9); + Tt = VSUB(Tb, Td); + Tu = VSUB(Tl, Tj); + Tw = VFNMS(LDK(KP586256827), Tv, Tu); + TA = VFNMS(LDK(KP439692620), Tt, Ts); + TK = VFMA(LDK(KP968908795), Tv, Tt); + TJ = VFNMS(LDK(KP152703644), Tu, Ts); + TG = VFNMS(LDK(KP726681596), Tt, Tv); + TF = VFMA(LDK(KP203604859), Ts, Tu); + } + { + V Tq, T7, To, Tp; + Tq = VMUL(LDK(KP866025403), VSUB(Tn, Tf)); + T7 = VADD(T1, T6); + To = VADD(Tf, Tn); + Tp = VFNMS(LDK(KP500000000), To, T7); + ST(&(x[0]), VADD(T7, To), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(Tq, Tp), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VFNMSI(Tq, Tp), ms, &(x[0])); + } + { + V Ty, TC, TM, TR, Tr, TI, TO, Tx, TB; + Tx = VFNMS(LDK(KP347296355), Tw, Tt); + Ty = VFNMS(LDK(KP907603734), Tx, Ts); + TB = VFNMS(LDK(KP420276625), TA, Tu); + TC = VFNMS(LDK(KP826351822), TB, Tv); + { + V TL, TQ, TN, TH; + TL = VFMA(LDK(KP673648177), TK, TJ); + TQ = VFNMS(LDK(KP898197570), TG, TF); + TM = VMUL(LDK(KP984807753), VFNMS(LDK(KP879385241), TD, TL)); + TR = VFMA(LDK(KP666666666), TL, TQ); + Tr = VFNMS(LDK(KP500000000), T6, T1); + TN = VFNMS(LDK(KP673648177), TK, TJ); + TH = VFMA(LDK(KP898197570), TG, TF); + TI = VFMA(LDK(KP852868531), TH, Tr); + TO = VFNMS(LDK(KP500000000), TH, TN); + } + ST(&(x[WS(rs, 1)]), VFNMSI(TM, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VFMAI(TM, TI), ms, &(x[0])); + { + V Tz, TE, TP, TS; + Tz = VFNMS(LDK(KP939692620), Ty, Tr); + TE = VMUL(LDK(KP984807753), VFMA(LDK(KP879385241), TD, TC)); + ST(&(x[WS(rs, 2)]), VFNMSI(TE, Tz), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VFMAI(TE, Tz), ms, &(x[WS(rs, 1)])); + TP = VFMA(LDK(KP852868531), TO, Tr); + TS = VMUL(LDK(KP866025403), VFMA(LDK(KP852868531), TR, TD)); + ST(&(x[WS(rs, 5)]), VFNMSI(TS, TP), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(TS, TP), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1fv_9"), twinstr, &GENUS, {20, 20, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_9) (planner *p) { + X(kdft_dit_register) (p, t1fv_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 9 -name t1fv_9 -include dft/simd/t1f.h */ + +/* + * This function contains 54 FP additions, 42 FP multiplications, + * (or, 38 additions, 26 multiplications, 16 fused multiply/add), + * 38 stack variables, 14 constants, and 18 memory accesses + */ +#include "dft/simd/t1f.h" + +static void t1fv_9(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP939692620, +0.939692620785908384054109277324731469936208134); + DVK(KP296198132, +0.296198132726023843175338011893050938967728390); + DVK(KP852868531, +0.852868531952443209628250963940074071936020296); + DVK(KP173648177, +0.173648177666930348851716626769314796000375677); + DVK(KP556670399, +0.556670399226419366452912952047023132968291906); + DVK(KP766044443, +0.766044443118978035202392650555416673935832457); + DVK(KP642787609, +0.642787609686539326322643409907263432907559884); + DVK(KP663413948, +0.663413948168938396205421319635891297216863310); + DVK(KP984807753, +0.984807753012208059366743024589523013670643252); + DVK(KP150383733, +0.150383733180435296639271897612501926072238258); + DVK(KP342020143, +0.342020143325668733044099614682259580763083368); + DVK(KP813797681, +0.813797681349373692844693217248393223289101568); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 16)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 16), MAKE_VOLATILE_STRIDE(9, rs)) { + V T1, T6, TA, Tt, Tf, Ts, Tw, Tn, Tv; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, T5, T2, T4; + T2 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 4]), T2); + T4 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 10]), T4); + T6 = VADD(T3, T5); + TA = VMUL(LDK(KP866025403), VSUB(T5, T3)); + } + { + V T9, Td, Tb, T8, Tc, Ta, Te; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[0]), T8); + Tc = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 12]), Tc); + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 6]), Ta); + Tt = VSUB(Td, Tb); + Te = VADD(Tb, Td); + Tf = VADD(T9, Te); + Ts = VFNMS(LDK(KP500000000), Te, T9); + } + { + V Th, Tl, Tj, Tg, Tk, Ti, Tm; + Tg = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 2]), Tg); + Tk = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 14]), Tk); + Ti = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 8]), Ti); + Tw = VSUB(Tl, Tj); + Tm = VADD(Tj, Tl); + Tn = VADD(Th, Tm); + Tv = VFNMS(LDK(KP500000000), Tm, Th); + } + { + V Tq, T7, To, Tp; + Tq = VBYI(VMUL(LDK(KP866025403), VSUB(Tn, Tf))); + T7 = VADD(T1, T6); + To = VADD(Tf, Tn); + Tp = VFNMS(LDK(KP500000000), To, T7); + ST(&(x[0]), VADD(T7, To), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(Tp, Tq), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VSUB(Tp, Tq), ms, &(x[0])); + } + { + V TI, TB, TC, TD, Tu, Tx, Ty, Tr, TH; + TI = VBYI(VSUB(VFNMS(LDK(KP342020143), Tv, VFNMS(LDK(KP150383733), Tt, VFNMS(LDK(KP984807753), Ts, VMUL(LDK(KP813797681), Tw)))), TA)); + TB = VFNMS(LDK(KP642787609), Ts, VMUL(LDK(KP663413948), Tt)); + TC = VFNMS(LDK(KP984807753), Tv, VMUL(LDK(KP150383733), Tw)); + TD = VADD(TB, TC); + Tu = VFMA(LDK(KP766044443), Ts, VMUL(LDK(KP556670399), Tt)); + Tx = VFMA(LDK(KP173648177), Tv, VMUL(LDK(KP852868531), Tw)); + Ty = VADD(Tu, Tx); + Tr = VFNMS(LDK(KP500000000), T6, T1); + TH = VFMA(LDK(KP173648177), Ts, VFNMS(LDK(KP296198132), Tw, VFNMS(LDK(KP939692620), Tv, VFNMS(LDK(KP852868531), Tt, Tr)))); + ST(&(x[WS(rs, 7)]), VSUB(TH, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(TH, TI), ms, &(x[0])); + { + V Tz, TE, TF, TG; + Tz = VADD(Tr, Ty); + TE = VBYI(VADD(TA, TD)); + ST(&(x[WS(rs, 8)]), VSUB(Tz, TE), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(TE, Tz), ms, &(x[WS(rs, 1)])); + TF = VFMA(LDK(KP866025403), VSUB(TB, TC), VFNMS(LDK(KP500000000), Ty, Tr)); + TG = VBYI(VADD(TA, VFNMS(LDK(KP500000000), TD, VMUL(LDK(KP866025403), VSUB(Tx, Tu))))); + ST(&(x[WS(rs, 5)]), VSUB(TF, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(TF, TG), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 9, XSIMD_STRING("t1fv_9"), twinstr, &GENUS, {38, 26, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1fv_9) (planner *p) { + X(kdft_dit_register) (p, t1fv_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_16.c new file mode 100644 index 000000000..f48c08699 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_16.c @@ -0,0 +1,826 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t1sv_16 -include dft/simd/ts.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 104 additions, 30 multiplications, 70 fused multiply/add), + * 60 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 30); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 30), MAKE_VOLATILE_STRIDE(32, rs)) { + V T8, T3z, T1I, T3o, T1s, T35, T2o, T2r, T1F, T36, T2p, T2w, Tl, T3A, T1N; + V T3k, Tz, T2V, T1T, T1U, T11, T30, T29, T2c, T1e, T31, T2a, T2h, TM, T2W; + V T1W, T21; + { + V T1, T3n, T3, T6, T4, T3l, T2, T7, T3m, T5; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T3n = LD(&(ii[0]), ms, &(ii[0])); + T3 = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + T6 = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 14])); + T4 = VMUL(T2, T3); + T3l = VMUL(T2, T6); + T5 = LDW(&(W[TWVL * 15])); + T7 = VFMA(T5, T6, T4); + T3m = VFNMS(T5, T3, T3l); + T8 = VADD(T1, T7); + T3z = VSUB(T3n, T3m); + T1I = VSUB(T1, T7); + T3o = VADD(T3m, T3n); + } + { + V T1h, T1k, T1i, T2k, T1n, T1q, T1o, T2m, T1g, T1m; + T1h = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T1k = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T1g = LDW(&(W[TWVL * 28])); + T1i = VMUL(T1g, T1h); + T2k = VMUL(T1g, T1k); + T1n = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T1q = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T1m = LDW(&(W[TWVL * 12])); + T1o = VMUL(T1m, T1n); + T2m = VMUL(T1m, T1q); + { + V T1l, T2l, T1r, T2n, T1j, T1p; + T1j = LDW(&(W[TWVL * 29])); + T1l = VFMA(T1j, T1k, T1i); + T2l = VFNMS(T1j, T1h, T2k); + T1p = LDW(&(W[TWVL * 13])); + T1r = VFMA(T1p, T1q, T1o); + T2n = VFNMS(T1p, T1n, T2m); + T1s = VADD(T1l, T1r); + T35 = VADD(T2l, T2n); + T2o = VSUB(T2l, T2n); + T2r = VSUB(T1l, T1r); + } + } + { + V T1u, T1x, T1v, T2s, T1A, T1D, T1B, T2u, T1t, T1z; + T1u = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T1x = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T1t = LDW(&(W[TWVL * 4])); + T1v = VMUL(T1t, T1u); + T2s = VMUL(T1t, T1x); + T1A = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T1D = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T1z = LDW(&(W[TWVL * 20])); + T1B = VMUL(T1z, T1A); + T2u = VMUL(T1z, T1D); + { + V T1y, T2t, T1E, T2v, T1w, T1C; + T1w = LDW(&(W[TWVL * 5])); + T1y = VFMA(T1w, T1x, T1v); + T2t = VFNMS(T1w, T1u, T2s); + T1C = LDW(&(W[TWVL * 21])); + T1E = VFMA(T1C, T1D, T1B); + T2v = VFNMS(T1C, T1A, T2u); + T1F = VADD(T1y, T1E); + T36 = VADD(T2t, T2v); + T2p = VSUB(T1y, T1E); + T2w = VSUB(T2t, T2v); + } + } + { + V Ta, Td, Tb, T1J, Tg, Tj, Th, T1L, T9, Tf; + Ta = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Td = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T9 = LDW(&(W[TWVL * 6])); + Tb = VMUL(T9, Ta); + T1J = VMUL(T9, Td); + Tg = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + Tj = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + Tf = LDW(&(W[TWVL * 22])); + Th = VMUL(Tf, Tg); + T1L = VMUL(Tf, Tj); + { + V Te, T1K, Tk, T1M, Tc, Ti; + Tc = LDW(&(W[TWVL * 7])); + Te = VFMA(Tc, Td, Tb); + T1K = VFNMS(Tc, Ta, T1J); + Ti = LDW(&(W[TWVL * 23])); + Tk = VFMA(Ti, Tj, Th); + T1M = VFNMS(Ti, Tg, T1L); + Tl = VADD(Te, Tk); + T3A = VSUB(Te, Tk); + T1N = VSUB(T1K, T1M); + T3k = VADD(T1K, T1M); + } + } + { + V To, Tr, Tp, T1P, Tu, Tx, Tv, T1R, Tn, Tt; + To = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + Tr = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + Tn = LDW(&(W[TWVL * 2])); + Tp = VMUL(Tn, To); + T1P = VMUL(Tn, Tr); + Tu = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + Tx = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + Tt = LDW(&(W[TWVL * 18])); + Tv = VMUL(Tt, Tu); + T1R = VMUL(Tt, Tx); + { + V Ts, T1Q, Ty, T1S, Tq, Tw; + Tq = LDW(&(W[TWVL * 3])); + Ts = VFMA(Tq, Tr, Tp); + T1Q = VFNMS(Tq, To, T1P); + Tw = LDW(&(W[TWVL * 19])); + Ty = VFMA(Tw, Tx, Tv); + T1S = VFNMS(Tw, Tu, T1R); + Tz = VADD(Ts, Ty); + T2V = VADD(T1Q, T1S); + T1T = VSUB(T1Q, T1S); + T1U = VSUB(Ts, Ty); + } + } + { + V TQ, TT, TR, T25, TW, TZ, TX, T27, TP, TV; + TQ = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + TT = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + TP = LDW(&(W[0])); + TR = VMUL(TP, TQ); + T25 = VMUL(TP, TT); + TW = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + TZ = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + TV = LDW(&(W[TWVL * 16])); + TX = VMUL(TV, TW); + T27 = VMUL(TV, TZ); + { + V TU, T26, T10, T28, TS, TY; + TS = LDW(&(W[TWVL * 1])); + TU = VFMA(TS, TT, TR); + T26 = VFNMS(TS, TQ, T25); + TY = LDW(&(W[TWVL * 17])); + T10 = VFMA(TY, TZ, TX); + T28 = VFNMS(TY, TW, T27); + T11 = VADD(TU, T10); + T30 = VADD(T26, T28); + T29 = VSUB(T26, T28); + T2c = VSUB(TU, T10); + } + } + { + V T13, T16, T14, T2d, T19, T1c, T1a, T2f, T12, T18; + T13 = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T16 = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T12 = LDW(&(W[TWVL * 8])); + T14 = VMUL(T12, T13); + T2d = VMUL(T12, T16); + T19 = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T1c = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T18 = LDW(&(W[TWVL * 24])); + T1a = VMUL(T18, T19); + T2f = VMUL(T18, T1c); + { + V T17, T2e, T1d, T2g, T15, T1b; + T15 = LDW(&(W[TWVL * 9])); + T17 = VFMA(T15, T16, T14); + T2e = VFNMS(T15, T13, T2d); + T1b = LDW(&(W[TWVL * 25])); + T1d = VFMA(T1b, T1c, T1a); + T2g = VFNMS(T1b, T19, T2f); + T1e = VADD(T17, T1d); + T31 = VADD(T2e, T2g); + T2a = VSUB(T17, T1d); + T2h = VSUB(T2e, T2g); + } + } + { + V TB, TE, TC, T1X, TH, TK, TI, T1Z, TA, TG; + TB = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + TE = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + TA = LDW(&(W[TWVL * 26])); + TC = VMUL(TA, TB); + T1X = VMUL(TA, TE); + TH = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + TK = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + TG = LDW(&(W[TWVL * 10])); + TI = VMUL(TG, TH); + T1Z = VMUL(TG, TK); + { + V TF, T1Y, TL, T20, TD, TJ; + TD = LDW(&(W[TWVL * 27])); + TF = VFMA(TD, TE, TC); + T1Y = VFNMS(TD, TB, T1X); + TJ = LDW(&(W[TWVL * 11])); + TL = VFMA(TJ, TK, TI); + T20 = VFNMS(TJ, TH, T1Z); + TM = VADD(TF, TL); + T2W = VADD(T1Y, T20); + T1W = VSUB(TF, TL); + T21 = VSUB(T1Y, T20); + } + } + { + V TO, T3e, T3q, T3s, T1H, T3r, T3h, T3i; + { + V Tm, TN, T3j, T3p; + Tm = VADD(T8, Tl); + TN = VADD(Tz, TM); + TO = VADD(Tm, TN); + T3e = VSUB(Tm, TN); + T3j = VADD(T2V, T2W); + T3p = VADD(T3k, T3o); + T3q = VADD(T3j, T3p); + T3s = VSUB(T3p, T3j); + } + { + V T1f, T1G, T3f, T3g; + T1f = VADD(T11, T1e); + T1G = VADD(T1s, T1F); + T1H = VADD(T1f, T1G); + T3r = VSUB(T1G, T1f); + T3f = VADD(T30, T31); + T3g = VADD(T35, T36); + T3h = VSUB(T3f, T3g); + T3i = VADD(T3f, T3g); + } + ST(&(ri[WS(rs, 8)]), VSUB(TO, T1H), ms, &(ri[0])); + ST(&(ii[WS(rs, 8)]), VSUB(T3q, T3i), ms, &(ii[0])); + ST(&(ri[0]), VADD(TO, T1H), ms, &(ri[0])); + ST(&(ii[0]), VADD(T3i, T3q), ms, &(ii[0])); + ST(&(ri[WS(rs, 12)]), VSUB(T3e, T3h), ms, &(ri[0])); + ST(&(ii[WS(rs, 12)]), VSUB(T3s, T3r), ms, &(ii[0])); + ST(&(ri[WS(rs, 4)]), VADD(T3e, T3h), ms, &(ri[0])); + ST(&(ii[WS(rs, 4)]), VADD(T3r, T3s), ms, &(ii[0])); + } + { + V T2Y, T3a, T3v, T3x, T33, T3b, T38, T3c; + { + V T2U, T2X, T3t, T3u; + T2U = VSUB(T8, Tl); + T2X = VSUB(T2V, T2W); + T2Y = VADD(T2U, T2X); + T3a = VSUB(T2U, T2X); + T3t = VSUB(TM, Tz); + T3u = VSUB(T3o, T3k); + T3v = VADD(T3t, T3u); + T3x = VSUB(T3u, T3t); + } + { + V T2Z, T32, T34, T37; + T2Z = VSUB(T11, T1e); + T32 = VSUB(T30, T31); + T33 = VADD(T2Z, T32); + T3b = VSUB(T32, T2Z); + T34 = VSUB(T1s, T1F); + T37 = VSUB(T35, T36); + T38 = VSUB(T34, T37); + T3c = VADD(T34, T37); + } + { + V T39, T3w, T3d, T3y; + T39 = VADD(T33, T38); + ST(&(ri[WS(rs, 10)]), VFNMS(LDK(KP707106781), T39, T2Y), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VFMA(LDK(KP707106781), T39, T2Y), ms, &(ri[0])); + T3w = VADD(T3b, T3c); + ST(&(ii[WS(rs, 2)]), VFMA(LDK(KP707106781), T3w, T3v), ms, &(ii[0])); + ST(&(ii[WS(rs, 10)]), VFNMS(LDK(KP707106781), T3w, T3v), ms, &(ii[0])); + T3d = VSUB(T3b, T3c); + ST(&(ri[WS(rs, 14)]), VFNMS(LDK(KP707106781), T3d, T3a), ms, &(ri[0])); + ST(&(ri[WS(rs, 6)]), VFMA(LDK(KP707106781), T3d, T3a), ms, &(ri[0])); + T3y = VSUB(T38, T33); + ST(&(ii[WS(rs, 6)]), VFMA(LDK(KP707106781), T3y, T3x), ms, &(ii[0])); + ST(&(ii[WS(rs, 14)]), VFNMS(LDK(KP707106781), T3y, T3x), ms, &(ii[0])); + } + } + { + V T1O, T3B, T3H, T2E, T23, T3C, T2O, T2S, T2H, T3I, T2j, T2B, T2L, T2R, T2y; + V T2C; + { + V T1V, T22, T2b, T2i; + T1O = VSUB(T1I, T1N); + T3B = VSUB(T3z, T3A); + T3H = VADD(T3A, T3z); + T2E = VADD(T1I, T1N); + T1V = VSUB(T1T, T1U); + T22 = VADD(T1W, T21); + T23 = VSUB(T1V, T22); + T3C = VADD(T1V, T22); + { + V T2M, T2N, T2F, T2G; + T2M = VADD(T2r, T2w); + T2N = VSUB(T2o, T2p); + T2O = VFNMS(LDK(KP414213562), T2N, T2M); + T2S = VFMA(LDK(KP414213562), T2M, T2N); + T2F = VADD(T1U, T1T); + T2G = VSUB(T1W, T21); + T2H = VADD(T2F, T2G); + T3I = VSUB(T2G, T2F); + } + T2b = VADD(T29, T2a); + T2i = VSUB(T2c, T2h); + T2j = VFMA(LDK(KP414213562), T2i, T2b); + T2B = VFNMS(LDK(KP414213562), T2b, T2i); + { + V T2J, T2K, T2q, T2x; + T2J = VADD(T2c, T2h); + T2K = VSUB(T29, T2a); + T2L = VFMA(LDK(KP414213562), T2K, T2J); + T2R = VFNMS(LDK(KP414213562), T2J, T2K); + T2q = VADD(T2o, T2p); + T2x = VSUB(T2r, T2w); + T2y = VFNMS(LDK(KP414213562), T2x, T2q); + T2C = VFMA(LDK(KP414213562), T2q, T2x); + } + } + { + V T24, T2z, T3J, T3K; + T24 = VFMA(LDK(KP707106781), T23, T1O); + T2z = VSUB(T2j, T2y); + ST(&(ri[WS(rs, 11)]), VFNMS(LDK(KP923879532), T2z, T24), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VFMA(LDK(KP923879532), T2z, T24), ms, &(ri[WS(rs, 1)])); + T3J = VFMA(LDK(KP707106781), T3I, T3H); + T3K = VSUB(T2C, T2B); + ST(&(ii[WS(rs, 3)]), VFMA(LDK(KP923879532), T3K, T3J), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 11)]), VFNMS(LDK(KP923879532), T3K, T3J), ms, &(ii[WS(rs, 1)])); + } + { + V T2A, T2D, T3L, T3M; + T2A = VFNMS(LDK(KP707106781), T23, T1O); + T2D = VADD(T2B, T2C); + ST(&(ri[WS(rs, 7)]), VFNMS(LDK(KP923879532), T2D, T2A), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 15)]), VFMA(LDK(KP923879532), T2D, T2A), ms, &(ri[WS(rs, 1)])); + T3L = VFNMS(LDK(KP707106781), T3I, T3H); + T3M = VADD(T2j, T2y); + ST(&(ii[WS(rs, 7)]), VFNMS(LDK(KP923879532), T3M, T3L), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 15)]), VFMA(LDK(KP923879532), T3M, T3L), ms, &(ii[WS(rs, 1)])); + } + { + V T2I, T2P, T3D, T3E; + T2I = VFMA(LDK(KP707106781), T2H, T2E); + T2P = VADD(T2L, T2O); + ST(&(ri[WS(rs, 9)]), VFNMS(LDK(KP923879532), T2P, T2I), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VFMA(LDK(KP923879532), T2P, T2I), ms, &(ri[WS(rs, 1)])); + T3D = VFMA(LDK(KP707106781), T3C, T3B); + T3E = VADD(T2R, T2S); + ST(&(ii[WS(rs, 1)]), VFMA(LDK(KP923879532), T3E, T3D), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 9)]), VFNMS(LDK(KP923879532), T3E, T3D), ms, &(ii[WS(rs, 1)])); + } + { + V T2Q, T2T, T3F, T3G; + T2Q = VFNMS(LDK(KP707106781), T2H, T2E); + T2T = VSUB(T2R, T2S); + ST(&(ri[WS(rs, 13)]), VFNMS(LDK(KP923879532), T2T, T2Q), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VFMA(LDK(KP923879532), T2T, T2Q), ms, &(ri[WS(rs, 1)])); + T3F = VFNMS(LDK(KP707106781), T3C, T3B); + T3G = VSUB(T2O, T2L); + ST(&(ii[WS(rs, 5)]), VFMA(LDK(KP923879532), T3G, T3F), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 13)]), VFNMS(LDK(KP923879532), T3G, T3F), ms, &(ii[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t1sv_16"), twinstr, &GENUS, {104, 30, 70, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_16) (planner *p) { + X(kdft_dit_register) (p, t1sv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t1sv_16 -include dft/simd/ts.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 136 additions, 46 multiplications, 38 fused multiply/add), + * 52 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 30); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 30), MAKE_VOLATILE_STRIDE(32, rs)) { + V T7, T37, T1t, T2U, Ti, T38, T1w, T2R, Tu, T2s, T1C, T2c, TF, T2t, T1H; + V T2d, T1f, T1q, T2B, T2C, T2D, T2E, T1Z, T2j, T24, T2k, TS, T13, T2w, T2x; + V T2y, T2z, T1O, T2g, T1T, T2h; + { + V T1, T2T, T6, T2S; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T2T = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T5, T2, T4; + T3 = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + T5 = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 14])); + T4 = LDW(&(W[TWVL * 15])); + T6 = VFMA(T2, T3, VMUL(T4, T5)); + T2S = VFNMS(T4, T3, VMUL(T2, T5)); + } + T7 = VADD(T1, T6); + T37 = VSUB(T2T, T2S); + T1t = VSUB(T1, T6); + T2U = VADD(T2S, T2T); + } + { + V Tc, T1u, Th, T1v; + { + V T9, Tb, T8, Ta; + T9 = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Tb = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T8 = LDW(&(W[TWVL * 6])); + Ta = LDW(&(W[TWVL * 7])); + Tc = VFMA(T8, T9, VMUL(Ta, Tb)); + T1u = VFNMS(Ta, T9, VMUL(T8, Tb)); + } + { + V Te, Tg, Td, Tf; + Te = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + Tg = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + Td = LDW(&(W[TWVL * 22])); + Tf = LDW(&(W[TWVL * 23])); + Th = VFMA(Td, Te, VMUL(Tf, Tg)); + T1v = VFNMS(Tf, Te, VMUL(Td, Tg)); + } + Ti = VADD(Tc, Th); + T38 = VSUB(Tc, Th); + T1w = VSUB(T1u, T1v); + T2R = VADD(T1u, T1v); + } + { + V To, T1y, Tt, T1z, T1A, T1B; + { + V Tl, Tn, Tk, Tm; + Tl = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + Tn = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + Tk = LDW(&(W[TWVL * 2])); + Tm = LDW(&(W[TWVL * 3])); + To = VFMA(Tk, Tl, VMUL(Tm, Tn)); + T1y = VFNMS(Tm, Tl, VMUL(Tk, Tn)); + } + { + V Tq, Ts, Tp, Tr; + Tq = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + Ts = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + Tp = LDW(&(W[TWVL * 18])); + Tr = LDW(&(W[TWVL * 19])); + Tt = VFMA(Tp, Tq, VMUL(Tr, Ts)); + T1z = VFNMS(Tr, Tq, VMUL(Tp, Ts)); + } + Tu = VADD(To, Tt); + T2s = VADD(T1y, T1z); + T1A = VSUB(T1y, T1z); + T1B = VSUB(To, Tt); + T1C = VSUB(T1A, T1B); + T2c = VADD(T1B, T1A); + } + { + V Tz, T1E, TE, T1F, T1D, T1G; + { + V Tw, Ty, Tv, Tx; + Tw = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + Ty = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + Tv = LDW(&(W[TWVL * 26])); + Tx = LDW(&(W[TWVL * 27])); + Tz = VFMA(Tv, Tw, VMUL(Tx, Ty)); + T1E = VFNMS(Tx, Tw, VMUL(Tv, Ty)); + } + { + V TB, TD, TA, TC; + TB = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + TD = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + TA = LDW(&(W[TWVL * 10])); + TC = LDW(&(W[TWVL * 11])); + TE = VFMA(TA, TB, VMUL(TC, TD)); + T1F = VFNMS(TC, TB, VMUL(TA, TD)); + } + TF = VADD(Tz, TE); + T2t = VADD(T1E, T1F); + T1D = VSUB(Tz, TE); + T1G = VSUB(T1E, T1F); + T1H = VADD(T1D, T1G); + T2d = VSUB(T1D, T1G); + } + { + V T19, T20, T1p, T1X, T1e, T21, T1k, T1W; + { + V T16, T18, T15, T17; + T16 = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T18 = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T15 = LDW(&(W[TWVL * 28])); + T17 = LDW(&(W[TWVL * 29])); + T19 = VFMA(T15, T16, VMUL(T17, T18)); + T20 = VFNMS(T17, T16, VMUL(T15, T18)); + } + { + V T1m, T1o, T1l, T1n; + T1m = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T1o = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T1l = LDW(&(W[TWVL * 20])); + T1n = LDW(&(W[TWVL * 21])); + T1p = VFMA(T1l, T1m, VMUL(T1n, T1o)); + T1X = VFNMS(T1n, T1m, VMUL(T1l, T1o)); + } + { + V T1b, T1d, T1a, T1c; + T1b = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T1d = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T1a = LDW(&(W[TWVL * 12])); + T1c = LDW(&(W[TWVL * 13])); + T1e = VFMA(T1a, T1b, VMUL(T1c, T1d)); + T21 = VFNMS(T1c, T1b, VMUL(T1a, T1d)); + } + { + V T1h, T1j, T1g, T1i; + T1h = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T1j = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T1g = LDW(&(W[TWVL * 4])); + T1i = LDW(&(W[TWVL * 5])); + T1k = VFMA(T1g, T1h, VMUL(T1i, T1j)); + T1W = VFNMS(T1i, T1h, VMUL(T1g, T1j)); + } + T1f = VADD(T19, T1e); + T1q = VADD(T1k, T1p); + T2B = VSUB(T1f, T1q); + T2C = VADD(T20, T21); + T2D = VADD(T1W, T1X); + T2E = VSUB(T2C, T2D); + { + V T1V, T1Y, T22, T23; + T1V = VSUB(T19, T1e); + T1Y = VSUB(T1W, T1X); + T1Z = VSUB(T1V, T1Y); + T2j = VADD(T1V, T1Y); + T22 = VSUB(T20, T21); + T23 = VSUB(T1k, T1p); + T24 = VADD(T22, T23); + T2k = VSUB(T22, T23); + } + } + { + V TM, T1K, T12, T1R, TR, T1L, TX, T1Q; + { + V TJ, TL, TI, TK; + TJ = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + TL = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + TI = LDW(&(W[0])); + TK = LDW(&(W[TWVL * 1])); + TM = VFMA(TI, TJ, VMUL(TK, TL)); + T1K = VFNMS(TK, TJ, VMUL(TI, TL)); + } + { + V TZ, T11, TY, T10; + TZ = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T11 = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + TY = LDW(&(W[TWVL * 24])); + T10 = LDW(&(W[TWVL * 25])); + T12 = VFMA(TY, TZ, VMUL(T10, T11)); + T1R = VFNMS(T10, TZ, VMUL(TY, T11)); + } + { + V TO, TQ, TN, TP; + TO = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + TQ = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + TN = LDW(&(W[TWVL * 16])); + TP = LDW(&(W[TWVL * 17])); + TR = VFMA(TN, TO, VMUL(TP, TQ)); + T1L = VFNMS(TP, TO, VMUL(TN, TQ)); + } + { + V TU, TW, TT, TV; + TU = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + TW = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + TT = LDW(&(W[TWVL * 8])); + TV = LDW(&(W[TWVL * 9])); + TX = VFMA(TT, TU, VMUL(TV, TW)); + T1Q = VFNMS(TV, TU, VMUL(TT, TW)); + } + TS = VADD(TM, TR); + T13 = VADD(TX, T12); + T2w = VSUB(TS, T13); + T2x = VADD(T1K, T1L); + T2y = VADD(T1Q, T1R); + T2z = VSUB(T2x, T2y); + { + V T1M, T1N, T1P, T1S; + T1M = VSUB(T1K, T1L); + T1N = VSUB(TX, T12); + T1O = VADD(T1M, T1N); + T2g = VSUB(T1M, T1N); + T1P = VSUB(TM, TR); + T1S = VSUB(T1Q, T1R); + T1T = VSUB(T1P, T1S); + T2h = VADD(T1P, T1S); + } + } + { + V T1J, T27, T3g, T3i, T26, T3h, T2a, T3d; + { + V T1x, T1I, T3e, T3f; + T1x = VSUB(T1t, T1w); + T1I = VMUL(LDK(KP707106781), VSUB(T1C, T1H)); + T1J = VADD(T1x, T1I); + T27 = VSUB(T1x, T1I); + T3e = VMUL(LDK(KP707106781), VSUB(T2d, T2c)); + T3f = VADD(T38, T37); + T3g = VADD(T3e, T3f); + T3i = VSUB(T3f, T3e); + } + { + V T1U, T25, T28, T29; + T1U = VFMA(LDK(KP923879532), T1O, VMUL(LDK(KP382683432), T1T)); + T25 = VFNMS(LDK(KP923879532), T24, VMUL(LDK(KP382683432), T1Z)); + T26 = VADD(T1U, T25); + T3h = VSUB(T25, T1U); + T28 = VFNMS(LDK(KP923879532), T1T, VMUL(LDK(KP382683432), T1O)); + T29 = VFMA(LDK(KP382683432), T24, VMUL(LDK(KP923879532), T1Z)); + T2a = VSUB(T28, T29); + T3d = VADD(T28, T29); + } + ST(&(ri[WS(rs, 11)]), VSUB(T1J, T26), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 11)]), VSUB(T3g, T3d), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VADD(T1J, T26), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(T3d, T3g), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 15)]), VSUB(T27, T2a), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 15)]), VSUB(T3i, T3h), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VADD(T27, T2a), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 7)]), VADD(T3h, T3i), ms, &(ii[WS(rs, 1)])); + } + { + V T2v, T2H, T32, T34, T2G, T33, T2K, T2Z; + { + V T2r, T2u, T30, T31; + T2r = VSUB(T7, Ti); + T2u = VSUB(T2s, T2t); + T2v = VADD(T2r, T2u); + T2H = VSUB(T2r, T2u); + T30 = VSUB(TF, Tu); + T31 = VSUB(T2U, T2R); + T32 = VADD(T30, T31); + T34 = VSUB(T31, T30); + } + { + V T2A, T2F, T2I, T2J; + T2A = VADD(T2w, T2z); + T2F = VSUB(T2B, T2E); + T2G = VMUL(LDK(KP707106781), VADD(T2A, T2F)); + T33 = VMUL(LDK(KP707106781), VSUB(T2F, T2A)); + T2I = VSUB(T2z, T2w); + T2J = VADD(T2B, T2E); + T2K = VMUL(LDK(KP707106781), VSUB(T2I, T2J)); + T2Z = VMUL(LDK(KP707106781), VADD(T2I, T2J)); + } + ST(&(ri[WS(rs, 10)]), VSUB(T2v, T2G), ms, &(ri[0])); + ST(&(ii[WS(rs, 10)]), VSUB(T32, T2Z), ms, &(ii[0])); + ST(&(ri[WS(rs, 2)]), VADD(T2v, T2G), ms, &(ri[0])); + ST(&(ii[WS(rs, 2)]), VADD(T2Z, T32), ms, &(ii[0])); + ST(&(ri[WS(rs, 14)]), VSUB(T2H, T2K), ms, &(ri[0])); + ST(&(ii[WS(rs, 14)]), VSUB(T34, T33), ms, &(ii[0])); + ST(&(ri[WS(rs, 6)]), VADD(T2H, T2K), ms, &(ri[0])); + ST(&(ii[WS(rs, 6)]), VADD(T33, T34), ms, &(ii[0])); + } + { + V T2f, T2n, T3a, T3c, T2m, T3b, T2q, T35; + { + V T2b, T2e, T36, T39; + T2b = VADD(T1t, T1w); + T2e = VMUL(LDK(KP707106781), VADD(T2c, T2d)); + T2f = VADD(T2b, T2e); + T2n = VSUB(T2b, T2e); + T36 = VMUL(LDK(KP707106781), VADD(T1C, T1H)); + T39 = VSUB(T37, T38); + T3a = VADD(T36, T39); + T3c = VSUB(T39, T36); + } + { + V T2i, T2l, T2o, T2p; + T2i = VFMA(LDK(KP382683432), T2g, VMUL(LDK(KP923879532), T2h)); + T2l = VFNMS(LDK(KP382683432), T2k, VMUL(LDK(KP923879532), T2j)); + T2m = VADD(T2i, T2l); + T3b = VSUB(T2l, T2i); + T2o = VFNMS(LDK(KP382683432), T2h, VMUL(LDK(KP923879532), T2g)); + T2p = VFMA(LDK(KP923879532), T2k, VMUL(LDK(KP382683432), T2j)); + T2q = VSUB(T2o, T2p); + T35 = VADD(T2o, T2p); + } + ST(&(ri[WS(rs, 9)]), VSUB(T2f, T2m), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 9)]), VSUB(T3a, T35), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(T2f, T2m), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VADD(T35, T3a), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 13)]), VSUB(T2n, T2q), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 13)]), VSUB(T3c, T3b), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VADD(T2n, T2q), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 5)]), VADD(T3b, T3c), ms, &(ii[WS(rs, 1)])); + } + { + V TH, T2L, T2W, T2Y, T1s, T2X, T2O, T2P; + { + V Tj, TG, T2Q, T2V; + Tj = VADD(T7, Ti); + TG = VADD(Tu, TF); + TH = VADD(Tj, TG); + T2L = VSUB(Tj, TG); + T2Q = VADD(T2s, T2t); + T2V = VADD(T2R, T2U); + T2W = VADD(T2Q, T2V); + T2Y = VSUB(T2V, T2Q); + } + { + V T14, T1r, T2M, T2N; + T14 = VADD(TS, T13); + T1r = VADD(T1f, T1q); + T1s = VADD(T14, T1r); + T2X = VSUB(T1r, T14); + T2M = VADD(T2x, T2y); + T2N = VADD(T2C, T2D); + T2O = VSUB(T2M, T2N); + T2P = VADD(T2M, T2N); + } + ST(&(ri[WS(rs, 8)]), VSUB(TH, T1s), ms, &(ri[0])); + ST(&(ii[WS(rs, 8)]), VSUB(T2W, T2P), ms, &(ii[0])); + ST(&(ri[0]), VADD(TH, T1s), ms, &(ri[0])); + ST(&(ii[0]), VADD(T2P, T2W), ms, &(ii[0])); + ST(&(ri[WS(rs, 12)]), VSUB(T2L, T2O), ms, &(ri[0])); + ST(&(ii[WS(rs, 12)]), VSUB(T2Y, T2X), ms, &(ii[0])); + ST(&(ri[WS(rs, 4)]), VADD(T2L, T2O), ms, &(ri[0])); + ST(&(ii[WS(rs, 4)]), VADD(T2X, T2Y), ms, &(ii[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t1sv_16"), twinstr, &GENUS, {136, 46, 38, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_16) (planner *p) { + X(kdft_dit_register) (p, t1sv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_2.c new file mode 100644 index 000000000..71fba598a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_2.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1sv_2 -include dft/simd/ts.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 2); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 2), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, Ta, T3, T6, T4, T8, T2, T7, T9, T5; + T1 = LD(&(ri[0]), ms, &(ri[0])); + Ta = LD(&(ii[0]), ms, &(ii[0])); + T3 = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T6 = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T2 = LDW(&(W[0])); + T4 = VMUL(T2, T3); + T8 = VMUL(T2, T6); + T5 = LDW(&(W[TWVL * 1])); + T7 = VFMA(T5, T6, T4); + T9 = VFNMS(T5, T3, T8); + ST(&(ri[WS(rs, 1)]), VSUB(T1, T7), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VSUB(Ta, T9), ms, &(ii[WS(rs, 1)])); + ST(&(ri[0]), VADD(T1, T7), ms, &(ri[0])); + ST(&(ii[0]), VADD(T9, Ta), ms, &(ii[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1sv_2"), twinstr, &GENUS, {4, 2, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_2) (planner *p) { + X(kdft_dit_register) (p, t1sv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t1sv_2 -include dft/simd/ts.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 2); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 2), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T6, T7; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T8 = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T5, T2, T4; + T3 = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T5 = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T2 = LDW(&(W[0])); + T4 = LDW(&(W[TWVL * 1])); + T6 = VFMA(T2, T3, VMUL(T4, T5)); + T7 = VFNMS(T4, T3, VMUL(T2, T5)); + } + ST(&(ri[WS(rs, 1)]), VSUB(T1, T6), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VSUB(T8, T7), ms, &(ii[WS(rs, 1)])); + ST(&(ri[0]), VADD(T1, T6), ms, &(ri[0])); + ST(&(ii[0]), VADD(T7, T8), ms, &(ii[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t1sv_2"), twinstr, &GENUS, {4, 2, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_2) (planner *p) { + X(kdft_dit_register) (p, t1sv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_32.c new file mode 100644 index 000000000..206870d0b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_32.c @@ -0,0 +1,1871 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:10 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t1sv_32 -include dft/simd/ts.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 236 additions, 62 multiplications, 198 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 62); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 62), MAKE_VOLATILE_STRIDE(64, rs)) { + V T8, T8x, T3w, T87, Tl, T8y, T3B, T83, Tz, T6F, T3J, T5T, TM, T6G, T3Q; + V T5U, T11, T1e, T6M, T6J, T6K, T6L, T3Z, T5X, T46, T5Y, T1s, T1F, T6O, T6P; + V T6Q, T6R, T4e, T60, T4l, T61, T32, T7b, T78, T7N, T54, T6f, T5r, T6c, T29; + V T70, T6X, T7I, T4v, T68, T4S, T65, T3t, T79, T7e, T7O, T5b, T5s, T5i, T5t; + V T2A, T6Y, T73, T7J, T4C, T4T, T4J, T4U; + { + V T1, T86, T3, T6, T4, T84, T2, T7, T85, T5; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T86 = LD(&(ii[0]), ms, &(ii[0])); + T3 = LD(&(ri[WS(rs, 16)]), ms, &(ri[0])); + T6 = LD(&(ii[WS(rs, 16)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 30])); + T4 = VMUL(T2, T3); + T84 = VMUL(T2, T6); + T5 = LDW(&(W[TWVL * 31])); + T7 = VFMA(T5, T6, T4); + T85 = VFNMS(T5, T3, T84); + T8 = VADD(T1, T7); + T8x = VSUB(T86, T85); + T3w = VSUB(T1, T7); + T87 = VADD(T85, T86); + } + { + V Ta, Td, Tb, T3x, Tg, Tj, Th, T3z, T9, Tf; + Ta = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + Td = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + T9 = LDW(&(W[TWVL * 14])); + Tb = VMUL(T9, Ta); + T3x = VMUL(T9, Td); + Tg = LD(&(ri[WS(rs, 24)]), ms, &(ri[0])); + Tj = LD(&(ii[WS(rs, 24)]), ms, &(ii[0])); + Tf = LDW(&(W[TWVL * 46])); + Th = VMUL(Tf, Tg); + T3z = VMUL(Tf, Tj); + { + V Te, T3y, Tk, T3A, Tc, Ti; + Tc = LDW(&(W[TWVL * 15])); + Te = VFMA(Tc, Td, Tb); + T3y = VFNMS(Tc, Ta, T3x); + Ti = LDW(&(W[TWVL * 47])); + Tk = VFMA(Ti, Tj, Th); + T3A = VFNMS(Ti, Tg, T3z); + Tl = VADD(Te, Tk); + T8y = VSUB(Te, Tk); + T3B = VSUB(T3y, T3A); + T83 = VADD(T3y, T3A); + } + } + { + V Ts, T3F, Ty, T3H, T3D, T3I; + { + V To, Tr, Tp, T3E, Tn, Tq; + To = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Tr = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + Tn = LDW(&(W[TWVL * 6])); + Tp = VMUL(Tn, To); + T3E = VMUL(Tn, Tr); + Tq = LDW(&(W[TWVL * 7])); + Ts = VFMA(Tq, Tr, Tp); + T3F = VFNMS(Tq, To, T3E); + } + { + V Tu, Tx, Tv, T3G, Tt, Tw; + Tu = LD(&(ri[WS(rs, 20)]), ms, &(ri[0])); + Tx = LD(&(ii[WS(rs, 20)]), ms, &(ii[0])); + Tt = LDW(&(W[TWVL * 38])); + Tv = VMUL(Tt, Tu); + T3G = VMUL(Tt, Tx); + Tw = LDW(&(W[TWVL * 39])); + Ty = VFMA(Tw, Tx, Tv); + T3H = VFNMS(Tw, Tu, T3G); + } + Tz = VADD(Ts, Ty); + T6F = VADD(T3F, T3H); + T3D = VSUB(Ts, Ty); + T3I = VSUB(T3F, T3H); + T3J = VADD(T3D, T3I); + T5T = VSUB(T3I, T3D); + } + { + V TF, T3M, TL, T3O, T3K, T3P; + { + V TB, TE, TC, T3L, TA, TD; + TB = LD(&(ri[WS(rs, 28)]), ms, &(ri[0])); + TE = LD(&(ii[WS(rs, 28)]), ms, &(ii[0])); + TA = LDW(&(W[TWVL * 54])); + TC = VMUL(TA, TB); + T3L = VMUL(TA, TE); + TD = LDW(&(W[TWVL * 55])); + TF = VFMA(TD, TE, TC); + T3M = VFNMS(TD, TB, T3L); + } + { + V TH, TK, TI, T3N, TG, TJ; + TH = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + TK = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + TG = LDW(&(W[TWVL * 22])); + TI = VMUL(TG, TH); + T3N = VMUL(TG, TK); + TJ = LDW(&(W[TWVL * 23])); + TL = VFMA(TJ, TK, TI); + T3O = VFNMS(TJ, TH, T3N); + } + TM = VADD(TF, TL); + T6G = VADD(T3M, T3O); + T3K = VSUB(TF, TL); + T3P = VSUB(T3M, T3O); + T3Q = VSUB(T3K, T3P); + T5U = VADD(T3K, T3P); + } + { + V TU, T3U, T1d, T44, T10, T3W, T17, T42; + { + V TQ, TT, TR, T3T, TP, TS; + TQ = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + TT = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + TP = LDW(&(W[TWVL * 2])); + TR = VMUL(TP, TQ); + T3T = VMUL(TP, TT); + TS = LDW(&(W[TWVL * 3])); + TU = VFMA(TS, TT, TR); + T3U = VFNMS(TS, TQ, T3T); + } + { + V T19, T1c, T1a, T43, T18, T1b; + T19 = LD(&(ri[WS(rs, 26)]), ms, &(ri[0])); + T1c = LD(&(ii[WS(rs, 26)]), ms, &(ii[0])); + T18 = LDW(&(W[TWVL * 50])); + T1a = VMUL(T18, T19); + T43 = VMUL(T18, T1c); + T1b = LDW(&(W[TWVL * 51])); + T1d = VFMA(T1b, T1c, T1a); + T44 = VFNMS(T1b, T19, T43); + } + { + V TW, TZ, TX, T3V, TV, TY; + TW = LD(&(ri[WS(rs, 18)]), ms, &(ri[0])); + TZ = LD(&(ii[WS(rs, 18)]), ms, &(ii[0])); + TV = LDW(&(W[TWVL * 34])); + TX = VMUL(TV, TW); + T3V = VMUL(TV, TZ); + TY = LDW(&(W[TWVL * 35])); + T10 = VFMA(TY, TZ, TX); + T3W = VFNMS(TY, TW, T3V); + } + { + V T13, T16, T14, T41, T12, T15; + T13 = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + T16 = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + T12 = LDW(&(W[TWVL * 18])); + T14 = VMUL(T12, T13); + T41 = VMUL(T12, T16); + T15 = LDW(&(W[TWVL * 19])); + T17 = VFMA(T15, T16, T14); + T42 = VFNMS(T15, T13, T41); + } + T11 = VADD(TU, T10); + T1e = VADD(T17, T1d); + T6M = VSUB(T11, T1e); + T6J = VADD(T3U, T3W); + T6K = VADD(T42, T44); + T6L = VSUB(T6J, T6K); + { + V T3X, T3Y, T40, T45; + T3X = VSUB(T3U, T3W); + T3Y = VSUB(T17, T1d); + T3Z = VSUB(T3X, T3Y); + T5X = VADD(T3X, T3Y); + T40 = VSUB(TU, T10); + T45 = VSUB(T42, T44); + T46 = VADD(T40, T45); + T5Y = VSUB(T40, T45); + } + } + { + V T1l, T49, T1E, T4j, T1r, T4b, T1y, T4h; + { + V T1h, T1k, T1i, T48, T1g, T1j; + T1h = LD(&(ri[WS(rs, 30)]), ms, &(ri[0])); + T1k = LD(&(ii[WS(rs, 30)]), ms, &(ii[0])); + T1g = LDW(&(W[TWVL * 58])); + T1i = VMUL(T1g, T1h); + T48 = VMUL(T1g, T1k); + T1j = LDW(&(W[TWVL * 59])); + T1l = VFMA(T1j, T1k, T1i); + T49 = VFNMS(T1j, T1h, T48); + } + { + V T1A, T1D, T1B, T4i, T1z, T1C; + T1A = LD(&(ri[WS(rs, 22)]), ms, &(ri[0])); + T1D = LD(&(ii[WS(rs, 22)]), ms, &(ii[0])); + T1z = LDW(&(W[TWVL * 42])); + T1B = VMUL(T1z, T1A); + T4i = VMUL(T1z, T1D); + T1C = LDW(&(W[TWVL * 43])); + T1E = VFMA(T1C, T1D, T1B); + T4j = VFNMS(T1C, T1A, T4i); + } + { + V T1n, T1q, T1o, T4a, T1m, T1p; + T1n = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + T1q = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + T1m = LDW(&(W[TWVL * 26])); + T1o = VMUL(T1m, T1n); + T4a = VMUL(T1m, T1q); + T1p = LDW(&(W[TWVL * 27])); + T1r = VFMA(T1p, T1q, T1o); + T4b = VFNMS(T1p, T1n, T4a); + } + { + V T1u, T1x, T1v, T4g, T1t, T1w; + T1u = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + T1x = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + T1t = LDW(&(W[TWVL * 10])); + T1v = VMUL(T1t, T1u); + T4g = VMUL(T1t, T1x); + T1w = LDW(&(W[TWVL * 11])); + T1y = VFMA(T1w, T1x, T1v); + T4h = VFNMS(T1w, T1u, T4g); + } + T1s = VADD(T1l, T1r); + T1F = VADD(T1y, T1E); + T6O = VSUB(T1s, T1F); + T6P = VADD(T49, T4b); + T6Q = VADD(T4h, T4j); + T6R = VSUB(T6P, T6Q); + { + V T4c, T4d, T4f, T4k; + T4c = VSUB(T49, T4b); + T4d = VSUB(T1y, T1E); + T4e = VSUB(T4c, T4d); + T60 = VADD(T4c, T4d); + T4f = VSUB(T1l, T1r); + T4k = VSUB(T4h, T4j); + T4l = VADD(T4f, T4k); + T61 = VSUB(T4f, T4k); + } + } + { + V T2H, T4Z, T30, T5p, T2N, T51, T2U, T5n; + { + V T2D, T2G, T2E, T4Y, T2C, T2F; + T2D = LD(&(ri[WS(rs, 31)]), ms, &(ri[WS(rs, 1)])); + T2G = LD(&(ii[WS(rs, 31)]), ms, &(ii[WS(rs, 1)])); + T2C = LDW(&(W[TWVL * 60])); + T2E = VMUL(T2C, T2D); + T4Y = VMUL(T2C, T2G); + T2F = LDW(&(W[TWVL * 61])); + T2H = VFMA(T2F, T2G, T2E); + T4Z = VFNMS(T2F, T2D, T4Y); + } + { + V T2W, T2Z, T2X, T5o, T2V, T2Y; + T2W = LD(&(ri[WS(rs, 23)]), ms, &(ri[WS(rs, 1)])); + T2Z = LD(&(ii[WS(rs, 23)]), ms, &(ii[WS(rs, 1)])); + T2V = LDW(&(W[TWVL * 44])); + T2X = VMUL(T2V, T2W); + T5o = VMUL(T2V, T2Z); + T2Y = LDW(&(W[TWVL * 45])); + T30 = VFMA(T2Y, T2Z, T2X); + T5p = VFNMS(T2Y, T2W, T5o); + } + { + V T2J, T2M, T2K, T50, T2I, T2L; + T2J = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T2M = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T2I = LDW(&(W[TWVL * 28])); + T2K = VMUL(T2I, T2J); + T50 = VMUL(T2I, T2M); + T2L = LDW(&(W[TWVL * 29])); + T2N = VFMA(T2L, T2M, T2K); + T51 = VFNMS(T2L, T2J, T50); + } + { + V T2Q, T2T, T2R, T5m, T2P, T2S; + T2Q = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T2T = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T2P = LDW(&(W[TWVL * 12])); + T2R = VMUL(T2P, T2Q); + T5m = VMUL(T2P, T2T); + T2S = LDW(&(W[TWVL * 13])); + T2U = VFMA(T2S, T2T, T2R); + T5n = VFNMS(T2S, T2Q, T5m); + } + { + V T2O, T31, T76, T77; + T2O = VADD(T2H, T2N); + T31 = VADD(T2U, T30); + T32 = VADD(T2O, T31); + T7b = VSUB(T2O, T31); + T76 = VADD(T4Z, T51); + T77 = VADD(T5n, T5p); + T78 = VSUB(T76, T77); + T7N = VADD(T76, T77); + } + { + V T52, T53, T5l, T5q; + T52 = VSUB(T4Z, T51); + T53 = VSUB(T2U, T30); + T54 = VSUB(T52, T53); + T6f = VADD(T52, T53); + T5l = VSUB(T2H, T2N); + T5q = VSUB(T5n, T5p); + T5r = VADD(T5l, T5q); + T6c = VSUB(T5l, T5q); + } + } + { + V T1O, T4q, T27, T4Q, T1U, T4s, T21, T4O; + { + V T1K, T1N, T1L, T4p, T1J, T1M; + T1K = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T1N = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T1J = LDW(&(W[0])); + T1L = VMUL(T1J, T1K); + T4p = VMUL(T1J, T1N); + T1M = LDW(&(W[TWVL * 1])); + T1O = VFMA(T1M, T1N, T1L); + T4q = VFNMS(T1M, T1K, T4p); + } + { + V T23, T26, T24, T4P, T22, T25; + T23 = LD(&(ri[WS(rs, 25)]), ms, &(ri[WS(rs, 1)])); + T26 = LD(&(ii[WS(rs, 25)]), ms, &(ii[WS(rs, 1)])); + T22 = LDW(&(W[TWVL * 48])); + T24 = VMUL(T22, T23); + T4P = VMUL(T22, T26); + T25 = LDW(&(W[TWVL * 49])); + T27 = VFMA(T25, T26, T24); + T4Q = VFNMS(T25, T23, T4P); + } + { + V T1Q, T1T, T1R, T4r, T1P, T1S; + T1Q = LD(&(ri[WS(rs, 17)]), ms, &(ri[WS(rs, 1)])); + T1T = LD(&(ii[WS(rs, 17)]), ms, &(ii[WS(rs, 1)])); + T1P = LDW(&(W[TWVL * 32])); + T1R = VMUL(T1P, T1Q); + T4r = VMUL(T1P, T1T); + T1S = LDW(&(W[TWVL * 33])); + T1U = VFMA(T1S, T1T, T1R); + T4s = VFNMS(T1S, T1Q, T4r); + } + { + V T1X, T20, T1Y, T4N, T1W, T1Z; + T1X = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + T20 = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + T1W = LDW(&(W[TWVL * 16])); + T1Y = VMUL(T1W, T1X); + T4N = VMUL(T1W, T20); + T1Z = LDW(&(W[TWVL * 17])); + T21 = VFMA(T1Z, T20, T1Y); + T4O = VFNMS(T1Z, T1X, T4N); + } + { + V T1V, T28, T6V, T6W; + T1V = VADD(T1O, T1U); + T28 = VADD(T21, T27); + T29 = VADD(T1V, T28); + T70 = VSUB(T1V, T28); + T6V = VADD(T4q, T4s); + T6W = VADD(T4O, T4Q); + T6X = VSUB(T6V, T6W); + T7I = VADD(T6V, T6W); + } + { + V T4t, T4u, T4M, T4R; + T4t = VSUB(T4q, T4s); + T4u = VSUB(T21, T27); + T4v = VSUB(T4t, T4u); + T68 = VADD(T4t, T4u); + T4M = VSUB(T1O, T1U); + T4R = VSUB(T4O, T4Q); + T4S = VADD(T4M, T4R); + T65 = VSUB(T4M, T4R); + } + } + { + V T38, T56, T3r, T5g, T3e, T58, T3l, T5e; + { + V T34, T37, T35, T55, T33, T36; + T34 = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T37 = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T33 = LDW(&(W[TWVL * 4])); + T35 = VMUL(T33, T34); + T55 = VMUL(T33, T37); + T36 = LDW(&(W[TWVL * 5])); + T38 = VFMA(T36, T37, T35); + T56 = VFNMS(T36, T34, T55); + } + { + V T3n, T3q, T3o, T5f, T3m, T3p; + T3n = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T3q = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T3m = LDW(&(W[TWVL * 20])); + T3o = VMUL(T3m, T3n); + T5f = VMUL(T3m, T3q); + T3p = LDW(&(W[TWVL * 21])); + T3r = VFMA(T3p, T3q, T3o); + T5g = VFNMS(T3p, T3n, T5f); + } + { + V T3a, T3d, T3b, T57, T39, T3c; + T3a = LD(&(ri[WS(rs, 19)]), ms, &(ri[WS(rs, 1)])); + T3d = LD(&(ii[WS(rs, 19)]), ms, &(ii[WS(rs, 1)])); + T39 = LDW(&(W[TWVL * 36])); + T3b = VMUL(T39, T3a); + T57 = VMUL(T39, T3d); + T3c = LDW(&(W[TWVL * 37])); + T3e = VFMA(T3c, T3d, T3b); + T58 = VFNMS(T3c, T3a, T57); + } + { + V T3h, T3k, T3i, T5d, T3g, T3j; + T3h = LD(&(ri[WS(rs, 27)]), ms, &(ri[WS(rs, 1)])); + T3k = LD(&(ii[WS(rs, 27)]), ms, &(ii[WS(rs, 1)])); + T3g = LDW(&(W[TWVL * 52])); + T3i = VMUL(T3g, T3h); + T5d = VMUL(T3g, T3k); + T3j = LDW(&(W[TWVL * 53])); + T3l = VFMA(T3j, T3k, T3i); + T5e = VFNMS(T3j, T3h, T5d); + } + { + V T3f, T3s, T7c, T7d; + T3f = VADD(T38, T3e); + T3s = VADD(T3l, T3r); + T3t = VADD(T3f, T3s); + T79 = VSUB(T3s, T3f); + T7c = VADD(T56, T58); + T7d = VADD(T5e, T5g); + T7e = VSUB(T7c, T7d); + T7O = VADD(T7c, T7d); + } + { + V T59, T5a, T5c, T5h; + T59 = VSUB(T56, T58); + T5a = VSUB(T38, T3e); + T5b = VSUB(T59, T5a); + T5s = VADD(T5a, T59); + T5c = VSUB(T3l, T3r); + T5h = VSUB(T5e, T5g); + T5i = VADD(T5c, T5h); + T5t = VSUB(T5c, T5h); + } + } + { + V T2f, T4x, T2y, T4H, T2l, T4z, T2s, T4F; + { + V T2b, T2e, T2c, T4w, T2a, T2d; + T2b = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T2e = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T2a = LDW(&(W[TWVL * 8])); + T2c = VMUL(T2a, T2b); + T4w = VMUL(T2a, T2e); + T2d = LDW(&(W[TWVL * 9])); + T2f = VFMA(T2d, T2e, T2c); + T4x = VFNMS(T2d, T2b, T4w); + } + { + V T2u, T2x, T2v, T4G, T2t, T2w; + T2u = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T2x = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T2t = LDW(&(W[TWVL * 24])); + T2v = VMUL(T2t, T2u); + T4G = VMUL(T2t, T2x); + T2w = LDW(&(W[TWVL * 25])); + T2y = VFMA(T2w, T2x, T2v); + T4H = VFNMS(T2w, T2u, T4G); + } + { + V T2h, T2k, T2i, T4y, T2g, T2j; + T2h = LD(&(ri[WS(rs, 21)]), ms, &(ri[WS(rs, 1)])); + T2k = LD(&(ii[WS(rs, 21)]), ms, &(ii[WS(rs, 1)])); + T2g = LDW(&(W[TWVL * 40])); + T2i = VMUL(T2g, T2h); + T4y = VMUL(T2g, T2k); + T2j = LDW(&(W[TWVL * 41])); + T2l = VFMA(T2j, T2k, T2i); + T4z = VFNMS(T2j, T2h, T4y); + } + { + V T2o, T2r, T2p, T4E, T2n, T2q; + T2o = LD(&(ri[WS(rs, 29)]), ms, &(ri[WS(rs, 1)])); + T2r = LD(&(ii[WS(rs, 29)]), ms, &(ii[WS(rs, 1)])); + T2n = LDW(&(W[TWVL * 56])); + T2p = VMUL(T2n, T2o); + T4E = VMUL(T2n, T2r); + T2q = LDW(&(W[TWVL * 57])); + T2s = VFMA(T2q, T2r, T2p); + T4F = VFNMS(T2q, T2o, T4E); + } + { + V T2m, T2z, T71, T72; + T2m = VADD(T2f, T2l); + T2z = VADD(T2s, T2y); + T2A = VADD(T2m, T2z); + T6Y = VSUB(T2z, T2m); + T71 = VADD(T4x, T4z); + T72 = VADD(T4F, T4H); + T73 = VSUB(T71, T72); + T7J = VADD(T71, T72); + } + { + V T4A, T4B, T4D, T4I; + T4A = VSUB(T4x, T4z); + T4B = VSUB(T2f, T2l); + T4C = VSUB(T4A, T4B); + T4T = VADD(T4B, T4A); + T4D = VSUB(T2s, T2y); + T4I = VSUB(T4F, T4H); + T4J = VADD(T4D, T4I); + T4U = VSUB(T4D, T4I); + } + } + { + V TO, T7C, T7Z, T80, T89, T8e, T1H, T8d, T3v, T8b, T7L, T7T, T7Q, T7U, T7F; + V T81; + { + V Tm, TN, T7X, T7Y; + Tm = VADD(T8, Tl); + TN = VADD(Tz, TM); + TO = VADD(Tm, TN); + T7C = VSUB(Tm, TN); + T7X = VADD(T7I, T7J); + T7Y = VADD(T7N, T7O); + T7Z = VSUB(T7X, T7Y); + T80 = VADD(T7X, T7Y); + } + { + V T82, T88, T1f, T1G; + T82 = VADD(T6F, T6G); + T88 = VADD(T83, T87); + T89 = VADD(T82, T88); + T8e = VSUB(T88, T82); + T1f = VADD(T11, T1e); + T1G = VADD(T1s, T1F); + T1H = VADD(T1f, T1G); + T8d = VSUB(T1G, T1f); + } + { + V T2B, T3u, T7H, T7K; + T2B = VADD(T29, T2A); + T3u = VADD(T32, T3t); + T3v = VADD(T2B, T3u); + T8b = VSUB(T3u, T2B); + T7H = VSUB(T29, T2A); + T7K = VSUB(T7I, T7J); + T7L = VADD(T7H, T7K); + T7T = VSUB(T7K, T7H); + } + { + V T7M, T7P, T7D, T7E; + T7M = VSUB(T32, T3t); + T7P = VSUB(T7N, T7O); + T7Q = VSUB(T7M, T7P); + T7U = VADD(T7M, T7P); + T7D = VADD(T6J, T6K); + T7E = VADD(T6P, T6Q); + T7F = VSUB(T7D, T7E); + T81 = VADD(T7D, T7E); + } + { + V T1I, T8a, T7W, T8c; + T1I = VADD(TO, T1H); + ST(&(ri[WS(rs, 16)]), VSUB(T1I, T3v), ms, &(ri[0])); + ST(&(ri[0]), VADD(T1I, T3v), ms, &(ri[0])); + T8a = VADD(T81, T89); + ST(&(ii[0]), VADD(T80, T8a), ms, &(ii[0])); + ST(&(ii[WS(rs, 16)]), VSUB(T8a, T80), ms, &(ii[0])); + T7W = VSUB(TO, T1H); + ST(&(ri[WS(rs, 24)]), VSUB(T7W, T7Z), ms, &(ri[0])); + ST(&(ri[WS(rs, 8)]), VADD(T7W, T7Z), ms, &(ri[0])); + T8c = VSUB(T89, T81); + ST(&(ii[WS(rs, 8)]), VADD(T8b, T8c), ms, &(ii[0])); + ST(&(ii[WS(rs, 24)]), VSUB(T8c, T8b), ms, &(ii[0])); + } + { + V T7G, T7R, T8f, T8g; + T7G = VADD(T7C, T7F); + T7R = VADD(T7L, T7Q); + ST(&(ri[WS(rs, 20)]), VFNMS(LDK(KP707106781), T7R, T7G), ms, &(ri[0])); + ST(&(ri[WS(rs, 4)]), VFMA(LDK(KP707106781), T7R, T7G), ms, &(ri[0])); + T8f = VADD(T8d, T8e); + T8g = VADD(T7T, T7U); + ST(&(ii[WS(rs, 4)]), VFMA(LDK(KP707106781), T8g, T8f), ms, &(ii[0])); + ST(&(ii[WS(rs, 20)]), VFNMS(LDK(KP707106781), T8g, T8f), ms, &(ii[0])); + } + { + V T7S, T7V, T8h, T8i; + T7S = VSUB(T7C, T7F); + T7V = VSUB(T7T, T7U); + ST(&(ri[WS(rs, 28)]), VFNMS(LDK(KP707106781), T7V, T7S), ms, &(ri[0])); + ST(&(ri[WS(rs, 12)]), VFMA(LDK(KP707106781), T7V, T7S), ms, &(ri[0])); + T8h = VSUB(T8e, T8d); + T8i = VSUB(T7Q, T7L); + ST(&(ii[WS(rs, 12)]), VFMA(LDK(KP707106781), T8i, T8h), ms, &(ii[0])); + ST(&(ii[WS(rs, 28)]), VFNMS(LDK(KP707106781), T8i, T8h), ms, &(ii[0])); + } + } + { + V T6I, T7m, T7w, T7A, T8l, T8r, T6T, T8m, T75, T7j, T7p, T8s, T7t, T7z, T7g; + V T7k; + { + V T6E, T6H, T7u, T7v; + T6E = VSUB(T8, Tl); + T6H = VSUB(T6F, T6G); + T6I = VSUB(T6E, T6H); + T7m = VADD(T6E, T6H); + T7u = VADD(T7b, T7e); + T7v = VADD(T78, T79); + T7w = VFNMS(LDK(KP414213562), T7v, T7u); + T7A = VFMA(LDK(KP414213562), T7u, T7v); + } + { + V T8j, T8k, T6N, T6S; + T8j = VSUB(TM, Tz); + T8k = VSUB(T87, T83); + T8l = VADD(T8j, T8k); + T8r = VSUB(T8k, T8j); + T6N = VSUB(T6L, T6M); + T6S = VADD(T6O, T6R); + T6T = VSUB(T6N, T6S); + T8m = VADD(T6N, T6S); + } + { + V T6Z, T74, T7n, T7o; + T6Z = VSUB(T6X, T6Y); + T74 = VSUB(T70, T73); + T75 = VFMA(LDK(KP414213562), T74, T6Z); + T7j = VFNMS(LDK(KP414213562), T6Z, T74); + T7n = VADD(T6M, T6L); + T7o = VSUB(T6O, T6R); + T7p = VADD(T7n, T7o); + T8s = VSUB(T7o, T7n); + } + { + V T7r, T7s, T7a, T7f; + T7r = VADD(T70, T73); + T7s = VADD(T6X, T6Y); + T7t = VFMA(LDK(KP414213562), T7s, T7r); + T7z = VFNMS(LDK(KP414213562), T7r, T7s); + T7a = VSUB(T78, T79); + T7f = VSUB(T7b, T7e); + T7g = VFNMS(LDK(KP414213562), T7f, T7a); + T7k = VFMA(LDK(KP414213562), T7a, T7f); + } + { + V T6U, T7h, T8t, T8u; + T6U = VFMA(LDK(KP707106781), T6T, T6I); + T7h = VSUB(T75, T7g); + ST(&(ri[WS(rs, 22)]), VFNMS(LDK(KP923879532), T7h, T6U), ms, &(ri[0])); + ST(&(ri[WS(rs, 6)]), VFMA(LDK(KP923879532), T7h, T6U), ms, &(ri[0])); + T8t = VFMA(LDK(KP707106781), T8s, T8r); + T8u = VSUB(T7k, T7j); + ST(&(ii[WS(rs, 6)]), VFMA(LDK(KP923879532), T8u, T8t), ms, &(ii[0])); + ST(&(ii[WS(rs, 22)]), VFNMS(LDK(KP923879532), T8u, T8t), ms, &(ii[0])); + } + { + V T7i, T7l, T8v, T8w; + T7i = VFNMS(LDK(KP707106781), T6T, T6I); + T7l = VADD(T7j, T7k); + ST(&(ri[WS(rs, 14)]), VFNMS(LDK(KP923879532), T7l, T7i), ms, &(ri[0])); + ST(&(ri[WS(rs, 30)]), VFMA(LDK(KP923879532), T7l, T7i), ms, &(ri[0])); + T8v = VFNMS(LDK(KP707106781), T8s, T8r); + T8w = VADD(T75, T7g); + ST(&(ii[WS(rs, 14)]), VFNMS(LDK(KP923879532), T8w, T8v), ms, &(ii[0])); + ST(&(ii[WS(rs, 30)]), VFMA(LDK(KP923879532), T8w, T8v), ms, &(ii[0])); + } + { + V T7q, T7x, T8n, T8o; + T7q = VFMA(LDK(KP707106781), T7p, T7m); + T7x = VADD(T7t, T7w); + ST(&(ri[WS(rs, 18)]), VFNMS(LDK(KP923879532), T7x, T7q), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VFMA(LDK(KP923879532), T7x, T7q), ms, &(ri[0])); + T8n = VFMA(LDK(KP707106781), T8m, T8l); + T8o = VADD(T7z, T7A); + ST(&(ii[WS(rs, 2)]), VFMA(LDK(KP923879532), T8o, T8n), ms, &(ii[0])); + ST(&(ii[WS(rs, 18)]), VFNMS(LDK(KP923879532), T8o, T8n), ms, &(ii[0])); + } + { + V T7y, T7B, T8p, T8q; + T7y = VFNMS(LDK(KP707106781), T7p, T7m); + T7B = VSUB(T7z, T7A); + ST(&(ri[WS(rs, 26)]), VFNMS(LDK(KP923879532), T7B, T7y), ms, &(ri[0])); + ST(&(ri[WS(rs, 10)]), VFMA(LDK(KP923879532), T7B, T7y), ms, &(ri[0])); + T8p = VFNMS(LDK(KP707106781), T8m, T8l); + T8q = VSUB(T7w, T7t); + ST(&(ii[WS(rs, 10)]), VFMA(LDK(KP923879532), T8q, T8p), ms, &(ii[0])); + ST(&(ii[WS(rs, 26)]), VFNMS(LDK(KP923879532), T8q, T8p), ms, &(ii[0])); + } + } + { + V T3S, T5C, T4n, T8C, T8B, T8H, T5F, T8I, T5w, T5Q, T5A, T5M, T4X, T5P, T5z; + V T5J; + { + V T3C, T3R, T5D, T5E; + T3C = VADD(T3w, T3B); + T3R = VADD(T3J, T3Q); + T3S = VFNMS(LDK(KP707106781), T3R, T3C); + T5C = VFMA(LDK(KP707106781), T3R, T3C); + { + V T47, T4m, T8z, T8A; + T47 = VFNMS(LDK(KP414213562), T46, T3Z); + T4m = VFMA(LDK(KP414213562), T4l, T4e); + T4n = VSUB(T47, T4m); + T8C = VADD(T47, T4m); + T8z = VSUB(T8x, T8y); + T8A = VADD(T5T, T5U); + T8B = VFMA(LDK(KP707106781), T8A, T8z); + T8H = VFNMS(LDK(KP707106781), T8A, T8z); + } + T5D = VFMA(LDK(KP414213562), T3Z, T46); + T5E = VFNMS(LDK(KP414213562), T4e, T4l); + T5F = VADD(T5D, T5E); + T8I = VSUB(T5E, T5D); + { + V T5k, T5L, T5v, T5K, T5j, T5u; + T5j = VADD(T5b, T5i); + T5k = VFNMS(LDK(KP707106781), T5j, T54); + T5L = VFMA(LDK(KP707106781), T5j, T54); + T5u = VADD(T5s, T5t); + T5v = VFNMS(LDK(KP707106781), T5u, T5r); + T5K = VFMA(LDK(KP707106781), T5u, T5r); + T5w = VFNMS(LDK(KP668178637), T5v, T5k); + T5Q = VFMA(LDK(KP198912367), T5K, T5L); + T5A = VFMA(LDK(KP668178637), T5k, T5v); + T5M = VFNMS(LDK(KP198912367), T5L, T5K); + } + { + V T4L, T5I, T4W, T5H, T4K, T4V; + T4K = VADD(T4C, T4J); + T4L = VFNMS(LDK(KP707106781), T4K, T4v); + T5I = VFMA(LDK(KP707106781), T4K, T4v); + T4V = VADD(T4T, T4U); + T4W = VFNMS(LDK(KP707106781), T4V, T4S); + T5H = VFMA(LDK(KP707106781), T4V, T4S); + T4X = VFMA(LDK(KP668178637), T4W, T4L); + T5P = VFNMS(LDK(KP198912367), T5H, T5I); + T5z = VFNMS(LDK(KP668178637), T4L, T4W); + T5J = VFMA(LDK(KP198912367), T5I, T5H); + } + } + { + V T4o, T5x, T8J, T8K; + T4o = VFMA(LDK(KP923879532), T4n, T3S); + T5x = VSUB(T4X, T5w); + ST(&(ri[WS(rs, 21)]), VFNMS(LDK(KP831469612), T5x, T4o), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VFMA(LDK(KP831469612), T5x, T4o), ms, &(ri[WS(rs, 1)])); + T8J = VFMA(LDK(KP923879532), T8I, T8H); + T8K = VSUB(T5A, T5z); + ST(&(ii[WS(rs, 5)]), VFMA(LDK(KP831469612), T8K, T8J), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 21)]), VFNMS(LDK(KP831469612), T8K, T8J), ms, &(ii[WS(rs, 1)])); + } + { + V T5y, T5B, T8L, T8M; + T5y = VFNMS(LDK(KP923879532), T4n, T3S); + T5B = VADD(T5z, T5A); + ST(&(ri[WS(rs, 13)]), VFNMS(LDK(KP831469612), T5B, T5y), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 29)]), VFMA(LDK(KP831469612), T5B, T5y), ms, &(ri[WS(rs, 1)])); + T8L = VFNMS(LDK(KP923879532), T8I, T8H); + T8M = VADD(T4X, T5w); + ST(&(ii[WS(rs, 13)]), VFNMS(LDK(KP831469612), T8M, T8L), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 29)]), VFMA(LDK(KP831469612), T8M, T8L), ms, &(ii[WS(rs, 1)])); + } + { + V T5G, T5N, T8D, T8E; + T5G = VFMA(LDK(KP923879532), T5F, T5C); + T5N = VADD(T5J, T5M); + ST(&(ri[WS(rs, 17)]), VFNMS(LDK(KP980785280), T5N, T5G), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VFMA(LDK(KP980785280), T5N, T5G), ms, &(ri[WS(rs, 1)])); + T8D = VFMA(LDK(KP923879532), T8C, T8B); + T8E = VADD(T5P, T5Q); + ST(&(ii[WS(rs, 1)]), VFMA(LDK(KP980785280), T8E, T8D), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 17)]), VFNMS(LDK(KP980785280), T8E, T8D), ms, &(ii[WS(rs, 1)])); + } + { + V T5O, T5R, T8F, T8G; + T5O = VFNMS(LDK(KP923879532), T5F, T5C); + T5R = VSUB(T5P, T5Q); + ST(&(ri[WS(rs, 25)]), VFNMS(LDK(KP980785280), T5R, T5O), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 9)]), VFMA(LDK(KP980785280), T5R, T5O), ms, &(ri[WS(rs, 1)])); + T8F = VFNMS(LDK(KP923879532), T8C, T8B); + T8G = VSUB(T5M, T5J); + ST(&(ii[WS(rs, 9)]), VFMA(LDK(KP980785280), T8G, T8F), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 25)]), VFNMS(LDK(KP980785280), T8G, T8F), ms, &(ii[WS(rs, 1)])); + } + } + { + V T5W, T6o, T63, T8W, T8P, T8V, T6r, T8Q, T6i, T6C, T6m, T6y, T6b, T6B, T6l; + V T6v; + { + V T5S, T5V, T6p, T6q; + T5S = VSUB(T3w, T3B); + T5V = VSUB(T5T, T5U); + T5W = VFMA(LDK(KP707106781), T5V, T5S); + T6o = VFNMS(LDK(KP707106781), T5V, T5S); + { + V T5Z, T62, T8N, T8O; + T5Z = VFMA(LDK(KP414213562), T5Y, T5X); + T62 = VFNMS(LDK(KP414213562), T61, T60); + T63 = VSUB(T5Z, T62); + T8W = VADD(T5Z, T62); + T8N = VADD(T8y, T8x); + T8O = VSUB(T3Q, T3J); + T8P = VFMA(LDK(KP707106781), T8O, T8N); + T8V = VFNMS(LDK(KP707106781), T8O, T8N); + } + T6p = VFNMS(LDK(KP414213562), T5X, T5Y); + T6q = VFMA(LDK(KP414213562), T60, T61); + T6r = VADD(T6p, T6q); + T8Q = VSUB(T6q, T6p); + { + V T6e, T6x, T6h, T6w, T6d, T6g; + T6d = VSUB(T5i, T5b); + T6e = VFNMS(LDK(KP707106781), T6d, T6c); + T6x = VFMA(LDK(KP707106781), T6d, T6c); + T6g = VSUB(T5s, T5t); + T6h = VFNMS(LDK(KP707106781), T6g, T6f); + T6w = VFMA(LDK(KP707106781), T6g, T6f); + T6i = VFNMS(LDK(KP668178637), T6h, T6e); + T6C = VFMA(LDK(KP198912367), T6w, T6x); + T6m = VFMA(LDK(KP668178637), T6e, T6h); + T6y = VFNMS(LDK(KP198912367), T6x, T6w); + } + { + V T67, T6u, T6a, T6t, T66, T69; + T66 = VSUB(T4J, T4C); + T67 = VFNMS(LDK(KP707106781), T66, T65); + T6u = VFMA(LDK(KP707106781), T66, T65); + T69 = VSUB(T4T, T4U); + T6a = VFNMS(LDK(KP707106781), T69, T68); + T6t = VFMA(LDK(KP707106781), T69, T68); + T6b = VFMA(LDK(KP668178637), T6a, T67); + T6B = VFNMS(LDK(KP198912367), T6t, T6u); + T6l = VFNMS(LDK(KP668178637), T67, T6a); + T6v = VFMA(LDK(KP198912367), T6u, T6t); + } + } + { + V T64, T6j, T8R, T8S; + T64 = VFMA(LDK(KP923879532), T63, T5W); + T6j = VADD(T6b, T6i); + ST(&(ri[WS(rs, 19)]), VFNMS(LDK(KP831469612), T6j, T64), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VFMA(LDK(KP831469612), T6j, T64), ms, &(ri[WS(rs, 1)])); + T8R = VFMA(LDK(KP923879532), T8Q, T8P); + T8S = VADD(T6l, T6m); + ST(&(ii[WS(rs, 3)]), VFMA(LDK(KP831469612), T8S, T8R), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 19)]), VFNMS(LDK(KP831469612), T8S, T8R), ms, &(ii[WS(rs, 1)])); + } + { + V T6k, T6n, T8T, T8U; + T6k = VFNMS(LDK(KP923879532), T63, T5W); + T6n = VSUB(T6l, T6m); + ST(&(ri[WS(rs, 27)]), VFNMS(LDK(KP831469612), T6n, T6k), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 11)]), VFMA(LDK(KP831469612), T6n, T6k), ms, &(ri[WS(rs, 1)])); + T8T = VFNMS(LDK(KP923879532), T8Q, T8P); + T8U = VSUB(T6i, T6b); + ST(&(ii[WS(rs, 11)]), VFMA(LDK(KP831469612), T8U, T8T), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 27)]), VFNMS(LDK(KP831469612), T8U, T8T), ms, &(ii[WS(rs, 1)])); + } + { + V T6s, T6z, T8X, T8Y; + T6s = VFNMS(LDK(KP923879532), T6r, T6o); + T6z = VSUB(T6v, T6y); + ST(&(ri[WS(rs, 23)]), VFNMS(LDK(KP980785280), T6z, T6s), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VFMA(LDK(KP980785280), T6z, T6s), ms, &(ri[WS(rs, 1)])); + T8X = VFNMS(LDK(KP923879532), T8W, T8V); + T8Y = VSUB(T6C, T6B); + ST(&(ii[WS(rs, 7)]), VFMA(LDK(KP980785280), T8Y, T8X), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 23)]), VFNMS(LDK(KP980785280), T8Y, T8X), ms, &(ii[WS(rs, 1)])); + } + { + V T6A, T6D, T8Z, T90; + T6A = VFMA(LDK(KP923879532), T6r, T6o); + T6D = VADD(T6B, T6C); + ST(&(ri[WS(rs, 15)]), VFNMS(LDK(KP980785280), T6D, T6A), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 31)]), VFMA(LDK(KP980785280), T6D, T6A), ms, &(ri[WS(rs, 1)])); + T8Z = VFMA(LDK(KP923879532), T8W, T8V); + T90 = VADD(T6v, T6y); + ST(&(ii[WS(rs, 15)]), VFNMS(LDK(KP980785280), T90, T8Z), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 31)]), VFMA(LDK(KP980785280), T90, T8Z), ms, &(ii[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t1sv_32"), twinstr, &GENUS, {236, 62, 198, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_32) (planner *p) { + X(kdft_dit_register) (p, t1sv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t1sv_32 -include dft/simd/ts.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 340 additions, 114 multiplications, 94 fused multiply/add), + * 96 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 62); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 62), MAKE_VOLATILE_STRIDE(64, rs)) { + V Tj, T5F, T7C, T7Q, T35, T4T, T78, T7m, T1Q, T61, T5Y, T6J, T3K, T59, T41; + V T56, T2B, T67, T6e, T6O, T4b, T5d, T4s, T5g, TG, T7l, T5I, T73, T3a, T4U; + V T3f, T4V, T14, T5N, T5M, T6E, T3m, T4Y, T3r, T4Z, T1r, T5P, T5S, T6F, T3x; + V T51, T3C, T52, T2d, T5Z, T64, T6K, T3V, T57, T44, T5a, T2Y, T6f, T6a, T6P; + V T4m, T5h, T4v, T5e; + { + V T1, T76, T6, T75, Tc, T32, Th, T33; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T76 = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T5, T2, T4; + T3 = LD(&(ri[WS(rs, 16)]), ms, &(ri[0])); + T5 = LD(&(ii[WS(rs, 16)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 30])); + T4 = LDW(&(W[TWVL * 31])); + T6 = VFMA(T2, T3, VMUL(T4, T5)); + T75 = VFNMS(T4, T3, VMUL(T2, T5)); + } + { + V T9, Tb, T8, Ta; + T9 = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + Tb = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + T8 = LDW(&(W[TWVL * 14])); + Ta = LDW(&(W[TWVL * 15])); + Tc = VFMA(T8, T9, VMUL(Ta, Tb)); + T32 = VFNMS(Ta, T9, VMUL(T8, Tb)); + } + { + V Te, Tg, Td, Tf; + Te = LD(&(ri[WS(rs, 24)]), ms, &(ri[0])); + Tg = LD(&(ii[WS(rs, 24)]), ms, &(ii[0])); + Td = LDW(&(W[TWVL * 46])); + Tf = LDW(&(W[TWVL * 47])); + Th = VFMA(Td, Te, VMUL(Tf, Tg)); + T33 = VFNMS(Tf, Te, VMUL(Td, Tg)); + } + { + V T7, Ti, T7A, T7B; + T7 = VADD(T1, T6); + Ti = VADD(Tc, Th); + Tj = VADD(T7, Ti); + T5F = VSUB(T7, Ti); + T7A = VSUB(T76, T75); + T7B = VSUB(Tc, Th); + T7C = VSUB(T7A, T7B); + T7Q = VADD(T7B, T7A); + } + { + V T31, T34, T74, T77; + T31 = VSUB(T1, T6); + T34 = VSUB(T32, T33); + T35 = VSUB(T31, T34); + T4T = VADD(T31, T34); + T74 = VADD(T32, T33); + T77 = VADD(T75, T76); + T78 = VADD(T74, T77); + T7m = VSUB(T77, T74); + } + } + { + V T1y, T3G, T1O, T3Z, T1D, T3H, T1J, T3Y; + { + V T1v, T1x, T1u, T1w; + T1v = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T1x = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T1u = LDW(&(W[0])); + T1w = LDW(&(W[TWVL * 1])); + T1y = VFMA(T1u, T1v, VMUL(T1w, T1x)); + T3G = VFNMS(T1w, T1v, VMUL(T1u, T1x)); + } + { + V T1L, T1N, T1K, T1M; + T1L = LD(&(ri[WS(rs, 25)]), ms, &(ri[WS(rs, 1)])); + T1N = LD(&(ii[WS(rs, 25)]), ms, &(ii[WS(rs, 1)])); + T1K = LDW(&(W[TWVL * 48])); + T1M = LDW(&(W[TWVL * 49])); + T1O = VFMA(T1K, T1L, VMUL(T1M, T1N)); + T3Z = VFNMS(T1M, T1L, VMUL(T1K, T1N)); + } + { + V T1A, T1C, T1z, T1B; + T1A = LD(&(ri[WS(rs, 17)]), ms, &(ri[WS(rs, 1)])); + T1C = LD(&(ii[WS(rs, 17)]), ms, &(ii[WS(rs, 1)])); + T1z = LDW(&(W[TWVL * 32])); + T1B = LDW(&(W[TWVL * 33])); + T1D = VFMA(T1z, T1A, VMUL(T1B, T1C)); + T3H = VFNMS(T1B, T1A, VMUL(T1z, T1C)); + } + { + V T1G, T1I, T1F, T1H; + T1G = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + T1I = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + T1F = LDW(&(W[TWVL * 16])); + T1H = LDW(&(W[TWVL * 17])); + T1J = VFMA(T1F, T1G, VMUL(T1H, T1I)); + T3Y = VFNMS(T1H, T1G, VMUL(T1F, T1I)); + } + { + V T1E, T1P, T5W, T5X; + T1E = VADD(T1y, T1D); + T1P = VADD(T1J, T1O); + T1Q = VADD(T1E, T1P); + T61 = VSUB(T1E, T1P); + T5W = VADD(T3G, T3H); + T5X = VADD(T3Y, T3Z); + T5Y = VSUB(T5W, T5X); + T6J = VADD(T5W, T5X); + } + { + V T3I, T3J, T3X, T40; + T3I = VSUB(T3G, T3H); + T3J = VSUB(T1J, T1O); + T3K = VADD(T3I, T3J); + T59 = VSUB(T3I, T3J); + T3X = VSUB(T1y, T1D); + T40 = VSUB(T3Y, T3Z); + T41 = VSUB(T3X, T40); + T56 = VADD(T3X, T40); + } + } + { + V T2j, T4o, T2z, T49, T2o, T4p, T2u, T48; + { + V T2g, T2i, T2f, T2h; + T2g = LD(&(ri[WS(rs, 31)]), ms, &(ri[WS(rs, 1)])); + T2i = LD(&(ii[WS(rs, 31)]), ms, &(ii[WS(rs, 1)])); + T2f = LDW(&(W[TWVL * 60])); + T2h = LDW(&(W[TWVL * 61])); + T2j = VFMA(T2f, T2g, VMUL(T2h, T2i)); + T4o = VFNMS(T2h, T2g, VMUL(T2f, T2i)); + } + { + V T2w, T2y, T2v, T2x; + T2w = LD(&(ri[WS(rs, 23)]), ms, &(ri[WS(rs, 1)])); + T2y = LD(&(ii[WS(rs, 23)]), ms, &(ii[WS(rs, 1)])); + T2v = LDW(&(W[TWVL * 44])); + T2x = LDW(&(W[TWVL * 45])); + T2z = VFMA(T2v, T2w, VMUL(T2x, T2y)); + T49 = VFNMS(T2x, T2w, VMUL(T2v, T2y)); + } + { + V T2l, T2n, T2k, T2m; + T2l = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T2n = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T2k = LDW(&(W[TWVL * 28])); + T2m = LDW(&(W[TWVL * 29])); + T2o = VFMA(T2k, T2l, VMUL(T2m, T2n)); + T4p = VFNMS(T2m, T2l, VMUL(T2k, T2n)); + } + { + V T2r, T2t, T2q, T2s; + T2r = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T2t = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T2q = LDW(&(W[TWVL * 12])); + T2s = LDW(&(W[TWVL * 13])); + T2u = VFMA(T2q, T2r, VMUL(T2s, T2t)); + T48 = VFNMS(T2s, T2r, VMUL(T2q, T2t)); + } + { + V T2p, T2A, T6c, T6d; + T2p = VADD(T2j, T2o); + T2A = VADD(T2u, T2z); + T2B = VADD(T2p, T2A); + T67 = VSUB(T2p, T2A); + T6c = VADD(T4o, T4p); + T6d = VADD(T48, T49); + T6e = VSUB(T6c, T6d); + T6O = VADD(T6c, T6d); + } + { + V T47, T4a, T4q, T4r; + T47 = VSUB(T2j, T2o); + T4a = VSUB(T48, T49); + T4b = VSUB(T47, T4a); + T5d = VADD(T47, T4a); + T4q = VSUB(T4o, T4p); + T4r = VSUB(T2u, T2z); + T4s = VADD(T4q, T4r); + T5g = VSUB(T4q, T4r); + } + } + { + V To, T36, TE, T3d, Tt, T37, Tz, T3c; + { + V Tl, Tn, Tk, Tm; + Tl = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Tn = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + Tk = LDW(&(W[TWVL * 6])); + Tm = LDW(&(W[TWVL * 7])); + To = VFMA(Tk, Tl, VMUL(Tm, Tn)); + T36 = VFNMS(Tm, Tl, VMUL(Tk, Tn)); + } + { + V TB, TD, TA, TC; + TB = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + TD = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + TA = LDW(&(W[TWVL * 22])); + TC = LDW(&(W[TWVL * 23])); + TE = VFMA(TA, TB, VMUL(TC, TD)); + T3d = VFNMS(TC, TB, VMUL(TA, TD)); + } + { + V Tq, Ts, Tp, Tr; + Tq = LD(&(ri[WS(rs, 20)]), ms, &(ri[0])); + Ts = LD(&(ii[WS(rs, 20)]), ms, &(ii[0])); + Tp = LDW(&(W[TWVL * 38])); + Tr = LDW(&(W[TWVL * 39])); + Tt = VFMA(Tp, Tq, VMUL(Tr, Ts)); + T37 = VFNMS(Tr, Tq, VMUL(Tp, Ts)); + } + { + V Tw, Ty, Tv, Tx; + Tw = LD(&(ri[WS(rs, 28)]), ms, &(ri[0])); + Ty = LD(&(ii[WS(rs, 28)]), ms, &(ii[0])); + Tv = LDW(&(W[TWVL * 54])); + Tx = LDW(&(W[TWVL * 55])); + Tz = VFMA(Tv, Tw, VMUL(Tx, Ty)); + T3c = VFNMS(Tx, Tw, VMUL(Tv, Ty)); + } + { + V Tu, TF, T5G, T5H; + Tu = VADD(To, Tt); + TF = VADD(Tz, TE); + TG = VADD(Tu, TF); + T7l = VSUB(TF, Tu); + T5G = VADD(T36, T37); + T5H = VADD(T3c, T3d); + T5I = VSUB(T5G, T5H); + T73 = VADD(T5G, T5H); + } + { + V T38, T39, T3b, T3e; + T38 = VSUB(T36, T37); + T39 = VSUB(To, Tt); + T3a = VSUB(T38, T39); + T4U = VADD(T39, T38); + T3b = VSUB(Tz, TE); + T3e = VSUB(T3c, T3d); + T3f = VADD(T3b, T3e); + T4V = VSUB(T3b, T3e); + } + } + { + V TM, T3i, T12, T3p, TR, T3j, TX, T3o; + { + V TJ, TL, TI, TK; + TJ = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + TL = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + TI = LDW(&(W[TWVL * 2])); + TK = LDW(&(W[TWVL * 3])); + TM = VFMA(TI, TJ, VMUL(TK, TL)); + T3i = VFNMS(TK, TJ, VMUL(TI, TL)); + } + { + V TZ, T11, TY, T10; + TZ = LD(&(ri[WS(rs, 26)]), ms, &(ri[0])); + T11 = LD(&(ii[WS(rs, 26)]), ms, &(ii[0])); + TY = LDW(&(W[TWVL * 50])); + T10 = LDW(&(W[TWVL * 51])); + T12 = VFMA(TY, TZ, VMUL(T10, T11)); + T3p = VFNMS(T10, TZ, VMUL(TY, T11)); + } + { + V TO, TQ, TN, TP; + TO = LD(&(ri[WS(rs, 18)]), ms, &(ri[0])); + TQ = LD(&(ii[WS(rs, 18)]), ms, &(ii[0])); + TN = LDW(&(W[TWVL * 34])); + TP = LDW(&(W[TWVL * 35])); + TR = VFMA(TN, TO, VMUL(TP, TQ)); + T3j = VFNMS(TP, TO, VMUL(TN, TQ)); + } + { + V TU, TW, TT, TV; + TU = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + TW = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + TT = LDW(&(W[TWVL * 18])); + TV = LDW(&(W[TWVL * 19])); + TX = VFMA(TT, TU, VMUL(TV, TW)); + T3o = VFNMS(TV, TU, VMUL(TT, TW)); + } + { + V TS, T13, T5K, T5L; + TS = VADD(TM, TR); + T13 = VADD(TX, T12); + T14 = VADD(TS, T13); + T5N = VSUB(TS, T13); + T5K = VADD(T3i, T3j); + T5L = VADD(T3o, T3p); + T5M = VSUB(T5K, T5L); + T6E = VADD(T5K, T5L); + } + { + V T3k, T3l, T3n, T3q; + T3k = VSUB(T3i, T3j); + T3l = VSUB(TX, T12); + T3m = VADD(T3k, T3l); + T4Y = VSUB(T3k, T3l); + T3n = VSUB(TM, TR); + T3q = VSUB(T3o, T3p); + T3r = VSUB(T3n, T3q); + T4Z = VADD(T3n, T3q); + } + } + { + V T19, T3t, T1p, T3A, T1e, T3u, T1k, T3z; + { + V T16, T18, T15, T17; + T16 = LD(&(ri[WS(rs, 30)]), ms, &(ri[0])); + T18 = LD(&(ii[WS(rs, 30)]), ms, &(ii[0])); + T15 = LDW(&(W[TWVL * 58])); + T17 = LDW(&(W[TWVL * 59])); + T19 = VFMA(T15, T16, VMUL(T17, T18)); + T3t = VFNMS(T17, T16, VMUL(T15, T18)); + } + { + V T1m, T1o, T1l, T1n; + T1m = LD(&(ri[WS(rs, 22)]), ms, &(ri[0])); + T1o = LD(&(ii[WS(rs, 22)]), ms, &(ii[0])); + T1l = LDW(&(W[TWVL * 42])); + T1n = LDW(&(W[TWVL * 43])); + T1p = VFMA(T1l, T1m, VMUL(T1n, T1o)); + T3A = VFNMS(T1n, T1m, VMUL(T1l, T1o)); + } + { + V T1b, T1d, T1a, T1c; + T1b = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + T1d = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + T1a = LDW(&(W[TWVL * 26])); + T1c = LDW(&(W[TWVL * 27])); + T1e = VFMA(T1a, T1b, VMUL(T1c, T1d)); + T3u = VFNMS(T1c, T1b, VMUL(T1a, T1d)); + } + { + V T1h, T1j, T1g, T1i; + T1h = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + T1j = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + T1g = LDW(&(W[TWVL * 10])); + T1i = LDW(&(W[TWVL * 11])); + T1k = VFMA(T1g, T1h, VMUL(T1i, T1j)); + T3z = VFNMS(T1i, T1h, VMUL(T1g, T1j)); + } + { + V T1f, T1q, T5Q, T5R; + T1f = VADD(T19, T1e); + T1q = VADD(T1k, T1p); + T1r = VADD(T1f, T1q); + T5P = VSUB(T1f, T1q); + T5Q = VADD(T3t, T3u); + T5R = VADD(T3z, T3A); + T5S = VSUB(T5Q, T5R); + T6F = VADD(T5Q, T5R); + } + { + V T3v, T3w, T3y, T3B; + T3v = VSUB(T3t, T3u); + T3w = VSUB(T1k, T1p); + T3x = VADD(T3v, T3w); + T51 = VSUB(T3v, T3w); + T3y = VSUB(T19, T1e); + T3B = VSUB(T3z, T3A); + T3C = VSUB(T3y, T3B); + T52 = VADD(T3y, T3B); + } + } + { + V T1V, T3R, T20, T3S, T3Q, T3T, T26, T3M, T2b, T3N, T3L, T3O; + { + V T1S, T1U, T1R, T1T; + T1S = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T1U = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T1R = LDW(&(W[TWVL * 8])); + T1T = LDW(&(W[TWVL * 9])); + T1V = VFMA(T1R, T1S, VMUL(T1T, T1U)); + T3R = VFNMS(T1T, T1S, VMUL(T1R, T1U)); + } + { + V T1X, T1Z, T1W, T1Y; + T1X = LD(&(ri[WS(rs, 21)]), ms, &(ri[WS(rs, 1)])); + T1Z = LD(&(ii[WS(rs, 21)]), ms, &(ii[WS(rs, 1)])); + T1W = LDW(&(W[TWVL * 40])); + T1Y = LDW(&(W[TWVL * 41])); + T20 = VFMA(T1W, T1X, VMUL(T1Y, T1Z)); + T3S = VFNMS(T1Y, T1X, VMUL(T1W, T1Z)); + } + T3Q = VSUB(T1V, T20); + T3T = VSUB(T3R, T3S); + { + V T23, T25, T22, T24; + T23 = LD(&(ri[WS(rs, 29)]), ms, &(ri[WS(rs, 1)])); + T25 = LD(&(ii[WS(rs, 29)]), ms, &(ii[WS(rs, 1)])); + T22 = LDW(&(W[TWVL * 56])); + T24 = LDW(&(W[TWVL * 57])); + T26 = VFMA(T22, T23, VMUL(T24, T25)); + T3M = VFNMS(T24, T23, VMUL(T22, T25)); + } + { + V T28, T2a, T27, T29; + T28 = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T2a = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T27 = LDW(&(W[TWVL * 24])); + T29 = LDW(&(W[TWVL * 25])); + T2b = VFMA(T27, T28, VMUL(T29, T2a)); + T3N = VFNMS(T29, T28, VMUL(T27, T2a)); + } + T3L = VSUB(T26, T2b); + T3O = VSUB(T3M, T3N); + { + V T21, T2c, T62, T63; + T21 = VADD(T1V, T20); + T2c = VADD(T26, T2b); + T2d = VADD(T21, T2c); + T5Z = VSUB(T2c, T21); + T62 = VADD(T3R, T3S); + T63 = VADD(T3M, T3N); + T64 = VSUB(T62, T63); + T6K = VADD(T62, T63); + } + { + V T3P, T3U, T42, T43; + T3P = VSUB(T3L, T3O); + T3U = VADD(T3Q, T3T); + T3V = VMUL(LDK(KP707106781), VSUB(T3P, T3U)); + T57 = VMUL(LDK(KP707106781), VADD(T3U, T3P)); + T42 = VSUB(T3T, T3Q); + T43 = VADD(T3L, T3O); + T44 = VMUL(LDK(KP707106781), VSUB(T42, T43)); + T5a = VMUL(LDK(KP707106781), VADD(T42, T43)); + } + } + { + V T2G, T4c, T2L, T4d, T4e, T4f, T2R, T4i, T2W, T4j, T4h, T4k; + { + V T2D, T2F, T2C, T2E; + T2D = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T2F = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T2C = LDW(&(W[TWVL * 4])); + T2E = LDW(&(W[TWVL * 5])); + T2G = VFMA(T2C, T2D, VMUL(T2E, T2F)); + T4c = VFNMS(T2E, T2D, VMUL(T2C, T2F)); + } + { + V T2I, T2K, T2H, T2J; + T2I = LD(&(ri[WS(rs, 19)]), ms, &(ri[WS(rs, 1)])); + T2K = LD(&(ii[WS(rs, 19)]), ms, &(ii[WS(rs, 1)])); + T2H = LDW(&(W[TWVL * 36])); + T2J = LDW(&(W[TWVL * 37])); + T2L = VFMA(T2H, T2I, VMUL(T2J, T2K)); + T4d = VFNMS(T2J, T2I, VMUL(T2H, T2K)); + } + T4e = VSUB(T4c, T4d); + T4f = VSUB(T2G, T2L); + { + V T2O, T2Q, T2N, T2P; + T2O = LD(&(ri[WS(rs, 27)]), ms, &(ri[WS(rs, 1)])); + T2Q = LD(&(ii[WS(rs, 27)]), ms, &(ii[WS(rs, 1)])); + T2N = LDW(&(W[TWVL * 52])); + T2P = LDW(&(W[TWVL * 53])); + T2R = VFMA(T2N, T2O, VMUL(T2P, T2Q)); + T4i = VFNMS(T2P, T2O, VMUL(T2N, T2Q)); + } + { + V T2T, T2V, T2S, T2U; + T2T = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T2V = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T2S = LDW(&(W[TWVL * 20])); + T2U = LDW(&(W[TWVL * 21])); + T2W = VFMA(T2S, T2T, VMUL(T2U, T2V)); + T4j = VFNMS(T2U, T2T, VMUL(T2S, T2V)); + } + T4h = VSUB(T2R, T2W); + T4k = VSUB(T4i, T4j); + { + V T2M, T2X, T68, T69; + T2M = VADD(T2G, T2L); + T2X = VADD(T2R, T2W); + T2Y = VADD(T2M, T2X); + T6f = VSUB(T2X, T2M); + T68 = VADD(T4c, T4d); + T69 = VADD(T4i, T4j); + T6a = VSUB(T68, T69); + T6P = VADD(T68, T69); + } + { + V T4g, T4l, T4t, T4u; + T4g = VSUB(T4e, T4f); + T4l = VADD(T4h, T4k); + T4m = VMUL(LDK(KP707106781), VSUB(T4g, T4l)); + T5h = VMUL(LDK(KP707106781), VADD(T4g, T4l)); + T4t = VSUB(T4h, T4k); + T4u = VADD(T4f, T4e); + T4v = VMUL(LDK(KP707106781), VSUB(T4t, T4u)); + T5e = VMUL(LDK(KP707106781), VADD(T4u, T4t)); + } + } + { + V T1t, T6X, T7a, T7c, T30, T7b, T70, T71; + { + V TH, T1s, T72, T79; + TH = VADD(Tj, TG); + T1s = VADD(T14, T1r); + T1t = VADD(TH, T1s); + T6X = VSUB(TH, T1s); + T72 = VADD(T6E, T6F); + T79 = VADD(T73, T78); + T7a = VADD(T72, T79); + T7c = VSUB(T79, T72); + } + { + V T2e, T2Z, T6Y, T6Z; + T2e = VADD(T1Q, T2d); + T2Z = VADD(T2B, T2Y); + T30 = VADD(T2e, T2Z); + T7b = VSUB(T2Z, T2e); + T6Y = VADD(T6J, T6K); + T6Z = VADD(T6O, T6P); + T70 = VSUB(T6Y, T6Z); + T71 = VADD(T6Y, T6Z); + } + ST(&(ri[WS(rs, 16)]), VSUB(T1t, T30), ms, &(ri[0])); + ST(&(ii[WS(rs, 16)]), VSUB(T7a, T71), ms, &(ii[0])); + ST(&(ri[0]), VADD(T1t, T30), ms, &(ri[0])); + ST(&(ii[0]), VADD(T71, T7a), ms, &(ii[0])); + ST(&(ri[WS(rs, 24)]), VSUB(T6X, T70), ms, &(ri[0])); + ST(&(ii[WS(rs, 24)]), VSUB(T7c, T7b), ms, &(ii[0])); + ST(&(ri[WS(rs, 8)]), VADD(T6X, T70), ms, &(ri[0])); + ST(&(ii[WS(rs, 8)]), VADD(T7b, T7c), ms, &(ii[0])); + } + { + V T6H, T6T, T7g, T7i, T6M, T6U, T6R, T6V; + { + V T6D, T6G, T7e, T7f; + T6D = VSUB(Tj, TG); + T6G = VSUB(T6E, T6F); + T6H = VADD(T6D, T6G); + T6T = VSUB(T6D, T6G); + T7e = VSUB(T1r, T14); + T7f = VSUB(T78, T73); + T7g = VADD(T7e, T7f); + T7i = VSUB(T7f, T7e); + } + { + V T6I, T6L, T6N, T6Q; + T6I = VSUB(T1Q, T2d); + T6L = VSUB(T6J, T6K); + T6M = VADD(T6I, T6L); + T6U = VSUB(T6L, T6I); + T6N = VSUB(T2B, T2Y); + T6Q = VSUB(T6O, T6P); + T6R = VSUB(T6N, T6Q); + T6V = VADD(T6N, T6Q); + } + { + V T6S, T7d, T6W, T7h; + T6S = VMUL(LDK(KP707106781), VADD(T6M, T6R)); + ST(&(ri[WS(rs, 20)]), VSUB(T6H, T6S), ms, &(ri[0])); + ST(&(ri[WS(rs, 4)]), VADD(T6H, T6S), ms, &(ri[0])); + T7d = VMUL(LDK(KP707106781), VADD(T6U, T6V)); + ST(&(ii[WS(rs, 4)]), VADD(T7d, T7g), ms, &(ii[0])); + ST(&(ii[WS(rs, 20)]), VSUB(T7g, T7d), ms, &(ii[0])); + T6W = VMUL(LDK(KP707106781), VSUB(T6U, T6V)); + ST(&(ri[WS(rs, 28)]), VSUB(T6T, T6W), ms, &(ri[0])); + ST(&(ri[WS(rs, 12)]), VADD(T6T, T6W), ms, &(ri[0])); + T7h = VMUL(LDK(KP707106781), VSUB(T6R, T6M)); + ST(&(ii[WS(rs, 12)]), VADD(T7h, T7i), ms, &(ii[0])); + ST(&(ii[WS(rs, 28)]), VSUB(T7i, T7h), ms, &(ii[0])); + } + } + { + V T5J, T7n, T7t, T6n, T5U, T7k, T6x, T6B, T6q, T7s, T66, T6k, T6u, T6A, T6h; + V T6l; + { + V T5O, T5T, T60, T65; + T5J = VSUB(T5F, T5I); + T7n = VADD(T7l, T7m); + T7t = VSUB(T7m, T7l); + T6n = VADD(T5F, T5I); + T5O = VSUB(T5M, T5N); + T5T = VADD(T5P, T5S); + T5U = VMUL(LDK(KP707106781), VSUB(T5O, T5T)); + T7k = VMUL(LDK(KP707106781), VADD(T5O, T5T)); + { + V T6v, T6w, T6o, T6p; + T6v = VADD(T67, T6a); + T6w = VADD(T6e, T6f); + T6x = VFNMS(LDK(KP382683432), T6w, VMUL(LDK(KP923879532), T6v)); + T6B = VFMA(LDK(KP923879532), T6w, VMUL(LDK(KP382683432), T6v)); + T6o = VADD(T5N, T5M); + T6p = VSUB(T5P, T5S); + T6q = VMUL(LDK(KP707106781), VADD(T6o, T6p)); + T7s = VMUL(LDK(KP707106781), VSUB(T6p, T6o)); + } + T60 = VSUB(T5Y, T5Z); + T65 = VSUB(T61, T64); + T66 = VFMA(LDK(KP923879532), T60, VMUL(LDK(KP382683432), T65)); + T6k = VFNMS(LDK(KP923879532), T65, VMUL(LDK(KP382683432), T60)); + { + V T6s, T6t, T6b, T6g; + T6s = VADD(T5Y, T5Z); + T6t = VADD(T61, T64); + T6u = VFMA(LDK(KP382683432), T6s, VMUL(LDK(KP923879532), T6t)); + T6A = VFNMS(LDK(KP382683432), T6t, VMUL(LDK(KP923879532), T6s)); + T6b = VSUB(T67, T6a); + T6g = VSUB(T6e, T6f); + T6h = VFNMS(LDK(KP923879532), T6g, VMUL(LDK(KP382683432), T6b)); + T6l = VFMA(LDK(KP382683432), T6g, VMUL(LDK(KP923879532), T6b)); + } + } + { + V T5V, T6i, T7r, T7u; + T5V = VADD(T5J, T5U); + T6i = VADD(T66, T6h); + ST(&(ri[WS(rs, 22)]), VSUB(T5V, T6i), ms, &(ri[0])); + ST(&(ri[WS(rs, 6)]), VADD(T5V, T6i), ms, &(ri[0])); + T7r = VADD(T6k, T6l); + T7u = VADD(T7s, T7t); + ST(&(ii[WS(rs, 6)]), VADD(T7r, T7u), ms, &(ii[0])); + ST(&(ii[WS(rs, 22)]), VSUB(T7u, T7r), ms, &(ii[0])); + } + { + V T6j, T6m, T7v, T7w; + T6j = VSUB(T5J, T5U); + T6m = VSUB(T6k, T6l); + ST(&(ri[WS(rs, 30)]), VSUB(T6j, T6m), ms, &(ri[0])); + ST(&(ri[WS(rs, 14)]), VADD(T6j, T6m), ms, &(ri[0])); + T7v = VSUB(T6h, T66); + T7w = VSUB(T7t, T7s); + ST(&(ii[WS(rs, 14)]), VADD(T7v, T7w), ms, &(ii[0])); + ST(&(ii[WS(rs, 30)]), VSUB(T7w, T7v), ms, &(ii[0])); + } + { + V T6r, T6y, T7j, T7o; + T6r = VADD(T6n, T6q); + T6y = VADD(T6u, T6x); + ST(&(ri[WS(rs, 18)]), VSUB(T6r, T6y), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VADD(T6r, T6y), ms, &(ri[0])); + T7j = VADD(T6A, T6B); + T7o = VADD(T7k, T7n); + ST(&(ii[WS(rs, 2)]), VADD(T7j, T7o), ms, &(ii[0])); + ST(&(ii[WS(rs, 18)]), VSUB(T7o, T7j), ms, &(ii[0])); + } + { + V T6z, T6C, T7p, T7q; + T6z = VSUB(T6n, T6q); + T6C = VSUB(T6A, T6B); + ST(&(ri[WS(rs, 26)]), VSUB(T6z, T6C), ms, &(ri[0])); + ST(&(ri[WS(rs, 10)]), VADD(T6z, T6C), ms, &(ri[0])); + T7p = VSUB(T6x, T6u); + T7q = VSUB(T7n, T7k); + ST(&(ii[WS(rs, 10)]), VADD(T7p, T7q), ms, &(ii[0])); + ST(&(ii[WS(rs, 26)]), VSUB(T7q, T7p), ms, &(ii[0])); + } + } + { + V T3h, T4D, T7R, T7X, T3E, T7O, T4N, T4R, T46, T4A, T4G, T7W, T4K, T4Q, T4x; + V T4B, T3g, T7P; + T3g = VMUL(LDK(KP707106781), VSUB(T3a, T3f)); + T3h = VSUB(T35, T3g); + T4D = VADD(T35, T3g); + T7P = VMUL(LDK(KP707106781), VSUB(T4V, T4U)); + T7R = VADD(T7P, T7Q); + T7X = VSUB(T7Q, T7P); + { + V T3s, T3D, T4L, T4M; + T3s = VFNMS(LDK(KP923879532), T3r, VMUL(LDK(KP382683432), T3m)); + T3D = VFMA(LDK(KP382683432), T3x, VMUL(LDK(KP923879532), T3C)); + T3E = VSUB(T3s, T3D); + T7O = VADD(T3s, T3D); + T4L = VADD(T4b, T4m); + T4M = VADD(T4s, T4v); + T4N = VFNMS(LDK(KP555570233), T4M, VMUL(LDK(KP831469612), T4L)); + T4R = VFMA(LDK(KP831469612), T4M, VMUL(LDK(KP555570233), T4L)); + } + { + V T3W, T45, T4E, T4F; + T3W = VSUB(T3K, T3V); + T45 = VSUB(T41, T44); + T46 = VFMA(LDK(KP980785280), T3W, VMUL(LDK(KP195090322), T45)); + T4A = VFNMS(LDK(KP980785280), T45, VMUL(LDK(KP195090322), T3W)); + T4E = VFMA(LDK(KP923879532), T3m, VMUL(LDK(KP382683432), T3r)); + T4F = VFNMS(LDK(KP923879532), T3x, VMUL(LDK(KP382683432), T3C)); + T4G = VADD(T4E, T4F); + T7W = VSUB(T4F, T4E); + } + { + V T4I, T4J, T4n, T4w; + T4I = VADD(T3K, T3V); + T4J = VADD(T41, T44); + T4K = VFMA(LDK(KP555570233), T4I, VMUL(LDK(KP831469612), T4J)); + T4Q = VFNMS(LDK(KP555570233), T4J, VMUL(LDK(KP831469612), T4I)); + T4n = VSUB(T4b, T4m); + T4w = VSUB(T4s, T4v); + T4x = VFNMS(LDK(KP980785280), T4w, VMUL(LDK(KP195090322), T4n)); + T4B = VFMA(LDK(KP195090322), T4w, VMUL(LDK(KP980785280), T4n)); + } + { + V T3F, T4y, T7V, T7Y; + T3F = VADD(T3h, T3E); + T4y = VADD(T46, T4x); + ST(&(ri[WS(rs, 23)]), VSUB(T3F, T4y), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VADD(T3F, T4y), ms, &(ri[WS(rs, 1)])); + T7V = VADD(T4A, T4B); + T7Y = VADD(T7W, T7X); + ST(&(ii[WS(rs, 7)]), VADD(T7V, T7Y), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 23)]), VSUB(T7Y, T7V), ms, &(ii[WS(rs, 1)])); + } + { + V T4z, T4C, T7Z, T80; + T4z = VSUB(T3h, T3E); + T4C = VSUB(T4A, T4B); + ST(&(ri[WS(rs, 31)]), VSUB(T4z, T4C), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 15)]), VADD(T4z, T4C), ms, &(ri[WS(rs, 1)])); + T7Z = VSUB(T4x, T46); + T80 = VSUB(T7X, T7W); + ST(&(ii[WS(rs, 15)]), VADD(T7Z, T80), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 31)]), VSUB(T80, T7Z), ms, &(ii[WS(rs, 1)])); + } + { + V T4H, T4O, T7N, T7S; + T4H = VADD(T4D, T4G); + T4O = VADD(T4K, T4N); + ST(&(ri[WS(rs, 19)]), VSUB(T4H, T4O), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VADD(T4H, T4O), ms, &(ri[WS(rs, 1)])); + T7N = VADD(T4Q, T4R); + T7S = VADD(T7O, T7R); + ST(&(ii[WS(rs, 3)]), VADD(T7N, T7S), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 19)]), VSUB(T7S, T7N), ms, &(ii[WS(rs, 1)])); + } + { + V T4P, T4S, T7T, T7U; + T4P = VSUB(T4D, T4G); + T4S = VSUB(T4Q, T4R); + ST(&(ri[WS(rs, 27)]), VSUB(T4P, T4S), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 11)]), VADD(T4P, T4S), ms, &(ri[WS(rs, 1)])); + T7T = VSUB(T4N, T4K); + T7U = VSUB(T7R, T7O); + ST(&(ii[WS(rs, 11)]), VADD(T7T, T7U), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 27)]), VSUB(T7U, T7T), ms, &(ii[WS(rs, 1)])); + } + } + { + V T4X, T5p, T7D, T7J, T54, T7y, T5z, T5D, T5c, T5m, T5s, T7I, T5w, T5C, T5j; + V T5n, T4W, T7z; + T4W = VMUL(LDK(KP707106781), VADD(T4U, T4V)); + T4X = VSUB(T4T, T4W); + T5p = VADD(T4T, T4W); + T7z = VMUL(LDK(KP707106781), VADD(T3a, T3f)); + T7D = VADD(T7z, T7C); + T7J = VSUB(T7C, T7z); + { + V T50, T53, T5x, T5y; + T50 = VFNMS(LDK(KP382683432), T4Z, VMUL(LDK(KP923879532), T4Y)); + T53 = VFMA(LDK(KP923879532), T51, VMUL(LDK(KP382683432), T52)); + T54 = VSUB(T50, T53); + T7y = VADD(T50, T53); + T5x = VADD(T5d, T5e); + T5y = VADD(T5g, T5h); + T5z = VFNMS(LDK(KP195090322), T5y, VMUL(LDK(KP980785280), T5x)); + T5D = VFMA(LDK(KP195090322), T5x, VMUL(LDK(KP980785280), T5y)); + } + { + V T58, T5b, T5q, T5r; + T58 = VSUB(T56, T57); + T5b = VSUB(T59, T5a); + T5c = VFMA(LDK(KP555570233), T58, VMUL(LDK(KP831469612), T5b)); + T5m = VFNMS(LDK(KP831469612), T58, VMUL(LDK(KP555570233), T5b)); + T5q = VFMA(LDK(KP382683432), T4Y, VMUL(LDK(KP923879532), T4Z)); + T5r = VFNMS(LDK(KP382683432), T51, VMUL(LDK(KP923879532), T52)); + T5s = VADD(T5q, T5r); + T7I = VSUB(T5r, T5q); + } + { + V T5u, T5v, T5f, T5i; + T5u = VADD(T56, T57); + T5v = VADD(T59, T5a); + T5w = VFMA(LDK(KP980785280), T5u, VMUL(LDK(KP195090322), T5v)); + T5C = VFNMS(LDK(KP195090322), T5u, VMUL(LDK(KP980785280), T5v)); + T5f = VSUB(T5d, T5e); + T5i = VSUB(T5g, T5h); + T5j = VFNMS(LDK(KP831469612), T5i, VMUL(LDK(KP555570233), T5f)); + T5n = VFMA(LDK(KP831469612), T5f, VMUL(LDK(KP555570233), T5i)); + } + { + V T55, T5k, T7H, T7K; + T55 = VADD(T4X, T54); + T5k = VADD(T5c, T5j); + ST(&(ri[WS(rs, 21)]), VSUB(T55, T5k), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VADD(T55, T5k), ms, &(ri[WS(rs, 1)])); + T7H = VADD(T5m, T5n); + T7K = VADD(T7I, T7J); + ST(&(ii[WS(rs, 5)]), VADD(T7H, T7K), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 21)]), VSUB(T7K, T7H), ms, &(ii[WS(rs, 1)])); + } + { + V T5l, T5o, T7L, T7M; + T5l = VSUB(T4X, T54); + T5o = VSUB(T5m, T5n); + ST(&(ri[WS(rs, 29)]), VSUB(T5l, T5o), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 13)]), VADD(T5l, T5o), ms, &(ri[WS(rs, 1)])); + T7L = VSUB(T5j, T5c); + T7M = VSUB(T7J, T7I); + ST(&(ii[WS(rs, 13)]), VADD(T7L, T7M), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 29)]), VSUB(T7M, T7L), ms, &(ii[WS(rs, 1)])); + } + { + V T5t, T5A, T7x, T7E; + T5t = VADD(T5p, T5s); + T5A = VADD(T5w, T5z); + ST(&(ri[WS(rs, 17)]), VSUB(T5t, T5A), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(T5t, T5A), ms, &(ri[WS(rs, 1)])); + T7x = VADD(T5C, T5D); + T7E = VADD(T7y, T7D); + ST(&(ii[WS(rs, 1)]), VADD(T7x, T7E), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 17)]), VSUB(T7E, T7x), ms, &(ii[WS(rs, 1)])); + } + { + V T5B, T5E, T7F, T7G; + T5B = VSUB(T5p, T5s); + T5E = VSUB(T5C, T5D); + ST(&(ri[WS(rs, 25)]), VSUB(T5B, T5E), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 9)]), VADD(T5B, T5E), ms, &(ri[WS(rs, 1)])); + T7F = VSUB(T5z, T5w); + T7G = VSUB(T7D, T7y); + ST(&(ii[WS(rs, 9)]), VADD(T7F, T7G), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 25)]), VSUB(T7G, T7F), ms, &(ii[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t1sv_32"), twinstr, &GENUS, {340, 114, 94, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_32) (planner *p) { + X(kdft_dit_register) (p, t1sv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_4.c new file mode 100644 index 000000000..a13e3817b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_4.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1sv_4 -include dft/simd/ts.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 6), MAKE_VOLATILE_STRIDE(8, rs)) { + V T1, Tv, T7, Tu, Te, To, Tk, Tq; + T1 = LD(&(ri[0]), ms, &(ri[0])); + Tv = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T6, T4, Tt, T2, T5; + T3 = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + T6 = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 2])); + T4 = VMUL(T2, T3); + Tt = VMUL(T2, T6); + T5 = LDW(&(W[TWVL * 3])); + T7 = VFMA(T5, T6, T4); + Tu = VFNMS(T5, T3, Tt); + } + { + V Ta, Td, Tb, Tn, T9, Tc; + Ta = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Td = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T9 = LDW(&(W[0])); + Tb = VMUL(T9, Ta); + Tn = VMUL(T9, Td); + Tc = LDW(&(W[TWVL * 1])); + Te = VFMA(Tc, Td, Tb); + To = VFNMS(Tc, Ta, Tn); + } + { + V Tg, Tj, Th, Tp, Tf, Ti; + Tg = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + Tj = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + Tf = LDW(&(W[TWVL * 4])); + Th = VMUL(Tf, Tg); + Tp = VMUL(Tf, Tj); + Ti = LDW(&(W[TWVL * 5])); + Tk = VFMA(Ti, Tj, Th); + Tq = VFNMS(Ti, Tg, Tp); + } + { + V T8, Tl, Ts, Tw; + T8 = VADD(T1, T7); + Tl = VADD(Te, Tk); + ST(&(ri[WS(rs, 2)]), VSUB(T8, Tl), ms, &(ri[0])); + ST(&(ri[0]), VADD(T8, Tl), ms, &(ri[0])); + Ts = VADD(To, Tq); + Tw = VADD(Tu, Tv); + ST(&(ii[0]), VADD(Ts, Tw), ms, &(ii[0])); + ST(&(ii[WS(rs, 2)]), VSUB(Tw, Ts), ms, &(ii[0])); + } + { + V Tm, Tr, Tx, Ty; + Tm = VSUB(T1, T7); + Tr = VSUB(To, Tq); + ST(&(ri[WS(rs, 3)]), VSUB(Tm, Tr), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(Tm, Tr), ms, &(ri[WS(rs, 1)])); + Tx = VSUB(Tv, Tu); + Ty = VSUB(Te, Tk); + ST(&(ii[WS(rs, 1)]), VSUB(Tx, Ty), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(Ty, Tx), ms, &(ii[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1sv_4"), twinstr, &GENUS, {16, 6, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_4) (planner *p) { + X(kdft_dit_register) (p, t1sv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t1sv_4 -include dft/simd/ts.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 6), MAKE_VOLATILE_STRIDE(8, rs)) { + V T1, Tp, T6, To, Tc, Tk, Th, Tl; + T1 = LD(&(ri[0]), ms, &(ri[0])); + Tp = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T5, T2, T4; + T3 = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + T5 = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 2])); + T4 = LDW(&(W[TWVL * 3])); + T6 = VFMA(T2, T3, VMUL(T4, T5)); + To = VFNMS(T4, T3, VMUL(T2, T5)); + } + { + V T9, Tb, T8, Ta; + T9 = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Tb = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T8 = LDW(&(W[0])); + Ta = LDW(&(W[TWVL * 1])); + Tc = VFMA(T8, T9, VMUL(Ta, Tb)); + Tk = VFNMS(Ta, T9, VMUL(T8, Tb)); + } + { + V Te, Tg, Td, Tf; + Te = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + Tg = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + Td = LDW(&(W[TWVL * 4])); + Tf = LDW(&(W[TWVL * 5])); + Th = VFMA(Td, Te, VMUL(Tf, Tg)); + Tl = VFNMS(Tf, Te, VMUL(Td, Tg)); + } + { + V T7, Ti, Tn, Tq; + T7 = VADD(T1, T6); + Ti = VADD(Tc, Th); + ST(&(ri[WS(rs, 2)]), VSUB(T7, Ti), ms, &(ri[0])); + ST(&(ri[0]), VADD(T7, Ti), ms, &(ri[0])); + Tn = VADD(Tk, Tl); + Tq = VADD(To, Tp); + ST(&(ii[0]), VADD(Tn, Tq), ms, &(ii[0])); + ST(&(ii[WS(rs, 2)]), VSUB(Tq, Tn), ms, &(ii[0])); + } + { + V Tj, Tm, Tr, Ts; + Tj = VSUB(T1, T6); + Tm = VSUB(Tk, Tl); + ST(&(ri[WS(rs, 3)]), VSUB(Tj, Tm), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(Tj, Tm), ms, &(ri[WS(rs, 1)])); + Tr = VSUB(Tp, To); + Ts = VSUB(Tc, Th); + ST(&(ii[WS(rs, 1)]), VSUB(Tr, Ts), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(Ts, Tr), ms, &(ii[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t1sv_4"), twinstr, &GENUS, {16, 6, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_4) (planner *p) { + X(kdft_dit_register) (p, t1sv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_8.c new file mode 100644 index 000000000..c8b96f085 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t1sv_8.c @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1sv_8 -include dft/simd/ts.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 44 additions, 14 multiplications, 22 fused multiply/add), + * 34 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 14); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 14), MAKE_VOLATILE_STRIDE(16, rs)) { + V T1, T1m, T7, T1l, Tk, TS, Te, TQ, TF, T14, TL, T16, T12, T17, Ts; + V TX, Ty, TZ, TV, T10; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T1m = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T6, T4, T1k, T2, T5; + T3 = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + T6 = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 6])); + T4 = VMUL(T2, T3); + T1k = VMUL(T2, T6); + T5 = LDW(&(W[TWVL * 7])); + T7 = VFMA(T5, T6, T4); + T1l = VFNMS(T5, T3, T1k); + } + { + V Tg, Tj, Th, TR, Tf, Ti; + Tg = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + Tj = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + Tf = LDW(&(W[TWVL * 10])); + Th = VMUL(Tf, Tg); + TR = VMUL(Tf, Tj); + Ti = LDW(&(W[TWVL * 11])); + Tk = VFMA(Ti, Tj, Th); + TS = VFNMS(Ti, Tg, TR); + } + { + V Ta, Td, Tb, TP, T9, Tc; + Ta = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + Td = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T9 = LDW(&(W[TWVL * 2])); + Tb = VMUL(T9, Ta); + TP = VMUL(T9, Td); + Tc = LDW(&(W[TWVL * 3])); + Te = VFMA(Tc, Td, Tb); + TQ = VFNMS(Tc, Ta, TP); + } + { + V TB, TE, TC, T13, TH, TK, TI, T15, TA, TG, TD, TJ; + TB = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + TE = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + TA = LDW(&(W[TWVL * 12])); + TC = VMUL(TA, TB); + T13 = VMUL(TA, TE); + TH = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + TK = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + TG = LDW(&(W[TWVL * 4])); + TI = VMUL(TG, TH); + T15 = VMUL(TG, TK); + TD = LDW(&(W[TWVL * 13])); + TF = VFMA(TD, TE, TC); + T14 = VFNMS(TD, TB, T13); + TJ = LDW(&(W[TWVL * 5])); + TL = VFMA(TJ, TK, TI); + T16 = VFNMS(TJ, TH, T15); + T12 = VSUB(TF, TL); + T17 = VSUB(T14, T16); + } + { + V To, Tr, Tp, TW, Tu, Tx, Tv, TY, Tn, Tt, Tq, Tw; + To = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Tr = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + Tn = LDW(&(W[0])); + Tp = VMUL(Tn, To); + TW = VMUL(Tn, Tr); + Tu = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + Tx = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + Tt = LDW(&(W[TWVL * 8])); + Tv = VMUL(Tt, Tu); + TY = VMUL(Tt, Tx); + Tq = LDW(&(W[TWVL * 1])); + Ts = VFMA(Tq, Tr, Tp); + TX = VFNMS(Tq, To, TW); + Tw = LDW(&(W[TWVL * 9])); + Ty = VFMA(Tw, Tx, Tv); + TZ = VFNMS(Tw, Tu, TY); + TV = VSUB(Ts, Ty); + T10 = VSUB(TX, TZ); + } + { + V TU, T1a, T1t, T1v, T19, T1w, T1d, T1u; + { + V TO, TT, T1r, T1s; + TO = VSUB(T1, T7); + TT = VSUB(TQ, TS); + TU = VADD(TO, TT); + T1a = VSUB(TO, TT); + T1r = VSUB(T1m, T1l); + T1s = VSUB(Te, Tk); + T1t = VSUB(T1r, T1s); + T1v = VADD(T1s, T1r); + } + { + V T11, T18, T1b, T1c; + T11 = VADD(TV, T10); + T18 = VSUB(T12, T17); + T19 = VADD(T11, T18); + T1w = VSUB(T18, T11); + T1b = VSUB(T10, TV); + T1c = VADD(T12, T17); + T1d = VSUB(T1b, T1c); + T1u = VADD(T1b, T1c); + } + ST(&(ri[WS(rs, 5)]), VFNMS(LDK(KP707106781), T19, TU), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 5)]), VFNMS(LDK(KP707106781), T1u, T1t), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VFMA(LDK(KP707106781), T19, TU), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VFMA(LDK(KP707106781), T1u, T1t), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VFNMS(LDK(KP707106781), T1d, T1a), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 7)]), VFNMS(LDK(KP707106781), T1w, T1v), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VFMA(LDK(KP707106781), T1d, T1a), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VFMA(LDK(KP707106781), T1w, T1v), ms, &(ii[WS(rs, 1)])); + } + { + V Tm, T1e, T1o, T1q, TN, T1p, T1h, T1i; + { + V T8, Tl, T1j, T1n; + T8 = VADD(T1, T7); + Tl = VADD(Te, Tk); + Tm = VADD(T8, Tl); + T1e = VSUB(T8, Tl); + T1j = VADD(TQ, TS); + T1n = VADD(T1l, T1m); + T1o = VADD(T1j, T1n); + T1q = VSUB(T1n, T1j); + } + { + V Tz, TM, T1f, T1g; + Tz = VADD(Ts, Ty); + TM = VADD(TF, TL); + TN = VADD(Tz, TM); + T1p = VSUB(TM, Tz); + T1f = VADD(TX, TZ); + T1g = VADD(T14, T16); + T1h = VSUB(T1f, T1g); + T1i = VADD(T1f, T1g); + } + ST(&(ri[WS(rs, 4)]), VSUB(Tm, TN), ms, &(ri[0])); + ST(&(ii[WS(rs, 4)]), VSUB(T1o, T1i), ms, &(ii[0])); + ST(&(ri[0]), VADD(Tm, TN), ms, &(ri[0])); + ST(&(ii[0]), VADD(T1i, T1o), ms, &(ii[0])); + ST(&(ri[WS(rs, 6)]), VSUB(T1e, T1h), ms, &(ri[0])); + ST(&(ii[WS(rs, 6)]), VSUB(T1q, T1p), ms, &(ii[0])); + ST(&(ri[WS(rs, 2)]), VADD(T1e, T1h), ms, &(ri[0])); + ST(&(ii[WS(rs, 2)]), VADD(T1p, T1q), ms, &(ii[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1sv_8"), twinstr, &GENUS, {44, 14, 22, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_8) (planner *p) { + X(kdft_dit_register) (p, t1sv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t1sv_8 -include dft/simd/ts.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 52 additions, 18 multiplications, 14 fused multiply/add), + * 28 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/simd/ts.h" + +static void t1sv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 14); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 14), MAKE_VOLATILE_STRIDE(16, rs)) { + V T7, T1e, TH, T19, TF, T13, TR, TU, Ti, T1f, TK, T16, Tu, T12, TM; + V TP; + { + V T1, T18, T6, T17; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T18 = LD(&(ii[0]), ms, &(ii[0])); + { + V T3, T5, T2, T4; + T3 = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + T5 = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T2 = LDW(&(W[TWVL * 6])); + T4 = LDW(&(W[TWVL * 7])); + T6 = VFMA(T2, T3, VMUL(T4, T5)); + T17 = VFNMS(T4, T3, VMUL(T2, T5)); + } + T7 = VADD(T1, T6); + T1e = VSUB(T18, T17); + TH = VSUB(T1, T6); + T19 = VADD(T17, T18); + } + { + V Tz, TS, TE, TT; + { + V Tw, Ty, Tv, Tx; + Tw = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + Ty = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + Tv = LDW(&(W[TWVL * 12])); + Tx = LDW(&(W[TWVL * 13])); + Tz = VFMA(Tv, Tw, VMUL(Tx, Ty)); + TS = VFNMS(Tx, Tw, VMUL(Tv, Ty)); + } + { + V TB, TD, TA, TC; + TB = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + TD = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + TA = LDW(&(W[TWVL * 4])); + TC = LDW(&(W[TWVL * 5])); + TE = VFMA(TA, TB, VMUL(TC, TD)); + TT = VFNMS(TC, TB, VMUL(TA, TD)); + } + TF = VADD(Tz, TE); + T13 = VADD(TS, TT); + TR = VSUB(Tz, TE); + TU = VSUB(TS, TT); + } + { + V Tc, TI, Th, TJ; + { + V T9, Tb, T8, Ta; + T9 = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + Tb = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T8 = LDW(&(W[TWVL * 2])); + Ta = LDW(&(W[TWVL * 3])); + Tc = VFMA(T8, T9, VMUL(Ta, Tb)); + TI = VFNMS(Ta, T9, VMUL(T8, Tb)); + } + { + V Te, Tg, Td, Tf; + Te = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + Tg = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + Td = LDW(&(W[TWVL * 10])); + Tf = LDW(&(W[TWVL * 11])); + Th = VFMA(Td, Te, VMUL(Tf, Tg)); + TJ = VFNMS(Tf, Te, VMUL(Td, Tg)); + } + Ti = VADD(Tc, Th); + T1f = VSUB(Tc, Th); + TK = VSUB(TI, TJ); + T16 = VADD(TI, TJ); + } + { + V To, TN, Tt, TO; + { + V Tl, Tn, Tk, Tm; + Tl = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Tn = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + Tk = LDW(&(W[0])); + Tm = LDW(&(W[TWVL * 1])); + To = VFMA(Tk, Tl, VMUL(Tm, Tn)); + TN = VFNMS(Tm, Tl, VMUL(Tk, Tn)); + } + { + V Tq, Ts, Tp, Tr; + Tq = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + Ts = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + Tp = LDW(&(W[TWVL * 8])); + Tr = LDW(&(W[TWVL * 9])); + Tt = VFMA(Tp, Tq, VMUL(Tr, Ts)); + TO = VFNMS(Tr, Tq, VMUL(Tp, Ts)); + } + Tu = VADD(To, Tt); + T12 = VADD(TN, TO); + TM = VSUB(To, Tt); + TP = VSUB(TN, TO); + } + { + V Tj, TG, T1b, T1c; + Tj = VADD(T7, Ti); + TG = VADD(Tu, TF); + ST(&(ri[WS(rs, 4)]), VSUB(Tj, TG), ms, &(ri[0])); + ST(&(ri[0]), VADD(Tj, TG), ms, &(ri[0])); + { + V T15, T1a, T11, T14; + T15 = VADD(T12, T13); + T1a = VADD(T16, T19); + ST(&(ii[0]), VADD(T15, T1a), ms, &(ii[0])); + ST(&(ii[WS(rs, 4)]), VSUB(T1a, T15), ms, &(ii[0])); + T11 = VSUB(T7, Ti); + T14 = VSUB(T12, T13); + ST(&(ri[WS(rs, 6)]), VSUB(T11, T14), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VADD(T11, T14), ms, &(ri[0])); + } + T1b = VSUB(TF, Tu); + T1c = VSUB(T19, T16); + ST(&(ii[WS(rs, 2)]), VADD(T1b, T1c), ms, &(ii[0])); + ST(&(ii[WS(rs, 6)]), VSUB(T1c, T1b), ms, &(ii[0])); + { + V TX, T1g, T10, T1d, TY, TZ; + TX = VSUB(TH, TK); + T1g = VSUB(T1e, T1f); + TY = VSUB(TP, TM); + TZ = VADD(TR, TU); + T10 = VMUL(LDK(KP707106781), VSUB(TY, TZ)); + T1d = VMUL(LDK(KP707106781), VADD(TY, TZ)); + ST(&(ri[WS(rs, 7)]), VSUB(TX, T10), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 5)]), VSUB(T1g, T1d), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VADD(TX, T10), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VADD(T1d, T1g), ms, &(ii[WS(rs, 1)])); + } + { + V TL, T1i, TW, T1h, TQ, TV; + TL = VADD(TH, TK); + T1i = VADD(T1f, T1e); + TQ = VADD(TM, TP); + TV = VSUB(TR, TU); + TW = VMUL(LDK(KP707106781), VADD(TQ, TV)); + T1h = VMUL(LDK(KP707106781), VSUB(TV, TQ)); + ST(&(ri[WS(rs, 5)]), VSUB(TL, TW), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 7)]), VSUB(T1i, T1h), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(TL, TW), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(T1h, T1i), ms, &(ii[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t1sv_8"), twinstr, &GENUS, {52, 18, 14, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t1sv_8) (planner *p) { + X(kdft_dit_register) (p, t1sv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_10.c new file mode 100644 index 000000000..ad23ea41e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_10.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:05 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t2bv_10 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 51 FP additions, 40 FP multiplications, + * (or, 33 additions, 22 multiplications, 18 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V T4, TA, Tk, Tp, Tq, TE, TF, TG, T9, Te, Tf, TB, TC, TD, T1; + V T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 8]), T2); + T4 = VSUB(T1, T3); + TA = VADD(T1, T3); + { + V Th, To, Tj, Tm; + { + V Tg, Tn, Ti, Tl; + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 6]), Tg); + Tn = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[0]), Tn); + Ti = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 16]), Ti); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 10]), Tl); + } + Tk = VSUB(Th, Tj); + Tp = VSUB(Tm, To); + Tq = VADD(Tk, Tp); + TE = VADD(Th, Tj); + TF = VADD(Tm, To); + TG = VADD(TE, TF); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 2]), T5); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 12]), T7); + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 14]), Ta); + } + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + TB = VADD(T6, T8); + TC = VADD(Tb, Td); + TD = VADD(TB, TC); + } + { + V Tt, Tr, Ts, Tx, Tz, Tv, Tw, Ty, Tu; + Tt = VSUB(Tf, Tq); + Tr = VADD(Tf, Tq); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tv = VSUB(T9, Te); + Tw = VSUB(Tk, Tp); + Tx = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tv)); + Tz = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tv, Tw)); + ST(&(x[WS(rs, 5)]), VADD(T4, Tr), ms, &(x[WS(rs, 1)])); + Ty = VFNMS(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFMAI(Tz, Ty), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFMAI(Tx, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFNMSI(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TJ, TH, TI, TN, TP, TL, TM, TO, TK; + TJ = VSUB(TD, TG); + TH = VADD(TD, TG); + TI = VFNMS(LDK(KP250000000), TH, TA); + TL = VSUB(TE, TF); + TM = VSUB(TB, TC); + TN = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TM, TL)); + TP = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TL, TM)); + ST(&(x[0]), VADD(TA, TH), ms, &(x[0])); + TO = VFMA(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 4)]), VFNMSI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFMAI(TP, TO), ms, &(x[0])); + TK = VFNMS(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 2)]), VFNMSI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(TN, TK), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t2bv_10"), twinstr, &GENUS, {33, 22, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_10) (planner *p) { + X(kdft_dit_register) (p, t2bv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t2bv_10 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 51 FP additions, 30 FP multiplications, + * (or, 45 additions, 24 multiplications, 6 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V Tu, TH, Tg, Tl, Tp, TD, TE, TJ, T5, Ta, To, TA, TB, TI, Tr; + V Tt, Ts; + Tr = LD(&(x[0]), ms, &(x[0])); + Ts = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tt = BYTW(&(W[TWVL * 8]), Ts); + Tu = VSUB(Tr, Tt); + TH = VADD(Tr, Tt); + { + V Td, Tk, Tf, Ti; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 6]), Tc); + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[0]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTW(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 10]), Th); + } + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tp = VADD(Tg, Tl); + TD = VADD(Td, Tf); + TE = VADD(Ti, Tk); + TJ = VADD(TD, TE); + } + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTW(&(W[TWVL * 2]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 14]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + To = VADD(T5, Ta); + TA = VADD(T2, T4); + TB = VADD(T7, T9); + TI = VADD(TA, TB); + } + { + V Tq, Tv, Tw, Tn, Tz, Tb, Tm, Ty, Tx; + Tq = VMUL(LDK(KP559016994), VSUB(To, Tp)); + Tv = VADD(To, Tp); + Tw = VFNMS(LDK(KP250000000), Tv, Tu); + Tb = VSUB(T5, Ta); + Tm = VSUB(Tg, Tl); + Tn = VBYI(VFMA(LDK(KP951056516), Tb, VMUL(LDK(KP587785252), Tm))); + Tz = VBYI(VFNMS(LDK(KP951056516), Tm, VMUL(LDK(KP587785252), Tb))); + ST(&(x[WS(rs, 5)]), VADD(Tu, Tv), ms, &(x[WS(rs, 1)])); + Ty = VSUB(Tw, Tq); + ST(&(x[WS(rs, 3)]), VSUB(Ty, Tz), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tx = VADD(Tq, Tw); + ST(&(x[WS(rs, 1)]), VADD(Tn, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(Tx, Tn), ms, &(x[WS(rs, 1)])); + } + { + V TM, TK, TL, TG, TP, TC, TF, TO, TN; + TM = VMUL(LDK(KP559016994), VSUB(TI, TJ)); + TK = VADD(TI, TJ); + TL = VFNMS(LDK(KP250000000), TK, TH); + TC = VSUB(TA, TB); + TF = VSUB(TD, TE); + TG = VBYI(VFNMS(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TC))); + TP = VBYI(VFMA(LDK(KP951056516), TC, VMUL(LDK(KP587785252), TF))); + ST(&(x[0]), VADD(TH, TK), ms, &(x[0])); + TO = VADD(TM, TL); + ST(&(x[WS(rs, 4)]), VSUB(TO, TP), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(TP, TO), ms, &(x[0])); + TN = VSUB(TL, TM); + ST(&(x[WS(rs, 2)]), VADD(TG, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TN, TG), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t2bv_10"), twinstr, &GENUS, {45, 24, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_10) (planner *p) { + X(kdft_dit_register) (p, t2bv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_16.c new file mode 100644 index 000000000..c8e0d2508 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_16.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:02 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t2bv_16 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 87 FP additions, 64 FP multiplications, + * (or, 53 additions, 30 multiplications, 34 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V T4, TW, T9, T19, TD, TI, TZ, T1a, Tf, Tk, Tl, T13, T1c, Tq, Tv; + V Tw, T16, T1d, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 14]), T2); + T4 = VADD(T1, T3); + TW = VSUB(T1, T3); + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 22]), T7); + T9 = VADD(T6, T8); + T19 = VSUB(T6, T8); + } + { + V TA, TH, TC, TF, TX, TY; + { + V Tz, TG, TB, TE; + Tz = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 2]), Tz); + TG = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TH = BYTW(&(W[TWVL * 10]), TG); + TB = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 18]), TB); + TE = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TF = BYTW(&(W[TWVL * 26]), TE); + } + TD = VADD(TA, TC); + TI = VADD(TF, TH); + TX = VSUB(TA, TC); + TY = VSUB(TF, TH); + TZ = VADD(TX, TY); + T1a = VSUB(TX, TY); + } + { + V Tc, Tj, Te, Th, T11, T12; + { + V Tb, Ti, Td, Tg; + Tb = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tc = BYTW(&(W[0]), Tb); + Ti = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tj = BYTW(&(W[TWVL * 24]), Ti); + Td = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Te = BYTW(&(W[TWVL * 16]), Td); + Tg = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Th = BYTW(&(W[TWVL * 8]), Tg); + } + Tf = VADD(Tc, Te); + Tk = VADD(Th, Tj); + Tl = VSUB(Tf, Tk); + T11 = VSUB(Tc, Te); + T12 = VSUB(Th, Tj); + T13 = VFNMS(LDK(KP414213562), T12, T11); + T1c = VFMA(LDK(KP414213562), T11, T12); + } + { + V Tn, Tu, Tp, Ts, T14, T15; + { + V Tm, Tt, To, Tr; + Tm = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tn = BYTW(&(W[TWVL * 28]), Tm); + Tt = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tu = BYTW(&(W[TWVL * 20]), Tt); + To = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tp = BYTW(&(W[TWVL * 12]), To); + Tr = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ts = BYTW(&(W[TWVL * 4]), Tr); + } + Tq = VADD(Tn, Tp); + Tv = VADD(Ts, Tu); + Tw = VSUB(Tq, Tv); + T14 = VSUB(Tn, Tp); + T15 = VSUB(Tu, Ts); + T16 = VFNMS(LDK(KP414213562), T15, T14); + T1d = VFMA(LDK(KP414213562), T14, T15); + } + { + V Ty, TM, TL, TN; + { + V Ta, Tx, TJ, TK; + Ta = VSUB(T4, T9); + Tx = VADD(Tl, Tw); + Ty = VFNMS(LDK(KP707106781), Tx, Ta); + TM = VFMA(LDK(KP707106781), Tx, Ta); + TJ = VSUB(TD, TI); + TK = VSUB(Tl, Tw); + TL = VFNMS(LDK(KP707106781), TK, TJ); + TN = VFMA(LDK(KP707106781), TK, TJ); + } + ST(&(x[WS(rs, 6)]), VFNMSI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(TN, TM), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFMAI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TM), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VFNMS(LDK(KP707106781), TZ, TW); + T1j = VADD(T1c, T1d); + T1k = VFNMS(LDK(KP923879532), T1j, T1i); + T1o = VFMA(LDK(KP923879532), T1j, T1i); + T1l = VFNMS(LDK(KP707106781), T1a, T19); + T1m = VSUB(T13, T16); + T1n = VFMA(LDK(KP923879532), T1m, T1l); + T1p = VFNMS(LDK(KP923879532), T1m, T1l); + } + ST(&(x[WS(rs, 5)]), VFMAI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T1p, T1o), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(T1p, T1o), ms, &(x[WS(rs, 1)])); + } + { + V TQ, TU, TT, TV; + { + V TO, TP, TR, TS; + TO = VADD(T4, T9); + TP = VADD(TD, TI); + TQ = VSUB(TO, TP); + TU = VADD(TO, TP); + TR = VADD(Tf, Tk); + TS = VADD(Tq, Tv); + TT = VSUB(TR, TS); + TV = VADD(TR, TS); + } + ST(&(x[WS(rs, 12)]), VFNMSI(TT, TQ), ms, &(x[0])); + ST(&(x[0]), VADD(TU, TV), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(TT, TQ), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TU, TV), ms, &(x[0])); + } + { + V T18, T1g, T1f, T1h; + { + V T10, T17, T1b, T1e; + T10 = VFMA(LDK(KP707106781), TZ, TW); + T17 = VADD(T13, T16); + T18 = VFNMS(LDK(KP923879532), T17, T10); + T1g = VFMA(LDK(KP923879532), T17, T10); + T1b = VFMA(LDK(KP707106781), T1a, T19); + T1e = VSUB(T1c, T1d); + T1f = VFNMS(LDK(KP923879532), T1e, T1b); + T1h = VFMA(LDK(KP923879532), T1e, T1b); + } + ST(&(x[WS(rs, 7)]), VFNMSI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T1h, T1g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFNMSI(T1h, T1g), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t2bv_16"), twinstr, &GENUS, {53, 30, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_16) (planner *p) { + X(kdft_dit_register) (p, t2bv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t2bv_16 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 87 FP additions, 42 FP multiplications, + * (or, 83 additions, 38 multiplications, 4 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V TJ, T1b, TD, T1c, T17, T18, Ty, TK, T10, T11, T12, Tb, TM, T13, T14; + V T15, Tm, TN, TG, TI, TH; + TG = LD(&(x[0]), ms, &(x[0])); + TH = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + TI = BYTW(&(W[TWVL * 14]), TH); + TJ = VSUB(TG, TI); + T1b = VADD(TG, TI); + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 6]), Tz); + TB = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 22]), TB); + TD = VSUB(TA, TC); + T1c = VADD(TA, TC); + } + { + V Tp, Tw, Tr, Tu, Ts, Tx; + { + V To, Tv, Tq, Tt; + To = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 2]), To); + Tv = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tw = BYTW(&(W[TWVL * 10]), Tv); + Tq = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tr = BYTW(&(W[TWVL * 18]), Tq); + Tt = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tu = BYTW(&(W[TWVL * 26]), Tt); + } + T17 = VADD(Tp, Tr); + T18 = VADD(Tu, Tw); + Ts = VSUB(Tp, Tr); + Tx = VSUB(Tu, Tw); + Ty = VMUL(LDK(KP707106781), VSUB(Ts, Tx)); + TK = VMUL(LDK(KP707106781), VADD(Ts, Tx)); + } + { + V T2, T9, T4, T7, T5, Ta; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 24]), T8); + T3 = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 16]), T3); + T6 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 8]), T6); + } + T10 = VADD(T2, T4); + T11 = VADD(T7, T9); + T12 = VSUB(T10, T11); + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VFNMS(LDK(KP382683432), Ta, VMUL(LDK(KP923879532), T5)); + TM = VFMA(LDK(KP382683432), T5, VMUL(LDK(KP923879532), Ta)); + } + { + V Td, Tk, Tf, Ti, Tg, Tl; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 28]), Tc); + Tj = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tk = BYTW(&(W[TWVL * 20]), Tj); + Te = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tf = BYTW(&(W[TWVL * 12]), Te); + Th = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ti = BYTW(&(W[TWVL * 4]), Th); + } + T13 = VADD(Td, Tf); + T14 = VADD(Ti, Tk); + T15 = VSUB(T13, T14); + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VFMA(LDK(KP923879532), Tg, VMUL(LDK(KP382683432), Tl)); + TN = VFNMS(LDK(KP382683432), Tg, VMUL(LDK(KP923879532), Tl)); + } + { + V T1a, T1g, T1f, T1h; + { + V T16, T19, T1d, T1e; + T16 = VMUL(LDK(KP707106781), VSUB(T12, T15)); + T19 = VSUB(T17, T18); + T1a = VBYI(VSUB(T16, T19)); + T1g = VBYI(VADD(T19, T16)); + T1d = VSUB(T1b, T1c); + T1e = VMUL(LDK(KP707106781), VADD(T12, T15)); + T1f = VSUB(T1d, T1e); + T1h = VADD(T1d, T1e); + } + ST(&(x[WS(rs, 6)]), VADD(T1a, T1f), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1h, T1g), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(T1f, T1a), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1g, T1h), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VADD(T1b, T1c); + T1j = VADD(T17, T18); + T1k = VSUB(T1i, T1j); + T1o = VADD(T1i, T1j); + T1l = VADD(T10, T11); + T1m = VADD(T13, T14); + T1n = VBYI(VSUB(T1l, T1m)); + T1p = VADD(T1l, T1m); + } + ST(&(x[WS(rs, 12)]), VSUB(T1k, T1n), ms, &(x[0])); + ST(&(x[0]), VADD(T1o, T1p), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1k, T1n), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(T1o, T1p), ms, &(x[0])); + } + { + V TF, TQ, TP, TR; + { + V Tn, TE, TL, TO; + Tn = VSUB(Tb, Tm); + TE = VSUB(Ty, TD); + TF = VBYI(VSUB(Tn, TE)); + TQ = VBYI(VADD(TE, Tn)); + TL = VSUB(TJ, TK); + TO = VSUB(TM, TN); + TP = VSUB(TL, TO); + TR = VADD(TL, TO); + } + ST(&(x[WS(rs, 5)]), VADD(TF, TP), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(TR, TQ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(TP, TF), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(TQ, TR), ms, &(x[WS(rs, 1)])); + } + { + V TU, TY, TX, TZ; + { + V TS, TT, TV, TW; + TS = VADD(TJ, TK); + TT = VADD(Tb, Tm); + TU = VADD(TS, TT); + TY = VSUB(TS, TT); + TV = VADD(TD, Ty); + TW = VADD(TM, TN); + TX = VBYI(VADD(TV, TW)); + TZ = VBYI(VSUB(TW, TV)); + } + ST(&(x[WS(rs, 15)]), VSUB(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(TY, TZ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(TY, TZ), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t2bv_16"), twinstr, &GENUS, {83, 38, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_16) (planner *p) { + X(kdft_dit_register) (p, t2bv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_2.c new file mode 100644 index 000000000..457d65bba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:01 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t2bv_2 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t2bv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_2) (planner *p) { + X(kdft_dit_register) (p, t2bv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t2bv_2 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t2bv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_2) (planner *p) { + X(kdft_dit_register) (p, t2bv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_20.c new file mode 100644 index 000000000..0cfad9b16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_20.c @@ -0,0 +1,524 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:05 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t2bv_20 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 123 FP additions, 88 FP multiplications, + * (or, 77 additions, 42 multiplications, 46 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, TX, T1m, T1K, TF, T14, T15, TQ, Tf, Tq, Tr, T1O, T1P, T1Q, T1w; + V T1z, T1A, TY, TZ, T10, T1L, T1M, T1N, T1p, T1s, T1t, T1i, T1j; + { + V T1, TW, T3, TU, TV, T2, TT, T1k, T1l; + T1 = LD(&(x[0]), ms, &(x[0])); + TV = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + TW = BYTW(&(W[TWVL * 28]), TV); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 18]), T2); + TT = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TU = BYTW(&(W[TWVL * 8]), TT); + T4 = VSUB(T1, T3); + TX = VSUB(TU, TW); + T1k = VADD(T1, T3); + T1l = VADD(TU, TW); + T1m = VSUB(T1k, T1l); + T1K = VADD(T1k, T1l); + } + { + V T9, T1n, TK, T1v, TP, T1y, Te, T1q, Tk, T1u, Tz, T1o, TE, T1r, Tp; + V T1x; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1n = VADD(T6, T8); + } + { + V TH, TJ, TG, TI; + TG = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TH = BYTW(&(W[TWVL * 24]), TG); + TI = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TJ = BYTW(&(W[TWVL * 4]), TI); + TK = VSUB(TH, TJ); + T1v = VADD(TH, TJ); + } + { + V TM, TO, TL, TN; + TL = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TM = BYTW(&(W[TWVL * 32]), TL); + TN = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TO = BYTW(&(W[TWVL * 12]), TN); + TP = VSUB(TM, TO); + T1y = VADD(TM, TO); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1q = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1u = VADD(Th, Tj); + } + { + V Tw, Ty, Tv, Tx; + Tv = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tw = BYTW(&(W[TWVL * 16]), Tv); + Tx = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + Ty = BYTW(&(W[TWVL * 36]), Tx); + Tz = VSUB(Tw, Ty); + T1o = VADD(Tw, Ty); + } + { + V TB, TD, TA, TC; + TA = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TB = BYTW(&(W[0]), TA); + TC = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TD = BYTW(&(W[TWVL * 20]), TC); + TE = VSUB(TB, TD); + T1r = VADD(TB, TD); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTW(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1x = VADD(Tm, To); + } + TF = VSUB(Tz, TE); + T14 = VSUB(T9, Te); + T15 = VSUB(Tk, Tp); + TQ = VSUB(TK, TP); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1O = VADD(T1u, T1v); + T1P = VADD(T1x, T1y); + T1Q = VADD(T1O, T1P); + T1w = VSUB(T1u, T1v); + T1z = VSUB(T1x, T1y); + T1A = VADD(T1w, T1z); + TY = VADD(Tz, TE); + TZ = VADD(TK, TP); + T10 = VADD(TY, TZ); + T1L = VADD(T1n, T1o); + T1M = VADD(T1q, T1r); + T1N = VADD(T1L, T1M); + T1p = VSUB(T1n, T1o); + T1s = VSUB(T1q, T1r); + T1t = VADD(T1p, T1s); + } + T1i = VADD(T4, Tr); + T1j = VADD(TX, T10); + ST(&(x[WS(rs, 15)]), VFNMSI(T1j, T1i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(T1j, T1i), ms, &(x[WS(rs, 1)])); + { + V T1T, T1R, T1S, T1X, T1Z, T1V, T1W, T1Y, T1U; + T1T = VSUB(T1N, T1Q); + T1R = VADD(T1N, T1Q); + T1S = VFNMS(LDK(KP250000000), T1R, T1K); + T1V = VSUB(T1L, T1M); + T1W = VSUB(T1O, T1P); + T1X = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1W, T1V)); + T1Z = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1V, T1W)); + ST(&(x[0]), VADD(T1K, T1R), ms, &(x[0])); + T1Y = VFNMS(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 8)]), VFMAI(T1Z, T1Y), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFNMSI(T1Z, T1Y), ms, &(x[0])); + T1U = VFMA(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 4)]), VFNMSI(T1X, T1U), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T1X, T1U), ms, &(x[0])); + } + { + V T1D, T1B, T1C, T1H, T1J, T1F, T1G, T1I, T1E; + T1D = VSUB(T1t, T1A); + T1B = VADD(T1t, T1A); + T1C = VFNMS(LDK(KP250000000), T1B, T1m); + T1F = VSUB(T1w, T1z); + T1G = VSUB(T1p, T1s); + T1H = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1G, T1F)); + T1J = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1F, T1G)); + ST(&(x[WS(rs, 10)]), VADD(T1m, T1B), ms, &(x[0])); + T1I = VFMA(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 6)]), VFMAI(T1J, T1I), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T1J, T1I), ms, &(x[0])); + T1E = VFNMS(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 2)]), VFNMSI(T1H, T1E), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T1H, T1E), ms, &(x[0])); + } + { + V TR, T16, T1e, T1b, T13, T1d, Tu, T1a; + TR = VFMA(LDK(KP618033988), TQ, TF); + T16 = VFMA(LDK(KP618033988), T15, T14); + T1e = VFNMS(LDK(KP618033988), T14, T15); + T1b = VFNMS(LDK(KP618033988), TF, TQ); + { + V T11, T12, Ts, Tt; + T11 = VFNMS(LDK(KP250000000), T10, TX); + T12 = VSUB(TY, TZ); + T13 = VFMA(LDK(KP559016994), T12, T11); + T1d = VFNMS(LDK(KP559016994), T12, T11); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tt = VSUB(Tf, Tq); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + T1a = VFNMS(LDK(KP559016994), Tt, Ts); + } + { + V TS, T17, T1g, T1h; + TS = VFNMS(LDK(KP951056516), TR, Tu); + T17 = VFMA(LDK(KP951056516), T16, T13); + ST(&(x[WS(rs, 19)]), VFNMSI(T17, TS), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T17, TS), ms, &(x[WS(rs, 1)])); + T1g = VFNMS(LDK(KP951056516), T1b, T1a); + T1h = VFMA(LDK(KP951056516), T1e, T1d); + ST(&(x[WS(rs, 7)]), VFNMSI(T1h, T1g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T1h, T1g), ms, &(x[WS(rs, 1)])); + } + { + V T18, T19, T1c, T1f; + T18 = VFMA(LDK(KP951056516), TR, Tu); + T19 = VFNMS(LDK(KP951056516), T16, T13); + ST(&(x[WS(rs, 11)]), VFNMSI(T19, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(T19, T18), ms, &(x[WS(rs, 1)])); + T1c = VFMA(LDK(KP951056516), T1b, T1a); + T1f = VFNMS(LDK(KP951056516), T1e, T1d); + ST(&(x[WS(rs, 3)]), VFNMSI(T1f, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VFMAI(T1f, T1c), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t2bv_20"), twinstr, &GENUS, {77, 42, 46, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_20) (planner *p) { + X(kdft_dit_register) (p, t2bv_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t2bv_20 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 123 FP additions, 62 FP multiplications, + * (or, 111 additions, 50 multiplications, 12 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, T10, T1B, T1R, TF, T14, T15, TQ, Tf, Tq, Tr, T1N, T1O, T1P, T1t; + V T1w, T1D, TT, TU, T11, T1K, T1L, T1M, T1m, T1p, T1C, T1i, T1j; + { + V T1, TZ, T3, TX, TY, T2, TW, T1z, T1A; + T1 = LD(&(x[0]), ms, &(x[0])); + TY = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + TZ = BYTW(&(W[TWVL * 28]), TY); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 18]), T2); + TW = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TX = BYTW(&(W[TWVL * 8]), TW); + T4 = VSUB(T1, T3); + T10 = VSUB(TX, TZ); + T1z = VADD(T1, T3); + T1A = VADD(TX, TZ); + T1B = VSUB(T1z, T1A); + T1R = VADD(T1z, T1A); + } + { + V T9, T1k, TK, T1s, TP, T1v, Te, T1n, Tk, T1r, Tz, T1l, TE, T1o, Tp; + V T1u; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1k = VADD(T6, T8); + } + { + V TH, TJ, TG, TI; + TG = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TH = BYTW(&(W[TWVL * 24]), TG); + TI = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TJ = BYTW(&(W[TWVL * 4]), TI); + TK = VSUB(TH, TJ); + T1s = VADD(TH, TJ); + } + { + V TM, TO, TL, TN; + TL = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TM = BYTW(&(W[TWVL * 32]), TL); + TN = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TO = BYTW(&(W[TWVL * 12]), TN); + TP = VSUB(TM, TO); + T1v = VADD(TM, TO); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1n = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1r = VADD(Th, Tj); + } + { + V Tw, Ty, Tv, Tx; + Tv = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tw = BYTW(&(W[TWVL * 16]), Tv); + Tx = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + Ty = BYTW(&(W[TWVL * 36]), Tx); + Tz = VSUB(Tw, Ty); + T1l = VADD(Tw, Ty); + } + { + V TB, TD, TA, TC; + TA = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TB = BYTW(&(W[0]), TA); + TC = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TD = BYTW(&(W[TWVL * 20]), TC); + TE = VSUB(TB, TD); + T1o = VADD(TB, TD); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTW(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1u = VADD(Tm, To); + } + TF = VSUB(Tz, TE); + T14 = VSUB(T9, Te); + T15 = VSUB(Tk, Tp); + TQ = VSUB(TK, TP); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1N = VADD(T1r, T1s); + T1O = VADD(T1u, T1v); + T1P = VADD(T1N, T1O); + T1t = VSUB(T1r, T1s); + T1w = VSUB(T1u, T1v); + T1D = VADD(T1t, T1w); + TT = VADD(Tz, TE); + TU = VADD(TK, TP); + T11 = VADD(TT, TU); + T1K = VADD(T1k, T1l); + T1L = VADD(T1n, T1o); + T1M = VADD(T1K, T1L); + T1m = VSUB(T1k, T1l); + T1p = VSUB(T1n, T1o); + T1C = VADD(T1m, T1p); + } + T1i = VADD(T4, Tr); + T1j = VBYI(VADD(T10, T11)); + ST(&(x[WS(rs, 15)]), VSUB(T1i, T1j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1i, T1j), ms, &(x[WS(rs, 1)])); + { + V T1Q, T1S, T1T, T1X, T1Z, T1V, T1W, T1Y, T1U; + T1Q = VMUL(LDK(KP559016994), VSUB(T1M, T1P)); + T1S = VADD(T1M, T1P); + T1T = VFNMS(LDK(KP250000000), T1S, T1R); + T1V = VSUB(T1K, T1L); + T1W = VSUB(T1N, T1O); + T1X = VBYI(VFMA(LDK(KP951056516), T1V, VMUL(LDK(KP587785252), T1W))); + T1Z = VBYI(VFNMS(LDK(KP951056516), T1W, VMUL(LDK(KP587785252), T1V))); + ST(&(x[0]), VADD(T1R, T1S), ms, &(x[0])); + T1Y = VSUB(T1T, T1Q); + ST(&(x[WS(rs, 8)]), VSUB(T1Y, T1Z), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T1Z, T1Y), ms, &(x[0])); + T1U = VADD(T1Q, T1T); + ST(&(x[WS(rs, 4)]), VSUB(T1U, T1X), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T1X, T1U), ms, &(x[0])); + } + { + V T1G, T1E, T1F, T1y, T1I, T1q, T1x, T1J, T1H; + T1G = VMUL(LDK(KP559016994), VSUB(T1C, T1D)); + T1E = VADD(T1C, T1D); + T1F = VFNMS(LDK(KP250000000), T1E, T1B); + T1q = VSUB(T1m, T1p); + T1x = VSUB(T1t, T1w); + T1y = VBYI(VFNMS(LDK(KP951056516), T1x, VMUL(LDK(KP587785252), T1q))); + T1I = VBYI(VFMA(LDK(KP951056516), T1q, VMUL(LDK(KP587785252), T1x))); + ST(&(x[WS(rs, 10)]), VADD(T1B, T1E), ms, &(x[0])); + T1J = VADD(T1G, T1F); + ST(&(x[WS(rs, 6)]), VADD(T1I, T1J), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1J, T1I), ms, &(x[0])); + T1H = VSUB(T1F, T1G); + ST(&(x[WS(rs, 2)]), VADD(T1y, T1H), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VSUB(T1H, T1y), ms, &(x[0])); + } + { + V TR, T16, T1d, T1b, T13, T1e, Tu, T1a; + TR = VFNMS(LDK(KP951056516), TQ, VMUL(LDK(KP587785252), TF)); + T16 = VFNMS(LDK(KP951056516), T15, VMUL(LDK(KP587785252), T14)); + T1d = VFMA(LDK(KP951056516), T14, VMUL(LDK(KP587785252), T15)); + T1b = VFMA(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TQ)); + { + V TV, T12, Ts, Tt; + TV = VMUL(LDK(KP559016994), VSUB(TT, TU)); + T12 = VFNMS(LDK(KP250000000), T11, T10); + T13 = VSUB(TV, T12); + T1e = VADD(TV, T12); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tt = VMUL(LDK(KP559016994), VSUB(Tf, Tq)); + Tu = VSUB(Ts, Tt); + T1a = VADD(Tt, Ts); + } + { + V TS, T17, T1g, T1h; + TS = VSUB(Tu, TR); + T17 = VBYI(VSUB(T13, T16)); + ST(&(x[WS(rs, 17)]), VSUB(TS, T17), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(TS, T17), ms, &(x[WS(rs, 1)])); + T1g = VADD(T1a, T1b); + T1h = VBYI(VSUB(T1e, T1d)); + ST(&(x[WS(rs, 11)]), VSUB(T1g, T1h), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T1g, T1h), ms, &(x[WS(rs, 1)])); + } + { + V T18, T19, T1c, T1f; + T18 = VADD(Tu, TR); + T19 = VBYI(VADD(T16, T13)); + ST(&(x[WS(rs, 13)]), VSUB(T18, T19), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T18, T19), ms, &(x[WS(rs, 1)])); + T1c = VSUB(T1a, T1b); + T1f = VBYI(VADD(T1d, T1e)); + ST(&(x[WS(rs, 19)]), VSUB(T1c, T1f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1c, T1f), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t2bv_20"), twinstr, &GENUS, {111, 50, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_20) (planner *p) { + X(kdft_dit_register) (p, t2bv_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_25.c new file mode 100644 index 000000000..8eb22005d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_25.c @@ -0,0 +1,944 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:05 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t2bv_25 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 248 FP additions, 241 FP multiplications, + * (or, 67 additions, 60 multiplications, 181 fused multiply/add), + * 147 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1, Te, Tc, Td, T1O, T2X, T3Q, T1x, T2K, T1u, T2L, T1y, T27, T3b, T2R; + V T2M, T2f, T3M, Ty, T2E, Tv, T2D, Tz, T2a, T3e, T2U, T2F, T2i, T3N, TK; + V T2B, TS, T2A, TT, T2b, T3f, T2T, T2C, T2j, T3P, T1d, T2H, T1a, T2I, T1e; + V T28, T3c, T2Q, T2J, T2g; + { + V T8, Ta, Tb, T3, T5, T6, T1M, T1N; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T7, T9, T2, T4; + T7 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 18]), T7); + T9 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 28]), T9); + Tb = VADD(T8, Ta); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[TWVL * 8]), T2); + T4 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 38]), T4); + T6 = VADD(T3, T5); + } + Te = VSUB(T6, Tb); + Tc = VADD(T6, Tb); + Td = VFNMS(LDK(KP250000000), Tc, T1); + T1M = VSUB(T3, T5); + T1N = VSUB(T8, Ta); + T1O = VFMA(LDK(KP618033988), T1N, T1M); + T2X = VFNMS(LDK(KP618033988), T1M, T1N); + } + { + V T1g, T1v, T1w, T1l, T1q, T1r, T1f, T1s, T1t; + T1f = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1g = BYTW(&(W[TWVL * 4]), T1f); + { + V T1i, T1p, T1k, T1n; + { + V T1h, T1o, T1j, T1m; + T1h = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1i = BYTW(&(W[TWVL * 14]), T1h); + T1o = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1p = BYTW(&(W[TWVL * 34]), T1o); + T1j = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1k = BYTW(&(W[TWVL * 44]), T1j); + T1m = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1n = BYTW(&(W[TWVL * 24]), T1m); + } + T1v = VSUB(T1i, T1k); + T1w = VSUB(T1n, T1p); + T1l = VADD(T1i, T1k); + T1q = VADD(T1n, T1p); + T1r = VADD(T1l, T1q); + } + T3Q = VADD(T1g, T1r); + T1x = VFMA(LDK(KP618033988), T1w, T1v); + T2K = VFNMS(LDK(KP618033988), T1v, T1w); + T1s = VFNMS(LDK(KP250000000), T1r, T1g); + T1t = VSUB(T1q, T1l); + T1u = VFNMS(LDK(KP559016994), T1t, T1s); + T2L = VFMA(LDK(KP559016994), T1t, T1s); + T1y = VFNMS(LDK(KP893101515), T1x, T1u); + T27 = VFNMS(LDK(KP120146378), T1x, T1u); + T3b = VFMA(LDK(KP066152395), T2L, T2K); + T2R = VFNMS(LDK(KP786782374), T2K, T2L); + T2M = VFMA(LDK(KP869845200), T2L, T2K); + T2f = VFMA(LDK(KP132830569), T1u, T1x); + } + { + V Th, Tw, Tx, Tm, Tr, Ts, Tg, Tt, Tu; + Tg = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Th = BYTW(&(W[0]), Tg); + { + V Tj, Tq, Tl, To; + { + V Ti, Tp, Tk, Tn; + Ti = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 10]), Ti); + Tp = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tq = BYTW(&(W[TWVL * 30]), Tp); + Tk = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tl = BYTW(&(W[TWVL * 40]), Tk); + Tn = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[TWVL * 20]), Tn); + } + Tw = VSUB(Tj, Tl); + Tx = VSUB(Tq, To); + Tm = VADD(Tj, Tl); + Tr = VADD(To, Tq); + Ts = VADD(Tm, Tr); + } + T3M = VADD(Th, Ts); + Ty = VFNMS(LDK(KP618033988), Tx, Tw); + T2E = VFMA(LDK(KP618033988), Tw, Tx); + Tt = VFNMS(LDK(KP250000000), Ts, Th); + Tu = VSUB(Tm, Tr); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + T2D = VFNMS(LDK(KP559016994), Tu, Tt); + Tz = VFNMS(LDK(KP244189809), Ty, Tv); + T2a = VFMA(LDK(KP667278218), Tv, Ty); + T3e = VFNMS(LDK(KP522847744), T2E, T2D); + T2U = VFNMS(LDK(KP987388751), T2D, T2E); + T2F = VFMA(LDK(KP893101515), T2E, T2D); + T2i = VFNMS(LDK(KP603558818), Ty, Tv); + } + { + V TM, TE, TJ, TN, TO, TP, TL, TQ, TR; + TL = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TM = BYTW(&(W[TWVL * 6]), TL); + { + V TB, TI, TD, TG; + { + V TA, TH, TC, TF; + TA = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TB = BYTW(&(W[TWVL * 46]), TA); + TH = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TI = BYTW(&(W[TWVL * 26]), TH); + TC = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TD = BYTW(&(W[TWVL * 16]), TC); + TF = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TG = BYTW(&(W[TWVL * 36]), TF); + } + TE = VSUB(TB, TD); + TJ = VSUB(TG, TI); + TN = VADD(TD, TB); + TO = VADD(TI, TG); + TP = VADD(TN, TO); + } + T3N = VADD(TM, TP); + TK = VFMA(LDK(KP618033988), TJ, TE); + T2B = VFNMS(LDK(KP618033988), TE, TJ); + TQ = VFMS(LDK(KP250000000), TP, TM); + TR = VSUB(TN, TO); + TS = VFNMS(LDK(KP559016994), TR, TQ); + T2A = VFMA(LDK(KP559016994), TR, TQ); + TT = VFNMS(LDK(KP667278218), TS, TK); + T2b = VFMA(LDK(KP869845200), TS, TK); + T3f = VFNMS(LDK(KP494780565), T2A, T2B); + T2T = VFNMS(LDK(KP132830569), T2A, T2B); + T2C = VFMA(LDK(KP120146378), T2B, T2A); + T2j = VFNMS(LDK(KP786782374), TK, TS); + } + { + V TW, T1b, T1c, T11, T16, T17, TV, T18, T19; + TV = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TW = BYTW(&(W[TWVL * 2]), TV); + { + V TY, T15, T10, T13; + { + V TX, T14, TZ, T12; + TX = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TY = BYTW(&(W[TWVL * 12]), TX); + T14 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T15 = BYTW(&(W[TWVL * 32]), T14); + TZ = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T10 = BYTW(&(W[TWVL * 42]), TZ); + T12 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T13 = BYTW(&(W[TWVL * 22]), T12); + } + T1b = VSUB(TY, T10); + T1c = VSUB(T15, T13); + T11 = VADD(TY, T10); + T16 = VADD(T13, T15); + T17 = VADD(T11, T16); + } + T3P = VADD(TW, T17); + T1d = VFNMS(LDK(KP618033988), T1c, T1b); + T2H = VFMA(LDK(KP618033988), T1b, T1c); + T18 = VFNMS(LDK(KP250000000), T17, TW); + T19 = VSUB(T16, T11); + T1a = VFNMS(LDK(KP559016994), T19, T18); + T2I = VFMA(LDK(KP559016994), T19, T18); + T1e = VFNMS(LDK(KP522847744), T1d, T1a); + T28 = VFNMS(LDK(KP494780565), T1a, T1d); + T3c = VFNMS(LDK(KP667278218), T2I, T2H); + T2Q = VFNMS(LDK(KP059835404), T2H, T2I); + T2J = VFMA(LDK(KP066152395), T2I, T2H); + T2g = VFMA(LDK(KP447533225), T1d, T1a); + } + { + V T3Y, T40, T3L, T3S, T3T, T3U, T3Z, T3V; + { + V T3W, T3X, T3O, T3R; + T3W = VSUB(T3M, T3N); + T3X = VSUB(T3P, T3Q); + T3Y = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T3X, T3W)); + T40 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T3W, T3X)); + T3L = VADD(T1, Tc); + T3O = VADD(T3M, T3N); + T3R = VADD(T3P, T3Q); + T3S = VADD(T3O, T3R); + T3T = VFNMS(LDK(KP250000000), T3S, T3L); + T3U = VSUB(T3O, T3R); + } + ST(&(x[0]), VADD(T3S, T3L), ms, &(x[0])); + T3Z = VFNMS(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 10)]), VFNMSI(T40, T3Z), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VFMAI(T40, T3Z), ms, &(x[WS(rs, 1)])); + T3V = VFMA(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 5)]), VFMAI(T3Y, T3V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VFNMSI(T3Y, T3V), ms, &(x[0])); + } + { + V T2Z, T35, T3B, T3I, T2W, T38, T2O, T32, T2z, T3t, T3h, T3s, T3p, T3F, T3r; + V T3v, T3C, T3z, T3A; + T2Z = VFMA(LDK(KP734762448), T2U, T2T); + T35 = VFNMS(LDK(KP734762448), T2F, T2C); + T3z = VFMA(LDK(KP845997307), T3c, T3b); + T3A = VFMA(LDK(KP982009705), T3f, T3e); + T3B = VFMA(LDK(KP570584518), T3A, T3z); + T3I = VFNMS(LDK(KP669429328), T3z, T3A); + { + V T2S, T2V, T37, T36; + T2S = VFMA(LDK(KP772036680), T2R, T2Q); + T2V = VFNMS(LDK(KP734762448), T2U, T2T); + T36 = VFMA(LDK(KP772036680), T2M, T2J); + T37 = VFMA(LDK(KP522616830), T2V, T36); + T2W = VFMA(LDK(KP945422727), T2V, T2S); + T38 = VFNMS(LDK(KP690983005), T37, T2S); + } + { + V T2N, T2G, T31, T30; + T2N = VFNMS(LDK(KP772036680), T2M, T2J); + T2G = VFMA(LDK(KP734762448), T2F, T2C); + T30 = VFNMS(LDK(KP772036680), T2R, T2Q); + T31 = VFNMS(LDK(KP522616830), T2G, T30); + T2O = VFMA(LDK(KP956723877), T2N, T2G); + T32 = VFMA(LDK(KP763932022), T31, T2N); + } + { + V T3o, T3u, T3l, T3m, T3n; + T2z = VFNMS(LDK(KP559016994), Te, Td); + T3m = VFMA(LDK(KP447533225), T2B, T2A); + T3n = VFMA(LDK(KP578046249), T2D, T2E); + T3o = VFNMS(LDK(KP921078979), T3n, T3m); + T3t = VFMA(LDK(KP921078979), T3n, T3m); + { + V T3d, T3g, T3j, T3k; + T3d = VFNMS(LDK(KP845997307), T3c, T3b); + T3g = VFNMS(LDK(KP982009705), T3f, T3e); + T3h = VFMA(LDK(KP923225144), T3g, T3d); + T3u = VFNMS(LDK(KP923225144), T3g, T3d); + T3j = VFNMS(LDK(KP059835404), T2K, T2L); + T3k = VFMA(LDK(KP603558818), T2H, T2I); + T3l = VFMA(LDK(KP845997307), T3k, T3j); + T3s = VFNMS(LDK(KP845997307), T3k, T3j); + } + T3p = VFNMS(LDK(KP906616052), T3o, T3l); + T3F = VFNMS(LDK(KP904508497), T3u, T3s); + T3r = VFNMS(LDK(KP237294955), T3h, T2z); + T3v = VFNMS(LDK(KP997675361), T3u, T3t); + T3C = VFMA(LDK(KP906616052), T3o, T3l); + } + { + V T2P, T2Y, T3i, T3q; + T2P = VFMA(LDK(KP992114701), T2O, T2z); + T2Y = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T2X, T2W)); + ST(&(x[WS(rs, 22)]), VFNMSI(T2Y, T2P), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(T2Y, T2P), ms, &(x[WS(rs, 1)])); + T3i = VFMA(LDK(KP949179823), T3h, T2z); + T3q = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T2X, T3p)); + ST(&(x[WS(rs, 23)]), VFNMSI(T3q, T3i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(T3q, T3i), ms, &(x[0])); + } + { + V T34, T3a, T33, T39; + T33 = VFNMS(LDK(KP855719849), T32, T2Z); + T34 = VFMA(LDK(KP897376177), T33, T2z); + T39 = VFMA(LDK(KP855719849), T38, T35); + T3a = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T39, T2X)); + ST(&(x[WS(rs, 8)]), VFMAI(T3a, T34), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VFNMSI(T3a, T34), ms, &(x[WS(rs, 1)])); + } + { + V T3x, T3H, T3E, T3K, T3w; + T3w = VFMA(LDK(KP560319534), T3v, T3s); + T3x = VFNMS(LDK(KP949179823), T3w, T3r); + { + V T3G, T3y, T3J, T3D; + T3G = VFNMS(LDK(KP681693190), T3F, T3t); + T3H = VFNMS(LDK(KP860541664), T3G, T3r); + T3y = VFMA(LDK(KP262346850), T3p, T2X); + T3J = VFNMS(LDK(KP669429328), T3C, T3I); + T3D = VFMA(LDK(KP618033988), T3C, T3B); + T3E = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T3D, T3y)); + T3K = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T3J, T3y)); + } + ST(&(x[WS(rs, 12)]), VFNMSI(T3E, T3x), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3K, T3H), ms, &(x[0])); + ST(&(x[WS(rs, 13)]), VFMAI(T3E, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(T3K, T3H), ms, &(x[WS(rs, 1)])); + } + } + { + V T2n, T2t, T1V, T22, T2l, T2w, T2d, T2q, Tf, T1I, T1A, T1E, T1B, T1Z, T1J; + V T1R, T1W, T1T, T1U; + T2n = VFNMS(LDK(KP912575812), T2j, T2i); + T2t = VFNMS(LDK(KP912575812), T2b, T2a); + T1T = VFNMS(LDK(KP829049696), TT, Tz); + T1U = VFNMS(LDK(KP831864738), T1y, T1e); + T1V = VFMA(LDK(KP559154169), T1U, T1T); + T22 = VFNMS(LDK(KP683113946), T1T, T1U); + { + V T2h, T2k, T2v, T2u; + T2h = VFMA(LDK(KP958953096), T2g, T2f); + T2k = VFMA(LDK(KP912575812), T2j, T2i); + T2u = VFMA(LDK(KP867381224), T28, T27); + T2v = VFMA(LDK(KP447417479), T2k, T2u); + T2l = VFMA(LDK(KP894834959), T2k, T2h); + T2w = VFNMS(LDK(KP763932022), T2v, T2h); + } + { + V T29, T2c, T2p, T2o; + T29 = VFNMS(LDK(KP867381224), T28, T27); + T2c = VFMA(LDK(KP912575812), T2b, T2a); + T2o = VFNMS(LDK(KP958953096), T2g, T2f); + T2p = VFMA(LDK(KP447417479), T2c, T2o); + T2d = VFNMS(LDK(KP809385824), T2c, T29); + T2q = VFMA(LDK(KP690983005), T2p, T29); + } + { + V T1Q, T1F, T1P, T1G, T1H; + Tf = VFMA(LDK(KP559016994), Te, Td); + T1G = VFMA(LDK(KP578046249), T1a, T1d); + T1H = VFMA(LDK(KP987388751), T1u, T1x); + T1I = VFNMS(LDK(KP831864738), T1H, T1G); + T1Q = VFMA(LDK(KP831864738), T1H, T1G); + { + V TU, T1z, T1C, T1D; + TU = VFMA(LDK(KP829049696), TT, Tz); + T1z = VFMA(LDK(KP831864738), T1y, T1e); + T1A = VFMA(LDK(KP904730450), T1z, TU); + T1F = VFNMS(LDK(KP904730450), T1z, TU); + T1C = VFMA(LDK(KP269969613), Tv, Ty); + T1D = VFMA(LDK(KP603558818), TK, TS); + T1E = VFMA(LDK(KP916574801), T1D, T1C); + T1P = VFNMS(LDK(KP916574801), T1D, T1C); + } + T1B = VFNMS(LDK(KP242145790), T1A, Tf); + T1Z = VADD(T1E, T1F); + T1J = VFNMS(LDK(KP904730450), T1I, T1F); + T1R = VFMA(LDK(KP904730450), T1Q, T1P); + T1W = VFNMS(LDK(KP904730450), T1Q, T1P); + } + { + V T25, T26, T2e, T2m; + T25 = VFMA(LDK(KP968583161), T1A, Tf); + T26 = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1R, T1O)); + ST(&(x[WS(rs, 1)]), VFMAI(T26, T25), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VFNMSI(T26, T25), ms, &(x[0])); + T2e = VFNMS(LDK(KP992114701), T2d, Tf); + T2m = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2l, T1O)); + ST(&(x[WS(rs, 4)]), VFNMSI(T2m, T2e), ms, &(x[0])); + ST(&(x[WS(rs, 21)]), VFMAI(T2m, T2e), ms, &(x[WS(rs, 1)])); + } + { + V T2s, T2y, T2r, T2x; + T2r = VFNMS(LDK(KP999544308), T2q, T2n); + T2s = VFNMS(LDK(KP803003575), T2r, Tf); + T2x = VFNMS(LDK(KP999544308), T2w, T2t); + T2y = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T2x, T1O)); + ST(&(x[WS(rs, 9)]), VFNMSI(T2y, T2s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VFMAI(T2y, T2s), ms, &(x[0])); + } + { + V T1L, T21, T1Y, T24, T1K; + T1K = VFNMS(LDK(KP618033988), T1J, T1E); + T1L = VFNMS(LDK(KP876091699), T1K, T1B); + { + V T20, T1S, T23, T1X; + T20 = VFNMS(LDK(KP683113946), T1Z, T1I); + T21 = VFMA(LDK(KP792626838), T20, T1B); + T1S = VFNMS(LDK(KP242145790), T1R, T1O); + T23 = VFMA(LDK(KP617882369), T1W, T22); + T1X = VFMA(LDK(KP559016994), T1W, T1V); + T1Y = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1X, T1S)); + T24 = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T23, T1S)); + } + ST(&(x[WS(rs, 6)]), VFMAI(T1Y, T1L), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T24, T21), ms, &(x[0])); + ST(&(x[WS(rs, 19)]), VFNMSI(T1Y, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T24, T21), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t2bv_25"), twinstr, &GENUS, {67, 60, 181, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_25) (planner *p) { + X(kdft_dit_register) (p, t2bv_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t2bv_25 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 248 FP additions, 188 FP multiplications, + * (or, 171 additions, 111 multiplications, 77 fused multiply/add), + * 100 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1A, T1z, T1R, T1S, T1B, T1C, T1Q, T2L, T1l, T2v, T1i, T3e, T2u, Tb, T2i; + V Tj, T3b, T2h, Tv, T2k, TD, T3a, T2l, T11, T2s, TY, T3d, T2r; + { + V T1v, T1x, T1y, T1q, T1s, T1t, T1P; + T1A = LD(&(x[0]), ms, &(x[0])); + { + V T1u, T1w, T1p, T1r; + T1u = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T1v = BYTW(&(W[TWVL * 18]), T1u); + T1w = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1x = BYTW(&(W[TWVL * 28]), T1w); + T1y = VADD(T1v, T1x); + T1p = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1q = BYTW(&(W[TWVL * 8]), T1p); + T1r = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T1s = BYTW(&(W[TWVL * 38]), T1r); + T1t = VADD(T1q, T1s); + } + T1z = VMUL(LDK(KP559016994), VSUB(T1t, T1y)); + T1R = VSUB(T1v, T1x); + T1S = VMUL(LDK(KP587785252), T1R); + T1B = VADD(T1t, T1y); + T1C = VFNMS(LDK(KP250000000), T1B, T1A); + T1P = VSUB(T1q, T1s); + T1Q = VMUL(LDK(KP951056516), T1P); + T2L = VMUL(LDK(KP587785252), T1P); + } + { + V T1f, T19, T1b, T1c, T14, T16, T17, T1e; + T1e = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1f = BYTW(&(W[TWVL * 4]), T1e); + { + V T18, T1a, T13, T15; + T18 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T19 = BYTW(&(W[TWVL * 24]), T18); + T1a = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1b = BYTW(&(W[TWVL * 34]), T1a); + T1c = VADD(T19, T1b); + T13 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T14 = BYTW(&(W[TWVL * 14]), T13); + T15 = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T16 = BYTW(&(W[TWVL * 44]), T15); + T17 = VADD(T14, T16); + } + { + V T1j, T1k, T1d, T1g, T1h; + T1j = VSUB(T14, T16); + T1k = VSUB(T19, T1b); + T1l = VFMA(LDK(KP475528258), T1j, VMUL(LDK(KP293892626), T1k)); + T2v = VFNMS(LDK(KP475528258), T1k, VMUL(LDK(KP293892626), T1j)); + T1d = VMUL(LDK(KP559016994), VSUB(T17, T1c)); + T1g = VADD(T17, T1c); + T1h = VFNMS(LDK(KP250000000), T1g, T1f); + T1i = VADD(T1d, T1h); + T3e = VADD(T1f, T1g); + T2u = VSUB(T1h, T1d); + } + } + { + V Tg, T7, T9, Td, T2, T4, Tc, Tf; + Tf = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tg = BYTW(&(W[TWVL * 6]), Tf); + { + V T6, T8, T1, T3; + T6 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 26]), T6); + T8 = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 36]), T8); + Td = VADD(T7, T9); + T1 = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[TWVL * 16]), T1); + T3 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 46]), T3); + Tc = VADD(T2, T4); + } + { + V T5, Ta, Te, Th, Ti; + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VFMA(LDK(KP475528258), T5, VMUL(LDK(KP293892626), Ta)); + T2i = VFNMS(LDK(KP475528258), Ta, VMUL(LDK(KP293892626), T5)); + Te = VMUL(LDK(KP559016994), VSUB(Tc, Td)); + Th = VADD(Tc, Td); + Ti = VFNMS(LDK(KP250000000), Th, Tg); + Tj = VADD(Te, Ti); + T3b = VADD(Tg, Th); + T2h = VSUB(Ti, Te); + } + } + { + V TA, Tr, Tt, Tx, Tm, To, Tw, Tz; + Tz = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TA = BYTW(&(W[0]), Tz); + { + V Tq, Ts, Tl, Tn; + Tq = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tr = BYTW(&(W[TWVL * 20]), Tq); + Ts = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 30]), Ts); + Tx = VADD(Tr, Tt); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTW(&(W[TWVL * 10]), Tl); + Tn = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + To = BYTW(&(W[TWVL * 40]), Tn); + Tw = VADD(Tm, To); + } + { + V Tp, Tu, Ty, TB, TC; + Tp = VSUB(Tm, To); + Tu = VSUB(Tr, Tt); + Tv = VFMA(LDK(KP475528258), Tp, VMUL(LDK(KP293892626), Tu)); + T2k = VFNMS(LDK(KP475528258), Tu, VMUL(LDK(KP293892626), Tp)); + Ty = VMUL(LDK(KP559016994), VSUB(Tw, Tx)); + TB = VADD(Tw, Tx); + TC = VFNMS(LDK(KP250000000), TB, TA); + TD = VADD(Ty, TC); + T3a = VADD(TA, TB); + T2l = VSUB(TC, Ty); + } + } + { + V TV, TP, TR, TS, TK, TM, TN, TU; + TU = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TV = BYTW(&(W[TWVL * 2]), TU); + { + V TO, TQ, TJ, TL; + TO = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TP = BYTW(&(W[TWVL * 22]), TO); + TQ = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TR = BYTW(&(W[TWVL * 32]), TQ); + TS = VADD(TP, TR); + TJ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TK = BYTW(&(W[TWVL * 12]), TJ); + TL = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TM = BYTW(&(W[TWVL * 42]), TL); + TN = VADD(TK, TM); + } + { + V TZ, T10, TT, TW, TX; + TZ = VSUB(TK, TM); + T10 = VSUB(TP, TR); + T11 = VFMA(LDK(KP475528258), TZ, VMUL(LDK(KP293892626), T10)); + T2s = VFNMS(LDK(KP475528258), T10, VMUL(LDK(KP293892626), TZ)); + TT = VMUL(LDK(KP559016994), VSUB(TN, TS)); + TW = VADD(TN, TS); + TX = VFNMS(LDK(KP250000000), TW, TV); + TY = VADD(TT, TX); + T3d = VADD(TV, TW); + T2r = VSUB(TX, TT); + } + } + { + V T3g, T3o, T3k, T3l, T3j, T3m, T3p, T3n; + { + V T3c, T3f, T3h, T3i; + T3c = VSUB(T3a, T3b); + T3f = VSUB(T3d, T3e); + T3g = VBYI(VFMA(LDK(KP951056516), T3c, VMUL(LDK(KP587785252), T3f))); + T3o = VBYI(VFNMS(LDK(KP951056516), T3f, VMUL(LDK(KP587785252), T3c))); + T3k = VADD(T1A, T1B); + T3h = VADD(T3a, T3b); + T3i = VADD(T3d, T3e); + T3l = VADD(T3h, T3i); + T3j = VMUL(LDK(KP559016994), VSUB(T3h, T3i)); + T3m = VFNMS(LDK(KP250000000), T3l, T3k); + } + ST(&(x[0]), VADD(T3k, T3l), ms, &(x[0])); + T3p = VSUB(T3m, T3j); + ST(&(x[WS(rs, 10)]), VADD(T3o, T3p), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VSUB(T3p, T3o), ms, &(x[WS(rs, 1)])); + T3n = VADD(T3j, T3m); + ST(&(x[WS(rs, 5)]), VADD(T3g, T3n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VSUB(T3n, T3g), ms, &(x[0])); + } + { + V T2z, T2M, T2U, T2V, T2W, T34, T35, T36, T2X, T2Y, T2Z, T31, T32, T33, T2n; + V T2N, T2E, T2K, T2y, T2H, T2A, T2G, T38, T39; + T2z = VSUB(T1C, T1z); + T2M = VFNMS(LDK(KP951056516), T1R, T2L); + T2U = VFMA(LDK(KP1_369094211), T2k, VMUL(LDK(KP728968627), T2l)); + T2V = VFNMS(LDK(KP992114701), T2h, VMUL(LDK(KP250666467), T2i)); + T2W = VADD(T2U, T2V); + T34 = VFNMS(LDK(KP125581039), T2s, VMUL(LDK(KP998026728), T2r)); + T35 = VFMA(LDK(KP1_274847979), T2v, VMUL(LDK(KP770513242), T2u)); + T36 = VADD(T34, T35); + T2X = VFMA(LDK(KP1_996053456), T2s, VMUL(LDK(KP062790519), T2r)); + T2Y = VFNMS(LDK(KP637423989), T2u, VMUL(LDK(KP1_541026485), T2v)); + T2Z = VADD(T2X, T2Y); + T31 = VFNMS(LDK(KP1_457937254), T2k, VMUL(LDK(KP684547105), T2l)); + T32 = VFMA(LDK(KP1_984229402), T2i, VMUL(LDK(KP125333233), T2h)); + T33 = VADD(T31, T32); + { + V T2j, T2m, T2I, T2C, T2D, T2J; + T2j = VFNMS(LDK(KP851558583), T2i, VMUL(LDK(KP904827052), T2h)); + T2m = VFMA(LDK(KP1_752613360), T2k, VMUL(LDK(KP481753674), T2l)); + T2I = VADD(T2m, T2j); + T2C = VFMA(LDK(KP1_071653589), T2s, VMUL(LDK(KP844327925), T2r)); + T2D = VFMA(LDK(KP125581039), T2v, VMUL(LDK(KP998026728), T2u)); + T2J = VADD(T2C, T2D); + T2n = VSUB(T2j, T2m); + T2N = VADD(T2I, T2J); + T2E = VSUB(T2C, T2D); + T2K = VMUL(LDK(KP559016994), VSUB(T2I, T2J)); + } + { + V T2o, T2p, T2q, T2t, T2w, T2x; + T2o = VFNMS(LDK(KP963507348), T2k, VMUL(LDK(KP876306680), T2l)); + T2p = VFMA(LDK(KP1_809654104), T2i, VMUL(LDK(KP425779291), T2h)); + T2q = VSUB(T2o, T2p); + T2t = VFNMS(LDK(KP1_688655851), T2s, VMUL(LDK(KP535826794), T2r)); + T2w = VFNMS(LDK(KP1_996053456), T2v, VMUL(LDK(KP062790519), T2u)); + T2x = VADD(T2t, T2w); + T2y = VMUL(LDK(KP559016994), VSUB(T2q, T2x)); + T2H = VSUB(T2t, T2w); + T2A = VADD(T2q, T2x); + T2G = VADD(T2o, T2p); + } + { + V T2S, T2T, T30, T37; + T2S = VADD(T2z, T2A); + T2T = VBYI(VADD(T2M, T2N)); + ST(&(x[WS(rs, 23)]), VSUB(T2S, T2T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(T2S, T2T), ms, &(x[0])); + T30 = VADD(T2z, VADD(T2W, T2Z)); + T37 = VBYI(VSUB(VADD(T33, T36), T2M)); + ST(&(x[WS(rs, 22)]), VSUB(T30, T37), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(T30, T37), ms, &(x[WS(rs, 1)])); + } + T38 = VBYI(VSUB(VFMA(LDK(KP951056516), VSUB(T2U, T2V), VFMA(LDK(KP309016994), T33, VFNMS(LDK(KP809016994), T36, VMUL(LDK(KP587785252), VSUB(T2X, T2Y))))), T2M)); + T39 = VFMA(LDK(KP309016994), T2W, VFMA(LDK(KP951056516), VSUB(T32, T31), VFMA(LDK(KP587785252), VSUB(T35, T34), VFNMS(LDK(KP809016994), T2Z, T2z)))); + ST(&(x[WS(rs, 8)]), VADD(T38, T39), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VSUB(T39, T38), ms, &(x[WS(rs, 1)])); + { + V T2F, T2Q, T2P, T2R, T2B, T2O; + T2B = VFNMS(LDK(KP250000000), T2A, T2z); + T2F = VFMA(LDK(KP951056516), T2n, VADD(T2y, VFNMS(LDK(KP587785252), T2E, T2B))); + T2Q = VFMA(LDK(KP587785252), T2n, VFMA(LDK(KP951056516), T2E, VSUB(T2B, T2y))); + T2O = VFNMS(LDK(KP250000000), T2N, T2M); + T2P = VBYI(VADD(VFMA(LDK(KP951056516), T2G, VMUL(LDK(KP587785252), T2H)), VADD(T2K, T2O))); + T2R = VBYI(VADD(VFNMS(LDK(KP951056516), T2H, VMUL(LDK(KP587785252), T2G)), VSUB(T2O, T2K))); + ST(&(x[WS(rs, 18)]), VSUB(T2F, T2P), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T2Q, T2R), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VADD(T2F, T2P), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T2Q, T2R), ms, &(x[WS(rs, 1)])); + } + } + { + V T1D, T1T, T21, T22, T23, T2b, T2c, T2d, T24, T25, T26, T28, T29, T2a, TF; + V T1U, T1I, T1O, T1o, T1L, T1E, T1K, T2f, T2g; + T1D = VADD(T1z, T1C); + T1T = VADD(T1Q, T1S); + T21 = VFMA(LDK(KP1_688655851), Tv, VMUL(LDK(KP535826794), TD)); + T22 = VFMA(LDK(KP1_541026485), Tb, VMUL(LDK(KP637423989), Tj)); + T23 = VSUB(T21, T22); + T2b = VFMA(LDK(KP851558583), T11, VMUL(LDK(KP904827052), TY)); + T2c = VFMA(LDK(KP1_984229402), T1l, VMUL(LDK(KP125333233), T1i)); + T2d = VADD(T2b, T2c); + T24 = VFNMS(LDK(KP425779291), TY, VMUL(LDK(KP1_809654104), T11)); + T25 = VFNMS(LDK(KP992114701), T1i, VMUL(LDK(KP250666467), T1l)); + T26 = VADD(T24, T25); + T28 = VFNMS(LDK(KP1_071653589), Tv, VMUL(LDK(KP844327925), TD)); + T29 = VFNMS(LDK(KP770513242), Tj, VMUL(LDK(KP1_274847979), Tb)); + T2a = VADD(T28, T29); + { + V Tk, TE, T1M, T1G, T1H, T1N; + Tk = VFMA(LDK(KP1_071653589), Tb, VMUL(LDK(KP844327925), Tj)); + TE = VFMA(LDK(KP1_937166322), Tv, VMUL(LDK(KP248689887), TD)); + T1M = VADD(TE, Tk); + T1G = VFMA(LDK(KP1_752613360), T11, VMUL(LDK(KP481753674), TY)); + T1H = VFMA(LDK(KP1_457937254), T1l, VMUL(LDK(KP684547105), T1i)); + T1N = VADD(T1G, T1H); + TF = VSUB(Tk, TE); + T1U = VADD(T1M, T1N); + T1I = VSUB(T1G, T1H); + T1O = VMUL(LDK(KP559016994), VSUB(T1M, T1N)); + } + { + V TG, TH, TI, T12, T1m, T1n; + TG = VFNMS(LDK(KP497379774), Tv, VMUL(LDK(KP968583161), TD)); + TH = VFNMS(LDK(KP1_688655851), Tb, VMUL(LDK(KP535826794), Tj)); + TI = VADD(TG, TH); + T12 = VFNMS(LDK(KP963507348), T11, VMUL(LDK(KP876306680), TY)); + T1m = VFNMS(LDK(KP1_369094211), T1l, VMUL(LDK(KP728968627), T1i)); + T1n = VADD(T12, T1m); + T1o = VMUL(LDK(KP559016994), VSUB(TI, T1n)); + T1L = VSUB(T12, T1m); + T1E = VADD(TI, T1n); + T1K = VSUB(TG, TH); + } + { + V T1Z, T20, T27, T2e; + T1Z = VADD(T1D, T1E); + T20 = VBYI(VADD(T1T, T1U)); + ST(&(x[WS(rs, 24)]), VSUB(T1Z, T20), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T1Z, T20), ms, &(x[WS(rs, 1)])); + T27 = VADD(T1D, VADD(T23, T26)); + T2e = VBYI(VSUB(VADD(T2a, T2d), T1T)); + ST(&(x[WS(rs, 21)]), VSUB(T27, T2e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T27, T2e), ms, &(x[0])); + } + T2f = VBYI(VSUB(VFMA(LDK(KP309016994), T2a, VFMA(LDK(KP951056516), VADD(T21, T22), VFNMS(LDK(KP809016994), T2d, VMUL(LDK(KP587785252), VSUB(T24, T25))))), T1T)); + T2g = VFMA(LDK(KP951056516), VSUB(T29, T28), VFMA(LDK(KP309016994), T23, VFMA(LDK(KP587785252), VSUB(T2c, T2b), VFNMS(LDK(KP809016994), T26, T1D)))); + ST(&(x[WS(rs, 9)]), VADD(T2f, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VSUB(T2g, T2f), ms, &(x[0])); + { + V T1J, T1X, T1W, T1Y, T1F, T1V; + T1F = VFNMS(LDK(KP250000000), T1E, T1D); + T1J = VFMA(LDK(KP951056516), TF, VADD(T1o, VFNMS(LDK(KP587785252), T1I, T1F))); + T1X = VFMA(LDK(KP587785252), TF, VFMA(LDK(KP951056516), T1I, VSUB(T1F, T1o))); + T1V = VFNMS(LDK(KP250000000), T1U, T1T); + T1W = VBYI(VADD(VFMA(LDK(KP951056516), T1K, VMUL(LDK(KP587785252), T1L)), VADD(T1O, T1V))); + T1Y = VBYI(VADD(VFNMS(LDK(KP951056516), T1L, VMUL(LDK(KP587785252), T1K)), VSUB(T1V, T1O))); + ST(&(x[WS(rs, 19)]), VSUB(T1J, T1W), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T1X, T1Y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T1J, T1W), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1X, T1Y), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t2bv_25"), twinstr, &GENUS, {171, 111, 77, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_25) (planner *p) { + X(kdft_dit_register) (p, t2bv_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_32.c new file mode 100644 index 000000000..671ea0440 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_32.c @@ -0,0 +1,898 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:02 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t2bv_32 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 217 FP additions, 160 FP multiplications, + * (or, 119 additions, 62 multiplications, 98 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1z, T2o, T32, Tf, T1A, T2r, T3f, TC, T1D, T2O, T34, Tr, T1C, T2L; + V T33, T1k, T20, T2F, T3b, T1r, T21, T2C, T3a, TV, T1X, T2y, T38, T12, T1Y; + V T2v, T37; + { + V T1, T1y, T3, T1w, T1x, T2, T1v, T2m, T2n; + T1 = LD(&(x[0]), ms, &(x[0])); + T1x = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1y = BYTW(&(W[TWVL * 46]), T1x); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 30]), T2); + T1v = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1w = BYTW(&(W[TWVL * 14]), T1v); + T4 = VSUB(T1, T3); + T1z = VSUB(T1w, T1y); + T2m = VADD(T1, T3); + T2n = VADD(T1w, T1y); + T2o = VADD(T2m, T2n); + T32 = VSUB(T2m, T2n); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2p, T2q; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + T1A = VSUB(T9, Te); + T2p = VADD(T6, T8); + T2q = VADD(Tb, Td); + T2r = VADD(T2p, T2q); + T3f = VSUB(T2p, T2q); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 58]), Ts); + Tz = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 10]), Tz); + Tu = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tv = BYTW(&(W[TWVL * 26]), Tu); + Tx = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + Ty = BYTW(&(W[TWVL * 42]), Tx); + } + { + V Tw, TB, T2M, T2N; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFNMS(LDK(KP414213562), TB, Tw); + T1D = VFMA(LDK(KP414213562), Tw, TB); + T2M = VADD(Tt, Tv); + T2N = VADD(TA, Ty); + T2O = VADD(T2M, T2N); + T34 = VSUB(T2M, T2N); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2J, T2K; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFNMS(LDK(KP414213562), Tq, Tl); + T1C = VFMA(LDK(KP414213562), Tl, Tq); + T2J = VADD(Ti, Tk); + T2K = VADD(Tn, Tp); + T2L = VADD(T2J, T2K); + T33 = VSUB(T2J, T2K); + } + } + { + V T15, T17, T1o, T1m, T1f, T1h, T1i, T1a, T1c, T1d; + { + V T14, T16, T1n, T1l; + T14 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T15 = BYTW(&(W[TWVL * 60]), T14); + T16 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T17 = BYTW(&(W[TWVL * 28]), T16); + T1n = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1o = BYTW(&(W[TWVL * 12]), T1n); + T1l = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1m = BYTW(&(W[TWVL * 44]), T1l); + { + V T1e, T1g, T19, T1b; + T1e = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1f = BYTW(&(W[TWVL * 52]), T1e); + T1g = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1h = BYTW(&(W[TWVL * 20]), T1g); + T1i = VSUB(T1f, T1h); + T19 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1a = BYTW(&(W[TWVL * 4]), T19); + T1b = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1c = BYTW(&(W[TWVL * 36]), T1b); + T1d = VSUB(T1a, T1c); + } + } + { + V T18, T1j, T2D, T2E; + T18 = VSUB(T15, T17); + T1j = VADD(T1d, T1i); + T1k = VFMA(LDK(KP707106781), T1j, T18); + T20 = VFNMS(LDK(KP707106781), T1j, T18); + T2D = VADD(T1a, T1c); + T2E = VADD(T1f, T1h); + T2F = VADD(T2D, T2E); + T3b = VSUB(T2E, T2D); + } + { + V T1p, T1q, T2A, T2B; + T1p = VSUB(T1m, T1o); + T1q = VSUB(T1i, T1d); + T1r = VFMA(LDK(KP707106781), T1q, T1p); + T21 = VFNMS(LDK(KP707106781), T1q, T1p); + T2A = VADD(T15, T17); + T2B = VADD(T1o, T1m); + T2C = VADD(T2A, T2B); + T3a = VSUB(T2A, T2B); + } + } + { + V TG, TI, TZ, TX, TQ, TS, TT, TL, TN, TO; + { + V TF, TH, TY, TW; + TF = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TG = BYTW(&(W[0]), TF); + TH = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TI = BYTW(&(W[TWVL * 32]), TH); + TY = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + TZ = BYTW(&(W[TWVL * 48]), TY); + TW = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TX = BYTW(&(W[TWVL * 16]), TW); + { + V TP, TR, TK, TM; + TP = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TQ = BYTW(&(W[TWVL * 56]), TP); + TR = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TS = BYTW(&(W[TWVL * 24]), TR); + TT = VSUB(TQ, TS); + TK = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TL = BYTW(&(W[TWVL * 8]), TK); + TM = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TN = BYTW(&(W[TWVL * 40]), TM); + TO = VSUB(TL, TN); + } + } + { + V TJ, TU, T2w, T2x; + TJ = VSUB(TG, TI); + TU = VADD(TO, TT); + TV = VFMA(LDK(KP707106781), TU, TJ); + T1X = VFNMS(LDK(KP707106781), TU, TJ); + T2w = VADD(TL, TN); + T2x = VADD(TQ, TS); + T2y = VADD(T2w, T2x); + T38 = VSUB(T2w, T2x); + } + { + V T10, T11, T2t, T2u; + T10 = VSUB(TX, TZ); + T11 = VSUB(TO, TT); + T12 = VFMA(LDK(KP707106781), T11, T10); + T1Y = VFNMS(LDK(KP707106781), T11, T10); + T2t = VADD(TG, TI); + T2u = VADD(TX, TZ); + T2v = VADD(T2t, T2u); + T37 = VSUB(T2t, T2u); + } + } + { + V T2W, T30, T2Z, T31; + { + V T2U, T2V, T2X, T2Y; + T2U = VADD(T2o, T2r); + T2V = VADD(T2L, T2O); + T2W = VSUB(T2U, T2V); + T30 = VADD(T2U, T2V); + T2X = VADD(T2v, T2y); + T2Y = VADD(T2C, T2F); + T2Z = VSUB(T2X, T2Y); + T31 = VADD(T2X, T2Y); + } + ST(&(x[WS(rs, 24)]), VFNMSI(T2Z, T2W), ms, &(x[0])); + ST(&(x[0]), VADD(T30, T31), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T2Z, T2W), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T30, T31), ms, &(x[0])); + } + { + V T2s, T2P, T2H, T2Q, T2z, T2G; + T2s = VSUB(T2o, T2r); + T2P = VSUB(T2L, T2O); + T2z = VSUB(T2v, T2y); + T2G = VSUB(T2C, T2F); + T2H = VADD(T2z, T2G); + T2Q = VSUB(T2z, T2G); + { + V T2I, T2R, T2S, T2T; + T2I = VFNMS(LDK(KP707106781), T2H, T2s); + T2R = VFNMS(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 12)]), VFNMSI(T2R, T2I), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VFMAI(T2R, T2I), ms, &(x[0])); + T2S = VFMA(LDK(KP707106781), T2H, T2s); + T2T = VFMA(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 4)]), VFMAI(T2T, T2S), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VFNMSI(T2T, T2S), ms, &(x[0])); + } + } + { + V T36, T3o, T3h, T3r, T3d, T3s, T3k, T3p, T35, T3g; + T35 = VADD(T33, T34); + T36 = VFMA(LDK(KP707106781), T35, T32); + T3o = VFNMS(LDK(KP707106781), T35, T32); + T3g = VSUB(T33, T34); + T3h = VFMA(LDK(KP707106781), T3g, T3f); + T3r = VFNMS(LDK(KP707106781), T3g, T3f); + { + V T39, T3c, T3i, T3j; + T39 = VFNMS(LDK(KP414213562), T38, T37); + T3c = VFNMS(LDK(KP414213562), T3b, T3a); + T3d = VADD(T39, T3c); + T3s = VSUB(T39, T3c); + T3i = VFMA(LDK(KP414213562), T37, T38); + T3j = VFMA(LDK(KP414213562), T3a, T3b); + T3k = VSUB(T3i, T3j); + T3p = VADD(T3i, T3j); + } + { + V T3e, T3l, T3u, T3v; + T3e = VFNMS(LDK(KP923879532), T3d, T36); + T3l = VFNMS(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 14)]), VFNMSI(T3l, T3e), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3l, T3e), ms, &(x[0])); + T3u = VFMA(LDK(KP923879532), T3p, T3o); + T3v = VFNMS(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 6)]), VFNMSI(T3v, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3v, T3u), ms, &(x[0])); + } + { + V T3m, T3n, T3q, T3t; + T3m = VFMA(LDK(KP923879532), T3d, T36); + T3n = VFMA(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 30)]), VFNMSI(T3n, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3n, T3m), ms, &(x[0])); + T3q = VFNMS(LDK(KP923879532), T3p, T3o); + T3t = VFMA(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 10)]), VFMAI(T3t, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VFNMSI(T3t, T3q), ms, &(x[0])); + } + } + { + V TE, T1M, T1I, T1N, T1t, T1Q, T1F, T1P; + { + V Tg, TD, T1G, T1H; + Tg = VFMA(LDK(KP707106781), Tf, T4); + TD = VADD(Tr, TC); + TE = VFMA(LDK(KP923879532), TD, Tg); + T1M = VFNMS(LDK(KP923879532), TD, Tg); + T1G = VFMA(LDK(KP198912367), TV, T12); + T1H = VFMA(LDK(KP198912367), T1k, T1r); + T1I = VSUB(T1G, T1H); + T1N = VADD(T1G, T1H); + } + { + V T13, T1s, T1B, T1E; + T13 = VFNMS(LDK(KP198912367), T12, TV); + T1s = VFNMS(LDK(KP198912367), T1r, T1k); + T1t = VADD(T13, T1s); + T1Q = VSUB(T13, T1s); + T1B = VFMA(LDK(KP707106781), T1A, T1z); + T1E = VSUB(T1C, T1D); + T1F = VFMA(LDK(KP923879532), T1E, T1B); + T1P = VFNMS(LDK(KP923879532), T1E, T1B); + } + { + V T1u, T1J, T1S, T1T; + T1u = VFNMS(LDK(KP980785280), T1t, TE); + T1J = VFNMS(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 15)]), VFNMSI(T1J, T1u), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VFMAI(T1J, T1u), ms, &(x[WS(rs, 1)])); + T1S = VFMA(LDK(KP980785280), T1N, T1M); + T1T = VFNMS(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 7)]), VFNMSI(T1T, T1S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFMAI(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VFMA(LDK(KP980785280), T1t, TE); + T1L = VFMA(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 31)]), VFNMSI(T1L, T1K), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T1L, T1K), ms, &(x[WS(rs, 1)])); + T1O = VFNMS(LDK(KP980785280), T1N, T1M); + T1R = VFMA(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 9)]), VFMAI(T1R, T1O), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VFNMSI(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2e, T2a, T2f, T23, T2i, T27, T2h; + { + V T1U, T1V, T28, T29; + T1U = VFNMS(LDK(KP707106781), Tf, T4); + T1V = VADD(T1C, T1D); + T1W = VFMA(LDK(KP923879532), T1V, T1U); + T2e = VFNMS(LDK(KP923879532), T1V, T1U); + T28 = VFNMS(LDK(KP668178637), T1X, T1Y); + T29 = VFNMS(LDK(KP668178637), T20, T21); + T2a = VSUB(T28, T29); + T2f = VADD(T28, T29); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP668178637), T1Y, T1X); + T22 = VFMA(LDK(KP668178637), T21, T20); + T23 = VADD(T1Z, T22); + T2i = VSUB(T1Z, T22); + T25 = VFNMS(LDK(KP707106781), T1A, T1z); + T26 = VSUB(Tr, TC); + T27 = VFNMS(LDK(KP923879532), T26, T25); + T2h = VFMA(LDK(KP923879532), T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VFNMS(LDK(KP831469612), T23, T1W); + T2b = VFNMS(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 19)]), VFNMSI(T2b, T24), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T2b, T24), ms, &(x[WS(rs, 1)])); + T2k = VFNMS(LDK(KP831469612), T2f, T2e); + T2l = VFMA(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 5)]), VFMAI(T2l, T2k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFNMSI(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VFMA(LDK(KP831469612), T23, T1W); + T2d = VFMA(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 3)]), VFNMSI(T2d, T2c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VFMAI(T2d, T2c), ms, &(x[WS(rs, 1)])); + T2g = VFMA(LDK(KP831469612), T2f, T2e); + T2j = VFNMS(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 11)]), VFNMSI(T2j, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VFMAI(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t2bv_32"), twinstr, &GENUS, {119, 62, 98, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_32) (planner *p) { + X(kdft_dit_register) (p, t2bv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t2bv_32 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 217 FP additions, 104 FP multiplications, + * (or, 201 additions, 88 multiplications, 16 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1D, T2P, T3h, Tf, T1y, T2K, T3i, TC, T1w, T2G, T3e, Tr, T1v, T2D; + V T3d, T1k, T20, T2y, T3a, T1r, T21, T2v, T39, TV, T1X, T2r, T37, T12, T1Y; + V T2o, T36; + { + V T1, T1C, T3, T1A, T1B, T2, T1z, T2N, T2O; + T1 = LD(&(x[0]), ms, &(x[0])); + T1B = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1C = BYTW(&(W[TWVL * 46]), T1B); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 30]), T2); + T1z = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1A = BYTW(&(W[TWVL * 14]), T1z); + T4 = VSUB(T1, T3); + T1D = VSUB(T1A, T1C); + T2N = VADD(T1, T3); + T2O = VADD(T1A, T1C); + T2P = VSUB(T2N, T2O); + T3h = VADD(T2N, T2O); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2I, T2J; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + T1y = VMUL(LDK(KP707106781), VSUB(T9, Te)); + T2I = VADD(T6, T8); + T2J = VADD(Tb, Td); + T2K = VSUB(T2I, T2J); + T3i = VADD(T2I, T2J); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 10]), Ts); + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 26]), Tz); + Tu = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + Tv = BYTW(&(W[TWVL * 42]), Tu); + Tx = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Ty = BYTW(&(W[TWVL * 58]), Tx); + } + { + V Tw, TB, T2E, T2F; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFNMS(LDK(KP382683432), TB, VMUL(LDK(KP923879532), Tw)); + T1w = VFMA(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T2E = VADD(Ty, TA); + T2F = VADD(Tt, Tv); + T2G = VSUB(T2E, T2F); + T3e = VADD(T2E, T2F); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2B, T2C; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + T1v = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + T2B = VADD(Ti, Tk); + T2C = VADD(Tn, Tp); + T2D = VSUB(T2B, T2C); + T3d = VADD(T2B, T2C); + } + } + { + V T1g, T1i, T1o, T1m, T1a, T1c, T1d, T15, T17, T18; + { + V T1f, T1h, T1n, T1l; + T1f = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1g = BYTW(&(W[TWVL * 12]), T1f); + T1h = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1i = BYTW(&(W[TWVL * 44]), T1h); + T1n = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1o = BYTW(&(W[TWVL * 28]), T1n); + T1l = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T1m = BYTW(&(W[TWVL * 60]), T1l); + { + V T19, T1b, T14, T16; + T19 = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1a = BYTW(&(W[TWVL * 52]), T19); + T1b = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1c = BYTW(&(W[TWVL * 20]), T1b); + T1d = VSUB(T1a, T1c); + T14 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T15 = BYTW(&(W[TWVL * 4]), T14); + T16 = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T17 = BYTW(&(W[TWVL * 36]), T16); + T18 = VSUB(T15, T17); + } + } + { + V T1e, T1j, T2w, T2x; + T1e = VMUL(LDK(KP707106781), VSUB(T18, T1d)); + T1j = VSUB(T1g, T1i); + T1k = VSUB(T1e, T1j); + T20 = VADD(T1j, T1e); + T2w = VADD(T15, T17); + T2x = VADD(T1a, T1c); + T2y = VSUB(T2w, T2x); + T3a = VADD(T2w, T2x); + } + { + V T1p, T1q, T2t, T2u; + T1p = VSUB(T1m, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T18, T1d)); + T1r = VSUB(T1p, T1q); + T21 = VADD(T1p, T1q); + T2t = VADD(T1m, T1o); + T2u = VADD(T1g, T1i); + T2v = VSUB(T2t, T2u); + T39 = VADD(T2t, T2u); + } + } + { + V TR, TT, TZ, TX, TL, TN, TO, TG, TI, TJ; + { + V TQ, TS, TY, TW; + TQ = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TR = BYTW(&(W[TWVL * 16]), TQ); + TS = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + TT = BYTW(&(W[TWVL * 48]), TS); + TY = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TZ = BYTW(&(W[TWVL * 32]), TY); + TW = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TX = BYTW(&(W[0]), TW); + { + V TK, TM, TF, TH; + TK = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TL = BYTW(&(W[TWVL * 56]), TK); + TM = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TN = BYTW(&(W[TWVL * 24]), TM); + TO = VSUB(TL, TN); + TF = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TG = BYTW(&(W[TWVL * 8]), TF); + TH = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TI = BYTW(&(W[TWVL * 40]), TH); + TJ = VSUB(TG, TI); + } + } + { + V TP, TU, T2p, T2q; + TP = VMUL(LDK(KP707106781), VSUB(TJ, TO)); + TU = VSUB(TR, TT); + TV = VSUB(TP, TU); + T1X = VADD(TU, TP); + T2p = VADD(TG, TI); + T2q = VADD(TL, TN); + T2r = VSUB(T2p, T2q); + T37 = VADD(T2p, T2q); + } + { + V T10, T11, T2m, T2n; + T10 = VSUB(TX, TZ); + T11 = VMUL(LDK(KP707106781), VADD(TJ, TO)); + T12 = VSUB(T10, T11); + T1Y = VADD(T10, T11); + T2m = VADD(TX, TZ); + T2n = VADD(TR, TT); + T2o = VSUB(T2m, T2n); + T36 = VADD(T2m, T2n); + } + } + { + V T3q, T3u, T3t, T3v; + { + V T3o, T3p, T3r, T3s; + T3o = VADD(T3h, T3i); + T3p = VADD(T3d, T3e); + T3q = VSUB(T3o, T3p); + T3u = VADD(T3o, T3p); + T3r = VADD(T36, T37); + T3s = VADD(T39, T3a); + T3t = VBYI(VSUB(T3r, T3s)); + T3v = VADD(T3r, T3s); + } + ST(&(x[WS(rs, 24)]), VSUB(T3q, T3t), ms, &(x[0])); + ST(&(x[0]), VADD(T3u, T3v), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T3q, T3t), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T3u, T3v), ms, &(x[0])); + } + { + V T3f, T3j, T3c, T3k, T38, T3b; + T3f = VSUB(T3d, T3e); + T3j = VSUB(T3h, T3i); + T38 = VSUB(T36, T37); + T3b = VSUB(T39, T3a); + T3c = VMUL(LDK(KP707106781), VSUB(T38, T3b)); + T3k = VMUL(LDK(KP707106781), VADD(T38, T3b)); + { + V T3g, T3l, T3m, T3n; + T3g = VBYI(VSUB(T3c, T3f)); + T3l = VSUB(T3j, T3k); + ST(&(x[WS(rs, 12)]), VADD(T3g, T3l), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VSUB(T3l, T3g), ms, &(x[0])); + T3m = VBYI(VADD(T3f, T3c)); + T3n = VADD(T3j, T3k); + ST(&(x[WS(rs, 4)]), VADD(T3m, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VSUB(T3n, T3m), ms, &(x[0])); + } + } + { + V T2L, T31, T2R, T2Y, T2A, T2Z, T2U, T32, T2H, T2Q; + T2H = VMUL(LDK(KP707106781), VSUB(T2D, T2G)); + T2L = VSUB(T2H, T2K); + T31 = VADD(T2K, T2H); + T2Q = VMUL(LDK(KP707106781), VADD(T2D, T2G)); + T2R = VSUB(T2P, T2Q); + T2Y = VADD(T2P, T2Q); + { + V T2s, T2z, T2S, T2T; + T2s = VFNMS(LDK(KP382683432), T2r, VMUL(LDK(KP923879532), T2o)); + T2z = VFMA(LDK(KP923879532), T2v, VMUL(LDK(KP382683432), T2y)); + T2A = VSUB(T2s, T2z); + T2Z = VADD(T2s, T2z); + T2S = VFMA(LDK(KP382683432), T2o, VMUL(LDK(KP923879532), T2r)); + T2T = VFNMS(LDK(KP382683432), T2v, VMUL(LDK(KP923879532), T2y)); + T2U = VSUB(T2S, T2T); + T32 = VADD(T2S, T2T); + } + { + V T2M, T2V, T34, T35; + T2M = VBYI(VSUB(T2A, T2L)); + T2V = VSUB(T2R, T2U); + ST(&(x[WS(rs, 10)]), VADD(T2M, T2V), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VSUB(T2V, T2M), ms, &(x[0])); + T34 = VSUB(T2Y, T2Z); + T35 = VBYI(VSUB(T32, T31)); + ST(&(x[WS(rs, 18)]), VSUB(T34, T35), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T34, T35), ms, &(x[0])); + } + { + V T2W, T2X, T30, T33; + T2W = VBYI(VADD(T2L, T2A)); + T2X = VADD(T2R, T2U); + ST(&(x[WS(rs, 6)]), VADD(T2W, T2X), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VSUB(T2X, T2W), ms, &(x[0])); + T30 = VADD(T2Y, T2Z); + T33 = VBYI(VADD(T31, T32)); + ST(&(x[WS(rs, 30)]), VSUB(T30, T33), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T30, T33), ms, &(x[0])); + } + } + { + V TE, T1P, T1I, T1Q, T1t, T1M, T1F, T1N; + { + V Tg, TD, T1G, T1H; + Tg = VSUB(T4, Tf); + TD = VSUB(Tr, TC); + TE = VSUB(Tg, TD); + T1P = VADD(Tg, TD); + T1G = VFNMS(LDK(KP555570233), TV, VMUL(LDK(KP831469612), T12)); + T1H = VFMA(LDK(KP555570233), T1k, VMUL(LDK(KP831469612), T1r)); + T1I = VSUB(T1G, T1H); + T1Q = VADD(T1G, T1H); + } + { + V T13, T1s, T1x, T1E; + T13 = VFMA(LDK(KP831469612), TV, VMUL(LDK(KP555570233), T12)); + T1s = VFNMS(LDK(KP555570233), T1r, VMUL(LDK(KP831469612), T1k)); + T1t = VSUB(T13, T1s); + T1M = VADD(T13, T1s); + T1x = VSUB(T1v, T1w); + T1E = VSUB(T1y, T1D); + T1F = VSUB(T1x, T1E); + T1N = VADD(T1E, T1x); + } + { + V T1u, T1J, T1S, T1T; + T1u = VADD(TE, T1t); + T1J = VBYI(VADD(T1F, T1I)); + ST(&(x[WS(rs, 27)]), VSUB(T1u, T1J), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1u, T1J), ms, &(x[WS(rs, 1)])); + T1S = VBYI(VADD(T1N, T1M)); + T1T = VADD(T1P, T1Q); + ST(&(x[WS(rs, 3)]), VADD(T1S, T1T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VSUB(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VSUB(TE, T1t); + T1L = VBYI(VSUB(T1I, T1F)); + ST(&(x[WS(rs, 21)]), VSUB(T1K, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T1K, T1L), ms, &(x[WS(rs, 1)])); + T1O = VBYI(VSUB(T1M, T1N)); + T1R = VSUB(T1P, T1Q); + ST(&(x[WS(rs, 13)]), VADD(T1O, T1R), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VSUB(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2h, T2a, T2i, T23, T2e, T27, T2f; + { + V T1U, T1V, T28, T29; + T1U = VADD(T4, Tf); + T1V = VADD(T1v, T1w); + T1W = VSUB(T1U, T1V); + T2h = VADD(T1U, T1V); + T28 = VFNMS(LDK(KP195090322), T1X, VMUL(LDK(KP980785280), T1Y)); + T29 = VFMA(LDK(KP195090322), T20, VMUL(LDK(KP980785280), T21)); + T2a = VSUB(T28, T29); + T2i = VADD(T28, T29); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP980785280), T1X, VMUL(LDK(KP195090322), T1Y)); + T22 = VFNMS(LDK(KP195090322), T21, VMUL(LDK(KP980785280), T20)); + T23 = VSUB(T1Z, T22); + T2e = VADD(T1Z, T22); + T25 = VADD(Tr, TC); + T26 = VADD(T1D, T1y); + T27 = VSUB(T25, T26); + T2f = VADD(T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VADD(T1W, T23); + T2b = VBYI(VADD(T27, T2a)); + ST(&(x[WS(rs, 25)]), VSUB(T24, T2b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T24, T2b), ms, &(x[WS(rs, 1)])); + T2k = VBYI(VADD(T2f, T2e)); + T2l = VADD(T2h, T2i); + ST(&(x[WS(rs, 1)]), VADD(T2k, T2l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VSUB(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VSUB(T1W, T23); + T2d = VBYI(VSUB(T2a, T27)); + ST(&(x[WS(rs, 23)]), VSUB(T2c, T2d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T2c, T2d), ms, &(x[WS(rs, 1)])); + T2g = VBYI(VSUB(T2e, T2f)); + T2j = VSUB(T2h, T2i); + ST(&(x[WS(rs, 15)]), VADD(T2g, T2j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VSUB(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t2bv_32"), twinstr, &GENUS, {201, 88, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_32) (planner *p) { + X(kdft_dit_register) (p, t2bv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_4.c new file mode 100644 index 000000000..ab9cbaade --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_4.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:01 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t2bv_4 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 11 FP additions, 8 FP multiplications, + * (or, 9 additions, 6 multiplications, 2 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VSUB(T6, T8); + ST(&(x[WS(rs, 3)]), VFNMSI(T9, T4), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T9, T4), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t2bv_4"), twinstr, &GENUS, {9, 6, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_4) (planner *p) { + X(kdft_dit_register) (p, t2bv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t2bv_4 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 11 FP additions, 6 FP multiplications, + * (or, 11 additions, 6 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VBYI(VSUB(T6, T8)); + ST(&(x[WS(rs, 3)]), VSUB(T4, T9), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T4, T9), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t2bv_4"), twinstr, &GENUS, {11, 6, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_4) (planner *p) { + X(kdft_dit_register) (p, t2bv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_5.c new file mode 100644 index 000000000..8eac6a975 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_5.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:05 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t2bv_5 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 20 FP additions, 19 FP multiplications, + * (or, 11 additions, 10 multiplications, 9 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, Tg, Th, T6, Tb, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, Ta, T5, T8; + { + V T2, T9, T4, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTW(&(W[0]), T2); + T9 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ta = BYTW(&(W[TWVL * 4]), T9); + T4 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T5 = BYTW(&(W[TWVL * 6]), T4); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 2]), T7); + } + Tg = VSUB(T3, T5); + Th = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tb = VADD(T8, Ta); + Tc = VADD(T6, Tb); + } + ST(&(x[0]), VADD(T1, Tc), ms, &(x[0])); + { + V Ti, Tk, Tf, Tj, Td, Te; + Ti = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Th, Tg)); + Tk = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tg, Th)); + Td = VFNMS(LDK(KP250000000), Tc, T1); + Te = VSUB(T6, Tb); + Tf = VFMA(LDK(KP559016994), Te, Td); + Tj = VFNMS(LDK(KP559016994), Te, Td); + ST(&(x[WS(rs, 1)]), VFMAI(Ti, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFNMSI(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFNMSI(Tk, Tj), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t2bv_5"), twinstr, &GENUS, {11, 10, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_5) (planner *p) { + X(kdft_dit_register) (p, t2bv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t2bv_5 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 20 FP additions, 14 FP multiplications, + * (or, 17 additions, 11 multiplications, 3 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V Tf, T5, Ta, Tc, Td, Tg; + Tf = LD(&(x[0]), ms, &(x[0])); + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = BYTW(&(W[TWVL * 6]), T3); + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTW(&(W[TWVL * 2]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tc = VADD(T2, T4); + Td = VADD(T7, T9); + Tg = VADD(Tc, Td); + } + ST(&(x[0]), VADD(Tf, Tg), ms, &(x[0])); + { + V Tb, Tj, Ti, Tk, Te, Th; + Tb = VBYI(VFMA(LDK(KP951056516), T5, VMUL(LDK(KP587785252), Ta))); + Tj = VBYI(VFNMS(LDK(KP951056516), Ta, VMUL(LDK(KP587785252), T5))); + Te = VMUL(LDK(KP559016994), VSUB(Tc, Td)); + Th = VFNMS(LDK(KP250000000), Tg, Tf); + Ti = VADD(Te, Th); + Tk = VSUB(Th, Te); + ST(&(x[WS(rs, 1)]), VADD(Tb, Ti), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VSUB(Ti, Tb), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tj, Tk), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t2bv_5"), twinstr, &GENUS, {17, 11, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_5) (planner *p) { + X(kdft_dit_register) (p, t2bv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_64.c new file mode 100644 index 000000000..095a1ef5f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_64.c @@ -0,0 +1,1948 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:04 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t2bv_64 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 519 FP additions, 384 FP multiplications, + * (or, 261 additions, 126 multiplications, 258 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Ta, T3U, T6l, T7B, T37, T3V, T58, T7a, T1v, T24, T43, T4F, T5F, T7l, T5Q; + V T7o, T2i, T2R, T4a, T4I, T60, T7s, T6b, T7v, T4k, T4l, T4C, T5x, T7g, T1i; + V T3b, T5u, T7h, T4h, T4i, T4B, T5o, T7d, TV, T3a, T5l, T7e, T3X, T3Y, Tx; + V T38, T5f, T7C, T6o, T7b, T1S, T25, T5T, T7m, T46, T4G, T5M, T7p, T2F, T2S; + V T6e, T7t, T4d, T4J, T67, T7w; + { + V T1, T3, T8, T6, T33, T35, T56, T2Y, T30, T55, T2, T7, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 62]), T2); + T7 = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 94]), T7); + T5 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 30]), T5); + { + V T32, T34, T2X, T2Z; + T32 = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + T33 = BYTW(&(W[TWVL * 110]), T32); + T34 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T35 = BYTW(&(W[TWVL * 46]), T34); + T56 = VSUB(T33, T35); + T2X = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T2Y = BYTW(&(W[TWVL * 14]), T2X); + T2Z = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T30 = BYTW(&(W[TWVL * 78]), T2Z); + T55 = VSUB(T2Y, T30); + } + { + V T4, T9, T6j, T6k; + T4 = VADD(T1, T3); + T9 = VADD(T6, T8); + Ta = VSUB(T4, T9); + T3U = VADD(T4, T9); + T6j = VSUB(T6, T8); + T6k = VSUB(T55, T56); + T6l = VFMA(LDK(KP707106781), T6k, T6j); + T7B = VFNMS(LDK(KP707106781), T6k, T6j); + } + { + V T31, T36, T54, T57; + T31 = VADD(T2Y, T30); + T36 = VADD(T33, T35); + T37 = VSUB(T31, T36); + T3V = VADD(T31, T36); + T54 = VSUB(T1, T3); + T57 = VADD(T55, T56); + T58 = VFMA(LDK(KP707106781), T57, T54); + T7a = VFNMS(LDK(KP707106781), T57, T54); + } + } + { + V T1m, T1o, T1p, T1r, T1t, T1u, T1Y, T5C, T23, T5D, T41, T42; + { + V T1l, T1n, T1q, T1s; + T1l = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T1m = BYTW(&(W[0]), T1l); + T1n = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T1o = BYTW(&(W[TWVL * 64]), T1n); + T1p = VADD(T1m, T1o); + T1q = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1r = BYTW(&(W[TWVL * 32]), T1q); + T1s = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T1t = BYTW(&(W[TWVL * 96]), T1s); + T1u = VADD(T1r, T1t); + } + { + V T1V, T1X, T1U, T1W; + T1U = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1V = BYTW(&(W[TWVL * 16]), T1U); + T1W = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T1X = BYTW(&(W[TWVL * 80]), T1W); + T1Y = VADD(T1V, T1X); + T5C = VSUB(T1V, T1X); + } + { + V T20, T22, T1Z, T21; + T1Z = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T20 = BYTW(&(W[TWVL * 112]), T1Z); + T21 = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T22 = BYTW(&(W[TWVL * 48]), T21); + T23 = VADD(T20, T22); + T5D = VSUB(T20, T22); + } + T1v = VSUB(T1p, T1u); + T24 = VSUB(T1Y, T23); + T41 = VADD(T1p, T1u); + T42 = VADD(T1Y, T23); + T43 = VADD(T41, T42); + T4F = VSUB(T41, T42); + { + V T5B, T5E, T5O, T5P; + T5B = VSUB(T1m, T1o); + T5E = VADD(T5C, T5D); + T5F = VFMA(LDK(KP707106781), T5E, T5B); + T7l = VFNMS(LDK(KP707106781), T5E, T5B); + T5O = VSUB(T1r, T1t); + T5P = VSUB(T5C, T5D); + T5Q = VFMA(LDK(KP707106781), T5P, T5O); + T7o = VFNMS(LDK(KP707106781), T5P, T5O); + } + } + { + V T29, T2b, T2c, T2e, T2g, T2h, T2L, T5Y, T2Q, T5X, T48, T49; + { + V T28, T2a, T2d, T2f; + T28 = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T29 = BYTW(&(W[TWVL * 124]), T28); + T2a = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T2b = BYTW(&(W[TWVL * 60]), T2a); + T2c = VADD(T29, T2b); + T2d = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2e = BYTW(&(W[TWVL * 28]), T2d); + T2f = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T2g = BYTW(&(W[TWVL * 92]), T2f); + T2h = VADD(T2e, T2g); + } + { + V T2I, T2K, T2H, T2J; + T2H = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2I = BYTW(&(W[TWVL * 108]), T2H); + T2J = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2K = BYTW(&(W[TWVL * 44]), T2J); + T2L = VADD(T2I, T2K); + T5Y = VSUB(T2I, T2K); + } + { + V T2N, T2P, T2M, T2O; + T2M = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2N = BYTW(&(W[TWVL * 12]), T2M); + T2O = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2P = BYTW(&(W[TWVL * 76]), T2O); + T2Q = VADD(T2N, T2P); + T5X = VSUB(T2N, T2P); + } + T2i = VSUB(T2c, T2h); + T2R = VSUB(T2L, T2Q); + T48 = VADD(T2c, T2h); + T49 = VADD(T2Q, T2L); + T4a = VADD(T48, T49); + T4I = VSUB(T48, T49); + { + V T5W, T5Z, T69, T6a; + T5W = VSUB(T29, T2b); + T5Z = VADD(T5X, T5Y); + T60 = VFMA(LDK(KP707106781), T5Z, T5W); + T7s = VFNMS(LDK(KP707106781), T5Z, T5W); + T69 = VSUB(T2g, T2e); + T6a = VSUB(T5Y, T5X); + T6b = VFMA(LDK(KP707106781), T6a, T69); + T7v = VFNMS(LDK(KP707106781), T6a, T69); + } + } + { + V TX, TZ, T10, T12, T14, T15, T1b, T5s, T1g, T5r, T5v, T5w; + { + V TW, TY, T11, T13; + TW = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + TX = BYTW(&(W[TWVL * 122]), TW); + TY = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TZ = BYTW(&(W[TWVL * 58]), TY); + T10 = VADD(TX, TZ); + T11 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T12 = BYTW(&(W[TWVL * 26]), T11); + T13 = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T14 = BYTW(&(W[TWVL * 90]), T13); + T15 = VADD(T12, T14); + } + { + V T18, T1a, T17, T19; + T17 = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + T18 = BYTW(&(W[TWVL * 106]), T17); + T19 = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1a = BYTW(&(W[TWVL * 42]), T19); + T1b = VADD(T18, T1a); + T5s = VSUB(T18, T1a); + } + { + V T1d, T1f, T1c, T1e; + T1c = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T1d = BYTW(&(W[TWVL * 10]), T1c); + T1e = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + T1f = BYTW(&(W[TWVL * 74]), T1e); + T1g = VADD(T1d, T1f); + T5r = VSUB(T1d, T1f); + } + T4k = VADD(T10, T15); + T4l = VADD(T1g, T1b); + T4C = VSUB(T4k, T4l); + T5v = VSUB(T14, T12); + T5w = VSUB(T5s, T5r); + T5x = VFMA(LDK(KP707106781), T5w, T5v); + T7g = VFNMS(LDK(KP707106781), T5w, T5v); + { + V T16, T1h, T5q, T5t; + T16 = VSUB(T10, T15); + T1h = VSUB(T1b, T1g); + T1i = VFNMS(LDK(KP414213562), T1h, T16); + T3b = VFMA(LDK(KP414213562), T16, T1h); + T5q = VSUB(TX, TZ); + T5t = VADD(T5r, T5s); + T5u = VFMA(LDK(KP707106781), T5t, T5q); + T7h = VFNMS(LDK(KP707106781), T5t, T5q); + } + } + { + V TA, TC, TD, TF, TH, TI, TO, T5i, TT, T5j, T5m, T5n; + { + V Tz, TB, TE, TG; + Tz = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 2]), Tz); + TB = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + TC = BYTW(&(W[TWVL * 66]), TB); + TD = VADD(TA, TC); + TE = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + TF = BYTW(&(W[TWVL * 34]), TE); + TG = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + TH = BYTW(&(W[TWVL * 98]), TG); + TI = VADD(TF, TH); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TL = BYTW(&(W[TWVL * 18]), TK); + TM = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + TN = BYTW(&(W[TWVL * 82]), TM); + TO = VADD(TL, TN); + T5i = VSUB(TL, TN); + } + { + V TQ, TS, TP, TR; + TP = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + TQ = BYTW(&(W[TWVL * 114]), TP); + TR = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TS = BYTW(&(W[TWVL * 50]), TR); + TT = VADD(TQ, TS); + T5j = VSUB(TQ, TS); + } + T4h = VADD(TD, TI); + T4i = VADD(TO, TT); + T4B = VSUB(T4h, T4i); + T5m = VSUB(TF, TH); + T5n = VSUB(T5i, T5j); + T5o = VFMA(LDK(KP707106781), T5n, T5m); + T7d = VFNMS(LDK(KP707106781), T5n, T5m); + { + V TJ, TU, T5h, T5k; + TJ = VSUB(TD, TI); + TU = VSUB(TO, TT); + TV = VFNMS(LDK(KP414213562), TU, TJ); + T3a = VFMA(LDK(KP414213562), TJ, TU); + T5h = VSUB(TA, TC); + T5k = VADD(T5i, T5j); + T5l = VFMA(LDK(KP707106781), T5k, T5h); + T7e = VFNMS(LDK(KP707106781), T5k, T5h); + } + } + { + V Tf, T59, Tv, T5d, Tk, T5a, Tq, T5c, Tl, Tw; + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tc = BYTW(&(W[TWVL * 6]), Tb); + Td = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Te = BYTW(&(W[TWVL * 70]), Td); + Tf = VADD(Tc, Te); + T59 = VSUB(Tc, Te); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Ts = BYTW(&(W[TWVL * 22]), Tr); + Tt = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + Tu = BYTW(&(W[TWVL * 86]), Tt); + Tv = VADD(Ts, Tu); + T5d = VSUB(Tu, Ts); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Th = BYTW(&(W[TWVL * 38]), Tg); + Ti = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tj = BYTW(&(W[TWVL * 102]), Ti); + Tk = VADD(Th, Tj); + T5a = VSUB(Th, Tj); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 118]), Tm); + To = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 54]), To); + Tq = VADD(Tn, Tp); + T5c = VSUB(Tn, Tp); + } + T3X = VADD(Tf, Tk); + T3Y = VADD(Tq, Tv); + Tl = VSUB(Tf, Tk); + Tw = VSUB(Tq, Tv); + Tx = VADD(Tl, Tw); + T38 = VSUB(Tl, Tw); + { + V T5b, T5e, T6m, T6n; + T5b = VFNMS(LDK(KP414213562), T5a, T59); + T5e = VFNMS(LDK(KP414213562), T5d, T5c); + T5f = VADD(T5b, T5e); + T7C = VSUB(T5b, T5e); + T6m = VFMA(LDK(KP414213562), T59, T5a); + T6n = VFMA(LDK(KP414213562), T5c, T5d); + T6o = VSUB(T6m, T6n); + T7b = VADD(T6m, T6n); + } + } + { + V T1A, T5G, T1Q, T5K, T1F, T5H, T1L, T5J; + { + V T1x, T1z, T1w, T1y; + T1w = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1x = BYTW(&(W[TWVL * 8]), T1w); + T1y = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1z = BYTW(&(W[TWVL * 72]), T1y); + T1A = VADD(T1x, T1z); + T5G = VSUB(T1x, T1z); + } + { + V T1N, T1P, T1M, T1O; + T1M = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1N = BYTW(&(W[TWVL * 24]), T1M); + T1O = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1P = BYTW(&(W[TWVL * 88]), T1O); + T1Q = VADD(T1N, T1P); + T5K = VSUB(T1N, T1P); + } + { + V T1C, T1E, T1B, T1D; + T1B = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1C = BYTW(&(W[TWVL * 40]), T1B); + T1D = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1E = BYTW(&(W[TWVL * 104]), T1D); + T1F = VADD(T1C, T1E); + T5H = VSUB(T1C, T1E); + } + { + V T1I, T1K, T1H, T1J; + T1H = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1I = BYTW(&(W[TWVL * 120]), T1H); + T1J = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1K = BYTW(&(W[TWVL * 56]), T1J); + T1L = VADD(T1I, T1K); + T5J = VSUB(T1I, T1K); + } + { + V T1G, T1R, T5R, T5S; + T1G = VSUB(T1A, T1F); + T1R = VSUB(T1L, T1Q); + T1S = VADD(T1G, T1R); + T25 = VSUB(T1G, T1R); + T5R = VFMA(LDK(KP414213562), T5G, T5H); + T5S = VFNMS(LDK(KP414213562), T5J, T5K); + T5T = VADD(T5R, T5S); + T7m = VSUB(T5R, T5S); + } + { + V T44, T45, T5I, T5L; + T44 = VADD(T1A, T1F); + T45 = VADD(T1L, T1Q); + T46 = VADD(T44, T45); + T4G = VSUB(T44, T45); + T5I = VFNMS(LDK(KP414213562), T5H, T5G); + T5L = VFMA(LDK(KP414213562), T5K, T5J); + T5M = VADD(T5I, T5L); + T7p = VSUB(T5I, T5L); + } + } + { + V T2n, T61, T2D, T65, T2s, T62, T2y, T64; + { + V T2k, T2m, T2j, T2l; + T2j = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2k = BYTW(&(W[TWVL * 4]), T2j); + T2l = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2m = BYTW(&(W[TWVL * 68]), T2l); + T2n = VADD(T2k, T2m); + T61 = VSUB(T2k, T2m); + } + { + V T2A, T2C, T2z, T2B; + T2z = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2A = BYTW(&(W[TWVL * 20]), T2z); + T2B = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2C = BYTW(&(W[TWVL * 84]), T2B); + T2D = VADD(T2A, T2C); + T65 = VSUB(T2C, T2A); + } + { + V T2p, T2r, T2o, T2q; + T2o = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2p = BYTW(&(W[TWVL * 36]), T2o); + T2q = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2r = BYTW(&(W[TWVL * 100]), T2q); + T2s = VADD(T2p, T2r); + T62 = VSUB(T2r, T2p); + } + { + V T2v, T2x, T2u, T2w; + T2u = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2v = BYTW(&(W[TWVL * 116]), T2u); + T2w = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2x = BYTW(&(W[TWVL * 52]), T2w); + T2y = VADD(T2v, T2x); + T64 = VSUB(T2v, T2x); + } + { + V T2t, T2E, T6c, T6d; + T2t = VSUB(T2n, T2s); + T2E = VSUB(T2y, T2D); + T2F = VADD(T2t, T2E); + T2S = VSUB(T2E, T2t); + T6c = VFNMS(LDK(KP414213562), T61, T62); + T6d = VFMA(LDK(KP414213562), T64, T65); + T6e = VADD(T6c, T6d); + T7t = VSUB(T6d, T6c); + } + { + V T4b, T4c, T63, T66; + T4b = VADD(T2n, T2s); + T4c = VADD(T2y, T2D); + T4d = VADD(T4b, T4c); + T4J = VSUB(T4c, T4b); + T63 = VFMA(LDK(KP414213562), T62, T61); + T66 = VFNMS(LDK(KP414213562), T65, T64); + T67 = VADD(T63, T66); + T7w = VSUB(T66, T63); + } + } + { + V T40, T4s, T4x, T4z, T4f, T4o, T4n, T4t, T4u, T4y; + { + V T3W, T3Z, T4v, T4w; + T3W = VADD(T3U, T3V); + T3Z = VADD(T3X, T3Y); + T40 = VSUB(T3W, T3Z); + T4s = VADD(T3W, T3Z); + T4v = VADD(T43, T46); + T4w = VADD(T4a, T4d); + T4x = VSUB(T4v, T4w); + T4z = VADD(T4v, T4w); + } + { + V T47, T4e, T4j, T4m; + T47 = VSUB(T43, T46); + T4e = VSUB(T4a, T4d); + T4f = VADD(T47, T4e); + T4o = VSUB(T47, T4e); + T4j = VADD(T4h, T4i); + T4m = VADD(T4k, T4l); + T4n = VSUB(T4j, T4m); + T4t = VADD(T4j, T4m); + } + T4u = VSUB(T4s, T4t); + ST(&(x[WS(rs, 48)]), VFNMSI(T4x, T4u), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T4x, T4u), ms, &(x[0])); + T4y = VADD(T4s, T4t); + ST(&(x[WS(rs, 32)]), VSUB(T4y, T4z), ms, &(x[0])); + ST(&(x[0]), VADD(T4y, T4z), ms, &(x[0])); + { + V T4g, T4p, T4q, T4r; + T4g = VFNMS(LDK(KP707106781), T4f, T40); + T4p = VFNMS(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 24)]), VFNMSI(T4p, T4g), ms, &(x[0])); + ST(&(x[WS(rs, 40)]), VFMAI(T4p, T4g), ms, &(x[0])); + T4q = VFMA(LDK(KP707106781), T4f, T40); + T4r = VFMA(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 8)]), VFMAI(T4r, T4q), ms, &(x[0])); + ST(&(x[WS(rs, 56)]), VFNMSI(T4r, T4q), ms, &(x[0])); + } + } + { + V T4E, T4W, T4S, T4X, T4L, T50, T4P, T4Z; + { + V T4A, T4D, T4Q, T4R; + T4A = VSUB(T3U, T3V); + T4D = VADD(T4B, T4C); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4W = VFNMS(LDK(KP707106781), T4D, T4A); + T4Q = VFMA(LDK(KP414213562), T4F, T4G); + T4R = VFMA(LDK(KP414213562), T4I, T4J); + T4S = VSUB(T4Q, T4R); + T4X = VADD(T4Q, T4R); + } + { + V T4H, T4K, T4N, T4O; + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + T4K = VFNMS(LDK(KP414213562), T4J, T4I); + T4L = VADD(T4H, T4K); + T50 = VSUB(T4H, T4K); + T4N = VSUB(T3X, T3Y); + T4O = VSUB(T4B, T4C); + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4Z = VFNMS(LDK(KP707106781), T4O, T4N); + } + { + V T4M, T4T, T52, T53; + T4M = VFNMS(LDK(KP923879532), T4L, T4E); + T4T = VFNMS(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 28)]), VFNMSI(T4T, T4M), ms, &(x[0])); + ST(&(x[WS(rs, 36)]), VFMAI(T4T, T4M), ms, &(x[0])); + T52 = VFMA(LDK(KP923879532), T4X, T4W); + T53 = VFNMS(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 12)]), VFNMSI(T53, T52), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VFMAI(T53, T52), ms, &(x[0])); + } + { + V T4U, T4V, T4Y, T51; + T4U = VFMA(LDK(KP923879532), T4L, T4E); + T4V = VFMA(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 60)]), VFNMSI(T4V, T4U), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T4V, T4U), ms, &(x[0])); + T4Y = VFNMS(LDK(KP923879532), T4X, T4W); + T51 = VFMA(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 20)]), VFMAI(T51, T4Y), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VFNMSI(T51, T4Y), ms, &(x[0])); + } + } + { + V T1k, T3k, T3d, T3n, T2V, T3o, T3g, T3l; + { + V Ty, T1j, T39, T3c; + Ty = VFMA(LDK(KP707106781), Tx, Ta); + T1j = VADD(TV, T1i); + T1k = VFMA(LDK(KP923879532), T1j, Ty); + T3k = VFNMS(LDK(KP923879532), T1j, Ty); + T39 = VFMA(LDK(KP707106781), T38, T37); + T3c = VSUB(T3a, T3b); + T3d = VFMA(LDK(KP923879532), T3c, T39); + T3n = VFNMS(LDK(KP923879532), T3c, T39); + { + V T27, T3e, T2U, T3f; + { + V T1T, T26, T2G, T2T; + T1T = VFMA(LDK(KP707106781), T1S, T1v); + T26 = VFMA(LDK(KP707106781), T25, T24); + T27 = VFNMS(LDK(KP198912367), T26, T1T); + T3e = VFMA(LDK(KP198912367), T1T, T26); + T2G = VFMA(LDK(KP707106781), T2F, T2i); + T2T = VFMA(LDK(KP707106781), T2S, T2R); + T2U = VFNMS(LDK(KP198912367), T2T, T2G); + T3f = VFMA(LDK(KP198912367), T2G, T2T); + } + T2V = VADD(T27, T2U); + T3o = VSUB(T27, T2U); + T3g = VSUB(T3e, T3f); + T3l = VADD(T3e, T3f); + } + } + { + V T2W, T3h, T3q, T3r; + T2W = VFNMS(LDK(KP980785280), T2V, T1k); + T3h = VFNMS(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 30)]), VFNMSI(T3h, T2W), ms, &(x[0])); + ST(&(x[WS(rs, 34)]), VFMAI(T3h, T2W), ms, &(x[0])); + T3q = VFMA(LDK(KP980785280), T3l, T3k); + T3r = VFNMS(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 14)]), VFNMSI(T3r, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 50)]), VFMAI(T3r, T3q), ms, &(x[0])); + } + { + V T3i, T3j, T3m, T3p; + T3i = VFMA(LDK(KP980785280), T2V, T1k); + T3j = VFMA(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 62)]), VFNMSI(T3j, T3i), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3j, T3i), ms, &(x[0])); + T3m = VFNMS(LDK(KP980785280), T3l, T3k); + T3p = VFMA(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 18)]), VFMAI(T3p, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 46)]), VFNMSI(T3p, T3m), ms, &(x[0])); + } + } + { + V T3u, T3M, T3F, T3P, T3B, T3Q, T3I, T3N; + { + V T3s, T3t, T3D, T3E; + T3s = VFNMS(LDK(KP707106781), Tx, Ta); + T3t = VADD(T3a, T3b); + T3u = VFMA(LDK(KP923879532), T3t, T3s); + T3M = VFNMS(LDK(KP923879532), T3t, T3s); + T3D = VFNMS(LDK(KP707106781), T38, T37); + T3E = VSUB(TV, T1i); + T3F = VFNMS(LDK(KP923879532), T3E, T3D); + T3P = VFMA(LDK(KP923879532), T3E, T3D); + { + V T3x, T3G, T3A, T3H; + { + V T3v, T3w, T3y, T3z; + T3v = VFNMS(LDK(KP707106781), T1S, T1v); + T3w = VFNMS(LDK(KP707106781), T25, T24); + T3x = VFMA(LDK(KP668178637), T3w, T3v); + T3G = VFNMS(LDK(KP668178637), T3v, T3w); + T3y = VFNMS(LDK(KP707106781), T2F, T2i); + T3z = VFNMS(LDK(KP707106781), T2S, T2R); + T3A = VFMA(LDK(KP668178637), T3z, T3y); + T3H = VFNMS(LDK(KP668178637), T3y, T3z); + } + T3B = VADD(T3x, T3A); + T3Q = VSUB(T3x, T3A); + T3I = VSUB(T3G, T3H); + T3N = VADD(T3G, T3H); + } + } + { + V T3C, T3J, T3S, T3T; + T3C = VFNMS(LDK(KP831469612), T3B, T3u); + T3J = VFNMS(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 38)]), VFNMSI(T3J, T3C), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3J, T3C), ms, &(x[0])); + T3S = VFNMS(LDK(KP831469612), T3N, T3M); + T3T = VFMA(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 10)]), VFMAI(T3T, T3S), ms, &(x[0])); + ST(&(x[WS(rs, 54)]), VFNMSI(T3T, T3S), ms, &(x[0])); + } + { + V T3K, T3L, T3O, T3R; + T3K = VFMA(LDK(KP831469612), T3B, T3u); + T3L = VFMA(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 6)]), VFNMSI(T3L, T3K), ms, &(x[0])); + ST(&(x[WS(rs, 58)]), VFMAI(T3L, T3K), ms, &(x[0])); + T3O = VFMA(LDK(KP831469612), T3N, T3M); + T3R = VFNMS(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 22)]), VFNMSI(T3R, T3O), ms, &(x[0])); + ST(&(x[WS(rs, 42)]), VFMAI(T3R, T3O), ms, &(x[0])); + } + } + { + V T7k, T8j, T7O, T89, T7H, T8g, T7R, T7Y, T7z, T7S, T7K, T7P, T85, T8k, T8c; + V T8h; + { + V T7c, T87, T7j, T88, T7f, T7i; + T7c = VFNMS(LDK(KP923879532), T7b, T7a); + T87 = VFNMS(LDK(KP923879532), T7C, T7B); + T7f = VFNMS(LDK(KP668178637), T7e, T7d); + T7i = VFNMS(LDK(KP668178637), T7h, T7g); + T7j = VADD(T7f, T7i); + T88 = VSUB(T7f, T7i); + T7k = VFNMS(LDK(KP831469612), T7j, T7c); + T8j = VFNMS(LDK(KP831469612), T88, T87); + T7O = VFMA(LDK(KP831469612), T7j, T7c); + T89 = VFMA(LDK(KP831469612), T88, T87); + } + { + V T7D, T7W, T7G, T7X, T7E, T7F; + T7D = VFMA(LDK(KP923879532), T7C, T7B); + T7W = VFMA(LDK(KP923879532), T7b, T7a); + T7E = VFMA(LDK(KP668178637), T7d, T7e); + T7F = VFMA(LDK(KP668178637), T7g, T7h); + T7G = VSUB(T7E, T7F); + T7X = VADD(T7E, T7F); + T7H = VFMA(LDK(KP831469612), T7G, T7D); + T8g = VFNMS(LDK(KP831469612), T7X, T7W); + T7R = VFNMS(LDK(KP831469612), T7G, T7D); + T7Y = VFMA(LDK(KP831469612), T7X, T7W); + } + { + V T7r, T7I, T7y, T7J; + { + V T7n, T7q, T7u, T7x; + T7n = VFNMS(LDK(KP923879532), T7m, T7l); + T7q = VFMA(LDK(KP923879532), T7p, T7o); + T7r = VFNMS(LDK(KP534511135), T7q, T7n); + T7I = VFMA(LDK(KP534511135), T7n, T7q); + T7u = VFNMS(LDK(KP923879532), T7t, T7s); + T7x = VFMA(LDK(KP923879532), T7w, T7v); + T7y = VFNMS(LDK(KP534511135), T7x, T7u); + T7J = VFMA(LDK(KP534511135), T7u, T7x); + } + T7z = VADD(T7r, T7y); + T7S = VSUB(T7r, T7y); + T7K = VSUB(T7I, T7J); + T7P = VADD(T7I, T7J); + } + { + V T81, T8a, T84, T8b; + { + V T7Z, T80, T82, T83; + T7Z = VFMA(LDK(KP923879532), T7m, T7l); + T80 = VFNMS(LDK(KP923879532), T7p, T7o); + T81 = VFMA(LDK(KP303346683), T80, T7Z); + T8a = VFNMS(LDK(KP303346683), T7Z, T80); + T82 = VFMA(LDK(KP923879532), T7t, T7s); + T83 = VFNMS(LDK(KP923879532), T7w, T7v); + T84 = VFMA(LDK(KP303346683), T83, T82); + T8b = VFNMS(LDK(KP303346683), T82, T83); + } + T85 = VADD(T81, T84); + T8k = VSUB(T81, T84); + T8c = VSUB(T8a, T8b); + T8h = VADD(T8a, T8b); + } + { + V T7A, T7L, T8i, T8l; + T7A = VFNMS(LDK(KP881921264), T7z, T7k); + T7L = VFNMS(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 27)]), VFNMSI(T7L, T7A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 37)]), VFMAI(T7L, T7A), ms, &(x[WS(rs, 1)])); + T8i = VFMA(LDK(KP956940335), T8h, T8g); + T8l = VFNMS(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 19)]), VFNMSI(T8l, T8i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 45)]), VFMAI(T8l, T8i), ms, &(x[WS(rs, 1)])); + } + { + V T8m, T8n, T7M, T7N; + T8m = VFNMS(LDK(KP956940335), T8h, T8g); + T8n = VFMA(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 13)]), VFMAI(T8n, T8m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 51)]), VFNMSI(T8n, T8m), ms, &(x[WS(rs, 1)])); + T7M = VFMA(LDK(KP881921264), T7z, T7k); + T7N = VFMA(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 59)]), VFNMSI(T7N, T7M), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(T7N, T7M), ms, &(x[WS(rs, 1)])); + } + { + V T7Q, T7T, T86, T8d; + T7Q = VFNMS(LDK(KP881921264), T7P, T7O); + T7T = VFMA(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 21)]), VFMAI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 43)]), VFNMSI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + T86 = VFNMS(LDK(KP956940335), T85, T7Y); + T8d = VFNMS(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 35)]), VFNMSI(T8d, T86), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VFMAI(T8d, T86), ms, &(x[WS(rs, 1)])); + } + { + V T8e, T8f, T7U, T7V; + T8e = VFMA(LDK(KP956940335), T85, T7Y); + T8f = VFMA(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 3)]), VFNMSI(T8f, T8e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 61)]), VFMAI(T8f, T8e), ms, &(x[WS(rs, 1)])); + T7U = VFMA(LDK(KP881921264), T7P, T7O); + T7V = VFNMS(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 11)]), VFNMSI(T7V, T7U), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 53)]), VFMAI(T7V, T7U), ms, &(x[WS(rs, 1)])); + } + } + { + V T5A, T75, T6A, T6V, T6t, T72, T6D, T6K, T6h, T6E, T6w, T6B, T6R, T76, T6Y; + V T73; + { + V T5g, T6T, T5z, T6U, T5p, T5y; + T5g = VFMA(LDK(KP923879532), T5f, T58); + T6T = VFNMS(LDK(KP923879532), T6o, T6l); + T5p = VFNMS(LDK(KP198912367), T5o, T5l); + T5y = VFNMS(LDK(KP198912367), T5x, T5u); + T5z = VADD(T5p, T5y); + T6U = VSUB(T5p, T5y); + T5A = VFMA(LDK(KP980785280), T5z, T5g); + T75 = VFMA(LDK(KP980785280), T6U, T6T); + T6A = VFNMS(LDK(KP980785280), T5z, T5g); + T6V = VFNMS(LDK(KP980785280), T6U, T6T); + } + { + V T6p, T6I, T6s, T6J, T6q, T6r; + T6p = VFMA(LDK(KP923879532), T6o, T6l); + T6I = VFNMS(LDK(KP923879532), T5f, T58); + T6q = VFMA(LDK(KP198912367), T5l, T5o); + T6r = VFMA(LDK(KP198912367), T5u, T5x); + T6s = VSUB(T6q, T6r); + T6J = VADD(T6q, T6r); + T6t = VFMA(LDK(KP980785280), T6s, T6p); + T72 = VFNMS(LDK(KP980785280), T6J, T6I); + T6D = VFNMS(LDK(KP980785280), T6s, T6p); + T6K = VFMA(LDK(KP980785280), T6J, T6I); + } + { + V T5V, T6u, T6g, T6v; + { + V T5N, T5U, T68, T6f; + T5N = VFMA(LDK(KP923879532), T5M, T5F); + T5U = VFMA(LDK(KP923879532), T5T, T5Q); + T5V = VFNMS(LDK(KP098491403), T5U, T5N); + T6u = VFMA(LDK(KP098491403), T5N, T5U); + T68 = VFMA(LDK(KP923879532), T67, T60); + T6f = VFMA(LDK(KP923879532), T6e, T6b); + T6g = VFNMS(LDK(KP098491403), T6f, T68); + T6v = VFMA(LDK(KP098491403), T68, T6f); + } + T6h = VADD(T5V, T6g); + T6E = VSUB(T5V, T6g); + T6w = VSUB(T6u, T6v); + T6B = VADD(T6u, T6v); + } + { + V T6N, T6W, T6Q, T6X; + { + V T6L, T6M, T6O, T6P; + T6L = VFNMS(LDK(KP923879532), T5M, T5F); + T6M = VFNMS(LDK(KP923879532), T5T, T5Q); + T6N = VFMA(LDK(KP820678790), T6M, T6L); + T6W = VFNMS(LDK(KP820678790), T6L, T6M); + T6O = VFNMS(LDK(KP923879532), T67, T60); + T6P = VFNMS(LDK(KP923879532), T6e, T6b); + T6Q = VFMA(LDK(KP820678790), T6P, T6O); + T6X = VFNMS(LDK(KP820678790), T6O, T6P); + } + T6R = VADD(T6N, T6Q); + T76 = VSUB(T6N, T6Q); + T6Y = VSUB(T6W, T6X); + T73 = VADD(T6W, T6X); + } + { + V T6i, T6x, T74, T77; + T6i = VFNMS(LDK(KP995184726), T6h, T5A); + T6x = VFNMS(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 31)]), VFNMSI(T6x, T6i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 33)]), VFMAI(T6x, T6i), ms, &(x[WS(rs, 1)])); + T74 = VFMA(LDK(KP773010453), T73, T72); + T77 = VFNMS(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 23)]), VFNMSI(T77, T74), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VFMAI(T77, T74), ms, &(x[WS(rs, 1)])); + } + { + V T78, T79, T6y, T6z; + T78 = VFNMS(LDK(KP773010453), T73, T72); + T79 = VFMA(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 9)]), VFMAI(T79, T78), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VFNMSI(T79, T78), ms, &(x[WS(rs, 1)])); + T6y = VFMA(LDK(KP995184726), T6h, T5A); + T6z = VFMA(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 63)]), VFNMSI(T6z, T6y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T6z, T6y), ms, &(x[WS(rs, 1)])); + } + { + V T6C, T6F, T6S, T6Z; + T6C = VFNMS(LDK(KP995184726), T6B, T6A); + T6F = VFMA(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 17)]), VFMAI(T6F, T6C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VFNMSI(T6F, T6C), ms, &(x[WS(rs, 1)])); + T6S = VFNMS(LDK(KP773010453), T6R, T6K); + T6Z = VFNMS(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 39)]), VFNMSI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFMAI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + } + { + V T70, T71, T6G, T6H; + T70 = VFMA(LDK(KP773010453), T6R, T6K); + T71 = VFMA(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 7)]), VFNMSI(T71, T70), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 57)]), VFMAI(T71, T70), ms, &(x[WS(rs, 1)])); + T6G = VFMA(LDK(KP995184726), T6B, T6A); + T6H = VFNMS(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 15)]), VFNMSI(T6H, T6G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VFMAI(T6H, T6G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t2bv_64"), twinstr, &GENUS, {261, 126, 258, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_64) (planner *p) { + X(kdft_dit_register) (p, t2bv_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t2bv_64 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 519 FP additions, 250 FP multiplications, + * (or, 467 additions, 198 multiplications, 52 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Tg, T4B, T6v, T7G, T3r, T4w, T5q, T7F, T5Y, T62, T28, T4d, T2g, T4a, T7g; + V T7Y, T6f, T6j, T2Z, T4k, T37, T4h, T7n, T81, T7w, T7x, T7y, T5M, T6q, T1k; + V T4s, T1r, T4t, T7t, T7u, T7v, T5F, T6p, TV, T4p, T12, T4q, T7A, T7B, TD; + V T4x, T3k, T4C, T5x, T6s, T1R, T4b, T7j, T7Z, T2j, T4e, T5V, T63, T2I, T4i; + V T7q, T82, T3a, T4l, T6c, T6k; + { + V T1, T3, T3p, T3n, Tb, Td, Te, T6, T8, T9, T2, T3o, T3m; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 62]), T2); + T3o = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T3p = BYTW(&(W[TWVL * 94]), T3o); + T3m = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3n = BYTW(&(W[TWVL * 30]), T3m); + { + V Ta, Tc, T5, T7; + Ta = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + Tb = BYTW(&(W[TWVL * 110]), Ta); + Tc = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 46]), Tc); + Te = VSUB(Tb, Td); + T5 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T6 = BYTW(&(W[TWVL * 14]), T5); + T7 = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T8 = BYTW(&(W[TWVL * 78]), T7); + T9 = VSUB(T6, T8); + } + { + V T4, Tf, T6t, T6u; + T4 = VSUB(T1, T3); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VSUB(T4, Tf); + T4B = VADD(T4, Tf); + T6t = VADD(T6, T8); + T6u = VADD(Tb, Td); + T6v = VSUB(T6t, T6u); + T7G = VADD(T6t, T6u); + } + { + V T3l, T3q, T5o, T5p; + T3l = VMUL(LDK(KP707106781), VSUB(T9, Te)); + T3q = VSUB(T3n, T3p); + T3r = VSUB(T3l, T3q); + T4w = VADD(T3q, T3l); + T5o = VADD(T1, T3); + T5p = VADD(T3n, T3p); + T5q = VSUB(T5o, T5p); + T7F = VADD(T5o, T5p); + } + } + { + V T24, T26, T61, T2b, T2d, T60, T1W, T5W, T21, T5X, T22, T27; + { + V T23, T25, T2a, T2c; + T23 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T24 = BYTW(&(W[TWVL * 32]), T23); + T25 = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T26 = BYTW(&(W[TWVL * 96]), T25); + T61 = VADD(T24, T26); + T2a = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2b = BYTW(&(W[0]), T2a); + T2c = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T2d = BYTW(&(W[TWVL * 64]), T2c); + T60 = VADD(T2b, T2d); + } + { + V T1T, T1V, T1S, T1U; + T1S = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1T = BYTW(&(W[TWVL * 16]), T1S); + T1U = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T1V = BYTW(&(W[TWVL * 80]), T1U); + T1W = VSUB(T1T, T1V); + T5W = VADD(T1T, T1V); + } + { + V T1Y, T20, T1X, T1Z; + T1X = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T1Y = BYTW(&(W[TWVL * 112]), T1X); + T1Z = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T20 = BYTW(&(W[TWVL * 48]), T1Z); + T21 = VSUB(T1Y, T20); + T5X = VADD(T1Y, T20); + } + T5Y = VSUB(T5W, T5X); + T62 = VSUB(T60, T61); + T22 = VMUL(LDK(KP707106781), VSUB(T1W, T21)); + T27 = VSUB(T24, T26); + T28 = VSUB(T22, T27); + T4d = VADD(T27, T22); + { + V T2e, T2f, T7e, T7f; + T2e = VSUB(T2b, T2d); + T2f = VMUL(LDK(KP707106781), VADD(T1W, T21)); + T2g = VSUB(T2e, T2f); + T4a = VADD(T2e, T2f); + T7e = VADD(T60, T61); + T7f = VADD(T5W, T5X); + T7g = VSUB(T7e, T7f); + T7Y = VADD(T7e, T7f); + } + } + { + V T2V, T2X, T6i, T32, T34, T6h, T2N, T6d, T2S, T6e, T2T, T2Y; + { + V T2U, T2W, T31, T33; + T2U = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2V = BYTW(&(W[TWVL * 28]), T2U); + T2W = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T2X = BYTW(&(W[TWVL * 92]), T2W); + T6i = VADD(T2V, T2X); + T31 = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T32 = BYTW(&(W[TWVL * 124]), T31); + T33 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T34 = BYTW(&(W[TWVL * 60]), T33); + T6h = VADD(T32, T34); + } + { + V T2K, T2M, T2J, T2L; + T2J = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2K = BYTW(&(W[TWVL * 12]), T2J); + T2L = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2M = BYTW(&(W[TWVL * 76]), T2L); + T2N = VSUB(T2K, T2M); + T6d = VADD(T2K, T2M); + } + { + V T2P, T2R, T2O, T2Q; + T2O = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2P = BYTW(&(W[TWVL * 108]), T2O); + T2Q = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2R = BYTW(&(W[TWVL * 44]), T2Q); + T2S = VSUB(T2P, T2R); + T6e = VADD(T2P, T2R); + } + T6f = VSUB(T6d, T6e); + T6j = VSUB(T6h, T6i); + T2T = VMUL(LDK(KP707106781), VSUB(T2N, T2S)); + T2Y = VSUB(T2V, T2X); + T2Z = VSUB(T2T, T2Y); + T4k = VADD(T2Y, T2T); + { + V T35, T36, T7l, T7m; + T35 = VSUB(T32, T34); + T36 = VMUL(LDK(KP707106781), VADD(T2N, T2S)); + T37 = VSUB(T35, T36); + T4h = VADD(T35, T36); + T7l = VADD(T6h, T6i); + T7m = VADD(T6d, T6e); + T7n = VSUB(T7l, T7m); + T81 = VADD(T7l, T7m); + } + } + { + V T1g, T1i, T5K, T1m, T1o, T5J, T18, T5G, T1d, T5H, T5I, T5L; + { + V T1f, T1h, T1l, T1n; + T1f = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T1g = BYTW(&(W[TWVL * 26]), T1f); + T1h = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T1i = BYTW(&(W[TWVL * 90]), T1h); + T5K = VADD(T1g, T1i); + T1l = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + T1m = BYTW(&(W[TWVL * 122]), T1l); + T1n = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + T1o = BYTW(&(W[TWVL * 58]), T1n); + T5J = VADD(T1m, T1o); + } + { + V T15, T17, T14, T16; + T14 = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T15 = BYTW(&(W[TWVL * 10]), T14); + T16 = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + T17 = BYTW(&(W[TWVL * 74]), T16); + T18 = VSUB(T15, T17); + T5G = VADD(T15, T17); + } + { + V T1a, T1c, T19, T1b; + T19 = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + T1a = BYTW(&(W[TWVL * 106]), T19); + T1b = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1c = BYTW(&(W[TWVL * 42]), T1b); + T1d = VSUB(T1a, T1c); + T5H = VADD(T1a, T1c); + } + T7w = VADD(T5J, T5K); + T7x = VADD(T5G, T5H); + T7y = VSUB(T7w, T7x); + T5I = VSUB(T5G, T5H); + T5L = VSUB(T5J, T5K); + T5M = VFNMS(LDK(KP382683432), T5L, VMUL(LDK(KP923879532), T5I)); + T6q = VFMA(LDK(KP923879532), T5L, VMUL(LDK(KP382683432), T5I)); + { + V T1e, T1j, T1p, T1q; + T1e = VMUL(LDK(KP707106781), VSUB(T18, T1d)); + T1j = VSUB(T1g, T1i); + T1k = VSUB(T1e, T1j); + T4s = VADD(T1j, T1e); + T1p = VSUB(T1m, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T18, T1d)); + T1r = VSUB(T1p, T1q); + T4t = VADD(T1p, T1q); + } + } + { + V TR, TT, T5A, TX, TZ, T5z, TJ, T5C, TO, T5D, T5B, T5E; + { + V TQ, TS, TW, TY; + TQ = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + TR = BYTW(&(W[TWVL * 34]), TQ); + TS = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + TT = BYTW(&(W[TWVL * 98]), TS); + T5A = VADD(TR, TT); + TW = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TX = BYTW(&(W[TWVL * 2]), TW); + TY = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + TZ = BYTW(&(W[TWVL * 66]), TY); + T5z = VADD(TX, TZ); + } + { + V TG, TI, TF, TH; + TF = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TG = BYTW(&(W[TWVL * 18]), TF); + TH = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + TI = BYTW(&(W[TWVL * 82]), TH); + TJ = VSUB(TG, TI); + T5C = VADD(TG, TI); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + TL = BYTW(&(W[TWVL * 114]), TK); + TM = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TN = BYTW(&(W[TWVL * 50]), TM); + TO = VSUB(TL, TN); + T5D = VADD(TL, TN); + } + T7t = VADD(T5z, T5A); + T7u = VADD(T5C, T5D); + T7v = VSUB(T7t, T7u); + T5B = VSUB(T5z, T5A); + T5E = VSUB(T5C, T5D); + T5F = VFMA(LDK(KP382683432), T5B, VMUL(LDK(KP923879532), T5E)); + T6p = VFNMS(LDK(KP382683432), T5E, VMUL(LDK(KP923879532), T5B)); + { + V TP, TU, T10, T11; + TP = VMUL(LDK(KP707106781), VSUB(TJ, TO)); + TU = VSUB(TR, TT); + TV = VSUB(TP, TU); + T4p = VADD(TU, TP); + T10 = VSUB(TX, TZ); + T11 = VMUL(LDK(KP707106781), VADD(TJ, TO)); + T12 = VSUB(T10, T11); + T4q = VADD(T10, T11); + } + } + { + V Tl, T5r, TB, T5u, Tq, T5s, Tw, T5v, Tr, TC; + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 6]), Th); + Tj = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 70]), Tj); + Tl = VSUB(Ti, Tk); + T5r = VADD(Ti, Tk); + } + { + V Ty, TA, Tx, Tz; + Tx = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Ty = BYTW(&(W[TWVL * 118]), Tx); + Tz = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + TA = BYTW(&(W[TWVL * 54]), Tz); + TB = VSUB(Ty, TA); + T5u = VADD(Ty, TA); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tn = BYTW(&(W[TWVL * 38]), Tm); + To = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tp = BYTW(&(W[TWVL * 102]), To); + Tq = VSUB(Tn, Tp); + T5s = VADD(Tn, Tp); + } + { + V Tt, Tv, Ts, Tu; + Ts = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tt = BYTW(&(W[TWVL * 22]), Ts); + Tu = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + Tv = BYTW(&(W[TWVL * 86]), Tu); + Tw = VSUB(Tt, Tv); + T5v = VADD(Tt, Tv); + } + T7A = VADD(T5r, T5s); + T7B = VADD(T5u, T5v); + Tr = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + TC = VFNMS(LDK(KP382683432), TB, VMUL(LDK(KP923879532), Tw)); + TD = VSUB(Tr, TC); + T4x = VADD(Tr, TC); + { + V T3i, T3j, T5t, T5w; + T3i = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + T3j = VFMA(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T3k = VSUB(T3i, T3j); + T4C = VADD(T3i, T3j); + T5t = VSUB(T5r, T5s); + T5w = VSUB(T5u, T5v); + T5x = VMUL(LDK(KP707106781), VADD(T5t, T5w)); + T6s = VMUL(LDK(KP707106781), VSUB(T5t, T5w)); + } + } + { + V T1z, T5P, T1P, T5T, T1E, T5Q, T1K, T5S; + { + V T1w, T1y, T1v, T1x; + T1v = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1w = BYTW(&(W[TWVL * 8]), T1v); + T1x = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1y = BYTW(&(W[TWVL * 72]), T1x); + T1z = VSUB(T1w, T1y); + T5P = VADD(T1w, T1y); + } + { + V T1M, T1O, T1L, T1N; + T1L = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1M = BYTW(&(W[TWVL * 24]), T1L); + T1N = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1O = BYTW(&(W[TWVL * 88]), T1N); + T1P = VSUB(T1M, T1O); + T5T = VADD(T1M, T1O); + } + { + V T1B, T1D, T1A, T1C; + T1A = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1B = BYTW(&(W[TWVL * 40]), T1A); + T1C = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1D = BYTW(&(W[TWVL * 104]), T1C); + T1E = VSUB(T1B, T1D); + T5Q = VADD(T1B, T1D); + } + { + V T1H, T1J, T1G, T1I; + T1G = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1H = BYTW(&(W[TWVL * 120]), T1G); + T1I = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1J = BYTW(&(W[TWVL * 56]), T1I); + T1K = VSUB(T1H, T1J); + T5S = VADD(T1H, T1J); + } + { + V T1F, T1Q, T7h, T7i; + T1F = VFNMS(LDK(KP382683432), T1E, VMUL(LDK(KP923879532), T1z)); + T1Q = VFMA(LDK(KP923879532), T1K, VMUL(LDK(KP382683432), T1P)); + T1R = VSUB(T1F, T1Q); + T4b = VADD(T1F, T1Q); + T7h = VADD(T5P, T5Q); + T7i = VADD(T5S, T5T); + T7j = VSUB(T7h, T7i); + T7Z = VADD(T7h, T7i); + } + { + V T2h, T2i, T5R, T5U; + T2h = VFMA(LDK(KP382683432), T1z, VMUL(LDK(KP923879532), T1E)); + T2i = VFNMS(LDK(KP382683432), T1K, VMUL(LDK(KP923879532), T1P)); + T2j = VSUB(T2h, T2i); + T4e = VADD(T2h, T2i); + T5R = VSUB(T5P, T5Q); + T5U = VSUB(T5S, T5T); + T5V = VMUL(LDK(KP707106781), VSUB(T5R, T5U)); + T63 = VMUL(LDK(KP707106781), VADD(T5R, T5U)); + } + } + { + V T2q, T66, T2G, T6a, T2v, T67, T2B, T69; + { + V T2n, T2p, T2m, T2o; + T2m = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2n = BYTW(&(W[TWVL * 4]), T2m); + T2o = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2p = BYTW(&(W[TWVL * 68]), T2o); + T2q = VSUB(T2n, T2p); + T66 = VADD(T2n, T2p); + } + { + V T2D, T2F, T2C, T2E; + T2C = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2D = BYTW(&(W[TWVL * 20]), T2C); + T2E = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2F = BYTW(&(W[TWVL * 84]), T2E); + T2G = VSUB(T2D, T2F); + T6a = VADD(T2D, T2F); + } + { + V T2s, T2u, T2r, T2t; + T2r = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2s = BYTW(&(W[TWVL * 36]), T2r); + T2t = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2u = BYTW(&(W[TWVL * 100]), T2t); + T2v = VSUB(T2s, T2u); + T67 = VADD(T2s, T2u); + } + { + V T2y, T2A, T2x, T2z; + T2x = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2y = BYTW(&(W[TWVL * 116]), T2x); + T2z = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2A = BYTW(&(W[TWVL * 52]), T2z); + T2B = VSUB(T2y, T2A); + T69 = VADD(T2y, T2A); + } + { + V T2w, T2H, T7o, T7p; + T2w = VFNMS(LDK(KP382683432), T2v, VMUL(LDK(KP923879532), T2q)); + T2H = VFMA(LDK(KP923879532), T2B, VMUL(LDK(KP382683432), T2G)); + T2I = VSUB(T2w, T2H); + T4i = VADD(T2w, T2H); + T7o = VADD(T66, T67); + T7p = VADD(T69, T6a); + T7q = VSUB(T7o, T7p); + T82 = VADD(T7o, T7p); + } + { + V T38, T39, T68, T6b; + T38 = VFMA(LDK(KP382683432), T2q, VMUL(LDK(KP923879532), T2v)); + T39 = VFNMS(LDK(KP382683432), T2B, VMUL(LDK(KP923879532), T2G)); + T3a = VSUB(T38, T39); + T4l = VADD(T38, T39); + T68 = VSUB(T66, T67); + T6b = VSUB(T69, T6a); + T6c = VMUL(LDK(KP707106781), VSUB(T68, T6b)); + T6k = VMUL(LDK(KP707106781), VADD(T68, T6b)); + } + } + { + V T7s, T7R, T7M, T7U, T7D, T7T, T7J, T7Q; + { + V T7k, T7r, T7K, T7L; + T7k = VFNMS(LDK(KP382683432), T7j, VMUL(LDK(KP923879532), T7g)); + T7r = VFMA(LDK(KP923879532), T7n, VMUL(LDK(KP382683432), T7q)); + T7s = VSUB(T7k, T7r); + T7R = VADD(T7k, T7r); + T7K = VFMA(LDK(KP382683432), T7g, VMUL(LDK(KP923879532), T7j)); + T7L = VFNMS(LDK(KP382683432), T7n, VMUL(LDK(KP923879532), T7q)); + T7M = VSUB(T7K, T7L); + T7U = VADD(T7K, T7L); + } + { + V T7z, T7C, T7H, T7I; + T7z = VMUL(LDK(KP707106781), VSUB(T7v, T7y)); + T7C = VSUB(T7A, T7B); + T7D = VSUB(T7z, T7C); + T7T = VADD(T7C, T7z); + T7H = VSUB(T7F, T7G); + T7I = VMUL(LDK(KP707106781), VADD(T7v, T7y)); + T7J = VSUB(T7H, T7I); + T7Q = VADD(T7H, T7I); + } + { + V T7E, T7N, T7W, T7X; + T7E = VBYI(VSUB(T7s, T7D)); + T7N = VSUB(T7J, T7M); + ST(&(x[WS(rs, 20)]), VADD(T7E, T7N), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VSUB(T7N, T7E), ms, &(x[0])); + T7W = VSUB(T7Q, T7R); + T7X = VBYI(VSUB(T7U, T7T)); + ST(&(x[WS(rs, 36)]), VSUB(T7W, T7X), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VADD(T7W, T7X), ms, &(x[0])); + } + { + V T7O, T7P, T7S, T7V; + T7O = VBYI(VADD(T7D, T7s)); + T7P = VADD(T7J, T7M); + ST(&(x[WS(rs, 12)]), VADD(T7O, T7P), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VSUB(T7P, T7O), ms, &(x[0])); + T7S = VADD(T7Q, T7R); + T7V = VBYI(VADD(T7T, T7U)); + ST(&(x[WS(rs, 60)]), VSUB(T7S, T7V), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T7S, T7V), ms, &(x[0])); + } + } + { + V T84, T8c, T8l, T8n, T87, T8h, T8b, T8g, T8i, T8m; + { + V T80, T83, T8j, T8k; + T80 = VSUB(T7Y, T7Z); + T83 = VSUB(T81, T82); + T84 = VMUL(LDK(KP707106781), VSUB(T80, T83)); + T8c = VMUL(LDK(KP707106781), VADD(T80, T83)); + T8j = VADD(T7Y, T7Z); + T8k = VADD(T81, T82); + T8l = VBYI(VSUB(T8j, T8k)); + T8n = VADD(T8j, T8k); + } + { + V T85, T86, T89, T8a; + T85 = VADD(T7t, T7u); + T86 = VADD(T7w, T7x); + T87 = VSUB(T85, T86); + T8h = VADD(T85, T86); + T89 = VADD(T7F, T7G); + T8a = VADD(T7A, T7B); + T8b = VSUB(T89, T8a); + T8g = VADD(T89, T8a); + } + T8i = VSUB(T8g, T8h); + ST(&(x[WS(rs, 48)]), VSUB(T8i, T8l), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T8i, T8l), ms, &(x[0])); + T8m = VADD(T8g, T8h); + ST(&(x[WS(rs, 32)]), VSUB(T8m, T8n), ms, &(x[0])); + ST(&(x[0]), VADD(T8m, T8n), ms, &(x[0])); + { + V T88, T8d, T8e, T8f; + T88 = VBYI(VSUB(T84, T87)); + T8d = VSUB(T8b, T8c); + ST(&(x[WS(rs, 24)]), VADD(T88, T8d), ms, &(x[0])); + ST(&(x[WS(rs, 40)]), VSUB(T8d, T88), ms, &(x[0])); + T8e = VBYI(VADD(T87, T84)); + T8f = VADD(T8b, T8c); + ST(&(x[WS(rs, 8)]), VADD(T8e, T8f), ms, &(x[0])); + ST(&(x[WS(rs, 56)]), VSUB(T8f, T8e), ms, &(x[0])); + } + } + { + V T5O, T6H, T6x, T6F, T6n, T6I, T6A, T6E; + { + V T5y, T5N, T6r, T6w; + T5y = VSUB(T5q, T5x); + T5N = VSUB(T5F, T5M); + T5O = VSUB(T5y, T5N); + T6H = VADD(T5y, T5N); + T6r = VSUB(T6p, T6q); + T6w = VSUB(T6s, T6v); + T6x = VSUB(T6r, T6w); + T6F = VADD(T6w, T6r); + { + V T65, T6y, T6m, T6z; + { + V T5Z, T64, T6g, T6l; + T5Z = VSUB(T5V, T5Y); + T64 = VSUB(T62, T63); + T65 = VFMA(LDK(KP831469612), T5Z, VMUL(LDK(KP555570233), T64)); + T6y = VFNMS(LDK(KP555570233), T5Z, VMUL(LDK(KP831469612), T64)); + T6g = VSUB(T6c, T6f); + T6l = VSUB(T6j, T6k); + T6m = VFNMS(LDK(KP555570233), T6l, VMUL(LDK(KP831469612), T6g)); + T6z = VFMA(LDK(KP555570233), T6g, VMUL(LDK(KP831469612), T6l)); + } + T6n = VSUB(T65, T6m); + T6I = VADD(T6y, T6z); + T6A = VSUB(T6y, T6z); + T6E = VADD(T65, T6m); + } + } + { + V T6o, T6B, T6K, T6L; + T6o = VADD(T5O, T6n); + T6B = VBYI(VADD(T6x, T6A)); + ST(&(x[WS(rs, 54)]), VSUB(T6o, T6B), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VADD(T6o, T6B), ms, &(x[0])); + T6K = VBYI(VADD(T6F, T6E)); + T6L = VADD(T6H, T6I); + ST(&(x[WS(rs, 6)]), VADD(T6K, T6L), ms, &(x[0])); + ST(&(x[WS(rs, 58)]), VSUB(T6L, T6K), ms, &(x[0])); + } + { + V T6C, T6D, T6G, T6J; + T6C = VSUB(T5O, T6n); + T6D = VBYI(VSUB(T6A, T6x)); + ST(&(x[WS(rs, 42)]), VSUB(T6C, T6D), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VADD(T6C, T6D), ms, &(x[0])); + T6G = VBYI(VSUB(T6E, T6F)); + T6J = VSUB(T6H, T6I); + ST(&(x[WS(rs, 26)]), VADD(T6G, T6J), ms, &(x[0])); + ST(&(x[WS(rs, 38)]), VSUB(T6J, T6G), ms, &(x[0])); + } + } + { + V T6O, T79, T6Z, T77, T6V, T7a, T72, T76; + { + V T6M, T6N, T6X, T6Y; + T6M = VADD(T5q, T5x); + T6N = VADD(T6p, T6q); + T6O = VSUB(T6M, T6N); + T79 = VADD(T6M, T6N); + T6X = VADD(T5F, T5M); + T6Y = VADD(T6v, T6s); + T6Z = VSUB(T6X, T6Y); + T77 = VADD(T6Y, T6X); + { + V T6R, T70, T6U, T71; + { + V T6P, T6Q, T6S, T6T; + T6P = VADD(T5Y, T5V); + T6Q = VADD(T62, T63); + T6R = VFMA(LDK(KP980785280), T6P, VMUL(LDK(KP195090322), T6Q)); + T70 = VFNMS(LDK(KP195090322), T6P, VMUL(LDK(KP980785280), T6Q)); + T6S = VADD(T6f, T6c); + T6T = VADD(T6j, T6k); + T6U = VFNMS(LDK(KP195090322), T6T, VMUL(LDK(KP980785280), T6S)); + T71 = VFMA(LDK(KP195090322), T6S, VMUL(LDK(KP980785280), T6T)); + } + T6V = VSUB(T6R, T6U); + T7a = VADD(T70, T71); + T72 = VSUB(T70, T71); + T76 = VADD(T6R, T6U); + } + } + { + V T6W, T73, T7c, T7d; + T6W = VADD(T6O, T6V); + T73 = VBYI(VADD(T6Z, T72)); + ST(&(x[WS(rs, 50)]), VSUB(T6W, T73), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T6W, T73), ms, &(x[0])); + T7c = VBYI(VADD(T77, T76)); + T7d = VADD(T79, T7a); + ST(&(x[WS(rs, 2)]), VADD(T7c, T7d), ms, &(x[0])); + ST(&(x[WS(rs, 62)]), VSUB(T7d, T7c), ms, &(x[0])); + } + { + V T74, T75, T78, T7b; + T74 = VSUB(T6O, T6V); + T75 = VBYI(VSUB(T72, T6Z)); + ST(&(x[WS(rs, 46)]), VSUB(T74, T75), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VADD(T74, T75), ms, &(x[0])); + T78 = VBYI(VSUB(T76, T77)); + T7b = VSUB(T79, T7a); + ST(&(x[WS(rs, 30)]), VADD(T78, T7b), ms, &(x[0])); + ST(&(x[WS(rs, 34)]), VSUB(T7b, T78), ms, &(x[0])); + } + } + { + V T4z, T5g, T4R, T59, T4H, T5j, T4O, T55, T4o, T4S, T4K, T4P, T52, T5k, T5c; + V T5h; + { + V T4y, T57, T4v, T58, T4r, T4u; + T4y = VADD(T4w, T4x); + T57 = VSUB(T4B, T4C); + T4r = VFMA(LDK(KP980785280), T4p, VMUL(LDK(KP195090322), T4q)); + T4u = VFNMS(LDK(KP195090322), T4t, VMUL(LDK(KP980785280), T4s)); + T4v = VADD(T4r, T4u); + T58 = VSUB(T4r, T4u); + T4z = VSUB(T4v, T4y); + T5g = VADD(T57, T58); + T4R = VADD(T4y, T4v); + T59 = VSUB(T57, T58); + } + { + V T4D, T54, T4G, T53, T4E, T4F; + T4D = VADD(T4B, T4C); + T54 = VSUB(T4x, T4w); + T4E = VFNMS(LDK(KP195090322), T4p, VMUL(LDK(KP980785280), T4q)); + T4F = VFMA(LDK(KP195090322), T4s, VMUL(LDK(KP980785280), T4t)); + T4G = VADD(T4E, T4F); + T53 = VSUB(T4E, T4F); + T4H = VSUB(T4D, T4G); + T5j = VADD(T54, T53); + T4O = VADD(T4D, T4G); + T55 = VSUB(T53, T54); + } + { + V T4g, T4I, T4n, T4J; + { + V T4c, T4f, T4j, T4m; + T4c = VADD(T4a, T4b); + T4f = VADD(T4d, T4e); + T4g = VFNMS(LDK(KP098017140), T4f, VMUL(LDK(KP995184726), T4c)); + T4I = VFMA(LDK(KP098017140), T4c, VMUL(LDK(KP995184726), T4f)); + T4j = VADD(T4h, T4i); + T4m = VADD(T4k, T4l); + T4n = VFMA(LDK(KP995184726), T4j, VMUL(LDK(KP098017140), T4m)); + T4J = VFNMS(LDK(KP098017140), T4j, VMUL(LDK(KP995184726), T4m)); + } + T4o = VSUB(T4g, T4n); + T4S = VADD(T4I, T4J); + T4K = VSUB(T4I, T4J); + T4P = VADD(T4g, T4n); + } + { + V T4Y, T5a, T51, T5b; + { + V T4W, T4X, T4Z, T50; + T4W = VSUB(T4a, T4b); + T4X = VSUB(T4e, T4d); + T4Y = VFNMS(LDK(KP634393284), T4X, VMUL(LDK(KP773010453), T4W)); + T5a = VFMA(LDK(KP634393284), T4W, VMUL(LDK(KP773010453), T4X)); + T4Z = VSUB(T4h, T4i); + T50 = VSUB(T4l, T4k); + T51 = VFMA(LDK(KP773010453), T4Z, VMUL(LDK(KP634393284), T50)); + T5b = VFNMS(LDK(KP634393284), T4Z, VMUL(LDK(KP773010453), T50)); + } + T52 = VSUB(T4Y, T51); + T5k = VADD(T5a, T5b); + T5c = VSUB(T5a, T5b); + T5h = VADD(T4Y, T51); + } + { + V T4A, T4L, T5i, T5l; + T4A = VBYI(VSUB(T4o, T4z)); + T4L = VSUB(T4H, T4K); + ST(&(x[WS(rs, 17)]), VADD(T4A, T4L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VSUB(T4L, T4A), ms, &(x[WS(rs, 1)])); + T5i = VADD(T5g, T5h); + T5l = VBYI(VADD(T5j, T5k)); + ST(&(x[WS(rs, 57)]), VSUB(T5i, T5l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T5i, T5l), ms, &(x[WS(rs, 1)])); + } + { + V T5m, T5n, T4M, T4N; + T5m = VSUB(T5g, T5h); + T5n = VBYI(VSUB(T5k, T5j)); + ST(&(x[WS(rs, 39)]), VSUB(T5m, T5n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VADD(T5m, T5n), ms, &(x[WS(rs, 1)])); + T4M = VBYI(VADD(T4z, T4o)); + T4N = VADD(T4H, T4K); + ST(&(x[WS(rs, 15)]), VADD(T4M, T4N), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VSUB(T4N, T4M), ms, &(x[WS(rs, 1)])); + } + { + V T4Q, T4T, T56, T5d; + T4Q = VADD(T4O, T4P); + T4T = VBYI(VADD(T4R, T4S)); + ST(&(x[WS(rs, 63)]), VSUB(T4Q, T4T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T4Q, T4T), ms, &(x[WS(rs, 1)])); + T56 = VBYI(VSUB(T52, T55)); + T5d = VSUB(T59, T5c); + ST(&(x[WS(rs, 23)]), VADD(T56, T5d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VSUB(T5d, T56), ms, &(x[WS(rs, 1)])); + } + { + V T5e, T5f, T4U, T4V; + T5e = VBYI(VADD(T55, T52)); + T5f = VADD(T59, T5c); + ST(&(x[WS(rs, 9)]), VADD(T5e, T5f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VSUB(T5f, T5e), ms, &(x[WS(rs, 1)])); + T4U = VSUB(T4O, T4P); + T4V = VBYI(VSUB(T4S, T4R)); + ST(&(x[WS(rs, 33)]), VSUB(T4U, T4V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VADD(T4U, T4V), ms, &(x[WS(rs, 1)])); + } + } + { + V T1u, T43, T3D, T3V, T3t, T45, T3B, T3K, T3d, T3E, T3w, T3A, T3R, T46, T3Y; + V T42; + { + V TE, T3U, T1t, T3T, T13, T1s; + TE = VSUB(Tg, TD); + T3U = VADD(T3r, T3k); + T13 = VFMA(LDK(KP831469612), TV, VMUL(LDK(KP555570233), T12)); + T1s = VFNMS(LDK(KP555570233), T1r, VMUL(LDK(KP831469612), T1k)); + T1t = VSUB(T13, T1s); + T3T = VADD(T13, T1s); + T1u = VSUB(TE, T1t); + T43 = VADD(T3U, T3T); + T3D = VADD(TE, T1t); + T3V = VSUB(T3T, T3U); + } + { + V T3s, T3I, T3h, T3J, T3f, T3g; + T3s = VSUB(T3k, T3r); + T3I = VADD(Tg, TD); + T3f = VFNMS(LDK(KP555570233), TV, VMUL(LDK(KP831469612), T12)); + T3g = VFMA(LDK(KP555570233), T1k, VMUL(LDK(KP831469612), T1r)); + T3h = VSUB(T3f, T3g); + T3J = VADD(T3f, T3g); + T3t = VSUB(T3h, T3s); + T45 = VADD(T3I, T3J); + T3B = VADD(T3s, T3h); + T3K = VSUB(T3I, T3J); + } + { + V T2l, T3u, T3c, T3v; + { + V T29, T2k, T30, T3b; + T29 = VSUB(T1R, T28); + T2k = VSUB(T2g, T2j); + T2l = VFMA(LDK(KP881921264), T29, VMUL(LDK(KP471396736), T2k)); + T3u = VFNMS(LDK(KP471396736), T29, VMUL(LDK(KP881921264), T2k)); + T30 = VSUB(T2I, T2Z); + T3b = VSUB(T37, T3a); + T3c = VFNMS(LDK(KP471396736), T3b, VMUL(LDK(KP881921264), T30)); + T3v = VFMA(LDK(KP471396736), T30, VMUL(LDK(KP881921264), T3b)); + } + T3d = VSUB(T2l, T3c); + T3E = VADD(T3u, T3v); + T3w = VSUB(T3u, T3v); + T3A = VADD(T2l, T3c); + } + { + V T3N, T3W, T3Q, T3X; + { + V T3L, T3M, T3O, T3P; + T3L = VADD(T28, T1R); + T3M = VADD(T2g, T2j); + T3N = VFMA(LDK(KP956940335), T3L, VMUL(LDK(KP290284677), T3M)); + T3W = VFNMS(LDK(KP290284677), T3L, VMUL(LDK(KP956940335), T3M)); + T3O = VADD(T2Z, T2I); + T3P = VADD(T37, T3a); + T3Q = VFNMS(LDK(KP290284677), T3P, VMUL(LDK(KP956940335), T3O)); + T3X = VFMA(LDK(KP290284677), T3O, VMUL(LDK(KP956940335), T3P)); + } + T3R = VSUB(T3N, T3Q); + T46 = VADD(T3W, T3X); + T3Y = VSUB(T3W, T3X); + T42 = VADD(T3N, T3Q); + } + { + V T3e, T3x, T44, T47; + T3e = VADD(T1u, T3d); + T3x = VBYI(VADD(T3t, T3w)); + ST(&(x[WS(rs, 53)]), VSUB(T3e, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T3e, T3x), ms, &(x[WS(rs, 1)])); + T44 = VBYI(VSUB(T42, T43)); + T47 = VSUB(T45, T46); + ST(&(x[WS(rs, 29)]), VADD(T44, T47), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 35)]), VSUB(T47, T44), ms, &(x[WS(rs, 1)])); + } + { + V T48, T49, T3y, T3z; + T48 = VBYI(VADD(T43, T42)); + T49 = VADD(T45, T46); + ST(&(x[WS(rs, 3)]), VADD(T48, T49), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 61)]), VSUB(T49, T48), ms, &(x[WS(rs, 1)])); + T3y = VSUB(T1u, T3d); + T3z = VBYI(VSUB(T3w, T3t)); + ST(&(x[WS(rs, 43)]), VSUB(T3y, T3z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VADD(T3y, T3z), ms, &(x[WS(rs, 1)])); + } + { + V T3C, T3F, T3S, T3Z; + T3C = VBYI(VSUB(T3A, T3B)); + T3F = VSUB(T3D, T3E); + ST(&(x[WS(rs, 27)]), VADD(T3C, T3F), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 37)]), VSUB(T3F, T3C), ms, &(x[WS(rs, 1)])); + T3S = VADD(T3K, T3R); + T3Z = VBYI(VADD(T3V, T3Y)); + ST(&(x[WS(rs, 51)]), VSUB(T3S, T3Z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VADD(T3S, T3Z), ms, &(x[WS(rs, 1)])); + } + { + V T40, T41, T3G, T3H; + T40 = VSUB(T3K, T3R); + T41 = VBYI(VSUB(T3Y, T3V)); + ST(&(x[WS(rs, 45)]), VSUB(T40, T41), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VADD(T40, T41), ms, &(x[WS(rs, 1)])); + T3G = VBYI(VADD(T3B, T3A)); + T3H = VADD(T3D, T3E); + ST(&(x[WS(rs, 5)]), VADD(T3G, T3H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 59)]), VSUB(T3H, T3G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t2bv_64"), twinstr, &GENUS, {467, 198, 52, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_64) (planner *p) { + X(kdft_dit_register) (p, t2bv_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_8.c new file mode 100644 index 000000000..9c3f796c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2bv_8.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:01 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t2bv_8 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 33 FP additions, 24 FP multiplications, + * (or, 23 additions, 14 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tl, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTW(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTW(&(W[TWVL * 2]), Th); + Tj = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 10]), Tj); + Tl = VSUB(Ti, Tk); + Tr = VADD(Ti, Tk); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTW(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTW(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTW(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTW(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VSUB(Tq, Tr); + Tv = VSUB(Tt, Tu); + ST(&(x[WS(rs, 6)]), VFNMSI(Tv, Ts), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tv, Ts), ms, &(x[0])); + Tw = VADD(Tq, Tr); + Tx = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[0]), VADD(Tw, Tx), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Tm; + Tf = VADD(T9, Te); + Tg = VFNMS(LDK(KP707106781), Tf, T4); + To = VFMA(LDK(KP707106781), Tf, T4); + Tm = VSUB(T9, Te); + Tn = VFNMS(LDK(KP707106781), Tm, Tl); + Tp = VFMA(LDK(KP707106781), Tm, Tl); + ST(&(x[WS(rs, 3)]), VFNMSI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Tp, To), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t2bv_8"), twinstr, &GENUS, {23, 14, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_8) (planner *p) { + X(kdft_dit_register) (p, t2bv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t2bv_8 -include dft/simd/t2b.h -sign 1 */ + +/* + * This function contains 33 FP additions, 16 FP multiplications, + * (or, 33 additions, 16 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t2b.h" + +static void t2bv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V Tl, Tq, Tg, Tr, T5, Tt, Ta, Tu, Ti, Tk, Tj; + Ti = LD(&(x[0]), ms, &(x[0])); + Tj = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tk = BYTW(&(W[TWVL * 6]), Tj); + Tl = VSUB(Ti, Tk); + Tq = VADD(Ti, Tk); + { + V Td, Tf, Tc, Te; + Tc = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Td = BYTW(&(W[TWVL * 2]), Tc); + Te = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tf = BYTW(&(W[TWVL * 10]), Te); + Tg = VSUB(Td, Tf); + Tr = VADD(Td, Tf); + } + { + V T2, T4, T1, T3; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTW(&(W[0]), T1); + T3 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T4 = BYTW(&(W[TWVL * 8]), T3); + T5 = VSUB(T2, T4); + Tt = VADD(T2, T4); + } + { + V T7, T9, T6, T8; + T6 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T7 = BYTW(&(W[TWVL * 12]), T6); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTW(&(W[TWVL * 4]), T8); + Ta = VSUB(T7, T9); + Tu = VADD(T7, T9); + } + { + V Ts, Tv, Tw, Tx; + Ts = VSUB(Tq, Tr); + Tv = VBYI(VSUB(Tt, Tu)); + ST(&(x[WS(rs, 6)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VADD(Tq, Tr); + Tx = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[0]), VADD(Tw, Tx), ms, &(x[0])); + { + V Th, To, Tn, Tp, Tb, Tm; + Tb = VMUL(LDK(KP707106781), VSUB(T5, Ta)); + Th = VBYI(VSUB(Tb, Tg)); + To = VBYI(VADD(Tg, Tb)); + Tm = VMUL(LDK(KP707106781), VADD(T5, Ta)); + Tn = VSUB(Tl, Tm); + Tp = VADD(Tl, Tm); + ST(&(x[WS(rs, 3)]), VADD(Th, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VSUB(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tn, Th), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t2bv_8"), twinstr, &GENUS, {33, 16, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2bv_8) (planner *p) { + X(kdft_dit_register) (p, t2bv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_10.c new file mode 100644 index 000000000..3406ec46a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_10.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:46 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t2fv_10 -include dft/simd/t2f.h */ + +/* + * This function contains 51 FP additions, 40 FP multiplications, + * (or, 33 additions, 22 multiplications, 18 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V T4, TA, Tk, Tp, Tq, TE, TF, TG, T9, Te, Tf, TB, TC, TD, T1; + V T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T4 = VSUB(T1, T3); + TA = VADD(T1, T3); + { + V Th, To, Tj, Tm; + { + V Tg, Tn, Ti, Tl; + Tg = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 6]), Tg); + Tn = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + To = BYTWJ(&(W[0]), Tn); + Ti = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 16]), Ti); + Tl = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 10]), Tl); + } + Tk = VSUB(Th, Tj); + Tp = VSUB(Tm, To); + Tq = VADD(Tk, Tp); + TE = VADD(Th, Tj); + TF = VADD(Tm, To); + TG = VADD(TE, TF); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 2]), T5); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + T7 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 12]), T7); + Ta = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 14]), Ta); + } + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + TB = VADD(T6, T8); + TC = VADD(Tb, Td); + TD = VADD(TB, TC); + } + { + V Tt, Tr, Ts, Tx, Tz, Tv, Tw, Ty, Tu; + Tt = VSUB(Tf, Tq); + Tr = VADD(Tf, Tq); + Ts = VFNMS(LDK(KP250000000), Tr, T4); + Tv = VSUB(T9, Te); + Tw = VSUB(Tk, Tp); + Tx = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tw, Tv)); + Tz = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tv, Tw)); + ST(&(x[WS(rs, 5)]), VADD(T4, Tr), ms, &(x[WS(rs, 1)])); + Ty = VFNMS(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFNMSI(Tz, Ty), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VFMA(LDK(KP559016994), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFNMSI(Tx, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TJ, TH, TI, TN, TP, TL, TM, TO, TK; + TJ = VSUB(TD, TG); + TH = VADD(TD, TG); + TI = VFNMS(LDK(KP250000000), TH, TA); + TL = VSUB(TE, TF); + TM = VSUB(TB, TC); + TN = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TM, TL)); + TP = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TL, TM)); + ST(&(x[0]), VADD(TA, TH), ms, &(x[0])); + TO = VFMA(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 4)]), VFMAI(TP, TO), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFNMSI(TP, TO), ms, &(x[0])); + TK = VFNMS(LDK(KP559016994), TJ, TI); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TK), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFNMSI(TN, TK), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t2fv_10"), twinstr, &GENUS, {33, 22, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_10) (planner *p) { + X(kdft_dit_register) (p, t2fv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 10 -name t2fv_10 -include dft/simd/t2f.h */ + +/* + * This function contains 51 FP additions, 30 FP multiplications, + * (or, 45 additions, 24 multiplications, 6 fused multiply/add), + * 32 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 18)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(10, rs)) { + V Tr, TH, Tg, Tl, Tm, TA, TB, TJ, T5, Ta, Tb, TD, TE, TI, To; + V Tq, Tp; + To = LD(&(x[0]), ms, &(x[0])); + Tp = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tq = BYTWJ(&(W[TWVL * 8]), Tp); + Tr = VSUB(To, Tq); + TH = VADD(To, Tq); + { + V Td, Tk, Tf, Ti; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 6]), Tc); + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[0]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTWJ(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 10]), Th); + } + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VADD(Tg, Tl); + TA = VADD(Td, Tf); + TB = VADD(Ti, Tk); + TJ = VADD(TA, TB); + } + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T2 = BYTWJ(&(W[TWVL * 2]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTWJ(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 14]), T6); + } + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VADD(T5, Ta); + TD = VADD(T2, T4); + TE = VADD(T7, T9); + TI = VADD(TD, TE); + } + { + V Tn, Ts, Tt, Tx, Tz, Tv, Tw, Ty, Tu; + Tn = VMUL(LDK(KP559016994), VSUB(Tb, Tm)); + Ts = VADD(Tb, Tm); + Tt = VFNMS(LDK(KP250000000), Ts, Tr); + Tv = VSUB(T5, Ta); + Tw = VSUB(Tg, Tl); + Tx = VBYI(VFMA(LDK(KP951056516), Tv, VMUL(LDK(KP587785252), Tw))); + Tz = VBYI(VFNMS(LDK(KP587785252), Tv, VMUL(LDK(KP951056516), Tw))); + ST(&(x[WS(rs, 5)]), VADD(Tr, Ts), ms, &(x[WS(rs, 1)])); + Ty = VSUB(Tt, Tn); + ST(&(x[WS(rs, 3)]), VSUB(Ty, Tz), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(Tz, Ty), ms, &(x[WS(rs, 1)])); + Tu = VADD(Tn, Tt); + ST(&(x[WS(rs, 1)]), VSUB(Tu, Tx), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(Tx, Tu), ms, &(x[WS(rs, 1)])); + } + { + V TM, TK, TL, TG, TO, TC, TF, TP, TN; + TM = VMUL(LDK(KP559016994), VSUB(TI, TJ)); + TK = VADD(TI, TJ); + TL = VFNMS(LDK(KP250000000), TK, TH); + TC = VSUB(TA, TB); + TF = VSUB(TD, TE); + TG = VBYI(VFNMS(LDK(KP587785252), TF, VMUL(LDK(KP951056516), TC))); + TO = VBYI(VFMA(LDK(KP951056516), TF, VMUL(LDK(KP587785252), TC))); + ST(&(x[0]), VADD(TH, TK), ms, &(x[0])); + TP = VADD(TM, TL); + ST(&(x[WS(rs, 4)]), VADD(TO, TP), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VSUB(TP, TO), ms, &(x[0])); + TN = VSUB(TL, TM); + ST(&(x[WS(rs, 2)]), VADD(TG, TN), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TN, TG), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t2fv_10"), twinstr, &GENUS, {45, 24, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_10) (planner *p) { + X(kdft_dit_register) (p, t2fv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_16.c new file mode 100644 index 000000000..9f9f01c22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_16.c @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:42 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t2fv_16 -include dft/simd/t2f.h */ + +/* + * This function contains 87 FP additions, 64 FP multiplications, + * (or, 53 additions, 30 multiplications, 34 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V T4, TW, T9, T19, TD, TI, TZ, T1a, Tf, Tk, Tl, T13, T1c, Tq, Tv; + V Tw, T16, T1d, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 14]), T2); + T4 = VADD(T1, T3); + TW = VSUB(T1, T3); + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 22]), T7); + T9 = VADD(T6, T8); + T19 = VSUB(T6, T8); + } + { + V TA, TH, TC, TF, TX, TY; + { + V Tz, TG, TB, TE; + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 26]), Tz); + TG = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TH = BYTWJ(&(W[TWVL * 18]), TG); + TB = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 10]), TB); + TE = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TF = BYTWJ(&(W[TWVL * 2]), TE); + } + TD = VADD(TA, TC); + TI = VADD(TF, TH); + TX = VSUB(TF, TH); + TY = VSUB(TA, TC); + TZ = VADD(TX, TY); + T1a = VSUB(TY, TX); + } + { + V Tc, Tj, Te, Th, T11, T12; + { + V Tb, Ti, Td, Tg; + Tb = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tc = BYTWJ(&(W[0]), Tb); + Ti = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 24]), Ti); + Td = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Te = BYTWJ(&(W[TWVL * 16]), Td); + Tg = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Th = BYTWJ(&(W[TWVL * 8]), Tg); + } + Tf = VADD(Tc, Te); + Tk = VADD(Th, Tj); + Tl = VSUB(Tf, Tk); + T11 = VSUB(Tc, Te); + T12 = VSUB(Th, Tj); + T13 = VFNMS(LDK(KP414213562), T12, T11); + T1c = VFMA(LDK(KP414213562), T11, T12); + } + { + V Tn, Tu, Tp, Ts, T14, T15; + { + V Tm, Tt, To, Tr; + Tm = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tn = BYTWJ(&(W[TWVL * 28]), Tm); + Tt = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 20]), Tt); + To = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tp = BYTWJ(&(W[TWVL * 12]), To); + Tr = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[TWVL * 4]), Tr); + } + Tq = VADD(Tn, Tp); + Tv = VADD(Ts, Tu); + Tw = VSUB(Tq, Tv); + T14 = VSUB(Tn, Tp); + T15 = VSUB(Tu, Ts); + T16 = VFNMS(LDK(KP414213562), T15, T14); + T1d = VFMA(LDK(KP414213562), T14, T15); + } + { + V Ty, TM, TL, TN; + { + V Ta, Tx, TJ, TK; + Ta = VSUB(T4, T9); + Tx = VADD(Tl, Tw); + Ty = VFNMS(LDK(KP707106781), Tx, Ta); + TM = VFMA(LDK(KP707106781), Tx, Ta); + TJ = VSUB(TD, TI); + TK = VSUB(Tw, Tl); + TL = VFNMS(LDK(KP707106781), TK, TJ); + TN = VFMA(LDK(KP707106781), TK, TJ); + } + ST(&(x[WS(rs, 6)]), VFNMSI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TN, TM), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFMAI(TL, Ty), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(TN, TM), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VFNMS(LDK(KP707106781), TZ, TW); + T1j = VADD(T1c, T1d); + T1k = VFNMS(LDK(KP923879532), T1j, T1i); + T1o = VFMA(LDK(KP923879532), T1j, T1i); + T1l = VFMA(LDK(KP707106781), T1a, T19); + T1m = VSUB(T16, T13); + T1n = VFNMS(LDK(KP923879532), T1m, T1l); + T1p = VFMA(LDK(KP923879532), T1m, T1l); + } + ST(&(x[WS(rs, 5)]), VFNMSI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFNMSI(T1p, T1o), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T1n, T1k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T1p, T1o), ms, &(x[WS(rs, 1)])); + } + { + V TQ, TU, TT, TV; + { + V TO, TP, TR, TS; + TO = VADD(T4, T9); + TP = VADD(TI, TD); + TQ = VADD(TO, TP); + TU = VSUB(TO, TP); + TR = VADD(Tf, Tk); + TS = VADD(Tq, Tv); + TT = VADD(TR, TS); + TV = VSUB(TS, TR); + } + ST(&(x[WS(rs, 8)]), VSUB(TQ, TT), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(TV, TU), ms, &(x[0])); + ST(&(x[0]), VADD(TQ, TT), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFNMSI(TV, TU), ms, &(x[0])); + } + { + V T18, T1g, T1f, T1h; + { + V T10, T17, T1b, T1e; + T10 = VFMA(LDK(KP707106781), TZ, TW); + T17 = VADD(T13, T16); + T18 = VFNMS(LDK(KP923879532), T17, T10); + T1g = VFMA(LDK(KP923879532), T17, T10); + T1b = VFNMS(LDK(KP707106781), T1a, T19); + T1e = VSUB(T1c, T1d); + T1f = VFNMS(LDK(KP923879532), T1e, T1b); + T1h = VFMA(LDK(KP923879532), T1e, T1b); + } + ST(&(x[WS(rs, 9)]), VFNMSI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T1h, T1g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T1f, T18), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFNMSI(T1h, T1g), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t2fv_16"), twinstr, &GENUS, {53, 30, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_16) (planner *p) { + X(kdft_dit_register) (p, t2fv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 16 -name t2fv_16 -include dft/simd/t2f.h */ + +/* + * This function contains 87 FP additions, 42 FP multiplications, + * (or, 83 additions, 38 multiplications, 4 fused multiply/add), + * 36 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 30)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(16, rs)) { + V TJ, T10, TD, T11, T1b, T1c, Ty, TK, T16, T17, T18, Tb, TN, T13, T14; + V T15, Tm, TM, TG, TI, TH; + TG = LD(&(x[0]), ms, &(x[0])); + TH = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + TI = BYTWJ(&(W[TWVL * 14]), TH); + TJ = VSUB(TG, TI); + T10 = VADD(TG, TI); + { + V TA, TC, Tz, TB; + Tz = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 6]), Tz); + TB = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 22]), TB); + TD = VSUB(TA, TC); + T11 = VADD(TA, TC); + } + { + V Tp, Tw, Tr, Tu, Ts, Tx; + { + V To, Tv, Tq, Tt; + To = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 26]), To); + Tv = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tw = BYTWJ(&(W[TWVL * 18]), Tv); + Tq = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tr = BYTWJ(&(W[TWVL * 10]), Tq); + Tt = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tu = BYTWJ(&(W[TWVL * 2]), Tt); + } + T1b = VADD(Tp, Tr); + T1c = VADD(Tu, Tw); + Ts = VSUB(Tp, Tr); + Tx = VSUB(Tu, Tw); + Ty = VMUL(LDK(KP707106781), VSUB(Ts, Tx)); + TK = VMUL(LDK(KP707106781), VADD(Tx, Ts)); + } + { + V T2, T9, T4, T7, T5, Ta; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[TWVL * 28]), T1); + T8 = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 20]), T8); + T3 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T4 = BYTWJ(&(W[TWVL * 12]), T3); + T6 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T7 = BYTWJ(&(W[TWVL * 4]), T6); + } + T16 = VADD(T2, T4); + T17 = VADD(T7, T9); + T18 = VSUB(T16, T17); + T5 = VSUB(T2, T4); + Ta = VSUB(T7, T9); + Tb = VFNMS(LDK(KP923879532), Ta, VMUL(LDK(KP382683432), T5)); + TN = VFMA(LDK(KP923879532), T5, VMUL(LDK(KP382683432), Ta)); + } + { + V Td, Tk, Tf, Ti, Tg, Tl; + { + V Tc, Tj, Te, Th; + Tc = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[0]), Tc); + Tj = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tk = BYTWJ(&(W[TWVL * 24]), Tj); + Te = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tf = BYTWJ(&(W[TWVL * 16]), Te); + Th = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Ti = BYTWJ(&(W[TWVL * 8]), Th); + } + T13 = VADD(Td, Tf); + T14 = VADD(Ti, Tk); + T15 = VSUB(T13, T14); + Tg = VSUB(Td, Tf); + Tl = VSUB(Ti, Tk); + Tm = VFMA(LDK(KP382683432), Tg, VMUL(LDK(KP923879532), Tl)); + TM = VFNMS(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tg)); + } + { + V T1a, T1g, T1f, T1h; + { + V T12, T19, T1d, T1e; + T12 = VSUB(T10, T11); + T19 = VMUL(LDK(KP707106781), VADD(T15, T18)); + T1a = VADD(T12, T19); + T1g = VSUB(T12, T19); + T1d = VSUB(T1b, T1c); + T1e = VMUL(LDK(KP707106781), VSUB(T18, T15)); + T1f = VBYI(VADD(T1d, T1e)); + T1h = VBYI(VSUB(T1e, T1d)); + } + ST(&(x[WS(rs, 14)]), VSUB(T1a, T1f), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T1g, T1h), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1a, T1f), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(T1g, T1h), ms, &(x[0])); + } + { + V T1k, T1o, T1n, T1p; + { + V T1i, T1j, T1l, T1m; + T1i = VADD(T10, T11); + T1j = VADD(T1c, T1b); + T1k = VADD(T1i, T1j); + T1o = VSUB(T1i, T1j); + T1l = VADD(T13, T14); + T1m = VADD(T16, T17); + T1n = VADD(T1l, T1m); + T1p = VBYI(VSUB(T1m, T1l)); + } + ST(&(x[WS(rs, 8)]), VSUB(T1k, T1n), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1o, T1p), ms, &(x[0])); + ST(&(x[0]), VADD(T1k, T1n), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VSUB(T1o, T1p), ms, &(x[0])); + } + { + V TF, TQ, TP, TR; + { + V Tn, TE, TL, TO; + Tn = VSUB(Tb, Tm); + TE = VSUB(Ty, TD); + TF = VBYI(VSUB(Tn, TE)); + TQ = VBYI(VADD(TE, Tn)); + TL = VADD(TJ, TK); + TO = VADD(TM, TN); + TP = VSUB(TL, TO); + TR = VADD(TL, TO); + } + ST(&(x[WS(rs, 7)]), VADD(TF, TP), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VSUB(TR, TQ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(TP, TF), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(TQ, TR), ms, &(x[WS(rs, 1)])); + } + { + V TU, TY, TX, TZ; + { + V TS, TT, TV, TW; + TS = VSUB(TJ, TK); + TT = VADD(Tm, Tb); + TU = VADD(TS, TT); + TY = VSUB(TS, TT); + TV = VADD(TD, Ty); + TW = VSUB(TN, TM); + TX = VBYI(VADD(TV, TW)); + TZ = VBYI(VSUB(TW, TV)); + } + ST(&(x[WS(rs, 13)]), VSUB(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(TY, TZ), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(TU, TX), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(TY, TZ), ms, &(x[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t2fv_16"), twinstr, &GENUS, {83, 38, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_16) (planner *p) { + X(kdft_dit_register) (p, t2fv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_2.c new file mode 100644 index 000000000..bc6b093b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_2.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:42 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t2fv_2 -include dft/simd/t2f.h */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t2fv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_2) (planner *p) { + X(kdft_dit_register) (p, t2fv_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 2 -name t2fv_2 -include dft/simd/t2f.h */ + +/* + * This function contains 3 FP additions, 2 FP multiplications, + * (or, 3 additions, 2 multiplications, 0 fused multiply/add), + * 5 stack variables, 0 constants, and 4 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_2(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 2)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(2, rs)) { + V T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + ST(&(x[WS(rs, 1)]), VSUB(T1, T3), ms, &(x[WS(rs, 1)])); + ST(&(x[0]), VADD(T1, T3), ms, &(x[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 2, XSIMD_STRING("t2fv_2"), twinstr, &GENUS, {3, 2, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_2) (planner *p) { + X(kdft_dit_register) (p, t2fv_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_20.c new file mode 100644 index 000000000..ca9171afe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_20.c @@ -0,0 +1,524 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:46 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t2fv_20 -include dft/simd/t2f.h */ + +/* + * This function contains 123 FP additions, 88 FP multiplications, + * (or, 77 additions, 42 multiplications, 46 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, Tx, T1m, T1K, TZ, T16, T17, T10, Tf, Tq, Tr, T1O, T1P, T1Q, T1w; + V T1z, T1A, TI, TT, TU, T1L, T1M, T1N, T1p, T1s, T1t, Ts, TV; + { + V T1, Tw, T3, Tu, Tv, T2, Tt, T1k, T1l; + T1 = LD(&(x[0]), ms, &(x[0])); + Tv = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tw = BYTWJ(&(W[TWVL * 28]), Tv); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 18]), T2); + Tt = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 8]), Tt); + T4 = VSUB(T1, T3); + Tx = VSUB(Tu, Tw); + T1k = VADD(T1, T3); + T1l = VADD(Tu, Tw); + T1m = VSUB(T1k, T1l); + T1K = VADD(T1k, T1l); + } + { + V T9, T1n, TN, T1v, TS, T1y, Te, T1q, Tk, T1u, TC, T1o, TH, T1r, Tp; + V T1x; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1n = VADD(T6, T8); + } + { + V TK, TM, TJ, TL; + TJ = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TK = BYTWJ(&(W[TWVL * 24]), TJ); + TL = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TM = BYTWJ(&(W[TWVL * 4]), TL); + TN = VSUB(TK, TM); + T1v = VADD(TK, TM); + } + { + V TP, TR, TO, TQ; + TO = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TP = BYTWJ(&(W[TWVL * 32]), TO); + TQ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TR = BYTWJ(&(W[TWVL * 12]), TQ); + TS = VSUB(TP, TR); + T1y = VADD(TP, TR); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1q = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1u = VADD(Th, Tj); + } + { + V Tz, TB, Ty, TA; + Ty = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tz = BYTWJ(&(W[TWVL * 16]), Ty); + TA = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TB = BYTWJ(&(W[TWVL * 36]), TA); + TC = VSUB(Tz, TB); + T1o = VADD(Tz, TB); + } + { + V TE, TG, TD, TF; + TD = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TE = BYTWJ(&(W[0]), TD); + TF = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[TWVL * 20]), TF); + TH = VSUB(TE, TG); + T1r = VADD(TE, TG); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTWJ(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1x = VADD(Tm, To); + } + TZ = VSUB(TH, TC); + T16 = VSUB(T9, Te); + T17 = VSUB(Tk, Tp); + T10 = VSUB(TS, TN); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1O = VADD(T1u, T1v); + T1P = VADD(T1x, T1y); + T1Q = VADD(T1O, T1P); + T1w = VSUB(T1u, T1v); + T1z = VSUB(T1x, T1y); + T1A = VADD(T1w, T1z); + TI = VADD(TC, TH); + TT = VADD(TN, TS); + TU = VADD(TI, TT); + T1L = VADD(T1n, T1o); + T1M = VADD(T1q, T1r); + T1N = VADD(T1L, T1M); + T1p = VSUB(T1n, T1o); + T1s = VSUB(T1q, T1r); + T1t = VADD(T1p, T1s); + } + Ts = VADD(T4, Tr); + TV = VADD(Tx, TU); + ST(&(x[WS(rs, 5)]), VFNMSI(TV, Ts), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(TV, Ts), ms, &(x[WS(rs, 1)])); + { + V T1T, T1R, T1S, T1X, T1Z, T1V, T1W, T1Y, T1U; + T1T = VSUB(T1N, T1Q); + T1R = VADD(T1N, T1Q); + T1S = VFNMS(LDK(KP250000000), T1R, T1K); + T1V = VSUB(T1L, T1M); + T1W = VSUB(T1O, T1P); + T1X = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1W, T1V)); + T1Z = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1V, T1W)); + ST(&(x[0]), VADD(T1K, T1R), ms, &(x[0])); + T1Y = VFNMS(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 8)]), VFNMSI(T1Z, T1Y), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFMAI(T1Z, T1Y), ms, &(x[0])); + T1U = VFMA(LDK(KP559016994), T1T, T1S); + ST(&(x[WS(rs, 4)]), VFMAI(T1X, T1U), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFNMSI(T1X, T1U), ms, &(x[0])); + } + { + V T1D, T1B, T1C, T1H, T1J, T1F, T1G, T1I, T1E; + T1D = VSUB(T1t, T1A); + T1B = VADD(T1t, T1A); + T1C = VFNMS(LDK(KP250000000), T1B, T1m); + T1F = VSUB(T1w, T1z); + T1G = VSUB(T1p, T1s); + T1H = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1G, T1F)); + T1J = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1F, T1G)); + ST(&(x[WS(rs, 10)]), VADD(T1m, T1B), ms, &(x[0])); + T1I = VFMA(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 6)]), VFNMSI(T1J, T1I), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFMAI(T1J, T1I), ms, &(x[0])); + T1E = VFNMS(LDK(KP559016994), T1D, T1C); + ST(&(x[WS(rs, 2)]), VFMAI(T1H, T1E), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFNMSI(T1H, T1E), ms, &(x[0])); + } + { + V T11, T18, T1g, T1d, T15, T1f, TY, T1c; + T11 = VFMA(LDK(KP618033988), T10, TZ); + T18 = VFMA(LDK(KP618033988), T17, T16); + T1g = VFNMS(LDK(KP618033988), T16, T17); + T1d = VFNMS(LDK(KP618033988), TZ, T10); + { + V T13, T14, TW, TX; + T13 = VFNMS(LDK(KP250000000), TU, Tx); + T14 = VSUB(TT, TI); + T15 = VFNMS(LDK(KP559016994), T14, T13); + T1f = VFMA(LDK(KP559016994), T14, T13); + TW = VFNMS(LDK(KP250000000), Tr, T4); + TX = VSUB(Tf, Tq); + TY = VFMA(LDK(KP559016994), TX, TW); + T1c = VFNMS(LDK(KP559016994), TX, TW); + } + { + V T12, T19, T1i, T1j; + T12 = VFMA(LDK(KP951056516), T11, TY); + T19 = VFMA(LDK(KP951056516), T18, T15); + ST(&(x[WS(rs, 1)]), VFNMSI(T19, T12), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VFMAI(T19, T12), ms, &(x[WS(rs, 1)])); + T1i = VFMA(LDK(KP951056516), T1d, T1c); + T1j = VFMA(LDK(KP951056516), T1g, T1f); + ST(&(x[WS(rs, 13)]), VFNMSI(T1j, T1i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T1j, T1i), ms, &(x[WS(rs, 1)])); + } + { + V T1a, T1b, T1e, T1h; + T1a = VFNMS(LDK(KP951056516), T11, TY); + T1b = VFNMS(LDK(KP951056516), T18, T15); + ST(&(x[WS(rs, 9)]), VFNMSI(T1b, T1a), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T1b, T1a), ms, &(x[WS(rs, 1)])); + T1e = VFNMS(LDK(KP951056516), T1d, T1c); + T1h = VFNMS(LDK(KP951056516), T1g, T1f); + ST(&(x[WS(rs, 17)]), VFNMSI(T1h, T1e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T1h, T1e), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t2fv_20"), twinstr, &GENUS, {77, 42, 46, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_20) (planner *p) { + X(kdft_dit_register) (p, t2fv_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 20 -name t2fv_20 -include dft/simd/t2f.h */ + +/* + * This function contains 123 FP additions, 62 FP multiplications, + * (or, 111 additions, 50 multiplications, 12 fused multiply/add), + * 54 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 38)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(20, rs)) { + V T4, Tx, T1B, T1U, TZ, T16, T17, T10, Tf, Tq, Tr, T1N, T1O, T1S, T1t; + V T1w, T1C, TI, TT, TU, T1K, T1L, T1R, T1m, T1p, T1D, Ts, TV; + { + V T1, Tw, T3, Tu, Tv, T2, Tt, T1z, T1A; + T1 = LD(&(x[0]), ms, &(x[0])); + Tv = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tw = BYTWJ(&(W[TWVL * 28]), Tv); + T2 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 18]), T2); + Tt = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tu = BYTWJ(&(W[TWVL * 8]), Tt); + T4 = VSUB(T1, T3); + Tx = VSUB(Tu, Tw); + T1z = VADD(T1, T3); + T1A = VADD(Tu, Tw); + T1B = VSUB(T1z, T1A); + T1U = VADD(T1z, T1A); + } + { + V T9, T1r, TN, T1l, TS, T1o, Te, T1u, Tk, T1k, TC, T1s, TH, T1v, Tp; + V T1n; + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + T7 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 26]), T7); + T9 = VSUB(T6, T8); + T1r = VADD(T6, T8); + } + { + V TK, TM, TJ, TL; + TJ = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TK = BYTWJ(&(W[TWVL * 24]), TJ); + TL = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TM = BYTWJ(&(W[TWVL * 4]), TL); + TN = VSUB(TK, TM); + T1l = VADD(TK, TM); + } + { + V TP, TR, TO, TQ; + TO = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TP = BYTWJ(&(W[TWVL * 32]), TO); + TQ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TR = BYTWJ(&(W[TWVL * 12]), TQ); + TS = VSUB(TP, TR); + T1o = VADD(TP, TR); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 30]), Ta); + Tc = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 10]), Tc); + Te = VSUB(Tb, Td); + T1u = VADD(Tb, Td); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 14]), Tg); + Ti = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 34]), Ti); + Tk = VSUB(Th, Tj); + T1k = VADD(Th, Tj); + } + { + V Tz, TB, Ty, TA; + Ty = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tz = BYTWJ(&(W[TWVL * 16]), Ty); + TA = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TB = BYTWJ(&(W[TWVL * 36]), TA); + TC = VSUB(Tz, TB); + T1s = VADD(Tz, TB); + } + { + V TE, TG, TD, TF; + TD = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TE = BYTWJ(&(W[0]), TD); + TF = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[TWVL * 20]), TF); + TH = VSUB(TE, TG); + T1v = VADD(TE, TG); + } + { + V Tm, To, Tl, Tn; + Tl = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tm = BYTWJ(&(W[TWVL * 22]), Tl); + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = BYTWJ(&(W[TWVL * 2]), Tn); + Tp = VSUB(Tm, To); + T1n = VADD(Tm, To); + } + TZ = VSUB(TH, TC); + T16 = VSUB(T9, Te); + T17 = VSUB(Tk, Tp); + T10 = VSUB(TS, TN); + Tf = VADD(T9, Te); + Tq = VADD(Tk, Tp); + Tr = VADD(Tf, Tq); + T1N = VADD(T1k, T1l); + T1O = VADD(T1n, T1o); + T1S = VADD(T1N, T1O); + T1t = VSUB(T1r, T1s); + T1w = VSUB(T1u, T1v); + T1C = VADD(T1t, T1w); + TI = VADD(TC, TH); + TT = VADD(TN, TS); + TU = VADD(TI, TT); + T1K = VADD(T1r, T1s); + T1L = VADD(T1u, T1v); + T1R = VADD(T1K, T1L); + T1m = VSUB(T1k, T1l); + T1p = VSUB(T1n, T1o); + T1D = VADD(T1m, T1p); + } + Ts = VADD(T4, Tr); + TV = VBYI(VADD(Tx, TU)); + ST(&(x[WS(rs, 5)]), VSUB(Ts, TV), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VADD(Ts, TV), ms, &(x[WS(rs, 1)])); + { + V T1T, T1V, T1W, T1Q, T1Z, T1M, T1P, T1Y, T1X; + T1T = VMUL(LDK(KP559016994), VSUB(T1R, T1S)); + T1V = VADD(T1R, T1S); + T1W = VFNMS(LDK(KP250000000), T1V, T1U); + T1M = VSUB(T1K, T1L); + T1P = VSUB(T1N, T1O); + T1Q = VBYI(VFMA(LDK(KP951056516), T1M, VMUL(LDK(KP587785252), T1P))); + T1Z = VBYI(VFNMS(LDK(KP587785252), T1M, VMUL(LDK(KP951056516), T1P))); + ST(&(x[0]), VADD(T1U, T1V), ms, &(x[0])); + T1Y = VSUB(T1W, T1T); + ST(&(x[WS(rs, 8)]), VSUB(T1Y, T1Z), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T1Z, T1Y), ms, &(x[0])); + T1X = VADD(T1T, T1W); + ST(&(x[WS(rs, 4)]), VADD(T1Q, T1X), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T1X, T1Q), ms, &(x[0])); + } + { + V T1G, T1E, T1F, T1y, T1J, T1q, T1x, T1I, T1H; + T1G = VMUL(LDK(KP559016994), VSUB(T1C, T1D)); + T1E = VADD(T1C, T1D); + T1F = VFNMS(LDK(KP250000000), T1E, T1B); + T1q = VSUB(T1m, T1p); + T1x = VSUB(T1t, T1w); + T1y = VBYI(VFNMS(LDK(KP587785252), T1x, VMUL(LDK(KP951056516), T1q))); + T1J = VBYI(VFMA(LDK(KP951056516), T1x, VMUL(LDK(KP587785252), T1q))); + ST(&(x[WS(rs, 10)]), VADD(T1B, T1E), ms, &(x[0])); + T1I = VADD(T1G, T1F); + ST(&(x[WS(rs, 6)]), VSUB(T1I, T1J), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T1J, T1I), ms, &(x[0])); + T1H = VSUB(T1F, T1G); + ST(&(x[WS(rs, 2)]), VADD(T1y, T1H), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VSUB(T1H, T1y), ms, &(x[0])); + } + { + V T11, T18, T1g, T1d, T15, T1f, TY, T1c; + T11 = VFMA(LDK(KP951056516), TZ, VMUL(LDK(KP587785252), T10)); + T18 = VFMA(LDK(KP951056516), T16, VMUL(LDK(KP587785252), T17)); + T1g = VFNMS(LDK(KP587785252), T16, VMUL(LDK(KP951056516), T17)); + T1d = VFNMS(LDK(KP587785252), TZ, VMUL(LDK(KP951056516), T10)); + { + V T13, T14, TW, TX; + T13 = VFMS(LDK(KP250000000), TU, Tx); + T14 = VMUL(LDK(KP559016994), VSUB(TT, TI)); + T15 = VADD(T13, T14); + T1f = VSUB(T14, T13); + TW = VMUL(LDK(KP559016994), VSUB(Tf, Tq)); + TX = VFNMS(LDK(KP250000000), Tr, T4); + TY = VADD(TW, TX); + T1c = VSUB(TX, TW); + } + { + V T12, T19, T1i, T1j; + T12 = VADD(TY, T11); + T19 = VBYI(VSUB(T15, T18)); + ST(&(x[WS(rs, 19)]), VSUB(T12, T19), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T12, T19), ms, &(x[WS(rs, 1)])); + T1i = VADD(T1c, T1d); + T1j = VBYI(VADD(T1g, T1f)); + ST(&(x[WS(rs, 13)]), VSUB(T1i, T1j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T1i, T1j), ms, &(x[WS(rs, 1)])); + } + { + V T1a, T1b, T1e, T1h; + T1a = VSUB(TY, T11); + T1b = VBYI(VADD(T18, T15)); + ST(&(x[WS(rs, 11)]), VSUB(T1a, T1b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T1a, T1b), ms, &(x[WS(rs, 1)])); + T1e = VSUB(T1c, T1d); + T1h = VBYI(VSUB(T1f, T1g)); + ST(&(x[WS(rs, 17)]), VSUB(T1e, T1h), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T1e, T1h), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t2fv_20"), twinstr, &GENUS, {111, 50, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_20) (planner *p) { + X(kdft_dit_register) (p, t2fv_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_25.c new file mode 100644 index 000000000..0b811d73f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_25.c @@ -0,0 +1,942 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:47 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t2fv_25 -include dft/simd/t2f.h */ + +/* + * This function contains 248 FP additions, 241 FP multiplications, + * (or, 67 additions, 60 multiplications, 181 fused multiply/add), + * 147 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1, Te, Tc, Td, T1O, T2X, T3Q, T1x, T2K, T1u, T2L, T1y, T27, T3b, T2R; + V T2M, T2f, T3M, Ty, T2E, Tv, T2D, Tz, T2a, T3e, T2U, T2F, T2i, T3N, TK; + V T2B, TS, T2A, TT, T2b, T3f, T2T, T2C, T2j, T3P, T1d, T2H, T1a, T2I, T1e; + V T28, T3c, T2Q, T2J, T2g; + { + V T8, Ta, Tb, T3, T5, T6, T1M, T1N; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T7, T9, T2, T4; + T7 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 18]), T7); + T9 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 28]), T9); + Tb = VADD(T8, Ta); + T2 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[TWVL * 8]), T2); + T4 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 38]), T4); + T6 = VADD(T3, T5); + } + Te = VSUB(T6, Tb); + Tc = VADD(T6, Tb); + Td = VFNMS(LDK(KP250000000), Tc, T1); + T1M = VSUB(T3, T5); + T1N = VSUB(T8, Ta); + T1O = VFMA(LDK(KP618033988), T1N, T1M); + T2X = VFNMS(LDK(KP618033988), T1M, T1N); + } + { + V T1g, T1v, T1w, T1l, T1q, T1r, T1f, T1s, T1t; + T1f = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1g = BYTWJ(&(W[TWVL * 4]), T1f); + { + V T1i, T1p, T1k, T1n; + { + V T1h, T1o, T1j, T1m; + T1h = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1i = BYTWJ(&(W[TWVL * 14]), T1h); + T1o = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1p = BYTWJ(&(W[TWVL * 34]), T1o); + T1j = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1k = BYTWJ(&(W[TWVL * 44]), T1j); + T1m = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1n = BYTWJ(&(W[TWVL * 24]), T1m); + } + T1v = VSUB(T1i, T1k); + T1w = VSUB(T1n, T1p); + T1l = VADD(T1i, T1k); + T1q = VADD(T1n, T1p); + T1r = VADD(T1l, T1q); + } + T3Q = VADD(T1g, T1r); + T1x = VFMA(LDK(KP618033988), T1w, T1v); + T2K = VFNMS(LDK(KP618033988), T1v, T1w); + T1s = VFNMS(LDK(KP250000000), T1r, T1g); + T1t = VSUB(T1q, T1l); + T1u = VFNMS(LDK(KP559016994), T1t, T1s); + T2L = VFMA(LDK(KP559016994), T1t, T1s); + T1y = VFNMS(LDK(KP893101515), T1x, T1u); + T27 = VFNMS(LDK(KP120146378), T1x, T1u); + T3b = VFMA(LDK(KP066152395), T2L, T2K); + T2R = VFNMS(LDK(KP786782374), T2K, T2L); + T2M = VFMA(LDK(KP869845200), T2L, T2K); + T2f = VFMA(LDK(KP132830569), T1u, T1x); + } + { + V Th, Tw, Tx, Tm, Tr, Ts, Tg, Tt, Tu; + Tg = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Th = BYTWJ(&(W[0]), Tg); + { + V Tj, Tq, Tl, To; + { + V Ti, Tp, Tk, Tn; + Ti = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 10]), Ti); + Tp = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tq = BYTWJ(&(W[TWVL * 30]), Tp); + Tk = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tl = BYTWJ(&(W[TWVL * 40]), Tk); + Tn = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + To = BYTWJ(&(W[TWVL * 20]), Tn); + } + Tw = VSUB(Tj, Tl); + Tx = VSUB(Tq, To); + Tm = VADD(Tj, Tl); + Tr = VADD(To, Tq); + Ts = VADD(Tm, Tr); + } + T3M = VADD(Th, Ts); + Ty = VFNMS(LDK(KP618033988), Tx, Tw); + T2E = VFMA(LDK(KP618033988), Tw, Tx); + Tt = VFNMS(LDK(KP250000000), Ts, Th); + Tu = VSUB(Tm, Tr); + Tv = VFMA(LDK(KP559016994), Tu, Tt); + T2D = VFNMS(LDK(KP559016994), Tu, Tt); + Tz = VFNMS(LDK(KP244189809), Ty, Tv); + T2a = VFMA(LDK(KP667278218), Tv, Ty); + T3e = VFNMS(LDK(KP522847744), T2E, T2D); + T2U = VFNMS(LDK(KP987388751), T2D, T2E); + T2F = VFMA(LDK(KP893101515), T2E, T2D); + T2i = VFNMS(LDK(KP603558818), Ty, Tv); + } + { + V TM, TE, TJ, TN, TO, TP, TL, TQ, TR; + TL = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TM = BYTWJ(&(W[TWVL * 6]), TL); + { + V TB, TI, TD, TG; + { + V TA, TH, TC, TF; + TA = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TB = BYTWJ(&(W[TWVL * 46]), TA); + TH = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TI = BYTWJ(&(W[TWVL * 26]), TH); + TC = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TD = BYTWJ(&(W[TWVL * 16]), TC); + TF = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[TWVL * 36]), TF); + } + TE = VSUB(TB, TD); + TJ = VSUB(TG, TI); + TN = VADD(TD, TB); + TO = VADD(TI, TG); + TP = VADD(TN, TO); + } + T3N = VADD(TM, TP); + TK = VFMA(LDK(KP618033988), TJ, TE); + T2B = VFNMS(LDK(KP618033988), TE, TJ); + TQ = VFMS(LDK(KP250000000), TP, TM); + TR = VSUB(TN, TO); + TS = VFNMS(LDK(KP559016994), TR, TQ); + T2A = VFMA(LDK(KP559016994), TR, TQ); + TT = VFNMS(LDK(KP667278218), TS, TK); + T2b = VFMA(LDK(KP869845200), TS, TK); + T3f = VFNMS(LDK(KP494780565), T2A, T2B); + T2T = VFNMS(LDK(KP132830569), T2A, T2B); + T2C = VFMA(LDK(KP120146378), T2B, T2A); + T2j = VFNMS(LDK(KP786782374), TK, TS); + } + { + V TW, T1b, T1c, T11, T16, T17, TV, T18, T19; + TV = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TW = BYTWJ(&(W[TWVL * 2]), TV); + { + V TY, T15, T10, T13; + { + V TX, T14, TZ, T12; + TX = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TY = BYTWJ(&(W[TWVL * 12]), TX); + T14 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T15 = BYTWJ(&(W[TWVL * 32]), T14); + TZ = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T10 = BYTWJ(&(W[TWVL * 42]), TZ); + T12 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T13 = BYTWJ(&(W[TWVL * 22]), T12); + } + T1b = VSUB(TY, T10); + T1c = VSUB(T15, T13); + T11 = VADD(TY, T10); + T16 = VADD(T13, T15); + T17 = VADD(T11, T16); + } + T3P = VADD(TW, T17); + T1d = VFNMS(LDK(KP618033988), T1c, T1b); + T2H = VFMA(LDK(KP618033988), T1b, T1c); + T18 = VFNMS(LDK(KP250000000), T17, TW); + T19 = VSUB(T16, T11); + T1a = VFNMS(LDK(KP559016994), T19, T18); + T2I = VFMA(LDK(KP559016994), T19, T18); + T1e = VFNMS(LDK(KP522847744), T1d, T1a); + T28 = VFNMS(LDK(KP494780565), T1a, T1d); + T3c = VFNMS(LDK(KP667278218), T2I, T2H); + T2Q = VFNMS(LDK(KP059835404), T2H, T2I); + T2J = VFMA(LDK(KP066152395), T2I, T2H); + T2g = VFMA(LDK(KP447533225), T1d, T1a); + } + { + V T3Y, T40, T3L, T3S, T3T, T3U, T3Z, T3V; + { + V T3W, T3X, T3O, T3R; + T3W = VSUB(T3M, T3N); + T3X = VSUB(T3P, T3Q); + T3Y = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T3X, T3W)); + T40 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T3W, T3X)); + T3L = VADD(T1, Tc); + T3O = VADD(T3M, T3N); + T3R = VADD(T3P, T3Q); + T3S = VADD(T3O, T3R); + T3T = VFNMS(LDK(KP250000000), T3S, T3L); + T3U = VSUB(T3O, T3R); + } + ST(&(x[0]), VADD(T3S, T3L), ms, &(x[0])); + T3Z = VFNMS(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 10)]), VFMAI(T40, T3Z), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VFNMSI(T40, T3Z), ms, &(x[WS(rs, 1)])); + T3V = VFMA(LDK(KP559016994), T3U, T3T); + ST(&(x[WS(rs, 5)]), VFNMSI(T3Y, T3V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VFMAI(T3Y, T3V), ms, &(x[0])); + } + { + V T2Z, T35, T3B, T3I, T2W, T38, T2O, T32, T2z, T3t, T3h, T3s, T3p, T3F, T3r; + V T3v, T3C, T3z, T3A; + T2Z = VFMA(LDK(KP734762448), T2U, T2T); + T35 = VFNMS(LDK(KP734762448), T2F, T2C); + T3z = VFMA(LDK(KP845997307), T3c, T3b); + T3A = VFMA(LDK(KP982009705), T3f, T3e); + T3B = VFMA(LDK(KP570584518), T3A, T3z); + T3I = VFNMS(LDK(KP669429328), T3z, T3A); + { + V T2S, T2V, T37, T36; + T2S = VFMA(LDK(KP772036680), T2R, T2Q); + T2V = VFNMS(LDK(KP734762448), T2U, T2T); + T36 = VFMA(LDK(KP772036680), T2M, T2J); + T37 = VFMA(LDK(KP522616830), T2V, T36); + T2W = VFMA(LDK(KP945422727), T2V, T2S); + T38 = VFNMS(LDK(KP690983005), T37, T2S); + } + { + V T2N, T2G, T31, T30; + T2N = VFNMS(LDK(KP772036680), T2M, T2J); + T2G = VFMA(LDK(KP734762448), T2F, T2C); + T30 = VFNMS(LDK(KP772036680), T2R, T2Q); + T31 = VFNMS(LDK(KP522616830), T2G, T30); + T2O = VFMA(LDK(KP956723877), T2N, T2G); + T32 = VFMA(LDK(KP763932022), T31, T2N); + } + { + V T3o, T3u, T3l, T3m, T3n; + T2z = VFNMS(LDK(KP559016994), Te, Td); + T3m = VFMA(LDK(KP447533225), T2B, T2A); + T3n = VFMA(LDK(KP578046249), T2D, T2E); + T3o = VFNMS(LDK(KP921078979), T3n, T3m); + T3t = VFMA(LDK(KP921078979), T3n, T3m); + { + V T3d, T3g, T3j, T3k; + T3d = VFNMS(LDK(KP845997307), T3c, T3b); + T3g = VFNMS(LDK(KP982009705), T3f, T3e); + T3h = VFMA(LDK(KP923225144), T3g, T3d); + T3u = VFNMS(LDK(KP923225144), T3g, T3d); + T3j = VFNMS(LDK(KP059835404), T2K, T2L); + T3k = VFMA(LDK(KP603558818), T2H, T2I); + T3l = VFMA(LDK(KP845997307), T3k, T3j); + T3s = VFNMS(LDK(KP845997307), T3k, T3j); + } + T3p = VFNMS(LDK(KP906616052), T3o, T3l); + T3F = VFNMS(LDK(KP904508497), T3u, T3s); + T3r = VFNMS(LDK(KP237294955), T3h, T2z); + T3v = VFNMS(LDK(KP997675361), T3u, T3t); + T3C = VFMA(LDK(KP906616052), T3o, T3l); + } + { + V T2P, T2Y, T3i, T3q; + T2P = VFMA(LDK(KP992114701), T2O, T2z); + T2Y = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T2X, T2W)); + ST(&(x[WS(rs, 3)]), VFNMSI(T2Y, T2P), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 22)]), VFMAI(T2Y, T2P), ms, &(x[0])); + T3i = VFMA(LDK(KP949179823), T3h, T2z); + T3q = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T2X, T3p)); + ST(&(x[WS(rs, 2)]), VFNMSI(T3q, T3i), ms, &(x[0])); + ST(&(x[WS(rs, 23)]), VFMAI(T3q, T3i), ms, &(x[WS(rs, 1)])); + } + { + V T34, T3a, T33, T39; + T33 = VFNMS(LDK(KP855719849), T32, T2Z); + T34 = VFMA(LDK(KP897376177), T33, T2z); + T39 = VFMA(LDK(KP855719849), T38, T35); + T3a = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T39, T2X)); + ST(&(x[WS(rs, 8)]), VFNMSI(T3a, T34), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VFMAI(T3a, T34), ms, &(x[WS(rs, 1)])); + } + { + V T3x, T3H, T3E, T3K, T3w; + T3w = VFMA(LDK(KP560319534), T3v, T3s); + T3x = VFNMS(LDK(KP949179823), T3w, T3r); + { + V T3G, T3y, T3J, T3D; + T3G = VFNMS(LDK(KP681693190), T3F, T3t); + T3H = VFNMS(LDK(KP860541664), T3G, T3r); + T3y = VFMA(LDK(KP262346850), T3p, T2X); + T3J = VFNMS(LDK(KP669429328), T3C, T3I); + T3D = VFMA(LDK(KP618033988), T3C, T3B); + T3E = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T3D, T3y)); + T3K = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T3J, T3y)); + } + ST(&(x[WS(rs, 13)]), VFNMSI(T3E, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T3K, T3H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VFMAI(T3E, T3x), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFNMSI(T3K, T3H), ms, &(x[0])); + } + } + { + V T2n, T2t, T1V, T22, T2l, T2w, T2d, T2q, Tf, T1I, T1A, T1E, T1B, T1Z, T1J; + V T1R, T1W, T1T, T1U; + T2n = VFNMS(LDK(KP912575812), T2j, T2i); + T2t = VFNMS(LDK(KP912575812), T2b, T2a); + T1T = VFNMS(LDK(KP829049696), TT, Tz); + T1U = VFNMS(LDK(KP831864738), T1y, T1e); + T1V = VFMA(LDK(KP559154169), T1U, T1T); + T22 = VFNMS(LDK(KP683113946), T1T, T1U); + { + V T2h, T2k, T2v, T2u; + T2h = VFMA(LDK(KP958953096), T2g, T2f); + T2k = VFMA(LDK(KP912575812), T2j, T2i); + T2u = VFMA(LDK(KP867381224), T28, T27); + T2v = VFMA(LDK(KP447417479), T2k, T2u); + T2l = VFMA(LDK(KP894834959), T2k, T2h); + T2w = VFNMS(LDK(KP763932022), T2v, T2h); + } + { + V T29, T2c, T2p, T2o; + T29 = VFNMS(LDK(KP867381224), T28, T27); + T2c = VFMA(LDK(KP912575812), T2b, T2a); + T2o = VFNMS(LDK(KP958953096), T2g, T2f); + T2p = VFMA(LDK(KP447417479), T2c, T2o); + T2d = VFNMS(LDK(KP809385824), T2c, T29); + T2q = VFMA(LDK(KP690983005), T2p, T29); + } + { + V T1Q, T1F, T1P, T1G, T1H; + Tf = VFMA(LDK(KP559016994), Te, Td); + T1G = VFMA(LDK(KP578046249), T1a, T1d); + T1H = VFMA(LDK(KP987388751), T1u, T1x); + T1I = VFNMS(LDK(KP831864738), T1H, T1G); + T1Q = VFMA(LDK(KP831864738), T1H, T1G); + { + V TU, T1z, T1C, T1D; + TU = VFMA(LDK(KP829049696), TT, Tz); + T1z = VFMA(LDK(KP831864738), T1y, T1e); + T1A = VFMA(LDK(KP904730450), T1z, TU); + T1F = VFNMS(LDK(KP904730450), T1z, TU); + T1C = VFMA(LDK(KP269969613), Tv, Ty); + T1D = VFMA(LDK(KP603558818), TK, TS); + T1E = VFMA(LDK(KP916574801), T1D, T1C); + T1P = VFNMS(LDK(KP916574801), T1D, T1C); + } + T1B = VFNMS(LDK(KP242145790), T1A, Tf); + T1Z = VADD(T1E, T1F); + T1J = VFNMS(LDK(KP904730450), T1I, T1F); + T1R = VFMA(LDK(KP904730450), T1Q, T1P); + T1W = VFNMS(LDK(KP904730450), T1Q, T1P); + } + { + V T25, T26, T2e, T2m; + T25 = VFMA(LDK(KP968583161), T1A, Tf); + T26 = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1R, T1O)); + ST(&(x[WS(rs, 1)]), VFNMSI(T26, T25), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VFMAI(T26, T25), ms, &(x[0])); + T2e = VFNMS(LDK(KP992114701), T2d, Tf); + T2m = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2l, T1O)); + ST(&(x[WS(rs, 4)]), VFMAI(T2m, T2e), ms, &(x[0])); + ST(&(x[WS(rs, 21)]), VFNMSI(T2m, T2e), ms, &(x[WS(rs, 1)])); + } + { + V T2s, T2y, T2r, T2x; + T2r = VFNMS(LDK(KP999544308), T2q, T2n); + T2s = VFNMS(LDK(KP803003575), T2r, Tf); + T2x = VFNMS(LDK(KP999544308), T2w, T2t); + T2y = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T2x, T1O)); + ST(&(x[WS(rs, 16)]), VFNMSI(T2y, T2s), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VFMAI(T2y, T2s), ms, &(x[WS(rs, 1)])); + } + { + V T1L, T21, T1Y, T24, T1K; + T1K = VFNMS(LDK(KP618033988), T1J, T1E); + T1L = VFNMS(LDK(KP876091699), T1K, T1B); + { + V T20, T1S, T23, T1X; + T20 = VFNMS(LDK(KP683113946), T1Z, T1I); + T21 = VFMA(LDK(KP792626838), T20, T1B); + T1S = VFNMS(LDK(KP242145790), T1R, T1O); + T23 = VFMA(LDK(KP617882369), T1W, T22); + T1X = VFMA(LDK(KP559016994), T1W, T1V); + T1Y = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T1X, T1S)); + T24 = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T23, T1S)); + } + ST(&(x[WS(rs, 6)]), VFNMSI(T1Y, T1L), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFMAI(T24, T21), ms, &(x[0])); + ST(&(x[WS(rs, 19)]), VFMAI(T1Y, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(T24, T21), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t2fv_25"), twinstr, &GENUS, {67, 60, 181, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_25) (planner *p) { + X(kdft_dit_register) (p, t2fv_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 25 -name t2fv_25 -include dft/simd/t2f.h */ + +/* + * This function contains 248 FP additions, 188 FP multiplications, + * (or, 170 additions, 110 multiplications, 78 fused multiply/add), + * 99 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 48)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 48), MAKE_VOLATILE_STRIDE(25, rs)) { + V Tc, Tb, Td, Te, T1C, T2t, T1E, T1x, T2m, T1u, T3c, T2n, Ty, T2i, Tv; + V T38, T2j, TS, T2f, TP, T39, T2g, T1d, T2p, T1a, T3b, T2q; + { + V T7, T9, Ta, T2, T4, T5, T1D; + Tc = LD(&(x[0]), ms, &(x[0])); + { + V T6, T8, T1, T3; + T6 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 18]), T6); + T8 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 28]), T8); + Ta = VADD(T7, T9); + T1 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[TWVL * 8]), T1); + T3 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T4 = BYTWJ(&(W[TWVL * 38]), T3); + T5 = VADD(T2, T4); + } + Tb = VMUL(LDK(KP559016994), VSUB(T5, Ta)); + Td = VADD(T5, Ta); + Te = VFNMS(LDK(KP250000000), Td, Tc); + T1C = VSUB(T2, T4); + T1D = VSUB(T7, T9); + T2t = VMUL(LDK(KP951056516), T1D); + T1E = VFMA(LDK(KP951056516), T1C, VMUL(LDK(KP587785252), T1D)); + } + { + V T1r, T1l, T1n, T1o, T1g, T1i, T1j, T1q; + T1q = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1r = BYTWJ(&(W[TWVL * 4]), T1q); + { + V T1k, T1m, T1f, T1h; + T1k = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1l = BYTWJ(&(W[TWVL * 24]), T1k); + T1m = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1n = BYTWJ(&(W[TWVL * 34]), T1m); + T1o = VADD(T1l, T1n); + T1f = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1g = BYTWJ(&(W[TWVL * 14]), T1f); + T1h = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1i = BYTWJ(&(W[TWVL * 44]), T1h); + T1j = VADD(T1g, T1i); + } + { + V T1v, T1w, T1p, T1s, T1t; + T1v = VSUB(T1g, T1i); + T1w = VSUB(T1l, T1n); + T1x = VFMA(LDK(KP475528258), T1v, VMUL(LDK(KP293892626), T1w)); + T2m = VFNMS(LDK(KP293892626), T1v, VMUL(LDK(KP475528258), T1w)); + T1p = VMUL(LDK(KP559016994), VSUB(T1j, T1o)); + T1s = VADD(T1j, T1o); + T1t = VFNMS(LDK(KP250000000), T1s, T1r); + T1u = VADD(T1p, T1t); + T3c = VADD(T1r, T1s); + T2n = VSUB(T1t, T1p); + } + } + { + V Ts, Tm, To, Tp, Th, Tj, Tk, Tr; + Tr = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ts = BYTWJ(&(W[0]), Tr); + { + V Tl, Tn, Tg, Ti; + Tl = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tm = BYTWJ(&(W[TWVL * 20]), Tl); + Tn = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + To = BYTWJ(&(W[TWVL * 30]), Tn); + Tp = VADD(Tm, To); + Tg = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 10]), Tg); + Ti = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tj = BYTWJ(&(W[TWVL * 40]), Ti); + Tk = VADD(Th, Tj); + } + { + V Tw, Tx, Tq, Tt, Tu; + Tw = VSUB(Th, Tj); + Tx = VSUB(Tm, To); + Ty = VFMA(LDK(KP475528258), Tw, VMUL(LDK(KP293892626), Tx)); + T2i = VFNMS(LDK(KP293892626), Tw, VMUL(LDK(KP475528258), Tx)); + Tq = VMUL(LDK(KP559016994), VSUB(Tk, Tp)); + Tt = VADD(Tk, Tp); + Tu = VFNMS(LDK(KP250000000), Tt, Ts); + Tv = VADD(Tq, Tu); + T38 = VADD(Ts, Tt); + T2j = VSUB(Tu, Tq); + } + } + { + V TM, TG, TI, TJ, TB, TD, TE, TL; + TL = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TM = BYTWJ(&(W[TWVL * 6]), TL); + { + V TF, TH, TA, TC; + TF = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TG = BYTWJ(&(W[TWVL * 26]), TF); + TH = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TI = BYTWJ(&(W[TWVL * 36]), TH); + TJ = VADD(TG, TI); + TA = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TB = BYTWJ(&(W[TWVL * 16]), TA); + TC = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TD = BYTWJ(&(W[TWVL * 46]), TC); + TE = VADD(TB, TD); + } + { + V TQ, TR, TK, TN, TO; + TQ = VSUB(TB, TD); + TR = VSUB(TG, TI); + TS = VFMA(LDK(KP475528258), TQ, VMUL(LDK(KP293892626), TR)); + T2f = VFNMS(LDK(KP293892626), TQ, VMUL(LDK(KP475528258), TR)); + TK = VMUL(LDK(KP559016994), VSUB(TE, TJ)); + TN = VADD(TE, TJ); + TO = VFNMS(LDK(KP250000000), TN, TM); + TP = VADD(TK, TO); + T39 = VADD(TM, TN); + T2g = VSUB(TO, TK); + } + } + { + V T17, T11, T13, T14, TW, TY, TZ, T16; + T16 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T17 = BYTWJ(&(W[TWVL * 2]), T16); + { + V T10, T12, TV, TX; + T10 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T11 = BYTWJ(&(W[TWVL * 22]), T10); + T12 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T13 = BYTWJ(&(W[TWVL * 32]), T12); + T14 = VADD(T11, T13); + TV = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TW = BYTWJ(&(W[TWVL * 12]), TV); + TX = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TY = BYTWJ(&(W[TWVL * 42]), TX); + TZ = VADD(TW, TY); + } + { + V T1b, T1c, T15, T18, T19; + T1b = VSUB(TW, TY); + T1c = VSUB(T11, T13); + T1d = VFMA(LDK(KP475528258), T1b, VMUL(LDK(KP293892626), T1c)); + T2p = VFNMS(LDK(KP293892626), T1b, VMUL(LDK(KP475528258), T1c)); + T15 = VMUL(LDK(KP559016994), VSUB(TZ, T14)); + T18 = VADD(TZ, T14); + T19 = VFNMS(LDK(KP250000000), T18, T17); + T1a = VADD(T15, T19); + T3b = VADD(T17, T18); + T2q = VSUB(T19, T15); + } + } + { + V T3l, T3m, T3f, T3g, T3e, T3h, T3n, T3i; + { + V T3j, T3k, T3a, T3d; + T3j = VSUB(T38, T39); + T3k = VSUB(T3b, T3c); + T3l = VBYI(VFMA(LDK(KP951056516), T3j, VMUL(LDK(KP587785252), T3k))); + T3m = VBYI(VFNMS(LDK(KP587785252), T3j, VMUL(LDK(KP951056516), T3k))); + T3f = VADD(Tc, Td); + T3a = VADD(T38, T39); + T3d = VADD(T3b, T3c); + T3g = VADD(T3a, T3d); + T3e = VMUL(LDK(KP559016994), VSUB(T3a, T3d)); + T3h = VFNMS(LDK(KP250000000), T3g, T3f); + } + ST(&(x[0]), VADD(T3f, T3g), ms, &(x[0])); + T3n = VSUB(T3h, T3e); + ST(&(x[WS(rs, 10)]), VADD(T3m, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VSUB(T3n, T3m), ms, &(x[WS(rs, 1)])); + T3i = VADD(T3e, T3h); + ST(&(x[WS(rs, 5)]), VSUB(T3i, T3l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VADD(T3l, T3i), ms, &(x[0])); + } + { + V Tf, T1Z, T20, T21, T29, T2a, T2b, T26, T27, T28, T22, T23, T24, T1L, T1U; + V T1Q, T1S, T1A, T1V, T1N, T1O, T2d, T2e; + Tf = VADD(Tb, Te); + T1Z = VFMA(LDK(KP1_688655851), Ty, VMUL(LDK(KP535826794), Tv)); + T20 = VFMA(LDK(KP1_541026485), TS, VMUL(LDK(KP637423989), TP)); + T21 = VSUB(T1Z, T20); + T29 = VFMA(LDK(KP851558583), T1d, VMUL(LDK(KP904827052), T1a)); + T2a = VFMA(LDK(KP1_984229402), T1x, VMUL(LDK(KP125333233), T1u)); + T2b = VADD(T29, T2a); + T26 = VFNMS(LDK(KP844327925), Tv, VMUL(LDK(KP1_071653589), Ty)); + T27 = VFNMS(LDK(KP1_274847979), TS, VMUL(LDK(KP770513242), TP)); + T28 = VADD(T26, T27); + T22 = VFNMS(LDK(KP425779291), T1a, VMUL(LDK(KP1_809654104), T1d)); + T23 = VFNMS(LDK(KP992114701), T1u, VMUL(LDK(KP250666467), T1x)); + T24 = VADD(T22, T23); + { + V T1F, T1G, T1H, T1I, T1J, T1K; + T1F = VFMA(LDK(KP1_937166322), Ty, VMUL(LDK(KP248689887), Tv)); + T1G = VFMA(LDK(KP1_071653589), TS, VMUL(LDK(KP844327925), TP)); + T1H = VADD(T1F, T1G); + T1I = VFMA(LDK(KP1_752613360), T1d, VMUL(LDK(KP481753674), T1a)); + T1J = VFMA(LDK(KP1_457937254), T1x, VMUL(LDK(KP684547105), T1u)); + T1K = VADD(T1I, T1J); + T1L = VADD(T1H, T1K); + T1U = VSUB(T1J, T1I); + T1Q = VMUL(LDK(KP559016994), VSUB(T1K, T1H)); + T1S = VSUB(T1G, T1F); + } + { + V Tz, TT, TU, T1e, T1y, T1z; + Tz = VFNMS(LDK(KP497379774), Ty, VMUL(LDK(KP968583161), Tv)); + TT = VFNMS(LDK(KP1_688655851), TS, VMUL(LDK(KP535826794), TP)); + TU = VADD(Tz, TT); + T1e = VFNMS(LDK(KP963507348), T1d, VMUL(LDK(KP876306680), T1a)); + T1y = VFNMS(LDK(KP1_369094211), T1x, VMUL(LDK(KP728968627), T1u)); + T1z = VADD(T1e, T1y); + T1A = VADD(TU, T1z); + T1V = VMUL(LDK(KP559016994), VSUB(TU, T1z)); + T1N = VSUB(TT, Tz); + T1O = VSUB(T1e, T1y); + } + { + V T1B, T1M, T25, T2c; + T1B = VADD(Tf, T1A); + T1M = VBYI(VADD(T1E, T1L)); + ST(&(x[WS(rs, 1)]), VSUB(T1B, T1M), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VADD(T1B, T1M), ms, &(x[0])); + T25 = VADD(Tf, VADD(T21, T24)); + T2c = VBYI(VADD(T1E, VSUB(T28, T2b))); + ST(&(x[WS(rs, 21)]), VSUB(T25, T2c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T25, T2c), ms, &(x[0])); + } + T2d = VBYI(VADD(T1E, VFMA(LDK(KP309016994), T28, VFMA(LDK(KP587785252), VSUB(T23, T22), VFNMS(LDK(KP951056516), VADD(T1Z, T20), VMUL(LDK(KP809016994), T2b)))))); + T2e = VFMA(LDK(KP309016994), T21, VFMA(LDK(KP951056516), VSUB(T26, T27), VFMA(LDK(KP587785252), VSUB(T2a, T29), VFNMS(LDK(KP809016994), T24, Tf)))); + ST(&(x[WS(rs, 9)]), VADD(T2d, T2e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VSUB(T2e, T2d), ms, &(x[0])); + { + V T1R, T1X, T1W, T1Y, T1P, T1T; + T1P = VFMS(LDK(KP250000000), T1L, T1E); + T1R = VBYI(VADD(VFMA(LDK(KP587785252), T1N, VMUL(LDK(KP951056516), T1O)), VSUB(T1P, T1Q))); + T1X = VBYI(VADD(VFNMS(LDK(KP587785252), T1O, VMUL(LDK(KP951056516), T1N)), VADD(T1P, T1Q))); + T1T = VFNMS(LDK(KP250000000), T1A, Tf); + T1W = VFMA(LDK(KP587785252), T1S, VFNMS(LDK(KP951056516), T1U, VSUB(T1T, T1V))); + T1Y = VFMA(LDK(KP951056516), T1S, VADD(T1V, VFMA(LDK(KP587785252), T1U, T1T))); + ST(&(x[WS(rs, 11)]), VADD(T1R, T1W), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VSUB(T1Y, T1X), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 14)]), VSUB(T1W, T1R), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T1X, T1Y), ms, &(x[0])); + } + } + { + V T2u, T2w, T2h, T2k, T2l, T2A, T2B, T2C, T2o, T2r, T2s, T2x, T2y, T2z, T2M; + V T2X, T2N, T2W, T2R, T31, T2U, T30, T2E, T2F; + T2u = VFNMS(LDK(KP587785252), T1C, T2t); + T2w = VSUB(Te, Tb); + T2h = VFNMS(LDK(KP125333233), T2g, VMUL(LDK(KP1_984229402), T2f)); + T2k = VFMA(LDK(KP1_457937254), T2i, VMUL(LDK(KP684547105), T2j)); + T2l = VSUB(T2h, T2k); + T2A = VFNMS(LDK(KP1_996053456), T2p, VMUL(LDK(KP062790519), T2q)); + T2B = VFMA(LDK(KP1_541026485), T2m, VMUL(LDK(KP637423989), T2n)); + T2C = VSUB(T2A, T2B); + T2o = VFNMS(LDK(KP770513242), T2n, VMUL(LDK(KP1_274847979), T2m)); + T2r = VFMA(LDK(KP125581039), T2p, VMUL(LDK(KP998026728), T2q)); + T2s = VSUB(T2o, T2r); + T2x = VFNMS(LDK(KP1_369094211), T2i, VMUL(LDK(KP728968627), T2j)); + T2y = VFMA(LDK(KP250666467), T2f, VMUL(LDK(KP992114701), T2g)); + T2z = VSUB(T2x, T2y); + { + V T2G, T2H, T2I, T2J, T2K, T2L; + T2G = VFNMS(LDK(KP481753674), T2j, VMUL(LDK(KP1_752613360), T2i)); + T2H = VFMA(LDK(KP851558583), T2f, VMUL(LDK(KP904827052), T2g)); + T2I = VSUB(T2G, T2H); + T2J = VFNMS(LDK(KP844327925), T2q, VMUL(LDK(KP1_071653589), T2p)); + T2K = VFNMS(LDK(KP998026728), T2n, VMUL(LDK(KP125581039), T2m)); + T2L = VADD(T2J, T2K); + T2M = VMUL(LDK(KP559016994), VSUB(T2I, T2L)); + T2X = VSUB(T2J, T2K); + T2N = VADD(T2I, T2L); + T2W = VADD(T2G, T2H); + } + { + V T2P, T2Q, T2Y, T2S, T2T, T2Z; + T2P = VFNMS(LDK(KP425779291), T2g, VMUL(LDK(KP1_809654104), T2f)); + T2Q = VFMA(LDK(KP963507348), T2i, VMUL(LDK(KP876306680), T2j)); + T2Y = VADD(T2Q, T2P); + T2S = VFMA(LDK(KP1_688655851), T2p, VMUL(LDK(KP535826794), T2q)); + T2T = VFMA(LDK(KP1_996053456), T2m, VMUL(LDK(KP062790519), T2n)); + T2Z = VADD(T2S, T2T); + T2R = VSUB(T2P, T2Q); + T31 = VADD(T2Y, T2Z); + T2U = VSUB(T2S, T2T); + T30 = VMUL(LDK(KP559016994), VSUB(T2Y, T2Z)); + } + { + V T36, T37, T2v, T2D; + T36 = VBYI(VADD(T2u, T2N)); + T37 = VADD(T2w, T31); + ST(&(x[WS(rs, 2)]), VADD(T36, T37), ms, &(x[0])); + ST(&(x[WS(rs, 23)]), VSUB(T37, T36), ms, &(x[WS(rs, 1)])); + T2v = VBYI(VSUB(VADD(T2l, T2s), T2u)); + T2D = VADD(T2w, VADD(T2z, T2C)); + ST(&(x[WS(rs, 3)]), VADD(T2v, T2D), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 22)]), VSUB(T2D, T2v), ms, &(x[0])); + } + T2E = VFMA(LDK(KP309016994), T2z, VFNMS(LDK(KP809016994), T2C, VFNMS(LDK(KP587785252), VADD(T2r, T2o), VFNMS(LDK(KP951056516), VADD(T2k, T2h), T2w)))); + T2F = VBYI(VSUB(VFNMS(LDK(KP587785252), VADD(T2A, T2B), VFNMS(LDK(KP809016994), T2s, VFNMS(LDK(KP951056516), VADD(T2x, T2y), VMUL(LDK(KP309016994), T2l)))), T2u)); + ST(&(x[WS(rs, 17)]), VSUB(T2E, T2F), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VADD(T2E, T2F), ms, &(x[0])); + { + V T2V, T34, T33, T35, T2O, T32; + T2O = VFNMS(LDK(KP250000000), T2N, T2u); + T2V = VBYI(VADD(T2M, VADD(T2O, VFNMS(LDK(KP587785252), T2U, VMUL(LDK(KP951056516), T2R))))); + T34 = VBYI(VADD(T2O, VSUB(VFMA(LDK(KP587785252), T2R, VMUL(LDK(KP951056516), T2U)), T2M))); + T32 = VFNMS(LDK(KP250000000), T31, T2w); + T33 = VFMA(LDK(KP951056516), T2W, VFMA(LDK(KP587785252), T2X, VADD(T30, T32))); + T35 = VFMA(LDK(KP587785252), T2W, VSUB(VFNMS(LDK(KP951056516), T2X, T32), T30)); + ST(&(x[WS(rs, 7)]), VADD(T2V, T33), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T35, T34), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 18)]), VSUB(T33, T2V), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T34, T35), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t2fv_25"), twinstr, &GENUS, {170, 110, 78, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_25) (planner *p) { + X(kdft_dit_register) (p, t2fv_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_32.c new file mode 100644 index 000000000..004801494 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_32.c @@ -0,0 +1,898 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:43 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t2fv_32 -include dft/simd/t2f.h */ + +/* + * This function contains 217 FP additions, 160 FP multiplications, + * (or, 119 additions, 62 multiplications, 98 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1z, T2o, T32, Tf, T1A, T2r, T3f, TC, T1D, T2L, T34, Tr, T1C, T2O; + V T33, T1k, T20, T2F, T3b, T1r, T21, T2C, T3a, TV, T1X, T2y, T38, T12, T1Y; + V T2v, T37; + { + V T1, T1y, T3, T1w, T1x, T2, T1v, T2m, T2n; + T1 = LD(&(x[0]), ms, &(x[0])); + T1x = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1y = BYTWJ(&(W[TWVL * 46]), T1x); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 30]), T2); + T1v = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1w = BYTWJ(&(W[TWVL * 14]), T1v); + T4 = VSUB(T1, T3); + T1z = VSUB(T1w, T1y); + T2m = VADD(T1, T3); + T2n = VADD(T1w, T1y); + T2o = VADD(T2m, T2n); + T32 = VSUB(T2m, T2n); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2p, T2q; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VADD(T9, Te); + T1A = VSUB(Te, T9); + T2p = VADD(T6, T8); + T2q = VADD(Tb, Td); + T2r = VADD(T2p, T2q); + T3f = VSUB(T2q, T2p); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Tt = BYTWJ(&(W[TWVL * 58]), Ts); + Tz = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 10]), Tz); + Tu = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tv = BYTWJ(&(W[TWVL * 26]), Tu); + Tx = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + Ty = BYTWJ(&(W[TWVL * 42]), Tx); + } + { + V Tw, TB, T2J, T2K; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFNMS(LDK(KP414213562), TB, Tw); + T1D = VFMA(LDK(KP414213562), Tw, TB); + T2J = VADD(Tt, Tv); + T2K = VADD(TA, Ty); + T2L = VADD(T2J, T2K); + T34 = VSUB(T2J, T2K); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2M, T2N; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFNMS(LDK(KP414213562), Tq, Tl); + T1C = VFMA(LDK(KP414213562), Tl, Tq); + T2M = VADD(Ti, Tk); + T2N = VADD(Tn, Tp); + T2O = VADD(T2M, T2N); + T33 = VSUB(T2M, T2N); + } + } + { + V T15, T17, T1o, T1m, T1f, T1h, T1i, T1a, T1c, T1d; + { + V T14, T16, T1n, T1l; + T14 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T15 = BYTWJ(&(W[TWVL * 60]), T14); + T16 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T17 = BYTWJ(&(W[TWVL * 28]), T16); + T1n = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1o = BYTWJ(&(W[TWVL * 12]), T1n); + T1l = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1m = BYTWJ(&(W[TWVL * 44]), T1l); + { + V T1e, T1g, T19, T1b; + T1e = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1f = BYTWJ(&(W[TWVL * 52]), T1e); + T1g = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1h = BYTWJ(&(W[TWVL * 20]), T1g); + T1i = VSUB(T1f, T1h); + T19 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1a = BYTWJ(&(W[TWVL * 4]), T19); + T1b = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1c = BYTWJ(&(W[TWVL * 36]), T1b); + T1d = VSUB(T1a, T1c); + } + } + { + V T18, T1j, T2D, T2E; + T18 = VSUB(T15, T17); + T1j = VADD(T1d, T1i); + T1k = VFMA(LDK(KP707106781), T1j, T18); + T20 = VFNMS(LDK(KP707106781), T1j, T18); + T2D = VADD(T1a, T1c); + T2E = VADD(T1f, T1h); + T2F = VADD(T2D, T2E); + T3b = VSUB(T2E, T2D); + } + { + V T1p, T1q, T2A, T2B; + T1p = VSUB(T1m, T1o); + T1q = VSUB(T1i, T1d); + T1r = VFMA(LDK(KP707106781), T1q, T1p); + T21 = VFNMS(LDK(KP707106781), T1q, T1p); + T2A = VADD(T15, T17); + T2B = VADD(T1o, T1m); + T2C = VADD(T2A, T2B); + T3a = VSUB(T2A, T2B); + } + } + { + V TG, TI, TZ, TX, TQ, TS, TT, TL, TN, TO; + { + V TF, TH, TY, TW; + TF = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[0]), TF); + TH = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TI = BYTWJ(&(W[TWVL * 32]), TH); + TY = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + TZ = BYTWJ(&(W[TWVL * 48]), TY); + TW = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TX = BYTWJ(&(W[TWVL * 16]), TW); + { + V TP, TR, TK, TM; + TP = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TQ = BYTWJ(&(W[TWVL * 56]), TP); + TR = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TS = BYTWJ(&(W[TWVL * 24]), TR); + TT = VSUB(TQ, TS); + TK = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TL = BYTWJ(&(W[TWVL * 8]), TK); + TM = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TN = BYTWJ(&(W[TWVL * 40]), TM); + TO = VSUB(TL, TN); + } + } + { + V TJ, TU, T2w, T2x; + TJ = VSUB(TG, TI); + TU = VADD(TO, TT); + TV = VFMA(LDK(KP707106781), TU, TJ); + T1X = VFNMS(LDK(KP707106781), TU, TJ); + T2w = VADD(TL, TN); + T2x = VADD(TQ, TS); + T2y = VADD(T2w, T2x); + T38 = VSUB(T2w, T2x); + } + { + V T10, T11, T2t, T2u; + T10 = VSUB(TX, TZ); + T11 = VSUB(TO, TT); + T12 = VFMA(LDK(KP707106781), T11, T10); + T1Y = VFNMS(LDK(KP707106781), T11, T10); + T2t = VADD(TG, TI); + T2u = VADD(TX, TZ); + T2v = VADD(T2t, T2u); + T37 = VSUB(T2t, T2u); + } + } + { + V T2W, T30, T2Z, T31; + { + V T2U, T2V, T2X, T2Y; + T2U = VADD(T2o, T2r); + T2V = VADD(T2O, T2L); + T2W = VADD(T2U, T2V); + T30 = VSUB(T2U, T2V); + T2X = VADD(T2v, T2y); + T2Y = VADD(T2C, T2F); + T2Z = VADD(T2X, T2Y); + T31 = VSUB(T2Y, T2X); + } + ST(&(x[WS(rs, 16)]), VSUB(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T31, T30), ms, &(x[0])); + ST(&(x[0]), VADD(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VFNMSI(T31, T30), ms, &(x[0])); + } + { + V T2s, T2P, T2H, T2Q, T2z, T2G; + T2s = VSUB(T2o, T2r); + T2P = VSUB(T2L, T2O); + T2z = VSUB(T2v, T2y); + T2G = VSUB(T2C, T2F); + T2H = VADD(T2z, T2G); + T2Q = VSUB(T2G, T2z); + { + V T2I, T2R, T2S, T2T; + T2I = VFNMS(LDK(KP707106781), T2H, T2s); + T2R = VFNMS(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 12)]), VFNMSI(T2R, T2I), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VFMAI(T2R, T2I), ms, &(x[0])); + T2S = VFMA(LDK(KP707106781), T2H, T2s); + T2T = VFMA(LDK(KP707106781), T2Q, T2P); + ST(&(x[WS(rs, 28)]), VFNMSI(T2T, T2S), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T2T, T2S), ms, &(x[0])); + } + } + { + V T36, T3o, T3h, T3r, T3d, T3s, T3k, T3p, T35, T3g; + T35 = VADD(T33, T34); + T36 = VFMA(LDK(KP707106781), T35, T32); + T3o = VFNMS(LDK(KP707106781), T35, T32); + T3g = VSUB(T34, T33); + T3h = VFMA(LDK(KP707106781), T3g, T3f); + T3r = VFNMS(LDK(KP707106781), T3g, T3f); + { + V T39, T3c, T3i, T3j; + T39 = VFNMS(LDK(KP414213562), T38, T37); + T3c = VFNMS(LDK(KP414213562), T3b, T3a); + T3d = VADD(T39, T3c); + T3s = VSUB(T3c, T39); + T3i = VFMA(LDK(KP414213562), T3a, T3b); + T3j = VFMA(LDK(KP414213562), T37, T38); + T3k = VSUB(T3i, T3j); + T3p = VADD(T3j, T3i); + } + { + V T3e, T3l, T3u, T3v; + T3e = VFNMS(LDK(KP923879532), T3d, T36); + T3l = VFNMS(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 14)]), VFNMSI(T3l, T3e), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3l, T3e), ms, &(x[0])); + T3u = VFMA(LDK(KP923879532), T3p, T3o); + T3v = VFNMS(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 6)]), VFNMSI(T3v, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3v, T3u), ms, &(x[0])); + } + { + V T3m, T3n, T3q, T3t; + T3m = VFMA(LDK(KP923879532), T3d, T36); + T3n = VFMA(LDK(KP923879532), T3k, T3h); + ST(&(x[WS(rs, 30)]), VFNMSI(T3n, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3n, T3m), ms, &(x[0])); + T3q = VFNMS(LDK(KP923879532), T3p, T3o); + T3t = VFMA(LDK(KP923879532), T3s, T3r); + ST(&(x[WS(rs, 10)]), VFMAI(T3t, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VFNMSI(T3t, T3q), ms, &(x[0])); + } + } + { + V TE, T1M, T1I, T1N, T1t, T1Q, T1F, T1P; + { + V Tg, TD, T1G, T1H; + Tg = VFMA(LDK(KP707106781), Tf, T4); + TD = VADD(Tr, TC); + TE = VFMA(LDK(KP923879532), TD, Tg); + T1M = VFNMS(LDK(KP923879532), TD, Tg); + T1G = VFMA(LDK(KP198912367), TV, T12); + T1H = VFMA(LDK(KP198912367), T1k, T1r); + T1I = VSUB(T1G, T1H); + T1N = VADD(T1G, T1H); + } + { + V T13, T1s, T1B, T1E; + T13 = VFNMS(LDK(KP198912367), T12, TV); + T1s = VFNMS(LDK(KP198912367), T1r, T1k); + T1t = VADD(T13, T1s); + T1Q = VSUB(T1s, T13); + T1B = VFNMS(LDK(KP707106781), T1A, T1z); + T1E = VSUB(T1C, T1D); + T1F = VFMA(LDK(KP923879532), T1E, T1B); + T1P = VFNMS(LDK(KP923879532), T1E, T1B); + } + { + V T1u, T1J, T1S, T1T; + T1u = VFNMS(LDK(KP980785280), T1t, TE); + T1J = VFNMS(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 17)]), VFNMSI(T1J, T1u), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T1J, T1u), ms, &(x[WS(rs, 1)])); + T1S = VFMA(LDK(KP980785280), T1N, T1M); + T1T = VFMA(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 7)]), VFMAI(T1T, T1S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFNMSI(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VFMA(LDK(KP980785280), T1t, TE); + T1L = VFMA(LDK(KP980785280), T1I, T1F); + ST(&(x[WS(rs, 1)]), VFNMSI(T1L, T1K), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VFMAI(T1L, T1K), ms, &(x[WS(rs, 1)])); + T1O = VFNMS(LDK(KP980785280), T1N, T1M); + T1R = VFNMS(LDK(KP980785280), T1Q, T1P); + ST(&(x[WS(rs, 9)]), VFNMSI(T1R, T1O), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VFMAI(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2e, T2a, T2f, T23, T2i, T27, T2h; + { + V T1U, T1V, T28, T29; + T1U = VFNMS(LDK(KP707106781), Tf, T4); + T1V = VADD(T1C, T1D); + T1W = VFMA(LDK(KP923879532), T1V, T1U); + T2e = VFNMS(LDK(KP923879532), T1V, T1U); + T28 = VFNMS(LDK(KP668178637), T1X, T1Y); + T29 = VFNMS(LDK(KP668178637), T20, T21); + T2a = VSUB(T28, T29); + T2f = VADD(T28, T29); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP668178637), T1Y, T1X); + T22 = VFMA(LDK(KP668178637), T21, T20); + T23 = VADD(T1Z, T22); + T2i = VSUB(T22, T1Z); + T25 = VFMA(LDK(KP707106781), T1A, T1z); + T26 = VSUB(TC, Tr); + T27 = VFMA(LDK(KP923879532), T26, T25); + T2h = VFNMS(LDK(KP923879532), T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VFNMS(LDK(KP831469612), T23, T1W); + T2b = VFNMS(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 13)]), VFNMSI(T2b, T24), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VFMAI(T2b, T24), ms, &(x[WS(rs, 1)])); + T2k = VFNMS(LDK(KP831469612), T2f, T2e); + T2l = VFNMS(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 5)]), VFNMSI(T2l, T2k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFMAI(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VFMA(LDK(KP831469612), T23, T1W); + T2d = VFMA(LDK(KP831469612), T2a, T27); + ST(&(x[WS(rs, 29)]), VFNMSI(T2d, T2c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T2d, T2c), ms, &(x[WS(rs, 1)])); + T2g = VFMA(LDK(KP831469612), T2f, T2e); + T2j = VFMA(LDK(KP831469612), T2i, T2h); + ST(&(x[WS(rs, 11)]), VFMAI(T2j, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VFNMSI(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t2fv_32"), twinstr, &GENUS, {119, 62, 98, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_32) (planner *p) { + X(kdft_dit_register) (p, t2fv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 32 -name t2fv_32 -include dft/simd/t2f.h */ + +/* + * This function contains 217 FP additions, 104 FP multiplications, + * (or, 201 additions, 88 multiplications, 16 fused multiply/add), + * 59 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 62)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(32, rs)) { + V T4, T1A, T2o, T32, Tf, T1v, T2r, T3f, TC, T1C, T2L, T34, Tr, T1D, T2O; + V T33, T1k, T20, T2F, T3b, T1r, T21, T2C, T3a, TV, T1X, T2y, T38, T12, T1Y; + V T2v, T37; + { + V T1, T1z, T3, T1x, T1y, T2, T1w, T2m, T2n; + T1 = LD(&(x[0]), ms, &(x[0])); + T1y = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T1z = BYTWJ(&(W[TWVL * 46]), T1y); + T2 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 30]), T2); + T1w = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1x = BYTWJ(&(W[TWVL * 14]), T1w); + T4 = VSUB(T1, T3); + T1A = VSUB(T1x, T1z); + T2m = VADD(T1, T3); + T2n = VADD(T1x, T1z); + T2o = VADD(T2m, T2n); + T32 = VSUB(T2m, T2n); + } + { + V T6, Td, T8, Tb; + { + V T5, Tc, T7, Ta; + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 6]), T5); + Tc = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 22]), Tc); + T7 = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 38]), T7); + Ta = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 54]), Ta); + } + { + V T9, Te, T2p, T2q; + T9 = VSUB(T6, T8); + Te = VSUB(Tb, Td); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + T1v = VMUL(LDK(KP707106781), VSUB(Te, T9)); + T2p = VADD(T6, T8); + T2q = VADD(Tb, Td); + T2r = VADD(T2p, T2q); + T3f = VSUB(T2q, T2p); + } + } + { + V Tt, TA, Tv, Ty; + { + V Ts, Tz, Tu, Tx; + Ts = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + Tt = BYTWJ(&(W[TWVL * 58]), Ts); + Tz = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 42]), Tz); + Tu = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tv = BYTWJ(&(W[TWVL * 26]), Tu); + Tx = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ty = BYTWJ(&(W[TWVL * 10]), Tx); + } + { + V Tw, TB, T2J, T2K; + Tw = VSUB(Tt, Tv); + TB = VSUB(Ty, TA); + TC = VFMA(LDK(KP923879532), Tw, VMUL(LDK(KP382683432), TB)); + T1C = VFNMS(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T2J = VADD(Tt, Tv); + T2K = VADD(Ty, TA); + T2L = VADD(T2J, T2K); + T34 = VSUB(T2J, T2K); + } + } + { + V Ti, Tp, Tk, Tn; + { + V Th, To, Tj, Tm; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + To = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 50]), To); + Tj = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 34]), Tj); + Tm = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 18]), Tm); + } + { + V Tl, Tq, T2M, T2N; + Tl = VSUB(Ti, Tk); + Tq = VSUB(Tn, Tp); + Tr = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + T1D = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + T2M = VADD(Ti, Tk); + T2N = VADD(Tn, Tp); + T2O = VADD(T2M, T2N); + T33 = VSUB(T2M, T2N); + } + } + { + V T15, T17, T1p, T1n, T1f, T1h, T1i, T1a, T1c, T1d; + { + V T14, T16, T1o, T1m; + T14 = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T15 = BYTWJ(&(W[TWVL * 60]), T14); + T16 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T17 = BYTWJ(&(W[TWVL * 28]), T16); + T1o = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1p = BYTWJ(&(W[TWVL * 44]), T1o); + T1m = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1n = BYTWJ(&(W[TWVL * 12]), T1m); + { + V T1e, T1g, T19, T1b; + T1e = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1f = BYTWJ(&(W[TWVL * 52]), T1e); + T1g = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1h = BYTWJ(&(W[TWVL * 20]), T1g); + T1i = VSUB(T1f, T1h); + T19 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1a = BYTWJ(&(W[TWVL * 4]), T19); + T1b = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1c = BYTWJ(&(W[TWVL * 36]), T1b); + T1d = VSUB(T1a, T1c); + } + } + { + V T18, T1j, T2D, T2E; + T18 = VSUB(T15, T17); + T1j = VMUL(LDK(KP707106781), VADD(T1d, T1i)); + T1k = VADD(T18, T1j); + T20 = VSUB(T18, T1j); + T2D = VADD(T1a, T1c); + T2E = VADD(T1f, T1h); + T2F = VADD(T2D, T2E); + T3b = VSUB(T2E, T2D); + } + { + V T1l, T1q, T2A, T2B; + T1l = VMUL(LDK(KP707106781), VSUB(T1i, T1d)); + T1q = VSUB(T1n, T1p); + T1r = VSUB(T1l, T1q); + T21 = VADD(T1q, T1l); + T2A = VADD(T15, T17); + T2B = VADD(T1n, T1p); + T2C = VADD(T2A, T2B); + T3a = VSUB(T2A, T2B); + } + } + { + V TG, TI, T10, TY, TQ, TS, TT, TL, TN, TO; + { + V TF, TH, TZ, TX; + TF = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TG = BYTWJ(&(W[0]), TF); + TH = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + TI = BYTWJ(&(W[TWVL * 32]), TH); + TZ = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T10 = BYTWJ(&(W[TWVL * 48]), TZ); + TX = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TY = BYTWJ(&(W[TWVL * 16]), TX); + { + V TP, TR, TK, TM; + TP = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + TQ = BYTWJ(&(W[TWVL * 56]), TP); + TR = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TS = BYTWJ(&(W[TWVL * 24]), TR); + TT = VSUB(TQ, TS); + TK = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TL = BYTWJ(&(W[TWVL * 8]), TK); + TM = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + TN = BYTWJ(&(W[TWVL * 40]), TM); + TO = VSUB(TL, TN); + } + } + { + V TJ, TU, T2w, T2x; + TJ = VSUB(TG, TI); + TU = VMUL(LDK(KP707106781), VADD(TO, TT)); + TV = VADD(TJ, TU); + T1X = VSUB(TJ, TU); + T2w = VADD(TL, TN); + T2x = VADD(TQ, TS); + T2y = VADD(T2w, T2x); + T38 = VSUB(T2x, T2w); + } + { + V TW, T11, T2t, T2u; + TW = VMUL(LDK(KP707106781), VSUB(TT, TO)); + T11 = VSUB(TY, T10); + T12 = VSUB(TW, T11); + T1Y = VADD(T11, TW); + T2t = VADD(TG, TI); + T2u = VADD(TY, T10); + T2v = VADD(T2t, T2u); + T37 = VSUB(T2t, T2u); + } + } + { + V T2W, T30, T2Z, T31; + { + V T2U, T2V, T2X, T2Y; + T2U = VADD(T2o, T2r); + T2V = VADD(T2O, T2L); + T2W = VADD(T2U, T2V); + T30 = VSUB(T2U, T2V); + T2X = VADD(T2v, T2y); + T2Y = VADD(T2C, T2F); + T2Z = VADD(T2X, T2Y); + T31 = VBYI(VSUB(T2Y, T2X)); + } + ST(&(x[WS(rs, 16)]), VSUB(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T30, T31), ms, &(x[0])); + ST(&(x[0]), VADD(T2W, T2Z), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VSUB(T30, T31), ms, &(x[0])); + } + { + V T2s, T2P, T2H, T2Q, T2z, T2G; + T2s = VSUB(T2o, T2r); + T2P = VSUB(T2L, T2O); + T2z = VSUB(T2v, T2y); + T2G = VSUB(T2C, T2F); + T2H = VMUL(LDK(KP707106781), VADD(T2z, T2G)); + T2Q = VMUL(LDK(KP707106781), VSUB(T2G, T2z)); + { + V T2I, T2R, T2S, T2T; + T2I = VADD(T2s, T2H); + T2R = VBYI(VADD(T2P, T2Q)); + ST(&(x[WS(rs, 28)]), VSUB(T2I, T2R), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T2I, T2R), ms, &(x[0])); + T2S = VSUB(T2s, T2H); + T2T = VBYI(VSUB(T2Q, T2P)); + ST(&(x[WS(rs, 20)]), VSUB(T2S, T2T), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T2S, T2T), ms, &(x[0])); + } + } + { + V T36, T3r, T3h, T3p, T3d, T3o, T3k, T3s, T35, T3g; + T35 = VMUL(LDK(KP707106781), VADD(T33, T34)); + T36 = VADD(T32, T35); + T3r = VSUB(T32, T35); + T3g = VMUL(LDK(KP707106781), VSUB(T34, T33)); + T3h = VADD(T3f, T3g); + T3p = VSUB(T3g, T3f); + { + V T39, T3c, T3i, T3j; + T39 = VFMA(LDK(KP923879532), T37, VMUL(LDK(KP382683432), T38)); + T3c = VFNMS(LDK(KP382683432), T3b, VMUL(LDK(KP923879532), T3a)); + T3d = VADD(T39, T3c); + T3o = VSUB(T3c, T39); + T3i = VFNMS(LDK(KP382683432), T37, VMUL(LDK(KP923879532), T38)); + T3j = VFMA(LDK(KP382683432), T3a, VMUL(LDK(KP923879532), T3b)); + T3k = VADD(T3i, T3j); + T3s = VSUB(T3j, T3i); + } + { + V T3e, T3l, T3u, T3v; + T3e = VADD(T36, T3d); + T3l = VBYI(VADD(T3h, T3k)); + ST(&(x[WS(rs, 30)]), VSUB(T3e, T3l), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T3e, T3l), ms, &(x[0])); + T3u = VBYI(VADD(T3p, T3o)); + T3v = VADD(T3r, T3s); + ST(&(x[WS(rs, 6)]), VADD(T3u, T3v), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VSUB(T3v, T3u), ms, &(x[0])); + } + { + V T3m, T3n, T3q, T3t; + T3m = VSUB(T36, T3d); + T3n = VBYI(VSUB(T3k, T3h)); + ST(&(x[WS(rs, 18)]), VSUB(T3m, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T3m, T3n), ms, &(x[0])); + T3q = VBYI(VSUB(T3o, T3p)); + T3t = VSUB(T3r, T3s); + ST(&(x[WS(rs, 10)]), VADD(T3q, T3t), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VSUB(T3t, T3q), ms, &(x[0])); + } + } + { + V TE, T1P, T1I, T1Q, T1t, T1M, T1F, T1N; + { + V Tg, TD, T1G, T1H; + Tg = VADD(T4, Tf); + TD = VADD(Tr, TC); + TE = VADD(Tg, TD); + T1P = VSUB(Tg, TD); + T1G = VFNMS(LDK(KP195090322), TV, VMUL(LDK(KP980785280), T12)); + T1H = VFMA(LDK(KP195090322), T1k, VMUL(LDK(KP980785280), T1r)); + T1I = VADD(T1G, T1H); + T1Q = VSUB(T1H, T1G); + } + { + V T13, T1s, T1B, T1E; + T13 = VFMA(LDK(KP980785280), TV, VMUL(LDK(KP195090322), T12)); + T1s = VFNMS(LDK(KP195090322), T1r, VMUL(LDK(KP980785280), T1k)); + T1t = VADD(T13, T1s); + T1M = VSUB(T1s, T13); + T1B = VSUB(T1v, T1A); + T1E = VSUB(T1C, T1D); + T1F = VADD(T1B, T1E); + T1N = VSUB(T1E, T1B); + } + { + V T1u, T1J, T1S, T1T; + T1u = VADD(TE, T1t); + T1J = VBYI(VADD(T1F, T1I)); + ST(&(x[WS(rs, 31)]), VSUB(T1u, T1J), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1u, T1J), ms, &(x[WS(rs, 1)])); + T1S = VBYI(VADD(T1N, T1M)); + T1T = VADD(T1P, T1Q); + ST(&(x[WS(rs, 7)]), VADD(T1S, T1T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VSUB(T1T, T1S), ms, &(x[WS(rs, 1)])); + } + { + V T1K, T1L, T1O, T1R; + T1K = VSUB(TE, T1t); + T1L = VBYI(VSUB(T1I, T1F)); + ST(&(x[WS(rs, 17)]), VSUB(T1K, T1L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VADD(T1K, T1L), ms, &(x[WS(rs, 1)])); + T1O = VBYI(VSUB(T1M, T1N)); + T1R = VSUB(T1P, T1Q); + ST(&(x[WS(rs, 9)]), VADD(T1O, T1R), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VSUB(T1R, T1O), ms, &(x[WS(rs, 1)])); + } + } + { + V T1W, T2h, T2a, T2i, T23, T2e, T27, T2f; + { + V T1U, T1V, T28, T29; + T1U = VSUB(T4, Tf); + T1V = VADD(T1D, T1C); + T1W = VADD(T1U, T1V); + T2h = VSUB(T1U, T1V); + T28 = VFNMS(LDK(KP555570233), T1X, VMUL(LDK(KP831469612), T1Y)); + T29 = VFMA(LDK(KP555570233), T20, VMUL(LDK(KP831469612), T21)); + T2a = VADD(T28, T29); + T2i = VSUB(T29, T28); + } + { + V T1Z, T22, T25, T26; + T1Z = VFMA(LDK(KP831469612), T1X, VMUL(LDK(KP555570233), T1Y)); + T22 = VFNMS(LDK(KP555570233), T21, VMUL(LDK(KP831469612), T20)); + T23 = VADD(T1Z, T22); + T2e = VSUB(T22, T1Z); + T25 = VADD(T1A, T1v); + T26 = VSUB(TC, Tr); + T27 = VADD(T25, T26); + T2f = VSUB(T26, T25); + } + { + V T24, T2b, T2k, T2l; + T24 = VADD(T1W, T23); + T2b = VBYI(VADD(T27, T2a)); + ST(&(x[WS(rs, 29)]), VSUB(T24, T2b), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T24, T2b), ms, &(x[WS(rs, 1)])); + T2k = VBYI(VADD(T2f, T2e)); + T2l = VADD(T2h, T2i); + ST(&(x[WS(rs, 5)]), VADD(T2k, T2l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VSUB(T2l, T2k), ms, &(x[WS(rs, 1)])); + } + { + V T2c, T2d, T2g, T2j; + T2c = VSUB(T1W, T23); + T2d = VBYI(VSUB(T2a, T27)); + ST(&(x[WS(rs, 19)]), VSUB(T2c, T2d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VADD(T2c, T2d), ms, &(x[WS(rs, 1)])); + T2g = VBYI(VSUB(T2e, T2f)); + T2j = VSUB(T2h, T2i); + ST(&(x[WS(rs, 11)]), VADD(T2g, T2j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VSUB(T2j, T2g), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t2fv_32"), twinstr, &GENUS, {201, 88, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_32) (planner *p) { + X(kdft_dit_register) (p, t2fv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_4.c new file mode 100644 index 000000000..1546a81a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_4.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:42 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t2fv_4 -include dft/simd/t2f.h */ + +/* + * This function contains 11 FP additions, 8 FP multiplications, + * (or, 9 additions, 6 multiplications, 2 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VSUB(T6, T8); + ST(&(x[WS(rs, 1)]), VFNMSI(T9, T4), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T9, T4), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t2fv_4"), twinstr, &GENUS, {9, 6, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_4) (planner *p) { + X(kdft_dit_register) (p, t2fv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 4 -name t2fv_4 -include dft/simd/t2f.h */ + +/* + * This function contains 11 FP additions, 6 FP multiplications, + * (or, 11 additions, 6 multiplications, 0 fused multiply/add), + * 13 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(4, rs)) { + V T1, T8, T3, T6, T7, T2, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 4]), T7); + T2 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 2]), T2); + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + { + V T4, T9, Ta, Tb; + T4 = VSUB(T1, T3); + T9 = VBYI(VSUB(T6, T8)); + ST(&(x[WS(rs, 1)]), VSUB(T4, T9), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4, T9), ms, &(x[WS(rs, 1)])); + Ta = VADD(T1, T3); + Tb = VADD(T6, T8); + ST(&(x[WS(rs, 2)]), VSUB(Ta, Tb), ms, &(x[0])); + ST(&(x[0]), VADD(Ta, Tb), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t2fv_4"), twinstr, &GENUS, {11, 6, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_4) (planner *p) { + X(kdft_dit_register) (p, t2fv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_5.c new file mode 100644 index 000000000..4361aa92a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_5.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:46 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t2fv_5 -include dft/simd/t2f.h */ + +/* + * This function contains 20 FP additions, 19 FP multiplications, + * (or, 11 additions, 10 multiplications, 9 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, Tg, Th, T6, Tb, Tc; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T3, Ta, T5, T8; + { + V T2, T9, T4, T7; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = BYTWJ(&(W[0]), T2); + T9 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Ta = BYTWJ(&(W[TWVL * 4]), T9); + T4 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T5 = BYTWJ(&(W[TWVL * 6]), T4); + T7 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 2]), T7); + } + Tg = VSUB(T3, T5); + Th = VSUB(T8, Ta); + T6 = VADD(T3, T5); + Tb = VADD(T8, Ta); + Tc = VADD(T6, Tb); + } + ST(&(x[0]), VADD(T1, Tc), ms, &(x[0])); + { + V Ti, Tk, Tf, Tj, Td, Te; + Ti = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Th, Tg)); + Tk = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tg, Th)); + Td = VFNMS(LDK(KP250000000), Tc, T1); + Te = VSUB(T6, Tb); + Tf = VFMA(LDK(KP559016994), Te, Td); + Tj = VFNMS(LDK(KP559016994), Te, Td); + ST(&(x[WS(rs, 1)]), VFNMSI(Ti, Tf), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tk, Tj), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t2fv_5"), twinstr, &GENUS, {11, 10, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_5) (planner *p) { + X(kdft_dit_register) (p, t2fv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 5 -name t2fv_5 -include dft/simd/t2f.h */ + +/* + * This function contains 20 FP additions, 14 FP multiplications, + * (or, 17 additions, 11 multiplications, 3 fused multiply/add), + * 20 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(5, rs)) { + V Tc, Tg, Th, T5, Ta, Td; + Tc = LD(&(x[0]), ms, &(x[0])); + { + V T2, T9, T4, T7; + { + V T1, T8, T3, T6; + T1 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2 = BYTWJ(&(W[0]), T1); + T8 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T9 = BYTWJ(&(W[TWVL * 4]), T8); + T3 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T4 = BYTWJ(&(W[TWVL * 6]), T3); + T6 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T7 = BYTWJ(&(W[TWVL * 2]), T6); + } + Tg = VSUB(T2, T4); + Th = VSUB(T7, T9); + T5 = VADD(T2, T4); + Ta = VADD(T7, T9); + Td = VADD(T5, Ta); + } + ST(&(x[0]), VADD(Tc, Td), ms, &(x[0])); + { + V Ti, Tj, Tf, Tk, Tb, Te; + Ti = VBYI(VFMA(LDK(KP951056516), Tg, VMUL(LDK(KP587785252), Th))); + Tj = VBYI(VFNMS(LDK(KP587785252), Tg, VMUL(LDK(KP951056516), Th))); + Tb = VMUL(LDK(KP559016994), VSUB(T5, Ta)); + Te = VFNMS(LDK(KP250000000), Td, Tc); + Tf = VADD(Tb, Te); + Tk = VSUB(Te, Tb); + ST(&(x[WS(rs, 1)]), VSUB(Tf, Ti), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(Tk, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(Ti, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tj, Tk), ms, &(x[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t2fv_5"), twinstr, &GENUS, {17, 11, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_5) (planner *p) { + X(kdft_dit_register) (p, t2fv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_64.c new file mode 100644 index 000000000..6ebf5070c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_64.c @@ -0,0 +1,1948 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:45 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t2fv_64 -include dft/simd/t2f.h */ + +/* + * This function contains 519 FP additions, 384 FP multiplications, + * (or, 261 additions, 126 multiplications, 258 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP820678790, +0.820678790828660330972281985331011598767386482); + DVK(KP098491403, +0.098491403357164253077197521291327432293052451); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP303346683, +0.303346683607342391675883946941299872384187453); + DVK(KP534511135, +0.534511135950791641089685961295362908582039528); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Ta, T3U, T6l, T7B, T37, T3V, T58, T7a, T1v, T24, T43, T4F, T5F, T7l, T5Q; + V T7o, T2i, T2R, T4a, T4I, T60, T7s, T6b, T7v, T4h, T4i, T4C, T5x, T7g, T1i; + V T3a, T5u, T7h, T4k, T4l, T4B, T5o, T7d, TV, T3b, T5l, T7e, T3X, T3Y, Tx; + V T38, T5f, T7C, T6o, T7b, T1S, T25, T5T, T7m, T46, T4G, T5M, T7p, T2F, T2S; + V T6e, T7t, T4d, T4J, T67, T7w; + { + V T1, T3, T8, T6, T33, T35, T55, T2Y, T30, T56, T2, T7, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 62]), T2); + T7 = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 94]), T7); + T5 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 30]), T5); + { + V T32, T34, T2X, T2Z; + T32 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T33 = BYTWJ(&(W[TWVL * 14]), T32); + T34 = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T35 = BYTWJ(&(W[TWVL * 78]), T34); + T55 = VSUB(T33, T35); + T2X = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + T2Y = BYTWJ(&(W[TWVL * 110]), T2X); + T2Z = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T30 = BYTWJ(&(W[TWVL * 46]), T2Z); + T56 = VSUB(T2Y, T30); + } + { + V T4, T9, T6j, T6k; + T4 = VADD(T1, T3); + T9 = VADD(T6, T8); + Ta = VSUB(T4, T9); + T3U = VADD(T4, T9); + T6j = VSUB(T6, T8); + T6k = VSUB(T56, T55); + T6l = VFNMS(LDK(KP707106781), T6k, T6j); + T7B = VFMA(LDK(KP707106781), T6k, T6j); + } + { + V T31, T36, T54, T57; + T31 = VADD(T2Y, T30); + T36 = VADD(T33, T35); + T37 = VSUB(T31, T36); + T3V = VADD(T36, T31); + T54 = VSUB(T1, T3); + T57 = VADD(T55, T56); + T58 = VFMA(LDK(KP707106781), T57, T54); + T7a = VFNMS(LDK(KP707106781), T57, T54); + } + } + { + V T1m, T1o, T1p, T1r, T1t, T1u, T1Y, T5C, T23, T5D, T41, T42; + { + V T1l, T1n, T1q, T1s; + T1l = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T1m = BYTWJ(&(W[0]), T1l); + T1n = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T1o = BYTWJ(&(W[TWVL * 64]), T1n); + T1p = VADD(T1m, T1o); + T1q = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1r = BYTWJ(&(W[TWVL * 32]), T1q); + T1s = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T1t = BYTWJ(&(W[TWVL * 96]), T1s); + T1u = VADD(T1r, T1t); + } + { + V T1V, T1X, T1U, T1W; + T1U = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1V = BYTWJ(&(W[TWVL * 16]), T1U); + T1W = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T1X = BYTWJ(&(W[TWVL * 80]), T1W); + T1Y = VADD(T1V, T1X); + T5C = VSUB(T1V, T1X); + } + { + V T20, T22, T1Z, T21; + T1Z = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T20 = BYTWJ(&(W[TWVL * 112]), T1Z); + T21 = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T22 = BYTWJ(&(W[TWVL * 48]), T21); + T23 = VADD(T20, T22); + T5D = VSUB(T20, T22); + } + T1v = VSUB(T1p, T1u); + T24 = VSUB(T1Y, T23); + T41 = VADD(T1p, T1u); + T42 = VADD(T1Y, T23); + T43 = VADD(T41, T42); + T4F = VSUB(T41, T42); + { + V T5B, T5E, T5O, T5P; + T5B = VSUB(T1m, T1o); + T5E = VADD(T5C, T5D); + T5F = VFMA(LDK(KP707106781), T5E, T5B); + T7l = VFNMS(LDK(KP707106781), T5E, T5B); + T5O = VSUB(T1r, T1t); + T5P = VSUB(T5C, T5D); + T5Q = VFMA(LDK(KP707106781), T5P, T5O); + T7o = VFNMS(LDK(KP707106781), T5P, T5O); + } + } + { + V T29, T2b, T2c, T2e, T2g, T2h, T2L, T5Y, T2Q, T5X, T48, T49; + { + V T28, T2a, T2d, T2f; + T28 = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T29 = BYTWJ(&(W[TWVL * 124]), T28); + T2a = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T2b = BYTWJ(&(W[TWVL * 60]), T2a); + T2c = VADD(T29, T2b); + T2d = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T2e = BYTWJ(&(W[TWVL * 28]), T2d); + T2f = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T2g = BYTWJ(&(W[TWVL * 92]), T2f); + T2h = VADD(T2e, T2g); + } + { + V T2I, T2K, T2H, T2J; + T2H = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2I = BYTWJ(&(W[TWVL * 108]), T2H); + T2J = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2K = BYTWJ(&(W[TWVL * 44]), T2J); + T2L = VADD(T2I, T2K); + T5Y = VSUB(T2I, T2K); + } + { + V T2N, T2P, T2M, T2O; + T2M = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2N = BYTWJ(&(W[TWVL * 12]), T2M); + T2O = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2P = BYTWJ(&(W[TWVL * 76]), T2O); + T2Q = VADD(T2N, T2P); + T5X = VSUB(T2N, T2P); + } + T2i = VSUB(T2c, T2h); + T2R = VSUB(T2L, T2Q); + T48 = VADD(T2c, T2h); + T49 = VADD(T2Q, T2L); + T4a = VADD(T48, T49); + T4I = VSUB(T48, T49); + { + V T5W, T5Z, T69, T6a; + T5W = VSUB(T29, T2b); + T5Z = VADD(T5X, T5Y); + T60 = VFMA(LDK(KP707106781), T5Z, T5W); + T7s = VFNMS(LDK(KP707106781), T5Z, T5W); + T69 = VSUB(T2g, T2e); + T6a = VSUB(T5Y, T5X); + T6b = VFMA(LDK(KP707106781), T6a, T69); + T7v = VFNMS(LDK(KP707106781), T6a, T69); + } + } + { + V TX, TZ, T10, T12, T14, T15, T1b, T5s, T1g, T5r, T5v, T5w; + { + V TW, TY, T11, T13; + TW = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + TX = BYTWJ(&(W[TWVL * 122]), TW); + TY = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TZ = BYTWJ(&(W[TWVL * 58]), TY); + T10 = VADD(TX, TZ); + T11 = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + T12 = BYTWJ(&(W[TWVL * 26]), T11); + T13 = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T14 = BYTWJ(&(W[TWVL * 90]), T13); + T15 = VADD(T12, T14); + } + { + V T18, T1a, T17, T19; + T17 = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + T18 = BYTWJ(&(W[TWVL * 106]), T17); + T19 = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1a = BYTWJ(&(W[TWVL * 42]), T19); + T1b = VADD(T18, T1a); + T5s = VSUB(T18, T1a); + } + { + V T1d, T1f, T1c, T1e; + T1c = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + T1d = BYTWJ(&(W[TWVL * 10]), T1c); + T1e = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + T1f = BYTWJ(&(W[TWVL * 74]), T1e); + T1g = VADD(T1d, T1f); + T5r = VSUB(T1d, T1f); + } + T4h = VADD(T10, T15); + T4i = VADD(T1g, T1b); + T4C = VSUB(T4h, T4i); + T5v = VSUB(T14, T12); + T5w = VSUB(T5s, T5r); + T5x = VFMA(LDK(KP707106781), T5w, T5v); + T7g = VFNMS(LDK(KP707106781), T5w, T5v); + { + V T16, T1h, T5q, T5t; + T16 = VSUB(T10, T15); + T1h = VSUB(T1b, T1g); + T1i = VFNMS(LDK(KP414213562), T1h, T16); + T3a = VFMA(LDK(KP414213562), T16, T1h); + T5q = VSUB(TX, TZ); + T5t = VADD(T5r, T5s); + T5u = VFMA(LDK(KP707106781), T5t, T5q); + T7h = VFNMS(LDK(KP707106781), T5t, T5q); + } + } + { + V TA, TC, TD, TF, TH, TI, TO, T5i, TT, T5j, T5m, T5n; + { + V Tz, TB, TE, TG; + Tz = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 2]), Tz); + TB = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + TC = BYTWJ(&(W[TWVL * 66]), TB); + TD = VADD(TA, TC); + TE = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + TF = BYTWJ(&(W[TWVL * 34]), TE); + TG = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + TH = BYTWJ(&(W[TWVL * 98]), TG); + TI = VADD(TF, TH); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TL = BYTWJ(&(W[TWVL * 18]), TK); + TM = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + TN = BYTWJ(&(W[TWVL * 82]), TM); + TO = VADD(TL, TN); + T5i = VSUB(TL, TN); + } + { + V TQ, TS, TP, TR; + TP = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + TQ = BYTWJ(&(W[TWVL * 114]), TP); + TR = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TS = BYTWJ(&(W[TWVL * 50]), TR); + TT = VADD(TQ, TS); + T5j = VSUB(TQ, TS); + } + T4k = VADD(TD, TI); + T4l = VADD(TO, TT); + T4B = VSUB(T4k, T4l); + T5m = VSUB(TF, TH); + T5n = VSUB(T5i, T5j); + T5o = VFMA(LDK(KP707106781), T5n, T5m); + T7d = VFNMS(LDK(KP707106781), T5n, T5m); + { + V TJ, TU, T5h, T5k; + TJ = VSUB(TD, TI); + TU = VSUB(TO, TT); + TV = VFNMS(LDK(KP414213562), TU, TJ); + T3b = VFMA(LDK(KP414213562), TJ, TU); + T5h = VSUB(TA, TC); + T5k = VADD(T5i, T5j); + T5l = VFMA(LDK(KP707106781), T5k, T5h); + T7e = VFNMS(LDK(KP707106781), T5k, T5h); + } + } + { + V Tf, T59, Tv, T5d, Tk, T5a, Tq, T5c, Tl, Tw; + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tc = BYTWJ(&(W[TWVL * 6]), Tb); + Td = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Te = BYTWJ(&(W[TWVL * 70]), Td); + Tf = VADD(Tc, Te); + T59 = VSUB(Tc, Te); + } + { + V Ts, Tu, Tr, Tt; + Tr = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Ts = BYTWJ(&(W[TWVL * 22]), Tr); + Tt = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + Tu = BYTWJ(&(W[TWVL * 86]), Tt); + Tv = VADD(Ts, Tu); + T5d = VSUB(Tu, Ts); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Th = BYTWJ(&(W[TWVL * 38]), Tg); + Ti = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 102]), Ti); + Tk = VADD(Th, Tj); + T5a = VSUB(Th, Tj); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 118]), Tm); + To = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 54]), To); + Tq = VADD(Tn, Tp); + T5c = VSUB(Tn, Tp); + } + T3X = VADD(Tf, Tk); + T3Y = VADD(Tq, Tv); + Tl = VSUB(Tf, Tk); + Tw = VSUB(Tq, Tv); + Tx = VADD(Tl, Tw); + T38 = VSUB(Tw, Tl); + { + V T5b, T5e, T6m, T6n; + T5b = VFNMS(LDK(KP414213562), T5a, T59); + T5e = VFNMS(LDK(KP414213562), T5d, T5c); + T5f = VADD(T5b, T5e); + T7C = VSUB(T5e, T5b); + T6m = VFMA(LDK(KP414213562), T59, T5a); + T6n = VFMA(LDK(KP414213562), T5c, T5d); + T6o = VSUB(T6m, T6n); + T7b = VADD(T6m, T6n); + } + } + { + V T1A, T5G, T1Q, T5K, T1F, T5H, T1L, T5J; + { + V T1x, T1z, T1w, T1y; + T1w = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1x = BYTWJ(&(W[TWVL * 8]), T1w); + T1y = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1z = BYTWJ(&(W[TWVL * 72]), T1y); + T1A = VADD(T1x, T1z); + T5G = VSUB(T1x, T1z); + } + { + V T1N, T1P, T1M, T1O; + T1M = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1N = BYTWJ(&(W[TWVL * 24]), T1M); + T1O = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1P = BYTWJ(&(W[TWVL * 88]), T1O); + T1Q = VADD(T1N, T1P); + T5K = VSUB(T1N, T1P); + } + { + V T1C, T1E, T1B, T1D; + T1B = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1C = BYTWJ(&(W[TWVL * 40]), T1B); + T1D = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1E = BYTWJ(&(W[TWVL * 104]), T1D); + T1F = VADD(T1C, T1E); + T5H = VSUB(T1C, T1E); + } + { + V T1I, T1K, T1H, T1J; + T1H = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1I = BYTWJ(&(W[TWVL * 120]), T1H); + T1J = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1K = BYTWJ(&(W[TWVL * 56]), T1J); + T1L = VADD(T1I, T1K); + T5J = VSUB(T1I, T1K); + } + { + V T1G, T1R, T5R, T5S; + T1G = VSUB(T1A, T1F); + T1R = VSUB(T1L, T1Q); + T1S = VADD(T1G, T1R); + T25 = VSUB(T1G, T1R); + T5R = VFMA(LDK(KP414213562), T5G, T5H); + T5S = VFNMS(LDK(KP414213562), T5J, T5K); + T5T = VADD(T5R, T5S); + T7m = VSUB(T5R, T5S); + } + { + V T44, T45, T5I, T5L; + T44 = VADD(T1A, T1F); + T45 = VADD(T1L, T1Q); + T46 = VADD(T44, T45); + T4G = VSUB(T44, T45); + T5I = VFNMS(LDK(KP414213562), T5H, T5G); + T5L = VFMA(LDK(KP414213562), T5K, T5J); + T5M = VADD(T5I, T5L); + T7p = VSUB(T5I, T5L); + } + } + { + V T2n, T61, T2D, T65, T2s, T62, T2y, T64; + { + V T2k, T2m, T2j, T2l; + T2j = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2k = BYTWJ(&(W[TWVL * 4]), T2j); + T2l = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2m = BYTWJ(&(W[TWVL * 68]), T2l); + T2n = VADD(T2k, T2m); + T61 = VSUB(T2k, T2m); + } + { + V T2A, T2C, T2z, T2B; + T2z = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2A = BYTWJ(&(W[TWVL * 20]), T2z); + T2B = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2C = BYTWJ(&(W[TWVL * 84]), T2B); + T2D = VADD(T2A, T2C); + T65 = VSUB(T2C, T2A); + } + { + V T2p, T2r, T2o, T2q; + T2o = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2p = BYTWJ(&(W[TWVL * 36]), T2o); + T2q = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2r = BYTWJ(&(W[TWVL * 100]), T2q); + T2s = VADD(T2p, T2r); + T62 = VSUB(T2r, T2p); + } + { + V T2v, T2x, T2u, T2w; + T2u = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2v = BYTWJ(&(W[TWVL * 116]), T2u); + T2w = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2x = BYTWJ(&(W[TWVL * 52]), T2w); + T2y = VADD(T2v, T2x); + T64 = VSUB(T2v, T2x); + } + { + V T2t, T2E, T6c, T6d; + T2t = VSUB(T2n, T2s); + T2E = VSUB(T2y, T2D); + T2F = VADD(T2t, T2E); + T2S = VSUB(T2E, T2t); + T6c = VFNMS(LDK(KP414213562), T61, T62); + T6d = VFMA(LDK(KP414213562), T64, T65); + T6e = VADD(T6c, T6d); + T7t = VSUB(T6d, T6c); + } + { + V T4b, T4c, T63, T66; + T4b = VADD(T2n, T2s); + T4c = VADD(T2y, T2D); + T4d = VADD(T4b, T4c); + T4J = VSUB(T4c, T4b); + T63 = VFMA(LDK(KP414213562), T62, T61); + T66 = VFNMS(LDK(KP414213562), T65, T64); + T67 = VADD(T63, T66); + T7w = VSUB(T66, T63); + } + } + { + V T40, T4s, T4x, T4z, T4f, T4o, T4n, T4t, T4u, T4y; + { + V T3W, T3Z, T4v, T4w; + T3W = VADD(T3U, T3V); + T3Z = VADD(T3X, T3Y); + T40 = VSUB(T3W, T3Z); + T4s = VADD(T3W, T3Z); + T4v = VADD(T43, T46); + T4w = VADD(T4a, T4d); + T4x = VADD(T4v, T4w); + T4z = VSUB(T4w, T4v); + } + { + V T47, T4e, T4j, T4m; + T47 = VSUB(T43, T46); + T4e = VSUB(T4a, T4d); + T4f = VADD(T47, T4e); + T4o = VSUB(T4e, T47); + T4j = VADD(T4h, T4i); + T4m = VADD(T4k, T4l); + T4n = VSUB(T4j, T4m); + T4t = VADD(T4m, T4j); + } + T4u = VADD(T4s, T4t); + ST(&(x[WS(rs, 32)]), VSUB(T4u, T4x), ms, &(x[0])); + ST(&(x[0]), VADD(T4u, T4x), ms, &(x[0])); + T4y = VSUB(T4s, T4t); + ST(&(x[WS(rs, 48)]), VFNMSI(T4z, T4y), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T4z, T4y), ms, &(x[0])); + { + V T4g, T4p, T4q, T4r; + T4g = VFNMS(LDK(KP707106781), T4f, T40); + T4p = VFNMS(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 24)]), VFNMSI(T4p, T4g), ms, &(x[0])); + ST(&(x[WS(rs, 40)]), VFMAI(T4p, T4g), ms, &(x[0])); + T4q = VFMA(LDK(KP707106781), T4f, T40); + T4r = VFMA(LDK(KP707106781), T4o, T4n); + ST(&(x[WS(rs, 56)]), VFNMSI(T4r, T4q), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T4r, T4q), ms, &(x[0])); + } + } + { + V T4E, T4W, T4S, T4X, T4L, T50, T4P, T4Z; + { + V T4A, T4D, T4Q, T4R; + T4A = VSUB(T3U, T3V); + T4D = VADD(T4B, T4C); + T4E = VFMA(LDK(KP707106781), T4D, T4A); + T4W = VFNMS(LDK(KP707106781), T4D, T4A); + T4Q = VFMA(LDK(KP414213562), T4I, T4J); + T4R = VFMA(LDK(KP414213562), T4F, T4G); + T4S = VSUB(T4Q, T4R); + T4X = VADD(T4R, T4Q); + } + { + V T4H, T4K, T4N, T4O; + T4H = VFNMS(LDK(KP414213562), T4G, T4F); + T4K = VFNMS(LDK(KP414213562), T4J, T4I); + T4L = VADD(T4H, T4K); + T50 = VSUB(T4K, T4H); + T4N = VSUB(T3Y, T3X); + T4O = VSUB(T4C, T4B); + T4P = VFMA(LDK(KP707106781), T4O, T4N); + T4Z = VFNMS(LDK(KP707106781), T4O, T4N); + } + { + V T4M, T4T, T52, T53; + T4M = VFNMS(LDK(KP923879532), T4L, T4E); + T4T = VFNMS(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 28)]), VFNMSI(T4T, T4M), ms, &(x[0])); + ST(&(x[WS(rs, 36)]), VFMAI(T4T, T4M), ms, &(x[0])); + T52 = VFMA(LDK(KP923879532), T4X, T4W); + T53 = VFNMS(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 12)]), VFNMSI(T53, T52), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VFMAI(T53, T52), ms, &(x[0])); + } + { + V T4U, T4V, T4Y, T51; + T4U = VFMA(LDK(KP923879532), T4L, T4E); + T4V = VFMA(LDK(KP923879532), T4S, T4P); + ST(&(x[WS(rs, 60)]), VFNMSI(T4V, T4U), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T4V, T4U), ms, &(x[0])); + T4Y = VFNMS(LDK(KP923879532), T4X, T4W); + T51 = VFMA(LDK(KP923879532), T50, T4Z); + ST(&(x[WS(rs, 20)]), VFMAI(T51, T4Y), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VFNMSI(T51, T4Y), ms, &(x[0])); + } + } + { + V T1k, T3k, T3d, T3n, T2V, T3o, T3g, T3l; + { + V Ty, T1j, T39, T3c; + Ty = VFMA(LDK(KP707106781), Tx, Ta); + T1j = VADD(TV, T1i); + T1k = VFMA(LDK(KP923879532), T1j, Ty); + T3k = VFNMS(LDK(KP923879532), T1j, Ty); + T39 = VFMA(LDK(KP707106781), T38, T37); + T3c = VSUB(T3a, T3b); + T3d = VFMA(LDK(KP923879532), T3c, T39); + T3n = VFNMS(LDK(KP923879532), T3c, T39); + { + V T27, T3f, T2U, T3e; + { + V T1T, T26, T2G, T2T; + T1T = VFMA(LDK(KP707106781), T1S, T1v); + T26 = VFMA(LDK(KP707106781), T25, T24); + T27 = VFNMS(LDK(KP198912367), T26, T1T); + T3f = VFMA(LDK(KP198912367), T1T, T26); + T2G = VFMA(LDK(KP707106781), T2F, T2i); + T2T = VFMA(LDK(KP707106781), T2S, T2R); + T2U = VFNMS(LDK(KP198912367), T2T, T2G); + T3e = VFMA(LDK(KP198912367), T2G, T2T); + } + T2V = VADD(T27, T2U); + T3o = VSUB(T2U, T27); + T3g = VSUB(T3e, T3f); + T3l = VADD(T3f, T3e); + } + } + { + V T2W, T3h, T3q, T3r; + T2W = VFNMS(LDK(KP980785280), T2V, T1k); + T3h = VFNMS(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 30)]), VFNMSI(T3h, T2W), ms, &(x[0])); + ST(&(x[WS(rs, 34)]), VFMAI(T3h, T2W), ms, &(x[0])); + T3q = VFMA(LDK(KP980785280), T3l, T3k); + T3r = VFNMS(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 14)]), VFNMSI(T3r, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 50)]), VFMAI(T3r, T3q), ms, &(x[0])); + } + { + V T3i, T3j, T3m, T3p; + T3i = VFMA(LDK(KP980785280), T2V, T1k); + T3j = VFMA(LDK(KP980785280), T3g, T3d); + ST(&(x[WS(rs, 62)]), VFNMSI(T3j, T3i), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3j, T3i), ms, &(x[0])); + T3m = VFNMS(LDK(KP980785280), T3l, T3k); + T3p = VFMA(LDK(KP980785280), T3o, T3n); + ST(&(x[WS(rs, 18)]), VFMAI(T3p, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 46)]), VFNMSI(T3p, T3m), ms, &(x[0])); + } + } + { + V T3u, T3M, T3F, T3P, T3B, T3Q, T3I, T3N; + { + V T3s, T3t, T3D, T3E; + T3s = VFNMS(LDK(KP707106781), Tx, Ta); + T3t = VADD(T3b, T3a); + T3u = VFMA(LDK(KP923879532), T3t, T3s); + T3M = VFNMS(LDK(KP923879532), T3t, T3s); + T3D = VFNMS(LDK(KP707106781), T38, T37); + T3E = VSUB(T1i, TV); + T3F = VFNMS(LDK(KP923879532), T3E, T3D); + T3P = VFMA(LDK(KP923879532), T3E, T3D); + { + V T3x, T3H, T3A, T3G; + { + V T3v, T3w, T3y, T3z; + T3v = VFNMS(LDK(KP707106781), T1S, T1v); + T3w = VFNMS(LDK(KP707106781), T25, T24); + T3x = VFMA(LDK(KP668178637), T3w, T3v); + T3H = VFNMS(LDK(KP668178637), T3v, T3w); + T3y = VFNMS(LDK(KP707106781), T2F, T2i); + T3z = VFNMS(LDK(KP707106781), T2S, T2R); + T3A = VFMA(LDK(KP668178637), T3z, T3y); + T3G = VFNMS(LDK(KP668178637), T3y, T3z); + } + T3B = VADD(T3x, T3A); + T3Q = VSUB(T3A, T3x); + T3I = VSUB(T3G, T3H); + T3N = VADD(T3H, T3G); + } + } + { + V T3C, T3J, T3S, T3T; + T3C = VFNMS(LDK(KP831469612), T3B, T3u); + T3J = VFNMS(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 38)]), VFNMSI(T3J, T3C), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T3J, T3C), ms, &(x[0])); + T3S = VFNMS(LDK(KP831469612), T3N, T3M); + T3T = VFMA(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 10)]), VFMAI(T3T, T3S), ms, &(x[0])); + ST(&(x[WS(rs, 54)]), VFNMSI(T3T, T3S), ms, &(x[0])); + } + { + V T3K, T3L, T3O, T3R; + T3K = VFMA(LDK(KP831469612), T3B, T3u); + T3L = VFMA(LDK(KP831469612), T3I, T3F); + ST(&(x[WS(rs, 6)]), VFNMSI(T3L, T3K), ms, &(x[0])); + ST(&(x[WS(rs, 58)]), VFMAI(T3L, T3K), ms, &(x[0])); + T3O = VFMA(LDK(KP831469612), T3N, T3M); + T3R = VFNMS(LDK(KP831469612), T3Q, T3P); + ST(&(x[WS(rs, 22)]), VFNMSI(T3R, T3O), ms, &(x[0])); + ST(&(x[WS(rs, 42)]), VFMAI(T3R, T3O), ms, &(x[0])); + } + } + { + V T7k, T8j, T7O, T89, T7H, T8g, T7R, T7Y, T7z, T7S, T7K, T7P, T85, T8k, T8c; + V T8h; + { + V T7c, T87, T7j, T88, T7f, T7i; + T7c = VFNMS(LDK(KP923879532), T7b, T7a); + T87 = VFMA(LDK(KP923879532), T7C, T7B); + T7f = VFNMS(LDK(KP668178637), T7e, T7d); + T7i = VFNMS(LDK(KP668178637), T7h, T7g); + T7j = VADD(T7f, T7i); + T88 = VSUB(T7f, T7i); + T7k = VFNMS(LDK(KP831469612), T7j, T7c); + T8j = VFNMS(LDK(KP831469612), T88, T87); + T7O = VFMA(LDK(KP831469612), T7j, T7c); + T89 = VFMA(LDK(KP831469612), T88, T87); + } + { + V T7D, T7W, T7G, T7X, T7E, T7F; + T7D = VFNMS(LDK(KP923879532), T7C, T7B); + T7W = VFMA(LDK(KP923879532), T7b, T7a); + T7E = VFMA(LDK(KP668178637), T7g, T7h); + T7F = VFMA(LDK(KP668178637), T7d, T7e); + T7G = VSUB(T7E, T7F); + T7X = VADD(T7F, T7E); + T7H = VFNMS(LDK(KP831469612), T7G, T7D); + T8g = VFNMS(LDK(KP831469612), T7X, T7W); + T7R = VFMA(LDK(KP831469612), T7G, T7D); + T7Y = VFMA(LDK(KP831469612), T7X, T7W); + } + { + V T7r, T7I, T7y, T7J; + { + V T7n, T7q, T7u, T7x; + T7n = VFNMS(LDK(KP923879532), T7m, T7l); + T7q = VFMA(LDK(KP923879532), T7p, T7o); + T7r = VFNMS(LDK(KP534511135), T7q, T7n); + T7I = VFMA(LDK(KP534511135), T7n, T7q); + T7u = VFNMS(LDK(KP923879532), T7t, T7s); + T7x = VFMA(LDK(KP923879532), T7w, T7v); + T7y = VFNMS(LDK(KP534511135), T7x, T7u); + T7J = VFMA(LDK(KP534511135), T7u, T7x); + } + T7z = VADD(T7r, T7y); + T7S = VSUB(T7y, T7r); + T7K = VSUB(T7I, T7J); + T7P = VADD(T7I, T7J); + } + { + V T81, T8a, T84, T8b; + { + V T7Z, T80, T82, T83; + T7Z = VFMA(LDK(KP923879532), T7m, T7l); + T80 = VFNMS(LDK(KP923879532), T7p, T7o); + T81 = VFMA(LDK(KP303346683), T80, T7Z); + T8a = VFNMS(LDK(KP303346683), T7Z, T80); + T82 = VFMA(LDK(KP923879532), T7t, T7s); + T83 = VFNMS(LDK(KP923879532), T7w, T7v); + T84 = VFMA(LDK(KP303346683), T83, T82); + T8b = VFNMS(LDK(KP303346683), T82, T83); + } + T85 = VADD(T81, T84); + T8k = VSUB(T84, T81); + T8c = VSUB(T8a, T8b); + T8h = VADD(T8a, T8b); + } + { + V T7A, T7L, T8i, T8l; + T7A = VFNMS(LDK(KP881921264), T7z, T7k); + T7L = VFNMS(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 37)]), VFNMSI(T7L, T7A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFMAI(T7L, T7A), ms, &(x[WS(rs, 1)])); + T8i = VFMA(LDK(KP956940335), T8h, T8g); + T8l = VFMA(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 19)]), VFMAI(T8l, T8i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 45)]), VFNMSI(T8l, T8i), ms, &(x[WS(rs, 1)])); + } + { + V T8m, T8n, T7M, T7N; + T8m = VFNMS(LDK(KP956940335), T8h, T8g); + T8n = VFNMS(LDK(KP956940335), T8k, T8j); + ST(&(x[WS(rs, 13)]), VFNMSI(T8n, T8m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 51)]), VFMAI(T8n, T8m), ms, &(x[WS(rs, 1)])); + T7M = VFMA(LDK(KP881921264), T7z, T7k); + T7N = VFMA(LDK(KP881921264), T7K, T7H); + ST(&(x[WS(rs, 5)]), VFNMSI(T7N, T7M), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 59)]), VFMAI(T7N, T7M), ms, &(x[WS(rs, 1)])); + } + { + V T7Q, T7T, T86, T8d; + T7Q = VFNMS(LDK(KP881921264), T7P, T7O); + T7T = VFNMS(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 21)]), VFNMSI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 43)]), VFMAI(T7T, T7Q), ms, &(x[WS(rs, 1)])); + T86 = VFNMS(LDK(KP956940335), T85, T7Y); + T8d = VFNMS(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 29)]), VFNMSI(T8d, T86), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 35)]), VFMAI(T8d, T86), ms, &(x[WS(rs, 1)])); + } + { + V T8e, T8f, T7U, T7V; + T8e = VFMA(LDK(KP956940335), T85, T7Y); + T8f = VFMA(LDK(KP956940335), T8c, T89); + ST(&(x[WS(rs, 61)]), VFNMSI(T8f, T8e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T8f, T8e), ms, &(x[WS(rs, 1)])); + T7U = VFMA(LDK(KP881921264), T7P, T7O); + T7V = VFMA(LDK(KP881921264), T7S, T7R); + ST(&(x[WS(rs, 11)]), VFMAI(T7V, T7U), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 53)]), VFNMSI(T7V, T7U), ms, &(x[WS(rs, 1)])); + } + } + { + V T5A, T75, T6A, T6V, T6t, T72, T6D, T6K, T6h, T6E, T6w, T6B, T6R, T76, T6Y; + V T73; + { + V T5g, T6T, T5z, T6U, T5p, T5y; + T5g = VFMA(LDK(KP923879532), T5f, T58); + T6T = VFNMS(LDK(KP923879532), T6o, T6l); + T5p = VFNMS(LDK(KP198912367), T5o, T5l); + T5y = VFNMS(LDK(KP198912367), T5x, T5u); + T5z = VADD(T5p, T5y); + T6U = VSUB(T5y, T5p); + T5A = VFMA(LDK(KP980785280), T5z, T5g); + T75 = VFNMS(LDK(KP980785280), T6U, T6T); + T6A = VFNMS(LDK(KP980785280), T5z, T5g); + T6V = VFMA(LDK(KP980785280), T6U, T6T); + } + { + V T6p, T6I, T6s, T6J, T6q, T6r; + T6p = VFMA(LDK(KP923879532), T6o, T6l); + T6I = VFNMS(LDK(KP923879532), T5f, T58); + T6q = VFMA(LDK(KP198912367), T5l, T5o); + T6r = VFMA(LDK(KP198912367), T5u, T5x); + T6s = VSUB(T6q, T6r); + T6J = VADD(T6q, T6r); + T6t = VFMA(LDK(KP980785280), T6s, T6p); + T72 = VFNMS(LDK(KP980785280), T6J, T6I); + T6D = VFNMS(LDK(KP980785280), T6s, T6p); + T6K = VFMA(LDK(KP980785280), T6J, T6I); + } + { + V T5V, T6u, T6g, T6v; + { + V T5N, T5U, T68, T6f; + T5N = VFMA(LDK(KP923879532), T5M, T5F); + T5U = VFMA(LDK(KP923879532), T5T, T5Q); + T5V = VFNMS(LDK(KP098491403), T5U, T5N); + T6u = VFMA(LDK(KP098491403), T5N, T5U); + T68 = VFMA(LDK(KP923879532), T67, T60); + T6f = VFMA(LDK(KP923879532), T6e, T6b); + T6g = VFNMS(LDK(KP098491403), T6f, T68); + T6v = VFMA(LDK(KP098491403), T68, T6f); + } + T6h = VADD(T5V, T6g); + T6E = VSUB(T6g, T5V); + T6w = VSUB(T6u, T6v); + T6B = VADD(T6u, T6v); + } + { + V T6N, T6W, T6Q, T6X; + { + V T6L, T6M, T6O, T6P; + T6L = VFNMS(LDK(KP923879532), T5M, T5F); + T6M = VFNMS(LDK(KP923879532), T5T, T5Q); + T6N = VFMA(LDK(KP820678790), T6M, T6L); + T6W = VFNMS(LDK(KP820678790), T6L, T6M); + T6O = VFNMS(LDK(KP923879532), T67, T60); + T6P = VFNMS(LDK(KP923879532), T6e, T6b); + T6Q = VFMA(LDK(KP820678790), T6P, T6O); + T6X = VFNMS(LDK(KP820678790), T6O, T6P); + } + T6R = VADD(T6N, T6Q); + T76 = VSUB(T6Q, T6N); + T6Y = VSUB(T6W, T6X); + T73 = VADD(T6W, T6X); + } + { + V T6i, T6x, T74, T77; + T6i = VFNMS(LDK(KP995184726), T6h, T5A); + T6x = VFNMS(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 33)]), VFNMSI(T6x, T6i), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VFMAI(T6x, T6i), ms, &(x[WS(rs, 1)])); + T74 = VFMA(LDK(KP773010453), T73, T72); + T77 = VFMA(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 23)]), VFMAI(T77, T74), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VFNMSI(T77, T74), ms, &(x[WS(rs, 1)])); + } + { + V T78, T79, T6y, T6z; + T78 = VFNMS(LDK(KP773010453), T73, T72); + T79 = VFNMS(LDK(KP773010453), T76, T75); + ST(&(x[WS(rs, 9)]), VFNMSI(T79, T78), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VFMAI(T79, T78), ms, &(x[WS(rs, 1)])); + T6y = VFMA(LDK(KP995184726), T6h, T5A); + T6z = VFMA(LDK(KP995184726), T6w, T6t); + ST(&(x[WS(rs, 1)]), VFNMSI(T6z, T6y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 63)]), VFMAI(T6z, T6y), ms, &(x[WS(rs, 1)])); + } + { + V T6C, T6F, T6S, T6Z; + T6C = VFNMS(LDK(KP995184726), T6B, T6A); + T6F = VFNMS(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 17)]), VFNMSI(T6F, T6C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VFMAI(T6F, T6C), ms, &(x[WS(rs, 1)])); + T6S = VFNMS(LDK(KP773010453), T6R, T6K); + T6Z = VFNMS(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 25)]), VFNMSI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 39)]), VFMAI(T6Z, T6S), ms, &(x[WS(rs, 1)])); + } + { + V T70, T71, T6G, T6H; + T70 = VFMA(LDK(KP773010453), T6R, T6K); + T71 = VFMA(LDK(KP773010453), T6Y, T6V); + ST(&(x[WS(rs, 57)]), VFNMSI(T71, T70), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T71, T70), ms, &(x[WS(rs, 1)])); + T6G = VFMA(LDK(KP995184726), T6B, T6A); + T6H = VFMA(LDK(KP995184726), T6E, T6D); + ST(&(x[WS(rs, 15)]), VFMAI(T6H, T6G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VFNMSI(T6H, T6G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t2fv_64"), twinstr, &GENUS, {261, 126, 258, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_64) (planner *p) { + X(kdft_dit_register) (p, t2fv_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 64 -name t2fv_64 -include dft/simd/t2f.h */ + +/* + * This function contains 519 FP additions, 250 FP multiplications, + * (or, 467 additions, 198 multiplications, 52 fused multiply/add), + * 107 stack variables, 15 constants, and 128 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_64(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP995184726, +0.995184726672196886244836953109479921575474869); + DVK(KP098017140, +0.098017140329560601994195563888641845861136673); + DVK(KP773010453, +0.773010453362736960810906609758469800971041293); + DVK(KP634393284, +0.634393284163645498215171613225493370675687095); + DVK(KP471396736, +0.471396736825997648556387625905254377657460319); + DVK(KP881921264, +0.881921264348355029712756863660388349508442621); + DVK(KP290284677, +0.290284677254462367636192375817395274691476278); + DVK(KP956940335, +0.956940335732208864935797886980269969482849206); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 126)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 126), MAKE_VOLATILE_STRIDE(64, rs)) { + V Tg, T4a, T6r, T7f, T3o, T4B, T5q, T7e, T5R, T62, T28, T4o, T2g, T4l, T7n; + V T7Z, T68, T6j, T2C, T4s, T3a, T4v, T7u, T82, T7E, T7F, T7V, T5F, T6u, T1k; + V T4e, T1r, T4d, T7B, T7C, T7W, T5M, T6v, TV, T4g, T12, T4h, T7h, T7i, TD; + V T4C, T3h, T4b, T5x, T6s, T1R, T4m, T7q, T80, T2j, T4p, T5Y, T63, T2Z, T4w; + V T7x, T83, T33, T4t, T6f, T6k; + { + V T1, T3, T3m, T3k, Tb, Td, Te, T6, T8, T9, T2, T3l, T3j; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 32)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 62]), T2); + T3l = LD(&(x[WS(rs, 48)]), ms, &(x[0])); + T3m = BYTWJ(&(W[TWVL * 94]), T3l); + T3j = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + T3k = BYTWJ(&(W[TWVL * 30]), T3j); + { + V Ta, Tc, T5, T7; + Ta = LD(&(x[WS(rs, 56)]), ms, &(x[0])); + Tb = BYTWJ(&(W[TWVL * 110]), Ta); + Tc = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + Td = BYTWJ(&(W[TWVL * 46]), Tc); + Te = VSUB(Tb, Td); + T5 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T6 = BYTWJ(&(W[TWVL * 14]), T5); + T7 = LD(&(x[WS(rs, 40)]), ms, &(x[0])); + T8 = BYTWJ(&(W[TWVL * 78]), T7); + T9 = VSUB(T6, T8); + } + { + V T4, Tf, T6p, T6q; + T4 = VSUB(T1, T3); + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VADD(T4, Tf); + T4a = VSUB(T4, Tf); + T6p = VADD(Tb, Td); + T6q = VADD(T6, T8); + T6r = VSUB(T6p, T6q); + T7f = VADD(T6q, T6p); + } + { + V T3i, T3n, T5o, T5p; + T3i = VMUL(LDK(KP707106781), VSUB(Te, T9)); + T3n = VSUB(T3k, T3m); + T3o = VSUB(T3i, T3n); + T4B = VADD(T3n, T3i); + T5o = VADD(T1, T3); + T5p = VADD(T3k, T3m); + T5q = VSUB(T5o, T5p); + T7e = VADD(T5o, T5p); + } + } + { + V T24, T26, T5Q, T2b, T2d, T5P, T1W, T60, T21, T61, T22, T27; + { + V T23, T25, T2a, T2c; + T23 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T24 = BYTWJ(&(W[TWVL * 32]), T23); + T25 = LD(&(x[WS(rs, 49)]), ms, &(x[WS(rs, 1)])); + T26 = BYTWJ(&(W[TWVL * 96]), T25); + T5Q = VADD(T24, T26); + T2a = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T2b = BYTWJ(&(W[0]), T2a); + T2c = LD(&(x[WS(rs, 33)]), ms, &(x[WS(rs, 1)])); + T2d = BYTWJ(&(W[TWVL * 64]), T2c); + T5P = VADD(T2b, T2d); + } + { + V T1T, T1V, T1S, T1U; + T1S = LD(&(x[WS(rs, 57)]), ms, &(x[WS(rs, 1)])); + T1T = BYTWJ(&(W[TWVL * 112]), T1S); + T1U = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T1V = BYTWJ(&(W[TWVL * 48]), T1U); + T1W = VSUB(T1T, T1V); + T60 = VADD(T1T, T1V); + } + { + V T1Y, T20, T1X, T1Z; + T1X = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1Y = BYTWJ(&(W[TWVL * 16]), T1X); + T1Z = LD(&(x[WS(rs, 41)]), ms, &(x[WS(rs, 1)])); + T20 = BYTWJ(&(W[TWVL * 80]), T1Z); + T21 = VSUB(T1Y, T20); + T61 = VADD(T1Y, T20); + } + T5R = VSUB(T5P, T5Q); + T62 = VSUB(T60, T61); + T22 = VMUL(LDK(KP707106781), VSUB(T1W, T21)); + T27 = VSUB(T24, T26); + T28 = VSUB(T22, T27); + T4o = VADD(T27, T22); + { + V T2e, T2f, T7l, T7m; + T2e = VSUB(T2b, T2d); + T2f = VMUL(LDK(KP707106781), VADD(T21, T1W)); + T2g = VADD(T2e, T2f); + T4l = VSUB(T2e, T2f); + T7l = VADD(T5P, T5Q); + T7m = VADD(T61, T60); + T7n = VADD(T7l, T7m); + T7Z = VSUB(T7l, T7m); + } + } + { + V T2n, T2p, T66, T36, T38, T67, T2v, T6i, T2A, T6h, T2q, T2B; + { + V T2m, T2o, T35, T37; + T2m = LD(&(x[WS(rs, 63)]), ms, &(x[WS(rs, 1)])); + T2n = BYTWJ(&(W[TWVL * 124]), T2m); + T2o = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T2p = BYTWJ(&(W[TWVL * 60]), T2o); + T66 = VADD(T2n, T2p); + T35 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T36 = BYTWJ(&(W[TWVL * 28]), T35); + T37 = LD(&(x[WS(rs, 47)]), ms, &(x[WS(rs, 1)])); + T38 = BYTWJ(&(W[TWVL * 92]), T37); + T67 = VADD(T36, T38); + } + { + V T2s, T2u, T2r, T2t; + T2r = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T2s = BYTWJ(&(W[TWVL * 12]), T2r); + T2t = LD(&(x[WS(rs, 39)]), ms, &(x[WS(rs, 1)])); + T2u = BYTWJ(&(W[TWVL * 76]), T2t); + T2v = VSUB(T2s, T2u); + T6i = VADD(T2s, T2u); + } + { + V T2x, T2z, T2w, T2y; + T2w = LD(&(x[WS(rs, 55)]), ms, &(x[WS(rs, 1)])); + T2x = BYTWJ(&(W[TWVL * 108]), T2w); + T2y = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T2z = BYTWJ(&(W[TWVL * 44]), T2y); + T2A = VSUB(T2x, T2z); + T6h = VADD(T2x, T2z); + } + T68 = VSUB(T66, T67); + T6j = VSUB(T6h, T6i); + T2q = VSUB(T2n, T2p); + T2B = VMUL(LDK(KP707106781), VADD(T2v, T2A)); + T2C = VADD(T2q, T2B); + T4s = VSUB(T2q, T2B); + { + V T34, T39, T7s, T7t; + T34 = VMUL(LDK(KP707106781), VSUB(T2A, T2v)); + T39 = VSUB(T36, T38); + T3a = VSUB(T34, T39); + T4v = VADD(T39, T34); + T7s = VADD(T66, T67); + T7t = VADD(T6i, T6h); + T7u = VADD(T7s, T7t); + T82 = VSUB(T7s, T7t); + } + } + { + V T1g, T1i, T5A, T1m, T1o, T5z, T18, T5C, T1d, T5D, T5B, T5E; + { + V T1f, T1h, T1l, T1n; + T1f = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1g = BYTWJ(&(W[TWVL * 34]), T1f); + T1h = LD(&(x[WS(rs, 50)]), ms, &(x[0])); + T1i = BYTWJ(&(W[TWVL * 98]), T1h); + T5A = VADD(T1g, T1i); + T1l = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T1m = BYTWJ(&(W[TWVL * 2]), T1l); + T1n = LD(&(x[WS(rs, 34)]), ms, &(x[0])); + T1o = BYTWJ(&(W[TWVL * 66]), T1n); + T5z = VADD(T1m, T1o); + } + { + V T15, T17, T14, T16; + T14 = LD(&(x[WS(rs, 58)]), ms, &(x[0])); + T15 = BYTWJ(&(W[TWVL * 114]), T14); + T16 = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + T17 = BYTWJ(&(W[TWVL * 50]), T16); + T18 = VSUB(T15, T17); + T5C = VADD(T15, T17); + } + { + V T1a, T1c, T19, T1b; + T19 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T1a = BYTWJ(&(W[TWVL * 18]), T19); + T1b = LD(&(x[WS(rs, 42)]), ms, &(x[0])); + T1c = BYTWJ(&(W[TWVL * 82]), T1b); + T1d = VSUB(T1a, T1c); + T5D = VADD(T1a, T1c); + } + T7E = VADD(T5z, T5A); + T7F = VADD(T5D, T5C); + T7V = VSUB(T7E, T7F); + T5B = VSUB(T5z, T5A); + T5E = VSUB(T5C, T5D); + T5F = VFMA(LDK(KP923879532), T5B, VMUL(LDK(KP382683432), T5E)); + T6u = VFNMS(LDK(KP382683432), T5B, VMUL(LDK(KP923879532), T5E)); + { + V T1e, T1j, T1p, T1q; + T1e = VMUL(LDK(KP707106781), VSUB(T18, T1d)); + T1j = VSUB(T1g, T1i); + T1k = VSUB(T1e, T1j); + T4e = VADD(T1j, T1e); + T1p = VSUB(T1m, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T1d, T18)); + T1r = VADD(T1p, T1q); + T4d = VSUB(T1p, T1q); + } + } + { + V TG, TI, T5G, TY, T10, T5H, TO, T5K, TT, T5J, T5I, T5L; + { + V TF, TH, TX, TZ; + TF = LD(&(x[WS(rs, 62)]), ms, &(x[0])); + TG = BYTWJ(&(W[TWVL * 122]), TF); + TH = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TI = BYTWJ(&(W[TWVL * 58]), TH); + T5G = VADD(TG, TI); + TX = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TY = BYTWJ(&(W[TWVL * 26]), TX); + TZ = LD(&(x[WS(rs, 46)]), ms, &(x[0])); + T10 = BYTWJ(&(W[TWVL * 90]), TZ); + T5H = VADD(TY, T10); + } + { + V TL, TN, TK, TM; + TK = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TL = BYTWJ(&(W[TWVL * 10]), TK); + TM = LD(&(x[WS(rs, 38)]), ms, &(x[0])); + TN = BYTWJ(&(W[TWVL * 74]), TM); + TO = VSUB(TL, TN); + T5K = VADD(TL, TN); + } + { + V TQ, TS, TP, TR; + TP = LD(&(x[WS(rs, 54)]), ms, &(x[0])); + TQ = BYTWJ(&(W[TWVL * 106]), TP); + TR = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TS = BYTWJ(&(W[TWVL * 42]), TR); + TT = VSUB(TQ, TS); + T5J = VADD(TQ, TS); + } + T7B = VADD(T5G, T5H); + T7C = VADD(T5K, T5J); + T7W = VSUB(T7B, T7C); + T5I = VSUB(T5G, T5H); + T5L = VSUB(T5J, T5K); + T5M = VFNMS(LDK(KP382683432), T5L, VMUL(LDK(KP923879532), T5I)); + T6v = VFMA(LDK(KP382683432), T5I, VMUL(LDK(KP923879532), T5L)); + { + V TJ, TU, TW, T11; + TJ = VSUB(TG, TI); + TU = VMUL(LDK(KP707106781), VADD(TO, TT)); + TV = VADD(TJ, TU); + T4g = VSUB(TJ, TU); + TW = VMUL(LDK(KP707106781), VSUB(TT, TO)); + T11 = VSUB(TY, T10); + T12 = VSUB(TW, T11); + T4h = VADD(T11, TW); + } + } + { + V Tl, T5r, TB, T5v, Tq, T5s, Tw, T5u, Tr, TC; + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 6]), Th); + Tj = LD(&(x[WS(rs, 36)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 70]), Tj); + Tl = VSUB(Ti, Tk); + T5r = VADD(Ti, Tk); + } + { + V Ty, TA, Tx, Tz; + Tx = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Ty = BYTWJ(&(W[TWVL * 22]), Tx); + Tz = LD(&(x[WS(rs, 44)]), ms, &(x[0])); + TA = BYTWJ(&(W[TWVL * 86]), Tz); + TB = VSUB(Ty, TA); + T5v = VADD(Ty, TA); + } + { + V Tn, Tp, Tm, To; + Tm = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tn = BYTWJ(&(W[TWVL * 38]), Tm); + To = LD(&(x[WS(rs, 52)]), ms, &(x[0])); + Tp = BYTWJ(&(W[TWVL * 102]), To); + Tq = VSUB(Tn, Tp); + T5s = VADD(Tn, Tp); + } + { + V Tt, Tv, Ts, Tu; + Ts = LD(&(x[WS(rs, 60)]), ms, &(x[0])); + Tt = BYTWJ(&(W[TWVL * 118]), Ts); + Tu = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tv = BYTWJ(&(W[TWVL * 54]), Tu); + Tw = VSUB(Tt, Tv); + T5u = VADD(Tt, Tv); + } + T7h = VADD(T5r, T5s); + T7i = VADD(T5u, T5v); + Tr = VFNMS(LDK(KP382683432), Tq, VMUL(LDK(KP923879532), Tl)); + TC = VFMA(LDK(KP923879532), Tw, VMUL(LDK(KP382683432), TB)); + TD = VADD(Tr, TC); + T4C = VSUB(TC, Tr); + { + V T3f, T3g, T5t, T5w; + T3f = VFNMS(LDK(KP923879532), TB, VMUL(LDK(KP382683432), Tw)); + T3g = VFMA(LDK(KP382683432), Tl, VMUL(LDK(KP923879532), Tq)); + T3h = VSUB(T3f, T3g); + T4b = VADD(T3g, T3f); + T5t = VSUB(T5r, T5s); + T5w = VSUB(T5u, T5v); + T5x = VMUL(LDK(KP707106781), VADD(T5t, T5w)); + T6s = VMUL(LDK(KP707106781), VSUB(T5w, T5t)); + } + } + { + V T1z, T5V, T1P, T5T, T1E, T5W, T1K, T5S; + { + V T1w, T1y, T1v, T1x; + T1v = LD(&(x[WS(rs, 61)]), ms, &(x[WS(rs, 1)])); + T1w = BYTWJ(&(W[TWVL * 120]), T1v); + T1x = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1y = BYTWJ(&(W[TWVL * 56]), T1x); + T1z = VSUB(T1w, T1y); + T5V = VADD(T1w, T1y); + } + { + V T1M, T1O, T1L, T1N; + T1L = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1M = BYTWJ(&(W[TWVL * 40]), T1L); + T1N = LD(&(x[WS(rs, 53)]), ms, &(x[WS(rs, 1)])); + T1O = BYTWJ(&(W[TWVL * 104]), T1N); + T1P = VSUB(T1M, T1O); + T5T = VADD(T1M, T1O); + } + { + V T1B, T1D, T1A, T1C; + T1A = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1B = BYTWJ(&(W[TWVL * 24]), T1A); + T1C = LD(&(x[WS(rs, 45)]), ms, &(x[WS(rs, 1)])); + T1D = BYTWJ(&(W[TWVL * 88]), T1C); + T1E = VSUB(T1B, T1D); + T5W = VADD(T1B, T1D); + } + { + V T1H, T1J, T1G, T1I; + T1G = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1H = BYTWJ(&(W[TWVL * 8]), T1G); + T1I = LD(&(x[WS(rs, 37)]), ms, &(x[WS(rs, 1)])); + T1J = BYTWJ(&(W[TWVL * 72]), T1I); + T1K = VSUB(T1H, T1J); + T5S = VADD(T1H, T1J); + } + { + V T1F, T1Q, T7o, T7p; + T1F = VFNMS(LDK(KP923879532), T1E, VMUL(LDK(KP382683432), T1z)); + T1Q = VFMA(LDK(KP382683432), T1K, VMUL(LDK(KP923879532), T1P)); + T1R = VSUB(T1F, T1Q); + T4m = VADD(T1Q, T1F); + T7o = VADD(T5S, T5T); + T7p = VADD(T5V, T5W); + T7q = VADD(T7o, T7p); + T80 = VSUB(T7p, T7o); + } + { + V T2h, T2i, T5U, T5X; + T2h = VFNMS(LDK(KP382683432), T1P, VMUL(LDK(KP923879532), T1K)); + T2i = VFMA(LDK(KP923879532), T1z, VMUL(LDK(KP382683432), T1E)); + T2j = VADD(T2h, T2i); + T4p = VSUB(T2i, T2h); + T5U = VSUB(T5S, T5T); + T5X = VSUB(T5V, T5W); + T5Y = VMUL(LDK(KP707106781), VADD(T5U, T5X)); + T63 = VMUL(LDK(KP707106781), VSUB(T5X, T5U)); + } + } + { + V T2H, T69, T2X, T6d, T2M, T6a, T2S, T6c; + { + V T2E, T2G, T2D, T2F; + T2D = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T2E = BYTWJ(&(W[TWVL * 4]), T2D); + T2F = LD(&(x[WS(rs, 35)]), ms, &(x[WS(rs, 1)])); + T2G = BYTWJ(&(W[TWVL * 68]), T2F); + T2H = VSUB(T2E, T2G); + T69 = VADD(T2E, T2G); + } + { + V T2U, T2W, T2T, T2V; + T2T = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T2U = BYTWJ(&(W[TWVL * 20]), T2T); + T2V = LD(&(x[WS(rs, 43)]), ms, &(x[WS(rs, 1)])); + T2W = BYTWJ(&(W[TWVL * 84]), T2V); + T2X = VSUB(T2U, T2W); + T6d = VADD(T2U, T2W); + } + { + V T2J, T2L, T2I, T2K; + T2I = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T2J = BYTWJ(&(W[TWVL * 36]), T2I); + T2K = LD(&(x[WS(rs, 51)]), ms, &(x[WS(rs, 1)])); + T2L = BYTWJ(&(W[TWVL * 100]), T2K); + T2M = VSUB(T2J, T2L); + T6a = VADD(T2J, T2L); + } + { + V T2P, T2R, T2O, T2Q; + T2O = LD(&(x[WS(rs, 59)]), ms, &(x[WS(rs, 1)])); + T2P = BYTWJ(&(W[TWVL * 116]), T2O); + T2Q = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T2R = BYTWJ(&(W[TWVL * 52]), T2Q); + T2S = VSUB(T2P, T2R); + T6c = VADD(T2P, T2R); + } + { + V T2N, T2Y, T7v, T7w; + T2N = VFNMS(LDK(KP382683432), T2M, VMUL(LDK(KP923879532), T2H)); + T2Y = VFMA(LDK(KP923879532), T2S, VMUL(LDK(KP382683432), T2X)); + T2Z = VADD(T2N, T2Y); + T4w = VSUB(T2Y, T2N); + T7v = VADD(T69, T6a); + T7w = VADD(T6c, T6d); + T7x = VADD(T7v, T7w); + T83 = VSUB(T7w, T7v); + } + { + V T31, T32, T6b, T6e; + T31 = VFNMS(LDK(KP923879532), T2X, VMUL(LDK(KP382683432), T2S)); + T32 = VFMA(LDK(KP382683432), T2H, VMUL(LDK(KP923879532), T2M)); + T33 = VSUB(T31, T32); + T4t = VADD(T32, T31); + T6b = VSUB(T69, T6a); + T6e = VSUB(T6c, T6d); + T6f = VMUL(LDK(KP707106781), VADD(T6b, T6e)); + T6k = VMUL(LDK(KP707106781), VSUB(T6e, T6b)); + } + } + { + V T7k, T7M, T7R, T7T, T7z, T7I, T7H, T7N, T7O, T7S; + { + V T7g, T7j, T7P, T7Q; + T7g = VADD(T7e, T7f); + T7j = VADD(T7h, T7i); + T7k = VSUB(T7g, T7j); + T7M = VADD(T7g, T7j); + T7P = VADD(T7n, T7q); + T7Q = VADD(T7u, T7x); + T7R = VADD(T7P, T7Q); + T7T = VBYI(VSUB(T7Q, T7P)); + } + { + V T7r, T7y, T7D, T7G; + T7r = VSUB(T7n, T7q); + T7y = VSUB(T7u, T7x); + T7z = VMUL(LDK(KP707106781), VADD(T7r, T7y)); + T7I = VMUL(LDK(KP707106781), VSUB(T7y, T7r)); + T7D = VADD(T7B, T7C); + T7G = VADD(T7E, T7F); + T7H = VSUB(T7D, T7G); + T7N = VADD(T7G, T7D); + } + T7O = VADD(T7M, T7N); + ST(&(x[WS(rs, 32)]), VSUB(T7O, T7R), ms, &(x[0])); + ST(&(x[0]), VADD(T7O, T7R), ms, &(x[0])); + T7S = VSUB(T7M, T7N); + ST(&(x[WS(rs, 48)]), VSUB(T7S, T7T), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T7S, T7T), ms, &(x[0])); + { + V T7A, T7J, T7K, T7L; + T7A = VADD(T7k, T7z); + T7J = VBYI(VADD(T7H, T7I)); + ST(&(x[WS(rs, 56)]), VSUB(T7A, T7J), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T7A, T7J), ms, &(x[0])); + T7K = VSUB(T7k, T7z); + T7L = VBYI(VSUB(T7I, T7H)); + ST(&(x[WS(rs, 40)]), VSUB(T7K, T7L), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VADD(T7K, T7L), ms, &(x[0])); + } + } + { + V T7Y, T8j, T8c, T8k, T85, T8g, T89, T8h; + { + V T7U, T7X, T8a, T8b; + T7U = VSUB(T7e, T7f); + T7X = VMUL(LDK(KP707106781), VADD(T7V, T7W)); + T7Y = VADD(T7U, T7X); + T8j = VSUB(T7U, T7X); + T8a = VFNMS(LDK(KP382683432), T7Z, VMUL(LDK(KP923879532), T80)); + T8b = VFMA(LDK(KP382683432), T82, VMUL(LDK(KP923879532), T83)); + T8c = VADD(T8a, T8b); + T8k = VSUB(T8b, T8a); + } + { + V T81, T84, T87, T88; + T81 = VFMA(LDK(KP923879532), T7Z, VMUL(LDK(KP382683432), T80)); + T84 = VFNMS(LDK(KP382683432), T83, VMUL(LDK(KP923879532), T82)); + T85 = VADD(T81, T84); + T8g = VSUB(T84, T81); + T87 = VSUB(T7i, T7h); + T88 = VMUL(LDK(KP707106781), VSUB(T7W, T7V)); + T89 = VADD(T87, T88); + T8h = VSUB(T88, T87); + } + { + V T86, T8d, T8m, T8n; + T86 = VADD(T7Y, T85); + T8d = VBYI(VADD(T89, T8c)); + ST(&(x[WS(rs, 60)]), VSUB(T86, T8d), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T86, T8d), ms, &(x[0])); + T8m = VBYI(VADD(T8h, T8g)); + T8n = VADD(T8j, T8k); + ST(&(x[WS(rs, 12)]), VADD(T8m, T8n), ms, &(x[0])); + ST(&(x[WS(rs, 52)]), VSUB(T8n, T8m), ms, &(x[0])); + } + { + V T8e, T8f, T8i, T8l; + T8e = VSUB(T7Y, T85); + T8f = VBYI(VSUB(T8c, T89)); + ST(&(x[WS(rs, 36)]), VSUB(T8e, T8f), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VADD(T8e, T8f), ms, &(x[0])); + T8i = VBYI(VSUB(T8g, T8h)); + T8l = VSUB(T8j, T8k); + ST(&(x[WS(rs, 20)]), VADD(T8i, T8l), ms, &(x[0])); + ST(&(x[WS(rs, 44)]), VSUB(T8l, T8i), ms, &(x[0])); + } + } + { + V T5O, T6H, T6x, T6F, T6n, T6I, T6A, T6E; + { + V T5y, T5N, T6t, T6w; + T5y = VADD(T5q, T5x); + T5N = VADD(T5F, T5M); + T5O = VADD(T5y, T5N); + T6H = VSUB(T5y, T5N); + T6t = VADD(T6r, T6s); + T6w = VADD(T6u, T6v); + T6x = VADD(T6t, T6w); + T6F = VSUB(T6w, T6t); + { + V T65, T6y, T6m, T6z; + { + V T5Z, T64, T6g, T6l; + T5Z = VADD(T5R, T5Y); + T64 = VADD(T62, T63); + T65 = VFMA(LDK(KP980785280), T5Z, VMUL(LDK(KP195090322), T64)); + T6y = VFNMS(LDK(KP195090322), T5Z, VMUL(LDK(KP980785280), T64)); + T6g = VADD(T68, T6f); + T6l = VADD(T6j, T6k); + T6m = VFNMS(LDK(KP195090322), T6l, VMUL(LDK(KP980785280), T6g)); + T6z = VFMA(LDK(KP195090322), T6g, VMUL(LDK(KP980785280), T6l)); + } + T6n = VADD(T65, T6m); + T6I = VSUB(T6z, T6y); + T6A = VADD(T6y, T6z); + T6E = VSUB(T6m, T65); + } + } + { + V T6o, T6B, T6K, T6L; + T6o = VADD(T5O, T6n); + T6B = VBYI(VADD(T6x, T6A)); + ST(&(x[WS(rs, 62)]), VSUB(T6o, T6B), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T6o, T6B), ms, &(x[0])); + T6K = VBYI(VADD(T6F, T6E)); + T6L = VADD(T6H, T6I); + ST(&(x[WS(rs, 14)]), VADD(T6K, T6L), ms, &(x[0])); + ST(&(x[WS(rs, 50)]), VSUB(T6L, T6K), ms, &(x[0])); + } + { + V T6C, T6D, T6G, T6J; + T6C = VSUB(T5O, T6n); + T6D = VBYI(VSUB(T6A, T6x)); + ST(&(x[WS(rs, 34)]), VSUB(T6C, T6D), ms, &(x[0])); + ST(&(x[WS(rs, 30)]), VADD(T6C, T6D), ms, &(x[0])); + T6G = VBYI(VSUB(T6E, T6F)); + T6J = VSUB(T6H, T6I); + ST(&(x[WS(rs, 18)]), VADD(T6G, T6J), ms, &(x[0])); + ST(&(x[WS(rs, 46)]), VSUB(T6J, T6G), ms, &(x[0])); + } + } + { + V T6O, T79, T6Z, T77, T6V, T7a, T72, T76; + { + V T6M, T6N, T6X, T6Y; + T6M = VSUB(T5q, T5x); + T6N = VSUB(T6v, T6u); + T6O = VADD(T6M, T6N); + T79 = VSUB(T6M, T6N); + T6X = VSUB(T6s, T6r); + T6Y = VSUB(T5M, T5F); + T6Z = VADD(T6X, T6Y); + T77 = VSUB(T6Y, T6X); + { + V T6R, T70, T6U, T71; + { + V T6P, T6Q, T6S, T6T; + T6P = VSUB(T5R, T5Y); + T6Q = VSUB(T63, T62); + T6R = VFMA(LDK(KP831469612), T6P, VMUL(LDK(KP555570233), T6Q)); + T70 = VFNMS(LDK(KP555570233), T6P, VMUL(LDK(KP831469612), T6Q)); + T6S = VSUB(T68, T6f); + T6T = VSUB(T6k, T6j); + T6U = VFNMS(LDK(KP555570233), T6T, VMUL(LDK(KP831469612), T6S)); + T71 = VFMA(LDK(KP555570233), T6S, VMUL(LDK(KP831469612), T6T)); + } + T6V = VADD(T6R, T6U); + T7a = VSUB(T71, T70); + T72 = VADD(T70, T71); + T76 = VSUB(T6U, T6R); + } + } + { + V T6W, T73, T7c, T7d; + T6W = VADD(T6O, T6V); + T73 = VBYI(VADD(T6Z, T72)); + ST(&(x[WS(rs, 58)]), VSUB(T6W, T73), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T6W, T73), ms, &(x[0])); + T7c = VBYI(VADD(T77, T76)); + T7d = VADD(T79, T7a); + ST(&(x[WS(rs, 10)]), VADD(T7c, T7d), ms, &(x[0])); + ST(&(x[WS(rs, 54)]), VSUB(T7d, T7c), ms, &(x[0])); + } + { + V T74, T75, T78, T7b; + T74 = VSUB(T6O, T6V); + T75 = VBYI(VSUB(T72, T6Z)); + ST(&(x[WS(rs, 38)]), VSUB(T74, T75), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VADD(T74, T75), ms, &(x[0])); + T78 = VBYI(VSUB(T76, T77)); + T7b = VSUB(T79, T7a); + ST(&(x[WS(rs, 22)]), VADD(T78, T7b), ms, &(x[0])); + ST(&(x[WS(rs, 42)]), VSUB(T7b, T78), ms, &(x[0])); + } + } + { + V T4k, T5h, T4R, T59, T4H, T5j, T4P, T4Y, T4z, T4S, T4K, T4O, T55, T5k, T5c; + V T5g; + { + V T4c, T57, T4j, T58, T4f, T4i; + T4c = VADD(T4a, T4b); + T57 = VSUB(T4C, T4B); + T4f = VFMA(LDK(KP831469612), T4d, VMUL(LDK(KP555570233), T4e)); + T4i = VFNMS(LDK(KP555570233), T4h, VMUL(LDK(KP831469612), T4g)); + T4j = VADD(T4f, T4i); + T58 = VSUB(T4i, T4f); + T4k = VADD(T4c, T4j); + T5h = VSUB(T58, T57); + T4R = VSUB(T4c, T4j); + T59 = VADD(T57, T58); + } + { + V T4D, T4W, T4G, T4X, T4E, T4F; + T4D = VADD(T4B, T4C); + T4W = VSUB(T4a, T4b); + T4E = VFNMS(LDK(KP555570233), T4d, VMUL(LDK(KP831469612), T4e)); + T4F = VFMA(LDK(KP555570233), T4g, VMUL(LDK(KP831469612), T4h)); + T4G = VADD(T4E, T4F); + T4X = VSUB(T4F, T4E); + T4H = VADD(T4D, T4G); + T5j = VSUB(T4W, T4X); + T4P = VSUB(T4G, T4D); + T4Y = VADD(T4W, T4X); + } + { + V T4r, T4I, T4y, T4J; + { + V T4n, T4q, T4u, T4x; + T4n = VADD(T4l, T4m); + T4q = VADD(T4o, T4p); + T4r = VFMA(LDK(KP956940335), T4n, VMUL(LDK(KP290284677), T4q)); + T4I = VFNMS(LDK(KP290284677), T4n, VMUL(LDK(KP956940335), T4q)); + T4u = VADD(T4s, T4t); + T4x = VADD(T4v, T4w); + T4y = VFNMS(LDK(KP290284677), T4x, VMUL(LDK(KP956940335), T4u)); + T4J = VFMA(LDK(KP290284677), T4u, VMUL(LDK(KP956940335), T4x)); + } + T4z = VADD(T4r, T4y); + T4S = VSUB(T4J, T4I); + T4K = VADD(T4I, T4J); + T4O = VSUB(T4y, T4r); + } + { + V T51, T5a, T54, T5b; + { + V T4Z, T50, T52, T53; + T4Z = VSUB(T4l, T4m); + T50 = VSUB(T4p, T4o); + T51 = VFMA(LDK(KP881921264), T4Z, VMUL(LDK(KP471396736), T50)); + T5a = VFNMS(LDK(KP471396736), T4Z, VMUL(LDK(KP881921264), T50)); + T52 = VSUB(T4s, T4t); + T53 = VSUB(T4w, T4v); + T54 = VFNMS(LDK(KP471396736), T53, VMUL(LDK(KP881921264), T52)); + T5b = VFMA(LDK(KP471396736), T52, VMUL(LDK(KP881921264), T53)); + } + T55 = VADD(T51, T54); + T5k = VSUB(T5b, T5a); + T5c = VADD(T5a, T5b); + T5g = VSUB(T54, T51); + } + { + V T4A, T4L, T5i, T5l; + T4A = VADD(T4k, T4z); + T4L = VBYI(VADD(T4H, T4K)); + ST(&(x[WS(rs, 61)]), VSUB(T4A, T4L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T4A, T4L), ms, &(x[WS(rs, 1)])); + T5i = VBYI(VSUB(T5g, T5h)); + T5l = VSUB(T5j, T5k); + ST(&(x[WS(rs, 21)]), VADD(T5i, T5l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 43)]), VSUB(T5l, T5i), ms, &(x[WS(rs, 1)])); + } + { + V T5m, T5n, T4M, T4N; + T5m = VBYI(VADD(T5h, T5g)); + T5n = VADD(T5j, T5k); + ST(&(x[WS(rs, 11)]), VADD(T5m, T5n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 53)]), VSUB(T5n, T5m), ms, &(x[WS(rs, 1)])); + T4M = VSUB(T4k, T4z); + T4N = VBYI(VSUB(T4K, T4H)); + ST(&(x[WS(rs, 35)]), VSUB(T4M, T4N), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VADD(T4M, T4N), ms, &(x[WS(rs, 1)])); + } + { + V T4Q, T4T, T56, T5d; + T4Q = VBYI(VSUB(T4O, T4P)); + T4T = VSUB(T4R, T4S); + ST(&(x[WS(rs, 19)]), VADD(T4Q, T4T), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 45)]), VSUB(T4T, T4Q), ms, &(x[WS(rs, 1)])); + T56 = VADD(T4Y, T55); + T5d = VBYI(VADD(T59, T5c)); + ST(&(x[WS(rs, 59)]), VSUB(T56, T5d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T56, T5d), ms, &(x[WS(rs, 1)])); + } + { + V T5e, T5f, T4U, T4V; + T5e = VSUB(T4Y, T55); + T5f = VBYI(VSUB(T5c, T59)); + ST(&(x[WS(rs, 37)]), VSUB(T5e, T5f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VADD(T5e, T5f), ms, &(x[WS(rs, 1)])); + T4U = VBYI(VADD(T4P, T4O)); + T4V = VADD(T4R, T4S); + ST(&(x[WS(rs, 13)]), VADD(T4U, T4V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 51)]), VSUB(T4V, T4U), ms, &(x[WS(rs, 1)])); + } + } + { + V T1u, T43, T3D, T3V, T3t, T45, T3B, T3K, T3d, T3E, T3w, T3A, T3R, T46, T3Y; + V T42; + { + V TE, T3T, T1t, T3U, T13, T1s; + TE = VSUB(Tg, TD); + T3T = VADD(T3o, T3h); + T13 = VFMA(LDK(KP195090322), TV, VMUL(LDK(KP980785280), T12)); + T1s = VFNMS(LDK(KP195090322), T1r, VMUL(LDK(KP980785280), T1k)); + T1t = VSUB(T13, T1s); + T3U = VADD(T1s, T13); + T1u = VADD(TE, T1t); + T43 = VSUB(T3U, T3T); + T3D = VSUB(TE, T1t); + T3V = VADD(T3T, T3U); + } + { + V T3p, T3I, T3s, T3J, T3q, T3r; + T3p = VSUB(T3h, T3o); + T3I = VADD(Tg, TD); + T3q = VFNMS(LDK(KP195090322), T12, VMUL(LDK(KP980785280), TV)); + T3r = VFMA(LDK(KP980785280), T1r, VMUL(LDK(KP195090322), T1k)); + T3s = VSUB(T3q, T3r); + T3J = VADD(T3r, T3q); + T3t = VADD(T3p, T3s); + T45 = VSUB(T3I, T3J); + T3B = VSUB(T3s, T3p); + T3K = VADD(T3I, T3J); + } + { + V T2l, T3u, T3c, T3v; + { + V T29, T2k, T30, T3b; + T29 = VSUB(T1R, T28); + T2k = VSUB(T2g, T2j); + T2l = VFMA(LDK(KP634393284), T29, VMUL(LDK(KP773010453), T2k)); + T3u = VFNMS(LDK(KP634393284), T2k, VMUL(LDK(KP773010453), T29)); + T30 = VSUB(T2C, T2Z); + T3b = VSUB(T33, T3a); + T3c = VFNMS(LDK(KP634393284), T3b, VMUL(LDK(KP773010453), T30)); + T3v = VFMA(LDK(KP773010453), T3b, VMUL(LDK(KP634393284), T30)); + } + T3d = VADD(T2l, T3c); + T3E = VSUB(T3v, T3u); + T3w = VADD(T3u, T3v); + T3A = VSUB(T3c, T2l); + } + { + V T3N, T3W, T3Q, T3X; + { + V T3L, T3M, T3O, T3P; + T3L = VADD(T28, T1R); + T3M = VADD(T2g, T2j); + T3N = VFMA(LDK(KP098017140), T3L, VMUL(LDK(KP995184726), T3M)); + T3W = VFNMS(LDK(KP098017140), T3M, VMUL(LDK(KP995184726), T3L)); + T3O = VADD(T2C, T2Z); + T3P = VADD(T3a, T33); + T3Q = VFNMS(LDK(KP098017140), T3P, VMUL(LDK(KP995184726), T3O)); + T3X = VFMA(LDK(KP995184726), T3P, VMUL(LDK(KP098017140), T3O)); + } + T3R = VADD(T3N, T3Q); + T46 = VSUB(T3X, T3W); + T3Y = VADD(T3W, T3X); + T42 = VSUB(T3Q, T3N); + } + { + V T3e, T3x, T44, T47; + T3e = VADD(T1u, T3d); + T3x = VBYI(VADD(T3t, T3w)); + ST(&(x[WS(rs, 57)]), VSUB(T3e, T3x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T3e, T3x), ms, &(x[WS(rs, 1)])); + T44 = VBYI(VSUB(T42, T43)); + T47 = VSUB(T45, T46); + ST(&(x[WS(rs, 17)]), VADD(T44, T47), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 47)]), VSUB(T47, T44), ms, &(x[WS(rs, 1)])); + } + { + V T48, T49, T3y, T3z; + T48 = VBYI(VADD(T43, T42)); + T49 = VADD(T45, T46); + ST(&(x[WS(rs, 15)]), VADD(T48, T49), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 49)]), VSUB(T49, T48), ms, &(x[WS(rs, 1)])); + T3y = VSUB(T1u, T3d); + T3z = VBYI(VSUB(T3w, T3t)); + ST(&(x[WS(rs, 39)]), VSUB(T3y, T3z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VADD(T3y, T3z), ms, &(x[WS(rs, 1)])); + } + { + V T3C, T3F, T3S, T3Z; + T3C = VBYI(VSUB(T3A, T3B)); + T3F = VSUB(T3D, T3E); + ST(&(x[WS(rs, 23)]), VADD(T3C, T3F), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 41)]), VSUB(T3F, T3C), ms, &(x[WS(rs, 1)])); + T3S = VADD(T3K, T3R); + T3Z = VBYI(VADD(T3V, T3Y)); + ST(&(x[WS(rs, 63)]), VSUB(T3S, T3Z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T3S, T3Z), ms, &(x[WS(rs, 1)])); + } + { + V T40, T41, T3G, T3H; + T40 = VSUB(T3K, T3R); + T41 = VBYI(VSUB(T3Y, T3V)); + ST(&(x[WS(rs, 33)]), VSUB(T40, T41), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VADD(T40, T41), ms, &(x[WS(rs, 1)])); + T3G = VBYI(VADD(T3B, T3A)); + T3H = VADD(T3D, T3E); + ST(&(x[WS(rs, 9)]), VADD(T3G, T3H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 55)]), VSUB(T3H, T3G), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + VTW(0, 8), + VTW(0, 9), + VTW(0, 10), + VTW(0, 11), + VTW(0, 12), + VTW(0, 13), + VTW(0, 14), + VTW(0, 15), + VTW(0, 16), + VTW(0, 17), + VTW(0, 18), + VTW(0, 19), + VTW(0, 20), + VTW(0, 21), + VTW(0, 22), + VTW(0, 23), + VTW(0, 24), + VTW(0, 25), + VTW(0, 26), + VTW(0, 27), + VTW(0, 28), + VTW(0, 29), + VTW(0, 30), + VTW(0, 31), + VTW(0, 32), + VTW(0, 33), + VTW(0, 34), + VTW(0, 35), + VTW(0, 36), + VTW(0, 37), + VTW(0, 38), + VTW(0, 39), + VTW(0, 40), + VTW(0, 41), + VTW(0, 42), + VTW(0, 43), + VTW(0, 44), + VTW(0, 45), + VTW(0, 46), + VTW(0, 47), + VTW(0, 48), + VTW(0, 49), + VTW(0, 50), + VTW(0, 51), + VTW(0, 52), + VTW(0, 53), + VTW(0, 54), + VTW(0, 55), + VTW(0, 56), + VTW(0, 57), + VTW(0, 58), + VTW(0, 59), + VTW(0, 60), + VTW(0, 61), + VTW(0, 62), + VTW(0, 63), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 64, XSIMD_STRING("t2fv_64"), twinstr, &GENUS, {467, 198, 52, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_64) (planner *p) { + X(kdft_dit_register) (p, t2fv_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_8.c new file mode 100644 index 000000000..720208fd0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2fv_8.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:42 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t2fv_8 -include dft/simd/t2f.h */ + +/* + * This function contains 33 FP additions, 24 FP multiplications, + * (or, 23 additions, 14 multiplications, 10 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tl, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Ti, Tk, Th, Tj; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = BYTWJ(&(W[TWVL * 2]), Th); + Tj = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tk = BYTWJ(&(W[TWVL * 10]), Tj); + Tl = VSUB(Ti, Tk); + Tr = VADD(Ti, Tk); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTWJ(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VADD(Tq, Tr); + Tv = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[0]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VSUB(Tq, Tr); + Tx = VSUB(Tu, Tt); + ST(&(x[WS(rs, 6)]), VFNMSI(Tx, Tw), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(Tx, Tw), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Tm; + Tf = VADD(T9, Te); + Tg = VFMA(LDK(KP707106781), Tf, T4); + To = VFNMS(LDK(KP707106781), Tf, T4); + Tm = VSUB(Te, T9); + Tn = VFNMS(LDK(KP707106781), Tm, Tl); + Tp = VFMA(LDK(KP707106781), Tm, Tl); + ST(&(x[WS(rs, 1)]), VFNMSI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tp, To), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tn, Tg), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Tp, To), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t2fv_8"), twinstr, &GENUS, {23, 14, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_8) (planner *p) { + X(kdft_dit_register) (p, t2fv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -n 8 -name t2fv_8 -include dft/simd/t2f.h */ + +/* + * This function contains 33 FP additions, 16 FP multiplications, + * (or, 33 additions, 16 multiplications, 0 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t2f.h" + +static void t2fv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 14)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, Tq, Tm, Tr, T9, Tt, Te, Tu, T1, T3, T2; + T1 = LD(&(x[0]), ms, &(x[0])); + T2 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T3 = BYTWJ(&(W[TWVL * 6]), T2); + T4 = VSUB(T1, T3); + Tq = VADD(T1, T3); + { + V Tj, Tl, Ti, Tk; + Ti = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tj = BYTWJ(&(W[TWVL * 2]), Ti); + Tk = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tl = BYTWJ(&(W[TWVL * 10]), Tk); + Tm = VSUB(Tj, Tl); + Tr = VADD(Tj, Tl); + } + { + V T6, T8, T5, T7; + T5 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T6 = BYTWJ(&(W[0]), T5); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = BYTWJ(&(W[TWVL * 8]), T7); + T9 = VSUB(T6, T8); + Tt = VADD(T6, T8); + } + { + V Tb, Td, Ta, Tc; + Ta = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tb = BYTWJ(&(W[TWVL * 12]), Ta); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = BYTWJ(&(W[TWVL * 4]), Tc); + Te = VSUB(Tb, Td); + Tu = VADD(Tb, Td); + } + { + V Ts, Tv, Tw, Tx; + Ts = VADD(Tq, Tr); + Tv = VADD(Tt, Tu); + ST(&(x[WS(rs, 4)]), VSUB(Ts, Tv), ms, &(x[0])); + ST(&(x[0]), VADD(Ts, Tv), ms, &(x[0])); + Tw = VSUB(Tq, Tr); + Tx = VBYI(VSUB(Tu, Tt)); + ST(&(x[WS(rs, 6)]), VSUB(Tw, Tx), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tw, Tx), ms, &(x[0])); + { + V Tg, To, Tn, Tp, Tf, Th; + Tf = VMUL(LDK(KP707106781), VADD(T9, Te)); + Tg = VADD(T4, Tf); + To = VSUB(T4, Tf); + Th = VMUL(LDK(KP707106781), VSUB(Te, T9)); + Tn = VBYI(VSUB(Th, Tm)); + Tp = VBYI(VADD(Tm, Th)); + ST(&(x[WS(rs, 7)]), VSUB(Tg, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(To, Tp), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tg, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(To, Tp), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 2), + VTW(0, 3), + VTW(0, 4), + VTW(0, 5), + VTW(0, 6), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t2fv_8"), twinstr, &GENUS, {33, 16, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2fv_8) (planner *p) { + X(kdft_dit_register) (p, t2fv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_16.c new file mode 100644 index 000000000..2f6549455 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_16.c @@ -0,0 +1,838 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 16 -name t2sv_16 -include dft/simd/ts.h */ + +/* + * This function contains 196 FP additions, 134 FP multiplications, + * (or, 104 additions, 42 multiplications, 92 fused multiply/add), + * 90 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 8), MAKE_VOLATILE_STRIDE(32, rs)) { + V T2, Tf, TM, TO, T3, T6, T5, Th, Tz, Ti, T7, TZ, TT, Tq, TW; + V Tb, Tu, TP, TI, TF, TC, T1z, T1O, T1D, T1L, Tm, T1f, T1p, T1j, T1m; + { + V TN, TS, T4, Tp, Ta, Tt, Tl, Tg; + T2 = LDW(&(W[0])); + Tf = LDW(&(W[TWVL * 2])); + Tg = VMUL(T2, Tf); + TM = LDW(&(W[TWVL * 6])); + TN = VMUL(T2, TM); + TO = LDW(&(W[TWVL * 7])); + TS = VMUL(T2, TO); + T3 = LDW(&(W[TWVL * 4])); + T4 = VMUL(T2, T3); + Tp = VMUL(Tf, T3); + T6 = LDW(&(W[TWVL * 5])); + Ta = VMUL(T2, T6); + Tt = VMUL(Tf, T6); + T5 = LDW(&(W[TWVL * 1])); + Th = LDW(&(W[TWVL * 3])); + Tl = VMUL(T2, Th); + Tz = VFMA(T5, Th, Tg); + Ti = VFNMS(T5, Th, Tg); + T7 = VFMA(T5, T6, T4); + TZ = VFNMS(Th, T3, Tt); + TT = VFNMS(T5, TM, TS); + Tq = VFNMS(Th, T6, Tp); + TW = VFMA(Th, T6, Tp); + Tb = VFNMS(T5, T3, Ta); + Tu = VFMA(Th, T3, Tt); + TP = VFMA(T5, TO, TN); + TI = VFMA(T5, T3, Ta); + TF = VFNMS(T5, T6, T4); + { + V T1y, T1C, T1e, T1i; + T1y = VMUL(Tz, T3); + T1C = VMUL(Tz, T6); + TC = VFNMS(T5, Tf, Tl); + T1z = VFMA(TC, T6, T1y); + T1O = VFMA(TC, T3, T1C); + T1D = VFNMS(TC, T3, T1C); + T1L = VFNMS(TC, T6, T1y); + T1e = VMUL(Ti, T3); + T1i = VMUL(Ti, T6); + Tm = VFMA(T5, Tf, Tl); + T1f = VFMA(Tm, T6, T1e); + T1p = VFMA(Tm, T3, T1i); + T1j = VFNMS(Tm, T3, T1i); + T1m = VFNMS(Tm, T6, T1e); + } + } + { + V Te, T1U, T3A, T3L, T1G, T2D, T2A, T3h, T1R, T2B, T2I, T3i, Tx, T3M, T1Z; + V T3w, TL, T26, T25, T37, T1d, T2o, T2l, T3c, T1s, T2m, T2t, T3d, T12, T28; + V T2d, T38; + { + V T1, T3z, T8, T9, Tc, T3x, Td, T3y; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T3z = LD(&(ii[0]), ms, &(ii[0])); + T8 = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + T9 = VMUL(T7, T8); + Tc = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + T3x = VMUL(T7, Tc); + Td = VFMA(Tb, Tc, T9); + Te = VADD(T1, Td); + T1U = VSUB(T1, Td); + T3y = VFNMS(Tb, T8, T3x); + T3A = VADD(T3y, T3z); + T3L = VSUB(T3z, T3y); + } + { + V T1u, T1v, T1w, T2w, T1A, T1B, T1E, T2y; + T1u = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T1v = VMUL(TM, T1u); + T1w = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T2w = VMUL(TM, T1w); + T1A = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T1B = VMUL(T1z, T1A); + T1E = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T2y = VMUL(T1z, T1E); + { + V T1x, T1F, T2x, T2z; + T1x = VFMA(TO, T1w, T1v); + T1F = VFMA(T1D, T1E, T1B); + T1G = VADD(T1x, T1F); + T2D = VSUB(T1x, T1F); + T2x = VFNMS(TO, T1u, T2w); + T2z = VFNMS(T1D, T1A, T2y); + T2A = VSUB(T2x, T2z); + T3h = VADD(T2x, T2z); + } + } + { + V T1H, T1I, T1J, T2E, T1M, T1N, T1P, T2G; + T1H = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T1I = VMUL(Tf, T1H); + T1J = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T2E = VMUL(Tf, T1J); + T1M = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T1N = VMUL(T1L, T1M); + T1P = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T2G = VMUL(T1L, T1P); + { + V T1K, T1Q, T2F, T2H; + T1K = VFMA(Th, T1J, T1I); + T1Q = VFMA(T1O, T1P, T1N); + T1R = VADD(T1K, T1Q); + T2B = VSUB(T1K, T1Q); + T2F = VFNMS(Th, T1H, T2E); + T2H = VFNMS(T1O, T1M, T2G); + T2I = VSUB(T2F, T2H); + T3i = VADD(T2F, T2H); + } + } + { + V Tj, Tk, Tn, T1V, Tr, Ts, Tv, T1X; + Tj = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Tk = VMUL(Ti, Tj); + Tn = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T1V = VMUL(Ti, Tn); + Tr = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + Ts = VMUL(Tq, Tr); + Tv = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + T1X = VMUL(Tq, Tv); + { + V To, Tw, T1W, T1Y; + To = VFMA(Tm, Tn, Tk); + Tw = VFMA(Tu, Tv, Ts); + Tx = VADD(To, Tw); + T3M = VSUB(To, Tw); + T1W = VFNMS(Tm, Tj, T1V); + T1Y = VFNMS(Tu, Tr, T1X); + T1Z = VSUB(T1W, T1Y); + T3w = VADD(T1W, T1Y); + } + } + { + V TA, TB, TD, T21, TG, TH, TJ, T23; + TA = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + TB = VMUL(Tz, TA); + TD = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T21 = VMUL(Tz, TD); + TG = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + TH = VMUL(TF, TG); + TJ = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + T23 = VMUL(TF, TJ); + { + V TE, TK, T22, T24; + TE = VFMA(TC, TD, TB); + TK = VFMA(TI, TJ, TH); + TL = VADD(TE, TK); + T26 = VSUB(TE, TK); + T22 = VFNMS(TC, TA, T21); + T24 = VFNMS(TI, TG, T23); + T25 = VSUB(T22, T24); + T37 = VADD(T22, T24); + } + } + { + V T15, T16, T17, T2h, T19, T1a, T1b, T2j; + T15 = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T16 = VMUL(T2, T15); + T17 = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T2h = VMUL(T2, T17); + T19 = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + T1a = VMUL(T3, T19); + T1b = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + T2j = VMUL(T3, T1b); + { + V T18, T1c, T2i, T2k; + T18 = VFMA(T5, T17, T16); + T1c = VFMA(T6, T1b, T1a); + T1d = VADD(T18, T1c); + T2o = VSUB(T18, T1c); + T2i = VFNMS(T5, T15, T2h); + T2k = VFNMS(T6, T19, T2j); + T2l = VSUB(T2i, T2k); + T3c = VADD(T2i, T2k); + } + } + { + V T1g, T1h, T1k, T2p, T1n, T1o, T1q, T2r; + T1g = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T1h = VMUL(T1f, T1g); + T1k = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T2p = VMUL(T1f, T1k); + T1n = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T1o = VMUL(T1m, T1n); + T1q = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T2r = VMUL(T1m, T1q); + { + V T1l, T1r, T2q, T2s; + T1l = VFMA(T1j, T1k, T1h); + T1r = VFMA(T1p, T1q, T1o); + T1s = VADD(T1l, T1r); + T2m = VSUB(T1l, T1r); + T2q = VFNMS(T1j, T1g, T2p); + T2s = VFNMS(T1p, T1n, T2r); + T2t = VSUB(T2q, T2s); + T3d = VADD(T2q, T2s); + } + } + { + V TQ, TR, TU, T29, TX, TY, T10, T2b; + TQ = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + TR = VMUL(TP, TQ); + TU = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + T29 = VMUL(TP, TU); + TX = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + TY = VMUL(TW, TX); + T10 = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + T2b = VMUL(TW, T10); + { + V TV, T11, T2a, T2c; + TV = VFMA(TT, TU, TR); + T11 = VFMA(TZ, T10, TY); + T12 = VADD(TV, T11); + T28 = VSUB(TV, T11); + T2a = VFNMS(TT, TQ, T29); + T2c = VFNMS(TZ, TX, T2b); + T2d = VSUB(T2a, T2c); + T38 = VADD(T2a, T2c); + } + } + { + V T14, T3q, T3C, T3E, T1T, T3D, T3t, T3u; + { + V Ty, T13, T3v, T3B; + Ty = VADD(Te, Tx); + T13 = VADD(TL, T12); + T14 = VADD(Ty, T13); + T3q = VSUB(Ty, T13); + T3v = VADD(T37, T38); + T3B = VADD(T3w, T3A); + T3C = VADD(T3v, T3B); + T3E = VSUB(T3B, T3v); + } + { + V T1t, T1S, T3r, T3s; + T1t = VADD(T1d, T1s); + T1S = VADD(T1G, T1R); + T1T = VADD(T1t, T1S); + T3D = VSUB(T1S, T1t); + T3r = VADD(T3c, T3d); + T3s = VADD(T3h, T3i); + T3t = VSUB(T3r, T3s); + T3u = VADD(T3r, T3s); + } + ST(&(ri[WS(rs, 8)]), VSUB(T14, T1T), ms, &(ri[0])); + ST(&(ii[WS(rs, 8)]), VSUB(T3C, T3u), ms, &(ii[0])); + ST(&(ri[0]), VADD(T14, T1T), ms, &(ri[0])); + ST(&(ii[0]), VADD(T3u, T3C), ms, &(ii[0])); + ST(&(ri[WS(rs, 12)]), VSUB(T3q, T3t), ms, &(ri[0])); + ST(&(ii[WS(rs, 12)]), VSUB(T3E, T3D), ms, &(ii[0])); + ST(&(ri[WS(rs, 4)]), VADD(T3q, T3t), ms, &(ri[0])); + ST(&(ii[WS(rs, 4)]), VADD(T3D, T3E), ms, &(ii[0])); + } + { + V T3a, T3m, T3H, T3J, T3f, T3n, T3k, T3o; + { + V T36, T39, T3F, T3G; + T36 = VSUB(Te, Tx); + T39 = VSUB(T37, T38); + T3a = VADD(T36, T39); + T3m = VSUB(T36, T39); + T3F = VSUB(T12, TL); + T3G = VSUB(T3A, T3w); + T3H = VADD(T3F, T3G); + T3J = VSUB(T3G, T3F); + } + { + V T3b, T3e, T3g, T3j; + T3b = VSUB(T1d, T1s); + T3e = VSUB(T3c, T3d); + T3f = VADD(T3b, T3e); + T3n = VSUB(T3e, T3b); + T3g = VSUB(T1G, T1R); + T3j = VSUB(T3h, T3i); + T3k = VSUB(T3g, T3j); + T3o = VADD(T3g, T3j); + } + { + V T3l, T3I, T3p, T3K; + T3l = VADD(T3f, T3k); + ST(&(ri[WS(rs, 10)]), VFNMS(LDK(KP707106781), T3l, T3a), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VFMA(LDK(KP707106781), T3l, T3a), ms, &(ri[0])); + T3I = VADD(T3n, T3o); + ST(&(ii[WS(rs, 2)]), VFMA(LDK(KP707106781), T3I, T3H), ms, &(ii[0])); + ST(&(ii[WS(rs, 10)]), VFNMS(LDK(KP707106781), T3I, T3H), ms, &(ii[0])); + T3p = VSUB(T3n, T3o); + ST(&(ri[WS(rs, 14)]), VFNMS(LDK(KP707106781), T3p, T3m), ms, &(ri[0])); + ST(&(ri[WS(rs, 6)]), VFMA(LDK(KP707106781), T3p, T3m), ms, &(ri[0])); + T3K = VSUB(T3k, T3f); + ST(&(ii[WS(rs, 6)]), VFMA(LDK(KP707106781), T3K, T3J), ms, &(ii[0])); + ST(&(ii[WS(rs, 14)]), VFNMS(LDK(KP707106781), T3K, T3J), ms, &(ii[0])); + } + } + { + V T20, T3N, T3T, T2Q, T2f, T3O, T30, T34, T2T, T3U, T2v, T2N, T2X, T33, T2K; + V T2O; + { + V T27, T2e, T2n, T2u; + T20 = VSUB(T1U, T1Z); + T3N = VSUB(T3L, T3M); + T3T = VADD(T3M, T3L); + T2Q = VADD(T1U, T1Z); + T27 = VSUB(T25, T26); + T2e = VADD(T28, T2d); + T2f = VSUB(T27, T2e); + T3O = VADD(T27, T2e); + { + V T2Y, T2Z, T2R, T2S; + T2Y = VADD(T2D, T2I); + T2Z = VSUB(T2A, T2B); + T30 = VFNMS(LDK(KP414213562), T2Z, T2Y); + T34 = VFMA(LDK(KP414213562), T2Y, T2Z); + T2R = VADD(T26, T25); + T2S = VSUB(T28, T2d); + T2T = VADD(T2R, T2S); + T3U = VSUB(T2S, T2R); + } + T2n = VADD(T2l, T2m); + T2u = VSUB(T2o, T2t); + T2v = VFMA(LDK(KP414213562), T2u, T2n); + T2N = VFNMS(LDK(KP414213562), T2n, T2u); + { + V T2V, T2W, T2C, T2J; + T2V = VADD(T2o, T2t); + T2W = VSUB(T2l, T2m); + T2X = VFMA(LDK(KP414213562), T2W, T2V); + T33 = VFNMS(LDK(KP414213562), T2V, T2W); + T2C = VADD(T2A, T2B); + T2J = VSUB(T2D, T2I); + T2K = VFNMS(LDK(KP414213562), T2J, T2C); + T2O = VFMA(LDK(KP414213562), T2C, T2J); + } + } + { + V T2g, T2L, T3V, T3W; + T2g = VFMA(LDK(KP707106781), T2f, T20); + T2L = VSUB(T2v, T2K); + ST(&(ri[WS(rs, 11)]), VFNMS(LDK(KP923879532), T2L, T2g), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VFMA(LDK(KP923879532), T2L, T2g), ms, &(ri[WS(rs, 1)])); + T3V = VFMA(LDK(KP707106781), T3U, T3T); + T3W = VSUB(T2O, T2N); + ST(&(ii[WS(rs, 3)]), VFMA(LDK(KP923879532), T3W, T3V), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 11)]), VFNMS(LDK(KP923879532), T3W, T3V), ms, &(ii[WS(rs, 1)])); + } + { + V T2M, T2P, T3X, T3Y; + T2M = VFNMS(LDK(KP707106781), T2f, T20); + T2P = VADD(T2N, T2O); + ST(&(ri[WS(rs, 7)]), VFNMS(LDK(KP923879532), T2P, T2M), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 15)]), VFMA(LDK(KP923879532), T2P, T2M), ms, &(ri[WS(rs, 1)])); + T3X = VFNMS(LDK(KP707106781), T3U, T3T); + T3Y = VADD(T2v, T2K); + ST(&(ii[WS(rs, 7)]), VFNMS(LDK(KP923879532), T3Y, T3X), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 15)]), VFMA(LDK(KP923879532), T3Y, T3X), ms, &(ii[WS(rs, 1)])); + } + { + V T2U, T31, T3P, T3Q; + T2U = VFMA(LDK(KP707106781), T2T, T2Q); + T31 = VADD(T2X, T30); + ST(&(ri[WS(rs, 9)]), VFNMS(LDK(KP923879532), T31, T2U), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VFMA(LDK(KP923879532), T31, T2U), ms, &(ri[WS(rs, 1)])); + T3P = VFMA(LDK(KP707106781), T3O, T3N); + T3Q = VADD(T33, T34); + ST(&(ii[WS(rs, 1)]), VFMA(LDK(KP923879532), T3Q, T3P), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 9)]), VFNMS(LDK(KP923879532), T3Q, T3P), ms, &(ii[WS(rs, 1)])); + } + { + V T32, T35, T3R, T3S; + T32 = VFNMS(LDK(KP707106781), T2T, T2Q); + T35 = VSUB(T33, T34); + ST(&(ri[WS(rs, 13)]), VFNMS(LDK(KP923879532), T35, T32), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VFMA(LDK(KP923879532), T35, T32), ms, &(ri[WS(rs, 1)])); + T3R = VFNMS(LDK(KP707106781), T3O, T3N); + T3S = VSUB(T30, T2X); + ST(&(ii[WS(rs, 5)]), VFMA(LDK(KP923879532), T3S, T3R), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 13)]), VFNMS(LDK(KP923879532), T3S, T3R), ms, &(ii[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 15), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t2sv_16"), twinstr, &GENUS, {104, 42, 92, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_16) (planner *p) { + X(kdft_dit_register) (p, t2sv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 16 -name t2sv_16 -include dft/simd/ts.h */ + +/* + * This function contains 196 FP additions, 108 FP multiplications, + * (or, 156 additions, 68 multiplications, 40 fused multiply/add), + * 82 stack variables, 3 constants, and 64 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 8), MAKE_VOLATILE_STRIDE(32, rs)) { + V T2, T5, Tg, Ti, Tk, To, TE, TC, T6, T3, T8, TW, TJ, Tt, TU; + V Tc, Tx, TH, TN, TO, TP, TR, T1f, T1k, T1b, T1i, T1y, T1H, T1u, T1F; + { + V T7, Tv, Ta, Ts, T4, Tw, Tb, Tr; + { + V Th, Tn, Tj, Tm; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 1])); + Tg = LDW(&(W[TWVL * 2])); + Ti = LDW(&(W[TWVL * 3])); + Th = VMUL(T2, Tg); + Tn = VMUL(T5, Tg); + Tj = VMUL(T5, Ti); + Tm = VMUL(T2, Ti); + Tk = VSUB(Th, Tj); + To = VADD(Tm, Tn); + TE = VSUB(Tm, Tn); + TC = VADD(Th, Tj); + T6 = LDW(&(W[TWVL * 5])); + T7 = VMUL(T5, T6); + Tv = VMUL(Tg, T6); + Ta = VMUL(T2, T6); + Ts = VMUL(Ti, T6); + T3 = LDW(&(W[TWVL * 4])); + T4 = VMUL(T2, T3); + Tw = VMUL(Ti, T3); + Tb = VMUL(T5, T3); + Tr = VMUL(Tg, T3); + } + T8 = VADD(T4, T7); + TW = VSUB(Tv, Tw); + TJ = VADD(Ta, Tb); + Tt = VSUB(Tr, Ts); + TU = VADD(Tr, Ts); + Tc = VSUB(Ta, Tb); + Tx = VADD(Tv, Tw); + TH = VSUB(T4, T7); + TN = LDW(&(W[TWVL * 6])); + TO = LDW(&(W[TWVL * 7])); + TP = VFMA(T2, TN, VMUL(T5, TO)); + TR = VFNMS(T5, TN, VMUL(T2, TO)); + { + V T1d, T1e, T19, T1a; + T1d = VMUL(Tk, T6); + T1e = VMUL(To, T3); + T1f = VSUB(T1d, T1e); + T1k = VADD(T1d, T1e); + T19 = VMUL(Tk, T3); + T1a = VMUL(To, T6); + T1b = VADD(T19, T1a); + T1i = VSUB(T19, T1a); + } + { + V T1w, T1x, T1s, T1t; + T1w = VMUL(TC, T6); + T1x = VMUL(TE, T3); + T1y = VSUB(T1w, T1x); + T1H = VADD(T1w, T1x); + T1s = VMUL(TC, T3); + T1t = VMUL(TE, T6); + T1u = VADD(T1s, T1t); + T1F = VSUB(T1s, T1t); + } + } + { + V Tf, T3r, T1N, T3e, TA, T3s, T1Q, T3b, TM, T2M, T1W, T2w, TZ, T2N, T21; + V T2x, T1B, T1K, T2V, T2W, T2X, T2Y, T2j, T2D, T2o, T2E, T18, T1n, T2Q, T2R; + V T2S, T2T, T28, T2A, T2d, T2B; + { + V T1, T3d, Te, T3c, T9, Td; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T3d = LD(&(ii[0]), ms, &(ii[0])); + T9 = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + Td = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + Te = VFMA(T8, T9, VMUL(Tc, Td)); + T3c = VFNMS(Tc, T9, VMUL(T8, Td)); + Tf = VADD(T1, Te); + T3r = VSUB(T3d, T3c); + T1N = VSUB(T1, Te); + T3e = VADD(T3c, T3d); + } + { + V Tq, T1O, Tz, T1P; + { + V Tl, Tp, Tu, Ty; + Tl = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Tp = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + Tq = VFMA(Tk, Tl, VMUL(To, Tp)); + T1O = VFNMS(To, Tl, VMUL(Tk, Tp)); + Tu = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + Ty = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + Tz = VFMA(Tt, Tu, VMUL(Tx, Ty)); + T1P = VFNMS(Tx, Tu, VMUL(Tt, Ty)); + } + TA = VADD(Tq, Tz); + T3s = VSUB(Tq, Tz); + T1Q = VSUB(T1O, T1P); + T3b = VADD(T1O, T1P); + } + { + V TG, T1S, TL, T1T, T1U, T1V; + { + V TD, TF, TI, TK; + TD = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + TF = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + TG = VFMA(TC, TD, VMUL(TE, TF)); + T1S = VFNMS(TE, TD, VMUL(TC, TF)); + TI = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + TK = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + TL = VFMA(TH, TI, VMUL(TJ, TK)); + T1T = VFNMS(TJ, TI, VMUL(TH, TK)); + } + TM = VADD(TG, TL); + T2M = VADD(T1S, T1T); + T1U = VSUB(T1S, T1T); + T1V = VSUB(TG, TL); + T1W = VSUB(T1U, T1V); + T2w = VADD(T1V, T1U); + } + { + V TT, T1Y, TY, T1Z, T1X, T20; + { + V TQ, TS, TV, TX; + TQ = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + TS = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + TT = VFMA(TP, TQ, VMUL(TR, TS)); + T1Y = VFNMS(TR, TQ, VMUL(TP, TS)); + TV = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + TX = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + TY = VFMA(TU, TV, VMUL(TW, TX)); + T1Z = VFNMS(TW, TV, VMUL(TU, TX)); + } + TZ = VADD(TT, TY); + T2N = VADD(T1Y, T1Z); + T1X = VSUB(TT, TY); + T20 = VSUB(T1Y, T1Z); + T21 = VADD(T1X, T20); + T2x = VSUB(T1X, T20); + } + { + V T1r, T2k, T1J, T2h, T1A, T2l, T1E, T2g; + { + V T1p, T1q, T1G, T1I; + T1p = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T1q = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T1r = VFMA(TN, T1p, VMUL(TO, T1q)); + T2k = VFNMS(TO, T1p, VMUL(TN, T1q)); + T1G = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T1I = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T1J = VFMA(T1F, T1G, VMUL(T1H, T1I)); + T2h = VFNMS(T1H, T1G, VMUL(T1F, T1I)); + } + { + V T1v, T1z, T1C, T1D; + T1v = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T1z = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T1A = VFMA(T1u, T1v, VMUL(T1y, T1z)); + T2l = VFNMS(T1y, T1v, VMUL(T1u, T1z)); + T1C = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T1D = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T1E = VFMA(Tg, T1C, VMUL(Ti, T1D)); + T2g = VFNMS(Ti, T1C, VMUL(Tg, T1D)); + } + T1B = VADD(T1r, T1A); + T1K = VADD(T1E, T1J); + T2V = VSUB(T1B, T1K); + T2W = VADD(T2k, T2l); + T2X = VADD(T2g, T2h); + T2Y = VSUB(T2W, T2X); + { + V T2f, T2i, T2m, T2n; + T2f = VSUB(T1r, T1A); + T2i = VSUB(T2g, T2h); + T2j = VSUB(T2f, T2i); + T2D = VADD(T2f, T2i); + T2m = VSUB(T2k, T2l); + T2n = VSUB(T1E, T1J); + T2o = VADD(T2m, T2n); + T2E = VSUB(T2m, T2n); + } + } + { + V T14, T24, T1m, T2b, T17, T25, T1h, T2a; + { + V T12, T13, T1j, T1l; + T12 = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T13 = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T14 = VFMA(T2, T12, VMUL(T5, T13)); + T24 = VFNMS(T5, T12, VMUL(T2, T13)); + T1j = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T1l = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T1m = VFMA(T1i, T1j, VMUL(T1k, T1l)); + T2b = VFNMS(T1k, T1j, VMUL(T1i, T1l)); + } + { + V T15, T16, T1c, T1g; + T15 = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + T16 = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + T17 = VFMA(T3, T15, VMUL(T6, T16)); + T25 = VFNMS(T6, T15, VMUL(T3, T16)); + T1c = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T1g = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T1h = VFMA(T1b, T1c, VMUL(T1f, T1g)); + T2a = VFNMS(T1f, T1c, VMUL(T1b, T1g)); + } + T18 = VADD(T14, T17); + T1n = VADD(T1h, T1m); + T2Q = VSUB(T18, T1n); + T2R = VADD(T24, T25); + T2S = VADD(T2a, T2b); + T2T = VSUB(T2R, T2S); + { + V T26, T27, T29, T2c; + T26 = VSUB(T24, T25); + T27 = VSUB(T1h, T1m); + T28 = VADD(T26, T27); + T2A = VSUB(T26, T27); + T29 = VSUB(T14, T17); + T2c = VSUB(T2a, T2b); + T2d = VSUB(T29, T2c); + T2B = VADD(T29, T2c); + } + } + { + V T23, T2r, T3A, T3C, T2q, T3B, T2u, T3x; + { + V T1R, T22, T3y, T3z; + T1R = VSUB(T1N, T1Q); + T22 = VMUL(LDK(KP707106781), VSUB(T1W, T21)); + T23 = VADD(T1R, T22); + T2r = VSUB(T1R, T22); + T3y = VMUL(LDK(KP707106781), VSUB(T2x, T2w)); + T3z = VADD(T3s, T3r); + T3A = VADD(T3y, T3z); + T3C = VSUB(T3z, T3y); + } + { + V T2e, T2p, T2s, T2t; + T2e = VFMA(LDK(KP923879532), T28, VMUL(LDK(KP382683432), T2d)); + T2p = VFNMS(LDK(KP923879532), T2o, VMUL(LDK(KP382683432), T2j)); + T2q = VADD(T2e, T2p); + T3B = VSUB(T2p, T2e); + T2s = VFNMS(LDK(KP923879532), T2d, VMUL(LDK(KP382683432), T28)); + T2t = VFMA(LDK(KP382683432), T2o, VMUL(LDK(KP923879532), T2j)); + T2u = VSUB(T2s, T2t); + T3x = VADD(T2s, T2t); + } + ST(&(ri[WS(rs, 11)]), VSUB(T23, T2q), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 11)]), VSUB(T3A, T3x), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VADD(T23, T2q), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(T3x, T3A), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 15)]), VSUB(T2r, T2u), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 15)]), VSUB(T3C, T3B), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VADD(T2r, T2u), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 7)]), VADD(T3B, T3C), ms, &(ii[WS(rs, 1)])); + } + { + V T2P, T31, T3m, T3o, T30, T3n, T34, T3j; + { + V T2L, T2O, T3k, T3l; + T2L = VSUB(Tf, TA); + T2O = VSUB(T2M, T2N); + T2P = VADD(T2L, T2O); + T31 = VSUB(T2L, T2O); + T3k = VSUB(TZ, TM); + T3l = VSUB(T3e, T3b); + T3m = VADD(T3k, T3l); + T3o = VSUB(T3l, T3k); + } + { + V T2U, T2Z, T32, T33; + T2U = VADD(T2Q, T2T); + T2Z = VSUB(T2V, T2Y); + T30 = VMUL(LDK(KP707106781), VADD(T2U, T2Z)); + T3n = VMUL(LDK(KP707106781), VSUB(T2Z, T2U)); + T32 = VSUB(T2T, T2Q); + T33 = VADD(T2V, T2Y); + T34 = VMUL(LDK(KP707106781), VSUB(T32, T33)); + T3j = VMUL(LDK(KP707106781), VADD(T32, T33)); + } + ST(&(ri[WS(rs, 10)]), VSUB(T2P, T30), ms, &(ri[0])); + ST(&(ii[WS(rs, 10)]), VSUB(T3m, T3j), ms, &(ii[0])); + ST(&(ri[WS(rs, 2)]), VADD(T2P, T30), ms, &(ri[0])); + ST(&(ii[WS(rs, 2)]), VADD(T3j, T3m), ms, &(ii[0])); + ST(&(ri[WS(rs, 14)]), VSUB(T31, T34), ms, &(ri[0])); + ST(&(ii[WS(rs, 14)]), VSUB(T3o, T3n), ms, &(ii[0])); + ST(&(ri[WS(rs, 6)]), VADD(T31, T34), ms, &(ri[0])); + ST(&(ii[WS(rs, 6)]), VADD(T3n, T3o), ms, &(ii[0])); + } + { + V T2z, T2H, T3u, T3w, T2G, T3v, T2K, T3p; + { + V T2v, T2y, T3q, T3t; + T2v = VADD(T1N, T1Q); + T2y = VMUL(LDK(KP707106781), VADD(T2w, T2x)); + T2z = VADD(T2v, T2y); + T2H = VSUB(T2v, T2y); + T3q = VMUL(LDK(KP707106781), VADD(T1W, T21)); + T3t = VSUB(T3r, T3s); + T3u = VADD(T3q, T3t); + T3w = VSUB(T3t, T3q); + } + { + V T2C, T2F, T2I, T2J; + T2C = VFMA(LDK(KP382683432), T2A, VMUL(LDK(KP923879532), T2B)); + T2F = VFNMS(LDK(KP382683432), T2E, VMUL(LDK(KP923879532), T2D)); + T2G = VADD(T2C, T2F); + T3v = VSUB(T2F, T2C); + T2I = VFNMS(LDK(KP382683432), T2B, VMUL(LDK(KP923879532), T2A)); + T2J = VFMA(LDK(KP923879532), T2E, VMUL(LDK(KP382683432), T2D)); + T2K = VSUB(T2I, T2J); + T3p = VADD(T2I, T2J); + } + ST(&(ri[WS(rs, 9)]), VSUB(T2z, T2G), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 9)]), VSUB(T3u, T3p), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(T2z, T2G), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VADD(T3p, T3u), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 13)]), VSUB(T2H, T2K), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 13)]), VSUB(T3w, T3v), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VADD(T2H, T2K), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 5)]), VADD(T3v, T3w), ms, &(ii[WS(rs, 1)])); + } + { + V T11, T35, T3g, T3i, T1M, T3h, T38, T39; + { + V TB, T10, T3a, T3f; + TB = VADD(Tf, TA); + T10 = VADD(TM, TZ); + T11 = VADD(TB, T10); + T35 = VSUB(TB, T10); + T3a = VADD(T2M, T2N); + T3f = VADD(T3b, T3e); + T3g = VADD(T3a, T3f); + T3i = VSUB(T3f, T3a); + } + { + V T1o, T1L, T36, T37; + T1o = VADD(T18, T1n); + T1L = VADD(T1B, T1K); + T1M = VADD(T1o, T1L); + T3h = VSUB(T1L, T1o); + T36 = VADD(T2R, T2S); + T37 = VADD(T2W, T2X); + T38 = VSUB(T36, T37); + T39 = VADD(T36, T37); + } + ST(&(ri[WS(rs, 8)]), VSUB(T11, T1M), ms, &(ri[0])); + ST(&(ii[WS(rs, 8)]), VSUB(T3g, T39), ms, &(ii[0])); + ST(&(ri[0]), VADD(T11, T1M), ms, &(ri[0])); + ST(&(ii[0]), VADD(T39, T3g), ms, &(ii[0])); + ST(&(ri[WS(rs, 12)]), VSUB(T35, T38), ms, &(ri[0])); + ST(&(ii[WS(rs, 12)]), VSUB(T3i, T3h), ms, &(ii[0])); + ST(&(ri[WS(rs, 4)]), VADD(T35, T38), ms, &(ri[0])); + ST(&(ii[WS(rs, 4)]), VADD(T3h, T3i), ms, &(ii[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 15), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t2sv_16"), twinstr, &GENUS, {156, 68, 40, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_16) (planner *p) { + X(kdft_dit_register) (p, t2sv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_32.c new file mode 100644 index 000000000..7677d85bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_32.c @@ -0,0 +1,1895 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:12 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 32 -name t2sv_32 -include dft/simd/ts.h */ + +/* + * This function contains 488 FP additions, 350 FP multiplications, + * (or, 236 additions, 98 multiplications, 252 fused multiply/add), + * 164 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 8), MAKE_VOLATILE_STRIDE(64, rs)) { + V T2, T8, T3, T6, Te, Ti, T5, T7, TJ, Tb, TM, Tc, Ts, T23, T1w; + V T19, TA, TE, T1s, T1N, T1o, T1C, T1F, T1K, T15, T11, T2F, T31, T2J, T34; + V T3f, T3z, T3j, T3C, Tw, T3M, T3Q, T1z, T2s, T2w, T1d, T3n, T3r, T26, T2T; + V T2X, Th, TR, TP, Td, Tj, TW, Tn, TS, T1U, T2b, T29, T1R, T1V, T2g; + V T1Z, T2c; + { + V Tz, T1n, T10, TD, T1r, T14, T9, T1Q, Tv, T1c; + { + V T4, T18, Ta, Tr; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T6 = LDW(&(W[TWVL * 3])); + T4 = VMUL(T2, T3); + T18 = VMUL(T3, T8); + Ta = VMUL(T2, T6); + Tr = VMUL(T2, T8); + Te = LDW(&(W[TWVL * 6])); + Tz = VMUL(T3, Te); + T1n = VMUL(T8, Te); + T10 = VMUL(T2, Te); + Ti = LDW(&(W[TWVL * 7])); + TD = VMUL(T3, Ti); + T1r = VMUL(T8, Ti); + T14 = VMUL(T2, Ti); + T5 = LDW(&(W[TWVL * 1])); + T7 = VFMA(T5, T6, T4); + TJ = VFNMS(T5, T6, T4); + T9 = VMUL(T7, T8); + T1Q = VMUL(TJ, T8); + Tb = VFNMS(T5, T3, Ta); + TM = VFMA(T5, T3, Ta); + Tc = LDW(&(W[TWVL * 5])); + Tv = VMUL(T2, Tc); + T1c = VMUL(T3, Tc); + Ts = VFMA(T5, Tc, Tr); + T23 = VFMA(T6, Tc, T18); + T1w = VFNMS(T5, Tc, Tr); + T19 = VFNMS(T6, Tc, T18); + } + TA = VFMA(T6, Ti, Tz); + TE = VFNMS(T6, Te, TD); + T1s = VFNMS(Tc, Te, T1r); + T1N = VFMA(T6, Te, TD); + T1o = VFMA(Tc, Ti, T1n); + T1C = VFMA(T5, Ti, T10); + T1F = VFNMS(T5, Te, T14); + T1K = VFNMS(T6, Ti, Tz); + T15 = VFMA(T5, Te, T14); + T11 = VFNMS(T5, Ti, T10); + { + V T2E, T2I, T2S, T2W; + T2E = VMUL(T7, Te); + T2F = VFMA(Tb, Ti, T2E); + T31 = VFNMS(Tb, Ti, T2E); + T2I = VMUL(T7, Ti); + T2J = VFNMS(Tb, Te, T2I); + T34 = VFMA(Tb, Te, T2I); + { + V T3e, T3i, T3L, T3P; + T3e = VMUL(TJ, Te); + T3f = VFNMS(TM, Ti, T3e); + T3z = VFMA(TM, Ti, T3e); + T3i = VMUL(TJ, Ti); + T3j = VFMA(TM, Te, T3i); + T3C = VFNMS(TM, Te, T3i); + T3L = VMUL(Ts, Te); + T3P = VMUL(Ts, Ti); + Tw = VFNMS(T5, T8, Tv); + T3M = VFMA(Tw, Ti, T3L); + T3Q = VFNMS(Tw, Te, T3P); + } + { + V T2r, T2v, T3m, T3q; + T2r = VMUL(T1w, Te); + T2v = VMUL(T1w, Ti); + T1z = VFMA(T5, T8, Tv); + T2s = VFMA(T1z, Ti, T2r); + T2w = VFNMS(T1z, Te, T2v); + T3m = VMUL(T19, Te); + T3q = VMUL(T19, Ti); + T1d = VFMA(T6, T8, T1c); + T3n = VFMA(T1d, Ti, T3m); + T3r = VFNMS(T1d, Te, T3q); + } + T2S = VMUL(T23, Te); + T2W = VMUL(T23, Ti); + T26 = VFNMS(T6, T8, T1c); + T2T = VFMA(T26, Ti, T2S); + T2X = VFNMS(T26, Te, T2W); + { + V TQ, TV, Tf, Tm, Tg; + Tg = VMUL(T7, Tc); + Th = VFMA(Tb, T8, Tg); + TR = VFNMS(Tb, T8, Tg); + TP = VFMA(Tb, Tc, T9); + TQ = VMUL(TP, Te); + TV = VMUL(TP, Ti); + Td = VFNMS(Tb, Tc, T9); + Tf = VMUL(Td, Te); + Tm = VMUL(Td, Ti); + Tj = VFMA(Th, Ti, Tf); + TW = VFNMS(TR, Te, TV); + Tn = VFNMS(Th, Te, Tm); + TS = VFMA(TR, Ti, TQ); + } + { + V T2a, T2f, T1S, T1Y, T1T; + T1T = VMUL(TJ, Tc); + T1U = VFMA(TM, T8, T1T); + T2b = VFNMS(TM, T8, T1T); + T29 = VFMA(TM, Tc, T1Q); + T2a = VMUL(T29, Te); + T2f = VMUL(T29, Ti); + T1R = VFNMS(TM, Tc, T1Q); + T1S = VMUL(T1R, Te); + T1Y = VMUL(T1R, Ti); + T1V = VFMA(T1U, Ti, T1S); + T2g = VFNMS(T2b, Te, T2f); + T1Z = VFNMS(T1U, Te, T1Y); + T2c = VFMA(T2b, Ti, T2a); + } + } + } + { + V Tq, T46, T8H, T97, TH, T98, T4b, T8D, TZ, T7f, T4j, T6t, T1g, T7g, T4q; + V T6u, T1v, T1I, T7m, T7j, T7k, T7l, T4z, T6x, T4G, T6y, T22, T2j, T7o, T7p; + V T7q, T7r, T4O, T6A, T4V, T6B, T3G, T7L, T7I, T8n, T5E, T6P, T61, T6M, T2N; + V T7A, T7x, T8i, T55, T6I, T5s, T6F, T43, T7J, T7O, T8o, T5L, T62, T5S, T63; + V T3c, T7y, T7D, T8j, T5c, T5t, T5j, T5u; + { + V T1, T8G, Tk, Tl, To, T8E, Tp, T8F; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T8G = LD(&(ii[0]), ms, &(ii[0])); + Tk = LD(&(ri[WS(rs, 16)]), ms, &(ri[0])); + Tl = VMUL(Tj, Tk); + To = LD(&(ii[WS(rs, 16)]), ms, &(ii[0])); + T8E = VMUL(Tj, To); + Tp = VFMA(Tn, To, Tl); + Tq = VADD(T1, Tp); + T46 = VSUB(T1, Tp); + T8F = VFNMS(Tn, Tk, T8E); + T8H = VADD(T8F, T8G); + T97 = VSUB(T8G, T8F); + } + { + V Tt, Tu, Tx, T47, TB, TC, TF, T49; + Tt = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + Tu = VMUL(Ts, Tt); + Tx = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + T47 = VMUL(Ts, Tx); + TB = LD(&(ri[WS(rs, 24)]), ms, &(ri[0])); + TC = VMUL(TA, TB); + TF = LD(&(ii[WS(rs, 24)]), ms, &(ii[0])); + T49 = VMUL(TA, TF); + { + V Ty, TG, T48, T4a; + Ty = VFMA(Tw, Tx, Tu); + TG = VFMA(TE, TF, TC); + TH = VADD(Ty, TG); + T98 = VSUB(Ty, TG); + T48 = VFNMS(Tw, Tt, T47); + T4a = VFNMS(TE, TB, T49); + T4b = VSUB(T48, T4a); + T8D = VADD(T48, T4a); + } + } + { + V TO, T4f, TY, T4h, T4d, T4i; + { + V TK, TL, TN, T4e; + TK = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + TL = VMUL(TJ, TK); + TN = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T4e = VMUL(TJ, TN); + TO = VFMA(TM, TN, TL); + T4f = VFNMS(TM, TK, T4e); + } + { + V TT, TU, TX, T4g; + TT = LD(&(ri[WS(rs, 20)]), ms, &(ri[0])); + TU = VMUL(TS, TT); + TX = LD(&(ii[WS(rs, 20)]), ms, &(ii[0])); + T4g = VMUL(TS, TX); + TY = VFMA(TW, TX, TU); + T4h = VFNMS(TW, TT, T4g); + } + TZ = VADD(TO, TY); + T7f = VADD(T4f, T4h); + T4d = VSUB(TO, TY); + T4i = VSUB(T4f, T4h); + T4j = VADD(T4d, T4i); + T6t = VSUB(T4i, T4d); + } + { + V T17, T4m, T1f, T4o, T4k, T4p; + { + V T12, T13, T16, T4l; + T12 = LD(&(ri[WS(rs, 28)]), ms, &(ri[0])); + T13 = VMUL(T11, T12); + T16 = LD(&(ii[WS(rs, 28)]), ms, &(ii[0])); + T4l = VMUL(T11, T16); + T17 = VFMA(T15, T16, T13); + T4m = VFNMS(T15, T12, T4l); + } + { + V T1a, T1b, T1e, T4n; + T1a = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + T1b = VMUL(T19, T1a); + T1e = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + T4n = VMUL(T19, T1e); + T1f = VFMA(T1d, T1e, T1b); + T4o = VFNMS(T1d, T1a, T4n); + } + T1g = VADD(T17, T1f); + T7g = VADD(T4m, T4o); + T4k = VSUB(T17, T1f); + T4p = VSUB(T4m, T4o); + T4q = VSUB(T4k, T4p); + T6u = VADD(T4k, T4p); + } + { + V T1m, T4u, T1H, T4E, T1u, T4w, T1B, T4C; + { + V T1j, T1k, T1l, T4t; + T1j = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + T1k = VMUL(T7, T1j); + T1l = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T4t = VMUL(T7, T1l); + T1m = VFMA(Tb, T1l, T1k); + T4u = VFNMS(Tb, T1j, T4t); + } + { + V T1D, T1E, T1G, T4D; + T1D = LD(&(ri[WS(rs, 26)]), ms, &(ri[0])); + T1E = VMUL(T1C, T1D); + T1G = LD(&(ii[WS(rs, 26)]), ms, &(ii[0])); + T4D = VMUL(T1C, T1G); + T1H = VFMA(T1F, T1G, T1E); + T4E = VFNMS(T1F, T1D, T4D); + } + { + V T1p, T1q, T1t, T4v; + T1p = LD(&(ri[WS(rs, 18)]), ms, &(ri[0])); + T1q = VMUL(T1o, T1p); + T1t = LD(&(ii[WS(rs, 18)]), ms, &(ii[0])); + T4v = VMUL(T1o, T1t); + T1u = VFMA(T1s, T1t, T1q); + T4w = VFNMS(T1s, T1p, T4v); + } + { + V T1x, T1y, T1A, T4B; + T1x = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + T1y = VMUL(T1w, T1x); + T1A = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + T4B = VMUL(T1w, T1A); + T1B = VFMA(T1z, T1A, T1y); + T4C = VFNMS(T1z, T1x, T4B); + } + T1v = VADD(T1m, T1u); + T1I = VADD(T1B, T1H); + T7m = VSUB(T1v, T1I); + T7j = VADD(T4u, T4w); + T7k = VADD(T4C, T4E); + T7l = VSUB(T7j, T7k); + { + V T4x, T4y, T4A, T4F; + T4x = VSUB(T4u, T4w); + T4y = VSUB(T1B, T1H); + T4z = VSUB(T4x, T4y); + T6x = VADD(T4x, T4y); + T4A = VSUB(T1m, T1u); + T4F = VSUB(T4C, T4E); + T4G = VADD(T4A, T4F); + T6y = VSUB(T4A, T4F); + } + } + { + V T1P, T4J, T2i, T4T, T21, T4L, T28, T4R; + { + V T1L, T1M, T1O, T4I; + T1L = LD(&(ri[WS(rs, 30)]), ms, &(ri[0])); + T1M = VMUL(T1K, T1L); + T1O = LD(&(ii[WS(rs, 30)]), ms, &(ii[0])); + T4I = VMUL(T1K, T1O); + T1P = VFMA(T1N, T1O, T1M); + T4J = VFNMS(T1N, T1L, T4I); + } + { + V T2d, T2e, T2h, T4S; + T2d = LD(&(ri[WS(rs, 22)]), ms, &(ri[0])); + T2e = VMUL(T2c, T2d); + T2h = LD(&(ii[WS(rs, 22)]), ms, &(ii[0])); + T4S = VMUL(T2c, T2h); + T2i = VFMA(T2g, T2h, T2e); + T4T = VFNMS(T2g, T2d, T4S); + } + { + V T1W, T1X, T20, T4K; + T1W = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + T1X = VMUL(T1V, T1W); + T20 = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + T4K = VMUL(T1V, T20); + T21 = VFMA(T1Z, T20, T1X); + T4L = VFNMS(T1Z, T1W, T4K); + } + { + V T24, T25, T27, T4Q; + T24 = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + T25 = VMUL(T23, T24); + T27 = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + T4Q = VMUL(T23, T27); + T28 = VFMA(T26, T27, T25); + T4R = VFNMS(T26, T24, T4Q); + } + T22 = VADD(T1P, T21); + T2j = VADD(T28, T2i); + T7o = VSUB(T22, T2j); + T7p = VADD(T4J, T4L); + T7q = VADD(T4R, T4T); + T7r = VSUB(T7p, T7q); + { + V T4M, T4N, T4P, T4U; + T4M = VSUB(T4J, T4L); + T4N = VSUB(T28, T2i); + T4O = VSUB(T4M, T4N); + T6A = VADD(T4M, T4N); + T4P = VSUB(T1P, T21); + T4U = VSUB(T4R, T4T); + T4V = VADD(T4P, T4U); + T6B = VSUB(T4P, T4U); + } + } + { + V T3l, T5z, T3E, T5Z, T3t, T5B, T3y, T5X; + { + V T3g, T3h, T3k, T5y; + T3g = LD(&(ri[WS(rs, 31)]), ms, &(ri[WS(rs, 1)])); + T3h = VMUL(T3f, T3g); + T3k = LD(&(ii[WS(rs, 31)]), ms, &(ii[WS(rs, 1)])); + T5y = VMUL(T3f, T3k); + T3l = VFMA(T3j, T3k, T3h); + T5z = VFNMS(T3j, T3g, T5y); + } + { + V T3A, T3B, T3D, T5Y; + T3A = LD(&(ri[WS(rs, 23)]), ms, &(ri[WS(rs, 1)])); + T3B = VMUL(T3z, T3A); + T3D = LD(&(ii[WS(rs, 23)]), ms, &(ii[WS(rs, 1)])); + T5Y = VMUL(T3z, T3D); + T3E = VFMA(T3C, T3D, T3B); + T5Z = VFNMS(T3C, T3A, T5Y); + } + { + V T3o, T3p, T3s, T5A; + T3o = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T3p = VMUL(T3n, T3o); + T3s = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T5A = VMUL(T3n, T3s); + T3t = VFMA(T3r, T3s, T3p); + T5B = VFNMS(T3r, T3o, T5A); + } + { + V T3v, T3w, T3x, T5W; + T3v = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T3w = VMUL(TP, T3v); + T3x = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T5W = VMUL(TP, T3x); + T3y = VFMA(TR, T3x, T3w); + T5X = VFNMS(TR, T3v, T5W); + } + { + V T3u, T3F, T7G, T7H; + T3u = VADD(T3l, T3t); + T3F = VADD(T3y, T3E); + T3G = VADD(T3u, T3F); + T7L = VSUB(T3u, T3F); + T7G = VADD(T5z, T5B); + T7H = VADD(T5X, T5Z); + T7I = VSUB(T7G, T7H); + T8n = VADD(T7G, T7H); + } + { + V T5C, T5D, T5V, T60; + T5C = VSUB(T5z, T5B); + T5D = VSUB(T3y, T3E); + T5E = VSUB(T5C, T5D); + T6P = VADD(T5C, T5D); + T5V = VSUB(T3l, T3t); + T60 = VSUB(T5X, T5Z); + T61 = VADD(T5V, T60); + T6M = VSUB(T5V, T60); + } + } + { + V T2q, T50, T2L, T5q, T2y, T52, T2D, T5o; + { + V T2n, T2o, T2p, T4Z; + T2n = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T2o = VMUL(T2, T2n); + T2p = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T4Z = VMUL(T2, T2p); + T2q = VFMA(T5, T2p, T2o); + T50 = VFNMS(T5, T2n, T4Z); + } + { + V T2G, T2H, T2K, T5p; + T2G = LD(&(ri[WS(rs, 25)]), ms, &(ri[WS(rs, 1)])); + T2H = VMUL(T2F, T2G); + T2K = LD(&(ii[WS(rs, 25)]), ms, &(ii[WS(rs, 1)])); + T5p = VMUL(T2F, T2K); + T2L = VFMA(T2J, T2K, T2H); + T5q = VFNMS(T2J, T2G, T5p); + } + { + V T2t, T2u, T2x, T51; + T2t = LD(&(ri[WS(rs, 17)]), ms, &(ri[WS(rs, 1)])); + T2u = VMUL(T2s, T2t); + T2x = LD(&(ii[WS(rs, 17)]), ms, &(ii[WS(rs, 1)])); + T51 = VMUL(T2s, T2x); + T2y = VFMA(T2w, T2x, T2u); + T52 = VFNMS(T2w, T2t, T51); + } + { + V T2A, T2B, T2C, T5n; + T2A = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + T2B = VMUL(T8, T2A); + T2C = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + T5n = VMUL(T8, T2C); + T2D = VFMA(Tc, T2C, T2B); + T5o = VFNMS(Tc, T2A, T5n); + } + { + V T2z, T2M, T7v, T7w; + T2z = VADD(T2q, T2y); + T2M = VADD(T2D, T2L); + T2N = VADD(T2z, T2M); + T7A = VSUB(T2z, T2M); + T7v = VADD(T50, T52); + T7w = VADD(T5o, T5q); + T7x = VSUB(T7v, T7w); + T8i = VADD(T7v, T7w); + } + { + V T53, T54, T5m, T5r; + T53 = VSUB(T50, T52); + T54 = VSUB(T2D, T2L); + T55 = VSUB(T53, T54); + T6I = VADD(T53, T54); + T5m = VSUB(T2q, T2y); + T5r = VSUB(T5o, T5q); + T5s = VADD(T5m, T5r); + T6F = VSUB(T5m, T5r); + } + } + { + V T3K, T5G, T41, T5Q, T3S, T5I, T3X, T5O; + { + V T3H, T3I, T3J, T5F; + T3H = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T3I = VMUL(T3, T3H); + T3J = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T5F = VMUL(T3, T3J); + T3K = VFMA(T6, T3J, T3I); + T5G = VFNMS(T6, T3H, T5F); + } + { + V T3Y, T3Z, T40, T5P; + T3Y = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T3Z = VMUL(Td, T3Y); + T40 = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T5P = VMUL(Td, T40); + T41 = VFMA(Th, T40, T3Z); + T5Q = VFNMS(Th, T3Y, T5P); + } + { + V T3N, T3O, T3R, T5H; + T3N = LD(&(ri[WS(rs, 19)]), ms, &(ri[WS(rs, 1)])); + T3O = VMUL(T3M, T3N); + T3R = LD(&(ii[WS(rs, 19)]), ms, &(ii[WS(rs, 1)])); + T5H = VMUL(T3M, T3R); + T3S = VFMA(T3Q, T3R, T3O); + T5I = VFNMS(T3Q, T3N, T5H); + } + { + V T3U, T3V, T3W, T5N; + T3U = LD(&(ri[WS(rs, 27)]), ms, &(ri[WS(rs, 1)])); + T3V = VMUL(Te, T3U); + T3W = LD(&(ii[WS(rs, 27)]), ms, &(ii[WS(rs, 1)])); + T5N = VMUL(Te, T3W); + T3X = VFMA(Ti, T3W, T3V); + T5O = VFNMS(Ti, T3U, T5N); + } + { + V T3T, T42, T7M, T7N; + T3T = VADD(T3K, T3S); + T42 = VADD(T3X, T41); + T43 = VADD(T3T, T42); + T7J = VSUB(T42, T3T); + T7M = VADD(T5G, T5I); + T7N = VADD(T5O, T5Q); + T7O = VSUB(T7M, T7N); + T8o = VADD(T7M, T7N); + } + { + V T5J, T5K, T5M, T5R; + T5J = VSUB(T5G, T5I); + T5K = VSUB(T3K, T3S); + T5L = VSUB(T5J, T5K); + T62 = VADD(T5K, T5J); + T5M = VSUB(T3X, T41); + T5R = VSUB(T5O, T5Q); + T5S = VADD(T5M, T5R); + T63 = VSUB(T5M, T5R); + } + } + { + V T2R, T57, T3a, T5h, T2Z, T59, T36, T5f; + { + V T2O, T2P, T2Q, T56; + T2O = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T2P = VMUL(T29, T2O); + T2Q = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T56 = VMUL(T29, T2Q); + T2R = VFMA(T2b, T2Q, T2P); + T57 = VFNMS(T2b, T2O, T56); + } + { + V T37, T38, T39, T5g; + T37 = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T38 = VMUL(T1R, T37); + T39 = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T5g = VMUL(T1R, T39); + T3a = VFMA(T1U, T39, T38); + T5h = VFNMS(T1U, T37, T5g); + } + { + V T2U, T2V, T2Y, T58; + T2U = LD(&(ri[WS(rs, 21)]), ms, &(ri[WS(rs, 1)])); + T2V = VMUL(T2T, T2U); + T2Y = LD(&(ii[WS(rs, 21)]), ms, &(ii[WS(rs, 1)])); + T58 = VMUL(T2T, T2Y); + T2Z = VFMA(T2X, T2Y, T2V); + T59 = VFNMS(T2X, T2U, T58); + } + { + V T32, T33, T35, T5e; + T32 = LD(&(ri[WS(rs, 29)]), ms, &(ri[WS(rs, 1)])); + T33 = VMUL(T31, T32); + T35 = LD(&(ii[WS(rs, 29)]), ms, &(ii[WS(rs, 1)])); + T5e = VMUL(T31, T35); + T36 = VFMA(T34, T35, T33); + T5f = VFNMS(T34, T32, T5e); + } + { + V T30, T3b, T7B, T7C; + T30 = VADD(T2R, T2Z); + T3b = VADD(T36, T3a); + T3c = VADD(T30, T3b); + T7y = VSUB(T3b, T30); + T7B = VADD(T57, T59); + T7C = VADD(T5f, T5h); + T7D = VSUB(T7B, T7C); + T8j = VADD(T7B, T7C); + } + { + V T5a, T5b, T5d, T5i; + T5a = VSUB(T57, T59); + T5b = VSUB(T2R, T2Z); + T5c = VSUB(T5a, T5b); + T5t = VADD(T5b, T5a); + T5d = VSUB(T36, T3a); + T5i = VSUB(T5f, T5h); + T5j = VADD(T5d, T5i); + T5u = VSUB(T5d, T5i); + } + } + { + V T1i, T8c, T8z, T8A, T8J, T8O, T2l, T8N, T45, T8L, T8l, T8t, T8q, T8u, T8f; + V T8B; + { + V TI, T1h, T8x, T8y; + TI = VADD(Tq, TH); + T1h = VADD(TZ, T1g); + T1i = VADD(TI, T1h); + T8c = VSUB(TI, T1h); + T8x = VADD(T8i, T8j); + T8y = VADD(T8n, T8o); + T8z = VSUB(T8x, T8y); + T8A = VADD(T8x, T8y); + } + { + V T8C, T8I, T1J, T2k; + T8C = VADD(T7f, T7g); + T8I = VADD(T8D, T8H); + T8J = VADD(T8C, T8I); + T8O = VSUB(T8I, T8C); + T1J = VADD(T1v, T1I); + T2k = VADD(T22, T2j); + T2l = VADD(T1J, T2k); + T8N = VSUB(T2k, T1J); + } + { + V T3d, T44, T8h, T8k; + T3d = VADD(T2N, T3c); + T44 = VADD(T3G, T43); + T45 = VADD(T3d, T44); + T8L = VSUB(T44, T3d); + T8h = VSUB(T2N, T3c); + T8k = VSUB(T8i, T8j); + T8l = VADD(T8h, T8k); + T8t = VSUB(T8k, T8h); + } + { + V T8m, T8p, T8d, T8e; + T8m = VSUB(T3G, T43); + T8p = VSUB(T8n, T8o); + T8q = VSUB(T8m, T8p); + T8u = VADD(T8m, T8p); + T8d = VADD(T7j, T7k); + T8e = VADD(T7p, T7q); + T8f = VSUB(T8d, T8e); + T8B = VADD(T8d, T8e); + } + { + V T2m, T8K, T8w, T8M; + T2m = VADD(T1i, T2l); + ST(&(ri[WS(rs, 16)]), VSUB(T2m, T45), ms, &(ri[0])); + ST(&(ri[0]), VADD(T2m, T45), ms, &(ri[0])); + T8K = VADD(T8B, T8J); + ST(&(ii[0]), VADD(T8A, T8K), ms, &(ii[0])); + ST(&(ii[WS(rs, 16)]), VSUB(T8K, T8A), ms, &(ii[0])); + T8w = VSUB(T1i, T2l); + ST(&(ri[WS(rs, 24)]), VSUB(T8w, T8z), ms, &(ri[0])); + ST(&(ri[WS(rs, 8)]), VADD(T8w, T8z), ms, &(ri[0])); + T8M = VSUB(T8J, T8B); + ST(&(ii[WS(rs, 8)]), VADD(T8L, T8M), ms, &(ii[0])); + ST(&(ii[WS(rs, 24)]), VSUB(T8M, T8L), ms, &(ii[0])); + } + { + V T8g, T8r, T8P, T8Q; + T8g = VADD(T8c, T8f); + T8r = VADD(T8l, T8q); + ST(&(ri[WS(rs, 20)]), VFNMS(LDK(KP707106781), T8r, T8g), ms, &(ri[0])); + ST(&(ri[WS(rs, 4)]), VFMA(LDK(KP707106781), T8r, T8g), ms, &(ri[0])); + T8P = VADD(T8N, T8O); + T8Q = VADD(T8t, T8u); + ST(&(ii[WS(rs, 4)]), VFMA(LDK(KP707106781), T8Q, T8P), ms, &(ii[0])); + ST(&(ii[WS(rs, 20)]), VFNMS(LDK(KP707106781), T8Q, T8P), ms, &(ii[0])); + } + { + V T8s, T8v, T8R, T8S; + T8s = VSUB(T8c, T8f); + T8v = VSUB(T8t, T8u); + ST(&(ri[WS(rs, 28)]), VFNMS(LDK(KP707106781), T8v, T8s), ms, &(ri[0])); + ST(&(ri[WS(rs, 12)]), VFMA(LDK(KP707106781), T8v, T8s), ms, &(ri[0])); + T8R = VSUB(T8O, T8N); + T8S = VSUB(T8q, T8l); + ST(&(ii[WS(rs, 12)]), VFMA(LDK(KP707106781), T8S, T8R), ms, &(ii[0])); + ST(&(ii[WS(rs, 28)]), VFNMS(LDK(KP707106781), T8S, T8R), ms, &(ii[0])); + } + } + { + V T7i, T7W, T86, T8a, T8V, T91, T7t, T8W, T7F, T7T, T7Z, T92, T83, T89, T7Q; + V T7U; + { + V T7e, T7h, T84, T85; + T7e = VSUB(Tq, TH); + T7h = VSUB(T7f, T7g); + T7i = VSUB(T7e, T7h); + T7W = VADD(T7e, T7h); + T84 = VADD(T7L, T7O); + T85 = VADD(T7I, T7J); + T86 = VFNMS(LDK(KP414213562), T85, T84); + T8a = VFMA(LDK(KP414213562), T84, T85); + } + { + V T8T, T8U, T7n, T7s; + T8T = VSUB(T1g, TZ); + T8U = VSUB(T8H, T8D); + T8V = VADD(T8T, T8U); + T91 = VSUB(T8U, T8T); + T7n = VSUB(T7l, T7m); + T7s = VADD(T7o, T7r); + T7t = VSUB(T7n, T7s); + T8W = VADD(T7n, T7s); + } + { + V T7z, T7E, T7X, T7Y; + T7z = VSUB(T7x, T7y); + T7E = VSUB(T7A, T7D); + T7F = VFMA(LDK(KP414213562), T7E, T7z); + T7T = VFNMS(LDK(KP414213562), T7z, T7E); + T7X = VADD(T7m, T7l); + T7Y = VSUB(T7o, T7r); + T7Z = VADD(T7X, T7Y); + T92 = VSUB(T7Y, T7X); + } + { + V T81, T82, T7K, T7P; + T81 = VADD(T7A, T7D); + T82 = VADD(T7x, T7y); + T83 = VFMA(LDK(KP414213562), T82, T81); + T89 = VFNMS(LDK(KP414213562), T81, T82); + T7K = VSUB(T7I, T7J); + T7P = VSUB(T7L, T7O); + T7Q = VFNMS(LDK(KP414213562), T7P, T7K); + T7U = VFMA(LDK(KP414213562), T7K, T7P); + } + { + V T7u, T7R, T93, T94; + T7u = VFMA(LDK(KP707106781), T7t, T7i); + T7R = VSUB(T7F, T7Q); + ST(&(ri[WS(rs, 22)]), VFNMS(LDK(KP923879532), T7R, T7u), ms, &(ri[0])); + ST(&(ri[WS(rs, 6)]), VFMA(LDK(KP923879532), T7R, T7u), ms, &(ri[0])); + T93 = VFMA(LDK(KP707106781), T92, T91); + T94 = VSUB(T7U, T7T); + ST(&(ii[WS(rs, 6)]), VFMA(LDK(KP923879532), T94, T93), ms, &(ii[0])); + ST(&(ii[WS(rs, 22)]), VFNMS(LDK(KP923879532), T94, T93), ms, &(ii[0])); + } + { + V T7S, T7V, T95, T96; + T7S = VFNMS(LDK(KP707106781), T7t, T7i); + T7V = VADD(T7T, T7U); + ST(&(ri[WS(rs, 14)]), VFNMS(LDK(KP923879532), T7V, T7S), ms, &(ri[0])); + ST(&(ri[WS(rs, 30)]), VFMA(LDK(KP923879532), T7V, T7S), ms, &(ri[0])); + T95 = VFNMS(LDK(KP707106781), T92, T91); + T96 = VADD(T7F, T7Q); + ST(&(ii[WS(rs, 14)]), VFNMS(LDK(KP923879532), T96, T95), ms, &(ii[0])); + ST(&(ii[WS(rs, 30)]), VFMA(LDK(KP923879532), T96, T95), ms, &(ii[0])); + } + { + V T80, T87, T8X, T8Y; + T80 = VFMA(LDK(KP707106781), T7Z, T7W); + T87 = VADD(T83, T86); + ST(&(ri[WS(rs, 18)]), VFNMS(LDK(KP923879532), T87, T80), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VFMA(LDK(KP923879532), T87, T80), ms, &(ri[0])); + T8X = VFMA(LDK(KP707106781), T8W, T8V); + T8Y = VADD(T89, T8a); + ST(&(ii[WS(rs, 2)]), VFMA(LDK(KP923879532), T8Y, T8X), ms, &(ii[0])); + ST(&(ii[WS(rs, 18)]), VFNMS(LDK(KP923879532), T8Y, T8X), ms, &(ii[0])); + } + { + V T88, T8b, T8Z, T90; + T88 = VFNMS(LDK(KP707106781), T7Z, T7W); + T8b = VSUB(T89, T8a); + ST(&(ri[WS(rs, 26)]), VFNMS(LDK(KP923879532), T8b, T88), ms, &(ri[0])); + ST(&(ri[WS(rs, 10)]), VFMA(LDK(KP923879532), T8b, T88), ms, &(ri[0])); + T8Z = VFNMS(LDK(KP707106781), T8W, T8V); + T90 = VSUB(T86, T83); + ST(&(ii[WS(rs, 10)]), VFMA(LDK(KP923879532), T90, T8Z), ms, &(ii[0])); + ST(&(ii[WS(rs, 26)]), VFNMS(LDK(KP923879532), T90, T8Z), ms, &(ii[0])); + } + } + { + V T4s, T6c, T4X, T9c, T9b, T9h, T6f, T9i, T66, T6q, T6a, T6m, T5x, T6p, T69; + V T6j; + { + V T4c, T4r, T6d, T6e; + T4c = VADD(T46, T4b); + T4r = VADD(T4j, T4q); + T4s = VFNMS(LDK(KP707106781), T4r, T4c); + T6c = VFMA(LDK(KP707106781), T4r, T4c); + { + V T4H, T4W, T99, T9a; + T4H = VFNMS(LDK(KP414213562), T4G, T4z); + T4W = VFMA(LDK(KP414213562), T4V, T4O); + T4X = VSUB(T4H, T4W); + T9c = VADD(T4H, T4W); + T99 = VSUB(T97, T98); + T9a = VADD(T6t, T6u); + T9b = VFMA(LDK(KP707106781), T9a, T99); + T9h = VFNMS(LDK(KP707106781), T9a, T99); + } + T6d = VFMA(LDK(KP414213562), T4z, T4G); + T6e = VFNMS(LDK(KP414213562), T4O, T4V); + T6f = VADD(T6d, T6e); + T9i = VSUB(T6e, T6d); + { + V T5U, T6l, T65, T6k, T5T, T64; + T5T = VADD(T5L, T5S); + T5U = VFNMS(LDK(KP707106781), T5T, T5E); + T6l = VFMA(LDK(KP707106781), T5T, T5E); + T64 = VADD(T62, T63); + T65 = VFNMS(LDK(KP707106781), T64, T61); + T6k = VFMA(LDK(KP707106781), T64, T61); + T66 = VFNMS(LDK(KP668178637), T65, T5U); + T6q = VFMA(LDK(KP198912367), T6k, T6l); + T6a = VFMA(LDK(KP668178637), T5U, T65); + T6m = VFNMS(LDK(KP198912367), T6l, T6k); + } + { + V T5l, T6i, T5w, T6h, T5k, T5v; + T5k = VADD(T5c, T5j); + T5l = VFNMS(LDK(KP707106781), T5k, T55); + T6i = VFMA(LDK(KP707106781), T5k, T55); + T5v = VADD(T5t, T5u); + T5w = VFNMS(LDK(KP707106781), T5v, T5s); + T6h = VFMA(LDK(KP707106781), T5v, T5s); + T5x = VFMA(LDK(KP668178637), T5w, T5l); + T6p = VFNMS(LDK(KP198912367), T6h, T6i); + T69 = VFNMS(LDK(KP668178637), T5l, T5w); + T6j = VFMA(LDK(KP198912367), T6i, T6h); + } + } + { + V T4Y, T67, T9j, T9k; + T4Y = VFMA(LDK(KP923879532), T4X, T4s); + T67 = VSUB(T5x, T66); + ST(&(ri[WS(rs, 21)]), VFNMS(LDK(KP831469612), T67, T4Y), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VFMA(LDK(KP831469612), T67, T4Y), ms, &(ri[WS(rs, 1)])); + T9j = VFMA(LDK(KP923879532), T9i, T9h); + T9k = VSUB(T6a, T69); + ST(&(ii[WS(rs, 5)]), VFMA(LDK(KP831469612), T9k, T9j), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 21)]), VFNMS(LDK(KP831469612), T9k, T9j), ms, &(ii[WS(rs, 1)])); + } + { + V T68, T6b, T9l, T9m; + T68 = VFNMS(LDK(KP923879532), T4X, T4s); + T6b = VADD(T69, T6a); + ST(&(ri[WS(rs, 13)]), VFNMS(LDK(KP831469612), T6b, T68), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 29)]), VFMA(LDK(KP831469612), T6b, T68), ms, &(ri[WS(rs, 1)])); + T9l = VFNMS(LDK(KP923879532), T9i, T9h); + T9m = VADD(T5x, T66); + ST(&(ii[WS(rs, 13)]), VFNMS(LDK(KP831469612), T9m, T9l), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 29)]), VFMA(LDK(KP831469612), T9m, T9l), ms, &(ii[WS(rs, 1)])); + } + { + V T6g, T6n, T9d, T9e; + T6g = VFMA(LDK(KP923879532), T6f, T6c); + T6n = VADD(T6j, T6m); + ST(&(ri[WS(rs, 17)]), VFNMS(LDK(KP980785280), T6n, T6g), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VFMA(LDK(KP980785280), T6n, T6g), ms, &(ri[WS(rs, 1)])); + T9d = VFMA(LDK(KP923879532), T9c, T9b); + T9e = VADD(T6p, T6q); + ST(&(ii[WS(rs, 1)]), VFMA(LDK(KP980785280), T9e, T9d), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 17)]), VFNMS(LDK(KP980785280), T9e, T9d), ms, &(ii[WS(rs, 1)])); + } + { + V T6o, T6r, T9f, T9g; + T6o = VFNMS(LDK(KP923879532), T6f, T6c); + T6r = VSUB(T6p, T6q); + ST(&(ri[WS(rs, 25)]), VFNMS(LDK(KP980785280), T6r, T6o), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 9)]), VFMA(LDK(KP980785280), T6r, T6o), ms, &(ri[WS(rs, 1)])); + T9f = VFNMS(LDK(KP923879532), T9c, T9b); + T9g = VSUB(T6m, T6j); + ST(&(ii[WS(rs, 9)]), VFMA(LDK(KP980785280), T9g, T9f), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 25)]), VFNMS(LDK(KP980785280), T9g, T9f), ms, &(ii[WS(rs, 1)])); + } + } + { + V T6w, T6Y, T6D, T9w, T9p, T9v, T71, T9q, T6S, T7c, T6W, T78, T6L, T7b, T6V; + V T75; + { + V T6s, T6v, T6Z, T70; + T6s = VSUB(T46, T4b); + T6v = VSUB(T6t, T6u); + T6w = VFMA(LDK(KP707106781), T6v, T6s); + T6Y = VFNMS(LDK(KP707106781), T6v, T6s); + { + V T6z, T6C, T9n, T9o; + T6z = VFMA(LDK(KP414213562), T6y, T6x); + T6C = VFNMS(LDK(KP414213562), T6B, T6A); + T6D = VSUB(T6z, T6C); + T9w = VADD(T6z, T6C); + T9n = VADD(T98, T97); + T9o = VSUB(T4q, T4j); + T9p = VFMA(LDK(KP707106781), T9o, T9n); + T9v = VFNMS(LDK(KP707106781), T9o, T9n); + } + T6Z = VFNMS(LDK(KP414213562), T6x, T6y); + T70 = VFMA(LDK(KP414213562), T6A, T6B); + T71 = VADD(T6Z, T70); + T9q = VSUB(T70, T6Z); + { + V T6O, T77, T6R, T76, T6N, T6Q; + T6N = VSUB(T5S, T5L); + T6O = VFNMS(LDK(KP707106781), T6N, T6M); + T77 = VFMA(LDK(KP707106781), T6N, T6M); + T6Q = VSUB(T62, T63); + T6R = VFNMS(LDK(KP707106781), T6Q, T6P); + T76 = VFMA(LDK(KP707106781), T6Q, T6P); + T6S = VFNMS(LDK(KP668178637), T6R, T6O); + T7c = VFMA(LDK(KP198912367), T76, T77); + T6W = VFMA(LDK(KP668178637), T6O, T6R); + T78 = VFNMS(LDK(KP198912367), T77, T76); + } + { + V T6H, T74, T6K, T73, T6G, T6J; + T6G = VSUB(T5j, T5c); + T6H = VFNMS(LDK(KP707106781), T6G, T6F); + T74 = VFMA(LDK(KP707106781), T6G, T6F); + T6J = VSUB(T5t, T5u); + T6K = VFNMS(LDK(KP707106781), T6J, T6I); + T73 = VFMA(LDK(KP707106781), T6J, T6I); + T6L = VFMA(LDK(KP668178637), T6K, T6H); + T7b = VFNMS(LDK(KP198912367), T73, T74); + T6V = VFNMS(LDK(KP668178637), T6H, T6K); + T75 = VFMA(LDK(KP198912367), T74, T73); + } + } + { + V T6E, T6T, T9r, T9s; + T6E = VFMA(LDK(KP923879532), T6D, T6w); + T6T = VADD(T6L, T6S); + ST(&(ri[WS(rs, 19)]), VFNMS(LDK(KP831469612), T6T, T6E), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VFMA(LDK(KP831469612), T6T, T6E), ms, &(ri[WS(rs, 1)])); + T9r = VFMA(LDK(KP923879532), T9q, T9p); + T9s = VADD(T6V, T6W); + ST(&(ii[WS(rs, 3)]), VFMA(LDK(KP831469612), T9s, T9r), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 19)]), VFNMS(LDK(KP831469612), T9s, T9r), ms, &(ii[WS(rs, 1)])); + } + { + V T6U, T6X, T9t, T9u; + T6U = VFNMS(LDK(KP923879532), T6D, T6w); + T6X = VSUB(T6V, T6W); + ST(&(ri[WS(rs, 27)]), VFNMS(LDK(KP831469612), T6X, T6U), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 11)]), VFMA(LDK(KP831469612), T6X, T6U), ms, &(ri[WS(rs, 1)])); + T9t = VFNMS(LDK(KP923879532), T9q, T9p); + T9u = VSUB(T6S, T6L); + ST(&(ii[WS(rs, 11)]), VFMA(LDK(KP831469612), T9u, T9t), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 27)]), VFNMS(LDK(KP831469612), T9u, T9t), ms, &(ii[WS(rs, 1)])); + } + { + V T72, T79, T9x, T9y; + T72 = VFNMS(LDK(KP923879532), T71, T6Y); + T79 = VSUB(T75, T78); + ST(&(ri[WS(rs, 23)]), VFNMS(LDK(KP980785280), T79, T72), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VFMA(LDK(KP980785280), T79, T72), ms, &(ri[WS(rs, 1)])); + T9x = VFNMS(LDK(KP923879532), T9w, T9v); + T9y = VSUB(T7c, T7b); + ST(&(ii[WS(rs, 7)]), VFMA(LDK(KP980785280), T9y, T9x), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 23)]), VFNMS(LDK(KP980785280), T9y, T9x), ms, &(ii[WS(rs, 1)])); + } + { + V T7a, T7d, T9z, T9A; + T7a = VFMA(LDK(KP923879532), T71, T6Y); + T7d = VADD(T7b, T7c); + ST(&(ri[WS(rs, 15)]), VFNMS(LDK(KP980785280), T7d, T7a), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 31)]), VFMA(LDK(KP980785280), T7d, T7a), ms, &(ri[WS(rs, 1)])); + T9z = VFMA(LDK(KP923879532), T9w, T9v); + T9A = VADD(T75, T78); + ST(&(ii[WS(rs, 15)]), VFNMS(LDK(KP980785280), T9A, T9z), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 31)]), VFMA(LDK(KP980785280), T9A, T9z), ms, &(ii[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 27), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t2sv_32"), twinstr, &GENUS, {236, 98, 252, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_32) (planner *p) { + X(kdft_dit_register) (p, t2sv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 32 -name t2sv_32 -include dft/simd/ts.h */ + +/* + * This function contains 488 FP additions, 280 FP multiplications, + * (or, 376 additions, 168 multiplications, 112 fused multiply/add), + * 158 stack variables, 7 constants, and 128 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 8); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 8), MAKE_VOLATILE_STRIDE(64, rs)) { + V T2, T5, T3, T6, T8, TM, TO, Td, T9, Te, Th, Tl, TD, TH, T1y; + V T1H, T15, T1A, T11, T1F, T1n, T1p, T2q, T2I, T2u, T2K, T2V, T3b, T2Z, T3d; + V Tu, Ty, T3l, T3n, T1t, T1v, T2f, T2h, T1a, T1e, T32, T34, T1W, T1Y, T2C; + V T2E, Tg, TR, Tk, TS, Tm, TV, To, TT, T1M, T21, T1P, T22, T1Q, T25; + V T1S, T23; + { + V Ts, T1d, Tx, T18, Tt, T1c, Tw, T19, TB, T14, TG, TZ, TC, T13, TF; + V T10; + { + V T4, Tc, T7, Tb; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 1])); + T3 = LDW(&(W[TWVL * 2])); + T6 = LDW(&(W[TWVL * 3])); + T4 = VMUL(T2, T3); + Tc = VMUL(T5, T3); + T7 = VMUL(T5, T6); + Tb = VMUL(T2, T6); + T8 = VADD(T4, T7); + TM = VSUB(T4, T7); + TO = VADD(Tb, Tc); + Td = VSUB(Tb, Tc); + T9 = LDW(&(W[TWVL * 4])); + Ts = VMUL(T2, T9); + T1d = VMUL(T6, T9); + Tx = VMUL(T5, T9); + T18 = VMUL(T3, T9); + Te = LDW(&(W[TWVL * 5])); + Tt = VMUL(T5, Te); + T1c = VMUL(T3, Te); + Tw = VMUL(T2, Te); + T19 = VMUL(T6, Te); + Th = LDW(&(W[TWVL * 6])); + TB = VMUL(T3, Th); + T14 = VMUL(T5, Th); + TG = VMUL(T6, Th); + TZ = VMUL(T2, Th); + Tl = LDW(&(W[TWVL * 7])); + TC = VMUL(T6, Tl); + T13 = VMUL(T2, Tl); + TF = VMUL(T3, Tl); + T10 = VMUL(T5, Tl); + } + TD = VADD(TB, TC); + TH = VSUB(TF, TG); + T1y = VADD(TZ, T10); + T1H = VADD(TF, TG); + T15 = VADD(T13, T14); + T1A = VSUB(T13, T14); + T11 = VSUB(TZ, T10); + T1F = VSUB(TB, TC); + T1n = VFMA(T9, Th, VMUL(Te, Tl)); + T1p = VFNMS(Te, Th, VMUL(T9, Tl)); + { + V T2o, T2p, T2s, T2t; + T2o = VMUL(T8, Th); + T2p = VMUL(Td, Tl); + T2q = VADD(T2o, T2p); + T2I = VSUB(T2o, T2p); + T2s = VMUL(T8, Tl); + T2t = VMUL(Td, Th); + T2u = VSUB(T2s, T2t); + T2K = VADD(T2s, T2t); + } + { + V T2T, T2U, T2X, T2Y; + T2T = VMUL(TM, Th); + T2U = VMUL(TO, Tl); + T2V = VSUB(T2T, T2U); + T3b = VADD(T2T, T2U); + T2X = VMUL(TM, Tl); + T2Y = VMUL(TO, Th); + T2Z = VADD(T2X, T2Y); + T3d = VSUB(T2X, T2Y); + Tu = VADD(Ts, Tt); + Ty = VSUB(Tw, Tx); + T3l = VFMA(Tu, Th, VMUL(Ty, Tl)); + T3n = VFNMS(Ty, Th, VMUL(Tu, Tl)); + } + T1t = VSUB(Ts, Tt); + T1v = VADD(Tw, Tx); + T2f = VFMA(T1t, Th, VMUL(T1v, Tl)); + T2h = VFNMS(T1v, Th, VMUL(T1t, Tl)); + T1a = VSUB(T18, T19); + T1e = VADD(T1c, T1d); + T32 = VFMA(T1a, Th, VMUL(T1e, Tl)); + T34 = VFNMS(T1e, Th, VMUL(T1a, Tl)); + T1W = VADD(T18, T19); + T1Y = VSUB(T1c, T1d); + T2C = VFMA(T1W, Th, VMUL(T1Y, Tl)); + T2E = VFNMS(T1Y, Th, VMUL(T1W, Tl)); + { + V Ta, Tf, Ti, Tj; + Ta = VMUL(T8, T9); + Tf = VMUL(Td, Te); + Tg = VSUB(Ta, Tf); + TR = VADD(Ta, Tf); + Ti = VMUL(T8, Te); + Tj = VMUL(Td, T9); + Tk = VADD(Ti, Tj); + TS = VSUB(Ti, Tj); + } + Tm = VFMA(Tg, Th, VMUL(Tk, Tl)); + TV = VFNMS(TS, Th, VMUL(TR, Tl)); + To = VFNMS(Tk, Th, VMUL(Tg, Tl)); + TT = VFMA(TR, Th, VMUL(TS, Tl)); + { + V T1K, T1L, T1N, T1O; + T1K = VMUL(TM, T9); + T1L = VMUL(TO, Te); + T1M = VSUB(T1K, T1L); + T21 = VADD(T1K, T1L); + T1N = VMUL(TM, Te); + T1O = VMUL(TO, T9); + T1P = VADD(T1N, T1O); + T22 = VSUB(T1N, T1O); + } + T1Q = VFMA(T1M, Th, VMUL(T1P, Tl)); + T25 = VFNMS(T22, Th, VMUL(T21, Tl)); + T1S = VFNMS(T1P, Th, VMUL(T1M, Tl)); + T23 = VFMA(T21, Th, VMUL(T22, Tl)); + } + { + V TL, T6f, T8c, T8q, T3F, T5t, T7I, T7W, T2y, T6B, T6y, T7j, T4k, T5J, T4B; + V T5G, T3h, T6H, T6O, T7o, T4L, T5N, T52, T5Q, T1i, T7V, T6i, T7D, T3K, T5u; + V T3P, T5v, T1E, T6n, T6m, T7e, T3W, T5y, T41, T5z, T29, T6p, T6s, T7f, T47; + V T5B, T4c, T5C, T2R, T6z, T6E, T7k, T4v, T5H, T4E, T5K, T3y, T6P, T6K, T7p; + V T4W, T5R, T55, T5O; + { + V T1, T7G, Tq, T7F, TA, T3C, TJ, T3D, Tn, Tp; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T7G = LD(&(ii[0]), ms, &(ii[0])); + Tn = LD(&(ri[WS(rs, 16)]), ms, &(ri[0])); + Tp = LD(&(ii[WS(rs, 16)]), ms, &(ii[0])); + Tq = VFMA(Tm, Tn, VMUL(To, Tp)); + T7F = VFNMS(To, Tn, VMUL(Tm, Tp)); + { + V Tv, Tz, TE, TI; + Tv = LD(&(ri[WS(rs, 8)]), ms, &(ri[0])); + Tz = LD(&(ii[WS(rs, 8)]), ms, &(ii[0])); + TA = VFMA(Tu, Tv, VMUL(Ty, Tz)); + T3C = VFNMS(Ty, Tv, VMUL(Tu, Tz)); + TE = LD(&(ri[WS(rs, 24)]), ms, &(ri[0])); + TI = LD(&(ii[WS(rs, 24)]), ms, &(ii[0])); + TJ = VFMA(TD, TE, VMUL(TH, TI)); + T3D = VFNMS(TH, TE, VMUL(TD, TI)); + } + { + V Tr, TK, T8a, T8b; + Tr = VADD(T1, Tq); + TK = VADD(TA, TJ); + TL = VADD(Tr, TK); + T6f = VSUB(Tr, TK); + T8a = VSUB(T7G, T7F); + T8b = VSUB(TA, TJ); + T8c = VSUB(T8a, T8b); + T8q = VADD(T8b, T8a); + } + { + V T3B, T3E, T7E, T7H; + T3B = VSUB(T1, Tq); + T3E = VSUB(T3C, T3D); + T3F = VSUB(T3B, T3E); + T5t = VADD(T3B, T3E); + T7E = VADD(T3C, T3D); + T7H = VADD(T7F, T7G); + T7I = VADD(T7E, T7H); + T7W = VSUB(T7H, T7E); + } + } + { + V T2e, T4g, T2w, T4z, T2j, T4h, T2n, T4y; + { + V T2c, T2d, T2r, T2v; + T2c = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + T2d = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T2e = VFMA(T2, T2c, VMUL(T5, T2d)); + T4g = VFNMS(T5, T2c, VMUL(T2, T2d)); + T2r = LD(&(ri[WS(rs, 25)]), ms, &(ri[WS(rs, 1)])); + T2v = LD(&(ii[WS(rs, 25)]), ms, &(ii[WS(rs, 1)])); + T2w = VFMA(T2q, T2r, VMUL(T2u, T2v)); + T4z = VFNMS(T2u, T2r, VMUL(T2q, T2v)); + } + { + V T2g, T2i, T2l, T2m; + T2g = LD(&(ri[WS(rs, 17)]), ms, &(ri[WS(rs, 1)])); + T2i = LD(&(ii[WS(rs, 17)]), ms, &(ii[WS(rs, 1)])); + T2j = VFMA(T2f, T2g, VMUL(T2h, T2i)); + T4h = VFNMS(T2h, T2g, VMUL(T2f, T2i)); + T2l = LD(&(ri[WS(rs, 9)]), ms, &(ri[WS(rs, 1)])); + T2m = LD(&(ii[WS(rs, 9)]), ms, &(ii[WS(rs, 1)])); + T2n = VFMA(T9, T2l, VMUL(Te, T2m)); + T4y = VFNMS(Te, T2l, VMUL(T9, T2m)); + } + { + V T2k, T2x, T6w, T6x; + T2k = VADD(T2e, T2j); + T2x = VADD(T2n, T2w); + T2y = VADD(T2k, T2x); + T6B = VSUB(T2k, T2x); + T6w = VADD(T4g, T4h); + T6x = VADD(T4y, T4z); + T6y = VSUB(T6w, T6x); + T7j = VADD(T6w, T6x); + } + { + V T4i, T4j, T4x, T4A; + T4i = VSUB(T4g, T4h); + T4j = VSUB(T2n, T2w); + T4k = VADD(T4i, T4j); + T5J = VSUB(T4i, T4j); + T4x = VSUB(T2e, T2j); + T4A = VSUB(T4y, T4z); + T4B = VSUB(T4x, T4A); + T5G = VADD(T4x, T4A); + } + } + { + V T31, T4Y, T3f, T4J, T36, T4Z, T3a, T4I; + { + V T2W, T30, T3c, T3e; + T2W = LD(&(ri[WS(rs, 31)]), ms, &(ri[WS(rs, 1)])); + T30 = LD(&(ii[WS(rs, 31)]), ms, &(ii[WS(rs, 1)])); + T31 = VFMA(T2V, T2W, VMUL(T2Z, T30)); + T4Y = VFNMS(T2Z, T2W, VMUL(T2V, T30)); + T3c = LD(&(ri[WS(rs, 23)]), ms, &(ri[WS(rs, 1)])); + T3e = LD(&(ii[WS(rs, 23)]), ms, &(ii[WS(rs, 1)])); + T3f = VFMA(T3b, T3c, VMUL(T3d, T3e)); + T4J = VFNMS(T3d, T3c, VMUL(T3b, T3e)); + } + { + V T33, T35, T38, T39; + T33 = LD(&(ri[WS(rs, 15)]), ms, &(ri[WS(rs, 1)])); + T35 = LD(&(ii[WS(rs, 15)]), ms, &(ii[WS(rs, 1)])); + T36 = VFMA(T32, T33, VMUL(T34, T35)); + T4Z = VFNMS(T34, T33, VMUL(T32, T35)); + T38 = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + T39 = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T3a = VFMA(TR, T38, VMUL(TS, T39)); + T4I = VFNMS(TS, T38, VMUL(TR, T39)); + } + { + V T37, T3g, T6M, T6N; + T37 = VADD(T31, T36); + T3g = VADD(T3a, T3f); + T3h = VADD(T37, T3g); + T6H = VSUB(T37, T3g); + T6M = VADD(T4Y, T4Z); + T6N = VADD(T4I, T4J); + T6O = VSUB(T6M, T6N); + T7o = VADD(T6M, T6N); + } + { + V T4H, T4K, T50, T51; + T4H = VSUB(T31, T36); + T4K = VSUB(T4I, T4J); + T4L = VSUB(T4H, T4K); + T5N = VADD(T4H, T4K); + T50 = VSUB(T4Y, T4Z); + T51 = VSUB(T3a, T3f); + T52 = VADD(T50, T51); + T5Q = VSUB(T50, T51); + } + } + { + V TQ, T3G, T1g, T3N, TX, T3H, T17, T3M; + { + V TN, TP, T1b, T1f; + TN = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + TP = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + TQ = VFMA(TM, TN, VMUL(TO, TP)); + T3G = VFNMS(TO, TN, VMUL(TM, TP)); + T1b = LD(&(ri[WS(rs, 12)]), ms, &(ri[0])); + T1f = LD(&(ii[WS(rs, 12)]), ms, &(ii[0])); + T1g = VFMA(T1a, T1b, VMUL(T1e, T1f)); + T3N = VFNMS(T1e, T1b, VMUL(T1a, T1f)); + } + { + V TU, TW, T12, T16; + TU = LD(&(ri[WS(rs, 20)]), ms, &(ri[0])); + TW = LD(&(ii[WS(rs, 20)]), ms, &(ii[0])); + TX = VFMA(TT, TU, VMUL(TV, TW)); + T3H = VFNMS(TV, TU, VMUL(TT, TW)); + T12 = LD(&(ri[WS(rs, 28)]), ms, &(ri[0])); + T16 = LD(&(ii[WS(rs, 28)]), ms, &(ii[0])); + T17 = VFMA(T11, T12, VMUL(T15, T16)); + T3M = VFNMS(T15, T12, VMUL(T11, T16)); + } + { + V TY, T1h, T6g, T6h; + TY = VADD(TQ, TX); + T1h = VADD(T17, T1g); + T1i = VADD(TY, T1h); + T7V = VSUB(T1h, TY); + T6g = VADD(T3G, T3H); + T6h = VADD(T3M, T3N); + T6i = VSUB(T6g, T6h); + T7D = VADD(T6g, T6h); + } + { + V T3I, T3J, T3L, T3O; + T3I = VSUB(T3G, T3H); + T3J = VSUB(TQ, TX); + T3K = VSUB(T3I, T3J); + T5u = VADD(T3J, T3I); + T3L = VSUB(T17, T1g); + T3O = VSUB(T3M, T3N); + T3P = VADD(T3L, T3O); + T5v = VSUB(T3L, T3O); + } + } + { + V T1m, T3S, T1C, T3Z, T1r, T3T, T1x, T3Y; + { + V T1k, T1l, T1z, T1B; + T1k = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + T1l = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + T1m = VFMA(T8, T1k, VMUL(Td, T1l)); + T3S = VFNMS(Td, T1k, VMUL(T8, T1l)); + T1z = LD(&(ri[WS(rs, 26)]), ms, &(ri[0])); + T1B = LD(&(ii[WS(rs, 26)]), ms, &(ii[0])); + T1C = VFMA(T1y, T1z, VMUL(T1A, T1B)); + T3Z = VFNMS(T1A, T1z, VMUL(T1y, T1B)); + } + { + V T1o, T1q, T1u, T1w; + T1o = LD(&(ri[WS(rs, 18)]), ms, &(ri[0])); + T1q = LD(&(ii[WS(rs, 18)]), ms, &(ii[0])); + T1r = VFMA(T1n, T1o, VMUL(T1p, T1q)); + T3T = VFNMS(T1p, T1o, VMUL(T1n, T1q)); + T1u = LD(&(ri[WS(rs, 10)]), ms, &(ri[0])); + T1w = LD(&(ii[WS(rs, 10)]), ms, &(ii[0])); + T1x = VFMA(T1t, T1u, VMUL(T1v, T1w)); + T3Y = VFNMS(T1v, T1u, VMUL(T1t, T1w)); + } + { + V T1s, T1D, T6k, T6l; + T1s = VADD(T1m, T1r); + T1D = VADD(T1x, T1C); + T1E = VADD(T1s, T1D); + T6n = VSUB(T1s, T1D); + T6k = VADD(T3S, T3T); + T6l = VADD(T3Y, T3Z); + T6m = VSUB(T6k, T6l); + T7e = VADD(T6k, T6l); + } + { + V T3U, T3V, T3X, T40; + T3U = VSUB(T3S, T3T); + T3V = VSUB(T1x, T1C); + T3W = VADD(T3U, T3V); + T5y = VSUB(T3U, T3V); + T3X = VSUB(T1m, T1r); + T40 = VSUB(T3Y, T3Z); + T41 = VSUB(T3X, T40); + T5z = VADD(T3X, T40); + } + } + { + V T1J, T43, T27, T4a, T1U, T44, T20, T49; + { + V T1G, T1I, T24, T26; + T1G = LD(&(ri[WS(rs, 30)]), ms, &(ri[0])); + T1I = LD(&(ii[WS(rs, 30)]), ms, &(ii[0])); + T1J = VFMA(T1F, T1G, VMUL(T1H, T1I)); + T43 = VFNMS(T1H, T1G, VMUL(T1F, T1I)); + T24 = LD(&(ri[WS(rs, 22)]), ms, &(ri[0])); + T26 = LD(&(ii[WS(rs, 22)]), ms, &(ii[0])); + T27 = VFMA(T23, T24, VMUL(T25, T26)); + T4a = VFNMS(T25, T24, VMUL(T23, T26)); + } + { + V T1R, T1T, T1X, T1Z; + T1R = LD(&(ri[WS(rs, 14)]), ms, &(ri[0])); + T1T = LD(&(ii[WS(rs, 14)]), ms, &(ii[0])); + T1U = VFMA(T1Q, T1R, VMUL(T1S, T1T)); + T44 = VFNMS(T1S, T1R, VMUL(T1Q, T1T)); + T1X = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + T1Z = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + T20 = VFMA(T1W, T1X, VMUL(T1Y, T1Z)); + T49 = VFNMS(T1Y, T1X, VMUL(T1W, T1Z)); + } + { + V T1V, T28, T6q, T6r; + T1V = VADD(T1J, T1U); + T28 = VADD(T20, T27); + T29 = VADD(T1V, T28); + T6p = VSUB(T1V, T28); + T6q = VADD(T43, T44); + T6r = VADD(T49, T4a); + T6s = VSUB(T6q, T6r); + T7f = VADD(T6q, T6r); + } + { + V T45, T46, T48, T4b; + T45 = VSUB(T43, T44); + T46 = VSUB(T20, T27); + T47 = VADD(T45, T46); + T5B = VSUB(T45, T46); + T48 = VSUB(T1J, T1U); + T4b = VSUB(T49, T4a); + T4c = VSUB(T48, T4b); + T5C = VADD(T48, T4b); + } + } + { + V T2B, T4r, T2G, T4s, T4q, T4t, T2M, T4m, T2P, T4n, T4l, T4o; + { + V T2z, T2A, T2D, T2F; + T2z = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + T2A = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T2B = VFMA(T21, T2z, VMUL(T22, T2A)); + T4r = VFNMS(T22, T2z, VMUL(T21, T2A)); + T2D = LD(&(ri[WS(rs, 21)]), ms, &(ri[WS(rs, 1)])); + T2F = LD(&(ii[WS(rs, 21)]), ms, &(ii[WS(rs, 1)])); + T2G = VFMA(T2C, T2D, VMUL(T2E, T2F)); + T4s = VFNMS(T2E, T2D, VMUL(T2C, T2F)); + } + T4q = VSUB(T2B, T2G); + T4t = VSUB(T4r, T4s); + { + V T2J, T2L, T2N, T2O; + T2J = LD(&(ri[WS(rs, 29)]), ms, &(ri[WS(rs, 1)])); + T2L = LD(&(ii[WS(rs, 29)]), ms, &(ii[WS(rs, 1)])); + T2M = VFMA(T2I, T2J, VMUL(T2K, T2L)); + T4m = VFNMS(T2K, T2J, VMUL(T2I, T2L)); + T2N = LD(&(ri[WS(rs, 13)]), ms, &(ri[WS(rs, 1)])); + T2O = LD(&(ii[WS(rs, 13)]), ms, &(ii[WS(rs, 1)])); + T2P = VFMA(T1M, T2N, VMUL(T1P, T2O)); + T4n = VFNMS(T1P, T2N, VMUL(T1M, T2O)); + } + T4l = VSUB(T2M, T2P); + T4o = VSUB(T4m, T4n); + { + V T2H, T2Q, T6C, T6D; + T2H = VADD(T2B, T2G); + T2Q = VADD(T2M, T2P); + T2R = VADD(T2H, T2Q); + T6z = VSUB(T2Q, T2H); + T6C = VADD(T4r, T4s); + T6D = VADD(T4m, T4n); + T6E = VSUB(T6C, T6D); + T7k = VADD(T6C, T6D); + } + { + V T4p, T4u, T4C, T4D; + T4p = VSUB(T4l, T4o); + T4u = VADD(T4q, T4t); + T4v = VMUL(LDK(KP707106781), VSUB(T4p, T4u)); + T5H = VMUL(LDK(KP707106781), VADD(T4u, T4p)); + T4C = VSUB(T4t, T4q); + T4D = VADD(T4l, T4o); + T4E = VMUL(LDK(KP707106781), VSUB(T4C, T4D)); + T5K = VMUL(LDK(KP707106781), VADD(T4C, T4D)); + } + } + { + V T3k, T4M, T3p, T4N, T4O, T4P, T3t, T4S, T3w, T4T, T4R, T4U; + { + V T3i, T3j, T3m, T3o; + T3i = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + T3j = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T3k = VFMA(T3, T3i, VMUL(T6, T3j)); + T4M = VFNMS(T6, T3i, VMUL(T3, T3j)); + T3m = LD(&(ri[WS(rs, 19)]), ms, &(ri[WS(rs, 1)])); + T3o = LD(&(ii[WS(rs, 19)]), ms, &(ii[WS(rs, 1)])); + T3p = VFMA(T3l, T3m, VMUL(T3n, T3o)); + T4N = VFNMS(T3n, T3m, VMUL(T3l, T3o)); + } + T4O = VSUB(T4M, T4N); + T4P = VSUB(T3k, T3p); + { + V T3r, T3s, T3u, T3v; + T3r = LD(&(ri[WS(rs, 27)]), ms, &(ri[WS(rs, 1)])); + T3s = LD(&(ii[WS(rs, 27)]), ms, &(ii[WS(rs, 1)])); + T3t = VFMA(Th, T3r, VMUL(Tl, T3s)); + T4S = VFNMS(Tl, T3r, VMUL(Th, T3s)); + T3u = LD(&(ri[WS(rs, 11)]), ms, &(ri[WS(rs, 1)])); + T3v = LD(&(ii[WS(rs, 11)]), ms, &(ii[WS(rs, 1)])); + T3w = VFMA(Tg, T3u, VMUL(Tk, T3v)); + T4T = VFNMS(Tk, T3u, VMUL(Tg, T3v)); + } + T4R = VSUB(T3t, T3w); + T4U = VSUB(T4S, T4T); + { + V T3q, T3x, T6I, T6J; + T3q = VADD(T3k, T3p); + T3x = VADD(T3t, T3w); + T3y = VADD(T3q, T3x); + T6P = VSUB(T3x, T3q); + T6I = VADD(T4M, T4N); + T6J = VADD(T4S, T4T); + T6K = VSUB(T6I, T6J); + T7p = VADD(T6I, T6J); + } + { + V T4Q, T4V, T53, T54; + T4Q = VSUB(T4O, T4P); + T4V = VADD(T4R, T4U); + T4W = VMUL(LDK(KP707106781), VSUB(T4Q, T4V)); + T5R = VMUL(LDK(KP707106781), VADD(T4Q, T4V)); + T53 = VSUB(T4R, T4U); + T54 = VADD(T4P, T4O); + T55 = VMUL(LDK(KP707106781), VSUB(T53, T54)); + T5O = VMUL(LDK(KP707106781), VADD(T54, T53)); + } + } + { + V T2b, T7x, T7K, T7M, T3A, T7L, T7A, T7B; + { + V T1j, T2a, T7C, T7J; + T1j = VADD(TL, T1i); + T2a = VADD(T1E, T29); + T2b = VADD(T1j, T2a); + T7x = VSUB(T1j, T2a); + T7C = VADD(T7e, T7f); + T7J = VADD(T7D, T7I); + T7K = VADD(T7C, T7J); + T7M = VSUB(T7J, T7C); + } + { + V T2S, T3z, T7y, T7z; + T2S = VADD(T2y, T2R); + T3z = VADD(T3h, T3y); + T3A = VADD(T2S, T3z); + T7L = VSUB(T3z, T2S); + T7y = VADD(T7j, T7k); + T7z = VADD(T7o, T7p); + T7A = VSUB(T7y, T7z); + T7B = VADD(T7y, T7z); + } + ST(&(ri[WS(rs, 16)]), VSUB(T2b, T3A), ms, &(ri[0])); + ST(&(ii[WS(rs, 16)]), VSUB(T7K, T7B), ms, &(ii[0])); + ST(&(ri[0]), VADD(T2b, T3A), ms, &(ri[0])); + ST(&(ii[0]), VADD(T7B, T7K), ms, &(ii[0])); + ST(&(ri[WS(rs, 24)]), VSUB(T7x, T7A), ms, &(ri[0])); + ST(&(ii[WS(rs, 24)]), VSUB(T7M, T7L), ms, &(ii[0])); + ST(&(ri[WS(rs, 8)]), VADD(T7x, T7A), ms, &(ri[0])); + ST(&(ii[WS(rs, 8)]), VADD(T7L, T7M), ms, &(ii[0])); + } + { + V T7h, T7t, T7Q, T7S, T7m, T7u, T7r, T7v; + { + V T7d, T7g, T7O, T7P; + T7d = VSUB(TL, T1i); + T7g = VSUB(T7e, T7f); + T7h = VADD(T7d, T7g); + T7t = VSUB(T7d, T7g); + T7O = VSUB(T29, T1E); + T7P = VSUB(T7I, T7D); + T7Q = VADD(T7O, T7P); + T7S = VSUB(T7P, T7O); + } + { + V T7i, T7l, T7n, T7q; + T7i = VSUB(T2y, T2R); + T7l = VSUB(T7j, T7k); + T7m = VADD(T7i, T7l); + T7u = VSUB(T7l, T7i); + T7n = VSUB(T3h, T3y); + T7q = VSUB(T7o, T7p); + T7r = VSUB(T7n, T7q); + T7v = VADD(T7n, T7q); + } + { + V T7s, T7N, T7w, T7R; + T7s = VMUL(LDK(KP707106781), VADD(T7m, T7r)); + ST(&(ri[WS(rs, 20)]), VSUB(T7h, T7s), ms, &(ri[0])); + ST(&(ri[WS(rs, 4)]), VADD(T7h, T7s), ms, &(ri[0])); + T7N = VMUL(LDK(KP707106781), VADD(T7u, T7v)); + ST(&(ii[WS(rs, 4)]), VADD(T7N, T7Q), ms, &(ii[0])); + ST(&(ii[WS(rs, 20)]), VSUB(T7Q, T7N), ms, &(ii[0])); + T7w = VMUL(LDK(KP707106781), VSUB(T7u, T7v)); + ST(&(ri[WS(rs, 28)]), VSUB(T7t, T7w), ms, &(ri[0])); + ST(&(ri[WS(rs, 12)]), VADD(T7t, T7w), ms, &(ri[0])); + T7R = VMUL(LDK(KP707106781), VSUB(T7r, T7m)); + ST(&(ii[WS(rs, 12)]), VADD(T7R, T7S), ms, &(ii[0])); + ST(&(ii[WS(rs, 28)]), VSUB(T7S, T7R), ms, &(ii[0])); + } + } + { + V T6j, T7X, T83, T6X, T6u, T7U, T77, T7b, T70, T82, T6G, T6U, T74, T7a, T6R; + V T6V; + { + V T6o, T6t, T6A, T6F; + T6j = VSUB(T6f, T6i); + T7X = VADD(T7V, T7W); + T83 = VSUB(T7W, T7V); + T6X = VADD(T6f, T6i); + T6o = VSUB(T6m, T6n); + T6t = VADD(T6p, T6s); + T6u = VMUL(LDK(KP707106781), VSUB(T6o, T6t)); + T7U = VMUL(LDK(KP707106781), VADD(T6o, T6t)); + { + V T75, T76, T6Y, T6Z; + T75 = VADD(T6H, T6K); + T76 = VADD(T6O, T6P); + T77 = VFNMS(LDK(KP382683432), T76, VMUL(LDK(KP923879532), T75)); + T7b = VFMA(LDK(KP923879532), T76, VMUL(LDK(KP382683432), T75)); + T6Y = VADD(T6n, T6m); + T6Z = VSUB(T6p, T6s); + T70 = VMUL(LDK(KP707106781), VADD(T6Y, T6Z)); + T82 = VMUL(LDK(KP707106781), VSUB(T6Z, T6Y)); + } + T6A = VSUB(T6y, T6z); + T6F = VSUB(T6B, T6E); + T6G = VFMA(LDK(KP923879532), T6A, VMUL(LDK(KP382683432), T6F)); + T6U = VFNMS(LDK(KP923879532), T6F, VMUL(LDK(KP382683432), T6A)); + { + V T72, T73, T6L, T6Q; + T72 = VADD(T6y, T6z); + T73 = VADD(T6B, T6E); + T74 = VFMA(LDK(KP382683432), T72, VMUL(LDK(KP923879532), T73)); + T7a = VFNMS(LDK(KP382683432), T73, VMUL(LDK(KP923879532), T72)); + T6L = VSUB(T6H, T6K); + T6Q = VSUB(T6O, T6P); + T6R = VFNMS(LDK(KP923879532), T6Q, VMUL(LDK(KP382683432), T6L)); + T6V = VFMA(LDK(KP382683432), T6Q, VMUL(LDK(KP923879532), T6L)); + } + } + { + V T6v, T6S, T81, T84; + T6v = VADD(T6j, T6u); + T6S = VADD(T6G, T6R); + ST(&(ri[WS(rs, 22)]), VSUB(T6v, T6S), ms, &(ri[0])); + ST(&(ri[WS(rs, 6)]), VADD(T6v, T6S), ms, &(ri[0])); + T81 = VADD(T6U, T6V); + T84 = VADD(T82, T83); + ST(&(ii[WS(rs, 6)]), VADD(T81, T84), ms, &(ii[0])); + ST(&(ii[WS(rs, 22)]), VSUB(T84, T81), ms, &(ii[0])); + } + { + V T6T, T6W, T85, T86; + T6T = VSUB(T6j, T6u); + T6W = VSUB(T6U, T6V); + ST(&(ri[WS(rs, 30)]), VSUB(T6T, T6W), ms, &(ri[0])); + ST(&(ri[WS(rs, 14)]), VADD(T6T, T6W), ms, &(ri[0])); + T85 = VSUB(T6R, T6G); + T86 = VSUB(T83, T82); + ST(&(ii[WS(rs, 14)]), VADD(T85, T86), ms, &(ii[0])); + ST(&(ii[WS(rs, 30)]), VSUB(T86, T85), ms, &(ii[0])); + } + { + V T71, T78, T7T, T7Y; + T71 = VADD(T6X, T70); + T78 = VADD(T74, T77); + ST(&(ri[WS(rs, 18)]), VSUB(T71, T78), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VADD(T71, T78), ms, &(ri[0])); + T7T = VADD(T7a, T7b); + T7Y = VADD(T7U, T7X); + ST(&(ii[WS(rs, 2)]), VADD(T7T, T7Y), ms, &(ii[0])); + ST(&(ii[WS(rs, 18)]), VSUB(T7Y, T7T), ms, &(ii[0])); + } + { + V T79, T7c, T7Z, T80; + T79 = VSUB(T6X, T70); + T7c = VSUB(T7a, T7b); + ST(&(ri[WS(rs, 26)]), VSUB(T79, T7c), ms, &(ri[0])); + ST(&(ri[WS(rs, 10)]), VADD(T79, T7c), ms, &(ri[0])); + T7Z = VSUB(T77, T74); + T80 = VSUB(T7X, T7U); + ST(&(ii[WS(rs, 10)]), VADD(T7Z, T80), ms, &(ii[0])); + ST(&(ii[WS(rs, 26)]), VSUB(T80, T7Z), ms, &(ii[0])); + } + } + { + V T3R, T5d, T8r, T8x, T4e, T8o, T5n, T5r, T4G, T5a, T5g, T8w, T5k, T5q, T57; + V T5b, T3Q, T8p; + T3Q = VMUL(LDK(KP707106781), VSUB(T3K, T3P)); + T3R = VSUB(T3F, T3Q); + T5d = VADD(T3F, T3Q); + T8p = VMUL(LDK(KP707106781), VSUB(T5v, T5u)); + T8r = VADD(T8p, T8q); + T8x = VSUB(T8q, T8p); + { + V T42, T4d, T5l, T5m; + T42 = VFNMS(LDK(KP923879532), T41, VMUL(LDK(KP382683432), T3W)); + T4d = VFMA(LDK(KP382683432), T47, VMUL(LDK(KP923879532), T4c)); + T4e = VSUB(T42, T4d); + T8o = VADD(T42, T4d); + T5l = VADD(T4L, T4W); + T5m = VADD(T52, T55); + T5n = VFNMS(LDK(KP555570233), T5m, VMUL(LDK(KP831469612), T5l)); + T5r = VFMA(LDK(KP831469612), T5m, VMUL(LDK(KP555570233), T5l)); + } + { + V T4w, T4F, T5e, T5f; + T4w = VSUB(T4k, T4v); + T4F = VSUB(T4B, T4E); + T4G = VFMA(LDK(KP980785280), T4w, VMUL(LDK(KP195090322), T4F)); + T5a = VFNMS(LDK(KP980785280), T4F, VMUL(LDK(KP195090322), T4w)); + T5e = VFMA(LDK(KP923879532), T3W, VMUL(LDK(KP382683432), T41)); + T5f = VFNMS(LDK(KP923879532), T47, VMUL(LDK(KP382683432), T4c)); + T5g = VADD(T5e, T5f); + T8w = VSUB(T5f, T5e); + } + { + V T5i, T5j, T4X, T56; + T5i = VADD(T4k, T4v); + T5j = VADD(T4B, T4E); + T5k = VFMA(LDK(KP555570233), T5i, VMUL(LDK(KP831469612), T5j)); + T5q = VFNMS(LDK(KP555570233), T5j, VMUL(LDK(KP831469612), T5i)); + T4X = VSUB(T4L, T4W); + T56 = VSUB(T52, T55); + T57 = VFNMS(LDK(KP980785280), T56, VMUL(LDK(KP195090322), T4X)); + T5b = VFMA(LDK(KP195090322), T56, VMUL(LDK(KP980785280), T4X)); + } + { + V T4f, T58, T8v, T8y; + T4f = VADD(T3R, T4e); + T58 = VADD(T4G, T57); + ST(&(ri[WS(rs, 23)]), VSUB(T4f, T58), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VADD(T4f, T58), ms, &(ri[WS(rs, 1)])); + T8v = VADD(T5a, T5b); + T8y = VADD(T8w, T8x); + ST(&(ii[WS(rs, 7)]), VADD(T8v, T8y), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 23)]), VSUB(T8y, T8v), ms, &(ii[WS(rs, 1)])); + } + { + V T59, T5c, T8z, T8A; + T59 = VSUB(T3R, T4e); + T5c = VSUB(T5a, T5b); + ST(&(ri[WS(rs, 31)]), VSUB(T59, T5c), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 15)]), VADD(T59, T5c), ms, &(ri[WS(rs, 1)])); + T8z = VSUB(T57, T4G); + T8A = VSUB(T8x, T8w); + ST(&(ii[WS(rs, 15)]), VADD(T8z, T8A), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 31)]), VSUB(T8A, T8z), ms, &(ii[WS(rs, 1)])); + } + { + V T5h, T5o, T8n, T8s; + T5h = VADD(T5d, T5g); + T5o = VADD(T5k, T5n); + ST(&(ri[WS(rs, 19)]), VSUB(T5h, T5o), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VADD(T5h, T5o), ms, &(ri[WS(rs, 1)])); + T8n = VADD(T5q, T5r); + T8s = VADD(T8o, T8r); + ST(&(ii[WS(rs, 3)]), VADD(T8n, T8s), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 19)]), VSUB(T8s, T8n), ms, &(ii[WS(rs, 1)])); + } + { + V T5p, T5s, T8t, T8u; + T5p = VSUB(T5d, T5g); + T5s = VSUB(T5q, T5r); + ST(&(ri[WS(rs, 27)]), VSUB(T5p, T5s), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 11)]), VADD(T5p, T5s), ms, &(ri[WS(rs, 1)])); + T8t = VSUB(T5n, T5k); + T8u = VSUB(T8r, T8o); + ST(&(ii[WS(rs, 11)]), VADD(T8t, T8u), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 27)]), VSUB(T8u, T8t), ms, &(ii[WS(rs, 1)])); + } + } + { + V T5x, T5Z, T8d, T8j, T5E, T88, T69, T6d, T5M, T5W, T62, T8i, T66, T6c, T5T; + V T5X, T5w, T89; + T5w = VMUL(LDK(KP707106781), VADD(T5u, T5v)); + T5x = VSUB(T5t, T5w); + T5Z = VADD(T5t, T5w); + T89 = VMUL(LDK(KP707106781), VADD(T3K, T3P)); + T8d = VADD(T89, T8c); + T8j = VSUB(T8c, T89); + { + V T5A, T5D, T67, T68; + T5A = VFNMS(LDK(KP382683432), T5z, VMUL(LDK(KP923879532), T5y)); + T5D = VFMA(LDK(KP923879532), T5B, VMUL(LDK(KP382683432), T5C)); + T5E = VSUB(T5A, T5D); + T88 = VADD(T5A, T5D); + T67 = VADD(T5N, T5O); + T68 = VADD(T5Q, T5R); + T69 = VFNMS(LDK(KP195090322), T68, VMUL(LDK(KP980785280), T67)); + T6d = VFMA(LDK(KP195090322), T67, VMUL(LDK(KP980785280), T68)); + } + { + V T5I, T5L, T60, T61; + T5I = VSUB(T5G, T5H); + T5L = VSUB(T5J, T5K); + T5M = VFMA(LDK(KP555570233), T5I, VMUL(LDK(KP831469612), T5L)); + T5W = VFNMS(LDK(KP831469612), T5I, VMUL(LDK(KP555570233), T5L)); + T60 = VFMA(LDK(KP382683432), T5y, VMUL(LDK(KP923879532), T5z)); + T61 = VFNMS(LDK(KP382683432), T5B, VMUL(LDK(KP923879532), T5C)); + T62 = VADD(T60, T61); + T8i = VSUB(T61, T60); + } + { + V T64, T65, T5P, T5S; + T64 = VADD(T5G, T5H); + T65 = VADD(T5J, T5K); + T66 = VFMA(LDK(KP980785280), T64, VMUL(LDK(KP195090322), T65)); + T6c = VFNMS(LDK(KP195090322), T64, VMUL(LDK(KP980785280), T65)); + T5P = VSUB(T5N, T5O); + T5S = VSUB(T5Q, T5R); + T5T = VFNMS(LDK(KP831469612), T5S, VMUL(LDK(KP555570233), T5P)); + T5X = VFMA(LDK(KP831469612), T5P, VMUL(LDK(KP555570233), T5S)); + } + { + V T5F, T5U, T8h, T8k; + T5F = VADD(T5x, T5E); + T5U = VADD(T5M, T5T); + ST(&(ri[WS(rs, 21)]), VSUB(T5F, T5U), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 5)]), VADD(T5F, T5U), ms, &(ri[WS(rs, 1)])); + T8h = VADD(T5W, T5X); + T8k = VADD(T8i, T8j); + ST(&(ii[WS(rs, 5)]), VADD(T8h, T8k), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 21)]), VSUB(T8k, T8h), ms, &(ii[WS(rs, 1)])); + } + { + V T5V, T5Y, T8l, T8m; + T5V = VSUB(T5x, T5E); + T5Y = VSUB(T5W, T5X); + ST(&(ri[WS(rs, 29)]), VSUB(T5V, T5Y), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 13)]), VADD(T5V, T5Y), ms, &(ri[WS(rs, 1)])); + T8l = VSUB(T5T, T5M); + T8m = VSUB(T8j, T8i); + ST(&(ii[WS(rs, 13)]), VADD(T8l, T8m), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 29)]), VSUB(T8m, T8l), ms, &(ii[WS(rs, 1)])); + } + { + V T63, T6a, T87, T8e; + T63 = VADD(T5Z, T62); + T6a = VADD(T66, T69); + ST(&(ri[WS(rs, 17)]), VSUB(T63, T6a), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(T63, T6a), ms, &(ri[WS(rs, 1)])); + T87 = VADD(T6c, T6d); + T8e = VADD(T88, T8d); + ST(&(ii[WS(rs, 1)]), VADD(T87, T8e), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 17)]), VSUB(T8e, T87), ms, &(ii[WS(rs, 1)])); + } + { + V T6b, T6e, T8f, T8g; + T6b = VSUB(T5Z, T62); + T6e = VSUB(T6c, T6d); + ST(&(ri[WS(rs, 25)]), VSUB(T6b, T6e), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 9)]), VADD(T6b, T6e), ms, &(ri[WS(rs, 1)])); + T8f = VSUB(T69, T66); + T8g = VSUB(T8d, T88); + ST(&(ii[WS(rs, 9)]), VADD(T8f, T8g), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 25)]), VSUB(T8g, T8f), ms, &(ii[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 27), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t2sv_32"), twinstr, &GENUS, {376, 168, 112, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_32) (planner *p) { + X(kdft_dit_register) (p, t2sv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_4.c new file mode 100644 index 000000000..970a1a11a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_4.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 4 -name t2sv_4 -include dft/simd/ts.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 4), MAKE_VOLATILE_STRIDE(8, rs)) { + V T2, T6, T3, T5, T7, Tb, T4, Ta; + T2 = LDW(&(W[0])); + T6 = LDW(&(W[TWVL * 3])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VMUL(T2, T3); + Ta = VMUL(T2, T6); + T5 = LDW(&(W[TWVL * 1])); + T7 = VFMA(T5, T6, T4); + Tb = VFNMS(T5, T3, Ta); + { + V T1, Tx, Td, Tw, Ti, Tq, Tm, Ts; + T1 = LD(&(ri[0]), ms, &(ri[0])); + Tx = LD(&(ii[0]), ms, &(ii[0])); + { + V T8, T9, Tc, Tv; + T8 = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + T9 = VMUL(T7, T8); + Tc = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + Tv = VMUL(T7, Tc); + Td = VFMA(Tb, Tc, T9); + Tw = VFNMS(Tb, T8, Tv); + } + { + V Tf, Tg, Th, Tp; + Tf = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Tg = VMUL(T2, Tf); + Th = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + Tp = VMUL(T2, Th); + Ti = VFMA(T5, Th, Tg); + Tq = VFNMS(T5, Tf, Tp); + } + { + V Tj, Tk, Tl, Tr; + Tj = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + Tk = VMUL(T3, Tj); + Tl = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + Tr = VMUL(T3, Tl); + Tm = VFMA(T6, Tl, Tk); + Ts = VFNMS(T6, Tj, Tr); + } + { + V Te, Tn, Tu, Ty; + Te = VADD(T1, Td); + Tn = VADD(Ti, Tm); + ST(&(ri[WS(rs, 2)]), VSUB(Te, Tn), ms, &(ri[0])); + ST(&(ri[0]), VADD(Te, Tn), ms, &(ri[0])); + Tu = VADD(Tq, Ts); + Ty = VADD(Tw, Tx); + ST(&(ii[0]), VADD(Tu, Ty), ms, &(ii[0])); + ST(&(ii[WS(rs, 2)]), VSUB(Ty, Tu), ms, &(ii[0])); + } + { + V To, Tt, Tz, TA; + To = VSUB(T1, Td); + Tt = VSUB(Tq, Ts); + ST(&(ri[WS(rs, 3)]), VSUB(To, Tt), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(To, Tt), ms, &(ri[WS(rs, 1)])); + Tz = VSUB(Tx, Tw); + TA = VSUB(Ti, Tm); + ST(&(ii[WS(rs, 1)]), VSUB(Tz, TA), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(TA, Tz), ms, &(ii[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t2sv_4"), twinstr, &GENUS, {16, 8, 8, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_4) (planner *p) { + X(kdft_dit_register) (p, t2sv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 4 -name t2sv_4 -include dft/simd/ts.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + (mb * 4); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 4), MAKE_VOLATILE_STRIDE(8, rs)) { + V T2, T4, T3, T5, T6, T8; + T2 = LDW(&(W[0])); + T4 = LDW(&(W[TWVL * 1])); + T3 = LDW(&(W[TWVL * 2])); + T5 = LDW(&(W[TWVL * 3])); + T6 = VFMA(T2, T3, VMUL(T4, T5)); + T8 = VFNMS(T4, T3, VMUL(T2, T5)); + { + V T1, Tp, Ta, To, Te, Tk, Th, Tl, T7, T9; + T1 = LD(&(ri[0]), ms, &(ri[0])); + Tp = LD(&(ii[0]), ms, &(ii[0])); + T7 = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + T9 = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + Ta = VFMA(T6, T7, VMUL(T8, T9)); + To = VFNMS(T8, T7, VMUL(T6, T9)); + { + V Tc, Td, Tf, Tg; + Tc = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Td = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + Te = VFMA(T2, Tc, VMUL(T4, Td)); + Tk = VFNMS(T4, Tc, VMUL(T2, Td)); + Tf = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + Tg = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + Th = VFMA(T3, Tf, VMUL(T5, Tg)); + Tl = VFNMS(T5, Tf, VMUL(T3, Tg)); + } + { + V Tb, Ti, Tn, Tq; + Tb = VADD(T1, Ta); + Ti = VADD(Te, Th); + ST(&(ri[WS(rs, 2)]), VSUB(Tb, Ti), ms, &(ri[0])); + ST(&(ri[0]), VADD(Tb, Ti), ms, &(ri[0])); + Tn = VADD(Tk, Tl); + Tq = VADD(To, Tp); + ST(&(ii[0]), VADD(Tn, Tq), ms, &(ii[0])); + ST(&(ii[WS(rs, 2)]), VSUB(Tq, Tn), ms, &(ii[0])); + } + { + V Tj, Tm, Tr, Ts; + Tj = VSUB(T1, Ta); + Tm = VSUB(Tk, Tl); + ST(&(ri[WS(rs, 3)]), VSUB(Tj, Tm), ms, &(ri[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(Tj, Tm), ms, &(ri[WS(rs, 1)])); + Tr = VSUB(Tp, To); + Ts = VSUB(Te, Th); + ST(&(ii[WS(rs, 1)]), VSUB(Tr, Ts), ms, &(ii[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(Ts, Tr), ms, &(ii[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t2sv_4"), twinstr, &GENUS, {16, 8, 8, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_4) (planner *p) { + X(kdft_dit_register) (p, t2sv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_8.c new file mode 100644 index 000000000..941cbff43 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t2sv_8.c @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:11 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 8 -name t2sv_8 -include dft/simd/ts.h */ + +/* + * This function contains 74 FP additions, 50 FP multiplications, + * (or, 44 additions, 20 multiplications, 30 fused multiply/add), + * 48 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 6), MAKE_VOLATILE_STRIDE(16, rs)) { + V T2, T3, Tl, Tn, T5, T6, Tf, T7, Ts, Tb, To, Ti, TC, TG; + { + V T4, Tm, Tr, Ta, TB, TF; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VMUL(T2, T3); + Tl = LDW(&(W[TWVL * 4])); + Tm = VMUL(T2, Tl); + Tn = LDW(&(W[TWVL * 5])); + Tr = VMUL(T2, Tn); + T5 = LDW(&(W[TWVL * 1])); + T6 = LDW(&(W[TWVL * 3])); + Ta = VMUL(T2, T6); + Tf = VFMA(T5, T6, T4); + T7 = VFNMS(T5, T6, T4); + Ts = VFNMS(T5, Tl, Tr); + Tb = VFMA(T5, T3, Ta); + To = VFMA(T5, Tn, Tm); + TB = VMUL(Tf, Tl); + TF = VMUL(Tf, Tn); + Ti = VFNMS(T5, T3, Ta); + TC = VFMA(Ti, Tn, TB); + TG = VFNMS(Ti, Tl, TF); + } + { + V T1, T1s, Td, T1r, Tu, TY, Tk, TW, TN, TR, T18, T1a, T1c, T1d, TA; + V TI, T11, T13, T15, T16; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T1s = LD(&(ii[0]), ms, &(ii[0])); + { + V T8, T9, Tc, T1q; + T8 = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + T9 = VMUL(T7, T8); + Tc = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + T1q = VMUL(T7, Tc); + Td = VFMA(Tb, Tc, T9); + T1r = VFNMS(Tb, T8, T1q); + } + { + V Tp, Tq, Tt, TX; + Tp = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + Tq = VMUL(To, Tp); + Tt = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + TX = VMUL(To, Tt); + Tu = VFMA(Ts, Tt, Tq); + TY = VFNMS(Ts, Tp, TX); + } + { + V Tg, Th, Tj, TV; + Tg = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + Th = VMUL(Tf, Tg); + Tj = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + TV = VMUL(Tf, Tj); + Tk = VFMA(Ti, Tj, Th); + TW = VFNMS(Ti, Tg, TV); + } + { + V TK, TL, TM, T19, TO, TP, TQ, T1b; + TK = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + TL = VMUL(Tl, TK); + TM = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + T19 = VMUL(Tl, TM); + TO = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + TP = VMUL(T3, TO); + TQ = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + T1b = VMUL(T3, TQ); + TN = VFMA(Tn, TM, TL); + TR = VFMA(T6, TQ, TP); + T18 = VSUB(TN, TR); + T1a = VFNMS(Tn, TK, T19); + T1c = VFNMS(T6, TO, T1b); + T1d = VSUB(T1a, T1c); + } + { + V Tx, Ty, Tz, T12, TD, TE, TH, T14; + Tx = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Ty = VMUL(T2, Tx); + Tz = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + T12 = VMUL(T2, Tz); + TD = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + TE = VMUL(TC, TD); + TH = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + T14 = VMUL(TC, TH); + TA = VFMA(T5, Tz, Ty); + TI = VFMA(TG, TH, TE); + T11 = VSUB(TA, TI); + T13 = VFNMS(T5, Tx, T12); + T15 = VFNMS(TG, TD, T14); + T16 = VSUB(T13, T15); + } + { + V T10, T1g, T1z, T1B, T1f, T1C, T1j, T1A; + { + V TU, TZ, T1x, T1y; + TU = VSUB(T1, Td); + TZ = VSUB(TW, TY); + T10 = VADD(TU, TZ); + T1g = VSUB(TU, TZ); + T1x = VSUB(T1s, T1r); + T1y = VSUB(Tk, Tu); + T1z = VSUB(T1x, T1y); + T1B = VADD(T1y, T1x); + } + { + V T17, T1e, T1h, T1i; + T17 = VADD(T11, T16); + T1e = VSUB(T18, T1d); + T1f = VADD(T17, T1e); + T1C = VSUB(T1e, T17); + T1h = VSUB(T16, T11); + T1i = VADD(T18, T1d); + T1j = VSUB(T1h, T1i); + T1A = VADD(T1h, T1i); + } + ST(&(ri[WS(rs, 5)]), VFNMS(LDK(KP707106781), T1f, T10), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 5)]), VFNMS(LDK(KP707106781), T1A, T1z), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VFMA(LDK(KP707106781), T1f, T10), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VFMA(LDK(KP707106781), T1A, T1z), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 7)]), VFNMS(LDK(KP707106781), T1j, T1g), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 7)]), VFNMS(LDK(KP707106781), T1C, T1B), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VFMA(LDK(KP707106781), T1j, T1g), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VFMA(LDK(KP707106781), T1C, T1B), ms, &(ii[WS(rs, 1)])); + } + { + V Tw, T1k, T1u, T1w, TT, T1v, T1n, T1o; + { + V Te, Tv, T1p, T1t; + Te = VADD(T1, Td); + Tv = VADD(Tk, Tu); + Tw = VADD(Te, Tv); + T1k = VSUB(Te, Tv); + T1p = VADD(TW, TY); + T1t = VADD(T1r, T1s); + T1u = VADD(T1p, T1t); + T1w = VSUB(T1t, T1p); + } + { + V TJ, TS, T1l, T1m; + TJ = VADD(TA, TI); + TS = VADD(TN, TR); + TT = VADD(TJ, TS); + T1v = VSUB(TS, TJ); + T1l = VADD(T13, T15); + T1m = VADD(T1a, T1c); + T1n = VSUB(T1l, T1m); + T1o = VADD(T1l, T1m); + } + ST(&(ri[WS(rs, 4)]), VSUB(Tw, TT), ms, &(ri[0])); + ST(&(ii[WS(rs, 4)]), VSUB(T1u, T1o), ms, &(ii[0])); + ST(&(ri[0]), VADD(Tw, TT), ms, &(ri[0])); + ST(&(ii[0]), VADD(T1o, T1u), ms, &(ii[0])); + ST(&(ri[WS(rs, 6)]), VSUB(T1k, T1n), ms, &(ri[0])); + ST(&(ii[WS(rs, 6)]), VSUB(T1w, T1v), ms, &(ii[0])); + ST(&(ri[WS(rs, 2)]), VADD(T1k, T1n), ms, &(ri[0])); + ST(&(ii[WS(rs, 2)]), VADD(T1v, T1w), ms, &(ii[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 7), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t2sv_8"), twinstr, &GENUS, {44, 20, 30, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_8) (planner *p) { + X(kdft_dit_register) (p, t2sv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -n 8 -name t2sv_8 -include dft/simd/ts.h */ + +/* + * This function contains 74 FP additions, 44 FP multiplications, + * (or, 56 additions, 26 multiplications, 18 fused multiply/add), + * 42 stack variables, 1 constants, and 32 memory accesses + */ +#include "dft/simd/ts.h" + +static void t2sv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + (mb * 6); m < me; m = m + (2 * VL), ri = ri + ((2 * VL) * ms), ii = ii + ((2 * VL) * ms), W = W + ((2 * VL) * 6), MAKE_VOLATILE_STRIDE(16, rs)) { + V T2, T5, T3, T6, T8, Tc, Tg, Ti, Tl, Tm, Tn, Tz, Tp, Tx; + { + V T4, Tb, T7, Ta; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 1])); + T3 = LDW(&(W[TWVL * 2])); + T6 = LDW(&(W[TWVL * 3])); + T4 = VMUL(T2, T3); + Tb = VMUL(T5, T3); + T7 = VMUL(T5, T6); + Ta = VMUL(T2, T6); + T8 = VSUB(T4, T7); + Tc = VADD(Ta, Tb); + Tg = VADD(T4, T7); + Ti = VSUB(Ta, Tb); + Tl = LDW(&(W[TWVL * 4])); + Tm = LDW(&(W[TWVL * 5])); + Tn = VFMA(T2, Tl, VMUL(T5, Tm)); + Tz = VFNMS(Ti, Tl, VMUL(Tg, Tm)); + Tp = VFNMS(T5, Tl, VMUL(T2, Tm)); + Tx = VFMA(Tg, Tl, VMUL(Ti, Tm)); + } + { + V Tf, T1i, TL, T1d, TJ, T17, TV, TY, Ts, T1j, TO, T1a, TC, T16, TQ; + V TT; + { + V T1, T1c, Te, T1b, T9, Td; + T1 = LD(&(ri[0]), ms, &(ri[0])); + T1c = LD(&(ii[0]), ms, &(ii[0])); + T9 = LD(&(ri[WS(rs, 4)]), ms, &(ri[0])); + Td = LD(&(ii[WS(rs, 4)]), ms, &(ii[0])); + Te = VFMA(T8, T9, VMUL(Tc, Td)); + T1b = VFNMS(Tc, T9, VMUL(T8, Td)); + Tf = VADD(T1, Te); + T1i = VSUB(T1c, T1b); + TL = VSUB(T1, Te); + T1d = VADD(T1b, T1c); + } + { + V TF, TW, TI, TX; + { + V TD, TE, TG, TH; + TD = LD(&(ri[WS(rs, 7)]), ms, &(ri[WS(rs, 1)])); + TE = LD(&(ii[WS(rs, 7)]), ms, &(ii[WS(rs, 1)])); + TF = VFMA(Tl, TD, VMUL(Tm, TE)); + TW = VFNMS(Tm, TD, VMUL(Tl, TE)); + TG = LD(&(ri[WS(rs, 3)]), ms, &(ri[WS(rs, 1)])); + TH = LD(&(ii[WS(rs, 3)]), ms, &(ii[WS(rs, 1)])); + TI = VFMA(T3, TG, VMUL(T6, TH)); + TX = VFNMS(T6, TG, VMUL(T3, TH)); + } + TJ = VADD(TF, TI); + T17 = VADD(TW, TX); + TV = VSUB(TF, TI); + TY = VSUB(TW, TX); + } + { + V Tk, TM, Tr, TN; + { + V Th, Tj, To, Tq; + Th = LD(&(ri[WS(rs, 2)]), ms, &(ri[0])); + Tj = LD(&(ii[WS(rs, 2)]), ms, &(ii[0])); + Tk = VFMA(Tg, Th, VMUL(Ti, Tj)); + TM = VFNMS(Ti, Th, VMUL(Tg, Tj)); + To = LD(&(ri[WS(rs, 6)]), ms, &(ri[0])); + Tq = LD(&(ii[WS(rs, 6)]), ms, &(ii[0])); + Tr = VFMA(Tn, To, VMUL(Tp, Tq)); + TN = VFNMS(Tp, To, VMUL(Tn, Tq)); + } + Ts = VADD(Tk, Tr); + T1j = VSUB(Tk, Tr); + TO = VSUB(TM, TN); + T1a = VADD(TM, TN); + } + { + V Tw, TR, TB, TS; + { + V Tu, Tv, Ty, TA; + Tu = LD(&(ri[WS(rs, 1)]), ms, &(ri[WS(rs, 1)])); + Tv = LD(&(ii[WS(rs, 1)]), ms, &(ii[WS(rs, 1)])); + Tw = VFMA(T2, Tu, VMUL(T5, Tv)); + TR = VFNMS(T5, Tu, VMUL(T2, Tv)); + Ty = LD(&(ri[WS(rs, 5)]), ms, &(ri[WS(rs, 1)])); + TA = LD(&(ii[WS(rs, 5)]), ms, &(ii[WS(rs, 1)])); + TB = VFMA(Tx, Ty, VMUL(Tz, TA)); + TS = VFNMS(Tz, Ty, VMUL(Tx, TA)); + } + TC = VADD(Tw, TB); + T16 = VADD(TR, TS); + TQ = VSUB(Tw, TB); + TT = VSUB(TR, TS); + } + { + V Tt, TK, T1f, T1g; + Tt = VADD(Tf, Ts); + TK = VADD(TC, TJ); + ST(&(ri[WS(rs, 4)]), VSUB(Tt, TK), ms, &(ri[0])); + ST(&(ri[0]), VADD(Tt, TK), ms, &(ri[0])); + { + V T19, T1e, T15, T18; + T19 = VADD(T16, T17); + T1e = VADD(T1a, T1d); + ST(&(ii[0]), VADD(T19, T1e), ms, &(ii[0])); + ST(&(ii[WS(rs, 4)]), VSUB(T1e, T19), ms, &(ii[0])); + T15 = VSUB(Tf, Ts); + T18 = VSUB(T16, T17); + ST(&(ri[WS(rs, 6)]), VSUB(T15, T18), ms, &(ri[0])); + ST(&(ri[WS(rs, 2)]), VADD(T15, T18), ms, &(ri[0])); + } + T1f = VSUB(TJ, TC); + T1g = VSUB(T1d, T1a); + ST(&(ii[WS(rs, 2)]), VADD(T1f, T1g), ms, &(ii[0])); + ST(&(ii[WS(rs, 6)]), VSUB(T1g, T1f), ms, &(ii[0])); + { + V T11, T1k, T14, T1h, T12, T13; + T11 = VSUB(TL, TO); + T1k = VSUB(T1i, T1j); + T12 = VSUB(TT, TQ); + T13 = VADD(TV, TY); + T14 = VMUL(LDK(KP707106781), VSUB(T12, T13)); + T1h = VMUL(LDK(KP707106781), VADD(T12, T13)); + ST(&(ri[WS(rs, 7)]), VSUB(T11, T14), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 5)]), VSUB(T1k, T1h), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 3)]), VADD(T11, T14), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 1)]), VADD(T1h, T1k), ms, &(ii[WS(rs, 1)])); + } + { + V TP, T1m, T10, T1l, TU, TZ; + TP = VADD(TL, TO); + T1m = VADD(T1j, T1i); + TU = VADD(TQ, TT); + TZ = VSUB(TV, TY); + T10 = VMUL(LDK(KP707106781), VADD(TU, TZ)); + T1l = VMUL(LDK(KP707106781), VSUB(TZ, TU)); + ST(&(ri[WS(rs, 5)]), VSUB(TP, T10), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 7)]), VSUB(T1m, T1l), ms, &(ii[WS(rs, 1)])); + ST(&(ri[WS(rs, 1)]), VADD(TP, T10), ms, &(ri[WS(rs, 1)])); + ST(&(ii[WS(rs, 3)]), VADD(T1l, T1m), ms, &(ii[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 7), + {TW_NEXT, (2 * VL), 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t2sv_8"), twinstr, &GENUS, {56, 26, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t2sv_8) (planner *p) { + X(kdft_dit_register) (p, t2sv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_10.c new file mode 100644 index 000000000..aaab86964 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_10.c @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 10 -name t3bv_10 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 57 FP additions, 52 FP multiplications, + * (or, 39 additions, 34 multiplications, 18 fused multiply/add), + * 41 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(10, rs)) { + V T2, T3, T4, Ta, T5, T6, Tt, Td, Th; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMUL(T2, T3); + Ta = VZMULJ(T2, T3); + T5 = LDW(&(W[TWVL * 4])); + T6 = VZMULJ(T4, T5); + Tt = VZMULJ(T3, T5); + Td = VZMULJ(Ta, T5); + Th = VZMULJ(T2, T5); + { + V T9, TJ, Ts, Ty, Tz, TN, TO, TP, Tg, Tm, Tn, TK, TL, TM, T1; + V T8, T7; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = VZMUL(T6, T7); + T9 = VSUB(T1, T8); + TJ = VADD(T1, T8); + { + V Tp, Tx, Tr, Tv; + { + V To, Tw, Tq, Tu; + To = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tp = VZMUL(T4, To); + Tw = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tx = VZMUL(T2, Tw); + Tq = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tr = VZMUL(T5, Tq); + Tu = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tv = VZMUL(Tt, Tu); + } + Ts = VSUB(Tp, Tr); + Ty = VSUB(Tv, Tx); + Tz = VADD(Ts, Ty); + TN = VADD(Tp, Tr); + TO = VADD(Tv, Tx); + TP = VADD(TN, TO); + } + { + V Tc, Tl, Tf, Tj; + { + V Tb, Tk, Te, Ti; + Tb = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tc = VZMUL(Ta, Tb); + Tk = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tl = VZMUL(T3, Tk); + Te = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tf = VZMUL(Td, Te); + Ti = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tj = VZMUL(Th, Ti); + } + Tg = VSUB(Tc, Tf); + Tm = VSUB(Tj, Tl); + Tn = VADD(Tg, Tm); + TK = VADD(Tc, Tf); + TL = VADD(Tj, Tl); + TM = VADD(TK, TL); + } + { + V TC, TA, TB, TG, TI, TE, TF, TH, TD; + TC = VSUB(Tn, Tz); + TA = VADD(Tn, Tz); + TB = VFNMS(LDK(KP250000000), TA, T9); + TE = VSUB(Tg, Tm); + TF = VSUB(Ts, Ty); + TG = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TF, TE)); + TI = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TE, TF)); + ST(&(x[WS(rs, 5)]), VADD(T9, TA), ms, &(x[WS(rs, 1)])); + TH = VFNMS(LDK(KP559016994), TC, TB); + ST(&(x[WS(rs, 3)]), VFMAI(TI, TH), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(TI, TH), ms, &(x[WS(rs, 1)])); + TD = VFMA(LDK(KP559016994), TC, TB); + ST(&(x[WS(rs, 1)]), VFMAI(TG, TD), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFNMSI(TG, TD), ms, &(x[WS(rs, 1)])); + } + { + V TS, TQ, TR, TW, TY, TU, TV, TX, TT; + TS = VSUB(TM, TP); + TQ = VADD(TM, TP); + TR = VFNMS(LDK(KP250000000), TQ, TJ); + TU = VSUB(TN, TO); + TV = VSUB(TK, TL); + TW = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TV, TU)); + TY = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TU, TV)); + ST(&(x[0]), VADD(TJ, TQ), ms, &(x[0])); + TX = VFMA(LDK(KP559016994), TS, TR); + ST(&(x[WS(rs, 4)]), VFNMSI(TY, TX), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFMAI(TY, TX), ms, &(x[0])); + TT = VFNMS(LDK(KP559016994), TS, TR); + ST(&(x[WS(rs, 2)]), VFNMSI(TW, TT), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(TW, TT), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t3bv_10"), twinstr, &GENUS, {39, 34, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_10) (planner *p) { + X(kdft_dit_register) (p, t3bv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 10 -name t3bv_10 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 57 FP additions, 42 FP multiplications, + * (or, 51 additions, 36 multiplications, 6 fused multiply/add), + * 41 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(10, rs)) { + V T1, T2, T3, Ti, T6, T7, TA, Tb, To; + T1 = LDW(&(W[0])); + T2 = LDW(&(W[TWVL * 2])); + T3 = VZMULJ(T1, T2); + Ti = VZMUL(T1, T2); + T6 = LDW(&(W[TWVL * 4])); + T7 = VZMULJ(T3, T6); + TA = VZMULJ(Ti, T6); + Tb = VZMULJ(T1, T6); + To = VZMULJ(T2, T6); + { + V TD, TQ, Tn, Tt, Tx, TM, TN, TS, Ta, Tg, Tw, TJ, TK, TR, Tz; + V TC, TB; + Tz = LD(&(x[0]), ms, &(x[0])); + TB = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TC = VZMUL(TA, TB); + TD = VSUB(Tz, TC); + TQ = VADD(Tz, TC); + { + V Tk, Ts, Tm, Tq; + { + V Tj, Tr, Tl, Tp; + Tj = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tk = VZMUL(Ti, Tj); + Tr = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ts = VZMUL(T1, Tr); + Tl = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tm = VZMUL(T6, Tl); + Tp = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tq = VZMUL(To, Tp); + } + Tn = VSUB(Tk, Tm); + Tt = VSUB(Tq, Ts); + Tx = VADD(Tn, Tt); + TM = VADD(Tk, Tm); + TN = VADD(Tq, Ts); + TS = VADD(TM, TN); + } + { + V T5, Tf, T9, Td; + { + V T4, Te, T8, Tc; + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = VZMUL(T3, T4); + Te = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tf = VZMUL(T2, Te); + T8 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T9 = VZMUL(T7, T8); + Tc = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Td = VZMUL(Tb, Tc); + } + Ta = VSUB(T5, T9); + Tg = VSUB(Td, Tf); + Tw = VADD(Ta, Tg); + TJ = VADD(T5, T9); + TK = VADD(Td, Tf); + TR = VADD(TJ, TK); + } + { + V Ty, TE, TF, Tv, TI, Th, Tu, TH, TG; + Ty = VMUL(LDK(KP559016994), VSUB(Tw, Tx)); + TE = VADD(Tw, Tx); + TF = VFNMS(LDK(KP250000000), TE, TD); + Th = VSUB(Ta, Tg); + Tu = VSUB(Tn, Tt); + Tv = VBYI(VFMA(LDK(KP951056516), Th, VMUL(LDK(KP587785252), Tu))); + TI = VBYI(VFNMS(LDK(KP951056516), Tu, VMUL(LDK(KP587785252), Th))); + ST(&(x[WS(rs, 5)]), VADD(TD, TE), ms, &(x[WS(rs, 1)])); + TH = VSUB(TF, Ty); + ST(&(x[WS(rs, 3)]), VSUB(TH, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(TI, TH), ms, &(x[WS(rs, 1)])); + TG = VADD(Ty, TF); + ST(&(x[WS(rs, 1)]), VADD(Tv, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(TG, Tv), ms, &(x[WS(rs, 1)])); + } + { + V TV, TT, TU, TP, TY, TL, TO, TX, TW; + TV = VMUL(LDK(KP559016994), VSUB(TR, TS)); + TT = VADD(TR, TS); + TU = VFNMS(LDK(KP250000000), TT, TQ); + TL = VSUB(TJ, TK); + TO = VSUB(TM, TN); + TP = VBYI(VFNMS(LDK(KP951056516), TO, VMUL(LDK(KP587785252), TL))); + TY = VBYI(VFMA(LDK(KP951056516), TL, VMUL(LDK(KP587785252), TO))); + ST(&(x[0]), VADD(TQ, TT), ms, &(x[0])); + TX = VADD(TV, TU); + ST(&(x[WS(rs, 4)]), VSUB(TX, TY), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(TY, TX), ms, &(x[0])); + TW = VSUB(TU, TV); + ST(&(x[WS(rs, 2)]), VADD(TP, TW), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TW, TP), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t3bv_10"), twinstr, &GENUS, {51, 36, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_10) (planner *p) { + X(kdft_dit_register) (p, t3bv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_16.c new file mode 100644 index 000000000..97448e97b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_16.c @@ -0,0 +1,440 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:06 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 16 -name t3bv_16 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 98 FP additions, 86 FP multiplications, + * (or, 64 additions, 52 multiplications, 34 fused multiply/add), + * 51 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(16, rs)) { + V T2, T8, T9, Tx, Tu, TR, T3, T4, TN, TU, Tc, Tm, Ty, TE, Tp; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T2, T8); + Tx = VZMULJ(T2, T8); + Tu = LDW(&(W[TWVL * 6])); + TR = VZMULJ(T2, Tu); + T3 = LDW(&(W[TWVL * 4])); + T4 = VZMULJ(T2, T3); + TN = VZMUL(T2, T3); + TU = VZMULJ(T8, T3); + Tc = VZMUL(T8, T3); + Tm = VZMULJ(T9, T3); + Ty = VZMULJ(Tx, T3); + TE = VZMUL(Tx, T3); + Tp = VZMUL(T9, T3); + { + V T7, T1b, Tf, T1o, TQ, TX, T1e, T1p, Tl, Ts, Tt, T1i, T1r, TB, TH; + V TI, T1l, T1s, T1, T6, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + T7 = VADD(T1, T6); + T1b = VSUB(T1, T6); + { + V Tb, Te, Ta, Td; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = VZMUL(T9, Ta); + Td = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Te = VZMUL(Tc, Td); + Tf = VADD(Tb, Te); + T1o = VSUB(Tb, Te); + } + { + V TM, TW, TP, TT, T1c, T1d; + { + V TL, TV, TO, TS; + TL = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TM = VZMUL(Tx, TL); + TV = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TW = VZMUL(TU, TV); + TO = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TP = VZMUL(TN, TO); + TS = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TT = VZMUL(TR, TS); + } + TQ = VADD(TM, TP); + TX = VADD(TT, TW); + T1c = VSUB(TM, TP); + T1d = VSUB(TT, TW); + T1e = VADD(T1c, T1d); + T1p = VSUB(T1c, T1d); + } + { + V Ti, Tr, Tk, To, T1g, T1h; + { + V Th, Tq, Tj, Tn; + Th = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ti = VZMUL(T2, Th); + Tq = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tr = VZMUL(Tp, Tq); + Tj = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tk = VZMUL(T3, Tj); + Tn = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + To = VZMUL(Tm, Tn); + } + Tl = VADD(Ti, Tk); + Ts = VADD(To, Tr); + Tt = VSUB(Tl, Ts); + T1g = VSUB(Ti, Tk); + T1h = VSUB(To, Tr); + T1i = VFNMS(LDK(KP414213562), T1h, T1g); + T1r = VFMA(LDK(KP414213562), T1g, T1h); + } + { + V Tw, TG, TA, TD, T1j, T1k; + { + V Tv, TF, Tz, TC; + Tv = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tw = VZMUL(Tu, Tv); + TF = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TG = VZMUL(TE, TF); + Tz = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TA = VZMUL(Ty, Tz); + TC = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TD = VZMUL(T8, TC); + } + TB = VADD(Tw, TA); + TH = VADD(TD, TG); + TI = VSUB(TB, TH); + T1j = VSUB(Tw, TA); + T1k = VSUB(TG, TD); + T1l = VFNMS(LDK(KP414213562), T1k, T1j); + T1s = VFMA(LDK(KP414213562), T1j, T1k); + } + { + V TK, T11, T10, T12; + { + V Tg, TJ, TY, TZ; + Tg = VSUB(T7, Tf); + TJ = VADD(Tt, TI); + TK = VFNMS(LDK(KP707106781), TJ, Tg); + T11 = VFMA(LDK(KP707106781), TJ, Tg); + TY = VSUB(TQ, TX); + TZ = VSUB(Tt, TI); + T10 = VFNMS(LDK(KP707106781), TZ, TY); + T12 = VFMA(LDK(KP707106781), TZ, TY); + } + ST(&(x[WS(rs, 6)]), VFNMSI(T10, TK), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T12, T11), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFMAI(T10, TK), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T12, T11), ms, &(x[0])); + } + { + V T1z, T1D, T1C, T1E; + { + V T1x, T1y, T1A, T1B; + T1x = VFNMS(LDK(KP707106781), T1e, T1b); + T1y = VADD(T1r, T1s); + T1z = VFNMS(LDK(KP923879532), T1y, T1x); + T1D = VFMA(LDK(KP923879532), T1y, T1x); + T1A = VFNMS(LDK(KP707106781), T1p, T1o); + T1B = VSUB(T1i, T1l); + T1C = VFMA(LDK(KP923879532), T1B, T1A); + T1E = VFNMS(LDK(KP923879532), T1B, T1A); + } + ST(&(x[WS(rs, 5)]), VFMAI(T1C, T1z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T1E, T1D), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(T1C, T1z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(T1E, T1D), ms, &(x[WS(rs, 1)])); + } + { + V T15, T19, T18, T1a; + { + V T13, T14, T16, T17; + T13 = VADD(T7, Tf); + T14 = VADD(TQ, TX); + T15 = VSUB(T13, T14); + T19 = VADD(T13, T14); + T16 = VADD(Tl, Ts); + T17 = VADD(TB, TH); + T18 = VSUB(T16, T17); + T1a = VADD(T16, T17); + } + ST(&(x[WS(rs, 12)]), VFNMSI(T18, T15), ms, &(x[0])); + ST(&(x[0]), VADD(T19, T1a), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T18, T15), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(T19, T1a), ms, &(x[0])); + } + { + V T1n, T1v, T1u, T1w; + { + V T1f, T1m, T1q, T1t; + T1f = VFMA(LDK(KP707106781), T1e, T1b); + T1m = VADD(T1i, T1l); + T1n = VFNMS(LDK(KP923879532), T1m, T1f); + T1v = VFMA(LDK(KP923879532), T1m, T1f); + T1q = VFMA(LDK(KP707106781), T1p, T1o); + T1t = VSUB(T1r, T1s); + T1u = VFNMS(LDK(KP923879532), T1t, T1q); + T1w = VFMA(LDK(KP923879532), T1t, T1q); + } + ST(&(x[WS(rs, 7)]), VFNMSI(T1u, T1n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T1w, T1v), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(T1u, T1n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFNMSI(T1w, T1v), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t3bv_16"), twinstr, &GENUS, {64, 52, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_16) (planner *p) { + X(kdft_dit_register) (p, t3bv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 16 -name t3bv_16 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 98 FP additions, 64 FP multiplications, + * (or, 94 additions, 60 multiplications, 4 fused multiply/add), + * 51 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(16, rs)) { + V T1, T8, T9, Tl, Ti, TE, T4, Ta, TO, TV, Td, Tm, TA, TH, Ts; + T1 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T1, T8); + Tl = VZMULJ(T1, T8); + Ti = LDW(&(W[TWVL * 6])); + TE = VZMULJ(T1, Ti); + T4 = LDW(&(W[TWVL * 4])); + Ta = VZMULJ(T9, T4); + TO = VZMUL(T8, T4); + TV = VZMULJ(T1, T4); + Td = VZMUL(T9, T4); + Tm = VZMULJ(Tl, T4); + TA = VZMUL(T1, T4); + TH = VZMULJ(T8, T4); + Ts = VZMUL(Tl, T4); + { + V TY, T1q, TR, T1r, T1m, T1n, TL, TZ, T1f, T1g, T1h, Th, T11, T1i, T1j; + V T1k, Tw, T12, TU, TX, TW; + TU = LD(&(x[0]), ms, &(x[0])); + TW = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + TX = VZMUL(TV, TW); + TY = VSUB(TU, TX); + T1q = VADD(TU, TX); + { + V TN, TQ, TM, TP; + TM = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TN = VZMUL(T9, TM); + TP = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TQ = VZMUL(TO, TP); + TR = VSUB(TN, TQ); + T1r = VADD(TN, TQ); + } + { + V Tz, TJ, TC, TG, TD, TK; + { + V Ty, TI, TB, TF; + Ty = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tz = VZMUL(Tl, Ty); + TI = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TJ = VZMUL(TH, TI); + TB = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TC = VZMUL(TA, TB); + TF = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TG = VZMUL(TE, TF); + } + T1m = VADD(Tz, TC); + T1n = VADD(TG, TJ); + TD = VSUB(Tz, TC); + TK = VSUB(TG, TJ); + TL = VMUL(LDK(KP707106781), VSUB(TD, TK)); + TZ = VMUL(LDK(KP707106781), VADD(TD, TK)); + } + { + V T3, Tf, T6, Tc, T7, Tg; + { + V T2, Te, T5, Tb; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = VZMUL(T1, T2); + Te = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tf = VZMUL(Td, Te); + T5 = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T6 = VZMUL(T4, T5); + Tb = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tc = VZMUL(Ta, Tb); + } + T1f = VADD(T3, T6); + T1g = VADD(Tc, Tf); + T1h = VSUB(T1f, T1g); + T7 = VSUB(T3, T6); + Tg = VSUB(Tc, Tf); + Th = VFNMS(LDK(KP382683432), Tg, VMUL(LDK(KP923879532), T7)); + T11 = VFMA(LDK(KP382683432), T7, VMUL(LDK(KP923879532), Tg)); + } + { + V Tk, Tu, To, Tr, Tp, Tv; + { + V Tj, Tt, Tn, Tq; + Tj = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tk = VZMUL(Ti, Tj); + Tt = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tu = VZMUL(Ts, Tt); + Tn = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + To = VZMUL(Tm, Tn); + Tq = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tr = VZMUL(T8, Tq); + } + T1i = VADD(Tk, To); + T1j = VADD(Tr, Tu); + T1k = VSUB(T1i, T1j); + Tp = VSUB(Tk, To); + Tv = VSUB(Tr, Tu); + Tw = VFMA(LDK(KP923879532), Tp, VMUL(LDK(KP382683432), Tv)); + T12 = VFNMS(LDK(KP382683432), Tp, VMUL(LDK(KP923879532), Tv)); + } + { + V T1p, T1v, T1u, T1w; + { + V T1l, T1o, T1s, T1t; + T1l = VMUL(LDK(KP707106781), VSUB(T1h, T1k)); + T1o = VSUB(T1m, T1n); + T1p = VBYI(VSUB(T1l, T1o)); + T1v = VBYI(VADD(T1o, T1l)); + T1s = VSUB(T1q, T1r); + T1t = VMUL(LDK(KP707106781), VADD(T1h, T1k)); + T1u = VSUB(T1s, T1t); + T1w = VADD(T1s, T1t); + } + ST(&(x[WS(rs, 6)]), VADD(T1p, T1u), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T1w, T1v), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(T1u, T1p), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1v, T1w), ms, &(x[0])); + } + { + V T1z, T1D, T1C, T1E; + { + V T1x, T1y, T1A, T1B; + T1x = VADD(T1q, T1r); + T1y = VADD(T1m, T1n); + T1z = VSUB(T1x, T1y); + T1D = VADD(T1x, T1y); + T1A = VADD(T1f, T1g); + T1B = VADD(T1i, T1j); + T1C = VBYI(VSUB(T1A, T1B)); + T1E = VADD(T1A, T1B); + } + ST(&(x[WS(rs, 12)]), VSUB(T1z, T1C), ms, &(x[0])); + ST(&(x[0]), VADD(T1D, T1E), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1z, T1C), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(T1D, T1E), ms, &(x[0])); + } + { + V TT, T15, T14, T16; + { + V Tx, TS, T10, T13; + Tx = VSUB(Th, Tw); + TS = VSUB(TL, TR); + TT = VBYI(VSUB(Tx, TS)); + T15 = VBYI(VADD(TS, Tx)); + T10 = VSUB(TY, TZ); + T13 = VSUB(T11, T12); + T14 = VSUB(T10, T13); + T16 = VADD(T10, T13); + } + ST(&(x[WS(rs, 5)]), VADD(TT, T14), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T16, T15), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(T14, TT), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T15, T16), ms, &(x[WS(rs, 1)])); + } + { + V T19, T1d, T1c, T1e; + { + V T17, T18, T1a, T1b; + T17 = VADD(TY, TZ); + T18 = VADD(Th, Tw); + T19 = VADD(T17, T18); + T1d = VSUB(T17, T18); + T1a = VADD(TR, TL); + T1b = VADD(T11, T12); + T1c = VBYI(VADD(T1a, T1b)); + T1e = VBYI(VSUB(T1b, T1a)); + } + ST(&(x[WS(rs, 15)]), VSUB(T19, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T1d, T1e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T19, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(T1d, T1e), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t3bv_16"), twinstr, &GENUS, {94, 60, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_16) (planner *p) { + X(kdft_dit_register) (p, t3bv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_20.c new file mode 100644 index 000000000..11541ef91 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_20.c @@ -0,0 +1,540 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 20 -name t3bv_20 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 138 FP additions, 118 FP multiplications, + * (or, 92 additions, 72 multiplications, 46 fused multiply/add), + * 73 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(20, rs)) { + V T2, T8, T9, TA, T3, Tc, T4, TV, T14, Tl, Tq, Tx, TQ, Td, Te; + V T1d, Ti, Tt, T11; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T2, T8); + TA = VZMULJ(T2, T8); + T3 = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(T9, T3); + T4 = VZMUL(T2, T3); + TV = VZMUL(T9, T3); + T14 = VZMULJ(TA, T3); + Tl = VZMULJ(T8, T3); + Tq = VZMULJ(T2, T3); + Tx = VZMUL(T8, T3); + TQ = VZMUL(TA, T3); + Td = LDW(&(W[TWVL * 6])); + Te = VZMULJ(Tc, Td); + T1d = VZMULJ(T9, Td); + Ti = VZMULJ(T8, Td); + Tt = VZMULJ(T2, Td); + T11 = VZMULJ(TA, Td); + { + V T7, T1g, T1F, T23, TU, T1n, T1o, T18, Tp, TE, TF, T27, T28, T29, T1P; + V T1S, T1T, T1h, T1i, T1j, T24, T25, T26, T1I, T1L, T1M, T1B, T1C; + { + V T1, T1f, T6, T1c, T1e, T5, T1b, T1D, T1E; + T1 = LD(&(x[0]), ms, &(x[0])); + T1e = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1f = VZMUL(T1d, T1e); + T5 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + T1b = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1c = VZMUL(Tc, T1b); + T7 = VSUB(T1, T6); + T1g = VSUB(T1c, T1f); + T1D = VADD(T1, T6); + T1E = VADD(T1c, T1f); + T1F = VSUB(T1D, T1E); + T23 = VADD(T1D, T1E); + } + { + V Th, T1G, T10, T1O, T17, T1R, To, T1J, Tw, T1N, TN, T1H, TT, T1K, TD; + V T1Q; + { + V Tb, Tg, Ta, Tf; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = VZMUL(T9, Ta); + Tf = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tg = VZMUL(Te, Tf); + Th = VSUB(Tb, Tg); + T1G = VADD(Tb, Tg); + } + { + V TX, TZ, TW, TY; + TW = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TX = VZMUL(TV, TW); + TY = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TZ = VZMUL(T8, TY); + T10 = VSUB(TX, TZ); + T1O = VADD(TX, TZ); + } + { + V T13, T16, T12, T15; + T12 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T13 = VZMUL(T11, T12); + T15 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T16 = VZMUL(T14, T15); + T17 = VSUB(T13, T16); + T1R = VADD(T13, T16); + } + { + V Tk, Tn, Tj, Tm; + Tj = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tk = VZMUL(Ti, Tj); + Tm = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tn = VZMUL(Tl, Tm); + To = VSUB(Tk, Tn); + T1J = VADD(Tk, Tn); + } + { + V Ts, Tv, Tr, Tu; + Tr = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Ts = VZMUL(Tq, Tr); + Tu = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tv = VZMUL(Tt, Tu); + Tw = VSUB(Ts, Tv); + T1N = VADD(Ts, Tv); + } + { + V TK, TM, TJ, TL; + TJ = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TK = VZMUL(T3, TJ); + TL = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TM = VZMUL(Td, TL); + TN = VSUB(TK, TM); + T1H = VADD(TK, TM); + } + { + V TP, TS, TO, TR; + TO = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TP = VZMUL(T2, TO); + TR = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TS = VZMUL(TQ, TR); + TT = VSUB(TP, TS); + T1K = VADD(TP, TS); + } + { + V Tz, TC, Ty, TB; + Ty = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tz = VZMUL(Tx, Ty); + TB = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TC = VZMUL(TA, TB); + TD = VSUB(Tz, TC); + T1Q = VADD(Tz, TC); + } + TU = VSUB(TN, TT); + T1n = VSUB(Th, To); + T1o = VSUB(Tw, TD); + T18 = VSUB(T10, T17); + Tp = VADD(Th, To); + TE = VADD(Tw, TD); + TF = VADD(Tp, TE); + T27 = VADD(T1N, T1O); + T28 = VADD(T1Q, T1R); + T29 = VADD(T27, T28); + T1P = VSUB(T1N, T1O); + T1S = VSUB(T1Q, T1R); + T1T = VADD(T1P, T1S); + T1h = VADD(TN, TT); + T1i = VADD(T10, T17); + T1j = VADD(T1h, T1i); + T24 = VADD(T1G, T1H); + T25 = VADD(T1J, T1K); + T26 = VADD(T24, T25); + T1I = VSUB(T1G, T1H); + T1L = VSUB(T1J, T1K); + T1M = VADD(T1I, T1L); + } + T1B = VADD(T7, TF); + T1C = VADD(T1g, T1j); + ST(&(x[WS(rs, 15)]), VFNMSI(T1C, T1B), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(T1C, T1B), ms, &(x[WS(rs, 1)])); + { + V T2c, T2a, T2b, T2g, T2i, T2e, T2f, T2h, T2d; + T2c = VSUB(T26, T29); + T2a = VADD(T26, T29); + T2b = VFNMS(LDK(KP250000000), T2a, T23); + T2e = VSUB(T24, T25); + T2f = VSUB(T27, T28); + T2g = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T2f, T2e)); + T2i = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T2e, T2f)); + ST(&(x[0]), VADD(T23, T2a), ms, &(x[0])); + T2h = VFNMS(LDK(KP559016994), T2c, T2b); + ST(&(x[WS(rs, 8)]), VFMAI(T2i, T2h), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFNMSI(T2i, T2h), ms, &(x[0])); + T2d = VFMA(LDK(KP559016994), T2c, T2b); + ST(&(x[WS(rs, 4)]), VFNMSI(T2g, T2d), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFMAI(T2g, T2d), ms, &(x[0])); + } + { + V T1W, T1U, T1V, T20, T22, T1Y, T1Z, T21, T1X; + T1W = VSUB(T1M, T1T); + T1U = VADD(T1M, T1T); + T1V = VFNMS(LDK(KP250000000), T1U, T1F); + T1Y = VSUB(T1P, T1S); + T1Z = VSUB(T1I, T1L); + T20 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1Z, T1Y)); + T22 = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1Y, T1Z)); + ST(&(x[WS(rs, 10)]), VADD(T1F, T1U), ms, &(x[0])); + T21 = VFMA(LDK(KP559016994), T1W, T1V); + ST(&(x[WS(rs, 6)]), VFMAI(T22, T21), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T22, T21), ms, &(x[0])); + T1X = VFNMS(LDK(KP559016994), T1W, T1V); + ST(&(x[WS(rs, 2)]), VFNMSI(T20, T1X), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T20, T1X), ms, &(x[0])); + } + { + V T19, T1p, T1x, T1u, T1m, T1w, TI, T1t; + T19 = VFMA(LDK(KP618033988), T18, TU); + T1p = VFMA(LDK(KP618033988), T1o, T1n); + T1x = VFNMS(LDK(KP618033988), T1n, T1o); + T1u = VFNMS(LDK(KP618033988), TU, T18); + { + V T1k, T1l, TG, TH; + T1k = VFNMS(LDK(KP250000000), T1j, T1g); + T1l = VSUB(T1h, T1i); + T1m = VFMA(LDK(KP559016994), T1l, T1k); + T1w = VFNMS(LDK(KP559016994), T1l, T1k); + TG = VFNMS(LDK(KP250000000), TF, T7); + TH = VSUB(Tp, TE); + TI = VFMA(LDK(KP559016994), TH, TG); + T1t = VFNMS(LDK(KP559016994), TH, TG); + } + { + V T1a, T1q, T1z, T1A; + T1a = VFNMS(LDK(KP951056516), T19, TI); + T1q = VFMA(LDK(KP951056516), T1p, T1m); + ST(&(x[WS(rs, 19)]), VFNMSI(T1q, T1a), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T1q, T1a), ms, &(x[WS(rs, 1)])); + T1z = VFNMS(LDK(KP951056516), T1u, T1t); + T1A = VFMA(LDK(KP951056516), T1x, T1w); + ST(&(x[WS(rs, 7)]), VFNMSI(T1A, T1z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T1A, T1z), ms, &(x[WS(rs, 1)])); + } + { + V T1r, T1s, T1v, T1y; + T1r = VFMA(LDK(KP951056516), T19, TI); + T1s = VFNMS(LDK(KP951056516), T1p, T1m); + ST(&(x[WS(rs, 11)]), VFNMSI(T1s, T1r), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(T1s, T1r), ms, &(x[WS(rs, 1)])); + T1v = VFMA(LDK(KP951056516), T1u, T1t); + T1y = VFNMS(LDK(KP951056516), T1x, T1w); + ST(&(x[WS(rs, 3)]), VFNMSI(T1y, T1v), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VFMAI(T1y, T1v), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t3bv_20"), twinstr, &GENUS, {92, 72, 46, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_20) (planner *p) { + X(kdft_dit_register) (p, t3bv_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 20 -name t3bv_20 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 138 FP additions, 92 FP multiplications, + * (or, 126 additions, 80 multiplications, 12 fused multiply/add), + * 73 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(20, rs)) { + V T2, T8, T9, TA, T3, Tc, T4, TV, T14, Tl, Tq, Tx, TQ, Td, Te; + V T1g, Ti, Tt, T11; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T2, T8); + TA = VZMULJ(T2, T8); + T3 = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(T9, T3); + T4 = VZMUL(T2, T3); + TV = VZMUL(T9, T3); + T14 = VZMULJ(TA, T3); + Tl = VZMULJ(T8, T3); + Tq = VZMULJ(T2, T3); + Tx = VZMUL(T8, T3); + TQ = VZMUL(TA, T3); + Td = LDW(&(W[TWVL * 6])); + Te = VZMULJ(Tc, Td); + T1g = VZMULJ(T9, Td); + Ti = VZMULJ(T8, Td); + Tt = VZMULJ(T2, Td); + T11 = VZMULJ(TA, Td); + { + V T7, T1j, T1U, T2a, TU, T1n, T1o, T18, Tp, TE, TF, T26, T27, T28, T1M; + V T1P, T1W, T1b, T1c, T1k, T23, T24, T25, T1F, T1I, T1V, T1B, T1C; + { + V T1, T1i, T6, T1f, T1h, T5, T1e, T1S, T1T; + T1 = LD(&(x[0]), ms, &(x[0])); + T1h = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1i = VZMUL(T1g, T1h); + T5 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + T1e = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1f = VZMUL(Tc, T1e); + T7 = VSUB(T1, T6); + T1j = VSUB(T1f, T1i); + T1S = VADD(T1, T6); + T1T = VADD(T1f, T1i); + T1U = VSUB(T1S, T1T); + T2a = VADD(T1S, T1T); + } + { + V Th, T1D, T10, T1L, T17, T1O, To, T1G, Tw, T1K, TN, T1E, TT, T1H, TD; + V T1N; + { + V Tb, Tg, Ta, Tf; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = VZMUL(T9, Ta); + Tf = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tg = VZMUL(Te, Tf); + Th = VSUB(Tb, Tg); + T1D = VADD(Tb, Tg); + } + { + V TX, TZ, TW, TY; + TW = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + TX = VZMUL(TV, TW); + TY = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TZ = VZMUL(T8, TY); + T10 = VSUB(TX, TZ); + T1L = VADD(TX, TZ); + } + { + V T13, T16, T12, T15; + T12 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T13 = VZMUL(T11, T12); + T15 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T16 = VZMUL(T14, T15); + T17 = VSUB(T13, T16); + T1O = VADD(T13, T16); + } + { + V Tk, Tn, Tj, Tm; + Tj = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tk = VZMUL(Ti, Tj); + Tm = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tn = VZMUL(Tl, Tm); + To = VSUB(Tk, Tn); + T1G = VADD(Tk, Tn); + } + { + V Ts, Tv, Tr, Tu; + Tr = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Ts = VZMUL(Tq, Tr); + Tu = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tv = VZMUL(Tt, Tu); + Tw = VSUB(Ts, Tv); + T1K = VADD(Ts, Tv); + } + { + V TK, TM, TJ, TL; + TJ = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TK = VZMUL(T3, TJ); + TL = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TM = VZMUL(Td, TL); + TN = VSUB(TK, TM); + T1E = VADD(TK, TM); + } + { + V TP, TS, TO, TR; + TO = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TP = VZMUL(T2, TO); + TR = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TS = VZMUL(TQ, TR); + TT = VSUB(TP, TS); + T1H = VADD(TP, TS); + } + { + V Tz, TC, Ty, TB; + Ty = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tz = VZMUL(Tx, Ty); + TB = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TC = VZMUL(TA, TB); + TD = VSUB(Tz, TC); + T1N = VADD(Tz, TC); + } + TU = VSUB(TN, TT); + T1n = VSUB(Th, To); + T1o = VSUB(Tw, TD); + T18 = VSUB(T10, T17); + Tp = VADD(Th, To); + TE = VADD(Tw, TD); + TF = VADD(Tp, TE); + T26 = VADD(T1K, T1L); + T27 = VADD(T1N, T1O); + T28 = VADD(T26, T27); + T1M = VSUB(T1K, T1L); + T1P = VSUB(T1N, T1O); + T1W = VADD(T1M, T1P); + T1b = VADD(TN, TT); + T1c = VADD(T10, T17); + T1k = VADD(T1b, T1c); + T23 = VADD(T1D, T1E); + T24 = VADD(T1G, T1H); + T25 = VADD(T23, T24); + T1F = VSUB(T1D, T1E); + T1I = VSUB(T1G, T1H); + T1V = VADD(T1F, T1I); + } + T1B = VADD(T7, TF); + T1C = VBYI(VADD(T1j, T1k)); + ST(&(x[WS(rs, 15)]), VSUB(T1B, T1C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1B, T1C), ms, &(x[WS(rs, 1)])); + { + V T29, T2b, T2c, T2g, T2i, T2e, T2f, T2h, T2d; + T29 = VMUL(LDK(KP559016994), VSUB(T25, T28)); + T2b = VADD(T25, T28); + T2c = VFNMS(LDK(KP250000000), T2b, T2a); + T2e = VSUB(T23, T24); + T2f = VSUB(T26, T27); + T2g = VBYI(VFMA(LDK(KP951056516), T2e, VMUL(LDK(KP587785252), T2f))); + T2i = VBYI(VFNMS(LDK(KP951056516), T2f, VMUL(LDK(KP587785252), T2e))); + ST(&(x[0]), VADD(T2a, T2b), ms, &(x[0])); + T2h = VSUB(T2c, T29); + ST(&(x[WS(rs, 8)]), VSUB(T2h, T2i), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T2i, T2h), ms, &(x[0])); + T2d = VADD(T29, T2c); + ST(&(x[WS(rs, 4)]), VSUB(T2d, T2g), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VADD(T2g, T2d), ms, &(x[0])); + } + { + V T1Z, T1X, T1Y, T1R, T21, T1J, T1Q, T22, T20; + T1Z = VMUL(LDK(KP559016994), VSUB(T1V, T1W)); + T1X = VADD(T1V, T1W); + T1Y = VFNMS(LDK(KP250000000), T1X, T1U); + T1J = VSUB(T1F, T1I); + T1Q = VSUB(T1M, T1P); + T1R = VBYI(VFNMS(LDK(KP951056516), T1Q, VMUL(LDK(KP587785252), T1J))); + T21 = VBYI(VFMA(LDK(KP951056516), T1J, VMUL(LDK(KP587785252), T1Q))); + ST(&(x[WS(rs, 10)]), VADD(T1U, T1X), ms, &(x[0])); + T22 = VADD(T1Z, T1Y); + ST(&(x[WS(rs, 6)]), VADD(T21, T22), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T22, T21), ms, &(x[0])); + T20 = VSUB(T1Y, T1Z); + ST(&(x[WS(rs, 2)]), VADD(T1R, T20), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VSUB(T20, T1R), ms, &(x[0])); + } + { + V T19, T1p, T1w, T1u, T1m, T1x, TI, T1t; + T19 = VFNMS(LDK(KP951056516), T18, VMUL(LDK(KP587785252), TU)); + T1p = VFNMS(LDK(KP951056516), T1o, VMUL(LDK(KP587785252), T1n)); + T1w = VFMA(LDK(KP951056516), T1n, VMUL(LDK(KP587785252), T1o)); + T1u = VFMA(LDK(KP951056516), TU, VMUL(LDK(KP587785252), T18)); + { + V T1d, T1l, TG, TH; + T1d = VMUL(LDK(KP559016994), VSUB(T1b, T1c)); + T1l = VFNMS(LDK(KP250000000), T1k, T1j); + T1m = VSUB(T1d, T1l); + T1x = VADD(T1d, T1l); + TG = VFNMS(LDK(KP250000000), TF, T7); + TH = VMUL(LDK(KP559016994), VSUB(Tp, TE)); + TI = VSUB(TG, TH); + T1t = VADD(TH, TG); + } + { + V T1a, T1q, T1z, T1A; + T1a = VSUB(TI, T19); + T1q = VBYI(VSUB(T1m, T1p)); + ST(&(x[WS(rs, 17)]), VSUB(T1a, T1q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T1a, T1q), ms, &(x[WS(rs, 1)])); + T1z = VADD(T1t, T1u); + T1A = VBYI(VSUB(T1x, T1w)); + ST(&(x[WS(rs, 11)]), VSUB(T1z, T1A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T1z, T1A), ms, &(x[WS(rs, 1)])); + } + { + V T1r, T1s, T1v, T1y; + T1r = VADD(TI, T19); + T1s = VBYI(VADD(T1p, T1m)); + ST(&(x[WS(rs, 13)]), VSUB(T1r, T1s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T1r, T1s), ms, &(x[WS(rs, 1)])); + T1v = VSUB(T1t, T1u); + T1y = VBYI(VADD(T1w, T1x)); + ST(&(x[WS(rs, 19)]), VSUB(T1v, T1y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1v, T1y), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t3bv_20"), twinstr, &GENUS, {126, 80, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_20) (planner *p) { + X(kdft_dit_register) (p, t3bv_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_25.c new file mode 100644 index 000000000..8a95e7a18 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_25.c @@ -0,0 +1,960 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 25 -name t3bv_25 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 268 FP additions, 281 FP multiplications, + * (or, 87 additions, 100 multiplications, 181 fused multiply/add), + * 171 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(25, rs)) { + V T2, T5, T3, T4, TC, Te, Tr, Ty, Tz, T1I, T1l, T6, T1e, T9, Ta; + V Tu, T1L, Th, T1E, T1o, TX, TD, T1h, TU; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMUL(T2, T3); + TC = VZMULJ(T2, T5); + Te = VZMUL(T2, T5); + Tr = VZMULJ(T3, T5); + Ty = VZMULJ(T2, T3); + Tz = VZMUL(Ty, T5); + T1I = VZMUL(T4, T5); + T1l = VZMUL(T3, T5); + T6 = VZMULJ(T4, T5); + T1e = VZMULJ(Ty, T5); + T9 = LDW(&(W[TWVL * 6])); + Ta = VZMULJ(T4, T9); + Tu = VZMULJ(T3, T9); + T1L = VZMULJ(Tr, T9); + Th = VZMULJ(T5, T9); + T1E = VZMULJ(T2, T9); + T1o = VZMULJ(T1e, T9); + TX = VZMULJ(Te, T9); + TD = VZMULJ(TC, T9); + T1h = VZMULJ(Ty, T9); + TU = VZMULJ(T6, T9); + { + V T1, Tn, Tl, Tm, T2c, T3l, T4e, T1V, T38, T1S, T39, T1W, T2v, T3z, T3f; + V T3a, T2D, T4a, TN, T32, TK, T31, TO, T2y, T3C, T3i, T33, T2G, T4b, T11; + V T2Z, T19, T2Y, T1a, T2z, T3D, T3h, T30, T2H, T4d, T1y, T35, T1v, T36, T1z; + V T2w, T3A, T3e, T37, T2E; + { + V Tg, Tj, Tk, T8, Tc, Td, T2a, T2b; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V Tf, Ti, T7, Tb; + Tf = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tg = VZMUL(Te, Tf); + Ti = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tj = VZMUL(Th, Ti); + Tk = VADD(Tg, Tj); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = VZMUL(T6, T7); + Tb = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tc = VZMUL(Ta, Tb); + Td = VADD(T8, Tc); + } + Tn = VSUB(Td, Tk); + Tl = VADD(Td, Tk); + Tm = VFNMS(LDK(KP250000000), Tl, T1); + T2a = VSUB(T8, Tc); + T2b = VSUB(Tg, Tj); + T2c = VFMA(LDK(KP618033988), T2b, T2a); + T3l = VFNMS(LDK(KP618033988), T2a, T2b); + } + { + V T1B, T1T, T1U, T1H, T1O, T1P, T1A, T1Q, T1R; + T1A = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1B = VZMUL(T3, T1A); + { + V T1D, T1N, T1G, T1K; + { + V T1C, T1M, T1F, T1J; + T1C = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1D = VZMUL(TC, T1C); + T1M = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1N = VZMUL(T1L, T1M); + T1F = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1G = VZMUL(T1E, T1F); + T1J = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1K = VZMUL(T1I, T1J); + } + T1T = VSUB(T1D, T1G); + T1U = VSUB(T1K, T1N); + T1H = VADD(T1D, T1G); + T1O = VADD(T1K, T1N); + T1P = VADD(T1H, T1O); + } + T4e = VADD(T1B, T1P); + T1V = VFMA(LDK(KP618033988), T1U, T1T); + T38 = VFNMS(LDK(KP618033988), T1T, T1U); + T1Q = VFNMS(LDK(KP250000000), T1P, T1B); + T1R = VSUB(T1O, T1H); + T1S = VFNMS(LDK(KP559016994), T1R, T1Q); + T39 = VFMA(LDK(KP559016994), T1R, T1Q); + T1W = VFNMS(LDK(KP893101515), T1V, T1S); + T2v = VFNMS(LDK(KP120146378), T1V, T1S); + T3z = VFMA(LDK(KP066152395), T39, T38); + T3f = VFNMS(LDK(KP786782374), T38, T39); + T3a = VFMA(LDK(KP869845200), T39, T38); + T2D = VFMA(LDK(KP132830569), T1S, T1V); + } + { + V Tq, TL, TM, Tx, TG, TH, Tp, TI, TJ; + Tp = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tq = VZMUL(T2, Tp); + { + V Tt, TF, Tw, TB; + { + V Ts, TE, Tv, TA; + Ts = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tt = VZMUL(Tr, Ts); + TE = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + TF = VZMUL(TD, TE); + Tv = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tw = VZMUL(Tu, Tv); + TA = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TB = VZMUL(Tz, TA); + } + TL = VSUB(Tt, Tw); + TM = VSUB(TF, TB); + Tx = VADD(Tt, Tw); + TG = VADD(TB, TF); + TH = VADD(Tx, TG); + } + T4a = VADD(Tq, TH); + TN = VFNMS(LDK(KP618033988), TM, TL); + T32 = VFMA(LDK(KP618033988), TL, TM); + TI = VFNMS(LDK(KP250000000), TH, Tq); + TJ = VSUB(Tx, TG); + TK = VFMA(LDK(KP559016994), TJ, TI); + T31 = VFNMS(LDK(KP559016994), TJ, TI); + TO = VFNMS(LDK(KP244189809), TN, TK); + T2y = VFMA(LDK(KP667278218), TK, TN); + T3C = VFNMS(LDK(KP522847744), T32, T31); + T3i = VFNMS(LDK(KP987388751), T31, T32); + T33 = VFMA(LDK(KP893101515), T32, T31); + T2G = VFNMS(LDK(KP603558818), TN, TK); + } + { + V T13, TT, T10, T14, T15, T16, T12, T17, T18; + T12 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T13 = VZMUL(T4, T12); + { + V TQ, TZ, TS, TW; + { + V TP, TY, TR, TV; + TP = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TQ = VZMUL(T9, TP); + TY = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TZ = VZMUL(TX, TY); + TR = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TS = VZMUL(T5, TR); + TV = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TW = VZMUL(TU, TV); + } + TT = VSUB(TQ, TS); + T10 = VSUB(TW, TZ); + T14 = VADD(TS, TQ); + T15 = VADD(TZ, TW); + T16 = VADD(T14, T15); + } + T4b = VADD(T13, T16); + T11 = VFMA(LDK(KP618033988), T10, TT); + T2Z = VFNMS(LDK(KP618033988), TT, T10); + T17 = VFMS(LDK(KP250000000), T16, T13); + T18 = VSUB(T14, T15); + T19 = VFNMS(LDK(KP559016994), T18, T17); + T2Y = VFMA(LDK(KP559016994), T18, T17); + T1a = VFNMS(LDK(KP667278218), T19, T11); + T2z = VFMA(LDK(KP869845200), T19, T11); + T3D = VFNMS(LDK(KP494780565), T2Y, T2Z); + T3h = VFNMS(LDK(KP132830569), T2Y, T2Z); + T30 = VFMA(LDK(KP120146378), T2Z, T2Y); + T2H = VFNMS(LDK(KP786782374), T11, T19); + } + { + V T1d, T1w, T1x, T1k, T1r, T1s, T1c, T1t, T1u; + T1c = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T1d = VZMUL(Ty, T1c); + { + V T1g, T1q, T1j, T1n; + { + V T1f, T1p, T1i, T1m; + T1f = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1g = VZMUL(T1e, T1f); + T1p = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1q = VZMUL(T1o, T1p); + T1i = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1j = VZMUL(T1h, T1i); + T1m = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T1n = VZMUL(T1l, T1m); + } + T1w = VSUB(T1g, T1j); + T1x = VSUB(T1q, T1n); + T1k = VADD(T1g, T1j); + T1r = VADD(T1n, T1q); + T1s = VADD(T1k, T1r); + } + T4d = VADD(T1d, T1s); + T1y = VFNMS(LDK(KP618033988), T1x, T1w); + T35 = VFMA(LDK(KP618033988), T1w, T1x); + T1t = VFNMS(LDK(KP250000000), T1s, T1d); + T1u = VSUB(T1r, T1k); + T1v = VFNMS(LDK(KP559016994), T1u, T1t); + T36 = VFMA(LDK(KP559016994), T1u, T1t); + T1z = VFNMS(LDK(KP522847744), T1y, T1v); + T2w = VFNMS(LDK(KP494780565), T1v, T1y); + T3A = VFNMS(LDK(KP667278218), T36, T35); + T3e = VFNMS(LDK(KP059835404), T35, T36); + T37 = VFMA(LDK(KP066152395), T36, T35); + T2E = VFMA(LDK(KP447533225), T1y, T1v); + } + { + V T4m, T4o, T49, T4g, T4h, T4i, T4n, T4j; + { + V T4k, T4l, T4c, T4f; + T4k = VSUB(T4a, T4b); + T4l = VSUB(T4d, T4e); + T4m = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T4l, T4k)); + T4o = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T4k, T4l)); + T49 = VADD(T1, Tl); + T4c = VADD(T4a, T4b); + T4f = VADD(T4d, T4e); + T4g = VADD(T4c, T4f); + T4h = VFNMS(LDK(KP250000000), T4g, T49); + T4i = VSUB(T4c, T4f); + } + ST(&(x[0]), VADD(T4g, T49), ms, &(x[0])); + T4n = VFNMS(LDK(KP559016994), T4i, T4h); + ST(&(x[WS(rs, 10)]), VFNMSI(T4o, T4n), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VFMAI(T4o, T4n), ms, &(x[WS(rs, 1)])); + T4j = VFMA(LDK(KP559016994), T4i, T4h); + ST(&(x[WS(rs, 5)]), VFMAI(T4m, T4j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VFNMSI(T4m, T4j), ms, &(x[0])); + } + { + V T3n, T3t, T3Z, T46, T3k, T3w, T3c, T3q, T2X, T3R, T3F, T3Q, T3N, T43, T3P; + V T3T, T40, T3X, T3Y; + T3n = VFMA(LDK(KP734762448), T3i, T3h); + T3t = VFNMS(LDK(KP734762448), T33, T30); + T3X = VFMA(LDK(KP845997307), T3A, T3z); + T3Y = VFMA(LDK(KP982009705), T3D, T3C); + T3Z = VFMA(LDK(KP570584518), T3Y, T3X); + T46 = VFNMS(LDK(KP669429328), T3X, T3Y); + { + V T3g, T3j, T3v, T3u; + T3g = VFMA(LDK(KP772036680), T3f, T3e); + T3j = VFNMS(LDK(KP734762448), T3i, T3h); + T3u = VFMA(LDK(KP772036680), T3a, T37); + T3v = VFMA(LDK(KP522616830), T3j, T3u); + T3k = VFMA(LDK(KP945422727), T3j, T3g); + T3w = VFNMS(LDK(KP690983005), T3v, T3g); + } + { + V T3b, T34, T3p, T3o; + T3b = VFNMS(LDK(KP772036680), T3a, T37); + T34 = VFMA(LDK(KP734762448), T33, T30); + T3o = VFNMS(LDK(KP772036680), T3f, T3e); + T3p = VFNMS(LDK(KP522616830), T34, T3o); + T3c = VFMA(LDK(KP956723877), T3b, T34); + T3q = VFMA(LDK(KP763932022), T3p, T3b); + } + { + V T3M, T3S, T3J, T3K, T3L; + T2X = VFNMS(LDK(KP559016994), Tn, Tm); + T3K = VFMA(LDK(KP447533225), T2Z, T2Y); + T3L = VFMA(LDK(KP578046249), T31, T32); + T3M = VFNMS(LDK(KP921078979), T3L, T3K); + T3R = VFMA(LDK(KP921078979), T3L, T3K); + { + V T3B, T3E, T3H, T3I; + T3B = VFNMS(LDK(KP845997307), T3A, T3z); + T3E = VFNMS(LDK(KP982009705), T3D, T3C); + T3F = VFMA(LDK(KP923225144), T3E, T3B); + T3S = VFNMS(LDK(KP923225144), T3E, T3B); + T3H = VFNMS(LDK(KP059835404), T38, T39); + T3I = VFMA(LDK(KP603558818), T35, T36); + T3J = VFMA(LDK(KP845997307), T3I, T3H); + T3Q = VFNMS(LDK(KP845997307), T3I, T3H); + } + T3N = VFNMS(LDK(KP906616052), T3M, T3J); + T43 = VFNMS(LDK(KP904508497), T3S, T3Q); + T3P = VFNMS(LDK(KP237294955), T3F, T2X); + T3T = VFNMS(LDK(KP997675361), T3S, T3R); + T40 = VFMA(LDK(KP906616052), T3M, T3J); + } + { + V T3d, T3m, T3G, T3O; + T3d = VFMA(LDK(KP992114701), T3c, T2X); + T3m = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T3l, T3k)); + ST(&(x[WS(rs, 22)]), VFNMSI(T3m, T3d), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VFMAI(T3m, T3d), ms, &(x[WS(rs, 1)])); + T3G = VFMA(LDK(KP949179823), T3F, T2X); + T3O = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T3l, T3N)); + ST(&(x[WS(rs, 23)]), VFNMSI(T3O, T3G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VFMAI(T3O, T3G), ms, &(x[0])); + } + { + V T3s, T3y, T3r, T3x; + T3r = VFNMS(LDK(KP855719849), T3q, T3n); + T3s = VFMA(LDK(KP897376177), T3r, T2X); + T3x = VFMA(LDK(KP855719849), T3w, T3t); + T3y = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T3x, T3l)); + ST(&(x[WS(rs, 8)]), VFMAI(T3y, T3s), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VFNMSI(T3y, T3s), ms, &(x[WS(rs, 1)])); + } + { + V T3V, T45, T42, T48, T3U; + T3U = VFMA(LDK(KP560319534), T3T, T3Q); + T3V = VFNMS(LDK(KP949179823), T3U, T3P); + { + V T44, T3W, T47, T41; + T44 = VFNMS(LDK(KP681693190), T43, T3R); + T45 = VFNMS(LDK(KP860541664), T44, T3P); + T3W = VFMA(LDK(KP262346850), T3N, T3l); + T47 = VFNMS(LDK(KP669429328), T40, T46); + T41 = VFMA(LDK(KP618033988), T40, T3Z); + T42 = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T41, T3W)); + T48 = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T47, T3W)); + } + ST(&(x[WS(rs, 12)]), VFNMSI(T42, T3V), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T48, T45), ms, &(x[0])); + ST(&(x[WS(rs, 13)]), VFMAI(T42, T3V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(T48, T45), ms, &(x[WS(rs, 1)])); + } + } + { + V T2L, T2R, T2j, T2q, T2J, T2U, T2B, T2O, To, T26, T1Y, T22, T1Z, T2n, T27; + V T2f, T2k, T2h, T2i; + T2L = VFNMS(LDK(KP912575812), T2H, T2G); + T2R = VFNMS(LDK(KP912575812), T2z, T2y); + T2h = VFNMS(LDK(KP829049696), T1a, TO); + T2i = VFNMS(LDK(KP831864738), T1W, T1z); + T2j = VFMA(LDK(KP559154169), T2i, T2h); + T2q = VFNMS(LDK(KP683113946), T2h, T2i); + { + V T2F, T2I, T2T, T2S; + T2F = VFMA(LDK(KP958953096), T2E, T2D); + T2I = VFMA(LDK(KP912575812), T2H, T2G); + T2S = VFMA(LDK(KP867381224), T2w, T2v); + T2T = VFMA(LDK(KP447417479), T2I, T2S); + T2J = VFMA(LDK(KP894834959), T2I, T2F); + T2U = VFNMS(LDK(KP763932022), T2T, T2F); + } + { + V T2x, T2A, T2N, T2M; + T2x = VFNMS(LDK(KP867381224), T2w, T2v); + T2A = VFMA(LDK(KP912575812), T2z, T2y); + T2M = VFNMS(LDK(KP958953096), T2E, T2D); + T2N = VFMA(LDK(KP447417479), T2A, T2M); + T2B = VFNMS(LDK(KP809385824), T2A, T2x); + T2O = VFMA(LDK(KP690983005), T2N, T2x); + } + { + V T2e, T23, T2d, T24, T25; + To = VFMA(LDK(KP559016994), Tn, Tm); + T24 = VFMA(LDK(KP578046249), T1v, T1y); + T25 = VFMA(LDK(KP987388751), T1S, T1V); + T26 = VFNMS(LDK(KP831864738), T25, T24); + T2e = VFMA(LDK(KP831864738), T25, T24); + { + V T1b, T1X, T20, T21; + T1b = VFMA(LDK(KP829049696), T1a, TO); + T1X = VFMA(LDK(KP831864738), T1W, T1z); + T1Y = VFMA(LDK(KP904730450), T1X, T1b); + T23 = VFNMS(LDK(KP904730450), T1X, T1b); + T20 = VFMA(LDK(KP269969613), TK, TN); + T21 = VFMA(LDK(KP603558818), T11, T19); + T22 = VFMA(LDK(KP916574801), T21, T20); + T2d = VFNMS(LDK(KP916574801), T21, T20); + } + T1Z = VFNMS(LDK(KP242145790), T1Y, To); + T2n = VADD(T22, T23); + T27 = VFNMS(LDK(KP904730450), T26, T23); + T2f = VFMA(LDK(KP904730450), T2e, T2d); + T2k = VFNMS(LDK(KP904730450), T2e, T2d); + } + { + V T2t, T2u, T2C, T2K; + T2t = VFMA(LDK(KP968583161), T1Y, To); + T2u = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T2f, T2c)); + ST(&(x[WS(rs, 1)]), VFMAI(T2u, T2t), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VFNMSI(T2u, T2t), ms, &(x[0])); + T2C = VFNMS(LDK(KP992114701), T2B, To); + T2K = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2J, T2c)); + ST(&(x[WS(rs, 4)]), VFNMSI(T2K, T2C), ms, &(x[0])); + ST(&(x[WS(rs, 21)]), VFMAI(T2K, T2C), ms, &(x[WS(rs, 1)])); + } + { + V T2Q, T2W, T2P, T2V; + T2P = VFNMS(LDK(KP999544308), T2O, T2L); + T2Q = VFNMS(LDK(KP803003575), T2P, To); + T2V = VFNMS(LDK(KP999544308), T2U, T2R); + T2W = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T2V, T2c)); + ST(&(x[WS(rs, 9)]), VFNMSI(T2W, T2Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VFMAI(T2W, T2Q), ms, &(x[0])); + } + { + V T29, T2p, T2m, T2s, T28; + T28 = VFNMS(LDK(KP618033988), T27, T22); + T29 = VFNMS(LDK(KP876091699), T28, T1Z); + { + V T2o, T2g, T2r, T2l; + T2o = VFNMS(LDK(KP683113946), T2n, T26); + T2p = VFMA(LDK(KP792626838), T2o, T1Z); + T2g = VFNMS(LDK(KP242145790), T2f, T2c); + T2r = VFMA(LDK(KP617882369), T2k, T2q); + T2l = VFMA(LDK(KP559016994), T2k, T2j); + T2m = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T2l, T2g)); + T2s = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T2r, T2g)); + } + ST(&(x[WS(rs, 6)]), VFMAI(T2m, T29), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T2s, T2p), ms, &(x[0])); + ST(&(x[WS(rs, 19)]), VFNMSI(T2m, T29), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T2s, T2p), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t3bv_25"), twinstr, &GENUS, {87, 100, 181, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_25) (planner *p) { + X(kdft_dit_register) (p, t3bv_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 25 -name t3bv_25 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 268 FP additions, 228 FP multiplications, + * (or, 191 additions, 151 multiplications, 77 fused multiply/add), + * 124 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1, Td, T8, T9, TF, Te, Tu, TB, TC, T1s, T15, Tf, TY, T4, Ta; + V Tx, T1T, Tg, T1N, T1v, T18, TG, T1o, T11; + T1 = LDW(&(W[TWVL * 4])); + Td = LDW(&(W[TWVL * 2])); + T8 = LDW(&(W[0])); + T9 = VZMUL(T8, T1); + TF = VZMULJ(T8, T1); + Te = VZMUL(T8, Td); + Tu = VZMULJ(Td, T1); + TB = VZMULJ(T8, Td); + TC = VZMUL(TB, T1); + T1s = VZMUL(Te, T1); + T15 = VZMUL(Td, T1); + Tf = VZMULJ(Te, T1); + TY = VZMULJ(TB, T1); + T4 = LDW(&(W[TWVL * 6])); + Ta = VZMULJ(T9, T4); + Tx = VZMULJ(Td, T4); + T1T = VZMULJ(T1, T4); + Tg = VZMULJ(Tf, T4); + T1N = VZMULJ(Te, T4); + T1v = VZMULJ(Tu, T4); + T18 = VZMULJ(TY, T4); + TG = VZMULJ(TF, T4); + T1o = VZMULJ(T8, T4); + T11 = VZMULJ(TB, T4); + { + V T1Y, T1X, T2f, T2g, T1Z, T20, T2e, T39, T1H, T2T, T1E, T3C, T2S, Tk, T2G; + V Ts, T3z, T2F, TK, T2I, TS, T3y, T2J, T1k, T2Q, T1h, T3B, T2P; + { + V T1S, T1V, T1W, T1M, T1P, T1Q, T2d; + T1Y = LD(&(x[0]), ms, &(x[0])); + { + V T1R, T1U, T1L, T1O; + T1R = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T1S = VZMUL(T9, T1R); + T1U = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1V = VZMUL(T1T, T1U); + T1W = VADD(T1S, T1V); + T1L = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T1M = VZMUL(Tf, T1L); + T1O = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + T1P = VZMUL(T1N, T1O); + T1Q = VADD(T1M, T1P); + } + T1X = VMUL(LDK(KP559016994), VSUB(T1Q, T1W)); + T2f = VSUB(T1S, T1V); + T2g = VMUL(LDK(KP587785252), T2f); + T1Z = VADD(T1Q, T1W); + T20 = VFNMS(LDK(KP250000000), T1Z, T1Y); + T2d = VSUB(T1M, T1P); + T2e = VMUL(LDK(KP951056516), T2d); + T39 = VMUL(LDK(KP587785252), T2d); + } + { + V T1B, T1u, T1x, T1y, T1n, T1q, T1r, T1A; + T1A = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1B = VZMUL(Td, T1A); + { + V T1t, T1w, T1m, T1p; + T1t = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1u = VZMUL(T1s, T1t); + T1w = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1x = VZMUL(T1v, T1w); + T1y = VADD(T1u, T1x); + T1m = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1n = VZMUL(TF, T1m); + T1p = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1q = VZMUL(T1o, T1p); + T1r = VADD(T1n, T1q); + } + { + V T1F, T1G, T1z, T1C, T1D; + T1F = VSUB(T1n, T1q); + T1G = VSUB(T1u, T1x); + T1H = VFMA(LDK(KP475528258), T1F, VMUL(LDK(KP293892626), T1G)); + T2T = VFNMS(LDK(KP475528258), T1G, VMUL(LDK(KP293892626), T1F)); + T1z = VMUL(LDK(KP559016994), VSUB(T1r, T1y)); + T1C = VADD(T1r, T1y); + T1D = VFNMS(LDK(KP250000000), T1C, T1B); + T1E = VADD(T1z, T1D); + T3C = VADD(T1B, T1C); + T2S = VSUB(T1D, T1z); + } + } + { + V Tp, Tc, Ti, Tm, T3, T6, Tl, To; + To = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tp = VZMUL(Te, To); + { + V Tb, Th, T2, T5; + Tb = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tc = VZMUL(Ta, Tb); + Th = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + Ti = VZMUL(Tg, Th); + Tm = VADD(Tc, Ti); + T2 = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T3 = VZMUL(T1, T2); + T5 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + Tl = VADD(T3, T6); + } + { + V T7, Tj, Tn, Tq, Tr; + T7 = VSUB(T3, T6); + Tj = VSUB(Tc, Ti); + Tk = VFMA(LDK(KP475528258), T7, VMUL(LDK(KP293892626), Tj)); + T2G = VFNMS(LDK(KP475528258), Tj, VMUL(LDK(KP293892626), T7)); + Tn = VMUL(LDK(KP559016994), VSUB(Tl, Tm)); + Tq = VADD(Tl, Tm); + Tr = VFNMS(LDK(KP250000000), Tq, Tp); + Ts = VADD(Tn, Tr); + T3z = VADD(Tp, Tq); + T2F = VSUB(Tr, Tn); + } + } + { + V TP, TE, TI, TM, Tw, Tz, TL, TO; + TO = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TP = VZMUL(T8, TO); + { + V TD, TH, Tv, Ty; + TD = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TE = VZMUL(TC, TD); + TH = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + TI = VZMUL(TG, TH); + TM = VADD(TE, TI); + Tv = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tw = VZMUL(Tu, Tv); + Ty = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tz = VZMUL(Tx, Ty); + TL = VADD(Tw, Tz); + } + { + V TA, TJ, TN, TQ, TR; + TA = VSUB(Tw, Tz); + TJ = VSUB(TE, TI); + TK = VFMA(LDK(KP475528258), TA, VMUL(LDK(KP293892626), TJ)); + T2I = VFNMS(LDK(KP475528258), TJ, VMUL(LDK(KP293892626), TA)); + TN = VMUL(LDK(KP559016994), VSUB(TL, TM)); + TQ = VADD(TL, TM); + TR = VFNMS(LDK(KP250000000), TQ, TP); + TS = VADD(TN, TR); + T3y = VADD(TP, TQ); + T2J = VSUB(TR, TN); + } + } + { + V T1e, T17, T1a, T1b, T10, T13, T14, T1d; + T1d = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T1e = VZMUL(TB, T1d); + { + V T16, T19, TZ, T12; + T16 = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T17 = VZMUL(T15, T16); + T19 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1a = VZMUL(T18, T19); + T1b = VADD(T17, T1a); + TZ = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T10 = VZMUL(TY, TZ); + T12 = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T13 = VZMUL(T11, T12); + T14 = VADD(T10, T13); + } + { + V T1i, T1j, T1c, T1f, T1g; + T1i = VSUB(T10, T13); + T1j = VSUB(T17, T1a); + T1k = VFMA(LDK(KP475528258), T1i, VMUL(LDK(KP293892626), T1j)); + T2Q = VFNMS(LDK(KP475528258), T1j, VMUL(LDK(KP293892626), T1i)); + T1c = VMUL(LDK(KP559016994), VSUB(T14, T1b)); + T1f = VADD(T14, T1b); + T1g = VFNMS(LDK(KP250000000), T1f, T1e); + T1h = VADD(T1c, T1g); + T3B = VADD(T1e, T1f); + T2P = VSUB(T1g, T1c); + } + } + { + V T3E, T3M, T3I, T3J, T3H, T3K, T3N, T3L; + { + V T3A, T3D, T3F, T3G; + T3A = VSUB(T3y, T3z); + T3D = VSUB(T3B, T3C); + T3E = VBYI(VFMA(LDK(KP951056516), T3A, VMUL(LDK(KP587785252), T3D))); + T3M = VBYI(VFNMS(LDK(KP951056516), T3D, VMUL(LDK(KP587785252), T3A))); + T3I = VADD(T1Y, T1Z); + T3F = VADD(T3y, T3z); + T3G = VADD(T3B, T3C); + T3J = VADD(T3F, T3G); + T3H = VMUL(LDK(KP559016994), VSUB(T3F, T3G)); + T3K = VFNMS(LDK(KP250000000), T3J, T3I); + } + ST(&(x[0]), VADD(T3I, T3J), ms, &(x[0])); + T3N = VSUB(T3K, T3H); + ST(&(x[WS(rs, 10)]), VADD(T3M, T3N), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VSUB(T3N, T3M), ms, &(x[WS(rs, 1)])); + T3L = VADD(T3H, T3K); + ST(&(x[WS(rs, 5)]), VADD(T3E, T3L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VSUB(T3L, T3E), ms, &(x[0])); + } + { + V T2X, T3a, T3i, T3j, T3k, T3s, T3t, T3u, T3l, T3m, T3n, T3p, T3q, T3r, T2L; + V T3b, T32, T38, T2W, T35, T2Y, T34, T3w, T3x; + T2X = VSUB(T20, T1X); + T3a = VFNMS(LDK(KP951056516), T2f, T39); + T3i = VFMA(LDK(KP1_369094211), T2I, VMUL(LDK(KP728968627), T2J)); + T3j = VFNMS(LDK(KP992114701), T2F, VMUL(LDK(KP250666467), T2G)); + T3k = VADD(T3i, T3j); + T3s = VFNMS(LDK(KP125581039), T2Q, VMUL(LDK(KP998026728), T2P)); + T3t = VFMA(LDK(KP1_274847979), T2T, VMUL(LDK(KP770513242), T2S)); + T3u = VADD(T3s, T3t); + T3l = VFMA(LDK(KP1_996053456), T2Q, VMUL(LDK(KP062790519), T2P)); + T3m = VFNMS(LDK(KP637423989), T2S, VMUL(LDK(KP1_541026485), T2T)); + T3n = VADD(T3l, T3m); + T3p = VFNMS(LDK(KP1_457937254), T2I, VMUL(LDK(KP684547105), T2J)); + T3q = VFMA(LDK(KP1_984229402), T2G, VMUL(LDK(KP125333233), T2F)); + T3r = VADD(T3p, T3q); + { + V T2H, T2K, T36, T30, T31, T37; + T2H = VFNMS(LDK(KP851558583), T2G, VMUL(LDK(KP904827052), T2F)); + T2K = VFMA(LDK(KP1_752613360), T2I, VMUL(LDK(KP481753674), T2J)); + T36 = VADD(T2K, T2H); + T30 = VFMA(LDK(KP1_071653589), T2Q, VMUL(LDK(KP844327925), T2P)); + T31 = VFMA(LDK(KP125581039), T2T, VMUL(LDK(KP998026728), T2S)); + T37 = VADD(T30, T31); + T2L = VSUB(T2H, T2K); + T3b = VADD(T36, T37); + T32 = VSUB(T30, T31); + T38 = VMUL(LDK(KP559016994), VSUB(T36, T37)); + } + { + V T2M, T2N, T2O, T2R, T2U, T2V; + T2M = VFNMS(LDK(KP963507348), T2I, VMUL(LDK(KP876306680), T2J)); + T2N = VFMA(LDK(KP1_809654104), T2G, VMUL(LDK(KP425779291), T2F)); + T2O = VSUB(T2M, T2N); + T2R = VFNMS(LDK(KP1_688655851), T2Q, VMUL(LDK(KP535826794), T2P)); + T2U = VFNMS(LDK(KP1_996053456), T2T, VMUL(LDK(KP062790519), T2S)); + T2V = VADD(T2R, T2U); + T2W = VMUL(LDK(KP559016994), VSUB(T2O, T2V)); + T35 = VSUB(T2R, T2U); + T2Y = VADD(T2O, T2V); + T34 = VADD(T2M, T2N); + } + { + V T3g, T3h, T3o, T3v; + T3g = VADD(T2X, T2Y); + T3h = VBYI(VADD(T3a, T3b)); + ST(&(x[WS(rs, 23)]), VSUB(T3g, T3h), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 2)]), VADD(T3g, T3h), ms, &(x[0])); + T3o = VADD(T2X, VADD(T3k, T3n)); + T3v = VBYI(VSUB(VADD(T3r, T3u), T3a)); + ST(&(x[WS(rs, 22)]), VSUB(T3o, T3v), ms, &(x[0])); + ST(&(x[WS(rs, 3)]), VADD(T3o, T3v), ms, &(x[WS(rs, 1)])); + } + T3w = VBYI(VSUB(VFMA(LDK(KP951056516), VSUB(T3i, T3j), VFMA(LDK(KP309016994), T3r, VFNMS(LDK(KP809016994), T3u, VMUL(LDK(KP587785252), VSUB(T3l, T3m))))), T3a)); + T3x = VFMA(LDK(KP309016994), T3k, VFMA(LDK(KP951056516), VSUB(T3q, T3p), VFMA(LDK(KP587785252), VSUB(T3t, T3s), VFNMS(LDK(KP809016994), T3n, T2X)))); + ST(&(x[WS(rs, 8)]), VADD(T3w, T3x), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VSUB(T3x, T3w), ms, &(x[WS(rs, 1)])); + { + V T33, T3e, T3d, T3f, T2Z, T3c; + T2Z = VFNMS(LDK(KP250000000), T2Y, T2X); + T33 = VFMA(LDK(KP951056516), T2L, VADD(T2W, VFNMS(LDK(KP587785252), T32, T2Z))); + T3e = VFMA(LDK(KP587785252), T2L, VFMA(LDK(KP951056516), T32, VSUB(T2Z, T2W))); + T3c = VFNMS(LDK(KP250000000), T3b, T3a); + T3d = VBYI(VADD(VFMA(LDK(KP951056516), T34, VMUL(LDK(KP587785252), T35)), VADD(T38, T3c))); + T3f = VBYI(VADD(VFNMS(LDK(KP951056516), T35, VMUL(LDK(KP587785252), T34)), VSUB(T3c, T38))); + ST(&(x[WS(rs, 18)]), VSUB(T33, T3d), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T3e, T3f), ms, &(x[0])); + ST(&(x[WS(rs, 7)]), VADD(T33, T3d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T3e, T3f), ms, &(x[WS(rs, 1)])); + } + } + { + V T21, T2h, T2p, T2q, T2r, T2z, T2A, T2B, T2s, T2t, T2u, T2w, T2x, T2y, TU; + V T2i, T26, T2c, T1K, T29, T22, T28, T2D, T2E; + T21 = VADD(T1X, T20); + T2h = VADD(T2e, T2g); + T2p = VFMA(LDK(KP1_688655851), TK, VMUL(LDK(KP535826794), TS)); + T2q = VFMA(LDK(KP1_541026485), Tk, VMUL(LDK(KP637423989), Ts)); + T2r = VSUB(T2p, T2q); + T2z = VFMA(LDK(KP851558583), T1k, VMUL(LDK(KP904827052), T1h)); + T2A = VFMA(LDK(KP1_984229402), T1H, VMUL(LDK(KP125333233), T1E)); + T2B = VADD(T2z, T2A); + T2s = VFNMS(LDK(KP425779291), T1h, VMUL(LDK(KP1_809654104), T1k)); + T2t = VFNMS(LDK(KP992114701), T1E, VMUL(LDK(KP250666467), T1H)); + T2u = VADD(T2s, T2t); + T2w = VFNMS(LDK(KP1_071653589), TK, VMUL(LDK(KP844327925), TS)); + T2x = VFNMS(LDK(KP770513242), Ts, VMUL(LDK(KP1_274847979), Tk)); + T2y = VADD(T2w, T2x); + { + V Tt, TT, T2a, T24, T25, T2b; + Tt = VFMA(LDK(KP1_071653589), Tk, VMUL(LDK(KP844327925), Ts)); + TT = VFMA(LDK(KP1_937166322), TK, VMUL(LDK(KP248689887), TS)); + T2a = VADD(TT, Tt); + T24 = VFMA(LDK(KP1_752613360), T1k, VMUL(LDK(KP481753674), T1h)); + T25 = VFMA(LDK(KP1_457937254), T1H, VMUL(LDK(KP684547105), T1E)); + T2b = VADD(T24, T25); + TU = VSUB(Tt, TT); + T2i = VADD(T2a, T2b); + T26 = VSUB(T24, T25); + T2c = VMUL(LDK(KP559016994), VSUB(T2a, T2b)); + } + { + V TV, TW, TX, T1l, T1I, T1J; + TV = VFNMS(LDK(KP497379774), TK, VMUL(LDK(KP968583161), TS)); + TW = VFNMS(LDK(KP1_688655851), Tk, VMUL(LDK(KP535826794), Ts)); + TX = VADD(TV, TW); + T1l = VFNMS(LDK(KP963507348), T1k, VMUL(LDK(KP876306680), T1h)); + T1I = VFNMS(LDK(KP1_369094211), T1H, VMUL(LDK(KP728968627), T1E)); + T1J = VADD(T1l, T1I); + T1K = VMUL(LDK(KP559016994), VSUB(TX, T1J)); + T29 = VSUB(T1l, T1I); + T22 = VADD(TX, T1J); + T28 = VSUB(TV, TW); + } + { + V T2n, T2o, T2v, T2C; + T2n = VADD(T21, T22); + T2o = VBYI(VADD(T2h, T2i)); + ST(&(x[WS(rs, 24)]), VSUB(T2n, T2o), ms, &(x[0])); + ST(&(x[WS(rs, 1)]), VADD(T2n, T2o), ms, &(x[WS(rs, 1)])); + T2v = VADD(T21, VADD(T2r, T2u)); + T2C = VBYI(VSUB(VADD(T2y, T2B), T2h)); + ST(&(x[WS(rs, 21)]), VSUB(T2v, T2C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T2v, T2C), ms, &(x[0])); + } + T2D = VBYI(VSUB(VFMA(LDK(KP309016994), T2y, VFMA(LDK(KP951056516), VADD(T2p, T2q), VFNMS(LDK(KP809016994), T2B, VMUL(LDK(KP587785252), VSUB(T2s, T2t))))), T2h)); + T2E = VFMA(LDK(KP951056516), VSUB(T2x, T2w), VFMA(LDK(KP309016994), T2r, VFMA(LDK(KP587785252), VSUB(T2A, T2z), VFNMS(LDK(KP809016994), T2u, T21)))); + ST(&(x[WS(rs, 9)]), VADD(T2D, T2E), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VSUB(T2E, T2D), ms, &(x[0])); + { + V T27, T2l, T2k, T2m, T23, T2j; + T23 = VFNMS(LDK(KP250000000), T22, T21); + T27 = VFMA(LDK(KP951056516), TU, VADD(T1K, VFNMS(LDK(KP587785252), T26, T23))); + T2l = VFMA(LDK(KP587785252), TU, VFMA(LDK(KP951056516), T26, VSUB(T23, T1K))); + T2j = VFNMS(LDK(KP250000000), T2i, T2h); + T2k = VBYI(VADD(VFMA(LDK(KP951056516), T28, VMUL(LDK(KP587785252), T29)), VADD(T2c, T2j))); + T2m = VBYI(VADD(VFNMS(LDK(KP951056516), T29, VMUL(LDK(KP587785252), T28)), VSUB(T2j, T2c))); + ST(&(x[WS(rs, 19)]), VSUB(T27, T2k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T2l, T2m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 6)]), VADD(T27, T2k), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VSUB(T2l, T2m), ms, &(x[0])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t3bv_25"), twinstr, &GENUS, {191, 151, 77, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_25) (planner *p) { + X(kdft_dit_register) (p, t3bv_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_32.c new file mode 100644 index 000000000..940c2461e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_32.c @@ -0,0 +1,916 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:06 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 32 -name t3bv_32 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 244 FP additions, 214 FP multiplications, + * (or, 146 additions, 116 multiplications, 98 fused multiply/add), + * 90 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(32, rs)) { + V T2, T5, T3, T4, Tc, T1C, TT, Tz, Tn, T6, TP, Tf, TK, T7, T8; + V Tv, T1w, T21, Tg, Tk, T1D, T1O, TC, T18, T12, T1t, TH, TL, TQ, T1m; + V T1c; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + Tc = VZMUL(T2, T3); + T1C = VZMULJ(T2, T5); + TT = VZMULJ(T3, T5); + Tz = VZMUL(T2, T5); + Tn = VZMUL(T3, T5); + T6 = VZMUL(T4, T5); + TP = VZMULJ(Tc, T5); + Tf = VZMULJ(T4, T5); + TK = VZMUL(Tc, T5); + T7 = LDW(&(W[TWVL * 6])); + T8 = VZMULJ(T6, T7); + Tv = VZMULJ(T5, T7); + T1w = VZMULJ(Tn, T7); + T21 = VZMULJ(T3, T7); + Tg = VZMULJ(Tf, T7); + Tk = VZMUL(T2, T7); + T1D = VZMULJ(T1C, T7); + T1O = VZMULJ(Tc, T7); + TC = VZMULJ(T2, T7); + T18 = VZMULJ(TT, T7); + T12 = VZMULJ(Tz, T7); + T1t = VZMUL(Tc, T7); + TH = VZMUL(T3, T7); + TL = VZMULJ(TK, T7); + TQ = VZMULJ(TP, T7); + T1m = VZMULJ(T4, T7); + T1c = VZMUL(T4, T7); + { + V Tb, T24, T2T, T3x, Tr, T25, T2W, T3K, TX, T28, T3j, T3z, TG, T27, T3g; + V T3y, T1N, T2v, T3a, T3G, T1V, T2w, T37, T3F, T1j, T2s, T33, T3D, T1r, T2t; + V T30, T3C; + { + V T1, T23, Ta, T20, T22, T9, T1Z, T2R, T2S; + T1 = LD(&(x[0]), ms, &(x[0])); + T22 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T23 = VZMUL(T21, T22); + T9 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Ta = VZMUL(T8, T9); + T1Z = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T20 = VZMUL(T1C, T1Z); + Tb = VSUB(T1, Ta); + T24 = VSUB(T20, T23); + T2R = VADD(T1, Ta); + T2S = VADD(T20, T23); + T2T = VADD(T2R, T2S); + T3x = VSUB(T2R, T2S); + } + { + V Te, Tp, Ti, Tm; + { + V Td, To, Th, Tl; + Td = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Te = VZMUL(Tc, Td); + To = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tp = VZMUL(Tn, To); + Th = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Ti = VZMUL(Tg, Th); + Tl = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tm = VZMUL(Tk, Tl); + } + { + V Tj, Tq, T2U, T2V; + Tj = VSUB(Te, Ti); + Tq = VSUB(Tm, Tp); + Tr = VADD(Tj, Tq); + T25 = VSUB(Tj, Tq); + T2U = VADD(Te, Ti); + T2V = VADD(Tm, Tp); + T2W = VADD(T2U, T2V); + T3K = VSUB(T2U, T2V); + } + } + { + V TJ, TV, TN, TS; + { + V TI, TU, TM, TR; + TI = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TJ = VZMUL(TH, TI); + TU = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TV = VZMUL(TT, TU); + TM = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TN = VZMUL(TL, TM); + TR = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TS = VZMUL(TQ, TR); + } + { + V TO, TW, T3h, T3i; + TO = VSUB(TJ, TN); + TW = VSUB(TS, TV); + TX = VFNMS(LDK(KP414213562), TW, TO); + T28 = VFMA(LDK(KP414213562), TO, TW); + T3h = VADD(TJ, TN); + T3i = VADD(TV, TS); + T3j = VADD(T3h, T3i); + T3z = VSUB(T3h, T3i); + } + } + { + V Tu, TE, Tx, TB; + { + V Tt, TD, Tw, TA; + Tt = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tu = VZMUL(T4, Tt); + TD = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TE = VZMUL(TC, TD); + Tw = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tx = VZMUL(Tv, Tw); + TA = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TB = VZMUL(Tz, TA); + } + { + V Ty, TF, T3e, T3f; + Ty = VSUB(Tu, Tx); + TF = VSUB(TB, TE); + TG = VFNMS(LDK(KP414213562), TF, Ty); + T27 = VFMA(LDK(KP414213562), Ty, TF); + T3e = VADD(Tu, Tx); + T3f = VADD(TB, TE); + T3g = VADD(T3e, T3f); + T3y = VSUB(T3e, T3f); + } + } + { + V T1v, T1y, T1S, T1Q, T1I, T1K, T1L, T1B, T1F, T1G; + { + V T1u, T1x, T1R, T1P; + T1u = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T1v = VZMUL(T1t, T1u); + T1x = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1y = VZMUL(T1w, T1x); + T1R = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1S = VZMUL(Tf, T1R); + T1P = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1Q = VZMUL(T1O, T1P); + { + V T1H, T1J, T1A, T1E; + T1H = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1I = VZMUL(T7, T1H); + T1J = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1K = VZMUL(T6, T1J); + T1L = VSUB(T1I, T1K); + T1A = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1B = VZMUL(T3, T1A); + T1E = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1F = VZMUL(T1D, T1E); + T1G = VSUB(T1B, T1F); + } + } + { + V T1z, T1M, T38, T39; + T1z = VSUB(T1v, T1y); + T1M = VADD(T1G, T1L); + T1N = VFMA(LDK(KP707106781), T1M, T1z); + T2v = VFNMS(LDK(KP707106781), T1M, T1z); + T38 = VADD(T1B, T1F); + T39 = VADD(T1I, T1K); + T3a = VADD(T38, T39); + T3G = VSUB(T39, T38); + } + { + V T1T, T1U, T35, T36; + T1T = VSUB(T1Q, T1S); + T1U = VSUB(T1L, T1G); + T1V = VFMA(LDK(KP707106781), T1U, T1T); + T2w = VFNMS(LDK(KP707106781), T1U, T1T); + T35 = VADD(T1v, T1y); + T36 = VADD(T1S, T1Q); + T37 = VADD(T35, T36); + T3F = VSUB(T35, T36); + } + } + { + V T11, T14, T1o, T1l, T1e, T1g, T1h, T17, T1a, T1b; + { + V T10, T13, T1n, T1k; + T10 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T11 = VZMUL(T2, T10); + T13 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T14 = VZMUL(T12, T13); + T1n = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T1o = VZMUL(T1m, T1n); + T1k = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1l = VZMUL(T5, T1k); + { + V T1d, T1f, T16, T19; + T1d = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1e = VZMUL(T1c, T1d); + T1f = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1g = VZMUL(TK, T1f); + T1h = VSUB(T1e, T1g); + T16 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T17 = VZMUL(TP, T16); + T19 = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1a = VZMUL(T18, T19); + T1b = VSUB(T17, T1a); + } + } + { + V T15, T1i, T31, T32; + T15 = VSUB(T11, T14); + T1i = VADD(T1b, T1h); + T1j = VFMA(LDK(KP707106781), T1i, T15); + T2s = VFNMS(LDK(KP707106781), T1i, T15); + T31 = VADD(T17, T1a); + T32 = VADD(T1e, T1g); + T33 = VADD(T31, T32); + T3D = VSUB(T31, T32); + } + { + V T1p, T1q, T2Y, T2Z; + T1p = VSUB(T1l, T1o); + T1q = VSUB(T1b, T1h); + T1r = VFMA(LDK(KP707106781), T1q, T1p); + T2t = VFNMS(LDK(KP707106781), T1q, T1p); + T2Y = VADD(T11, T14); + T2Z = VADD(T1l, T1o); + T30 = VADD(T2Y, T2Z); + T3C = VSUB(T2Y, T2Z); + } + } + { + V T3r, T3v, T3u, T3w; + { + V T3p, T3q, T3s, T3t; + T3p = VADD(T2T, T2W); + T3q = VADD(T3g, T3j); + T3r = VSUB(T3p, T3q); + T3v = VADD(T3p, T3q); + T3s = VADD(T30, T33); + T3t = VADD(T37, T3a); + T3u = VSUB(T3s, T3t); + T3w = VADD(T3s, T3t); + } + ST(&(x[WS(rs, 24)]), VFNMSI(T3u, T3r), ms, &(x[0])); + ST(&(x[0]), VADD(T3v, T3w), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T3u, T3r), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T3v, T3w), ms, &(x[0])); + } + { + V T2X, T3k, T3c, T3l, T34, T3b; + T2X = VSUB(T2T, T2W); + T3k = VSUB(T3g, T3j); + T34 = VSUB(T30, T33); + T3b = VSUB(T37, T3a); + T3c = VADD(T34, T3b); + T3l = VSUB(T34, T3b); + { + V T3d, T3m, T3n, T3o; + T3d = VFNMS(LDK(KP707106781), T3c, T2X); + T3m = VFNMS(LDK(KP707106781), T3l, T3k); + ST(&(x[WS(rs, 12)]), VFNMSI(T3m, T3d), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VFMAI(T3m, T3d), ms, &(x[0])); + T3n = VFMA(LDK(KP707106781), T3c, T2X); + T3o = VFMA(LDK(KP707106781), T3l, T3k); + ST(&(x[WS(rs, 4)]), VFMAI(T3o, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VFNMSI(T3o, T3n), ms, &(x[0])); + } + } + { + V T3B, T3T, T3M, T3W, T3I, T3X, T3P, T3U, T3A, T3L; + T3A = VADD(T3y, T3z); + T3B = VFMA(LDK(KP707106781), T3A, T3x); + T3T = VFNMS(LDK(KP707106781), T3A, T3x); + T3L = VSUB(T3y, T3z); + T3M = VFMA(LDK(KP707106781), T3L, T3K); + T3W = VFNMS(LDK(KP707106781), T3L, T3K); + { + V T3E, T3H, T3N, T3O; + T3E = VFNMS(LDK(KP414213562), T3D, T3C); + T3H = VFNMS(LDK(KP414213562), T3G, T3F); + T3I = VADD(T3E, T3H); + T3X = VSUB(T3E, T3H); + T3N = VFMA(LDK(KP414213562), T3C, T3D); + T3O = VFMA(LDK(KP414213562), T3F, T3G); + T3P = VSUB(T3N, T3O); + T3U = VADD(T3N, T3O); + } + { + V T3J, T3Q, T3Z, T40; + T3J = VFNMS(LDK(KP923879532), T3I, T3B); + T3Q = VFNMS(LDK(KP923879532), T3P, T3M); + ST(&(x[WS(rs, 14)]), VFNMSI(T3Q, T3J), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3Q, T3J), ms, &(x[0])); + T3Z = VFMA(LDK(KP923879532), T3U, T3T); + T40 = VFNMS(LDK(KP923879532), T3X, T3W); + ST(&(x[WS(rs, 6)]), VFNMSI(T40, T3Z), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T40, T3Z), ms, &(x[0])); + } + { + V T3R, T3S, T3V, T3Y; + T3R = VFMA(LDK(KP923879532), T3I, T3B); + T3S = VFMA(LDK(KP923879532), T3P, T3M); + ST(&(x[WS(rs, 30)]), VFNMSI(T3S, T3R), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3S, T3R), ms, &(x[0])); + T3V = VFNMS(LDK(KP923879532), T3U, T3T); + T3Y = VFMA(LDK(KP923879532), T3X, T3W); + ST(&(x[WS(rs, 10)]), VFMAI(T3Y, T3V), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VFNMSI(T3Y, T3V), ms, &(x[0])); + } + } + { + V TZ, T2h, T2d, T2i, T1X, T2l, T2a, T2k; + { + V Ts, TY, T2b, T2c; + Ts = VFMA(LDK(KP707106781), Tr, Tb); + TY = VADD(TG, TX); + TZ = VFMA(LDK(KP923879532), TY, Ts); + T2h = VFNMS(LDK(KP923879532), TY, Ts); + T2b = VFMA(LDK(KP198912367), T1j, T1r); + T2c = VFMA(LDK(KP198912367), T1N, T1V); + T2d = VSUB(T2b, T2c); + T2i = VADD(T2b, T2c); + } + { + V T1s, T1W, T26, T29; + T1s = VFNMS(LDK(KP198912367), T1r, T1j); + T1W = VFNMS(LDK(KP198912367), T1V, T1N); + T1X = VADD(T1s, T1W); + T2l = VSUB(T1s, T1W); + T26 = VFMA(LDK(KP707106781), T25, T24); + T29 = VSUB(T27, T28); + T2a = VFMA(LDK(KP923879532), T29, T26); + T2k = VFNMS(LDK(KP923879532), T29, T26); + } + { + V T1Y, T2e, T2n, T2o; + T1Y = VFNMS(LDK(KP980785280), T1X, TZ); + T2e = VFNMS(LDK(KP980785280), T2d, T2a); + ST(&(x[WS(rs, 15)]), VFNMSI(T2e, T1Y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VFMAI(T2e, T1Y), ms, &(x[WS(rs, 1)])); + T2n = VFMA(LDK(KP980785280), T2i, T2h); + T2o = VFNMS(LDK(KP980785280), T2l, T2k); + ST(&(x[WS(rs, 7)]), VFNMSI(T2o, T2n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFMAI(T2o, T2n), ms, &(x[WS(rs, 1)])); + } + { + V T2f, T2g, T2j, T2m; + T2f = VFMA(LDK(KP980785280), T1X, TZ); + T2g = VFMA(LDK(KP980785280), T2d, T2a); + ST(&(x[WS(rs, 31)]), VFNMSI(T2g, T2f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(T2g, T2f), ms, &(x[WS(rs, 1)])); + T2j = VFNMS(LDK(KP980785280), T2i, T2h); + T2m = VFMA(LDK(KP980785280), T2l, T2k); + ST(&(x[WS(rs, 9)]), VFMAI(T2m, T2j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VFNMSI(T2m, T2j), ms, &(x[WS(rs, 1)])); + } + } + { + V T2r, T2J, T2F, T2K, T2y, T2N, T2C, T2M; + { + V T2p, T2q, T2D, T2E; + T2p = VFNMS(LDK(KP707106781), Tr, Tb); + T2q = VADD(T27, T28); + T2r = VFMA(LDK(KP923879532), T2q, T2p); + T2J = VFNMS(LDK(KP923879532), T2q, T2p); + T2D = VFNMS(LDK(KP668178637), T2s, T2t); + T2E = VFNMS(LDK(KP668178637), T2v, T2w); + T2F = VSUB(T2D, T2E); + T2K = VADD(T2D, T2E); + } + { + V T2u, T2x, T2A, T2B; + T2u = VFMA(LDK(KP668178637), T2t, T2s); + T2x = VFMA(LDK(KP668178637), T2w, T2v); + T2y = VADD(T2u, T2x); + T2N = VSUB(T2u, T2x); + T2A = VFNMS(LDK(KP707106781), T25, T24); + T2B = VSUB(TG, TX); + T2C = VFNMS(LDK(KP923879532), T2B, T2A); + T2M = VFMA(LDK(KP923879532), T2B, T2A); + } + { + V T2z, T2G, T2P, T2Q; + T2z = VFNMS(LDK(KP831469612), T2y, T2r); + T2G = VFNMS(LDK(KP831469612), T2F, T2C); + ST(&(x[WS(rs, 19)]), VFNMSI(T2G, T2z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFMAI(T2G, T2z), ms, &(x[WS(rs, 1)])); + T2P = VFNMS(LDK(KP831469612), T2K, T2J); + T2Q = VFMA(LDK(KP831469612), T2N, T2M); + ST(&(x[WS(rs, 5)]), VFMAI(T2Q, T2P), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFNMSI(T2Q, T2P), ms, &(x[WS(rs, 1)])); + } + { + V T2H, T2I, T2L, T2O; + T2H = VFMA(LDK(KP831469612), T2y, T2r); + T2I = VFMA(LDK(KP831469612), T2F, T2C); + ST(&(x[WS(rs, 3)]), VFNMSI(T2I, T2H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VFMAI(T2I, T2H), ms, &(x[WS(rs, 1)])); + T2L = VFMA(LDK(KP831469612), T2K, T2J); + T2O = VFNMS(LDK(KP831469612), T2N, T2M); + ST(&(x[WS(rs, 11)]), VFNMSI(T2O, T2L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VFMAI(T2O, T2L), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 27), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t3bv_32"), twinstr, &GENUS, {146, 116, 98, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_32) (planner *p) { + X(kdft_dit_register) (p, t3bv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 32 -name t3bv_32 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 244 FP additions, 158 FP multiplications, + * (or, 228 additions, 142 multiplications, 16 fused multiply/add), + * 90 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(32, rs)) { + V T2, T5, T3, T4, Tc, T1v, TH, Tz, Tn, T6, TS, Tf, TK, T7, T8; + V Tv, T1I, T25, Tg, Tk, T1N, T1Q, TC, T16, T12, T1w, TL, TP, TT, T1m; + V T1f; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + Tc = VZMUL(T2, T3); + T1v = VZMULJ(T2, T5); + TH = VZMULJ(T3, T5); + Tz = VZMUL(T2, T5); + Tn = VZMUL(T3, T5); + T6 = VZMUL(T4, T5); + TS = VZMUL(Tc, T5); + Tf = VZMULJ(T4, T5); + TK = VZMULJ(Tc, T5); + T7 = LDW(&(W[TWVL * 6])); + T8 = VZMULJ(T6, T7); + Tv = VZMULJ(T5, T7); + T1I = VZMULJ(Tc, T7); + T25 = VZMULJ(T3, T7); + Tg = VZMULJ(Tf, T7); + Tk = VZMUL(T2, T7); + T1N = VZMUL(Tc, T7); + T1Q = VZMULJ(Tn, T7); + TC = VZMULJ(T2, T7); + T16 = VZMUL(T4, T7); + T12 = VZMULJ(TH, T7); + T1w = VZMULJ(T1v, T7); + TL = VZMULJ(TK, T7); + TP = VZMUL(T3, T7); + TT = VZMULJ(TS, T7); + T1m = VZMULJ(Tz, T7); + T1f = VZMULJ(T4, T7); + { + V Tb, T28, T3k, T3M, Tr, T22, T3f, T3N, TX, T20, T3b, T3J, TG, T1Z, T38; + V T3I, T1M, T2v, T33, T3F, T1V, T2w, T30, T3E, T1j, T2s, T2W, T3C, T1r, T2t; + V T2T, T3B; + { + V T1, T27, Ta, T24, T26, T9, T23, T3i, T3j; + T1 = LD(&(x[0]), ms, &(x[0])); + T26 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T27 = VZMUL(T25, T26); + T9 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Ta = VZMUL(T8, T9); + T23 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T24 = VZMUL(T1v, T23); + Tb = VSUB(T1, Ta); + T28 = VSUB(T24, T27); + T3i = VADD(T1, Ta); + T3j = VADD(T24, T27); + T3k = VSUB(T3i, T3j); + T3M = VADD(T3i, T3j); + } + { + V Te, Tp, Ti, Tm; + { + V Td, To, Th, Tl; + Td = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Te = VZMUL(Tc, Td); + To = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tp = VZMUL(Tn, To); + Th = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Ti = VZMUL(Tg, Th); + Tl = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tm = VZMUL(Tk, Tl); + } + { + V Tj, Tq, T3d, T3e; + Tj = VSUB(Te, Ti); + Tq = VSUB(Tm, Tp); + Tr = VMUL(LDK(KP707106781), VADD(Tj, Tq)); + T22 = VMUL(LDK(KP707106781), VSUB(Tj, Tq)); + T3d = VADD(Te, Ti); + T3e = VADD(Tm, Tp); + T3f = VSUB(T3d, T3e); + T3N = VADD(T3d, T3e); + } + } + { + V TJ, TV, TN, TR; + { + V TI, TU, TM, TQ; + TI = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TJ = VZMUL(TH, TI); + TU = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TV = VZMUL(TT, TU); + TM = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TN = VZMUL(TL, TM); + TQ = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TR = VZMUL(TP, TQ); + } + { + V TO, TW, T39, T3a; + TO = VSUB(TJ, TN); + TW = VSUB(TR, TV); + TX = VFNMS(LDK(KP382683432), TW, VMUL(LDK(KP923879532), TO)); + T20 = VFMA(LDK(KP923879532), TW, VMUL(LDK(KP382683432), TO)); + T39 = VADD(TR, TV); + T3a = VADD(TJ, TN); + T3b = VSUB(T39, T3a); + T3J = VADD(T39, T3a); + } + } + { + V Tu, TE, Tx, TB; + { + V Tt, TD, Tw, TA; + Tt = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tu = VZMUL(T4, Tt); + TD = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TE = VZMUL(TC, TD); + Tw = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tx = VZMUL(Tv, Tw); + TA = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TB = VZMUL(Tz, TA); + } + { + V Ty, TF, T36, T37; + Ty = VSUB(Tu, Tx); + TF = VSUB(TB, TE); + TG = VFMA(LDK(KP382683432), Ty, VMUL(LDK(KP923879532), TF)); + T1Z = VFNMS(LDK(KP382683432), TF, VMUL(LDK(KP923879532), Ty)); + T36 = VADD(Tu, Tx); + T37 = VADD(TB, TE); + T38 = VSUB(T36, T37); + T3I = VADD(T36, T37); + } + } + { + V T1H, T1K, T1S, T1P, T1B, T1D, T1E, T1u, T1y, T1z; + { + V T1G, T1J, T1R, T1O; + T1G = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1H = VZMUL(Tf, T1G); + T1J = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1K = VZMUL(T1I, T1J); + T1R = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1S = VZMUL(T1Q, T1R); + T1O = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T1P = VZMUL(T1N, T1O); + { + V T1A, T1C, T1t, T1x; + T1A = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1B = VZMUL(T7, T1A); + T1C = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1D = VZMUL(T6, T1C); + T1E = VSUB(T1B, T1D); + T1t = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1u = VZMUL(T3, T1t); + T1x = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1y = VZMUL(T1w, T1x); + T1z = VSUB(T1u, T1y); + } + } + { + V T1F, T1L, T31, T32; + T1F = VMUL(LDK(KP707106781), VSUB(T1z, T1E)); + T1L = VSUB(T1H, T1K); + T1M = VSUB(T1F, T1L); + T2v = VADD(T1L, T1F); + T31 = VADD(T1u, T1y); + T32 = VADD(T1B, T1D); + T33 = VSUB(T31, T32); + T3F = VADD(T31, T32); + } + { + V T1T, T1U, T2Y, T2Z; + T1T = VSUB(T1P, T1S); + T1U = VMUL(LDK(KP707106781), VADD(T1z, T1E)); + T1V = VSUB(T1T, T1U); + T2w = VADD(T1T, T1U); + T2Y = VADD(T1P, T1S); + T2Z = VADD(T1H, T1K); + T30 = VSUB(T2Y, T2Z); + T3E = VADD(T2Y, T2Z); + } + } + { + V T1e, T1h, T1o, T1l, T18, T1a, T1b, T11, T14, T15; + { + V T1d, T1g, T1n, T1k; + T1d = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1e = VZMUL(T5, T1d); + T1g = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T1h = VZMUL(T1f, T1g); + T1n = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1o = VZMUL(T1m, T1n); + T1k = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T1l = VZMUL(T2, T1k); + { + V T17, T19, T10, T13; + T17 = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T18 = VZMUL(T16, T17); + T19 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1a = VZMUL(TS, T19); + T1b = VSUB(T18, T1a); + T10 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T11 = VZMUL(TK, T10); + T13 = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T14 = VZMUL(T12, T13); + T15 = VSUB(T11, T14); + } + } + { + V T1c, T1i, T2U, T2V; + T1c = VMUL(LDK(KP707106781), VSUB(T15, T1b)); + T1i = VSUB(T1e, T1h); + T1j = VSUB(T1c, T1i); + T2s = VADD(T1i, T1c); + T2U = VADD(T11, T14); + T2V = VADD(T18, T1a); + T2W = VSUB(T2U, T2V); + T3C = VADD(T2U, T2V); + } + { + V T1p, T1q, T2R, T2S; + T1p = VSUB(T1l, T1o); + T1q = VMUL(LDK(KP707106781), VADD(T15, T1b)); + T1r = VSUB(T1p, T1q); + T2t = VADD(T1p, T1q); + T2R = VADD(T1l, T1o); + T2S = VADD(T1e, T1h); + T2T = VSUB(T2R, T2S); + T3B = VADD(T2R, T2S); + } + } + { + V T3V, T3Z, T3Y, T40; + { + V T3T, T3U, T3W, T3X; + T3T = VADD(T3M, T3N); + T3U = VADD(T3I, T3J); + T3V = VSUB(T3T, T3U); + T3Z = VADD(T3T, T3U); + T3W = VADD(T3B, T3C); + T3X = VADD(T3E, T3F); + T3Y = VBYI(VSUB(T3W, T3X)); + T40 = VADD(T3W, T3X); + } + ST(&(x[WS(rs, 24)]), VSUB(T3V, T3Y), ms, &(x[0])); + ST(&(x[0]), VADD(T3Z, T40), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T3V, T3Y), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T3Z, T40), ms, &(x[0])); + } + { + V T3K, T3O, T3H, T3P, T3D, T3G; + T3K = VSUB(T3I, T3J); + T3O = VSUB(T3M, T3N); + T3D = VSUB(T3B, T3C); + T3G = VSUB(T3E, T3F); + T3H = VMUL(LDK(KP707106781), VSUB(T3D, T3G)); + T3P = VMUL(LDK(KP707106781), VADD(T3D, T3G)); + { + V T3L, T3Q, T3R, T3S; + T3L = VBYI(VSUB(T3H, T3K)); + T3Q = VSUB(T3O, T3P); + ST(&(x[WS(rs, 12)]), VADD(T3L, T3Q), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VSUB(T3Q, T3L), ms, &(x[0])); + T3R = VBYI(VADD(T3K, T3H)); + T3S = VADD(T3O, T3P); + ST(&(x[WS(rs, 4)]), VADD(T3R, T3S), ms, &(x[0])); + ST(&(x[WS(rs, 28)]), VSUB(T3S, T3R), ms, &(x[0])); + } + } + { + V T3g, T3w, T3m, T3t, T35, T3u, T3p, T3x, T3c, T3l; + T3c = VMUL(LDK(KP707106781), VSUB(T38, T3b)); + T3g = VSUB(T3c, T3f); + T3w = VADD(T3f, T3c); + T3l = VMUL(LDK(KP707106781), VADD(T38, T3b)); + T3m = VSUB(T3k, T3l); + T3t = VADD(T3k, T3l); + { + V T2X, T34, T3n, T3o; + T2X = VFNMS(LDK(KP382683432), T2W, VMUL(LDK(KP923879532), T2T)); + T34 = VFMA(LDK(KP923879532), T30, VMUL(LDK(KP382683432), T33)); + T35 = VSUB(T2X, T34); + T3u = VADD(T2X, T34); + T3n = VFMA(LDK(KP382683432), T2T, VMUL(LDK(KP923879532), T2W)); + T3o = VFNMS(LDK(KP382683432), T30, VMUL(LDK(KP923879532), T33)); + T3p = VSUB(T3n, T3o); + T3x = VADD(T3n, T3o); + } + { + V T3h, T3q, T3z, T3A; + T3h = VBYI(VSUB(T35, T3g)); + T3q = VSUB(T3m, T3p); + ST(&(x[WS(rs, 10)]), VADD(T3h, T3q), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VSUB(T3q, T3h), ms, &(x[0])); + T3z = VSUB(T3t, T3u); + T3A = VBYI(VSUB(T3x, T3w)); + ST(&(x[WS(rs, 18)]), VSUB(T3z, T3A), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T3z, T3A), ms, &(x[0])); + } + { + V T3r, T3s, T3v, T3y; + T3r = VBYI(VADD(T3g, T35)); + T3s = VADD(T3m, T3p); + ST(&(x[WS(rs, 6)]), VADD(T3r, T3s), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VSUB(T3s, T3r), ms, &(x[0])); + T3v = VADD(T3t, T3u); + T3y = VBYI(VADD(T3w, T3x)); + ST(&(x[WS(rs, 30)]), VSUB(T3v, T3y), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T3v, T3y), ms, &(x[0])); + } + } + { + V TZ, T2k, T2d, T2l, T1X, T2h, T2a, T2i; + { + V Ts, TY, T2b, T2c; + Ts = VSUB(Tb, Tr); + TY = VSUB(TG, TX); + TZ = VSUB(Ts, TY); + T2k = VADD(Ts, TY); + T2b = VFNMS(LDK(KP555570233), T1j, VMUL(LDK(KP831469612), T1r)); + T2c = VFMA(LDK(KP555570233), T1M, VMUL(LDK(KP831469612), T1V)); + T2d = VSUB(T2b, T2c); + T2l = VADD(T2b, T2c); + } + { + V T1s, T1W, T21, T29; + T1s = VFMA(LDK(KP831469612), T1j, VMUL(LDK(KP555570233), T1r)); + T1W = VFNMS(LDK(KP555570233), T1V, VMUL(LDK(KP831469612), T1M)); + T1X = VSUB(T1s, T1W); + T2h = VADD(T1s, T1W); + T21 = VSUB(T1Z, T20); + T29 = VSUB(T22, T28); + T2a = VSUB(T21, T29); + T2i = VADD(T29, T21); + } + { + V T1Y, T2e, T2n, T2o; + T1Y = VADD(TZ, T1X); + T2e = VBYI(VADD(T2a, T2d)); + ST(&(x[WS(rs, 27)]), VSUB(T1Y, T2e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1Y, T2e), ms, &(x[WS(rs, 1)])); + T2n = VBYI(VADD(T2i, T2h)); + T2o = VADD(T2k, T2l); + ST(&(x[WS(rs, 3)]), VADD(T2n, T2o), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 29)]), VSUB(T2o, T2n), ms, &(x[WS(rs, 1)])); + } + { + V T2f, T2g, T2j, T2m; + T2f = VSUB(TZ, T1X); + T2g = VBYI(VSUB(T2d, T2a)); + ST(&(x[WS(rs, 21)]), VSUB(T2f, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VADD(T2f, T2g), ms, &(x[WS(rs, 1)])); + T2j = VBYI(VSUB(T2h, T2i)); + T2m = VSUB(T2k, T2l); + ST(&(x[WS(rs, 13)]), VADD(T2j, T2m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VSUB(T2m, T2j), ms, &(x[WS(rs, 1)])); + } + } + { + V T2r, T2M, T2F, T2N, T2y, T2J, T2C, T2K; + { + V T2p, T2q, T2D, T2E; + T2p = VADD(Tb, Tr); + T2q = VADD(T1Z, T20); + T2r = VSUB(T2p, T2q); + T2M = VADD(T2p, T2q); + T2D = VFNMS(LDK(KP195090322), T2s, VMUL(LDK(KP980785280), T2t)); + T2E = VFMA(LDK(KP195090322), T2v, VMUL(LDK(KP980785280), T2w)); + T2F = VSUB(T2D, T2E); + T2N = VADD(T2D, T2E); + } + { + V T2u, T2x, T2A, T2B; + T2u = VFMA(LDK(KP980785280), T2s, VMUL(LDK(KP195090322), T2t)); + T2x = VFNMS(LDK(KP195090322), T2w, VMUL(LDK(KP980785280), T2v)); + T2y = VSUB(T2u, T2x); + T2J = VADD(T2u, T2x); + T2A = VADD(TG, TX); + T2B = VADD(T28, T22); + T2C = VSUB(T2A, T2B); + T2K = VADD(T2B, T2A); + } + { + V T2z, T2G, T2P, T2Q; + T2z = VADD(T2r, T2y); + T2G = VBYI(VADD(T2C, T2F)); + ST(&(x[WS(rs, 25)]), VSUB(T2z, T2G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T2z, T2G), ms, &(x[WS(rs, 1)])); + T2P = VBYI(VADD(T2K, T2J)); + T2Q = VADD(T2M, T2N); + ST(&(x[WS(rs, 1)]), VADD(T2P, T2Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VSUB(T2Q, T2P), ms, &(x[WS(rs, 1)])); + } + { + V T2H, T2I, T2L, T2O; + T2H = VSUB(T2r, T2y); + T2I = VBYI(VSUB(T2F, T2C)); + ST(&(x[WS(rs, 23)]), VSUB(T2H, T2I), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T2H, T2I), ms, &(x[WS(rs, 1)])); + T2L = VBYI(VSUB(T2J, T2K)); + T2O = VSUB(T2M, T2N); + ST(&(x[WS(rs, 15)]), VADD(T2L, T2O), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 17)]), VSUB(T2O, T2L), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 27), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t3bv_32"), twinstr, &GENUS, {228, 142, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_32) (planner *p) { + X(kdft_dit_register) (p, t3bv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_4.c new file mode 100644 index 000000000..2c4135eec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_4.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:06 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 4 -name t3bv_4 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 12 FP additions, 10 FP multiplications, + * (or, 10 additions, 8 multiplications, 2 fused multiply/add), + * 16 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(4, rs)) { + V T2, T3, T4; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + { + V T1, Tb, T6, T9, Ta, T5, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + Ta = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tb = VZMUL(T3, Ta); + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMUL(T2, T8); + { + V T7, Tc, Td, Te; + T7 = VSUB(T1, T6); + Tc = VSUB(T9, Tb); + ST(&(x[WS(rs, 3)]), VFNMSI(Tc, T7), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Tc, T7), ms, &(x[WS(rs, 1)])); + Td = VADD(T1, T6); + Te = VADD(T9, Tb); + ST(&(x[WS(rs, 2)]), VSUB(Td, Te), ms, &(x[0])); + ST(&(x[0]), VADD(Td, Te), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t3bv_4"), twinstr, &GENUS, {10, 8, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_4) (planner *p) { + X(kdft_dit_register) (p, t3bv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 4 -name t3bv_4 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 12 FP additions, 8 FP multiplications, + * (or, 12 additions, 8 multiplications, 0 fused multiply/add), + * 16 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(4, rs)) { + V T2, T3, T4; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + { + V T1, Tb, T6, T9, Ta, T5, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + Ta = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tb = VZMUL(T3, Ta); + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMUL(T2, T8); + { + V T7, Tc, Td, Te; + T7 = VSUB(T1, T6); + Tc = VBYI(VSUB(T9, Tb)); + ST(&(x[WS(rs, 3)]), VSUB(T7, Tc), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T7, Tc), ms, &(x[WS(rs, 1)])); + Td = VADD(T1, T6); + Te = VADD(T9, Tb); + ST(&(x[WS(rs, 2)]), VSUB(Td, Te), ms, &(x[0])); + ST(&(x[0]), VADD(Td, Te), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t3bv_4"), twinstr, &GENUS, {12, 8, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_4) (planner *p) { + X(kdft_dit_register) (p, t3bv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_5.c new file mode 100644 index 000000000..17bc3c051 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_5.c @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:09 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 5 -name t3bv_5 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 22 FP additions, 23 FP multiplications, + * (or, 13 additions, 14 multiplications, 9 fused multiply/add), + * 24 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(5, rs)) { + V T2, T5, T6, Ta; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 2])); + T6 = VZMUL(T2, T5); + Ta = VZMULJ(T2, T5); + { + V T1, Tk, Tl, T9, Tf, Tg; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T4, Te, T8, Tc; + { + V T3, Td, T7, Tb; + T3 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T4 = VZMUL(T2, T3); + Td = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Te = VZMUL(T5, Td); + T7 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T8 = VZMUL(T6, T7); + Tb = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tc = VZMUL(Ta, Tb); + } + Tk = VSUB(T4, T8); + Tl = VSUB(Tc, Te); + T9 = VADD(T4, T8); + Tf = VADD(Tc, Te); + Tg = VADD(T9, Tf); + } + ST(&(x[0]), VADD(T1, Tg), ms, &(x[0])); + { + V Tm, To, Tj, Tn, Th, Ti; + Tm = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tl, Tk)); + To = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tk, Tl)); + Th = VFNMS(LDK(KP250000000), Tg, T1); + Ti = VSUB(T9, Tf); + Tj = VFMA(LDK(KP559016994), Ti, Th); + Tn = VFNMS(LDK(KP559016994), Ti, Th); + ST(&(x[WS(rs, 1)]), VFMAI(Tm, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(To, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFNMSI(Tm, Tj), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFNMSI(To, Tn), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t3bv_5"), twinstr, &GENUS, {13, 14, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_5) (planner *p) { + X(kdft_dit_register) (p, t3bv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 5 -name t3bv_5 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 22 FP additions, 18 FP multiplications, + * (or, 19 additions, 15 multiplications, 3 fused multiply/add), + * 24 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, T4, T5, T9; + T1 = LDW(&(W[0])); + T4 = LDW(&(W[TWVL * 2])); + T5 = VZMUL(T1, T4); + T9 = VZMULJ(T1, T4); + { + V Tj, T8, Te, Tg, Th, Tk; + Tj = LD(&(x[0]), ms, &(x[0])); + { + V T3, Td, T7, Tb; + { + V T2, Tc, T6, Ta; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = VZMUL(T1, T2); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = VZMUL(T4, Tc); + T6 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T7 = VZMUL(T5, T6); + Ta = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tb = VZMUL(T9, Ta); + } + T8 = VSUB(T3, T7); + Te = VSUB(Tb, Td); + Tg = VADD(T3, T7); + Th = VADD(Tb, Td); + Tk = VADD(Tg, Th); + } + ST(&(x[0]), VADD(Tj, Tk), ms, &(x[0])); + { + V Tf, Tn, Tm, To, Ti, Tl; + Tf = VBYI(VFMA(LDK(KP951056516), T8, VMUL(LDK(KP587785252), Te))); + Tn = VBYI(VFNMS(LDK(KP951056516), Te, VMUL(LDK(KP587785252), T8))); + Ti = VMUL(LDK(KP559016994), VSUB(Tg, Th)); + Tl = VFNMS(LDK(KP250000000), Tk, Tj); + Tm = VADD(Ti, Tl); + To = VSUB(Tl, Ti); + ST(&(x[WS(rs, 1)]), VADD(Tf, Tm), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(To, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VSUB(Tm, Tf), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tn, To), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t3bv_5"), twinstr, &GENUS, {19, 15, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_5) (planner *p) { + X(kdft_dit_register) (p, t3bv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_8.c new file mode 100644 index 000000000..f754343ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3bv_8.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:06 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 8 -name t3bv_8 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 37 FP additions, 32 FP multiplications, + * (or, 27 additions, 22 multiplications, 10 fused multiply/add), + * 31 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs)) { + V T2, T3, Ta, T4, Tb, Tc, Tp; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + Ta = VZMULJ(T2, T3); + T4 = VZMUL(T2, T3); + Tb = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(Ta, Tb); + Tp = VZMULJ(T2, Tb); + { + V T7, Tx, Ts, Ty, Tf, TA, Tk, TB, T1, T6, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = VZMUL(T4, T5); + T7 = VSUB(T1, T6); + Tx = VADD(T1, T6); + { + V To, Tr, Tn, Tq; + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = VZMUL(Ta, Tn); + Tq = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tr = VZMUL(Tp, Tq); + Ts = VSUB(To, Tr); + Ty = VADD(To, Tr); + } + { + V T9, Te, T8, Td; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMUL(T2, T8); + Td = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Te = VZMUL(Tc, Td); + Tf = VSUB(T9, Te); + TA = VADD(T9, Te); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Th = VZMUL(Tb, Tg); + Ti = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tj = VZMUL(T3, Ti); + Tk = VSUB(Th, Tj); + TB = VADD(Th, Tj); + } + { + V Tz, TC, TD, TE; + Tz = VSUB(Tx, Ty); + TC = VSUB(TA, TB); + ST(&(x[WS(rs, 6)]), VFNMSI(TC, Tz), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TC, Tz), ms, &(x[0])); + TD = VADD(Tx, Ty); + TE = VADD(TA, TB); + ST(&(x[WS(rs, 4)]), VSUB(TD, TE), ms, &(x[0])); + ST(&(x[0]), VADD(TD, TE), ms, &(x[0])); + { + V Tm, Tv, Tu, Tw, Tl, Tt; + Tl = VADD(Tf, Tk); + Tm = VFNMS(LDK(KP707106781), Tl, T7); + Tv = VFMA(LDK(KP707106781), Tl, T7); + Tt = VSUB(Tf, Tk); + Tu = VFNMS(LDK(KP707106781), Tt, Ts); + Tw = VFMA(LDK(KP707106781), Tt, Ts); + ST(&(x[WS(rs, 3)]), VFNMSI(Tu, Tm), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFNMSI(Tw, Tv), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFMAI(Tu, Tm), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFMAI(Tw, Tv), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t3bv_8"), twinstr, &GENUS, {27, 22, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_8) (planner *p) { + X(kdft_dit_register) (p, t3bv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 8 -name t3bv_8 -include dft/simd/t3b.h -sign 1 */ + +/* + * This function contains 37 FP additions, 24 FP multiplications, + * (or, 37 additions, 24 multiplications, 0 fused multiply/add), + * 31 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t3b.h" + +static void t3bv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ii; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs)) { + V T1, T4, T5, Tp, T6, T7, Tj; + T1 = LDW(&(W[0])); + T4 = LDW(&(W[TWVL * 2])); + T5 = VZMULJ(T1, T4); + Tp = VZMUL(T1, T4); + T6 = LDW(&(W[TWVL * 4])); + T7 = VZMULJ(T5, T6); + Tj = VZMULJ(T1, T6); + { + V Ts, Tx, Tm, Ty, Ta, TA, Tf, TB, To, Tr, Tq; + To = LD(&(x[0]), ms, &(x[0])); + Tq = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tr = VZMUL(Tp, Tq); + Ts = VSUB(To, Tr); + Tx = VADD(To, Tr); + { + V Ti, Tl, Th, Tk; + Th = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Ti = VZMUL(T5, Th); + Tk = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tl = VZMUL(Tj, Tk); + Tm = VSUB(Ti, Tl); + Ty = VADD(Ti, Tl); + } + { + V T3, T9, T2, T8; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = VZMUL(T1, T2); + T8 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T9 = VZMUL(T7, T8); + Ta = VSUB(T3, T9); + TA = VADD(T3, T9); + } + { + V Tc, Te, Tb, Td; + Tb = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tc = VZMUL(T6, Tb); + Td = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Te = VZMUL(T4, Td); + Tf = VSUB(Tc, Te); + TB = VADD(Tc, Te); + } + { + V Tz, TC, TD, TE; + Tz = VSUB(Tx, Ty); + TC = VBYI(VSUB(TA, TB)); + ST(&(x[WS(rs, 6)]), VSUB(Tz, TC), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tz, TC), ms, &(x[0])); + TD = VADD(Tx, Ty); + TE = VADD(TA, TB); + ST(&(x[WS(rs, 4)]), VSUB(TD, TE), ms, &(x[0])); + ST(&(x[0]), VADD(TD, TE), ms, &(x[0])); + { + V Tn, Tv, Tu, Tw, Tg, Tt; + Tg = VMUL(LDK(KP707106781), VSUB(Ta, Tf)); + Tn = VBYI(VSUB(Tg, Tm)); + Tv = VBYI(VADD(Tm, Tg)); + Tt = VMUL(LDK(KP707106781), VADD(Ta, Tf)); + Tu = VSUB(Ts, Tt); + Tw = VADD(Ts, Tt); + ST(&(x[WS(rs, 3)]), VADD(Tn, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VSUB(Tw, Tv), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tu, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tv, Tw), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t3bv_8"), twinstr, &GENUS, {37, 24, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3bv_8) (planner *p) { + X(kdft_dit_register) (p, t3bv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_10.c new file mode 100644 index 000000000..904d3b11f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_10.c @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 10 -name t3fv_10 -include dft/simd/t3f.h */ + +/* + * This function contains 57 FP additions, 52 FP multiplications, + * (or, 39 additions, 34 multiplications, 18 fused multiply/add), + * 41 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(10, rs)) { + V T2, T3, T4, Ta, T5, T6, Tt, Td, Th; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMUL(T2, T3); + Ta = VZMULJ(T2, T3); + T5 = LDW(&(W[TWVL * 4])); + T6 = VZMULJ(T4, T5); + Tt = VZMULJ(T3, T5); + Td = VZMULJ(Ta, T5); + Th = VZMULJ(T2, T5); + { + V T9, TJ, Ts, Ty, Tz, TN, TO, TP, Tg, Tm, Tn, TK, TL, TM, T1; + V T8, T7; + T1 = LD(&(x[0]), ms, &(x[0])); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = VZMULJ(T6, T7); + T9 = VSUB(T1, T8); + TJ = VADD(T1, T8); + { + V Tp, Tx, Tr, Tv; + { + V To, Tw, Tq, Tu; + To = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tp = VZMULJ(T4, To); + Tw = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tx = VZMULJ(T2, Tw); + Tq = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tr = VZMULJ(T5, Tq); + Tu = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tv = VZMULJ(Tt, Tu); + } + Ts = VSUB(Tp, Tr); + Ty = VSUB(Tv, Tx); + Tz = VADD(Ts, Ty); + TN = VADD(Tp, Tr); + TO = VADD(Tv, Tx); + TP = VADD(TN, TO); + } + { + V Tc, Tl, Tf, Tj; + { + V Tb, Tk, Te, Ti; + Tb = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tc = VZMULJ(Ta, Tb); + Tk = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tl = VZMULJ(T3, Tk); + Te = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Tf = VZMULJ(Td, Te); + Ti = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Tj = VZMULJ(Th, Ti); + } + Tg = VSUB(Tc, Tf); + Tm = VSUB(Tj, Tl); + Tn = VADD(Tg, Tm); + TK = VADD(Tc, Tf); + TL = VADD(Tj, Tl); + TM = VADD(TK, TL); + } + { + V TC, TA, TB, TG, TI, TE, TF, TH, TD; + TC = VSUB(Tn, Tz); + TA = VADD(Tn, Tz); + TB = VFNMS(LDK(KP250000000), TA, T9); + TE = VSUB(Tg, Tm); + TF = VSUB(Ts, Ty); + TG = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TF, TE)); + TI = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TE, TF)); + ST(&(x[WS(rs, 5)]), VADD(T9, TA), ms, &(x[WS(rs, 1)])); + TH = VFNMS(LDK(KP559016994), TC, TB); + ST(&(x[WS(rs, 3)]), VFNMSI(TI, TH), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(TI, TH), ms, &(x[WS(rs, 1)])); + TD = VFMA(LDK(KP559016994), TC, TB); + ST(&(x[WS(rs, 1)]), VFNMSI(TG, TD), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VFMAI(TG, TD), ms, &(x[WS(rs, 1)])); + } + { + V TS, TQ, TR, TW, TY, TU, TV, TX, TT; + TS = VSUB(TM, TP); + TQ = VADD(TM, TP); + TR = VFNMS(LDK(KP250000000), TQ, TJ); + TU = VSUB(TN, TO); + TV = VSUB(TK, TL); + TW = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TV, TU)); + TY = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TU, TV)); + ST(&(x[0]), VADD(TJ, TQ), ms, &(x[0])); + TX = VFMA(LDK(KP559016994), TS, TR); + ST(&(x[WS(rs, 4)]), VFMAI(TY, TX), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VFNMSI(TY, TX), ms, &(x[0])); + TT = VFNMS(LDK(KP559016994), TS, TR); + ST(&(x[WS(rs, 2)]), VFMAI(TW, TT), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFNMSI(TW, TT), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t3fv_10"), twinstr, &GENUS, {39, 34, 18, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_10) (planner *p) { + X(kdft_dit_register) (p, t3fv_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 10 -name t3fv_10 -include dft/simd/t3f.h */ + +/* + * This function contains 57 FP additions, 42 FP multiplications, + * (or, 51 additions, 36 multiplications, 6 fused multiply/add), + * 41 stack variables, 4 constants, and 20 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_10(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(10, rs)) { + V T1, T2, T3, Ti, T6, T7, Tx, Tb, To; + T1 = LDW(&(W[0])); + T2 = LDW(&(W[TWVL * 2])); + T3 = VZMULJ(T1, T2); + Ti = VZMUL(T1, T2); + T6 = LDW(&(W[TWVL * 4])); + T7 = VZMULJ(T3, T6); + Tx = VZMULJ(Ti, T6); + Tb = VZMULJ(T1, T6); + To = VZMULJ(T2, T6); + { + V TA, TQ, Tn, Tt, Tu, TJ, TK, TS, Ta, Tg, Th, TM, TN, TR, Tw; + V Tz, Ty; + Tw = LD(&(x[0]), ms, &(x[0])); + Ty = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tz = VZMULJ(Tx, Ty); + TA = VSUB(Tw, Tz); + TQ = VADD(Tw, Tz); + { + V Tk, Ts, Tm, Tq; + { + V Tj, Tr, Tl, Tp; + Tj = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tk = VZMULJ(Ti, Tj); + Tr = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ts = VZMULJ(T1, Tr); + Tl = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tm = VZMULJ(T6, Tl); + Tp = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tq = VZMULJ(To, Tp); + } + Tn = VSUB(Tk, Tm); + Tt = VSUB(Tq, Ts); + Tu = VADD(Tn, Tt); + TJ = VADD(Tk, Tm); + TK = VADD(Tq, Ts); + TS = VADD(TJ, TK); + } + { + V T5, Tf, T9, Td; + { + V T4, Te, T8, Tc; + T4 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T5 = VZMULJ(T3, T4); + Te = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tf = VZMULJ(T2, Te); + T8 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T9 = VZMULJ(T7, T8); + Tc = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Td = VZMULJ(Tb, Tc); + } + Ta = VSUB(T5, T9); + Tg = VSUB(Td, Tf); + Th = VADD(Ta, Tg); + TM = VADD(T5, T9); + TN = VADD(Td, Tf); + TR = VADD(TM, TN); + } + { + V Tv, TB, TC, TG, TI, TE, TF, TH, TD; + Tv = VMUL(LDK(KP559016994), VSUB(Th, Tu)); + TB = VADD(Th, Tu); + TC = VFNMS(LDK(KP250000000), TB, TA); + TE = VSUB(Ta, Tg); + TF = VSUB(Tn, Tt); + TG = VBYI(VFMA(LDK(KP951056516), TE, VMUL(LDK(KP587785252), TF))); + TI = VBYI(VFNMS(LDK(KP587785252), TE, VMUL(LDK(KP951056516), TF))); + ST(&(x[WS(rs, 5)]), VADD(TA, TB), ms, &(x[WS(rs, 1)])); + TH = VSUB(TC, Tv); + ST(&(x[WS(rs, 3)]), VSUB(TH, TI), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(TI, TH), ms, &(x[WS(rs, 1)])); + TD = VADD(Tv, TC); + ST(&(x[WS(rs, 1)]), VSUB(TD, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(TG, TD), ms, &(x[WS(rs, 1)])); + } + { + V TV, TT, TU, TP, TX, TL, TO, TY, TW; + TV = VMUL(LDK(KP559016994), VSUB(TR, TS)); + TT = VADD(TR, TS); + TU = VFNMS(LDK(KP250000000), TT, TQ); + TL = VSUB(TJ, TK); + TO = VSUB(TM, TN); + TP = VBYI(VFNMS(LDK(KP587785252), TO, VMUL(LDK(KP951056516), TL))); + TX = VBYI(VFMA(LDK(KP951056516), TO, VMUL(LDK(KP587785252), TL))); + ST(&(x[0]), VADD(TQ, TT), ms, &(x[0])); + TY = VADD(TV, TU); + ST(&(x[WS(rs, 4)]), VADD(TX, TY), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VSUB(TY, TX), ms, &(x[0])); + TW = VSUB(TU, TV); + ST(&(x[WS(rs, 2)]), VADD(TP, TW), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VSUB(TW, TP), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 10, XSIMD_STRING("t3fv_10"), twinstr, &GENUS, {51, 36, 6, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_10) (planner *p) { + X(kdft_dit_register) (p, t3fv_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_16.c new file mode 100644 index 000000000..0b36767ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_16.c @@ -0,0 +1,440 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 16 -name t3fv_16 -include dft/simd/t3f.h */ + +/* + * This function contains 98 FP additions, 86 FP multiplications, + * (or, 64 additions, 52 multiplications, 34 fused multiply/add), + * 51 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(16, rs)) { + V T2, T8, T9, Tx, Tu, TL, T3, T4, TO, TU, Tc, Tm, Ty, TE, Tp; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T2, T8); + Tx = VZMULJ(T2, T8); + Tu = LDW(&(W[TWVL * 6])); + TL = VZMULJ(T2, Tu); + T3 = LDW(&(W[TWVL * 4])); + T4 = VZMULJ(T2, T3); + TO = VZMULJ(T8, T3); + TU = VZMUL(T2, T3); + Tc = VZMUL(T8, T3); + Tm = VZMULJ(T9, T3); + Ty = VZMULJ(Tx, T3); + TE = VZMUL(Tx, T3); + Tp = VZMUL(T9, T3); + { + V T7, T1b, Tf, T1o, TR, TX, T1e, T1p, Tl, Ts, Tt, T1i, T1r, TB, TH; + V TI, T1l, T1s, T1, T6, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + T7 = VADD(T1, T6); + T1b = VSUB(T1, T6); + { + V Tb, Te, Ta, Td; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = VZMULJ(T9, Ta); + Td = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Te = VZMULJ(Tc, Td); + Tf = VADD(Tb, Te); + T1o = VSUB(Tb, Te); + } + { + V TN, TW, TQ, TT, T1c, T1d; + { + V TM, TV, TP, TS; + TM = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TN = VZMULJ(TL, TM); + TV = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TW = VZMULJ(TU, TV); + TP = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TQ = VZMULJ(TO, TP); + TS = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TT = VZMULJ(Tx, TS); + } + TR = VADD(TN, TQ); + TX = VADD(TT, TW); + T1c = VSUB(TT, TW); + T1d = VSUB(TN, TQ); + T1e = VADD(T1c, T1d); + T1p = VSUB(T1d, T1c); + } + { + V Ti, Tr, Tk, To, T1g, T1h; + { + V Th, Tq, Tj, Tn; + Th = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Ti = VZMULJ(T2, Th); + Tq = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tr = VZMULJ(Tp, Tq); + Tj = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tk = VZMULJ(T3, Tj); + Tn = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + To = VZMULJ(Tm, Tn); + } + Tl = VADD(Ti, Tk); + Ts = VADD(To, Tr); + Tt = VSUB(Tl, Ts); + T1g = VSUB(Ti, Tk); + T1h = VSUB(To, Tr); + T1i = VFNMS(LDK(KP414213562), T1h, T1g); + T1r = VFMA(LDK(KP414213562), T1g, T1h); + } + { + V Tw, TG, TA, TD, T1j, T1k; + { + V Tv, TF, Tz, TC; + Tv = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tw = VZMULJ(Tu, Tv); + TF = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TG = VZMULJ(TE, TF); + Tz = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + TA = VZMULJ(Ty, Tz); + TC = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + TD = VZMULJ(T8, TC); + } + TB = VADD(Tw, TA); + TH = VADD(TD, TG); + TI = VSUB(TB, TH); + T1j = VSUB(Tw, TA); + T1k = VSUB(TG, TD); + T1l = VFNMS(LDK(KP414213562), T1k, T1j); + T1s = VFMA(LDK(KP414213562), T1j, T1k); + } + { + V TK, T11, T10, T12; + { + V Tg, TJ, TY, TZ; + Tg = VSUB(T7, Tf); + TJ = VADD(Tt, TI); + TK = VFNMS(LDK(KP707106781), TJ, Tg); + T11 = VFMA(LDK(KP707106781), TJ, Tg); + TY = VSUB(TR, TX); + TZ = VSUB(TI, Tt); + T10 = VFNMS(LDK(KP707106781), TZ, TY); + T12 = VFMA(LDK(KP707106781), TZ, TY); + } + ST(&(x[WS(rs, 6)]), VFNMSI(T10, TK), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T12, T11), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VFMAI(T10, TK), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFNMSI(T12, T11), ms, &(x[0])); + } + { + V T1z, T1D, T1C, T1E; + { + V T1x, T1y, T1A, T1B; + T1x = VFNMS(LDK(KP707106781), T1e, T1b); + T1y = VADD(T1r, T1s); + T1z = VFNMS(LDK(KP923879532), T1y, T1x); + T1D = VFMA(LDK(KP923879532), T1y, T1x); + T1A = VFMA(LDK(KP707106781), T1p, T1o); + T1B = VSUB(T1l, T1i); + T1C = VFNMS(LDK(KP923879532), T1B, T1A); + T1E = VFMA(LDK(KP923879532), T1B, T1A); + } + ST(&(x[WS(rs, 5)]), VFNMSI(T1C, T1z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VFNMSI(T1E, T1D), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T1C, T1z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T1E, T1D), ms, &(x[WS(rs, 1)])); + } + { + V T15, T19, T18, T1a; + { + V T13, T14, T16, T17; + T13 = VADD(T7, Tf); + T14 = VADD(TX, TR); + T15 = VADD(T13, T14); + T19 = VSUB(T13, T14); + T16 = VADD(Tl, Ts); + T17 = VADD(TB, TH); + T18 = VADD(T16, T17); + T1a = VSUB(T17, T16); + } + ST(&(x[WS(rs, 8)]), VSUB(T15, T18), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T1a, T19), ms, &(x[0])); + ST(&(x[0]), VADD(T15, T18), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFNMSI(T1a, T19), ms, &(x[0])); + } + { + V T1n, T1v, T1u, T1w; + { + V T1f, T1m, T1q, T1t; + T1f = VFMA(LDK(KP707106781), T1e, T1b); + T1m = VADD(T1i, T1l); + T1n = VFNMS(LDK(KP923879532), T1m, T1f); + T1v = VFMA(LDK(KP923879532), T1m, T1f); + T1q = VFNMS(LDK(KP707106781), T1p, T1o); + T1t = VSUB(T1r, T1s); + T1u = VFNMS(LDK(KP923879532), T1t, T1q); + T1w = VFMA(LDK(KP923879532), T1t, T1q); + } + ST(&(x[WS(rs, 9)]), VFNMSI(T1u, T1n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T1w, T1v), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T1u, T1n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VFNMSI(T1w, T1v), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t3fv_16"), twinstr, &GENUS, {64, 52, 34, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_16) (planner *p) { + X(kdft_dit_register) (p, t3fv_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 16 -name t3fv_16 -include dft/simd/t3f.h */ + +/* + * This function contains 98 FP additions, 64 FP multiplications, + * (or, 94 additions, 60 multiplications, 4 fused multiply/add), + * 51 stack variables, 3 constants, and 32 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_16(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(16, rs)) { + V T4, T5, T6, To, T1, Ty, T7, T8, TO, TV, Te, Tp, TB, TH, Ts; + T4 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 2])); + T6 = VZMULJ(T4, T5); + To = VZMUL(T4, T5); + T1 = LDW(&(W[TWVL * 6])); + Ty = VZMULJ(T4, T1); + T7 = LDW(&(W[TWVL * 4])); + T8 = VZMULJ(T6, T7); + TO = VZMUL(T5, T7); + TV = VZMULJ(T4, T7); + Te = VZMUL(T6, T7); + Tp = VZMULJ(To, T7); + TB = VZMULJ(T5, T7); + TH = VZMUL(T4, T7); + Ts = VZMUL(To, T7); + { + V TY, T1f, TR, T1g, T1q, T1r, TL, TZ, T1l, T1m, T1n, Ti, T12, T1i, T1j; + V T1k, Tw, T11, TU, TX, TW; + TU = LD(&(x[0]), ms, &(x[0])); + TW = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + TX = VZMULJ(TV, TW); + TY = VSUB(TU, TX); + T1f = VADD(TU, TX); + { + V TN, TQ, TM, TP; + TM = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + TN = VZMULJ(To, TM); + TP = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + TQ = VZMULJ(TO, TP); + TR = VSUB(TN, TQ); + T1g = VADD(TN, TQ); + } + { + V TA, TJ, TD, TG, TE, TK; + { + V Tz, TI, TC, TF; + Tz = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TA = VZMULJ(Ty, Tz); + TI = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TJ = VZMULJ(TH, TI); + TC = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TD = VZMULJ(TB, TC); + TF = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TG = VZMULJ(T6, TF); + } + T1q = VADD(TA, TD); + T1r = VADD(TG, TJ); + TE = VSUB(TA, TD); + TK = VSUB(TG, TJ); + TL = VMUL(LDK(KP707106781), VSUB(TE, TK)); + TZ = VMUL(LDK(KP707106781), VADD(TK, TE)); + } + { + V T3, Tg, Ta, Td, Tb, Th; + { + V T2, Tf, T9, Tc; + T2 = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T3 = VZMULJ(T1, T2); + Tf = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tg = VZMULJ(Te, Tf); + T9 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Ta = VZMULJ(T8, T9); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = VZMULJ(T5, Tc); + } + T1l = VADD(T3, Ta); + T1m = VADD(Td, Tg); + T1n = VSUB(T1l, T1m); + Tb = VSUB(T3, Ta); + Th = VSUB(Td, Tg); + Ti = VFNMS(LDK(KP923879532), Th, VMUL(LDK(KP382683432), Tb)); + T12 = VFMA(LDK(KP923879532), Tb, VMUL(LDK(KP382683432), Th)); + } + { + V Tk, Tu, Tm, Tr, Tn, Tv; + { + V Tj, Tt, Tl, Tq; + Tj = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tk = VZMULJ(T4, Tj); + Tt = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + Tu = VZMULJ(Ts, Tt); + Tl = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + Tm = VZMULJ(T7, Tl); + Tq = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Tr = VZMULJ(Tp, Tq); + } + T1i = VADD(Tk, Tm); + T1j = VADD(Tr, Tu); + T1k = VSUB(T1i, T1j); + Tn = VSUB(Tk, Tm); + Tv = VSUB(Tr, Tu); + Tw = VFMA(LDK(KP382683432), Tn, VMUL(LDK(KP923879532), Tv)); + T11 = VFNMS(LDK(KP382683432), Tv, VMUL(LDK(KP923879532), Tn)); + } + { + V T1p, T1v, T1u, T1w; + { + V T1h, T1o, T1s, T1t; + T1h = VSUB(T1f, T1g); + T1o = VMUL(LDK(KP707106781), VADD(T1k, T1n)); + T1p = VADD(T1h, T1o); + T1v = VSUB(T1h, T1o); + T1s = VSUB(T1q, T1r); + T1t = VMUL(LDK(KP707106781), VSUB(T1n, T1k)); + T1u = VBYI(VADD(T1s, T1t)); + T1w = VBYI(VSUB(T1t, T1s)); + } + ST(&(x[WS(rs, 14)]), VSUB(T1p, T1u), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T1v, T1w), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T1p, T1u), ms, &(x[0])); + ST(&(x[WS(rs, 10)]), VSUB(T1v, T1w), ms, &(x[0])); + } + { + V T1z, T1D, T1C, T1E; + { + V T1x, T1y, T1A, T1B; + T1x = VADD(T1f, T1g); + T1y = VADD(T1r, T1q); + T1z = VADD(T1x, T1y); + T1D = VSUB(T1x, T1y); + T1A = VADD(T1i, T1j); + T1B = VADD(T1l, T1m); + T1C = VADD(T1A, T1B); + T1E = VBYI(VSUB(T1B, T1A)); + } + ST(&(x[WS(rs, 8)]), VSUB(T1z, T1C), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T1D, T1E), ms, &(x[0])); + ST(&(x[0]), VADD(T1z, T1C), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VSUB(T1D, T1E), ms, &(x[0])); + } + { + V TT, T15, T14, T16; + { + V Tx, TS, T10, T13; + Tx = VSUB(Ti, Tw); + TS = VSUB(TL, TR); + TT = VBYI(VSUB(Tx, TS)); + T15 = VBYI(VADD(TS, Tx)); + T10 = VADD(TY, TZ); + T13 = VADD(T11, T12); + T14 = VSUB(T10, T13); + T16 = VADD(T10, T13); + } + ST(&(x[WS(rs, 7)]), VADD(TT, T14), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VSUB(T16, T15), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VSUB(T14, TT), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T15, T16), ms, &(x[WS(rs, 1)])); + } + { + V T19, T1d, T1c, T1e; + { + V T17, T18, T1a, T1b; + T17 = VSUB(TY, TZ); + T18 = VADD(Tw, Ti); + T19 = VADD(T17, T18); + T1d = VSUB(T17, T18); + T1a = VADD(TR, TL); + T1b = VSUB(T12, T11); + T1c = VBYI(VADD(T1a, T1b)); + T1e = VBYI(VSUB(T1b, T1a)); + } + ST(&(x[WS(rs, 13)]), VSUB(T19, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VADD(T1d, T1e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T19, T1c), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VSUB(T1d, T1e), ms, &(x[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 15), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 16, XSIMD_STRING("t3fv_16"), twinstr, &GENUS, {94, 60, 4, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_16) (planner *p) { + X(kdft_dit_register) (p, t3fv_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_20.c new file mode 100644 index 000000000..ac02707e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_20.c @@ -0,0 +1,540 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 20 -name t3fv_20 -include dft/simd/t3f.h */ + +/* + * This function contains 138 FP additions, 118 FP multiplications, + * (or, 92 additions, 72 multiplications, 46 fused multiply/add), + * 73 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(20, rs)) { + V T2, T8, T9, TA, T3, Tc, T4, TZ, T18, Tl, Tq, Tx, TU, Td, Te; + V T15, Ti, Tt, TJ; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T2, T8); + TA = VZMULJ(T2, T8); + T3 = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(T9, T3); + T4 = VZMUL(T2, T3); + TZ = VZMUL(T9, T3); + T18 = VZMULJ(TA, T3); + Tl = VZMULJ(T8, T3); + Tq = VZMULJ(T2, T3); + Tx = VZMUL(T8, T3); + TU = VZMUL(TA, T3); + Td = LDW(&(W[TWVL * 6])); + Te = VZMULJ(Tc, Td); + T15 = VZMULJ(TA, Td); + Ti = VZMULJ(T8, Td); + Tt = VZMULJ(T2, Td); + TJ = VZMULJ(T9, Td); + { + V T7, TM, T1F, T23, T1i, T1p, T1q, T1j, Tp, TE, TF, T27, T28, T29, T1P; + V T1S, T1T, TY, T1c, T1d, T24, T25, T26, T1I, T1L, T1M, TG, T1e; + { + V T1, TL, T6, TI, TK, T5, TH, T1D, T1E; + T1 = LD(&(x[0]), ms, &(x[0])); + TK = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + TL = VZMULJ(TJ, TK); + T5 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + TH = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TI = VZMULJ(Tc, TH); + T7 = VSUB(T1, T6); + TM = VSUB(TI, TL); + T1D = VADD(T1, T6); + T1E = VADD(TI, TL); + T1F = VSUB(T1D, T1E); + T23 = VADD(T1D, T1E); + } + { + V Th, T1G, T14, T1O, T1b, T1R, To, T1J, Tw, T1N, TR, T1H, TX, T1K, TD; + V T1Q; + { + V Tb, Tg, Ta, Tf; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = VZMULJ(T9, Ta); + Tf = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tg = VZMULJ(Te, Tf); + Th = VSUB(Tb, Tg); + T1G = VADD(Tb, Tg); + } + { + V T11, T13, T10, T12; + T10 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T11 = VZMULJ(TZ, T10); + T12 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T13 = VZMULJ(T8, T12); + T14 = VSUB(T11, T13); + T1O = VADD(T11, T13); + } + { + V T17, T1a, T16, T19; + T16 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T17 = VZMULJ(T15, T16); + T19 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1a = VZMULJ(T18, T19); + T1b = VSUB(T17, T1a); + T1R = VADD(T17, T1a); + } + { + V Tk, Tn, Tj, Tm; + Tj = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tk = VZMULJ(Ti, Tj); + Tm = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tn = VZMULJ(Tl, Tm); + To = VSUB(Tk, Tn); + T1J = VADD(Tk, Tn); + } + { + V Ts, Tv, Tr, Tu; + Tr = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Ts = VZMULJ(Tq, Tr); + Tu = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tv = VZMULJ(Tt, Tu); + Tw = VSUB(Ts, Tv); + T1N = VADD(Ts, Tv); + } + { + V TO, TQ, TN, TP; + TN = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TO = VZMULJ(T3, TN); + TP = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TQ = VZMULJ(Td, TP); + TR = VSUB(TO, TQ); + T1H = VADD(TO, TQ); + } + { + V TT, TW, TS, TV; + TS = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TT = VZMULJ(T2, TS); + TV = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TW = VZMULJ(TU, TV); + TX = VSUB(TT, TW); + T1K = VADD(TT, TW); + } + { + V Tz, TC, Ty, TB; + Ty = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tz = VZMULJ(Tx, Ty); + TB = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TC = VZMULJ(TA, TB); + TD = VSUB(Tz, TC); + T1Q = VADD(Tz, TC); + } + T1i = VSUB(TX, TR); + T1p = VSUB(Th, To); + T1q = VSUB(Tw, TD); + T1j = VSUB(T1b, T14); + Tp = VADD(Th, To); + TE = VADD(Tw, TD); + TF = VADD(Tp, TE); + T27 = VADD(T1N, T1O); + T28 = VADD(T1Q, T1R); + T29 = VADD(T27, T28); + T1P = VSUB(T1N, T1O); + T1S = VSUB(T1Q, T1R); + T1T = VADD(T1P, T1S); + TY = VADD(TR, TX); + T1c = VADD(T14, T1b); + T1d = VADD(TY, T1c); + T24 = VADD(T1G, T1H); + T25 = VADD(T1J, T1K); + T26 = VADD(T24, T25); + T1I = VSUB(T1G, T1H); + T1L = VSUB(T1J, T1K); + T1M = VADD(T1I, T1L); + } + TG = VADD(T7, TF); + T1e = VADD(TM, T1d); + ST(&(x[WS(rs, 5)]), VFNMSI(T1e, TG), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T1e, TG), ms, &(x[WS(rs, 1)])); + { + V T2c, T2a, T2b, T2g, T2i, T2e, T2f, T2h, T2d; + T2c = VSUB(T26, T29); + T2a = VADD(T26, T29); + T2b = VFNMS(LDK(KP250000000), T2a, T23); + T2e = VSUB(T24, T25); + T2f = VSUB(T27, T28); + T2g = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T2f, T2e)); + T2i = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T2e, T2f)); + ST(&(x[0]), VADD(T23, T2a), ms, &(x[0])); + T2h = VFNMS(LDK(KP559016994), T2c, T2b); + ST(&(x[WS(rs, 8)]), VFNMSI(T2i, T2h), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VFMAI(T2i, T2h), ms, &(x[0])); + T2d = VFMA(LDK(KP559016994), T2c, T2b); + ST(&(x[WS(rs, 4)]), VFMAI(T2g, T2d), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VFNMSI(T2g, T2d), ms, &(x[0])); + } + { + V T1W, T1U, T1V, T20, T22, T1Y, T1Z, T21, T1X; + T1W = VSUB(T1M, T1T); + T1U = VADD(T1M, T1T); + T1V = VFNMS(LDK(KP250000000), T1U, T1F); + T1Y = VSUB(T1P, T1S); + T1Z = VSUB(T1I, T1L); + T20 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1Z, T1Y)); + T22 = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1Y, T1Z)); + ST(&(x[WS(rs, 10)]), VADD(T1F, T1U), ms, &(x[0])); + T21 = VFMA(LDK(KP559016994), T1W, T1V); + ST(&(x[WS(rs, 6)]), VFNMSI(T22, T21), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFMAI(T22, T21), ms, &(x[0])); + T1X = VFNMS(LDK(KP559016994), T1W, T1V); + ST(&(x[WS(rs, 2)]), VFMAI(T20, T1X), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFNMSI(T20, T1X), ms, &(x[0])); + } + { + V T1k, T1r, T1z, T1w, T1o, T1y, T1h, T1v; + T1k = VFMA(LDK(KP618033988), T1j, T1i); + T1r = VFMA(LDK(KP618033988), T1q, T1p); + T1z = VFNMS(LDK(KP618033988), T1p, T1q); + T1w = VFNMS(LDK(KP618033988), T1i, T1j); + { + V T1m, T1n, T1f, T1g; + T1m = VFNMS(LDK(KP250000000), T1d, TM); + T1n = VSUB(T1c, TY); + T1o = VFNMS(LDK(KP559016994), T1n, T1m); + T1y = VFMA(LDK(KP559016994), T1n, T1m); + T1f = VFNMS(LDK(KP250000000), TF, T7); + T1g = VSUB(Tp, TE); + T1h = VFMA(LDK(KP559016994), T1g, T1f); + T1v = VFNMS(LDK(KP559016994), T1g, T1f); + } + { + V T1l, T1s, T1B, T1C; + T1l = VFMA(LDK(KP951056516), T1k, T1h); + T1s = VFMA(LDK(KP951056516), T1r, T1o); + ST(&(x[WS(rs, 1)]), VFNMSI(T1s, T1l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VFMAI(T1s, T1l), ms, &(x[WS(rs, 1)])); + T1B = VFMA(LDK(KP951056516), T1w, T1v); + T1C = VFMA(LDK(KP951056516), T1z, T1y); + ST(&(x[WS(rs, 13)]), VFNMSI(T1C, T1B), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T1C, T1B), ms, &(x[WS(rs, 1)])); + } + { + V T1t, T1u, T1x, T1A; + T1t = VFNMS(LDK(KP951056516), T1k, T1h); + T1u = VFNMS(LDK(KP951056516), T1r, T1o); + ST(&(x[WS(rs, 9)]), VFNMSI(T1u, T1t), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFMAI(T1u, T1t), ms, &(x[WS(rs, 1)])); + T1x = VFNMS(LDK(KP951056516), T1w, T1v); + T1A = VFNMS(LDK(KP951056516), T1z, T1y); + ST(&(x[WS(rs, 17)]), VFNMSI(T1A, T1x), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T1A, T1x), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t3fv_20"), twinstr, &GENUS, {92, 72, 46, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_20) (planner *p) { + X(kdft_dit_register) (p, t3fv_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 20 -name t3fv_20 -include dft/simd/t3f.h */ + +/* + * This function contains 138 FP additions, 92 FP multiplications, + * (or, 126 additions, 80 multiplications, 12 fused multiply/add), + * 73 stack variables, 4 constants, and 40 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_20(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(20, rs)) { + V T2, T8, T9, TA, T3, Tc, T4, TZ, T18, Tl, Tq, Tx, TU, Td, Te; + V T15, Ti, Tt, TJ; + T2 = LDW(&(W[0])); + T8 = LDW(&(W[TWVL * 2])); + T9 = VZMUL(T2, T8); + TA = VZMULJ(T2, T8); + T3 = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(T9, T3); + T4 = VZMUL(T2, T3); + TZ = VZMUL(T9, T3); + T18 = VZMULJ(TA, T3); + Tl = VZMULJ(T8, T3); + Tq = VZMULJ(T2, T3); + Tx = VZMUL(T8, T3); + TU = VZMUL(TA, T3); + Td = LDW(&(W[TWVL * 6])); + Te = VZMULJ(Tc, Td); + T15 = VZMULJ(TA, Td); + Ti = VZMULJ(T8, Td); + Tt = VZMULJ(T2, Td); + TJ = VZMULJ(T9, Td); + { + V T7, TM, T1U, T2d, T1i, T1p, T1q, T1j, Tp, TE, TF, T26, T27, T2b, T1M; + V T1P, T1V, TY, T1c, T1d, T23, T24, T2a, T1F, T1I, T1W, TG, T1e; + { + V T1, TL, T6, TI, TK, T5, TH, T1S, T1T; + T1 = LD(&(x[0]), ms, &(x[0])); + TK = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + TL = VZMULJ(TJ, TK); + T5 = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + TH = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + TI = VZMULJ(Tc, TH); + T7 = VSUB(T1, T6); + TM = VSUB(TI, TL); + T1S = VADD(T1, T6); + T1T = VADD(TI, TL); + T1U = VSUB(T1S, T1T); + T2d = VADD(T1S, T1T); + } + { + V Th, T1K, T14, T1E, T1b, T1H, To, T1N, Tw, T1D, TR, T1L, TX, T1O, TD; + V T1G; + { + V Tb, Tg, Ta, Tf; + Ta = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Tb = VZMULJ(T9, Ta); + Tf = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + Tg = VZMULJ(Te, Tf); + Th = VSUB(Tb, Tg); + T1K = VADD(Tb, Tg); + } + { + V T11, T13, T10, T12; + T10 = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T11 = VZMULJ(TZ, T10); + T12 = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T13 = VZMULJ(T8, T12); + T14 = VSUB(T11, T13); + T1E = VADD(T11, T13); + } + { + V T17, T1a, T16, T19; + T16 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T17 = VZMULJ(T15, T16); + T19 = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1a = VZMULJ(T18, T19); + T1b = VSUB(T17, T1a); + T1H = VADD(T17, T1a); + } + { + V Tk, Tn, Tj, Tm; + Tj = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Tk = VZMULJ(Ti, Tj); + Tm = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tn = VZMULJ(Tl, Tm); + To = VSUB(Tk, Tn); + T1N = VADD(Tk, Tn); + } + { + V Ts, Tv, Tr, Tu; + Tr = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + Ts = VZMULJ(Tq, Tr); + Tu = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tv = VZMULJ(Tt, Tu); + Tw = VSUB(Ts, Tv); + T1D = VADD(Ts, Tv); + } + { + V TO, TQ, TN, TP; + TN = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TO = VZMULJ(T3, TN); + TP = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TQ = VZMULJ(Td, TP); + TR = VSUB(TO, TQ); + T1L = VADD(TO, TQ); + } + { + V TT, TW, TS, TV; + TS = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TT = VZMULJ(T2, TS); + TV = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TW = VZMULJ(TU, TV); + TX = VSUB(TT, TW); + T1O = VADD(TT, TW); + } + { + V Tz, TC, Ty, TB; + Ty = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tz = VZMULJ(Tx, Ty); + TB = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + TC = VZMULJ(TA, TB); + TD = VSUB(Tz, TC); + T1G = VADD(Tz, TC); + } + T1i = VSUB(TX, TR); + T1p = VSUB(Th, To); + T1q = VSUB(Tw, TD); + T1j = VSUB(T1b, T14); + Tp = VADD(Th, To); + TE = VADD(Tw, TD); + TF = VADD(Tp, TE); + T26 = VADD(T1D, T1E); + T27 = VADD(T1G, T1H); + T2b = VADD(T26, T27); + T1M = VSUB(T1K, T1L); + T1P = VSUB(T1N, T1O); + T1V = VADD(T1M, T1P); + TY = VADD(TR, TX); + T1c = VADD(T14, T1b); + T1d = VADD(TY, T1c); + T23 = VADD(T1K, T1L); + T24 = VADD(T1N, T1O); + T2a = VADD(T23, T24); + T1F = VSUB(T1D, T1E); + T1I = VSUB(T1G, T1H); + T1W = VADD(T1F, T1I); + } + TG = VADD(T7, TF); + T1e = VBYI(VADD(TM, T1d)); + ST(&(x[WS(rs, 5)]), VSUB(TG, T1e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VADD(TG, T1e), ms, &(x[WS(rs, 1)])); + { + V T2c, T2e, T2f, T29, T2i, T25, T28, T2h, T2g; + T2c = VMUL(LDK(KP559016994), VSUB(T2a, T2b)); + T2e = VADD(T2a, T2b); + T2f = VFNMS(LDK(KP250000000), T2e, T2d); + T25 = VSUB(T23, T24); + T28 = VSUB(T26, T27); + T29 = VBYI(VFMA(LDK(KP951056516), T25, VMUL(LDK(KP587785252), T28))); + T2i = VBYI(VFNMS(LDK(KP587785252), T25, VMUL(LDK(KP951056516), T28))); + ST(&(x[0]), VADD(T2d, T2e), ms, &(x[0])); + T2h = VSUB(T2f, T2c); + ST(&(x[WS(rs, 8)]), VSUB(T2h, T2i), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T2i, T2h), ms, &(x[0])); + T2g = VADD(T2c, T2f); + ST(&(x[WS(rs, 4)]), VADD(T29, T2g), ms, &(x[0])); + ST(&(x[WS(rs, 16)]), VSUB(T2g, T29), ms, &(x[0])); + } + { + V T1Z, T1X, T1Y, T1R, T22, T1J, T1Q, T21, T20; + T1Z = VMUL(LDK(KP559016994), VSUB(T1V, T1W)); + T1X = VADD(T1V, T1W); + T1Y = VFNMS(LDK(KP250000000), T1X, T1U); + T1J = VSUB(T1F, T1I); + T1Q = VSUB(T1M, T1P); + T1R = VBYI(VFNMS(LDK(KP587785252), T1Q, VMUL(LDK(KP951056516), T1J))); + T22 = VBYI(VFMA(LDK(KP951056516), T1Q, VMUL(LDK(KP587785252), T1J))); + ST(&(x[WS(rs, 10)]), VADD(T1U, T1X), ms, &(x[0])); + T21 = VADD(T1Z, T1Y); + ST(&(x[WS(rs, 6)]), VSUB(T21, T22), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T22, T21), ms, &(x[0])); + T20 = VSUB(T1Y, T1Z); + ST(&(x[WS(rs, 2)]), VADD(T1R, T20), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VSUB(T20, T1R), ms, &(x[0])); + } + { + V T1k, T1r, T1z, T1w, T1o, T1y, T1h, T1v; + T1k = VFMA(LDK(KP951056516), T1i, VMUL(LDK(KP587785252), T1j)); + T1r = VFMA(LDK(KP951056516), T1p, VMUL(LDK(KP587785252), T1q)); + T1z = VFNMS(LDK(KP587785252), T1p, VMUL(LDK(KP951056516), T1q)); + T1w = VFNMS(LDK(KP587785252), T1i, VMUL(LDK(KP951056516), T1j)); + { + V T1m, T1n, T1f, T1g; + T1m = VFMS(LDK(KP250000000), T1d, TM); + T1n = VMUL(LDK(KP559016994), VSUB(T1c, TY)); + T1o = VADD(T1m, T1n); + T1y = VSUB(T1n, T1m); + T1f = VMUL(LDK(KP559016994), VSUB(Tp, TE)); + T1g = VFNMS(LDK(KP250000000), TF, T7); + T1h = VADD(T1f, T1g); + T1v = VSUB(T1g, T1f); + } + { + V T1l, T1s, T1B, T1C; + T1l = VADD(T1h, T1k); + T1s = VBYI(VSUB(T1o, T1r)); + ST(&(x[WS(rs, 19)]), VSUB(T1l, T1s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1l, T1s), ms, &(x[WS(rs, 1)])); + T1B = VADD(T1v, T1w); + T1C = VBYI(VADD(T1z, T1y)); + ST(&(x[WS(rs, 13)]), VSUB(T1B, T1C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VADD(T1B, T1C), ms, &(x[WS(rs, 1)])); + } + { + V T1t, T1u, T1x, T1A; + T1t = VSUB(T1h, T1k); + T1u = VBYI(VADD(T1r, T1o)); + ST(&(x[WS(rs, 11)]), VSUB(T1t, T1u), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 9)]), VADD(T1t, T1u), ms, &(x[WS(rs, 1)])); + T1x = VSUB(T1v, T1w); + T1A = VBYI(VSUB(T1y, T1z)); + ST(&(x[WS(rs, 17)]), VSUB(T1x, T1A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T1x, T1A), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 19), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 20, XSIMD_STRING("t3fv_20"), twinstr, &GENUS, {126, 80, 12, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_20) (planner *p) { + X(kdft_dit_register) (p, t3fv_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_25.c new file mode 100644 index 000000000..43f04bcce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_25.c @@ -0,0 +1,958 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 25 -name t3fv_25 -include dft/simd/t3f.h */ + +/* + * This function contains 268 FP additions, 281 FP multiplications, + * (or, 87 additions, 100 multiplications, 181 fused multiply/add), + * 171 stack variables, 67 constants, and 50 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP617882369, +0.617882369114440893914546919006756321695042882); + DVK(KP792626838, +0.792626838241819413632131824093538848057784557); + DVK(KP876091699, +0.876091699473550838204498029706869638173524346); + DVK(KP803003575, +0.803003575438660414833440593570376004635464850); + DVK(KP999544308, +0.999544308746292983948881682379742149196758193); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP242145790, +0.242145790282157779872542093866183953459003101); + DVK(KP916574801, +0.916574801383451584742370439148878693530976769); + DVK(KP269969613, +0.269969613759572083574752974412347470060951301); + DVK(KP904730450, +0.904730450839922351881287709692877908104763647); + DVK(KP809385824, +0.809385824416008241660603814668679683846476688); + DVK(KP894834959, +0.894834959464455102997960030820114611498661386); + DVK(KP447417479, +0.447417479732227551498980015410057305749330693); + DVK(KP867381224, +0.867381224396525206773171885031575671309956167); + DVK(KP958953096, +0.958953096729998668045963838399037225970891871); + DVK(KP683113946, +0.683113946453479238701949862233725244439656928); + DVK(KP559154169, +0.559154169276087864842202529084232643714075927); + DVK(KP831864738, +0.831864738706457140726048799369896829771167132); + DVK(KP829049696, +0.829049696159252993975487806364305442437946767); + DVK(KP912575812, +0.912575812670962425556968549836277086778922727); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP262346850, +0.262346850930607871785420028382979691334784273); + DVK(KP860541664, +0.860541664367944677098261680920518816412804187); + DVK(KP681693190, +0.681693190061530575150324149145440022633095390); + DVK(KP560319534, +0.560319534973832390111614715371676131169633784); + DVK(KP897376177, +0.897376177523557693138608077137219684419427330); + DVK(KP855719849, +0.855719849902058969314654733608091555096772472); + DVK(KP949179823, +0.949179823508441261575555465843363271711583843); + DVK(KP952936919, +0.952936919628306576880750665357914584765951388); + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP997675361, +0.997675361079556513670859573984492383596555031); + DVK(KP237294955, +0.237294955877110315393888866460840817927895961); + DVK(KP904508497, +0.904508497187473712051146708591409529430077295); + DVK(KP906616052, +0.906616052148196230441134447086066874408359177); + DVK(KP923225144, +0.923225144846402650453449441572664695995209956); + DVK(KP921078979, +0.921078979742360627699756128143719920817673854); + DVK(KP578046249, +0.578046249379945007321754579646815604023525655); + DVK(KP763932022, +0.763932022500210303590826331268723764559381640); + DVK(KP956723877, +0.956723877038460305821989399535483155872969262); + DVK(KP690983005, +0.690983005625052575897706582817180941139845410); + DVK(KP945422727, +0.945422727388575946270360266328811958657216298); + DVK(KP522616830, +0.522616830205754336872861364785224694908468440); + DVK(KP772036680, +0.772036680810363904029489473607579825330539880); + DVK(KP669429328, +0.669429328479476605641803240971985825917022098); + DVK(KP570584518, +0.570584518783621657366766175430996792655723863); + DVK(KP982009705, +0.982009705009746369461829878184175962711969869); + DVK(KP845997307, +0.845997307939530944175097360758058292389769300); + DVK(KP734762448, +0.734762448793050413546343770063151342619912334); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP447533225, +0.447533225982656890041886979663652563063114397); + DVK(KP059835404, +0.059835404262124915169548397419498386427871950); + DVK(KP494780565, +0.494780565770515410344588413655324772219443730); + DVK(KP603558818, +0.603558818296015001454675132653458027918768137); + DVK(KP987388751, +0.987388751065621252324603216482382109400433949); + DVK(KP522847744, +0.522847744331509716623755382187077770911012542); + DVK(KP667278218, +0.667278218140296670899089292254759909713898805); + DVK(KP244189809, +0.244189809627953270309879511234821255780225091); + DVK(KP132830569, +0.132830569247582714407653942074819768844536507); + DVK(KP869845200, +0.869845200362138853122720822420327157933056305); + DVK(KP786782374, +0.786782374965295178365099601674911834788448471); + DVK(KP066152395, +0.066152395967733048213034281011006031460903353); + DVK(KP120146378, +0.120146378570687701782758537356596213647956445); + DVK(KP893101515, +0.893101515366181661711202267938416198338079437); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(25, rs)) { + V T2, T5, T3, T4, TC, Te, Tr, Ty, Tz, T1I, T1l, T6, T1e, T9, Ta; + V Tu, T1L, Th, T1E, T1o, TX, TD, T1h, TU; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMUL(T2, T3); + TC = VZMULJ(T2, T5); + Te = VZMUL(T2, T5); + Tr = VZMULJ(T3, T5); + Ty = VZMULJ(T2, T3); + Tz = VZMUL(Ty, T5); + T1I = VZMUL(T4, T5); + T1l = VZMUL(T3, T5); + T6 = VZMULJ(T4, T5); + T1e = VZMULJ(Ty, T5); + T9 = LDW(&(W[TWVL * 6])); + Ta = VZMULJ(T4, T9); + Tu = VZMULJ(T3, T9); + T1L = VZMULJ(Tr, T9); + Th = VZMULJ(T5, T9); + T1E = VZMULJ(T2, T9); + T1o = VZMULJ(T1e, T9); + TX = VZMULJ(Te, T9); + TD = VZMULJ(TC, T9); + T1h = VZMULJ(Ty, T9); + TU = VZMULJ(T6, T9); + { + V T1, Tn, Tl, Tm, T2c, T3l, T4e, T1V, T38, T1S, T39, T1W, T2v, T3z, T3f; + V T3a, T2D, T4a, TN, T32, TK, T31, TO, T2y, T3C, T3i, T33, T2G, T4b, T11; + V T2Z, T19, T2Y, T1a, T2z, T3D, T3h, T30, T2H, T4d, T1y, T35, T1v, T36, T1z; + V T2w, T3A, T3e, T37, T2E; + { + V Tg, Tj, Tk, T8, Tc, Td, T2a, T2b; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V Tf, Ti, T7, Tb; + Tf = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tg = VZMULJ(Te, Tf); + Ti = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Tj = VZMULJ(Th, Ti); + Tk = VADD(Tg, Tj); + T7 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T8 = VZMULJ(T6, T7); + Tb = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tc = VZMULJ(Ta, Tb); + Td = VADD(T8, Tc); + } + Tn = VSUB(Td, Tk); + Tl = VADD(Td, Tk); + Tm = VFNMS(LDK(KP250000000), Tl, T1); + T2a = VSUB(T8, Tc); + T2b = VSUB(Tg, Tj); + T2c = VFMA(LDK(KP618033988), T2b, T2a); + T3l = VFNMS(LDK(KP618033988), T2a, T2b); + } + { + V T1B, T1T, T1U, T1H, T1O, T1P, T1A, T1Q, T1R; + T1A = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1B = VZMULJ(T3, T1A); + { + V T1D, T1N, T1G, T1K; + { + V T1C, T1M, T1F, T1J; + T1C = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1D = VZMULJ(TC, T1C); + T1M = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1N = VZMULJ(T1L, T1M); + T1F = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1G = VZMULJ(T1E, T1F); + T1J = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1K = VZMULJ(T1I, T1J); + } + T1T = VSUB(T1D, T1G); + T1U = VSUB(T1K, T1N); + T1H = VADD(T1D, T1G); + T1O = VADD(T1K, T1N); + T1P = VADD(T1H, T1O); + } + T4e = VADD(T1B, T1P); + T1V = VFMA(LDK(KP618033988), T1U, T1T); + T38 = VFNMS(LDK(KP618033988), T1T, T1U); + T1Q = VFNMS(LDK(KP250000000), T1P, T1B); + T1R = VSUB(T1O, T1H); + T1S = VFNMS(LDK(KP559016994), T1R, T1Q); + T39 = VFMA(LDK(KP559016994), T1R, T1Q); + T1W = VFNMS(LDK(KP893101515), T1V, T1S); + T2v = VFNMS(LDK(KP120146378), T1V, T1S); + T3z = VFMA(LDK(KP066152395), T39, T38); + T3f = VFNMS(LDK(KP786782374), T38, T39); + T3a = VFMA(LDK(KP869845200), T39, T38); + T2D = VFMA(LDK(KP132830569), T1S, T1V); + } + { + V Tq, TL, TM, Tx, TG, TH, Tp, TI, TJ; + Tp = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + Tq = VZMULJ(T2, Tp); + { + V Tt, TF, Tw, TB; + { + V Ts, TE, Tv, TA; + Ts = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tt = VZMULJ(Tr, Ts); + TE = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + TF = VZMULJ(TD, TE); + Tv = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tw = VZMULJ(Tu, Tv); + TA = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + TB = VZMULJ(Tz, TA); + } + TL = VSUB(Tt, Tw); + TM = VSUB(TF, TB); + Tx = VADD(Tt, Tw); + TG = VADD(TB, TF); + TH = VADD(Tx, TG); + } + T4a = VADD(Tq, TH); + TN = VFNMS(LDK(KP618033988), TM, TL); + T32 = VFMA(LDK(KP618033988), TL, TM); + TI = VFNMS(LDK(KP250000000), TH, Tq); + TJ = VSUB(Tx, TG); + TK = VFMA(LDK(KP559016994), TJ, TI); + T31 = VFNMS(LDK(KP559016994), TJ, TI); + TO = VFNMS(LDK(KP244189809), TN, TK); + T2y = VFMA(LDK(KP667278218), TK, TN); + T3C = VFNMS(LDK(KP522847744), T32, T31); + T3i = VFNMS(LDK(KP987388751), T31, T32); + T33 = VFMA(LDK(KP893101515), T32, T31); + T2G = VFNMS(LDK(KP603558818), TN, TK); + } + { + V T13, TT, T10, T14, T15, T16, T12, T17, T18; + T12 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T13 = VZMULJ(T4, T12); + { + V TQ, TZ, TS, TW; + { + V TP, TY, TR, TV; + TP = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TQ = VZMULJ(T9, TP); + TY = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TZ = VZMULJ(TX, TY); + TR = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TS = VZMULJ(T5, TR); + TV = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TW = VZMULJ(TU, TV); + } + TT = VSUB(TQ, TS); + T10 = VSUB(TW, TZ); + T14 = VADD(TS, TQ); + T15 = VADD(TZ, TW); + T16 = VADD(T14, T15); + } + T4b = VADD(T13, T16); + T11 = VFMA(LDK(KP618033988), T10, TT); + T2Z = VFNMS(LDK(KP618033988), TT, T10); + T17 = VFMS(LDK(KP250000000), T16, T13); + T18 = VSUB(T14, T15); + T19 = VFNMS(LDK(KP559016994), T18, T17); + T2Y = VFMA(LDK(KP559016994), T18, T17); + T1a = VFNMS(LDK(KP667278218), T19, T11); + T2z = VFMA(LDK(KP869845200), T19, T11); + T3D = VFNMS(LDK(KP494780565), T2Y, T2Z); + T3h = VFNMS(LDK(KP132830569), T2Y, T2Z); + T30 = VFMA(LDK(KP120146378), T2Z, T2Y); + T2H = VFNMS(LDK(KP786782374), T11, T19); + } + { + V T1d, T1w, T1x, T1k, T1r, T1s, T1c, T1t, T1u; + T1c = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T1d = VZMULJ(Ty, T1c); + { + V T1g, T1q, T1j, T1n; + { + V T1f, T1p, T1i, T1m; + T1f = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1g = VZMULJ(T1e, T1f); + T1p = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1q = VZMULJ(T1o, T1p); + T1i = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1j = VZMULJ(T1h, T1i); + T1m = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T1n = VZMULJ(T1l, T1m); + } + T1w = VSUB(T1g, T1j); + T1x = VSUB(T1q, T1n); + T1k = VADD(T1g, T1j); + T1r = VADD(T1n, T1q); + T1s = VADD(T1k, T1r); + } + T4d = VADD(T1d, T1s); + T1y = VFNMS(LDK(KP618033988), T1x, T1w); + T35 = VFMA(LDK(KP618033988), T1w, T1x); + T1t = VFNMS(LDK(KP250000000), T1s, T1d); + T1u = VSUB(T1r, T1k); + T1v = VFNMS(LDK(KP559016994), T1u, T1t); + T36 = VFMA(LDK(KP559016994), T1u, T1t); + T1z = VFNMS(LDK(KP522847744), T1y, T1v); + T2w = VFNMS(LDK(KP494780565), T1v, T1y); + T3A = VFNMS(LDK(KP667278218), T36, T35); + T3e = VFNMS(LDK(KP059835404), T35, T36); + T37 = VFMA(LDK(KP066152395), T36, T35); + T2E = VFMA(LDK(KP447533225), T1y, T1v); + } + { + V T4m, T4o, T49, T4g, T4h, T4i, T4n, T4j; + { + V T4k, T4l, T4c, T4f; + T4k = VSUB(T4a, T4b); + T4l = VSUB(T4d, T4e); + T4m = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T4l, T4k)); + T4o = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T4k, T4l)); + T49 = VADD(T1, Tl); + T4c = VADD(T4a, T4b); + T4f = VADD(T4d, T4e); + T4g = VADD(T4c, T4f); + T4h = VFNMS(LDK(KP250000000), T4g, T49); + T4i = VSUB(T4c, T4f); + } + ST(&(x[0]), VADD(T4g, T49), ms, &(x[0])); + T4n = VFNMS(LDK(KP559016994), T4i, T4h); + ST(&(x[WS(rs, 10)]), VFMAI(T4o, T4n), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VFNMSI(T4o, T4n), ms, &(x[WS(rs, 1)])); + T4j = VFMA(LDK(KP559016994), T4i, T4h); + ST(&(x[WS(rs, 5)]), VFNMSI(T4m, T4j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VFMAI(T4m, T4j), ms, &(x[0])); + } + { + V T3n, T3t, T3Z, T46, T3k, T3w, T3c, T3q, T2X, T3R, T3F, T3Q, T3N, T43, T3P; + V T3T, T40, T3X, T3Y; + T3n = VFMA(LDK(KP734762448), T3i, T3h); + T3t = VFNMS(LDK(KP734762448), T33, T30); + T3X = VFMA(LDK(KP845997307), T3A, T3z); + T3Y = VFMA(LDK(KP982009705), T3D, T3C); + T3Z = VFMA(LDK(KP570584518), T3Y, T3X); + T46 = VFNMS(LDK(KP669429328), T3X, T3Y); + { + V T3g, T3j, T3v, T3u; + T3g = VFMA(LDK(KP772036680), T3f, T3e); + T3j = VFNMS(LDK(KP734762448), T3i, T3h); + T3u = VFMA(LDK(KP772036680), T3a, T37); + T3v = VFMA(LDK(KP522616830), T3j, T3u); + T3k = VFMA(LDK(KP945422727), T3j, T3g); + T3w = VFNMS(LDK(KP690983005), T3v, T3g); + } + { + V T3b, T34, T3p, T3o; + T3b = VFNMS(LDK(KP772036680), T3a, T37); + T34 = VFMA(LDK(KP734762448), T33, T30); + T3o = VFNMS(LDK(KP772036680), T3f, T3e); + T3p = VFNMS(LDK(KP522616830), T34, T3o); + T3c = VFMA(LDK(KP956723877), T3b, T34); + T3q = VFMA(LDK(KP763932022), T3p, T3b); + } + { + V T3M, T3S, T3J, T3K, T3L; + T2X = VFNMS(LDK(KP559016994), Tn, Tm); + T3K = VFMA(LDK(KP447533225), T2Z, T2Y); + T3L = VFMA(LDK(KP578046249), T31, T32); + T3M = VFNMS(LDK(KP921078979), T3L, T3K); + T3R = VFMA(LDK(KP921078979), T3L, T3K); + { + V T3B, T3E, T3H, T3I; + T3B = VFNMS(LDK(KP845997307), T3A, T3z); + T3E = VFNMS(LDK(KP982009705), T3D, T3C); + T3F = VFMA(LDK(KP923225144), T3E, T3B); + T3S = VFNMS(LDK(KP923225144), T3E, T3B); + T3H = VFNMS(LDK(KP059835404), T38, T39); + T3I = VFMA(LDK(KP603558818), T35, T36); + T3J = VFMA(LDK(KP845997307), T3I, T3H); + T3Q = VFNMS(LDK(KP845997307), T3I, T3H); + } + T3N = VFNMS(LDK(KP906616052), T3M, T3J); + T43 = VFNMS(LDK(KP904508497), T3S, T3Q); + T3P = VFNMS(LDK(KP237294955), T3F, T2X); + T3T = VFNMS(LDK(KP997675361), T3S, T3R); + T40 = VFMA(LDK(KP906616052), T3M, T3J); + } + { + V T3d, T3m, T3G, T3O; + T3d = VFMA(LDK(KP992114701), T3c, T2X); + T3m = VMUL(LDK(KP998026728), VFMA(LDK(KP952936919), T3l, T3k)); + ST(&(x[WS(rs, 3)]), VFNMSI(T3m, T3d), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 22)]), VFMAI(T3m, T3d), ms, &(x[0])); + T3G = VFMA(LDK(KP949179823), T3F, T2X); + T3O = VMUL(LDK(KP998026728), VFNMS(LDK(KP952936919), T3l, T3N)); + ST(&(x[WS(rs, 2)]), VFNMSI(T3O, T3G), ms, &(x[0])); + ST(&(x[WS(rs, 23)]), VFMAI(T3O, T3G), ms, &(x[WS(rs, 1)])); + } + { + V T3s, T3y, T3r, T3x; + T3r = VFNMS(LDK(KP855719849), T3q, T3n); + T3s = VFMA(LDK(KP897376177), T3r, T2X); + T3x = VFMA(LDK(KP855719849), T3w, T3t); + T3y = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T3x, T3l)); + ST(&(x[WS(rs, 8)]), VFNMSI(T3y, T3s), ms, &(x[0])); + ST(&(x[WS(rs, 17)]), VFMAI(T3y, T3s), ms, &(x[WS(rs, 1)])); + } + { + V T3V, T45, T42, T48, T3U; + T3U = VFMA(LDK(KP560319534), T3T, T3Q); + T3V = VFNMS(LDK(KP949179823), T3U, T3P); + { + V T44, T3W, T47, T41; + T44 = VFNMS(LDK(KP681693190), T43, T3R); + T45 = VFNMS(LDK(KP860541664), T44, T3P); + T3W = VFMA(LDK(KP262346850), T3N, T3l); + T47 = VFNMS(LDK(KP669429328), T40, T46); + T41 = VFMA(LDK(KP618033988), T40, T3Z); + T42 = VMUL(LDK(KP951056516), VFNMS(LDK(KP949179823), T41, T3W)); + T48 = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T47, T3W)); + } + ST(&(x[WS(rs, 13)]), VFNMSI(T42, T3V), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(T48, T45), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 12)]), VFMAI(T42, T3V), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFNMSI(T48, T45), ms, &(x[0])); + } + } + { + V T2L, T2R, T2j, T2q, T2J, T2U, T2B, T2O, To, T26, T1Y, T22, T1Z, T2n, T27; + V T2f, T2k, T2h, T2i; + T2L = VFNMS(LDK(KP912575812), T2H, T2G); + T2R = VFNMS(LDK(KP912575812), T2z, T2y); + T2h = VFNMS(LDK(KP829049696), T1a, TO); + T2i = VFNMS(LDK(KP831864738), T1W, T1z); + T2j = VFMA(LDK(KP559154169), T2i, T2h); + T2q = VFNMS(LDK(KP683113946), T2h, T2i); + { + V T2F, T2I, T2T, T2S; + T2F = VFMA(LDK(KP958953096), T2E, T2D); + T2I = VFMA(LDK(KP912575812), T2H, T2G); + T2S = VFMA(LDK(KP867381224), T2w, T2v); + T2T = VFMA(LDK(KP447417479), T2I, T2S); + T2J = VFMA(LDK(KP894834959), T2I, T2F); + T2U = VFNMS(LDK(KP763932022), T2T, T2F); + } + { + V T2x, T2A, T2N, T2M; + T2x = VFNMS(LDK(KP867381224), T2w, T2v); + T2A = VFMA(LDK(KP912575812), T2z, T2y); + T2M = VFNMS(LDK(KP958953096), T2E, T2D); + T2N = VFMA(LDK(KP447417479), T2A, T2M); + T2B = VFNMS(LDK(KP809385824), T2A, T2x); + T2O = VFMA(LDK(KP690983005), T2N, T2x); + } + { + V T2e, T23, T2d, T24, T25; + To = VFMA(LDK(KP559016994), Tn, Tm); + T24 = VFMA(LDK(KP578046249), T1v, T1y); + T25 = VFMA(LDK(KP987388751), T1S, T1V); + T26 = VFNMS(LDK(KP831864738), T25, T24); + T2e = VFMA(LDK(KP831864738), T25, T24); + { + V T1b, T1X, T20, T21; + T1b = VFMA(LDK(KP829049696), T1a, TO); + T1X = VFMA(LDK(KP831864738), T1W, T1z); + T1Y = VFMA(LDK(KP904730450), T1X, T1b); + T23 = VFNMS(LDK(KP904730450), T1X, T1b); + T20 = VFMA(LDK(KP269969613), TK, TN); + T21 = VFMA(LDK(KP603558818), T11, T19); + T22 = VFMA(LDK(KP916574801), T21, T20); + T2d = VFNMS(LDK(KP916574801), T21, T20); + } + T1Z = VFNMS(LDK(KP242145790), T1Y, To); + T2n = VADD(T22, T23); + T27 = VFNMS(LDK(KP904730450), T26, T23); + T2f = VFMA(LDK(KP904730450), T2e, T2d); + T2k = VFNMS(LDK(KP904730450), T2e, T2d); + } + { + V T2t, T2u, T2C, T2K; + T2t = VFMA(LDK(KP968583161), T1Y, To); + T2u = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T2f, T2c)); + ST(&(x[WS(rs, 1)]), VFNMSI(T2u, T2t), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VFMAI(T2u, T2t), ms, &(x[0])); + T2C = VFNMS(LDK(KP992114701), T2B, To); + T2K = VMUL(LDK(KP951056516), VFNMS(LDK(KP992114701), T2J, T2c)); + ST(&(x[WS(rs, 4)]), VFMAI(T2K, T2C), ms, &(x[0])); + ST(&(x[WS(rs, 21)]), VFNMSI(T2K, T2C), ms, &(x[WS(rs, 1)])); + } + { + V T2Q, T2W, T2P, T2V; + T2P = VFNMS(LDK(KP999544308), T2O, T2L); + T2Q = VFNMS(LDK(KP803003575), T2P, To); + T2V = VFNMS(LDK(KP999544308), T2U, T2R); + T2W = VMUL(LDK(KP951056516), VFNMS(LDK(KP803003575), T2V, T2c)); + ST(&(x[WS(rs, 16)]), VFNMSI(T2W, T2Q), ms, &(x[0])); + ST(&(x[WS(rs, 9)]), VFMAI(T2W, T2Q), ms, &(x[WS(rs, 1)])); + } + { + V T29, T2p, T2m, T2s, T28; + T28 = VFNMS(LDK(KP618033988), T27, T22); + T29 = VFNMS(LDK(KP876091699), T28, T1Z); + { + V T2o, T2g, T2r, T2l; + T2o = VFNMS(LDK(KP683113946), T2n, T26); + T2p = VFMA(LDK(KP792626838), T2o, T1Z); + T2g = VFNMS(LDK(KP242145790), T2f, T2c); + T2r = VFMA(LDK(KP617882369), T2k, T2q); + T2l = VFMA(LDK(KP559016994), T2k, T2j); + T2m = VMUL(LDK(KP951056516), VFMA(LDK(KP968583161), T2l, T2g)); + T2s = VMUL(LDK(KP951056516), VFNMS(LDK(KP876306680), T2r, T2g)); + } + ST(&(x[WS(rs, 6)]), VFNMSI(T2m, T29), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VFMAI(T2s, T2p), ms, &(x[0])); + ST(&(x[WS(rs, 19)]), VFMAI(T2m, T29), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 11)]), VFNMSI(T2s, T2p), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t3fv_25"), twinstr, &GENUS, {87, 100, 181, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_25) (planner *p) { + X(kdft_dit_register) (p, t3fv_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 25 -name t3fv_25 -include dft/simd/t3f.h */ + +/* + * This function contains 268 FP additions, 228 FP multiplications, + * (or, 190 additions, 150 multiplications, 78 fused multiply/add), + * 123 stack variables, 40 constants, and 50 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_25(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP998026728, +0.998026728428271561952336806863450553336905220); + DVK(KP125581039, +0.125581039058626752152356449131262266244969664); + DVK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DVK(KP062790519, +0.062790519529313376076178224565631133122484832); + DVK(KP809016994, +0.809016994374947424102293417182819058860154590); + DVK(KP309016994, +0.309016994374947424102293417182819058860154590); + DVK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DVK(KP728968627, +0.728968627421411523146730319055259111372571664); + DVK(KP963507348, +0.963507348203430549974383005744259307057084020); + DVK(KP876306680, +0.876306680043863587308115903922062583399064238); + DVK(KP497379774, +0.497379774329709576484567492012895936835134813); + DVK(KP968583161, +0.968583161128631119490168375464735813836012403); + DVK(KP684547105, +0.684547105928688673732283357621209269889519233); + DVK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DVK(KP481753674, +0.481753674101715274987191502872129653528542010); + DVK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DVK(KP248689887, +0.248689887164854788242283746006447968417567406); + DVK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DVK(KP992114701, +0.992114701314477831049793042785778521453036709); + DVK(KP250666467, +0.250666467128608490746237519633017587885836494); + DVK(KP425779291, +0.425779291565072648862502445744251703979973042); + DVK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DVK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DVK(KP770513242, +0.770513242775789230803009636396177847271667672); + DVK(KP844327925, +0.844327925502015078548558063966681505381659241); + DVK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DVK(KP125333233, +0.125333233564304245373118759816508793942918247); + DVK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DVK(KP904827052, +0.904827052466019527713668647932697593970413911); + DVK(KP851558583, +0.851558583130145297725004891488503407959946084); + DVK(KP637423989, +0.637423989748689710176712811676016195434917298); + DVK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DVK(KP535826794, +0.535826794978996618271308767867639978063575346); + DVK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(25, rs)) { + V T1, T4, T2, T3, TA, Td, Tp, Tw, Tx, T1G, T1j, T5, T1c, T8, T9; + V Ts, T1J, Tg, T1C, T1m, TX, TB, T1f, TU; + T1 = LDW(&(W[0])); + T4 = LDW(&(W[TWVL * 4])); + T2 = LDW(&(W[TWVL * 2])); + T3 = VZMUL(T1, T2); + TA = VZMULJ(T1, T4); + Td = VZMUL(T1, T4); + Tp = VZMULJ(T2, T4); + Tw = VZMULJ(T1, T2); + Tx = VZMUL(Tw, T4); + T1G = VZMUL(T3, T4); + T1j = VZMUL(T2, T4); + T5 = VZMULJ(T3, T4); + T1c = VZMULJ(Tw, T4); + T8 = LDW(&(W[TWVL * 6])); + T9 = VZMULJ(T3, T8); + Ts = VZMULJ(T2, T8); + T1J = VZMULJ(Tp, T8); + Tg = VZMULJ(T4, T8); + T1C = VZMULJ(T1, T8); + T1m = VZMULJ(T1c, T8); + TX = VZMULJ(T5, T8); + TB = VZMULJ(TA, T8); + T1f = VZMULJ(Tw, T8); + TU = VZMULJ(Td, T8); + { + V Tl, Tk, Tm, Tn, T20, T2R, T22, T1V, T2K, T1S, T3A, T2L, TN, T2G, TK; + V T3w, T2H, T19, T2D, T16, T3x, T2E, T1y, T2N, T1v, T3z, T2O; + { + V Tf, Ti, Tj, T7, Tb, Tc, T21; + Tl = LD(&(x[0]), ms, &(x[0])); + { + V Te, Th, T6, Ta; + Te = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + Tf = VZMULJ(Td, Te); + Th = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + Ti = VZMULJ(Tg, Th); + Tj = VADD(Tf, Ti); + T6 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T7 = VZMULJ(T5, T6); + Ta = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Tb = VZMULJ(T9, Ta); + Tc = VADD(T7, Tb); + } + Tk = VMUL(LDK(KP559016994), VSUB(Tc, Tj)); + Tm = VADD(Tc, Tj); + Tn = VFNMS(LDK(KP250000000), Tm, Tl); + T20 = VSUB(T7, Tb); + T21 = VSUB(Tf, Ti); + T2R = VMUL(LDK(KP951056516), T21); + T22 = VFMA(LDK(KP951056516), T20, VMUL(LDK(KP587785252), T21)); + } + { + V T1P, T1I, T1L, T1M, T1B, T1E, T1F, T1O; + T1O = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1P = VZMULJ(T2, T1O); + { + V T1H, T1K, T1A, T1D; + T1H = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1I = VZMULJ(T1G, T1H); + T1K = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + T1L = VZMULJ(T1J, T1K); + T1M = VADD(T1I, T1L); + T1A = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T1B = VZMULJ(TA, T1A); + T1D = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1E = VZMULJ(T1C, T1D); + T1F = VADD(T1B, T1E); + } + { + V T1T, T1U, T1N, T1Q, T1R; + T1T = VSUB(T1B, T1E); + T1U = VSUB(T1I, T1L); + T1V = VFMA(LDK(KP475528258), T1T, VMUL(LDK(KP293892626), T1U)); + T2K = VFNMS(LDK(KP293892626), T1T, VMUL(LDK(KP475528258), T1U)); + T1N = VMUL(LDK(KP559016994), VSUB(T1F, T1M)); + T1Q = VADD(T1F, T1M); + T1R = VFNMS(LDK(KP250000000), T1Q, T1P); + T1S = VADD(T1N, T1R); + T3A = VADD(T1P, T1Q); + T2L = VSUB(T1R, T1N); + } + } + { + V TH, Tz, TD, TE, Tr, Tu, Tv, TG; + TG = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + TH = VZMULJ(T1, TG); + { + V Ty, TC, Tq, Tt; + Ty = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + Tz = VZMULJ(Tx, Ty); + TC = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + TD = VZMULJ(TB, TC); + TE = VADD(Tz, TD); + Tq = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tr = VZMULJ(Tp, Tq); + Tt = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + Tu = VZMULJ(Ts, Tt); + Tv = VADD(Tr, Tu); + } + { + V TL, TM, TF, TI, TJ; + TL = VSUB(Tr, Tu); + TM = VSUB(Tz, TD); + TN = VFMA(LDK(KP475528258), TL, VMUL(LDK(KP293892626), TM)); + T2G = VFNMS(LDK(KP293892626), TL, VMUL(LDK(KP475528258), TM)); + TF = VMUL(LDK(KP559016994), VSUB(Tv, TE)); + TI = VADD(Tv, TE); + TJ = VFNMS(LDK(KP250000000), TI, TH); + TK = VADD(TF, TJ); + T3w = VADD(TH, TI); + T2H = VSUB(TJ, TF); + } + } + { + V T13, TW, TZ, T10, TQ, TS, TT, T12; + T12 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T13 = VZMULJ(T3, T12); + { + V TV, TY, TP, TR; + TV = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TW = VZMULJ(TU, TV); + TY = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + TZ = VZMULJ(TX, TY); + T10 = VADD(TW, TZ); + TP = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + TQ = VZMULJ(T4, TP); + TR = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + TS = VZMULJ(T8, TR); + TT = VADD(TQ, TS); + } + { + V T17, T18, T11, T14, T15; + T17 = VSUB(TQ, TS); + T18 = VSUB(TW, TZ); + T19 = VFMA(LDK(KP475528258), T17, VMUL(LDK(KP293892626), T18)); + T2D = VFNMS(LDK(KP293892626), T17, VMUL(LDK(KP475528258), T18)); + T11 = VMUL(LDK(KP559016994), VSUB(TT, T10)); + T14 = VADD(TT, T10); + T15 = VFNMS(LDK(KP250000000), T14, T13); + T16 = VADD(T11, T15); + T3x = VADD(T13, T14); + T2E = VSUB(T15, T11); + } + } + { + V T1s, T1l, T1o, T1p, T1e, T1h, T1i, T1r; + T1r = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T1s = VZMULJ(Tw, T1r); + { + V T1k, T1n, T1d, T1g; + T1k = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + T1l = VZMULJ(T1j, T1k); + T1n = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T1o = VZMULJ(T1m, T1n); + T1p = VADD(T1l, T1o); + T1d = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1e = VZMULJ(T1c, T1d); + T1g = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + T1h = VZMULJ(T1f, T1g); + T1i = VADD(T1e, T1h); + } + { + V T1w, T1x, T1q, T1t, T1u; + T1w = VSUB(T1e, T1h); + T1x = VSUB(T1l, T1o); + T1y = VFMA(LDK(KP475528258), T1w, VMUL(LDK(KP293892626), T1x)); + T2N = VFNMS(LDK(KP293892626), T1w, VMUL(LDK(KP475528258), T1x)); + T1q = VMUL(LDK(KP559016994), VSUB(T1i, T1p)); + T1t = VADD(T1i, T1p); + T1u = VFNMS(LDK(KP250000000), T1t, T1s); + T1v = VADD(T1q, T1u); + T3z = VADD(T1s, T1t); + T2O = VSUB(T1u, T1q); + } + } + { + V T3J, T3K, T3D, T3E, T3C, T3F, T3L, T3G; + { + V T3H, T3I, T3y, T3B; + T3H = VSUB(T3w, T3x); + T3I = VSUB(T3z, T3A); + T3J = VBYI(VFMA(LDK(KP951056516), T3H, VMUL(LDK(KP587785252), T3I))); + T3K = VBYI(VFNMS(LDK(KP587785252), T3H, VMUL(LDK(KP951056516), T3I))); + T3D = VADD(Tl, Tm); + T3y = VADD(T3w, T3x); + T3B = VADD(T3z, T3A); + T3E = VADD(T3y, T3B); + T3C = VMUL(LDK(KP559016994), VSUB(T3y, T3B)); + T3F = VFNMS(LDK(KP250000000), T3E, T3D); + } + ST(&(x[0]), VADD(T3D, T3E), ms, &(x[0])); + T3L = VSUB(T3F, T3C); + ST(&(x[WS(rs, 10)]), VADD(T3K, T3L), ms, &(x[0])); + ST(&(x[WS(rs, 15)]), VSUB(T3L, T3K), ms, &(x[WS(rs, 1)])); + T3G = VADD(T3C, T3F); + ST(&(x[WS(rs, 5)]), VSUB(T3G, T3J), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 20)]), VADD(T3J, T3G), ms, &(x[0])); + } + { + V To, T2n, T2o, T2p, T2x, T2y, T2z, T2u, T2v, T2w, T2q, T2r, T2s, T29, T2i; + V T2e, T2g, T1Y, T2j, T2b, T2c, T2B, T2C; + To = VADD(Tk, Tn); + T2n = VFMA(LDK(KP1_688655851), TN, VMUL(LDK(KP535826794), TK)); + T2o = VFMA(LDK(KP1_541026485), T19, VMUL(LDK(KP637423989), T16)); + T2p = VSUB(T2n, T2o); + T2x = VFMA(LDK(KP851558583), T1y, VMUL(LDK(KP904827052), T1v)); + T2y = VFMA(LDK(KP1_984229402), T1V, VMUL(LDK(KP125333233), T1S)); + T2z = VADD(T2x, T2y); + T2u = VFNMS(LDK(KP844327925), TK, VMUL(LDK(KP1_071653589), TN)); + T2v = VFNMS(LDK(KP1_274847979), T19, VMUL(LDK(KP770513242), T16)); + T2w = VADD(T2u, T2v); + T2q = VFNMS(LDK(KP425779291), T1v, VMUL(LDK(KP1_809654104), T1y)); + T2r = VFNMS(LDK(KP992114701), T1S, VMUL(LDK(KP250666467), T1V)); + T2s = VADD(T2q, T2r); + { + V T23, T24, T25, T26, T27, T28; + T23 = VFMA(LDK(KP1_937166322), TN, VMUL(LDK(KP248689887), TK)); + T24 = VFMA(LDK(KP1_071653589), T19, VMUL(LDK(KP844327925), T16)); + T25 = VADD(T23, T24); + T26 = VFMA(LDK(KP1_752613360), T1y, VMUL(LDK(KP481753674), T1v)); + T27 = VFMA(LDK(KP1_457937254), T1V, VMUL(LDK(KP684547105), T1S)); + T28 = VADD(T26, T27); + T29 = VADD(T25, T28); + T2i = VSUB(T27, T26); + T2e = VMUL(LDK(KP559016994), VSUB(T28, T25)); + T2g = VSUB(T24, T23); + } + { + V TO, T1a, T1b, T1z, T1W, T1X; + TO = VFNMS(LDK(KP497379774), TN, VMUL(LDK(KP968583161), TK)); + T1a = VFNMS(LDK(KP1_688655851), T19, VMUL(LDK(KP535826794), T16)); + T1b = VADD(TO, T1a); + T1z = VFNMS(LDK(KP963507348), T1y, VMUL(LDK(KP876306680), T1v)); + T1W = VFNMS(LDK(KP1_369094211), T1V, VMUL(LDK(KP728968627), T1S)); + T1X = VADD(T1z, T1W); + T1Y = VADD(T1b, T1X); + T2j = VMUL(LDK(KP559016994), VSUB(T1b, T1X)); + T2b = VSUB(T1a, TO); + T2c = VSUB(T1z, T1W); + } + { + V T1Z, T2a, T2t, T2A; + T1Z = VADD(To, T1Y); + T2a = VBYI(VADD(T22, T29)); + ST(&(x[WS(rs, 1)]), VSUB(T1Z, T2a), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 24)]), VADD(T1Z, T2a), ms, &(x[0])); + T2t = VADD(To, VADD(T2p, T2s)); + T2A = VBYI(VADD(T22, VSUB(T2w, T2z))); + ST(&(x[WS(rs, 21)]), VSUB(T2t, T2A), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(T2t, T2A), ms, &(x[0])); + } + T2B = VBYI(VADD(T22, VFMA(LDK(KP309016994), T2w, VFMA(LDK(KP587785252), VSUB(T2r, T2q), VFNMS(LDK(KP951056516), VADD(T2n, T2o), VMUL(LDK(KP809016994), T2z)))))); + T2C = VFMA(LDK(KP309016994), T2p, VFMA(LDK(KP951056516), VSUB(T2u, T2v), VFMA(LDK(KP587785252), VSUB(T2y, T2x), VFNMS(LDK(KP809016994), T2s, To)))); + ST(&(x[WS(rs, 9)]), VADD(T2B, T2C), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 16)]), VSUB(T2C, T2B), ms, &(x[0])); + { + V T2f, T2l, T2k, T2m, T2d, T2h; + T2d = VFMS(LDK(KP250000000), T29, T22); + T2f = VBYI(VADD(VFMA(LDK(KP587785252), T2b, VMUL(LDK(KP951056516), T2c)), VSUB(T2d, T2e))); + T2l = VBYI(VADD(VFNMS(LDK(KP587785252), T2c, VMUL(LDK(KP951056516), T2b)), VADD(T2d, T2e))); + T2h = VFNMS(LDK(KP250000000), T1Y, To); + T2k = VFMA(LDK(KP587785252), T2g, VFNMS(LDK(KP951056516), T2i, VSUB(T2h, T2j))); + T2m = VFMA(LDK(KP951056516), T2g, VADD(T2j, VFMA(LDK(KP587785252), T2i, T2h))); + ST(&(x[WS(rs, 11)]), VADD(T2f, T2k), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VSUB(T2m, T2l), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 14)]), VSUB(T2k, T2f), ms, &(x[0])); + ST(&(x[WS(rs, 6)]), VADD(T2l, T2m), ms, &(x[0])); + } + } + { + V T2S, T2U, T2F, T2I, T2J, T2Y, T2Z, T30, T2M, T2P, T2Q, T2V, T2W, T2X, T3a; + V T3l, T3b, T3k, T3f, T3p, T3i, T3o, T32, T33; + T2S = VFNMS(LDK(KP587785252), T20, T2R); + T2U = VSUB(Tn, Tk); + T2F = VFNMS(LDK(KP125333233), T2E, VMUL(LDK(KP1_984229402), T2D)); + T2I = VFMA(LDK(KP1_457937254), T2G, VMUL(LDK(KP684547105), T2H)); + T2J = VSUB(T2F, T2I); + T2Y = VFNMS(LDK(KP1_996053456), T2N, VMUL(LDK(KP062790519), T2O)); + T2Z = VFMA(LDK(KP1_541026485), T2K, VMUL(LDK(KP637423989), T2L)); + T30 = VSUB(T2Y, T2Z); + T2M = VFNMS(LDK(KP770513242), T2L, VMUL(LDK(KP1_274847979), T2K)); + T2P = VFMA(LDK(KP125581039), T2N, VMUL(LDK(KP998026728), T2O)); + T2Q = VSUB(T2M, T2P); + T2V = VFNMS(LDK(KP1_369094211), T2G, VMUL(LDK(KP728968627), T2H)); + T2W = VFMA(LDK(KP250666467), T2D, VMUL(LDK(KP992114701), T2E)); + T2X = VSUB(T2V, T2W); + { + V T34, T35, T36, T37, T38, T39; + T34 = VFNMS(LDK(KP481753674), T2H, VMUL(LDK(KP1_752613360), T2G)); + T35 = VFMA(LDK(KP851558583), T2D, VMUL(LDK(KP904827052), T2E)); + T36 = VSUB(T34, T35); + T37 = VFNMS(LDK(KP844327925), T2O, VMUL(LDK(KP1_071653589), T2N)); + T38 = VFNMS(LDK(KP998026728), T2L, VMUL(LDK(KP125581039), T2K)); + T39 = VADD(T37, T38); + T3a = VMUL(LDK(KP559016994), VSUB(T36, T39)); + T3l = VSUB(T37, T38); + T3b = VADD(T36, T39); + T3k = VADD(T34, T35); + } + { + V T3d, T3e, T3m, T3g, T3h, T3n; + T3d = VFNMS(LDK(KP425779291), T2E, VMUL(LDK(KP1_809654104), T2D)); + T3e = VFMA(LDK(KP963507348), T2G, VMUL(LDK(KP876306680), T2H)); + T3m = VADD(T3e, T3d); + T3g = VFMA(LDK(KP1_688655851), T2N, VMUL(LDK(KP535826794), T2O)); + T3h = VFMA(LDK(KP1_996053456), T2K, VMUL(LDK(KP062790519), T2L)); + T3n = VADD(T3g, T3h); + T3f = VSUB(T3d, T3e); + T3p = VADD(T3m, T3n); + T3i = VSUB(T3g, T3h); + T3o = VMUL(LDK(KP559016994), VSUB(T3m, T3n)); + } + { + V T3u, T3v, T2T, T31; + T3u = VBYI(VADD(T2S, T3b)); + T3v = VADD(T2U, T3p); + ST(&(x[WS(rs, 2)]), VADD(T3u, T3v), ms, &(x[0])); + ST(&(x[WS(rs, 23)]), VSUB(T3v, T3u), ms, &(x[WS(rs, 1)])); + T2T = VBYI(VSUB(VADD(T2J, T2Q), T2S)); + T31 = VADD(T2U, VADD(T2X, T30)); + ST(&(x[WS(rs, 3)]), VADD(T2T, T31), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 22)]), VSUB(T31, T2T), ms, &(x[0])); + } + T32 = VFMA(LDK(KP309016994), T2X, VFNMS(LDK(KP809016994), T30, VFNMS(LDK(KP587785252), VADD(T2P, T2M), VFNMS(LDK(KP951056516), VADD(T2I, T2F), T2U)))); + T33 = VBYI(VSUB(VFNMS(LDK(KP587785252), VADD(T2Y, T2Z), VFNMS(LDK(KP809016994), T2Q, VFNMS(LDK(KP951056516), VADD(T2V, T2W), VMUL(LDK(KP309016994), T2J)))), T2S)); + ST(&(x[WS(rs, 17)]), VSUB(T32, T33), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 8)]), VADD(T32, T33), ms, &(x[0])); + { + V T3j, T3s, T3r, T3t, T3c, T3q; + T3c = VFNMS(LDK(KP250000000), T3b, T2S); + T3j = VBYI(VADD(T3a, VADD(T3c, VFNMS(LDK(KP587785252), T3i, VMUL(LDK(KP951056516), T3f))))); + T3s = VBYI(VADD(T3c, VSUB(VFMA(LDK(KP587785252), T3f, VMUL(LDK(KP951056516), T3i)), T3a))); + T3q = VFNMS(LDK(KP250000000), T3p, T2U); + T3r = VFMA(LDK(KP951056516), T3k, VFMA(LDK(KP587785252), T3l, VADD(T3o, T3q))); + T3t = VFMA(LDK(KP587785252), T3k, VSUB(VFNMS(LDK(KP951056516), T3l, T3q), T3o)); + ST(&(x[WS(rs, 7)]), VADD(T3j, T3r), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VSUB(T3t, T3s), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 18)]), VSUB(T3r, T3j), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T3s, T3t), ms, &(x[0])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 24), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 25, XSIMD_STRING("t3fv_25"), twinstr, &GENUS, {190, 150, 78, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_25) (planner *p) { + X(kdft_dit_register) (p, t3fv_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_32.c new file mode 100644 index 000000000..166649d03 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_32.c @@ -0,0 +1,916 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 32 -name t3fv_32 -include dft/simd/t3f.h */ + +/* + * This function contains 244 FP additions, 214 FP multiplications, + * (or, 146 additions, 116 multiplications, 98 fused multiply/add), + * 90 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(32, rs)) { + V T2, T5, T3, T4, Tc, T1C, TT, Tz, Tn, T6, TP, Tf, TK, T7, T8; + V Tv, T1w, T21, Tg, Tk, T1D, T1O, TC, T18, T12, T1t, TH, TL, TQ, T1m; + V T1c; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + Tc = VZMUL(T2, T3); + T1C = VZMULJ(T2, T5); + TT = VZMULJ(T3, T5); + Tz = VZMUL(T2, T5); + Tn = VZMUL(T3, T5); + T6 = VZMUL(T4, T5); + TP = VZMULJ(Tc, T5); + Tf = VZMULJ(T4, T5); + TK = VZMUL(Tc, T5); + T7 = LDW(&(W[TWVL * 6])); + T8 = VZMULJ(T6, T7); + Tv = VZMULJ(T5, T7); + T1w = VZMULJ(Tn, T7); + T21 = VZMULJ(T3, T7); + Tg = VZMULJ(Tf, T7); + Tk = VZMUL(T2, T7); + T1D = VZMULJ(T1C, T7); + T1O = VZMULJ(Tc, T7); + TC = VZMULJ(T2, T7); + T18 = VZMULJ(TT, T7); + T12 = VZMULJ(Tz, T7); + T1t = VZMUL(Tc, T7); + TH = VZMUL(T3, T7); + TL = VZMULJ(TK, T7); + TQ = VZMULJ(TP, T7); + T1m = VZMULJ(T4, T7); + T1c = VZMUL(T4, T7); + { + V Tb, T24, T2T, T3x, Tr, T25, T2W, T3K, TX, T28, T3g, T3z, TG, T27, T3j; + V T3y, T1N, T2v, T3a, T3G, T1V, T2w, T37, T3F, T1j, T2s, T33, T3D, T1r, T2t; + V T30, T3C; + { + V T1, T23, Ta, T20, T22, T9, T1Z, T2R, T2S; + T1 = LD(&(x[0]), ms, &(x[0])); + T22 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T23 = VZMULJ(T21, T22); + T9 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Ta = VZMULJ(T8, T9); + T1Z = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T20 = VZMULJ(T1C, T1Z); + Tb = VSUB(T1, Ta); + T24 = VSUB(T20, T23); + T2R = VADD(T1, Ta); + T2S = VADD(T20, T23); + T2T = VADD(T2R, T2S); + T3x = VSUB(T2R, T2S); + } + { + V Te, Tp, Ti, Tm; + { + V Td, To, Th, Tl; + Td = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Te = VZMULJ(Tc, Td); + To = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tp = VZMULJ(Tn, To); + Th = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Ti = VZMULJ(Tg, Th); + Tl = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tm = VZMULJ(Tk, Tl); + } + { + V Tj, Tq, T2U, T2V; + Tj = VSUB(Te, Ti); + Tq = VSUB(Tm, Tp); + Tr = VADD(Tj, Tq); + T25 = VSUB(Tq, Tj); + T2U = VADD(Te, Ti); + T2V = VADD(Tm, Tp); + T2W = VADD(T2U, T2V); + T3K = VSUB(T2V, T2U); + } + } + { + V TJ, TV, TN, TS; + { + V TI, TU, TM, TR; + TI = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TJ = VZMULJ(TH, TI); + TU = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TV = VZMULJ(TT, TU); + TM = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TN = VZMULJ(TL, TM); + TR = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TS = VZMULJ(TQ, TR); + } + { + V TO, TW, T3e, T3f; + TO = VSUB(TJ, TN); + TW = VSUB(TS, TV); + TX = VFNMS(LDK(KP414213562), TW, TO); + T28 = VFMA(LDK(KP414213562), TO, TW); + T3e = VADD(TJ, TN); + T3f = VADD(TV, TS); + T3g = VADD(T3e, T3f); + T3z = VSUB(T3e, T3f); + } + } + { + V Tu, TE, Tx, TB; + { + V Tt, TD, Tw, TA; + Tt = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tu = VZMULJ(T4, Tt); + TD = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TE = VZMULJ(TC, TD); + Tw = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tx = VZMULJ(Tv, Tw); + TA = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TB = VZMULJ(Tz, TA); + } + { + V Ty, TF, T3h, T3i; + Ty = VSUB(Tu, Tx); + TF = VSUB(TB, TE); + TG = VFNMS(LDK(KP414213562), TF, Ty); + T27 = VFMA(LDK(KP414213562), Ty, TF); + T3h = VADD(Tu, Tx); + T3i = VADD(TB, TE); + T3j = VADD(T3h, T3i); + T3y = VSUB(T3h, T3i); + } + } + { + V T1v, T1y, T1S, T1Q, T1I, T1K, T1L, T1B, T1F, T1G; + { + V T1u, T1x, T1R, T1P; + T1u = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T1v = VZMULJ(T1t, T1u); + T1x = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1y = VZMULJ(T1w, T1x); + T1R = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1S = VZMULJ(Tf, T1R); + T1P = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1Q = VZMULJ(T1O, T1P); + { + V T1H, T1J, T1A, T1E; + T1H = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1I = VZMULJ(T7, T1H); + T1J = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1K = VZMULJ(T6, T1J); + T1L = VSUB(T1I, T1K); + T1A = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1B = VZMULJ(T3, T1A); + T1E = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1F = VZMULJ(T1D, T1E); + T1G = VSUB(T1B, T1F); + } + } + { + V T1z, T1M, T38, T39; + T1z = VSUB(T1v, T1y); + T1M = VADD(T1G, T1L); + T1N = VFMA(LDK(KP707106781), T1M, T1z); + T2v = VFNMS(LDK(KP707106781), T1M, T1z); + T38 = VADD(T1B, T1F); + T39 = VADD(T1I, T1K); + T3a = VADD(T38, T39); + T3G = VSUB(T39, T38); + } + { + V T1T, T1U, T35, T36; + T1T = VSUB(T1Q, T1S); + T1U = VSUB(T1L, T1G); + T1V = VFMA(LDK(KP707106781), T1U, T1T); + T2w = VFNMS(LDK(KP707106781), T1U, T1T); + T35 = VADD(T1v, T1y); + T36 = VADD(T1S, T1Q); + T37 = VADD(T35, T36); + T3F = VSUB(T35, T36); + } + } + { + V T11, T14, T1o, T1l, T1e, T1g, T1h, T17, T1a, T1b; + { + V T10, T13, T1n, T1k; + T10 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T11 = VZMULJ(T2, T10); + T13 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T14 = VZMULJ(T12, T13); + T1n = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T1o = VZMULJ(T1m, T1n); + T1k = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1l = VZMULJ(T5, T1k); + { + V T1d, T1f, T16, T19; + T1d = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1e = VZMULJ(T1c, T1d); + T1f = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1g = VZMULJ(TK, T1f); + T1h = VSUB(T1e, T1g); + T16 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T17 = VZMULJ(TP, T16); + T19 = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1a = VZMULJ(T18, T19); + T1b = VSUB(T17, T1a); + } + } + { + V T15, T1i, T31, T32; + T15 = VSUB(T11, T14); + T1i = VADD(T1b, T1h); + T1j = VFMA(LDK(KP707106781), T1i, T15); + T2s = VFNMS(LDK(KP707106781), T1i, T15); + T31 = VADD(T17, T1a); + T32 = VADD(T1e, T1g); + T33 = VADD(T31, T32); + T3D = VSUB(T31, T32); + } + { + V T1p, T1q, T2Y, T2Z; + T1p = VSUB(T1l, T1o); + T1q = VSUB(T1b, T1h); + T1r = VFMA(LDK(KP707106781), T1q, T1p); + T2t = VFNMS(LDK(KP707106781), T1q, T1p); + T2Y = VADD(T11, T14); + T2Z = VADD(T1l, T1o); + T30 = VADD(T2Y, T2Z); + T3C = VSUB(T2Y, T2Z); + } + } + { + V T3r, T3v, T3u, T3w; + { + V T3p, T3q, T3s, T3t; + T3p = VADD(T2T, T2W); + T3q = VADD(T3j, T3g); + T3r = VADD(T3p, T3q); + T3v = VSUB(T3p, T3q); + T3s = VADD(T30, T33); + T3t = VADD(T37, T3a); + T3u = VADD(T3s, T3t); + T3w = VSUB(T3t, T3s); + } + ST(&(x[WS(rs, 16)]), VSUB(T3r, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VFMAI(T3w, T3v), ms, &(x[0])); + ST(&(x[0]), VADD(T3r, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VFNMSI(T3w, T3v), ms, &(x[0])); + } + { + V T2X, T3k, T3c, T3l, T34, T3b; + T2X = VSUB(T2T, T2W); + T3k = VSUB(T3g, T3j); + T34 = VSUB(T30, T33); + T3b = VSUB(T37, T3a); + T3c = VADD(T34, T3b); + T3l = VSUB(T3b, T34); + { + V T3d, T3m, T3n, T3o; + T3d = VFNMS(LDK(KP707106781), T3c, T2X); + T3m = VFNMS(LDK(KP707106781), T3l, T3k); + ST(&(x[WS(rs, 12)]), VFNMSI(T3m, T3d), ms, &(x[0])); + ST(&(x[WS(rs, 20)]), VFMAI(T3m, T3d), ms, &(x[0])); + T3n = VFMA(LDK(KP707106781), T3c, T2X); + T3o = VFMA(LDK(KP707106781), T3l, T3k); + ST(&(x[WS(rs, 28)]), VFNMSI(T3o, T3n), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VFMAI(T3o, T3n), ms, &(x[0])); + } + } + { + V T3B, T3T, T3M, T3W, T3I, T3X, T3P, T3U, T3A, T3L; + T3A = VADD(T3y, T3z); + T3B = VFMA(LDK(KP707106781), T3A, T3x); + T3T = VFNMS(LDK(KP707106781), T3A, T3x); + T3L = VSUB(T3z, T3y); + T3M = VFMA(LDK(KP707106781), T3L, T3K); + T3W = VFNMS(LDK(KP707106781), T3L, T3K); + { + V T3E, T3H, T3N, T3O; + T3E = VFNMS(LDK(KP414213562), T3D, T3C); + T3H = VFNMS(LDK(KP414213562), T3G, T3F); + T3I = VADD(T3E, T3H); + T3X = VSUB(T3H, T3E); + T3N = VFMA(LDK(KP414213562), T3F, T3G); + T3O = VFMA(LDK(KP414213562), T3C, T3D); + T3P = VSUB(T3N, T3O); + T3U = VADD(T3O, T3N); + } + { + V T3J, T3Q, T3Z, T40; + T3J = VFNMS(LDK(KP923879532), T3I, T3B); + T3Q = VFNMS(LDK(KP923879532), T3P, T3M); + ST(&(x[WS(rs, 14)]), VFNMSI(T3Q, T3J), ms, &(x[0])); + ST(&(x[WS(rs, 18)]), VFMAI(T3Q, T3J), ms, &(x[0])); + T3Z = VFMA(LDK(KP923879532), T3U, T3T); + T40 = VFNMS(LDK(KP923879532), T3X, T3W); + ST(&(x[WS(rs, 6)]), VFNMSI(T40, T3Z), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VFMAI(T40, T3Z), ms, &(x[0])); + } + { + V T3R, T3S, T3V, T3Y; + T3R = VFMA(LDK(KP923879532), T3I, T3B); + T3S = VFMA(LDK(KP923879532), T3P, T3M); + ST(&(x[WS(rs, 30)]), VFNMSI(T3S, T3R), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(T3S, T3R), ms, &(x[0])); + T3V = VFNMS(LDK(KP923879532), T3U, T3T); + T3Y = VFMA(LDK(KP923879532), T3X, T3W); + ST(&(x[WS(rs, 10)]), VFMAI(T3Y, T3V), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VFNMSI(T3Y, T3V), ms, &(x[0])); + } + } + { + V TZ, T2h, T2d, T2i, T1X, T2l, T2a, T2k; + { + V Ts, TY, T2b, T2c; + Ts = VFMA(LDK(KP707106781), Tr, Tb); + TY = VADD(TG, TX); + TZ = VFMA(LDK(KP923879532), TY, Ts); + T2h = VFNMS(LDK(KP923879532), TY, Ts); + T2b = VFMA(LDK(KP198912367), T1j, T1r); + T2c = VFMA(LDK(KP198912367), T1N, T1V); + T2d = VSUB(T2b, T2c); + T2i = VADD(T2b, T2c); + } + { + V T1s, T1W, T26, T29; + T1s = VFNMS(LDK(KP198912367), T1r, T1j); + T1W = VFNMS(LDK(KP198912367), T1V, T1N); + T1X = VADD(T1s, T1W); + T2l = VSUB(T1W, T1s); + T26 = VFNMS(LDK(KP707106781), T25, T24); + T29 = VSUB(T27, T28); + T2a = VFMA(LDK(KP923879532), T29, T26); + T2k = VFNMS(LDK(KP923879532), T29, T26); + } + { + V T1Y, T2e, T2n, T2o; + T1Y = VFNMS(LDK(KP980785280), T1X, TZ); + T2e = VFNMS(LDK(KP980785280), T2d, T2a); + ST(&(x[WS(rs, 17)]), VFNMSI(T2e, T1Y), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VFMAI(T2e, T1Y), ms, &(x[WS(rs, 1)])); + T2n = VFMA(LDK(KP980785280), T2i, T2h); + T2o = VFMA(LDK(KP980785280), T2l, T2k); + ST(&(x[WS(rs, 7)]), VFMAI(T2o, T2n), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VFNMSI(T2o, T2n), ms, &(x[WS(rs, 1)])); + } + { + V T2f, T2g, T2j, T2m; + T2f = VFMA(LDK(KP980785280), T1X, TZ); + T2g = VFMA(LDK(KP980785280), T2d, T2a); + ST(&(x[WS(rs, 1)]), VFNMSI(T2g, T2f), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 31)]), VFMAI(T2g, T2f), ms, &(x[WS(rs, 1)])); + T2j = VFNMS(LDK(KP980785280), T2i, T2h); + T2m = VFNMS(LDK(KP980785280), T2l, T2k); + ST(&(x[WS(rs, 9)]), VFNMSI(T2m, T2j), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VFMAI(T2m, T2j), ms, &(x[WS(rs, 1)])); + } + } + { + V T2r, T2J, T2F, T2K, T2y, T2N, T2C, T2M; + { + V T2p, T2q, T2D, T2E; + T2p = VFNMS(LDK(KP707106781), Tr, Tb); + T2q = VADD(T27, T28); + T2r = VFMA(LDK(KP923879532), T2q, T2p); + T2J = VFNMS(LDK(KP923879532), T2q, T2p); + T2D = VFNMS(LDK(KP668178637), T2s, T2t); + T2E = VFNMS(LDK(KP668178637), T2v, T2w); + T2F = VSUB(T2D, T2E); + T2K = VADD(T2D, T2E); + } + { + V T2u, T2x, T2A, T2B; + T2u = VFMA(LDK(KP668178637), T2t, T2s); + T2x = VFMA(LDK(KP668178637), T2w, T2v); + T2y = VADD(T2u, T2x); + T2N = VSUB(T2x, T2u); + T2A = VFMA(LDK(KP707106781), T25, T24); + T2B = VSUB(TX, TG); + T2C = VFMA(LDK(KP923879532), T2B, T2A); + T2M = VFNMS(LDK(KP923879532), T2B, T2A); + } + { + V T2z, T2G, T2P, T2Q; + T2z = VFNMS(LDK(KP831469612), T2y, T2r); + T2G = VFNMS(LDK(KP831469612), T2F, T2C); + ST(&(x[WS(rs, 13)]), VFNMSI(T2G, T2z), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 19)]), VFMAI(T2G, T2z), ms, &(x[WS(rs, 1)])); + T2P = VFNMS(LDK(KP831469612), T2K, T2J); + T2Q = VFNMS(LDK(KP831469612), T2N, T2M); + ST(&(x[WS(rs, 5)]), VFNMSI(T2Q, T2P), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VFMAI(T2Q, T2P), ms, &(x[WS(rs, 1)])); + } + { + V T2H, T2I, T2L, T2O; + T2H = VFMA(LDK(KP831469612), T2y, T2r); + T2I = VFMA(LDK(KP831469612), T2F, T2C); + ST(&(x[WS(rs, 29)]), VFNMSI(T2I, T2H), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(T2I, T2H), ms, &(x[WS(rs, 1)])); + T2L = VFMA(LDK(KP831469612), T2K, T2J); + T2O = VFMA(LDK(KP831469612), T2N, T2M); + ST(&(x[WS(rs, 11)]), VFMAI(T2O, T2L), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VFNMSI(T2O, T2L), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 27), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t3fv_32"), twinstr, &GENUS, {146, 116, 98, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_32) (planner *p) { + X(kdft_dit_register) (p, t3fv_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 32 -name t3fv_32 -include dft/simd/t3f.h */ + +/* + * This function contains 244 FP additions, 158 FP multiplications, + * (or, 228 additions, 142 multiplications, 16 fused multiply/add), + * 90 stack variables, 7 constants, and 64 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_32(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 8)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 8), MAKE_VOLATILE_STRIDE(32, rs)) { + V T2, T5, T3, T4, Tc, T1C, TP, Tz, Tn, T6, TS, Tf, TK, T7, T8; + V Tv, T1w, T22, Tg, Tk, T1D, T1R, TC, T18, T12, T1t, TH, TL, TT, T1n; + V T1c; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 4])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + Tc = VZMUL(T2, T3); + T1C = VZMULJ(T2, T5); + TP = VZMULJ(T3, T5); + Tz = VZMUL(T2, T5); + Tn = VZMUL(T3, T5); + T6 = VZMUL(T4, T5); + TS = VZMULJ(Tc, T5); + Tf = VZMULJ(T4, T5); + TK = VZMUL(Tc, T5); + T7 = LDW(&(W[TWVL * 6])); + T8 = VZMULJ(T6, T7); + Tv = VZMULJ(T5, T7); + T1w = VZMULJ(Tn, T7); + T22 = VZMULJ(T3, T7); + Tg = VZMULJ(Tf, T7); + Tk = VZMUL(T2, T7); + T1D = VZMULJ(T1C, T7); + T1R = VZMULJ(Tc, T7); + TC = VZMULJ(T2, T7); + T18 = VZMULJ(TP, T7); + T12 = VZMULJ(Tz, T7); + T1t = VZMUL(Tc, T7); + TH = VZMUL(T3, T7); + TL = VZMULJ(TK, T7); + TT = VZMULJ(TS, T7); + T1n = VZMULJ(T4, T7); + T1c = VZMUL(T4, T7); + { + V Tb, T25, T2T, T3x, Tr, T1Z, T2W, T3K, TX, T27, T3g, T3z, TG, T28, T3j; + V T3y, T1N, T2v, T3a, T3G, T1V, T2w, T37, T3F, T1j, T2s, T33, T3D, T1r, T2t; + V T30, T3C; + { + V T1, T24, Ta, T21, T23, T9, T20, T2R, T2S; + T1 = LD(&(x[0]), ms, &(x[0])); + T23 = LD(&(x[WS(rs, 24)]), ms, &(x[0])); + T24 = VZMULJ(T22, T23); + T9 = LD(&(x[WS(rs, 16)]), ms, &(x[0])); + Ta = VZMULJ(T8, T9); + T20 = LD(&(x[WS(rs, 8)]), ms, &(x[0])); + T21 = VZMULJ(T1C, T20); + Tb = VSUB(T1, Ta); + T25 = VSUB(T21, T24); + T2R = VADD(T1, Ta); + T2S = VADD(T21, T24); + T2T = VADD(T2R, T2S); + T3x = VSUB(T2R, T2S); + } + { + V Te, Tp, Ti, Tm; + { + V Td, To, Th, Tl; + Td = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + Te = VZMULJ(Tc, Td); + To = LD(&(x[WS(rs, 12)]), ms, &(x[0])); + Tp = VZMULJ(Tn, To); + Th = LD(&(x[WS(rs, 20)]), ms, &(x[0])); + Ti = VZMULJ(Tg, Th); + Tl = LD(&(x[WS(rs, 28)]), ms, &(x[0])); + Tm = VZMULJ(Tk, Tl); + } + { + V Tj, Tq, T2U, T2V; + Tj = VSUB(Te, Ti); + Tq = VSUB(Tm, Tp); + Tr = VMUL(LDK(KP707106781), VADD(Tj, Tq)); + T1Z = VMUL(LDK(KP707106781), VSUB(Tq, Tj)); + T2U = VADD(Te, Ti); + T2V = VADD(Tm, Tp); + T2W = VADD(T2U, T2V); + T3K = VSUB(T2V, T2U); + } + } + { + V TJ, TV, TN, TR; + { + V TI, TU, TM, TQ; + TI = LD(&(x[WS(rs, 30)]), ms, &(x[0])); + TJ = VZMULJ(TH, TI); + TU = LD(&(x[WS(rs, 22)]), ms, &(x[0])); + TV = VZMULJ(TT, TU); + TM = LD(&(x[WS(rs, 14)]), ms, &(x[0])); + TN = VZMULJ(TL, TM); + TQ = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + TR = VZMULJ(TP, TQ); + } + { + V TO, TW, T3e, T3f; + TO = VSUB(TJ, TN); + TW = VSUB(TR, TV); + TX = VFMA(LDK(KP923879532), TO, VMUL(LDK(KP382683432), TW)); + T27 = VFNMS(LDK(KP923879532), TW, VMUL(LDK(KP382683432), TO)); + T3e = VADD(TJ, TN); + T3f = VADD(TR, TV); + T3g = VADD(T3e, T3f); + T3z = VSUB(T3e, T3f); + } + } + { + V Tu, TE, Tx, TB; + { + V Tt, TD, Tw, TA; + Tt = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tu = VZMULJ(T4, Tt); + TD = LD(&(x[WS(rs, 26)]), ms, &(x[0])); + TE = VZMULJ(TC, TD); + Tw = LD(&(x[WS(rs, 18)]), ms, &(x[0])); + Tx = VZMULJ(Tv, Tw); + TA = LD(&(x[WS(rs, 10)]), ms, &(x[0])); + TB = VZMULJ(Tz, TA); + } + { + V Ty, TF, T3h, T3i; + Ty = VSUB(Tu, Tx); + TF = VSUB(TB, TE); + TG = VFNMS(LDK(KP382683432), TF, VMUL(LDK(KP923879532), Ty)); + T28 = VFMA(LDK(KP382683432), Ty, VMUL(LDK(KP923879532), TF)); + T3h = VADD(Tu, Tx); + T3i = VADD(TB, TE); + T3j = VADD(T3h, T3i); + T3y = VSUB(T3h, T3i); + } + } + { + V T1v, T1y, T1T, T1Q, T1I, T1K, T1L, T1B, T1F, T1G; + { + V T1u, T1x, T1S, T1P; + T1u = LD(&(x[WS(rs, 31)]), ms, &(x[WS(rs, 1)])); + T1v = VZMULJ(T1t, T1u); + T1x = LD(&(x[WS(rs, 15)]), ms, &(x[WS(rs, 1)])); + T1y = VZMULJ(T1w, T1x); + T1S = LD(&(x[WS(rs, 23)]), ms, &(x[WS(rs, 1)])); + T1T = VZMULJ(T1R, T1S); + T1P = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + T1Q = VZMULJ(Tf, T1P); + { + V T1H, T1J, T1A, T1E; + T1H = LD(&(x[WS(rs, 27)]), ms, &(x[WS(rs, 1)])); + T1I = VZMULJ(T7, T1H); + T1J = LD(&(x[WS(rs, 11)]), ms, &(x[WS(rs, 1)])); + T1K = VZMULJ(T6, T1J); + T1L = VSUB(T1I, T1K); + T1A = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + T1B = VZMULJ(T3, T1A); + T1E = LD(&(x[WS(rs, 19)]), ms, &(x[WS(rs, 1)])); + T1F = VZMULJ(T1D, T1E); + T1G = VSUB(T1B, T1F); + } + } + { + V T1z, T1M, T38, T39; + T1z = VSUB(T1v, T1y); + T1M = VMUL(LDK(KP707106781), VADD(T1G, T1L)); + T1N = VADD(T1z, T1M); + T2v = VSUB(T1z, T1M); + T38 = VADD(T1B, T1F); + T39 = VADD(T1I, T1K); + T3a = VADD(T38, T39); + T3G = VSUB(T39, T38); + } + { + V T1O, T1U, T35, T36; + T1O = VMUL(LDK(KP707106781), VSUB(T1L, T1G)); + T1U = VSUB(T1Q, T1T); + T1V = VSUB(T1O, T1U); + T2w = VADD(T1U, T1O); + T35 = VADD(T1v, T1y); + T36 = VADD(T1Q, T1T); + T37 = VADD(T35, T36); + T3F = VSUB(T35, T36); + } + } + { + V T11, T14, T1p, T1m, T1e, T1g, T1h, T17, T1a, T1b; + { + V T10, T13, T1o, T1l; + T10 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T11 = VZMULJ(T2, T10); + T13 = LD(&(x[WS(rs, 17)]), ms, &(x[WS(rs, 1)])); + T14 = VZMULJ(T12, T13); + T1o = LD(&(x[WS(rs, 25)]), ms, &(x[WS(rs, 1)])); + T1p = VZMULJ(T1n, T1o); + T1l = LD(&(x[WS(rs, 9)]), ms, &(x[WS(rs, 1)])); + T1m = VZMULJ(T5, T1l); + { + V T1d, T1f, T16, T19; + T1d = LD(&(x[WS(rs, 29)]), ms, &(x[WS(rs, 1)])); + T1e = VZMULJ(T1c, T1d); + T1f = LD(&(x[WS(rs, 13)]), ms, &(x[WS(rs, 1)])); + T1g = VZMULJ(TK, T1f); + T1h = VSUB(T1e, T1g); + T16 = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + T17 = VZMULJ(TS, T16); + T19 = LD(&(x[WS(rs, 21)]), ms, &(x[WS(rs, 1)])); + T1a = VZMULJ(T18, T19); + T1b = VSUB(T17, T1a); + } + } + { + V T15, T1i, T31, T32; + T15 = VSUB(T11, T14); + T1i = VMUL(LDK(KP707106781), VADD(T1b, T1h)); + T1j = VADD(T15, T1i); + T2s = VSUB(T15, T1i); + T31 = VADD(T17, T1a); + T32 = VADD(T1e, T1g); + T33 = VADD(T31, T32); + T3D = VSUB(T32, T31); + } + { + V T1k, T1q, T2Y, T2Z; + T1k = VMUL(LDK(KP707106781), VSUB(T1h, T1b)); + T1q = VSUB(T1m, T1p); + T1r = VSUB(T1k, T1q); + T2t = VADD(T1q, T1k); + T2Y = VADD(T11, T14); + T2Z = VADD(T1m, T1p); + T30 = VADD(T2Y, T2Z); + T3C = VSUB(T2Y, T2Z); + } + } + { + V T3r, T3v, T3u, T3w; + { + V T3p, T3q, T3s, T3t; + T3p = VADD(T2T, T2W); + T3q = VADD(T3j, T3g); + T3r = VADD(T3p, T3q); + T3v = VSUB(T3p, T3q); + T3s = VADD(T30, T33); + T3t = VADD(T37, T3a); + T3u = VADD(T3s, T3t); + T3w = VBYI(VSUB(T3t, T3s)); + } + ST(&(x[WS(rs, 16)]), VSUB(T3r, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 8)]), VADD(T3v, T3w), ms, &(x[0])); + ST(&(x[0]), VADD(T3r, T3u), ms, &(x[0])); + ST(&(x[WS(rs, 24)]), VSUB(T3v, T3w), ms, &(x[0])); + } + { + V T2X, T3k, T3c, T3l, T34, T3b; + T2X = VSUB(T2T, T2W); + T3k = VSUB(T3g, T3j); + T34 = VSUB(T30, T33); + T3b = VSUB(T37, T3a); + T3c = VMUL(LDK(KP707106781), VADD(T34, T3b)); + T3l = VMUL(LDK(KP707106781), VSUB(T3b, T34)); + { + V T3d, T3m, T3n, T3o; + T3d = VADD(T2X, T3c); + T3m = VBYI(VADD(T3k, T3l)); + ST(&(x[WS(rs, 28)]), VSUB(T3d, T3m), ms, &(x[0])); + ST(&(x[WS(rs, 4)]), VADD(T3d, T3m), ms, &(x[0])); + T3n = VSUB(T2X, T3c); + T3o = VBYI(VSUB(T3l, T3k)); + ST(&(x[WS(rs, 20)]), VSUB(T3n, T3o), ms, &(x[0])); + ST(&(x[WS(rs, 12)]), VADD(T3n, T3o), ms, &(x[0])); + } + } + { + V T3B, T3W, T3M, T3U, T3I, T3T, T3P, T3X, T3A, T3L; + T3A = VMUL(LDK(KP707106781), VADD(T3y, T3z)); + T3B = VADD(T3x, T3A); + T3W = VSUB(T3x, T3A); + T3L = VMUL(LDK(KP707106781), VSUB(T3z, T3y)); + T3M = VADD(T3K, T3L); + T3U = VSUB(T3L, T3K); + { + V T3E, T3H, T3N, T3O; + T3E = VFMA(LDK(KP923879532), T3C, VMUL(LDK(KP382683432), T3D)); + T3H = VFNMS(LDK(KP382683432), T3G, VMUL(LDK(KP923879532), T3F)); + T3I = VADD(T3E, T3H); + T3T = VSUB(T3H, T3E); + T3N = VFNMS(LDK(KP382683432), T3C, VMUL(LDK(KP923879532), T3D)); + T3O = VFMA(LDK(KP382683432), T3F, VMUL(LDK(KP923879532), T3G)); + T3P = VADD(T3N, T3O); + T3X = VSUB(T3O, T3N); + } + { + V T3J, T3Q, T3Z, T40; + T3J = VADD(T3B, T3I); + T3Q = VBYI(VADD(T3M, T3P)); + ST(&(x[WS(rs, 30)]), VSUB(T3J, T3Q), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(T3J, T3Q), ms, &(x[0])); + T3Z = VBYI(VADD(T3U, T3T)); + T40 = VADD(T3W, T3X); + ST(&(x[WS(rs, 6)]), VADD(T3Z, T40), ms, &(x[0])); + ST(&(x[WS(rs, 26)]), VSUB(T40, T3Z), ms, &(x[0])); + } + { + V T3R, T3S, T3V, T3Y; + T3R = VSUB(T3B, T3I); + T3S = VBYI(VSUB(T3P, T3M)); + ST(&(x[WS(rs, 18)]), VSUB(T3R, T3S), ms, &(x[0])); + ST(&(x[WS(rs, 14)]), VADD(T3R, T3S), ms, &(x[0])); + T3V = VBYI(VSUB(T3T, T3U)); + T3Y = VSUB(T3W, T3X); + ST(&(x[WS(rs, 10)]), VADD(T3V, T3Y), ms, &(x[0])); + ST(&(x[WS(rs, 22)]), VSUB(T3Y, T3V), ms, &(x[0])); + } + } + { + V TZ, T2k, T2d, T2l, T1X, T2h, T2a, T2i; + { + V Ts, TY, T2b, T2c; + Ts = VADD(Tb, Tr); + TY = VADD(TG, TX); + TZ = VADD(Ts, TY); + T2k = VSUB(Ts, TY); + T2b = VFNMS(LDK(KP195090322), T1j, VMUL(LDK(KP980785280), T1r)); + T2c = VFMA(LDK(KP195090322), T1N, VMUL(LDK(KP980785280), T1V)); + T2d = VADD(T2b, T2c); + T2l = VSUB(T2c, T2b); + } + { + V T1s, T1W, T26, T29; + T1s = VFMA(LDK(KP980785280), T1j, VMUL(LDK(KP195090322), T1r)); + T1W = VFNMS(LDK(KP195090322), T1V, VMUL(LDK(KP980785280), T1N)); + T1X = VADD(T1s, T1W); + T2h = VSUB(T1W, T1s); + T26 = VSUB(T1Z, T25); + T29 = VSUB(T27, T28); + T2a = VADD(T26, T29); + T2i = VSUB(T29, T26); + } + { + V T1Y, T2e, T2n, T2o; + T1Y = VADD(TZ, T1X); + T2e = VBYI(VADD(T2a, T2d)); + ST(&(x[WS(rs, 31)]), VSUB(T1Y, T2e), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(T1Y, T2e), ms, &(x[WS(rs, 1)])); + T2n = VBYI(VADD(T2i, T2h)); + T2o = VADD(T2k, T2l); + ST(&(x[WS(rs, 7)]), VADD(T2n, T2o), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 25)]), VSUB(T2o, T2n), ms, &(x[WS(rs, 1)])); + } + { + V T2f, T2g, T2j, T2m; + T2f = VSUB(TZ, T1X); + T2g = VBYI(VSUB(T2d, T2a)); + ST(&(x[WS(rs, 17)]), VSUB(T2f, T2g), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 15)]), VADD(T2f, T2g), ms, &(x[WS(rs, 1)])); + T2j = VBYI(VSUB(T2h, T2i)); + T2m = VSUB(T2k, T2l); + ST(&(x[WS(rs, 9)]), VADD(T2j, T2m), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 23)]), VSUB(T2m, T2j), ms, &(x[WS(rs, 1)])); + } + } + { + V T2r, T2M, T2F, T2N, T2y, T2J, T2C, T2K; + { + V T2p, T2q, T2D, T2E; + T2p = VSUB(Tb, Tr); + T2q = VADD(T28, T27); + T2r = VADD(T2p, T2q); + T2M = VSUB(T2p, T2q); + T2D = VFNMS(LDK(KP555570233), T2s, VMUL(LDK(KP831469612), T2t)); + T2E = VFMA(LDK(KP555570233), T2v, VMUL(LDK(KP831469612), T2w)); + T2F = VADD(T2D, T2E); + T2N = VSUB(T2E, T2D); + } + { + V T2u, T2x, T2A, T2B; + T2u = VFMA(LDK(KP831469612), T2s, VMUL(LDK(KP555570233), T2t)); + T2x = VFNMS(LDK(KP555570233), T2w, VMUL(LDK(KP831469612), T2v)); + T2y = VADD(T2u, T2x); + T2J = VSUB(T2x, T2u); + T2A = VADD(T25, T1Z); + T2B = VSUB(TX, TG); + T2C = VADD(T2A, T2B); + T2K = VSUB(T2B, T2A); + } + { + V T2z, T2G, T2P, T2Q; + T2z = VADD(T2r, T2y); + T2G = VBYI(VADD(T2C, T2F)); + ST(&(x[WS(rs, 29)]), VSUB(T2z, T2G), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T2z, T2G), ms, &(x[WS(rs, 1)])); + T2P = VBYI(VADD(T2K, T2J)); + T2Q = VADD(T2M, T2N); + ST(&(x[WS(rs, 5)]), VADD(T2P, T2Q), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 27)]), VSUB(T2Q, T2P), ms, &(x[WS(rs, 1)])); + } + { + V T2H, T2I, T2L, T2O; + T2H = VSUB(T2r, T2y); + T2I = VBYI(VSUB(T2F, T2C)); + ST(&(x[WS(rs, 19)]), VSUB(T2H, T2I), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 13)]), VADD(T2H, T2I), ms, &(x[WS(rs, 1)])); + T2L = VBYI(VSUB(T2J, T2K)); + T2O = VSUB(T2M, T2N); + ST(&(x[WS(rs, 11)]), VADD(T2L, T2O), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 21)]), VSUB(T2O, T2L), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 9), + VTW(0, 27), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 32, XSIMD_STRING("t3fv_32"), twinstr, &GENUS, {228, 142, 16, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_32) (planner *p) { + X(kdft_dit_register) (p, t3fv_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_4.c new file mode 100644 index 000000000..7ee2deea7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_4.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 4 -name t3fv_4 -include dft/simd/t3f.h */ + +/* + * This function contains 12 FP additions, 10 FP multiplications, + * (or, 10 additions, 8 multiplications, 2 fused multiply/add), + * 16 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(4, rs)) { + V T2, T3, T4; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + { + V T1, Tb, T6, T9, Ta, T5, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + Ta = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tb = VZMULJ(T3, Ta); + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMULJ(T2, T8); + { + V T7, Tc, Td, Te; + T7 = VSUB(T1, T6); + Tc = VSUB(T9, Tb); + ST(&(x[WS(rs, 1)]), VFNMSI(Tc, T7), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tc, T7), ms, &(x[WS(rs, 1)])); + Td = VADD(T1, T6); + Te = VADD(T9, Tb); + ST(&(x[WS(rs, 2)]), VSUB(Td, Te), ms, &(x[0])); + ST(&(x[0]), VADD(Td, Te), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t3fv_4"), twinstr, &GENUS, {10, 8, 2, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_4) (planner *p) { + X(kdft_dit_register) (p, t3fv_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 4 -name t3fv_4 -include dft/simd/t3f.h */ + +/* + * This function contains 12 FP additions, 8 FP multiplications, + * (or, 12 additions, 8 multiplications, 0 fused multiply/add), + * 16 stack variables, 0 constants, and 8 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_4(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(4, rs)) { + V T2, T3, T4; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + T4 = VZMULJ(T2, T3); + { + V T1, Tb, T6, T9, Ta, T5, T8; + T1 = LD(&(x[0]), ms, &(x[0])); + Ta = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tb = VZMULJ(T3, Ta); + T5 = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMULJ(T2, T8); + { + V T7, Tc, Td, Te; + T7 = VSUB(T1, T6); + Tc = VBYI(VSUB(T9, Tb)); + ST(&(x[WS(rs, 1)]), VSUB(T7, Tc), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(T7, Tc), ms, &(x[WS(rs, 1)])); + Td = VADD(T1, T6); + Te = VADD(T9, Tb); + ST(&(x[WS(rs, 2)]), VSUB(Td, Te), ms, &(x[0])); + ST(&(x[0]), VADD(Td, Te), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 4, XSIMD_STRING("t3fv_4"), twinstr, &GENUS, {12, 8, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_4) (planner *p) { + X(kdft_dit_register) (p, t3fv_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_5.c new file mode 100644 index 000000000..5e30f3827 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_5.c @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:54 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 5 -name t3fv_5 -include dft/simd/t3f.h */ + +/* + * This function contains 22 FP additions, 23 FP multiplications, + * (or, 13 additions, 14 multiplications, 9 fused multiply/add), + * 24 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(5, rs)) { + V T2, T5, T6, Ta; + T2 = LDW(&(W[0])); + T5 = LDW(&(W[TWVL * 2])); + T6 = VZMUL(T2, T5); + Ta = VZMULJ(T2, T5); + { + V T1, Tk, Tl, T9, Tf, Tg; + T1 = LD(&(x[0]), ms, &(x[0])); + { + V T4, Te, T8, Tc; + { + V T3, Td, T7, Tb; + T3 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T4 = VZMULJ(T2, T3); + Td = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Te = VZMULJ(T5, Td); + T7 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T8 = VZMULJ(T6, T7); + Tb = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tc = VZMULJ(Ta, Tb); + } + Tk = VSUB(T4, T8); + Tl = VSUB(Tc, Te); + T9 = VADD(T4, T8); + Tf = VADD(Tc, Te); + Tg = VADD(T9, Tf); + } + ST(&(x[0]), VADD(T1, Tg), ms, &(x[0])); + { + V Tm, To, Tj, Tn, Th, Ti; + Tm = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tl, Tk)); + To = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), Tk, Tl)); + Th = VFNMS(LDK(KP250000000), Tg, T1); + Ti = VSUB(T9, Tf); + Tj = VFMA(LDK(KP559016994), Ti, Th); + Tn = VFNMS(LDK(KP559016994), Ti, Th); + ST(&(x[WS(rs, 1)]), VFNMSI(Tm, Tj), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFNMSI(To, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VFMAI(Tm, Tj), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(To, Tn), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t3fv_5"), twinstr, &GENUS, {13, 14, 9, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_5) (planner *p) { + X(kdft_dit_register) (p, t3fv_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 5 -name t3fv_5 -include dft/simd/t3f.h */ + +/* + * This function contains 22 FP additions, 18 FP multiplications, + * (or, 19 additions, 15 multiplications, 3 fused multiply/add), + * 24 stack variables, 4 constants, and 10 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_5(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 4)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 4), MAKE_VOLATILE_STRIDE(5, rs)) { + V T1, T4, T5, T9; + T1 = LDW(&(W[0])); + T4 = LDW(&(W[TWVL * 2])); + T5 = VZMUL(T1, T4); + T9 = VZMULJ(T1, T4); + { + V Tg, Tk, Tl, T8, Te, Th; + Tg = LD(&(x[0]), ms, &(x[0])); + { + V T3, Td, T7, Tb; + { + V T2, Tc, T6, Ta; + T2 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T3 = VZMULJ(T1, T2); + Tc = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Td = VZMULJ(T4, Tc); + T6 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T7 = VZMULJ(T5, T6); + Ta = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tb = VZMULJ(T9, Ta); + } + Tk = VSUB(T3, T7); + Tl = VSUB(Tb, Td); + T8 = VADD(T3, T7); + Te = VADD(Tb, Td); + Th = VADD(T8, Te); + } + ST(&(x[0]), VADD(Tg, Th), ms, &(x[0])); + { + V Tm, Tn, Tj, To, Tf, Ti; + Tm = VBYI(VFMA(LDK(KP951056516), Tk, VMUL(LDK(KP587785252), Tl))); + Tn = VBYI(VFNMS(LDK(KP587785252), Tk, VMUL(LDK(KP951056516), Tl))); + Tf = VMUL(LDK(KP559016994), VSUB(T8, Te)); + Ti = VFNMS(LDK(KP250000000), Th, Tg); + Tj = VADD(Tf, Ti); + To = VSUB(Ti, Tf); + ST(&(x[WS(rs, 1)]), VSUB(Tj, Tm), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VSUB(To, Tn), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 4)]), VADD(Tm, Tj), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(Tn, To), ms, &(x[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 5, XSIMD_STRING("t3fv_5"), twinstr, &GENUS, {19, 15, 3, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_5) (planner *p) { + X(kdft_dit_register) (p, t3fv_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_8.c new file mode 100644 index 000000000..aab9e9751 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/common/t3fv_8.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:05:51 EDT 2018 */ + +#include "dft/codelet-dft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_twiddle_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 8 -name t3fv_8 -include dft/simd/t3f.h */ + +/* + * This function contains 37 FP additions, 32 FP multiplications, + * (or, 27 additions, 22 multiplications, 10 fused multiply/add), + * 31 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs)) { + V T2, T3, Ta, T4, Tb, Tc, Tp; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + Ta = VZMULJ(T2, T3); + T4 = VZMUL(T2, T3); + Tb = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(Ta, Tb); + Tp = VZMULJ(T2, Tb); + { + V T7, Tx, Ts, Ty, Tf, TA, Tk, TB, T1, T6, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + T7 = VSUB(T1, T6); + Tx = VADD(T1, T6); + { + V To, Tr, Tn, Tq; + Tn = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + To = VZMULJ(Ta, Tn); + Tq = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Tr = VZMULJ(Tp, Tq); + Ts = VSUB(To, Tr); + Ty = VADD(To, Tr); + } + { + V T9, Te, T8, Td; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMULJ(T2, T8); + Td = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Te = VZMULJ(Tc, Td); + Tf = VSUB(T9, Te); + TA = VADD(T9, Te); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Th = VZMULJ(Tb, Tg); + Ti = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tj = VZMULJ(T3, Ti); + Tk = VSUB(Th, Tj); + TB = VADD(Th, Tj); + } + { + V Tz, TC, TD, TE; + Tz = VADD(Tx, Ty); + TC = VADD(TA, TB); + ST(&(x[WS(rs, 4)]), VSUB(Tz, TC), ms, &(x[0])); + ST(&(x[0]), VADD(Tz, TC), ms, &(x[0])); + TD = VSUB(Tx, Ty); + TE = VSUB(TB, TA); + ST(&(x[WS(rs, 6)]), VFNMSI(TE, TD), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VFMAI(TE, TD), ms, &(x[0])); + { + V Tm, Tv, Tu, Tw, Tl, Tt; + Tl = VADD(Tf, Tk); + Tm = VFMA(LDK(KP707106781), Tl, T7); + Tv = VFNMS(LDK(KP707106781), Tl, T7); + Tt = VSUB(Tk, Tf); + Tu = VFNMS(LDK(KP707106781), Tt, Ts); + Tw = VFMA(LDK(KP707106781), Tt, Ts); + ST(&(x[WS(rs, 1)]), VFNMSI(Tu, Tm), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VFMAI(Tw, Tv), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 7)]), VFMAI(Tu, Tm), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VFNMSI(Tw, Tv), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t3fv_8"), twinstr, &GENUS, {27, 22, 10, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_8) (planner *p) { + X(kdft_dit_register) (p, t3fv_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_twiddle_c.native -simd -compact -variables 4 -pipeline-latency 8 -twiddle-log3 -precompute-twiddles -no-generate-bytw -n 8 -name t3fv_8 -include dft/simd/t3f.h */ + +/* + * This function contains 37 FP additions, 24 FP multiplications, + * (or, 37 additions, 24 multiplications, 0 fused multiply/add), + * 31 stack variables, 1 constants, and 16 memory accesses + */ +#include "dft/simd/t3f.h" + +static void t3fv_8(R *ri, R *ii, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + R *x; + x = ri; + for (m = mb, W = W + (mb * ((TWVL / VL) * 6)); m < me; m = m + VL, x = x + (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(8, rs)) { + V T2, T3, Ta, T4, Tb, Tc, Tq; + T2 = LDW(&(W[0])); + T3 = LDW(&(W[TWVL * 2])); + Ta = VZMULJ(T2, T3); + T4 = VZMUL(T2, T3); + Tb = LDW(&(W[TWVL * 4])); + Tc = VZMULJ(Ta, Tb); + Tq = VZMULJ(T2, Tb); + { + V T7, Tx, Tt, Ty, Tf, TA, Tk, TB, T1, T6, T5; + T1 = LD(&(x[0]), ms, &(x[0])); + T5 = LD(&(x[WS(rs, 4)]), ms, &(x[0])); + T6 = VZMULJ(T4, T5); + T7 = VSUB(T1, T6); + Tx = VADD(T1, T6); + { + V Tp, Ts, To, Tr; + To = LD(&(x[WS(rs, 2)]), ms, &(x[0])); + Tp = VZMULJ(Ta, To); + Tr = LD(&(x[WS(rs, 6)]), ms, &(x[0])); + Ts = VZMULJ(Tq, Tr); + Tt = VSUB(Tp, Ts); + Ty = VADD(Tp, Ts); + } + { + V T9, Te, T8, Td; + T8 = LD(&(x[WS(rs, 1)]), ms, &(x[WS(rs, 1)])); + T9 = VZMULJ(T2, T8); + Td = LD(&(x[WS(rs, 5)]), ms, &(x[WS(rs, 1)])); + Te = VZMULJ(Tc, Td); + Tf = VSUB(T9, Te); + TA = VADD(T9, Te); + } + { + V Th, Tj, Tg, Ti; + Tg = LD(&(x[WS(rs, 7)]), ms, &(x[WS(rs, 1)])); + Th = VZMULJ(Tb, Tg); + Ti = LD(&(x[WS(rs, 3)]), ms, &(x[WS(rs, 1)])); + Tj = VZMULJ(T3, Ti); + Tk = VSUB(Th, Tj); + TB = VADD(Th, Tj); + } + { + V Tz, TC, TD, TE; + Tz = VADD(Tx, Ty); + TC = VADD(TA, TB); + ST(&(x[WS(rs, 4)]), VSUB(Tz, TC), ms, &(x[0])); + ST(&(x[0]), VADD(Tz, TC), ms, &(x[0])); + TD = VSUB(Tx, Ty); + TE = VBYI(VSUB(TB, TA)); + ST(&(x[WS(rs, 6)]), VSUB(TD, TE), ms, &(x[0])); + ST(&(x[WS(rs, 2)]), VADD(TD, TE), ms, &(x[0])); + { + V Tm, Tv, Tu, Tw, Tl, Tn; + Tl = VMUL(LDK(KP707106781), VADD(Tf, Tk)); + Tm = VADD(T7, Tl); + Tv = VSUB(T7, Tl); + Tn = VMUL(LDK(KP707106781), VSUB(Tk, Tf)); + Tu = VBYI(VSUB(Tn, Tt)); + Tw = VBYI(VADD(Tt, Tn)); + ST(&(x[WS(rs, 7)]), VSUB(Tm, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 3)]), VADD(Tv, Tw), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 1)]), VADD(Tm, Tu), ms, &(x[WS(rs, 1)])); + ST(&(x[WS(rs, 5)]), VSUB(Tv, Tw), ms, &(x[WS(rs, 1)])); + } + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(0, 1), + VTW(0, 3), + VTW(0, 7), + {TW_NEXT, VL, 0} +}; + +static const ct_desc desc = { 8, XSIMD_STRING("t3fv_8"), twinstr, &GENUS, {37, 24, 0, 0}, 0, 0, 0 }; + +void XSIMD(codelet_t3fv_8) (planner *p) { + X(kdft_dit_register) (p, t3fv_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/Makefile.am new file mode 100644 index 000000000..a973fb941 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/Makefile.am @@ -0,0 +1,12 @@ +SIMD_HEADER=simd-support/simd-generic128.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_GENERIC_SIMD128 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_generic_simd128_codelets.la +libdft_generic_simd128_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/Makefile.in new file mode 100644 index 000000000..53995db1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/Makefile.in @@ -0,0 +1,984 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/generic-simd128 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_generic_simd128_codelets_la_LIBADD = +am__libdft_generic_simd128_codelets_la_SOURCES_DIST = n1fv_2.c \ + n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c \ + n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ + n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c \ + n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ + n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c \ + n1bv_15.c n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c \ + n1bv_25.c n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c \ + n2fv_12.c n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c \ + n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ + n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c \ + n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c \ + t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c \ + t1fuv_10.c t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c \ + t1fv_7.c t1fv_8.c t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c \ + t1fv_16.c t1fv_32.c t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c \ + t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c \ + t2fv_10.c t2fv_20.c t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c \ + t3fv_32.c t3fv_5.c t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c \ + t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c \ + t1buv_9.c t1buv_10.c t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c \ + t1bv_6.c t1bv_7.c t1bv_8.c t1bv_9.c t1bv_10.c t1bv_12.c \ + t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c t1bv_20.c t1bv_25.c \ + t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ + t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c t3bv_4.c t3bv_8.c \ + t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c t3bv_20.c t3bv_25.c \ + t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c t2sv_4.c \ + t2sv_8.c t2sv_16.c t2sv_32.c q1fv_2.c q1fv_4.c q1fv_5.c \ + q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_GENERIC_SIMD128_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_GENERIC_SIMD128_TRUE@am_libdft_generic_simd128_codelets_la_OBJECTS = \ +@HAVE_GENERIC_SIMD128_TRUE@ $(am__objects_20) +libdft_generic_simd128_codelets_la_OBJECTS = \ + $(am_libdft_generic_simd128_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_GENERIC_SIMD128_TRUE@am_libdft_generic_simd128_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_generic_simd128_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_generic_simd128_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SIMD_HEADER = simd-support/simd-generic128.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_GENERIC_SIMD128_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_GENERIC_SIMD128_TRUE@noinst_LTLIBRARIES = libdft_generic_simd128_codelets.la +@HAVE_GENERIC_SIMD128_TRUE@libdft_generic_simd128_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/generic-simd128/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/generic-simd128/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_generic_simd128_codelets.la: $(libdft_generic_simd128_codelets_la_OBJECTS) $(libdft_generic_simd128_codelets_la_DEPENDENCIES) $(EXTRA_libdft_generic_simd128_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_generic_simd128_codelets_la_rpath) $(libdft_generic_simd128_codelets_la_OBJECTS) $(libdft_generic_simd128_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/codlist.c new file mode 100644 index 000000000..d9fbb84d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/genus.c new file mode 100644 index 000000000..3fc26987a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_10.c new file mode 100644 index 000000000..678250309 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_11.c new file mode 100644 index 000000000..12ab9f826 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_12.c new file mode 100644 index 000000000..69fcc37ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_128.c new file mode 100644 index 000000000..04373c577 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_13.c new file mode 100644 index 000000000..e467a5878 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_14.c new file mode 100644 index 000000000..54997369e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_15.c new file mode 100644 index 000000000..2a86ef0c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_16.c new file mode 100644 index 000000000..e71d79587 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_2.c new file mode 100644 index 000000000..ff772fa63 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_20.c new file mode 100644 index 000000000..b5757a148 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_25.c new file mode 100644 index 000000000..3fddd123d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_3.c new file mode 100644 index 000000000..b60261459 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_32.c new file mode 100644 index 000000000..55932bb2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_4.c new file mode 100644 index 000000000..69a045647 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_5.c new file mode 100644 index 000000000..6326cac57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_6.c new file mode 100644 index 000000000..fbbb67705 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_64.c new file mode 100644 index 000000000..eae0d778e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_7.c new file mode 100644 index 000000000..27ece10e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_8.c new file mode 100644 index 000000000..8169ab900 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_9.c new file mode 100644 index 000000000..efcf41b33 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_10.c new file mode 100644 index 000000000..ec076680b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_11.c new file mode 100644 index 000000000..e8f81815e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_12.c new file mode 100644 index 000000000..b39b66f0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_128.c new file mode 100644 index 000000000..ee8d0cf07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_13.c new file mode 100644 index 000000000..44ea4b9b5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_14.c new file mode 100644 index 000000000..eb130fa45 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_15.c new file mode 100644 index 000000000..147f79be7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_16.c new file mode 100644 index 000000000..2d6d0c96d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_2.c new file mode 100644 index 000000000..cb801df10 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_20.c new file mode 100644 index 000000000..d55009b2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_25.c new file mode 100644 index 000000000..cdf49330c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_3.c new file mode 100644 index 000000000..b04e9086b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_32.c new file mode 100644 index 000000000..c80335629 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_4.c new file mode 100644 index 000000000..db123373a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_5.c new file mode 100644 index 000000000..dbe173735 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_6.c new file mode 100644 index 000000000..6efb7a013 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_64.c new file mode 100644 index 000000000..859e33f56 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_7.c new file mode 100644 index 000000000..91e8dfd92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_8.c new file mode 100644 index 000000000..60f534fba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_9.c new file mode 100644 index 000000000..75db2a405 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_10.c new file mode 100644 index 000000000..f915ee60e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_12.c new file mode 100644 index 000000000..345ab282f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_14.c new file mode 100644 index 000000000..11f67bb9f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_16.c new file mode 100644 index 000000000..9205899db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_2.c new file mode 100644 index 000000000..cdec58b9a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_20.c new file mode 100644 index 000000000..cbfd8558e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_32.c new file mode 100644 index 000000000..3735ea63b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_4.c new file mode 100644 index 000000000..1466c3765 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_6.c new file mode 100644 index 000000000..f243b911d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_64.c new file mode 100644 index 000000000..cb577d2d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_8.c new file mode 100644 index 000000000..3ac9cf20b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_10.c new file mode 100644 index 000000000..24f686fc0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_12.c new file mode 100644 index 000000000..434818d18 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_14.c new file mode 100644 index 000000000..13f74fd66 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_16.c new file mode 100644 index 000000000..f1c68fa83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_2.c new file mode 100644 index 000000000..445508c38 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_20.c new file mode 100644 index 000000000..47a955c34 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_32.c new file mode 100644 index 000000000..44b39b4a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_4.c new file mode 100644 index 000000000..817925e80 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_6.c new file mode 100644 index 000000000..09465f8af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_64.c new file mode 100644 index 000000000..0a668a491 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_8.c new file mode 100644 index 000000000..2c3193394 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_16.c new file mode 100644 index 000000000..99fd6046d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_32.c new file mode 100644 index 000000000..3905c8695 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_4.c new file mode 100644 index 000000000..28e51dee8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_64.c new file mode 100644 index 000000000..d74f63c48 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_8.c new file mode 100644 index 000000000..c8685e60e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_2.c new file mode 100644 index 000000000..14094e1ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_4.c new file mode 100644 index 000000000..f56c273a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_5.c new file mode 100644 index 000000000..606bc5a9f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_8.c new file mode 100644 index 000000000..35f65c409 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_2.c new file mode 100644 index 000000000..d7880b222 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_4.c new file mode 100644 index 000000000..1676f4494 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_5.c new file mode 100644 index 000000000..ec31ce0dd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_8.c new file mode 100644 index 000000000..c013b0a68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_10.c new file mode 100644 index 000000000..3a1a5094b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_2.c new file mode 100644 index 000000000..79ee55820 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_3.c new file mode 100644 index 000000000..875e118d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_4.c new file mode 100644 index 000000000..0b05fd7bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_5.c new file mode 100644 index 000000000..236694fd6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_6.c new file mode 100644 index 000000000..57f9cced1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_7.c new file mode 100644 index 000000000..2322a682a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_8.c new file mode 100644 index 000000000..c42b88abf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_9.c new file mode 100644 index 000000000..5023478af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_10.c new file mode 100644 index 000000000..77e2b53e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_12.c new file mode 100644 index 000000000..04fc1b6da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_15.c new file mode 100644 index 000000000..ad7b77b89 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_16.c new file mode 100644 index 000000000..81cdc5096 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_2.c new file mode 100644 index 000000000..99cb38e31 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_20.c new file mode 100644 index 000000000..50e0c95d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_25.c new file mode 100644 index 000000000..8125bf838 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_3.c new file mode 100644 index 000000000..1cd2bc199 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_32.c new file mode 100644 index 000000000..4c8dc1219 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_4.c new file mode 100644 index 000000000..cd27ba9ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_5.c new file mode 100644 index 000000000..df031f892 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_6.c new file mode 100644 index 000000000..9ede9a796 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_64.c new file mode 100644 index 000000000..de277570a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_7.c new file mode 100644 index 000000000..2fea43780 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_8.c new file mode 100644 index 000000000..ed018f1bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_9.c new file mode 100644 index 000000000..185e629e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_10.c new file mode 100644 index 000000000..310bb1bc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_2.c new file mode 100644 index 000000000..067a9fb47 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_3.c new file mode 100644 index 000000000..a95ac198c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_4.c new file mode 100644 index 000000000..7ee3c4bb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_5.c new file mode 100644 index 000000000..51322657a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_6.c new file mode 100644 index 000000000..c486ba7f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_7.c new file mode 100644 index 000000000..4637546f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_8.c new file mode 100644 index 000000000..330a38c34 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_9.c new file mode 100644 index 000000000..d847d9874 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_10.c new file mode 100644 index 000000000..61d72a471 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_12.c new file mode 100644 index 000000000..62457c84b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_15.c new file mode 100644 index 000000000..f19224561 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_16.c new file mode 100644 index 000000000..6fb46d078 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_2.c new file mode 100644 index 000000000..8b8c4945f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_20.c new file mode 100644 index 000000000..07df49aeb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_25.c new file mode 100644 index 000000000..cb68f7e64 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_3.c new file mode 100644 index 000000000..1c033913f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_32.c new file mode 100644 index 000000000..d76507ad9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_4.c new file mode 100644 index 000000000..6346fdaec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_5.c new file mode 100644 index 000000000..2f5bdc3fb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_6.c new file mode 100644 index 000000000..25b5ec6c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_64.c new file mode 100644 index 000000000..34a7ed6cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_7.c new file mode 100644 index 000000000..fbdcd9d0f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_8.c new file mode 100644 index 000000000..6084f9c1f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_9.c new file mode 100644 index 000000000..6829aff5a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_16.c new file mode 100644 index 000000000..ad5a32db6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_2.c new file mode 100644 index 000000000..af61d9698 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_32.c new file mode 100644 index 000000000..15c18fd07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_4.c new file mode 100644 index 000000000..094672d70 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_8.c new file mode 100644 index 000000000..6e9bdf9cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_10.c new file mode 100644 index 000000000..bf16a0941 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_16.c new file mode 100644 index 000000000..c9cd3cee6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_2.c new file mode 100644 index 000000000..d23bb7297 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_20.c new file mode 100644 index 000000000..6843709e5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_25.c new file mode 100644 index 000000000..d134aaf46 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_32.c new file mode 100644 index 000000000..7bae3fb8f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_4.c new file mode 100644 index 000000000..d82170796 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_5.c new file mode 100644 index 000000000..b534e5d01 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_64.c new file mode 100644 index 000000000..0dd36bd4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_8.c new file mode 100644 index 000000000..730344a0c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_10.c new file mode 100644 index 000000000..acf8f66ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_16.c new file mode 100644 index 000000000..a606acd77 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_2.c new file mode 100644 index 000000000..497f7b39d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_20.c new file mode 100644 index 000000000..9a34c08c8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_25.c new file mode 100644 index 000000000..e9fff2f88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_32.c new file mode 100644 index 000000000..76f274105 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_4.c new file mode 100644 index 000000000..df33b8aa9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_5.c new file mode 100644 index 000000000..1654ab504 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_64.c new file mode 100644 index 000000000..c666f4e6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_8.c new file mode 100644 index 000000000..15cbcebfc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_16.c new file mode 100644 index 000000000..650d6e22b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_32.c new file mode 100644 index 000000000..d79ba0da3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_4.c new file mode 100644 index 000000000..64171f9c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_8.c new file mode 100644 index 000000000..fa1f212ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_10.c new file mode 100644 index 000000000..c1a172dc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_16.c new file mode 100644 index 000000000..ca4612290 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_20.c new file mode 100644 index 000000000..db0c6765b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_25.c new file mode 100644 index 000000000..414e7825d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_32.c new file mode 100644 index 000000000..036a1216f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_4.c new file mode 100644 index 000000000..ef76df860 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_5.c new file mode 100644 index 000000000..e473bcd39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_8.c new file mode 100644 index 000000000..aab737417 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_10.c new file mode 100644 index 000000000..e5026a7f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_16.c new file mode 100644 index 000000000..2c55084d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_20.c new file mode 100644 index 000000000..97f2744ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_25.c new file mode 100644 index 000000000..7ce7a4fb9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_32.c new file mode 100644 index 000000000..0a8c024e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_4.c new file mode 100644 index 000000000..dae1b84ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_5.c new file mode 100644 index 000000000..2ad94f4ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_8.c new file mode 100644 index 000000000..2a0169150 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd128/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/Makefile.am new file mode 100644 index 000000000..6c67b197c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/Makefile.am @@ -0,0 +1,12 @@ +SIMD_HEADER=simd-support/simd-generic256.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_GENERIC_SIMD256 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_generic_simd256_codelets.la +libdft_generic_simd256_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/Makefile.in new file mode 100644 index 000000000..685fbacee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/Makefile.in @@ -0,0 +1,984 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/generic-simd256 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_generic_simd256_codelets_la_LIBADD = +am__libdft_generic_simd256_codelets_la_SOURCES_DIST = n1fv_2.c \ + n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c \ + n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ + n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c \ + n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ + n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c \ + n1bv_15.c n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c \ + n1bv_25.c n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c \ + n2fv_12.c n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c \ + n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ + n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c \ + n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c \ + t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c \ + t1fuv_10.c t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c \ + t1fv_7.c t1fv_8.c t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c \ + t1fv_16.c t1fv_32.c t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c \ + t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c \ + t2fv_10.c t2fv_20.c t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c \ + t3fv_32.c t3fv_5.c t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c \ + t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c \ + t1buv_9.c t1buv_10.c t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c \ + t1bv_6.c t1bv_7.c t1bv_8.c t1bv_9.c t1bv_10.c t1bv_12.c \ + t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c t1bv_20.c t1bv_25.c \ + t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ + t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c t3bv_4.c t3bv_8.c \ + t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c t3bv_20.c t3bv_25.c \ + t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c t2sv_4.c \ + t2sv_8.c t2sv_16.c t2sv_32.c q1fv_2.c q1fv_4.c q1fv_5.c \ + q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_GENERIC_SIMD256_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_GENERIC_SIMD256_TRUE@am_libdft_generic_simd256_codelets_la_OBJECTS = \ +@HAVE_GENERIC_SIMD256_TRUE@ $(am__objects_20) +libdft_generic_simd256_codelets_la_OBJECTS = \ + $(am_libdft_generic_simd256_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_GENERIC_SIMD256_TRUE@am_libdft_generic_simd256_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_generic_simd256_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_generic_simd256_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SIMD_HEADER = simd-support/simd-generic256.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_GENERIC_SIMD256_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_GENERIC_SIMD256_TRUE@noinst_LTLIBRARIES = libdft_generic_simd256_codelets.la +@HAVE_GENERIC_SIMD256_TRUE@libdft_generic_simd256_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/generic-simd256/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/generic-simd256/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_generic_simd256_codelets.la: $(libdft_generic_simd256_codelets_la_OBJECTS) $(libdft_generic_simd256_codelets_la_DEPENDENCIES) $(EXTRA_libdft_generic_simd256_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_generic_simd256_codelets_la_rpath) $(libdft_generic_simd256_codelets_la_OBJECTS) $(libdft_generic_simd256_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/codlist.c new file mode 100644 index 000000000..d37edc3f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/genus.c new file mode 100644 index 000000000..20bcdd4ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_10.c new file mode 100644 index 000000000..25180ddbb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_11.c new file mode 100644 index 000000000..837f83ed8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_12.c new file mode 100644 index 000000000..8e0d5d49d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_128.c new file mode 100644 index 000000000..c0c428aa0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_13.c new file mode 100644 index 000000000..b07279a2e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_14.c new file mode 100644 index 000000000..5b291e047 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_15.c new file mode 100644 index 000000000..f655dc88b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_16.c new file mode 100644 index 000000000..7735f5983 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_2.c new file mode 100644 index 000000000..170589f9a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_20.c new file mode 100644 index 000000000..1bf416cf3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_25.c new file mode 100644 index 000000000..d3c7cb69e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_3.c new file mode 100644 index 000000000..ba9a55337 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_32.c new file mode 100644 index 000000000..15089f6e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_4.c new file mode 100644 index 000000000..6c6d47d58 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_5.c new file mode 100644 index 000000000..19cd4285e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_6.c new file mode 100644 index 000000000..074f3fe1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_64.c new file mode 100644 index 000000000..87c4cd23d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_7.c new file mode 100644 index 000000000..fbb6a300e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_8.c new file mode 100644 index 000000000..8d47de8c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_9.c new file mode 100644 index 000000000..06bc0ab98 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_10.c new file mode 100644 index 000000000..7b717e0a9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_11.c new file mode 100644 index 000000000..afd79597b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_12.c new file mode 100644 index 000000000..96c9b25b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_128.c new file mode 100644 index 000000000..da49c21bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_13.c new file mode 100644 index 000000000..b75469992 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_14.c new file mode 100644 index 000000000..aca2be745 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_15.c new file mode 100644 index 000000000..5c9234ef0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_16.c new file mode 100644 index 000000000..13aa9964f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_2.c new file mode 100644 index 000000000..e700db65b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_20.c new file mode 100644 index 000000000..14930d08d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_25.c new file mode 100644 index 000000000..97bef39f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_3.c new file mode 100644 index 000000000..bc665955e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_32.c new file mode 100644 index 000000000..ab93e3055 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_4.c new file mode 100644 index 000000000..ee3c7b25b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_5.c new file mode 100644 index 000000000..7ab4fa556 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_6.c new file mode 100644 index 000000000..76cbbb4d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_64.c new file mode 100644 index 000000000..ae4013f16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_7.c new file mode 100644 index 000000000..ead00a6d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_8.c new file mode 100644 index 000000000..ce7967ac3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_9.c new file mode 100644 index 000000000..fbf9ec8c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_10.c new file mode 100644 index 000000000..330201e8c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_12.c new file mode 100644 index 000000000..dcdd75ef6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_14.c new file mode 100644 index 000000000..97d028133 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_16.c new file mode 100644 index 000000000..a5e30931a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_2.c new file mode 100644 index 000000000..b3a5bfe34 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_20.c new file mode 100644 index 000000000..40f6a3c1c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_32.c new file mode 100644 index 000000000..2c5497c7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_4.c new file mode 100644 index 000000000..393d69605 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_6.c new file mode 100644 index 000000000..3468a4f50 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_64.c new file mode 100644 index 000000000..fec16e25d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_8.c new file mode 100644 index 000000000..63b0bf41d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_10.c new file mode 100644 index 000000000..66dc479be --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_12.c new file mode 100644 index 000000000..48d4084a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_14.c new file mode 100644 index 000000000..f12ea1ae1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_16.c new file mode 100644 index 000000000..14311091d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_2.c new file mode 100644 index 000000000..01b1c3c14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_20.c new file mode 100644 index 000000000..489e5b9a9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_32.c new file mode 100644 index 000000000..a261498bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_4.c new file mode 100644 index 000000000..df6e7317d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_6.c new file mode 100644 index 000000000..f4650bdb1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_64.c new file mode 100644 index 000000000..c16c2ad0b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_8.c new file mode 100644 index 000000000..c2a4422da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_16.c new file mode 100644 index 000000000..18477d153 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_32.c new file mode 100644 index 000000000..ecdf81b70 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_4.c new file mode 100644 index 000000000..716c2f0c8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_64.c new file mode 100644 index 000000000..418e6b07a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_8.c new file mode 100644 index 000000000..5270149c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_2.c new file mode 100644 index 000000000..7f121d436 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_4.c new file mode 100644 index 000000000..a5e0123d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_5.c new file mode 100644 index 000000000..f60d339d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_8.c new file mode 100644 index 000000000..032d90e3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_2.c new file mode 100644 index 000000000..ff1f4e2ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_4.c new file mode 100644 index 000000000..2c70e05b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_5.c new file mode 100644 index 000000000..28a5d4575 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_8.c new file mode 100644 index 000000000..fca6b966e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_10.c new file mode 100644 index 000000000..6cb7c25ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_2.c new file mode 100644 index 000000000..3b3e557b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_3.c new file mode 100644 index 000000000..6546a7393 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_4.c new file mode 100644 index 000000000..26dea1dca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_5.c new file mode 100644 index 000000000..9af0ee795 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_6.c new file mode 100644 index 000000000..387511478 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_7.c new file mode 100644 index 000000000..a9ca91c6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_8.c new file mode 100644 index 000000000..af7878e81 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_9.c new file mode 100644 index 000000000..446a6e31a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_10.c new file mode 100644 index 000000000..466ccac1c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_12.c new file mode 100644 index 000000000..f525c468e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_15.c new file mode 100644 index 000000000..04564d97e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_16.c new file mode 100644 index 000000000..d36fbd173 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_2.c new file mode 100644 index 000000000..2fedddd40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_20.c new file mode 100644 index 000000000..8c084f452 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_25.c new file mode 100644 index 000000000..53528f0fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_3.c new file mode 100644 index 000000000..e247ff919 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_32.c new file mode 100644 index 000000000..ceabe0b8c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_4.c new file mode 100644 index 000000000..680db4b24 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_5.c new file mode 100644 index 000000000..aa08bb2dd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_6.c new file mode 100644 index 000000000..c0ae2554c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_64.c new file mode 100644 index 000000000..b5c55f012 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_7.c new file mode 100644 index 000000000..114f68ddf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_8.c new file mode 100644 index 000000000..31c6d244c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_9.c new file mode 100644 index 000000000..384c72b9c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_10.c new file mode 100644 index 000000000..7bcfd21c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_2.c new file mode 100644 index 000000000..5225532c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_3.c new file mode 100644 index 000000000..58ef7dc31 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_4.c new file mode 100644 index 000000000..9f1ede797 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_5.c new file mode 100644 index 000000000..f8a3417eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_6.c new file mode 100644 index 000000000..eb3f4ea0c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_7.c new file mode 100644 index 000000000..b59b636bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_8.c new file mode 100644 index 000000000..4b8fec24a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_9.c new file mode 100644 index 000000000..c0c9c69ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_10.c new file mode 100644 index 000000000..40bf976c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_12.c new file mode 100644 index 000000000..0e8cd84c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_15.c new file mode 100644 index 000000000..2cb2695e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_16.c new file mode 100644 index 000000000..ef3b6b14f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_2.c new file mode 100644 index 000000000..66464e01e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_20.c new file mode 100644 index 000000000..e9d4b5405 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_25.c new file mode 100644 index 000000000..4f1ef4ad4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_3.c new file mode 100644 index 000000000..770a4c33e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_32.c new file mode 100644 index 000000000..e9d850e62 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_4.c new file mode 100644 index 000000000..b17369779 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_5.c new file mode 100644 index 000000000..53b0eb053 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_6.c new file mode 100644 index 000000000..288e02766 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_64.c new file mode 100644 index 000000000..3095e78aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_7.c new file mode 100644 index 000000000..af46a338a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_8.c new file mode 100644 index 000000000..9ad2ba604 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_9.c new file mode 100644 index 000000000..5d7025d12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_16.c new file mode 100644 index 000000000..42febe503 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_2.c new file mode 100644 index 000000000..e9612d06b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_32.c new file mode 100644 index 000000000..32861f2db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_4.c new file mode 100644 index 000000000..2aa8eecbb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_8.c new file mode 100644 index 000000000..ee0aa7ded --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_10.c new file mode 100644 index 000000000..99992106c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_16.c new file mode 100644 index 000000000..c82c547ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_2.c new file mode 100644 index 000000000..12fce0fce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_20.c new file mode 100644 index 000000000..f40ad45ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_25.c new file mode 100644 index 000000000..7241b0162 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_32.c new file mode 100644 index 000000000..3f1cb14f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_4.c new file mode 100644 index 000000000..9f62c4f08 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_5.c new file mode 100644 index 000000000..a8c50cc46 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_64.c new file mode 100644 index 000000000..536f69e45 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_8.c new file mode 100644 index 000000000..24ec6f5a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_10.c new file mode 100644 index 000000000..34670ccd9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_16.c new file mode 100644 index 000000000..57157f6d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_2.c new file mode 100644 index 000000000..471f35de3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_20.c new file mode 100644 index 000000000..fe42f568c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_25.c new file mode 100644 index 000000000..f4f60f17f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_32.c new file mode 100644 index 000000000..67108ef04 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_4.c new file mode 100644 index 000000000..221788d23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_5.c new file mode 100644 index 000000000..ca419c53b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_64.c new file mode 100644 index 000000000..4d35b84ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_8.c new file mode 100644 index 000000000..4f1e5a16e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_16.c new file mode 100644 index 000000000..e88fa1c1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_32.c new file mode 100644 index 000000000..3a9a17af3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_4.c new file mode 100644 index 000000000..3c2d8979c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_8.c new file mode 100644 index 000000000..d67f77fd7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_10.c new file mode 100644 index 000000000..7738b4482 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_16.c new file mode 100644 index 000000000..f05598d71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_20.c new file mode 100644 index 000000000..592d8b0f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_25.c new file mode 100644 index 000000000..ab069cdf9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_32.c new file mode 100644 index 000000000..a9a96b264 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_4.c new file mode 100644 index 000000000..beb90d3eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_5.c new file mode 100644 index 000000000..25d4c1aa9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_8.c new file mode 100644 index 000000000..b143d01bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_10.c new file mode 100644 index 000000000..02b68a182 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_16.c new file mode 100644 index 000000000..6fba87085 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_20.c new file mode 100644 index 000000000..177923b59 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_25.c new file mode 100644 index 000000000..d90840f1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_32.c new file mode 100644 index 000000000..a0f3ebea5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_4.c new file mode 100644 index 000000000..5651a11cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_5.c new file mode 100644 index 000000000..187374691 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_8.c new file mode 100644 index 000000000..eb08fab6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/generic-simd256/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/Makefile.am new file mode 100644 index 000000000..2576a3902 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(KCVI_CFLAGS) +SIMD_HEADER=simd-support/simd-kcvi.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_KCVI + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_kcvi_codelets.la +libdft_kcvi_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/Makefile.in new file mode 100644 index 000000000..a3bb9197c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/kcvi +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_kcvi_codelets_la_LIBADD = +am__libdft_kcvi_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c n1fv_4.c \ + n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c n1fv_10.c \ + n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c n1fv_16.c \ + n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c n1bv_2.c \ + n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c n1bv_9.c \ + n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ + n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c \ + n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ + n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c n2bv_2.c \ + n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c n2bv_14.c \ + n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c n2sv_8.c \ + n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c t1fuv_4.c \ + t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c t1fuv_10.c \ + t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ + t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c \ + t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c t2fv_4.c t2fv_8.c \ + t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c t2fv_10.c t2fv_20.c \ + t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c \ + t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c t1buv_3.c t1buv_4.c \ + t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c t1buv_9.c t1buv_10.c \ + t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ + t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c \ + t1bv_64.c t1bv_20.c t1bv_25.c t2bv_2.c t2bv_4.c t2bv_8.c \ + t2bv_16.c t2bv_32.c t2bv_64.c t2bv_5.c t2bv_10.c t2bv_20.c \ + t2bv_25.c t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c \ + t3bv_10.c t3bv_20.c t3bv_25.c t1sv_2.c t1sv_4.c t1sv_8.c \ + t1sv_16.c t1sv_32.c t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c \ + q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c \ + q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_KCVI_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_KCVI_TRUE@am_libdft_kcvi_codelets_la_OBJECTS = \ +@HAVE_KCVI_TRUE@ $(am__objects_20) +libdft_kcvi_codelets_la_OBJECTS = \ + $(am_libdft_kcvi_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_KCVI_TRUE@am_libdft_kcvi_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_kcvi_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_kcvi_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(KCVI_CFLAGS) +SIMD_HEADER = simd-support/simd-kcvi.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_KCVI_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_KCVI_TRUE@noinst_LTLIBRARIES = libdft_kcvi_codelets.la +@HAVE_KCVI_TRUE@libdft_kcvi_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/kcvi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/kcvi/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_kcvi_codelets.la: $(libdft_kcvi_codelets_la_OBJECTS) $(libdft_kcvi_codelets_la_DEPENDENCIES) $(EXTRA_libdft_kcvi_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_kcvi_codelets_la_rpath) $(libdft_kcvi_codelets_la_OBJECTS) $(libdft_kcvi_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/codlist.c new file mode 100644 index 000000000..bbf3f729e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/genus.c new file mode 100644 index 000000000..80d7ef247 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_10.c new file mode 100644 index 000000000..6e263dda7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_11.c new file mode 100644 index 000000000..0bc18298c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_12.c new file mode 100644 index 000000000..8bd1b9621 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_128.c new file mode 100644 index 000000000..50612acc4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_13.c new file mode 100644 index 000000000..f4814677a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_14.c new file mode 100644 index 000000000..1a7fbf2e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_15.c new file mode 100644 index 000000000..02cd8bf8b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_16.c new file mode 100644 index 000000000..2843b4b78 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_2.c new file mode 100644 index 000000000..5feefe8c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_20.c new file mode 100644 index 000000000..120914c1e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_25.c new file mode 100644 index 000000000..068007245 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_3.c new file mode 100644 index 000000000..aca5a09fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_32.c new file mode 100644 index 000000000..a0ebc973c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_4.c new file mode 100644 index 000000000..020099e2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_5.c new file mode 100644 index 000000000..bc1c3ec07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_6.c new file mode 100644 index 000000000..a7c40d54b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_64.c new file mode 100644 index 000000000..af82f1f06 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_7.c new file mode 100644 index 000000000..1ca3b5d95 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_8.c new file mode 100644 index 000000000..c2e03606f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_9.c new file mode 100644 index 000000000..4b058658e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_10.c new file mode 100644 index 000000000..ec1c13b05 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_11.c new file mode 100644 index 000000000..79f5e79e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_12.c new file mode 100644 index 000000000..c5c15021c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_128.c new file mode 100644 index 000000000..ff4cbb501 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_13.c new file mode 100644 index 000000000..bbb8f3a1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_14.c new file mode 100644 index 000000000..4d0f5f03f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_15.c new file mode 100644 index 000000000..0a897079a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_16.c new file mode 100644 index 000000000..488e61122 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_2.c new file mode 100644 index 000000000..036900e0f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_20.c new file mode 100644 index 000000000..628aeeabf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_25.c new file mode 100644 index 000000000..1c0f4da11 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_3.c new file mode 100644 index 000000000..c85330d03 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_32.c new file mode 100644 index 000000000..9870964d5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_4.c new file mode 100644 index 000000000..5c5b4c3d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_5.c new file mode 100644 index 000000000..627a15cd2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_6.c new file mode 100644 index 000000000..01836f1d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_64.c new file mode 100644 index 000000000..40f2e3bff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_7.c new file mode 100644 index 000000000..add271c37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_8.c new file mode 100644 index 000000000..77c413b81 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_9.c new file mode 100644 index 000000000..163f42b72 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_10.c new file mode 100644 index 000000000..6f73cab3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_12.c new file mode 100644 index 000000000..bd5c5b369 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_14.c new file mode 100644 index 000000000..7b6743836 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_16.c new file mode 100644 index 000000000..da42c1277 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_2.c new file mode 100644 index 000000000..b48c6b46f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_20.c new file mode 100644 index 000000000..e271af08a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_32.c new file mode 100644 index 000000000..f7924508c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_4.c new file mode 100644 index 000000000..87a68fa12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_6.c new file mode 100644 index 000000000..7a3a6367e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_64.c new file mode 100644 index 000000000..ab1b256bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_8.c new file mode 100644 index 000000000..54abb4fdd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_10.c new file mode 100644 index 000000000..a03983512 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_12.c new file mode 100644 index 000000000..4c8e61eb3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_14.c new file mode 100644 index 000000000..8f108dc18 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_16.c new file mode 100644 index 000000000..03a1882c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_2.c new file mode 100644 index 000000000..dcdbdc52c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_20.c new file mode 100644 index 000000000..18cdfb63d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_32.c new file mode 100644 index 000000000..895297230 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_4.c new file mode 100644 index 000000000..f3519e392 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_6.c new file mode 100644 index 000000000..2b67746ba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_64.c new file mode 100644 index 000000000..0d775a48c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_8.c new file mode 100644 index 000000000..74f637410 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_16.c new file mode 100644 index 000000000..83cf4d43e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_32.c new file mode 100644 index 000000000..f0ee51d96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_4.c new file mode 100644 index 000000000..d1e894e0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_64.c new file mode 100644 index 000000000..14fdf84cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_8.c new file mode 100644 index 000000000..60935818e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_2.c new file mode 100644 index 000000000..298e1c6bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_4.c new file mode 100644 index 000000000..eaf3d75b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_5.c new file mode 100644 index 000000000..0100b2f4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_8.c new file mode 100644 index 000000000..c3801b191 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_2.c new file mode 100644 index 000000000..2735c9f1e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_4.c new file mode 100644 index 000000000..076f5dc8a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_5.c new file mode 100644 index 000000000..7fbc7cbf9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_8.c new file mode 100644 index 000000000..1c1b424c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_10.c new file mode 100644 index 000000000..91c4651eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_2.c new file mode 100644 index 000000000..994fd32f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_3.c new file mode 100644 index 000000000..dba52a7bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_4.c new file mode 100644 index 000000000..17b4e7fc8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_5.c new file mode 100644 index 000000000..fe3a6c60d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_6.c new file mode 100644 index 000000000..cfa01e904 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_7.c new file mode 100644 index 000000000..c5620c631 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_8.c new file mode 100644 index 000000000..5bb8973a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_9.c new file mode 100644 index 000000000..786440ac6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_10.c new file mode 100644 index 000000000..16fdef9ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_12.c new file mode 100644 index 000000000..57c832d31 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_15.c new file mode 100644 index 000000000..66708b354 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_16.c new file mode 100644 index 000000000..10abcdfeb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_2.c new file mode 100644 index 000000000..fb96d5aed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_20.c new file mode 100644 index 000000000..7756183b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_25.c new file mode 100644 index 000000000..268c05dba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_3.c new file mode 100644 index 000000000..770c0d199 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_32.c new file mode 100644 index 000000000..3acbb4d0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_4.c new file mode 100644 index 000000000..e8f70009b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_5.c new file mode 100644 index 000000000..a499bac83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_6.c new file mode 100644 index 000000000..b6986407b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_64.c new file mode 100644 index 000000000..25529068f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_7.c new file mode 100644 index 000000000..461d5cd08 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_8.c new file mode 100644 index 000000000..c30bdef49 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_9.c new file mode 100644 index 000000000..3e896e805 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_10.c new file mode 100644 index 000000000..4094ac4ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_2.c new file mode 100644 index 000000000..58eb2aecb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_3.c new file mode 100644 index 000000000..72d32a773 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_4.c new file mode 100644 index 000000000..ad614414f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_5.c new file mode 100644 index 000000000..6f87e7c16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_6.c new file mode 100644 index 000000000..2b66b1ec0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_7.c new file mode 100644 index 000000000..8fc6778f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_8.c new file mode 100644 index 000000000..b8ff5e045 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_9.c new file mode 100644 index 000000000..023803f41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_10.c new file mode 100644 index 000000000..1942c5e5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_12.c new file mode 100644 index 000000000..5fa87dbf6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_15.c new file mode 100644 index 000000000..581174b94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_16.c new file mode 100644 index 000000000..1ca76438d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_2.c new file mode 100644 index 000000000..4160a3961 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_20.c new file mode 100644 index 000000000..d1d9209f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_25.c new file mode 100644 index 000000000..ea4b6cf22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_3.c new file mode 100644 index 000000000..a266f1855 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_32.c new file mode 100644 index 000000000..264ffbb14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_4.c new file mode 100644 index 000000000..ef85b20ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_5.c new file mode 100644 index 000000000..128803a58 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_6.c new file mode 100644 index 000000000..1075a7f62 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_64.c new file mode 100644 index 000000000..73b4167a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_7.c new file mode 100644 index 000000000..0002f34f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_8.c new file mode 100644 index 000000000..d3836673d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_9.c new file mode 100644 index 000000000..fc5db129a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_16.c new file mode 100644 index 000000000..ae98d9f1e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_2.c new file mode 100644 index 000000000..a17098463 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_32.c new file mode 100644 index 000000000..068613188 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_4.c new file mode 100644 index 000000000..9204f5b57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_8.c new file mode 100644 index 000000000..eb9edbbe9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_10.c new file mode 100644 index 000000000..0e3c0adc8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_16.c new file mode 100644 index 000000000..7a16ab1cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_2.c new file mode 100644 index 000000000..e775e4aeb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_20.c new file mode 100644 index 000000000..fd6f8eb83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_25.c new file mode 100644 index 000000000..daaf13587 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_32.c new file mode 100644 index 000000000..849b1feb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_4.c new file mode 100644 index 000000000..f03ffca96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_5.c new file mode 100644 index 000000000..7a4a87190 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_64.c new file mode 100644 index 000000000..4f9af13af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_8.c new file mode 100644 index 000000000..348e4487c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_10.c new file mode 100644 index 000000000..32023f324 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_16.c new file mode 100644 index 000000000..8a5208414 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_2.c new file mode 100644 index 000000000..69c9ddf09 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_20.c new file mode 100644 index 000000000..782c1f7a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_25.c new file mode 100644 index 000000000..012a4231c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_32.c new file mode 100644 index 000000000..db8b8c425 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_4.c new file mode 100644 index 000000000..55804afec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_5.c new file mode 100644 index 000000000..56d62ef30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_64.c new file mode 100644 index 000000000..769fd80fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_8.c new file mode 100644 index 000000000..d41100798 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_16.c new file mode 100644 index 000000000..af162df85 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_32.c new file mode 100644 index 000000000..7eb46150c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_4.c new file mode 100644 index 000000000..93dd57a8f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_8.c new file mode 100644 index 000000000..c9707ca7a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_10.c new file mode 100644 index 000000000..80f92c692 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_16.c new file mode 100644 index 000000000..75545bad8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_20.c new file mode 100644 index 000000000..180222528 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_25.c new file mode 100644 index 000000000..680539b94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_32.c new file mode 100644 index 000000000..a5a95a8c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_4.c new file mode 100644 index 000000000..b75da4a09 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_5.c new file mode 100644 index 000000000..ec0b1a25e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_8.c new file mode 100644 index 000000000..3e226fd16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_10.c new file mode 100644 index 000000000..ebdebdb15 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_16.c new file mode 100644 index 000000000..98d9f0a44 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_20.c new file mode 100644 index 000000000..1ae2e0d0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_25.c new file mode 100644 index 000000000..caf2b807c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_32.c new file mode 100644 index 000000000..6a156d95d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_4.c new file mode 100644 index 000000000..9d3f1dba3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_5.c new file mode 100644 index 000000000..d1d6b7283 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_8.c new file mode 100644 index 000000000..f5e19ca40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/kcvi/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n1b.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n1b.h new file mode 100644 index 000000000..a41c5e53d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n1b.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define GENUS XSIMD(dft_n1bsimd_genus) +extern const kdft_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n1f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n1f.h new file mode 100644 index 000000000..8a0551109 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n1f.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define GENUS XSIMD(dft_n1fsimd_genus) +extern const kdft_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2b.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2b.h new file mode 100644 index 000000000..8aa4755d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2b.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA + +#define GENUS XSIMD(dft_n2bsimd_genus) +extern const kdft_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2f.h new file mode 100644 index 000000000..32b79e33f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2f.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA + +#define GENUS XSIMD(dft_n2fsimd_genus) +extern const kdft_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2s.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2s.h new file mode 100644 index 000000000..6de02ea45 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/n2s.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA + +#define GENUS XSIMD(dft_n2ssimd_genus) +extern const kdft_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/Makefile.am new file mode 100644 index 000000000..d2be01b49 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(NEON_CFLAGS) +SIMD_HEADER=simd-support/simd-neon.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_NEON + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_neon_codelets.la +libdft_neon_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/Makefile.in new file mode 100644 index 000000000..b0a9b537e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/neon +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_neon_codelets_la_LIBADD = +am__libdft_neon_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c n1fv_4.c \ + n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c n1fv_10.c \ + n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c n1fv_16.c \ + n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c n1bv_2.c \ + n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c n1bv_9.c \ + n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ + n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c \ + n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ + n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c n2bv_2.c \ + n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c n2bv_14.c \ + n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c n2sv_8.c \ + n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c t1fuv_4.c \ + t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c t1fuv_10.c \ + t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ + t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c \ + t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c t2fv_4.c t2fv_8.c \ + t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c t2fv_10.c t2fv_20.c \ + t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c \ + t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c t1buv_3.c t1buv_4.c \ + t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c t1buv_9.c t1buv_10.c \ + t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ + t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c \ + t1bv_64.c t1bv_20.c t1bv_25.c t2bv_2.c t2bv_4.c t2bv_8.c \ + t2bv_16.c t2bv_32.c t2bv_64.c t2bv_5.c t2bv_10.c t2bv_20.c \ + t2bv_25.c t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c \ + t3bv_10.c t3bv_20.c t3bv_25.c t1sv_2.c t1sv_4.c t1sv_8.c \ + t1sv_16.c t1sv_32.c t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c \ + q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c \ + q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_NEON_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_NEON_TRUE@am_libdft_neon_codelets_la_OBJECTS = \ +@HAVE_NEON_TRUE@ $(am__objects_20) +libdft_neon_codelets_la_OBJECTS = \ + $(am_libdft_neon_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_NEON_TRUE@am_libdft_neon_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_neon_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_neon_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(NEON_CFLAGS) +SIMD_HEADER = simd-support/simd-neon.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_NEON_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_NEON_TRUE@noinst_LTLIBRARIES = libdft_neon_codelets.la +@HAVE_NEON_TRUE@libdft_neon_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/neon/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/neon/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_neon_codelets.la: $(libdft_neon_codelets_la_OBJECTS) $(libdft_neon_codelets_la_DEPENDENCIES) $(EXTRA_libdft_neon_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_neon_codelets_la_rpath) $(libdft_neon_codelets_la_OBJECTS) $(libdft_neon_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/codlist.c new file mode 100644 index 000000000..9c85b6da2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/genus.c new file mode 100644 index 000000000..0017200ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_10.c new file mode 100644 index 000000000..55652683c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_11.c new file mode 100644 index 000000000..025231347 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_12.c new file mode 100644 index 000000000..37f4dbbf9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_128.c new file mode 100644 index 000000000..e501e513c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_13.c new file mode 100644 index 000000000..ac523bd0b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_14.c new file mode 100644 index 000000000..be365029a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_15.c new file mode 100644 index 000000000..986776832 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_16.c new file mode 100644 index 000000000..08e08b2c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_2.c new file mode 100644 index 000000000..5f3df2e48 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_20.c new file mode 100644 index 000000000..088600d76 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_25.c new file mode 100644 index 000000000..0cc468621 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_3.c new file mode 100644 index 000000000..6d4e677b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_32.c new file mode 100644 index 000000000..09518a18c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_4.c new file mode 100644 index 000000000..a1c59a631 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_5.c new file mode 100644 index 000000000..2c710ea47 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_6.c new file mode 100644 index 000000000..104dbdeec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_64.c new file mode 100644 index 000000000..7e01eb16d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_7.c new file mode 100644 index 000000000..5491ede68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_8.c new file mode 100644 index 000000000..05561d2e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_9.c new file mode 100644 index 000000000..a0b942c54 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_10.c new file mode 100644 index 000000000..18ddb20a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_11.c new file mode 100644 index 000000000..2309a4042 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_12.c new file mode 100644 index 000000000..1194f749c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_128.c new file mode 100644 index 000000000..060b5809e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_13.c new file mode 100644 index 000000000..fc0248ef5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_14.c new file mode 100644 index 000000000..a50200add --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_15.c new file mode 100644 index 000000000..f84c17dca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_16.c new file mode 100644 index 000000000..16f54803d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_2.c new file mode 100644 index 000000000..db652aeed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_20.c new file mode 100644 index 000000000..9bee41967 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_25.c new file mode 100644 index 000000000..23eb555de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_3.c new file mode 100644 index 000000000..e90217fdc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_32.c new file mode 100644 index 000000000..2a437bfbb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_4.c new file mode 100644 index 000000000..c9b49f547 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_5.c new file mode 100644 index 000000000..e0a976d4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_6.c new file mode 100644 index 000000000..d3c1f1351 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_64.c new file mode 100644 index 000000000..d5fefd2ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_7.c new file mode 100644 index 000000000..15c9fa7e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_8.c new file mode 100644 index 000000000..87d3874d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_9.c new file mode 100644 index 000000000..50f095900 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_10.c new file mode 100644 index 000000000..7180ce0eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_12.c new file mode 100644 index 000000000..61c88ff69 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_14.c new file mode 100644 index 000000000..816c89d72 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_16.c new file mode 100644 index 000000000..c0786f5aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_2.c new file mode 100644 index 000000000..f24761500 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_20.c new file mode 100644 index 000000000..cbb98e4d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_32.c new file mode 100644 index 000000000..9f6190902 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_4.c new file mode 100644 index 000000000..77ca6f158 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_6.c new file mode 100644 index 000000000..746b0fd85 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_64.c new file mode 100644 index 000000000..b302ae38e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_8.c new file mode 100644 index 000000000..92ff56339 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_10.c new file mode 100644 index 000000000..0a16f3d10 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_12.c new file mode 100644 index 000000000..887e32d37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_14.c new file mode 100644 index 000000000..32a75b973 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_16.c new file mode 100644 index 000000000..ff507012f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_2.c new file mode 100644 index 000000000..69560deab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_20.c new file mode 100644 index 000000000..bcd848ea2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_32.c new file mode 100644 index 000000000..1dcdf6cd8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_4.c new file mode 100644 index 000000000..df3b84ee1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_6.c new file mode 100644 index 000000000..18ffa143e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_64.c new file mode 100644 index 000000000..d295b8ec2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_8.c new file mode 100644 index 000000000..5d57044b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_16.c new file mode 100644 index 000000000..1b98dd676 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_32.c new file mode 100644 index 000000000..fba9c24f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_4.c new file mode 100644 index 000000000..c035e23f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_64.c new file mode 100644 index 000000000..06cf5f5d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_8.c new file mode 100644 index 000000000..8f0989129 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_2.c new file mode 100644 index 000000000..ab82eaaee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_4.c new file mode 100644 index 000000000..3f2a63505 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_5.c new file mode 100644 index 000000000..755362882 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_8.c new file mode 100644 index 000000000..6111678c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_2.c new file mode 100644 index 000000000..b6b954bd6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_4.c new file mode 100644 index 000000000..64e34eaab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_5.c new file mode 100644 index 000000000..4a29fc251 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_8.c new file mode 100644 index 000000000..70158d606 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_10.c new file mode 100644 index 000000000..8aef5bc00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_2.c new file mode 100644 index 000000000..903d46537 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_3.c new file mode 100644 index 000000000..33b502fb2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_4.c new file mode 100644 index 000000000..25c5168fc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_5.c new file mode 100644 index 000000000..87b880682 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_6.c new file mode 100644 index 000000000..115bd3d39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_7.c new file mode 100644 index 000000000..0c913531f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_8.c new file mode 100644 index 000000000..b161ef43b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_9.c new file mode 100644 index 000000000..d43f17f6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_10.c new file mode 100644 index 000000000..530b6db34 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_12.c new file mode 100644 index 000000000..44f362c06 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_15.c new file mode 100644 index 000000000..e3582f517 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_16.c new file mode 100644 index 000000000..b38202fdf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_2.c new file mode 100644 index 000000000..31e8b4a80 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_20.c new file mode 100644 index 000000000..8ef6324d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_25.c new file mode 100644 index 000000000..a0b97cf14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_3.c new file mode 100644 index 000000000..6b7d97a32 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_32.c new file mode 100644 index 000000000..9bc367f66 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_4.c new file mode 100644 index 000000000..266f920f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_5.c new file mode 100644 index 000000000..b2649d6ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_6.c new file mode 100644 index 000000000..d5612e9ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_64.c new file mode 100644 index 000000000..8c88a67cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_7.c new file mode 100644 index 000000000..54789645d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_8.c new file mode 100644 index 000000000..8b6adb828 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_9.c new file mode 100644 index 000000000..e8cec4505 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_10.c new file mode 100644 index 000000000..d0236baa6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_2.c new file mode 100644 index 000000000..e3247b7fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_3.c new file mode 100644 index 000000000..1f3f62a9b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_4.c new file mode 100644 index 000000000..216bd0ef2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_5.c new file mode 100644 index 000000000..fafee5a27 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_6.c new file mode 100644 index 000000000..bbd0bc918 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_7.c new file mode 100644 index 000000000..3d0a527a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_8.c new file mode 100644 index 000000000..33399eaf1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_9.c new file mode 100644 index 000000000..224b285e5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_10.c new file mode 100644 index 000000000..8aab4b5cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_12.c new file mode 100644 index 000000000..4d97834a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_15.c new file mode 100644 index 000000000..829356fd5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_16.c new file mode 100644 index 000000000..829d1ae56 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_2.c new file mode 100644 index 000000000..412f7ccbf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_20.c new file mode 100644 index 000000000..165fa1b8f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_25.c new file mode 100644 index 000000000..d761dd977 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_3.c new file mode 100644 index 000000000..9ebee3abd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_32.c new file mode 100644 index 000000000..cf497be5c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_4.c new file mode 100644 index 000000000..dc2f45cb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_5.c new file mode 100644 index 000000000..09e45e3ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_6.c new file mode 100644 index 000000000..3b08dc3a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_64.c new file mode 100644 index 000000000..8998378d3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_7.c new file mode 100644 index 000000000..c68162eb6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_8.c new file mode 100644 index 000000000..b6529d3d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_9.c new file mode 100644 index 000000000..f5edddd00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_16.c new file mode 100644 index 000000000..96ba4fccb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_2.c new file mode 100644 index 000000000..a05d9c574 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_32.c new file mode 100644 index 000000000..fa777c710 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_4.c new file mode 100644 index 000000000..52d1ae274 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_8.c new file mode 100644 index 000000000..8d39237a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_10.c new file mode 100644 index 000000000..81f74378e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_16.c new file mode 100644 index 000000000..d757af89b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_2.c new file mode 100644 index 000000000..2ee56cdc2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_20.c new file mode 100644 index 000000000..80c57db75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_25.c new file mode 100644 index 000000000..28398273e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_32.c new file mode 100644 index 000000000..840f5497f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_4.c new file mode 100644 index 000000000..0ac6a88ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_5.c new file mode 100644 index 000000000..3ce4431f7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_64.c new file mode 100644 index 000000000..6c20d3e4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_8.c new file mode 100644 index 000000000..26c747d0a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_10.c new file mode 100644 index 000000000..1fc126f54 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_16.c new file mode 100644 index 000000000..1fb3a2466 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_2.c new file mode 100644 index 000000000..060420b53 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_20.c new file mode 100644 index 000000000..22c2448d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_25.c new file mode 100644 index 000000000..b9fdce115 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_32.c new file mode 100644 index 000000000..76defad63 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_4.c new file mode 100644 index 000000000..06d6ce0a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_5.c new file mode 100644 index 000000000..8d52ebac6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_64.c new file mode 100644 index 000000000..9f01c056a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_8.c new file mode 100644 index 000000000..45aaa6680 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_16.c new file mode 100644 index 000000000..37a5703e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_32.c new file mode 100644 index 000000000..a3bd5a92c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_4.c new file mode 100644 index 000000000..28f572895 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_8.c new file mode 100644 index 000000000..12a622edf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_10.c new file mode 100644 index 000000000..30c001b94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_16.c new file mode 100644 index 000000000..2b225b798 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_20.c new file mode 100644 index 000000000..52806f852 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_25.c new file mode 100644 index 000000000..c933a9e88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_32.c new file mode 100644 index 000000000..6398f9fab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_4.c new file mode 100644 index 000000000..471b89946 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_5.c new file mode 100644 index 000000000..b9ad729c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_8.c new file mode 100644 index 000000000..0ba05f94e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_10.c new file mode 100644 index 000000000..76f7d5866 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_16.c new file mode 100644 index 000000000..51ed92bc3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_20.c new file mode 100644 index 000000000..843ff90f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_25.c new file mode 100644 index 000000000..7595e2709 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_32.c new file mode 100644 index 000000000..c87c453fb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_4.c new file mode 100644 index 000000000..b616e6539 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_5.c new file mode 100644 index 000000000..0f9fe0f64 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_8.c new file mode 100644 index 000000000..4eda85ffb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/neon/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/q1b.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/q1b.h new file mode 100644 index 000000000..af7df001d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/q1b.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define VTW VTW1 +#define TWVL TWVL1 +#define BYTW BYTW1 +#define BYTWJ BYTWJ1 + +#define GENUS XSIMD(dft_q1bsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/q1f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/q1f.h new file mode 100644 index 000000000..4649956ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/q1f.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define VTW VTW1 +#define TWVL TWVL1 +#define BYTW BYTW1 +#define BYTWJ BYTWJ1 + +#define GENUS XSIMD(dft_q1fsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/simd.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/simd.mk new file mode 100644 index 000000000..f210c4ef7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/simd.mk @@ -0,0 +1,12 @@ +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c + +if MAINTAINER_MODE +$(EXTRA_DIST): Makefile + ( \ + echo "/* Generated automatically. DO NOT EDIT! */"; \ + echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ + echo "#include \"../common/"$*".c\""; \ + ) >$@ +endif # MAINTAINER_MODE + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/Makefile.am new file mode 100644 index 000000000..f79801982 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(SSE2_CFLAGS) +SIMD_HEADER=simd-support/simd-sse2.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_SSE2 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_sse2_codelets.la +libdft_sse2_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/Makefile.in new file mode 100644 index 000000000..8d35ebc92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/Makefile.in @@ -0,0 +1,985 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/sse2 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_sse2_codelets_la_LIBADD = +am__libdft_sse2_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c n1fv_4.c \ + n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c n1fv_10.c \ + n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c n1fv_16.c \ + n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c n1bv_2.c \ + n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c n1bv_9.c \ + n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ + n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c \ + n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ + n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c n2bv_2.c \ + n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c n2bv_14.c \ + n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c n2sv_8.c \ + n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c t1fuv_4.c \ + t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c t1fuv_10.c \ + t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ + t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c \ + t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c t2fv_4.c t2fv_8.c \ + t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c t2fv_10.c t2fv_20.c \ + t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c \ + t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c t1buv_3.c t1buv_4.c \ + t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c t1buv_9.c t1buv_10.c \ + t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ + t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c \ + t1bv_64.c t1bv_20.c t1bv_25.c t2bv_2.c t2bv_4.c t2bv_8.c \ + t2bv_16.c t2bv_32.c t2bv_64.c t2bv_5.c t2bv_10.c t2bv_20.c \ + t2bv_25.c t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c \ + t3bv_10.c t3bv_20.c t3bv_25.c t1sv_2.c t1sv_4.c t1sv_8.c \ + t1sv_16.c t1sv_32.c t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c \ + q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c \ + q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_SSE2_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_SSE2_TRUE@am_libdft_sse2_codelets_la_OBJECTS = \ +@HAVE_SSE2_TRUE@ $(am__objects_20) +libdft_sse2_codelets_la_OBJECTS = \ + $(am_libdft_sse2_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_SSE2_TRUE@am_libdft_sse2_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_sse2_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_sse2_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(SSE2_CFLAGS) +SIMD_HEADER = simd-support/simd-sse2.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_SSE2_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_SSE2_TRUE@noinst_LTLIBRARIES = libdft_sse2_codelets.la +@HAVE_SSE2_TRUE@libdft_sse2_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/sse2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/sse2/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_sse2_codelets.la: $(libdft_sse2_codelets_la_OBJECTS) $(libdft_sse2_codelets_la_DEPENDENCIES) $(EXTRA_libdft_sse2_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_sse2_codelets_la_rpath) $(libdft_sse2_codelets_la_OBJECTS) $(libdft_sse2_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/codlist.c new file mode 100644 index 000000000..35eea34d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/genus.c new file mode 100644 index 000000000..5435152ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_10.c new file mode 100644 index 000000000..80b78540c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_11.c new file mode 100644 index 000000000..7cd66a3ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_12.c new file mode 100644 index 000000000..80da72e05 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_128.c new file mode 100644 index 000000000..b8d3348f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_13.c new file mode 100644 index 000000000..cdd5449e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_14.c new file mode 100644 index 000000000..e41f8c3e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_15.c new file mode 100644 index 000000000..9852da9f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_16.c new file mode 100644 index 000000000..980293f24 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_2.c new file mode 100644 index 000000000..088ca3e09 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_20.c new file mode 100644 index 000000000..af9610763 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_25.c new file mode 100644 index 000000000..855330cfe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_3.c new file mode 100644 index 000000000..a9aca2332 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_32.c new file mode 100644 index 000000000..14f47e4e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_4.c new file mode 100644 index 000000000..582e4b5d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_5.c new file mode 100644 index 000000000..5ef9a3e4d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_6.c new file mode 100644 index 000000000..fd9de3ddb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_64.c new file mode 100644 index 000000000..5cac3a357 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_7.c new file mode 100644 index 000000000..915368bea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_8.c new file mode 100644 index 000000000..28c1962d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_9.c new file mode 100644 index 000000000..6c6f2b714 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_10.c new file mode 100644 index 000000000..777bab303 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_11.c new file mode 100644 index 000000000..556a62b08 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_12.c new file mode 100644 index 000000000..f0cbb0867 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_128.c new file mode 100644 index 000000000..b6aad6dd5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_13.c new file mode 100644 index 000000000..4352a6348 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_14.c new file mode 100644 index 000000000..f244fcb23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_15.c new file mode 100644 index 000000000..652993c19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_16.c new file mode 100644 index 000000000..818782106 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_2.c new file mode 100644 index 000000000..6e7c798d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_20.c new file mode 100644 index 000000000..fd85c4d4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_25.c new file mode 100644 index 000000000..cf58f5fb2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_3.c new file mode 100644 index 000000000..659993ff4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_32.c new file mode 100644 index 000000000..52b6bbfd1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_4.c new file mode 100644 index 000000000..ca5b111c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_5.c new file mode 100644 index 000000000..cf004d2b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_6.c new file mode 100644 index 000000000..6841c4f2c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_64.c new file mode 100644 index 000000000..e806c3044 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_7.c new file mode 100644 index 000000000..65111af8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_8.c new file mode 100644 index 000000000..8ea2fdac2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_9.c new file mode 100644 index 000000000..8d9c71fa8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_10.c new file mode 100644 index 000000000..d259f3c2a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_12.c new file mode 100644 index 000000000..8c18d9d6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_14.c new file mode 100644 index 000000000..4f4736646 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_16.c new file mode 100644 index 000000000..fe9e994fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_2.c new file mode 100644 index 000000000..fd56afde3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_20.c new file mode 100644 index 000000000..4c26c4aa4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_32.c new file mode 100644 index 000000000..773c0e3cd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_4.c new file mode 100644 index 000000000..69c403d9c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_6.c new file mode 100644 index 000000000..81f9ec48a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_64.c new file mode 100644 index 000000000..9f0545ea6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_8.c new file mode 100644 index 000000000..59626aa3d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_10.c new file mode 100644 index 000000000..9ea028374 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_12.c new file mode 100644 index 000000000..fe6ca80a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_14.c new file mode 100644 index 000000000..a6c34f19e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_16.c new file mode 100644 index 000000000..61f68b7be --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_2.c new file mode 100644 index 000000000..4fda2a9c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_20.c new file mode 100644 index 000000000..e769962db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_32.c new file mode 100644 index 000000000..fa4fb9a99 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_4.c new file mode 100644 index 000000000..e2df86a6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_6.c new file mode 100644 index 000000000..0f18e1920 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_64.c new file mode 100644 index 000000000..0f199fb35 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_8.c new file mode 100644 index 000000000..9c5549ed6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_16.c new file mode 100644 index 000000000..feda52028 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_32.c new file mode 100644 index 000000000..04154f95f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_4.c new file mode 100644 index 000000000..394aff5f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_64.c new file mode 100644 index 000000000..e535cfd5c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_8.c new file mode 100644 index 000000000..51bf2489f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_2.c new file mode 100644 index 000000000..4ef077449 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_4.c new file mode 100644 index 000000000..92ad975b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_5.c new file mode 100644 index 000000000..54f6f3bba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_8.c new file mode 100644 index 000000000..6a3265a8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_2.c new file mode 100644 index 000000000..fb590ad71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_4.c new file mode 100644 index 000000000..8937079f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_5.c new file mode 100644 index 000000000..139cb5065 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_8.c new file mode 100644 index 000000000..362016e92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_10.c new file mode 100644 index 000000000..c44e47453 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_2.c new file mode 100644 index 000000000..f336d69a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_3.c new file mode 100644 index 000000000..5a3bf0f7d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_4.c new file mode 100644 index 000000000..257ea7e51 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_5.c new file mode 100644 index 000000000..bf3ace1fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_6.c new file mode 100644 index 000000000..d9a2c02e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_7.c new file mode 100644 index 000000000..3f7dadc5c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_8.c new file mode 100644 index 000000000..8219e2737 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_9.c new file mode 100644 index 000000000..ea573d2d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_10.c new file mode 100644 index 000000000..619d6c38b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_12.c new file mode 100644 index 000000000..2f900b724 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_15.c new file mode 100644 index 000000000..cc95c58ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_16.c new file mode 100644 index 000000000..6d5a4fed9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_2.c new file mode 100644 index 000000000..a26cbe61e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_20.c new file mode 100644 index 000000000..2a3edeb9c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_25.c new file mode 100644 index 000000000..24cf05bf7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_3.c new file mode 100644 index 000000000..3170d1e04 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_32.c new file mode 100644 index 000000000..f472914cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_4.c new file mode 100644 index 000000000..668fbd5ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_5.c new file mode 100644 index 000000000..44237f1a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_6.c new file mode 100644 index 000000000..519fa192f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_64.c new file mode 100644 index 000000000..e1a73984b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_7.c new file mode 100644 index 000000000..6504acd97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_8.c new file mode 100644 index 000000000..5e12ded6e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_9.c new file mode 100644 index 000000000..d9389ad8a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_10.c new file mode 100644 index 000000000..73264b213 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_2.c new file mode 100644 index 000000000..3820ce97f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_3.c new file mode 100644 index 000000000..5197076b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_4.c new file mode 100644 index 000000000..480b940e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_5.c new file mode 100644 index 000000000..37ebfd04f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_6.c new file mode 100644 index 000000000..98a0f0d37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_7.c new file mode 100644 index 000000000..9f66f5149 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_8.c new file mode 100644 index 000000000..c3d6405e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_9.c new file mode 100644 index 000000000..ba4220ef8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_10.c new file mode 100644 index 000000000..3ce2879c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_12.c new file mode 100644 index 000000000..c824e66e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_15.c new file mode 100644 index 000000000..ec6c32c04 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_16.c new file mode 100644 index 000000000..0174ffffc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_2.c new file mode 100644 index 000000000..63c867773 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_20.c new file mode 100644 index 000000000..6029d2d18 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_25.c new file mode 100644 index 000000000..3cb22346d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_3.c new file mode 100644 index 000000000..492338b7d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_32.c new file mode 100644 index 000000000..f517274d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_4.c new file mode 100644 index 000000000..08da7bcec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_5.c new file mode 100644 index 000000000..932ff44c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_6.c new file mode 100644 index 000000000..cec71908f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_64.c new file mode 100644 index 000000000..32d43aa25 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_7.c new file mode 100644 index 000000000..2b8d9c05f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_8.c new file mode 100644 index 000000000..c4baa606e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_9.c new file mode 100644 index 000000000..8c8563adb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_16.c new file mode 100644 index 000000000..f2bd716dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_2.c new file mode 100644 index 000000000..e1d4c1698 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_32.c new file mode 100644 index 000000000..565eade1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_4.c new file mode 100644 index 000000000..15ef520e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_8.c new file mode 100644 index 000000000..5ded1c994 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_10.c new file mode 100644 index 000000000..cc619b213 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_16.c new file mode 100644 index 000000000..ee3528924 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_2.c new file mode 100644 index 000000000..7094c4b97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_20.c new file mode 100644 index 000000000..0e57ea309 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_25.c new file mode 100644 index 000000000..1c5d46a0f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_32.c new file mode 100644 index 000000000..3bd4f3acc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_4.c new file mode 100644 index 000000000..f4c196e98 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_5.c new file mode 100644 index 000000000..609fda88a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_64.c new file mode 100644 index 000000000..6f88a470d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_8.c new file mode 100644 index 000000000..a96226cf6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_10.c new file mode 100644 index 000000000..328c83b6a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_16.c new file mode 100644 index 000000000..d0cacc14f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_2.c new file mode 100644 index 000000000..84f60dcd2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_20.c new file mode 100644 index 000000000..80c98ffa5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_25.c new file mode 100644 index 000000000..82983126a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_32.c new file mode 100644 index 000000000..ef77815c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_4.c new file mode 100644 index 000000000..7e1ef67f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_5.c new file mode 100644 index 000000000..9d29f8ef2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_64.c new file mode 100644 index 000000000..172cb83d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_8.c new file mode 100644 index 000000000..991a82a83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_16.c new file mode 100644 index 000000000..215e084d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_32.c new file mode 100644 index 000000000..912fa8cb2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_4.c new file mode 100644 index 000000000..129e11688 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_8.c new file mode 100644 index 000000000..9609e93b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_10.c new file mode 100644 index 000000000..8d0e7db37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_16.c new file mode 100644 index 000000000..9e3cf9fa5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_20.c new file mode 100644 index 000000000..e87ccbe1a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_25.c new file mode 100644 index 000000000..585568bbe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_32.c new file mode 100644 index 000000000..2e70e34a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_4.c new file mode 100644 index 000000000..d6dc213e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_5.c new file mode 100644 index 000000000..f9a36e76a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_8.c new file mode 100644 index 000000000..a96ca0588 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_10.c new file mode 100644 index 000000000..084576d54 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_16.c new file mode 100644 index 000000000..4f58c9d7c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_20.c new file mode 100644 index 000000000..4bd83dfc9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_25.c new file mode 100644 index 000000000..b5caaf362 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_32.c new file mode 100644 index 000000000..0aeebd206 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_4.c new file mode 100644 index 000000000..6ecb86478 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_5.c new file mode 100644 index 000000000..5f97473e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_8.c new file mode 100644 index 000000000..a1bf1bf24 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/sse2/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1b.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1b.h new file mode 100644 index 000000000..420369426 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1b.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTW1 +#define TWVL TWVL1 +#define BYTW BYTW1 +#define BYTWJ BYTWJ1 + +#define GENUS XSIMD(dft_t1bsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1bu.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1bu.h new file mode 100644 index 000000000..6c9be6440 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1bu.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define VTW VTW1 +#define TWVL TWVL1 +#define BYTW BYTW1 +#define BYTWJ BYTWJ1 + +#define GENUS XSIMD(dft_t1busimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1f.h new file mode 100644 index 000000000..37f38c704 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1f.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTW1 +#define TWVL TWVL1 +#define BYTW BYTW1 +#define BYTWJ BYTWJ1 + +#define GENUS XSIMD(dft_t1fsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1fu.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1fu.h new file mode 100644 index 000000000..a7fdc1073 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t1fu.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define VTW VTW1 +#define TWVL TWVL1 +#define BYTW BYTW1 +#define BYTWJ BYTWJ1 + +#define GENUS XSIMD(dft_t1fusimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t2b.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t2b.h new file mode 100644 index 000000000..a65a11dff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t2b.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTW2 +#define TWVL TWVL2 +#define BYTW BYTW2 +#define BYTWJ BYTWJ2 + +#define GENUS XSIMD(dft_t2bsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t2f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t2f.h new file mode 100644 index 000000000..5e5e4edec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t2f.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTW2 +#define TWVL TWVL2 +#define BYTW BYTW2 +#define BYTWJ BYTWJ2 + +#define GENUS XSIMD(dft_t2fsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t3b.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t3b.h new file mode 100644 index 000000000..e37df4dd0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t3b.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTW3 +#define TWVL TWVL3 +#define LDW(x) LDA(x, 0, 0) /* load twiddle factor */ + +/* same as t1b otherwise */ +#define GENUS XSIMD(dft_t1bsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t3f.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t3f.h new file mode 100644 index 000000000..453eb9122 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/t3f.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTW3 +#define TWVL TWVL3 +#define LDW(x) LDA(x, 0, 0) /* load twiddle factor */ + +/* same as t1f otherwise */ +#define GENUS XSIMD(dft_t1fsimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/ts.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/ts.h new file mode 100644 index 000000000..34dca7529 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/ts.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#undef LD +#define LD LDA +#undef ST +#define ST STA + +#define VTW VTWS +#define TWVL TWVLS +#define LDW(x) LDA(x, 0, 0) /* load twiddle factor */ + +#define GENUS XSIMD(dft_tssimd_genus) +extern const ct_genus GENUS; + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/Makefile.am new file mode 100644 index 000000000..ddce35434 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(VSX_CFLAGS) +SIMD_HEADER=simd-support/simd-vsx.h + +include $(top_srcdir)/dft/simd/codlist.mk +include $(top_srcdir)/dft/simd/simd.mk + +if HAVE_VSX + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = libdft_vsx_codelets.la +libdft_vsx_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/Makefile.in new file mode 100644 index 000000000..11cceabab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/Makefile.in @@ -0,0 +1,983 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of DFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = dft/simd/vsx +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdft_vsx_codelets_la_LIBADD = +am__libdft_vsx_codelets_la_SOURCES_DIST = n1fv_2.c n1fv_3.c n1fv_4.c \ + n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c n1fv_9.c n1fv_10.c \ + n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c n1fv_16.c \ + n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c n1bv_2.c \ + n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c n1bv_9.c \ + n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ + n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c \ + n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ + n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c n2bv_2.c \ + n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c n2bv_14.c \ + n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c n2sv_4.c n2sv_8.c \ + n2sv_16.c n2sv_32.c n2sv_64.c t1fuv_2.c t1fuv_3.c t1fuv_4.c \ + t1fuv_5.c t1fuv_6.c t1fuv_7.c t1fuv_8.c t1fuv_9.c t1fuv_10.c \ + t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ + t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c \ + t1fv_64.c t1fv_20.c t1fv_25.c t2fv_2.c t2fv_4.c t2fv_8.c \ + t2fv_16.c t2fv_32.c t2fv_64.c t2fv_5.c t2fv_10.c t2fv_20.c \ + t2fv_25.c t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c \ + t3fv_10.c t3fv_20.c t3fv_25.c t1buv_2.c t1buv_3.c t1buv_4.c \ + t1buv_5.c t1buv_6.c t1buv_7.c t1buv_8.c t1buv_9.c t1buv_10.c \ + t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ + t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c \ + t1bv_64.c t1bv_20.c t1bv_25.c t2bv_2.c t2bv_4.c t2bv_8.c \ + t2bv_16.c t2bv_32.c t2bv_64.c t2bv_5.c t2bv_10.c t2bv_20.c \ + t2bv_25.c t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c \ + t3bv_10.c t3bv_20.c t3bv_25.c t1sv_2.c t1sv_4.c t1sv_8.c \ + t1sv_16.c t1sv_32.c t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c \ + q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c q1bv_2.c q1bv_4.c q1bv_5.c \ + q1bv_8.c genus.c codlist.c +am__objects_1 = n1fv_2.lo n1fv_3.lo n1fv_4.lo n1fv_5.lo n1fv_6.lo \ + n1fv_7.lo n1fv_8.lo n1fv_9.lo n1fv_10.lo n1fv_11.lo n1fv_12.lo \ + n1fv_13.lo n1fv_14.lo n1fv_15.lo n1fv_16.lo n1fv_32.lo \ + n1fv_64.lo n1fv_128.lo n1fv_20.lo n1fv_25.lo +am__objects_2 = n1bv_2.lo n1bv_3.lo n1bv_4.lo n1bv_5.lo n1bv_6.lo \ + n1bv_7.lo n1bv_8.lo n1bv_9.lo n1bv_10.lo n1bv_11.lo n1bv_12.lo \ + n1bv_13.lo n1bv_14.lo n1bv_15.lo n1bv_16.lo n1bv_32.lo \ + n1bv_64.lo n1bv_128.lo n1bv_20.lo n1bv_25.lo +am__objects_3 = n2fv_2.lo n2fv_4.lo n2fv_6.lo n2fv_8.lo n2fv_10.lo \ + n2fv_12.lo n2fv_14.lo n2fv_16.lo n2fv_32.lo n2fv_64.lo \ + n2fv_20.lo +am__objects_4 = n2bv_2.lo n2bv_4.lo n2bv_6.lo n2bv_8.lo n2bv_10.lo \ + n2bv_12.lo n2bv_14.lo n2bv_16.lo n2bv_32.lo n2bv_64.lo \ + n2bv_20.lo +am__objects_5 = n2sv_4.lo n2sv_8.lo n2sv_16.lo n2sv_32.lo n2sv_64.lo +am__objects_6 = t1fuv_2.lo t1fuv_3.lo t1fuv_4.lo t1fuv_5.lo t1fuv_6.lo \ + t1fuv_7.lo t1fuv_8.lo t1fuv_9.lo t1fuv_10.lo +am__objects_7 = t1fv_2.lo t1fv_3.lo t1fv_4.lo t1fv_5.lo t1fv_6.lo \ + t1fv_7.lo t1fv_8.lo t1fv_9.lo t1fv_10.lo t1fv_12.lo t1fv_15.lo \ + t1fv_16.lo t1fv_32.lo t1fv_64.lo t1fv_20.lo t1fv_25.lo +am__objects_8 = t2fv_2.lo t2fv_4.lo t2fv_8.lo t2fv_16.lo t2fv_32.lo \ + t2fv_64.lo t2fv_5.lo t2fv_10.lo t2fv_20.lo t2fv_25.lo +am__objects_9 = t3fv_4.lo t3fv_8.lo t3fv_16.lo t3fv_32.lo t3fv_5.lo \ + t3fv_10.lo t3fv_20.lo t3fv_25.lo +am__objects_10 = t1buv_2.lo t1buv_3.lo t1buv_4.lo t1buv_5.lo \ + t1buv_6.lo t1buv_7.lo t1buv_8.lo t1buv_9.lo t1buv_10.lo +am__objects_11 = t1bv_2.lo t1bv_3.lo t1bv_4.lo t1bv_5.lo t1bv_6.lo \ + t1bv_7.lo t1bv_8.lo t1bv_9.lo t1bv_10.lo t1bv_12.lo t1bv_15.lo \ + t1bv_16.lo t1bv_32.lo t1bv_64.lo t1bv_20.lo t1bv_25.lo +am__objects_12 = t2bv_2.lo t2bv_4.lo t2bv_8.lo t2bv_16.lo t2bv_32.lo \ + t2bv_64.lo t2bv_5.lo t2bv_10.lo t2bv_20.lo t2bv_25.lo +am__objects_13 = t3bv_4.lo t3bv_8.lo t3bv_16.lo t3bv_32.lo t3bv_5.lo \ + t3bv_10.lo t3bv_20.lo t3bv_25.lo +am__objects_14 = t1sv_2.lo t1sv_4.lo t1sv_8.lo t1sv_16.lo t1sv_32.lo +am__objects_15 = t2sv_4.lo t2sv_8.lo t2sv_16.lo t2sv_32.lo +am__objects_16 = q1fv_2.lo q1fv_4.lo q1fv_5.lo q1fv_8.lo +am__objects_17 = q1bv_2.lo q1bv_4.lo q1bv_5.lo q1bv_8.lo +am__objects_18 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) $(am__objects_9) \ + $(am__objects_10) $(am__objects_11) $(am__objects_12) \ + $(am__objects_13) $(am__objects_14) $(am__objects_15) \ + $(am__objects_16) $(am__objects_17) +am__objects_19 = $(am__objects_18) genus.lo codlist.lo +@HAVE_VSX_TRUE@am__objects_20 = $(am__objects_19) +@HAVE_VSX_TRUE@am_libdft_vsx_codelets_la_OBJECTS = $(am__objects_20) +libdft_vsx_codelets_la_OBJECTS = $(am_libdft_vsx_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_VSX_TRUE@am_libdft_vsx_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdft_vsx_codelets_la_SOURCES) +DIST_SOURCES = $(am__libdft_vsx_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/dft/simd/codlist.mk \ + $(top_srcdir)/dft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(VSX_CFLAGS) +SIMD_HEADER = simd-support/simd-vsx.h + +########################################################################### +# n1fv_ is a hard-coded FFTW_FORWARD FFT of size , using SIMD +N1F = n1fv_2.c n1fv_3.c n1fv_4.c n1fv_5.c n1fv_6.c n1fv_7.c n1fv_8.c \ +n1fv_9.c n1fv_10.c n1fv_11.c n1fv_12.c n1fv_13.c n1fv_14.c n1fv_15.c \ +n1fv_16.c n1fv_32.c n1fv_64.c n1fv_128.c n1fv_20.c n1fv_25.c + + +# as above, with restricted input vector stride +N2F = n2fv_2.c n2fv_4.c n2fv_6.c n2fv_8.c n2fv_10.c n2fv_12.c \ +n2fv_14.c n2fv_16.c n2fv_32.c n2fv_64.c n2fv_20.c + + +# as above, but FFTW_BACKWARD +N1B = n1bv_2.c n1bv_3.c n1bv_4.c n1bv_5.c n1bv_6.c n1bv_7.c n1bv_8.c \ +n1bv_9.c n1bv_10.c n1bv_11.c n1bv_12.c n1bv_13.c n1bv_14.c n1bv_15.c \ +n1bv_16.c n1bv_32.c n1bv_64.c n1bv_128.c n1bv_20.c n1bv_25.c + +N2B = n2bv_2.c n2bv_4.c n2bv_6.c n2bv_8.c n2bv_10.c n2bv_12.c \ +n2bv_14.c n2bv_16.c n2bv_32.c n2bv_64.c n2bv_20.c + + +# split-complex codelets +N2S = n2sv_4.c n2sv_8.c n2sv_16.c n2sv_32.c n2sv_64.c + +########################################################################### +# t1fv_ is a "twiddle" FFT of size , implementing a radix-r DIT step +# for an FFTW_FORWARD transform, using SIMD +T1F = t1fv_2.c t1fv_3.c t1fv_4.c t1fv_5.c t1fv_6.c t1fv_7.c t1fv_8.c \ +t1fv_9.c t1fv_10.c t1fv_12.c t1fv_15.c t1fv_16.c t1fv_32.c t1fv_64.c \ +t1fv_20.c t1fv_25.c + + +# same as t1fv_*, but with different twiddle storage scheme +T2F = t2fv_2.c t2fv_4.c t2fv_8.c t2fv_16.c t2fv_32.c t2fv_64.c \ +t2fv_5.c t2fv_10.c t2fv_20.c t2fv_25.c + +T3F = t3fv_4.c t3fv_8.c t3fv_16.c t3fv_32.c t3fv_5.c t3fv_10.c \ +t3fv_20.c t3fv_25.c + +T1FU = t1fuv_2.c t1fuv_3.c t1fuv_4.c t1fuv_5.c t1fuv_6.c t1fuv_7.c \ +t1fuv_8.c t1fuv_9.c t1fuv_10.c + + +# as above, but FFTW_BACKWARD +T1B = t1bv_2.c t1bv_3.c t1bv_4.c t1bv_5.c t1bv_6.c t1bv_7.c t1bv_8.c \ +t1bv_9.c t1bv_10.c t1bv_12.c t1bv_15.c t1bv_16.c t1bv_32.c t1bv_64.c \ +t1bv_20.c t1bv_25.c + + +# same as t1bv_*, but with different twiddle storage scheme +T2B = t2bv_2.c t2bv_4.c t2bv_8.c t2bv_16.c t2bv_32.c t2bv_64.c \ +t2bv_5.c t2bv_10.c t2bv_20.c t2bv_25.c + +T3B = t3bv_4.c t3bv_8.c t3bv_16.c t3bv_32.c t3bv_5.c t3bv_10.c \ +t3bv_20.c t3bv_25.c + +T1BU = t1buv_2.c t1buv_3.c t1buv_4.c t1buv_5.c t1buv_6.c t1buv_7.c \ +t1buv_8.c t1buv_9.c t1buv_10.c + + +# split-complex codelets +T1S = t1sv_2.c t1sv_4.c t1sv_8.c t1sv_16.c t1sv_32.c +T2S = t2sv_4.c t2sv_8.c t2sv_16.c t2sv_32.c + +########################################################################### +# q1fv_ is twiddle FFTW_FORWARD FFTs of size (DIF step), +# where the output is transposed, using SIMD. This is used for +# in-place transposes in sizes that are divisible by ^2. These +# codelets have size ~ ^2, so you should probably not use +# bigger than 8 or so. +Q1F = q1fv_2.c q1fv_4.c q1fv_5.c q1fv_8.c + +# as above, but FFTW_BACKWARD +Q1B = q1bv_2.c q1bv_4.c q1bv_5.c q1bv_8.c + +########################################################################### +SIMD_CODELETS = $(N1F) $(N1B) $(N2F) $(N2B) $(N2S) $(T1FU) $(T1F) \ +$(T2F) $(T3F) $(T1BU) $(T1B) $(T2B) $(T3B) $(T1S) $(T2S) $(Q1F) $(Q1B) + +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_VSX_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_VSX_TRUE@noinst_LTLIBRARIES = libdft_vsx_codelets.la +@HAVE_VSX_TRUE@libdft_vsx_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu dft/simd/vsx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu dft/simd/vsx/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/dft/simd/codlist.mk $(top_srcdir)/dft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libdft_vsx_codelets.la: $(libdft_vsx_codelets_la_OBJECTS) $(libdft_vsx_codelets_la_DEPENDENCIES) $(EXTRA_libdft_vsx_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_libdft_vsx_codelets_la_rpath) $(libdft_vsx_codelets_la_OBJECTS) $(libdft_vsx_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/q1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1buv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1bv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fuv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1fv_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t1sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2fv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t2sv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3bv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t3fv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/codlist.c new file mode 100644 index 000000000..efa4ec8e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/genus.c new file mode 100644 index 000000000..b195f84f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_10.c new file mode 100644 index 000000000..f0e6b6cea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_11.c new file mode 100644 index 000000000..3aa7d6281 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_12.c new file mode 100644 index 000000000..82934bd91 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_128.c new file mode 100644 index 000000000..805318ba6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_13.c new file mode 100644 index 000000000..1a163a7ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_14.c new file mode 100644 index 000000000..595a1b7d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_15.c new file mode 100644 index 000000000..147e33897 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_16.c new file mode 100644 index 000000000..e03b44583 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_2.c new file mode 100644 index 000000000..eb543fcc4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_20.c new file mode 100644 index 000000000..2f815ae0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_25.c new file mode 100644 index 000000000..4fd5d9159 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_3.c new file mode 100644 index 000000000..8cfd0269c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_32.c new file mode 100644 index 000000000..9ed8e758d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_4.c new file mode 100644 index 000000000..8eabd2e79 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_5.c new file mode 100644 index 000000000..01b0fe890 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_6.c new file mode 100644 index 000000000..c8706673f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_64.c new file mode 100644 index 000000000..ca475d5e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_7.c new file mode 100644 index 000000000..20f92e52b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_8.c new file mode 100644 index 000000000..fdc9bcec6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_9.c new file mode 100644 index 000000000..de4225748 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_10.c new file mode 100644 index 000000000..6e524d450 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_11.c new file mode 100644 index 000000000..fbed57a51 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_11.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_11.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_12.c new file mode 100644 index 000000000..de1d600e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_128.c new file mode 100644 index 000000000..2db306cb8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_128.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_128.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_13.c new file mode 100644 index 000000000..bf802aef4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_13.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_13.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_14.c new file mode 100644 index 000000000..430d55140 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_15.c new file mode 100644 index 000000000..2b9e82348 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_16.c new file mode 100644 index 000000000..614d3f81b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_2.c new file mode 100644 index 000000000..7784a0863 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_20.c new file mode 100644 index 000000000..93f685798 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_25.c new file mode 100644 index 000000000..340e39d32 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_3.c new file mode 100644 index 000000000..e086bcbbf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_32.c new file mode 100644 index 000000000..d0fa51daa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_4.c new file mode 100644 index 000000000..63ab15e30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_5.c new file mode 100644 index 000000000..b7f6b28fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_6.c new file mode 100644 index 000000000..584042079 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_64.c new file mode 100644 index 000000000..884aa2c83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_7.c new file mode 100644 index 000000000..bb9a0d1bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_8.c new file mode 100644 index 000000000..4c08e959a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_9.c new file mode 100644 index 000000000..e37c0e6c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_10.c new file mode 100644 index 000000000..2aaaad622 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_12.c new file mode 100644 index 000000000..08c8072ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_14.c new file mode 100644 index 000000000..0f459ad47 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_16.c new file mode 100644 index 000000000..18ee309d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_2.c new file mode 100644 index 000000000..da7799443 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_20.c new file mode 100644 index 000000000..ddc6f8bd6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_32.c new file mode 100644 index 000000000..442866050 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_4.c new file mode 100644 index 000000000..232702b90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_6.c new file mode 100644 index 000000000..f09a76e40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_64.c new file mode 100644 index 000000000..c35edb464 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_8.c new file mode 100644 index 000000000..7e127e728 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_10.c new file mode 100644 index 000000000..94438339c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_12.c new file mode 100644 index 000000000..298a9128e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_14.c new file mode 100644 index 000000000..8c02ebd64 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_14.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_14.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_16.c new file mode 100644 index 000000000..0cceda700 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_2.c new file mode 100644 index 000000000..ecddb5592 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_20.c new file mode 100644 index 000000000..03f6c54ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_32.c new file mode 100644 index 000000000..7d8f433e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_4.c new file mode 100644 index 000000000..e5accb6f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_6.c new file mode 100644 index 000000000..459e422a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_64.c new file mode 100644 index 000000000..7458a9996 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_8.c new file mode 100644 index 000000000..59868eae0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_16.c new file mode 100644 index 000000000..1ccb40847 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_32.c new file mode 100644 index 000000000..f26946940 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_4.c new file mode 100644 index 000000000..ba101d39c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_64.c new file mode 100644 index 000000000..c28e3c1d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2sv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_8.c new file mode 100644 index 000000000..c40e53299 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/n2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/n2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_2.c new file mode 100644 index 000000000..82097ee7a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_4.c new file mode 100644 index 000000000..33290bf50 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_5.c new file mode 100644 index 000000000..6ba6ca2cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_8.c new file mode 100644 index 000000000..88cedc88f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_2.c new file mode 100644 index 000000000..7bd04729e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_4.c new file mode 100644 index 000000000..87167209c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_5.c new file mode 100644 index 000000000..c52152505 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_8.c new file mode 100644 index 000000000..2c47c4294 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/q1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/q1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_10.c new file mode 100644 index 000000000..110edaf7f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_2.c new file mode 100644 index 000000000..bc9bee1e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_3.c new file mode 100644 index 000000000..6991fbd44 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_4.c new file mode 100644 index 000000000..a751f88e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_5.c new file mode 100644 index 000000000..d8029db76 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_6.c new file mode 100644 index 000000000..c28ad1bcc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_7.c new file mode 100644 index 000000000..856e13e4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_8.c new file mode 100644 index 000000000..4215c1ff2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_9.c new file mode 100644 index 000000000..06fc93725 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1buv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1buv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_10.c new file mode 100644 index 000000000..73b35e5db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_12.c new file mode 100644 index 000000000..a18731002 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_15.c new file mode 100644 index 000000000..bb8ba5782 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_16.c new file mode 100644 index 000000000..b4c0d8934 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_2.c new file mode 100644 index 000000000..e1b45e6e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_20.c new file mode 100644 index 000000000..36c333eb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_25.c new file mode 100644 index 000000000..8a2291b41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_3.c new file mode 100644 index 000000000..f269fd78a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_32.c new file mode 100644 index 000000000..26b862081 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_4.c new file mode 100644 index 000000000..5db037391 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_5.c new file mode 100644 index 000000000..d602ce5fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_6.c new file mode 100644 index 000000000..0d07bd723 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_64.c new file mode 100644 index 000000000..3bd36a8ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_7.c new file mode 100644 index 000000000..05fe2e5cf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_8.c new file mode 100644 index 000000000..833a1e899 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_9.c new file mode 100644 index 000000000..a51820d1f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1bv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1bv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_10.c new file mode 100644 index 000000000..3c5e1c912 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_2.c new file mode 100644 index 000000000..d9013eb94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_3.c new file mode 100644 index 000000000..22082a6b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_4.c new file mode 100644 index 000000000..9f46a76b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_5.c new file mode 100644 index 000000000..c8ee22acd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_6.c new file mode 100644 index 000000000..de9234f13 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_7.c new file mode 100644 index 000000000..42a92f9c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_8.c new file mode 100644 index 000000000..b3b548a6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_9.c new file mode 100644 index 000000000..a64101152 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fuv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fuv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_10.c new file mode 100644 index 000000000..b8530a085 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_12.c new file mode 100644 index 000000000..66c9bb8bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_15.c new file mode 100644 index 000000000..13152d1d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_15.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_15.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_16.c new file mode 100644 index 000000000..ff9deea16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_2.c new file mode 100644 index 000000000..83bd4023c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_20.c new file mode 100644 index 000000000..82309f637 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_25.c new file mode 100644 index 000000000..4adc4f43b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_3.c new file mode 100644 index 000000000..ce1ce86c8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_3.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_3.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_32.c new file mode 100644 index 000000000..bbea1731a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_4.c new file mode 100644 index 000000000..5fa2d05fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_5.c new file mode 100644 index 000000000..d96c40a2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_6.c new file mode 100644 index 000000000..5ff850df4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_64.c new file mode 100644 index 000000000..589ec18bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_7.c new file mode 100644 index 000000000..af3481812 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_7.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_7.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_8.c new file mode 100644 index 000000000..748b2c83b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_9.c new file mode 100644 index 000000000..b72dbd9e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1fv_9.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1fv_9.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_16.c new file mode 100644 index 000000000..fddb22e1d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_2.c new file mode 100644 index 000000000..d03878ba5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1sv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_32.c new file mode 100644 index 000000000..d4db045df --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_4.c new file mode 100644 index 000000000..0fa451723 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_8.c new file mode 100644 index 000000000..dc086243a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t1sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t1sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_10.c new file mode 100644 index 000000000..f1b548ed5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_16.c new file mode 100644 index 000000000..18d7df6b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_2.c new file mode 100644 index 000000000..d6270d476 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_20.c new file mode 100644 index 000000000..a0037b755 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_25.c new file mode 100644 index 000000000..424583d7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_32.c new file mode 100644 index 000000000..780519c6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_4.c new file mode 100644 index 000000000..f78c37012 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_5.c new file mode 100644 index 000000000..986fe5a05 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_64.c new file mode 100644 index 000000000..97121d0e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_8.c new file mode 100644 index 000000000..851835af2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_10.c new file mode 100644 index 000000000..c4e940b61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_16.c new file mode 100644 index 000000000..75440afc5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_2.c new file mode 100644 index 000000000..db43786b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_20.c new file mode 100644 index 000000000..3c00e240b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_25.c new file mode 100644 index 000000000..eac0558b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_32.c new file mode 100644 index 000000000..0ccd974f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_4.c new file mode 100644 index 000000000..5daf7d40c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_5.c new file mode 100644 index 000000000..aa5d8cfd4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_64.c new file mode 100644 index 000000000..49df1133c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_64.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_64.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_8.c new file mode 100644 index 000000000..afa8b649d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_16.c new file mode 100644 index 000000000..dac63a86f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2sv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_32.c new file mode 100644 index 000000000..1b3092b20 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2sv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_4.c new file mode 100644 index 000000000..adeab3fd1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2sv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_8.c new file mode 100644 index 000000000..0eb87b25b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t2sv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t2sv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_10.c new file mode 100644 index 000000000..4a946faee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_16.c new file mode 100644 index 000000000..08e2d14c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_20.c new file mode 100644 index 000000000..50b3dede5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_25.c new file mode 100644 index 000000000..b33032dde --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_32.c new file mode 100644 index 000000000..5e544fb22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_4.c new file mode 100644 index 000000000..06f0bae2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_5.c new file mode 100644 index 000000000..66bf8a65a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_8.c new file mode 100644 index 000000000..0a067ac5d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3bv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3bv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_10.c new file mode 100644 index 000000000..7f9a0a61a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_16.c new file mode 100644 index 000000000..673d269f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_20.c new file mode 100644 index 000000000..aeef5a6b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_25.c new file mode 100644 index 000000000..dbec41440 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_25.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_25.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_32.c new file mode 100644 index 000000000..f0c0935b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_4.c new file mode 100644 index 000000000..74958f77d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_5.c new file mode 100644 index 000000000..362170b16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_5.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_5.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_8.c new file mode 100644 index 000000000..27e0b9507 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/simd/vsx/t3fv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/t3fv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/solve.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/solve.c new file mode 100644 index 000000000..e11c2d4a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/solve.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" + +/* use the apply() operation for DFT problems */ +void X(dft_solve)(const plan *ego_, const problem *p_) +{ + const plan_dft *ego = (const plan_dft *) ego_; + const problem_dft *p = (const problem_dft *) p_; + ego->apply(ego_, + UNTAINT(p->ri), UNTAINT(p->ii), + UNTAINT(p->ro), UNTAINT(p->io)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/vrank-geq1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/vrank-geq1.c new file mode 100644 index 000000000..937aba7cb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/vrank-geq1.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +/* Plans for handling vector transform loops. These are *just* the + loops, and rely on child plans for the actual DFTs. + + They form a wrapper around solvers that don't have apply functions + for non-null vectors. + + vrank-geq1 plans also recursively handle the case of multi-dimensional + vectors, obviating the need for most solvers to deal with this. We + can also play games here, such as reordering the vector loops. + + Each vrank-geq1 plan reduces the vector rank by 1, picking out a + dimension determined by the vecloop_dim field of the solver. */ + +#include "dft/dft.h" + +typedef struct { + solver super; + int vecloop_dim; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_dft super; + + plan *cld; + INT vl; + INT ivs, ovs; + const S *solver; +} P; + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT i, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + dftapply cldapply = ((plan_dft *) ego->cld)->apply; + + for (i = 0; i < vl; ++i) { + cldapply(ego->cld, + ri + i * ivs, ii + i * ivs, ro + i * ovs, io + i * ovs); + } +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + p->print(p, "(dft-vrank>=1-x%D/%d%(%p%))", + ego->vl, s->vecloop_dim, ego->cld); +} + +static int pickdim(const S *ego, const tensor *vecsz, int oop, int *dp) +{ + return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies, + vecsz, oop, dp); +} + +static int applicable0(const solver *ego_, const problem *p_, int *dp) +{ + const S *ego = (const S *) ego_; + const problem_dft *p = (const problem_dft *) p_; + + return (1 + && FINITE_RNK(p->vecsz->rnk) + && p->vecsz->rnk > 0 + + /* do not bother looping over rank-0 problems, + since they are handled via rdft */ + && p->sz->rnk > 0 + + && pickdim(ego, p->vecsz, p->ri != p->ro, dp) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *)ego_; + const problem_dft *p; + + if (!applicable0(ego_, p_, dp)) return 0; + + /* fftw2 behavior */ + if (NO_VRANK_SPLITSP(plnr) && (ego->vecloop_dim != ego->buddies[0])) + return 0; + + p = (const problem_dft *) p_; + + if (NO_UGLYP(plnr)) { + /* Heuristic: if the transform is multi-dimensional, and the + vector stride is less than the transform size, then we + probably want to use a rank>=2 plan first in order to combine + this vector with the transform-dimension vectors. */ + { + iodim *d = p->vecsz->dims + *dp; + if (1 + && p->sz->rnk > 1 + && X(imin)(X(iabs)(d->is), X(iabs)(d->os)) + < X(tensor_max_index)(p->sz) + ) + return 0; + } + + if (NO_NONTHREADEDP(plnr)) return 0; /* prefer threaded version */ + } + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_dft *p; + P *pln; + plan *cld; + int vdim; + iodim *d; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &vdim)) + return (plan *) 0; + p = (const problem_dft *) p_; + + d = p->vecsz->dims + vdim; + + A(d->n > 1); + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(tensor_copy)(p->sz), + X(tensor_copy_except)(p->vecsz, vdim), + TAINT(p->ri, d->is), TAINT(p->ii, d->is), + TAINT(p->ro, d->os), TAINT(p->io, d->os))); + if (!cld) return (plan *) 0; + + pln = MKPLAN_DFT(P, &padt, apply); + + pln->cld = cld; + pln->vl = d->n; + pln->ivs = d->is; + pln->ovs = d->os; + + pln->solver = ego; + X(ops_zero)(&pln->super.super.ops); + pln->super.super.ops.other = 3.14159; /* magic to prefer codelet loops */ + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + if (p->sz->rnk != 1 || (p->sz->dims[0].n > 64)) + pln->super.super.pcost = pln->vl * cld->pcost; + + return &(pln->super.super); +} + +static solver *mksolver(int vecloop_dim, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->vecloop_dim = vecloop_dim; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(dft_vrank_geq1_register)(planner *p) +{ + /* FIXME: Should we try other vecloop_dim values? */ + static const int buddies[] = { 1, -1 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/zero.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/zero.c new file mode 100644 index 000000000..9ae16f4c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/dft/zero.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" + +/* fill a complex array with zeros. */ +static void recur(const iodim *dims, int rnk, R *ri, R *ii) +{ + if (rnk == RNK_MINFTY) + return; + else if (rnk == 0) + ri[0] = ii[0] = K(0.0); + else if (rnk > 0) { + INT i, n = dims[0].n; + INT is = dims[0].is; + + if (rnk == 1) { + /* this case is redundant but faster */ + for (i = 0; i < n; ++i) + ri[i * is] = ii[i * is] = K(0.0); + } else { + for (i = 0; i < n; ++i) + recur(dims + 1, rnk - 1, ri + i * is, ii + i * is); + } + } +} + + +void X(dft_zerotens)(tensor *sz, R *ri, R *ii) +{ + recur(sz->dims, sz->rnk, ri, ii); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/Makefile.am new file mode 100644 index 000000000..ea9fa2282 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/Makefile.am @@ -0,0 +1,23 @@ +BFNNCONV_SRC = bfnnconv.pl m-ascii.pl m-html.pl m-info.pl m-lout.pl m-post.pl + +FAQ = fftw-faq.ascii fftw-faq.html +EXTRA_DIST = fftw-faq.bfnn $(FAQ) $(BFNNCONV_SRC) html.refs + +html.refs2: html.refs + cp -f ${srcdir}/html.refs html.refs2 + +$(FAQ): $(BFNNCONV_SRC) fftw-faq.bfnn html.refs2 + @echo converting... + perl -I${srcdir} ${srcdir}/bfnnconv.pl < ${srcdir}/fftw-faq.bfnn + @echo converting again... + perl -I${srcdir} ${srcdir}/bfnnconv.pl < ${srcdir}/fftw-faq.bfnn + rm -f fftw-faq.ascii + mv stdin.ascii fftw-faq.ascii + rm -rf fftw-faq.html + mv -f stdin.html fftw-faq.html + +faq: $(FAQ) + +clean-local: + rm -f *~ core a.out *.lout *.ps *.info *.ascii *.xrefdb *.post + rm -rf *.html html.refs2 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/Makefile.in new file mode 100644 index 000000000..c52562037 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/Makefile.in @@ -0,0 +1,500 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc/FAQ +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +BFNNCONV_SRC = bfnnconv.pl m-ascii.pl m-html.pl m-info.pl m-lout.pl m-post.pl +FAQ = fftw-faq.ascii fftw-faq.html +EXTRA_DIST = fftw-faq.bfnn $(FAQ) $(BFNNCONV_SRC) html.refs +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/FAQ/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/FAQ/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + clean-local cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +html.refs2: html.refs + cp -f ${srcdir}/html.refs html.refs2 + +$(FAQ): $(BFNNCONV_SRC) fftw-faq.bfnn html.refs2 + @echo converting... + perl -I${srcdir} ${srcdir}/bfnnconv.pl < ${srcdir}/fftw-faq.bfnn + @echo converting again... + perl -I${srcdir} ${srcdir}/bfnnconv.pl < ${srcdir}/fftw-faq.bfnn + rm -f fftw-faq.ascii + mv stdin.ascii fftw-faq.ascii + rm -rf fftw-faq.html + mv -f stdin.html fftw-faq.html + +faq: $(FAQ) + +clean-local: + rm -f *~ core a.out *.lout *.ps *.info *.ascii *.xrefdb *.post + rm -rf *.html html.refs2 + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/bfnnconv.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/bfnnconv.pl new file mode 100755 index 000000000..e1c894d29 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/bfnnconv.pl @@ -0,0 +1,298 @@ +#!/usr/bin/perl -- +# Copyright (C) 1993-1995 Ian Jackson. + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# (Note: I do not consider works produced using these BFNN processing +# tools to be derivative works of the tools, so they are NOT covered +# by the GPL. However, I would appreciate it if you credited me if +# appropriate in any documents you format using BFNN.) + +@outputs=('ascii','info','html'); + +while ($ARGV[0] =~ m/^\-/) { + $_= shift(@ARGV); + if (m/^-only/) { + @outputs= (shift(@ARGV)); + } else { + warn "unknown option `$_' ignored"; + } +} + +$prefix= $ARGV[0]; +$prefix= 'stdin' unless length($prefix); +$prefix =~ s/\.bfnn$//; + +if (open(O,"$prefix.xrefdb")) { + @xrefdb= ; + close(O); +} else { + warn "no $prefix.xrefdb ($!)"; +} + +$section= -1; +for $thisxr (@xrefdb) { + $_= $thisxr; + chop; + if (m/^Q (\w+) ((\d+)\.(\d+)) (.*)$/) { + $qrefn{$1}= $2; + $qreft{$1}= $5; + $qn2ref{$3,$4}= $1; + $maxsection= $3; + $maxquestion[$3]= $4; + } elsif (m/^S (\d+) /) { + $maxsection= $1; + $sn2title{$1}=$'; + } +} + +open(U,">$prefix.xrefdb-new"); + +for $x (@outputs) { require("m-$x.pl"); } + +&call('init'); + +while (<>) { + chop; + next if m/^\\comment\b/; + if (!m/\S/) { + &call('endpara'); + next; + } + if (s/^\\section +//) { + $line= $_; + $section++; $question=0; + print U "S $section $line\n"; + $|=1; print "S$section",' 'x10,"\r"; $|=0; + &call('endpara'); + &call('startmajorheading',"$section", + "Section $section", + $section<$maxsection ? "Section ".($section+1) : '', + $section>1 ? 'Section '.($section-1) : 'Top'); + &text($line); + &call('endmajorheading'); + if ($section) { + &call('endpara'); + &call('startindex'); + for $thisxr (@xrefdb) { + $_= $thisxr; + chop; + if (m/^Q (\w+) (\d+)\.(\d+) (.*)$/) { + $ref= $1; $num1= $2; $num2= $3; $text= $4; + next unless $num1 == $section; + &call('startindexitem',$ref,"Q$num1.$num2","Question $num1.$num2"); + &text($text); + &call('endindexitem'); + } + } + &call('endindex'); + } + } elsif (s/^\\question \d{2}[a-z]{3}((:\w+)?) +//) { + $line= $_; + $question++; + $qrefstring= $1; + $qrefstring= "q_${section}_$question" unless $qrefstring =~ s/^://; + print U "Q $qrefstring $section.$question $line\n"; + $|=1; print "Q$section.$question",' 'x10,"\r"; $|=0; + &call('endpara'); + &call('startminorheading',$qrefstring, + "Question $section.$question", + $question < $maxquestion[$section] ? "Question $section.".($question+1) : + $section < $maxsection ? "Question ".($section+1).".1" : '', + $question > 1 ? "Question $section.".($question-1) : + $section > 1 ? "Question ".($section-1).'.'.($maxquestion[$section-1]) : + 'Top', + "Section $section"); + &text("Question $section.$question. $line"); + &call('endminorheading'); + } elsif (s/^\\only +//) { + @saveoutputs= @outputs; + @outputs=(); + for $x (split(/\s+/,$_)) { + push(@outputs,$x) if grep($x eq $_, @saveoutputs); + } + } elsif (s/^\\endonly$//) { + @outputs= @saveoutputs; + } elsif (s/^\\copyto +//) { + $fh= $'; + while(<>) { + last if m/^\\endcopy$/; + while (s/^([^\`]*)\`//) { + print $fh $1; + m/([^\\])\`/ || warn "`$_'"; + $_= $'; + $cmd= $`.$1; + $it= `$cmd`; chop $it; + print $fh $it; + } + print $fh $_; + } + } elsif (m/\\index$/) { + &call('startindex'); + for $thisxr (@xrefdb) { + $_= $thisxr; + chop; + if (m/^Q (\w+) (\d+\.\d+) (.*)$/) { + $ref= $1; $num= $2; $text= $3; + &call('startindexitem',$ref,"Q$num","Question $num"); + &text($text); + &call('endindexitem'); + } elsif (m/^S (\d+) (.*)$/) { + $num= $1; $text= $2; + next unless $num; + &call('startindexmainitem',"s_$num", + "Section $num.","Section $num"); + &text($text); + &call('endindexitem'); + } else { + warn $_; + } + } + &call('endindex'); + } elsif (m/^\\call-(\w+) +(\w+)\s*(.*)$/) { + $fn= $1.'_'.$2; + eval { &$fn($3); }; + warn $@ if length($@); + } elsif (m/^\\call +(\w+)\s*(.*)$/) { + eval { &call($1,$2); }; + warn $@ if length($@); + } elsif (s/^\\set +(\w+)\s*//) { + $svalue= $'; $svari= $1; + eval("\$user_$svari=\$svalue"); $@ && warn "setting $svalue failed: $@\n"; + } elsif (m/^\\verbatim$/) { + &call('startverbatim'); + while (<>) { + chop; + last if m/^\\endverbatim$/; + &call('verbatim',$_); + } + &call('endverbatim'); + } else { + s/\.$/\. /; + &text($_." "); + } +} + +print ' 'x25,"\r"; +&call('finish'); +rename("$prefix.xrefdb-new","$prefix.xrefdb") || warn "rename xrefdb: $!"; +exit 0; + + +sub text { + local($in,$rhs,$word,$refn,$reft,$fn,$style); + $in= "$holdover$_[0]"; + $holdover= ''; + while ($in =~ m/\\/) { +#print STDERR ">$`##$'\n"; + $rhs=$'; + &call('text',$`); + $_= $rhs; + if (m/^\w+ $/) { + $holdover= "\\$&"; + $in= ''; + } elsif (s/^fn\s+([^\s\\]*\w)//) { + $in= $_; + $word= $1; + &call('courier'); + &call('text',$word); + &call('endcourier'); + } elsif (s/^tab\s+(\d+)\s+//) { + $in= $_; &call('tab',$1); + } elsif (s/^nl\s+//) { + $in= $_; &call('newline'); + } elsif (s/^qref\s+(\w+)//) { + $refn= $qrefn{$1}; + $reft= $qreft{$1}; + if (!length($refn)) { + warn "unknown question `$1'"; + } + $in= "$`\\pageref:$1:$refn:$reft\\endpageref.$_"; + } elsif (s/^pageref:(\w+):([^:\n]+)://) { + $in= $_; + &call('pageref',$1,$2); + } elsif (s/^endpageref\.//) { + $in= $_; &call('endpageref'); + } elsif (s/^(\w+)\{//) { + $in= $_; $fn= $1; + eval { &call("$fn"); }; + if (length($@)) { warn $@; $fn= 'x'; } + push(@styles,$fn); + } elsif (s/^\}//) { + $in= $_; + $fn= pop(@styles); + if ($fn ne 'x') { &call("end$fn"); } + } elsif (s/^\\//) { + $in= $_; + &call('text',"\\"); + } elsif (s,^(\w+)\s+([-A-Za-z0-9.\@:/]*\w),,) { +#print STDERR "**$&**$_\n"; + $in= $_; + $style=$1; $word= $2; + &call($style); + &call('text',$word); + &call("end$style"); + } else { + warn "unknown control `\\$_'"; + $in= $_; + } + } + &call('text',$in); +} + + +sub call { + local ($fnbase, @callargs) = @_; + local ($coutput); + for $coutput (@outputs) { + if ($fnbase eq 'text' && eval("\@${coutput}_cmds")) { +#print STDERR "special handling text (@callargs) for $coutput\n"; + $evstrg= "\$${coutput}_args[\$#${coutput}_args].=\"\@callargs\""; + eval($evstrg); + length($@) && warn "call adding for $coutput (($evstrg)): $@"; + } else { + $fntc= $coutput.'_'.$fnbase; + &$fntc(@callargs); + } + } +} + + +sub recurse { + local (@outputs) = $coutput; + local ($holdover); + &text($_[0]); +} + + +sub arg { +#print STDERR "arg($_[0]) from $coutput\n"; + $cmd= $_[0]; + eval("push(\@${coutput}_cmds,\$cmd); push(\@${coutput}_args,'')"); + length($@) && warn "arg setting up for $coutput: $@"; +} + +sub endarg { +#print STDERR "endarg($_[0]) from $coutput\n"; + $evstrg= "\$${coutput}_cmd= \$cmd= pop(\@${coutput}_cmds); ". + "\$${coutput}_arg= \$arg= pop(\@${coutput}_args); "; + eval($evstrg); + length($@) && warn "endarg extracting for $coutput (($evstrg)): $@"; +#print STDERR ">call $coutput $cmd $arg< (($evstrg))\n"; + $evstrg= "&${coutput}_do_${cmd}(\$arg)"; + eval($evstrg); + length($@) && warn "endarg running ${coutput}_do_${cmd} (($evstrg)): $@"; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.ascii b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.ascii new file mode 100644 index 000000000..9a5c2de71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.ascii @@ -0,0 +1,842 @@ + FFTW FREQUENTLY ASKED QUESTIONS WITH ANSWERS + 24 May 2018 + Matteo Frigo + Steven G. Johnson + + +This is the list of Frequently Asked Questions about FFTW, a collection of +fast C routines for computing the Discrete Fourier Transform in one or +more dimensions. + +=============================================================================== + +Index + + Section 1. Introduction and General Information + Q1.1 What is FFTW? + Q1.2 How do I obtain FFTW? + Q1.3 Is FFTW free software? + Q1.4 What is this about non-free licenses? + Q1.5 In the West? I thought MIT was in the East? + + Section 2. Installing FFTW + Q2.1 Which systems does FFTW run on? + Q2.2 Does FFTW run on Windows? + Q2.3 My compiler has trouble with FFTW. + Q2.4 FFTW does not compile on Solaris, complaining about const. + Q2.5 What's the difference between --enable-3dnow and --enable-k7? + Q2.6 What's the difference between the fma and the non-fma versions? + Q2.7 Which language is FFTW written in? + Q2.8 Can I call FFTW from Fortran? + Q2.9 Can I call FFTW from C++? + Q2.10 Why isn't FFTW written in Fortran/C++? + Q2.11 How do I compile FFTW to run in single precision? + Q2.12 --enable-k7 does not work on x86-64 + + Section 3. Using FFTW + Q3.1 Why not support the FFTW 2 interface in FFTW 3? + Q3.2 Why do FFTW 3 plans encapsulate the input/output arrays and not ju + Q3.3 FFTW seems really slow. + Q3.4 FFTW slows down after repeated calls. + Q3.5 An FFTW routine is crashing when I call it. + Q3.6 My Fortran program crashes when calling FFTW. + Q3.7 FFTW gives results different from my old FFT. + Q3.8 FFTW gives different results between runs + Q3.9 Can I save FFTW's plans? + Q3.10 Why does your inverse transform return a scaled result? + Q3.11 How can I make FFTW put the origin (zero frequency) at the center + Q3.12 How do I FFT an image/audio file in *foobar* format? + Q3.13 My program does not link (on Unix). + Q3.14 I included your header, but linking still fails. + Q3.15 My program crashes, complaining about stack space. + Q3.16 FFTW seems to have a memory leak. + Q3.17 The output of FFTW's transform is all zeros. + Q3.18 How do I call FFTW from the Microsoft language du jour? + Q3.19 Can I compute only a subset of the DFT outputs? + Q3.20 Can I use FFTW's routines for in-place and out-of-place matrix tra + + Section 4. Internals of FFTW + Q4.1 How does FFTW work? + Q4.2 Why is FFTW so fast? + + Section 5. Known bugs + Q5.1 FFTW 1.1 crashes in rfftwnd on Linux. + Q5.2 The MPI transforms in FFTW 1.2 give incorrect results/leak memory. + Q5.3 The test programs in FFTW 1.2.1 fail when I change FFTW to use sin + Q5.4 The test program in FFTW 1.2.1 fails for n > 46340. + Q5.5 The threaded code fails on Linux Redhat 5.0 + Q5.6 FFTW 2.0's rfftwnd fails for rank > 1 transforms with a final dime + Q5.7 FFTW 2.0's complex transforms give the wrong results with prime fa + Q5.8 FFTW 2.1.1's MPI test programs crash with MPICH. + Q5.9 FFTW 2.1.2's multi-threaded transforms don't work on AIX. + Q5.10 FFTW 2.1.2's complex transforms give incorrect results for large p + Q5.11 FFTW 2.1.3's multi-threaded transforms don't give any speedup on S + Q5.12 FFTW 2.1.3 crashes on AIX. + +=============================================================================== + +Section 1. Introduction and General Information + + Q1.1 What is FFTW? + Q1.2 How do I obtain FFTW? + Q1.3 Is FFTW free software? + Q1.4 What is this about non-free licenses? + Q1.5 In the West? I thought MIT was in the East? + +------------------------------------------------------------------------------- + +Question 1.1. What is FFTW? + +FFTW is a free collection of fast C routines for computing the Discrete +Fourier Transform in one or more dimensions. It includes complex, real, +symmetric, and parallel transforms, and can handle arbitrary array sizes +efficiently. FFTW is typically faster than other publically-available FFT +implementations, and is even competitive with vendor-tuned libraries. +(See our web page for extensive benchmarks.) To achieve this performance, +FFTW uses novel code-generation and runtime self-optimization techniques +(along with many other tricks). + +------------------------------------------------------------------------------- + +Question 1.2. How do I obtain FFTW? + +FFTW can be found at the FFTW web page. You can also retrieve it from +ftp.fftw.org in /pub/fftw. + +------------------------------------------------------------------------------- + +Question 1.3. Is FFTW free software? + +Starting with version 1.3, FFTW is Free Software in the technical sense +defined by the Free Software Foundation (see Categories of Free and +Non-Free Software), and is distributed under the terms of the GNU General +Public License. Previous versions of FFTW were distributed without fee +for noncommercial use, but were not technically ``free.'' + +Non-free licenses for FFTW are also available that permit different terms +of use than the GPL. + +------------------------------------------------------------------------------- + +Question 1.4. What is this about non-free licenses? + +The non-free licenses are for companies that wish to use FFTW in their +products but are unwilling to release their software under the GPL (which +would require them to release source code and allow free redistribution). +Such users can purchase an unlimited-use license from MIT. Contact us for +more details. + +We could instead have released FFTW under the LGPL, or even disallowed +non-Free usage. Suffice it to say, however, that MIT owns the copyright +to FFTW and they only let us GPL it because we convinced them that it +would neither affect their licensing revenue nor irritate existing +licensees. + +------------------------------------------------------------------------------- + +Question 1.5. In the West? I thought MIT was in the East? + +Not to an Italian. You could say that we're a Spaghetti Western (with +apologies to Sergio Leone). + +=============================================================================== + +Section 2. Installing FFTW + + Q2.1 Which systems does FFTW run on? + Q2.2 Does FFTW run on Windows? + Q2.3 My compiler has trouble with FFTW. + Q2.4 FFTW does not compile on Solaris, complaining about const. + Q2.5 What's the difference between --enable-3dnow and --enable-k7? + Q2.6 What's the difference between the fma and the non-fma versions? + Q2.7 Which language is FFTW written in? + Q2.8 Can I call FFTW from Fortran? + Q2.9 Can I call FFTW from C++? + Q2.10 Why isn't FFTW written in Fortran/C++? + Q2.11 How do I compile FFTW to run in single precision? + Q2.12 --enable-k7 does not work on x86-64 + +------------------------------------------------------------------------------- + +Question 2.1. Which systems does FFTW run on? + +FFTW is written in ANSI C, and should work on any system with a decent C +compiler. (See also Q2.2 `Does FFTW run on Windows?', Q2.3 `My compiler +has trouble with FFTW.'.) FFTW can also take advantage of certain +hardware-specific features, such as cycle counters and SIMD instructions, +but this is optional. + +------------------------------------------------------------------------------- + +Question 2.2. Does FFTW run on Windows? + +Yes, many people have reported successfully using FFTW on Windows with +various compilers. FFTW was not developed on Windows, but the source code +is essentially straight ANSI C. See also the FFTW Windows installation +notes, Q2.3 `My compiler has trouble with FFTW.', and Q3.18 `How do I call +FFTW from the Microsoft language du jour?'. + +------------------------------------------------------------------------------- + +Question 2.3. My compiler has trouble with FFTW. + +Complain fiercely to the vendor of the compiler. + +We have successfully used gcc 3.2.x on x86 and PPC, a recent Compaq C +compiler for Alpha, version 6 of IBM's xlc compiler for AIX, Intel's icc +versions 5-7, and Sun WorkShop cc version 6. + +FFTW is likely to push compilers to their limits, however, and several +compiler bugs have been exposed by FFTW. A partial list follows. + +gcc 2.95.x for Solaris/SPARC produces incorrect code for the test program +(workaround: recompile the libbench2 directory with -O2). + +NetBSD/macppc 1.6 comes with a gcc version that also miscompiles the test +program. (Please report a workaround if you know one.) + +gcc 3.2.3 for ARM reportedly crashes during compilation. This bug is +reportedly fixed in later versions of gcc. + +Versions 8.0 and 8.1 of Intel's icc falsely claim to be gcc, so you should +specify CC="icc -no-gcc"; this is automatic in FFTW 3.1. icc-8.0.066 +reportely produces incorrect code for FFTW 2.1.5, but is fixed in version +8.1. icc-7.1 compiler build 20030402Z appears to produce incorrect +dependencies, causing the compilation to fail. icc-7.1 build 20030307Z +appears to work fine. (Use icc -V to check which build you have.) As of +2003/04/18, build 20030402Z appears not to be available any longer on +Intel's website, whereas the older build 20030307Z is available. + +ranlib of GNU binutils 2.9.1 on Irix has been observed to corrupt the FFTW +libraries, causing a link failure when FFTW is compiled. Since ranlib is +completely superfluous on Irix, we suggest deleting it from your system +and replacing it with a symbolic link to /bin/echo. + +If support for SIMD instructions is enabled in FFTW, further compiler +problems may appear: + +gcc 3.4.[0123] for x86 produces incorrect SSE2 code for FFTW when -O2 (the +best choice for FFTW) is used, causing FFTW to crash (make check crashes). +This bug is fixed in gcc 3.4.4. On x86_64 (amd64/em64t), gcc 3.4.4 +reportedly still has a similar problem, but this is fixed as of gcc 3.4.6. + +gcc-3.2 for x86 produces incorrect SIMD code if -O3 is used. The same +compiler produces incorrect SIMD code if no optimization is used, too. +When using gcc-3.2, it is a good idea not to change the default CFLAGS +selected by the configure script. + +Some 3.0.x and 3.1.x versions of gcc on x86 may crash. gcc so-called 2.96 +shipping with RedHat 7.3 crashes when compiling SIMD code. In both cases, +please upgrade to gcc-3.2 or later. + +Intel's icc 6.0 misaligns SSE constants, but FFTW has a workaround. icc +8.x fails to compile FFTW 3.0.x because it falsely claims to be gcc; we +believe this to be a bug in icc, but FFTW 3.1 has a workaround. + +Visual C++ 2003 reportedly produces incorrect code for SSE/SSE2 when +compiling FFTW. This bug was reportedly fixed in VC++ 2005; +alternatively, you could switch to the Intel compiler. VC++ 6.0 also +reportedly produces incorrect code for the file reodft11e-r2hc-odd.c +unless optimizations are disabled for that file. + +gcc 2.95 on MacOS X miscompiles AltiVec code (fixed in later versions). +gcc 3.2.x miscompiles AltiVec permutations, but FFTW has a workaround. +gcc 4.0.1 on MacOS for Intel crashes when compiling FFTW; a workaround is +to compile one file without optimization: cd kernel; make CFLAGS=" " +trig.lo. + +gcc 4.1.1 reportedly crashes when compiling FFTW for MIPS; the workaround +is to compile the file it crashes on (t2_64.c) with a lower optimization +level. + +gcc versions 4.1.2 to 4.2.0 for x86 reportedly miscompile FFTW 3.1's test +program, causing make check to crash (gcc bug #26528). The bug was +reportedly fixed in gcc version 4.2.1 and later. A workaround is to +compile libbench2/verify-lib.c without optimization. + +------------------------------------------------------------------------------- + +Question 2.4. FFTW does not compile on Solaris, complaining about const. + +We know that at least on Solaris 2.5.x with Sun's compilers 4.2 you might +get error messages from make such as + +"./fftw.h", line 88: warning: const is a keyword in ANSI C + +This is the case when the configure script reports that const does not +work: + +checking for working const... (cached) no + +You should be aware that Solaris comes with two compilers, namely, +/opt/SUNWspro/SC4.2/bin/cc and /usr/ucb/cc. The latter compiler is +non-ANSI. Indeed, it is a perverse shell script that calls the real +compiler in non-ANSI mode. In order to compile FFTW, change your path so +that the right cc is used. + +To know whether your compiler is the right one, type cc -V. If the +compiler prints ``ucbcc'', as in + +ucbcc: WorkShop Compilers 4.2 30 Oct 1996 C 4.2 + +then the compiler is wrong. The right message is something like + +cc: WorkShop Compilers 4.2 30 Oct 1996 C 4.2 + +------------------------------------------------------------------------------- + +Question 2.5. What's the difference between --enable-3dnow and --enable-k7? + +--enable-k7 enables 3DNow! instructions on K7 processors (AMD Athlon and +its variants). K7 support is provided by assembly routines generated by a +special purpose compiler. As of fftw-3.2, --enable-k7 is no longer +supported. + +--enable-3dnow enables generic 3DNow! support using gcc builtin functions. +This works on earlier AMD processors, but it is not as fast as our special +assembly routines. As of fftw-3.1, --enable-3dnow is no longer supported. + +------------------------------------------------------------------------------- + +Question 2.6. What's the difference between the fma and the non-fma versions? + +The fma version tries to exploit the fused multiply-add instructions +implemented in many processors such as PowerPC, ia-64, and MIPS. The two +FFTW packages are otherwise identical. In FFTW 3.1, the fma and non-fma +versions were merged together into a single package, and the configure +script attempts to automatically guess which version to use. + +The FFTW 3.1 configure script enables fma by default on PowerPC, Itanium, +and PA-RISC, and disables it otherwise. You can force one or the other by +using the --enable-fma or --disable-fma flag for configure. + +Definitely use fma if you have a PowerPC-based system with gcc (or IBM +xlc). This includes all GNU/Linux systems for PowerPC and the older +PowerPC-based MacOS systems. Also use it on PA-RISC and Itanium with the +HP/UX compiler. + +Definitely do not use the fma version if you have an ia-32 processor +(Intel, AMD, MacOS on Intel, etcetera). + +For other architectures/compilers, the situation is not so clear. For +example, ia-64 has the fma instruction, but gcc-3.2 appears not to exploit +it correctly. Other compilers may do the right thing, but we have not +tried them. Please send us your feedback so that we can update this FAQ +entry. + +------------------------------------------------------------------------------- + +Question 2.7. Which language is FFTW written in? + +FFTW is written in ANSI C. Most of the code, however, was automatically +generated by a program called genfft, written in the Objective Caml +dialect of ML. You do not need to know ML or to have an Objective Caml +compiler in order to use FFTW. + +genfft is provided with the FFTW sources, which means that you can play +with the code generator if you want. In this case, you need a working +Objective Caml system. Objective Caml is available from the Caml web +page. + +------------------------------------------------------------------------------- + +Question 2.8. Can I call FFTW from Fortran? + +Yes, FFTW (versions 1.3 and higher) contains a Fortran-callable interface, +documented in the FFTW manual. + +By default, FFTW configures its Fortran interface to work with the first +compiler it finds, e.g. g77. To configure for a different, incompatible +Fortran compiler foobar, use ./configure F77=foobar when installing FFTW. +(In the case of g77, however, FFTW 3.x also includes an extra set of +Fortran-callable routines with one less underscore at the end of +identifiers, which should cover most other Fortran compilers on Linux at +least.) + +------------------------------------------------------------------------------- + +Question 2.9. Can I call FFTW from C++? + +Most definitely. FFTW should compile and/or link under any C++ compiler. +Moreover, it is likely that the C++ template class is +bit-compatible with FFTW's complex-number format (see the FFTW manual for +more details). + +------------------------------------------------------------------------------- + +Question 2.10. Why isn't FFTW written in Fortran/C++? + +Because we don't like those languages, and neither approaches the +portability of C. + +------------------------------------------------------------------------------- + +Question 2.11. How do I compile FFTW to run in single precision? + +On a Unix system: configure --enable-float. On a non-Unix system: edit +config.h to #define the symbol FFTW_SINGLE (for FFTW 3.x). In both cases, +you must then recompile FFTW. In FFTW 3, all FFTW identifiers will then +begin with fftwf_ instead of fftw_. + +------------------------------------------------------------------------------- + +Question 2.12. --enable-k7 does not work on x86-64 + +Support for --enable-k7 was discontinued in fftw-3.2. + +The fftw-3.1 release supports --enable-k7. This option only works on +32-bit x86 machines that implement 3DNow!, including the AMD Athlon and +the AMD Opteron in 32-bit mode. --enable-k7 does not work on AMD Opteron +in 64-bit mode. Use --enable-sse for x86-64 machines. + +FFTW supports 3DNow! by means of assembly code generated by a +special-purpose compiler. It is hard to produce assembly code that works +in both 32-bit and 64-bit mode. + +=============================================================================== + +Section 3. Using FFTW + + Q3.1 Why not support the FFTW 2 interface in FFTW 3? + Q3.2 Why do FFTW 3 plans encapsulate the input/output arrays and not ju + Q3.3 FFTW seems really slow. + Q3.4 FFTW slows down after repeated calls. + Q3.5 An FFTW routine is crashing when I call it. + Q3.6 My Fortran program crashes when calling FFTW. + Q3.7 FFTW gives results different from my old FFT. + Q3.8 FFTW gives different results between runs + Q3.9 Can I save FFTW's plans? + Q3.10 Why does your inverse transform return a scaled result? + Q3.11 How can I make FFTW put the origin (zero frequency) at the center + Q3.12 How do I FFT an image/audio file in *foobar* format? + Q3.13 My program does not link (on Unix). + Q3.14 I included your header, but linking still fails. + Q3.15 My program crashes, complaining about stack space. + Q3.16 FFTW seems to have a memory leak. + Q3.17 The output of FFTW's transform is all zeros. + Q3.18 How do I call FFTW from the Microsoft language du jour? + Q3.19 Can I compute only a subset of the DFT outputs? + Q3.20 Can I use FFTW's routines for in-place and out-of-place matrix tra + +------------------------------------------------------------------------------- + +Question 3.1. Why not support the FFTW 2 interface in FFTW 3? + +FFTW 3 has semantics incompatible with earlier versions: its plans can +only be used for a given stride, multiplicity, and other characteristics +of the input and output arrays; these stronger semantics are necessary for +performance reasons. Thus, it is impossible to efficiently emulate the +older interface (whose plans can be used for any transform of the same +size). We believe that it should be possible to upgrade most programs +without any difficulty, however. + +------------------------------------------------------------------------------- + +Question 3.2. Why do FFTW 3 plans encapsulate the input/output arrays and not just the algorithm? + +There are several reasons: + +* It was important for performance reasons that the plan be specific to + array characteristics like the stride (and alignment, for SIMD), and + requiring that the user maintain these invariants is error prone. +* In most high-performance applications, as far as we can tell, you are + usually transforming the same array over and over, so FFTW's semantics + should not be a burden. +* If you need to transform another array of the same size, creating a new + plan once the first exists is a cheap operation. +* If you need to transform many arrays of the same size at once, you + should really use the plan_many routines in FFTW's "advanced" interface. +* If the abovementioned array characteristics are the same, you are + willing to pay close attention to the documentation, and you really need + to, we provide a "new-array execution" interface to apply a plan to a + new array. + +------------------------------------------------------------------------------- + +Question 3.3. FFTW seems really slow. + +You are probably recreating the plan before every transform, rather than +creating it once and reusing it for all transforms of the same size. FFTW +is designed to be used in the following way: + +* First, you create a plan. This will take several seconds. +* Then, you reuse the plan many times to perform FFTs. These are fast. + +If you don't need to compute many transforms and the time for the planner +is significant, you have two options. First, you can use the +FFTW_ESTIMATE option in the planner, which uses heuristics instead of +runtime measurements and produces a good plan in a short time. Second, +you can use the wisdom feature to precompute the plan; see Q3.9 `Can I +save FFTW's plans?' + +------------------------------------------------------------------------------- + +Question 3.4. FFTW slows down after repeated calls. + +Probably, NaNs or similar are creeping into your data, and the slowdown is +due to the resulting floating-point exceptions. For example, be aware +that repeatedly FFTing the same array is a diverging process (because FFTW +computes the unnormalized transform). + +------------------------------------------------------------------------------- + +Question 3.5. An FFTW routine is crashing when I call it. + +Did the FFTW test programs pass (make check, or cd tests; make bigcheck if +you want to be paranoid)? If so, you almost certainly have a bug in your +own code. For example, you could be passing invalid arguments (such as +wrongly-sized arrays) to FFTW, or you could simply have memory corruption +elsewhere in your program that causes random crashes later on. Please +don't complain to us unless you can come up with a minimal self-contained +program (preferably under 30 lines) that illustrates the problem. + +------------------------------------------------------------------------------- + +Question 3.6. My Fortran program crashes when calling FFTW. + +As described in the manual, on 64-bit machines you must store the plans in +variables large enough to hold a pointer, for example integer*8. We +recommend using integer*8 on 32-bit machines as well, to simplify porting. + +------------------------------------------------------------------------------- + +Question 3.7. FFTW gives results different from my old FFT. + +People follow many different conventions for the DFT, and you should be +sure to know the ones that we use (described in the FFTW manual). In +particular, you should be aware that the FFTW_FORWARD/FFTW_BACKWARD +directions correspond to signs of -1/+1 in the exponent of the DFT +definition. (*Numerical Recipes* uses the opposite convention.) + +You should also know that we compute an unnormalized transform. In +contrast, Matlab is an example of program that computes a normalized +transform. See Q3.10 `Why does your inverse transform return a scaled +result?'. + +Finally, note that floating-point arithmetic is not exact, so different +FFT algorithms will give slightly different results (on the order of the +numerical accuracy; typically a fractional difference of 1e-15 or so in +double precision). + +------------------------------------------------------------------------------- + +Question 3.8. FFTW gives different results between runs + +If you use FFTW_MEASURE or FFTW_PATIENT mode, then the algorithm FFTW +employs is not deterministic: it depends on runtime performance +measurements. This will cause the results to vary slightly from run to +run. However, the differences should be slight, on the order of the +floating-point precision, and therefore should have no practical impact on +most applications. + +If you use saved plans (wisdom) or FFTW_ESTIMATE mode, however, then the +algorithm is deterministic and the results should be identical between +runs. + +------------------------------------------------------------------------------- + +Question 3.9. Can I save FFTW's plans? + +Yes. Starting with version 1.2, FFTW provides the wisdom mechanism for +saving plans; see the FFTW manual. + +------------------------------------------------------------------------------- + +Question 3.10. Why does your inverse transform return a scaled result? + +Computing the forward transform followed by the backward transform (or +vice versa) yields the original array scaled by the size of the array. +(For multi-dimensional transforms, the size of the array is the product of +the dimensions.) We could, instead, have chosen a normalization that +would have returned the unscaled array. Or, to accomodate the many +conventions in this matter, the transform routines could have accepted a +"scale factor" parameter. We did not do this, however, for two reasons. +First, we didn't want to sacrifice performance in the common case where +the scale factor is 1. Second, in real applications the FFT is followed or +preceded by some computation on the data, into which the scale factor can +typically be absorbed at little or no cost. + +------------------------------------------------------------------------------- + +Question 3.11. How can I make FFTW put the origin (zero frequency) at the center of its output? + +For human viewing of a spectrum, it is often convenient to put the origin +in frequency space at the center of the output array, rather than in the +zero-th element (the default in FFTW). If all of the dimensions of your +array are even, you can accomplish this by simply multiplying each element +of the input array by (-1)^(i + j + ...), where i, j, etcetera are the +indices of the element. (This trick is a general property of the DFT, and +is not specific to FFTW.) + +------------------------------------------------------------------------------- + +Question 3.12. How do I FFT an image/audio file in *foobar* format? + +FFTW performs an FFT on an array of floating-point values. You can +certainly use it to compute the transform of an image or audio stream, but +you are responsible for figuring out your data format and converting it to +the form FFTW requires. + +------------------------------------------------------------------------------- + +Question 3.13. My program does not link (on Unix). + +The libraries must be listed in the correct order (-lfftw3 -lm for FFTW +3.x) and *after* your program sources/objects. (The general rule is that +if *A* uses *B*, then *A* must be listed before *B* in the link command.). + +------------------------------------------------------------------------------- + +Question 3.14. I included your header, but linking still fails. + +You're a C++ programmer, aren't you? You have to compile the FFTW library +and link it into your program, not just #include . (Yes, this is +really a FAQ.) + +------------------------------------------------------------------------------- + +Question 3.15. My program crashes, complaining about stack space. + +You cannot declare large arrays with automatic storage (e.g. via +fftw_complex array[N]); you should use fftw_malloc (or equivalent) to +allocate the arrays you want to transform if they are larger than a few +hundred elements. + +------------------------------------------------------------------------------- + +Question 3.16. FFTW seems to have a memory leak. + +After you create a plan, FFTW caches the information required to quickly +recreate the plan. (See Q3.9 `Can I save FFTW's plans?') It also +maintains a small amount of other persistent memory. You can deallocate +all of FFTW's internally allocated memory, if you wish, by calling +fftw_cleanup(), as documented in the manual. + +------------------------------------------------------------------------------- + +Question 3.17. The output of FFTW's transform is all zeros. + +You should initialize your input array *after* creating the plan, unless +you use FFTW_ESTIMATE: planning with FFTW_MEASURE or FFTW_PATIENT +overwrites the input/output arrays, as described in the manual. + +------------------------------------------------------------------------------- + +Question 3.18. How do I call FFTW from the Microsoft language du jour? + +Please *do not* ask us Windows-specific questions. We do not use Windows. +We know nothing about Visual Basic, Visual C++, or .NET. Please find the +appropriate Usenet discussion group and ask your question there. See also +Q2.2 `Does FFTW run on Windows?'. + +------------------------------------------------------------------------------- + +Question 3.19. Can I compute only a subset of the DFT outputs? + +In general, no, an FFT intrinsically computes all outputs from all inputs. +In principle, there is something called a *pruned FFT* that can do what +you want, but to compute K outputs out of N the complexity is in general +O(N log K) instead of O(N log N), thus saving only a small additive factor +in the log. (The same argument holds if you instead have only K nonzero +inputs.) + +There are some specific cases in which you can get the O(N log K) +performance benefits easily, however, by combining a few ordinary FFTs. +In particular, the case where you want the first K outputs, where K +divides N, can be handled by performing N/K transforms of size K and then +summing the outputs multiplied by appropriate phase factors. For more +details, see pruned FFTs with FFTW. + +There are also some algorithms that compute pruned transforms +*approximately*, but they are beyond the scope of this FAQ. + +------------------------------------------------------------------------------- + +Question 3.20. Can I use FFTW's routines for in-place and out-of-place matrix transposition? + +You can use the FFTW guru interface to create a rank-0 transform of vector +rank 2 where the vector strides are transposed. (A rank-0 transform is +equivalent to a 1D transform of size 1, which. just copies the input into +the output.) Specifying the same location for the input and output makes +the transpose in-place. + +For double-valued data stored in row-major format, plan creation looks +like this: + +fftw_plan plan_transpose(int rows, int cols, double *in, double *out) +{ + const unsigned flags = FFTW_ESTIMATE; /* other flags are possible */ + fftw_iodim howmany_dims[2]; + + howmany_dims[0].n = rows; + howmany_dims[0].is = cols; + howmany_dims[0].os = 1; + + howmany_dims[1].n = cols; + howmany_dims[1].is = 1; + howmany_dims[1].os = rows; + + return fftw_plan_guru_r2r(/*rank=*/ 0, /*dims=*/ NULL, + /*howmany_rank=*/ 2, howmany_dims, + in, out, /*kind=*/ NULL, flags); +} +(This entry was written by Rhys Ulerich.) + +=============================================================================== + +Section 4. Internals of FFTW + + Q4.1 How does FFTW work? + Q4.2 Why is FFTW so fast? + +------------------------------------------------------------------------------- + +Question 4.1. How does FFTW work? + +The innovation (if it can be so called) in FFTW consists in having a +variety of composable *solvers*, representing different FFT algorithms and +implementation strategies, whose combination into a particular *plan* for +a given size can be determined at runtime according to the characteristics +of your machine/compiler. This peculiar software architecture allows FFTW +to adapt itself to almost any machine. + +For more details (albeit somewhat outdated), see the paper "FFTW: An +Adaptive Software Architecture for the FFT", by M. Frigo and S. G. +Johnson, *Proc. ICASSP* 3, 1381 (1998), also available at the FFTW web +page. + +------------------------------------------------------------------------------- + +Question 4.2. Why is FFTW so fast? + +This is a complex question, and there is no simple answer. In fact, the +authors do not fully know the answer, either. In addition to many small +performance hacks throughout FFTW, there are three general reasons for +FFTW's speed. + +* FFTW uses a variety of FFT algorithms and implementation styles that + can be arbitrarily composed to adapt itself to a machine. See Q4.1 `How + does FFTW work?'. +* FFTW uses a code generator to produce highly-optimized routines for + computing small transforms. +* FFTW uses explicit divide-and-conquer to take advantage of the memory + hierarchy. + +For more details (albeit somewhat outdated), see the paper "FFTW: An +Adaptive Software Architecture for the FFT", by M. Frigo and S. G. +Johnson, *Proc. ICASSP* 3, 1381 (1998), available along with other +references at the FFTW web page. + +=============================================================================== + +Section 5. Known bugs + + Q5.1 FFTW 1.1 crashes in rfftwnd on Linux. + Q5.2 The MPI transforms in FFTW 1.2 give incorrect results/leak memory. + Q5.3 The test programs in FFTW 1.2.1 fail when I change FFTW to use sin + Q5.4 The test program in FFTW 1.2.1 fails for n > 46340. + Q5.5 The threaded code fails on Linux Redhat 5.0 + Q5.6 FFTW 2.0's rfftwnd fails for rank > 1 transforms with a final dime + Q5.7 FFTW 2.0's complex transforms give the wrong results with prime fa + Q5.8 FFTW 2.1.1's MPI test programs crash with MPICH. + Q5.9 FFTW 2.1.2's multi-threaded transforms don't work on AIX. + Q5.10 FFTW 2.1.2's complex transforms give incorrect results for large p + Q5.11 FFTW 2.1.3's multi-threaded transforms don't give any speedup on S + Q5.12 FFTW 2.1.3 crashes on AIX. + +------------------------------------------------------------------------------- + +Question 5.1. FFTW 1.1 crashes in rfftwnd on Linux. + +This bug was fixed in FFTW 1.2. There was a bug in rfftwnd causing an +incorrect amount of memory to be allocated. The bug showed up in Linux +with libc-5.3.12 (and nowhere else that we know of). + +------------------------------------------------------------------------------- + +Question 5.2. The MPI transforms in FFTW 1.2 give incorrect results/leak memory. + +These bugs were corrected in FFTW 1.2.1. The MPI transforms (really, just +the transpose routines) in FFTW 1.2 had bugs that could cause errors in +some situations. + +------------------------------------------------------------------------------- + +Question 5.3. The test programs in FFTW 1.2.1 fail when I change FFTW to use single precision. + +This bug was fixed in FFTW 1.3. (Older versions of FFTW did work in +single precision, but the test programs didn't--the error tolerances in +the tests were set for double precision.) + +------------------------------------------------------------------------------- + +Question 5.4. The test program in FFTW 1.2.1 fails for n > 46340. + +This bug was fixed in FFTW 1.3. FFTW 1.2.1 produced the right answer, but +the test program was wrong. For large n, n*n in the naive transform that +we used for comparison overflows 32 bit integer precision, breaking the +test. + +------------------------------------------------------------------------------- + +Question 5.5. The threaded code fails on Linux Redhat 5.0 + +We had problems with glibc-2.0.5. The code should work with glibc-2.0.7. + +------------------------------------------------------------------------------- + +Question 5.6. FFTW 2.0's rfftwnd fails for rank > 1 transforms with a final dimension >= 65536. + +This bug was fixed in FFTW 2.0.1. (There was a 32-bit integer overflow +due to a poorly-parenthesized expression.) + +------------------------------------------------------------------------------- + +Question 5.7. FFTW 2.0's complex transforms give the wrong results with prime factors 17 to 97. + +There was a bug in the complex transforms that could cause incorrect +results under (hopefully rare) circumstances for lengths with +intermediate-size prime factors (17-97). This bug was fixed in FFTW +2.1.1. + +------------------------------------------------------------------------------- + +Question 5.8. FFTW 2.1.1's MPI test programs crash with MPICH. + +This bug was fixed in FFTW 2.1.2. The 2.1/2.1.1 MPI test programs crashed +when using the MPICH implementation of MPI with the ch_p4 device (TCP/IP); +the transforms themselves worked fine. + +------------------------------------------------------------------------------- + +Question 5.9. FFTW 2.1.2's multi-threaded transforms don't work on AIX. + +This bug was fixed in FFTW 2.1.3. The multi-threaded transforms in +previous versions didn't work with AIX's pthreads implementation, which +idiosyncratically creates threads in detached (non-joinable) mode by +default. + +------------------------------------------------------------------------------- + +Question 5.10. FFTW 2.1.2's complex transforms give incorrect results for large prime sizes. + +This bug was fixed in FFTW 2.1.3. FFTW's complex-transform algorithm for +prime sizes (in versions 2.0 to 2.1.2) had an integer overflow problem +that caused incorrect results for many primes greater than 32768 (on +32-bit machines). (Sizes without large prime factors are not affected.) + +------------------------------------------------------------------------------- + +Question 5.11. FFTW 2.1.3's multi-threaded transforms don't give any speedup on Solaris. + +This bug was fixed in FFTW 2.1.4. (By default, Solaris creates threads +that do not parallelize over multiple processors, so one has to request +the proper behavior specifically.) + +------------------------------------------------------------------------------- + +Question 5.12. FFTW 2.1.3 crashes on AIX. + +The FFTW 2.1.3 configure script picked incorrect compiler flags for the +xlc compiler on newer IBM processors. This is fixed in FFTW 2.1.4. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.bfnn b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.bfnn new file mode 100644 index 000000000..2af150244 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.bfnn @@ -0,0 +1,708 @@ +\comment This is the source for the FFTW FAQ list, in +\comment the Bizarre Format With No Name. It is turned into Lout +\comment input, HTML, plain ASCII and an Info document by a Perl script. +\comment +\comment The format and scripts come from the Linux FAQ, by +\comment Ian Jackson. +\set brieftitle FFTW FAQ +\set author Matteo Frigo and Steven G. Johnson / fftw@fftw.org +\set authormail fftw@fftw.org +\set title FFTW Frequently Asked Questions with Answers +\set copyholder Matteo Frigo and Massachusetts Institute of Technology +\call-html startup html.refs2 +\copyto ASCII + FFTW FREQUENTLY ASKED QUESTIONS WITH ANSWERS + `date '+%d %h %Y'` + Matteo Frigo + Steven G. Johnson + + +\endcopy +\copyto INFO +INFO-DIR-SECTION Development +START-INFO-DIR-ENTRY +* FFTW FAQ: (fftw-faq). FFTW Frequently Asked Questions with Answers. +END-INFO-DIR-ENTRY + + +File: $prefix.info, Node: Top, Next: Question 1.1, Up: (dir) + + FFTW FREQUENTLY ASKED QUESTIONS WITH ANSWERS + `date '+%d %h %Y'` + Matteo Frigo + Steven G. Johnson + + +\endcopy + +This is the list of Frequently Asked Questions about FFTW, a +collection of fast C routines for computing the Discrete Fourier +Transform in one or more dimensions. + +\section Index + +\index + +\comment ###################################################################### + +\section Introduction and General Information + +\question 26aug:whatisfftw What is FFTW? + +FFTW is a free collection of fast C routines for computing the +Discrete Fourier Transform in one or more dimensions. It includes +complex, real, symmetric, and parallel transforms, and can handle +arbitrary array sizes efficiently. FFTW is typically faster than +other publically-available FFT implementations, and is even +competitive with vendor-tuned libraries. (See our web page for +extensive benchmarks.) To achieve this performance, FFTW uses novel +code-generation and runtime self-optimization techniques (along with +many other tricks). + +\question 26aug:whereisfftw How do I obtain FFTW? + +FFTW can be found at \docref{the FFTW web page\}. You can also +retrieve it from \ftpon ftp.fftw.org in \ftpin /pub/fftw. + +\question 26aug:isfftwfree Is FFTW free software? + +Starting with version 1.3, FFTW is Free Software in the technical +sense defined by the Free Software Foundation (see \docref{Categories +of Free and Non-Free Software\}), and is distributed under the terms +of the GNU General Public License. Previous versions of FFTW were +distributed without fee for noncommercial use, but were not +technically ``free.'' + +Non-free licenses for FFTW are also available that permit different +terms of use than the GPL. + +\question 10apr:nonfree What is this about non-free licenses? + +The non-free licenses are for companies that wish to use FFTW in their +products but are unwilling to release their software under the GPL +(which would require them to release source code and allow free +redistribution). Such users can purchase an unlimited-use license +from MIT. Contact us for more details. + +We could instead have released FFTW under the LGPL, or even disallowed +non-Free usage. Suffice it to say, however, that MIT owns the +copyright to FFTW and they only let us GPL it because we convinced +them that it would neither affect their licensing revenue nor irritate +existing licensees. + +\question 24oct:west In the West? I thought MIT was in the East? + +Not to an Italian. You could say that we're a Spaghetti Western +(with apologies to Sergio Leone). + +\comment ###################################################################### + +\section Installing FFTW + +\question 26aug:systems Which systems does FFTW run on? + +FFTW is written in ANSI C, and should work on any system with a decent +C compiler. (See also \qref runOnWindows, \qref compilerCrashes.) +FFTW can also take advantage of certain hardware-specific features, +such as cycle counters and SIMD instructions, but this is optional. + +\question 26aug:runOnWindows Does FFTW run on Windows? + +Yes, many people have reported successfully using FFTW on Windows with +various compilers. FFTW was not developed on Windows, but the source +code is essentially straight ANSI C. See also the \docref{FFTW +Windows installation notes\}, \qref compilerCrashes, and \qref +vbetalia. + +\question 26aug:compilerCrashes My compiler has trouble with FFTW. + +Complain fiercely to the vendor of the compiler. + +We have successfully used \courier{gcc\} 3.2.x on x86 and PPC, a +recent Compaq C compiler for Alpha, version 6 of IBM's \courier{xlc\} +compiler for AIX, Intel's \courier{icc\} versions 5-7, and Sun +WorkShop \courier{cc\} version 6. + +FFTW is likely to push compilers to their limits, however, and several +compiler bugs have been exposed by FFTW. A partial list follows. + +\courier{gcc\} 2.95.x for Solaris/SPARC produces incorrect code for +the test program (workaround: recompile the \courier{libbench2\} +directory with \courier{-O2\}). + +NetBSD/macppc 1.6 comes with a \courier{gcc\} version that also +miscompiles the test program. (Please report a workaround if you know +one.) + +\courier{gcc\} 3.2.3 for ARM reportedly crashes during compilation. +This bug is reportedly fixed in later versions of \courier{gcc\}. + +Versions 8.0 and 8.1 of Intel's \courier{icc\} falsely claim to be +\courier{gcc\}, so you should specify \courier{CC="icc -no-gcc"\}; +this is automatic in FFTW 3.1. \courier{icc-8.0.066\} reportely +produces incorrect code for FFTW 2.1.5, but is fixed in version 8.1. +\courier{icc-7.1\} compiler build 20030402Z appears to produce +incorrect dependencies, causing the compilation to fail. +\courier{icc-7.1\} build 20030307Z appears to work fine. (Use +\courier{icc -V\} to check which build you have.) As of 2003/04/18, +build 20030402Z appears not to be available any longer on Intel's +website, whereas the older build 20030307Z is available. + +\courier{ranlib\} of GNU \courier{binutils\} 2.9.1 on Irix has been +observed to corrupt the FFTW libraries, causing a link failure when +FFTW is compiled. Since \courier{ranlib\} is completely superfluous +on Irix, we suggest deleting it from your system and replacing it with +a symbolic link to \courier{/bin/echo\}. + +If support for SIMD instructions is enabled in FFTW, further compiler +problems may appear: + +\courier{gcc\} 3.4.[0123] for x86 produces incorrect SSE2 code for +FFTW when \courier{-O2\} (the best choice for FFTW) is used, causing +FFTW to crash (\courier{make check\} crashes). This bug is fixed in +\courier{gcc\} 3.4.4. On x86_64 (amd64/em64t), \courier{gcc\} 3.4.4 +reportedly still has a similar problem, but this is fixed as of +\courier{gcc\} 3.4.6. + +\courier{gcc-3.2\} for x86 produces incorrect SIMD code if +\courier{-O3\} is used. The same compiler produces incorrect SIMD +code if no optimization is used, too. When using \courier{gcc-3.2\}, +it is a good idea not to change the default \courier{CFLAGS\} selected +by the \courier{configure\} script. + +Some 3.0.x and 3.1.x versions of \courier{gcc\} on \courier{x86\} may +crash. \courier{gcc\} so-called 2.96 shipping with RedHat 7.3 crashes +when compiling SIMD code. In both cases, please upgrade to +\courier{gcc-3.2\} or later. + +Intel's \courier{icc\} 6.0 misaligns SSE constants, but FFTW has a +workaround. \courier{icc\} 8.x fails to compile FFTW 3.0.x because it +falsely claims to be \courier{gcc\}; we believe this to be a bug in +\courier{icc\}, but FFTW 3.1 has a workaround. + +Visual C++ 2003 reportedly produces incorrect code for SSE/SSE2 when +compiling FFTW. This bug was reportedly fixed in VC++ 2005; +alternatively, you could switch to the Intel compiler. VC++ 6.0 also +reportedly produces incorrect code for the file +\courier{reodft11e-r2hc-odd.c\} unless optimizations are disabled for +that file. + +\courier{gcc\} 2.95 on MacOS X miscompiles AltiVec code (fixed in +later versions). \courier{gcc\} 3.2.x miscompiles AltiVec +permutations, but FFTW has a workaround. \courier{gcc\} 4.0.1 on +MacOS for Intel crashes when compiling FFTW; a workaround is to +compile one file without optimization: \courier{cd kernel; make +CFLAGS=" " trig.lo\}. + +\courier{gcc\} 4.1.1 reportedly crashes when compiling FFTW for MIPS; +the workaround is to compile the file it crashes on +(\courier{t2_64.c\}) with a lower optimization level. + +\courier{gcc\} versions 4.1.2 to 4.2.0 for x86 reportedly miscompile +FFTW 3.1's test program, causing \courier{make check\} to crash +(\courier{gcc\} bug #26528). The bug was reportedly fixed in +\courier{gcc\} version 4.2.1 and later. A workaround is to compile +\courier{libbench2/verify-lib.c\} without optimization. + +\question 26aug:solarisSucks FFTW does not compile on Solaris, complaining about \courier{const\}. + +We know that at least on Solaris 2.5.x with Sun's compilers 4.2 you +might get error messages from \courier{make\} such as + +\courier{"./fftw.h", line 88: warning: const is a keyword in ANSI C\} + +This is the case when the \courier{configure\} script reports that +\courier{const\} does not work: + +\courier{checking for working const... (cached) no\} + +You should be aware that Solaris comes with two compilers, namely, +\courier{/opt/SUNWspro/SC4.2/bin/cc\} and \courier{/usr/ucb/cc\}. The +latter compiler is non-ANSI. Indeed, it is a perverse shell script +that calls the real compiler in non-ANSI mode. In order +to compile FFTW, change your path so that the right \courier{cc\} +is used. + +To know whether your compiler is the right one, type +\courier{cc -V\}. If the compiler prints ``\courier{ucbcc\}'', +as in + +\courier{ucbcc: WorkShop Compilers 4.2 30 Oct 1996 C 4.2\} + +then the compiler is wrong. The right message is something like + +\courier{cc: WorkShop Compilers 4.2 30 Oct 1996 C 4.2\} + +\question 19mar:3dnow What's the difference between \courier{--enable-3dnow\} and \courier{--enable-k7\}? + +\courier{--enable-k7\} enables 3DNow! instructions on K7 processors +(AMD Athlon and its variants). K7 support is provided by assembly +routines generated by a special purpose compiler. +As of fftw-3.2, --enable-k7 is no longer supported. + +\courier{--enable-3dnow\} enables generic 3DNow! support using +\courier{gcc\} builtin functions. This works on earlier AMD +processors, but it is not as fast as our special assembly routines. +As of fftw-3.1, --enable-3dnow is no longer supported. + +\question 18apr:fma What's the difference between the fma and the non-fma versions? + +The fma version tries to exploit the fused multiply-add instructions +implemented in many processors such as PowerPC, ia-64, and MIPS. The +two FFTW packages are otherwise identical. In FFTW 3.1, the fma and +non-fma versions were merged together into a single package, and the +\courier{configure\} script attempts to automatically guess which +version to use. + +The FFTW 3.1 \courier{configure\} script enables fma by default on +PowerPC, Itanium, and PA-RISC, and disables it otherwise. You can +force one or the other by using the \courier{--enable-fma\} or +\courier{--disable-fma\} flag for \courier{configure\}. + +Definitely use fma if you have a PowerPC-based system with +\courier{gcc\} (or IBM \courier{xlc\}). This includes all GNU/Linux +systems for PowerPC and the older PowerPC-based MacOS systems. Also +use it on PA-RISC and Itanium with the HP/UX compiler. + +Definitely do not use the fma version if you have an ia-32 processor +(Intel, AMD, MacOS on Intel, etcetera). + +For other architectures/compilers, the situation is not so clear. For +example, ia-64 has the fma instruction, but \courier{gcc-3.2\} appears +not to exploit it correctly. Other compilers may do the right thing, +but we have not tried them. Please send us your feedback so that we +can update this FAQ entry. + +\question 26aug:languages Which language is FFTW written in? + +FFTW is written in ANSI C. Most of the code, however, was +automatically generated by a program called \courier{genfft\}, written +in the Objective Caml dialect of ML. You do not need to know ML or to +have an Objective Caml compiler in order to use FFTW. + +\courier{genfft\} is provided with the FFTW sources, which means that +you can play with the code generator if you want. In this case, you +need a working Objective Caml system. Objective Caml is available +from \docref{the Caml web page\}. + +\question 26aug:fortran Can I call FFTW from Fortran? + +Yes, FFTW (versions 1.3 and higher) contains a Fortran-callable +interface, documented in the FFTW manual. + +By default, FFTW configures its Fortran interface to work with the +first compiler it finds, e.g. \courier{g77\}. To configure for a +different, incompatible Fortran compiler \courier{foobar\}, use +\courier{./configure F77=foobar\} when installing FFTW. (In the case +of \courier{g77\}, however, FFTW 3.x also includes an extra set of +Fortran-callable routines with one less underscore at the end of +identifiers, which should cover most other Fortran compilers on Linux +at least.) + +\question 26aug:cplusplus Can I call FFTW from C++? + +Most definitely. FFTW should compile and/or link under any C++ +compiler. Moreover, it is likely that the C++ \courier{\} +template class is bit-compatible with FFTW's complex-number format +(see the FFTW manual for more details). + +\question 26aug:whynotfortran Why isn't FFTW written in Fortran/C++? + +Because we don't like those languages, and neither approaches the +portability of C. + +\question 29mar:singleprec How do I compile FFTW to run in single precision? + +On a Unix system: \courier{configure --enable-float\}. On a non-Unix +system: edit \courier{config.h\} to \courier{#define\} the symbol +\courier{FFTW_SINGLE\} (for FFTW 3.x). In both cases, you must then +recompile FFTW. In FFTW 3, all FFTW identifiers will then begin with +\courier{fftwf_\} instead of \courier{fftw_\}. + +\question 28mar:64bitk7 --enable-k7 does not work on x86-64 + +Support for --enable-k7 was discontinued in fftw-3.2. + +The fftw-3.1 release supports --enable-k7. This option only works on +32-bit x86 machines that implement 3DNow!, including the AMD Athlon +and the AMD Opteron in 32-bit mode. --enable-k7 does not work on AMD +Opteron in 64-bit mode. Use --enable-sse for x86-64 machines. + +FFTW supports 3DNow! by means of assembly code generated by a +special-purpose compiler. It is hard to produce assembly code that +works in both 32-bit and 64-bit mode. + +\comment ###################################################################### + +\section Using FFTW + +\question 15mar:fftw2to3 Why not support the FFTW 2 interface in FFTW 3? + +FFTW 3 has semantics incompatible with earlier versions: its plans can +only be used for a given stride, multiplicity, and other +characteristics of the input and output arrays; these stronger +semantics are necessary for performance reasons. Thus, it is +impossible to efficiently emulate the older interface (whose plans can +be used for any transform of the same size). We believe that it +should be possible to upgrade most programs without any difficulty, +however. + +\question 20mar:planperarray Why do FFTW 3 plans encapsulate the input/output arrays and not just the algorithm? + +There are several reasons: + +\call startlist +\call item +It was important for performance reasons that the plan be specific to +array characteristics like the stride (and alignment, for SIMD), and +requiring that the user maintain these invariants is error prone. +\call item +In most high-performance applications, as far as we can tell, you are +usually transforming the same array over and over, so FFTW's semantics +should not be a burden. +\call item +If you need to transform another array of the same size, creating a +new plan once the first exists is a cheap operation. +\call item +If you need to transform many arrays of the same size at once, you +should really use the \courier{plan_many\} routines in FFTW's "advanced" +interface. +\call item +If the abovementioned array characteristics are the same, you are +willing to pay close attention to the documentation, and you really +need to, we provide a "new-array execution" interface to apply a plan +to a new array. +\call endlist + +\question 25may:slow FFTW seems really slow. + +You are probably recreating the plan before every transform, rather +than creating it once and reusing it for all transforms of the same +size. FFTW is designed to be used in the following way: + +\call startlist +\call item +First, you create a plan. This will take several seconds. +\call item +Then, you reuse the plan many times to perform FFTs. These are fast. +\call endlist + +If you don't need to compute many transforms and the time for the +planner is significant, you have two options. First, you can use the +\courier{FFTW_ESTIMATE\} option in the planner, which uses heuristics +instead of runtime measurements and produces a good plan in a short +time. Second, you can use the wisdom feature to precompute the plan; +see \qref savePlans + +\question 22oct:slows FFTW slows down after repeated calls. + +Probably, NaNs or similar are creeping into your data, and the +slowdown is due to the resulting floating-point exceptions. For +example, be aware that repeatedly FFTing the same array is a diverging +process (because FFTW computes the unnormalized transform). + +\question 22oct:segfault An FFTW routine is crashing when I call it. + +Did the FFTW test programs pass (\courier{make check\}, or \courier{cd +tests; make bigcheck\} if you want to be paranoid)? If so, you almost +certainly have a bug in your own code. For example, you could be +passing invalid arguments (such as wrongly-sized arrays) to FFTW, or +you could simply have memory corruption elsewhere in your program that +causes random crashes later on. Please don't complain to us unless +you can come up with a minimal self-contained program (preferably +under 30 lines) that illustrates the problem. + +\question 22oct:fortran64 My Fortran program crashes when calling FFTW. + +As described in the manual, on 64-bit machines you must store the +plans in variables large enough to hold a pointer, for example +\courier{integer*8\}. We recommend using \courier{integer*8\} on +32-bit machines as well, to simplify porting. + +\question 24mar:conventions FFTW gives results different from my old FFT. + +People follow many different conventions for the DFT, and you should +be sure to know the ones that we use (described in the FFTW manual). +In particular, you should be aware that the +\courier{FFTW_FORWARD\}/\courier{FFTW_BACKWARD\} directions correspond +to signs of -1/+1 in the exponent of the DFT definition. +(\italic{Numerical Recipes\} uses the opposite convention.) + +You should also know that we compute an unnormalized transform. In +contrast, Matlab is an example of program that computes a normalized +transform. See \qref whyscaled. + +Finally, note that floating-point arithmetic is not exact, so +different FFT algorithms will give slightly different results (on the +order of the numerical accuracy; typically a fractional difference of +1e-15 or so in double precision). + +\question 31aug:nondeterministic FFTW gives different results between runs + +If you use \courier{FFTW_MEASURE\} or \courier{FFTW_PATIENT\} mode, +then the algorithm FFTW employs is not deterministic: it depends on +runtime performance measurements. This will cause the results to vary +slightly from run to run. However, the differences should be slight, +on the order of the floating-point precision, and therefore should +have no practical impact on most applications. + +If you use saved plans (wisdom) or \courier{FFTW_ESTIMATE\} mode, +however, then the algorithm is deterministic and the results should be +identical between runs. + +\question 26aug:savePlans Can I save FFTW's plans? + +Yes. Starting with version 1.2, FFTW provides the \courier{wisdom\} +mechanism for saving plans; see the FFTW manual. + +\question 14sep:whyscaled Why does your inverse transform return a scaled result? + +Computing the forward transform followed by the backward transform (or +vice versa) yields the original array scaled by the size of the array. +(For multi-dimensional transforms, the size of the array is the +product of the dimensions.) We could, instead, have chosen a +normalization that would have returned the unscaled array. Or, to +accomodate the many conventions in this matter, the transform routines +could have accepted a "scale factor" parameter. We did not do this, +however, for two reasons. First, we didn't want to sacrifice +performance in the common case where the scale factor is 1. Second, in +real applications the FFT is followed or preceded by some computation +on the data, into which the scale factor can typically be absorbed at +little or no cost. + +\question 02dec:centerorigin How can I make FFTW put the origin (zero frequency) at the center of its output? + +For human viewing of a spectrum, it is often convenient to put the +origin in frequency space at the center of the output array, rather +than in the zero-th element (the default in FFTW). If all of the +dimensions of your array are even, you can accomplish this by simply +multiplying each element of the input array by (-1)^(i + j + ...), +where i, j, etcetera are the indices of the element. (This trick is a +general property of the DFT, and is not specific to FFTW.) + +\question 08may:imageaudio How do I FFT an image/audio file in \italic{foobar\} format? + +FFTW performs an FFT on an array of floating-point values. You can +certainly use it to compute the transform of an image or audio stream, +but you are responsible for figuring out your data format and +converting it to the form FFTW requires. + +\question 09apr:linkfails My program does not link (on Unix). + +The libraries must be listed in the correct order (\courier{-lfftw3 +-lm\} for FFTW 3.x) and \italic{after\} your program sources/objects. +(The general rule is that if \italic{A\} uses \italic{B\}, then +\italic{A\} must be listed before \italic{B\} in the link command.). + +\question 15mar:linkheader I included your header, but linking still fails. + +You're a C++ programmer, aren't you? You have to compile the FFTW +library and link it into your program, not just \courier{#include +\}. (Yes, this is really a FAQ.) + +\question 22oct:nostack My program crashes, complaining about stack space. + +You cannot declare large arrays with automatic storage (e.g. via +\courier{fftw_complex array[N]\}); you should use +\courier{fftw_malloc\} (or equivalent) to allocate the arrays you want +to transform if they are larger than a few hundred elements. + +\question 13may:leaks FFTW seems to have a memory leak. + +After you create a plan, FFTW caches the information required to +quickly recreate the plan. (See \qref savePlans) It also maintains a +small amount of other persistent memory. You can deallocate all of +FFTW's internally allocated memory, if you wish, by calling +\courier{fftw_cleanup()\}, as documented in the manual. + +\question 16may:allzero The output of FFTW's transform is all zeros. + +You should initialize your input array \italic{after\} creating the +plan, unless you use \courier{FFTW_ESTIMATE\}: planning with +\courier{FFTW_MEASURE\} or \courier{FFTW_PATIENT\} overwrites the +input/output arrays, as described in the manual. + +\question 05sep:vbetalia How do I call FFTW from the Microsoft language du jour? + +Please \italic{do not\} ask us Windows-specific questions. We do not +use Windows. We know nothing about Visual Basic, Visual C++, or .NET. +Please find the appropriate Usenet discussion group and ask your +question there. See also \qref runOnWindows. + +\question 15oct:pruned Can I compute only a subset of the DFT outputs? + +In general, no, an FFT intrinsically computes all outputs from all +inputs. In principle, there is something called a \italic{pruned +FFT\} that can do what you want, but to compute K outputs out of N the +complexity is in general O(N log K) instead of O(N log N), thus saving +only a small additive factor in the log. (The same argument holds if +you instead have only K nonzero inputs.) + +There are some specific cases in which you can get the O(N log K) +performance benefits easily, however, by combining a few ordinary +FFTs. In particular, the case where you want the first K outputs, +where K divides N, can be handled by performing N/K transforms of size +K and then summing the outputs multiplied by appropriate phase +factors. For more details, see \docref{pruned FFTs with FFTW\}. + +There are also some algorithms that compute pruned transforms +\italic{approximately\}, but they are beyond the scope of this FAQ. + +\question 21jan:transpose Can I use FFTW's routines for in-place and out-of-place matrix transposition? + +You can use the FFTW guru interface to create a rank-0 transform of +vector rank 2 where the vector strides are transposed. (A rank-0 +transform is equivalent to a 1D transform of size 1, which. just +copies the input into the output.) Specifying the same location for +the input and output makes the transpose in-place. + +For double-valued data stored in row-major format, plan creation looks like +this: + +\verbatim +fftw_plan plan_transpose(int rows, int cols, double *in, double *out) +{ + const unsigned flags = FFTW_ESTIMATE; /* other flags are possible */ + fftw_iodim howmany_dims[2]; + + howmany_dims[0].n = rows; + howmany_dims[0].is = cols; + howmany_dims[0].os = 1; + + howmany_dims[1].n = cols; + howmany_dims[1].is = 1; + howmany_dims[1].os = rows; + + return fftw_plan_guru_r2r(/*rank=*/ 0, /*dims=*/ NULL, + /*howmany_rank=*/ 2, howmany_dims, + in, out, /*kind=*/ NULL, flags); +} +\endverbatim + +(This entry was written by Rhys Ulerich.) + +\comment ###################################################################### + +\section Internals of FFTW + +\question 26aug:howworks How does FFTW work? + +The innovation (if it can be so called) in FFTW consists in having a +variety of composable \italic{solvers\}, representing different FFT +algorithms and implementation strategies, whose combination into a +particular \italic{plan\} for a given size can be determined at +runtime according to the characteristics of your machine/compiler. +This peculiar software architecture allows FFTW to adapt itself to +almost any machine. + +For more details (albeit somewhat outdated), see the paper "FFTW: An +Adaptive Software Architecture for the FFT", by M. Frigo and +S. G. Johnson, \italic{Proc. ICASSP\} 3, 1381 (1998), also +available at \docref{the FFTW web page\}. + +\question 26aug:whyfast Why is FFTW so fast? + +This is a complex question, and there is no simple answer. In fact, +the authors do not fully know the answer, either. In addition to many +small performance hacks throughout FFTW, there are three general +reasons for FFTW's speed. + +\call startlist +\call item + FFTW uses a variety of FFT algorithms and implementation styles +that can be arbitrarily composed to adapt itself to +a machine. See \qref howworks. +\call item + FFTW uses a code generator to produce highly-optimized +routines for computing small transforms. +\call item + FFTW uses explicit divide-and-conquer to take advantage +of the memory hierarchy. +\call endlist + +For more details (albeit somewhat outdated), see the paper "FFTW: An +Adaptive Software Architecture for the FFT", by M. Frigo and +S. G. Johnson, \italic{Proc. ICASSP\} 3, 1381 (1998), +available along with other references at \docref{the FFTW web page\}. + +\comment ###################################################################### + +\section Known bugs + +\question 27aug:rfftwndbug FFTW 1.1 crashes in rfftwnd on Linux. + +This bug was fixed in FFTW 1.2. There was a bug in \courier{rfftwnd\} +causing an incorrect amount of memory to be allocated. The bug showed +up in Linux with libc-5.3.12 (and nowhere else that we know of). + +\question 15oct:fftwmpibug The MPI transforms in FFTW 1.2 give incorrect results/leak memory. + +These bugs were corrected in FFTW 1.2.1. The MPI transforms (really, +just the transpose routines) in FFTW 1.2 had bugs that could cause +errors in some situations. + +\question 05nov:testsingbug The test programs in FFTW 1.2.1 fail when I change FFTW to use single precision. + +This bug was fixed in FFTW 1.3. (Older versions of FFTW did +work in single precision, but the test programs didn't--the error +tolerances in the tests were set for double precision.) + +\question 24mar:teststoobig The test program in FFTW 1.2.1 fails for n > 46340. + +This bug was fixed in FFTW 1.3. FFTW 1.2.1 produced the right answer, +but the test program was wrong. For large n, n*n in the naive +transform that we used for comparison overflows 32 bit integer +precision, breaking the test. + +\question 24aug:linuxthreads The threaded code fails on Linux Redhat 5.0 + +We had problems with glibc-2.0.5. The code should work with +glibc-2.0.7. + +\question 26sep:bigrfftwnd FFTW 2.0's rfftwnd fails for rank > 1 transforms with a final dimension >= 65536. + +This bug was fixed in FFTW 2.0.1. (There was a 32-bit integer overflow due +to a poorly-parenthesized expression.) + +\question 26mar:primebug FFTW 2.0's complex transforms give the wrong results with prime factors 17 to 97. + +There was a bug in the complex transforms that could cause incorrect +results under (hopefully rare) circumstances for lengths with +intermediate-size prime factors (17-97). This bug was fixed in FFTW +2.1.1. + +\question 05apr:mpichbug FFTW 2.1.1's MPI test programs crash with MPICH. + +This bug was fixed in FFTW 2.1.2. The 2.1/2.1.1 MPI test programs crashed +when using the MPICH implementation of MPI with the \courier{ch_p4\} +device (TCP/IP); the transforms themselves worked fine. + +\question 25may:aixthreadbug FFTW 2.1.2's multi-threaded transforms don't work on AIX. + +This bug was fixed in FFTW 2.1.3. The multi-threaded transforms in +previous versions didn't work with AIX's \courier{pthreads\} +implementation, which idiosyncratically creates threads in detached +(non-joinable) mode by default. + +\question 27sep:bigprimebug FFTW 2.1.2's complex transforms give incorrect results for large prime sizes. + +This bug was fixed in FFTW 2.1.3. FFTW's complex-transform algorithm +for prime sizes (in versions 2.0 to 2.1.2) had an integer overflow +problem that caused incorrect results for many primes greater than +32768 (on 32-bit machines). (Sizes without large prime factors are +not affected.) + +\question 25may:solaristhreadbug FFTW 2.1.3's multi-threaded transforms don't give any speedup on Solaris. + +This bug was fixed in FFTW 2.1.4. (By default, Solaris creates +threads that do not parallelize over multiple processors, so one has +to request the proper behavior specifically.) + +\question 03may:aixflags FFTW 2.1.3 crashes on AIX. + +The FFTW 2.1.3 \courier{configure\} script picked incorrect compiler +flags for the \courier{xlc\} compiler on newer IBM processors. This +is fixed in FFTW 2.1.4. + +\comment Here it ends! + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/index.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/index.html new file mode 100644 index 000000000..cdcc1721a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/index.html @@ -0,0 +1,110 @@ + + + +FFTW Frequently Asked Questions with Answers + + + + + + + + +

+FFTW Frequently Asked Questions with Answers +

+This is the list of Frequently Asked Questions about FFTW, a +collection of fast C routines for computing the Discrete Fourier +Transform in one or more dimensions. +

+Index +

+ +
+
+Matteo Frigo and Steven G. Johnson / fftw@fftw.org +- 24 May 2018 +

+Extracted from FFTW Frequently Asked Questions with Answers, +Copyright © 2018 Matteo Frigo and Massachusetts Institute of Technology. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section1.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section1.html new file mode 100644 index 000000000..8e7576950 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section1.html @@ -0,0 +1,85 @@ + + + +FFTW FAQ - Section 1 + + + + + +

+FFTW FAQ - Section 1
+Introduction and General Information +

+ +
+ +

+Question 1.1. What is FFTW? +

+ +FFTW is a free collection of fast C routines for computing the +Discrete Fourier Transform in one or more dimensions. It includes +complex, real, symmetric, and parallel transforms, and can handle +arbitrary array sizes efficiently. FFTW is typically faster than +other publically-available FFT implementations, and is even +competitive with vendor-tuned libraries. (See our web page for +extensive benchmarks.) To achieve this performance, FFTW uses novel +code-generation and runtime self-optimization techniques (along with +many other tricks). +

+Question 1.2. How do I obtain FFTW? +

+ +FFTW can be found at the FFTW web page. You can also retrieve it from ftp.fftw.org in /pub/fftw. +

+Question 1.3. Is FFTW free software? +

+ +Starting with version 1.3, FFTW is Free Software in the technical +sense defined by the Free Software Foundation (see +Categories of Free and Non-Free Software), and is distributed under the terms of the GNU General Public License. Previous versions of FFTW were +distributed without fee for noncommercial use, but were not +technically ``free.'' +

+Non-free licenses for FFTW are also available that permit different +terms of use than the GPL. +

+Question 1.4. What is this about non-free +licenses? +

+ +The non-free licenses are for companies that wish to use FFTW in their +products but are unwilling to release their software under the GPL +(which would require them to release source code and allow free +redistribution). Such users can purchase an unlimited-use license +from MIT. Contact us for more details. + +

+We could instead have released FFTW under the LGPL, or even disallowed +non-Free usage. Suffice it to say, however, that MIT owns the +copyright to FFTW and they only let us GPL it because we convinced +them that it would neither affect their licensing revenue nor irritate +existing licensees. +

+Question 1.5. In the West? I thought MIT was in the +East? +

+ +Not to an Italian. You could say that we're a Spaghetti Western +(with apologies to Sergio Leone).
+Next: Installing FFTW.
+Return to contents.

+

+Matteo Frigo and Steven G. Johnson / fftw@fftw.org +- 24 May 2018 +

+Extracted from FFTW Frequently Asked Questions with Answers, +Copyright © 2018 Matteo Frigo and Massachusetts Institute of Technology. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section2.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section2.html new file mode 100644 index 000000000..90353e800 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section2.html @@ -0,0 +1,285 @@ + + + +FFTW FAQ - Section 2 + + + + + +

+FFTW FAQ - Section 2
+Installing FFTW +

+ +
+ +

+Question 2.1. Which systems does FFTW run +on? +

+ +FFTW is written in ANSI C, and should work on any system with a decent +C compiler. (See also Q2.2 `Does FFTW run on Windows?', Q2.3 `My compiler has trouble with FFTW.'.) FFTW can also take advantage of certain hardware-specific features, +such as cycle counters and SIMD instructions, but this is optional. + +

+Question 2.2. Does FFTW run on Windows? +

+ +Yes, many people have reported successfully using FFTW on Windows with +various compilers. FFTW was not developed on Windows, but the source +code is essentially straight ANSI C. See also the +FFTW Windows installation notes, Q2.3 `My compiler has trouble with FFTW.', and Q3.18 `How do I call FFTW from the Microsoft language du +jour?'. +

+Question 2.3. My compiler has trouble with +FFTW. +

+ +Complain fiercely to the vendor of the compiler. + +

+We have successfully used gcc 3.2.x on x86 and PPC, a recent Compaq C compiler for Alpha, version 6 of IBM's +xlc compiler for AIX, Intel's icc versions 5-7, and Sun WorkShop cc version 6. +

+FFTW is likely to push compilers to their limits, however, and several +compiler bugs have been exposed by FFTW. A partial list follows. + +

+gcc 2.95.x for Solaris/SPARC produces incorrect code for +the test program (workaround: recompile the +libbench2 directory with -O2). +

+NetBSD/macppc 1.6 comes with a gcc version that also miscompiles the test program. (Please report a workaround if you know +one.) +

+gcc 3.2.3 for ARM reportedly crashes during compilation. +This bug is reportedly fixed in later versions of +gcc. +

+Versions 8.0 and 8.1 of Intel's icc falsely claim to be gcc, so you should specify CC="icc -no-gcc"; this is automatic in FFTW 3.1. icc-8.0.066 reportely produces incorrect code for FFTW 2.1.5, but is fixed in version 8.1. +icc-7.1 compiler build 20030402Z appears to produce +incorrect dependencies, causing the compilation to fail. +icc-7.1 build 20030307Z appears to work fine. (Use +icc -V to check which build you have.) As of 2003/04/18, +build 20030402Z appears not to be available any longer on Intel's +website, whereas the older build 20030307Z is available. + +

+ranlib of GNU binutils 2.9.1 on Irix has been observed to corrupt the FFTW libraries, causing a link failure when +FFTW is compiled. Since ranlib is completely superfluous on Irix, we suggest deleting it from your system and replacing it with +a symbolic link to /bin/echo. +

+If support for SIMD instructions is enabled in FFTW, further compiler +problems may appear: +

+gcc 3.4.[0123] for x86 produces incorrect SSE2 code for +FFTW when -O2 (the best choice for FFTW) is used, causing +FFTW to crash (make check crashes). This bug is fixed in gcc 3.4.4. On x86_64 (amd64/em64t), gcc 3.4.4 reportedly still has a similar problem, but this is fixed as of +gcc 3.4.6. +

+gcc-3.2 for x86 produces incorrect SIMD code if +-O3 is used. The same compiler produces incorrect SIMD +code if no optimization is used, too. When using +gcc-3.2, it is a good idea not to change the default +CFLAGS selected by the configure script. +

+Some 3.0.x and 3.1.x versions of gcc on x86 may crash. gcc so-called 2.96 shipping with RedHat 7.3 crashes +when compiling SIMD code. In both cases, please upgrade to +gcc-3.2 or later. +

+Intel's icc 6.0 misaligns SSE constants, but FFTW has a +workaround. icc 8.x fails to compile FFTW 3.0.x because it +falsely claims to be gcc; we believe this to be a bug in icc, but FFTW 3.1 has a workaround. +

+Visual C++ 2003 reportedly produces incorrect code for SSE/SSE2 when +compiling FFTW. This bug was reportedly fixed in VC++ 2005; +alternatively, you could switch to the Intel compiler. VC++ 6.0 also +reportedly produces incorrect code for the file +reodft11e-r2hc-odd.c unless optimizations are disabled for that file. +

+gcc 2.95 on MacOS X miscompiles AltiVec code (fixed in +later versions). gcc 3.2.x miscompiles AltiVec permutations, but FFTW has a workaround. +gcc 4.0.1 on MacOS for Intel crashes when compiling FFTW; a workaround is to +compile one file without optimization: cd kernel; make CFLAGS=" " trig.lo. +

+gcc 4.1.1 reportedly crashes when compiling FFTW for MIPS; +the workaround is to compile the file it crashes on +(t2_64.c) with a lower optimization level. +

+gcc versions 4.1.2 to 4.2.0 for x86 reportedly miscompile +FFTW 3.1's test program, causing make check to crash (gcc bug #26528). The bug was reportedly fixed in +gcc version 4.2.1 and later. A workaround is to compile +libbench2/verify-lib.c without optimization. +

+Question 2.4. FFTW does not compile on Solaris, complaining about +const. +

+ +We know that at least on Solaris 2.5.x with Sun's compilers 4.2 you +might get error messages from make such as +

+"./fftw.h", line 88: warning: const is a keyword in ANSI +C +

+This is the case when the configure script reports that const does not work: +

+checking for working const... (cached) no +

+You should be aware that Solaris comes with two compilers, namely, +/opt/SUNWspro/SC4.2/bin/cc and /usr/ucb/cc. The latter compiler is non-ANSI. Indeed, it is a perverse shell script +that calls the real compiler in non-ANSI mode. In order +to compile FFTW, change your path so that the right +cc is used. +

+To know whether your compiler is the right one, type +cc -V. If the compiler prints ``ucbcc'', as in +

+ucbcc: WorkShop Compilers 4.2 30 Oct 1996 C +4.2 +

+then the compiler is wrong. The right message is something like + +

+cc: WorkShop Compilers 4.2 30 Oct 1996 C +4.2 +

+Question 2.5. What's the difference between +--enable-3dnow and --enable-k7? +

+ +--enable-k7 enables 3DNow! instructions on K7 processors +(AMD Athlon and its variants). K7 support is provided by assembly +routines generated by a special purpose compiler. +As of fftw-3.2, --enable-k7 is no longer supported. + +

+--enable-3dnow enables generic 3DNow! support using gcc builtin functions. This works on earlier AMD +processors, but it is not as fast as our special assembly routines. +As of fftw-3.1, --enable-3dnow is no longer supported. + +

+Question 2.6. What's the difference between the fma and the non-fma +versions? +

+ +The fma version tries to exploit the fused multiply-add instructions +implemented in many processors such as PowerPC, ia-64, and MIPS. The +two FFTW packages are otherwise identical. In FFTW 3.1, the fma and +non-fma versions were merged together into a single package, and the +configure script attempts to automatically guess which +version to use. +

+The FFTW 3.1 configure script enables fma by default on PowerPC, Itanium, and PA-RISC, and disables it otherwise. You can +force one or the other by using the --enable-fma or --disable-fma flag for configure. +

+Definitely use fma if you have a PowerPC-based system with +gcc (or IBM xlc). This includes all GNU/Linux systems for PowerPC and the older PowerPC-based MacOS systems. Also +use it on PA-RISC and Itanium with the HP/UX compiler. + +

+Definitely do not use the fma version if you have an ia-32 processor +(Intel, AMD, MacOS on Intel, etcetera). + +

+For other architectures/compilers, the situation is not so clear. For +example, ia-64 has the fma instruction, but +gcc-3.2 appears not to exploit it correctly. Other compilers may do the right thing, +but we have not tried them. Please send us your feedback so that we +can update this FAQ entry. +

+Question 2.7. Which language is FFTW written +in? +

+ +FFTW is written in ANSI C. Most of the code, however, was +automatically generated by a program called +genfft, written in the Objective Caml dialect of ML. You do not need to know ML or to +have an Objective Caml compiler in order to use FFTW. + +

+genfft is provided with the FFTW sources, which means that +you can play with the code generator if you want. In this case, you +need a working Objective Caml system. Objective Caml is available +from the Caml web page. +

+Question 2.8. Can I call FFTW from Fortran? +

+ +Yes, FFTW (versions 1.3 and higher) contains a Fortran-callable +interface, documented in the FFTW manual. + +

+By default, FFTW configures its Fortran interface to work with the +first compiler it finds, e.g. g77. To configure for a different, incompatible Fortran compiler +foobar, use ./configure F77=foobar when installing FFTW. (In the case of g77, however, FFTW 3.x also includes an extra set of +Fortran-callable routines with one less underscore at the end of +identifiers, which should cover most other Fortran compilers on Linux +at least.) +

+Question 2.9. Can I call FFTW from C++? +

+ +Most definitely. FFTW should compile and/or link under any C++ +compiler. Moreover, it is likely that the C++ +<complex> template class is bit-compatible with FFTW's complex-number format +(see the FFTW manual for more details). + +

+Question 2.10. Why isn't FFTW written in +Fortran/C++? +

+ +Because we don't like those languages, and neither approaches the +portability of C. +

+Question 2.11. How do I compile FFTW to run in single +precision? +

+ +On a Unix system: configure --enable-float. On a non-Unix system: edit config.h to #define the symbol FFTW_SINGLE (for FFTW 3.x). In both cases, you must then +recompile FFTW. In FFTW 3, all FFTW identifiers will then begin with +fftwf_ instead of fftw_. +

+Question 2.12. --enable-k7 does not work on +x86-64 +

+ +Support for --enable-k7 was discontinued in fftw-3.2. + +

+The fftw-3.1 release supports --enable-k7. This option only works on +32-bit x86 machines that implement 3DNow!, including the AMD Athlon +and the AMD Opteron in 32-bit mode. --enable-k7 does not work on AMD +Opteron in 64-bit mode. Use --enable-sse for x86-64 machines. + +

+FFTW supports 3DNow! by means of assembly code generated by a +special-purpose compiler. It is hard to produce assembly code that +works in both 32-bit and 64-bit mode.


+Next: Using FFTW.
+Back: Introduction and General Information.
+Return to contents.

+

+Matteo Frigo and Steven G. Johnson / fftw@fftw.org +- 24 May 2018 +

+Extracted from FFTW Frequently Asked Questions with Answers, +Copyright © 2018 Matteo Frigo and Massachusetts Institute of Technology. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section3.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section3.html new file mode 100644 index 000000000..3b5f139b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section3.html @@ -0,0 +1,334 @@ + + + +FFTW FAQ - Section 3 + + + + + +

+FFTW FAQ - Section 3
+Using FFTW +

+ +
+ +

+Question 3.1. Why not support the FFTW 2 interface in FFTW +3? +

+ +FFTW 3 has semantics incompatible with earlier versions: its plans can +only be used for a given stride, multiplicity, and other +characteristics of the input and output arrays; these stronger +semantics are necessary for performance reasons. Thus, it is +impossible to efficiently emulate the older interface (whose plans can +be used for any transform of the same size). We believe that it +should be possible to upgrade most programs without any difficulty, +however. +

+Question 3.2. Why do FFTW 3 plans encapsulate the input/output arrays +and not just the algorithm? +

+ +There are several reasons: +
    +
  • It was important for performance reasons that the plan be specific to +array characteristics like the stride (and alignment, for SIMD), and +requiring that the user maintain these invariants is error prone. + +
  • In most high-performance applications, as far as we can tell, you are +usually transforming the same array over and over, so FFTW's semantics +should not be a burden. +
  • If you need to transform another array of the same size, creating a +new plan once the first exists is a cheap operation. + +
  • If you need to transform many arrays of the same size at once, you +should really use the plan_many routines in FFTW's "advanced" +interface. +
  • If the abovementioned array characteristics are the same, you are +willing to pay close attention to the documentation, and you really +need to, we provide a "new-array execution" interface to +apply a plan to a new array. +
+ +

+Question 3.3. FFTW seems really slow. +

+ +You are probably recreating the plan before every transform, rather +than creating it once and reusing it for all transforms of the same +size. FFTW is designed to be used in the following way: + +
    +
  • First, you create a plan. This will take several seconds. + +
  • Then, you reuse the plan many times to perform FFTs. These are fast. + +
+If you don't need to compute many transforms and the time for the +planner is significant, you have two options. First, you can use the +FFTW_ESTIMATE option in the planner, which uses heuristics +instead of runtime measurements and produces a good plan in a short +time. Second, you can use the wisdom feature to precompute the plan; +see Q3.9 `Can I save FFTW's plans?' +

+Question 3.4. FFTW slows down after repeated +calls. +

+ +Probably, NaNs or similar are creeping into your data, and the +slowdown is due to the resulting floating-point exceptions. For +example, be aware that repeatedly FFTing the same array is a diverging +process (because FFTW computes the unnormalized transform). + +

+Question 3.5. An FFTW routine is crashing when I call +it. +

+ +Did the FFTW test programs pass (make check, or cd tests; make bigcheck if you want to be paranoid)? If so, you almost +certainly have a bug in your own code. For example, you could be +passing invalid arguments (such as wrongly-sized arrays) to FFTW, or +you could simply have memory corruption elsewhere in your program that +causes random crashes later on. Please don't complain to us unless +you can come up with a minimal self-contained program (preferably +under 30 lines) that illustrates the problem. + +

+Question 3.6. My Fortran program crashes when calling +FFTW. +

+ +As described in the manual, on 64-bit machines you must store the +plans in variables large enough to hold a pointer, for example +integer*8. We recommend using integer*8 on 32-bit machines as well, to simplify porting. + +

+Question 3.7. FFTW gives results different from my old +FFT. +

+ +People follow many different conventions for the DFT, and you should +be sure to know the ones that we use (described in the FFTW manual). +In particular, you should be aware that the +FFTW_FORWARD/FFTW_BACKWARD directions correspond to signs of -1/+1 in the exponent of the DFT definition. +(Numerical Recipes uses the opposite convention.) +

+You should also know that we compute an unnormalized transform. In +contrast, Matlab is an example of program that computes a normalized +transform. See Q3.10 `Why does your inverse transform return a scaled +result?'. +

+Finally, note that floating-point arithmetic is not exact, so +different FFT algorithms will give slightly different results (on the +order of the numerical accuracy; typically a fractional difference of +1e-15 or so in double precision). +

+Question 3.8. FFTW gives different results between +runs +

+ +If you use FFTW_MEASURE or FFTW_PATIENT mode, then the algorithm FFTW employs is not deterministic: it depends on +runtime performance measurements. This will cause the results to vary +slightly from run to run. However, the differences should be slight, +on the order of the floating-point precision, and therefore should +have no practical impact on most applications. + +

+If you use saved plans (wisdom) or FFTW_ESTIMATE mode, however, then the algorithm is deterministic and the results should be +identical between runs. +

+Question 3.9. Can I save FFTW's plans? +

+ +Yes. Starting with version 1.2, FFTW provides the +wisdom mechanism for saving plans; see the FFTW manual. + +

+Question 3.10. Why does your inverse transform return a scaled +result? +

+ +Computing the forward transform followed by the backward transform (or +vice versa) yields the original array scaled by the size of the array. + (For multi-dimensional transforms, the size of the array is the +product of the dimensions.) We could, instead, have chosen a +normalization that would have returned the unscaled array. Or, to +accomodate the many conventions in this matter, the transform routines +could have accepted a "scale factor" parameter. We did not +do this, however, for two reasons. First, we didn't want to sacrifice +performance in the common case where the scale factor is 1. Second, in +real applications the FFT is followed or preceded by some computation +on the data, into which the scale factor can typically be absorbed at +little or no cost. +

+Question 3.11. How can I make FFTW put the origin (zero frequency) at +the center of its output? +

+ +For human viewing of a spectrum, it is often convenient to put the +origin in frequency space at the center of the output array, rather +than in the zero-th element (the default in FFTW). If all of the +dimensions of your array are even, you can accomplish this by simply +multiplying each element of the input array by (-1)^(i + j + ...), +where i, j, etcetera are the indices of the element. (This trick is a +general property of the DFT, and is not specific to FFTW.) + +

+Question 3.12. How do I FFT an image/audio file in +foobar format? +

+ +FFTW performs an FFT on an array of floating-point values. You can +certainly use it to compute the transform of an image or audio stream, +but you are responsible for figuring out your data format and +converting it to the form FFTW requires. + +

+Question 3.13. My program does not link (on +Unix). +

+ +The libraries must be listed in the correct order +(-lfftw3 -lm for FFTW 3.x) and after your program sources/objects. (The general rule is that if A uses B, then A must be listed before B in the link command.). +

+Question 3.14. I included your header, but linking still +fails. +

+ +You're a C++ programmer, aren't you? You have to compile the FFTW +library and link it into your program, not just +#include <fftw3.h>. (Yes, this is really a FAQ.) +

+Question 3.15. My program crashes, complaining about stack +space. +

+ +You cannot declare large arrays with automatic storage (e.g. via +fftw_complex array[N]); you should use fftw_malloc (or equivalent) to allocate the arrays you want +to transform if they are larger than a few hundred elements. + +

+Question 3.16. FFTW seems to have a memory +leak. +

+ +After you create a plan, FFTW caches the information required to +quickly recreate the plan. (See Q3.9 `Can I save FFTW's plans?') It also maintains a small amount of other persistent memory. You can deallocate all of +FFTW's internally allocated memory, if you wish, by calling +fftw_cleanup(), as documented in the manual. +

+Question 3.17. The output of FFTW's transform is all +zeros. +

+ +You should initialize your input array after creating the plan, unless you use FFTW_ESTIMATE: planning with FFTW_MEASURE or FFTW_PATIENT overwrites the input/output arrays, as described in the manual. + +

+Question 3.18. How do I call FFTW from the Microsoft language du +jour? +

+ +Please do not ask us Windows-specific questions. We do not +use Windows. We know nothing about Visual Basic, Visual C++, or .NET. + Please find the appropriate Usenet discussion group and ask your +question there. See also Q2.2 `Does FFTW run on Windows?'. +

+Question 3.19. Can I compute only a subset of the DFT +outputs? +

+ +In general, no, an FFT intrinsically computes all outputs from all +inputs. In principle, there is something called a +pruned FFT that can do what you want, but to compute K outputs out of N the +complexity is in general O(N log K) instead of O(N log N), thus saving +only a small additive factor in the log. (The same argument holds if +you instead have only K nonzero inputs.) + +

+There are some specific cases in which you can get the O(N log K) +performance benefits easily, however, by combining a few ordinary +FFTs. In particular, the case where you want the first K outputs, +where K divides N, can be handled by performing N/K transforms of size +K and then summing the outputs multiplied by appropriate phase +factors. For more details, see pruned FFTs with FFTW. +

+There are also some algorithms that compute pruned transforms +approximately, but they are beyond the scope of this FAQ. + +

+Question 3.20. Can I use FFTW's routines for in-place and +out-of-place matrix transposition? +

+ +You can use the FFTW guru interface to create a rank-0 transform of +vector rank 2 where the vector strides are transposed. (A rank-0 +transform is equivalent to a 1D transform of size 1, which. just +copies the input into the output.) Specifying the same location for +the input and output makes the transpose in-place. + +

+For double-valued data stored in row-major format, plan creation looks +like this:

+fftw_plan plan_transpose(int rows, int cols, double *in, double *out)
+{
+    const unsigned flags = FFTW_ESTIMATE; /* other flags are possible */
+    fftw_iodim howmany_dims[2];
+
+    howmany_dims[0].n  = rows;
+    howmany_dims[0].is = cols;
+    howmany_dims[0].os = 1;
+
+    howmany_dims[1].n  = cols;
+    howmany_dims[1].is = 1;
+    howmany_dims[1].os = rows;
+
+    return fftw_plan_guru_r2r(/*rank=*/ 0, /*dims=*/ NULL,
+                              /*howmany_rank=*/ 2, howmany_dims,
+                              in, out, /*kind=*/ NULL, flags);
+}
+
+(This entry was written by Rhys Ulerich.) +
+Next: Internals of FFTW.
+Back: Installing FFTW.
+Return to contents.

+

+Matteo Frigo and Steven G. Johnson / fftw@fftw.org +- 24 May 2018 +

+Extracted from FFTW Frequently Asked Questions with Answers, +Copyright © 2018 Matteo Frigo and Massachusetts Institute of Technology. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section4.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section4.html new file mode 100644 index 000000000..da106a6af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section4.html @@ -0,0 +1,64 @@ + + + +FFTW FAQ - Section 4 + + + + + +

+FFTW FAQ - Section 4
+Internals of FFTW +

+ +
+ +

+Question 4.1. How does FFTW work? +

+ +The innovation (if it can be so called) in FFTW consists in having a +variety of composable solvers, representing different FFT algorithms and implementation strategies, whose combination into a +particular plan for a given size can be determined at runtime according to the characteristics of your machine/compiler. +This peculiar software architecture allows FFTW to adapt itself to +almost any machine. +

+For more details (albeit somewhat outdated), see the paper "FFTW: +An Adaptive Software Architecture for the FFT", by M. Frigo and +S. G. Johnson, Proc. ICASSP 3, 1381 (1998), also available at the FFTW web page. +

+Question 4.2. Why is FFTW so fast? +

+ +This is a complex question, and there is no simple answer. In fact, +the authors do not fully know the answer, either. In addition to many +small performance hacks throughout FFTW, there are three general +reasons for FFTW's speed. +
    +
  • FFTW uses a variety of FFT algorithms and implementation styles +that can be arbitrarily composed to adapt itself to +a machine. See Q4.1 `How does FFTW work?'. +
  • FFTW uses a code generator to produce highly-optimized +routines for computing small transforms. + +
  • FFTW uses explicit divide-and-conquer to take advantage +of the memory hierarchy. +
+For more details (albeit somewhat outdated), see the paper "FFTW: +An Adaptive Software Architecture for the FFT", by M. Frigo and +S. G. Johnson, Proc. ICASSP 3, 1381 (1998), available along with other references at +the FFTW web page.
+Next: Known bugs.
+Back: Using FFTW.
+Return to contents.

+

+Matteo Frigo and Steven G. Johnson / fftw@fftw.org +- 24 May 2018 +

+Extracted from FFTW Frequently Asked Questions with Answers, +Copyright © 2018 Matteo Frigo and Massachusetts Institute of Technology. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section5.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section5.html new file mode 100644 index 000000000..dd44ad893 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/fftw-faq.html/section5.html @@ -0,0 +1,148 @@ + + + +FFTW FAQ - Section 5 + + + + + +

+FFTW FAQ - Section 5
+Known bugs +

+ +
+ +

+Question 5.1. FFTW 1.1 crashes in rfftwnd on +Linux. +

+ +This bug was fixed in FFTW 1.2. There was a bug in +rfftwnd causing an incorrect amount of memory to be allocated. The bug showed +up in Linux with libc-5.3.12 (and nowhere else that we know of). + +

+Question 5.2. The MPI transforms in FFTW 1.2 give incorrect +results/leak memory. +

+ +These bugs were corrected in FFTW 1.2.1. The MPI transforms (really, +just the transpose routines) in FFTW 1.2 had bugs that could cause +errors in some situations. +

+Question 5.3. The test programs in FFTW 1.2.1 fail when I change FFTW +to use single precision. +

+ +This bug was fixed in FFTW 1.3. (Older versions of FFTW did +work in single precision, but the test programs didn't--the error +tolerances in the tests were set for double precision.) + +

+Question 5.4. The test program in FFTW 1.2.1 fails for n > +46340. +

+ +This bug was fixed in FFTW 1.3. FFTW 1.2.1 produced the right answer, +but the test program was wrong. For large n, n*n in the naive +transform that we used for comparison overflows 32 bit integer +precision, breaking the test. +

+Question 5.5. The threaded code fails on Linux Redhat +5.0 +

+ +We had problems with glibc-2.0.5. The code should work with +glibc-2.0.7. +

+Question 5.6. FFTW 2.0's rfftwnd fails for rank > 1 transforms +with a final dimension >= 65536. +

+ +This bug was fixed in FFTW 2.0.1. (There was a 32-bit integer +overflow due to a poorly-parenthesized expression.) +

+Question 5.7. FFTW 2.0's complex transforms give the wrong results +with prime factors 17 to 97. +

+ +There was a bug in the complex transforms that could cause incorrect +results under (hopefully rare) circumstances for lengths with +intermediate-size prime factors (17-97). This bug was fixed in FFTW +2.1.1. +

+Question 5.8. FFTW 2.1.1's MPI test programs crash with +MPICH. +

+ +This bug was fixed in FFTW 2.1.2. The 2.1/2.1.1 MPI test programs +crashed when using the MPICH implementation of MPI with the +ch_p4 device (TCP/IP); the transforms themselves worked fine. + +

+Question 5.9. FFTW 2.1.2's multi-threaded transforms don't work on +AIX. +

+ +This bug was fixed in FFTW 2.1.3. The multi-threaded transforms in +previous versions didn't work with AIX's +pthreads implementation, which idiosyncratically creates threads in detached +(non-joinable) mode by default. +

+Question 5.10. FFTW 2.1.2's complex transforms give incorrect results +for large prime sizes. +

+ +This bug was fixed in FFTW 2.1.3. FFTW's complex-transform algorithm +for prime sizes (in versions 2.0 to 2.1.2) had an integer overflow +problem that caused incorrect results for many primes greater than +32768 (on 32-bit machines). (Sizes without large prime factors are +not affected.) +

+Question 5.11. FFTW 2.1.3's multi-threaded transforms don't give any +speedup on Solaris. +

+ +This bug was fixed in FFTW 2.1.4. (By default, Solaris creates +threads that do not parallelize over multiple processors, so one has +to request the proper behavior specifically.) + +

+Question 5.12. FFTW 2.1.3 crashes on AIX. +

+ +The FFTW 2.1.3 configure script picked incorrect compiler flags for the xlc compiler on newer IBM processors. This +is fixed in FFTW 2.1.4.
+Back: Internals of FFTW.
+Return to contents.

+

+Matteo Frigo and Steven G. Johnson / fftw@fftw.org +- 24 May 2018 +

+Extracted from FFTW Frequently Asked Questions with Answers, +Copyright © 2018 Matteo Frigo and Massachusetts Institute of Technology. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/html.refs b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/html.refs new file mode 100644 index 000000000..601732dc4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/html.refs @@ -0,0 +1,7 @@ +\ References for the FFTW FAQ +\ +the FFTW web page \ http://www.fftw.org +FFTW Windows installation notes \ http://www.fftw.org/install/windows.html +Categories of Free and Non-Free Software \ http://www.gnu.org/philosophy/categories.html +the Caml web page \ http://caml.inria.fr +pruned FFTs with FFTW \ http://www.fftw.org/pruned.html diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-ascii.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-ascii.pl new file mode 100644 index 000000000..d05f8ed80 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-ascii.pl @@ -0,0 +1,189 @@ +## ASCII output +# Copyright (C) 1993-1995 Ian Jackson. + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# (Note: I do not consider works produced using these BFNN processing +# tools to be derivative works of the tools, so they are NOT covered +# by the GPL. However, I would appreciate it if you credited me if +# appropriate in any documents you format using BFNN.) + +sub ascii_init { + open(ASCII,">$prefix.ascii"); +} + +sub ascii_startmajorheading { + print ASCII '='x79,"\n\n"; + $ascii_status= 'h'; + &ascii_text($_[0] ? "Section $_[0]. " : ''); +} + +sub ascii_startminorheading { + print ASCII '-'x79,"\n\n"; + $ascii_status= 'h'; +} + +sub ascii_italic { &ascii_text('*'); } +sub ascii_enditalic { $ascii_para .= '*'; } + +sub ascii_email { &ascii_text('<'); } sub ascii_endemail { &ascii_text('>'); } + +sub ascii_ftpon { } sub ascii_endftpon { } +sub ascii_ftpin { } sub ascii_endftpin { } +sub ascii_docref { } sub ascii_enddocref { } +sub ascii_courier { } sub ascii_endcourier { } +sub ascii_newsgroup { } sub ascii_endnewsgroup { } +sub ascii_ftpsilent { $ascii_ignore++; } +sub ascii_endftpsilent { $ascii_ignore--; } + +sub ascii_text { + return if $ascii_ignore; + if ($ascii_status eq '') { + $ascii_status= 'p'; + } + $ascii_para .= $_[0]; +} + +sub ascii_tab { + local ($n) = $_[0]-length($ascii_para); + $ascii_para .= ' 'x$n if $n>0; +} + +sub ascii_newline { + return unless $ascii_status eq 'p'; + &ascii_writepara; +} + +sub ascii_writepara { + local ($thisline, $thisword, $rest); + for (;;) { + last unless $ascii_para =~ m/\S/; + $thisline= $ascii_indentstring; + for (;;) { + last unless $ascii_para =~ m/^(\s*\S+)/; + unless (length($1) + length($thisline) < 75 || + length($thisline) == length($ascii_indentstring)) { + last; + } + $thisline .= $1; + $ascii_para= $'; + } + $ascii_para =~ s/^\s*//; + print ASCII $thisline,"\n"; + $ascii_indentstring= $ascii_nextindent; + last unless length($ascii_para); + } + $ascii_status= ''; $ascii_para= ''; +} + +sub ascii_endpara { + return unless $ascii_status eq 'p'; + &ascii_writepara; + print ASCII "\n"; +} + +sub ascii_endheading { + $ascii_para =~ s/\s*$//; + print ASCII "$ascii_para\n\n"; + $ascii_status= ''; + $ascii_para= ''; +} + +sub ascii_endmajorheading { &ascii_endheading(@_); } +sub ascii_endminorheading { &ascii_endheading(@_); } + +sub ascii_startverbatim { + $ascii_vstatus= $ascii_status; + &ascii_writepara; +} + +sub ascii_verbatim { + print ASCII $_[0],"\n"; +} + +sub ascii_endverbatim { + $ascii_status= $ascii_vstatus; +} + +sub ascii_finish { + close(ASCII); +} + +sub ascii_startindex { $ascii_status= ''; } +sub ascii_endindex { $ascii_status= 'p'; } + +sub ascii_endindexitem { + printf ASCII " %-11s %-.66s\n",$ascii_left,$ascii_para; + $ascii_status= 'p'; + $ascii_para= ''; +} + +sub ascii_startindexitem { + $ascii_left= $_[1]; +} + +sub ascii_startindexmainitem { + $ascii_left= $_[1]; + print ASCII "\n" if $ascii_status eq 'p'; +} + +sub ascii_startindent { + $ascii_istatus= $ascii_status; + &ascii_writepara; + $ascii_indentstring= " $ascii_indentstring"; + $ascii_nextindent= " $ascii_nextindent"; +} + +sub ascii_endindent { + $ascii_indentstring =~ s/^ //; + $ascii_nextindent =~ s/^ //; + $ascii_status= $ascii_istatus; +} + +sub ascii_startpackedlist { $ascii_plc=0; } +sub ascii_endpackedlist { &ascii_newline if !$ascii_plc; } +sub ascii_packeditem { + &ascii_newline if !$ascii_plc; + &ascii_tab($ascii_plc*40+5); + $ascii_plc= !$ascii_plc; +} + +sub ascii_startlist { + &ascii_endpara; + $ascii_indentstring= " $ascii_indentstring"; + $ascii_nextindent= " $ascii_nextindent"; +} + +sub ascii_endlist { + &ascii_endpara; + $ascii_indentstring =~ s/^ //; + $ascii_nextindent =~ s/^ //; +} + +sub ascii_item { + &ascii_newline; + $ascii_indentstring =~ s/ $/* /; +} + +sub ascii_pageref { + &ascii_text("Q$_[1] \`"); +} + +sub ascii_endpageref { + &ascii_text("'"); +} + +1; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-html.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-html.pl new file mode 100644 index 000000000..9fd54f621 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-html.pl @@ -0,0 +1,337 @@ +## HTML output +# Copyright (C) 1993-1995 Ian Jackson. + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# (Note: I do not consider works produced using these BFNN processing +# tools to be derivative works of the tools, so they are NOT covered +# by the GPL. However, I would appreciate it if you credited me if +# appropriate in any documents you format using BFNN.) + +%saniarray= ('<','lt', '>','gt', '&','amp', '"','quot'); + +sub html_init { + $html_prefix = './'.$prefix; + $html_prefix =~ s:^\.//:/:; + system('rm','-r',"$html_prefix.html"); + system('mkdir',"$html_prefix.html"); + open(HTML,">$html_prefix.html/index.html"); + print HTML "\n"; + print HTML "\n"; + $html_needpara= -1; + $html_end=''; + chop($html_date=`date '+%d %B %Y'`); + chop($html_year=`date '+%Y'`); +} + +sub html_startup { + print HTML < +$user_title + + + + + + + + +

+$user_title +

+END + &html_readrefs($_[0]); + if (length($user_copyrightref)) { + local ($refn) = $qrefn{$user_copyrightref}; + if (!length($refn)) { + warn "unknown question (copyright) `$user_copyrightref'"; + } + $refn =~ m/(\d+)\.(\d+)/; + local ($s,$n) = ($1,$2); + $html_copyrighthref= ($s == $html_sectionn)?'':"section$s.html"; + $html_copyrighthref.= "#$qn2ref{$s,$n}"; + } +} + +sub html_close { + print HTML $html_end,"
\n$user_author\n"; + print HTML "- $html_date\n

\n"; + print HTML "Extracted from $user_title,\n"; + print HTML "" if length($html_copyrighthref); + print HTML "Copyright © $html_year $user_copyholder."; + print HTML "" if length($html_copyrighthref); + print HTML "\n\n"; + close(HTML); +} + +sub html_startmajorheading { + local ($ref, $this,$next,$back) = @_; + local ($nextt,$backt); + $this =~ s/^Section /section/; $html_sectionn= $ref; + $next =~ s/^Section /section/ && ($nextt= $sn2title{$'}); + $back =~ s/^Section /section/ ? ($backt= $sn2title{$'}) : ($back=''); + if ($html_sectionn) { + &html_close; + open(HTML,">$html_prefix.html/$this.html"); + print HTML "\n"; + print HTML "\n"; + $html_end= "
\n"; + $html_end.= "Next: $nextt.
\n" + if $next; + $html_end.= "Back: $backt.
\n" + if $back; + $html_end.= ""; + $html_end.= "Return to contents.

\n"; + print HTML < +$user_brieftitle - Section $html_sectionn + + + + +END + print HTML "" if $next; + print HTML "" if $back; + print HTML < +

+$user_brieftitle - Section $html_sectionn
+END + $html_needpara= -1; + } + else { + print HTML "\n

\n"; + $html_needpara=-1; + } +} + +sub html_endmajorheading { + print HTML "\n

\n\n"; + $html_needpara=-1; +} + +sub html_startminorheading { + local ($ref, $this) = @_; + $html_needpara=0; + $this =~ m/^Question (\d+)\.(\d+)/; + local ($s,$n) = ($1,$2); + print HTML "\n

\n"; +} + +sub html_endminorheading { + print HTML "\n

\n\n"; + $html_needpara=-1; +} + +sub html_newsgroup { &arg('newsgroup'); } +sub html_endnewsgroup { &endarg('newsgroup'); } +sub html_do_newsgroup { + print HTML "$_[0]"; +} + +sub html_email { &arg('email'); } +sub html_endemail { &endarg('email'); } +sub html_do_email { + print HTML "$_[0]"; +} + +sub html_courier { print HTML "" ; } +sub html_endcourier { print HTML ""; } +sub html_italic { print HTML "" ; } +sub html_enditalic { print HTML "" ; } + +sub html_docref { &arg('docref'); } +sub html_enddocref { &endarg('docref'); } +sub html_do_docref { + if (!defined($html_refval{$_[0]})) { + warn "undefined HTML reference $_[0]"; + $html_refval{$n}='UNDEFINED'; + } + print HTML ""; + &recurse($_[0]); + print HTML ""; +} + +sub html_readrefs { + local ($p); + open(HTMLREFS,"<$_[0]") || (warn("failed to open HTML refs $_[0]: $!"),return); + while() { + next if m/^\\\s/; + s/\s*\n$//; + if (s/^\\prefix\s*//) { + $p= $'; next; + } elsif (s/^\s*(\S.*\S)\s*\\\s*//) { + $_=$1; $v=$'; + s/\\\\/\\/g; + $html_refval{$_}= $p.$v; + } else { + warn("ununderstood line in HTML refs >$_<"); + } + } + close(HTMLREFS); +} + +sub html_ftpsilent { &arg('ftpsilent'); } +sub html_endftpsilent { &endarg('ftpsilent'); } +sub html_do_ftpsilent { + if ($_[0] =~ m/:/) { + $html_ftpsite= $`; + $html_ftpdir= $'.'/'; + } else { + $html_ftpsite= $_[0]; + $html_ftpdir= ''; + } +} + +sub html_ftpon { &arg('ftpon'); } +sub html_endftpon { &endarg('ftpon'); } +sub html_do_ftpon { +#print STDERR "ftpon($_[0])\n"; + $html_ftpsite= $_[0]; $html_ftpdir= ''; + print HTML ""; + &recurse($_[0]); + print HTML ""; +} + +sub html_ftpin { &arg('ftpin'); } +sub html_endftpin { &endarg('ftpin'); } +sub html_do_ftpin { +#print STDERR "ftpin($_[0])\n"; + print HTML ""; + &recurse($_[0]); + print HTML ""; +} + +sub html_text { + print HTML "\n

\n" if $html_needpara > 0; + $html_needpara=0; + $html_stuff= &html_sanitise($_[0]); + while ($html_stuff =~ s/^(.{40,70}) //) { + print HTML "$1\n"; + } + print HTML $html_stuff; +} + +sub html_tab { + $htmltabignore++ || warn "html tab ignored"; +} + +sub html_newline { print HTML "
\n" ; } +sub html_startverbatim { print HTML "

\n"   ;                       }
+sub html_verbatim      { print HTML &html_sanitise($_[0]),"\n";         }
+sub html_endverbatim   { print HTML "
\n" ; $html_needpara= -1; } + +sub html_endpara { + $html_needpara || $html_needpara++; +} + +sub html_finish { + &html_close; +} + +sub html_startindex { + print HTML "
    \n"; +} + +sub html_endindex { + print HTML "

\n"; +} + +sub html_startindexitem { + local ($ref,$qval) = @_; + $qval =~ m/Q(\d+)\.(\d+)/; + local ($s,$n) = ($1,$2); + print HTML "
  • Q$s.$n. "; + $html_indexunhead=''; +} + +sub html_startindexmainitem { + local ($ref,$s) = @_; + $s =~ m/\d+/; $s= $&; + print HTML "

    " if ($s > 1); + print HTML "
  • Section $s. "; + $html_indexunhead=''; +} + +sub html_endindexitem { + print HTML "$html_indexunhead\n"; +} + +sub html_startlist { + print HTML "\n"; + $html_itemend="
      "; +} + +sub html_endlist { + print HTML "$html_itemend\n
    \n"; + $html_needpara=-1 +} + +sub html_item { + print HTML "$html_itemend\n
  • "; + $html_itemend=""; + $html_needpara=-1; +} + +sub html_startpackedlist { + print HTML "\n"; + $html_itemend=""; +} + +sub html_endpackedlist { + print HTML "$html_itemend\n\n"; + $html_needpara=-1; +} + +sub html_packeditem { + print HTML "$html_itemend\n
  • "; + $html_itemend=""; + $html_needpara=-1; +} + +sub html_startindent { print HTML "
    \n"; } +sub html_endindent { print HTML "
    \n"; } + +sub html_pageref { + local ($ref,$sq) = @_; + $sq =~ m/(\d+)\.(\d+)/; + local ($s,$n) = ($1,$2); + print HTML "Q$sq \`"; +} + +sub html_endpageref { + print HTML "'"; +} + +sub html_sanitise { + local ($in) = @_; + local ($out); + while ($in =~ m/[<>&"]/) { + $out.= $`. '&'. $saniarray{$&}. ';'; + $in=$'; + } + $out.= $in; + $out; +} + +1; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-info.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-info.pl new file mode 100644 index 000000000..cfa2515ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-info.pl @@ -0,0 +1,226 @@ +## Info output +# Copyright (C) 1993-1995 Ian Jackson. + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# (Note: I do not consider works produced using these BFNN processing +# tools to be derivative works of the tools, so they are NOT covered +# by the GPL. However, I would appreciate it if you credited me if +# appropriate in any documents you format using BFNN.) + +sub info_init { + open(INFO,">$prefix.info"); + print INFO <'); } + +sub info_ftpon { } sub info_endftpon { } +sub info_ftpin { } sub info_endftpin { } +sub info_docref { } sub info_enddocref { } +sub info_courier { } sub info_endcourier { } +sub info_newsgroup { } sub info_endnewsgroup { } +sub info_ftpsilent { $info_ignore++; } +sub info_endftpsilent { $info_ignore--; } + +sub info_text { + return if $info_ignore; + if ($info_status eq '') { + $info_status= 'p'; + } + $info_para .= $_[0]; +} + +sub info_tab { + local ($n) = $_[0]-length($info_para); + $info_para .= ' 'x$n if $n>0; +} + +sub info_newline { + return unless $info_status eq 'p'; + print INFO &info_writepara; +} + +sub info_writepara { + local ($thisline, $thisword, $rest, $output); + for (;;) { + last unless $info_para =~ m/\S/; + $thisline= $info_indentstring; + for (;;) { + last unless $info_para =~ m/^(\s*\S+)/; + unless (length($1) + length($thisline) < 75 || + length($thisline) == length($info_indentstring)) { + last; + } + $thisline .= $1; + $info_para= $'; + } + $info_para =~ s/^\s*//; + $output.= $thisline."\n"; + $info_indentstring= $info_nextindent; + last unless length($info_para); + } + $info_status= ''; $info_para= ''; + return $output; +} + +sub info_endpara { + return unless $info_status eq 'p'; + print INFO &info_writepara; + print INFO "\n"; +} + +sub info_endheading { + $info_para =~ s/\s*$//; + print INFO "$info_para\n\n"; + $info_status= ''; + $info_para= ''; +} + +sub info_endmajorheading { &info_endheading(@_); } +sub info_endminorheading { &info_endheading(@_); } + +sub info_startverbatim { + print INFO &info_writepara; +} + +sub info_verbatim { + print INFO $_[0],"\n"; +} + +sub info_endverbatim { + $info_status= $info_vstatus; +} + +sub info_finish { + close(INFO); +} + +sub info_startindex { + &info_endpara; + $info_moredetail= ''; + $info_status= ''; +} + +sub info_endindex { + print INFO "$info_moredetail\n" if length($info_moredetail); +} + +sub info_endindexitem { + $info_indentstring= sprintf("* %-17s ",$info_label.'::'); + $info_nextindent= ' 'x20; + local ($txt); + $txt= &info_writepara; + if ($info_main) { + print INFO $label.$txt; + $txt =~ s/^.{20}//; + $info_moredetail.= $txt; + } else { + $info_moredetail.= $label.$txt; + } + $info_indentstring= $info_nextindent= ''; + $info_status='p'; +} + +sub info_startindexitem { + print INFO "* Menu:\n" if $info_status eq ''; + $info_status= ''; + $info_label= $_[2]; + $info_main= 0; +} + +sub info_startindexmainitem { + print INFO "* Menu:\n" if $info_status eq ''; + $info_label= $_[2]; + $info_main= 1; + $info_moredetail .= "\n$_[2], "; + $info_status= ''; +} + +sub info_startindent { + $info_istatus= $info_status; + print INFO &info_writepara; + $info_indentstring= " $info_indentstring"; + $info_nextindent= " $info_nextindent"; +} + +sub info_endindent { + $info_indentstring =~ s/^ //; + $info_nextindent =~ s/^ //; + $info_status= $info_istatus; +} + +sub info_startpackedlist { $info_plc=0; } +sub info_endpackedlist { &info_newline if !$info_plc; } +sub info_packeditem { + &info_newline if !$info_plc; + &info_tab($info_plc*40+5); + $info_plc= !$info_plc; +} + +sub info_startlist { + $info_istatus= $info_status; + print INFO &info_writepara; + $info_indentstring= " $info_indentstring"; + $info_nextindent= " $info_nextindent"; +} + +sub info_endlist { + $info_indentstring =~ s/^ //; + $info_nextindent =~ s/^ //; + $info_status= $info_lstatus; +} + +sub info_item { + &info_newline; + $info_indentstring =~ s/ $/* /; +} + +sub info_pageref { + &info_text("*Note Question $_[1]:: \`"); +} + +sub info_endpageref { + &info_text("'"); +} + +1; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-lout.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-lout.pl new file mode 100644 index 000000000..5c44852c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-lout.pl @@ -0,0 +1,242 @@ +## Lout output +# Copyright (C) 1993-1995 Ian Jackson. + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# (Note: I do not consider works produced using these BFNN processing +# tools to be derivative works of the tools, so they are NOT covered +# by the GPL. However, I would appreciate it if you credited me if +# appropriate in any documents you format using BFNN.) + +sub lout_init { + open(LOUT,">$prefix.lout"); + chop($dprint= `date '+%d %B %Y'`); + $dprint =~ s/^0//; +} + +sub lout_startup { + local ($lbs) = &lout_sanitise($user_brieftitle); + print LOUT <0)*40+5); + $lout_plc= !$lout_plc; +} + +sub lout_startlist { + &lout_endpara; + print LOUT "\@RawIndentedList style {\@Bullet} indent {0.5i} gap {1.1vx}\n"; + $lout_styles .= 'l'; + $lout_status= ''; +} + +sub lout_endlist { + &lout_endpara; + print LOUT "\@EndList\n\n"; + $lout_styles =~ s/.$//; +} + +sub lout_item { + &lout_endpara; + print LOUT "\@ListItem{"; + $lout_styles.= 'I'; +} + +sub lout_startindex { + print LOUT "//0.0fe\n"; +} + +sub lout_endindex { + $lout_status='p'; +} + +sub lout_startindexmainitem { + $lout_marker= $_[0]; + $lout_status= ''; + print LOUT "//0.3vx Bold \@Font \@HAdjust { \@HContract { { $_[1] } |3cx {"; + $lout_iiendheight= '1.00'; + $lout_styles .= 'X'; +} + +sub lout_startindexitem { + $lout_marker= $_[0]; + print LOUT "\@HAdjust { \@HContract { { $_[1] } |3cx {"; + $lout_iiendheight= '0.95'; + $lout_styles .= 'X'; +} + +sub lout_endindexitem { + print LOUT "} } |0c \@PageOf { $lout_marker } } //${lout_iiendheight}vx\n"; + $lout_styles =~ s/.$//; +} + +sub lout_email { &lout_courier; &lout_text('<'); } +sub lout_endemail { &lout_text('>'); &lout_endcourier; } + +sub lout_ftpon { &lout_courier; } sub lout_endftpon { &lout_endcourier; } +sub lout_ftpin { &lout_courier; } sub lout_endftpin { &lout_endcourier; } +sub lout_docref { } sub lout_enddocref { } +sub lout_ftpsilent { $lout_ignore++; } +sub lout_endftpsilent { $lout_ignore--; } + +sub lout_newsgroup { &lout_courier; } +sub lout_endnewsgroup { &lout_endcourier; } + +sub lout_text { + return if $lout_ignore; + $lout_status= 'p'; + $_= &lout_sanitise($_[0]); + s/ $/\n/ unless $lout_styles =~ m/[fhX]/; + print LOUT $_; +} + +sub lout_tab { + local ($size) = $_[0]*0.5; + print LOUT " |${size}ft "; +} + +sub lout_newline { + print LOUT " //1.0vx\n"; +} + +sub lout_sanitise { + local ($in) = @_; + local ($out); + $in= ' '.$in.' '; + $out=''; + while ($in =~ m/(\s)(\S*[\@\/|\\\"\^\&\{\}\#]\S*)(\s)/) { + $out .= $`.$1; + $in = $3.$'; + $_= $2; + s/[\\\"]/\\$&/g; + $out .= '"'.$_.'"'; + } + $out .= $in; + $out =~ s/^ //; $out =~ s/ $//; + $out; +} + +sub lout_endpara { + return if $lout_status eq ''; + if ($lout_styles eq '') { + print LOUT "\@LP\n\n"; + } elsif ($lout_styles =~ s/I$//) { + print LOUT "}\n"; + } + $lout_status= ''; +} + +sub lout_startverbatim { + print LOUT "//0.4f\n\@RawIndentedDisplay lines \@Break". + " { {0.7 1.0} \@Scale {Courier Bold} \@Font {\n"; +} + +sub lout_verbatim { + $_= $_[0]; + s/^\s*//; + print LOUT &lout_sanitise($_),"\n"; +} + +sub lout_endverbatim { print LOUT "}\n}\n//0.4f\n"; } + +1; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-post.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-post.pl new file mode 100644 index 000000000..e41c8d84f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/FAQ/m-post.pl @@ -0,0 +1,189 @@ +## POST output +# Copyright (C) 1993-1995 Ian Jackson. + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# It is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with GNU Emacs; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# (Note: I do not consider works produced using these BFNN processing +# tools to be derivative works of the tools, so they are NOT covered +# by the GPL. However, I would appreciate it if you credited me if +# appropriate in any documents you format using BFNN.) + +sub post_init { + open(POST,">$prefix.post"); +} + +sub post_startmajorheading { + print POST '='x79,"\n\n"; + $post_status= 'h'; + &post_text($_[0] ? "Section $_[0]. " : ''); +} + +sub post_startminorheading { + print POST '-'x77,"\n\n"; + $post_status= 'h'; +} + +sub post_italic { &post_text('*'); } +sub post_enditalic { $post_para .= '*'; } + +sub post_email { &post_text('<'); } sub post_endemail { &post_text('>'); } + +sub post_ftpon { } sub post_endftpon { } +sub post_ftpin { } sub post_endftpin { } +sub post_docref { } sub post_enddocref { } +sub post_courier { } sub post_endcourier { } +sub post_newsgroup { } sub post_endnewsgroup { } +sub post_ftpsilent { $post_ignore++; } +sub post_endftpsilent { $post_ignore--; } + +sub post_text { + return if $post_ignore; + if ($post_status eq '') { + $post_status= 'p'; + } + $post_para .= $_[0]; +} + +sub post_tab { + local ($n) = $_[0]-length($post_para); + $post_para .= ' 'x$n if $n>0; +} + +sub post_newline { + return unless $post_status eq 'p'; + &post_writepara; +} + +sub post_writepara { + local ($thisline, $thisword, $rest); + for (;;) { + last unless $post_para =~ m/\S/; + $thisline= $post_indentstring; + for (;;) { + last unless $post_para =~ m/^(\s*\S+)/; + unless (length($1) + length($thisline) < 75 || + length($thisline) == length($post_indentstring)) { + last; + } + $thisline .= $1; + $post_para= $'; + } + $post_para =~ s/^\s*//; + print POST $thisline,"\n"; + $post_indentstring= $post_nextindent; + last unless length($post_para); + } + $post_status= ''; $post_para= ''; +} + +sub post_endpara { + return unless $post_status eq 'p'; + &post_writepara; + print POST "\n"; +} + +sub post_endheading { + $post_para =~ s/\s*$//; + print POST "$post_para\n\n"; + $post_status= ''; + $post_para= ''; +} + +sub post_endmajorheading { &post_endheading(@_); } +sub post_endminorheading { &post_endheading(@_); } + +sub post_startverbatim { + $post_vstatus= $post_status; + &post_writepara; +} + +sub post_verbatim { + print POST $_[0],"\n"; +} + +sub post_endverbatim { + $post_status= $post_vstatus; +} + +sub post_finish { + close(POST); +} + +sub post_startindex { $post_status= ''; } +sub post_endindex { $post_status= 'p'; } + +sub post_endindexitem { + printf POST " %-11s %-.66s\n",$post_left,$post_para; + $post_status= 'p'; + $post_para= ''; +} + +sub post_startindexitem { + $post_left= $_[1]; +} + +sub post_startindexmainitem { + $post_left= $_[1]; + print POST "\n" if $post_status eq 'p'; +} + +sub post_startindent { + $post_istatus= $post_status; + &post_writepara; + $post_indentstring= " $post_indentstring"; + $post_nextindent= " $post_nextindent"; +} + +sub post_endindent { + $post_indentstring =~ s/^ //; + $post_nextindent =~ s/^ //; + $post_status= $post_istatus; +} + +sub post_startpackedlist { $post_plc=0; } +sub post_endpackedlist { &post_newline if !$post_plc; } +sub post_packeditem { + &post_newline if !$post_plc; + &post_tab($post_plc*40+5); + $post_plc= !$post_plc; +} + +sub post_startlist { + &post_endpara; + $post_indentstring= " $post_indentstring"; + $post_nextindent= " $post_nextindent"; +} + +sub post_endlist { + &post_endpara; + $post_indentstring =~ s/^ //; + $post_nextindent =~ s/^ //; +} + +sub post_item { + &post_newline; + $post_indentstring =~ s/ $/* /; +} + +sub post_pageref { + &post_text("Q$_[1] \`"); +} + +sub post_endpageref { + &post_text("'"); +} + +1; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/Makefile.am new file mode 100644 index 000000000..fa75422ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/Makefile.am @@ -0,0 +1,37 @@ +SUBDIRS = FAQ + +info_TEXINFOS = fftw3.texi +fftw3_TEXINFOS = acknowledgements.texi cindex.texi fftw3.texi findex.texi install.texi intro.texi legacy-fortran.texi license.texi modern-fortran.texi mpi.texi other.texi reference.texi threads.texi tutorial.texi upgrading.texi version.texi rfftwnd.pdf rfftwnd.eps + +DVIPS = dvips -Pwww + +EQN_IMAGES = equation-dft.png equation-dht.png equation-idft.png \ +equation-redft00.png equation-redft01.png equation-redft10.png \ +equation-redft11.png equation-rodft00.png equation-rodft01.png \ +equation-rodft10.png equation-rodft11.png + +EXTRA_DIST = f77_wisdom.f fftw3.pdf html rfftwnd.fig rfftwnd.eps \ +rfftwnd.pdf rfftwnd-for-html.png $(EQN_IMAGES) + +html: $(fftw3_TEXINFOS) $(EQN_IMAGES) rfftwnd-for-html.png + $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + --html --number-sections -o html fftw3.texi + for i in $(EQN_IMAGES); do cp -f ${srcdir}/$$i html; done + cp -f ${srcdir}/rfftwnd-for-html.png html + +maintainer-clean-local: + rm -rf html + +if MAINTAINER_MODE +# generate the figure for the manual and distribute the binaries, so that +# people don't need to have fig2dev installed. +rfftwnd.eps: rfftwnd.fig + fig2dev -L eps -m .7 ${srcdir}/rfftwnd.fig rfftwnd.eps + +rfftwnd-for-html.png: rfftwnd.fig + fig2dev -L png -m 1 ${srcdir}/rfftwnd.fig rfftwnd-for-html.png + +rfftwnd.pdf: rfftwnd.fig + fig2dev -L pdf -m .7 ${srcdir}/rfftwnd.fig rfftwnd.pdf + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/Makefile.in new file mode 100644 index 000000000..4c5d97150 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/Makefile.in @@ -0,0 +1,1025 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/version.texi \ + $(srcdir)/stamp-vti $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) +am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) +am__v_DVIPS_0 = @echo " DVIPS " $@; +am__v_DVIPS_1 = +AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) +am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) +am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; +am__v_MAKEINFO_1 = +AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) +am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) +am__v_INFOHTML_0 = @echo " INFOHTML" $@; +am__v_INFOHTML_1 = +AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) +am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) +am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; +am__v_TEXI2DVI_1 = +AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) +am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) +am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; +am__v_TEXI2PDF_1 = +AM_V_texinfo = $(am__v_texinfo_@AM_V@) +am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) +am__v_texinfo_0 = -q +am__v_texinfo_1 = +AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) +am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) +am__v_texidevnull_0 = > /dev/null +am__v_texidevnull_1 = +INFO_DEPS = $(srcdir)/fftw3.info +am__TEXINFO_TEX_DIR = $(srcdir) +DVIS = fftw3.dvi +PDFS = fftw3.pdf +PSS = fftw3.ps +HTMLS = fftw3.html +TEXINFOS = fftw3.texi +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__installdirs = "$(DESTDIR)$(infodir)" +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(fftw3_TEXINFOS) $(srcdir)/Makefile.in mdate-sh \ + texinfo.tex +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = FAQ +info_TEXINFOS = fftw3.texi +fftw3_TEXINFOS = acknowledgements.texi cindex.texi fftw3.texi findex.texi install.texi intro.texi legacy-fortran.texi license.texi modern-fortran.texi mpi.texi other.texi reference.texi threads.texi tutorial.texi upgrading.texi version.texi rfftwnd.pdf rfftwnd.eps +DVIPS = dvips -Pwww +EQN_IMAGES = equation-dft.png equation-dht.png equation-idft.png \ +equation-redft00.png equation-redft01.png equation-redft10.png \ +equation-redft11.png equation-rodft00.png equation-rodft01.png \ +equation-rodft10.png equation-rodft11.png + +EXTRA_DIST = f77_wisdom.f fftw3.pdf html rfftwnd.fig rfftwnd.eps \ +rfftwnd.pdf rfftwnd-for-html.png $(EQN_IMAGES) + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texi +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +.texi.info: + $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && $(am__cd) $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ + done; \ + else :; fi && \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + $(am__cd) $(srcdir); \ + else \ + rc=$$?; \ + $(am__cd) $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; exit $$rc + +.texi.dvi: + $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ + $< + +.texi.pdf: + $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ + $< + +.texi.html: + $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) + $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $(@:.html=.htp) $<; \ + then \ + rm -rf $@ && mv $(@:.html=.htp) $@; \ + else \ + rm -rf $(@:.html=.htp); exit 1; \ + fi +$(srcdir)/fftw3.info: fftw3.texi $(srcdir)/version.texi $(fftw3_TEXINFOS) +fftw3.dvi: fftw3.texi $(srcdir)/version.texi $(fftw3_TEXINFOS) +fftw3.pdf: fftw3.texi $(srcdir)/version.texi $(fftw3_TEXINFOS) +fftw3.html: fftw3.texi $(srcdir)/version.texi $(fftw3_TEXINFOS) +$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti +$(srcdir)/stamp-vti: fftw3.texi $(top_srcdir)/configure + @(dir=.; test -f ./fftw3.texi || dir=$(srcdir); \ + set `$(SHELL) $(srcdir)/mdate-sh $$dir/fftw3.texi`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp$$$$ && \ + (cmp -s vti.tmp$$$$ $(srcdir)/version.texi \ + || (echo "Updating $(srcdir)/version.texi" && \ + cp vti.tmp$$$$ $(srcdir)/version.texi.tmp$$$$ && \ + mv $(srcdir)/version.texi.tmp$$$$ $(srcdir)/version.texi)) && \ + rm -f vti.tmp$$$$ $(srcdir)/version.texi.$$$$ + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp* $(srcdir)/version.texi.tmp* + +maintainer-clean-vti: +@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi +.dvi.ps: + $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) $(AM_V_texinfo) -o $@ $< + +uninstall-dvi-am: + @$(NORMAL_UNINSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ + rm -f "$(DESTDIR)$(dvidir)/$$f"; \ + done + +uninstall-html-am: + @$(NORMAL_UNINSTALL) + @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ + rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ + done + +uninstall-info-am: + @$(PRE_UNINSTALL) + @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ + echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +uninstall-pdf-am: + @$(NORMAL_UNINSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ + rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ + done + +uninstall-ps-am: + @$(NORMAL_UNINSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ + rm -f "$(DESTDIR)$(psdir)/$$f"; \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ + for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ + if test -f $$file; then \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f "$(distdir)/$$relfile" || \ + cp -p $$file "$(distdir)/$$relfile"; \ + else :; fi; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf fftw3.t2d fftw3.t2p + +clean-aminfo: + -test -z "fftw3.dvi fftw3.pdf fftw3.ps fftw3.html" \ + || rm -rf fftw3.dvi fftw3.pdf fftw3.ps fftw3.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info +check-am: all-am +check: check-recursive +all-am: Makefile $(INFO_DEPS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(infodir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: $(DVIS) + +html-am: $(HTMLS) + +info: info-recursive + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am + +install-dvi: install-dvi-recursive + +install-dvi-am: $(DVIS) + @$(NORMAL_INSTALL) + @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ + done +install-exec-am: + +install-html: install-html-recursive + +install-html-am: $(HTMLS) + @$(NORMAL_INSTALL) + @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ + $(am__strip_dir) \ + d2=$$d$$p; \ + if test -d "$$d2"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ + echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + else \ + list2="$$list2 $$d2"; \ + fi; \ + done; \ + test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done; } +install-info: install-info-recursive + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ + fi; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + echo "$$ifile"; \ + else : ; fi; \ + done; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done + @$(POST_INSTALL) + @if $(am__can_run_installinfo); then \ + list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: $(PDFS) + @$(NORMAL_INSTALL) + @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done +install-ps: install-ps-recursive + +install-ps-am: $(PSS) + @$(NORMAL_INSTALL) + @list='$(PSS)'; test -n "$(psdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-local \ + maintainer-clean-vti + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ + mostlyclean-libtool mostlyclean-vti + +pdf: pdf-recursive + +pdf-am: $(PDFS) + +ps: ps-recursive + +ps-am: $(PSS) + +uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-am + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-aminfo clean-generic clean-libtool \ + cscopelist-am ctags ctags-am dist-info distclean \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-local \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-generic mostlyclean-libtool mostlyclean-vti pdf \ + pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-dvi-am uninstall-html-am uninstall-info-am \ + uninstall-pdf-am uninstall-ps-am + +.PRECIOUS: Makefile + + +html: $(fftw3_TEXINFOS) $(EQN_IMAGES) rfftwnd-for-html.png + $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + --html --number-sections -o html fftw3.texi + for i in $(EQN_IMAGES); do cp -f ${srcdir}/$$i html; done + cp -f ${srcdir}/rfftwnd-for-html.png html + +maintainer-clean-local: + rm -rf html + +# generate the figure for the manual and distribute the binaries, so that +# people don't need to have fig2dev installed. +@MAINTAINER_MODE_TRUE@rfftwnd.eps: rfftwnd.fig +@MAINTAINER_MODE_TRUE@ fig2dev -L eps -m .7 ${srcdir}/rfftwnd.fig rfftwnd.eps + +@MAINTAINER_MODE_TRUE@rfftwnd-for-html.png: rfftwnd.fig +@MAINTAINER_MODE_TRUE@ fig2dev -L png -m 1 ${srcdir}/rfftwnd.fig rfftwnd-for-html.png + +@MAINTAINER_MODE_TRUE@rfftwnd.pdf: rfftwnd.fig +@MAINTAINER_MODE_TRUE@ fig2dev -L pdf -m .7 ${srcdir}/rfftwnd.fig rfftwnd.pdf + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/acknowledgements.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/acknowledgements.texi new file mode 100644 index 000000000..f19ce4b21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/acknowledgements.texi @@ -0,0 +1,89 @@ +@node Acknowledgments, License and Copyright, Installation and Customization, Top +@chapter Acknowledgments + +Matteo Frigo was supported in part by the Special Research Program SFB +F011 ``AURORA'' of the Austrian Science Fund FWF and by MIT Lincoln +Laboratory. For previous versions of FFTW, he was supported in part by the +Defense Advanced Research Projects Agency (DARPA), under Grants +N00014-94-1-0985 and F30602-97-1-0270, and by a Digital Equipment +Corporation Fellowship. + +Steven G. Johnson was supported in part by a Dept.@ of Defense NDSEG +Fellowship, an MIT Karl Taylor Compton Fellowship, and by the Materials +Research Science and Engineering Center program of the National Science +Foundation under award DMR-9400334. + +Code for the Cell Broadband Engine was graciously donated to the FFTW +project by the IBM Austin Research Lab and included in fftw-3.2. (This +code was removed in fftw-3.3.) + +Code for the MIPS paired-single SIMD support was graciously donated to +the FFTW project by CodeSourcery, Inc. + +We are grateful to Sun Microsystems Inc.@ for its donation of a +cluster of 9 8-processor Ultra HPC 5000 SMPs (24 Gflops peak). These +machines served as the primary platform for the development of early +versions of FFTW. + +We thank Intel Corporation for donating a four-processor Pentium Pro +machine. We thank the GNU/Linux community for giving us a decent OS to +run on that machine. + +We are thankful to the AMD corporation for donating an AMD Athlon XP 1700+ +computer to the FFTW project. + +We thank the Compaq/HP testdrive program and VA Software Corporation +(SourceForge.net) for providing remote access to machines that were used +to test FFTW. + +The @code{genfft} suite of code generators was written using Objective +Caml, a dialect of ML. Objective Caml is a small and elegant language +developed by Xavier Leroy. The implementation is available from +@uref{http://caml.inria.fr/, @code{http://caml.inria.fr/}}. In previous +releases of FFTW, @code{genfft} was written in Caml Light, by the same +authors. An even earlier implementation of @code{genfft} was written in +Scheme, but Caml is definitely better for this kind of application. +@cindex Caml +@cindex LISP + + +FFTW uses many tools from the GNU project, including @code{automake}, +@code{texinfo}, and @code{libtool}. + +Prof.@ Charles E.@ Leiserson of MIT provided continuous support and +encouragement. This program would not exist without him. Charles also +proposed the name ``codelets'' for the basic FFT blocks. +@cindex codelet + + +Prof.@ John D.@ Joannopoulos of MIT demonstrated continuing tolerance of +Steven's ``extra-curricular'' computer-science activities, as well as +remarkable creativity in working them into his grant proposals. +Steven's physics degree would not exist without him. + +Franz Franchetti wrote SIMD extensions to FFTW 2, which eventually +led to the SIMD support in FFTW 3. + +Stefan Kral wrote most of the K7 code generator distributed with FFTW +3.0.x and 3.1.x. + +Andrew Sterian contributed the Windows timing code in FFTW 2. + +Didier Miras reported a bug in the test procedure used in FFTW 1.2. We +now use a completely different test algorithm by Funda Ergun that does +not require a separate FFT program to compare against. + +Wolfgang Reimer contributed the Pentium cycle counter and a few fixes +that help portability. + +Ming-Chang Liu uncovered a well-hidden bug in the complex transforms of +FFTW 2.0 and supplied a patch to correct it. + +The FFTW FAQ was written in @code{bfnn} (Bizarre Format With No Name) +and formatted using the tools developed by Ian Jackson for the Linux +FAQ. + +@emph{We are especially thankful to all of our users for their +continuing support, feedback, and interest during our development of +FFTW.} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/cindex.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/cindex.texi new file mode 100644 index 000000000..4dc83b714 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/cindex.texi @@ -0,0 +1,3 @@ +@node Concept Index, Library Index, License and Copyright, Top +@chapter Concept Index +@printindex cp diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-dft.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-dft.png new file mode 100644 index 000000000..12447f577 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-dft.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-dht.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-dht.png new file mode 100644 index 000000000..f2ed1d079 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-dht.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-idft.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-idft.png new file mode 100644 index 000000000..66e6d1e73 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-idft.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft00.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft00.png new file mode 100644 index 000000000..61404041c Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft00.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft01.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft01.png new file mode 100644 index 000000000..ee678b749 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft01.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft10.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft10.png new file mode 100644 index 000000000..4becbbd2c Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft10.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft11.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft11.png new file mode 100644 index 000000000..ae1014256 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-redft11.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft00.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft00.png new file mode 100644 index 000000000..f6920d276 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft00.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft01.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft01.png new file mode 100644 index 000000000..6a36c120e Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft01.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft10.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft10.png new file mode 100644 index 000000000..d9e9cdaa4 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft10.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft11.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft11.png new file mode 100644 index 000000000..36f2c7005 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/equation-rodft11.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/f77_wisdom.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/f77_wisdom.f new file mode 100644 index 000000000..67307ae67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/f77_wisdom.f @@ -0,0 +1,79 @@ +c Copyright (c) 2003, 2007-14 Matteo Frigo +c Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +c +c This program is free software; you can redistribute it and/or modify +c it under the terms of the GNU General Public License as published by +c the Free Software Foundation; either version 2 of the License, or +c (at your option) any later version. +c +c This program is distributed in the hope that it will be useful, +c but WITHOUT ANY WARRANTY; without even the implied warranty of +c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +c GNU General Public License for more details. +c +c You should have received a copy of the GNU General Public License +c along with this program; if not, write to the Free Software +c Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +c +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +c +c This is an example implementation of Fortran wisdom export/import +c to/from a Fortran unit (file), exploiting the generic +c dfftw_export_wisdom/dfftw_import_wisdom functions. +c +c We cannot compile this file into the FFTW library itself, lest all +c FFTW-calling programs be required to link to the Fortran I/O +c libraries. +c +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + +c Strictly speaking, the '$' format specifier, which allows us to +c write a character without a trailing newline, is not standard F77. +c However, it seems to be a nearly universal extension. + subroutine write_char(c, iunit) + character c + integer iunit + write(iunit,321) c + 321 format(a,$) + end + + subroutine export_wisdom_to_file(iunit) + integer iunit + external write_char + call dfftw_export_wisdom(write_char, iunit) + end + +c Fortran 77 does not have any portable way to read an arbitrary +c file one character at a time. The best alternative seems to be to +c read a whole line into a buffer, since for fftw-exported wisdom we +c can bound the line length. (If the file contains longer lines, +c then the lines will be truncated and the wisdom import should +c simply fail.) Ugh. + subroutine read_char(ic, iunit) + integer ic + integer iunit + character*256 buf + save buf + integer ibuf + data ibuf/257/ + save ibuf + if (ibuf .lt. 257) then + ic = ichar(buf(ibuf:ibuf)) + ibuf = ibuf + 1 + return + endif + read(iunit,123,end=666) buf + ic = ichar(buf(1:1)) + ibuf = 2 + return + 666 ic = -1 + ibuf = 257 + 123 format(a256) + end + + subroutine import_wisdom_from_file(isuccess, iunit) + integer isuccess + integer iunit + external read_char + call dfftw_import_wisdom(isuccess, read_char, iunit) + end diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info new file mode 100644 index 000000000..79a921057 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info @@ -0,0 +1,164 @@ +This is fftw3.info, produced by makeinfo version 6.3 from fftw3.texi. + +This manual is for FFTW (version 3.3.8, 24 May 2018). + + Copyright (C) 2003 Matteo Frigo. + + Copyright (C) 2003 Massachusetts Institute of Technology. + + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission + notice are preserved on all copies. + + Permission is granted to copy and distribute modified versions of + this manual under the conditions for verbatim copying, provided + that the entire resulting derived work is distributed under the + terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this + manual into another language, under the above conditions for + modified versions, except that this permission notice may be stated + in a translation approved by the Free Software Foundation. +INFO-DIR-SECTION Development +START-INFO-DIR-ENTRY +* fftw3: (fftw3). FFTW User's Manual. +END-INFO-DIR-ENTRY + + +Indirect: +fftw3.info-1: 1052 +fftw3.info-2: 337333 + +Tag Table: +(Indirect) +Node: Top1052 +Node: Introduction1850 +Node: Tutorial8149 +Ref: Tutorial-Footnote-19391 +Node: Complex One-Dimensional DFTs9485 +Node: Complex Multi-Dimensional DFTs15219 +Ref: Complex Multi-Dimensional DFTs-Footnote-118645 +Node: One-Dimensional DFTs of Real Data18780 +Node: Multi-Dimensional DFTs of Real Data23220 +Node: More DFTs of Real Data27146 +Node: The Halfcomplex-format DFT30643 +Node: Real even/odd DFTs (cosine/sine transforms)33252 +Ref: Real even/odd DFTs (cosine/sine transforms)-Footnote-138841 +Ref: Real even/odd DFTs (cosine/sine transforms)-Footnote-239030 +Node: The Discrete Hartley Transform39964 +Ref: The Discrete Hartley Transform-Footnote-142146 +Node: Other Important Topics42396 +Node: SIMD alignment and fftw_malloc42689 +Node: Multi-dimensional Array Format44878 +Node: Row-major Format45498 +Node: Column-major Format47194 +Node: Fixed-size Arrays in C48275 +Node: Dynamic Arrays in C49711 +Node: Dynamic Arrays in C-The Wrong Way51345 +Node: Words of Wisdom-Saving Plans53093 +Node: Caveats in Using Wisdom55761 +Node: FFTW Reference57844 +Node: Data Types and Files58332 +Node: Complex numbers58764 +Node: Precision60502 +Node: Memory Allocation62062 +Node: Using Plans63627 +Node: Basic Interface67652 +Ref: Basic Interface-Footnote-168396 +Node: Complex DFTs68460 +Node: Planner Flags72425 +Node: Real-data DFTs77865 +Node: Real-data DFT Array Format82854 +Node: Real-to-Real Transforms85110 +Node: Real-to-Real Transform Kinds89073 +Node: Advanced Interface91538 +Node: Advanced Complex DFTs92278 +Node: Advanced Real-data DFTs96546 +Node: Advanced Real-to-real Transforms98874 +Node: Guru Interface99979 +Node: Interleaved and split arrays100903 +Node: Guru vector and transform sizes101942 +Node: Guru Complex DFTs104639 +Node: Guru Real-data DFTs107475 +Node: Guru Real-to-real Transforms110394 +Node: 64-bit Guru Interface111713 +Node: New-array Execute Functions114028 +Node: Wisdom118524 +Node: Wisdom Export118883 +Node: Wisdom Import120861 +Node: Forgetting Wisdom122888 +Node: Wisdom Utilities123261 +Node: What FFTW Really Computes124623 +Node: The 1d Discrete Fourier Transform (DFT)125448 +Node: The 1d Real-data DFT126806 +Node: 1d Real-even DFTs (DCTs)128470 +Node: 1d Real-odd DFTs (DSTs)131671 +Node: 1d Discrete Hartley Transforms (DHTs)134607 +Node: Multi-dimensional Transforms135283 +Node: Multi-threaded FFTW137887 +Node: Installation and Supported Hardware/Software139353 +Node: Usage of Multi-threaded FFTW141177 +Node: How Many Threads to Use?144477 +Node: Thread safety145499 +Node: Distributed-memory FFTW with MPI148799 +Node: FFTW MPI Installation151374 +Node: Linking and Initializing MPI FFTW153161 +Node: 2d MPI example154384 +Node: MPI Data Distribution158609 +Node: Basic and advanced distribution interfaces161483 +Node: Load balancing165904 +Node: Transposed distributions167589 +Node: One-dimensional distributions171356 +Node: Multi-dimensional MPI DFTs of Real Data173921 +Node: Other Multi-dimensional Real-data MPI Transforms178562 +Node: FFTW MPI Transposes180735 +Node: Basic distributed-transpose interface181575 +Node: Advanced distributed-transpose interface183748 +Node: An improved replacement for MPI_Alltoall185032 +Node: FFTW MPI Wisdom187001 +Ref: FFTW MPI Wisdom-Footnote-1189739 +Node: Avoiding MPI Deadlocks190653 +Node: FFTW MPI Performance Tips191678 +Node: Combining MPI and Threads193143 +Node: FFTW MPI Reference196606 +Node: MPI Files and Data Types197185 +Node: MPI Initialization198181 +Node: Using MPI Plans199280 +Node: MPI Data Distribution Functions201106 +Node: MPI Plan Creation206563 +Node: MPI Wisdom Communication217239 +Node: FFTW MPI Fortran Interface218165 +Ref: FFTW MPI Fortran Interface-Footnote-1224188 +Node: Calling FFTW from Modern Fortran224596 +Node: Overview of Fortran interface225946 +Node: Extended and quadruple precision in Fortran229401 +Node: Reversing array dimensions230782 +Node: FFTW Fortran type reference234313 +Node: Plan execution in Fortran238807 +Node: Allocating aligned memory in Fortran241690 +Node: Accessing the wisdom API from Fortran245052 +Node: Wisdom File Export/Import from Fortran245829 +Node: Wisdom String Export/Import from Fortran247491 +Node: Wisdom Generic Export/Import from Fortran249476 +Node: Defining an FFTW module251706 +Node: Calling FFTW from Legacy Fortran252777 +Node: Fortran-interface routines254334 +Ref: Fortran-interface routines-Footnote-1257989 +Ref: Fortran-interface routines-Footnote-2258192 +Node: FFTW Constants in Fortran258325 +Node: FFTW Execution in Fortran259479 +Node: Fortran Examples262225 +Node: Wisdom of Fortran?265626 +Node: Upgrading from FFTW version 2267305 +Ref: Upgrading from FFTW version 2-Footnote-1276932 +Node: Installation and Customization277115 +Node: Installation on Unix278756 +Node: Installation on non-Unix systems286833 +Node: Cycle Counters289050 +Node: Generating your own code290801 +Node: Acknowledgments292835 +Node: License and Copyright296551 +Node: Concept Index298421 +Node: Library Index337333 + +End Tag Table diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info-1 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info-1 new file mode 100644 index 000000000..dd4ec32f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info-1 @@ -0,0 +1,6791 @@ +This is fftw3.info, produced by makeinfo version 6.3 from fftw3.texi. + +This manual is for FFTW (version 3.3.8, 24 May 2018). + + Copyright (C) 2003 Matteo Frigo. + + Copyright (C) 2003 Massachusetts Institute of Technology. + + Permission is granted to make and distribute verbatim copies of + this manual provided the copyright notice and this permission + notice are preserved on all copies. + + Permission is granted to copy and distribute modified versions of + this manual under the conditions for verbatim copying, provided + that the entire resulting derived work is distributed under the + terms of a permission notice identical to this one. + + Permission is granted to copy and distribute translations of this + manual into another language, under the above conditions for + modified versions, except that this permission notice may be stated + in a translation approved by the Free Software Foundation. +INFO-DIR-SECTION Development +START-INFO-DIR-ENTRY +* fftw3: (fftw3). FFTW User's Manual. +END-INFO-DIR-ENTRY + + +File: fftw3.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) + +FFTW User Manual +**************** + +Welcome to FFTW, the Fastest Fourier Transform in the West. FFTW is a +collection of fast C routines to compute the discrete Fourier transform. +This manual documents FFTW version 3.3.8. + +* Menu: + +* Introduction:: +* Tutorial:: +* Other Important Topics:: +* FFTW Reference:: +* Multi-threaded FFTW:: +* Distributed-memory FFTW with MPI:: +* Calling FFTW from Modern Fortran:: +* Calling FFTW from Legacy Fortran:: +* Upgrading from FFTW version 2:: +* Installation and Customization:: +* Acknowledgments:: +* License and Copyright:: +* Concept Index:: +* Library Index:: + + +File: fftw3.info, Node: Introduction, Next: Tutorial, Prev: Top, Up: Top + +1 Introduction +************** + +This manual documents version 3.3.8 of FFTW, the _Fastest Fourier +Transform in the West_. FFTW is a comprehensive collection of fast C +routines for computing the discrete Fourier transform (DFT) and various +special cases thereof. + * FFTW computes the DFT of complex data, real data, even- or + odd-symmetric real data (these symmetric transforms are usually + known as the discrete cosine or sine transform, respectively), and + the discrete Hartley transform (DHT) of real data. + + * The input data can have arbitrary length. FFTW employs O(n log n) + algorithms for all lengths, including prime numbers. + + * FFTW supports arbitrary multi-dimensional data. + + * FFTW supports the SSE, SSE2, AVX, AVX2, AVX512, KCVI, Altivec, VSX, + and NEON vector instruction sets. + + * FFTW includes parallel (multi-threaded) transforms for + shared-memory systems. + * Starting with version 3.3, FFTW includes distributed-memory + parallel transforms using MPI. + + We assume herein that you are familiar with the properties and uses +of the DFT that are relevant to your application. Otherwise, see e.g. +'The Fast Fourier Transform and Its Applications' by E. O. Brigham +(Prentice-Hall, Englewood Cliffs, NJ, 1988). Our web page +(http://www.fftw.org) also has links to FFT-related information online. + + In order to use FFTW effectively, you need to learn one basic concept +of FFTW's internal structure: FFTW does not use a fixed algorithm for +computing the transform, but instead it adapts the DFT algorithm to +details of the underlying hardware in order to maximize performance. +Hence, the computation of the transform is split into two phases. +First, FFTW's "planner" "learns" the fastest way to compute the +transform on your machine. The planner produces a data structure called +a "plan" that contains this information. Subsequently, the plan is +"executed" to transform the array of input data as dictated by the plan. +The plan can be reused as many times as needed. In typical +high-performance applications, many transforms of the same size are +computed and, consequently, a relatively expensive initialization of +this sort is acceptable. On the other hand, if you need a single +transform of a given size, the one-time cost of the planner becomes +significant. For this case, FFTW provides fast planners based on +heuristics or on previously computed plans. + + FFTW supports transforms of data with arbitrary length, rank, +multiplicity, and a general memory layout. In simple cases, however, +this generality may be unnecessary and confusing. Consequently, we +organized the interface to FFTW into three levels of increasing +generality. + * The "basic interface" computes a single transform of contiguous + data. + * The "advanced interface" computes transforms of multiple or strided + arrays. + * The "guru interface" supports the most general data layouts, + multiplicities, and strides. + We expect that most users will be best served by the basic interface, +whereas the guru interface requires careful attention to the +documentation to avoid problems. + + Besides the automatic performance adaptation performed by the +planner, it is also possible for advanced users to customize FFTW +manually. For example, if code space is a concern, we provide a tool +that links only the subset of FFTW needed by your application. +Conversely, you may need to extend FFTW because the standard +distribution is not sufficient for your needs. For example, the +standard FFTW distribution works most efficiently for arrays whose size +can be factored into small primes (2, 3, 5, and 7), and otherwise it +uses a slower general-purpose routine. If you need efficient transforms +of other sizes, you can use FFTW's code generator, which produces fast C +programs ("codelets") for any particular array size you may care about. +For example, if you need transforms of size 513 = 19 x 3^3, you can +customize FFTW to support the factor 19 efficiently. + + For more information regarding FFTW, see the paper, "The Design and +Implementation of FFTW3," by M. Frigo and S. G. Johnson, which was an +invited paper in 'Proc. IEEE' 93 (2), p. 216 (2005). The code +generator is described in the paper "A fast Fourier transform compiler", +by M. Frigo, in the 'Proceedings of the 1999 ACM SIGPLAN Conference on +Programming Language Design and Implementation (PLDI), Atlanta, Georgia, +May 1999'. These papers, along with the latest version of FFTW, the +FAQ, benchmarks, and other links, are available at the FFTW home page +(http://www.fftw.org). + + The current version of FFTW incorporates many good ideas from the +past thirty years of FFT literature. In one way or another, FFTW uses +the Cooley-Tukey algorithm, the prime factor algorithm, Rader's +algorithm for prime sizes, and a split-radix algorithm (with a +"conjugate-pair" variation pointed out to us by Dan Bernstein). FFTW's +code generator also produces new algorithms that we do not completely +understand. The reader is referred to the cited papers for the +appropriate references. + + The rest of this manual is organized as follows. We first discuss +the sequential (single-processor) implementation. We start by +describing the basic interface/features of FFTW in *note Tutorial::. +Next, *note Other Important Topics:: discusses data alignment (*note +SIMD alignment and fftw_malloc::), the storage scheme of +multi-dimensional arrays (*note Multi-dimensional Array Format::), and +FFTW's mechanism for storing plans on disk (*note Words of Wisdom-Saving +Plans::). Next, *note FFTW Reference:: provides comprehensive +documentation of all FFTW's features. Parallel transforms are discussed +in their own chapters: *note Multi-threaded FFTW:: and *note +Distributed-memory FFTW with MPI::. Fortran programmers can also use +FFTW, as described in *note Calling FFTW from Legacy Fortran:: and *note +Calling FFTW from Modern Fortran::. *note Installation and +Customization:: explains how to install FFTW in your computer system and +how to adapt FFTW to your needs. License and copyright information is +given in *note License and Copyright::. Finally, we thank all the +people who helped us in *note Acknowledgments::. + + +File: fftw3.info, Node: Tutorial, Next: Other Important Topics, Prev: Introduction, Up: Top + +2 Tutorial +********** + +* Menu: + +* Complex One-Dimensional DFTs:: +* Complex Multi-Dimensional DFTs:: +* One-Dimensional DFTs of Real Data:: +* Multi-Dimensional DFTs of Real Data:: +* More DFTs of Real Data:: + +This chapter describes the basic usage of FFTW, i.e., how to compute the +Fourier transform of a single array. This chapter tells the truth, but +not the _whole_ truth. Specifically, FFTW implements additional +routines and flags that are not documented here, although in many cases +we try to indicate where added capabilities exist. For more complete +information, see *note FFTW Reference::. (Note that you need to compile +and install FFTW before you can use it in a program. For the details of +the installation, see *note Installation and Customization::.) + + We recommend that you read this tutorial in order.(1) At the least, +read the first section (*note Complex One-Dimensional DFTs::) before +reading any of the others, even if your main interest lies in one of the +other transform types. + + Users of FFTW version 2 and earlier may also want to read *note +Upgrading from FFTW version 2::. + + ---------- Footnotes ---------- + + (1) You can read the tutorial in bit-reversed order after computing +your first transform. + + +File: fftw3.info, Node: Complex One-Dimensional DFTs, Next: Complex Multi-Dimensional DFTs, Prev: Tutorial, Up: Tutorial + +2.1 Complex One-Dimensional DFTs +================================ + + Plan: To bother about the best method of accomplishing an + accidental result. [Ambrose Bierce, 'The Enlarged Devil's + Dictionary'.] + + The basic usage of FFTW to compute a one-dimensional DFT of size 'N' +is simple, and it typically looks something like this code: + + #include + ... + { + fftw_complex *in, *out; + fftw_plan p; + ... + in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); + out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); + p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); + ... + fftw_execute(p); /* repeat as needed */ + ... + fftw_destroy_plan(p); + fftw_free(in); fftw_free(out); + } + + You must link this code with the 'fftw3' library. On Unix systems, +link with '-lfftw3 -lm'. + + The example code first allocates the input and output arrays. You +can allocate them in any way that you like, but we recommend using +'fftw_malloc', which behaves like 'malloc' except that it properly +aligns the array when SIMD instructions (such as SSE and Altivec) are +available (*note SIMD alignment and fftw_malloc::). [Alternatively, we +provide a convenient wrapper function 'fftw_alloc_complex(N)' which has +the same effect.] + + The data is an array of type 'fftw_complex', which is by default a +'double[2]' composed of the real ('in[i][0]') and imaginary ('in[i][1]') +parts of a complex number. + + The next step is to create a "plan", which is an object that contains +all the data that FFTW needs to compute the FFT. This function creates +the plan: + + fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + + The first argument, 'n', is the size of the transform you are trying +to compute. The size 'n' can be any positive integer, but sizes that +are products of small factors are transformed most efficiently (although +prime sizes still use an O(n log n) algorithm). + + The next two arguments are pointers to the input and output arrays of +the transform. These pointers can be equal, indicating an "in-place" +transform. + + The fourth argument, 'sign', can be either 'FFTW_FORWARD' ('-1') or +'FFTW_BACKWARD' ('+1'), and indicates the direction of the transform you +are interested in; technically, it is the sign of the exponent in the +transform. + + The 'flags' argument is usually either 'FFTW_MEASURE' or +'FFTW_ESTIMATE'. 'FFTW_MEASURE' instructs FFTW to run and measure the +execution time of several FFTs in order to find the best way to compute +the transform of size 'n'. This process takes some time (usually a few +seconds), depending on your machine and on the size of the transform. +'FFTW_ESTIMATE', on the contrary, does not run any computation and just +builds a reasonable plan that is probably sub-optimal. In short, if +your program performs many transforms of the same size and +initialization time is not important, use 'FFTW_MEASURE'; otherwise use +the estimate. + + _You must create the plan before initializing the input_, because +'FFTW_MEASURE' overwrites the 'in'/'out' arrays. (Technically, +'FFTW_ESTIMATE' does not touch your arrays, but you should always create +plans first just to be sure.) + + Once the plan has been created, you can use it as many times as you +like for transforms on the specified 'in'/'out' arrays, computing the +actual transforms via 'fftw_execute(plan)': + void fftw_execute(const fftw_plan plan); + + The DFT results are stored in-order in the array 'out', with the +zero-frequency (DC) component in 'out[0]'. If 'in != out', the +transform is "out-of-place" and the input array 'in' is not modified. +Otherwise, the input array is overwritten with the transform. + + If you want to transform a _different_ array of the same size, you +can create a new plan with 'fftw_plan_dft_1d' and FFTW automatically +reuses the information from the previous plan, if possible. +Alternatively, with the "guru" interface you can apply a given plan to a +different array, if you are careful. *Note FFTW Reference::. + + When you are done with the plan, you deallocate it by calling +'fftw_destroy_plan(plan)': + void fftw_destroy_plan(fftw_plan plan); + If you allocate an array with 'fftw_malloc()' you must deallocate it +with 'fftw_free()'. Do not use 'free()' or, heaven forbid, 'delete'. + + FFTW computes an _unnormalized_ DFT. Thus, computing a forward +followed by a backward transform (or vice versa) results in the original +array scaled by 'n'. For the definition of the DFT, see *note What FFTW +Really Computes::. + + If you have a C compiler, such as 'gcc', that supports the C99 +standard, and you '#include ' _before_ '', then +'fftw_complex' is the native double-precision complex type and you can +manipulate it with ordinary arithmetic. Otherwise, FFTW defines its own +complex type, which is bit-compatible with the C99 complex type. *Note +Complex numbers::. (The C++ '' template class may also be +usable via a typecast.) + + To use single or long-double precision versions of FFTW, replace the +'fftw_' prefix by 'fftwf_' or 'fftwl_' and link with '-lfftw3f' or +'-lfftw3l', but use the _same_ '' header file. + + Many more flags exist besides 'FFTW_MEASURE' and 'FFTW_ESTIMATE'. +For example, use 'FFTW_PATIENT' if you're willing to wait even longer +for a possibly even faster plan (*note FFTW Reference::). You can also +save plans for future use, as described by *note Words of Wisdom-Saving +Plans::. + + +File: fftw3.info, Node: Complex Multi-Dimensional DFTs, Next: One-Dimensional DFTs of Real Data, Prev: Complex One-Dimensional DFTs, Up: Tutorial + +2.2 Complex Multi-Dimensional DFTs +================================== + +Multi-dimensional transforms work much the same way as one-dimensional +transforms: you allocate arrays of 'fftw_complex' (preferably using +'fftw_malloc'), create an 'fftw_plan', execute it as many times as you +want with 'fftw_execute(plan)', and clean up with +'fftw_destroy_plan(plan)' (and 'fftw_free'). + + FFTW provides two routines for creating plans for 2d and 3d +transforms, and one routine for creating plans of arbitrary +dimensionality. The 2d and 3d routines have the following signature: + fftw_plan fftw_plan_dft_2d(int n0, int n1, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + fftw_plan fftw_plan_dft_3d(int n0, int n1, int n2, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + + These routines create plans for 'n0' by 'n1' two-dimensional (2d) +transforms and 'n0' by 'n1' by 'n2' 3d transforms, respectively. All of +these transforms operate on contiguous arrays in the C-standard +"row-major" order, so that the last dimension has the fastest-varying +index in the array. This layout is described further in *note +Multi-dimensional Array Format::. + + FFTW can also compute transforms of higher dimensionality. In order +to avoid confusion between the various meanings of the the word +"dimension", we use the term _rank_ to denote the number of independent +indices in an array.(1) For example, we say that a 2d transform has +rank 2, a 3d transform has rank 3, and so on. You can plan transforms +of arbitrary rank by means of the following function: + + fftw_plan fftw_plan_dft(int rank, const int *n, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + + Here, 'n' is a pointer to an array 'n[rank]' denoting an 'n[0]' by +'n[1]' by ... by 'n[rank-1]' transform. Thus, for example, the call + fftw_plan_dft_2d(n0, n1, in, out, sign, flags); + is equivalent to the following code fragment: + int n[2]; + n[0] = n0; + n[1] = n1; + fftw_plan_dft(2, n, in, out, sign, flags); + 'fftw_plan_dft' is not restricted to 2d and 3d transforms, however, +but it can plan transforms of arbitrary rank. + + You may have noticed that all the planner routines described so far +have overlapping functionality. For example, you can plan a 1d or 2d +transform by using 'fftw_plan_dft' with a 'rank' of '1' or '2', or even +by calling 'fftw_plan_dft_3d' with 'n0' and/or 'n1' equal to '1' (with +no loss in efficiency). This pattern continues, and FFTW's planning +routines in general form a "partial order," sequences of interfaces with +strictly increasing generality but correspondingly greater complexity. + + 'fftw_plan_dft' is the most general complex-DFT routine that we +describe in this tutorial, but there are also the advanced and guru +interfaces, which allow one to efficiently combine multiple/strided +transforms into a single FFTW plan, transform a subset of a larger +multi-dimensional array, and/or to handle more general complex-number +formats. For more information, see *note FFTW Reference::. + + ---------- Footnotes ---------- + + (1) The term "rank" is commonly used in the APL, FORTRAN, and Common +Lisp traditions, although it is not so common in the C world. + + +File: fftw3.info, Node: One-Dimensional DFTs of Real Data, Next: Multi-Dimensional DFTs of Real Data, Prev: Complex Multi-Dimensional DFTs, Up: Tutorial + +2.3 One-Dimensional DFTs of Real Data +===================================== + +In many practical applications, the input data 'in[i]' are purely real +numbers, in which case the DFT output satisfies the "Hermitian" +redundancy: 'out[i]' is the conjugate of 'out[n-i]'. It is possible to +take advantage of these circumstances in order to achieve roughly a +factor of two improvement in both speed and memory usage. + + In exchange for these speed and space advantages, the user sacrifices +some of the simplicity of FFTW's complex transforms. First of all, the +input and output arrays are of _different sizes and types_: the input is +'n' real numbers, while the output is 'n/2+1' complex numbers (the +non-redundant outputs); this also requires slight "padding" of the input +array for in-place transforms. Second, the inverse transform (complex +to real) has the side-effect of _overwriting its input array_, by +default. Neither of these inconveniences should pose a serious problem +for users, but it is important to be aware of them. + + The routines to perform real-data transforms are almost the same as +those for complex transforms: you allocate arrays of 'double' and/or +'fftw_complex' (preferably using 'fftw_malloc' or 'fftw_alloc_complex'), +create an 'fftw_plan', execute it as many times as you want with +'fftw_execute(plan)', and clean up with 'fftw_destroy_plan(plan)' (and +'fftw_free'). The only differences are that the input (or output) is of +type 'double' and there are new routines to create the plan. In one +dimension: + + fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, + unsigned flags); + fftw_plan fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, + unsigned flags); + + for the real input to complex-Hermitian output ("r2c") and +complex-Hermitian input to real output ("c2r") transforms. Unlike the +complex DFT planner, there is no 'sign' argument. Instead, r2c DFTs are +always 'FFTW_FORWARD' and c2r DFTs are always 'FFTW_BACKWARD'. (For +single/long-double precision 'fftwf' and 'fftwl', 'double' should be +replaced by 'float' and 'long double', respectively.) + + Here, 'n' is the "logical" size of the DFT, not necessarily the +physical size of the array. In particular, the real ('double') array +has 'n' elements, while the complex ('fftw_complex') array has 'n/2+1' +elements (where the division is rounded down). For an in-place +transform, 'in' and 'out' are aliased to the same array, which must be +big enough to hold both; so, the real array would actually have +'2*(n/2+1)' elements, where the elements beyond the first 'n' are unused +padding. (Note that this is very different from the concept of +"zero-padding" a transform to a larger length, which changes the logical +size of the DFT by actually adding new input data.) The kth element of +the complex array is exactly the same as the kth element of the +corresponding complex DFT. All positive 'n' are supported; products of +small factors are most efficient, but an O(n log n) algorithm is used +even for prime sizes. + + As noted above, the c2r transform destroys its input array even for +out-of-place transforms. This can be prevented, if necessary, by +including 'FFTW_PRESERVE_INPUT' in the 'flags', with unfortunately some +sacrifice in performance. This flag is also not currently supported for +multi-dimensional real DFTs (next section). + + Readers familiar with DFTs of real data will recall that the 0th (the +"DC") and 'n/2'-th (the "Nyquist" frequency, when 'n' is even) elements +of the complex output are purely real. Some implementations therefore +store the Nyquist element where the DC imaginary part would go, in order +to make the input and output arrays the same size. Such packing, +however, does not generalize well to multi-dimensional transforms, and +the space savings are miniscule in any case; FFTW does not support it. + + An alternative interface for one-dimensional r2c and c2r DFTs can be +found in the 'r2r' interface (*note The Halfcomplex-format DFT::), with +"halfcomplex"-format output that _is_ the same size (and type) as the +input array. That interface, although it is not very useful for +multi-dimensional transforms, may sometimes yield better performance. + + +File: fftw3.info, Node: Multi-Dimensional DFTs of Real Data, Next: More DFTs of Real Data, Prev: One-Dimensional DFTs of Real Data, Up: Tutorial + +2.4 Multi-Dimensional DFTs of Real Data +======================================= + +Multi-dimensional DFTs of real data use the following planner routines: + + fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1, + double *in, fftw_complex *out, + unsigned flags); + fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2, + double *in, fftw_complex *out, + unsigned flags); + fftw_plan fftw_plan_dft_r2c(int rank, const int *n, + double *in, fftw_complex *out, + unsigned flags); + + as well as the corresponding 'c2r' routines with the input/output +types swapped. These routines work similarly to their complex +analogues, except for the fact that here the complex output array is cut +roughly in half and the real array requires padding for in-place +transforms (as in 1d, above). + + As before, 'n' is the logical size of the array, and the consequences +of this on the the format of the complex arrays deserve careful +attention. Suppose that the real data has dimensions n[0] x n[1] x n[2] +x ... x n[d-1] (in row-major order). Then, after an r2c transform, the +output is an n[0] x n[1] x n[2] x ... x (n[d-1]/2 + 1) array of +'fftw_complex' values in row-major order, corresponding to slightly over +half of the output of the corresponding complex DFT. (The division is +rounded down.) The ordering of the data is otherwise exactly the same +as in the complex-DFT case. + + For out-of-place transforms, this is the end of the story: the real +data is stored as a row-major array of size n[0] x n[1] x n[2] x ... x +n[d-1] and the complex data is stored as a row-major array of size n[0] +x n[1] x n[2] x ... x (n[d-1]/2 + 1) . + + For in-place transforms, however, extra padding of the real-data +array is necessary because the complex array is larger than the real +array, and the two arrays share the same memory locations. Thus, for +in-place transforms, the final dimension of the real-data array must be +padded with extra values to accommodate the size of the complex +data--two values if the last dimension is even and one if it is odd. +That is, the last dimension of the real data must physically contain 2 * +(n[d-1]/2+1) 'double' values (exactly enough to hold the complex data). +This physical array size does not, however, change the _logical_ array +size--only n[d-1] values are actually stored in the last dimension, and +n[d-1] is the last dimension passed to the plan-creation routine. + + For example, consider the transform of a two-dimensional real array +of size 'n0' by 'n1'. The output of the r2c transform is a +two-dimensional complex array of size 'n0' by 'n1/2+1', where the 'y' +dimension has been cut nearly in half because of redundancies in the +output. Because 'fftw_complex' is twice the size of 'double', the +output array is slightly bigger than the input array. Thus, if we want +to compute the transform in place, we must _pad_ the input array so that +it is of size 'n0' by '2*(n1/2+1)'. If 'n1' is even, then there are two +padding elements at the end of each row (which need not be initialized, +as they are only used for output). + + These transforms are unnormalized, so an r2c followed by a c2r +transform (or vice versa) will result in the original data scaled by the +number of real data elements--that is, the product of the (logical) +dimensions of the real data. + + (Because the last dimension is treated specially, if it is equal to +'1' the transform is _not_ equivalent to a lower-dimensional r2c/c2r +transform. In that case, the last complex dimension also has size '1' +('=1/2+1'), and no advantage is gained over the complex transforms.) + + +File: fftw3.info, Node: More DFTs of Real Data, Prev: Multi-Dimensional DFTs of Real Data, Up: Tutorial + +2.5 More DFTs of Real Data +========================== + +* Menu: + +* The Halfcomplex-format DFT:: +* Real even/odd DFTs (cosine/sine transforms):: +* The Discrete Hartley Transform:: + +FFTW supports several other transform types via a unified "r2r" +(real-to-real) interface, so called because it takes a real ('double') +array and outputs a real array of the same size. These r2r transforms +currently fall into three categories: DFTs of real input and +complex-Hermitian output in halfcomplex format, DFTs of real input with +even/odd symmetry (a.k.a. discrete cosine/sine transforms, DCTs/DSTs), +and discrete Hartley transforms (DHTs), all described in more detail by +the following sections. + + The r2r transforms follow the by now familiar interface of creating +an 'fftw_plan', executing it with 'fftw_execute(plan)', and destroying +it with 'fftw_destroy_plan(plan)'. Furthermore, all r2r transforms +share the same planner interface: + + fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out, + fftw_r2r_kind kind, unsigned flags); + fftw_plan fftw_plan_r2r_2d(int n0, int n1, double *in, double *out, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, + unsigned flags); + fftw_plan fftw_plan_r2r_3d(int n0, int n1, int n2, + double *in, double *out, + fftw_r2r_kind kind0, + fftw_r2r_kind kind1, + fftw_r2r_kind kind2, + unsigned flags); + fftw_plan fftw_plan_r2r(int rank, const int *n, double *in, double *out, + const fftw_r2r_kind *kind, unsigned flags); + + Just as for the complex DFT, these plan 1d/2d/3d/multi-dimensional +transforms for contiguous arrays in row-major order, transforming (real) +input to output of the same size, where 'n' specifies the _physical_ +dimensions of the arrays. All positive 'n' are supported (with the +exception of 'n=1' for the 'FFTW_REDFT00' kind, noted in the real-even +subsection below); products of small factors are most efficient +(factorizing 'n-1' and 'n+1' for 'FFTW_REDFT00' and 'FFTW_RODFT00' +kinds, described below), but an O(n log n) algorithm is used even for +prime sizes. + + Each dimension has a "kind" parameter, of type 'fftw_r2r_kind', +specifying the kind of r2r transform to be used for that dimension. (In +the case of 'fftw_plan_r2r', this is an array 'kind[rank]' where +'kind[i]' is the transform kind for the dimension 'n[i]'.) The kind can +be one of a set of predefined constants, defined in the following +subsections. + + In other words, FFTW computes the separable product of the specified +r2r transforms over each dimension, which can be used e.g. for partial +differential equations with mixed boundary conditions. (For some r2r +kinds, notably the halfcomplex DFT and the DHT, such a separable product +is somewhat problematic in more than one dimension, however, as is +described below.) + + In the current version of FFTW, all r2r transforms except for the +halfcomplex type are computed via pre- or post-processing of halfcomplex +transforms, and they are therefore not as fast as they could be. Since +most other general DCT/DST codes employ a similar algorithm, however, +FFTW's implementation should provide at least competitive performance. + + +File: fftw3.info, Node: The Halfcomplex-format DFT, Next: Real even/odd DFTs (cosine/sine transforms), Prev: More DFTs of Real Data, Up: More DFTs of Real Data + +2.5.1 The Halfcomplex-format DFT +-------------------------------- + +An r2r kind of 'FFTW_R2HC' ("r2hc") corresponds to an r2c DFT (*note +One-Dimensional DFTs of Real Data::) but with "halfcomplex" format +output, and may sometimes be faster and/or more convenient than the +latter. The inverse "hc2r" transform is of kind 'FFTW_HC2R'. This +consists of the non-redundant half of the complex output for a 1d +real-input DFT of size 'n', stored as a sequence of 'n' real numbers +('double') in the format: + + r0, r1, r2, r(n/2), i((n+1)/2-1), ..., i2, i1 + + Here, rk is the real part of the kth output, and ik is the imaginary +part. (Division by 2 is rounded down.) For a halfcomplex array +'hc[n]', the kth component thus has its real part in 'hc[k]' and its +imaginary part in 'hc[n-k]', with the exception of 'k' '==' '0' or 'n/2' +(the latter only if 'n' is even)--in these two cases, the imaginary part +is zero due to symmetries of the real-input DFT, and is not stored. +Thus, the r2hc transform of 'n' real values is a halfcomplex array of +length 'n', and vice versa for hc2r. + + Aside from the differing format, the output of +'FFTW_R2HC'/'FFTW_HC2R' is otherwise exactly the same as for the +corresponding 1d r2c/c2r transform (i.e. 'FFTW_FORWARD'/'FFTW_BACKWARD' +transforms, respectively). Recall that these transforms are +unnormalized, so r2hc followed by hc2r will result in the original data +multiplied by 'n'. Furthermore, like the c2r transform, an out-of-place +hc2r transform will _destroy its input_ array. + + Although these halfcomplex transforms can be used with the +multi-dimensional r2r interface, the interpretation of such a separable +product of transforms along each dimension is problematic. For example, +consider a two-dimensional 'n0' by 'n1', r2hc by r2hc transform planned +by 'fftw_plan_r2r_2d(n0, n1, in, out, FFTW_R2HC, FFTW_R2HC, +FFTW_MEASURE)'. Conceptually, FFTW first transforms the rows (of size +'n1') to produce halfcomplex rows, and then transforms the columns (of +size 'n0'). Half of these column transforms, however, are of imaginary +parts, and should therefore be multiplied by i and combined with the +r2hc transforms of the real columns to produce the 2d DFT amplitudes; +FFTW's r2r transform does _not_ perform this combination for you. Thus, +if a multi-dimensional real-input/output DFT is required, we recommend +using the ordinary r2c/c2r interface (*note Multi-Dimensional DFTs of +Real Data::). + + +File: fftw3.info, Node: Real even/odd DFTs (cosine/sine transforms), Next: The Discrete Hartley Transform, Prev: The Halfcomplex-format DFT, Up: More DFTs of Real Data + +2.5.2 Real even/odd DFTs (cosine/sine transforms) +------------------------------------------------- + +The Fourier transform of a real-even function f(-x) = f(x) is real-even, +and i times the Fourier transform of a real-odd function f(-x) = -f(x) +is real-odd. Similar results hold for a discrete Fourier transform, and +thus for these symmetries the need for complex inputs/outputs is +entirely eliminated. Moreover, one gains a factor of two in speed/space +from the fact that the data are real, and an additional factor of two +from the even/odd symmetry: only the non-redundant (first) half of the +array need be stored. The result is the real-even DFT ("REDFT") and the +real-odd DFT ("RODFT"), also known as the discrete cosine and sine +transforms ("DCT" and "DST"), respectively. + + (In this section, we describe the 1d transforms; multi-dimensional +transforms are just a separable product of these transforms operating +along each dimension.) + + Because of the discrete sampling, one has an additional choice: is +the data even/odd around a sampling point, or around the point halfway +between two samples? The latter corresponds to _shifting_ the samples +by _half_ an interval, and gives rise to several transform variants +denoted by REDFTab and RODFTab: a and b are 0 or 1, and indicate whether +the input (a) and/or output (b) are shifted by half a sample (1 means it +is shifted). These are also known as types I-IV of the DCT and DST, and +all four types are supported by FFTW's r2r interface.(1) + + The r2r kinds for the various REDFT and RODFT types supported by +FFTW, along with the boundary conditions at both ends of the _input_ +array ('n' real numbers 'in[j=0..n-1]'), are: + + * 'FFTW_REDFT00' (DCT-I): even around j=0 and even around j=n-1. + + * 'FFTW_REDFT10' (DCT-II, "the" DCT): even around j=-0.5 and even + around j=n-0.5. + + * 'FFTW_REDFT01' (DCT-III, "the" IDCT): even around j=0 and odd + around j=n. + + * 'FFTW_REDFT11' (DCT-IV): even around j=-0.5 and odd around j=n-0.5. + + * 'FFTW_RODFT00' (DST-I): odd around j=-1 and odd around j=n. + + * 'FFTW_RODFT10' (DST-II): odd around j=-0.5 and odd around j=n-0.5. + + * 'FFTW_RODFT01' (DST-III): odd around j=-1 and even around j=n-1. + + * 'FFTW_RODFT11' (DST-IV): odd around j=-0.5 and even around j=n-0.5. + + Note that these symmetries apply to the "logical" array being +transformed; *there are no constraints on your physical input data*. +So, for example, if you specify a size-5 REDFT00 (DCT-I) of the data +abcde, it corresponds to the DFT of the logical even array abcdedcb of +size 8. A size-4 REDFT10 (DCT-II) of the data abcd corresponds to the +size-8 logical DFT of the even array abcddcba, shifted by half a sample. + + All of these transforms are invertible. The inverse of R*DFT00 is +R*DFT00; of R*DFT10 is R*DFT01 and vice versa (these are often called +simply "the" DCT and IDCT, respectively); and of R*DFT11 is R*DFT11. +However, the transforms computed by FFTW are unnormalized, exactly like +the corresponding real and complex DFTs, so computing a transform +followed by its inverse yields the original array scaled by N, where N +is the _logical_ DFT size. For REDFT00, N=2(n-1); for RODFT00, +N=2(n+1); otherwise, N=2n. + + Note that the boundary conditions of the transform output array are +given by the input boundary conditions of the inverse transform. Thus, +the above transforms are all inequivalent in terms of input/output +boundary conditions, even neglecting the 0.5 shift difference. + + FFTW is most efficient when N is a product of small factors; note +that this _differs_ from the factorization of the physical size 'n' for +REDFT00 and RODFT00! There is another oddity: 'n=1' REDFT00 transforms +correspond to N=0, and so are _not defined_ (the planner will return +'NULL'). Otherwise, any positive 'n' is supported. + + For the precise mathematical definitions of these transforms as used +by FFTW, see *note What FFTW Really Computes::. (For people accustomed +to the DCT/DST, FFTW's definitions have a coefficient of 2 in front of +the cos/sin functions so that they correspond precisely to an even/odd +DFT of size N. Some authors also include additional multiplicative +factors of sqrt(2) for selected inputs and outputs; this makes the +transform orthogonal, but sacrifices the direct equivalence to a +symmetric DFT.) + +Which type do you need? +....................... + +Since the required flavor of even/odd DFT depends upon your problem, you +are the best judge of this choice, but we can make a few comments on +relative efficiency to help you in your selection. In particular, +R*DFT01 and R*DFT10 tend to be slightly faster than R*DFT11 (especially +for odd sizes), while the R*DFT00 transforms are sometimes significantly +slower (especially for even sizes).(2) + + Thus, if only the boundary conditions on the transform inputs are +specified, we generally recommend R*DFT10 over R*DFT00 and R*DFT01 over +R*DFT11 (unless the half-sample shift or the self-inverse property is +significant for your problem). + + If performance is important to you and you are using only small sizes +(say n<200), e.g. for multi-dimensional transforms, then you might +consider generating hard-coded transforms of those sizes and types that +you are interested in (*note Generating your own code::). + + We are interested in hearing what types of symmetric transforms you +find most useful. + + ---------- Footnotes ---------- + + (1) There are also type V-VIII transforms, which correspond to a +logical DFT of _odd_ size N, independent of whether the physical size +'n' is odd, but we do not support these variants. + + (2) R*DFT00 is sometimes slower in FFTW because we discovered that +the standard algorithm for computing this by a pre/post-processed real +DFT--the algorithm used in FFTPACK, Numerical Recipes, and other sources +for decades now--has serious numerical problems: it already loses +several decimal places of accuracy for 16k sizes. There seem to be only +two alternatives in the literature that do not suffer similarly: a +recursive decomposition into smaller DCTs, which would require a large +set of codelets for efficiency and generality, or sacrificing a factor +of 2 in speed to use a real DFT of twice the size. We currently employ +the latter technique for general n, as well as a limited form of the +former method: a split-radix decomposition when n is odd (N a multiple +of 4). For N containing many factors of 2, the split-radix method seems +to recover most of the speed of the standard algorithm without the +accuracy tradeoff. + + +File: fftw3.info, Node: The Discrete Hartley Transform, Prev: Real even/odd DFTs (cosine/sine transforms), Up: More DFTs of Real Data + +2.5.3 The Discrete Hartley Transform +------------------------------------ + +If you are planning to use the DHT because you've heard that it is +"faster" than the DFT (FFT), *stop here*. The DHT is not faster than +the DFT. That story is an old but enduring misconception that was +debunked in 1987. + + The discrete Hartley transform (DHT) is an invertible linear +transform closely related to the DFT. In the DFT, one multiplies each +input by cos - i * sin (a complex exponential), whereas in the DHT each +input is multiplied by simply cos + sin. Thus, the DHT transforms 'n' +real numbers to 'n' real numbers, and has the convenient property of +being its own inverse. In FFTW, a DHT (of any positive 'n') can be +specified by an r2r kind of 'FFTW_DHT'. + + Like the DFT, in FFTW the DHT is unnormalized, so computing a DHT of +size 'n' followed by another DHT of the same size will result in the +original array multiplied by 'n'. + + The DHT was originally proposed as a more efficient alternative to +the DFT for real data, but it was subsequently shown that a specialized +DFT (such as FFTW's r2hc or r2c transforms) could be just as fast. In +FFTW, the DHT is actually computed by post-processing an r2hc transform, +so there is ordinarily no reason to prefer it from a performance +perspective.(1) However, we have heard rumors that the DHT might be the +most appropriate transform in its own right for certain applications, +and we would be very interested to hear from anyone who finds it useful. + + If 'FFTW_DHT' is specified for multiple dimensions of a +multi-dimensional transform, FFTW computes the separable product of 1d +DHTs along each dimension. Unfortunately, this is not quite the same +thing as a true multi-dimensional DHT; you can compute the latter, if +necessary, with at most 'rank-1' post-processing passes [see e.g. H. +Hao and R. N. Bracewell, Proc. IEEE 75, 264-266 (1987)]. + + For the precise mathematical definition of the DHT as used by FFTW, +see *note What FFTW Really Computes::. + + ---------- Footnotes ---------- + + (1) We provide the DHT mainly as a byproduct of some internal +algorithms. FFTW computes a real input/output DFT of _prime_ size by +re-expressing it as a DHT plus post/pre-processing and then using +Rader's prime-DFT algorithm adapted to the DHT. + + +File: fftw3.info, Node: Other Important Topics, Next: FFTW Reference, Prev: Tutorial, Up: Top + +3 Other Important Topics +************************ + +* Menu: + +* SIMD alignment and fftw_malloc:: +* Multi-dimensional Array Format:: +* Words of Wisdom-Saving Plans:: +* Caveats in Using Wisdom:: + + +File: fftw3.info, Node: SIMD alignment and fftw_malloc, Next: Multi-dimensional Array Format, Prev: Other Important Topics, Up: Other Important Topics + +3.1 SIMD alignment and fftw_malloc +================================== + +SIMD, which stands for "Single Instruction Multiple Data," is a set of +special operations supported by some processors to perform a single +operation on several numbers (usually 2 or 4) simultaneously. SIMD +floating-point instructions are available on several popular CPUs: +SSE/SSE2/AVX/AVX2/AVX512/KCVI on some x86/x86-64 processors, AltiVec and +VSX on some POWER/PowerPCs, NEON on some ARM models. FFTW can be +compiled to support the SIMD instructions on any of these systems. + + A program linking to an FFTW library compiled with SIMD support can +obtain a nonnegligible speedup for most complex and r2c/c2r transforms. +In order to obtain this speedup, however, the arrays of complex (or +real) data passed to FFTW must be specially aligned in memory (typically +16-byte aligned), and often this alignment is more stringent than that +provided by the usual 'malloc' (etc.) allocation routines. + + In order to guarantee proper alignment for SIMD, therefore, in case +your program is ever linked against a SIMD-using FFTW, we recommend +allocating your transform data with 'fftw_malloc' and de-allocating it +with 'fftw_free'. These have exactly the same interface and behavior as +'malloc'/'free', except that for a SIMD FFTW they ensure that the +returned pointer has the necessary alignment (by calling 'memalign' or +its equivalent on your OS). + + You are not _required_ to use 'fftw_malloc'. You can allocate your +data in any way that you like, from 'malloc' to 'new' (in C++) to a +fixed-size array declaration. If the array happens not to be properly +aligned, FFTW will not use the SIMD extensions. + + Since 'fftw_malloc' only ever needs to be used for real and complex +arrays, we provide two convenient wrapper routines 'fftw_alloc_real(N)' +and 'fftw_alloc_complex(N)' that are equivalent to +'(double*)fftw_malloc(sizeof(double) * N)' and +'(fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N)', respectively (or +their equivalents in other precisions). + + +File: fftw3.info, Node: Multi-dimensional Array Format, Next: Words of Wisdom-Saving Plans, Prev: SIMD alignment and fftw_malloc, Up: Other Important Topics + +3.2 Multi-dimensional Array Format +================================== + +This section describes the format in which multi-dimensional arrays are +stored in FFTW. We felt that a detailed discussion of this topic was +necessary. Since several different formats are common, this topic is +often a source of confusion. + +* Menu: + +* Row-major Format:: +* Column-major Format:: +* Fixed-size Arrays in C:: +* Dynamic Arrays in C:: +* Dynamic Arrays in C-The Wrong Way:: + + +File: fftw3.info, Node: Row-major Format, Next: Column-major Format, Prev: Multi-dimensional Array Format, Up: Multi-dimensional Array Format + +3.2.1 Row-major Format +---------------------- + +The multi-dimensional arrays passed to 'fftw_plan_dft' etcetera are +expected to be stored as a single contiguous block in "row-major" order +(sometimes called "C order"). Basically, this means that as you step +through adjacent memory locations, the first dimension's index varies +most slowly and the last dimension's index varies most quickly. + + To be more explicit, let us consider an array of rank d whose +dimensions are n[0] x n[1] x n[2] x ... x n[d-1] . Now, we specify a +location in the array by a sequence of d (zero-based) indices, one for +each dimension: (i[0], i[1], ..., i[d-1]). If the array is stored in +row-major order, then this element is located at the position i[d-1] + +n[d-1] * (i[d-2] + n[d-2] * (... + n[1] * i[0])). + + Note that, for the ordinary complex DFT, each element of the array +must be of type 'fftw_complex'; i.e. a (real, imaginary) pair of +(double-precision) numbers. + + In the advanced FFTW interface, the physical dimensions n from which +the indices are computed can be different from (larger than) the logical +dimensions of the transform to be computed, in order to transform a +subset of a larger array. Note also that, in the advanced interface, +the expression above is multiplied by a "stride" to get the actual array +index--this is useful in situations where each element of the +multi-dimensional array is actually a data structure (or another array), +and you just want to transform a single field. In the basic interface, +however, the stride is 1. + + +File: fftw3.info, Node: Column-major Format, Next: Fixed-size Arrays in C, Prev: Row-major Format, Up: Multi-dimensional Array Format + +3.2.2 Column-major Format +------------------------- + +Readers from the Fortran world are used to arrays stored in +"column-major" order (sometimes called "Fortran order"). This is +essentially the exact opposite of row-major order in that, here, the +_first_ dimension's index varies most quickly. + + If you have an array stored in column-major order and wish to +transform it using FFTW, it is quite easy to do. When creating the +plan, simply pass the dimensions of the array to the planner in _reverse +order_. For example, if your array is a rank three 'N x M x L' matrix +in column-major order, you should pass the dimensions of the array as if +it were an 'L x M x N' matrix (which it is, from the perspective of +FFTW). This is done for you _automatically_ by the FFTW legacy-Fortran +interface (*note Calling FFTW from Legacy Fortran::), but you must do it +manually with the modern Fortran interface (*note Reversing array +dimensions::). + + +File: fftw3.info, Node: Fixed-size Arrays in C, Next: Dynamic Arrays in C, Prev: Column-major Format, Up: Multi-dimensional Array Format + +3.2.3 Fixed-size Arrays in C +---------------------------- + +A multi-dimensional array whose size is declared at compile time in C is +_already_ in row-major order. You don't have to do anything special to +transform it. For example: + + { + fftw_complex data[N0][N1][N2]; + fftw_plan plan; + ... + plan = fftw_plan_dft_3d(N0, N1, N2, &data[0][0][0], &data[0][0][0], + FFTW_FORWARD, FFTW_ESTIMATE); + ... + } + + This will plan a 3d in-place transform of size 'N0 x N1 x N2'. +Notice how we took the address of the zero-th element to pass to the +planner (we could also have used a typecast). + + However, we tend to _discourage_ users from declaring their arrays in +this way, for two reasons. First, this allocates the array on the stack +("automatic" storage), which has a very limited size on most operating +systems (declaring an array with more than a few thousand elements will +often cause a crash). (You can get around this limitation on many +systems by declaring the array as 'static' and/or global, but that has +its own drawbacks.) Second, it may not optimally align the array for +use with a SIMD FFTW (*note SIMD alignment and fftw_malloc::). Instead, +we recommend using 'fftw_malloc', as described below. + + +File: fftw3.info, Node: Dynamic Arrays in C, Next: Dynamic Arrays in C-The Wrong Way, Prev: Fixed-size Arrays in C, Up: Multi-dimensional Array Format + +3.2.4 Dynamic Arrays in C +------------------------- + +We recommend allocating most arrays dynamically, with 'fftw_malloc'. +This isn't too hard to do, although it is not as straightforward for +multi-dimensional arrays as it is for one-dimensional arrays. + + Creating the array is simple: using a dynamic-allocation routine like +'fftw_malloc', allocate an array big enough to store N 'fftw_complex' +values (for a complex DFT), where N is the product of the sizes of the +array dimensions (i.e. the total number of complex values in the +array). For example, here is code to allocate a 5 x 12 x 27 rank-3 +array: + + fftw_complex *an_array; + an_array = (fftw_complex*) fftw_malloc(5*12*27 * sizeof(fftw_complex)); + + Accessing the array elements, however, is more tricky--you can't +simply use multiple applications of the '[]' operator like you could for +fixed-size arrays. Instead, you have to explicitly compute the offset +into the array using the formula given earlier for row-major arrays. +For example, to reference the (i,j,k)-th element of the array allocated +above, you would use the expression 'an_array[k + 27 * (j + 12 * i)]'. + + This pain can be alleviated somewhat by defining appropriate macros, +or, in C++, creating a class and overloading the '()' operator. The +recent C99 standard provides a way to reinterpret the dynamic array as a +"variable-length" multi-dimensional array amenable to '[]', but this +feature is not yet widely supported by compilers. + + +File: fftw3.info, Node: Dynamic Arrays in C-The Wrong Way, Prev: Dynamic Arrays in C, Up: Multi-dimensional Array Format + +3.2.5 Dynamic Arrays in C--The Wrong Way +---------------------------------------- + +A different method for allocating multi-dimensional arrays in C is often +suggested that is incompatible with FFTW: _using it will cause FFTW to +die a painful death_. We discuss the technique here, however, because +it is so commonly known and used. This method is to create arrays of +pointers of arrays of pointers of ...etcetera. For example, the +analogue in this method to the example above is: + + int i,j; + fftw_complex ***a_bad_array; /* another way to make a 5x12x27 array */ + + a_bad_array = (fftw_complex ***) malloc(5 * sizeof(fftw_complex **)); + for (i = 0; i < 5; ++i) { + a_bad_array[i] = + (fftw_complex **) malloc(12 * sizeof(fftw_complex *)); + for (j = 0; j < 12; ++j) + a_bad_array[i][j] = + (fftw_complex *) malloc(27 * sizeof(fftw_complex)); + } + + As you can see, this sort of array is inconvenient to allocate (and +deallocate). On the other hand, it has the advantage that the +(i,j,k)-th element can be referenced simply by 'a_bad_array[i][j][k]'. + + If you like this technique and want to maximize convenience in +accessing the array, but still want to pass the array to FFTW, you can +use a hybrid method. Allocate the array as one contiguous block, but +also declare an array of arrays of pointers that point to appropriate +places in the block. That sort of trick is beyond the scope of this +documentation; for more information on multi-dimensional arrays in C, +see the 'comp.lang.c' FAQ (http://c-faq.com/aryptr/dynmuldimary.html). + + +File: fftw3.info, Node: Words of Wisdom-Saving Plans, Next: Caveats in Using Wisdom, Prev: Multi-dimensional Array Format, Up: Other Important Topics + +3.3 Words of Wisdom--Saving Plans +================================= + +FFTW implements a method for saving plans to disk and restoring them. +In fact, what FFTW does is more general than just saving and loading +plans. The mechanism is called "wisdom". Here, we describe this +feature at a high level. *Note FFTW Reference::, for a less casual but +more complete discussion of how to use wisdom in FFTW. + + Plans created with the 'FFTW_MEASURE', 'FFTW_PATIENT', or +'FFTW_EXHAUSTIVE' options produce near-optimal FFT performance, but may +require a long time to compute because FFTW must measure the runtime of +many possible plans and select the best one. This setup is designed for +the situations where so many transforms of the same size must be +computed that the start-up time is irrelevant. For short initialization +times, but slower transforms, we have provided 'FFTW_ESTIMATE'. The +'wisdom' mechanism is a way to get the best of both worlds: you compute +a good plan once, save it to disk, and later reload it as many times as +necessary. The wisdom mechanism can actually save and reload many plans +at once, not just one. + + Whenever you create a plan, the FFTW planner accumulates wisdom, +which is information sufficient to reconstruct the plan. After +planning, you can save this information to disk by means of the +function: + int fftw_export_wisdom_to_filename(const char *filename); + (This function returns non-zero on success.) + + The next time you run the program, you can restore the wisdom with +'fftw_import_wisdom_from_filename' (which also returns non-zero on +success), and then recreate the plan using the same flags as before. + int fftw_import_wisdom_from_filename(const char *filename); + + Wisdom is automatically used for any size to which it is applicable, +as long as the planner flags are not more "patient" than those with +which the wisdom was created. For example, wisdom created with +'FFTW_MEASURE' can be used if you later plan with 'FFTW_ESTIMATE' or +'FFTW_MEASURE', but not with 'FFTW_PATIENT'. + + The 'wisdom' is cumulative, and is stored in a global, private data +structure managed internally by FFTW. The storage space required is +minimal, proportional to the logarithm of the sizes the wisdom was +generated from. If memory usage is a concern, however, the wisdom can +be forgotten and its associated memory freed by calling: + void fftw_forget_wisdom(void); + + Wisdom can be exported to a file, a string, or any other medium. For +details, see *note Wisdom::. + + +File: fftw3.info, Node: Caveats in Using Wisdom, Prev: Words of Wisdom-Saving Plans, Up: Other Important Topics + +3.4 Caveats in Using Wisdom +=========================== + + For in much wisdom is much grief, and he that increaseth knowledge + increaseth sorrow. [Ecclesiastes 1:18] + + There are pitfalls to using wisdom, in that it can negate FFTW's +ability to adapt to changing hardware and other conditions. For +example, it would be perfectly possible to export wisdom from a program +running on one processor and import it into a program running on another +processor. Doing so, however, would mean that the second program would +use plans optimized for the first processor, instead of the one it is +running on. + + It should be safe to reuse wisdom as long as the hardware and program +binaries remain unchanged. (Actually, the optimal plan may change even +between runs of the same binary on identical hardware, due to +differences in the virtual memory environment, etcetera. Users +seriously interested in performance should worry about this problem, +too.) It is likely that, if the same wisdom is used for two different +program binaries, even running on the same machine, the plans may be +sub-optimal because of differing code alignments. It is therefore wise +to recreate wisdom every time an application is recompiled. The more +the underlying hardware and software changes between the creation of +wisdom and its use, the greater grows the risk of sub-optimal plans. + + Nevertheless, if the choice is between using 'FFTW_ESTIMATE' or using +possibly-suboptimal wisdom (created on the same machine, but for a +different binary), the wisdom is likely to be better. For this reason, +we provide a function to import wisdom from a standard system-wide +location ('/etc/fftw/wisdom' on Unix): + + int fftw_import_system_wisdom(void); + + FFTW also provides a standalone program, 'fftw-wisdom' (described by +its own 'man' page on Unix) with which users can create wisdom, e.g. +for a canonical set of sizes to store in the system wisdom file. *Note +Wisdom Utilities::. + + +File: fftw3.info, Node: FFTW Reference, Next: Multi-threaded FFTW, Prev: Other Important Topics, Up: Top + +4 FFTW Reference +**************** + +This chapter provides a complete reference for all sequential (i.e., +one-processor) FFTW functions. Parallel transforms are described in +later chapters. + +* Menu: + +* Data Types and Files:: +* Using Plans:: +* Basic Interface:: +* Advanced Interface:: +* Guru Interface:: +* New-array Execute Functions:: +* Wisdom:: +* What FFTW Really Computes:: + + +File: fftw3.info, Node: Data Types and Files, Next: Using Plans, Prev: FFTW Reference, Up: FFTW Reference + +4.1 Data Types and Files +======================== + +All programs using FFTW should include its header file: + + #include + + You must also link to the FFTW library. On Unix, this means adding +'-lfftw3 -lm' at the _end_ of the link command. + +* Menu: + +* Complex numbers:: +* Precision:: +* Memory Allocation:: + + +File: fftw3.info, Node: Complex numbers, Next: Precision, Prev: Data Types and Files, Up: Data Types and Files + +4.1.1 Complex numbers +--------------------- + +The default FFTW interface uses 'double' precision for all +floating-point numbers, and defines a 'fftw_complex' type to hold +complex numbers as: + + typedef double fftw_complex[2]; + + Here, the '[0]' element holds the real part and the '[1]' element +holds the imaginary part. + + Alternatively, if you have a C compiler (such as 'gcc') that supports +the C99 revision of the ANSI C standard, you can use C's new native +complex type (which is binary-compatible with the typedef above). In +particular, if you '#include ' _before_ '', then +'fftw_complex' is defined to be the native complex type and you can +manipulate it with ordinary arithmetic (e.g. 'x = y * (3+4*I)', where +'x' and 'y' are 'fftw_complex' and 'I' is the standard symbol for the +imaginary unit); + + C++ has its own 'complex' template class, defined in the standard +'' header file. Reportedly, the C++ standards committee has +recently agreed to mandate that the storage format used for this type be +binary-compatible with the C99 type, i.e. an array 'T[2]' with +consecutive real '[0]' and imaginary '[1]' parts. (See report +.) Although not part of the official standard as of this +writing, the proposal stated that: "This solution has been tested with +all current major implementations of the standard library and shown to +be working." To the extent that this is true, if you have a variable +'complex *x', you can pass it directly to FFTW via +'reinterpret_cast(x)'. + + +File: fftw3.info, Node: Precision, Next: Memory Allocation, Prev: Complex numbers, Up: Data Types and Files + +4.1.2 Precision +--------------- + +You can install single and long-double precision versions of FFTW, which +replace 'double' with 'float' and 'long double', respectively (*note +Installation and Customization::). To use these interfaces, you: + + * Link to the single/long-double libraries; on Unix, '-lfftw3f' or + '-lfftw3l' instead of (or in addition to) '-lfftw3'. (You can link + to the different-precision libraries simultaneously.) + + * Include the _same_ '' header file. + + * Replace all lowercase instances of 'fftw_' with 'fftwf_' or + 'fftwl_' for single or long-double precision, respectively. + ('fftw_complex' becomes 'fftwf_complex', 'fftw_execute' becomes + 'fftwf_execute', etcetera.) + + * Uppercase names, i.e. names beginning with 'FFTW_', remain the + same. + + * Replace 'double' with 'float' or 'long double' for subroutine + parameters. + + Depending upon your compiler and/or hardware, 'long double' may not +be any more precise than 'double' (or may not be supported at all, +although it is standard in C99). + + We also support using the nonstandard '__float128' +quadruple-precision type provided by recent versions of 'gcc' on 32- and +64-bit x86 hardware (*note Installation and Customization::). To use +this type, link with '-lfftw3q -lquadmath -lm' (the 'libquadmath' +library provided by 'gcc' is needed for quadruple-precision +trigonometric functions) and use 'fftwq_' identifiers. + + +File: fftw3.info, Node: Memory Allocation, Prev: Precision, Up: Data Types and Files + +4.1.3 Memory Allocation +----------------------- + + void *fftw_malloc(size_t n); + void fftw_free(void *p); + + These are functions that behave identically to 'malloc' and 'free', +except that they guarantee that the returned pointer obeys any special +alignment restrictions imposed by any algorithm in FFTW (e.g. for SIMD +acceleration). *Note SIMD alignment and fftw_malloc::. + + Data allocated by 'fftw_malloc' _must_ be deallocated by 'fftw_free' +and not by the ordinary 'free'. + + These routines simply call through to your operating system's +'malloc' or, if necessary, its aligned equivalent (e.g. 'memalign'), so +you normally need not worry about any significant time or space +overhead. You are _not required_ to use them to allocate your data, but +we strongly recommend it. + + Note: in C++, just as with ordinary 'malloc', you must typecast the +output of 'fftw_malloc' to whatever pointer type you are allocating. + + We also provide the following two convenience functions to allocate +real and complex arrays with 'n' elements, which are equivalent to +'(double *) fftw_malloc(sizeof(double) * n)' and '(fftw_complex *) +fftw_malloc(sizeof(fftw_complex) * n)', respectively: + + double *fftw_alloc_real(size_t n); + fftw_complex *fftw_alloc_complex(size_t n); + + The equivalent functions in other precisions allocate arrays of 'n' +elements in that precision. e.g. 'fftwf_alloc_real(n)' is equivalent +to '(float *) fftwf_malloc(sizeof(float) * n)'. + + +File: fftw3.info, Node: Using Plans, Next: Basic Interface, Prev: Data Types and Files, Up: FFTW Reference + +4.2 Using Plans +=============== + +Plans for all transform types in FFTW are stored as type 'fftw_plan' (an +opaque pointer type), and are created by one of the various planning +routines described in the following sections. An 'fftw_plan' contains +all information necessary to compute the transform, including the +pointers to the input and output arrays. + + void fftw_execute(const fftw_plan plan); + + This executes the 'plan', to compute the corresponding transform on +the arrays for which it was planned (which must still exist). The plan +is not modified, and 'fftw_execute' can be called as many times as +desired. + + To apply a given plan to a different array, you can use the new-array +execute interface. *Note New-array Execute Functions::. + + 'fftw_execute' (and equivalents) is the only function in FFTW +guaranteed to be thread-safe; see *note Thread safety::. + + This function: + void fftw_destroy_plan(fftw_plan plan); + deallocates the 'plan' and all its associated data. + + FFTW's planner saves some other persistent data, such as the +accumulated wisdom and a list of algorithms available in the current +configuration. If you want to deallocate all of that and reset FFTW to +the pristine state it was in when you started your program, you can +call: + + void fftw_cleanup(void); + + After calling 'fftw_cleanup', all existing plans become undefined, +and you should not attempt to execute them nor to destroy them. You can +however create and execute/destroy new plans, in which case FFTW starts +accumulating wisdom information again. + + 'fftw_cleanup' does not deallocate your plans, however. To prevent +memory leaks, you must still call 'fftw_destroy_plan' before executing +'fftw_cleanup'. + + Occasionally, it may useful to know FFTW's internal "cost" metric +that it uses to compare plans to one another; this cost is proportional +to an execution time of the plan, in undocumented units, if the plan was +created with the 'FFTW_MEASURE' or other timing-based options, or +alternatively is a heuristic cost function for 'FFTW_ESTIMATE' plans. +(The cost values of measured and estimated plans are not comparable, +being in different units. Also, costs from different FFTW versions or +the same version compiled differently may not be in the same units. +Plans created from wisdom have a cost of 0 since no timing measurement +is performed for them. Finally, certain problems for which only one +top-level algorithm was possible may have required no measurements of +the cost of the whole plan, in which case 'fftw_cost' will also return +0.) The cost metric for a given plan is returned by: + + double fftw_cost(const fftw_plan plan); + + The following two routines are provided purely for academic purposes +(that is, for entertainment). + + void fftw_flops(const fftw_plan plan, + double *add, double *mul, double *fma); + + Given a 'plan', set 'add', 'mul', and 'fma' to an exact count of the +number of floating-point additions, multiplications, and fused +multiply-add operations involved in the plan's execution. The total +number of floating-point operations (flops) is 'add + mul + 2*fma', or +'add + mul + fma' if the hardware supports fused multiply-add +instructions (although the number of FMA operations is only approximate +because of compiler voodoo). (The number of operations should be an +integer, but we use 'double' to avoid overflowing 'int' for large +transforms; the arguments are of type 'double' even for single and +long-double precision versions of FFTW.) + + void fftw_fprint_plan(const fftw_plan plan, FILE *output_file); + void fftw_print_plan(const fftw_plan plan); + char *fftw_sprint_plan(const fftw_plan plan); + + This outputs a "nerd-readable" representation of the 'plan' to the +given file, to 'stdout', or two a newly allocated NUL-terminated string +(which the caller is responsible for deallocating with 'free'), +respectively. + + +File: fftw3.info, Node: Basic Interface, Next: Advanced Interface, Prev: Using Plans, Up: FFTW Reference + +4.3 Basic Interface +=================== + +Recall that the FFTW API is divided into three parts(1): the "basic +interface" computes a single transform of contiguous data, the "advanced +interface" computes transforms of multiple or strided arrays, and the +"guru interface" supports the most general data layouts, multiplicities, +and strides. This section describes the the basic interface, which we +expect to satisfy the needs of most users. + +* Menu: + +* Complex DFTs:: +* Planner Flags:: +* Real-data DFTs:: +* Real-data DFT Array Format:: +* Real-to-Real Transforms:: +* Real-to-Real Transform Kinds:: + + ---------- Footnotes ---------- + + (1) Gallia est omnis divisa in partes tres (Julius Caesar). + + +File: fftw3.info, Node: Complex DFTs, Next: Planner Flags, Prev: Basic Interface, Up: Basic Interface + +4.3.1 Complex DFTs +------------------ + + fftw_plan fftw_plan_dft_1d(int n0, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + fftw_plan fftw_plan_dft_2d(int n0, int n1, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + fftw_plan fftw_plan_dft_3d(int n0, int n1, int n2, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + fftw_plan fftw_plan_dft(int rank, const int *n, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + + Plan a complex input/output discrete Fourier transform (DFT) in zero +or more dimensions, returning an 'fftw_plan' (*note Using Plans::). + + Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). + + The planner returns 'NULL' if the plan cannot be created. In the +standard FFTW distribution, the basic interface is guaranteed to return +a non-'NULL' plan. A plan may be 'NULL', however, if you are using a +customized FFTW configuration supporting a restricted set of transforms. + +Arguments +......... + + * 'rank' is the rank of the transform (it should be the size of the + array '*n'), and can be any non-negative integer. (*Note Complex + Multi-Dimensional DFTs::, for the definition of "rank".) The + '_1d', '_2d', and '_3d' planners correspond to a 'rank' of '1', + '2', and '3', respectively. The rank may be zero, which is + equivalent to a rank-1 transform of size 1, i.e. a copy of one + number from input to output. + + * 'n0', 'n1', 'n2', or 'n[0..rank-1]' (as appropriate for each + routine) specify the size of the transform dimensions. They can be + any positive integer. + + - Multi-dimensional arrays are stored in row-major order with + dimensions: 'n0' x 'n1'; or 'n0' x 'n1' x 'n2'; or 'n[0]' x + 'n[1]' x ... x 'n[rank-1]'. *Note Multi-dimensional Array + Format::. + - FFTW is best at handling sizes of the form 2^a 3^b 5^c 7^d + 11^e 13^f, where e+f is either 0 or 1, and the other exponents + are arbitrary. Other sizes are computed by means of a slow, + general-purpose algorithm (which nevertheless retains O(n log + n) performance even for prime sizes). It is possible to + customize FFTW for different array sizes; see *note + Installation and Customization::. Transforms whose sizes are + powers of 2 are especially fast. + + * 'in' and 'out' point to the input and output arrays of the + transform, which may be the same (yielding an in-place transform). + These arrays are overwritten during planning, unless + 'FFTW_ESTIMATE' is used in the flags. (The arrays need not be + initialized, but they must be allocated.) + + If 'in == out', the transform is "in-place" and the input array is + overwritten. If 'in != out', the two arrays must not overlap (but + FFTW does not check for this condition). + + * 'sign' is the sign of the exponent in the formula that defines the + Fourier transform. It can be -1 (= 'FFTW_FORWARD') or +1 (= + 'FFTW_BACKWARD'). + + * 'flags' is a bitwise OR ('|') of zero or more planner flags, as + defined in *note Planner Flags::. + + FFTW computes an unnormalized transform: computing a forward followed +by a backward transform (or vice versa) will result in the original data +multiplied by the size of the transform (the product of the dimensions). +For more information, see *note What FFTW Really Computes::. + + +File: fftw3.info, Node: Planner Flags, Next: Real-data DFTs, Prev: Complex DFTs, Up: Basic Interface + +4.3.2 Planner Flags +------------------- + +All of the planner routines in FFTW accept an integer 'flags' argument, +which is a bitwise OR ('|') of zero or more of the flag constants +defined below. These flags control the rigor (and time) of the planning +process, and can also impose (or lift) restrictions on the type of +transform algorithm that is employed. + + _Important:_ the planner overwrites the input array during planning +unless a saved plan (*note Wisdom::) is available for that problem, so +you should initialize your input data after creating the plan. The only +exceptions to this are the 'FFTW_ESTIMATE' and 'FFTW_WISDOM_ONLY' flags, +as mentioned below. + + In all cases, if wisdom is available for the given problem that was +created with equal-or-greater planning rigor, then the more rigorous +wisdom is used. For example, in 'FFTW_ESTIMATE' mode any available +wisdom is used, whereas in 'FFTW_PATIENT' mode only wisdom created in +patient or exhaustive mode can be used. *Note Words of Wisdom-Saving +Plans::. + +Planning-rigor flags +.................... + + * 'FFTW_ESTIMATE' specifies that, instead of actual measurements of + different algorithms, a simple heuristic is used to pick a + (probably sub-optimal) plan quickly. With this flag, the + input/output arrays are not overwritten during planning. + + * 'FFTW_MEASURE' tells FFTW to find an optimized plan by actually + _computing_ several FFTs and measuring their execution time. + Depending on your machine, this can take some time (often a few + seconds). 'FFTW_MEASURE' is the default planning option. + + * 'FFTW_PATIENT' is like 'FFTW_MEASURE', but considers a wider range + of algorithms and often produces a "more optimal" plan (especially + for large transforms), but at the expense of several times longer + planning time (especially for large transforms). + + * 'FFTW_EXHAUSTIVE' is like 'FFTW_PATIENT', but considers an even + wider range of algorithms, including many that we think are + unlikely to be fast, to produce the most optimal plan but with a + substantially increased planning time. + + * 'FFTW_WISDOM_ONLY' is a special planning mode in which the plan is + only created if wisdom is available for the given problem, and + otherwise a 'NULL' plan is returned. This can be combined with + other flags, e.g. 'FFTW_WISDOM_ONLY | FFTW_PATIENT' creates a plan + only if wisdom is available that was created in 'FFTW_PATIENT' or + 'FFTW_EXHAUSTIVE' mode. The 'FFTW_WISDOM_ONLY' flag is intended + for users who need to detect whether wisdom is available; for + example, if wisdom is not available one may wish to allocate new + arrays for planning so that user data is not overwritten. + +Algorithm-restriction flags +........................... + + * 'FFTW_DESTROY_INPUT' specifies that an out-of-place transform is + allowed to _overwrite its input_ array with arbitrary data; this + can sometimes allow more efficient algorithms to be employed. + + * 'FFTW_PRESERVE_INPUT' specifies that an out-of-place transform must + _not change its input_ array. This is ordinarily the _default_, + except for c2r and hc2r (i.e. complex-to-real) transforms for + which 'FFTW_DESTROY_INPUT' is the default. In the latter cases, + passing 'FFTW_PRESERVE_INPUT' will attempt to use algorithms that + do not destroy the input, at the expense of worse performance; for + multi-dimensional c2r transforms, however, no input-preserving + algorithms are implemented and the planner will return 'NULL' if + one is requested. + + * 'FFTW_UNALIGNED' specifies that the algorithm may not impose any + unusual alignment requirements on the input/output arrays (i.e. no + SIMD may be used). This flag is normally _not necessary_, since + the planner automatically detects misaligned arrays. The only use + for this flag is if you want to use the new-array execute interface + to execute a given plan on a different array that may not be + aligned like the original. (Using 'fftw_malloc' makes this flag + unnecessary even then. You can also use 'fftw_alignment_of' to + detect whether two arrays are equivalently aligned.) + +Limiting planning time +...................... + + extern void fftw_set_timelimit(double seconds); + + This function instructs FFTW to spend at most 'seconds' seconds +(approximately) in the planner. If 'seconds == FFTW_NO_TIMELIMIT' (the +default value, which is negative), then planning time is unbounded. +Otherwise, FFTW plans with a progressively wider range of algorithms +until the the given time limit is reached or the given range of +algorithms is explored, returning the best available plan. + + For example, specifying 'FFTW_PATIENT' first plans in 'FFTW_ESTIMATE' +mode, then in 'FFTW_MEASURE' mode, then finally (time permitting) in +'FFTW_PATIENT'. If 'FFTW_EXHAUSTIVE' is specified instead, the planner +will further progress to 'FFTW_EXHAUSTIVE' mode. + + Note that the 'seconds' argument specifies only a rough limit; in +practice, the planner may use somewhat more time if the time limit is +reached when the planner is in the middle of an operation that cannot be +interrupted. At the very least, the planner will complete planning in +'FFTW_ESTIMATE' mode (which is thus equivalent to a time limit of 0). + + +File: fftw3.info, Node: Real-data DFTs, Next: Real-data DFT Array Format, Prev: Planner Flags, Up: Basic Interface + +4.3.3 Real-data DFTs +-------------------- + + fftw_plan fftw_plan_dft_r2c_1d(int n0, + double *in, fftw_complex *out, + unsigned flags); + fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1, + double *in, fftw_complex *out, + unsigned flags); + fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2, + double *in, fftw_complex *out, + unsigned flags); + fftw_plan fftw_plan_dft_r2c(int rank, const int *n, + double *in, fftw_complex *out, + unsigned flags); + + Plan a real-input/complex-output discrete Fourier transform (DFT) in +zero or more dimensions, returning an 'fftw_plan' (*note Using Plans::). + + Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). + + The planner returns 'NULL' if the plan cannot be created. A +non-'NULL' plan is always returned by the basic interface unless you are +using a customized FFTW configuration supporting a restricted set of +transforms, or if you use the 'FFTW_PRESERVE_INPUT' flag with a +multi-dimensional out-of-place c2r transform (see below). + +Arguments +......... + + * 'rank' is the rank of the transform (it should be the size of the + array '*n'), and can be any non-negative integer. (*Note Complex + Multi-Dimensional DFTs::, for the definition of "rank".) The + '_1d', '_2d', and '_3d' planners correspond to a 'rank' of '1', + '2', and '3', respectively. The rank may be zero, which is + equivalent to a rank-1 transform of size 1, i.e. a copy of one + real number (with zero imaginary part) from input to output. + + * 'n0', 'n1', 'n2', or 'n[0..rank-1]', (as appropriate for each + routine) specify the size of the transform dimensions. They can be + any positive integer. This is different in general from the + _physical_ array dimensions, which are described in *note Real-data + DFT Array Format::. + + - FFTW is best at handling sizes of the form 2^a 3^b 5^c 7^d + 11^e 13^f, where e+f is either 0 or 1, and the other exponents + are arbitrary. Other sizes are computed by means of a slow, + general-purpose algorithm (which nevertheless retains O(n log + n) performance even for prime sizes). (It is possible to + customize FFTW for different array sizes; see *note + Installation and Customization::.) Transforms whose sizes are + powers of 2 are especially fast, and it is generally + beneficial for the _last_ dimension of an r2c/c2r transform to + be _even_. + + * 'in' and 'out' point to the input and output arrays of the + transform, which may be the same (yielding an in-place transform). + These arrays are overwritten during planning, unless + 'FFTW_ESTIMATE' is used in the flags. (The arrays need not be + initialized, but they must be allocated.) For an in-place + transform, it is important to remember that the real array will + require padding, described in *note Real-data DFT Array Format::. + + * 'flags' is a bitwise OR ('|') of zero or more planner flags, as + defined in *note Planner Flags::. + + The inverse transforms, taking complex input (storing the +non-redundant half of a logically Hermitian array) to real output, are +given by: + + fftw_plan fftw_plan_dft_c2r_1d(int n0, + fftw_complex *in, double *out, + unsigned flags); + fftw_plan fftw_plan_dft_c2r_2d(int n0, int n1, + fftw_complex *in, double *out, + unsigned flags); + fftw_plan fftw_plan_dft_c2r_3d(int n0, int n1, int n2, + fftw_complex *in, double *out, + unsigned flags); + fftw_plan fftw_plan_dft_c2r(int rank, const int *n, + fftw_complex *in, double *out, + unsigned flags); + + The arguments are the same as for the r2c transforms, except that the +input and output data formats are reversed. + + FFTW computes an unnormalized transform: computing an r2c followed by +a c2r transform (or vice versa) will result in the original data +multiplied by the size of the transform (the product of the logical +dimensions). An r2c transform produces the same output as a +'FFTW_FORWARD' complex DFT of the same input, and a c2r transform is +correspondingly equivalent to 'FFTW_BACKWARD'. For more information, +see *note What FFTW Really Computes::. + + +File: fftw3.info, Node: Real-data DFT Array Format, Next: Real-to-Real Transforms, Prev: Real-data DFTs, Up: Basic Interface + +4.3.4 Real-data DFT Array Format +-------------------------------- + +The output of a DFT of real data (r2c) contains symmetries that, in +principle, make half of the outputs redundant (*note What FFTW Really +Computes::). (Similarly for the input of an inverse c2r transform.) In +practice, it is not possible to entirely realize these savings in an +efficient and understandable format that generalizes to +multi-dimensional transforms. Instead, the output of the r2c transforms +is _slightly_ over half of the output of the corresponding complex +transform. We do not "pack" the data in any way, but store it as an +ordinary array of 'fftw_complex' values. In fact, this data is simply a +subsection of what would be the array in the corresponding complex +transform. + + Specifically, for a real transform of d (= 'rank') dimensions n[0] x +n[1] x n[2] x ... x n[d-1] , the complex data is an n[0] x n[1] x n[2] +x ... x (n[d-1]/2 + 1) array of 'fftw_complex' values in row-major +order (with the division rounded down). That is, we only store the +_lower_ half (non-negative frequencies), plus one element, of the last +dimension of the data from the ordinary complex transform. (We could +have instead taken half of any other dimension, but implementation turns +out to be simpler if the last, contiguous, dimension is used.) + + For an out-of-place transform, the real data is simply an array with +physical dimensions n[0] x n[1] x n[2] x ... x n[d-1] in row-major +order. + + For an in-place transform, some complications arise since the complex +data is slightly larger than the real data. In this case, the final +dimension of the real data must be _padded_ with extra values to +accommodate the size of the complex data--two extra if the last +dimension is even and one if it is odd. That is, the last dimension of +the real data must physically contain 2 * (n[d-1]/2+1) 'double' values +(exactly enough to hold the complex data). This physical array size +does not, however, change the _logical_ array size--only n[d-1] values +are actually stored in the last dimension, and n[d-1] is the last +dimension passed to the planner. + + +File: fftw3.info, Node: Real-to-Real Transforms, Next: Real-to-Real Transform Kinds, Prev: Real-data DFT Array Format, Up: Basic Interface + +4.3.5 Real-to-Real Transforms +----------------------------- + + fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out, + fftw_r2r_kind kind, unsigned flags); + fftw_plan fftw_plan_r2r_2d(int n0, int n1, double *in, double *out, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, + unsigned flags); + fftw_plan fftw_plan_r2r_3d(int n0, int n1, int n2, + double *in, double *out, + fftw_r2r_kind kind0, + fftw_r2r_kind kind1, + fftw_r2r_kind kind2, + unsigned flags); + fftw_plan fftw_plan_r2r(int rank, const int *n, double *in, double *out, + const fftw_r2r_kind *kind, unsigned flags); + + Plan a real input/output (r2r) transform of various kinds in zero or +more dimensions, returning an 'fftw_plan' (*note Using Plans::). + + Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). + + The planner returns 'NULL' if the plan cannot be created. A +non-'NULL' plan is always returned by the basic interface unless you are +using a customized FFTW configuration supporting a restricted set of +transforms, or for size-1 'FFTW_REDFT00' kinds (which are not defined). + +Arguments +......... + + * 'rank' is the dimensionality of the transform (it should be the + size of the arrays '*n' and '*kind'), and can be any non-negative + integer. The '_1d', '_2d', and '_3d' planners correspond to a + 'rank' of '1', '2', and '3', respectively. A 'rank' of zero is + equivalent to a copy of one number from input to output. + + * 'n', or 'n0'/'n1'/'n2', or 'n[rank]', respectively, gives the + (physical) size of the transform dimensions. They can be any + positive integer. + + - Multi-dimensional arrays are stored in row-major order with + dimensions: 'n0' x 'n1'; or 'n0' x 'n1' x 'n2'; or 'n[0]' x + 'n[1]' x ... x 'n[rank-1]'. *Note Multi-dimensional Array + Format::. + - FFTW is generally best at handling sizes of the form 2^a 3^b + 5^c 7^d 11^e 13^f, where e+f is either 0 or 1, and the other + exponents are arbitrary. Other sizes are computed by means of + a slow, general-purpose algorithm (which nevertheless retains + O(n log n) performance even for prime sizes). (It is possible + to customize FFTW for different array sizes; see *note + Installation and Customization::.) Transforms whose sizes are + powers of 2 are especially fast. + - For a 'REDFT00' or 'RODFT00' transform kind in a dimension of + size n, it is n-1 or n+1, respectively, that should be + factorizable in the above form. + + * 'in' and 'out' point to the input and output arrays of the + transform, which may be the same (yielding an in-place transform). + These arrays are overwritten during planning, unless + 'FFTW_ESTIMATE' is used in the flags. (The arrays need not be + initialized, but they must be allocated.) + + * 'kind', or 'kind0'/'kind1'/'kind2', or 'kind[rank]', is the kind of + r2r transform used for the corresponding dimension. The valid kind + constants are described in *note Real-to-Real Transform Kinds::. + In a multi-dimensional transform, what is computed is the separable + product formed by taking each transform kind along the + corresponding dimension, one dimension after another. + + * 'flags' is a bitwise OR ('|') of zero or more planner flags, as + defined in *note Planner Flags::. + + +File: fftw3.info, Node: Real-to-Real Transform Kinds, Prev: Real-to-Real Transforms, Up: Basic Interface + +4.3.6 Real-to-Real Transform Kinds +---------------------------------- + +FFTW currently supports 11 different r2r transform kinds, specified by +one of the constants below. For the precise definitions of these +transforms, see *note What FFTW Really Computes::. For a more +colloquial introduction to these transform kinds, see *note More DFTs of +Real Data::. + + For dimension of size 'n', there is a corresponding "logical" +dimension 'N' that determines the normalization (and the optimal +factorization); the formula for 'N' is given for each kind below. Also, +with each transform kind is listed its corrsponding inverse transform. +FFTW computes unnormalized transforms: a transform followed by its +inverse will result in the original data multiplied by 'N' (or the +product of the 'N''s for each dimension, in multi-dimensions). + + * 'FFTW_R2HC' computes a real-input DFT with output in "halfcomplex" + format, i.e. real and imaginary parts for a transform of size 'n' + stored as: r0, r1, r2, r(n/2), i((n+1)/2-1), ..., i2, i1 (Logical + 'N=n', inverse is 'FFTW_HC2R'.) + + * 'FFTW_HC2R' computes the reverse of 'FFTW_R2HC', above. (Logical + 'N=n', inverse is 'FFTW_R2HC'.) + + * 'FFTW_DHT' computes a discrete Hartley transform. (Logical 'N=n', + inverse is 'FFTW_DHT'.) + + * 'FFTW_REDFT00' computes an REDFT00 transform, i.e. a DCT-I. + (Logical 'N=2*(n-1)', inverse is 'FFTW_REDFT00'.) + + * 'FFTW_REDFT10' computes an REDFT10 transform, i.e. a DCT-II + (sometimes called "the" DCT). (Logical 'N=2*n', inverse is + 'FFTW_REDFT01'.) + + * 'FFTW_REDFT01' computes an REDFT01 transform, i.e. a DCT-III + (sometimes called "the" IDCT, being the inverse of DCT-II). + (Logical 'N=2*n', inverse is 'FFTW_REDFT=10'.) + + * 'FFTW_REDFT11' computes an REDFT11 transform, i.e. a DCT-IV. + (Logical 'N=2*n', inverse is 'FFTW_REDFT11'.) + + * 'FFTW_RODFT00' computes an RODFT00 transform, i.e. a DST-I. + (Logical 'N=2*(n+1)', inverse is 'FFTW_RODFT00'.) + + * 'FFTW_RODFT10' computes an RODFT10 transform, i.e. a DST-II. + (Logical 'N=2*n', inverse is 'FFTW_RODFT01'.) + + * 'FFTW_RODFT01' computes an RODFT01 transform, i.e. a DST-III. + (Logical 'N=2*n', inverse is 'FFTW_RODFT=10'.) + + * 'FFTW_RODFT11' computes an RODFT11 transform, i.e. a DST-IV. + (Logical 'N=2*n', inverse is 'FFTW_RODFT11'.) + + +File: fftw3.info, Node: Advanced Interface, Next: Guru Interface, Prev: Basic Interface, Up: FFTW Reference + +4.4 Advanced Interface +====================== + +FFTW's "advanced" interface supplements the basic interface with four +new planner routines, providing a new level of flexibility: you can plan +a transform of multiple arrays simultaneously, operate on non-contiguous +(strided) data, and transform a subset of a larger multi-dimensional +array. Other than these additional features, the planner operates in +the same fashion as in the basic interface, and the resulting +'fftw_plan' is used in the same way (*note Using Plans::). + +* Menu: + +* Advanced Complex DFTs:: +* Advanced Real-data DFTs:: +* Advanced Real-to-real Transforms:: + + +File: fftw3.info, Node: Advanced Complex DFTs, Next: Advanced Real-data DFTs, Prev: Advanced Interface, Up: Advanced Interface + +4.4.1 Advanced Complex DFTs +--------------------------- + + fftw_plan fftw_plan_many_dft(int rank, const int *n, int howmany, + fftw_complex *in, const int *inembed, + int istride, int idist, + fftw_complex *out, const int *onembed, + int ostride, int odist, + int sign, unsigned flags); + + This routine plans multiple multidimensional complex DFTs, and it +extends the 'fftw_plan_dft' routine (*note Complex DFTs::) to compute +'howmany' transforms, each having rank 'rank' and size 'n'. In +addition, the transform data need not be contiguous, but it may be laid +out in memory with an arbitrary stride. To account for these +possibilities, 'fftw_plan_many_dft' adds the new parameters 'howmany', +{'i','o'}'nembed', {'i','o'}'stride', and {'i','o'}'dist'. The FFTW +basic interface (*note Complex DFTs::) provides routines specialized for +ranks 1, 2, and 3, but the advanced interface handles only the +general-rank case. + + 'howmany' is the (nonnegative) number of transforms to compute. The +resulting plan computes 'howmany' transforms, where the input of the +'k'-th transform is at location 'in+k*idist' (in C pointer arithmetic), +and its output is at location 'out+k*odist'. Plans obtained in this way +can often be faster than calling FFTW multiple times for the individual +transforms. The basic 'fftw_plan_dft' interface corresponds to +'howmany=1' (in which case the 'dist' parameters are ignored). + + Each of the 'howmany' transforms has rank 'rank' and size 'n', as in +the basic interface. In addition, the advanced interface allows the +input and output arrays of each transform to be row-major subarrays of +larger rank-'rank' arrays, described by 'inembed' and 'onembed' +parameters, respectively. {'i','o'}'nembed' must be arrays of length +'rank', and 'n' should be elementwise less than or equal to +{'i','o'}'nembed'. Passing 'NULL' for an 'nembed' parameter is +equivalent to passing 'n' (i.e. same physical and logical dimensions, +as in the basic interface.) + + The 'stride' parameters indicate that the 'j'-th element of the input +or output arrays is located at 'j*istride' or 'j*ostride', respectively. +(For a multi-dimensional array, 'j' is the ordinary row-major index.) +When combined with the 'k'-th transform in a 'howmany' loop, from above, +this means that the ('j','k')-th element is at 'j*stride+k*dist'. (The +basic 'fftw_plan_dft' interface corresponds to a stride of 1.) + + For in-place transforms, the input and output 'stride' and 'dist' +parameters should be the same; otherwise, the planner may return 'NULL'. + + Arrays 'n', 'inembed', and 'onembed' are not used after this function +returns. You can safely free or reuse them. + + *Examples*: One transform of one 5 by 6 array contiguous in memory: + int rank = 2; + int n[] = {5, 6}; + int howmany = 1; + int idist = odist = 0; /* unused because howmany = 1 */ + int istride = ostride = 1; /* array is contiguous in memory */ + int *inembed = n, *onembed = n; + + Transform of three 5 by 6 arrays, each contiguous in memory, stored +in memory one after another: + int rank = 2; + int n[] = {5, 6}; + int howmany = 3; + int idist = odist = n[0]*n[1]; /* = 30, the distance in memory + between the first element + of the first array and the + first element of the second array */ + int istride = ostride = 1; /* array is contiguous in memory */ + int *inembed = n, *onembed = n; + + Transform each column of a 2d array with 10 rows and 3 columns: + int rank = 1; /* not 2: we are computing 1d transforms */ + int n[] = {10}; /* 1d transforms of length 10 */ + int howmany = 3; + int idist = odist = 1; + int istride = ostride = 3; /* distance between two elements in + the same column */ + int *inembed = n, *onembed = n; + + +File: fftw3.info, Node: Advanced Real-data DFTs, Next: Advanced Real-to-real Transforms, Prev: Advanced Complex DFTs, Up: Advanced Interface + +4.4.2 Advanced Real-data DFTs +----------------------------- + + fftw_plan fftw_plan_many_dft_r2c(int rank, const int *n, int howmany, + double *in, const int *inembed, + int istride, int idist, + fftw_complex *out, const int *onembed, + int ostride, int odist, + unsigned flags); + fftw_plan fftw_plan_many_dft_c2r(int rank, const int *n, int howmany, + fftw_complex *in, const int *inembed, + int istride, int idist, + double *out, const int *onembed, + int ostride, int odist, + unsigned flags); + + Like 'fftw_plan_many_dft', these two functions add 'howmany', +'nembed', 'stride', and 'dist' parameters to the 'fftw_plan_dft_r2c' and +'fftw_plan_dft_c2r' functions, but otherwise behave the same as the +basic interface. + + The interpretation of 'howmany', 'stride', and 'dist' are the same as +for 'fftw_plan_many_dft', above. Note that the 'stride' and 'dist' for +the real array are in units of 'double', and for the complex array are +in units of 'fftw_complex'. + + If an 'nembed' parameter is 'NULL', it is interpreted as what it +would be in the basic interface, as described in *note Real-data DFT +Array Format::. That is, for the complex array the size is assumed to +be the same as 'n', but with the last dimension cut roughly in half. +For the real array, the size is assumed to be 'n' if the transform is +out-of-place, or 'n' with the last dimension "padded" if the transform +is in-place. + + If an 'nembed' parameter is non-'NULL', it is interpreted as the +physical size of the corresponding array, in row-major order, just as +for 'fftw_plan_many_dft'. In this case, each dimension of 'nembed' +should be '>=' what it would be in the basic interface (e.g. the halved +or padded 'n'). + + Arrays 'n', 'inembed', and 'onembed' are not used after this function +returns. You can safely free or reuse them. + + +File: fftw3.info, Node: Advanced Real-to-real Transforms, Prev: Advanced Real-data DFTs, Up: Advanced Interface + +4.4.3 Advanced Real-to-real Transforms +-------------------------------------- + + fftw_plan fftw_plan_many_r2r(int rank, const int *n, int howmany, + double *in, const int *inembed, + int istride, int idist, + double *out, const int *onembed, + int ostride, int odist, + const fftw_r2r_kind *kind, unsigned flags); + + Like 'fftw_plan_many_dft', this functions adds 'howmany', 'nembed', +'stride', and 'dist' parameters to the 'fftw_plan_r2r' function, but +otherwise behave the same as the basic interface. The interpretation of +those additional parameters are the same as for 'fftw_plan_many_dft'. +(Of course, the 'stride' and 'dist' parameters are now in units of +'double', not 'fftw_complex'.) + + Arrays 'n', 'inembed', 'onembed', and 'kind' are not used after this +function returns. You can safely free or reuse them. + + +File: fftw3.info, Node: Guru Interface, Next: New-array Execute Functions, Prev: Advanced Interface, Up: FFTW Reference + +4.5 Guru Interface +================== + +The "guru" interface to FFTW is intended to expose as much as possible +of the flexibility in the underlying FFTW architecture. It allows one +to compute multi-dimensional "vectors" (loops) of multi-dimensional +transforms, where each vector/transform dimension has an independent +size and stride. One can also use more general complex-number formats, +e.g. separate real and imaginary arrays. + + For those users who require the flexibility of the guru interface, it +is important that they pay special attention to the documentation lest +they shoot themselves in the foot. + +* Menu: + +* Interleaved and split arrays:: +* Guru vector and transform sizes:: +* Guru Complex DFTs:: +* Guru Real-data DFTs:: +* Guru Real-to-real Transforms:: +* 64-bit Guru Interface:: + + +File: fftw3.info, Node: Interleaved and split arrays, Next: Guru vector and transform sizes, Prev: Guru Interface, Up: Guru Interface + +4.5.1 Interleaved and split arrays +---------------------------------- + +The guru interface supports two representations of complex numbers, +which we call the interleaved and the split format. + + The "interleaved" format is the same one used by the basic and +advanced interfaces, and it is documented in *note Complex numbers::. +In the interleaved format, you provide pointers to the real part of a +complex number, and the imaginary part understood to be stored in the +next memory location. + + The "split" format allows separate pointers to the real and imaginary +parts of a complex array. + + Technically, the interleaved format is redundant, because you can +always express an interleaved array in terms of a split array with +appropriate pointers and strides. On the other hand, the interleaved +format is simpler to use, and it is common in practice. Hence, FFTW +supports it as a special case. + + +File: fftw3.info, Node: Guru vector and transform sizes, Next: Guru Complex DFTs, Prev: Interleaved and split arrays, Up: Guru Interface + +4.5.2 Guru vector and transform sizes +------------------------------------- + +The guru interface introduces one basic new data structure, +'fftw_iodim', that is used to specify sizes and strides for +multi-dimensional transforms and vectors: + + typedef struct { + int n; + int is; + int os; + } fftw_iodim; + + Here, 'n' is the size of the dimension, and 'is' and 'os' are the +strides of that dimension for the input and output arrays. (The stride +is the separation of consecutive elements along this dimension.) + + The meaning of the stride parameter depends on the type of the array +that the stride refers to. _If the array is interleaved complex, +strides are expressed in units of complex numbers ('fftw_complex'). If +the array is split complex or real, strides are expressed in units of +real numbers ('double')._ This convention is consistent with the usual +pointer arithmetic in the C language. An interleaved array is denoted +by a pointer 'p' to 'fftw_complex', so that 'p+1' points to the next +complex number. Split arrays are denoted by pointers to 'double', in +which case pointer arithmetic operates in units of 'sizeof(double)'. + + The guru planner interfaces all take a ('rank', 'dims[rank]') pair +describing the transform size, and a ('howmany_rank', +'howmany_dims[howmany_rank]') pair describing the "vector" size (a +multi-dimensional loop of transforms to perform), where 'dims' and +'howmany_dims' are arrays of 'fftw_iodim'. Each 'n' field must be +positive for 'dims' and nonnegative for 'howmany_dims', while both +'rank' and 'howmany_rank' must be nonnegative. + + For example, the 'howmany' parameter in the advanced complex-DFT +interface corresponds to 'howmany_rank' = 1, 'howmany_dims[0].n' = +'howmany', 'howmany_dims[0].is' = 'idist', and 'howmany_dims[0].os' = +'odist'. (To compute a single transform, you can just use +'howmany_rank' = 0.) + + A row-major multidimensional array with dimensions 'n[rank]' (*note +Row-major Format::) corresponds to 'dims[i].n' = 'n[i]' and the +recurrence 'dims[i].is' = 'n[i+1] * dims[i+1].is' (similarly for 'os'). +The stride of the last ('i=rank-1') dimension is the overall stride of +the array. e.g. to be equivalent to the advanced complex-DFT +interface, you would have 'dims[rank-1].is' = 'istride' and +'dims[rank-1].os' = 'ostride'. + + In general, we only guarantee FFTW to return a non-'NULL' plan if the +vector and transform dimensions correspond to a set of distinct indices, +and for in-place transforms the input/output strides should be the same. + + +File: fftw3.info, Node: Guru Complex DFTs, Next: Guru Real-data DFTs, Prev: Guru vector and transform sizes, Up: Guru Interface + +4.5.3 Guru Complex DFTs +----------------------- + + fftw_plan fftw_plan_guru_dft( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + + fftw_plan fftw_plan_guru_split_dft( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *ri, double *ii, double *ro, double *io, + unsigned flags); + + These two functions plan a complex-data, multi-dimensional DFT for +the interleaved and split format, respectively. Transform dimensions +are given by ('rank', 'dims') over a multi-dimensional vector (loop) of +dimensions ('howmany_rank', 'howmany_dims'). 'dims' and 'howmany_dims' +should point to 'fftw_iodim' arrays of length 'rank' and 'howmany_rank', +respectively. + + 'flags' is a bitwise OR ('|') of zero or more planner flags, as +defined in *note Planner Flags::. + + In the 'fftw_plan_guru_dft' function, the pointers 'in' and 'out' +point to the interleaved input and output arrays, respectively. The +sign can be either -1 (= 'FFTW_FORWARD') or +1 (= 'FFTW_BACKWARD'). If +the pointers are equal, the transform is in-place. + + In the 'fftw_plan_guru_split_dft' function, 'ri' and 'ii' point to +the real and imaginary input arrays, and 'ro' and 'io' point to the real +and imaginary output arrays. The input and output pointers may be the +same, indicating an in-place transform. For example, for 'fftw_complex' +pointers 'in' and 'out', the corresponding parameters are: + + ri = (double *) in; + ii = (double *) in + 1; + ro = (double *) out; + io = (double *) out + 1; + + Because 'fftw_plan_guru_split_dft' accepts split arrays, strides are +expressed in units of 'double'. For a contiguous 'fftw_complex' array, +the overall stride of the transform should be 2, the distance between +consecutive real parts or between consecutive imaginary parts; see *note +Guru vector and transform sizes::. Note that the dimension strides are +applied equally to the real and imaginary parts; real and imaginary +arrays with different strides are not supported. + + There is no 'sign' parameter in 'fftw_plan_guru_split_dft'. This +function always plans for an 'FFTW_FORWARD' transform. To plan for an +'FFTW_BACKWARD' transform, you can exploit the identity that the +backwards DFT is equal to the forwards DFT with the real and imaginary +parts swapped. For example, in the case of the 'fftw_complex' arrays +above, the 'FFTW_BACKWARD' transform is computed by the parameters: + + ri = (double *) in + 1; + ii = (double *) in; + ro = (double *) out + 1; + io = (double *) out; + + +File: fftw3.info, Node: Guru Real-data DFTs, Next: Guru Real-to-real Transforms, Prev: Guru Complex DFTs, Up: Guru Interface + +4.5.4 Guru Real-data DFTs +------------------------- + + fftw_plan fftw_plan_guru_dft_r2c( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *in, fftw_complex *out, + unsigned flags); + + fftw_plan fftw_plan_guru_split_dft_r2c( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *in, double *ro, double *io, + unsigned flags); + + fftw_plan fftw_plan_guru_dft_c2r( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + fftw_complex *in, double *out, + unsigned flags); + + fftw_plan fftw_plan_guru_split_dft_c2r( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *ri, double *ii, double *out, + unsigned flags); + + Plan a real-input (r2c) or real-output (c2r), multi-dimensional DFT +with transform dimensions given by ('rank', 'dims') over a +multi-dimensional vector (loop) of dimensions ('howmany_rank', +'howmany_dims'). 'dims' and 'howmany_dims' should point to 'fftw_iodim' +arrays of length 'rank' and 'howmany_rank', respectively. As for the +basic and advanced interfaces, an r2c transform is 'FFTW_FORWARD' and a +c2r transform is 'FFTW_BACKWARD'. + + The _last_ dimension of 'dims' is interpreted specially: that +dimension of the real array has size 'dims[rank-1].n', but that +dimension of the complex array has size 'dims[rank-1].n/2+1' (division +rounded down). The strides, on the other hand, are taken to be exactly +as specified. It is up to the user to specify the strides appropriately +for the peculiar dimensions of the data, and we do not guarantee that +the planner will succeed (return non-'NULL') for any dimensions other +than those described in *note Real-data DFT Array Format:: and +generalized in *note Advanced Real-data DFTs::. (That is, for an +in-place transform, each individual dimension should be able to operate +in place.) + + 'in' and 'out' point to the input and output arrays for r2c and c2r +transforms, respectively. For split arrays, 'ri' and 'ii' point to the +real and imaginary input arrays for a c2r transform, and 'ro' and 'io' +point to the real and imaginary output arrays for an r2c transform. +'in' and 'ro' or 'ri' and 'out' may be the same, indicating an in-place +transform. (In-place transforms where 'in' and 'io' or 'ii' and 'out' +are the same are not currently supported.) + + 'flags' is a bitwise OR ('|') of zero or more planner flags, as +defined in *note Planner Flags::. + + In-place transforms of rank greater than 1 are currently only +supported for interleaved arrays. For split arrays, the planner will +return 'NULL'. + + +File: fftw3.info, Node: Guru Real-to-real Transforms, Next: 64-bit Guru Interface, Prev: Guru Real-data DFTs, Up: Guru Interface + +4.5.5 Guru Real-to-real Transforms +---------------------------------- + + fftw_plan fftw_plan_guru_r2r(int rank, const fftw_iodim *dims, + int howmany_rank, + const fftw_iodim *howmany_dims, + double *in, double *out, + const fftw_r2r_kind *kind, + unsigned flags); + + Plan a real-to-real (r2r) multi-dimensional 'FFTW_FORWARD' transform +with transform dimensions given by ('rank', 'dims') over a +multi-dimensional vector (loop) of dimensions ('howmany_rank', +'howmany_dims'). 'dims' and 'howmany_dims' should point to 'fftw_iodim' +arrays of length 'rank' and 'howmany_rank', respectively. + + The transform kind of each dimension is given by the 'kind' +parameter, which should point to an array of length 'rank'. Valid +'fftw_r2r_kind' constants are given in *note Real-to-Real Transform +Kinds::. + + 'in' and 'out' point to the real input and output arrays; they may be +the same, indicating an in-place transform. + + 'flags' is a bitwise OR ('|') of zero or more planner flags, as +defined in *note Planner Flags::. + + +File: fftw3.info, Node: 64-bit Guru Interface, Prev: Guru Real-to-real Transforms, Up: Guru Interface + +4.5.6 64-bit Guru Interface +--------------------------- + +When compiled in 64-bit mode on a 64-bit architecture (where addresses +are 64 bits wide), FFTW uses 64-bit quantities internally for all +transform sizes, strides, and so on--you don't have to do anything +special to exploit this. However, in the ordinary FFTW interfaces, you +specify the transform size by an 'int' quantity, which is normally only +32 bits wide. This means that, even though FFTW is using 64-bit sizes +internally, you cannot specify a single transform dimension larger than +2^31-1 numbers. + + We expect that few users will require transforms larger than this, +but, for those who do, we provide a 64-bit version of the guru interface +in which all sizes are specified as integers of type 'ptrdiff_t' instead +of 'int'. ('ptrdiff_t' is a signed integer type defined by the C +standard to be wide enough to represent address differences, and thus +must be at least 64 bits wide on a 64-bit machine.) We stress that +there is _no performance advantage_ to using this interface--the same +internal FFTW code is employed regardless--and it is only necessary if +you want to specify very large transform sizes. + + In particular, the 64-bit guru interface is a set of planner routines +that are exactly the same as the guru planner routines, except that they +are named with 'guru64' instead of 'guru' and they take arguments of +type 'fftw_iodim64' instead of 'fftw_iodim'. For example, instead of +'fftw_plan_guru_dft', we have 'fftw_plan_guru64_dft'. + + fftw_plan fftw_plan_guru64_dft( + int rank, const fftw_iodim64 *dims, + int howmany_rank, const fftw_iodim64 *howmany_dims, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + + The 'fftw_iodim64' type is similar to 'fftw_iodim', with the same +interpretation, except that it uses type 'ptrdiff_t' instead of type +'int'. + + typedef struct { + ptrdiff_t n; + ptrdiff_t is; + ptrdiff_t os; + } fftw_iodim64; + + Every other 'fftw_plan_guru' function also has a 'fftw_plan_guru64' +equivalent, but we do not repeat their documentation here since they are +identical to the 32-bit versions except as noted above. + + +File: fftw3.info, Node: New-array Execute Functions, Next: Wisdom, Prev: Guru Interface, Up: FFTW Reference + +4.6 New-array Execute Functions +=============================== + +Normally, one executes a plan for the arrays with which the plan was +created, by calling 'fftw_execute(plan)' as described in *note Using +Plans::. However, it is possible for sophisticated users to apply a +given plan to a _different_ array using the "new-array execute" +functions detailed below, provided that the following conditions are +met: + + * The array size, strides, etcetera are the same (since those are set + by the plan). + + * The input and output arrays are the same (in-place) or different + (out-of-place) if the plan was originally created to be in-place or + out-of-place, respectively. + + * For split arrays, the separations between the real and imaginary + parts, 'ii-ri' and 'io-ro', are the same as they were for the input + and output arrays when the plan was created. (This condition is + automatically satisfied for interleaved arrays.) + + * The "alignment" of the new input/output arrays is the same as that + of the input/output arrays when the plan was created, unless the + plan was created with the 'FFTW_UNALIGNED' flag. Here, the + alignment is a platform-dependent quantity (for example, it is the + address modulo 16 if SSE SIMD instructions are used, but the + address modulo 4 for non-SIMD single-precision FFTW on the same + machine). In general, only arrays allocated with 'fftw_malloc' are + guaranteed to be equally aligned (*note SIMD alignment and + fftw_malloc::). + + The alignment issue is especially critical, because if you don't use +'fftw_malloc' then you may have little control over the alignment of +arrays in memory. For example, neither the C++ 'new' function nor the +Fortran 'allocate' statement provide strong enough guarantees about data +alignment. If you don't use 'fftw_malloc', therefore, you probably have +to use 'FFTW_UNALIGNED' (which disables most SIMD support). If +possible, it is probably better for you to simply create multiple plans +(creating a new plan is quick once one exists for a given size), or +better yet re-use the same array for your transforms. + + For rare circumstances in which you cannot control the alignment of +allocated memory, but wish to determine where a given array is aligned +like the original array for which a plan was created, you can use the +'fftw_alignment_of' function: + int fftw_alignment_of(double *p); + Two arrays have equivalent alignment (for the purposes of applying a +plan) if and only if 'fftw_alignment_of' returns the same value for the +corresponding pointers to their data (typecast to 'double*' if +necessary). + + If you are tempted to use the new-array execute interface because you +want to transform a known bunch of arrays of the same size, you should +probably go use the advanced interface instead (*note Advanced +Interface::)). + + The new-array execute functions are: + + void fftw_execute_dft( + const fftw_plan p, + fftw_complex *in, fftw_complex *out); + + void fftw_execute_split_dft( + const fftw_plan p, + double *ri, double *ii, double *ro, double *io); + + void fftw_execute_dft_r2c( + const fftw_plan p, + double *in, fftw_complex *out); + + void fftw_execute_split_dft_r2c( + const fftw_plan p, + double *in, double *ro, double *io); + + void fftw_execute_dft_c2r( + const fftw_plan p, + fftw_complex *in, double *out); + + void fftw_execute_split_dft_c2r( + const fftw_plan p, + double *ri, double *ii, double *out); + + void fftw_execute_r2r( + const fftw_plan p, + double *in, double *out); + + These execute the 'plan' to compute the corresponding transform on +the input/output arrays specified by the subsequent arguments. The +input/output array arguments have the same meanings as the ones passed +to the guru planner routines in the preceding sections. The 'plan' is +not modified, and these routines can be called as many times as desired, +or intermixed with calls to the ordinary 'fftw_execute'. + + The 'plan' _must_ have been created for the transform type +corresponding to the execute function, e.g. it must be a complex-DFT +plan for 'fftw_execute_dft'. Any of the planner routines for that +transform type, from the basic to the guru interface, could have been +used to create the plan, however. + + +File: fftw3.info, Node: Wisdom, Next: What FFTW Really Computes, Prev: New-array Execute Functions, Up: FFTW Reference + +4.7 Wisdom +========== + +This section documents the FFTW mechanism for saving and restoring plans +from disk. This mechanism is called "wisdom". + +* Menu: + +* Wisdom Export:: +* Wisdom Import:: +* Forgetting Wisdom:: +* Wisdom Utilities:: + + +File: fftw3.info, Node: Wisdom Export, Next: Wisdom Import, Prev: Wisdom, Up: Wisdom + +4.7.1 Wisdom Export +------------------- + + int fftw_export_wisdom_to_filename(const char *filename); + void fftw_export_wisdom_to_file(FILE *output_file); + char *fftw_export_wisdom_to_string(void); + void fftw_export_wisdom(void (*write_char)(char c, void *), void *data); + + These functions allow you to export all currently accumulated wisdom +in a form from which it can be later imported and restored, even during +a separate run of the program. (*Note Words of Wisdom-Saving Plans::.) +The current store of wisdom is not affected by calling any of these +routines. + + 'fftw_export_wisdom' exports the wisdom to any output medium, as +specified by the callback function 'write_char'. 'write_char' is a +'putc'-like function that writes the character 'c' to some output; its +second parameter is the 'data' pointer passed to 'fftw_export_wisdom'. +For convenience, the following three "wrapper" routines are provided: + + 'fftw_export_wisdom_to_filename' writes wisdom to a file named +'filename' (which is created or overwritten), returning '1' on success +and '0' on failure. A lower-level function, which requires you to open +and close the file yourself (e.g. if you want to write wisdom to a +portion of a larger file) is 'fftw_export_wisdom_to_file'. This writes +the wisdom to the current position in 'output_file', which should be +open with write permission; upon exit, the file remains open and is +positioned at the end of the wisdom data. + + 'fftw_export_wisdom_to_string' returns a pointer to a +'NULL'-terminated string holding the wisdom data. This string is +dynamically allocated, and it is the responsibility of the caller to +deallocate it with 'free' when it is no longer needed. + + All of these routines export the wisdom in the same format, which we +will not document here except to say that it is LISP-like ASCII text +that is insensitive to white space. + + +File: fftw3.info, Node: Wisdom Import, Next: Forgetting Wisdom, Prev: Wisdom Export, Up: Wisdom + +4.7.2 Wisdom Import +------------------- + + int fftw_import_system_wisdom(void); + int fftw_import_wisdom_from_filename(const char *filename); + int fftw_import_wisdom_from_string(const char *input_string); + int fftw_import_wisdom(int (*read_char)(void *), void *data); + + These functions import wisdom into a program from data stored by the +'fftw_export_wisdom' functions above. (*Note Words of Wisdom-Saving +Plans::.) The imported wisdom replaces any wisdom already accumulated +by the running program. + + 'fftw_import_wisdom' imports wisdom from any input medium, as +specified by the callback function 'read_char'. 'read_char' is a +'getc'-like function that returns the next character in the input; its +parameter is the 'data' pointer passed to 'fftw_import_wisdom'. If the +end of the input data is reached (which should never happen for valid +data), 'read_char' should return 'EOF' (as defined in ''). For +convenience, the following three "wrapper" routines are provided: + + 'fftw_import_wisdom_from_filename' reads wisdom from a file named +'filename'. A lower-level function, which requires you to open and +close the file yourself (e.g. if you want to read wisdom from a portion +of a larger file) is 'fftw_import_wisdom_from_file'. This reads wisdom +from the current position in 'input_file' (which should be open with +read permission); upon exit, the file remains open, but the position of +the read pointer is unspecified. + + 'fftw_import_wisdom_from_string' reads wisdom from the +'NULL'-terminated string 'input_string'. + + 'fftw_import_system_wisdom' reads wisdom from an +implementation-defined standard file ('/etc/fftw/wisdom' on Unix and GNU +systems). + + The return value of these import routines is '1' if the wisdom was +read successfully and '0' otherwise. Note that, in all of these +functions, any data in the input stream past the end of the wisdom data +is simply ignored. + + +File: fftw3.info, Node: Forgetting Wisdom, Next: Wisdom Utilities, Prev: Wisdom Import, Up: Wisdom + +4.7.3 Forgetting Wisdom +----------------------- + + void fftw_forget_wisdom(void); + + Calling 'fftw_forget_wisdom' causes all accumulated 'wisdom' to be +discarded and its associated memory to be freed. (New 'wisdom' can +still be gathered subsequently, however.) + + +File: fftw3.info, Node: Wisdom Utilities, Prev: Forgetting Wisdom, Up: Wisdom + +4.7.4 Wisdom Utilities +---------------------- + +FFTW includes two standalone utility programs that deal with wisdom. We +merely summarize them here, since they come with their own 'man' pages +for Unix and GNU systems (with HTML versions on our web site). + + The first program is 'fftw-wisdom' (or 'fftwf-wisdom' in single +precision, etcetera), which can be used to create a wisdom file +containing plans for any of the transform sizes and types supported by +FFTW. It is preferable to create wisdom directly from your executable +(*note Caveats in Using Wisdom::), but this program is useful for +creating global wisdom files for 'fftw_import_system_wisdom'. + + The second program is 'fftw-wisdom-to-conf', which takes a wisdom +file as input and produces a "configuration routine" as output. The +latter is a C subroutine that you can compile and link into your +program, replacing a routine of the same name in the FFTW library, that +determines which parts of FFTW are callable by your program. +'fftw-wisdom-to-conf' produces a configuration routine that links to +only those parts of FFTW needed by the saved plans in the wisdom, +greatly reducing the size of statically linked executables (which should +only attempt to create plans corresponding to those in the wisdom, +however). + + +File: fftw3.info, Node: What FFTW Really Computes, Prev: Wisdom, Up: FFTW Reference + +4.8 What FFTW Really Computes +============================= + +In this section, we provide precise mathematical definitions for the +transforms that FFTW computes. These transform definitions are fairly +standard, but some authors follow slightly different conventions for the +normalization of the transform (the constant factor in front) and the +sign of the complex exponent. We begin by presenting the +one-dimensional (1d) transform definitions, and then give the +straightforward extension to multi-dimensional transforms. + +* Menu: + +* The 1d Discrete Fourier Transform (DFT):: +* The 1d Real-data DFT:: +* 1d Real-even DFTs (DCTs):: +* 1d Real-odd DFTs (DSTs):: +* 1d Discrete Hartley Transforms (DHTs):: +* Multi-dimensional Transforms:: + + +File: fftw3.info, Node: The 1d Discrete Fourier Transform (DFT), Next: The 1d Real-data DFT, Prev: What FFTW Really Computes, Up: What FFTW Really Computes + +4.8.1 The 1d Discrete Fourier Transform (DFT) +--------------------------------------------- + +The forward ('FFTW_FORWARD') discrete Fourier transform (DFT) of a 1d +complex array X of size n computes an array Y, where: + Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(-2 pi j k sqrt(-1)/n) . + The backward ('FFTW_BACKWARD') DFT computes: + Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(2 pi j k sqrt(-1)/n) . + + FFTW computes an unnormalized transform, in that there is no +coefficient in front of the summation in the DFT. In other words, +applying the forward and then the backward transform will multiply the +input by n. + + From above, an 'FFTW_FORWARD' transform corresponds to a sign of -1 +in the exponent of the DFT. Note also that we use the standard +"in-order" output ordering--the k-th output corresponds to the frequency +k/n (or k/T, where T is your total sampling period). For those who like +to think in terms of positive and negative frequencies, this means that +the positive frequencies are stored in the first half of the output and +the negative frequencies are stored in backwards order in the second +half of the output. (The frequency -k/n is the same as the frequency +(n-k)/n.) + + +File: fftw3.info, Node: The 1d Real-data DFT, Next: 1d Real-even DFTs (DCTs), Prev: The 1d Discrete Fourier Transform (DFT), Up: What FFTW Really Computes + +4.8.2 The 1d Real-data DFT +-------------------------- + +The real-input (r2c) DFT in FFTW computes the _forward_ transform Y of +the size 'n' real array X, exactly as defined above, i.e. + Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(-2 pi j k sqrt(-1)/n) . + This output array Y can easily be shown to possess the "Hermitian" +symmetry Y[k] = Y[n-k]*, where we take Y to be periodic so that Y[n] = +Y[0]. + + As a result of this symmetry, half of the output Y is redundant +(being the complex conjugate of the other half), and so the 1d r2c +transforms only output elements 0...n/2 of Y (n/2+1 complex numbers), +where the division by 2 is rounded down. + + Moreover, the Hermitian symmetry implies that Y[0] and, if n is even, +the Y[n/2] element, are purely real. So, for the 'R2HC' r2r transform, +the halfcomplex format does not store the imaginary parts of these +elements. + + The c2r and 'H2RC' r2r transforms compute the backward DFT of the +_complex_ array X with Hermitian symmetry, stored in the r2c/'R2HC' +output formats, respectively, where the backward transform is defined +exactly as for the complex case: + Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(2 pi j k sqrt(-1)/n) . + The outputs 'Y' of this transform can easily be seen to be purely +real, and are stored as an array of real numbers. + + Like FFTW's complex DFT, these transforms are unnormalized. In other +words, applying the real-to-complex (forward) and then the +complex-to-real (backward) transform will multiply the input by n. + + +File: fftw3.info, Node: 1d Real-even DFTs (DCTs), Next: 1d Real-odd DFTs (DSTs), Prev: The 1d Real-data DFT, Up: What FFTW Really Computes + +4.8.3 1d Real-even DFTs (DCTs) +------------------------------ + +The Real-even symmetry DFTs in FFTW are exactly equivalent to the +unnormalized forward (and backward) DFTs as defined above, where the +input array X of length N is purely real and is also "even" symmetry. +In this case, the output array is likewise real and even symmetry. + + For the case of 'REDFT00', this even symmetry means that X[j] = +X[N-j], where we take X to be periodic so that X[N] = X[0]. Because of +this redundancy, only the first n real numbers are actually stored, +where N = 2(n-1). + + The proper definition of even symmetry for 'REDFT10', 'REDFT01', and +'REDFT11' transforms is somewhat more intricate because of the shifts by +1/2 of the input and/or output, although the corresponding boundary +conditions are given in *note Real even/odd DFTs (cosine/sine +transforms)::. Because of the even symmetry, however, the sine terms in +the DFT all cancel and the remaining cosine terms are written explicitly +below. This formulation often leads people to call such a transform a +"discrete cosine transform" (DCT), although it is really just a special +case of the DFT. + + In each of the definitions below, we transform a real array X of +length n to a real array Y of length n: + +REDFT00 (DCT-I) +............... + +An 'REDFT00' transform (type-I DCT) in FFTW is defined by: Y[k] = X[0] + +(-1)^k X[n-1] + 2 (sum for j = 1 to n-2 of X[j] cos(pi jk /(n-1))). +Note that this transform is not defined for n=1. For n=2, the summation +term above is dropped as you might expect. + +REDFT10 (DCT-II) +................ + +An 'REDFT10' transform (type-II DCT, sometimes called "the" DCT) in FFTW +is defined by: Y[k] = 2 (sum for j = 0 to n-1 of X[j] cos(pi (j+1/2) k / +n)). + +REDFT01 (DCT-III) +................. + +An 'REDFT01' transform (type-III DCT) in FFTW is defined by: Y[k] = X[0] ++ 2 (sum for j = 1 to n-1 of X[j] cos(pi j (k+1/2) / n)). In the case +of n=1, this reduces to Y[0] = X[0]. Up to a scale factor (see below), +this is the inverse of 'REDFT10' ("the" DCT), and so the 'REDFT01' +(DCT-III) is sometimes called the "IDCT". + +REDFT11 (DCT-IV) +................ + +An 'REDFT11' transform (type-IV DCT) in FFTW is defined by: Y[k] = 2 +(sum for j = 0 to n-1 of X[j] cos(pi (j+1/2) (k+1/2) / n)). + +Inverses and Normalization +.......................... + +These definitions correspond directly to the unnormalized DFTs used +elsewhere in FFTW (hence the factors of 2 in front of the summations). +The unnormalized inverse of 'REDFT00' is 'REDFT00', of 'REDFT10' is +'REDFT01' and vice versa, and of 'REDFT11' is 'REDFT11'. Each +unnormalized inverse results in the original array multiplied by N, +where N is the _logical_ DFT size. For 'REDFT00', N=2(n-1) (note that +n=1 is not defined); otherwise, N=2n. + + In defining the discrete cosine transform, some authors also include +additional factors of sqrt(2) (or its inverse) multiplying selected +inputs and/or outputs. This is a mostly cosmetic change that makes the +transform orthogonal, but sacrifices the direct equivalence to a +symmetric DFT. + + +File: fftw3.info, Node: 1d Real-odd DFTs (DSTs), Next: 1d Discrete Hartley Transforms (DHTs), Prev: 1d Real-even DFTs (DCTs), Up: What FFTW Really Computes + +4.8.4 1d Real-odd DFTs (DSTs) +----------------------------- + +The Real-odd symmetry DFTs in FFTW are exactly equivalent to the +unnormalized forward (and backward) DFTs as defined above, where the +input array X of length N is purely real and is also "odd" symmetry. In +this case, the output is odd symmetry and purely imaginary. + + For the case of 'RODFT00', this odd symmetry means that X[j] = +-X[N-j], where we take X to be periodic so that X[N] = X[0]. Because of +this redundancy, only the first n real numbers starting at j=1 are +actually stored (the j=0 element is zero), where N = 2(n+1). + + The proper definition of odd symmetry for 'RODFT10', 'RODFT01', and +'RODFT11' transforms is somewhat more intricate because of the shifts by +1/2 of the input and/or output, although the corresponding boundary +conditions are given in *note Real even/odd DFTs (cosine/sine +transforms)::. Because of the odd symmetry, however, the cosine terms +in the DFT all cancel and the remaining sine terms are written +explicitly below. This formulation often leads people to call such a +transform a "discrete sine transform" (DST), although it is really just +a special case of the DFT. + + In each of the definitions below, we transform a real array X of +length n to a real array Y of length n: + +RODFT00 (DST-I) +............... + +An 'RODFT00' transform (type-I DST) in FFTW is defined by: Y[k] = 2 (sum +for j = 0 to n-1 of X[j] sin(pi (j+1)(k+1) / (n+1))). + +RODFT10 (DST-II) +................ + +An 'RODFT10' transform (type-II DST) in FFTW is defined by: Y[k] = 2 +(sum for j = 0 to n-1 of X[j] sin(pi (j+1/2) (k+1) / n)). + +RODFT01 (DST-III) +................. + +An 'RODFT01' transform (type-III DST) in FFTW is defined by: Y[k] = +(-1)^k X[n-1] + 2 (sum for j = 0 to n-2 of X[j] sin(pi (j+1) (k+1/2) / +n)). In the case of n=1, this reduces to Y[0] = X[0]. + +RODFT11 (DST-IV) +................ + +An 'RODFT11' transform (type-IV DST) in FFTW is defined by: Y[k] = 2 +(sum for j = 0 to n-1 of X[j] sin(pi (j+1/2) (k+1/2) / n)). + +Inverses and Normalization +.......................... + +These definitions correspond directly to the unnormalized DFTs used +elsewhere in FFTW (hence the factors of 2 in front of the summations). +The unnormalized inverse of 'RODFT00' is 'RODFT00', of 'RODFT10' is +'RODFT01' and vice versa, and of 'RODFT11' is 'RODFT11'. Each +unnormalized inverse results in the original array multiplied by N, +where N is the _logical_ DFT size. For 'RODFT00', N=2(n+1); otherwise, +N=2n. + + In defining the discrete sine transform, some authors also include +additional factors of sqrt(2) (or its inverse) multiplying selected +inputs and/or outputs. This is a mostly cosmetic change that makes the +transform orthogonal, but sacrifices the direct equivalence to an +antisymmetric DFT. + + +File: fftw3.info, Node: 1d Discrete Hartley Transforms (DHTs), Next: Multi-dimensional Transforms, Prev: 1d Real-odd DFTs (DSTs), Up: What FFTW Really Computes + +4.8.5 1d Discrete Hartley Transforms (DHTs) +------------------------------------------- + +The discrete Hartley transform (DHT) of a 1d real array X of size n +computes a real array Y of the same size, where: +Y[k] = sum for j = 0 to (n - 1) of X[j] * [cos(2 pi j k / n) + sin(2 pi j k / n)]. + + FFTW computes an unnormalized transform, in that there is no +coefficient in front of the summation in the DHT. In other words, +applying the transform twice (the DHT is its own inverse) will multiply +the input by n. + + +File: fftw3.info, Node: Multi-dimensional Transforms, Prev: 1d Discrete Hartley Transforms (DHTs), Up: What FFTW Really Computes + +4.8.6 Multi-dimensional Transforms +---------------------------------- + +The multi-dimensional transforms of FFTW, in general, compute simply the +separable product of the given 1d transform along each dimension of the +array. Since each of these transforms is unnormalized, computing the +forward followed by the backward/inverse multi-dimensional transform +will result in the original array scaled by the product of the +normalization factors for each dimension (e.g. the product of the +dimension sizes, for a multi-dimensional DFT). + + The definition of FFTW's multi-dimensional DFT of real data (r2c) +deserves special attention. In this case, we logically compute the full +multi-dimensional DFT of the input data; since the input data are purely +real, the output data have the Hermitian symmetry and therefore only one +non-redundant half need be stored. More specifically, for an n[0] x +n[1] x n[2] x ... x n[d-1] multi-dimensional real-input DFT, the full +(logical) complex output array Y[k[0], k[1], ..., k[d-1]] has the +symmetry: Y[k[0], k[1], ..., k[d-1]] = Y[n[0] - k[0], n[1] - k[1], ..., +n[d-1] - k[d-1]]* (where each dimension is periodic). Because of this +symmetry, we only store the k[d-1] = 0...n[d-1]/2 elements of the _last_ +dimension (division by 2 is rounded down). (We could instead have cut +any other dimension in half, but the last dimension proved +computationally convenient.) This results in the peculiar array format +described in more detail by *note Real-data DFT Array Format::. + + The multi-dimensional c2r transform is simply the unnormalized +inverse of the r2c transform. i.e. it is the same as FFTW's complex +backward multi-dimensional DFT, operating on a Hermitian input array in +the peculiar format mentioned above and outputting a real array (since +the DFT output is purely real). + + We should remind the user that the separable product of 1d transforms +along each dimension, as computed by FFTW, is not always the same thing +as the usual multi-dimensional transform. A multi-dimensional 'R2HC' +(or 'HC2R') transform is not identical to the multi-dimensional DFT, +requiring some post-processing to combine the requisite real and +imaginary parts, as was described in *note The Halfcomplex-format DFT::. +Likewise, FFTW's multidimensional 'FFTW_DHT' r2r transform is not the +same thing as the logical multi-dimensional discrete Hartley transform +defined in the literature, as discussed in *note The Discrete Hartley +Transform::. + + +File: fftw3.info, Node: Multi-threaded FFTW, Next: Distributed-memory FFTW with MPI, Prev: FFTW Reference, Up: Top + +5 Multi-threaded FFTW +********************* + +In this chapter we document the parallel FFTW routines for shared-memory +parallel hardware. These routines, which support parallel one- and +multi-dimensional transforms of both real and complex data, are the +easiest way to take advantage of multiple processors with FFTW. They +work just like the corresponding uniprocessor transform routines, except +that you have an extra initialization routine to call, and there is a +routine to set the number of threads to employ. Any program that uses +the uniprocessor FFTW can therefore be trivially modified to use the +multi-threaded FFTW. + + A shared-memory machine is one in which all CPUs can directly access +the same main memory, and such machines are now common due to the +ubiquity of multi-core CPUs. FFTW's multi-threading support allows you +to utilize these additional CPUs transparently from a single program. +However, this does not necessarily translate into performance +gains--when multiple threads/CPUs are employed, there is an overhead +required for synchronization that may outweigh the computatational +parallelism. Therefore, you can only benefit from threads if your +problem is sufficiently large. + +* Menu: + +* Installation and Supported Hardware/Software:: +* Usage of Multi-threaded FFTW:: +* How Many Threads to Use?:: +* Thread safety:: + + +File: fftw3.info, Node: Installation and Supported Hardware/Software, Next: Usage of Multi-threaded FFTW, Prev: Multi-threaded FFTW, Up: Multi-threaded FFTW + +5.1 Installation and Supported Hardware/Software +================================================ + +All of the FFTW threads code is located in the 'threads' subdirectory of +the FFTW package. On Unix systems, the FFTW threads libraries and +header files can be automatically configured, compiled, and installed +along with the uniprocessor FFTW libraries simply by including +'--enable-threads' in the flags to the 'configure' script (*note +Installation on Unix::), or '--enable-openmp' to use OpenMP +(http://www.openmp.org) threads. + + The threads routines require your operating system to have some sort +of shared-memory threads support. Specifically, the FFTW threads +package works with POSIX threads (available on most Unix variants, from +GNU/Linux to MacOS X) and Win32 threads. OpenMP threads, which are +supported in many common compilers (e.g. gcc) are also supported, and +may give better performance on some systems. (OpenMP threads are also +useful if you are employing OpenMP in your own code, in order to +minimize conflicts between threading models.) If you have a +shared-memory machine that uses a different threads API, it should be a +simple matter of programming to include support for it; see the file +'threads/threads.c' for more detail. + + You can compile FFTW with _both_ '--enable-threads' and +'--enable-openmp' at the same time, since they install libraries with +different names ('fftw3_threads' and 'fftw3_omp', as described below). +However, your programs may only link to _one_ of these two libraries at +a time. + + Ideally, of course, you should also have multiple processors in order +to get any benefit from the threaded transforms. + + +File: fftw3.info, Node: Usage of Multi-threaded FFTW, Next: How Many Threads to Use?, Prev: Installation and Supported Hardware/Software, Up: Multi-threaded FFTW + +5.2 Usage of Multi-threaded FFTW +================================ + +Here, it is assumed that the reader is already familiar with the usage +of the uniprocessor FFTW routines, described elsewhere in this manual. +We only describe what one has to change in order to use the +multi-threaded routines. + + First, programs using the parallel complex transforms should be +linked with '-lfftw3_threads -lfftw3 -lm' on Unix, or '-lfftw3_omp +-lfftw3 -lm' if you compiled with OpenMP. You will also need to link +with whatever library is responsible for threads on your system (e.g. +'-lpthread' on GNU/Linux) or include whatever compiler flag enables +OpenMP (e.g. '-fopenmp' with gcc). + + Second, before calling _any_ FFTW routines, you should call the +function: + + int fftw_init_threads(void); + + This function, which need only be called once, performs any one-time +initialization required to use threads on your system. It returns zero +if there was some error (which should not happen under normal +circumstances) and a non-zero value otherwise. + + Third, before creating a plan that you want to parallelize, you +should call: + + void fftw_plan_with_nthreads(int nthreads); + + The 'nthreads' argument indicates the number of threads you want FFTW +to use (or actually, the maximum number). All plans subsequently +created with any planner routine will use that many threads. You can +call 'fftw_plan_with_nthreads', create some plans, call +'fftw_plan_with_nthreads' again with a different argument, and create +some more plans for a new number of threads. Plans already created +before a call to 'fftw_plan_with_nthreads' are unaffected. If you pass +an 'nthreads' argument of '1' (the default), threads are disabled for +subsequent plans. + + With OpenMP, to configure FFTW to use all of the currently running +OpenMP threads (set by 'omp_set_num_threads(nthreads)' or by the +'OMP_NUM_THREADS' environment variable), you can do: +'fftw_plan_with_nthreads(omp_get_max_threads())'. (The 'omp_' OpenMP +functions are declared via '#include '.) + + Given a plan, you then execute it as usual with 'fftw_execute(plan)', +and the execution will use the number of threads specified when the plan +was created. When done, you destroy it as usual with +'fftw_destroy_plan'. As described in *note Thread safety::, plan +_execution_ is thread-safe, but plan creation and destruction are _not_: +you should create/destroy plans only from a single thread, but can +safely execute multiple plans in parallel. + + There is one additional routine: if you want to get rid of all memory +and other resources allocated internally by FFTW, you can call: + + void fftw_cleanup_threads(void); + + which is much like the 'fftw_cleanup()' function except that it also +gets rid of threads-related data. You must _not_ execute any previously +created plans after calling this function. + + We should also mention one other restriction: if you save wisdom from +a program using the multi-threaded FFTW, that wisdom _cannot be used_ by +a program using only the single-threaded FFTW (i.e. not calling +'fftw_init_threads'). *Note Words of Wisdom-Saving Plans::. + + +File: fftw3.info, Node: How Many Threads to Use?, Next: Thread safety, Prev: Usage of Multi-threaded FFTW, Up: Multi-threaded FFTW + +5.3 How Many Threads to Use? +============================ + +There is a fair amount of overhead involved in synchronizing threads, so +the optimal number of threads to use depends upon the size of the +transform as well as on the number of processors you have. + + As a general rule, you don't want to use more threads than you have +processors. (Using more threads will work, but there will be extra +overhead with no benefit.) In fact, if the problem size is too small, +you may want to use fewer threads than you have processors. + + You will have to experiment with your system to see what level of +parallelization is best for your problem size. Typically, the problem +will have to involve at least a few thousand data points before threads +become beneficial. If you plan with 'FFTW_PATIENT', it will +automatically disable threads for sizes that don't benefit from +parallelization. + + +File: fftw3.info, Node: Thread safety, Prev: How Many Threads to Use?, Up: Multi-threaded FFTW + +5.4 Thread safety +================= + +Users writing multi-threaded programs (including OpenMP) must concern +themselves with the "thread safety" of the libraries they use--that is, +whether it is safe to call routines in parallel from multiple threads. +FFTW can be used in such an environment, but some care must be taken +because the planner routines share data (e.g. wisdom and trigonometric +tables) between calls and plans. + + The upshot is that the only thread-safe routine in FFTW is +'fftw_execute' (and the new-array variants thereof). All other routines +(e.g. the planner) should only be called from one thread at a time. +So, for example, you can wrap a semaphore lock around any calls to the +planner; even more simply, you can just create all of your plans from +one thread. We do not think this should be an important restriction +(FFTW is designed for the situation where the only performance-sensitive +code is the actual execution of the transform), and the benefits of +shared data between plans are great. + + Note also that, since the plan is not modified by 'fftw_execute', it +is safe to execute the _same plan_ in parallel by multiple threads. +However, since a given plan operates by default on a fixed array, you +need to use one of the new-array execute functions (*note New-array +Execute Functions::) so that different threads compute the transform of +different data. + + (Users should note that these comments only apply to programs using +shared-memory threads or OpenMP. Parallelism using MPI or forked +processes involves a separate address-space and global variables for +each process, and is not susceptible to problems of this sort.) + + The FFTW planner is intended to be called from a single thread. If +you really must call it from multiple threads, you are expected to grab +whatever lock makes sense for your application, with the understanding +that you may be holding that lock for a long time, which is undesirable. + + Neither strategy works, however, in the following situation. The +"application" is structured as a set of "plugins" which are unaware of +each other, and for whatever reason the "plugins" cannot coordinate on +grabbing the lock. (This is not a technical problem, but an +organizational one. The "plugins" are written by independent agents, +and from the perspective of each plugin's author, each plugin is using +FFTW correctly from a single thread.) To cope with this situation, +starting from FFTW-3.3.5, FFTW supports an API to make the planner +thread-safe: + + void fftw_make_planner_thread_safe(void); + + This call operates by brute force: It just installs a hook that wraps +a lock (chosen by us) around all planner calls. So there is no magic +and you get the worst of all worlds. The planner is still +single-threaded, but you cannot choose which lock to use. The planner +still holds the lock for a long time, but you cannot impose a timeout on +lock acquisition. As of FFTW-3.3.5 and FFTW-3.3.6, this call does not +work when using OpenMP as threading substrate. (Suggestions on what to +do about this bug are welcome.) _Do not use +'fftw_make_planner_thread_safe' unless there is no other choice,_ such +as in the application/plugin situation. + + +File: fftw3.info, Node: Distributed-memory FFTW with MPI, Next: Calling FFTW from Modern Fortran, Prev: Multi-threaded FFTW, Up: Top + +6 Distributed-memory FFTW with MPI +********************************** + +In this chapter we document the parallel FFTW routines for parallel +systems supporting the MPI message-passing interface. Unlike the +shared-memory threads described in the previous chapter, MPI allows you +to use _distributed-memory_ parallelism, where each CPU has its own +separate memory, and which can scale up to clusters of many thousands of +processors. This capability comes at a price, however: each process +only stores a _portion_ of the data to be transformed, which means that +the data structures and programming-interface are quite different from +the serial or threads versions of FFTW. + + Distributed-memory parallelism is especially useful when you are +transforming arrays so large that they do not fit into the memory of a +single processor. The storage per-process required by FFTW's MPI +routines is proportional to the total array size divided by the number +of processes. Conversely, distributed-memory parallelism can easily +pose an unacceptably high communications overhead for small problems; +the threshold problem size for which parallelism becomes advantageous +will depend on the precise problem you are interested in, your hardware, +and your MPI implementation. + + A note on terminology: in MPI, you divide the data among a set of +"processes" which each run in their own memory address space. +Generally, each process runs on a different physical processor, but this +is not required. A set of processes in MPI is described by an opaque +data structure called a "communicator," the most common of which is the +predefined communicator 'MPI_COMM_WORLD' which refers to _all_ +processes. For more information on these and other concepts common to +all MPI programs, we refer the reader to the documentation at the MPI +home page (http://www.mcs.anl.gov/research/projects/mpi/). + + We assume in this chapter that the reader is familiar with the usage +of the serial (uniprocessor) FFTW, and focus only on the concepts new to +the MPI interface. + +* Menu: + +* FFTW MPI Installation:: +* Linking and Initializing MPI FFTW:: +* 2d MPI example:: +* MPI Data Distribution:: +* Multi-dimensional MPI DFTs of Real Data:: +* Other Multi-dimensional Real-data MPI Transforms:: +* FFTW MPI Transposes:: +* FFTW MPI Wisdom:: +* Avoiding MPI Deadlocks:: +* FFTW MPI Performance Tips:: +* Combining MPI and Threads:: +* FFTW MPI Reference:: +* FFTW MPI Fortran Interface:: + + +File: fftw3.info, Node: FFTW MPI Installation, Next: Linking and Initializing MPI FFTW, Prev: Distributed-memory FFTW with MPI, Up: Distributed-memory FFTW with MPI + +6.1 FFTW MPI Installation +========================= + +All of the FFTW MPI code is located in the 'mpi' subdirectory of the +FFTW package. On Unix systems, the FFTW MPI libraries and header files +are automatically configured, compiled, and installed along with the +uniprocessor FFTW libraries simply by including '--enable-mpi' in the +flags to the 'configure' script (*note Installation on Unix::). + + Any implementation of the MPI standard, version 1 or later, should +work with FFTW. The 'configure' script will attempt to automatically +detect how to compile and link code using your MPI implementation. In +some cases, especially if you have multiple different MPI +implementations installed or have an unusual MPI software package, you +may need to provide this information explicitly. + + Most commonly, one compiles MPI code by invoking a special compiler +command, typically 'mpicc' for C code. The 'configure' script knows the +most common names for this command, but you can specify the MPI +compilation command explicitly by setting the 'MPICC' variable, as in +'./configure MPICC=mpicc ...'. + + If, instead of a special compiler command, you need to link a certain +library, you can specify the link command via the 'MPILIBS' variable, as +in './configure MPILIBS=-lmpi ...'. Note that if your MPI library is +installed in a non-standard location (one the compiler does not know +about by default), you may also have to specify the location of the +library and header files via 'LDFLAGS' and 'CPPFLAGS' variables, +respectively, as in './configure LDFLAGS=-L/path/to/mpi/libs +CPPFLAGS=-I/path/to/mpi/include ...'. + + +File: fftw3.info, Node: Linking and Initializing MPI FFTW, Next: 2d MPI example, Prev: FFTW MPI Installation, Up: Distributed-memory FFTW with MPI + +6.2 Linking and Initializing MPI FFTW +===================================== + +Programs using the MPI FFTW routines should be linked with '-lfftw3_mpi +-lfftw3 -lm' on Unix in double precision, '-lfftw3f_mpi -lfftw3f -lm' in +single precision, and so on (*note Precision::). You will also need to +link with whatever library is responsible for MPI on your system; in +most MPI implementations, there is a special compiler alias named +'mpicc' to compile and link MPI code. + + Before calling any FFTW routines except possibly 'fftw_init_threads' +(*note Combining MPI and Threads::), but after calling 'MPI_Init', you +should call the function: + + void fftw_mpi_init(void); + + If, at the end of your program, you want to get rid of all memory and +other resources allocated internally by FFTW, for both the serial and +MPI routines, you can call: + + void fftw_mpi_cleanup(void); + + which is much like the 'fftw_cleanup()' function except that it also +gets rid of FFTW's MPI-related data. You must _not_ execute any +previously created plans after calling this function. + + +File: fftw3.info, Node: 2d MPI example, Next: MPI Data Distribution, Prev: Linking and Initializing MPI FFTW, Up: Distributed-memory FFTW with MPI + +6.3 2d MPI example +================== + +Before we document the FFTW MPI interface in detail, we begin with a +simple example outlining how one would perform a two-dimensional 'N0' by +'N1' complex DFT. + + #include + + int main(int argc, char **argv) + { + const ptrdiff_t N0 = ..., N1 = ...; + fftw_plan plan; + fftw_complex *data; + ptrdiff_t alloc_local, local_n0, local_0_start, i, j; + + MPI_Init(&argc, &argv); + fftw_mpi_init(); + + /* get local data size and allocate */ + alloc_local = fftw_mpi_local_size_2d(N0, N1, MPI_COMM_WORLD, + &local_n0, &local_0_start); + data = fftw_alloc_complex(alloc_local); + + /* create plan for in-place forward DFT */ + plan = fftw_mpi_plan_dft_2d(N0, N1, data, data, MPI_COMM_WORLD, + FFTW_FORWARD, FFTW_ESTIMATE); + + /* initialize data to some function my_function(x,y) */ + for (i = 0; i < local_n0; ++i) for (j = 0; j < N1; ++j) + data[i*N1 + j] = my_function(local_0_start + i, j); + + /* compute transforms, in-place, as many times as desired */ + fftw_execute(plan); + + fftw_destroy_plan(plan); + + MPI_Finalize(); + } + + As can be seen above, the MPI interface follows the same basic style +of allocate/plan/execute/destroy as the serial FFTW routines. All of +the MPI-specific routines are prefixed with 'fftw_mpi_' instead of +'fftw_'. There are a few important differences, however: + + First, we must call 'fftw_mpi_init()' after calling 'MPI_Init' +(required in all MPI programs) and before calling any other 'fftw_mpi_' +routine. + + Second, when we create the plan with 'fftw_mpi_plan_dft_2d', +analogous to 'fftw_plan_dft_2d', we pass an additional argument: the +communicator, indicating which processes will participate in the +transform (here 'MPI_COMM_WORLD', indicating all processes). Whenever +you create, execute, or destroy a plan for an MPI transform, you must +call the corresponding FFTW routine on _all_ processes in the +communicator for that transform. (That is, these are _collective_ +calls.) Note that the plan for the MPI transform uses the standard +'fftw_execute' and 'fftw_destroy' routines (on the other hand, there are +MPI-specific new-array execute functions documented below). + + Third, all of the FFTW MPI routines take 'ptrdiff_t' arguments +instead of 'int' as for the serial FFTW. 'ptrdiff_t' is a standard C +integer type which is (at least) 32 bits wide on a 32-bit machine and 64 +bits wide on a 64-bit machine. This is to make it easy to specify very +large parallel transforms on a 64-bit machine. (You can specify 64-bit +transform sizes in the serial FFTW, too, but only by using the 'guru64' +planner interface. *Note 64-bit Guru Interface::.) + + Fourth, and most importantly, you don't allocate the entire +two-dimensional array on each process. Instead, you call +'fftw_mpi_local_size_2d' to find out what _portion_ of the array resides +on each processor, and how much space to allocate. Here, the portion of +the array on each process is a 'local_n0' by 'N1' slice of the total +array, starting at index 'local_0_start'. The total number of +'fftw_complex' numbers to allocate is given by the 'alloc_local' return +value, which _may_ be greater than 'local_n0 * N1' (in case some +intermediate calculations require additional storage). The data +distribution in FFTW's MPI interface is described in more detail by the +next section. + + Given the portion of the array that resides on the local process, it +is straightforward to initialize the data (here to a function +'myfunction') and otherwise manipulate it. Of course, at the end of the +program you may want to output the data somehow, but synchronizing this +output is up to you and is beyond the scope of this manual. (One good +way to output a large multi-dimensional distributed array in MPI to a +portable binary file is to use the free HDF5 library; see the HDF home +page (http://www.hdfgroup.org/).) + + +File: fftw3.info, Node: MPI Data Distribution, Next: Multi-dimensional MPI DFTs of Real Data, Prev: 2d MPI example, Up: Distributed-memory FFTW with MPI + +6.4 MPI Data Distribution +========================= + +The most important concept to understand in using FFTW's MPI interface +is the data distribution. With a serial or multithreaded FFT, all of +the inputs and outputs are stored as a single contiguous chunk of +memory. With a distributed-memory FFT, the inputs and outputs are +broken into disjoint blocks, one per process. + + In particular, FFTW uses a _1d block distribution_ of the data, +distributed along the _first dimension_. For example, if you want to +perform a 100 x 200 complex DFT, distributed over 4 processes, each +process will get a 25 x 200 slice of the data. That is, process 0 will +get rows 0 through 24, process 1 will get rows 25 through 49, process 2 +will get rows 50 through 74, and process 3 will get rows 75 through 99. +If you take the same array but distribute it over 3 processes, then it +is not evenly divisible so the different processes will have unequal +chunks. FFTW's default choice in this case is to assign 34 rows to +processes 0 and 1, and 32 rows to process 2. + + FFTW provides several 'fftw_mpi_local_size' routines that you can +call to find out what portion of an array is stored on the current +process. In most cases, you should use the default block sizes picked +by FFTW, but it is also possible to specify your own block size. For +example, with a 100 x 200 array on three processes, you can tell FFTW to +use a block size of 40, which would assign 40 rows to processes 0 and 1, +and 20 rows to process 2. FFTW's default is to divide the data equally +among the processes if possible, and as best it can otherwise. The rows +are always assigned in "rank order," i.e. process 0 gets the first +block of rows, then process 1, and so on. (You can change this by using +'MPI_Comm_split' to create a new communicator with re-ordered +processes.) However, you should always call the 'fftw_mpi_local_size' +routines, if possible, rather than trying to predict FFTW's distribution +choices. + + In particular, it is critical that you allocate the storage size that +is returned by 'fftw_mpi_local_size', which is _not_ necessarily the +size of the local slice of the array. The reason is that intermediate +steps of FFTW's algorithms involve transposing the array and +redistributing the data, so at these intermediate steps FFTW may require +more local storage space (albeit always proportional to the total size +divided by the number of processes). The 'fftw_mpi_local_size' +functions know how much storage is required for these intermediate steps +and tell you the correct amount to allocate. + +* Menu: + +* Basic and advanced distribution interfaces:: +* Load balancing:: +* Transposed distributions:: +* One-dimensional distributions:: + + +File: fftw3.info, Node: Basic and advanced distribution interfaces, Next: Load balancing, Prev: MPI Data Distribution, Up: MPI Data Distribution + +6.4.1 Basic and advanced distribution interfaces +------------------------------------------------ + +As with the planner interface, the 'fftw_mpi_local_size' distribution +interface is broken into basic and advanced ('_many') interfaces, where +the latter allows you to specify the block size manually and also to +request block sizes when computing multiple transforms simultaneously. +These functions are documented more exhaustively by the FFTW MPI +Reference, but we summarize the basic ideas here using a couple of +two-dimensional examples. + + For the 100 x 200 complex-DFT example, above, we would find the +distribution by calling the following function in the basic interface: + + ptrdiff_t fftw_mpi_local_size_2d(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); + + Given the total size of the data to be transformed (here, 'n0 = 100' +and 'n1 = 200') and an MPI communicator ('comm'), this function provides +three numbers. + + First, it describes the shape of the local data: the current process +should store a 'local_n0' by 'n1' slice of the overall dataset, in +row-major order ('n1' dimension contiguous), starting at index +'local_0_start'. That is, if the total dataset is viewed as a 'n0' by +'n1' matrix, the current process should store the rows 'local_0_start' +to 'local_0_start+local_n0-1'. Obviously, if you are running with only +a single MPI process, that process will store the entire array: +'local_0_start' will be zero and 'local_n0' will be 'n0'. *Note +Row-major Format::. + + Second, the return value is the total number of data elements (e.g., +complex numbers for a complex DFT) that should be allocated for the +input and output arrays on the current process (ideally with +'fftw_malloc' or an 'fftw_alloc' function, to ensure optimal alignment). +It might seem that this should always be equal to 'local_n0 * n1', but +this is _not_ the case. FFTW's distributed FFT algorithms require data +redistributions at intermediate stages of the transform, and in some +circumstances this may require slightly larger local storage. This is +discussed in more detail below, under *note Load balancing::. + + The advanced-interface 'local_size' function for multidimensional +transforms returns the same three things ('local_n0', 'local_0_start', +and the total number of elements to allocate), but takes more inputs: + + ptrdiff_t fftw_mpi_local_size_many(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t block0, + MPI_Comm comm, + ptrdiff_t *local_n0, + ptrdiff_t *local_0_start); + + The two-dimensional case above corresponds to 'rnk = 2' and an array +'n' of length 2 with 'n[0] = n0' and 'n[1] = n1'. This routine is for +any 'rnk > 1'; one-dimensional transforms have their own interface +because they work slightly differently, as discussed below. + + First, the advanced interface allows you to perform multiple +transforms at once, of interleaved data, as specified by the 'howmany' +parameter. ('hoamany' is 1 for a single transform.) + + Second, here you can specify your desired block size in the 'n0' +dimension, 'block0'. To use FFTW's default block size, pass +'FFTW_MPI_DEFAULT_BLOCK' (0) for 'block0'. Otherwise, on 'P' processes, +FFTW will return 'local_n0' equal to 'block0' on the first 'P / block0' +processes (rounded down), return 'local_n0' equal to 'n0 - block0 * (P / +block0)' on the next process, and 'local_n0' equal to zero on any +remaining processes. In general, we recommend using the default block +size (which corresponds to 'n0 / P', rounded up). + + For example, suppose you have 'P = 4' processes and 'n0 = 21'. The +default will be a block size of '6', which will give 'local_n0 = 6' on +the first three processes and 'local_n0 = 3' on the last process. +Instead, however, you could specify 'block0 = 5' if you wanted, which +would give 'local_n0 = 5' on processes 0 to 2, 'local_n0 = 6' on process +3. (This choice, while it may look superficially more "balanced," has +the same critical path as FFTW's default but requires more +communications.) + + +File: fftw3.info, Node: Load balancing, Next: Transposed distributions, Prev: Basic and advanced distribution interfaces, Up: MPI Data Distribution + +6.4.2 Load balancing +-------------------- + +Ideally, when you parallelize a transform over some P processes, each +process should end up with work that takes equal time. Otherwise, all +of the processes end up waiting on whichever process is slowest. This +goal is known as "load balancing." In this section, we describe the +circumstances under which FFTW is able to load-balance well, and in +particular how you should choose your transform size in order to load +balance. + + Load balancing is especially difficult when you are parallelizing +over heterogeneous machines; for example, if one of your processors is a +old 486 and another is a Pentium IV, obviously you should give the +Pentium more work to do than the 486 since the latter is much slower. +FFTW does not deal with this problem, however--it assumes that your +processes run on hardware of comparable speed, and that the goal is +therefore to divide the problem as equally as possible. + + For a multi-dimensional complex DFT, FFTW can divide the problem +equally among the processes if: (i) the _first_ dimension 'n0' is +divisible by P; and (ii), the _product_ of the subsequent dimensions is +divisible by P. (For the advanced interface, where you can specify +multiple simultaneous transforms via some "vector" length 'howmany', a +factor of 'howmany' is included in the product of the subsequent +dimensions.) + + For a one-dimensional complex DFT, the length 'N' of the data should +be divisible by P _squared_ to be able to divide the problem equally +among the processes. + + +File: fftw3.info, Node: Transposed distributions, Next: One-dimensional distributions, Prev: Load balancing, Up: MPI Data Distribution + +6.4.3 Transposed distributions +------------------------------ + +Internally, FFTW's MPI transform algorithms work by first computing +transforms of the data local to each process, then by globally +_transposing_ the data in some fashion to redistribute the data among +the processes, transforming the new data local to each process, and +transposing back. For example, a two-dimensional 'n0' by 'n1' array, +distributed across the 'n0' dimension, is transformd by: (i) +transforming the 'n1' dimension, which are local to each process; (ii) +transposing to an 'n1' by 'n0' array, distributed across the 'n1' +dimension; (iii) transforming the 'n0' dimension, which is now local to +each process; (iv) transposing back. + + However, in many applications it is acceptable to compute a +multidimensional DFT whose results are produced in transposed order +(e.g., 'n1' by 'n0' in two dimensions). This provides a significant +performance advantage, because it means that the final transposition +step can be omitted. FFTW supports this optimization, which you specify +by passing the flag 'FFTW_MPI_TRANSPOSED_OUT' to the planner routines. +To compute the inverse transform of transposed output, you specify +'FFTW_MPI_TRANSPOSED_IN' to tell it that the input is transposed. In +this section, we explain how to interpret the output format of such a +transform. + + Suppose you have are transforming multi-dimensional data with (at +least two) dimensions n[0] x n[1] x n[2] x ... x n[d-1] . As always, +it is distributed along the first dimension n[0] . Now, if we compute +its DFT with the 'FFTW_MPI_TRANSPOSED_OUT' flag, the resulting output +data are stored with the first _two_ dimensions transposed: n[1] x n[0] +x n[2] x ... x n[d-1] , distributed along the n[1] dimension. +Conversely, if we take the n[1] x n[0] x n[2] x ... x n[d-1] data and +transform it with the 'FFTW_MPI_TRANSPOSED_IN' flag, then the format +goes back to the original n[0] x n[1] x n[2] x ... x n[d-1] array. + + There are two ways to find the portion of the transposed array that +resides on the current process. First, you can simply call the +appropriate 'local_size' function, passing n[1] x n[0] x n[2] x ... x +n[d-1] (the transposed dimensions). This would mean calling the +'local_size' function twice, once for the transposed and once for the +non-transposed dimensions. Alternatively, you can call one of the +'local_size_transposed' functions, which returns both the non-transposed +and transposed data distribution from a single call. For example, for a +3d transform with transposed output (or input), you might call: + + ptrdiff_t fftw_mpi_local_size_3d_transposed( + ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); + + Here, 'local_n0' and 'local_0_start' give the size and starting index +of the 'n0' dimension for the _non_-transposed data, as in the previous +sections. For _transposed_ data (e.g. the output for +'FFTW_MPI_TRANSPOSED_OUT'), 'local_n1' and 'local_1_start' give the size +and starting index of the 'n1' dimension, which is the first dimension +of the transposed data ('n1' by 'n0' by 'n2'). + + (Note that 'FFTW_MPI_TRANSPOSED_IN' is completely equivalent to +performing 'FFTW_MPI_TRANSPOSED_OUT' and passing the first two +dimensions to the planner in reverse order, or vice versa. If you pass +_both_ the 'FFTW_MPI_TRANSPOSED_IN' and 'FFTW_MPI_TRANSPOSED_OUT' flags, +it is equivalent to swapping the first two dimensions passed to the +planner and passing _neither_ flag.) + + +File: fftw3.info, Node: One-dimensional distributions, Prev: Transposed distributions, Up: MPI Data Distribution + +6.4.4 One-dimensional distributions +----------------------------------- + +For one-dimensional distributed DFTs using FFTW, matters are slightly +more complicated because the data distribution is more closely tied to +how the algorithm works. In particular, you can no longer pass an +arbitrary block size and must accept FFTW's default; also, the block +sizes may be different for input and output. Also, the data +distribution depends on the flags and transform direction, in order for +forward and backward transforms to work correctly. + + ptrdiff_t fftw_mpi_local_size_1d(ptrdiff_t n0, MPI_Comm comm, + int sign, unsigned flags, + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, + ptrdiff_t *local_no, ptrdiff_t *local_o_start); + + This function computes the data distribution for a 1d transform of +size 'n0' with the given transform 'sign' and 'flags'. Both input and +output data use block distributions. The input on the current process +will consist of 'local_ni' numbers starting at index 'local_i_start'; +e.g. if only a single process is used, then 'local_ni' will be 'n0' and +'local_i_start' will be '0'. Similarly for the output, with 'local_no' +numbers starting at index 'local_o_start'. The return value of +'fftw_mpi_local_size_1d' will be the total number of elements to +allocate on the current process (which might be slightly larger than the +local size due to intermediate steps in the algorithm). + + As mentioned above (*note Load balancing::), the data will be divided +equally among the processes if 'n0' is divisible by the _square_ of the +number of processes. In this case, 'local_ni' will equal 'local_no'. +Otherwise, they may be different. + + For some applications, such as convolutions, the order of the output +data is irrelevant. In this case, performance can be improved by +specifying that the output data be stored in an FFTW-defined "scrambled" +format. (In particular, this is the analogue of transposed output in +the multidimensional case: scrambled output saves a communications +step.) If you pass 'FFTW_MPI_SCRAMBLED_OUT' in the flags, then the +output is stored in this (undocumented) scrambled order. Conversely, to +perform the inverse transform of data in scrambled order, pass the +'FFTW_MPI_SCRAMBLED_IN' flag. + + In MPI FFTW, only composite sizes 'n0' can be parallelized; we have +not yet implemented a parallel algorithm for large prime sizes. + + +File: fftw3.info, Node: Multi-dimensional MPI DFTs of Real Data, Next: Other Multi-dimensional Real-data MPI Transforms, Prev: MPI Data Distribution, Up: Distributed-memory FFTW with MPI + +6.5 Multi-dimensional MPI DFTs of Real Data +=========================================== + +FFTW's MPI interface also supports multi-dimensional DFTs of real data, +similar to the serial r2c and c2r interfaces. (Parallel one-dimensional +real-data DFTs are not currently supported; you must use a complex +transform and set the imaginary parts of the inputs to zero.) + + The key points to understand for r2c and c2r MPI transforms (compared +to the MPI complex DFTs or the serial r2c/c2r transforms), are: + + * Just as for serial transforms, r2c/c2r DFTs transform n[0] x n[1] x + n[2] x ... x n[d-1] real data to/from n[0] x n[1] x n[2] x ... x + (n[d-1]/2 + 1) complex data: the last dimension of the complex data + is cut in half (rounded down), plus one. As for the serial + transforms, the sizes you pass to the 'plan_dft_r2c' and + 'plan_dft_c2r' are the n[0] x n[1] x n[2] x ... x n[d-1] + dimensions of the real data. + + * Although the real data is _conceptually_ n[0] x n[1] x n[2] x ... + x n[d-1] , it is _physically_ stored as an n[0] x n[1] x n[2] x ... + x [2 (n[d-1]/2 + 1)] array, where the last dimension has been + _padded_ to make it the same size as the complex output. This is + much like the in-place serial r2c/c2r interface (*note + Multi-Dimensional DFTs of Real Data::), except that in MPI the + padding is required even for out-of-place data. The extra padding + numbers are ignored by FFTW (they are _not_ like zero-padding the + transform to a larger size); they are only used to determine the + data layout. + + * The data distribution in MPI for _both_ the real and complex data + is determined by the shape of the _complex_ data. That is, you + call the appropriate 'local size' function for the n[0] x n[1] x + n[2] x ... x (n[d-1]/2 + 1) complex data, and then use the _same_ + distribution for the real data except that the last complex + dimension is replaced by a (padded) real dimension of twice the + length. + + For example suppose we are performing an out-of-place r2c transform +of L x M x N real data [padded to L x M x 2(N/2+1) ], resulting in L x M +x N/2+1 complex data. Similar to the example in *note 2d MPI example::, +we might do something like: + + #include + + int main(int argc, char **argv) + { + const ptrdiff_t L = ..., M = ..., N = ...; + fftw_plan plan; + double *rin; + fftw_complex *cout; + ptrdiff_t alloc_local, local_n0, local_0_start, i, j, k; + + MPI_Init(&argc, &argv); + fftw_mpi_init(); + + /* get local data size and allocate */ + alloc_local = fftw_mpi_local_size_3d(L, M, N/2+1, MPI_COMM_WORLD, + &local_n0, &local_0_start); + rin = fftw_alloc_real(2 * alloc_local); + cout = fftw_alloc_complex(alloc_local); + + /* create plan for out-of-place r2c DFT */ + plan = fftw_mpi_plan_dft_r2c_3d(L, M, N, rin, cout, MPI_COMM_WORLD, + FFTW_MEASURE); + + /* initialize rin to some function my_func(x,y,z) */ + for (i = 0; i < local_n0; ++i) + for (j = 0; j < M; ++j) + for (k = 0; k < N; ++k) + rin[(i*M + j) * (2*(N/2+1)) + k] = my_func(local_0_start+i, j, k); + + /* compute transforms as many times as desired */ + fftw_execute(plan); + + fftw_destroy_plan(plan); + + MPI_Finalize(); + } + + Note that we allocated 'rin' using 'fftw_alloc_real' with an argument +of '2 * alloc_local': since 'alloc_local' is the number of _complex_ +values to allocate, the number of _real_ values is twice as many. The +'rin' array is then local_n0 x M x 2(N/2+1) in row-major order, so its +'(i,j,k)' element is at the index '(i*M + j) * (2*(N/2+1)) + k' (*note +Multi-dimensional Array Format::). + + As for the complex transforms, improved performance can be obtained +by specifying that the output is the transpose of the input or vice +versa (*note Transposed distributions::). In our L x M x N r2c example, +including 'FFTW_TRANSPOSED_OUT' in the flags means that the input would +be a padded L x M x 2(N/2+1) real array distributed over the 'L' +dimension, while the output would be a M x L x N/2+1 complex array +distributed over the 'M' dimension. To perform the inverse c2r +transform with the same data distributions, you would use the +'FFTW_TRANSPOSED_IN' flag. + + +File: fftw3.info, Node: Other Multi-dimensional Real-data MPI Transforms, Next: FFTW MPI Transposes, Prev: Multi-dimensional MPI DFTs of Real Data, Up: Distributed-memory FFTW with MPI + +6.6 Other multi-dimensional Real-Data MPI Transforms +==================================================== + +FFTW's MPI interface also supports multi-dimensional 'r2r' transforms of +all kinds supported by the serial interface (e.g. discrete cosine and +sine transforms, discrete Hartley transforms, etc.). Only +multi-dimensional 'r2r' transforms, not one-dimensional transforms, are +currently parallelized. + + These are used much like the multidimensional complex DFTs discussed +above, except that the data is real rather than complex, and one needs +to pass an r2r transform kind ('fftw_r2r_kind') for each dimension as in +the serial FFTW (*note More DFTs of Real Data::). + + For example, one might perform a two-dimensional L x M that is an +REDFT10 (DCT-II) in the first dimension and an RODFT10 (DST-II) in the +second dimension with code like: + + const ptrdiff_t L = ..., M = ...; + fftw_plan plan; + double *data; + ptrdiff_t alloc_local, local_n0, local_0_start, i, j; + + /* get local data size and allocate */ + alloc_local = fftw_mpi_local_size_2d(L, M, MPI_COMM_WORLD, + &local_n0, &local_0_start); + data = fftw_alloc_real(alloc_local); + + /* create plan for in-place REDFT10 x RODFT10 */ + plan = fftw_mpi_plan_r2r_2d(L, M, data, data, MPI_COMM_WORLD, + FFTW_REDFT10, FFTW_RODFT10, FFTW_MEASURE); + + /* initialize data to some function my_function(x,y) */ + for (i = 0; i < local_n0; ++i) for (j = 0; j < M; ++j) + data[i*M + j] = my_function(local_0_start + i, j); + + /* compute transforms, in-place, as many times as desired */ + fftw_execute(plan); + + fftw_destroy_plan(plan); + + Notice that we use the same 'local_size' functions as we did for +complex data, only now we interpret the sizes in terms of real rather +than complex values, and correspondingly use 'fftw_alloc_real'. + + +File: fftw3.info, Node: FFTW MPI Transposes, Next: FFTW MPI Wisdom, Prev: Other Multi-dimensional Real-data MPI Transforms, Up: Distributed-memory FFTW with MPI + +6.7 FFTW MPI Transposes +======================= + +The FFTW's MPI Fourier transforms rely on one or more _global +transposition_ step for their communications. For example, the +multidimensional transforms work by transforming along some dimensions, +then transposing to make the first dimension local and transforming +that, then transposing back. Because global transposition of a +block-distributed matrix has many other potential uses besides FFTs, +FFTW's transpose routines can be called directly, as documented in this +section. + +* Menu: + +* Basic distributed-transpose interface:: +* Advanced distributed-transpose interface:: +* An improved replacement for MPI_Alltoall:: + + +File: fftw3.info, Node: Basic distributed-transpose interface, Next: Advanced distributed-transpose interface, Prev: FFTW MPI Transposes, Up: FFTW MPI Transposes + +6.7.1 Basic distributed-transpose interface +------------------------------------------- + +In particular, suppose that we have an 'n0' by 'n1' array in row-major +order, block-distributed across the 'n0' dimension. To transpose this +into an 'n1' by 'n0' array block-distributed across the 'n1' dimension, +we would create a plan by calling the following function: + + fftw_plan fftw_mpi_plan_transpose(ptrdiff_t n0, ptrdiff_t n1, + double *in, double *out, + MPI_Comm comm, unsigned flags); + + The input and output arrays ('in' and 'out') can be the same. The +transpose is actually executed by calling 'fftw_execute' on the plan, as +usual. + + The 'flags' are the usual FFTW planner flags, but support two +additional flags: 'FFTW_MPI_TRANSPOSED_OUT' and/or +'FFTW_MPI_TRANSPOSED_IN'. What these flags indicate, for transpose +plans, is that the output and/or input, respectively, are _locally_ +transposed. That is, on each process input data is normally stored as a +'local_n0' by 'n1' array in row-major order, but for an +'FFTW_MPI_TRANSPOSED_IN' plan the input data is stored as 'n1' by +'local_n0' in row-major order. Similarly, 'FFTW_MPI_TRANSPOSED_OUT' +means that the output is 'n0' by 'local_n1' instead of 'local_n1' by +'n0'. + + To determine the local size of the array on each process before and +after the transpose, as well as the amount of storage that must be +allocated, one should call 'fftw_mpi_local_size_2d_transposed', just as +for a 2d DFT as described in the previous section: + + ptrdiff_t fftw_mpi_local_size_2d_transposed + (ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); + + Again, the return value is the local storage to allocate, which in +this case is the number of _real_ ('double') values rather than complex +numbers as in the previous examples. + + +File: fftw3.info, Node: Advanced distributed-transpose interface, Next: An improved replacement for MPI_Alltoall, Prev: Basic distributed-transpose interface, Up: FFTW MPI Transposes + +6.7.2 Advanced distributed-transpose interface +---------------------------------------------- + +The above routines are for a transpose of a matrix of numbers (of type +'double'), using FFTW's default block sizes. More generally, one can +perform transposes of _tuples_ of numbers, with user-specified block +sizes for the input and output: + + fftw_plan fftw_mpi_plan_many_transpose + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany, + ptrdiff_t block0, ptrdiff_t block1, + double *in, double *out, MPI_Comm comm, unsigned flags); + + In this case, one is transposing an 'n0' by 'n1' matrix of +'howmany'-tuples (e.g. 'howmany = 2' for complex numbers). The input +is distributed along the 'n0' dimension with block size 'block0', and +the 'n1' by 'n0' output is distributed along the 'n1' dimension with +block size 'block1'. If 'FFTW_MPI_DEFAULT_BLOCK' (0) is passed for a +block size then FFTW uses its default block size. To get the local size +of the data on each process, you should then call +'fftw_mpi_local_size_many_transposed'. + + +File: fftw3.info, Node: An improved replacement for MPI_Alltoall, Prev: Advanced distributed-transpose interface, Up: FFTW MPI Transposes + +6.7.3 An improved replacement for MPI_Alltoall +---------------------------------------------- + +We close this section by noting that FFTW's MPI transpose routines can +be thought of as a generalization for the 'MPI_Alltoall' function +(albeit only for floating-point types), and in some circumstances can +function as an improved replacement. + + 'MPI_Alltoall' is defined by the MPI standard as: + + int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcnt, MPI_Datatype recvtype, + MPI_Comm comm); + + In particular, for 'double*' arrays 'in' and 'out', consider the +call: + + MPI_Alltoall(in, howmany, MPI_DOUBLE, out, howmany MPI_DOUBLE, comm); + + This is completely equivalent to: + + MPI_Comm_size(comm, &P); + plan = fftw_mpi_plan_many_transpose(P, P, howmany, 1, 1, in, out, comm, FFTW_ESTIMATE); + fftw_execute(plan); + fftw_destroy_plan(plan); + + That is, computing a P x P transpose on 'P' processes, with a block +size of 1, is just a standard all-to-all communication. + + However, using the FFTW routine instead of 'MPI_Alltoall' may have +certain advantages. First of all, FFTW's routine can operate in-place +('in == out') whereas 'MPI_Alltoall' can only operate out-of-place. + + Second, even for out-of-place plans, FFTW's routine may be faster, +especially if you need to perform the all-to-all communication many +times and can afford to use 'FFTW_MEASURE' or 'FFTW_PATIENT'. It should +certainly be no slower, not including the time to create the plan, since +one of the possible algorithms that FFTW uses for an out-of-place +transpose _is_ simply to call 'MPI_Alltoall'. However, FFTW also +considers several other possible algorithms that, depending on your MPI +implementation and your hardware, may be faster. + + +File: fftw3.info, Node: FFTW MPI Wisdom, Next: Avoiding MPI Deadlocks, Prev: FFTW MPI Transposes, Up: Distributed-memory FFTW with MPI + +6.8 FFTW MPI Wisdom +=================== + +FFTW's "wisdom" facility (*note Words of Wisdom-Saving Plans::) can be +used to save MPI plans as well as to save uniprocessor plans. However, +for MPI there are several unavoidable complications. + + First, the MPI standard does not guarantee that every process can +perform file I/O (at least, not using C stdio routines)--in general, we +may only assume that process 0 is capable of I/O.(1) So, if we want to +export the wisdom from a single process to a file, we must first export +the wisdom to a string, then send it to process 0, then write it to a +file. + + Second, in principle we may want to have separate wisdom for every +process, since in general the processes may run on different hardware +even for a single MPI program. However, in practice FFTW's MPI code is +designed for the case of homogeneous hardware (*note Load balancing::), +and in this case it is convenient to use the same wisdom for every +process. Thus, we need a mechanism to synchronize the wisdom. + + To address both of these problems, FFTW provides the following two +functions: + + void fftw_mpi_broadcast_wisdom(MPI_Comm comm); + void fftw_mpi_gather_wisdom(MPI_Comm comm); + + Given a communicator 'comm', 'fftw_mpi_broadcast_wisdom' will +broadcast the wisdom from process 0 to all other processes. Conversely, +'fftw_mpi_gather_wisdom' will collect wisdom from all processes onto +process 0. (If the plans created for the same problem by different +processes are not the same, 'fftw_mpi_gather_wisdom' will arbitrarily +choose one of the plans.) Both of these functions may result in +suboptimal plans for different processes if the processes are running on +non-identical hardware. Both of these functions are _collective_ calls, +which means that they must be executed by all processes in the +communicator. + + So, for example, a typical code snippet to import wisdom from a file +and use it on all processes would be: + + { + int rank; + + fftw_mpi_init(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (rank == 0) fftw_import_wisdom_from_filename("mywisdom"); + fftw_mpi_broadcast_wisdom(MPI_COMM_WORLD); + } + + (Note that we must call 'fftw_mpi_init' before importing any wisdom +that might contain MPI plans.) Similarly, a typical code snippet to +export wisdom from all processes to a file is: + + { + int rank; + + fftw_mpi_gather_wisdom(MPI_COMM_WORLD); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (rank == 0) fftw_export_wisdom_to_filename("mywisdom"); + } + + ---------- Footnotes ---------- + + (1) In fact, even this assumption is not technically guaranteed by +the standard, although it seems to be universal in actual MPI +implementations and is widely assumed by MPI-using software. +Technically, you need to query the 'MPI_IO' attribute of +'MPI_COMM_WORLD' with 'MPI_Attr_get'. If this attribute is +'MPI_PROC_NULL', no I/O is possible. If it is 'MPI_ANY_SOURCE', any +process can perform I/O. Otherwise, it is the rank of a process that can +perform I/O ... but since it is not guaranteed to yield the _same_ rank +on all processes, you have to do an 'MPI_Allreduce' of some kind if you +want all processes to agree about which is going to do I/O. And even +then, the standard only guarantees that this process can perform output, +but not input. See e.g. 'Parallel Programming with MPI' by P. S. +Pacheco, section 8.1.3. Needless to say, in our experience virtually no +MPI programmers worry about this. + + +File: fftw3.info, Node: Avoiding MPI Deadlocks, Next: FFTW MPI Performance Tips, Prev: FFTW MPI Wisdom, Up: Distributed-memory FFTW with MPI + +6.9 Avoiding MPI Deadlocks +========================== + +An MPI program can _deadlock_ if one process is waiting for a message +from another process that never gets sent. To avoid deadlocks when +using FFTW's MPI routines, it is important to know which functions are +_collective_: that is, which functions must _always_ be called in the +_same order_ from _every_ process in a given communicator. (For +example, 'MPI_Barrier' is the canonical example of a collective function +in the MPI standard.) + + The functions in FFTW that are _always_ collective are: every +function beginning with 'fftw_mpi_plan', as well as +'fftw_mpi_broadcast_wisdom' and 'fftw_mpi_gather_wisdom'. Also, the +following functions from the ordinary FFTW interface are collective when +they are applied to a plan created by an 'fftw_mpi_plan' function: +'fftw_execute', 'fftw_destroy_plan', and 'fftw_flops'. + + +File: fftw3.info, Node: FFTW MPI Performance Tips, Next: Combining MPI and Threads, Prev: Avoiding MPI Deadlocks, Up: Distributed-memory FFTW with MPI + +6.10 FFTW MPI Performance Tips +============================== + +In this section, we collect a few tips on getting the best performance +out of FFTW's MPI transforms. + + First, because of the 1d block distribution, FFTW's parallelization +is currently limited by the size of the first dimension. +(Multidimensional block distributions may be supported by a future +version.) More generally, you should ideally arrange the dimensions so +that FFTW can divide them equally among the processes. *Note Load +balancing::. + + Second, if it is not too inconvenient, you should consider working +with transposed output for multidimensional plans, as this saves a +considerable amount of communications. *Note Transposed +distributions::. + + Third, the fastest choices are generally either an in-place transform +or an out-of-place transform with the 'FFTW_DESTROY_INPUT' flag (which +allows the input array to be used as scratch space). In-place is +especially beneficial if the amount of data per process is large. + + Fourth, if you have multiple arrays to transform at once, rather than +calling FFTW's MPI transforms several times it usually seems to be +faster to interleave the data and use the advanced interface. (This +groups the communications together instead of requiring separate +messages for each transform.) + + +File: fftw3.info, Node: Combining MPI and Threads, Next: FFTW MPI Reference, Prev: FFTW MPI Performance Tips, Up: Distributed-memory FFTW with MPI + +6.11 Combining MPI and Threads +============================== + +In certain cases, it may be advantageous to combine MPI +(distributed-memory) and threads (shared-memory) parallelization. FFTW +supports this, with certain caveats. For example, if you have a cluster +of 4-processor shared-memory nodes, you may want to use threads within +the nodes and MPI between the nodes, instead of MPI for all +parallelization. + + In particular, it is possible to seamlessly combine the MPI FFTW +routines with the multi-threaded FFTW routines (*note Multi-threaded +FFTW::). However, some care must be taken in the initialization code, +which should look something like this: + + int threads_ok; + + int main(int argc, char **argv) + { + int provided; + MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided); + threads_ok = provided >= MPI_THREAD_FUNNELED; + + if (threads_ok) threads_ok = fftw_init_threads(); + fftw_mpi_init(); + + ... + if (threads_ok) fftw_plan_with_nthreads(...); + ... + + MPI_Finalize(); + } + + First, note that instead of calling 'MPI_Init', you should call +'MPI_Init_threads', which is the initialization routine defined by the +MPI-2 standard to indicate to MPI that your program will be +multithreaded. We pass 'MPI_THREAD_FUNNELED', which indicates that we +will only call MPI routines from the main thread. (FFTW will launch +additional threads internally, but the extra threads will not call MPI +code.) (You may also pass 'MPI_THREAD_SERIALIZED' or +'MPI_THREAD_MULTIPLE', which requests additional multithreading support +from the MPI implementation, but this is not required by FFTW.) The +'provided' parameter returns what level of threads support is actually +supported by your MPI implementation; this _must_ be at least +'MPI_THREAD_FUNNELED' if you want to call the FFTW threads routines, so +we define a global variable 'threads_ok' to record this. You should +only call 'fftw_init_threads' or 'fftw_plan_with_nthreads' if +'threads_ok' is true. For more information on thread safety in MPI, see +the MPI and Threads +(http://www.mpi-forum.org/docs/mpi-20-html/node162.htm) section of the +MPI-2 standard. + + Second, we must call 'fftw_init_threads' _before_ 'fftw_mpi_init'. +This is critical for technical reasons having to do with how FFTW +initializes its list of algorithms. + + Then, if you call 'fftw_plan_with_nthreads(N)', _every_ MPI process +will launch (up to) 'N' threads to parallelize its transforms. + + For example, in the hypothetical cluster of 4-processor nodes, you +might wish to launch only a single MPI process per node, and then call +'fftw_plan_with_nthreads(4)' on each process to use all processors in +the nodes. + + This may or may not be faster than simply using as many MPI processes +as you have processors, however. On the one hand, using threads within +a node eliminates the need for explicit message passing within the node. +On the other hand, FFTW's transpose routines are not multi-threaded, and +this means that the communications that do take place will not benefit +from parallelization within the node. Moreover, many MPI +implementations already have optimizations to exploit shared memory when +it is available, so adding the multithreaded FFTW on top of this may be +superfluous. + + +File: fftw3.info, Node: FFTW MPI Reference, Next: FFTW MPI Fortran Interface, Prev: Combining MPI and Threads, Up: Distributed-memory FFTW with MPI + +6.12 FFTW MPI Reference +======================= + +This chapter provides a complete reference to all FFTW MPI functions, +datatypes, and constants. See also *note FFTW Reference:: for +information on functions and types in common with the serial interface. + +* Menu: + +* MPI Files and Data Types:: +* MPI Initialization:: +* Using MPI Plans:: +* MPI Data Distribution Functions:: +* MPI Plan Creation:: +* MPI Wisdom Communication:: + + +File: fftw3.info, Node: MPI Files and Data Types, Next: MPI Initialization, Prev: FFTW MPI Reference, Up: FFTW MPI Reference + +6.12.1 MPI Files and Data Types +------------------------------- + +All programs using FFTW's MPI support should include its header file: + + #include + + Note that this header file includes the serial-FFTW 'fftw3.h' header +file, and also the 'mpi.h' header file for MPI, so you need not include +those files separately. + + You must also link to _both_ the FFTW MPI library and to the serial +FFTW library. On Unix, this means adding '-lfftw3_mpi -lfftw3 -lm' at +the end of the link command. + + Different precisions are handled as in the serial interface: *Note +Precision::. That is, 'fftw_' functions become 'fftwf_' (in single +precision) etcetera, and the libraries become '-lfftw3f_mpi -lfftw3f +-lm' etcetera on Unix. Long-double precision is supported in MPI, but +quad precision ('fftwq_') is not due to the lack of MPI support for this +type. + + +File: fftw3.info, Node: MPI Initialization, Next: Using MPI Plans, Prev: MPI Files and Data Types, Up: FFTW MPI Reference + +6.12.2 MPI Initialization +------------------------- + +Before calling any other FFTW MPI ('fftw_mpi_') function, and before +importing any wisdom for MPI problems, you must call: + + void fftw_mpi_init(void); + + If FFTW threads support is used, however, 'fftw_mpi_init' should be +called _after_ 'fftw_init_threads' (*note Combining MPI and Threads::). +Calling 'fftw_mpi_init' additional times (before 'fftw_mpi_cleanup') has +no effect. + + If you want to deallocate all persistent data and reset FFTW to the +pristine state it was in when you started your program, you can call: + + void fftw_mpi_cleanup(void); + + (This calls 'fftw_cleanup', so you need not call the serial cleanup +routine too, although it is safe to do so.) After calling +'fftw_mpi_cleanup', all existing plans become undefined, and you should +not attempt to execute or destroy them. You must call 'fftw_mpi_init' +again after 'fftw_mpi_cleanup' if you want to resume using the MPI FFTW +routines. + + +File: fftw3.info, Node: Using MPI Plans, Next: MPI Data Distribution Functions, Prev: MPI Initialization, Up: FFTW MPI Reference + +6.12.3 Using MPI Plans +---------------------- + +Once an MPI plan is created, you can execute and destroy it using +'fftw_execute', 'fftw_destroy_plan', and the other functions in the +serial interface that operate on generic plans (*note Using Plans::). + + The 'fftw_execute' and 'fftw_destroy_plan' functions, applied to MPI +plans, are _collective_ calls: they must be called for all processes in +the communicator that was used to create the plan. + + You must _not_ use the serial new-array plan-execution functions +'fftw_execute_dft' and so on (*note New-array Execute Functions::) with +MPI plans. Such functions are specialized to the problem type, and +there are specific new-array execute functions for MPI plans: + + void fftw_mpi_execute_dft(fftw_plan p, fftw_complex *in, fftw_complex *out); + void fftw_mpi_execute_dft_r2c(fftw_plan p, double *in, fftw_complex *out); + void fftw_mpi_execute_dft_c2r(fftw_plan p, fftw_complex *in, double *out); + void fftw_mpi_execute_r2r(fftw_plan p, double *in, double *out); + + These functions have the same restrictions as those of the serial +new-array execute functions. They are _always_ safe to apply to the +_same_ 'in' and 'out' arrays that were used to create the plan. They +can only be applied to new arrarys if those arrays have the same types, +dimensions, in-placeness, and alignment as the original arrays, where +the best way to ensure the same alignment is to use FFTW's 'fftw_malloc' +and related allocation functions for all arrays (*note Memory +Allocation::). Note that distributed transposes (*note FFTW MPI +Transposes::) use 'fftw_mpi_execute_r2r', since they count as rank-zero +r2r plans from FFTW's perspective. + + +File: fftw3.info, Node: MPI Data Distribution Functions, Next: MPI Plan Creation, Prev: Using MPI Plans, Up: FFTW MPI Reference + +6.12.4 MPI Data Distribution Functions +-------------------------------------- + +As described above (*note MPI Data Distribution::), in order to allocate +your arrays, _before_ creating a plan, you must first call one of the +following routines to determine the required allocation size and the +portion of the array locally stored on a given process. The 'MPI_Comm' +communicator passed here must be equivalent to the communicator used +below for plan creation. + + The basic interface for multidimensional transforms consists of the +functions: + + ptrdiff_t fftw_mpi_local_size_2d(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); + ptrdiff_t fftw_mpi_local_size_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); + ptrdiff_t fftw_mpi_local_size(int rnk, const ptrdiff_t *n, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); + + ptrdiff_t fftw_mpi_local_size_2d_transposed(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); + ptrdiff_t fftw_mpi_local_size_3d_transposed(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); + ptrdiff_t fftw_mpi_local_size_transposed(int rnk, const ptrdiff_t *n, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); + + These functions return the number of elements to allocate (complex +numbers for DFT/r2c/c2r plans, real numbers for r2r plans), whereas the +'local_n0' and 'local_0_start' return the portion ('local_0_start' to +'local_0_start + local_n0 - 1') of the first dimension of an n[0] x n[1] +x n[2] x ... x n[d-1] array that is stored on the local process. *Note +Basic and advanced distribution interfaces::. For +'FFTW_MPI_TRANSPOSED_OUT' plans, the '_transposed' variants are useful +in order to also return the local portion of the first dimension in the +n[1] x n[0] x n[2] x ... x n[d-1] transposed output. *Note Transposed +distributions::. The advanced interface for multidimensional transforms +is: + + ptrdiff_t fftw_mpi_local_size_many(int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t block0, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); + ptrdiff_t fftw_mpi_local_size_many_transposed(int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); + + These differ from the basic interface in only two ways. First, they +allow you to specify block sizes 'block0' and 'block1' (the latter for +the transposed output); you can pass 'FFTW_MPI_DEFAULT_BLOCK' to use +FFTW's default block size as in the basic interface. Second, you can +pass a 'howmany' parameter, corresponding to the advanced planning +interface below: this is for transforms of contiguous 'howmany'-tuples +of numbers ('howmany = 1' in the basic interface). + + The corresponding basic and advanced routines for one-dimensional +transforms (currently only complex DFTs) are: + + ptrdiff_t fftw_mpi_local_size_1d( + ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags, + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, + ptrdiff_t *local_no, ptrdiff_t *local_o_start); + ptrdiff_t fftw_mpi_local_size_many_1d( + ptrdiff_t n0, ptrdiff_t howmany, + MPI_Comm comm, int sign, unsigned flags, + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, + ptrdiff_t *local_no, ptrdiff_t *local_o_start); + + As above, the return value is the number of elements to allocate +(complex numbers, for complex DFTs). The 'local_ni' and 'local_i_start' +arguments return the portion ('local_i_start' to 'local_i_start + +local_ni - 1') of the 1d array that is stored on this process for the +transform _input_, and 'local_no' and 'local_o_start' are the +corresponding quantities for the input. The 'sign' ('FFTW_FORWARD' or +'FFTW_BACKWARD') and 'flags' must match the arguments passed when +creating a plan. Although the inputs and outputs have different data +distributions in general, it is guaranteed that the _output_ data +distribution of an 'FFTW_FORWARD' plan will match the _input_ data +distribution of an 'FFTW_BACKWARD' plan and vice versa; similarly for +the 'FFTW_MPI_SCRAMBLED_OUT' and 'FFTW_MPI_SCRAMBLED_IN' flags. *Note +One-dimensional distributions::. + + +File: fftw3.info, Node: MPI Plan Creation, Next: MPI Wisdom Communication, Prev: MPI Data Distribution Functions, Up: FFTW MPI Reference + +6.12.5 MPI Plan Creation +------------------------ + +Complex-data MPI DFTs +..................... + +Plans for complex-data DFTs (*note 2d MPI example::) are created by: + + fftw_plan fftw_mpi_plan_dft_1d(ptrdiff_t n0, fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); + fftw_plan fftw_mpi_plan_dft_2d(ptrdiff_t n0, ptrdiff_t n1, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); + fftw_plan fftw_mpi_plan_dft_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); + fftw_plan fftw_mpi_plan_dft(int rnk, const ptrdiff_t *n, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); + fftw_plan fftw_mpi_plan_many_dft(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, ptrdiff_t block, ptrdiff_t tblock, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); + + These are similar to their serial counterparts (*note Complex DFTs::) +in specifying the dimensions, sign, and flags of the transform. The +'comm' argument gives an MPI communicator that specifies the set of +processes to participate in the transform; plan creation is a collective +function that must be called for all processes in the communicator. The +'in' and 'out' pointers refer only to a portion of the overall transform +data (*note MPI Data Distribution::) as specified by the 'local_size' +functions in the previous section. Unless 'flags' contains +'FFTW_ESTIMATE', these arrays are overwritten during plan creation as +for the serial interface. For multi-dimensional transforms, any +dimensions '> 1' are supported; for one-dimensional transforms, only +composite (non-prime) 'n0' are currently supported (unlike the serial +FFTW). Requesting an unsupported transform size will yield a 'NULL' +plan. (As in the serial interface, highly composite sizes generally +yield the best performance.) + + The advanced-interface 'fftw_mpi_plan_many_dft' additionally allows +you to specify the block sizes for the first dimension ('block') of the +n[0] x n[1] x n[2] x ... x n[d-1] input data and the first dimension +('tblock') of the n[1] x n[0] x n[2] x ... x n[d-1] transposed data (at +intermediate steps of the transform, and for the output if +'FFTW_TRANSPOSED_OUT' is specified in 'flags'). These must be the same +block sizes as were passed to the corresponding 'local_size' function; +you can pass 'FFTW_MPI_DEFAULT_BLOCK' to use FFTW's default block size +as in the basic interface. Also, the 'howmany' parameter specifies that +the transform is of contiguous 'howmany'-tuples rather than individual +complex numbers; this corresponds to the same parameter in the serial +advanced interface (*note Advanced Complex DFTs::) with 'stride = +howmany' and 'dist = 1'. + +MPI flags +......... + +The 'flags' can be any of those for the serial FFTW (*note Planner +Flags::), and in addition may include one or more of the following +MPI-specific flags, which improve performance at the cost of changing +the output or input data formats. + + * 'FFTW_MPI_SCRAMBLED_OUT', 'FFTW_MPI_SCRAMBLED_IN': valid for 1d + transforms only, these flags indicate that the output/input of the + transform are in an undocumented "scrambled" order. A forward + 'FFTW_MPI_SCRAMBLED_OUT' transform can be inverted by a backward + 'FFTW_MPI_SCRAMBLED_IN' (times the usual 1/N normalization). *Note + One-dimensional distributions::. + + * 'FFTW_MPI_TRANSPOSED_OUT', 'FFTW_MPI_TRANSPOSED_IN': valid for + multidimensional ('rnk > 1') transforms only, these flags specify + that the output or input of an n[0] x n[1] x n[2] x ... x n[d-1] + transform is transposed to n[1] x n[0] x n[2] x ... x n[d-1] . + *Note Transposed distributions::. + +Real-data MPI DFTs +.................. + +Plans for real-input/output (r2c/c2r) DFTs (*note Multi-dimensional MPI +DFTs of Real Data::) are created by: + + fftw_plan fftw_mpi_plan_dft_r2c_2d(ptrdiff_t n0, ptrdiff_t n1, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_r2c_2d(ptrdiff_t n0, ptrdiff_t n1, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_r2c_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_r2c(int rnk, const ptrdiff_t *n, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_c2r_2d(ptrdiff_t n0, ptrdiff_t n1, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_c2r_2d(ptrdiff_t n0, ptrdiff_t n1, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_c2r_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_dft_c2r(int rnk, const ptrdiff_t *n, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); + + Similar to the serial interface (*note Real-data DFTs::), these +transform logically n[0] x n[1] x n[2] x ... x n[d-1] real data to/from +n[0] x n[1] x n[2] x ... x (n[d-1]/2 + 1) complex data, representing +the non-redundant half of the conjugate-symmetry output of a real-input +DFT (*note Multi-dimensional Transforms::). However, the real array +must be stored within a padded n[0] x n[1] x n[2] x ... x [2 (n[d-1]/2 ++ 1)] array (much like the in-place serial r2c transforms, but here for +out-of-place transforms as well). Currently, only multi-dimensional +('rnk > 1') r2c/c2r transforms are supported (requesting a plan for 'rnk += 1' will yield 'NULL'). As explained above (*note Multi-dimensional +MPI DFTs of Real Data::), the data distribution of both the real and +complex arrays is given by the 'local_size' function called for the +dimensions of the _complex_ array. Similar to the other planning +functions, the input and output arrays are overwritten when the plan is +created except in 'FFTW_ESTIMATE' mode. + + As for the complex DFTs above, there is an advance interface that +allows you to manually specify block sizes and to transform contiguous +'howmany'-tuples of real/complex numbers: + + fftw_plan fftw_mpi_plan_many_dft_r2c + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_many_dft_c2r + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); + +MPI r2r transforms +.................. + +There are corresponding plan-creation routines for r2r transforms (*note +More DFTs of Real Data::), currently supporting multidimensional ('rnk > +1') transforms only ('rnk = 1' will yield a 'NULL' plan): + + fftw_plan fftw_mpi_plan_r2r_2d(ptrdiff_t n0, ptrdiff_t n1, + double *in, double *out, + MPI_Comm comm, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, + unsigned flags); + fftw_plan fftw_mpi_plan_r2r_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + double *in, double *out, + MPI_Comm comm, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, fftw_r2r_kind kind2, + unsigned flags); + fftw_plan fftw_mpi_plan_r2r(int rnk, const ptrdiff_t *n, + double *in, double *out, + MPI_Comm comm, const fftw_r2r_kind *kind, + unsigned flags); + fftw_plan fftw_mpi_plan_many_r2r(int rnk, const ptrdiff_t *n, + ptrdiff_t iblock, ptrdiff_t oblock, + double *in, double *out, + MPI_Comm comm, const fftw_r2r_kind *kind, + unsigned flags); + + The parameters are much the same as for the complex DFTs above, +except that the arrays are of real numbers (and hence the outputs of the +'local_size' data-distribution functions should be interpreted as counts +of real rather than complex numbers). Also, the 'kind' parameters +specify the r2r kinds along each dimension as for the serial interface +(*note Real-to-Real Transform Kinds::). *Note Other Multi-dimensional +Real-data MPI Transforms::. + +MPI transposition +................. + +FFTW also provides routines to plan a transpose of a distributed 'n0' by +'n1' array of real numbers, or an array of 'howmany'-tuples of real +numbers with specified block sizes (*note FFTW MPI Transposes::): + + fftw_plan fftw_mpi_plan_transpose(ptrdiff_t n0, ptrdiff_t n1, + double *in, double *out, + MPI_Comm comm, unsigned flags); + fftw_plan fftw_mpi_plan_many_transpose + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany, + ptrdiff_t block0, ptrdiff_t block1, + double *in, double *out, MPI_Comm comm, unsigned flags); + + These plans are used with the 'fftw_mpi_execute_r2r' new-array +execute function (*note Using MPI Plans::), since they count as (rank +zero) r2r plans from FFTW's perspective. + + +File: fftw3.info, Node: MPI Wisdom Communication, Prev: MPI Plan Creation, Up: FFTW MPI Reference + +6.12.6 MPI Wisdom Communication +------------------------------- + +To facilitate synchronizing wisdom among the different MPI processes, we +provide two functions: + + void fftw_mpi_gather_wisdom(MPI_Comm comm); + void fftw_mpi_broadcast_wisdom(MPI_Comm comm); + + The 'fftw_mpi_gather_wisdom' function gathers all wisdom in the given +communicator 'comm' to the process of rank 0 in the communicator: that +process obtains the union of all wisdom on all the processes. As a side +effect, some other processes will gain additional wisdom from other +processes, but only process 0 will gain the complete union. + + The 'fftw_mpi_broadcast_wisdom' does the reverse: it exports wisdom +from process 0 in 'comm' to all other processes in the communicator, +replacing any wisdom they currently have. + + *Note FFTW MPI Wisdom::. + + +File: fftw3.info, Node: FFTW MPI Fortran Interface, Prev: FFTW MPI Reference, Up: Distributed-memory FFTW with MPI + +6.13 FFTW MPI Fortran Interface +=============================== + +The FFTW MPI interface is callable from modern Fortran compilers +supporting the Fortran 2003 'iso_c_binding' standard for calling C +functions. As described in *note Calling FFTW from Modern Fortran::, +this means that you can directly call FFTW's C interface from Fortran +with only minor changes in syntax. There are, however, a few things +specific to the MPI interface to keep in mind: + + * Instead of including 'fftw3.f03' as in *note Overview of Fortran + interface::, you should 'include 'fftw3-mpi.f03'' (after 'use, + intrinsic :: iso_c_binding' as before). The 'fftw3-mpi.f03' file + includes 'fftw3.f03', so you should _not_ 'include' them both + yourself. (You will also want to include the MPI header file, + usually via 'include 'mpif.h'' or similar, although though this is + not needed by 'fftw3-mpi.f03' per se.) (To use the 'fftwl_' 'long + double' extended-precision routines in supporting compilers, you + should include 'fftw3f-mpi.f03' in _addition_ to 'fftw3-mpi.f03'. + *Note Extended and quadruple precision in Fortran::.) + + * Because of the different storage conventions between C and Fortran, + you reverse the order of your array dimensions when passing them to + FFTW (*note Reversing array dimensions::). This is merely a + difference in notation and incurs no performance overhead. + However, it means that, whereas in C the _first_ dimension is + distributed, in Fortran the _last_ dimension of your array is + distributed. + + * In Fortran, communicators are stored as 'integer' types; there is + no 'MPI_Comm' type, nor is there any way to access a C 'MPI_Comm'. + Fortunately, this is taken care of for you by the FFTW Fortran + interface: whenever the C interface expects an 'MPI_Comm' type, you + should pass the Fortran communicator as an 'integer'.(1) + + * Because you need to call the 'local_size' function to find out how + much space to allocate, and this may be _larger_ than the local + portion of the array (*note MPI Data Distribution::), you should + _always_ allocate your arrays dynamically using FFTW's allocation + routines as described in *note Allocating aligned memory in + Fortran::. (Coincidentally, this also provides the best + performance by guaranteeding proper data alignment.) + + * Because all sizes in the MPI FFTW interface are declared as + 'ptrdiff_t' in C, you should use 'integer(C_INTPTR_T)' in Fortran + (*note FFTW Fortran type reference::). + + * In Fortran, because of the language semantics, we generally + recommend using the new-array execute functions for all plans, even + in the common case where you are executing the plan on the same + arrays for which the plan was created (*note Plan execution in + Fortran::). However, note that in the MPI interface these + functions are changed: 'fftw_execute_dft' becomes + 'fftw_mpi_execute_dft', etcetera. *Note Using MPI Plans::. + + For example, here is a Fortran code snippet to perform a distributed +L x M complex DFT in-place. (This assumes you have already initialized +MPI with 'MPI_init' and have also performed 'call fftw_mpi_init'.) + + use, intrinsic :: iso_c_binding + include 'fftw3-mpi.f03' + integer(C_INTPTR_T), parameter :: L = ... + integer(C_INTPTR_T), parameter :: M = ... + type(C_PTR) :: plan, cdata + complex(C_DOUBLE_COMPLEX), pointer :: data(:,:) + integer(C_INTPTR_T) :: i, j, alloc_local, local_M, local_j_offset + + ! get local data size and allocate (note dimension reversal) + alloc_local = fftw_mpi_local_size_2d(M, L, MPI_COMM_WORLD, & + local_M, local_j_offset) + cdata = fftw_alloc_complex(alloc_local) + call c_f_pointer(cdata, data, [L,local_M]) + + ! create MPI plan for in-place forward DFT (note dimension reversal) + plan = fftw_mpi_plan_dft_2d(M, L, data, data, MPI_COMM_WORLD, & + FFTW_FORWARD, FFTW_MEASURE) + + ! initialize data to some function my_function(i,j) + do j = 1, local_M + do i = 1, L + data(i, j) = my_function(i, j + local_j_offset) + end do + end do + + ! compute transform (as many times as desired) + call fftw_mpi_execute_dft(plan, data, data) + + call fftw_destroy_plan(plan) + call fftw_free(cdata) + + Note that when we called 'fftw_mpi_local_size_2d' and +'fftw_mpi_plan_dft_2d' with the dimensions in reversed order, since a L +x M Fortran array is viewed by FFTW in C as a M x L array. This means +that the array was distributed over the 'M' dimension, the local portion +of which is a L x local_M array in Fortran. (You must _not_ use an +'allocate' statement to allocate an L x local_M array, however; you must +allocate 'alloc_local' complex numbers, which may be greater than 'L * +local_M', in order to reserve space for intermediate steps of the +transform.) Finally, we mention that because C's array indices are +zero-based, the 'local_j_offset' argument can conveniently be +interpreted as an offset in the 1-based 'j' index (rather than as a +starting index as in C). + + If instead you had used the 'ior(FFTW_MEASURE, +FFTW_MPI_TRANSPOSED_OUT)' flag, the output of the transform would be a +transposed M x local_L array, associated with the _same_ 'cdata' +allocation (since the transform is in-place), and which you could +declare with: + + complex(C_DOUBLE_COMPLEX), pointer :: tdata(:,:) + ... + call c_f_pointer(cdata, tdata, [M,local_L]) + + where 'local_L' would have been obtained by changing the +'fftw_mpi_local_size_2d' call to: + + alloc_local = fftw_mpi_local_size_2d_transposed(M, L, MPI_COMM_WORLD, & + local_M, local_j_offset, local_L, local_i_offset) + + ---------- Footnotes ---------- + + (1) Technically, this is because you aren't actually calling the C +functions directly. You are calling wrapper functions that translate +the communicator with 'MPI_Comm_f2c' before calling the ordinary C +interface. This is all done transparently, however, since the +'fftw3-mpi.f03' interface file renames the wrappers so that they are +called in Fortran with the same names as the C interface functions. + + +File: fftw3.info, Node: Calling FFTW from Modern Fortran, Next: Calling FFTW from Legacy Fortran, Prev: Distributed-memory FFTW with MPI, Up: Top + +7 Calling FFTW from Modern Fortran +********************************** + +Fortran 2003 standardized ways for Fortran code to call C libraries, and +this allows us to support a direct translation of the FFTW C API into +Fortran. Compared to the legacy Fortran 77 interface (*note Calling +FFTW from Legacy Fortran::), this direct interface offers many +advantages, especially compile-time type-checking and aligned memory +allocation. As of this writing, support for these C interoperability +features seems widespread, having been implemented in nearly all major +Fortran compilers (e.g. GNU, Intel, IBM, Oracle/Solaris, Portland +Group, NAG). + + This chapter documents that interface. For the most part, since this +interface allows Fortran to call the C interface directly, the usage is +identical to C translated to Fortran syntax. However, there are a few +subtle points such as memory allocation, wisdom, and data types that +deserve closer attention. + +* Menu: + +* Overview of Fortran interface:: +* Reversing array dimensions:: +* FFTW Fortran type reference:: +* Plan execution in Fortran:: +* Allocating aligned memory in Fortran:: +* Accessing the wisdom API from Fortran:: +* Defining an FFTW module:: + + +File: fftw3.info, Node: Overview of Fortran interface, Next: Reversing array dimensions, Prev: Calling FFTW from Modern Fortran, Up: Calling FFTW from Modern Fortran + +7.1 Overview of Fortran interface +================================= + +FFTW provides a file 'fftw3.f03' that defines Fortran 2003 interfaces +for all of its C routines, except for the MPI routines described +elsewhere, which can be found in the same directory as 'fftw3.h' (the C +header file). In any Fortran subroutine where you want to use FFTW +functions, you should begin with: + + use, intrinsic :: iso_c_binding + include 'fftw3.f03' + + This includes the interface definitions and the standard +'iso_c_binding' module (which defines the equivalents of C types). You +can also put the FFTW functions into a module if you prefer (*note +Defining an FFTW module::). + + At this point, you can now call anything in the FFTW C interface +directly, almost exactly as in C other than minor changes in syntax. +For example: + + type(C_PTR) :: plan + complex(C_DOUBLE_COMPLEX), dimension(1024,1000) :: in, out + plan = fftw_plan_dft_2d(1000,1024, in,out, FFTW_FORWARD,FFTW_ESTIMATE) + ... + call fftw_execute_dft(plan, in, out) + ... + call fftw_destroy_plan(plan) + + A few important things to keep in mind are: + + * FFTW plans are 'type(C_PTR)'. Other C types are mapped in the + obvious way via the 'iso_c_binding' standard: 'int' turns into + 'integer(C_INT)', 'fftw_complex' turns into + 'complex(C_DOUBLE_COMPLEX)', 'double' turns into 'real(C_DOUBLE)', + and so on. *Note FFTW Fortran type reference::. + + * Functions in C become functions in Fortran if they have a return + value, and subroutines in Fortran otherwise. + + * The ordering of the Fortran array dimensions must be _reversed_ + when they are passed to the FFTW plan creation, thanks to + differences in array indexing conventions (*note Multi-dimensional + Array Format::). This is _unlike_ the legacy Fortran interface + (*note Fortran-interface routines::), which reversed the dimensions + for you. *Note Reversing array dimensions::. + + * Using ordinary Fortran array declarations like this works, but may + yield suboptimal performance because the data may not be not + aligned to exploit SIMD instructions on modern proessors (*note + SIMD alignment and fftw_malloc::). Better performance will often + be obtained by allocating with 'fftw_alloc'. *Note Allocating + aligned memory in Fortran::. + + * Similar to the legacy Fortran interface (*note FFTW Execution in + Fortran::), we currently recommend _not_ using 'fftw_execute' but + rather using the more specialized functions like 'fftw_execute_dft' + (*note New-array Execute Functions::). However, you should execute + the plan on the 'same arrays' as the ones for which you created the + plan, unless you are especially careful. *Note Plan execution in + Fortran::. To prevent you from using 'fftw_execute' by mistake, + the 'fftw3.f03' file does not provide an 'fftw_execute' interface + declaration. + + * Multiple planner flags are combined with 'ior' (equivalent to '|' + in C). e.g. 'FFTW_MEASURE | FFTW_DESTROY_INPUT' becomes + 'ior(FFTW_MEASURE, FFTW_DESTROY_INPUT)'. (You can also use '+' as + long as you don't try to include a given flag more than once.) + +* Menu: + +* Extended and quadruple precision in Fortran:: + + +File: fftw3.info, Node: Extended and quadruple precision in Fortran, Prev: Overview of Fortran interface, Up: Overview of Fortran interface + +7.1.1 Extended and quadruple precision in Fortran +------------------------------------------------- + +If FFTW is compiled in 'long double' (extended) precision (*note +Installation and Customization::), you may be able to call the resulting +'fftwl_' routines (*note Precision::) from Fortran if your compiler +supports the 'C_LONG_DOUBLE_COMPLEX' type code. + + Because some Fortran compilers do not support +'C_LONG_DOUBLE_COMPLEX', the 'fftwl_' declarations are segregated into a +separate interface file 'fftw3l.f03', which you should include _in +addition_ to 'fftw3.f03' (which declares precision-independent 'FFTW_' +constants): + + use, intrinsic :: iso_c_binding + include 'fftw3.f03' + include 'fftw3l.f03' + + We also support using the nonstandard '__float128' +quadruple-precision type provided by recent versions of 'gcc' on 32- and +64-bit x86 hardware (*note Installation and Customization::), using the +corresponding 'real(16)' and 'complex(16)' types supported by +'gfortran'. The quadruple-precision 'fftwq_' functions (*note +Precision::) are declared in a 'fftw3q.f03' interface file, which should +be included in addition to 'fftw3l.f03', as above. You should also link +with '-lfftw3q -lquadmath -lm' as in C. + + +File: fftw3.info, Node: Reversing array dimensions, Next: FFTW Fortran type reference, Prev: Overview of Fortran interface, Up: Calling FFTW from Modern Fortran + +7.2 Reversing array dimensions +============================== + +A minor annoyance in calling FFTW from Fortran is that FFTW's array +dimensions are defined in the C convention (row-major order), while +Fortran's array dimensions are the opposite convention (column-major +order). *Note Multi-dimensional Array Format::. This is just a +bookkeeping difference, with no effect on performance. The only +consequence of this is that, whenever you create an FFTW plan for a +multi-dimensional transform, you must always _reverse the ordering of +the dimensions_. + + For example, consider the three-dimensional (L x M x N ) arrays: + + complex(C_DOUBLE_COMPLEX), dimension(L,M,N) :: in, out + + To plan a DFT for these arrays using 'fftw_plan_dft_3d', you could +do: + + plan = fftw_plan_dft_3d(N,M,L, in,out, FFTW_FORWARD,FFTW_ESTIMATE) + + That is, from FFTW's perspective this is a N x M x L array. _No data +transposition need occur_, as this is _only notation_. Similarly, to +use the more generic routine 'fftw_plan_dft' with the same arrays, you +could do: + + integer(C_INT), dimension(3) :: n = [N,M,L] + plan = fftw_plan_dft_3d(3, n, in,out, FFTW_FORWARD,FFTW_ESTIMATE) + + Note, by the way, that this is different from the legacy Fortran +interface (*note Fortran-interface routines::), which automatically +reverses the order of the array dimension for you. Here, you are +calling the C interface directly, so there is no "translation" layer. + + An important thing to keep in mind is the implication of this for +multidimensional real-to-complex transforms (*note Multi-Dimensional +DFTs of Real Data::). In C, a multidimensional real-to-complex DFT +chops the last dimension roughly in half (N x M x L real input goes to N +x M x L/2+1 complex output). In Fortran, because the array dimension +notation is reversed, the _first_ dimension of the complex data is +chopped roughly in half. For example consider the 'r2c' transform of L +x M x N real input in Fortran: + + type(C_PTR) :: plan + real(C_DOUBLE), dimension(L,M,N) :: in + complex(C_DOUBLE_COMPLEX), dimension(L/2+1,M,N) :: out + plan = fftw_plan_dft_r2c_3d(N,M,L, in,out, FFTW_ESTIMATE) + ... + call fftw_execute_dft_r2c(plan, in, out) + + Alternatively, for an in-place r2c transform, as described in the C +documentation we must _pad_ the _first_ dimension of the real input with +an extra two entries (which are ignored by FFTW) so as to leave enough +space for the complex output. The input is _allocated_ as a 2[L/2+1] x +M x N array, even though only L x M x N of it is actually used. In this +example, we will allocate the array as a pointer type, using +'fftw_alloc' to ensure aligned memory for maximum performance (*note +Allocating aligned memory in Fortran::); this also makes it easy to +reference the same memory as both a real array and a complex array. + + real(C_DOUBLE), pointer :: in(:,:,:) + complex(C_DOUBLE_COMPLEX), pointer :: out(:,:,:) + type(C_PTR) :: plan, data + data = fftw_alloc_complex(int((L/2+1) * M * N, C_SIZE_T)) + call c_f_pointer(data, in, [2*(L/2+1),M,N]) + call c_f_pointer(data, out, [L/2+1,M,N]) + plan = fftw_plan_dft_r2c_3d(N,M,L, in,out, FFTW_ESTIMATE) + ... + call fftw_execute_dft_r2c(plan, in, out) + ... + call fftw_destroy_plan(plan) + call fftw_free(data) + + +File: fftw3.info, Node: FFTW Fortran type reference, Next: Plan execution in Fortran, Prev: Reversing array dimensions, Up: Calling FFTW from Modern Fortran + +7.3 FFTW Fortran type reference +=============================== + +The following are the most important type correspondences between the C +interface and Fortran: + + * Plans ('fftw_plan' and variants) are 'type(C_PTR)' (i.e. an opaque + pointer). + + * The C floating-point types 'double', 'float', and 'long double' + correspond to 'real(C_DOUBLE)', 'real(C_FLOAT)', and + 'real(C_LONG_DOUBLE)', respectively. The C complex types + 'fftw_complex', 'fftwf_complex', and 'fftwl_complex' correspond in + Fortran to 'complex(C_DOUBLE_COMPLEX)', 'complex(C_FLOAT_COMPLEX)', + and 'complex(C_LONG_DOUBLE_COMPLEX)', respectively. Just as in C + (*note Precision::), the FFTW subroutines and types are prefixed + with 'fftw_', 'fftwf_', and 'fftwl_' for the different precisions, + and link to different libraries ('-lfftw3', '-lfftw3f', and + '-lfftw3l' on Unix), but use the _same_ include file 'fftw3.f03' + and the _same_ constants (all of which begin with 'FFTW_'). The + exception is 'long double' precision, for which you should _also_ + include 'fftw3l.f03' (*note Extended and quadruple precision in + Fortran::). + + * The C integer types 'int' and 'unsigned' (used for planner flags) + become 'integer(C_INT)'. The C integer type 'ptrdiff_t' (e.g. in + the *note 64-bit Guru Interface::) becomes 'integer(C_INTPTR_T)', + and 'size_t' (in 'fftw_malloc' etc.) becomes 'integer(C_SIZE_T)'. + + * The 'fftw_r2r_kind' type (*note Real-to-Real Transform Kinds::) + becomes 'integer(C_FFTW_R2R_KIND)'. The various constant values of + the C enumerated type ('FFTW_R2HC' etc.) become simply integer + constants of the same names in Fortran. + + * Numeric array pointer arguments (e.g. 'double *') become + 'dimension(*), intent(out)' arrays of the same type, or + 'dimension(*), intent(in)' if they are pointers to constant data + (e.g. 'const int *'). There are a few exceptions where numeric + pointers refer to scalar outputs (e.g. for 'fftw_flops'), in which + case they are 'intent(out)' scalar arguments in Fortran too. For + the new-array execute functions (*note New-array Execute + Functions::), the input arrays are declared 'dimension(*), + intent(inout)', since they can be modified in the case of in-place + or 'FFTW_DESTROY_INPUT' transforms. + + * Pointer _return_ values (e.g 'double *') become 'type(C_PTR)'. (If + they are pointers to arrays, as for 'fftw_alloc_real', you can + convert them back to Fortran array pointers with the standard + intrinsic function 'c_f_pointer'.) + + * The 'fftw_iodim' type in the guru interface (*note Guru vector and + transform sizes::) becomes 'type(fftw_iodim)' in Fortran, a derived + data type (the Fortran analogue of C's 'struct') with three + 'integer(C_INT)' components: 'n', 'is', and 'os', with the same + meanings as in C. The 'fftw_iodim64' type in the 64-bit guru + interface (*note 64-bit Guru Interface::) is the same, except that + its components are of type 'integer(C_INTPTR_T)'. + + * Using the wisdom import/export functions from Fortran is a bit + tricky, and is discussed in *note Accessing the wisdom API from + Fortran::. In brief, the 'FILE *' arguments map to 'type(C_PTR)', + 'const char *' to 'character(C_CHAR), dimension(*), intent(in)' + (null-terminated!), and the generic read-char/write-char functions + map to 'type(C_FUNPTR)'. + + You may be wondering if you need to search-and-replace +'real(kind(0.0d0))' (or whatever your favorite Fortran spelling of +"double precision" is) with 'real(C_DOUBLE)' everywhere in your program, +and similarly for 'complex' and 'integer' types. The answer is no; you +can still use your existing types. As long as these types match their C +counterparts, things should work without a hitch. The worst that can +happen, e.g. in the (unlikely) event of a system where +'real(kind(0.0d0))' is different from 'real(C_DOUBLE)', is that the +compiler will give you a type-mismatch error. That is, if you don't use +the 'iso_c_binding' kinds you need to accept at least the theoretical +possibility of having to change your code in response to compiler errors +on some future machine, but you don't need to worry about silently +compiling incorrect code that yields runtime errors. + + +File: fftw3.info, Node: Plan execution in Fortran, Next: Allocating aligned memory in Fortran, Prev: FFTW Fortran type reference, Up: Calling FFTW from Modern Fortran + +7.4 Plan execution in Fortran +============================= + +In C, in order to use a plan, one normally calls 'fftw_execute', which +executes the plan to perform the transform on the input/output arrays +passed when the plan was created (*note Using Plans::). The +corresponding subroutine call in modern Fortran is: + call fftw_execute(plan) + + However, we have had reports that this causes problems with some +recent optimizing Fortran compilers. The problem is, because the +input/output arrays are not passed as explicit arguments to +'fftw_execute', the semantics of Fortran (unlike C) allow the compiler +to assume that the input/output arrays are not changed by +'fftw_execute'. As a consequence, certain compilers end up +repositioning the call to 'fftw_execute', assuming incorrectly that it +does nothing to the arrays. + + There are various workarounds to this, but the safest and simplest +thing is to not use 'fftw_execute' in Fortran. Instead, use the +functions described in *note New-array Execute Functions::, which take +the input/output arrays as explicit arguments. For example, if the plan +is for a complex-data DFT and was created for the arrays 'in' and 'out', +you would do: + call fftw_execute_dft(plan, in, out) + + There are a few things to be careful of, however: + + * You must use the correct type of execute function, matching the way + the plan was created. Complex DFT plans should use + 'fftw_execute_dft', Real-input (r2c) DFT plans should use use + 'fftw_execute_dft_r2c', and real-output (c2r) DFT plans should use + 'fftw_execute_dft_c2r'. The various r2r plans should use + 'fftw_execute_r2r'. Fortunately, if you use the wrong one you will + get a compile-time type-mismatch error (unlike legacy Fortran). + + * You should normally pass the same input/output arrays that were + used when creating the plan. This is always safe. + + * _If_ you pass _different_ input/output arrays compared to those + used when creating the plan, you must abide by all the restrictions + of the new-array execute functions (*note New-array Execute + Functions::). The most tricky of these is the requirement that the + new arrays have the same alignment as the original arrays; the best + (and possibly only) way to guarantee this is to use the + 'fftw_alloc' functions to allocate your arrays (*note Allocating + aligned memory in Fortran::). Alternatively, you can use the + 'FFTW_UNALIGNED' flag when creating the plan, in which case the + plan does not depend on the alignment, but this may sacrifice + substantial performance on architectures (like x86) with SIMD + instructions (*note SIMD alignment and fftw_malloc::). + + +File: fftw3.info, Node: Allocating aligned memory in Fortran, Next: Accessing the wisdom API from Fortran, Prev: Plan execution in Fortran, Up: Calling FFTW from Modern Fortran + +7.5 Allocating aligned memory in Fortran +======================================== + +In order to obtain maximum performance in FFTW, you should store your +data in arrays that have been specially aligned in memory (*note SIMD +alignment and fftw_malloc::). Enforcing alignment also permits you to +safely use the new-array execute functions (*note New-array Execute +Functions::) to apply a given plan to more than one pair of in/out +arrays. Unfortunately, standard Fortran arrays do _not_ provide any +alignment guarantees. The _only_ way to allocate aligned memory in +standard Fortran is to allocate it with an external C function, like the +'fftw_alloc_real' and 'fftw_alloc_complex' functions. Fortunately, +Fortran 2003 provides a simple way to associate such allocated memory +with a standard Fortran array pointer that you can then use normally. + + We therefore recommend allocating all your input/output arrays using +the following technique: + + 1. Declare a 'pointer', 'arr', to your array of the desired type and + dimensions. For example, 'real(C_DOUBLE), pointer :: a(:,:)' for a + 2d real array, or 'complex(C_DOUBLE_COMPLEX), pointer :: a(:,:,:)' + for a 3d complex array. + + 2. The number of elements to allocate must be an 'integer(C_SIZE_T)'. + You can either declare a variable of this type, e.g. + 'integer(C_SIZE_T) :: sz', to store the number of elements to + allocate, or you can use the 'int(..., C_SIZE_T)' intrinsic + function. e.g. set 'sz = L * M * N' or use 'int(L * M * N, + C_SIZE_T)' for an L x M x N array. + + 3. Declare a 'type(C_PTR) :: p' to hold the return value from FFTW's + allocation routine. Set 'p = fftw_alloc_real(sz)' for a real + array, or 'p = fftw_alloc_complex(sz)' for a complex array. + + 4. Associate your pointer 'arr' with the allocated memory 'p' using + the standard 'c_f_pointer' subroutine: 'call c_f_pointer(p, arr, + [...dimensions...])', where '[...dimensions...])' are an array of + the dimensions of the array (in the usual Fortran order). e.g. + 'call c_f_pointer(p, arr, [L,M,N])' for an L x M x N array. + (Alternatively, you can omit the dimensions argument if you + specified the shape explicitly when declaring 'arr'.) You can now + use 'arr' as a usual multidimensional array. + + 5. When you are done using the array, deallocate the memory by 'call + fftw_free(p)' on 'p'. + + For example, here is how we would allocate an L x M 2d real array: + + real(C_DOUBLE), pointer :: arr(:,:) + type(C_PTR) :: p + p = fftw_alloc_real(int(L * M, C_SIZE_T)) + call c_f_pointer(p, arr, [L,M]) + _...use arr and arr(i,j) as usual..._ + call fftw_free(p) + + and here is an L x M x N 3d complex array: + + complex(C_DOUBLE_COMPLEX), pointer :: arr(:,:,:) + type(C_PTR) :: p + p = fftw_alloc_complex(int(L * M * N, C_SIZE_T)) + call c_f_pointer(p, arr, [L,M,N]) + _...use arr and arr(i,j,k) as usual..._ + call fftw_free(p) + + See *note Reversing array dimensions:: for an example allocating a +single array and associating both real and complex array pointers with +it, for in-place real-to-complex transforms. + + +File: fftw3.info, Node: Accessing the wisdom API from Fortran, Next: Defining an FFTW module, Prev: Allocating aligned memory in Fortran, Up: Calling FFTW from Modern Fortran + +7.6 Accessing the wisdom API from Fortran +========================================= + +As explained in *note Words of Wisdom-Saving Plans::, FFTW provides a +"wisdom" API for saving plans to disk so that they can be recreated +quickly. The C API for exporting (*note Wisdom Export::) and importing +(*note Wisdom Import::) wisdom is somewhat tricky to use from Fortran, +however, because of differences in file I/O and string types between C +and Fortran. + +* Menu: + +* Wisdom File Export/Import from Fortran:: +* Wisdom String Export/Import from Fortran:: +* Wisdom Generic Export/Import from Fortran:: + + +File: fftw3.info, Node: Wisdom File Export/Import from Fortran, Next: Wisdom String Export/Import from Fortran, Prev: Accessing the wisdom API from Fortran, Up: Accessing the wisdom API from Fortran + +7.6.1 Wisdom File Export/Import from Fortran +-------------------------------------------- + +The easiest way to export and import wisdom is to do so using +'fftw_export_wisdom_to_filename' and 'fftw_wisdom_from_filename'. The +only trick is that these require you to pass a C string, which is an +array of type 'CHARACTER(C_CHAR)' that is terminated by 'C_NULL_CHAR'. +You can call them like this: + + integer(C_INT) :: ret + ret = fftw_export_wisdom_to_filename(C_CHAR_'my_wisdom.dat' // C_NULL_CHAR) + if (ret .eq. 0) stop 'error exporting wisdom to file' + ret = fftw_import_wisdom_from_filename(C_CHAR_'my_wisdom.dat' // C_NULL_CHAR) + if (ret .eq. 0) stop 'error importing wisdom from file' + + Note that prepending 'C_CHAR_' is needed to specify that the literal +string is of kind 'C_CHAR', and we null-terminate the string by +appending '// C_NULL_CHAR'. These functions return an 'integer(C_INT)' +('ret') which is '0' if an error occurred during export/import and +nonzero otherwise. + + It is also possible to use the lower-level routines +'fftw_export_wisdom_to_file' and 'fftw_import_wisdom_from_file', which +accept parameters of the C type 'FILE*', expressed in Fortran as +'type(C_PTR)'. However, you are then responsible for creating the +'FILE*' yourself. You can do this by using 'iso_c_binding' to define +Fortran intefaces for the C library functions 'fopen' and 'fclose', +which is a bit strange in Fortran but workable. + + +File: fftw3.info, Node: Wisdom String Export/Import from Fortran, Next: Wisdom Generic Export/Import from Fortran, Prev: Wisdom File Export/Import from Fortran, Up: Accessing the wisdom API from Fortran + +7.6.2 Wisdom String Export/Import from Fortran +---------------------------------------------- + +Dealing with FFTW's C string export/import is a bit more painful. In +particular, the 'fftw_export_wisdom_to_string' function requires you to +deal with a dynamically allocated C string. To get its length, you must +define an interface to the C 'strlen' function, and to deallocate it you +must define an interface to C 'free': + + use, intrinsic :: iso_c_binding + interface + integer(C_INT) function strlen(s) bind(C, name='strlen') + import + type(C_PTR), value :: s + end function strlen + subroutine free(p) bind(C, name='free') + import + type(C_PTR), value :: p + end subroutine free + end interface + + Given these definitions, you can then export wisdom to a Fortran +character array: + + character(C_CHAR), pointer :: s(:) + integer(C_SIZE_T) :: slen + type(C_PTR) :: p + p = fftw_export_wisdom_to_string() + if (.not. c_associated(p)) stop 'error exporting wisdom' + slen = strlen(p) + call c_f_pointer(p, s, [slen+1]) + ... + call free(p) + + Note that 'slen' is the length of the C string, but the length of the +array is 'slen+1' because it includes the terminating null character. +(You can omit the '+1' if you don't want Fortran to know about the null +character.) The standard 'c_associated' function checks whether 'p' is +a null pointer, which is returned by 'fftw_export_wisdom_to_string' if +there was an error. + + To import wisdom from a string, use 'fftw_import_wisdom_from_string' +as usual; note that the argument of this function must be a +'character(C_CHAR)' that is terminated by the 'C_NULL_CHAR' character, +like the 's' array above. + + +File: fftw3.info, Node: Wisdom Generic Export/Import from Fortran, Prev: Wisdom String Export/Import from Fortran, Up: Accessing the wisdom API from Fortran + +7.6.3 Wisdom Generic Export/Import from Fortran +----------------------------------------------- + +The most generic wisdom export/import functions allow you to provide an +arbitrary callback function to read/write one character at a time in any +way you want. However, your callback function must be written in a +special way, using the 'bind(C)' attribute to be passed to a C +interface. + + In particular, to call the generic wisdom export function +'fftw_export_wisdom', you would write a callback subroutine of the form: + + subroutine my_write_char(c, p) bind(C) + use, intrinsic :: iso_c_binding + character(C_CHAR), value :: c + type(C_PTR), value :: p + _...write c..._ + end subroutine my_write_char + + Given such a subroutine (along with the corresponding interface +definition), you could then export wisdom using: + + call fftw_export_wisdom(c_funloc(my_write_char), p) + + The standard 'c_funloc' intrinsic converts a Fortran 'bind(C)' +subroutine into a C function pointer. The parameter 'p' is a +'type(C_PTR)' to any arbitrary data that you want to pass to +'my_write_char' (or 'C_NULL_PTR' if none). (Note that you can get a C +pointer to Fortran data using the intrinsic 'c_loc', and convert it back +to a Fortran pointer in 'my_write_char' using 'c_f_pointer'.) + + Similarly, to use the generic 'fftw_import_wisdom', you would define +a callback function of the form: + + integer(C_INT) function my_read_char(p) bind(C) + use, intrinsic :: iso_c_binding + type(C_PTR), value :: p + character :: c + _...read a character c..._ + my_read_char = ichar(c, C_INT) + end function my_read_char + + .... + + integer(C_INT) :: ret + ret = fftw_import_wisdom(c_funloc(my_read_char), p) + if (ret .eq. 0) stop 'error importing wisdom' + + Your function can return '-1' if the end of the input is reached. +Again, 'p' is an arbitrary 'type(C_PTR' that is passed through to your +function. 'fftw_import_wisdom' returns '0' if an error occurred and +nonzero otherwise. + + +File: fftw3.info, Node: Defining an FFTW module, Prev: Accessing the wisdom API from Fortran, Up: Calling FFTW from Modern Fortran + +7.7 Defining an FFTW module +=========================== + +Rather than using the 'include' statement to include the 'fftw3.f03' +interface file in any subroutine where you want to use FFTW, you might +prefer to define an FFTW Fortran module. FFTW does not install itself +as a module, primarily because 'fftw3.f03' can be shared between +different Fortran compilers while modules (in general) cannot. However, +it is trivial to define your own FFTW module if you want. Just create a +file containing: + + module FFTW3 + use, intrinsic :: iso_c_binding + include 'fftw3.f03' + end module + + Compile this file into a module as usual for your compiler (e.g. +with 'gfortran -c' you will get a file 'fftw3.mod'). Now, instead of +'include 'fftw3.f03'', whenever you want to use FFTW routines you can +just do: + + use FFTW3 + + as usual for Fortran modules. (You still need to link to the FFTW +library, of course.) + + +File: fftw3.info, Node: Calling FFTW from Legacy Fortran, Next: Upgrading from FFTW version 2, Prev: Calling FFTW from Modern Fortran, Up: Top + +8 Calling FFTW from Legacy Fortran +********************************** + +This chapter describes the interface to FFTW callable by Fortran code in +older compilers not supporting the Fortran 2003 C interoperability +features (*note Calling FFTW from Modern Fortran::). This interface has +the major disadvantage that it is not type-checked, so if you mistake +the argument types or ordering then your program will not have any +compiler errors, and will likely crash at runtime. So, greater care is +needed. Also, technically interfacing older Fortran versions to C is +nonstandard, but in practice we have found that the techniques used in +this chapter have worked with all known Fortran compilers for many +years. + + The legacy Fortran interface differs from the C interface only in the +prefix ('dfftw_' instead of 'fftw_' in double precision) and a few other +minor details. This Fortran interface is included in the FFTW libraries +by default, unless a Fortran compiler isn't found on your system or +'--disable-fortran' is included in the 'configure' flags. We assume +here that the reader is already familiar with the usage of FFTW in C, as +described elsewhere in this manual. + + The MPI parallel interface to FFTW is _not_ currently available to +legacy Fortran. + +* Menu: + +* Fortran-interface routines:: +* FFTW Constants in Fortran:: +* FFTW Execution in Fortran:: +* Fortran Examples:: +* Wisdom of Fortran?:: + + +File: fftw3.info, Node: Fortran-interface routines, Next: FFTW Constants in Fortran, Prev: Calling FFTW from Legacy Fortran, Up: Calling FFTW from Legacy Fortran + +8.1 Fortran-interface routines +============================== + +Nearly all of the FFTW functions have Fortran-callable equivalents. The +name of the legacy Fortran routine is the same as that of the +corresponding C routine, but with the 'fftw_' prefix replaced by +'dfftw_'.(1) The single and long-double precision versions use 'sfftw_' +and 'lfftw_', respectively, instead of 'fftwf_' and 'fftwl_'; quadruple +precision ('real*16') is available on some systems as 'fftwq_' (*note +Precision::). (Note that 'long double' on x86 hardware is usually at +most 80-bit extended precision, _not_ quadruple precision.) + + For the most part, all of the arguments to the functions are the +same, with the following exceptions: + + * 'plan' variables (what would be of type 'fftw_plan' in C), must be + declared as a type that is at least as big as a pointer (address) + on your machine. We recommend using 'integer*8' everywhere, since + this should always be big enough. + + * Any function that returns a value (e.g. 'fftw_plan_dft') is + converted into a _subroutine_. The return value is converted into + an additional _first_ parameter of this subroutine.(2) + + * The Fortran routines expect multi-dimensional arrays to be in + _column-major_ order, which is the ordinary format of Fortran + arrays (*note Multi-dimensional Array Format::). They do this + transparently and costlessly simply by reversing the order of the + dimensions passed to FFTW, but this has one important consequence + for multi-dimensional real-complex transforms, discussed below. + + * Wisdom import and export is somewhat more tricky because one cannot + easily pass files or strings between C and Fortran; see *note + Wisdom of Fortran?::. + + * Legacy Fortran cannot use the 'fftw_malloc' dynamic-allocation + routine. If you want to exploit the SIMD FFTW (*note SIMD + alignment and fftw_malloc::), you'll need to figure out some other + way to ensure that your arrays are at least 16-byte aligned. + + * Since Fortran 77 does not have data structures, the 'fftw_iodim' + structure from the guru interface (*note Guru vector and transform + sizes::) must be split into separate arguments. In particular, any + 'fftw_iodim' array arguments in the C guru interface become three + integer array arguments ('n', 'is', and 'os') in the Fortran guru + interface, all of whose lengths should be equal to the + corresponding 'rank' argument. + + * The guru planner interface in Fortran does _not_ do any automatic + translation between column-major and row-major; you are responsible + for setting the strides etcetera to correspond to your Fortran + arrays. However, as a slight bug that we are preserving for + backwards compatibility, the 'plan_guru_r2r' in Fortran _does_ + reverse the order of its 'kind' array parameter, so the 'kind' + array of that routine should be in the reverse of the order of the + iodim arrays (see above). + + In general, you should take care to use Fortran data types that +correspond to (i.e. are the same size as) the C types used by FFTW. In +practice, this correspondence is usually straightforward (i.e. +'integer' corresponds to 'int', 'real' corresponds to 'float', +etcetera). The native Fortran double/single-precision complex type +should be compatible with 'fftw_complex'/'fftwf_complex'. Such simple +correspondences are assumed in the examples below. + + ---------- Footnotes ---------- + + (1) Technically, Fortran 77 identifiers are not allowed to have more +than 6 characters, nor may they contain underscores. Any compiler that +enforces this limitation doesn't deserve to link to FFTW. + + (2) The reason for this is that some Fortran implementations seem to +have trouble with C function return values, and vice versa. + + +File: fftw3.info, Node: FFTW Constants in Fortran, Next: FFTW Execution in Fortran, Prev: Fortran-interface routines, Up: Calling FFTW from Legacy Fortran + +8.2 FFTW Constants in Fortran +============================= + +When creating plans in FFTW, a number of constants are used to specify +options, such as 'FFTW_MEASURE' or 'FFTW_ESTIMATE'. The same constants +must be used with the wrapper routines, but of course the C header files +where the constants are defined can't be incorporated directly into +Fortran code. + + Instead, we have placed Fortran equivalents of the FFTW constant +definitions in the file 'fftw3.f', which can be found in the same +directory as 'fftw3.h'. If your Fortran compiler supports a +preprocessor of some sort, you should be able to 'include' or '#include' +this file; otherwise, you can paste it directly into your code. + + In C, you combine different flags (like 'FFTW_PRESERVE_INPUT' and +'FFTW_MEASURE') using the ''|'' operator; in Fortran you should just use +''+''. (Take care not to add in the same flag more than once, though. +Alternatively, you can use the 'ior' intrinsic function standardized in +Fortran 95.) + + +File: fftw3.info, Node: FFTW Execution in Fortran, Next: Fortran Examples, Prev: FFTW Constants in Fortran, Up: Calling FFTW from Legacy Fortran + +8.3 FFTW Execution in Fortran +============================= + +In C, in order to use a plan, one normally calls 'fftw_execute', which +executes the plan to perform the transform on the input/output arrays +passed when the plan was created (*note Using Plans::). The +corresponding subroutine call in legacy Fortran is: + call dfftw_execute(plan) + + However, we have had reports that this causes problems with some +recent optimizing Fortran compilers. The problem is, because the +input/output arrays are not passed as explicit arguments to +'dfftw_execute', the semantics of Fortran (unlike C) allow the compiler +to assume that the input/output arrays are not changed by +'dfftw_execute'. As a consequence, certain compilers end up optimizing +out or repositioning the call to 'dfftw_execute', assuming incorrectly +that it does nothing. + + There are various workarounds to this, but the safest and simplest +thing is to not use 'dfftw_execute' in Fortran. Instead, use the +functions described in *note New-array Execute Functions::, which take +the input/output arrays as explicit arguments. For example, if the plan +is for a complex-data DFT and was created for the arrays 'in' and 'out', +you would do: + call dfftw_execute_dft(plan, in, out) + + There are a few things to be careful of, however: + + * You must use the correct type of execute function, matching the way + the plan was created. Complex DFT plans should use + 'dfftw_execute_dft', Real-input (r2c) DFT plans should use use + 'dfftw_execute_dft_r2c', and real-output (c2r) DFT plans should use + 'dfftw_execute_dft_c2r'. The various r2r plans should use + 'dfftw_execute_r2r'. + + * You should normally pass the same input/output arrays that were + used when creating the plan. This is always safe. + + * _If_ you pass _different_ input/output arrays compared to those + used when creating the plan, you must abide by all the restrictions + of the new-array execute functions (*note New-array Execute + Functions::). The most difficult of these, in Fortran, is the + requirement that the new arrays have the same alignment as the + original arrays, because there seems to be no way in legacy Fortran + to obtain guaranteed-aligned arrays (analogous to 'fftw_malloc' in + C). You can, of course, use the 'FFTW_UNALIGNED' flag when creating + the plan, in which case the plan does not depend on the alignment, + but this may sacrifice substantial performance on architectures + (like x86) with SIMD instructions (*note SIMD alignment and + fftw_malloc::). + + +File: fftw3.info, Node: Fortran Examples, Next: Wisdom of Fortran?, Prev: FFTW Execution in Fortran, Up: Calling FFTW from Legacy Fortran + +8.4 Fortran Examples +==================== + +In C, you might have something like the following to transform a +one-dimensional complex array: + + fftw_complex in[N], out[N]; + fftw_plan plan; + + plan = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE); + fftw_execute(plan); + fftw_destroy_plan(plan); + + In Fortran, you would use the following to accomplish the same thing: + + double complex in, out + dimension in(N), out(N) + integer*8 plan + + call dfftw_plan_dft_1d(plan,N,in,out,FFTW_FORWARD,FFTW_ESTIMATE) + call dfftw_execute_dft(plan, in, out) + call dfftw_destroy_plan(plan) + + Notice how all routines are called as Fortran subroutines, and the +plan is returned via the first argument to 'dfftw_plan_dft_1d'. Notice +also that we changed 'fftw_execute' to 'dfftw_execute_dft' (*note FFTW +Execution in Fortran::). To do the same thing, but using 8 threads in +parallel (*note Multi-threaded FFTW::), you would simply prefix these +calls with: + + integer iret + call dfftw_init_threads(iret) + call dfftw_plan_with_nthreads(8) + + (You might want to check the value of 'iret': if it is zero, it +indicates an unlikely error during thread initialization.) + + To transform a three-dimensional array in-place with C, you might do: + + fftw_complex arr[L][M][N]; + fftw_plan plan; + + plan = fftw_plan_dft_3d(L,M,N, arr,arr, + FFTW_FORWARD, FFTW_ESTIMATE); + fftw_execute(plan); + fftw_destroy_plan(plan); + + In Fortran, you would use this instead: + + double complex arr + dimension arr(L,M,N) + integer*8 plan + + call dfftw_plan_dft_3d(plan, L,M,N, arr,arr, + & FFTW_FORWARD, FFTW_ESTIMATE) + call dfftw_execute_dft(plan, arr, arr) + call dfftw_destroy_plan(plan) + + Note that we pass the array dimensions in the "natural" order in both +C and Fortran. + + To transform a one-dimensional real array in Fortran, you might do: + + double precision in + dimension in(N) + double complex out + dimension out(N/2 + 1) + integer*8 plan + + call dfftw_plan_dft_r2c_1d(plan,N,in,out,FFTW_ESTIMATE) + call dfftw_execute_dft_r2c(plan, in, out) + call dfftw_destroy_plan(plan) + + To transform a two-dimensional real array, out of place, you might +use the following: + + double precision in + dimension in(M,N) + double complex out + dimension out(M/2 + 1, N) + integer*8 plan + + call dfftw_plan_dft_r2c_2d(plan,M,N,in,out,FFTW_ESTIMATE) + call dfftw_execute_dft_r2c(plan, in, out) + call dfftw_destroy_plan(plan) + + *Important:* Notice that it is the _first_ dimension of the complex +output array that is cut in half in Fortran, rather than the last +dimension as in C. This is a consequence of the interface routines +reversing the order of the array dimensions passed to FFTW so that the +Fortran program can use its ordinary column-major order. + + +File: fftw3.info, Node: Wisdom of Fortran?, Prev: Fortran Examples, Up: Calling FFTW from Legacy Fortran + +8.5 Wisdom of Fortran? +====================== + +In this section, we discuss how one can import/export FFTW wisdom (saved +plans) to/from a Fortran program; we assume that the reader is already +familiar with wisdom, as described in *note Words of Wisdom-Saving +Plans::. + + The basic problem is that is difficult to (portably) pass files and +strings between Fortran and C, so we cannot provide a direct Fortran +equivalent to the 'fftw_export_wisdom_to_file', etcetera, functions. +Fortran interfaces _are_ provided for the functions that do not take +file/string arguments, however: 'dfftw_import_system_wisdom', +'dfftw_import_wisdom', 'dfftw_export_wisdom', and 'dfftw_forget_wisdom'. + + So, for example, to import the system-wide wisdom, you would do: + + integer isuccess + call dfftw_import_system_wisdom(isuccess) + + As usual, the C return value is turned into a first parameter; +'isuccess' is non-zero on success and zero on failure (e.g. if there is +no system wisdom installed). + + If you want to import/export wisdom from/to an arbitrary file or +elsewhere, you can employ the generic 'dfftw_import_wisdom' and +'dfftw_export_wisdom' functions, for which you must supply a subroutine +to read/write one character at a time. The FFTW package contains an +example file 'doc/f77_wisdom.f' demonstrating how to implement +'import_wisdom_from_file' and 'export_wisdom_to_file' subroutines in +this way. (These routines cannot be compiled into the FFTW library +itself, lest all FFTW-using programs be required to link with the +Fortran I/O library.) + + +File: fftw3.info, Node: Upgrading from FFTW version 2, Next: Installation and Customization, Prev: Calling FFTW from Legacy Fortran, Up: Top + +9 Upgrading from FFTW version 2 +******************************* + +In this chapter, we outline the process for updating codes designed for +the older FFTW 2 interface to work with FFTW 3. The interface for FFTW +3 is not backwards-compatible with the interface for FFTW 2 and earlier +versions; codes written to use those versions will fail to link with +FFTW 3. Nor is it possible to write "compatibility wrappers" to bridge +the gap (at least not efficiently), because FFTW 3 has different +semantics from previous versions. However, upgrading should be a +straightforward process because the data formats are identical and the +overall style of planning/execution is essentially the same. + + Unlike FFTW 2, there are no separate header files for real and +complex transforms (or even for different precisions) in FFTW 3; all +interfaces are defined in the '' header file. + +Numeric Types +============= + +The main difference in data types is that 'fftw_complex' in FFTW 2 was +defined as a 'struct' with macros 'c_re' and 'c_im' for accessing the +real/imaginary parts. (This is binary-compatible with FFTW 3 on any +machine except perhaps for some older Crays in single precision.) The +equivalent macros for FFTW 3 are: + + #define c_re(c) ((c)[0]) + #define c_im(c) ((c)[1]) + + This does not work if you are using the C99 complex type, however, +unless you insert a 'double*' typecast into the above macros (*note +Complex numbers::). + + Also, FFTW 2 had an 'fftw_real' typedef that was an alias for +'double' (in double precision). In FFTW 3 you should just use 'double' +(or whatever precision you are employing). + +Plans +===== + +The major difference between FFTW 2 and FFTW 3 is in the +planning/execution division of labor. In FFTW 2, plans were found for a +given transform size and type, and then could be applied to _any_ arrays +and for _any_ multiplicity/stride parameters. In FFTW 3, you specify +the particular arrays, stride parameters, etcetera when creating the +plan, and the plan is then executed for _those_ arrays (unless the guru +interface is used) and _those_ parameters _only_. (FFTW 2 had "specific +planner" routines that planned for a particular array and stride, but +the plan could still be used for other arrays and strides.) That is, +much of the information that was formerly specified at execution time is +now specified at planning time. + + Like FFTW 2's specific planner routines, the FFTW 3 planner +overwrites the input/output arrays unless you use 'FFTW_ESTIMATE'. + + FFTW 2 had separate data types 'fftw_plan', 'fftwnd_plan', +'rfftw_plan', and 'rfftwnd_plan' for complex and real one- and +multi-dimensional transforms, and each type had its own 'destroy' +function. In FFTW 3, all plans are of type 'fftw_plan' and all are +destroyed by 'fftw_destroy_plan(plan)'. + + Where you formerly used 'fftw_create_plan' and 'fftw_one' to plan and +compute a single 1d transform, you would now use 'fftw_plan_dft_1d' to +plan the transform. If you used the generic 'fftw' function to execute +the transform with multiplicity ('howmany') and stride parameters, you +would now use the advanced interface 'fftw_plan_many_dft' to specify +those parameters. The plans are now executed with 'fftw_execute(plan)', +which takes all of its parameters (including the input/output arrays) +from the plan. + + In-place transforms no longer interpret their output argument as +scratch space, nor is there an 'FFTW_IN_PLACE' flag. You simply pass +the same pointer for both the input and output arguments. (Previously, +the output 'ostride' and 'odist' parameters were ignored for in-place +transforms; now, if they are specified via the advanced interface, they +are significant even in the in-place case, although they should normally +equal the corresponding input parameters.) + + The 'FFTW_ESTIMATE' and 'FFTW_MEASURE' flags have the same meaning as +before, although the planning time will differ. You may also consider +using 'FFTW_PATIENT', which is like 'FFTW_MEASURE' except that it takes +more time in order to consider a wider variety of algorithms. + + For multi-dimensional complex DFTs, instead of 'fftwnd_create_plan' +(or 'fftw2d_create_plan' or 'fftw3d_create_plan'), followed by +'fftwnd_one', you would use 'fftw_plan_dft' (or 'fftw_plan_dft_2d' or +'fftw_plan_dft_3d'). followed by 'fftw_execute'. If you used 'fftwnd' +to to specify strides etcetera, you would instead specify these via +'fftw_plan_many_dft'. + + The analogues to 'rfftw_create_plan' and 'rfftw_one' with +'FFTW_REAL_TO_COMPLEX' or 'FFTW_COMPLEX_TO_REAL' directions are +'fftw_plan_r2r_1d' with kind 'FFTW_R2HC' or 'FFTW_HC2R', followed by +'fftw_execute'. The stride etcetera arguments of 'rfftw' are now in +'fftw_plan_many_r2r'. + + Instead of 'rfftwnd_create_plan' (or 'rfftw2d_create_plan' or +'rfftw3d_create_plan') followed by 'rfftwnd_one_real_to_complex' or +'rfftwnd_one_complex_to_real', you now use 'fftw_plan_dft_r2c' (or +'fftw_plan_dft_r2c_2d' or 'fftw_plan_dft_r2c_3d') or 'fftw_plan_dft_c2r' +(or 'fftw_plan_dft_c2r_2d' or 'fftw_plan_dft_c2r_3d'), respectively, +followed by 'fftw_execute'. As usual, the strides etcetera of +'rfftwnd_real_to_complex' or 'rfftwnd_complex_to_real' are no specified +in the advanced planner routines, 'fftw_plan_many_dft_r2c' or +'fftw_plan_many_dft_c2r'. + +Wisdom +====== + +In FFTW 2, you had to supply the 'FFTW_USE_WISDOM' flag in order to use +wisdom; in FFTW 3, wisdom is always used. (You could simulate the FFTW +2 wisdom-less behavior by calling 'fftw_forget_wisdom' after every +planner call.) + + The FFTW 3 wisdom import/export routines are almost the same as +before (although the storage format is entirely different). There is +one significant difference, however. In FFTW 2, the import routines +would never read past the end of the wisdom, so you could store extra +data beyond the wisdom in the same file, for example. In FFTW 3, the +file-import routine may read up to a few hundred bytes past the end of +the wisdom, so you cannot store other data just beyond it.(1) + + Wisdom has been enhanced by additional humility in FFTW 3: whereas +FFTW 2 would re-use wisdom for a given transform size regardless of the +stride etc., in FFTW 3 wisdom is only used with the strides etc. for +which it was created. Unfortunately, this means FFTW 3 has to create +new plans from scratch more often than FFTW 2 (in FFTW 2, planning e.g. +one transform of size 1024 also created wisdom for all smaller powers of +2, but this no longer occurs). + + FFTW 3 also has the new routine 'fftw_import_system_wisdom' to import +wisdom from a standard system-wide location. + +Memory allocation +================= + +In FFTW 3, we recommend allocating your arrays with 'fftw_malloc' and +deallocating them with 'fftw_free'; this is not required, but allows +optimal performance when SIMD acceleration is used. (Those two +functions actually existed in FFTW 2, and worked the same way, but were +not documented.) + + In FFTW 2, there were 'fftw_malloc_hook' and 'fftw_free_hook' +functions that allowed the user to replace FFTW's memory-allocation +routines (e.g. to implement different error-handling, since by default +FFTW prints an error message and calls 'exit' to abort the program if +'malloc' returns 'NULL'). These hooks are not supported in FFTW 3; +those few users who require this functionality can just directly modify +the memory-allocation routines in FFTW (they are defined in +'kernel/alloc.c'). + +Fortran interface +================= + +In FFTW 2, the subroutine names were obtained by replacing 'fftw_' with +'fftw_f77'; in FFTW 3, you replace 'fftw_' with 'dfftw_' (or 'sfftw_' or +'lfftw_', depending upon the precision). + + In FFTW 3, we have begun recommending that you always declare the +type used to store plans as 'integer*8'. (Too many people didn't notice +our instruction to switch from 'integer' to 'integer*8' for 64-bit +machines.) + + In FFTW 3, we provide a 'fftw3.f' "header file" to include in your +code (and which is officially installed on Unix systems). (In FFTW 2, +we supplied a 'fftw_f77.i' file, but it was not installed.) + + Otherwise, the C-Fortran interface relationship is much the same as +it was before (e.g. return values become initial parameters, and +multi-dimensional arrays are in column-major order). Unlike FFTW 2, we +do provide some support for wisdom import/export in Fortran (*note +Wisdom of Fortran?::). + +Threads +======= + +Like FFTW 2, only the execution routines are thread-safe. All planner +routines, etcetera, should be called by only a single thread at a time +(*note Thread safety::). _Unlike_ FFTW 2, there is no special +'FFTW_THREADSAFE' flag for the planner to allow a given plan to be +usable by multiple threads in parallel; this is now the case by default. + + The multi-threaded version of FFTW 2 required you to pass the number +of threads each time you execute the transform. The number of threads +is now stored in the plan, and is specified before the planner is called +by 'fftw_plan_with_nthreads'. The threads initialization routine used +to be called 'fftw_threads_init' and would return zero on success; the +new routine is called 'fftw_init_threads' and returns zero on failure. +*Note Multi-threaded FFTW::. + + There is no separate threads header file in FFTW 3; all the function +prototypes are in ''. However, you still have to link to a +separate library ('-lfftw3_threads -lfftw3 -lm' on Unix), as well as to +the threading library (e.g. POSIX threads on Unix). + + ---------- Footnotes ---------- + + (1) We do our own buffering because GNU libc I/O routines are +horribly slow for single-character I/O, apparently for thread-safety +reasons (whether you are using threads or not). + + +File: fftw3.info, Node: Installation and Customization, Next: Acknowledgments, Prev: Upgrading from FFTW version 2, Up: Top + +10 Installation and Customization +********************************* + +This chapter describes the installation and customization of FFTW, the +latest version of which may be downloaded from the FFTW home page +(http://www.fftw.org). + + In principle, FFTW should work on any system with an ANSI C compiler +('gcc' is fine). However, planner time is drastically reduced if FFTW +can exploit a hardware cycle counter; FFTW comes with cycle-counter +support for all modern general-purpose CPUs, but you may need to add a +couple of lines of code if your compiler is not yet supported (*note +Cycle Counters::). (On Unix, there will be a warning at the end of the +'configure' output if no cycle counter is found.) + + Installation of FFTW is simplest if you have a Unix or a GNU system, +such as GNU/Linux, and we describe this case in the first section below, +including the use of special configuration options to e.g. install +different precisions or exploit optimizations for particular +architectures (e.g. SIMD). Compilation on non-Unix systems is a more +manual process, but we outline the procedure in the second section. It +is also likely that pre-compiled binaries will be available for popular +systems. + + Finally, we describe how you can customize FFTW for particular needs +by generating _codelets_ for fast transforms of sizes not supported +efficiently by the standard FFTW distribution. + +* Menu: + +* Installation on Unix:: +* Installation on non-Unix systems:: +* Cycle Counters:: +* Generating your own code:: + + +File: fftw3.info, Node: Installation on Unix, Next: Installation on non-Unix systems, Prev: Installation and Customization, Up: Installation and Customization + +10.1 Installation on Unix +========================= + +FFTW comes with a 'configure' program in the GNU style. Installation +can be as simple as: + + ./configure + make + make install + + This will build the uniprocessor complex and real transform libraries +along with the test programs. (We recommend that you use GNU 'make' if +it is available; on some systems it is called 'gmake'.) The "'make +install'" command installs the fftw and rfftw libraries in standard +places, and typically requires root privileges (unless you specify a +different install directory with the '--prefix' flag to 'configure'). +You can also type "'make check'" to put the FFTW test programs through +their paces. If you have problems during configuration or compilation, +you may want to run "'make distclean'" before trying again; this ensures +that you don't have any stale files left over from previous compilation +attempts. + + The 'configure' script chooses the 'gcc' compiler by default, if it +is available; you can select some other compiler with: + ./configure CC="" + + The 'configure' script knows good 'CFLAGS' (C compiler flags) for a +few systems. If your system is not known, the 'configure' script will +print out a warning. In this case, you should re-configure FFTW with +the command + ./configure CFLAGS="" + and then compile as usual. If you do find an optimal set of 'CFLAGS' +for your system, please let us know what they are (along with the output +of 'config.guess') so that we can include them in future releases. + + 'configure' supports all the standard flags defined by the GNU Coding +Standards; see the 'INSTALL' file in FFTW or the GNU web page +(http://www.gnu.org/prep/standards/html_node/index.html). Note +especially '--help' to list all flags and '--enable-shared' to create +shared, rather than static, libraries. 'configure' also accepts a few +FFTW-specific flags, particularly: + + * '--enable-float': Produces a single-precision version of FFTW + ('float') instead of the default double-precision ('double'). + *Note Precision::. + + * '--enable-long-double': Produces a long-double precision version of + FFTW ('long double') instead of the default double-precision + ('double'). The 'configure' script will halt with an error message + if 'long double' is the same size as 'double' on your + machine/compiler. *Note Precision::. + + * '--enable-quad-precision': Produces a quadruple-precision version + of FFTW using the nonstandard '__float128' type provided by 'gcc' + 4.6 or later on x86, x86-64, and Itanium architectures, instead of + the default double-precision ('double'). The 'configure' script + will halt with an error message if the compiler is not 'gcc' + version 4.6 or later or if 'gcc''s 'libquadmath' library is not + installed. *Note Precision::. + + * '--enable-threads': Enables compilation and installation of the + FFTW threads library (*note Multi-threaded FFTW::), which provides + a simple interface to parallel transforms for SMP systems. By + default, the threads routines are not compiled. + + * '--enable-openmp': Like '--enable-threads', but using OpenMP + compiler directives in order to induce parallelism rather than + spawning its own threads directly, and installing an 'fftw3_omp' + library rather than an 'fftw3_threads' library (*note + Multi-threaded FFTW::). You can use both '--enable-openmp' and + '--enable-threads' since they compile/install libraries with + different names. By default, the OpenMP routines are not compiled. + + * '--with-combined-threads': By default, if '--enable-threads' is + used, the threads support is compiled into a separate library that + must be linked in addition to the main FFTW library. This is so + that users of the serial library do not need to link the system + threads libraries. If '--with-combined-threads' is specified, + however, then no separate threads library is created, and threads + are included in the main FFTW library. This is mainly useful under + Windows, where no system threads library is required and + inter-library dependencies are problematic. + + * '--enable-mpi': Enables compilation and installation of the FFTW + MPI library (*note Distributed-memory FFTW with MPI::), which + provides parallel transforms for distributed-memory systems with + MPI. (By default, the MPI routines are not compiled.) *Note FFTW + MPI Installation::. + + * '--disable-fortran': Disables inclusion of legacy-Fortran wrapper + routines (*note Calling FFTW from Legacy Fortran::) in the standard + FFTW libraries. These wrapper routines increase the library size + by only a negligible amount, so they are included by default as + long as the 'configure' script finds a Fortran compiler on your + system. (To specify a particular Fortran compiler foo, pass + 'F77='foo to 'configure'.) + + * '--with-g77-wrappers': By default, when Fortran wrappers are + included, the wrappers employ the linking conventions of the + Fortran compiler detected by the 'configure' script. If this + compiler is GNU 'g77', however, then _two_ versions of the wrappers + are included: one with 'g77''s idiosyncratic convention of + appending two underscores to identifiers, and one with the more + common convention of appending only a single underscore. This way, + the same FFTW library will work with both 'g77' and other Fortran + compilers, such as GNU 'gfortran'. However, the converse is not + true: if you configure with a different compiler, then the + 'g77'-compatible wrappers are not included. By specifying + '--with-g77-wrappers', the 'g77'-compatible wrappers are included + in addition to wrappers for whatever Fortran compiler 'configure' + finds. + + * '--with-slow-timer': Disables the use of hardware cycle counters, + and falls back on 'gettimeofday' or 'clock'. This greatly worsens + performance, and should generally not be used (unless you don't + have a cycle counter but still really want an optimized plan + regardless of the time). *Note Cycle Counters::. + + * '--enable-sse' (single precision), '--enable-sse2' (single, + double), '--enable-avx' (single, double), '--enable-avx2' (single, + double), '--enable-avx512' (single, double), + '--enable-avx-128-fma', '--enable-kcvi' (single), + '--enable-altivec' (single), '--enable-vsx' (single, double), + '--enable-neon' (single, double on aarch64), + '--enable-generic-simd128', and '--enable-generic-simd256': + + Enable various SIMD instruction sets. You need compiler that + supports the given SIMD extensions, but FFTW will try to detect at + runtime whether the CPU supports these extensions. That is, you + can compile with'--enable-avx' and the code will still run on a CPU + without AVX support. + + - These options require a compiler supporting SIMD extensions, + and compiler support is always a bit flaky: see the FFTW FAQ + for a list of compiler versions that have problems compiling + FFTW. + - Because of the large variety of ARM processors and ABIs, FFTW + does not attempt to guess the correct 'gcc' flags for + generating NEON code. In general, you will have to provide + them on the command line. This command line is known to have + worked at least once: + ./configure --with-slow-timer --host=arm-linux-gnueabi \ + --enable-single --enable-neon \ + "CC=arm-linux-gnueabi-gcc -march=armv7-a -mfloat-abi=softfp" + + To force 'configure' to use a particular C compiler foo (instead of +the default, usually 'gcc'), pass 'CC='foo to the 'configure' script; +you may also need to set the flags via the variable 'CFLAGS' as +described above. + + +File: fftw3.info, Node: Installation on non-Unix systems, Next: Cycle Counters, Prev: Installation on Unix, Up: Installation and Customization + +10.2 Installation on non-Unix systems +===================================== + +It should be relatively straightforward to compile FFTW even on non-Unix +systems lacking the niceties of a 'configure' script. Basically, you +need to edit the 'config.h' header (copy it from 'config.h.in') to +'#define' the various options and compiler characteristics, and then +compile all the '.c' files in the relevant directories. + + The 'config.h' header contains about 100 options to set, each one +initially an '#undef', each documented with a comment, and most of them +fairly obvious. For most of the options, you should simply '#define' +them to '1' if they are applicable, although a few options require a +particular value (e.g. 'SIZEOF_LONG_LONG' should be defined to the size +of the 'long long' type, in bytes, or zero if it is not supported). We +will likely post some sample 'config.h' files for various operating +systems and compilers for you to use (at least as a starting point). +Please let us know if you have to hand-create a configuration file +(and/or a pre-compiled binary) that you want to share. + + To create the FFTW library, you will then need to compile all of the +'.c' files in the 'kernel', 'dft', 'dft/scalar', 'dft/scalar/codelets', +'rdft', 'rdft/scalar', 'rdft/scalar/r2cf', 'rdft/scalar/r2cb', +'rdft/scalar/r2r', 'reodft', and 'api' directories. If you are +compiling with SIMD support (e.g. you defined 'HAVE_SSE2' in +'config.h'), then you also need to compile the '.c' files in the +'simd-support', '{dft,rdft}/simd', '{dft,rdft}/simd/*' directories. + + Once these files are all compiled, link them into a library, or a +shared library, or directly into your program. + + To compile the FFTW test program, additionally compile the code in +the 'libbench2/' directory, and link it into a library. Then compile +the code in the 'tests/' directory and link it to the 'libbench2' and +FFTW libraries. To compile the 'fftw-wisdom' (command-line) tool (*note +Wisdom Utilities::), compile 'tools/fftw-wisdom.c' and link it to the +'libbench2' and FFTW libraries + + +File: fftw3.info, Node: Cycle Counters, Next: Generating your own code, Prev: Installation on non-Unix systems, Up: Installation and Customization + +10.3 Cycle Counters +=================== + +FFTW's planner actually executes and times different possible FFT +algorithms in order to pick the fastest plan for a given n. In order to +do this in as short a time as possible, however, the timer must have a +very high resolution, and to accomplish this we employ the hardware +"cycle counters" that are available on most CPUs. Currently, FFTW +supports the cycle counters on x86, PowerPC/POWER, Alpha, UltraSPARC +(SPARC v9), IA64, PA-RISC, and MIPS processors. + + Access to the cycle counters, unfortunately, is a compiler and/or +operating-system dependent task, often requiring inline assembly +language, and it may be that your compiler is not supported. If you are +_not_ supported, FFTW will by default fall back on its estimator +(effectively using 'FFTW_ESTIMATE' for all plans). + + You can add support by editing the file 'kernel/cycle.h'; normally, +this will involve adapting one of the examples already present in order +to use the inline-assembler syntax for your C compiler, and will only +require a couple of lines of code. Anyone adding support for a new +system to 'cycle.h' is encouraged to email us at . + + If a cycle counter is not available on your system (e.g. some +embedded processor), and you don't want to use estimated plans, as a +last resort you can use the '--with-slow-timer' option to 'configure' +(on Unix) or '#define WITH_SLOW_TIMER' in 'config.h' (elsewhere). This +will use the much lower-resolution 'gettimeofday' function, or even +'clock' if the former is unavailable, and planning will be extremely +slow. + + +File: fftw3.info, Node: Generating your own code, Prev: Cycle Counters, Up: Installation and Customization + +10.4 Generating your own code +============================= + +The directory 'genfft' contains the programs that were used to generate +FFTW's "codelets," which are hard-coded transforms of small sizes. We +do not expect casual users to employ the generator, which is a rather +sophisticated program that generates directed acyclic graphs of FFT +algorithms and performs algebraic simplifications on them. It was +written in Objective Caml, a dialect of ML, which is available at +. + + If you have Objective Caml installed (along with recent versions of +GNU 'autoconf', 'automake', and 'libtool'), then you can change the set +of codelets that are generated or play with the generation options. The +set of generated codelets is specified by the +'{dft,rdft}/{codelets,simd}/*/Makefile.am' files. For example, you can +add efficient REDFT codelets of small sizes by modifying +'rdft/codelets/r2r/Makefile.am'. After you modify any 'Makefile.am' +files, you can type 'sh bootstrap.sh' in the top-level directory +followed by 'make' to re-generate the files. + + We do not provide more details about the code-generation process, +since we do not expect that most users will need to generate their own +code. However, feel free to contact us at if you are +interested in the subject. + + You might find it interesting to learn Caml and/or some modern +programming techniques that we used in the generator (including monadic +programming), especially if you heard the rumor that Java and +object-oriented programming are the latest advancement in the field. +The internal operation of the codelet generator is described in the +paper, "A Fast Fourier Transform Compiler," by M. Frigo, which is +available from the FFTW home page (http://www.fftw.org) and also +appeared in the 'Proceedings of the 1999 ACM SIGPLAN Conference on +Programming Language Design and Implementation (PLDI)'. + + +File: fftw3.info, Node: Acknowledgments, Next: License and Copyright, Prev: Installation and Customization, Up: Top + +11 Acknowledgments +****************** + +Matteo Frigo was supported in part by the Special Research Program SFB +F011 "AURORA" of the Austrian Science Fund FWF and by MIT Lincoln +Laboratory. For previous versions of FFTW, he was supported in part by +the Defense Advanced Research Projects Agency (DARPA), under Grants +N00014-94-1-0985 and F30602-97-1-0270, and by a Digital Equipment +Corporation Fellowship. + + Steven G. Johnson was supported in part by a Dept. of Defense NDSEG +Fellowship, an MIT Karl Taylor Compton Fellowship, and by the Materials +Research Science and Engineering Center program of the National Science +Foundation under award DMR-9400334. + + Code for the Cell Broadband Engine was graciously donated to the FFTW +project by the IBM Austin Research Lab and included in fftw-3.2. (This +code was removed in fftw-3.3.) + + Code for the MIPS paired-single SIMD support was graciously donated +to the FFTW project by CodeSourcery, Inc. + + We are grateful to Sun Microsystems Inc. for its donation of a +cluster of 9 8-processor Ultra HPC 5000 SMPs (24 Gflops peak). These +machines served as the primary platform for the development of early +versions of FFTW. + + We thank Intel Corporation for donating a four-processor Pentium Pro +machine. We thank the GNU/Linux community for giving us a decent OS to +run on that machine. + + We are thankful to the AMD corporation for donating an AMD Athlon XP +1700+ computer to the FFTW project. + + We thank the Compaq/HP testdrive program and VA Software Corporation +(SourceForge.net) for providing remote access to machines that were used +to test FFTW. + + The 'genfft' suite of code generators was written using Objective +Caml, a dialect of ML. Objective Caml is a small and elegant language +developed by Xavier Leroy. The implementation is available from +'http://caml.inria.fr/' (http://caml.inria.fr/). In previous releases +of FFTW, 'genfft' was written in Caml Light, by the same authors. An +even earlier implementation of 'genfft' was written in Scheme, but Caml +is definitely better for this kind of application. + + FFTW uses many tools from the GNU project, including 'automake', +'texinfo', and 'libtool'. + + Prof. Charles E. Leiserson of MIT provided continuous support and +encouragement. This program would not exist without him. Charles also +proposed the name "codelets" for the basic FFT blocks. + + Prof. John D. Joannopoulos of MIT demonstrated continuing tolerance +of Steven's "extra-curricular" computer-science activities, as well as +remarkable creativity in working them into his grant proposals. +Steven's physics degree would not exist without him. + + Franz Franchetti wrote SIMD extensions to FFTW 2, which eventually +led to the SIMD support in FFTW 3. + + Stefan Kral wrote most of the K7 code generator distributed with FFTW +3.0.x and 3.1.x. + + Andrew Sterian contributed the Windows timing code in FFTW 2. + + Didier Miras reported a bug in the test procedure used in FFTW 1.2. +We now use a completely different test algorithm by Funda Ergun that +does not require a separate FFT program to compare against. + + Wolfgang Reimer contributed the Pentium cycle counter and a few fixes +that help portability. + + Ming-Chang Liu uncovered a well-hidden bug in the complex transforms +of FFTW 2.0 and supplied a patch to correct it. + + The FFTW FAQ was written in 'bfnn' (Bizarre Format With No Name) and +formatted using the tools developed by Ian Jackson for the Linux FAQ. + + _We are especially thankful to all of our users for their continuing +support, feedback, and interest during our development of FFTW._ + + +File: fftw3.info, Node: License and Copyright, Next: Concept Index, Prev: Acknowledgments, Up: Top + +12 License and Copyright +************************ + +FFTW is Copyright (C) 2003, 2007-11 Matteo Frigo, Copyright (C) 2003, +2007-11 Massachusetts Institute of Technology. + + FFTW is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your +option) any later version. + + This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +Public License for more details. + + You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA You can +also find the GPL on the GNU web site +(http://www.gnu.org/licenses/gpl-2.0.html). + + In addition, we kindly ask you to acknowledge FFTW and its authors in +any program or publication in which you use FFTW. (You are not +_required_ to do so; it is up to your common sense to decide whether you +want to comply with this request or not.) For general publications, we +suggest referencing: Matteo Frigo and Steven G. Johnson, "The design and +implementation of FFTW3," Proc. IEEE 93 (2), 216-231 (2005). + + Non-free versions of FFTW are available under terms different from +those of the General Public License. (e.g. they do not require you to +accompany any object code using FFTW with the corresponding source +code.) For these alternative terms you must purchase a license from +MIT's Technology Licensing Office. Users interested in such a license +should contact us () for more information. + + +File: fftw3.info, Node: Concept Index, Next: Library Index, Prev: License and Copyright, Up: Top + +13 Concept Index +**************** + +[index] +* Menu: + +* 64-bit architecture: 64-bit Guru Interface. + (line 6) +* 64-bit architecture <1>: 2d MPI example. (line 69) +* 64-bit architecture <2>: FFTW Fortran type reference. + (line 53) +* advanced interface: Introduction. (line 64) +* advanced interface <1>: Complex Multi-Dimensional DFTs. + (line 62) +* advanced interface <2>: Row-major Format. (line 26) +* advanced interface <3>: Advanced Interface. (line 6) +* advanced interface <4>: Basic and advanced distribution interfaces. + (line 44) +* advanced interface <5>: MPI Data Distribution Functions. + (line 47) +* advanced interface <6>: MPI Plan Creation. (line 43) +* algorithm: Introduction. (line 96) +* alignment: Memory Allocation. (line 12) +* alignment <1>: Planner Flags. (line 75) +* alignment <2>: New-array Execute Functions. + (line 35) +* alignment <3>: Using MPI Plans. (line 24) +* alignment <4>: Overview of Fortran interface. + (line 50) +* alignment <5>: Allocating aligned memory in Fortran. + (line 6) +* AltiVec: SIMD alignment and fftw_malloc. + (line 12) +* AVX: SIMD alignment and fftw_malloc. + (line 12) +* AVX2: SIMD alignment and fftw_malloc. + (line 12) +* AVX512: SIMD alignment and fftw_malloc. + (line 12) +* basic interface: Introduction. (line 64) +* basic interface <1>: Tutorial. (line 14) +* basic interface <2>: Basic Interface. (line 6) +* block distribution: MPI Data Distribution. + (line 21) +* block distribution <1>: Basic and advanced distribution interfaces. + (line 71) +* block distribution <2>: FFTW MPI Performance Tips. + (line 14) +* C multi-dimensional arrays: Fixed-size Arrays in C. + (line 6) +* C++: Complex One-Dimensional DFTs. + (line 114) +* C++ <1>: SIMD alignment and fftw_malloc. + (line 32) +* C++ <2>: Dynamic Arrays in C. (line 31) +* C++ <3>: Complex numbers. (line 35) +* C++ <4>: Memory Allocation. (line 24) +* c2r: One-Dimensional DFTs of Real Data. + (line 37) +* c2r <1>: Planner Flags. (line 73) +* c2r <2>: Real-data DFTs. (line 88) +* C99: Dynamic Arrays in C. (line 31) +* C99 <1>: Complex numbers. (line 22) +* C99 <2>: Precision. (line 29) +* Caml: Generating your own code. + (line 12) +* Caml <1>: Acknowledgments. (line 47) +* code generator: Introduction. (line 76) +* code generator <1>: Generating your own code. + (line 6) +* codelet: Introduction. (line 76) +* codelet <1>: Installation and Customization. + (line 29) +* codelet <2>: Generating your own code. + (line 7) +* codelet <3>: Acknowledgments. (line 54) +* collective function: 2d MPI example. (line 61) +* collective function <1>: FFTW MPI Wisdom. (line 39) +* collective function <2>: Avoiding MPI Deadlocks. + (line 12) +* collective function <3>: Using MPI Plans. (line 10) +* collective function <4>: MPI Plan Creation. (line 27) +* column-major: Column-major Format. (line 6) +* column-major <1>: Reversing array dimensions. + (line 6) +* column-major <2>: Fortran-interface routines. + (line 27) +* column-major <3>: Fortran Examples. (line 93) +* compiler: Introduction. (line 84) +* compiler <1>: Installation and Customization. + (line 16) +* compiler <2>: Installation on Unix. + (line 148) +* compiler <3>: Cycle Counters. (line 14) +* compiler flags: Installation on Unix. + (line 29) +* compiler flags <1>: Installation on Unix. + (line 151) +* configuration routines: Wisdom Utilities. (line 26) +* configure: Installation and Supported Hardware/Software. + (line 12) +* configure <1>: FFTW MPI Installation. + (line 10) +* configure <2>: Installation on Unix. + (line 7) +* cycle counter: Installation and Customization. + (line 16) +* cycle counter <1>: Cycle Counters. (line 6) +* data distribution: Distributed-memory FFTW with MPI. + (line 14) +* data distribution <1>: 2d MPI example. (line 81) +* data distribution <2>: MPI Data Distribution. + (line 6) +* data distribution <3>: Multi-dimensional MPI DFTs of Real Data. + (line 33) +* data distribution <4>: Basic distributed-transpose interface. + (line 33) +* data distribution <5>: MPI Data Distribution Functions. + (line 6) +* DCT: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* DCT <1>: Real-to-Real Transform Kinds. + (line 32) +* DCT <2>: 1d Real-even DFTs (DCTs). + (line 24) +* deadlock: Avoiding MPI Deadlocks. + (line 6) +* Devil: Complex One-Dimensional DFTs. + (line 8) +* DFT: Introduction. (line 9) +* DFT <1>: Complex One-Dimensional DFTs. + (line 106) +* DFT <2>: The 1d Discrete Fourier Transform (DFT). + (line 6) +* DHT: The Discrete Hartley Transform. + (line 17) +* DHT <1>: 1d Discrete Hartley Transforms (DHTs). + (line 6) +* discrete cosine transform: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* discrete cosine transform <1>: Real-to-Real Transform Kinds. + (line 32) +* discrete cosine transform <2>: 1d Real-even DFTs (DCTs). + (line 24) +* discrete Fourier transform: Introduction. (line 9) +* discrete Fourier transform <1>: The 1d Discrete Fourier Transform (DFT). + (line 6) +* discrete Hartley transform: The Discrete Hartley Transform. + (line 17) +* discrete Hartley transform <1>: Real-to-Real Transform Kinds. + (line 29) +* discrete Hartley transform <2>: 1d Discrete Hartley Transforms (DHTs). + (line 6) +* discrete sine transform: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* discrete sine transform <1>: Real-to-Real Transform Kinds. + (line 46) +* discrete sine transform <2>: 1d Real-odd DFTs (DSTs). + (line 24) +* dist: Advanced Complex DFTs. + (line 30) +* dist <1>: Guru vector and transform sizes. + (line 41) +* DST: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* DST <1>: Real-to-Real Transform Kinds. + (line 46) +* DST <2>: 1d Real-odd DFTs (DSTs). + (line 24) +* Ecclesiastes: Caveats in Using Wisdom. + (line 7) +* execute: Introduction. (line 42) +* execute <1>: Complex One-Dimensional DFTs. + (line 91) +* execute <2>: New-array Execute Functions. + (line 6) +* FFTW: Introduction. (line 32) +* fftw-wisdom utility: Caveats in Using Wisdom. + (line 40) +* fftw-wisdom utility <1>: Wisdom Utilities. (line 15) +* fftw-wisdom-to-conf utility: Wisdom Utilities. (line 26) +* flags: Complex One-Dimensional DFTs. + (line 65) +* flags <1>: One-Dimensional DFTs of Real Data. + (line 61) +* flags <2>: Complex DFTs. (line 74) +* flags <3>: Real-data DFTs. (line 69) +* flags <4>: Real-to-Real Transforms. + (line 75) +* flags <5>: Guru Complex DFTs. (line 25) +* flags <6>: Guru Real-data DFTs. (line 58) +* flags <7>: Guru Real-to-real Transforms. + (line 27) +* flags <8>: Overview of Fortran interface. + (line 67) +* flags <9>: FFTW Constants in Fortran. + (line 18) +* Fortran interface: Column-major Format. (line 20) +* Fortran interface <1>: FFTW MPI Fortran Interface. + (line 6) +* Fortran interface <2>: Calling FFTW from Modern Fortran. + (line 6) +* Fortran interface <3>: Calling FFTW from Legacy Fortran. + (line 6) +* Fortran-callable wrappers: Installation on Unix. + (line 92) +* frequency: Complex One-Dimensional DFTs. + (line 87) +* frequency <1>: The 1d Discrete Fourier Transform (DFT). + (line 17) +* g77: Installation on Unix. + (line 113) +* guru interface: Introduction. (line 64) +* guru interface <1>: Complex Multi-Dimensional DFTs. + (line 62) +* guru interface <2>: Guru Interface. (line 6) +* guru interface <3>: FFTW Fortran type reference. + (line 53) +* guru interface <4>: Fortran-interface routines. + (line 43) +* halfcomplex format: One-Dimensional DFTs of Real Data. + (line 75) +* halfcomplex format <1>: The Halfcomplex-format DFT. + (line 9) +* halfcomplex format <2>: The 1d Real-data DFT. + (line 21) +* hc2r: The Halfcomplex-format DFT. + (line 9) +* hc2r <1>: Planner Flags. (line 73) +* HDF5: 2d MPI example. (line 90) +* Hermitian: One-Dimensional DFTs of Real Data. + (line 7) +* Hermitian <1>: The 1d Real-data DFT. + (line 10) +* howmany loop: Guru vector and transform sizes. + (line 41) +* howmany parameter: Advanced Complex DFTs. + (line 30) +* IDCT: Real even/odd DFTs (cosine/sine transforms). + (line 40) +* IDCT <1>: Real even/odd DFTs (cosine/sine transforms). + (line 66) +* IDCT <2>: Real-to-Real Transform Kinds. + (line 40) +* IDCT <3>: 1d Real-even DFTs (DCTs). + (line 51) +* in-place: Complex One-Dimensional DFTs. + (line 58) +* in-place <1>: One-Dimensional DFTs of Real Data. + (line 47) +* in-place <2>: Complex DFTs. (line 61) +* in-place <3>: Real-data DFTs. (line 62) +* in-place <4>: Real-data DFT Array Format. + (line 31) +* in-place <5>: Real-to-Real Transforms. + (line 63) +* in-place <6>: Guru Real-data DFTs. (line 48) +* in-place <7>: Guru Real-data DFTs. (line 63) +* in-place <8>: An improved replacement for MPI_Alltoall. + (line 34) +* in-place <9>: Reversing array dimensions. + (line 53) +* in-place <10>: FFTW Fortran type reference. + (line 37) +* installation: Installation and Customization. + (line 6) +* interleaved format: Interleaved and split arrays. + (line 13) +* iso_c_binding: FFTW MPI Fortran Interface. + (line 6) +* iso_c_binding <1>: Overview of Fortran interface. + (line 12) +* iso_c_binding <2>: Extended and quadruple precision in Fortran. + (line 17) +* kind (r2r): More DFTs of Real Data. + (line 51) +* kind (r2r) <1>: Real-to-Real Transform Kinds. + (line 6) +* linking on Unix: Usage of Multi-threaded FFTW. + (line 16) +* linking on Unix <1>: Linking and Initializing MPI FFTW. + (line 11) +* LISP: Acknowledgments. (line 47) +* load balancing: Load balancing. (line 6) +* load balancing <1>: FFTW MPI Performance Tips. + (line 14) +* monadic programming: Generating your own code. + (line 29) +* MPI: Distributed-memory FFTW with MPI. + (line 6) +* MPI <1>: Installation on Unix. + (line 86) +* MPI communicator: Distributed-memory FFTW with MPI. + (line 34) +* MPI communicator <1>: Using MPI Plans. (line 10) +* MPI communicator <2>: MPI Plan Creation. (line 27) +* MPI communicator <3>: FFTW MPI Fortran Interface. + (line 32) +* MPI I/O: 2d MPI example. (line 90) +* MPI I/O <1>: FFTW MPI Wisdom. (line 10) +* mpicc: FFTW MPI Installation. + (line 23) +* mpicc <1>: Linking and Initializing MPI FFTW. + (line 11) +* new-array execution: New-array Execute Functions. + (line 6) +* new-array execution <1>: Using MPI Plans. (line 14) +* new-array execution <2>: MPI Plan Creation. (line 190) +* new-array execution <3>: FFTW MPI Fortran Interface. + (line 50) +* normalization: Complex One-Dimensional DFTs. + (line 106) +* normalization <1>: Multi-Dimensional DFTs of Real Data. + (line 65) +* normalization <2>: The Halfcomplex-format DFT. + (line 23) +* normalization <3>: Real even/odd DFTs (cosine/sine transforms). + (line 66) +* normalization <4>: The Discrete Hartley Transform. + (line 21) +* normalization <5>: Complex DFTs. (line 80) +* normalization <6>: Real-data DFTs. (line 95) +* normalization <7>: Real-to-Real Transform Kinds. + (line 18) +* normalization <8>: The 1d Discrete Fourier Transform (DFT). + (line 12) +* normalization <9>: The 1d Real-data DFT. + (line 31) +* normalization <10>: 1d Real-even DFTs (DCTs). + (line 68) +* normalization <11>: 1d Real-odd DFTs (DSTs). + (line 63) +* normalization <12>: 1d Discrete Hartley Transforms (DHTs). + (line 10) +* number of threads: How Many Threads to Use?. + (line 6) +* OpenMP: Installation and Supported Hardware/Software. + (line 14) +* OpenMP <1>: Usage of Multi-threaded FFTW. + (line 11) +* OpenMP <2>: Usage of Multi-threaded FFTW. + (line 43) +* OpenMP <3>: Thread safety. (line 6) +* out-of-place: Planner Flags. (line 63) +* out-of-place <1>: Real-data DFT Array Format. + (line 27) +* padding: One-Dimensional DFTs of Real Data. + (line 17) +* padding <1>: Multi-Dimensional DFTs of Real Data. + (line 44) +* padding <2>: Real-data DFTs. (line 67) +* padding <3>: Real-data DFT Array Format. + (line 31) +* padding <4>: Multi-dimensional MPI DFTs of Real Data. + (line 22) +* padding <5>: Reversing array dimensions. + (line 53) +* parallel transform: Multi-threaded FFTW. (line 6) +* parallel transform <1>: Distributed-memory FFTW with MPI. + (line 6) +* partial order: Complex Multi-Dimensional DFTs. + (line 57) +* plan: Introduction. (line 41) +* plan <1>: Complex One-Dimensional DFTs. + (line 44) +* planner: Introduction. (line 40) +* portability: SIMD alignment and fftw_malloc. + (line 21) +* portability <1>: Caveats in Using Wisdom. + (line 9) +* portability <2>: Complex numbers. (line 35) +* portability <3>: Installation and Supported Hardware/Software. + (line 14) +* portability <4>: Calling FFTW from Modern Fortran. + (line 14) +* portability <5>: FFTW Fortran type reference. + (line 68) +* portability <6>: Fortran-interface routines. + (line 21) +* portability <7>: Fortran-interface routines. + (line 66) +* portability <8>: Wisdom of Fortran?. (line 11) +* portability <9>: Installation and Customization. + (line 16) +* precision: Complex One-Dimensional DFTs. + (line 118) +* precision <1>: One-Dimensional DFTs of Real Data. + (line 41) +* precision <2>: SIMD alignment and fftw_malloc. + (line 12) +* precision <3>: Precision. (line 6) +* precision <4>: Memory Allocation. (line 36) +* precision <5>: Linking and Initializing MPI FFTW. + (line 11) +* precision <6>: MPI Files and Data Types. + (line 18) +* precision <7>: Extended and quadruple precision in Fortran. + (line 6) +* precision <8>: FFTW Fortran type reference. + (line 12) +* precision <9>: Installation on Unix. + (line 45) +* precision <10>: Installation on Unix. + (line 49) +* precision <11>: Installation on Unix. + (line 55) +* r2c: One-Dimensional DFTs of Real Data. + (line 37) +* r2c <1>: The Halfcomplex-format DFT. + (line 6) +* r2c <2>: Real-data DFTs. (line 18) +* r2c <3>: Multi-dimensional Transforms. + (line 14) +* r2c <4>: MPI Plan Creation. (line 81) +* r2c/c2r multi-dimensional array format: Multi-Dimensional DFTs of Real Data. + (line 26) +* r2c/c2r multi-dimensional array format <1>: Real-data DFT Array Format. + (line 6) +* r2c/c2r multi-dimensional array format <2>: Reversing array dimensions. + (line 37) +* r2c/c2r multi-dimensional array format <3>: Fortran Examples. + (line 93) +* r2hc: The Halfcomplex-format DFT. + (line 6) +* r2r: More DFTs of Real Data. + (line 13) +* r2r <1>: Real-to-Real Transforms. + (line 6) +* r2r <2>: The 1d Real-data DFT. + (line 21) +* r2r <3>: Other Multi-dimensional Real-data MPI Transforms. + (line 6) +* r2r <4>: MPI Plan Creation. (line 143) +* rank: Complex Multi-Dimensional DFTs. + (line 31) +* real-even DFT: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* real-even DFT <1>: 1d Real-even DFTs (DCTs). + (line 9) +* real-odd DFT: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* real-odd DFT <1>: 1d Real-odd DFTs (DSTs). + (line 9) +* REDFT: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* REDFT <1>: 1d Real-even DFTs (DCTs). + (line 9) +* REDFT <2>: Generating your own code. + (line 20) +* RODFT: Real even/odd DFTs (cosine/sine transforms). + (line 15) +* RODFT <1>: 1d Real-odd DFTs (DSTs). + (line 9) +* row-major: Row-major Format. (line 6) +* row-major <1>: Complex DFTs. (line 47) +* row-major <2>: Real-to-Real Transforms. + (line 46) +* row-major <3>: Guru vector and transform sizes. + (line 50) +* row-major <4>: Basic and advanced distribution interfaces. + (line 32) +* row-major <5>: Multi-dimensional MPI DFTs of Real Data. + (line 83) +* row-major <6>: Reversing array dimensions. + (line 6) +* saving plans to disk: Words of Wisdom-Saving Plans. + (line 6) +* saving plans to disk <1>: Wisdom. (line 6) +* saving plans to disk <2>: FFTW MPI Wisdom. (line 6) +* saving plans to disk <3>: Accessing the wisdom API from Fortran. + (line 6) +* shared-memory: Multi-threaded FFTW. (line 24) +* SIMD: Complex One-Dimensional DFTs. + (line 38) +* SIMD <1>: SIMD alignment and fftw_malloc. + (line 12) +* SIMD <2>: Overview of Fortran interface. + (line 50) +* split format: Interleaved and split arrays. + (line 16) +* SSE: SIMD alignment and fftw_malloc. + (line 12) +* SSE2: SIMD alignment and fftw_malloc. + (line 12) +* stride: Row-major Format. (line 31) +* stride <1>: Advanced Complex DFTs. + (line 47) +* stride <2>: Guru vector and transform sizes. + (line 28) +* stride <3>: MPI Plan Creation. (line 43) +* thread safety: Usage of Multi-threaded FFTW. + (line 49) +* thread safety <1>: Thread safety. (line 6) +* thread safety <2>: Combining MPI and Threads. + (line 53) +* threads: Multi-threaded FFTW. (line 24) +* threads <1>: Thread safety. (line 6) +* threads <2>: Combining MPI and Threads. + (line 6) +* threads <3>: Installation on Unix. + (line 63) +* transpose: Transposed distributions. + (line 15) +* transpose <1>: Multi-dimensional MPI DFTs of Real Data. + (line 90) +* transpose <2>: FFTW MPI Transposes. (line 6) +* transpose <3>: FFTW MPI Performance Tips. + (line 19) +* transpose <4>: Combining MPI and Threads. + (line 75) +* transpose <5>: MPI Plan Creation. (line 178) +* vector: Guru Interface. (line 10) +* VSX: SIMD alignment and fftw_malloc. + (line 12) +* wisdom: Words of Wisdom-Saving Plans. + (line 6) +* wisdom <1>: Wisdom. (line 6) +* wisdom <2>: FFTW MPI Wisdom. (line 6) +* wisdom <3>: Accessing the wisdom API from Fortran. + (line 6) +* wisdom, problems with: Caveats in Using Wisdom. + (line 6) +* wisdom, system-wide: Caveats in Using Wisdom. + (line 33) +* wisdom, system-wide <1>: Wisdom Import. (line 37) + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info-2 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info-2 new file mode 100644 index 000000000..38cd1809b Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.info-2 differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.pdf b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.pdf new file mode 100644 index 000000000..f10e2b416 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.pdf differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.texi new file mode 100644 index 000000000..0b7af92a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/fftw3.texi @@ -0,0 +1,278 @@ +\input texinfo @c -*-texinfo-*- +@c Update by C-x C-e on: (texinfo-multiple-files-update "fftw3.texi" nil t) +@setfilename fftw3.info +@include version.texi +@settitle FFTW @value{VERSION} +@setchapternewpage odd +@c define constant index (ct) +@defcodeindex ct +@syncodeindex ct fn +@syncodeindex vr fn +@syncodeindex pg fn +@syncodeindex tp fn +@c define foreign function index (ff) +@defcodeindex ff +@syncodeindex ff cp +@c define foreign constant index (fc) +@defcodeindex fc +@syncodeindex fc cp +@c define foreign program index (fp) +@defcodeindex fp +@syncodeindex fp cp +@comment %**end of header + +@iftex +@paragraphindent 0 +@parskip=@medskipamount +@end iftex + +@c +@c The following macros are coded in a weird way: + +@c @macro FOO +@c @noindent +@c +@c @refill +@c @end macro + +@c The @noindent/@refill stuff is not necessary in texinfo up to version +@c 4, but it is a hack necessary to make texinfo-5 work. + +@c Texinfo has been stable for the first 15 years of FFTW's history. +@c Then some genius, with too much time in his hands and on a mission to +@c deliver the world from the evil of the C language, decided to rewrite +@c makeinfo in Perl, the old C version of makeinfo being, as I said, +@c evil. The official excuse for the rewrite was that now I can have my +@c manual in XML format, as if XML were a feature. + +@c The result of this stroke of genius is that texinfo-5 has different +@c rules for macro expansion than texinfo-4 does, specifically regarding +@c whether or not spaces after a macro are ignored. Texinfo-4 had weird +@c rules, but at least they were constant and internally more or less +@c consistent. Texinfo-5 has different rules, and even worse the rules +@c in texinfo-5 are inconsistent between the TeX and HTML output +@c processors. This situation makes it almost impossible for us to +@c produce a manual that works with both texinfo 4 and 5 in all modes +@c (TeX, info, and html). The @noindent/@refill hack is my best shot at +@c patching this situation. + +@c "@noindent" has two effects: First, it makes texinfo-5 believe that +@c the next "@ifinfo" is on a new line, otherwise texinfo-5 complains +@c that it is not (even though it obviously is). Second, "@noindent" is +@c a macro that eats extra space, and we want this effect because somehow +@c macro expansion in texinfo-5 inserts extra spaces that were not there +@c in texinfo-4. + +@c "@refill" stops texinfo-5 from interpreting the rest of the line after +@c a macro invocation as an argument to "@end tex". For example, in +@c "FFTW uses @Onlogn algorithms", somehow texinfo-5 thinks that +@c "algorithms" is an argument to "@end tex". "@noindent" would have the +@c same effect (as would any other macro invocation, I think), but, +@c unlike "@noindent", "@refill" does not eat spaces and does not scan +@c the rest of the input file for macro arguments. However, "@refill" is +@c deemed "obsolete" in the texinfo-5 source code, so expect this to +@c break at some point. + +@c This situation is wholly unsatisfactory, and the GNU project is +@c obviously out of control. If this nonsense persists, we will abandon +@c texinfo and produce a latex-only version of the manual. + + +@macro Onlogn +@noindent +@ifinfo +O(n log n) +@end ifinfo +@html +O(n log n) +@end html +@tex +$O(n \\log n)$ +@end tex +@refill +@end macro + +@macro ndims +@noindent +@ifinfo +n[0] x n[1] x n[2] x ... x n[d-1] +@end ifinfo +@html +n0 × n1 × n2 × … × nd-1 +@end html +@tex +$n_0 \\times n_1 \\times n_2 \\times \\cdots \\times n_{d-1}$ +@end tex +@refill +@end macro + +@macro ndimshalf +@noindent +@ifinfo +n[0] x n[1] x n[2] x ... x (n[d-1]/2 + 1) +@end ifinfo +@html +n0 × n1 × n2 × … × (nd-1/2 + 1) +@end html +@tex +$n_0 \\times n_1 \\times n_2 \\times \\cdots \\times (n_{d-1}/2 + 1)$ +@end tex +@refill +@end macro + +@macro ndimspad +@noindent +@ifinfo +n[0] x n[1] x n[2] x ... x [2 (n[d-1]/2 + 1)] +@end ifinfo +@html +n0 × n1 × n2 × … × [2 (nd-1/2 + 1)] +@end html +@tex +$n_0 \\times n_1 \\times n_2 \\times \\cdots \\times [2(n_{d-1}/2 + 1)]$ +@end tex +@refill +@end macro + +@macro twodims{d1, d2} +@noindent +@ifinfo +\d1\ x \d2\ +@end ifinfo +@html +\d1\ × \d2\ +@end html +@tex +$\d1\ \\times \d2\$ +@end tex +@refill +@end macro + +@macro threedims{d1, d2, d3} +@noindent +@ifinfo +\d1\ x \d2\ x \d3\ +@end ifinfo +@html +\d1\ × \d2\ × \d3\ +@end html +@tex +$\d1\ \\times \d2\ \\times \d3\$ +@end tex +@refill +@end macro + +@macro dimk{k} +@noindent +@ifinfo +n[\k\] +@end ifinfo +@html +n\k\ +@end html +@tex +$n_\k\$ +@end tex +@refill +@end macro + + +@macro ndimstrans +@noindent +@ifinfo +n[1] x n[0] x n[2] x ... x n[d-1] +@end ifinfo +@html +n1 × n0 × n2 ×…× nd-1 +@end html +@tex +$n_1 \\times n_0 \\times n_2 \\times \\cdots \\times n_{d-1}$ +@end tex +@refill +@end macro + +@copying +This manual is for FFTW +(version @value{VERSION}, @value{UPDATED}). + +Copyright @copyright{} 2003 Matteo Frigo. + +Copyright @copyright{} 2003 Massachusetts Institute of Technology. + +@quotation +Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions, +except that this permission notice may be stated in a translation +approved by the Free Software Foundation. +@end quotation +@end copying + +@dircategory Development +@direntry +* fftw3: (fftw3). FFTW User's Manual. +@end direntry + +@titlepage +@title FFTW +@subtitle for version @value{VERSION}, @value{UPDATED} +@author Matteo Frigo +@author Steven G. Johnson +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top, Introduction, (dir), (dir) +@top FFTW User Manual +Welcome to FFTW, the Fastest Fourier Transform in the West. FFTW is a +collection of fast C routines to compute the discrete Fourier transform. +This manual documents FFTW version @value{VERSION}. +@end ifnottex + +@menu +* Introduction:: +* Tutorial:: +* Other Important Topics:: +* FFTW Reference:: +* Multi-threaded FFTW:: +* Distributed-memory FFTW with MPI:: +* Calling FFTW from Modern Fortran:: +* Calling FFTW from Legacy Fortran:: +* Upgrading from FFTW version 2:: +* Installation and Customization:: +* Acknowledgments:: +* License and Copyright:: +* Concept Index:: +* Library Index:: +@end menu + +@c ************************************************************ +@include intro.texi +@include tutorial.texi +@include other.texi +@include reference.texi +@include threads.texi +@include mpi.texi +@include modern-fortran.texi +@include legacy-fortran.texi +@include upgrading.texi +@include install.texi +@include acknowledgements.texi +@include license.texi +@include cindex.texi +@include findex.texi +@c ************************************************************ + +@bye diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/findex.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/findex.texi new file mode 100644 index 000000000..6b0bd6904 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/findex.texi @@ -0,0 +1,3 @@ +@node Library Index, , Concept Index, Top +@chapter Library Index +@printindex fn diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Discrete-Hartley-Transforms-_0028DHTs_0029.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Discrete-Hartley-Transforms-_0028DHTs_0029.html new file mode 100644 index 000000000..d346dad6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Discrete-Hartley-Transforms-_0028DHTs_0029.html @@ -0,0 +1,96 @@ + + + + + +FFTW 3.3.8: 1d Discrete Hartley Transforms (DHTs) + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.8.5 1d Discrete Hartley Transforms (DHTs)

    + + + +

    The discrete Hartley transform (DHT) of a 1d real array X of size +n computes a real array Y of the same size, where: +

    .
    +

    + +

    FFTW computes an unnormalized transform, in that there is no coefficient +in front of the summation in the DHT. In other words, applying the +transform twice (the DHT is its own inverse) will multiply the input by +n. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Real_002deven-DFTs-_0028DCTs_0029.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Real_002deven-DFTs-_0028DCTs_0029.html new file mode 100644 index 000000000..3f87e1aed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Real_002deven-DFTs-_0028DCTs_0029.html @@ -0,0 +1,171 @@ + + + + + +FFTW 3.3.8: 1d Real-even DFTs (DCTs) + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.8.3 1d Real-even DFTs (DCTs)

    + +

    The Real-even symmetry DFTs in FFTW are exactly equivalent to the unnormalized +forward (and backward) DFTs as defined above, where the input array +X of length N is purely real and is also even symmetry. In +this case, the output array is likewise real and even symmetry. + + +

    + + +

    For the case of REDFT00, this even symmetry means that +Xj = XN-j, +where we take X to be periodic so that +XN = X0. +Because of this redundancy, only the first n real numbers are +actually stored, where N = 2(n-1). +

    +

    The proper definition of even symmetry for REDFT10, +REDFT01, and REDFT11 transforms is somewhat more intricate +because of the shifts by 1/2 of the input and/or output, although +the corresponding boundary conditions are given in Real even/odd DFTs (cosine/sine transforms). Because of the even symmetry, however, +the sine terms in the DFT all cancel and the remaining cosine terms are +written explicitly below. This formulation often leads people to call +such a transform a discrete cosine transform (DCT), although it is +really just a special case of the DFT. + + +

    + +

    In each of the definitions below, we transform a real array X of +length n to a real array Y of length n: +

    + +

    REDFT00 (DCT-I)

    + +

    An REDFT00 transform (type-I DCT) in FFTW is defined by: +

    .
    +Note that this transform is not defined for n=1. For n=2, +the summation term above is dropped as you might expect. +

    + +

    REDFT10 (DCT-II)

    + +

    An REDFT10 transform (type-II DCT, sometimes called “the” DCT) in FFTW is defined by: +

    .
    +

    + +

    REDFT01 (DCT-III)

    + +

    An REDFT01 transform (type-III DCT) in FFTW is defined by: +

    .
    +In the case of n=1, this reduces to +Y0 = X0. +Up to a scale factor (see below), this is the inverse of REDFT10 (“the” DCT), and so the REDFT01 (DCT-III) is sometimes called the “IDCT”. + +

    + +

    REDFT11 (DCT-IV)

    + +

    An REDFT11 transform (type-IV DCT) in FFTW is defined by: +

    .
    +

    + +

    Inverses and Normalization

    + +

    These definitions correspond directly to the unnormalized DFTs used +elsewhere in FFTW (hence the factors of 2 in front of the +summations). The unnormalized inverse of REDFT00 is +REDFT00, of REDFT10 is REDFT01 and vice versa, and +of REDFT11 is REDFT11. Each unnormalized inverse results +in the original array multiplied by N, where N is the +logical DFT size. For REDFT00, N=2(n-1) (note that +n=1 is not defined); otherwise, N=2n. + +

    + +

    In defining the discrete cosine transform, some authors also include +additional factors of +√2 +(or its inverse) multiplying selected inputs and/or outputs. This is a +mostly cosmetic change that makes the transform orthogonal, but +sacrifices the direct equivalence to a symmetric DFT. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Real_002dodd-DFTs-_0028DSTs_0029.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Real_002dodd-DFTs-_0028DSTs_0029.html new file mode 100644 index 000000000..73555d564 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/1d-Real_002dodd-DFTs-_0028DSTs_0029.html @@ -0,0 +1,168 @@ + + + + + +FFTW 3.3.8: 1d Real-odd DFTs (DSTs) + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.8.4 1d Real-odd DFTs (DSTs)

    + +

    The Real-odd symmetry DFTs in FFTW are exactly equivalent to the unnormalized +forward (and backward) DFTs as defined above, where the input array +X of length N is purely real and is also odd symmetry. In +this case, the output is odd symmetry and purely imaginary. + + +

    + + +

    For the case of RODFT00, this odd symmetry means that +Xj = -XN-j, +where we take X to be periodic so that +XN = X0. +Because of this redundancy, only the first n real numbers +starting at j=1 are actually stored (the j=0 element is +zero), where N = 2(n+1). +

    +

    The proper definition of odd symmetry for RODFT10, +RODFT01, and RODFT11 transforms is somewhat more intricate +because of the shifts by 1/2 of the input and/or output, although +the corresponding boundary conditions are given in Real even/odd DFTs (cosine/sine transforms). Because of the odd symmetry, however, +the cosine terms in the DFT all cancel and the remaining sine terms are +written explicitly below. This formulation often leads people to call +such a transform a discrete sine transform (DST), although it is +really just a special case of the DFT. + + +

    + +

    In each of the definitions below, we transform a real array X of +length n to a real array Y of length n: +

    + +

    RODFT00 (DST-I)

    + +

    An RODFT00 transform (type-I DST) in FFTW is defined by: +

    .
    +

    + +

    RODFT10 (DST-II)

    + +

    An RODFT10 transform (type-II DST) in FFTW is defined by: +

    .
    +

    + +

    RODFT01 (DST-III)

    + +

    An RODFT01 transform (type-III DST) in FFTW is defined by: +

    .
    +In the case of n=1, this reduces to +Y0 = X0. +

    + +

    RODFT11 (DST-IV)

    + +

    An RODFT11 transform (type-IV DST) in FFTW is defined by: +

    .
    +

    + +

    Inverses and Normalization

    + +

    These definitions correspond directly to the unnormalized DFTs used +elsewhere in FFTW (hence the factors of 2 in front of the +summations). The unnormalized inverse of RODFT00 is +RODFT00, of RODFT10 is RODFT01 and vice versa, and +of RODFT11 is RODFT11. Each unnormalized inverse results +in the original array multiplied by N, where N is the +logical DFT size. For RODFT00, N=2(n+1); +otherwise, N=2n. + +

    + +

    In defining the discrete sine transform, some authors also include +additional factors of +√2 +(or its inverse) multiplying selected inputs and/or outputs. This is a +mostly cosmetic change that makes the transform orthogonal, but +sacrifices the direct equivalence to an antisymmetric DFT. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/2d-MPI-example.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/2d-MPI-example.html new file mode 100644 index 000000000..5fd967a6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/2d-MPI-example.html @@ -0,0 +1,194 @@ + + + + + +FFTW 3.3.8: 2d MPI example + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.3 2d MPI example

    + +

    Before we document the FFTW MPI interface in detail, we begin with a +simple example outlining how one would perform a two-dimensional +N0 by N1 complex DFT. +

    +
    +
    #include <fftw3-mpi.h>
    +
    +int main(int argc, char **argv)
    +{
    +    const ptrdiff_t N0 = ..., N1 = ...;
    +    fftw_plan plan;
    +    fftw_complex *data;
    +    ptrdiff_t alloc_local, local_n0, local_0_start, i, j;
    +
    +    MPI_Init(&argc, &argv);
    +    fftw_mpi_init();
    +
    +    /* get local data size and allocate */
    +    alloc_local = fftw_mpi_local_size_2d(N0, N1, MPI_COMM_WORLD,
    +                                         &local_n0, &local_0_start);
    +    data = fftw_alloc_complex(alloc_local);
    +
    +    /* create plan for in-place forward DFT */
    +    plan = fftw_mpi_plan_dft_2d(N0, N1, data, data, MPI_COMM_WORLD,
    +                                FFTW_FORWARD, FFTW_ESTIMATE);    
    +
    +    /* initialize data to some function my_function(x,y) */
    +    for (i = 0; i < local_n0; ++i) for (j = 0; j < N1; ++j)
    +       data[i*N1 + j] = my_function(local_0_start + i, j);
    +
    +    /* compute transforms, in-place, as many times as desired */
    +    fftw_execute(plan);
    +
    +    fftw_destroy_plan(plan);
    +
    +    MPI_Finalize();
    +}
    +
    + +

    As can be seen above, the MPI interface follows the same basic style +of allocate/plan/execute/destroy as the serial FFTW routines. All of +the MPI-specific routines are prefixed with ‘fftw_mpi_’ instead +of ‘fftw_’. There are a few important differences, however: +

    +

    First, we must call fftw_mpi_init() after calling +MPI_Init (required in all MPI programs) and before calling any +other ‘fftw_mpi_’ routine. + + +

    + +

    Second, when we create the plan with fftw_mpi_plan_dft_2d, +analogous to fftw_plan_dft_2d, we pass an additional argument: +the communicator, indicating which processes will participate in the +transform (here MPI_COMM_WORLD, indicating all processes). +Whenever you create, execute, or destroy a plan for an MPI transform, +you must call the corresponding FFTW routine on all processes +in the communicator for that transform. (That is, these are +collective calls.) Note that the plan for the MPI transform +uses the standard fftw_execute and fftw_destroy routines +(on the other hand, there are MPI-specific new-array execute functions +documented below). + + + +

    + +

    Third, all of the FFTW MPI routines take ptrdiff_t arguments +instead of int as for the serial FFTW. ptrdiff_t is a +standard C integer type which is (at least) 32 bits wide on a 32-bit +machine and 64 bits wide on a 64-bit machine. This is to make it easy +to specify very large parallel transforms on a 64-bit machine. (You +can specify 64-bit transform sizes in the serial FFTW, too, but only +by using the ‘guru64’ planner interface. See 64-bit Guru Interface.) + + +

    + +

    Fourth, and most importantly, you don’t allocate the entire +two-dimensional array on each process. Instead, you call +fftw_mpi_local_size_2d to find out what portion of the +array resides on each processor, and how much space to allocate. +Here, the portion of the array on each process is a local_n0 by +N1 slice of the total array, starting at index +local_0_start. The total number of fftw_complex numbers +to allocate is given by the alloc_local return value, which +may be greater than local_n0 * N1 (in case some +intermediate calculations require additional storage). The data +distribution in FFTW’s MPI interface is described in more detail by +the next section. + + +

    + +

    Given the portion of the array that resides on the local process, it +is straightforward to initialize the data (here to a function +myfunction) and otherwise manipulate it. Of course, at the end +of the program you may want to output the data somehow, but +synchronizing this output is up to you and is beyond the scope of this +manual. (One good way to output a large multi-dimensional distributed +array in MPI to a portable binary file is to use the free HDF5 +library; see the HDF home page.) + + +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/64_002dbit-Guru-Interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/64_002dbit-Guru-Interface.html new file mode 100644 index 000000000..613e06a21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/64_002dbit-Guru-Interface.html @@ -0,0 +1,148 @@ + + + + + +FFTW 3.3.8: 64-bit Guru Interface + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5.6 64-bit Guru Interface

    + + +

    When compiled in 64-bit mode on a 64-bit architecture (where addresses +are 64 bits wide), FFTW uses 64-bit quantities internally for all +transform sizes, strides, and so on—you don’t have to do anything +special to exploit this. However, in the ordinary FFTW interfaces, +you specify the transform size by an int quantity, which is +normally only 32 bits wide. This means that, even though FFTW is +using 64-bit sizes internally, you cannot specify a single transform +dimension larger than +231−1 +numbers. +

    +

    We expect that few users will require transforms larger than this, but, +for those who do, we provide a 64-bit version of the guru interface in +which all sizes are specified as integers of type ptrdiff_t +instead of int. (ptrdiff_t is a signed integer type +defined by the C standard to be wide enough to represent address +differences, and thus must be at least 64 bits wide on a 64-bit +machine.) We stress that there is no performance advantage to +using this interface—the same internal FFTW code is employed +regardless—and it is only necessary if you want to specify very +large transform sizes. + +

    + +

    In particular, the 64-bit guru interface is a set of planner routines +that are exactly the same as the guru planner routines, except that +they are named with ‘guru64’ instead of ‘guru’ and they take +arguments of type fftw_iodim64 instead of fftw_iodim. +For example, instead of fftw_plan_guru_dft, we have +fftw_plan_guru64_dft. +

    +
    +
    fftw_plan fftw_plan_guru64_dft(
    +     int rank, const fftw_iodim64 *dims,
    +     int howmany_rank, const fftw_iodim64 *howmany_dims,
    +     fftw_complex *in, fftw_complex *out,
    +     int sign, unsigned flags);
    +
    + + +

    The fftw_iodim64 type is similar to fftw_iodim, with the +same interpretation, except that it uses type ptrdiff_t instead +of type int. +

    +
    +
    typedef struct {
    +     ptrdiff_t n;
    +     ptrdiff_t is;
    +     ptrdiff_t os;
    +} fftw_iodim64;
    +
    + + +

    Every other ‘fftw_plan_guru’ function also has a +‘fftw_plan_guru64’ equivalent, but we do not repeat their +documentation here since they are identical to the 32-bit versions +except as noted above. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Accessing-the-wisdom-API-from-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Accessing-the-wisdom-API-from-Fortran.html new file mode 100644 index 000000000..129b740b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Accessing-the-wisdom-API-from-Fortran.html @@ -0,0 +1,102 @@ + + + + + +FFTW 3.3.8: Accessing the wisdom API from Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.6 Accessing the wisdom API from Fortran

    + + + +

    As explained in Words of Wisdom-Saving Plans, FFTW provides a +“wisdom” API for saving plans to disk so that they can be recreated +quickly. The C API for exporting (see Wisdom Export) and +importing (see Wisdom Import) wisdom is somewhat tricky to use +from Fortran, however, because of differences in file I/O and string +types between C and Fortran. +

    + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Acknowledgments.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Acknowledgments.html new file mode 100644 index 000000000..add58d1de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Acknowledgments.html @@ -0,0 +1,175 @@ + + + + + +FFTW 3.3.8: Acknowledgments + + + + + + + + + + + + + + + + + + + + + +
    + +

    11 Acknowledgments

    + +

    Matteo Frigo was supported in part by the Special Research Program SFB +F011 “AURORA” of the Austrian Science Fund FWF and by MIT Lincoln +Laboratory. For previous versions of FFTW, he was supported in part by the +Defense Advanced Research Projects Agency (DARPA), under Grants +N00014-94-1-0985 and F30602-97-1-0270, and by a Digital Equipment +Corporation Fellowship. +

    +

    Steven G. Johnson was supported in part by a Dept. of Defense NDSEG +Fellowship, an MIT Karl Taylor Compton Fellowship, and by the Materials +Research Science and Engineering Center program of the National Science +Foundation under award DMR-9400334. +

    +

    Code for the Cell Broadband Engine was graciously donated to the FFTW +project by the IBM Austin Research Lab and included in fftw-3.2. (This +code was removed in fftw-3.3.) +

    +

    Code for the MIPS paired-single SIMD support was graciously donated to +the FFTW project by CodeSourcery, Inc. +

    +

    We are grateful to Sun Microsystems Inc. for its donation of a +cluster of 9 8-processor Ultra HPC 5000 SMPs (24 Gflops peak). These +machines served as the primary platform for the development of early +versions of FFTW. +

    +

    We thank Intel Corporation for donating a four-processor Pentium Pro +machine. We thank the GNU/Linux community for giving us a decent OS to +run on that machine. +

    +

    We are thankful to the AMD corporation for donating an AMD Athlon XP 1700+ +computer to the FFTW project. +

    +

    We thank the Compaq/HP testdrive program and VA Software Corporation +(SourceForge.net) for providing remote access to machines that were used +to test FFTW. +

    +

    The genfft suite of code generators was written using Objective +Caml, a dialect of ML. Objective Caml is a small and elegant language +developed by Xavier Leroy. The implementation is available from +http://caml.inria.fr/. In previous +releases of FFTW, genfft was written in Caml Light, by the same +authors. An even earlier implementation of genfft was written in +Scheme, but Caml is definitely better for this kind of application. + + +

    + +

    FFTW uses many tools from the GNU project, including automake, +texinfo, and libtool. +

    +

    Prof. Charles E. Leiserson of MIT provided continuous support and +encouragement. This program would not exist without him. Charles also +proposed the name “codelets” for the basic FFT blocks. + +

    + +

    Prof. John D. Joannopoulos of MIT demonstrated continuing tolerance of +Steven’s “extra-curricular” computer-science activities, as well as +remarkable creativity in working them into his grant proposals. +Steven’s physics degree would not exist without him. +

    +

    Franz Franchetti wrote SIMD extensions to FFTW 2, which eventually +led to the SIMD support in FFTW 3. +

    +

    Stefan Kral wrote most of the K7 code generator distributed with FFTW +3.0.x and 3.1.x. +

    +

    Andrew Sterian contributed the Windows timing code in FFTW 2. +

    +

    Didier Miras reported a bug in the test procedure used in FFTW 1.2. We +now use a completely different test algorithm by Funda Ergun that does +not require a separate FFT program to compare against. +

    +

    Wolfgang Reimer contributed the Pentium cycle counter and a few fixes +that help portability. +

    +

    Ming-Chang Liu uncovered a well-hidden bug in the complex transforms of +FFTW 2.0 and supplied a patch to correct it. +

    +

    The FFTW FAQ was written in bfnn (Bizarre Format With No Name) +and formatted using the tools developed by Ian Jackson for the Linux +FAQ. +

    +

    We are especially thankful to all of our users for their +continuing support, feedback, and interest during our development of +FFTW. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Complex-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Complex-DFTs.html new file mode 100644 index 000000000..628966188 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Complex-DFTs.html @@ -0,0 +1,188 @@ + + + + + +FFTW 3.3.8: Advanced Complex DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.4.1 Advanced Complex DFTs

    + +
    +
    fftw_plan fftw_plan_many_dft(int rank, const int *n, int howmany,
    +                             fftw_complex *in, const int *inembed,
    +                             int istride, int idist,
    +                             fftw_complex *out, const int *onembed,
    +                             int ostride, int odist,
    +                             int sign, unsigned flags);
    +
    + + +

    This routine plans multiple multidimensional complex DFTs, and it +extends the fftw_plan_dft routine (see Complex DFTs) to +compute howmany transforms, each having rank rank and size +n. In addition, the transform data need not be contiguous, but +it may be laid out in memory with an arbitrary stride. To account for +these possibilities, fftw_plan_many_dft adds the new parameters +howmany, {i,o}nembed, +{i,o}stride, and +{i,o}dist. The FFTW basic interface +(see Complex DFTs) provides routines specialized for ranks 1, 2, +and 3, but the advanced interface handles only the general-rank +case. +

    +

    howmany is the (nonnegative) number of transforms to compute. The resulting +plan computes howmany transforms, where the input of the +k-th transform is at location in+k*idist (in C pointer +arithmetic), and its output is at location out+k*odist. Plans +obtained in this way can often be faster than calling FFTW multiple +times for the individual transforms. The basic fftw_plan_dft +interface corresponds to howmany=1 (in which case the dist +parameters are ignored). + + +

    + +

    Each of the howmany transforms has rank rank and size +n, as in the basic interface. In addition, the advanced +interface allows the input and output arrays of each transform to be +row-major subarrays of larger rank-rank arrays, described by +inembed and onembed parameters, respectively. +{i,o}nembed must be arrays of length rank, +and n should be elementwise less than or equal to +{i,o}nembed. Passing NULL for an +nembed parameter is equivalent to passing n (i.e. same +physical and logical dimensions, as in the basic interface.) +

    +

    The stride parameters indicate that the j-th element of +the input or output arrays is located at j*istride or +j*ostride, respectively. (For a multi-dimensional array, +j is the ordinary row-major index.) When combined with the +k-th transform in a howmany loop, from above, this means +that the (j,k)-th element is at j*stride+k*dist. +(The basic fftw_plan_dft interface corresponds to a stride of 1.) + +

    + +

    For in-place transforms, the input and output stride and +dist parameters should be the same; otherwise, the planner may +return NULL. +

    +

    Arrays n, inembed, and onembed are not used after +this function returns. You can safely free or reuse them. +

    +

    Examples: +One transform of one 5 by 6 array contiguous in memory: +

    +
       int rank = 2;
    +   int n[] = {5, 6};
    +   int howmany = 1;
    +   int idist = odist = 0; /* unused because howmany = 1 */
    +   int istride = ostride = 1; /* array is contiguous in memory */
    +   int *inembed = n, *onembed = n;
    +
    + +

    Transform of three 5 by 6 arrays, each contiguous in memory, +stored in memory one after another: +

    +
       int rank = 2;
    +   int n[] = {5, 6};
    +   int howmany = 3;
    +   int idist = odist = n[0]*n[1]; /* = 30, the distance in memory
    +                                     between the first element
    +                                     of the first array and the
    +                                     first element of the second array */
    +   int istride = ostride = 1; /* array is contiguous in memory */
    +   int *inembed = n, *onembed = n;
    +
    + +

    Transform each column of a 2d array with 10 rows and 3 columns: +

    +
       int rank = 1; /* not 2: we are computing 1d transforms */
    +   int n[] = {10}; /* 1d transforms of length 10 */
    +   int howmany = 3;
    +   int idist = odist = 1;
    +   int istride = ostride = 3; /* distance between two elements in 
    +                                 the same column */
    +   int *inembed = n, *onembed = n;
    +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Interface.html new file mode 100644 index 000000000..4653aca58 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Interface.html @@ -0,0 +1,102 @@ + + + + + +FFTW 3.3.8: Advanced Interface + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: FFTW Reference   [Contents][Index]

    +
    +
    + +

    4.4 Advanced Interface

    + + +

    FFTW’s “advanced” interface supplements the basic interface with four +new planner routines, providing a new level of flexibility: you can plan +a transform of multiple arrays simultaneously, operate on non-contiguous +(strided) data, and transform a subset of a larger multi-dimensional +array. Other than these additional features, the planner operates in +the same fashion as in the basic interface, and the resulting +fftw_plan is used in the same way (see Using Plans). +

    + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Real_002ddata-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Real_002ddata-DFTs.html new file mode 100644 index 000000000..7fecd1d52 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Real_002ddata-DFTs.html @@ -0,0 +1,133 @@ + + + + + +FFTW 3.3.8: Advanced Real-data DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.4.2 Advanced Real-data DFTs

    + +
    +
    fftw_plan fftw_plan_many_dft_r2c(int rank, const int *n, int howmany,
    +                                 double *in, const int *inembed,
    +                                 int istride, int idist,
    +                                 fftw_complex *out, const int *onembed,
    +                                 int ostride, int odist,
    +                                 unsigned flags);
    +fftw_plan fftw_plan_many_dft_c2r(int rank, const int *n, int howmany,
    +                                 fftw_complex *in, const int *inembed,
    +                                 int istride, int idist,
    +                                 double *out, const int *onembed,
    +                                 int ostride, int odist,
    +                                 unsigned flags);
    +
    + + + +

    Like fftw_plan_many_dft, these two functions add howmany, +nembed, stride, and dist parameters to the +fftw_plan_dft_r2c and fftw_plan_dft_c2r functions, but +otherwise behave the same as the basic interface. +

    +

    The interpretation of howmany, stride, and dist are +the same as for fftw_plan_many_dft, above. Note that the +stride and dist for the real array are in units of +double, and for the complex array are in units of +fftw_complex. +

    +

    If an nembed parameter is NULL, it is interpreted as what +it would be in the basic interface, as described in Real-data DFT Array Format. That is, for the complex array the size is assumed to be +the same as n, but with the last dimension cut roughly in half. +For the real array, the size is assumed to be n if the transform +is out-of-place, or n with the last dimension “padded” if the +transform is in-place. +

    +

    If an nembed parameter is non-NULL, it is interpreted as +the physical size of the corresponding array, in row-major order, just +as for fftw_plan_many_dft. In this case, each dimension of +nembed should be >= what it would be in the basic +interface (e.g. the halved or padded n). +

    +

    Arrays n, inembed, and onembed are not used after +this function returns. You can safely free or reuse them. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Real_002dto_002dreal-Transforms.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Real_002dto_002dreal-Transforms.html new file mode 100644 index 000000000..ef35294c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-Real_002dto_002dreal-Transforms.html @@ -0,0 +1,105 @@ + + + + + +FFTW 3.3.8: Advanced Real-to-real Transforms + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.4.3 Advanced Real-to-real Transforms

    + +
    +
    fftw_plan fftw_plan_many_r2r(int rank, const int *n, int howmany,
    +                             double *in, const int *inembed,
    +                             int istride, int idist,
    +                             double *out, const int *onembed,
    +                             int ostride, int odist,
    +                             const fftw_r2r_kind *kind, unsigned flags);
    +
    + + +

    Like fftw_plan_many_dft, this functions adds howmany, +nembed, stride, and dist parameters to the +fftw_plan_r2r function, but otherwise behave the same as the +basic interface. The interpretation of those additional parameters are +the same as for fftw_plan_many_dft. (Of course, the +stride and dist parameters are now in units of +double, not fftw_complex.) +

    +

    Arrays n, inembed, onembed, and kind are not +used after this function returns. You can safely free or reuse them. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-distributed_002dtranspose-interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-distributed_002dtranspose-interface.html new file mode 100644 index 000000000..8c8499070 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Advanced-distributed_002dtranspose-interface.html @@ -0,0 +1,108 @@ + + + + + +FFTW 3.3.8: Advanced distributed-transpose interface + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.7.2 Advanced distributed-transpose interface

    + +

    The above routines are for a transpose of a matrix of numbers (of type +double), using FFTW’s default block sizes. More generally, one +can perform transposes of tuples of numbers, with +user-specified block sizes for the input and output: +

    +
    +
    fftw_plan fftw_mpi_plan_many_transpose
    +                (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany,
    +                 ptrdiff_t block0, ptrdiff_t block1,
    +                 double *in, double *out, MPI_Comm comm, unsigned flags);
    +
    + + +

    In this case, one is transposing an n0 by n1 matrix of +howmany-tuples (e.g. howmany = 2 for complex numbers). +The input is distributed along the n0 dimension with block size +block0, and the n1 by n0 output is distributed +along the n1 dimension with block size block1. If +FFTW_MPI_DEFAULT_BLOCK (0) is passed for a block size then FFTW +uses its default block size. To get the local size of the data on +each process, you should then call fftw_mpi_local_size_many_transposed. + + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Allocating-aligned-memory-in-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Allocating-aligned-memory-in-Fortran.html new file mode 100644 index 000000000..058808da4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Allocating-aligned-memory-in-Fortran.html @@ -0,0 +1,168 @@ + + + + + +FFTW 3.3.8: Allocating aligned memory in Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.5 Allocating aligned memory in Fortran

    + + + + +

    In order to obtain maximum performance in FFTW, you should store your +data in arrays that have been specially aligned in memory (see SIMD alignment and fftw_malloc). Enforcing alignment also permits you to +safely use the new-array execute functions (see New-array Execute Functions) to apply a given plan to more than one pair of in/out +arrays. Unfortunately, standard Fortran arrays do not provide +any alignment guarantees. The only way to allocate aligned +memory in standard Fortran is to allocate it with an external C +function, like the fftw_alloc_real and +fftw_alloc_complex functions. Fortunately, Fortran 2003 provides +a simple way to associate such allocated memory with a standard Fortran +array pointer that you can then use normally. +

    +

    We therefore recommend allocating all your input/output arrays using +the following technique: +

    +
      +
    1. Declare a pointer, arr, to your array of the desired type +and dimensions. For example, real(C_DOUBLE), pointer :: a(:,:) +for a 2d real array, or complex(C_DOUBLE_COMPLEX), pointer :: +a(:,:,:) for a 3d complex array. + +
    2. The number of elements to allocate must be an +integer(C_SIZE_T). You can either declare a variable of this +type, e.g. integer(C_SIZE_T) :: sz, to store the number of +elements to allocate, or you can use the int(..., C_SIZE_T) +intrinsic function. e.g. set sz = L * M * N or use +int(L * M * N, C_SIZE_T) for an L × M × N + array. + +
    3. Declare a type(C_PTR) :: p to hold the return value from +FFTW’s allocation routine. Set p = fftw_alloc_real(sz) for a real array, or p = fftw_alloc_complex(sz) for a complex array. + +
    4. +Associate your pointer arr with the allocated memory p +using the standard c_f_pointer subroutine: call +c_f_pointer(p, arr, [...dimensions...]), where +[...dimensions...]) are an array of the dimensions of the array +(in the usual Fortran order). e.g. call c_f_pointer(p, arr, +[L,M,N]) for an L × M × N + array. (Alternatively, you can +omit the dimensions argument if you specified the shape explicitly +when declaring arr.) You can now use arr as a usual +multidimensional array. + +
    5. When you are done using the array, deallocate the memory by call +fftw_free(p) on p. + +
    + +

    For example, here is how we would allocate an L × M + 2d real array: +

    +
    +
      real(C_DOUBLE), pointer :: arr(:,:)
    +  type(C_PTR) :: p
    +  p = fftw_alloc_real(int(L * M, C_SIZE_T))
    +  call c_f_pointer(p, arr, [L,M])
    +  ...use arr and arr(i,j) as usual...
    +  call fftw_free(p)
    +
    + +

    and here is an L × M × N + 3d complex array: +

    +
    +
      complex(C_DOUBLE_COMPLEX), pointer :: arr(:,:,:)
    +  type(C_PTR) :: p
    +  p = fftw_alloc_complex(int(L * M * N, C_SIZE_T))
    +  call c_f_pointer(p, arr, [L,M,N])
    +  ...use arr and arr(i,j,k) as usual...
    +  call fftw_free(p)
    +
    + +

    See Reversing array dimensions for an example allocating a +single array and associating both real and complex array pointers with +it, for in-place real-to-complex transforms. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/An-improved-replacement-for-MPI_005fAlltoall.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/An-improved-replacement-for-MPI_005fAlltoall.html new file mode 100644 index 000000000..6445d633b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/An-improved-replacement-for-MPI_005fAlltoall.html @@ -0,0 +1,138 @@ + + + + + +FFTW 3.3.8: An improved replacement for MPI_Alltoall + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.7.3 An improved replacement for MPI_Alltoall

    + +

    We close this section by noting that FFTW’s MPI transpose routines can +be thought of as a generalization for the MPI_Alltoall function +(albeit only for floating-point types), and in some circumstances can +function as an improved replacement. + +

    + +

    MPI_Alltoall is defined by the MPI standard as: +

    +
    +
    int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype, 
    +                 void *recvbuf, int recvcnt, MPI_Datatype recvtype, 
    +                 MPI_Comm comm);
    +
    + +

    In particular, for double* arrays in and out, +consider the call: +

    +
    +
    MPI_Alltoall(in, howmany, MPI_DOUBLE, out, howmany MPI_DOUBLE, comm);
    +
    + +

    This is completely equivalent to: +

    +
    +
    MPI_Comm_size(comm, &P);
    +plan = fftw_mpi_plan_many_transpose(P, P, howmany, 1, 1, in, out, comm, FFTW_ESTIMATE);
    +fftw_execute(plan);
    +fftw_destroy_plan(plan);
    +
    + +

    That is, computing a P × P + transpose on P processes, +with a block size of 1, is just a standard all-to-all communication. +

    +

    However, using the FFTW routine instead of MPI_Alltoall may +have certain advantages. First of all, FFTW’s routine can operate +in-place (in == out) whereas MPI_Alltoall can only +operate out-of-place. + +

    + +

    Second, even for out-of-place plans, FFTW’s routine may be faster, +especially if you need to perform the all-to-all communication many +times and can afford to use FFTW_MEASURE or +FFTW_PATIENT. It should certainly be no slower, not including +the time to create the plan, since one of the possible algorithms that +FFTW uses for an out-of-place transpose is simply to call +MPI_Alltoall. However, FFTW also considers several other +possible algorithms that, depending on your MPI implementation and +your hardware, may be faster. + + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Avoiding-MPI-Deadlocks.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Avoiding-MPI-Deadlocks.html new file mode 100644 index 000000000..770278a45 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Avoiding-MPI-Deadlocks.html @@ -0,0 +1,107 @@ + + + + + +FFTW 3.3.8: Avoiding MPI Deadlocks + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.9 Avoiding MPI Deadlocks

    + + +

    An MPI program can deadlock if one process is waiting for a +message from another process that never gets sent. To avoid deadlocks +when using FFTW’s MPI routines, it is important to know which +functions are collective: that is, which functions must +always be called in the same order from every +process in a given communicator. (For example, MPI_Barrier is +the canonical example of a collective function in the MPI standard.) + + +

    + +

    The functions in FFTW that are always collective are: every +function beginning with ‘fftw_mpi_plan’, as well as +fftw_mpi_broadcast_wisdom and fftw_mpi_gather_wisdom. +Also, the following functions from the ordinary FFTW interface are +collective when they are applied to a plan created by an +‘fftw_mpi_plan’ function: fftw_execute, +fftw_destroy_plan, and fftw_flops. + + + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-Interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-Interface.html new file mode 100644 index 000000000..37520aa6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-Interface.html @@ -0,0 +1,115 @@ + + + + + +FFTW 3.3.8: Basic Interface + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: FFTW Reference   [Contents][Index]

    +
    +
    + +

    4.3 Basic Interface

    + + +

    Recall that the FFTW API is divided into three parts6: the basic interface +computes a single transform of contiguous data, the advanced +interface computes transforms of multiple or strided arrays, and the +guru interface supports the most general data layouts, +multiplicities, and strides. This section describes the the basic +interface, which we expect to satisfy the needs of most users. +

    + + + + + + + + + +
    +
    +

    Footnotes

    + +

    (6)

    +

    Gallia est +omnis divisa in partes tres (Julius Caesar).

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-and-advanced-distribution-interfaces.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-and-advanced-distribution-interfaces.html new file mode 100644 index 000000000..e290836d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-and-advanced-distribution-interfaces.html @@ -0,0 +1,188 @@ + + + + + +FFTW 3.3.8: Basic and advanced distribution interfaces + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.4.1 Basic and advanced distribution interfaces

    + +

    As with the planner interface, the ‘fftw_mpi_local_size’ +distribution interface is broken into basic and advanced +(‘_many’) interfaces, where the latter allows you to specify the +block size manually and also to request block sizes when computing +multiple transforms simultaneously. These functions are documented +more exhaustively by the FFTW MPI Reference, but we summarize the +basic ideas here using a couple of two-dimensional examples. +

    +

    For the 100 × 200 + complex-DFT example, above, we would find +the distribution by calling the following function in the basic +interface: +

    +
    +
    ptrdiff_t fftw_mpi_local_size_2d(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,
    +                                 ptrdiff_t *local_n0, ptrdiff_t *local_0_start);
    +
    + + +

    Given the total size of the data to be transformed (here, n0 = +100 and n1 = 200) and an MPI communicator (comm), this +function provides three numbers. +

    +

    First, it describes the shape of the local data: the current process +should store a local_n0 by n1 slice of the overall +dataset, in row-major order (n1 dimension contiguous), starting +at index local_0_start. That is, if the total dataset is +viewed as a n0 by n1 matrix, the current process should +store the rows local_0_start to +local_0_start+local_n0-1. Obviously, if you are running with +only a single MPI process, that process will store the entire array: +local_0_start will be zero and local_n0 will be +n0. See Row-major Format. + +

    + +

    Second, the return value is the total number of data elements (e.g., +complex numbers for a complex DFT) that should be allocated for the +input and output arrays on the current process (ideally with +fftw_malloc or an ‘fftw_alloc’ function, to ensure optimal +alignment). It might seem that this should always be equal to +local_n0 * n1, but this is not the case. FFTW’s +distributed FFT algorithms require data redistributions at +intermediate stages of the transform, and in some circumstances this +may require slightly larger local storage. This is discussed in more +detail below, under Load balancing. + + +

    + + +

    The advanced-interface ‘local_size’ function for multidimensional +transforms returns the same three things (local_n0, +local_0_start, and the total number of elements to allocate), +but takes more inputs: +

    +
    +
    ptrdiff_t fftw_mpi_local_size_many(int rnk, const ptrdiff_t *n,
    +                                   ptrdiff_t howmany,
    +                                   ptrdiff_t block0,
    +                                   MPI_Comm comm,
    +                                   ptrdiff_t *local_n0,
    +                                   ptrdiff_t *local_0_start);
    +
    + + +

    The two-dimensional case above corresponds to rnk = 2 and an +array n of length 2 with n[0] = n0 and n[1] = n1. +This routine is for any rnk > 1; one-dimensional transforms +have their own interface because they work slightly differently, as +discussed below. +

    +

    First, the advanced interface allows you to perform multiple +transforms at once, of interleaved data, as specified by the +howmany parameter. (hoamany is 1 for a single +transform.) +

    +

    Second, here you can specify your desired block size in the n0 +dimension, block0. To use FFTW’s default block size, pass +FFTW_MPI_DEFAULT_BLOCK (0) for block0. Otherwise, on +P processes, FFTW will return local_n0 equal to +block0 on the first P / block0 processes (rounded down), +return local_n0 equal to n0 - block0 * (P / block0) on +the next process, and local_n0 equal to zero on any remaining +processes. In general, we recommend using the default block size +(which corresponds to n0 / P, rounded up). + + +

    + +

    For example, suppose you have P = 4 processes and n0 = +21. The default will be a block size of 6, which will give +local_n0 = 6 on the first three processes and local_n0 = +3 on the last process. Instead, however, you could specify +block0 = 5 if you wanted, which would give local_n0 = 5 +on processes 0 to 2, local_n0 = 6 on process 3. (This choice, +while it may look superficially more “balanced,” has the same +critical path as FFTW’s default but requires more communications.) +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-distributed_002dtranspose-interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-distributed_002dtranspose-interface.html new file mode 100644 index 000000000..63af5a1b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Basic-distributed_002dtranspose-interface.html @@ -0,0 +1,140 @@ + + + + + +FFTW 3.3.8: Basic distributed-transpose interface + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.7.1 Basic distributed-transpose interface

    + +

    In particular, suppose that we have an n0 by n1 array in +row-major order, block-distributed across the n0 dimension. To +transpose this into an n1 by n0 array block-distributed +across the n1 dimension, we would create a plan by calling the +following function: +

    +
    +
    fftw_plan fftw_mpi_plan_transpose(ptrdiff_t n0, ptrdiff_t n1,
    +                                  double *in, double *out,
    +                                  MPI_Comm comm, unsigned flags);
    +
    + + +

    The input and output arrays (in and out) can be the +same. The transpose is actually executed by calling +fftw_execute on the plan, as usual. + +

    + +

    The flags are the usual FFTW planner flags, but support +two additional flags: FFTW_MPI_TRANSPOSED_OUT and/or +FFTW_MPI_TRANSPOSED_IN. What these flags indicate, for +transpose plans, is that the output and/or input, respectively, are +locally transposed. That is, on each process input data is +normally stored as a local_n0 by n1 array in row-major +order, but for an FFTW_MPI_TRANSPOSED_IN plan the input data is +stored as n1 by local_n0 in row-major order. Similarly, +FFTW_MPI_TRANSPOSED_OUT means that the output is n0 by +local_n1 instead of local_n1 by n0. + + +

    + +

    To determine the local size of the array on each process before and +after the transpose, as well as the amount of storage that must be +allocated, one should call fftw_mpi_local_size_2d_transposed, +just as for a 2d DFT as described in the previous section: + +

    +
    +
    ptrdiff_t fftw_mpi_local_size_2d_transposed
    +                (ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,
    +                 ptrdiff_t *local_n0, ptrdiff_t *local_0_start,
    +                 ptrdiff_t *local_n1, ptrdiff_t *local_1_start);
    +
    + + +

    Again, the return value is the local storage to allocate, which in +this case is the number of real (double) values rather +than complex numbers as in the previous examples. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Calling-FFTW-from-Legacy-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Calling-FFTW-from-Legacy-Fortran.html new file mode 100644 index 000000000..cd08a882b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Calling-FFTW-from-Legacy-Fortran.html @@ -0,0 +1,126 @@ + + + + + +FFTW 3.3.8: Calling FFTW from Legacy Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    8 Calling FFTW from Legacy Fortran

    + + +

    This chapter describes the interface to FFTW callable by Fortran code +in older compilers not supporting the Fortran 2003 C interoperability +features (see Calling FFTW from Modern Fortran). This interface +has the major disadvantage that it is not type-checked, so if you +mistake the argument types or ordering then your program will not have +any compiler errors, and will likely crash at runtime. So, greater +care is needed. Also, technically interfacing older Fortran versions +to C is nonstandard, but in practice we have found that the techniques +used in this chapter have worked with all known Fortran compilers for +many years. +

    +

    The legacy Fortran interface differs from the C interface only in the +prefix (‘dfftw_’ instead of ‘fftw_’ in double precision) and +a few other minor details. This Fortran interface is included in the +FFTW libraries by default, unless a Fortran compiler isn’t found on +your system or --disable-fortran is included in the +configure flags. We assume here that the reader is already +familiar with the usage of FFTW in C, as described elsewhere in this +manual. +

    +

    The MPI parallel interface to FFTW is not currently available +to legacy Fortran. +

    + + + + + + + + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Calling-FFTW-from-Modern-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Calling-FFTW-from-Modern-Fortran.html new file mode 100644 index 000000000..a34a64110 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Calling-FFTW-from-Modern-Fortran.html @@ -0,0 +1,119 @@ + + + + + +FFTW 3.3.8: Calling FFTW from Modern Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7 Calling FFTW from Modern Fortran

    + + +

    Fortran 2003 standardized ways for Fortran code to call C libraries, +and this allows us to support a direct translation of the FFTW C API +into Fortran. Compared to the legacy Fortran 77 interface +(see Calling FFTW from Legacy Fortran), this direct interface +offers many advantages, especially compile-time type-checking and +aligned memory allocation. As of this writing, support for these C +interoperability features seems widespread, having been implemented in +nearly all major Fortran compilers (e.g. GNU, Intel, IBM, +Oracle/Solaris, Portland Group, NAG). + +

    +

    This chapter documents that interface. For the most part, since this +interface allows Fortran to call the C interface directly, the usage +is identical to C translated to Fortran syntax. However, there are a +few subtle points such as memory allocation, wisdom, and data types +that deserve closer attention. +

    + + + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Caveats-in-Using-Wisdom.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Caveats-in-Using-Wisdom.html new file mode 100644 index 000000000..42109f979 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Caveats-in-Using-Wisdom.html @@ -0,0 +1,139 @@ + + + + + +FFTW 3.3.8: Caveats in Using Wisdom + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.4 Caveats in Using Wisdom

    + + +
    + +

    For in much wisdom is much grief, and he that increaseth knowledge +increaseth sorrow. + +[Ecclesiastes 1:18] + +

    + + +

    There are pitfalls to using wisdom, in that it can negate FFTW’s +ability to adapt to changing hardware and other conditions. For +example, it would be perfectly possible to export wisdom from a +program running on one processor and import it into a program running +on another processor. Doing so, however, would mean that the second +program would use plans optimized for the first processor, instead of +the one it is running on. +

    +

    It should be safe to reuse wisdom as long as the hardware and program +binaries remain unchanged. (Actually, the optimal plan may change even +between runs of the same binary on identical hardware, due to +differences in the virtual memory environment, etcetera. Users +seriously interested in performance should worry about this problem, +too.) It is likely that, if the same wisdom is used for two +different program binaries, even running on the same machine, the +plans may be sub-optimal because of differing code alignments. It is +therefore wise to recreate wisdom every time an application is +recompiled. The more the underlying hardware and software changes +between the creation of wisdom and its use, the greater grows +the risk of sub-optimal plans. +

    +

    Nevertheless, if the choice is between using FFTW_ESTIMATE or +using possibly-suboptimal wisdom (created on the same machine, but for a +different binary), the wisdom is likely to be better. For this reason, +we provide a function to import wisdom from a standard system-wide +location (/etc/fftw/wisdom on Unix): + +

    +
    +
    int fftw_import_system_wisdom(void);
    +
    + + +

    FFTW also provides a standalone program, fftw-wisdom (described +by its own man page on Unix) with which users can create wisdom, +e.g. for a canonical set of sizes to store in the system wisdom file. +See Wisdom Utilities. + +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Column_002dmajor-Format.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Column_002dmajor-Format.html new file mode 100644 index 000000000..57a187b75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Column_002dmajor-Format.html @@ -0,0 +1,102 @@ + + + + + +FFTW 3.3.8: Column-major Format + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.2.2 Column-major Format

    + + +

    Readers from the Fortran world are used to arrays stored in +column-major order (sometimes called “Fortran order”). This is +essentially the exact opposite of row-major order in that, here, the +first dimension’s index varies most quickly. +

    +

    If you have an array stored in column-major order and wish to +transform it using FFTW, it is quite easy to do. When creating the +plan, simply pass the dimensions of the array to the planner in +reverse order. For example, if your array is a rank three +N x M x L matrix in column-major order, you should pass the +dimensions of the array as if it were an L x M x N matrix +(which it is, from the perspective of FFTW). This is done for you +automatically by the FFTW legacy-Fortran interface +(see Calling FFTW from Legacy Fortran), but you must do it +manually with the modern Fortran interface (see Reversing array dimensions). + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Combining-MPI-and-Threads.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Combining-MPI-and-Threads.html new file mode 100644 index 000000000..551dc16db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Combining-MPI-and-Threads.html @@ -0,0 +1,169 @@ + + + + + +FFTW 3.3.8: Combining MPI and Threads + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.11 Combining MPI and Threads

    + + +

    In certain cases, it may be advantageous to combine MPI +(distributed-memory) and threads (shared-memory) parallelization. +FFTW supports this, with certain caveats. For example, if you have a +cluster of 4-processor shared-memory nodes, you may want to use +threads within the nodes and MPI between the nodes, instead of MPI for +all parallelization. +

    +

    In particular, it is possible to seamlessly combine the MPI FFTW +routines with the multi-threaded FFTW routines (see Multi-threaded FFTW). However, some care must be taken in the initialization code, +which should look something like this: +

    +
    +
    int threads_ok;
    +
    +int main(int argc, char **argv)
    +{
    +    int provided;
    +    MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided);
    +    threads_ok = provided >= MPI_THREAD_FUNNELED;
    +
    +    if (threads_ok) threads_ok = fftw_init_threads();
    +    fftw_mpi_init();
    +
    +    ...
    +    if (threads_ok) fftw_plan_with_nthreads(...);
    +    ...
    +    
    +    MPI_Finalize();
    +}
    +
    + + + + +

    First, note that instead of calling MPI_Init, you should call +MPI_Init_threads, which is the initialization routine defined +by the MPI-2 standard to indicate to MPI that your program will be +multithreaded. We pass MPI_THREAD_FUNNELED, which indicates +that we will only call MPI routines from the main thread. (FFTW will +launch additional threads internally, but the extra threads will not +call MPI code.) (You may also pass MPI_THREAD_SERIALIZED or +MPI_THREAD_MULTIPLE, which requests additional multithreading +support from the MPI implementation, but this is not required by +FFTW.) The provided parameter returns what level of threads +support is actually supported by your MPI implementation; this +must be at least MPI_THREAD_FUNNELED if you want to call +the FFTW threads routines, so we define a global variable +threads_ok to record this. You should only call +fftw_init_threads or fftw_plan_with_nthreads if +threads_ok is true. For more information on thread safety in +MPI, see the +MPI and +Threads section of the MPI-2 standard. + +

    + +

    Second, we must call fftw_init_threads before +fftw_mpi_init. This is critical for technical reasons having +to do with how FFTW initializes its list of algorithms. +

    +

    Then, if you call fftw_plan_with_nthreads(N), every MPI +process will launch (up to) N threads to parallelize its transforms. +

    +

    For example, in the hypothetical cluster of 4-processor nodes, you +might wish to launch only a single MPI process per node, and then call +fftw_plan_with_nthreads(4) on each process to use all +processors in the nodes. +

    +

    This may or may not be faster than simply using as many MPI processes +as you have processors, however. On the one hand, using threads +within a node eliminates the need for explicit message passing within +the node. On the other hand, FFTW’s transpose routines are not +multi-threaded, and this means that the communications that do take +place will not benefit from parallelization within the node. +Moreover, many MPI implementations already have optimizations to +exploit shared memory when it is available, so adding the +multithreaded FFTW on top of this may be superfluous. + +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-DFTs.html new file mode 100644 index 000000000..c283319c8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-DFTs.html @@ -0,0 +1,182 @@ + + + + + +FFTW 3.3.8: Complex DFTs + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Basic Interface   [Contents][Index]

    +
    +
    + +

    4.3.1 Complex DFTs

    + +
    +
    fftw_plan fftw_plan_dft_1d(int n0,
    +                           fftw_complex *in, fftw_complex *out,
    +                           int sign, unsigned flags);
    +fftw_plan fftw_plan_dft_2d(int n0, int n1,
    +                           fftw_complex *in, fftw_complex *out,
    +                           int sign, unsigned flags);
    +fftw_plan fftw_plan_dft_3d(int n0, int n1, int n2,
    +                           fftw_complex *in, fftw_complex *out,
    +                           int sign, unsigned flags);
    +fftw_plan fftw_plan_dft(int rank, const int *n,
    +                        fftw_complex *in, fftw_complex *out,
    +                        int sign, unsigned flags);
    +
    + + + + + +

    Plan a complex input/output discrete Fourier transform (DFT) in zero or +more dimensions, returning an fftw_plan (see Using Plans). +

    +

    Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). +

    +

    The planner returns NULL if the plan cannot be created. In the +standard FFTW distribution, the basic interface is guaranteed to return +a non-NULL plan. A plan may be NULL, however, if you are +using a customized FFTW configuration supporting a restricted set of +transforms. +

    + +

    Arguments

    +
      +
    • rank is the rank of the transform (it should be the size of the +array *n), and can be any non-negative integer. (See Complex Multi-Dimensional DFTs, for the definition of “rank”.) The +‘_1d’, ‘_2d’, and ‘_3d’ planners correspond to a +rank of 1, 2, and 3, respectively. The rank +may be zero, which is equivalent to a rank-1 transform of size 1, i.e. a +copy of one number from input to output. + +
    • n0, n1, n2, or n[0..rank-1] (as appropriate +for each routine) specify the size of the transform dimensions. They +can be any positive integer. + +
        +
      • - +Multi-dimensional arrays are stored in row-major order with dimensions: +n0 x n1; or n0 x n1 x n2; or +n[0] x n[1] x ... x n[rank-1]. +See Multi-dimensional Array Format. +
      • - FFTW is best at handling sizes of the form +2a 3b 5c 7d + 11e 13f, +where e+f is either 0 or 1, and the other exponents +are arbitrary. Other sizes are computed by means of a slow, +general-purpose algorithm (which nevertheless retains O(n log n) + performance even for prime sizes). It is possible to customize FFTW +for different array sizes; see Installation and Customization. +Transforms whose sizes are powers of 2 are especially fast. +
      + +
    • in and out point to the input and output arrays of the +transform, which may be the same (yielding an in-place transform). + +These arrays are overwritten during planning, unless +FFTW_ESTIMATE is used in the flags. (The arrays need not be +initialized, but they must be allocated.) + +

      If in == out, the transform is in-place and the input +array is overwritten. If in != out, the two arrays must +not overlap (but FFTW does not check for this condition). +

      +
    • + +sign is the sign of the exponent in the formula that defines the +Fourier transform. It can be -1 (= FFTW_FORWARD) or ++1 (= FFTW_BACKWARD). + +
    • +flags is a bitwise OR (‘|’) of zero or more planner flags, +as defined in Planner Flags. + +
    + +

    FFTW computes an unnormalized transform: computing a forward followed by +a backward transform (or vice versa) will result in the original data +multiplied by the size of the transform (the product of the dimensions). + +For more information, see What FFTW Really Computes. +

    +
    +
    +

    +Next: , Previous: , Up: Basic Interface   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-Multi_002dDimensional-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-Multi_002dDimensional-DFTs.html new file mode 100644 index 000000000..009a717b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-Multi_002dDimensional-DFTs.html @@ -0,0 +1,177 @@ + + + + + +FFTW 3.3.8: Complex Multi-Dimensional DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.2 Complex Multi-Dimensional DFTs

    + +

    Multi-dimensional transforms work much the same way as one-dimensional +transforms: you allocate arrays of fftw_complex (preferably +using fftw_malloc), create an fftw_plan, execute it as +many times as you want with fftw_execute(plan), and clean up +with fftw_destroy_plan(plan) (and fftw_free). +

    +

    FFTW provides two routines for creating plans for 2d and 3d transforms, +and one routine for creating plans of arbitrary dimensionality. +The 2d and 3d routines have the following signature: +

    +
    fftw_plan fftw_plan_dft_2d(int n0, int n1,
    +                           fftw_complex *in, fftw_complex *out,
    +                           int sign, unsigned flags);
    +fftw_plan fftw_plan_dft_3d(int n0, int n1, int n2,
    +                           fftw_complex *in, fftw_complex *out,
    +                           int sign, unsigned flags);
    +
    + + + +

    These routines create plans for n0 by n1 two-dimensional +(2d) transforms and n0 by n1 by n2 3d transforms, +respectively. All of these transforms operate on contiguous arrays in +the C-standard row-major order, so that the last dimension has the +fastest-varying index in the array. This layout is described further in +Multi-dimensional Array Format. +

    +

    FFTW can also compute transforms of higher dimensionality. In order to +avoid confusion between the various meanings of the the word +“dimension”, we use the term rank + +to denote the number of independent indices in an array.2 For +example, we say that a 2d transform has rank 2, a 3d transform has +rank 3, and so on. You can plan transforms of arbitrary rank by +means of the following function: +

    +
    +
    fftw_plan fftw_plan_dft(int rank, const int *n,
    +                        fftw_complex *in, fftw_complex *out,
    +                        int sign, unsigned flags);
    +
    + + +

    Here, n is a pointer to an array n[rank] denoting an +n[0] by n[1] by … by n[rank-1] transform. +Thus, for example, the call +

    +
    fftw_plan_dft_2d(n0, n1, in, out, sign, flags);
    +
    +

    is equivalent to the following code fragment: +

    +
    int n[2];
    +n[0] = n0;
    +n[1] = n1;
    +fftw_plan_dft(2, n, in, out, sign, flags);
    +
    +

    fftw_plan_dft is not restricted to 2d and 3d transforms, +however, but it can plan transforms of arbitrary rank. +

    +

    You may have noticed that all the planner routines described so far +have overlapping functionality. For example, you can plan a 1d or 2d +transform by using fftw_plan_dft with a rank of 1 +or 2, or even by calling fftw_plan_dft_3d with n0 +and/or n1 equal to 1 (with no loss in efficiency). This +pattern continues, and FFTW’s planning routines in general form a +“partial order,” sequences of + +interfaces with strictly increasing generality but correspondingly +greater complexity. +

    +

    fftw_plan_dft is the most general complex-DFT routine that we +describe in this tutorial, but there are also the advanced and guru interfaces, + + +which allow one to efficiently combine multiple/strided transforms +into a single FFTW plan, transform a subset of a larger +multi-dimensional array, and/or to handle more general complex-number +formats. For more information, see FFTW Reference. +

    +
    +
    +

    Footnotes

    + +

    (2)

    +

    The +term “rank” is commonly used in the APL, FORTRAN, and Common Lisp +traditions, although it is not so common in the C world.

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-One_002dDimensional-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-One_002dDimensional-DFTs.html new file mode 100644 index 000000000..d804c64c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-One_002dDimensional-DFTs.html @@ -0,0 +1,250 @@ + + + + + +FFTW 3.3.8: Complex One-Dimensional DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.1 Complex One-Dimensional DFTs

    + +
    +

    Plan: To bother about the best method of accomplishing an accidental result. +[Ambrose Bierce, The Enlarged Devil’s Dictionary.] + +

    + + +

    The basic usage of FFTW to compute a one-dimensional DFT of size +N is simple, and it typically looks something like this code: +

    +
    +
    #include <fftw3.h>
    +...
    +{
    +    fftw_complex *in, *out;
    +    fftw_plan p;
    +    ...
    +    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    +    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    +    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    +    ...
    +    fftw_execute(p); /* repeat as needed */
    +    ...
    +    fftw_destroy_plan(p);
    +    fftw_free(in); fftw_free(out);
    +}
    +
    + +

    You must link this code with the fftw3 library. On Unix systems, +link with -lfftw3 -lm. +

    +

    The example code first allocates the input and output arrays. You can +allocate them in any way that you like, but we recommend using +fftw_malloc, which behaves like + +malloc except that it properly aligns the array when SIMD +instructions (such as SSE and Altivec) are available (see SIMD alignment and fftw_malloc). [Alternatively, we provide a convenient wrapper function fftw_alloc_complex(N) which has the same effect.] + + +

    + +

    The data is an array of type fftw_complex, which is by default a +double[2] composed of the real (in[i][0]) and imaginary +(in[i][1]) parts of a complex number. + +

    +

    The next step is to create a plan, which is an object + +that contains all the data that FFTW needs to compute the FFT. +This function creates the plan: +

    +
    +
    fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out,
    +                           int sign, unsigned flags);
    +
    + + + +

    The first argument, n, is the size of the transform you are +trying to compute. The size n can be any positive integer, but +sizes that are products of small factors are transformed most +efficiently (although prime sizes still use an O(n log n) + algorithm). +

    +

    The next two arguments are pointers to the input and output arrays of +the transform. These pointers can be equal, indicating an +in-place transform. + +

    + +

    The fourth argument, sign, can be either FFTW_FORWARD +(-1) or FFTW_BACKWARD (+1), + + +and indicates the direction of the transform you are interested in; +technically, it is the sign of the exponent in the transform. +

    +

    The flags argument is usually either FFTW_MEASURE or + +FFTW_ESTIMATE. FFTW_MEASURE instructs FFTW to run + +and measure the execution time of several FFTs in order to find the +best way to compute the transform of size n. This process takes +some time (usually a few seconds), depending on your machine and on +the size of the transform. FFTW_ESTIMATE, on the contrary, +does not run any computation and just builds a + +reasonable plan that is probably sub-optimal. In short, if your +program performs many transforms of the same size and initialization +time is not important, use FFTW_MEASURE; otherwise use the +estimate. +

    +

    You must create the plan before initializing the input, because +FFTW_MEASURE overwrites the in/out arrays. +(Technically, FFTW_ESTIMATE does not touch your arrays, but you +should always create plans first just to be sure.) +

    +

    Once the plan has been created, you can use it as many times as you +like for transforms on the specified in/out arrays, +computing the actual transforms via fftw_execute(plan): +

    +
    void fftw_execute(const fftw_plan plan);
    +
    + + +

    The DFT results are stored in-order in the array out, with the +zero-frequency (DC) component in out[0]. + +If in != out, the transform is out-of-place and the input +array in is not modified. Otherwise, the input array is +overwritten with the transform. +

    + +

    If you want to transform a different array of the same size, you +can create a new plan with fftw_plan_dft_1d and FFTW +automatically reuses the information from the previous plan, if +possible. Alternatively, with the “guru” interface you can apply a +given plan to a different array, if you are careful. +See FFTW Reference. +

    +

    When you are done with the plan, you deallocate it by calling +fftw_destroy_plan(plan): +

    +
    void fftw_destroy_plan(fftw_plan plan);
    +
    + +

    If you allocate an array with fftw_malloc() you must deallocate +it with fftw_free(). Do not use free() or, heaven +forbid, delete. + +

    +

    FFTW computes an unnormalized DFT. Thus, computing a forward +followed by a backward transform (or vice versa) results in the original +array scaled by n. For the definition of the DFT, see What FFTW Really Computes. + + +

    + +

    If you have a C compiler, such as gcc, that supports the +C99 standard, and you #include <complex.h> before +<fftw3.h>, then fftw_complex is the native +double-precision complex type and you can manipulate it with ordinary +arithmetic. Otherwise, FFTW defines its own complex type, which is +bit-compatible with the C99 complex type. See Complex numbers. +(The C++ <complex> template class may also be usable via a +typecast.) + +

    +

    To use single or long-double precision versions of FFTW, replace the +fftw_ prefix by fftwf_ or fftwl_ and link with +-lfftw3f or -lfftw3l, but use the same +<fftw3.h> header file. + +

    + +

    Many more flags exist besides FFTW_MEASURE and +FFTW_ESTIMATE. For example, use FFTW_PATIENT if you’re +willing to wait even longer for a possibly even faster plan (see FFTW Reference). + +You can also save plans for future use, as described by Words of Wisdom-Saving Plans. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-numbers.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-numbers.html new file mode 100644 index 000000000..6ba9e8e6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Complex-numbers.html @@ -0,0 +1,125 @@ + + + + + +FFTW 3.3.8: Complex numbers + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.1.1 Complex numbers

    + +

    The default FFTW interface uses double precision for all +floating-point numbers, and defines a fftw_complex type to hold +complex numbers as: +

    +
    +
    typedef double fftw_complex[2];
    +
    + + +

    Here, the [0] element holds the real part and the [1] +element holds the imaginary part. +

    +

    Alternatively, if you have a C compiler (such as gcc) that +supports the C99 revision of the ANSI C standard, you can use C’s new +native complex type (which is binary-compatible with the typedef above). +In particular, if you #include <complex.h> before +<fftw3.h>, then fftw_complex is defined to be the native +complex type and you can manipulate it with ordinary arithmetic +(e.g. x = y * (3+4*I), where x and y are +fftw_complex and I is the standard symbol for the +imaginary unit); + +

    + +

    C++ has its own complex<T> template class, defined in the +standard <complex> header file. Reportedly, the C++ standards +committee has recently agreed to mandate that the storage format used +for this type be binary-compatible with the C99 type, i.e. an array +T[2] with consecutive real [0] and imaginary [1] +parts. (See report +http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2002/n1388.pdf +WG21/N1388.) Although not part of the official standard as of this +writing, the proposal stated that: “This solution has been tested with +all current major implementations of the standard library and shown to +be working.” To the extent that this is true, if you have a variable +complex<double> *x, you can pass it directly to FFTW via +reinterpret_cast<fftw_complex*>(x). + + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Concept-Index.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Concept-Index.html new file mode 100644 index 000000000..3154866f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Concept-Index.html @@ -0,0 +1,528 @@ + + + + + +FFTW 3.3.8: Concept Index + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    13 Concept Index

    +
    Jump to:   6 +   +
    +A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +K +   +L +   +M +   +N +   +O +   +P +   +R +   +S +   +T +   +V +   +W +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    6
    64-bit architecture: 64-bit Guru Interface
    64-bit architecture: 2d MPI example
    64-bit architecture: FFTW Fortran type reference

    A
    advanced interface: Introduction
    advanced interface: Complex Multi-Dimensional DFTs
    advanced interface: Row-major Format
    advanced interface: Advanced Interface
    advanced interface: Basic and advanced distribution interfaces
    advanced interface: MPI Data Distribution Functions
    advanced interface: MPI Plan Creation
    algorithm: Introduction
    alignment: Memory Allocation
    alignment: Planner Flags
    alignment: New-array Execute Functions
    alignment: Using MPI Plans
    alignment: Overview of Fortran interface
    alignment: Allocating aligned memory in Fortran
    AltiVec: SIMD alignment and fftw_malloc
    AVX: SIMD alignment and fftw_malloc
    AVX2: SIMD alignment and fftw_malloc
    AVX512: SIMD alignment and fftw_malloc

    B
    basic interface: Introduction
    basic interface: Tutorial
    basic interface: Basic Interface
    block distribution: MPI Data Distribution
    block distribution: Basic and advanced distribution interfaces
    block distribution: FFTW MPI Performance Tips

    C
    C multi-dimensional arrays: Fixed-size Arrays in C
    C++: Complex One-Dimensional DFTs
    C++: SIMD alignment and fftw_malloc
    C++: Dynamic Arrays in C
    C++: Complex numbers
    C++: Memory Allocation
    c2r: One-Dimensional DFTs of Real Data
    c2r: Planner Flags
    c2r: Real-data DFTs
    C99: Dynamic Arrays in C
    C99: Complex numbers
    C99: Precision
    Caml: Generating your own code
    Caml: Acknowledgments
    code generator: Introduction
    code generator: Generating your own code
    codelet: Introduction
    codelet: Installation and Customization
    codelet: Generating your own code
    codelet: Acknowledgments
    collective function: 2d MPI example
    collective function: FFTW MPI Wisdom
    collective function: Avoiding MPI Deadlocks
    collective function: Using MPI Plans
    collective function: MPI Plan Creation
    column-major: Column-major Format
    column-major: Reversing array dimensions
    column-major: Fortran-interface routines
    column-major: Fortran Examples
    compiler: Introduction
    compiler: Installation and Customization
    compiler: Installation on Unix
    compiler: Cycle Counters
    compiler flags: Installation on Unix
    compiler flags: Installation on Unix
    configuration routines: Wisdom Utilities
    configure: Installation and Supported Hardware/Software
    configure: FFTW MPI Installation
    configure: Installation on Unix
    cycle counter: Installation and Customization
    cycle counter: Cycle Counters

    D
    data distribution: Distributed-memory FFTW with MPI
    data distribution: 2d MPI example
    data distribution: MPI Data Distribution
    data distribution: Multi-dimensional MPI DFTs of Real Data
    data distribution: Basic distributed-transpose interface
    data distribution: MPI Data Distribution Functions
    DCT: Real even/odd DFTs (cosine/sine transforms)
    DCT: Real-to-Real Transform Kinds
    DCT: 1d Real-even DFTs (DCTs)
    deadlock: Avoiding MPI Deadlocks
    Devil: Complex One-Dimensional DFTs
    DFT: Introduction
    DFT: Complex One-Dimensional DFTs
    DFT: The 1d Discrete Fourier Transform (DFT)
    DHT: The Discrete Hartley Transform
    DHT: 1d Discrete Hartley Transforms (DHTs)
    discrete cosine transform: Real even/odd DFTs (cosine/sine transforms)
    discrete cosine transform: Real-to-Real Transform Kinds
    discrete cosine transform: 1d Real-even DFTs (DCTs)
    discrete Fourier transform: Introduction
    discrete Fourier transform: The 1d Discrete Fourier Transform (DFT)
    discrete Hartley transform: The Discrete Hartley Transform
    discrete Hartley transform: Real-to-Real Transform Kinds
    discrete Hartley transform: 1d Discrete Hartley Transforms (DHTs)
    discrete sine transform: Real even/odd DFTs (cosine/sine transforms)
    discrete sine transform: Real-to-Real Transform Kinds
    discrete sine transform: 1d Real-odd DFTs (DSTs)
    dist: Advanced Complex DFTs
    dist: Guru vector and transform sizes
    DST: Real even/odd DFTs (cosine/sine transforms)
    DST: Real-to-Real Transform Kinds
    DST: 1d Real-odd DFTs (DSTs)

    E
    Ecclesiastes: Caveats in Using Wisdom
    execute: Introduction
    execute: Complex One-Dimensional DFTs
    execute: New-array Execute Functions

    F
    FFTW: Introduction
    fftw-wisdom utility: Caveats in Using Wisdom
    fftw-wisdom utility: Wisdom Utilities
    fftw-wisdom-to-conf utility: Wisdom Utilities
    flags: Complex One-Dimensional DFTs
    flags: One-Dimensional DFTs of Real Data
    flags: Complex DFTs
    flags: Real-data DFTs
    flags: Real-to-Real Transforms
    flags: Guru Complex DFTs
    flags: Guru Real-data DFTs
    flags: Guru Real-to-real Transforms
    flags: Overview of Fortran interface
    flags: FFTW Constants in Fortran
    Fortran interface: Column-major Format
    Fortran interface: FFTW MPI Fortran Interface
    Fortran interface: Calling FFTW from Modern Fortran
    Fortran interface: Calling FFTW from Legacy Fortran
    Fortran-callable wrappers: Installation on Unix
    frequency: Complex One-Dimensional DFTs
    frequency: The 1d Discrete Fourier Transform (DFT)

    G
    g77: Installation on Unix
    guru interface: Introduction
    guru interface: Complex Multi-Dimensional DFTs
    guru interface: Guru Interface
    guru interface: FFTW Fortran type reference
    guru interface: Fortran-interface routines

    H
    halfcomplex format: One-Dimensional DFTs of Real Data
    halfcomplex format: The Halfcomplex-format DFT
    halfcomplex format: The 1d Real-data DFT
    hc2r: The Halfcomplex-format DFT
    hc2r: Planner Flags
    HDF5: 2d MPI example
    Hermitian: One-Dimensional DFTs of Real Data
    Hermitian: The 1d Real-data DFT
    howmany loop: Guru vector and transform sizes
    howmany parameter: Advanced Complex DFTs

    I
    IDCT: Real even/odd DFTs (cosine/sine transforms)
    IDCT: Real even/odd DFTs (cosine/sine transforms)
    IDCT: Real-to-Real Transform Kinds
    IDCT: 1d Real-even DFTs (DCTs)
    in-place: Complex One-Dimensional DFTs
    in-place: One-Dimensional DFTs of Real Data
    in-place: Complex DFTs
    in-place: Real-data DFTs
    in-place: Real-data DFT Array Format
    in-place: Real-to-Real Transforms
    in-place: Guru Real-data DFTs
    in-place: Guru Real-data DFTs
    in-place: An improved replacement for MPI_Alltoall
    in-place: Reversing array dimensions
    in-place: FFTW Fortran type reference
    installation: Installation and Customization
    interleaved format: Interleaved and split arrays
    iso_c_binding: FFTW MPI Fortran Interface
    iso_c_binding: Overview of Fortran interface
    iso_c_binding: Extended and quadruple precision in Fortran

    K
    kind (r2r): More DFTs of Real Data
    kind (r2r): Real-to-Real Transform Kinds

    L
    linking on Unix: Usage of Multi-threaded FFTW
    linking on Unix: Linking and Initializing MPI FFTW
    LISP: Acknowledgments
    load balancing: Load balancing
    load balancing: FFTW MPI Performance Tips

    M
    monadic programming: Generating your own code
    MPI: Distributed-memory FFTW with MPI
    MPI: Installation on Unix
    MPI communicator: Distributed-memory FFTW with MPI
    MPI communicator: Using MPI Plans
    MPI communicator: MPI Plan Creation
    MPI communicator: FFTW MPI Fortran Interface
    MPI I/O: 2d MPI example
    MPI I/O: FFTW MPI Wisdom
    mpicc: FFTW MPI Installation
    mpicc: Linking and Initializing MPI FFTW

    N
    new-array execution: New-array Execute Functions
    new-array execution: Using MPI Plans
    new-array execution: MPI Plan Creation
    new-array execution: FFTW MPI Fortran Interface
    normalization: Complex One-Dimensional DFTs
    normalization: Multi-Dimensional DFTs of Real Data
    normalization: The Halfcomplex-format DFT
    normalization: Real even/odd DFTs (cosine/sine transforms)
    normalization: The Discrete Hartley Transform
    normalization: Complex DFTs
    normalization: Real-data DFTs
    normalization: Real-to-Real Transform Kinds
    normalization: The 1d Discrete Fourier Transform (DFT)
    normalization: The 1d Real-data DFT
    normalization: 1d Real-even DFTs (DCTs)
    normalization: 1d Real-odd DFTs (DSTs)
    normalization: 1d Discrete Hartley Transforms (DHTs)
    number of threads: How Many Threads to Use?

    O
    OpenMP: Installation and Supported Hardware/Software
    OpenMP: Usage of Multi-threaded FFTW
    OpenMP: Usage of Multi-threaded FFTW
    OpenMP: Thread safety
    out-of-place: Planner Flags
    out-of-place: Real-data DFT Array Format

    P
    padding: One-Dimensional DFTs of Real Data
    padding: Multi-Dimensional DFTs of Real Data
    padding: Real-data DFTs
    padding: Real-data DFT Array Format
    padding: Multi-dimensional MPI DFTs of Real Data
    padding: Reversing array dimensions
    parallel transform: Multi-threaded FFTW
    parallel transform: Distributed-memory FFTW with MPI
    partial order: Complex Multi-Dimensional DFTs
    plan: Introduction
    plan: Complex One-Dimensional DFTs
    planner: Introduction
    portability: SIMD alignment and fftw_malloc
    portability: Caveats in Using Wisdom
    portability: Complex numbers
    portability: Installation and Supported Hardware/Software
    portability: Calling FFTW from Modern Fortran
    portability: FFTW Fortran type reference
    portability: Fortran-interface routines
    portability: Fortran-interface routines
    portability: Wisdom of Fortran?
    portability: Installation and Customization
    precision: Complex One-Dimensional DFTs
    precision: One-Dimensional DFTs of Real Data
    precision: SIMD alignment and fftw_malloc
    precision: Precision
    precision: Memory Allocation
    precision: Linking and Initializing MPI FFTW
    precision: MPI Files and Data Types
    precision: Extended and quadruple precision in Fortran
    precision: FFTW Fortran type reference
    precision: Installation on Unix
    precision: Installation on Unix
    precision: Installation on Unix

    R
    r2c: One-Dimensional DFTs of Real Data
    r2c: The Halfcomplex-format DFT
    r2c: Real-data DFTs
    r2c: Multi-dimensional Transforms
    r2c: MPI Plan Creation
    r2c/c2r multi-dimensional array format: Multi-Dimensional DFTs of Real Data
    r2c/c2r multi-dimensional array format: Real-data DFT Array Format
    r2c/c2r multi-dimensional array format: Reversing array dimensions
    r2c/c2r multi-dimensional array format: Fortran Examples
    r2hc: The Halfcomplex-format DFT
    r2r: More DFTs of Real Data
    r2r: Real-to-Real Transforms
    r2r: The 1d Real-data DFT
    r2r: Other Multi-dimensional Real-data MPI Transforms
    r2r: MPI Plan Creation
    rank: Complex Multi-Dimensional DFTs
    real-even DFT: Real even/odd DFTs (cosine/sine transforms)
    real-even DFT: 1d Real-even DFTs (DCTs)
    real-odd DFT: Real even/odd DFTs (cosine/sine transforms)
    real-odd DFT: 1d Real-odd DFTs (DSTs)
    REDFT: Real even/odd DFTs (cosine/sine transforms)
    REDFT: 1d Real-even DFTs (DCTs)
    REDFT: Generating your own code
    RODFT: Real even/odd DFTs (cosine/sine transforms)
    RODFT: 1d Real-odd DFTs (DSTs)
    row-major: Row-major Format
    row-major: Complex DFTs
    row-major: Real-to-Real Transforms
    row-major: Guru vector and transform sizes
    row-major: Basic and advanced distribution interfaces
    row-major: Multi-dimensional MPI DFTs of Real Data
    row-major: Reversing array dimensions

    S
    saving plans to disk: Words of Wisdom-Saving Plans
    saving plans to disk: Wisdom
    saving plans to disk: FFTW MPI Wisdom
    saving plans to disk: Accessing the wisdom API from Fortran
    shared-memory: Multi-threaded FFTW
    SIMD: Complex One-Dimensional DFTs
    SIMD: SIMD alignment and fftw_malloc
    SIMD: Overview of Fortran interface
    split format: Interleaved and split arrays
    SSE: SIMD alignment and fftw_malloc
    SSE2: SIMD alignment and fftw_malloc
    stride: Row-major Format
    stride: Advanced Complex DFTs
    stride: Guru vector and transform sizes
    stride: MPI Plan Creation

    T
    thread safety: Usage of Multi-threaded FFTW
    thread safety: Thread safety
    thread safety: Combining MPI and Threads
    threads: Multi-threaded FFTW
    threads: Thread safety
    threads: Combining MPI and Threads
    threads: Installation on Unix
    transpose: Transposed distributions
    transpose: Multi-dimensional MPI DFTs of Real Data
    transpose: FFTW MPI Transposes
    transpose: FFTW MPI Performance Tips
    transpose: Combining MPI and Threads
    transpose: MPI Plan Creation

    V
    vector: Guru Interface
    VSX: SIMD alignment and fftw_malloc

    W
    wisdom: Words of Wisdom-Saving Plans
    wisdom: Wisdom
    wisdom: FFTW MPI Wisdom
    wisdom: Accessing the wisdom API from Fortran
    wisdom, problems with: Caveats in Using Wisdom
    wisdom, system-wide: Caveats in Using Wisdom
    wisdom, system-wide: Wisdom Import

    +
    Jump to:   6 +   +
    +A +   +B +   +C +   +D +   +E +   +F +   +G +   +H +   +I +   +K +   +L +   +M +   +N +   +O +   +P +   +R +   +S +   +T +   +V +   +W +   +
    +
    +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Cycle-Counters.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Cycle-Counters.html new file mode 100644 index 000000000..607beb432 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Cycle-Counters.html @@ -0,0 +1,120 @@ + + + + + +FFTW 3.3.8: Cycle Counters + + + + + + + + + + + + + + + + + + + + + +
    + +

    10.3 Cycle Counters

    + + +

    FFTW’s planner actually executes and times different possible FFT +algorithms in order to pick the fastest plan for a given n. In +order to do this in as short a time as possible, however, the timer must +have a very high resolution, and to accomplish this we employ the +hardware cycle counters that are available on most CPUs. +Currently, FFTW supports the cycle counters on x86, PowerPC/POWER, Alpha, +UltraSPARC (SPARC v9), IA64, PA-RISC, and MIPS processors. +

    + +

    Access to the cycle counters, unfortunately, is a compiler and/or +operating-system dependent task, often requiring inline assembly +language, and it may be that your compiler is not supported. If you are +not supported, FFTW will by default fall back on its estimator +(effectively using FFTW_ESTIMATE for all plans). + +

    +

    You can add support by editing the file kernel/cycle.h; normally, +this will involve adapting one of the examples already present in order +to use the inline-assembler syntax for your C compiler, and will only +require a couple of lines of code. Anyone adding support for a new +system to cycle.h is encouraged to email us at fftw@fftw.org. +

    +

    If a cycle counter is not available on your system (e.g. some embedded +processor), and you don’t want to use estimated plans, as a last resort +you can use the --with-slow-timer option to configure (on +Unix) or #define WITH_SLOW_TIMER in config.h (elsewhere). +This will use the much lower-resolution gettimeofday function, or even +clock if the former is unavailable, and planning will be +extremely slow. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Data-Types-and-Files.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Data-Types-and-Files.html new file mode 100644 index 000000000..72b788d31 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Data-Types-and-Files.html @@ -0,0 +1,102 @@ + + + + + +FFTW 3.3.8: Data Types and Files + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: FFTW Reference   [Contents][Index]

    +
    +
    + +

    4.1 Data Types and Files

    + +

    All programs using FFTW should include its header file: +

    +
    +
    #include <fftw3.h>
    +
    + +

    You must also link to the FFTW library. On Unix, this +means adding -lfftw3 -lm at the end of the link command. +

    + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Defining-an-FFTW-module.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Defining-an-FFTW-module.html new file mode 100644 index 000000000..1c3061ce6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Defining-an-FFTW-module.html @@ -0,0 +1,110 @@ + + + + + +FFTW 3.3.8: Defining an FFTW module + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.7 Defining an FFTW module

    + +

    Rather than using the include statement to include the +fftw3.f03 interface file in any subroutine where you want to +use FFTW, you might prefer to define an FFTW Fortran module. FFTW +does not install itself as a module, primarily because +fftw3.f03 can be shared between different Fortran compilers while +modules (in general) cannot. However, it is trivial to define your +own FFTW module if you want. Just create a file containing: +

    +
    +
      module FFTW3
    +    use, intrinsic :: iso_c_binding
    +    include 'fftw3.f03'
    +  end module
    +
    + +

    Compile this file into a module as usual for your compiler (e.g. with +gfortran -c you will get a file fftw3.mod). Now, +instead of include 'fftw3.f03', whenever you want to use FFTW +routines you can just do: +

    +
    +
      use FFTW3
    +
    + +

    as usual for Fortran modules. (You still need to link to the FFTW +library, of course.) +

    + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Distributed_002dmemory-FFTW-with-MPI.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Distributed_002dmemory-FFTW-with-MPI.html new file mode 100644 index 000000000..d4c9d21ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Distributed_002dmemory-FFTW-with-MPI.html @@ -0,0 +1,161 @@ + + + + + +FFTW 3.3.8: Distributed-memory FFTW with MPI + + + + + + + + + + + + + + + + + + + + + +
    + +

    6 Distributed-memory FFTW with MPI

    + + + +

    In this chapter we document the parallel FFTW routines for parallel +systems supporting the MPI message-passing interface. Unlike the +shared-memory threads described in the previous chapter, MPI allows +you to use distributed-memory parallelism, where each CPU has +its own separate memory, and which can scale up to clusters of many +thousands of processors. This capability comes at a price, however: +each process only stores a portion of the data to be +transformed, which means that the data structures and +programming-interface are quite different from the serial or threads +versions of FFTW. + +

    + +

    Distributed-memory parallelism is especially useful when you are +transforming arrays so large that they do not fit into the memory of a +single processor. The storage per-process required by FFTW’s MPI +routines is proportional to the total array size divided by the number +of processes. Conversely, distributed-memory parallelism can easily +pose an unacceptably high communications overhead for small problems; +the threshold problem size for which parallelism becomes advantageous +will depend on the precise problem you are interested in, your +hardware, and your MPI implementation. +

    +

    A note on terminology: in MPI, you divide the data among a set of +“processes” which each run in their own memory address space. +Generally, each process runs on a different physical processor, but +this is not required. A set of processes in MPI is described by an +opaque data structure called a “communicator,” the most common of +which is the predefined communicator MPI_COMM_WORLD which +refers to all processes. For more information on these and +other concepts common to all MPI programs, we refer the reader to the +documentation at the MPI home +page. + + +

    + +

    We assume in this chapter that the reader is familiar with the usage +of the serial (uniprocessor) FFTW, and focus only on the concepts new +to the MPI interface. +

    + + + + + + + + + + + + + + + + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Dynamic-Arrays-in-C.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Dynamic-Arrays-in-C.html new file mode 100644 index 000000000..923f7dc16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Dynamic-Arrays-in-C.html @@ -0,0 +1,119 @@ + + + + + +FFTW 3.3.8: Dynamic Arrays in C + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.2.4 Dynamic Arrays in C

    + +

    We recommend allocating most arrays dynamically, with +fftw_malloc. This isn’t too hard to do, although it is not as +straightforward for multi-dimensional arrays as it is for +one-dimensional arrays. +

    +

    Creating the array is simple: using a dynamic-allocation routine like +fftw_malloc, allocate an array big enough to store N +fftw_complex values (for a complex DFT), where N is the product +of the sizes of the array dimensions (i.e. the total number of complex +values in the array). For example, here is code to allocate a +5 × 12 × 27 + rank-3 array: + +

    +
    +
    fftw_complex *an_array;
    +an_array = (fftw_complex*) fftw_malloc(5*12*27 * sizeof(fftw_complex));
    +
    + +

    Accessing the array elements, however, is more tricky—you can’t +simply use multiple applications of the ‘[]’ operator like you +could for fixed-size arrays. Instead, you have to explicitly compute +the offset into the array using the formula given earlier for +row-major arrays. For example, to reference the (i,j,k)-th +element of the array allocated above, you would use the expression +an_array[k + 27 * (j + 12 * i)]. +

    +

    This pain can be alleviated somewhat by defining appropriate macros, +or, in C++, creating a class and overloading the ‘()’ operator. +The recent C99 standard provides a way to reinterpret the dynamic +array as a “variable-length” multi-dimensional array amenable to +‘[]’, but this feature is not yet widely supported by compilers. + + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Dynamic-Arrays-in-C_002dThe-Wrong-Way.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Dynamic-Arrays-in-C_002dThe-Wrong-Way.html new file mode 100644 index 000000000..ca96ae25c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Dynamic-Arrays-in-C_002dThe-Wrong-Way.html @@ -0,0 +1,119 @@ + + + + + +FFTW 3.3.8: Dynamic Arrays in C-The Wrong Way + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.2.5 Dynamic Arrays in C—The Wrong Way

    + +

    A different method for allocating multi-dimensional arrays in C is +often suggested that is incompatible with FFTW: using it will +cause FFTW to die a painful death. We discuss the technique here, +however, because it is so commonly known and used. This method is to +create arrays of pointers of arrays of pointers of …etcetera. +For example, the analogue in this method to the example above is: +

    +
    +
    int i,j;
    +fftw_complex ***a_bad_array;  /* another way to make a 5x12x27 array */
    +
    +a_bad_array = (fftw_complex ***) malloc(5 * sizeof(fftw_complex **));
    +for (i = 0; i < 5; ++i) {
    +     a_bad_array[i] = 
    +        (fftw_complex **) malloc(12 * sizeof(fftw_complex *));
    +     for (j = 0; j < 12; ++j)
    +          a_bad_array[i][j] =
    +                (fftw_complex *) malloc(27 * sizeof(fftw_complex));
    +}
    +
    + +

    As you can see, this sort of array is inconvenient to allocate (and +deallocate). On the other hand, it has the advantage that the +(i,j,k)-th element can be referenced simply by +a_bad_array[i][j][k]. +

    +

    If you like this technique and want to maximize convenience in accessing +the array, but still want to pass the array to FFTW, you can use a +hybrid method. Allocate the array as one contiguous block, but also +declare an array of arrays of pointers that point to appropriate places +in the block. That sort of trick is beyond the scope of this +documentation; for more information on multi-dimensional arrays in C, +see the comp.lang.c +FAQ. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Extended-and-quadruple-precision-in-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Extended-and-quadruple-precision-in-Fortran.html new file mode 100644 index 000000000..0a473bd39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Extended-and-quadruple-precision-in-Fortran.html @@ -0,0 +1,113 @@ + + + + + +FFTW 3.3.8: Extended and quadruple precision in Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.1.1 Extended and quadruple precision in Fortran

    + + +

    If FFTW is compiled in long double (extended) precision +(see Installation and Customization), you may be able to call the +resulting fftwl_ routines (see Precision) from Fortran if +your compiler supports the C_LONG_DOUBLE_COMPLEX type code. +

    +

    Because some Fortran compilers do not support +C_LONG_DOUBLE_COMPLEX, the fftwl_ declarations are +segregated into a separate interface file fftw3l.f03, which you +should include in addition to fftw3.f03 (which declares +precision-independent ‘FFTW_’ constants): +

    + +
    +
      use, intrinsic :: iso_c_binding 
    +  include 'fftw3.f03'
    +  include 'fftw3l.f03'
    +
    + +

    We also support using the nonstandard __float128 +quadruple-precision type provided by recent versions of gcc on +32- and 64-bit x86 hardware (see Installation and Customization), +using the corresponding real(16) and complex(16) types +supported by gfortran. The quadruple-precision ‘fftwq_’ +functions (see Precision) are declared in a fftw3q.f03 +interface file, which should be included in addition to +fftw3l.f03, as above. You should also link with +-lfftw3q -lquadmath -lm as in C. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Constants-in-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Constants-in-Fortran.html new file mode 100644 index 000000000..35a399bc8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Constants-in-Fortran.html @@ -0,0 +1,104 @@ + + + + + +FFTW 3.3.8: FFTW Constants in Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    8.2 FFTW Constants in Fortran

    + +

    When creating plans in FFTW, a number of constants are used to specify +options, such as FFTW_MEASURE or FFTW_ESTIMATE. The +same constants must be used with the wrapper routines, but of course the +C header files where the constants are defined can’t be incorporated +directly into Fortran code. +

    +

    Instead, we have placed Fortran equivalents of the FFTW constant +definitions in the file fftw3.f, which can be found in the same +directory as fftw3.h. If your Fortran compiler supports a +preprocessor of some sort, you should be able to include or +#include this file; otherwise, you can paste it directly into +your code. +

    + +

    In C, you combine different flags (like FFTW_PRESERVE_INPUT and +FFTW_MEASURE) using the ‘|’ operator; in Fortran +you should just use ‘+’. (Take care not to add in the +same flag more than once, though. Alternatively, you can use the +ior intrinsic function standardized in Fortran 95.) +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Execution-in-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Execution-in-Fortran.html new file mode 100644 index 000000000..40ca5d0b0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Execution-in-Fortran.html @@ -0,0 +1,145 @@ + + + + + +FFTW 3.3.8: FFTW Execution in Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    8.3 FFTW Execution in Fortran

    + +

    In C, in order to use a plan, one normally calls fftw_execute, +which executes the plan to perform the transform on the input/output +arrays passed when the plan was created (see Using Plans). The +corresponding subroutine call in legacy Fortran is: +

    +
            call dfftw_execute(plan)
    +
    + + +

    However, we have had reports that this causes problems with some +recent optimizing Fortran compilers. The problem is, because the +input/output arrays are not passed as explicit arguments to +dfftw_execute, the semantics of Fortran (unlike C) allow the +compiler to assume that the input/output arrays are not changed by +dfftw_execute. As a consequence, certain compilers end up +optimizing out or repositioning the call to dfftw_execute, +assuming incorrectly that it does nothing. +

    +

    There are various workarounds to this, but the safest and simplest +thing is to not use dfftw_execute in Fortran. Instead, use the +functions described in New-array Execute Functions, which take +the input/output arrays as explicit arguments. For example, if the +plan is for a complex-data DFT and was created for the arrays +in and out, you would do: +

    +
            call dfftw_execute_dft(plan, in, out)
    +
    + + +

    There are a few things to be careful of, however: +

    +
      +
    • You must use the correct type of execute function, matching the way +the plan was created. Complex DFT plans should use +dfftw_execute_dft, Real-input (r2c) DFT plans should use use +dfftw_execute_dft_r2c, and real-output (c2r) DFT plans should +use dfftw_execute_dft_c2r. The various r2r plans should use +dfftw_execute_r2r. + +
    • You should normally pass the same input/output arrays that were used when +creating the plan. This is always safe. + +
    • If you pass different input/output arrays compared to +those used when creating the plan, you must abide by all the +restrictions of the new-array execute functions (see New-array Execute Functions). The most difficult of these, in Fortran, is the +requirement that the new arrays have the same alignment as the +original arrays, because there seems to be no way in legacy Fortran to obtain +guaranteed-aligned arrays (analogous to fftw_malloc in C). You +can, of course, use the FFTW_UNALIGNED flag when creating the +plan, in which case the plan does not depend on the alignment, but +this may sacrifice substantial performance on architectures (like x86) +with SIMD instructions (see SIMD alignment and fftw_malloc). + + +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Fortran-type-reference.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Fortran-type-reference.html new file mode 100644 index 000000000..6a59751c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Fortran-type-reference.html @@ -0,0 +1,184 @@ + + + + + +FFTW 3.3.8: FFTW Fortran type reference + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.3 FFTW Fortran type reference

    + +

    The following are the most important type correspondences between the +C interface and Fortran: +

    +
      +
    • +Plans (fftw_plan and variants) are type(C_PTR) (i.e. an +opaque pointer). + +
    • + + + + + + + +The C floating-point types double, float, and long +double correspond to real(C_DOUBLE), real(C_FLOAT), and +real(C_LONG_DOUBLE), respectively. The C complex types +fftw_complex, fftwf_complex, and fftwl_complex +correspond in Fortran to complex(C_DOUBLE_COMPLEX), +complex(C_FLOAT_COMPLEX), and +complex(C_LONG_DOUBLE_COMPLEX), respectively. +Just as in C +(see Precision), the FFTW subroutines and types are prefixed with +‘fftw_’, fftwf_, and fftwl_ for the different precisions, and link to different libraries (-lfftw3, -lfftw3f, and -lfftw3l on Unix), but use the same include file fftw3.f03 and the same constants (all of which begin with ‘FFTW_’). The exception is long double precision, for which you should also include fftw3l.f03 (see Extended and quadruple precision in Fortran). + +
    • + + + + +The C integer types int and unsigned (used for planner +flags) become integer(C_INT). The C integer type ptrdiff_t (e.g. in the 64-bit Guru Interface) becomes integer(C_INTPTR_T), and size_t (in fftw_malloc etc.) becomes integer(C_SIZE_T). + +
    • + +The fftw_r2r_kind type (see Real-to-Real Transform Kinds) +becomes integer(C_FFTW_R2R_KIND). The various constant values +of the C enumerated type (FFTW_R2HC etc.) become simply integer +constants of the same names in Fortran. + +
    • + + +Numeric array pointer arguments (e.g. double *) +become dimension(*), intent(out) arrays of the same type, or +dimension(*), intent(in) if they are pointers to constant data +(e.g. const int *). There are a few exceptions where numeric +pointers refer to scalar outputs (e.g. for fftw_flops), in which +case they are intent(out) scalar arguments in Fortran too. +For the new-array execute functions (see New-array Execute Functions), +the input arrays are declared dimension(*), intent(inout), since +they can be modified in the case of in-place or FFTW_DESTROY_INPUT +transforms. + +
    • + +Pointer return values (e.g double *) become +type(C_PTR). (If they are pointers to arrays, as for +fftw_alloc_real, you can convert them back to Fortran array +pointers with the standard intrinsic function c_f_pointer.) + +
    • + + + +The fftw_iodim type in the guru interface (see Guru vector and transform sizes) becomes type(fftw_iodim) in Fortran, a +derived data type (the Fortran analogue of C’s struct) with +three integer(C_INT) components: n, is, and +os, with the same meanings as in C. The fftw_iodim64 type in the 64-bit guru interface (see 64-bit Guru Interface) is the same, except that its components are of type integer(C_INTPTR_T). + +
    • +Using the wisdom import/export functions from Fortran is a bit tricky, +and is discussed in Accessing the wisdom API from Fortran. In +brief, the FILE * arguments map to type(C_PTR), const char * to character(C_CHAR), dimension(*), intent(in) (null-terminated!), and the generic read-char/write-char functions map to type(C_FUNPTR). + +
    + + +

    You may be wondering if you need to search-and-replace +real(kind(0.0d0)) (or whatever your favorite Fortran spelling +of “double precision” is) with real(C_DOUBLE) everywhere in +your program, and similarly for complex and integer +types. The answer is no; you can still use your existing types. As +long as these types match their C counterparts, things should work +without a hitch. The worst that can happen, e.g. in the (unlikely) +event of a system where real(kind(0.0d0)) is different from +real(C_DOUBLE), is that the compiler will give you a +type-mismatch error. That is, if you don’t use the +iso_c_binding kinds you need to accept at least the theoretical +possibility of having to change your code in response to compiler +errors on some future machine, but you don’t need to worry about +silently compiling incorrect code that yields runtime errors. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Fortran-Interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Fortran-Interface.html new file mode 100644 index 000000000..87f06b688 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Fortran-Interface.html @@ -0,0 +1,237 @@ + + + + + +FFTW 3.3.8: FFTW MPI Fortran Interface + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.13 FFTW MPI Fortran Interface

    + + + +

    The FFTW MPI interface is callable from modern Fortran compilers +supporting the Fortran 2003 iso_c_binding standard for calling +C functions. As described in Calling FFTW from Modern Fortran, +this means that you can directly call FFTW’s C interface from Fortran +with only minor changes in syntax. There are, however, a few things +specific to the MPI interface to keep in mind: +

    +
      +
    • Instead of including fftw3.f03 as in Overview of Fortran interface, you should include 'fftw3-mpi.f03' (after +use, intrinsic :: iso_c_binding as before). The +fftw3-mpi.f03 file includes fftw3.f03, so you should +not include them both yourself. (You will also want to +include the MPI header file, usually via include 'mpif.h' or +similar, although though this is not needed by fftw3-mpi.f03 +per se.) (To use the ‘fftwl_long double extended-precision routines in supporting compilers, you should include fftw3f-mpi.f03 in addition to fftw3-mpi.f03. See Extended and quadruple precision in Fortran.) + +
    • Because of the different storage conventions between C and Fortran, +you reverse the order of your array dimensions when passing them to +FFTW (see Reversing array dimensions). This is merely a +difference in notation and incurs no performance overhead. However, +it means that, whereas in C the first dimension is distributed, +in Fortran the last dimension of your array is distributed. + +
    • +In Fortran, communicators are stored as integer types; there is +no MPI_Comm type, nor is there any way to access a C +MPI_Comm. Fortunately, this is taken care of for you by the +FFTW Fortran interface: whenever the C interface expects an +MPI_Comm type, you should pass the Fortran communicator as an +integer.8 + +
    • Because you need to call the ‘local_size’ function to find out +how much space to allocate, and this may be larger than the +local portion of the array (see MPI Data Distribution), you should +always allocate your arrays dynamically using FFTW’s allocation +routines as described in Allocating aligned memory in Fortran. +(Coincidentally, this also provides the best performance by +guaranteeding proper data alignment.) + +
    • Because all sizes in the MPI FFTW interface are declared as +ptrdiff_t in C, you should use integer(C_INTPTR_T) in +Fortran (see FFTW Fortran type reference). + +
    • + + +In Fortran, because of the language semantics, we generally recommend +using the new-array execute functions for all plans, even in the +common case where you are executing the plan on the same arrays for +which the plan was created (see Plan execution in Fortran). +However, note that in the MPI interface these functions are changed: +fftw_execute_dft becomes fftw_mpi_execute_dft, +etcetera. See Using MPI Plans. + +
    + +

    For example, here is a Fortran code snippet to perform a distributed +L × M + complex DFT in-place. (This assumes you have already +initialized MPI with MPI_init and have also performed +call fftw_mpi_init.) +

    +
    +
      use, intrinsic :: iso_c_binding
    +  include 'fftw3-mpi.f03'
    +  integer(C_INTPTR_T), parameter :: L = ...
    +  integer(C_INTPTR_T), parameter :: M = ...
    +  type(C_PTR) :: plan, cdata
    +  complex(C_DOUBLE_COMPLEX), pointer :: data(:,:)
    +  integer(C_INTPTR_T) :: i, j, alloc_local, local_M, local_j_offset
    +
    +!   get local data size and allocate (note dimension reversal)
    +  alloc_local = fftw_mpi_local_size_2d(M, L, MPI_COMM_WORLD, &
    +                                       local_M, local_j_offset)
    +  cdata = fftw_alloc_complex(alloc_local)
    +  call c_f_pointer(cdata, data, [L,local_M])
    +
    +!   create MPI plan for in-place forward DFT (note dimension reversal)
    +  plan = fftw_mpi_plan_dft_2d(M, L, data, data, MPI_COMM_WORLD, &
    +                              FFTW_FORWARD, FFTW_MEASURE)
    +
    +! initialize data to some function my_function(i,j)
    +  do j = 1, local_M
    +    do i = 1, L
    +      data(i, j) = my_function(i, j + local_j_offset)
    +    end do
    +  end do
    +
    +! compute transform (as many times as desired)
    +  call fftw_mpi_execute_dft(plan, data, data)
    +
    +  call fftw_destroy_plan(plan)
    +  call fftw_free(cdata)
    +
    + +

    Note that when we called fftw_mpi_local_size_2d and +fftw_mpi_plan_dft_2d with the dimensions in reversed order, +since a L × M + Fortran array is viewed by FFTW in C as a +M × L + array. This means that the array was distributed over +the M dimension, the local portion of which is a +L × local_M + array in Fortran. (You must not use an +allocate statement to allocate an L × local_M + array, +however; you must allocate alloc_local complex numbers, which +may be greater than L * local_M, in order to reserve space for +intermediate steps of the transform.) Finally, we mention that +because C’s array indices are zero-based, the local_j_offset +argument can conveniently be interpreted as an offset in the 1-based +j index (rather than as a starting index as in C). +

    +

    If instead you had used the ior(FFTW_MEASURE, +FFTW_MPI_TRANSPOSED_OUT) flag, the output of the transform would be a +transposed M × local_L + array, associated with the same +cdata allocation (since the transform is in-place), and which +you could declare with: +

    +
    +
      complex(C_DOUBLE_COMPLEX), pointer :: tdata(:,:)
    +  ...
    +  call c_f_pointer(cdata, tdata, [M,local_L])
    +
    + +

    where local_L would have been obtained by changing the +fftw_mpi_local_size_2d call to: +

    +
    +
      alloc_local = fftw_mpi_local_size_2d_transposed(M, L, MPI_COMM_WORLD, &
    +                           local_M, local_j_offset, local_L, local_i_offset)
    +
    +
    +
    +

    Footnotes

    + +

    (8)

    +

    Technically, this is because you aren’t +actually calling the C functions directly. You are calling wrapper +functions that translate the communicator with MPI_Comm_f2c +before calling the ordinary C interface. This is all done +transparently, however, since the fftw3-mpi.f03 interface file +renames the wrappers so that they are called in Fortran with the same +names as the C interface functions.

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Installation.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Installation.html new file mode 100644 index 000000000..a3046e964 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Installation.html @@ -0,0 +1,117 @@ + + + + + +FFTW 3.3.8: FFTW MPI Installation + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.1 FFTW MPI Installation

    + +

    All of the FFTW MPI code is located in the mpi subdirectory of +the FFTW package. On Unix systems, the FFTW MPI libraries and header +files are automatically configured, compiled, and installed along with +the uniprocessor FFTW libraries simply by including +--enable-mpi in the flags to the configure script +(see Installation on Unix). + +

    + +

    Any implementation of the MPI standard, version 1 or later, should +work with FFTW. The configure script will attempt to +automatically detect how to compile and link code using your MPI +implementation. In some cases, especially if you have multiple +different MPI implementations installed or have an unusual MPI +software package, you may need to provide this information explicitly. +

    +

    Most commonly, one compiles MPI code by invoking a special compiler +command, typically mpicc for C code. The configure +script knows the most common names for this command, but you can +specify the MPI compilation command explicitly by setting the +MPICC variable, as in ‘./configure MPICC=mpicc ...’. + +

    + +

    If, instead of a special compiler command, you need to link a certain +library, you can specify the link command via the MPILIBS +variable, as in ‘./configure MPILIBS=-lmpi ...’. Note that if +your MPI library is installed in a non-standard location (one the +compiler does not know about by default), you may also have to specify +the location of the library and header files via LDFLAGS and +CPPFLAGS variables, respectively, as in ‘./configure +LDFLAGS=-L/path/to/mpi/libs CPPFLAGS=-I/path/to/mpi/include ...’. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Performance-Tips.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Performance-Tips.html new file mode 100644 index 000000000..3776a709d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Performance-Tips.html @@ -0,0 +1,115 @@ + + + + + +FFTW 3.3.8: FFTW MPI Performance Tips + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.10 FFTW MPI Performance Tips

    + +

    In this section, we collect a few tips on getting the best performance +out of FFTW’s MPI transforms. +

    +

    First, because of the 1d block distribution, FFTW’s parallelization is +currently limited by the size of the first dimension. +(Multidimensional block distributions may be supported by a future +version.) More generally, you should ideally arrange the dimensions so +that FFTW can divide them equally among the processes. See Load balancing. + + +

    + +

    Second, if it is not too inconvenient, you should consider working +with transposed output for multidimensional plans, as this saves a +considerable amount of communications. See Transposed distributions. + +

    + +

    Third, the fastest choices are generally either an in-place transform +or an out-of-place transform with the FFTW_DESTROY_INPUT flag +(which allows the input array to be used as scratch space). In-place +is especially beneficial if the amount of data per process is large. + +

    + +

    Fourth, if you have multiple arrays to transform at once, rather than +calling FFTW’s MPI transforms several times it usually seems to be +faster to interleave the data and use the advanced interface. (This +groups the communications together instead of requiring separate +messages for each transform.) +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Reference.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Reference.html new file mode 100644 index 000000000..06a56aa99 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Reference.html @@ -0,0 +1,103 @@ + + + + + +FFTW 3.3.8: FFTW MPI Reference + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12 FFTW MPI Reference

    + +

    This chapter provides a complete reference to all FFTW MPI functions, +datatypes, and constants. See also FFTW Reference for information +on functions and types in common with the serial interface. +

    + + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Transposes.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Transposes.html new file mode 100644 index 000000000..c0a287756 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Transposes.html @@ -0,0 +1,103 @@ + + + + + +FFTW 3.3.8: FFTW MPI Transposes + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.7 FFTW MPI Transposes

    + + +

    The FFTW’s MPI Fourier transforms rely on one or more global +transposition step for their communications. For example, the +multidimensional transforms work by transforming along some +dimensions, then transposing to make the first dimension local and +transforming that, then transposing back. Because global +transposition of a block-distributed matrix has many other potential +uses besides FFTs, FFTW’s transpose routines can be called directly, +as documented in this section. +

    + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Wisdom.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Wisdom.html new file mode 100644 index 000000000..c967fc9a9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-MPI-Wisdom.html @@ -0,0 +1,182 @@ + + + + + +FFTW 3.3.8: FFTW MPI Wisdom + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.8 FFTW MPI Wisdom

    + + + +

    FFTW’s “wisdom” facility (see Words of Wisdom-Saving Plans) can +be used to save MPI plans as well as to save uniprocessor plans. +However, for MPI there are several unavoidable complications. +

    + +

    First, the MPI standard does not guarantee that every process can +perform file I/O (at least, not using C stdio routines)—in general, +we may only assume that process 0 is capable of I/O.7 So, if we +want to export the wisdom from a single process to a file, we must +first export the wisdom to a string, then send it to process 0, then +write it to a file. +

    +

    Second, in principle we may want to have separate wisdom for every +process, since in general the processes may run on different hardware +even for a single MPI program. However, in practice FFTW’s MPI code +is designed for the case of homogeneous hardware (see Load balancing), and in this case it is convenient to use the same wisdom +for every process. Thus, we need a mechanism to synchronize the wisdom. +

    +

    To address both of these problems, FFTW provides the following two +functions: +

    +
    +
    void fftw_mpi_broadcast_wisdom(MPI_Comm comm);
    +void fftw_mpi_gather_wisdom(MPI_Comm comm);
    +
    + + + +

    Given a communicator comm, fftw_mpi_broadcast_wisdom +will broadcast the wisdom from process 0 to all other processes. +Conversely, fftw_mpi_gather_wisdom will collect wisdom from all +processes onto process 0. (If the plans created for the same problem +by different processes are not the same, fftw_mpi_gather_wisdom +will arbitrarily choose one of the plans.) Both of these functions +may result in suboptimal plans for different processes if the +processes are running on non-identical hardware. Both of these +functions are collective calls, which means that they must be +executed by all processes in the communicator. + +

    + +

    So, for example, a typical code snippet to import wisdom from a file +and use it on all processes would be: +

    +
    +
    {
    +    int rank;
    +
    +    fftw_mpi_init();
    +    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    +    if (rank == 0) fftw_import_wisdom_from_filename("mywisdom");
    +    fftw_mpi_broadcast_wisdom(MPI_COMM_WORLD);
    +}
    +
    + +

    (Note that we must call fftw_mpi_init before importing any +wisdom that might contain MPI plans.) Similarly, a typical code +snippet to export wisdom from all processes to a file is: + +

    +
    +
    {
    +    int rank;
    +
    +    fftw_mpi_gather_wisdom(MPI_COMM_WORLD);
    +    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    +    if (rank == 0) fftw_export_wisdom_to_filename("mywisdom");
    +}
    +
    + +
    +
    +

    Footnotes

    + +

    (7)

    +

    In fact, +even this assumption is not technically guaranteed by the standard, +although it seems to be universal in actual MPI implementations and is +widely assumed by MPI-using software. Technically, you need to query +the MPI_IO attribute of MPI_COMM_WORLD with +MPI_Attr_get. If this attribute is MPI_PROC_NULL, no +I/O is possible. If it is MPI_ANY_SOURCE, any process can +perform I/O. Otherwise, it is the rank of a process that can perform +I/O ... but since it is not guaranteed to yield the same rank +on all processes, you have to do an MPI_Allreduce of some kind +if you want all processes to agree about which is going to do I/O. +And even then, the standard only guarantees that this process can +perform output, but not input. See e.g. Parallel Programming +with MPI by P. S. Pacheco, section 8.1.3. Needless to say, in our +experience virtually no MPI programmers worry about this.

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Reference.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Reference.html new file mode 100644 index 000000000..17289ee08 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/FFTW-Reference.html @@ -0,0 +1,107 @@ + + + + + +FFTW 3.3.8: FFTW Reference + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    4 FFTW Reference

    + +

    This chapter provides a complete reference for all sequential (i.e., +one-processor) FFTW functions. Parallel transforms are described in +later chapters. +

    + + + + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fixed_002dsize-Arrays-in-C.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fixed_002dsize-Arrays-in-C.html new file mode 100644 index 000000000..62e34d49d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fixed_002dsize-Arrays-in-C.html @@ -0,0 +1,115 @@ + + + + + +FFTW 3.3.8: Fixed-size Arrays in C + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.2.3 Fixed-size Arrays in C

    + + +

    A multi-dimensional array whose size is declared at compile time in C +is already in row-major order. You don’t have to do anything +special to transform it. For example: +

    +
    +
    {
    +     fftw_complex data[N0][N1][N2];
    +     fftw_plan plan;
    +     ...
    +     plan = fftw_plan_dft_3d(N0, N1, N2, &data[0][0][0], &data[0][0][0],
    +                             FFTW_FORWARD, FFTW_ESTIMATE);
    +     ...
    +}
    +
    + +

    This will plan a 3d in-place transform of size N0 x N1 x N2. +Notice how we took the address of the zero-th element to pass to the +planner (we could also have used a typecast). +

    +

    However, we tend to discourage users from declaring their +arrays in this way, for two reasons. First, this allocates the array +on the stack (“automatic” storage), which has a very limited size on +most operating systems (declaring an array with more than a few +thousand elements will often cause a crash). (You can get around this +limitation on many systems by declaring the array as +static and/or global, but that has its own drawbacks.) +Second, it may not optimally align the array for use with a SIMD +FFTW (see SIMD alignment and fftw_malloc). Instead, we recommend +using fftw_malloc, as described below. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Forgetting-Wisdom.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Forgetting-Wisdom.html new file mode 100644 index 000000000..b1a406c19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Forgetting-Wisdom.html @@ -0,0 +1,93 @@ + + + + + +FFTW 3.3.8: Forgetting Wisdom + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Wisdom   [Contents][Index]

    +
    +
    + +

    4.7.3 Forgetting Wisdom

    + +
    +
    void fftw_forget_wisdom(void);
    +
    + + +

    Calling fftw_forget_wisdom causes all accumulated wisdom +to be discarded and its associated memory to be freed. (New +wisdom can still be gathered subsequently, however.) +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fortran-Examples.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fortran-Examples.html new file mode 100644 index 000000000..c2f929cdc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fortran-Examples.html @@ -0,0 +1,202 @@ + + + + + +FFTW 3.3.8: Fortran Examples + + + + + + + + + + + + + + + + + + + + + +
    + +

    8.4 Fortran Examples

    + +

    In C, you might have something like the following to transform a +one-dimensional complex array: +

    +
    +
            fftw_complex in[N], out[N];
    +        fftw_plan plan;
    +
    +        plan = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE);
    +        fftw_execute(plan);
    +        fftw_destroy_plan(plan);
    +
    + +

    In Fortran, you would use the following to accomplish the same thing: +

    +
    +
            double complex in, out
    +        dimension in(N), out(N)
    +        integer*8 plan
    +
    +        call dfftw_plan_dft_1d(plan,N,in,out,FFTW_FORWARD,FFTW_ESTIMATE)
    +        call dfftw_execute_dft(plan, in, out)
    +        call dfftw_destroy_plan(plan)
    +
    + + + + +

    Notice how all routines are called as Fortran subroutines, and the +plan is returned via the first argument to dfftw_plan_dft_1d. +Notice also that we changed fftw_execute to +dfftw_execute_dft (see FFTW Execution in Fortran). To do +the same thing, but using 8 threads in parallel (see Multi-threaded FFTW), you would simply prefix these calls with: +

    +
    +
            integer iret
    +        call dfftw_init_threads(iret)
    +        call dfftw_plan_with_nthreads(8)
    +
    + + + +

    (You might want to check the value of iret: if it is zero, it +indicates an unlikely error during thread initialization.) +

    +

    To transform a three-dimensional array in-place with C, you might do: +

    +
    +
            fftw_complex arr[L][M][N];
    +        fftw_plan plan;
    +
    +        plan = fftw_plan_dft_3d(L,M,N, arr,arr,
    +                                FFTW_FORWARD, FFTW_ESTIMATE);
    +        fftw_execute(plan);
    +        fftw_destroy_plan(plan);
    +
    + +

    In Fortran, you would use this instead: +

    +
    +
            double complex arr
    +        dimension arr(L,M,N)
    +        integer*8 plan
    +
    +        call dfftw_plan_dft_3d(plan, L,M,N, arr,arr,
    +       &                       FFTW_FORWARD, FFTW_ESTIMATE)
    +        call dfftw_execute_dft(plan, arr, arr)
    +        call dfftw_destroy_plan(plan)
    +
    + + +

    Note that we pass the array dimensions in the “natural” order in both C +and Fortran. +

    +

    To transform a one-dimensional real array in Fortran, you might do: +

    +
    +
            double precision in
    +        dimension in(N)
    +        double complex out
    +        dimension out(N/2 + 1)
    +        integer*8 plan
    +
    +        call dfftw_plan_dft_r2c_1d(plan,N,in,out,FFTW_ESTIMATE)
    +        call dfftw_execute_dft_r2c(plan, in, out)
    +        call dfftw_destroy_plan(plan)
    +
    + + + +

    To transform a two-dimensional real array, out of place, you might use +the following: +

    +
    +
            double precision in
    +        dimension in(M,N)
    +        double complex out
    +        dimension out(M/2 + 1, N)
    +        integer*8 plan
    +
    +        call dfftw_plan_dft_r2c_2d(plan,M,N,in,out,FFTW_ESTIMATE)
    +        call dfftw_execute_dft_r2c(plan, in, out)
    +        call dfftw_destroy_plan(plan)
    +
    + + +

    Important: Notice that it is the first dimension of the +complex output array that is cut in half in Fortran, rather than the +last dimension as in C. This is a consequence of the interface routines +reversing the order of the array dimensions passed to FFTW so that the +Fortran program can use its ordinary column-major order. + + +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fortran_002dinterface-routines.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fortran_002dinterface-routines.html new file mode 100644 index 000000000..ddd8200a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Fortran_002dinterface-routines.html @@ -0,0 +1,173 @@ + + + + + +FFTW 3.3.8: Fortran-interface routines + + + + + + + + + + + + + + + + + + + + + +
    + +

    8.1 Fortran-interface routines

    + +

    Nearly all of the FFTW functions have Fortran-callable equivalents. +The name of the legacy Fortran routine is the same as that of the +corresponding C routine, but with the ‘fftw_’ prefix replaced by +‘dfftw_’.9 The single and long-double precision +versions use ‘sfftw_’ and ‘lfftw_’, respectively, instead of +‘fftwf_’ and ‘fftwl_’; quadruple precision (real*16) +is available on some systems as ‘fftwq_’ (see Precision). +(Note that long double on x86 hardware is usually at most +80-bit extended precision, not quadruple precision.) +

    +

    For the most part, all of the arguments to the functions are the same, +with the following exceptions: +

    +
      +
    • plan variables (what would be of type fftw_plan in C), +must be declared as a type that is at least as big as a pointer +(address) on your machine. We recommend using integer*8 everywhere, +since this should always be big enough. + + +
    • Any function that returns a value (e.g. fftw_plan_dft) is +converted into a subroutine. The return value is converted into +an additional first parameter of this subroutine.10 + +
    • +The Fortran routines expect multi-dimensional arrays to be in +column-major order, which is the ordinary format of Fortran +arrays (see Multi-dimensional Array Format). They do this +transparently and costlessly simply by reversing the order of the +dimensions passed to FFTW, but this has one important consequence for +multi-dimensional real-complex transforms, discussed below. + +
    • Wisdom import and export is somewhat more tricky because one cannot +easily pass files or strings between C and Fortran; see Wisdom of Fortran?. + +
    • Legacy Fortran cannot use the fftw_malloc dynamic-allocation routine. +If you want to exploit the SIMD FFTW (see SIMD alignment and fftw_malloc), you’ll +need to figure out some other way to ensure that your arrays are at +least 16-byte aligned. + +
    • + +Since Fortran 77 does not have data structures, the fftw_iodim +structure from the guru interface (see Guru vector and transform sizes) must be split into separate arguments. In particular, any +fftw_iodim array arguments in the C guru interface become three +integer array arguments (n, is, and os) in the +Fortran guru interface, all of whose lengths should be equal to the +corresponding rank argument. + +
    • The guru planner interface in Fortran does not do any automatic +translation between column-major and row-major; you are responsible +for setting the strides etcetera to correspond to your Fortran arrays. +However, as a slight bug that we are preserving for backwards +compatibility, the ‘plan_guru_r2r’ in Fortran does reverse the +order of its kind array parameter, so the kind array +of that routine should be in the reverse of the order of the iodim +arrays (see above). + +
    + +

    In general, you should take care to use Fortran data types that +correspond to (i.e. are the same size as) the C types used by FFTW. +In practice, this correspondence is usually straightforward +(i.e. integer corresponds to int, real +corresponds to float, etcetera). The native Fortran +double/single-precision complex type should be compatible with +fftw_complex/fftwf_complex. Such simple correspondences +are assumed in the examples below. + +

    +
    +
    +

    Footnotes

    + +

    (9)

    +

    Technically, Fortran 77 identifiers are not +allowed to have more than 6 characters, nor may they contain +underscores. Any compiler that enforces this limitation doesn’t +deserve to link to FFTW.

    +

    (10)

    +

    The +reason for this is that some Fortran implementations seem to have +trouble with C function return values, and vice versa.

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Generating-your-own-code.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Generating-your-own-code.html new file mode 100644 index 000000000..7fd7461f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Generating-your-own-code.html @@ -0,0 +1,130 @@ + + + + + +FFTW 3.3.8: Generating your own code + + + + + + + + + + + + + + + + + + + + + +
    + +

    10.4 Generating your own code

    + + +

    The directory genfft contains the programs that were used to +generate FFTW’s “codelets,” which are hard-coded transforms of small +sizes. + +We do not expect casual users to employ the generator, which is a rather +sophisticated program that generates directed acyclic graphs of FFT +algorithms and performs algebraic simplifications on them. It was +written in Objective Caml, a dialect of ML, which is available at +http://caml.inria.fr/ocaml/index.en.html. + +

    + +

    If you have Objective Caml installed (along with recent versions of +GNU autoconf, automake, and libtool), then you +can change the set of codelets that are generated or play with the +generation options. The set of generated codelets is specified by the +{dft,rdft}/{codelets,simd}/*/Makefile.am files. For example, you can add +efficient REDFT codelets of small sizes by modifying +rdft/codelets/r2r/Makefile.am. + +After you modify any Makefile.am files, you can type sh +bootstrap.sh in the top-level directory followed by make to +re-generate the files. +

    +

    We do not provide more details about the code-generation process, since +we do not expect that most users will need to generate their own code. +However, feel free to contact us at fftw@fftw.org if +you are interested in the subject. +

    + +

    You might find it interesting to learn Caml and/or some modern +programming techniques that we used in the generator (including monadic +programming), especially if you heard the rumor that Java and +object-oriented programming are the latest advancement in the field. +The internal operation of the codelet generator is described in the +paper, “A Fast Fourier Transform Compiler,” by M. Frigo, which is +available from the FFTW home page and also +appeared in the Proceedings of the 1999 ACM SIGPLAN Conference on +Programming Language Design and Implementation (PLDI). +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Complex-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Complex-DFTs.html new file mode 100644 index 000000000..f71754f40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Complex-DFTs.html @@ -0,0 +1,160 @@ + + + + + +FFTW 3.3.8: Guru Complex DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5.3 Guru Complex DFTs

    + +
    +
    fftw_plan fftw_plan_guru_dft(
    +     int rank, const fftw_iodim *dims,
    +     int howmany_rank, const fftw_iodim *howmany_dims,
    +     fftw_complex *in, fftw_complex *out,
    +     int sign, unsigned flags);
    +
    +fftw_plan fftw_plan_guru_split_dft(
    +     int rank, const fftw_iodim *dims,
    +     int howmany_rank, const fftw_iodim *howmany_dims,
    +     double *ri, double *ii, double *ro, double *io,
    +     unsigned flags);
    +
    + + + +

    These two functions plan a complex-data, multi-dimensional DFT +for the interleaved and split format, respectively. +Transform dimensions are given by (rank, dims) over a +multi-dimensional vector (loop) of dimensions (howmany_rank, +howmany_dims). dims and howmany_dims should point +to fftw_iodim arrays of length rank and +howmany_rank, respectively. +

    + +

    flags is a bitwise OR (‘|’) of zero or more planner flags, +as defined in Planner Flags. +

    +

    In the fftw_plan_guru_dft function, the pointers in and +out point to the interleaved input and output arrays, +respectively. The sign can be either -1 (= +FFTW_FORWARD) or +1 (= FFTW_BACKWARD). If the +pointers are equal, the transform is in-place. +

    +

    In the fftw_plan_guru_split_dft function, +ri and ii point to the real and imaginary input arrays, +and ro and io point to the real and imaginary output +arrays. The input and output pointers may be the same, indicating an +in-place transform. For example, for fftw_complex pointers +in and out, the corresponding parameters are: +

    +
    +
    ri = (double *) in;
    +ii = (double *) in + 1;
    +ro = (double *) out;
    +io = (double *) out + 1;
    +
    + +

    Because fftw_plan_guru_split_dft accepts split arrays, strides +are expressed in units of double. For a contiguous +fftw_complex array, the overall stride of the transform should +be 2, the distance between consecutive real parts or between +consecutive imaginary parts; see Guru vector and transform sizes. Note that the dimension strides are applied equally to the +real and imaginary parts; real and imaginary arrays with different +strides are not supported. +

    +

    There is no sign parameter in fftw_plan_guru_split_dft. +This function always plans for an FFTW_FORWARD transform. To +plan for an FFTW_BACKWARD transform, you can exploit the +identity that the backwards DFT is equal to the forwards DFT with the +real and imaginary parts swapped. For example, in the case of the +fftw_complex arrays above, the FFTW_BACKWARD transform +is computed by the parameters: +

    +
    +
    ri = (double *) in + 1;
    +ii = (double *) in;
    +ro = (double *) out + 1;
    +io = (double *) out;
    +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Interface.html new file mode 100644 index 000000000..b1e59e0dd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Interface.html @@ -0,0 +1,113 @@ + + + + + +FFTW 3.3.8: Guru Interface + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5 Guru Interface

    + + +

    The “guru” interface to FFTW is intended to expose as much as possible +of the flexibility in the underlying FFTW architecture. It allows one +to compute multi-dimensional “vectors” (loops) of multi-dimensional +transforms, where each vector/transform dimension has an independent +size and stride. + +One can also use more general complex-number formats, e.g. separate real +and imaginary arrays. +

    +

    For those users who require the flexibility of the guru interface, it is +important that they pay special attention to the documentation lest they +shoot themselves in the foot. +

    + + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Real_002ddata-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Real_002ddata-DFTs.html new file mode 100644 index 000000000..c0608cb6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Real_002ddata-DFTs.html @@ -0,0 +1,159 @@ + + + + + +FFTW 3.3.8: Guru Real-data DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5.4 Guru Real-data DFTs

    + +
    +
    fftw_plan fftw_plan_guru_dft_r2c(
    +     int rank, const fftw_iodim *dims,
    +     int howmany_rank, const fftw_iodim *howmany_dims,
    +     double *in, fftw_complex *out,
    +     unsigned flags);
    +
    +fftw_plan fftw_plan_guru_split_dft_r2c(
    +     int rank, const fftw_iodim *dims,
    +     int howmany_rank, const fftw_iodim *howmany_dims,
    +     double *in, double *ro, double *io,
    +     unsigned flags);
    +
    +fftw_plan fftw_plan_guru_dft_c2r(
    +     int rank, const fftw_iodim *dims,
    +     int howmany_rank, const fftw_iodim *howmany_dims,
    +     fftw_complex *in, double *out,
    +     unsigned flags);
    +
    +fftw_plan fftw_plan_guru_split_dft_c2r(
    +     int rank, const fftw_iodim *dims,
    +     int howmany_rank, const fftw_iodim *howmany_dims,
    +     double *ri, double *ii, double *out,
    +     unsigned flags);
    +
    + + + + + +

    Plan a real-input (r2c) or real-output (c2r), multi-dimensional DFT with +transform dimensions given by (rank, dims) over a +multi-dimensional vector (loop) of dimensions (howmany_rank, +howmany_dims). dims and howmany_dims should point +to fftw_iodim arrays of length rank and +howmany_rank, respectively. As for the basic and advanced +interfaces, an r2c transform is FFTW_FORWARD and a c2r transform +is FFTW_BACKWARD. +

    +

    The last dimension of dims is interpreted specially: +that dimension of the real array has size dims[rank-1].n, but +that dimension of the complex array has size dims[rank-1].n/2+1 +(division rounded down). The strides, on the other hand, are taken to +be exactly as specified. It is up to the user to specify the strides +appropriately for the peculiar dimensions of the data, and we do not +guarantee that the planner will succeed (return non-NULL) for +any dimensions other than those described in Real-data DFT Array Format and generalized in Advanced Real-data DFTs. (That is, +for an in-place transform, each individual dimension should be able to +operate in place.) + +

    + +

    in and out point to the input and output arrays for r2c +and c2r transforms, respectively. For split arrays, ri and +ii point to the real and imaginary input arrays for a c2r +transform, and ro and io point to the real and imaginary +output arrays for an r2c transform. in and ro or +ri and out may be the same, indicating an in-place +transform. (In-place transforms where in and io or +ii and out are the same are not currently supported.) +

    + +

    flags is a bitwise OR (‘|’) of zero or more planner flags, +as defined in Planner Flags. +

    +

    In-place transforms of rank greater than 1 are currently only +supported for interleaved arrays. For split arrays, the planner will +return NULL. + +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Real_002dto_002dreal-Transforms.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Real_002dto_002dreal-Transforms.html new file mode 100644 index 000000000..c53f60337 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-Real_002dto_002dreal-Transforms.html @@ -0,0 +1,112 @@ + + + + + +FFTW 3.3.8: Guru Real-to-real Transforms + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5.5 Guru Real-to-real Transforms

    + +
    +
    fftw_plan fftw_plan_guru_r2r(int rank, const fftw_iodim *dims,
    +                             int howmany_rank,
    +                             const fftw_iodim *howmany_dims,
    +                             double *in, double *out,
    +                             const fftw_r2r_kind *kind,
    +                             unsigned flags);
    +
    + + +

    Plan a real-to-real (r2r) multi-dimensional FFTW_FORWARD +transform with transform dimensions given by (rank, dims) +over a multi-dimensional vector (loop) of dimensions +(howmany_rank, howmany_dims). dims and +howmany_dims should point to fftw_iodim arrays of length +rank and howmany_rank, respectively. +

    +

    The transform kind of each dimension is given by the kind +parameter, which should point to an array of length rank. Valid +fftw_r2r_kind constants are given in Real-to-Real Transform Kinds. +

    +

    in and out point to the real input and output arrays; they +may be the same, indicating an in-place transform. +

    + +

    flags is a bitwise OR (‘|’) of zero or more planner flags, +as defined in Planner Flags. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-vector-and-transform-sizes.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-vector-and-transform-sizes.html new file mode 100644 index 000000000..a6282244b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Guru-vector-and-transform-sizes.html @@ -0,0 +1,153 @@ + + + + + +FFTW 3.3.8: Guru vector and transform sizes + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5.2 Guru vector and transform sizes

    + +

    The guru interface introduces one basic new data structure, +fftw_iodim, that is used to specify sizes and strides for +multi-dimensional transforms and vectors: +

    +
    +
    typedef struct {
    +     int n;
    +     int is;
    +     int os;
    +} fftw_iodim;
    +
    + + +

    Here, n is the size of the dimension, and is and os +are the strides of that dimension for the input and output arrays. (The +stride is the separation of consecutive elements along this dimension.) +

    +

    The meaning of the stride parameter depends on the type of the array +that the stride refers to. If the array is interleaved complex, +strides are expressed in units of complex numbers +(fftw_complex). If the array is split complex or real, strides +are expressed in units of real numbers (double). This +convention is consistent with the usual pointer arithmetic in the C +language. An interleaved array is denoted by a pointer p to +fftw_complex, so that p+1 points to the next complex +number. Split arrays are denoted by pointers to double, in +which case pointer arithmetic operates in units of +sizeof(double). + +

    + +

    The guru planner interfaces all take a (rank, dims[rank]) +pair describing the transform size, and a (howmany_rank, +howmany_dims[howmany_rank]) pair describing the “vector” size (a +multi-dimensional loop of transforms to perform), where dims and +howmany_dims are arrays of fftw_iodim. Each n field must +be positive for dims and nonnegative for howmany_dims, while both +rank and howmany_rank must be nonnegative. +

    +

    For example, the howmany parameter in the advanced complex-DFT +interface corresponds to howmany_rank = 1, +howmany_dims[0].n = howmany, howmany_dims[0].is = +idist, and howmany_dims[0].os = odist. + + +(To compute a single transform, you can just use howmany_rank = 0.) +

    + +

    A row-major multidimensional array with dimensions n[rank] +(see Row-major Format) corresponds to dims[i].n = +n[i] and the recurrence dims[i].is = n[i+1] * +dims[i+1].is (similarly for os). The stride of the last +(i=rank-1) dimension is the overall stride of the array. +e.g. to be equivalent to the advanced complex-DFT interface, you would +have dims[rank-1].is = istride and +dims[rank-1].os = ostride. + +

    + +

    In general, we only guarantee FFTW to return a non-NULL plan if +the vector and transform dimensions correspond to a set of distinct +indices, and for in-place transforms the input/output strides should +be the same. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/How-Many-Threads-to-Use_003f.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/How-Many-Threads-to-Use_003f.html new file mode 100644 index 000000000..7b05fb72f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/How-Many-Threads-to-Use_003f.html @@ -0,0 +1,102 @@ + + + + + +FFTW 3.3.8: How Many Threads to Use? + + + + + + + + + + + + + + + + + + + + + +
    + +

    5.3 How Many Threads to Use?

    + + +

    There is a fair amount of overhead involved in synchronizing threads, +so the optimal number of threads to use depends upon the size of the +transform as well as on the number of processors you have. +

    +

    As a general rule, you don’t want to use more threads than you have +processors. (Using more threads will work, but there will be extra +overhead with no benefit.) In fact, if the problem size is too small, +you may want to use fewer threads than you have processors. +

    +

    You will have to experiment with your system to see what level of +parallelization is best for your problem size. Typically, the problem +will have to involve at least a few thousand data points before threads +become beneficial. If you plan with FFTW_PATIENT, it will +automatically disable threads for sizes that don’t benefit from +parallelization. + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-and-Customization.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-and-Customization.html new file mode 100644 index 000000000..505bbf393 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-and-Customization.html @@ -0,0 +1,132 @@ + + + + + +FFTW 3.3.8: Installation and Customization + + + + + + + + + + + + + + + + + + + + + +
    + +

    10 Installation and Customization

    + + +

    This chapter describes the installation and customization of FFTW, the +latest version of which may be downloaded from +the FFTW home page. +

    +

    In principle, FFTW should work on any system with an ANSI C compiler +(gcc is fine). However, planner time is drastically reduced if +FFTW can exploit a hardware cycle counter; FFTW comes with cycle-counter +support for all modern general-purpose CPUs, but you may need to add a +couple of lines of code if your compiler is not yet supported +(see Cycle Counters). (On Unix, there will be a warning at the end +of the configure output if no cycle counter is found.) + + + +

    + +

    Installation of FFTW is simplest if you have a Unix or a GNU system, +such as GNU/Linux, and we describe this case in the first section below, +including the use of special configuration options to e.g. install +different precisions or exploit optimizations for particular +architectures (e.g. SIMD). Compilation on non-Unix systems is a more +manual process, but we outline the procedure in the second section. It +is also likely that pre-compiled binaries will be available for popular +systems. +

    +

    Finally, we describe how you can customize FFTW for particular needs by +generating codelets for fast transforms of sizes not supported +efficiently by the standard FFTW distribution. + +

    + + + + + + + + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-and-Supported-Hardware_002fSoftware.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-and-Supported-Hardware_002fSoftware.html new file mode 100644 index 000000000..9dd8c6e7e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-and-Supported-Hardware_002fSoftware.html @@ -0,0 +1,117 @@ + + + + + +FFTW 3.3.8: Installation and Supported Hardware/Software + + + + + + + + + + + + + + + + + + + + + +
    + +

    5.1 Installation and Supported Hardware/Software

    + +

    All of the FFTW threads code is located in the threads +subdirectory of the FFTW package. On Unix systems, the FFTW threads +libraries and header files can be automatically configured, compiled, +and installed along with the uniprocessor FFTW libraries simply by +including --enable-threads in the flags to the configure +script (see Installation on Unix), or --enable-openmp to use +OpenMP threads. + +

    + + + +

    The threads routines require your operating system to have some sort +of shared-memory threads support. Specifically, the FFTW threads +package works with POSIX threads (available on most Unix variants, +from GNU/Linux to MacOS X) and Win32 threads. OpenMP threads, which +are supported in many common compilers (e.g. gcc) are also supported, +and may give better performance on some systems. (OpenMP threads are +also useful if you are employing OpenMP in your own code, in order to +minimize conflicts between threading models.) If you have a +shared-memory machine that uses a different threads API, it should be +a simple matter of programming to include support for it; see the file +threads/threads.c for more detail. +

    +

    You can compile FFTW with both --enable-threads and +--enable-openmp at the same time, since they install libraries +with different names (‘fftw3_threads’ and ‘fftw3_omp’, as +described below). However, your programs may only link to one +of these two libraries at a time. +

    +

    Ideally, of course, you should also have multiple processors in order to +get any benefit from the threaded transforms. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-on-Unix.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-on-Unix.html new file mode 100644 index 000000000..cd692fe4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-on-Unix.html @@ -0,0 +1,264 @@ + + + + + +FFTW 3.3.8: Installation on Unix + + + + + + + + + + + + + + + + + + + + + +
    + +

    10.1 Installation on Unix

    + +

    FFTW comes with a configure program in the GNU style. +Installation can be as simple as: + +

    +
    +
    ./configure
    +make
    +make install
    +
    + +

    This will build the uniprocessor complex and real transform libraries +along with the test programs. (We recommend that you use GNU +make if it is available; on some systems it is called +gmake.) The “make install” command installs the fftw +and rfftw libraries in standard places, and typically requires root +privileges (unless you specify a different install directory with the +--prefix flag to configure). You can also type +“make check” to put the FFTW test programs through their paces. +If you have problems during configuration or compilation, you may want +to run “make distclean” before trying again; this ensures that +you don’t have any stale files left over from previous compilation +attempts. +

    +

    The configure script chooses the gcc compiler by default, +if it is available; you can select some other compiler with: +

    +
    ./configure CC="<the name of your C compiler>"
    +
    + +

    The configure script knows good CFLAGS (C compiler flags) + +for a few systems. If your system is not known, the configure +script will print out a warning. In this case, you should re-configure +FFTW with the command +

    +
    ./configure CFLAGS="<write your CFLAGS here>"
    +
    +

    and then compile as usual. If you do find an optimal set of +CFLAGS for your system, please let us know what they are (along +with the output of config.guess) so that we can include them in +future releases. +

    +

    configure supports all the standard flags defined by the GNU +Coding Standards; see the INSTALL file in FFTW or +the GNU web page. +Note especially --help to list all flags and +--enable-shared to create shared, rather than static, libraries. +configure also accepts a few FFTW-specific flags, particularly: +

    +
      +
    • +--enable-float: Produces a single-precision version of FFTW +(float) instead of the default double-precision (double). +See Precision. + +
    • +--enable-long-double: Produces a long-double precision version of +FFTW (long double) instead of the default double-precision +(double). The configure script will halt with an error +message if long double is the same size as double on your +machine/compiler. See Precision. + +
    • +--enable-quad-precision: Produces a quadruple-precision version +of FFTW using the nonstandard __float128 type provided by +gcc 4.6 or later on x86, x86-64, and Itanium architectures, +instead of the default double-precision (double). The +configure script will halt with an error message if the +compiler is not gcc version 4.6 or later or if gcc’s +libquadmath library is not installed. See Precision. + +
    • +--enable-threads: Enables compilation and installation of the +FFTW threads library (see Multi-threaded FFTW), which provides a +simple interface to parallel transforms for SMP systems. By default, +the threads routines are not compiled. + +
    • --enable-openmp: Like --enable-threads, but using OpenMP +compiler directives in order to induce parallelism rather than +spawning its own threads directly, and installing an ‘fftw3_omp’ library +rather than an ‘fftw3_threads’ library (see Multi-threaded FFTW). You can use both --enable-openmp and --enable-threads +since they compile/install libraries with different names. By default, +the OpenMP routines are not compiled. + +
    • --with-combined-threads: By default, if --enable-threads +is used, the threads support is compiled into a separate library that +must be linked in addition to the main FFTW library. This is so that +users of the serial library do not need to link the system threads +libraries. If --with-combined-threads is specified, however, +then no separate threads library is created, and threads are included +in the main FFTW library. This is mainly useful under Windows, where +no system threads library is required and inter-library dependencies +are problematic. + +
    • +--enable-mpi: Enables compilation and installation of the FFTW +MPI library (see Distributed-memory FFTW with MPI), which provides +parallel transforms for distributed-memory systems with MPI. (By +default, the MPI routines are not compiled.) See FFTW MPI Installation. + +
    • +--disable-fortran: Disables inclusion of legacy-Fortran +wrapper routines (see Calling FFTW from Legacy Fortran) in the standard +FFTW libraries. These wrapper routines increase the library size by +only a negligible amount, so they are included by default as long as +the configure script finds a Fortran compiler on your system. +(To specify a particular Fortran compiler foo, pass +F77=foo to configure.) + +
    • --with-g77-wrappers: By default, when Fortran wrappers are +included, the wrappers employ the linking conventions of the Fortran +compiler detected by the configure script. If this compiler is +GNU g77, however, then two versions of the wrappers are +included: one with g77’s idiosyncratic convention of appending +two underscores to identifiers, and one with the more common +convention of appending only a single underscore. This way, the same +FFTW library will work with both g77 and other Fortran +compilers, such as GNU gfortran. However, the converse is not +true: if you configure with a different compiler, then the +g77-compatible wrappers are not included. By specifying +--with-g77-wrappers, the g77-compatible wrappers are +included in addition to wrappers for whatever Fortran compiler +configure finds. + + +
    • --with-slow-timer: Disables the use of hardware cycle counters, +and falls back on gettimeofday or clock. This greatly +worsens performance, and should generally not be used (unless you don’t +have a cycle counter but still really want an optimized plan regardless +of the time). See Cycle Counters. + +
    • --enable-sse (single precision), +--enable-sse2 (single, double), +--enable-avx (single, double), +--enable-avx2 (single, double), +--enable-avx512 (single, double), +--enable-avx-128-fma, +--enable-kcvi (single), +--enable-altivec (single), +--enable-vsx (single, double), +--enable-neon (single, double on aarch64), +--enable-generic-simd128, +and +--enable-generic-simd256: + +

      Enable various SIMD instruction sets. You need compiler that supports +the given SIMD extensions, but FFTW will try to detect at runtime +whether the CPU supports these extensions. That is, you can compile +with--enable-avx and the code will still run on a CPU without AVX +support. +

      +
        +
      • - These options require a compiler supporting SIMD extensions, and +compiler support is always a bit flaky: see the FFTW FAQ for a list of +compiler versions that have problems compiling FFTW. +
      • - Because of the large variety of ARM processors and ABIs, FFTW +does not attempt to guess the correct gcc flags for generating +NEON code. In general, you will have to provide them on the command line. +This command line is known to have worked at least once: +
        +
        ./configure --with-slow-timer --host=arm-linux-gnueabi \
        +  --enable-single --enable-neon \
        +  "CC=arm-linux-gnueabi-gcc -march=armv7-a -mfloat-abi=softfp"
        +
        +
      + +
    + + +

    To force configure to use a particular C compiler foo +(instead of the default, usually gcc), pass CC=foo to the +configure script; you may also need to set the flags via the variable +CFLAGS as described above. + +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-on-non_002dUnix-systems.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-on-non_002dUnix-systems.html new file mode 100644 index 000000000..b06e67a00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Installation-on-non_002dUnix-systems.html @@ -0,0 +1,129 @@ + + + + + +FFTW 3.3.8: Installation on non-Unix systems + + + + + + + + + + + + + + + + + + + + + +
    + +

    10.2 Installation on non-Unix systems

    + +

    It should be relatively straightforward to compile FFTW even on non-Unix +systems lacking the niceties of a configure script. Basically, +you need to edit the config.h header (copy it from +config.h.in) to #define the various options and compiler +characteristics, and then compile all the ‘.c’ files in the +relevant directories. +

    +

    The config.h header contains about 100 options to set, each one +initially an #undef, each documented with a comment, and most of +them fairly obvious. For most of the options, you should simply +#define them to 1 if they are applicable, although a few +options require a particular value (e.g. SIZEOF_LONG_LONG should +be defined to the size of the long long type, in bytes, or zero +if it is not supported). We will likely post some sample +config.h files for various operating systems and compilers for +you to use (at least as a starting point). Please let us know if you +have to hand-create a configuration file (and/or a pre-compiled binary) +that you want to share. +

    +

    To create the FFTW library, you will then need to compile all of the +‘.c’ files in the kernel, dft, dft/scalar, +dft/scalar/codelets, rdft, rdft/scalar, +rdft/scalar/r2cf, rdft/scalar/r2cb, +rdft/scalar/r2r, reodft, and api directories. +If you are compiling with SIMD support (e.g. you defined +HAVE_SSE2 in config.h), then you also need to compile +the .c files in the simd-support, +{dft,rdft}/simd, {dft,rdft}/simd/* directories. +

    +

    Once these files are all compiled, link them into a library, or a shared +library, or directly into your program. +

    +

    To compile the FFTW test program, additionally compile the code in the +libbench2/ directory, and link it into a library. Then compile +the code in the tests/ directory and link it to the +libbench2 and FFTW libraries. To compile the fftw-wisdom +(command-line) tool (see Wisdom Utilities), compile +tools/fftw-wisdom.c and link it to the libbench2 and FFTW +libraries +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Interleaved-and-split-arrays.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Interleaved-and-split-arrays.html new file mode 100644 index 000000000..b0d523ddf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Interleaved-and-split-arrays.html @@ -0,0 +1,106 @@ + + + + + +FFTW 3.3.8: Interleaved and split arrays + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.5.1 Interleaved and split arrays

    + +

    The guru interface supports two representations of complex numbers, +which we call the interleaved and the split format. +

    +

    The interleaved format is the same one used by the basic and +advanced interfaces, and it is documented in Complex numbers. +In the interleaved format, you provide pointers to the real part of a +complex number, and the imaginary part understood to be stored in the +next memory location. + +

    + +

    The split format allows separate pointers to the real and +imaginary parts of a complex array. + +

    + +

    Technically, the interleaved format is redundant, because you can +always express an interleaved array in terms of a split array with +appropriate pointers and strides. On the other hand, the interleaved +format is simpler to use, and it is common in practice. Hence, FFTW +supports it as a special case. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Introduction.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Introduction.html new file mode 100644 index 000000000..b67c20f33 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Introduction.html @@ -0,0 +1,224 @@ + + + + + +FFTW 3.3.8: Introduction + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    1 Introduction

    +

    This manual documents version 3.3.8 of FFTW, the +Fastest Fourier Transform in the West. FFTW is a comprehensive +collection of fast C routines for computing the discrete Fourier +transform (DFT) and various special cases thereof. + + +

      +
    • FFTW computes the DFT of complex data, real data, even- + or odd-symmetric real data (these symmetric transforms are usually + known as the discrete cosine or sine transform, respectively), and the + discrete Hartley transform (DHT) of real data. + +
    • The input data can have arbitrary length. + FFTW employs O(n log n) + algorithms for all lengths, including + prime numbers. + +
    • FFTW supports arbitrary multi-dimensional data. + +
    • FFTW supports the SSE, SSE2, AVX, AVX2, AVX512, KCVI, Altivec, VSX, and + NEON vector instruction sets. + +
    • FFTW includes parallel (multi-threaded) transforms + for shared-memory systems. +
    • Starting with version 3.3, FFTW includes distributed-memory parallel + transforms using MPI. +
    + +

    We assume herein that you are familiar with the properties and uses of +the DFT that are relevant to your application. Otherwise, see +e.g. The Fast Fourier Transform and Its Applications by E. O. Brigham +(Prentice-Hall, Englewood Cliffs, NJ, 1988). +Our web page also has links to FFT-related +information online. + +

    + +

    In order to use FFTW effectively, you need to learn one basic concept +of FFTW’s internal structure: FFTW does not use a fixed algorithm for +computing the transform, but instead it adapts the DFT algorithm to +details of the underlying hardware in order to maximize performance. +Hence, the computation of the transform is split into two phases. +First, FFTW’s planner “learns” the fastest way to compute the +transform on your machine. The planner + +produces a data structure called a plan that contains this + +information. Subsequently, the plan is executed + +to transform the array of input data as dictated by the plan. The +plan can be reused as many times as needed. In typical +high-performance applications, many transforms of the same size are +computed and, consequently, a relatively expensive initialization of +this sort is acceptable. On the other hand, if you need a single +transform of a given size, the one-time cost of the planner becomes +significant. For this case, FFTW provides fast planners based on +heuristics or on previously computed plans. +

    +

    FFTW supports transforms of data with arbitrary length, rank, +multiplicity, and a general memory layout. In simple cases, however, +this generality may be unnecessary and confusing. Consequently, we +organized the interface to FFTW into three levels of increasing +generality. +

      +
    • The basic interface computes a single + transform of contiguous data. +
    • The advanced interface computes transforms + of multiple or strided arrays. +
    • The guru interface supports the most general data + layouts, multiplicities, and strides. +
    +

    We expect that most users will be best served by the basic interface, +whereas the guru interface requires careful attention to the +documentation to avoid problems. + + + +

    + +

    Besides the automatic performance adaptation performed by the planner, +it is also possible for advanced users to customize FFTW manually. For +example, if code space is a concern, we provide a tool that links only +the subset of FFTW needed by your application. Conversely, you may need +to extend FFTW because the standard distribution is not sufficient for +your needs. For example, the standard FFTW distribution works most +efficiently for arrays whose size can be factored into small primes +(2, 3, 5, and 7), and otherwise it uses a +slower general-purpose routine. If you need efficient transforms of +other sizes, you can use FFTW’s code generator, which produces fast C +programs (“codelets”) for any particular array size you may care +about. + + +For example, if you need transforms of size +513 = 19*33, +you can customize FFTW to support the factor 19 efficiently. +

    +

    For more information regarding FFTW, see the paper, “The Design and +Implementation of FFTW3,” by M. Frigo and S. G. Johnson, which was an +invited paper in Proc. IEEE 93 (2), p. 216 (2005). The +code generator is described in the paper “A fast Fourier transform +compiler”, + +by M. Frigo, in the Proceedings of the 1999 ACM SIGPLAN Conference +on Programming Language Design and Implementation (PLDI), Atlanta, +Georgia, May 1999. These papers, along with the latest version of +FFTW, the FAQ, benchmarks, and other links, are available at +the FFTW home page. +

    +

    The current version of FFTW incorporates many good ideas from the past +thirty years of FFT literature. In one way or another, FFTW uses the +Cooley-Tukey algorithm, the prime factor algorithm, Rader’s algorithm +for prime sizes, and a split-radix algorithm (with a +“conjugate-pair” variation pointed out to us by Dan Bernstein). +FFTW’s code generator also produces new algorithms that we do not +completely understand. + +The reader is referred to the cited papers for the appropriate +references. +

    +

    The rest of this manual is organized as follows. We first discuss the +sequential (single-processor) implementation. We start by describing +the basic interface/features of FFTW in Tutorial. +Next, Other Important Topics discusses data alignment +(see SIMD alignment and fftw_malloc), +the storage scheme of multi-dimensional arrays +(see Multi-dimensional Array Format), and FFTW’s mechanism for +storing plans on disk (see Words of Wisdom-Saving Plans). Next, +FFTW Reference provides comprehensive documentation of all +FFTW’s features. Parallel transforms are discussed in their own +chapters: Multi-threaded FFTW and Distributed-memory FFTW with MPI. Fortran programmers can also use FFTW, as described in +Calling FFTW from Legacy Fortran and Calling FFTW from Modern Fortran. Installation and Customization explains how to +install FFTW in your computer system and how to adapt FFTW to your +needs. License and copyright information is given in License and Copyright. Finally, we thank all the people who helped us in +Acknowledgments. +

    +
    +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Library-Index.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Library-Index.html new file mode 100644 index 000000000..f49f601fa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Library-Index.html @@ -0,0 +1,459 @@ + + + + + +FFTW 3.3.8: Library Index + + + + + + + + + + + + + + + + + + + +
    +

    +Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    14 Library Index

    +
    Jump to:   C +   +D +   +F +   +M +   +P +   +R +   +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Index Entry  Section

    C
    c_associated: Wisdom String Export/Import from Fortran
    C_DOUBLE: Overview of Fortran interface
    C_DOUBLE: FFTW Fortran type reference
    C_DOUBLE_COMPLEX: Overview of Fortran interface
    C_DOUBLE_COMPLEX: FFTW Fortran type reference
    C_FFTW_R2R_KIND: FFTW Fortran type reference
    C_FLOAT: FFTW Fortran type reference
    C_FLOAT_COMPLEX: FFTW Fortran type reference
    c_funloc: Wisdom Generic Export/Import from Fortran
    C_FUNPTR: FFTW Fortran type reference
    c_f_pointer: Reversing array dimensions
    c_f_pointer: FFTW Fortran type reference
    c_f_pointer: Allocating aligned memory in Fortran
    c_f_pointer: Wisdom String Export/Import from Fortran
    c_f_pointer: Wisdom Generic Export/Import from Fortran
    C_INT: Overview of Fortran interface
    C_INT: FFTW Fortran type reference
    C_INTPTR_T: FFTW Fortran type reference
    c_loc: Wisdom Generic Export/Import from Fortran
    C_LONG_DOUBLE: FFTW Fortran type reference
    C_LONG_DOUBLE_COMPLEX: FFTW Fortran type reference
    C_PTR: Overview of Fortran interface
    C_SIZE_T: FFTW Fortran type reference

    D
    dfftw_destroy_plan: Fortran Examples
    dfftw_execute: FFTW Execution in Fortran
    dfftw_execute_dft: FFTW Execution in Fortran
    dfftw_execute_dft: Fortran Examples
    dfftw_execute_dft_r2c: Fortran Examples
    dfftw_export_wisdom: Wisdom of Fortran?
    dfftw_forget_wisdom: Wisdom of Fortran?
    dfftw_import_system_wisdom: Wisdom of Fortran?
    dfftw_import_wisdom: Wisdom of Fortran?
    dfftw_init_threads: Fortran Examples
    dfftw_plan_dft_1d: Fortran Examples
    dfftw_plan_dft_3d: Fortran Examples
    dfftw_plan_dft_r2c_1d: Fortran Examples
    dfftw_plan_dft_r2c_2d: Fortran Examples
    dfftw_plan_with_nthreads: Fortran Examples

    F
    fftw_alignment_of: Planner Flags
    fftw_alignment_of: New-array Execute Functions
    fftw_alloc_complex: Complex One-Dimensional DFTs
    fftw_alloc_complex: SIMD alignment and fftw_malloc
    fftw_alloc_complex: Memory Allocation
    fftw_alloc_complex: Basic and advanced distribution interfaces
    fftw_alloc_complex: Reversing array dimensions
    fftw_alloc_complex: Allocating aligned memory in Fortran
    fftw_alloc_real: SIMD alignment and fftw_malloc
    fftw_alloc_real: Memory Allocation
    fftw_alloc_real: Multi-dimensional MPI DFTs of Real Data
    fftw_alloc_real: Other Multi-dimensional Real-data MPI Transforms
    fftw_alloc_real: FFTW Fortran type reference
    fftw_alloc_real: Allocating aligned memory in Fortran
    FFTW_BACKWARD: Complex One-Dimensional DFTs
    FFTW_BACKWARD: One-Dimensional DFTs of Real Data
    FFTW_BACKWARD: Complex DFTs
    fftw_cleanup: Using Plans
    fftw_cleanup: MPI Initialization
    fftw_cleanup_threads: Usage of Multi-threaded FFTW
    fftw_complex: Complex One-Dimensional DFTs
    fftw_complex: Complex numbers
    fftw_complex: Overview of Fortran interface
    fftw_complex: FFTW Fortran type reference
    fftw_cost: Using Plans
    FFTW_DESTROY_INPUT: Planner Flags
    FFTW_DESTROY_INPUT: FFTW MPI Performance Tips
    FFTW_DESTROY_INPUT: FFTW Fortran type reference
    fftw_destroy_plan: Complex One-Dimensional DFTs
    fftw_destroy_plan: Using Plans
    fftw_destroy_plan: Avoiding MPI Deadlocks
    fftw_destroy_plan: Overview of Fortran interface
    FFTW_DHT: The Discrete Hartley Transform
    FFTW_DHT: Real-to-Real Transform Kinds
    FFTW_ESTIMATE: Complex One-Dimensional DFTs
    FFTW_ESTIMATE: Words of Wisdom-Saving Plans
    FFTW_ESTIMATE: Planner Flags
    FFTW_ESTIMATE: Cycle Counters
    fftw_execute: Complex One-Dimensional DFTs
    fftw_execute: Using Plans
    fftw_execute: New-array Execute Functions
    fftw_execute: Basic distributed-transpose interface
    fftw_execute: Avoiding MPI Deadlocks
    fftw_execute: Overview of Fortran interface
    fftw_execute: Plan execution in Fortran
    fftw_execute_dft: New-array Execute Functions
    fftw_execute_dft: FFTW MPI Fortran Interface
    fftw_execute_dft: Overview of Fortran interface
    fftw_execute_dft: Plan execution in Fortran
    fftw_execute_dft_c2r: New-array Execute Functions
    fftw_execute_dft_c2r: Plan execution in Fortran
    fftw_execute_dft_r2c: New-array Execute Functions
    fftw_execute_dft_r2c: Reversing array dimensions
    fftw_execute_dft_r2c: Plan execution in Fortran
    fftw_execute_r2r: New-array Execute Functions
    fftw_execute_r2r: Plan execution in Fortran
    fftw_execute_split_dft: New-array Execute Functions
    fftw_execute_split_dft_c2r: New-array Execute Functions
    fftw_execute_split_dft_r2c: New-array Execute Functions
    FFTW_EXHAUSTIVE: Words of Wisdom-Saving Plans
    FFTW_EXHAUSTIVE: Planner Flags
    fftw_export_wisdom: Wisdom Export
    fftw_export_wisdom: Wisdom Generic Export/Import from Fortran
    fftw_export_wisdom_to_file: Wisdom Export
    fftw_export_wisdom_to_filename: Words of Wisdom-Saving Plans
    fftw_export_wisdom_to_filename: Wisdom Export
    fftw_export_wisdom_to_filename: Wisdom File Export/Import from Fortran
    fftw_export_wisdom_to_string: Wisdom Export
    fftw_export_wisdom_to_string: Wisdom String Export/Import from Fortran
    fftw_flops: Using Plans
    fftw_flops: Avoiding MPI Deadlocks
    fftw_flops: FFTW Fortran type reference
    fftw_forget_wisdom: Words of Wisdom-Saving Plans
    fftw_forget_wisdom: Forgetting Wisdom
    FFTW_FORWARD: Complex One-Dimensional DFTs
    FFTW_FORWARD: One-Dimensional DFTs of Real Data
    FFTW_FORWARD: Complex DFTs
    fftw_fprint_plan: Using Plans
    fftw_free: Complex One-Dimensional DFTs
    fftw_free: SIMD alignment and fftw_malloc
    fftw_free: Memory Allocation
    FFTW_HC2R: The Halfcomplex-format DFT
    FFTW_HC2R: Real-to-Real Transform Kinds
    fftw_import wisdom_from_filename: Wisdom File Export/Import from Fortran
    fftw_import_system_wisdom: Caveats in Using Wisdom
    fftw_import_system_wisdom: Wisdom Import
    fftw_import_wisdom: Wisdom Import
    fftw_import_wisdom: Wisdom Generic Export/Import from Fortran
    fftw_import_wisdom_from_file: Wisdom Import
    fftw_import_wisdom_from_filename: Words of Wisdom-Saving Plans
    fftw_import_wisdom_from_filename: Wisdom Import
    fftw_import_wisdom_from_string: Wisdom Import
    fftw_import_wisdom_from_string: Wisdom String Export/Import from Fortran
    fftw_init_threads: Usage of Multi-threaded FFTW
    fftw_init_threads: Linking and Initializing MPI FFTW
    fftw_init_threads: Combining MPI and Threads
    fftw_init_threads: MPI Initialization
    fftw_iodim: Guru vector and transform sizes
    fftw_iodim: FFTW Fortran type reference
    fftw_iodim: Fortran-interface routines
    fftw_iodim64: 64-bit Guru Interface
    fftw_iodim64: FFTW Fortran type reference
    fftw_make_planner_thread_safe: Thread safety
    fftw_malloc: Complex One-Dimensional DFTs
    fftw_malloc: SIMD alignment and fftw_malloc
    fftw_malloc: Dynamic Arrays in C
    fftw_malloc: Memory Allocation
    fftw_malloc: Planner Flags
    fftw_malloc: Basic and advanced distribution interfaces
    fftw_malloc: Using MPI Plans
    fftw_malloc: FFTW Fortran type reference
    FFTW_MEASURE: Complex One-Dimensional DFTs
    FFTW_MEASURE: Words of Wisdom-Saving Plans
    FFTW_MEASURE: Planner Flags
    FFTW_MEASURE: An improved replacement for MPI_Alltoall
    fftw_mpi_broadcast_wisdom: FFTW MPI Wisdom
    fftw_mpi_broadcast_wisdom: MPI Wisdom Communication
    fftw_mpi_cleanup: Linking and Initializing MPI FFTW
    fftw_mpi_cleanup: MPI Initialization
    FFTW_MPI_DEFAULT_BLOCK: Basic and advanced distribution interfaces
    FFTW_MPI_DEFAULT_BLOCK: Advanced distributed-transpose interface
    FFTW_MPI_DEFAULT_BLOCK: MPI Plan Creation
    fftw_mpi_execute_dft: Using MPI Plans
    fftw_mpi_execute_dft: FFTW MPI Fortran Interface
    fftw_mpi_execute_dft_c2r: Using MPI Plans
    fftw_mpi_execute_dft_r2c: Using MPI Plans
    fftw_mpi_execute_r2r: Using MPI Plans
    fftw_mpi_execute_r2r: MPI Plan Creation
    fftw_mpi_gather_wisdom: FFTW MPI Wisdom
    fftw_mpi_gather_wisdom: MPI Wisdom Communication
    fftw_mpi_init: Linking and Initializing MPI FFTW
    fftw_mpi_init: 2d MPI example
    fftw_mpi_init: FFTW MPI Wisdom
    fftw_mpi_init: Combining MPI and Threads
    fftw_mpi_init: MPI Initialization
    fftw_mpi_local_size: MPI Data Distribution Functions
    fftw_mpi_local_size_1d: One-dimensional distributions
    fftw_mpi_local_size_1d: MPI Data Distribution Functions
    fftw_mpi_local_size_2d: 2d MPI example
    fftw_mpi_local_size_2d: Basic and advanced distribution interfaces
    fftw_mpi_local_size_2d: MPI Data Distribution Functions
    fftw_mpi_local_size_2d_transposed: Basic distributed-transpose interface
    fftw_mpi_local_size_2d_transposed: MPI Data Distribution Functions
    fftw_mpi_local_size_3d: MPI Data Distribution Functions
    fftw_mpi_local_size_3d_transposed: Transposed distributions
    fftw_mpi_local_size_3d_transposed: MPI Data Distribution Functions
    fftw_mpi_local_size_many: Basic and advanced distribution interfaces
    fftw_mpi_local_size_many: MPI Data Distribution Functions
    fftw_mpi_local_size_many_1d: MPI Data Distribution Functions
    fftw_mpi_local_size_many_transposed: Advanced distributed-transpose interface
    fftw_mpi_local_size_many_transposed: MPI Data Distribution Functions
    fftw_mpi_local_size_transposed: MPI Data Distribution Functions
    fftw_mpi_plan_dft: MPI Plan Creation
    fftw_mpi_plan_dft_1d: MPI Plan Creation
    fftw_mpi_plan_dft_2d: 2d MPI example
    fftw_mpi_plan_dft_2d: MPI Plan Creation
    fftw_mpi_plan_dft_3d: MPI Plan Creation
    fftw_mpi_plan_dft_c2r: MPI Plan Creation
    fftw_mpi_plan_dft_c2r_2d: MPI Plan Creation
    fftw_mpi_plan_dft_c2r_2d: MPI Plan Creation
    fftw_mpi_plan_dft_c2r_3d: MPI Plan Creation
    fftw_mpi_plan_dft_r2c: MPI Plan Creation
    fftw_mpi_plan_dft_r2c_2d: MPI Plan Creation
    fftw_mpi_plan_dft_r2c_2d: MPI Plan Creation
    fftw_mpi_plan_dft_r2c_3d: MPI Plan Creation
    fftw_mpi_plan_many_dft: MPI Plan Creation
    fftw_mpi_plan_many_dft_c2r: MPI Plan Creation
    fftw_mpi_plan_many_dft_r2c: MPI Plan Creation
    fftw_mpi_plan_many_transpose: Advanced distributed-transpose interface
    fftw_mpi_plan_many_transpose: MPI Plan Creation
    fftw_mpi_plan_transpose: Basic distributed-transpose interface
    fftw_mpi_plan_transpose: MPI Plan Creation
    FFTW_MPI_SCRAMBLED_IN: One-dimensional distributions
    FFTW_MPI_SCRAMBLED_IN: MPI Data Distribution Functions
    FFTW_MPI_SCRAMBLED_IN: MPI Plan Creation
    FFTW_MPI_SCRAMBLED_OUT: One-dimensional distributions
    FFTW_MPI_SCRAMBLED_OUT: MPI Data Distribution Functions
    FFTW_MPI_SCRAMBLED_OUT: MPI Plan Creation
    FFTW_MPI_TRANSPOSED_IN: Transposed distributions
    FFTW_MPI_TRANSPOSED_IN: Basic distributed-transpose interface
    FFTW_MPI_TRANSPOSED_IN: MPI Plan Creation
    FFTW_MPI_TRANSPOSED_OUT: Transposed distributions
    FFTW_MPI_TRANSPOSED_OUT: Basic distributed-transpose interface
    FFTW_MPI_TRANSPOSED_OUT: MPI Plan Creation
    FFTW_NO_TIMELIMIT: Planner Flags
    FFTW_PATIENT: Complex One-Dimensional DFTs
    FFTW_PATIENT: Words of Wisdom-Saving Plans
    FFTW_PATIENT: Planner Flags
    FFTW_PATIENT: How Many Threads to Use?
    FFTW_PATIENT: An improved replacement for MPI_Alltoall
    fftw_plan: Complex One-Dimensional DFTs
    fftw_plan: Using Plans
    fftw_plan: FFTW Fortran type reference
    fftw_plan_dft: Complex Multi-Dimensional DFTs
    fftw_plan_dft: Complex DFTs
    fftw_plan_dft_1d: Complex One-Dimensional DFTs
    fftw_plan_dft_1d: Complex DFTs
    fftw_plan_dft_2d: Complex Multi-Dimensional DFTs
    fftw_plan_dft_2d: Complex DFTs
    fftw_plan_dft_2d: Overview of Fortran interface
    fftw_plan_dft_3d: Complex Multi-Dimensional DFTs
    fftw_plan_dft_3d: Complex DFTs
    fftw_plan_dft_3d: Reversing array dimensions
    fftw_plan_dft_c2r: Real-data DFTs
    fftw_plan_dft_c2r_1d: One-Dimensional DFTs of Real Data
    fftw_plan_dft_c2r_1d: Real-data DFTs
    fftw_plan_dft_c2r_2d: Real-data DFTs
    fftw_plan_dft_c2r_3d: Real-data DFTs
    fftw_plan_dft_r2c: Multi-Dimensional DFTs of Real Data
    fftw_plan_dft_r2c: Real-data DFTs
    fftw_plan_dft_r2c_1d: One-Dimensional DFTs of Real Data
    fftw_plan_dft_r2c_1d: Real-data DFTs
    fftw_plan_dft_r2c_2d: Multi-Dimensional DFTs of Real Data
    fftw_plan_dft_r2c_2d: Real-data DFTs
    fftw_plan_dft_r2c_3d: Multi-Dimensional DFTs of Real Data
    fftw_plan_dft_r2c_3d: Real-data DFTs
    fftw_plan_dft_r2c_3d: Reversing array dimensions
    fftw_plan_guru64_dft: 64-bit Guru Interface
    fftw_plan_guru_dft: Guru Complex DFTs
    fftw_plan_guru_dft_c2r: Guru Real-data DFTs
    fftw_plan_guru_dft_r2c: Guru Real-data DFTs
    fftw_plan_guru_r2r: Guru Real-to-real Transforms
    fftw_plan_guru_split_dft: Guru Complex DFTs
    fftw_plan_guru_split_dft_c2r: Guru Real-data DFTs
    fftw_plan_guru_split_dft_r2c: Guru Real-data DFTs
    fftw_plan_many_dft: Advanced Complex DFTs
    fftw_plan_many_dft_c2r: Advanced Real-data DFTs
    fftw_plan_many_dft_r2c: Advanced Real-data DFTs
    fftw_plan_many_r2r: Advanced Real-to-real Transforms
    fftw_plan_r2r: More DFTs of Real Data
    fftw_plan_r2r: Real-to-Real Transforms
    fftw_plan_r2r_1d: More DFTs of Real Data
    fftw_plan_r2r_1d: Real-to-Real Transforms
    fftw_plan_r2r_2d: More DFTs of Real Data
    fftw_plan_r2r_2d: Real-to-Real Transforms
    fftw_plan_r2r_3d: More DFTs of Real Data
    fftw_plan_r2r_3d: Real-to-Real Transforms
    fftw_plan_with_nthreads: Usage of Multi-threaded FFTW
    fftw_plan_with_nthreads: Combining MPI and Threads
    FFTW_PRESERVE_INPUT: One-Dimensional DFTs of Real Data
    FFTW_PRESERVE_INPUT: Planner Flags
    fftw_print_plan: Using Plans
    FFTW_R2HC: The Halfcomplex-format DFT
    FFTW_R2HC: Real-to-Real Transform Kinds
    fftw_r2r_kind: More DFTs of Real Data
    fftw_r2r_kind: Other Multi-dimensional Real-data MPI Transforms
    fftw_r2r_kind: FFTW Fortran type reference
    FFTW_REDFT00: Real even/odd DFTs (cosine/sine transforms)
    FFTW_REDFT00: Real-to-Real Transforms
    FFTW_REDFT00: Real-to-Real Transform Kinds
    FFTW_REDFT01: Real even/odd DFTs (cosine/sine transforms)
    FFTW_REDFT01: Real-to-Real Transform Kinds
    FFTW_REDFT10: Real even/odd DFTs (cosine/sine transforms)
    FFTW_REDFT10: Real-to-Real Transform Kinds
    FFTW_REDFT11: Real even/odd DFTs (cosine/sine transforms)
    FFTW_REDFT11: Real-to-Real Transform Kinds
    FFTW_RODFT00: Real even/odd DFTs (cosine/sine transforms)
    FFTW_RODFT00: Real-to-Real Transform Kinds
    FFTW_RODFT01: Real even/odd DFTs (cosine/sine transforms)
    FFTW_RODFT01: Real-to-Real Transform Kinds
    FFTW_RODFT10: Real even/odd DFTs (cosine/sine transforms)
    FFTW_RODFT10: Real-to-Real Transform Kinds
    FFTW_RODFT11: Real even/odd DFTs (cosine/sine transforms)
    FFTW_RODFT11: Real-to-Real Transform Kinds
    fftw_set_timelimit: Planner Flags
    FFTW_TRANSPOSED_IN: Multi-dimensional MPI DFTs of Real Data
    FFTW_TRANSPOSED_OUT: Multi-dimensional MPI DFTs of Real Data
    FFTW_UNALIGNED: Planner Flags
    FFTW_UNALIGNED: New-array Execute Functions
    FFTW_UNALIGNED: Plan execution in Fortran
    FFTW_UNALIGNED: FFTW Execution in Fortran
    FFTW_WISDOM_ONLY: Planner Flags

    M
    MPI_Alltoall: An improved replacement for MPI_Alltoall
    MPI_Barrier: Avoiding MPI Deadlocks
    MPI_COMM_WORLD: Distributed-memory FFTW with MPI
    MPI_COMM_WORLD: 2d MPI example
    MPI_Init: 2d MPI example

    P
    ptrdiff_t: 64-bit Guru Interface
    ptrdiff_t: 2d MPI example
    ptrdiff_t: FFTW Fortran type reference

    R
    R2HC: The 1d Real-data DFT
    REDFT00: 1d Real-even DFTs (DCTs)
    REDFT00: 1d Real-even DFTs (DCTs)
    REDFT01: 1d Real-even DFTs (DCTs)
    REDFT10: 1d Real-even DFTs (DCTs)
    REDFT11: 1d Real-even DFTs (DCTs)
    RODFT00: 1d Real-odd DFTs (DSTs)
    RODFT00: 1d Real-odd DFTs (DSTs)
    RODFT01: 1d Real-odd DFTs (DSTs)
    RODFT10: 1d Real-odd DFTs (DSTs)
    RODFT11: 1d Real-odd DFTs (DSTs)

    +
    Jump to:   C +   +D +   +F +   +M +   +P +   +R +   +
    + +
    +
    +

    +Previous: , Up: Top   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/License-and-Copyright.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/License-and-Copyright.html new file mode 100644 index 000000000..ccaa0b026 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/License-and-Copyright.html @@ -0,0 +1,124 @@ + + + + + +FFTW 3.3.8: License and Copyright + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    12 License and Copyright

    + +

    FFTW is Copyright © 2003, 2007-11 Matteo Frigo, Copyright +© 2003, 2007-11 Massachusetts Institute of Technology. +

    +

    FFTW is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. +

    +

    This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +

    +

    You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA You can also +find the GPL on the GNU +web site. +

    +

    In addition, we kindly ask you to acknowledge FFTW and its authors in +any program or publication in which you use FFTW. (You are not +required to do so; it is up to your common sense to decide +whether you want to comply with this request or not.) For general +publications, we suggest referencing: Matteo Frigo and Steven +G. Johnson, “The design and implementation of FFTW3,” +Proc. IEEE 93 (2), 216–231 (2005). +

    +

    Non-free versions of FFTW are available under terms different from those +of the General Public License. (e.g. they do not require you to +accompany any object code using FFTW with the corresponding source +code.) For these alternative terms you must purchase a license from MIT’s +Technology Licensing Office. Users interested in such a license should +contact us (fftw@fftw.org) for more information. +

    + +
    +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Linking-and-Initializing-MPI-FFTW.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Linking-and-Initializing-MPI-FFTW.html new file mode 100644 index 000000000..4c274ef5a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Linking-and-Initializing-MPI-FFTW.html @@ -0,0 +1,119 @@ + + + + + +FFTW 3.3.8: Linking and Initializing MPI FFTW + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.2 Linking and Initializing MPI FFTW

    + +

    Programs using the MPI FFTW routines should be linked with +-lfftw3_mpi -lfftw3 -lm on Unix in double precision, +-lfftw3f_mpi -lfftw3f -lm in single precision, and so on +(see Precision). You will also need to link with whatever library +is responsible for MPI on your system; in most MPI implementations, +there is a special compiler alias named mpicc to compile and +link MPI code. + + + +

    + + +

    Before calling any FFTW routines except possibly +fftw_init_threads (see Combining MPI and Threads), but after calling +MPI_Init, you should call the function: +

    +
    +
    void fftw_mpi_init(void);
    +
    + + +

    If, at the end of your program, you want to get rid of all memory and +other resources allocated internally by FFTW, for both the serial and +MPI routines, you can call: +

    +
    +
    void fftw_mpi_cleanup(void);
    +
    + + +

    which is much like the fftw_cleanup() function except that it +also gets rid of FFTW’s MPI-related data. You must not execute +any previously created plans after calling this function. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Load-balancing.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Load-balancing.html new file mode 100644 index 000000000..7d7869897 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Load-balancing.html @@ -0,0 +1,113 @@ + + + + + +FFTW 3.3.8: Load balancing + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.4.2 Load balancing

    + + +

    Ideally, when you parallelize a transform over some P +processes, each process should end up with work that takes equal time. +Otherwise, all of the processes end up waiting on whichever process is +slowest. This goal is known as “load balancing.” In this section, +we describe the circumstances under which FFTW is able to load-balance +well, and in particular how you should choose your transform size in +order to load balance. +

    +

    Load balancing is especially difficult when you are parallelizing over +heterogeneous machines; for example, if one of your processors is a +old 486 and another is a Pentium IV, obviously you should give the +Pentium more work to do than the 486 since the latter is much slower. +FFTW does not deal with this problem, however—it assumes that your +processes run on hardware of comparable speed, and that the goal is +therefore to divide the problem as equally as possible. +

    +

    For a multi-dimensional complex DFT, FFTW can divide the problem +equally among the processes if: (i) the first dimension +n0 is divisible by P; and (ii), the product of +the subsequent dimensions is divisible by P. (For the advanced +interface, where you can specify multiple simultaneous transforms via +some “vector” length howmany, a factor of howmany is +included in the product of the subsequent dimensions.) +

    +

    For a one-dimensional complex DFT, the length N of the data +should be divisible by P squared to be able to divide +the problem equally among the processes. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Data-Distribution-Functions.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Data-Distribution-Functions.html new file mode 100644 index 000000000..d4737c5c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Data-Distribution-Functions.html @@ -0,0 +1,198 @@ + + + + + +FFTW 3.3.8: MPI Data Distribution Functions + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12.4 MPI Data Distribution Functions

    + + +

    As described above (see MPI Data Distribution), in order to +allocate your arrays, before creating a plan, you must first +call one of the following routines to determine the required +allocation size and the portion of the array locally stored on a given +process. The MPI_Comm communicator passed here must be +equivalent to the communicator used below for plan creation. +

    +

    The basic interface for multidimensional transforms consists of the +functions: +

    + + + + + + +
    +
    ptrdiff_t fftw_mpi_local_size_2d(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,
    +                                 ptrdiff_t *local_n0, ptrdiff_t *local_0_start);
    +ptrdiff_t fftw_mpi_local_size_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,
    +                                 MPI_Comm comm,
    +                                 ptrdiff_t *local_n0, ptrdiff_t *local_0_start);
    +ptrdiff_t fftw_mpi_local_size(int rnk, const ptrdiff_t *n, MPI_Comm comm,
    +                              ptrdiff_t *local_n0, ptrdiff_t *local_0_start);
    +
    +ptrdiff_t fftw_mpi_local_size_2d_transposed(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm,
    +                                            ptrdiff_t *local_n0, ptrdiff_t *local_0_start,
    +                                            ptrdiff_t *local_n1, ptrdiff_t *local_1_start);
    +ptrdiff_t fftw_mpi_local_size_3d_transposed(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,
    +                                            MPI_Comm comm,
    +                                            ptrdiff_t *local_n0, ptrdiff_t *local_0_start,
    +                                            ptrdiff_t *local_n1, ptrdiff_t *local_1_start);
    +ptrdiff_t fftw_mpi_local_size_transposed(int rnk, const ptrdiff_t *n, MPI_Comm comm,
    +                                         ptrdiff_t *local_n0, ptrdiff_t *local_0_start,
    +                                         ptrdiff_t *local_n1, ptrdiff_t *local_1_start);
    +
    + +

    These functions return the number of elements to allocate (complex +numbers for DFT/r2c/c2r plans, real numbers for r2r plans), whereas +the local_n0 and local_0_start return the portion +(local_0_start to local_0_start + local_n0 - 1) of the +first dimension of an n0 × n1 × n2 × … × nd-1 + array that is stored on the local +process. See Basic and advanced distribution interfaces. For +FFTW_MPI_TRANSPOSED_OUT plans, the ‘_transposed’ variants +are useful in order to also return the local portion of the first +dimension in the n1 × n0 × n2 ×…× nd-1 + transposed output. +See Transposed distributions. +The advanced interface for multidimensional transforms is: +

    + + + +
    +
    ptrdiff_t fftw_mpi_local_size_many(int rnk, const ptrdiff_t *n, ptrdiff_t howmany,
    +                                   ptrdiff_t block0, MPI_Comm comm,
    +                                   ptrdiff_t *local_n0, ptrdiff_t *local_0_start);
    +ptrdiff_t fftw_mpi_local_size_many_transposed(int rnk, const ptrdiff_t *n, ptrdiff_t howmany,
    +                                              ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm,
    +                                              ptrdiff_t *local_n0, ptrdiff_t *local_0_start,
    +                                              ptrdiff_t *local_n1, ptrdiff_t *local_1_start);
    +
    + +

    These differ from the basic interface in only two ways. First, they +allow you to specify block sizes block0 and block1 (the +latter for the transposed output); you can pass +FFTW_MPI_DEFAULT_BLOCK to use FFTW’s default block size as in +the basic interface. Second, you can pass a howmany parameter, +corresponding to the advanced planning interface below: this is for +transforms of contiguous howmany-tuples of numbers +(howmany = 1 in the basic interface). +

    +

    The corresponding basic and advanced routines for one-dimensional +transforms (currently only complex DFTs) are: +

    + + +
    +
    ptrdiff_t fftw_mpi_local_size_1d(
    +             ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags,
    +             ptrdiff_t *local_ni, ptrdiff_t *local_i_start,
    +             ptrdiff_t *local_no, ptrdiff_t *local_o_start);
    +ptrdiff_t fftw_mpi_local_size_many_1d(
    +             ptrdiff_t n0, ptrdiff_t howmany,
    +             MPI_Comm comm, int sign, unsigned flags,
    +             ptrdiff_t *local_ni, ptrdiff_t *local_i_start,
    +             ptrdiff_t *local_no, ptrdiff_t *local_o_start);
    +
    + + + +

    As above, the return value is the number of elements to allocate +(complex numbers, for complex DFTs). The local_ni and +local_i_start arguments return the portion +(local_i_start to local_i_start + local_ni - 1) of the +1d array that is stored on this process for the transform +input, and local_no and local_o_start are the +corresponding quantities for the input. The sign +(FFTW_FORWARD or FFTW_BACKWARD) and flags must +match the arguments passed when creating a plan. Although the inputs +and outputs have different data distributions in general, it is +guaranteed that the output data distribution of an +FFTW_FORWARD plan will match the input data distribution +of an FFTW_BACKWARD plan and vice versa; similarly for the +FFTW_MPI_SCRAMBLED_OUT and FFTW_MPI_SCRAMBLED_IN flags. +See One-dimensional distributions. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Data-Distribution.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Data-Distribution.html new file mode 100644 index 000000000..add0bacfb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Data-Distribution.html @@ -0,0 +1,150 @@ + + + + + +FFTW 3.3.8: MPI Data Distribution + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.4 MPI Data Distribution

    + + +

    The most important concept to understand in using FFTW’s MPI interface +is the data distribution. With a serial or multithreaded FFT, all of +the inputs and outputs are stored as a single contiguous chunk of +memory. With a distributed-memory FFT, the inputs and outputs are +broken into disjoint blocks, one per process. +

    +

    In particular, FFTW uses a 1d block distribution of the data, +distributed along the first dimension. For example, if you +want to perform a 100 × 200 + complex DFT, distributed over 4 +processes, each process will get a 25 × 200 + slice of the data. +That is, process 0 will get rows 0 through 24, process 1 will get rows +25 through 49, process 2 will get rows 50 through 74, and process 3 +will get rows 75 through 99. If you take the same array but +distribute it over 3 processes, then it is not evenly divisible so the +different processes will have unequal chunks. FFTW’s default choice +in this case is to assign 34 rows to processes 0 and 1, and 32 rows to +process 2. + +

    + +

    FFTW provides several ‘fftw_mpi_local_size’ routines that you can +call to find out what portion of an array is stored on the current +process. In most cases, you should use the default block sizes picked +by FFTW, but it is also possible to specify your own block size. For +example, with a 100 × 200 + array on three processes, you can +tell FFTW to use a block size of 40, which would assign 40 rows to +processes 0 and 1, and 20 rows to process 2. FFTW’s default is to +divide the data equally among the processes if possible, and as best +it can otherwise. The rows are always assigned in “rank order,” +i.e. process 0 gets the first block of rows, then process 1, and so +on. (You can change this by using MPI_Comm_split to create a +new communicator with re-ordered processes.) However, you should +always call the ‘fftw_mpi_local_size’ routines, if possible, +rather than trying to predict FFTW’s distribution choices. +

    +

    In particular, it is critical that you allocate the storage size that +is returned by ‘fftw_mpi_local_size’, which is not +necessarily the size of the local slice of the array. The reason is +that intermediate steps of FFTW’s algorithms involve transposing the +array and redistributing the data, so at these intermediate steps FFTW +may require more local storage space (albeit always proportional to +the total size divided by the number of processes). The +‘fftw_mpi_local_size’ functions know how much storage is required +for these intermediate steps and tell you the correct amount to +allocate. +

    + + + + + + + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Files-and-Data-Types.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Files-and-Data-Types.html new file mode 100644 index 000000000..cc3273723 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Files-and-Data-Types.html @@ -0,0 +1,106 @@ + + + + + +FFTW 3.3.8: MPI Files and Data Types + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12.1 MPI Files and Data Types

    + +

    All programs using FFTW’s MPI support should include its header file: +

    +
    +
    #include <fftw3-mpi.h>
    +
    + +

    Note that this header file includes the serial-FFTW fftw3.h +header file, and also the mpi.h header file for MPI, so you +need not include those files separately. +

    +

    You must also link to both the FFTW MPI library and to the +serial FFTW library. On Unix, this means adding -lfftw3_mpi +-lfftw3 -lm at the end of the link command. +

    + +

    Different precisions are handled as in the serial interface: +See Precision. That is, ‘fftw_’ functions become +fftwf_ (in single precision) etcetera, and the libraries become +-lfftw3f_mpi -lfftw3f -lm etcetera on Unix. Long-double +precision is supported in MPI, but quad precision (‘fftwq_’) is +not due to the lack of MPI support for this type. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Initialization.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Initialization.html new file mode 100644 index 000000000..a44689fe8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Initialization.html @@ -0,0 +1,114 @@ + + + + + +FFTW 3.3.8: MPI Initialization + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12.2 MPI Initialization

    + +

    Before calling any other FFTW MPI (‘fftw_mpi_’) function, and +before importing any wisdom for MPI problems, you must call: +

    + +
    +
    void fftw_mpi_init(void);
    +
    + + +

    If FFTW threads support is used, however, fftw_mpi_init should +be called after fftw_init_threads (see Combining MPI and Threads). Calling fftw_mpi_init additional times (before +fftw_mpi_cleanup) has no effect. +

    + +

    If you want to deallocate all persistent data and reset FFTW to the +pristine state it was in when you started your program, you can call: +

    + +
    +
    void fftw_mpi_cleanup(void);
    +
    + + +

    (This calls fftw_cleanup, so you need not call the serial +cleanup routine too, although it is safe to do so.) After calling +fftw_mpi_cleanup, all existing plans become undefined, and you +should not attempt to execute or destroy them. You must call +fftw_mpi_init again after fftw_mpi_cleanup if you want +to resume using the MPI FFTW routines. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Plan-Creation.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Plan-Creation.html new file mode 100644 index 000000000..76efb091a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Plan-Creation.html @@ -0,0 +1,329 @@ + + + + + +FFTW 3.3.8: MPI Plan Creation + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12.5 MPI Plan Creation

    + + +

    Complex-data MPI DFTs

    + +

    Plans for complex-data DFTs (see 2d MPI example) are created by: +

    + + + + + +
    +
    fftw_plan fftw_mpi_plan_dft_1d(ptrdiff_t n0, fftw_complex *in, fftw_complex *out,
    +                               MPI_Comm comm, int sign, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_2d(ptrdiff_t n0, ptrdiff_t n1,
    +                               fftw_complex *in, fftw_complex *out,
    +                               MPI_Comm comm, int sign, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,
    +                               fftw_complex *in, fftw_complex *out,
    +                               MPI_Comm comm, int sign, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft(int rnk, const ptrdiff_t *n, 
    +                            fftw_complex *in, fftw_complex *out,
    +                            MPI_Comm comm, int sign, unsigned flags);
    +fftw_plan fftw_mpi_plan_many_dft(int rnk, const ptrdiff_t *n,
    +                                 ptrdiff_t howmany, ptrdiff_t block, ptrdiff_t tblock,
    +                                 fftw_complex *in, fftw_complex *out,
    +                                 MPI_Comm comm, int sign, unsigned flags);
    +
    + + + +

    These are similar to their serial counterparts (see Complex DFTs) +in specifying the dimensions, sign, and flags of the transform. The +comm argument gives an MPI communicator that specifies the set +of processes to participate in the transform; plan creation is a +collective function that must be called for all processes in the +communicator. The in and out pointers refer only to a +portion of the overall transform data (see MPI Data Distribution) +as specified by the ‘local_size’ functions in the previous +section. Unless flags contains FFTW_ESTIMATE, these +arrays are overwritten during plan creation as for the serial +interface. For multi-dimensional transforms, any dimensions > +1 are supported; for one-dimensional transforms, only composite +(non-prime) n0 are currently supported (unlike the serial +FFTW). Requesting an unsupported transform size will yield a +NULL plan. (As in the serial interface, highly composite sizes +generally yield the best performance.) +

    + + + +

    The advanced-interface fftw_mpi_plan_many_dft additionally +allows you to specify the block sizes for the first dimension +(block) of the n0 × n1 × n2 × … × nd-1 + input data and the first dimension +(tblock) of the n1 × n0 × n2 ×…× nd-1 + transposed data (at intermediate +steps of the transform, and for the output if +FFTW_TRANSPOSED_OUT is specified in flags). These must +be the same block sizes as were passed to the corresponding +‘local_size’ function; you can pass FFTW_MPI_DEFAULT_BLOCK +to use FFTW’s default block size as in the basic interface. Also, the +howmany parameter specifies that the transform is of contiguous +howmany-tuples rather than individual complex numbers; this +corresponds to the same parameter in the serial advanced interface +(see Advanced Complex DFTs) with stride = howmany and +dist = 1. +

    + +

    MPI flags

    + +

    The flags can be any of those for the serial FFTW +(see Planner Flags), and in addition may include one or more of +the following MPI-specific flags, which improve performance at the +cost of changing the output or input data formats. +

    +
      +
    • + +FFTW_MPI_SCRAMBLED_OUT, FFTW_MPI_SCRAMBLED_IN: valid for +1d transforms only, these flags indicate that the output/input of the +transform are in an undocumented “scrambled” order. A forward +FFTW_MPI_SCRAMBLED_OUT transform can be inverted by a backward +FFTW_MPI_SCRAMBLED_IN (times the usual 1/N normalization). +See One-dimensional distributions. + +
    • + +FFTW_MPI_TRANSPOSED_OUT, FFTW_MPI_TRANSPOSED_IN: valid +for multidimensional (rnk > 1) transforms only, these flags +specify that the output or input of an n0 × n1 × n2 × … × nd-1 + transform is +transposed to n1 × n0 × n2 ×…× nd-1 +. See Transposed distributions. + +
    + + +

    Real-data MPI DFTs

    + + +

    Plans for real-input/output (r2c/c2r) DFTs (see Multi-dimensional MPI DFTs of Real Data) are created by: +

    + + + + + + + + +
    +
    fftw_plan fftw_mpi_plan_dft_r2c_2d(ptrdiff_t n0, ptrdiff_t n1, 
    +                                   double *in, fftw_complex *out,
    +                                   MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_r2c_2d(ptrdiff_t n0, ptrdiff_t n1, 
    +                                   double *in, fftw_complex *out,
    +                                   MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_r2c_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,
    +                                   double *in, fftw_complex *out,
    +                                   MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_r2c(int rnk, const ptrdiff_t *n,
    +                                double *in, fftw_complex *out,
    +                                MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_c2r_2d(ptrdiff_t n0, ptrdiff_t n1, 
    +                                   fftw_complex *in, double *out,
    +                                   MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_c2r_2d(ptrdiff_t n0, ptrdiff_t n1, 
    +                                   fftw_complex *in, double *out,
    +                                   MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_c2r_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,
    +                                   fftw_complex *in, double *out,
    +                                   MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_dft_c2r(int rnk, const ptrdiff_t *n,
    +                                fftw_complex *in, double *out,
    +                                MPI_Comm comm, unsigned flags);
    +
    + +

    Similar to the serial interface (see Real-data DFTs), these +transform logically n0 × n1 × n2 × … × nd-1 + real data to/from n0 × n1 × n2 × … × (nd-1/2 + 1) + complex +data, representing the non-redundant half of the conjugate-symmetry +output of a real-input DFT (see Multi-dimensional Transforms). +However, the real array must be stored within a padded n0 × n1 × n2 × … × [2 (nd-1/2 + 1)] + +array (much like the in-place serial r2c transforms, but here for +out-of-place transforms as well). Currently, only multi-dimensional +(rnk > 1) r2c/c2r transforms are supported (requesting a plan +for rnk = 1 will yield NULL). As explained above +(see Multi-dimensional MPI DFTs of Real Data), the data +distribution of both the real and complex arrays is given by the +‘local_size’ function called for the dimensions of the +complex array. Similar to the other planning functions, the +input and output arrays are overwritten when the plan is created +except in FFTW_ESTIMATE mode. +

    +

    As for the complex DFTs above, there is an advance interface that +allows you to manually specify block sizes and to transform contiguous +howmany-tuples of real/complex numbers: +

    + + +
    +
    fftw_plan fftw_mpi_plan_many_dft_r2c
    +              (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,
    +               ptrdiff_t iblock, ptrdiff_t oblock,
    +               double *in, fftw_complex *out,
    +               MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_many_dft_c2r
    +              (int rnk, const ptrdiff_t *n, ptrdiff_t howmany,
    +               ptrdiff_t iblock, ptrdiff_t oblock,
    +               fftw_complex *in, double *out,
    +               MPI_Comm comm, unsigned flags);               
    +
    + + +

    MPI r2r transforms

    + + +

    There are corresponding plan-creation routines for r2r +transforms (see More DFTs of Real Data), currently supporting +multidimensional (rnk > 1) transforms only (rnk = 1 will +yield a NULL plan): +

    +
    +
    fftw_plan fftw_mpi_plan_r2r_2d(ptrdiff_t n0, ptrdiff_t n1,
    +                               double *in, double *out,
    +                               MPI_Comm comm,
    +                               fftw_r2r_kind kind0, fftw_r2r_kind kind1,
    +                               unsigned flags);
    +fftw_plan fftw_mpi_plan_r2r_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2,
    +                               double *in, double *out,
    +                               MPI_Comm comm,
    +                               fftw_r2r_kind kind0, fftw_r2r_kind kind1, fftw_r2r_kind kind2,
    +                               unsigned flags);
    +fftw_plan fftw_mpi_plan_r2r(int rnk, const ptrdiff_t *n,
    +                            double *in, double *out,
    +                            MPI_Comm comm, const fftw_r2r_kind *kind, 
    +                            unsigned flags);
    +fftw_plan fftw_mpi_plan_many_r2r(int rnk, const ptrdiff_t *n,
    +                                 ptrdiff_t iblock, ptrdiff_t oblock,
    +                                 double *in, double *out,
    +                                 MPI_Comm comm, const fftw_r2r_kind *kind, 
    +                                 unsigned flags);
    +
    + +

    The parameters are much the same as for the complex DFTs above, except +that the arrays are of real numbers (and hence the outputs of the +‘local_size’ data-distribution functions should be interpreted as +counts of real rather than complex numbers). Also, the kind +parameters specify the r2r kinds along each dimension as for the +serial interface (see Real-to-Real Transform Kinds). See Other Multi-dimensional Real-data MPI Transforms. +

    + +

    MPI transposition

    + + +

    FFTW also provides routines to plan a transpose of a distributed +n0 by n1 array of real numbers, or an array of +howmany-tuples of real numbers with specified block sizes +(see FFTW MPI Transposes): +

    + + +
    +
    fftw_plan fftw_mpi_plan_transpose(ptrdiff_t n0, ptrdiff_t n1,
    +                                  double *in, double *out,
    +                                  MPI_Comm comm, unsigned flags);
    +fftw_plan fftw_mpi_plan_many_transpose
    +                (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany,
    +                 ptrdiff_t block0, ptrdiff_t block1,
    +                 double *in, double *out, MPI_Comm comm, unsigned flags);
    +
    + + + +

    These plans are used with the fftw_mpi_execute_r2r new-array +execute function (see Using MPI Plans), since they count as (rank +zero) r2r plans from FFTW’s perspective. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Wisdom-Communication.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Wisdom-Communication.html new file mode 100644 index 000000000..629d04b51 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/MPI-Wisdom-Communication.html @@ -0,0 +1,107 @@ + + + + + +FFTW 3.3.8: MPI Wisdom Communication + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12.6 MPI Wisdom Communication

    + +

    To facilitate synchronizing wisdom among the different MPI processes, +we provide two functions: +

    + + +
    +
    void fftw_mpi_gather_wisdom(MPI_Comm comm);
    +void fftw_mpi_broadcast_wisdom(MPI_Comm comm);
    +
    + +

    The fftw_mpi_gather_wisdom function gathers all wisdom in the +given communicator comm to the process of rank 0 in the +communicator: that process obtains the union of all wisdom on all the +processes. As a side effect, some other processes will gain +additional wisdom from other processes, but only process 0 will gain +the complete union. +

    +

    The fftw_mpi_broadcast_wisdom does the reverse: it exports +wisdom from process 0 in comm to all other processes in the +communicator, replacing any wisdom they currently have. +

    +

    See FFTW MPI Wisdom. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Memory-Allocation.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Memory-Allocation.html new file mode 100644 index 000000000..0c7d4816f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Memory-Allocation.html @@ -0,0 +1,131 @@ + + + + + +FFTW 3.3.8: Memory Allocation + + + + + + + + + + + + + + + + + + + + +
    +

    +Previous: , Up: Data Types and Files   [Contents][Index]

    +
    +
    + +

    4.1.3 Memory Allocation

    + +
    +
    void *fftw_malloc(size_t n);
    +void fftw_free(void *p);
    +
    + + + +

    These are functions that behave identically to malloc and +free, except that they guarantee that the returned pointer obeys +any special alignment restrictions imposed by any algorithm in FFTW +(e.g. for SIMD acceleration). See SIMD alignment and fftw_malloc. + +

    + +

    Data allocated by fftw_malloc must be deallocated by +fftw_free and not by the ordinary free. +

    +

    These routines simply call through to your operating system’s +malloc or, if necessary, its aligned equivalent +(e.g. memalign), so you normally need not worry about any +significant time or space overhead. You are not required to use +them to allocate your data, but we strongly recommend it. +

    +

    Note: in C++, just as with ordinary malloc, you must typecast +the output of fftw_malloc to whatever pointer type you are +allocating. + +

    + +

    We also provide the following two convenience functions to allocate +real and complex arrays with n elements, which are equivalent +to (double *) fftw_malloc(sizeof(double) * n) and +(fftw_complex *) fftw_malloc(sizeof(fftw_complex) * n), +respectively: +

    +
    +
    double *fftw_alloc_real(size_t n);
    +fftw_complex *fftw_alloc_complex(size_t n);
    +
    + + + +

    The equivalent functions in other precisions allocate arrays of n +elements in that precision. e.g. fftwf_alloc_real(n) is +equivalent to (float *) fftwf_malloc(sizeof(float) * n). + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/More-DFTs-of-Real-Data.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/More-DFTs-of-Real-Data.html new file mode 100644 index 000000000..43258208d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/More-DFTs-of-Real-Data.html @@ -0,0 +1,168 @@ + + + + + +FFTW 3.3.8: More DFTs of Real Data + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.5 More DFTs of Real Data

    + + + + + + +

    FFTW supports several other transform types via a unified r2r +(real-to-real) interface, + +so called because it takes a real (double) array and outputs a +real array of the same size. These r2r transforms currently fall into +three categories: DFTs of real input and complex-Hermitian output in +halfcomplex format, DFTs of real input with even/odd symmetry +(a.k.a. discrete cosine/sine transforms, DCTs/DSTs), and discrete +Hartley transforms (DHTs), all described in more detail by the +following sections. +

    +

    The r2r transforms follow the by now familiar interface of creating an +fftw_plan, executing it with fftw_execute(plan), and +destroying it with fftw_destroy_plan(plan). Furthermore, all +r2r transforms share the same planner interface: +

    +
    +
    fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out,
    +                           fftw_r2r_kind kind, unsigned flags);
    +fftw_plan fftw_plan_r2r_2d(int n0, int n1, double *in, double *out,
    +                           fftw_r2r_kind kind0, fftw_r2r_kind kind1,
    +                           unsigned flags);
    +fftw_plan fftw_plan_r2r_3d(int n0, int n1, int n2,
    +                           double *in, double *out,
    +                           fftw_r2r_kind kind0,
    +                           fftw_r2r_kind kind1,
    +                           fftw_r2r_kind kind2,
    +                           unsigned flags);
    +fftw_plan fftw_plan_r2r(int rank, const int *n, double *in, double *out,
    +                        const fftw_r2r_kind *kind, unsigned flags);
    +
    + + + + + +

    Just as for the complex DFT, these plan 1d/2d/3d/multi-dimensional +transforms for contiguous arrays in row-major order, transforming (real) +input to output of the same size, where n specifies the +physical dimensions of the arrays. All positive n are +supported (with the exception of n=1 for the FFTW_REDFT00 +kind, noted in the real-even subsection below); products of small +factors are most efficient (factorizing n-1 and n+1 for +FFTW_REDFT00 and FFTW_RODFT00 kinds, described below), but +an O(n log n) + algorithm is used even for prime sizes. +

    +

    Each dimension has a kind parameter, of type +fftw_r2r_kind, specifying the kind of r2r transform to be used +for that dimension. + + +(In the case of fftw_plan_r2r, this is an array kind[rank] +where kind[i] is the transform kind for the dimension +n[i].) The kind can be one of a set of predefined constants, +defined in the following subsections. +

    +

    In other words, FFTW computes the separable product of the specified +r2r transforms over each dimension, which can be used e.g. for partial +differential equations with mixed boundary conditions. (For some r2r +kinds, notably the halfcomplex DFT and the DHT, such a separable +product is somewhat problematic in more than one dimension, however, +as is described below.) +

    +

    In the current version of FFTW, all r2r transforms except for the +halfcomplex type are computed via pre- or post-processing of +halfcomplex transforms, and they are therefore not as fast as they +could be. Since most other general DCT/DST codes employ a similar +algorithm, however, FFTW’s implementation should provide at least +competitive performance. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002dDimensional-DFTs-of-Real-Data.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002dDimensional-DFTs-of-Real-Data.html new file mode 100644 index 000000000..398df66e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002dDimensional-DFTs-of-Real-Data.html @@ -0,0 +1,178 @@ + + + + + +FFTW 3.3.8: Multi-Dimensional DFTs of Real Data + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.4 Multi-Dimensional DFTs of Real Data

    + +

    Multi-dimensional DFTs of real data use the following planner routines: +

    +
    +
    fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1,
    +                               double *in, fftw_complex *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2,
    +                               double *in, fftw_complex *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_r2c(int rank, const int *n,
    +                            double *in, fftw_complex *out,
    +                            unsigned flags);
    +
    + + + + +

    as well as the corresponding c2r routines with the input/output +types swapped. These routines work similarly to their complex +analogues, except for the fact that here the complex output array is cut +roughly in half and the real array requires padding for in-place +transforms (as in 1d, above). +

    +

    As before, n is the logical size of the array, and the +consequences of this on the the format of the complex arrays deserve +careful attention. + +Suppose that the real data has dimensions n0 × n1 × n2 × … × nd-1 + (in row-major order). +Then, after an r2c transform, the output is an n0 × n1 × n2 × … × (nd-1/2 + 1) + array of +fftw_complex values in row-major order, corresponding to slightly +over half of the output of the corresponding complex DFT. (The division +is rounded down.) The ordering of the data is otherwise exactly the +same as in the complex-DFT case. +

    +

    For out-of-place transforms, this is the end of the story: the real +data is stored as a row-major array of size n0 × n1 × n2 × … × nd-1 + and the complex +data is stored as a row-major array of size n0 × n1 × n2 × … × (nd-1/2 + 1) +. +

    +

    For in-place transforms, however, extra padding of the real-data array +is necessary because the complex array is larger than the real array, +and the two arrays share the same memory locations. Thus, for +in-place transforms, the final dimension of the real-data array must +be padded with extra values to accommodate the size of the complex +data—two values if the last dimension is even and one if it is odd. + +That is, the last dimension of the real data must physically contain +2 * (nd-1/2+1) +double values (exactly enough to hold the complex data). +This physical array size does not, however, change the logical +array size—only +nd-1 +values are actually stored in the last dimension, and +nd-1 +is the last dimension passed to the plan-creation routine. +

    +

    For example, consider the transform of a two-dimensional real array of +size n0 by n1. The output of the r2c transform is a +two-dimensional complex array of size n0 by n1/2+1, where +the y dimension has been cut nearly in half because of +redundancies in the output. Because fftw_complex is twice the +size of double, the output array is slightly bigger than the +input array. Thus, if we want to compute the transform in place, we +must pad the input array so that it is of size n0 by +2*(n1/2+1). If n1 is even, then there are two padding +elements at the end of each row (which need not be initialized, as they +are only used for output). +

    +

    The following illustration depicts the input and output arrays just +described, for both the out-of-place and in-place transforms (with the +arrows indicating consecutive memory locations): +rfftwnd-for-html +

    +

    These transforms are unnormalized, so an r2c followed by a c2r +transform (or vice versa) will result in the original data scaled by +the number of real data elements—that is, the product of the +(logical) dimensions of the real data. + +

    + +

    (Because the last dimension is treated specially, if it is equal to +1 the transform is not equivalent to a lower-dimensional +r2c/c2r transform. In that case, the last complex dimension also has +size 1 (=1/2+1), and no advantage is gained over the +complex transforms.) +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-Array-Format.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-Array-Format.html new file mode 100644 index 000000000..669781847 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-Array-Format.html @@ -0,0 +1,102 @@ + + + + + +FFTW 3.3.8: Multi-dimensional Array Format + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.2 Multi-dimensional Array Format

    + +

    This section describes the format in which multi-dimensional arrays +are stored in FFTW. We felt that a detailed discussion of this topic +was necessary. Since several different formats are common, this topic +is often a source of confusion. +

    + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-MPI-DFTs-of-Real-Data.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-MPI-DFTs-of-Real-Data.html new file mode 100644 index 000000000..fd4856058 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-MPI-DFTs-of-Real-Data.html @@ -0,0 +1,206 @@ + + + + + +FFTW 3.3.8: Multi-dimensional MPI DFTs of Real Data + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.5 Multi-dimensional MPI DFTs of Real Data

    + +

    FFTW’s MPI interface also supports multi-dimensional DFTs of real +data, similar to the serial r2c and c2r interfaces. (Parallel +one-dimensional real-data DFTs are not currently supported; you must +use a complex transform and set the imaginary parts of the inputs to +zero.) +

    +

    The key points to understand for r2c and c2r MPI transforms (compared +to the MPI complex DFTs or the serial r2c/c2r transforms), are: +

    +
      +
    • Just as for serial transforms, r2c/c2r DFTs transform n0 × n1 × n2 × … × nd-1 + real +data to/from n0 × n1 × n2 × … × (nd-1/2 + 1) + complex data: the last dimension of the +complex data is cut in half (rounded down), plus one. As for the +serial transforms, the sizes you pass to the ‘plan_dft_r2c’ and +‘plan_dft_c2r’ are the n0 × n1 × n2 × … × nd-1 + dimensions of the real data. + +
    • +Although the real data is conceptually n0 × n1 × n2 × … × nd-1 +, it is +physically stored as an n0 × n1 × n2 × … × [2 (nd-1/2 + 1)] + array, where the last +dimension has been padded to make it the same size as the +complex output. This is much like the in-place serial r2c/c2r +interface (see Multi-Dimensional DFTs of Real Data), except that +in MPI the padding is required even for out-of-place data. The extra +padding numbers are ignored by FFTW (they are not like +zero-padding the transform to a larger size); they are only used to +determine the data layout. + +
    • +The data distribution in MPI for both the real and complex data +is determined by the shape of the complex data. That is, you +call the appropriate ‘local size’ function for the n0 × n1 × n2 × … × (nd-1/2 + 1) + +complex data, and then use the same distribution for the real +data except that the last complex dimension is replaced by a (padded) +real dimension of twice the length. + +
    + +

    For example suppose we are performing an out-of-place r2c transform of +L × M × N + real data [padded to L × M × 2(N/2+1) +], +resulting in L × M × N/2+1 + complex data. Similar to the +example in 2d MPI example, we might do something like: +

    +
    +
    #include <fftw3-mpi.h>
    +
    +int main(int argc, char **argv)
    +{
    +    const ptrdiff_t L = ..., M = ..., N = ...;
    +    fftw_plan plan;
    +    double *rin;
    +    fftw_complex *cout;
    +    ptrdiff_t alloc_local, local_n0, local_0_start, i, j, k;
    +
    +    MPI_Init(&argc, &argv);
    +    fftw_mpi_init();
    +
    +    /* get local data size and allocate */
    +    alloc_local = fftw_mpi_local_size_3d(L, M, N/2+1, MPI_COMM_WORLD,
    +                                         &local_n0, &local_0_start);
    +    rin = fftw_alloc_real(2 * alloc_local);
    +    cout = fftw_alloc_complex(alloc_local);
    +
    +    /* create plan for out-of-place r2c DFT */
    +    plan = fftw_mpi_plan_dft_r2c_3d(L, M, N, rin, cout, MPI_COMM_WORLD,
    +                                    FFTW_MEASURE);
    +
    +    /* initialize rin to some function my_func(x,y,z) */
    +    for (i = 0; i < local_n0; ++i)
    +       for (j = 0; j < M; ++j)
    +         for (k = 0; k < N; ++k)
    +       rin[(i*M + j) * (2*(N/2+1)) + k] = my_func(local_0_start+i, j, k);
    +
    +    /* compute transforms as many times as desired */
    +    fftw_execute(plan);
    +
    +    fftw_destroy_plan(plan);
    +
    +    MPI_Finalize();
    +}
    +
    + + + +

    Note that we allocated rin using fftw_alloc_real with an +argument of 2 * alloc_local: since alloc_local is the +number of complex values to allocate, the number of real +values is twice as many. The rin array is then +local_n0 × M × 2(N/2+1) + in row-major order, so its +(i,j,k) element is at the index (i*M + j) * (2*(N/2+1)) + +k (see Multi-dimensional Array Format). +

    + + + +

    As for the complex transforms, improved performance can be obtained by +specifying that the output is the transpose of the input or vice versa +(see Transposed distributions). In our L × M × N + r2c +example, including FFTW_TRANSPOSED_OUT in the flags means that +the input would be a padded L × M × 2(N/2+1) + real array +distributed over the L dimension, while the output would be a +M × L × N/2+1 + complex array distributed over the M +dimension. To perform the inverse c2r transform with the same data +distributions, you would use the FFTW_TRANSPOSED_IN flag. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-Transforms.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-Transforms.html new file mode 100644 index 000000000..d6f86c7c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002ddimensional-Transforms.html @@ -0,0 +1,136 @@ + + + + + +FFTW 3.3.8: Multi-dimensional Transforms + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.8.6 Multi-dimensional Transforms

    + +

    The multi-dimensional transforms of FFTW, in general, compute simply the +separable product of the given 1d transform along each dimension of the +array. Since each of these transforms is unnormalized, computing the +forward followed by the backward/inverse multi-dimensional transform +will result in the original array scaled by the product of the +normalization factors for each dimension (e.g. the product of the +dimension sizes, for a multi-dimensional DFT). +

    + + +

    The definition of FFTW’s multi-dimensional DFT of real data (r2c) +deserves special attention. In this case, we logically compute the full +multi-dimensional DFT of the input data; since the input data are purely +real, the output data have the Hermitian symmetry and therefore only one +non-redundant half need be stored. More specifically, for an n0 × n1 × n2 × … × nd-1 + multi-dimensional real-input DFT, the full (logical) complex output array +Y[k0, k1, ..., +kd-1] +has the symmetry: +Y[k0, k1, ..., +kd-1] = Y[n0 - +k0, n1 - k1, ..., +nd-1 - kd-1]* +(where each dimension is periodic). Because of this symmetry, we only +store the +kd-1 = 0...nd-1/2+1 +elements of the last dimension (division by 2 is rounded +down). (We could instead have cut any other dimension in half, but the +last dimension proved computationally convenient.) This results in the +peculiar array format described in more detail by Real-data DFT Array Format. +

    +

    The multi-dimensional c2r transform is simply the unnormalized inverse +of the r2c transform. i.e. it is the same as FFTW’s complex backward +multi-dimensional DFT, operating on a Hermitian input array in the +peculiar format mentioned above and outputting a real array (since the +DFT output is purely real). +

    +

    We should remind the user that the separable product of 1d transforms +along each dimension, as computed by FFTW, is not always the same thing +as the usual multi-dimensional transform. A multi-dimensional +R2HC (or HC2R) transform is not identical to the +multi-dimensional DFT, requiring some post-processing to combine the +requisite real and imaginary parts, as was described in The Halfcomplex-format DFT. Likewise, FFTW’s multidimensional +FFTW_DHT r2r transform is not the same thing as the logical +multi-dimensional discrete Hartley transform defined in the literature, +as discussed in The Discrete Hartley Transform. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002dthreaded-FFTW.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002dthreaded-FFTW.html new file mode 100644 index 000000000..8d1b48f3b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Multi_002dthreaded-FFTW.html @@ -0,0 +1,119 @@ + + + + + +FFTW 3.3.8: Multi-threaded FFTW + + + + + + + + + + + + + + + + + + + + + +
    + +

    5 Multi-threaded FFTW

    + + +

    In this chapter we document the parallel FFTW routines for +shared-memory parallel hardware. These routines, which support +parallel one- and multi-dimensional transforms of both real and +complex data, are the easiest way to take advantage of multiple +processors with FFTW. They work just like the corresponding +uniprocessor transform routines, except that you have an extra +initialization routine to call, and there is a routine to set the +number of threads to employ. Any program that uses the uniprocessor +FFTW can therefore be trivially modified to use the multi-threaded +FFTW. +

    +

    A shared-memory machine is one in which all CPUs can directly access +the same main memory, and such machines are now common due to the +ubiquity of multi-core CPUs. FFTW’s multi-threading support allows +you to utilize these additional CPUs transparently from a single +program. However, this does not necessarily translate into +performance gains—when multiple threads/CPUs are employed, there is +an overhead required for synchronization that may outweigh the +computatational parallelism. Therefore, you can only benefit from +threads if your problem is sufficiently large. + + +

    + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/New_002darray-Execute-Functions.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/New_002darray-Execute-Functions.html new file mode 100644 index 000000000..8b4ec448e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/New_002darray-Execute-Functions.html @@ -0,0 +1,204 @@ + + + + + +FFTW 3.3.8: New-array Execute Functions + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: FFTW Reference   [Contents][Index]

    +
    +
    + +

    4.6 New-array Execute Functions

    + + + +

    Normally, one executes a plan for the arrays with which the plan was +created, by calling fftw_execute(plan) as described in Using Plans. + +However, it is possible for sophisticated users to apply a given plan +to a different array using the “new-array execute” functions +detailed below, provided that the following conditions are met: +

    +
      +
    • The array size, strides, etcetera are the same (since those are set by +the plan). + +
    • The input and output arrays are the same (in-place) or different +(out-of-place) if the plan was originally created to be in-place or +out-of-place, respectively. + +
    • For split arrays, the separations between the real and imaginary +parts, ii-ri and io-ro, are the same as they were for +the input and output arrays when the plan was created. (This +condition is automatically satisfied for interleaved arrays.) + +
    • The alignment of the new input/output arrays is the same as that +of the input/output arrays when the plan was created, unless the plan +was created with the FFTW_UNALIGNED flag. + +Here, the alignment is a platform-dependent quantity (for example, it is +the address modulo 16 if SSE SIMD instructions are used, but the address +modulo 4 for non-SIMD single-precision FFTW on the same machine). In +general, only arrays allocated with fftw_malloc are guaranteed to +be equally aligned (see SIMD alignment and fftw_malloc). + +
    + + +

    The alignment issue is especially critical, because if you don’t use +fftw_malloc then you may have little control over the alignment +of arrays in memory. For example, neither the C++ new function +nor the Fortran allocate statement provide strong enough +guarantees about data alignment. If you don’t use fftw_malloc, +therefore, you probably have to use FFTW_UNALIGNED (which +disables most SIMD support). If possible, it is probably better for +you to simply create multiple plans (creating a new plan is quick once +one exists for a given size), or better yet re-use the same array for +your transforms. +

    + +

    For rare circumstances in which you cannot control the alignment of +allocated memory, but wish to determine where a given array is +aligned like the original array for which a plan was created, you can +use the fftw_alignment_of function: +

    +
    int fftw_alignment_of(double *p);
    +
    +

    Two arrays have equivalent alignment (for the purposes of applying a +plan) if and only if fftw_alignment_of returns the same value +for the corresponding pointers to their data (typecast to double* +if necessary). +

    +

    If you are tempted to use the new-array execute interface because you +want to transform a known bunch of arrays of the same size, you should +probably go use the advanced interface instead (see Advanced Interface)). +

    +

    The new-array execute functions are: +

    +
    +
    void fftw_execute_dft(
    +     const fftw_plan p, 
    +     fftw_complex *in, fftw_complex *out);
    +
    +void fftw_execute_split_dft(
    +     const fftw_plan p, 
    +     double *ri, double *ii, double *ro, double *io);
    +
    +void fftw_execute_dft_r2c(
    +     const fftw_plan p,
    +     double *in, fftw_complex *out);
    +
    +void fftw_execute_split_dft_r2c(
    +     const fftw_plan p,
    +     double *in, double *ro, double *io);
    +
    +void fftw_execute_dft_c2r(
    +     const fftw_plan p,
    +     fftw_complex *in, double *out);
    +
    +void fftw_execute_split_dft_c2r(
    +     const fftw_plan p,
    +     double *ri, double *ii, double *out);
    +
    +void fftw_execute_r2r(
    +     const fftw_plan p, 
    +     double *in, double *out);
    +
    + + + + + + + + +

    These execute the plan to compute the corresponding transform on +the input/output arrays specified by the subsequent arguments. The +input/output array arguments have the same meanings as the ones passed +to the guru planner routines in the preceding sections. The plan +is not modified, and these routines can be called as many times as +desired, or intermixed with calls to the ordinary fftw_execute. +

    +

    The plan must have been created for the transform type +corresponding to the execute function, e.g. it must be a complex-DFT +plan for fftw_execute_dft. Any of the planner routines for that +transform type, from the basic to the guru interface, could have been +used to create the plan, however. +

    +
    +
    +

    +Next: , Previous: , Up: FFTW Reference   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/One_002dDimensional-DFTs-of-Real-Data.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/One_002dDimensional-DFTs-of-Real-Data.html new file mode 100644 index 000000000..c9d90c158 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/One_002dDimensional-DFTs-of-Real-Data.html @@ -0,0 +1,184 @@ + + + + + +FFTW 3.3.8: One-Dimensional DFTs of Real Data + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.3 One-Dimensional DFTs of Real Data

    + +

    In many practical applications, the input data in[i] are purely +real numbers, in which case the DFT output satisfies the “Hermitian” + +redundancy: out[i] is the conjugate of out[n-i]. It is +possible to take advantage of these circumstances in order to achieve +roughly a factor of two improvement in both speed and memory usage. +

    +

    In exchange for these speed and space advantages, the user sacrifices +some of the simplicity of FFTW’s complex transforms. First of all, the +input and output arrays are of different sizes and types: the +input is n real numbers, while the output is n/2+1 +complex numbers (the non-redundant outputs); this also requires slight +“padding” of the input array for + +in-place transforms. Second, the inverse transform (complex to real) +has the side-effect of overwriting its input array, by default. +Neither of these inconveniences should pose a serious problem for +users, but it is important to be aware of them. +

    +

    The routines to perform real-data transforms are almost the same as +those for complex transforms: you allocate arrays of double +and/or fftw_complex (preferably using fftw_malloc or +fftw_alloc_complex), create an fftw_plan, execute it as +many times as you want with fftw_execute(plan), and clean up +with fftw_destroy_plan(plan) (and fftw_free). The only +differences are that the input (or output) is of type double +and there are new routines to create the plan. In one dimension: +

    +
    +
    fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out,
    +                               unsigned flags);
    +
    + + + +

    for the real input to complex-Hermitian output (r2c) and +complex-Hermitian input to real output (c2r) transforms. + + +Unlike the complex DFT planner, there is no sign argument. +Instead, r2c DFTs are always FFTW_FORWARD and c2r DFTs are +always FFTW_BACKWARD. + + +(For single/long-double precision +fftwf and fftwl, double should be replaced by +float and long double, respectively.) + +

    + +

    Here, n is the “logical” size of the DFT, not necessarily the +physical size of the array. In particular, the real (double) +array has n elements, while the complex (fftw_complex) +array has n/2+1 elements (where the division is rounded down). +For an in-place transform, + +in and out are aliased to the same array, which must be +big enough to hold both; so, the real array would actually have +2*(n/2+1) elements, where the elements beyond the first +n are unused padding. (Note that this is very different from +the concept of “zero-padding” a transform to a larger length, which +changes the logical size of the DFT by actually adding new input +data.) The kth element of the complex array is exactly the +same as the kth element of the corresponding complex DFT. All +positive n are supported; products of small factors are most +efficient, but an O(n log n) + algorithm is used even for prime sizes. +

    +

    As noted above, the c2r transform destroys its input array even for +out-of-place transforms. This can be prevented, if necessary, by +including FFTW_PRESERVE_INPUT in the flags, with +unfortunately some sacrifice in performance. + + +This flag is also not currently supported for multi-dimensional real +DFTs (next section). +

    +

    Readers familiar with DFTs of real data will recall that the 0th (the +“DC”) and n/2-th (the “Nyquist” frequency, when n is +even) elements of the complex output are purely real. Some +implementations therefore store the Nyquist element where the DC +imaginary part would go, in order to make the input and output arrays +the same size. Such packing, however, does not generalize well to +multi-dimensional transforms, and the space savings are miniscule in +any case; FFTW does not support it. +

    +

    An alternative interface for one-dimensional r2c and c2r DFTs can be +found in the ‘r2r’ interface (see The Halfcomplex-format DFT), with “halfcomplex”-format output that is the same size +(and type) as the input array. + +That interface, although it is not very useful for multi-dimensional +transforms, may sometimes yield better performance. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/One_002ddimensional-distributions.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/One_002ddimensional-distributions.html new file mode 100644 index 000000000..0fa802960 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/One_002ddimensional-distributions.html @@ -0,0 +1,139 @@ + + + + + +FFTW 3.3.8: One-dimensional distributions + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.4.4 One-dimensional distributions

    + +

    For one-dimensional distributed DFTs using FFTW, matters are slightly +more complicated because the data distribution is more closely tied to +how the algorithm works. In particular, you can no longer pass an +arbitrary block size and must accept FFTW’s default; also, the block +sizes may be different for input and output. Also, the data +distribution depends on the flags and transform direction, in order +for forward and backward transforms to work correctly. +

    +
    +
    ptrdiff_t fftw_mpi_local_size_1d(ptrdiff_t n0, MPI_Comm comm,
    +                int sign, unsigned flags,
    +                ptrdiff_t *local_ni, ptrdiff_t *local_i_start,
    +                ptrdiff_t *local_no, ptrdiff_t *local_o_start);
    +
    + + +

    This function computes the data distribution for a 1d transform of +size n0 with the given transform sign and flags. +Both input and output data use block distributions. The input on the +current process will consist of local_ni numbers starting at +index local_i_start; e.g. if only a single process is used, +then local_ni will be n0 and local_i_start will +be 0. Similarly for the output, with local_no numbers +starting at index local_o_start. The return value of +fftw_mpi_local_size_1d will be the total number of elements to +allocate on the current process (which might be slightly larger than +the local size due to intermediate steps in the algorithm). +

    +

    As mentioned above (see Load balancing), the data will be divided +equally among the processes if n0 is divisible by the +square of the number of processes. In this case, +local_ni will equal local_no. Otherwise, they may be +different. +

    +

    For some applications, such as convolutions, the order of the output +data is irrelevant. In this case, performance can be improved by +specifying that the output data be stored in an FFTW-defined +“scrambled” format. (In particular, this is the analogue of +transposed output in the multidimensional case: scrambled output saves +a communications step.) If you pass FFTW_MPI_SCRAMBLED_OUT in +the flags, then the output is stored in this (undocumented) scrambled +order. Conversely, to perform the inverse transform of data in +scrambled order, pass the FFTW_MPI_SCRAMBLED_IN flag. + + +

    + +

    In MPI FFTW, only composite sizes n0 can be parallelized; we +have not yet implemented a parallel algorithm for large prime sizes. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Other-Important-Topics.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Other-Important-Topics.html new file mode 100644 index 000000000..af1c4057a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Other-Important-Topics.html @@ -0,0 +1,94 @@ + + + + + +FFTW 3.3.8: Other Important Topics + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    3 Other Important Topics

    + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Other-Multi_002ddimensional-Real_002ddata-MPI-Transforms.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Other-Multi_002ddimensional-Real_002ddata-MPI-Transforms.html new file mode 100644 index 000000000..74510f8b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Other-Multi_002ddimensional-Real_002ddata-MPI-Transforms.html @@ -0,0 +1,132 @@ + + + + + +FFTW 3.3.8: Other Multi-dimensional Real-data MPI Transforms + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.6 Other multi-dimensional Real-Data MPI Transforms

    + + +

    FFTW’s MPI interface also supports multi-dimensional ‘r2r’ +transforms of all kinds supported by the serial interface +(e.g. discrete cosine and sine transforms, discrete Hartley +transforms, etc.). Only multi-dimensional ‘r2r’ transforms, not +one-dimensional transforms, are currently parallelized. +

    + +

    These are used much like the multidimensional complex DFTs discussed +above, except that the data is real rather than complex, and one needs +to pass an r2r transform kind (fftw_r2r_kind) for each +dimension as in the serial FFTW (see More DFTs of Real Data). +

    +

    For example, one might perform a two-dimensional L × M + that is +an REDFT10 (DCT-II) in the first dimension and an RODFT10 (DST-II) in +the second dimension with code like: +

    +
    +
        const ptrdiff_t L = ..., M = ...;
    +    fftw_plan plan;
    +    double *data;
    +    ptrdiff_t alloc_local, local_n0, local_0_start, i, j;
    +
    +    /* get local data size and allocate */
    +    alloc_local = fftw_mpi_local_size_2d(L, M, MPI_COMM_WORLD,
    +                                         &local_n0, &local_0_start);
    +    data = fftw_alloc_real(alloc_local);
    +
    +    /* create plan for in-place REDFT10 x RODFT10 */
    +    plan = fftw_mpi_plan_r2r_2d(L, M, data, data, MPI_COMM_WORLD,
    +                                FFTW_REDFT10, FFTW_RODFT10, FFTW_MEASURE);
    +
    +    /* initialize data to some function my_function(x,y) */
    +    for (i = 0; i < local_n0; ++i) for (j = 0; j < M; ++j)
    +       data[i*M + j] = my_function(local_0_start + i, j);
    +
    +    /* compute transforms, in-place, as many times as desired */
    +    fftw_execute(plan);
    +
    +    fftw_destroy_plan(plan);
    +
    + + +

    Notice that we use the same ‘local_size’ functions as we did for +complex data, only now we interpret the sizes in terms of real rather +than complex values, and correspondingly use fftw_alloc_real. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Overview-of-Fortran-interface.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Overview-of-Fortran-interface.html new file mode 100644 index 000000000..28d0984d5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Overview-of-Fortran-interface.html @@ -0,0 +1,173 @@ + + + + + +FFTW 3.3.8: Overview of Fortran interface + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.1 Overview of Fortran interface

    + +

    FFTW provides a file fftw3.f03 that defines Fortran 2003 +interfaces for all of its C routines, except for the MPI routines +described elsewhere, which can be found in the same directory as +fftw3.h (the C header file). In any Fortran subroutine where +you want to use FFTW functions, you should begin with: +

    + +
    +
      use, intrinsic :: iso_c_binding 
    +  include 'fftw3.f03'
    +
    + +

    This includes the interface definitions and the standard +iso_c_binding module (which defines the equivalents of C +types). You can also put the FFTW functions into a module if you +prefer (see Defining an FFTW module). +

    +

    At this point, you can now call anything in the FFTW C interface +directly, almost exactly as in C other than minor changes in syntax. +For example: +

    + + + +
    +
      type(C_PTR) :: plan
    +  complex(C_DOUBLE_COMPLEX), dimension(1024,1000) :: in, out
    +  plan = fftw_plan_dft_2d(1000,1024, in,out, FFTW_FORWARD,FFTW_ESTIMATE)
    +  ...
    +  call fftw_execute_dft(plan, in, out)
    +  ...
    +  call fftw_destroy_plan(plan)
    +
    + +

    A few important things to keep in mind are: +

    +
      +
    • + + + + +FFTW plans are type(C_PTR). Other C types are mapped in the +obvious way via the iso_c_binding standard: int turns +into integer(C_INT), fftw_complex turns into +complex(C_DOUBLE_COMPLEX), double turns into +real(C_DOUBLE), and so on. See FFTW Fortran type reference. + +
    • Functions in C become functions in Fortran if they have a return value, +and subroutines in Fortran otherwise. + +
    • The ordering of the Fortran array dimensions must be reversed +when they are passed to the FFTW plan creation, thanks to differences +in array indexing conventions (see Multi-dimensional Array Format). This is unlike the legacy Fortran interface +(see Fortran-interface routines), which reversed the dimensions +for you. See Reversing array dimensions. + +
    • + +Using ordinary Fortran array declarations like this works, but may +yield suboptimal performance because the data may not be not aligned +to exploit SIMD instructions on modern proessors (see SIMD alignment and fftw_malloc). Better performance will often be obtained +by allocating with ‘fftw_alloc’. See Allocating aligned memory in Fortran. + +
    • +Similar to the legacy Fortran interface (see FFTW Execution in Fortran), we currently recommend not using fftw_execute +but rather using the more specialized functions like +fftw_execute_dft (see New-array Execute Functions). +However, you should execute the plan on the same arrays as the +ones for which you created the plan, unless you are especially +careful. See Plan execution in Fortran. To prevent +you from using fftw_execute by mistake, the fftw3.f03 +file does not provide an fftw_execute interface declaration. + +
    • +Multiple planner flags are combined with ior (equivalent to ‘|’ in C). e.g. FFTW_MEASURE | FFTW_DESTROY_INPUT becomes ior(FFTW_MEASURE, FFTW_DESTROY_INPUT). (You can also use ‘+’ as long as you don’t try to include a given flag more than once.) + +
    + + + + + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Plan-execution-in-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Plan-execution-in-Fortran.html new file mode 100644 index 000000000..996be9883 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Plan-execution-in-Fortran.html @@ -0,0 +1,149 @@ + + + + + +FFTW 3.3.8: Plan execution in Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.4 Plan execution in Fortran

    + +

    In C, in order to use a plan, one normally calls fftw_execute, +which executes the plan to perform the transform on the input/output +arrays passed when the plan was created (see Using Plans). The +corresponding subroutine call in modern Fortran is: +

    +
     call fftw_execute(plan)
    +
    + + +

    However, we have had reports that this causes problems with some +recent optimizing Fortran compilers. The problem is, because the +input/output arrays are not passed as explicit arguments to +fftw_execute, the semantics of Fortran (unlike C) allow the +compiler to assume that the input/output arrays are not changed by +fftw_execute. As a consequence, certain compilers end up +repositioning the call to fftw_execute, assuming incorrectly +that it does nothing to the arrays. +

    +

    There are various workarounds to this, but the safest and simplest +thing is to not use fftw_execute in Fortran. Instead, use the +functions described in New-array Execute Functions, which take +the input/output arrays as explicit arguments. For example, if the +plan is for a complex-data DFT and was created for the arrays +in and out, you would do: +

    +
     call fftw_execute_dft(plan, in, out)
    +
    + + +

    There are a few things to be careful of, however: +

    +
      +
    • + + +You must use the correct type of execute function, matching the way +the plan was created. Complex DFT plans should use +fftw_execute_dft, Real-input (r2c) DFT plans should use use +fftw_execute_dft_r2c, and real-output (c2r) DFT plans should +use fftw_execute_dft_c2r. The various r2r plans should use +fftw_execute_r2r. Fortunately, if you use the wrong one you +will get a compile-time type-mismatch error (unlike legacy Fortran). + +
    • You should normally pass the same input/output arrays that were used when +creating the plan. This is always safe. + +
    • If you pass different input/output arrays compared to +those used when creating the plan, you must abide by all the +restrictions of the new-array execute functions (see New-array Execute Functions). The most tricky of these is the +requirement that the new arrays have the same alignment as the +original arrays; the best (and possibly only) way to guarantee this +is to use the ‘fftw_alloc’ functions to allocate your arrays (see Allocating aligned memory in Fortran). Alternatively, you can +use the FFTW_UNALIGNED flag when creating the +plan, in which case the plan does not depend on the alignment, but +this may sacrifice substantial performance on architectures (like x86) +with SIMD instructions (see SIMD alignment and fftw_malloc). + + +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Planner-Flags.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Planner-Flags.html new file mode 100644 index 000000000..dac22fecf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Planner-Flags.html @@ -0,0 +1,218 @@ + + + + + +FFTW 3.3.8: Planner Flags + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Basic Interface   [Contents][Index]

    +
    +
    + +

    4.3.2 Planner Flags

    + +

    All of the planner routines in FFTW accept an integer flags +argument, which is a bitwise OR (‘|’) of zero or more of the flag +constants defined below. These flags control the rigor (and time) of +the planning process, and can also impose (or lift) restrictions on the +type of transform algorithm that is employed. +

    +

    Important: the planner overwrites the input array during +planning unless a saved plan (see Wisdom) is available for that +problem, so you should initialize your input data after creating the +plan. The only exceptions to this are the FFTW_ESTIMATE and +FFTW_WISDOM_ONLY flags, as mentioned below. +

    +

    In all cases, if wisdom is available for the given problem that was +created with equal-or-greater planning rigor, then the more rigorous +wisdom is used. For example, in FFTW_ESTIMATE mode any available +wisdom is used, whereas in FFTW_PATIENT mode only wisdom created +in patient or exhaustive mode can be used. See Words of Wisdom-Saving Plans. +

    + +

    Planning-rigor flags

    +
      +
    • +FFTW_ESTIMATE specifies that, instead of actual measurements of +different algorithms, a simple heuristic is used to pick a (probably +sub-optimal) plan quickly. With this flag, the input/output arrays are +not overwritten during planning. + +
    • +FFTW_MEASURE tells FFTW to find an optimized plan by actually +computing several FFTs and measuring their execution time. +Depending on your machine, this can take some time (often a few +seconds). FFTW_MEASURE is the default planning option. + +
    • +FFTW_PATIENT is like FFTW_MEASURE, but considers a wider +range of algorithms and often produces a “more optimal” plan +(especially for large transforms), but at the expense of several times +longer planning time (especially for large transforms). + +
    • +FFTW_EXHAUSTIVE is like FFTW_PATIENT, but considers an +even wider range of algorithms, including many that we think are +unlikely to be fast, to produce the most optimal plan but with a +substantially increased planning time. + +
    • +FFTW_WISDOM_ONLY is a special planning mode in which the plan +is only created if wisdom is available for the given problem, and +otherwise a NULL plan is returned. This can be combined with +other flags, e.g. ‘FFTW_WISDOM_ONLY | FFTW_PATIENT’ creates a +plan only if wisdom is available that was created in +FFTW_PATIENT or FFTW_EXHAUSTIVE mode. The +FFTW_WISDOM_ONLY flag is intended for users who need to detect +whether wisdom is available; for example, if wisdom is not available +one may wish to allocate new arrays for planning so that user data is +not overwritten. + +
    + + +

    Algorithm-restriction flags

    +
      +
    • +FFTW_DESTROY_INPUT specifies that an out-of-place transform is +allowed to overwrite its input array with arbitrary data; this +can sometimes allow more efficient algorithms to be employed. + + +
    • +FFTW_PRESERVE_INPUT specifies that an out-of-place transform must +not change its input array. This is ordinarily the +default, except for c2r and hc2r (i.e. complex-to-real) +transforms for which FFTW_DESTROY_INPUT is the default. In the +latter cases, passing FFTW_PRESERVE_INPUT will attempt to use +algorithms that do not destroy the input, at the expense of worse +performance; for multi-dimensional c2r transforms, however, no +input-preserving algorithms are implemented and the planner will return +NULL if one is requested. + + + +
    • + + + +FFTW_UNALIGNED specifies that the algorithm may not impose any +unusual alignment requirements on the input/output arrays (i.e. no +SIMD may be used). This flag is normally not necessary, since +the planner automatically detects misaligned arrays. The only use for +this flag is if you want to use the new-array execute interface to +execute a given plan on a different array that may not be aligned like +the original. (Using fftw_malloc makes this flag unnecessary +even then. You can also use fftw_alignment_of to detect +whether two arrays are equivalently aligned.) + +
    + + +

    Limiting planning time

    + +
    +
    extern void fftw_set_timelimit(double seconds);
    +
    + + +

    This function instructs FFTW to spend at most seconds seconds +(approximately) in the planner. If seconds == +FFTW_NO_TIMELIMIT (the default value, which is negative), then +planning time is unbounded. Otherwise, FFTW plans with a +progressively wider range of algorithms until the the given time limit +is reached or the given range of algorithms is explored, returning the +best available plan. + +

    + +

    For example, specifying FFTW_PATIENT first plans in +FFTW_ESTIMATE mode, then in FFTW_MEASURE mode, then +finally (time permitting) in FFTW_PATIENT. If +FFTW_EXHAUSTIVE is specified instead, the planner will further +progress to FFTW_EXHAUSTIVE mode. +

    +

    Note that the seconds argument specifies only a rough limit; in +practice, the planner may use somewhat more time if the time limit is +reached when the planner is in the middle of an operation that cannot +be interrupted. At the very least, the planner will complete planning +in FFTW_ESTIMATE mode (which is thus equivalent to a time limit +of 0). +

    + +
    +
    +

    +Next: , Previous: , Up: Basic Interface   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Precision.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Precision.html new file mode 100644 index 000000000..4e718588a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Precision.html @@ -0,0 +1,124 @@ + + + + + +FFTW 3.3.8: Precision + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.1.2 Precision

    + + +

    You can install single and long-double precision versions of FFTW, +which replace double with float and long double, +respectively (see Installation and Customization). To use these +interfaces, you: +

    +
      +
    • Link to the single/long-double libraries; on Unix, -lfftw3f or +-lfftw3l instead of (or in addition to) -lfftw3. (You +can link to the different-precision libraries simultaneously.) + +
    • Include the same <fftw3.h> header file. + +
    • Replace all lowercase instances of ‘fftw_’ with ‘fftwf_’ or +‘fftwl_’ for single or long-double precision, respectively. +(fftw_complex becomes fftwf_complex, fftw_execute +becomes fftwf_execute, etcetera.) + +
    • Uppercase names, i.e. names beginning with ‘FFTW_’, remain the +same. + +
    • Replace double with float or long double for +subroutine parameters. + +
    + +

    Depending upon your compiler and/or hardware, long double may not +be any more precise than double (or may not be supported at all, +although it is standard in C99). + +

    + +

    We also support using the nonstandard __float128 +quadruple-precision type provided by recent versions of gcc on +32- and 64-bit x86 hardware (see Installation and Customization). +To use this type, link with -lfftw3q -lquadmath -lm (the +libquadmath library provided by gcc is needed for +quadruple-precision trigonometric functions) and use ‘fftwq_’ +identifiers. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real-even_002fodd-DFTs-_0028cosine_002fsine-transforms_0029.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real-even_002fodd-DFTs-_0028cosine_002fsine-transforms_0029.html new file mode 100644 index 000000000..fee8d4bc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real-even_002fodd-DFTs-_0028cosine_002fsine-transforms_0029.html @@ -0,0 +1,251 @@ + + + + + +FFTW 3.3.8: Real even/odd DFTs (cosine/sine transforms) + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.5.2 Real even/odd DFTs (cosine/sine transforms)

    + +

    The Fourier transform of a real-even function f(-x) = f(x) is +real-even, and i times the Fourier transform of a real-odd +function f(-x) = -f(x) is real-odd. Similar results hold for a +discrete Fourier transform, and thus for these symmetries the need for +complex inputs/outputs is entirely eliminated. Moreover, one gains a +factor of two in speed/space from the fact that the data are real, and +an additional factor of two from the even/odd symmetry: only the +non-redundant (first) half of the array need be stored. The result is +the real-even DFT (REDFT) and the real-odd DFT (RODFT), also +known as the discrete cosine and sine transforms (DCT and +DST), respectively. + + + + + + + + +

    + +

    (In this section, we describe the 1d transforms; multi-dimensional +transforms are just a separable product of these transforms operating +along each dimension.) +

    +

    Because of the discrete sampling, one has an additional choice: is the +data even/odd around a sampling point, or around the point halfway +between two samples? The latter corresponds to shifting the +samples by half an interval, and gives rise to several transform +variants denoted by REDFTab and RODFTab: a and +b are 0 or 1, and indicate whether the input +(a) and/or output (b) are shifted by half a sample +(1 means it is shifted). These are also known as types I-IV of +the DCT and DST, and all four types are supported by FFTW’s r2r +interface.3 +

    +

    The r2r kinds for the various REDFT and RODFT types supported by FFTW, +along with the boundary conditions at both ends of the input +array (n real numbers in[j=0..n-1]), are: +

    +
      +
    • FFTW_REDFT00 (DCT-I): even around j=0 and even around j=n-1. + + +
    • FFTW_REDFT10 (DCT-II, “the” DCT): even around j=-0.5 and even around j=n-0.5. + + +
    • FFTW_REDFT01 (DCT-III, “the” IDCT): even around j=0 and odd around j=n. + + + +
    • FFTW_REDFT11 (DCT-IV): even around j=-0.5 and odd around j=n-0.5. + + +
    • FFTW_RODFT00 (DST-I): odd around j=-1 and odd around j=n. + + +
    • FFTW_RODFT10 (DST-II): odd around j=-0.5 and odd around j=n-0.5. + + +
    • FFTW_RODFT01 (DST-III): odd around j=-1 and even around j=n-1. + + +
    • FFTW_RODFT11 (DST-IV): odd around j=-0.5 and even around j=n-0.5. + + +
    + +

    Note that these symmetries apply to the “logical” array being +transformed; there are no constraints on your physical input +data. So, for example, if you specify a size-5 REDFT00 (DCT-I) of the +data abcde, it corresponds to the DFT of the logical even array +abcdedcb of size 8. A size-4 REDFT10 (DCT-II) of the data +abcd corresponds to the size-8 logical DFT of the even array +abcddcba, shifted by half a sample. +

    +

    All of these transforms are invertible. The inverse of R*DFT00 is +R*DFT00; of R*DFT10 is R*DFT01 and vice versa (these are often called +simply “the” DCT and IDCT, respectively); and of R*DFT11 is R*DFT11. +However, the transforms computed by FFTW are unnormalized, exactly +like the corresponding real and complex DFTs, so computing a transform +followed by its inverse yields the original array scaled by N, +where N is the logical DFT size. For REDFT00, +N=2(n-1); for RODFT00, N=2(n+1); otherwise, N=2n. + + +

    + +

    Note that the boundary conditions of the transform output array are +given by the input boundary conditions of the inverse transform. +Thus, the above transforms are all inequivalent in terms of +input/output boundary conditions, even neglecting the 0.5 shift +difference. +

    +

    FFTW is most efficient when N is a product of small factors; note +that this differs from the factorization of the physical size +n for REDFT00 and RODFT00! There is another oddity: n=1 +REDFT00 transforms correspond to N=0, and so are not +defined (the planner will return NULL). Otherwise, any positive +n is supported. +

    +

    For the precise mathematical definitions of these transforms as used by +FFTW, see What FFTW Really Computes. (For people accustomed to +the DCT/DST, FFTW’s definitions have a coefficient of 2 in front +of the cos/sin functions so that they correspond precisely to an +even/odd DFT of size N. Some authors also include additional +multiplicative factors of +√2 +for selected inputs and outputs; this makes +the transform orthogonal, but sacrifices the direct equivalence to a +symmetric DFT.) +

    + +

    Which type do you need?

    + +

    Since the required flavor of even/odd DFT depends upon your problem, +you are the best judge of this choice, but we can make a few comments +on relative efficiency to help you in your selection. In particular, +R*DFT01 and R*DFT10 tend to be slightly faster than R*DFT11 +(especially for odd sizes), while the R*DFT00 transforms are sometimes +significantly slower (especially for even sizes).4 +

    +

    Thus, if only the boundary conditions on the transform inputs are +specified, we generally recommend R*DFT10 over R*DFT00 and R*DFT01 over +R*DFT11 (unless the half-sample shift or the self-inverse property is +significant for your problem). +

    +

    If performance is important to you and you are using only small sizes +(say n<200), e.g. for multi-dimensional transforms, then you +might consider generating hard-coded transforms of those sizes and types +that you are interested in (see Generating your own code). +

    +

    We are interested in hearing what types of symmetric transforms you find +most useful. +

    +
    +
    +

    Footnotes

    + +

    (3)

    +

    There are also type V-VIII transforms, which +correspond to a logical DFT of odd size N, independent of +whether the physical size n is odd, but we do not support these +variants.

    +

    (4)

    +

    R*DFT00 is +sometimes slower in FFTW because we discovered that the standard +algorithm for computing this by a pre/post-processed real DFT—the +algorithm used in FFTPACK, Numerical Recipes, and other sources for +decades now—has serious numerical problems: it already loses several +decimal places of accuracy for 16k sizes. There seem to be only two +alternatives in the literature that do not suffer similarly: a +recursive decomposition into smaller DCTs, which would require a large +set of codelets for efficiency and generality, or sacrificing a factor of +2 +in speed to use a real DFT of twice the size. We currently +employ the latter technique for general n, as well as a limited +form of the former method: a split-radix decomposition when n +is odd (N a multiple of 4). For N containing many +factors of 2, the split-radix method seems to recover most of the +speed of the standard algorithm without the accuracy tradeoff.

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002ddata-DFT-Array-Format.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002ddata-DFT-Array-Format.html new file mode 100644 index 000000000..ef3766d7e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002ddata-DFT-Array-Format.html @@ -0,0 +1,134 @@ + + + + + +FFTW 3.3.8: Real-data DFT Array Format + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.3.4 Real-data DFT Array Format

    + + +

    The output of a DFT of real data (r2c) contains symmetries that, in +principle, make half of the outputs redundant (see What FFTW Really Computes). (Similarly for the input of an inverse c2r transform.) In +practice, it is not possible to entirely realize these savings in an +efficient and understandable format that generalizes to +multi-dimensional transforms. Instead, the output of the r2c +transforms is slightly over half of the output of the +corresponding complex transform. We do not “pack” the data in any +way, but store it as an ordinary array of fftw_complex values. +In fact, this data is simply a subsection of what would be the array in +the corresponding complex transform. +

    +

    Specifically, for a real transform of d (= rank) +dimensions n0 × n1 × n2 × … × nd-1 +, the complex data is an n0 × n1 × n2 × … × (nd-1/2 + 1) + array of +fftw_complex values in row-major order (with the division rounded +down). That is, we only store the lower half (non-negative +frequencies), plus one element, of the last dimension of the data from +the ordinary complex transform. (We could have instead taken half of +any other dimension, but implementation turns out to be simpler if the +last, contiguous, dimension is used.) +

    + +

    For an out-of-place transform, the real data is simply an array with +physical dimensions n0 × n1 × n2 × … × nd-1 + in row-major order. +

    + + +

    For an in-place transform, some complications arise since the complex data +is slightly larger than the real data. In this case, the final +dimension of the real data must be padded with extra values to +accommodate the size of the complex data—two extra if the last +dimension is even and one if it is odd. That is, the last dimension of +the real data must physically contain +2 * (nd-1/2+1) +double values (exactly enough to hold the complex data). This +physical array size does not, however, change the logical array +size—only +nd-1 +values are actually stored in the last dimension, and +nd-1 +is the last dimension passed to the planner. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002ddata-DFTs.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002ddata-DFTs.html new file mode 100644 index 000000000..55c40bda0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002ddata-DFTs.html @@ -0,0 +1,203 @@ + + + + + +FFTW 3.3.8: Real-data DFTs + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.3.3 Real-data DFTs

    + +
    +
    fftw_plan fftw_plan_dft_r2c_1d(int n0,
    +                               double *in, fftw_complex *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1,
    +                               double *in, fftw_complex *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2,
    +                               double *in, fftw_complex *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_r2c(int rank, const int *n,
    +                            double *in, fftw_complex *out,
    +                            unsigned flags);
    +
    + + + + + + +

    Plan a real-input/complex-output discrete Fourier transform (DFT) in +zero or more dimensions, returning an fftw_plan (see Using Plans). +

    +

    Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). +

    +

    The planner returns NULL if the plan cannot be created. A +non-NULL plan is always returned by the basic interface unless +you are using a customized FFTW configuration supporting a restricted +set of transforms, or if you use the FFTW_PRESERVE_INPUT flag +with a multi-dimensional out-of-place c2r transform (see below). +

    + +

    Arguments

    +
      +
    • rank is the rank of the transform (it should be the size of the +array *n), and can be any non-negative integer. (See Complex Multi-Dimensional DFTs, for the definition of “rank”.) The +‘_1d’, ‘_2d’, and ‘_3d’ planners correspond to a +rank of 1, 2, and 3, respectively. The rank +may be zero, which is equivalent to a rank-1 transform of size 1, i.e. a +copy of one real number (with zero imaginary part) from input to output. + +
    • n0, n1, n2, or n[0..rank-1], (as appropriate +for each routine) specify the size of the transform dimensions. They +can be any positive integer. This is different in general from the +physical array dimensions, which are described in Real-data DFT Array Format. + +
        +
      • - FFTW is best at handling sizes of the form +2a 3b 5c 7d + 11e 13f, +where e+f is either 0 or 1, and the other exponents +are arbitrary. Other sizes are computed by means of a slow, +general-purpose algorithm (which nevertheless retains O(n log n) + performance even for prime sizes). (It is possible to customize FFTW +for different array sizes; see Installation and Customization.) +Transforms whose sizes are powers of 2 are especially fast, and +it is generally beneficial for the last dimension of an r2c/c2r +transform to be even. +
      + +
    • in and out point to the input and output arrays of the +transform, which may be the same (yielding an in-place transform). + +These arrays are overwritten during planning, unless +FFTW_ESTIMATE is used in the flags. (The arrays need not be +initialized, but they must be allocated.) For an in-place transform, it +is important to remember that the real array will require padding, +described in Real-data DFT Array Format. + + +
    • +flags is a bitwise OR (‘|’) of zero or more planner flags, +as defined in Planner Flags. + +
    + +

    The inverse transforms, taking complex input (storing the non-redundant +half of a logically Hermitian array) to real output, are given by: +

    +
    +
    fftw_plan fftw_plan_dft_c2r_1d(int n0,
    +                               fftw_complex *in, double *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_c2r_2d(int n0, int n1,
    +                               fftw_complex *in, double *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_c2r_3d(int n0, int n1, int n2,
    +                               fftw_complex *in, double *out,
    +                               unsigned flags);
    +fftw_plan fftw_plan_dft_c2r(int rank, const int *n,
    +                            fftw_complex *in, double *out,
    +                            unsigned flags);
    +
    + + + + + + +

    The arguments are the same as for the r2c transforms, except that the +input and output data formats are reversed. +

    +

    FFTW computes an unnormalized transform: computing an r2c followed by a +c2r transform (or vice versa) will result in the original data +multiplied by the size of the transform (the product of the logical +dimensions). + +An r2c transform produces the same output as a FFTW_FORWARD +complex DFT of the same input, and a c2r transform is correspondingly +equivalent to FFTW_BACKWARD. For more information, see What FFTW Really Computes. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002dto_002dReal-Transform-Kinds.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002dto_002dReal-Transform-Kinds.html new file mode 100644 index 000000000..754c39213 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002dto_002dReal-Transform-Kinds.html @@ -0,0 +1,163 @@ + + + + + +FFTW 3.3.8: Real-to-Real Transform Kinds + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.3.6 Real-to-Real Transform Kinds

    + + +

    FFTW currently supports 11 different r2r transform kinds, specified by +one of the constants below. For the precise definitions of these +transforms, see What FFTW Really Computes. For a more colloquial +introduction to these transform kinds, see More DFTs of Real Data. +

    +

    For dimension of size n, there is a corresponding “logical” +dimension N that determines the normalization (and the optimal +factorization); the formula for N is given for each kind below. +Also, with each transform kind is listed its corrsponding inverse +transform. FFTW computes unnormalized transforms: a transform followed +by its inverse will result in the original data multiplied by N +(or the product of the N’s for each dimension, in +multi-dimensions). + +

    +
      +
    • +FFTW_R2HC computes a real-input DFT with output in +“halfcomplex” format, i.e. real and imaginary parts for a transform of +size n stored as: +

      +r0, r1, r2, ..., rn/2, i(n+1)/2-1, ..., i2, i1 +

      +(Logical N=n, inverse is FFTW_HC2R.) + +
    • +FFTW_HC2R computes the reverse of FFTW_R2HC, above. +(Logical N=n, inverse is FFTW_R2HC.) + +
    • +FFTW_DHT computes a discrete Hartley transform. +(Logical N=n, inverse is FFTW_DHT.) + + +
    • +FFTW_REDFT00 computes an REDFT00 transform, i.e. a DCT-I. +(Logical N=2*(n-1), inverse is FFTW_REDFT00.) + + + +
    • +FFTW_REDFT10 computes an REDFT10 transform, i.e. a DCT-II (sometimes called “the” DCT). +(Logical N=2*n, inverse is FFTW_REDFT01.) + +
    • +FFTW_REDFT01 computes an REDFT01 transform, i.e. a DCT-III (sometimes called “the” IDCT, being the inverse of DCT-II). +(Logical N=2*n, inverse is FFTW_REDFT=10.) + + +
    • +FFTW_REDFT11 computes an REDFT11 transform, i.e. a DCT-IV. +(Logical N=2*n, inverse is FFTW_REDFT11.) + +
    • +FFTW_RODFT00 computes an RODFT00 transform, i.e. a DST-I. +(Logical N=2*(n+1), inverse is FFTW_RODFT00.) + + + +
    • +FFTW_RODFT10 computes an RODFT10 transform, i.e. a DST-II. +(Logical N=2*n, inverse is FFTW_RODFT01.) + +
    • +FFTW_RODFT01 computes an RODFT01 transform, i.e. a DST-III. +(Logical N=2*n, inverse is FFTW_RODFT=10.) + +
    • +FFTW_RODFT11 computes an RODFT11 transform, i.e. a DST-IV. +(Logical N=2*n, inverse is FFTW_RODFT11.) + +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002dto_002dReal-Transforms.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002dto_002dReal-Transforms.html new file mode 100644 index 000000000..416ecbb13 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Real_002dto_002dReal-Transforms.html @@ -0,0 +1,180 @@ + + + + + +FFTW 3.3.8: Real-to-Real Transforms + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.3.5 Real-to-Real Transforms

    + + +
    +
    fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out,
    +                           fftw_r2r_kind kind, unsigned flags);
    +fftw_plan fftw_plan_r2r_2d(int n0, int n1, double *in, double *out,
    +                           fftw_r2r_kind kind0, fftw_r2r_kind kind1,
    +                           unsigned flags);
    +fftw_plan fftw_plan_r2r_3d(int n0, int n1, int n2,
    +                           double *in, double *out,
    +                           fftw_r2r_kind kind0,
    +                           fftw_r2r_kind kind1,
    +                           fftw_r2r_kind kind2,
    +                           unsigned flags);
    +fftw_plan fftw_plan_r2r(int rank, const int *n, double *in, double *out,
    +                        const fftw_r2r_kind *kind, unsigned flags);
    +
    + + + + + +

    Plan a real input/output (r2r) transform of various kinds in zero or +more dimensions, returning an fftw_plan (see Using Plans). +

    +

    Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). +

    +

    The planner returns NULL if the plan cannot be created. A +non-NULL plan is always returned by the basic interface unless +you are using a customized FFTW configuration supporting a restricted +set of transforms, or for size-1 FFTW_REDFT00 kinds (which are +not defined). + +

    + +

    Arguments

    +
      +
    • rank is the dimensionality of the transform (it should be the +size of the arrays *n and *kind), and can be any +non-negative integer. The ‘_1d’, ‘_2d’, and ‘_3d’ +planners correspond to a rank of 1, 2, and +3, respectively. A rank of zero is equivalent to a copy +of one number from input to output. + +
    • n, or n0/n1/n2, or n[rank], +respectively, gives the (physical) size of the transform dimensions. +They can be any positive integer. + +
        +
      • - +Multi-dimensional arrays are stored in row-major order with dimensions: +n0 x n1; or n0 x n1 x n2; or +n[0] x n[1] x ... x n[rank-1]. +See Multi-dimensional Array Format. +
      • - FFTW is generally best at handling sizes of the form +2a 3b 5c 7d + 11e 13f, +where e+f is either 0 or 1, and the other exponents +are arbitrary. Other sizes are computed by means of a slow, +general-purpose algorithm (which nevertheless retains O(n log n) + performance even for prime sizes). (It is possible to customize FFTW +for different array sizes; see Installation and Customization.) +Transforms whose sizes are powers of 2 are especially fast. +
      • - For a REDFT00 or RODFT00 transform kind in a dimension of +size n, it is n-1 or n+1, respectively, that +should be factorizable in the above form. +
      + +
    • in and out point to the input and output arrays of the +transform, which may be the same (yielding an in-place transform). + +These arrays are overwritten during planning, unless +FFTW_ESTIMATE is used in the flags. (The arrays need not be +initialized, but they must be allocated.) + +
    • kind, or kind0/kind1/kind2, or +kind[rank], is the kind of r2r transform used for the +corresponding dimension. The valid kind constants are described in +Real-to-Real Transform Kinds. In a multi-dimensional transform, +what is computed is the separable product formed by taking each +transform kind along the corresponding dimension, one dimension after +another. + +
    • +flags is a bitwise OR (‘|’) of zero or more planner flags, +as defined in Planner Flags. + +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Reversing-array-dimensions.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Reversing-array-dimensions.html new file mode 100644 index 000000000..860850ff0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Reversing-array-dimensions.html @@ -0,0 +1,184 @@ + + + + + +FFTW 3.3.8: Reversing array dimensions + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.2 Reversing array dimensions

    + + + +

    A minor annoyance in calling FFTW from Fortran is that FFTW’s array +dimensions are defined in the C convention (row-major order), while +Fortran’s array dimensions are the opposite convention (column-major +order). See Multi-dimensional Array Format. This is just a +bookkeeping difference, with no effect on performance. The only +consequence of this is that, whenever you create an FFTW plan for a +multi-dimensional transform, you must always reverse the +ordering of the dimensions. +

    +

    For example, consider the three-dimensional (L × M × N +) arrays: +

    +
    +
      complex(C_DOUBLE_COMPLEX), dimension(L,M,N) :: in, out
    +
    + +

    To plan a DFT for these arrays using fftw_plan_dft_3d, you could do: +

    + +
    +
      plan = fftw_plan_dft_3d(N,M,L, in,out, FFTW_FORWARD,FFTW_ESTIMATE)
    +
    + +

    That is, from FFTW’s perspective this is a N × M × L + array. +No data transposition need occur, as this is only +notation. Similarly, to use the more generic routine +fftw_plan_dft with the same arrays, you could do: +

    +
    +
      integer(C_INT), dimension(3) :: n = [N,M,L]
    +  plan = fftw_plan_dft_3d(3, n, in,out, FFTW_FORWARD,FFTW_ESTIMATE)
    +
    + +

    Note, by the way, that this is different from the legacy Fortran +interface (see Fortran-interface routines), which automatically +reverses the order of the array dimension for you. Here, you are +calling the C interface directly, so there is no “translation” layer. +

    + +

    An important thing to keep in mind is the implication of this for +multidimensional real-to-complex transforms (see Multi-Dimensional DFTs of Real Data). In C, a multidimensional real-to-complex DFT +chops the last dimension roughly in half (N × M × L + real input +goes to N × M × L/2+1 + complex output). In Fortran, because +the array dimension notation is reversed, the first dimension of +the complex data is chopped roughly in half. For example consider the +‘r2c’ transform of L × M × N + real input in Fortran: +

    + + +
    +
      type(C_PTR) :: plan
    +  real(C_DOUBLE), dimension(L,M,N) :: in
    +  complex(C_DOUBLE_COMPLEX), dimension(L/2+1,M,N) :: out
    +  plan = fftw_plan_dft_r2c_3d(N,M,L, in,out, FFTW_ESTIMATE)
    +  ...
    +  call fftw_execute_dft_r2c(plan, in, out)
    +
    + + + +

    Alternatively, for an in-place r2c transform, as described in the C +documentation we must pad the first dimension of the +real input with an extra two entries (which are ignored by FFTW) so as +to leave enough space for the complex output. The input is +allocated as a 2[L/2+1] × M × N + array, even though only +L × M × N + of it is actually used. In this example, we will +allocate the array as a pointer type, using ‘fftw_alloc’ to +ensure aligned memory for maximum performance (see Allocating aligned memory in Fortran); this also makes it easy to reference the +same memory as both a real array and a complex array. +

    + + +
    +
      real(C_DOUBLE), pointer :: in(:,:,:)
    +  complex(C_DOUBLE_COMPLEX), pointer :: out(:,:,:)
    +  type(C_PTR) :: plan, data
    +  data = fftw_alloc_complex(int((L/2+1) * M * N, C_SIZE_T))
    +  call c_f_pointer(data, in, [2*(L/2+1),M,N])
    +  call c_f_pointer(data, out, [L/2+1,M,N])
    +  plan = fftw_plan_dft_r2c_3d(N,M,L, in,out, FFTW_ESTIMATE)
    +  ...
    +  call fftw_execute_dft_r2c(plan, in, out)
    +  ...
    +  call fftw_destroy_plan(plan)
    +  call fftw_free(data)
    +
    + +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Row_002dmajor-Format.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Row_002dmajor-Format.html new file mode 100644 index 000000000..26b159d21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Row_002dmajor-Format.html @@ -0,0 +1,118 @@ + + + + + +FFTW 3.3.8: Row-major Format + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.2.1 Row-major Format

    + + +

    The multi-dimensional arrays passed to fftw_plan_dft etcetera +are expected to be stored as a single contiguous block in +row-major order (sometimes called “C order”). Basically, this +means that as you step through adjacent memory locations, the first +dimension’s index varies most slowly and the last dimension’s index +varies most quickly. +

    +

    To be more explicit, let us consider an array of rank d whose +dimensions are n0 × n1 × n2 × … × nd-1 +. Now, we specify a location in the array by a +sequence of d (zero-based) indices, one for each dimension: +(i0, i1, i2,..., id-1). +If the array is stored in row-major +order, then this element is located at the position +id-1 + nd-1 * (id-2 + nd-2 * (... + n1 * i0)). +

    +

    Note that, for the ordinary complex DFT, each element of the array +must be of type fftw_complex; i.e. a (real, imaginary) pair of +(double-precision) numbers. +

    +

    In the advanced FFTW interface, the physical dimensions n from +which the indices are computed can be different from (larger than) +the logical dimensions of the transform to be computed, in order to +transform a subset of a larger array. + +Note also that, in the advanced interface, the expression above is +multiplied by a stride to get the actual array index—this is +useful in situations where each element of the multi-dimensional array +is actually a data structure (or another array), and you just want to +transform a single field. In the basic interface, however, the stride +is 1. + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/SIMD-alignment-and-fftw_005fmalloc.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/SIMD-alignment-and-fftw_005fmalloc.html new file mode 100644 index 000000000..3c5c6c369 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/SIMD-alignment-and-fftw_005fmalloc.html @@ -0,0 +1,143 @@ + + + + + +FFTW 3.3.8: SIMD alignment and fftw_malloc + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.1 SIMD alignment and fftw_malloc

    + +

    SIMD, which stands for “Single Instruction Multiple Data,” is a set of +special operations supported by some processors to perform a single +operation on several numbers (usually 2 or 4) simultaneously. SIMD +floating-point instructions are available on several popular CPUs: +SSE/SSE2/AVX/AVX2/AVX512/KCVI on some x86/x86-64 processors, AltiVec and +VSX on some POWER/PowerPCs, NEON on some ARM models. FFTW can be +compiled to support the SIMD instructions on any of these systems. + + + + + + + + + +

    + +

    A program linking to an FFTW library compiled with SIMD support can +obtain a nonnegligible speedup for most complex and r2c/c2r +transforms. In order to obtain this speedup, however, the arrays of +complex (or real) data passed to FFTW must be specially aligned in +memory (typically 16-byte aligned), and often this alignment is more +stringent than that provided by the usual malloc (etc.) +allocation routines. +

    + +

    In order to guarantee proper alignment for SIMD, therefore, in case +your program is ever linked against a SIMD-using FFTW, we recommend +allocating your transform data with fftw_malloc and +de-allocating it with fftw_free. + + +These have exactly the same interface and behavior as +malloc/free, except that for a SIMD FFTW they ensure +that the returned pointer has the necessary alignment (by calling +memalign or its equivalent on your OS). +

    +

    You are not required to use fftw_malloc. You can +allocate your data in any way that you like, from malloc to +new (in C++) to a fixed-size array declaration. If the array +happens not to be properly aligned, FFTW will not use the SIMD +extensions. + +

    + + +

    Since fftw_malloc only ever needs to be used for real and +complex arrays, we provide two convenient wrapper routines +fftw_alloc_real(N) and fftw_alloc_complex(N) that are +equivalent to (double*)fftw_malloc(sizeof(double) * N) and +(fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N), +respectively (or their equivalents in other precisions). +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-1d-Discrete-Fourier-Transform-_0028DFT_0029.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-1d-Discrete-Fourier-Transform-_0028DFT_0029.html new file mode 100644 index 000000000..dca6e77bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-1d-Discrete-Fourier-Transform-_0028DFT_0029.html @@ -0,0 +1,111 @@ + + + + + +FFTW 3.3.8: The 1d Discrete Fourier Transform (DFT) + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.8.1 The 1d Discrete Fourier Transform (DFT)

    + + + +

    The forward (FFTW_FORWARD) discrete Fourier transform (DFT) of a +1d complex array X of size n computes an array Y, +where: +

    .
    +The backward (FFTW_BACKWARD) DFT computes: +
    .
    +

    + +

    FFTW computes an unnormalized transform, in that there is no coefficient +in front of the summation in the DFT. In other words, applying the +forward and then the backward transform will multiply the input by +n. +

    + +

    From above, an FFTW_FORWARD transform corresponds to a sign of +-1 in the exponent of the DFT. Note also that we use the +standard “in-order” output ordering—the k-th output +corresponds to the frequency k/n (or k/T, where T +is your total sampling period). For those who like to think in terms of +positive and negative frequencies, this means that the positive +frequencies are stored in the first half of the output and the negative +frequencies are stored in backwards order in the second half of the +output. (The frequency -k/n is the same as the frequency +(n-k)/n.) +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-1d-Real_002ddata-DFT.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-1d-Real_002ddata-DFT.html new file mode 100644 index 000000000..f09992ebc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-1d-Real_002ddata-DFT.html @@ -0,0 +1,126 @@ + + + + + +FFTW 3.3.8: The 1d Real-data DFT + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.8.2 The 1d Real-data DFT

    + +

    The real-input (r2c) DFT in FFTW computes the forward transform +Y of the size n real array X, exactly as defined +above, i.e. +

    .
    +This output array Y can easily be shown to possess the +“Hermitian” symmetry + +Yk = Yn-k*, +where we take Y to be periodic so that +Yn = Y0. +

    +

    As a result of this symmetry, half of the output Y is redundant +(being the complex conjugate of the other half), and so the 1d r2c +transforms only output elements 0n/2 of Y +(n/2+1 complex numbers), where the division by 2 is +rounded down. +

    +

    Moreover, the Hermitian symmetry implies that +Y0 +and, if n is even, the +Yn/2 +element, are purely real. So, for the R2HC r2r transform, the +halfcomplex format does not store the imaginary parts of these elements. + + + +

    + +

    The c2r and H2RC r2r transforms compute the backward DFT of the +complex array X with Hermitian symmetry, stored in the +r2c/R2HC output formats, respectively, where the backward +transform is defined exactly as for the complex case: +

    .
    +The outputs Y of this transform can easily be seen to be purely +real, and are stored as an array of real numbers. +

    + +

    Like FFTW’s complex DFT, these transforms are unnormalized. In other +words, applying the real-to-complex (forward) and then the +complex-to-real (backward) transform will multiply the input by +n. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-Discrete-Hartley-Transform.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-Discrete-Hartley-Transform.html new file mode 100644 index 000000000..d51a7e777 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-Discrete-Hartley-Transform.html @@ -0,0 +1,140 @@ + + + + + +FFTW 3.3.8: The Discrete Hartley Transform + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.5.3 The Discrete Hartley Transform

    + +

    If you are planning to use the DHT because you’ve heard that it is +“faster” than the DFT (FFT), stop here. The DHT is not +faster than the DFT. That story is an old but enduring misconception +that was debunked in 1987. +

    +

    The discrete Hartley transform (DHT) is an invertible linear transform +closely related to the DFT. In the DFT, one multiplies each input by +cos - i * sin (a complex exponential), whereas in the DHT each +input is multiplied by simply cos + sin. Thus, the DHT +transforms n real numbers to n real numbers, and has the +convenient property of being its own inverse. In FFTW, a DHT (of any +positive n) can be specified by an r2r kind of FFTW_DHT. + + + +

    +

    Like the DFT, in FFTW the DHT is unnormalized, so computing a DHT of +size n followed by another DHT of the same size will result in +the original array multiplied by n. + +

    +

    The DHT was originally proposed as a more efficient alternative to the +DFT for real data, but it was subsequently shown that a specialized DFT +(such as FFTW’s r2hc or r2c transforms) could be just as fast. In FFTW, +the DHT is actually computed by post-processing an r2hc transform, so +there is ordinarily no reason to prefer it from a performance +perspective.5 +However, we have heard rumors that the DHT might be the most appropriate +transform in its own right for certain applications, and we would be +very interested to hear from anyone who finds it useful. +

    +

    If FFTW_DHT is specified for multiple dimensions of a +multi-dimensional transform, FFTW computes the separable product of 1d +DHTs along each dimension. Unfortunately, this is not quite the same +thing as a true multi-dimensional DHT; you can compute the latter, if +necessary, with at most rank-1 post-processing passes +[see e.g. H. Hao and R. N. Bracewell, Proc. IEEE 75, 264–266 (1987)]. +

    +

    For the precise mathematical definition of the DHT as used by FFTW, see +What FFTW Really Computes. +

    +
    +
    +

    Footnotes

    + +

    (5)

    +

    We provide the DHT mainly as a byproduct of some +internal algorithms. FFTW computes a real input/output DFT of +prime size by re-expressing it as a DHT plus post/pre-processing +and then using Rader’s prime-DFT algorithm adapted to the DHT.

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-Halfcomplex_002dformat-DFT.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-Halfcomplex_002dformat-DFT.html new file mode 100644 index 000000000..fc5d1ba84 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/The-Halfcomplex_002dformat-DFT.html @@ -0,0 +1,147 @@ + + + + + +FFTW 3.3.8: The Halfcomplex-format DFT + + + + + + + + + + + + + + + + + + + + + +
    + +

    2.5.1 The Halfcomplex-format DFT

    + +

    An r2r kind of FFTW_R2HC (r2hc) corresponds to an r2c DFT + + + +(see One-Dimensional DFTs of Real Data) but with “halfcomplex” +format output, and may sometimes be faster and/or more convenient than +the latter. + +The inverse hc2r transform is of kind FFTW_HC2R. + + +This consists of the non-redundant half of the complex output for a 1d +real-input DFT of size n, stored as a sequence of n real +numbers (double) in the format: +

    +

    +r0, r1, r2, ..., rn/2, i(n+1)/2-1, ..., i2, i1 +

    + +

    Here, +rk +is the real part of the kth output, and +ik +is the imaginary part. (Division by 2 is rounded down.) For a +halfcomplex array hc[n], the kth component thus has its +real part in hc[k] and its imaginary part in hc[n-k], with +the exception of k == 0 or n/2 (the latter +only if n is even)—in these two cases, the imaginary part is +zero due to symmetries of the real-input DFT, and is not stored. +Thus, the r2hc transform of n real values is a halfcomplex array of +length n, and vice versa for hc2r. + +

    + +

    Aside from the differing format, the output of +FFTW_R2HC/FFTW_HC2R is otherwise exactly the same as for +the corresponding 1d r2c/c2r transform +(i.e. FFTW_FORWARD/FFTW_BACKWARD transforms, respectively). +Recall that these transforms are unnormalized, so r2hc followed by hc2r +will result in the original data multiplied by n. Furthermore, +like the c2r transform, an out-of-place hc2r transform will +destroy its input array. +

    +

    Although these halfcomplex transforms can be used with the +multi-dimensional r2r interface, the interpretation of such a separable +product of transforms along each dimension is problematic. For example, +consider a two-dimensional n0 by n1, r2hc by r2hc +transform planned by fftw_plan_r2r_2d(n0, n1, in, out, FFTW_R2HC, +FFTW_R2HC, FFTW_MEASURE). Conceptually, FFTW first transforms the rows +(of size n1) to produce halfcomplex rows, and then transforms the +columns (of size n0). Half of these column transforms, however, +are of imaginary parts, and should therefore be multiplied by i +and combined with the r2hc transforms of the real columns to produce the +2d DFT amplitudes; FFTW’s r2r transform does not perform this +combination for you. Thus, if a multi-dimensional real-input/output DFT +is required, we recommend using the ordinary r2c/c2r +interface (see Multi-Dimensional DFTs of Real Data). +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Thread-safety.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Thread-safety.html new file mode 100644 index 000000000..c7ad85099 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Thread-safety.html @@ -0,0 +1,149 @@ + + + + + +FFTW 3.3.8: Thread safety + + + + + + + + + + + + + + + + + + + + + +
    + +

    5.4 Thread safety

    + + + + +

    Users writing multi-threaded programs (including OpenMP) must concern +themselves with the thread safety of the libraries they +use—that is, whether it is safe to call routines in parallel from +multiple threads. FFTW can be used in such an environment, but some +care must be taken because the planner routines share data +(e.g. wisdom and trigonometric tables) between calls and plans. +

    +

    The upshot is that the only thread-safe routine in FFTW is +fftw_execute (and the new-array variants thereof). All other routines +(e.g. the planner) should only be called from one thread at a time. So, +for example, you can wrap a semaphore lock around any calls to the +planner; even more simply, you can just create all of your plans from +one thread. We do not think this should be an important restriction +(FFTW is designed for the situation where the only performance-sensitive +code is the actual execution of the transform), and the benefits of +shared data between plans are great. +

    +

    Note also that, since the plan is not modified by fftw_execute, +it is safe to execute the same plan in parallel by multiple +threads. However, since a given plan operates by default on a fixed +array, you need to use one of the new-array execute functions (see New-array Execute Functions) so that different threads compute the transform of different data. +

    +

    (Users should note that these comments only apply to programs using +shared-memory threads or OpenMP. Parallelism using MPI or forked processes +involves a separate address-space and global variables for each process, +and is not susceptible to problems of this sort.) +

    +

    The FFTW planner is intended to be called from a single thread. If you +really must call it from multiple threads, you are expected to grab +whatever lock makes sense for your application, with the understanding +that you may be holding that lock for a long time, which is undesirable. +

    +

    Neither strategy works, however, in the following situation. The +“application” is structured as a set of “plugins” which are unaware +of each other, and for whatever reason the “plugins” cannot coordinate +on grabbing the lock. (This is not a technical problem, but an +organizational one. The “plugins” are written by independent agents, +and from the perspective of each plugin’s author, each plugin is using +FFTW correctly from a single thread.) To cope with this situation, +starting from FFTW-3.3.5, FFTW supports an API to make the planner +thread-safe: +

    +
    +
    void fftw_make_planner_thread_safe(void);
    +
    + + +

    This call operates by brute force: It just installs a hook that wraps a +lock (chosen by us) around all planner calls. So there is no magic and +you get the worst of all worlds. The planner is still single-threaded, +but you cannot choose which lock to use. The planner still holds the +lock for a long time, but you cannot impose a timeout on lock +acquisition. As of FFTW-3.3.5 and FFTW-3.3.6, this call does not work +when using OpenMP as threading substrate. (Suggestions on what to do +about this bug are welcome.) Do not use +fftw_make_planner_thread_safe unless there is no other choice, +such as in the application/plugin situation. +


    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Transposed-distributions.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Transposed-distributions.html new file mode 100644 index 000000000..34fc76134 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Transposed-distributions.html @@ -0,0 +1,170 @@ + + + + + +FFTW 3.3.8: Transposed distributions + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.4.3 Transposed distributions

    + +

    Internally, FFTW’s MPI transform algorithms work by first computing +transforms of the data local to each process, then by globally +transposing the data in some fashion to redistribute the data +among the processes, transforming the new data local to each process, +and transposing back. For example, a two-dimensional n0 by +n1 array, distributed across the n0 dimension, is +transformd by: (i) transforming the n1 dimension, which are +local to each process; (ii) transposing to an n1 by n0 +array, distributed across the n1 dimension; (iii) transforming +the n0 dimension, which is now local to each process; (iv) +transposing back. + +

    + +

    However, in many applications it is acceptable to compute a +multidimensional DFT whose results are produced in transposed order +(e.g., n1 by n0 in two dimensions). This provides a +significant performance advantage, because it means that the final +transposition step can be omitted. FFTW supports this optimization, +which you specify by passing the flag FFTW_MPI_TRANSPOSED_OUT +to the planner routines. To compute the inverse transform of +transposed output, you specify FFTW_MPI_TRANSPOSED_IN to tell +it that the input is transposed. In this section, we explain how to +interpret the output format of such a transform. + + +

    + +

    Suppose you have are transforming multi-dimensional data with (at +least two) dimensions n0 × n1 × n2 × … × nd-1 +. As always, it is distributed along +the first dimension n0 +. Now, if we compute its DFT with the +FFTW_MPI_TRANSPOSED_OUT flag, the resulting output data are stored +with the first two dimensions transposed: n1 × n0 × n2 ×…× nd-1 +, +distributed along the n1 + dimension. Conversely, if we take the +n1 × n0 × n2 ×…× nd-1 + data and transform it with the +FFTW_MPI_TRANSPOSED_IN flag, then the format goes back to the +original n0 × n1 × n2 × … × nd-1 + array. +

    +

    There are two ways to find the portion of the transposed array that +resides on the current process. First, you can simply call the +appropriate ‘local_size’ function, passing n1 × n0 × n2 ×…× nd-1 + (the +transposed dimensions). This would mean calling the ‘local_size’ +function twice, once for the transposed and once for the +non-transposed dimensions. Alternatively, you can call one of the +‘local_size_transposed’ functions, which returns both the +non-transposed and transposed data distribution from a single call. +For example, for a 3d transform with transposed output (or input), you +might call: +

    +
    +
    ptrdiff_t fftw_mpi_local_size_3d_transposed(
    +                ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm,
    +                ptrdiff_t *local_n0, ptrdiff_t *local_0_start,
    +                ptrdiff_t *local_n1, ptrdiff_t *local_1_start);
    +
    + + +

    Here, local_n0 and local_0_start give the size and +starting index of the n0 dimension for the +non-transposed data, as in the previous sections. For +transposed data (e.g. the output for +FFTW_MPI_TRANSPOSED_OUT), local_n1 and +local_1_start give the size and starting index of the n1 +dimension, which is the first dimension of the transposed data +(n1 by n0 by n2). +

    +

    (Note that FFTW_MPI_TRANSPOSED_IN is completely equivalent to +performing FFTW_MPI_TRANSPOSED_OUT and passing the first two +dimensions to the planner in reverse order, or vice versa. If you +pass both the FFTW_MPI_TRANSPOSED_IN and +FFTW_MPI_TRANSPOSED_OUT flags, it is equivalent to swapping the +first two dimensions passed to the planner and passing neither +flag.) +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Tutorial.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Tutorial.html new file mode 100644 index 000000000..b029917c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Tutorial.html @@ -0,0 +1,120 @@ + + + + + +FFTW 3.3.8: Tutorial + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Top   [Contents][Index]

    +
    +
    + +

    2 Tutorial

    + + + + + + + + +

    This chapter describes the basic usage of FFTW, i.e., how to compute + +the Fourier transform of a single array. This chapter tells the +truth, but not the whole truth. Specifically, FFTW implements +additional routines and flags that are not documented here, although +in many cases we try to indicate where added capabilities exist. For +more complete information, see FFTW Reference. (Note that you +need to compile and install FFTW before you can use it in a program. +For the details of the installation, see Installation and Customization.) +

    +

    We recommend that you read this tutorial in order.1 At the least, read the first section (see Complex One-Dimensional DFTs) before reading any of the others, even if your +main interest lies in one of the other transform types. +

    +

    Users of FFTW version 2 and earlier may also want to read Upgrading from FFTW version 2. +

    +
    +
    +

    Footnotes

    + +

    (1)

    +

    You can +read the tutorial in bit-reversed order after computing your first +transform.

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Upgrading-from-FFTW-version-2.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Upgrading-from-FFTW-version-2.html new file mode 100644 index 000000000..4d9f66b75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Upgrading-from-FFTW-version-2.html @@ -0,0 +1,297 @@ + + + + + +FFTW 3.3.8: Upgrading from FFTW version 2 + + + + + + + + + + + + + + + + + + + + + +
    + +

    9 Upgrading from FFTW version 2

    + +

    In this chapter, we outline the process for updating codes designed for +the older FFTW 2 interface to work with FFTW 3. The interface for FFTW +3 is not backwards-compatible with the interface for FFTW 2 and earlier +versions; codes written to use those versions will fail to link with +FFTW 3. Nor is it possible to write “compatibility wrappers” to +bridge the gap (at least not efficiently), because FFTW 3 has different +semantics from previous versions. However, upgrading should be a +straightforward process because the data formats are identical and the +overall style of planning/execution is essentially the same. +

    +

    Unlike FFTW 2, there are no separate header files for real and complex +transforms (or even for different precisions) in FFTW 3; all interfaces +are defined in the <fftw3.h> header file. +

    + +

    Numeric Types

    + +

    The main difference in data types is that fftw_complex in FFTW 2 +was defined as a struct with macros c_re and c_im +for accessing the real/imaginary parts. (This is binary-compatible with +FFTW 3 on any machine except perhaps for some older Crays in single +precision.) The equivalent macros for FFTW 3 are: +

    +
    +
    #define c_re(c) ((c)[0])
    +#define c_im(c) ((c)[1])
    +
    + +

    This does not work if you are using the C99 complex type, however, +unless you insert a double* typecast into the above macros +(see Complex numbers). +

    +

    Also, FFTW 2 had an fftw_real typedef that was an alias for +double (in double precision). In FFTW 3 you should just use +double (or whatever precision you are employing). +

    + +

    Plans

    + +

    The major difference between FFTW 2 and FFTW 3 is in the +planning/execution division of labor. In FFTW 2, plans were found for a +given transform size and type, and then could be applied to any +arrays and for any multiplicity/stride parameters. In FFTW 3, +you specify the particular arrays, stride parameters, etcetera when +creating the plan, and the plan is then executed for those arrays +(unless the guru interface is used) and those parameters +only. (FFTW 2 had “specific planner” routines that planned for +a particular array and stride, but the plan could still be used for +other arrays and strides.) That is, much of the information that was +formerly specified at execution time is now specified at planning time. +

    +

    Like FFTW 2’s specific planner routines, the FFTW 3 planner overwrites +the input/output arrays unless you use FFTW_ESTIMATE. +

    +

    FFTW 2 had separate data types fftw_plan, fftwnd_plan, +rfftw_plan, and rfftwnd_plan for complex and real one- and +multi-dimensional transforms, and each type had its own ‘destroy’ +function. In FFTW 3, all plans are of type fftw_plan and all are +destroyed by fftw_destroy_plan(plan). +

    +

    Where you formerly used fftw_create_plan and fftw_one to +plan and compute a single 1d transform, you would now use +fftw_plan_dft_1d to plan the transform. If you used the generic +fftw function to execute the transform with multiplicity +(howmany) and stride parameters, you would now use the advanced +interface fftw_plan_many_dft to specify those parameters. The +plans are now executed with fftw_execute(plan), which takes all +of its parameters (including the input/output arrays) from the plan. +

    +

    In-place transforms no longer interpret their output argument as scratch +space, nor is there an FFTW_IN_PLACE flag. You simply pass the +same pointer for both the input and output arguments. (Previously, the +output ostride and odist parameters were ignored for +in-place transforms; now, if they are specified via the advanced +interface, they are significant even in the in-place case, although they +should normally equal the corresponding input parameters.) +

    +

    The FFTW_ESTIMATE and FFTW_MEASURE flags have the same +meaning as before, although the planning time will differ. You may also +consider using FFTW_PATIENT, which is like FFTW_MEASURE +except that it takes more time in order to consider a wider variety of +algorithms. +

    +

    For multi-dimensional complex DFTs, instead of fftwnd_create_plan +(or fftw2d_create_plan or fftw3d_create_plan), followed by +fftwnd_one, you would use fftw_plan_dft (or +fftw_plan_dft_2d or fftw_plan_dft_3d). followed by +fftw_execute. If you used fftwnd to to specify strides +etcetera, you would instead specify these via fftw_plan_many_dft. +

    +

    The analogues to rfftw_create_plan and rfftw_one with +FFTW_REAL_TO_COMPLEX or FFTW_COMPLEX_TO_REAL directions +are fftw_plan_r2r_1d with kind FFTW_R2HC or +FFTW_HC2R, followed by fftw_execute. The stride etcetera +arguments of rfftw are now in fftw_plan_many_r2r. +

    +

    Instead of rfftwnd_create_plan (or rfftw2d_create_plan or +rfftw3d_create_plan) followed by +rfftwnd_one_real_to_complex or +rfftwnd_one_complex_to_real, you now use fftw_plan_dft_r2c +(or fftw_plan_dft_r2c_2d or fftw_plan_dft_r2c_3d) or +fftw_plan_dft_c2r (or fftw_plan_dft_c2r_2d or +fftw_plan_dft_c2r_3d), respectively, followed by +fftw_execute. As usual, the strides etcetera of +rfftwnd_real_to_complex or rfftwnd_complex_to_real are no +specified in the advanced planner routines, +fftw_plan_many_dft_r2c or fftw_plan_many_dft_c2r. +

    + +

    Wisdom

    + +

    In FFTW 2, you had to supply the FFTW_USE_WISDOM flag in order to +use wisdom; in FFTW 3, wisdom is always used. (You could simulate the +FFTW 2 wisdom-less behavior by calling fftw_forget_wisdom after +every planner call.) +

    +

    The FFTW 3 wisdom import/export routines are almost the same as before +(although the storage format is entirely different). There is one +significant difference, however. In FFTW 2, the import routines would +never read past the end of the wisdom, so you could store extra data +beyond the wisdom in the same file, for example. In FFTW 3, the +file-import routine may read up to a few hundred bytes past the end of +the wisdom, so you cannot store other data just beyond it.11 +

    +

    Wisdom has been enhanced by additional humility in FFTW 3: whereas FFTW +2 would re-use wisdom for a given transform size regardless of the +stride etc., in FFTW 3 wisdom is only used with the strides etc. for +which it was created. Unfortunately, this means FFTW 3 has to create +new plans from scratch more often than FFTW 2 (in FFTW 2, planning +e.g. one transform of size 1024 also created wisdom for all smaller +powers of 2, but this no longer occurs). +

    +

    FFTW 3 also has the new routine fftw_import_system_wisdom to +import wisdom from a standard system-wide location. +

    + +

    Memory allocation

    + +

    In FFTW 3, we recommend allocating your arrays with fftw_malloc +and deallocating them with fftw_free; this is not required, but +allows optimal performance when SIMD acceleration is used. (Those two +functions actually existed in FFTW 2, and worked the same way, but were +not documented.) +

    +

    In FFTW 2, there were fftw_malloc_hook and fftw_free_hook +functions that allowed the user to replace FFTW’s memory-allocation +routines (e.g. to implement different error-handling, since by default +FFTW prints an error message and calls exit to abort the program +if malloc returns NULL). These hooks are not supported in +FFTW 3; those few users who require this functionality can just +directly modify the memory-allocation routines in FFTW (they are defined +in kernel/alloc.c). +

    + +

    Fortran interface

    + +

    In FFTW 2, the subroutine names were obtained by replacing ‘fftw_’ +with ‘fftw_f77’; in FFTW 3, you replace ‘fftw_’ with +‘dfftw_’ (or ‘sfftw_’ or ‘lfftw_’, depending upon the +precision). +

    +

    In FFTW 3, we have begun recommending that you always declare the type +used to store plans as integer*8. (Too many people didn’t notice +our instruction to switch from integer to integer*8 for +64-bit machines.) +

    +

    In FFTW 3, we provide a fftw3.f “header file” to include in +your code (and which is officially installed on Unix systems). (In FFTW +2, we supplied a fftw_f77.i file, but it was not installed.) +

    +

    Otherwise, the C-Fortran interface relationship is much the same as it +was before (e.g. return values become initial parameters, and +multi-dimensional arrays are in column-major order). Unlike FFTW 2, we +do provide some support for wisdom import/export in Fortran +(see Wisdom of Fortran?). +

    + +

    Threads

    + +

    Like FFTW 2, only the execution routines are thread-safe. All planner +routines, etcetera, should be called by only a single thread at a time +(see Thread safety). Unlike FFTW 2, there is no special +FFTW_THREADSAFE flag for the planner to allow a given plan to be +usable by multiple threads in parallel; this is now the case by default. +

    +

    The multi-threaded version of FFTW 2 required you to pass the number of +threads each time you execute the transform. The number of threads is +now stored in the plan, and is specified before the planner is called by +fftw_plan_with_nthreads. The threads initialization routine used +to be called fftw_threads_init and would return zero on success; +the new routine is called fftw_init_threads and returns zero on +failure. See Multi-threaded FFTW. +

    +

    There is no separate threads header file in FFTW 3; all the function +prototypes are in <fftw3.h>. However, you still have to link to +a separate library (-lfftw3_threads -lfftw3 -lm on Unix), as well as +to the threading library (e.g. POSIX threads on Unix). +

    +
    +
    +

    Footnotes

    + +

    (11)

    +

    We +do our own buffering because GNU libc I/O routines are horribly slow for +single-character I/O, apparently for thread-safety reasons (whether you +are using threads or not).

    +
    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Usage-of-Multi_002dthreaded-FFTW.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Usage-of-Multi_002dthreaded-FFTW.html new file mode 100644 index 000000000..e1f0dd890 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Usage-of-Multi_002dthreaded-FFTW.html @@ -0,0 +1,169 @@ + + + + + +FFTW 3.3.8: Usage of Multi-threaded FFTW + + + + + + + + + + + + + + + + + + + + + +
    + +

    5.2 Usage of Multi-threaded FFTW

    + +

    Here, it is assumed that the reader is already familiar with the usage +of the uniprocessor FFTW routines, described elsewhere in this manual. +We only describe what one has to change in order to use the +multi-threaded routines. +

    + +

    First, programs using the parallel complex transforms should be linked +with -lfftw3_threads -lfftw3 -lm on Unix, or -lfftw3_omp +-lfftw3 -lm if you compiled with OpenMP. You will also need to link +with whatever library is responsible for threads on your system +(e.g. -lpthread on GNU/Linux) or include whatever compiler flag +enables OpenMP (e.g. -fopenmp with gcc). + +

    + +

    Second, before calling any FFTW routines, you should call the +function: +

    +
    +
    int fftw_init_threads(void);
    +
    + + +

    This function, which need only be called once, performs any one-time +initialization required to use threads on your system. It returns zero +if there was some error (which should not happen under normal +circumstances) and a non-zero value otherwise. +

    +

    Third, before creating a plan that you want to parallelize, you should +call: +

    +
    +
    void fftw_plan_with_nthreads(int nthreads);
    +
    + + +

    The nthreads argument indicates the number of threads you want +FFTW to use (or actually, the maximum number). All plans subsequently +created with any planner routine will use that many threads. You can +call fftw_plan_with_nthreads, create some plans, call +fftw_plan_with_nthreads again with a different argument, and +create some more plans for a new number of threads. Plans already created +before a call to fftw_plan_with_nthreads are unaffected. If you +pass an nthreads argument of 1 (the default), threads are +disabled for subsequent plans. +

    + +

    With OpenMP, to configure FFTW to use all of the currently running +OpenMP threads (set by omp_set_num_threads(nthreads) or by the +OMP_NUM_THREADS environment variable), you can do: +fftw_plan_with_nthreads(omp_get_max_threads()). (The ‘omp_’ +OpenMP functions are declared via #include <omp.h>.) +

    + +

    Given a plan, you then execute it as usual with +fftw_execute(plan), and the execution will use the number of +threads specified when the plan was created. When done, you destroy +it as usual with fftw_destroy_plan. As described in +Thread safety, plan execution is thread-safe, but plan +creation and destruction are not: you should create/destroy +plans only from a single thread, but can safely execute multiple plans +in parallel. +

    +

    There is one additional routine: if you want to get rid of all memory +and other resources allocated internally by FFTW, you can call: +

    +
    +
    void fftw_cleanup_threads(void);
    +
    + + +

    which is much like the fftw_cleanup() function except that it +also gets rid of threads-related data. You must not execute any +previously created plans after calling this function. +

    +

    We should also mention one other restriction: if you save wisdom from a +program using the multi-threaded FFTW, that wisdom cannot be used +by a program using only the single-threaded FFTW (i.e. not calling +fftw_init_threads). See Words of Wisdom-Saving Plans. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Using-MPI-Plans.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Using-MPI-Plans.html new file mode 100644 index 000000000..df1621cd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Using-MPI-Plans.html @@ -0,0 +1,129 @@ + + + + + +FFTW 3.3.8: Using MPI Plans + + + + + + + + + + + + + + + + + + + + + +
    + +

    6.12.3 Using MPI Plans

    + +

    Once an MPI plan is created, you can execute and destroy it using +fftw_execute, fftw_destroy_plan, and the other functions +in the serial interface that operate on generic plans (see Using Plans). +

    + + +

    The fftw_execute and fftw_destroy_plan functions, applied to +MPI plans, are collective calls: they must be called for all processes +in the communicator that was used to create the plan. +

    + +

    You must not use the serial new-array plan-execution functions +fftw_execute_dft and so on (see New-array Execute Functions) with MPI plans. Such functions are specialized to the +problem type, and there are specific new-array execute functions for MPI plans: +

    + + + + +
    +
    void fftw_mpi_execute_dft(fftw_plan p, fftw_complex *in, fftw_complex *out);
    +void fftw_mpi_execute_dft_r2c(fftw_plan p, double *in, fftw_complex *out);
    +void fftw_mpi_execute_dft_c2r(fftw_plan p, fftw_complex *in, double *out);
    +void fftw_mpi_execute_r2r(fftw_plan p, double *in, double *out);
    +
    + + + +

    These functions have the same restrictions as those of the serial +new-array execute functions. They are always safe to apply to +the same in and out arrays that were used to +create the plan. They can only be applied to new arrarys if those +arrays have the same types, dimensions, in-placeness, and alignment as +the original arrays, where the best way to ensure the same alignment +is to use FFTW’s fftw_malloc and related allocation functions +for all arrays (see Memory Allocation). Note that distributed +transposes (see FFTW MPI Transposes) use +fftw_mpi_execute_r2r, since they count as rank-zero r2r plans +from FFTW’s perspective. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Using-Plans.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Using-Plans.html new file mode 100644 index 000000000..92c19a8a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Using-Plans.html @@ -0,0 +1,192 @@ + + + + + +FFTW 3.3.8: Using Plans + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.2 Using Plans

    + +

    Plans for all transform types in FFTW are stored as type +fftw_plan (an opaque pointer type), and are created by one of the +various planning routines described in the following sections. + +An fftw_plan contains all information necessary to compute the +transform, including the pointers to the input and output arrays. +

    +
    +
    void fftw_execute(const fftw_plan plan);
    +
    + + +

    This executes the plan, to compute the corresponding transform on +the arrays for which it was planned (which must still exist). The plan +is not modified, and fftw_execute can be called as many times as +desired. +

    +

    To apply a given plan to a different array, you can use the new-array execute +interface. See New-array Execute Functions. +

    +

    fftw_execute (and equivalents) is the only function in FFTW +guaranteed to be thread-safe; see Thread safety. +

    +

    This function: +

    +
    void fftw_destroy_plan(fftw_plan plan);
    +
    + +

    deallocates the plan and all its associated data. +

    +

    FFTW’s planner saves some other persistent data, such as the +accumulated wisdom and a list of algorithms available in the current +configuration. If you want to deallocate all of that and reset FFTW +to the pristine state it was in when you started your program, you can +call: +

    +
    +
    void fftw_cleanup(void);
    +
    + + +

    After calling fftw_cleanup, all existing plans become undefined, +and you should not attempt to execute them nor to destroy them. You can +however create and execute/destroy new plans, in which case FFTW starts +accumulating wisdom information again. +

    +

    fftw_cleanup does not deallocate your plans, however. To prevent +memory leaks, you must still call fftw_destroy_plan before +executing fftw_cleanup. +

    +

    Occasionally, it may useful to know FFTW’s internal “cost” metric +that it uses to compare plans to one another; this cost is +proportional to an execution time of the plan, in undocumented units, +if the plan was created with the FFTW_MEASURE or other +timing-based options, or alternatively is a heuristic cost function +for FFTW_ESTIMATE plans. (The cost values of measured and +estimated plans are not comparable, being in different units. Also, +costs from different FFTW versions or the same version compiled +differently may not be in the same units. Plans created from wisdom +have a cost of 0 since no timing measurement is performed for them. +Finally, certain problems for which only one top-level algorithm was +possible may have required no measurements of the cost of the whole +plan, in which case fftw_cost will also return 0.) The cost +metric for a given plan is returned by: +

    +
    +
    double fftw_cost(const fftw_plan plan);
    +
    + + +

    The following two routines are provided purely for academic purposes +(that is, for entertainment). +

    +
    +
    void fftw_flops(const fftw_plan plan, 
    +                double *add, double *mul, double *fma);
    +
    + + +

    Given a plan, set add, mul, and fma to an +exact count of the number of floating-point additions, multiplications, +and fused multiply-add operations involved in the plan’s execution. The +total number of floating-point operations (flops) is add + mul + +2*fma, or add + mul + fma if the hardware supports fused +multiply-add instructions (although the number of FMA operations is only +approximate because of compiler voodoo). (The number of operations +should be an integer, but we use double to avoid overflowing +int for large transforms; the arguments are of type double +even for single and long-double precision versions of FFTW.) +

    +
    +
    void fftw_fprint_plan(const fftw_plan plan, FILE *output_file);
    +void fftw_print_plan(const fftw_plan plan);
    +char *fftw_sprint_plan(const fftw_plan plan);
    +
    + + + +

    This outputs a “nerd-readable” representation of the plan to +the given file, to stdout, or two a newly allocated +NUL-terminated string (which the caller is responsible for deallocating +with free), respectively. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/What-FFTW-Really-Computes.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/What-FFTW-Really-Computes.html new file mode 100644 index 000000000..bc09a6630 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/What-FFTW-Really-Computes.html @@ -0,0 +1,107 @@ + + + + + +FFTW 3.3.8: What FFTW Really Computes + + + + + + + + + + + + + + + + + + + + +
    +

    +Previous: , Up: FFTW Reference   [Contents][Index]

    +
    +
    + +

    4.8 What FFTW Really Computes

    + +

    In this section, we provide precise mathematical definitions for the +transforms that FFTW computes. These transform definitions are fairly +standard, but some authors follow slightly different conventions for the +normalization of the transform (the constant factor in front) and the +sign of the complex exponent. We begin by presenting the +one-dimensional (1d) transform definitions, and then give the +straightforward extension to multi-dimensional transforms. +

    + + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Export.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Export.html new file mode 100644 index 000000000..998a7c7d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Export.html @@ -0,0 +1,131 @@ + + + + + +FFTW 3.3.8: Wisdom Export + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Wisdom   [Contents][Index]

    +
    +
    + +

    4.7.1 Wisdom Export

    + +
    +
    int fftw_export_wisdom_to_filename(const char *filename);
    +void fftw_export_wisdom_to_file(FILE *output_file);
    +char *fftw_export_wisdom_to_string(void);
    +void fftw_export_wisdom(void (*write_char)(char c, void *), void *data);
    +
    + + + + + +

    These functions allow you to export all currently accumulated wisdom +in a form from which it can be later imported and restored, even +during a separate run of the program. (See Words of Wisdom-Saving Plans.) The current store of wisdom is not affected by calling any +of these routines. +

    +

    fftw_export_wisdom exports the wisdom to any output +medium, as specified by the callback function +write_char. write_char is a putc-like function that +writes the character c to some output; its second parameter is +the data pointer passed to fftw_export_wisdom. For +convenience, the following three “wrapper” routines are provided: +

    +

    fftw_export_wisdom_to_filename writes wisdom to a file named +filename (which is created or overwritten), returning 1 +on success and 0 on failure. A lower-level function, which +requires you to open and close the file yourself (e.g. if you want to +write wisdom to a portion of a larger file) is +fftw_export_wisdom_to_file. This writes the wisdom to the +current position in output_file, which should be open with +write permission; upon exit, the file remains open and is positioned +at the end of the wisdom data. +

    +

    fftw_export_wisdom_to_string returns a pointer to a +NULL-terminated string holding the wisdom data. This string is +dynamically allocated, and it is the responsibility of the caller to +deallocate it with free when it is no longer needed. +

    +

    All of these routines export the wisdom in the same format, which we +will not document here except to say that it is LISP-like ASCII text +that is insensitive to white space. +

    +
    +
    +

    +Next: , Previous: , Up: Wisdom   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-File-Export_002fImport-from-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-File-Export_002fImport-from-Fortran.html new file mode 100644 index 000000000..fab12dda2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-File-Export_002fImport-from-Fortran.html @@ -0,0 +1,116 @@ + + + + + +FFTW 3.3.8: Wisdom File Export/Import from Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.6.1 Wisdom File Export/Import from Fortran

    + + + +

    The easiest way to export and import wisdom is to do so using +fftw_export_wisdom_to_filename and +fftw_wisdom_from_filename. The only trick is that these +require you to pass a C string, which is an array of type +CHARACTER(C_CHAR) that is terminated by C_NULL_CHAR. +You can call them like this: +

    +
    +
      integer(C_INT) :: ret
    +  ret = fftw_export_wisdom_to_filename(C_CHAR_'my_wisdom.dat' // C_NULL_CHAR)
    +  if (ret .eq. 0) stop 'error exporting wisdom to file'
    +  ret = fftw_import_wisdom_from_filename(C_CHAR_'my_wisdom.dat' // C_NULL_CHAR)
    +  if (ret .eq. 0) stop 'error importing wisdom from file'
    +
    + +

    Note that prepending ‘C_CHAR_’ is needed to specify that the +literal string is of kind C_CHAR, and we null-terminate the +string by appending ‘// C_NULL_CHAR’. These functions return an +integer(C_INT) (ret) which is 0 if an error +occurred during export/import and nonzero otherwise. +

    +

    It is also possible to use the lower-level routines +fftw_export_wisdom_to_file and +fftw_import_wisdom_from_file, which accept parameters of the C +type FILE*, expressed in Fortran as type(C_PTR). +However, you are then responsible for creating the FILE* +yourself. You can do this by using iso_c_binding to define +Fortran intefaces for the C library functions fopen and +fclose, which is a bit strange in Fortran but workable. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Generic-Export_002fImport-from-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Generic-Export_002fImport-from-Fortran.html new file mode 100644 index 000000000..d16236513 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Generic-Export_002fImport-from-Fortran.html @@ -0,0 +1,150 @@ + + + + + +FFTW 3.3.8: Wisdom Generic Export/Import from Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.6.3 Wisdom Generic Export/Import from Fortran

    + +

    The most generic wisdom export/import functions allow you to provide +an arbitrary callback function to read/write one character at a time +in any way you want. However, your callback function must be written +in a special way, using the bind(C) attribute to be passed to a +C interface. +

    + +

    In particular, to call the generic wisdom export function +fftw_export_wisdom, you would write a callback subroutine of the form: +

    +
    +
      subroutine my_write_char(c, p) bind(C)
    +    use, intrinsic :: iso_c_binding
    +    character(C_CHAR), value :: c
    +    type(C_PTR), value :: p
    +    ...write c...
    +  end subroutine my_write_char
    +
    + +

    Given such a subroutine (along with the corresponding interface definition), you could then export wisdom using: +

    + +
    +
      call fftw_export_wisdom(c_funloc(my_write_char), p)
    +
    + + + +

    The standard c_funloc intrinsic converts a Fortran +bind(C) subroutine into a C function pointer. The parameter +p is a type(C_PTR) to any arbitrary data that you want +to pass to my_write_char (or C_NULL_PTR if none). (Note +that you can get a C pointer to Fortran data using the intrinsic +c_loc, and convert it back to a Fortran pointer in +my_write_char using c_f_pointer.) +

    +

    Similarly, to use the generic fftw_import_wisdom, you would +define a callback function of the form: +

    + +
    +
      integer(C_INT) function my_read_char(p) bind(C)
    +    use, intrinsic :: iso_c_binding
    +    type(C_PTR), value :: p
    +    character :: c
    +    ...read a character c...
    +    my_read_char = ichar(c, C_INT)
    +  end function my_read_char
    +
    +  ....
    +
    +  integer(C_INT) :: ret
    +  ret = fftw_import_wisdom(c_funloc(my_read_char), p)
    +  if (ret .eq. 0) stop 'error importing wisdom'
    +
    + +

    Your function can return -1 if the end of the input is reached. +Again, p is an arbitrary type(C_PTR that is passed +through to your function. fftw_import_wisdom returns 0 +if an error occurred and nonzero otherwise. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Import.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Import.html new file mode 100644 index 000000000..086011668 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Import.html @@ -0,0 +1,136 @@ + + + + + +FFTW 3.3.8: Wisdom Import + + + + + + + + + + + + + + + + + + + + +
    +

    +Next: , Previous: , Up: Wisdom   [Contents][Index]

    +
    +
    + +

    4.7.2 Wisdom Import

    + +
    +
    int fftw_import_system_wisdom(void);
    +int fftw_import_wisdom_from_filename(const char *filename);
    +int fftw_import_wisdom_from_string(const char *input_string);
    +int fftw_import_wisdom(int (*read_char)(void *), void *data);
    +
    + + + + + + +

    These functions import wisdom into a program from data stored by the +fftw_export_wisdom functions above. (See Words of Wisdom-Saving Plans.) The imported wisdom replaces any wisdom +already accumulated by the running program. +

    +

    fftw_import_wisdom imports wisdom from any input medium, as +specified by the callback function read_char. read_char is +a getc-like function that returns the next character in the +input; its parameter is the data pointer passed to +fftw_import_wisdom. If the end of the input data is reached +(which should never happen for valid data), read_char should +return EOF (as defined in <stdio.h>). For convenience, +the following three “wrapper” routines are provided: +

    +

    fftw_import_wisdom_from_filename reads wisdom from a file named +filename. A lower-level function, which requires you to open +and close the file yourself (e.g. if you want to read wisdom from a +portion of a larger file) is fftw_import_wisdom_from_file. This +reads wisdom from the current position in input_file (which +should be open with read permission); upon exit, the file remains +open, but the position of the read pointer is unspecified. +

    +

    fftw_import_wisdom_from_string reads wisdom from the +NULL-terminated string input_string. +

    +

    fftw_import_system_wisdom reads wisdom from an +implementation-defined standard file (/etc/fftw/wisdom on Unix +and GNU systems). + +

    + +

    The return value of these import routines is 1 if the wisdom was +read successfully and 0 otherwise. Note that, in all of these +functions, any data in the input stream past the end of the wisdom data +is simply ignored. +

    +
    +
    +

    +Next: , Previous: , Up: Wisdom   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-String-Export_002fImport-from-Fortran.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-String-Export_002fImport-from-Fortran.html new file mode 100644 index 000000000..6dbdf9e00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-String-Export_002fImport-from-Fortran.html @@ -0,0 +1,135 @@ + + + + + +FFTW 3.3.8: Wisdom String Export/Import from Fortran + + + + + + + + + + + + + + + + + + + + + +
    + +

    7.6.2 Wisdom String Export/Import from Fortran

    + + +

    Dealing with FFTW’s C string export/import is a bit more painful. In +particular, the fftw_export_wisdom_to_string function requires +you to deal with a dynamically allocated C string. To get its length, +you must define an interface to the C strlen function, and to +deallocate it you must define an interface to C free: +

    +
    +
      use, intrinsic :: iso_c_binding
    +  interface
    +    integer(C_INT) function strlen(s) bind(C, name='strlen')
    +      import
    +      type(C_PTR), value :: s
    +    end function strlen
    +    subroutine free(p) bind(C, name='free')
    +      import
    +      type(C_PTR), value :: p
    +    end subroutine free
    +  end interface
    +
    + +

    Given these definitions, you can then export wisdom to a Fortran +character array: +

    +
    +
      character(C_CHAR), pointer :: s(:)
    +  integer(C_SIZE_T) :: slen
    +  type(C_PTR) :: p
    +  p = fftw_export_wisdom_to_string()
    +  if (.not. c_associated(p)) stop 'error exporting wisdom'
    +  slen = strlen(p)
    +  call c_f_pointer(p, s, [slen+1])
    +  ...
    +  call free(p)
    +
    + + + +

    Note that slen is the length of the C string, but the length of +the array is slen+1 because it includes the terminating null +character. (You can omit the ‘+1’ if you don’t want Fortran to +know about the null character.) The standard c_associated function +checks whether p is a null pointer, which is returned by +fftw_export_wisdom_to_string if there was an error. +

    + +

    To import wisdom from a string, use +fftw_import_wisdom_from_string as usual; note that the argument +of this function must be a character(C_CHAR) that is terminated +by the C_NULL_CHAR character, like the s array above. +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Utilities.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Utilities.html new file mode 100644 index 000000000..759f90b7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-Utilities.html @@ -0,0 +1,110 @@ + + + + + +FFTW 3.3.8: Wisdom Utilities + + + + + + + + + + + + + + + + + + + + +
    +

    +Previous: , Up: Wisdom   [Contents][Index]

    +
    +
    + +

    4.7.4 Wisdom Utilities

    + +

    FFTW includes two standalone utility programs that deal with wisdom. We +merely summarize them here, since they come with their own man +pages for Unix and GNU systems (with HTML versions on our web site). +

    +

    The first program is fftw-wisdom (or fftwf-wisdom in +single precision, etcetera), which can be used to create a wisdom file +containing plans for any of the transform sizes and types supported by +FFTW. It is preferable to create wisdom directly from your executable +(see Caveats in Using Wisdom), but this program is useful for +creating global wisdom files for fftw_import_system_wisdom. + +

    + +

    The second program is fftw-wisdom-to-conf, which takes a wisdom +file as input and produces a configuration routine as output. The +latter is a C subroutine that you can compile and link into your +program, replacing a routine of the same name in the FFTW library, that +determines which parts of FFTW are callable by your program. +fftw-wisdom-to-conf produces a configuration routine that links +to only those parts of FFTW needed by the saved plans in the wisdom, +greatly reducing the size of statically linked executables (which should +only attempt to create plans corresponding to those in the wisdom, +however). + + +

    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-of-Fortran_003f.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-of-Fortran_003f.html new file mode 100644 index 000000000..69c01f718 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom-of-Fortran_003f.html @@ -0,0 +1,122 @@ + + + + + +FFTW 3.3.8: Wisdom of Fortran? + + + + + + + + + + + + + + + + + + + + + +
    + +

    8.5 Wisdom of Fortran?

    + +

    In this section, we discuss how one can import/export FFTW wisdom +(saved plans) to/from a Fortran program; we assume that the reader is +already familiar with wisdom, as described in Words of Wisdom-Saving Plans. +

    + +

    The basic problem is that is difficult to (portably) pass files and +strings between Fortran and C, so we cannot provide a direct Fortran +equivalent to the fftw_export_wisdom_to_file, etcetera, +functions. Fortran interfaces are provided for the functions +that do not take file/string arguments, however: +dfftw_import_system_wisdom, dfftw_import_wisdom, +dfftw_export_wisdom, and dfftw_forget_wisdom. + + + + +

    + +

    So, for example, to import the system-wide wisdom, you would do: +

    +
    +
            integer isuccess
    +        call dfftw_import_system_wisdom(isuccess)
    +
    + +

    As usual, the C return value is turned into a first parameter; +isuccess is non-zero on success and zero on failure (e.g. if +there is no system wisdom installed). +

    +

    If you want to import/export wisdom from/to an arbitrary file or +elsewhere, you can employ the generic dfftw_import_wisdom and +dfftw_export_wisdom functions, for which you must supply a +subroutine to read/write one character at a time. The FFTW package +contains an example file doc/f77_wisdom.f demonstrating how to +implement import_wisdom_from_file and +export_wisdom_to_file subroutines in this way. (These routines +cannot be compiled into the FFTW library itself, lest all FFTW-using +programs be required to link with the Fortran I/O library.) +

    + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom.html new file mode 100644 index 000000000..f77dd0fd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Wisdom.html @@ -0,0 +1,100 @@ + + + + + +FFTW 3.3.8: Wisdom + + + + + + + + + + + + + + + + + + + + + +
    + +

    4.7 Wisdom

    + + + +

    This section documents the FFTW mechanism for saving and restoring +plans from disk. This mechanism is called wisdom. +

    + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Words-of-Wisdom_002dSaving-Plans.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Words-of-Wisdom_002dSaving-Plans.html new file mode 100644 index 000000000..6ccde3344 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/Words-of-Wisdom_002dSaving-Plans.html @@ -0,0 +1,152 @@ + + + + + +FFTW 3.3.8: Words of Wisdom-Saving Plans + + + + + + + + + + + + + + + + + + + + + +
    + +

    3.3 Words of Wisdom—Saving Plans

    + + + +

    FFTW implements a method for saving plans to disk and restoring them. +In fact, what FFTW does is more general than just saving and loading +plans. The mechanism is called wisdom. Here, we describe +this feature at a high level. See FFTW Reference, for a less casual +but more complete discussion of how to use wisdom in FFTW. +

    +

    Plans created with the FFTW_MEASURE, FFTW_PATIENT, or +FFTW_EXHAUSTIVE options produce near-optimal FFT performance, +but may require a long time to compute because FFTW must measure the +runtime of many possible plans and select the best one. This setup is +designed for the situations where so many transforms of the same size +must be computed that the start-up time is irrelevant. For short +initialization times, but slower transforms, we have provided +FFTW_ESTIMATE. The wisdom mechanism is a way to get the +best of both worlds: you compute a good plan once, save it to +disk, and later reload it as many times as necessary. The wisdom +mechanism can actually save and reload many plans at once, not just +one. + + + + +

    + +

    Whenever you create a plan, the FFTW planner accumulates wisdom, which +is information sufficient to reconstruct the plan. After planning, +you can save this information to disk by means of the function: +

    +
    int fftw_export_wisdom_to_filename(const char *filename);
    +
    + +

    (This function returns non-zero on success.) +

    +

    The next time you run the program, you can restore the wisdom with +fftw_import_wisdom_from_filename (which also returns non-zero on success), +and then recreate the plan using the same flags as before. +

    +
    int fftw_import_wisdom_from_filename(const char *filename);
    +
    + + +

    Wisdom is automatically used for any size to which it is applicable, as +long as the planner flags are not more “patient” than those with which +the wisdom was created. For example, wisdom created with +FFTW_MEASURE can be used if you later plan with +FFTW_ESTIMATE or FFTW_MEASURE, but not with +FFTW_PATIENT. +

    +

    The wisdom is cumulative, and is stored in a global, private +data structure managed internally by FFTW. The storage space required +is minimal, proportional to the logarithm of the sizes the wisdom was +generated from. If memory usage is a concern, however, the wisdom can +be forgotten and its associated memory freed by calling: +

    +
    void fftw_forget_wisdom(void);
    +
    + + +

    Wisdom can be exported to a file, a string, or any other medium. +For details, see Wisdom. +

    +
    + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-dft.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-dft.png new file mode 100644 index 000000000..12447f577 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-dft.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-dht.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-dht.png new file mode 100644 index 000000000..f2ed1d079 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-dht.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-idft.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-idft.png new file mode 100644 index 000000000..66e6d1e73 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-idft.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft00.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft00.png new file mode 100644 index 000000000..61404041c Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft00.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft01.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft01.png new file mode 100644 index 000000000..ee678b749 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft01.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft10.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft10.png new file mode 100644 index 000000000..4becbbd2c Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft10.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft11.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft11.png new file mode 100644 index 000000000..ae1014256 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-redft11.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft00.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft00.png new file mode 100644 index 000000000..f6920d276 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft00.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft01.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft01.png new file mode 100644 index 000000000..6a36c120e Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft01.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft10.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft10.png new file mode 100644 index 000000000..d9e9cdaa4 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft10.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft11.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft11.png new file mode 100644 index 000000000..36f2c7005 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/equation-rodft11.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/index.html b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/index.html new file mode 100644 index 000000000..50449e074 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/index.html @@ -0,0 +1,315 @@ + + + + + +FFTW 3.3.8: Top + + + + + + + + + + + + + + + + + + +

    FFTW 3.3.8

    + + + + + + + + + + + + + + + + + + + + + + + + +

    Table of Contents

    + +
    + + +
    + + + +
    +

    +Next: , Previous: , Up: (dir)   [Contents][Index]

    +
    +
    + +

    FFTW User Manual

    +

    Welcome to FFTW, the Fastest Fourier Transform in the West. FFTW is a +collection of fast C routines to compute the discrete Fourier transform. +This manual documents FFTW version 3.3.8. +

    + + + + + + + + + + + + + + + + + +
    +
    +

    +Next: , Previous: , Up: (dir)   [Contents][Index]

    +
    + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/rfftwnd-for-html.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/rfftwnd-for-html.png new file mode 100644 index 000000000..076fdcb88 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/html/rfftwnd-for-html.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/install.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/install.texi new file mode 100644 index 000000000..6ccac20b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/install.texi @@ -0,0 +1,361 @@ +@node Installation and Customization, Acknowledgments, Upgrading from FFTW version 2, Top +@chapter Installation and Customization +@cindex installation + +This chapter describes the installation and customization of FFTW, the +latest version of which may be downloaded from +@uref{http://www.fftw.org, the FFTW home page}. + +In principle, FFTW should work on any system with an ANSI C compiler +(@code{gcc} is fine). However, planner time is drastically reduced if +FFTW can exploit a hardware cycle counter; FFTW comes with cycle-counter +support for all modern general-purpose CPUs, but you may need to add a +couple of lines of code if your compiler is not yet supported +(@pxref{Cycle Counters}). (On Unix, there will be a warning at the end +of the @code{configure} output if no cycle counter is found.) +@cindex cycle counter +@cindex compiler +@cindex portability + + +Installation of FFTW is simplest if you have a Unix or a GNU system, +such as GNU/Linux, and we describe this case in the first section below, +including the use of special configuration options to e.g. install +different precisions or exploit optimizations for particular +architectures (e.g. SIMD). Compilation on non-Unix systems is a more +manual process, but we outline the procedure in the second section. It +is also likely that pre-compiled binaries will be available for popular +systems. + +Finally, we describe how you can customize FFTW for particular needs by +generating @emph{codelets} for fast transforms of sizes not supported +efficiently by the standard FFTW distribution. +@cindex codelet + +@menu +* Installation on Unix:: +* Installation on non-Unix systems:: +* Cycle Counters:: +* Generating your own code:: +@end menu + +@c ------------------------------------------------------------ + +@node Installation on Unix, Installation on non-Unix systems, Installation and Customization, Installation and Customization +@section Installation on Unix + +FFTW comes with a @code{configure} program in the GNU style. +Installation can be as simple as: +@fpindex configure + +@example +./configure +make +make install +@end example + +This will build the uniprocessor complex and real transform libraries +along with the test programs. (We recommend that you use GNU +@code{make} if it is available; on some systems it is called +@code{gmake}.) The ``@code{make install}'' command installs the fftw +and rfftw libraries in standard places, and typically requires root +privileges (unless you specify a different install directory with the +@code{--prefix} flag to @code{configure}). You can also type +``@code{make check}'' to put the FFTW test programs through their paces. +If you have problems during configuration or compilation, you may want +to run ``@code{make distclean}'' before trying again; this ensures that +you don't have any stale files left over from previous compilation +attempts. + +The @code{configure} script chooses the @code{gcc} compiler by default, +if it is available; you can select some other compiler with: +@example +./configure CC="@r{@i{}}" +@end example + +The @code{configure} script knows good @code{CFLAGS} (C compiler flags) +@cindex compiler flags +for a few systems. If your system is not known, the @code{configure} +script will print out a warning. In this case, you should re-configure +FFTW with the command +@example +./configure CFLAGS="@r{@i{}}" +@end example +and then compile as usual. If you do find an optimal set of +@code{CFLAGS} for your system, please let us know what they are (along +with the output of @code{config.guess}) so that we can include them in +future releases. + +@code{configure} supports all the standard flags defined by the GNU +Coding Standards; see the @code{INSTALL} file in FFTW or +@uref{http://www.gnu.org/prep/standards/html_node/index.html, the GNU web page}. +Note especially @code{--help} to list all flags and +@code{--enable-shared} to create shared, rather than static, libraries. +@code{configure} also accepts a few FFTW-specific flags, particularly: + +@itemize @bullet + +@item +@cindex precision +@code{--enable-float}: Produces a single-precision version of FFTW +(@code{float}) instead of the default double-precision (@code{double}). +@xref{Precision}. + +@item +@cindex precision +@code{--enable-long-double}: Produces a long-double precision version of +FFTW (@code{long double}) instead of the default double-precision +(@code{double}). The @code{configure} script will halt with an error +message if @code{long double} is the same size as @code{double} on your +machine/compiler. @xref{Precision}. + +@item +@cindex precision +@code{--enable-quad-precision}: Produces a quadruple-precision version +of FFTW using the nonstandard @code{__float128} type provided by +@code{gcc} 4.6 or later on x86, x86-64, and Itanium architectures, +instead of the default double-precision (@code{double}). The +@code{configure} script will halt with an error message if the +compiler is not @code{gcc} version 4.6 or later or if @code{gcc}'s +@code{libquadmath} library is not installed. @xref{Precision}. + +@item +@cindex threads +@code{--enable-threads}: Enables compilation and installation of the +FFTW threads library (@pxref{Multi-threaded FFTW}), which provides a +simple interface to parallel transforms for SMP systems. By default, +the threads routines are not compiled. + +@item +@code{--enable-openmp}: Like @code{--enable-threads}, but using OpenMP +compiler directives in order to induce parallelism rather than +spawning its own threads directly, and installing an @samp{fftw3_omp} library +rather than an @samp{fftw3_threads} library (@pxref{Multi-threaded +FFTW}). You can use both @code{--enable-openmp} and @code{--enable-threads} +since they compile/install libraries with different names. By default, +the OpenMP routines are not compiled. + +@item +@code{--with-combined-threads}: By default, if @code{--enable-threads} +is used, the threads support is compiled into a separate library that +must be linked in addition to the main FFTW library. This is so that +users of the serial library do not need to link the system threads +libraries. If @code{--with-combined-threads} is specified, however, +then no separate threads library is created, and threads are included +in the main FFTW library. This is mainly useful under Windows, where +no system threads library is required and inter-library dependencies +are problematic. + +@item +@cindex MPI +@code{--enable-mpi}: Enables compilation and installation of the FFTW +MPI library (@pxref{Distributed-memory FFTW with MPI}), which provides +parallel transforms for distributed-memory systems with MPI. (By +default, the MPI routines are not compiled.) @xref{FFTW MPI +Installation}. + +@item +@cindex Fortran-callable wrappers +@code{--disable-fortran}: Disables inclusion of legacy-Fortran +wrapper routines (@pxref{Calling FFTW from Legacy Fortran}) in the standard +FFTW libraries. These wrapper routines increase the library size by +only a negligible amount, so they are included by default as long as +the @code{configure} script finds a Fortran compiler on your system. +(To specify a particular Fortran compiler @i{foo}, pass +@code{F77=}@i{foo} to @code{configure}.) + +@item +@code{--with-g77-wrappers}: By default, when Fortran wrappers are +included, the wrappers employ the linking conventions of the Fortran +compiler detected by the @code{configure} script. If this compiler is +GNU @code{g77}, however, then @emph{two} versions of the wrappers are +included: one with @code{g77}'s idiosyncratic convention of appending +two underscores to identifiers, and one with the more common +convention of appending only a single underscore. This way, the same +FFTW library will work with both @code{g77} and other Fortran +compilers, such as GNU @code{gfortran}. However, the converse is not +true: if you configure with a different compiler, then the +@code{g77}-compatible wrappers are not included. By specifying +@code{--with-g77-wrappers}, the @code{g77}-compatible wrappers are +included in addition to wrappers for whatever Fortran compiler +@code{configure} finds. +@fpindex g77 + +@item +@code{--with-slow-timer}: Disables the use of hardware cycle counters, +and falls back on @code{gettimeofday} or @code{clock}. This greatly +worsens performance, and should generally not be used (unless you don't +have a cycle counter but still really want an optimized plan regardless +of the time). @xref{Cycle Counters}. + +@item +@code{--enable-sse} (single precision), +@code{--enable-sse2} (single, double), +@code{--enable-avx} (single, double), +@code{--enable-avx2} (single, double), +@code{--enable-avx512} (single, double), +@code{--enable-avx-128-fma}, +@code{--enable-kcvi} (single), +@code{--enable-altivec} (single), +@code{--enable-vsx} (single, double), +@code{--enable-neon} (single, double on aarch64), +@code{--enable-generic-simd128}, +and +@code{--enable-generic-simd256}: + +Enable various SIMD instruction sets. You need compiler that supports +the given SIMD extensions, but FFTW will try to detect at runtime +whether the CPU supports these extensions. That is, you can compile +with@code{--enable-avx} and the code will still run on a CPU without AVX +support. + +@itemize @minus +@item +These options require a compiler supporting SIMD extensions, and +compiler support is always a bit flaky: see the FFTW FAQ for a list of +compiler versions that have problems compiling FFTW. +@item +Because of the large variety of ARM processors and ABIs, FFTW +does not attempt to guess the correct @code{gcc} flags for generating +NEON code. In general, you will have to provide them on the command line. +This command line is known to have worked at least once: +@example +./configure --with-slow-timer --host=arm-linux-gnueabi \ + --enable-single --enable-neon \ + "CC=arm-linux-gnueabi-gcc -march=armv7-a -mfloat-abi=softfp" +@end example +@end itemize + +@end itemize + +@cindex compiler +To force @code{configure} to use a particular C compiler @i{foo} +(instead of the default, usually @code{gcc}), pass @code{CC=}@i{foo} to the +@code{configure} script; you may also need to set the flags via the variable +@code{CFLAGS} as described above. +@cindex compiler flags + +@c ------------------------------------------------------------ +@node Installation on non-Unix systems, Cycle Counters, Installation on Unix, Installation and Customization +@section Installation on non-Unix systems + +It should be relatively straightforward to compile FFTW even on non-Unix +systems lacking the niceties of a @code{configure} script. Basically, +you need to edit the @code{config.h} header (copy it from +@code{config.h.in}) to @code{#define} the various options and compiler +characteristics, and then compile all the @samp{.c} files in the +relevant directories. + +The @code{config.h} header contains about 100 options to set, each one +initially an @code{#undef}, each documented with a comment, and most of +them fairly obvious. For most of the options, you should simply +@code{#define} them to @code{1} if they are applicable, although a few +options require a particular value (e.g. @code{SIZEOF_LONG_LONG} should +be defined to the size of the @code{long long} type, in bytes, or zero +if it is not supported). We will likely post some sample +@code{config.h} files for various operating systems and compilers for +you to use (at least as a starting point). Please let us know if you +have to hand-create a configuration file (and/or a pre-compiled binary) +that you want to share. + +To create the FFTW library, you will then need to compile all of the +@samp{.c} files in the @code{kernel}, @code{dft}, @code{dft/scalar}, +@code{dft/scalar/codelets}, @code{rdft}, @code{rdft/scalar}, +@code{rdft/scalar/r2cf}, @code{rdft/scalar/r2cb}, +@code{rdft/scalar/r2r}, @code{reodft}, and @code{api} directories. +If you are compiling with SIMD support (e.g. you defined +@code{HAVE_SSE2} in @code{config.h}), then you also need to compile +the @code{.c} files in the @code{simd-support}, +@code{@{dft,rdft@}/simd}, @code{@{dft,rdft@}/simd/*} directories. + +Once these files are all compiled, link them into a library, or a shared +library, or directly into your program. + +To compile the FFTW test program, additionally compile the code in the +@code{libbench2/} directory, and link it into a library. Then compile +the code in the @code{tests/} directory and link it to the +@code{libbench2} and FFTW libraries. To compile the @code{fftw-wisdom} +(command-line) tool (@pxref{Wisdom Utilities}), compile +@code{tools/fftw-wisdom.c} and link it to the @code{libbench2} and FFTW +libraries + +@c ------------------------------------------------------------ +@node Cycle Counters, Generating your own code, Installation on non-Unix systems, Installation and Customization +@section Cycle Counters +@cindex cycle counter + +FFTW's planner actually executes and times different possible FFT +algorithms in order to pick the fastest plan for a given @math{n}. In +order to do this in as short a time as possible, however, the timer must +have a very high resolution, and to accomplish this we employ the +hardware @dfn{cycle counters} that are available on most CPUs. +Currently, FFTW supports the cycle counters on x86, PowerPC/POWER, Alpha, +UltraSPARC (SPARC v9), IA64, PA-RISC, and MIPS processors. + +@cindex compiler +Access to the cycle counters, unfortunately, is a compiler and/or +operating-system dependent task, often requiring inline assembly +language, and it may be that your compiler is not supported. If you are +@emph{not} supported, FFTW will by default fall back on its estimator +(effectively using @code{FFTW_ESTIMATE} for all plans). +@ctindex FFTW_ESTIMATE + +You can add support by editing the file @code{kernel/cycle.h}; normally, +this will involve adapting one of the examples already present in order +to use the inline-assembler syntax for your C compiler, and will only +require a couple of lines of code. Anyone adding support for a new +system to @code{cycle.h} is encouraged to email us at @email{fftw@@fftw.org}. + +If a cycle counter is not available on your system (e.g. some embedded +processor), and you don't want to use estimated plans, as a last resort +you can use the @code{--with-slow-timer} option to @code{configure} (on +Unix) or @code{#define WITH_SLOW_TIMER} in @code{config.h} (elsewhere). +This will use the much lower-resolution @code{gettimeofday} function, or even +@code{clock} if the former is unavailable, and planning will be +extremely slow. + +@c ------------------------------------------------------------ +@node Generating your own code, , Cycle Counters, Installation and Customization +@section Generating your own code +@cindex code generator + +The directory @code{genfft} contains the programs that were used to +generate FFTW's ``codelets,'' which are hard-coded transforms of small +sizes. +@cindex codelet +We do not expect casual users to employ the generator, which is a rather +sophisticated program that generates directed acyclic graphs of FFT +algorithms and performs algebraic simplifications on them. It was +written in Objective Caml, a dialect of ML, which is available at +@uref{http://caml.inria.fr/ocaml/index.en.html}. +@cindex Caml + + +If you have Objective Caml installed (along with recent versions of +GNU @code{autoconf}, @code{automake}, and @code{libtool}), then you +can change the set of codelets that are generated or play with the +generation options. The set of generated codelets is specified by the +@code{@{dft,rdft@}/@{codelets,simd@}/*/Makefile.am} files. For example, you can add +efficient REDFT codelets of small sizes by modifying +@code{rdft/codelets/r2r/Makefile.am}. +@cindex REDFT +After you modify any @code{Makefile.am} files, you can type @code{sh +bootstrap.sh} in the top-level directory followed by @code{make} to +re-generate the files. + +We do not provide more details about the code-generation process, since +we do not expect that most users will need to generate their own code. +However, feel free to contact us at @email{fftw@@fftw.org} if +you are interested in the subject. + +@cindex monadic programming +You might find it interesting to learn Caml and/or some modern +programming techniques that we used in the generator (including monadic +programming), especially if you heard the rumor that Java and +object-oriented programming are the latest advancement in the field. +The internal operation of the codelet generator is described in the +paper, ``A Fast Fourier Transform Compiler,'' by M. Frigo, which is +available from the @uref{http://www.fftw.org,FFTW home page} and also +appeared in the @cite{Proceedings of the 1999 ACM SIGPLAN Conference on +Programming Language Design and Implementation (PLDI)}. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/intro.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/intro.texi new file mode 100644 index 000000000..b20d867f7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/intro.texi @@ -0,0 +1,165 @@ +@node Introduction, Tutorial, Top, Top +@chapter Introduction +This manual documents version @value{VERSION} of FFTW, the +@emph{Fastest Fourier Transform in the West}. FFTW is a comprehensive +collection of fast C routines for computing the discrete Fourier +transform (DFT) and various special cases thereof. +@cindex discrete Fourier transform +@cindex DFT +@itemize @bullet +@item FFTW computes the DFT of complex data, real data, even- + or odd-symmetric real data (these symmetric transforms are usually + known as the discrete cosine or sine transform, respectively), and the + discrete Hartley transform (DHT) of real data. + +@item The input data can have arbitrary length. + FFTW employs @Onlogn{} algorithms for all lengths, including + prime numbers. + +@item FFTW supports arbitrary multi-dimensional data. + +@item FFTW supports the SSE, SSE2, AVX, AVX2, AVX512, KCVI, Altivec, VSX, and + NEON vector instruction sets. + +@item FFTW includes parallel (multi-threaded) transforms + for shared-memory systems. +@item Starting with version 3.3, FFTW includes distributed-memory parallel + transforms using MPI. +@end itemize + +We assume herein that you are familiar with the properties and uses of +the DFT that are relevant to your application. Otherwise, see +e.g. @cite{The Fast Fourier Transform and Its Applications} by E. O. Brigham +(Prentice-Hall, Englewood Cliffs, NJ, 1988). +@uref{http://www.fftw.org, Our web page} also has links to FFT-related +information online. +@cindex FFTW + +@c TODO: revise. We don't need to brag any longer +@c +@c FFTW is usually faster (and sometimes much faster) than all other +@c freely-available Fourier transform programs found on the Net. It is +@c competitive with (and often faster than) the FFT codes in Sun's +@c Performance Library, IBM's ESSL library, HP's CXML library, and +@c Intel's MKL library, which are targeted at specific machines. +@c Moreover, FFTW's performance is @emph{portable}. Indeed, FFTW is +@c unique in that it automatically adapts itself to your machine, your +@c cache, the size of your memory, your number of registers, and all the +@c other factors that normally make it impossible to optimize a program +@c for more than one machine. An extensive comparison of FFTW's +@c performance with that of other Fourier transform codes has been made, +@c and the results are available on the Web at +@c @uref{http://fftw.org/benchfft, the benchFFT home page}. +@c @cindex benchmark +@c @fpindex benchfft + +In order to use FFTW effectively, you need to learn one basic concept +of FFTW's internal structure: FFTW does not use a fixed algorithm for +computing the transform, but instead it adapts the DFT algorithm to +details of the underlying hardware in order to maximize performance. +Hence, the computation of the transform is split into two phases. +First, FFTW's @dfn{planner} ``learns'' the fastest way to compute the +transform on your machine. The planner +@cindex planner +produces a data structure called a @dfn{plan} that contains this +@cindex plan +information. Subsequently, the plan is @dfn{executed} +@cindex execute +to transform the array of input data as dictated by the plan. The +plan can be reused as many times as needed. In typical +high-performance applications, many transforms of the same size are +computed and, consequently, a relatively expensive initialization of +this sort is acceptable. On the other hand, if you need a single +transform of a given size, the one-time cost of the planner becomes +significant. For this case, FFTW provides fast planners based on +heuristics or on previously computed plans. + +FFTW supports transforms of data with arbitrary length, rank, +multiplicity, and a general memory layout. In simple cases, however, +this generality may be unnecessary and confusing. Consequently, we +organized the interface to FFTW into three levels of increasing +generality. +@itemize @bullet +@item The @dfn{basic interface} computes a single + transform of contiguous data. +@item The @dfn{advanced interface} computes transforms + of multiple or strided arrays. +@item The @dfn{guru interface} supports the most general data + layouts, multiplicities, and strides. +@end itemize +We expect that most users will be best served by the basic interface, +whereas the guru interface requires careful attention to the +documentation to avoid problems. +@cindex basic interface +@cindex advanced interface +@cindex guru interface + + +Besides the automatic performance adaptation performed by the planner, +it is also possible for advanced users to customize FFTW manually. For +example, if code space is a concern, we provide a tool that links only +the subset of FFTW needed by your application. Conversely, you may need +to extend FFTW because the standard distribution is not sufficient for +your needs. For example, the standard FFTW distribution works most +efficiently for arrays whose size can be factored into small primes +(@math{2}, @math{3}, @math{5}, and @math{7}), and otherwise it uses a +slower general-purpose routine. If you need efficient transforms of +other sizes, you can use FFTW's code generator, which produces fast C +programs (``codelets'') for any particular array size you may care +about. +@cindex code generator +@cindex codelet +For example, if you need transforms of size +@ifinfo +@math{513 = 19 x 3^3}, +@end ifinfo +@tex +$513 = 19 \cdot 3^3$, +@end tex +@html +513 = 19*33, +@end html +you can customize FFTW to support the factor @math{19} efficiently. + +For more information regarding FFTW, see the paper, ``The Design and +Implementation of FFTW3,'' by M. Frigo and S. G. Johnson, which was an +invited paper in @cite{Proc. IEEE} @b{93} (2), p. 216 (2005). The +code generator is described in the paper ``A fast Fourier transform +compiler'', +@cindex compiler +by M. Frigo, in the @cite{Proceedings of the 1999 ACM SIGPLAN Conference +on Programming Language Design and Implementation (PLDI), Atlanta, +Georgia, May 1999}. These papers, along with the latest version of +FFTW, the FAQ, benchmarks, and other links, are available at +@uref{http://www.fftw.org, the FFTW home page}. + +The current version of FFTW incorporates many good ideas from the past +thirty years of FFT literature. In one way or another, FFTW uses the +Cooley-Tukey algorithm, the prime factor algorithm, Rader's algorithm +for prime sizes, and a split-radix algorithm (with a +``conjugate-pair'' variation pointed out to us by Dan Bernstein). +FFTW's code generator also produces new algorithms that we do not +completely understand. +@cindex algorithm +The reader is referred to the cited papers for the appropriate +references. + +The rest of this manual is organized as follows. We first discuss the +sequential (single-processor) implementation. We start by describing +the basic interface/features of FFTW in @ref{Tutorial}. +Next, @ref{Other Important Topics} discusses data alignment +(@pxref{SIMD alignment and fftw_malloc}), +the storage scheme of multi-dimensional arrays +(@pxref{Multi-dimensional Array Format}), and FFTW's mechanism for +storing plans on disk (@pxref{Words of Wisdom-Saving Plans}). Next, +@ref{FFTW Reference} provides comprehensive documentation of all +FFTW's features. Parallel transforms are discussed in their own +chapters: @ref{Multi-threaded FFTW} and @ref{Distributed-memory FFTW +with MPI}. Fortran programmers can also use FFTW, as described in +@ref{Calling FFTW from Legacy Fortran} and @ref{Calling FFTW from +Modern Fortran}. @ref{Installation and Customization} explains how to +install FFTW in your computer system and how to adapt FFTW to your +needs. License and copyright information is given in @ref{License and +Copyright}. Finally, we thank all the people who helped us in +@ref{Acknowledgments}. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/legacy-fortran.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/legacy-fortran.texi new file mode 100644 index 000000000..7ae6142a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/legacy-fortran.texi @@ -0,0 +1,374 @@ +@node Calling FFTW from Legacy Fortran, Upgrading from FFTW version 2, Calling FFTW from Modern Fortran, Top +@chapter Calling FFTW from Legacy Fortran +@cindex Fortran interface + +This chapter describes the interface to FFTW callable by Fortran code +in older compilers not supporting the Fortran 2003 C interoperability +features (@pxref{Calling FFTW from Modern Fortran}). This interface +has the major disadvantage that it is not type-checked, so if you +mistake the argument types or ordering then your program will not have +any compiler errors, and will likely crash at runtime. So, greater +care is needed. Also, technically interfacing older Fortran versions +to C is nonstandard, but in practice we have found that the techniques +used in this chapter have worked with all known Fortran compilers for +many years. + +The legacy Fortran interface differs from the C interface only in the +prefix (@samp{dfftw_} instead of @samp{fftw_} in double precision) and +a few other minor details. This Fortran interface is included in the +FFTW libraries by default, unless a Fortran compiler isn't found on +your system or @code{--disable-fortran} is included in the +@code{configure} flags. We assume here that the reader is already +familiar with the usage of FFTW in C, as described elsewhere in this +manual. + +The MPI parallel interface to FFTW is @emph{not} currently available +to legacy Fortran. + +@menu +* Fortran-interface routines:: +* FFTW Constants in Fortran:: +* FFTW Execution in Fortran:: +* Fortran Examples:: +* Wisdom of Fortran?:: +@end menu + +@c ------------------------------------------------------- +@node Fortran-interface routines, FFTW Constants in Fortran, Calling FFTW from Legacy Fortran, Calling FFTW from Legacy Fortran +@section Fortran-interface routines + +Nearly all of the FFTW functions have Fortran-callable equivalents. +The name of the legacy Fortran routine is the same as that of the +corresponding C routine, but with the @samp{fftw_} prefix replaced by +@samp{dfftw_}.@footnote{Technically, Fortran 77 identifiers are not +allowed to have more than 6 characters, nor may they contain +underscores. Any compiler that enforces this limitation doesn't +deserve to link to FFTW.} The single and long-double precision +versions use @samp{sfftw_} and @samp{lfftw_}, respectively, instead of +@samp{fftwf_} and @samp{fftwl_}; quadruple precision (@code{real*16}) +is available on some systems as @samp{fftwq_} (@pxref{Precision}). +(Note that @code{long double} on x86 hardware is usually at most +80-bit extended precision, @emph{not} quadruple precision.) + +For the most part, all of the arguments to the functions are the same, +with the following exceptions: + +@itemize @bullet + +@item +@code{plan} variables (what would be of type @code{fftw_plan} in C), +must be declared as a type that is at least as big as a pointer +(address) on your machine. We recommend using @code{integer*8} everywhere, +since this should always be big enough. +@cindex portability + +@item +Any function that returns a value (e.g. @code{fftw_plan_dft}) is +converted into a @emph{subroutine}. The return value is converted into +an additional @emph{first} parameter of this subroutine.@footnote{The +reason for this is that some Fortran implementations seem to have +trouble with C function return values, and vice versa.} + +@item +@cindex column-major +The Fortran routines expect multi-dimensional arrays to be in +@emph{column-major} order, which is the ordinary format of Fortran +arrays (@pxref{Multi-dimensional Array Format}). They do this +transparently and costlessly simply by reversing the order of the +dimensions passed to FFTW, but this has one important consequence for +multi-dimensional real-complex transforms, discussed below. + +@item +Wisdom import and export is somewhat more tricky because one cannot +easily pass files or strings between C and Fortran; see @ref{Wisdom of +Fortran?}. + +@item +Legacy Fortran cannot use the @code{fftw_malloc} dynamic-allocation routine. +If you want to exploit the SIMD FFTW (@pxref{SIMD alignment and fftw_malloc}), you'll +need to figure out some other way to ensure that your arrays are at +least 16-byte aligned. + +@item +@tindex fftw_iodim +@cindex guru interface +Since Fortran 77 does not have data structures, the @code{fftw_iodim} +structure from the guru interface (@pxref{Guru vector and transform +sizes}) must be split into separate arguments. In particular, any +@code{fftw_iodim} array arguments in the C guru interface become three +integer array arguments (@code{n}, @code{is}, and @code{os}) in the +Fortran guru interface, all of whose lengths should be equal to the +corresponding @code{rank} argument. + +@item +The guru planner interface in Fortran does @emph{not} do any automatic +translation between column-major and row-major; you are responsible +for setting the strides etcetera to correspond to your Fortran arrays. +However, as a slight bug that we are preserving for backwards +compatibility, the @samp{plan_guru_r2r} in Fortran @emph{does} reverse the +order of its @code{kind} array parameter, so the @code{kind} array +of that routine should be in the reverse of the order of the iodim +arrays (see above). + +@end itemize + +In general, you should take care to use Fortran data types that +correspond to (i.e. are the same size as) the C types used by FFTW. +In practice, this correspondence is usually straightforward +(i.e. @code{integer} corresponds to @code{int}, @code{real} +corresponds to @code{float}, etcetera). The native Fortran +double/single-precision complex type should be compatible with +@code{fftw_complex}/@code{fftwf_complex}. Such simple correspondences +are assumed in the examples below. +@cindex portability + +@c ------------------------------------------------------- +@node FFTW Constants in Fortran, FFTW Execution in Fortran, Fortran-interface routines, Calling FFTW from Legacy Fortran +@section FFTW Constants in Fortran + +When creating plans in FFTW, a number of constants are used to specify +options, such as @code{FFTW_MEASURE} or @code{FFTW_ESTIMATE}. The +same constants must be used with the wrapper routines, but of course the +C header files where the constants are defined can't be incorporated +directly into Fortran code. + +Instead, we have placed Fortran equivalents of the FFTW constant +definitions in the file @code{fftw3.f}, which can be found in the same +directory as @code{fftw3.h}. If your Fortran compiler supports a +preprocessor of some sort, you should be able to @code{include} or +@code{#include} this file; otherwise, you can paste it directly into +your code. + +@cindex flags +In C, you combine different flags (like @code{FFTW_PRESERVE_INPUT} and +@code{FFTW_MEASURE}) using the @samp{@code{|}} operator; in Fortran +you should just use @samp{@code{+}}. (Take care not to add in the +same flag more than once, though. Alternatively, you can use the +@code{ior} intrinsic function standardized in Fortran 95.) + +@c ------------------------------------------------------- +@node FFTW Execution in Fortran, Fortran Examples, FFTW Constants in Fortran, Calling FFTW from Legacy Fortran +@section FFTW Execution in Fortran + +In C, in order to use a plan, one normally calls @code{fftw_execute}, +which executes the plan to perform the transform on the input/output +arrays passed when the plan was created (@pxref{Using Plans}). The +corresponding subroutine call in legacy Fortran is: +@example + call dfftw_execute(plan) +@end example +@findex dfftw_execute + +However, we have had reports that this causes problems with some +recent optimizing Fortran compilers. The problem is, because the +input/output arrays are not passed as explicit arguments to +@code{dfftw_execute}, the semantics of Fortran (unlike C) allow the +compiler to assume that the input/output arrays are not changed by +@code{dfftw_execute}. As a consequence, certain compilers end up +optimizing out or repositioning the call to @code{dfftw_execute}, +assuming incorrectly that it does nothing. + +There are various workarounds to this, but the safest and simplest +thing is to not use @code{dfftw_execute} in Fortran. Instead, use the +functions described in @ref{New-array Execute Functions}, which take +the input/output arrays as explicit arguments. For example, if the +plan is for a complex-data DFT and was created for the arrays +@code{in} and @code{out}, you would do: +@example + call dfftw_execute_dft(plan, in, out) +@end example +@findex dfftw_execute_dft + +There are a few things to be careful of, however: + +@itemize @bullet + +@item +You must use the correct type of execute function, matching the way +the plan was created. Complex DFT plans should use +@code{dfftw_execute_dft}, Real-input (r2c) DFT plans should use use +@code{dfftw_execute_dft_r2c}, and real-output (c2r) DFT plans should +use @code{dfftw_execute_dft_c2r}. The various r2r plans should use +@code{dfftw_execute_r2r}. + +@item +You should normally pass the same input/output arrays that were used when +creating the plan. This is always safe. + +@item +@emph{If} you pass @emph{different} input/output arrays compared to +those used when creating the plan, you must abide by all the +restrictions of the new-array execute functions (@pxref{New-array +Execute Functions}). The most difficult of these, in Fortran, is the +requirement that the new arrays have the same alignment as the +original arrays, because there seems to be no way in legacy Fortran to obtain +guaranteed-aligned arrays (analogous to @code{fftw_malloc} in C). You +can, of course, use the @code{FFTW_UNALIGNED} flag when creating the +plan, in which case the plan does not depend on the alignment, but +this may sacrifice substantial performance on architectures (like x86) +with SIMD instructions (@pxref{SIMD alignment and fftw_malloc}). +@ctindex FFTW_UNALIGNED + +@end itemize + +@c ------------------------------------------------------- +@node Fortran Examples, Wisdom of Fortran?, FFTW Execution in Fortran, Calling FFTW from Legacy Fortran +@section Fortran Examples + +In C, you might have something like the following to transform a +one-dimensional complex array: + +@example + fftw_complex in[N], out[N]; + fftw_plan plan; + + plan = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE); + fftw_execute(plan); + fftw_destroy_plan(plan); +@end example + +In Fortran, you would use the following to accomplish the same thing: + +@example + double complex in, out + dimension in(N), out(N) + integer*8 plan + + call dfftw_plan_dft_1d(plan,N,in,out,FFTW_FORWARD,FFTW_ESTIMATE) + call dfftw_execute_dft(plan, in, out) + call dfftw_destroy_plan(plan) +@end example +@findex dfftw_plan_dft_1d +@findex dfftw_execute_dft +@findex dfftw_destroy_plan + +Notice how all routines are called as Fortran subroutines, and the +plan is returned via the first argument to @code{dfftw_plan_dft_1d}. +Notice also that we changed @code{fftw_execute} to +@code{dfftw_execute_dft} (@pxref{FFTW Execution in Fortran}). To do +the same thing, but using 8 threads in parallel (@pxref{Multi-threaded +FFTW}), you would simply prefix these calls with: + +@example + integer iret + call dfftw_init_threads(iret) + call dfftw_plan_with_nthreads(8) +@end example +@findex dfftw_init_threads +@findex dfftw_plan_with_nthreads + +(You might want to check the value of @code{iret}: if it is zero, it +indicates an unlikely error during thread initialization.) + +To transform a three-dimensional array in-place with C, you might do: + +@example + fftw_complex arr[L][M][N]; + fftw_plan plan; + + plan = fftw_plan_dft_3d(L,M,N, arr,arr, + FFTW_FORWARD, FFTW_ESTIMATE); + fftw_execute(plan); + fftw_destroy_plan(plan); +@end example + +In Fortran, you would use this instead: + +@example + double complex arr + dimension arr(L,M,N) + integer*8 plan + + call dfftw_plan_dft_3d(plan, L,M,N, arr,arr, + & FFTW_FORWARD, FFTW_ESTIMATE) + call dfftw_execute_dft(plan, arr, arr) + call dfftw_destroy_plan(plan) +@end example +@findex dfftw_plan_dft_3d + +Note that we pass the array dimensions in the ``natural'' order in both C +and Fortran. + +To transform a one-dimensional real array in Fortran, you might do: + +@example + double precision in + dimension in(N) + double complex out + dimension out(N/2 + 1) + integer*8 plan + + call dfftw_plan_dft_r2c_1d(plan,N,in,out,FFTW_ESTIMATE) + call dfftw_execute_dft_r2c(plan, in, out) + call dfftw_destroy_plan(plan) +@end example +@findex dfftw_plan_dft_r2c_1d +@findex dfftw_execute_dft_r2c + +To transform a two-dimensional real array, out of place, you might use +the following: + +@example + double precision in + dimension in(M,N) + double complex out + dimension out(M/2 + 1, N) + integer*8 plan + + call dfftw_plan_dft_r2c_2d(plan,M,N,in,out,FFTW_ESTIMATE) + call dfftw_execute_dft_r2c(plan, in, out) + call dfftw_destroy_plan(plan) +@end example +@findex dfftw_plan_dft_r2c_2d + +@strong{Important:} Notice that it is the @emph{first} dimension of the +complex output array that is cut in half in Fortran, rather than the +last dimension as in C. This is a consequence of the interface routines +reversing the order of the array dimensions passed to FFTW so that the +Fortran program can use its ordinary column-major order. +@cindex column-major +@cindex r2c/c2r multi-dimensional array format + +@c ------------------------------------------------------- +@node Wisdom of Fortran?, , Fortran Examples, Calling FFTW from Legacy Fortran +@section Wisdom of Fortran? + +In this section, we discuss how one can import/export FFTW wisdom +(saved plans) to/from a Fortran program; we assume that the reader is +already familiar with wisdom, as described in @ref{Words of +Wisdom-Saving Plans}. + +@cindex portability +The basic problem is that is difficult to (portably) pass files and +strings between Fortran and C, so we cannot provide a direct Fortran +equivalent to the @code{fftw_export_wisdom_to_file}, etcetera, +functions. Fortran interfaces @emph{are} provided for the functions +that do not take file/string arguments, however: +@code{dfftw_import_system_wisdom}, @code{dfftw_import_wisdom}, +@code{dfftw_export_wisdom}, and @code{dfftw_forget_wisdom}. +@findex dfftw_import_system_wisdom +@findex dfftw_import_wisdom +@findex dfftw_export_wisdom +@findex dfftw_forget_wisdom + + +So, for example, to import the system-wide wisdom, you would do: + +@example + integer isuccess + call dfftw_import_system_wisdom(isuccess) +@end example + +As usual, the C return value is turned into a first parameter; +@code{isuccess} is non-zero on success and zero on failure (e.g. if +there is no system wisdom installed). + +If you want to import/export wisdom from/to an arbitrary file or +elsewhere, you can employ the generic @code{dfftw_import_wisdom} and +@code{dfftw_export_wisdom} functions, for which you must supply a +subroutine to read/write one character at a time. The FFTW package +contains an example file @code{doc/f77_wisdom.f} demonstrating how to +implement @code{import_wisdom_from_file} and +@code{export_wisdom_to_file} subroutines in this way. (These routines +cannot be compiled into the FFTW library itself, lest all FFTW-using +programs be required to link with the Fortran I/O library.) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/license.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/license.texi new file mode 100644 index 000000000..e317085e5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/license.texi @@ -0,0 +1,38 @@ +@node License and Copyright, Concept Index, Acknowledgments, Top +@chapter License and Copyright + +FFTW is Copyright @copyright{} 2003, 2007-11 Matteo Frigo, Copyright +@copyright{} 2003, 2007-11 Massachusetts Institute of Technology. + +FFTW is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA You can also +find the @uref{http://www.gnu.org/licenses/gpl-2.0.html, GPL on the GNU +web site}. + +In addition, we kindly ask you to acknowledge FFTW and its authors in +any program or publication in which you use FFTW. (You are not +@emph{required} to do so; it is up to your common sense to decide +whether you want to comply with this request or not.) For general +publications, we suggest referencing: Matteo Frigo and Steven +G. Johnson, ``The design and implementation of FFTW3,'' +@i{Proc. IEEE} @b{93} (2), 216--231 (2005). + +Non-free versions of FFTW are available under terms different from those +of the General Public License. (e.g. they do not require you to +accompany any object code using FFTW with the corresponding source +code.) For these alternative terms you must purchase a license from MIT's +Technology Licensing Office. Users interested in such a license should +contact us (@email{fftw@@fftw.org}) for more information. + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/mdate-sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/mdate-sh new file mode 100755 index 000000000..9e2c0c9b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/mdate-sh @@ -0,0 +1,228 @@ +#!/bin/sh +# Get modification time of a file or directory and pretty-print it. + +scriptversion=2015-04-09.19; # UTC + +# Copyright (C) 1995-2014 Free Software Foundation, Inc. +# written by Ulrich Drepper , June 1995 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +fi + +case $1 in + '') + echo "$0: No file. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: mdate-sh [--help] [--version] FILE + +Pretty-print the modification day of FILE, in the format: +1 January 1970 + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "mdate-sh $scriptversion" + exit $? + ;; +esac + +error () +{ + echo "$0: $1" >&2 + exit 1 +} + + +# Prevent date giving response in another language. +LANG=C +export LANG +LC_ALL=C +export LC_ALL +LC_TIME=C +export LC_TIME + +# Use UTC to get reproducible result +TZ=UTC +export TZ + +# GNU ls changes its time format in response to the TIME_STYLE +# variable. Since we cannot assume 'unset' works, revert this +# variable to its documented default. +if test "${TIME_STYLE+set}" = set; then + TIME_STYLE=posix-long-iso + export TIME_STYLE +fi + +save_arg1=$1 + +# Find out how to get the extended ls output of a file or directory. +if ls -L /dev/null 1>/dev/null 2>&1; then + ls_command='ls -L -l -d' +else + ls_command='ls -l -d' +fi +# Avoid user/group names that might have spaces, when possible. +if ls -n /dev/null 1>/dev/null 2>&1; then + ls_command="$ls_command -n" +fi + +# A 'ls -l' line looks as follows on OS/2. +# drwxrwx--- 0 Aug 11 2001 foo +# This differs from Unix, which adds ownership information. +# drwxrwx--- 2 root root 4096 Aug 11 2001 foo +# +# To find the date, we split the line on spaces and iterate on words +# until we find a month. This cannot work with files whose owner is a +# user named "Jan", or "Feb", etc. However, it's unlikely that '/' +# will be owned by a user whose name is a month. So we first look at +# the extended ls output of the root directory to decide how many +# words should be skipped to get the date. + +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +set x`$ls_command /` + +# Find which argument is the month. +month= +command= +until test $month +do + test $# -gt 0 || error "failed parsing '$ls_command /' output" + shift + # Add another shift to the command. + command="$command shift;" + case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; + esac +done + +test -n "$month" || error "failed parsing '$ls_command /' output" + +# Get the extended ls output of the file or directory. +set dummy x`eval "$ls_command \"\\\$save_arg1\""` + +# Remove all preceding arguments +eval $command + +# Because of the dummy argument above, month is in $2. +# +# On a POSIX system, we should have +# +# $# = 5 +# $1 = file size +# $2 = month +# $3 = day +# $4 = year or time +# $5 = filename +# +# On Darwin 7.7.0 and 7.6.0, we have +# +# $# = 4 +# $1 = day +# $2 = month +# $3 = year or time +# $4 = filename + +# Get the month. +case $2 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; +esac + +case $3 in + ???*) day=$1;; + *) day=$3; shift;; +esac + +# Here we have to deal with the problem that the ls output gives either +# the time of day or the year. +case $3 in + *:*) set `date`; eval year=\$$# + case $2 in + Jan) nummonthtod=1;; + Feb) nummonthtod=2;; + Mar) nummonthtod=3;; + Apr) nummonthtod=4;; + May) nummonthtod=5;; + Jun) nummonthtod=6;; + Jul) nummonthtod=7;; + Aug) nummonthtod=8;; + Sep) nummonthtod=9;; + Oct) nummonthtod=10;; + Nov) nummonthtod=11;; + Dec) nummonthtod=12;; + esac + # For the first six month of the year the time notation can also + # be used for files modified in the last year. + if (expr $nummonth \> $nummonthtod) > /dev/null; + then + year=`expr $year - 1` + fi;; + *) year=$3;; +esac + +# The result. +echo $day $month $year + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/modern-fortran.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/modern-fortran.texi new file mode 100644 index 000000000..cad11fdd4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/modern-fortran.texi @@ -0,0 +1,725 @@ +@node Calling FFTW from Modern Fortran, Calling FFTW from Legacy Fortran, Distributed-memory FFTW with MPI, Top +@chapter Calling FFTW from Modern Fortran +@cindex Fortran interface + +Fortran 2003 standardized ways for Fortran code to call C libraries, +and this allows us to support a direct translation of the FFTW C API +into Fortran. Compared to the legacy Fortran 77 interface +(@pxref{Calling FFTW from Legacy Fortran}), this direct interface +offers many advantages, especially compile-time type-checking and +aligned memory allocation. As of this writing, support for these C +interoperability features seems widespread, having been implemented in +nearly all major Fortran compilers (e.g. GNU, Intel, IBM, +Oracle/Solaris, Portland Group, NAG). +@cindex portability + +This chapter documents that interface. For the most part, since this +interface allows Fortran to call the C interface directly, the usage +is identical to C translated to Fortran syntax. However, there are a +few subtle points such as memory allocation, wisdom, and data types +that deserve closer attention. + +@menu +* Overview of Fortran interface:: +* Reversing array dimensions:: +* FFTW Fortran type reference:: +* Plan execution in Fortran:: +* Allocating aligned memory in Fortran:: +* Accessing the wisdom API from Fortran:: +* Defining an FFTW module:: +@end menu + +@c ------------------------------------------------------- +@node Overview of Fortran interface, Reversing array dimensions, Calling FFTW from Modern Fortran, Calling FFTW from Modern Fortran +@section Overview of Fortran interface + +FFTW provides a file @code{fftw3.f03} that defines Fortran 2003 +interfaces for all of its C routines, except for the MPI routines +described elsewhere, which can be found in the same directory as +@code{fftw3.h} (the C header file). In any Fortran subroutine where +you want to use FFTW functions, you should begin with: + +@cindex iso_c_binding +@example + use, intrinsic :: iso_c_binding + include 'fftw3.f03' +@end example + +This includes the interface definitions and the standard +@code{iso_c_binding} module (which defines the equivalents of C +types). You can also put the FFTW functions into a module if you +prefer (@pxref{Defining an FFTW module}). + +At this point, you can now call anything in the FFTW C interface +directly, almost exactly as in C other than minor changes in syntax. +For example: + +@findex fftw_plan_dft_2d +@findex fftw_execute_dft +@findex fftw_destroy_plan +@example + type(C_PTR) :: plan + complex(C_DOUBLE_COMPLEX), dimension(1024,1000) :: in, out + plan = fftw_plan_dft_2d(1000,1024, in,out, FFTW_FORWARD,FFTW_ESTIMATE) + ... + call fftw_execute_dft(plan, in, out) + ... + call fftw_destroy_plan(plan) +@end example + +A few important things to keep in mind are: + +@itemize @bullet + +@item +@tindex fftw_complex +@ctindex C_PTR +@ctindex C_INT +@ctindex C_DOUBLE +@ctindex C_DOUBLE_COMPLEX +FFTW plans are @code{type(C_PTR)}. Other C types are mapped in the +obvious way via the @code{iso_c_binding} standard: @code{int} turns +into @code{integer(C_INT)}, @code{fftw_complex} turns into +@code{complex(C_DOUBLE_COMPLEX)}, @code{double} turns into +@code{real(C_DOUBLE)}, and so on. @xref{FFTW Fortran type reference}. + +@item +Functions in C become functions in Fortran if they have a return value, +and subroutines in Fortran otherwise. + +@item +The ordering of the Fortran array dimensions must be @emph{reversed} +when they are passed to the FFTW plan creation, thanks to differences +in array indexing conventions (@pxref{Multi-dimensional Array +Format}). This is @emph{unlike} the legacy Fortran interface +(@pxref{Fortran-interface routines}), which reversed the dimensions +for you. @xref{Reversing array dimensions}. + +@item +@cindex alignment +@cindex SIMD +Using ordinary Fortran array declarations like this works, but may +yield suboptimal performance because the data may not be not aligned +to exploit SIMD instructions on modern proessors (@pxref{SIMD +alignment and fftw_malloc}). Better performance will often be obtained +by allocating with @samp{fftw_alloc}. @xref{Allocating aligned memory +in Fortran}. + +@item +@findex fftw_execute +Similar to the legacy Fortran interface (@pxref{FFTW Execution in +Fortran}), we currently recommend @emph{not} using @code{fftw_execute} +but rather using the more specialized functions like +@code{fftw_execute_dft} (@pxref{New-array Execute Functions}). +However, you should execute the plan on the @code{same arrays} as the +ones for which you created the plan, unless you are especially +careful. @xref{Plan execution in Fortran}. To prevent +you from using @code{fftw_execute} by mistake, the @code{fftw3.f03} +file does not provide an @code{fftw_execute} interface declaration. + +@item +@cindex flags +Multiple planner flags are combined with @code{ior} (equivalent to @samp{|} in C). e.g. @code{FFTW_MEASURE | FFTW_DESTROY_INPUT} becomes @code{ior(FFTW_MEASURE, FFTW_DESTROY_INPUT)}. (You can also use @samp{+} as long as you don't try to include a given flag more than once.) + +@end itemize + +@menu +* Extended and quadruple precision in Fortran:: +@end menu + +@node Extended and quadruple precision in Fortran, , Overview of Fortran interface, Overview of Fortran interface +@subsection Extended and quadruple precision in Fortran +@cindex precision + +If FFTW is compiled in @code{long double} (extended) precision +(@pxref{Installation and Customization}), you may be able to call the +resulting @code{fftwl_} routines (@pxref{Precision}) from Fortran if +your compiler supports the @code{C_LONG_DOUBLE_COMPLEX} type code. + +Because some Fortran compilers do not support +@code{C_LONG_DOUBLE_COMPLEX}, the @code{fftwl_} declarations are +segregated into a separate interface file @code{fftw3l.f03}, which you +should include @emph{in addition} to @code{fftw3.f03} (which declares +precision-independent @samp{FFTW_} constants): + +@cindex iso_c_binding +@example + use, intrinsic :: iso_c_binding + include 'fftw3.f03' + include 'fftw3l.f03' +@end example + +We also support using the nonstandard @code{__float128} +quadruple-precision type provided by recent versions of @code{gcc} on +32- and 64-bit x86 hardware (@pxref{Installation and Customization}), +using the corresponding @code{real(16)} and @code{complex(16)} types +supported by @code{gfortran}. The quadruple-precision @samp{fftwq_} +functions (@pxref{Precision}) are declared in a @code{fftw3q.f03} +interface file, which should be included in addition to +@code{fftw3l.f03}, as above. You should also link with +@code{-lfftw3q -lquadmath -lm} as in C. + +@c ------------------------------------------------------- +@node Reversing array dimensions, FFTW Fortran type reference, Overview of Fortran interface, Calling FFTW from Modern Fortran +@section Reversing array dimensions + +@cindex row-major +@cindex column-major +A minor annoyance in calling FFTW from Fortran is that FFTW's array +dimensions are defined in the C convention (row-major order), while +Fortran's array dimensions are the opposite convention (column-major +order). @xref{Multi-dimensional Array Format}. This is just a +bookkeeping difference, with no effect on performance. The only +consequence of this is that, whenever you create an FFTW plan for a +multi-dimensional transform, you must always @emph{reverse the +ordering of the dimensions}. + +For example, consider the three-dimensional (@threedims{L,M,N}) arrays: + +@example + complex(C_DOUBLE_COMPLEX), dimension(L,M,N) :: in, out +@end example + +To plan a DFT for these arrays using @code{fftw_plan_dft_3d}, you could do: + +@findex fftw_plan_dft_3d +@example + plan = fftw_plan_dft_3d(N,M,L, in,out, FFTW_FORWARD,FFTW_ESTIMATE) +@end example + +That is, from FFTW's perspective this is a @threedims{N,M,L} array. +@emph{No data transposition need occur}, as this is @emph{only +notation}. Similarly, to use the more generic routine +@code{fftw_plan_dft} with the same arrays, you could do: + +@example + integer(C_INT), dimension(3) :: n = [N,M,L] + plan = fftw_plan_dft_3d(3, n, in,out, FFTW_FORWARD,FFTW_ESTIMATE) +@end example + +Note, by the way, that this is different from the legacy Fortran +interface (@pxref{Fortran-interface routines}), which automatically +reverses the order of the array dimension for you. Here, you are +calling the C interface directly, so there is no ``translation'' layer. + +@cindex r2c/c2r multi-dimensional array format +An important thing to keep in mind is the implication of this for +multidimensional real-to-complex transforms (@pxref{Multi-Dimensional +DFTs of Real Data}). In C, a multidimensional real-to-complex DFT +chops the last dimension roughly in half (@threedims{N,M,L} real input +goes to @threedims{N,M,L/2+1} complex output). In Fortran, because +the array dimension notation is reversed, the @emph{first} dimension of +the complex data is chopped roughly in half. For example consider the +@samp{r2c} transform of @threedims{L,M,N} real input in Fortran: + +@findex fftw_plan_dft_r2c_3d +@findex fftw_execute_dft_r2c +@example + type(C_PTR) :: plan + real(C_DOUBLE), dimension(L,M,N) :: in + complex(C_DOUBLE_COMPLEX), dimension(L/2+1,M,N) :: out + plan = fftw_plan_dft_r2c_3d(N,M,L, in,out, FFTW_ESTIMATE) + ... + call fftw_execute_dft_r2c(plan, in, out) +@end example + +@cindex in-place +@cindex padding +Alternatively, for an in-place r2c transform, as described in the C +documentation we must @emph{pad} the @emph{first} dimension of the +real input with an extra two entries (which are ignored by FFTW) so as +to leave enough space for the complex output. The input is +@emph{allocated} as a @threedims{2[L/2+1],M,N} array, even though only +@threedims{L,M,N} of it is actually used. In this example, we will +allocate the array as a pointer type, using @samp{fftw_alloc} to +ensure aligned memory for maximum performance (@pxref{Allocating +aligned memory in Fortran}); this also makes it easy to reference the +same memory as both a real array and a complex array. + +@findex fftw_alloc_complex +@findex c_f_pointer +@example + real(C_DOUBLE), pointer :: in(:,:,:) + complex(C_DOUBLE_COMPLEX), pointer :: out(:,:,:) + type(C_PTR) :: plan, data + data = fftw_alloc_complex(int((L/2+1) * M * N, C_SIZE_T)) + call c_f_pointer(data, in, [2*(L/2+1),M,N]) + call c_f_pointer(data, out, [L/2+1,M,N]) + plan = fftw_plan_dft_r2c_3d(N,M,L, in,out, FFTW_ESTIMATE) + ... + call fftw_execute_dft_r2c(plan, in, out) + ... + call fftw_destroy_plan(plan) + call fftw_free(data) +@end example + +@c ------------------------------------------------------- +@node FFTW Fortran type reference, Plan execution in Fortran, Reversing array dimensions, Calling FFTW from Modern Fortran +@section FFTW Fortran type reference + +The following are the most important type correspondences between the +C interface and Fortran: + +@itemize @bullet + +@item +@tindex fftw_plan +Plans (@code{fftw_plan} and variants) are @code{type(C_PTR)} (i.e. an +opaque pointer). + +@item +@tindex fftw_complex +@cindex precision +@ctindex C_DOUBLE +@ctindex C_FLOAT +@ctindex C_LONG_DOUBLE +@ctindex C_DOUBLE_COMPLEX +@ctindex C_FLOAT_COMPLEX +@ctindex C_LONG_DOUBLE_COMPLEX +The C floating-point types @code{double}, @code{float}, and @code{long +double} correspond to @code{real(C_DOUBLE)}, @code{real(C_FLOAT)}, and +@code{real(C_LONG_DOUBLE)}, respectively. The C complex types +@code{fftw_complex}, @code{fftwf_complex}, and @code{fftwl_complex} +correspond in Fortran to @code{complex(C_DOUBLE_COMPLEX)}, +@code{complex(C_FLOAT_COMPLEX)}, and +@code{complex(C_LONG_DOUBLE_COMPLEX)}, respectively. +Just as in C +(@pxref{Precision}), the FFTW subroutines and types are prefixed with +@samp{fftw_}, @code{fftwf_}, and @code{fftwl_} for the different precisions, and link to different libraries (@code{-lfftw3}, @code{-lfftw3f}, and @code{-lfftw3l} on Unix), but use the @emph{same} include file @code{fftw3.f03} and the @emph{same} constants (all of which begin with @samp{FFTW_}). The exception is @code{long double} precision, for which you should @emph{also} include @code{fftw3l.f03} (@pxref{Extended and quadruple precision in Fortran}). + +@item +@tindex ptrdiff_t +@ctindex C_INT +@ctindex C_INTPTR_T +@ctindex C_SIZE_T +@findex fftw_malloc +The C integer types @code{int} and @code{unsigned} (used for planner +flags) become @code{integer(C_INT)}. The C integer type @code{ptrdiff_t} (e.g. in the @ref{64-bit Guru Interface}) becomes @code{integer(C_INTPTR_T)}, and @code{size_t} (in @code{fftw_malloc} etc.) becomes @code{integer(C_SIZE_T)}. + +@item +@tindex fftw_r2r_kind +@ctindex C_FFTW_R2R_KIND +The @code{fftw_r2r_kind} type (@pxref{Real-to-Real Transform Kinds}) +becomes @code{integer(C_FFTW_R2R_KIND)}. The various constant values +of the C enumerated type (@code{FFTW_R2HC} etc.) become simply integer +constants of the same names in Fortran. + +@item +@ctindex FFTW_DESTROY_INPUT +@cindex in-place +@findex fftw_flops +Numeric array pointer arguments (e.g. @code{double *}) +become @code{dimension(*), intent(out)} arrays of the same type, or +@code{dimension(*), intent(in)} if they are pointers to constant data +(e.g. @code{const int *}). There are a few exceptions where numeric +pointers refer to scalar outputs (e.g. for @code{fftw_flops}), in which +case they are @code{intent(out)} scalar arguments in Fortran too. +For the new-array execute functions (@pxref{New-array Execute Functions}), +the input arrays are declared @code{dimension(*), intent(inout)}, since +they can be modified in the case of in-place or @code{FFTW_DESTROY_INPUT} +transforms. + +@item +@findex fftw_alloc_real +@findex c_f_pointer +Pointer @emph{return} values (e.g @code{double *}) become +@code{type(C_PTR)}. (If they are pointers to arrays, as for +@code{fftw_alloc_real}, you can convert them back to Fortran array +pointers with the standard intrinsic function @code{c_f_pointer}.) + +@item +@cindex guru interface +@tindex fftw_iodim +@tindex fftw_iodim64 +@cindex 64-bit architecture +The @code{fftw_iodim} type in the guru interface (@pxref{Guru vector +and transform sizes}) becomes @code{type(fftw_iodim)} in Fortran, a +derived data type (the Fortran analogue of C's @code{struct}) with +three @code{integer(C_INT)} components: @code{n}, @code{is}, and +@code{os}, with the same meanings as in C. The @code{fftw_iodim64} type in the 64-bit guru interface (@pxref{64-bit Guru Interface}) is the same, except that its components are of type @code{integer(C_INTPTR_T)}. + +@item +@ctindex C_FUNPTR +Using the wisdom import/export functions from Fortran is a bit tricky, +and is discussed in @ref{Accessing the wisdom API from Fortran}. In +brief, the @code{FILE *} arguments map to @code{type(C_PTR)}, @code{const char *} to @code{character(C_CHAR), dimension(*), intent(in)} (null-terminated!), and the generic read-char/write-char functions map to @code{type(C_FUNPTR)}. + +@end itemize + +@cindex portability +You may be wondering if you need to search-and-replace +@code{real(kind(0.0d0))} (or whatever your favorite Fortran spelling +of ``double precision'' is) with @code{real(C_DOUBLE)} everywhere in +your program, and similarly for @code{complex} and @code{integer} +types. The answer is no; you can still use your existing types. As +long as these types match their C counterparts, things should work +without a hitch. The worst that can happen, e.g. in the (unlikely) +event of a system where @code{real(kind(0.0d0))} is different from +@code{real(C_DOUBLE)}, is that the compiler will give you a +type-mismatch error. That is, if you don't use the +@code{iso_c_binding} kinds you need to accept at least the theoretical +possibility of having to change your code in response to compiler +errors on some future machine, but you don't need to worry about +silently compiling incorrect code that yields runtime errors. + +@c ------------------------------------------------------- +@node Plan execution in Fortran, Allocating aligned memory in Fortran, FFTW Fortran type reference, Calling FFTW from Modern Fortran +@section Plan execution in Fortran + +In C, in order to use a plan, one normally calls @code{fftw_execute}, +which executes the plan to perform the transform on the input/output +arrays passed when the plan was created (@pxref{Using Plans}). The +corresponding subroutine call in modern Fortran is: +@example + call fftw_execute(plan) +@end example +@findex fftw_execute + +However, we have had reports that this causes problems with some +recent optimizing Fortran compilers. The problem is, because the +input/output arrays are not passed as explicit arguments to +@code{fftw_execute}, the semantics of Fortran (unlike C) allow the +compiler to assume that the input/output arrays are not changed by +@code{fftw_execute}. As a consequence, certain compilers end up +repositioning the call to @code{fftw_execute}, assuming incorrectly +that it does nothing to the arrays. + +There are various workarounds to this, but the safest and simplest +thing is to not use @code{fftw_execute} in Fortran. Instead, use the +functions described in @ref{New-array Execute Functions}, which take +the input/output arrays as explicit arguments. For example, if the +plan is for a complex-data DFT and was created for the arrays +@code{in} and @code{out}, you would do: +@example + call fftw_execute_dft(plan, in, out) +@end example +@findex fftw_execute_dft + +There are a few things to be careful of, however: + +@itemize @bullet + +@item +@findex fftw_execute_dft_r2c +@findex fftw_execute_dft_c2r +@findex fftw_execute_r2r +You must use the correct type of execute function, matching the way +the plan was created. Complex DFT plans should use +@code{fftw_execute_dft}, Real-input (r2c) DFT plans should use use +@code{fftw_execute_dft_r2c}, and real-output (c2r) DFT plans should +use @code{fftw_execute_dft_c2r}. The various r2r plans should use +@code{fftw_execute_r2r}. Fortunately, if you use the wrong one you +will get a compile-time type-mismatch error (unlike legacy Fortran). + +@item +You should normally pass the same input/output arrays that were used when +creating the plan. This is always safe. + +@item +@emph{If} you pass @emph{different} input/output arrays compared to +those used when creating the plan, you must abide by all the +restrictions of the new-array execute functions (@pxref{New-array +Execute Functions}). The most tricky of these is the +requirement that the new arrays have the same alignment as the +original arrays; the best (and possibly only) way to guarantee this +is to use the @samp{fftw_alloc} functions to allocate your arrays (@pxref{Allocating aligned memory in Fortran}). Alternatively, you can +use the @code{FFTW_UNALIGNED} flag when creating the +plan, in which case the plan does not depend on the alignment, but +this may sacrifice substantial performance on architectures (like x86) +with SIMD instructions (@pxref{SIMD alignment and fftw_malloc}). +@ctindex FFTW_UNALIGNED + +@end itemize + +@c ------------------------------------------------------- +@node Allocating aligned memory in Fortran, Accessing the wisdom API from Fortran, Plan execution in Fortran, Calling FFTW from Modern Fortran +@section Allocating aligned memory in Fortran + +@cindex alignment +@findex fftw_alloc_real +@findex fftw_alloc_complex +In order to obtain maximum performance in FFTW, you should store your +data in arrays that have been specially aligned in memory (@pxref{SIMD +alignment and fftw_malloc}). Enforcing alignment also permits you to +safely use the new-array execute functions (@pxref{New-array Execute +Functions}) to apply a given plan to more than one pair of in/out +arrays. Unfortunately, standard Fortran arrays do @emph{not} provide +any alignment guarantees. The @emph{only} way to allocate aligned +memory in standard Fortran is to allocate it with an external C +function, like the @code{fftw_alloc_real} and +@code{fftw_alloc_complex} functions. Fortunately, Fortran 2003 provides +a simple way to associate such allocated memory with a standard Fortran +array pointer that you can then use normally. + +We therefore recommend allocating all your input/output arrays using +the following technique: + +@enumerate + +@item +Declare a @code{pointer}, @code{arr}, to your array of the desired type +and dimensions. For example, @code{real(C_DOUBLE), pointer :: a(:,:)} +for a 2d real array, or @code{complex(C_DOUBLE_COMPLEX), pointer :: +a(:,:,:)} for a 3d complex array. + +@item +The number of elements to allocate must be an +@code{integer(C_SIZE_T)}. You can either declare a variable of this +type, e.g. @code{integer(C_SIZE_T) :: sz}, to store the number of +elements to allocate, or you can use the @code{int(..., C_SIZE_T)} +intrinsic function. e.g. set @code{sz = L * M * N} or use +@code{int(L * M * N, C_SIZE_T)} for an @threedims{L,M,N} array. + +@item +Declare a @code{type(C_PTR) :: p} to hold the return value from +FFTW's allocation routine. Set @code{p = fftw_alloc_real(sz)} for a real array, or @code{p = fftw_alloc_complex(sz)} for a complex array. + +@item +@findex c_f_pointer +Associate your pointer @code{arr} with the allocated memory @code{p} +using the standard @code{c_f_pointer} subroutine: @code{call +c_f_pointer(p, arr, [...dimensions...])}, where +@code{[...dimensions...])} are an array of the dimensions of the array +(in the usual Fortran order). e.g. @code{call c_f_pointer(p, arr, +[L,M,N])} for an @threedims{L,M,N} array. (Alternatively, you can +omit the dimensions argument if you specified the shape explicitly +when declaring @code{arr}.) You can now use @code{arr} as a usual +multidimensional array. + +@item +When you are done using the array, deallocate the memory by @code{call +fftw_free(p)} on @code{p}. + +@end enumerate + +For example, here is how we would allocate an @twodims{L,M} 2d real array: + +@example + real(C_DOUBLE), pointer :: arr(:,:) + type(C_PTR) :: p + p = fftw_alloc_real(int(L * M, C_SIZE_T)) + call c_f_pointer(p, arr, [L,M]) + @emph{...use arr and arr(i,j) as usual...} + call fftw_free(p) +@end example + +and here is an @threedims{L,M,N} 3d complex array: + +@example + complex(C_DOUBLE_COMPLEX), pointer :: arr(:,:,:) + type(C_PTR) :: p + p = fftw_alloc_complex(int(L * M * N, C_SIZE_T)) + call c_f_pointer(p, arr, [L,M,N]) + @emph{...use arr and arr(i,j,k) as usual...} + call fftw_free(p) +@end example + +See @ref{Reversing array dimensions} for an example allocating a +single array and associating both real and complex array pointers with +it, for in-place real-to-complex transforms. + +@c ------------------------------------------------------- +@node Accessing the wisdom API from Fortran, Defining an FFTW module, Allocating aligned memory in Fortran, Calling FFTW from Modern Fortran +@section Accessing the wisdom API from Fortran +@cindex wisdom +@cindex saving plans to disk + +As explained in @ref{Words of Wisdom-Saving Plans}, FFTW provides a +``wisdom'' API for saving plans to disk so that they can be recreated +quickly. The C API for exporting (@pxref{Wisdom Export}) and +importing (@pxref{Wisdom Import}) wisdom is somewhat tricky to use +from Fortran, however, because of differences in file I/O and string +types between C and Fortran. + +@menu +* Wisdom File Export/Import from Fortran:: +* Wisdom String Export/Import from Fortran:: +* Wisdom Generic Export/Import from Fortran:: +@end menu + +@c =========> +@node Wisdom File Export/Import from Fortran, Wisdom String Export/Import from Fortran, Accessing the wisdom API from Fortran, Accessing the wisdom API from Fortran +@subsection Wisdom File Export/Import from Fortran + +@findex fftw_import wisdom_from_filename +@findex fftw_export_wisdom_to_filename +The easiest way to export and import wisdom is to do so using +@code{fftw_export_wisdom_to_filename} and +@code{fftw_wisdom_from_filename}. The only trick is that these +require you to pass a C string, which is an array of type +@code{CHARACTER(C_CHAR)} that is terminated by @code{C_NULL_CHAR}. +You can call them like this: + +@example + integer(C_INT) :: ret + ret = fftw_export_wisdom_to_filename(C_CHAR_'my_wisdom.dat' // C_NULL_CHAR) + if (ret .eq. 0) stop 'error exporting wisdom to file' + ret = fftw_import_wisdom_from_filename(C_CHAR_'my_wisdom.dat' // C_NULL_CHAR) + if (ret .eq. 0) stop 'error importing wisdom from file' +@end example + +Note that prepending @samp{C_CHAR_} is needed to specify that the +literal string is of kind @code{C_CHAR}, and we null-terminate the +string by appending @samp{// C_NULL_CHAR}. These functions return an +@code{integer(C_INT)} (@code{ret}) which is @code{0} if an error +occurred during export/import and nonzero otherwise. + +It is also possible to use the lower-level routines +@code{fftw_export_wisdom_to_file} and +@code{fftw_import_wisdom_from_file}, which accept parameters of the C +type @code{FILE*}, expressed in Fortran as @code{type(C_PTR)}. +However, you are then responsible for creating the @code{FILE*} +yourself. You can do this by using @code{iso_c_binding} to define +Fortran intefaces for the C library functions @code{fopen} and +@code{fclose}, which is a bit strange in Fortran but workable. + +@c =========> +@node Wisdom String Export/Import from Fortran, Wisdom Generic Export/Import from Fortran, Wisdom File Export/Import from Fortran, Accessing the wisdom API from Fortran +@subsection Wisdom String Export/Import from Fortran + +@findex fftw_export_wisdom_to_string +Dealing with FFTW's C string export/import is a bit more painful. In +particular, the @code{fftw_export_wisdom_to_string} function requires +you to deal with a dynamically allocated C string. To get its length, +you must define an interface to the C @code{strlen} function, and to +deallocate it you must define an interface to C @code{free}: + +@example + use, intrinsic :: iso_c_binding + interface + integer(C_INT) function strlen(s) bind(C, name='strlen') + import + type(C_PTR), value :: s + end function strlen + subroutine free(p) bind(C, name='free') + import + type(C_PTR), value :: p + end subroutine free + end interface +@end example + +Given these definitions, you can then export wisdom to a Fortran +character array: + +@example + character(C_CHAR), pointer :: s(:) + integer(C_SIZE_T) :: slen + type(C_PTR) :: p + p = fftw_export_wisdom_to_string() + if (.not. c_associated(p)) stop 'error exporting wisdom' + slen = strlen(p) + call c_f_pointer(p, s, [slen+1]) + ... + call free(p) +@end example +@findex c_associated +@findex c_f_pointer + +Note that @code{slen} is the length of the C string, but the length of +the array is @code{slen+1} because it includes the terminating null +character. (You can omit the @samp{+1} if you don't want Fortran to +know about the null character.) The standard @code{c_associated} function +checks whether @code{p} is a null pointer, which is returned by +@code{fftw_export_wisdom_to_string} if there was an error. + +@findex fftw_import_wisdom_from_string +To import wisdom from a string, use +@code{fftw_import_wisdom_from_string} as usual; note that the argument +of this function must be a @code{character(C_CHAR)} that is terminated +by the @code{C_NULL_CHAR} character, like the @code{s} array above. + +@c =========> +@node Wisdom Generic Export/Import from Fortran, , Wisdom String Export/Import from Fortran, Accessing the wisdom API from Fortran +@subsection Wisdom Generic Export/Import from Fortran + +The most generic wisdom export/import functions allow you to provide +an arbitrary callback function to read/write one character at a time +in any way you want. However, your callback function must be written +in a special way, using the @code{bind(C)} attribute to be passed to a +C interface. + +@findex fftw_export_wisdom +In particular, to call the generic wisdom export function +@code{fftw_export_wisdom}, you would write a callback subroutine of the form: + +@example + subroutine my_write_char(c, p) bind(C) + use, intrinsic :: iso_c_binding + character(C_CHAR), value :: c + type(C_PTR), value :: p + @emph{...write c...} + end subroutine my_write_char +@end example + +Given such a subroutine (along with the corresponding interface definition), you could then export wisdom using: + +@findex c_funloc +@example + call fftw_export_wisdom(c_funloc(my_write_char), p) +@end example + +@findex c_loc +@findex c_f_pointer +The standard @code{c_funloc} intrinsic converts a Fortran +@code{bind(C)} subroutine into a C function pointer. The parameter +@code{p} is a @code{type(C_PTR)} to any arbitrary data that you want +to pass to @code{my_write_char} (or @code{C_NULL_PTR} if none). (Note +that you can get a C pointer to Fortran data using the intrinsic +@code{c_loc}, and convert it back to a Fortran pointer in +@code{my_write_char} using @code{c_f_pointer}.) + +Similarly, to use the generic @code{fftw_import_wisdom}, you would +define a callback function of the form: + +@findex fftw_import_wisdom +@example + integer(C_INT) function my_read_char(p) bind(C) + use, intrinsic :: iso_c_binding + type(C_PTR), value :: p + character :: c + @emph{...read a character c...} + my_read_char = ichar(c, C_INT) + end function my_read_char + + .... + + integer(C_INT) :: ret + ret = fftw_import_wisdom(c_funloc(my_read_char), p) + if (ret .eq. 0) stop 'error importing wisdom' +@end example + +Your function can return @code{-1} if the end of the input is reached. +Again, @code{p} is an arbitrary @code{type(C_PTR} that is passed +through to your function. @code{fftw_import_wisdom} returns @code{0} +if an error occurred and nonzero otherwise. + +@c ------------------------------------------------------- +@node Defining an FFTW module, , Accessing the wisdom API from Fortran, Calling FFTW from Modern Fortran +@section Defining an FFTW module + +Rather than using the @code{include} statement to include the +@code{fftw3.f03} interface file in any subroutine where you want to +use FFTW, you might prefer to define an FFTW Fortran module. FFTW +does not install itself as a module, primarily because +@code{fftw3.f03} can be shared between different Fortran compilers while +modules (in general) cannot. However, it is trivial to define your +own FFTW module if you want. Just create a file containing: + +@example + module FFTW3 + use, intrinsic :: iso_c_binding + include 'fftw3.f03' + end module +@end example + +Compile this file into a module as usual for your compiler (e.g. with +@code{gfortran -c} you will get a file @code{fftw3.mod}). Now, +instead of @code{include 'fftw3.f03'}, whenever you want to use FFTW +routines you can just do: + +@example + use FFTW3 +@end example + +as usual for Fortran modules. (You still need to link to the FFTW +library, of course.) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/mpi.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/mpi.texi new file mode 100644 index 000000000..6f4ac38c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/mpi.texi @@ -0,0 +1,1768 @@ +@node Distributed-memory FFTW with MPI, Calling FFTW from Modern Fortran, Multi-threaded FFTW, Top +@chapter Distributed-memory FFTW with MPI +@cindex MPI + +@cindex parallel transform +In this chapter we document the parallel FFTW routines for parallel +systems supporting the MPI message-passing interface. Unlike the +shared-memory threads described in the previous chapter, MPI allows +you to use @emph{distributed-memory} parallelism, where each CPU has +its own separate memory, and which can scale up to clusters of many +thousands of processors. This capability comes at a price, however: +each process only stores a @emph{portion} of the data to be +transformed, which means that the data structures and +programming-interface are quite different from the serial or threads +versions of FFTW. +@cindex data distribution + + +Distributed-memory parallelism is especially useful when you are +transforming arrays so large that they do not fit into the memory of a +single processor. The storage per-process required by FFTW's MPI +routines is proportional to the total array size divided by the number +of processes. Conversely, distributed-memory parallelism can easily +pose an unacceptably high communications overhead for small problems; +the threshold problem size for which parallelism becomes advantageous +will depend on the precise problem you are interested in, your +hardware, and your MPI implementation. + +A note on terminology: in MPI, you divide the data among a set of +``processes'' which each run in their own memory address space. +Generally, each process runs on a different physical processor, but +this is not required. A set of processes in MPI is described by an +opaque data structure called a ``communicator,'' the most common of +which is the predefined communicator @code{MPI_COMM_WORLD} which +refers to @emph{all} processes. For more information on these and +other concepts common to all MPI programs, we refer the reader to the +documentation at @uref{http://www.mcs.anl.gov/research/projects/mpi/, the MPI home +page}. +@cindex MPI communicator +@ctindex MPI_COMM_WORLD + + +We assume in this chapter that the reader is familiar with the usage +of the serial (uniprocessor) FFTW, and focus only on the concepts new +to the MPI interface. + +@menu +* FFTW MPI Installation:: +* Linking and Initializing MPI FFTW:: +* 2d MPI example:: +* MPI Data Distribution:: +* Multi-dimensional MPI DFTs of Real Data:: +* Other Multi-dimensional Real-data MPI Transforms:: +* FFTW MPI Transposes:: +* FFTW MPI Wisdom:: +* Avoiding MPI Deadlocks:: +* FFTW MPI Performance Tips:: +* Combining MPI and Threads:: +* FFTW MPI Reference:: +* FFTW MPI Fortran Interface:: +@end menu + +@c ------------------------------------------------------------ +@node FFTW MPI Installation, Linking and Initializing MPI FFTW, Distributed-memory FFTW with MPI, Distributed-memory FFTW with MPI +@section FFTW MPI Installation + +All of the FFTW MPI code is located in the @code{mpi} subdirectory of +the FFTW package. On Unix systems, the FFTW MPI libraries and header +files are automatically configured, compiled, and installed along with +the uniprocessor FFTW libraries simply by including +@code{--enable-mpi} in the flags to the @code{configure} script +(@pxref{Installation on Unix}). +@fpindex configure + + +Any implementation of the MPI standard, version 1 or later, should +work with FFTW. The @code{configure} script will attempt to +automatically detect how to compile and link code using your MPI +implementation. In some cases, especially if you have multiple +different MPI implementations installed or have an unusual MPI +software package, you may need to provide this information explicitly. + +Most commonly, one compiles MPI code by invoking a special compiler +command, typically @code{mpicc} for C code. The @code{configure} +script knows the most common names for this command, but you can +specify the MPI compilation command explicitly by setting the +@code{MPICC} variable, as in @samp{./configure MPICC=mpicc ...}. +@fpindex mpicc + + +If, instead of a special compiler command, you need to link a certain +library, you can specify the link command via the @code{MPILIBS} +variable, as in @samp{./configure MPILIBS=-lmpi ...}. Note that if +your MPI library is installed in a non-standard location (one the +compiler does not know about by default), you may also have to specify +the location of the library and header files via @code{LDFLAGS} and +@code{CPPFLAGS} variables, respectively, as in @samp{./configure +LDFLAGS=-L/path/to/mpi/libs CPPFLAGS=-I/path/to/mpi/include ...}. + +@c ------------------------------------------------------------ +@node Linking and Initializing MPI FFTW, 2d MPI example, FFTW MPI Installation, Distributed-memory FFTW with MPI +@section Linking and Initializing MPI FFTW + +Programs using the MPI FFTW routines should be linked with +@code{-lfftw3_mpi -lfftw3 -lm} on Unix in double precision, +@code{-lfftw3f_mpi -lfftw3f -lm} in single precision, and so on +(@pxref{Precision}). You will also need to link with whatever library +is responsible for MPI on your system; in most MPI implementations, +there is a special compiler alias named @code{mpicc} to compile and +link MPI code. +@fpindex mpicc +@cindex linking on Unix +@cindex precision + + +@findex fftw_init_threads +Before calling any FFTW routines except possibly +@code{fftw_init_threads} (@pxref{Combining MPI and Threads}), but after calling +@code{MPI_Init}, you should call the function: + +@example +void fftw_mpi_init(void); +@end example +@findex fftw_mpi_init + +If, at the end of your program, you want to get rid of all memory and +other resources allocated internally by FFTW, for both the serial and +MPI routines, you can call: + +@example +void fftw_mpi_cleanup(void); +@end example +@findex fftw_mpi_cleanup + +which is much like the @code{fftw_cleanup()} function except that it +also gets rid of FFTW's MPI-related data. You must @emph{not} execute +any previously created plans after calling this function. + +@c ------------------------------------------------------------ +@node 2d MPI example, MPI Data Distribution, Linking and Initializing MPI FFTW, Distributed-memory FFTW with MPI +@section 2d MPI example + +Before we document the FFTW MPI interface in detail, we begin with a +simple example outlining how one would perform a two-dimensional +@code{N0} by @code{N1} complex DFT. + +@example +#include + +int main(int argc, char **argv) +@{ + const ptrdiff_t N0 = ..., N1 = ...; + fftw_plan plan; + fftw_complex *data; + ptrdiff_t alloc_local, local_n0, local_0_start, i, j; + + MPI_Init(&argc, &argv); + fftw_mpi_init(); + + /* @r{get local data size and allocate} */ + alloc_local = fftw_mpi_local_size_2d(N0, N1, MPI_COMM_WORLD, + &local_n0, &local_0_start); + data = fftw_alloc_complex(alloc_local); + + /* @r{create plan for in-place forward DFT} */ + plan = fftw_mpi_plan_dft_2d(N0, N1, data, data, MPI_COMM_WORLD, + FFTW_FORWARD, FFTW_ESTIMATE); + + /* @r{initialize data to some function} my_function(x,y) */ + for (i = 0; i < local_n0; ++i) for (j = 0; j < N1; ++j) + data[i*N1 + j] = my_function(local_0_start + i, j); + + /* @r{compute transforms, in-place, as many times as desired} */ + fftw_execute(plan); + + fftw_destroy_plan(plan); + + MPI_Finalize(); +@} +@end example + +As can be seen above, the MPI interface follows the same basic style +of allocate/plan/execute/destroy as the serial FFTW routines. All of +the MPI-specific routines are prefixed with @samp{fftw_mpi_} instead +of @samp{fftw_}. There are a few important differences, however: + +First, we must call @code{fftw_mpi_init()} after calling +@code{MPI_Init} (required in all MPI programs) and before calling any +other @samp{fftw_mpi_} routine. +@findex MPI_Init +@findex fftw_mpi_init + + +Second, when we create the plan with @code{fftw_mpi_plan_dft_2d}, +analogous to @code{fftw_plan_dft_2d}, we pass an additional argument: +the communicator, indicating which processes will participate in the +transform (here @code{MPI_COMM_WORLD}, indicating all processes). +Whenever you create, execute, or destroy a plan for an MPI transform, +you must call the corresponding FFTW routine on @emph{all} processes +in the communicator for that transform. (That is, these are +@emph{collective} calls.) Note that the plan for the MPI transform +uses the standard @code{fftw_execute} and @code{fftw_destroy} routines +(on the other hand, there are MPI-specific new-array execute functions +documented below). +@cindex collective function +@findex fftw_mpi_plan_dft_2d +@ctindex MPI_COMM_WORLD + + +Third, all of the FFTW MPI routines take @code{ptrdiff_t} arguments +instead of @code{int} as for the serial FFTW. @code{ptrdiff_t} is a +standard C integer type which is (at least) 32 bits wide on a 32-bit +machine and 64 bits wide on a 64-bit machine. This is to make it easy +to specify very large parallel transforms on a 64-bit machine. (You +can specify 64-bit transform sizes in the serial FFTW, too, but only +by using the @samp{guru64} planner interface. @xref{64-bit Guru +Interface}.) +@tindex ptrdiff_t +@cindex 64-bit architecture + + +Fourth, and most importantly, you don't allocate the entire +two-dimensional array on each process. Instead, you call +@code{fftw_mpi_local_size_2d} to find out what @emph{portion} of the +array resides on each processor, and how much space to allocate. +Here, the portion of the array on each process is a @code{local_n0} by +@code{N1} slice of the total array, starting at index +@code{local_0_start}. The total number of @code{fftw_complex} numbers +to allocate is given by the @code{alloc_local} return value, which +@emph{may} be greater than @code{local_n0 * N1} (in case some +intermediate calculations require additional storage). The data +distribution in FFTW's MPI interface is described in more detail by +the next section. +@findex fftw_mpi_local_size_2d +@cindex data distribution + + +Given the portion of the array that resides on the local process, it +is straightforward to initialize the data (here to a function +@code{myfunction}) and otherwise manipulate it. Of course, at the end +of the program you may want to output the data somehow, but +synchronizing this output is up to you and is beyond the scope of this +manual. (One good way to output a large multi-dimensional distributed +array in MPI to a portable binary file is to use the free HDF5 +library; see the @uref{http://www.hdfgroup.org/, HDF home page}.) +@cindex HDF5 +@cindex MPI I/O + +@c ------------------------------------------------------------ +@node MPI Data Distribution, Multi-dimensional MPI DFTs of Real Data, 2d MPI example, Distributed-memory FFTW with MPI +@section MPI Data Distribution +@cindex data distribution + +The most important concept to understand in using FFTW's MPI interface +is the data distribution. With a serial or multithreaded FFT, all of +the inputs and outputs are stored as a single contiguous chunk of +memory. With a distributed-memory FFT, the inputs and outputs are +broken into disjoint blocks, one per process. + +In particular, FFTW uses a @emph{1d block distribution} of the data, +distributed along the @emph{first dimension}. For example, if you +want to perform a @twodims{100,200} complex DFT, distributed over 4 +processes, each process will get a @twodims{25,200} slice of the data. +That is, process 0 will get rows 0 through 24, process 1 will get rows +25 through 49, process 2 will get rows 50 through 74, and process 3 +will get rows 75 through 99. If you take the same array but +distribute it over 3 processes, then it is not evenly divisible so the +different processes will have unequal chunks. FFTW's default choice +in this case is to assign 34 rows to processes 0 and 1, and 32 rows to +process 2. +@cindex block distribution + + +FFTW provides several @samp{fftw_mpi_local_size} routines that you can +call to find out what portion of an array is stored on the current +process. In most cases, you should use the default block sizes picked +by FFTW, but it is also possible to specify your own block size. For +example, with a @twodims{100,200} array on three processes, you can +tell FFTW to use a block size of 40, which would assign 40 rows to +processes 0 and 1, and 20 rows to process 2. FFTW's default is to +divide the data equally among the processes if possible, and as best +it can otherwise. The rows are always assigned in ``rank order,'' +i.e. process 0 gets the first block of rows, then process 1, and so +on. (You can change this by using @code{MPI_Comm_split} to create a +new communicator with re-ordered processes.) However, you should +always call the @samp{fftw_mpi_local_size} routines, if possible, +rather than trying to predict FFTW's distribution choices. + +In particular, it is critical that you allocate the storage size that +is returned by @samp{fftw_mpi_local_size}, which is @emph{not} +necessarily the size of the local slice of the array. The reason is +that intermediate steps of FFTW's algorithms involve transposing the +array and redistributing the data, so at these intermediate steps FFTW +may require more local storage space (albeit always proportional to +the total size divided by the number of processes). The +@samp{fftw_mpi_local_size} functions know how much storage is required +for these intermediate steps and tell you the correct amount to +allocate. + +@menu +* Basic and advanced distribution interfaces:: +* Load balancing:: +* Transposed distributions:: +* One-dimensional distributions:: +@end menu + +@node Basic and advanced distribution interfaces, Load balancing, MPI Data Distribution, MPI Data Distribution +@subsection Basic and advanced distribution interfaces + +As with the planner interface, the @samp{fftw_mpi_local_size} +distribution interface is broken into basic and advanced +(@samp{_many}) interfaces, where the latter allows you to specify the +block size manually and also to request block sizes when computing +multiple transforms simultaneously. These functions are documented +more exhaustively by the FFTW MPI Reference, but we summarize the +basic ideas here using a couple of two-dimensional examples. + +For the @twodims{100,200} complex-DFT example, above, we would find +the distribution by calling the following function in the basic +interface: + +@example +ptrdiff_t fftw_mpi_local_size_2d(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); +@end example +@findex fftw_mpi_local_size_2d + +Given the total size of the data to be transformed (here, @code{n0 = +100} and @code{n1 = 200}) and an MPI communicator (@code{comm}), this +function provides three numbers. + +First, it describes the shape of the local data: the current process +should store a @code{local_n0} by @code{n1} slice of the overall +dataset, in row-major order (@code{n1} dimension contiguous), starting +at index @code{local_0_start}. That is, if the total dataset is +viewed as a @code{n0} by @code{n1} matrix, the current process should +store the rows @code{local_0_start} to +@code{local_0_start+local_n0-1}. Obviously, if you are running with +only a single MPI process, that process will store the entire array: +@code{local_0_start} will be zero and @code{local_n0} will be +@code{n0}. @xref{Row-major Format}. +@cindex row-major + + +Second, the return value is the total number of data elements (e.g., +complex numbers for a complex DFT) that should be allocated for the +input and output arrays on the current process (ideally with +@code{fftw_malloc} or an @samp{fftw_alloc} function, to ensure optimal +alignment). It might seem that this should always be equal to +@code{local_n0 * n1}, but this is @emph{not} the case. FFTW's +distributed FFT algorithms require data redistributions at +intermediate stages of the transform, and in some circumstances this +may require slightly larger local storage. This is discussed in more +detail below, under @ref{Load balancing}. +@findex fftw_malloc +@findex fftw_alloc_complex + + +@cindex advanced interface +The advanced-interface @samp{local_size} function for multidimensional +transforms returns the same three things (@code{local_n0}, +@code{local_0_start}, and the total number of elements to allocate), +but takes more inputs: + +@example +ptrdiff_t fftw_mpi_local_size_many(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t block0, + MPI_Comm comm, + ptrdiff_t *local_n0, + ptrdiff_t *local_0_start); +@end example +@findex fftw_mpi_local_size_many + +The two-dimensional case above corresponds to @code{rnk = 2} and an +array @code{n} of length 2 with @code{n[0] = n0} and @code{n[1] = n1}. +This routine is for any @code{rnk > 1}; one-dimensional transforms +have their own interface because they work slightly differently, as +discussed below. + +First, the advanced interface allows you to perform multiple +transforms at once, of interleaved data, as specified by the +@code{howmany} parameter. (@code{hoamany} is 1 for a single +transform.) + +Second, here you can specify your desired block size in the @code{n0} +dimension, @code{block0}. To use FFTW's default block size, pass +@code{FFTW_MPI_DEFAULT_BLOCK} (0) for @code{block0}. Otherwise, on +@code{P} processes, FFTW will return @code{local_n0} equal to +@code{block0} on the first @code{P / block0} processes (rounded down), +return @code{local_n0} equal to @code{n0 - block0 * (P / block0)} on +the next process, and @code{local_n0} equal to zero on any remaining +processes. In general, we recommend using the default block size +(which corresponds to @code{n0 / P}, rounded up). +@ctindex FFTW_MPI_DEFAULT_BLOCK +@cindex block distribution + + +For example, suppose you have @code{P = 4} processes and @code{n0 = +21}. The default will be a block size of @code{6}, which will give +@code{local_n0 = 6} on the first three processes and @code{local_n0 = +3} on the last process. Instead, however, you could specify +@code{block0 = 5} if you wanted, which would give @code{local_n0 = 5} +on processes 0 to 2, @code{local_n0 = 6} on process 3. (This choice, +while it may look superficially more ``balanced,'' has the same +critical path as FFTW's default but requires more communications.) + +@node Load balancing, Transposed distributions, Basic and advanced distribution interfaces, MPI Data Distribution +@subsection Load balancing +@cindex load balancing + +Ideally, when you parallelize a transform over some @math{P} +processes, each process should end up with work that takes equal time. +Otherwise, all of the processes end up waiting on whichever process is +slowest. This goal is known as ``load balancing.'' In this section, +we describe the circumstances under which FFTW is able to load-balance +well, and in particular how you should choose your transform size in +order to load balance. + +Load balancing is especially difficult when you are parallelizing over +heterogeneous machines; for example, if one of your processors is a +old 486 and another is a Pentium IV, obviously you should give the +Pentium more work to do than the 486 since the latter is much slower. +FFTW does not deal with this problem, however---it assumes that your +processes run on hardware of comparable speed, and that the goal is +therefore to divide the problem as equally as possible. + +For a multi-dimensional complex DFT, FFTW can divide the problem +equally among the processes if: (i) the @emph{first} dimension +@code{n0} is divisible by @math{P}; and (ii), the @emph{product} of +the subsequent dimensions is divisible by @math{P}. (For the advanced +interface, where you can specify multiple simultaneous transforms via +some ``vector'' length @code{howmany}, a factor of @code{howmany} is +included in the product of the subsequent dimensions.) + +For a one-dimensional complex DFT, the length @code{N} of the data +should be divisible by @math{P} @emph{squared} to be able to divide +the problem equally among the processes. + +@node Transposed distributions, One-dimensional distributions, Load balancing, MPI Data Distribution +@subsection Transposed distributions + +Internally, FFTW's MPI transform algorithms work by first computing +transforms of the data local to each process, then by globally +@emph{transposing} the data in some fashion to redistribute the data +among the processes, transforming the new data local to each process, +and transposing back. For example, a two-dimensional @code{n0} by +@code{n1} array, distributed across the @code{n0} dimension, is +transformd by: (i) transforming the @code{n1} dimension, which are +local to each process; (ii) transposing to an @code{n1} by @code{n0} +array, distributed across the @code{n1} dimension; (iii) transforming +the @code{n0} dimension, which is now local to each process; (iv) +transposing back. +@cindex transpose + + +However, in many applications it is acceptable to compute a +multidimensional DFT whose results are produced in transposed order +(e.g., @code{n1} by @code{n0} in two dimensions). This provides a +significant performance advantage, because it means that the final +transposition step can be omitted. FFTW supports this optimization, +which you specify by passing the flag @code{FFTW_MPI_TRANSPOSED_OUT} +to the planner routines. To compute the inverse transform of +transposed output, you specify @code{FFTW_MPI_TRANSPOSED_IN} to tell +it that the input is transposed. In this section, we explain how to +interpret the output format of such a transform. +@ctindex FFTW_MPI_TRANSPOSED_OUT +@ctindex FFTW_MPI_TRANSPOSED_IN + + +Suppose you have are transforming multi-dimensional data with (at +least two) dimensions @ndims{}. As always, it is distributed along +the first dimension @dimk{0}. Now, if we compute its DFT with the +@code{FFTW_MPI_TRANSPOSED_OUT} flag, the resulting output data are stored +with the first @emph{two} dimensions transposed: @ndimstrans{}, +distributed along the @dimk{1} dimension. Conversely, if we take the +@ndimstrans{} data and transform it with the +@code{FFTW_MPI_TRANSPOSED_IN} flag, then the format goes back to the +original @ndims{} array. + +There are two ways to find the portion of the transposed array that +resides on the current process. First, you can simply call the +appropriate @samp{local_size} function, passing @ndimstrans{} (the +transposed dimensions). This would mean calling the @samp{local_size} +function twice, once for the transposed and once for the +non-transposed dimensions. Alternatively, you can call one of the +@samp{local_size_transposed} functions, which returns both the +non-transposed and transposed data distribution from a single call. +For example, for a 3d transform with transposed output (or input), you +might call: + +@example +ptrdiff_t fftw_mpi_local_size_3d_transposed( + ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); +@end example +@findex fftw_mpi_local_size_3d_transposed + +Here, @code{local_n0} and @code{local_0_start} give the size and +starting index of the @code{n0} dimension for the +@emph{non}-transposed data, as in the previous sections. For +@emph{transposed} data (e.g. the output for +@code{FFTW_MPI_TRANSPOSED_OUT}), @code{local_n1} and +@code{local_1_start} give the size and starting index of the @code{n1} +dimension, which is the first dimension of the transposed data +(@code{n1} by @code{n0} by @code{n2}). + +(Note that @code{FFTW_MPI_TRANSPOSED_IN} is completely equivalent to +performing @code{FFTW_MPI_TRANSPOSED_OUT} and passing the first two +dimensions to the planner in reverse order, or vice versa. If you +pass @emph{both} the @code{FFTW_MPI_TRANSPOSED_IN} and +@code{FFTW_MPI_TRANSPOSED_OUT} flags, it is equivalent to swapping the +first two dimensions passed to the planner and passing @emph{neither} +flag.) + +@node One-dimensional distributions, , Transposed distributions, MPI Data Distribution +@subsection One-dimensional distributions + +For one-dimensional distributed DFTs using FFTW, matters are slightly +more complicated because the data distribution is more closely tied to +how the algorithm works. In particular, you can no longer pass an +arbitrary block size and must accept FFTW's default; also, the block +sizes may be different for input and output. Also, the data +distribution depends on the flags and transform direction, in order +for forward and backward transforms to work correctly. + +@example +ptrdiff_t fftw_mpi_local_size_1d(ptrdiff_t n0, MPI_Comm comm, + int sign, unsigned flags, + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, + ptrdiff_t *local_no, ptrdiff_t *local_o_start); +@end example +@findex fftw_mpi_local_size_1d + +This function computes the data distribution for a 1d transform of +size @code{n0} with the given transform @code{sign} and @code{flags}. +Both input and output data use block distributions. The input on the +current process will consist of @code{local_ni} numbers starting at +index @code{local_i_start}; e.g. if only a single process is used, +then @code{local_ni} will be @code{n0} and @code{local_i_start} will +be @code{0}. Similarly for the output, with @code{local_no} numbers +starting at index @code{local_o_start}. The return value of +@code{fftw_mpi_local_size_1d} will be the total number of elements to +allocate on the current process (which might be slightly larger than +the local size due to intermediate steps in the algorithm). + +As mentioned above (@pxref{Load balancing}), the data will be divided +equally among the processes if @code{n0} is divisible by the +@emph{square} of the number of processes. In this case, +@code{local_ni} will equal @code{local_no}. Otherwise, they may be +different. + +For some applications, such as convolutions, the order of the output +data is irrelevant. In this case, performance can be improved by +specifying that the output data be stored in an FFTW-defined +``scrambled'' format. (In particular, this is the analogue of +transposed output in the multidimensional case: scrambled output saves +a communications step.) If you pass @code{FFTW_MPI_SCRAMBLED_OUT} in +the flags, then the output is stored in this (undocumented) scrambled +order. Conversely, to perform the inverse transform of data in +scrambled order, pass the @code{FFTW_MPI_SCRAMBLED_IN} flag. +@ctindex FFTW_MPI_SCRAMBLED_OUT +@ctindex FFTW_MPI_SCRAMBLED_IN + + +In MPI FFTW, only composite sizes @code{n0} can be parallelized; we +have not yet implemented a parallel algorithm for large prime sizes. + +@c ------------------------------------------------------------ +@node Multi-dimensional MPI DFTs of Real Data, Other Multi-dimensional Real-data MPI Transforms, MPI Data Distribution, Distributed-memory FFTW with MPI +@section Multi-dimensional MPI DFTs of Real Data + +FFTW's MPI interface also supports multi-dimensional DFTs of real +data, similar to the serial r2c and c2r interfaces. (Parallel +one-dimensional real-data DFTs are not currently supported; you must +use a complex transform and set the imaginary parts of the inputs to +zero.) + +The key points to understand for r2c and c2r MPI transforms (compared +to the MPI complex DFTs or the serial r2c/c2r transforms), are: + +@itemize @bullet + +@item +Just as for serial transforms, r2c/c2r DFTs transform @ndims{} real +data to/from @ndimshalf{} complex data: the last dimension of the +complex data is cut in half (rounded down), plus one. As for the +serial transforms, the sizes you pass to the @samp{plan_dft_r2c} and +@samp{plan_dft_c2r} are the @ndims{} dimensions of the real data. + +@item +@cindex padding +Although the real data is @emph{conceptually} @ndims{}, it is +@emph{physically} stored as an @ndimspad{} array, where the last +dimension has been @emph{padded} to make it the same size as the +complex output. This is much like the in-place serial r2c/c2r +interface (@pxref{Multi-Dimensional DFTs of Real Data}), except that +in MPI the padding is required even for out-of-place data. The extra +padding numbers are ignored by FFTW (they are @emph{not} like +zero-padding the transform to a larger size); they are only used to +determine the data layout. + +@item +@cindex data distribution +The data distribution in MPI for @emph{both} the real and complex data +is determined by the shape of the @emph{complex} data. That is, you +call the appropriate @samp{local size} function for the @ndimshalf{} +complex data, and then use the @emph{same} distribution for the real +data except that the last complex dimension is replaced by a (padded) +real dimension of twice the length. + +@end itemize + +For example suppose we are performing an out-of-place r2c transform of +@threedims{L,M,N} real data [padded to @threedims{L,M,2(N/2+1)}], +resulting in @threedims{L,M,N/2+1} complex data. Similar to the +example in @ref{2d MPI example}, we might do something like: + +@example +#include + +int main(int argc, char **argv) +@{ + const ptrdiff_t L = ..., M = ..., N = ...; + fftw_plan plan; + double *rin; + fftw_complex *cout; + ptrdiff_t alloc_local, local_n0, local_0_start, i, j, k; + + MPI_Init(&argc, &argv); + fftw_mpi_init(); + + /* @r{get local data size and allocate} */ + alloc_local = fftw_mpi_local_size_3d(L, M, N/2+1, MPI_COMM_WORLD, + &local_n0, &local_0_start); + rin = fftw_alloc_real(2 * alloc_local); + cout = fftw_alloc_complex(alloc_local); + + /* @r{create plan for out-of-place r2c DFT} */ + plan = fftw_mpi_plan_dft_r2c_3d(L, M, N, rin, cout, MPI_COMM_WORLD, + FFTW_MEASURE); + + /* @r{initialize rin to some function} my_func(x,y,z) */ + for (i = 0; i < local_n0; ++i) + for (j = 0; j < M; ++j) + for (k = 0; k < N; ++k) + rin[(i*M + j) * (2*(N/2+1)) + k] = my_func(local_0_start+i, j, k); + + /* @r{compute transforms as many times as desired} */ + fftw_execute(plan); + + fftw_destroy_plan(plan); + + MPI_Finalize(); +@} +@end example + +@findex fftw_alloc_real +@cindex row-major +Note that we allocated @code{rin} using @code{fftw_alloc_real} with an +argument of @code{2 * alloc_local}: since @code{alloc_local} is the +number of @emph{complex} values to allocate, the number of @emph{real} +values is twice as many. The @code{rin} array is then +@threedims{local_n0,M,2(N/2+1)} in row-major order, so its +@code{(i,j,k)} element is at the index @code{(i*M + j) * (2*(N/2+1)) + +k} (@pxref{Multi-dimensional Array Format }). + +@cindex transpose +@ctindex FFTW_TRANSPOSED_OUT +@ctindex FFTW_TRANSPOSED_IN +As for the complex transforms, improved performance can be obtained by +specifying that the output is the transpose of the input or vice versa +(@pxref{Transposed distributions}). In our @threedims{L,M,N} r2c +example, including @code{FFTW_TRANSPOSED_OUT} in the flags means that +the input would be a padded @threedims{L,M,2(N/2+1)} real array +distributed over the @code{L} dimension, while the output would be a +@threedims{M,L,N/2+1} complex array distributed over the @code{M} +dimension. To perform the inverse c2r transform with the same data +distributions, you would use the @code{FFTW_TRANSPOSED_IN} flag. + +@c ------------------------------------------------------------ +@node Other Multi-dimensional Real-data MPI Transforms, FFTW MPI Transposes, Multi-dimensional MPI DFTs of Real Data, Distributed-memory FFTW with MPI +@section Other multi-dimensional Real-Data MPI Transforms + +@cindex r2r +FFTW's MPI interface also supports multi-dimensional @samp{r2r} +transforms of all kinds supported by the serial interface +(e.g. discrete cosine and sine transforms, discrete Hartley +transforms, etc.). Only multi-dimensional @samp{r2r} transforms, not +one-dimensional transforms, are currently parallelized. + +@tindex fftw_r2r_kind +These are used much like the multidimensional complex DFTs discussed +above, except that the data is real rather than complex, and one needs +to pass an r2r transform kind (@code{fftw_r2r_kind}) for each +dimension as in the serial FFTW (@pxref{More DFTs of Real Data}). + +For example, one might perform a two-dimensional @twodims{L,M} that is +an REDFT10 (DCT-II) in the first dimension and an RODFT10 (DST-II) in +the second dimension with code like: + +@example + const ptrdiff_t L = ..., M = ...; + fftw_plan plan; + double *data; + ptrdiff_t alloc_local, local_n0, local_0_start, i, j; + + /* @r{get local data size and allocate} */ + alloc_local = fftw_mpi_local_size_2d(L, M, MPI_COMM_WORLD, + &local_n0, &local_0_start); + data = fftw_alloc_real(alloc_local); + + /* @r{create plan for in-place REDFT10 x RODFT10} */ + plan = fftw_mpi_plan_r2r_2d(L, M, data, data, MPI_COMM_WORLD, + FFTW_REDFT10, FFTW_RODFT10, FFTW_MEASURE); + + /* @r{initialize data to some function} my_function(x,y) */ + for (i = 0; i < local_n0; ++i) for (j = 0; j < M; ++j) + data[i*M + j] = my_function(local_0_start + i, j); + + /* @r{compute transforms, in-place, as many times as desired} */ + fftw_execute(plan); + + fftw_destroy_plan(plan); +@end example + +@findex fftw_alloc_real +Notice that we use the same @samp{local_size} functions as we did for +complex data, only now we interpret the sizes in terms of real rather +than complex values, and correspondingly use @code{fftw_alloc_real}. + +@c ------------------------------------------------------------ +@node FFTW MPI Transposes, FFTW MPI Wisdom, Other Multi-dimensional Real-data MPI Transforms, Distributed-memory FFTW with MPI +@section FFTW MPI Transposes +@cindex transpose + +The FFTW's MPI Fourier transforms rely on one or more @emph{global +transposition} step for their communications. For example, the +multidimensional transforms work by transforming along some +dimensions, then transposing to make the first dimension local and +transforming that, then transposing back. Because global +transposition of a block-distributed matrix has many other potential +uses besides FFTs, FFTW's transpose routines can be called directly, +as documented in this section. + +@menu +* Basic distributed-transpose interface:: +* Advanced distributed-transpose interface:: +* An improved replacement for MPI_Alltoall:: +@end menu + +@node Basic distributed-transpose interface, Advanced distributed-transpose interface, FFTW MPI Transposes, FFTW MPI Transposes +@subsection Basic distributed-transpose interface + +In particular, suppose that we have an @code{n0} by @code{n1} array in +row-major order, block-distributed across the @code{n0} dimension. To +transpose this into an @code{n1} by @code{n0} array block-distributed +across the @code{n1} dimension, we would create a plan by calling the +following function: + +@example +fftw_plan fftw_mpi_plan_transpose(ptrdiff_t n0, ptrdiff_t n1, + double *in, double *out, + MPI_Comm comm, unsigned flags); +@end example +@findex fftw_mpi_plan_transpose + +The input and output arrays (@code{in} and @code{out}) can be the +same. The transpose is actually executed by calling +@code{fftw_execute} on the plan, as usual. +@findex fftw_execute + + +The @code{flags} are the usual FFTW planner flags, but support +two additional flags: @code{FFTW_MPI_TRANSPOSED_OUT} and/or +@code{FFTW_MPI_TRANSPOSED_IN}. What these flags indicate, for +transpose plans, is that the output and/or input, respectively, are +@emph{locally} transposed. That is, on each process input data is +normally stored as a @code{local_n0} by @code{n1} array in row-major +order, but for an @code{FFTW_MPI_TRANSPOSED_IN} plan the input data is +stored as @code{n1} by @code{local_n0} in row-major order. Similarly, +@code{FFTW_MPI_TRANSPOSED_OUT} means that the output is @code{n0} by +@code{local_n1} instead of @code{local_n1} by @code{n0}. +@ctindex FFTW_MPI_TRANSPOSED_OUT +@ctindex FFTW_MPI_TRANSPOSED_IN + + +To determine the local size of the array on each process before and +after the transpose, as well as the amount of storage that must be +allocated, one should call @code{fftw_mpi_local_size_2d_transposed}, +just as for a 2d DFT as described in the previous section: +@cindex data distribution + +@example +ptrdiff_t fftw_mpi_local_size_2d_transposed + (ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); +@end example +@findex fftw_mpi_local_size_2d_transposed + +Again, the return value is the local storage to allocate, which in +this case is the number of @emph{real} (@code{double}) values rather +than complex numbers as in the previous examples. + +@node Advanced distributed-transpose interface, An improved replacement for MPI_Alltoall, Basic distributed-transpose interface, FFTW MPI Transposes +@subsection Advanced distributed-transpose interface + +The above routines are for a transpose of a matrix of numbers (of type +@code{double}), using FFTW's default block sizes. More generally, one +can perform transposes of @emph{tuples} of numbers, with +user-specified block sizes for the input and output: + +@example +fftw_plan fftw_mpi_plan_many_transpose + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany, + ptrdiff_t block0, ptrdiff_t block1, + double *in, double *out, MPI_Comm comm, unsigned flags); +@end example +@findex fftw_mpi_plan_many_transpose + +In this case, one is transposing an @code{n0} by @code{n1} matrix of +@code{howmany}-tuples (e.g. @code{howmany = 2} for complex numbers). +The input is distributed along the @code{n0} dimension with block size +@code{block0}, and the @code{n1} by @code{n0} output is distributed +along the @code{n1} dimension with block size @code{block1}. If +@code{FFTW_MPI_DEFAULT_BLOCK} (0) is passed for a block size then FFTW +uses its default block size. To get the local size of the data on +each process, you should then call @code{fftw_mpi_local_size_many_transposed}. +@ctindex FFTW_MPI_DEFAULT_BLOCK +@findex fftw_mpi_local_size_many_transposed + +@node An improved replacement for MPI_Alltoall, , Advanced distributed-transpose interface, FFTW MPI Transposes +@subsection An improved replacement for MPI_Alltoall + +We close this section by noting that FFTW's MPI transpose routines can +be thought of as a generalization for the @code{MPI_Alltoall} function +(albeit only for floating-point types), and in some circumstances can +function as an improved replacement. +@findex MPI_Alltoall + + +@code{MPI_Alltoall} is defined by the MPI standard as: + +@example +int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype, + void *recvbuf, int recvcnt, MPI_Datatype recvtype, + MPI_Comm comm); +@end example + +In particular, for @code{double*} arrays @code{in} and @code{out}, +consider the call: + +@example +MPI_Alltoall(in, howmany, MPI_DOUBLE, out, howmany MPI_DOUBLE, comm); +@end example + +This is completely equivalent to: + +@example +MPI_Comm_size(comm, &P); +plan = fftw_mpi_plan_many_transpose(P, P, howmany, 1, 1, in, out, comm, FFTW_ESTIMATE); +fftw_execute(plan); +fftw_destroy_plan(plan); +@end example + +That is, computing a @twodims{P,P} transpose on @code{P} processes, +with a block size of 1, is just a standard all-to-all communication. + +However, using the FFTW routine instead of @code{MPI_Alltoall} may +have certain advantages. First of all, FFTW's routine can operate +in-place (@code{in == out}) whereas @code{MPI_Alltoall} can only +operate out-of-place. +@cindex in-place + + +Second, even for out-of-place plans, FFTW's routine may be faster, +especially if you need to perform the all-to-all communication many +times and can afford to use @code{FFTW_MEASURE} or +@code{FFTW_PATIENT}. It should certainly be no slower, not including +the time to create the plan, since one of the possible algorithms that +FFTW uses for an out-of-place transpose @emph{is} simply to call +@code{MPI_Alltoall}. However, FFTW also considers several other +possible algorithms that, depending on your MPI implementation and +your hardware, may be faster. +@ctindex FFTW_MEASURE +@ctindex FFTW_PATIENT + +@c ------------------------------------------------------------ +@node FFTW MPI Wisdom, Avoiding MPI Deadlocks, FFTW MPI Transposes, Distributed-memory FFTW with MPI +@section FFTW MPI Wisdom +@cindex wisdom +@cindex saving plans to disk + +FFTW's ``wisdom'' facility (@pxref{Words of Wisdom-Saving Plans}) can +be used to save MPI plans as well as to save uniprocessor plans. +However, for MPI there are several unavoidable complications. + +@cindex MPI I/O +First, the MPI standard does not guarantee that every process can +perform file I/O (at least, not using C stdio routines)---in general, +we may only assume that process 0 is capable of I/O.@footnote{In fact, +even this assumption is not technically guaranteed by the standard, +although it seems to be universal in actual MPI implementations and is +widely assumed by MPI-using software. Technically, you need to query +the @code{MPI_IO} attribute of @code{MPI_COMM_WORLD} with +@code{MPI_Attr_get}. If this attribute is @code{MPI_PROC_NULL}, no +I/O is possible. If it is @code{MPI_ANY_SOURCE}, any process can +perform I/O. Otherwise, it is the rank of a process that can perform +I/O ... but since it is not guaranteed to yield the @emph{same} rank +on all processes, you have to do an @code{MPI_Allreduce} of some kind +if you want all processes to agree about which is going to do I/O. +And even then, the standard only guarantees that this process can +perform output, but not input. See e.g. @cite{Parallel Programming +with MPI} by P. S. Pacheco, section 8.1.3. Needless to say, in our +experience virtually no MPI programmers worry about this.} So, if we +want to export the wisdom from a single process to a file, we must +first export the wisdom to a string, then send it to process 0, then +write it to a file. + +Second, in principle we may want to have separate wisdom for every +process, since in general the processes may run on different hardware +even for a single MPI program. However, in practice FFTW's MPI code +is designed for the case of homogeneous hardware (@pxref{Load +balancing}), and in this case it is convenient to use the same wisdom +for every process. Thus, we need a mechanism to synchronize the wisdom. + +To address both of these problems, FFTW provides the following two +functions: + +@example +void fftw_mpi_broadcast_wisdom(MPI_Comm comm); +void fftw_mpi_gather_wisdom(MPI_Comm comm); +@end example +@findex fftw_mpi_gather_wisdom +@findex fftw_mpi_broadcast_wisdom + +Given a communicator @code{comm}, @code{fftw_mpi_broadcast_wisdom} +will broadcast the wisdom from process 0 to all other processes. +Conversely, @code{fftw_mpi_gather_wisdom} will collect wisdom from all +processes onto process 0. (If the plans created for the same problem +by different processes are not the same, @code{fftw_mpi_gather_wisdom} +will arbitrarily choose one of the plans.) Both of these functions +may result in suboptimal plans for different processes if the +processes are running on non-identical hardware. Both of these +functions are @emph{collective} calls, which means that they must be +executed by all processes in the communicator. +@cindex collective function + + +So, for example, a typical code snippet to import wisdom from a file +and use it on all processes would be: + +@example +@{ + int rank; + + fftw_mpi_init(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (rank == 0) fftw_import_wisdom_from_filename("mywisdom"); + fftw_mpi_broadcast_wisdom(MPI_COMM_WORLD); +@} +@end example + +(Note that we must call @code{fftw_mpi_init} before importing any +wisdom that might contain MPI plans.) Similarly, a typical code +snippet to export wisdom from all processes to a file is: +@findex fftw_mpi_init + +@example +@{ + int rank; + + fftw_mpi_gather_wisdom(MPI_COMM_WORLD); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + if (rank == 0) fftw_export_wisdom_to_filename("mywisdom"); +@} +@end example + +@c ------------------------------------------------------------ +@node Avoiding MPI Deadlocks, FFTW MPI Performance Tips, FFTW MPI Wisdom, Distributed-memory FFTW with MPI +@section Avoiding MPI Deadlocks +@cindex deadlock + +An MPI program can @emph{deadlock} if one process is waiting for a +message from another process that never gets sent. To avoid deadlocks +when using FFTW's MPI routines, it is important to know which +functions are @emph{collective}: that is, which functions must +@emph{always} be called in the @emph{same order} from @emph{every} +process in a given communicator. (For example, @code{MPI_Barrier} is +the canonical example of a collective function in the MPI standard.) +@cindex collective function +@findex MPI_Barrier + + +The functions in FFTW that are @emph{always} collective are: every +function beginning with @samp{fftw_mpi_plan}, as well as +@code{fftw_mpi_broadcast_wisdom} and @code{fftw_mpi_gather_wisdom}. +Also, the following functions from the ordinary FFTW interface are +collective when they are applied to a plan created by an +@samp{fftw_mpi_plan} function: @code{fftw_execute}, +@code{fftw_destroy_plan}, and @code{fftw_flops}. +@findex fftw_execute +@findex fftw_destroy_plan +@findex fftw_flops + +@c ------------------------------------------------------------ +@node FFTW MPI Performance Tips, Combining MPI and Threads, Avoiding MPI Deadlocks, Distributed-memory FFTW with MPI +@section FFTW MPI Performance Tips + +In this section, we collect a few tips on getting the best performance +out of FFTW's MPI transforms. + +First, because of the 1d block distribution, FFTW's parallelization is +currently limited by the size of the first dimension. +(Multidimensional block distributions may be supported by a future +version.) More generally, you should ideally arrange the dimensions so +that FFTW can divide them equally among the processes. @xref{Load +balancing}. +@cindex block distribution +@cindex load balancing + + +Second, if it is not too inconvenient, you should consider working +with transposed output for multidimensional plans, as this saves a +considerable amount of communications. @xref{Transposed distributions}. +@cindex transpose + + +Third, the fastest choices are generally either an in-place transform +or an out-of-place transform with the @code{FFTW_DESTROY_INPUT} flag +(which allows the input array to be used as scratch space). In-place +is especially beneficial if the amount of data per process is large. +@ctindex FFTW_DESTROY_INPUT + + +Fourth, if you have multiple arrays to transform at once, rather than +calling FFTW's MPI transforms several times it usually seems to be +faster to interleave the data and use the advanced interface. (This +groups the communications together instead of requiring separate +messages for each transform.) + +@c ------------------------------------------------------------ +@node Combining MPI and Threads, FFTW MPI Reference, FFTW MPI Performance Tips, Distributed-memory FFTW with MPI +@section Combining MPI and Threads +@cindex threads + +In certain cases, it may be advantageous to combine MPI +(distributed-memory) and threads (shared-memory) parallelization. +FFTW supports this, with certain caveats. For example, if you have a +cluster of 4-processor shared-memory nodes, you may want to use +threads within the nodes and MPI between the nodes, instead of MPI for +all parallelization. + +In particular, it is possible to seamlessly combine the MPI FFTW +routines with the multi-threaded FFTW routines (@pxref{Multi-threaded +FFTW}). However, some care must be taken in the initialization code, +which should look something like this: + +@example +int threads_ok; + +int main(int argc, char **argv) +@{ + int provided; + MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided); + threads_ok = provided >= MPI_THREAD_FUNNELED; + + if (threads_ok) threads_ok = fftw_init_threads(); + fftw_mpi_init(); + + ... + if (threads_ok) fftw_plan_with_nthreads(...); + ... + + MPI_Finalize(); +@} +@end example +@findex fftw_mpi_init +@findex fftw_init_threads +@findex fftw_plan_with_nthreads + +First, note that instead of calling @code{MPI_Init}, you should call +@code{MPI_Init_threads}, which is the initialization routine defined +by the MPI-2 standard to indicate to MPI that your program will be +multithreaded. We pass @code{MPI_THREAD_FUNNELED}, which indicates +that we will only call MPI routines from the main thread. (FFTW will +launch additional threads internally, but the extra threads will not +call MPI code.) (You may also pass @code{MPI_THREAD_SERIALIZED} or +@code{MPI_THREAD_MULTIPLE}, which requests additional multithreading +support from the MPI implementation, but this is not required by +FFTW.) The @code{provided} parameter returns what level of threads +support is actually supported by your MPI implementation; this +@emph{must} be at least @code{MPI_THREAD_FUNNELED} if you want to call +the FFTW threads routines, so we define a global variable +@code{threads_ok} to record this. You should only call +@code{fftw_init_threads} or @code{fftw_plan_with_nthreads} if +@code{threads_ok} is true. For more information on thread safety in +MPI, see the +@uref{http://www.mpi-forum.org/docs/mpi-20-html/node162.htm, MPI and +Threads} section of the MPI-2 standard. +@cindex thread safety + + +Second, we must call @code{fftw_init_threads} @emph{before} +@code{fftw_mpi_init}. This is critical for technical reasons having +to do with how FFTW initializes its list of algorithms. + +Then, if you call @code{fftw_plan_with_nthreads(N)}, @emph{every} MPI +process will launch (up to) @code{N} threads to parallelize its transforms. + +For example, in the hypothetical cluster of 4-processor nodes, you +might wish to launch only a single MPI process per node, and then call +@code{fftw_plan_with_nthreads(4)} on each process to use all +processors in the nodes. + +This may or may not be faster than simply using as many MPI processes +as you have processors, however. On the one hand, using threads +within a node eliminates the need for explicit message passing within +the node. On the other hand, FFTW's transpose routines are not +multi-threaded, and this means that the communications that do take +place will not benefit from parallelization within the node. +Moreover, many MPI implementations already have optimizations to +exploit shared memory when it is available, so adding the +multithreaded FFTW on top of this may be superfluous. +@cindex transpose + +@c ------------------------------------------------------------ +@node FFTW MPI Reference, FFTW MPI Fortran Interface, Combining MPI and Threads, Distributed-memory FFTW with MPI +@section FFTW MPI Reference + +This chapter provides a complete reference to all FFTW MPI functions, +datatypes, and constants. See also @ref{FFTW Reference} for information +on functions and types in common with the serial interface. + +@menu +* MPI Files and Data Types:: +* MPI Initialization:: +* Using MPI Plans:: +* MPI Data Distribution Functions:: +* MPI Plan Creation:: +* MPI Wisdom Communication:: +@end menu + +@node MPI Files and Data Types, MPI Initialization, FFTW MPI Reference, FFTW MPI Reference +@subsection MPI Files and Data Types + +All programs using FFTW's MPI support should include its header file: + +@example +#include +@end example + +Note that this header file includes the serial-FFTW @code{fftw3.h} +header file, and also the @code{mpi.h} header file for MPI, so you +need not include those files separately. + +You must also link to @emph{both} the FFTW MPI library and to the +serial FFTW library. On Unix, this means adding @code{-lfftw3_mpi +-lfftw3 -lm} at the end of the link command. + +@cindex precision +Different precisions are handled as in the serial interface: +@xref{Precision}. That is, @samp{fftw_} functions become +@code{fftwf_} (in single precision) etcetera, and the libraries become +@code{-lfftw3f_mpi -lfftw3f -lm} etcetera on Unix. Long-double +precision is supported in MPI, but quad precision (@samp{fftwq_}) is +not due to the lack of MPI support for this type. + +@node MPI Initialization, Using MPI Plans, MPI Files and Data Types, FFTW MPI Reference +@subsection MPI Initialization + +Before calling any other FFTW MPI (@samp{fftw_mpi_}) function, and +before importing any wisdom for MPI problems, you must call: + +@findex fftw_mpi_init +@example +void fftw_mpi_init(void); +@end example + +@findex fftw_init_threads +If FFTW threads support is used, however, @code{fftw_mpi_init} should +be called @emph{after} @code{fftw_init_threads} (@pxref{Combining MPI +and Threads}). Calling @code{fftw_mpi_init} additional times (before +@code{fftw_mpi_cleanup}) has no effect. + + +If you want to deallocate all persistent data and reset FFTW to the +pristine state it was in when you started your program, you can call: + +@findex fftw_mpi_cleanup +@example +void fftw_mpi_cleanup(void); +@end example + +@findex fftw_cleanup +(This calls @code{fftw_cleanup}, so you need not call the serial +cleanup routine too, although it is safe to do so.) After calling +@code{fftw_mpi_cleanup}, all existing plans become undefined, and you +should not attempt to execute or destroy them. You must call +@code{fftw_mpi_init} again after @code{fftw_mpi_cleanup} if you want +to resume using the MPI FFTW routines. + +@node Using MPI Plans, MPI Data Distribution Functions, MPI Initialization, FFTW MPI Reference +@subsection Using MPI Plans + +Once an MPI plan is created, you can execute and destroy it using +@code{fftw_execute}, @code{fftw_destroy_plan}, and the other functions +in the serial interface that operate on generic plans (@pxref{Using +Plans}). + +@cindex collective function +@cindex MPI communicator +The @code{fftw_execute} and @code{fftw_destroy_plan} functions, applied to +MPI plans, are @emph{collective} calls: they must be called for all processes +in the communicator that was used to create the plan. + +@cindex new-array execution +You must @emph{not} use the serial new-array plan-execution functions +@code{fftw_execute_dft} and so on (@pxref{New-array Execute +Functions}) with MPI plans. Such functions are specialized to the +problem type, and there are specific new-array execute functions for MPI plans: + +@findex fftw_mpi_execute_dft +@findex fftw_mpi_execute_dft_r2c +@findex fftw_mpi_execute_dft_c2r +@findex fftw_mpi_execute_r2r +@example +void fftw_mpi_execute_dft(fftw_plan p, fftw_complex *in, fftw_complex *out); +void fftw_mpi_execute_dft_r2c(fftw_plan p, double *in, fftw_complex *out); +void fftw_mpi_execute_dft_c2r(fftw_plan p, fftw_complex *in, double *out); +void fftw_mpi_execute_r2r(fftw_plan p, double *in, double *out); +@end example + +@cindex alignment +@findex fftw_malloc +These functions have the same restrictions as those of the serial +new-array execute functions. They are @emph{always} safe to apply to +the @emph{same} @code{in} and @code{out} arrays that were used to +create the plan. They can only be applied to new arrarys if those +arrays have the same types, dimensions, in-placeness, and alignment as +the original arrays, where the best way to ensure the same alignment +is to use FFTW's @code{fftw_malloc} and related allocation functions +for all arrays (@pxref{Memory Allocation}). Note that distributed +transposes (@pxref{FFTW MPI Transposes}) use +@code{fftw_mpi_execute_r2r}, since they count as rank-zero r2r plans +from FFTW's perspective. + +@node MPI Data Distribution Functions, MPI Plan Creation, Using MPI Plans, FFTW MPI Reference +@subsection MPI Data Distribution Functions + +@cindex data distribution +As described above (@pxref{MPI Data Distribution}), in order to +allocate your arrays, @emph{before} creating a plan, you must first +call one of the following routines to determine the required +allocation size and the portion of the array locally stored on a given +process. The @code{MPI_Comm} communicator passed here must be +equivalent to the communicator used below for plan creation. + +The basic interface for multidimensional transforms consists of the +functions: + +@findex fftw_mpi_local_size_2d +@findex fftw_mpi_local_size_3d +@findex fftw_mpi_local_size +@findex fftw_mpi_local_size_2d_transposed +@findex fftw_mpi_local_size_3d_transposed +@findex fftw_mpi_local_size_transposed +@example +ptrdiff_t fftw_mpi_local_size_2d(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); +ptrdiff_t fftw_mpi_local_size_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); +ptrdiff_t fftw_mpi_local_size(int rnk, const ptrdiff_t *n, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); + +ptrdiff_t fftw_mpi_local_size_2d_transposed(ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); +ptrdiff_t fftw_mpi_local_size_3d_transposed(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); +ptrdiff_t fftw_mpi_local_size_transposed(int rnk, const ptrdiff_t *n, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); +@end example + +These functions return the number of elements to allocate (complex +numbers for DFT/r2c/c2r plans, real numbers for r2r plans), whereas +the @code{local_n0} and @code{local_0_start} return the portion +(@code{local_0_start} to @code{local_0_start + local_n0 - 1}) of the +first dimension of an @ndims{} array that is stored on the local +process. @xref{Basic and advanced distribution interfaces}. For +@code{FFTW_MPI_TRANSPOSED_OUT} plans, the @samp{_transposed} variants +are useful in order to also return the local portion of the first +dimension in the @ndimstrans{} transposed output. +@xref{Transposed distributions}. +The advanced interface for multidimensional transforms is: + +@cindex advanced interface +@findex fftw_mpi_local_size_many +@findex fftw_mpi_local_size_many_transposed +@example +ptrdiff_t fftw_mpi_local_size_many(int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t block0, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); +ptrdiff_t fftw_mpi_local_size_many_transposed(int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm, + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); +@end example + +These differ from the basic interface in only two ways. First, they +allow you to specify block sizes @code{block0} and @code{block1} (the +latter for the transposed output); you can pass +@code{FFTW_MPI_DEFAULT_BLOCK} to use FFTW's default block size as in +the basic interface. Second, you can pass a @code{howmany} parameter, +corresponding to the advanced planning interface below: this is for +transforms of contiguous @code{howmany}-tuples of numbers +(@code{howmany = 1} in the basic interface). + +The corresponding basic and advanced routines for one-dimensional +transforms (currently only complex DFTs) are: + +@findex fftw_mpi_local_size_1d +@findex fftw_mpi_local_size_many_1d +@example +ptrdiff_t fftw_mpi_local_size_1d( + ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags, + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, + ptrdiff_t *local_no, ptrdiff_t *local_o_start); +ptrdiff_t fftw_mpi_local_size_many_1d( + ptrdiff_t n0, ptrdiff_t howmany, + MPI_Comm comm, int sign, unsigned flags, + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, + ptrdiff_t *local_no, ptrdiff_t *local_o_start); +@end example + +@ctindex FFTW_MPI_SCRAMBLED_OUT +@ctindex FFTW_MPI_SCRAMBLED_IN +As above, the return value is the number of elements to allocate +(complex numbers, for complex DFTs). The @code{local_ni} and +@code{local_i_start} arguments return the portion +(@code{local_i_start} to @code{local_i_start + local_ni - 1}) of the +1d array that is stored on this process for the transform +@emph{input}, and @code{local_no} and @code{local_o_start} are the +corresponding quantities for the input. The @code{sign} +(@code{FFTW_FORWARD} or @code{FFTW_BACKWARD}) and @code{flags} must +match the arguments passed when creating a plan. Although the inputs +and outputs have different data distributions in general, it is +guaranteed that the @emph{output} data distribution of an +@code{FFTW_FORWARD} plan will match the @emph{input} data distribution +of an @code{FFTW_BACKWARD} plan and vice versa; similarly for the +@code{FFTW_MPI_SCRAMBLED_OUT} and @code{FFTW_MPI_SCRAMBLED_IN} flags. +@xref{One-dimensional distributions}. + +@node MPI Plan Creation, MPI Wisdom Communication, MPI Data Distribution Functions, FFTW MPI Reference +@subsection MPI Plan Creation + +@subsubheading Complex-data MPI DFTs + +Plans for complex-data DFTs (@pxref{2d MPI example}) are created by: + +@findex fftw_mpi_plan_dft_1d +@findex fftw_mpi_plan_dft_2d +@findex fftw_mpi_plan_dft_3d +@findex fftw_mpi_plan_dft +@findex fftw_mpi_plan_many_dft +@example +fftw_plan fftw_mpi_plan_dft_1d(ptrdiff_t n0, fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); +fftw_plan fftw_mpi_plan_dft_2d(ptrdiff_t n0, ptrdiff_t n1, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); +fftw_plan fftw_mpi_plan_dft_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); +fftw_plan fftw_mpi_plan_dft(int rnk, const ptrdiff_t *n, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); +fftw_plan fftw_mpi_plan_many_dft(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, ptrdiff_t block, ptrdiff_t tblock, + fftw_complex *in, fftw_complex *out, + MPI_Comm comm, int sign, unsigned flags); +@end example + +@cindex MPI communicator +@cindex collective function +These are similar to their serial counterparts (@pxref{Complex DFTs}) +in specifying the dimensions, sign, and flags of the transform. The +@code{comm} argument gives an MPI communicator that specifies the set +of processes to participate in the transform; plan creation is a +collective function that must be called for all processes in the +communicator. The @code{in} and @code{out} pointers refer only to a +portion of the overall transform data (@pxref{MPI Data Distribution}) +as specified by the @samp{local_size} functions in the previous +section. Unless @code{flags} contains @code{FFTW_ESTIMATE}, these +arrays are overwritten during plan creation as for the serial +interface. For multi-dimensional transforms, any dimensions @code{> +1} are supported; for one-dimensional transforms, only composite +(non-prime) @code{n0} are currently supported (unlike the serial +FFTW). Requesting an unsupported transform size will yield a +@code{NULL} plan. (As in the serial interface, highly composite sizes +generally yield the best performance.) + +@cindex advanced interface +@ctindex FFTW_MPI_DEFAULT_BLOCK +@cindex stride +The advanced-interface @code{fftw_mpi_plan_many_dft} additionally +allows you to specify the block sizes for the first dimension +(@code{block}) of the @ndims{} input data and the first dimension +(@code{tblock}) of the @ndimstrans{} transposed data (at intermediate +steps of the transform, and for the output if +@code{FFTW_TRANSPOSED_OUT} is specified in @code{flags}). These must +be the same block sizes as were passed to the corresponding +@samp{local_size} function; you can pass @code{FFTW_MPI_DEFAULT_BLOCK} +to use FFTW's default block size as in the basic interface. Also, the +@code{howmany} parameter specifies that the transform is of contiguous +@code{howmany}-tuples rather than individual complex numbers; this +corresponds to the same parameter in the serial advanced interface +(@pxref{Advanced Complex DFTs}) with @code{stride = howmany} and +@code{dist = 1}. + +@subsubheading MPI flags + +The @code{flags} can be any of those for the serial FFTW +(@pxref{Planner Flags}), and in addition may include one or more of +the following MPI-specific flags, which improve performance at the +cost of changing the output or input data formats. + +@itemize @bullet + +@item +@ctindex FFTW_MPI_SCRAMBLED_OUT +@ctindex FFTW_MPI_SCRAMBLED_IN +@code{FFTW_MPI_SCRAMBLED_OUT}, @code{FFTW_MPI_SCRAMBLED_IN}: valid for +1d transforms only, these flags indicate that the output/input of the +transform are in an undocumented ``scrambled'' order. A forward +@code{FFTW_MPI_SCRAMBLED_OUT} transform can be inverted by a backward +@code{FFTW_MPI_SCRAMBLED_IN} (times the usual 1/@i{N} normalization). +@xref{One-dimensional distributions}. + +@item +@ctindex FFTW_MPI_TRANSPOSED_OUT +@ctindex FFTW_MPI_TRANSPOSED_IN +@code{FFTW_MPI_TRANSPOSED_OUT}, @code{FFTW_MPI_TRANSPOSED_IN}: valid +for multidimensional (@code{rnk > 1}) transforms only, these flags +specify that the output or input of an @ndims{} transform is +transposed to @ndimstrans{}. @xref{Transposed distributions}. + +@end itemize + +@subsubheading Real-data MPI DFTs + +@cindex r2c +Plans for real-input/output (r2c/c2r) DFTs (@pxref{Multi-dimensional +MPI DFTs of Real Data}) are created by: + +@findex fftw_mpi_plan_dft_r2c_2d +@findex fftw_mpi_plan_dft_r2c_2d +@findex fftw_mpi_plan_dft_r2c_3d +@findex fftw_mpi_plan_dft_r2c +@findex fftw_mpi_plan_dft_c2r_2d +@findex fftw_mpi_plan_dft_c2r_2d +@findex fftw_mpi_plan_dft_c2r_3d +@findex fftw_mpi_plan_dft_c2r +@example +fftw_plan fftw_mpi_plan_dft_r2c_2d(ptrdiff_t n0, ptrdiff_t n1, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_r2c_2d(ptrdiff_t n0, ptrdiff_t n1, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_r2c_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_r2c(int rnk, const ptrdiff_t *n, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_c2r_2d(ptrdiff_t n0, ptrdiff_t n1, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_c2r_2d(ptrdiff_t n0, ptrdiff_t n1, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_c2r_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_dft_c2r(int rnk, const ptrdiff_t *n, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); +@end example + +Similar to the serial interface (@pxref{Real-data DFTs}), these +transform logically @ndims{} real data to/from @ndimshalf{} complex +data, representing the non-redundant half of the conjugate-symmetry +output of a real-input DFT (@pxref{Multi-dimensional Transforms}). +However, the real array must be stored within a padded @ndimspad{} +array (much like the in-place serial r2c transforms, but here for +out-of-place transforms as well). Currently, only multi-dimensional +(@code{rnk > 1}) r2c/c2r transforms are supported (requesting a plan +for @code{rnk = 1} will yield @code{NULL}). As explained above +(@pxref{Multi-dimensional MPI DFTs of Real Data}), the data +distribution of both the real and complex arrays is given by the +@samp{local_size} function called for the dimensions of the +@emph{complex} array. Similar to the other planning functions, the +input and output arrays are overwritten when the plan is created +except in @code{FFTW_ESTIMATE} mode. + +As for the complex DFTs above, there is an advance interface that +allows you to manually specify block sizes and to transform contiguous +@code{howmany}-tuples of real/complex numbers: + +@findex fftw_mpi_plan_many_dft_r2c +@findex fftw_mpi_plan_many_dft_c2r +@example +fftw_plan fftw_mpi_plan_many_dft_r2c + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + double *in, fftw_complex *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_many_dft_c2r + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + fftw_complex *in, double *out, + MPI_Comm comm, unsigned flags); +@end example + +@subsubheading MPI r2r transforms + +@cindex r2r +There are corresponding plan-creation routines for r2r +transforms (@pxref{More DFTs of Real Data}), currently supporting +multidimensional (@code{rnk > 1}) transforms only (@code{rnk = 1} will +yield a @code{NULL} plan): + +@example +fftw_plan fftw_mpi_plan_r2r_2d(ptrdiff_t n0, ptrdiff_t n1, + double *in, double *out, + MPI_Comm comm, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, + unsigned flags); +fftw_plan fftw_mpi_plan_r2r_3d(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, + double *in, double *out, + MPI_Comm comm, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, fftw_r2r_kind kind2, + unsigned flags); +fftw_plan fftw_mpi_plan_r2r(int rnk, const ptrdiff_t *n, + double *in, double *out, + MPI_Comm comm, const fftw_r2r_kind *kind, + unsigned flags); +fftw_plan fftw_mpi_plan_many_r2r(int rnk, const ptrdiff_t *n, + ptrdiff_t iblock, ptrdiff_t oblock, + double *in, double *out, + MPI_Comm comm, const fftw_r2r_kind *kind, + unsigned flags); +@end example + +The parameters are much the same as for the complex DFTs above, except +that the arrays are of real numbers (and hence the outputs of the +@samp{local_size} data-distribution functions should be interpreted as +counts of real rather than complex numbers). Also, the @code{kind} +parameters specify the r2r kinds along each dimension as for the +serial interface (@pxref{Real-to-Real Transform Kinds}). @xref{Other +Multi-dimensional Real-data MPI Transforms}. + +@subsubheading MPI transposition +@cindex transpose + +FFTW also provides routines to plan a transpose of a distributed +@code{n0} by @code{n1} array of real numbers, or an array of +@code{howmany}-tuples of real numbers with specified block sizes +(@pxref{FFTW MPI Transposes}): + +@findex fftw_mpi_plan_transpose +@findex fftw_mpi_plan_many_transpose +@example +fftw_plan fftw_mpi_plan_transpose(ptrdiff_t n0, ptrdiff_t n1, + double *in, double *out, + MPI_Comm comm, unsigned flags); +fftw_plan fftw_mpi_plan_many_transpose + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany, + ptrdiff_t block0, ptrdiff_t block1, + double *in, double *out, MPI_Comm comm, unsigned flags); +@end example + +@cindex new-array execution +@findex fftw_mpi_execute_r2r +These plans are used with the @code{fftw_mpi_execute_r2r} new-array +execute function (@pxref{Using MPI Plans }), since they count as (rank +zero) r2r plans from FFTW's perspective. + +@node MPI Wisdom Communication, , MPI Plan Creation, FFTW MPI Reference +@subsection MPI Wisdom Communication + +To facilitate synchronizing wisdom among the different MPI processes, +we provide two functions: + +@findex fftw_mpi_gather_wisdom +@findex fftw_mpi_broadcast_wisdom +@example +void fftw_mpi_gather_wisdom(MPI_Comm comm); +void fftw_mpi_broadcast_wisdom(MPI_Comm comm); +@end example + +The @code{fftw_mpi_gather_wisdom} function gathers all wisdom in the +given communicator @code{comm} to the process of rank 0 in the +communicator: that process obtains the union of all wisdom on all the +processes. As a side effect, some other processes will gain +additional wisdom from other processes, but only process 0 will gain +the complete union. + +The @code{fftw_mpi_broadcast_wisdom} does the reverse: it exports +wisdom from process 0 in @code{comm} to all other processes in the +communicator, replacing any wisdom they currently have. + +@xref{FFTW MPI Wisdom}. + +@c ------------------------------------------------------------ +@node FFTW MPI Fortran Interface, , FFTW MPI Reference, Distributed-memory FFTW with MPI +@section FFTW MPI Fortran Interface +@cindex Fortran interface + +@cindex iso_c_binding +The FFTW MPI interface is callable from modern Fortran compilers +supporting the Fortran 2003 @code{iso_c_binding} standard for calling +C functions. As described in @ref{Calling FFTW from Modern Fortran}, +this means that you can directly call FFTW's C interface from Fortran +with only minor changes in syntax. There are, however, a few things +specific to the MPI interface to keep in mind: + +@itemize @bullet + +@item +Instead of including @code{fftw3.f03} as in @ref{Overview of Fortran +interface }, you should @code{include 'fftw3-mpi.f03'} (after +@code{use, intrinsic :: iso_c_binding} as before). The +@code{fftw3-mpi.f03} file includes @code{fftw3.f03}, so you should +@emph{not} @code{include} them both yourself. (You will also want to +include the MPI header file, usually via @code{include 'mpif.h'} or +similar, although though this is not needed by @code{fftw3-mpi.f03} +@i{per se}.) (To use the @samp{fftwl_} @code{long double} extended-precision routines in supporting compilers, you should include @code{fftw3f-mpi.f03} in @emph{addition} to @code{fftw3-mpi.f03}. @xref{Extended and quadruple precision in Fortran}.) + +@item +Because of the different storage conventions between C and Fortran, +you reverse the order of your array dimensions when passing them to +FFTW (@pxref{Reversing array dimensions}). This is merely a +difference in notation and incurs no performance overhead. However, +it means that, whereas in C the @emph{first} dimension is distributed, +in Fortran the @emph{last} dimension of your array is distributed. + +@item +@cindex MPI communicator +In Fortran, communicators are stored as @code{integer} types; there is +no @code{MPI_Comm} type, nor is there any way to access a C +@code{MPI_Comm}. Fortunately, this is taken care of for you by the +FFTW Fortran interface: whenever the C interface expects an +@code{MPI_Comm} type, you should pass the Fortran communicator as an +@code{integer}.@footnote{Technically, this is because you aren't +actually calling the C functions directly. You are calling wrapper +functions that translate the communicator with @code{MPI_Comm_f2c} +before calling the ordinary C interface. This is all done +transparently, however, since the @code{fftw3-mpi.f03} interface file +renames the wrappers so that they are called in Fortran with the same +names as the C interface functions.} + +@item +Because you need to call the @samp{local_size} function to find out +how much space to allocate, and this may be @emph{larger} than the +local portion of the array (@pxref{MPI Data Distribution}), you should +@emph{always} allocate your arrays dynamically using FFTW's allocation +routines as described in @ref{Allocating aligned memory in Fortran}. +(Coincidentally, this also provides the best performance by +guaranteeding proper data alignment.) + +@item +Because all sizes in the MPI FFTW interface are declared as +@code{ptrdiff_t} in C, you should use @code{integer(C_INTPTR_T)} in +Fortran (@pxref{FFTW Fortran type reference}). + +@item +@findex fftw_execute_dft +@findex fftw_mpi_execute_dft +@cindex new-array execution +In Fortran, because of the language semantics, we generally recommend +using the new-array execute functions for all plans, even in the +common case where you are executing the plan on the same arrays for +which the plan was created (@pxref{Plan execution in Fortran}). +However, note that in the MPI interface these functions are changed: +@code{fftw_execute_dft} becomes @code{fftw_mpi_execute_dft}, +etcetera. @xref{Using MPI Plans}. + +@end itemize + +For example, here is a Fortran code snippet to perform a distributed +@twodims{L,M} complex DFT in-place. (This assumes you have already +initialized MPI with @code{MPI_init} and have also performed +@code{call fftw_mpi_init}.) + +@example + use, intrinsic :: iso_c_binding + include 'fftw3-mpi.f03' + integer(C_INTPTR_T), parameter :: L = ... + integer(C_INTPTR_T), parameter :: M = ... + type(C_PTR) :: plan, cdata + complex(C_DOUBLE_COMPLEX), pointer :: data(:,:) + integer(C_INTPTR_T) :: i, j, alloc_local, local_M, local_j_offset + +! @r{get local data size and allocate (note dimension reversal)} + alloc_local = fftw_mpi_local_size_2d(M, L, MPI_COMM_WORLD, & + local_M, local_j_offset) + cdata = fftw_alloc_complex(alloc_local) + call c_f_pointer(cdata, data, [L,local_M]) + +! @r{create MPI plan for in-place forward DFT (note dimension reversal)} + plan = fftw_mpi_plan_dft_2d(M, L, data, data, MPI_COMM_WORLD, & + FFTW_FORWARD, FFTW_MEASURE) + +! @r{initialize data to some function} my_function(i,j) + do j = 1, local_M + do i = 1, L + data(i, j) = my_function(i, j + local_j_offset) + end do + end do + +! @r{compute transform (as many times as desired)} + call fftw_mpi_execute_dft(plan, data, data) + + call fftw_destroy_plan(plan) + call fftw_free(cdata) +@end example + +Note that when we called @code{fftw_mpi_local_size_2d} and +@code{fftw_mpi_plan_dft_2d} with the dimensions in reversed order, +since a @twodims{L,M} Fortran array is viewed by FFTW in C as a +@twodims{M, L} array. This means that the array was distributed over +the @code{M} dimension, the local portion of which is a +@twodims{L,local_M} array in Fortran. (You must @emph{not} use an +@code{allocate} statement to allocate an @twodims{L,local_M} array, +however; you must allocate @code{alloc_local} complex numbers, which +may be greater than @code{L * local_M}, in order to reserve space for +intermediate steps of the transform.) Finally, we mention that +because C's array indices are zero-based, the @code{local_j_offset} +argument can conveniently be interpreted as an offset in the 1-based +@code{j} index (rather than as a starting index as in C). + +If instead you had used the @code{ior(FFTW_MEASURE, +FFTW_MPI_TRANSPOSED_OUT)} flag, the output of the transform would be a +transposed @twodims{M,local_L} array, associated with the @emph{same} +@code{cdata} allocation (since the transform is in-place), and which +you could declare with: + +@example + complex(C_DOUBLE_COMPLEX), pointer :: tdata(:,:) + ... + call c_f_pointer(cdata, tdata, [M,local_L]) +@end example + +where @code{local_L} would have been obtained by changing the +@code{fftw_mpi_local_size_2d} call to: + +@example + alloc_local = fftw_mpi_local_size_2d_transposed(M, L, MPI_COMM_WORLD, & + local_M, local_j_offset, local_L, local_i_offset) +@end example diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/other.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/other.texi new file mode 100644 index 000000000..b2d75ce9c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/other.texi @@ -0,0 +1,399 @@ +@node Other Important Topics, FFTW Reference, Tutorial, Top +@chapter Other Important Topics +@menu +* SIMD alignment and fftw_malloc:: +* Multi-dimensional Array Format:: +* Words of Wisdom-Saving Plans:: +* Caveats in Using Wisdom:: +@end menu + +@c ------------------------------------------------------------ +@node SIMD alignment and fftw_malloc, Multi-dimensional Array Format, Other Important Topics, Other Important Topics +@section SIMD alignment and fftw_malloc + +SIMD, which stands for ``Single Instruction Multiple Data,'' is a set of +special operations supported by some processors to perform a single +operation on several numbers (usually 2 or 4) simultaneously. SIMD +floating-point instructions are available on several popular CPUs: +SSE/SSE2/AVX/AVX2/AVX512/KCVI on some x86/x86-64 processors, AltiVec and +VSX on some POWER/PowerPCs, NEON on some ARM models. FFTW can be +compiled to support the SIMD instructions on any of these systems. +@cindex SIMD +@cindex SSE +@cindex SSE2 +@cindex AVX +@cindex AVX2 +@cindex AVX512 +@cindex AltiVec +@cindex VSX +@cindex precision + + +A program linking to an FFTW library compiled with SIMD support can +obtain a nonnegligible speedup for most complex and r2c/c2r +transforms. In order to obtain this speedup, however, the arrays of +complex (or real) data passed to FFTW must be specially aligned in +memory (typically 16-byte aligned), and often this alignment is more +stringent than that provided by the usual @code{malloc} (etc.) +allocation routines. + +@cindex portability +In order to guarantee proper alignment for SIMD, therefore, in case +your program is ever linked against a SIMD-using FFTW, we recommend +allocating your transform data with @code{fftw_malloc} and +de-allocating it with @code{fftw_free}. +@findex fftw_malloc +@findex fftw_free +These have exactly the same interface and behavior as +@code{malloc}/@code{free}, except that for a SIMD FFTW they ensure +that the returned pointer has the necessary alignment (by calling +@code{memalign} or its equivalent on your OS). + +You are not @emph{required} to use @code{fftw_malloc}. You can +allocate your data in any way that you like, from @code{malloc} to +@code{new} (in C++) to a fixed-size array declaration. If the array +happens not to be properly aligned, FFTW will not use the SIMD +extensions. +@cindex C++ + +@findex fftw_alloc_real +@findex fftw_alloc_complex +Since @code{fftw_malloc} only ever needs to be used for real and +complex arrays, we provide two convenient wrapper routines +@code{fftw_alloc_real(N)} and @code{fftw_alloc_complex(N)} that are +equivalent to @code{(double*)fftw_malloc(sizeof(double) * N)} and +@code{(fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N)}, +respectively (or their equivalents in other precisions). + +@c ------------------------------------------------------------ +@node Multi-dimensional Array Format, Words of Wisdom-Saving Plans, SIMD alignment and fftw_malloc, Other Important Topics +@section Multi-dimensional Array Format + +This section describes the format in which multi-dimensional arrays +are stored in FFTW. We felt that a detailed discussion of this topic +was necessary. Since several different formats are common, this topic +is often a source of confusion. + +@menu +* Row-major Format:: +* Column-major Format:: +* Fixed-size Arrays in C:: +* Dynamic Arrays in C:: +* Dynamic Arrays in C-The Wrong Way:: +@end menu + +@c =========> +@node Row-major Format, Column-major Format, Multi-dimensional Array Format, Multi-dimensional Array Format +@subsection Row-major Format +@cindex row-major + +The multi-dimensional arrays passed to @code{fftw_plan_dft} etcetera +are expected to be stored as a single contiguous block in +@dfn{row-major} order (sometimes called ``C order''). Basically, this +means that as you step through adjacent memory locations, the first +dimension's index varies most slowly and the last dimension's index +varies most quickly. + +To be more explicit, let us consider an array of rank @math{d} whose +dimensions are @ndims{}. Now, we specify a location in the array by a +sequence of @math{d} (zero-based) indices, one for each dimension: +@tex +$(i_0, i_1, i_2, \ldots, i_{d-1})$. +@end tex +@ifinfo +(i[0], i[1], ..., i[d-1]). +@end ifinfo +@html +(i0, i1, i2,..., id-1). +@end html +If the array is stored in row-major +order, then this element is located at the position +@tex +$i_{d-1} + n_{d-1} (i_{d-2} + n_{d-2} (\ldots + n_1 i_0))$. +@end tex +@ifinfo +i[d-1] + n[d-1] * (i[d-2] + n[d-2] * (... + n[1] * i[0])). +@end ifinfo +@html +id-1 + nd-1 * (id-2 + nd-2 * (... + n1 * i0)). +@end html + +Note that, for the ordinary complex DFT, each element of the array +must be of type @code{fftw_complex}; i.e. a (real, imaginary) pair of +(double-precision) numbers. + +In the advanced FFTW interface, the physical dimensions @math{n} from +which the indices are computed can be different from (larger than) +the logical dimensions of the transform to be computed, in order to +transform a subset of a larger array. +@cindex advanced interface +Note also that, in the advanced interface, the expression above is +multiplied by a @dfn{stride} to get the actual array index---this is +useful in situations where each element of the multi-dimensional array +is actually a data structure (or another array), and you just want to +transform a single field. In the basic interface, however, the stride +is 1. +@cindex stride + +@c =========> +@node Column-major Format, Fixed-size Arrays in C, Row-major Format, Multi-dimensional Array Format +@subsection Column-major Format +@cindex column-major + +Readers from the Fortran world are used to arrays stored in +@dfn{column-major} order (sometimes called ``Fortran order''). This is +essentially the exact opposite of row-major order in that, here, the +@emph{first} dimension's index varies most quickly. + +If you have an array stored in column-major order and wish to +transform it using FFTW, it is quite easy to do. When creating the +plan, simply pass the dimensions of the array to the planner in +@emph{reverse order}. For example, if your array is a rank three +@code{N x M x L} matrix in column-major order, you should pass the +dimensions of the array as if it were an @code{L x M x N} matrix +(which it is, from the perspective of FFTW). This is done for you +@emph{automatically} by the FFTW legacy-Fortran interface +(@pxref{Calling FFTW from Legacy Fortran}), but you must do it +manually with the modern Fortran interface (@pxref{Reversing array +dimensions}). +@cindex Fortran interface + +@c =========> +@node Fixed-size Arrays in C, Dynamic Arrays in C, Column-major Format, Multi-dimensional Array Format +@subsection Fixed-size Arrays in C +@cindex C multi-dimensional arrays + +A multi-dimensional array whose size is declared at compile time in C +is @emph{already} in row-major order. You don't have to do anything +special to transform it. For example: + +@example +@{ + fftw_complex data[N0][N1][N2]; + fftw_plan plan; + ... + plan = fftw_plan_dft_3d(N0, N1, N2, &data[0][0][0], &data[0][0][0], + FFTW_FORWARD, FFTW_ESTIMATE); + ... +@} +@end example + +This will plan a 3d in-place transform of size @code{N0 x N1 x N2}. +Notice how we took the address of the zero-th element to pass to the +planner (we could also have used a typecast). + +However, we tend to @emph{discourage} users from declaring their +arrays in this way, for two reasons. First, this allocates the array +on the stack (``automatic'' storage), which has a very limited size on +most operating systems (declaring an array with more than a few +thousand elements will often cause a crash). (You can get around this +limitation on many systems by declaring the array as +@code{static} and/or global, but that has its own drawbacks.) +Second, it may not optimally align the array for use with a SIMD +FFTW (@pxref{SIMD alignment and fftw_malloc}). Instead, we recommend +using @code{fftw_malloc}, as described below. + +@c =========> +@node Dynamic Arrays in C, Dynamic Arrays in C-The Wrong Way, Fixed-size Arrays in C, Multi-dimensional Array Format +@subsection Dynamic Arrays in C + +We recommend allocating most arrays dynamically, with +@code{fftw_malloc}. This isn't too hard to do, although it is not as +straightforward for multi-dimensional arrays as it is for +one-dimensional arrays. + +Creating the array is simple: using a dynamic-allocation routine like +@code{fftw_malloc}, allocate an array big enough to store N +@code{fftw_complex} values (for a complex DFT), where N is the product +of the sizes of the array dimensions (i.e. the total number of complex +values in the array). For example, here is code to allocate a +@threedims{5,12,27} rank-3 array: +@findex fftw_malloc + +@example +fftw_complex *an_array; +an_array = (fftw_complex*) fftw_malloc(5*12*27 * sizeof(fftw_complex)); +@end example + +Accessing the array elements, however, is more tricky---you can't +simply use multiple applications of the @samp{[]} operator like you +could for fixed-size arrays. Instead, you have to explicitly compute +the offset into the array using the formula given earlier for +row-major arrays. For example, to reference the @math{(i,j,k)}-th +element of the array allocated above, you would use the expression +@code{an_array[k + 27 * (j + 12 * i)]}. + +This pain can be alleviated somewhat by defining appropriate macros, +or, in C++, creating a class and overloading the @samp{()} operator. +The recent C99 standard provides a way to reinterpret the dynamic +array as a ``variable-length'' multi-dimensional array amenable to +@samp{[]}, but this feature is not yet widely supported by compilers. +@cindex C99 +@cindex C++ + +@c =========> +@node Dynamic Arrays in C-The Wrong Way, , Dynamic Arrays in C, Multi-dimensional Array Format +@subsection Dynamic Arrays in C---The Wrong Way + +A different method for allocating multi-dimensional arrays in C is +often suggested that is incompatible with FFTW: @emph{using it will +cause FFTW to die a painful death}. We discuss the technique here, +however, because it is so commonly known and used. This method is to +create arrays of pointers of arrays of pointers of @dots{}etcetera. +For example, the analogue in this method to the example above is: + +@example +int i,j; +fftw_complex ***a_bad_array; /* @r{another way to make a 5x12x27 array} */ + +a_bad_array = (fftw_complex ***) malloc(5 * sizeof(fftw_complex **)); +for (i = 0; i < 5; ++i) @{ + a_bad_array[i] = + (fftw_complex **) malloc(12 * sizeof(fftw_complex *)); + for (j = 0; j < 12; ++j) + a_bad_array[i][j] = + (fftw_complex *) malloc(27 * sizeof(fftw_complex)); +@} +@end example + +As you can see, this sort of array is inconvenient to allocate (and +deallocate). On the other hand, it has the advantage that the +@math{(i,j,k)}-th element can be referenced simply by +@code{a_bad_array[i][j][k]}. + +If you like this technique and want to maximize convenience in accessing +the array, but still want to pass the array to FFTW, you can use a +hybrid method. Allocate the array as one contiguous block, but also +declare an array of arrays of pointers that point to appropriate places +in the block. That sort of trick is beyond the scope of this +documentation; for more information on multi-dimensional arrays in C, +see the @code{comp.lang.c} +@uref{http://c-faq.com/aryptr/dynmuldimary.html, FAQ}. + +@c ------------------------------------------------------------ +@node Words of Wisdom-Saving Plans, Caveats in Using Wisdom, Multi-dimensional Array Format, Other Important Topics +@section Words of Wisdom---Saving Plans +@cindex wisdom +@cindex saving plans to disk + +FFTW implements a method for saving plans to disk and restoring them. +In fact, what FFTW does is more general than just saving and loading +plans. The mechanism is called @dfn{wisdom}. Here, we describe +this feature at a high level. @xref{FFTW Reference}, for a less casual +but more complete discussion of how to use wisdom in FFTW. + +Plans created with the @code{FFTW_MEASURE}, @code{FFTW_PATIENT}, or +@code{FFTW_EXHAUSTIVE} options produce near-optimal FFT performance, +but may require a long time to compute because FFTW must measure the +runtime of many possible plans and select the best one. This setup is +designed for the situations where so many transforms of the same size +must be computed that the start-up time is irrelevant. For short +initialization times, but slower transforms, we have provided +@code{FFTW_ESTIMATE}. The @code{wisdom} mechanism is a way to get the +best of both worlds: you compute a good plan once, save it to +disk, and later reload it as many times as necessary. The wisdom +mechanism can actually save and reload many plans at once, not just +one. +@ctindex FFTW_MEASURE +@ctindex FFTW_PATIENT +@ctindex FFTW_EXHAUSTIVE +@ctindex FFTW_ESTIMATE + + +Whenever you create a plan, the FFTW planner accumulates wisdom, which +is information sufficient to reconstruct the plan. After planning, +you can save this information to disk by means of the function: +@example +int fftw_export_wisdom_to_filename(const char *filename); +@end example +@findex fftw_export_wisdom_to_filename +(This function returns non-zero on success.) + +The next time you run the program, you can restore the wisdom with +@code{fftw_import_wisdom_from_filename} (which also returns non-zero on success), +and then recreate the plan using the same flags as before. +@example +int fftw_import_wisdom_from_filename(const char *filename); +@end example +@findex fftw_import_wisdom_from_filename + +Wisdom is automatically used for any size to which it is applicable, as +long as the planner flags are not more ``patient'' than those with which +the wisdom was created. For example, wisdom created with +@code{FFTW_MEASURE} can be used if you later plan with +@code{FFTW_ESTIMATE} or @code{FFTW_MEASURE}, but not with +@code{FFTW_PATIENT}. + +The @code{wisdom} is cumulative, and is stored in a global, private +data structure managed internally by FFTW. The storage space required +is minimal, proportional to the logarithm of the sizes the wisdom was +generated from. If memory usage is a concern, however, the wisdom can +be forgotten and its associated memory freed by calling: +@example +void fftw_forget_wisdom(void); +@end example +@findex fftw_forget_wisdom + +Wisdom can be exported to a file, a string, or any other medium. +For details, see @ref{Wisdom}. + +@node Caveats in Using Wisdom, , Words of Wisdom-Saving Plans, Other Important Topics +@section Caveats in Using Wisdom +@cindex wisdom, problems with + +@quotation +@html + +@end html +For in much wisdom is much grief, and he that increaseth knowledge +increaseth sorrow. +@html + +@end html +[Ecclesiastes 1:18] +@cindex Ecclesiastes +@end quotation +@iftex +@medskip +@end iftex + +@cindex portability +There are pitfalls to using wisdom, in that it can negate FFTW's +ability to adapt to changing hardware and other conditions. For +example, it would be perfectly possible to export wisdom from a +program running on one processor and import it into a program running +on another processor. Doing so, however, would mean that the second +program would use plans optimized for the first processor, instead of +the one it is running on. + +It should be safe to reuse wisdom as long as the hardware and program +binaries remain unchanged. (Actually, the optimal plan may change even +between runs of the same binary on identical hardware, due to +differences in the virtual memory environment, etcetera. Users +seriously interested in performance should worry about this problem, +too.) It is likely that, if the same wisdom is used for two +different program binaries, even running on the same machine, the +plans may be sub-optimal because of differing code alignments. It is +therefore wise to recreate wisdom every time an application is +recompiled. The more the underlying hardware and software changes +between the creation of wisdom and its use, the greater grows +the risk of sub-optimal plans. + +Nevertheless, if the choice is between using @code{FFTW_ESTIMATE} or +using possibly-suboptimal wisdom (created on the same machine, but for a +different binary), the wisdom is likely to be better. For this reason, +we provide a function to import wisdom from a standard system-wide +location (@code{/etc/fftw/wisdom} on Unix): +@cindex wisdom, system-wide + +@example +int fftw_import_system_wisdom(void); +@end example +@findex fftw_import_system_wisdom + +FFTW also provides a standalone program, @code{fftw-wisdom} (described +by its own @code{man} page on Unix) with which users can create wisdom, +e.g. for a canonical set of sizes to store in the system wisdom file. +@xref{Wisdom Utilities}. +@cindex fftw-wisdom utility + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/reference.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/reference.texi new file mode 100644 index 000000000..69f7208bc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/reference.texi @@ -0,0 +1,2456 @@ +@node FFTW Reference, Multi-threaded FFTW, Other Important Topics, Top +@chapter FFTW Reference + +This chapter provides a complete reference for all sequential (i.e., +one-processor) FFTW functions. Parallel transforms are described in +later chapters. + +@menu +* Data Types and Files:: +* Using Plans:: +* Basic Interface:: +* Advanced Interface:: +* Guru Interface:: +* New-array Execute Functions:: +* Wisdom:: +* What FFTW Really Computes:: +@end menu + +@c ------------------------------------------------------------ +@node Data Types and Files, Using Plans, FFTW Reference, FFTW Reference +@section Data Types and Files + +All programs using FFTW should include its header file: + +@example +#include +@end example + +You must also link to the FFTW library. On Unix, this +means adding @code{-lfftw3 -lm} at the @emph{end} of the link command. + +@menu +* Complex numbers:: +* Precision:: +* Memory Allocation:: +@end menu + +@c =========> +@node Complex numbers, Precision, Data Types and Files, Data Types and Files +@subsection Complex numbers + +The default FFTW interface uses @code{double} precision for all +floating-point numbers, and defines a @code{fftw_complex} type to hold +complex numbers as: + +@example +typedef double fftw_complex[2]; +@end example +@tindex fftw_complex + +Here, the @code{[0]} element holds the real part and the @code{[1]} +element holds the imaginary part. + +Alternatively, if you have a C compiler (such as @code{gcc}) that +supports the C99 revision of the ANSI C standard, you can use C's new +native complex type (which is binary-compatible with the typedef above). +In particular, if you @code{#include } @emph{before} +@code{}, then @code{fftw_complex} is defined to be the native +complex type and you can manipulate it with ordinary arithmetic +(e.g. @code{x = y * (3+4*I)}, where @code{x} and @code{y} are +@code{fftw_complex} and @code{I} is the standard symbol for the +imaginary unit); +@cindex C99 + + +C++ has its own @code{complex} template class, defined in the +standard @code{} header file. Reportedly, the C++ standards +committee has recently agreed to mandate that the storage format used +for this type be binary-compatible with the C99 type, i.e. an array +@code{T[2]} with consecutive real @code{[0]} and imaginary @code{[1]} +parts. (See report +@uref{http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2002/n1388.pdf +WG21/N1388}.) Although not part of the official standard as of this +writing, the proposal stated that: ``This solution has been tested with +all current major implementations of the standard library and shown to +be working.'' To the extent that this is true, if you have a variable +@code{complex *x}, you can pass it directly to FFTW via +@code{reinterpret_cast(x)}. +@cindex C++ +@cindex portability + +@c =========> +@node Precision, Memory Allocation, Complex numbers, Data Types and Files +@subsection Precision +@cindex precision + +You can install single and long-double precision versions of FFTW, +which replace @code{double} with @code{float} and @code{long double}, +respectively (@pxref{Installation and Customization}). To use these +interfaces, you: + +@itemize @bullet + +@item +Link to the single/long-double libraries; on Unix, @code{-lfftw3f} or +@code{-lfftw3l} instead of (or in addition to) @code{-lfftw3}. (You +can link to the different-precision libraries simultaneously.) + +@item +Include the @emph{same} @code{} header file. + +@item +Replace all lowercase instances of @samp{fftw_} with @samp{fftwf_} or +@samp{fftwl_} for single or long-double precision, respectively. +(@code{fftw_complex} becomes @code{fftwf_complex}, @code{fftw_execute} +becomes @code{fftwf_execute}, etcetera.) + +@item +Uppercase names, i.e. names beginning with @samp{FFTW_}, remain the +same. + +@item +Replace @code{double} with @code{float} or @code{long double} for +subroutine parameters. + +@end itemize + +Depending upon your compiler and/or hardware, @code{long double} may not +be any more precise than @code{double} (or may not be supported at all, +although it is standard in C99). +@cindex C99 + + +We also support using the nonstandard @code{__float128} +quadruple-precision type provided by recent versions of @code{gcc} on +32- and 64-bit x86 hardware (@pxref{Installation and Customization}). +To use this type, link with @code{-lfftw3q -lquadmath -lm} (the +@code{libquadmath} library provided by @code{gcc} is needed for +quadruple-precision trigonometric functions) and use @samp{fftwq_} +identifiers. + +@c =========> +@node Memory Allocation, , Precision, Data Types and Files +@subsection Memory Allocation + +@example +void *fftw_malloc(size_t n); +void fftw_free(void *p); +@end example +@findex fftw_malloc +@findex fftw_free + +These are functions that behave identically to @code{malloc} and +@code{free}, except that they guarantee that the returned pointer obeys +any special alignment restrictions imposed by any algorithm in FFTW +(e.g. for SIMD acceleration). @xref{SIMD alignment and fftw_malloc}. +@cindex alignment + + +Data allocated by @code{fftw_malloc} @emph{must} be deallocated by +@code{fftw_free} and not by the ordinary @code{free}. + +These routines simply call through to your operating system's +@code{malloc} or, if necessary, its aligned equivalent +(e.g. @code{memalign}), so you normally need not worry about any +significant time or space overhead. You are @emph{not required} to use +them to allocate your data, but we strongly recommend it. + +Note: in C++, just as with ordinary @code{malloc}, you must typecast +the output of @code{fftw_malloc} to whatever pointer type you are +allocating. +@cindex C++ + + +We also provide the following two convenience functions to allocate +real and complex arrays with @code{n} elements, which are equivalent +to @code{(double *) fftw_malloc(sizeof(double) * n)} and +@code{(fftw_complex *) fftw_malloc(sizeof(fftw_complex) * n)}, +respectively: + +@example +double *fftw_alloc_real(size_t n); +fftw_complex *fftw_alloc_complex(size_t n); +@end example +@findex fftw_alloc_real +@findex fftw_alloc_complex + +The equivalent functions in other precisions allocate arrays of @code{n} +elements in that precision. e.g. @code{fftwf_alloc_real(n)} is +equivalent to @code{(float *) fftwf_malloc(sizeof(float) * n)}. +@cindex precision + +@c ------------------------------------------------------------ +@node Using Plans, Basic Interface, Data Types and Files, FFTW Reference +@section Using Plans + +Plans for all transform types in FFTW are stored as type +@code{fftw_plan} (an opaque pointer type), and are created by one of the +various planning routines described in the following sections. +@tindex fftw_plan +An @code{fftw_plan} contains all information necessary to compute the +transform, including the pointers to the input and output arrays. + +@example +void fftw_execute(const fftw_plan plan); +@end example +@findex fftw_execute + +This executes the @code{plan}, to compute the corresponding transform on +the arrays for which it was planned (which must still exist). The plan +is not modified, and @code{fftw_execute} can be called as many times as +desired. + +To apply a given plan to a different array, you can use the new-array execute +interface. @xref{New-array Execute Functions}. + +@code{fftw_execute} (and equivalents) is the only function in FFTW +guaranteed to be thread-safe; see @ref{Thread safety}. + +This function: +@example +void fftw_destroy_plan(fftw_plan plan); +@end example +@findex fftw_destroy_plan +deallocates the @code{plan} and all its associated data. + +FFTW's planner saves some other persistent data, such as the +accumulated wisdom and a list of algorithms available in the current +configuration. If you want to deallocate all of that and reset FFTW +to the pristine state it was in when you started your program, you can +call: + +@example +void fftw_cleanup(void); +@end example +@findex fftw_cleanup + +After calling @code{fftw_cleanup}, all existing plans become undefined, +and you should not attempt to execute them nor to destroy them. You can +however create and execute/destroy new plans, in which case FFTW starts +accumulating wisdom information again. + +@code{fftw_cleanup} does not deallocate your plans, however. To prevent +memory leaks, you must still call @code{fftw_destroy_plan} before +executing @code{fftw_cleanup}. + +Occasionally, it may useful to know FFTW's internal ``cost'' metric +that it uses to compare plans to one another; this cost is +proportional to an execution time of the plan, in undocumented units, +if the plan was created with the @code{FFTW_MEASURE} or other +timing-based options, or alternatively is a heuristic cost function +for @code{FFTW_ESTIMATE} plans. (The cost values of measured and +estimated plans are not comparable, being in different units. Also, +costs from different FFTW versions or the same version compiled +differently may not be in the same units. Plans created from wisdom +have a cost of 0 since no timing measurement is performed for them. +Finally, certain problems for which only one top-level algorithm was +possible may have required no measurements of the cost of the whole +plan, in which case @code{fftw_cost} will also return 0.) The cost +metric for a given plan is returned by: + +@example +double fftw_cost(const fftw_plan plan); +@end example +@findex fftw_cost + +The following two routines are provided purely for academic purposes +(that is, for entertainment). + +@example +void fftw_flops(const fftw_plan plan, + double *add, double *mul, double *fma); +@end example +@findex fftw_flops + +Given a @code{plan}, set @code{add}, @code{mul}, and @code{fma} to an +exact count of the number of floating-point additions, multiplications, +and fused multiply-add operations involved in the plan's execution. The +total number of floating-point operations (flops) is @code{add + mul + +2*fma}, or @code{add + mul + fma} if the hardware supports fused +multiply-add instructions (although the number of FMA operations is only +approximate because of compiler voodoo). (The number of operations +should be an integer, but we use @code{double} to avoid overflowing +@code{int} for large transforms; the arguments are of type @code{double} +even for single and long-double precision versions of FFTW.) + +@example +void fftw_fprint_plan(const fftw_plan plan, FILE *output_file); +void fftw_print_plan(const fftw_plan plan); +char *fftw_sprint_plan(const fftw_plan plan); +@end example +@findex fftw_fprint_plan +@findex fftw_print_plan + +This outputs a ``nerd-readable'' representation of the @code{plan} to +the given file, to @code{stdout}, or two a newly allocated +NUL-terminated string (which the caller is responsible for deallocating +with @code{free}), respectively. + +@c ------------------------------------------------------------ +@node Basic Interface, Advanced Interface, Using Plans, FFTW Reference +@section Basic Interface +@cindex basic interface + +Recall that the FFTW API is divided into three parts@footnote{@i{Gallia est +omnis divisa in partes tres} (Julius Caesar).}: the @dfn{basic interface} +computes a single transform of contiguous data, the @dfn{advanced +interface} computes transforms of multiple or strided arrays, and the +@dfn{guru interface} supports the most general data layouts, +multiplicities, and strides. This section describes the the basic +interface, which we expect to satisfy the needs of most users. + +@menu +* Complex DFTs:: +* Planner Flags:: +* Real-data DFTs:: +* Real-data DFT Array Format:: +* Real-to-Real Transforms:: +* Real-to-Real Transform Kinds:: +@end menu + +@c =========> +@node Complex DFTs, Planner Flags, Basic Interface, Basic Interface +@subsection Complex DFTs + +@example +fftw_plan fftw_plan_dft_1d(int n0, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +fftw_plan fftw_plan_dft_2d(int n0, int n1, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +fftw_plan fftw_plan_dft_3d(int n0, int n1, int n2, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +fftw_plan fftw_plan_dft(int rank, const int *n, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +@end example +@findex fftw_plan_dft_1d +@findex fftw_plan_dft_2d +@findex fftw_plan_dft_3d +@findex fftw_plan_dft + +Plan a complex input/output discrete Fourier transform (DFT) in zero or +more dimensions, returning an @code{fftw_plan} (@pxref{Using Plans}). + +Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). + +The planner returns @code{NULL} if the plan cannot be created. In the +standard FFTW distribution, the basic interface is guaranteed to return +a non-@code{NULL} plan. A plan may be @code{NULL}, however, if you are +using a customized FFTW configuration supporting a restricted set of +transforms. + +@subsubheading Arguments +@itemize @bullet + +@item +@code{rank} is the rank of the transform (it should be the size of the +array @code{*n}), and can be any non-negative integer. (@xref{Complex +Multi-Dimensional DFTs}, for the definition of ``rank''.) The +@samp{_1d}, @samp{_2d}, and @samp{_3d} planners correspond to a +@code{rank} of @code{1}, @code{2}, and @code{3}, respectively. The rank +may be zero, which is equivalent to a rank-1 transform of size 1, i.e. a +copy of one number from input to output. + +@item +@code{n0}, @code{n1}, @code{n2}, or @code{n[0..rank-1]} (as appropriate +for each routine) specify the size of the transform dimensions. They +can be any positive integer. + +@itemize @minus +@item +@cindex row-major +Multi-dimensional arrays are stored in row-major order with dimensions: +@code{n0} x @code{n1}; or @code{n0} x @code{n1} x @code{n2}; or +@code{n[0]} x @code{n[1]} x ... x @code{n[rank-1]}. +@xref{Multi-dimensional Array Format}. +@item +FFTW is best at handling sizes of the form +@ifinfo +@math{2^a 3^b 5^c 7^d 11^e 13^f}, +@end ifinfo +@tex +$2^a 3^b 5^c 7^d 11^e 13^f$, +@end tex +@html +2a 3b 5c 7d + 11e 13f, +@end html +where @math{e+f} is either @math{0} or @math{1}, and the other exponents +are arbitrary. Other sizes are computed by means of a slow, +general-purpose algorithm (which nevertheless retains @Onlogn{} performance even for prime sizes). It is possible to customize FFTW +for different array sizes; see @ref{Installation and Customization}. +Transforms whose sizes are powers of @math{2} are especially fast. +@end itemize + +@item +@code{in} and @code{out} point to the input and output arrays of the +transform, which may be the same (yielding an in-place transform). +@cindex in-place +These arrays are overwritten during planning, unless +@code{FFTW_ESTIMATE} is used in the flags. (The arrays need not be +initialized, but they must be allocated.) + +If @code{in == out}, the transform is @dfn{in-place} and the input +array is overwritten. If @code{in != out}, the two arrays must +not overlap (but FFTW does not check for this condition). + +@item +@ctindex FFTW_FORWARD +@ctindex FFTW_BACKWARD +@code{sign} is the sign of the exponent in the formula that defines the +Fourier transform. It can be @math{-1} (= @code{FFTW_FORWARD}) or +@math{+1} (= @code{FFTW_BACKWARD}). + +@item +@cindex flags +@code{flags} is a bitwise OR (@samp{|}) of zero or more planner flags, +as defined in @ref{Planner Flags}. + +@end itemize + +FFTW computes an unnormalized transform: computing a forward followed by +a backward transform (or vice versa) will result in the original data +multiplied by the size of the transform (the product of the dimensions). +@cindex normalization +For more information, see @ref{What FFTW Really Computes}. + +@c =========> +@node Planner Flags, Real-data DFTs, Complex DFTs, Basic Interface +@subsection Planner Flags + +All of the planner routines in FFTW accept an integer @code{flags} +argument, which is a bitwise OR (@samp{|}) of zero or more of the flag +constants defined below. These flags control the rigor (and time) of +the planning process, and can also impose (or lift) restrictions on the +type of transform algorithm that is employed. + +@emph{Important:} the planner overwrites the input array during +planning unless a saved plan (@pxref{Wisdom}) is available for that +problem, so you should initialize your input data after creating the +plan. The only exceptions to this are the @code{FFTW_ESTIMATE} and +@code{FFTW_WISDOM_ONLY} flags, as mentioned below. + +In all cases, if wisdom is available for the given problem that was +created with equal-or-greater planning rigor, then the more rigorous +wisdom is used. For example, in @code{FFTW_ESTIMATE} mode any available +wisdom is used, whereas in @code{FFTW_PATIENT} mode only wisdom created +in patient or exhaustive mode can be used. @xref{Words of Wisdom-Saving +Plans}. + +@subsubheading Planning-rigor flags +@itemize @bullet + +@item +@ctindex FFTW_ESTIMATE +@code{FFTW_ESTIMATE} specifies that, instead of actual measurements of +different algorithms, a simple heuristic is used to pick a (probably +sub-optimal) plan quickly. With this flag, the input/output arrays are +not overwritten during planning. + +@item +@ctindex FFTW_MEASURE +@code{FFTW_MEASURE} tells FFTW to find an optimized plan by actually +@emph{computing} several FFTs and measuring their execution time. +Depending on your machine, this can take some time (often a few +seconds). @code{FFTW_MEASURE} is the default planning option. + +@item +@ctindex FFTW_PATIENT +@code{FFTW_PATIENT} is like @code{FFTW_MEASURE}, but considers a wider +range of algorithms and often produces a ``more optimal'' plan +(especially for large transforms), but at the expense of several times +longer planning time (especially for large transforms). + +@item +@ctindex FFTW_EXHAUSTIVE +@code{FFTW_EXHAUSTIVE} is like @code{FFTW_PATIENT}, but considers an +even wider range of algorithms, including many that we think are +unlikely to be fast, to produce the most optimal plan but with a +substantially increased planning time. + +@item +@ctindex FFTW_WISDOM_ONLY +@code{FFTW_WISDOM_ONLY} is a special planning mode in which the plan +is only created if wisdom is available for the given problem, and +otherwise a @code{NULL} plan is returned. This can be combined with +other flags, e.g. @samp{FFTW_WISDOM_ONLY | FFTW_PATIENT} creates a +plan only if wisdom is available that was created in +@code{FFTW_PATIENT} or @code{FFTW_EXHAUSTIVE} mode. The +@code{FFTW_WISDOM_ONLY} flag is intended for users who need to detect +whether wisdom is available; for example, if wisdom is not available +one may wish to allocate new arrays for planning so that user data is +not overwritten. + +@end itemize + +@subsubheading Algorithm-restriction flags +@itemize @bullet + +@item +@ctindex FFTW_DESTROY_INPUT +@code{FFTW_DESTROY_INPUT} specifies that an out-of-place transform is +allowed to @emph{overwrite its input} array with arbitrary data; this +can sometimes allow more efficient algorithms to be employed. +@cindex out-of-place + +@item +@ctindex FFTW_PRESERVE_INPUT +@code{FFTW_PRESERVE_INPUT} specifies that an out-of-place transform must +@emph{not change its input} array. This is ordinarily the +@emph{default}, except for c2r and hc2r (i.e. complex-to-real) +transforms for which @code{FFTW_DESTROY_INPUT} is the default. In the +latter cases, passing @code{FFTW_PRESERVE_INPUT} will attempt to use +algorithms that do not destroy the input, at the expense of worse +performance; for multi-dimensional c2r transforms, however, no +input-preserving algorithms are implemented and the planner will return +@code{NULL} if one is requested. +@cindex c2r +@cindex hc2r + +@item +@ctindex FFTW_UNALIGNED +@cindex alignment +@findex fftw_malloc +@findex fftw_alignment_of +@code{FFTW_UNALIGNED} specifies that the algorithm may not impose any +unusual alignment requirements on the input/output arrays (i.e. no +SIMD may be used). This flag is normally @emph{not necessary}, since +the planner automatically detects misaligned arrays. The only use for +this flag is if you want to use the new-array execute interface to +execute a given plan on a different array that may not be aligned like +the original. (Using @code{fftw_malloc} makes this flag unnecessary +even then. You can also use @code{fftw_alignment_of} to detect +whether two arrays are equivalently aligned.) + +@end itemize + +@subsubheading Limiting planning time + +@example +extern void fftw_set_timelimit(double seconds); +@end example +@findex fftw_set_timelimit + +This function instructs FFTW to spend at most @code{seconds} seconds +(approximately) in the planner. If @code{seconds == +FFTW_NO_TIMELIMIT} (the default value, which is negative), then +planning time is unbounded. Otherwise, FFTW plans with a +progressively wider range of algorithms until the the given time limit +is reached or the given range of algorithms is explored, returning the +best available plan. +@ctindex FFTW_NO_TIMELIMIT + + +For example, specifying @code{FFTW_PATIENT} first plans in +@code{FFTW_ESTIMATE} mode, then in @code{FFTW_MEASURE} mode, then +finally (time permitting) in @code{FFTW_PATIENT}. If +@code{FFTW_EXHAUSTIVE} is specified instead, the planner will further +progress to @code{FFTW_EXHAUSTIVE} mode. + +Note that the @code{seconds} argument specifies only a rough limit; in +practice, the planner may use somewhat more time if the time limit is +reached when the planner is in the middle of an operation that cannot +be interrupted. At the very least, the planner will complete planning +in @code{FFTW_ESTIMATE} mode (which is thus equivalent to a time limit +of 0). + + +@c =========> +@node Real-data DFTs, Real-data DFT Array Format, Planner Flags, Basic Interface +@subsection Real-data DFTs + +@example +fftw_plan fftw_plan_dft_r2c_1d(int n0, + double *in, fftw_complex *out, + unsigned flags); +fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1, + double *in, fftw_complex *out, + unsigned flags); +fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2, + double *in, fftw_complex *out, + unsigned flags); +fftw_plan fftw_plan_dft_r2c(int rank, const int *n, + double *in, fftw_complex *out, + unsigned flags); +@end example +@findex fftw_plan_dft_r2c_1d +@findex fftw_plan_dft_r2c_2d +@findex fftw_plan_dft_r2c_3d +@findex fftw_plan_dft_r2c +@cindex r2c + +Plan a real-input/complex-output discrete Fourier transform (DFT) in +zero or more dimensions, returning an @code{fftw_plan} (@pxref{Using +Plans}). + +Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). + +The planner returns @code{NULL} if the plan cannot be created. A +non-@code{NULL} plan is always returned by the basic interface unless +you are using a customized FFTW configuration supporting a restricted +set of transforms, or if you use the @code{FFTW_PRESERVE_INPUT} flag +with a multi-dimensional out-of-place c2r transform (see below). + +@subsubheading Arguments +@itemize @bullet + +@item +@code{rank} is the rank of the transform (it should be the size of the +array @code{*n}), and can be any non-negative integer. (@xref{Complex +Multi-Dimensional DFTs}, for the definition of ``rank''.) The +@samp{_1d}, @samp{_2d}, and @samp{_3d} planners correspond to a +@code{rank} of @code{1}, @code{2}, and @code{3}, respectively. The rank +may be zero, which is equivalent to a rank-1 transform of size 1, i.e. a +copy of one real number (with zero imaginary part) from input to output. + +@item +@code{n0}, @code{n1}, @code{n2}, or @code{n[0..rank-1]}, (as appropriate +for each routine) specify the size of the transform dimensions. They +can be any positive integer. This is different in general from the +@emph{physical} array dimensions, which are described in @ref{Real-data +DFT Array Format}. + +@itemize @minus +@item +FFTW is best at handling sizes of the form +@ifinfo +@math{2^a 3^b 5^c 7^d 11^e 13^f}, +@end ifinfo +@tex +$2^a 3^b 5^c 7^d 11^e 13^f$, +@end tex +@html +2a 3b 5c 7d + 11e 13f, +@end html +where @math{e+f} is either @math{0} or @math{1}, and the other exponents +are arbitrary. Other sizes are computed by means of a slow, +general-purpose algorithm (which nevertheless retains @Onlogn{} performance even for prime sizes). (It is possible to customize FFTW +for different array sizes; see @ref{Installation and Customization}.) +Transforms whose sizes are powers of @math{2} are especially fast, and +it is generally beneficial for the @emph{last} dimension of an r2c/c2r +transform to be @emph{even}. +@end itemize + +@item +@code{in} and @code{out} point to the input and output arrays of the +transform, which may be the same (yielding an in-place transform). +@cindex in-place +These arrays are overwritten during planning, unless +@code{FFTW_ESTIMATE} is used in the flags. (The arrays need not be +initialized, but they must be allocated.) For an in-place transform, it +is important to remember that the real array will require padding, +described in @ref{Real-data DFT Array Format}. +@cindex padding + +@item +@cindex flags +@code{flags} is a bitwise OR (@samp{|}) of zero or more planner flags, +as defined in @ref{Planner Flags}. + +@end itemize + +The inverse transforms, taking complex input (storing the non-redundant +half of a logically Hermitian array) to real output, are given by: + +@example +fftw_plan fftw_plan_dft_c2r_1d(int n0, + fftw_complex *in, double *out, + unsigned flags); +fftw_plan fftw_plan_dft_c2r_2d(int n0, int n1, + fftw_complex *in, double *out, + unsigned flags); +fftw_plan fftw_plan_dft_c2r_3d(int n0, int n1, int n2, + fftw_complex *in, double *out, + unsigned flags); +fftw_plan fftw_plan_dft_c2r(int rank, const int *n, + fftw_complex *in, double *out, + unsigned flags); +@end example +@findex fftw_plan_dft_c2r_1d +@findex fftw_plan_dft_c2r_2d +@findex fftw_plan_dft_c2r_3d +@findex fftw_plan_dft_c2r +@cindex c2r + +The arguments are the same as for the r2c transforms, except that the +input and output data formats are reversed. + +FFTW computes an unnormalized transform: computing an r2c followed by a +c2r transform (or vice versa) will result in the original data +multiplied by the size of the transform (the product of the logical +dimensions). +@cindex normalization +An r2c transform produces the same output as a @code{FFTW_FORWARD} +complex DFT of the same input, and a c2r transform is correspondingly +equivalent to @code{FFTW_BACKWARD}. For more information, see @ref{What +FFTW Really Computes}. + +@c =========> +@node Real-data DFT Array Format, Real-to-Real Transforms, Real-data DFTs, Basic Interface +@subsection Real-data DFT Array Format +@cindex r2c/c2r multi-dimensional array format + +The output of a DFT of real data (r2c) contains symmetries that, in +principle, make half of the outputs redundant (@pxref{What FFTW Really +Computes}). (Similarly for the input of an inverse c2r transform.) In +practice, it is not possible to entirely realize these savings in an +efficient and understandable format that generalizes to +multi-dimensional transforms. Instead, the output of the r2c +transforms is @emph{slightly} over half of the output of the +corresponding complex transform. We do not ``pack'' the data in any +way, but store it as an ordinary array of @code{fftw_complex} values. +In fact, this data is simply a subsection of what would be the array in +the corresponding complex transform. + +Specifically, for a real transform of @math{d} (= @code{rank}) +dimensions @ndims{}, the complex data is an @ndimshalf array of +@code{fftw_complex} values in row-major order (with the division rounded +down). That is, we only store the @emph{lower} half (non-negative +frequencies), plus one element, of the last dimension of the data from +the ordinary complex transform. (We could have instead taken half of +any other dimension, but implementation turns out to be simpler if the +last, contiguous, dimension is used.) + +@cindex out-of-place +For an out-of-place transform, the real data is simply an array with +physical dimensions @ndims in row-major order. + +@cindex in-place +@cindex padding +For an in-place transform, some complications arise since the complex data +is slightly larger than the real data. In this case, the final +dimension of the real data must be @emph{padded} with extra values to +accommodate the size of the complex data---two extra if the last +dimension is even and one if it is odd. That is, the last dimension of +the real data must physically contain +@tex +$2 (n_{d-1}/2+1)$ +@end tex +@ifinfo +2 * (n[d-1]/2+1) +@end ifinfo +@html +2 * (nd-1/2+1) +@end html +@code{double} values (exactly enough to hold the complex data). This +physical array size does not, however, change the @emph{logical} array +size---only +@tex +$n_{d-1}$ +@end tex +@ifinfo +n[d-1] +@end ifinfo +@html +nd-1 +@end html +values are actually stored in the last dimension, and +@tex +$n_{d-1}$ +@end tex +@ifinfo +n[d-1] +@end ifinfo +@html +nd-1 +@end html +is the last dimension passed to the planner. + +@c =========> +@node Real-to-Real Transforms, Real-to-Real Transform Kinds, Real-data DFT Array Format, Basic Interface +@subsection Real-to-Real Transforms +@cindex r2r + +@example +fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out, + fftw_r2r_kind kind, unsigned flags); +fftw_plan fftw_plan_r2r_2d(int n0, int n1, double *in, double *out, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, + unsigned flags); +fftw_plan fftw_plan_r2r_3d(int n0, int n1, int n2, + double *in, double *out, + fftw_r2r_kind kind0, + fftw_r2r_kind kind1, + fftw_r2r_kind kind2, + unsigned flags); +fftw_plan fftw_plan_r2r(int rank, const int *n, double *in, double *out, + const fftw_r2r_kind *kind, unsigned flags); +@end example +@findex fftw_plan_r2r_1d +@findex fftw_plan_r2r_2d +@findex fftw_plan_r2r_3d +@findex fftw_plan_r2r + +Plan a real input/output (r2r) transform of various kinds in zero or +more dimensions, returning an @code{fftw_plan} (@pxref{Using Plans}). + +Once you have created a plan for a certain transform type and +parameters, then creating another plan of the same type and parameters, +but for different arrays, is fast and shares constant data with the +first plan (if it still exists). + +The planner returns @code{NULL} if the plan cannot be created. A +non-@code{NULL} plan is always returned by the basic interface unless +you are using a customized FFTW configuration supporting a restricted +set of transforms, or for size-1 @code{FFTW_REDFT00} kinds (which are +not defined). +@ctindex FFTW_REDFT00 + +@subsubheading Arguments +@itemize @bullet + +@item +@code{rank} is the dimensionality of the transform (it should be the +size of the arrays @code{*n} and @code{*kind}), and can be any +non-negative integer. The @samp{_1d}, @samp{_2d}, and @samp{_3d} +planners correspond to a @code{rank} of @code{1}, @code{2}, and +@code{3}, respectively. A @code{rank} of zero is equivalent to a copy +of one number from input to output. + +@item +@code{n}, or @code{n0}/@code{n1}/@code{n2}, or @code{n[rank]}, +respectively, gives the (physical) size of the transform dimensions. +They can be any positive integer. + +@itemize @minus +@item +@cindex row-major +Multi-dimensional arrays are stored in row-major order with dimensions: +@code{n0} x @code{n1}; or @code{n0} x @code{n1} x @code{n2}; or +@code{n[0]} x @code{n[1]} x ... x @code{n[rank-1]}. +@xref{Multi-dimensional Array Format}. +@item +FFTW is generally best at handling sizes of the form +@ifinfo +@math{2^a 3^b 5^c 7^d 11^e 13^f}, +@end ifinfo +@tex +$2^a 3^b 5^c 7^d 11^e 13^f$, +@end tex +@html +2a 3b 5c 7d + 11e 13f, +@end html +where @math{e+f} is either @math{0} or @math{1}, and the other exponents +are arbitrary. Other sizes are computed by means of a slow, +general-purpose algorithm (which nevertheless retains @Onlogn{} performance even for prime sizes). (It is possible to customize FFTW +for different array sizes; see @ref{Installation and Customization}.) +Transforms whose sizes are powers of @math{2} are especially fast. +@item +For a @code{REDFT00} or @code{RODFT00} transform kind in a dimension of +size @math{n}, it is @math{n-1} or @math{n+1}, respectively, that +should be factorizable in the above form. +@end itemize + +@item +@code{in} and @code{out} point to the input and output arrays of the +transform, which may be the same (yielding an in-place transform). +@cindex in-place +These arrays are overwritten during planning, unless +@code{FFTW_ESTIMATE} is used in the flags. (The arrays need not be +initialized, but they must be allocated.) + +@item +@code{kind}, or @code{kind0}/@code{kind1}/@code{kind2}, or +@code{kind[rank]}, is the kind of r2r transform used for the +corresponding dimension. The valid kind constants are described in +@ref{Real-to-Real Transform Kinds}. In a multi-dimensional transform, +what is computed is the separable product formed by taking each +transform kind along the corresponding dimension, one dimension after +another. + +@item +@cindex flags +@code{flags} is a bitwise OR (@samp{|}) of zero or more planner flags, +as defined in @ref{Planner Flags}. + +@end itemize + +@c =========> +@node Real-to-Real Transform Kinds, , Real-to-Real Transforms, Basic Interface +@subsection Real-to-Real Transform Kinds +@cindex kind (r2r) + +FFTW currently supports 11 different r2r transform kinds, specified by +one of the constants below. For the precise definitions of these +transforms, see @ref{What FFTW Really Computes}. For a more colloquial +introduction to these transform kinds, see @ref{More DFTs of Real Data}. + +For dimension of size @code{n}, there is a corresponding ``logical'' +dimension @code{N} that determines the normalization (and the optimal +factorization); the formula for @code{N} is given for each kind below. +Also, with each transform kind is listed its corrsponding inverse +transform. FFTW computes unnormalized transforms: a transform followed +by its inverse will result in the original data multiplied by @code{N} +(or the product of the @code{N}'s for each dimension, in +multi-dimensions). +@cindex normalization + +@itemize @bullet + +@item +@ctindex FFTW_R2HC +@code{FFTW_R2HC} computes a real-input DFT with output in +``halfcomplex'' format, i.e. real and imaginary parts for a transform of +size @code{n} stored as: +@tex +$$ +r_0, r_1, r_2, \ldots, r_{n/2}, i_{(n+1)/2-1}, \ldots, i_2, i_1 +$$ +@end tex +@ifinfo +r0, r1, r2, r(n/2), i((n+1)/2-1), ..., i2, i1 +@end ifinfo +@html +

    +r0, r1, r2, ..., rn/2, i(n+1)/2-1, ..., i2, i1 +

    +@end html +(Logical @code{N=n}, inverse is @code{FFTW_HC2R}.) + +@item +@ctindex FFTW_HC2R +@code{FFTW_HC2R} computes the reverse of @code{FFTW_R2HC}, above. +(Logical @code{N=n}, inverse is @code{FFTW_R2HC}.) + +@item +@ctindex FFTW_DHT +@code{FFTW_DHT} computes a discrete Hartley transform. +(Logical @code{N=n}, inverse is @code{FFTW_DHT}.) +@cindex discrete Hartley transform + +@item +@ctindex FFTW_REDFT00 +@code{FFTW_REDFT00} computes an REDFT00 transform, i.e. a DCT-I. +(Logical @code{N=2*(n-1)}, inverse is @code{FFTW_REDFT00}.) +@cindex discrete cosine transform +@cindex DCT + +@item +@ctindex FFTW_REDFT10 +@code{FFTW_REDFT10} computes an REDFT10 transform, i.e. a DCT-II (sometimes called ``the'' DCT). +(Logical @code{N=2*n}, inverse is @code{FFTW_REDFT01}.) + +@item +@ctindex FFTW_REDFT01 +@code{FFTW_REDFT01} computes an REDFT01 transform, i.e. a DCT-III (sometimes called ``the'' IDCT, being the inverse of DCT-II). +(Logical @code{N=2*n}, inverse is @code{FFTW_REDFT=10}.) +@cindex IDCT + +@item +@ctindex FFTW_REDFT11 +@code{FFTW_REDFT11} computes an REDFT11 transform, i.e. a DCT-IV. +(Logical @code{N=2*n}, inverse is @code{FFTW_REDFT11}.) + +@item +@ctindex FFTW_RODFT00 +@code{FFTW_RODFT00} computes an RODFT00 transform, i.e. a DST-I. +(Logical @code{N=2*(n+1)}, inverse is @code{FFTW_RODFT00}.) +@cindex discrete sine transform +@cindex DST + +@item +@ctindex FFTW_RODFT10 +@code{FFTW_RODFT10} computes an RODFT10 transform, i.e. a DST-II. +(Logical @code{N=2*n}, inverse is @code{FFTW_RODFT01}.) + +@item +@ctindex FFTW_RODFT01 +@code{FFTW_RODFT01} computes an RODFT01 transform, i.e. a DST-III. +(Logical @code{N=2*n}, inverse is @code{FFTW_RODFT=10}.) + +@item +@ctindex FFTW_RODFT11 +@code{FFTW_RODFT11} computes an RODFT11 transform, i.e. a DST-IV. +(Logical @code{N=2*n}, inverse is @code{FFTW_RODFT11}.) + +@end itemize + +@c ------------------------------------------------------------ +@node Advanced Interface, Guru Interface, Basic Interface, FFTW Reference +@section Advanced Interface +@cindex advanced interface + +FFTW's ``advanced'' interface supplements the basic interface with four +new planner routines, providing a new level of flexibility: you can plan +a transform of multiple arrays simultaneously, operate on non-contiguous +(strided) data, and transform a subset of a larger multi-dimensional +array. Other than these additional features, the planner operates in +the same fashion as in the basic interface, and the resulting +@code{fftw_plan} is used in the same way (@pxref{Using Plans}). + +@menu +* Advanced Complex DFTs:: +* Advanced Real-data DFTs:: +* Advanced Real-to-real Transforms:: +@end menu + +@c =========> +@node Advanced Complex DFTs, Advanced Real-data DFTs, Advanced Interface, Advanced Interface +@subsection Advanced Complex DFTs + +@example +fftw_plan fftw_plan_many_dft(int rank, const int *n, int howmany, + fftw_complex *in, const int *inembed, + int istride, int idist, + fftw_complex *out, const int *onembed, + int ostride, int odist, + int sign, unsigned flags); +@end example +@findex fftw_plan_many_dft + +This routine plans multiple multidimensional complex DFTs, and it +extends the @code{fftw_plan_dft} routine (@pxref{Complex DFTs}) to +compute @code{howmany} transforms, each having rank @code{rank} and size +@code{n}. In addition, the transform data need not be contiguous, but +it may be laid out in memory with an arbitrary stride. To account for +these possibilities, @code{fftw_plan_many_dft} adds the new parameters +@code{howmany}, @{@code{i},@code{o}@}@code{nembed}, +@{@code{i},@code{o}@}@code{stride}, and +@{@code{i},@code{o}@}@code{dist}. The FFTW basic interface +(@pxref{Complex DFTs}) provides routines specialized for ranks 1, 2, +and@tie{}3, but the advanced interface handles only the general-rank +case. + +@code{howmany} is the (nonnegative) number of transforms to compute. The resulting +plan computes @code{howmany} transforms, where the input of the +@code{k}-th transform is at location @code{in+k*idist} (in C pointer +arithmetic), and its output is at location @code{out+k*odist}. Plans +obtained in this way can often be faster than calling FFTW multiple +times for the individual transforms. The basic @code{fftw_plan_dft} +interface corresponds to @code{howmany=1} (in which case the @code{dist} +parameters are ignored). +@cindex howmany parameter +@cindex dist + + +Each of the @code{howmany} transforms has rank @code{rank} and size +@code{n}, as in the basic interface. In addition, the advanced +interface allows the input and output arrays of each transform to be +row-major subarrays of larger rank-@code{rank} arrays, described by +@code{inembed} and @code{onembed} parameters, respectively. +@{@code{i},@code{o}@}@code{nembed} must be arrays of length @code{rank}, +and @code{n} should be elementwise less than or equal to +@{@code{i},@code{o}@}@code{nembed}. Passing @code{NULL} for an +@code{nembed} parameter is equivalent to passing @code{n} (i.e. same +physical and logical dimensions, as in the basic interface.) + +The @code{stride} parameters indicate that the @code{j}-th element of +the input or output arrays is located at @code{j*istride} or +@code{j*ostride}, respectively. (For a multi-dimensional array, +@code{j} is the ordinary row-major index.) When combined with the +@code{k}-th transform in a @code{howmany} loop, from above, this means +that the (@code{j},@code{k})-th element is at @code{j*stride+k*dist}. +(The basic @code{fftw_plan_dft} interface corresponds to a stride of 1.) +@cindex stride + + +For in-place transforms, the input and output @code{stride} and +@code{dist} parameters should be the same; otherwise, the planner may +return @code{NULL}. + +Arrays @code{n}, @code{inembed}, and @code{onembed} are not used after +this function returns. You can safely free or reuse them. + +@strong{Examples}: +One transform of one 5 by 6 array contiguous in memory: +@example + int rank = 2; + int n[] = @{5, 6@}; + int howmany = 1; + int idist = odist = 0; /* unused because howmany = 1 */ + int istride = ostride = 1; /* array is contiguous in memory */ + int *inembed = n, *onembed = n; +@end example + +Transform of three 5 by 6 arrays, each contiguous in memory, +stored in memory one after another: +@example + int rank = 2; + int n[] = @{5, 6@}; + int howmany = 3; + int idist = odist = n[0]*n[1]; /* = 30, the distance in memory + between the first element + of the first array and the + first element of the second array */ + int istride = ostride = 1; /* array is contiguous in memory */ + int *inembed = n, *onembed = n; +@end example + +Transform each column of a 2d array with 10 rows and 3 columns: +@example + int rank = 1; /* not 2: we are computing 1d transforms */ + int n[] = @{10@}; /* 1d transforms of length 10 */ + int howmany = 3; + int idist = odist = 1; + int istride = ostride = 3; /* distance between two elements in + the same column */ + int *inembed = n, *onembed = n; +@end example + +@c =========> +@node Advanced Real-data DFTs, Advanced Real-to-real Transforms, Advanced Complex DFTs, Advanced Interface +@subsection Advanced Real-data DFTs + +@example +fftw_plan fftw_plan_many_dft_r2c(int rank, const int *n, int howmany, + double *in, const int *inembed, + int istride, int idist, + fftw_complex *out, const int *onembed, + int ostride, int odist, + unsigned flags); +fftw_plan fftw_plan_many_dft_c2r(int rank, const int *n, int howmany, + fftw_complex *in, const int *inembed, + int istride, int idist, + double *out, const int *onembed, + int ostride, int odist, + unsigned flags); +@end example +@findex fftw_plan_many_dft_r2c +@findex fftw_plan_many_dft_c2r + +Like @code{fftw_plan_many_dft}, these two functions add @code{howmany}, +@code{nembed}, @code{stride}, and @code{dist} parameters to the +@code{fftw_plan_dft_r2c} and @code{fftw_plan_dft_c2r} functions, but +otherwise behave the same as the basic interface. + +The interpretation of @code{howmany}, @code{stride}, and @code{dist} are +the same as for @code{fftw_plan_many_dft}, above. Note that the +@code{stride} and @code{dist} for the real array are in units of +@code{double}, and for the complex array are in units of +@code{fftw_complex}. + +If an @code{nembed} parameter is @code{NULL}, it is interpreted as what +it would be in the basic interface, as described in @ref{Real-data DFT +Array Format}. That is, for the complex array the size is assumed to be +the same as @code{n}, but with the last dimension cut roughly in half. +For the real array, the size is assumed to be @code{n} if the transform +is out-of-place, or @code{n} with the last dimension ``padded'' if the +transform is in-place. + +If an @code{nembed} parameter is non-@code{NULL}, it is interpreted as +the physical size of the corresponding array, in row-major order, just +as for @code{fftw_plan_many_dft}. In this case, each dimension of +@code{nembed} should be @code{>=} what it would be in the basic +interface (e.g. the halved or padded @code{n}). + +Arrays @code{n}, @code{inembed}, and @code{onembed} are not used after +this function returns. You can safely free or reuse them. + +@c =========> +@node Advanced Real-to-real Transforms, , Advanced Real-data DFTs, Advanced Interface +@subsection Advanced Real-to-real Transforms + +@example +fftw_plan fftw_plan_many_r2r(int rank, const int *n, int howmany, + double *in, const int *inembed, + int istride, int idist, + double *out, const int *onembed, + int ostride, int odist, + const fftw_r2r_kind *kind, unsigned flags); +@end example +@findex fftw_plan_many_r2r + +Like @code{fftw_plan_many_dft}, this functions adds @code{howmany}, +@code{nembed}, @code{stride}, and @code{dist} parameters to the +@code{fftw_plan_r2r} function, but otherwise behave the same as the +basic interface. The interpretation of those additional parameters are +the same as for @code{fftw_plan_many_dft}. (Of course, the +@code{stride} and @code{dist} parameters are now in units of +@code{double}, not @code{fftw_complex}.) + +Arrays @code{n}, @code{inembed}, @code{onembed}, and @code{kind} are not +used after this function returns. You can safely free or reuse them. + +@c ------------------------------------------------------------ +@node Guru Interface, New-array Execute Functions, Advanced Interface, FFTW Reference +@section Guru Interface +@cindex guru interface + +The ``guru'' interface to FFTW is intended to expose as much as possible +of the flexibility in the underlying FFTW architecture. It allows one +to compute multi-dimensional ``vectors'' (loops) of multi-dimensional +transforms, where each vector/transform dimension has an independent +size and stride. +@cindex vector +One can also use more general complex-number formats, e.g. separate real +and imaginary arrays. + +For those users who require the flexibility of the guru interface, it is +important that they pay special attention to the documentation lest they +shoot themselves in the foot. + +@menu +* Interleaved and split arrays:: +* Guru vector and transform sizes:: +* Guru Complex DFTs:: +* Guru Real-data DFTs:: +* Guru Real-to-real Transforms:: +* 64-bit Guru Interface:: +@end menu + +@c =========> +@node Interleaved and split arrays, Guru vector and transform sizes, Guru Interface, Guru Interface +@subsection Interleaved and split arrays + +The guru interface supports two representations of complex numbers, +which we call the interleaved and the split format. + +The @dfn{interleaved} format is the same one used by the basic and +advanced interfaces, and it is documented in @ref{Complex numbers}. +In the interleaved format, you provide pointers to the real part of a +complex number, and the imaginary part understood to be stored in the +next memory location. +@cindex interleaved format + + +The @dfn{split} format allows separate pointers to the real and +imaginary parts of a complex array. +@cindex split format + + +Technically, the interleaved format is redundant, because you can +always express an interleaved array in terms of a split array with +appropriate pointers and strides. On the other hand, the interleaved +format is simpler to use, and it is common in practice. Hence, FFTW +supports it as a special case. + +@c =========> +@node Guru vector and transform sizes, Guru Complex DFTs, Interleaved and split arrays, Guru Interface +@subsection Guru vector and transform sizes + +The guru interface introduces one basic new data structure, +@code{fftw_iodim}, that is used to specify sizes and strides for +multi-dimensional transforms and vectors: + +@example +typedef struct @{ + int n; + int is; + int os; +@} fftw_iodim; +@end example +@tindex fftw_iodim + +Here, @code{n} is the size of the dimension, and @code{is} and @code{os} +are the strides of that dimension for the input and output arrays. (The +stride is the separation of consecutive elements along this dimension.) + +The meaning of the stride parameter depends on the type of the array +that the stride refers to. @emph{If the array is interleaved complex, +strides are expressed in units of complex numbers +(@code{fftw_complex}). If the array is split complex or real, strides +are expressed in units of real numbers (@code{double}).} This +convention is consistent with the usual pointer arithmetic in the C +language. An interleaved array is denoted by a pointer @code{p} to +@code{fftw_complex}, so that @code{p+1} points to the next complex +number. Split arrays are denoted by pointers to @code{double}, in +which case pointer arithmetic operates in units of +@code{sizeof(double)}. +@cindex stride + + +The guru planner interfaces all take a (@code{rank}, @code{dims[rank]}) +pair describing the transform size, and a (@code{howmany_rank}, +@code{howmany_dims[howmany_rank]}) pair describing the ``vector'' size (a +multi-dimensional loop of transforms to perform), where @code{dims} and +@code{howmany_dims} are arrays of @code{fftw_iodim}. Each @code{n} field must +be positive for @code{dims} and nonnegative for @code{howmany_dims}, while both +@code{rank} and @code{howmany_rank} must be nonnegative. + +For example, the @code{howmany} parameter in the advanced complex-DFT +interface corresponds to @code{howmany_rank} = 1, +@code{howmany_dims[0].n} = @code{howmany}, @code{howmany_dims[0].is} = +@code{idist}, and @code{howmany_dims[0].os} = @code{odist}. +@cindex howmany loop +@cindex dist +(To compute a single transform, you can just use @code{howmany_rank} = 0.) + + +A row-major multidimensional array with dimensions @code{n[rank]} +(@pxref{Row-major Format}) corresponds to @code{dims[i].n} = +@code{n[i]} and the recurrence @code{dims[i].is} = @code{n[i+1] * +dims[i+1].is} (similarly for @code{os}). The stride of the last +(@code{i=rank-1}) dimension is the overall stride of the array. +e.g. to be equivalent to the advanced complex-DFT interface, you would +have @code{dims[rank-1].is} = @code{istride} and +@code{dims[rank-1].os} = @code{ostride}. +@cindex row-major + + +In general, we only guarantee FFTW to return a non-@code{NULL} plan if +the vector and transform dimensions correspond to a set of distinct +indices, and for in-place transforms the input/output strides should +be the same. + +@c =========> +@node Guru Complex DFTs, Guru Real-data DFTs, Guru vector and transform sizes, Guru Interface +@subsection Guru Complex DFTs + +@example +fftw_plan fftw_plan_guru_dft( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); + +fftw_plan fftw_plan_guru_split_dft( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *ri, double *ii, double *ro, double *io, + unsigned flags); +@end example +@findex fftw_plan_guru_dft +@findex fftw_plan_guru_split_dft + +These two functions plan a complex-data, multi-dimensional DFT +for the interleaved and split format, respectively. +Transform dimensions are given by (@code{rank}, @code{dims}) over a +multi-dimensional vector (loop) of dimensions (@code{howmany_rank}, +@code{howmany_dims}). @code{dims} and @code{howmany_dims} should point +to @code{fftw_iodim} arrays of length @code{rank} and +@code{howmany_rank}, respectively. + +@cindex flags +@code{flags} is a bitwise OR (@samp{|}) of zero or more planner flags, +as defined in @ref{Planner Flags}. + +In the @code{fftw_plan_guru_dft} function, the pointers @code{in} and +@code{out} point to the interleaved input and output arrays, +respectively. The sign can be either @math{-1} (= +@code{FFTW_FORWARD}) or @math{+1} (= @code{FFTW_BACKWARD}). If the +pointers are equal, the transform is in-place. + +In the @code{fftw_plan_guru_split_dft} function, +@code{ri} and @code{ii} point to the real and imaginary input arrays, +and @code{ro} and @code{io} point to the real and imaginary output +arrays. The input and output pointers may be the same, indicating an +in-place transform. For example, for @code{fftw_complex} pointers +@code{in} and @code{out}, the corresponding parameters are: + +@example +ri = (double *) in; +ii = (double *) in + 1; +ro = (double *) out; +io = (double *) out + 1; +@end example + +Because @code{fftw_plan_guru_split_dft} accepts split arrays, strides +are expressed in units of @code{double}. For a contiguous +@code{fftw_complex} array, the overall stride of the transform should +be 2, the distance between consecutive real parts or between +consecutive imaginary parts; see @ref{Guru vector and transform +sizes}. Note that the dimension strides are applied equally to the +real and imaginary parts; real and imaginary arrays with different +strides are not supported. + +There is no @code{sign} parameter in @code{fftw_plan_guru_split_dft}. +This function always plans for an @code{FFTW_FORWARD} transform. To +plan for an @code{FFTW_BACKWARD} transform, you can exploit the +identity that the backwards DFT is equal to the forwards DFT with the +real and imaginary parts swapped. For example, in the case of the +@code{fftw_complex} arrays above, the @code{FFTW_BACKWARD} transform +is computed by the parameters: + +@example +ri = (double *) in + 1; +ii = (double *) in; +ro = (double *) out + 1; +io = (double *) out; +@end example + +@c =========> +@node Guru Real-data DFTs, Guru Real-to-real Transforms, Guru Complex DFTs, Guru Interface +@subsection Guru Real-data DFTs + +@example +fftw_plan fftw_plan_guru_dft_r2c( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *in, fftw_complex *out, + unsigned flags); + +fftw_plan fftw_plan_guru_split_dft_r2c( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *in, double *ro, double *io, + unsigned flags); + +fftw_plan fftw_plan_guru_dft_c2r( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + fftw_complex *in, double *out, + unsigned flags); + +fftw_plan fftw_plan_guru_split_dft_c2r( + int rank, const fftw_iodim *dims, + int howmany_rank, const fftw_iodim *howmany_dims, + double *ri, double *ii, double *out, + unsigned flags); +@end example +@findex fftw_plan_guru_dft_r2c +@findex fftw_plan_guru_split_dft_r2c +@findex fftw_plan_guru_dft_c2r +@findex fftw_plan_guru_split_dft_c2r + +Plan a real-input (r2c) or real-output (c2r), multi-dimensional DFT with +transform dimensions given by (@code{rank}, @code{dims}) over a +multi-dimensional vector (loop) of dimensions (@code{howmany_rank}, +@code{howmany_dims}). @code{dims} and @code{howmany_dims} should point +to @code{fftw_iodim} arrays of length @code{rank} and +@code{howmany_rank}, respectively. As for the basic and advanced +interfaces, an r2c transform is @code{FFTW_FORWARD} and a c2r transform +is @code{FFTW_BACKWARD}. + +The @emph{last} dimension of @code{dims} is interpreted specially: +that dimension of the real array has size @code{dims[rank-1].n}, but +that dimension of the complex array has size @code{dims[rank-1].n/2+1} +(division rounded down). The strides, on the other hand, are taken to +be exactly as specified. It is up to the user to specify the strides +appropriately for the peculiar dimensions of the data, and we do not +guarantee that the planner will succeed (return non-@code{NULL}) for +any dimensions other than those described in @ref{Real-data DFT Array +Format} and generalized in @ref{Advanced Real-data DFTs}. (That is, +for an in-place transform, each individual dimension should be able to +operate in place.) +@cindex in-place + + +@code{in} and @code{out} point to the input and output arrays for r2c +and c2r transforms, respectively. For split arrays, @code{ri} and +@code{ii} point to the real and imaginary input arrays for a c2r +transform, and @code{ro} and @code{io} point to the real and imaginary +output arrays for an r2c transform. @code{in} and @code{ro} or +@code{ri} and @code{out} may be the same, indicating an in-place +transform. (In-place transforms where @code{in} and @code{io} or +@code{ii} and @code{out} are the same are not currently supported.) + +@cindex flags +@code{flags} is a bitwise OR (@samp{|}) of zero or more planner flags, +as defined in @ref{Planner Flags}. + +In-place transforms of rank greater than 1 are currently only +supported for interleaved arrays. For split arrays, the planner will +return @code{NULL}. +@cindex in-place + +@c =========> +@node Guru Real-to-real Transforms, 64-bit Guru Interface, Guru Real-data DFTs, Guru Interface +@subsection Guru Real-to-real Transforms + +@example +fftw_plan fftw_plan_guru_r2r(int rank, const fftw_iodim *dims, + int howmany_rank, + const fftw_iodim *howmany_dims, + double *in, double *out, + const fftw_r2r_kind *kind, + unsigned flags); +@end example +@findex fftw_plan_guru_r2r + +Plan a real-to-real (r2r) multi-dimensional @code{FFTW_FORWARD} +transform with transform dimensions given by (@code{rank}, @code{dims}) +over a multi-dimensional vector (loop) of dimensions +(@code{howmany_rank}, @code{howmany_dims}). @code{dims} and +@code{howmany_dims} should point to @code{fftw_iodim} arrays of length +@code{rank} and @code{howmany_rank}, respectively. + +The transform kind of each dimension is given by the @code{kind} +parameter, which should point to an array of length @code{rank}. Valid +@code{fftw_r2r_kind} constants are given in @ref{Real-to-Real Transform +Kinds}. + +@code{in} and @code{out} point to the real input and output arrays; they +may be the same, indicating an in-place transform. + +@cindex flags +@code{flags} is a bitwise OR (@samp{|}) of zero or more planner flags, +as defined in @ref{Planner Flags}. + +@c =========> +@node 64-bit Guru Interface, , Guru Real-to-real Transforms, Guru Interface +@subsection 64-bit Guru Interface +@cindex 64-bit architecture + +When compiled in 64-bit mode on a 64-bit architecture (where addresses +are 64 bits wide), FFTW uses 64-bit quantities internally for all +transform sizes, strides, and so on---you don't have to do anything +special to exploit this. However, in the ordinary FFTW interfaces, +you specify the transform size by an @code{int} quantity, which is +normally only 32 bits wide. This means that, even though FFTW is +using 64-bit sizes internally, you cannot specify a single transform +dimension larger than +@ifinfo +2^31-1 +@end ifinfo +@html +231−1 +@end html +@tex +$2^{31}-1$ +@end tex +numbers. + +We expect that few users will require transforms larger than this, but, +for those who do, we provide a 64-bit version of the guru interface in +which all sizes are specified as integers of type @code{ptrdiff_t} +instead of @code{int}. (@code{ptrdiff_t} is a signed integer type +defined by the C standard to be wide enough to represent address +differences, and thus must be at least 64 bits wide on a 64-bit +machine.) We stress that there is @emph{no performance advantage} to +using this interface---the same internal FFTW code is employed +regardless---and it is only necessary if you want to specify very +large transform sizes. +@tindex ptrdiff_t + + +In particular, the 64-bit guru interface is a set of planner routines +that are exactly the same as the guru planner routines, except that +they are named with @samp{guru64} instead of @samp{guru} and they take +arguments of type @code{fftw_iodim64} instead of @code{fftw_iodim}. +For example, instead of @code{fftw_plan_guru_dft}, we have +@code{fftw_plan_guru64_dft}. + +@example +fftw_plan fftw_plan_guru64_dft( + int rank, const fftw_iodim64 *dims, + int howmany_rank, const fftw_iodim64 *howmany_dims, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +@end example +@findex fftw_plan_guru64_dft + +The @code{fftw_iodim64} type is similar to @code{fftw_iodim}, with the +same interpretation, except that it uses type @code{ptrdiff_t} instead +of type @code{int}. + +@example +typedef struct @{ + ptrdiff_t n; + ptrdiff_t is; + ptrdiff_t os; +@} fftw_iodim64; +@end example +@tindex fftw_iodim64 + +Every other @samp{fftw_plan_guru} function also has a +@samp{fftw_plan_guru64} equivalent, but we do not repeat their +documentation here since they are identical to the 32-bit versions +except as noted above. + +@c ----------------------------------------------------------- +@node New-array Execute Functions, Wisdom, Guru Interface, FFTW Reference +@section New-array Execute Functions +@cindex execute +@cindex new-array execution + +Normally, one executes a plan for the arrays with which the plan was +created, by calling @code{fftw_execute(plan)} as described in @ref{Using +Plans}. +@findex fftw_execute +However, it is possible for sophisticated users to apply a given plan +to a @emph{different} array using the ``new-array execute'' functions +detailed below, provided that the following conditions are met: + +@itemize @bullet + +@item +The array size, strides, etcetera are the same (since those are set by +the plan). + +@item +The input and output arrays are the same (in-place) or different +(out-of-place) if the plan was originally created to be in-place or +out-of-place, respectively. + +@item +For split arrays, the separations between the real and imaginary +parts, @code{ii-ri} and @code{io-ro}, are the same as they were for +the input and output arrays when the plan was created. (This +condition is automatically satisfied for interleaved arrays.) + +@item +The @dfn{alignment} of the new input/output arrays is the same as that +of the input/output arrays when the plan was created, unless the plan +was created with the @code{FFTW_UNALIGNED} flag. +@ctindex FFTW_UNALIGNED +Here, the alignment is a platform-dependent quantity (for example, it is +the address modulo 16 if SSE SIMD instructions are used, but the address +modulo 4 for non-SIMD single-precision FFTW on the same machine). In +general, only arrays allocated with @code{fftw_malloc} are guaranteed to +be equally aligned (@pxref{SIMD alignment and fftw_malloc}). + +@end itemize + +@cindex alignment +The alignment issue is especially critical, because if you don't use +@code{fftw_malloc} then you may have little control over the alignment +of arrays in memory. For example, neither the C++ @code{new} function +nor the Fortran @code{allocate} statement provide strong enough +guarantees about data alignment. If you don't use @code{fftw_malloc}, +therefore, you probably have to use @code{FFTW_UNALIGNED} (which +disables most SIMD support). If possible, it is probably better for +you to simply create multiple plans (creating a new plan is quick once +one exists for a given size), or better yet re-use the same array for +your transforms. + +@findex fftw_alignment_of +For rare circumstances in which you cannot control the alignment of +allocated memory, but wish to determine where a given array is +aligned like the original array for which a plan was created, you can +use the @code{fftw_alignment_of} function: +@example +int fftw_alignment_of(double *p); +@end example +Two arrays have equivalent alignment (for the purposes of applying a +plan) if and only if @code{fftw_alignment_of} returns the same value +for the corresponding pointers to their data (typecast to @code{double*} +if necessary). + +If you are tempted to use the new-array execute interface because you +want to transform a known bunch of arrays of the same size, you should +probably go use the advanced interface instead (@pxref{Advanced +Interface})). + +The new-array execute functions are: + +@example +void fftw_execute_dft( + const fftw_plan p, + fftw_complex *in, fftw_complex *out); + +void fftw_execute_split_dft( + const fftw_plan p, + double *ri, double *ii, double *ro, double *io); + +void fftw_execute_dft_r2c( + const fftw_plan p, + double *in, fftw_complex *out); + +void fftw_execute_split_dft_r2c( + const fftw_plan p, + double *in, double *ro, double *io); + +void fftw_execute_dft_c2r( + const fftw_plan p, + fftw_complex *in, double *out); + +void fftw_execute_split_dft_c2r( + const fftw_plan p, + double *ri, double *ii, double *out); + +void fftw_execute_r2r( + const fftw_plan p, + double *in, double *out); +@end example +@findex fftw_execute_dft +@findex fftw_execute_split_dft +@findex fftw_execute_dft_r2c +@findex fftw_execute_split_dft_r2c +@findex fftw_execute_dft_c2r +@findex fftw_execute_split_dft_c2r +@findex fftw_execute_r2r + +These execute the @code{plan} to compute the corresponding transform on +the input/output arrays specified by the subsequent arguments. The +input/output array arguments have the same meanings as the ones passed +to the guru planner routines in the preceding sections. The @code{plan} +is not modified, and these routines can be called as many times as +desired, or intermixed with calls to the ordinary @code{fftw_execute}. + +The @code{plan} @emph{must} have been created for the transform type +corresponding to the execute function, e.g. it must be a complex-DFT +plan for @code{fftw_execute_dft}. Any of the planner routines for that +transform type, from the basic to the guru interface, could have been +used to create the plan, however. + +@c ------------------------------------------------------------ +@node Wisdom, What FFTW Really Computes, New-array Execute Functions, FFTW Reference +@section Wisdom +@cindex wisdom +@cindex saving plans to disk + +This section documents the FFTW mechanism for saving and restoring +plans from disk. This mechanism is called @dfn{wisdom}. + +@menu +* Wisdom Export:: +* Wisdom Import:: +* Forgetting Wisdom:: +* Wisdom Utilities:: +@end menu + +@c =========> +@node Wisdom Export, Wisdom Import, Wisdom, Wisdom +@subsection Wisdom Export + +@example +int fftw_export_wisdom_to_filename(const char *filename); +void fftw_export_wisdom_to_file(FILE *output_file); +char *fftw_export_wisdom_to_string(void); +void fftw_export_wisdom(void (*write_char)(char c, void *), void *data); +@end example +@findex fftw_export_wisdom +@findex fftw_export_wisdom_to_filename +@findex fftw_export_wisdom_to_file +@findex fftw_export_wisdom_to_string + +These functions allow you to export all currently accumulated wisdom +in a form from which it can be later imported and restored, even +during a separate run of the program. (@xref{Words of Wisdom-Saving +Plans}.) The current store of wisdom is not affected by calling any +of these routines. + +@code{fftw_export_wisdom} exports the wisdom to any output +medium, as specified by the callback function +@code{write_char}. @code{write_char} is a @code{putc}-like function that +writes the character @code{c} to some output; its second parameter is +the @code{data} pointer passed to @code{fftw_export_wisdom}. For +convenience, the following three ``wrapper'' routines are provided: + +@code{fftw_export_wisdom_to_filename} writes wisdom to a file named +@code{filename} (which is created or overwritten), returning @code{1} +on success and @code{0} on failure. A lower-level function, which +requires you to open and close the file yourself (e.g. if you want to +write wisdom to a portion of a larger file) is +@code{fftw_export_wisdom_to_file}. This writes the wisdom to the +current position in @code{output_file}, which should be open with +write permission; upon exit, the file remains open and is positioned +at the end of the wisdom data. + +@code{fftw_export_wisdom_to_string} returns a pointer to a +@code{NULL}-terminated string holding the wisdom data. This string is +dynamically allocated, and it is the responsibility of the caller to +deallocate it with @code{free} when it is no longer needed. + +All of these routines export the wisdom in the same format, which we +will not document here except to say that it is LISP-like ASCII text +that is insensitive to white space. + +@c =========> +@node Wisdom Import, Forgetting Wisdom, Wisdom Export, Wisdom +@subsection Wisdom Import + +@example +int fftw_import_system_wisdom(void); +int fftw_import_wisdom_from_filename(const char *filename); +int fftw_import_wisdom_from_string(const char *input_string); +int fftw_import_wisdom(int (*read_char)(void *), void *data); +@end example +@findex fftw_import_wisdom +@findex fftw_import_system_wisdom +@findex fftw_import_wisdom_from_filename +@findex fftw_import_wisdom_from_file +@findex fftw_import_wisdom_from_string + +These functions import wisdom into a program from data stored by the +@code{fftw_export_wisdom} functions above. (@xref{Words of +Wisdom-Saving Plans}.) The imported wisdom replaces any wisdom +already accumulated by the running program. + +@code{fftw_import_wisdom} imports wisdom from any input medium, as +specified by the callback function @code{read_char}. @code{read_char} is +a @code{getc}-like function that returns the next character in the +input; its parameter is the @code{data} pointer passed to +@code{fftw_import_wisdom}. If the end of the input data is reached +(which should never happen for valid data), @code{read_char} should +return @code{EOF} (as defined in @code{}). For convenience, +the following three ``wrapper'' routines are provided: + +@code{fftw_import_wisdom_from_filename} reads wisdom from a file named +@code{filename}. A lower-level function, which requires you to open +and close the file yourself (e.g. if you want to read wisdom from a +portion of a larger file) is @code{fftw_import_wisdom_from_file}. This +reads wisdom from the current position in @code{input_file} (which +should be open with read permission); upon exit, the file remains +open, but the position of the read pointer is unspecified. + +@code{fftw_import_wisdom_from_string} reads wisdom from the +@code{NULL}-terminated string @code{input_string}. + +@code{fftw_import_system_wisdom} reads wisdom from an +implementation-defined standard file (@code{/etc/fftw/wisdom} on Unix +and GNU systems). +@cindex wisdom, system-wide + + +The return value of these import routines is @code{1} if the wisdom was +read successfully and @code{0} otherwise. Note that, in all of these +functions, any data in the input stream past the end of the wisdom data +is simply ignored. + +@c =========> +@node Forgetting Wisdom, Wisdom Utilities, Wisdom Import, Wisdom +@subsection Forgetting Wisdom + +@example +void fftw_forget_wisdom(void); +@end example +@findex fftw_forget_wisdom + +Calling @code{fftw_forget_wisdom} causes all accumulated @code{wisdom} +to be discarded and its associated memory to be freed. (New +@code{wisdom} can still be gathered subsequently, however.) + +@c =========> +@node Wisdom Utilities, , Forgetting Wisdom, Wisdom +@subsection Wisdom Utilities + +FFTW includes two standalone utility programs that deal with wisdom. We +merely summarize them here, since they come with their own @code{man} +pages for Unix and GNU systems (with HTML versions on our web site). + +The first program is @code{fftw-wisdom} (or @code{fftwf-wisdom} in +single precision, etcetera), which can be used to create a wisdom file +containing plans for any of the transform sizes and types supported by +FFTW. It is preferable to create wisdom directly from your executable +(@pxref{Caveats in Using Wisdom}), but this program is useful for +creating global wisdom files for @code{fftw_import_system_wisdom}. +@cindex fftw-wisdom utility + + +The second program is @code{fftw-wisdom-to-conf}, which takes a wisdom +file as input and produces a @dfn{configuration routine} as output. The +latter is a C subroutine that you can compile and link into your +program, replacing a routine of the same name in the FFTW library, that +determines which parts of FFTW are callable by your program. +@code{fftw-wisdom-to-conf} produces a configuration routine that links +to only those parts of FFTW needed by the saved plans in the wisdom, +greatly reducing the size of statically linked executables (which should +only attempt to create plans corresponding to those in the wisdom, +however). +@cindex fftw-wisdom-to-conf utility +@cindex configuration routines + +@c ------------------------------------------------------------ +@node What FFTW Really Computes, , Wisdom, FFTW Reference +@section What FFTW Really Computes + +In this section, we provide precise mathematical definitions for the +transforms that FFTW computes. These transform definitions are fairly +standard, but some authors follow slightly different conventions for the +normalization of the transform (the constant factor in front) and the +sign of the complex exponent. We begin by presenting the +one-dimensional (1d) transform definitions, and then give the +straightforward extension to multi-dimensional transforms. + +@menu +* The 1d Discrete Fourier Transform (DFT):: +* The 1d Real-data DFT:: +* 1d Real-even DFTs (DCTs):: +* 1d Real-odd DFTs (DSTs):: +* 1d Discrete Hartley Transforms (DHTs):: +* Multi-dimensional Transforms:: +@end menu + +@c =========> +@node The 1d Discrete Fourier Transform (DFT), The 1d Real-data DFT, What FFTW Really Computes, What FFTW Really Computes +@subsection The 1d Discrete Fourier Transform (DFT) + +@cindex discrete Fourier transform +@cindex DFT +The forward (@code{FFTW_FORWARD}) discrete Fourier transform (DFT) of a +1d complex array @math{X} of size @math{n} computes an array @math{Y}, +where: +@tex +$$ +Y_k = \sum_{j = 0}^{n - 1} X_j e^{-2\pi j k \sqrt{-1}/n} \ . +$$ +@end tex +@ifinfo +@center Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(-2 pi j k sqrt(-1)/n) . +@end ifinfo +@html +
    .
    +@end html +The backward (@code{FFTW_BACKWARD}) DFT computes: +@tex +$$ +Y_k = \sum_{j = 0}^{n - 1} X_j e^{2\pi j k \sqrt{-1}/n} \ . +$$ +@end tex +@ifinfo +@center Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(2 pi j k sqrt(-1)/n) . +@end ifinfo +@html +
    .
    +@end html + +@cindex normalization +FFTW computes an unnormalized transform, in that there is no coefficient +in front of the summation in the DFT. In other words, applying the +forward and then the backward transform will multiply the input by +@math{n}. + +@cindex frequency +From above, an @code{FFTW_FORWARD} transform corresponds to a sign of +@math{-1} in the exponent of the DFT. Note also that we use the +standard ``in-order'' output ordering---the @math{k}-th output +corresponds to the frequency @math{k/n} (or @math{k/T}, where @math{T} +is your total sampling period). For those who like to think in terms of +positive and negative frequencies, this means that the positive +frequencies are stored in the first half of the output and the negative +frequencies are stored in backwards order in the second half of the +output. (The frequency @math{-k/n} is the same as the frequency +@math{(n-k)/n}.) + +@c =========> +@node The 1d Real-data DFT, 1d Real-even DFTs (DCTs), The 1d Discrete Fourier Transform (DFT), What FFTW Really Computes +@subsection The 1d Real-data DFT + +The real-input (r2c) DFT in FFTW computes the @emph{forward} transform +@math{Y} of the size @code{n} real array @math{X}, exactly as defined +above, i.e. +@tex +$$ +Y_k = \sum_{j = 0}^{n - 1} X_j e^{-2\pi j k \sqrt{-1}/n} \ . +$$ +@end tex +@ifinfo +@center Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(-2 pi j k sqrt(-1)/n) . +@end ifinfo +@html +
    .
    +@end html +This output array @math{Y} can easily be shown to possess the +``Hermitian'' symmetry +@cindex Hermitian +@tex +$Y_k = Y_{n-k}^*$, +@end tex +@ifinfo +Y[k] = Y[n-k]*, +@end ifinfo +@html +Yk = Yn-k*, +@end html +where we take @math{Y} to be periodic so that +@tex +$Y_n = Y_0$. +@end tex +@ifinfo +Y[n] = Y[0]. +@end ifinfo +@html +Yn = Y0. +@end html + +As a result of this symmetry, half of the output @math{Y} is redundant +(being the complex conjugate of the other half), and so the 1d r2c +transforms only output elements @math{0}@dots{}@math{n/2} of @math{Y} +(@math{n/2+1} complex numbers), where the division by @math{2} is +rounded down. + +Moreover, the Hermitian symmetry implies that +@tex +$Y_0$ +@end tex +@ifinfo +Y[0] +@end ifinfo +@html +Y0 +@end html +and, if @math{n} is even, the +@tex +$Y_{n/2}$ +@end tex +@ifinfo +Y[n/2] +@end ifinfo +@html +Yn/2 +@end html +element, are purely real. So, for the @code{R2HC} r2r transform, the +halfcomplex format does not store the imaginary parts of these elements. +@cindex r2r +@ctindex R2HC +@cindex halfcomplex format + + +The c2r and @code{H2RC} r2r transforms compute the backward DFT of the +@emph{complex} array @math{X} with Hermitian symmetry, stored in the +r2c/@code{R2HC} output formats, respectively, where the backward +transform is defined exactly as for the complex case: +@tex +$$ +Y_k = \sum_{j = 0}^{n - 1} X_j e^{2\pi j k \sqrt{-1}/n} \ . +$$ +@end tex +@ifinfo +@center Y[k] = sum for j = 0 to (n - 1) of X[j] * exp(2 pi j k sqrt(-1)/n) . +@end ifinfo +@html +
    .
    +@end html +The outputs @code{Y} of this transform can easily be seen to be purely +real, and are stored as an array of real numbers. + +@cindex normalization +Like FFTW's complex DFT, these transforms are unnormalized. In other +words, applying the real-to-complex (forward) and then the +complex-to-real (backward) transform will multiply the input by +@math{n}. + +@c =========> +@node 1d Real-even DFTs (DCTs), 1d Real-odd DFTs (DSTs), The 1d Real-data DFT, What FFTW Really Computes +@subsection 1d Real-even DFTs (DCTs) + +The Real-even symmetry DFTs in FFTW are exactly equivalent to the unnormalized +forward (and backward) DFTs as defined above, where the input array +@math{X} of length @math{N} is purely real and is also @dfn{even} symmetry. In +this case, the output array is likewise real and even symmetry. +@cindex real-even DFT +@cindex REDFT + + +@ctindex REDFT00 +For the case of @code{REDFT00}, this even symmetry means that +@tex +$X_j = X_{N-j}$, +@end tex +@ifinfo +X[j] = X[N-j], +@end ifinfo +@html +Xj = XN-j, +@end html +where we take @math{X} to be periodic so that +@tex +$X_N = X_0$. +@end tex +@ifinfo +X[N] = X[0]. +@end ifinfo +@html +XN = X0. +@end html +Because of this redundancy, only the first @math{n} real numbers are +actually stored, where @math{N = 2(n-1)}. + +The proper definition of even symmetry for @code{REDFT10}, +@code{REDFT01}, and @code{REDFT11} transforms is somewhat more intricate +because of the shifts by @math{1/2} of the input and/or output, although +the corresponding boundary conditions are given in @ref{Real even/odd +DFTs (cosine/sine transforms)}. Because of the even symmetry, however, +the sine terms in the DFT all cancel and the remaining cosine terms are +written explicitly below. This formulation often leads people to call +such a transform a @dfn{discrete cosine transform} (DCT), although it is +really just a special case of the DFT. +@cindex discrete cosine transform +@cindex DCT + + +In each of the definitions below, we transform a real array @math{X} of +length @math{n} to a real array @math{Y} of length @math{n}: + +@subsubheading REDFT00 (DCT-I) +@ctindex REDFT00 +An @code{REDFT00} transform (type-I DCT) in FFTW is defined by: +@tex +$$ +Y_k = X_0 + (-1)^k X_{n-1} + + 2 \sum_{j=1}^{n-2} X_j \cos [ \pi j k / (n-1)]. +$$ +@end tex +@ifinfo +Y[k] = X[0] + (-1)^k X[n-1] + 2 (sum for j = 1 to n-2 of X[j] cos(pi jk /(n-1))). +@end ifinfo +@html +
    .
    +@end html +Note that this transform is not defined for @math{n=1}. For @math{n=2}, +the summation term above is dropped as you might expect. + +@subsubheading REDFT10 (DCT-II) +@ctindex REDFT10 +An @code{REDFT10} transform (type-II DCT, sometimes called ``the'' DCT) in FFTW is defined by: +@tex +$$ +Y_k = 2 \sum_{j=0}^{n-1} X_j \cos [\pi (j+1/2) k / n]. +$$ +@end tex +@ifinfo +Y[k] = 2 (sum for j = 0 to n-1 of X[j] cos(pi (j+1/2) k / n)). +@end ifinfo +@html +
    .
    +@end html + +@subsubheading REDFT01 (DCT-III) +@ctindex REDFT01 +An @code{REDFT01} transform (type-III DCT) in FFTW is defined by: +@tex +$$ +Y_k = X_0 + 2 \sum_{j=1}^{n-1} X_j \cos [\pi j (k+1/2) / n]. +$$ +@end tex +@ifinfo +Y[k] = X[0] + 2 (sum for j = 1 to n-1 of X[j] cos(pi j (k+1/2) / n)). +@end ifinfo +@html +
    .
    +@end html +In the case of @math{n=1}, this reduces to +@tex +$Y_0 = X_0$. +@end tex +@ifinfo +Y[0] = X[0]. +@end ifinfo +@html +Y0 = X0. +@end html +Up to a scale factor (see below), this is the inverse of @code{REDFT10} (``the'' DCT), and so the @code{REDFT01} (DCT-III) is sometimes called the ``IDCT''. +@cindex IDCT + +@subsubheading REDFT11 (DCT-IV) +@ctindex REDFT11 +An @code{REDFT11} transform (type-IV DCT) in FFTW is defined by: +@tex +$$ +Y_k = 2 \sum_{j=0}^{n-1} X_j \cos [\pi (j+1/2) (k+1/2) / n]. +$$ +@end tex +@ifinfo +Y[k] = 2 (sum for j = 0 to n-1 of X[j] cos(pi (j+1/2) (k+1/2) / n)). +@end ifinfo +@html +
    .
    +@end html + +@subsubheading Inverses and Normalization + +These definitions correspond directly to the unnormalized DFTs used +elsewhere in FFTW (hence the factors of @math{2} in front of the +summations). The unnormalized inverse of @code{REDFT00} is +@code{REDFT00}, of @code{REDFT10} is @code{REDFT01} and vice versa, and +of @code{REDFT11} is @code{REDFT11}. Each unnormalized inverse results +in the original array multiplied by @math{N}, where @math{N} is the +@emph{logical} DFT size. For @code{REDFT00}, @math{N=2(n-1)} (note that +@math{n=1} is not defined); otherwise, @math{N=2n}. +@cindex normalization + + +In defining the discrete cosine transform, some authors also include +additional factors of +@ifinfo +sqrt(2) +@end ifinfo +@html +√2 +@end html +@tex +$\sqrt{2}$ +@end tex +(or its inverse) multiplying selected inputs and/or outputs. This is a +mostly cosmetic change that makes the transform orthogonal, but +sacrifices the direct equivalence to a symmetric DFT. + +@c =========> +@node 1d Real-odd DFTs (DSTs), 1d Discrete Hartley Transforms (DHTs), 1d Real-even DFTs (DCTs), What FFTW Really Computes +@subsection 1d Real-odd DFTs (DSTs) + +The Real-odd symmetry DFTs in FFTW are exactly equivalent to the unnormalized +forward (and backward) DFTs as defined above, where the input array +@math{X} of length @math{N} is purely real and is also @dfn{odd} symmetry. In +this case, the output is odd symmetry and purely imaginary. +@cindex real-odd DFT +@cindex RODFT + + +@ctindex RODFT00 +For the case of @code{RODFT00}, this odd symmetry means that +@tex +$X_j = -X_{N-j}$, +@end tex +@ifinfo +X[j] = -X[N-j], +@end ifinfo +@html +Xj = -XN-j, +@end html +where we take @math{X} to be periodic so that +@tex +$X_N = X_0$. +@end tex +@ifinfo +X[N] = X[0]. +@end ifinfo +@html +XN = X0. +@end html +Because of this redundancy, only the first @math{n} real numbers +starting at @math{j=1} are actually stored (the @math{j=0} element is +zero), where @math{N = 2(n+1)}. + +The proper definition of odd symmetry for @code{RODFT10}, +@code{RODFT01}, and @code{RODFT11} transforms is somewhat more intricate +because of the shifts by @math{1/2} of the input and/or output, although +the corresponding boundary conditions are given in @ref{Real even/odd +DFTs (cosine/sine transforms)}. Because of the odd symmetry, however, +the cosine terms in the DFT all cancel and the remaining sine terms are +written explicitly below. This formulation often leads people to call +such a transform a @dfn{discrete sine transform} (DST), although it is +really just a special case of the DFT. +@cindex discrete sine transform +@cindex DST + + +In each of the definitions below, we transform a real array @math{X} of +length @math{n} to a real array @math{Y} of length @math{n}: + +@subsubheading RODFT00 (DST-I) +@ctindex RODFT00 +An @code{RODFT00} transform (type-I DST) in FFTW is defined by: +@tex +$$ +Y_k = 2 \sum_{j=0}^{n-1} X_j \sin [ \pi (j+1) (k+1) / (n+1)]. +$$ +@end tex +@ifinfo +Y[k] = 2 (sum for j = 0 to n-1 of X[j] sin(pi (j+1)(k+1) / (n+1))). +@end ifinfo +@html +
    .
    +@end html + +@subsubheading RODFT10 (DST-II) +@ctindex RODFT10 +An @code{RODFT10} transform (type-II DST) in FFTW is defined by: +@tex +$$ +Y_k = 2 \sum_{j=0}^{n-1} X_j \sin [\pi (j+1/2) (k+1) / n]. +$$ +@end tex +@ifinfo +Y[k] = 2 (sum for j = 0 to n-1 of X[j] sin(pi (j+1/2) (k+1) / n)). +@end ifinfo +@html +
    .
    +@end html + +@subsubheading RODFT01 (DST-III) +@ctindex RODFT01 +An @code{RODFT01} transform (type-III DST) in FFTW is defined by: +@tex +$$ +Y_k = (-1)^k X_{n-1} + 2 \sum_{j=0}^{n-2} X_j \sin [\pi (j+1) (k+1/2) / n]. +$$ +@end tex +@ifinfo +Y[k] = (-1)^k X[n-1] + 2 (sum for j = 0 to n-2 of X[j] sin(pi (j+1) (k+1/2) / n)). +@end ifinfo +@html +
    .
    +@end html +In the case of @math{n=1}, this reduces to +@tex +$Y_0 = X_0$. +@end tex +@ifinfo +Y[0] = X[0]. +@end ifinfo +@html +Y0 = X0. +@end html + +@subsubheading RODFT11 (DST-IV) +@ctindex RODFT11 +An @code{RODFT11} transform (type-IV DST) in FFTW is defined by: +@tex +$$ +Y_k = 2 \sum_{j=0}^{n-1} X_j \sin [\pi (j+1/2) (k+1/2) / n]. +$$ +@end tex +@ifinfo +Y[k] = 2 (sum for j = 0 to n-1 of X[j] sin(pi (j+1/2) (k+1/2) / n)). +@end ifinfo +@html +
    .
    +@end html + +@subsubheading Inverses and Normalization + +These definitions correspond directly to the unnormalized DFTs used +elsewhere in FFTW (hence the factors of @math{2} in front of the +summations). The unnormalized inverse of @code{RODFT00} is +@code{RODFT00}, of @code{RODFT10} is @code{RODFT01} and vice versa, and +of @code{RODFT11} is @code{RODFT11}. Each unnormalized inverse results +in the original array multiplied by @math{N}, where @math{N} is the +@emph{logical} DFT size. For @code{RODFT00}, @math{N=2(n+1)}; +otherwise, @math{N=2n}. +@cindex normalization + + +In defining the discrete sine transform, some authors also include +additional factors of +@ifinfo +sqrt(2) +@end ifinfo +@html +√2 +@end html +@tex +$\sqrt{2}$ +@end tex +(or its inverse) multiplying selected inputs and/or outputs. This is a +mostly cosmetic change that makes the transform orthogonal, but +sacrifices the direct equivalence to an antisymmetric DFT. + +@c =========> +@node 1d Discrete Hartley Transforms (DHTs), Multi-dimensional Transforms, 1d Real-odd DFTs (DSTs), What FFTW Really Computes +@subsection 1d Discrete Hartley Transforms (DHTs) + +@cindex discrete Hartley transform +@cindex DHT +The discrete Hartley transform (DHT) of a 1d real array @math{X} of size +@math{n} computes a real array @math{Y} of the same size, where: +@tex +$$ +Y_k = \sum_{j = 0}^{n - 1} X_j [ \cos(2\pi j k / n) + \sin(2\pi j k / n)]. +$$ +@end tex +@ifinfo +@center Y[k] = sum for j = 0 to (n - 1) of X[j] * [cos(2 pi j k / n) + sin(2 pi j k / n)]. +@end ifinfo +@html +
    .
    +@end html + +@cindex normalization +FFTW computes an unnormalized transform, in that there is no coefficient +in front of the summation in the DHT. In other words, applying the +transform twice (the DHT is its own inverse) will multiply the input by +@math{n}. + +@c =========> +@node Multi-dimensional Transforms, , 1d Discrete Hartley Transforms (DHTs), What FFTW Really Computes +@subsection Multi-dimensional Transforms + +The multi-dimensional transforms of FFTW, in general, compute simply the +separable product of the given 1d transform along each dimension of the +array. Since each of these transforms is unnormalized, computing the +forward followed by the backward/inverse multi-dimensional transform +will result in the original array scaled by the product of the +normalization factors for each dimension (e.g. the product of the +dimension sizes, for a multi-dimensional DFT). + +@tex +As an explicit example, consider the following exact mathematical +definition of our multi-dimensional DFT. Let $X$ be a $d$-dimensional +complex array whose elements are $X[j_1, j_2, \ldots, j_d]$, where $0 +\leq j_s < n_s$ for all~$s \in \{ 1, 2, \ldots, d \}$. Let also +$\omega_s = e^{2\pi \sqrt{-1}/n_s}$, for all ~$s \in \{ 1, 2, \ldots, d +\}$. + +The forward transform computes a complex array~$Y$, whose +structure is the same as that of~$X$, defined by + +$$ +Y[k_1, k_2, \ldots, k_d] = + \sum_{j_1 = 0}^{n_1 - 1} + \sum_{j_2 = 0}^{n_2 - 1} + \cdots + \sum_{j_d = 0}^{n_d - 1} + X[j_1, j_2, \ldots, j_d] + \omega_1^{-j_1 k_1} + \omega_2^{-j_2 k_2} + \cdots + \omega_d^{-j_d k_d} \ . +$$ + +The backward transform computes +$$ +Y[k_1, k_2, \ldots, k_d] = + \sum_{j_1 = 0}^{n_1 - 1} + \sum_{j_2 = 0}^{n_2 - 1} + \cdots + \sum_{j_d = 0}^{n_d - 1} + X[j_1, j_2, \ldots, j_d] + \omega_1^{j_1 k_1} + \omega_2^{j_2 k_2} + \cdots + \omega_d^{j_d k_d} \ . +$$ + +Computing the forward transform followed by the backward transform +will multiply the array by $\prod_{s=1}^{d} n_d$. +@end tex + +@cindex r2c +The definition of FFTW's multi-dimensional DFT of real data (r2c) +deserves special attention. In this case, we logically compute the full +multi-dimensional DFT of the input data; since the input data are purely +real, the output data have the Hermitian symmetry and therefore only one +non-redundant half need be stored. More specifically, for an @ndims multi-dimensional real-input DFT, the full (logical) complex output array +@tex +$Y[k_0, k_1, \ldots, k_{d-1}]$ +@end tex +@html +Y[k0, k1, ..., +kd-1] +@end html +@ifinfo +Y[k[0], k[1], ..., k[d-1]] +@end ifinfo +has the symmetry: +@tex +$$ +Y[k_0, k_1, \ldots, k_{d-1}] = Y[n_0 - k_0, n_1 - k_1, \ldots, n_{d-1} - k_{d-1}]^* +$$ +@end tex +@html +Y[k0, k1, ..., +kd-1] = Y[n0 - +k0, n1 - k1, ..., +nd-1 - kd-1]* +@end html +@ifinfo +Y[k[0], k[1], ..., k[d-1]] = Y[n[0] - k[0], n[1] - k[1], ..., n[d-1] - k[d-1]]* +@end ifinfo +(where each dimension is periodic). Because of this symmetry, we only +store the +@tex +$k_{d-1} = 0 \cdots n_{d-1}/2$ +@end tex +@html +kd-1 = 0...nd-1/2+1 +@end html +@ifinfo +k[d-1] = 0...n[d-1]/2 +@end ifinfo +elements of the @emph{last} dimension (division by @math{2} is rounded +down). (We could instead have cut any other dimension in half, but the +last dimension proved computationally convenient.) This results in the +peculiar array format described in more detail by @ref{Real-data DFT +Array Format}. + +The multi-dimensional c2r transform is simply the unnormalized inverse +of the r2c transform. i.e. it is the same as FFTW's complex backward +multi-dimensional DFT, operating on a Hermitian input array in the +peculiar format mentioned above and outputting a real array (since the +DFT output is purely real). + +We should remind the user that the separable product of 1d transforms +along each dimension, as computed by FFTW, is not always the same thing +as the usual multi-dimensional transform. A multi-dimensional +@code{R2HC} (or @code{HC2R}) transform is not identical to the +multi-dimensional DFT, requiring some post-processing to combine the +requisite real and imaginary parts, as was described in @ref{The +Halfcomplex-format DFT}. Likewise, FFTW's multidimensional +@code{FFTW_DHT} r2r transform is not the same thing as the logical +multi-dimensional discrete Hartley transform defined in the literature, +as discussed in @ref{The Discrete Hartley Transform}. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd-for-html.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd-for-html.png new file mode 100644 index 000000000..076fdcb88 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd-for-html.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.eps b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.eps new file mode 100644 index 000000000..96ae399d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.eps @@ -0,0 +1,2228 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: ./rfftwnd.fig +%%Creator: fig2dev Version 3.2.6a +%%CreationDate: 2018-05-24 08:08:23 +%%BoundingBox: 0 0 270 406 +%Magnification: 0.7000 +%%EndComments +%%BeginProlog +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col32 {0.475 0.490 0.475 srgb} bind def +/col33 {0.937 0.922 0.937 srgb} bind def +/col34 {0.906 0.188 0.125 srgb} bind def +/col35 {0.969 0.557 0.525 srgb} bind def +/col36 {0.412 0.588 0.780 srgb} bind def +/col37 {0.525 0.667 0.843 srgb} bind def +/col38 {0.875 0.859 0.000 srgb} bind def + +end + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Helvetica /Helvetica-iso isovec ReEncode +/Helvetica-Bold /Helvetica-Bold-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +/pageheader { +save +newpath 0 406 moveto 0 0 lineto 270 0 lineto 270 406 lineto closepath clip newpath +-2.5 407.2 translate +1 -1 scale +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.04200 0.04200 sc +} bind def +/pagefooter { +$F2psEnd +restore +} bind def +%%EndProlog +pageheader +% +% Fig objects follow +% +% +% here starts figure with depth 998 +% Polyline +0 slj +0 slc +0.000 slw +n 1221 7280 m 6435 7280 l 6435 9676 l 1221 9676 l + 1221 7280 l cp gs col7 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 7280 m 6435 7280 l 6435 9676 l 1221 9676 l + 1221 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 7280 m 1620 7280 l 1620 7656 l 1221 7656 l + 1221 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 7280 m 1620 7280 l 1620 7656 l 1221 7656 l + 1221 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 7280 m 2019 7280 l 2019 7656 l 1620 7656 l + 1620 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 7280 m 2019 7280 l 2019 7656 l 1620 7656 l + 1620 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 7280 m 2418 7280 l 2418 7656 l 2019 7656 l + 2019 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 7280 m 2418 7280 l 2418 7656 l 2019 7656 l + 2019 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 7280 m 2817 7280 l 2817 7656 l 2418 7656 l + 2418 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 7280 m 2817 7280 l 2817 7656 l 2418 7656 l + 2418 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 7280 m 4438 7280 l 4438 7656 l 4038 7656 l + 4038 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 7280 m 4438 7280 l 4438 7656 l 4038 7656 l + 4038 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 7280 m 4837 7280 l 4837 7656 l 4438 7656 l + 4438 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 7280 m 4837 7280 l 4837 7656 l 4438 7656 l + 4438 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 7280 m 5236 7280 l 5236 7656 l 4837 7656 l + 4837 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 7280 m 5236 7280 l 5236 7656 l 4837 7656 l + 4837 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 7280 m 5635 7280 l 5635 7656 l 5236 7656 l + 5236 7280 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 7280 m 5635 7280 l 5635 7656 l 5236 7656 l + 5236 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 7656 m 1620 7656 l 1620 8032 l 1221 8032 l + 1221 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 7656 m 1620 7656 l 1620 8032 l 1221 8032 l + 1221 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 7656 m 2019 7656 l 2019 8032 l 1620 8032 l + 1620 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 7656 m 2019 7656 l 2019 8032 l 1620 8032 l + 1620 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 7656 m 2418 7656 l 2418 8032 l 2019 8032 l + 2019 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 7656 m 2418 7656 l 2418 8032 l 2019 8032 l + 2019 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 7656 m 2817 7656 l 2817 8032 l 2418 8032 l + 2418 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 7656 m 2817 7656 l 2817 8032 l 2418 8032 l + 2418 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 7656 m 4438 7656 l 4438 8032 l 4038 8032 l + 4038 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 7656 m 4438 7656 l 4438 8032 l 4038 8032 l + 4038 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 7656 m 4837 7656 l 4837 8032 l 4438 8032 l + 4438 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 7656 m 4837 7656 l 4837 8032 l 4438 8032 l + 4438 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 7656 m 5236 7656 l 5236 8032 l 4837 8032 l + 4837 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 7656 m 5236 7656 l 5236 8032 l 4837 8032 l + 4837 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 7656 m 5635 7656 l 5635 8032 l 5236 8032 l + 5236 7656 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 7656 m 5635 7656 l 5635 8032 l 5236 8032 l + 5236 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 8924 m 1620 8924 l 1620 9300 l 1221 9300 l + 1221 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 8924 m 1620 8924 l 1620 9300 l 1221 9300 l + 1221 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 8924 m 2019 8924 l 2019 9300 l 1620 9300 l + 1620 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 8924 m 2019 8924 l 2019 9300 l 1620 9300 l + 1620 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 8924 m 2418 8924 l 2418 9300 l 2019 9300 l + 2019 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 8924 m 2418 8924 l 2418 9300 l 2019 9300 l + 2019 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 8924 m 2817 8924 l 2817 9300 l 2418 9300 l + 2418 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 8924 m 2817 8924 l 2817 9300 l 2418 9300 l + 2418 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 8924 m 4438 8924 l 4438 9300 l 4038 9300 l + 4038 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 8924 m 4438 8924 l 4438 9300 l 4038 9300 l + 4038 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 8924 m 4837 8924 l 4837 9300 l 4438 9300 l + 4438 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 8924 m 4837 8924 l 4837 9300 l 4438 9300 l + 4438 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 8924 m 5236 8924 l 5236 9300 l 4837 9300 l + 4837 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 8924 m 5236 8924 l 5236 9300 l 4837 9300 l + 4837 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 8924 m 5635 8924 l 5635 9300 l 5236 9300 l + 5236 8924 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 8924 m 5635 8924 l 5635 9300 l 5236 9300 l + 5236 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 9300 m 1620 9300 l 1620 9676 l 1221 9676 l + 1221 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 9300 m 1620 9300 l 1620 9676 l 1221 9676 l + 1221 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 9300 m 2019 9300 l 2019 9676 l 1620 9676 l + 1620 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 9300 m 2019 9300 l 2019 9676 l 1620 9676 l + 1620 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 9300 m 2418 9300 l 2418 9676 l 2019 9676 l + 2019 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 9300 m 2418 9300 l 2418 9676 l 2019 9676 l + 2019 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 9300 m 2817 9300 l 2817 9676 l 2418 9676 l + 2418 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 9300 m 2817 9300 l 2817 9676 l 2418 9676 l + 2418 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 9300 m 4438 9300 l 4438 9676 l 4038 9676 l + 4038 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 9300 m 4438 9300 l 4438 9676 l 4038 9676 l + 4038 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 9300 m 4837 9300 l 4837 9676 l 4438 9676 l + 4438 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 9300 m 4837 9300 l 4837 9676 l 4438 9676 l + 4438 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 9300 m 5236 9300 l 5236 9676 l 4837 9676 l + 4837 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 9300 m 5236 9300 l 5236 9676 l 4837 9676 l + 4837 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 9300 m 5635 9300 l 5635 9676 l 5236 9676 l + 5236 9300 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 9300 m 5635 9300 l 5635 9676 l 5236 9676 l + 5236 9300 l cp gs col32 s gr +/Helvetica-iso ff 225.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 225.00 scf sf +2064 7726 m +gs 1 -1 sc (...) col0 sh gr +% Polyline +n 2819 7658 m + 2869 7658 l gs col32 s gr +% Polyline +n 2952 7658 m + 3002 7658 l gs col32 s gr +% Polyline +n 3085 7658 m + 3135 7658 l gs col32 s gr +% Polyline +n 3219 7658 m + 3252 7658 l gs col32 s gr +% Polyline +n 2819 8033 m + 2869 8033 l gs col32 s gr +% Polyline +n 2952 8033 m + 3002 8033 l gs col32 s gr +% Polyline +n 3085 8033 m + 3135 8033 l gs col32 s gr +% Polyline +n 3219 8033 m + 3252 8033 l gs col32 s gr +% Polyline +n 2819 8025 m + 2819 8075 l gs col32 s gr +% Polyline +n 2819 8158 m + 2819 8208 l gs col32 s gr +% Polyline +n 2819 8291 m + 2819 8341 l gs col32 s gr +% Polyline +n 2419 8025 m + 2419 8075 l gs col32 s gr +% Polyline +n 2419 8158 m + 2419 8208 l gs col32 s gr +% Polyline +n 2419 8291 m + 2419 8341 l gs col32 s gr +% Polyline +n 2019 8025 m + 2019 8075 l gs col32 s gr +% Polyline +n 2019 8158 m + 2019 8208 l gs col32 s gr +% Polyline +n 2019 8291 m + 2019 8341 l gs col32 s gr +% Polyline +n 1619 8025 m + 1619 8075 l gs col32 s gr +% Polyline +n 1619 8158 m + 1619 8208 l gs col32 s gr +% Polyline +n 1619 8291 m + 1619 8341 l gs col32 s gr +% Polyline +n 4036 7658 m + 3986 7658 l gs col32 s gr +% Polyline +n 3902 7658 m + 3852 7658 l gs col32 s gr +% Polyline +n 3769 7658 m + 3719 7658 l gs col32 s gr +% Polyline +n 3636 7658 m + 3602 7658 l gs col32 s gr +% Polyline +n 4036 8033 m + 3986 8033 l gs col32 s gr +% Polyline +n 3902 8033 m + 3852 8033 l gs col32 s gr +% Polyline +n 3769 8033 m + 3719 8033 l gs col32 s gr +% Polyline +n 3636 8033 m + 3602 8033 l gs col32 s gr +% Polyline +n 4035 8025 m + 4035 8075 l gs col32 s gr +% Polyline +n 4035 8158 m + 4035 8208 l gs col32 s gr +% Polyline +n 4035 8291 m + 4035 8341 l gs col32 s gr +% Polyline +n 4435 8025 m + 4435 8075 l gs col32 s gr +% Polyline +n 4435 8158 m + 4435 8208 l gs col32 s gr +% Polyline +n 4435 8291 m + 4435 8341 l gs col32 s gr +% Polyline +n 4835 8025 m + 4835 8075 l gs col32 s gr +% Polyline +n 4835 8158 m + 4835 8208 l gs col32 s gr +% Polyline +n 4835 8291 m + 4835 8341 l gs col32 s gr +% Polyline +n 5235 8025 m + 5235 8075 l gs col32 s gr +% Polyline +n 5235 8158 m + 5235 8208 l gs col32 s gr +% Polyline +n 5235 8291 m + 5235 8341 l gs col32 s gr +% Polyline +n 4036 9300 m + 3986 9300 l gs col32 s gr +% Polyline +n 3902 9300 m + 3852 9300 l gs col32 s gr +% Polyline +n 3769 9300 m + 3719 9300 l gs col32 s gr +% Polyline +n 3636 9300 m + 3602 9300 l gs col32 s gr +% Polyline +n 4036 8925 m + 3986 8925 l gs col32 s gr +% Polyline +n 3902 8925 m + 3852 8925 l gs col32 s gr +% Polyline +n 3769 8925 m + 3719 8925 l gs col32 s gr +% Polyline +n 3636 8925 m + 3602 8925 l gs col32 s gr +% Polyline +n 4035 8933 m + 4035 8883 l gs col32 s gr +% Polyline +n 4035 8800 m + 4035 8750 l gs col32 s gr +% Polyline +n 4035 8666 m + 4035 8616 l gs col32 s gr +% Polyline +n 4435 8933 m + 4435 8883 l gs col32 s gr +% Polyline +n 4435 8800 m + 4435 8750 l gs col32 s gr +% Polyline +n 4435 8666 m + 4435 8616 l gs col32 s gr +% Polyline +n 4835 8933 m + 4835 8883 l gs col32 s gr +% Polyline +n 4835 8800 m + 4835 8750 l gs col32 s gr +% Polyline +n 4835 8666 m + 4835 8616 l gs col32 s gr +% Polyline +n 5235 8933 m + 5235 8883 l gs col32 s gr +% Polyline +n 5235 8800 m + 5235 8750 l gs col32 s gr +% Polyline +n 5235 8666 m + 5235 8616 l gs col32 s gr +% Polyline +n 2819 9300 m + 2869 9300 l gs col32 s gr +% Polyline +n 2952 9300 m + 3002 9300 l gs col32 s gr +% Polyline +n 3085 9300 m + 3135 9300 l gs col32 s gr +% Polyline +n 3219 9300 m + 3252 9300 l gs col32 s gr +% Polyline +n 2819 8925 m + 2869 8925 l gs col32 s gr +% Polyline +n 2952 8925 m + 3002 8925 l gs col32 s gr +% Polyline +n 3085 8925 m + 3135 8925 l gs col32 s gr +% Polyline +n 3219 8925 m + 3252 8925 l gs col32 s gr +% Polyline +n 2819 8933 m + 2819 8883 l gs col32 s gr +% Polyline +n 2819 8800 m + 2819 8750 l gs col32 s gr +% Polyline +n 2819 8666 m + 2819 8616 l gs col32 s gr +% Polyline +n 2419 8933 m + 2419 8883 l gs col32 s gr +% Polyline +n 2419 8800 m + 2419 8750 l gs col32 s gr +% Polyline +n 2419 8666 m + 2419 8616 l gs col32 s gr +% Polyline +n 2019 8933 m + 2019 8883 l gs col32 s gr +% Polyline +n 2019 8800 m + 2019 8750 l gs col32 s gr +% Polyline +n 2019 8666 m + 2019 8616 l gs col32 s gr +% Polyline +n 1619 8933 m + 1619 8883 l gs col32 s gr +% Polyline +n 1619 8800 m + 1619 8750 l gs col32 s gr +% Polyline +n 1619 8666 m + 1619 8616 l gs col32 s gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +2338 7001 m +gs 1 -1 sc (n1 ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +2605 7001 m +gs 1 -1 sc (+ 2-n1%2) col34 sh gr +/Helvetica-iso ff 195.00 scf sf +3500 7001 m +gs 1 -1 sc ( = 2*\(n1/2+1\)) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +681 8451 m +gs 1 -1 sc (n0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1364 7179 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +6097 7179 m +gs 1 -1 sc (n1+1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1064 7479 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +864 9479 m +gs 1 -1 sc (n0-1) col0 sh gr +% Polyline +0.000 slw +n 5636 7280 m 6035 7280 l 6035 7656 l 5636 7656 l + 5636 7280 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 5636 7280 m 6035 7280 l 6035 7656 l 5636 7656 l + 5636 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 5636 7656 m 6035 7656 l 6035 8032 l 5636 8032 l + 5636 7656 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 5636 7656 m 6035 7656 l 6035 8032 l 5636 8032 l + 5636 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 5636 8924 m 6035 8924 l 6035 9300 l 5636 9300 l + 5636 8924 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 5636 8924 m 6035 8924 l 6035 9300 l 5636 9300 l + 5636 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 5636 9300 m 6035 9300 l 6035 9676 l 5636 9676 l + 5636 9300 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 5636 9300 m 6035 9300 l 6035 9676 l 5636 9676 l + 5636 9300 l cp gs col32 s gr +% Polyline +0.000 slw +n 6036 7280 m 6435 7280 l 6435 7656 l 6036 7656 l + 6036 7280 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 6036 7280 m 6435 7280 l 6435 7656 l 6036 7656 l + 6036 7280 l cp gs col32 s gr +% Polyline +0.000 slw +n 6036 7656 m 6435 7656 l 6435 8032 l 6036 8032 l + 6036 7656 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 6036 7656 m 6435 7656 l 6435 8032 l 6036 8032 l + 6036 7656 l cp gs col32 s gr +% Polyline +0.000 slw +n 6036 8924 m 6435 8924 l 6435 9300 l 6036 9300 l + 6036 8924 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 6036 8924 m 6435 8924 l 6435 9300 l 6036 9300 l + 6036 8924 l cp gs col32 s gr +% Polyline +0.000 slw +n 6036 9300 m 6435 9300 l 6435 9676 l 6036 9676 l + 6036 9300 l cp gs col35 1.00 shd ef gr +% Polyline +7.500 slw +n 6036 9300 m 6435 9300 l 6435 9676 l 6036 9676 l + 6036 9300 l cp gs col32 s gr +% Polyline +n 5635 7283 m + 5635 9683 l gs col0 s gr +% Polyline +n 1420 7515 m + 6312 7515 l gs col0 s gr +% Polyline +0.000 slw +n 6348 7518 m 6117 7462 l + 6117 7515 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 7518 m 6117 7462 l + 6117 7515 l gs col0 s gr +% Polyline +0.000 slw +n 6348 7512 m 6117 7568 l + 6117 7515 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 7512 m 6117 7568 l + 6117 7515 l gs col0 s gr +% Polyline +n 1420 7891 m + 5863 7891 l gs col0 s gr +% Polyline +0.000 slw +n 5895 7894 m 5685 7838 l + 5685 7891 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5895 7894 m 5685 7838 l + 5685 7891 l gs col0 s gr +% Polyline +0.000 slw +n 5895 7888 m 5685 7944 l + 5685 7891 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5895 7888 m 5685 7944 l + 5685 7891 l gs col0 s gr +% Polyline +n 1420 9112 m + 5863 9112 l gs col0 s gr +% Polyline +0.000 slw +n 5895 9115 m 5685 9059 l + 5685 9112 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5895 9115 m 5685 9059 l + 5685 9112 l gs col0 s gr +% Polyline +0.000 slw +n 5895 9109 m 5685 9165 l + 5685 9112 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5895 9109 m 5685 9165 l + 5685 9112 l gs col0 s gr +% Polyline +n 1420 9488 m + 5863 9488 l gs col0 s gr +% Polyline +0.000 slw +n 5895 9491 m 5685 9435 l + 5685 9488 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5895 9491 m 5685 9435 l + 5685 9488 l gs col0 s gr +% Polyline +0.000 slw +n 5895 9485 m 5685 9541 l + 5685 9488 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5895 9485 m 5685 9541 l + 5685 9488 l gs col0 s gr +/Helvetica-iso ff 375.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 375.00 scf sf +6250 9461 m +gs 1 -1 sc 90.0 rot (\(padding\)) col0 sh gr +/Helvetica-Bold-iso ff 240.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-Bold-iso ff 240.00 scf sf +428 9283 m +gs 1 -1 sc 90.0 rot (input, in-place) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1264 7429 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1681 7429 m +gs 1 -1 sc (1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +2081 7429 m +gs 1 -1 sc (2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +2481 7429 m +gs 1 -1 sc (3) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4081 7429 m +gs 1 -1 sc (n1-4) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4897 7429 m +gs 1 -1 sc (n1-2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +5297 7429 m +gs 1 -1 sc (n1-1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4497 7429 m +gs 1 -1 sc (n1-3) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1264 7795 m +gs 1 -1 sc (n1+2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1664 7795 m +gs 1 -1 sc (n1+3) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +5681 7429 m +gs 1 -1 sc (n1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +6081 7429 m +gs 1 -1 sc (n1+1) col0 sh gr +% Polyline +0.000 slw +n 5226 5196 m 5623 5196 l 5623 5572 l 5226 5572 l + 5226 5196 l cp gs col36 1.00 shd ef gr +% Polyline +n 4827 5196 m 5226 5196 l 5226 5572 l 4827 5572 l + 4827 5196 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4835 5194 m 5631 5194 l 5631 5569 l 4835 5569 l + 4835 5194 l cp gs col38 s gr +% Polyline +0.000 slw +n 4434 5196 m 4832 5196 l 4832 5572 l 4434 5572 l + 4434 5196 l cp gs col36 1.00 shd ef gr +% Polyline +n 4035 5196 m 4434 5196 l 4434 5572 l 4035 5572 l + 4035 5196 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4044 5194 m 4840 5194 l 4840 5569 l 4044 5569 l + 4044 5194 l cp gs col38 s gr +% Polyline +0.000 slw +n 6026 5196 m 6440 5196 l 6440 5572 l 6026 5572 l + 6026 5196 l cp gs col36 1.00 shd ef gr +% Polyline +n 5627 5196 m 6026 5196 l 6026 5572 l 5627 5572 l + 5627 5196 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 5635 5194 m 6440 5194 l 6440 5569 l 5635 5569 l + 5635 5194 l cp gs col38 s gr +% Polyline +0.000 slw +n 5226 5571 m 5623 5571 l 5623 5947 l 5226 5947 l + 5226 5571 l cp gs col36 1.00 shd ef gr +% Polyline +n 4827 5571 m 5226 5571 l 5226 5947 l 4827 5947 l + 4827 5571 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4835 5569 m 5631 5569 l 5631 5944 l 4835 5944 l + 4835 5569 l cp gs col38 s gr +% Polyline +0.000 slw +n 4434 5571 m 4832 5571 l 4832 5947 l 4434 5947 l + 4434 5571 l cp gs col36 1.00 shd ef gr +% Polyline +n 4035 5571 m 4434 5571 l 4434 5947 l 4035 5947 l + 4035 5571 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4044 5569 m 4840 5569 l 4840 5944 l 4044 5944 l + 4044 5569 l cp gs col38 s gr +% Polyline +0.000 slw +n 6026 5571 m 6440 5571 l 6440 5947 l 6026 5947 l + 6026 5571 l cp gs col36 1.00 shd ef gr +% Polyline +n 5627 5571 m 6026 5571 l 6026 5947 l 5627 5947 l + 5627 5571 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 5635 5569 m 6440 5569 l 6440 5944 l 5635 5944 l + 5635 5569 l cp gs col38 s gr +% Polyline +0.000 slw +n 2409 5571 m 2807 5571 l 2807 5947 l 2409 5947 l + 2409 5571 l cp gs col36 1.00 shd ef gr +% Polyline +n 2010 5571 m 2409 5571 l 2409 5947 l 2010 5947 l + 2010 5571 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 5561 m 2815 5561 l 2815 5936 l 2019 5936 l + 2019 5561 l cp gs col38 s gr +% Polyline +0.000 slw +n 1618 5571 m 2015 5571 l 2015 5947 l 1618 5947 l + 1618 5571 l cp gs col36 1.00 shd ef gr +% Polyline +n 1219 5571 m 1618 5571 l 1618 5947 l 1219 5947 l + 1219 5571 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 1227 5561 m 2023 5561 l 2023 5939 l 1227 5939 l + 1227 5561 l cp gs col38 s gr +% Polyline +0.000 slw +n 2409 5196 m 2807 5196 l 2807 5572 l 2409 5572 l + 2409 5196 l cp gs col36 1.00 shd ef gr +% Polyline +n 2010 5196 m 2409 5196 l 2409 5572 l 2010 5572 l + 2010 5196 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 5186 m 2815 5186 l 2815 5561 l 2019 5561 l + 2019 5186 l cp gs col38 s gr +% Polyline +0.000 slw +n 1618 5196 m 2015 5196 l 2015 5572 l 1618 5572 l + 1618 5196 l cp gs col36 1.00 shd ef gr +% Polyline +n 1219 5196 m 1618 5196 l 1618 5572 l 1219 5572 l + 1219 5196 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 1227 5186 m 2023 5186 l 2023 5561 l 1227 5561 l + 1227 5186 l cp gs col38 s gr +% Polyline +0.000 slw +n 5226 3546 m 5623 3546 l 5623 3922 l 5226 3922 l + 5226 3546 l cp gs col36 1.00 shd ef gr +% Polyline +n 4827 3546 m 5226 3546 l 5226 3922 l 4827 3922 l + 4827 3546 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4835 3544 m 5631 3544 l 5631 3919 l 4835 3919 l + 4835 3544 l cp gs col32 s gr +% Polyline +0.000 slw +n 4434 3546 m 4832 3546 l 4832 3922 l 4434 3922 l + 4434 3546 l cp gs col36 1.00 shd ef gr +% Polyline +n 4035 3546 m 4434 3546 l 4434 3922 l 4035 3922 l + 4035 3546 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4044 3544 m 4840 3544 l 4840 3919 l 4044 3919 l + 4044 3544 l cp gs col38 s gr +% Polyline +0.000 slw +n 5990 3546 m 6432 3546 l 6432 3955 l 5990 3955 l + 5990 3546 l cp gs col36 1.00 shd ef gr +% Polyline +n 5627 3546 m 6026 3546 l 6026 3922 l 5627 3922 l + 5627 3546 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 5635 3544 m 6440 3544 l 6440 3919 l 5635 3919 l + 5635 3544 l cp gs col38 s gr +% Polyline +0.000 slw +n 5226 3921 m 5623 3921 l 5623 4297 l 5226 4297 l + 5226 3921 l cp gs col36 1.00 shd ef gr +% Polyline +n 4827 3921 m 5226 3921 l 5226 4297 l 4827 4297 l + 4827 3921 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4835 3919 m 5631 3919 l 5631 4294 l 4835 4294 l + 4835 3919 l cp gs col38 s gr +% Polyline +0.000 slw +n 4434 3921 m 4832 3921 l 4832 4297 l 4434 4297 l + 4434 3921 l cp gs col36 1.00 shd ef gr +% Polyline +n 4035 3921 m 4434 3921 l 4434 4297 l 4035 4297 l + 4035 3921 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 4044 3919 m 4840 3919 l 4840 4294 l 4044 4294 l + 4044 3919 l cp gs col38 s gr +% Polyline +0.000 slw +n 6026 3921 m 6432 3921 l 6432 4297 l 6026 4297 l + 6026 3921 l cp gs col36 1.00 shd ef gr +% Polyline +n 5627 3921 m 6026 3921 l 6026 4297 l 5627 4297 l + 5627 3921 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 5635 3919 m 6440 3919 l 6440 4294 l 5635 4294 l + 5635 3919 l cp gs col38 s gr +% Polyline +0.000 slw +n 2409 3921 m 2807 3921 l 2807 4297 l 2409 4297 l + 2409 3921 l cp gs col36 1.00 shd ef gr +% Polyline +n 2010 3921 m 2409 3921 l 2409 4297 l 2010 4297 l + 2010 3921 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 3919 m 2815 3919 l 2815 4294 l 2019 4294 l + 2019 3919 l cp gs col38 s gr +% Polyline +0.000 slw +n 1618 3921 m 2015 3921 l 2015 4297 l 1618 4297 l + 1618 3921 l cp gs col36 1.00 shd ef gr +% Polyline +n 1219 3921 m 1618 3921 l 1618 4297 l 1219 4297 l + 1219 3921 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 1227 3919 m 2023 3919 l 2023 4294 l 1227 4294 l + 1227 3919 l cp gs col38 s gr +% Polyline +0.000 slw +n 2409 3546 m 2815 3546 l 2815 3922 l 2409 3922 l + 2409 3546 l cp gs col36 1.00 shd ef gr +% Polyline +n 2010 3546 m 2409 3546 l 2409 3922 l 2010 3922 l + 2010 3546 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 3544 m 2815 3544 l 2815 3919 l 2019 3919 l + 2019 3544 l cp gs col38 s gr +% Polyline +0.000 slw +n 1618 3546 m 2015 3546 l 2015 3922 l 1618 3922 l + 1618 3546 l cp gs col36 1.00 shd ef gr +% Polyline +n 1219 3546 m 1618 3546 l 1618 3922 l 1219 3922 l + 1219 3546 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 1227 3544 m 2023 3544 l 2023 3919 l 1227 3919 l + 1227 3544 l cp gs col38 s gr +% Polyline +n 1221 3546 m 6440 3546 l 6440 5941 l 1221 5941 l + 1221 3546 l cp gs col32 s gr +/Helvetica-iso ff 225.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 225.00 scf sf +2064 3993 m +gs 1 -1 sc (...) col0 sh gr +% Polyline +n 2819 3915 m + 2869 3915 l gs col32 s gr +% Polyline +n 2952 3915 m + 3002 3915 l gs col32 s gr +% Polyline +n 3085 3915 m + 3135 3915 l gs col32 s gr +% Polyline +n 3219 3915 m + 3252 3915 l gs col32 s gr +% Polyline +n 2819 4290 m + 2869 4290 l gs col32 s gr +% Polyline +n 2952 4290 m + 3002 4290 l gs col32 s gr +% Polyline +n 3085 4290 m + 3135 4290 l gs col32 s gr +% Polyline +n 3219 4290 m + 3252 4290 l gs col32 s gr +% Polyline +n 2819 4282 m + 2819 4332 l gs col32 s gr +% Polyline +n 2819 4415 m + 2819 4465 l gs col32 s gr +% Polyline +n 2819 4548 m + 2819 4598 l gs col32 s gr +% Polyline +n 2019 4282 m + 2019 4332 l gs col32 s gr +% Polyline +n 2019 4415 m + 2019 4465 l gs col32 s gr +% Polyline +n 2019 4548 m + 2019 4598 l gs col32 s gr +% Polyline +n 4036 3915 m + 3986 3915 l gs col32 s gr +% Polyline +n 3902 3915 m + 3852 3915 l gs col32 s gr +% Polyline +n 3769 3915 m + 3719 3915 l gs col32 s gr +% Polyline +n 3636 3915 m + 3602 3915 l gs col32 s gr +% Polyline +n 4036 4290 m + 3986 4290 l gs col32 s gr +% Polyline +n 3902 4290 m + 3852 4290 l gs col32 s gr +% Polyline +n 3769 4290 m + 3719 4290 l gs col32 s gr +% Polyline +n 3636 4290 m + 3602 4290 l gs col32 s gr +% Polyline +n 4035 4282 m + 4035 4332 l gs col32 s gr +% Polyline +n 4035 4415 m + 4035 4465 l gs col32 s gr +% Polyline +n 4035 4548 m + 4035 4598 l gs col32 s gr +% Polyline +n 4835 4282 m + 4835 4332 l gs col32 s gr +% Polyline +n 4835 4415 m + 4835 4465 l gs col32 s gr +% Polyline +n 4835 4548 m + 4835 4598 l gs col32 s gr +% Polyline +n 4036 5565 m + 3986 5565 l gs col32 s gr +% Polyline +n 3902 5565 m + 3852 5565 l gs col32 s gr +% Polyline +n 3769 5565 m + 3719 5565 l gs col32 s gr +% Polyline +n 3636 5565 m + 3602 5565 l gs col32 s gr +% Polyline +n 4036 5190 m + 3986 5190 l gs col32 s gr +% Polyline +n 3902 5190 m + 3852 5190 l gs col32 s gr +% Polyline +n 3769 5190 m + 3719 5190 l gs col32 s gr +% Polyline +n 3636 5190 m + 3602 5190 l gs col32 s gr +% Polyline +n 4035 5198 m + 4035 5148 l gs col32 s gr +% Polyline +n 4035 5065 m + 4035 5015 l gs col32 s gr +% Polyline +n 4035 4932 m + 4035 4882 l gs col32 s gr +% Polyline +n 4835 5198 m + 4835 5148 l gs col32 s gr +% Polyline +n 4835 5065 m + 4835 5015 l gs col32 s gr +% Polyline +n 4835 4932 m + 4835 4882 l gs col32 s gr +% Polyline +n 2819 5565 m + 2869 5565 l gs col32 s gr +% Polyline +n 2952 5565 m + 3002 5565 l gs col32 s gr +% Polyline +n 3085 5565 m + 3135 5565 l gs col32 s gr +% Polyline +n 3219 5565 m + 3252 5565 l gs col32 s gr +% Polyline +n 2819 5190 m + 2869 5190 l gs col32 s gr +% Polyline +n 2952 5190 m + 3002 5190 l gs col32 s gr +% Polyline +n 3085 5190 m + 3135 5190 l gs col32 s gr +% Polyline +n 3219 5190 m + 3252 5190 l gs col32 s gr +% Polyline +n 2819 5198 m + 2819 5148 l gs col32 s gr +% Polyline +n 2819 5065 m + 2819 5015 l gs col32 s gr +% Polyline +n 2819 4932 m + 2819 4882 l gs col32 s gr +% Polyline +n 2019 5198 m + 2019 5148 l gs col32 s gr +% Polyline +n 2019 5065 m + 2019 5015 l gs col32 s gr +% Polyline +n 2019 4932 m + 2019 4882 l gs col32 s gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +3181 3267 m +gs 1 -1 sc (n1/2+1) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +681 4717 m +gs 1 -1 sc (n0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1564 3445 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +5831 3445 m +gs 1 -1 sc (n1/2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1064 3745 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +864 5745 m +gs 1 -1 sc (n0-1) col0 sh gr +% Polyline +n 5635 4282 m + 5635 4332 l gs col32 s gr +% Polyline +n 5635 4415 m + 5635 4465 l gs col32 s gr +% Polyline +n 5635 4548 m + 5635 4598 l gs col32 s gr +% Polyline +n 5635 5198 m + 5635 5148 l gs col32 s gr +% Polyline +n 5635 5065 m + 5635 5015 l gs col32 s gr +% Polyline +n 5635 4932 m + 5635 4882 l gs col32 s gr +% Polyline +n 1420 3781 m + 6312 3781 l gs col0 s gr +% Polyline +0.000 slw +n 6348 3784 m 6117 3728 l + 6117 3781 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 3784 m 6117 3728 l + 6117 3781 l gs col0 s gr +% Polyline +0.000 slw +n 6348 3778 m 6117 3834 l + 6117 3781 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 3778 m 6117 3834 l + 6117 3781 l gs col0 s gr +% Polyline +n 1420 4169 m + 6312 4169 l gs col0 s gr +% Polyline +0.000 slw +n 6348 4172 m 6117 4116 l + 6117 4169 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 4172 m 6117 4116 l + 6117 4169 l gs col0 s gr +% Polyline +0.000 slw +n 6348 4166 m 6117 4222 l + 6117 4169 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 4166 m 6117 4222 l + 6117 4169 l gs col0 s gr +% Polyline +n 1420 5390 m + 6312 5390 l gs col0 s gr +% Polyline +0.000 slw +n 6348 5393 m 6117 5337 l + 6117 5390 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 5393 m 6117 5337 l + 6117 5390 l gs col0 s gr +% Polyline +0.000 slw +n 6348 5387 m 6117 5443 l + 6117 5390 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 5387 m 6117 5443 l + 6117 5390 l gs col0 s gr +% Polyline +n 1420 5766 m + 6312 5766 l gs col0 s gr +% Polyline +0.000 slw +n 6348 5769 m 6117 5713 l + 6117 5766 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 5769 m 6117 5713 l + 6117 5766 l gs col0 s gr +% Polyline +0.000 slw +n 6348 5763 m 6117 5819 l + 6117 5766 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 6348 5763 m 6117 5819 l + 6117 5766 l gs col0 s gr +% Polyline +0.000 slw +n 1469 6215 m 1868 6215 l 1868 6591 l 1469 6591 l + 1469 6215 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1469 6215 m 1868 6215 l 1868 6591 l 1469 6591 l + 1469 6215 l cp gs col32 s gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +1981 6463 m +gs 1 -1 sc (= double) col0 sh gr +% Polyline +0.000 slw +n 4026 6217 m 4432 6217 l 4432 6593 l 4026 6593 l + 4026 6217 l cp gs col36 1.00 shd ef gr +% Polyline +n 3627 6217 m 4026 6217 l 4026 6593 l 3627 6593 l + 3627 6217 l cp gs col37 1.00 shd ef gr +% Polyline +7.500 slw +n 3635 6215 m 4440 6215 l 4440 6590 l 3635 6590 l + 3635 6215 l cp gs col38 s gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +4547 6463 m +gs 1 -1 sc (= fftw_complex) col0 sh gr +/Helvetica-Bold-iso ff 240.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-Bold-iso ff 240.00 scf sf +428 5128 m +gs 1 -1 sc 90.0 rot (output) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1264 3679 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +2081 3679 m +gs 1 -1 sc (1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4097 3679 m +gs 1 -1 sc (n1/2-2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4914 3679 m +gs 1 -1 sc (n1/2-1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1264 4062 m +gs 1 -1 sc (n1/2+1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +5697 3679 m +gs 1 -1 sc (n1/2) col0 sh gr +% Polyline +0.000 slw +n 1221 495 m 5635 495 l 5635 2890 l 1221 2890 l + 1221 495 l cp gs col7 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 495 m 5635 495 l 5635 2890 l 1221 2890 l + 1221 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 495 m 1620 495 l 1620 871 l 1221 871 l + 1221 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 495 m 1620 495 l 1620 871 l 1221 871 l + 1221 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 495 m 2019 495 l 2019 871 l 1620 871 l + 1620 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 495 m 2019 495 l 2019 871 l 1620 871 l + 1620 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 495 m 2418 495 l 2418 871 l 2019 871 l + 2019 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 495 m 2418 495 l 2418 871 l 2019 871 l + 2019 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 495 m 2817 495 l 2817 871 l 2418 871 l + 2418 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 495 m 2817 495 l 2817 871 l 2418 871 l + 2418 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 495 m 4438 495 l 4438 871 l 4038 871 l + 4038 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 495 m 4438 495 l 4438 871 l 4038 871 l + 4038 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 495 m 4837 495 l 4837 871 l 4438 871 l + 4438 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 495 m 4837 495 l 4837 871 l 4438 871 l + 4438 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 495 m 5236 495 l 5236 871 l 4837 871 l + 4837 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 495 m 5236 495 l 5236 871 l 4837 871 l + 4837 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 495 m 5635 495 l 5635 871 l 5236 871 l + 5236 495 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 495 m 5635 495 l 5635 871 l 5236 871 l + 5236 495 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 871 m 1620 871 l 1620 1247 l 1221 1247 l + 1221 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 871 m 1620 871 l 1620 1247 l 1221 1247 l + 1221 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 871 m 2019 871 l 2019 1247 l 1620 1247 l + 1620 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 871 m 2019 871 l 2019 1247 l 1620 1247 l + 1620 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 871 m 2418 871 l 2418 1247 l 2019 1247 l + 2019 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 871 m 2418 871 l 2418 1247 l 2019 1247 l + 2019 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 871 m 2817 871 l 2817 1247 l 2418 1247 l + 2418 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 871 m 2817 871 l 2817 1247 l 2418 1247 l + 2418 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 871 m 4438 871 l 4438 1247 l 4038 1247 l + 4038 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 871 m 4438 871 l 4438 1247 l 4038 1247 l + 4038 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 871 m 4837 871 l 4837 1247 l 4438 1247 l + 4438 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 871 m 4837 871 l 4837 1247 l 4438 1247 l + 4438 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 871 m 5236 871 l 5236 1247 l 4837 1247 l + 4837 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 871 m 5236 871 l 5236 1247 l 4837 1247 l + 4837 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 871 m 5635 871 l 5635 1247 l 5236 1247 l + 5236 871 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 871 m 5635 871 l 5635 1247 l 5236 1247 l + 5236 871 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 2139 m 1620 2139 l 1620 2515 l 1221 2515 l + 1221 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 2139 m 1620 2139 l 1620 2515 l 1221 2515 l + 1221 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 2139 m 2019 2139 l 2019 2515 l 1620 2515 l + 1620 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 2139 m 2019 2139 l 2019 2515 l 1620 2515 l + 1620 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 2139 m 2418 2139 l 2418 2515 l 2019 2515 l + 2019 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 2139 m 2418 2139 l 2418 2515 l 2019 2515 l + 2019 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 2139 m 2817 2139 l 2817 2515 l 2418 2515 l + 2418 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 2139 m 2817 2139 l 2817 2515 l 2418 2515 l + 2418 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 2139 m 4438 2139 l 4438 2515 l 4038 2515 l + 4038 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 2139 m 4438 2139 l 4438 2515 l 4038 2515 l + 4038 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 2139 m 4837 2139 l 4837 2515 l 4438 2515 l + 4438 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 2139 m 4837 2139 l 4837 2515 l 4438 2515 l + 4438 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 2139 m 5236 2139 l 5236 2515 l 4837 2515 l + 4837 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 2139 m 5236 2139 l 5236 2515 l 4837 2515 l + 4837 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 2139 m 5635 2139 l 5635 2515 l 5236 2515 l + 5236 2139 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 2139 m 5635 2139 l 5635 2515 l 5236 2515 l + 5236 2139 l cp gs col32 s gr +% Polyline +0.000 slw +n 1221 2515 m 1620 2515 l 1620 2890 l 1221 2890 l + 1221 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1221 2515 m 1620 2515 l 1620 2890 l 1221 2890 l + 1221 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 1620 2515 m 2019 2515 l 2019 2890 l 1620 2890 l + 1620 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 1620 2515 m 2019 2515 l 2019 2890 l 1620 2890 l + 1620 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 2019 2515 m 2418 2515 l 2418 2890 l 2019 2890 l + 2019 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2019 2515 m 2418 2515 l 2418 2890 l 2019 2890 l + 2019 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 2418 2515 m 2817 2515 l 2817 2890 l 2418 2890 l + 2418 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 2418 2515 m 2817 2515 l 2817 2890 l 2418 2890 l + 2418 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 4038 2515 m 4438 2515 l 4438 2890 l 4038 2890 l + 4038 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4038 2515 m 4438 2515 l 4438 2890 l 4038 2890 l + 4038 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 4438 2515 m 4837 2515 l 4837 2890 l 4438 2890 l + 4438 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4438 2515 m 4837 2515 l 4837 2890 l 4438 2890 l + 4438 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 4837 2515 m 5236 2515 l 5236 2890 l 4837 2890 l + 4837 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 4837 2515 m 5236 2515 l 5236 2890 l 4837 2890 l + 4837 2515 l cp gs col32 s gr +% Polyline +0.000 slw +n 5236 2515 m 5635 2515 l 5635 2890 l 5236 2890 l + 5236 2515 l cp gs col33 1.00 shd ef gr +% Polyline +7.500 slw +n 5236 2515 m 5635 2515 l 5635 2890 l 5236 2890 l + 5236 2515 l cp gs col32 s gr +% Polyline +n 1420 730 m + 5459 730 l gs col0 s gr +% Polyline +0.000 slw +n 5488 733 m 5298 677 l + 5298 730 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 733 m 5298 677 l + 5298 730 l gs col0 s gr +% Polyline +0.000 slw +n 5488 727 m 5298 783 l + 5298 730 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 727 m 5298 783 l + 5298 730 l gs col0 s gr +/Helvetica-iso ff 225.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 225.00 scf sf +2064 943 m +gs 1 -1 sc (...) col0 sh gr +% Polyline +n 2819 873 m + 2869 873 l gs col32 s gr +% Polyline +n 2952 873 m + 3002 873 l gs col32 s gr +% Polyline +n 3085 873 m + 3135 873 l gs col32 s gr +% Polyline +n 3219 873 m + 3252 873 l gs col32 s gr +% Polyline +n 2819 1248 m + 2869 1248 l gs col32 s gr +% Polyline +n 2952 1248 m + 3002 1248 l gs col32 s gr +% Polyline +n 3085 1248 m + 3135 1248 l gs col32 s gr +% Polyline +n 3219 1248 m + 3252 1248 l gs col32 s gr +% Polyline +n 2819 1240 m + 2819 1290 l gs col32 s gr +% Polyline +n 2819 1373 m + 2819 1423 l gs col32 s gr +% Polyline +n 2819 1506 m + 2819 1556 l gs col32 s gr +% Polyline +n 2419 1240 m + 2419 1290 l gs col32 s gr +% Polyline +n 2419 1373 m + 2419 1423 l gs col32 s gr +% Polyline +n 2419 1506 m + 2419 1556 l gs col32 s gr +% Polyline +n 2019 1240 m + 2019 1290 l gs col32 s gr +% Polyline +n 2019 1373 m + 2019 1423 l gs col32 s gr +% Polyline +n 2019 1506 m + 2019 1556 l gs col32 s gr +% Polyline +n 1619 1240 m + 1619 1290 l gs col32 s gr +% Polyline +n 1619 1373 m + 1619 1423 l gs col32 s gr +% Polyline +n 1619 1506 m + 1619 1556 l gs col32 s gr +% Polyline +n 4036 873 m + 3986 873 l gs col32 s gr +% Polyline +n 3902 873 m + 3852 873 l gs col32 s gr +% Polyline +n 3769 873 m + 3719 873 l gs col32 s gr +% Polyline +n 3636 873 m + 3602 873 l gs col32 s gr +% Polyline +n 4036 1248 m + 3986 1248 l gs col32 s gr +% Polyline +n 3902 1248 m + 3852 1248 l gs col32 s gr +% Polyline +n 3769 1248 m + 3719 1248 l gs col32 s gr +% Polyline +n 3636 1248 m + 3602 1248 l gs col32 s gr +% Polyline +n 4035 1240 m + 4035 1290 l gs col32 s gr +% Polyline +n 4035 1373 m + 4035 1423 l gs col32 s gr +% Polyline +n 4035 1506 m + 4035 1556 l gs col32 s gr +% Polyline +n 4435 1240 m + 4435 1290 l gs col32 s gr +% Polyline +n 4435 1373 m + 4435 1423 l gs col32 s gr +% Polyline +n 4435 1506 m + 4435 1556 l gs col32 s gr +% Polyline +n 4835 1240 m + 4835 1290 l gs col32 s gr +% Polyline +n 4835 1373 m + 4835 1423 l gs col32 s gr +% Polyline +n 4835 1506 m + 4835 1556 l gs col32 s gr +% Polyline +n 5235 1240 m + 5235 1290 l gs col32 s gr +% Polyline +n 5235 1373 m + 5235 1423 l gs col32 s gr +% Polyline +n 5235 1506 m + 5235 1556 l gs col32 s gr +% Polyline +n 4036 2515 m + 3986 2515 l gs col32 s gr +% Polyline +n 3902 2515 m + 3852 2515 l gs col32 s gr +% Polyline +n 3769 2515 m + 3719 2515 l gs col32 s gr +% Polyline +n 3636 2515 m + 3602 2515 l gs col32 s gr +% Polyline +n 4036 2140 m + 3986 2140 l gs col32 s gr +% Polyline +n 3902 2140 m + 3852 2140 l gs col32 s gr +% Polyline +n 3769 2140 m + 3719 2140 l gs col32 s gr +% Polyline +n 3636 2140 m + 3602 2140 l gs col32 s gr +% Polyline +n 4035 2148 m + 4035 2098 l gs col32 s gr +% Polyline +n 4035 2015 m + 4035 1965 l gs col32 s gr +% Polyline +n 4035 1881 m + 4035 1831 l gs col32 s gr +% Polyline +n 4435 2148 m + 4435 2098 l gs col32 s gr +% Polyline +n 4435 2015 m + 4435 1965 l gs col32 s gr +% Polyline +n 4435 1881 m + 4435 1831 l gs col32 s gr +% Polyline +n 4835 2148 m + 4835 2098 l gs col32 s gr +% Polyline +n 4835 2015 m + 4835 1965 l gs col32 s gr +% Polyline +n 4835 1881 m + 4835 1831 l gs col32 s gr +% Polyline +n 5235 2148 m + 5235 2098 l gs col32 s gr +% Polyline +n 5235 2015 m + 5235 1965 l gs col32 s gr +% Polyline +n 5235 1881 m + 5235 1831 l gs col32 s gr +% Polyline +n 2819 2515 m + 2869 2515 l gs col32 s gr +% Polyline +n 2952 2515 m + 3002 2515 l gs col32 s gr +% Polyline +n 3085 2515 m + 3135 2515 l gs col32 s gr +% Polyline +n 3219 2515 m + 3252 2515 l gs col32 s gr +% Polyline +n 2819 2140 m + 2869 2140 l gs col32 s gr +% Polyline +n 2952 2140 m + 3002 2140 l gs col32 s gr +% Polyline +n 3085 2140 m + 3135 2140 l gs col32 s gr +% Polyline +n 3219 2140 m + 3252 2140 l gs col32 s gr +% Polyline +n 2819 2148 m + 2819 2098 l gs col32 s gr +% Polyline +n 2819 2015 m + 2819 1965 l gs col32 s gr +% Polyline +n 2819 1881 m + 2819 1831 l gs col32 s gr +% Polyline +n 2419 2148 m + 2419 2098 l gs col32 s gr +% Polyline +n 2419 2015 m + 2419 1965 l gs col32 s gr +% Polyline +n 2419 1881 m + 2419 1831 l gs col32 s gr +% Polyline +n 2019 2148 m + 2019 2098 l gs col32 s gr +% Polyline +n 2019 2015 m + 2019 1965 l gs col32 s gr +% Polyline +n 2019 1881 m + 2019 1831 l gs col32 s gr +% Polyline +n 1619 2148 m + 1619 2098 l gs col32 s gr +% Polyline +n 1619 2015 m + 1619 1965 l gs col32 s gr +% Polyline +n 1619 1881 m + 1619 1831 l gs col32 s gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +3381 217 m +gs 1 -1 sc (n1) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 195.00 scf sf +681 1667 m +gs 1 -1 sc (n0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1364 395 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +5281 395 m +gs 1 -1 sc (n1-1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1064 695 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +864 2695 m +gs 1 -1 sc (n0-1) col0 sh gr +% Polyline +n 1420 1106 m + 5459 1106 l gs col0 s gr +% Polyline +0.000 slw +n 5488 1109 m 5298 1053 l + 5298 1106 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 1109 m 5298 1053 l + 5298 1106 l gs col0 s gr +% Polyline +0.000 slw +n 5488 1103 m 5298 1159 l + 5298 1106 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 1103 m 5298 1159 l + 5298 1106 l gs col0 s gr +% Polyline +n 1420 2327 m + 5459 2327 l gs col0 s gr +% Polyline +0.000 slw +n 5488 2330 m 5298 2274 l + 5298 2327 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 2330 m 5298 2274 l + 5298 2327 l gs col0 s gr +% Polyline +0.000 slw +n 5488 2324 m 5298 2380 l + 5298 2327 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 2324 m 5298 2380 l + 5298 2327 l gs col0 s gr +% Polyline +n 1420 2703 m + 5459 2703 l gs col0 s gr +% Polyline +0.000 slw +n 5488 2706 m 5298 2650 l + 5298 2703 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 2706 m 5298 2650 l + 5298 2703 l gs col0 s gr +% Polyline +0.000 slw +n 5488 2700 m 5298 2755 l + 5298 2703 l gs 0.00 setgray ef gr +% Polyline +7.500 slw +n 5488 2700 m 5298 2755 l + 5298 2703 l gs col0 s gr +/Helvetica-Bold-iso ff 240.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-Bold-iso ff 240.00 scf sf +428 2734 m +gs 1 -1 sc 90.0 rot (input, out-of-place) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1264 629 m +gs 1 -1 sc (0) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1681 629 m +gs 1 -1 sc (1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +2081 629 m +gs 1 -1 sc (2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +2481 629 m +gs 1 -1 sc (3) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4081 629 m +gs 1 -1 sc (n1-4) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4897 629 m +gs 1 -1 sc (n1-2) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +5297 629 m +gs 1 -1 sc (n1-1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +4497 629 m +gs 1 -1 sc (n1-3) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +74 89 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1264 1012 m +gs 1 -1 sc (n1) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1425 4800 m +gs 1 -1 sc ( ) col0 sh gr +/Helvetica-iso ff 150.00 scf sf +1664 1012 m +gs 1 -1 sc (n1+1) col0 sh gr +% Polyline +n 273 3662 m + 273 3039 l gs col0 s gr +% Polyline +n 382 3920 m + 156 3662 l gs col0 s gr +% Polyline +n 273 3662 m + 148 3662 l gs col0 s gr +% Polyline +n 487 3662 m + 487 3039 l gs col0 s gr +% Polyline +n 378 3920 m + 604 3662 l gs col0 s gr +% Polyline +n 487 3662 m + 612 3662 l gs col0 s gr +% Polyline +n 273 6130 m + 273 6753 l gs col0 s gr +% Polyline +n 382 5872 m + 156 6130 l gs col0 s gr +% Polyline +n 273 6130 m + 148 6130 l gs col0 s gr +% Polyline +n 487 6129 m + 487 6753 l gs col0 s gr +% Polyline +n 378 5872 m + 604 6129 l gs col0 s gr +% Polyline +n 487 6129 m + 612 6129 l gs col0 s gr +% here ends figure; +pagefooter +showpage +%%Trailer +%EOF diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.fig b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.fig new file mode 100644 index 000000000..8a0338761 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.fig @@ -0,0 +1,1148 @@ +#FIG 3.2 +Portrait +Flush left +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #797d79 +0 33 #efebef +0 34 #e73020 +0 35 #f78e86 +0 36 #6996c7 +0 37 #86aad7 +0 38 #dfdb00 +6 75 75 6450 9750 +2 1 0 0 7 7 998 0 20 4.000 0 0 0 0 0 5 + 1221 7280 6435 7280 6435 9676 1221 9676 1221 7280 +2 1 0 1 32 32 997 0 -1 4.000 0 0 0 0 0 5 + 1221 7280 6435 7280 6435 9676 1221 9676 1221 7280 +2 1 0 0 33 33 996 0 20 4.000 0 0 0 0 0 5 + 1221 7280 1620 7280 1620 7656 1221 7656 1221 7280 +2 1 0 1 32 32 995 0 -1 4.000 0 0 0 0 0 5 + 1221 7280 1620 7280 1620 7656 1221 7656 1221 7280 +2 1 0 0 33 33 994 0 20 4.000 0 0 0 0 0 5 + 1620 7280 2019 7280 2019 7656 1620 7656 1620 7280 +2 1 0 1 32 32 993 0 -1 4.000 0 0 0 0 0 5 + 1620 7280 2019 7280 2019 7656 1620 7656 1620 7280 +2 1 0 0 33 33 992 0 20 4.000 0 0 0 0 0 5 + 2019 7280 2418 7280 2418 7656 2019 7656 2019 7280 +2 1 0 1 32 32 991 0 -1 4.000 0 0 0 0 0 5 + 2019 7280 2418 7280 2418 7656 2019 7656 2019 7280 +2 1 0 0 33 33 990 0 20 4.000 0 0 0 0 0 5 + 2418 7280 2817 7280 2817 7656 2418 7656 2418 7280 +2 1 0 1 32 32 989 0 -1 4.000 0 0 0 0 0 5 + 2418 7280 2817 7280 2817 7656 2418 7656 2418 7280 +2 1 0 0 33 33 988 0 20 4.000 0 0 0 0 0 5 + 4038 7280 4438 7280 4438 7656 4038 7656 4038 7280 +2 1 0 1 32 32 987 0 -1 4.000 0 0 0 0 0 5 + 4038 7280 4438 7280 4438 7656 4038 7656 4038 7280 +2 1 0 0 33 33 986 0 20 4.000 0 0 0 0 0 5 + 4438 7280 4837 7280 4837 7656 4438 7656 4438 7280 +2 1 0 1 32 32 985 0 -1 4.000 0 0 0 0 0 5 + 4438 7280 4837 7280 4837 7656 4438 7656 4438 7280 +2 1 0 0 33 33 984 0 20 4.000 0 0 0 0 0 5 + 4837 7280 5236 7280 5236 7656 4837 7656 4837 7280 +2 1 0 1 32 32 983 0 -1 4.000 0 0 0 0 0 5 + 4837 7280 5236 7280 5236 7656 4837 7656 4837 7280 +2 1 0 0 33 33 982 0 20 4.000 0 0 0 0 0 5 + 5236 7280 5635 7280 5635 7656 5236 7656 5236 7280 +2 1 0 1 32 32 981 0 -1 4.000 0 0 0 0 0 5 + 5236 7280 5635 7280 5635 7656 5236 7656 5236 7280 +2 1 0 0 33 33 980 0 20 4.000 0 0 0 0 0 5 + 1221 7656 1620 7656 1620 8032 1221 8032 1221 7656 +2 1 0 1 32 32 979 0 -1 4.000 0 0 0 0 0 5 + 1221 7656 1620 7656 1620 8032 1221 8032 1221 7656 +2 1 0 0 33 33 978 0 20 4.000 0 0 0 0 0 5 + 1620 7656 2019 7656 2019 8032 1620 8032 1620 7656 +2 1 0 1 32 32 977 0 -1 4.000 0 0 0 0 0 5 + 1620 7656 2019 7656 2019 8032 1620 8032 1620 7656 +2 1 0 0 33 33 976 0 20 4.000 0 0 0 0 0 5 + 2019 7656 2418 7656 2418 8032 2019 8032 2019 7656 +2 1 0 1 32 32 975 0 -1 4.000 0 0 0 0 0 5 + 2019 7656 2418 7656 2418 8032 2019 8032 2019 7656 +2 1 0 0 33 33 974 0 20 4.000 0 0 0 0 0 5 + 2418 7656 2817 7656 2817 8032 2418 8032 2418 7656 +2 1 0 1 32 32 973 0 -1 4.000 0 0 0 0 0 5 + 2418 7656 2817 7656 2817 8032 2418 8032 2418 7656 +2 1 0 0 33 33 972 0 20 4.000 0 0 0 0 0 5 + 4038 7656 4438 7656 4438 8032 4038 8032 4038 7656 +2 1 0 1 32 32 971 0 -1 4.000 0 0 0 0 0 5 + 4038 7656 4438 7656 4438 8032 4038 8032 4038 7656 +2 1 0 0 33 33 970 0 20 4.000 0 0 0 0 0 5 + 4438 7656 4837 7656 4837 8032 4438 8032 4438 7656 +2 1 0 1 32 32 969 0 -1 4.000 0 0 0 0 0 5 + 4438 7656 4837 7656 4837 8032 4438 8032 4438 7656 +2 1 0 0 33 33 968 0 20 4.000 0 0 0 0 0 5 + 4837 7656 5236 7656 5236 8032 4837 8032 4837 7656 +2 1 0 1 32 32 967 0 -1 4.000 0 0 0 0 0 5 + 4837 7656 5236 7656 5236 8032 4837 8032 4837 7656 +2 1 0 0 33 33 966 0 20 4.000 0 0 0 0 0 5 + 5236 7656 5635 7656 5635 8032 5236 8032 5236 7656 +2 1 0 1 32 32 965 0 -1 4.000 0 0 0 0 0 5 + 5236 7656 5635 7656 5635 8032 5236 8032 5236 7656 +2 1 0 0 33 33 964 0 20 4.000 0 0 0 0 0 5 + 1221 8924 1620 8924 1620 9300 1221 9300 1221 8924 +2 1 0 1 32 32 963 0 -1 4.000 0 0 0 0 0 5 + 1221 8924 1620 8924 1620 9300 1221 9300 1221 8924 +2 1 0 0 33 33 962 0 20 4.000 0 0 0 0 0 5 + 1620 8924 2019 8924 2019 9300 1620 9300 1620 8924 +2 1 0 1 32 32 961 0 -1 4.000 0 0 0 0 0 5 + 1620 8924 2019 8924 2019 9300 1620 9300 1620 8924 +2 1 0 0 33 33 960 0 20 4.000 0 0 0 0 0 5 + 2019 8924 2418 8924 2418 9300 2019 9300 2019 8924 +2 1 0 1 32 32 959 0 -1 4.000 0 0 0 0 0 5 + 2019 8924 2418 8924 2418 9300 2019 9300 2019 8924 +2 1 0 0 33 33 958 0 20 4.000 0 0 0 0 0 5 + 2418 8924 2817 8924 2817 9300 2418 9300 2418 8924 +2 1 0 1 32 32 957 0 -1 4.000 0 0 0 0 0 5 + 2418 8924 2817 8924 2817 9300 2418 9300 2418 8924 +2 1 0 0 33 33 956 0 20 4.000 0 0 0 0 0 5 + 4038 8924 4438 8924 4438 9300 4038 9300 4038 8924 +2 1 0 1 32 32 955 0 -1 4.000 0 0 0 0 0 5 + 4038 8924 4438 8924 4438 9300 4038 9300 4038 8924 +2 1 0 0 33 33 954 0 20 4.000 0 0 0 0 0 5 + 4438 8924 4837 8924 4837 9300 4438 9300 4438 8924 +2 1 0 1 32 32 953 0 -1 4.000 0 0 0 0 0 5 + 4438 8924 4837 8924 4837 9300 4438 9300 4438 8924 +2 1 0 0 33 33 952 0 20 4.000 0 0 0 0 0 5 + 4837 8924 5236 8924 5236 9300 4837 9300 4837 8924 +2 1 0 1 32 32 951 0 -1 4.000 0 0 0 0 0 5 + 4837 8924 5236 8924 5236 9300 4837 9300 4837 8924 +2 1 0 0 33 33 950 0 20 4.000 0 0 0 0 0 5 + 5236 8924 5635 8924 5635 9300 5236 9300 5236 8924 +2 1 0 1 32 32 949 0 -1 4.000 0 0 0 0 0 5 + 5236 8924 5635 8924 5635 9300 5236 9300 5236 8924 +2 1 0 0 33 33 948 0 20 4.000 0 0 0 0 0 5 + 1221 9300 1620 9300 1620 9676 1221 9676 1221 9300 +2 1 0 1 32 32 947 0 -1 4.000 0 0 0 0 0 5 + 1221 9300 1620 9300 1620 9676 1221 9676 1221 9300 +2 1 0 0 33 33 946 0 20 4.000 0 0 0 0 0 5 + 1620 9300 2019 9300 2019 9676 1620 9676 1620 9300 +2 1 0 1 32 32 945 0 -1 4.000 0 0 0 0 0 5 + 1620 9300 2019 9300 2019 9676 1620 9676 1620 9300 +2 1 0 0 33 33 944 0 20 4.000 0 0 0 0 0 5 + 2019 9300 2418 9300 2418 9676 2019 9676 2019 9300 +2 1 0 1 32 32 943 0 -1 4.000 0 0 0 0 0 5 + 2019 9300 2418 9300 2418 9676 2019 9676 2019 9300 +2 1 0 0 33 33 942 0 20 4.000 0 0 0 0 0 5 + 2418 9300 2817 9300 2817 9676 2418 9676 2418 9300 +2 1 0 1 32 32 941 0 -1 4.000 0 0 0 0 0 5 + 2418 9300 2817 9300 2817 9676 2418 9676 2418 9300 +2 1 0 0 33 33 940 0 20 4.000 0 0 0 0 0 5 + 4038 9300 4438 9300 4438 9676 4038 9676 4038 9300 +2 1 0 1 32 32 939 0 -1 4.000 0 0 0 0 0 5 + 4038 9300 4438 9300 4438 9676 4038 9676 4038 9300 +2 1 0 0 33 33 938 0 20 4.000 0 0 0 0 0 5 + 4438 9300 4837 9300 4837 9676 4438 9676 4438 9300 +2 1 0 1 32 32 937 0 -1 4.000 0 0 0 0 0 5 + 4438 9300 4837 9300 4837 9676 4438 9676 4438 9300 +2 1 0 0 33 33 936 0 20 4.000 0 0 0 0 0 5 + 4837 9300 5236 9300 5236 9676 4837 9676 4837 9300 +2 1 0 1 32 32 935 0 -1 4.000 0 0 0 0 0 5 + 4837 9300 5236 9300 5236 9676 4837 9676 4837 9300 +2 1 0 0 33 33 934 0 20 4.000 0 0 0 0 0 5 + 5236 9300 5635 9300 5635 9676 5236 9676 5236 9300 +2 1 0 1 32 32 933 0 -1 4.000 0 0 0 0 0 5 + 5236 9300 5635 9300 5635 9676 5236 9676 5236 9300 +2 1 0 1 32 32 930 0 -1 4.000 0 0 0 0 0 2 + 2819 7658 2869 7658 +2 1 0 1 32 32 929 0 -1 4.000 0 0 0 0 0 2 + 2952 7658 3002 7658 +2 1 0 1 32 32 928 0 -1 4.000 0 0 0 0 0 2 + 3085 7658 3135 7658 +2 1 0 1 32 32 927 0 -1 4.000 0 0 0 0 0 2 + 3219 7658 3252 7658 +2 1 0 1 32 32 926 0 -1 4.000 0 0 0 0 0 2 + 2819 8033 2869 8033 +2 1 0 1 32 32 925 0 -1 4.000 0 0 0 0 0 2 + 2952 8033 3002 8033 +2 1 0 1 32 32 924 0 -1 4.000 0 0 0 0 0 2 + 3085 8033 3135 8033 +2 1 0 1 32 32 923 0 -1 4.000 0 0 0 0 0 2 + 3219 8033 3252 8033 +2 1 0 1 32 32 922 0 -1 4.000 0 0 0 0 0 2 + 2819 8025 2819 8075 +2 1 0 1 32 32 921 0 -1 4.000 0 0 0 0 0 2 + 2819 8158 2819 8208 +2 1 0 1 32 32 920 0 -1 4.000 0 0 0 0 0 2 + 2819 8291 2819 8341 +2 1 0 1 32 32 919 0 -1 4.000 0 0 0 0 0 2 + 2419 8025 2419 8075 +2 1 0 1 32 32 918 0 -1 4.000 0 0 0 0 0 2 + 2419 8158 2419 8208 +2 1 0 1 32 32 917 0 -1 4.000 0 0 0 0 0 2 + 2419 8291 2419 8341 +2 1 0 1 32 32 916 0 -1 4.000 0 0 0 0 0 2 + 2019 8025 2019 8075 +2 1 0 1 32 32 915 0 -1 4.000 0 0 0 0 0 2 + 2019 8158 2019 8208 +2 1 0 1 32 32 914 0 -1 4.000 0 0 0 0 0 2 + 2019 8291 2019 8341 +2 1 0 1 32 32 913 0 -1 4.000 0 0 0 0 0 2 + 1619 8025 1619 8075 +2 1 0 1 32 32 912 0 -1 4.000 0 0 0 0 0 2 + 1619 8158 1619 8208 +2 1 0 1 32 32 911 0 -1 4.000 0 0 0 0 0 2 + 1619 8291 1619 8341 +2 1 0 1 32 32 910 0 -1 4.000 0 0 0 0 0 2 + 4036 7658 3986 7658 +2 1 0 1 32 32 909 0 -1 4.000 0 0 0 0 0 2 + 3902 7658 3852 7658 +2 1 0 1 32 32 908 0 -1 4.000 0 0 0 0 0 2 + 3769 7658 3719 7658 +2 1 0 1 32 32 907 0 -1 4.000 0 0 0 0 0 2 + 3636 7658 3602 7658 +2 1 0 1 32 32 906 0 -1 4.000 0 0 0 0 0 2 + 4036 8033 3986 8033 +2 1 0 1 32 32 905 0 -1 4.000 0 0 0 0 0 2 + 3902 8033 3852 8033 +2 1 0 1 32 32 904 0 -1 4.000 0 0 0 0 0 2 + 3769 8033 3719 8033 +2 1 0 1 32 32 903 0 -1 4.000 0 0 0 0 0 2 + 3636 8033 3602 8033 +2 1 0 1 32 32 902 0 -1 4.000 0 0 0 0 0 2 + 4035 8025 4035 8075 +2 1 0 1 32 32 901 0 -1 4.000 0 0 0 0 0 2 + 4035 8158 4035 8208 +2 1 0 1 32 32 900 0 -1 4.000 0 0 0 0 0 2 + 4035 8291 4035 8341 +2 1 0 1 32 32 899 0 -1 4.000 0 0 0 0 0 2 + 4435 8025 4435 8075 +2 1 0 1 32 32 898 0 -1 4.000 0 0 0 0 0 2 + 4435 8158 4435 8208 +2 1 0 1 32 32 897 0 -1 4.000 0 0 0 0 0 2 + 4435 8291 4435 8341 +2 1 0 1 32 32 896 0 -1 4.000 0 0 0 0 0 2 + 4835 8025 4835 8075 +2 1 0 1 32 32 895 0 -1 4.000 0 0 0 0 0 2 + 4835 8158 4835 8208 +2 1 0 1 32 32 894 0 -1 4.000 0 0 0 0 0 2 + 4835 8291 4835 8341 +2 1 0 1 32 32 893 0 -1 4.000 0 0 0 0 0 2 + 5235 8025 5235 8075 +2 1 0 1 32 32 892 0 -1 4.000 0 0 0 0 0 2 + 5235 8158 5235 8208 +2 1 0 1 32 32 891 0 -1 4.000 0 0 0 0 0 2 + 5235 8291 5235 8341 +2 1 0 1 32 32 890 0 -1 4.000 0 0 0 0 0 2 + 4036 9300 3986 9300 +2 1 0 1 32 32 889 0 -1 4.000 0 0 0 0 0 2 + 3902 9300 3852 9300 +2 1 0 1 32 32 888 0 -1 4.000 0 0 0 0 0 2 + 3769 9300 3719 9300 +2 1 0 1 32 32 887 0 -1 4.000 0 0 0 0 0 2 + 3636 9300 3602 9300 +2 1 0 1 32 32 886 0 -1 4.000 0 0 0 0 0 2 + 4036 8925 3986 8925 +2 1 0 1 32 32 885 0 -1 4.000 0 0 0 0 0 2 + 3902 8925 3852 8925 +2 1 0 1 32 32 884 0 -1 4.000 0 0 0 0 0 2 + 3769 8925 3719 8925 +2 1 0 1 32 32 883 0 -1 4.000 0 0 0 0 0 2 + 3636 8925 3602 8925 +2 1 0 1 32 32 882 0 -1 4.000 0 0 0 0 0 2 + 4035 8933 4035 8883 +2 1 0 1 32 32 881 0 -1 4.000 0 0 0 0 0 2 + 4035 8800 4035 8750 +2 1 0 1 32 32 880 0 -1 4.000 0 0 0 0 0 2 + 4035 8666 4035 8616 +2 1 0 1 32 32 879 0 -1 4.000 0 0 0 0 0 2 + 4435 8933 4435 8883 +2 1 0 1 32 32 878 0 -1 4.000 0 0 0 0 0 2 + 4435 8800 4435 8750 +2 1 0 1 32 32 877 0 -1 4.000 0 0 0 0 0 2 + 4435 8666 4435 8616 +2 1 0 1 32 32 876 0 -1 4.000 0 0 0 0 0 2 + 4835 8933 4835 8883 +2 1 0 1 32 32 875 0 -1 4.000 0 0 0 0 0 2 + 4835 8800 4835 8750 +2 1 0 1 32 32 874 0 -1 4.000 0 0 0 0 0 2 + 4835 8666 4835 8616 +2 1 0 1 32 32 873 0 -1 4.000 0 0 0 0 0 2 + 5235 8933 5235 8883 +2 1 0 1 32 32 872 0 -1 4.000 0 0 0 0 0 2 + 5235 8800 5235 8750 +2 1 0 1 32 32 871 0 -1 4.000 0 0 0 0 0 2 + 5235 8666 5235 8616 +2 1 0 1 32 32 870 0 -1 4.000 0 0 0 0 0 2 + 2819 9300 2869 9300 +2 1 0 1 32 32 869 0 -1 4.000 0 0 0 0 0 2 + 2952 9300 3002 9300 +2 1 0 1 32 32 868 0 -1 4.000 0 0 0 0 0 2 + 3085 9300 3135 9300 +2 1 0 1 32 32 867 0 -1 4.000 0 0 0 0 0 2 + 3219 9300 3252 9300 +2 1 0 1 32 32 866 0 -1 4.000 0 0 0 0 0 2 + 2819 8925 2869 8925 +2 1 0 1 32 32 865 0 -1 4.000 0 0 0 0 0 2 + 2952 8925 3002 8925 +2 1 0 1 32 32 864 0 -1 4.000 0 0 0 0 0 2 + 3085 8925 3135 8925 +2 1 0 1 32 32 863 0 -1 4.000 0 0 0 0 0 2 + 3219 8925 3252 8925 +2 1 0 1 32 32 862 0 -1 4.000 0 0 0 0 0 2 + 2819 8933 2819 8883 +2 1 0 1 32 32 861 0 -1 4.000 0 0 0 0 0 2 + 2819 8800 2819 8750 +2 1 0 1 32 32 860 0 -1 4.000 0 0 0 0 0 2 + 2819 8666 2819 8616 +2 1 0 1 32 32 859 0 -1 4.000 0 0 0 0 0 2 + 2419 8933 2419 8883 +2 1 0 1 32 32 858 0 -1 4.000 0 0 0 0 0 2 + 2419 8800 2419 8750 +2 1 0 1 32 32 857 0 -1 4.000 0 0 0 0 0 2 + 2419 8666 2419 8616 +2 1 0 1 32 32 856 0 -1 4.000 0 0 0 0 0 2 + 2019 8933 2019 8883 +2 1 0 1 32 32 855 0 -1 4.000 0 0 0 0 0 2 + 2019 8800 2019 8750 +2 1 0 1 32 32 854 0 -1 4.000 0 0 0 0 0 2 + 2019 8666 2019 8616 +2 1 0 1 32 32 853 0 -1 4.000 0 0 0 0 0 2 + 1619 8933 1619 8883 +2 1 0 1 32 32 852 0 -1 4.000 0 0 0 0 0 2 + 1619 8800 1619 8750 +2 1 0 1 32 32 851 0 -1 4.000 0 0 0 0 0 2 + 1619 8666 1619 8616 +2 1 0 0 35 35 836 0 20 4.000 0 0 0 0 0 5 + 5636 7280 6035 7280 6035 7656 5636 7656 5636 7280 +2 1 0 1 32 32 835 0 -1 4.000 0 0 0 0 0 5 + 5636 7280 6035 7280 6035 7656 5636 7656 5636 7280 +2 1 0 0 35 35 834 0 20 4.000 0 0 0 0 0 5 + 5636 7656 6035 7656 6035 8032 5636 8032 5636 7656 +2 1 0 1 32 32 833 0 -1 4.000 0 0 0 0 0 5 + 5636 7656 6035 7656 6035 8032 5636 8032 5636 7656 +2 1 0 0 35 35 832 0 20 4.000 0 0 0 0 0 5 + 5636 8924 6035 8924 6035 9300 5636 9300 5636 8924 +2 1 0 1 32 32 831 0 -1 4.000 0 0 0 0 0 5 + 5636 8924 6035 8924 6035 9300 5636 9300 5636 8924 +2 1 0 0 35 35 830 0 20 4.000 0 0 0 0 0 5 + 5636 9300 6035 9300 6035 9676 5636 9676 5636 9300 +2 1 0 1 32 32 829 0 -1 4.000 0 0 0 0 0 5 + 5636 9300 6035 9300 6035 9676 5636 9676 5636 9300 +2 1 0 0 35 35 828 0 20 4.000 0 0 0 0 0 5 + 6036 7280 6435 7280 6435 7656 6036 7656 6036 7280 +2 1 0 1 32 32 827 0 -1 4.000 0 0 0 0 0 5 + 6036 7280 6435 7280 6435 7656 6036 7656 6036 7280 +2 1 0 0 35 35 826 0 20 4.000 0 0 0 0 0 5 + 6036 7656 6435 7656 6435 8032 6036 8032 6036 7656 +2 1 0 1 32 32 825 0 -1 4.000 0 0 0 0 0 5 + 6036 7656 6435 7656 6435 8032 6036 8032 6036 7656 +2 1 0 0 35 35 824 0 20 4.000 0 0 0 0 0 5 + 6036 8924 6435 8924 6435 9300 6036 9300 6036 8924 +2 1 0 1 32 32 823 0 -1 4.000 0 0 0 0 0 5 + 6036 8924 6435 8924 6435 9300 6036 9300 6036 8924 +2 1 0 0 35 35 822 0 20 4.000 0 0 0 0 0 5 + 6036 9300 6435 9300 6435 9676 6036 9676 6036 9300 +2 1 0 1 32 32 821 0 -1 4.000 0 0 0 0 0 5 + 6036 9300 6435 9300 6435 9676 6036 9676 6036 9300 +2 1 0 1 0 0 820 0 -1 4.000 0 0 0 0 0 2 + 5635 7283 5635 9683 +2 1 0 1 0 0 819 0 -1 4.000 0 0 0 0 0 2 + 1420 7515 6312 7515 +2 1 0 0 0 0 818 0 20 4.000 0 0 0 0 0 3 + 6348 7518 6117 7462 6117 7515 +2 1 0 1 0 0 817 0 -1 4.000 0 0 0 0 0 3 + 6348 7518 6117 7462 6117 7515 +2 1 0 0 0 0 816 0 20 4.000 0 0 0 0 0 3 + 6348 7512 6117 7568 6117 7515 +2 1 0 1 0 0 815 0 -1 4.000 0 0 0 0 0 3 + 6348 7512 6117 7568 6117 7515 +2 1 0 1 0 0 814 0 -1 4.000 0 0 0 0 0 2 + 1420 7891 5863 7891 +2 1 0 0 0 0 813 0 20 4.000 0 0 0 0 0 3 + 5895 7894 5685 7838 5685 7891 +2 1 0 1 0 0 812 0 -1 4.000 0 0 0 0 0 3 + 5895 7894 5685 7838 5685 7891 +2 1 0 0 0 0 811 0 20 4.000 0 0 0 0 0 3 + 5895 7888 5685 7944 5685 7891 +2 1 0 1 0 0 810 0 -1 4.000 0 0 0 0 0 3 + 5895 7888 5685 7944 5685 7891 +2 1 0 1 0 0 809 0 -1 4.000 0 0 0 0 0 2 + 1420 9112 5863 9112 +2 1 0 0 0 0 808 0 20 4.000 0 0 0 0 0 3 + 5895 9115 5685 9059 5685 9112 +2 1 0 1 0 0 807 0 -1 4.000 0 0 0 0 0 3 + 5895 9115 5685 9059 5685 9112 +2 1 0 0 0 0 806 0 20 4.000 0 0 0 0 0 3 + 5895 9109 5685 9165 5685 9112 +2 1 0 1 0 0 805 0 -1 4.000 0 0 0 0 0 3 + 5895 9109 5685 9165 5685 9112 +2 1 0 1 0 0 804 0 -1 4.000 0 0 0 0 0 2 + 1420 9488 5863 9488 +2 1 0 0 0 0 803 0 20 4.000 0 0 0 0 0 3 + 5895 9491 5685 9435 5685 9488 +2 1 0 1 0 0 802 0 -1 4.000 0 0 0 0 0 3 + 5895 9491 5685 9435 5685 9488 +2 1 0 0 0 0 801 0 20 4.000 0 0 0 0 0 3 + 5895 9485 5685 9541 5685 9488 +2 1 0 1 0 0 800 0 -1 4.000 0 0 0 0 0 3 + 5895 9485 5685 9541 5685 9488 +2 1 0 0 36 36 771 0 20 4.000 0 0 0 0 0 5 + 5226 5196 5623 5196 5623 5572 5226 5572 5226 5196 +2 1 0 0 37 37 770 0 20 4.000 0 0 0 0 0 5 + 4827 5196 5226 5196 5226 5572 4827 5572 4827 5196 +2 1 0 1 38 38 769 0 -1 4.000 0 0 0 0 0 5 + 4835 5194 5631 5194 5631 5569 4835 5569 4835 5194 +2 1 0 0 36 36 768 0 20 4.000 0 0 0 0 0 5 + 4434 5196 4832 5196 4832 5572 4434 5572 4434 5196 +2 1 0 0 37 37 767 0 20 4.000 0 0 0 0 0 5 + 4035 5196 4434 5196 4434 5572 4035 5572 4035 5196 +2 1 0 1 38 38 766 0 -1 4.000 0 0 0 0 0 5 + 4044 5194 4840 5194 4840 5569 4044 5569 4044 5194 +2 1 0 0 36 36 765 0 20 4.000 0 0 0 0 0 5 + 6026 5196 6440 5196 6440 5572 6026 5572 6026 5196 +2 1 0 0 37 37 764 0 20 4.000 0 0 0 0 0 5 + 5627 5196 6026 5196 6026 5572 5627 5572 5627 5196 +2 1 0 1 38 38 763 0 -1 4.000 0 0 0 0 0 5 + 5635 5194 6440 5194 6440 5569 5635 5569 5635 5194 +2 1 0 0 36 36 762 0 20 4.000 0 0 0 0 0 5 + 5226 5571 5623 5571 5623 5947 5226 5947 5226 5571 +2 1 0 0 37 37 761 0 20 4.000 0 0 0 0 0 5 + 4827 5571 5226 5571 5226 5947 4827 5947 4827 5571 +2 1 0 1 38 38 760 0 -1 4.000 0 0 0 0 0 5 + 4835 5569 5631 5569 5631 5944 4835 5944 4835 5569 +2 1 0 0 36 36 759 0 20 4.000 0 0 0 0 0 5 + 4434 5571 4832 5571 4832 5947 4434 5947 4434 5571 +2 1 0 0 37 37 758 0 20 4.000 0 0 0 0 0 5 + 4035 5571 4434 5571 4434 5947 4035 5947 4035 5571 +2 1 0 1 38 38 757 0 -1 4.000 0 0 0 0 0 5 + 4044 5569 4840 5569 4840 5944 4044 5944 4044 5569 +2 1 0 0 36 36 756 0 20 4.000 0 0 0 0 0 5 + 6026 5571 6440 5571 6440 5947 6026 5947 6026 5571 +2 1 0 0 37 37 755 0 20 4.000 0 0 0 0 0 5 + 5627 5571 6026 5571 6026 5947 5627 5947 5627 5571 +2 1 0 1 38 38 754 0 -1 4.000 0 0 0 0 0 5 + 5635 5569 6440 5569 6440 5944 5635 5944 5635 5569 +2 1 0 0 36 36 753 0 20 4.000 0 0 0 0 0 5 + 2409 5571 2807 5571 2807 5947 2409 5947 2409 5571 +2 1 0 0 37 37 752 0 20 4.000 0 0 0 0 0 5 + 2010 5571 2409 5571 2409 5947 2010 5947 2010 5571 +2 1 0 1 38 38 751 0 -1 4.000 0 0 0 0 0 5 + 2019 5561 2815 5561 2815 5936 2019 5936 2019 5561 +2 1 0 0 36 36 750 0 20 4.000 0 0 0 0 0 5 + 1618 5571 2015 5571 2015 5947 1618 5947 1618 5571 +2 1 0 0 37 37 749 0 20 4.000 0 0 0 0 0 5 + 1219 5571 1618 5571 1618 5947 1219 5947 1219 5571 +2 1 0 1 38 38 748 0 -1 4.000 0 0 0 0 0 5 + 1227 5561 2023 5561 2023 5939 1227 5939 1227 5561 +2 1 0 0 36 36 747 0 20 4.000 0 0 0 0 0 5 + 2409 5196 2807 5196 2807 5572 2409 5572 2409 5196 +2 1 0 0 37 37 746 0 20 4.000 0 0 0 0 0 5 + 2010 5196 2409 5196 2409 5572 2010 5572 2010 5196 +2 1 0 1 38 38 745 0 -1 4.000 0 0 0 0 0 5 + 2019 5186 2815 5186 2815 5561 2019 5561 2019 5186 +2 1 0 0 36 36 744 0 20 4.000 0 0 0 0 0 5 + 1618 5196 2015 5196 2015 5572 1618 5572 1618 5196 +2 1 0 0 37 37 743 0 20 4.000 0 0 0 0 0 5 + 1219 5196 1618 5196 1618 5572 1219 5572 1219 5196 +2 1 0 1 38 38 742 0 -1 4.000 0 0 0 0 0 5 + 1227 5186 2023 5186 2023 5561 1227 5561 1227 5186 +2 1 0 0 36 36 741 0 20 4.000 0 0 0 0 0 5 + 5226 3546 5623 3546 5623 3922 5226 3922 5226 3546 +2 1 0 0 37 37 740 0 20 4.000 0 0 0 0 0 5 + 4827 3546 5226 3546 5226 3922 4827 3922 4827 3546 +2 1 0 1 32 32 739 0 -1 4.000 0 0 0 0 0 5 + 4835 3544 5631 3544 5631 3919 4835 3919 4835 3544 +2 1 0 0 36 36 738 0 20 4.000 0 0 0 0 0 5 + 4434 3546 4832 3546 4832 3922 4434 3922 4434 3546 +2 1 0 0 37 37 737 0 20 4.000 0 0 0 0 0 5 + 4035 3546 4434 3546 4434 3922 4035 3922 4035 3546 +2 1 0 1 38 38 736 0 -1 4.000 0 0 0 0 0 5 + 4044 3544 4840 3544 4840 3919 4044 3919 4044 3544 +2 1 0 0 36 36 735 0 20 4.000 0 0 0 0 0 5 + 5990 3546 6432 3546 6432 3955 5990 3955 5990 3546 +2 1 0 0 37 37 734 0 20 4.000 0 0 0 0 0 5 + 5627 3546 6026 3546 6026 3922 5627 3922 5627 3546 +2 1 0 1 38 38 733 0 -1 4.000 0 0 0 0 0 5 + 5635 3544 6440 3544 6440 3919 5635 3919 5635 3544 +2 1 0 0 36 36 732 0 20 4.000 0 0 0 0 0 5 + 5226 3921 5623 3921 5623 4297 5226 4297 5226 3921 +2 1 0 0 37 37 731 0 20 4.000 0 0 0 0 0 5 + 4827 3921 5226 3921 5226 4297 4827 4297 4827 3921 +2 1 0 1 38 38 730 0 -1 4.000 0 0 0 0 0 5 + 4835 3919 5631 3919 5631 4294 4835 4294 4835 3919 +2 1 0 0 36 36 729 0 20 4.000 0 0 0 0 0 5 + 4434 3921 4832 3921 4832 4297 4434 4297 4434 3921 +2 1 0 0 37 37 728 0 20 4.000 0 0 0 0 0 5 + 4035 3921 4434 3921 4434 4297 4035 4297 4035 3921 +2 1 0 1 38 38 727 0 -1 4.000 0 0 0 0 0 5 + 4044 3919 4840 3919 4840 4294 4044 4294 4044 3919 +2 1 0 0 36 36 726 0 20 4.000 0 0 0 0 0 5 + 6026 3921 6432 3921 6432 4297 6026 4297 6026 3921 +2 1 0 0 37 37 725 0 20 4.000 0 0 0 0 0 5 + 5627 3921 6026 3921 6026 4297 5627 4297 5627 3921 +2 1 0 1 38 38 724 0 -1 4.000 0 0 0 0 0 5 + 5635 3919 6440 3919 6440 4294 5635 4294 5635 3919 +2 1 0 0 36 36 723 0 20 4.000 0 0 0 0 0 5 + 2409 3921 2807 3921 2807 4297 2409 4297 2409 3921 +2 1 0 0 37 37 722 0 20 4.000 0 0 0 0 0 5 + 2010 3921 2409 3921 2409 4297 2010 4297 2010 3921 +2 1 0 1 38 38 721 0 -1 4.000 0 0 0 0 0 5 + 2019 3919 2815 3919 2815 4294 2019 4294 2019 3919 +2 1 0 0 36 36 720 0 20 4.000 0 0 0 0 0 5 + 1618 3921 2015 3921 2015 4297 1618 4297 1618 3921 +2 1 0 0 37 37 719 0 20 4.000 0 0 0 0 0 5 + 1219 3921 1618 3921 1618 4297 1219 4297 1219 3921 +2 1 0 1 38 38 718 0 -1 4.000 0 0 0 0 0 5 + 1227 3919 2023 3919 2023 4294 1227 4294 1227 3919 +2 1 0 0 36 36 717 0 20 4.000 0 0 0 0 0 5 + 2409 3546 2815 3546 2815 3922 2409 3922 2409 3546 +2 1 0 0 37 37 716 0 20 4.000 0 0 0 0 0 5 + 2010 3546 2409 3546 2409 3922 2010 3922 2010 3546 +2 1 0 1 38 38 715 0 -1 4.000 0 0 0 0 0 5 + 2019 3544 2815 3544 2815 3919 2019 3919 2019 3544 +2 1 0 0 36 36 714 0 20 4.000 0 0 0 0 0 5 + 1618 3546 2015 3546 2015 3922 1618 3922 1618 3546 +2 1 0 0 37 37 713 0 20 4.000 0 0 0 0 0 5 + 1219 3546 1618 3546 1618 3922 1219 3922 1219 3546 +2 1 0 1 38 38 712 0 -1 4.000 0 0 0 0 0 5 + 1227 3544 2023 3544 2023 3919 1227 3919 1227 3544 +2 1 0 1 32 32 711 0 -1 4.000 0 0 0 0 0 5 + 1221 3546 6440 3546 6440 5941 1221 5941 1221 3546 +2 1 0 1 32 32 708 0 -1 4.000 0 0 0 0 0 2 + 2819 3915 2869 3915 +2 1 0 1 32 32 707 0 -1 4.000 0 0 0 0 0 2 + 2952 3915 3002 3915 +2 1 0 1 32 32 706 0 -1 4.000 0 0 0 0 0 2 + 3085 3915 3135 3915 +2 1 0 1 32 32 705 0 -1 4.000 0 0 0 0 0 2 + 3219 3915 3252 3915 +2 1 0 1 32 32 704 0 -1 4.000 0 0 0 0 0 2 + 2819 4290 2869 4290 +2 1 0 1 32 32 703 0 -1 4.000 0 0 0 0 0 2 + 2952 4290 3002 4290 +2 1 0 1 32 32 702 0 -1 4.000 0 0 0 0 0 2 + 3085 4290 3135 4290 +2 1 0 1 32 32 701 0 -1 4.000 0 0 0 0 0 2 + 3219 4290 3252 4290 +2 1 0 1 32 32 700 0 -1 4.000 0 0 0 0 0 2 + 2819 4282 2819 4332 +2 1 0 1 32 32 699 0 -1 4.000 0 0 0 0 0 2 + 2819 4415 2819 4465 +2 1 0 1 32 32 698 0 -1 4.000 0 0 0 0 0 2 + 2819 4548 2819 4598 +2 1 0 1 32 32 697 0 -1 4.000 0 0 0 0 0 2 + 2019 4282 2019 4332 +2 1 0 1 32 32 696 0 -1 4.000 0 0 0 0 0 2 + 2019 4415 2019 4465 +2 1 0 1 32 32 695 0 -1 4.000 0 0 0 0 0 2 + 2019 4548 2019 4598 +2 1 0 1 32 32 694 0 -1 4.000 0 0 0 0 0 2 + 4036 3915 3986 3915 +2 1 0 1 32 32 693 0 -1 4.000 0 0 0 0 0 2 + 3902 3915 3852 3915 +2 1 0 1 32 32 692 0 -1 4.000 0 0 0 0 0 2 + 3769 3915 3719 3915 +2 1 0 1 32 32 691 0 -1 4.000 0 0 0 0 0 2 + 3636 3915 3602 3915 +2 1 0 1 32 32 690 0 -1 4.000 0 0 0 0 0 2 + 4036 4290 3986 4290 +2 1 0 1 32 32 689 0 -1 4.000 0 0 0 0 0 2 + 3902 4290 3852 4290 +2 1 0 1 32 32 688 0 -1 4.000 0 0 0 0 0 2 + 3769 4290 3719 4290 +2 1 0 1 32 32 687 0 -1 4.000 0 0 0 0 0 2 + 3636 4290 3602 4290 +2 1 0 1 32 32 686 0 -1 4.000 0 0 0 0 0 2 + 4035 4282 4035 4332 +2 1 0 1 32 32 685 0 -1 4.000 0 0 0 0 0 2 + 4035 4415 4035 4465 +2 1 0 1 32 32 684 0 -1 4.000 0 0 0 0 0 2 + 4035 4548 4035 4598 +2 1 0 1 32 32 683 0 -1 4.000 0 0 0 0 0 2 + 4835 4282 4835 4332 +2 1 0 1 32 32 682 0 -1 4.000 0 0 0 0 0 2 + 4835 4415 4835 4465 +2 1 0 1 32 32 681 0 -1 4.000 0 0 0 0 0 2 + 4835 4548 4835 4598 +2 1 0 1 32 32 680 0 -1 4.000 0 0 0 0 0 2 + 4036 5565 3986 5565 +2 1 0 1 32 32 679 0 -1 4.000 0 0 0 0 0 2 + 3902 5565 3852 5565 +2 1 0 1 32 32 678 0 -1 4.000 0 0 0 0 0 2 + 3769 5565 3719 5565 +2 1 0 1 32 32 677 0 -1 4.000 0 0 0 0 0 2 + 3636 5565 3602 5565 +2 1 0 1 32 32 676 0 -1 4.000 0 0 0 0 0 2 + 4036 5190 3986 5190 +2 1 0 1 32 32 675 0 -1 4.000 0 0 0 0 0 2 + 3902 5190 3852 5190 +2 1 0 1 32 32 674 0 -1 4.000 0 0 0 0 0 2 + 3769 5190 3719 5190 +2 1 0 1 32 32 673 0 -1 4.000 0 0 0 0 0 2 + 3636 5190 3602 5190 +2 1 0 1 32 32 672 0 -1 4.000 0 0 0 0 0 2 + 4035 5198 4035 5148 +2 1 0 1 32 32 671 0 -1 4.000 0 0 0 0 0 2 + 4035 5065 4035 5015 +2 1 0 1 32 32 670 0 -1 4.000 0 0 0 0 0 2 + 4035 4932 4035 4882 +2 1 0 1 32 32 669 0 -1 4.000 0 0 0 0 0 2 + 4835 5198 4835 5148 +2 1 0 1 32 32 668 0 -1 4.000 0 0 0 0 0 2 + 4835 5065 4835 5015 +2 1 0 1 32 32 667 0 -1 4.000 0 0 0 0 0 2 + 4835 4932 4835 4882 +2 1 0 1 32 32 666 0 -1 4.000 0 0 0 0 0 2 + 2819 5565 2869 5565 +2 1 0 1 32 32 665 0 -1 4.000 0 0 0 0 0 2 + 2952 5565 3002 5565 +2 1 0 1 32 32 664 0 -1 4.000 0 0 0 0 0 2 + 3085 5565 3135 5565 +2 1 0 1 32 32 663 0 -1 4.000 0 0 0 0 0 2 + 3219 5565 3252 5565 +2 1 0 1 32 32 662 0 -1 4.000 0 0 0 0 0 2 + 2819 5190 2869 5190 +2 1 0 1 32 32 661 0 -1 4.000 0 0 0 0 0 2 + 2952 5190 3002 5190 +2 1 0 1 32 32 660 0 -1 4.000 0 0 0 0 0 2 + 3085 5190 3135 5190 +2 1 0 1 32 32 659 0 -1 4.000 0 0 0 0 0 2 + 3219 5190 3252 5190 +2 1 0 1 32 32 658 0 -1 4.000 0 0 0 0 0 2 + 2819 5198 2819 5148 +2 1 0 1 32 32 657 0 -1 4.000 0 0 0 0 0 2 + 2819 5065 2819 5015 +2 1 0 1 32 32 656 0 -1 4.000 0 0 0 0 0 2 + 2819 4932 2819 4882 +2 1 0 1 32 32 655 0 -1 4.000 0 0 0 0 0 2 + 2019 5198 2019 5148 +2 1 0 1 32 32 654 0 -1 4.000 0 0 0 0 0 2 + 2019 5065 2019 5015 +2 1 0 1 32 32 653 0 -1 4.000 0 0 0 0 0 2 + 2019 4932 2019 4882 +2 1 0 1 32 32 640 0 -1 4.000 0 0 0 0 0 2 + 5635 4282 5635 4332 +2 1 0 1 32 32 639 0 -1 4.000 0 0 0 0 0 2 + 5635 4415 5635 4465 +2 1 0 1 32 32 638 0 -1 4.000 0 0 0 0 0 2 + 5635 4548 5635 4598 +2 1 0 1 32 32 637 0 -1 4.000 0 0 0 0 0 2 + 5635 5198 5635 5148 +2 1 0 1 32 32 636 0 -1 4.000 0 0 0 0 0 2 + 5635 5065 5635 5015 +2 1 0 1 32 32 635 0 -1 4.000 0 0 0 0 0 2 + 5635 4932 5635 4882 +2 1 0 1 0 0 634 0 -1 4.000 0 0 0 0 0 2 + 1420 3781 6312 3781 +2 1 0 0 0 0 633 0 20 4.000 0 0 0 0 0 3 + 6348 3784 6117 3728 6117 3781 +2 1 0 1 0 0 632 0 -1 4.000 0 0 0 0 0 3 + 6348 3784 6117 3728 6117 3781 +2 1 0 0 0 0 631 0 20 4.000 0 0 0 0 0 3 + 6348 3778 6117 3834 6117 3781 +2 1 0 1 0 0 630 0 -1 4.000 0 0 0 0 0 3 + 6348 3778 6117 3834 6117 3781 +2 1 0 1 0 0 629 0 -1 4.000 0 0 0 0 0 2 + 1420 4169 6312 4169 +2 1 0 0 0 0 628 0 20 4.000 0 0 0 0 0 3 + 6348 4172 6117 4116 6117 4169 +2 1 0 1 0 0 627 0 -1 4.000 0 0 0 0 0 3 + 6348 4172 6117 4116 6117 4169 +2 1 0 0 0 0 626 0 20 4.000 0 0 0 0 0 3 + 6348 4166 6117 4222 6117 4169 +2 1 0 1 0 0 625 0 -1 4.000 0 0 0 0 0 3 + 6348 4166 6117 4222 6117 4169 +2 1 0 1 0 0 624 0 -1 4.000 0 0 0 0 0 2 + 1420 5390 6312 5390 +2 1 0 0 0 0 623 0 20 4.000 0 0 0 0 0 3 + 6348 5393 6117 5337 6117 5390 +2 1 0 1 0 0 622 0 -1 4.000 0 0 0 0 0 3 + 6348 5393 6117 5337 6117 5390 +2 1 0 0 0 0 621 0 20 4.000 0 0 0 0 0 3 + 6348 5387 6117 5443 6117 5390 +2 1 0 1 0 0 620 0 -1 4.000 0 0 0 0 0 3 + 6348 5387 6117 5443 6117 5390 +2 1 0 1 0 0 619 0 -1 4.000 0 0 0 0 0 2 + 1420 5766 6312 5766 +2 1 0 0 0 0 618 0 20 4.000 0 0 0 0 0 3 + 6348 5769 6117 5713 6117 5766 +2 1 0 1 0 0 617 0 -1 4.000 0 0 0 0 0 3 + 6348 5769 6117 5713 6117 5766 +2 1 0 0 0 0 616 0 20 4.000 0 0 0 0 0 3 + 6348 5763 6117 5819 6117 5766 +2 1 0 1 0 0 615 0 -1 4.000 0 0 0 0 0 3 + 6348 5763 6117 5819 6117 5766 +2 1 0 0 33 33 614 0 20 4.000 0 0 0 0 0 5 + 1469 6215 1868 6215 1868 6591 1469 6591 1469 6215 +2 1 0 1 32 32 613 0 -1 4.000 0 0 0 0 0 5 + 1469 6215 1868 6215 1868 6591 1469 6591 1469 6215 +2 1 0 0 36 36 610 0 20 4.000 0 0 0 0 0 5 + 4026 6217 4432 6217 4432 6593 4026 6593 4026 6217 +2 1 0 0 37 37 609 0 20 4.000 0 0 0 0 0 5 + 3627 6217 4026 6217 4026 6593 3627 6593 3627 6217 +2 1 0 1 38 38 608 0 -1 4.000 0 0 0 0 0 5 + 3635 6215 4440 6215 4440 6590 3635 6590 3635 6215 +2 1 0 0 7 7 591 0 20 4.000 0 0 0 0 0 5 + 1221 495 5635 495 5635 2890 1221 2890 1221 495 +2 1 0 1 32 32 590 0 -1 4.000 0 0 0 0 0 5 + 1221 495 5635 495 5635 2890 1221 2890 1221 495 +2 1 0 0 33 33 589 0 20 4.000 0 0 0 0 0 5 + 1221 495 1620 495 1620 871 1221 871 1221 495 +2 1 0 1 32 32 588 0 -1 4.000 0 0 0 0 0 5 + 1221 495 1620 495 1620 871 1221 871 1221 495 +2 1 0 0 33 33 587 0 20 4.000 0 0 0 0 0 5 + 1620 495 2019 495 2019 871 1620 871 1620 495 +2 1 0 1 32 32 586 0 -1 4.000 0 0 0 0 0 5 + 1620 495 2019 495 2019 871 1620 871 1620 495 +2 1 0 0 33 33 585 0 20 4.000 0 0 0 0 0 5 + 2019 495 2418 495 2418 871 2019 871 2019 495 +2 1 0 1 32 32 584 0 -1 4.000 0 0 0 0 0 5 + 2019 495 2418 495 2418 871 2019 871 2019 495 +2 1 0 0 33 33 583 0 20 4.000 0 0 0 0 0 5 + 2418 495 2817 495 2817 871 2418 871 2418 495 +2 1 0 1 32 32 582 0 -1 4.000 0 0 0 0 0 5 + 2418 495 2817 495 2817 871 2418 871 2418 495 +2 1 0 0 33 33 581 0 20 4.000 0 0 0 0 0 5 + 4038 495 4438 495 4438 871 4038 871 4038 495 +2 1 0 1 32 32 580 0 -1 4.000 0 0 0 0 0 5 + 4038 495 4438 495 4438 871 4038 871 4038 495 +2 1 0 0 33 33 579 0 20 4.000 0 0 0 0 0 5 + 4438 495 4837 495 4837 871 4438 871 4438 495 +2 1 0 1 32 32 578 0 -1 4.000 0 0 0 0 0 5 + 4438 495 4837 495 4837 871 4438 871 4438 495 +2 1 0 0 33 33 577 0 20 4.000 0 0 0 0 0 5 + 4837 495 5236 495 5236 871 4837 871 4837 495 +2 1 0 1 32 32 576 0 -1 4.000 0 0 0 0 0 5 + 4837 495 5236 495 5236 871 4837 871 4837 495 +2 1 0 0 33 33 575 0 20 4.000 0 0 0 0 0 5 + 5236 495 5635 495 5635 871 5236 871 5236 495 +2 1 0 1 32 32 574 0 -1 4.000 0 0 0 0 0 5 + 5236 495 5635 495 5635 871 5236 871 5236 495 +2 1 0 0 33 33 573 0 20 4.000 0 0 0 0 0 5 + 1221 871 1620 871 1620 1247 1221 1247 1221 871 +2 1 0 1 32 32 572 0 -1 4.000 0 0 0 0 0 5 + 1221 871 1620 871 1620 1247 1221 1247 1221 871 +2 1 0 0 33 33 571 0 20 4.000 0 0 0 0 0 5 + 1620 871 2019 871 2019 1247 1620 1247 1620 871 +2 1 0 1 32 32 570 0 -1 4.000 0 0 0 0 0 5 + 1620 871 2019 871 2019 1247 1620 1247 1620 871 +2 1 0 0 33 33 569 0 20 4.000 0 0 0 0 0 5 + 2019 871 2418 871 2418 1247 2019 1247 2019 871 +2 1 0 1 32 32 568 0 -1 4.000 0 0 0 0 0 5 + 2019 871 2418 871 2418 1247 2019 1247 2019 871 +2 1 0 0 33 33 567 0 20 4.000 0 0 0 0 0 5 + 2418 871 2817 871 2817 1247 2418 1247 2418 871 +2 1 0 1 32 32 566 0 -1 4.000 0 0 0 0 0 5 + 2418 871 2817 871 2817 1247 2418 1247 2418 871 +2 1 0 0 33 33 565 0 20 4.000 0 0 0 0 0 5 + 4038 871 4438 871 4438 1247 4038 1247 4038 871 +2 1 0 1 32 32 564 0 -1 4.000 0 0 0 0 0 5 + 4038 871 4438 871 4438 1247 4038 1247 4038 871 +2 1 0 0 33 33 563 0 20 4.000 0 0 0 0 0 5 + 4438 871 4837 871 4837 1247 4438 1247 4438 871 +2 1 0 1 32 32 562 0 -1 4.000 0 0 0 0 0 5 + 4438 871 4837 871 4837 1247 4438 1247 4438 871 +2 1 0 0 33 33 561 0 20 4.000 0 0 0 0 0 5 + 4837 871 5236 871 5236 1247 4837 1247 4837 871 +2 1 0 1 32 32 560 0 -1 4.000 0 0 0 0 0 5 + 4837 871 5236 871 5236 1247 4837 1247 4837 871 +2 1 0 0 33 33 559 0 20 4.000 0 0 0 0 0 5 + 5236 871 5635 871 5635 1247 5236 1247 5236 871 +2 1 0 1 32 32 558 0 -1 4.000 0 0 0 0 0 5 + 5236 871 5635 871 5635 1247 5236 1247 5236 871 +2 1 0 0 33 33 557 0 20 4.000 0 0 0 0 0 5 + 1221 2139 1620 2139 1620 2515 1221 2515 1221 2139 +2 1 0 1 32 32 556 0 -1 4.000 0 0 0 0 0 5 + 1221 2139 1620 2139 1620 2515 1221 2515 1221 2139 +2 1 0 0 33 33 555 0 20 4.000 0 0 0 0 0 5 + 1620 2139 2019 2139 2019 2515 1620 2515 1620 2139 +2 1 0 1 32 32 554 0 -1 4.000 0 0 0 0 0 5 + 1620 2139 2019 2139 2019 2515 1620 2515 1620 2139 +2 1 0 0 33 33 553 0 20 4.000 0 0 0 0 0 5 + 2019 2139 2418 2139 2418 2515 2019 2515 2019 2139 +2 1 0 1 32 32 552 0 -1 4.000 0 0 0 0 0 5 + 2019 2139 2418 2139 2418 2515 2019 2515 2019 2139 +2 1 0 0 33 33 551 0 20 4.000 0 0 0 0 0 5 + 2418 2139 2817 2139 2817 2515 2418 2515 2418 2139 +2 1 0 1 32 32 550 0 -1 4.000 0 0 0 0 0 5 + 2418 2139 2817 2139 2817 2515 2418 2515 2418 2139 +2 1 0 0 33 33 549 0 20 4.000 0 0 0 0 0 5 + 4038 2139 4438 2139 4438 2515 4038 2515 4038 2139 +2 1 0 1 32 32 548 0 -1 4.000 0 0 0 0 0 5 + 4038 2139 4438 2139 4438 2515 4038 2515 4038 2139 +2 1 0 0 33 33 547 0 20 4.000 0 0 0 0 0 5 + 4438 2139 4837 2139 4837 2515 4438 2515 4438 2139 +2 1 0 1 32 32 546 0 -1 4.000 0 0 0 0 0 5 + 4438 2139 4837 2139 4837 2515 4438 2515 4438 2139 +2 1 0 0 33 33 545 0 20 4.000 0 0 0 0 0 5 + 4837 2139 5236 2139 5236 2515 4837 2515 4837 2139 +2 1 0 1 32 32 544 0 -1 4.000 0 0 0 0 0 5 + 4837 2139 5236 2139 5236 2515 4837 2515 4837 2139 +2 1 0 0 33 33 543 0 20 4.000 0 0 0 0 0 5 + 5236 2139 5635 2139 5635 2515 5236 2515 5236 2139 +2 1 0 1 32 32 542 0 -1 4.000 0 0 0 0 0 5 + 5236 2139 5635 2139 5635 2515 5236 2515 5236 2139 +2 1 0 0 33 33 541 0 20 4.000 0 0 0 0 0 5 + 1221 2515 1620 2515 1620 2890 1221 2890 1221 2515 +2 1 0 1 32 32 540 0 -1 4.000 0 0 0 0 0 5 + 1221 2515 1620 2515 1620 2890 1221 2890 1221 2515 +2 1 0 0 33 33 539 0 20 4.000 0 0 0 0 0 5 + 1620 2515 2019 2515 2019 2890 1620 2890 1620 2515 +2 1 0 1 32 32 538 0 -1 4.000 0 0 0 0 0 5 + 1620 2515 2019 2515 2019 2890 1620 2890 1620 2515 +2 1 0 0 33 33 537 0 20 4.000 0 0 0 0 0 5 + 2019 2515 2418 2515 2418 2890 2019 2890 2019 2515 +2 1 0 1 32 32 536 0 -1 4.000 0 0 0 0 0 5 + 2019 2515 2418 2515 2418 2890 2019 2890 2019 2515 +2 1 0 0 33 33 535 0 20 4.000 0 0 0 0 0 5 + 2418 2515 2817 2515 2817 2890 2418 2890 2418 2515 +2 1 0 1 32 32 534 0 -1 4.000 0 0 0 0 0 5 + 2418 2515 2817 2515 2817 2890 2418 2890 2418 2515 +2 1 0 0 33 33 533 0 20 4.000 0 0 0 0 0 5 + 4038 2515 4438 2515 4438 2890 4038 2890 4038 2515 +2 1 0 1 32 32 532 0 -1 4.000 0 0 0 0 0 5 + 4038 2515 4438 2515 4438 2890 4038 2890 4038 2515 +2 1 0 0 33 33 531 0 20 4.000 0 0 0 0 0 5 + 4438 2515 4837 2515 4837 2890 4438 2890 4438 2515 +2 1 0 1 32 32 530 0 -1 4.000 0 0 0 0 0 5 + 4438 2515 4837 2515 4837 2890 4438 2890 4438 2515 +2 1 0 0 33 33 529 0 20 4.000 0 0 0 0 0 5 + 4837 2515 5236 2515 5236 2890 4837 2890 4837 2515 +2 1 0 1 32 32 528 0 -1 4.000 0 0 0 0 0 5 + 4837 2515 5236 2515 5236 2890 4837 2890 4837 2515 +2 1 0 0 33 33 527 0 20 4.000 0 0 0 0 0 5 + 5236 2515 5635 2515 5635 2890 5236 2890 5236 2515 +2 1 0 1 32 32 526 0 -1 4.000 0 0 0 0 0 5 + 5236 2515 5635 2515 5635 2890 5236 2890 5236 2515 +2 1 0 1 0 0 525 0 -1 4.000 0 0 0 0 0 2 + 1420 730 5459 730 +2 1 0 0 0 0 524 0 20 4.000 0 0 0 0 0 3 + 5488 733 5298 677 5298 730 +2 1 0 1 0 0 523 0 -1 4.000 0 0 0 0 0 3 + 5488 733 5298 677 5298 730 +2 1 0 0 0 0 522 0 20 4.000 0 0 0 0 0 3 + 5488 727 5298 783 5298 730 +2 1 0 1 0 0 521 0 -1 4.000 0 0 0 0 0 3 + 5488 727 5298 783 5298 730 +2 1 0 1 32 32 518 0 -1 4.000 0 0 0 0 0 2 + 2819 873 2869 873 +2 1 0 1 32 32 517 0 -1 4.000 0 0 0 0 0 2 + 2952 873 3002 873 +2 1 0 1 32 32 516 0 -1 4.000 0 0 0 0 0 2 + 3085 873 3135 873 +2 1 0 1 32 32 515 0 -1 4.000 0 0 0 0 0 2 + 3219 873 3252 873 +2 1 0 1 32 32 514 0 -1 4.000 0 0 0 0 0 2 + 2819 1248 2869 1248 +2 1 0 1 32 32 513 0 -1 4.000 0 0 0 0 0 2 + 2952 1248 3002 1248 +2 1 0 1 32 32 512 0 -1 4.000 0 0 0 0 0 2 + 3085 1248 3135 1248 +2 1 0 1 32 32 511 0 -1 4.000 0 0 0 0 0 2 + 3219 1248 3252 1248 +2 1 0 1 32 32 510 0 -1 4.000 0 0 0 0 0 2 + 2819 1240 2819 1290 +2 1 0 1 32 32 509 0 -1 4.000 0 0 0 0 0 2 + 2819 1373 2819 1423 +2 1 0 1 32 32 508 0 -1 4.000 0 0 0 0 0 2 + 2819 1506 2819 1556 +2 1 0 1 32 32 507 0 -1 4.000 0 0 0 0 0 2 + 2419 1240 2419 1290 +2 1 0 1 32 32 506 0 -1 4.000 0 0 0 0 0 2 + 2419 1373 2419 1423 +2 1 0 1 32 32 505 0 -1 4.000 0 0 0 0 0 2 + 2419 1506 2419 1556 +2 1 0 1 32 32 504 0 -1 4.000 0 0 0 0 0 2 + 2019 1240 2019 1290 +2 1 0 1 32 32 503 0 -1 4.000 0 0 0 0 0 2 + 2019 1373 2019 1423 +2 1 0 1 32 32 502 0 -1 4.000 0 0 0 0 0 2 + 2019 1506 2019 1556 +2 1 0 1 32 32 501 0 -1 4.000 0 0 0 0 0 2 + 1619 1240 1619 1290 +2 1 0 1 32 32 500 0 -1 4.000 0 0 0 0 0 2 + 1619 1373 1619 1423 +2 1 0 1 32 32 499 0 -1 4.000 0 0 0 0 0 2 + 1619 1506 1619 1556 +2 1 0 1 32 32 498 0 -1 4.000 0 0 0 0 0 2 + 4036 873 3986 873 +2 1 0 1 32 32 497 0 -1 4.000 0 0 0 0 0 2 + 3902 873 3852 873 +2 1 0 1 32 32 496 0 -1 4.000 0 0 0 0 0 2 + 3769 873 3719 873 +2 1 0 1 32 32 495 0 -1 4.000 0 0 0 0 0 2 + 3636 873 3602 873 +2 1 0 1 32 32 494 0 -1 4.000 0 0 0 0 0 2 + 4036 1248 3986 1248 +2 1 0 1 32 32 493 0 -1 4.000 0 0 0 0 0 2 + 3902 1248 3852 1248 +2 1 0 1 32 32 492 0 -1 4.000 0 0 0 0 0 2 + 3769 1248 3719 1248 +2 1 0 1 32 32 491 0 -1 4.000 0 0 0 0 0 2 + 3636 1248 3602 1248 +2 1 0 1 32 32 490 0 -1 4.000 0 0 0 0 0 2 + 4035 1240 4035 1290 +2 1 0 1 32 32 489 0 -1 4.000 0 0 0 0 0 2 + 4035 1373 4035 1423 +2 1 0 1 32 32 488 0 -1 4.000 0 0 0 0 0 2 + 4035 1506 4035 1556 +2 1 0 1 32 32 487 0 -1 4.000 0 0 0 0 0 2 + 4435 1240 4435 1290 +2 1 0 1 32 32 486 0 -1 4.000 0 0 0 0 0 2 + 4435 1373 4435 1423 +2 1 0 1 32 32 485 0 -1 4.000 0 0 0 0 0 2 + 4435 1506 4435 1556 +2 1 0 1 32 32 484 0 -1 4.000 0 0 0 0 0 2 + 4835 1240 4835 1290 +2 1 0 1 32 32 483 0 -1 4.000 0 0 0 0 0 2 + 4835 1373 4835 1423 +2 1 0 1 32 32 482 0 -1 4.000 0 0 0 0 0 2 + 4835 1506 4835 1556 +2 1 0 1 32 32 481 0 -1 4.000 0 0 0 0 0 2 + 5235 1240 5235 1290 +2 1 0 1 32 32 480 0 -1 4.000 0 0 0 0 0 2 + 5235 1373 5235 1423 +2 1 0 1 32 32 479 0 -1 4.000 0 0 0 0 0 2 + 5235 1506 5235 1556 +2 1 0 1 32 32 478 0 -1 4.000 0 0 0 0 0 2 + 4036 2515 3986 2515 +2 1 0 1 32 32 477 0 -1 4.000 0 0 0 0 0 2 + 3902 2515 3852 2515 +2 1 0 1 32 32 476 0 -1 4.000 0 0 0 0 0 2 + 3769 2515 3719 2515 +2 1 0 1 32 32 475 0 -1 4.000 0 0 0 0 0 2 + 3636 2515 3602 2515 +2 1 0 1 32 32 474 0 -1 4.000 0 0 0 0 0 2 + 4036 2140 3986 2140 +2 1 0 1 32 32 473 0 -1 4.000 0 0 0 0 0 2 + 3902 2140 3852 2140 +2 1 0 1 32 32 472 0 -1 4.000 0 0 0 0 0 2 + 3769 2140 3719 2140 +2 1 0 1 32 32 471 0 -1 4.000 0 0 0 0 0 2 + 3636 2140 3602 2140 +2 1 0 1 32 32 470 0 -1 4.000 0 0 0 0 0 2 + 4035 2148 4035 2098 +2 1 0 1 32 32 469 0 -1 4.000 0 0 0 0 0 2 + 4035 2015 4035 1965 +2 1 0 1 32 32 468 0 -1 4.000 0 0 0 0 0 2 + 4035 1881 4035 1831 +2 1 0 1 32 32 467 0 -1 4.000 0 0 0 0 0 2 + 4435 2148 4435 2098 +2 1 0 1 32 32 466 0 -1 4.000 0 0 0 0 0 2 + 4435 2015 4435 1965 +2 1 0 1 32 32 465 0 -1 4.000 0 0 0 0 0 2 + 4435 1881 4435 1831 +2 1 0 1 32 32 464 0 -1 4.000 0 0 0 0 0 2 + 4835 2148 4835 2098 +2 1 0 1 32 32 463 0 -1 4.000 0 0 0 0 0 2 + 4835 2015 4835 1965 +2 1 0 1 32 32 462 0 -1 4.000 0 0 0 0 0 2 + 4835 1881 4835 1831 +2 1 0 1 32 32 461 0 -1 4.000 0 0 0 0 0 2 + 5235 2148 5235 2098 +2 1 0 1 32 32 460 0 -1 4.000 0 0 0 0 0 2 + 5235 2015 5235 1965 +2 1 0 1 32 32 459 0 -1 4.000 0 0 0 0 0 2 + 5235 1881 5235 1831 +2 1 0 1 32 32 458 0 -1 4.000 0 0 0 0 0 2 + 2819 2515 2869 2515 +2 1 0 1 32 32 457 0 -1 4.000 0 0 0 0 0 2 + 2952 2515 3002 2515 +2 1 0 1 32 32 456 0 -1 4.000 0 0 0 0 0 2 + 3085 2515 3135 2515 +2 1 0 1 32 32 455 0 -1 4.000 0 0 0 0 0 2 + 3219 2515 3252 2515 +2 1 0 1 32 32 454 0 -1 4.000 0 0 0 0 0 2 + 2819 2140 2869 2140 +2 1 0 1 32 32 453 0 -1 4.000 0 0 0 0 0 2 + 2952 2140 3002 2140 +2 1 0 1 32 32 452 0 -1 4.000 0 0 0 0 0 2 + 3085 2140 3135 2140 +2 1 0 1 32 32 451 0 -1 4.000 0 0 0 0 0 2 + 3219 2140 3252 2140 +2 1 0 1 32 32 450 0 -1 4.000 0 0 0 0 0 2 + 2819 2148 2819 2098 +2 1 0 1 32 32 449 0 -1 4.000 0 0 0 0 0 2 + 2819 2015 2819 1965 +2 1 0 1 32 32 448 0 -1 4.000 0 0 0 0 0 2 + 2819 1881 2819 1831 +2 1 0 1 32 32 447 0 -1 4.000 0 0 0 0 0 2 + 2419 2148 2419 2098 +2 1 0 1 32 32 446 0 -1 4.000 0 0 0 0 0 2 + 2419 2015 2419 1965 +2 1 0 1 32 32 445 0 -1 4.000 0 0 0 0 0 2 + 2419 1881 2419 1831 +2 1 0 1 32 32 444 0 -1 4.000 0 0 0 0 0 2 + 2019 2148 2019 2098 +2 1 0 1 32 32 443 0 -1 4.000 0 0 0 0 0 2 + 2019 2015 2019 1965 +2 1 0 1 32 32 442 0 -1 4.000 0 0 0 0 0 2 + 2019 1881 2019 1831 +2 1 0 1 32 32 441 0 -1 4.000 0 0 0 0 0 2 + 1619 2148 1619 2098 +2 1 0 1 32 32 440 0 -1 4.000 0 0 0 0 0 2 + 1619 2015 1619 1965 +2 1 0 1 32 32 439 0 -1 4.000 0 0 0 0 0 2 + 1619 1881 1619 1831 +2 1 0 1 0 0 426 0 -1 4.000 0 0 0 0 0 2 + 1420 1106 5459 1106 +2 1 0 0 0 0 425 0 20 4.000 0 0 0 0 0 3 + 5488 1109 5298 1053 5298 1106 +2 1 0 1 0 0 424 0 -1 4.000 0 0 0 0 0 3 + 5488 1109 5298 1053 5298 1106 +2 1 0 0 0 0 423 0 20 4.000 0 0 0 0 0 3 + 5488 1103 5298 1159 5298 1106 +2 1 0 1 0 0 422 0 -1 4.000 0 0 0 0 0 3 + 5488 1103 5298 1159 5298 1106 +2 1 0 1 0 0 421 0 -1 4.000 0 0 0 0 0 2 + 1420 2327 5459 2327 +2 1 0 0 0 0 420 0 20 4.000 0 0 0 0 0 3 + 5488 2330 5298 2274 5298 2327 +2 1 0 1 0 0 419 0 -1 4.000 0 0 0 0 0 3 + 5488 2330 5298 2274 5298 2327 +2 1 0 0 0 0 418 0 20 4.000 0 0 0 0 0 3 + 5488 2324 5298 2380 5298 2327 +2 1 0 1 0 0 417 0 -1 4.000 0 0 0 0 0 3 + 5488 2324 5298 2380 5298 2327 +2 1 0 1 0 0 416 0 -1 4.000 0 0 0 0 0 2 + 1420 2703 5459 2703 +2 1 0 0 0 0 415 0 20 4.000 0 0 0 0 0 3 + 5488 2706 5298 2650 5298 2703 +2 1 0 1 0 0 414 0 -1 4.000 0 0 0 0 0 3 + 5488 2706 5298 2650 5298 2703 +2 1 0 0 0 0 413 0 20 4.000 0 0 0 0 0 3 + 5488 2700 5298 2755 5298 2703 +2 1 0 1 0 0 412 0 -1 4.000 0 0 0 0 0 3 + 5488 2700 5298 2755 5298 2703 +2 1 0 1 0 0 389 0 -1 4.000 0 0 0 0 0 2 + 273 3662 273 3039 +2 1 0 1 0 0 388 0 -1 4.000 0 0 0 0 0 2 + 382 3920 156 3662 +2 1 0 1 0 0 387 0 -1 4.000 0 0 0 0 0 2 + 273 3662 148 3662 +2 1 0 1 0 0 386 0 -1 4.000 0 0 0 0 0 2 + 487 3662 487 3039 +2 1 0 1 0 0 385 0 -1 4.000 0 0 0 0 0 2 + 378 3920 604 3662 +2 1 0 1 0 0 384 0 -1 4.000 0 0 0 0 0 2 + 487 3662 612 3662 +2 1 0 1 0 0 383 0 -1 4.000 0 0 0 0 0 2 + 273 6130 273 6753 +2 1 0 1 0 0 382 0 -1 4.000 0 0 0 0 0 2 + 382 5872 156 6130 +2 1 0 1 0 0 381 0 -1 4.000 0 0 0 0 0 2 + 273 6130 148 6130 +2 1 0 1 0 0 380 0 -1 4.000 0 0 0 0 0 2 + 487 6129 487 6753 +2 1 0 1 0 0 379 0 -1 4.000 0 0 0 0 0 2 + 378 5872 604 6129 +2 1 0 1 0 0 378 0 -1 4.000 0 0 0 0 0 2 + 487 6129 612 6129 +4 0 0 931 -1 16 15 0.0000 4 30 135 2064 7726 ...\001 +4 0 0 849 -1 16 13 0.0000 4 150 270 2338 7001 n1 \001 +4 0 34 848 -1 16 13 0.0000 4 180 870 2605 7001 + 2-n1%2\001 +4 0 0 847 -1 16 13 0.0000 4 180 1110 3500 7001 = 2*(n1/2+1)\001 +4 0 0 845 -1 16 13 0.0000 4 105 195 681 8451 n0\001 +4 0 0 843 -1 16 10 0.0000 4 120 90 1364 7179 0\001 +4 0 0 841 -1 16 10 0.0000 4 150 345 6097 7179 n1+1\001 +4 0 0 839 -1 16 10 0.0000 4 120 90 1064 7479 0\001 +4 0 0 837 -1 16 10 0.0000 4 120 375 864 9479 n0-1\001 +4 0 0 798 -1 16 25 1.5708 4 360 1575 6250 9461 (padding)\001 +4 0 0 796 -1 18 16 1.5708 4 240 1695 428 9283 input, in-place\001 +4 0 0 794 -1 16 10 0.0000 4 120 90 1264 7429 0\001 +4 0 0 792 -1 16 10 0.0000 4 120 90 1681 7429 1\001 +4 0 0 790 -1 16 10 0.0000 4 120 90 2081 7429 2\001 +4 0 0 788 -1 16 10 0.0000 4 120 90 2481 7429 3\001 +4 0 0 786 -1 16 10 0.0000 4 150 360 4081 7429 n1-4\001 +4 0 0 784 -1 16 10 0.0000 4 150 360 4897 7429 n1-2\001 +4 0 0 782 -1 16 10 0.0000 4 150 360 5297 7429 n1-1\001 +4 0 0 780 -1 16 10 0.0000 4 150 360 4497 7429 n1-3\001 +4 0 0 778 -1 16 10 0.0000 4 150 345 1264 7795 n1+2\001 +4 0 0 776 -1 16 10 0.0000 4 150 345 1664 7795 n1+3\001 +4 0 0 774 -1 16 10 0.0000 4 120 165 5681 7429 n1\001 +4 0 0 772 -1 16 10 0.0000 4 150 345 6081 7429 n1+1\001 +4 0 0 709 -1 16 15 0.0000 4 30 135 2064 3993 ...\001 +4 0 0 651 -1 16 13 0.0000 4 180 585 3181 3267 n1/2+1\001 +4 0 0 649 -1 16 13 0.0000 4 105 195 681 4717 n0\001 +4 0 0 647 -1 16 10 0.0000 4 120 90 1564 3445 0\001 +4 0 0 645 -1 16 10 0.0000 4 150 300 5831 3445 n1/2\001 +4 0 0 643 -1 16 10 0.0000 4 120 90 1064 3745 0\001 +4 0 0 641 -1 16 10 0.0000 4 120 375 864 5745 n0-1\001 +4 0 0 611 -1 16 13 0.0000 4 165 855 1981 6463 = double\001 +4 0 0 606 -1 16 13 0.0000 4 180 1230 4547 6463 = fftw_complex\001 +4 0 0 604 -1 18 16 1.5708 4 225 780 428 5128 output\001 +4 0 0 602 -1 16 10 0.0000 4 120 90 1264 3679 0\001 +4 0 0 600 -1 16 10 0.0000 4 120 90 2081 3679 1\001 +4 0 0 598 -1 16 10 0.0000 4 150 495 4097 3679 n1/2-2\001 +4 0 0 596 -1 16 10 0.0000 4 150 495 4914 3679 n1/2-1\001 +4 0 0 594 -1 16 10 0.0000 4 150 480 1264 4062 n1/2+1\001 +4 0 0 592 -1 16 10 0.0000 4 150 300 5697 3679 n1/2\001 +4 0 0 519 -1 16 15 0.0000 4 30 135 2064 943 ...\001 +4 0 0 437 -1 16 13 0.0000 4 150 210 3381 217 n1\001 +4 0 0 435 -1 16 13 0.0000 4 105 195 681 1667 n0\001 +4 0 0 433 -1 16 10 0.0000 4 120 90 1364 395 0\001 +4 0 0 431 -1 16 10 0.0000 4 150 360 5281 395 n1-1\001 +4 0 0 429 -1 16 10 0.0000 4 120 90 1064 695 0\001 +4 0 0 427 -1 16 10 0.0000 4 120 375 864 2695 n0-1\001 +4 0 0 410 -1 18 16 1.5708 4 240 2235 428 2734 input, out-of-place\001 +4 0 0 408 -1 16 10 0.0000 4 120 90 1264 629 0\001 +4 0 0 406 -1 16 10 0.0000 4 120 90 1681 629 1\001 +4 0 0 404 -1 16 10 0.0000 4 120 90 2081 629 2\001 +4 0 0 402 -1 16 10 0.0000 4 120 90 2481 629 3\001 +4 0 0 400 -1 16 10 0.0000 4 150 360 4081 629 n1-4\001 +4 0 0 398 -1 16 10 0.0000 4 150 360 4897 629 n1-2\001 +4 0 0 396 -1 16 10 0.0000 4 150 360 5297 629 n1-1\001 +4 0 0 394 -1 16 10 0.0000 4 150 360 4497 629 n1-3\001 +4 0 0 392 -1 16 10 0.0000 4 120 165 1264 1012 n1\001 +4 0 0 390 -1 16 10 0.0000 4 150 345 1664 1012 n1+1\001 +-6 +4 0 0 932 -1 16 15 0.0000 4 15 60 74 89 \001 +4 0 0 850 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 846 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 844 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 842 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 840 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 838 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 799 -1 16 25 0.0000 4 15 90 74 89 \001 +4 0 0 797 -1 18 16 0.0000 4 15 60 74 89 \001 +4 0 0 795 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 793 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 791 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 789 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 787 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 785 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 783 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 781 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 779 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 777 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 775 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 773 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 710 -1 16 15 0.0000 4 15 60 74 89 \001 +4 0 0 652 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 650 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 648 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 646 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 644 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 642 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 612 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 607 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 605 -1 18 16 0.0000 4 15 60 74 89 \001 +4 0 0 603 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 601 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 599 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 597 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 595 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 593 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 520 -1 16 15 0.0000 4 15 60 74 89 \001 +4 0 0 438 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 436 -1 16 13 0.0000 4 15 60 74 89 \001 +4 0 0 434 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 432 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 430 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 428 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 411 -1 18 16 0.0000 4 15 60 74 89 \001 +4 0 0 409 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 407 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 405 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 403 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 401 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 399 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 397 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 395 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 393 -1 16 10 0.0000 4 15 45 74 89 \001 +4 0 0 391 -1 16 10 0.0000 4 15 45 1425 4800 \001 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.pdf b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.pdf new file mode 100644 index 000000000..567201906 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/rfftwnd.pdf differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/stamp-vti b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/stamp-vti new file mode 100644 index 000000000..c4c0e7c67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 24 May 2018 +@set UPDATED-MONTH May 2018 +@set EDITION 3.3.8 +@set VERSION 3.3.8 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/texinfo.tex b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/texinfo.tex new file mode 100644 index 000000000..85f184cc4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/texinfo.tex @@ -0,0 +1,10079 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2013-02-01.11} +% +% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +% 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. +% +% This texinfo.tex file is free software: you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation, either version 3 of the +% License, or (at your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. This Exception is an additional permission under section 7 +% of the GNU General Public License, version 3 ("GPLv3"). +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or +% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or +% http://www.gnu.org/software/texinfo/ (the Texinfo home page) +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexnewwrite\newwrite +\let\ptexnoindent=\noindent +\let\ptexplus=+ +\let\ptexraggedright=\raggedright +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t +\let\ptextop=\top +{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putworderror\undefined \gdef\putworderror{error}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% Since the category of space is not known, we have to be careful. +\chardef\spacecat = 10 +\def\spaceisspace{\catcode`\ =\spacecat} + +% sometimes characters are active, so we need control sequences. +\chardef\ampChar = `\& +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dashChar = `\- +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\hashChar = `\# +\chardef\lquoteChar= `\` +\chardef\questChar = `\? +\chardef\rquoteChar= `\' +\chardef\semiChar = `\; +\chardef\slashChar = `\/ +\chardef\underChar = `\_ + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt } + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\thisisundefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% @errormsg{MSG}. Do the index-like expansions on MSG, but if things +% aren't perfect, it's not the end of the world, being an error message, +% after all. +% +\def\errormsg{\begingroup \indexnofonts \doerrormsg} +\def\doerrormsg#1{\errmessage{#1}} + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Output a mark which sets \thischapter, \thissection and \thiscolor. +% We dump everything together because we only have one kind of mark. +% This works because we only use \botmark / \topmark, not \firstmark. +% +% A mark contains a subexpression of the \ifcase ... \fi construct. +% \get*marks macros below extract the needed part using \ifcase. +% +% Another complication is to let the user choose whether \thischapter +% (\thissection) refers to the chapter (section) in effect at the top +% of a page, or that at the bottom of a page. The solution is +% described on page 260 of The TeXbook. It involves outputting two +% marks for the sectioning macros, one before the section break, and +% one after. I won't pretend I can describe this better than DEK... +\def\domark{% + \toks0=\expandafter{\lastchapterdefs}% + \toks2=\expandafter{\lastsectiondefs}% + \toks4=\expandafter{\prevchapterdefs}% + \toks6=\expandafter{\prevsectiondefs}% + \toks8=\expandafter{\lastcolordefs}% + \mark{% + \the\toks0 \the\toks2 + \noexpand\or \the\toks4 \the\toks6 + \noexpand\else \the\toks8 + }% +} +% \topmark doesn't work for the very first chapter (after the title +% page or the contents), so we use \firstmark there -- this gets us +% the mark with the chapter defs, unless the user sneaks in, e.g., +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. +\def\gettopheadingmarks{% + \ifcase0\topmark\fi + \ifx\thischapter\empty \ifcase0\firstmark\fi \fi +} +\def\getbottomheadingmarks{\ifcase1\botmark\fi} +\def\getcolormarks{\ifcase2\topmark\fi} + +% Avoid "undefined control sequence" errors. +\def\lastchapterdefs{} +\def\lastsectiondefs{} +\def\prevchapterdefs{} +\def\prevsectiondefs{} +\def\lastcolordefs{} + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + % We don't want .vr (or whatever) entries like this: + % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} + % "\acronym" won't work when it's read back in; + % it needs to be + % {\code {{\tt \backslashcurfont }acronym} + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingyyy.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 24pt + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \indexdummies + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1\relax \unvbox#1\relax +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\argtorun{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurrence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarly, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as environments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At run-time, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Environment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + outside of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal. + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\unskip\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=\endofsentencespacefactor\space} + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=\endofsentencespacefactor\space} + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=\endofsentencespacefactor\space} + +% @frenchspacing on|off says whether to put extra space after punctuation. +% +\def\onword{on} +\def\offword{off} +% +\parseargdef\frenchspacing{% + \def\temp{#1}% + \ifx\temp\onword \plainfrenchspacing + \else\ifx\temp\offword \plainnonfrenchspacing + \else + \errhelp = \EMsimple + \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% + \fi\fi +} + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. Not documented, written for gawk manual. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). This command +% is not documented, not supported, and doesn't work. +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% @include FILE -- \input text of FILE. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable % we want to expand any @value in FILE. + \turnoffactive % and allow special characters in the expansion + \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @include of #1^^J}% + \edef\temp{\noexpand\input #1 }% + % + % This trickery is to read FILE outside of a group, in case it makes + % definitions, etc. + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other + \catcode`\`=\other + \catcode`\'=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} +% +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\centersub\centerH + \else + \let\centersub\centerV + \fi + \centersub{\hfil \ignorespaces#1\unskip \hfil}% + \let\centersub\relax % don't let the definition persist, just in case +} +\def\centerH#1{{% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break +}} +% +\newcount\centerpenalty +\def\centerV#1{% + % The idea here is the same as in \startdefun, \cartouche, etc.: if + % @center is the first thing after a section heading, we need to wipe + % out the negative parskip inserted by \sectionheading, but still + % prevent a page break here. + \centerpenalty = \lastpenalty + \ifnum\centerpenalty>10000 \vskip\parskip \fi + \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi + \line{\kern\leftskip #1\kern\rightskip}% +} + +% @sp n outputs n lines of vertical space +% +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment +% +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} +% +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as being undefined. +\ifx\pdfoutput\thisisundefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi + +% PDF uses PostScript string constants for the names of xref targets, +% for display in the outlines, and in other places. Thus, we have to +% double any backslashes. Otherwise, a name like "\node" will be +% interpreted as a newline (\n), followed by o, d, e. Not good. +% +% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and +% related messages. The final outcome is that it is up to the TeX user +% to double the backslashes and otherwise make the string valid, so +% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to +% do this reliably, so we use it. + +% #1 is a control sequence in which to do the replacements, +% which we \xdef. +\def\txiescapepdf#1{% + \ifx\pdfescapestring\thisisundefined + % No primitive available; should we give a warning or log? + % Many times it won't matter. + \else + % The expandable \pdfescapestring primitive escapes parentheses, + % backslashes, and other special chars. + \xdef#1{\pdfescapestring{#1}}% + \fi +} + +\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images +with PDF output, and none of those formats could be found. (.eps cannot +be supported due to the design of the PDF format; use regular TeX (DVI +output) for that.)} + +\ifpdf + % + % Color manipulation macros based on pdfcolor.tex, + % except using rgb instead of cmyk; the latter is said to render as a + % very dark gray on-screen and a very dark halftone in print, instead + % of actual black. + \def\rgbDarkRed{0.50 0.09 0.12} + \def\rgbBlack{0 0 0} + % + % k sets the color for filling (usual text, etc.); + % K sets the color for stroking (thin rules, e.g., normal _'s). + \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} + % + % Set color, and create a mark which defines \thiscolor accordingly, + % so that \makeheadline knows which color to restore. + \def\setcolor#1{% + \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% + } + % + \def\maincolor{\rgbBlack} + \pdfsetcolor{\maincolor} + \edef\thiscolor{\maincolor} + \def\lastcolordefs{} + % + \def\makefootline{% + \baselineskip24pt + \line{\pdfsetcolor{\maincolor}\the\footline}% + } + % + \def\makeheadline{% + \vbox to 0pt{% + \vskip-22.5pt + \line{% + \vbox to8.5pt{}% + % Extract \thiscolor definition from the marks. + \getcolormarks + % Typeset the headline with \maincolor, then restore the color. + \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% + }% + \vss + }% + \nointerlineskip + } + % + % + \pdfcatalog{/PageMode /UseOutlines} + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\dopdfimage#1#2#3{% + \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % pdftex (and the PDF format) support .pdf, .png, .jpg (among + % others). Let's try in that order, PDF first since if + % someone has a scalable image, presumably better to use that than a + % bitmap. + \let\pdfimgext=\empty + \begingroup + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \errhelp = \nopdfimagehelp + \errmessage{Could not find image file #1 for pdf}% + \else \gdef\pdfimgext{JPG}% + \fi + \else \gdef\pdfimgext{jpeg}% + \fi + \else \gdef\pdfimgext{jpg}% + \fi + \else \gdef\pdfimgext{png}% + \fi + \else \gdef\pdfimgext{PDF}% + \fi + \else \gdef\pdfimgext{pdf}% + \fi + \closein 1 + \endgroup + % + % without \immediate, ancient pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifdim \wd0 >0pt width \pdfimagewidth \fi + \ifdim \wd2 >0pt height \pdfimageheight \fi + \ifnum\pdftexversion<13 + #1.\pdfimgext + \else + {#1.\pdfimgext}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + % + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \turnoffactive + \makevalueexpandable + \def\pdfdestname{#1}% + \txiescapepdf\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + % used to mark target names; must be expandable. + \def\pdfmkpgn#1{#1} + % + % by default, use a color that is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. + \def\urlcolor{\rgbDarkRed} + \def\linkcolor{\rgbDarkRed} + \def\endlink{\setcolor{\maincolor}\pdfendlink} + % + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text, which is what will be displayed in the + % outline by the pdf viewer. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node text, + % which might be empty if this toc entry had no corresponding node. + % #4 is the page number + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worth the trouble, since most documents are normally structured. + \edef\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + \txiescapepdf\pdfoutlinedest + \fi + % + % Also escape PDF chars in the display string. + \edef\pdfoutlinetext{#1}% + \txiescapepdf\pdfoutlinetext + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\partentry##1##2##3##4{}% ignore parts in the outlines + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \def\thissubsecnum{0}% + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \def\thischapnum{0}% + \def\thissecnum{0}% + \def\thissubsecnum{0}% + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \readdatafile{toc}% + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % TODO this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Too + % much work for too little return. Just use the ASCII equivalents + % we use for the index sort strings. + % + \indexnofonts + \setupdatafile + % We can have normal brace characters in the PDF outlines, unlike + % Texinfo index files. So set that up. + \def\{{\lbracecharliteral}% + \def\}{\rbracecharliteral}% + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + {\catcode`[=1 \catcode`]=2 + \catcode`{=\other \catcode`}=\other + \gdef\lbracecharliteral[{]% + \gdef\rbracecharliteral[}]% + ] + % + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \nextsp} + \def\getfilename#1{% + \filenamelength=0 + % If we don't expand the argument now, \skipspaces will get + % snagged on things like "@value{foo}". + \edef\temp{#1}% + \expandafter\skipspaces\temp|\relax + } + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + % do we want to go so far as to use \indexnofonts instead of just + % special-casing \var here? + \def\var##1{##1}% + % + \leavevmode\setcolor{\urlcolor}% + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + % non-pdf mode + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\setcolor = \gobble + \let\pdfsetcolor = \gobble + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Unfortunately, we have to override this for titles and the like, since +% in those cases "rm" is bold. Sigh. +\def\rmisbold{\rm\def\curfontstyle{bf}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +% can get a sort of poor man's double spacing by redefining this. +\def\baselinefactor{1} +% +\newdimen\textleading +\def\setleading#1{% + \dimen0 = #1\relax + \normalbaselineskip = \baselinefactor\dimen0 + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% PDF CMaps. See also LaTeX's t1.cmap. +% +% do nothing with this by default. +\expandafter\let\csname cmapOT1\endcsname\gobble +\expandafter\let\csname cmapOT1IT\endcsname\gobble +\expandafter\let\csname cmapOT1TT\endcsname\gobble + +% if we are producing pdf, and we have \pdffontattr, then define cmaps. +% (\pdffontattr was introduced many years ago, but people still run +% older pdftex's; it's easy to conditionalize, so we do.) +\ifpdf \ifx\pdffontattr\thisisundefined \else + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1-0) +%%Title: (TeX-OT1-0 TeX OT1 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1) +/Supplement 0 +>> def +/CMapName /TeX-OT1-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<23> <26> <0023> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +40 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1IT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1IT-0) +%%Title: (TeX-OT1IT-0 TeX OT1IT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1IT) +/Supplement 0 +>> def +/CMapName /TeX-OT1IT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +8 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<25> <26> <0025> +<28> <3B> <0028> +<3F> <5B> <003F> +<5D> <5E> <005D> +<61> <7A> <0061> +<7B> <7C> <2013> +endbfrange +42 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <00660066> +<0C> <00660069> +<0D> <0066006C> +<0E> <006600660069> +<0F> <00660066006C> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<21> <0021> +<22> <201D> +<23> <0023> +<24> <00A3> +<27> <2019> +<3C> <00A1> +<3D> <003D> +<3E> <00BF> +<5C> <201C> +<5F> <02D9> +<60> <2018> +<7D> <02DD> +<7E> <007E> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1IT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +% +% \cmapOT1TT + \begingroup + \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. + \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap +%%DocumentNeededResources: ProcSet (CIDInit) +%%IncludeResource: ProcSet (CIDInit) +%%BeginResource: CMap (TeX-OT1TT-0) +%%Title: (TeX-OT1TT-0 TeX OT1TT 0) +%%Version: 1.000 +%%EndComments +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<< /Registry (TeX) +/Ordering (OT1TT) +/Supplement 0 +>> def +/CMapName /TeX-OT1TT-0 def +/CMapType 2 def +1 begincodespacerange +<00> <7F> +endcodespacerange +5 beginbfrange +<00> <01> <0393> +<09> <0A> <03A8> +<21> <26> <0021> +<28> <5F> <0028> +<61> <7E> <0061> +endbfrange +32 beginbfchar +<02> <0398> +<03> <039B> +<04> <039E> +<05> <03A0> +<06> <03A3> +<07> <03D2> +<08> <03A6> +<0B> <2191> +<0C> <2193> +<0D> <0027> +<0E> <00A1> +<0F> <00BF> +<10> <0131> +<11> <0237> +<12> <0060> +<13> <00B4> +<14> <02C7> +<15> <02D8> +<16> <00AF> +<17> <02DA> +<18> <00B8> +<19> <00DF> +<1A> <00E6> +<1B> <0153> +<1C> <00F8> +<1D> <00C6> +<1E> <0152> +<1F> <00D8> +<20> <2423> +<27> <2019> +<60> <2018> +<7F> <00A8> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +%%EndResource +%%EOF + }\endgroup + \expandafter\edef\csname cmapOT1TT\endcsname#1{% + \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% + }% +\fi\fi + + +% Set the font macro #1 to the font named \fontprefix#2. +% #3 is the font's design size, #4 is a scale factor, #5 is the CMap +% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). +% Example: +% #1 = \textrm +% #2 = \rmshape +% #3 = 10 +% #4 = \mainmagstep +% #5 = OT1 +% +\def\setfont#1#2#3#4#5{% + \font#1=\fontprefix#2#3 scaled #4 + \csname cmap#5\endcsname#1% +} +% This is what gets called when #5 of \setfont is empty. +\let\cmap\gobble +% +% (end of cmaps) + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\thisisundefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} % where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Definitions for a main text size of 11pt. (The default in Texinfo.) +% +\def\definetextfontsizexi{% +% Text fonts (11.2pt, magstep1). +\def\textnominalsize{11pt} +\edef\mainmagstep{\magstephalf} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1095} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1}{OT1} +\setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter (and unnumbered) fonts (17.28pt). +\def\chapnominalsize{17pt} +\setfont\chaprm\rmbshape{12}{\magstep2}{OT1} +\setfont\chapit\itbshape{10}{\magstep3}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep3}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} +\setfont\chapsf\sfbshape{17}{1000}{OT1} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3}{OT1} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 +\def\chapecsize{1728} + +% Section fonts (14.4pt). +\def\secnominalsize{14pt} +\setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secit\itbshape{10}{\magstep2}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep2}{OT1} +\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\secsf\sfbshape{12}{\magstep1}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2}{OT1} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 +\def\sececsize{1440} + +% Subsection fonts (13.15pt). +\def\ssecnominalsize{13pt} +\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} +\setfont\ssecit\itbshape{10}{1315}{OT1IT} +\setfont\ssecsl\slbshape{10}{1315}{OT1} +\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} +\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315}{OT1} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 +\def\ssececsize{1200} + +% Reduced fonts for @acro in text (10pt). +\def\reducednominalsize{10pt} +\setfont\reducedrm\rmshape{10}{1000}{OT1} +\setfont\reducedtt\ttshape{10}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{1000}{OT1} +\setfont\reducedit\itshape{10}{1000}{OT1IT} +\setfont\reducedsl\slshape{10}{1000}{OT1} +\setfont\reducedsf\sfshape{10}{1000}{OT1} +\setfont\reducedsc\scshape{10}{1000}{OT1} +\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 +\def\reducedecsize{1000} + +\textleading = 13.2pt % line spacing for 11pt CM +\textfonts % reset the current fonts +\rm +} % end of 11pt text font size definitions, \definetextfontsizexi + + +% Definitions to make the main text be 10pt Computer Modern, with +% section, chapter, etc., sizes following suit. This is for the GNU +% Press printing of the Emacs 22 manual. Maybe other manuals in the +% future. Used with @smallbook, which sets the leading to 12pt. +% +\def\definetextfontsizex{% +% Text fonts (10pt). +\def\textnominalsize{10pt} +\edef\mainmagstep{1000} +\setfont\textrm\rmshape{10}{\mainmagstep}{OT1} +\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} +\setfont\textbf\bfshape{10}{\mainmagstep}{OT1} +\setfont\textit\itshape{10}{\mainmagstep}{OT1IT} +\setfont\textsl\slshape{10}{\mainmagstep}{OT1} +\setfont\textsf\sfshape{10}{\mainmagstep}{OT1} +\setfont\textsc\scshape{10}{\mainmagstep}{OT1} +\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep +\def\textecsize{1000} + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstephalf}{OT1} +\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\def\smallnominalsize{9pt} +\setfont\smallrm\rmshape{9}{1000}{OT1} +\setfont\smalltt\ttshape{9}{1000}{OT1TT} +\setfont\smallbf\bfshape{10}{900}{OT1} +\setfont\smallit\itshape{9}{1000}{OT1IT} +\setfont\smallsl\slshape{9}{1000}{OT1} +\setfont\smallsf\sfshape{9}{1000}{OT1} +\setfont\smallsc\scshape{10}{900}{OT1} +\setfont\smallttsl\ttslshape{10}{900}{OT1TT} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 +\def\smallecsize{0900} + +% Fonts for small examples (8pt). +\def\smallernominalsize{8pt} +\setfont\smallerrm\rmshape{8}{1000}{OT1} +\setfont\smallertt\ttshape{8}{1000}{OT1TT} +\setfont\smallerbf\bfshape{10}{800}{OT1} +\setfont\smallerit\itshape{8}{1000}{OT1IT} +\setfont\smallersl\slshape{8}{1000}{OT1} +\setfont\smallersf\sfshape{8}{1000}{OT1} +\setfont\smallersc\scshape{10}{800}{OT1} +\setfont\smallerttsl\ttslshape{10}{800}{OT1TT} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 +\def\smallerecsize{0800} + +% Fonts for title page (20.4pt): +\def\titlenominalsize{20pt} +\setfont\titlerm\rmbshape{12}{\magstep3}{OT1} +\setfont\titleit\itbshape{10}{\magstep4}{OT1IT} +\setfont\titlesl\slbshape{10}{\magstep4}{OT1} +\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} +\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} +\setfont\titlesf\sfbshape{17}{\magstep1}{OT1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4}{OT1} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\titleecsize{2074} + +% Chapter fonts (14.4pt). +\def\chapnominalsize{14pt} +\setfont\chaprm\rmbshape{12}{\magstep1}{OT1} +\setfont\chapit\itbshape{10}{\magstep2}{OT1IT} +\setfont\chapsl\slbshape{10}{\magstep2}{OT1} +\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} +\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} +\setfont\chapsf\sfbshape{12}{\magstep1}{OT1} +\let\chapbf\chaprm +\setfont\chapsc\scbshape{10}{\magstep2}{OT1} +\font\chapi=cmmi12 scaled \magstep1 +\font\chapsy=cmsy10 scaled \magstep2 +\def\chapecsize{1440} + +% Section fonts (12pt). +\def\secnominalsize{12pt} +\setfont\secrm\rmbshape{12}{1000}{OT1} +\setfont\secit\itbshape{10}{\magstep1}{OT1IT} +\setfont\secsl\slbshape{10}{\magstep1}{OT1} +\setfont\sectt\ttbshape{12}{1000}{OT1TT} +\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} +\setfont\secsf\sfbshape{12}{1000}{OT1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep1}{OT1} +\font\seci=cmmi12 +\font\secsy=cmsy10 scaled \magstep1 +\def\sececsize{1200} + +% Subsection fonts (10pt). +\def\ssecnominalsize{10pt} +\setfont\ssecrm\rmbshape{10}{1000}{OT1} +\setfont\ssecit\itbshape{10}{1000}{OT1IT} +\setfont\ssecsl\slbshape{10}{1000}{OT1} +\setfont\ssectt\ttbshape{10}{1000}{OT1TT} +\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} +\setfont\ssecsf\sfbshape{10}{1000}{OT1} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1000}{OT1} +\font\sseci=cmmi10 +\font\ssecsy=cmsy10 +\def\ssececsize{1000} + +% Reduced fonts for @acro in text (9pt). +\def\reducednominalsize{9pt} +\setfont\reducedrm\rmshape{9}{1000}{OT1} +\setfont\reducedtt\ttshape{9}{1000}{OT1TT} +\setfont\reducedbf\bfshape{10}{900}{OT1} +\setfont\reducedit\itshape{9}{1000}{OT1IT} +\setfont\reducedsl\slshape{9}{1000}{OT1} +\setfont\reducedsf\sfshape{9}{1000}{OT1} +\setfont\reducedsc\scshape{10}{900}{OT1} +\setfont\reducedttsl\ttslshape{10}{900}{OT1TT} +\font\reducedi=cmmi9 +\font\reducedsy=cmsy9 +\def\reducedecsize{0900} + +\divide\parskip by 2 % reduce space between paragraphs +\textleading = 12pt % line spacing for 10pt CM +\textfonts % reset the current fonts +\rm +} % end of 10pt text font size definitions, \definetextfontsizex + + +% We provide the user-level command +% @fonttextsize 10 +% (or 11) to redefine the text font size. pt is assumed. +% +\def\xiword{11} +\def\xword{10} +\def\xwordpt{10pt} +% +\parseargdef\fonttextsize{% + \def\textsizearg{#1}% + %\wlog{doing @fonttextsize \textsizearg}% + % + % Set \globaldefs so that documents can use this inside @tex, since + % makeinfo 4.8 does not support it, but we need it nonetheless. + % + \begingroup \globaldefs=1 + \ifx\textsizearg\xword \definetextfontsizex + \else \ifx\textsizearg\xiword \definetextfontsizexi + \else + \errhelp=\EMsimple + \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} + \fi\fi + \endgroup +} + + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\curfontsize{text}% + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\curfontsize{title}% + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{27pt}} +\def\titlefont#1{{\titlefonts\rmisbold #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy + \let\tenttsl=\chapttsl + \def\curfontsize{chap}% + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\curfontsize{sec}% + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\curfontsize{ssec}% + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\curfontsize{reduced}% + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\curfontsize{small}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\curfontsize{smaller}% + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT} + +% Define these just so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% --karl, 24jan03. + +% Set up the default fonts, so we can use them for creating boxes. +% +\definetextfontsizexi + + +\message{markup,} + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will +% define and register \INITMACRO to be called on markup style changes. +% \INITMACRO can check \currentmarkupstyle for the innermost +% style and the set of \ifmarkupSTYLE switches for all styles +% currently in effect. +\newif\ifmarkupvar +\newif\ifmarkupsamp +\newif\ifmarkupkey +%\newif\ifmarkupfile % @file == @samp. +%\newif\ifmarkupoption % @option == @samp. +\newif\ifmarkupcode +\newif\ifmarkupkbd +%\newif\ifmarkupenv % @env == @code. +%\newif\ifmarkupcommand % @command == @code. +\newif\ifmarkuptex % @tex (and part of @math, for now). +\newif\ifmarkupexample +\newif\ifmarkupverb +\newif\ifmarkupverbatim + +\let\currentmarkupstyle\empty + +\def\setupmarkupstyle#1{% + \csname markup#1true\endcsname + \def\currentmarkupstyle{#1}% + \markupstylesetup +} + +\let\markupstylesetup\empty + +\def\defmarkupstylesetup#1{% + \expandafter\def\expandafter\markupstylesetup + \expandafter{\markupstylesetup #1}% + \def#1% +} + +% Markup style setup for left and right quotes. +\defmarkupstylesetup\markupsetuplq{% + \expandafter\let\expandafter \temp + \csname markupsetuplq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuplqdefault \else \temp \fi +} + +\defmarkupstylesetup\markupsetuprq{% + \expandafter\let\expandafter \temp + \csname markupsetuprq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuprqdefault \else \temp \fi +} + +{ +\catcode`\'=\active +\catcode`\`=\active + +\gdef\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} +} + +\let\markupsetuplqcode \markupsetcodequoteleft +\let\markupsetuprqcode \markupsetcodequoteright +% +\let\markupsetuplqexample \markupsetcodequoteleft +\let\markupsetuprqexample \markupsetcodequoteright +% +\let\markupsetuplqkbd \markupsetcodequoteleft +\let\markupsetuprqkbd \markupsetcodequoteright +% +\let\markupsetuplqsamp \markupsetcodequoteleft +\let\markupsetuprqsamp \markupsetcodequoteright +% +\let\markupsetuplqverb \markupsetcodequoteleft +\let\markupsetuprqverb \markupsetcodequoteright +% +\let\markupsetuplqverbatim \markupsetcodequoteleft +\let\markupsetuprqverbatim \markupsetcodequoteright + +% Allow an option to not use regular directed right quote/apostrophe +% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). +% The undirected quote is ugly, so don't make it the default, but it +% works for pasting with more pdf viewers (at least evince), the +% lilypond developers report. xpdf does work with the regular 0x27. +% +\def\codequoteright{% + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi +} +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. +% +\def\codequoteleft{% + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + % [Knuth] pp. 380,381,391 + % \relax disables Spanish ligatures ?` and !` of \tt font. + \relax`% + \else \char'22 \fi + \else \char'22 \fi +} + +% Commands to set the quote options. +% +\parseargdef\codequoteundirected{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequoteundirected\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% + \fi\fi +} +% +\parseargdef\codequotebacktick{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = t% + \else\ifx\temp\offword + \expandafter\let\csname SETtxicodequotebacktick\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% + \fi\fi +} + +% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. +\def\noligaturesquoteleft{\relax\lq} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Font commands. + +% #1 is the font command (\sl or \it), #2 is the text to slant. +% If we are in a monospaced environment, however, 1) always use \ttsl, +% and 2) do not add an italic correction. +\def\dosmartslant#1#2{% + \ifusingtt + {{\ttsl #2}\let\next=\relax}% + {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% + \next +} +\def\smartslanted{\dosmartslant\sl} +\def\smartitalic{\dosmartslant\it} + +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% + \ifx\next,% + \else\ifx\next-% + \else\ifx\next.% + \else\ptexslash + \fi\fi\fi + \aftersmartic +} + +% Unconditional use \ttsl, and no ic. @var is set to this for defuns. +\def\ttslanted#1{{\ttsl #1}} + +% @cite is like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} + +\def\aftersmartic{} +\def\var#1{% + \let\saveaftersmartic = \aftersmartic + \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% + \smartslanted{#1}% +} + +\let\i=\smartitalic +\let\slanted=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @b, explicit bold. Also @strong. +\def\b#1{{\bf #1}} +\let\strong=\b + +% @sansserif, explicit sans. +\def\sansserif#1{{\sf #1}} + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\plainfrenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \def\endofsentencespacefactor{1000}% for @. and friends + } + \def\plainnonfrenchspacing{% + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends + } +\catcode`@=\other +\def\endofsentencespacefactor{3000}% default + +% @t, explicit typewriter. +\def\t#1{% + {\tt \rawbackslash \plainfrenchspacing #1}% + \null +} + +% @samp. +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +% @indicateurl is \samp, that is, with quotes. +\let\indicateurl=\samp + +% @code (and similar) prints in typewriter, but with spaces the same +% size as normal in the surrounding text, without hyphenation, etc. +% This is a subroutine for that. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \plainfrenchspacing + #1% + }% + \null % reset spacefactor to 1000 +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. +% +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active \catcode`\_=\active + \catcode`\'=\active \catcode`\`=\active + \global\let'=\rq \global\let`=\lq % default definitions + % + \global\def\code{\begingroup + \setupmarkupstyle{code}% + % The following should really be moved into \setupmarkupstyle handlers. + \catcode\dashChar=\active \catcode\underChar=\active + \ifallowcodebreaks + \let-\codedash + \let_\codeunder + \else + \let-\normaldash + \let_\realunder + \fi + \codex + } +} + +\def\codex #1{\tclose{#1}\endgroup} + +\def\normaldash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} + +% An additional complication: the above will allow breaks after, e.g., +% each of the four underscores in __typeof__. This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. +% +\newif\ifallowcodebreaks \allowcodebreakstrue + +\def\keywordtrue{true} +\def\keywordfalse{false} + +\parseargdef\allowcodebreaks{% + \def\txiarg{#1}% + \ifx\txiarg\keywordtrue + \allowcodebreakstrue + \else\ifx\txiarg\keywordfalse + \allowcodebreaksfalse + \else + \errhelp = \EMsimple + \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% + \fi\fi +} + +% For @command, @env, @file, @option quotes seem unnecessary, +% so use \code rather than \samp. +\let\command=\code +\let\env=\code +\let\file=\code +\let\option=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. +% (This \urefnobreak definition isn't used now, leaving it for a while +% for comparison.) +\def\urefnobreak#1{\dourefnobreak #1,,,\finish} +\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% This \urefbreak definition is the active one. +\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} +\let\uref=\urefbreak +\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} +\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \urefcode{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% Allow line breaks around only a few characters (only). +\def\urefcatcodes{% + \catcode\ampChar=\active \catcode\dotChar=\active + \catcode\hashChar=\active \catcode\questChar=\active + \catcode\slashChar=\active +} +{ + \urefcatcodes + % + \global\def\urefcode{\begingroup + \setupmarkupstyle{code}% + \urefcatcodes + \let&\urefcodeamp + \let.\urefcodedot + \let#\urefcodehash + \let?\urefcodequest + \let/\urefcodeslash + \codex + } + % + % By default, they are just regular characters. + \global\def&{\normalamp} + \global\def.{\normaldot} + \global\def#{\normalhash} + \global\def?{\normalquest} + \global\def/{\normalslash} +} + +% we put a little stretch before and after the breakable chars, to help +% line breaking of long url's. The unequal skips make look better in +% cmtt at least, especially for dots. +\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } +\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } +% +\def\urefcodeamp{\urefprestretch \&\urefpoststretch} +\def\urefcodedot{\urefprestretch .\urefpoststretch} +\def\urefcodehash{\urefprestretch \#\urefpoststretch} +\def\urefcodequest{\urefprestretch ?\urefpoststretch} +\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} +{ + \catcode`\/=\active + \global\def\urefcodeslashfinish{% + \urefprestretch \slashChar + % Allow line break only after the final / in a sequence of + % slashes, to avoid line break between the slashes in http://. + \ifx\next/\else \urefpoststretch \fi + } +} + +% One more complication: by default we'll break after the special +% characters, but some people like to break before the special chars, so +% allow that. Also allow no breaking at all, for manual control. +% +\parseargdef\urefbreakstyle{% + \def\txiarg{#1}% + \ifx\txiarg\wordnone + \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordbefore + \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} + \else\ifx\txiarg\wordafter + \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} + \else + \errhelp = \EMsimple + \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% + \fi\fi\fi +} +\def\wordafter{after} +\def\wordbefore{before} +\def\wordnone{none} + +\urefbreakstyle after + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\txiarg{#1}% + \ifx\txiarg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\txiarg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\txiarg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct'. +\kbdinputstyle distinct + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} + +\def\xkey{\key} +\def\kbdsub#1#2#3\par{% + \def\one{#1}\def\three{#3}\def\threex{??}% + \ifx\one\xkey\ifx\threex\three \key{#2}% + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +} + +% definition of @key that produces a lozenge. Doesn't adjust to text size. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +% \vbox{\hrule\kern-0.4pt +% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +% \kern-0.4pt\hrule}% +% \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} + +% @clicksequence{File @click{} Open ...} +\def\clicksequence#1{\begingroup #1\endgroup} + +% @clickstyle @arrow (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow} + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% @acronym for "FBI", "NATO", and the like. +% We print this one point size smaller, since it's intended for +% all-uppercase. +% +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @abbr for "Comput. J." and the like. +% No font change, but don't do end-of-sentence spacing. +% +\def\abbr#1{\doabbr #1,,\finish} +\def\doabbr#1,#2,#3\finish{% + {\plainfrenchspacing #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi + \null % reset \spacefactor=1000 +} + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode`\_ = \active + \gdef\mathunderscore{% + \catcode`\_=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a math (or tt) \. +% FYI, plain.tex uses \\ as a temporary control sequence (for no +% particular reason), but this is not advertised and we don't care. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + % make the texinfo accent commands work in math mode + \let\"=\ddot + \let\'=\acute + \let\==\bar + \let\^=\hat + \let\`=\grave + \let\u=\breve + \let\v=\check + \let\~=\tilde + \let\dotaccent=\dot + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \catcode`' = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + \let' = \ptexquoteright + } +} + +% ctrl is no longer a Texinfo command, but leave this definition for fun. +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. +% Ignore unless FMTNAME == tex; then it is like @iftex and @tex, +% except specified as a normal braced arg, so no newlines to worry about. +% +\def\outfmtnametex{tex} +% +\long\def\inlinefmt#1{\doinlinefmt #1,\finish} +\long\def\doinlinefmt#1,#2,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi +} +% For raw, must switch into @tex before parsing the argument, to avoid +% setting catcodes prematurely. Doing it this way means that, for +% example, @inlineraw{html, foo{bar} gets a parse error instead of being +% ignored. But this isn't important because if people want a literal +% *right* brace they would have to use a command anyway, so they may as +% well use a command to get a left brace too. We could re-use the +% delimiter character idea from \verb, but it seems like overkill. +% +\long\def\inlineraw{\tex \doinlineraw} +\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} +\def\doinlinerawtwo#1,#2,\finish{% + \def\inlinerawname{#1}% + \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi + \endgroup % close group opened by \tex. +} + + +\message{glyphs,} +% and logos. + +% @@ prints an @, as does @atchar{}. +\def\@{\char64 } +\let\atchar=\@ + +% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. +% Unless we're in typewriter, use \ecfont because the CM text fonts do +% not have braces, and we don't want to switch into math. +\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} +\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} +\let\{=\mylbrace \let\lbracechar=\{ +\let\}=\myrbrace \let\rbracechar=\} +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux/toc files. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \ptexc +\let\dotaccent = \ptexdot +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \ptext +\let\ubaraccent = \ptexb +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi + \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{% + \ifx\textnominalsize\xwordpt + % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. + % Revert to plain's \scriptsize, which is 7pt. + \count255=\the\fam $\fam\count255 \scriptstyle A$% + \else + % For 11pt, we can use our lllsize. + \selectfonts\lllsize A% + \fi + }% + \vss + }}% + \kern-.15em + \TeX +} + +% Some math mode symbols. +\def\bullet{$\ptexbullet$} +\def\geq{\ifmmode \ge\else $\ge$\fi} +\def\leq{\ifmmode \le\else $\le$\fi} +\def\minus{\ifmmode -\else $-$\fi} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em. So do +% whichever is larger. +% +\def\dots{% + \leavevmode + \setbox0=\hbox{...}% get width of three periods + \ifdim\wd0 > 1.5em + \dimen0 = \wd0 + \else + \dimen0 = 1.5em + \fi + \hbox to \dimen0{% + \hskip 0pt plus.25fil + .\hskip 0pt plus1fil + .\hskip 0pt plus1fil + .\hskip 0pt plus.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=\endofsentencespacefactor +} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @pounds{} is a sterling sign, which Knuth put in the CM italic font. +% +\def\pounds{{\it\$}} + +% @euro{} comes from a separate font, depending on the current style. +% We use the free feym* fonts from the eurosym package by Henrik +% Theiling, which support regular, slanted, bold and bold slanted (and +% "outlined" (blackboard board, sort of) versions, which we don't need). +% It is available from http://www.ctan.org/tex-archive/fonts/eurosym. +% +% Although only regular is the truly official Euro symbol, we ignore +% that. The Euro is designed to be slightly taller than the regular +% font height. +% +% feymr - regular +% feymo - slanted +% feybr - bold +% feybo - bold slanted +% +% There is no good (free) typewriter version, to my knowledge. +% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. +% Hmm. +% +% Also doesn't work in math. Do we need to do math with euro symbols? +% Hope not. +% +% +\def\euro{{\eurofont e}} +\def\eurofont{% + % We set the font at each command, rather than predefining it in + % \textfonts and the other font-switching commands, so that + % installations which never need the symbol don't have to have the + % font installed. + % + % There is only one designed size (nominal 10pt), so we always scale + % that to the current nominal size. + % + % By the way, simply using "at 1em" works for cmr10 and the like, but + % does not work for cmbx10 and other extended/shrunken fonts. + % + \def\eurosize{\csname\curfontsize nominalsize\endcsname}% + % + \ifx\curfontstyle\bfstylename + % bold: + \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize + \else + % regular: + \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize + \fi + \thiseurofont +} + +% Glyphs from the EC fonts. We don't use \let for the aliases, because +% sometimes we redefine the original macro, and the alias should reflect +% the redefinition. +% +% Use LaTeX names for the Icelandic letters. +\def\DH{{\ecfont \char"D0}} % Eth +\def\dh{{\ecfont \char"F0}} % eth +\def\TH{{\ecfont \char"DE}} % Thorn +\def\th{{\ecfont \char"FE}} % thorn +% +\def\guillemetleft{{\ecfont \char"13}} +\def\guillemotleft{\guillemetleft} +\def\guillemetright{{\ecfont \char"14}} +\def\guillemotright{\guillemetright} +\def\guilsinglleft{{\ecfont \char"0E}} +\def\guilsinglright{{\ecfont \char"0F}} +\def\quotedblbase{{\ecfont \char"12}} +\def\quotesinglbase{{\ecfont \char"0D}} +% +% This positioning is not perfect (see the ogonek LaTeX package), but +% we have the precomposed glyphs for the most common cases. We put the +% tests to use those glyphs in the single \ogonek macro so we have fewer +% dummy definitions to worry about for index entries, etc. +% +% ogonek is also used with other letters in Lithuanian (IOU), but using +% the precomposed glyphs for those is not so easy since they aren't in +% the same EC font. +\def\ogonek#1{{% + \def\temp{#1}% + \ifx\temp\macrocharA\Aogonek + \else\ifx\temp\macrochara\aogonek + \else\ifx\temp\macrocharE\Eogonek + \else\ifx\temp\macrochare\eogonek + \else + \ecfont \setbox0=\hbox{#1}% + \ifdim\ht0=1ex\accent"0C #1% + \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% + \fi + \fi\fi\fi\fi + }% +} +\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} +\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} +\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} +\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} +% +% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. +\def\ecfont{% + % We can't distinguish serif/sans and italic/slanted, but this + % is used for crude hacks anyway (like adding French and German + % quotes to documents typeset with CM, where we lose kerning), so + % hopefully nobody will notice/care. + \edef\ecsize{\csname\curfontsize ecsize\endcsname}% + \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% + \ifmonospace + % typewriter: + \font\thisecfont = ectt\ecsize \space at \nominalsize + \else + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \fi + \thisecfont +} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% @textdegree - the normal degrees sign. +% +\def\textdegree{$^\circ$} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\thisisundefined +\def\Orb{\mathhexbox20D} +\fi + +% Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" +\chardef\quoteleft=`\` +\chardef\quoteright=`\' + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{% + \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +% Settings used for typesetting titles: no hyphenation, no indentation, +% don't worry much about spacing, ragged right. This should be used +% inside a \vbox, and fonts need to be set appropriately first. Because +% it is always used for titles, nothing else, we call \rmisbold. \par +% should be specified before the end of the \vbox, since a vbox is a group. +% +\def\raggedtitlesettings{% + \rmisbold + \hyphenpenalty=10000 + \parindent=0pt + \tolerance=5000 + \ptexraggedright +} + +% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\parseargdef\title{% + \checkenv\titlepage + \vbox{\titlefonts \raggedtitlesettings #1\par}% + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\secfonts\rmisbold \leftline{#1}}% + \fi +} + + +% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -12pt + \global\advance\vsize by -12pt +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + +% @evenheadingmarks top \thischapter <- chapter at the top of a page +% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page +% +% The same set of arguments for: +% +% @oddheadingmarks +% @evenfootingmarks +% @oddfootingmarks +% @everyheadingmarks +% @everyfootingmarks + +\def\evenheadingmarks{\headingmarks{even}{heading}} +\def\oddheadingmarks{\headingmarks{odd}{heading}} +\def\evenfootingmarks{\headingmarks{even}{footing}} +\def\oddfootingmarks{\headingmarks{odd}{footing}} +\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} + \headingmarks{odd}{heading}{#1} } +\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} + \headingmarks{odd}{footing}{#1} } +% #1 = even/odd, #2 = heading/footing, #3 = top/bottom. +\def\headingmarks#1#2#3 {% + \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname + \global\expandafter\let\csname get#1#2marks\endcsname \temp +} + +\everyheadingmarks bottom +\everyfootingmarks bottom + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\headingsoff{% non-global headings elimination + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% +} + +\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting +\HEADINGSoff % it's the default + +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\thisisundefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil\relax + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. However, if + % what follows is an environment such as @example, there will be no + % \parskip glue; then the negative vskip we just inserted would + % cause the example and the item to crash together. So we use this + % bizarre value of 10001 as a signal to \aboveenvbreak to insert + % \parskip glue after all. Section titles are handled this way also. + % + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablecheck{table}% +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablecheck{ftable}% +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablecheck{vtable}% +} +\def\tablecheck#1{% + \ifnum \the\catcode`\^^M=\active + \endgroup + \errmessage{This command won't work in this context; perhaps the problem is + that we are \inenvironment\thisenv}% + \def\next{\doignore{#1}}% + \else + \let\next\tablex + \fi + \next +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + % + % Try typesetting the item mark that if the document erroneously says + % something like @itemize @samp (intending @table), there's an error + % right away at the @itemize. It's not the best error message in the + % world, but it's better than leaving it to the @item. This means if + % the user wants an empty mark, they have to say @w{} not just @w. + \def\itemcontents{#1}% + \setbox0 = \hbox{\itemcontents}% + % + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + % + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + % + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. \everycr resets \everytab so we don't have to +% undo it ourselves. +\def\headitemfont{\b}% for people to use in the template row; not changeable +\def\headitem{% + \checkenv\multitable + \crcr + \global\everytab={\bf}% can't use \headitemfont since the parsing differs + \the\everytab % for the first item +}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we again encounter the problem the 1sp was intended to solve. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + % We use \def instead of \let so that if one of the multitable entries + % contains an @itemize, we don't choke on the \item (seen as \crcr aka + % \endtemplate) expanding \doitemize. + \def\item{\crcr}% + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +% Test to see if parskip is larger than space between lines of +% table. If not, do nothing. +% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \obeylines + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore{#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the command name as a string, e.g., `ifinfo'. + % + % Define a command to find the next `@end #1'. + \long\def\doignoretext##1^^M@end #1{% + \doignoretextyyy##1^^M@#1\_STOP_}% + % + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +{ \obeylines% + % Ignore anything after the last `@end #1'; this matters in verbatim + % environments, where otherwise the newline after an ignored conditional + % would result in a blank line in the output. + \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% +} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\normaldash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end executes the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written +% without the @) is in fact defined. We can only feasibly check at the +% TeX level, so something like `mathcode' is going to considered +% defined even though it is not a Texinfo command. +% +\makecond{ifcommanddefined} +\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} +% +\def\doifcmddefined#1#2{{% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname #2\endcsname\relax + #1% If not defined, \let\next as above. + \fi + \expandafter + }\next +} +\def\ifcmddefinedfail{\doignore{ifcommanddefined}} + +% @ifcommandnotdefined CMD ... handled similar to @ifclear above. +\makecond{ifcommandnotdefined} +\def\ifcommandnotdefined{% + \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} +\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} + +% Set the `txicommandconditionals' variable, so documents have a way to +% test if the @ifcommand...defined conditionals are available. +\set txicommandconditionals + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within macros and \if's. +\edef\newwrite{\makecsname{ptexnewwrite}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \relax + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \escapechar = `\\ % use backslash in output files. + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % + % Need these unexpandable (because we define \tt as a dummy) + % definitions when @{ or @} appear in index entry text. Also, more + % complicated, when \tex is in effect and \{ is a \delimiter again. + % We can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. Perhaps we + % should define @lbrace and @rbrace commands a la @comma. + \def\{{{\tt\char123}}% + \def\}{{\tt\char125}}% + % + % I don't entirely understand this, but when an index entry is + % generated from a macro call, the \endinput which \scanmacro inserts + % causes processing to be prematurely terminated. This is, + % apparently, because \indexsorttmp is fully expanded, and \endinput + % is an expandable command. The redefinition below makes \endinput + % disappear altogether for that purpose -- although logging shows that + % processing continues to some further point. On the other hand, it + % seems \endinput does not hurt in the printed index arg, since that + % is still getting written without apparent harm. + % + % Sample source (mac-idx3.tex, reported by Graham Percival to + % help-texinfo, 22may06): + % @macro funindex {WORD} + % @findex xyz + % @end macro + % ... + % @funindex commtest + % + % The above is not enough to reproduce the bug, but it gives the flavor. + % + % Sample whatsit resulting: + % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} + % + % So: + \let\endinput = \empty + % + % Do the redefinitions. + \commondummies +} + +% For the aux and toc files, @ is the escape character. So we want to +% redefine everything using @ as the escape character (instead of +% \realbackslash, still used for index files). When everything uses @, +% this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % Do the redefinitions. + \commondummies + \otherbackslash +} + +% Called from \indexdummies and \atdummies. +% +\def\commondummies{% + % + % \definedummyword defines \#1 as \string\#1\space, thus effectively + % preventing its expansion. This is used only for control words, + % not control letters, because the \space would be incorrect for + % control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword ##1{\def##1{\string##1\space}}% + \def\definedummyletter##1{\def##1{\string##1}}% + \let\definedummyaccent\definedummyletter + % + \commondummiesnofonts + % + \definedummyletter\_% + \definedummyletter\-% + % + % Non-English letters. + \definedummyword\AA + \definedummyword\AE + \definedummyword\DH + \definedummyword\L + \definedummyword\O + \definedummyword\OE + \definedummyword\TH + \definedummyword\aa + \definedummyword\ae + \definedummyword\dh + \definedummyword\exclamdown + \definedummyword\l + \definedummyword\o + \definedummyword\oe + \definedummyword\ordf + \definedummyword\ordm + \definedummyword\questiondown + \definedummyword\ss + \definedummyword\th + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword\bf + \definedummyword\gtr + \definedummyword\hat + \definedummyword\less + \definedummyword\sf + \definedummyword\sl + \definedummyword\tclose + \definedummyword\tt + % + \definedummyword\LaTeX + \definedummyword\TeX + % + % Assorted special characters. + \definedummyword\arrow + \definedummyword\bullet + \definedummyword\comma + \definedummyword\copyright + \definedummyword\registeredsymbol + \definedummyword\dots + \definedummyword\enddots + \definedummyword\entrybreak + \definedummyword\equiv + \definedummyword\error + \definedummyword\euro + \definedummyword\expansion + \definedummyword\geq + \definedummyword\guillemetleft + \definedummyword\guillemetright + \definedummyword\guilsinglleft + \definedummyword\guilsinglright + \definedummyword\lbracechar + \definedummyword\leq + \definedummyword\minus + \definedummyword\ogonek + \definedummyword\pounds + \definedummyword\point + \definedummyword\print + \definedummyword\quotedblbase + \definedummyword\quotedblleft + \definedummyword\quotedblright + \definedummyword\quoteleft + \definedummyword\quoteright + \definedummyword\quotesinglbase + \definedummyword\rbracechar + \definedummyword\result + \definedummyword\textdegree + % + % We want to disable all macros so that they are not expanded by \write. + \macrolist + % + \normalturnoffactive + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +\def\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter\!% + \definedummyaccent\"% + \definedummyaccent\'% + \definedummyletter\*% + \definedummyaccent\,% + \definedummyletter\.% + \definedummyletter\/% + \definedummyletter\:% + \definedummyaccent\=% + \definedummyletter\?% + \definedummyaccent\^% + \definedummyaccent\`% + \definedummyaccent\~% + \definedummyword\u + \definedummyword\v + \definedummyword\H + \definedummyword\dotaccent + \definedummyword\ogonek + \definedummyword\ringaccent + \definedummyword\tieaccent + \definedummyword\ubaraccent + \definedummyword\udotaccent + \definedummyword\dotless + % + % Texinfo font commands. + \definedummyword\b + \definedummyword\i + \definedummyword\r + \definedummyword\sansserif + \definedummyword\sc + \definedummyword\slanted + \definedummyword\t + % + % Commands that take arguments. + \definedummyword\abbr + \definedummyword\acronym + \definedummyword\anchor + \definedummyword\cite + \definedummyword\code + \definedummyword\command + \definedummyword\dfn + \definedummyword\dmn + \definedummyword\email + \definedummyword\emph + \definedummyword\env + \definedummyword\file + \definedummyword\image + \definedummyword\indicateurl + \definedummyword\inforef + \definedummyword\kbd + \definedummyword\key + \definedummyword\math + \definedummyword\option + \definedummyword\pxref + \definedummyword\ref + \definedummyword\samp + \definedummyword\strong + \definedummyword\tie + \definedummyword\uref + \definedummyword\url + \definedummyword\var + \definedummyword\verb + \definedummyword\w + \definedummyword\xref +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{\let##1\asis}% + % We can just ignore other control letters. + \def\definedummyletter##1{\let##1\empty}% + % All control words become @asis by default; overrides below. + \let\definedummyword\definedummyaccent + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + \def\_{\normalunderscore}% + \def\-{}% @- shouldn't affect sorting + % + % Unfortunately, texindex is not prepared to handle braces in the + % content at all. So for index sorting, we map @{ and @} to strings + % starting with |, since that ASCII character is between ASCII { and }. + \def\{{|a}% + \def\lbracechar{|a}% + % + \def\}{|b}% + \def\rbracechar{|b}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\DH{DZZ}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\TH{ZZZ}% + \def\aa{aa}% + \def\ae{ae}% + \def\dh{dzz}% + \def\exclamdown{!}% + \def\l{l}% + \def\oe{oe}% + \def\ordf{a}% + \def\ordm{o}% + \def\o{o}% + \def\questiondown{?}% + \def\ss{ss}% + \def\th{zzz}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\arrow{->}% + \def\bullet{bullet}% + \def\comma{,}% + \def\copyright{copyright}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\euro{euro}% + \def\expansion{==>}% + \def\geq{>=}% + \def\guillemetleft{<<}% + \def\guillemetright{>>}% + \def\guilsinglleft{<}% + \def\guilsinglright{>}% + \def\leq{<=}% + \def\minus{-}% + \def\point{.}% + \def\pounds{pounds}% + \def\print{-|}% + \def\quotedblbase{"}% + \def\quotedblleft{"}% + \def\quotedblright{"}% + \def\quoteleft{`}% + \def\quoteright{'}% + \def\quotesinglbase{,}% + \def\registeredsymbol{R}% + \def\result{=>}% + \def\textdegree{o}% + % + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax + \else \indexlquoteignore \fi + % + % We need to get rid of all macros, leaving only the arguments (if present). + % Of course this is not nearly correct, but it is the best we can do for now. + % makeinfo does not expand macros in the argument to @deffn, which ends up + % writing an index entry, and texindex isn't prepared for an index sort entry + % that starts with \. + % + % Since macro invocations are followed by braces, we can just redefine them + % to take a single TeX argument. The case of a macro invocation that + % goes to end-of-line is not handled. + % + \macrolist +} + +% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us +% ignore left quotes in the sort term. +{\catcode`\`=\active + \gdef\indexlquoteignore{\let`=\empty}} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \safewhatsit\dosubindwrite + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks/skips around a whatsit: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write or \pdfdest will make \lastskip zero. The result is that +% sequences like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +\newskip\whatsitskip +\newcount\whatsitpenalty +% +% ..., ready, GO: +% +\def\safewhatsit#1{\ifhmode + #1% + \else + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \whatsitskip = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \whatsitpenalty = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\whatsitskip glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\whatsitskip + \fi + % + #1% + % + \ifx\lastskipmacro\zeroskipmacro + % If \lastskip was zero, perhaps the last item was a penalty, and + % perhaps it was >=10000, e.g., a \nobreak. In that case, we want + % to re-insert the same penalty (values >10000 are used for various + % signals); since we just inserted a non-discardable item, any + % following glue (such as a \parskip) would be a breakpoint. For example: + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\whatsitskip + \fi +\fi} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \plainfrenchspacing + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \nobreak + \vskip 0pt plus 3\baselineskip + \penalty 0 + \vskip 0pt plus -3\baselineskip + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + % Do our best not to break after the initial. + \nobreak + \vskip .33\baselineskip plus .1\baselineskip +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this freezes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % When reading the text of entry, convert explicit line breaks + % from @* into spaces. The user might give these in long section + % titles, for instance. + \def\*{\unskip\space\ignorespaces}% + \def\entrybreak{\hfil\break}% + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\entrybreak{\unskip\space\ignorespaces}% +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \setbox\boxA = \hbox{#1}% + \ifdim\wd\boxA = 0pt + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like plain.tex's \dotfill, except uses up at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + % The following penalty ensures that the page builder is exercised + % _before_ we change the output routine. This is necessary in the + % following situation: + % + % The last section of the index consists only of a single entry. + % Before this section, \pagetotal is less than \pagegoal, so no + % break occurs before the last section starts. However, the last + % section, consisting of \initial and the single \entry, does not + % fit on the page and has to be broken off. Without the following + % penalty the page builder will not be exercised until \eject + % below, and by that time we'll already have changed the output + % routine to the \balancecolumns version, so the next-to-last + % double-column page will be processed with \balancecolumns, which + % is wrong: The two columns will go to the main vertical list, with + % the broken-off section in the recent contributions. As soon as + % the output routine finishes, TeX starts reconsidering the page + % break. The two columns and the broken-off section both fit on the + % page, because the two columns now take up only half of the page + % goal. When TeX sees \eject from below which follows the final + % section, it invokes the new output routine that we've set after + % \balancecolumns below; \onepageout will try to fit the two columns + % and the final section into the vbox of \pageheight (see + % \pagebody), causing an overfull box. + % + % Note that glue won't work here, because glue does not exercise the + % page builder, unlike penalties (see The TeXbook, pp. 280-281). + \penalty0 + % + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% Let's start with @part. +\outer\parseargdef\part{\partzzz{#1}} +\def\partzzz#1{% + \chapoddpage + \null + \vskip.3\vsize % move it down on the page a bit + \begingroup + \noindent \titlefonts\rmisbold #1\par % the text + \let\lastnode=\empty % no node to associate with + \writetocentry{part}{#1}{}% but put it in the toc + \headingsoff % no headline or footline on the part page + \chapoddpage + \endgroup +} + +% \unnumberedno is an oxymoron. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines these (using marks) as the number+name, number +% and name of the chapter. Page headings and footings can use +% these. @section does likewise. +\def\thischapter{} +\def\thischapternum{} +\def\thischaptername{} +\def\thissection{} +\def\thissectionnum{} +\def\thissectionname{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achieve this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unnlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unnlevel + \chardef\unnlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unnlevel + \def\headtype{U}% + \else + \chardef\unnlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + % \putwordChapter can contain complex things in translations. + \toks0=\expandafter{\putwordChapter}% + \message{\the\toks0 \space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz +% +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + % \putwordAppendix can contain complex things in translations. + \toks0=\expandafter{\putwordAppendix}% + \message{\the\toks0 \space \appendixletter}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +% normally unnmhead0 calls unnumberedzzz: +\outer\parseargdef\unnumbered{\unnmhead0{#1}} +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +% +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +% normally calls appendixsectionzzz: +\outer\parseargdef\appendixsection{\apphead1{#1}} +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +% normally calls unnumberedseczzz: +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +% +% normally calls numberedsubseczzz: +\outer\parseargdef\numberedsubsec{\numhead2{#1}} +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +% normally calls appendixsubseczzz: +\outer\parseargdef\appendixsubsec{\apphead2{#1}} +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +% normally calls unnumberedsubseczzz: +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +% +% normally numberedsubsubseczzz: +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% normally appendixsubsubseczzz: +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% normally unnumberedsubsubseczzz: +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip \nobreak + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +% Parameter controlling skip before chapter headings (if needed) +\newskip\chapheadingskip + +% Define plain chapter starts, and page on/off switching for it. +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +% Because \domark is called before \chapoddpage, the filler page will +% get the headings for the next chapter, which is wrong. But we don't +% care -- we just disable all headings on the filler page. +\def\chapoddpage{% + \chappager + \ifodd\pageno \else + \begingroup + \headingsoff + \null + \chappager + \endgroup + \fi +} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + % Insert the first mark before the heading break (see notes for \domark). + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% + \gdef\thissection{}}% + % + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{\thischaptername}}% + \else\ifx\temptype\Yomitfromtockeyword + \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% + \gdef\thischapter{}}% + \else\ifx\temptype\Yappendixkeyword + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\appendixletter}% + % \noexpand\putwordAppendix avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \else + \toks0={#1}% + \xdef\lastchapterdefs{% + \gdef\noexpand\thischaptername{\the\toks0}% + \gdef\noexpand\thischapternum{\the\chapno}% + % \noexpand\putwordChapter avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordChapter{} + \noexpand\thischapternum: + \noexpand\thischaptername}% + }% + \fi\fi\fi + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert the chapter heading break. + \pchapsepmacro + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevchapterdefs=\lastchapterdefs + \let\prevsectiondefs=\lastsectiondefs + \domark + % + {% + \chapfonts \rmisbold + % + % Have to define \lastsection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\lastsection{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \nobreak % Avoid page breaks at the interline glue. + \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% + \chapoddpage + \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% + \nobreak\bigskip \nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\seckeyword{sec} +% +\def\sectionheading#1#2#3#4{% + {% + \checkenv{}% should not be in an environment. + % + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rmisbold + % + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % Insert first mark before the heading break (see notes for \domark). + \let\prevsectiondefs=\lastsectiondefs + \ifx\temptype\Ynothingkeyword + \ifx\sectionlevel\seckeyword + \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% + \gdef\thissection{\thissectionname}}% + \fi + \else\ifx\temptype\Yomitfromtockeyword + % Don't redefine \thissection. + \else\ifx\temptype\Yappendixkeyword + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \else + \ifx\sectionlevel\seckeyword + \toks0={#1}% + \xdef\lastsectiondefs{% + \gdef\noexpand\thissectionname{\the\toks0}% + \gdef\noexpand\thissectionnum{#4}% + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% + }% + \fi + \fi\fi\fi + % + % Go into vertical mode. Usually we'll already be there, but we + % don't want the following whatsit to end up in a preceding paragraph + % if the document didn't happen to have a blank line. + \par + % + % Output the mark. Pass it through \safewhatsit, to take care of + % the preceding space. + \safewhatsit\domark + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Now the second mark, after the heading break. No break points + % between here and the heading. + \let\prevsectiondefs=\lastsectiondefs + \domark + % + % Only insert the space after the number if we have a section number. + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\lastsection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \lastsection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\lastsection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\lastsection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chapmacro. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chapmacro. + \donoderef{#3}% + % + % Interline glue will be inserted when the vbox is completed. + % That glue will be a valid breakpoint for the page, since it'll be + % preceded by a whatsit (usually from the \donoderef, or from the + % \writetocentry if there was no node). We don't want to allow that + % break, since then the whatsits could end up on page n while the + % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. + \nobreak + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) However, when a paragraph is not started next + % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out + % or the negative glue will cause weirdly wrong output, typically + % obscuring the section heading with something else. + \vskip-\parskip + % + % This is so the last item on the main vertical list is a known + % \penalty > 10000, so \startdefun, etc., can recognize the situation + % and do the needful. + \penalty 10001 +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + {\atdummies + \edef\temp{% + \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% + \temp + }% + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + + +% These characters do not print properly in the Computer Modern roman +% fonts, so we must take special care. This is more or less redundant +% with the Texinfo input format setup at the end of this file. +% +\def\activecatcodes{% + \catcode`\"=\active + \catcode`\$=\active + \catcode`\<=\active + \catcode`\>=\active + \catcode`\\=\active + \catcode`\^=\active + \catcode`\_=\active + \catcode`\|=\active + \catcode`\~=\active +} + + +% Read the toc file, which is essentially Texinfo input. +\def\readtocfile{% + \setupdatafile + \activecatcodes + \input \tocreadfilename +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + +% redefined for the two-volume lispref. We always output on +% \jobname.toc even if this is redefined. +% +\def\tocreadfilename{\jobname.toc} + +% Normal (long) toc. +% +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\partentry = \shortpartentry + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \tocreadfilename\space + \ifeof 1 \else + \readtocfile + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Parts, in the main contents. Replace the part number, which doesn't +% exist, with an empty box. Let's hope all the numbers have the same width. +% Also ignore the page number, which is conventionally not printed. +\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} +\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} +% +% Parts, in the short toc. +\def\shortpartentry#1#2#3#4{% + \penalty-300 + \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip + \shortchapentry{{\bf #1}}{\numeralbox}{}{}% +} + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @tex ... @end tex escapes into raw TeX temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain @ character. + +\envdef\tex{% + \setupmarkupstyle{tex}% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \catcode`\`=\other + \catcode`\'=\other + \escapechar=`\\ + % + % ' is active in math mode (mathcode"8000). So reset it, and all our + % other math active characters (just in case), to plain's definitions. + \mathactive + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + \expandafter \let\csname top\endcsname=\ptextop % outer + \let\frenchspacing=\plainfrenchspacing + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will +% also clear it, so that its embedded environments do the narrowing again. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing = t% + % + % If this cartouche directly follows a sectioning command, we need the + % \parskip glue (backspaced over by default) or the cartouche can + % collide with the section heading. + \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi + % + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\newdimen\nonfillparindent +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + % Turn off paragraph indentation but redefine \indent to emulate + % the normal \indent. + \nonfillparindent=\parindent + \parindent = 0pt + \let\indent\nonfillindent + % + \emergencystretch = 0pt % don't try to avoid overfull boxes + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \else + \let\nonarrowing = \relax + \fi + \let\exdent=\nofillexdent +} + +\begingroup +\obeyspaces +% We want to swallow spaces (but not other tokens) after the fake +% @indent in our nonfill-environments, where spaces are normally +% active and set to @tie, resulting in them not being ignored after +% @indent. +\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% +\gdef\nonfillindentcheck{% +\ifx\temp % +\expandafter\nonfillindentgobble% +\else% +\leavevmode\nonfillindentbox% +\fi% +}% +\endgroup +\def\nonfillindentgobble#1{\nonfillindent} +\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + % end paragraph for sake of leading, in case document has no blank + % line. This is redundant with what happens in \aboveenvbreak, but + % we need to do it before changing the fonts, and it's inconvenient + % to change the fonts afterward. + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \ifnum \lastpenalty=10000 \else \endgraf \fi + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it in one command. #1 is the env name, #2 the definition. +\def\makedispenvdef#1#2{% + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two environment synonyms (#1 and #2) for an environment. +\def\maketwodispenvdef#1#2#3{% + \makedispenvdef{#1}{#3}% + \makedispenvdef{#2}{#3}% +} +% +% @lisp: indented, narrowed, typewriter font; +% @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvdef{lisp}{example}{% + \nonfillstart + \tt\setupmarkupstyle{example}% + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenvdef{display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenvdef{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill\relax + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @raggedright does more-or-less normal line breaking but no right +% justification. From plain.tex. +\envdef\raggedright{% + \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax +} +\let\Eraggedright\par + +\envdef\raggedleft{% + \parindent=0pt \leftskip0pt plus2em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedleft\par + +\envdef\raggedcenter{% + \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em + \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt + \hbadness=10000 % Last line will usually be underfull, so turn off + % badness reporting. +} +\let\Eraggedcenter\par + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\makedispenvdef{quotation}{\quotationstart} +% +\def\quotationstart{% + \indentedblockstart % same as \indentedblock, but increase right margin too. + \ifx\nonarrowing\relax + \advance\rightskip by \lispnarrowing + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\thisisundefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallquotation{\Equotation} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + +% @indentedblock is like @quotation, but indents only on the left and +% has no optional argument. +% +\makedispenvdef{indentedblock}{\indentedblockstart} +% +\def\indentedblockstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi +} + +% Keep a nonzero parskip for the environment, since we're doing normal filling. +% +\def\Eindentedblock{% + \par + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallindentedblock{\Eindentedblock} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% + % Don't do the quotes -- if we do, @set txicodequoteundirected and + % @set txicodequotebacktick will not have effect on @verb and + % @verbatim, and ?` and !` ligatures won't get disabled. + %\do\`\do\'% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \setupmarkupstyle{verb}% + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion. +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +% We typeset each line of the verbatim in an \hbox, so we can handle +% tabs. The \global is in case the verbatim line starts with an accent, +% or some other command that starts with a begin-group. Otherwise, the +% entire \verbbox would disappear at the corresponding end-group, before +% it is typeset. Meanwhile, we can't have nested verbatim commands +% (can we?), so the \global won't be overwriting itself. +\newbox\verbbox +\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} +% +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab + \divide\dimen\verbbox by\tabw + \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw + \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw + \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox + }% + } +\endgroup + +% start the verbatim environment. +\def\setupverbatim{% + \let\nonarrowing = t% + \nonfillstart + \tt % easiest (and conventionally used) font for verbatim + % The \leavevmode here is for blank lines. Otherwise, we would + % never \starttabox and the \egroup would end verbatim mode. + \def\par{\leavevmode\egroup\box\verbbox\endgraf}% + \tabexpand + \setupmarkupstyle{verbatim}% + % Respect line breaks, + % print special symbols as themselves, and + % make each space count. + % Must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \indexnofonts % Allow `@@' and other weird things in file names. + \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% +\def\insertcopying{% + \begingroup + \parindent = 0pt % paragraph indentation looks wrong on title page + \scanexp\copyingtext + \endgroup +} + + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt +\newcount\defunpenalty + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \defunpenalty=10003 % Will keep this @deffn together with the + % following @def command, see below. + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check specifically for penalty 10002, inserted + % by \printdefunline, instead of 10000, since the sectioning + % commands also insert a nobreak penalty, and we don't want to allow + % a break between a section heading and a defun. + % + % As a further refinement, we avoid "club" headers by signalling + % with penalty of 10003 after the very first @deffn in the + % sequence (see above), and penalty of 10002 after any following + % @def command. + \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil\relax + \endgraf + \nobreak\vskip -\parskip + \penalty\defunpenalty % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remaining is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \doingtypefnfalse % distinguish typed functions from all else + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +\newif\ifdoingtypefn % doing typed function? +\newif\ifrettypeownline % typeset return type on its own line? + +% @deftypefnnewline on|off says whether the return type of typed functions +% are printed on their own line. This affects @deftypefn, @deftypefun, +% @deftypeop, and @deftypemethod. +% +\parseargdef\deftypefnnewline{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETtxideftypefnnl\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @txideftypefnnl value `\temp', + must be on|off}% + \fi\fi +} + +% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \doingtypefntrue + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +% Types: + +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + \par + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % Determine if we are typesetting the return type of a typed function + % on a line by itself. + \rettypeownlinefalse + \ifdoingtypefn % doing a typed function specifically? + % then check user option for putting return type on its own line: + \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else + \rettypeownlinetrue + \fi + \fi + % + % How we'll format the category name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. We'll always have at + % least two. + \tempnum = 2 + % + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % + % If doing a return type on its own line, we'll have another line. + \ifrettypeownline + \advance\tempnum by 1 + \def\maybeshapeline{0in \hsize}% + \else + \def\maybeshapeline{}% + \fi + % + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % + % The final paragraph shape: + \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 + % + % Put the category name at the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% text of the return type + \ifx\temp\empty\else + \tclose{\temp}% typeset the return type + \ifrettypeownline + % put return type on its own line; prohibit line break following: + \hfil\vadjust{\nobreak}\break + \else + \space % type on same line, so just followed by a space + \fi + \fi % no return type + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. We used to recommend @var for that, so + % leave the code in, but it's strange for @var to lead to typewriter. + % Nowadays we recommend @code, since the difference between a ttsl hyphen + % and a tt hyphen is pretty tiny. @code also disables ?` !`. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +% these should not use \errmessage; the glibc manual, at least, actually +% has such constructs (when documenting function pointers). +\def\badparencount{% + \message{Warning: unbalanced parentheses in @def...}% + \global\parencount=0 +} +\def\badbrackcount{% + \message{Warning: unbalanced square brackets in @def...}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\thisisundefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{\begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % + % Undo catcode changes of \startcontents and \doprintindex + % When called from @insertcopying or (short)caption, we need active + % backslash to get it printed correctly. Previously, we had + % \catcode`\\=\other instead. We'll see whether a problem appears + % with macro expansion. --kasal, 19aug04 + \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % + % ... and for \example: + \spaceisspace + % + % The \empty here causes a following catcode 5 newline to be eaten as + % part of reading whitespace after a control sequence. It does not + % eat a catcode 13 newline. There's no good way to handle the two + % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX + % would then have different behavior). See the Macro Details node in + % the manual for the workaround we recommend for macros and + % line-oriented commands. + % + \scantokens{#1\empty}% +\endgroup} + +\def\scanexp#1{% + \edef\temp{\noexpand\scanmacro{#1}}% + \temp +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? + +% List of all defined macros in the form +% \definedummyword\macro1\definedummyword\macro2... +% Currently is also contains all @aliases; the list can be split +% if there is a need. +\def\macrolist{} + +% Add the macro to \macrolist +\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} +\def\addtomacrolistxxx#1{% + \toks0 = \expandafter{\macrolist\definedummyword#1}% + \xdef\macrolist{\the\toks0}% +} + +% Utility routines. +% This does \let #1 = #2, with \csnames; that is, +% \let \csname#1\endcsname = \csname#2\endcsname +% (except of course we have to play expansion games). +% +\def\cslet#1#2{% + \expandafter\let + \csname#1\expandafter\endcsname + \csname#2\endcsname +} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \ +% to recognize macro arguments; this is the job of \mbodybackslash. +% +% Non-ASCII encodings make 8-bit characters active, so un-activate +% them to avoid their expansion. Must do this non-globally, to +% confine the change to the current group. +% +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. +% +\def\scanctxt{% used as subroutine + \catcode`\"=\other + \catcode`\+=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\@=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\~=\other + \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +} + +\def\scanargctxt{% used for copying and captions, not macros. + \scanctxt + \catcode`\\=\other + \catcode`\^^M=\other +} + +\def\macrobodyctxt{% used for @macro definitions + \scanctxt + \catcode`\{=\other + \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash +} + +\def\macroargctxt{% used when scanning invocations + \scanctxt + \catcode`\\=0 +} +% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" +% for the single characters \ { }. Thus, we end up with the "commands" +% that would be written @\ @{ @} in a Texinfo document. +% +% We already have @{ and @}. For @\, we define it here, and only for +% this purpose, to produce a typewriter backslash (so, the @\ that we +% define for @math can't be used with @macro calls): +% +\def\\{\normalbackslash}% +% +% We would like to do this for \, too, since that is what makeinfo does. +% But it is not possible, because Texinfo already has a command @, for a +% cedilla accent. Documents must use @comma{} instead. +% +% \anythingelse will almost certainly be an error of some kind. + + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. +% +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\margbackslash#1{\char`\#1 } + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0\relax + \else + \expandafter\parsemargdef \argl;% + \if\paramno>256\relax + \ifx\eTeXversion\thisisundefined + \errhelp = \EMsimple + \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} + \fi + \fi + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + \addtomacrolist{\the\macname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\definedummyword\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx #1\relax + % remove this + \else + \noexpand\definedummyword \noexpand#1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname#1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% For macro processing make @ a letter so that we can make Texinfo private macro names. +\edef\texiatcatcode{\the\catcode`\@} +\catcode `@=11\relax + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH +% in the params list to some hook where the argument si to be expanded. If +% there are less than 10 arguments that hook is to be replaced by ##N where N +% is the position in that list, that is to say the macro arguments are to be +% defined `a la TeX in the macro body. +% +% That gets used by \mbodybackslash (above). +% +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. +% +% If there are 10 or more arguments, a different technique is used, where the +% hook remains in the body, and when macro is to be expanded the body is +% processed again to replace the arguments. +% +% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the +% argument N value and then \edef the body (nothing else will expand because of +% the catcode regime underwhich the body was input). +% +% If you compile with TeX (not eTeX), and you have macros with 10 or more +% arguments, you need that no macro has more than 256 arguments, otherwise an +% error is produced. +\def\parsemargdef#1;{% + \paramno=0\def\paramlist{}% + \let\hash\relax + \let\xeatspaces\relax + \parsemargdefxxx#1,;,% + % In case that there are 10 or more arguments we parse again the arguments + % list to set new definitions for the \macarg.BLAH macros corresponding to + % each BLAH argument. It was anyhow needed to parse already once this list + % in order to count the arguments, and as macros with at most 9 arguments + % are by far more frequent than macro with 10 or more arguments, defining + % twice the \macarg.BLAH macros does not cost too much processing power. + \ifnum\paramno<10\relax\else + \paramno0\relax + \parsemmanyargdef@@#1,;,% 10 or more arguments + \fi +} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1 + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +\def\parsemmanyargdef@@#1,{% + \if#1;\let\next=\relax + \else + \let\next=\parsemmanyargdef@@ + \edef\tempb{\eatspaces{#1}}% + \expandafter\def\expandafter\tempa + \expandafter{\csname macarg.\tempb\endcsname}% + % Note that we need some extra \noexpand\noexpand, this is because we + % don't want \the to be expanded in the \parsermacbody as it uses an + % \xdef . + \expandafter\edef\tempa + {\noexpand\noexpand\noexpand\the\toks\the\paramno}% + \advance\paramno by 1\relax + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) +% + +\catcode `\@\texiatcatcode +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\catcode `\@=11\relax + +\let\endargs@\relax +\let\nil@\relax +\def\nilm@{\nil@}% +\long\def\nillm@{\nil@}% + +% This macro is expanded during the Texinfo macro expansion, not during its +% definition. It gets all the arguments values and assigns them to macros +% macarg.ARGNAME +% +% #1 is the macro name +% #2 is the list of argument names +% #3 is the list of argument values +\def\getargvals@#1#2#3{% + \def\macargdeflist@{}% + \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. + \def\paramlist{#2,\nil@}% + \def\macroname{#1}% + \begingroup + \macroargctxt + \def\argvaluelist{#3,\nil@}% + \def\@tempa{#3}% + \ifx\@tempa\empty + \setemptyargvalues@ + \else + \getargvals@@ + \fi +} + +% +\def\getargvals@@{% + \ifx\paramlist\nilm@ + % Some sanity check needed here that \argvaluelist is also empty. + \ifx\argvaluelist\nillm@ + \else + \errhelp = \EMsimple + \errmessage{Too many arguments in macro `\macroname'!}% + \fi + \let\next\macargexpandinbody@ + \else + \ifx\argvaluelist\nillm@ + % No more arguments values passed to macro. Set remaining named-arg + % macros to empty. + \let\next\setemptyargvalues@ + \else + % pop current arg name into \@tempb + \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% + \expandafter\@tempa\expandafter{\paramlist}% + % pop current argument value into \@tempc + \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% + \expandafter\@tempa\expandafter{\argvaluelist}% + % Here \@tempb is the current arg name and \@tempc is the current arg value. + % First place the new argument macro definition into \@tempd + \expandafter\macname\expandafter{\@tempc}% + \expandafter\let\csname macarg.\@tempb\endcsname\relax + \expandafter\def\expandafter\@tempe\expandafter{% + \csname macarg.\@tempb\endcsname}% + \edef\@tempd{\long\def\@tempe{\the\macname}}% + \push@\@tempd\macargdeflist@ + \let\next\getargvals@@ + \fi + \fi + \next +} + +\def\push@#1#2{% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter#2% + \expandafter\expandafter\expandafter{% + \expandafter#1#2}% +} + +% Replace arguments by their values in the macro body, and place the result +% in macro \@tempa +\def\macvalstoargs@{% + % To do this we use the property that token registers that are \the'ed + % within an \edef expand only once. So we are going to place all argument + % values into respective token registers. + % + % First we save the token context, and initialize argument numbering. + \begingroup + \paramno0\relax + % Then, for each argument number #N, we place the corresponding argument + % value into a new token list register \toks#N + \expandafter\putargsintokens@\saveparamlist@,;,% + % Then, we expand the body so that argument are replaced by their + % values. The trick for values not to be expanded themselves is that they + % are within tokens and that tokens expand only once in an \edef . + \edef\@tempc{\csname mac.\macroname .body\endcsname}% + % Now we restore the token stack pointer to free the token list registers + % which we have used, but we make sure that expanded body is saved after + % group. + \expandafter + \endgroup + \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% + } + +\def\macargexpandinbody@{% + %% Define the named-macro outside of this group and then close this group. + \expandafter + \endgroup + \macargdeflist@ + % First the replace in body the macro arguments by their values, the result + % is in \@tempa . + \macvalstoargs@ + % Then we point at the \norecurse or \gobble (for recursive) macro value + % with \@tempb . + \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname + % Depending on whether it is recursive or not, we need some tailing + % \egroup . + \ifx\@tempb\gobble + \let\@tempc\relax + \else + \let\@tempc\egroup + \fi + % And now we do the real job: + \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% + \@tempd +} + +\def\putargsintokens@#1,{% + \if#1;\let\next\relax + \else + \let\next\putargsintokens@ + % First we allocate the new token list register, and give it a temporary + % alias \@tempb . + \toksdef\@tempb\the\paramno + % Then we place the argument value into that token list register. + \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname + \expandafter\@tempb\expandafter{\@tempa}% + \advance\paramno by 1\relax + \fi + \next +} + +% Save the token stack pointer into macro #1 +\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} +% Restore the token stack pointer from number in macro #1 +\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} +% newtoks that can be used non \outer . +\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} + +% Tailing missing arguments are set to empty +\def\setemptyargvalues@{% + \ifx\paramlist\nilm@ + \let\next\macargexpandinbody@ + \else + \expandafter\setemptyargvaluesparser@\paramlist\endargs@ + \let\next\setemptyargvalues@ + \fi + \next +} + +\def\setemptyargvaluesparser@#1,#2\endargs@{% + \expandafter\def\expandafter\@tempa\expandafter{% + \expandafter\def\csname macarg.#1\endcsname{}}% + \push@\@tempa\macargdeflist@ + \def\paramlist{#2}% +} + +% #1 is the element target macro +% #2 is the list macro +% #3,#4\endargs@ is the list value +\def\pop@#1#2#3,#4\endargs@{% + \def#1{#3}% + \def#2{#4}% +} +\long\def\longpop@#1#2#3,#4\endargs@{% + \long\def#1{#3}% + \long\def#2{#4}% +} + +% This defines a Texinfo @macro. There are eight cases: recursive and +% nonrecursive macros of zero, one, up to nine, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +% +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else + \ifnum\paramno<10\relax % at most 9 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \else % 10 or more + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble + \fi + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % at most 9 + \ifnum\paramno<10\relax + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % 10 or more: + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\getargvals@{\the\macname}{\argl}% + }% + \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse + \fi + \fi + \fi} + +\catcode `\@\texiatcatcode\relax + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg). +% +\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \macnamexxx} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Make them active and then expand them all to nothing. +% +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \addtomacrolist{#1}% + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{% + \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \lastsection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\lastsection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout + }% + \fi +} + +% @xrefautosectiontitle on|off says whether @section(ing) names are used +% automatically in xrefs, if the third arg is not explicitly specified. +% This was provided as a "secret" @set xref-automatic-section-title +% variable, now it's official. +% +\parseargdef\xrefautomaticsectiontitle{% + \def\temp{#1}% + \ifx\temp\onword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \empty + \else\ifx\temp\offword + \expandafter\let\csname SETxref-automatic-section-title\endcsname + = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', + must be on|off}% + \fi\fi +} + +% +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +% +\newbox\toprefbox +\newbox\printedrefnamebox +\newbox\infofilenamebox +\newbox\printedmanualbox +% +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + % + % Get args without leading/trailing spaces. + \def\printedrefname{\ignorespaces #3}% + \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% + % + \def\infofilename{\ignorespaces #4}% + \setbox\infofilenamebox = \hbox{\infofilename\unskip}% + % + \def\printedmanual{\ignorespaces #5}% + \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% + % + % If the printed reference name (arg #3) was not explicitly given in + % the @xref, figure out what we want to use. + \ifdim \wd\printedrefnamebox = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax + % Not auto section-title: use node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Auto section-title: use chapter/section title inside + % the square brackets if we have it. + \ifdim \wd\printedmanualbox > 0pt + % It is in another manual, so we don't have it; use node name. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We (should) know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + {\indexnofonts + \turnoffactive + \makevalueexpandable + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. This ignores all spaces in + % #4, including (wrongly) those in the middle of the filename. + \getfilename{#4}% + % + % This (wrongly) does not take account of leading or trailing + % spaces in #1, which should be ignored. + \edef\pdfxrefdest{#1}% + \ifx\pdfxrefdest\empty + \def\pdfxrefdest{Top}% no empty targets + \else + \txiescapepdf\pdfxrefdest % escape PDF special chars + \fi + % + \leavevmode + \startlink attr{/Border [0 0 0]}% + \ifnum\filenamelength>0 + goto file{\the\filename.pdf} name{\pdfxrefdest}% + \else + goto name{\pdfmkpgn{\pdfxrefdest}}% + \fi + }% + \setcolor{\linkcolor}% + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd\printedrefnamebox = 0pt + \refx{#1-snt}{}% + \else + \printedrefname + \fi + % + % If the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd\printedmanualbox > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox to print the node names, TeX does not insert + % empty discretionaries after hyphens, which means that it will not + % find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, + % this is a loss. Therefore, we give the text of the node name + % again, so it is as if TeX is seeing it for the first time. + % + \ifdim \wd\printedmanualbox > 0pt + % Cross-manual reference with a printed manual name. + % + \crossmanualxref{\cite{\printedmanual\unskip}}% + % + \else\ifdim \wd\infofilenamebox > 0pt + % Cross-manual reference with only an info filename (arg 4), no + % printed manual name (arg 5). This is essentially the same as + % the case above; we output the filename, since we have nothing else. + % + \crossmanualxref{\code{\infofilename\unskip}}% + % + \else + % Reference within this manual. + % + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via the macro below so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi\fi + \fi + \endlink +\endgroup} + +% Output a cross-manual xref to #1. Used just above (twice). +% +% Only include the text "Section ``foo'' in" if the foo is neither +% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply +% "see The Foo Manual", the idea being to refer to the whole manual. +% +% But, this being TeX, we can't easily compare our node name against the +% string "Top" while ignoring the possible spaces before and after in +% the input. By adding the arbitrary 7sp below, we make it much less +% likely that a real node name would have the same width as "Top" (e.g., +% in a monospaced font). Hopefully it will never happen in practice. +% +% For the same basic reason, we retypeset the "Top" at every +% reference, since the current font is indeterminate. +% +\def\crossmanualxref#1{% + \setbox\toprefbox = \hbox{Top\kern7sp}% + \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% + \ifdim \wd2 > 7sp % nonempty? + \ifdim \wd2 = \wd\toprefbox \else % same as Top? + \putwordSection{} ``\printedrefname'' \putwordin{}\space + \fi + \fi + #1% +} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + {\toks0 = {#1}% avoid expansion of possibly-complex value + \message{\linenumber Undefined cross reference `\the\toks0'.}}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + {% The node name might contain 8-bit characters, which in our current + % implementation are changed to commands like @'e. Don't let these + % mess up the control sequence name. + \indexnofonts + \turnoffactive + \xdef\safexrefname{#1}% + }% + % + \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR\safexrefname\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 + {\safexrefname}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readdatafile{aux}% + \global\havexrefstrue + \fi + \closein 1 +} + +\def\setupdatafile{% + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count1=128 + \def\loop{% + \catcode\count1=\other + \advance\count1 by 1 + \ifnum \count1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 +} + +\def\readdatafile#1{% +\begingroup + \setupdatafile + \input\jobname.#1 +\endgroup} + + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for Info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + % + % Invoke rest of plain TeX footnote routine. + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarly, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\thisisundefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \else \ifx\centersub\centerV + % for @center @image, we need a vbox so we can have our vertical space + \imagevmodetrue + \vbox\bgroup % vbox has better behavior than vtop herev + \fi\fi + % + \ifimagevmode + \nobreak\medskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \fi + % + % Leave vertical mode so that indentation from an enclosing + % environment such as @quotation is respected. + % However, if we're at the top level, we don't want the + % normal paragraph indentation. + % On the other hand, if we are in the case of @center @image, we don't + % want to start a paragraph, which will create a hsize-width box and + % eradicate the centering. + \ifx\centersub\centerV\else \noindent \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode + \medskip % space after a standalone image + \fi + \ifx\centersub\centerV \egroup \fi +\endgroup} + + +% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, +% etc. We don't actually implement floating yet, we always include the +% float "here". But it seemed the best name for the future. +% +\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} + +% There may be a space before second and/or third parameter; delete it. +\def\eatcommaspace#1, {#1,} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + % + % BEWARE: when the floats start float, we have to issue warning whenever an + % insert appears inside a float which could possibly float. --kasal, 26may04 + % + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \lastsection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\lastsection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline{\scanexp\thiscaption}% + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + % + % Space below caption. + \vskip\parskip + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies + % + % since we read the caption text in the macro world, where ^^M + % is turned into a normal character, we have to scan it back, so + % we don't write the literal three characters "^^M" into the aux file. + \scanexp{% + \xdef\noexpand\gtemp{% + \ifx\thisshortcaption\empty + \thiscaption + \else + \thisshortcaption + \fi + }% + }% + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident + \ifx\gtemp\empty \else : \gtemp \fi}}% + }% + \fi + \egroup % end of \vtop + % + % place the captured inserts + % + % BEWARE: when the floats start floating, we have to issue warning + % whenever an insert appears inside a float which could possibly + % float. --kasal, 26may04 + % + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\def\appendtomacro#1#2{% + \expandafter\def\expandafter#1\expandafter{#1#2}% +} + +% @caption, @shortcaption +% +\def\caption{\docaption\thiscaption} +\def\shortcaption{\docaption\thisshortcaption} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \lastsection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + + +\message{localization,} + +% For single-language documents, @documentlanguage is usually given very +% early, just after @documentencoding. Single argument is the language +% (de) or locale (de_DE) abbreviation. +% +{ + \catcode`\_ = \active + \globaldefs=1 +\parseargdef\documentlanguage{\begingroup + \let_=\normalunderscore % normal _ character for filenames + \tex % read txi-??.tex file in plain TeX. + % Read the file by the name they passed if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \documentlanguagetrywithoutunderscore{#1_\finish}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 + \endgroup % end raw TeX +\endgroup} +% +% If they passed de_DE, and txi-de_DE.tex doesn't exist, +% try txi-de.tex. +% +\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \globaldefs = 1 % everything in the txi-LL files needs to persist + \input txi-#1.tex + \fi + \closein 1 +} +}% end of special _ catcode +% +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? Putting it in the current +directory should work if nowhere else does.} + +% This macro is called from txi-??.tex files; the first argument is the +% \language name to set (without the "\lang@" prefix), the second and +% third args are \{left,right}hyphenmin. +% +% The language names to pass are determined when the format is built. +% See the etex.log file created at that time, e.g., +% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. +% +% With TeX Live 2008, etex now includes hyphenation patterns for all +% available languages. This means we can support hyphenation in +% Texinfo, at least to some extent. (This still doesn't solve the +% accented characters problem.) +% +\catcode`@=11 +\def\txisetlanguage#1#2#3{% + % do not set the language if the name is undefined in the current TeX. + \expandafter\ifx\csname lang@#1\endcsname \relax + \message{no patterns for #1}% + \else + \global\language = \csname lang@#1\endcsname + \fi + % but there is no harm in adjusting the hyphenmin values regardless. + \global\lefthyphenmin = #2\relax + \global\righthyphenmin = #3\relax +} + +% Helpers for encodings. +% Set the catcode of characters 128 through 255 to the specified number. +% +\def\setnonasciicharscatcode#1{% + \count255=128 + \loop\ifnum\count255<256 + \global\catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +\def\setnonasciicharscatcodenonglobal#1{% + \count255=128 + \loop\ifnum\count255<256 + \catcode\count255=#1\relax + \advance\count255 by 1 + \repeat +} + +% @documentencoding sets the definition of non-ASCII characters +% according to the specified encoding. +% +\parseargdef\documentencoding{% + % Encoding being declared for the document. + \def\declaredencoding{\csname #1.enc\endcsname}% + % + % Supported encodings: names converted to tokens in order to be able + % to compare them with \ifx. + \def\ascii{\csname US-ASCII.enc\endcsname}% + \def\latnine{\csname ISO-8859-15.enc\endcsname}% + \def\latone{\csname ISO-8859-1.enc\endcsname}% + \def\lattwo{\csname ISO-8859-2.enc\endcsname}% + \def\utfeight{\csname UTF-8.enc\endcsname}% + % + \ifx \declaredencoding \ascii + \asciichardefs + % + \else \ifx \declaredencoding \lattwo + \setnonasciicharscatcode\active + \lattwochardefs + % + \else \ifx \declaredencoding \latone + \setnonasciicharscatcode\active + \latonechardefs + % + \else \ifx \declaredencoding \latnine + \setnonasciicharscatcode\active + \latninechardefs + % + \else \ifx \declaredencoding \utfeight + \setnonasciicharscatcode\active + \utfeightchardefs + % + \else + \message{Unknown document encoding #1, ignoring.}% + % + \fi % utfeight + \fi % latnine + \fi % latone + \fi % lattwo + \fi % ascii +} + +% A message to be logged when using a character that isn't available +% the default font encoding (OT1). +% +\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} + +% Take account of \c (plain) vs. \, (Texinfo) difference. +\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} + +% First, make active non-ASCII characters in order for them to be +% correctly categorized when TeX reads the replacement text of +% macros containing the character definitions. +\setnonasciicharscatcode\active +% +% Latin1 (ISO-8859-1) character definitions. +\def\latonechardefs{% + \gdef^^a0{\tie} + \gdef^^a1{\exclamdown} + \gdef^^a2{\missingcharmsg{CENT SIGN}} + \gdef^^a3{{\pounds}} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\missingcharmsg{YEN SIGN}} + \gdef^^a6{\missingcharmsg{BROKEN BAR}} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\copyright} + \gdef^^aa{\ordf} + \gdef^^ab{\guillemetleft} + \gdef^^ac{$\lnot$} + \gdef^^ad{\-} + \gdef^^ae{\registeredsymbol} + \gdef^^af{\={}} + % + \gdef^^b0{\textdegree} + \gdef^^b1{$\pm$} + \gdef^^b2{$^2$} + \gdef^^b3{$^3$} + \gdef^^b4{\'{}} + \gdef^^b5{$\mu$} + \gdef^^b6{\P} + % + \gdef^^b7{$^.$} + \gdef^^b8{\cedilla\ } + \gdef^^b9{$^1$} + \gdef^^ba{\ordm} + % + \gdef^^bb{\guillemetright} + \gdef^^bc{$1\over4$} + \gdef^^bd{$1\over2$} + \gdef^^be{$3\over4$} + \gdef^^bf{\questiondown} + % + \gdef^^c0{\`A} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\~A} + \gdef^^c4{\"A} + \gdef^^c5{\ringaccent A} + \gdef^^c6{\AE} + \gdef^^c7{\cedilla C} + \gdef^^c8{\`E} + \gdef^^c9{\'E} + \gdef^^ca{\^E} + \gdef^^cb{\"E} + \gdef^^cc{\`I} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\"I} + % + \gdef^^d0{\DH} + \gdef^^d1{\~N} + \gdef^^d2{\`O} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\~O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\O} + \gdef^^d9{\`U} + \gdef^^da{\'U} + \gdef^^db{\^U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\TH} + \gdef^^df{\ss} + % + \gdef^^e0{\`a} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\~a} + \gdef^^e4{\"a} + \gdef^^e5{\ringaccent a} + \gdef^^e6{\ae} + \gdef^^e7{\cedilla c} + \gdef^^e8{\`e} + \gdef^^e9{\'e} + \gdef^^ea{\^e} + \gdef^^eb{\"e} + \gdef^^ec{\`{\dotless i}} + \gdef^^ed{\'{\dotless i}} + \gdef^^ee{\^{\dotless i}} + \gdef^^ef{\"{\dotless i}} + % + \gdef^^f0{\dh} + \gdef^^f1{\~n} + \gdef^^f2{\`o} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\~o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\o} + \gdef^^f9{\`u} + \gdef^^fa{\'u} + \gdef^^fb{\^u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\th} + \gdef^^ff{\"y} +} + +% Latin9 (ISO-8859-15) encoding character definitions. +\def\latninechardefs{% + % Encoding is almost identical to Latin1. + \latonechardefs + % + \gdef^^a4{\euro} + \gdef^^a6{\v S} + \gdef^^a8{\v s} + \gdef^^b4{\v Z} + \gdef^^b8{\v z} + \gdef^^bc{\OE} + \gdef^^bd{\oe} + \gdef^^be{\"Y} +} + +% Latin2 (ISO-8859-2) character definitions. +\def\lattwochardefs{% + \gdef^^a0{\tie} + \gdef^^a1{\ogonek{A}} + \gdef^^a2{\u{}} + \gdef^^a3{\L} + \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdef^^a5{\v L} + \gdef^^a6{\'S} + \gdef^^a7{\S} + \gdef^^a8{\"{}} + \gdef^^a9{\v S} + \gdef^^aa{\cedilla S} + \gdef^^ab{\v T} + \gdef^^ac{\'Z} + \gdef^^ad{\-} + \gdef^^ae{\v Z} + \gdef^^af{\dotaccent Z} + % + \gdef^^b0{\textdegree} + \gdef^^b1{\ogonek{a}} + \gdef^^b2{\ogonek{ }} + \gdef^^b3{\l} + \gdef^^b4{\'{}} + \gdef^^b5{\v l} + \gdef^^b6{\'s} + \gdef^^b7{\v{}} + \gdef^^b8{\cedilla\ } + \gdef^^b9{\v s} + \gdef^^ba{\cedilla s} + \gdef^^bb{\v t} + \gdef^^bc{\'z} + \gdef^^bd{\H{}} + \gdef^^be{\v z} + \gdef^^bf{\dotaccent z} + % + \gdef^^c0{\'R} + \gdef^^c1{\'A} + \gdef^^c2{\^A} + \gdef^^c3{\u A} + \gdef^^c4{\"A} + \gdef^^c5{\'L} + \gdef^^c6{\'C} + \gdef^^c7{\cedilla C} + \gdef^^c8{\v C} + \gdef^^c9{\'E} + \gdef^^ca{\ogonek{E}} + \gdef^^cb{\"E} + \gdef^^cc{\v E} + \gdef^^cd{\'I} + \gdef^^ce{\^I} + \gdef^^cf{\v D} + % + \gdef^^d0{\DH} + \gdef^^d1{\'N} + \gdef^^d2{\v N} + \gdef^^d3{\'O} + \gdef^^d4{\^O} + \gdef^^d5{\H O} + \gdef^^d6{\"O} + \gdef^^d7{$\times$} + \gdef^^d8{\v R} + \gdef^^d9{\ringaccent U} + \gdef^^da{\'U} + \gdef^^db{\H U} + \gdef^^dc{\"U} + \gdef^^dd{\'Y} + \gdef^^de{\cedilla T} + \gdef^^df{\ss} + % + \gdef^^e0{\'r} + \gdef^^e1{\'a} + \gdef^^e2{\^a} + \gdef^^e3{\u a} + \gdef^^e4{\"a} + \gdef^^e5{\'l} + \gdef^^e6{\'c} + \gdef^^e7{\cedilla c} + \gdef^^e8{\v c} + \gdef^^e9{\'e} + \gdef^^ea{\ogonek{e}} + \gdef^^eb{\"e} + \gdef^^ec{\v e} + \gdef^^ed{\'{\dotless{i}}} + \gdef^^ee{\^{\dotless{i}}} + \gdef^^ef{\v d} + % + \gdef^^f0{\dh} + \gdef^^f1{\'n} + \gdef^^f2{\v n} + \gdef^^f3{\'o} + \gdef^^f4{\^o} + \gdef^^f5{\H o} + \gdef^^f6{\"o} + \gdef^^f7{$\div$} + \gdef^^f8{\v r} + \gdef^^f9{\ringaccent u} + \gdef^^fa{\'u} + \gdef^^fb{\H u} + \gdef^^fc{\"u} + \gdef^^fd{\'y} + \gdef^^fe{\cedilla t} + \gdef^^ff{\dotaccent{}} +} + +% UTF-8 character definitions. +% +% This code to support UTF-8 is based on LaTeX's utf8.def, with some +% changes for Texinfo conventions. It is included here under the GPL by +% permission from Frank Mittelbach and the LaTeX team. +% +\newcount\countUTFx +\newcount\countUTFy +\newcount\countUTFz + +\gdef\UTFviiiTwoOctets#1#2{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\endcsname} +% +\gdef\UTFviiiThreeOctets#1#2#3{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} +% +\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter + \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} + +\gdef\UTFviiiDefined#1{% + \ifx #1\relax + \message{\linenumber Unicode char \string #1 not defined for Texinfo}% + \else + \expandafter #1% + \fi +} + +\begingroup + \catcode`\~13 + \catcode`\"12 + + \def\UTFviiiLoop{% + \global\catcode\countUTFx\active + \uccode`\~\countUTFx + \uppercase\expandafter{\UTFviiiTmp}% + \advance\countUTFx by 1 + \ifnum\countUTFx < \countUTFy + \expandafter\UTFviiiLoop + \fi} + + \countUTFx = "C2 + \countUTFy = "E0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \UTFviiiLoop + + \countUTFx = "E0 + \countUTFy = "F0 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \UTFviiiLoop + + \countUTFx = "F0 + \countUTFy = "F4 + \def\UTFviiiTmp{% + \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \UTFviiiLoop +\endgroup + +\begingroup + \catcode`\"=12 + \catcode`\<=12 + \catcode`\.=12 + \catcode`\,=12 + \catcode`\;=12 + \catcode`\!=12 + \catcode`\~=13 + + \gdef\DeclareUnicodeCharacter#1#2{% + \countUTFz = "#1\relax + %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% + \begingroup + \parseXMLCharref + \def\UTFviiiTwoOctets##1##2{% + \csname u8:##1\string ##2\endcsname}% + \def\UTFviiiThreeOctets##1##2##3{% + \csname u8:##1\string ##2\string ##3\endcsname}% + \def\UTFviiiFourOctets##1##2##3##4{% + \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% + \expandafter\expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \gdef\UTFviiiTmp{#2}% + \endgroup} + + \gdef\parseXMLCharref{% + \ifnum\countUTFz < "A0\relax + \errhelp = \EMsimple + \errmessage{Cannot define Unicode char value < 00A0}% + \else\ifnum\countUTFz < "800\relax + \parseUTFviiiA,% + \parseUTFviiiB C\UTFviiiTwoOctets.,% + \else\ifnum\countUTFz < "10000\relax + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% + \else + \parseUTFviiiA;% + \parseUTFviiiA,% + \parseUTFviiiA!% + \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% + \fi\fi\fi + } + + \gdef\parseUTFviiiA#1{% + \countUTFx = \countUTFz + \divide\countUTFz by 64 + \countUTFy = \countUTFz + \multiply\countUTFz by 64 + \advance\countUTFx by -\countUTFz + \advance\countUTFx by 128 + \uccode `#1\countUTFx + \countUTFz = \countUTFy} + + \gdef\parseUTFviiiB#1#2#3#4{% + \advance\countUTFz by "#10\relax + \uccode `#3\countUTFz + \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} +\endgroup + +\def\utfeightchardefs{% + \DeclareUnicodeCharacter{00A0}{\tie} + \DeclareUnicodeCharacter{00A1}{\exclamdown} + \DeclareUnicodeCharacter{00A3}{\pounds} + \DeclareUnicodeCharacter{00A8}{\"{ }} + \DeclareUnicodeCharacter{00A9}{\copyright} + \DeclareUnicodeCharacter{00AA}{\ordf} + \DeclareUnicodeCharacter{00AB}{\guillemetleft} + \DeclareUnicodeCharacter{00AD}{\-} + \DeclareUnicodeCharacter{00AE}{\registeredsymbol} + \DeclareUnicodeCharacter{00AF}{\={ }} + + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} + \DeclareUnicodeCharacter{00B4}{\'{ }} + \DeclareUnicodeCharacter{00B8}{\cedilla{ }} + \DeclareUnicodeCharacter{00BA}{\ordm} + \DeclareUnicodeCharacter{00BB}{\guillemetright} + \DeclareUnicodeCharacter{00BF}{\questiondown} + + \DeclareUnicodeCharacter{00C0}{\`A} + \DeclareUnicodeCharacter{00C1}{\'A} + \DeclareUnicodeCharacter{00C2}{\^A} + \DeclareUnicodeCharacter{00C3}{\~A} + \DeclareUnicodeCharacter{00C4}{\"A} + \DeclareUnicodeCharacter{00C5}{\AA} + \DeclareUnicodeCharacter{00C6}{\AE} + \DeclareUnicodeCharacter{00C7}{\cedilla{C}} + \DeclareUnicodeCharacter{00C8}{\`E} + \DeclareUnicodeCharacter{00C9}{\'E} + \DeclareUnicodeCharacter{00CA}{\^E} + \DeclareUnicodeCharacter{00CB}{\"E} + \DeclareUnicodeCharacter{00CC}{\`I} + \DeclareUnicodeCharacter{00CD}{\'I} + \DeclareUnicodeCharacter{00CE}{\^I} + \DeclareUnicodeCharacter{00CF}{\"I} + + \DeclareUnicodeCharacter{00D0}{\DH} + \DeclareUnicodeCharacter{00D1}{\~N} + \DeclareUnicodeCharacter{00D2}{\`O} + \DeclareUnicodeCharacter{00D3}{\'O} + \DeclareUnicodeCharacter{00D4}{\^O} + \DeclareUnicodeCharacter{00D5}{\~O} + \DeclareUnicodeCharacter{00D6}{\"O} + \DeclareUnicodeCharacter{00D8}{\O} + \DeclareUnicodeCharacter{00D9}{\`U} + \DeclareUnicodeCharacter{00DA}{\'U} + \DeclareUnicodeCharacter{00DB}{\^U} + \DeclareUnicodeCharacter{00DC}{\"U} + \DeclareUnicodeCharacter{00DD}{\'Y} + \DeclareUnicodeCharacter{00DE}{\TH} + \DeclareUnicodeCharacter{00DF}{\ss} + + \DeclareUnicodeCharacter{00E0}{\`a} + \DeclareUnicodeCharacter{00E1}{\'a} + \DeclareUnicodeCharacter{00E2}{\^a} + \DeclareUnicodeCharacter{00E3}{\~a} + \DeclareUnicodeCharacter{00E4}{\"a} + \DeclareUnicodeCharacter{00E5}{\aa} + \DeclareUnicodeCharacter{00E6}{\ae} + \DeclareUnicodeCharacter{00E7}{\cedilla{c}} + \DeclareUnicodeCharacter{00E8}{\`e} + \DeclareUnicodeCharacter{00E9}{\'e} + \DeclareUnicodeCharacter{00EA}{\^e} + \DeclareUnicodeCharacter{00EB}{\"e} + \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} + \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} + \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} + \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} + + \DeclareUnicodeCharacter{00F0}{\dh} + \DeclareUnicodeCharacter{00F1}{\~n} + \DeclareUnicodeCharacter{00F2}{\`o} + \DeclareUnicodeCharacter{00F3}{\'o} + \DeclareUnicodeCharacter{00F4}{\^o} + \DeclareUnicodeCharacter{00F5}{\~o} + \DeclareUnicodeCharacter{00F6}{\"o} + \DeclareUnicodeCharacter{00F8}{\o} + \DeclareUnicodeCharacter{00F9}{\`u} + \DeclareUnicodeCharacter{00FA}{\'u} + \DeclareUnicodeCharacter{00FB}{\^u} + \DeclareUnicodeCharacter{00FC}{\"u} + \DeclareUnicodeCharacter{00FD}{\'y} + \DeclareUnicodeCharacter{00FE}{\th} + \DeclareUnicodeCharacter{00FF}{\"y} + + \DeclareUnicodeCharacter{0100}{\=A} + \DeclareUnicodeCharacter{0101}{\=a} + \DeclareUnicodeCharacter{0102}{\u{A}} + \DeclareUnicodeCharacter{0103}{\u{a}} + \DeclareUnicodeCharacter{0104}{\ogonek{A}} + \DeclareUnicodeCharacter{0105}{\ogonek{a}} + \DeclareUnicodeCharacter{0106}{\'C} + \DeclareUnicodeCharacter{0107}{\'c} + \DeclareUnicodeCharacter{0108}{\^C} + \DeclareUnicodeCharacter{0109}{\^c} + \DeclareUnicodeCharacter{0118}{\ogonek{E}} + \DeclareUnicodeCharacter{0119}{\ogonek{e}} + \DeclareUnicodeCharacter{010A}{\dotaccent{C}} + \DeclareUnicodeCharacter{010B}{\dotaccent{c}} + \DeclareUnicodeCharacter{010C}{\v{C}} + \DeclareUnicodeCharacter{010D}{\v{c}} + \DeclareUnicodeCharacter{010E}{\v{D}} + + \DeclareUnicodeCharacter{0112}{\=E} + \DeclareUnicodeCharacter{0113}{\=e} + \DeclareUnicodeCharacter{0114}{\u{E}} + \DeclareUnicodeCharacter{0115}{\u{e}} + \DeclareUnicodeCharacter{0116}{\dotaccent{E}} + \DeclareUnicodeCharacter{0117}{\dotaccent{e}} + \DeclareUnicodeCharacter{011A}{\v{E}} + \DeclareUnicodeCharacter{011B}{\v{e}} + \DeclareUnicodeCharacter{011C}{\^G} + \DeclareUnicodeCharacter{011D}{\^g} + \DeclareUnicodeCharacter{011E}{\u{G}} + \DeclareUnicodeCharacter{011F}{\u{g}} + + \DeclareUnicodeCharacter{0120}{\dotaccent{G}} + \DeclareUnicodeCharacter{0121}{\dotaccent{g}} + \DeclareUnicodeCharacter{0124}{\^H} + \DeclareUnicodeCharacter{0125}{\^h} + \DeclareUnicodeCharacter{0128}{\~I} + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} + \DeclareUnicodeCharacter{012A}{\=I} + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} + \DeclareUnicodeCharacter{012C}{\u{I}} + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} + + \DeclareUnicodeCharacter{0130}{\dotaccent{I}} + \DeclareUnicodeCharacter{0131}{\dotless{i}} + \DeclareUnicodeCharacter{0132}{IJ} + \DeclareUnicodeCharacter{0133}{ij} + \DeclareUnicodeCharacter{0134}{\^J} + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} + \DeclareUnicodeCharacter{0139}{\'L} + \DeclareUnicodeCharacter{013A}{\'l} + + \DeclareUnicodeCharacter{0141}{\L} + \DeclareUnicodeCharacter{0142}{\l} + \DeclareUnicodeCharacter{0143}{\'N} + \DeclareUnicodeCharacter{0144}{\'n} + \DeclareUnicodeCharacter{0147}{\v{N}} + \DeclareUnicodeCharacter{0148}{\v{n}} + \DeclareUnicodeCharacter{014C}{\=O} + \DeclareUnicodeCharacter{014D}{\=o} + \DeclareUnicodeCharacter{014E}{\u{O}} + \DeclareUnicodeCharacter{014F}{\u{o}} + + \DeclareUnicodeCharacter{0150}{\H{O}} + \DeclareUnicodeCharacter{0151}{\H{o}} + \DeclareUnicodeCharacter{0152}{\OE} + \DeclareUnicodeCharacter{0153}{\oe} + \DeclareUnicodeCharacter{0154}{\'R} + \DeclareUnicodeCharacter{0155}{\'r} + \DeclareUnicodeCharacter{0158}{\v{R}} + \DeclareUnicodeCharacter{0159}{\v{r}} + \DeclareUnicodeCharacter{015A}{\'S} + \DeclareUnicodeCharacter{015B}{\'s} + \DeclareUnicodeCharacter{015C}{\^S} + \DeclareUnicodeCharacter{015D}{\^s} + \DeclareUnicodeCharacter{015E}{\cedilla{S}} + \DeclareUnicodeCharacter{015F}{\cedilla{s}} + + \DeclareUnicodeCharacter{0160}{\v{S}} + \DeclareUnicodeCharacter{0161}{\v{s}} + \DeclareUnicodeCharacter{0162}{\cedilla{t}} + \DeclareUnicodeCharacter{0163}{\cedilla{T}} + \DeclareUnicodeCharacter{0164}{\v{T}} + + \DeclareUnicodeCharacter{0168}{\~U} + \DeclareUnicodeCharacter{0169}{\~u} + \DeclareUnicodeCharacter{016A}{\=U} + \DeclareUnicodeCharacter{016B}{\=u} + \DeclareUnicodeCharacter{016C}{\u{U}} + \DeclareUnicodeCharacter{016D}{\u{u}} + \DeclareUnicodeCharacter{016E}{\ringaccent{U}} + \DeclareUnicodeCharacter{016F}{\ringaccent{u}} + + \DeclareUnicodeCharacter{0170}{\H{U}} + \DeclareUnicodeCharacter{0171}{\H{u}} + \DeclareUnicodeCharacter{0174}{\^W} + \DeclareUnicodeCharacter{0175}{\^w} + \DeclareUnicodeCharacter{0176}{\^Y} + \DeclareUnicodeCharacter{0177}{\^y} + \DeclareUnicodeCharacter{0178}{\"Y} + \DeclareUnicodeCharacter{0179}{\'Z} + \DeclareUnicodeCharacter{017A}{\'z} + \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} + \DeclareUnicodeCharacter{017C}{\dotaccent{z}} + \DeclareUnicodeCharacter{017D}{\v{Z}} + \DeclareUnicodeCharacter{017E}{\v{z}} + + \DeclareUnicodeCharacter{01C4}{D\v{Z}} + \DeclareUnicodeCharacter{01C5}{D\v{z}} + \DeclareUnicodeCharacter{01C6}{d\v{z}} + \DeclareUnicodeCharacter{01C7}{LJ} + \DeclareUnicodeCharacter{01C8}{Lj} + \DeclareUnicodeCharacter{01C9}{lj} + \DeclareUnicodeCharacter{01CA}{NJ} + \DeclareUnicodeCharacter{01CB}{Nj} + \DeclareUnicodeCharacter{01CC}{nj} + \DeclareUnicodeCharacter{01CD}{\v{A}} + \DeclareUnicodeCharacter{01CE}{\v{a}} + \DeclareUnicodeCharacter{01CF}{\v{I}} + + \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} + \DeclareUnicodeCharacter{01D1}{\v{O}} + \DeclareUnicodeCharacter{01D2}{\v{o}} + \DeclareUnicodeCharacter{01D3}{\v{U}} + \DeclareUnicodeCharacter{01D4}{\v{u}} + + \DeclareUnicodeCharacter{01E2}{\={\AE}} + \DeclareUnicodeCharacter{01E3}{\={\ae}} + \DeclareUnicodeCharacter{01E6}{\v{G}} + \DeclareUnicodeCharacter{01E7}{\v{g}} + \DeclareUnicodeCharacter{01E8}{\v{K}} + \DeclareUnicodeCharacter{01E9}{\v{k}} + + \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} + \DeclareUnicodeCharacter{01F1}{DZ} + \DeclareUnicodeCharacter{01F2}{Dz} + \DeclareUnicodeCharacter{01F3}{dz} + \DeclareUnicodeCharacter{01F4}{\'G} + \DeclareUnicodeCharacter{01F5}{\'g} + \DeclareUnicodeCharacter{01F8}{\`N} + \DeclareUnicodeCharacter{01F9}{\`n} + \DeclareUnicodeCharacter{01FC}{\'{\AE}} + \DeclareUnicodeCharacter{01FD}{\'{\ae}} + \DeclareUnicodeCharacter{01FE}{\'{\O}} + \DeclareUnicodeCharacter{01FF}{\'{\o}} + + \DeclareUnicodeCharacter{021E}{\v{H}} + \DeclareUnicodeCharacter{021F}{\v{h}} + + \DeclareUnicodeCharacter{0226}{\dotaccent{A}} + \DeclareUnicodeCharacter{0227}{\dotaccent{a}} + \DeclareUnicodeCharacter{0228}{\cedilla{E}} + \DeclareUnicodeCharacter{0229}{\cedilla{e}} + \DeclareUnicodeCharacter{022E}{\dotaccent{O}} + \DeclareUnicodeCharacter{022F}{\dotaccent{o}} + + \DeclareUnicodeCharacter{0232}{\=Y} + \DeclareUnicodeCharacter{0233}{\=y} + \DeclareUnicodeCharacter{0237}{\dotless{j}} + + \DeclareUnicodeCharacter{02DB}{\ogonek{ }} + + \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} + \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} + \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} + \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} + \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} + \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} + \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} + \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} + \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} + \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} + \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} + \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} + + \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} + \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} + + \DeclareUnicodeCharacter{1E20}{\=G} + \DeclareUnicodeCharacter{1E21}{\=g} + \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} + \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} + \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} + \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} + \DeclareUnicodeCharacter{1E26}{\"H} + \DeclareUnicodeCharacter{1E27}{\"h} + + \DeclareUnicodeCharacter{1E30}{\'K} + \DeclareUnicodeCharacter{1E31}{\'k} + \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} + \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} + \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} + \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} + \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} + \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} + \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} + \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} + \DeclareUnicodeCharacter{1E3E}{\'M} + \DeclareUnicodeCharacter{1E3F}{\'m} + + \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} + \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} + \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} + \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} + \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} + \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} + \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} + \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} + \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} + \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} + + \DeclareUnicodeCharacter{1E54}{\'P} + \DeclareUnicodeCharacter{1E55}{\'p} + \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} + \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} + \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} + \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} + \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} + \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} + \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} + \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} + + \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} + \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} + \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} + \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} + \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} + \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} + \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} + \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} + \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} + \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} + + \DeclareUnicodeCharacter{1E7C}{\~V} + \DeclareUnicodeCharacter{1E7D}{\~v} + \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} + \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} + + \DeclareUnicodeCharacter{1E80}{\`W} + \DeclareUnicodeCharacter{1E81}{\`w} + \DeclareUnicodeCharacter{1E82}{\'W} + \DeclareUnicodeCharacter{1E83}{\'w} + \DeclareUnicodeCharacter{1E84}{\"W} + \DeclareUnicodeCharacter{1E85}{\"w} + \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} + \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} + \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} + \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} + \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} + \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} + \DeclareUnicodeCharacter{1E8C}{\"X} + \DeclareUnicodeCharacter{1E8D}{\"x} + \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} + \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} + + \DeclareUnicodeCharacter{1E90}{\^Z} + \DeclareUnicodeCharacter{1E91}{\^z} + \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} + \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} + \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} + \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} + \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} + \DeclareUnicodeCharacter{1E97}{\"t} + \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} + \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} + + \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} + \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} + + \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} + \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} + \DeclareUnicodeCharacter{1EBC}{\~E} + \DeclareUnicodeCharacter{1EBD}{\~e} + + \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} + \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} + \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} + \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} + + \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} + \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} + + \DeclareUnicodeCharacter{1EF2}{\`Y} + \DeclareUnicodeCharacter{1EF3}{\`y} + \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} + + \DeclareUnicodeCharacter{1EF8}{\~Y} + \DeclareUnicodeCharacter{1EF9}{\~y} + + \DeclareUnicodeCharacter{2013}{--} + \DeclareUnicodeCharacter{2014}{---} + \DeclareUnicodeCharacter{2018}{\quoteleft} + \DeclareUnicodeCharacter{2019}{\quoteright} + \DeclareUnicodeCharacter{201A}{\quotesinglbase} + \DeclareUnicodeCharacter{201C}{\quotedblleft} + \DeclareUnicodeCharacter{201D}{\quotedblright} + \DeclareUnicodeCharacter{201E}{\quotedblbase} + \DeclareUnicodeCharacter{2022}{\bullet} + \DeclareUnicodeCharacter{2026}{\dots} + \DeclareUnicodeCharacter{2039}{\guilsinglleft} + \DeclareUnicodeCharacter{203A}{\guilsinglright} + \DeclareUnicodeCharacter{20AC}{\euro} + + \DeclareUnicodeCharacter{2192}{\expansion} + \DeclareUnicodeCharacter{21D2}{\result} + + \DeclareUnicodeCharacter{2212}{\minus} + \DeclareUnicodeCharacter{2217}{\point} + \DeclareUnicodeCharacter{2261}{\equiv} +}% end of \utfeightchardefs + + +% US-ASCII character definitions. +\def\asciichardefs{% nothing need be done + \relax +} + +% Make non-ASCII characters printable again for compatibility with +% existing Texinfo documents that may use them, even without declaring a +% document encoding. +% +\setnonasciicharscatcode \other + + +\message{formatting,} + +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be very finicky about underfull hboxes, either. +\hbadness = 6666 + +% Following George Bush, get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; +% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; +% 7) physical page height; 8) physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + % if we don't reset these, they will remain at "1 true in" of + % whatever layout pdftex was dumped with. + \pdfhorigin = 1 true in + \pdfvorigin = 1 true in + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{607.2pt}{6in}% that's 46 lines + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.25 trim size. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {-.2in}{0in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @smallerbook to reset parameters for 6x9 trim size. +% (Just testing, parameters still in flux.) +\def\smallerbook{{\globaldefs = 1 + \parskip = 1.5pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.4in}{4.8in}% + {-.2in}{-.4in}% + {0pt}{14pt}% + {9in}{6in}% + % + \lispnarrowing = 0.25in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .4cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{673.2pt}{160mm}% that's 51 lines + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1\relax + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +\def^^L{\par} % remove \outer, so ^L can appear in an @comment + +% DEL is a comment character, in case @c does not suffice. +\catcode`\^^? = 14 + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other \def\normaldoublequote{"} +\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix +\catcode`\+=\other \def\normalplus{+} +\catcode`\<=\other \def\normalless{<} +\catcode`\>=\other \def\normalgreater{>} +\catcode`\^=\other \def\normalcaret{^} +\catcode`\_=\other \def\normalunderscore{_} +\catcode`\|=\other \def\normalverticalbar{|} +\catcode`\~=\other \def\normaltilde{~} + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +\let\realunder=_ +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% Used sometimes to turn off (effectively) the active characters even after +% parsing them. +\def\turnoffactive{% + \normalturnoffactive + \otherbackslash +} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \realbackslash is an actual character `\' with catcode other, and +% \doublebackslash is two of them (for the pdf outlines). +{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} + +% In texinfo, backslash is an active character; it prints the backslash +% in fixed width font. +\catcode`\\=\active % @ for escape char from now on. + +% The story here is that in math mode, the \char of \backslashcurfont +% ends up printing the roman \ from the math symbol font (because \char +% in math mode uses the \mathcode, and plain.tex sets +% \mathcode`\\="026E). It seems better for @backslashchar{} to always +% print a typewriter backslash, hence we use an explicit \mathchar, +% which is the decimal equivalent of "715c (class 7, e.g., use \fam; +% ignored family value; char position "5C). We can't use " for the +% usual hex value because it has already been made active. +@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} +@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. + +% On startup, @fixbackslash assigns: +% @let \ = @normalbackslash +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. We switch back and forth between these. +@gdef@rawbackslash{@let\=@backslashcurfont} +@gdef@otherbackslash{@let\=@realbackslash} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. Also revert - to its normal character, in +% case the active - from code has slipped in. +% +{@catcode`- = @active + @gdef@normalturnoffactive{% + @let-=@normaldash + @let"=@normaldoublequote + @let$=@normaldollar %$ font-lock fix + @let+=@normalplus + @let<=@normalless + @let>=@normalgreater + @let\=@normalbackslash + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let~=@normaltilde + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces + } +} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\' in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also turn back on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These (along with & and #) are made active for url-breaking, so need +% active definitions as the normal characters. +@def@normaldot{.} +@def@normalquest{?} +@def@normalslash{/} + +% These look ok in all fonts, so just make them not special. +% @hashchar{} gets its own user-level command, because of #line. +@catcode`@& = @other @def@normalamp{&} +@catcode`@# = @other @def@normalhash{#} +@catcode`@% = @other @def@normalpercent{%} + +@let @hashchar = @normalhash + +@c Finally, make ` and ' active, so that txicodequoteundirected and +@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we +@c don't make ` and ' active, @code will not get them as active chars. +@c Do this last of all since we use ` in the previous @catcode assignments. +@catcode`@'=@active +@catcode`@`=@active +@markupsetuplqdefault +@markupsetuprqdefault + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/threads.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/threads.texi new file mode 100644 index 000000000..9bff76c8c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/threads.texi @@ -0,0 +1,241 @@ +@node Multi-threaded FFTW, Distributed-memory FFTW with MPI, FFTW Reference, Top +@chapter Multi-threaded FFTW + +@cindex parallel transform +In this chapter we document the parallel FFTW routines for +shared-memory parallel hardware. These routines, which support +parallel one- and multi-dimensional transforms of both real and +complex data, are the easiest way to take advantage of multiple +processors with FFTW. They work just like the corresponding +uniprocessor transform routines, except that you have an extra +initialization routine to call, and there is a routine to set the +number of threads to employ. Any program that uses the uniprocessor +FFTW can therefore be trivially modified to use the multi-threaded +FFTW. + +A shared-memory machine is one in which all CPUs can directly access +the same main memory, and such machines are now common due to the +ubiquity of multi-core CPUs. FFTW's multi-threading support allows +you to utilize these additional CPUs transparently from a single +program. However, this does not necessarily translate into +performance gains---when multiple threads/CPUs are employed, there is +an overhead required for synchronization that may outweigh the +computatational parallelism. Therefore, you can only benefit from +threads if your problem is sufficiently large. +@cindex shared-memory +@cindex threads + +@menu +* Installation and Supported Hardware/Software:: +* Usage of Multi-threaded FFTW:: +* How Many Threads to Use?:: +* Thread safety:: +@end menu + +@c ------------------------------------------------------------ +@node Installation and Supported Hardware/Software, Usage of Multi-threaded FFTW, Multi-threaded FFTW, Multi-threaded FFTW +@section Installation and Supported Hardware/Software + +All of the FFTW threads code is located in the @code{threads} +subdirectory of the FFTW package. On Unix systems, the FFTW threads +libraries and header files can be automatically configured, compiled, +and installed along with the uniprocessor FFTW libraries simply by +including @code{--enable-threads} in the flags to the @code{configure} +script (@pxref{Installation on Unix}), or @code{--enable-openmp} to use +@uref{http://www.openmp.org,OpenMP} threads. +@fpindex configure + + +@cindex portability +@cindex OpenMP +The threads routines require your operating system to have some sort +of shared-memory threads support. Specifically, the FFTW threads +package works with POSIX threads (available on most Unix variants, +from GNU/Linux to MacOS X) and Win32 threads. OpenMP threads, which +are supported in many common compilers (e.g. gcc) are also supported, +and may give better performance on some systems. (OpenMP threads are +also useful if you are employing OpenMP in your own code, in order to +minimize conflicts between threading models.) If you have a +shared-memory machine that uses a different threads API, it should be +a simple matter of programming to include support for it; see the file +@code{threads/threads.c} for more detail. + +You can compile FFTW with @emph{both} @code{--enable-threads} and +@code{--enable-openmp} at the same time, since they install libraries +with different names (@samp{fftw3_threads} and @samp{fftw3_omp}, as +described below). However, your programs may only link to @emph{one} +of these two libraries at a time. + +Ideally, of course, you should also have multiple processors in order to +get any benefit from the threaded transforms. + +@c ------------------------------------------------------------ +@node Usage of Multi-threaded FFTW, How Many Threads to Use?, Installation and Supported Hardware/Software, Multi-threaded FFTW +@section Usage of Multi-threaded FFTW + +Here, it is assumed that the reader is already familiar with the usage +of the uniprocessor FFTW routines, described elsewhere in this manual. +We only describe what one has to change in order to use the +multi-threaded routines. + +@cindex OpenMP +First, programs using the parallel complex transforms should be linked +with @code{-lfftw3_threads -lfftw3 -lm} on Unix, or @code{-lfftw3_omp +-lfftw3 -lm} if you compiled with OpenMP. You will also need to link +with whatever library is responsible for threads on your system +(e.g. @code{-lpthread} on GNU/Linux) or include whatever compiler flag +enables OpenMP (e.g. @code{-fopenmp} with gcc). +@cindex linking on Unix + + +Second, before calling @emph{any} FFTW routines, you should call the +function: + +@example +int fftw_init_threads(void); +@end example +@findex fftw_init_threads + +This function, which need only be called once, performs any one-time +initialization required to use threads on your system. It returns zero +if there was some error (which should not happen under normal +circumstances) and a non-zero value otherwise. + +Third, before creating a plan that you want to parallelize, you should +call: + +@example +void fftw_plan_with_nthreads(int nthreads); +@end example +@findex fftw_plan_with_nthreads + +The @code{nthreads} argument indicates the number of threads you want +FFTW to use (or actually, the maximum number). All plans subsequently +created with any planner routine will use that many threads. You can +call @code{fftw_plan_with_nthreads}, create some plans, call +@code{fftw_plan_with_nthreads} again with a different argument, and +create some more plans for a new number of threads. Plans already created +before a call to @code{fftw_plan_with_nthreads} are unaffected. If you +pass an @code{nthreads} argument of @code{1} (the default), threads are +disabled for subsequent plans. + +@cindex OpenMP +With OpenMP, to configure FFTW to use all of the currently running +OpenMP threads (set by @code{omp_set_num_threads(nthreads)} or by the +@code{OMP_NUM_THREADS} environment variable), you can do: +@code{fftw_plan_with_nthreads(omp_get_max_threads())}. (The @samp{omp_} +OpenMP functions are declared via @code{#include }.) + +@cindex thread safety +Given a plan, you then execute it as usual with +@code{fftw_execute(plan)}, and the execution will use the number of +threads specified when the plan was created. When done, you destroy +it as usual with @code{fftw_destroy_plan}. As described in +@ref{Thread safety}, plan @emph{execution} is thread-safe, but plan +creation and destruction are @emph{not}: you should create/destroy +plans only from a single thread, but can safely execute multiple plans +in parallel. + +There is one additional routine: if you want to get rid of all memory +and other resources allocated internally by FFTW, you can call: + +@example +void fftw_cleanup_threads(void); +@end example +@findex fftw_cleanup_threads + +which is much like the @code{fftw_cleanup()} function except that it +also gets rid of threads-related data. You must @emph{not} execute any +previously created plans after calling this function. + +We should also mention one other restriction: if you save wisdom from a +program using the multi-threaded FFTW, that wisdom @emph{cannot be used} +by a program using only the single-threaded FFTW (i.e. not calling +@code{fftw_init_threads}). @xref{Words of Wisdom-Saving Plans}. + +@c ------------------------------------------------------------ +@node How Many Threads to Use?, Thread safety, Usage of Multi-threaded FFTW, Multi-threaded FFTW +@section How Many Threads to Use? + +@cindex number of threads +There is a fair amount of overhead involved in synchronizing threads, +so the optimal number of threads to use depends upon the size of the +transform as well as on the number of processors you have. + +As a general rule, you don't want to use more threads than you have +processors. (Using more threads will work, but there will be extra +overhead with no benefit.) In fact, if the problem size is too small, +you may want to use fewer threads than you have processors. + +You will have to experiment with your system to see what level of +parallelization is best for your problem size. Typically, the problem +will have to involve at least a few thousand data points before threads +become beneficial. If you plan with @code{FFTW_PATIENT}, it will +automatically disable threads for sizes that don't benefit from +parallelization. +@ctindex FFTW_PATIENT + +@c ------------------------------------------------------------ +@node Thread safety, , How Many Threads to Use?, Multi-threaded FFTW +@section Thread safety + +@cindex threads +@cindex OpenMP +@cindex thread safety +Users writing multi-threaded programs (including OpenMP) must concern +themselves with the @dfn{thread safety} of the libraries they +use---that is, whether it is safe to call routines in parallel from +multiple threads. FFTW can be used in such an environment, but some +care must be taken because the planner routines share data +(e.g. wisdom and trigonometric tables) between calls and plans. + +The upshot is that the only thread-safe routine in FFTW is +@code{fftw_execute} (and the new-array variants thereof). All other routines +(e.g. the planner) should only be called from one thread at a time. So, +for example, you can wrap a semaphore lock around any calls to the +planner; even more simply, you can just create all of your plans from +one thread. We do not think this should be an important restriction +(FFTW is designed for the situation where the only performance-sensitive +code is the actual execution of the transform), and the benefits of +shared data between plans are great. + +Note also that, since the plan is not modified by @code{fftw_execute}, +it is safe to execute the @emph{same plan} in parallel by multiple +threads. However, since a given plan operates by default on a fixed +array, you need to use one of the new-array execute functions (@pxref{New-array Execute Functions}) so that different threads compute the transform of different data. + +(Users should note that these comments only apply to programs using +shared-memory threads or OpenMP. Parallelism using MPI or forked processes +involves a separate address-space and global variables for each process, +and is not susceptible to problems of this sort.) + +The FFTW planner is intended to be called from a single thread. If you +really must call it from multiple threads, you are expected to grab +whatever lock makes sense for your application, with the understanding +that you may be holding that lock for a long time, which is undesirable. + +Neither strategy works, however, in the following situation. The +``application'' is structured as a set of ``plugins'' which are unaware +of each other, and for whatever reason the ``plugins'' cannot coordinate +on grabbing the lock. (This is not a technical problem, but an +organizational one. The ``plugins'' are written by independent agents, +and from the perspective of each plugin's author, each plugin is using +FFTW correctly from a single thread.) To cope with this situation, +starting from FFTW-3.3.5, FFTW supports an API to make the planner +thread-safe: + +@example +void fftw_make_planner_thread_safe(void); +@end example +@findex fftw_make_planner_thread_safe + +This call operates by brute force: It just installs a hook that wraps a +lock (chosen by us) around all planner calls. So there is no magic and +you get the worst of all worlds. The planner is still single-threaded, +but you cannot choose which lock to use. The planner still holds the +lock for a long time, but you cannot impose a timeout on lock +acquisition. As of FFTW-3.3.5 and FFTW-3.3.6, this call does not work +when using OpenMP as threading substrate. (Suggestions on what to do +about this bug are welcome.) @emph{Do not use +@code{fftw_make_planner_thread_safe} unless there is no other choice,} +such as in the application/plugin situation. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/tutorial.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/tutorial.texi new file mode 100644 index 000000000..f04dd6b27 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/tutorial.texi @@ -0,0 +1,905 @@ +@node Tutorial, Other Important Topics, Introduction, Top +@chapter Tutorial +@menu +* Complex One-Dimensional DFTs:: +* Complex Multi-Dimensional DFTs:: +* One-Dimensional DFTs of Real Data:: +* Multi-Dimensional DFTs of Real Data:: +* More DFTs of Real Data:: +@end menu + +This chapter describes the basic usage of FFTW, i.e., how to compute +@cindex basic interface +the Fourier transform of a single array. This chapter tells the +truth, but not the @emph{whole} truth. Specifically, FFTW implements +additional routines and flags that are not documented here, although +in many cases we try to indicate where added capabilities exist. For +more complete information, see @ref{FFTW Reference}. (Note that you +need to compile and install FFTW before you can use it in a program. +For the details of the installation, see @ref{Installation and +Customization}.) + +We recommend that you read this tutorial in order.@footnote{You can +read the tutorial in bit-reversed order after computing your first +transform.} At the least, read the first section (@pxref{Complex +One-Dimensional DFTs}) before reading any of the others, even if your +main interest lies in one of the other transform types. + +Users of FFTW version 2 and earlier may also want to read @ref{Upgrading +from FFTW version 2}. + +@c ------------------------------------------------------------ +@node Complex One-Dimensional DFTs, Complex Multi-Dimensional DFTs, Tutorial, Tutorial +@section Complex One-Dimensional DFTs + +@quotation +Plan: To bother about the best method of accomplishing an accidental result. +[Ambrose Bierce, @cite{The Enlarged Devil's Dictionary}.] +@cindex Devil +@end quotation + +@iftex +@medskip +@end iftex + +The basic usage of FFTW to compute a one-dimensional DFT of size +@code{N} is simple, and it typically looks something like this code: + +@example +#include +... +@{ + fftw_complex *in, *out; + fftw_plan p; + ... + in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); + out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); + p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); + ... + fftw_execute(p); /* @r{repeat as needed} */ + ... + fftw_destroy_plan(p); + fftw_free(in); fftw_free(out); +@} +@end example + +You must link this code with the @code{fftw3} library. On Unix systems, +link with @code{-lfftw3 -lm}. + +The example code first allocates the input and output arrays. You can +allocate them in any way that you like, but we recommend using +@code{fftw_malloc}, which behaves like +@findex fftw_malloc +@code{malloc} except that it properly aligns the array when SIMD +instructions (such as SSE and Altivec) are available (@pxref{SIMD +alignment and fftw_malloc}). [Alternatively, we provide a convenient wrapper function @code{fftw_alloc_complex(N)} which has the same effect.] +@findex fftw_alloc_complex +@cindex SIMD + + +The data is an array of type @code{fftw_complex}, which is by default a +@code{double[2]} composed of the real (@code{in[i][0]}) and imaginary +(@code{in[i][1]}) parts of a complex number. +@tindex fftw_complex + +The next step is to create a @dfn{plan}, which is an object +@cindex plan +that contains all the data that FFTW needs to compute the FFT. +This function creates the plan: + +@example +fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +@end example +@findex fftw_plan_dft_1d +@tindex fftw_plan + +The first argument, @code{n}, is the size of the transform you are +trying to compute. The size @code{n} can be any positive integer, but +sizes that are products of small factors are transformed most +efficiently (although prime sizes still use an @Onlogn{} algorithm). + +The next two arguments are pointers to the input and output arrays of +the transform. These pointers can be equal, indicating an +@dfn{in-place} transform. +@cindex in-place + + +The fourth argument, @code{sign}, can be either @code{FFTW_FORWARD} +(@code{-1}) or @code{FFTW_BACKWARD} (@code{+1}), +@ctindex FFTW_FORWARD +@ctindex FFTW_BACKWARD +and indicates the direction of the transform you are interested in; +technically, it is the sign of the exponent in the transform. + +The @code{flags} argument is usually either @code{FFTW_MEASURE} or +@cindex flags +@code{FFTW_ESTIMATE}. @code{FFTW_MEASURE} instructs FFTW to run +@ctindex FFTW_MEASURE +and measure the execution time of several FFTs in order to find the +best way to compute the transform of size @code{n}. This process takes +some time (usually a few seconds), depending on your machine and on +the size of the transform. @code{FFTW_ESTIMATE}, on the contrary, +does not run any computation and just builds a +@ctindex FFTW_ESTIMATE +reasonable plan that is probably sub-optimal. In short, if your +program performs many transforms of the same size and initialization +time is not important, use @code{FFTW_MEASURE}; otherwise use the +estimate. + +@emph{You must create the plan before initializing the input}, because +@code{FFTW_MEASURE} overwrites the @code{in}/@code{out} arrays. +(Technically, @code{FFTW_ESTIMATE} does not touch your arrays, but you +should always create plans first just to be sure.) + +Once the plan has been created, you can use it as many times as you +like for transforms on the specified @code{in}/@code{out} arrays, +computing the actual transforms via @code{fftw_execute(plan)}: +@example +void fftw_execute(const fftw_plan plan); +@end example +@findex fftw_execute + +The DFT results are stored in-order in the array @code{out}, with the +zero-frequency (DC) component in @code{out[0]}. +@cindex frequency +If @code{in != out}, the transform is @dfn{out-of-place} and the input +array @code{in} is not modified. Otherwise, the input array is +overwritten with the transform. + +@cindex execute +If you want to transform a @emph{different} array of the same size, you +can create a new plan with @code{fftw_plan_dft_1d} and FFTW +automatically reuses the information from the previous plan, if +possible. Alternatively, with the ``guru'' interface you can apply a +given plan to a different array, if you are careful. +@xref{FFTW Reference}. + +When you are done with the plan, you deallocate it by calling +@code{fftw_destroy_plan(plan)}: +@example +void fftw_destroy_plan(fftw_plan plan); +@end example +@findex fftw_destroy_plan +If you allocate an array with @code{fftw_malloc()} you must deallocate +it with @code{fftw_free()}. Do not use @code{free()} or, heaven +forbid, @code{delete}. +@findex fftw_free + +FFTW computes an @emph{unnormalized} DFT. Thus, computing a forward +followed by a backward transform (or vice versa) results in the original +array scaled by @code{n}. For the definition of the DFT, see @ref{What +FFTW Really Computes}. +@cindex DFT +@cindex normalization + + +If you have a C compiler, such as @code{gcc}, that supports the +C99 standard, and you @code{#include } @emph{before} +@code{}, then @code{fftw_complex} is the native +double-precision complex type and you can manipulate it with ordinary +arithmetic. Otherwise, FFTW defines its own complex type, which is +bit-compatible with the C99 complex type. @xref{Complex numbers}. +(The C++ @code{} template class may also be usable via a +typecast.) +@cindex C++ + +To use single or long-double precision versions of FFTW, replace the +@code{fftw_} prefix by @code{fftwf_} or @code{fftwl_} and link with +@code{-lfftw3f} or @code{-lfftw3l}, but use the @emph{same} +@code{} header file. +@cindex precision + + +Many more flags exist besides @code{FFTW_MEASURE} and +@code{FFTW_ESTIMATE}. For example, use @code{FFTW_PATIENT} if you're +willing to wait even longer for a possibly even faster plan (@pxref{FFTW +Reference}). +@ctindex FFTW_PATIENT +You can also save plans for future use, as described by @ref{Words of +Wisdom-Saving Plans}. + +@c ------------------------------------------------------------ +@node Complex Multi-Dimensional DFTs, One-Dimensional DFTs of Real Data, Complex One-Dimensional DFTs, Tutorial +@section Complex Multi-Dimensional DFTs + +Multi-dimensional transforms work much the same way as one-dimensional +transforms: you allocate arrays of @code{fftw_complex} (preferably +using @code{fftw_malloc}), create an @code{fftw_plan}, execute it as +many times as you want with @code{fftw_execute(plan)}, and clean up +with @code{fftw_destroy_plan(plan)} (and @code{fftw_free}). + +FFTW provides two routines for creating plans for 2d and 3d transforms, +and one routine for creating plans of arbitrary dimensionality. +The 2d and 3d routines have the following signature: +@example +fftw_plan fftw_plan_dft_2d(int n0, int n1, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +fftw_plan fftw_plan_dft_3d(int n0, int n1, int n2, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +@end example +@findex fftw_plan_dft_2d +@findex fftw_plan_dft_3d + +These routines create plans for @code{n0} by @code{n1} two-dimensional +(2d) transforms and @code{n0} by @code{n1} by @code{n2} 3d transforms, +respectively. All of these transforms operate on contiguous arrays in +the C-standard @dfn{row-major} order, so that the last dimension has the +fastest-varying index in the array. This layout is described further in +@ref{Multi-dimensional Array Format}. + +FFTW can also compute transforms of higher dimensionality. In order to +avoid confusion between the various meanings of the the word +``dimension'', we use the term @emph{rank} +@cindex rank +to denote the number of independent indices in an array.@footnote{The +term ``rank'' is commonly used in the APL, FORTRAN, and Common Lisp +traditions, although it is not so common in the C@tie{}world.} For +example, we say that a 2d transform has rank@tie{}2, a 3d transform has +rank@tie{}3, and so on. You can plan transforms of arbitrary rank by +means of the following function: + +@example +fftw_plan fftw_plan_dft(int rank, const int *n, + fftw_complex *in, fftw_complex *out, + int sign, unsigned flags); +@end example +@findex fftw_plan_dft + +Here, @code{n} is a pointer to an array @code{n[rank]} denoting an +@code{n[0]} by @code{n[1]} by @dots{} by @code{n[rank-1]} transform. +Thus, for example, the call +@example +fftw_plan_dft_2d(n0, n1, in, out, sign, flags); +@end example +is equivalent to the following code fragment: +@example +int n[2]; +n[0] = n0; +n[1] = n1; +fftw_plan_dft(2, n, in, out, sign, flags); +@end example +@code{fftw_plan_dft} is not restricted to 2d and 3d transforms, +however, but it can plan transforms of arbitrary rank. + +You may have noticed that all the planner routines described so far +have overlapping functionality. For example, you can plan a 1d or 2d +transform by using @code{fftw_plan_dft} with a @code{rank} of @code{1} +or @code{2}, or even by calling @code{fftw_plan_dft_3d} with @code{n0} +and/or @code{n1} equal to @code{1} (with no loss in efficiency). This +pattern continues, and FFTW's planning routines in general form a +``partial order,'' sequences of +@cindex partial order +interfaces with strictly increasing generality but correspondingly +greater complexity. + +@code{fftw_plan_dft} is the most general complex-DFT routine that we +describe in this tutorial, but there are also the advanced and guru interfaces, +@cindex advanced interface +@cindex guru interface +which allow one to efficiently combine multiple/strided transforms +into a single FFTW plan, transform a subset of a larger +multi-dimensional array, and/or to handle more general complex-number +formats. For more information, see @ref{FFTW Reference}. + +@c ------------------------------------------------------------ +@node One-Dimensional DFTs of Real Data, Multi-Dimensional DFTs of Real Data, Complex Multi-Dimensional DFTs, Tutorial +@section One-Dimensional DFTs of Real Data + +In many practical applications, the input data @code{in[i]} are purely +real numbers, in which case the DFT output satisfies the ``Hermitian'' +@cindex Hermitian +redundancy: @code{out[i]} is the conjugate of @code{out[n-i]}. It is +possible to take advantage of these circumstances in order to achieve +roughly a factor of two improvement in both speed and memory usage. + +In exchange for these speed and space advantages, the user sacrifices +some of the simplicity of FFTW's complex transforms. First of all, the +input and output arrays are of @emph{different sizes and types}: the +input is @code{n} real numbers, while the output is @code{n/2+1} +complex numbers (the non-redundant outputs); this also requires slight +``padding'' of the input array for +@cindex padding +in-place transforms. Second, the inverse transform (complex to real) +has the side-effect of @emph{overwriting its input array}, by default. +Neither of these inconveniences should pose a serious problem for +users, but it is important to be aware of them. + +The routines to perform real-data transforms are almost the same as +those for complex transforms: you allocate arrays of @code{double} +and/or @code{fftw_complex} (preferably using @code{fftw_malloc} or +@code{fftw_alloc_complex}), create an @code{fftw_plan}, execute it as +many times as you want with @code{fftw_execute(plan)}, and clean up +with @code{fftw_destroy_plan(plan)} (and @code{fftw_free}). The only +differences are that the input (or output) is of type @code{double} +and there are new routines to create the plan. In one dimension: + +@example +fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, + unsigned flags); +fftw_plan fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, + unsigned flags); +@end example +@findex fftw_plan_dft_r2c_1d +@findex fftw_plan_dft_c2r_1d + +for the real input to complex-Hermitian output (@dfn{r2c}) and +complex-Hermitian input to real output (@dfn{c2r}) transforms. +@cindex r2c +@cindex c2r +Unlike the complex DFT planner, there is no @code{sign} argument. +Instead, r2c DFTs are always @code{FFTW_FORWARD} and c2r DFTs are +always @code{FFTW_BACKWARD}. +@ctindex FFTW_FORWARD +@ctindex FFTW_BACKWARD +(For single/long-double precision +@code{fftwf} and @code{fftwl}, @code{double} should be replaced by +@code{float} and @code{long double}, respectively.) +@cindex precision + + +Here, @code{n} is the ``logical'' size of the DFT, not necessarily the +physical size of the array. In particular, the real (@code{double}) +array has @code{n} elements, while the complex (@code{fftw_complex}) +array has @code{n/2+1} elements (where the division is rounded down). +For an in-place transform, +@cindex in-place +@code{in} and @code{out} are aliased to the same array, which must be +big enough to hold both; so, the real array would actually have +@code{2*(n/2+1)} elements, where the elements beyond the first +@code{n} are unused padding. (Note that this is very different from +the concept of ``zero-padding'' a transform to a larger length, which +changes the logical size of the DFT by actually adding new input +data.) The @math{k}th element of the complex array is exactly the +same as the @math{k}th element of the corresponding complex DFT. All +positive @code{n} are supported; products of small factors are most +efficient, but an @Onlogn algorithm is used even for prime sizes. + +As noted above, the c2r transform destroys its input array even for +out-of-place transforms. This can be prevented, if necessary, by +including @code{FFTW_PRESERVE_INPUT} in the @code{flags}, with +unfortunately some sacrifice in performance. +@cindex flags +@ctindex FFTW_PRESERVE_INPUT +This flag is also not currently supported for multi-dimensional real +DFTs (next section). + +Readers familiar with DFTs of real data will recall that the 0th (the +``DC'') and @code{n/2}-th (the ``Nyquist'' frequency, when @code{n} is +even) elements of the complex output are purely real. Some +implementations therefore store the Nyquist element where the DC +imaginary part would go, in order to make the input and output arrays +the same size. Such packing, however, does not generalize well to +multi-dimensional transforms, and the space savings are miniscule in +any case; FFTW does not support it. + +An alternative interface for one-dimensional r2c and c2r DFTs can be +found in the @samp{r2r} interface (@pxref{The Halfcomplex-format +DFT}), with ``halfcomplex''-format output that @emph{is} the same size +(and type) as the input array. +@cindex halfcomplex format +That interface, although it is not very useful for multi-dimensional +transforms, may sometimes yield better performance. + +@c ------------------------------------------------------------ +@node Multi-Dimensional DFTs of Real Data, More DFTs of Real Data, One-Dimensional DFTs of Real Data, Tutorial +@section Multi-Dimensional DFTs of Real Data + +Multi-dimensional DFTs of real data use the following planner routines: + +@example +fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1, + double *in, fftw_complex *out, + unsigned flags); +fftw_plan fftw_plan_dft_r2c_3d(int n0, int n1, int n2, + double *in, fftw_complex *out, + unsigned flags); +fftw_plan fftw_plan_dft_r2c(int rank, const int *n, + double *in, fftw_complex *out, + unsigned flags); +@end example +@findex fftw_plan_dft_r2c_2d +@findex fftw_plan_dft_r2c_3d +@findex fftw_plan_dft_r2c + +as well as the corresponding @code{c2r} routines with the input/output +types swapped. These routines work similarly to their complex +analogues, except for the fact that here the complex output array is cut +roughly in half and the real array requires padding for in-place +transforms (as in 1d, above). + +As before, @code{n} is the logical size of the array, and the +consequences of this on the the format of the complex arrays deserve +careful attention. +@cindex r2c/c2r multi-dimensional array format +Suppose that the real data has dimensions @ndims (in row-major order). +Then, after an r2c transform, the output is an @ndimshalf array of +@code{fftw_complex} values in row-major order, corresponding to slightly +over half of the output of the corresponding complex DFT. (The division +is rounded down.) The ordering of the data is otherwise exactly the +same as in the complex-DFT case. + +For out-of-place transforms, this is the end of the story: the real +data is stored as a row-major array of size @ndims and the complex +data is stored as a row-major array of size @ndimshalf{}. + +For in-place transforms, however, extra padding of the real-data array +is necessary because the complex array is larger than the real array, +and the two arrays share the same memory locations. Thus, for +in-place transforms, the final dimension of the real-data array must +be padded with extra values to accommodate the size of the complex +data---two values if the last dimension is even and one if it is odd. +@cindex padding +That is, the last dimension of the real data must physically contain +@tex +$2 (n_{d-1}/2+1)$ +@end tex +@ifinfo +2 * (n[d-1]/2+1) +@end ifinfo +@html +2 * (nd-1/2+1) +@end html +@code{double} values (exactly enough to hold the complex data). +This physical array size does not, however, change the @emph{logical} +array size---only +@tex +$n_{d-1}$ +@end tex +@ifinfo +n[d-1] +@end ifinfo +@html +nd-1 +@end html +values are actually stored in the last dimension, and +@tex +$n_{d-1}$ +@end tex +@ifinfo +n[d-1] +@end ifinfo +@html +nd-1 +@end html +is the last dimension passed to the plan-creation routine. + +For example, consider the transform of a two-dimensional real array of +size @code{n0} by @code{n1}. The output of the r2c transform is a +two-dimensional complex array of size @code{n0} by @code{n1/2+1}, where +the @code{y} dimension has been cut nearly in half because of +redundancies in the output. Because @code{fftw_complex} is twice the +size of @code{double}, the output array is slightly bigger than the +input array. Thus, if we want to compute the transform in place, we +must @emph{pad} the input array so that it is of size @code{n0} by +@code{2*(n1/2+1)}. If @code{n1} is even, then there are two padding +elements at the end of each row (which need not be initialized, as they +are only used for output). + +@ifhtml +The following illustration depicts the input and output arrays just +described, for both the out-of-place and in-place transforms (with the +arrows indicating consecutive memory locations): +@image{rfftwnd-for-html} +@end ifhtml +@ifnotinfo +@ifnothtml +@float Figure,fig:rfftwnd +@center @image{rfftwnd} +@caption{Illustration of the data layout for a 2d @code{nx} by @code{ny} +real-to-complex transform.} +@end float +@ref{fig:rfftwnd} depicts the input and output arrays just +described, for both the out-of-place and in-place transforms (with the +arrows indicating consecutive memory locations): +@end ifnothtml +@end ifnotinfo + +These transforms are unnormalized, so an r2c followed by a c2r +transform (or vice versa) will result in the original data scaled by +the number of real data elements---that is, the product of the +(logical) dimensions of the real data. +@cindex normalization + + +(Because the last dimension is treated specially, if it is equal to +@code{1} the transform is @emph{not} equivalent to a lower-dimensional +r2c/c2r transform. In that case, the last complex dimension also has +size @code{1} (@code{=1/2+1}), and no advantage is gained over the +complex transforms.) + +@c ------------------------------------------------------------ +@node More DFTs of Real Data, , Multi-Dimensional DFTs of Real Data, Tutorial +@section More DFTs of Real Data +@menu +* The Halfcomplex-format DFT:: +* Real even/odd DFTs (cosine/sine transforms):: +* The Discrete Hartley Transform:: +@end menu + +FFTW supports several other transform types via a unified @dfn{r2r} +(real-to-real) interface, +@cindex r2r +so called because it takes a real (@code{double}) array and outputs a +real array of the same size. These r2r transforms currently fall into +three categories: DFTs of real input and complex-Hermitian output in +halfcomplex format, DFTs of real input with even/odd symmetry +(a.k.a. discrete cosine/sine transforms, DCTs/DSTs), and discrete +Hartley transforms (DHTs), all described in more detail by the +following sections. + +The r2r transforms follow the by now familiar interface of creating an +@code{fftw_plan}, executing it with @code{fftw_execute(plan)}, and +destroying it with @code{fftw_destroy_plan(plan)}. Furthermore, all +r2r transforms share the same planner interface: + +@example +fftw_plan fftw_plan_r2r_1d(int n, double *in, double *out, + fftw_r2r_kind kind, unsigned flags); +fftw_plan fftw_plan_r2r_2d(int n0, int n1, double *in, double *out, + fftw_r2r_kind kind0, fftw_r2r_kind kind1, + unsigned flags); +fftw_plan fftw_plan_r2r_3d(int n0, int n1, int n2, + double *in, double *out, + fftw_r2r_kind kind0, + fftw_r2r_kind kind1, + fftw_r2r_kind kind2, + unsigned flags); +fftw_plan fftw_plan_r2r(int rank, const int *n, double *in, double *out, + const fftw_r2r_kind *kind, unsigned flags); +@end example +@findex fftw_plan_r2r_1d +@findex fftw_plan_r2r_2d +@findex fftw_plan_r2r_3d +@findex fftw_plan_r2r + +Just as for the complex DFT, these plan 1d/2d/3d/multi-dimensional +transforms for contiguous arrays in row-major order, transforming (real) +input to output of the same size, where @code{n} specifies the +@emph{physical} dimensions of the arrays. All positive @code{n} are +supported (with the exception of @code{n=1} for the @code{FFTW_REDFT00} +kind, noted in the real-even subsection below); products of small +factors are most efficient (factorizing @code{n-1} and @code{n+1} for +@code{FFTW_REDFT00} and @code{FFTW_RODFT00} kinds, described below), but +an @Onlogn algorithm is used even for prime sizes. + +Each dimension has a @dfn{kind} parameter, of type +@code{fftw_r2r_kind}, specifying the kind of r2r transform to be used +for that dimension. +@cindex kind (r2r) +@tindex fftw_r2r_kind +(In the case of @code{fftw_plan_r2r}, this is an array @code{kind[rank]} +where @code{kind[i]} is the transform kind for the dimension +@code{n[i]}.) The kind can be one of a set of predefined constants, +defined in the following subsections. + +In other words, FFTW computes the separable product of the specified +r2r transforms over each dimension, which can be used e.g. for partial +differential equations with mixed boundary conditions. (For some r2r +kinds, notably the halfcomplex DFT and the DHT, such a separable +product is somewhat problematic in more than one dimension, however, +as is described below.) + +In the current version of FFTW, all r2r transforms except for the +halfcomplex type are computed via pre- or post-processing of +halfcomplex transforms, and they are therefore not as fast as they +could be. Since most other general DCT/DST codes employ a similar +algorithm, however, FFTW's implementation should provide at least +competitive performance. + +@c =========> +@node The Halfcomplex-format DFT, Real even/odd DFTs (cosine/sine transforms), More DFTs of Real Data, More DFTs of Real Data +@subsection The Halfcomplex-format DFT + +An r2r kind of @code{FFTW_R2HC} (@dfn{r2hc}) corresponds to an r2c DFT +@ctindex FFTW_R2HC +@cindex r2c +@cindex r2hc +(@pxref{One-Dimensional DFTs of Real Data}) but with ``halfcomplex'' +format output, and may sometimes be faster and/or more convenient than +the latter. +@cindex halfcomplex format +The inverse @dfn{hc2r} transform is of kind @code{FFTW_HC2R}. +@ctindex FFTW_HC2R +@cindex hc2r +This consists of the non-redundant half of the complex output for a 1d +real-input DFT of size @code{n}, stored as a sequence of @code{n} real +numbers (@code{double}) in the format: + +@tex +$$ +r_0, r_1, r_2, \ldots, r_{n/2}, i_{(n+1)/2-1}, \ldots, i_2, i_1 +$$ +@end tex +@ifinfo +r0, r1, r2, r(n/2), i((n+1)/2-1), ..., i2, i1 +@end ifinfo +@html +

    +r0, r1, r2, ..., rn/2, i(n+1)/2-1, ..., i2, i1 +

    +@end html + +Here, +@ifinfo +rk +@end ifinfo +@tex +$r_k$ +@end tex +@html +rk +@end html +is the real part of the @math{k}th output, and +@ifinfo +ik +@end ifinfo +@tex +$i_k$ +@end tex +@html +ik +@end html +is the imaginary part. (Division by 2 is rounded down.) For a +halfcomplex array @code{hc[n]}, the @math{k}th component thus has its +real part in @code{hc[k]} and its imaginary part in @code{hc[n-k]}, with +the exception of @code{k} @code{==} @code{0} or @code{n/2} (the latter +only if @code{n} is even)---in these two cases, the imaginary part is +zero due to symmetries of the real-input DFT, and is not stored. +Thus, the r2hc transform of @code{n} real values is a halfcomplex array of +length @code{n}, and vice versa for hc2r. +@cindex normalization + + +Aside from the differing format, the output of +@code{FFTW_R2HC}/@code{FFTW_HC2R} is otherwise exactly the same as for +the corresponding 1d r2c/c2r transform +(i.e. @code{FFTW_FORWARD}/@code{FFTW_BACKWARD} transforms, respectively). +Recall that these transforms are unnormalized, so r2hc followed by hc2r +will result in the original data multiplied by @code{n}. Furthermore, +like the c2r transform, an out-of-place hc2r transform will +@emph{destroy its input} array. + +Although these halfcomplex transforms can be used with the +multi-dimensional r2r interface, the interpretation of such a separable +product of transforms along each dimension is problematic. For example, +consider a two-dimensional @code{n0} by @code{n1}, r2hc by r2hc +transform planned by @code{fftw_plan_r2r_2d(n0, n1, in, out, FFTW_R2HC, +FFTW_R2HC, FFTW_MEASURE)}. Conceptually, FFTW first transforms the rows +(of size @code{n1}) to produce halfcomplex rows, and then transforms the +columns (of size @code{n0}). Half of these column transforms, however, +are of imaginary parts, and should therefore be multiplied by @math{i} +and combined with the r2hc transforms of the real columns to produce the +2d DFT amplitudes; FFTW's r2r transform does @emph{not} perform this +combination for you. Thus, if a multi-dimensional real-input/output DFT +is required, we recommend using the ordinary r2c/c2r +interface (@pxref{Multi-Dimensional DFTs of Real Data}). + +@c =========> +@node Real even/odd DFTs (cosine/sine transforms), The Discrete Hartley Transform, The Halfcomplex-format DFT, More DFTs of Real Data +@subsection Real even/odd DFTs (cosine/sine transforms) + +The Fourier transform of a real-even function @math{f(-x) = f(x)} is +real-even, and @math{i} times the Fourier transform of a real-odd +function @math{f(-x) = -f(x)} is real-odd. Similar results hold for a +discrete Fourier transform, and thus for these symmetries the need for +complex inputs/outputs is entirely eliminated. Moreover, one gains a +factor of two in speed/space from the fact that the data are real, and +an additional factor of two from the even/odd symmetry: only the +non-redundant (first) half of the array need be stored. The result is +the real-even DFT (@dfn{REDFT}) and the real-odd DFT (@dfn{RODFT}), also +known as the discrete cosine and sine transforms (@dfn{DCT} and +@dfn{DST}), respectively. +@cindex real-even DFT +@cindex REDFT +@cindex real-odd DFT +@cindex RODFT +@cindex discrete cosine transform +@cindex DCT +@cindex discrete sine transform +@cindex DST + + +(In this section, we describe the 1d transforms; multi-dimensional +transforms are just a separable product of these transforms operating +along each dimension.) + +Because of the discrete sampling, one has an additional choice: is the +data even/odd around a sampling point, or around the point halfway +between two samples? The latter corresponds to @emph{shifting} the +samples by @emph{half} an interval, and gives rise to several transform +variants denoted by REDFT@math{ab} and RODFT@math{ab}: @math{a} and +@math{b} are @math{0} or @math{1}, and indicate whether the input +(@math{a}) and/or output (@math{b}) are shifted by half a sample +(@math{1} means it is shifted). These are also known as types I-IV of +the DCT and DST, and all four types are supported by FFTW's r2r +interface.@footnote{There are also type V-VIII transforms, which +correspond to a logical DFT of @emph{odd} size @math{N}, independent of +whether the physical size @code{n} is odd, but we do not support these +variants.} + +The r2r kinds for the various REDFT and RODFT types supported by FFTW, +along with the boundary conditions at both ends of the @emph{input} +array (@code{n} real numbers @code{in[j=0..n-1]}), are: + +@itemize @bullet + +@item +@code{FFTW_REDFT00} (DCT-I): even around @math{j=0} and even around @math{j=n-1}. +@ctindex FFTW_REDFT00 + +@item +@code{FFTW_REDFT10} (DCT-II, ``the'' DCT): even around @math{j=-0.5} and even around @math{j=n-0.5}. +@ctindex FFTW_REDFT10 + +@item +@code{FFTW_REDFT01} (DCT-III, ``the'' IDCT): even around @math{j=0} and odd around @math{j=n}. +@ctindex FFTW_REDFT01 +@cindex IDCT + +@item +@code{FFTW_REDFT11} (DCT-IV): even around @math{j=-0.5} and odd around @math{j=n-0.5}. +@ctindex FFTW_REDFT11 + +@item +@code{FFTW_RODFT00} (DST-I): odd around @math{j=-1} and odd around @math{j=n}. +@ctindex FFTW_RODFT00 + +@item +@code{FFTW_RODFT10} (DST-II): odd around @math{j=-0.5} and odd around @math{j=n-0.5}. +@ctindex FFTW_RODFT10 + +@item +@code{FFTW_RODFT01} (DST-III): odd around @math{j=-1} and even around @math{j=n-1}. +@ctindex FFTW_RODFT01 + +@item +@code{FFTW_RODFT11} (DST-IV): odd around @math{j=-0.5} and even around @math{j=n-0.5}. +@ctindex FFTW_RODFT11 + +@end itemize + +Note that these symmetries apply to the ``logical'' array being +transformed; @strong{there are no constraints on your physical input +data}. So, for example, if you specify a size-5 REDFT00 (DCT-I) of the +data @math{abcde}, it corresponds to the DFT of the logical even array +@math{abcdedcb} of size 8. A size-4 REDFT10 (DCT-II) of the data +@math{abcd} corresponds to the size-8 logical DFT of the even array +@math{abcddcba}, shifted by half a sample. + +All of these transforms are invertible. The inverse of R*DFT00 is +R*DFT00; of R*DFT10 is R*DFT01 and vice versa (these are often called +simply ``the'' DCT and IDCT, respectively); and of R*DFT11 is R*DFT11. +However, the transforms computed by FFTW are unnormalized, exactly +like the corresponding real and complex DFTs, so computing a transform +followed by its inverse yields the original array scaled by @math{N}, +where @math{N} is the @emph{logical} DFT size. For REDFT00, +@math{N=2(n-1)}; for RODFT00, @math{N=2(n+1)}; otherwise, @math{N=2n}. +@cindex normalization +@cindex IDCT + + +Note that the boundary conditions of the transform output array are +given by the input boundary conditions of the inverse transform. +Thus, the above transforms are all inequivalent in terms of +input/output boundary conditions, even neglecting the 0.5 shift +difference. + +FFTW is most efficient when @math{N} is a product of small factors; note +that this @emph{differs} from the factorization of the physical size +@code{n} for REDFT00 and RODFT00! There is another oddity: @code{n=1} +REDFT00 transforms correspond to @math{N=0}, and so are @emph{not +defined} (the planner will return @code{NULL}). Otherwise, any positive +@code{n} is supported. + +For the precise mathematical definitions of these transforms as used by +FFTW, see @ref{What FFTW Really Computes}. (For people accustomed to +the DCT/DST, FFTW's definitions have a coefficient of @math{2} in front +of the cos/sin functions so that they correspond precisely to an +even/odd DFT of size @math{N}. Some authors also include additional +multiplicative factors of +@ifinfo +sqrt(2) +@end ifinfo +@html +√2 +@end html +@tex +$\sqrt{2}$ +@end tex +for selected inputs and outputs; this makes +the transform orthogonal, but sacrifices the direct equivalence to a +symmetric DFT.) + +@subsubheading Which type do you need? + +Since the required flavor of even/odd DFT depends upon your problem, +you are the best judge of this choice, but we can make a few comments +on relative efficiency to help you in your selection. In particular, +R*DFT01 and R*DFT10 tend to be slightly faster than R*DFT11 +(especially for odd sizes), while the R*DFT00 transforms are sometimes +significantly slower (especially for even sizes).@footnote{R*DFT00 is +sometimes slower in FFTW because we discovered that the standard +algorithm for computing this by a pre/post-processed real DFT---the +algorithm used in FFTPACK, Numerical Recipes, and other sources for +decades now---has serious numerical problems: it already loses several +decimal places of accuracy for 16k sizes. There seem to be only two +alternatives in the literature that do not suffer similarly: a +recursive decomposition into smaller DCTs, which would require a large +set of codelets for efficiency and generality, or sacrificing a factor of +@tex +$\sim 2$ +@end tex +@ifnottex +2 +@end ifnottex +in speed to use a real DFT of twice the size. We currently +employ the latter technique for general @math{n}, as well as a limited +form of the former method: a split-radix decomposition when @math{n} +is odd (@math{N} a multiple of 4). For @math{N} containing many +factors of 2, the split-radix method seems to recover most of the +speed of the standard algorithm without the accuracy tradeoff.} + +Thus, if only the boundary conditions on the transform inputs are +specified, we generally recommend R*DFT10 over R*DFT00 and R*DFT01 over +R*DFT11 (unless the half-sample shift or the self-inverse property is +significant for your problem). + +If performance is important to you and you are using only small sizes +(say @math{n<200}), e.g. for multi-dimensional transforms, then you +might consider generating hard-coded transforms of those sizes and types +that you are interested in (@pxref{Generating your own code}). + +We are interested in hearing what types of symmetric transforms you find +most useful. + +@c =========> +@node The Discrete Hartley Transform, , Real even/odd DFTs (cosine/sine transforms), More DFTs of Real Data +@subsection The Discrete Hartley Transform + +If you are planning to use the DHT because you've heard that it is +``faster'' than the DFT (FFT), @strong{stop here}. The DHT is not +faster than the DFT. That story is an old but enduring misconception +that was debunked in 1987. + +The discrete Hartley transform (DHT) is an invertible linear transform +closely related to the DFT. In the DFT, one multiplies each input by +@math{cos - i * sin} (a complex exponential), whereas in the DHT each +input is multiplied by simply @math{cos + sin}. Thus, the DHT +transforms @code{n} real numbers to @code{n} real numbers, and has the +convenient property of being its own inverse. In FFTW, a DHT (of any +positive @code{n}) can be specified by an r2r kind of @code{FFTW_DHT}. +@ctindex FFTW_DHT +@cindex discrete Hartley transform +@cindex DHT + +Like the DFT, in FFTW the DHT is unnormalized, so computing a DHT of +size @code{n} followed by another DHT of the same size will result in +the original array multiplied by @code{n}. +@cindex normalization + +The DHT was originally proposed as a more efficient alternative to the +DFT for real data, but it was subsequently shown that a specialized DFT +(such as FFTW's r2hc or r2c transforms) could be just as fast. In FFTW, +the DHT is actually computed by post-processing an r2hc transform, so +there is ordinarily no reason to prefer it from a performance +perspective.@footnote{We provide the DHT mainly as a byproduct of some +internal algorithms. FFTW computes a real input/output DFT of +@emph{prime} size by re-expressing it as a DHT plus post/pre-processing +and then using Rader's prime-DFT algorithm adapted to the DHT.} +However, we have heard rumors that the DHT might be the most appropriate +transform in its own right for certain applications, and we would be +very interested to hear from anyone who finds it useful. + +If @code{FFTW_DHT} is specified for multiple dimensions of a +multi-dimensional transform, FFTW computes the separable product of 1d +DHTs along each dimension. Unfortunately, this is not quite the same +thing as a true multi-dimensional DHT; you can compute the latter, if +necessary, with at most @code{rank-1} post-processing passes +[see e.g. H. Hao and R. N. Bracewell, @i{Proc. IEEE} @b{75}, 264--266 (1987)]. + +For the precise mathematical definition of the DHT as used by FFTW, see +@ref{What FFTW Really Computes}. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/upgrading.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/upgrading.texi new file mode 100644 index 000000000..838269c7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/upgrading.texi @@ -0,0 +1,198 @@ +@node Upgrading from FFTW version 2, Installation and Customization, Calling FFTW from Legacy Fortran, Top +@chapter Upgrading from FFTW version 2 + +In this chapter, we outline the process for updating codes designed for +the older FFTW 2 interface to work with FFTW 3. The interface for FFTW +3 is not backwards-compatible with the interface for FFTW 2 and earlier +versions; codes written to use those versions will fail to link with +FFTW 3. Nor is it possible to write ``compatibility wrappers'' to +bridge the gap (at least not efficiently), because FFTW 3 has different +semantics from previous versions. However, upgrading should be a +straightforward process because the data formats are identical and the +overall style of planning/execution is essentially the same. + +Unlike FFTW 2, there are no separate header files for real and complex +transforms (or even for different precisions) in FFTW 3; all interfaces +are defined in the @code{} header file. + +@heading Numeric Types + +The main difference in data types is that @code{fftw_complex} in FFTW 2 +was defined as a @code{struct} with macros @code{c_re} and @code{c_im} +for accessing the real/imaginary parts. (This is binary-compatible with +FFTW 3 on any machine except perhaps for some older Crays in single +precision.) The equivalent macros for FFTW 3 are: + +@example +#define c_re(c) ((c)[0]) +#define c_im(c) ((c)[1]) +@end example + +This does not work if you are using the C99 complex type, however, +unless you insert a @code{double*} typecast into the above macros +(@pxref{Complex numbers}). + +Also, FFTW 2 had an @code{fftw_real} typedef that was an alias for +@code{double} (in double precision). In FFTW 3 you should just use +@code{double} (or whatever precision you are employing). + +@heading Plans + +The major difference between FFTW 2 and FFTW 3 is in the +planning/execution division of labor. In FFTW 2, plans were found for a +given transform size and type, and then could be applied to @emph{any} +arrays and for @emph{any} multiplicity/stride parameters. In FFTW 3, +you specify the particular arrays, stride parameters, etcetera when +creating the plan, and the plan is then executed for @emph{those} arrays +(unless the guru interface is used) and @emph{those} parameters +@emph{only}. (FFTW 2 had ``specific planner'' routines that planned for +a particular array and stride, but the plan could still be used for +other arrays and strides.) That is, much of the information that was +formerly specified at execution time is now specified at planning time. + +Like FFTW 2's specific planner routines, the FFTW 3 planner overwrites +the input/output arrays unless you use @code{FFTW_ESTIMATE}. + +FFTW 2 had separate data types @code{fftw_plan}, @code{fftwnd_plan}, +@code{rfftw_plan}, and @code{rfftwnd_plan} for complex and real one- and +multi-dimensional transforms, and each type had its own @samp{destroy} +function. In FFTW 3, all plans are of type @code{fftw_plan} and all are +destroyed by @code{fftw_destroy_plan(plan)}. + +Where you formerly used @code{fftw_create_plan} and @code{fftw_one} to +plan and compute a single 1d transform, you would now use +@code{fftw_plan_dft_1d} to plan the transform. If you used the generic +@code{fftw} function to execute the transform with multiplicity +(@code{howmany}) and stride parameters, you would now use the advanced +interface @code{fftw_plan_many_dft} to specify those parameters. The +plans are now executed with @code{fftw_execute(plan)}, which takes all +of its parameters (including the input/output arrays) from the plan. + +In-place transforms no longer interpret their output argument as scratch +space, nor is there an @code{FFTW_IN_PLACE} flag. You simply pass the +same pointer for both the input and output arguments. (Previously, the +output @code{ostride} and @code{odist} parameters were ignored for +in-place transforms; now, if they are specified via the advanced +interface, they are significant even in the in-place case, although they +should normally equal the corresponding input parameters.) + +The @code{FFTW_ESTIMATE} and @code{FFTW_MEASURE} flags have the same +meaning as before, although the planning time will differ. You may also +consider using @code{FFTW_PATIENT}, which is like @code{FFTW_MEASURE} +except that it takes more time in order to consider a wider variety of +algorithms. + +For multi-dimensional complex DFTs, instead of @code{fftwnd_create_plan} +(or @code{fftw2d_create_plan} or @code{fftw3d_create_plan}), followed by +@code{fftwnd_one}, you would use @code{fftw_plan_dft} (or +@code{fftw_plan_dft_2d} or @code{fftw_plan_dft_3d}). followed by +@code{fftw_execute}. If you used @code{fftwnd} to to specify strides +etcetera, you would instead specify these via @code{fftw_plan_many_dft}. + +The analogues to @code{rfftw_create_plan} and @code{rfftw_one} with +@code{FFTW_REAL_TO_COMPLEX} or @code{FFTW_COMPLEX_TO_REAL} directions +are @code{fftw_plan_r2r_1d} with kind @code{FFTW_R2HC} or +@code{FFTW_HC2R}, followed by @code{fftw_execute}. The stride etcetera +arguments of @code{rfftw} are now in @code{fftw_plan_many_r2r}. + +Instead of @code{rfftwnd_create_plan} (or @code{rfftw2d_create_plan} or +@code{rfftw3d_create_plan}) followed by +@code{rfftwnd_one_real_to_complex} or +@code{rfftwnd_one_complex_to_real}, you now use @code{fftw_plan_dft_r2c} +(or @code{fftw_plan_dft_r2c_2d} or @code{fftw_plan_dft_r2c_3d}) or +@code{fftw_plan_dft_c2r} (or @code{fftw_plan_dft_c2r_2d} or +@code{fftw_plan_dft_c2r_3d}), respectively, followed by +@code{fftw_execute}. As usual, the strides etcetera of +@code{rfftwnd_real_to_complex} or @code{rfftwnd_complex_to_real} are no +specified in the advanced planner routines, +@code{fftw_plan_many_dft_r2c} or @code{fftw_plan_many_dft_c2r}. + +@heading Wisdom + +In FFTW 2, you had to supply the @code{FFTW_USE_WISDOM} flag in order to +use wisdom; in FFTW 3, wisdom is always used. (You could simulate the +FFTW 2 wisdom-less behavior by calling @code{fftw_forget_wisdom} after +every planner call.) + +The FFTW 3 wisdom import/export routines are almost the same as before +(although the storage format is entirely different). There is one +significant difference, however. In FFTW 2, the import routines would +never read past the end of the wisdom, so you could store extra data +beyond the wisdom in the same file, for example. In FFTW 3, the +file-import routine may read up to a few hundred bytes past the end of +the wisdom, so you cannot store other data just beyond it.@footnote{We +do our own buffering because GNU libc I/O routines are horribly slow for +single-character I/O, apparently for thread-safety reasons (whether you +are using threads or not).} + +Wisdom has been enhanced by additional humility in FFTW 3: whereas FFTW +2 would re-use wisdom for a given transform size regardless of the +stride etc., in FFTW 3 wisdom is only used with the strides etc. for +which it was created. Unfortunately, this means FFTW 3 has to create +new plans from scratch more often than FFTW 2 (in FFTW 2, planning +e.g. one transform of size 1024 also created wisdom for all smaller +powers of 2, but this no longer occurs). + +FFTW 3 also has the new routine @code{fftw_import_system_wisdom} to +import wisdom from a standard system-wide location. + +@heading Memory allocation + +In FFTW 3, we recommend allocating your arrays with @code{fftw_malloc} +and deallocating them with @code{fftw_free}; this is not required, but +allows optimal performance when SIMD acceleration is used. (Those two +functions actually existed in FFTW 2, and worked the same way, but were +not documented.) + +In FFTW 2, there were @code{fftw_malloc_hook} and @code{fftw_free_hook} +functions that allowed the user to replace FFTW's memory-allocation +routines (e.g. to implement different error-handling, since by default +FFTW prints an error message and calls @code{exit} to abort the program +if @code{malloc} returns @code{NULL}). These hooks are not supported in +FFTW 3; those few users who require this functionality can just +directly modify the memory-allocation routines in FFTW (they are defined +in @code{kernel/alloc.c}). + +@heading Fortran interface + +In FFTW 2, the subroutine names were obtained by replacing @samp{fftw_} +with @samp{fftw_f77}; in FFTW 3, you replace @samp{fftw_} with +@samp{dfftw_} (or @samp{sfftw_} or @samp{lfftw_}, depending upon the +precision). + +In FFTW 3, we have begun recommending that you always declare the type +used to store plans as @code{integer*8}. (Too many people didn't notice +our instruction to switch from @code{integer} to @code{integer*8} for +64-bit machines.) + +In FFTW 3, we provide a @code{fftw3.f} ``header file'' to include in +your code (and which is officially installed on Unix systems). (In FFTW +2, we supplied a @code{fftw_f77.i} file, but it was not installed.) + +Otherwise, the C-Fortran interface relationship is much the same as it +was before (e.g. return values become initial parameters, and +multi-dimensional arrays are in column-major order). Unlike FFTW 2, we +do provide some support for wisdom import/export in Fortran +(@pxref{Wisdom of Fortran?}). + +@heading Threads + +Like FFTW 2, only the execution routines are thread-safe. All planner +routines, etcetera, should be called by only a single thread at a time +(@pxref{Thread safety}). @emph{Unlike} FFTW 2, there is no special +@code{FFTW_THREADSAFE} flag for the planner to allow a given plan to be +usable by multiple threads in parallel; this is now the case by default. + +The multi-threaded version of FFTW 2 required you to pass the number of +threads each time you execute the transform. The number of threads is +now stored in the plan, and is specified before the planner is called by +@code{fftw_plan_with_nthreads}. The threads initialization routine used +to be called @code{fftw_threads_init} and would return zero on success; +the new routine is called @code{fftw_init_threads} and returns zero on +failure. @xref{Multi-threaded FFTW}. + +There is no separate threads header file in FFTW 3; all the function +prototypes are in @code{}. However, you still have to link to +a separate library (@code{-lfftw3_threads -lfftw3 -lm} on Unix), as well as +to the threading library (e.g. POSIX threads on Unix). + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/version.texi b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/version.texi new file mode 100644 index 000000000..c4c0e7c67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 24 May 2018 +@set UPDATED-MONTH May 2018 +@set EDITION 3.3.8 +@set VERSION 3.3.8 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/fftw.pc.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/fftw.pc.in new file mode 100644 index 000000000..a3dfc7f03 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/fftw.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: FFTW +Description: fast Fourier transform library +Version: @VERSION@ +Libs: -L${libdir} -lfftw3@PREC_SUFFIX@ @LIBQUADMATH@ +Libs.private: -lm +Cflags: -I${includedir} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/Makefile.am new file mode 100644 index 000000000..6d00c26b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/Makefile.am @@ -0,0 +1,25 @@ +# this makefile requires GNU make. + +EXTRA_DIST = algsimp.ml annotate.ml assoctable.ml c.ml complex.ml \ +conv.ml dag.ml expr.ml fft.ml gen_hc2c.ml gen_hc2cdft.ml \ +gen_hc2cdft_c.ml gen_hc2hc.ml gen_r2cb.ml gen_mdct.ml gen_notw.ml \ +gen_notw_c.ml gen_r2cf.ml gen_r2r.ml gen_twiddle.ml gen_twiddle_c.ml \ +gen_twidsq.ml gen_twidsq_c.ml genutil.ml littlesimp.ml magic.ml \ +monads.ml number.ml oracle.ml schedule.ml simd.ml simdmagic.ml \ +to_alist.ml trig.ml twiddle.ml unique.ml util.ml variable.ml \ +algsimp.mli annotate.mli assoctable.mli c.mli complex.mli conv.mli \ +dag.mli expr.mli fft.mli littlesimp.mli number.mli oracle.mli \ +schedule.mli simd.mli to_alist.mli trig.mli twiddle.mli unique.mli \ +util.mli variable.mli + +GENFFT_NATIVE=gen_notw.native gen_notw_c.native gen_twiddle.native \ +gen_twiddle_c.native gen_twidsq.native gen_twidsq_c.native \ +gen_r2r.native gen_r2cf.native gen_r2cb.native gen_hc2c.native \ +gen_hc2cdft.native gen_hc2cdft_c.native gen_hc2hc.native \ +gen_mdct.native + +all-local:: + $(OCAMLBUILD) -classic-display -libs unix,nums $(GENFFT_NATIVE) + +maintainer-clean-local:: + $(OCAMLBUILD) -classic-display -clean diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/Makefile.in new file mode 100644 index 000000000..48fc99e19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/Makefile.in @@ -0,0 +1,506 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# this makefile requires GNU make. +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = genfft +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = algsimp.ml annotate.ml assoctable.ml c.ml complex.ml \ +conv.ml dag.ml expr.ml fft.ml gen_hc2c.ml gen_hc2cdft.ml \ +gen_hc2cdft_c.ml gen_hc2hc.ml gen_r2cb.ml gen_mdct.ml gen_notw.ml \ +gen_notw_c.ml gen_r2cf.ml gen_r2r.ml gen_twiddle.ml gen_twiddle_c.ml \ +gen_twidsq.ml gen_twidsq_c.ml genutil.ml littlesimp.ml magic.ml \ +monads.ml number.ml oracle.ml schedule.ml simd.ml simdmagic.ml \ +to_alist.ml trig.ml twiddle.ml unique.ml util.ml variable.ml \ +algsimp.mli annotate.mli assoctable.mli c.mli complex.mli conv.mli \ +dag.mli expr.mli fft.mli littlesimp.mli number.mli oracle.mli \ +schedule.mli simd.mli to_alist.mli trig.mli twiddle.mli unique.mli \ +util.mli variable.mli + +GENFFT_NATIVE = gen_notw.native gen_notw_c.native gen_twiddle.native \ +gen_twiddle_c.native gen_twidsq.native gen_twidsq_c.native \ +gen_r2r.native gen_r2cf.native gen_r2cb.native gen_hc2c.native \ +gen_hc2cdft.native gen_hc2cdft_c.native gen_hc2hc.native \ +gen_mdct.native + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu genfft/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu genfft/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile all-local +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool cscopelist-am ctags-am distclean \ + distclean-generic distclean-libtool distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +all-local:: + $(OCAMLBUILD) -classic-display -libs unix,nums $(GENFFT_NATIVE) + +maintainer-clean-local:: + $(OCAMLBUILD) -classic-display -clean + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/algsimp.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/algsimp.ml new file mode 100644 index 000000000..4c786fc77 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/algsimp.ml @@ -0,0 +1,580 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + + +open Util +open Expr + +let node_insert x = Assoctable.insert Expr.hash x +let node_lookup x = Assoctable.lookup Expr.hash (==) x + +(************************************************************* + * Algebraic simplifier/elimination of common subexpressions + *************************************************************) +module AlgSimp : sig + val algsimp : expr list -> expr list +end = struct + + open Monads.StateMonad + open Monads.MemoMonad + open Assoctable + + let fetchSimp = + fetchState >>= fun (s, _) -> returnM s + let storeSimp s = + fetchState >>= (fun (_, c) -> storeState (s, c)) + let lookupSimpM key = + fetchSimp >>= fun table -> + returnM (node_lookup key table) + let insertSimpM key value = + fetchSimp >>= fun table -> + storeSimp (node_insert key value table) + + let subset a b = + List.for_all (fun x -> List.exists (fun y -> x == y) b) a + + let structurallyEqualCSE a b = + match (a, b) with + | (Num a, Num b) -> Number.equal a b + | (NaN a, NaN b) -> a == b + | (Load a, Load b) -> Variable.same a b + | (Times (a, a'), Times (b, b')) -> + ((a == b) && (a' == b')) || + ((a == b') && (a' == b)) + | (CTimes (a, a'), CTimes (b, b')) -> + ((a == b) && (a' == b')) || + ((a == b') && (a' == b)) + | (CTimesJ (a, a'), CTimesJ (b, b')) -> ((a == b) && (a' == b')) + | (Plus a, Plus b) -> subset a b && subset b a + | (Uminus a, Uminus b) -> (a == b) + | _ -> false + + let hashCSE x = + if (!Magic.randomized_cse) then + Oracle.hash x + else + Expr.hash x + + let equalCSE a b = + if (!Magic.randomized_cse) then + (structurallyEqualCSE a b || Oracle.likely_equal a b) + else + structurallyEqualCSE a b + + let fetchCSE = + fetchState >>= fun (_, c) -> returnM c + let storeCSE c = + fetchState >>= (fun (s, _) -> storeState (s, c)) + let lookupCSEM key = + fetchCSE >>= fun table -> + returnM (Assoctable.lookup hashCSE equalCSE key table) + let insertCSEM key value = + fetchCSE >>= fun table -> + storeCSE (Assoctable.insert hashCSE key value table) + + (* memoize both x and Uminus x (unless x is already negated) *) + let identityM x = + let memo x = memoizing lookupCSEM insertCSEM returnM x in + match x with + Uminus _ -> memo x + | _ -> memo x >>= fun x' -> memo (Uminus x') >> returnM x' + + let makeNode = identityM + + (* simplifiers for various kinds of nodes *) + let rec snumM = function + n when Number.is_zero n -> + makeNode (Num (Number.zero)) + | n when Number.negative n -> + makeNode (Num (Number.negate n)) >>= suminusM + | n -> makeNode (Num n) + + and suminusM = function + Uminus x -> makeNode x + | Num a when (Number.is_zero a) -> snumM Number.zero + | a -> makeNode (Uminus a) + + and stimesM = function + | (Uminus a, b) -> stimesM (a, b) >>= suminusM + | (a, Uminus b) -> stimesM (a, b) >>= suminusM + | (NaN I, CTimes (a, b)) -> stimesM (NaN I, b) >>= + fun ib -> sctimesM (a, ib) + | (NaN I, CTimesJ (a, b)) -> stimesM (NaN I, b) >>= + fun ib -> sctimesjM (a, ib) + | (Num a, Num b) -> snumM (Number.mul a b) + | (Num a, Times (Num b, c)) -> + snumM (Number.mul a b) >>= fun x -> stimesM (x, c) + | (Num a, b) when Number.is_zero a -> snumM Number.zero + | (Num a, b) when Number.is_one a -> makeNode b + | (Num a, b) when Number.is_mone a -> suminusM b + | (a, b) when is_known_constant b && not (is_known_constant a) -> + stimesM (b, a) + | (a, b) -> makeNode (Times (a, b)) + + and sctimesM = function + | (Uminus a, b) -> sctimesM (a, b) >>= suminusM + | (a, Uminus b) -> sctimesM (a, b) >>= suminusM + | (a, b) -> makeNode (CTimes (a, b)) + + and sctimesjM = function + | (Uminus a, b) -> sctimesjM (a, b) >>= suminusM + | (a, Uminus b) -> sctimesjM (a, b) >>= suminusM + | (a, b) -> makeNode (CTimesJ (a, b)) + + and reduce_sumM x = match x with + [] -> returnM [] + | [Num a] -> + if (Number.is_zero a) then + returnM [] + else returnM x + | [Uminus (Num a)] -> + if (Number.is_zero a) then + returnM [] + else returnM x + | (Num a) :: (Num b) :: s -> + snumM (Number.add a b) >>= fun x -> + reduce_sumM (x :: s) + | (Num a) :: (Uminus (Num b)) :: s -> + snumM (Number.sub a b) >>= fun x -> + reduce_sumM (x :: s) + | (Uminus (Num a)) :: (Num b) :: s -> + snumM (Number.sub b a) >>= fun x -> + reduce_sumM (x :: s) + | (Uminus (Num a)) :: (Uminus (Num b)) :: s -> + snumM (Number.add a b) >>= + suminusM >>= fun x -> + reduce_sumM (x :: s) + | ((Num _) as a) :: b :: s -> reduce_sumM (b :: a :: s) + | ((Uminus (Num _)) as a) :: b :: s -> reduce_sumM (b :: a :: s) + | a :: s -> + reduce_sumM s >>= fun s' -> returnM (a :: s') + + and collectible1 = function + | NaN _ -> false + | Uminus x -> collectible1 x + | _ -> true + and collectible (a, b) = collectible1 a + + (* collect common factors: ax + bx -> (a+b)x *) + and collectM which x = + let rec findCoeffM which = function + | Times (a, b) when collectible (which (a, b)) -> returnM (which (a, b)) + | Uminus x -> + findCoeffM which x >>= fun (coeff, b) -> + suminusM coeff >>= fun mcoeff -> + returnM (mcoeff, b) + | x -> snumM Number.one >>= fun one -> returnM (one, x) + and separateM xpr = function + [] -> returnM ([], []) + | a :: b -> + separateM xpr b >>= fun (w, wo) -> + (* try first factor *) + findCoeffM (fun (a, b) -> (a, b)) a >>= fun (c, x) -> + if (xpr == x) && collectible (c, x) then returnM (c :: w, wo) + else + (* try second factor *) + findCoeffM (fun (a, b) -> (b, a)) a >>= fun (c, x) -> + if (xpr == x) && collectible (c, x) then returnM (c :: w, wo) + else returnM (w, a :: wo) + in match x with + [] -> returnM x + | [a] -> returnM x + | a :: b -> + findCoeffM which a >>= fun (_, xpr) -> + separateM xpr x >>= fun (w, wo) -> + collectM which wo >>= fun wo' -> + splusM w >>= fun w' -> + stimesM (w', xpr) >>= fun t' -> + returnM (t':: wo') + + and mangleSumM x = returnM x + >>= reduce_sumM + >>= collectM (fun (a, b) -> (a, b)) + >>= collectM (fun (a, b) -> (b, a)) + >>= reduce_sumM + >>= deepCollectM !Magic.deep_collect_depth + >>= reduce_sumM + + and reorder_uminus = function (* push all Uminuses to the end *) + [] -> [] + | ((Uminus _) as a' :: b) -> (reorder_uminus b) @ [a'] + | (a :: b) -> a :: (reorder_uminus b) + + and canonicalizeM = function + [] -> snumM Number.zero + | [a] -> makeNode a (* one term *) + | a -> generateFusedMultAddM (reorder_uminus a) + + and generateFusedMultAddM = + let rec is_multiplication = function + | Times (Num a, b) -> true + | Uminus (Times (Num a, b)) -> true + | _ -> false + and separate = function + [] -> ([], [], Number.zero) + | (Times (Num a, b)) as this :: c -> + let (x, y, max) = separate c in + let newmax = if (Number.greater a max) then a else max in + (this :: x, y, newmax) + | (Uminus (Times (Num a, b))) as this :: c -> + let (x, y, max) = separate c in + let newmax = if (Number.greater a max) then a else max in + (this :: x, y, newmax) + | this :: c -> + let (x, y, max) = separate c in + (x, this :: y, max) + in fun l -> + if !Magic.enable_fma && count is_multiplication l >= 2 then + let (w, wo, max) = separate l in + snumM (Number.div Number.one max) >>= fun invmax' -> + snumM max >>= fun max' -> + mapM (fun x -> stimesM (invmax', x)) w >>= splusM >>= fun pw' -> + stimesM (max', pw') >>= fun mw' -> + splusM (wo @ [mw']) + else + makeNode (Plus l) + + + and negative = function + Uminus _ -> true + | _ -> false + + (* + * simplify patterns of the form + * + * ((c_1 * a + ...) + ...) + (c_2 * a + ...) + * + * The pattern includes arbitrary coefficients and minus signs. + * A common case of this pattern is the butterfly + * (a + b) + (a - b) + * (a + b) - (a - b) + *) + (* this whole procedure needs much more thought *) + and deepCollectM maxdepth l = + let rec findTerms depth x = match x with + | Uminus x -> findTerms depth x + | Times (Num _, b) -> (findTerms (depth - 1) b) + | Plus l when depth > 0 -> + x :: List.flatten (List.map (findTerms (depth - 1)) l) + | x -> [x] + and duplicates = function + [] -> [] + | a :: b -> if List.memq a b then a :: duplicates b + else duplicates b + + in let rec splitDuplicates depth d x = + if (List.memq x d) then + snumM (Number.zero) >>= fun zero -> + returnM (zero, x) + else match x with + | Times (a, b) -> + splitDuplicates (depth - 1) d a >>= fun (a', xa) -> + splitDuplicates (depth - 1) d b >>= fun (b', xb) -> + stimesM (a', b') >>= fun ab -> + stimesM (a, xb) >>= fun xb' -> + stimesM (xa, b) >>= fun xa' -> + stimesM (xa, xb) >>= fun xab -> + splusM [xa'; xb'; xab] >>= fun x -> + returnM (ab, x) + | Uminus a -> + splitDuplicates depth d a >>= fun (x, y) -> + suminusM x >>= fun ux -> + suminusM y >>= fun uy -> + returnM (ux, uy) + | Plus l when depth > 0 -> + mapM (splitDuplicates (depth - 1) d) l >>= fun ld -> + let (l', d') = List.split ld in + splusM l' >>= fun p -> + splusM d' >>= fun d'' -> + returnM (p, d'') + | x -> + snumM (Number.zero) >>= fun zero' -> + returnM (x, zero') + + in let l' = List.flatten (List.map (findTerms maxdepth) l) + in match duplicates l' with + | [] -> returnM l + | d -> + mapM (splitDuplicates maxdepth d) l >>= fun ld -> + let (l', d') = List.split ld in + splusM l' >>= fun l'' -> + let rec flattenPlusM = function + | Plus l -> returnM l + | Uminus x -> + flattenPlusM x >>= mapM suminusM + | x -> returnM [x] + in + mapM flattenPlusM d' >>= fun d'' -> + splusM (List.flatten d'') >>= fun d''' -> + mangleSumM [l''; d'''] + + and splusM l = + let fma_heuristics x = + if !Magic.enable_fma then + match x with + | [Uminus (Times _); Times _] -> Some false + | [Times _; Uminus (Times _)] -> Some false + | [Uminus (_); Times _] -> Some true + | [Times _; Uminus (Plus _)] -> Some true + | [_; Uminus (Times _)] -> Some false + | [Uminus (Times _); _] -> Some false + | _ -> None + else + None + in + mangleSumM l >>= fun l' -> + (* no terms are negative. Don't do anything *) + if not (List.exists negative l') then + canonicalizeM l' + (* all terms are negative. Negate them all and collect the minus sign *) + else if List.for_all negative l' then + mapM suminusM l' >>= splusM >>= suminusM + else match fma_heuristics l' with + | Some true -> mapM suminusM l' >>= splusM >>= suminusM + | Some false -> canonicalizeM l' + | None -> + (* Ask the Oracle for the canonical form *) + if (not !Magic.randomized_cse) && + Oracle.should_flip_sign (Plus l') then + mapM suminusM l' >>= splusM >>= suminusM + else + canonicalizeM l' + + (* monadic style algebraic simplifier for the dag *) + let rec algsimpM x = + memoizing lookupSimpM insertSimpM + (function + | Num a -> snumM a + | NaN _ as x -> makeNode x + | Plus a -> + mapM algsimpM a >>= splusM + | Times (a, b) -> + (algsimpM a >>= fun a' -> + algsimpM b >>= fun b' -> + stimesM (a', b')) + | CTimes (a, b) -> + (algsimpM a >>= fun a' -> + algsimpM b >>= fun b' -> + sctimesM (a', b')) + | CTimesJ (a, b) -> + (algsimpM a >>= fun a' -> + algsimpM b >>= fun b' -> + sctimesjM (a', b')) + | Uminus a -> + algsimpM a >>= suminusM + | Store (v, a) -> + algsimpM a >>= fun a' -> + makeNode (Store (v, a')) + | Load _ as x -> makeNode x) + x + + let initialTable = (empty, empty) + let simp_roots = mapM algsimpM + let algsimp = runM initialTable simp_roots +end + +(************************************************************* + * Network transposition algorithm + *************************************************************) +module Transpose = struct + open Monads.StateMonad + open Monads.MemoMonad + open Littlesimp + + let fetchDuals = fetchState + let storeDuals = storeState + + let lookupDualsM key = + fetchDuals >>= fun table -> + returnM (node_lookup key table) + + let insertDualsM key value = + fetchDuals >>= fun table -> + storeDuals (node_insert key value table) + + let rec visit visited vtable parent_table = function + [] -> (visited, parent_table) + | node :: rest -> + match node_lookup node vtable with + | Some _ -> visit visited vtable parent_table rest + | None -> + let children = match node with + | Store (v, n) -> [n] + | Plus l -> l + | Times (a, b) -> [a; b] + | CTimes (a, b) -> [a; b] + | CTimesJ (a, b) -> [a; b] + | Uminus x -> [x] + | _ -> [] + in let rec loop t = function + [] -> t + | a :: rest -> + (match node_lookup a t with + None -> loop (node_insert a [node] t) rest + | Some c -> loop (node_insert a (node :: c) t) rest) + in + (visit + (node :: visited) + (node_insert node () vtable) + (loop parent_table children) + (children @ rest)) + + let make_transposer parent_table = + let rec termM node candidate_parent = + match candidate_parent with + | Store (_, n) when n == node -> + dualM candidate_parent >>= fun x' -> returnM [x'] + | Plus (l) when List.memq node l -> + dualM candidate_parent >>= fun x' -> returnM [x'] + | Times (a, b) when b == node -> + dualM candidate_parent >>= fun x' -> + returnM [makeTimes (a, x')] + | CTimes (a, b) when b == node -> + dualM candidate_parent >>= fun x' -> + returnM [CTimes (a, x')] + | CTimesJ (a, b) when b == node -> + dualM candidate_parent >>= fun x' -> + returnM [CTimesJ (a, x')] + | Uminus n when n == node -> + dualM candidate_parent >>= fun x' -> + returnM [makeUminus x'] + | _ -> returnM [] + + and dualExpressionM this_node = + mapM (termM this_node) + (match node_lookup this_node parent_table with + | Some a -> a + | None -> failwith "bug in dualExpressionM" + ) >>= fun l -> + returnM (makePlus (List.flatten l)) + + and dualM this_node = + memoizing lookupDualsM insertDualsM + (function + | Load v as x -> + if (Variable.is_constant v) then + returnM (Load v) + else + (dualExpressionM x >>= fun d -> + returnM (Store (v, d))) + | Store (v, x) -> returnM (Load v) + | x -> dualExpressionM x) + this_node + + in dualM + + let is_store = function + | Store _ -> true + | _ -> false + + let transpose dag = + let _ = Util.info "begin transpose" in + let (all_nodes, parent_table) = + visit [] Assoctable.empty Assoctable.empty dag in + let transposerM = make_transposer parent_table in + let mapTransposerM = mapM transposerM in + let duals = runM Assoctable.empty mapTransposerM all_nodes in + let roots = List.filter is_store duals in + let _ = Util.info "end transpose" in + roots +end + + +(************************************************************* + * Various dag statistics + *************************************************************) +module Stats : sig + type complexity + val complexity : Expr.expr list -> complexity + val same_complexity : complexity -> complexity -> bool + val leq_complexity : complexity -> complexity -> bool + val to_string : complexity -> string +end = struct + type complexity = int * int * int * int * int * int + let rec visit visited vtable = function + [] -> visited + | node :: rest -> + match node_lookup node vtable with + Some _ -> visit visited vtable rest + | None -> + let children = match node with + Store (v, n) -> [n] + | Plus l -> l + | Times (a, b) -> [a; b] + | Uminus x -> [x] + | _ -> [] + in visit (node :: visited) + (node_insert node () vtable) + (children @ rest) + + let complexity dag = + let rec loop (load, store, plus, times, uminus, num) = function + [] -> (load, store, plus, times, uminus, num) + | node :: rest -> + loop + (match node with + | Load _ -> (load + 1, store, plus, times, uminus, num) + | Store _ -> (load, store + 1, plus, times, uminus, num) + | Plus x -> (load, store, plus + (List.length x - 1), times, uminus, num) + | Times _ -> (load, store, plus, times + 1, uminus, num) + | Uminus _ -> (load, store, plus, times, uminus + 1, num) + | Num _ -> (load, store, plus, times, uminus, num + 1) + | CTimes _ -> (load, store, plus, times, uminus, num) + | CTimesJ _ -> (load, store, plus, times, uminus, num) + | NaN _ -> (load, store, plus, times, uminus, num)) + rest + in let (l, s, p, t, u, n) = + loop (0, 0, 0, 0, 0, 0) (visit [] Assoctable.empty dag) + in (l, s, p, t, u, n) + + let weight (l, s, p, t, u, n) = + l + s + 10 * p + 20 * t + u + n + + let same_complexity a b = weight a = weight b + let leq_complexity a b = weight a <= weight b + + let to_string (l, s, p, t, u, n) = + Printf.sprintf "ld=%d st=%d add=%d mul=%d uminus=%d num=%d\n" + l s p t u n + +end + +(* simplify the dag *) +let algsimp v = + let rec simplification_loop v = + let () = Util.info "simplification step" in + let complexity = Stats.complexity v in + let () = Util.info ("complexity = " ^ (Stats.to_string complexity)) in + let v = (AlgSimp.algsimp @@ Transpose.transpose @@ + AlgSimp.algsimp @@ Transpose.transpose) v in + let complexity' = Stats.complexity v in + let () = Util.info ("complexity = " ^ (Stats.to_string complexity')) in + if (Stats.leq_complexity complexity' complexity) then + let () = Util.info "end algsimp" in + v + else + simplification_loop v + + in + let () = Util.info "begin algsimp" in + let v = AlgSimp.algsimp v in + if !Magic.network_transposition then simplification_loop v else v + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/algsimp.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/algsimp.mli new file mode 100644 index 000000000..4ae4c0d6c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/algsimp.mli @@ -0,0 +1,22 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val algsimp : Expr.expr list -> Expr.expr list diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/annotate.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/annotate.ml new file mode 100644 index 000000000..b97365797 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/annotate.ml @@ -0,0 +1,361 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* Here, we take a schedule (produced by schedule.ml) ordering a + sequence of instructions, and produce an annotated schedule. The + annotated schedule has the same ordering as the original schedule, + but is additionally partitioned into nested blocks of temporary + variables. The partitioning is computed via a heuristic algorithm. + + The blocking allows the C code that we generate to consist of + nested blocks that help communicate variable lifetimes to the + compiler. *) + +open Schedule +open Expr +open Variable + +type annotated_schedule = + Annotate of variable list * variable list * variable list * int * aschedule +and aschedule = + ADone + | AInstr of assignment + | ASeq of (annotated_schedule * annotated_schedule) + +let addelem a set = if not (List.memq a set) then a :: set else set +let union l = + let f x = addelem x (* let is source of polymorphism *) + in List.fold_right f l + +(* set difference a - b *) +let diff a b = List.filter (fun x -> not (List.memq x b)) a + +let rec minimize f = function + [] -> failwith "minimize" + | [n] -> n + | n :: rest -> + let x = minimize f rest in + if (f x) >= (f n) then n else x + +(* find all variables used inside a scheduling unit *) +let rec find_block_vars = function + Done -> [] + | (Instr (Assign (v, x))) -> v :: (find_vars x) + | Par a -> List.flatten (List.map find_block_vars a) + | Seq (a, b) -> (find_block_vars a) @ (find_block_vars b) + +let uniq l = + List.fold_right (fun a b -> if List.memq a b then b else a :: b) l [] + +let has_related x = List.exists (Variable.same_class x) + +let rec overlap a b = Util.count (fun y -> has_related y b) a + +(* reorder a list of schedules so as to maximize overlap of variables *) +let reorder l = + let rec loop = function + [] -> [] + | (a, va) :: b -> + let c = + List.map + (fun (a, x) -> ((a, x), (overlap va x, List.length x))) b in + let c' = + Sort.list + (fun (_, (a, la)) (_, (b, lb)) -> + la < lb || a > b) + c in + let b' = List.map (fun (a, _) -> a) c' in + a :: (loop b') in + let l' = List.map (fun x -> x, uniq (find_block_vars x)) l in + (* start with smallest block --- does this matter ? *) + match l' with + [] -> [] + | _ -> + let m = minimize (fun (_, x) -> (List.length x)) l' in + let l'' = Util.remove m l' in + loop (m :: l'') + +(* remove Par blocks *) +let rec linearize = function + | Seq (a, Done) -> linearize a + | Seq (Done, a) -> linearize a + | Seq (a, b) -> Seq (linearize a, linearize b) + + (* try to balance nested Par blocks *) + | Par [a] -> linearize a + | Par l -> + let n2 = (List.length l) / 2 in + let rec loop n a b = + if n = 0 then + (List.rev b, a) + else + match a with + [] -> failwith "loop" + | x :: y -> loop (n - 1) y (x :: b) + in let (a, b) = loop n2 (reorder l) [] + in linearize (Seq (Par a, Par b)) + + | x -> x + +let subset a b = + List.for_all (fun x -> List.exists (fun y -> x == y) b) a + +let use_same_vars (Assign (av, ax)) (Assign (bv, bx)) = + is_temporary av && + is_temporary bv && + (let va = Expr.find_vars ax and vb = Expr.find_vars bx in + subset va vb && subset vb va) + +let store_to_same_class (Assign (av, ax)) (Assign (bv, bx)) = + is_locative av && + is_locative bv && + Variable.same_class av bv + +let loads_from_same_class (Assign (av, ax)) (Assign (bv, bx)) = + match (ax, bx) with + | (Load a), (Load b) when + Variable.is_locative a && Variable.is_locative b + -> Variable.same_class a b + | _ -> false + +(* extract instructions from schedule *) +let rec sched_to_ilist = function + | Done -> [] + | Instr a -> [a] + | Seq (a, b) -> (sched_to_ilist a) @ (sched_to_ilist b) + | _ -> failwith "sched_to_ilist" (* Par blocks removed by linearize *) + +let rec find_friends friendp insn friends foes = function + | [] -> (friends, foes) + | a :: b -> + if (a == insn) || (friendp a insn) then + find_friends friendp insn (a :: friends) foes b + else + find_friends friendp insn friends (a :: foes) b + +(* schedule all instructions in the equivalence class determined + by friendp at the point where the last one + is executed *) +let rec delay_friends friendp sched = + let rec recur insns = function + | Done -> (Done, insns) + | Instr a -> + let (friends, foes) = find_friends friendp a [] [] insns in + (Schedule.sequentially friends), foes + | Seq (a, b) -> + let (b', insnsb) = recur insns b in + let (a', insnsa) = recur insnsb a in + (Seq (a', b')), insnsa + | _ -> failwith "delay_friends" + in match recur (sched_to_ilist sched) sched with + | (s, []) -> s (* assert that all insns have been used *) + | _ -> failwith "delay_friends" + +(* schedule all instructions in the equivalence class determined + by friendp at the point where the first one + is executed *) +let rec anticipate_friends friendp sched = + let rec recur insns = function + | Done -> (Done, insns) + | Instr a -> + let (friends, foes) = find_friends friendp a [] [] insns in + (Schedule.sequentially friends), foes + | Seq (a, b) -> + let (a', insnsa) = recur insns a in + let (b', insnsb) = recur insnsa b in + (Seq (a', b')), insnsb + | _ -> failwith "anticipate_friends" + in match recur (sched_to_ilist sched) sched with + | (s, []) -> s (* assert that all insns have been used *) + | _ -> failwith "anticipate_friends" + +let collect_buddy_stores buddy_list sched = + let rec recur sched delayed_stores = match sched with + | Done -> (sched, delayed_stores) + | Instr (Assign (v, x)) -> + begin + try + let buddies = List.find (List.memq v) buddy_list in + let tmp = Variable.make_temporary () in + let i = Seq(Instr (Assign (tmp, x)), + Instr (Assign (v, Times (NaN MULTI_A, Load tmp)))) + and delayed_stores = (v, Load tmp) :: delayed_stores in + try + (Seq (i, + Instr (Assign + (List.hd buddies, + Times (NaN MULTI_B, + Plus (List.map + (fun buddy -> + List.assq buddy + delayed_stores) + buddies))) ))) + , delayed_stores + with Not_found -> (i, delayed_stores) + with Not_found -> (sched, delayed_stores) + end + | Seq (a, b) -> + let (newa, delayed_stores) = recur a delayed_stores in + let (newb, delayed_stores) = recur b delayed_stores in + (Seq (newa, newb), delayed_stores) + | _ -> failwith "collect_buddy_stores" + in let (sched, _) = recur sched [] in + sched + +let schedule_for_pipeline sched = + let update_readytimes t (Assign (v, _)) ready_times = + (v, (t + !Magic.pipeline_latency)) :: ready_times + and readyp t ready_times (Assign (_, x)) = + List.for_all + (fun var -> + try + (List.assq var ready_times) <= t + with Not_found -> false) + (List.filter Variable.is_temporary (Expr.find_vars x)) + in + let rec recur sched t ready_times delayed_instructions = + let (ready, not_ready) = + List.partition (readyp t ready_times) delayed_instructions + in match ready with + | a :: b -> + let (sched, t, ready_times, delayed_instructions) = + recur sched (t+1) (update_readytimes t a ready_times) + (b @ not_ready) + in + (Seq (Instr a, sched)), t, ready_times, delayed_instructions + | _ -> (match sched with + | Done -> (sched, t, ready_times, delayed_instructions) + | Instr a -> + if (readyp t ready_times a) then + (sched, (t+1), (update_readytimes t a ready_times), + delayed_instructions) + else + (Done, t, ready_times, (a :: delayed_instructions)) + | Seq (a, b) -> + let (a, t, ready_times, delayed_instructions) = + recur a t ready_times delayed_instructions + in + let (b, t, ready_times, delayed_instructions) = + recur b t ready_times delayed_instructions + in (Seq (a, b)), t, ready_times, delayed_instructions + | _ -> failwith "schedule_for_pipeline") + in let rec recur_until_done sched t ready_times delayed_instructions = + let (sched, t, ready_times, delayed_instructions) = + recur sched t ready_times delayed_instructions + in match delayed_instructions with + | [] -> sched + | _ -> + (Seq (sched, + (recur_until_done Done (t+1) ready_times + delayed_instructions))) + in recur_until_done sched 0 [] [] + +let rec rewrite_declarations force_declarations + (Annotate (_, _, declared, _, what)) = + let m = !Magic.number_of_variables in + + let declare_it declared = + if (force_declarations || List.length declared >= m) then + ([], declared) + else + (declared, []) + + in match what with + ADone -> Annotate ([], [], [], 0, what) + | AInstr i -> + let (u, d) = declare_it declared + in Annotate ([], u, d, 0, what) + | ASeq (a, b) -> + let ma = rewrite_declarations false a + and mb = rewrite_declarations false b + in let Annotate (_, ua, _, _, _) = ma + and Annotate (_, ub, _, _, _) = mb + in let (u, d) = declare_it (declared @ ua @ ub) + in Annotate ([], u, d, 0, ASeq (ma, mb)) + +let annotate list_of_buddy_stores schedule = + let rec analyze live_at_end = function + Done -> Annotate (live_at_end, [], [], 0, ADone) + | Instr i -> (match i with + Assign (v, x) -> + let vars = (find_vars x) in + Annotate (Util.remove v (union live_at_end vars), [v], [], + 0, AInstr i)) + | Seq (a, b) -> + let ab = analyze live_at_end b in + let Annotate (live_at_begin_b, defined_b, _, depth_a, _) = ab in + let aa = analyze live_at_begin_b a in + let Annotate (live_at_begin_a, defined_a, _, depth_b, _) = aa in + let defined = List.filter is_temporary (defined_a @ defined_b) in + let declarable = diff defined live_at_end in + let undeclarable = diff defined declarable + and maxdepth = max depth_a depth_b in + Annotate (live_at_begin_a, undeclarable, declarable, + List.length declarable + maxdepth, + ASeq (aa, ab)) + | _ -> failwith "really_analyze" + + in + let () = Util.info "begin annotate" in + let x = linearize schedule in + + let x = + if (!Magic.schedule_for_pipeline && !Magic.pipeline_latency > 0) then + schedule_for_pipeline x + else + x + in + + let x = + if !Magic.reorder_insns then + linearize(anticipate_friends use_same_vars x) + else + x + in + + (* delay stores to the real and imaginary parts of the same number *) + let x = + if !Magic.reorder_stores then + linearize(delay_friends store_to_same_class x) + else + x + in + + (* move loads of the real and imaginary parts of the same number *) + let x = + if !Magic.reorder_loads then + linearize(anticipate_friends loads_from_same_class x) + else + x + in + + let x = collect_buddy_stores list_of_buddy_stores x in + let x = analyze [] x in + let res = rewrite_declarations true x in + let () = Util.info "end annotate" in + res + +let rec dump print (Annotate (_, _, _, _, code)) = + dump_code print code +and dump_code print = function + | ADone -> () + | AInstr x -> print ((assignment_to_string x) ^ "\n") + | ASeq (a, b) -> dump print a; dump print b diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/annotate.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/annotate.mli new file mode 100644 index 000000000..f5ad57727 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/annotate.mli @@ -0,0 +1,36 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Variable +open Expr + +type annotated_schedule = + Annotate of variable list * variable list * variable list * + int * aschedule +and aschedule = + ADone + | AInstr of assignment + | ASeq of (annotated_schedule * annotated_schedule) + +val annotate : + variable list list -> Schedule.schedule -> annotated_schedule + +val dump : (string -> unit) -> annotated_schedule -> unit diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/assoctable.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/assoctable.ml new file mode 100644 index 000000000..8ad235df8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/assoctable.ml @@ -0,0 +1,65 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(************************************************************* + * Functional associative table + *************************************************************) + +(* + * this module implements a functional associative table. + * The table is parametrized by an equality predicate and + * a hash function, with the restriction that (equal a b) ==> + * hash a == hash b. + * The table is purely functional and implemented using a binary + * search tree (not balanced for now) + *) + +type ('a, 'b) elem = + Leaf + | Node of int * ('a, 'b) elem * ('a, 'b) elem * ('a * 'b) list + +let empty = Leaf + +let lookup hash equal key table = + let h = hash key in + let rec look = function + Leaf -> None + | Node (hash_key, left, right, this_list) -> + if (hash_key < h) then look left + else if (hash_key > h) then look right + else let rec loop = function + [] -> None + | (a, b) :: rest -> if (equal key a) then Some b else loop rest + in loop this_list + in look table + +let insert hash key value table = + let h = hash key in + let rec ins = function + Leaf -> Node (h, Leaf, Leaf, [(key, value)]) + | Node (hash_key, left, right, this_list) -> + if (hash_key < h) then + Node (hash_key, ins left, right, this_list) + else if (hash_key > h) then + Node (hash_key, left, ins right, this_list) + else + Node (hash_key, left, right, (key, value) :: this_list) + in ins table diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/assoctable.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/assoctable.mli new file mode 100644 index 000000000..49f8a0695 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/assoctable.mli @@ -0,0 +1,29 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type ('a, 'b) elem = + | Leaf + | Node of int * ('a, 'b) elem * ('a, 'b) elem * ('a * 'b) list +val empty : ('a, 'b) elem +val lookup : + ('a -> int) -> ('a -> 'b -> bool) -> 'a -> ('b, 'c) elem -> 'c option +val insert : + ('a -> int) -> 'a -> 'c -> ('a, 'c) elem -> ('a, 'c) elem diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/c.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/c.ml new file mode 100644 index 000000000..0b4964bb1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/c.ml @@ -0,0 +1,461 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* + * This module contains the definition of a C-like abstract + * syntax tree, and functions to convert ML values into C + * programs + *) + +open Expr +open Annotate +open List + +let realtype = "R" +let realtypep = realtype ^ " *" +let extended_realtype = "E" +let constrealtype = "const " ^ realtype +let constrealtypep = constrealtype ^ " *" + +let stridetype = "stride" + +(*********************************** + * C program structure + ***********************************) +type c_decl = + | Decl of string * string + | Tdecl of string (* arbitrary text declaration *) + +and c_ast = + | Asch of annotated_schedule + | Simd_leavefun + | Return of c_ast + | For of c_ast * c_ast * c_ast * c_ast + | If of c_ast * c_ast + | Block of (c_decl list) * (c_ast list) + | Binop of string * c_ast * c_ast + | Expr_assign of c_ast * c_ast + | Stmt_assign of c_ast * c_ast + | Comma of c_ast * c_ast + | Integer of int + | CVar of string + | CCall of string * c_ast + | CPlus of c_ast list + | ITimes of c_ast * c_ast + | CUminus of c_ast +and c_fcn = Fcn of string * string * (c_decl list) * c_ast + + +let ctimes = function + | (Integer 1), a -> a + | a, (Integer 1) -> a + | a, b -> ITimes (a, b) + +(* + * C AST unparser + *) +let foldr_string_concat l = fold_right (^) l "" + +let rec unparse_expr_c = + let yes x = x and no x = "" in + + let rec unparse_plus maybe = + let maybep = maybe " + " in + function + | [] -> "" + | (Uminus (Times (a, b))) :: (Uminus c) :: d -> + maybep ^ (op "FNMA" a b c) ^ (unparse_plus yes d) + | (Uminus c) :: (Uminus (Times (a, b))) :: d -> + maybep ^ (op "FNMA" a b c) ^ (unparse_plus yes d) + | (Uminus (Times (a, b))) :: c :: d -> + maybep ^ (op "FNMS" a b c) ^ (unparse_plus yes d) + | c :: (Uminus (Times (a, b))) :: d -> + maybep ^ (op "FNMS" a b c) ^ (unparse_plus yes d) + | (Times (a, b)) :: (Uminus c) :: d -> + maybep ^ (op "FMS" a b c) ^ (unparse_plus yes d) + | (Uminus c) :: (Times (a, b)) :: d -> + maybep ^ (op "FMS" a b c) ^ (unparse_plus yes d) + | (Times (a, b)) :: c :: d -> + maybep ^ (op "FMA" a b c) ^ (unparse_plus yes d) + | c :: (Times (a, b)) :: d -> + maybep ^ (op "FMA" a b c) ^ (unparse_plus yes d) + | (Uminus a :: b) -> + " - " ^ (parenthesize a) ^ (unparse_plus yes b) + | (a :: b) -> + maybep ^ (parenthesize a) ^ (unparse_plus yes b) + and parenthesize x = match x with + | (Load _) -> unparse_expr_c x + | (Num _) -> unparse_expr_c x + | _ -> "(" ^ (unparse_expr_c x) ^ ")" + and op nam a b c = + nam ^ "(" ^ (unparse_expr_c a) ^ ", " ^ (unparse_expr_c b) ^ ", " ^ + (unparse_expr_c c) ^ ")" + + in function + | Load v -> Variable.unparse v + | Num n -> Number.to_konst n + | Plus [] -> "0.0 /* bug */" + | Plus [a] -> " /* bug */ " ^ (unparse_expr_c a) + | Plus a -> (unparse_plus no a) + | Times (a, b) -> (parenthesize a) ^ " * " ^ (parenthesize b) + | Uminus (Plus [a; Uminus b]) -> unparse_plus no [b; Uminus a] + | Uminus a -> "- " ^ (parenthesize a) + | _ -> failwith "unparse_expr_c" + +and unparse_expr_generic = + let rec u x = unparse_expr_generic x + and unary op a = Printf.sprintf "%s(%s)" op (u a) + and binary op a b = Printf.sprintf "%s(%s, %s)" op (u a) (u b) + and ternary op a b c = Printf.sprintf "%s(%s, %s, %s)" op (u a) (u b) (u c) + and quaternary op a b c d = + Printf.sprintf "%s(%s, %s, %s, %s)" op (u a) (u b) (u c) (u d) + and unparse_plus = function + | [(Uminus (Times (a, b))); Times (c, d)] -> quaternary "FNMMS" a b c d + | [Times (c, d); (Uminus (Times (a, b)))] -> quaternary "FNMMS" a b c d + | [Times (c, d); (Times (a, b))] -> quaternary "FMMA" a b c d + | [(Uminus (Times (a, b))); c] -> ternary "FNMS" a b c + | [c; (Uminus (Times (a, b)))] -> ternary "FNMS" a b c + | [(Uminus c); (Times (a, b))] -> ternary "FMS" a b c + | [(Times (a, b)); (Uminus c)] -> ternary "FMS" a b c + | [c; (Times (a, b))] -> ternary "FMA" a b c + | [(Times (a, b)); c] -> ternary "FMA" a b c + | [a; Uminus b] -> binary "SUB" a b + | [a; b] -> binary "ADD" a b + | a :: b :: c -> binary "ADD" a (Plus (b :: c)) + | _ -> failwith "unparse_plus" + in function + | Load v -> Variable.unparse v + | Num n -> Number.to_konst n + | Plus a -> unparse_plus a + | Times (a, b) -> binary "MUL" a b + | Uminus a -> unary "NEG" a + | _ -> failwith "unparse_expr" + +and unparse_expr x = + if !Magic.generic_arith then + unparse_expr_generic x + else + unparse_expr_c x + +and unparse_assignment (Assign (v, x)) = + (Variable.unparse v) ^ " = " ^ (unparse_expr x) ^ ";\n" + +and unparse_annotated force_bracket = + let rec unparse_code = function + ADone -> "" + | AInstr i -> unparse_assignment i + | ASeq (a, b) -> + (unparse_annotated false a) ^ (unparse_annotated false b) + and declare_variables l = + let rec uvar = function + [] -> failwith "uvar" + | [v] -> (Variable.unparse v) ^ ";\n" + | a :: b -> (Variable.unparse a) ^ ", " ^ (uvar b) + in let rec vvar l = + let s = if !Magic.compact then 15 else 1 in + if (List.length l <= s) then + match l with + [] -> "" + | _ -> extended_realtype ^ " " ^ (uvar l) + else + (vvar (Util.take s l)) ^ (vvar (Util.drop s l)) + in vvar (List.filter Variable.is_temporary l) + in function + Annotate (_, _, decl, _, code) -> + if (not force_bracket) && (Util.null decl) then + unparse_code code + else "{\n" ^ + (declare_variables decl) ^ + (unparse_code code) ^ + "}\n" + +and unparse_decl = function + | Decl (a, b) -> a ^ " " ^ b ^ ";\n" + | Tdecl x -> x + +and unparse_ast = + let rec unparse_plus = function + | [] -> "" + | (CUminus a :: b) -> " - " ^ (parenthesize a) ^ (unparse_plus b) + | (a :: b) -> " + " ^ (parenthesize a) ^ (unparse_plus b) + and parenthesize x = match x with + | (CVar _) -> unparse_ast x + | (CCall _) -> unparse_ast x + | (Integer _) -> unparse_ast x + | _ -> "(" ^ (unparse_ast x) ^ ")" + + in + function + | Asch a -> (unparse_annotated true a) + | Simd_leavefun -> "" (* used only in SIMD code *) + | Return x -> "return " ^ unparse_ast x ^ ";" + | For (a, b, c, d) -> + "for (" ^ + unparse_ast a ^ "; " ^ unparse_ast b ^ "; " ^ unparse_ast c + ^ ")" ^ unparse_ast d + | If (a, d) -> + "if (" ^ + unparse_ast a + ^ ")" ^ unparse_ast d + | Block (d, s) -> + if (s == []) then "" + else + "{\n" ^ + foldr_string_concat (map unparse_decl d) ^ + foldr_string_concat (map unparse_ast s) ^ + "}\n" + | Binop (op, a, b) -> (unparse_ast a) ^ op ^ (unparse_ast b) + | Expr_assign (a, b) -> (unparse_ast a) ^ " = " ^ (unparse_ast b) + | Stmt_assign (a, b) -> (unparse_ast a) ^ " = " ^ (unparse_ast b) ^ ";\n" + | Comma (a, b) -> (unparse_ast a) ^ ", " ^ (unparse_ast b) + | Integer i -> string_of_int i + | CVar s -> s + | CCall (s, x) -> s ^ "(" ^ (unparse_ast x) ^ ")" + | CPlus [] -> "0 /* bug */" + | CPlus [a] -> " /* bug */ " ^ (unparse_ast a) + | CPlus (a::b) -> (parenthesize a) ^ (unparse_plus b) + | ITimes (a, b) -> (parenthesize a) ^ " * " ^ (parenthesize b) + | CUminus a -> "- " ^ (parenthesize a) + +and unparse_function = function + Fcn (typ, name, args, body) -> + let rec unparse_args = function + [Decl (a, b)] -> a ^ " " ^ b + | (Decl (a, b)) :: s -> a ^ " " ^ b ^ ", " + ^ unparse_args s + | [] -> "" + | _ -> failwith "unparse_function" + in + (typ ^ " " ^ name ^ "(" ^ unparse_args args ^ ")\n" ^ + unparse_ast body) + + +(************************************************************* + * traverse a a function and return a list of all expressions, + * in the execution order + **************************************************************) +let rec fcn_to_expr_list = fun (Fcn (_, _, _, body)) -> ast_to_expr_list body +and acode_to_expr_list = function + AInstr (Assign (_, x)) -> [x] + | ASeq (a, b) -> + (asched_to_expr_list a) @ (asched_to_expr_list b) + | _ -> [] +and asched_to_expr_list (Annotate (_, _, _, _, code)) = + acode_to_expr_list code +and ast_to_expr_list = function + Asch a -> asched_to_expr_list a + | Block (_, a) -> flatten (map ast_to_expr_list a) + | For (_, _, _, body) -> ast_to_expr_list body + | If (_, body) -> ast_to_expr_list body + | _ -> [] + +(*********************** + * Extracting Constants + ***********************) + +(* add a new key & value to a list of (key,value) pairs, where + the keys are floats and each key is unique up to almost_equal *) + +let extract_constants f = + let constlist = flatten (map expr_to_constants (ast_to_expr_list f)) + in map + (fun n -> + Tdecl + ("DK(" ^ (Number.to_konst n) ^ ", " ^ (Number.to_string n) ^ + ");\n")) + (unique_constants constlist) + +(****************************** + Extracting operation counts + ******************************) + +let count_stack_vars = + let rec count_acode = function + | ASeq (a, b) -> max (count_asched a) (count_asched b) + | _ -> 0 + and count_asched (Annotate (_, _, decl, _, code)) = + (length decl) + (count_acode code) + and count_ast = function + | Asch a -> count_asched a + | Block (d, a) -> (length d) + (Util.max_list (map count_ast a)) + | For (_, _, _, body) -> count_ast body + | If (_, body) -> count_ast body + | _ -> 0 + in function (Fcn (_, _, _, body)) -> count_ast body + +let count_memory_acc f = + let rec count_var v = + if (Variable.is_locative v) then 1 else 0 + and count_acode = function + | AInstr (Assign (v, _)) -> count_var v + | ASeq (a, b) -> (count_asched a) + (count_asched b) + | _ -> 0 + and count_asched = function + Annotate (_, _, _, _, code) -> count_acode code + and count_ast = function + | Asch a -> count_asched a + | Block (_, a) -> (Util.sum_list (map count_ast a)) + | Comma (a, b) -> (count_ast a) + (count_ast b) + | For (_, _, _, body) -> count_ast body + | If (_, body) -> count_ast body + | _ -> 0 + and count_acc_expr_func acc = function + | Load v -> acc + (count_var v) + | Plus a -> fold_left count_acc_expr_func acc a + | Times (a, b) -> fold_left count_acc_expr_func acc [a; b] + | Uminus a -> count_acc_expr_func acc a + | _ -> acc + in let (Fcn (typ, name, args, body)) = f + in (count_ast body) + + fold_left count_acc_expr_func 0 (fcn_to_expr_list f) + +let good_for_fma = To_alist.good_for_fma + +let build_fma = function + | [a; Times (b, c)] when good_for_fma (b, c) -> Some (a, b, c) + | [Times (b, c); a] when good_for_fma (b, c) -> Some (a, b, c) + | [a; Uminus (Times (b, c))] when good_for_fma (b, c) -> Some (a, b, c) + | [Uminus (Times (b, c)); a] when good_for_fma (b, c) -> Some (a, b, c) + | _ -> None + +let rec count_flops_expr_func (adds, mults, fmas) = function + | Plus [] -> (adds, mults, fmas) + | Plus ([_; _] as a) -> + begin + match build_fma a with + | None -> + fold_left count_flops_expr_func + (adds + (length a) - 1, mults, fmas) a + | Some (a, b, c) -> + fold_left count_flops_expr_func (adds, mults, fmas+1) [a; b; c] + end + | Plus (a :: b) -> + count_flops_expr_func (adds, mults, fmas) (Plus [a; Plus b]) + | Times (NaN MULTI_A,_) -> (adds, mults, fmas) + | Times (NaN MULTI_B,_) -> (adds, mults, fmas) + | Times (NaN I,b) -> count_flops_expr_func (adds, mults, fmas) b + | Times (NaN CONJ,b) -> count_flops_expr_func (adds, mults, fmas) b + | Times (a,b) -> fold_left count_flops_expr_func (adds, mults+1, fmas) [a; b] + | CTimes (a,b) -> + fold_left count_flops_expr_func (adds+1, mults+2, fmas) [a; b] + | CTimesJ (a,b) -> + fold_left count_flops_expr_func (adds+1, mults+2, fmas) [a; b] + | Uminus a -> count_flops_expr_func (adds, mults, fmas) a + | _ -> (adds, mults, fmas) + +let count_flops f = + fold_left count_flops_expr_func (0, 0, 0) (fcn_to_expr_list f) + +let count_constants f = + length (unique_constants (flatten (map expr_to_constants (fcn_to_expr_list f)))) + +let arith_complexity f = + let (a, m, fmas) = count_flops f + and v = count_stack_vars f + and c = count_constants f + and mem = count_memory_acc f + in (a, m, fmas, v, c, mem) + +(* print the operation costs *) +let print_cost f = + let Fcn (_, _, _, _) = f + and (a, m, fmas, v, c, mem) = arith_complexity f + in + "/*\n"^ + " * This function contains " ^ + (string_of_int (a + fmas)) ^ " FP additions, " ^ + (string_of_int (m + fmas)) ^ " FP multiplications,\n" ^ + " * (or, " ^ + (string_of_int a) ^ " additions, " ^ + (string_of_int m) ^ " multiplications, " ^ + (string_of_int fmas) ^ " fused multiply/add),\n" ^ + " * " ^ (string_of_int v) ^ " stack variables, " ^ + (string_of_int c) ^ " constants, and " ^ + (string_of_int mem) ^ " memory accesses\n" ^ + " */\n" + +(***************************************** + * functions that create C arrays + *****************************************) +type stride = + | SVar of string + | SConst of string + | SInteger of int + | SNeg of stride + +type sstride = + | Simple of int + | Constant of (string * int) + | Composite of (string * int) + | Negative of sstride + +let rec simplify_stride stride i = + match (stride, i) with + (_, 0) -> Simple 0 + | (SInteger n, i) -> Simple (n * i) + | (SConst s, i) -> Constant (s, i) + | (SVar s, i) -> Composite (s, i) + | (SNeg x, i) -> + match (simplify_stride x i) with + | Negative y -> y + | y -> Negative y + +let rec cstride_to_string = function + | Simple i -> string_of_int i + | Constant (s, i) -> + if !Magic.lisp_syntax then + "(* " ^ s ^ " " ^ (string_of_int i) ^ ")" + else + s ^ " * " ^ (string_of_int i) + | Composite (s, i) -> + if !Magic.lisp_syntax then + "(* " ^ s ^ " " ^ (string_of_int i) ^ ")" + else + "WS(" ^ s ^ ", " ^ (string_of_int i) ^ ")" + | Negative x -> "-" ^ cstride_to_string x + +let aref name index = + if !Magic.lisp_syntax then + Printf.sprintf "(aref %s %s)" name index + else + Printf.sprintf "%s[%s]" name index + +let array_subscript name stride k = + aref name (cstride_to_string (simplify_stride stride k)) + +let varray_subscript name vstride stride v i = + let vindex = simplify_stride vstride v + and iindex = simplify_stride stride i + in + let index = + match (vindex, iindex) with + (Simple vi, Simple ii) -> string_of_int (vi + ii) + | (Simple 0, x) -> cstride_to_string x + | (x, Simple 0) -> cstride_to_string x + | _ -> (cstride_to_string vindex) ^ " + " ^ (cstride_to_string iindex) + in aref name index + +let real_of s = "c_re(" ^ s ^ ")" +let imag_of s = "c_im(" ^ s ^ ")" + +let flops_of f = + let (add, mul, fma) = count_flops f in + Printf.sprintf "{ %d, %d, %d, 0 }" add mul fma diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/c.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/c.mli new file mode 100644 index 000000000..4ea59ef24 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/c.mli @@ -0,0 +1,74 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type stride = + | SVar of string + | SConst of string + | SInteger of int + | SNeg of stride +val array_subscript : string -> stride -> int -> string +val varray_subscript : string -> stride -> stride -> int -> int -> string + +val real_of : string -> string +val imag_of : string -> string + +val realtype : string +val realtypep : string +val constrealtype : string +val constrealtypep : string +val stridetype : string + +type c_decl = + | Decl of string * string + | Tdecl of string (* arbitrary text declaration *) + +and c_ast = + | Asch of Annotate.annotated_schedule + | Simd_leavefun + | Return of c_ast + | For of c_ast * c_ast * c_ast * c_ast + | If of c_ast * c_ast + | Block of (c_decl list) * (c_ast list) + | Binop of string * c_ast * c_ast + | Expr_assign of c_ast * c_ast + | Stmt_assign of c_ast * c_ast + | Comma of c_ast * c_ast + | Integer of int + | CVar of string + | CCall of string * c_ast + | CPlus of c_ast list + | ITimes of c_ast * c_ast + | CUminus of c_ast +and c_fcn = | Fcn of string * string * c_decl list * c_ast + +val unparse_expr : Expr.expr -> string +val unparse_assignment : Expr.assignment -> string +val unparse_annotated : bool -> Annotate.annotated_schedule -> string +val unparse_decl : c_decl -> string +val unparse_ast : c_ast -> string +val unparse_function : c_fcn -> string + +val flops_of : c_fcn -> string +val print_cost : c_fcn -> string + +val ast_to_expr_list : c_ast -> Expr.expr list +val extract_constants : c_ast -> c_decl list +val ctimes : (c_ast * c_ast) -> c_ast diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/complex.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/complex.ml new file mode 100644 index 000000000..4fa2ec106 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/complex.ml @@ -0,0 +1,147 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* abstraction layer for complex operations *) +open Littlesimp +open Expr + +(* type of complex expressions *) +type expr = CE of Expr.expr * Expr.expr + +let two = CE (makeNum Number.two, makeNum Number.zero) +let one = CE (makeNum Number.one, makeNum Number.zero) +let i = CE (makeNum Number.zero, makeNum Number.one) +let zero = CE (makeNum Number.zero, makeNum Number.zero) +let make (r, i) = CE (r, i) + +let uminus (CE (a, b)) = CE (makeUminus a, makeUminus b) + +let inverse_int n = CE (makeNum (Number.div Number.one (Number.of_int n)), + makeNum Number.zero) + +let inverse_int_sqrt n = + CE (makeNum (Number.div Number.one (Number.sqrt (Number.of_int n))), + makeNum Number.zero) +let int_sqrt n = + CE (makeNum (Number.sqrt (Number.of_int n)), + makeNum Number.zero) + +let nan x = CE (NaN x, makeNum Number.zero) + +let half = inverse_int 2 + +let times3x3 (CE (a, b)) (CE (c, d)) = + CE (makePlus [makeTimes (c, makePlus [a; makeUminus (b)]); + makeTimes (b, makePlus [c; makeUminus (d)])], + makePlus [makeTimes (a, makePlus [c; d]); + makeUminus(makeTimes (c, makePlus [a; makeUminus (b)]))]) + +let times (CE (a, b)) (CE (c, d)) = + if not !Magic.threemult then + CE (makePlus [makeTimes (a, c); makeUminus (makeTimes (b, d))], + makePlus [makeTimes (a, d); makeTimes (b, c)]) + else if is_constant c && is_constant d then + times3x3 (CE (a, b)) (CE (c, d)) + else (* hope a and b are constant expressions *) + times3x3 (CE (c, d)) (CE (a, b)) + +let ctimes (CE (a, _)) (CE (c, _)) = + CE (CTimes (a, c), makeNum Number.zero) + +let ctimesj (CE (a, _)) (CE (c, _)) = + CE (CTimesJ (a, c), makeNum Number.zero) + +(* complex exponential (of root of unity); returns exp(2*pi*i/n * m) *) +let exp n i = + let (c, s) = Number.cexp n i + in CE (makeNum c, makeNum s) + +(* various trig functions evaluated at (2*pi*i/n * m) *) +let sec n m = + let (c, s) = Number.cexp n m + in CE (makeNum (Number.div Number.one c), makeNum Number.zero) +let csc n m = + let (c, s) = Number.cexp n m + in CE (makeNum (Number.div Number.one s), makeNum Number.zero) +let tan n m = + let (c, s) = Number.cexp n m + in CE (makeNum (Number.div s c), makeNum Number.zero) +let cot n m = + let (c, s) = Number.cexp n m + in CE (makeNum (Number.div c s), makeNum Number.zero) + +(* complex sum *) +let plus a = + let rec unzip_complex = function + [] -> ([], []) + | ((CE (a, b)) :: s) -> + let (r,i) = unzip_complex s + in + (a::r), (b::i) in + let (c, d) = unzip_complex a in + CE (makePlus c, makePlus d) + +(* extract real/imaginary *) +let real (CE (a, b)) = CE (a, makeNum Number.zero) +let imag (CE (a, b)) = CE (b, makeNum Number.zero) +let iimag (CE (a, b)) = CE (makeNum Number.zero, b) +let conj (CE (a, b)) = CE (a, makeUminus b) + + +(* abstraction of sum_{i=0}^{n-1} *) +let sigma a b f = plus (List.map f (Util.interval a b)) + +(* store and assignment operations *) +let store_real v (CE (a, b)) = Expr.Store (v, a) +let store_imag v (CE (a, b)) = Expr.Store (v, b) +let store (vr, vi) x = (store_real vr x, store_imag vi x) + +let assign_real v (CE (a, b)) = Expr.Assign (v, a) +let assign_imag v (CE (a, b)) = Expr.Assign (v, b) +let assign (vr, vi) x = (assign_real vr x, assign_imag vi x) + + +(************************ + shortcuts + ************************) +let (@*) = times +let (@+) a b = plus [a; b] +let (@-) a b = plus [a; uminus b] + +(* type of complex signals *) +type signal = int -> expr + +(* make a finite signal infinite *) +let infinite n signal i = if ((0 <= i) && (i < n)) then signal i else zero + +let hermitian n a = + Util.array n (fun i -> + if (i = 0) then real (a 0) + else if (i < n - i) then (a i) + else if (i > n - i) then conj (a (n - i)) + else real (a i)) + +let antihermitian n a = + Util.array n (fun i -> + if (i = 0) then iimag (a 0) + else if (i < n - i) then (a i) + else if (i > n - i) then uminus (conj (a (n - i))) + else iimag (a i)) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/complex.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/complex.mli new file mode 100644 index 000000000..8fa5126f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/complex.mli @@ -0,0 +1,68 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type expr +val make : (Expr.expr * Expr.expr) -> expr +val two : expr +val one : expr +val i : expr +val zero : expr +val half : expr +val inverse_int : int -> expr +val inverse_int_sqrt : int -> expr +val int_sqrt : int -> expr +val times : expr -> expr -> expr +val ctimes : expr -> expr -> expr +val ctimesj : expr -> expr -> expr +val uminus : expr -> expr +val exp : int -> int -> expr +val sec : int -> int -> expr +val csc : int -> int -> expr +val tan : int -> int -> expr +val cot : int -> int -> expr +val plus : expr list -> expr +val real : expr -> expr +val imag : expr -> expr +val conj : expr -> expr +val nan : Expr.transcendent -> expr +val sigma : int -> int -> (int -> expr) -> expr + +val (@*) : expr -> expr -> expr +val (@+) : expr -> expr -> expr +val (@-) : expr -> expr -> expr + +(* a signal is a map from integers to expressions *) +type signal = int -> expr +val infinite : int -> signal -> signal + +val store_real : Variable.variable -> expr -> Expr.expr +val store_imag : Variable.variable -> expr -> Expr.expr +val store : + Variable.variable * Variable.variable -> expr -> Expr.expr * Expr.expr + +val assign_real : Variable.variable -> expr -> Expr.assignment +val assign_imag : Variable.variable -> expr -> Expr.assignment +val assign : + Variable.variable * Variable.variable -> + expr -> Expr.assignment * Expr.assignment + +val hermitian : int -> (int -> expr) -> int -> expr +val antihermitian : int -> (int -> expr) -> int -> expr diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/conv.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/conv.ml new file mode 100644 index 000000000..dd9b14221 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/conv.ml @@ -0,0 +1,130 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * +*) + +open Complex +open Util + +let polyphase m a ph i = a (m * i + ph) + +let rec divmod n i = + if (i < 0) then + let (a, b) = divmod n (i + n) + in (a - 1, b) + else (i / n, i mod n) + +let unpolyphase m a i = let (x, y) = divmod m i in a y x + +let lift2 f a b i = f (a i) (b i) + +(* convolution of signals A and B *) +let rec conv na a nb b = + let rec naive na a nb b i = + sigma 0 na (fun j -> (a j) @* (b (i - j))) + + and recur na a nb b = + if (na <= 1 || nb <= 1) then + naive na a nb b + else + let p = polyphase 2 in + let ee = conv (na - na / 2) (p a 0) (nb - nb / 2) (p b 0) + and eo = conv (na - na / 2) (p a 0) (nb / 2) (p b 1) + and oe = conv (na / 2) (p a 1) (nb - nb / 2) (p b 0) + and oo = conv (na / 2) (p a 1) (nb / 2) (p b 1) in + unpolyphase 2 (function + 0 -> fun i -> (ee i) @+ (oo (i - 1)) + | 1 -> fun i -> (eo i) @+ (oe i) + | _ -> failwith "recur") + + + (* Karatsuba variant 1: (a+bx)(c+dx) = (ac+bdxx)+((a+b)(c+d)-ac-bd)x *) + and karatsuba1 na a nb b = + let p = polyphase 2 in + let ae = p a 0 and nae = na - na / 2 + and ao = p a 1 and nao = na / 2 + and be = p b 0 and nbe = nb - nb / 2 + and bo = p b 1 and nbo = nb / 2 in + let ae = infinite nae ae and ao = infinite nao ao + and be = infinite nbe be and bo = infinite nbo bo in + let aeo = lift2 (@+) ae ao and naeo = nae + and beo = lift2 (@+) be bo and nbeo = nbe in + let ee = conv nae ae nbe be + and oo = conv nao ao nbo bo + and eoeo = conv naeo aeo nbeo beo in + + let q = function + 0 -> fun i -> (ee i) @+ (oo (i - 1)) + | 1 -> fun i -> (eoeo i) @- ((ee i) @+ (oo i)) + | _ -> failwith "karatsuba1" in + unpolyphase 2 q + + (* Karatsuba variant 2: + (a+bx)(c+dx) = ((a+b)c-b(c-dxx))+x((a+b)c-a(c-d)) *) + and karatsuba2 na a nb b = + let p = polyphase 2 in + let ae = p a 0 and nae = na - na / 2 + and ao = p a 1 and nao = na / 2 + and be = p b 0 and nbe = nb - nb / 2 + and bo = p b 1 and nbo = nb / 2 in + let ae = infinite nae ae and ao = infinite nao ao + and be = infinite nbe be and bo = infinite nbo bo in + + let c1 = conv nae (lift2 (@+) ae ao) nbe be + and c2 = conv nao ao (nbo + 1) (fun i -> be i @- bo (i - 1)) + and c3 = conv nae ae nbe (lift2 (@-) be bo) in + + let q = function + 0 -> lift2 (@-) c1 c2 + | 1 -> lift2 (@-) c1 c3 + | _ -> failwith "karatsuba2" in + unpolyphase 2 q + + and karatsuba na a nb b = + let m = na + nb - 1 in + if (m < !Magic.karatsuba_min) then + recur na a nb b + else + match !Magic.karatsuba_variant with + 1 -> karatsuba1 na a nb b + | 2 -> karatsuba2 na a nb b + | _ -> failwith "unknown karatsuba variant" + + and via_circular na a nb b = + let m = na + nb - 1 in + if (m < !Magic.circular_min) then + karatsuba na a nb b + else + let rec find_min n = if n >= m then n else find_min (2 * n) in + circular (find_min 1) a b + + in + let a = infinite na a and b = infinite nb b in + let res = array (na + nb - 1) (via_circular na a nb b) in + infinite (na + nb - 1) res + +and circular n a b = + let via_dft n a b = + let fa = Fft.dft (-1) n a + and fb = Fft.dft (-1) n b + and scale = inverse_int n in + let fab i = ((fa i) @* (fb i)) @* scale in + Fft.dft 1 n fab + + in via_dft n a b diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/conv.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/conv.mli new file mode 100644 index 000000000..d265029f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/conv.mli @@ -0,0 +1,22 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val conv : int -> Complex.signal -> int -> Complex.signal -> Complex.signal diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/dag.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/dag.ml new file mode 100644 index 000000000..21edeab3e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/dag.ml @@ -0,0 +1,109 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util + +(* Here, we have functions to transform a sequence of assignments + (variable = expression) into a DAG (a directed, acyclic graph). + The nodes of the DAG are the assignments, and the edges indicate + dependencies. (The DAG is analyzed in the scheduler to find an + efficient ordering of the assignments.) + + This file also contains utilities to manipulate the DAG in various + ways. *) + +(******************************************** + * Dag structure + ********************************************) +type color = RED | BLUE | BLACK | YELLOW + +type dagnode = + { assigned: Variable.variable; + mutable expression: Expr.expr; + input_variables: Variable.variable list; + mutable successors: dagnode list; + mutable predecessors: dagnode list; + mutable label: int; + mutable color: color} + +type dag = Dag of (dagnode list) + +(* true if node uses v *) +let node_uses v node = + List.exists (Variable.same v) node.input_variables + +(* true if assignment of v clobbers any input of node *) +let node_clobbers node v = + List.exists (Variable.same_location v) node.input_variables + +(* true if nodeb depends on nodea *) +let depends_on nodea nodeb = + node_uses nodea.assigned nodeb || + node_clobbers nodea nodeb.assigned + +(* transform an assignment list into a dag *) +let makedag alist = + let dag = List.map + (fun assignment -> + let (v, x) = assignment in + { assigned = v; + expression = x; + input_variables = Expr.find_vars x; + successors = []; + predecessors = []; + label = 0; + color = BLACK }) + alist + in begin + for_list dag (fun i -> + for_list dag (fun j -> + if depends_on i j then begin + i.successors <- j :: i.successors; + j.predecessors <- i :: j.predecessors; + end)); + Dag dag; + end + +let map f (Dag dag) = Dag (List.map f dag) +let for_all (Dag dag) f = + (* type system loophole *) + let make_unit _ = () in + make_unit (List.map f dag) +let to_list (Dag dag) = dag + +let find_node f (Dag dag) = Util.find_elem f dag + +(* breadth-first search *) +let rec bfs (Dag dag) node init_label = + let _ = node.label <- init_label in + let rec loop = function + [] -> () + | node :: rest -> + let neighbors = node.predecessors @ node.successors in + let m = min_list (List.map (fun node -> node.label) neighbors) in + if (node.label > m + 1) then begin + node.label <- m + 1; + loop (rest @ neighbors); + end else + loop rest + in let neighbors = node.predecessors @ node.successors in + loop neighbors + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/dag.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/dag.mli new file mode 100644 index 000000000..df914ad3b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/dag.mli @@ -0,0 +1,43 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util + +type color = | RED | BLUE | BLACK | YELLOW + +type dagnode = + { assigned: Variable.variable; + mutable expression: Expr.expr; + input_variables: Variable.variable list; + mutable successors: dagnode list; + mutable predecessors: dagnode list; + mutable label: int; + mutable color: color} + +type dag + +val makedag : (Variable.variable * Expr.expr) list -> dag + +val map : (dagnode -> dagnode) -> dag -> dag +val for_all : dag -> (dagnode -> unit) -> unit +val to_list : dag -> (dagnode list) +val bfs : dag -> dagnode -> int -> unit +val find_node : (dagnode -> bool) -> dag -> dagnode option diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/expr.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/expr.ml new file mode 100644 index 000000000..4f7eb0ded --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/expr.ml @@ -0,0 +1,152 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* Here, we define the data type encapsulating a symbolic arithmetic + expression, and provide some routines for manipulating it. *) + +(* I will regret this hack : *) +(* NEWS: I did *) +type transcendent = I | MULTI_A | MULTI_B | CONJ + +type expr = + | Num of Number.number + | NaN of transcendent + | Plus of expr list + | Times of expr * expr + | CTimes of expr * expr + | CTimesJ of expr * expr (* CTimesJ (a, b) = conj(a) * b *) + | Uminus of expr + | Load of Variable.variable + | Store of Variable.variable * expr + +type assignment = Assign of Variable.variable * expr + +(* various hash functions *) +let hash_float x = + let (mantissa, exponent) = frexp x + in truncate (float_of_int(exponent) *. 1234.567 +. mantissa *. 10000.0) + +let sum_list l = List.fold_right (+) l 0 + +let transcendent_to_float = function + | I -> 2.718281828459045235360287471 (* any transcendent number will do *) + | MULTI_A -> 0.6931471805599453094172321214 + | MULTI_B -> -0.3665129205816643270124391582 + | CONJ -> 0.6019072301972345747375400015 + +let rec hash = function + | Num x -> hash_float (Number.to_float x) + | NaN x -> hash_float (transcendent_to_float x) + | Load v -> 1 + 1237 * Variable.hash v + | Store (v, x) -> 2 * Variable.hash v - 2345 * hash x + | Plus l -> 5 + 23451 * sum_list (List.map Hashtbl.hash l) + | Times (a, b) -> 41 + 31415 * (Hashtbl.hash a + Hashtbl.hash b) + | CTimes (a, b) -> 49 + 3245 * (Hashtbl.hash a + Hashtbl.hash b) + | CTimesJ (a, b) -> 31 + 3471 * (Hashtbl.hash a + Hashtbl.hash b) + | Uminus x -> 42 + 12345 * (hash x) + +(* find all variables *) +let rec find_vars x = + match x with + | Load y -> [y] + | Plus l -> List.flatten (List.map find_vars l) + | Times (a, b) -> (find_vars a) @ (find_vars b) + | CTimes (a, b) -> (find_vars a) @ (find_vars b) + | CTimesJ (a, b) -> (find_vars a) @ (find_vars b) + | Uminus a -> find_vars a + | _ -> [] + + +(* TRUE if expression is a constant *) +let is_constant = function + | Num _ -> true + | NaN _ -> true + | Load v -> Variable.is_constant v + | _ -> false + +let is_known_constant = function + | Num _ -> true + | NaN _ -> true + | _ -> false + +(* expr to string, used for debugging *) +let rec foldr_string_concat l = + match l with + [] -> "" + | [a] -> a + | a :: b -> a ^ " " ^ (foldr_string_concat b) + +let string_of_transcendent = function + | I -> "I" + | MULTI_A -> "MULTI_A" + | MULTI_B -> "MULTI_B" + | CONJ -> "CONJ" + +let rec to_string = function + | Load v -> Variable.unparse v + | Num n -> string_of_float (Number.to_float n) + | NaN n -> string_of_transcendent n + | Plus x -> "(+ " ^ (foldr_string_concat (List.map to_string x)) ^ ")" + | Times (a, b) -> "(* " ^ (to_string a) ^ " " ^ (to_string b) ^ ")" + | CTimes (a, b) -> "(c* " ^ (to_string a) ^ " " ^ (to_string b) ^ ")" + | CTimesJ (a, b) -> "(cj* " ^ (to_string a) ^ " " ^ (to_string b) ^ ")" + | Uminus a -> "(- " ^ (to_string a) ^ ")" + | Store (v, a) -> "(:= " ^ (Variable.unparse v) ^ " " ^ + (to_string a) ^ ")" + +let rec to_string_a d x = + if (d = 0) then "..." else match x with + | Load v -> Variable.unparse v + | Num n -> Number.to_konst n + | NaN n -> string_of_transcendent n + | Plus x -> "(+ " ^ (foldr_string_concat (List.map (to_string_a (d - 1)) x)) ^ ")" + | Times (a, b) -> "(* " ^ (to_string_a (d - 1) a) ^ " " ^ (to_string_a (d - 1) b) ^ ")" + | CTimes (a, b) -> "(c* " ^ (to_string_a (d - 1) a) ^ " " ^ (to_string_a (d - 1) b) ^ ")" + | CTimesJ (a, b) -> "(cj* " ^ (to_string_a (d - 1) a) ^ " " ^ (to_string_a (d - 1) b) ^ ")" + | Uminus a -> "(- " ^ (to_string_a (d-1) a) ^ ")" + | Store (v, a) -> "(:= " ^ (Variable.unparse v) ^ " " ^ + (to_string_a (d-1) a) ^ ")" + +let to_string = to_string_a 10 + +let assignment_to_string = function + | Assign (v, a) -> "(:= " ^ (Variable.unparse v) ^ " " ^ (to_string a) ^ ")" + +let dump print = List.iter (fun x -> print ((assignment_to_string x) ^ "\n")) + +(* find all constants in a given expression *) +let rec expr_to_constants = function + | Num n -> [n] + | Plus a -> List.flatten (List.map expr_to_constants a) + | Times (a, b) -> (expr_to_constants a) @ (expr_to_constants b) + | CTimes (a, b) -> (expr_to_constants a) @ (expr_to_constants b) + | CTimesJ (a, b) -> (expr_to_constants a) @ (expr_to_constants b) + | Uminus a -> expr_to_constants a + | _ -> [] + + +let add_float_key_value list_so_far k = + if List.exists (fun k2 -> Number.equal k k2) list_so_far then + list_so_far + else + k :: list_so_far + +let unique_constants = List.fold_left add_float_key_value [] diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/expr.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/expr.mli new file mode 100644 index 000000000..dc8893367 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/expr.mli @@ -0,0 +1,51 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type transcendent = I | MULTI_A | MULTI_B | CONJ + +type expr = + | Num of Number.number + | NaN of transcendent + | Plus of expr list + | Times of expr * expr + | CTimes of expr * expr + | CTimesJ of expr * expr + | Uminus of expr + | Load of Variable.variable + | Store of Variable.variable * expr + +type assignment = Assign of Variable.variable * expr + +val hash_float : float -> int +val hash : expr -> int +val to_string : expr -> string +val assignment_to_string : assignment -> string +val transcendent_to_float : transcendent -> float +val string_of_transcendent : transcendent -> string + +val find_vars : expr -> Variable.variable list +val is_constant : expr -> bool +val is_known_constant : expr -> bool + +val dump : (string -> unit) -> assignment list -> unit + +val expr_to_constants : expr -> Number.number list +val unique_constants : Number.number list -> Number.number list diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/fft.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/fft.ml new file mode 100644 index 000000000..d3ea3f8ce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/fft.ml @@ -0,0 +1,307 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + + +(* This is the part of the generator that actually computes the FFT + in symbolic form *) + +open Complex +open Util + +(* choose a suitable factor of n *) +let choose_factor n = + (* first choice: i such that gcd(i, n / i) = 1, i as big as possible *) + let choose1 n = + let rec loop i f = + if (i * i > n) then f + else if ((n mod i) == 0 && gcd i (n / i) == 1) then loop (i + 1) i + else loop (i + 1) f + in loop 1 1 + + (* second choice: the biggest factor i of n, where i < sqrt(n), if any *) + and choose2 n = + let rec loop i f = + if (i * i > n) then f + else if ((n mod i) == 0) then loop (i + 1) i + else loop (i + 1) f + in loop 1 1 + + in let i = choose1 n in + if (i > 1) then i + else choose2 n + +let is_power_of_two n = (n > 0) && ((n - 1) land n == 0) + +let rec dft_prime sign n input = + let sum filter i = + sigma 0 n (fun j -> + let coeff = filter (exp n (sign * i * j)) + in coeff @* (input j)) in + let computation_even = array n (sum identity) + and computation_odd = + let sumr = array n (sum real) + and sumi = array n (sum ((times Complex.i) @@ imag)) in + array n (fun i -> + if (i = 0) then + (* expose some common subexpressions *) + input 0 @+ + sigma 1 ((n + 1) / 2) (fun j -> input j @+ input (n - j)) + else + let i' = min i (n - i) in + if (i < n - i) then + sumr i' @+ sumi i' + else + sumr i' @- sumi i') in + if (n >= !Magic.rader_min) then + dft_rader sign n input + else if (n == 2) then + computation_even + else + computation_odd + + +and dft_rader sign p input = + let half = + let one_half = inverse_int 2 in + times one_half + + and make_product n a b = + let scale_factor = inverse_int n in + array n (fun i -> a i @* (scale_factor @* b i)) in + + (* generates a convolution using ffts. (all arguments are the + same as to gen_convolution, below) *) + let gen_convolution_by_fft n a b addtoall = + let fft_a = dft 1 n a + and fft_b = dft 1 n b in + + let fft_ab = make_product n fft_a fft_b + and dc_term i = if (i == 0) then addtoall else zero in + + let fft_ab1 = array n (fun i -> fft_ab i @+ dc_term i) + and sum = fft_a 0 in + let conv = dft (-1) n fft_ab1 in + (sum, conv) + + (* alternate routine for convolution. Seems to work better for + small sizes. I have no idea why. *) + and gen_convolution_by_fft_alt n a b addtoall = + let ap = array n (fun i -> half (a i @+ a ((n - i) mod n))) + and am = array n (fun i -> half (a i @- a ((n - i) mod n))) + and bp = array n (fun i -> half (b i @+ b ((n - i) mod n))) + and bm = array n (fun i -> half (b i @- b ((n - i) mod n))) + in + + let fft_ap = dft 1 n ap + and fft_am = dft 1 n am + and fft_bp = dft 1 n bp + and fft_bm = dft 1 n bm in + + let fft_abpp = make_product n fft_ap fft_bp + and fft_abpm = make_product n fft_ap fft_bm + and fft_abmp = make_product n fft_am fft_bp + and fft_abmm = make_product n fft_am fft_bm + and sum = fft_ap 0 @+ fft_am 0 + and dc_term i = if (i == 0) then addtoall else zero in + + let fft_ab1 = array n (fun i -> (fft_abpp i @+ fft_abmm i) @+ dc_term i) + and fft_ab2 = array n (fun i -> fft_abpm i @+ fft_abmp i) in + let conv1 = dft (-1) n fft_ab1 + and conv2 = dft (-1) n fft_ab2 in + let conv = array n (fun i -> + conv1 i @+ conv2 i) in + (sum, conv) + + (* generator of assignment list assigning conv to the convolution of + a and b, all of which are of length n. addtoall is added to + all of the elements of the result. Returns (sum, convolution) pair + where sum is the sum of the elements of a. *) + + in let gen_convolution = + if (p <= !Magic.alternate_convolution) then + gen_convolution_by_fft_alt + else + gen_convolution_by_fft + + (* fft generator for prime n = p using Rader's algorithm for + turning the fft into a convolution, which then can be + performed in a variety of ways *) + in + let g = find_generator p in + let ginv = pow_mod g (p - 2) p in + let input_perm = array p (fun i -> input (pow_mod g i p)) + and omega_perm = array p (fun i -> exp p (sign * (pow_mod ginv i p))) + and output_perm = array p (fun i -> pow_mod ginv i p) + in let (sum, conv) = + (gen_convolution (p - 1) input_perm omega_perm (input 0)) + in array p (fun i -> + if (i = 0) then + input 0 @+ sum + else + let i' = suchthat 0 (fun i' -> i = output_perm i') + in conv i') + +(* our modified version of the conjugate-pair split-radix algorithm, + which reduces the number of multiplications by rescaling the + sub-transforms (power-of-two n's only) *) +and newsplit sign n input = + let rec s n k = (* recursive scale factor *) + if n <= 4 then + one + else + let k4 = (abs k) mod (n / 4) in + let k4' = if k4 <= (n / 8) then k4 else (n/4 - k4) in + (s (n / 4) k4') @* (real (exp n k4')) + + and sinv n k = (* 1 / s(n,k) *) + if n <= 4 then + one + else + let k4 = (abs k) mod (n / 4) in + let k4' = if k4 <= (n / 8) then k4 else (n/4 - k4) in + (sinv (n / 4) k4') @* (sec n k4') + + in let sdiv2 n k = (s n k) @* (sinv (2*n) k) (* s(n,k) / s(2*n,k) *) + and sdiv4 n k = (* s(n,k) / s(4*n,k) *) + let k4 = (abs k) mod n in + sec (4*n) (if k4 <= (n / 2) then k4 else (n - k4)) + + in let t n k = (exp n k) @* (sdiv4 (n/4) k) + + and dft1 input = input + and dft2 input = array 2 (fun k -> (input 0) @+ ((input 1) @* exp 2 k)) + + in let rec newsplit0 sign n input = + if (n == 1) then dft1 input + else if (n == 2) then dft2 input + else let u = newsplit0 sign (n / 2) (fun i -> input (i*2)) + and z = newsplitS sign (n / 4) (fun i -> input (i*4 + 1)) + and z' = newsplitS sign (n / 4) (fun i -> input ((n + i*4 - 1) mod n)) + and twid = array n (fun k -> s (n/4) k @* exp n (sign * k)) in + let w = array n (fun k -> twid k @* z (k mod (n / 4))) + and w' = array n (fun k -> conj (twid k) @* z' (k mod (n / 4))) in + let ww = array n (fun k -> w k @+ w' k) in + array n (fun k -> u (k mod (n / 2)) @+ ww k) + + and newsplitS sign n input = + if (n == 1) then dft1 input + else if (n == 2) then dft2 input + else let u = newsplitS2 sign (n / 2) (fun i -> input (i*2)) + and z = newsplitS sign (n / 4) (fun i -> input (i*4 + 1)) + and z' = newsplitS sign (n / 4) (fun i -> input ((n + i*4 - 1) mod n)) in + let w = array n (fun k -> t n (sign * k) @* z (k mod (n / 4))) + and w' = array n (fun k -> conj (t n (sign * k)) @* z' (k mod (n / 4))) in + let ww = array n (fun k -> w k @+ w' k) in + array n (fun k -> u (k mod (n / 2)) @+ ww k) + + and newsplitS2 sign n input = + if (n == 1) then dft1 input + else if (n == 2) then dft2 input + else let u = newsplitS4 sign (n / 2) (fun i -> input (i*2)) + and z = newsplitS sign (n / 4) (fun i -> input (i*4 + 1)) + and z' = newsplitS sign (n / 4) (fun i -> input ((n + i*4 - 1) mod n)) in + let w = array n (fun k -> t n (sign * k) @* z (k mod (n / 4))) + and w' = array n (fun k -> conj (t n (sign * k)) @* z' (k mod (n / 4))) in + let ww = array n (fun k -> (w k @+ w' k) @* (sdiv2 n k)) in + array n (fun k -> u (k mod (n / 2)) @+ ww k) + + and newsplitS4 sign n input = + if (n == 1) then dft1 input + else if (n == 2) then + let f = dft2 input + in array 2 (fun k -> (f k) @* (sinv 8 k)) + else let u = newsplitS2 sign (n / 2) (fun i -> input (i*2)) + and z = newsplitS sign (n / 4) (fun i -> input (i*4 + 1)) + and z' = newsplitS sign (n / 4) (fun i -> input ((n + i*4 - 1) mod n)) in + let w = array n (fun k -> t n (sign * k) @* z (k mod (n / 4))) + and w' = array n (fun k -> conj (t n (sign * k)) @* z' (k mod (n / 4))) in + let ww = array n (fun k -> w k @+ w' k) in + array n (fun k -> (u (k mod (n / 2)) @+ ww k) @* (sdiv4 n k)) + + in newsplit0 sign n input + +and dft sign n input = + let rec cooley_tukey sign n1 n2 input = + let tmp1 = + array n2 (fun i2 -> + dft sign n1 (fun i1 -> input (i1 * n2 + i2))) in + let tmp2 = + array n1 (fun i1 -> + array n2 (fun i2 -> + exp n (sign * i1 * i2) @* tmp1 i2 i1)) in + let tmp3 = array n1 (fun i1 -> dft sign n2 (tmp2 i1)) in + (fun i -> tmp3 (i mod n1) (i / n1)) + + (* + * This is "exponent -1" split-radix by Dan Bernstein. + *) + and split_radix_dit sign n input = + let f0 = dft sign (n / 2) (fun i -> input (i * 2)) + and f10 = dft sign (n / 4) (fun i -> input (i * 4 + 1)) + and f11 = dft sign (n / 4) (fun i -> input ((n + i * 4 - 1) mod n)) in + let g10 = array n (fun k -> + exp n (sign * k) @* f10 (k mod (n / 4))) + and g11 = array n (fun k -> + exp n (- sign * k) @* f11 (k mod (n / 4))) in + let g1 = array n (fun k -> g10 k @+ g11 k) in + array n (fun k -> f0 (k mod (n / 2)) @+ g1 k) + + and split_radix_dif sign n input = + let n2 = n / 2 and n4 = n / 4 in + let x0 = array n2 (fun i -> input i @+ input (i + n2)) + and x10 = array n4 (fun i -> input i @- input (i + n2)) + and x11 = array n4 (fun i -> + input (i + n4) @- input (i + n2 + n4)) in + let x1 k i = + exp n (k * i * sign) @* (x10 i @+ exp 4 (k * sign) @* x11 i) in + let f0 = dft sign n2 x0 + and f1 = array 4 (fun k -> dft sign n4 (x1 k)) in + array n (fun k -> + if k mod 2 = 0 then f0 (k / 2) + else let k' = k mod 4 in f1 k' ((k - k') / 4)) + + and prime_factor sign n1 n2 input = + let tmp1 = array n2 (fun i2 -> + dft sign n1 (fun i1 -> input ((i1 * n2 + i2 * n1) mod n))) + in let tmp2 = array n1 (fun i1 -> + dft sign n2 (fun k2 -> tmp1 k2 i1)) + in fun i -> tmp2 (i mod n1) (i mod n2) + + in let algorithm sign n = + let r = choose_factor n in + if List.mem n !Magic.rader_list then + (* special cases *) + dft_rader sign n + else if (r == 1) then (* n is prime *) + dft_prime sign n + else if (gcd r (n / r)) == 1 then + prime_factor sign r (n / r) + else if (n mod 4 = 0 && n > 4) then + if !Magic.newsplit && is_power_of_two n then + newsplit sign n + else if !Magic.dif_split_radix then + split_radix_dif sign n + else + split_radix_dit sign n + else + cooley_tukey sign r (n / r) + in + array n (algorithm sign n input) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/fft.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/fft.mli new file mode 100644 index 000000000..36dda515f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/fft.mli @@ -0,0 +1,22 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val dft : int -> int -> Complex.signal -> Complex.signal diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2c.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2c.ml new file mode 100644 index 000000000..a9c1e065f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2c.ml @@ -0,0 +1,186 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +type ditdif = DIT | DIF +let ditdif = ref DIT +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let urs = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given R-stride"; +] + +let byi = Complex.times Complex.i +let byui = Complex.times (Complex.uminus Complex.i) + +let sym n f i = if (i < n - i) then f i else Complex.conj (f i) + +let shuffle_eo fe fo i = if i mod 2 == 0 then fe (i/2) else fo ((i-1)/2) + +let generate n = + let rs = "rs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" + + (* the array names are from the point of view of the complex array + (output in R2C, input in C2R) *) + and arp = "Rp" (* real, positive *) + and aip = "Ip" (* imag, positive *) + and arm = "Rm" (* real, negative *) + and aim = "Im" (* imag, negative *) + + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 1 false in + let nt = num_twiddles n in + + let byw = bytwiddle n sign (twiddle_array nt twarray) in + + let vrs = either_stride (!urs) (C.SVar rs) in + + (* assume a single location. No point in doing alias analysis *) + let the_location = (Unique.make (), Unique.make ()) in + let locations _ = the_location in + + let locr = (locative_array_c n + (C.array_subscript arp vrs) + (C.array_subscript arm vrs) + locations "BUG") + and loci = (locative_array_c n + (C.array_subscript aip vrs) + (C.array_subscript aim vrs) + locations "BUG") + and locp = (locative_array_c n + (C.array_subscript arp vrs) + (C.array_subscript aip vrs) + locations "BUG") + and locm = (locative_array_c n + (C.array_subscript arm vrs) + (C.array_subscript aim vrs) + locations "BUG") + in + let locri i = if i mod 2 == 0 then locr (i/2) else loci ((i-1)/2) + and locpm i = if i < n - i then locp i else locm (n-1-i) + in + + let asch = + match !ditdif with + | DIT -> + let output = Fft.dft sign n (byw (load_array_c n locri)) in + let odag = store_array_c n locpm (sym n output) in + standard_optimizer odag + + | DIF -> + let output = byw (Fft.dft sign n (sym n (load_array_c n locpm))) in + let odag = store_array_c n locri output in + standard_optimizer odag + in + + let vms = CVar "ms" + and varp = CVar arp + and vaip = CVar aip + and varm = CVar arm + and vaim = CVar aim + and vm = CVar m and vmb = CVar mb and vme = CVar me + in + let body = Block ( + [Decl ("INT", m)], + [For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (CPlus [vmb; CUminus (Integer 1)], + Integer nt)])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (varp, CPlus [varp; byvl vms]); + Expr_assign (vaip, CPlus [vaip; byvl vms]); + Expr_assign (varm, CPlus [varm; CUminus (byvl vms)]); + Expr_assign (vaim, CPlus [vaim; CUminus (byvl vms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + byvl (Integer nt)]); + make_volatile_stride (4*n) (CVar rs) + ], + Asch asch)]) + in + + let tree = + Fcn ("static void", name, + [Decl (C.realtypep, arp); + Decl (C.realtypep, aip); + Decl (C.realtypep, arm); + Decl (C.realtypep, aim); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "VL" (twdesc n)) + and desc = + Printf.sprintf + "static const hc2c_desc desc = {%d, \"%s\", twinstr, &GENUS, %s};\n\n" + n name (flops_of tree) + and register = "X(khc2c_register)" + + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc, HC2C_VIA_RDFT);\n}" register name) + in + + (unparse tree) ^ "\n" ^ init + + +let main () = + begin + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2cdft.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2cdft.ml new file mode 100644 index 000000000..6431b4b37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2cdft.ml @@ -0,0 +1,208 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +type ditdif = DIT | DIF +let ditdif = ref DIT +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let urs = ref Stride_variable +let ums = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given R-stride"; + + "-with-ms", + Arg.String(fun x -> ums := arg_to_stride x), + " specialize for given ms" +] + +let byi = Complex.times Complex.i +let byui = Complex.times (Complex.uminus Complex.i) + +let shuffle_eo fe fo i = if i mod 2 == 0 then fe (i/2) else fo ((i-1)/2) + +let generate n = + let rs = "rs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" + + (* the array names are from the point of view of the complex array + (output in R2C, input in C2R) *) + and arp = "Rp" (* real, positive *) + and aip = "Ip" (* imag, positive *) + and arm = "Rm" (* real, negative *) + and aim = "Im" (* imag, negative *) + + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 1 false in + let nt = num_twiddles n in + + let byw = bytwiddle n sign (twiddle_array nt twarray) in + + let vrs = either_stride (!urs) (C.SVar rs) in + + (* assume a single location. No point in doing alias analysis *) + let the_location = (Unique.make (), Unique.make ()) in + let locations _ = the_location in + + let rlocp = (locative_array_c n + (C.array_subscript arp vrs) + (C.array_subscript aip vrs) + locations "BUG") + and rlocm = (locative_array_c n + (C.array_subscript arm vrs) + (C.array_subscript aim vrs) + locations "BUG") + and clocp = (locative_array_c n + (C.array_subscript arp vrs) + (C.array_subscript aip vrs) + locations "BUG") + and clocm = (locative_array_c n + (C.array_subscript arm vrs) + (C.array_subscript aim vrs) + locations "BUG") + in + let rloc i = if i mod 2 == 0 then rlocp (i/2) else rlocm ((i-1)/2) + and cloc i = if i < n - i then clocp i else clocm (n-1-i) + and sym n f i = if (i < n - i) then f i else Complex.conj (f i) + and sym1 f i = + if i mod 2 == 0 then + Complex.plus [f i; Complex.conj (f (i+1))] + else + Complex.times (Complex.uminus Complex.i) + (Complex.plus [f (i-1); Complex.uminus (Complex.conj (f i))]) + and sym1i f i = + if i mod 2 == 0 then + Complex.plus [f i; Complex.times Complex.i (f (i+1))] + else + Complex.conj + (Complex.plus [f (i-1); + Complex.times (Complex.uminus Complex.i) (f i)]) + in + + let asch = + match !ditdif with + | DIT -> + let output = + (Complex.times Complex.half) @@ + (Fft.dft sign n (byw (sym1 (load_array_c n rloc)))) in + let odag = store_array_c n cloc (sym n output) in + standard_optimizer odag + + | DIF -> + let output = + byw (Fft.dft sign n (sym n (load_array_c n cloc))) + in + let odag = store_array_c n rloc (sym1i output) in + standard_optimizer odag + in + + let vms = CVar "ms" + and varp = CVar arp + and vaip = CVar aip + and varm = CVar arm + and vaim = CVar aim + and vm = CVar m and vmb = CVar mb and vme = CVar me + in + let body = Block ( + [Decl ("INT", m)], + [For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (CPlus [vmb; CUminus (Integer 1)], + Integer nt)])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (varp, CPlus [varp; byvl vms]); + Expr_assign (vaip, CPlus [vaip; byvl vms]); + Expr_assign (varm, CPlus [varm; CUminus (byvl vms)]); + Expr_assign (vaim, CPlus [vaim; CUminus (byvl vms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + byvl (Integer nt)]); + make_volatile_stride (4*n) (CVar rs) + ], + Asch asch)] + ) + in + + let tree = + Fcn ("static void", name, + [Decl (C.realtypep, arp); + Decl (C.realtypep, aip); + Decl (C.realtypep, arm); + Decl (C.realtypep, aim); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "VL" (twdesc n)) + and desc = + Printf.sprintf + "static const hc2c_desc desc = {%d, \"%s\", twinstr, &GENUS, %s};\n\n" + n name (flops_of tree) + and register = "X(khc2c_register)" + + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc, HC2C_VIA_DFT);\n}" register name) + in + + (unparse tree) ^ "\n" ^ init + + +let main () = + begin + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2cdft_c.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2cdft_c.ml new file mode 100644 index 000000000..e10c1659a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2cdft_c.ml @@ -0,0 +1,221 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +type ditdif = DIT | DIF +let ditdif = ref DIT +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let urs = ref Stride_variable +let ums = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given R-stride"; + + "-with-ms", + Arg.String(fun x -> ums := arg_to_stride x), + " specialize for given ms" +] + +let byi = Complex.times Complex.i +let byui = Complex.times (Complex.uminus Complex.i) + +let shuffle_eo fe fo i = if i mod 2 == 0 then fe (i/2) else fo ((i-1)/2) + +let generate n = + let rs = "rs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" + + (* the array names are from the point of view of the complex array + (output in R2C, input in C2R) *) + and arp = "Rp" (* real, positive *) + and aip = "Ip" (* imag, positive *) + and arm = "Rm" (* real, negative *) + and aim = "Im" (* imag, negative *) + + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) + and bytwvl x = choose_simd x (ctimes (CVar "TWVL", x)) + and bytwvl_vl x = choose_simd x (ctimes (CVar "(TWVL/VL)", x)) in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 1 true in + let nt = num_twiddles n in + + let byw = bytwiddle n sign (twiddle_array nt twarray) in + + let vrs = either_stride (!urs) (C.SVar rs) in + let sms = stride_to_string "ms" !ums in + let msms = "-" ^ sms in + + (* assume a single location. No point in doing alias analysis *) + let the_location = (Unique.make (), Unique.make ()) in + let locations _ = the_location in + + let rlocp = (locative_array_c n + (C.array_subscript arp vrs) + (C.array_subscript aip vrs) + locations sms) + and rlocm = (locative_array_c n + (C.array_subscript arm vrs) + (C.array_subscript aim vrs) + locations msms) + and clocp = (locative_array_c n + (C.array_subscript arp vrs) + (C.array_subscript aip vrs) + locations sms) + and clocm = (locative_array_c n + (C.array_subscript arm vrs) + (C.array_subscript aim vrs) + locations msms) + in + let rloc i = if i mod 2 == 0 then rlocp (i/2) else rlocm ((i-1)/2) + and cloc i = if i < n - i then clocp i else clocm (n-1-i) + and sym n f i = + if (i < n - i) then + f i + else + Complex.times (Complex.nan Expr.CONJ) (f i) + and sym1 f i = + if i mod 2 == 0 then + Complex.plus [f i; + Complex.times (Complex.nan Expr.CONJ) (f (i+1))] + else + Complex.times (Complex.nan Expr.I) + (Complex.plus [Complex.uminus (f (i-1)); + Complex.times (Complex.nan Expr.CONJ) (f i)]) + and sym1i f i = + if i mod 2 == 0 then + Complex.plus [f i; + Complex.times (Complex.nan Expr.I) (f (i+1))] + else + Complex.times (Complex.nan Expr.CONJ) + (Complex.plus [f (i-1); + Complex.uminus + (Complex.times (Complex.nan Expr.I) (f i))]) + in + + let asch = + match !ditdif with + | DIT -> + let output = + (Complex.times Complex.half) @@ + (Trig.dft_via_rdft sign n (byw (sym1 (load_array_r n rloc)))) in + let odag = store_array_r n cloc (sym n output) in + standard_optimizer odag + + | DIF -> + let output = + byw (Trig.dft_via_rdft sign n (sym n (load_array_r n cloc))) + in + let odag = store_array_r n rloc (sym1i output) in + standard_optimizer odag + in + + let vms = CVar sms + and varp = CVar arp + and vaip = CVar aip + and varm = CVar arm + and vaim = CVar aim + and vm = CVar m and vmb = CVar mb and vme = CVar me + in + let body = Block ( + [Decl ("INT", m)], + [For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (CPlus [vmb; CUminus (Integer 1)], + bytwvl_vl (Integer nt))])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (varp, CPlus [varp; byvl vms]); + Expr_assign (vaip, CPlus [vaip; byvl vms]); + Expr_assign (varm, CPlus [varm; CUminus (byvl vms)]); + Expr_assign (vaim, CPlus [vaim; CUminus (byvl vms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + bytwvl (Integer nt)]); + make_volatile_stride (4*n) (CVar rs) + ], + Asch asch)] + ) + in + + let tree = + Fcn ("static void", name, + [Decl (C.realtypep, arp); + Decl (C.realtypep, aip); + Decl (C.realtypep, arm); + Decl (C.realtypep, aim); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "VL" (twdesc n)) + and desc = + Printf.sprintf + "static const hc2c_desc desc = {%d, %s, twinstr, &GENUS, %s};\n\n" + n (stringify name) (flops_of tree) + and register = "X(khc2c_register)" + + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc, HC2C_VIA_DFT);\n}" register name) + in + + (unparse tree) ^ "\n" ^ init + + +let main () = + begin + Simdmagic.simd_mode := true; + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2hc.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2hc.ml new file mode 100644 index 000000000..b208496e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_hc2hc.ml @@ -0,0 +1,170 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +type ditdif = DIT | DIF +let ditdif = ref DIT +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let urs = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given R-stride"; +] + +let rioarray = "cr" +and iioarray = "ci" + +let genone sign n transform load store vrs = + let locations = unique_array_c n in + let input = + locative_array_c n + (C.array_subscript rioarray vrs) + (C.array_subscript iioarray vrs) + locations "BUG" in + let output = transform sign n (load n input) in + let ioloc = + locative_array_c n + (C.array_subscript rioarray vrs) + (C.array_subscript iioarray vrs) + locations "BUG" in + let odag = store n ioloc output in + let annot = standard_optimizer odag + in annot + +let byi = Complex.times Complex.i +let byui = Complex.times (Complex.uminus Complex.i) + +let sym1 n f i = + Complex.plus [Complex.real (f i); byi (Complex.imag (f (n - 1 - i)))] + +let sym2 n f i = if (i < n - i) then f i else byi (f i) +let sym2i n f i = if (i < n - i) then f i else byui (f i) + +let generate n = + let rs = "rs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 1 false in + let nt = num_twiddles n in + + let byw = bytwiddle n sign (twiddle_array nt twarray) in + + let vrs = either_stride (!urs) (C.SVar rs) in + + let asch = + match !ditdif with + | DIT -> + genone sign n + (fun sign n input -> + ((sym1 n) @@ (sym2 n)) (Fft.dft sign n (byw input))) + load_array_c store_array_c vrs + | DIF -> + genone sign n + (fun sign n input -> + byw (Fft.dft sign n (((sym2i n) @@ (sym1 n)) input))) + load_array_c store_array_c vrs + in + + let vms = CVar "ms" + and vrioarray = CVar rioarray + and viioarray = CVar iioarray + and vm = CVar m and vmb = CVar mb and vme = CVar me + in + let body = Block ( + [Decl ("INT", m)], + [For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (CPlus [vmb; CUminus (Integer 1)], + Integer nt)])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (vrioarray, CPlus [vrioarray; byvl vms]); + Expr_assign (viioarray, + CPlus [viioarray; CUminus (byvl vms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + byvl (Integer nt)]); + make_volatile_stride (2*n) (CVar rs) + ], + Asch asch)]) + in + + let tree = + Fcn ("static void", name, + [Decl (C.realtypep, rioarray); + Decl (C.realtypep, iioarray); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "VL" (twdesc n)) + and desc = + Printf.sprintf + "static const hc2hc_desc desc = {%d, \"%s\", twinstr, &GENUS, %s};\n\n" + n name (flops_of tree) + and register = "X(khc2hc_register)" + + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register name) + in + + (unparse tree) ^ "\n" ^ init + + +let main () = + begin + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_mdct.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_mdct.ml new file mode 100644 index 000000000..a3ccfc7f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_mdct.ml @@ -0,0 +1,257 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* generation of trigonometric transforms *) + +open Util +open Genutil +open C + + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n " + +let uistride = ref Stride_variable +let uostride = ref Stride_variable +let uivstride = ref Stride_variable +let uovstride = ref Stride_variable +let normalization = ref 1 + +type mode = + | MDCT + | MDCT_MP3 + | MDCT_VORBIS + | MDCT_WINDOW + | MDCT_WINDOW_SYM + | IMDCT + | IMDCT_MP3 + | IMDCT_VORBIS + | IMDCT_WINDOW + | IMDCT_WINDOW_SYM + | NONE + +let mode = ref NONE + +let speclist = [ + "-with-istride", + Arg.String(fun x -> uistride := arg_to_stride x), + " specialize for given input stride"; + + "-with-ostride", + Arg.String(fun x -> uostride := arg_to_stride x), + " specialize for given output stride"; + + "-with-ivstride", + Arg.String(fun x -> uivstride := arg_to_stride x), + " specialize for given input vector stride"; + + "-with-ovstride", + Arg.String(fun x -> uovstride := arg_to_stride x), + " specialize for given output vector stride"; + + "-normalization", + Arg.String(fun x -> normalization := int_of_string x), + " normalization integer to divide by"; + + "-mdct", + Arg.Unit(fun () -> mode := MDCT), + " generate an MDCT codelet"; + + "-mdct-mp3", + Arg.Unit(fun () -> mode := MDCT_MP3), + " generate an MDCT codelet with MP3 windowing"; + + "-mdct-window", + Arg.Unit(fun () -> mode := MDCT_WINDOW), + " generate an MDCT codelet with window array"; + + "-mdct-window-sym", + Arg.Unit(fun () -> mode := MDCT_WINDOW_SYM), + " generate an MDCT codelet with symmetric window array"; + + "-imdct", + Arg.Unit(fun () -> mode := IMDCT), + " generate an IMDCT codelet"; + + "-imdct-mp3", + Arg.Unit(fun () -> mode := IMDCT_MP3), + " generate an IMDCT codelet with MP3 windowing"; + + "-imdct-window", + Arg.Unit(fun () -> mode := IMDCT_WINDOW), + " generate an IMDCT codelet with window array"; + + "-imdct-window-sym", + Arg.Unit(fun () -> mode := IMDCT_WINDOW_SYM), + " generate an IMDCT codelet with symmetric window array"; +] + +let unity_window n i = Complex.one + +(* MP3 window(k) = sin(pi/(2n) * (k + 1/2)) *) +let mp3_window n k = + Complex.imag (Complex.exp (8 * n) (2*k + 1)) + +(* Vorbis window(k) = sin(pi/2 * (mp3_window(k))^2) + ... this is transcendental, though, so we can't do it with our + current Complex.exp function *) + +let window_array n w = + array n (fun i -> + let stride = C.SInteger 1 + and klass = Unique.make () in + let refr = C.array_subscript w stride i in + let kr = Variable.make_constant klass refr in + load_r (kr, kr)) + +let load_window w n i = w i +let load_window_sym w n i = w (if (i < n) then i else (2*n - 1 - i)) + +(* fixme: use same locations for input and output so that it works in-place? *) + +(* Note: only correct for even n! *) +let load_array_mdct window n rarr iarr locations = + let twon = 2 * n in + let arr = load_array_c twon + (locative_array_c twon rarr iarr locations "BUG") in + let arrw = fun i -> Complex.times (window n i) (arr i) in + array n + ((Complex.times Complex.half) @@ + (fun i -> + if (i < n/2) then + Complex.uminus (Complex.plus [arrw (i + n + n/2); + arrw (n + n/2 - 1 - i)]) + else + Complex.plus [arrw (i - n/2); + Complex.uminus (arrw (n + n/2 - 1 - i))])) + +let store_array_mdct window n rarr iarr locations arr = + store_array_r n (locative_array_c n rarr iarr locations "BUG") arr + +let load_array_imdct window n rarr iarr locations = + load_array_c n (locative_array_c n rarr iarr locations "BUG") + +let store_array_imdct window n rarr iarr locations arr = + let n2 = n/2 in + let threen2 = 3*n2 in + let arr2 = fun i -> + if (i < n2) then + arr (i + n2) + else if (i < threen2) then + Complex.uminus (arr (threen2 - 1 - i)) + else + Complex.uminus (arr (i - threen2)) + in + let arr2w = fun i -> Complex.times (window n i) (arr2 i) in + let twon = 2 * n in + store_array_r twon (locative_array_c twon rarr iarr locations "BUG") arr2w + +let window_param = function + MDCT_WINDOW -> true + | MDCT_WINDOW_SYM -> true + | IMDCT_WINDOW -> true + | IMDCT_WINDOW_SYM -> true + | _ -> false + +let generate n mode = + let iarray = "I" + and oarray = "O" + and istride = "istride" + and ostride = "ostride" + and window = "W" + and name = !Magic.codelet_name in + + let vistride = either_stride (!uistride) (C.SVar istride) + and vostride = either_stride (!uostride) (C.SVar ostride) + in + + let sivs = stride_to_string "ovs" !uovstride in + let sovs = stride_to_string "ivs" !uivstride in + + let (transform, load_input, store_output) = match mode with + | MDCT -> Trig.dctIV, load_array_mdct unity_window, + store_array_mdct unity_window + | MDCT_MP3 -> Trig.dctIV, load_array_mdct mp3_window, + store_array_mdct unity_window + | MDCT_WINDOW -> Trig.dctIV, load_array_mdct + (load_window (window_array (2 * n) window)), + store_array_mdct unity_window + | MDCT_WINDOW_SYM -> Trig.dctIV, load_array_mdct + (load_window_sym (window_array n window)), + store_array_mdct unity_window + | IMDCT -> Trig.dctIV, load_array_imdct unity_window, + store_array_imdct unity_window + | IMDCT_MP3 -> Trig.dctIV, load_array_imdct unity_window, + store_array_imdct mp3_window + | IMDCT_WINDOW -> Trig.dctIV, load_array_imdct unity_window, + store_array_imdct (load_window (window_array (2 * n) window)) + | IMDCT_WINDOW_SYM -> Trig.dctIV, load_array_imdct unity_window, + store_array_imdct (load_window_sym (window_array n window)) + | _ -> failwith "must specify transform kind" + in + + let locations = unique_array_c (2*n) in + let input = + load_input n + (C.array_subscript iarray vistride) + (C.array_subscript "BUG" vistride) + locations + in + let output = (Complex.times (Complex.inverse_int !normalization)) + @@ (transform n input) in + let odag = + store_output n + (C.array_subscript oarray vostride) + (C.array_subscript "BUG" vostride) + locations + output + in + let annot = standard_optimizer odag in + + let tree = + Fcn ("void", name, + ([Decl (C.constrealtypep, iarray); + Decl (C.realtypep, oarray)] + @ (if stride_fixed !uistride then [] + else [Decl (C.stridetype, istride)]) + @ (if stride_fixed !uostride then [] + else [Decl (C.stridetype, ostride)]) + @ (choose_simd [] + (if stride_fixed !uivstride then [] else + [Decl ("int", sivs)])) + @ (choose_simd [] + (if stride_fixed !uovstride then [] else + [Decl ("int", sovs)])) + @ (if (not (window_param mode)) then [] + else [Decl (C.constrealtypep, window)]) + ), + finalize_fcn (Asch annot)) + + in + (unparse tree) ^ "\n" + + +let main () = + begin + parse speclist usage; + print_string (generate (check_size ()) !mode); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_notw.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_notw.ml new file mode 100644 index 000000000..046d9090c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_notw.ml @@ -0,0 +1,168 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n " + +let uistride = ref Stride_variable +let uostride = ref Stride_variable +let uivstride = ref Stride_variable +let uovstride = ref Stride_variable + +let speclist = [ + "-with-istride", + Arg.String(fun x -> uistride := arg_to_stride x), + " specialize for given input stride"; + + "-with-ostride", + Arg.String(fun x -> uostride := arg_to_stride x), + " specialize for given output stride"; + + "-with-ivstride", + Arg.String(fun x -> uivstride := arg_to_stride x), + " specialize for given input vector stride"; + + "-with-ovstride", + Arg.String(fun x -> uovstride := arg_to_stride x), + " specialize for given output vector stride" +] + +let nonstandard_optimizer list_of_buddy_stores dag = + let sched = standard_scheduler dag in + let annot = Annotate.annotate list_of_buddy_stores sched in + let _ = dump_asched annot in + annot + +let generate n = + let riarray = "ri" + and iiarray = "ii" + and roarray = "ro" + and ioarray = "io" + and istride = "is" + and ostride = "os" + and i = "i" + and v = "v" + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "(2 * VL)", x)) in + let ename = expand_name name in + + let vistride = either_stride (!uistride) (C.SVar istride) + and vostride = either_stride (!uostride) (C.SVar ostride) + in + + let sovs = stride_to_string "ovs" !uovstride in + let sivs = stride_to_string "ivs" !uivstride in + + let locations = unique_array_c n in + let input = + locative_array_c n + (C.array_subscript riarray vistride) + (C.array_subscript iiarray vistride) + locations sivs in + let output = Fft.dft sign n (load_array_c n input) in + let oloc = + locative_array_c n + (C.array_subscript roarray vostride) + (C.array_subscript ioarray vostride) + locations sovs in + let list_of_buddy_stores = + let k = !Simdmagic.store_multiple in + if (k > 1) then + if (n mod k == 0) then + List.append + (List.map + (fun i -> List.map (fun j -> (fst (oloc (k * i + j)))) (iota k)) + (iota (n / k))) + (List.map + (fun i -> List.map (fun j -> (snd (oloc (k * i + j)))) (iota k)) + (iota (n / k))) + else failwith "invalid n for -store-multiple" + else [] + in + + let odag = store_array_c n oloc output in + let annot = nonstandard_optimizer list_of_buddy_stores odag in + + let body = Block ( + [Decl ("INT", i)], + [For (Expr_assign (CVar i, CVar v), + Binop (" > ", CVar i, Integer 0), + list_to_comma + [Expr_assign (CVar i, CPlus [CVar i; CUminus (byvl (Integer 1))]); + Expr_assign (CVar riarray, CPlus [CVar riarray; + byvl (CVar sivs)]); + Expr_assign (CVar iiarray, CPlus [CVar iiarray; + byvl (CVar sivs)]); + Expr_assign (CVar roarray, CPlus [CVar roarray; + byvl (CVar sovs)]); + Expr_assign (CVar ioarray, CPlus [CVar ioarray; + byvl (CVar sovs)]); + make_volatile_stride (4*n) (CVar istride); + make_volatile_stride (4*n) (CVar ostride) + ], + Asch annot) + ]) + in + + let tree = + Fcn ((if !Magic.standalone then "void" else "static void"), ename, + ([Decl (C.constrealtypep, riarray); + Decl (C.constrealtypep, iiarray); + Decl (C.realtypep, roarray); + Decl (C.realtypep, ioarray); + Decl (C.stridetype, istride); + Decl (C.stridetype, ostride); + Decl ("INT", v); + Decl ("INT", "ivs"); + Decl ("INT", "ovs")]), + finalize_fcn body) + + in let desc = + Printf.sprintf + "static const kdft_desc desc = { %d, %s, %s, &GENUS, %s, %s, %s, %s };\n" + n (stringify name) (flops_of tree) + (stride_to_solverparm !uistride) (stride_to_solverparm !uostride) + (choose_simd "0" (stride_to_solverparm !uivstride)) + (choose_simd "0" (stride_to_solverparm !uovstride)) + + and init = + (declare_register_fcn name) ^ + "{" ^ + " X(kdft_register)(p, " ^ ename ^ ", &desc);\n" ^ + "}\n" + + in ((unparse tree) ^ "\n" ^ + (if !Magic.standalone then "" else desc ^ init)) + +let main () = + begin + parse speclist usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_notw_c.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_notw_c.ml new file mode 100644 index 000000000..5c268cb5f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_notw_c.ml @@ -0,0 +1,165 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n " + +let uistride = ref Stride_variable +let uostride = ref Stride_variable +let uivstride = ref Stride_variable +let uovstride = ref Stride_variable + +let speclist = [ + "-with-istride", + Arg.String(fun x -> uistride := arg_to_stride x), + " specialize for given input stride"; + + "-with-ostride", + Arg.String(fun x -> uostride := arg_to_stride x), + " specialize for given output stride"; + + "-with-ivstride", + Arg.String(fun x -> uivstride := arg_to_stride x), + " specialize for given input vector stride"; + + "-with-ovstride", + Arg.String(fun x -> uovstride := arg_to_stride x), + " specialize for given output vector stride" +] + +let nonstandard_optimizer list_of_buddy_stores dag = + let sched = standard_scheduler dag in + let annot = Annotate.annotate list_of_buddy_stores sched in + let _ = dump_asched annot in + annot + +let generate n = + let riarray = "xi" + and roarray = "xo" + and istride = "is" + and ostride = "os" + and i = "i" + and v = "v" + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) in + let ename = expand_name name in + + let vistride = either_stride (!uistride) (C.SVar istride) + and vostride = either_stride (!uostride) (C.SVar ostride) + in + + let sivs = stride_to_string "ivs" !uivstride in + let sovs = stride_to_string "ovs" !uovstride in + + let fft = Trig.dft_via_rdft in + + let locations = unique_array_c n in + let input = + locative_array_c n + (C.array_subscript riarray vistride) + (C.array_subscript "BUG" vistride) + locations sivs in + let output = fft sign n (load_array_r n input) in + let oloc = + locative_array_c n + (C.array_subscript roarray vostride) + (C.array_subscript "BUG" vostride) + locations sovs in + let list_of_buddy_stores = + let k = !Simdmagic.store_multiple in + if (k > 1) then + if (n mod k == 0) then + List.map + (fun i -> List.map (fun j -> (fst (oloc (k * i + j)))) (iota k)) + (iota (n / k)) + else failwith "invalid n for -store-multiple" + else [] + in + let odag = store_array_r n oloc output in + let annot = nonstandard_optimizer list_of_buddy_stores odag in + + let body = Block ( + [Decl ("INT", i); + Decl (C.constrealtypep, riarray); + Decl (C.realtypep, roarray)], + [Stmt_assign (CVar riarray, CVar (if (sign < 0) then "ri" else "ii")); + Stmt_assign (CVar roarray, CVar (if (sign < 0) then "ro" else "io")); + For (Expr_assign (CVar i, CVar v), + Binop (" > ", CVar i, Integer 0), + list_to_comma + [Expr_assign (CVar i, CPlus [CVar i; CUminus (byvl (Integer 1))]); + Expr_assign (CVar riarray, CPlus [CVar riarray; + byvl (CVar sivs)]); + Expr_assign (CVar roarray, CPlus [CVar roarray; + byvl (CVar sovs)]); + make_volatile_stride (2*n) (CVar istride); + make_volatile_stride (2*n) (CVar ostride) + ], + Asch annot); + ]) + in + + let tree = + Fcn ((if !Magic.standalone then "void" else "static void"), ename, + ([Decl (C.constrealtypep, "ri"); + Decl (C.constrealtypep, "ii"); + Decl (C.realtypep, "ro"); + Decl (C.realtypep, "io"); + Decl (C.stridetype, istride); + Decl (C.stridetype, ostride); + Decl ("INT", v); + Decl ("INT", "ivs"); + Decl ("INT", "ovs")]), + finalize_fcn body) + + in + let desc = + Printf.sprintf + "static const kdft_desc desc = { %d, %s, %s, &GENUS, %s, %s, %s, %s };\n" + n (stringify name) (flops_of tree) + (stride_to_solverparm !uistride) (stride_to_solverparm !uostride) + (choose_simd "0" (stride_to_solverparm !uivstride)) + (choose_simd "0" (stride_to_solverparm !uovstride)) + + and init = + (declare_register_fcn name) ^ + "{" ^ + " X(kdft_register)(p, " ^ ename ^ ", &desc);\n" ^ + "}\n" + + in ((unparse tree) ^ "\n" ^ + (if !Magic.standalone then "" else desc ^ init)) + +let main () = + begin + Simdmagic.simd_mode := true; + parse speclist usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2cb.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2cb.ml new file mode 100644 index 000000000..1faebe47d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2cb.ml @@ -0,0 +1,167 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n " + +let urs = ref Stride_variable +let ucsr = ref Stride_variable +let ucsi = ref Stride_variable +let uivs = ref Stride_variable +let uovs = ref Stride_variable +let dftIII_flag = ref false + +let speclist = [ + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given real-array stride"; + + "-with-csr", + Arg.String(fun x -> ucsr := arg_to_stride x), + " specialize for given complex-array real stride"; + + "-with-csi", + Arg.String(fun x -> ucsi := arg_to_stride x), + " specialize for given complex-array imaginary stride"; + + "-with-ivs", + Arg.String(fun x -> uivs := arg_to_stride x), + " specialize for given input vector stride"; + + "-with-ovs", + Arg.String(fun x -> uovs := arg_to_stride x), + " specialize for given output vector stride"; + + "-dft-III", + Arg.Unit(fun () -> dftIII_flag := true), + " produce shifted dftIII-style codelets" +] + +let hcdftIII sign n input = + let input' i = + if (i mod 2 == 0) then + Complex.zero + else + let i' = (i - 1) / 2 in + if (2 * i' < n - 1) then (input i') + else if (2 * i' == n - 1) then + Complex.real (input i') + else + Complex.conj (input (n - 1 - i')) + in Fft.dft sign (2 * n) input' + +let generate n = + let ar0 = "R0" and ar1 = "R1" and acr = "Cr" and aci = "Ci" + and rs = "rs" and csr = "csr" and csi = "csi" + and i = "i" and v = "v" + and transform = if !dftIII_flag then hcdftIII else Trig.hdft + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name in + + let vrs = either_stride (!urs) (C.SVar rs) + and vcsr = either_stride (!ucsr) (C.SVar csr) + and vcsi = either_stride (!ucsi) (C.SVar csi) + in + + let sovs = stride_to_string "ovs" !uovs in + let sivs = stride_to_string "ivs" !uivs in + + let locations = unique_array_c n in + let input = + locative_array_c n + (C.array_subscript acr vcsr) + (C.array_subscript aci vcsi) + locations sivs in + let output = transform sign n (load_array_hc n input) in + let oloce = + locative_array_c n + (C.array_subscript ar0 vrs) + (C.array_subscript "BUG" vrs) + locations sovs + and oloco = + locative_array_c n + (C.array_subscript ar1 vrs) + (C.array_subscript "BUG" vrs) + locations sovs in + let oloc i = if i mod 2 == 0 then oloce (i/2) else oloco ((i-1)/2) in + let odag = store_array_r n oloc output in + let annot = standard_optimizer odag in + + let body = Block ( + [Decl ("INT", i)], + [For (Expr_assign (CVar i, CVar v), + Binop (" > ", CVar i, Integer 0), + list_to_comma + [Expr_assign (CVar i, CPlus [CVar i; CUminus (Integer 1)]); + Expr_assign (CVar ar0, CPlus [CVar ar0; CVar sovs]); + Expr_assign (CVar ar1, CPlus [CVar ar1; CVar sovs]); + Expr_assign (CVar acr, CPlus [CVar acr; CVar sivs]); + Expr_assign (CVar aci, CPlus [CVar aci; CVar sivs]); + make_volatile_stride (4*n) (CVar rs); + make_volatile_stride (4*n) (CVar csr); + make_volatile_stride (4*n) (CVar csi) + ], + Asch annot) + ]) + in + + let tree = + Fcn ((if !Magic.standalone then "void" else "static void"), name, + ([Decl (C.realtypep, ar0); + Decl (C.realtypep, ar1); + Decl (C.realtypep, acr); + Decl (C.realtypep, aci); + Decl (C.stridetype, rs); + Decl (C.stridetype, csr); + Decl (C.stridetype, csi); + Decl ("INT", v); + Decl ("INT", "ivs"); + Decl ("INT", "ovs")]), + finalize_fcn body) + + in let desc = + Printf.sprintf + "static const kr2c_desc desc = { %d, \"%s\", %s, &GENUS };\n\n" + n name (flops_of tree) + + and init = + (declare_register_fcn name) ^ + "{" ^ + " X(kr2c_register)(p, " ^ name ^ ", &desc);\n" ^ + "}\n" + + in + (unparse tree) ^ "\n" ^ (if !Magic.standalone then "" else desc ^ init) + + +let main () = + begin + parse speclist usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2cf.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2cf.ml new file mode 100644 index 000000000..2cff0b8c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2cf.ml @@ -0,0 +1,164 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n " + +let urs = ref Stride_variable +let ucsr = ref Stride_variable +let ucsi = ref Stride_variable +let uivs = ref Stride_variable +let uovs = ref Stride_variable +let dftII_flag = ref false + +let speclist = [ + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given real-array stride"; + + "-with-csr", + Arg.String(fun x -> ucsr := arg_to_stride x), + " specialize for given complex-array real stride"; + + "-with-csi", + Arg.String(fun x -> ucsi := arg_to_stride x), + " specialize for given complex-array imaginary stride"; + + "-with-ivs", + Arg.String(fun x -> uivs := arg_to_stride x), + " specialize for given input vector stride"; + + "-with-ovs", + Arg.String(fun x -> uovs := arg_to_stride x), + " specialize for given output vector stride"; + + "-dft-II", + Arg.Unit(fun () -> dftII_flag := true), + " produce shifted dftII-style codelets" +] + +let rdftII sign n input = + let input' i = if i < n then input i else Complex.zero in + let f = Fft.dft sign (2 * n) input' in + let g i = f (2 * i + 1) + in fun i -> + if (i < n - i) then g i + else if (2 * i + 1 == n) then Complex.real (g i) + else Complex.zero + +let generate n = + let ar0 = "R0" and ar1 = "R1" and acr = "Cr" and aci = "Ci" + and rs = "rs" and csr = "csr" and csi = "csi" + and i = "i" and v = "v" + and transform = if !dftII_flag then rdftII else Trig.rdft + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name in + + let vrs = either_stride (!urs) (C.SVar rs) + and vcsr = either_stride (!ucsr) (C.SVar csr) + and vcsi = either_stride (!ucsi) (C.SVar csi) + in + + let sovs = stride_to_string "ovs" !uovs in + let sivs = stride_to_string "ivs" !uivs in + + let locations = unique_array_c n in + let inpute = + locative_array_c n + (C.array_subscript ar0 vrs) + (C.array_subscript "BUG" vrs) + locations sivs + and inputo = + locative_array_c n + (C.array_subscript ar1 vrs) + (C.array_subscript "BUG" vrs) + locations sivs + in + let input i = if i mod 2 == 0 then inpute (i/2) else inputo ((i-1)/2) in + let output = transform sign n (load_array_r n input) in + let oloc = + locative_array_c n + (C.array_subscript acr vcsr) + (C.array_subscript aci vcsi) + locations sovs in + let odag = store_array_hc n oloc output in + let annot = standard_optimizer odag in + + let body = Block ( + [Decl ("INT", i)], + [For (Expr_assign (CVar i, CVar v), + Binop (" > ", CVar i, Integer 0), + list_to_comma + [Expr_assign (CVar i, CPlus [CVar i; CUminus (Integer 1)]); + Expr_assign (CVar ar0, CPlus [CVar ar0; CVar sivs]); + Expr_assign (CVar ar1, CPlus [CVar ar1; CVar sivs]); + Expr_assign (CVar acr, CPlus [CVar acr; CVar sovs]); + Expr_assign (CVar aci, CPlus [CVar aci; CVar sovs]); + make_volatile_stride (4*n) (CVar rs); + make_volatile_stride (4*n) (CVar csr); + make_volatile_stride (4*n) (CVar csi) + ], + Asch annot) + ]) + in + + let tree = + Fcn ((if !Magic.standalone then "void" else "static void"), name, + ([Decl (C.realtypep, ar0); + Decl (C.realtypep, ar1); + Decl (C.realtypep, acr); + Decl (C.realtypep, aci); + Decl (C.stridetype, rs); + Decl (C.stridetype, csr); + Decl (C.stridetype, csi); + Decl ("INT", v); + Decl ("INT", "ivs"); + Decl ("INT", "ovs")]), + finalize_fcn body) + + in let desc = + Printf.sprintf + "static const kr2c_desc desc = { %d, \"%s\", %s, &GENUS };\n\n" + n name (flops_of tree) + + and init = + (declare_register_fcn name) ^ + "{" ^ + " X(kr2c_register)(p, " ^ name ^ ", &desc);\n" ^ + "}\n" + + in + (unparse tree) ^ "\n" ^ (if !Magic.standalone then "" else desc ^ init) + + +let main () = + begin + parse speclist usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2r.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2r.ml new file mode 100644 index 000000000..521eb4a1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_r2r.ml @@ -0,0 +1,257 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* generation of trigonometric transforms *) + +open Util +open Genutil +open C + + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n " + +let uistride = ref Stride_variable +let uostride = ref Stride_variable +let uivstride = ref Stride_variable +let uovstride = ref Stride_variable + +type mode = + | RDFT + | HDFT + | DHT + | REDFT00 + | REDFT10 + | REDFT01 + | REDFT11 + | RODFT00 + | RODFT10 + | RODFT01 + | RODFT11 + | NONE + +let mode = ref NONE +let normsqr = ref 1 +let unitary = ref false +let noloop = ref false + +let speclist = [ + "-with-istride", + Arg.String(fun x -> uistride := arg_to_stride x), + " specialize for given input stride"; + + "-with-ostride", + Arg.String(fun x -> uostride := arg_to_stride x), + " specialize for given output stride"; + + "-with-ivstride", + Arg.String(fun x -> uivstride := arg_to_stride x), + " specialize for given input vector stride"; + + "-with-ovstride", + Arg.String(fun x -> uovstride := arg_to_stride x), + " specialize for given output vector stride"; + + "-rdft", + Arg.Unit(fun () -> mode := RDFT), + " generate a real DFT codelet"; + + "-hdft", + Arg.Unit(fun () -> mode := HDFT), + " generate a Hermitian DFT codelet"; + + "-dht", + Arg.Unit(fun () -> mode := DHT), + " generate a DHT codelet"; + + "-redft00", + Arg.Unit(fun () -> mode := REDFT00), + " generate a DCT-I codelet"; + + "-redft10", + Arg.Unit(fun () -> mode := REDFT10), + " generate a DCT-II codelet"; + + "-redft01", + Arg.Unit(fun () -> mode := REDFT01), + " generate a DCT-III codelet"; + + "-redft11", + Arg.Unit(fun () -> mode := REDFT11), + " generate a DCT-IV codelet"; + + "-rodft00", + Arg.Unit(fun () -> mode := RODFT00), + " generate a DST-I codelet"; + + "-rodft10", + Arg.Unit(fun () -> mode := RODFT10), + " generate a DST-II codelet"; + + "-rodft01", + Arg.Unit(fun () -> mode := RODFT01), + " generate a DST-III codelet"; + + "-rodft11", + Arg.Unit(fun () -> mode := RODFT11), + " generate a DST-IV codelet"; + + "-normalization", + Arg.String(fun x -> let ix = int_of_string x in normsqr := ix * ix), + " normalization integer to divide by"; + + "-normsqr", + Arg.String(fun x -> normsqr := int_of_string x), + " integer square of normalization to divide by"; + + "-unitary", + Arg.Unit(fun () -> unitary := true), + " unitary normalization (up overall scale factor)"; + + "-noloop", + Arg.Unit(fun () -> noloop := true), + " no vector loop"; +] + +let sqrt_half = Complex.inverse_int_sqrt 2 +let sqrt_two = Complex.int_sqrt 2 + +let rescale sc s1 s2 input i = + if ((i == s1 || i == s2) && !unitary) then + Complex.times (input i) sc + else + input i + +let generate n mode = + let iarray = "I" + and oarray = "O" + and istride = "is" + and ostride = "os" + and i = "i" + and v = "v" + in + + let sign = !Genutil.sign + and name = !Magic.codelet_name in + + let vistride = either_stride (!uistride) (C.SVar istride) + and vostride = either_stride (!uostride) (C.SVar ostride) + in + + let sovs = stride_to_string "ovs" !uovstride in + let sivs = stride_to_string "ivs" !uivstride in + + let (transform, load_input, store_output, si1,si2,so1,so2) = match mode with + | RDFT -> Trig.rdft sign, load_array_r, store_array_hc, -1,-1,-1,-1 + | HDFT -> Trig.hdft sign, load_array_c, store_array_r, -1,-1,-1,-1 (* TODO *) + | DHT -> Trig.dht 1, load_array_r, store_array_r, -1,-1,-1,-1 + | REDFT00 -> Trig.dctI, load_array_r, store_array_r, 0,n-1,0,n-1 + | REDFT10 -> Trig.dctII, load_array_r, store_array_r, -1,-1,0,-1 + | REDFT01 -> Trig.dctIII, load_array_r, store_array_r, 0,-1,-1,-1 + | REDFT11 -> Trig.dctIV, load_array_r, store_array_r, -1,-1,-1,-1 + | RODFT00 -> Trig.dstI, load_array_r, store_array_r, -1,-1,-1,-1 + | RODFT10 -> Trig.dstII, load_array_r, store_array_r, -1,-1,n-1,-1 + | RODFT01 -> Trig.dstIII, load_array_r, store_array_r, n-1,-1,-1,-1 + | RODFT11 -> Trig.dstIV, load_array_r, store_array_r, -1,-1,-1,-1 + | _ -> failwith "must specify transform kind" + in + + let locations = unique_array_c n in + let input = locative_array_c n + (C.array_subscript iarray vistride) + (C.array_subscript "BUG" vistride) + locations sivs in + let output = rescale sqrt_half so1 so2 + ((Complex.times (Complex.inverse_int_sqrt !normsqr)) + @@ (transform n (rescale sqrt_two si1 si2 (load_array_c n input)))) in + let oloc = + locative_array_c n + (C.array_subscript oarray vostride) + (C.array_subscript "BUG" vostride) + locations sovs in + let odag = store_output n oloc output in + let annot = standard_optimizer odag in + + let body = if !noloop then Block([], [Asch annot]) else Block ( + [Decl ("INT", i)], + [For (Expr_assign (CVar i, CVar v), + Binop (" > ", CVar i, Integer 0), + list_to_comma + [Expr_assign (CVar i, CPlus [CVar i; CUminus (Integer 1)]); + Expr_assign (CVar iarray, CPlus [CVar iarray; CVar sivs]); + Expr_assign (CVar oarray, CPlus [CVar oarray; CVar sovs]); + make_volatile_stride (2*n) (CVar istride); + make_volatile_stride (2*n) (CVar ostride) + ], + Asch annot) + ]) + in + + let tree = + Fcn ((if !Magic.standalone then "void" else "static void"), name, + ([Decl (C.constrealtypep, iarray); + Decl (C.realtypep, oarray)] + @ (if stride_fixed !uistride then [] + else [Decl (C.stridetype, istride)]) + @ (if stride_fixed !uostride then [] + else [Decl (C.stridetype, ostride)]) + @ (if !noloop then [] else + [Decl ("INT", v)] + @ (if stride_fixed !uivstride then [] + else [Decl ("INT", "ivs")]) + @ (if stride_fixed !uovstride then [] + else [Decl ("INT", "ovs")]))), + finalize_fcn body) + + in let desc = + Printf.sprintf + "static const kr2r_desc desc = { %d, \"%s\", %s, &GENUS, %s };\n\n" + n name (flops_of tree) + (match mode with + | RDFT -> "RDFT00" + | HDFT -> "HDFT00" + | DHT -> "DHT" + | REDFT00 -> "REDFT00" + | REDFT10 -> "REDFT10" + | REDFT01 -> "REDFT01" + | REDFT11 -> "REDFT11" + | RODFT00 -> "RODFT00" + | RODFT10 -> "RODFT10" + | RODFT01 -> "RODFT01" + | RODFT11 -> "RODFT11" + | _ -> failwith "must specify a transform kind") + + and init = + (declare_register_fcn name) ^ + "{" ^ + " X(kr2r_register)(p, " ^ name ^ ", &desc);\n" ^ + "}\n" + + in + (unparse tree) ^ "\n" ^ (if !Magic.standalone then "" else desc ^ init) + + +let main () = + begin + parse speclist usage; + print_string (generate (check_size ()) !mode); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twiddle.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twiddle.ml new file mode 100644 index 000000000..f48a31461 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twiddle.ml @@ -0,0 +1,161 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +type ditdif = DIT | DIF +let ditdif = ref DIT +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let urs = ref Stride_variable +let ums = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given i/o stride"; + + "-with-ms", + Arg.String(fun x -> ums := arg_to_stride x), + " specialize for given ms" +] + +let generate n = + let rioarray = "ri" + and iioarray = "ii" + and rs = "rs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "(2 * VL)", x)) in + let ename = expand_name name in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 false in + let nt = num_twiddles n in + + let byw = bytwiddle n sign (twiddle_array nt twarray) in + + let vrs = either_stride (!urs) (C.SVar rs) in + let sms = stride_to_string "ms" !ums in + + let locations = unique_array_c n in + let iloc = + locative_array_c n + (C.array_subscript rioarray vrs) + (C.array_subscript iioarray vrs) + locations sms + and oloc = + locative_array_c n + (C.array_subscript rioarray vrs) + (C.array_subscript iioarray vrs) + locations sms + in + let liloc = load_array_c n iloc in + let output = + match !ditdif with + | DIT -> array n (Fft.dft sign n (byw liloc)) + | DIF -> array n (byw (Fft.dft sign n liloc)) + in + let odag = store_array_c n oloc output in + let annot = standard_optimizer odag in + + let vm = CVar m and vmb = CVar mb and vme = CVar me in + + let body = Block ( + [Decl ("INT", m)], + [For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (vmb, Integer nt)])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (CVar rioarray, CPlus [CVar rioarray; + byvl (CVar sms)]); + Expr_assign (CVar iioarray, CPlus [CVar iioarray; + byvl (CVar sms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + byvl (Integer nt)]); + make_volatile_stride (2*n) (CVar rs) + ], + Asch annot)]) + in + + let tree = + Fcn (((if !Magic.standalone then "" else "static ") ^ "void"), + ename, + [Decl (C.realtypep, rioarray); + Decl (C.realtypep, iioarray); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "(2 * VL)" (twdesc n)) + and desc = + Printf.sprintf + "static const ct_desc desc = {%d, %s, twinstr, &GENUS, %s, %s, %s, %s};\n\n" + n (stringify name) (flops_of tree) + (stride_to_solverparm !urs) "0" + (stride_to_solverparm !ums) + and register = + match !ditdif with + | DIT -> "X(kdft_dit_register)" + | DIF -> "X(kdft_dif_register)" + + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register ename) + in + + (unparse tree) ^ "\n" ^ + (if !Magic.standalone then "" else init) + + +let main () = + begin + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twiddle_c.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twiddle_c.ml new file mode 100644 index 000000000..9de6fc1d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twiddle_c.ml @@ -0,0 +1,165 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + + +type ditdif = DIT | DIF +let ditdif = ref DIT +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let urs = ref Stride_variable +let ums = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given i/o stride"; + + "-with-ms", + Arg.String(fun x -> ums := arg_to_stride x), + " specialize for given ms" +] + +let generate n = + let rioarray = "x" + and rs = "rs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) + and bytwvl x = choose_simd x (ctimes (CVar "TWVL", x)) + and bytwvl_vl x = choose_simd x (ctimes (CVar "(TWVL/VL)", x)) in + let ename = expand_name name in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 true in + let nt = num_twiddles n in + + let byw = bytwiddle n sign (twiddle_array nt twarray) in + + let vrs = either_stride (!urs) (C.SVar rs) in + let sms = stride_to_string "ms" !ums in + + let locations = unique_array_c n in + let iloc = + locative_array_c n + (C.array_subscript rioarray vrs) + (C.array_subscript "BUG" vrs) + locations sms + and oloc = + locative_array_c n + (C.array_subscript rioarray vrs) + (C.array_subscript "BUG" vrs) + locations sms + in + let liloc = load_array_r n iloc in + let fft = Trig.dft_via_rdft in + let output = + match !ditdif with + | DIT -> array n (fft sign n (byw liloc)) + | DIF -> array n (byw (fft sign n liloc)) + in + let odag = store_array_r n oloc output in + let annot = standard_optimizer odag in + + let vm = CVar m and vmb = CVar mb and vme = CVar me in + + let body = Block ( + [Decl ("INT", m); + Decl (C.realtypep, rioarray)], + [Stmt_assign (CVar rioarray, + CVar (if (sign < 0) then "ri" else "ii")); + For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (vmb, + bytwvl_vl (Integer nt))])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (CVar rioarray, CPlus [CVar rioarray; + byvl (CVar sms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + bytwvl (Integer nt)]); + make_volatile_stride n (CVar rs) + ], + Asch annot)]) + in + + let tree = + Fcn (((if !Magic.standalone then "" else "static ") ^ "void"), + ename, + [Decl (C.realtypep, "ri"); + Decl (C.realtypep, "ii"); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "VL" (twdesc n)) + and desc = + Printf.sprintf + "static const ct_desc desc = {%d, %s, twinstr, &GENUS, %s, %s, %s, %s};\n\n" + n (stringify name) (flops_of tree) + (stride_to_solverparm !urs) "0" + (stride_to_solverparm !ums) + and register = + match !ditdif with + | DIT -> "X(kdft_dit_register)" + | DIF -> "X(kdft_dif_register)" + + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register ename) + in + + (unparse tree) ^ "\n" ^ (if !Magic.standalone then "" else init) + + +let main () = + begin + Simdmagic.simd_mode := true; + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twidsq.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twidsq.ml new file mode 100644 index 000000000..fc2e68e1f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twidsq.ml @@ -0,0 +1,176 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + +type ditdif = DIT | DIF +let ditdif = ref DIT + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let reload_twiddle = ref false + +let urs = ref Stride_variable +let uvs = ref Stride_variable +let ums = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-reload-twiddle", + Arg.Unit(fun () -> reload_twiddle := true), + " do not collect common twiddle factors"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given input stride"; + + "-with-vs", + Arg.String(fun x -> uvs := arg_to_stride x), + " specialize for given vector stride"; + + "-with-ms", + Arg.String(fun x -> ums := arg_to_stride x), + " specialize for given ms" +] + +let generate n = + let rioarray = "rio" + and iioarray = "iio" + and rs = "rs" and vs = "vs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" in + + let sign = !Genutil.sign + and name = !Magic.codelet_name in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 false in + let nt = num_twiddles n in + + let svs = either_stride (!uvs) (C.SVar vs) + and srs = either_stride (!urs) (C.SVar rs) in + + let byw = + if !reload_twiddle then + array n (fun v -> bytwiddle n sign (twiddle_array nt twarray)) + else + let a = bytwiddle n sign (twiddle_array nt twarray) + in fun v -> a + in + + let locations = unique_v_array_c n n in + + let ioi = + locative_v_array_c n n + (C.varray_subscript rioarray svs srs) + (C.varray_subscript iioarray svs srs) + locations "BUG" + and ioo = + locative_v_array_c n n + (C.varray_subscript rioarray svs srs) + (C.varray_subscript iioarray svs srs) + locations "BUG" + in + + let lioi = load_v_array_c n n ioi in + let output = + match !ditdif with + | DIT -> array n (fun v -> Fft.dft sign n (byw v (lioi v))) + | DIF -> array n (fun v -> byw v (Fft.dft sign n (lioi v))) + in + + let odag = store_v_array_c n n ioo (transpose output) in + let annot = standard_optimizer odag in + + let vm = CVar m and vmb = CVar mb and vme = CVar me in + + let body = Block ( + [Decl ("INT", m)], + [For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (vmb, Integer nt)])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; Integer 1]); + Expr_assign (CVar rioarray, CPlus [CVar rioarray; CVar ms]); + Expr_assign (CVar iioarray, CPlus [CVar iioarray; CVar ms]); + Expr_assign (CVar twarray, CPlus [CVar twarray; Integer nt]); + make_volatile_stride (2*n) (CVar rs); + make_volatile_stride (2*0) (CVar vs) + ], + Asch annot)]) in + + let tree = + Fcn (("static void"), name, + [Decl (C.realtypep, rioarray); + Decl (C.realtypep, iioarray); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl (C.stridetype, vs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (Twiddle.twinstr_to_c_string (twdesc n)) + + and desc = + Printf.sprintf + "static const ct_desc desc = {%d, \"%s\", twinstr, &GENUS, %s, %s, %s, %s};\n\n" + n name (flops_of tree) + (stride_to_solverparm !urs) (stride_to_solverparm !uvs) + (stride_to_solverparm !ums) + + and register = + match !ditdif with + | DIT -> "X(kdft_ditsq_register)" + | DIF -> "X(kdft_difsq_register)" + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register name) + in + + (unparse tree) ^ "\n" ^ init + + +let main () = + begin + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twidsq_c.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twidsq_c.ml new file mode 100644 index 000000000..affdaa384 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/gen_twidsq_c.ml @@ -0,0 +1,187 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Util +open Genutil +open C + +type ditdif = DIT | DIF +let ditdif = ref DIT + +let usage = "Usage: " ^ Sys.argv.(0) ^ " -n [ -dit | -dif ]" + +let reload_twiddle = ref false + +let urs = ref Stride_variable +let uvs = ref Stride_variable +let ums = ref Stride_variable + +let speclist = [ + "-dit", + Arg.Unit(fun () -> ditdif := DIT), + " generate a DIT codelet"; + + "-dif", + Arg.Unit(fun () -> ditdif := DIF), + " generate a DIF codelet"; + + "-reload-twiddle", + Arg.Unit(fun () -> reload_twiddle := true), + " do not collect common twiddle factors"; + + "-with-rs", + Arg.String(fun x -> urs := arg_to_stride x), + " specialize for given input stride"; + + "-with-vs", + Arg.String(fun x -> uvs := arg_to_stride x), + " specialize for given vector stride"; + + "-with-ms", + Arg.String(fun x -> ums := arg_to_stride x), + " specialize for given ms" +] + +let generate n = + let rioarray = "x" + and rs = "rs" and vs = "vs" + and twarray = "W" + and m = "m" and mb = "mb" and me = "me" and ms = "ms" in + + let sign = !Genutil.sign + and name = !Magic.codelet_name + and byvl x = choose_simd x (ctimes (CVar "VL", x)) + and bytwvl x = choose_simd x (ctimes (CVar "TWVL", x)) + and bytwvl_vl x = choose_simd x (ctimes (CVar "(TWVL/VL)", x)) in + let ename = expand_name name in + + let (bytwiddle, num_twiddles, twdesc) = Twiddle.twiddle_policy 0 true in + let nt = num_twiddles n in + + let svs = either_stride (!uvs) (C.SVar vs) + and srs = either_stride (!urs) (C.SVar rs) in + let sms = stride_to_string "ms" !ums in + + let byw = + if !reload_twiddle then + array n (fun v -> bytwiddle n sign (twiddle_array nt twarray)) + else + let a = bytwiddle n sign (twiddle_array nt twarray) + in fun v -> a + in + + let locations = unique_v_array_c n n in + + let ioi = + locative_v_array_c n n + (C.varray_subscript rioarray svs srs) + (C.varray_subscript "BUG" svs srs) + locations sms + and ioo = + locative_v_array_c n n + (C.varray_subscript rioarray svs srs) + (C.varray_subscript "BUG" svs srs) + locations sms + in + + let lioi = load_v_array_c n n ioi in + let fft = Trig.dft_via_rdft in + let output = + match !ditdif with + | DIT -> array n (fun v -> fft sign n (byw v (lioi v))) + | DIF -> array n (fun v -> byw v (fft sign n (lioi v))) + in + + let odag = store_v_array_c n n ioo (transpose output) in + let annot = standard_optimizer odag in + + let vm = CVar m and vmb = CVar mb and vme = CVar me in + + let body = Block ( + [Decl ("INT", m); + Decl (C.realtypep, rioarray)], + [Stmt_assign (CVar rioarray, + CVar (if (sign < 0) then "ri" else "ii")); + For (list_to_comma + [Expr_assign (vm, vmb); + Expr_assign (CVar twarray, + CPlus [CVar twarray; + ctimes (vmb, + bytwvl_vl (Integer nt))])], + Binop (" < ", vm, vme), + list_to_comma + [Expr_assign (vm, CPlus [vm; byvl (Integer 1)]); + Expr_assign (CVar rioarray, CPlus [CVar rioarray; + byvl (CVar sms)]); + Expr_assign (CVar twarray, CPlus [CVar twarray; + bytwvl (Integer nt)]); + make_volatile_stride (2*n) (CVar rs); + make_volatile_stride (2*n) (CVar vs) + ], + Asch annot)]) in + + let tree = + Fcn (("static void"), ename, + [Decl (C.realtypep, "ri"); + Decl (C.realtypep, "ii"); + Decl (C.constrealtypep, twarray); + Decl (C.stridetype, rs); + Decl (C.stridetype, vs); + Decl ("INT", mb); + Decl ("INT", me); + Decl ("INT", ms)], + finalize_fcn body) + in + let twinstr = + Printf.sprintf "static const tw_instr twinstr[] = %s;\n\n" + (twinstr_to_string "VL" (twdesc n)) + + and desc = + Printf.sprintf + "static const ct_desc desc = {%d, %s, twinstr, &GENUS, %s, %s, %s, %s};\n\n" + n (stringify name) (flops_of tree) + (stride_to_solverparm !urs) + (stride_to_solverparm !uvs) + (stride_to_solverparm !ums) + + and register = + match !ditdif with + | DIT -> "X(kdft_ditsq_register)" + | DIF -> "X(kdft_difsq_register)" + in + let init = + "\n" ^ + twinstr ^ + desc ^ + (declare_register_fcn name) ^ + (Printf.sprintf "{\n%s(p, %s, &desc);\n}" register ename) + in + + (unparse tree) ^ "\n" ^ init + + +let main () = + begin + parse (speclist @ Twiddle.speclist) usage; + print_string (generate (check_size ())); + end + +let _ = main() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/genutil.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/genutil.ml new file mode 100644 index 000000000..9fbef5514 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/genutil.ml @@ -0,0 +1,328 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* utilities common to all generators *) +open Util + +let choose_simd a b = if !Simdmagic.simd_mode then b else a + +let unique_array n = array n (fun _ -> Unique.make ()) +let unique_array_c n = + array n (fun _ -> + (Unique.make (), Unique.make ())) + +let unique_v_array_c veclen n = + array veclen (fun _ -> + unique_array_c n) + +let locative_array_c n rarr iarr loc vs = + array n (fun i -> + let klass = Unique.make () in + let (rloc, iloc) = loc i in + (Variable.make_locative rloc klass rarr i vs, + Variable.make_locative iloc klass iarr i vs)) + +let locative_v_array_c veclen n rarr iarr loc vs = + array veclen (fun v -> + array n (fun i -> + let klass = Unique.make () in + let (rloc, iloc) = loc v i in + (Variable.make_locative rloc klass (rarr v) i vs, + Variable.make_locative iloc klass (iarr v) i vs))) + +let temporary_array n = + array n (fun i -> Variable.make_temporary ()) + +let temporary_array_c n = + let tmpr = temporary_array n + and tmpi = temporary_array n + in + array n (fun i -> (tmpr i, tmpi i)) + +let temporary_v_array_c veclen n = + array veclen (fun v -> temporary_array_c n) + +let temporary_array_c n = + let tmpr = temporary_array n + and tmpi = temporary_array n + in + array n (fun i -> (tmpr i, tmpi i)) + +let load_c (vr, vi) = Complex.make (Expr.Load vr, Expr.Load vi) +let load_r (vr, vi) = Complex.make (Expr.Load vr, Expr.Num (Number.zero)) + +let twiddle_array nt w = + array (nt/2) (fun i -> + let stride = choose_simd (C.SInteger 1) (C.SConst "TWVL") + and klass = Unique.make () in + let (refr, refi) = (C.array_subscript w stride (2 * i), + C.array_subscript w stride (2 * i + 1)) + in + let (kr, ki) = (Variable.make_constant klass refr, + Variable.make_constant klass refi) + in + load_c (kr, ki)) + + +let load_array_c n var = array n (fun i -> load_c (var i)) +let load_array_r n var = array n (fun i -> load_r (var i)) +let load_array_hc n var = + array n (fun i -> + if (i < n - i) then + load_c (var i) + else if (i > n - i) then + Complex.times Complex.i (load_c (var (n - i))) + else + load_r (var i)) + +let load_v_array_c veclen n var = + array veclen (fun v -> load_array_c n (var v)) + +let store_c (vr, vi) x = [Complex.store_real vr x; Complex.store_imag vi x] +let store_r (vr, vi) x = Complex.store_real vr x +let store_i (vr, vi) x = Complex.store_imag vi x + +let assign_array_c n dst src = + List.flatten + (rmap (iota n) + (fun i -> + let (ar, ai) = Complex.assign (dst i) (src i) + in [ar; ai])) +let assign_v_array_c veclen n dst src = + List.flatten + (rmap (iota veclen) + (fun v -> + assign_array_c n (dst v) (src v))) + +let vassign_v_array_c veclen n dst src = + List.flatten + (rmap (iota n) (fun i -> + List.flatten + (rmap (iota veclen) + (fun v -> + let (ar, ai) = Complex.assign (dst v i) (src v i) + in [ar; ai])))) + +let store_array_r n dst src = + rmap (iota n) + (fun i -> store_r (dst i) (src i)) + +let store_array_c n dst src = + List.flatten + (rmap (iota n) + (fun i -> store_c (dst i) (src i))) + +let store_array_hc n dst src = + List.flatten + (rmap (iota n) + (fun i -> + if (i < n - i) then + store_c (dst i) (src i) + else if (i > n - i) then + [] + else + [store_r (dst i) (Complex.real (src i))])) + + +let store_v_array_c veclen n dst src = + List.flatten + (rmap (iota veclen) + (fun v -> + store_array_c n (dst v) (src v))) + + +let elementwise f n a = array n (fun i -> f (a i)) +let conj_array_c = elementwise Complex.conj +let real_array_c = elementwise Complex.real +let imag_array_c = elementwise Complex.imag + +let elementwise_v f veclen n a = + array veclen (fun v -> + array n (fun i -> f (a v i))) +let conj_v_array_c = elementwise_v Complex.conj +let real_v_array_c = elementwise_v Complex.real +let imag_v_array_c = elementwise_v Complex.imag + + +let transpose f i j = f j i +let symmetrize f i j = if i <= j then f i j else f j i + +(* utilities for command-line parsing *) +let standard_arg_parse_fail _ = failwith "too many arguments" + +let dump_dag alist = + let fnam = !Magic.dag_dump_file in + if (String.length fnam > 0) then + let ochan = open_out fnam in + begin + To_alist.dump (output_string ochan) alist; + close_out ochan; + end + +let dump_alist alist = + let fnam = !Magic.alist_dump_file in + if (String.length fnam > 0) then + let ochan = open_out fnam in + begin + Expr.dump (output_string ochan) alist; + close_out ochan; + end + +let dump_asched asched = + let fnam = !Magic.asched_dump_file in + if (String.length fnam > 0) then + let ochan = open_out fnam in + begin + Annotate.dump (output_string ochan) asched; + close_out ochan; + end + +(* utilities for optimization *) +let standard_scheduler dag = + let optim = Algsimp.algsimp dag in + let alist = To_alist.to_assignments optim in + let _ = dump_alist alist in + let _ = dump_dag alist in + if !Magic.precompute_twiddles then + Schedule.isolate_precomputations_and_schedule alist + else + Schedule.schedule alist + +let standard_optimizer dag = + let sched = standard_scheduler dag in + let annot = Annotate.annotate [] sched in + let _ = dump_asched annot in + annot + +let size = ref None +let sign = ref (-1) + +let speclist = [ + "-n", Arg.Int(fun i -> size := Some i), " generate a codelet of size "; + "-sign", + Arg.Int(fun i -> + if (i > 0) then + sign := 1 + else + sign := (-1)), + " sign of transform"; +] + +let check_size () = + match !size with + | Some i -> i + | None -> failwith "must specify -n" + +let expand_name name = if name = "" then "noname" else name + +let declare_register_fcn name = + if name = "" then + "void NAME(planner *p)\n" + else + "void " ^ (choose_simd "X" "XSIMD") ^ + "(codelet_" ^ name ^ ")(planner *p)\n" + +let stringify name = + if name = "" then "STRINGIZE(NAME)" else + choose_simd ("\"" ^ name ^ "\"") + ("XSIMD_STRING(\"" ^ name ^ "\")") + +let parse user_speclist usage = + Arg.parse + (user_speclist @ speclist @ Magic.speclist @ Simdmagic.speclist) + standard_arg_parse_fail + usage + +let rec list_to_c = function + [] -> "" + | [a] -> (string_of_int a) + | a :: b -> (string_of_int a) ^ ", " ^ (list_to_c b) + +let rec list_to_comma = function + | [a; b] -> C.Comma (a, b) + | a :: b -> C.Comma (a, list_to_comma b) + | _ -> failwith "list_to_comma" + + +type stride = Stride_variable | Fixed_int of int | Fixed_string of string + +let either_stride a b = + match a with + Fixed_int x -> C.SInteger x + | Fixed_string x -> C.SConst x + | _ -> b + +let stride_fixed = function + Stride_variable -> false + | _ -> true + +let arg_to_stride s = + try + Fixed_int (int_of_string s) + with Failure "int_of_string" -> + Fixed_string s + +let stride_to_solverparm = function + Stride_variable -> "0" + | Fixed_int x -> string_of_int x + | Fixed_string x -> x + +let stride_to_string s = function + Stride_variable -> s + | Fixed_int x -> string_of_int x + | Fixed_string x -> x + +(* output the command line *) +let cmdline () = + List.fold_right (fun a b -> a ^ " " ^ b) (Array.to_list Sys.argv) "" + +let unparse tree = + "/* Generated by: " ^ (cmdline ()) ^ "*/\n\n" ^ + (C.print_cost tree) ^ + (if String.length !Magic.inklude > 0 + then + (Printf.sprintf "#include \"%s\"\n\n" !Magic.inklude) + else "") ^ + (if !Simdmagic.simd_mode then + Simd.unparse_function tree + else + C.unparse_function tree) + +let finalize_fcn ast = + let mergedecls = function + C.Block (d1, [C.Block (d2, s)]) -> C.Block (d1 @ d2, s) + | x -> x + and extract_constants = + if !Simdmagic.simd_mode then + Simd.extract_constants + else + C.extract_constants + + in mergedecls (C.Block (extract_constants ast, [ast; C.Simd_leavefun])) + +let twinstr_to_string vl x = + if !Simdmagic.simd_mode then + Twiddle.twinstr_to_simd_string vl x + else + Twiddle.twinstr_to_c_string x + +let make_volatile_stride n x = + C.CCall ("MAKE_VOLATILE_STRIDE", C.Comma((C.Integer n), x)) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/littlesimp.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/littlesimp.ml new file mode 100644 index 000000000..d385d0fac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/littlesimp.ml @@ -0,0 +1,71 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* + * The LittleSimplifier module implements a subset of the simplifications + * of the AlgSimp module. These simplifications can be executed + * quickly here, while they would take a long time using the heavy + * machinery of AlgSimp. + * + * For example, 0 * x is simplified to 0 tout court by the LittleSimplifier. + * On the other hand, AlgSimp would first simplify x, generating lots + * of common subexpressions, storing them in a table etc, just to + * discard all the work later. Similarly, the LittleSimplifier + * reduces the constant FFT in Rader's algorithm to a constant sequence. + *) + +open Expr + +let rec makeNum = function + | n -> Num n + +and makeUminus = function + | Uminus a -> a + | Num a -> makeNum (Number.negate a) + | a -> Uminus a + +and makeTimes = function + | (Num a, Num b) -> makeNum (Number.mul a b) + | (Num a, Times (Num b, c)) -> makeTimes (makeNum (Number.mul a b), c) + | (Num a, b) when Number.is_zero a -> makeNum (Number.zero) + | (Num a, b) when Number.is_one a -> b + | (Num a, b) when Number.is_mone a -> makeUminus b + | (Num a, Uminus b) -> Times (makeUminus (Num a), b) + | (a, (Num b as b')) -> makeTimes (b', a) + | (a, b) -> Times (a, b) + +and makePlus l = + let rec reduceSum x = match x with + [] -> [] + | [Num a] -> if Number.is_zero a then [] else x + | (Num a) :: (Num b) :: c -> + reduceSum ((makeNum (Number.add a b)) :: c) + | ((Num _) as a') :: b :: c -> b :: reduceSum (a' :: c) + | a :: s -> a :: reduceSum s + + in match reduceSum l with + [] -> makeNum (Number.zero) + | [a] -> a + | [a; b] when a == b -> makeTimes (Num Number.two, a) + | [Times (Num a, b); Times (Num c, d)] when b == d -> + makeTimes (makePlus [Num a; Num c], b) + | a -> Plus a + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/littlesimp.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/littlesimp.mli new file mode 100644 index 000000000..4179cbd05 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/littlesimp.mli @@ -0,0 +1,25 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val makeNum : Number.number -> Expr.expr +val makeUminus : Expr.expr -> Expr.expr +val makeTimes : Expr.expr * Expr.expr -> Expr.expr +val makePlus : Expr.expr list -> Expr.expr diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/magic.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/magic.ml new file mode 100644 index 000000000..86394da28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/magic.ml @@ -0,0 +1,161 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* magic parameters *) +let verbose = ref false +let vneg = ref false +let karatsuba_min = ref 15 +let karatsuba_variant = ref 2 +let circular_min = ref 64 +let rader_min = ref 13 +let rader_list = ref [5] +let alternate_convolution = ref 17 +let threemult = ref false +let inline_single = ref true +let inline_loads = ref false +let inline_loads_constants = ref false +let inline_constants = ref true +let trivial_stores = ref false +let locations_are_special = ref false +let strength_reduce_mul = ref false +let number_of_variables = ref 4 +let codelet_name = ref "unnamed" +let randomized_cse = ref true +let dif_split_radix = ref false +let enable_fma = ref false +let deep_collect_depth = ref 1 +let schedule_type = ref 0 +let compact = ref false +let dag_dump_file = ref "" +let alist_dump_file = ref "" +let asched_dump_file = ref "" +let lisp_syntax = ref false +let network_transposition = ref true +let inklude = ref "" +let generic_arith = ref false +let reorder_insns = ref false +let reorder_loads = ref false +let reorder_stores = ref false +let precompute_twiddles = ref false +let newsplit = ref false +let standalone = ref false +let pipeline_latency = ref 0 +let schedule_for_pipeline = ref false +let generate_bytw = ref true + +(* command-line parser for magic parameters *) +let undocumented = " Undocumented voodoo parameter" + +let set_bool var = Arg.Unit (fun () -> var := true) +let unset_bool var = Arg.Unit (fun () -> var := false) +let set_int var = Arg.Int(fun i -> var := i) +let set_string var = Arg.String(fun s -> var := s) + +let speclist = [ + "-name", set_string codelet_name, " set codelet name"; + "-standalone", set_bool standalone, " standalone codelet (no desc)"; + "-include", set_string inklude, undocumented; + + "-verbose", set_bool verbose, " Enable verbose logging messages to stderr"; + + "-rader-min", set_int rader_min, + " : Use Rader's algorithm for prime sizes >= "; + + "-threemult", set_bool threemult, + " Use 3-multiply complex multiplications"; + + "-karatsuba-min", set_int karatsuba_min, undocumented; + "-karatsuba-variant", set_int karatsuba_variant, undocumented; + "-circular-min", set_int circular_min, undocumented; + + "-compact", set_bool compact, + " Mangle variable names to reduce size of source code"; + "-no-compact", unset_bool compact, + " Disable -compact"; + + "-dump-dag", set_string dag_dump_file, undocumented; + "-dump-alist", set_string alist_dump_file, undocumented; + "-dump-asched", set_string asched_dump_file, undocumented; + "-lisp-syntax", set_bool lisp_syntax, undocumented; + + "-alternate-convolution", set_int alternate_convolution, undocumented; + "-deep-collect-depth", set_int deep_collect_depth, undocumented; + "-schedule-type", set_int schedule_type, undocumented; + "-pipeline-latency", set_int pipeline_latency, undocumented; + "-schedule-for-pipeline", set_bool schedule_for_pipeline, undocumented; + + "-dif-split-radix", set_bool dif_split_radix, undocumented; + "-dit-split-radix", unset_bool dif_split_radix, undocumented; + + "-generic-arith", set_bool generic_arith, undocumented; + "-no-generic-arith", unset_bool generic_arith, undocumented; + + "-precompute-twiddles", set_bool precompute_twiddles, undocumented; + "-no-precompute-twiddles", unset_bool precompute_twiddles, undocumented; + + "-inline-single", set_bool inline_single, undocumented; + "-no-inline-single", unset_bool inline_single, undocumented; + + "-inline-loads", set_bool inline_loads, undocumented; + "-no-inline-loads", unset_bool inline_loads, undocumented; + + "-inline-loads-constants", set_bool inline_loads_constants, undocumented; + "-no-inline-loads-constants", + unset_bool inline_loads_constants, undocumented; + + "-inline-constants", set_bool inline_constants, undocumented; + "-no-inline-constants", unset_bool inline_constants, undocumented; + + "-trivial-stores", set_bool trivial_stores, undocumented; + "-no-trivial-stores", unset_bool trivial_stores, undocumented; + + "-locations-are-special", set_bool locations_are_special, undocumented; + "-no-locations-are-special", unset_bool locations_are_special, undocumented; + + "-randomized-cse", set_bool randomized_cse, undocumented; + "-no-randomized-cse", unset_bool randomized_cse, undocumented; + + "-network-transposition", set_bool network_transposition, undocumented; + "-no-network-transposition", unset_bool network_transposition, undocumented; + + "-reorder-insns", set_bool reorder_insns, undocumented; + "-no-reorder-insns", unset_bool reorder_insns, undocumented; + "-reorder-loads", set_bool reorder_loads, undocumented; + "-no-reorder-loads", unset_bool reorder_loads, undocumented; + "-reorder-stores", set_bool reorder_stores, undocumented; + "-no-reorder-stores", unset_bool reorder_stores, undocumented; + + "-newsplit", set_bool newsplit, undocumented; + + "-vneg", set_bool vneg, undocumented; + "-fma", set_bool enable_fma, undocumented; + "-no-fma", unset_bool enable_fma, undocumented; + + "-variables", set_int number_of_variables, undocumented; + + "-strength-reduce-mul", set_bool strength_reduce_mul, undocumented; + "-no-strength-reduce-mul", unset_bool strength_reduce_mul, undocumented; + + "-generate-bytw", set_bool generate_bytw, undocumented; + "-no-generate-bytw", unset_bool generate_bytw, undocumented; +] + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/monads.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/monads.ml new file mode 100644 index 000000000..1322729ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/monads.ml @@ -0,0 +1,75 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(************************************************************* + * Monads + *************************************************************) + +(* + * Phil Wadler has many well written papers about monads. See + * http://cm.bell-labs.com/cm/cs/who/wadler/ + *) +(* vanilla state monad *) +module StateMonad = struct + let returnM x = fun s -> (x, s) + + let (>>=) = fun m k -> + fun s -> + let (a', s') = m s + in let (a'', s'') = k a' s' + in (a'', s'') + + let (>>) = fun m k -> + m >>= fun _ -> k + + let rec mapM f = function + [] -> returnM [] + | a :: b -> + f a >>= fun a' -> + mapM f b >>= fun b' -> + returnM (a' :: b') + + let runM m x initial_state = + let (a, _) = m x initial_state + in a + + let fetchState = + fun s -> s, s + + let storeState newState = + fun _ -> (), newState +end + +(* monad with built-in memoizing capabilities *) +module MemoMonad = + struct + open StateMonad + + let memoizing lookupM insertM f k = + lookupM k >>= fun vMaybe -> + match vMaybe with + Some value -> returnM value + | None -> + f k >>= fun value -> + insertM k value >> returnM value + + let runM initial_state m x = StateMonad.runM m x initial_state +end diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/number.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/number.ml new file mode 100644 index 000000000..1762ca148 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/number.ml @@ -0,0 +1,164 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* The generator keeps track of numeric constants in symbolic + expressions using the abstract number type, defined in this file. + + Our implementation of the number type uses arbitrary-precision + arithmetic from the built-in Num package in order to maintain an + accurate representation of constants. This allows us to output + constants with many decimal places in the generated C code, + ensuring that we will take advantage of the full precision + available on current and future machines. + + Note that we have to write our own routine to compute roots of + unity, since the Num package only supplies simple arithmetic. The + arbitrary-precision operations in Num look like the normal + operations except that they have an appended slash (e.g. +/ -/ */ + // etcetera). *) + +open Num + +type number = N of num + +let makeNum n = N n + +(* decimal digits of precision to maintain internally, and to print out: *) +let precision = 50 +let print_precision = 45 + +let inveps = (Int 10) **/ (Int precision) +let epsilon = (Int 1) // inveps + +let pinveps = (Int 10) **/ (Int print_precision) +let pepsilon = (Int 1) // pinveps + +let round x = epsilon */ (round_num (x */ inveps)) + +let of_int n = N (Int n) +let zero = of_int 0 +let one = of_int 1 +let two = of_int 2 +let mone = of_int (-1) + +(* comparison predicate for real numbers *) +let equal (N x) (N y) = (* use both relative and absolute error *) + let absdiff = abs_num (x -/ y) in + absdiff <=/ pepsilon || + absdiff <=/ pepsilon */ (abs_num x +/ abs_num y) + +let is_zero = equal zero +let is_one = equal one +let is_mone = equal mone +let is_two = equal two + + +(* Note that, in the following computations, it is important to round + to precision epsilon after each operation. Otherwise, since the + Num package uses exact rational arithmetic, the number of digits + quickly blows up. *) +let mul (N a) (N b) = makeNum (round (a */ b)) +let div (N a) (N b) = makeNum (round (a // b)) +let add (N a) (N b) = makeNum (round (a +/ b)) +let sub (N a) (N b) = makeNum (round (a -/ b)) + +let negative (N a) = (a = 1.0) then (f' -. (float (truncate f'))) else f' + in let q = string_of_int (truncate(f2 *. 1.0E9)) + in let r = "0000000000" ^ q + in let l = String.length r + in let prefix = if (f < 0.0) then "KN" else "KP" in + if (f' >= 1.0) then + (prefix ^ (string_of_int (truncate f')) ^ "_" ^ + (String.sub r (l - 9) 9)) + else + (prefix ^ (String.sub r (l - 9) 9)) + +let to_string (N n) = approx_num_fix print_precision n + +let to_float (N n) = float_of_num n + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/number.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/number.mli new file mode 100644 index 000000000..aae93dd0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/number.mli @@ -0,0 +1,49 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type number + +val equal : number -> number -> bool +val of_int : int -> number +val zero : number +val one : number +val two : number +val mone : number +val is_zero : number -> bool +val is_one : number -> bool +val is_mone : number -> bool +val is_two : number -> bool +val mul : number -> number -> number +val div : number -> number -> number +val add : number -> number -> number +val sub : number -> number -> number +val negative : number -> bool +val greater : number -> number -> bool +val negate : number -> number +val sqrt : number -> number + +(* cexp n i = (cos (2 * pi * i / n), sin (2 * pi * i / n)) *) +val cexp : int -> int -> (number * number) + +val to_konst : number -> string +val to_string : number -> string +val to_float : number -> float + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/oracle.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/oracle.ml new file mode 100644 index 000000000..9646e5f39 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/oracle.ml @@ -0,0 +1,144 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* + * the oracle decrees whether the sign of an expression should + * be changed. + * + * Say the expression (A - B) appears somewhere. Elsewhere in the + * expression dag the expression (B - A) may appear. + * The oracle determines which of the two forms is canonical. + * + * Algorithm: evaluate the expression at a random input, and + * keep the expression with the positive sign. + *) + +let make_memoizer hash equal = + let table = ref Assoctable.empty + in + (fun f k -> + match Assoctable.lookup hash equal k !table with + Some value -> value + | None -> + let value = f k in + begin + table := Assoctable.insert hash k value !table; + value + end) + +let almost_equal x y = + let epsilon = 1.0E-8 in + (abs_float (x -. y) < epsilon) || + (abs_float (x -. y) < epsilon *. (abs_float x +. abs_float y)) + +let absid = make_memoizer + (fun x -> Expr.hash_float (abs_float x)) + (fun a b -> almost_equal a b || almost_equal (-. a) b) + (fun x -> x) + +let make_random_oracle () = make_memoizer + Variable.hash + Variable.same + (fun _ -> (float (Random.bits())) /. 1073741824.0) + +let the_random_oracle = make_random_oracle () + +let sum_list l = List.fold_right (+.) l 0.0 + +let eval_aux random_oracle = + let memoizing = make_memoizer Expr.hash (==) in + let rec eval x = + memoizing + (function + | Expr.Num x -> Number.to_float x + | Expr.NaN x -> Expr.transcendent_to_float x + | Expr.Load v -> random_oracle v + | Expr.Store (v, x) -> eval x + | Expr.Plus l -> sum_list (List.map eval l) + | Expr.Times (a, b) -> (eval a) *. (eval b) + | Expr.CTimes (a, b) -> + 1.098612288668109691395245236 +. + 1.609437912434100374600759333 *. (eval a) *. (eval b) + | Expr.CTimesJ (a, b) -> + 0.9102392266268373936142401657 +. + 0.6213349345596118107071993881 *. (eval a) *. (eval b) + | Expr.Uminus x -> -. (eval x)) + x + in eval + +let eval = eval_aux the_random_oracle + +let should_flip_sign node = + let v = eval node in + let v' = absid v in + not (almost_equal v v') + +(* + * determine with high probability if two expressions are equal. + * + * The test is randomized: if the two expressions have the + * same value for NTESTS random inputs, then they are proclaimed + * equal. (Note that two distinct linear functions L1(x0, x1, ..., xn) + * and L2(x0, x1, ..., xn) have the same value with probability + * 0 for random x's, and thus this test is way more paranoid than + * necessary.) + *) +let likely_equal a b = + let tolerance = 1.0e-8 + and ntests = 20 + in + let rec loop n = + if n = 0 then + true + else + let r = make_random_oracle () in + let va = eval_aux r a + and vb = eval_aux r b + in + if (abs_float (va -. vb)) > + tolerance *. (abs_float va +. abs_float vb +. 0.0001) + then + false + else + loop (n - 1) + in + match (a, b) with + + (* + * Because of the way eval is constructed, we have + * eval (Store (v, x)) == eval x + * However, we never consider the two expressions equal + *) + | (Expr.Store _, _) -> false + | (_, Expr.Store _) -> false + + (* + * Expressions of the form ``Uminus (Store _)'' + * are artifacts of algsimp + *) + | ((Expr.Uminus (Expr.Store _)), _) -> false + | (_, Expr.Uminus (Expr.Store _)) -> false + + | _ -> loop ntests + +let hash x = + let f = eval x in + truncate (f *. 65536.0) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/oracle.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/oracle.mli new file mode 100644 index 000000000..1bd4c11a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/oracle.mli @@ -0,0 +1,24 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val should_flip_sign : Expr.expr -> bool +val likely_equal : Expr.expr -> Expr.expr -> bool +val hash : Expr.expr -> int diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/schedule.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/schedule.ml new file mode 100644 index 000000000..3137a056a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/schedule.ml @@ -0,0 +1,236 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* This file contains the instruction scheduler, which finds an + efficient ordering for a given list of instructions. + + The scheduler analyzes the DAG (directed acyclic graph) formed by + the instruction dependencies, and recursively partitions it. The + resulting schedule data structure expresses a "good" ordering + and structure for the computation. + + The scheduler makes use of utilties in Dag and other packages to + manipulate the Dag and the instruction list. *) + +open Dag +(************************************************* + * Dag scheduler + *************************************************) +let to_assignment node = (Expr.Assign (node.assigned, node.expression)) +let makedag l = Dag.makedag + (List.map (function Expr.Assign (v, x) -> (v, x)) l) + +let return x = x +let has_color c n = (n.color = c) +let set_color c n = (n.color <- c) +let has_either_color c1 c2 n = (n.color = c1 || n.color = c2) + +let infinity = 100000 + +let cc dag inputs = + begin + Dag.for_all dag (fun node -> + node.label <- infinity); + + (match inputs with + a :: _ -> bfs dag a 0 + | _ -> failwith "connected"); + + return + ((List.map to_assignment (List.filter (fun n -> n.label < infinity) + (Dag.to_list dag))), + (List.map to_assignment (List.filter (fun n -> n.label == infinity) + (Dag.to_list dag)))) + end + +let rec connected_components alist = + let dag = makedag alist in + let inputs = + List.filter (fun node -> Util.null node.predecessors) + (Dag.to_list dag) in + match cc dag inputs with + (a, []) -> [a] + | (a, b) -> a :: connected_components b + +let single_load node = + match (node.input_variables, node.predecessors) with + ([x], []) -> + Variable.is_constant x || + (!Magic.locations_are_special && Variable.is_locative x) + | _ -> false + +let loads_locative node = + match (node.input_variables, node.predecessors) with + | ([x], []) -> Variable.is_locative x + | _ -> false + +let partition alist = + let dag = makedag alist in + let dag' = Dag.to_list dag in + let inputs = + List.filter (fun node -> Util.null node.predecessors) dag' + and outputs = + List.filter (fun node -> Util.null node.successors) dag' + and special_inputs = List.filter single_load dag' in + begin + + let c = match !Magic.schedule_type with + | 1 -> RED; (* all nodes in the input partition *) + | -1 -> BLUE; (* all nodes in the output partition *) + | _ -> BLACK; (* node color determined by bisection algorithm *) + in Dag.for_all dag (fun node -> node.color <- c); + + Util.for_list inputs (set_color RED); + + (* + The special inputs are those input nodes that load a single + location or twiddle factor. Special inputs can end up either + in the blue or in the red part. These inputs are special + because they inherit a color from their neighbors: If a red + node needs a special input, the special input becomes red, but + if all successors of a special input are blue, the special + input becomes blue. Outputs are always blue, whether they be + special or not. + + Because of the processing of special inputs, however, the final + partition might end up being composed only of blue nodes (which + is incorrect). In this case we manually reset all inputs + (whether special or not) to be red. + *) + + Util.for_list special_inputs (set_color YELLOW); + + Util.for_list outputs (set_color BLUE); + + let rec loopi donep = + match (List.filter + (fun node -> (has_color BLACK node) && + List.for_all (has_either_color RED YELLOW) node.predecessors) + dag') with + [] -> if (donep) then () else loopo true + | i -> + begin + Util.for_list i (fun node -> + begin + set_color RED node; + Util.for_list node.predecessors (set_color RED); + end); + loopo false; + end + + and loopo donep = + match (List.filter + (fun node -> (has_either_color BLACK YELLOW node) && + List.for_all (has_color BLUE) node.successors) + dag') with + [] -> if (donep) then () else loopi true + | o -> + begin + Util.for_list o (set_color BLUE); + loopi false; + end + + in loopi false; + + (* fix the partition if it is incorrect *) + if not (List.exists (has_color RED) dag') then + Util.for_list inputs (set_color RED); + + return + ((List.map to_assignment (List.filter (has_color RED) dag')), + (List.map to_assignment (List.filter (has_color BLUE) dag'))) + end + +type schedule = + Done + | Instr of Expr.assignment + | Seq of (schedule * schedule) + | Par of schedule list + + + +(* produce a sequential schedule determined by the user *) +let rec sequentially = function + [] -> Done + | a :: b -> Seq (Instr a, sequentially b) + +let schedule = + let rec schedule_alist = function + | [] -> Done + | [a] -> Instr a + | alist -> match connected_components alist with + | ([a]) -> schedule_connected a + | l -> Par (List.map schedule_alist l) + + and schedule_connected alist = + match partition alist with + | (a, b) -> Seq (schedule_alist a, schedule_alist b) + + in fun x -> + let () = Util.info "begin schedule" in + let res = schedule_alist x in + let () = Util.info "end schedule" in + res + + +(* partition a dag into two parts: + + 1) the set of loads from locatives and their successors, + 2) all other nodes + + This step separates the ``body'' of the dag, which computes the + actual fft, from the ``precomputations'' part, which computes e.g. + twiddle factors. +*) +let partition_precomputations alist = + let dag = makedag alist in + let dag' = Dag.to_list dag in + let loads = List.filter loads_locative dag' in + begin + + Dag.for_all dag (set_color BLUE); + Util.for_list loads (set_color RED); + + let rec loop () = + match (List.filter + (fun node -> (has_color RED node) && + List.exists (has_color BLUE) node.successors) + dag') with + [] -> () + | i -> + begin + Util.for_list i + (fun node -> + Util.for_list node.successors (set_color RED)); + loop () + end + + in loop (); + + return + ((List.map to_assignment (List.filter (has_color BLUE) dag')), + (List.map to_assignment (List.filter (has_color RED) dag'))) + end + +let isolate_precomputations_and_schedule alist = + let (a, b) = partition_precomputations alist in + Seq (schedule a, schedule b) + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/schedule.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/schedule.mli new file mode 100644 index 000000000..f30333a26 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/schedule.mli @@ -0,0 +1,30 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type schedule = + | Done + | Instr of Expr.assignment + | Seq of (schedule * schedule) + | Par of schedule list + +val schedule : Expr.assignment list -> schedule +val sequentially : Expr.assignment list -> schedule +val isolate_precomputations_and_schedule : Expr.assignment list -> schedule diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simd.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simd.ml new file mode 100644 index 000000000..ae0c5bb50 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simd.ml @@ -0,0 +1,215 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +open Expr +open List +open Printf +open Variable +open Annotate +open Simdmagic +open C + +let realtype = "V" +let realtypep = realtype ^ " *" +let constrealtype = "const " ^ realtype +let constrealtypep = constrealtype ^ " *" +let alignment_mod = 2 + +(* + * SIMD C AST unparser + *) +let foldr_string_concat l = fold_right (^) l "" + +let rec unparse_by_twiddle nam tw src = + sprintf "%s(&(%s),%s)" nam (Variable.unparse tw) (unparse_expr src) + +and unparse_store dst = function + | Times (NaN MULTI_A, x) -> + sprintf "STM%d(&(%s),%s,%s,&(%s));\n" + !Simdmagic.store_multiple + (Variable.unparse dst) (unparse_expr x) + (Variable.vstride_of_locative dst) + (Variable.unparse_for_alignment alignment_mod dst) + | Times (NaN MULTI_B, Plus stuff) -> + sprintf "STN%d(&(%s)%s,%s);\n" + !Simdmagic.store_multiple + (Variable.unparse dst) + (List.fold_right (fun x a -> "," ^ (unparse_expr x) ^ a) stuff "") + (Variable.vstride_of_locative dst) + | src_expr -> + sprintf "ST(&(%s),%s,%s,&(%s));\n" + (Variable.unparse dst) (unparse_expr src_expr) + (Variable.vstride_of_locative dst) + (Variable.unparse_for_alignment alignment_mod dst) + +and unparse_expr = + let rec unparse_plus = function + | [a] -> unparse_expr a + + | (Uminus (Times (NaN I, b))) :: c :: d -> op2 "VFNMSI" [b] (c :: d) + | c :: (Uminus (Times (NaN I, b))) :: d -> op2 "VFNMSI" [b] (c :: d) + | (Uminus (Times (NaN CONJ, b))) :: c :: d -> op2 "VFNMSCONJ" [b] (c :: d) + | c :: (Uminus (Times (NaN CONJ, b))) :: d -> op2 "VFNMSCONJ" [b] (c :: d) + | (Times (NaN I, b)) :: c :: d -> op2 "VFMAI" [b] (c :: d) + | c :: (Times (NaN I, b)) :: d -> op2 "VFMAI" [b] (c :: d) + | (Times (NaN CONJ, b)) :: (Uminus c) :: d -> op2 "VFMSCONJ" [b] (c :: d) + | (Uminus c) :: (Times (NaN CONJ, b)) :: d -> op2 "VFMSCONJ" [b] (c :: d) + | (Times (NaN CONJ, b)) :: c :: d -> op2 "VFMACONJ" [b] (c :: d) + | c :: (Times (NaN CONJ, b)) :: d -> op2 "VFMACONJ" [b] (c :: d) + | (Times (NaN _, b)) :: (Uminus c) :: d -> failwith "VFMS NaN" + | (Uminus c) :: (Times (NaN _, b)) :: d -> failwith "VFMS NaN" + + | (Uminus (Times (a, b))) :: c :: d -> op3 "VFNMS" a b (c :: d) + | c :: (Uminus (Times (a, b))) :: d -> op3 "VFNMS" a b (c :: d) + | (Times (a, b)) :: (Uminus c) :: d -> op3 "VFMS" a b (c :: negate d) + | (Uminus c) :: (Times (a, b)) :: d -> op3 "VFMS" a b (c :: negate d) + | (Times (a, b)) :: c :: d -> op3 "VFMA" a b (c :: d) + | c :: (Times (a, b)) :: d -> op3 "VFMA" a b (c :: d) + + | (Uminus a :: b) -> op2 "VSUB" b [a] + | (b :: Uminus a :: c) -> op2 "VSUB" (b :: c) [a] + | (a :: b) -> op2 "VADD" [a] b + | [] -> failwith "unparse_plus" + and op3 nam a b c = + nam ^ "(" ^ (unparse_expr a) ^ ", " ^ (unparse_expr b) ^ ", " ^ + (unparse_plus c) ^ ")" + and op2 nam a b = + nam ^ "(" ^ (unparse_plus a) ^ ", " ^ (unparse_plus b) ^ ")" + and op1 nam a = + nam ^ "(" ^ (unparse_expr a) ^ ")" + and negate = function + | [] -> [] + | (Uminus x) :: y -> x :: negate y + | x :: y -> (Uminus x) :: negate y + + in function + | CTimes(Load tw, src) + when Variable.is_constant tw && !Magic.generate_bytw -> + unparse_by_twiddle "BYTW" tw src + | CTimesJ(Load tw, src) + when Variable.is_constant tw && !Magic.generate_bytw -> + unparse_by_twiddle "BYTWJ" tw src + | Load v when is_locative(v) -> + sprintf "LD(&(%s), %s, &(%s))" (Variable.unparse v) + (Variable.vstride_of_locative v) + (Variable.unparse_for_alignment alignment_mod v) + | Load v when is_constant(v) -> sprintf "LDW(&(%s))" (Variable.unparse v) + | Load v -> Variable.unparse v + | Num n -> sprintf "LDK(%s)" (Number.to_konst n) + | NaN n -> failwith "NaN in unparse_expr" + | Plus [] -> "0.0 /* bug */" + | Plus [a] -> " /* bug */ " ^ (unparse_expr a) + | Plus a -> unparse_plus a + | Times(NaN I,b) -> op1 "VBYI" b + | Times(NaN CONJ,b) -> op1 "VCONJ" b + | Times(a,b) -> + sprintf "VMUL(%s, %s)" (unparse_expr a) (unparse_expr b) + | CTimes(a,Times(NaN I, b)) -> + sprintf "VZMULI(%s, %s)" (unparse_expr a) (unparse_expr b) + | CTimes(a,b) -> + sprintf "VZMUL(%s, %s)" (unparse_expr a) (unparse_expr b) + | CTimesJ(a,Times(NaN I, b)) -> + sprintf "VZMULIJ(%s, %s)" (unparse_expr a) (unparse_expr b) + | CTimesJ(a,b) -> + sprintf "VZMULJ(%s, %s)" (unparse_expr a) (unparse_expr b) + | Uminus a when !Magic.vneg -> op1 "VNEG" a + | Uminus a -> failwith "SIMD Uminus" + | _ -> failwith "unparse_expr" + +and unparse_decl x = C.unparse_decl x + +and unparse_ast ast = + let rec unparse_assignment = function + | Assign (v, x) when Variable.is_locative v -> + unparse_store v x + | Assign (v, x) -> + (Variable.unparse v) ^ " = " ^ (unparse_expr x) ^ ";\n" + + and unparse_annotated force_bracket = + let rec unparse_code = function + | ADone -> "" + | AInstr i -> unparse_assignment i + | ASeq (a, b) -> + (unparse_annotated false a) ^ (unparse_annotated false b) + and declare_variables l = + let rec uvar = function + [] -> failwith "uvar" + | [v] -> (Variable.unparse v) ^ ";\n" + | a :: b -> (Variable.unparse a) ^ ", " ^ (uvar b) + in let rec vvar l = + let s = if !Magic.compact then 15 else 1 in + if (List.length l <= s) then + match l with + [] -> "" + | _ -> realtype ^ " " ^ (uvar l) + else + (vvar (Util.take s l)) ^ (vvar (Util.drop s l)) + in vvar (List.filter Variable.is_temporary l) + in function + Annotate (_, _, decl, _, code) -> + if (not force_bracket) && (Util.null decl) then + unparse_code code + else "{\n" ^ + (declare_variables decl) ^ + (unparse_code code) ^ + "}\n" + + in match ast with + | Asch a -> (unparse_annotated true a) + | Return x -> "return " ^ unparse_ast x ^ ";" + | Simd_leavefun -> "VLEAVE();" + | For (a, b, c, d) -> + "for (" ^ + unparse_ast a ^ "; " ^ unparse_ast b ^ "; " ^ unparse_ast c + ^ ")" ^ unparse_ast d + | If (a, d) -> + "if (" ^ + unparse_ast a + ^ ")" ^ unparse_ast d + | Block (d, s) -> + if (s == []) then "" + else + "{\n" ^ + foldr_string_concat (map unparse_decl d) ^ + foldr_string_concat (map unparse_ast s) ^ + "}\n" + | x -> C.unparse_ast x + +and unparse_function = function + Fcn (typ, name, args, body) -> + let rec unparse_args = function + [Decl (a, b)] -> a ^ " " ^ b + | (Decl (a, b)) :: s -> a ^ " " ^ b ^ ", " + ^ unparse_args s + | [] -> "" + | _ -> failwith "unparse_function" + in + (typ ^ " " ^ name ^ "(" ^ unparse_args args ^ ")\n" ^ + unparse_ast body) + +let extract_constants f = + let constlist = flatten (map expr_to_constants (C.ast_to_expr_list f)) + in map + (fun n -> + Tdecl + ("DVK(" ^ (Number.to_konst n) ^ ", " ^ (Number.to_string n) ^ + ");\n")) + (unique_constants constlist) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simd.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simd.mli new file mode 100644 index 000000000..74d9a95e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simd.mli @@ -0,0 +1,28 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val unparse_function : C.c_fcn -> string +val extract_constants : C.c_ast -> C.c_decl list +val realtype : string +val realtypep : string +val constrealtype : string +val constrealtypep : string + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simdmagic.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simdmagic.ml new file mode 100644 index 000000000..600bffabb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/simdmagic.ml @@ -0,0 +1,31 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* SIMD magic parameters *) +let simd_mode = ref false +let store_multiple = ref 1 + +open Magic + +let speclist = [ + "-simd", set_bool simd_mode, undocumented; + "-store-multiple", set_int store_multiple, undocumented; +] diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/to_alist.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/to_alist.ml new file mode 100644 index 000000000..6d02bbe96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/to_alist.ml @@ -0,0 +1,288 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(************************************************************* + * Conversion of the dag to an assignment list + *************************************************************) +(* + * This function is messy. The main problem is that we want to + * inline dag nodes conditionally, depending on how many times they + * are used. The Right Thing to do would be to modify the + * state monad to propagate some of the state backwards, so that + * we know whether a given node will be used again in the future. + * This modification is trivial in a lazy language, but it is + * messy in a strict language like ML. + * + * In this implementation, we just do the obvious thing, i.e., visit + * the dag twice, the first to count the node usages, and the second to + * produce the output. + *) + +open Monads.StateMonad +open Monads.MemoMonad +open Expr + +let fresh = Variable.make_temporary +let node_insert x = Assoctable.insert Expr.hash x +let node_lookup x = Assoctable.lookup Expr.hash (==) x +let empty = Assoctable.empty + +let fetchAl = + fetchState >>= (fun (al, _, _) -> returnM al) + +let storeAl al = + fetchState >>= (fun (_, visited, visited') -> + storeState (al, visited, visited')) + +let fetchVisited = fetchState >>= (fun (_, v, _) -> returnM v) + +let storeVisited visited = + fetchState >>= (fun (al, _, visited') -> + storeState (al, visited, visited')) + +let fetchVisited' = fetchState >>= (fun (_, _, v') -> returnM v') +let storeVisited' visited' = + fetchState >>= (fun (al, visited, _) -> + storeState (al, visited, visited')) +let lookupVisitedM' key = + fetchVisited' >>= fun table -> + returnM (node_lookup key table) +let insertVisitedM' key value = + fetchVisited' >>= fun table -> + storeVisited' (node_insert key value table) + +let counting f x = + fetchVisited >>= (fun v -> + match node_lookup x v with + Some count -> + let incr_cnt = + fetchVisited >>= (fun v' -> + storeVisited (node_insert x (count + 1) v')) + in + begin + match x with + (* Uminus is always inlined. Visit child *) + Uminus y -> f y >> incr_cnt + | _ -> incr_cnt + end + | None -> + f x >> fetchVisited >>= (fun v' -> + storeVisited (node_insert x 1 v'))) + +let with_varM v x = + fetchAl >>= (fun al -> storeAl ((v, x) :: al)) >> returnM (Load v) + +let inlineM = returnM + +let with_tempM x = match x with +| Load v when Variable.is_temporary v -> inlineM x (* avoid trivial moves *) +| _ -> with_varM (fresh ()) x + +(* declare a temporary only if node is used more than once *) +let with_temp_maybeM node x = + fetchVisited >>= (fun v -> + match node_lookup node v with + Some count -> + if (count = 1 && !Magic.inline_single) then + inlineM x + else + with_tempM x + | None -> + failwith "with_temp_maybeM") +type fma = + NO_FMA + | FMA of expr * expr * expr (* FMA (a, b, c) => a + b * c *) + | FMS of expr * expr * expr (* FMS (a, b, c) => -a + b * c *) + | FNMS of expr * expr * expr (* FNMS (a, b, c) => a - b * c *) + +let good_for_fma (a, b) = + let good = function + | NaN I -> true + | NaN CONJ -> true + | NaN _ -> false + | Times(NaN _, _) -> false + | Times(_, NaN _) -> false + | _ -> true + in good a && good b + +let build_fma l = + if (not !Magic.enable_fma) then NO_FMA + else match l with + | [a; Uminus (Times (b, c))] when good_for_fma (b, c) -> FNMS (a, b, c) + | [Uminus (Times (b, c)); a] when good_for_fma (b, c) -> FNMS (a, b, c) + | [Uminus a; Times (b, c)] when good_for_fma (b, c) -> FMS (a, b, c) + | [Times (b, c); Uminus a] when good_for_fma (b, c) -> FMS (a, b, c) + | [a; Times (b, c)] when good_for_fma (b, c) -> FMA (a, b, c) + | [Times (b, c); a] when good_for_fma (b, c) -> FMA (a, b, c) + | _ -> NO_FMA + +let children_fma l = match build_fma l with +| FMA (a, b, c) -> Some (a, b, c) +| FMS (a, b, c) -> Some (a, b, c) +| FNMS (a, b, c) -> Some (a, b, c) +| NO_FMA -> None + + +let rec visitM x = + counting (function + | Load v -> returnM () + | Num a -> returnM () + | NaN a -> returnM () + | Store (v, x) -> visitM x + | Plus a -> (match children_fma a with + None -> mapM visitM a >> returnM () + | Some (a, b, c) -> + (* visit fma's arguments twice to make sure they are not inlined *) + visitM a >> visitM a >> + visitM b >> visitM b >> + visitM c >> visitM c) + | Times (a, b) -> visitM a >> visitM b + | CTimes (a, b) -> visitM a >> visitM b + | CTimesJ (a, b) -> visitM a >> visitM b + | Uminus a -> visitM a) + x + +let visit_rootsM = mapM visitM + + +let rec expr_of_nodeM x = + memoizing lookupVisitedM' insertVisitedM' + (function x -> match x with + | Load v -> + if (Variable.is_temporary v) then + inlineM (Load v) + else if (Variable.is_locative v && !Magic.inline_loads) then + inlineM (Load v) + else if (Variable.is_constant v && !Magic.inline_loads_constants) then + inlineM (Load v) + else + with_tempM (Load v) + | Num a -> + if !Magic.inline_constants then + inlineM (Num a) + else + with_temp_maybeM x (Num a) + | NaN a -> inlineM (NaN a) + | Store (v, x) -> + expr_of_nodeM x >>= + (if !Magic.trivial_stores then with_tempM else inlineM) >>= + with_varM v + + | Plus a -> + begin + match build_fma a with + FMA (a, b, c) -> + expr_of_nodeM a >>= fun a' -> + expr_of_nodeM b >>= fun b' -> + expr_of_nodeM c >>= fun c' -> + with_temp_maybeM x (Plus [a'; Times (b', c')]) + | FMS (a, b, c) -> + expr_of_nodeM a >>= fun a' -> + expr_of_nodeM b >>= fun b' -> + expr_of_nodeM c >>= fun c' -> + with_temp_maybeM x + (Plus [Times (b', c'); Uminus a']) + | FNMS (a, b, c) -> + expr_of_nodeM a >>= fun a' -> + expr_of_nodeM b >>= fun b' -> + expr_of_nodeM c >>= fun c' -> + with_temp_maybeM x + (Plus [a'; Uminus (Times (b', c'))]) + | NO_FMA -> + mapM expr_of_nodeM a >>= fun a' -> + with_temp_maybeM x (Plus a') + end + | CTimes (Load _ as a, b) when !Magic.generate_bytw -> + expr_of_nodeM b >>= fun b' -> + with_tempM (CTimes (a, b')) + | CTimes (a, b) -> + expr_of_nodeM a >>= fun a' -> + expr_of_nodeM b >>= fun b' -> + with_tempM (CTimes (a', b')) + | CTimesJ (Load _ as a, b) when !Magic.generate_bytw -> + expr_of_nodeM b >>= fun b' -> + with_tempM (CTimesJ (a, b')) + | CTimesJ (a, b) -> + expr_of_nodeM a >>= fun a' -> + expr_of_nodeM b >>= fun b' -> + with_tempM (CTimesJ (a', b')) + | Times (a, b) -> + expr_of_nodeM a >>= fun a' -> + expr_of_nodeM b >>= fun b' -> + begin + match a' with + Num a'' when !Magic.strength_reduce_mul && Number.is_two a'' -> + (inlineM b' >>= fun b'' -> + with_temp_maybeM x (Plus [b''; b''])) + | _ -> with_temp_maybeM x (Times (a', b')) + end + | Uminus a -> + expr_of_nodeM a >>= fun a' -> + inlineM (Uminus a')) + x + +let expr_of_rootsM = mapM expr_of_nodeM + +let peek_alistM roots = + visit_rootsM roots >> expr_of_rootsM roots >> fetchAl + +let wrap_assign (a, b) = Expr.Assign (a, b) + +let to_assignments dag = + let () = Util.info "begin to_alist" in + let al = List.rev (runM ([], empty, empty) peek_alistM dag) in + let res = List.map wrap_assign al in + let () = Util.info "end to_alist" in + res + + +(* dump alist in `dot' format *) +let dump print alist = + let vs v = "\"" ^ (Variable.unparse v) ^ "\"" in + begin + print "digraph G {\n"; + print "\tsize=\"6,6\";\n"; + + (* all input nodes have the same rank *) + print "{ rank = same;\n"; + List.iter (fun (Expr.Assign (v, x)) -> + List.iter (fun y -> + if (Variable.is_locative y) then print("\t" ^ (vs y) ^ ";\n")) + (Expr.find_vars x)) + alist; + print "}\n"; + + (* all output nodes have the same rank *) + print "{ rank = same;\n"; + List.iter (fun (Expr.Assign (v, x)) -> + if (Variable.is_locative v) then print("\t" ^ (vs v) ^ ";\n")) + alist; + print "}\n"; + + (* edges *) + List.iter (fun (Expr.Assign (v, x)) -> + List.iter (fun y -> print("\t" ^ (vs y) ^ " -> " ^ (vs v) ^ ";\n")) + (Expr.find_vars x)) + alist; + + print "}\n"; + end + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/to_alist.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/to_alist.mli new file mode 100644 index 000000000..90e222aa9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/to_alist.mli @@ -0,0 +1,24 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val to_assignments : Expr.expr list -> Expr.assignment list +val dump : (string -> unit) -> Expr.assignment list -> unit +val good_for_fma : Expr.expr * Expr.expr -> bool diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/trig.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/trig.ml new file mode 100644 index 000000000..244e82661 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/trig.ml @@ -0,0 +1,152 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* trigonometric transforms *) +open Util + +(* DFT of real input *) +let rdft sign n input = + Fft.dft sign n (Complex.real @@ input) + +(* DFT of hermitian input *) +let hdft sign n input = + Fft.dft sign n (Complex.hermitian n input) + +(* DFT real transform of vectors of two real numbers, + multiplication by (NaN I), and summation *) +let dft_via_rdft sign n input = + let f = rdft sign n input + in fun i -> + Complex.plus + [Complex.real (f i); + Complex.times (Complex.nan Expr.I) (Complex.imag (f i))] + +(* Discrete Hartley Transform *) +let dht sign n input = + let f = Fft.dft sign n (Complex.real @@ input) in + (fun i -> + Complex.plus [Complex.real (f i); Complex.imag (f i)]) + +let trigI n input = + let twon = 2 * n in + let input' = Complex.hermitian twon input + in + Fft.dft 1 twon input' + +let interleave_zero input = fun i -> + if (i mod 2) == 0 + then Complex.zero + else + input ((i - 1) / 2) + +let trigII n input = + let fourn = 4 * n in + let input' = Complex.hermitian fourn (interleave_zero input) + in + Fft.dft 1 fourn input' + +let trigIII n input = + let fourn = 4 * n in + let twon = 2 * n in + let input' = Complex.hermitian fourn + (fun i -> + if (i == 0) then + Complex.real (input 0) + else if (i == twon) then + Complex.uminus (Complex.real (input 0)) + else + Complex.antihermitian twon input i) + in + let dft = Fft.dft 1 fourn input' + in fun k -> dft (2 * k + 1) + +let zero_extend n input = fun i -> + if (i >= 0 && i < n) + then input i + else Complex.zero + +let trigIV n input = + let fourn = 4 * n + and eightn = 8 * n in + let input' = Complex.hermitian eightn + (zero_extend fourn (Complex.antihermitian fourn + (interleave_zero input))) + in + let dft = Fft.dft 1 eightn input' + in fun k -> dft (2 * k + 1) + +let make_dct scale nshift trig = + fun n input -> + trig (n - nshift) (Complex.real @@ (Complex.times scale) @@ + (zero_extend n input)) +(* + * DCT-I: y[k] = sum x[j] cos(pi * j * k / n) + *) +let dctI = make_dct Complex.one 1 trigI + +(* + * DCT-II: y[k] = sum x[j] cos(pi * (j + 1/2) * k / n) + *) +let dctII = make_dct Complex.one 0 trigII + +(* + * DCT-III: y[k] = sum x[j] cos(pi * j * (k + 1/2) / n) + *) +let dctIII = make_dct Complex.half 0 trigIII + +(* + * DCT-IV y[k] = sum x[j] cos(pi * (j + 1/2) * (k + 1/2) / n) + *) +let dctIV = make_dct Complex.half 0 trigIV + +let shift s input = fun i -> input (i - s) + +(* DST-x input := TRIG-x (input / i) *) +let make_dst scale nshift kshift jshift trig = + fun n input -> + Complex.real @@ + (shift (- jshift) + (trig (n + nshift) (Complex.uminus @@ + (Complex.times Complex.i) @@ + (Complex.times scale) @@ + Complex.real @@ + (shift kshift (zero_extend n input))))) + +(* + * DST-I: y[k] = sum x[j] sin(pi * j * k / n) + *) +let dstI = make_dst Complex.one 1 1 1 trigI + +(* + * DST-II: y[k] = sum x[j] sin(pi * (j + 1/2) * k / n) + *) +let dstII = make_dst Complex.one 0 0 1 trigII + +(* + * DST-III: y[k] = sum x[j] sin(pi * j * (k + 1/2) / n) + *) +let dstIII = make_dst Complex.half 0 1 0 trigIII + +(* + * DST-IV y[k] = sum x[j] sin(pi * (j + 1/2) * (k + 1/2) / n) + *) +let dstIV = make_dst Complex.half 0 0 0 trigIV + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/trig.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/trig.mli new file mode 100644 index 000000000..7833ec615 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/trig.mli @@ -0,0 +1,35 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val rdft : int -> int -> Complex.signal -> Complex.signal +val hdft : int -> int -> Complex.signal -> Complex.signal +val dft_via_rdft : int -> int -> Complex.signal -> Complex.signal +val dht : int -> int -> Complex.signal -> Complex.signal + +val dctI : int -> Complex.signal -> Complex.signal +val dctII : int -> Complex.signal -> Complex.signal +val dctIII : int -> Complex.signal -> Complex.signal +val dctIV : int -> Complex.signal -> Complex.signal + +val dstI : int -> Complex.signal -> Complex.signal +val dstII : int -> Complex.signal -> Complex.signal +val dstIII : int -> Complex.signal -> Complex.signal +val dstIV : int -> Complex.signal -> Complex.signal diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/twiddle.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/twiddle.ml new file mode 100644 index 000000000..c3f07fb2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/twiddle.ml @@ -0,0 +1,188 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* policies for loading/computing twiddle factors *) +open Complex +open Util + +type twop = TW_FULL | TW_CEXP | TW_NEXT + +let optostring = function + | TW_CEXP -> "TW_CEXP" + | TW_NEXT -> "TW_NEXT" + | TW_FULL -> "TW_FULL" + +type twinstr = (twop * int * int) + +let rec unroll_twfull l = match l with +| [] -> [] +| (TW_FULL, v, n) :: b -> + (forall [] cons 1 n (fun i -> (TW_CEXP, v, i))) + @ unroll_twfull b +| a :: b -> a :: unroll_twfull b + +let twinstr_to_c_string l = + let one (op, a, b) = Printf.sprintf "{ %s, %d, %d }" (optostring op) a b + in let rec loop first = function + | [] -> "" + | a :: b -> (if first then "\n" else ",\n") ^ (one a) ^ (loop false b) + in "{" ^ (loop true l) ^ "}" + +let twinstr_to_simd_string vl l = + let one sep = function + | (TW_NEXT, 1, 0) -> sep ^ "{TW_NEXT, " ^ vl ^ ", 0}" + | (TW_NEXT, _, _) -> failwith "twinstr_to_simd_string" + | (TW_CEXP, v, b) -> sep ^ (Printf.sprintf "VTW(%d,%d)" v b) + | _ -> failwith "twinstr_to_simd_string" + in let rec loop first = function + | [] -> "" + | a :: b -> (one (if first then "\n" else ",\n") a) ^ (loop false b) + in "{" ^ (loop true (unroll_twfull l)) ^ "}" + +let rec pow m n = + if (n = 0) then 1 + else m * pow m (n - 1) + +let rec is_pow m n = + n = 1 || ((n mod m) = 0 && is_pow m (n / m)) + +let rec log m n = if n = 1 then 0 else 1 + log m (n / m) + +let rec largest_power_smaller_than m i = + if (is_pow m i) then i + else largest_power_smaller_than m (i - 1) + +let rec smallest_power_larger_than m i = + if (is_pow m i) then i + else smallest_power_larger_than m (i + 1) + +let rec_array n f = + let g = ref (fun i -> Complex.zero) in + let a = Array.init n (fun i -> lazy (!g i)) in + let h i = f (fun i -> Lazy.force a.(i)) i in + begin + g := h; + h + end + + +let ctimes use_complex_arith a b = + if use_complex_arith then + Complex.ctimes a b + else + Complex.times a b + +let ctimesj use_complex_arith a b = + if use_complex_arith then + Complex.ctimesj a b + else + Complex.times (Complex.conj a) b + +let make_bytwiddle sign use_complex_arith g f i = + if i = 0 then + f i + else if sign = 1 then + ctimes use_complex_arith (g i) (f i) + else + ctimesj use_complex_arith (g i) (f i) + +(* various policies for computing/loading twiddle factors *) + +let twiddle_policy_load_all v use_complex_arith = + let bytwiddle n sign w f = + make_bytwiddle sign use_complex_arith (fun i -> w (i - 1)) f + and twidlen n = 2 * (n - 1) + and twdesc r = [(TW_FULL, v, r);(TW_NEXT, 1, 0)] + in bytwiddle, twidlen, twdesc + +(* + * if i is a power of two, then load w (log i) + * else let x = largest power of 2 less than i in + * let y = i - x in + * compute w^{x+y} = w^x * w^y + *) +let twiddle_policy_log2 v use_complex_arith = + let bytwiddle n sign w f = + let g = rec_array n (fun self i -> + if i = 0 then Complex.one + else if is_pow 2 i then w (log 2 i) + else let x = largest_power_smaller_than 2 i in + let y = i - x in + ctimes use_complex_arith (self x) (self y)) + in make_bytwiddle sign use_complex_arith g f + and twidlen n = 2 * (log 2 (largest_power_smaller_than 2 (2 * n - 1))) + and twdesc n = + (List.flatten + (List.map + (fun i -> + if i > 0 && is_pow 2 i then + [TW_CEXP, v, i] + else + []) + (iota n))) + @ [(TW_NEXT, 1, 0)] + in bytwiddle, twidlen, twdesc + +let twiddle_policy_log3 v use_complex_arith = + let rec terms_needed i pi s n = + if (s >= n - 1) then i + else terms_needed (i + 1) (3 * pi) (s + pi) n + in + let rec bytwiddle n sign w f = + let nterms = terms_needed 0 1 0 n in + let maxterm = pow 3 (nterms - 1) in + let g = rec_array (3 * n) (fun self i -> + if i = 0 then Complex.one + else if is_pow 3 i then w (log 3 i) + else if i = (n - 1) && maxterm >= n then + w (nterms - 1) + else let x = smallest_power_larger_than 3 i in + if (i + i >= x) then + let x = min x (n - 1) in + ctimesj use_complex_arith (self (x - i)) (self x) + else let x = largest_power_smaller_than 3 i in + ctimes use_complex_arith (self (i - x)) (self x)) + in make_bytwiddle sign use_complex_arith g f + and twidlen n = 2 * (terms_needed 0 1 0 n) + and twdesc n = + (List.map + (fun i -> + let x = min (pow 3 i) (n - 1) in + TW_CEXP, v, x) + (iota ((twidlen n) / 2))) + @ [(TW_NEXT, 1, 0)] + in bytwiddle, twidlen, twdesc + +let current_twiddle_policy = ref twiddle_policy_load_all + +let twiddle_policy use_complex_arith = + !current_twiddle_policy use_complex_arith + +let set_policy x = Arg.Unit (fun () -> current_twiddle_policy := x) +let set_policy_int x = Arg.Int (fun i -> current_twiddle_policy := x i) + +let undocumented = " Undocumented twiddle policy" + +let speclist = [ + "-twiddle-load-all", set_policy twiddle_policy_load_all, undocumented; + "-twiddle-log2", set_policy twiddle_policy_log2, undocumented; + "-twiddle-log3", set_policy twiddle_policy_log3, undocumented; +] diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/twiddle.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/twiddle.mli new file mode 100644 index 000000000..1d08be536 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/twiddle.mli @@ -0,0 +1,32 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val speclist : (string * Arg.spec * string) list + +type twinstr + +val twiddle_policy : + int -> bool -> + (int -> int -> (int -> Complex.expr) -> (int -> Complex.expr) -> + int -> Complex.expr) *(int -> int) * (int -> twinstr list) + +val twinstr_to_c_string : twinstr list -> string +val twinstr_to_simd_string : string -> twinstr list -> string diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/unique.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/unique.ml new file mode 100644 index 000000000..394587f0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/unique.ml @@ -0,0 +1,35 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* repository of unique tokens *) + +type unique = Unique of int + +let make = + let id = ref 0 in + fun () -> begin + id := !id + 1; + Unique !id + end + +let same (Unique a) (Unique b) = + a = b + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/unique.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/unique.mli new file mode 100644 index 000000000..edf46c76c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/unique.mli @@ -0,0 +1,24 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type unique +val make : unit -> unique +val same : unique -> unique -> bool diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/util.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/util.ml new file mode 100644 index 000000000..fd0e51583 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/util.ml @@ -0,0 +1,176 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +(* various utility functions *) +open List +open Unix + +(***************************************** + * Integer operations + *****************************************) +(* fint the inverse of n modulo m *) +let invmod n m = + let rec loop i = + if ((i * n) mod m == 1) then i + else loop (i + 1) + in + loop 1 + +(* Yooklid's algorithm *) +let rec gcd n m = + if (n > m) + then gcd m n + else + let r = m mod n + in + if (r == 0) then n + else gcd r n + +(* reduce the fraction m/n to lowest terms, modulo factors of n/n *) +let lowest_terms n m = + if (m mod n == 0) then + (1,0) + else + let nn = (abs n) in let mm = m * (n / nn) + in let mpos = + if (mm > 0) then (mm mod nn) + else (mm + (1 + (abs mm) / nn) * nn) mod nn + and d = gcd nn (abs mm) + in (nn / d, mpos / d) + +(* find a generator for the multiplicative group mod p + (where p must be prime for a generator to exist!!) *) + +exception No_Generator + +let find_generator p = + let rec period x prod = + if (prod == 1) then 1 + else 1 + (period x (prod * x mod p)) + in let rec findgen x = + if (x == 0) then raise No_Generator + else if ((period x x) == (p - 1)) then x + else findgen ((x + 1) mod p) + in findgen 1 + +(* raise x to a power n modulo p (requires n > 0) (in principle, + negative powers would be fine, provided that x and p are relatively + prime...we don't need this functionality, though) *) + +exception Negative_Power + +let rec pow_mod x n p = + if (n == 0) then 1 + else if (n < 0) then raise Negative_Power + else if (n mod 2 == 0) then pow_mod (x * x mod p) (n / 2) p + else x * (pow_mod x (n - 1) p) mod p + +(****************************************** + * auxiliary functions + ******************************************) +let rec forall id combiner a b f = + if (a >= b) then id + else combiner (f a) (forall id combiner (a + 1) b f) + +let sum_list l = fold_right (+) l 0 +let max_list l = fold_right (max) l (-999999) +let min_list l = fold_right (min) l 999999 +let count pred = fold_left + (fun a elem -> if (pred elem) then 1 + a else a) 0 +let remove elem = List.filter (fun e -> (e != elem)) +let cons a b = a :: b +let null = function + [] -> true + | _ -> false +let for_list l f = List.iter f l +let rmap l f = List.map f l + +(* functional composition *) +let (@@) f g x = f (g x) + +let forall_flat a b = forall [] (@) a b + +let identity x = x + +let rec minimize f = function + [] -> None + | elem :: rest -> + match minimize f rest with + None -> Some elem + | Some x -> if (f x) >= (f elem) then Some elem else Some x + + +let rec find_elem condition = function + [] -> None + | elem :: rest -> + if condition elem then + Some elem + else + find_elem condition rest + + +(* find x, x >= a, such that (p x) is true *) +let rec suchthat a pred = + if (pred a) then a else suchthat (a + 1) pred + +(* print an information message *) +let info string = + if !Magic.verbose then begin + let now = Unix.times () + and pid = Unix.getpid () in + prerr_string ((string_of_int pid) ^ ": " ^ + "at t = " ^ (string_of_float now.tms_utime) ^ " : "); + prerr_string (string ^ "\n"); + flush Pervasives.stderr; + end + +(* iota n produces the list [0; 1; ...; n - 1] *) +let iota n = forall [] cons 0 n identity + +(* interval a b produces the list [a; 1; ...; b - 1] *) +let interval a b = List.map ((+) a) (iota (b - a)) + +(* + * freeze a function, i.e., compute it only once on demand, and + * cache it into an array. + *) +let array n f = + let a = Array.init n (fun i -> lazy (f i)) + in fun i -> Lazy.force a.(i) + + +let rec take n l = + match (n, l) with + (0, _) -> [] + | (n, (a :: b)) -> a :: (take (n - 1) b) + | _ -> failwith "take" + +let rec drop n l = + match (n, l) with + (0, _) -> l + | (n, (_ :: b)) -> drop (n - 1) b + | _ -> failwith "drop" + + +let either a b = + match a with + Some x -> x + | _ -> b diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/util.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/util.mli new file mode 100644 index 000000000..990246769 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/util.mli @@ -0,0 +1,49 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +val invmod : int -> int -> int +val gcd : int -> int -> int +val lowest_terms : int -> int -> int * int +val find_generator : int -> int +val pow_mod : int -> int -> int -> int +val forall : 'a -> ('b -> 'a -> 'a) -> int -> int -> (int -> 'b) -> 'a +val sum_list : int list -> int +val max_list : int list -> int +val min_list : int list -> int +val count : ('a -> bool) -> 'a list -> int +val remove : 'a -> 'a list -> 'a list +val for_list : 'a list -> ('a -> unit) -> unit +val rmap : 'a list -> ('a -> 'b) -> 'b list +val cons : 'a -> 'a list -> 'a list +val null : 'a list -> bool +val (@@) : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b +val forall_flat : int -> int -> (int -> 'a list) -> 'a list +val identity : 'a -> 'a +val minimize : ('a -> 'b) -> 'a list -> 'a option +val find_elem : ('a -> bool) -> 'a list -> 'a option +val suchthat : int -> (int -> bool) -> int +val info : string -> unit +val iota : int -> int list +val interval : int -> int -> int list +val array : int -> (int -> 'a) -> int -> 'a +val take : int -> 'a list -> 'a list +val drop : int -> 'a list -> 'a list +val either : 'a option -> 'a -> 'a diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/variable.ml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/variable.ml new file mode 100644 index 000000000..2d5bef3ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/variable.ml @@ -0,0 +1,108 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type variable = + (* temporary variables generated automatically *) + | Temporary of int + (* memory locations, e.g., array elements *) + | Locative of (Unique.unique * Unique.unique * + (int -> string) * int * string) + (* constant values, e.g., twiddle factors *) + | Constant of (Unique.unique * string) + +let hash v = Hashtbl.hash v + +let same a b = (a == b) + +let is_constant = function + | Constant _ -> true + | _ -> false + +let is_temporary = function + | Temporary _ -> true + | _ -> false + +let is_locative = function + | Locative _ -> true + | _ -> false + +let same_location a b = + match (a, b) with + | (Locative (location_a, _, _, _, _), Locative (location_b, _, _, _, _)) -> + Unique.same location_a location_b + | _ -> false + +let same_class a b = + match (a, b) with + | (Locative (_, class_a, _, _, _), Locative (_, class_b, _, _, _)) -> + Unique.same class_a class_b + | (Constant (class_a, _), Constant (class_b, _)) -> + Unique.same class_a class_b + | _ -> false + +let make_temporary = + let tmp_count = ref 0 + in fun () -> begin + tmp_count := !tmp_count + 1; + Temporary !tmp_count + end + +let make_constant class_token name = + Constant (class_token, name) + +let make_locative location_token class_token name i vs = + Locative (location_token, class_token, name, i, vs) + +let vstride_of_locative = function + | Locative (_, _, _, _, vs) -> vs + | _ -> failwith "vstride_of_locative" + +(* special naming conventions for variables *) +let rec base62_of_int k = + let x = k mod 62 + and y = k / 62 in + let c = + if x < 10 then + Char.chr (x + Char.code '0') + else if x < 36 then + Char.chr (x + Char.code 'a' - 10) + else + Char.chr (x + Char.code 'A' - 36) + in + let s = String.make 1 c in + let r = if y == 0 then "" else base62_of_int y in + r ^ s + +let varname_of_int k = + if !Magic.compact then + base62_of_int k + else + string_of_int k + +let unparse = function + | Temporary k -> "T" ^ (varname_of_int k) + | Constant (_, name) -> name + | Locative (_, _, name, i, _) -> name i + +let unparse_for_alignment m = function + | Locative (_, _, name, i, _) -> name (i mod m) + | _ -> failwith "unparse_for_alignment" + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/variable.mli b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/variable.mli new file mode 100644 index 000000000..6cde501ac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/genfft/variable.mli @@ -0,0 +1,38 @@ +(* + * Copyright (c) 1997-1999 Massachusetts Institute of Technology + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *) + +type variable + +val hash : variable -> int +val same : variable -> variable -> bool +val is_constant : variable -> bool +val is_temporary : variable -> bool +val is_locative : variable -> bool +val same_location : variable -> variable -> bool +val same_class : variable -> variable -> bool +val make_temporary : unit -> variable +val make_constant : Unique.unique -> string -> variable +val make_locative : + Unique.unique -> Unique.unique -> (int -> string) -> + int -> string -> variable +val unparse : variable -> string +val unparse_for_alignment : int -> variable -> string +val vstride_of_locative : variable -> string diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/install-sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/install-sh new file mode 100755 index 000000000..59990a104 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/install-sh @@ -0,0 +1,508 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2014-09-12.12; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # $RANDOM is not portable (e.g. dash); use it when possible to + # lower collision chance + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # As "mkdir -p" follows symlinks and we work in /tmp possibly; so + # create the $tmpdir first (and fail if unsuccessful) to make sure + # that nobody tries to guess the $tmpdir name. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/Makefile.am new file mode 100644 index 000000000..a90881fac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/Makefile.am @@ -0,0 +1,10 @@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = libkernel.la + +libkernel_la_SOURCES = align.c alloc.c assert.c awake.c buffered.c \ +cpy1d.c cpy2d-pair.c cpy2d.c ct.c debug.c extract-reim.c hash.c iabs.c \ +kalloc.c md5-1.c md5.c minmax.c ops.c pickdim.c plan.c planner.c \ +primes.c print.c problem.c rader.c scan.c solver.c solvtab.c stride.c \ +tensor.c tensor1.c tensor2.c tensor3.c tensor4.c tensor5.c tensor7.c \ +tensor8.c tensor9.c tile2d.c timer.c transpose.c trig.c twiddle.c \ +cycle.h ifftw.h diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/Makefile.in new file mode 100644 index 000000000..767202920 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/Makefile.in @@ -0,0 +1,683 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = kernel +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libkernel_la_LIBADD = +am_libkernel_la_OBJECTS = align.lo alloc.lo assert.lo awake.lo \ + buffered.lo cpy1d.lo cpy2d-pair.lo cpy2d.lo ct.lo debug.lo \ + extract-reim.lo hash.lo iabs.lo kalloc.lo md5-1.lo md5.lo \ + minmax.lo ops.lo pickdim.lo plan.lo planner.lo primes.lo \ + print.lo problem.lo rader.lo scan.lo solver.lo solvtab.lo \ + stride.lo tensor.lo tensor1.lo tensor2.lo tensor3.lo \ + tensor4.lo tensor5.lo tensor7.lo tensor8.lo tensor9.lo \ + tile2d.lo timer.lo transpose.lo trig.lo twiddle.lo +libkernel_la_OBJECTS = $(am_libkernel_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libkernel_la_SOURCES) +DIST_SOURCES = $(libkernel_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = libkernel.la +libkernel_la_SOURCES = align.c alloc.c assert.c awake.c buffered.c \ +cpy1d.c cpy2d-pair.c cpy2d.c ct.c debug.c extract-reim.c hash.c iabs.c \ +kalloc.c md5-1.c md5.c minmax.c ops.c pickdim.c plan.c planner.c \ +primes.c print.c problem.c rader.c scan.c solver.c solvtab.c stride.c \ +tensor.c tensor1.c tensor2.c tensor3.c tensor4.c tensor5.c tensor7.c \ +tensor8.c tensor9.c tile2d.c timer.c transpose.c trig.c twiddle.c \ +cycle.h ifftw.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kernel/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu kernel/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libkernel.la: $(libkernel_la_OBJECTS) $(libkernel_la_DEPENDENCIES) $(EXTRA_libkernel_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libkernel_la_OBJECTS) $(libkernel_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/align.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assert.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awake.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffered.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpy1d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpy2d-pair.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpy2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extract-reim.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iabs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kalloc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5-1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minmax.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ops.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pickdim.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/planner.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solvtab.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stride.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tile2d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transpose.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trig.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twiddle.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/align.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/align.c new file mode 100644 index 000000000..fff1787a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/align.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_SIMD +# define ALGN 16 +#else + /* disable the alignment machinery, because it will break, + e.g., if sizeof(R) == 12 (as in long-double/x86) */ +# define ALGN 0 +#endif + +/* NONPORTABLE */ +int X(ialignment_of)(R *p) +{ +#if ALGN == 0 + UNUSED(p); + return 0; +#else + return (int)(((uintptr_t) p) % ALGN); +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/alloc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/alloc.c new file mode 100644 index 000000000..4a06a0de5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/alloc.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +void *X(malloc_plain)(size_t n) +{ + void *p; + if (n == 0) + n = 1; + p = X(kernel_malloc)(n); + CK(p); + +#ifdef MIN_ALIGNMENT + A((((uintptr_t)p) % MIN_ALIGNMENT) == 0); +#endif + + return p; +} + +void X(ifree)(void *p) +{ + X(kernel_free)(p); +} + +void X(ifree0)(void *p) +{ + /* common pattern */ + if (p) X(ifree)(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/assert.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/assert.c new file mode 100644 index 000000000..c2ecefda1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/assert.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" +#include +#include + +void X(assertion_failed)(const char *s, int line, const char *file) +{ + fflush(stdout); + fprintf(stderr, "fftw: %s:%d: assertion failed: %s\n", file, line, s); +#ifdef HAVE_ABORT + abort(); +#else + exit(EXIT_FAILURE); +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/awake.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/awake.c new file mode 100644 index 000000000..c1926bf6a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/awake.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +void X(null_awake)(plan *ego, enum wakefulness wakefulness) +{ + UNUSED(ego); + UNUSED(wakefulness); + /* do nothing */ +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/buffered.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/buffered.c new file mode 100644 index 000000000..ea27bd388 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/buffered.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* routines shared by the various buffered solvers */ + +#include "kernel/ifftw.h" + +#define DEFAULT_MAXNBUF ((INT)256) + +/* approx. 512KB of buffers for complex data */ +#define MAXBUFSZ (256 * 1024 / (INT)(sizeof(R))) + +INT X(nbuf)(INT n, INT vl, INT maxnbuf) +{ + INT i, nbuf, lb; + + if (!maxnbuf) + maxnbuf = DEFAULT_MAXNBUF; + + nbuf = X(imin)(maxnbuf, + X(imin)(vl, X(imax)((INT)1, MAXBUFSZ / n))); + + /* + * Look for a buffer number (not too small) that divides the + * vector length, in order that we only need one child plan: + */ + lb = X(imax)(1, nbuf / 4); + for (i = nbuf; i >= lb; --i) + if (vl % i == 0) + return i; + + /* whatever... */ + return nbuf; +} + +#define SKEW 6 /* need to be even for SIMD */ +#define SKEWMOD 8 + +INT X(bufdist)(INT n, INT vl) +{ + if (vl == 1) + return n; + else + /* return smallest X such that X >= N and X == SKEW (mod SKEWMOD) */ + return n + X(modulo)(SKEW - n, SKEWMOD); +} + +int X(toobig)(INT n) +{ + return n > MAXBUFSZ; +} + +/* TRUE if there exists i < which such that maxnbuf[i] and + maxnbuf[which] yield the same value, in which case we canonicalize + on the minimum value */ +int X(nbuf_redundant)(INT n, INT vl, size_t which, + const INT *maxnbuf, size_t nmaxnbuf) +{ + size_t i; + (void)nmaxnbuf; /* UNUSED */ + for (i = 0; i < which; ++i) + if (X(nbuf)(n, vl, maxnbuf[i]) == X(nbuf)(n, vl, maxnbuf[which])) + return 1; + return 0; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy1d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy1d.c new file mode 100644 index 000000000..8d9cf77e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy1d.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* out of place 1D copy routine */ +#include "kernel/ifftw.h" + +void X(cpy1d)(R *I, R *O, INT n0, INT is0, INT os0, INT vl) +{ + INT i0, v; + + A(I != O); + switch (vl) { + case 1: + if ((n0 & 1) || is0 != 1 || os0 != 1) { + for (; n0 > 0; --n0, I += is0, O += os0) + *O = *I; + break; + } + n0 /= 2; is0 = 2; os0 = 2; + /* fall through */ + case 2: + if ((n0 & 1) || is0 != 2 || os0 != 2) { + for (; n0 > 0; --n0, I += is0, O += os0) { + R x0 = I[0]; + R x1 = I[1]; + O[0] = x0; + O[1] = x1; + } + break; + } + n0 /= 2; is0 = 4; os0 = 4; + /* fall through */ + case 4: + for (; n0 > 0; --n0, I += is0, O += os0) { + R x0 = I[0]; + R x1 = I[1]; + R x2 = I[2]; + R x3 = I[3]; + O[0] = x0; + O[1] = x1; + O[2] = x2; + O[3] = x3; + } + break; + default: + for (i0 = 0; i0 < n0; ++i0) + for (v = 0; v < vl; ++v) { + R x0 = I[i0 * is0 + v]; + O[i0 * os0 + v] = x0; + } + break; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy2d-pair.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy2d-pair.c new file mode 100644 index 000000000..8e4add0d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy2d-pair.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* out of place copy routines for pairs of isomorphic 2D arrays */ +#include "kernel/ifftw.h" + +void X(cpy2d_pair)(R *I0, R *I1, R *O0, R *O1, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1) +{ + INT i0, i1; + + for (i1 = 0; i1 < n1; ++i1) + for (i0 = 0; i0 < n0; ++i0) { + R x0 = I0[i0 * is0 + i1 * is1]; + R x1 = I1[i0 * is0 + i1 * is1]; + O0[i0 * os0 + i1 * os1] = x0; + O1[i0 * os0 + i1 * os1] = x1; + } +} + +void X(zero1d_pair)(R *O0, R *O1, INT n0, INT os0) +{ + INT i0; + for (i0 = 0; i0 < n0; ++i0) { + O0[i0 * os0] = 0; + O1[i0 * os0] = 0; + } +} + +/* like cpy2d_pair, but read input contiguously if possible */ +void X(cpy2d_pair_ci)(R *I0, R *I1, R *O0, R *O1, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1) +{ + if (IABS(is0) < IABS(is1)) /* inner loop is for n0 */ + X(cpy2d_pair) (I0, I1, O0, O1, n0, is0, os0, n1, is1, os1); + else + X(cpy2d_pair) (I0, I1, O0, O1, n1, is1, os1, n0, is0, os0); +} + +/* like cpy2d_pair, but write output contiguously if possible */ +void X(cpy2d_pair_co)(R *I0, R *I1, R *O0, R *O1, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1) +{ + if (IABS(os0) < IABS(os1)) /* inner loop is for n0 */ + X(cpy2d_pair) (I0, I1, O0, O1, n0, is0, os0, n1, is1, os1); + else + X(cpy2d_pair) (I0, I1, O0, O1, n1, is1, os1, n0, is0, os0); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy2d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy2d.c new file mode 100644 index 000000000..0d9281a81 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cpy2d.c @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* out of place 2D copy routines */ +#include "kernel/ifftw.h" + +#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) +# ifdef HAVE_XMMINTRIN_H +# include +# define WIDE_TYPE __m128 +# endif +#endif + +#ifndef WIDE_TYPE +/* fall back to double, which means that WIDE_TYPE will be unused */ +# define WIDE_TYPE double +#endif + +void X(cpy2d)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl) +{ + INT i0, i1, v; + + switch (vl) { + case 1: + for (i1 = 0; i1 < n1; ++i1) + for (i0 = 0; i0 < n0; ++i0) { + R x0 = I[i0 * is0 + i1 * is1]; + O[i0 * os0 + i1 * os1] = x0; + } + break; + case 2: + if (1 + && (2 * sizeof(R) == sizeof(WIDE_TYPE)) + && (sizeof(WIDE_TYPE) > sizeof(double)) + && (((size_t)I) % sizeof(WIDE_TYPE) == 0) + && (((size_t)O) % sizeof(WIDE_TYPE) == 0) + && ((is0 & 1) == 0) + && ((is1 & 1) == 0) + && ((os0 & 1) == 0) + && ((os1 & 1) == 0)) { + /* copy R[2] as WIDE_TYPE if WIDE_TYPE is large + enough to hold R[2], and if the input is + properly aligned. This is a win when R==double + and WIDE_TYPE is 128 bits. */ + for (i1 = 0; i1 < n1; ++i1) + for (i0 = 0; i0 < n0; ++i0) { + *(WIDE_TYPE *)&O[i0 * os0 + i1 * os1] = + *(WIDE_TYPE *)&I[i0 * is0 + i1 * is1]; + } + } else if (1 + && (2 * sizeof(R) == sizeof(double)) + && (((size_t)I) % sizeof(double) == 0) + && (((size_t)O) % sizeof(double) == 0) + && ((is0 & 1) == 0) + && ((is1 & 1) == 0) + && ((os0 & 1) == 0) + && ((os1 & 1) == 0)) { + /* copy R[2] as double if double is large enough to + hold R[2], and if the input is properly aligned. + This case applies when R==float */ + for (i1 = 0; i1 < n1; ++i1) + for (i0 = 0; i0 < n0; ++i0) { + *(double *)&O[i0 * os0 + i1 * os1] = + *(double *)&I[i0 * is0 + i1 * is1]; + } + } else { + for (i1 = 0; i1 < n1; ++i1) + for (i0 = 0; i0 < n0; ++i0) { + R x0 = I[i0 * is0 + i1 * is1]; + R x1 = I[i0 * is0 + i1 * is1 + 1]; + O[i0 * os0 + i1 * os1] = x0; + O[i0 * os0 + i1 * os1 + 1] = x1; + } + } + break; + default: + for (i1 = 0; i1 < n1; ++i1) + for (i0 = 0; i0 < n0; ++i0) + for (v = 0; v < vl; ++v) { + R x0 = I[i0 * is0 + i1 * is1 + v]; + O[i0 * os0 + i1 * os1 + v] = x0; + } + break; + } +} + +/* like cpy2d, but read input contiguously if possible */ +void X(cpy2d_ci)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl) +{ + if (IABS(is0) < IABS(is1)) /* inner loop is for n0 */ + X(cpy2d) (I, O, n0, is0, os0, n1, is1, os1, vl); + else + X(cpy2d) (I, O, n1, is1, os1, n0, is0, os0, vl); +} + +/* like cpy2d, but write output contiguously if possible */ +void X(cpy2d_co)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl) +{ + if (IABS(os0) < IABS(os1)) /* inner loop is for n0 */ + X(cpy2d) (I, O, n0, is0, os0, n1, is1, os1, vl); + else + X(cpy2d) (I, O, n1, is1, os1, n0, is0, os0, vl); +} + + +/* tiled copy routines */ +struct cpy2d_closure { + R *I, *O; + INT is0, os0, is1, os1, vl; + R *buf; +}; + +static void dotile(INT n0l, INT n0u, INT n1l, INT n1u, void *args) +{ + struct cpy2d_closure *k = (struct cpy2d_closure *)args; + X(cpy2d)(k->I + n0l * k->is0 + n1l * k->is1, + k->O + n0l * k->os0 + n1l * k->os1, + n0u - n0l, k->is0, k->os0, + n1u - n1l, k->is1, k->os1, + k->vl); +} + +static void dotile_buf(INT n0l, INT n0u, INT n1l, INT n1u, void *args) +{ + struct cpy2d_closure *k = (struct cpy2d_closure *)args; + + /* copy from I to buf */ + X(cpy2d_ci)(k->I + n0l * k->is0 + n1l * k->is1, + k->buf, + n0u - n0l, k->is0, k->vl, + n1u - n1l, k->is1, k->vl * (n0u - n0l), + k->vl); + + /* copy from buf to O */ + X(cpy2d_co)(k->buf, + k->O + n0l * k->os0 + n1l * k->os1, + n0u - n0l, k->vl, k->os0, + n1u - n1l, k->vl * (n0u - n0l), k->os1, + k->vl); +} + + +void X(cpy2d_tiled)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, INT vl) +{ + INT tilesz = X(compute_tilesz)(vl, + 1 /* input array */ + + 1 /* ouput array */); + struct cpy2d_closure k; + k.I = I; + k.O = O; + k.is0 = is0; + k.os0 = os0; + k.is1 = is1; + k.os1 = os1; + k.vl = vl; + k.buf = 0; /* unused */ + X(tile2d)(0, n0, 0, n1, tilesz, dotile, &k); +} + +void X(cpy2d_tiledbuf)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, INT vl) +{ + R buf[CACHESIZE / (2 * sizeof(R))]; + /* input and buffer in cache, or + output and buffer in cache */ + INT tilesz = X(compute_tilesz)(vl, 2); + struct cpy2d_closure k; + k.I = I; + k.O = O; + k.is0 = is0; + k.os0 = os0; + k.is1 = is1; + k.os1 = os1; + k.vl = vl; + k.buf = buf; + A(tilesz * tilesz * vl * sizeof(R) <= sizeof(buf)); + X(tile2d)(0, n0, 0, n1, tilesz, dotile_buf, &k); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ct.c new file mode 100644 index 000000000..82303b84f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ct.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* common routines for Cooley-Tukey algorithms */ + +#include "kernel/ifftw.h" + +#define POW2P(n) (((n) > 0) && (((n) & ((n) - 1)) == 0)) + +/* TRUE if radix-r is ugly for size n */ +int X(ct_uglyp)(INT min_n, INT v, INT n, INT r) +{ + return (n <= min_n) || (POW2P(n) && (v * (n / r)) <= 4); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cycle.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cycle.h new file mode 100644 index 000000000..fe3dd50d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/cycle.h @@ -0,0 +1,564 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +/* machine-dependent cycle counters code. Needs to be inlined. */ + +/***************************************************************************/ +/* To use the cycle counters in your code, simply #include "cycle.h" (this + file), and then use the functions/macros: + + ticks getticks(void); + + ticks is an opaque typedef defined below, representing the current time. + You extract the elapsed time between two calls to gettick() via: + + double elapsed(ticks t1, ticks t0); + + which returns a double-precision variable in arbitrary units. You + are not expected to convert this into human units like seconds; it + is intended only for *comparisons* of time intervals. + + (In order to use some of the OS-dependent timer routines like + Solaris' gethrtime, you need to paste the autoconf snippet below + into your configure.ac file and #include "config.h" before cycle.h, + or define the relevant macros manually if you are not using autoconf.) +*/ + +/***************************************************************************/ +/* This file uses macros like HAVE_GETHRTIME that are assumed to be + defined according to whether the corresponding function/type/header + is available on your system. The necessary macros are most + conveniently defined if you are using GNU autoconf, via the tests: + + dnl --------------------------------------------------------------------- + + AC_C_INLINE + AC_HEADER_TIME + AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h]) + + AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in ])],,[#if HAVE_SYS_TIME_H +#include +#endif]) + + AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time]) + + dnl Cray UNICOS _rtc() (real-time clock) intrinsic + AC_MSG_CHECKING([for _rtc intrinsic]) + rtc_ok=yes + AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H +#include +#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no]) + AC_MSG_RESULT($rtc_ok) + + dnl --------------------------------------------------------------------- +*/ + +/***************************************************************************/ + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \ +{ \ + return (double)t1 - (double)t0; \ +} + +/*----------------------------------------------------------------*/ +/* Solaris */ +#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER) +typedef hrtime_t ticks; + +#define getticks gethrtime + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* AIX v. 4+ routines to read the real-time clock or time-base register */ +#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER) +typedef timebasestruct_t ticks; + +static __inline ticks getticks(void) +{ + ticks t; + read_real_time(&t, TIMEBASE_SZ); + return t; +} + +static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */ +{ + time_base_to_time(&t1, TIMEBASE_SZ); + time_base_to_time(&t0, TIMEBASE_SZ); + return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 + + ((double)t1.tb_low - (double)t0.tb_low)); +} + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PowerPC ``cycle'' counter using the time base register. + */ +#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__)))) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned int tbl, tbu0, tbu1; + + do { + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0)); + __asm__ __volatile__ ("mftb %0" : "=r"(tbl)); + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1)); + } while (tbu0 != tbu1); + + return (((unsigned long long)tbu0) << 32) | tbl; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime, + from Carbon, requires no additional libraries to be linked). */ +#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER) +#include +typedef uint64_t ticks; +#define getticks mach_absolute_time +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * Pentium cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("rdtsc": "=A" (ret)); + /* no input, nothing else clobbered */ + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/* Visual C++ -- thanks to Morten Nissov for his help with this */ +#if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER) +#include +typedef LARGE_INTEGER ticks; +#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */ + +static __inline ticks getticks(void) +{ + ticks retval; + + __asm { + RDTSC + mov retval.HighPart, edx + mov retval.LowPart, eax + } + return retval; +} + +static __inline double elapsed(ticks t1, ticks t0) +{ + return (double)t1.QuadPart - (double)t0.QuadPart; +} + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/*----------------------------------------------------------------*/ +/* + * X86-64 cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned a, d; + __asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d)); + return ((ticks)a) | (((ticks)d) << 32); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 +#endif + +/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori. + NOTE: this code will fail to link unless you use the -Masmkeyword compiler + option (grrr). */ +#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; +static ticks getticks(void) +{ + asm(" rdtsc; shl $0x20,%rdx; mov %eax,%eax; or %rdx,%rax; "); +} +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 +#endif + +/* Visual C++, courtesy of Dirk Michaelis */ +#if _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER) + +#include +#pragma intrinsic(__rdtsc) +typedef unsigned __int64 ticks; +#define getticks __rdtsc +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 +#endif + +/*----------------------------------------------------------------*/ +/* + * IA64 cycle counter + */ + +/* intel's icc/ecc compiler */ +#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; +#include + +static __inline__ ticks getticks(void) +{ + return __getReg(_IA64_REG_AR_ITC); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* gcc */ +#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */ +#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER) +#include +typedef unsigned long ticks; + +static inline ticks getticks(void) +{ + ticks ret; + + ret = _Asm_mov_from_ar (_AREG_ITC); + return ret; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/* Microsoft Visual C++ */ +#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER) +typedef unsigned __int64 ticks; + +# ifdef __cplusplus +extern "C" +# endif +ticks __getReg(int whichReg); +#pragma intrinsic(__getReg) + +static __inline ticks getticks(void) +{ + volatile ticks temp; + temp = __getReg(3116); + return temp; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PA-RISC cycle counter + */ +#if (defined(__hppa__) || defined(__hppa)) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +# ifdef __GNUC__ +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("mfctl 16, %0": "=r" (ret)); + /* no input, nothing else clobbered */ + return ret; +} +# else +# include +static inline unsigned long getticks(void) +{ + register ticks ret; + _MFCTL(16, ret); + return ret; +} +# endif + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* S390, courtesy of James Treacy */ +#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks cycles; + __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); + return cycles; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER) +/* + * The 32-bit cycle counter on alpha overflows pretty quickly, + * unfortunately. A 1GHz machine overflows in 4 seconds. + */ +typedef unsigned int ticks; + +static __inline__ ticks getticks(void) +{ + unsigned long cc; + __asm__ __volatile__ ("rpcc %0" : "=r"(cc)); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + __asm__ __volatile__("rd %%tick, %0" : "=r" (ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER) +# include +typedef unsigned int ticks; + +static __inline ticks getticks(void) +{ + unsigned long cc; + cc = asm("rpcc %v0"); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +/* SGI/Irix */ +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER) && !defined(__ANDROID__) +typedef struct timespec ticks; + +static inline ticks getticks(void) +{ + struct timespec t; + clock_gettime(CLOCK_SGI_CYCLE, &t); + return t; +} + +static inline double elapsed(ticks t1, ticks t0) +{ + return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 + + ((double)t1.tv_nsec - (double)t0.tv_nsec); +} +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* Cray UNICOS _rtc() intrinsic function */ +#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER) +#ifdef HAVE_INTRINSICS_H +# include +#endif + +typedef long long ticks; + +#define getticks _rtc + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* MIPS ZBus */ +#if HAVE_MIPS_ZBUS_TIMER +#if defined(__mips__) && !defined(HAVE_TICK_COUNTER) +#include +#include +#include + +typedef uint64_t ticks; + +static inline ticks getticks(void) +{ + static uint64_t* addr = 0; + + if (addr == 0) + { + uint32_t rq_addr = 0x10030000; + int fd; + int pgsize; + + pgsize = getpagesize(); + fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0); + if (fd < 0) { + perror("open"); + return NULL; + } + addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr); + close(fd); + if (addr == (uint64_t *)-1) { + perror("mmap"); + return NULL; + } + } + + return *addr; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif +#endif /* HAVE_MIPS_ZBUS_TIMER */ + +#if defined(HAVE_ARMV7A_CNTVCT) +typedef uint64_t ticks; +static inline ticks getticks(void) +{ + uint32_t Rt, Rt2 = 0; + asm volatile("mrrc p15, 1, %0, %1, c14" : "=r"(Rt), "=r"(Rt2)); + return ((uint64_t)Rt) | (((uint64_t)Rt2) << 32); +} +INLINE_ELAPSED(inline) +#define HAVE_TICK_COUNTER +#endif + +#if defined(HAVE_ARMV7A_PMCCNTR) +typedef uint64_t ticks; +static inline ticks getticks(void) +{ + uint32_t r; + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(r) ); + return r; +} +INLINE_ELAPSED(inline) +#define HAVE_TICK_COUNTER +#endif + +#if defined(__aarch64__) && defined(HAVE_ARMV8_CNTVCT_EL0) && !defined(HAVE_ARMV8_PMCCNTR_EL0) +typedef uint64_t ticks; +static inline ticks getticks(void) +{ + uint64_t Rt; + asm volatile("mrs %0, CNTVCT_EL0" : "=r" (Rt)); + return Rt; +} +INLINE_ELAPSED(inline) +#define HAVE_TICK_COUNTER +#endif + +#if defined(__aarch64__) && defined(HAVE_ARMV8_PMCCNTR_EL0) +typedef uint64_t ticks; +static inline ticks getticks(void) +{ + uint64_t cc = 0; + asm volatile("mrs %0, PMCCNTR_EL0" : "=r"(cc)); + return cc; +} +INLINE_ELAPSED(inline) +#define HAVE_TICK_COUNTER +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/debug.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/debug.c new file mode 100644 index 000000000..b22bea007 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/debug.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +#ifdef FFTW_DEBUG +#include + +typedef struct { + printer super; + FILE *f; +} P_file; + +static void putchr_file(printer *p_, char c) +{ + P_file *p = (P_file *) p_; + fputc(c, p->f); +} + +static printer *mkprinter_file(FILE *f) +{ + P_file *p = (P_file *) X(mkprinter)(sizeof(P_file), putchr_file, 0); + p->f = f; + return &p->super; +} + +void X(debug)(const char *format, ...) +{ + va_list ap; + printer *p = mkprinter_file(stderr); + va_start(ap, format); + p->vprint(p, format, ap); + va_end(ap); + X(printer_destroy)(p); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/extract-reim.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/extract-reim.c new file mode 100644 index 000000000..673524b78 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/extract-reim.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +/* decompose complex pointer into real and imaginary parts. + Flip real and imaginary if there the sign does not match + FFTW's idea of what the sign should be */ + +void X(extract_reim)(int sign, R *c, R **r, R **i) +{ + if (sign == FFT_SIGN) { + *r = c + 0; + *i = c + 1; + } else { + *r = c + 1; + *i = c + 0; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/hash.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/hash.c new file mode 100644 index 000000000..0e388d14e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/hash.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +unsigned X(hash)(const char *s) +{ + unsigned h = 0xDEADBEEFu; + do { + h = h * 17 + (unsigned)(*s & 0xFF); + } while (*s++); + return h; +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/iabs.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/iabs.c new file mode 100644 index 000000000..d7a2353bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/iabs.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +INT X(iabs)(INT a) +{ + return a < 0 ? (0 - a) : a; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ifftw.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ifftw.h new file mode 100644 index 000000000..0733e7566 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ifftw.h @@ -0,0 +1,1143 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* FFTW internal header file */ +#ifndef __IFFTW_H__ +#define __IFFTW_H__ + +#include "config.h" + +#include /* size_t */ +#include /* va_list */ +#include /* ptrdiff_t */ +#include /* INT_MAX */ + +#if HAVE_SYS_TYPES_H +# include +#endif + +#if HAVE_STDINT_H +# include /* uintptr_t, maybe */ +#endif + +#if HAVE_INTTYPES_H +# include /* uintptr_t, maybe */ +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* Windows annoyances -- since tests/hook.c uses some internal + FFTW functions, we need to given them the dllexport attribute + under Windows when compiling as a DLL (see api/fftw3.h). */ +#if defined(FFTW_EXTERN) +# define IFFTW_EXTERN FFTW_EXTERN +#elif (defined(FFTW_DLL) || defined(DLL_EXPORT)) \ + && (defined(_WIN32) || defined(__WIN32__)) +# define IFFTW_EXTERN extern __declspec(dllexport) +#else +# define IFFTW_EXTERN extern +#endif + +/* determine precision and name-mangling scheme */ +#define CONCAT(prefix, name) prefix ## name +#if defined(FFTW_SINGLE) + typedef float R; +# define X(name) CONCAT(fftwf_, name) +#elif defined(FFTW_LDOUBLE) + typedef long double R; +# define X(name) CONCAT(fftwl_, name) +# define TRIGREAL_IS_LONG_DOUBLE +#elif defined(FFTW_QUAD) + typedef __float128 R; +# define X(name) CONCAT(fftwq_, name) +# define TRIGREAL_IS_QUAD +#else + typedef double R; +# define X(name) CONCAT(fftw_, name) +#endif + +/* + integral type large enough to contain a stride (what ``int'' should + have been in the first place. +*/ +typedef ptrdiff_t INT; + +/* dummy use of unused parameters to silence compiler warnings */ +#define UNUSED(x) (void)x + +#define NELEM(array) ((sizeof(array) / sizeof((array)[0]))) + +#define FFT_SIGN (-1) /* sign convention for forward transforms */ +extern void X(extract_reim)(int sign, R *c, R **r, R **i); + +#define REGISTER_SOLVER(p, s) X(solver_register)(p, s) + +#define STRINGIZEx(x) #x +#define STRINGIZE(x) STRINGIZEx(x) +#define CIMPLIES(ante, post) (!(ante) || (post)) + +/* define HAVE_SIMD if any simd extensions are supported */ +#if defined(HAVE_SSE) || defined(HAVE_SSE2) || \ + defined(HAVE_AVX) || defined(HAVE_AVX_128_FMA) || \ + defined(HAVE_AVX2) || defined(HAVE_AVX512) || \ + defined(HAVE_KCVI) || \ + defined(HAVE_ALTIVEC) || defined(HAVE_VSX) || \ + defined(HAVE_MIPS_PS) || \ + defined(HAVE_GENERIC_SIMD128) || defined(HAVE_GENERIC_SIMD256) +#define HAVE_SIMD 1 +#else +#define HAVE_SIMD 0 +#endif + +extern int X(have_simd_sse2)(void); +extern int X(have_simd_avx)(void); +extern int X(have_simd_avx_128_fma)(void); +extern int X(have_simd_avx2)(void); +extern int X(have_simd_avx2_128)(void); +extern int X(have_simd_avx512)(void); +extern int X(have_simd_altivec)(void); +extern int X(have_simd_vsx)(void); +extern int X(have_simd_neon)(void); + +/* forward declarations */ +typedef struct problem_s problem; +typedef struct plan_s plan; +typedef struct solver_s solver; +typedef struct planner_s planner; +typedef struct printer_s printer; +typedef struct scanner_s scanner; + +/*-----------------------------------------------------------------------*/ +/* alloca: */ +#if HAVE_SIMD +# if defined(HAVE_KCVI) || defined(HAVE_AVX512) +# define MIN_ALIGNMENT 64 +# elif defined(HAVE_AVX) || defined(HAVE_AVX2) || defined(HAVE_GENERIC_SIMD256) +# define MIN_ALIGNMENT 32 /* best alignment for AVX, conservative for + * everything else */ +# else + /* Note that we cannot use 32-byte alignment for all SIMD. For + example, MacOS X malloc is 16-byte aligned, but there was no + posix_memalign in MacOS X until version 10.6. */ +# define MIN_ALIGNMENT 16 +# endif +#endif + +#if defined(HAVE_ALLOCA) && defined(FFTW_ENABLE_ALLOCA) + /* use alloca if available */ + +#ifndef alloca +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +void *alloca(size_t); +# endif +# endif +# endif +# endif +#endif +#endif + +# ifdef MIN_ALIGNMENT +# define STACK_MALLOC(T, p, n) \ + { \ + p = (T)alloca((n) + MIN_ALIGNMENT); \ + p = (T)(((uintptr_t)p + (MIN_ALIGNMENT - 1)) & \ + (~(uintptr_t)(MIN_ALIGNMENT - 1))); \ + } +# define STACK_FREE(n) +# else /* HAVE_ALLOCA && !defined(MIN_ALIGNMENT) */ +# define STACK_MALLOC(T, p, n) p = (T)alloca(n) +# define STACK_FREE(n) +# endif + +#else /* ! HAVE_ALLOCA */ + /* use malloc instead of alloca */ +# define STACK_MALLOC(T, p, n) p = (T)MALLOC(n, OTHER) +# define STACK_FREE(n) X(ifree)(n) +#endif /* ! HAVE_ALLOCA */ + +/* allocation of buffers. If these grow too large use malloc(), else + use STACK_MALLOC (hopefully reducing to alloca()). */ + +/* 64KiB ought to be enough for anybody */ +#define MAX_STACK_ALLOC ((size_t)64 * 1024) + +#define BUF_ALLOC(T, p, n) \ +{ \ + if (n < MAX_STACK_ALLOC) { \ + STACK_MALLOC(T, p, n); \ + } else { \ + p = (T)MALLOC(n, BUFFERS); \ + } \ +} + +#define BUF_FREE(p, n) \ +{ \ + if (n < MAX_STACK_ALLOC) { \ + STACK_FREE(p); \ + } else { \ + X(ifree)(p); \ + } \ +} + +/*-----------------------------------------------------------------------*/ +/* define uintptr_t if it is not already defined */ + +#ifndef HAVE_UINTPTR_T +# if SIZEOF_VOID_P == 0 +# error sizeof void* is unknown! +# elif SIZEOF_UNSIGNED_INT == SIZEOF_VOID_P + typedef unsigned int uintptr_t; +# elif SIZEOF_UNSIGNED_LONG == SIZEOF_VOID_P + typedef unsigned long uintptr_t; +# elif SIZEOF_UNSIGNED_LONG_LONG == SIZEOF_VOID_P + typedef unsigned long long uintptr_t; +# else +# error no unsigned integer type matches void* sizeof! +# endif +#endif + +/*-----------------------------------------------------------------------*/ +/* We can do an optimization for copying pairs of (aligned) floats + when in single precision if 2*float = double. */ + +#define FFTW_2R_IS_DOUBLE (defined(FFTW_SINGLE) \ + && SIZEOF_FLOAT != 0 \ + && SIZEOF_DOUBLE == 2*SIZEOF_FLOAT) + +#define DOUBLE_ALIGNED(p) ((((uintptr_t)(p)) % sizeof(double)) == 0) + +/*-----------------------------------------------------------------------*/ +/* assert.c: */ +IFFTW_EXTERN void X(assertion_failed)(const char *s, + int line, const char *file); + +/* always check */ +#define CK(ex) \ + (void)((ex) || (X(assertion_failed)(#ex, __LINE__, __FILE__), 0)) + +#ifdef FFTW_DEBUG +/* check only if debug enabled */ +#define A(ex) \ + (void)((ex) || (X(assertion_failed)(#ex, __LINE__, __FILE__), 0)) +#else +#define A(ex) /* nothing */ +#endif + +extern void X(debug)(const char *format, ...); +#define D X(debug) + +/*-----------------------------------------------------------------------*/ +/* kalloc.c: */ +extern void *X(kernel_malloc)(size_t n); +extern void X(kernel_free)(void *p); + +/*-----------------------------------------------------------------------*/ +/* alloc.c: */ + +/* objects allocated by malloc, for statistical purposes */ +enum malloc_tag { + EVERYTHING, + PLANS, + SOLVERS, + PROBLEMS, + BUFFERS, + HASHT, + TENSORS, + PLANNERS, + SLVDESCS, + TWIDDLES, + STRIDES, + OTHER, + MALLOC_WHAT_LAST /* must be last */ +}; + +IFFTW_EXTERN void X(ifree)(void *ptr); +extern void X(ifree0)(void *ptr); + +IFFTW_EXTERN void *X(malloc_plain)(size_t sz); +#define MALLOC(n, what) X(malloc_plain)(n) + +/*-----------------------------------------------------------------------*/ +/* low-resolution clock */ + +#ifdef FAKE_CRUDE_TIME + typedef int crude_time; +#else +# if TIME_WITH_SYS_TIME +# include +# include +# else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +# endif + +# ifdef HAVE_BSDGETTIMEOFDAY +# ifndef HAVE_GETTIMEOFDAY +# define gettimeofday BSDgettimeofday +# define HAVE_GETTIMEOFDAY 1 +# endif +# endif + +# if defined(HAVE_GETTIMEOFDAY) + typedef struct timeval crude_time; +# else + typedef clock_t crude_time; +# endif +#endif /* else FAKE_CRUDE_TIME */ + +crude_time X(get_crude_time)(void); +double X(elapsed_since)(const planner *plnr, const problem *p, + crude_time t0); /* time in seconds since t0 */ + +/*-----------------------------------------------------------------------*/ +/* ops.c: */ +/* + * ops counter. The total number of additions is add + fma + * and the total number of multiplications is mul + fma. + * Total flops = add + mul + 2 * fma + */ +typedef struct { + double add; + double mul; + double fma; + double other; +} opcnt; + +void X(ops_zero)(opcnt *dst); +void X(ops_other)(INT o, opcnt *dst); +void X(ops_cpy)(const opcnt *src, opcnt *dst); + +void X(ops_add)(const opcnt *a, const opcnt *b, opcnt *dst); +void X(ops_add2)(const opcnt *a, opcnt *dst); + +/* dst = m * a + b */ +void X(ops_madd)(INT m, const opcnt *a, const opcnt *b, opcnt *dst); + +/* dst += m * a */ +void X(ops_madd2)(INT m, const opcnt *a, opcnt *dst); + + +/*-----------------------------------------------------------------------*/ +/* minmax.c: */ +INT X(imax)(INT a, INT b); +INT X(imin)(INT a, INT b); + +/*-----------------------------------------------------------------------*/ +/* iabs.c: */ +INT X(iabs)(INT a); + +/* inline version */ +#define IABS(x) (((x) < 0) ? (0 - (x)) : (x)) + +/*-----------------------------------------------------------------------*/ +/* md5.c */ + +#if SIZEOF_UNSIGNED_INT >= 4 +typedef unsigned int md5uint; +#else +typedef unsigned long md5uint; /* at least 32 bits as per C standard */ +#endif + +typedef md5uint md5sig[4]; + +typedef struct { + md5sig s; /* state and signature */ + + /* fields not meant to be used outside md5.c: */ + unsigned char c[64]; /* stuff not yet processed */ + unsigned l; /* total length. Should be 64 bits long, but this is + good enough for us */ +} md5; + +void X(md5begin)(md5 *p); +void X(md5putb)(md5 *p, const void *d_, size_t len); +void X(md5puts)(md5 *p, const char *s); +void X(md5putc)(md5 *p, unsigned char c); +void X(md5int)(md5 *p, int i); +void X(md5INT)(md5 *p, INT i); +void X(md5unsigned)(md5 *p, unsigned i); +void X(md5end)(md5 *p); + +/*-----------------------------------------------------------------------*/ +/* tensor.c: */ +#define STRUCT_HACK_KR +#undef STRUCT_HACK_C99 + +typedef struct { + INT n; + INT is; /* input stride */ + INT os; /* output stride */ +} iodim; + +typedef struct { + int rnk; +#if defined(STRUCT_HACK_KR) + iodim dims[1]; +#elif defined(STRUCT_HACK_C99) + iodim dims[]; +#else + iodim *dims; +#endif +} tensor; + +/* + Definition of rank -infinity. + This definition has the property that if you want rank 0 or 1, + you can simply test for rank <= 1. This is a common case. + + A tensor of rank -infinity has size 0. +*/ +#define RNK_MINFTY INT_MAX +#define FINITE_RNK(rnk) ((rnk) != RNK_MINFTY) + +typedef enum { INPLACE_IS, INPLACE_OS } inplace_kind; + +tensor *X(mktensor)(int rnk); +tensor *X(mktensor_0d)(void); +tensor *X(mktensor_1d)(INT n, INT is, INT os); +tensor *X(mktensor_2d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1); +tensor *X(mktensor_3d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT n2, INT is2, INT os2); +tensor *X(mktensor_4d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT n2, INT is2, INT os2, + INT n3, INT is3, INT os3); +tensor *X(mktensor_5d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT n2, INT is2, INT os2, + INT n3, INT is3, INT os3, + INT n4, INT is4, INT os4); +INT X(tensor_sz)(const tensor *sz); +void X(tensor_md5)(md5 *p, const tensor *t); +INT X(tensor_max_index)(const tensor *sz); +INT X(tensor_min_istride)(const tensor *sz); +INT X(tensor_min_ostride)(const tensor *sz); +INT X(tensor_min_stride)(const tensor *sz); +int X(tensor_inplace_strides)(const tensor *sz); +int X(tensor_inplace_strides2)(const tensor *a, const tensor *b); +int X(tensor_strides_decrease)(const tensor *sz, const tensor *vecsz, + inplace_kind k); +tensor *X(tensor_copy)(const tensor *sz); +int X(tensor_kosherp)(const tensor *x); + +tensor *X(tensor_copy_inplace)(const tensor *sz, inplace_kind k); +tensor *X(tensor_copy_except)(const tensor *sz, int except_dim); +tensor *X(tensor_copy_sub)(const tensor *sz, int start_dim, int rnk); +tensor *X(tensor_compress)(const tensor *sz); +tensor *X(tensor_compress_contiguous)(const tensor *sz); +tensor *X(tensor_append)(const tensor *a, const tensor *b); +void X(tensor_split)(const tensor *sz, tensor **a, int a_rnk, tensor **b); +int X(tensor_tornk1)(const tensor *t, INT *n, INT *is, INT *os); +void X(tensor_destroy)(tensor *sz); +void X(tensor_destroy2)(tensor *a, tensor *b); +void X(tensor_destroy4)(tensor *a, tensor *b, tensor *c, tensor *d); +void X(tensor_print)(const tensor *sz, printer *p); +int X(dimcmp)(const iodim *a, const iodim *b); +int X(tensor_equal)(const tensor *a, const tensor *b); +int X(tensor_inplace_locations)(const tensor *sz, const tensor *vecsz); + +/*-----------------------------------------------------------------------*/ +/* problem.c: */ +enum { + /* a problem that cannot be solved */ + PROBLEM_UNSOLVABLE, + + PROBLEM_DFT, + PROBLEM_RDFT, + PROBLEM_RDFT2, + + /* for mpi/ subdirectory */ + PROBLEM_MPI_DFT, + PROBLEM_MPI_RDFT, + PROBLEM_MPI_RDFT2, + PROBLEM_MPI_TRANSPOSE, + + PROBLEM_LAST +}; + +typedef struct { + int problem_kind; + void (*hash) (const problem *ego, md5 *p); + void (*zero) (const problem *ego); + void (*print) (const problem *ego, printer *p); + void (*destroy) (problem *ego); +} problem_adt; + +struct problem_s { + const problem_adt *adt; +}; + +problem *X(mkproblem)(size_t sz, const problem_adt *adt); +void X(problem_destroy)(problem *ego); +problem *X(mkproblem_unsolvable)(void); + +/*-----------------------------------------------------------------------*/ +/* print.c */ +struct printer_s { + void (*print)(printer *p, const char *format, ...); + void (*vprint)(printer *p, const char *format, va_list ap); + void (*putchr)(printer *p, char c); + void (*cleanup)(printer *p); + int indent; + int indent_incr; +}; + +printer *X(mkprinter)(size_t size, + void (*putchr)(printer *p, char c), + void (*cleanup)(printer *p)); +IFFTW_EXTERN void X(printer_destroy)(printer *p); + +/*-----------------------------------------------------------------------*/ +/* scan.c */ +struct scanner_s { + int (*scan)(scanner *sc, const char *format, ...); + int (*vscan)(scanner *sc, const char *format, va_list ap); + int (*getchr)(scanner *sc); + int ungotc; +}; + +scanner *X(mkscanner)(size_t size, int (*getchr)(scanner *sc)); +void X(scanner_destroy)(scanner *sc); + +/*-----------------------------------------------------------------------*/ +/* plan.c: */ + +enum wakefulness { + SLEEPY, + AWAKE_ZERO, + AWAKE_SQRTN_TABLE, + AWAKE_SINCOS +}; + +typedef struct { + void (*solve)(const plan *ego, const problem *p); + void (*awake)(plan *ego, enum wakefulness wakefulness); + void (*print)(const plan *ego, printer *p); + void (*destroy)(plan *ego); +} plan_adt; + +struct plan_s { + const plan_adt *adt; + opcnt ops; + double pcost; + enum wakefulness wakefulness; /* used for debugging only */ + int could_prune_now_p; +}; + +plan *X(mkplan)(size_t size, const plan_adt *adt); +void X(plan_destroy_internal)(plan *ego); +IFFTW_EXTERN void X(plan_awake)(plan *ego, enum wakefulness wakefulness); +void X(plan_null_destroy)(plan *ego); + +/*-----------------------------------------------------------------------*/ +/* solver.c: */ +typedef struct { + int problem_kind; + plan *(*mkplan)(const solver *ego, const problem *p, planner *plnr); + void (*destroy)(solver *ego); +} solver_adt; + +struct solver_s { + const solver_adt *adt; + int refcnt; +}; + +solver *X(mksolver)(size_t size, const solver_adt *adt); +void X(solver_use)(solver *ego); +void X(solver_destroy)(solver *ego); +void X(solver_register)(planner *plnr, solver *s); + +/* shorthand */ +#define MKSOLVER(type, adt) (type *)X(mksolver)(sizeof(type), adt) + +/*-----------------------------------------------------------------------*/ +/* planner.c */ + +typedef struct slvdesc_s { + solver *slv; + const char *reg_nam; + unsigned nam_hash; + int reg_id; + int next_for_same_problem_kind; +} slvdesc; + +typedef struct solution_s solution; /* opaque */ + +/* interpretation of L and U: + + - if it returns a plan, the planner guarantees that all applicable + plans at least as impatient as U have been tried, and that each + plan in the solution is at least as impatient as L. + + - if it returns 0, the planner guarantees to have tried all solvers + at least as impatient as L, and that none of them was applicable. + + The structure is packed to fit into 64 bits. +*/ + +typedef struct { + unsigned l:20; + unsigned hash_info:3; +# define BITS_FOR_TIMELIMIT 9 + unsigned timelimit_impatience:BITS_FOR_TIMELIMIT; + unsigned u:20; + + /* abstraction break: we store the solver here to pad the + structure to 64 bits. Otherwise, the struct is padded to 64 + bits anyway, and another word is allocated for slvndx. */ +# define BITS_FOR_SLVNDX 12 + unsigned slvndx:BITS_FOR_SLVNDX; +} flags_t; + +/* impatience flags */ +enum { + BELIEVE_PCOST = 0x0001, + ESTIMATE = 0x0002, + NO_DFT_R2HC = 0x0004, + NO_SLOW = 0x0008, + NO_VRECURSE = 0x0010, + NO_INDIRECT_OP = 0x0020, + NO_LARGE_GENERIC = 0x0040, + NO_RANK_SPLITS = 0x0080, + NO_VRANK_SPLITS = 0x0100, + NO_NONTHREADED = 0x0200, + NO_BUFFERING = 0x0400, + NO_FIXED_RADIX_LARGE_N = 0x0800, + NO_DESTROY_INPUT = 0x1000, + NO_SIMD = 0x2000, + CONSERVE_MEMORY = 0x4000, + NO_DHT_R2HC = 0x8000, + NO_UGLY = 0x10000, + ALLOW_PRUNING = 0x20000 +}; + +/* hashtable information */ +enum { + BLESSING = 0x1u, /* save this entry */ + H_VALID = 0x2u, /* valid hastable entry */ + H_LIVE = 0x4u /* entry is nonempty, implies H_VALID */ +}; + +#define PLNR_L(plnr) ((plnr)->flags.l) +#define PLNR_U(plnr) ((plnr)->flags.u) +#define PLNR_TIMELIMIT_IMPATIENCE(plnr) ((plnr)->flags.timelimit_impatience) + +#define ESTIMATEP(plnr) (PLNR_U(plnr) & ESTIMATE) +#define BELIEVE_PCOSTP(plnr) (PLNR_U(plnr) & BELIEVE_PCOST) +#define ALLOW_PRUNINGP(plnr) (PLNR_U(plnr) & ALLOW_PRUNING) + +#define NO_INDIRECT_OP_P(plnr) (PLNR_L(plnr) & NO_INDIRECT_OP) +#define NO_LARGE_GENERICP(plnr) (PLNR_L(plnr) & NO_LARGE_GENERIC) +#define NO_RANK_SPLITSP(plnr) (PLNR_L(plnr) & NO_RANK_SPLITS) +#define NO_VRANK_SPLITSP(plnr) (PLNR_L(plnr) & NO_VRANK_SPLITS) +#define NO_VRECURSEP(plnr) (PLNR_L(plnr) & NO_VRECURSE) +#define NO_DFT_R2HCP(plnr) (PLNR_L(plnr) & NO_DFT_R2HC) +#define NO_SLOWP(plnr) (PLNR_L(plnr) & NO_SLOW) +#define NO_UGLYP(plnr) (PLNR_L(plnr) & NO_UGLY) +#define NO_FIXED_RADIX_LARGE_NP(plnr) \ + (PLNR_L(plnr) & NO_FIXED_RADIX_LARGE_N) +#define NO_NONTHREADEDP(plnr) \ + ((PLNR_L(plnr) & NO_NONTHREADED) && (plnr)->nthr > 1) + +#define NO_DESTROY_INPUTP(plnr) (PLNR_L(plnr) & NO_DESTROY_INPUT) +#define NO_SIMDP(plnr) (PLNR_L(plnr) & NO_SIMD) +#define CONSERVE_MEMORYP(plnr) (PLNR_L(plnr) & CONSERVE_MEMORY) +#define NO_DHT_R2HCP(plnr) (PLNR_L(plnr) & NO_DHT_R2HC) +#define NO_BUFFERINGP(plnr) (PLNR_L(plnr) & NO_BUFFERING) + +typedef enum { FORGET_ACCURSED, FORGET_EVERYTHING } amnesia; + +typedef enum { + /* WISDOM_NORMAL: planner may or may not use wisdom */ + WISDOM_NORMAL, + + /* WISDOM_ONLY: planner must use wisdom and must avoid searching */ + WISDOM_ONLY, + + /* WISDOM_IS_BOGUS: planner must return 0 as quickly as possible */ + WISDOM_IS_BOGUS, + + /* WISDOM_IGNORE_INFEASIBLE: planner ignores infeasible wisdom */ + WISDOM_IGNORE_INFEASIBLE, + + /* WISDOM_IGNORE_ALL: planner ignores all */ + WISDOM_IGNORE_ALL +} wisdom_state_t; + +typedef struct { + void (*register_solver)(planner *ego, solver *s); + plan *(*mkplan)(planner *ego, const problem *p); + void (*forget)(planner *ego, amnesia a); + void (*exprt)(planner *ego, printer *p); /* ``export'' is a reserved + word in C++. */ + int (*imprt)(planner *ego, scanner *sc); +} planner_adt; + +/* hash table of solutions */ +typedef struct { + solution *solutions; + unsigned hashsiz, nelem; + + /* statistics */ + int lookup, succ_lookup, lookup_iter; + int insert, insert_iter, insert_unknown; + int nrehash; +} hashtab; + +typedef enum { COST_SUM, COST_MAX } cost_kind; + +struct planner_s { + const planner_adt *adt; + void (*hook)(struct planner_s *plnr, plan *pln, + const problem *p, int optimalp); + double (*cost_hook)(const problem *p, double t, cost_kind k); + int (*wisdom_ok_hook)(const problem *p, flags_t flags); + void (*nowisdom_hook)(const problem *p); + wisdom_state_t (*bogosity_hook)(wisdom_state_t state, const problem *p); + + /* solver descriptors */ + slvdesc *slvdescs; + unsigned nslvdesc, slvdescsiz; + const char *cur_reg_nam; + int cur_reg_id; + int slvdescs_for_problem_kind[PROBLEM_LAST]; + + wisdom_state_t wisdom_state; + + hashtab htab_blessed; + hashtab htab_unblessed; + + int nthr; + flags_t flags; + + crude_time start_time; + double timelimit; /* elapsed_since(start_time) at which to bail out */ + int timed_out; /* whether most recent search timed out */ + int need_timeout_check; + + /* various statistics */ + int nplan; /* number of plans evaluated */ + double pcost, epcost; /* total pcost of measured/estimated plans */ + int nprob; /* number of problems evaluated */ +}; + +planner *X(mkplanner)(void); +void X(planner_destroy)(planner *ego); + +/* + Iterate over all solvers. Read: + + @article{ baker93iterators, + author = "Henry G. Baker, Jr.", + title = "Iterators: Signs of Weakness in Object-Oriented Languages", + journal = "{ACM} {OOPS} Messenger", + volume = "4", + number = "3", + pages = "18--25" + } +*/ +#define FORALL_SOLVERS(ego, s, p, what) \ +{ \ + unsigned _cnt; \ + for (_cnt = 0; _cnt < ego->nslvdesc; ++_cnt) { \ + slvdesc *p = ego->slvdescs + _cnt; \ + solver *s = p->slv; \ + what; \ + } \ +} + +#define FORALL_SOLVERS_OF_KIND(kind, ego, s, p, what) \ +{ \ + int _cnt = ego->slvdescs_for_problem_kind[kind]; \ + while (_cnt >= 0) { \ + slvdesc *p = ego->slvdescs + _cnt; \ + solver *s = p->slv; \ + what; \ + _cnt = p->next_for_same_problem_kind; \ + } \ +} + + +/* make plan, destroy problem */ +plan *X(mkplan_d)(planner *ego, problem *p); +plan *X(mkplan_f_d)(planner *ego, problem *p, + unsigned l_set, unsigned u_set, unsigned u_reset); + +/*-----------------------------------------------------------------------*/ +/* stride.c: */ + +/* If PRECOMPUTE_ARRAY_INDICES is defined, precompute all strides. */ +#if (defined(__i386__) || defined(__x86_64__) || _M_IX86 >= 500) && !defined(FFTW_LDOUBLE) +#define PRECOMPUTE_ARRAY_INDICES +#endif + +extern const INT X(an_INT_guaranteed_to_be_zero); + +#ifdef PRECOMPUTE_ARRAY_INDICES +typedef INT *stride; +#define WS(stride, i) (stride[i]) +extern stride X(mkstride)(INT n, INT s); +void X(stride_destroy)(stride p); +/* hackery to prevent the compiler from copying the strides array + onto the stack */ +#define MAKE_VOLATILE_STRIDE(nptr, x) (x) = (x) + X(an_INT_guaranteed_to_be_zero) +#else + +typedef INT stride; +#define WS(stride, i) (stride * i) +#define fftwf_mkstride(n, stride) stride +#define fftw_mkstride(n, stride) stride +#define fftwl_mkstride(n, stride) stride +#define fftwf_stride_destroy(p) ((void) p) +#define fftw_stride_destroy(p) ((void) p) +#define fftwl_stride_destroy(p) ((void) p) + +/* hackery to prevent the compiler from ``optimizing'' induction + variables in codelet loops. The problem is that for each K and for + each expression of the form P[I + STRIDE * K] in a loop, most + compilers will try to lift an induction variable PK := &P[I + STRIDE * K]. + For large values of K this behavior overflows the + register set, which is likely worse than doing the index computation + in the first place. + + If we guess that there are more than + ESTIMATED_AVAILABLE_INDEX_REGISTERS such pointers, we deliberately confuse + the compiler by setting STRIDE ^= ZERO, where ZERO is a value guaranteed to + be 0, but the compiler does not know this. + + 16 registers ought to be enough for anybody, or so the amd64 and ARM ISA's + seem to imply. +*/ +#define ESTIMATED_AVAILABLE_INDEX_REGISTERS 16 +#define MAKE_VOLATILE_STRIDE(nptr, x) \ + (nptr <= ESTIMATED_AVAILABLE_INDEX_REGISTERS ? \ + 0 : \ + ((x) = (x) ^ X(an_INT_guaranteed_to_be_zero))) +#endif /* PRECOMPUTE_ARRAY_INDICES */ + +/*-----------------------------------------------------------------------*/ +/* solvtab.c */ + +struct solvtab_s { void (*reg)(planner *); const char *reg_nam; }; +typedef struct solvtab_s solvtab[]; +void X(solvtab_exec)(const solvtab tbl, planner *p); +#define SOLVTAB(s) { s, STRINGIZE(s) } +#define SOLVTAB_END { 0, 0 } + +/*-----------------------------------------------------------------------*/ +/* pickdim.c */ +int X(pickdim)(int which_dim, const int *buddies, size_t nbuddies, + const tensor *sz, int oop, int *dp); + +/*-----------------------------------------------------------------------*/ +/* twiddle.c */ +/* little language to express twiddle factors computation */ +enum { TW_COS = 0, TW_SIN = 1, TW_CEXP = 2, TW_NEXT = 3, + TW_FULL = 4, TW_HALF = 5 }; + +typedef struct { + unsigned char op; + signed char v; + short i; +} tw_instr; + +typedef struct twid_s { + R *W; /* array of twiddle factors */ + INT n, r, m; /* transform order, radix, # twiddle rows */ + int refcnt; + const tw_instr *instr; + struct twid_s *cdr; + enum wakefulness wakefulness; +} twid; + +INT X(twiddle_length)(INT r, const tw_instr *p); +void X(twiddle_awake)(enum wakefulness wakefulness, + twid **pp, const tw_instr *instr, INT n, INT r, INT m); + +/*-----------------------------------------------------------------------*/ +/* trig.c */ +#if defined(TRIGREAL_IS_LONG_DOUBLE) + typedef long double trigreal; +#elif defined(TRIGREAL_IS_QUAD) + typedef __float128 trigreal; +#else + typedef double trigreal; +#endif + +typedef struct triggen_s triggen; + +struct triggen_s { + void (*cexp)(triggen *t, INT m, R *result); + void (*cexpl)(triggen *t, INT m, trigreal *result); + void (*rotate)(triggen *p, INT m, R xr, R xi, R *res); + + INT twshft; + INT twradix; + INT twmsk; + trigreal *W0, *W1; + INT n; +}; + +triggen *X(mktriggen)(enum wakefulness wakefulness, INT n); +void X(triggen_destroy)(triggen *p); + +/*-----------------------------------------------------------------------*/ +/* primes.c: */ + +#define MULMOD(x, y, p) \ + (((x) <= 92681 - (y)) ? ((x) * (y)) % (p) : X(safe_mulmod)(x, y, p)) + +INT X(safe_mulmod)(INT x, INT y, INT p); +INT X(power_mod)(INT n, INT m, INT p); +INT X(find_generator)(INT p); +INT X(first_divisor)(INT n); +int X(is_prime)(INT n); +INT X(next_prime)(INT n); +int X(factors_into)(INT n, const INT *primes); +int X(factors_into_small_primes)(INT n); +INT X(choose_radix)(INT r, INT n); +INT X(isqrt)(INT n); +INT X(modulo)(INT a, INT n); + +#define GENERIC_MIN_BAD 173 /* min prime for which generic becomes bad */ + +/* thresholds below which certain solvers are considered SLOW. These are guesses + believed to be conservative */ +#define GENERIC_MAX_SLOW 16 +#define RADER_MAX_SLOW 32 +#define BLUESTEIN_MAX_SLOW 24 + +/*-----------------------------------------------------------------------*/ +/* rader.c: */ +typedef struct rader_tls rader_tl; + +void X(rader_tl_insert)(INT k1, INT k2, INT k3, R *W, rader_tl **tl); +R *X(rader_tl_find)(INT k1, INT k2, INT k3, rader_tl *t); +void X(rader_tl_delete)(R *W, rader_tl **tl); + +/*-----------------------------------------------------------------------*/ +/* copy/transposition routines */ + +/* lower bound to the cache size, for tiled routines */ +#define CACHESIZE 8192 + +INT X(compute_tilesz)(INT vl, int how_many_tiles_in_cache); + +void X(tile2d)(INT n0l, INT n0u, INT n1l, INT n1u, INT tilesz, + void (*f)(INT n0l, INT n0u, INT n1l, INT n1u, void *args), + void *args); +void X(cpy1d)(R *I, R *O, INT n0, INT is0, INT os0, INT vl); +void X(zero1d_pair)(R *O0, R *O1, INT n0, INT os0); +void X(cpy2d)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl); +void X(cpy2d_ci)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl); +void X(cpy2d_co)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl); +void X(cpy2d_tiled)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl); +void X(cpy2d_tiledbuf)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl); +void X(cpy2d_pair)(R *I0, R *I1, R *O0, R *O1, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1); +void X(cpy2d_pair_ci)(R *I0, R *I1, R *O0, R *O1, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1); +void X(cpy2d_pair_co)(R *I0, R *I1, R *O0, R *O1, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1); + +void X(transpose)(R *I, INT n, INT s0, INT s1, INT vl); +void X(transpose_tiled)(R *I, INT n, INT s0, INT s1, INT vl); +void X(transpose_tiledbuf)(R *I, INT n, INT s0, INT s1, INT vl); + +typedef void (*transpose_func)(R *I, INT n, INT s0, INT s1, INT vl); +typedef void (*cpy2d_func)(R *I, R *O, + INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT vl); + +/*-----------------------------------------------------------------------*/ +/* misc stuff */ +void X(null_awake)(plan *ego, enum wakefulness wakefulness); +double X(iestimate_cost)(const planner *, const plan *, const problem *); + +#ifdef FFTW_RANDOM_ESTIMATOR +extern unsigned X(random_estimate_seed); +#endif + +double X(measure_execution_time)(const planner *plnr, + plan *pln, const problem *p); +IFFTW_EXTERN int X(ialignment_of)(R *p); +unsigned X(hash)(const char *s); +INT X(nbuf)(INT n, INT vl, INT maxnbuf); +int X(nbuf_redundant)(INT n, INT vl, size_t which, + const INT *maxnbuf, size_t nmaxnbuf); +INT X(bufdist)(INT n, INT vl); +int X(toobig)(INT n); +int X(ct_uglyp)(INT min_n, INT v, INT n, INT r); + +#if HAVE_SIMD +R *X(taint)(R *p, INT s); +R *X(join_taint)(R *p1, R *p2); +#define TAINT(p, s) X(taint)(p, s) +#define UNTAINT(p) ((R *) (((uintptr_t) (p)) & ~(uintptr_t)3)) +#define TAINTOF(p) (((uintptr_t)(p)) & 3) +#define JOIN_TAINT(p1, p2) X(join_taint)(p1, p2) +#else +#define TAINT(p, s) (p) +#define UNTAINT(p) (p) +#define TAINTOF(p) 0 +#define JOIN_TAINT(p1, p2) p1 +#endif + +#define ASSERT_ALIGNED_DOUBLE /*unused, legacy*/ + +/*-----------------------------------------------------------------------*/ +/* macros used in codelets to reduce source code size */ + +typedef R E; /* internal precision of codelets. */ + +#if defined(FFTW_LDOUBLE) +# define K(x) ((E) x##L) +#elif defined(FFTW_QUAD) +# define K(x) ((E) x##Q) +#else +# define K(x) ((E) x) +#endif +#define DK(name, value) const E name = K(value) + +/* FMA macros */ + +#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__) || defined(_POWER)) +/* The obvious expression a * b + c does not work. If both x = a * b + + c and y = a * b - c appear in the source, gcc computes t = a * b, + x = t + c, y = t - c, thus destroying the fma. + + This peculiar coding seems to do the right thing on all of + gcc-2.95, gcc-3.1, gcc-3.2, and gcc-3.3. It does the right thing + on gcc-3.4 -fno-web (because the ``web'' pass splits the variable + `x' for the single-assignment form). + + However, gcc-4.0 is a formidable adversary which succeeds in + pessimizing two fma's into one multiplication and two additions. + It does it very early in the game---before the optimization passes + even start. The only real workaround seems to use fake inline asm + such as + + asm ("# confuse gcc %0" : "=f"(a) : "0"(a)); + return a * b + c; + + in each of the FMA, FMS, FNMA, and FNMS functions. However, this + does not solve the problem either, because two equal asm statements + count as a common subexpression! One must use *different* fake asm + statements: + + in FMA: + asm ("# confuse gcc for fma %0" : "=f"(a) : "0"(a)); + + in FMS: + asm ("# confuse gcc for fms %0" : "=f"(a) : "0"(a)); + + etc. + + After these changes, gcc recalcitrantly generates the fma that was + in the source to begin with. However, the extra asm() cruft + confuses other passes of gcc, notably the instruction scheduler. + (Of course, one could also generate the fma directly via inline + asm, but this confuses the scheduler even more.) + + Steven and I have submitted more than one bug report to the gcc + mailing list over the past few years, to no effect. Thus, I give + up. gcc-4.0 can go to hell. I'll wait at least until gcc-4.3 is + out before touching this crap again. +*/ +static __inline__ E FMA(E a, E b, E c) +{ + E x = a * b; + x = x + c; + return x; +} + +static __inline__ E FMS(E a, E b, E c) +{ + E x = a * b; + x = x - c; + return x; +} + +static __inline__ E FNMA(E a, E b, E c) +{ + E x = a * b; + x = - (x + c); + return x; +} + +static __inline__ E FNMS(E a, E b, E c) +{ + E x = a * b; + x = - (x - c); + return x; +} +#else +#define FMA(a, b, c) (((a) * (b)) + (c)) +#define FMS(a, b, c) (((a) * (b)) - (c)) +#define FNMA(a, b, c) (- (((a) * (b)) + (c))) +#define FNMS(a, b, c) ((c) - ((a) * (b))) +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __IFFTW_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/kalloc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/kalloc.c new file mode 100644 index 000000000..e42f6f34d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/kalloc.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if defined(HAVE_MALLOC_H) +# include +#endif + +/* ``kernel'' malloc(), with proper memory alignment */ + +#if defined(HAVE_DECL_MEMALIGN) && !HAVE_DECL_MEMALIGN +extern void *memalign(size_t, size_t); +#endif + +#if defined(HAVE_DECL_POSIX_MEMALIGN) && !HAVE_DECL_POSIX_MEMALIGN +extern int posix_memalign(void **, size_t, size_t); +#endif + +#if defined(macintosh) /* MacOS 9 */ +# include +#endif + +#define real_free free /* memalign and malloc use ordinary free */ + +#define IS_POWER_OF_TWO(n) (((n) > 0) && (((n) & ((n) - 1)) == 0)) +#if defined(WITH_OUR_MALLOC) && (MIN_ALIGNMENT >= 8) && IS_POWER_OF_TWO(MIN_ALIGNMENT) +/* Our own MIN_ALIGNMENT-aligned malloc/free. Assumes sizeof(void*) is a + power of two <= 8 and that malloc is at least sizeof(void*)-aligned. + + The main reason for this routine is that, as of this writing, + Windows does not include any aligned allocation routines in its + system libraries, and instead provides an implementation with a + Visual C++ "Processor Pack" that you have to statically link into + your program. We do not want to require users to have VC++ + (e.g. gcc/MinGW should be fine). Our code should be at least as good + as the MS _aligned_malloc, in any case, according to second-hand + reports of the algorithm it employs (also based on plain malloc). */ +static void *our_malloc(size_t n) +{ + void *p0, *p; + if (!(p0 = malloc(n + MIN_ALIGNMENT))) return (void *) 0; + p = (void *) (((uintptr_t) p0 + MIN_ALIGNMENT) & (~((uintptr_t) (MIN_ALIGNMENT - 1)))); + *((void **) p - 1) = p0; + return p; +} +static void our_free(void *p) +{ + if (p) free(*((void **) p - 1)); +} +#endif + +void *X(kernel_malloc)(size_t n) +{ + void *p; + +#if defined(MIN_ALIGNMENT) + +# if defined(WITH_OUR_MALLOC) + p = our_malloc(n); +# undef real_free +# define real_free our_free + +# elif defined(__FreeBSD__) && (MIN_ALIGNMENT <= 16) + /* FreeBSD does not have memalign, but its malloc is 16-byte aligned. */ + p = malloc(n); + +# elif (defined(__MACOSX__) || defined(__APPLE__)) && (MIN_ALIGNMENT <= 16) + /* MacOS X malloc is already 16-byte aligned */ + p = malloc(n); + +# elif defined(HAVE_MEMALIGN) + p = memalign(MIN_ALIGNMENT, n); + +# elif defined(HAVE_POSIX_MEMALIGN) + /* note: posix_memalign is broken in glibc 2.2.5: it constrains + the size, not the alignment, to be (power of two) * sizeof(void*). + The bug seems to have been fixed as of glibc 2.3.1. */ + if (posix_memalign(&p, MIN_ALIGNMENT, n)) + p = (void*) 0; + +# elif defined(__ICC) || defined(__INTEL_COMPILER) || defined(HAVE__MM_MALLOC) + /* Intel's C compiler defines _mm_malloc and _mm_free intrinsics */ + p = (void *) _mm_malloc(n, MIN_ALIGNMENT); +# undef real_free +# define real_free _mm_free + +# elif defined(_MSC_VER) + /* MS Visual C++ 6.0 with a "Processor Pack" supports SIMD + and _aligned_malloc/free (uses malloc.h) */ + p = (void *) _aligned_malloc(n, MIN_ALIGNMENT); +# undef real_free +# define real_free _aligned_free + +# elif defined(macintosh) /* MacOS 9 */ + p = (void *) MPAllocateAligned(n, +# if MIN_ALIGNMENT == 8 + kMPAllocate8ByteAligned, +# elif MIN_ALIGNMENT == 16 + kMPAllocate16ByteAligned, +# elif MIN_ALIGNMENT == 32 + kMPAllocate32ByteAligned, +# else +# error "Unknown alignment for MPAllocateAligned" +# endif + 0); +# undef real_free +# define real_free MPFree + +# else + /* Add your machine here and send a patch to fftw@fftw.org + or (e.g. for Windows) configure --with-our-malloc */ +# error "Don't know how to malloc() aligned memory ... try configuring --with-our-malloc" +# endif + +#else /* !defined(MIN_ALIGNMENT) */ + p = malloc(n); +#endif + + return p; +} + +void X(kernel_free)(void *p) +{ + real_free(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/md5-1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/md5-1.c new file mode 100644 index 000000000..e34dddb9e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/md5-1.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + + +void X(md5putb)(md5 *p, const void *d_, size_t len) +{ + size_t i; + const unsigned char *d = (const unsigned char *)d_; + for (i = 0; i < len; ++i) + X(md5putc)(p, d[i]); +} + +void X(md5puts)(md5 *p, const char *s) +{ + /* also hash final '\0' */ + do { + X(md5putc)(p, (unsigned)(*s & 0xFF)); + } while(*s++); +} + +void X(md5int)(md5 *p, int i) +{ + X(md5putb)(p, &i, sizeof(i)); +} + +void X(md5INT)(md5 *p, INT i) +{ + X(md5putb)(p, &i, sizeof(i)); +} + +void X(md5unsigned)(md5 *p, unsigned i) +{ + X(md5putb)(p, &i, sizeof(i)); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/md5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/md5.c new file mode 100644 index 000000000..a3cf8e08f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/md5.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + independent implementation of Ron Rivest's MD5 message-digest + algorithm, based on rfc 1321. + + Optimized for small code size, not speed. Works as long as + sizeof(md5uint) >= 4. +*/ + +#include "kernel/ifftw.h" + +/* sintab[i] = 4294967296.0 * abs(sin((double)(i + 1))) */ +static const md5uint sintab[64] = { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +}; + +/* see rfc 1321 section 3.4 */ +static const struct roundtab { + char k; + char s; +} roundtab[64] = { + { 0, 7}, { 1, 12}, { 2, 17}, { 3, 22}, + { 4, 7}, { 5, 12}, { 6, 17}, { 7, 22}, + { 8, 7}, { 9, 12}, { 10, 17}, { 11, 22}, + { 12, 7}, { 13, 12}, { 14, 17}, { 15, 22}, + { 1, 5}, { 6, 9}, { 11, 14}, { 0, 20}, + { 5, 5}, { 10, 9}, { 15, 14}, { 4, 20}, + { 9, 5}, { 14, 9}, { 3, 14}, { 8, 20}, + { 13, 5}, { 2, 9}, { 7, 14}, { 12, 20}, + { 5, 4}, { 8, 11}, { 11, 16}, { 14, 23}, + { 1, 4}, { 4, 11}, { 7, 16}, { 10, 23}, + { 13, 4}, { 0, 11}, { 3, 16}, { 6, 23}, + { 9, 4}, { 12, 11}, { 15, 16}, { 2, 23}, + { 0, 6}, { 7, 10}, { 14, 15}, { 5, 21}, + { 12, 6}, { 3, 10}, { 10, 15}, { 1, 21}, + { 8, 6}, { 15, 10}, { 6, 15}, { 13, 21}, + { 4, 6}, { 11, 10}, { 2, 15}, { 9, 21} +}; + +#define rol(a, s) ((a << (int)(s)) | (a >> (32 - (int)(s)))) + +static void doblock(md5sig state, const unsigned char *data) +{ + md5uint a, b, c, d, t, x[16]; + const md5uint msk = (md5uint)0xffffffffUL; + int i; + + /* encode input bytes into md5uint */ + for (i = 0; i < 16; ++i) { + const unsigned char *p = data + 4 * i; + x[i] = (unsigned)p[0] | ((unsigned)p[1] << 8) | ((unsigned)p[2] << 16) | ((unsigned)p[3] << 24); + } + + a = state[0]; b = state[1]; c = state[2]; d = state[3]; + for (i = 0; i < 64; ++i) { + const struct roundtab *p = roundtab + i; + switch (i >> 4) { + case 0: a += (b & c) | (~b & d); break; + case 1: a += (b & d) | (c & ~d); break; + case 2: a += b ^ c ^ d; break; + case 3: a += c ^ (b | ~d); break; + } + a += sintab[i]; + a += x[(int)(p->k)]; + a &= msk; + t = b + rol(a, p->s); + a = d; d = c; c = b; b = t; + } + state[0] = (state[0] + a) & msk; + state[1] = (state[1] + b) & msk; + state[2] = (state[2] + c) & msk; + state[3] = (state[3] + d) & msk; +} + + +void X(md5begin)(md5 *p) +{ + p->s[0] = 0x67452301; + p->s[1] = 0xefcdab89; + p->s[2] = 0x98badcfe; + p->s[3] = 0x10325476; + p->l = 0; +} + +void X(md5putc)(md5 *p, unsigned char c) +{ + p->c[p->l % 64] = c; + if (((++p->l) % 64) == 0) doblock(p->s, p->c); +} + +void X(md5end)(md5 *p) +{ + unsigned l, i; + + l = 8 * p->l; /* length before padding, in bits */ + + /* rfc 1321 section 3.1: padding */ + X(md5putc)(p, 0x80); + while ((p->l % 64) != 56) X(md5putc)(p, 0x00); + + /* rfc 1321 section 3.2: length (little endian) */ + for (i = 0; i < 8; ++i) { + X(md5putc)(p, (unsigned char)(l & 0xFF)); + l = l >> 8; + } + + /* Now p->l % 64 == 0 and signature is in p->s */ +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/minmax.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/minmax.c new file mode 100644 index 000000000..2fb6ad1e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/minmax.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +INT X(imax)(INT a, INT b) +{ + return (a > b) ? a : b; +} + +INT X(imin)(INT a, INT b) +{ + return (a < b) ? a : b; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ops.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ops.c new file mode 100644 index 000000000..a955df407 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/ops.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +void X(ops_zero)(opcnt *dst) +{ + dst->add = dst->mul = dst->fma = dst->other = 0; +} + +void X(ops_cpy)(const opcnt *src, opcnt *dst) +{ + *dst = *src; +} + +void X(ops_other)(INT o, opcnt *dst) +{ + X(ops_zero)(dst); + dst->other = o; +} + +void X(ops_madd)(INT m, const opcnt *a, const opcnt *b, opcnt *dst) +{ + dst->add = m * a->add + b->add; + dst->mul = m * a->mul + b->mul; + dst->fma = m * a->fma + b->fma; + dst->other = m * a->other + b->other; +} + +void X(ops_add)(const opcnt *a, const opcnt *b, opcnt *dst) +{ + X(ops_madd)(1, a, b, dst); +} + +void X(ops_add2)(const opcnt *a, opcnt *dst) +{ + X(ops_add)(a, dst, dst); +} + +void X(ops_madd2)(INT m, const opcnt *a, opcnt *dst) +{ + X(ops_madd)(m, a, dst, dst); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/pickdim.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/pickdim.c new file mode 100644 index 000000000..4ae6c0029 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/pickdim.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + + +/* Given a solver which_dim, a vector sz, and whether or not the + transform is out-of-place, return the actual dimension index that + it corresponds to. The basic idea here is that we return the + which_dim'th valid dimension, starting from the end if + which_dim < 0. */ +static int really_pickdim(int which_dim, const tensor *sz, int oop, int *dp) +{ + int i; + int count_ok = 0; + if (which_dim > 0) { + for (i = 0; i < sz->rnk; ++i) { + if (oop || sz->dims[i].is == sz->dims[i].os) + if (++count_ok == which_dim) { + *dp = i; + return 1; + } + } + } + else if (which_dim < 0) { + for (i = sz->rnk - 1; i >= 0; --i) { + if (oop || sz->dims[i].is == sz->dims[i].os) + if (++count_ok == -which_dim) { + *dp = i; + return 1; + } + } + } + else { /* zero: pick the middle, if valid */ + i = (sz->rnk - 1) / 2; + if (i >= 0 && (oop || sz->dims[i].is == sz->dims[i].os)) { + *dp = i; + return 1; + } + } + return 0; +} + +/* Like really_pickdim, but only returns 1 if no previous "buddy" + which_dim in the buddies list would give the same dim. */ +int X(pickdim)(int which_dim, const int *buddies, size_t nbuddies, + const tensor *sz, int oop, int *dp) +{ + size_t i; + int d1; + + if (!really_pickdim(which_dim, sz, oop, dp)) + return 0; + + /* check whether some buddy solver would produce the same dim. + If so, consider this solver unapplicable and let the buddy + take care of it. The smallest-indexed buddy is applicable. */ + for (i = 0; i < nbuddies; ++i) { + if (buddies[i] == which_dim) + break; /* found self */ + if (really_pickdim(buddies[i], sz, oop, &d1) && *dp == d1) + return 0; /* found equivalent buddy */ + } + return 1; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/plan.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/plan.c new file mode 100644 index 000000000..133248430 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/plan.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +/* "Plan: To bother about the best method of accomplishing an + accidental result." (Ambrose Bierce, The Enlarged Devil's + Dictionary). */ + +plan *X(mkplan)(size_t size, const plan_adt *adt) +{ + plan *p = (plan *)MALLOC(size, PLANS); + + A(adt->destroy); + p->adt = adt; + X(ops_zero)(&p->ops); + p->pcost = 0.0; + p->wakefulness = SLEEPY; + p->could_prune_now_p = 0; + + return p; +} + +/* + * destroy a plan + */ +void X(plan_destroy_internal)(plan *ego) +{ + if (ego) { + A(ego->wakefulness == SLEEPY); + ego->adt->destroy(ego); + X(ifree)(ego); + } +} + +/* dummy destroy routine for plans with no local state */ +void X(plan_null_destroy)(plan *ego) +{ + UNUSED(ego); + /* nothing */ +} + +void X(plan_awake)(plan *ego, enum wakefulness wakefulness) +{ + if (ego) { + A(((wakefulness == SLEEPY) ^ (ego->wakefulness == SLEEPY))); + + ego->adt->awake(ego, wakefulness); + ego->wakefulness = wakefulness; + } +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/planner.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/planner.c new file mode 100644 index 000000000..9c7129052 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/planner.c @@ -0,0 +1,1035 @@ +/* + * Copyright (c) 2000 Matteo Frigo + * Copyright (c) 2000 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" +#include + +/* GNU Coding Standards, Sec. 5.2: "Please write the comments in a GNU + program in English, because English is the one language that nearly + all programmers in all countries can read." + + ingemisco tanquam reus + culpa rubet vultus meus + supplicanti parce [rms] +*/ + +#define VALIDP(solution) ((solution)->flags.hash_info & H_VALID) +#define LIVEP(solution) ((solution)->flags.hash_info & H_LIVE) +#define SLVNDX(solution) ((solution)->flags.slvndx) +#define BLISS(flags) (((flags).hash_info) & BLESSING) +#define INFEASIBLE_SLVNDX ((1U<timelimit_impatience == 0); + return (LEQ(a->u, b->u) && LEQ(b->l, a->l)); + } else { + return (LEQ(a->l, b->l) + && a->timelimit_impatience <= b->timelimit_impatience); + } +} + +static unsigned addmod(unsigned a, unsigned b, unsigned p) +{ + /* gcc-2.95/sparc produces incorrect code for the fast version below. */ +#if defined(__sparc__) && defined(__GNUC__) + /* slow version */ + return (a + b) % p; +#else + /* faster version */ + unsigned c = a + b; + return c >= p ? c - p : c; +#endif +} + +/* + slvdesc management: +*/ +static void sgrow(planner *ego) +{ + unsigned osiz = ego->slvdescsiz, nsiz = 1 + osiz + osiz / 4; + slvdesc *ntab = (slvdesc *)MALLOC(nsiz * sizeof(slvdesc), SLVDESCS); + slvdesc *otab = ego->slvdescs; + unsigned i; + + ego->slvdescs = ntab; + ego->slvdescsiz = nsiz; + for (i = 0; i < osiz; ++i) + ntab[i] = otab[i]; + X(ifree0)(otab); +} + +static void register_solver(planner *ego, solver *s) +{ + slvdesc *n; + int kind; + + if (s) { /* add s to solver list */ + X(solver_use)(s); + + A(ego->nslvdesc < INFEASIBLE_SLVNDX); + if (ego->nslvdesc >= ego->slvdescsiz) + sgrow(ego); + + n = ego->slvdescs + ego->nslvdesc; + + n->slv = s; + n->reg_nam = ego->cur_reg_nam; + n->reg_id = ego->cur_reg_id++; + + A(strlen(n->reg_nam) < MAXNAM); + n->nam_hash = X(hash)(n->reg_nam); + + kind = s->adt->problem_kind; + n->next_for_same_problem_kind = ego->slvdescs_for_problem_kind[kind]; + ego->slvdescs_for_problem_kind[kind] = (int)/*from unsigned*/ego->nslvdesc; + + ego->nslvdesc++; + } +} + +static unsigned slookup(planner *ego, char *nam, int id) +{ + unsigned h = X(hash)(nam); /* used to avoid strcmp in the common case */ + FORALL_SOLVERS(ego, s, sp, { + UNUSED(s); + if (sp->reg_id == id && sp->nam_hash == h + && !strcmp(sp->reg_nam, nam)) + return (unsigned)/*from ptrdiff_t*/(sp - ego->slvdescs); + }); + return INFEASIBLE_SLVNDX; +} + +/* Compute a MD5 hash of the configuration of the planner. + We store it into the wisdom file to make absolutely sure that + we are reading wisdom that is applicable */ +static void signature_of_configuration(md5 *m, planner *ego) +{ + X(md5begin)(m); + X(md5unsigned)(m, sizeof(R)); /* so we don't mix different precisions */ + FORALL_SOLVERS(ego, s, sp, { + UNUSED(s); + X(md5int)(m, sp->reg_id); + X(md5puts)(m, sp->reg_nam); + }); + X(md5end)(m); +} + +/* + md5-related stuff: +*/ + +/* first hash function */ +static unsigned h1(const hashtab *ht, const md5sig s) +{ + unsigned h = s[0] % ht->hashsiz; + A(h == (s[0] % ht->hashsiz)); + return h; +} + +/* second hash function (for double hashing) */ +static unsigned h2(const hashtab *ht, const md5sig s) +{ + unsigned h = 1U + s[1] % (ht->hashsiz - 1); + A(h == (1U + s[1] % (ht->hashsiz - 1))); + return h; +} + +static void md5hash(md5 *m, const problem *p, const planner *plnr) +{ + X(md5begin)(m); + X(md5unsigned)(m, sizeof(R)); /* so we don't mix different precisions */ + X(md5int)(m, plnr->nthr); + p->adt->hash(p, m); + X(md5end)(m); +} + +static int md5eq(const md5sig a, const md5sig b) +{ + return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3]; +} + +static void sigcpy(const md5sig a, md5sig b) +{ + b[0] = a[0]; b[1] = a[1]; b[2] = a[2]; b[3] = a[3]; +} + +/* + memoization routines : +*/ + +/* + liber scriptus proferetur + in quo totum continetur + unde mundus iudicetur +*/ +struct solution_s { + md5sig s; + flags_t flags; +}; + +static solution *htab_lookup(hashtab *ht, const md5sig s, + const flags_t *flagsp) +{ + unsigned g, h = h1(ht, s), d = h2(ht, s); + solution *best = 0; + + ++ht->lookup; + + /* search all entries that match; select the one with + the lowest flags.u */ + /* This loop may potentially traverse the whole table, since at + least one element is guaranteed to be !LIVEP, but all elements + may be VALIDP. Hence, we stop after at the first invalid + element or after traversing the whole table. */ + g = h; + do { + solution *l = ht->solutions + g; + ++ht->lookup_iter; + if (VALIDP(l)) { + if (LIVEP(l) + && md5eq(s, l->s) + && subsumes(&l->flags, SLVNDX(l), flagsp) ) { + if (!best || LEQ(l->flags.u, best->flags.u)) + best = l; + } + } else + break; + + g = addmod(g, d, ht->hashsiz); + } while (g != h); + + if (best) + ++ht->succ_lookup; + return best; +} + +static solution *hlookup(planner *ego, const md5sig s, + const flags_t *flagsp) +{ + solution *sol = htab_lookup(&ego->htab_blessed, s, flagsp); + if (!sol) sol = htab_lookup(&ego->htab_unblessed, s, flagsp); + return sol; +} + +static void fill_slot(hashtab *ht, const md5sig s, const flags_t *flagsp, + unsigned slvndx, solution *slot) +{ + ++ht->insert; + ++ht->nelem; + A(!LIVEP(slot)); + slot->flags.u = flagsp->u; + slot->flags.l = flagsp->l; + slot->flags.timelimit_impatience = flagsp->timelimit_impatience; + slot->flags.hash_info |= H_VALID | H_LIVE; + SLVNDX(slot) = slvndx; + + /* keep this check enabled in case we add so many solvers + that the bitfield overflows */ + CK(SLVNDX(slot) == slvndx); + sigcpy(s, slot->s); +} + +static void kill_slot(hashtab *ht, solution *slot) +{ + A(LIVEP(slot)); /* ==> */ A(VALIDP(slot)); + + --ht->nelem; + slot->flags.hash_info = H_VALID; +} + +static void hinsert0(hashtab *ht, const md5sig s, const flags_t *flagsp, + unsigned slvndx) +{ + solution *l; + unsigned g, h = h1(ht, s), d = h2(ht, s); + + ++ht->insert_unknown; + + /* search for nonfull slot */ + for (g = h; ; g = addmod(g, d, ht->hashsiz)) { + ++ht->insert_iter; + l = ht->solutions + g; + if (!LIVEP(l)) break; + A((g + d) % ht->hashsiz != h); + } + + fill_slot(ht, s, flagsp, slvndx, l); +} + +static void rehash(hashtab *ht, unsigned nsiz) +{ + unsigned osiz = ht->hashsiz, h; + solution *osol = ht->solutions, *nsol; + + nsiz = (unsigned)X(next_prime)((INT)nsiz); + nsol = (solution *)MALLOC(nsiz * sizeof(solution), HASHT); + ++ht->nrehash; + + /* init new table */ + for (h = 0; h < nsiz; ++h) + nsol[h].flags.hash_info = 0; + + /* install new table */ + ht->hashsiz = nsiz; + ht->solutions = nsol; + ht->nelem = 0; + + /* copy table */ + for (h = 0; h < osiz; ++h) { + solution *l = osol + h; + if (LIVEP(l)) + hinsert0(ht, l->s, &l->flags, SLVNDX(l)); + } + + X(ifree0)(osol); +} + +static unsigned minsz(unsigned nelem) +{ + return 1U + nelem + nelem / 8U; +} + +static unsigned nextsz(unsigned nelem) +{ + return minsz(minsz(nelem)); +} + +static void hgrow(hashtab *ht) +{ + unsigned nelem = ht->nelem; + if (minsz(nelem) >= ht->hashsiz) + rehash(ht, nextsz(nelem)); +} + +#if 0 +/* shrink the hash table, never used */ +static void hshrink(hashtab *ht) +{ + unsigned nelem = ht->nelem; + /* always rehash after deletions */ + rehash(ht, nextsz(nelem)); +} +#endif + +static void htab_insert(hashtab *ht, const md5sig s, const flags_t *flagsp, + unsigned slvndx) +{ + unsigned g, h = h1(ht, s), d = h2(ht, s); + solution *first = 0; + + /* Remove all entries that are subsumed by the new one. */ + /* This loop may potentially traverse the whole table, since at + least one element is guaranteed to be !LIVEP, but all elements + may be VALIDP. Hence, we stop after at the first invalid + element or after traversing the whole table. */ + g = h; + do { + solution *l = ht->solutions + g; + ++ht->insert_iter; + if (VALIDP(l)) { + if (LIVEP(l) && md5eq(s, l->s)) { + if (subsumes(flagsp, slvndx, &l->flags)) { + if (!first) first = l; + kill_slot(ht, l); + } else { + /* It is an error to insert an element that + is subsumed by an existing entry. */ + A(!subsumes(&l->flags, SLVNDX(l), flagsp)); + } + } + } else + break; + + g = addmod(g, d, ht->hashsiz); + } while (g != h); + + if (first) { + /* overwrite FIRST */ + fill_slot(ht, s, flagsp, slvndx, first); + } else { + /* create a new entry */ + hgrow(ht); + hinsert0(ht, s, flagsp, slvndx); + } +} + +static void hinsert(planner *ego, const md5sig s, const flags_t *flagsp, + unsigned slvndx) +{ + htab_insert(BLISS(*flagsp) ? &ego->htab_blessed : &ego->htab_unblessed, + s, flagsp, slvndx ); +} + + +static void invoke_hook(planner *ego, plan *pln, const problem *p, + int optimalp) +{ + if (ego->hook) + ego->hook(ego, pln, p, optimalp); +} + +#ifdef FFTW_RANDOM_ESTIMATOR +/* a "random" estimate, used for debugging to generate "random" + plans, albeit from a deterministic seed. */ + +unsigned X(random_estimate_seed) = 0; + +static double random_estimate(const planner *ego, const plan *pln, + const problem *p) +{ + md5 m; + X(md5begin)(&m); + X(md5unsigned)(&m, X(random_estimate_seed)); + X(md5int)(&m, ego->nthr); + p->adt->hash(p, &m); + X(md5putb)(&m, &pln->ops, sizeof(pln->ops)); + X(md5putb)(&m, &pln->adt, sizeof(pln->adt)); + X(md5end)(&m); + return ego->cost_hook ? ego->cost_hook(p, m.s[0], COST_MAX) : m.s[0]; +} + +#endif + +double X(iestimate_cost)(const planner *ego, const plan *pln, const problem *p) +{ + double cost = + + pln->ops.add + + pln->ops.mul + +#if HAVE_FMA + + pln->ops.fma +#else + + 2 * pln->ops.fma +#endif + + + pln->ops.other; + if (ego->cost_hook) + cost = ego->cost_hook(p, cost, COST_MAX); + return cost; +} + +static void evaluate_plan(planner *ego, plan *pln, const problem *p) +{ + if (ESTIMATEP(ego) || !BELIEVE_PCOSTP(ego) || pln->pcost == 0.0) { + ego->nplan++; + + if (ESTIMATEP(ego)) { + estimate: + /* heuristic */ +#ifdef FFTW_RANDOM_ESTIMATOR + pln->pcost = random_estimate(ego, pln, p); + ego->epcost += X(iestimate_cost)(ego, pln, p); +#else + pln->pcost = X(iestimate_cost)(ego, pln, p); + ego->epcost += pln->pcost; +#endif + } else { + double t = X(measure_execution_time)(ego, pln, p); + + if (t < 0) { /* unavailable cycle counter */ + /* Real programmers can write FORTRAN in any language */ + goto estimate; + } + + pln->pcost = t; + ego->pcost += t; + ego->need_timeout_check = 1; + } + } + + invoke_hook(ego, pln, p, 0); +} + +/* maintain dynamic scoping of flags, nthr: */ +static plan *invoke_solver(planner *ego, const problem *p, solver *s, + const flags_t *nflags) +{ + flags_t flags = ego->flags; + int nthr = ego->nthr; + plan *pln; + ego->flags = *nflags; + PLNR_TIMELIMIT_IMPATIENCE(ego) = 0; + A(p->adt->problem_kind == s->adt->problem_kind); + pln = s->adt->mkplan(s, p, ego); + ego->nthr = nthr; + ego->flags = flags; + return pln; +} + +/* maintain the invariant TIMED_OUT ==> NEED_TIMEOUT_CHECK */ +static int timeout_p(planner *ego, const problem *p) +{ + /* do not timeout when estimating. First, the estimator is the + planner of last resort. Second, calling X(elapsed_since)() is + slower than estimating */ + if (!ESTIMATEP(ego)) { + /* do not assume that X(elapsed_since)() is monotonic */ + if (ego->timed_out) { + A(ego->need_timeout_check); + return 1; + } + + if (ego->timelimit >= 0 && + X(elapsed_since)(ego, p, ego->start_time) >= ego->timelimit) { + ego->timed_out = 1; + ego->need_timeout_check = 1; + return 1; + } + } + + A(!ego->timed_out); + ego->need_timeout_check = 0; + return 0; +} + +static plan *search0(planner *ego, const problem *p, unsigned *slvndx, + const flags_t *flagsp) +{ + plan *best = 0; + int best_not_yet_timed = 1; + + /* Do not start a search if the planner timed out. This check is + necessary, lest the relaxation mechanism kick in */ + if (timeout_p(ego, p)) + return 0; + + FORALL_SOLVERS_OF_KIND(p->adt->problem_kind, ego, s, sp, { + plan *pln; + + pln = invoke_solver(ego, p, s, flagsp); + + if (ego->need_timeout_check) + if (timeout_p(ego, p)) { + X(plan_destroy_internal)(pln); + X(plan_destroy_internal)(best); + return 0; + } + + if (pln) { + /* read COULD_PRUNE_NOW_P because PLN may be destroyed + before we use COULD_PRUNE_NOW_P */ + int could_prune_now_p = pln->could_prune_now_p; + + if (best) { + if (best_not_yet_timed) { + evaluate_plan(ego, best, p); + best_not_yet_timed = 0; + } + evaluate_plan(ego, pln, p); + if (pln->pcost < best->pcost) { + X(plan_destroy_internal)(best); + best = pln; + *slvndx = (unsigned)/*from ptrdiff_t*/(sp - ego->slvdescs); + } else { + X(plan_destroy_internal)(pln); + } + } else { + best = pln; + *slvndx = (unsigned)/*from ptrdiff_t*/(sp - ego->slvdescs); + } + + if (ALLOW_PRUNINGP(ego) && could_prune_now_p) + break; + } + }); + + return best; +} + +static plan *search(planner *ego, const problem *p, unsigned *slvndx, + flags_t *flagsp) +{ + plan *pln = 0; + unsigned i; + + /* relax impatience in this order: */ + static const unsigned relax_tab[] = { + 0, /* relax nothing */ + NO_VRECURSE, + NO_FIXED_RADIX_LARGE_N, + NO_SLOW, + NO_UGLY + }; + + unsigned l_orig = flagsp->l; + unsigned x = flagsp->u; + + /* guaranteed to be different from X */ + unsigned last_x = ~x; + + for (i = 0; i < sizeof(relax_tab) / sizeof(relax_tab[0]); ++i) { + if (LEQ(l_orig, x & ~relax_tab[i])) + x = x & ~relax_tab[i]; + + if (x != last_x) { + last_x = x; + flagsp->l = x; + pln = search0(ego, p, slvndx, flagsp); + if (pln) break; + } + } + + if (!pln) { + /* search [L_ORIG, U] */ + if (l_orig != last_x) { + last_x = l_orig; + flagsp->l = l_orig; + pln = search0(ego, p, slvndx, flagsp); + } + } + + return pln; +} + +#define CHECK_FOR_BOGOSITY \ + if ((ego->bogosity_hook ? \ + (ego->wisdom_state = ego->bogosity_hook(ego->wisdom_state, p)) \ + : ego->wisdom_state) == WISDOM_IS_BOGUS) \ + goto wisdom_is_bogus; + +static plan *mkplan(planner *ego, const problem *p) +{ + plan *pln; + md5 m; + unsigned slvndx; + flags_t flags_of_solution; + solution *sol; + solver *s; + + ASSERT_ALIGNED_DOUBLE; + A(LEQ(PLNR_L(ego), PLNR_U(ego))); + + if (ESTIMATEP(ego)) + PLNR_TIMELIMIT_IMPATIENCE(ego) = 0; /* canonical form */ + + +#ifdef FFTW_DEBUG + check(&ego->htab_blessed); + check(&ego->htab_unblessed); +#endif + + pln = 0; + + CHECK_FOR_BOGOSITY; + + ego->timed_out = 0; + + ++ego->nprob; + md5hash(&m, p, ego); + + flags_of_solution = ego->flags; + + if (ego->wisdom_state != WISDOM_IGNORE_ALL) { + if ((sol = hlookup(ego, m.s, &flags_of_solution))) { + /* wisdom is acceptable */ + wisdom_state_t owisdom_state = ego->wisdom_state; + + /* this hook is mainly for MPI, to make sure that + wisdom is in sync across all processes for MPI problems */ + if (ego->wisdom_ok_hook && !ego->wisdom_ok_hook(p, sol->flags)) + goto do_search; /* ignore not-ok wisdom */ + + slvndx = SLVNDX(sol); + + if (slvndx == INFEASIBLE_SLVNDX) { + if (ego->wisdom_state == WISDOM_IGNORE_INFEASIBLE) + goto do_search; + else + return 0; /* known to be infeasible */ + } + + flags_of_solution = sol->flags; + + /* inherit blessing either from wisdom + or from the planner */ + flags_of_solution.hash_info |= BLISS(ego->flags); + + ego->wisdom_state = WISDOM_ONLY; + + s = ego->slvdescs[slvndx].slv; + if (p->adt->problem_kind != s->adt->problem_kind) + goto wisdom_is_bogus; + + pln = invoke_solver(ego, p, s, &flags_of_solution); + + CHECK_FOR_BOGOSITY; /* catch error in child solvers */ + + sol = 0; /* Paranoia: SOL may be dangling after + invoke_solver(); make sure we don't accidentally + reuse it. */ + + if (!pln) + goto wisdom_is_bogus; + + ego->wisdom_state = owisdom_state; + + goto skip_search; + } + else if (ego->nowisdom_hook) /* for MPI, make sure lack of wisdom */ + ego->nowisdom_hook(p); /* is in sync across all processes */ + } + + do_search: + /* cannot search in WISDOM_ONLY mode */ + if (ego->wisdom_state == WISDOM_ONLY) + goto wisdom_is_bogus; + + flags_of_solution = ego->flags; + pln = search(ego, p, &slvndx, &flags_of_solution); + CHECK_FOR_BOGOSITY; /* catch error in child solvers */ + + if (ego->timed_out) { + A(!pln); + if (PLNR_TIMELIMIT_IMPATIENCE(ego) != 0) { + /* record (below) that this plan has failed because of + timeout */ + flags_of_solution.hash_info |= BLESSING; + } else { + /* this is not the top-level problem or timeout is not + active: record no wisdom. */ + return 0; + } + } else { + /* canonicalize to infinite timeout */ + flags_of_solution.timelimit_impatience = 0; + } + + skip_search: + if (ego->wisdom_state == WISDOM_NORMAL || + ego->wisdom_state == WISDOM_ONLY) { + if (pln) { + hinsert(ego, m.s, &flags_of_solution, slvndx); + invoke_hook(ego, pln, p, 1); + } else { + hinsert(ego, m.s, &flags_of_solution, INFEASIBLE_SLVNDX); + } + } + + return pln; + + wisdom_is_bogus: + X(plan_destroy_internal)(pln); + ego->wisdom_state = WISDOM_IS_BOGUS; + return 0; +} + +static void htab_destroy(hashtab *ht) +{ + X(ifree)(ht->solutions); + ht->solutions = 0; + ht->nelem = 0U; +} + +static void mkhashtab(hashtab *ht) +{ + ht->nrehash = 0; + ht->succ_lookup = ht->lookup = ht->lookup_iter = 0; + ht->insert = ht->insert_iter = ht->insert_unknown = 0; + + ht->solutions = 0; + ht->hashsiz = ht->nelem = 0U; + hgrow(ht); /* so that hashsiz > 0 */ +} + +/* destroy hash table entries. If FORGET_EVERYTHING, destroy the whole + table. If FORGET_ACCURSED, then destroy entries that are not blessed. */ +static void forget(planner *ego, amnesia a) +{ + switch (a) { + case FORGET_EVERYTHING: + htab_destroy(&ego->htab_blessed); + mkhashtab(&ego->htab_blessed); + /* fall through */ + case FORGET_ACCURSED: + htab_destroy(&ego->htab_unblessed); + mkhashtab(&ego->htab_unblessed); + break; + default: + break; + } +} + +/* FIXME: what sort of version information should we write? */ +#define WISDOM_PREAMBLE PACKAGE "-" VERSION " " STRINGIZE(X(wisdom)) +static const char stimeout[] = "TIMEOUT"; + +/* tantus labor non sit cassus */ +static void exprt(planner *ego, printer *p) +{ + unsigned h; + hashtab *ht = &ego->htab_blessed; + md5 m; + + signature_of_configuration(&m, ego); + + p->print(p, + "(" WISDOM_PREAMBLE " #x%M #x%M #x%M #x%M\n", + m.s[0], m.s[1], m.s[2], m.s[3]); + + for (h = 0; h < ht->hashsiz; ++h) { + solution *l = ht->solutions + h; + if (LIVEP(l)) { + const char *reg_nam; + int reg_id; + + if (SLVNDX(l) == INFEASIBLE_SLVNDX) { + reg_nam = stimeout; + reg_id = 0; + } else { + slvdesc *sp = ego->slvdescs + SLVNDX(l); + reg_nam = sp->reg_nam; + reg_id = sp->reg_id; + } + + /* qui salvandos salvas gratis + salva me fons pietatis */ + p->print(p, " (%s %d #x%x #x%x #x%x #x%M #x%M #x%M #x%M)\n", + reg_nam, reg_id, + l->flags.l, l->flags.u, l->flags.timelimit_impatience, + l->s[0], l->s[1], l->s[2], l->s[3]); + } + } + p->print(p, ")\n"); +} + +/* mors stupebit et natura + cum resurget creatura */ +static int imprt(planner *ego, scanner *sc) +{ + char buf[MAXNAM + 1]; + md5uint sig[4]; + unsigned l, u, timelimit_impatience; + flags_t flags; + int reg_id; + unsigned slvndx; + hashtab *ht = &ego->htab_blessed; + hashtab old; + md5 m; + + if (!sc->scan(sc, + "(" WISDOM_PREAMBLE " #x%M #x%M #x%M #x%M\n", + sig + 0, sig + 1, sig + 2, sig + 3)) + return 0; /* don't need to restore hashtable */ + + signature_of_configuration(&m, ego); + if (m.s[0] != sig[0] || m.s[1] != sig[1] || + m.s[2] != sig[2] || m.s[3] != sig[3]) { + /* invalid configuration */ + return 0; + } + + /* make a backup copy of the hash table (cache the hash) */ + { + unsigned h, hsiz = ht->hashsiz; + old = *ht; + old.solutions = (solution *)MALLOC(hsiz * sizeof(solution), HASHT); + for (h = 0; h < hsiz; ++h) + old.solutions[h] = ht->solutions[h]; + } + + while (1) { + if (sc->scan(sc, ")")) + break; + + /* qua resurget ex favilla */ + if (!sc->scan(sc, "(%*s %d #x%x #x%x #x%x #x%M #x%M #x%M #x%M)", + MAXNAM, buf, ®_id, &l, &u, &timelimit_impatience, + sig + 0, sig + 1, sig + 2, sig + 3)) + goto bad; + + if (!strcmp(buf, stimeout) && reg_id == 0) { + slvndx = INFEASIBLE_SLVNDX; + } else { + if (timelimit_impatience != 0) + goto bad; + + slvndx = slookup(ego, buf, reg_id); + if (slvndx == INFEASIBLE_SLVNDX) + goto bad; + } + + /* inter oves locum praesta */ + flags.l = l; + flags.u = u; + flags.timelimit_impatience = timelimit_impatience; + flags.hash_info = BLESSING; + + CK(flags.l == l); + CK(flags.u == u); + CK(flags.timelimit_impatience == timelimit_impatience); + + if (!hlookup(ego, sig, &flags)) + hinsert(ego, sig, &flags, slvndx); + } + + X(ifree0)(old.solutions); + return 1; + + bad: + /* ``The wisdom of FFTW must be above suspicion.'' */ + X(ifree0)(ht->solutions); + *ht = old; + return 0; +} + +/* + * create a planner + */ +planner *X(mkplanner)(void) +{ + int i; + + static const planner_adt padt = { + register_solver, mkplan, forget, exprt, imprt + }; + + planner *p = (planner *) MALLOC(sizeof(planner), PLANNERS); + + p->adt = &padt; + p->nplan = p->nprob = 0; + p->pcost = p->epcost = 0.0; + p->hook = 0; + p->cost_hook = 0; + p->wisdom_ok_hook = 0; + p->nowisdom_hook = 0; + p->bogosity_hook = 0; + p->cur_reg_nam = 0; + p->wisdom_state = WISDOM_NORMAL; + + p->slvdescs = 0; + p->nslvdesc = p->slvdescsiz = 0; + + p->flags.l = 0; + p->flags.u = 0; + p->flags.timelimit_impatience = 0; + p->flags.hash_info = 0; + p->nthr = 1; + p->need_timeout_check = 1; + p->timelimit = -1; + + mkhashtab(&p->htab_blessed); + mkhashtab(&p->htab_unblessed); + + for (i = 0; i < PROBLEM_LAST; ++i) + p->slvdescs_for_problem_kind[i] = -1; + + return p; +} + +void X(planner_destroy)(planner *ego) +{ + /* destroy hash table */ + htab_destroy(&ego->htab_blessed); + htab_destroy(&ego->htab_unblessed); + + /* destroy solvdesc table */ + FORALL_SOLVERS(ego, s, sp, { + UNUSED(sp); + X(solver_destroy)(s); + }); + + X(ifree0)(ego->slvdescs); + X(ifree)(ego); /* dona eis requiem */ +} + +plan *X(mkplan_d)(planner *ego, problem *p) +{ + plan *pln = ego->adt->mkplan(ego, p); + X(problem_destroy)(p); + return pln; +} + +/* like X(mkplan_d), but sets/resets flags as well */ +plan *X(mkplan_f_d)(planner *ego, problem *p, + unsigned l_set, unsigned u_set, unsigned u_reset) +{ + flags_t oflags = ego->flags; + plan *pln; + + PLNR_U(ego) &= ~u_reset; + PLNR_L(ego) &= ~u_reset; + PLNR_L(ego) |= l_set; + PLNR_U(ego) |= u_set | l_set; + pln = X(mkplan_d)(ego, p); + ego->flags = oflags; + return pln; +} + +/* + * Debugging code: + */ +#ifdef FFTW_DEBUG +static void check(hashtab *ht) +{ + unsigned live = 0; + unsigned i; + + A(ht->nelem < ht->hashsiz); + + for (i = 0; i < ht->hashsiz; ++i) { + solution *l = ht->solutions + i; + if (LIVEP(l)) + ++live; + } + + A(ht->nelem == live); + + for (i = 0; i < ht->hashsiz; ++i) { + solution *l1 = ht->solutions + i; + int foundit = 0; + if (LIVEP(l1)) { + unsigned g, h = h1(ht, l1->s), d = h2(ht, l1->s); + + g = h; + do { + solution *l = ht->solutions + g; + if (VALIDP(l)) { + if (l1 == l) + foundit = 1; + else if (LIVEP(l) && md5eq(l1->s, l->s)) { + A(!subsumes(&l->flags, SLVNDX(l), &l1->flags)); + A(!subsumes(&l1->flags, SLVNDX(l1), &l->flags)); + } + } else + break; + g = addmod(g, d, ht->hashsiz); + } while (g != h); + + A(foundit); + } + } +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/primes.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/primes.c new file mode 100644 index 000000000..5c10d56fa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/primes.c @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +/***************************************************************************/ + +/* Rader's algorithm requires lots of modular arithmetic, and if we + aren't careful we can have errors due to integer overflows. */ + +/* Compute (x * y) mod p, but watch out for integer overflows; we must + have 0 <= {x, y} < p. + + If overflow is common, this routine is somewhat slower than + e.g. using 'long long' arithmetic. However, it has the advantage + of working when INT is 64 bits, and is also faster when overflow is + rare. FFTW calls this via the MULMOD macro, which further + optimizes for the case of small integers. +*/ + +#define ADD_MOD(x, y, p) ((x) >= (p) - (y)) ? ((x) + ((y) - (p))) : ((x) + (y)) + +INT X(safe_mulmod)(INT x, INT y, INT p) +{ + INT r; + + if (y > x) + return X(safe_mulmod)(y, x, p); + + A(0 <= y && x < p); + + r = 0; + while (y) { + r = ADD_MOD(r, x*(y&1), p); y >>= 1; + x = ADD_MOD(x, x, p); + } + + return r; +} + +/***************************************************************************/ + +/* Compute n^m mod p, where m >= 0 and p > 0. If we really cared, we + could make this tail-recursive. */ + +INT X(power_mod)(INT n, INT m, INT p) +{ + A(p > 0); + if (m == 0) + return 1; + else if (m % 2 == 0) { + INT x = X(power_mod)(n, m / 2, p); + return MULMOD(x, x, p); + } + else + return MULMOD(n, X(power_mod)(n, m - 1, p), p); +} + +/* the following two routines were contributed by Greg Dionne. */ +static INT get_prime_factors(INT n, INT *primef) +{ + INT i; + INT size = 0; + + A(n % 2 == 0); /* this routine is designed only for even n */ + primef[size++] = (INT)2; + do { + n >>= 1; + } while ((n & 1) == 0); + + if (n == 1) + return size; + + for (i = 3; i * i <= n; i += 2) + if (!(n % i)) { + primef[size++] = i; + do { + n /= i; + } while (!(n % i)); + } + if (n == 1) + return size; + primef[size++] = n; + return size; +} + +INT X(find_generator)(INT p) +{ + INT n, i, size; + INT primef[16]; /* smallest number = 32589158477190044730 > 2^64 */ + INT pm1 = p - 1; + + if (p == 2) + return 1; + + size = get_prime_factors(pm1, primef); + n = 2; + for (i = 0; i < size; i++) + if (X(power_mod)(n, pm1 / primef[i], p) == 1) { + i = -1; + n++; + } + return n; +} + +/* Return first prime divisor of n (It would be at best slightly faster to + search a static table of primes; there are 6542 primes < 2^16.) */ +INT X(first_divisor)(INT n) +{ + INT i; + if (n <= 1) + return n; + if (n % 2 == 0) + return 2; + for (i = 3; i*i <= n; i += 2) + if (n % i == 0) + return i; + return n; +} + +int X(is_prime)(INT n) +{ + return(n > 1 && X(first_divisor)(n) == n); +} + +INT X(next_prime)(INT n) +{ + while (!X(is_prime)(n)) ++n; + return n; +} + +int X(factors_into)(INT n, const INT *primes) +{ + for (; *primes != 0; ++primes) + while ((n % *primes) == 0) + n /= *primes; + return (n == 1); +} + +/* integer square root. Return floor(sqrt(N)) */ +INT X(isqrt)(INT n) +{ + INT guess, iguess; + + A(n >= 0); + if (n == 0) return 0; + + guess = n; iguess = 1; + + do { + guess = (guess + iguess) / 2; + iguess = n / guess; + } while (guess > iguess); + + return guess; +} + +static INT isqrt_maybe(INT n) +{ + INT guess = X(isqrt)(n); + return guess * guess == n ? guess : 0; +} + +#define divides(a, b) (((b) % (a)) == 0) +INT X(choose_radix)(INT r, INT n) +{ + if (r > 0) { + if (divides(r, n)) return r; + return 0; + } else if (r == 0) { + return X(first_divisor)(n); + } else { + /* r is negative. If n = (-r) * q^2, take q as the radix */ + r = 0 - r; + return (n > r && divides(r, n)) ? isqrt_maybe(n / r) : 0; + } +} + +/* return A mod N, works for all A including A < 0 */ +INT X(modulo)(INT a, INT n) +{ + A(n > 0); + if (a >= 0) + return a % n; + else + return (n - 1) - ((-(a + (INT)1)) % n); +} + +/* TRUE if N factors into small primes */ +int X(factors_into_small_primes)(INT n) +{ + static const INT primes[] = { 2, 3, 5, 0 }; + return X(factors_into)(n, primes); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/print.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/print.c new file mode 100644 index 000000000..218fa93e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/print.c @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" +#include +#include +#include + +#define BSZ 64 + +static void myputs(printer *p, const char *s) +{ + char c; + while ((c = *s++)) + p->putchr(p, c); +} + +static void newline(printer *p) +{ + int i; + + p->putchr(p, '\n'); + for (i = 0; i < p->indent; ++i) + p->putchr(p, ' '); +} + +static const char *digits = "0123456789abcdef"; + +static void putint(printer *p, INT i) +{ + char buf[BSZ]; + char *f = buf; + + if (i < 0) { + p->putchr(p, '-'); + i = -i; + } + + do { + *f++ = digits[i % 10]; + i /= 10; + } while (i); + + do { + p->putchr(p, *--f); + } while (f != buf); +} + +static void putulong(printer *p, unsigned long i, unsigned base, int width) +{ + char buf[BSZ]; + char *f = buf; + + do { + *f++ = digits[i % base]; + i /= base; + } while (i); + + while (width > f - buf) { + p->putchr(p, '0'); + --width; + } + + do { + p->putchr(p, *--f); + } while (f != buf); +} + +static void vprint(printer *p, const char *format, va_list ap) +{ + const char *s = format; + char c; + INT ival; + + while ((c = *s++)) { + switch (c) { + case '%': + switch ((c = *s++)) { + case 'M': { + /* md5 value */ + md5uint x = va_arg(ap, md5uint); + putulong(p, (unsigned long)(0xffffffffUL & x), + 16u, 8); + break; + } + case 'c': { + int x = va_arg(ap, int); + p->putchr(p, (char)x); + break; + } + case 's': { + char *x = va_arg(ap, char *); + if (x) + myputs(p, x); + else + goto putnull; + break; + } + case 'd': { + int x = va_arg(ap, int); + ival = (INT)x; + goto putival; + } + case 'D': { + ival = va_arg(ap, INT); + goto putival; + } + case 'v': { + /* print optional vector length */ + ival = va_arg(ap, INT); + if (ival > 1) { + myputs(p, "-x"); + goto putival; + } + break; + } + case 'o': { + /* integer option. Usage: %oNAME= */ + ival = va_arg(ap, INT); + if (ival) + p->putchr(p, '/'); + while ((c = *s++) != '=') + if (ival) + p->putchr(p, c); + if (ival) { + p->putchr(p, '='); + goto putival; + } + break; + } + case 'u': { + unsigned x = va_arg(ap, unsigned); + putulong(p, (unsigned long)x, 10u, 0); + break; + } + case 'x': { + unsigned x = va_arg(ap, unsigned); + putulong(p, (unsigned long)x, 16u, 0); + break; + } + case '(': { + /* newline, augment indent level */ + p->indent += p->indent_incr; + newline(p); + break; + } + case ')': { + /* decrement indent level */ + p->indent -= p->indent_incr; + break; + } + case 'p': { /* note difference from C's %p */ + /* print plan */ + plan *x = va_arg(ap, plan *); + if (x) + x->adt->print(x, p); + else + goto putnull; + break; + } + case 'P': { + /* print problem */ + problem *x = va_arg(ap, problem *); + if (x) + x->adt->print(x, p); + else + goto putnull; + break; + } + case 'T': { + /* print tensor */ + tensor *x = va_arg(ap, tensor *); + if (x) + X(tensor_print)(x, p); + else + goto putnull; + break; + } + default: + A(0 /* unknown format */); + break; + + putnull: + myputs(p, "(null)"); + break; + + putival: + putint(p, ival); + break; + } + break; + default: + p->putchr(p, c); + break; + } + } +} + +static void print(printer *p, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vprint(p, format, ap); + va_end(ap); +} + +printer *X(mkprinter)(size_t size, + void (*putchr)(printer *p, char c), + void (*cleanup)(printer *p)) +{ + printer *s = (printer *)MALLOC(size, OTHER); + s->print = print; + s->vprint = vprint; + s->putchr = putchr; + s->cleanup = cleanup; + s->indent = 0; + s->indent_incr = 2; + return s; +} + +void X(printer_destroy)(printer *p) +{ + if (p->cleanup) + p->cleanup(p); + X(ifree)(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/problem.c new file mode 100644 index 000000000..aa23d7c6a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/problem.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +/* constructor */ +problem *X(mkproblem)(size_t sz, const problem_adt *adt) +{ + problem *p = (problem *)MALLOC(sz, PROBLEMS); + + p->adt = adt; + return p; +} + +/* destructor */ +void X(problem_destroy)(problem *ego) +{ + if (ego) + ego->adt->destroy(ego); +} + +/* management of unsolvable problems */ +static void unsolvable_destroy(problem *ego) +{ + UNUSED(ego); +} + +static void unsolvable_hash(const problem *p, md5 *m) +{ + UNUSED(p); + X(md5puts)(m, "unsolvable"); +} + +static void unsolvable_print(const problem *ego, printer *p) +{ + UNUSED(ego); + p->print(p, "(unsolvable)"); +} + +static void unsolvable_zero(const problem *ego) +{ + UNUSED(ego); +} + +static const problem_adt padt = +{ + PROBLEM_UNSOLVABLE, + unsolvable_hash, + unsolvable_zero, + unsolvable_print, + unsolvable_destroy +}; + +/* there is no point in malloc'ing this one */ +static problem the_unsolvable_problem = { &padt }; + +problem *X(mkproblem_unsolvable)(void) +{ + return &the_unsolvable_problem; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/rader.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/rader.c new file mode 100644 index 000000000..c045c29ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/rader.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +/* + common routines for Rader solvers +*/ + + +/* shared twiddle and omega lists, keyed by two/three integers. */ +struct rader_tls { + INT k1, k2, k3; + R *W; + int refcnt; + rader_tl *cdr; +}; + +void X(rader_tl_insert)(INT k1, INT k2, INT k3, R *W, rader_tl **tl) +{ + rader_tl *t = (rader_tl *) MALLOC(sizeof(rader_tl), TWIDDLES); + t->k1 = k1; t->k2 = k2; t->k3 = k3; t->W = W; + t->refcnt = 1; t->cdr = *tl; *tl = t; +} + +R *X(rader_tl_find)(INT k1, INT k2, INT k3, rader_tl *t) +{ + while (t && (t->k1 != k1 || t->k2 != k2 || t->k3 != k3)) + t = t->cdr; + if (t) { + ++t->refcnt; + return t->W; + } else + return 0; +} + +void X(rader_tl_delete)(R *W, rader_tl **tl) +{ + if (W) { + rader_tl **tp, *t; + + for (tp = tl; (t = *tp) && t->W != W; tp = &t->cdr) + ; + + if (t && --t->refcnt <= 0) { + *tp = t->cdr; + X(ifree)(t->W); + X(ifree)(t); + } + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/scan.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/scan.c new file mode 100644 index 000000000..d6e59f296 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/scan.c @@ -0,0 +1,204 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" +#include +#include +#include +#include + +#ifdef USE_CTYPE +#include +#else +/* Screw ctype. On linux, the is* functions call a routine that gets + the ctype map in the current locale. Because this operation is + expensive, the map is cached on a per-thread basis. I am not + willing to link this crap with FFTW. Not over my dead body. + + Sic transit gloria mundi. +*/ +#undef isspace +#define isspace(x) ((x) >= 0 && (x) <= ' ') +#undef isdigit +#define isdigit(x) ((x) >= '0' && (x) <= '9') +#undef isupper +#define isupper(x) ((x) >= 'A' && (x) <= 'Z') +#undef islower +#define islower(x) ((x) >= 'a' && (x) <= 'z') +#endif + +static int mygetc(scanner *sc) +{ + if (sc->ungotc != EOF) { + int c = sc->ungotc; + sc->ungotc = EOF; + return c; + } + return(sc->getchr(sc)); +} + +#define GETCHR(sc) mygetc(sc) + +static void myungetc(scanner *sc, int c) +{ + sc->ungotc = c; +} + +#define UNGETCHR(sc, c) myungetc(sc, c) + +static void eat_blanks(scanner *sc) +{ + int ch; + while (ch = GETCHR(sc), isspace(ch)) + ; + UNGETCHR(sc, ch); +} + +static void mygets(scanner *sc, char *s, int maxlen) +{ + char *s0 = s; + int ch; + + A(maxlen > 0); + while ((ch = GETCHR(sc)) != EOF && !isspace(ch) + && ch != ')' && ch != '(' && s < s0 + maxlen) + *s++ = (char)(ch & 0xFF); + *s = 0; + UNGETCHR(sc, ch); +} + +static long getlong(scanner *sc, int base, int *ret) +{ + int sign = 1, ch, count; + long x = 0; + + ch = GETCHR(sc); + if (ch == '-' || ch == '+') { + sign = ch == '-' ? -1 : 1; + ch = GETCHR(sc); + } + for (count = 0; ; ++count) { + if (isdigit(ch)) + ch -= '0'; + else if (isupper(ch)) + ch -= 'A' - 10; + else if (islower(ch)) + ch -= 'a' - 10; + else + break; + x = x * base + ch; + ch = GETCHR(sc); + } + x *= sign; + UNGETCHR(sc, ch); + *ret = count > 0; + return x; +} + +/* vscan is mostly scanf-like, with our additional format specifiers, + but with a few twists. It returns simply 0 or 1 indicating whether + the match was successful. '(' and ')' in the format string match + those characters preceded by any whitespace. Finally, if a + character match fails, it will ungetchr() the last character back + onto the stream. */ +static int vscan(scanner *sc, const char *format, va_list ap) +{ + const char *s = format; + char c; + int ch = 0; + int fmt_len; + + while ((c = *s++)) { + fmt_len = 0; + switch (c) { + case '%': + getformat: + switch ((c = *s++)) { + case 's': { + char *x = va_arg(ap, char *); + mygets(sc, x, fmt_len); + break; + } + case 'd': { + int *x = va_arg(ap, int *); + *x = (int) getlong(sc, 10, &ch); + if (!ch) return 0; + break; + } + case 'x': { + int *x = va_arg(ap, int *); + *x = (int) getlong(sc, 16, &ch); + if (!ch) return 0; + break; + } + case 'M': { + md5uint *x = va_arg(ap, md5uint *); + *x = (md5uint) + (0xFFFFFFFF & getlong(sc, 16, &ch)); + if (!ch) return 0; + break; + } + case '*': { + if ((fmt_len = va_arg(ap, int)) <= 0) return 0; + goto getformat; + } + default: + A(0 /* unknown format */); + break; + } + break; + default: + if (isspace(c) || c == '(' || c == ')') + eat_blanks(sc); + if (!isspace(c) && (ch = GETCHR(sc)) != c) { + UNGETCHR(sc, ch); + return 0; + } + break; + } + } + return 1; +} + +static int scan(scanner *sc, const char *format, ...) +{ + int ret; + va_list ap; + va_start(ap, format); + ret = vscan(sc, format, ap); + va_end(ap); + return ret; +} + +scanner *X(mkscanner)(size_t size, int (*getchr)(scanner *sc)) +{ + scanner *s = (scanner *)MALLOC(size, OTHER); + s->scan = scan; + s->vscan = vscan; + s->getchr = getchr; + s->ungotc = EOF; + return s; +} + +void X(scanner_destroy)(scanner *sc) +{ + X(ifree)(sc); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/solver.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/solver.c new file mode 100644 index 000000000..1d0a3ecf6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/solver.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +solver *X(mksolver)(size_t size, const solver_adt *adt) +{ + solver *s = (solver *)MALLOC(size, SOLVERS); + + s->adt = adt; + s->refcnt = 0; + return s; +} + +void X(solver_use)(solver *ego) +{ + ++ego->refcnt; +} + +void X(solver_destroy)(solver *ego) +{ + if ((--ego->refcnt) == 0) { + if (ego->adt->destroy) + ego->adt->destroy(ego); + X(ifree)(ego); + } +} + +void X(solver_register)(planner *plnr, solver *s) +{ + plnr->adt->register_solver(plnr, s); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/solvtab.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/solvtab.c new file mode 100644 index 000000000..6051cb414 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/solvtab.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +void X(solvtab_exec)(const solvtab tbl, planner *p) +{ + for (; tbl->reg_nam; ++tbl) { + p->cur_reg_nam = tbl->reg_nam; + p->cur_reg_id = 0; + tbl->reg(p); + } + p->cur_reg_nam = 0; +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/stride.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/stride.c new file mode 100644 index 000000000..99bce3180 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/stride.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +const INT X(an_INT_guaranteed_to_be_zero) = 0; + +#ifdef PRECOMPUTE_ARRAY_INDICES +stride X(mkstride)(INT n, INT s) +{ + int i; + INT *p; + + A(n >= 0); + p = (INT *) MALLOC((size_t)n * sizeof(INT), STRIDES); + + for (i = 0; i < n; ++i) + p[i] = s * i; + + return p; +} + +void X(stride_destroy)(stride p) +{ + X(ifree0)(p); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor.c new file mode 100644 index 000000000..91749cae0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +tensor *X(mktensor)(int rnk) +{ + tensor *x; + + A(rnk >= 0); + +#if defined(STRUCT_HACK_KR) + if (FINITE_RNK(rnk) && rnk > 1) + x = (tensor *)MALLOC(sizeof(tensor) + (unsigned)(rnk - 1) * sizeof(iodim), + TENSORS); + else + x = (tensor *)MALLOC(sizeof(tensor), TENSORS); +#elif defined(STRUCT_HACK_C99) + if (FINITE_RNK(rnk)) + x = (tensor *)MALLOC(sizeof(tensor) + (unsigned)rnk * sizeof(iodim), + TENSORS); + else + x = (tensor *)MALLOC(sizeof(tensor), TENSORS); +#else + x = (tensor *)MALLOC(sizeof(tensor), TENSORS); + if (FINITE_RNK(rnk) && rnk > 0) + x->dims = (iodim *)MALLOC(sizeof(iodim) * (unsigned)rnk, TENSORS); + else + x->dims = 0; +#endif + + x->rnk = rnk; + return x; +} + +void X(tensor_destroy)(tensor *sz) +{ +#if !defined(STRUCT_HACK_C99) && !defined(STRUCT_HACK_KR) + X(ifree0)(sz->dims); +#endif + X(ifree)(sz); +} + +INT X(tensor_sz)(const tensor *sz) +{ + int i; + INT n = 1; + + if (!FINITE_RNK(sz->rnk)) + return 0; + + for (i = 0; i < sz->rnk; ++i) + n *= sz->dims[i].n; + return n; +} + +void X(tensor_md5)(md5 *p, const tensor *t) +{ + int i; + X(md5int)(p, t->rnk); + if (FINITE_RNK(t->rnk)) { + for (i = 0; i < t->rnk; ++i) { + const iodim *q = t->dims + i; + X(md5INT)(p, q->n); + X(md5INT)(p, q->is); + X(md5INT)(p, q->os); + } + } +} + +/* treat a (rank <= 1)-tensor as a rank-1 tensor, extracting + appropriate n, is, and os components */ +int X(tensor_tornk1)(const tensor *t, INT *n, INT *is, INT *os) +{ + A(t->rnk <= 1); + if (t->rnk == 1) { + const iodim *vd = t->dims; + *n = vd[0].n; + *is = vd[0].is; + *os = vd[0].os; + } else { + *n = 1; + *is = *os = 0; + } + return 1; +} + +void X(tensor_print)(const tensor *x, printer *p) +{ + if (FINITE_RNK(x->rnk)) { + int i; + int first = 1; + p->print(p, "("); + for (i = 0; i < x->rnk; ++i) { + const iodim *d = x->dims + i; + p->print(p, "%s(%D %D %D)", + first ? "" : " ", + d->n, d->is, d->os); + first = 0; + } + p->print(p, ")"); + } else { + p->print(p, "rank-minfty"); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor1.c new file mode 100644 index 000000000..0ab236d6e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor1.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +tensor *X(mktensor_0d)(void) +{ + return X(mktensor(0)); +} + +tensor *X(mktensor_1d)(INT n, INT is, INT os) +{ + tensor *x = X(mktensor)(1); + x->dims[0].n = n; + x->dims[0].is = is; + x->dims[0].os = os; + return x; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor2.c new file mode 100644 index 000000000..548df2380 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor2.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +tensor *X(mktensor_2d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1) +{ + tensor *x = X(mktensor)(2); + x->dims[0].n = n0; + x->dims[0].is = is0; + x->dims[0].os = os0; + x->dims[1].n = n1; + x->dims[1].is = is1; + x->dims[1].os = os1; + return x; +} + + +tensor *X(mktensor_3d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT n2, INT is2, INT os2) +{ + tensor *x = X(mktensor)(3); + x->dims[0].n = n0; + x->dims[0].is = is0; + x->dims[0].os = os0; + x->dims[1].n = n1; + x->dims[1].is = is1; + x->dims[1].os = os1; + x->dims[2].n = n2; + x->dims[2].is = is2; + x->dims[2].os = os2; + return x; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor3.c new file mode 100644 index 000000000..3097198c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor3.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +/* Currently, mktensor_4d and mktensor_5d are only used in the MPI + routines, where very complicated transpositions are required. + Therefore we split them into a separate source file. */ + +tensor *X(mktensor_4d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT n2, INT is2, INT os2, + INT n3, INT is3, INT os3) +{ + tensor *x = X(mktensor)(4); + x->dims[0].n = n0; + x->dims[0].is = is0; + x->dims[0].os = os0; + x->dims[1].n = n1; + x->dims[1].is = is1; + x->dims[1].os = os1; + x->dims[2].n = n2; + x->dims[2].is = is2; + x->dims[2].os = os2; + x->dims[3].n = n3; + x->dims[3].is = is3; + x->dims[3].os = os3; + return x; +} + +tensor *X(mktensor_5d)(INT n0, INT is0, INT os0, + INT n1, INT is1, INT os1, + INT n2, INT is2, INT os2, + INT n3, INT is3, INT os3, + INT n4, INT is4, INT os4) +{ + tensor *x = X(mktensor)(5); + x->dims[0].n = n0; + x->dims[0].is = is0; + x->dims[0].os = os0; + x->dims[1].n = n1; + x->dims[1].is = is1; + x->dims[1].os = os1; + x->dims[2].n = n2; + x->dims[2].is = is2; + x->dims[2].os = os2; + x->dims[3].n = n3; + x->dims[3].is = is3; + x->dims[3].os = os3; + x->dims[4].n = n4; + x->dims[4].is = is4; + x->dims[4].os = os4; + return x; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor4.c new file mode 100644 index 000000000..9316d4c7e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor4.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +INT X(tensor_max_index)(const tensor *sz) +{ + int i; + INT ni = 0, no = 0; + + A(FINITE_RNK(sz->rnk)); + for (i = 0; i < sz->rnk; ++i) { + const iodim *p = sz->dims + i; + ni += (p->n - 1) * X(iabs)(p->is); + no += (p->n - 1) * X(iabs)(p->os); + } + return X(imax)(ni, no); +} + +#define tensor_min_xstride(sz, xs) { \ + A(FINITE_RNK(sz->rnk)); \ + if (sz->rnk == 0) return 0; \ + else { \ + int i; \ + INT s = X(iabs)(sz->dims[0].xs); \ + for (i = 1; i < sz->rnk; ++i) \ + s = X(imin)(s, X(iabs)(sz->dims[i].xs)); \ + return s; \ + } \ +} + +INT X(tensor_min_istride)(const tensor *sz) tensor_min_xstride(sz, is) +INT X(tensor_min_ostride)(const tensor *sz) tensor_min_xstride(sz, os) + +INT X(tensor_min_stride)(const tensor *sz) +{ + return X(imin)(X(tensor_min_istride)(sz), X(tensor_min_ostride)(sz)); +} + +int X(tensor_inplace_strides)(const tensor *sz) +{ + int i; + A(FINITE_RNK(sz->rnk)); + for (i = 0; i < sz->rnk; ++i) { + const iodim *p = sz->dims + i; + if (p->is != p->os) + return 0; + } + return 1; +} + +int X(tensor_inplace_strides2)(const tensor *a, const tensor *b) +{ + return X(tensor_inplace_strides(a)) && X(tensor_inplace_strides(b)); +} + +/* return true (1) iff *any* strides of sz decrease when we + tensor_inplace_copy(sz, k). */ +static int tensor_strides_decrease(const tensor *sz, inplace_kind k) +{ + if (FINITE_RNK(sz->rnk)) { + int i; + for (i = 0; i < sz->rnk; ++i) + if ((sz->dims[i].os - sz->dims[i].is) + * (k == INPLACE_OS ? (INT)1 : (INT)-1) < 0) + return 1; + } + return 0; +} + +/* Return true (1) iff *any* strides of sz decrease when we + tensor_inplace_copy(k) *or* if *all* strides of sz are unchanged + but *any* strides of vecsz decrease. This is used in indirect.c + to determine whether to use INPLACE_IS or INPLACE_OS. + + Note: X(tensor_strides_decrease)(sz, vecsz, INPLACE_IS) + || X(tensor_strides_decrease)(sz, vecsz, INPLACE_OS) + || X(tensor_inplace_strides2)(p->sz, p->vecsz) + must always be true. */ +int X(tensor_strides_decrease)(const tensor *sz, const tensor *vecsz, + inplace_kind k) +{ + return(tensor_strides_decrease(sz, k) + || (X(tensor_inplace_strides)(sz) + && tensor_strides_decrease(vecsz, k))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor5.c new file mode 100644 index 000000000..9c22e1f8c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor5.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +static void dimcpy(iodim *dst, const iodim *src, int rnk) +{ + int i; + if (FINITE_RNK(rnk)) + for (i = 0; i < rnk; ++i) + dst[i] = src[i]; +} + +tensor *X(tensor_copy)(const tensor *sz) +{ + tensor *x = X(mktensor)(sz->rnk); + dimcpy(x->dims, sz->dims, sz->rnk); + return x; +} + +/* like X(tensor_copy), but makes strides in-place by + setting os = is if k == INPLACE_IS or is = os if k == INPLACE_OS. */ +tensor *X(tensor_copy_inplace)(const tensor *sz, inplace_kind k) +{ + tensor *x = X(tensor_copy)(sz); + if (FINITE_RNK(x->rnk)) { + int i; + if (k == INPLACE_OS) + for (i = 0; i < x->rnk; ++i) + x->dims[i].is = x->dims[i].os; + else + for (i = 0; i < x->rnk; ++i) + x->dims[i].os = x->dims[i].is; + } + return x; +} + +/* Like X(tensor_copy), but copy all of the dimensions *except* + except_dim. */ +tensor *X(tensor_copy_except)(const tensor *sz, int except_dim) +{ + tensor *x; + + A(FINITE_RNK(sz->rnk) && sz->rnk >= 1 && except_dim < sz->rnk); + x = X(mktensor)(sz->rnk - 1); + dimcpy(x->dims, sz->dims, except_dim); + dimcpy(x->dims + except_dim, sz->dims + except_dim + 1, + x->rnk - except_dim); + return x; +} + +/* Like X(tensor_copy), but copy only rnk dimensions starting + with start_dim. */ +tensor *X(tensor_copy_sub)(const tensor *sz, int start_dim, int rnk) +{ + tensor *x; + + A(FINITE_RNK(sz->rnk) && start_dim + rnk <= sz->rnk); + x = X(mktensor)(rnk); + dimcpy(x->dims, sz->dims + start_dim, rnk); + return x; +} + +tensor *X(tensor_append)(const tensor *a, const tensor *b) +{ + if (!FINITE_RNK(a->rnk) || !FINITE_RNK(b->rnk)) { + return X(mktensor)(RNK_MINFTY); + } else { + tensor *x = X(mktensor)(a->rnk + b->rnk); + dimcpy(x->dims, a->dims, a->rnk); + dimcpy(x->dims + a->rnk, b->dims, b->rnk); + return x; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor7.c new file mode 100644 index 000000000..b37d826c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor7.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +static int signof(INT x) +{ + if (x < 0) return -1; + if (x == 0) return 0; + /* if (x > 0) */ return 1; +} + +/* total order among iodim's */ +int X(dimcmp)(const iodim *a, const iodim *b) +{ + INT sai = X(iabs)(a->is), sbi = X(iabs)(b->is); + INT sao = X(iabs)(a->os), sbo = X(iabs)(b->os); + INT sam = X(imin)(sai, sao), sbm = X(imin)(sbi, sbo); + + /* in descending order of min{istride, ostride} */ + if (sam != sbm) + return signof(sbm - sam); + + /* in case of a tie, in descending order of istride */ + if (sbi != sai) + return signof(sbi - sai); + + /* in case of a tie, in descending order of ostride */ + if (sbo != sao) + return signof(sbo - sao); + + /* in case of a tie, in ascending order of n */ + return signof(a->n - b->n); +} + +static void canonicalize(tensor *x) +{ + if (x->rnk > 1) { + qsort(x->dims, (unsigned)x->rnk, sizeof(iodim), + (int (*)(const void *, const void *))X(dimcmp)); + } +} + +static int compare_by_istride(const iodim *a, const iodim *b) +{ + INT sai = X(iabs)(a->is), sbi = X(iabs)(b->is); + + /* in descending order of istride */ + return signof(sbi - sai); +} + +static tensor *really_compress(const tensor *sz) +{ + int i, rnk; + tensor *x; + + A(FINITE_RNK(sz->rnk)); + for (i = rnk = 0; i < sz->rnk; ++i) { + A(sz->dims[i].n > 0); + if (sz->dims[i].n != 1) + ++rnk; + } + + x = X(mktensor)(rnk); + for (i = rnk = 0; i < sz->rnk; ++i) { + if (sz->dims[i].n != 1) + x->dims[rnk++] = sz->dims[i]; + } + return x; +} + +/* Like tensor_copy, but eliminate n == 1 dimensions, which + never affect any transform or transform vector. + + Also, we sort the tensor into a canonical order of decreasing + strides (see X(dimcmp) for an exact definition). In general, + processing a loop/array in order of decreasing stride will improve + locality. Both forward and backwards traversal of the tensor are + considered e.g. by vrank-geq1, so sorting in increasing + vs. decreasing order is not really important. */ +tensor *X(tensor_compress)(const tensor *sz) +{ + tensor *x = really_compress(sz); + canonicalize(x); + return x; +} + +/* Return whether the strides of a and b are such that they form an + effective contiguous 1d array. Assumes that a.is >= b.is. */ +static int strides_contig(iodim *a, iodim *b) +{ + return (a->is == b->is * b->n && a->os == b->os * b->n); +} + +/* Like tensor_compress, but also compress into one dimension any + group of dimensions that form a contiguous block of indices with + some stride. (This can safely be done for transform vector sizes.) */ +tensor *X(tensor_compress_contiguous)(const tensor *sz) +{ + int i, rnk; + tensor *sz2, *x; + + if (X(tensor_sz)(sz) == 0) + return X(mktensor)(RNK_MINFTY); + + sz2 = really_compress(sz); + A(FINITE_RNK(sz2->rnk)); + + if (sz2->rnk <= 1) { /* nothing to compress. */ + if (0) { + /* this call is redundant, because "sz->rnk <= 1" implies + that the tensor is already canonical, but I am writing + it explicitly because "logically" we need to canonicalize + the tensor before returning. */ + canonicalize(sz2); + } + return sz2; + } + + /* sort in descending order of |istride|, so that compressible + dimensions appear contigously */ + qsort(sz2->dims, (unsigned)sz2->rnk, sizeof(iodim), + (int (*)(const void *, const void *))compare_by_istride); + + /* compute what the rank will be after compression */ + for (i = rnk = 1; i < sz2->rnk; ++i) + if (!strides_contig(sz2->dims + i - 1, sz2->dims + i)) + ++rnk; + + /* merge adjacent dimensions whenever possible */ + x = X(mktensor)(rnk); + x->dims[0] = sz2->dims[0]; + for (i = rnk = 1; i < sz2->rnk; ++i) { + if (strides_contig(sz2->dims + i - 1, sz2->dims + i)) { + x->dims[rnk - 1].n *= sz2->dims[i].n; + x->dims[rnk - 1].is = sz2->dims[i].is; + x->dims[rnk - 1].os = sz2->dims[i].os; + } else { + A(rnk < x->rnk); + x->dims[rnk++] = sz2->dims[i]; + } + } + + X(tensor_destroy)(sz2); + + /* reduce to canonical form */ + canonicalize(x); + return x; +} + +/* The inverse of X(tensor_append): splits the sz tensor into + tensor a followed by tensor b, where a's rank is arnk. */ +void X(tensor_split)(const tensor *sz, tensor **a, int arnk, tensor **b) +{ + A(FINITE_RNK(sz->rnk) && FINITE_RNK(arnk)); + + *a = X(tensor_copy_sub)(sz, 0, arnk); + *b = X(tensor_copy_sub)(sz, arnk, sz->rnk - arnk); +} + +/* TRUE if the two tensors are equal */ +int X(tensor_equal)(const tensor *a, const tensor *b) +{ + if (a->rnk != b->rnk) + return 0; + + if (FINITE_RNK(a->rnk)) { + int i; + for (i = 0; i < a->rnk; ++i) + if (0 + || a->dims[i].n != b->dims[i].n + || a->dims[i].is != b->dims[i].is + || a->dims[i].os != b->dims[i].os + ) + return 0; + } + + return 1; +} + +/* TRUE if the sets of input and output locations described by + (append sz vecsz) are the same */ +int X(tensor_inplace_locations)(const tensor *sz, const tensor *vecsz) +{ + tensor *t = X(tensor_append)(sz, vecsz); + tensor *ti = X(tensor_copy_inplace)(t, INPLACE_IS); + tensor *to = X(tensor_copy_inplace)(t, INPLACE_OS); + tensor *tic = X(tensor_compress_contiguous)(ti); + tensor *toc = X(tensor_compress_contiguous)(to); + + int retval = X(tensor_equal)(tic, toc); + + X(tensor_destroy)(t); + X(tensor_destroy4)(ti, to, tic, toc); + + return retval; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor8.c new file mode 100644 index 000000000..b3db42e86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor8.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +void X(tensor_destroy2)(tensor *a, tensor *b) +{ + X(tensor_destroy)(a); + X(tensor_destroy)(b); +} + +void X(tensor_destroy4)(tensor *a, tensor *b, tensor *c, tensor *d) +{ + X(tensor_destroy2)(a, b); + X(tensor_destroy2)(c, d); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor9.c new file mode 100644 index 000000000..9d0c7fc18 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tensor9.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +int X(tensor_kosherp)(const tensor *x) +{ + int i; + + if (x->rnk < 0) return 0; + + if (FINITE_RNK(x->rnk)) { + for (i = 0; i < x->rnk; ++i) + if (x->dims[i].n < 0) + return 0; + } + return 1; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tile2d.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tile2d.c new file mode 100644 index 000000000..1b9cf2429 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/tile2d.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* out of place 2D copy routines */ +#include "kernel/ifftw.h" + +void X(tile2d)(INT n0l, INT n0u, INT n1l, INT n1u, INT tilesz, + void (*f)(INT n0l, INT n0u, INT n1l, INT n1u, void *args), + void *args) +{ + INT d0, d1; + + A(tilesz > 0); /* infinite loops otherwise */ + + tail: + d0 = n0u - n0l; + d1 = n1u - n1l; + + if (d0 >= d1 && d0 > tilesz) { + INT n0m = (n0u + n0l) / 2; + X(tile2d)(n0l, n0m, n1l, n1u, tilesz, f, args); + n0l = n0m; goto tail; + } else if (/* d1 >= d0 && */ d1 > tilesz) { + INT n1m = (n1u + n1l) / 2; + X(tile2d)(n0l, n0u, n1l, n1m, tilesz, f, args); + n1l = n1m; goto tail; + } else { + f(n0l, n0u, n1l, n1u, args); + } +} + +INT X(compute_tilesz)(INT vl, int how_many_tiles_in_cache) +{ + return X(isqrt)(CACHESIZE / + (((INT)sizeof(R)) * vl * (INT)how_many_tiles_in_cache)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/timer.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/timer.c new file mode 100644 index 000000000..d90a73b99 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/timer.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifndef WITH_SLOW_TIMER +# include "cycle.h" +#endif + +#ifndef FFTW_TIME_LIMIT +#define FFTW_TIME_LIMIT 2.0 /* don't run for more than two seconds */ +#endif + +/* the following code is disabled for now, because it seems to + require that we #include in ifftw.h to + typedef LARGE_INTEGER crude_time, and this pulls in the whole + Windows universe and leads to namespace conflicts (unless + we did some hack like assuming sizeof(LARGE_INTEGER) == sizeof(long long). + gettimeofday is provided by MinGW, which we use to cross-compile + FFTW for Windows, and this seems to work well enough */ +#if 0 && (defined(__WIN32__) || defined(_WIN32) || defined(_WIN64)) +crude_time X(get_crude_time)(void) +{ + crude_time tv; + QueryPerformanceCounter(&tv); + return tv; +} + +static double elapsed_since(crude_time t0) +{ + crude_time t1, freq; + QueryPerformanceCounter(&t1); + QueryPerformanceFrequency(&freq); + return (((double) (t1.QuadPart - t0.QuadPart))) / + ((double) freq.QuadPart); +} + +# define TIME_MIN_SEC 1.0e-2 + +#elif defined(HAVE_GETTIMEOFDAY) +crude_time X(get_crude_time)(void) +{ + crude_time tv; + gettimeofday(&tv, 0); + return tv; +} + +#define elapsed_sec(t1,t0) ((double)(t1.tv_sec - t0.tv_sec) + \ + (double)(t1.tv_usec - t0.tv_usec) * 1.0E-6) + +static double elapsed_since(crude_time t0) +{ + crude_time t1; + gettimeofday(&t1, 0); + return elapsed_sec(t1, t0); +} + +# define TIME_MIN_SEC 1.0e-3 + +#else /* !HAVE_GETTIMEOFDAY */ + +/* Note that the only system where we are likely to need to fall back + on the clock() function is Windows, for which CLOCKS_PER_SEC is 1000 + and thus the clock wraps once every 50 days. This should hopefully + be longer than the time required to create any single plan! */ +crude_time X(get_crude_time)(void) { return clock(); } + +#define elapsed_sec(t1,t0) ((double) ((t1) - (t0)) / CLOCKS_PER_SEC) + +static double elapsed_since(crude_time t0) +{ + return elapsed_sec(clock(), t0); +} + +# define TIME_MIN_SEC 2.0e-1 /* from fftw2 */ + +#endif /* !HAVE_GETTIMEOFDAY */ + +double X(elapsed_since)(const planner *plnr, const problem *p, crude_time t0) +{ + double t = elapsed_since(t0); + if (plnr->cost_hook) + t = plnr->cost_hook(p, t, COST_MAX); + return t; +} + +#ifdef WITH_SLOW_TIMER +/* excruciatingly slow; only use this if there is no choice! */ +typedef crude_time ticks; +# define getticks X(get_crude_time) +# define elapsed(t1,t0) elapsed_sec(t1,t0) +# define TIME_MIN TIME_MIN_SEC +# define TIME_REPEAT 4 /* from fftw2 */ +# define HAVE_TICK_COUNTER +#endif + +#ifdef HAVE_TICK_COUNTER + +# ifndef TIME_MIN +# define TIME_MIN 100.0 +# endif + +# ifndef TIME_REPEAT +# define TIME_REPEAT 8 +# endif + + static double measure(plan *pln, const problem *p, int iter) + { + ticks t0, t1; + int i; + + t0 = getticks(); + for (i = 0; i < iter; ++i) + pln->adt->solve(pln, p); + t1 = getticks(); + return elapsed(t1, t0); + } + + + double X(measure_execution_time)(const planner *plnr, + plan *pln, const problem *p) + { + int iter; + int repeat; + + X(plan_awake)(pln, AWAKE_ZERO); + p->adt->zero(p); + + start_over: + for (iter = 1; iter; iter *= 2) { + double tmin = 0; + int first = 1; + crude_time begin = X(get_crude_time)(); + + /* repeat the measurement TIME_REPEAT times */ + for (repeat = 0; repeat < TIME_REPEAT; ++repeat) { + double t = measure(pln, p, iter); + + if (plnr->cost_hook) + t = plnr->cost_hook(p, t, COST_MAX); + if (t < 0) + goto start_over; + + if (first || t < tmin) + tmin = t; + first = 0; + + /* do not run for too long */ + if (X(elapsed_since)(plnr, p, begin) > FFTW_TIME_LIMIT) + break; + } + + if (tmin >= TIME_MIN) { + X(plan_awake)(pln, SLEEPY); + return tmin / (double) iter; + } + } + goto start_over; /* may happen if timer is screwed up */ + } + +#else /* no cycle counter */ + + double X(measure_execution_time)(const planner *plnr, + plan *pln, const problem *p) + { + UNUSED(plnr); + UNUSED(p); + UNUSED(pln); + return -1.0; + } + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/transpose.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/transpose.c new file mode 100644 index 000000000..6c00c3290 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/transpose.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "kernel/ifftw.h" + +/* in place square transposition, iterative */ +void X(transpose)(R *I, INT n, INT s0, INT s1, INT vl) +{ + INT i0, i1, v; + + switch (vl) { + case 1: + for (i1 = 1; i1 < n; ++i1) { + for (i0 = 0; i0 < i1; ++i0) { + R x0 = I[i1 * s0 + i0 * s1]; + R y0 = I[i1 * s1 + i0 * s0]; + I[i1 * s1 + i0 * s0] = x0; + I[i1 * s0 + i0 * s1] = y0; + } + } + break; + case 2: + for (i1 = 1; i1 < n; ++i1) { + for (i0 = 0; i0 < i1; ++i0) { + R x0 = I[i1 * s0 + i0 * s1]; + R x1 = I[i1 * s0 + i0 * s1 + 1]; + R y0 = I[i1 * s1 + i0 * s0]; + R y1 = I[i1 * s1 + i0 * s0 + 1]; + I[i1 * s1 + i0 * s0] = x0; + I[i1 * s1 + i0 * s0 + 1] = x1; + I[i1 * s0 + i0 * s1] = y0; + I[i1 * s0 + i0 * s1 + 1] = y1; + } + } + break; + default: + for (i1 = 1; i1 < n; ++i1) { + for (i0 = 0; i0 < i1; ++i0) { + for (v = 0; v < vl; ++v) { + R x0 = I[i1 * s0 + i0 * s1 + v]; + R y0 = I[i1 * s1 + i0 * s0 + v]; + I[i1 * s1 + i0 * s0 + v] = x0; + I[i1 * s0 + i0 * s1 + v] = y0; + } + } + } + break; + } +} + +struct transpose_closure { + R *I; + INT s0, s1, vl, tilesz; + R *buf0, *buf1; +}; + +static void dotile(INT n0l, INT n0u, INT n1l, INT n1u, void *args) +{ + struct transpose_closure *k = (struct transpose_closure *)args; + R *I = k->I; + INT s0 = k->s0, s1 = k->s1, vl = k->vl; + INT i0, i1, v; + + switch (vl) { + case 1: + for (i1 = n1l; i1 < n1u; ++i1) { + for (i0 = n0l; i0 < n0u; ++i0) { + R x0 = I[i1 * s0 + i0 * s1]; + R y0 = I[i1 * s1 + i0 * s0]; + I[i1 * s1 + i0 * s0] = x0; + I[i1 * s0 + i0 * s1] = y0; + } + } + break; + case 2: + for (i1 = n1l; i1 < n1u; ++i1) { + for (i0 = n0l; i0 < n0u; ++i0) { + R x0 = I[i1 * s0 + i0 * s1]; + R x1 = I[i1 * s0 + i0 * s1 + 1]; + R y0 = I[i1 * s1 + i0 * s0]; + R y1 = I[i1 * s1 + i0 * s0 + 1]; + I[i1 * s1 + i0 * s0] = x0; + I[i1 * s1 + i0 * s0 + 1] = x1; + I[i1 * s0 + i0 * s1] = y0; + I[i1 * s0 + i0 * s1 + 1] = y1; + } + } + break; + default: + for (i1 = n1l; i1 < n1u; ++i1) { + for (i0 = n0l; i0 < n0u; ++i0) { + for (v = 0; v < vl; ++v) { + R x0 = I[i1 * s0 + i0 * s1 + v]; + R y0 = I[i1 * s1 + i0 * s0 + v]; + I[i1 * s1 + i0 * s0 + v] = x0; + I[i1 * s0 + i0 * s1 + v] = y0; + } + } + } + } +} + +static void dotile_buf(INT n0l, INT n0u, INT n1l, INT n1u, void *args) +{ + struct transpose_closure *k = (struct transpose_closure *)args; + X(cpy2d_ci)(k->I + n0l * k->s0 + n1l * k->s1, + k->buf0, + n0u - n0l, k->s0, k->vl, + n1u - n1l, k->s1, k->vl * (n0u - n0l), + k->vl); + X(cpy2d_ci)(k->I + n0l * k->s1 + n1l * k->s0, + k->buf1, + n0u - n0l, k->s1, k->vl, + n1u - n1l, k->s0, k->vl * (n0u - n0l), + k->vl); + X(cpy2d_co)(k->buf1, + k->I + n0l * k->s0 + n1l * k->s1, + n0u - n0l, k->vl, k->s0, + n1u - n1l, k->vl * (n0u - n0l), k->s1, + k->vl); + X(cpy2d_co)(k->buf0, + k->I + n0l * k->s1 + n1l * k->s0, + n0u - n0l, k->vl, k->s1, + n1u - n1l, k->vl * (n0u - n0l), k->s0, + k->vl); +} + +static void transpose_rec(R *I, INT n, + void (*f)(INT n0l, INT n0u, INT n1l, INT n1u, + void *args), + struct transpose_closure *k) +{ + tail: + if (n > 1) { + INT n2 = n / 2; + k->I = I; + X(tile2d)(0, n2, n2, n, k->tilesz, f, k); + transpose_rec(I, n2, f, k); + I += n2 * (k->s0 + k->s1); n -= n2; goto tail; + } +} + +void X(transpose_tiled)(R *I, INT n, INT s0, INT s1, INT vl) +{ + struct transpose_closure k; + k.s0 = s0; + k.s1 = s1; + k.vl = vl; + /* two blocks must be in cache, to be swapped */ + k.tilesz = X(compute_tilesz)(vl, 2); + k.buf0 = k.buf1 = 0; /* unused */ + transpose_rec(I, n, dotile, &k); +} + +void X(transpose_tiledbuf)(R *I, INT n, INT s0, INT s1, INT vl) +{ + struct transpose_closure k; + /* Assume that the the rows of I conflict into the same cache + lines, and therefore we don't need to reserve cache space for + the input. If the rows don't conflict, there is no reason + to use tiledbuf at all.*/ + R buf0[CACHESIZE / (2 * sizeof(R))]; + R buf1[CACHESIZE / (2 * sizeof(R))]; + k.s0 = s0; + k.s1 = s1; + k.vl = vl; + k.tilesz = X(compute_tilesz)(vl, 2); + k.buf0 = buf0; + k.buf1 = buf1; + A(k.tilesz * k.tilesz * vl * sizeof(R) <= sizeof(buf0)); + A(k.tilesz * k.tilesz * vl * sizeof(R) <= sizeof(buf1)); + transpose_rec(I, n, dotile_buf, &k); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/trig.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/trig.c new file mode 100644 index 000000000..fedbeb59d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/trig.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* trigonometric functions */ +#include "kernel/ifftw.h" +#include + +#if defined(TRIGREAL_IS_LONG_DOUBLE) +# define COS cosl +# define SIN sinl +# define KTRIG(x) (x##L) +# if defined(HAVE_DECL_SINL) && !HAVE_DECL_SINL + extern long double sinl(long double x); +# endif +# if defined(HAVE_DECL_COSL) && !HAVE_DECL_COSL + extern long double cosl(long double x); +# endif +#elif defined(TRIGREAL_IS_QUAD) +# define COS cosq +# define SIN sinq +# define KTRIG(x) (x##Q) + extern __float128 sinq(__float128 x); + extern __float128 cosq(__float128 x); +#else +# define COS cos +# define SIN sin +# define KTRIG(x) (x) +#endif + +static const trigreal K2PI = + KTRIG(6.2831853071795864769252867665590057683943388); +#define by2pi(m, n) ((K2PI * (m)) / (n)) + +/* + * Improve accuracy by reducing x to range [0..1/8] + * before multiplication by 2 * PI. + */ + +static void real_cexp(INT m, INT n, trigreal *out) +{ + trigreal theta, c, s, t; + unsigned octant = 0; + INT quarter_n = n; + + n += n; n += n; + m += m; m += m; + + if (m < 0) m += n; + if (m > n - m) { m = n - m; octant |= 4; } + if (m - quarter_n > 0) { m = m - quarter_n; octant |= 2; } + if (m > quarter_n - m) { m = quarter_n - m; octant |= 1; } + + theta = by2pi(m, n); + c = COS(theta); s = SIN(theta); + + if (octant & 1) { t = c; c = s; s = t; } + if (octant & 2) { t = c; c = -s; s = t; } + if (octant & 4) { s = -s; } + + out[0] = c; + out[1] = s; +} + +static INT choose_twshft(INT n) +{ + INT log2r = 0; + while (n > 0) { + ++log2r; + n /= 4; + } + return log2r; +} + +static void cexpl_sqrtn_table(triggen *p, INT m, trigreal *res) +{ + m += p->n * (m < 0); + + { + INT m0 = m & p->twmsk; + INT m1 = m >> p->twshft; + trigreal wr0 = p->W0[2 * m0]; + trigreal wi0 = p->W0[2 * m0 + 1]; + trigreal wr1 = p->W1[2 * m1]; + trigreal wi1 = p->W1[2 * m1 + 1]; + + res[0] = wr1 * wr0 - wi1 * wi0; + res[1] = wi1 * wr0 + wr1 * wi0; + } +} + +/* multiply (xr, xi) by exp(FFT_SIGN * 2*pi*i*m/n) */ +static void rotate_sqrtn_table(triggen *p, INT m, R xr, R xi, R *res) +{ + m += p->n * (m < 0); + + { + INT m0 = m & p->twmsk; + INT m1 = m >> p->twshft; + trigreal wr0 = p->W0[2 * m0]; + trigreal wi0 = p->W0[2 * m0 + 1]; + trigreal wr1 = p->W1[2 * m1]; + trigreal wi1 = p->W1[2 * m1 + 1]; + trigreal wr = wr1 * wr0 - wi1 * wi0; + trigreal wi = wi1 * wr0 + wr1 * wi0; + +#if FFT_SIGN == -1 + res[0] = xr * wr + xi * wi; + res[1] = xi * wr - xr * wi; +#else + res[0] = xr * wr - xi * wi; + res[1] = xi * wr + xr * wi; +#endif + } +} + +static void cexpl_sincos(triggen *p, INT m, trigreal *res) +{ + real_cexp(m, p->n, res); +} + +static void cexp_zero(triggen *p, INT m, R *res) +{ + UNUSED(p); UNUSED(m); + res[0] = 0; + res[1] = 0; +} + +static void cexpl_zero(triggen *p, INT m, trigreal *res) +{ + UNUSED(p); UNUSED(m); + res[0] = 0; + res[1] = 0; +} + +static void cexp_generic(triggen *p, INT m, R *res) +{ + trigreal resl[2]; + p->cexpl(p, m, resl); + res[0] = (R)resl[0]; + res[1] = (R)resl[1]; +} + +static void rotate_generic(triggen *p, INT m, R xr, R xi, R *res) +{ + trigreal w[2]; + p->cexpl(p, m, w); + res[0] = xr * w[0] - xi * (FFT_SIGN * w[1]); + res[1] = xi * w[0] + xr * (FFT_SIGN * w[1]); +} + +triggen *X(mktriggen)(enum wakefulness wakefulness, INT n) +{ + INT i, n0, n1; + triggen *p = (triggen *)MALLOC(sizeof(*p), TWIDDLES); + + p->n = n; + p->W0 = p->W1 = 0; + p->cexp = 0; + p->rotate = 0; + + switch (wakefulness) { + case SLEEPY: + A(0 /* can't happen */); + break; + + case AWAKE_SQRTN_TABLE: { + INT twshft = choose_twshft(n); + + p->twshft = twshft; + p->twradix = ((INT)1) << twshft; + p->twmsk = p->twradix - 1; + + n0 = p->twradix; + n1 = (n + n0 - 1) / n0; + + p->W0 = (trigreal *)MALLOC(n0 * 2 * sizeof(trigreal), TWIDDLES); + p->W1 = (trigreal *)MALLOC(n1 * 2 * sizeof(trigreal), TWIDDLES); + + for (i = 0; i < n0; ++i) + real_cexp(i, n, p->W0 + 2 * i); + + for (i = 0; i < n1; ++i) + real_cexp(i * p->twradix, n, p->W1 + 2 * i); + + p->cexpl = cexpl_sqrtn_table; + p->rotate = rotate_sqrtn_table; + break; + } + + case AWAKE_SINCOS: + p->cexpl = cexpl_sincos; + break; + + case AWAKE_ZERO: + p->cexp = cexp_zero; + p->cexpl = cexpl_zero; + break; + } + + if (!p->cexp) { + if (sizeof(trigreal) == sizeof(R)) + p->cexp = (void (*)(triggen *, INT, R *))p->cexpl; + else + p->cexp = cexp_generic; + } + if (!p->rotate) + p->rotate = rotate_generic; + return p; +} + +void X(triggen_destroy)(triggen *p) +{ + X(ifree0)(p->W0); + X(ifree0)(p->W1); + X(ifree)(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/twiddle.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/twiddle.c new file mode 100644 index 000000000..e171bcb2f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/kernel/twiddle.c @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Twiddle manipulation */ + +#include "kernel/ifftw.h" +#include + +#define HASHSZ 109 + +/* hash table of known twiddle factors */ +static twid *twlist[HASHSZ]; + +static INT hash(INT n, INT r) +{ + INT h = n * 17 + r; + + if (h < 0) h = -h; + + return (h % HASHSZ); +} + +static int equal_instr(const tw_instr *p, const tw_instr *q) +{ + if (p == q) + return 1; + + for (;; ++p, ++q) { + if (p->op != q->op) + return 0; + + switch (p->op) { + case TW_NEXT: + return (p->v == q->v); /* p->i is ignored */ + + case TW_FULL: + case TW_HALF: + if (p->v != q->v) return 0; /* p->i is ignored */ + break; + + default: + if (p->v != q->v || p->i != q->i) return 0; + break; + } + } + A(0 /* can't happen */); +} + +static int ok_twid(const twid *t, + enum wakefulness wakefulness, + const tw_instr *q, INT n, INT r, INT m) +{ + return (wakefulness == t->wakefulness && + n == t->n && + r == t->r && + m <= t->m && + equal_instr(t->instr, q)); +} + +static twid *lookup(enum wakefulness wakefulness, + const tw_instr *q, INT n, INT r, INT m) +{ + twid *p; + + for (p = twlist[hash(n,r)]; + p && !ok_twid(p, wakefulness, q, n, r, m); + p = p->cdr) + ; + return p; +} + +static INT twlen0(INT r, const tw_instr *p, INT *vl) +{ + INT ntwiddle = 0; + + /* compute length of bytecode program */ + A(r > 0); + for ( ; p->op != TW_NEXT; ++p) { + switch (p->op) { + case TW_FULL: + ntwiddle += (r - 1) * 2; + break; + case TW_HALF: + ntwiddle += (r - 1); + break; + case TW_CEXP: + ntwiddle += 2; + break; + case TW_COS: + case TW_SIN: + ntwiddle += 1; + break; + } + } + + *vl = (INT)p->v; + return ntwiddle; +} + +INT X(twiddle_length)(INT r, const tw_instr *p) +{ + INT vl; + return twlen0(r, p, &vl); +} + +static R *compute(enum wakefulness wakefulness, + const tw_instr *instr, INT n, INT r, INT m) +{ + INT ntwiddle, j, vl; + R *W, *W0; + const tw_instr *p; + triggen *t = X(mktriggen)(wakefulness, n); + + p = instr; + ntwiddle = twlen0(r, p, &vl); + + A(m % vl == 0); + + W0 = W = (R *)MALLOC((ntwiddle * (m / vl)) * sizeof(R), TWIDDLES); + + for (j = 0; j < m; j += vl) { + for (p = instr; p->op != TW_NEXT; ++p) { + switch (p->op) { + case TW_FULL: { + INT i; + for (i = 1; i < r; ++i) { + A((j + (INT)p->v) * i < n); + A((j + (INT)p->v) * i > -n); + t->cexp(t, (j + (INT)p->v) * i, W); + W += 2; + } + break; + } + + case TW_HALF: { + INT i; + A((r % 2) == 1); + for (i = 1; i + i < r; ++i) { + t->cexp(t, MULMOD(i, (j + (INT)p->v), n), W); + W += 2; + } + break; + } + + case TW_COS: { + R d[2]; + + A((j + (INT)p->v) * p->i < n); + A((j + (INT)p->v) * p->i > -n); + t->cexp(t, (j + (INT)p->v) * (INT)p->i, d); + *W++ = d[0]; + break; + } + + case TW_SIN: { + R d[2]; + + A((j + (INT)p->v) * p->i < n); + A((j + (INT)p->v) * p->i > -n); + t->cexp(t, (j + (INT)p->v) * (INT)p->i, d); + *W++ = d[1]; + break; + } + + case TW_CEXP: + A((j + (INT)p->v) * p->i < n); + A((j + (INT)p->v) * p->i > -n); + t->cexp(t, (j + (INT)p->v) * (INT)p->i, W); + W += 2; + break; + } + } + } + + X(triggen_destroy)(t); + return W0; +} + +static void mktwiddle(enum wakefulness wakefulness, + twid **pp, const tw_instr *instr, INT n, INT r, INT m) +{ + twid *p; + INT h; + + if ((p = lookup(wakefulness, instr, n, r, m))) { + ++p->refcnt; + } else { + p = (twid *) MALLOC(sizeof(twid), TWIDDLES); + p->n = n; + p->r = r; + p->m = m; + p->instr = instr; + p->refcnt = 1; + p->wakefulness = wakefulness; + p->W = compute(wakefulness, instr, n, r, m); + + /* cons! onto twlist */ + h = hash(n, r); + p->cdr = twlist[h]; + twlist[h] = p; + } + + *pp = p; +} + +static void twiddle_destroy(twid **pp) +{ + twid *p = *pp; + twid **q; + + if ((--p->refcnt) == 0) { + /* remove p from twiddle list */ + for (q = &twlist[hash(p->n, p->r)]; *q; q = &((*q)->cdr)) { + if (*q == p) { + *q = p->cdr; + X(ifree)(p->W); + X(ifree)(p); + *pp = 0; + return; + } + } + A(0 /* can't happen */ ); + } +} + + +void X(twiddle_awake)(enum wakefulness wakefulness, twid **pp, + const tw_instr *instr, INT n, INT r, INT m) +{ + switch (wakefulness) { + case SLEEPY: + twiddle_destroy(pp); + break; + default: + mktwiddle(wakefulness, pp, instr, n, r, m); + break; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/Makefile.am new file mode 100644 index 000000000..3a417dd04 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/Makefile.am @@ -0,0 +1,18 @@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LIBRARIES=libbench2.a + +libbench2_a_SOURCES=after-ccopy-from.c after-ccopy-to.c \ +after-hccopy-from.c after-hccopy-to.c after-rcopy-from.c \ +after-rcopy-to.c allocate.c aset.c bench-cost-postprocess.c \ +bench-exit.c bench-main.c can-do.c caset.c dotens2.c info.c main.c \ +mflops.c mp.c ovtpvt.c pow2.c problem.c report.c speed.c tensor.c \ +timer.c useropt.c util.c verify-dft.c verify-lib.c verify-r2r.c \ +verify-rdft2.c verify.c zero.c bench-user.h bench.h verify.h \ +my-getopt.c my-getopt.h + +benchmark: all + @echo "nothing to benchmark" + +accuracy: all + @echo "nothing to benchmark" + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/Makefile.in new file mode 100644 index 000000000..320c81b7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/Makefile.in @@ -0,0 +1,686 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = libbench2 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libbench2_a_AR = $(AR) $(ARFLAGS) +libbench2_a_LIBADD = +am_libbench2_a_OBJECTS = after-ccopy-from.$(OBJEXT) \ + after-ccopy-to.$(OBJEXT) after-hccopy-from.$(OBJEXT) \ + after-hccopy-to.$(OBJEXT) after-rcopy-from.$(OBJEXT) \ + after-rcopy-to.$(OBJEXT) allocate.$(OBJEXT) aset.$(OBJEXT) \ + bench-cost-postprocess.$(OBJEXT) bench-exit.$(OBJEXT) \ + bench-main.$(OBJEXT) can-do.$(OBJEXT) caset.$(OBJEXT) \ + dotens2.$(OBJEXT) info.$(OBJEXT) main.$(OBJEXT) \ + mflops.$(OBJEXT) mp.$(OBJEXT) ovtpvt.$(OBJEXT) pow2.$(OBJEXT) \ + problem.$(OBJEXT) report.$(OBJEXT) speed.$(OBJEXT) \ + tensor.$(OBJEXT) timer.$(OBJEXT) useropt.$(OBJEXT) \ + util.$(OBJEXT) verify-dft.$(OBJEXT) verify-lib.$(OBJEXT) \ + verify-r2r.$(OBJEXT) verify-rdft2.$(OBJEXT) verify.$(OBJEXT) \ + zero.$(OBJEXT) my-getopt.$(OBJEXT) +libbench2_a_OBJECTS = $(am_libbench2_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libbench2_a_SOURCES) +DIST_SOURCES = $(libbench2_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LIBRARIES = libbench2.a +libbench2_a_SOURCES = after-ccopy-from.c after-ccopy-to.c \ +after-hccopy-from.c after-hccopy-to.c after-rcopy-from.c \ +after-rcopy-to.c allocate.c aset.c bench-cost-postprocess.c \ +bench-exit.c bench-main.c can-do.c caset.c dotens2.c info.c main.c \ +mflops.c mp.c ovtpvt.c pow2.c problem.c report.c speed.c tensor.c \ +timer.c useropt.c util.c verify-dft.c verify-lib.c verify-r2r.c \ +verify-rdft2.c verify.c zero.c bench-user.h bench.h verify.h \ +my-getopt.c my-getopt.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu libbench2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu libbench2/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libbench2.a: $(libbench2_a_OBJECTS) $(libbench2_a_DEPENDENCIES) $(EXTRA_libbench2_a_DEPENDENCIES) + $(AM_V_at)-rm -f libbench2.a + $(AM_V_AR)$(libbench2_a_AR) libbench2.a $(libbench2_a_OBJECTS) $(libbench2_a_LIBADD) + $(AM_V_at)$(RANLIB) libbench2.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/after-ccopy-from.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/after-ccopy-to.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/after-hccopy-from.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/after-hccopy-to.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/after-rcopy-from.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/after-rcopy-to.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench-cost-postprocess.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench-exit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench-main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/can-do.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dotens2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mflops.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/my-getopt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ovtpvt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pow2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/problem.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/report.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speed.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tensor.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/useropt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify-dft.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify-lib.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify-r2r.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify-rdft2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zero.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +benchmark: all + @echo "nothing to benchmark" + +accuracy: all + @echo "nothing to benchmark" + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-ccopy-from.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-ccopy-from.c new file mode 100644 index 000000000..8609784aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-ccopy-from.c @@ -0,0 +1,10 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void after_problem_ccopy_from(bench_problem *p, bench_real *ri, bench_real *ii) +{ + UNUSED(p); + UNUSED(ri); + UNUSED(ii); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-ccopy-to.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-ccopy-to.c new file mode 100644 index 000000000..693be0503 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-ccopy-to.c @@ -0,0 +1,10 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void after_problem_ccopy_to(bench_problem *p, bench_real *ro, bench_real *io) +{ + UNUSED(p); + UNUSED(ro); + UNUSED(io); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-hccopy-from.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-hccopy-from.c new file mode 100644 index 000000000..77ab76be4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-hccopy-from.c @@ -0,0 +1,10 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void after_problem_hccopy_from(bench_problem *p, bench_real *ri, bench_real *ii) +{ + UNUSED(p); + UNUSED(ri); + UNUSED(ii); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-hccopy-to.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-hccopy-to.c new file mode 100644 index 000000000..962d4c767 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-hccopy-to.c @@ -0,0 +1,10 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void after_problem_hccopy_to(bench_problem *p, bench_real *ro, bench_real *io) +{ + UNUSED(p); + UNUSED(ro); + UNUSED(io); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-rcopy-from.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-rcopy-from.c new file mode 100644 index 000000000..558c354d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-rcopy-from.c @@ -0,0 +1,9 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void after_problem_rcopy_from(bench_problem *p, bench_real *ri) +{ + UNUSED(p); + UNUSED(ri); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-rcopy-to.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-rcopy-to.c new file mode 100644 index 000000000..689081223 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/after-rcopy-to.c @@ -0,0 +1,9 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void after_problem_rcopy_to(bench_problem *p, bench_real *ro) +{ + UNUSED(p); + UNUSED(ro); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/allocate.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/allocate.c new file mode 100644 index 000000000..1ca5f7cb6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/allocate.c @@ -0,0 +1,110 @@ +/* not worth copyrighting */ + + +#include "libbench2/bench.h" + +static void bounds(bench_problem *p, int *ilb, int *iub, int *olb, int *oub) +{ + bench_tensor *t = tensor_append(p->sz, p->vecsz); + tensor_ibounds(t, ilb, iub); + tensor_obounds(t, olb, oub); + tensor_destroy(t); +} + +/* + * Allocate I/O arrays for a problem. + * + * This is the default routine that can be overridden by the user in + * complicated cases. + */ +void problem_alloc(bench_problem *p) +{ + int ilb, iub, olb, oub; + int isz, osz; + + bounds(p, &ilb, &iub, &olb, &oub); + isz = iub - ilb; + osz = oub - olb; + + if (p->kind == PROBLEM_COMPLEX) { + bench_complex *in, *out; + + p->iphyssz = isz; + p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex)); + p->in = in - ilb; + + if (p->in_place) { + p->out = p->in; + p->outphys = p->inphys; + p->ophyssz = p->iphyssz; + } else { + p->ophyssz = osz; + p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex)); + p->out = out - olb; + } + } else if (p->kind == PROBLEM_R2R) { + bench_real *in, *out; + + p->iphyssz = isz; + p->inphys = in = (bench_real *) bench_malloc(isz * sizeof(bench_real)); + p->in = in - ilb; + + if (p->in_place) { + p->out = p->in; + p->outphys = p->inphys; + p->ophyssz = p->iphyssz; + } else { + p->ophyssz = osz; + p->outphys = out = (bench_real *) bench_malloc(osz * sizeof(bench_real)); + p->out = out - olb; + } + } else if (p->kind == PROBLEM_REAL && p->sign < 0) { /* R2HC */ + bench_real *in; + bench_complex *out; + + isz = isz > osz*2 ? isz : osz*2; + p->iphyssz = isz; + p->inphys = in = (bench_real *) bench_malloc(p->iphyssz * sizeof(bench_real)); + p->in = in - ilb; + + if (p->in_place) { + p->out = p->in; + p->outphys = p->inphys; + p->ophyssz = p->iphyssz / 2; + } else { + p->ophyssz = osz; + p->outphys = out = (bench_complex *) bench_malloc(osz * sizeof(bench_complex)); + p->out = out - olb; + } + } else if (p->kind == PROBLEM_REAL && p->sign > 0) { /* HC2R */ + bench_real *out; + bench_complex *in; + + osz = osz > isz*2 ? osz : isz*2; + p->ophyssz = osz; + p->outphys = out = (bench_real *) bench_malloc(p->ophyssz * sizeof(bench_real)); + p->out = out - olb; + + if (p->in_place) { + p->in = p->out; + p->inphys = p->outphys; + p->iphyssz = p->ophyssz / 2; + } else { + p->iphyssz = isz; + p->inphys = in = (bench_complex *) bench_malloc(isz * sizeof(bench_complex)); + p->in = in - ilb; + } + } else { + BENCH_ASSERT(0); /* TODO */ + } +} + +void problem_free(bench_problem *p) +{ + if (p->outphys && p->outphys != p->inphys) + bench_free(p->outphys); + if (p->inphys) + bench_free(p->inphys); + tensor_destroy(p->sz); + tensor_destroy(p->vecsz); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/aset.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/aset.c new file mode 100644 index 000000000..a25c14d0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/aset.c @@ -0,0 +1,10 @@ +/* not worth copyrighting */ + +#include "libbench2/bench.h" + +void aset(bench_real *A, int n, bench_real x) +{ + int i; + for (i = 0; i < n; ++i) + A[i] = x; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-cost-postprocess.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-cost-postprocess.c new file mode 100644 index 000000000..9e8e9d57f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-cost-postprocess.c @@ -0,0 +1,8 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +double bench_cost_postprocess(double cost) +{ + return cost; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-exit.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-exit.c new file mode 100644 index 000000000..452b36cde --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-exit.c @@ -0,0 +1,8 @@ +/* not worth copyrighting */ +#include "libbench2/bench.h" + +/* default routine, can be overridden by user */ +void bench_exit(int status) +{ + exit(status); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-main.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-main.c new file mode 100644 index 000000000..7f4f44e75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-main.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" +#include "my-getopt.h" +#include +#include + +int verbose; + +static const struct my_option options[] = +{ + {"accuracy", REQARG, 'a'}, + {"accuracy-rounds", REQARG, 405}, + {"impulse-accuracy-rounds", REQARG, 406}, + {"can-do", REQARG, 'd'}, + {"help", NOARG, 'h'}, + {"info", REQARG, 'i'}, + {"info-all", NOARG, 'I'}, + {"print-precision", NOARG, 402}, + {"print-time-min", NOARG, 400}, + {"random-seed", REQARG, 404}, + {"report-benchmark", NOARG, 320}, + {"report-mflops", NOARG, 300}, + {"report-time", NOARG, 310}, + {"report-verbose", NOARG, 330}, + {"speed", REQARG, 's'}, + {"setup-speed", REQARG, 'S'}, + {"time-min", REQARG, 't'}, + {"time-repeat", REQARG, 'r'}, + {"user-option", REQARG, 'o'}, + {"verbose", OPTARG, 'v'}, + {"verify", REQARG, 'y'}, + {"verify-rounds", REQARG, 401}, + {"verify-tolerance", REQARG, 403}, + {0, NOARG, 0} +}; + +int bench_main(int argc, char *argv[]) +{ + double tmin = 0.0; + double tol; + int repeat = 0; + int rounds = 10; + int iarounds = 0; + int arounds = 1; /* this is too low for precise results */ + int c; + + report = report_verbose; /* default */ + verbose = 0; + + tol = SINGLE_PRECISION ? 1.0e-3 : (QUAD_PRECISION ? 1e-29 : 1.0e-10); + + main_init(&argc, &argv); + + bench_srand(1); + + while ((c = my_getopt (argc, argv, options)) != -1) { + switch (c) { + case 't' : + tmin = strtod(my_optarg, 0); + break; + case 'r': + repeat = atoi(my_optarg); + break; + case 's': + timer_init(tmin, repeat); + speed(my_optarg, 0); + break; + case 'S': + timer_init(tmin, repeat); + speed(my_optarg, 1); + break; + case 'd': + report_can_do(my_optarg); + break; + case 'o': + useropt(my_optarg); + break; + case 'v': + if (verbose >= 0) { /* verbose < 0 disables output */ + if (my_optarg) + verbose = atoi(my_optarg); + else + ++verbose; + } + break; + case 'y': + verify(my_optarg, rounds, tol); + break; + case 'a': + accuracy(my_optarg, arounds, iarounds); + break; + case 'i': + report_info(my_optarg); + break; + case 'I': + report_info_all(); + break; + case 'h': + if (verbose >= 0) my_usage(argv[0], options); + break; + + case 300: /* --report-mflops */ + report = report_mflops; + break; + + case 310: /* --report-time */ + report = report_time; + break; + + case 320: /* --report-benchmark */ + report = report_benchmark; + break; + + case 330: /* --report-verbose */ + report = report_verbose; + break; + + case 400: /* --print-time-min */ + timer_init(tmin, repeat); + ovtpvt("%g\n", time_min); + break; + + case 401: /* --verify-rounds */ + rounds = atoi(my_optarg); + break; + + case 402: /* --print-precision */ + if (SINGLE_PRECISION) + ovtpvt("single\n"); + else if (QUAD_PRECISION) + ovtpvt("quad\n"); + else if (LDOUBLE_PRECISION) + ovtpvt("long-double\n"); + else if (DOUBLE_PRECISION) + ovtpvt("double\n"); + else + ovtpvt("unknown %d\n", sizeof(bench_real)); + break; + + case 403: /* --verify-tolerance */ + tol = strtod(my_optarg, 0); + break; + + case 404: /* --random-seed */ + bench_srand(atoi(my_optarg)); + break; + + case 405: /* --accuracy-rounds */ + arounds = atoi(my_optarg); + break; + + case 406: /* --impulse-accuracy-rounds */ + iarounds = atoi(my_optarg); + break; + + case '?': + /* my_getopt() already printed an error message. */ + cleanup(); + return 1; + + default: + abort (); + } + } + + /* assume that any remaining arguments are problems to be + benchmarked */ + while (my_optind < argc) { + timer_init(tmin, repeat); + speed(argv[my_optind++], 0); + } + + cleanup(); + return 0; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-user.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-user.h new file mode 100644 index 000000000..b8b27211f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench-user.h @@ -0,0 +1,276 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __BENCH_USER_H__ +#define __BENCH_USER_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* benchmark program definitions for user code */ +#include "config.h" +#include + +#if HAVE_STDDEF_H +#include +#endif + +#if HAVE_STDLIB_H +#include +#endif + +#if defined(BENCHFFT_SINGLE) +typedef float bench_real; +#elif defined(BENCHFFT_LDOUBLE) +typedef long double bench_real; +#elif defined(BENCHFFT_QUAD) +typedef __float128 bench_real; +#else +typedef double bench_real; +#endif + +typedef bench_real bench_complex[2]; + +#define c_re(c) ((c)[0]) +#define c_im(c) ((c)[1]) + +#undef DOUBLE_PRECISION +#define DOUBLE_PRECISION (sizeof(bench_real) == sizeof(double)) +#undef SINGLE_PRECISION +#define SINGLE_PRECISION (!DOUBLE_PRECISION && sizeof(bench_real) == sizeof(float)) +#undef LDOUBLE_PRECISION +#define LDOUBLE_PRECISION (!DOUBLE_PRECISION && sizeof(bench_real) == sizeof(long double)) + +#undef QUAD_PRECISION +#ifdef BENCHFFT_QUAD +#define QUAD_PRECISION (!LDOUBLE_PRECISION && sizeof(bench_real) == sizeof(__float128)) +#else +#define QUAD_PRECISION 0 +#endif + +typedef enum { PROBLEM_COMPLEX, PROBLEM_REAL, PROBLEM_R2R } problem_kind_t; + +typedef enum { + R2R_R2HC, R2R_HC2R, R2R_DHT, + R2R_REDFT00, R2R_REDFT01, R2R_REDFT10, R2R_REDFT11, + R2R_RODFT00, R2R_RODFT01, R2R_RODFT10, R2R_RODFT11 +} r2r_kind_t; + +typedef struct { + int n; + int is; /* input stride */ + int os; /* output stride */ +} bench_iodim; + +typedef struct { + int rnk; + bench_iodim *dims; +} bench_tensor; + +bench_tensor *mktensor(int rnk); +void tensor_destroy(bench_tensor *sz); +size_t tensor_sz(const bench_tensor *sz); +bench_tensor *tensor_compress(const bench_tensor *sz); +int tensor_unitstridep(bench_tensor *t); +int tensor_rowmajorp(bench_tensor *t); +int tensor_real_rowmajorp(bench_tensor *t, int sign, int in_place); +bench_tensor *tensor_append(const bench_tensor *a, const bench_tensor *b); +bench_tensor *tensor_copy(const bench_tensor *sz); +bench_tensor *tensor_copy_sub(const bench_tensor *sz, int start_dim, int rnk); +bench_tensor *tensor_copy_swapio(const bench_tensor *sz); +void tensor_ibounds(bench_tensor *t, int *lbp, int *ubp); +void tensor_obounds(bench_tensor *t, int *lbp, int *ubp); + +/* + Definition of rank -infinity. + This definition has the property that if you want rank 0 or 1, + you can simply test for rank <= 1. This is a common case. + + A tensor of rank -infinity has size 0. +*/ +#define BENCH_RNK_MINFTY INT_MAX +#define BENCH_FINITE_RNK(rnk) ((rnk) != BENCH_RNK_MINFTY) + +typedef struct { + problem_kind_t kind; + r2r_kind_t *k; + bench_tensor *sz; + bench_tensor *vecsz; + int sign; + int in_place; + int destroy_input; + int split; + void *in, *out; + void *inphys, *outphys; + int iphyssz, ophyssz; + char *pstring; + void *userinfo; /* user can store whatever */ + int scrambled_in, scrambled_out; /* hack for MPI */ + + /* internal hack so that we can use verifier in FFTW test program */ + void *ini, *outi; /* if nonzero, point to imag. parts for dft */ + + /* another internal hack to avoid passing around too many parameters */ + double setup_time; +} bench_problem; + +extern int verbose; + +extern int no_speed_allocation; + +extern int always_pad_real; + +#define LIBBENCH_TIMER 0 +#define USER_TIMER 1 +#define BENCH_NTIMERS 2 +extern void timer_start(int which_timer); +extern double timer_stop(int which_timer); + +extern int can_do(bench_problem *p); +extern void setup(bench_problem *p); +extern void doit(int iter, bench_problem *p); +extern void done(bench_problem *p); +extern void main_init(int *argc, char ***argv); +extern void cleanup(void); +extern void verify(const char *param, int rounds, double tol); +extern void useropt(const char *arg); + +extern void verify_problem(bench_problem *p, int rounds, double tol); + +extern void problem_alloc(bench_problem *p); +extern void problem_free(bench_problem *p); +extern void problem_zero(bench_problem *p); +extern void problem_destroy(bench_problem *p); + +extern int power_of_two(int n); +extern int log_2(int n); + + +#define CASSIGN(out, in) (c_re(out) = c_re(in), c_im(out) = c_im(in)) + +bench_tensor *verify_pack(const bench_tensor *sz, int s); + +typedef struct { + double l; + double i; + double s; +} errors; + +void verify_dft(bench_problem *p, int rounds, double tol, errors *e); +void verify_rdft2(bench_problem *p, int rounds, double tol, errors *e); +void verify_r2r(bench_problem *p, int rounds, double tol, errors *e); + +/**************************************************************/ +/* routines to override */ + +extern void after_problem_ccopy_from(bench_problem *p, bench_real *ri, bench_real *ii); +extern void after_problem_ccopy_to(bench_problem *p, bench_real *ro, bench_real *io); +extern void after_problem_hccopy_from(bench_problem *p, bench_real *ri, bench_real *ii); +extern void after_problem_hccopy_to(bench_problem *p, bench_real *ro, bench_real *io); +extern void after_problem_rcopy_from(bench_problem *p, bench_real *ri); +extern void after_problem_rcopy_to(bench_problem *p, bench_real *ro); +extern void bench_exit(int status); +extern double bench_cost_postprocess(double cost); + +/************************************************************** + * malloc + **************************************************************/ +extern void *bench_malloc(size_t size); +extern void bench_free(void *ptr); +extern void bench_free0(void *ptr); + +/************************************************************** + * alloca + **************************************************************/ +#ifdef HAVE_ALLOCA_H +#include +#endif + +/************************************************************** + * assert + **************************************************************/ +extern void bench_assertion_failed(const char *s, int line, const char *file); +#define BENCH_ASSERT(ex) \ + (void)((ex) || (bench_assertion_failed(#ex, __LINE__, __FILE__), 0)) + +#define UNUSED(x) (void)x + +/*************************************** + * Documentation strings + ***************************************/ +struct bench_doc { + const char *key; + const char *val; + const char *(*f)(void); +}; + +extern struct bench_doc bench_doc[]; + +#ifdef CC +#define CC_DOC BENCH_DOC("cc", CC) +#elif defined(BENCH_CC) +#define CC_DOC BENCH_DOC("cc", BENCH_CC) +#else +#define CC_DOC /* none */ +#endif + +#ifdef CXX +#define CXX_DOC BENCH_DOC("cxx", CXX) +#elif defined(BENCH_CXX) +#define CXX_DOC BENCH_DOC("cxx", BENCH_CXX) +#else +#define CXX_DOC /* none */ +#endif + +#ifdef F77 +#define F77_DOC BENCH_DOC("f77", F77) +#elif defined(BENCH_F77) +#define F77_DOC BENCH_DOC("f77", BENCH_F77) +#else +#define F77_DOC /* none */ +#endif + +#ifdef F90 +#define F90_DOC BENCH_DOC("f90", F90) +#elif defined(BENCH_F90) +#define F90_DOC BENCH_DOC("f90", BENCH_F90) +#else +#define F90_DOC /* none */ +#endif + +#define BEGIN_BENCH_DOC \ +struct bench_doc bench_doc[] = { \ + CC_DOC \ + CXX_DOC \ + F77_DOC \ + F90_DOC + +#define BENCH_DOC(key, val) { key, val, 0 }, +#define BENCH_DOCF(key, f) { key, 0, f }, + +#define END_BENCH_DOC \ + {0, 0, 0}}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __BENCH_USER_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench.h new file mode 100644 index 000000000..4aeb3f7dc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/bench.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* benchmark program definitions */ +#include "libbench2/bench-user.h" + +extern double time_min; +extern int time_repeat; + +extern void timer_init(double tmin, int repeat); + +/* report functions */ +extern void (*report)(const bench_problem *p, double *t, int st); + +void report_mflops(const bench_problem *p, double *t, int st); +void report_time(const bench_problem *p, double *t, int st); +void report_benchmark(const bench_problem *p, double *t, int st); +void report_verbose(const bench_problem *p, double *t, int st); + +void report_can_do(const char *param); +void report_info(const char *param); +void report_info_all(void); + +extern int aligned_main(int argc, char *argv[]); +extern int bench_main(int argc, char *argv[]); + +extern void speed(const char *param, int setup_only); +extern void accuracy(const char *param, int rounds, int impulse_rounds); + +extern double mflops(const bench_problem *p, double t); + +extern double bench_drand(void); +extern void bench_srand(int seed); + +extern bench_problem *problem_parse(const char *desc); + +extern void ovtpvt(const char *format, ...); +extern void ovtpvt_err(const char *format, ...); + +extern void fftaccuracy(int n, bench_complex *a, bench_complex *ffta, + int sign, double err[6]); +extern void fftaccuracy_done(void); + +extern void caset(bench_complex *A, int n, bench_complex x); +extern void aset(bench_real *A, int n, bench_real x); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/can-do.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/can-do.c new file mode 100644 index 000000000..33cf118a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/can-do.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" +#include + +void report_can_do(const char *param) +{ + bench_problem *p; + p = problem_parse(param); + ovtpvt("#%c\n", can_do(p) ? 't' : 'f'); + problem_destroy(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/caset.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/caset.c new file mode 100644 index 000000000..35f19c3da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/caset.c @@ -0,0 +1,12 @@ +/* not worth copyrighting */ + +#include "libbench2/bench.h" + +void caset(bench_complex *A, int n, bench_complex x) +{ + int i; + for (i = 0; i < n; ++i) { + c_re(A[i]) = c_re(x); + c_im(A[i]) = c_im(x); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/dotens2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/dotens2.c new file mode 100644 index 000000000..0f6f0bdea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/dotens2.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "verify.h" + +static void recur(int rnk, const bench_iodim *dims0, const bench_iodim *dims1, + dotens2_closure *k, + int indx0, int ondx0, int indx1, int ondx1) +{ + if (rnk == 0) + k->apply(k, indx0, ondx0, indx1, ondx1); + else { + int i, n = dims0[0].n; + int is0 = dims0[0].is; + int os0 = dims0[0].os; + int is1 = dims1[0].is; + int os1 = dims1[0].os; + + BENCH_ASSERT(n == dims1[0].n); + + for (i = 0; i < n; ++i) { + recur(rnk - 1, dims0 + 1, dims1 + 1, k, + indx0, ondx0, indx1, ondx1); + indx0 += is0; ondx0 += os0; + indx1 += is1; ondx1 += os1; + } + } +} + +void bench_dotens2(const bench_tensor *sz0, const bench_tensor *sz1, dotens2_closure *k) +{ + BENCH_ASSERT(sz0->rnk == sz1->rnk); + if (sz0->rnk == BENCH_RNK_MINFTY) + return; + recur(sz0->rnk, sz0->dims, sz1->dims, k, 0, 0, 0, 0); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/info.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/info.c new file mode 100644 index 000000000..f8f9e035d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/info.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" +#include +#include + +void report_info(const char *param) +{ + struct bench_doc *p; + + for (p = bench_doc; p->key; ++p) { + if (!strcmp(param, p->key)) { + if (!p->val) + p->val = p->f(); + + ovtpvt("%s\n", p->val); + } + } +} + +void report_info_all(void) +{ + struct bench_doc *p; + + /* + * TODO: escape quotes? The format is not unambigously + * parseable if the info string contains double quotes. + */ + for (p = bench_doc; p->key; ++p) { + if (!p->val) + p->val = p->f(); + ovtpvt("(%s \"%s\")\n", p->key, p->val); + } + ovtpvt("(benchmark-precision \"%s\")\n", + SINGLE_PRECISION ? "single" : + (LDOUBLE_PRECISION ? "long-double" : + (QUAD_PRECISION ? "quad" : "double"))); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/main.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/main.c new file mode 100644 index 000000000..0c6cf7289 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/main.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" + +/* On some systems, we are required to define a dummy main-like + routine (called "MAIN__" or something similar in order to link a C + main() with the Fortran libraries). This is detected by autoconf; + see the autoconf 2.52 or later manual. */ +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif + +/* in a separate file so that the user can override it */ +int main(int argc, char *argv[]) +{ + return bench_main(argc, argv); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/mflops.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/mflops.c new file mode 100644 index 000000000..18723a598 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/mflops.c @@ -0,0 +1,32 @@ +/* not worth copyrighting */ + +#include "libbench2/bench.h" +#include + +double mflops(const bench_problem *p, double t) +{ + size_t size = tensor_sz(p->sz); + size_t vsize = tensor_sz(p->vecsz); + + if (size <= 1) /* a copy: just return reals copied / time */ + switch (p->kind) { + case PROBLEM_COMPLEX: + return (2.0 * size * vsize / (t * 1.0e6)); + case PROBLEM_REAL: + case PROBLEM_R2R: + return (1.0 * size * vsize / (t * 1.0e6)); + } + + switch (p->kind) { + case PROBLEM_COMPLEX: + return (5.0 * size * vsize * log((double)size) / + (log(2.0) * t * 1.0e6)); + case PROBLEM_REAL: + case PROBLEM_R2R: + return (2.5 * vsize * size * log((double) size) / + (log(2.0) * t * 1.0e6)); + } + BENCH_ASSERT(0 /* can't happen */); + return 0.0; +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/mp.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/mp.c new file mode 100644 index 000000000..026562125 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/mp.c @@ -0,0 +1,641 @@ +#include "config.h" +#include "libbench2/bench.h" +#include + +#define DG unsigned short +#define ACC unsigned long +#define REAL bench_real +#define BITS_IN_REAL 53 /* mantissa */ + +#define SHFT 16 +#define RADIX 65536L +#define IRADIX (1.0 / RADIX) +#define LO(x) ((x) & (RADIX - 1)) +#define HI(x) ((x) >> SHFT) +#define HI_SIGNED(x) \ + ((((x) + (ACC)(RADIX >> 1) * RADIX) >> SHFT) - (RADIX >> 1)) +#define ZEROEXP (-32768) + +#define LEN 10 + +typedef struct { + short sign; + short expt; + DG d[LEN]; +} N[1]; + +#define EXA a->expt +#define EXB b->expt +#define EXC c->expt + +#define AD a->d +#define BD b->d + +#define SGNA a->sign +#define SGNB b->sign + +static const N zero = {{ 1, ZEROEXP, {0} }}; + +static void cpy(const N a, N b) +{ + *b = *a; +} + +static void fromreal(REAL x, N a) +{ + int i, e; + + cpy(zero, a); + if (x == 0.0) return; + + if (x >= 0) { SGNA = 1; } + else { SGNA = -1; x = -x; } + + e = 0; + while (x >= 1.0) { x *= IRADIX; ++e; } + while (x < IRADIX) { x *= RADIX; --e; } + EXA = e; + + for (i = LEN - 1; i >= 0 && x != 0.0; --i) { + REAL y; + + x *= RADIX; + y = (REAL) ((int) x); + AD[i] = (DG)y; + x -= y; + } +} + +static void fromshort(int x, N a) +{ + cpy(zero, a); + + if (x < 0) { x = -x; SGNA = -1; } + else { SGNA = 1; } + EXA = 1; + AD[LEN - 1] = x; +} + +static void pack(DG *d, int e, int s, int l, N a) +{ + int i, j; + + for (i = l - 1; i >= 0; --i, --e) + if (d[i] != 0) + break; + + if (i < 0) { + /* number is zero */ + cpy(zero, a); + } else { + EXA = e; + SGNA = s; + + if (i >= LEN - 1) { + for (j = LEN - 1; j >= 0; --i, --j) + AD[j] = d[i]; + } else { + for (j = LEN - 1; i >= 0; --i, --j) + AD[j] = d[i]; + for ( ; j >= 0; --j) + AD[j] = 0; + } + } +} + + +/* compare absolute values */ +static int abscmp(const N a, const N b) +{ + int i; + if (EXA > EXB) return 1; + if (EXA < EXB) return -1; + for (i = LEN - 1; i >= 0; --i) { + if (AD[i] > BD[i]) + return 1; + if (AD[i] < BD[i]) + return -1; + } + return 0; +} + +static int eq(const N a, const N b) +{ + return (SGNA == SGNB) && (abscmp(a, b) == 0); +} + +/* add magnitudes, for |a| >= |b| */ +static void addmag0(int s, const N a, const N b, N c) +{ + int ia, ib; + ACC r = 0; + DG d[LEN + 1]; + + for (ia = 0, ib = EXA - EXB; ib < LEN; ++ia, ++ib) { + r += (ACC)AD[ia] + (ACC)BD[ib]; + d[ia] = LO(r); + r = HI(r); + } + for (; ia < LEN; ++ia) { + r += (ACC)AD[ia]; + d[ia] = LO(r); + r = HI(r); + } + d[ia] = LO(r); + pack(d, EXA + 1, s * SGNA, LEN + 1, c); +} + +static void addmag(int s, const N a, const N b, N c) +{ + if (abscmp(a, b) > 0) addmag0(1, a, b, c); else addmag0(s, b, a, c); +} + +/* subtract magnitudes, for |a| >= |b| */ +static void submag0(int s, const N a, const N b, N c) +{ + int ia, ib; + ACC r = 0; + DG d[LEN]; + + for (ia = 0, ib = EXA - EXB; ib < LEN; ++ia, ++ib) { + r += (ACC)AD[ia] - (ACC)BD[ib]; + d[ia] = LO(r); + r = HI_SIGNED(r); + } + for (; ia < LEN; ++ia) { + r += (ACC)AD[ia]; + d[ia] = LO(r); + r = HI_SIGNED(r); + } + + pack(d, EXA, s * SGNA, LEN, c); +} + +static void submag(int s, const N a, const N b, N c) +{ + if (abscmp(a, b) > 0) submag0(1, a, b, c); else submag0(s, b, a, c); +} + +/* c = a + b */ +static void add(const N a, const N b, N c) +{ + if (SGNA == SGNB) addmag(1, a, b, c); else submag(1, a, b, c); +} + +static void sub(const N a, const N b, N c) +{ + if (SGNA == SGNB) submag(-1, a, b, c); else addmag(-1, a, b, c); +} + +static void mul(const N a, const N b, N c) +{ + DG d[2 * LEN]; + int i, j, k; + ACC r; + + for (i = 0; i < LEN; ++i) + d[2 * i] = d[2 * i + 1] = 0; + + for (i = 0; i < LEN; ++i) { + ACC ai = AD[i]; + if (ai) { + r = 0; + for (j = 0, k = i; j < LEN; ++j, ++k) { + r += ai * (ACC)BD[j] + (ACC)d[k]; + d[k] = LO(r); + r = HI(r); + } + d[k] = LO(r); + } + } + + pack(d, EXA + EXB, SGNA * SGNB, 2 * LEN, c); +} + +static REAL toreal(const N a) +{ + REAL h, l, f; + int i, bits; + ACC r; + DG sticky; + + if (EXA != ZEROEXP) { + f = IRADIX; + i = LEN; + + bits = 0; + h = (r = AD[--i]) * f; f *= IRADIX; + for (bits = 0; r > 0; ++bits) + r >>= 1; + + /* first digit */ + while (bits + SHFT <= BITS_IN_REAL) { + h += AD[--i] * f; f *= IRADIX; bits += SHFT; + } + + /* guard digit (leave one bit for sticky bit, hence `<' instead + of `<=') */ + bits = 0; l = 0.0; + while (bits + SHFT < BITS_IN_REAL) { + l += AD[--i] * f; f *= IRADIX; bits += SHFT; + } + + /* sticky bit */ + sticky = 0; + while (i > 0) + sticky |= AD[--i]; + + if (sticky) + l += (RADIX / 2) * f; + + h += l; + + for (i = 0; i < EXA; ++i) h *= (REAL)RADIX; + for (i = 0; i > EXA; --i) h *= IRADIX; + if (SGNA == -1) h = -h; + return h; + } else { + return 0.0; + } +} + +static void neg(N a) +{ + SGNA = -SGNA; +} + +static void inv(const N a, N x) +{ + N w, z, one, two; + + fromreal(1.0 / toreal(a), x); /* initial guess */ + fromshort(1, one); + fromshort(2, two); + + for (;;) { + /* Newton */ + mul(a, x, w); + sub(two, w, z); + if (eq(one, z)) break; + mul(x, z, x); + } +} + + +/* 2 pi */ +static const N n2pi = {{ + 1, 1, + {18450, 59017, 1760, 5212, 9779, 4518, 2886, 54545, 18558, 6} +}}; + +/* 1 / 31! */ +static const N i31fac = {{ + 1, -7, + {28087, 45433, 51357, 24545, 14291, 3954, 57879, 8109, 38716, 41382} +}}; + + +/* 1 / 32! */ +static const N i32fac = {{ + 1, -7, + {52078, 60811, 3652, 39679, 37310, 47227, 28432, 57597, 13497, 1293} +}}; + +static void msin(const N a, N b) +{ + N a2, g, k; + int i; + + cpy(i31fac, g); + cpy(g, b); + mul(a, a, a2); + + /* Taylor */ + for (i = 31; i > 1; i -= 2) { + fromshort(i * (i - 1), k); + mul(k, g, g); + mul(a2, b, k); + sub(g, k, b); + } + mul(a, b, b); +} + +static void mcos(const N a, N b) +{ + N a2, g, k; + int i; + + cpy(i32fac, g); + cpy(g, b); + mul(a, a, a2); + + /* Taylor */ + for (i = 32; i > 0; i -= 2) { + fromshort(i * (i - 1), k); + mul(k, g, g); + mul(a2, b, k); + sub(g, k, b); + } +} + +static void by2pi(REAL m, REAL n, N a) +{ + N b; + + fromreal(n, b); + inv(b, a); + fromreal(m, b); + mul(a, b, a); + mul(n2pi, a, a); +} + +static void sin2pi(REAL m, REAL n, N a); +static void cos2pi(REAL m, REAL n, N a) +{ + N b; + if (m < 0) cos2pi(-m, n, a); + else if (m > n * 0.5) cos2pi(n - m, n, a); + else if (m > n * 0.25) {sin2pi(m - n * 0.25, n, a); neg(a);} + else if (m > n * 0.125) sin2pi(n * 0.25 - m, n, a); + else { by2pi(m, n, b); mcos(b, a); } +} + +static void sin2pi(REAL m, REAL n, N a) +{ + N b; + if (m < 0) {sin2pi(-m, n, a); neg(a);} + else if (m > n * 0.5) {sin2pi(n - m, n, a); neg(a);} + else if (m > n * 0.25) {cos2pi(m - n * 0.25, n, a);} + else if (m > n * 0.125) {cos2pi(n * 0.25 - m, n, a);} + else {by2pi(m, n, b); msin(b, a);} +} + +/*----------------------------------------------------------------------*/ +/* FFT stuff */ + +/* (r0 + i i0)(r1 + i i1) */ +static void cmul(N r0, N i0, N r1, N i1, N r2, N i2) +{ + N s, t, q; + mul(r0, r1, s); + mul(i0, i1, t); + sub(s, t, q); + mul(r0, i1, s); + mul(i0, r1, t); + add(s, t, i2); + cpy(q, r2); +} + +/* (r0 - i i0)(r1 + i i1) */ +static void cmulj(N r0, N i0, N r1, N i1, N r2, N i2) +{ + N s, t, q; + mul(r0, r1, s); + mul(i0, i1, t); + add(s, t, q); + mul(r0, i1, s); + mul(i0, r1, t); + sub(s, t, i2); + cpy(q, r2); +} + +static void mcexp(int m, int n, N r, N i) +{ + static int cached_n = -1; + static N w[64][2]; + int k, j; + if (n != cached_n) { + for (j = 1, k = 0; j < n; j += j, ++k) { + cos2pi(j, n, w[k][0]); + sin2pi(j, n, w[k][1]); + } + cached_n = n; + } + + fromshort(1, r); + fromshort(0, i); + if (m > 0) { + for (k = 0; m; ++k, m >>= 1) + if (m & 1) + cmul(w[k][0], w[k][1], r, i, r, i); + } else { + m = -m; + for (k = 0; m; ++k, m >>= 1) + if (m & 1) + cmulj(w[k][0], w[k][1], r, i, r, i); + } +} + +static void bitrev(int n, N *a) +{ + int i, j, m; + for (i = j = 0; i < n - 1; ++i) { + if (i < j) { + N t; + cpy(a[2*i], t); cpy(a[2*j], a[2*i]); cpy(t, a[2*j]); + cpy(a[2*i+1], t); cpy(a[2*j+1], a[2*i+1]); cpy(t, a[2*j+1]); + } + + /* bit reversed counter */ + m = n; do { m >>= 1; j ^= m; } while (!(j & m)); + } +} + +static void fft0(int n, N *a, int sign) +{ + int i, j, k; + + bitrev(n, a); + for (i = 1; i < n; i = 2 * i) { + for (j = 0; j < i; ++j) { + N wr, wi; + mcexp(sign * (int)j, 2 * i, wr, wi); + for (k = j; k < n; k += 2 * i) { + N *a0 = a + 2 * k; + N *a1 = a0 + 2 * i; + N r0, i0, r1, i1, t0, t1, xr, xi; + cpy(a0[0], r0); cpy(a0[1], i0); + cpy(a1[0], r1); cpy(a1[1], i1); + mul(r1, wr, t0); mul(i1, wi, t1); sub(t0, t1, xr); + mul(r1, wi, t0); mul(i1, wr, t1); add(t0, t1, xi); + add(r0, xr, a0[0]); add(i0, xi, a0[1]); + sub(r0, xr, a1[0]); sub(i0, xi, a1[1]); + } + } + } +} + +/* a[2*k]+i*a[2*k+1] = exp(2*pi*i*k^2/(2*n)) */ +static void bluestein_sequence(int n, N *a) +{ + int k, ksq, n2 = 2 * n; + + ksq = 1; /* (-1)^2 */ + for (k = 0; k < n; ++k) { + /* careful with overflow */ + ksq = ksq + 2*k - 1; while (ksq > n2) ksq -= n2; + mcexp(ksq, n2, a[2*k], a[2*k+1]); + } +} + +static int pow2_atleast(int x) +{ + int h; + for (h = 1; h < x; h = 2 * h) + ; + return h; +} + +static N *cached_bluestein_w = 0; +static N *cached_bluestein_y = 0; +static int cached_bluestein_n = -1; + +static void bluestein(int n, N *a) +{ + int nb = pow2_atleast(2 * n); + N *b = (N *)bench_malloc(2 * nb * sizeof(N)); + N *w = cached_bluestein_w; + N *y = cached_bluestein_y; + N nbinv; + int i; + + fromreal(1.0 / nb, nbinv); /* exact because nb = 2^k */ + + if (cached_bluestein_n != n) { + if (w) bench_free(w); + if (y) bench_free(y); + w = (N *)bench_malloc(2 * n * sizeof(N)); + y = (N *)bench_malloc(2 * nb * sizeof(N)); + cached_bluestein_n = n; + cached_bluestein_w = w; + cached_bluestein_y = y; + + bluestein_sequence(n, w); + for (i = 0; i < 2*nb; ++i) cpy(zero, y[i]); + + for (i = 0; i < n; ++i) { + cpy(w[2*i], y[2*i]); + cpy(w[2*i+1], y[2*i+1]); + } + for (i = 1; i < n; ++i) { + cpy(w[2*i], y[2*(nb-i)]); + cpy(w[2*i+1], y[2*(nb-i)+1]); + } + + fft0(nb, y, -1); + } + + for (i = 0; i < 2*nb; ++i) cpy(zero, b[i]); + + for (i = 0; i < n; ++i) + cmulj(w[2*i], w[2*i+1], a[2*i], a[2*i+1], b[2*i], b[2*i+1]); + + /* scaled convolution b * y */ + fft0(nb, b, -1); + + for (i = 0; i < nb; ++i) + cmul(b[2*i], b[2*i+1], y[2*i], y[2*i+1], b[2*i], b[2*i+1]); + fft0(nb, b, 1); + + for (i = 0; i < n; ++i) { + cmulj(w[2*i], w[2*i+1], b[2*i], b[2*i+1], a[2*i], a[2*i+1]); + mul(nbinv, a[2*i], a[2*i]); + mul(nbinv, a[2*i+1], a[2*i+1]); + } + + bench_free(b); +} + +static void swapri(int n, N *a) +{ + int i; + for (i = 0; i < n; ++i) { + N t; + cpy(a[2 * i], t); + cpy(a[2 * i + 1], a[2 * i]); + cpy(t, a[2 * i + 1]); + } +} + +static void fft1(int n, N *a, int sign) +{ + if (power_of_two(n)) { + fft0(n, a, sign); + } else { + if (sign == 1) swapri(n, a); + bluestein(n, a); + if (sign == 1) swapri(n, a); + } +} + +static void fromrealv(int n, bench_complex *a, N *b) +{ + int i; + + for (i = 0; i < n; ++i) { + fromreal(c_re(a[i]), b[2 * i]); + fromreal(c_im(a[i]), b[2 * i + 1]); + } +} + +static void compare(int n, N *a, N *b, double *err) +{ + int i; + double e1, e2, einf; + double n1, n2, ninf; + + e1 = e2 = einf = 0.0; + n1 = n2 = ninf = 0.0; + +# define DO(x1, x2, xinf, var) { \ + double d = var; \ + if (d < 0) d = -d; \ + x1 += d; x2 += d * d; if (d > xinf) xinf = d; \ +} + + for (i = 0; i < 2 * n; ++i) { + N dd; + sub(a[i], b[i], dd); + DO(n1, n2, ninf, toreal(a[i])); + DO(e1, e2, einf, toreal(dd)); + } + +# undef DO + err[0] = e1 / n1; + err[1] = sqrt(e2 / n2); + err[2] = einf / ninf; +} + +void fftaccuracy(int n, bench_complex *a, bench_complex *ffta, + int sign, double err[6]) +{ + N *b = (N *)bench_malloc(2 * n * sizeof(N)); + N *fftb = (N *)bench_malloc(2 * n * sizeof(N)); + N mn, ninv; + int i; + + fromreal(n, mn); inv(mn, ninv); + + /* forward error */ + fromrealv(n, a, b); fromrealv(n, ffta, fftb); + fft1(n, b, sign); + compare(n, b, fftb, err); + + /* backward error */ + fromrealv(n, a, b); fromrealv(n, ffta, fftb); + for (i = 0; i < 2 * n; ++i) mul(fftb[i], ninv, fftb[i]); + fft1(n, fftb, -sign); + compare(n, b, fftb, err + 3); + + bench_free(fftb); + bench_free(b); +} + +void fftaccuracy_done(void) +{ + if (cached_bluestein_w) bench_free(cached_bluestein_w); + if (cached_bluestein_y) bench_free(cached_bluestein_y); + cached_bluestein_w = 0; + cached_bluestein_y = 0; + cached_bluestein_n = -1; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/my-getopt.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/my-getopt.c new file mode 100644 index 000000000..e4ba00704 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/my-getopt.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include + +#include "config.h" +#include "my-getopt.h" + +int my_optind = 1; +const char *my_optarg = 0; +static const char *scan_pointer = 0; + +void my_usage(const char *progname, const struct my_option *opt) +{ + int i; + size_t col = 0; + + fprintf(stdout, "Usage: %s", progname); + col += (strlen(progname) + 7); + for (i = 0; opt[i].long_name; i++) { + size_t option_len; + + option_len = strlen(opt[i].long_name); + if (col >= 80 - (option_len + 16)) { + fputs("\n\t", stdout); + col = 8; + } + fprintf(stdout, " [--%s", opt[i].long_name); + col += (option_len + 4); + if (opt[i].short_name < 128) { + fprintf(stdout, " | -%c", opt[i].short_name); + col += 5; + } + switch (opt[i].argtype) { + case REQARG: + fputs(" arg]", stdout); + col += 5; + break; + case OPTARG: + fputs(" [arg]]", stdout); + col += 10; + break; + default: + fputs("]", stdout); + col++; + } + } + + fputs ("\n", stdout); +} + +int my_getopt(int argc, char *argv[], const struct my_option *optarray) +{ + const char *p; + const struct my_option *l; + + if (scan_pointer && *scan_pointer) { + /* continue a previously scanned argv[] element */ + p = scan_pointer; + goto short_option; + } else { + /* new argv[] element */ + if (my_optind >= argc) + return -1; /* no more options */ + + p = argv[my_optind]; + + if (*p++ != '-') + return (-1); /* not an option */ + + if (!*p) + return (-1); /* string is exactly '-' */ + + ++my_optind; + } + + if (*p == '-') { + /* long option */ + scan_pointer = 0; + my_optarg = 0; + + ++p; + + for (l = optarray; l->short_name; ++l) { + size_t len = strlen(l->long_name); + if (!strncmp(l->long_name, p, len) && + (!p[len] || p[len] == '=')) { + switch (l->argtype) { + case NOARG: + goto ok; + case OPTARG: + if (p[len] == '=') + my_optarg = p + len + 1; + goto ok; + case REQARG: + if (p[len] == '=') { + my_optarg = p + len + 1; + goto ok; + } + if (my_optind >= argc) { + fprintf(stderr, + "option --%s requires an argument\n", + l->long_name); + return '?'; + } + my_optarg = argv[my_optind]; + ++my_optind; + goto ok; + } + } + } + } else { + short_option: + scan_pointer = 0; + my_optarg = 0; + + for (l = optarray; l->short_name; ++l) { + if (l->short_name == (char)l->short_name && + *p == l->short_name) { + ++p; + switch (l->argtype) { + case NOARG: + scan_pointer = p; + goto ok; + case OPTARG: + if (*p) + my_optarg = p; + goto ok; + case REQARG: + if (*p) { + my_optarg = p; + } else { + if (my_optind >= argc) { + fprintf(stderr, + "option -%c requires an argument\n", + l->short_name); + return '?'; + } + my_optarg = argv[my_optind]; + ++my_optind; + } + goto ok; + } + } + } + } + + fprintf(stderr, "unrecognized option %s\n", argv[my_optind - 1]); + return '?'; + + ok: + return l->short_name; +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/my-getopt.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/my-getopt.h new file mode 100644 index 000000000..d10c7a4a6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/my-getopt.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __MY_GETOPT_H__ +#define __MY_GETOPT_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +enum { REQARG, OPTARG, NOARG }; + +struct my_option { + const char *long_name; + int argtype; + int short_name; +}; + +extern int my_optind; +extern const char *my_optarg; + +extern void my_usage(const char *progname, const struct my_option *opt); +extern int my_getopt(int argc, char *argv[], const struct my_option *optarray); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __MY_GETOPT_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/ovtpvt.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/ovtpvt.c new file mode 100644 index 000000000..f45cad9e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/ovtpvt.c @@ -0,0 +1,28 @@ +#include +#include +#include +#include "libbench2/bench.h" + +void ovtpvt(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + if (verbose >= 0) + vfprintf(stdout, format, ap); + va_end(ap); + fflush(stdout); +} + +void ovtpvt_err(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + if (verbose >= 0) { + fflush(stdout); + vfprintf(stderr, format, ap); + } + va_end(ap); + fflush(stdout); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/pow2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/pow2.c new file mode 100644 index 000000000..37554718a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/pow2.c @@ -0,0 +1,6 @@ +#include "libbench2/bench.h" + +int power_of_two(int n) +{ + return (((n) > 0) && (((n) & ((n) - 1)) == 0)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/problem.c new file mode 100644 index 000000000..76266c32d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/problem.c @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "config.h" +#include "libbench2/bench.h" +#include +#include +#include +#include + +int always_pad_real = 0; /* by default, only pad in-place case */ + +typedef enum { + SAME, PADDED, HALFISH +} n_transform; + +/* funny transformations for last dimension of PROBLEM_REAL */ +static int transform_n(int n, n_transform nt) +{ + switch (nt) { + case SAME: return n; + case PADDED: return 2*(n/2+1); + case HALFISH: return (n/2+1); + default: BENCH_ASSERT(0); return 0; + } +} + +/* do what I mean */ +static bench_tensor *dwim(bench_tensor *t, bench_iodim **last_iodim, + n_transform nti, n_transform nto, + bench_iodim *dt) +{ + int i; + bench_iodim *d, *d1; + + if (!BENCH_FINITE_RNK(t->rnk) || t->rnk < 1) + return t; + + i = t->rnk; + d1 = *last_iodim; + + while (--i >= 0) { + d = t->dims + i; + if (!d->is) + d->is = d1->is * transform_n(d1->n, d1==dt ? nti : SAME); + if (!d->os) + d->os = d1->os * transform_n(d1->n, d1==dt ? nto : SAME); + d1 = d; + } + + *last_iodim = d1; + return t; +} + +static void transpose_tensor(bench_tensor *t) +{ + if (!BENCH_FINITE_RNK(t->rnk) || t->rnk < 2) + return; + + t->dims[0].os = t->dims[1].os; + t->dims[1].os = t->dims[0].os * t->dims[0].n; +} + +static const char *parseint(const char *s, int *n) +{ + int sign = 1; + + *n = 0; + + if (*s == '-') { + sign = -1; + ++s; + } else if (*s == '+') { + sign = +1; + ++s; + } + + BENCH_ASSERT(isdigit(*s)); + while (isdigit(*s)) { + *n = *n * 10 + (*s - '0'); + ++s; + } + + *n *= sign; + + if (*s == 'k' || *s == 'K') { + *n *= 1024; + ++s; + } + + if (*s == 'm' || *s == 'M') { + *n *= 1024 * 1024; + ++s; + } + + return s; +} + +struct dimlist { bench_iodim car; r2r_kind_t k; struct dimlist *cdr; }; + +static const char *parsetensor(const char *s, bench_tensor **tp, + r2r_kind_t **k) +{ + struct dimlist *l = 0, *m; + bench_tensor *t; + int rnk = 0; + + L1: + m = (struct dimlist *)bench_malloc(sizeof(struct dimlist)); + /* nconc onto l */ + m->cdr = l; l = m; + ++rnk; + + s = parseint(s, &m->car.n); + + if (*s == ':') { + /* read input stride */ + ++s; + s = parseint(s, &m->car.is); + if (*s == ':') { + /* read output stride */ + ++s; + s = parseint(s, &m->car.os); + } else { + /* default */ + m->car.os = m->car.is; + } + } else { + m->car.is = 0; + m->car.os = 0; + } + + if (*s == 'f' || *s == 'F') { + m->k = R2R_R2HC; + ++s; + } + else if (*s == 'b' || *s == 'B') { + m->k = R2R_HC2R; + ++s; + } + else if (*s == 'h' || *s == 'H') { + m->k = R2R_DHT; + ++s; + } + else if (*s == 'e' || *s == 'E' || *s == 'o' || *s == 'O') { + char c = *(s++); + int ab; + + s = parseint(s, &ab); + + if (c == 'e' || c == 'E') { + if (ab == 0) + m->k = R2R_REDFT00; + else if (ab == 1) + m->k = R2R_REDFT01; + else if (ab == 10) + m->k = R2R_REDFT10; + else if (ab == 11) + m->k = R2R_REDFT11; + else + BENCH_ASSERT(0); + } + else { + if (ab == 0) + m->k = R2R_RODFT00; + else if (ab == 1) + m->k = R2R_RODFT01; + else if (ab == 10) + m->k = R2R_RODFT10; + else if (ab == 11) + m->k = R2R_RODFT11; + else + BENCH_ASSERT(0); + } + } + else + m->k = R2R_R2HC; + + if (*s == 'x' || *s == 'X') { + ++s; + goto L1; + } + + /* now we have a dimlist. Build bench_tensor, etc. */ + + if (k && rnk > 0) { + int i; + *k = (r2r_kind_t *) bench_malloc(sizeof(r2r_kind_t) * rnk); + for (m = l, i = rnk - 1; i >= 0; --i, m = m->cdr) { + BENCH_ASSERT(m); + (*k)[i] = m->k; + } + } + + t = mktensor(rnk); + while (--rnk >= 0) { + bench_iodim *d = t->dims + rnk; + BENCH_ASSERT(l); + m = l; l = m->cdr; + d->n = m->car.n; + d->is = m->car.is; + d->os = m->car.os; + bench_free(m); + } + + *tp = t; + return s; +} + +/* parse a problem description, return a problem */ +bench_problem *problem_parse(const char *s) +{ + bench_problem *p; + bench_iodim last_iodim0 = {1,1,1}, *last_iodim = &last_iodim0; + bench_iodim *sz_last_iodim; + bench_tensor *sz; + n_transform nti = SAME, nto = SAME; + int transpose = 0; + + p = (bench_problem *) bench_malloc(sizeof(bench_problem)); + p->kind = PROBLEM_COMPLEX; + p->k = 0; + p->sign = -1; + p->in = p->out = 0; + p->inphys = p->outphys = 0; + p->iphyssz = p->ophyssz = 0; + p->in_place = 0; + p->destroy_input = 0; + p->split = 0; + p->userinfo = 0; + p->scrambled_in = p->scrambled_out = 0; + p->sz = p->vecsz = 0; + p->ini = p->outi = 0; + p->pstring = (char *) bench_malloc(sizeof(char) * (strlen(s) + 1)); + strcpy(p->pstring, s); + + L1: + switch (tolower(*s)) { + case 'i': p->in_place = 1; ++s; goto L1; + case 'o': p->in_place = 0; ++s; goto L1; + case 'd': p->destroy_input = 1; ++s; goto L1; + case '/': p->split = 1; ++s; goto L1; + case 'f': + case '-': p->sign = -1; ++s; goto L1; + case 'b': + case '+': p->sign = 1; ++s; goto L1; + case 'r': p->kind = PROBLEM_REAL; ++s; goto L1; + case 'c': p->kind = PROBLEM_COMPLEX; ++s; goto L1; + case 'k': p->kind = PROBLEM_R2R; ++s; goto L1; + case 't': transpose = 1; ++s; goto L1; + + /* hack for MPI: */ + case '[': p->scrambled_in = 1; ++s; goto L1; + case ']': p->scrambled_out = 1; ++s; goto L1; + + default : ; + } + + s = parsetensor(s, &sz, p->kind == PROBLEM_R2R ? &p->k : 0); + + if (p->kind == PROBLEM_REAL) { + if (p->sign < 0) { + nti = p->in_place || always_pad_real ? PADDED : SAME; + nto = HALFISH; + } + else { + nti = HALFISH; + nto = p->in_place || always_pad_real ? PADDED : SAME; + } + } + + sz_last_iodim = sz->dims + sz->rnk - 1; + if (*s == '*') { /* "external" vector */ + ++s; + p->sz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim); + s = parsetensor(s, &sz, 0); + p->vecsz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim); + } else if (*s == 'v' || *s == 'V') { /* "internal" vector */ + bench_tensor *vecsz; + ++s; + s = parsetensor(s, &vecsz, 0); + p->vecsz = dwim(vecsz, &last_iodim, nti, nto, sz_last_iodim); + p->sz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim); + } else { + p->sz = dwim(sz, &last_iodim, nti, nto, sz_last_iodim); + p->vecsz = mktensor(0); + } + + if (transpose) { + transpose_tensor(p->sz); + transpose_tensor(p->vecsz); + } + + if (!p->in_place) + p->out = ((bench_real *) p->in) + (1 << 20); /* whatever */ + + BENCH_ASSERT(p->sz && p->vecsz); + BENCH_ASSERT(!*s); + return p; +} + +void problem_destroy(bench_problem *p) +{ + BENCH_ASSERT(p); + problem_free(p); + bench_free0(p->k); + bench_free0(p->pstring); + bench_free(p); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/report.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/report.c new file mode 100644 index 000000000..65fa9cfd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/report.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" +#include +#include +#include + +void (*report)(const bench_problem *p, double *t, int st); + +#undef min +#undef max /* you never know */ + +struct stats { + double min; + double max; + double avg; + double median; +}; + +static void mkstat(double *t, int st, struct stats *a) +{ + int i, j; + + a->min = t[0]; + a->max = t[0]; + a->avg = 0.0; + + for (i = 0; i < st; ++i) { + if (t[i] < a->min) + a->min = t[i]; + if (t[i] > a->max) + a->max = t[i]; + a->avg += t[i]; + } + a->avg /= (double)st; + + /* compute median --- silly bubblesort algorithm */ + for (i = st - 1; i > 1; --i) { + for (j = 0; j < i - 1; ++j) { + double t0, t1; + if ((t0 = t[j]) > (t1 = t[j + 1])) { + t[j] = t1; + t[j + 1] = t0; + } + } + } + a->median = t[st / 2]; +} + +void report_mflops(const bench_problem *p, double *t, int st) +{ + struct stats s; + mkstat(t, st, &s); + ovtpvt("(%g %g %g %g)\n", + mflops(p, s.max), mflops(p, s.avg), + mflops(p, s.min), mflops(p, s.median)); +} + +void report_time(const bench_problem *p, double *t, int st) +{ + struct stats s; + UNUSED(p); + mkstat(t, st, &s); + ovtpvt("(%g %g %g %g)\n", s.min, s.avg, s.max, s.median); +} + +void report_benchmark(const bench_problem *p, double *t, int st) +{ + struct stats s; + mkstat(t, st, &s); + ovtpvt("%.5g %.8g %g\n", mflops(p, s.min), s.min, p->setup_time); +} + +static void sprintf_time(double x, char *buf, int buflen) +{ +#ifdef HAVE_SNPRINTF +# define MY_SPRINTF(a, b) snprintf(buf, buflen, a, b) +#else +# define MY_SPRINTF(a, b) sprintf(buf, a, b) +#endif + if (x < 1.0E-6) + MY_SPRINTF("%.2f ns", x * 1.0E9); + else if (x < 1.0E-3) + MY_SPRINTF("%.2f us", x * 1.0E6); + else if (x < 1.0) + MY_SPRINTF("%.2f ms", x * 1.0E3); + else + MY_SPRINTF("%.2f s", x); +#undef MY_SPRINTF +} + +void report_verbose(const bench_problem *p, double *t, int st) +{ + struct stats s; + char bmin[64], bmax[64], bavg[64], bmedian[64], btmin[64]; + char bsetup[64]; + int copyp = tensor_sz(p->sz) == 1; + + mkstat(t, st, &s); + + sprintf_time(s.min, bmin, 64); + sprintf_time(s.max, bmax, 64); + sprintf_time(s.avg, bavg, 64); + sprintf_time(s.median, bmedian, 64); + sprintf_time(time_min, btmin, 64); + sprintf_time(p->setup_time, bsetup, 64); + + ovtpvt("Problem: %s, setup: %s, time: %s, %s: %.5g\n", + p->pstring, bsetup, bmin, + copyp ? "fp-move/us" : "``mflops''", + mflops(p, s.min)); + + if (verbose) { + ovtpvt("Took %d measurements for at least %s each.\n", st, btmin); + ovtpvt("Time: min %s, max %s, avg %s, median %s\n", + bmin, bmax, bavg, bmedian); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/speed.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/speed.c new file mode 100644 index 000000000..a97ce4042 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/speed.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" + +int no_speed_allocation = 0; /* 1 to not allocate array data in speed() */ + +void speed(const char *param, int setup_only) +{ + double *t; + int iter = 0, k; + bench_problem *p; + double tmin, y; + + t = (double *) bench_malloc(time_repeat * sizeof(double)); + + for (k = 0; k < time_repeat; ++k) + t[k] = 0; + + p = problem_parse(param); + BENCH_ASSERT(can_do(p)); + if (!no_speed_allocation) { + problem_alloc(p); + problem_zero(p); + } + + timer_start(LIBBENCH_TIMER); + setup(p); + p->setup_time = bench_cost_postprocess(timer_stop(LIBBENCH_TIMER)); + + /* reset the input to zero again, because the planner in paranoid + mode sets it to random values, thus making the benchmark + diverge. */ + if (!no_speed_allocation) + problem_zero(p); + + if (setup_only) + goto done; + + start_over: + for (iter = 1; iter < (1<<30); iter *= 2) { + tmin = 1.0e20; + for (k = 0; k < time_repeat; ++k) { + timer_start(LIBBENCH_TIMER); + doit(iter, p); + y = bench_cost_postprocess(timer_stop(LIBBENCH_TIMER)); + if (y < 0) /* yes, it happens */ + goto start_over; + t[k] = y; + if (y < tmin) + tmin = y; + } + + if (tmin >= time_min) + goto done; + } + + goto start_over; /* this also happens */ + + done: + done(p); + + if (iter) + for (k = 0; k < time_repeat; ++k) + t[k] /= iter; + else + for (k = 0; k < time_repeat; ++k) + t[k] = 0; + + report(p, t, time_repeat); + + if (!no_speed_allocation) + problem_destroy(p); + bench_free(t); + return; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/tensor.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/tensor.c new file mode 100644 index 000000000..1a7ac713b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/tensor.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "libbench2/bench.h" +#include + +bench_tensor *mktensor(int rnk) +{ + bench_tensor *x; + + BENCH_ASSERT(rnk >= 0); + + x = (bench_tensor *)bench_malloc(sizeof(bench_tensor)); + if (BENCH_FINITE_RNK(rnk) && rnk > 0) + x->dims = (bench_iodim *)bench_malloc(sizeof(bench_iodim) * rnk); + else + x->dims = 0; + + x->rnk = rnk; + return x; +} + +void tensor_destroy(bench_tensor *sz) +{ + bench_free0(sz->dims); + bench_free(sz); +} + +size_t tensor_sz(const bench_tensor *sz) +{ + int i; + size_t n = 1; + + if (!BENCH_FINITE_RNK(sz->rnk)) + return 0; + + for (i = 0; i < sz->rnk; ++i) + n *= sz->dims[i].n; + return n; +} + + +/* total order among bench_iodim's */ +static int dimcmp(const bench_iodim *a, const bench_iodim *b) +{ + if (b->is != a->is) + return (b->is - a->is); /* shorter strides go later */ + if (b->os != a->os) + return (b->os - a->os); /* shorter strides go later */ + return (int)(a->n - b->n); /* larger n's go later */ +} + +bench_tensor *tensor_compress(const bench_tensor *sz) +{ + int i, rnk; + bench_tensor *x; + + BENCH_ASSERT(BENCH_FINITE_RNK(sz->rnk)); + for (i = rnk = 0; i < sz->rnk; ++i) { + BENCH_ASSERT(sz->dims[i].n > 0); + if (sz->dims[i].n != 1) + ++rnk; + } + + x = mktensor(rnk); + for (i = rnk = 0; i < sz->rnk; ++i) { + if (sz->dims[i].n != 1) + x->dims[rnk++] = sz->dims[i]; + } + + if (rnk) { + /* God knows how qsort() behaves if n==0 */ + qsort(x->dims, (size_t)x->rnk, sizeof(bench_iodim), + (int (*)(const void *, const void *))dimcmp); + } + + return x; +} + +int tensor_unitstridep(bench_tensor *t) +{ + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); + return (t->rnk == 0 || + (t->dims[t->rnk - 1].is == 1 && t->dims[t->rnk - 1].os == 1)); +} + +/* detect screwy real padded rowmajor... ugh */ +int tensor_real_rowmajorp(bench_tensor *t, int sign, int in_place) +{ + int i; + + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); + + i = t->rnk - 1; + + if (--i >= 0) { + bench_iodim *d = t->dims + i; + if (sign < 0) { + if (d[0].is != d[1].is * (in_place ? 2*(d[1].n/2 + 1) : d[1].n)) + return 0; + if (d[0].os != d[1].os * (d[1].n/2 + 1)) + return 0; + } + else { + if (d[0].is != d[1].is * (d[1].n/2 + 1)) + return 0; + if (d[0].os != d[1].os * (in_place ? 2*(d[1].n/2 + 1) : d[1].n)) + return 0; + } + } + + while (--i >= 0) { + bench_iodim *d = t->dims + i; + if (d[0].is != d[1].is * d[1].n) + return 0; + if (d[0].os != d[1].os * d[1].n) + return 0; + } + return 1; +} + +int tensor_rowmajorp(bench_tensor *t) +{ + int i; + + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); + + i = t->rnk - 1; + while (--i >= 0) { + bench_iodim *d = t->dims + i; + if (d[0].is != d[1].is * d[1].n) + return 0; + if (d[0].os != d[1].os * d[1].n) + return 0; + } + return 1; +} + +static void dimcpy(bench_iodim *dst, const bench_iodim *src, int rnk) +{ + int i; + if (BENCH_FINITE_RNK(rnk)) + for (i = 0; i < rnk; ++i) + dst[i] = src[i]; +} + +bench_tensor *tensor_append(const bench_tensor *a, const bench_tensor *b) +{ + if (!BENCH_FINITE_RNK(a->rnk) || !BENCH_FINITE_RNK(b->rnk)) { + return mktensor(BENCH_RNK_MINFTY); + } else { + bench_tensor *x = mktensor(a->rnk + b->rnk); + dimcpy(x->dims, a->dims, a->rnk); + dimcpy(x->dims + a->rnk, b->dims, b->rnk); + return x; + } +} + +static int imax(int a, int b) +{ + return (a > b) ? a : b; +} + +static int imin(int a, int b) +{ + return (a < b) ? a : b; +} + +#define DEFBOUNDS(name, xs) \ +void name(bench_tensor *t, int *lbp, int *ubp) \ +{ \ + int lb = 0; \ + int ub = 1; \ + int i; \ + \ + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); \ + \ + for (i = 0; i < t->rnk; ++i) { \ + bench_iodim *d = t->dims + i; \ + int n = d->n; \ + int s = d->xs; \ + lb = imin(lb, lb + s * (n - 1)); \ + ub = imax(ub, ub + s * (n - 1)); \ + } \ + \ + *lbp = lb; \ + *ubp = ub; \ +} + +DEFBOUNDS(tensor_ibounds, is) +DEFBOUNDS(tensor_obounds, os) + +bench_tensor *tensor_copy(const bench_tensor *sz) +{ + bench_tensor *x = mktensor(sz->rnk); + dimcpy(x->dims, sz->dims, sz->rnk); + return x; +} + +/* Like tensor_copy, but copy only rnk dimensions starting with start_dim. */ +bench_tensor *tensor_copy_sub(const bench_tensor *sz, int start_dim, int rnk) +{ + bench_tensor *x; + + BENCH_ASSERT(BENCH_FINITE_RNK(sz->rnk) && start_dim + rnk <= sz->rnk); + x = mktensor(rnk); + dimcpy(x->dims, sz->dims + start_dim, rnk); + return x; +} + +bench_tensor *tensor_copy_swapio(const bench_tensor *sz) +{ + bench_tensor *x = tensor_copy(sz); + int i; + if (BENCH_FINITE_RNK(x->rnk)) + for (i = 0; i < x->rnk; ++i) { + int s; + s = x->dims[i].is; + x->dims[i].is = x->dims[i].os; + x->dims[i].os = s; + } + return x; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/timer.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/timer.c new file mode 100644 index 000000000..a466f2f92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/timer.c @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" +#include + +/* + * System-dependent timing functions: + */ +#ifdef HAVE_SYS_TIME_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_BSDGETTIMEOFDAY +#ifndef HAVE_GETTIMEOFDAY +#define gettimeofday BSDgettimeofday +#define HAVE_GETTIMEOFDAY 1 +#endif +#endif + +double time_min; +int time_repeat; + +#if !defined(HAVE_TIMER) && (defined(__WIN32__) || defined(_WIN32) || defined(_WINDOWS) || defined(__CYGWIN__)) +#include +typedef LARGE_INTEGER mytime; + +static mytime get_time(void) +{ + mytime tv; + QueryPerformanceCounter(&tv); + return tv; +} + +static double elapsed(mytime t1, mytime t0) +{ + LARGE_INTEGER freq; + QueryPerformanceFrequency(&freq); + return (((double) t1.QuadPart - (double) t0.QuadPart)) / + ((double) freq.QuadPart); +} + +#define HAVE_TIMER +#endif + + +#if defined(HAVE_GETTIMEOFDAY) && !defined(HAVE_TIMER) +typedef struct timeval mytime; + +static mytime get_time(void) +{ + struct timeval tv; + gettimeofday(&tv, 0); + return tv; +} + +static double elapsed(mytime t1, mytime t0) +{ + return ((double) t1.tv_sec - (double) t0.tv_sec) + + ((double) t1.tv_usec - (double) t0.tv_usec) * 1.0E-6; +} + +#define HAVE_TIMER +#endif + +#ifndef HAVE_TIMER +#error "timer not defined" +#endif + +static double calibrate(void) +{ + /* there seems to be no reasonable way to calibrate the + clock automatically any longer. Grrr... */ + + return 0.01; +} + + +void timer_init(double tmin, int repeat) +{ + static int inited = 0; + + if (inited) + return; + inited = 1; + + if (!repeat) + repeat = 8; + time_repeat = repeat; + + if (tmin > 0) + time_min = tmin; + else + time_min = calibrate(); +} + +static mytime t0[BENCH_NTIMERS]; + +void timer_start(int n) +{ + BENCH_ASSERT(n >= 0 && n < BENCH_NTIMERS); + t0[n] = get_time(); +} + +double timer_stop(int n) +{ + mytime t1; + BENCH_ASSERT(n >= 0 && n < BENCH_NTIMERS); + t1 = get_time(); + return elapsed(t1, t0[n]); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/useropt.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/useropt.c new file mode 100644 index 000000000..2cf63298a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/useropt.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2000 Matteo Frigo + * Copyright (c) 2000 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include +#include +#include "libbench2/bench.h" + +void useropt(const char *arg) +{ + ovtpvt_err("unknown user option: %s. Ignoring.\n", arg); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/util.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/util.c new file mode 100644 index 000000000..aa15d2823 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/util.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2000 Matteo Frigo + * Copyright (c) 2000 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "libbench2/bench.h" +#include +#include +#include +#include + +#if defined(HAVE_MALLOC_H) +# include +#endif + +#if defined(HAVE_DECL_MEMALIGN) && !HAVE_DECL_MEMALIGN +extern void *memalign(size_t, size_t); +#endif + +#if defined(HAVE_DECL_POSIX_MEMALIGN) && !HAVE_DECL_POSIX_MEMALIGN +extern int posix_memalign(void **, size_t, size_t); +#endif + +void bench_assertion_failed(const char *s, int line, const char *file) +{ + ovtpvt_err("bench: %s:%d: assertion failed: %s\n", file, line, s); + bench_exit(EXIT_FAILURE); +} + +#ifdef HAVE_DRAND48 +# if defined(HAVE_DECL_DRAND48) && !HAVE_DECL_DRAND48 +extern double drand48(void); +# endif +double bench_drand(void) +{ + return drand48() - 0.5; +} +# if defined(HAVE_DECL_SRAND48) && !HAVE_DECL_SRAND48 +extern void srand48(long); +# endif +void bench_srand(int seed) +{ + srand48(seed); +} +#else +double bench_drand(void) +{ + double d = rand(); + return (d / (double) RAND_MAX) - 0.5; +} +void bench_srand(int seed) +{ + srand(seed); +} +#endif + +/********************************************************** + * DEBUGGING CODE + **********************************************************/ +#ifdef BENCH_DEBUG +static int bench_malloc_cnt = 0; + +/* + * debugging malloc/free. Initialize every malloced and freed area to + * random values, just to make sure we are not using uninitialized + * pointers. Also check for writes past the ends of allocated blocks, + * and a couple of other things. + * + * This code is a quick and dirty hack -- use at your own risk. + */ + +static int bench_malloc_total = 0, bench_malloc_max = 0, bench_malloc_cnt_max = 0; + +#define MAGIC ((size_t)0xABadCafe) +#define PAD_FACTOR 2 +#define TWO_SIZE_T (2 * sizeof(size_t)) + +#define VERBOSE_ALLOCATION 0 + +#if VERBOSE_ALLOCATION +#define WHEN_VERBOSE(a) a +#else +#define WHEN_VERBOSE(a) +#endif + +void *bench_malloc(size_t n) +{ + char *p; + size_t i; + + bench_malloc_total += n; + + if (bench_malloc_total > bench_malloc_max) + bench_malloc_max = bench_malloc_total; + + p = (char *) malloc(PAD_FACTOR * n + TWO_SIZE_T); + BENCH_ASSERT(p); + + /* store the size in a known position */ + ((size_t *) p)[0] = n; + ((size_t *) p)[1] = MAGIC; + for (i = 0; i < PAD_FACTOR * n; i++) + p[i + TWO_SIZE_T] = (char) (i ^ 0xDEADBEEF); + + ++bench_malloc_cnt; + + if (bench_malloc_cnt > bench_malloc_cnt_max) + bench_malloc_cnt_max = bench_malloc_cnt; + + /* skip the size we stored previously */ + return (void *) (p + TWO_SIZE_T); +} + +void bench_free(void *p) +{ + char *q; + + BENCH_ASSERT(p); + + q = ((char *) p) - TWO_SIZE_T; + BENCH_ASSERT(q); + + { + size_t n = ((size_t *) q)[0]; + size_t magic = ((size_t *) q)[1]; + size_t i; + + ((size_t *) q)[0] = 0; /* set to zero to detect duplicate free's */ + + BENCH_ASSERT(magic == MAGIC); + ((size_t *) q)[1] = ~MAGIC; + + bench_malloc_total -= n; + BENCH_ASSERT(bench_malloc_total >= 0); + + /* check for writing past end of array: */ + for (i = n; i < PAD_FACTOR * n; ++i) + if (q[i + TWO_SIZE_T] != (char) (i ^ 0xDEADBEEF)) { + BENCH_ASSERT(0 /* array bounds overwritten */); + } + for (i = 0; i < PAD_FACTOR * n; ++i) + q[i + TWO_SIZE_T] = (char) (i ^ 0xBEEFDEAD); + + --bench_malloc_cnt; + + BENCH_ASSERT(bench_malloc_cnt >= 0); + + BENCH_ASSERT( + (bench_malloc_cnt == 0 && bench_malloc_total == 0) || + (bench_malloc_cnt > 0 && bench_malloc_total > 0)); + + free(q); + } +} + +#else +/********************************************************** + * NON DEBUGGING CODE + **********************************************************/ +/* production version, no hacks */ + +#define MIN_ALIGNMENT 128 /* must be power of two */ + +#define real_free free /* memalign and malloc use ordinary free */ + +void *bench_malloc(size_t n) +{ + void *p; + if (n == 0) n = 1; + +#if defined(WITH_OUR_MALLOC) + /* Our own aligned malloc/free. Assumes sizeof(void*) is + a power of two <= 8 and that malloc is at least + sizeof(void*)-aligned. Assumes size_t = uintptr_t. */ + { + void *p0; + if ((p0 = malloc(n + MIN_ALIGNMENT))) { + p = (void *) (((size_t) p0 + MIN_ALIGNMENT) & (~((size_t) (MIN_ALIGNMENT - 1)))); + *((void **) p - 1) = p0; + } + else + p = (void *) 0; + } +#elif defined(HAVE_MEMALIGN) + p = memalign(MIN_ALIGNMENT, n); +#elif defined(HAVE_POSIX_MEMALIGN) + /* note: posix_memalign is broken in glibc 2.2.5: it constrains + the size, not the alignment, to be (power of two) * sizeof(void*). + The bug seems to have been fixed as of glibc 2.3.1. */ + if (posix_memalign(&p, MIN_ALIGNMENT, n)) + p = (void*) 0; +#elif defined(__ICC) || defined(__INTEL_COMPILER) || defined(HAVE__MM_MALLOC) + /* Intel's C compiler defines _mm_malloc and _mm_free intrinsics */ + p = (void *) _mm_malloc(n, MIN_ALIGNMENT); +# undef real_free +# define real_free _mm_free +#else + p = malloc(n); +#endif + + BENCH_ASSERT(p); + return p; +} + +void bench_free(void *p) +{ +#ifdef WITH_OUR_MALLOC + if (p) free(*((void **) p - 1)); +#else + real_free(p); +#endif +} + +#endif + +void bench_free0(void *p) +{ + if (p) bench_free(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-dft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-dft.c new file mode 100644 index 000000000..8760e0151 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-dft.c @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "verify.h" + +/* copy A into B, using output stride of A and input stride of B */ +typedef struct { + dotens2_closure k; + R *ra; R *ia; + R *rb; R *ib; + int scalea, scaleb; +} cpy_closure; + +static void cpy0(dotens2_closure *k_, + int indxa, int ondxa, int indxb, int ondxb) +{ + cpy_closure *k = (cpy_closure *)k_; + k->rb[indxb * k->scaleb] = k->ra[ondxa * k->scalea]; + k->ib[indxb * k->scaleb] = k->ia[ondxa * k->scalea]; + UNUSED(indxa); UNUSED(ondxb); +} + +static void cpy(R *ra, R *ia, const bench_tensor *sza, int scalea, + R *rb, R *ib, const bench_tensor *szb, int scaleb) +{ + cpy_closure k; + k.k.apply = cpy0; + k.ra = ra; k.ia = ia; k.rb = rb; k.ib = ib; + k.scalea = scalea; k.scaleb = scaleb; + bench_dotens2(sza, szb, &k.k); +} + +typedef struct { + dofft_closure k; + bench_problem *p; +} dofft_dft_closure; + +static void dft_apply(dofft_closure *k_, bench_complex *in, bench_complex *out) +{ + dofft_dft_closure *k = (dofft_dft_closure *)k_; + bench_problem *p = k->p; + bench_tensor *totalsz, *pckdsz; + bench_tensor *totalsz_swap, *pckdsz_swap; + bench_real *ri, *ii, *ro, *io; + int totalscale; + + totalsz = tensor_append(p->vecsz, p->sz); + pckdsz = verify_pack(totalsz, 2); + ri = (bench_real *) p->in; + ro = (bench_real *) p->out; + + totalsz_swap = tensor_copy_swapio(totalsz); + pckdsz_swap = tensor_copy_swapio(pckdsz); + + /* confusion: the stride is the distance between complex elements + when using interleaved format, but it is the distance between + real elements when using split format */ + if (p->split) { + ii = p->ini ? (bench_real *) p->ini : ri + p->iphyssz; + io = p->outi ? (bench_real *) p->outi : ro + p->ophyssz; + totalscale = 1; + } else { + ii = p->ini ? (bench_real *) p->ini : ri + 1; + io = p->outi ? (bench_real *) p->outi : ro + 1; + totalscale = 2; + } + + cpy(&c_re(in[0]), &c_im(in[0]), pckdsz, 1, + ri, ii, totalsz, totalscale); + after_problem_ccopy_from(p, ri, ii); + doit(1, p); + after_problem_ccopy_to(p, ro, io); + if (k->k.recopy_input) + cpy(ri, ii, totalsz_swap, totalscale, + &c_re(in[0]), &c_im(in[0]), pckdsz_swap, 1); + cpy(ro, io, totalsz, totalscale, + &c_re(out[0]), &c_im(out[0]), pckdsz, 1); + + tensor_destroy(totalsz); + tensor_destroy(pckdsz); + tensor_destroy(totalsz_swap); + tensor_destroy(pckdsz_swap); +} + +void verify_dft(bench_problem *p, int rounds, double tol, errors *e) +{ + C *inA, *inB, *inC, *outA, *outB, *outC, *tmp; + int n, vecn, N; + dofft_dft_closure k; + + BENCH_ASSERT(p->kind == PROBLEM_COMPLEX); + + k.k.apply = dft_apply; + k.k.recopy_input = 0; + k.p = p; + + if (rounds == 0) + rounds = 20; /* default value */ + + n = tensor_sz(p->sz); + vecn = tensor_sz(p->vecsz); + N = n * vecn; + + inA = (C *) bench_malloc(N * sizeof(C)); + inB = (C *) bench_malloc(N * sizeof(C)); + inC = (C *) bench_malloc(N * sizeof(C)); + outA = (C *) bench_malloc(N * sizeof(C)); + outB = (C *) bench_malloc(N * sizeof(C)); + outC = (C *) bench_malloc(N * sizeof(C)); + tmp = (C *) bench_malloc(N * sizeof(C)); + + e->i = impulse(&k.k, n, vecn, inA, inB, inC, outA, outB, outC, + tmp, rounds, tol); + e->l = linear(&k.k, 0, N, inA, inB, inC, outA, outB, outC, + tmp, rounds, tol); + + e->s = 0.0; + e->s = dmax(e->s, tf_shift(&k.k, 0, p->sz, n, vecn, p->sign, + inA, inB, outA, outB, + tmp, rounds, tol, TIME_SHIFT)); + e->s = dmax(e->s, tf_shift(&k.k, 0, p->sz, n, vecn, p->sign, + inA, inB, outA, outB, + tmp, rounds, tol, FREQ_SHIFT)); + + if (!p->in_place && !p->destroy_input) + preserves_input(&k.k, 0, N, inA, inB, outB, rounds); + + bench_free(tmp); + bench_free(outC); + bench_free(outB); + bench_free(outA); + bench_free(inC); + bench_free(inB); + bench_free(inA); +} + + +void accuracy_dft(bench_problem *p, int rounds, int impulse_rounds, + double t[6]) +{ + dofft_dft_closure k; + int n; + C *a, *b; + + BENCH_ASSERT(p->kind == PROBLEM_COMPLEX); + BENCH_ASSERT(p->sz->rnk == 1); + BENCH_ASSERT(p->vecsz->rnk == 0); + + k.k.apply = dft_apply; + k.k.recopy_input = 0; + k.p = p; + n = tensor_sz(p->sz); + + a = (C *) bench_malloc(n * sizeof(C)); + b = (C *) bench_malloc(n * sizeof(C)); + accuracy_test(&k.k, 0, p->sign, n, a, b, rounds, impulse_rounds, t); + bench_free(b); + bench_free(a); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-lib.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-lib.c new file mode 100644 index 000000000..2a069b2e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-lib.c @@ -0,0 +1,545 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "verify.h" +#include +#include +#include + +/* + * Utility functions: + */ +static double dabs(double x) { return (x < 0.0) ? -x : x; } +static double dmin(double x, double y) { return (x < y) ? x : y; } +static double norm2(double x, double y) { return dmax(dabs(x), dabs(y)); } + +double dmax(double x, double y) { return (x > y) ? x : y; } + +static double aerror(C *a, C *b, int n) +{ + if (n > 0) { + /* compute the relative Linf error */ + double e = 0.0, mag = 0.0; + int i; + + for (i = 0; i < n; ++i) { + e = dmax(e, norm2(c_re(a[i]) - c_re(b[i]), + c_im(a[i]) - c_im(b[i]))); + mag = dmax(mag, + dmin(norm2(c_re(a[i]), c_im(a[i])), + norm2(c_re(b[i]), c_im(b[i])))); + } + e /= mag; + +#ifdef HAVE_ISNAN + BENCH_ASSERT(!isnan(e)); +#endif + return e; + } else + return 0.0; +} + +#ifdef HAVE_DRAND48 +# if defined(HAVE_DECL_DRAND48) && !HAVE_DECL_DRAND48 +extern double drand48(void); +# endif +double mydrand(void) +{ + return drand48() - 0.5; +} +#else +double mydrand(void) +{ + double d = rand(); + return (d / (double) RAND_MAX) - 0.5; +} +#endif + +void arand(C *a, int n) +{ + int i; + + /* generate random inputs */ + for (i = 0; i < n; ++i) { + c_re(a[i]) = mydrand(); + c_im(a[i]) = mydrand(); + } +} + +/* make array real */ +void mkreal(C *A, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + c_im(A[i]) = 0.0; + } +} + +static void assign_conj(C *Ac, C *A, int rank, const bench_iodim *dim, int stride) +{ + if (rank == 0) { + c_re(*Ac) = c_re(*A); + c_im(*Ac) = -c_im(*A); + } + else { + int i, n0 = dim[rank - 1].n, s = stride; + rank -= 1; + stride *= n0; + assign_conj(Ac, A, rank, dim, stride); + for (i = 1; i < n0; ++i) + assign_conj(Ac + (n0 - i) * s, A + i * s, rank, dim, stride); + } +} + +/* make array hermitian */ +void mkhermitian(C *A, int rank, const bench_iodim *dim, int stride) +{ + if (rank == 0) + c_im(*A) = 0.0; + else { + int i, n0 = dim[rank - 1].n, s = stride; + rank -= 1; + stride *= n0; + mkhermitian(A, rank, dim, stride); + for (i = 1; 2*i < n0; ++i) + assign_conj(A + (n0 - i) * s, A + i * s, rank, dim, stride); + if (2*i == n0) + mkhermitian(A + i * s, rank, dim, stride); + } +} + +void mkhermitian1(C *a, int n) +{ + bench_iodim d; + + d.n = n; + d.is = d.os = 1; + mkhermitian(a, 1, &d, 1); +} + +/* C = A */ +void acopy(C *c, C *a, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + c_re(c[i]) = c_re(a[i]); + c_im(c[i]) = c_im(a[i]); + } +} + +/* C = A + B */ +void aadd(C *c, C *a, C *b, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + c_re(c[i]) = c_re(a[i]) + c_re(b[i]); + c_im(c[i]) = c_im(a[i]) + c_im(b[i]); + } +} + +/* C = A - B */ +void asub(C *c, C *a, C *b, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + c_re(c[i]) = c_re(a[i]) - c_re(b[i]); + c_im(c[i]) = c_im(a[i]) - c_im(b[i]); + } +} + +/* B = rotate left A (complex) */ +void arol(C *b, C *a, int n, int nb, int na) +{ + int i, ib, ia; + + for (ib = 0; ib < nb; ++ib) { + for (i = 0; i < n - 1; ++i) + for (ia = 0; ia < na; ++ia) { + C *pb = b + (ib * n + i) * na + ia; + C *pa = a + (ib * n + i + 1) * na + ia; + c_re(*pb) = c_re(*pa); + c_im(*pb) = c_im(*pa); + } + + for (ia = 0; ia < na; ++ia) { + C *pb = b + (ib * n + n - 1) * na + ia; + C *pa = a + ib * n * na + ia; + c_re(*pb) = c_re(*pa); + c_im(*pb) = c_im(*pa); + } + } +} + +void aphase_shift(C *b, C *a, int n, int nb, int na, double sign) +{ + int j, jb, ja; + trigreal twopin; + twopin = K2PI / n; + + for (jb = 0; jb < nb; ++jb) + for (j = 0; j < n; ++j) { + trigreal s = sign * SIN(j * twopin); + trigreal c = COS(j * twopin); + + for (ja = 0; ja < na; ++ja) { + int k = (jb * n + j) * na + ja; + c_re(b[k]) = c_re(a[k]) * c - c_im(a[k]) * s; + c_im(b[k]) = c_re(a[k]) * s + c_im(a[k]) * c; + } + } +} + +/* A = alpha * A (complex, in place) */ +void ascale(C *a, C alpha, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + R xr = c_re(a[i]), xi = c_im(a[i]); + c_re(a[i]) = xr * c_re(alpha) - xi * c_im(alpha); + c_im(a[i]) = xr * c_im(alpha) + xi * c_re(alpha); + } +} + + +double acmp(C *a, C *b, int n, const char *test, double tol) +{ + double d = aerror(a, b, n); + if (d > tol) { + ovtpvt_err("Found relative error %e (%s)\n", d, test); + + { + int i, N; + N = n > 300 && verbose <= 2 ? 300 : n; + for (i = 0; i < N; ++i) + ovtpvt_err("%8d %16.12f %16.12f %16.12f %16.12f\n", i, + (double) c_re(a[i]), (double) c_im(a[i]), + (double) c_re(b[i]), (double) c_im(b[i])); + } + + bench_exit(EXIT_FAILURE); + } + return d; +} + + +/* + * Implementation of the FFT tester described in + * + * Funda Ergün. Testing multivariate linear functions: Overcoming the + * generator bottleneck. In Proceedings of the Twenty-Seventh Annual + * ACM Symposium on the Theory of Computing, pages 407-416, Las Vegas, + * Nevada, 29 May--1 June 1995. + * + * Also: F. Ergun, S. R. Kumar, and D. Sivakumar, "Self-testing without + * the generator bottleneck," SIAM J. on Computing 29 (5), 1630-51 (2000). + */ + +static double impulse0(dofft_closure *k, + int n, int vecn, + C *inA, C *inB, C *inC, + C *outA, C *outB, C *outC, + C *tmp, int rounds, double tol) +{ + int N = n * vecn; + double e = 0.0; + int j; + + k->apply(k, inA, tmp); + e = dmax(e, acmp(tmp, outA, N, "impulse 1", tol)); + + for (j = 0; j < rounds; ++j) { + arand(inB, N); + asub(inC, inA, inB, N); + k->apply(k, inB, outB); + k->apply(k, inC, outC); + aadd(tmp, outB, outC, N); + e = dmax(e, acmp(tmp, outA, N, "impulse", tol)); + } + return e; +} + +double impulse(dofft_closure *k, + int n, int vecn, + C *inA, C *inB, C *inC, + C *outA, C *outB, C *outC, + C *tmp, int rounds, double tol) +{ + int i, j; + double e = 0.0; + + /* check impulsive input */ + for (i = 0; i < vecn; ++i) { + R x = (sqrt(n)*(i+1)) / (double)(vecn+1); + for (j = 0; j < n; ++j) { + c_re(inA[j + i * n]) = 0; + c_im(inA[j + i * n]) = 0; + c_re(outA[j + i * n]) = x; + c_im(outA[j + i * n]) = 0; + } + c_re(inA[i * n]) = x; + c_im(inA[i * n]) = 0; + } + + e = dmax(e, impulse0(k, n, vecn, inA, inB, inC, outA, outB, outC, + tmp, rounds, tol)); + + /* check constant input */ + for (i = 0; i < vecn; ++i) { + R x = (i+1) / ((double)(vecn+1) * sqrt(n)); + for (j = 0; j < n; ++j) { + c_re(inA[j + i * n]) = x; + c_im(inA[j + i * n]) = 0; + c_re(outA[j + i * n]) = 0; + c_im(outA[j + i * n]) = 0; + } + c_re(outA[i * n]) = n * x; + c_im(outA[i * n]) = 0; + } + + e = dmax(e, impulse0(k, n, vecn, inA, inB, inC, outA, outB, outC, + tmp, rounds, tol)); + return e; +} + +double linear(dofft_closure *k, int realp, + int n, C *inA, C *inB, C *inC, C *outA, + C *outB, C *outC, C *tmp, int rounds, double tol) +{ + int j; + double e = 0.0; + + for (j = 0; j < rounds; ++j) { + C alpha, beta; + c_re(alpha) = mydrand(); + c_im(alpha) = realp ? 0.0 : mydrand(); + c_re(beta) = mydrand(); + c_im(beta) = realp ? 0.0 : mydrand(); + arand(inA, n); + arand(inB, n); + k->apply(k, inA, outA); + k->apply(k, inB, outB); + + ascale(outA, alpha, n); + ascale(outB, beta, n); + aadd(tmp, outA, outB, n); + ascale(inA, alpha, n); + ascale(inB, beta, n); + aadd(inC, inA, inB, n); + k->apply(k, inC, outC); + + e = dmax(e, acmp(outC, tmp, n, "linear", tol)); + } + return e; +} + + + +double tf_shift(dofft_closure *k, + int realp, const bench_tensor *sz, + int n, int vecn, double sign, + C *inA, C *inB, C *outA, C *outB, C *tmp, + int rounds, double tol, int which_shift) +{ + int nb, na, dim, N = n * vecn; + int i, j; + double e = 0.0; + + /* test 3: check the time-shift property */ + /* the paper performs more tests, but this code should be fine too */ + + nb = 1; + na = n; + + /* check shifts across all SZ dimensions */ + for (dim = 0; dim < sz->rnk; ++dim) { + int ncur = sz->dims[dim].n; + + na /= ncur; + + for (j = 0; j < rounds; ++j) { + arand(inA, N); + + if (which_shift == TIME_SHIFT) { + for (i = 0; i < vecn; ++i) { + if (realp) mkreal(inA + i * n, n); + arol(inB + i * n, inA + i * n, ncur, nb, na); + } + k->apply(k, inA, outA); + k->apply(k, inB, outB); + for (i = 0; i < vecn; ++i) + aphase_shift(tmp + i * n, outB + i * n, ncur, + nb, na, sign); + e = dmax(e, acmp(tmp, outA, N, "time shift", tol)); + } else { + for (i = 0; i < vecn; ++i) { + if (realp) + mkhermitian(inA + i * n, sz->rnk, sz->dims, 1); + aphase_shift(inB + i * n, inA + i * n, ncur, + nb, na, -sign); + } + k->apply(k, inA, outA); + k->apply(k, inB, outB); + for (i = 0; i < vecn; ++i) + arol(tmp + i * n, outB + i * n, ncur, nb, na); + e = dmax(e, acmp(tmp, outA, N, "freq shift", tol)); + } + } + + nb *= ncur; + } + return e; +} + + +void preserves_input(dofft_closure *k, aconstrain constrain, + int n, C *inA, C *inB, C *outB, int rounds) +{ + int j; + int recopy_input = k->recopy_input; + + k->recopy_input = 1; + for (j = 0; j < rounds; ++j) { + arand(inA, n); + if (constrain) + constrain(inA, n); + + acopy(inB, inA, n); + k->apply(k, inB, outB); + acmp(inB, inA, n, "preserves_input", 0.0); + } + k->recopy_input = recopy_input; +} + + +/* Make a copy of the size tensor, with the same dimensions, but with + the strides corresponding to a "packed" row-major array with the + given stride. */ +bench_tensor *verify_pack(const bench_tensor *sz, int s) +{ + bench_tensor *x = tensor_copy(sz); + if (BENCH_FINITE_RNK(x->rnk) && x->rnk > 0) { + int i; + x->dims[x->rnk - 1].is = s; + x->dims[x->rnk - 1].os = s; + for (i = x->rnk - 1; i > 0; --i) { + x->dims[i - 1].is = x->dims[i].is * x->dims[i].n; + x->dims[i - 1].os = x->dims[i].os * x->dims[i].n; + } + } + return x; +} + +static int all_zero(C *a, int n) +{ + int i; + for (i = 0; i < n; ++i) + if (c_re(a[i]) != 0.0 || c_im(a[i]) != 0.0) + return 0; + return 1; +} + +static int one_accuracy_test(dofft_closure *k, aconstrain constrain, + int sign, int n, C *a, C *b, + double t[6]) +{ + double err[6]; + + if (constrain) + constrain(a, n); + + if (all_zero(a, n)) + return 0; + + k->apply(k, a, b); + fftaccuracy(n, a, b, sign, err); + + t[0] += err[0]; + t[1] += err[1] * err[1]; + t[2] = dmax(t[2], err[2]); + t[3] += err[3]; + t[4] += err[4] * err[4]; + t[5] = dmax(t[5], err[5]); + + return 1; +} + +void accuracy_test(dofft_closure *k, aconstrain constrain, + int sign, int n, C *a, C *b, int rounds, int impulse_rounds, + double t[6]) +{ + int r, i; + int ntests = 0; + bench_complex czero = {0, 0}; + + for (i = 0; i < 6; ++i) t[i] = 0.0; + + for (r = 0; r < rounds; ++r) { + arand(a, n); + if (one_accuracy_test(k, constrain, sign, n, a, b, t)) + ++ntests; + } + + /* impulses at beginning of array */ + for (r = 0; r < impulse_rounds; ++r) { + if (r > n - r - 1) + continue; + + caset(a, n, czero); + c_re(a[r]) = c_im(a[r]) = 1.0; + + if (one_accuracy_test(k, constrain, sign, n, a, b, t)) + ++ntests; + } + + /* impulses at end of array */ + for (r = 0; r < impulse_rounds; ++r) { + if (r <= n - r - 1) + continue; + + caset(a, n, czero); + c_re(a[n - r - 1]) = c_im(a[n - r - 1]) = 1.0; + + if (one_accuracy_test(k, constrain, sign, n, a, b, t)) + ++ntests; + } + + /* randomly-located impulses */ + for (r = 0; r < impulse_rounds; ++r) { + caset(a, n, czero); + i = rand() % n; + c_re(a[i]) = c_im(a[i]) = 1.0; + + if (one_accuracy_test(k, constrain, sign, n, a, b, t)) + ++ntests; + } + + t[0] /= ntests; + t[1] = sqrt(t[1] / ntests); + t[3] /= ntests; + t[4] = sqrt(t[4] / ntests); + + fftaccuracy_done(); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-r2r.c new file mode 100644 index 000000000..8088e0281 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-r2r.c @@ -0,0 +1,964 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Lots of ugly duplication from verify-lib.c, plus lots of ugliness in + general for all of the r2r variants...oh well, for now */ + +#include "verify.h" +#include +#include +#include + +typedef struct { + bench_problem *p; + bench_tensor *probsz; + bench_tensor *totalsz; + bench_tensor *pckdsz; + bench_tensor *pckdvecsz; +} info; + +/* + * Utility functions: + */ + +static double dabs(double x) { return (x < 0.0) ? -x : x; } +static double dmin(double x, double y) { return (x < y) ? x : y; } + +static double raerror(R *a, R *b, int n) +{ + if (n > 0) { + /* compute the relative Linf error */ + double e = 0.0, mag = 0.0; + int i; + + for (i = 0; i < n; ++i) { + e = dmax(e, dabs(a[i] - b[i])); + mag = dmax(mag, dmin(dabs(a[i]), dabs(b[i]))); + } + if (dabs(mag) < 1e-14 && dabs(e) < 1e-14) + e = 0.0; + else + e /= mag; + +#ifdef HAVE_ISNAN + BENCH_ASSERT(!isnan(e)); +#endif + return e; + } else + return 0.0; +} + +#define by2pi(m, n) ((K2PI * (m)) / (n)) + +/* + * Improve accuracy by reducing x to range [0..1/8] + * before multiplication by 2 * PI. + */ + +static trigreal bench_sincos(trigreal m, trigreal n, int sinp) +{ + /* waiting for C to get tail recursion... */ + trigreal half_n = n * 0.5; + trigreal quarter_n = half_n * 0.5; + trigreal eighth_n = quarter_n * 0.5; + trigreal sgn = 1.0; + + if (sinp) goto sin; + cos: + if (m < 0) { m = -m; /* goto cos; */ } + if (m > half_n) { m = n - m; goto cos; } + if (m > eighth_n) { m = quarter_n - m; goto sin; } + return sgn * COS(by2pi(m, n)); + + msin: + sgn = -sgn; + sin: + if (m < 0) { m = -m; goto msin; } + if (m > half_n) { m = n - m; goto msin; } + if (m > eighth_n) { m = quarter_n - m; goto cos; } + return sgn * SIN(by2pi(m, n)); +} + +static trigreal cos2pi(int m, int n) +{ + return bench_sincos((trigreal)m, (trigreal)n, 0); +} + +static trigreal sin2pi(int m, int n) +{ + return bench_sincos((trigreal)m, (trigreal)n, 1); +} + +static trigreal cos00(int i, int j, int n) +{ + return cos2pi(i * j, n); +} + +static trigreal cos01(int i, int j, int n) +{ + return cos00(i, 2*j + 1, 2*n); +} + +static trigreal cos10(int i, int j, int n) +{ + return cos00(2*i + 1, j, 2*n); +} + +static trigreal cos11(int i, int j, int n) +{ + return cos00(2*i + 1, 2*j + 1, 4*n); +} + +static trigreal sin00(int i, int j, int n) +{ + return sin2pi(i * j, n); +} + +static trigreal sin01(int i, int j, int n) +{ + return sin00(i, 2*j + 1, 2*n); +} + +static trigreal sin10(int i, int j, int n) +{ + return sin00(2*i + 1, j, 2*n); +} + +static trigreal sin11(int i, int j, int n) +{ + return sin00(2*i + 1, 2*j + 1, 4*n); +} + +static trigreal realhalf(int i, int j, int n) +{ + UNUSED(i); + if (j <= n - j) + return 1.0; + else + return 0.0; +} + +static trigreal coshalf(int i, int j, int n) +{ + if (j <= n - j) + return cos00(i, j, n); + else + return cos00(i, n - j, n); +} + +static trigreal unity(int i, int j, int n) +{ + UNUSED(i); + UNUSED(j); + UNUSED(n); + return 1.0; +} + +typedef trigreal (*trigfun)(int, int, int); + +static void rarand(R *a, int n) +{ + int i; + + /* generate random inputs */ + for (i = 0; i < n; ++i) { + a[i] = mydrand(); + } +} + +/* C = A + B */ +static void raadd(R *c, R *a, R *b, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + c[i] = a[i] + b[i]; + } +} + +/* C = A - B */ +static void rasub(R *c, R *a, R *b, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + c[i] = a[i] - b[i]; + } +} + +/* B = rotate left A + rotate right A */ +static void rarolr(R *b, R *a, int n, int nb, int na, + r2r_kind_t k) +{ + int isL0 = 0, isL1 = 0, isR0 = 0, isR1 = 0; + int i, ib, ia; + + for (ib = 0; ib < nb; ++ib) { + for (i = 0; i < n - 1; ++i) + for (ia = 0; ia < na; ++ia) + b[(ib * n + i) * na + ia] = + a[(ib * n + i + 1) * na + ia]; + + /* ugly switch to do boundary conditions for various r2r types */ + switch (k) { + /* periodic boundaries */ + case R2R_DHT: + case R2R_R2HC: + for (ia = 0; ia < na; ++ia) { + b[(ib * n + n - 1) * na + ia] = + a[(ib * n + 0) * na + ia]; + b[(ib * n + 0) * na + ia] += + a[(ib * n + n - 1) * na + ia]; + } + break; + + case R2R_HC2R: /* ugh (hermitian halfcomplex boundaries) */ + if (n > 2) { + if (n % 2 == 0) + for (ia = 0; ia < na; ++ia) { + b[(ib * n + n - 1) * na + ia] = 0.0; + b[(ib * n + 0) * na + ia] += + a[(ib * n + 1) * na + ia]; + b[(ib * n + n/2) * na + ia] += + + a[(ib * n + n/2 - 1) * na + ia] + - a[(ib * n + n/2 + 1) * na + ia]; + b[(ib * n + n/2 + 1) * na + ia] += + - a[(ib * n + n/2) * na + ia]; + } + else + for (ia = 0; ia < na; ++ia) { + b[(ib * n + n - 1) * na + ia] = 0.0; + b[(ib * n + 0) * na + ia] += + a[(ib * n + 1) * na + ia]; + b[(ib * n + n/2) * na + ia] += + + a[(ib * n + n/2) * na + ia] + - a[(ib * n + n/2 + 1) * na + ia]; + b[(ib * n + n/2 + 1) * na + ia] += + - a[(ib * n + n/2 + 1) * na + ia] + - a[(ib * n + n/2) * na + ia]; + } + } else /* n <= 2 */ { + for (ia = 0; ia < na; ++ia) { + b[(ib * n + n - 1) * na + ia] = + a[(ib * n + 0) * na + ia]; + b[(ib * n + 0) * na + ia] += + a[(ib * n + n - 1) * na + ia]; + } + } + break; + + /* various even/odd boundary conditions */ + case R2R_REDFT00: + isL1 = isR1 = 1; + goto mirrors; + case R2R_REDFT01: + isL1 = 1; + goto mirrors; + case R2R_REDFT10: + isL0 = isR0 = 1; + goto mirrors; + case R2R_REDFT11: + isL0 = 1; + isR0 = -1; + goto mirrors; + case R2R_RODFT00: + goto mirrors; + case R2R_RODFT01: + isR1 = 1; + goto mirrors; + case R2R_RODFT10: + isL0 = isR0 = -1; + goto mirrors; + case R2R_RODFT11: + isL0 = -1; + isR0 = 1; + goto mirrors; + + mirrors: + + for (ia = 0; ia < na; ++ia) + b[(ib * n + n - 1) * na + ia] = + isR0 * a[(ib * n + n - 1) * na + ia] + + (n > 1 ? isR1 * a[(ib * n + n - 2) * na + ia] + : 0); + + for (ia = 0; ia < na; ++ia) + b[(ib * n) * na + ia] += + isL0 * a[(ib * n) * na + ia] + + (n > 1 ? isL1 * a[(ib * n + 1) * na + ia] : 0); + + } + + for (i = 1; i < n; ++i) + for (ia = 0; ia < na; ++ia) + b[(ib * n + i) * na + ia] += + a[(ib * n + i - 1) * na + ia]; + } +} + +static void raphase_shift(R *b, R *a, int n, int nb, int na, + int n0, int k0, trigfun t) +{ + int j, jb, ja; + + for (jb = 0; jb < nb; ++jb) + for (j = 0; j < n; ++j) { + trigreal c = 2.0 * t(1, j + k0, n0); + + for (ja = 0; ja < na; ++ja) { + int k = (jb * n + j) * na + ja; + b[k] = a[k] * c; + } + } +} + +/* A = alpha * A (real, in place) */ +static void rascale(R *a, R alpha, int n) +{ + int i; + + for (i = 0; i < n; ++i) { + a[i] *= alpha; + } +} + +/* + * compute rdft: + */ + +/* copy real A into real B, using output stride of A and input stride of B */ +typedef struct { + dotens2_closure k; + R *ra; + R *rb; +} cpyr_closure; + +static void cpyr0(dotens2_closure *k_, + int indxa, int ondxa, int indxb, int ondxb) +{ + cpyr_closure *k = (cpyr_closure *)k_; + k->rb[indxb] = k->ra[ondxa]; + UNUSED(indxa); UNUSED(ondxb); +} + +static void cpyr(R *ra, bench_tensor *sza, R *rb, bench_tensor *szb) +{ + cpyr_closure k; + k.k.apply = cpyr0; + k.ra = ra; k.rb = rb; + bench_dotens2(sza, szb, &k.k); +} + +static void dofft(info *nfo, R *in, R *out) +{ + cpyr(in, nfo->pckdsz, (R *) nfo->p->in, nfo->totalsz); + after_problem_rcopy_from(nfo->p, (bench_real *)nfo->p->in); + doit(1, nfo->p); + after_problem_rcopy_to(nfo->p, (bench_real *)nfo->p->out); + cpyr((R *) nfo->p->out, nfo->totalsz, out, nfo->pckdsz); +} + +static double racmp(R *a, R *b, int n, const char *test, double tol) +{ + double d = raerror(a, b, n); + if (d > tol) { + ovtpvt_err("Found relative error %e (%s)\n", d, test); + { + int i, N; + N = n > 300 && verbose <= 2 ? 300 : n; + for (i = 0; i < N; ++i) + ovtpvt_err("%8d %16.12f %16.12f\n", i, + (double) a[i], + (double) b[i]); + } + bench_exit(EXIT_FAILURE); + } + return d; +} + +/***********************************************************************/ + +typedef struct { + int n; /* physical size */ + int n0; /* "logical" transform size */ + int i0, k0; /* shifts of input/output */ + trigfun ti, ts; /* impulse/shift trig functions */ +} dim_stuff; + +static void impulse_response(int rnk, dim_stuff *d, R impulse_amp, + R *A, int N) +{ + if (rnk == 0) + A[0] = impulse_amp; + else { + int i; + N /= d->n; + for (i = 0; i < d->n; ++i) { + impulse_response(rnk - 1, d + 1, + impulse_amp * d->ti(d->i0, d->k0 + i, d->n0), + A + i * N, N); + } + } +} + +/***************************************************************************/ + +/* + * Implementation of the FFT tester described in + * + * Funda Ergün. Testing multivariate linear functions: Overcoming the + * generator bottleneck. In Proceedings of the Twenty-Seventh Annual + * ACM Symposium on the Theory of Computing, pages 407-416, Las Vegas, + * Nevada, 29 May--1 June 1995. + * + * Also: F. Ergun, S. R. Kumar, and D. Sivakumar, "Self-testing without + * the generator bottleneck," SIAM J. on Computing 29 (5), 1630-51 (2000). + */ + +static double rlinear(int n, info *nfo, R *inA, R *inB, R *inC, R *outA, + R *outB, R *outC, R *tmp, int rounds, double tol) +{ + double e = 0.0; + int j; + + for (j = 0; j < rounds; ++j) { + R alpha, beta; + alpha = mydrand(); + beta = mydrand(); + rarand(inA, n); + rarand(inB, n); + dofft(nfo, inA, outA); + dofft(nfo, inB, outB); + + rascale(outA, alpha, n); + rascale(outB, beta, n); + raadd(tmp, outA, outB, n); + rascale(inA, alpha, n); + rascale(inB, beta, n); + raadd(inC, inA, inB, n); + dofft(nfo, inC, outC); + + e = dmax(e, racmp(outC, tmp, n, "linear", tol)); + } + return e; +} + +static double rimpulse(dim_stuff *d, R impulse_amp, + int n, int vecn, info *nfo, + R *inA, R *inB, R *inC, + R *outA, R *outB, R *outC, + R *tmp, int rounds, double tol) +{ + double e = 0.0; + int N = n * vecn; + int i; + int j; + + /* test 2: check that the unit impulse is transformed properly */ + + for (i = 0; i < N; ++i) { + /* pls */ + inA[i] = 0.0; + } + for (i = 0; i < vecn; ++i) { + inA[i * n] = (i+1) / (double)(vecn+1); + + /* transform of the pls */ + impulse_response(nfo->probsz->rnk, d, impulse_amp * inA[i * n], + outA + i * n, n); + } + + dofft(nfo, inA, tmp); + e = dmax(e, racmp(tmp, outA, N, "impulse 1", tol)); + + for (j = 0; j < rounds; ++j) { + rarand(inB, N); + rasub(inC, inA, inB, N); + dofft(nfo, inB, outB); + dofft(nfo, inC, outC); + raadd(tmp, outB, outC, N); + e = dmax(e, racmp(tmp, outA, N, "impulse", tol)); + } + return e; +} + +static double t_shift(int n, int vecn, info *nfo, + R *inA, R *inB, R *outA, R *outB, R *tmp, + int rounds, double tol, + dim_stuff *d) +{ + double e = 0.0; + int nb, na, dim, N = n * vecn; + int i, j; + bench_tensor *sz = nfo->probsz; + + /* test 3: check the time-shift property */ + /* the paper performs more tests, but this code should be fine too */ + + nb = 1; + na = n; + + /* check shifts across all SZ dimensions */ + for (dim = 0; dim < sz->rnk; ++dim) { + int ncur = sz->dims[dim].n; + + na /= ncur; + + for (j = 0; j < rounds; ++j) { + rarand(inA, N); + + for (i = 0; i < vecn; ++i) { + rarolr(inB + i * n, inA + i*n, ncur, nb,na, + nfo->p->k[dim]); + } + dofft(nfo, inA, outA); + dofft(nfo, inB, outB); + for (i = 0; i < vecn; ++i) + raphase_shift(tmp + i * n, outA + i * n, ncur, + nb, na, d[dim].n0, d[dim].k0, d[dim].ts); + e = dmax(e, racmp(tmp, outB, N, "time shift", tol)); + } + + nb *= ncur; + } + return e; +} + +/***********************************************************************/ + +void verify_r2r(bench_problem *p, int rounds, double tol, errors *e) +{ + R *inA, *inB, *inC, *outA, *outB, *outC, *tmp; + info nfo; + int n, vecn, N; + double impulse_amp = 1.0; + dim_stuff *d; + int i; + + if (rounds == 0) + rounds = 20; /* default value */ + + n = tensor_sz(p->sz); + vecn = tensor_sz(p->vecsz); + N = n * vecn; + + d = (dim_stuff *) bench_malloc(sizeof(dim_stuff) * p->sz->rnk); + for (i = 0; i < p->sz->rnk; ++i) { + int n0, i0, k0; + trigfun ti, ts; + + d[i].n = n0 = p->sz->dims[i].n; + if (p->k[i] > R2R_DHT) + n0 = 2 * (n0 + (p->k[i] == R2R_REDFT00 ? -1 : + (p->k[i] == R2R_RODFT00 ? 1 : 0))); + + switch (p->k[i]) { + case R2R_R2HC: + i0 = k0 = 0; + ti = realhalf; + ts = coshalf; + break; + case R2R_DHT: + i0 = k0 = 0; + ti = unity; + ts = cos00; + break; + case R2R_HC2R: + i0 = k0 = 0; + ti = unity; + ts = cos00; + break; + case R2R_REDFT00: + i0 = k0 = 0; + ti = ts = cos00; + break; + case R2R_REDFT01: + i0 = k0 = 0; + ti = ts = cos01; + break; + case R2R_REDFT10: + i0 = k0 = 0; + ti = cos10; impulse_amp *= 2.0; + ts = cos00; + break; + case R2R_REDFT11: + i0 = k0 = 0; + ti = cos11; impulse_amp *= 2.0; + ts = cos01; + break; + case R2R_RODFT00: + i0 = k0 = 1; + ti = sin00; impulse_amp *= 2.0; + ts = cos00; + break; + case R2R_RODFT01: + i0 = 1; k0 = 0; + ti = sin01; impulse_amp *= n == 1 ? 1.0 : 2.0; + ts = cos01; + break; + case R2R_RODFT10: + i0 = 0; k0 = 1; + ti = sin10; impulse_amp *= 2.0; + ts = cos00; + break; + case R2R_RODFT11: + i0 = k0 = 0; + ti = sin11; impulse_amp *= 2.0; + ts = cos01; + break; + default: + BENCH_ASSERT(0); + return; + } + + d[i].n0 = n0; + d[i].i0 = i0; + d[i].k0 = k0; + d[i].ti = ti; + d[i].ts = ts; + } + + + inA = (R *) bench_malloc(N * sizeof(R)); + inB = (R *) bench_malloc(N * sizeof(R)); + inC = (R *) bench_malloc(N * sizeof(R)); + outA = (R *) bench_malloc(N * sizeof(R)); + outB = (R *) bench_malloc(N * sizeof(R)); + outC = (R *) bench_malloc(N * sizeof(R)); + tmp = (R *) bench_malloc(N * sizeof(R)); + + nfo.p = p; + nfo.probsz = p->sz; + nfo.totalsz = tensor_append(p->vecsz, nfo.probsz); + nfo.pckdsz = verify_pack(nfo.totalsz, 1); + nfo.pckdvecsz = verify_pack(p->vecsz, tensor_sz(nfo.probsz)); + + e->i = rimpulse(d, impulse_amp, n, vecn, &nfo, + inA, inB, inC, outA, outB, outC, tmp, rounds, tol); + e->l = rlinear(N, &nfo, inA, inB, inC, outA, outB, outC, tmp, rounds,tol); + e->s = t_shift(n, vecn, &nfo, inA, inB, outA, outB, tmp, + rounds, tol, d); + + /* grr, verify-lib.c:preserves_input() only works for complex */ + if (!p->in_place && !p->destroy_input) { + bench_tensor *totalsz_swap, *pckdsz_swap; + totalsz_swap = tensor_copy_swapio(nfo.totalsz); + pckdsz_swap = tensor_copy_swapio(nfo.pckdsz); + + for (i = 0; i < rounds; ++i) { + rarand(inA, N); + dofft(&nfo, inA, outB); + cpyr((R *) nfo.p->in, totalsz_swap, inB, pckdsz_swap); + racmp(inB, inA, N, "preserves_input", 0.0); + } + + tensor_destroy(totalsz_swap); + tensor_destroy(pckdsz_swap); + } + + tensor_destroy(nfo.totalsz); + tensor_destroy(nfo.pckdsz); + tensor_destroy(nfo.pckdvecsz); + bench_free(tmp); + bench_free(outC); + bench_free(outB); + bench_free(outA); + bench_free(inC); + bench_free(inB); + bench_free(inA); + bench_free(d); +} + + +typedef struct { + dofft_closure k; + bench_problem *p; + int n0; +} dofft_r2r_closure; + +static void cpyr1(int n, R *in, int is, R *out, int os, R scale) +{ + int i; + for (i = 0; i < n; ++i) + out[i * os] = in[i * is] * scale; +} + +static void mke00(C *a, int n, int c) +{ + int i; + for (i = 1; i + i < n; ++i) + a[n - i][c] = a[i][c]; +} + +static void mkre00(C *a, int n) +{ + mkreal(a, n); + mke00(a, n, 0); +} + +static void mkimag(C *a, int n) +{ + int i; + for (i = 0; i < n; ++i) + c_re(a[i]) = 0.0; +} + +static void mko00(C *a, int n, int c) +{ + int i; + a[0][c] = 0.0; + for (i = 1; i + i < n; ++i) + a[n - i][c] = -a[i][c]; + if (i + i == n) + a[i][c] = 0.0; +} + +static void mkro00(C *a, int n) +{ + mkreal(a, n); + mko00(a, n, 0); +} + +static void mkio00(C *a, int n) +{ + mkimag(a, n); + mko00(a, n, 1); +} + +static void mkre01(C *a, int n) /* n should be be multiple of 4 */ +{ + R a0; + a0 = c_re(a[0]); + mko00(a, n/2, 0); + c_re(a[n/2]) = -(c_re(a[0]) = a0); + mkre00(a, n); +} + +static void mkro01(C *a, int n) /* n should be be multiple of 4 */ +{ + c_re(a[0]) = c_im(a[0]) = 0.0; + mkre00(a, n/2); + mkro00(a, n); +} + +static void mkoddonly(C *a, int n) +{ + int i; + for (i = 0; i < n; i += 2) + c_re(a[i]) = c_im(a[i]) = 0.0; +} + +static void mkre10(C *a, int n) +{ + mkoddonly(a, n); + mkre00(a, n); +} + +static void mkio10(C *a, int n) +{ + mkoddonly(a, n); + mkio00(a, n); +} + +static void mkre11(C *a, int n) +{ + mkoddonly(a, n); + mko00(a, n/2, 0); + mkre00(a, n); +} + +static void mkro11(C *a, int n) +{ + mkoddonly(a, n); + mkre00(a, n/2); + mkro00(a, n); +} + +static void mkio11(C *a, int n) +{ + mkoddonly(a, n); + mke00(a, n/2, 1); + mkio00(a, n); +} + +static void r2r_apply(dofft_closure *k_, bench_complex *in, bench_complex *out) +{ + dofft_r2r_closure *k = (dofft_r2r_closure *)k_; + bench_problem *p = k->p; + bench_real *ri, *ro; + int n, is, os; + + n = p->sz->dims[0].n; + is = p->sz->dims[0].is; + os = p->sz->dims[0].os; + + ri = (bench_real *) p->in; + ro = (bench_real *) p->out; + + switch (p->k[0]) { + case R2R_R2HC: + cpyr1(n, &c_re(in[0]), 2, ri, is, 1.0); + break; + case R2R_HC2R: + cpyr1(n/2 + 1, &c_re(in[0]), 2, ri, is, 1.0); + cpyr1((n+1)/2 - 1, &c_im(in[n-1]), -2, ri + is*(n-1), -is, 1.0); + break; + case R2R_REDFT00: + cpyr1(n, &c_re(in[0]), 2, ri, is, 1.0); + break; + case R2R_RODFT00: + cpyr1(n, &c_re(in[1]), 2, ri, is, 1.0); + break; + case R2R_REDFT01: + cpyr1(n, &c_re(in[0]), 2, ri, is, 1.0); + break; + case R2R_REDFT10: + cpyr1(n, &c_re(in[1]), 4, ri, is, 1.0); + break; + case R2R_RODFT01: + cpyr1(n, &c_re(in[1]), 2, ri, is, 1.0); + break; + case R2R_RODFT10: + cpyr1(n, &c_im(in[1]), 4, ri, is, 1.0); + break; + case R2R_REDFT11: + cpyr1(n, &c_re(in[1]), 4, ri, is, 1.0); + break; + case R2R_RODFT11: + cpyr1(n, &c_re(in[1]), 4, ri, is, 1.0); + break; + default: + BENCH_ASSERT(0); /* not yet implemented */ + } + + after_problem_rcopy_from(p, ri); + doit(1, p); + after_problem_rcopy_to(p, ro); + + switch (p->k[0]) { + case R2R_R2HC: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_re(in[0]), 2, 1.0); + cpyr1(n/2 + 1, ro, os, &c_re(out[0]), 2, 1.0); + cpyr1((n+1)/2 - 1, ro + os*(n-1), -os, &c_im(out[1]), 2, 1.0); + c_im(out[0]) = 0.0; + if (n % 2 == 0) + c_im(out[n/2]) = 0.0; + mkhermitian1(out, n); + break; + case R2R_HC2R: + if (k->k.recopy_input) { + cpyr1(n/2 + 1, ri, is, &c_re(in[0]), 2, 1.0); + cpyr1((n+1)/2 - 1, ri + is*(n-1), -is, &c_im(in[1]), 2,1.0); + } + cpyr1(n, ro, os, &c_re(out[0]), 2, 1.0); + mkreal(out, n); + break; + case R2R_REDFT00: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_re(in[0]), 2, 1.0); + cpyr1(n, ro, os, &c_re(out[0]), 2, 1.0); + mkre00(out, k->n0); + break; + case R2R_RODFT00: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_im(in[1]), 2, -1.0); + cpyr1(n, ro, os, &c_im(out[1]), 2, -1.0); + mkio00(out, k->n0); + break; + case R2R_REDFT01: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_re(in[0]), 2, 1.0); + cpyr1(n, ro, os, &c_re(out[1]), 4, 2.0); + mkre10(out, k->n0); + break; + case R2R_REDFT10: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_re(in[1]), 4, 2.0); + cpyr1(n, ro, os, &c_re(out[0]), 2, 1.0); + mkre01(out, k->n0); + break; + case R2R_RODFT01: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_re(in[1]), 2, 1.0); + cpyr1(n, ro, os, &c_im(out[1]), 4, -2.0); + mkio10(out, k->n0); + break; + case R2R_RODFT10: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_im(in[1]), 4, -2.0); + cpyr1(n, ro, os, &c_re(out[1]), 2, 1.0); + mkro01(out, k->n0); + break; + case R2R_REDFT11: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_re(in[1]), 4, 2.0); + cpyr1(n, ro, os, &c_re(out[1]), 4, 2.0); + mkre11(out, k->n0); + break; + case R2R_RODFT11: + if (k->k.recopy_input) + cpyr1(n, ri, is, &c_im(in[1]), 4, -2.0); + cpyr1(n, ro, os, &c_im(out[1]), 4, -2.0); + mkio11(out, k->n0); + break; + default: + BENCH_ASSERT(0); /* not yet implemented */ + } +} + +void accuracy_r2r(bench_problem *p, int rounds, int impulse_rounds, + double t[6]) +{ + dofft_r2r_closure k; + int n, n0 = 1; + C *a, *b; + aconstrain constrain = 0; + + BENCH_ASSERT(p->kind == PROBLEM_R2R); + BENCH_ASSERT(p->sz->rnk == 1); + BENCH_ASSERT(p->vecsz->rnk == 0); + + k.k.apply = r2r_apply; + k.k.recopy_input = 0; + k.p = p; + n = tensor_sz(p->sz); + + switch (p->k[0]) { + case R2R_R2HC: constrain = mkreal; n0 = n; break; + case R2R_HC2R: constrain = mkhermitian1; n0 = n; break; + case R2R_REDFT00: constrain = mkre00; n0 = 2*(n-1); break; + case R2R_RODFT00: constrain = mkro00; n0 = 2*(n+1); break; + case R2R_REDFT01: constrain = mkre01; n0 = 4*n; break; + case R2R_REDFT10: constrain = mkre10; n0 = 4*n; break; + case R2R_RODFT01: constrain = mkro01; n0 = 4*n; break; + case R2R_RODFT10: constrain = mkio10; n0 = 4*n; break; + case R2R_REDFT11: constrain = mkre11; n0 = 8*n; break; + case R2R_RODFT11: constrain = mkro11; n0 = 8*n; break; + default: BENCH_ASSERT(0); /* not yet implemented */ + } + k.n0 = n0; + + a = (C *) bench_malloc(n0 * sizeof(C)); + b = (C *) bench_malloc(n0 * sizeof(C)); + accuracy_test(&k.k, constrain, -1, n0, a, b, rounds, impulse_rounds, t); + bench_free(b); + bench_free(a); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-rdft2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-rdft2.c new file mode 100644 index 000000000..eb52f465c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify-rdft2.c @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "verify.h" + +/* copy real A into real B, using output stride of A and input stride of B */ +typedef struct { + dotens2_closure k; + R *ra; + R *rb; +} cpyr_closure; + +static void cpyr0(dotens2_closure *k_, + int indxa, int ondxa, int indxb, int ondxb) +{ + cpyr_closure *k = (cpyr_closure *)k_; + k->rb[indxb] = k->ra[ondxa]; + UNUSED(indxa); UNUSED(ondxb); +} + +static void cpyr(R *ra, const bench_tensor *sza, + R *rb, const bench_tensor *szb) +{ + cpyr_closure k; + k.k.apply = cpyr0; + k.ra = ra; k.rb = rb; + bench_dotens2(sza, szb, &k.k); +} + +/* copy unpacked halfcomplex A[n] into packed-complex B[n], using output stride + of A and input stride of B. Only copies non-redundant half; other + half must be copied via mkhermitian. */ +typedef struct { + dotens2_closure k; + int n; + int as; + int scalea; + R *ra, *ia; + R *rb, *ib; +} cpyhc2_closure; + +static void cpyhc20(dotens2_closure *k_, + int indxa, int ondxa, int indxb, int ondxb) +{ + cpyhc2_closure *k = (cpyhc2_closure *)k_; + int i, n = k->n; + int scalea = k->scalea; + int as = k->as * scalea; + R *ra = k->ra + ondxa * scalea, *ia = k->ia + ondxa * scalea; + R *rb = k->rb + indxb, *ib = k->ib + indxb; + UNUSED(indxa); UNUSED(ondxb); + + for (i = 0; i < n/2 + 1; ++i) { + rb[2*i] = ra[as*i]; + ib[2*i] = ia[as*i]; + } +} + +static void cpyhc2(R *ra, R *ia, + const bench_tensor *sza, const bench_tensor *vecsza, + int scalea, + R *rb, R *ib, const bench_tensor *szb) +{ + cpyhc2_closure k; + BENCH_ASSERT(sza->rnk <= 1); + k.k.apply = cpyhc20; + k.n = tensor_sz(sza); + k.scalea = scalea; + if (!BENCH_FINITE_RNK(sza->rnk) || sza->rnk == 0) + k.as = 0; + else + k.as = sza->dims[0].os; + k.ra = ra; k.ia = ia; k.rb = rb; k.ib = ib; + bench_dotens2(vecsza, szb, &k.k); +} + +/* icpyhc2 is the inverse of cpyhc2 */ + +static void icpyhc20(dotens2_closure *k_, + int indxa, int ondxa, int indxb, int ondxb) +{ + cpyhc2_closure *k = (cpyhc2_closure *)k_; + int i, n = k->n; + int scalea = k->scalea; + int as = k->as * scalea; + R *ra = k->ra + indxa * scalea, *ia = k->ia + indxa * scalea; + R *rb = k->rb + ondxb, *ib = k->ib + ondxb; + UNUSED(ondxa); UNUSED(indxb); + + for (i = 0; i < n/2 + 1; ++i) { + ra[as*i] = rb[2*i]; + ia[as*i] = ib[2*i]; + } +} + +static void icpyhc2(R *ra, R *ia, + const bench_tensor *sza, const bench_tensor *vecsza, + int scalea, + R *rb, R *ib, const bench_tensor *szb) +{ + cpyhc2_closure k; + BENCH_ASSERT(sza->rnk <= 1); + k.k.apply = icpyhc20; + k.n = tensor_sz(sza); + k.scalea = scalea; + if (!BENCH_FINITE_RNK(sza->rnk) || sza->rnk == 0) + k.as = 0; + else + k.as = sza->dims[0].is; + k.ra = ra; k.ia = ia; k.rb = rb; k.ib = ib; + bench_dotens2(vecsza, szb, &k.k); +} + +typedef struct { + dofft_closure k; + bench_problem *p; +} dofft_rdft2_closure; + +static void rdft2_apply(dofft_closure *k_, + bench_complex *in, bench_complex *out) +{ + dofft_rdft2_closure *k = (dofft_rdft2_closure *)k_; + bench_problem *p = k->p; + bench_tensor *totalsz, *pckdsz, *totalsz_swap, *pckdsz_swap; + bench_tensor *probsz2, *totalsz2, *pckdsz2; + bench_tensor *probsz2_swap, *totalsz2_swap, *pckdsz2_swap; + bench_real *ri, *ii, *ro, *io; + int n2, totalscale; + + totalsz = tensor_append(p->vecsz, p->sz); + pckdsz = verify_pack(totalsz, 2); + n2 = tensor_sz(totalsz); + if (BENCH_FINITE_RNK(p->sz->rnk) && p->sz->rnk > 0) + n2 = (n2 / p->sz->dims[p->sz->rnk - 1].n) * + (p->sz->dims[p->sz->rnk - 1].n / 2 + 1); + ri = (bench_real *) p->in; + ro = (bench_real *) p->out; + + if (BENCH_FINITE_RNK(p->sz->rnk) && p->sz->rnk > 0 && n2 > 0) { + probsz2 = tensor_copy_sub(p->sz, p->sz->rnk - 1, 1); + totalsz2 = tensor_copy_sub(totalsz, 0, totalsz->rnk - 1); + pckdsz2 = tensor_copy_sub(pckdsz, 0, pckdsz->rnk - 1); + } + else { + probsz2 = mktensor(0); + totalsz2 = tensor_copy(totalsz); + pckdsz2 = tensor_copy(pckdsz); + } + + totalsz_swap = tensor_copy_swapio(totalsz); + pckdsz_swap = tensor_copy_swapio(pckdsz); + totalsz2_swap = tensor_copy_swapio(totalsz2); + pckdsz2_swap = tensor_copy_swapio(pckdsz2); + probsz2_swap = tensor_copy_swapio(probsz2); + + /* confusion: the stride is the distance between complex elements + when using interleaved format, but it is the distance between + real elements when using split format */ + if (p->split) { + ii = p->ini ? (bench_real *) p->ini : ri + n2; + io = p->outi ? (bench_real *) p->outi : ro + n2; + totalscale = 1; + } else { + ii = p->ini ? (bench_real *) p->ini : ri + 1; + io = p->outi ? (bench_real *) p->outi : ro + 1; + totalscale = 2; + } + + if (p->sign < 0) { /* R2HC */ + int N, vN, i; + cpyr(&c_re(in[0]), pckdsz, ri, totalsz); + after_problem_rcopy_from(p, ri); + doit(1, p); + after_problem_hccopy_to(p, ro, io); + if (k->k.recopy_input) + cpyr(ri, totalsz_swap, &c_re(in[0]), pckdsz_swap); + cpyhc2(ro, io, probsz2, totalsz2, totalscale, + &c_re(out[0]), &c_im(out[0]), pckdsz2); + N = tensor_sz(p->sz); + vN = tensor_sz(p->vecsz); + for (i = 0; i < vN; ++i) + mkhermitian(out + i*N, p->sz->rnk, p->sz->dims, 1); + } + else { /* HC2R */ + icpyhc2(ri, ii, probsz2, totalsz2, totalscale, + &c_re(in[0]), &c_im(in[0]), pckdsz2); + after_problem_hccopy_from(p, ri, ii); + doit(1, p); + after_problem_rcopy_to(p, ro); + if (k->k.recopy_input) + cpyhc2(ri, ii, probsz2_swap, totalsz2_swap, totalscale, + &c_re(in[0]), &c_im(in[0]), pckdsz2_swap); + mkreal(out, tensor_sz(pckdsz)); + cpyr(ro, totalsz, &c_re(out[0]), pckdsz); + } + + tensor_destroy(totalsz); + tensor_destroy(pckdsz); + tensor_destroy(totalsz_swap); + tensor_destroy(pckdsz_swap); + tensor_destroy(probsz2); + tensor_destroy(totalsz2); + tensor_destroy(pckdsz2); + tensor_destroy(probsz2_swap); + tensor_destroy(totalsz2_swap); + tensor_destroy(pckdsz2_swap); +} + +void verify_rdft2(bench_problem *p, int rounds, double tol, errors *e) +{ + C *inA, *inB, *inC, *outA, *outB, *outC, *tmp; + int n, vecn, N; + dofft_rdft2_closure k; + + BENCH_ASSERT(p->kind == PROBLEM_REAL); + + if (!BENCH_FINITE_RNK(p->sz->rnk) || !BENCH_FINITE_RNK(p->vecsz->rnk)) + return; /* give up */ + + k.k.apply = rdft2_apply; + k.k.recopy_input = 0; + k.p = p; + + if (rounds == 0) + rounds = 20; /* default value */ + + n = tensor_sz(p->sz); + vecn = tensor_sz(p->vecsz); + N = n * vecn; + + inA = (C *) bench_malloc(N * sizeof(C)); + inB = (C *) bench_malloc(N * sizeof(C)); + inC = (C *) bench_malloc(N * sizeof(C)); + outA = (C *) bench_malloc(N * sizeof(C)); + outB = (C *) bench_malloc(N * sizeof(C)); + outC = (C *) bench_malloc(N * sizeof(C)); + tmp = (C *) bench_malloc(N * sizeof(C)); + + e->i = impulse(&k.k, n, vecn, inA, inB, inC, outA, outB, outC, + tmp, rounds, tol); + e->l = linear(&k.k, 1, N, inA, inB, inC, outA, outB, outC, + tmp, rounds, tol); + + e->s = 0.0; + if (p->sign < 0) + e->s = dmax(e->s, tf_shift(&k.k, 1, p->sz, n, vecn, p->sign, + inA, inB, outA, outB, + tmp, rounds, tol, TIME_SHIFT)); + else + e->s = dmax(e->s, tf_shift(&k.k, 1, p->sz, n, vecn, p->sign, + inA, inB, outA, outB, + tmp, rounds, tol, FREQ_SHIFT)); + + if (!p->in_place && !p->destroy_input) + preserves_input(&k.k, p->sign < 0 ? mkreal : mkhermitian1, + N, inA, inB, outB, rounds); + + bench_free(tmp); + bench_free(outC); + bench_free(outB); + bench_free(outA); + bench_free(inC); + bench_free(inB); + bench_free(inA); +} + +void accuracy_rdft2(bench_problem *p, int rounds, int impulse_rounds, + double t[6]) +{ + dofft_rdft2_closure k; + int n; + C *a, *b; + + BENCH_ASSERT(p->kind == PROBLEM_REAL); + BENCH_ASSERT(p->sz->rnk == 1); + BENCH_ASSERT(p->vecsz->rnk == 0); + + k.k.apply = rdft2_apply; + k.k.recopy_input = 0; + k.p = p; + n = tensor_sz(p->sz); + + a = (C *) bench_malloc(n * sizeof(C)); + b = (C *) bench_malloc(n * sizeof(C)); + accuracy_test(&k.k, p->sign < 0 ? mkreal : mkhermitian1, p->sign, + n, a, b, rounds, impulse_rounds, t); + bench_free(b); + bench_free(a); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify.c new file mode 100644 index 000000000..4d9b34328 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2000 Matteo Frigo + * Copyright (c) 2000 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include +#include + +#include "verify.h" + +void verify_problem(bench_problem *p, int rounds, double tol) +{ + errors e; + const char *pstring = p->pstring ? p->pstring : ""; + + switch (p->kind) { + case PROBLEM_COMPLEX: verify_dft(p, rounds, tol, &e); break; + case PROBLEM_REAL: verify_rdft2(p, rounds, tol, &e); break; + case PROBLEM_R2R: verify_r2r(p, rounds, tol, &e); break; + } + + if (verbose) + ovtpvt("%s %g %g %g\n", pstring, e.l, e.i, e.s); +} + +void verify(const char *param, int rounds, double tol) +{ + bench_problem *p; + + p = problem_parse(param); + problem_alloc(p); + + if (!can_do(p)) { + ovtpvt_err("No can_do for %s\n", p->pstring); + BENCH_ASSERT(0); + } + + problem_zero(p); + setup(p); + + verify_problem(p, rounds, tol); + + done(p); + problem_destroy(p); +} + + +static void do_accuracy(bench_problem *p, int rounds, int impulse_rounds) +{ + double t[6]; + + switch (p->kind) { + case PROBLEM_COMPLEX: + accuracy_dft(p, rounds, impulse_rounds, t); break; + case PROBLEM_REAL: + accuracy_rdft2(p, rounds, impulse_rounds, t); break; + case PROBLEM_R2R: + accuracy_r2r(p, rounds, impulse_rounds, t); break; + } + + /* t[0] : L1 error + t[1] : L2 error + t[2] : Linf error + t[3..5]: L1, L2, Linf backward error */ + ovtpvt("%6.2e %6.2e %6.2e %6.2e %6.2e %6.2e\n", + t[0], t[1], t[2], t[3], t[4], t[5]); +} + +void accuracy(const char *param, int rounds, int impulse_rounds) +{ + bench_problem *p; + p = problem_parse(param); + BENCH_ASSERT(can_do(p)); + problem_alloc(p); + problem_zero(p); + setup(p); + do_accuracy(p, rounds, impulse_rounds); + done(p); + problem_destroy(p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify.h new file mode 100644 index 000000000..e249c1636 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/verify.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "libbench2/bench.h" + +typedef bench_real R; +typedef bench_complex C; + +typedef struct dofft_closure_s { + void (*apply)(struct dofft_closure_s *k, + bench_complex *in, bench_complex *out); + int recopy_input; +} dofft_closure; + +double dmax(double x, double y); + +typedef void (*aconstrain)(C *a, int n); + +void arand(C *a, int n); +void mkreal(C *A, int n); +void mkhermitian(C *A, int rank, const bench_iodim *dim, int stride); +void mkhermitian1(C *a, int n); +void aadd(C *c, C *a, C *b, int n); +void asub(C *c, C *a, C *b, int n); +void arol(C *b, C *a, int n, int nb, int na); +void aphase_shift(C *b, C *a, int n, int nb, int na, double sign); +void ascale(C *a, C alpha, int n); +double acmp(C *a, C *b, int n, const char *test, double tol); +double mydrand(void); +double impulse(dofft_closure *k, + int n, int vecn, + C *inA, C *inB, C *inC, + C *outA, C *outB, C *outC, + C *tmp, int rounds, double tol); +double linear(dofft_closure *k, int realp, + int n, C *inA, C *inB, C *inC, C *outA, + C *outB, C *outC, C *tmp, int rounds, double tol); +void preserves_input(dofft_closure *k, aconstrain constrain, + int n, C *inA, C *inB, C *outB, int rounds); + +enum { TIME_SHIFT, FREQ_SHIFT }; +double tf_shift(dofft_closure *k, int realp, const bench_tensor *sz, + int n, int vecn, double sign, + C *inA, C *inB, C *outA, C *outB, C *tmp, + int rounds, double tol, int which_shift); + +typedef struct dotens2_closure_s { + void (*apply)(struct dotens2_closure_s *k, + int indx0, int ondx0, int indx1, int ondx1); +} dotens2_closure; + +void bench_dotens2(const bench_tensor *sz0, + const bench_tensor *sz1, dotens2_closure *k); + +void accuracy_test(dofft_closure *k, aconstrain constrain, + int sign, int n, C *a, C *b, int rounds, int impulse_rounds, + double t[6]); + +void accuracy_dft(bench_problem *p, int rounds, int impulse_rounds, + double t[6]); +void accuracy_rdft2(bench_problem *p, int rounds, int impulse_rounds, + double t[6]); +void accuracy_r2r(bench_problem *p, int rounds, int impulse_rounds, + double t[6]); + +#if defined(BENCHFFT_LDOUBLE) && HAVE_COSL + typedef long double trigreal; +# define COS cosl +# define SIN sinl +# define TAN tanl +# define KTRIG(x) (x##L) +#elif defined(BENCHFFT_QUAD) && HAVE_LIBQUADMATH + typedef __float128 trigreal; +# define COS cosq +# define SIN sinq +# define TAN tanq +# define KTRIG(x) (x##Q) +extern trigreal cosq(trigreal); +extern trigreal sinq(trigreal); +extern trigreal tanq(trigreal); +#else + typedef double trigreal; +# define COS cos +# define SIN sin +# define TAN tan +# define KTRIG(x) (x) +#endif +#define K2PI KTRIG(6.2831853071795864769252867665590057683943388) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/zero.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/zero.c new file mode 100644 index 000000000..48d8ca009 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/libbench2/zero.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2001 Matteo Frigo + * Copyright (c) 2001 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "libbench2/bench.h" + +/* set I/O arrays to zero. Default routine */ +void problem_zero(bench_problem *p) +{ + bench_complex czero = {0, 0}; + if (p->kind == PROBLEM_COMPLEX) { + caset((bench_complex *) p->inphys, p->iphyssz, czero); + caset((bench_complex *) p->outphys, p->ophyssz, czero); + } else if (p->kind == PROBLEM_R2R) { + aset((bench_real *) p->inphys, p->iphyssz, 0.0); + aset((bench_real *) p->outphys, p->ophyssz, 0.0); + } else if (p->kind == PROBLEM_REAL && p->sign < 0) { + aset((bench_real *) p->inphys, p->iphyssz, 0.0); + caset((bench_complex *) p->outphys, p->ophyssz, czero); + } else if (p->kind == PROBLEM_REAL && p->sign > 0) { + caset((bench_complex *) p->inphys, p->iphyssz, czero); + aset((bench_real *) p->outphys, p->ophyssz, 0.0); + } else { + BENCH_ASSERT(0); /* TODO */ + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/ltmain.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/ltmain.sh new file mode 100644 index 000000000..a736cf994 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/ltmain.sh @@ -0,0 +1,11156 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-2" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname $scriptversion Debian-2.4.6-2 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/Makefile.am new file mode 100644 index 000000000..860dcf25e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/Makefile.am @@ -0,0 +1,8 @@ +EXTRA_DIST = acx_mpi.m4 acx_pthread.m4 ax_cc_maxopt.m4 \ +ax_check_compiler_flags.m4 ax_compiler_vendor.m4 \ +ax_gcc_aligns_stack.m4 ax_gcc_version.m4 ax_openmp.m4 + +# libtool sticks a bunch of extra .m4 files in this directory, +# but they don't seem to be needed for the distributed tarball +# (they aren't needed for configure && make, and boostrapping +# will regenerate them anyway). diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/Makefile.in new file mode 100644 index 000000000..0ce8f9d91 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/Makefile.in @@ -0,0 +1,487 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = m4 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = acx_mpi.m4 acx_pthread.m4 ax_cc_maxopt.m4 \ +ax_check_compiler_flags.m4 ax_compiler_vendor.m4 \ +ax_gcc_aligns_stack.m4 ax_gcc_version.m4 ax_openmp.m4 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu m4/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# libtool sticks a bunch of extra .m4 files in this directory, +# but they don't seem to be needed for the distributed tarball +# (they aren't needed for configure && make, and boostrapping +# will regenerate them anyway). + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/acx_mpi.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/acx_mpi.m4 new file mode 100644 index 000000000..36fcabd54 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/acx_mpi.m4 @@ -0,0 +1,106 @@ +dnl @synopsis ACX_MPI([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl @summary figure out how to compile/link code with MPI +dnl @category InstalledPackages +dnl +dnl This macro tries to find out how to compile programs that +dnl use MPI (Message Passing Interface), a standard API for +dnl parallel process communication (see http://www-unix.mcs.anl.gov/mpi/) +dnl +dnl On success, it sets the MPICC, MPICXX, or MPIF77 output variable to +dnl the name of the MPI compiler, depending upon the current language. +dnl (This may just be $CC/$CXX/$F77, but is more often something like +dnl mpicc/mpiCC/mpif77.) It also sets MPILIBS to any libraries that are +dnl needed for linking MPI (e.g. -lmpi, if a special MPICC/MPICXX/MPIF77 +dnl was not found). +dnl +dnl If you want to compile everything with MPI, you should set: +dnl +dnl CC="$MPICC" #OR# CXX="$MPICXX" #OR# F77="$MPIF77" +dnl LIBS="$MPILIBS $LIBS" +dnl +dnl NOTE: The above assumes that you will use $CC (or whatever) +dnl for linking as well as for compiling. (This is the +dnl default for automake and most Makefiles.) +dnl +dnl The user can force a particular library/compiler by setting the +dnl MPICC/MPICXX/MPIF77 and/or MPILIBS environment variables. +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if an MPI +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands +dnl to run it if it is not found. If ACTION-IF-FOUND is not specified, +dnl the default action will define HAVE_MPI. +dnl +dnl @version 2005-09-02 +dnl @license GPLWithACException +dnl @author Steven G. Johnson + +AC_DEFUN([ACX_MPI], [ +AC_PREREQ(2.50) dnl for AC_LANG_CASE + +AC_LANG_CASE([C], [ + AC_REQUIRE([AC_PROG_CC]) + AC_ARG_VAR(MPICC,[MPI C compiler command]) + AC_CHECK_PROGS(MPICC, mpicc hcc mpcc mpcc_r mpxlc cmpicc, $CC) + acx_mpi_save_CC="$CC" + CC="$MPICC" + AC_SUBST(MPICC) +], +[C++], [ + AC_REQUIRE([AC_PROG_CXX]) + AC_ARG_VAR(MPICXX,[MPI C++ compiler command]) + AC_CHECK_PROGS(MPICXX, mpic++ mpiCC mpicxx mpCC hcp mpxlC mpxlC_r cmpic++, $CXX) + acx_mpi_save_CXX="$CXX" + CXX="$MPICXX" + AC_SUBST(MPICXX) +], +[Fortran 77], [ + AC_REQUIRE([AC_PROG_F77]) + AC_ARG_VAR(MPIF77,[MPI Fortran compiler command]) + AC_CHECK_PROGS(MPIF77, mpif77 hf77 mpxlf mpf77 mpif90 mpf90 mpxlf90 mpxlf95 mpxlf_r cmpifc cmpif90c, $F77) + acx_mpi_save_F77="$F77" + F77="$MPIF77" + AC_SUBST(MPIF77) +]) + +if test x = x"$MPILIBS"; then + AC_LANG_CASE([C], [AC_CHECK_FUNC(MPI_Init, [MPILIBS=" "])], + [C++], [AC_CHECK_FUNC(MPI_Init, [MPILIBS=" "])], + [Fortran 77], [AC_MSG_CHECKING([for MPI_Init]) + AC_TRY_LINK([],[ call MPI_Init], [MPILIBS=" " + AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)])]) +fi +if test x = x"$MPILIBS"; then + AC_CHECK_LIB(mpi, MPI_Init, [MPILIBS="-lmpi"]) +fi +if test x = x"$MPILIBS"; then + AC_CHECK_LIB(mpich, MPI_Init, [MPILIBS="-lmpich"]) +fi + +dnl We have to use AC_TRY_COMPILE and not AC_CHECK_HEADER because the +dnl latter uses $CPP, not $CC (which may be mpicc). +AC_LANG_CASE([C], [if test x != x"$MPILIBS"; then + AC_MSG_CHECKING([for mpi.h]) + AC_TRY_COMPILE([#include ],[],[AC_MSG_RESULT(yes)], [MPILIBS="" + AC_MSG_RESULT(no)]) +fi], +[C++], [if test x != x"$MPILIBS"; then + AC_MSG_CHECKING([for mpi.h]) + AC_TRY_COMPILE([#include ],[],[AC_MSG_RESULT(yes)], [MPILIBS="" + AC_MSG_RESULT(no)]) +fi]) + +AC_LANG_CASE([C], [CC="$acx_mpi_save_CC"], + [C++], [CXX="$acx_mpi_save_CXX"], + [Fortran 77], [F77="$acx_mpi_save_F77"]) + +AC_SUBST(MPILIBS) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x = x"$MPILIBS"; then + $2 + : +else + ifelse([$1],,[AC_DEFINE(HAVE_MPI,1,[Define if you have the MPI library.])],[$1]) + : +fi +])dnl ACX_MPI diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/acx_pthread.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/acx_pthread.m4 new file mode 100644 index 000000000..0a86582a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/acx_pthread.m4 @@ -0,0 +1,245 @@ +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl @summary figure out how to build C programs using POSIX threads +dnl @category InstalledPackages +dnl +dnl This macro figures out how to build C programs using POSIX +dnl threads. It sets the PTHREAD_LIBS output variable to the threads +dnl library and linker flags, and the PTHREAD_CFLAGS output variable +dnl to any special C compiler flags that are needed. (The user can also +dnl force certain compiler flags/libs to be tested by setting these +dnl environment variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +dnl +dnl If you are only building threads programs, you may wish to +dnl use these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE +dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands +dnl to run it if it is not found. If ACTION-IF-FOUND is not specified, +dnl the default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, +dnl or if you have any other suggestions or comments. This macro was +dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org) +dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread +dnl macros posted by Alejandro Forero Cuervo to the autoconf macro +dnl repository. We are also grateful for the helpful feedback of +dnl numerous users. +dnl +dnl @version 2006-09-15 +dnl @license GPLWithACException +dnl @author Steven G. Johnson + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt -mthreads pthread --thread-safe pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# (where it should come before -mthreads to avoid spurious warnings) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, (void**) 0); + pthread_attr_init((pthread_attr_t*) 0); + pthread_cleanup_push((void(*)(void *)) 0, (void*) 0); + pthread_create((pthread_t*) 0, (pthread_attr_t*) 0, + (void*(*)(void *)) 0, (void*) 0); + pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_cc_maxopt.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_cc_maxopt.m4 new file mode 100644 index 000000000..61d3a985c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_cc_maxopt.m4 @@ -0,0 +1,128 @@ +dnl @synopsis AX_CC_MAXOPT +dnl @summary turn on optimization flags for the C compiler +dnl @category C +dnl +dnl Try to turn on "good" C optimization flags for various compilers +dnl and architectures, for some definition of "good". (In our case, +dnl good for FFTW and hopefully for other scientific codes. Modify +dnl as needed.) +dnl +dnl The user can override the flags by setting the CFLAGS environment +dnl variable. +dnl +dnl Note also that the flags assume that ANSI C aliasing rules are +dnl followed by the code (e.g. for gcc's -fstrict-aliasing), and that +dnl floating-point computations can be re-ordered as needed. +dnl +dnl Requires macros: AX_CHECK_COMPILER_FLAGS, AX_COMPILER_VENDOR, +dnl +dnl @version 2011-06-22 +dnl @license GPLWithACException +dnl @author Steven G. Johnson and Matteo Frigo. +AC_DEFUN([AX_CC_MAXOPT], +[ +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AX_COMPILER_VENDOR]) +AC_REQUIRE([AC_CANONICAL_HOST]) + +# Try to determine "good" native compiler flags if none specified via CFLAGS +if test "$ac_test_CFLAGS" != "set"; then + CFLAGS="" + case $ax_cv_c_compiler_vendor in + dec) CFLAGS="-newc -w0 -O5 -ansi_alias -ansi_args -fp_reorder -tune host" + ;; + + sun) CFLAGS="-native -fast -xO5 -dalign" + ;; + + hp) CFLAGS="+Oall +Optrs_ansi +DSnative" + ;; + + ibm) xlc_opt="-qarch=auto -qtune=auto" + AX_CHECK_COMPILER_FLAGS($xlc_opt, + CFLAGS="-O3 -qalias=ansi -w $xlc_opt", + [CFLAGS="-O3 -qalias=ansi -w"]) + ;; + + intel) CFLAGS="-O3" + # Intel seems to have changed the spelling of this flag recently + icc_ansi_alias="unknown" + for flag in -ansi-alias -ansi_alias; do + AX_CHECK_COMPILER_FLAGS($flag, [icc_ansi_alias=$flag; break]) + done + if test "x$icc_ansi_alias" != xunknown; then + CFLAGS="$CFLAGS $icc_ansi_alias" + fi + AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") + # We used to check for architecture flags here, e.g. -xHost etc., + # but these flags are problematic. On icc-12.0.0, "-mavx -xHost" + # overrides -mavx with -xHost, generating SSE2 code instead of AVX + # code. ICC does not seem to support -mtune=host or equivalent + # non-ABI changing flag. + ;; + + clang) + CFLAGS="-O3 -fomit-frame-pointer" + AX_CHECK_COMPILER_FLAGS(-mtune=native, CFLAGS="$CFLAGS -mtune=native") + AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing,CFLAGS="$CFLAGS -fstrict-aliasing") + ;; + + gnu) + # Default optimization flags for gcc on all systems. + # Somehow -O3 does not imply -fomit-frame-pointer on ia32 + CFLAGS="-O3 -fomit-frame-pointer" + + # tune for the host by default + AX_CHECK_COMPILER_FLAGS(-mtune=native, CFLAGS="$CFLAGS -mtune=native") + + # -malign-double for x86 systems + AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") + + # -fstrict-aliasing for gcc-2.95+ + AX_CHECK_COMPILER_FLAGS(-fstrict-aliasing, + CFLAGS="$CFLAGS -fstrict-aliasing") + + # -fno-schedule-insns is pretty much required on all risc + # processors. + # + # gcc performs one pass of instruction scheduling, then a pass of + # register allocation, then another pass of instruction + # scheduling. The first pass reorders instructions in a way that + # is pretty much the worst possible for the purposes of register + # allocation. We disable the first pass. + AX_CHECK_COMPILER_FLAGS(-fno-schedule-insns, CFLAGS="$CFLAGS -fno-schedule-insns") + + # flags to enable power ISA 2.07 instructions with gcc (always true with vsx) + if test "$have_vsx" = "yes"; then + AX_CHECK_COMPILER_FLAGS(-mcpu=power8, CFLAGS="$CFLAGS -mcpu=power8") + AX_CHECK_COMPILER_FLAGS(-mpower8-fusion, CFLAGS="$CFLAGS -mpower8-fusion") + AX_CHECK_COMPILER_FLAGS(-mpower8-vector, CFLAGS="$CFLAGS -mpower8-vector") + AX_CHECK_COMPILER_FLAGS(-mdirect-move, CFLAGS="$CFLAGS -mdirect-move") + fi + ;; + esac + + if test -z "$CFLAGS"; then + echo "" + echo "********************************************************" + echo "* WARNING: Don't know the best CFLAGS for this system *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "* (otherwise, a default of CFLAGS=-O3 will be used) *" + echo "********************************************************" + echo "" + CFLAGS="-O3" + fi + + AX_CHECK_COMPILER_FLAGS($CFLAGS, [], [ + echo "" + echo "********************************************************" + echo "* WARNING: The guessed CFLAGS don't seem to work with *" + echo "* your compiler. *" + echo "* Use ./configure CFLAGS=... to specify your own flags *" + echo "********************************************************" + echo "" + CFLAGS="" + ]) + +fi +]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_check_compiler_flags.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_check_compiler_flags.m4 new file mode 100644 index 000000000..86eaf15ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_check_compiler_flags.m4 @@ -0,0 +1,40 @@ +dnl @synopsis AX_CHECK_COMPILER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE]) +dnl @summary check whether FLAGS are accepted by the compiler +dnl @category Misc +dnl +dnl Check whether the given compiler FLAGS work with the current language's +dnl compiler, or whether they give an error. (Warnings, however, are +dnl ignored.) +dnl +dnl ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +dnl success/failure. +dnl +dnl @version 2005-05-30 +dnl @license GPLWithACException +dnl @author Steven G. Johnson and Matteo Frigo. +AC_DEFUN([AX_CHECK_COMPILER_FLAGS], +[AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX +AC_MSG_CHECKING([whether _AC_LANG compiler accepts $1]) +dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname: +AS_LITERAL_IF([$1], + [AC_CACHE_VAL(AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1), [ + ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=yes, + AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=no) + _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS])], + [ax_save_FLAGS=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=yes, + eval AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1)=no) + _AC_LANG_PREFIX[]FLAGS=$ax_save_FLAGS]) +eval ax_check_compiler_flags=$AS_TR_SH(ax_cv_[]_AC_LANG_ABBREV[]_flags_$1) +AC_MSG_RESULT($ax_check_compiler_flags) +if test "x$ax_check_compiler_flags" = xyes; then + m4_default([$2], :) +else + m4_default([$3], :) +fi +])dnl AX_CHECK_COMPILER_FLAGS diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_compiler_vendor.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_compiler_vendor.m4 new file mode 100644 index 000000000..0d7c0c405 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_compiler_vendor.m4 @@ -0,0 +1,30 @@ +dnl @synopsis AX_COMPILER_VENDOR +dnl @summary find the vendor (gnu, intel, etc.) of the C/C++ compiler +dnl @category C +dnl @category C++ +dnl +dnl Determine the vendor of the C/C++ compiler, e.g., gnu, intel, ibm, +dnl sun, hp, borland, comeau, dec, cray, kai, lcc, metrowerks, sgi, +dnl microsoft, watcom, etc. The vendor is returned in the cache variable +dnl $ax_cv_c_compiler_vendor for C and $ax_cv_cxx_compiler_vendor for C++. +dnl +dnl @version 2007-08-01 +dnl @license GPLWithACException +dnl @author Steven G. Johnson with Matteo Frigo + +AC_DEFUN([AX_COMPILER_VENDOR], +[ +AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, + [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown + # note: don't check for gcc first since some other compilers define __GNUC__ + for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__ibmxl__,__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ clang:__clang__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do + vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ +#if !($vencpp) + thisisanerror; +#endif +])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break]) + done + ]) +]) + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_gcc_aligns_stack.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_gcc_aligns_stack.m4 new file mode 100644 index 000000000..5188f6df6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_gcc_aligns_stack.m4 @@ -0,0 +1,50 @@ +dnl @synopsis AX_GCC_ALIGNS_STACK([ACTION-IF-YES], [ACTION-IF-NO]) +dnl @summary check whether gcc can align stack to 8-byte boundary +dnl @category Misc +dnl +dnl Check to see if we are using a version of gcc that aligns the stack +dnl (true in gcc-2.95+, which have the -mpreferred-stack-boundary flag). +dnl Also, however, checks whether main() is correctly aligned by the +dnl OS/libc/..., as well as for a bug in the stack alignment of gcc-2.95.x +dnl (see http://gcc.gnu.org/ml/gcc-bugs/1999-11/msg00259.html). +dnl +dnl ACTION-IF-YES/ACTION-IF-NO are shell commands to execute if we are +dnl using gcc and the stack is/isn't aligned, respectively. +dnl +dnl Requires macro: AX_CHECK_COMPILER_FLAGS, AX_GCC_VERSION +dnl +dnl @version 2005-05-30 +dnl @license GPLWithACException +dnl @author Steven G. Johnson +AC_DEFUN([AX_GCC_ALIGNS_STACK], +[ +AC_REQUIRE([AC_PROG_CC]) +ax_gcc_aligns_stack=no +if test "$GCC" = "yes"; then +AX_CHECK_COMPILER_FLAGS(-mpreferred-stack-boundary=4, [ + AC_MSG_CHECKING([whether the stack is at least 8-byte aligned by gcc]) + save_CFLAGS="$CFLAGS" + CFLAGS="-O" + AX_CHECK_COMPILER_FLAGS(-malign-double, CFLAGS="$CFLAGS -malign-double") + AC_TRY_RUN([#include +# include + struct yuck { int blechh; }; + int one(void) { return 1; } + struct yuck ick(void) { struct yuck y; y.blechh = 3; return y; } +# define CHK_ALIGN(x) if ((((long) &(x)) & 0x7)) { fprintf(stderr, "bad alignment of " #x "\n"); exit(1); } + void blah(int foo) { double foobar; CHK_ALIGN(foobar); } + int main2(void) {double ok1; struct yuck y; double ok2; CHK_ALIGN(ok1); + CHK_ALIGN(ok2); y = ick(); blah(one()); return 0;} + int main(void) { if ((((long) (__builtin_alloca(0))) & 0x7)) __builtin_alloca(4); return main2(); } + ], [ax_gcc_aligns_stack=yes; ax_gcc_stack_align_bug=no], + ax_gcc_stack_align_bug=yes, [AX_GCC_VERSION(3,0,0, ax_gcc_stack_align_bug=no, ax_gcc_stack_align_bug=yes)]) + CFLAGS="$save_CFLAGS" + AC_MSG_RESULT($ax_gcc_aligns_stack) +]) +fi +if test "$ax_gcc_aligns_stack" = yes; then + m4_default([$1], :) +else + m4_default([$2], :) +fi +]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_gcc_version.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_gcc_version.m4 new file mode 100644 index 000000000..4aed421bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_gcc_version.m4 @@ -0,0 +1,38 @@ +dnl @synopsis AX_GCC_VERSION(MAJOR, MINOR, PATCHLEVEL, [ACTION-SUCCESS], [ACTION-FAILURE]) +dnl @summary check wither gcc is at least version MAJOR.MINOR.PATCHLEVEL +dnl @category InstalledPackages +dnl +dnl Check whether we are using gcc and, if so, whether its version +dnl is at least MAJOR.MINOR.PATCHLEVEL +dnl +dnl ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +dnl success/failure. +dnl +dnl @version 2005-05-30 +dnl @license GPLWithACException +dnl @author Steven G. Johnson and Matteo Frigo. +AC_DEFUN([AX_GCC_VERSION], +[ +AC_REQUIRE([AC_PROG_CC]) +AC_CACHE_CHECK(whether we are using gcc $1.$2.$3 or later, ax_cv_gcc_$1_$2_$3, +[ +ax_cv_gcc_$1_$2_$3=no +if test "$GCC" = "yes"; then +dnl The semicolon after "yes" below is to pacify NeXT's syntax-checking cpp. +AC_EGREP_CPP(yes, [ +#ifdef __GNUC__ +# if (__GNUC__ > $1) || (__GNUC__ == $1 && __GNUC_MINOR__ > $2) \ + || (__GNUC__ == $1 && __GNUC_MINOR__ == $2 && __GNUC_PATCHLEVEL__ >= $3) + yes; +# endif +#endif +], [ax_cv_gcc_$1_$2_$3=yes]) +fi +]) +if test "$ax_cv_gcc_$1_$2_$3" = yes; then + m4_default([$4], :) +else + m4_default([$5], :) +fi +]) + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_openmp.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_openmp.m4 new file mode 100644 index 000000000..611ae0b4a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ax_openmp.m4 @@ -0,0 +1,66 @@ +dnl @synopsis AX_OPENMP([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl @summary determine how to compile programs using OpenMP +dnl @category InstalledPackages +dnl +dnl This macro tries to find out how to compile programs that +dnl use OpenMP, a standard API and set of compiler directives for +dnl parallel programming (see http://www.openmp.org/). +dnl +dnl On success, it sets the OPENMP_CFLAGS/OPENMP_CXXFLAGS/OPENMP_FFLAGS +dnl output variable to the flag (e.g. -omp) used both to compile *and* link +dnl OpenMP programs in the current language. +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. +dnl +dnl If you want to compile everything with OpenMP, you should set: +dnl +dnl CFLAGS="$CFLAGS $OPENMP_CFLAGS" +dnl #OR# CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" +dnl #OR# FFLAGS="$FFLAGS $OPENMP_FFLAGS" +dnl +dnl (depending on the selected language). +dnl +dnl The user can override the default choice by setting the corresponding +dnl environment variable (e.g. OPENMP_CFLAGS). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if an OpenMP +dnl flag is found, and ACTION-IF-NOT-FOUND is a list of commands +dnl to run it if it is not found. If ACTION-IF-FOUND is not specified, +dnl the default action will define HAVE_OPENMP. +dnl +dnl @version 2006-11-20 +dnl @license GPLWithACException +dnl @author Steven G. Johnson + +AC_DEFUN([AX_OPENMP], [ +AC_PREREQ(2.59) dnl for _AC_LANG_PREFIX + +AC_CACHE_CHECK([for OpenMP flag of _AC_LANG compiler], ax_cv_[]_AC_LANG_ABBREV[]_openmp, [save[]_AC_LANG_PREFIX[]FLAGS=$[]_AC_LANG_PREFIX[]FLAGS +ax_cv_[]_AC_LANG_ABBREV[]_openmp=unknown +# Flags to try: -fopenmp (gcc), -openmp (icc), -mp (SGI & PGI), +# -xopenmp (Sun), -omp (Tru64), -qsmp=omp (AIX), none +ax_openmp_flags="-fopenmp -openmp -mp -xopenmp -omp -qsmp=omp none" +if test "x$OPENMP_[]_AC_LANG_PREFIX[]FLAGS" != x; then + ax_openmp_flags="$OPENMP_[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flags" +fi +for ax_openmp_flag in $ax_openmp_flags; do + case $ax_openmp_flag in + none) []_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[] ;; + *) []_AC_LANG_PREFIX[]FLAGS="$save[]_AC_LANG_PREFIX[]FLAGS $ax_openmp_flag" ;; + esac + AC_TRY_LINK_FUNC(omp_set_num_threads, + [ax_cv_[]_AC_LANG_ABBREV[]_openmp=$ax_openmp_flag; break]) +done +[]_AC_LANG_PREFIX[]FLAGS=$save[]_AC_LANG_PREFIX[]FLAGS +]) +if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" = "xunknown"; then + m4_default([$2],:) +else + if test "x$ax_cv_[]_AC_LANG_ABBREV[]_openmp" != "xnone"; then + OPENMP_[]_AC_LANG_PREFIX[]FLAGS=$ax_cv_[]_AC_LANG_ABBREV[]_openmp + fi + m4_default([$1], [AC_DEFINE(HAVE_OPENMP,1,[Define if OpenMP is enabled])]) +fi +AC_SUBST(OPENMP_[]_AC_LANG_PREFIX[]FLAGS) +])dnl AX_OPENMP diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/libtool.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/libtool.m4 new file mode 100644 index 000000000..ee80844b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/libtool.m4 @@ -0,0 +1,8387 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltoptions.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltoptions.m4 new file mode 100644 index 000000000..94b082976 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltsugar.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltsugar.m4 new file mode 100644 index 000000000..48bc9344a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltversion.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltversion.m4 new file mode 100644 index 000000000..fa04b52a3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/lt~obsolete.m4 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/lt~obsolete.m4 new file mode 100644 index 000000000..c6b26f88f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/missing b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/missing new file mode 100755 index 000000000..f62bbae30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/Makefile.am new file mode 100644 index 000000000..8e43fac5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/Makefile.am @@ -0,0 +1,101 @@ +# -I $(top_srcdir)/api is necessary because fftw3-mpi.h includes +# "fftw3.h", and we cannot change the latter to "api/fftw3.h" because +# fftw3-mpi.h is installed in /usr/include. +AM_CPPFLAGS = -I $(top_srcdir) -I $(top_srcdir)/api + +if MPI +lib_LTLIBRARIES = libfftw3@PREC_SUFFIX@_mpi.la +include_HEADERS = fftw3-mpi.h +nodist_include_HEADERS = fftw3-mpi.f03 fftw3l-mpi.f03 +noinst_PROGRAMS = mpi-bench +endif + +CC=@MPICC@ + +EXTRA_DIST = testsched.c f03api.sh f03-wrap.sh genf03-wrap.pl fftw3-mpi.f03.in fftw3l-mpi.f03.in +BUILT_SOURCES = fftw3-mpi.f03.in fftw3-mpi.f03 fftw3l-mpi.f03.in fftw3l-mpi.f03 f03-wrap.c +CLEANFILES = fftw3-mpi.f03 fftw3l-mpi.f03 + +TRANSPOSE_SRC = transpose-alltoall.c transpose-pairwise.c transpose-recurse.c transpose-problem.c transpose-solve.c mpi-transpose.h +DFT_SRC = dft-serial.c dft-rank-geq2.c dft-rank-geq2-transposed.c dft-rank1.c dft-rank1-bigvec.c dft-problem.c dft-solve.c mpi-dft.h +RDFT_SRC = rdft-serial.c rdft-rank-geq2.c rdft-rank-geq2-transposed.c rdft-rank1-bigvec.c rdft-problem.c rdft-solve.c mpi-rdft.h +RDFT2_SRC = rdft2-serial.c rdft2-rank-geq2.c rdft2-rank-geq2-transposed.c rdft2-problem.c rdft2-solve.c mpi-rdft2.h +SRC = any-true.c api.c block.c choose-radix.c conf.c dtensor.c fftw3-mpi.h ifftw-mpi.h rearrange.c wisdom-api.c f03-wrap.c + +libfftw3@PREC_SUFFIX@_mpi_la_SOURCES = $(SRC) $(TRANSPOSE_SRC) $(DFT_SRC) $(RDFT_SRC) $(RDFT2_SRC) + +libfftw3@PREC_SUFFIX@_mpi_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ +libfftw3@PREC_SUFFIX@_mpi_la_LIBADD = ../libfftw3@PREC_SUFFIX@.la @MPILIBS@ + +if THREADS +mpi_bench_CFLAGS = $(PTHREAD_CFLAGS) +if !COMBINED_THREADS +LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_threads.la +endif +else +if OPENMP +mpi_bench_CFLAGS = $(OPENMP_CFLAGS) +LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_omp.la +endif +endif + +mpi_bench_SOURCES = mpi-bench.c $(top_srcdir)/tests/fftw-bench.c $(top_srcdir)/tests/hook.c +mpi_bench_LDADD = libfftw3@PREC_SUFFIX@_mpi.la $(LIBFFTWTHREADS) $(top_builddir)/libfftw3@PREC_SUFFIX@.la $(top_builddir)/libbench2/libbench2.a $(MPILIBS) $(THREADLIBS) + +CHECK = $(top_srcdir)/tests/check.pl +NUMCHECK=10 +CHECKSIZE=10000 +CHECKOPTS = --verbose --random --maxsize=$(CHECKSIZE) -c=$(NUMCHECK) $(CHECK_PL_OPTS) + +if MPI + +check-local: mpi-bench$(EXEEXT) + perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 1 `pwd`/mpi-bench" + @echo "--------------------------------------------------------------" + @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 1 CPU" + @echo "--------------------------------------------------------------" + perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 2 `pwd`/mpi-bench" + @echo "--------------------------------------------------------------" + @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 2 CPUs" + @echo "--------------------------------------------------------------" + perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 3 `pwd`/mpi-bench" + @echo "--------------------------------------------------------------" + @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 3 CPUs" + @echo "--------------------------------------------------------------" + perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 4 `pwd`/mpi-bench" + @echo "--------------------------------------------------------------" + @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 4 CPUs" + @echo "--------------------------------------------------------------" +if SMP + perl -w $(CHECK) $(CHECKOPTS) --mpi --nthreads=2 "$(MPIRUN) -np 3 `pwd`/mpi-bench" + @echo "--------------------------------------------------------------" + @echo " MPI FFTW threaded transforms passed "$(NUMCHECK)" tests!" + @echo "--------------------------------------------------------------" +endif + +bigcheck: mpi-bench$(EXEEXT) + $(MAKE) $(AM_MAKEFLAGS) NUMCHECK=100 CHECKSIZE=60000 check-local + +smallcheck: mpi-bench$(EXEEXT) + $(MAKE) $(AM_MAKEFLAGS) NUMCHECK=2 check-local + +endif + +fftw3-mpi.f03: fftw3-mpi.f03.in Makefile + sed 's/C_MPI_FINT/@C_MPI_FINT@/' $(srcdir)/fftw3-mpi.f03.in > $@ + +fftw3l-mpi.f03: fftw3l-mpi.f03.in Makefile + sed 's/C_MPI_FINT/@C_MPI_FINT@/' $(srcdir)/fftw3l-mpi.f03.in > $@ + +if MAINTAINER_MODE + +fftw3-mpi.f03.in: fftw3-mpi.h f03api.sh $(top_srcdir)/api/genf03.pl + sh $(srcdir)/f03api.sh d f > $@ + +fftw3l-mpi.f03.in: fftw3-mpi.h f03api.sh $(top_srcdir)/api/genf03.pl + sh $(srcdir)/f03api.sh l | grep -v parameter | sed 's/fftw3.f03/fftw3l.f03/' > $@ + +f03-wrap.c: fftw3-mpi.h f03-wrap.sh genf03-wrap.pl + sh $(srcdir)/f03-wrap.sh > $@ + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/Makefile.in new file mode 100644 index 000000000..a387b9744 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/Makefile.in @@ -0,0 +1,934 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@MPI_TRUE@noinst_PROGRAMS = mpi-bench$(EXEEXT) +subdir = mpi +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__include_HEADERS_DIST) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libfftw3@PREC_SUFFIX@_mpi_la_DEPENDENCIES = \ + ../libfftw3@PREC_SUFFIX@.la +am__objects_1 = any-true.lo api.lo block.lo choose-radix.lo conf.lo \ + dtensor.lo rearrange.lo wisdom-api.lo f03-wrap.lo +am__objects_2 = transpose-alltoall.lo transpose-pairwise.lo \ + transpose-recurse.lo transpose-problem.lo transpose-solve.lo +am__objects_3 = dft-serial.lo dft-rank-geq2.lo \ + dft-rank-geq2-transposed.lo dft-rank1.lo dft-rank1-bigvec.lo \ + dft-problem.lo dft-solve.lo +am__objects_4 = rdft-serial.lo rdft-rank-geq2.lo \ + rdft-rank-geq2-transposed.lo rdft-rank1-bigvec.lo \ + rdft-problem.lo rdft-solve.lo +am__objects_5 = rdft2-serial.lo rdft2-rank-geq2.lo \ + rdft2-rank-geq2-transposed.lo rdft2-problem.lo rdft2-solve.lo +am_libfftw3@PREC_SUFFIX@_mpi_la_OBJECTS = $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) $(am__objects_4) \ + $(am__objects_5) +libfftw3@PREC_SUFFIX@_mpi_la_OBJECTS = \ + $(am_libfftw3@PREC_SUFFIX@_mpi_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libfftw3@PREC_SUFFIX@_mpi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libfftw3@PREC_SUFFIX@_mpi_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@MPI_TRUE@am_libfftw3@PREC_SUFFIX@_mpi_la_rpath = -rpath $(libdir) +PROGRAMS = $(noinst_PROGRAMS) +am_mpi_bench_OBJECTS = mpi_bench-mpi-bench.$(OBJEXT) \ + mpi_bench-fftw-bench.$(OBJEXT) mpi_bench-hook.$(OBJEXT) +mpi_bench_OBJECTS = $(am_mpi_bench_OBJECTS) +am__DEPENDENCIES_1 = +mpi_bench_DEPENDENCIES = libfftw3@PREC_SUFFIX@_mpi.la \ + $(LIBFFTWTHREADS) $(top_builddir)/libfftw3@PREC_SUFFIX@.la \ + $(top_builddir)/libbench2/libbench2.a $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +mpi_bench_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mpi_bench_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libfftw3@PREC_SUFFIX@_mpi_la_SOURCES) $(mpi_bench_SOURCES) +DIST_SOURCES = $(libfftw3@PREC_SUFFIX@_mpi_la_SOURCES) \ + $(mpi_bench_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__include_HEADERS_DIST = fftw3-mpi.h +HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @MPICC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# -I $(top_srcdir)/api is necessary because fftw3-mpi.h includes +# "fftw3.h", and we cannot change the latter to "api/fftw3.h" because +# fftw3-mpi.h is installed in /usr/include. +AM_CPPFLAGS = -I $(top_srcdir) -I $(top_srcdir)/api +@MPI_TRUE@lib_LTLIBRARIES = libfftw3@PREC_SUFFIX@_mpi.la +@MPI_TRUE@include_HEADERS = fftw3-mpi.h +@MPI_TRUE@nodist_include_HEADERS = fftw3-mpi.f03 fftw3l-mpi.f03 +EXTRA_DIST = testsched.c f03api.sh f03-wrap.sh genf03-wrap.pl fftw3-mpi.f03.in fftw3l-mpi.f03.in +BUILT_SOURCES = fftw3-mpi.f03.in fftw3-mpi.f03 fftw3l-mpi.f03.in fftw3l-mpi.f03 f03-wrap.c +CLEANFILES = fftw3-mpi.f03 fftw3l-mpi.f03 +TRANSPOSE_SRC = transpose-alltoall.c transpose-pairwise.c transpose-recurse.c transpose-problem.c transpose-solve.c mpi-transpose.h +DFT_SRC = dft-serial.c dft-rank-geq2.c dft-rank-geq2-transposed.c dft-rank1.c dft-rank1-bigvec.c dft-problem.c dft-solve.c mpi-dft.h +RDFT_SRC = rdft-serial.c rdft-rank-geq2.c rdft-rank-geq2-transposed.c rdft-rank1-bigvec.c rdft-problem.c rdft-solve.c mpi-rdft.h +RDFT2_SRC = rdft2-serial.c rdft2-rank-geq2.c rdft2-rank-geq2-transposed.c rdft2-problem.c rdft2-solve.c mpi-rdft2.h +SRC = any-true.c api.c block.c choose-radix.c conf.c dtensor.c fftw3-mpi.h ifftw-mpi.h rearrange.c wisdom-api.c f03-wrap.c +libfftw3@PREC_SUFFIX@_mpi_la_SOURCES = $(SRC) $(TRANSPOSE_SRC) $(DFT_SRC) $(RDFT_SRC) $(RDFT2_SRC) +libfftw3@PREC_SUFFIX@_mpi_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ +libfftw3@PREC_SUFFIX@_mpi_la_LIBADD = ../libfftw3@PREC_SUFFIX@.la @MPILIBS@ +@OPENMP_TRUE@@THREADS_FALSE@mpi_bench_CFLAGS = $(OPENMP_CFLAGS) +@THREADS_TRUE@mpi_bench_CFLAGS = $(PTHREAD_CFLAGS) +@COMBINED_THREADS_FALSE@@THREADS_TRUE@LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_threads.la +@OPENMP_TRUE@@THREADS_FALSE@LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_omp.la +mpi_bench_SOURCES = mpi-bench.c $(top_srcdir)/tests/fftw-bench.c $(top_srcdir)/tests/hook.c +mpi_bench_LDADD = libfftw3@PREC_SUFFIX@_mpi.la $(LIBFFTWTHREADS) $(top_builddir)/libfftw3@PREC_SUFFIX@.la $(top_builddir)/libbench2/libbench2.a $(MPILIBS) $(THREADLIBS) +CHECK = $(top_srcdir)/tests/check.pl +NUMCHECK = 10 +CHECKSIZE = 10000 +CHECKOPTS = --verbose --random --maxsize=$(CHECKSIZE) -c=$(NUMCHECK) $(CHECK_PL_OPTS) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu mpi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu mpi/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libfftw3@PREC_SUFFIX@_mpi.la: $(libfftw3@PREC_SUFFIX@_mpi_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_mpi_la_DEPENDENCIES) $(EXTRA_libfftw3@PREC_SUFFIX@_mpi_la_DEPENDENCIES) + $(AM_V_CCLD)$(libfftw3@PREC_SUFFIX@_mpi_la_LINK) $(am_libfftw3@PREC_SUFFIX@_mpi_la_rpath) $(libfftw3@PREC_SUFFIX@_mpi_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_mpi_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +mpi-bench$(EXEEXT): $(mpi_bench_OBJECTS) $(mpi_bench_DEPENDENCIES) $(EXTRA_mpi_bench_DEPENDENCIES) + @rm -f mpi-bench$(EXEEXT) + $(AM_V_CCLD)$(mpi_bench_LINK) $(mpi_bench_OBJECTS) $(mpi_bench_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/any-true.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/choose-radix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-rank-geq2-transposed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-rank-geq2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-rank1-bigvec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-rank1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-serial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-solve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dtensor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/f03-wrap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_bench-fftw-bench.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_bench-hook.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_bench-mpi-bench.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-rank-geq2-transposed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-rank-geq2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-rank1-bigvec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-serial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-solve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-rank-geq2-transposed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-rank-geq2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-serial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-solve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rearrange.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transpose-alltoall.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transpose-pairwise.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transpose-problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transpose-recurse.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transpose-solve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wisdom-api.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mpi_bench-mpi-bench.o: mpi-bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -MT mpi_bench-mpi-bench.o -MD -MP -MF $(DEPDIR)/mpi_bench-mpi-bench.Tpo -c -o mpi_bench-mpi-bench.o `test -f 'mpi-bench.c' || echo '$(srcdir)/'`mpi-bench.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_bench-mpi-bench.Tpo $(DEPDIR)/mpi_bench-mpi-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi-bench.c' object='mpi_bench-mpi-bench.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -c -o mpi_bench-mpi-bench.o `test -f 'mpi-bench.c' || echo '$(srcdir)/'`mpi-bench.c + +mpi_bench-mpi-bench.obj: mpi-bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -MT mpi_bench-mpi-bench.obj -MD -MP -MF $(DEPDIR)/mpi_bench-mpi-bench.Tpo -c -o mpi_bench-mpi-bench.obj `if test -f 'mpi-bench.c'; then $(CYGPATH_W) 'mpi-bench.c'; else $(CYGPATH_W) '$(srcdir)/mpi-bench.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_bench-mpi-bench.Tpo $(DEPDIR)/mpi_bench-mpi-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mpi-bench.c' object='mpi_bench-mpi-bench.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -c -o mpi_bench-mpi-bench.obj `if test -f 'mpi-bench.c'; then $(CYGPATH_W) 'mpi-bench.c'; else $(CYGPATH_W) '$(srcdir)/mpi-bench.c'; fi` + +mpi_bench-fftw-bench.o: $(top_srcdir)/tests/fftw-bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -MT mpi_bench-fftw-bench.o -MD -MP -MF $(DEPDIR)/mpi_bench-fftw-bench.Tpo -c -o mpi_bench-fftw-bench.o `test -f '$(top_srcdir)/tests/fftw-bench.c' || echo '$(srcdir)/'`$(top_srcdir)/tests/fftw-bench.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_bench-fftw-bench.Tpo $(DEPDIR)/mpi_bench-fftw-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/tests/fftw-bench.c' object='mpi_bench-fftw-bench.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -c -o mpi_bench-fftw-bench.o `test -f '$(top_srcdir)/tests/fftw-bench.c' || echo '$(srcdir)/'`$(top_srcdir)/tests/fftw-bench.c + +mpi_bench-fftw-bench.obj: $(top_srcdir)/tests/fftw-bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -MT mpi_bench-fftw-bench.obj -MD -MP -MF $(DEPDIR)/mpi_bench-fftw-bench.Tpo -c -o mpi_bench-fftw-bench.obj `if test -f '$(top_srcdir)/tests/fftw-bench.c'; then $(CYGPATH_W) '$(top_srcdir)/tests/fftw-bench.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/tests/fftw-bench.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_bench-fftw-bench.Tpo $(DEPDIR)/mpi_bench-fftw-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/tests/fftw-bench.c' object='mpi_bench-fftw-bench.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -c -o mpi_bench-fftw-bench.obj `if test -f '$(top_srcdir)/tests/fftw-bench.c'; then $(CYGPATH_W) '$(top_srcdir)/tests/fftw-bench.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/tests/fftw-bench.c'; fi` + +mpi_bench-hook.o: $(top_srcdir)/tests/hook.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -MT mpi_bench-hook.o -MD -MP -MF $(DEPDIR)/mpi_bench-hook.Tpo -c -o mpi_bench-hook.o `test -f '$(top_srcdir)/tests/hook.c' || echo '$(srcdir)/'`$(top_srcdir)/tests/hook.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_bench-hook.Tpo $(DEPDIR)/mpi_bench-hook.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/tests/hook.c' object='mpi_bench-hook.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -c -o mpi_bench-hook.o `test -f '$(top_srcdir)/tests/hook.c' || echo '$(srcdir)/'`$(top_srcdir)/tests/hook.c + +mpi_bench-hook.obj: $(top_srcdir)/tests/hook.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -MT mpi_bench-hook.obj -MD -MP -MF $(DEPDIR)/mpi_bench-hook.Tpo -c -o mpi_bench-hook.obj `if test -f '$(top_srcdir)/tests/hook.c'; then $(CYGPATH_W) '$(top_srcdir)/tests/hook.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/tests/hook.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mpi_bench-hook.Tpo $(DEPDIR)/mpi_bench-hook.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(top_srcdir)/tests/hook.c' object='mpi_bench-hook.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mpi_bench_CFLAGS) $(CFLAGS) -c -o mpi_bench-hook.obj `if test -f '$(top_srcdir)/tests/hook.c'; then $(CYGPATH_W) '$(top_srcdir)/tests/hook.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/tests/hook.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) +install-nodist_includeHEADERS: $(nodist_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ + done + +uninstall-nodist_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +@MPI_FALSE@check-local: +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS install-nodist_includeHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \ + uninstall-nodist_includeHEADERS + +.MAKE: all check check-am install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-includeHEADERS install-info \ + install-info-am install-libLTLIBRARIES install-man \ + install-nodist_includeHEADERS install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile + + +@MPI_TRUE@check-local: mpi-bench$(EXEEXT) +@MPI_TRUE@ perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 1 `pwd`/mpi-bench" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 1 CPU" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 2 `pwd`/mpi-bench" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 2 CPUs" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 3 `pwd`/mpi-bench" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 3 CPUs" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ perl -w $(CHECK) $(CHECKOPTS) --mpi "$(MPIRUN) -np 4 `pwd`/mpi-bench" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@ @echo " MPI FFTW transforms passed "$(NUMCHECK)" tests, 4 CPUs" +@MPI_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@@SMP_TRUE@ perl -w $(CHECK) $(CHECKOPTS) --mpi --nthreads=2 "$(MPIRUN) -np 3 `pwd`/mpi-bench" +@MPI_TRUE@@SMP_TRUE@ @echo "--------------------------------------------------------------" +@MPI_TRUE@@SMP_TRUE@ @echo " MPI FFTW threaded transforms passed "$(NUMCHECK)" tests!" +@MPI_TRUE@@SMP_TRUE@ @echo "--------------------------------------------------------------" + +@MPI_TRUE@bigcheck: mpi-bench$(EXEEXT) +@MPI_TRUE@ $(MAKE) $(AM_MAKEFLAGS) NUMCHECK=100 CHECKSIZE=60000 check-local + +@MPI_TRUE@smallcheck: mpi-bench$(EXEEXT) +@MPI_TRUE@ $(MAKE) $(AM_MAKEFLAGS) NUMCHECK=2 check-local + +fftw3-mpi.f03: fftw3-mpi.f03.in Makefile + sed 's/C_MPI_FINT/@C_MPI_FINT@/' $(srcdir)/fftw3-mpi.f03.in > $@ + +fftw3l-mpi.f03: fftw3l-mpi.f03.in Makefile + sed 's/C_MPI_FINT/@C_MPI_FINT@/' $(srcdir)/fftw3l-mpi.f03.in > $@ + +@MAINTAINER_MODE_TRUE@fftw3-mpi.f03.in: fftw3-mpi.h f03api.sh $(top_srcdir)/api/genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh d f > $@ + +@MAINTAINER_MODE_TRUE@fftw3l-mpi.f03.in: fftw3-mpi.h f03api.sh $(top_srcdir)/api/genf03.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03api.sh l | grep -v parameter | sed 's/fftw3.f03/fftw3l.f03/' > $@ + +@MAINTAINER_MODE_TRUE@f03-wrap.c: fftw3-mpi.h f03-wrap.sh genf03-wrap.pl +@MAINTAINER_MODE_TRUE@ sh $(srcdir)/f03-wrap.sh > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/any-true.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/any-true.c new file mode 100644 index 000000000..8eb4cc4fd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/any-true.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* During planning, if any process fails to create a plan then + all of the processes must fail. This synchronization is implemented + by the following routine. + + Instead of + if (failure) goto nada; + we instead do: + if (any_true(failure, comm)) goto nada; +*/ + +int XM(any_true)(int condition, MPI_Comm comm) +{ + int result; + MPI_Allreduce(&condition, &result, 1, MPI_INT, MPI_LOR, comm); + return result; +} + +/***********************************************************************/ + +#if defined(FFTW_DEBUG) +/* for debugging, we include an assertion to make sure that + MPI problems all produce equal hashes, as checked by this routine: */ + +int XM(md5_equal)(md5 m, MPI_Comm comm) +{ + unsigned long s0[4]; + int i, eq_me, eq_all; + + X(md5end)(&m); + for (i = 0; i < 4; ++i) s0[i] = m.s[i]; + MPI_Bcast(s0, 4, MPI_UNSIGNED_LONG, 0, comm); + for (i = 0; i < 4 && s0[i] == m.s[i]; ++i) ; + eq_me = i == 4; + MPI_Allreduce(&eq_me, &eq_all, 1, MPI_INT, MPI_LAND, comm); + return eq_all; +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/api.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/api.c new file mode 100644 index 000000000..6a4f29eb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/api.c @@ -0,0 +1,907 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "fftw3-mpi.h" +#include "ifftw-mpi.h" +#include "mpi-transpose.h" +#include "mpi-dft.h" +#include "mpi-rdft.h" +#include "mpi-rdft2.h" + +/* Convert API flags to internal MPI flags. */ +#define MPI_FLAGS(f) ((f) >> 27) + +/*************************************************************************/ + +static int mpi_inited = 0; + +static MPI_Comm problem_comm(const problem *p) { + switch (p->adt->problem_kind) { + case PROBLEM_MPI_DFT: + return ((const problem_mpi_dft *) p)->comm; + case PROBLEM_MPI_RDFT: + return ((const problem_mpi_rdft *) p)->comm; + case PROBLEM_MPI_RDFT2: + return ((const problem_mpi_rdft2 *) p)->comm; + case PROBLEM_MPI_TRANSPOSE: + return ((const problem_mpi_transpose *) p)->comm; + default: + return MPI_COMM_NULL; + } +} + +/* used to synchronize cost measurements (timing or estimation) + across all processes for an MPI problem, which is critical to + ensure that all processes decide to use the same MPI plans + (whereas serial plans need not be syncronized). */ +static double cost_hook(const problem *p, double t, cost_kind k) +{ + MPI_Comm comm = problem_comm(p); + double tsum; + if (comm == MPI_COMM_NULL) return t; + MPI_Allreduce(&t, &tsum, 1, MPI_DOUBLE, + k == COST_SUM ? MPI_SUM : MPI_MAX, comm); + return tsum; +} + +/* Used to reject wisdom that is not in sync across all processes + for an MPI problem, which is critical to ensure that all processes + decide to use the same MPI plans. (Even though costs are synchronized, + above, out-of-sync wisdom may result from plans being produced + by communicators that do not span all processes, either from a + user-specified communicator or e.g. from transpose-recurse. */ +static int wisdom_ok_hook(const problem *p, flags_t flags) +{ + MPI_Comm comm = problem_comm(p); + int eq_me, eq_all; + /* unpack flags bitfield, since MPI communications may involve + byte-order changes and MPI cannot do this for bit fields */ +#if SIZEOF_UNSIGNED_INT >= 4 /* must be big enough to hold 20-bit fields */ + unsigned int f[5]; +#else + unsigned long f[5]; /* at least 32 bits as per C standard */ +#endif + + if (comm == MPI_COMM_NULL) return 1; /* non-MPI wisdom is always ok */ + + if (XM(any_true)(0, comm)) return 0; /* some process had nowisdom_hook */ + + /* otherwise, check that the flags and solver index are identical + on all processes in this problem's communicator. + + TO DO: possibly we can relax strict equality, but it is + critical to ensure that any flags which affect what plan is + created (and whether the solver is applicable) are the same, + e.g. DESTROY_INPUT, NO_UGLY, etcetera. (If the MPI algorithm + differs between processes, deadlocks/crashes generally result.) */ + f[0] = flags.l; + f[1] = flags.hash_info; + f[2] = flags.timelimit_impatience; + f[3] = flags.u; + f[4] = flags.slvndx; + MPI_Bcast(f, 5, + SIZEOF_UNSIGNED_INT >= 4 ? MPI_UNSIGNED : MPI_UNSIGNED_LONG, + 0, comm); + eq_me = f[0] == flags.l && f[1] == flags.hash_info + && f[2] == flags.timelimit_impatience + && f[3] == flags.u && f[4] == flags.slvndx; + MPI_Allreduce(&eq_me, &eq_all, 1, MPI_INT, MPI_LAND, comm); + return eq_all; +} + +/* This hook is called when wisdom is not found. The any_true here + matches up with the any_true in wisdom_ok_hook, in order to handle + the case where some processes had wisdom (and called wisdom_ok_hook) + and some processes didn't have wisdom (and called nowisdom_hook). */ +static void nowisdom_hook(const problem *p) +{ + MPI_Comm comm = problem_comm(p); + if (comm == MPI_COMM_NULL) return; /* nothing to do for non-MPI p */ + XM(any_true)(1, comm); /* signal nowisdom to any wisdom_ok_hook */ +} + +/* needed to synchronize planner bogosity flag, in case non-MPI problems + on a subset of processes encountered bogus wisdom */ +static wisdom_state_t bogosity_hook(wisdom_state_t state, const problem *p) +{ + MPI_Comm comm = problem_comm(p); + if (comm != MPI_COMM_NULL /* an MPI problem */ + && XM(any_true)(state == WISDOM_IS_BOGUS, comm)) /* bogus somewhere */ + return WISDOM_IS_BOGUS; + return state; +} + +void XM(init)(void) +{ + if (!mpi_inited) { + planner *plnr = X(the_planner)(); + plnr->cost_hook = cost_hook; + plnr->wisdom_ok_hook = wisdom_ok_hook; + plnr->nowisdom_hook = nowisdom_hook; + plnr->bogosity_hook = bogosity_hook; + XM(conf_standard)(plnr); + mpi_inited = 1; + } +} + +void XM(cleanup)(void) +{ + X(cleanup)(); + mpi_inited = 0; +} + +/*************************************************************************/ + +static dtensor *mkdtensor_api(int rnk, const XM(ddim) *dims0) +{ + dtensor *x = XM(mkdtensor)(rnk); + int i; + for (i = 0; i < rnk; ++i) { + x->dims[i].n = dims0[i].n; + x->dims[i].b[IB] = dims0[i].ib; + x->dims[i].b[OB] = dims0[i].ob; + } + return x; +} + +static dtensor *default_sz(int rnk, const XM(ddim) *dims0, int n_pes, + int rdft2) +{ + dtensor *sz = XM(mkdtensor)(rnk); + dtensor *sz0 = mkdtensor_api(rnk, dims0); + block_kind k; + int i; + + for (i = 0; i < rnk; ++i) + sz->dims[i].n = dims0[i].n; + + if (rdft2) sz->dims[rnk-1].n = dims0[rnk-1].n / 2 + 1; + + for (i = 0; i < rnk; ++i) { + sz->dims[i].b[IB] = dims0[i].ib ? dims0[i].ib : sz->dims[i].n; + sz->dims[i].b[OB] = dims0[i].ob ? dims0[i].ob : sz->dims[i].n; + } + + /* If we haven't used all of the processes yet, and some of the + block sizes weren't specified (i.e. 0), then set the + unspecified blocks so as to use as many processes as + possible with as few distributed dimensions as possible. */ + FORALL_BLOCK_KIND(k) { + INT nb = XM(num_blocks_total)(sz, k); + INT np = n_pes / nb; + for (i = 0; i < rnk && np > 1; ++i) + if (!sz0->dims[i].b[k]) { + sz->dims[i].b[k] = XM(default_block)(sz->dims[i].n, np); + nb *= XM(num_blocks)(sz->dims[i].n, sz->dims[i].b[k]); + np = n_pes / nb; + } + } + + if (rdft2) sz->dims[rnk-1].n = dims0[rnk-1].n; + + /* punt for 1d prime */ + if (rnk == 1 && X(is_prime)(sz->dims[0].n)) + sz->dims[0].b[IB] = sz->dims[0].b[OB] = sz->dims[0].n; + + XM(dtensor_destroy)(sz0); + sz0 = XM(dtensor_canonical)(sz, 0); + XM(dtensor_destroy)(sz); + return sz0; +} + +/* allocate simple local (serial) dims array corresponding to n[rnk] */ +static XM(ddim) *simple_dims(int rnk, const ptrdiff_t *n) +{ + XM(ddim) *dims = (XM(ddim) *) MALLOC(sizeof(XM(ddim)) * rnk, + TENSORS); + int i; + for (i = 0; i < rnk; ++i) + dims[i].n = dims[i].ib = dims[i].ob = n[i]; + return dims; +} + +/*************************************************************************/ + +static void local_size(int my_pe, const dtensor *sz, block_kind k, + ptrdiff_t *local_n, ptrdiff_t *local_start) +{ + int i; + if (my_pe >= XM(num_blocks_total)(sz, k)) + for (i = 0; i < sz->rnk; ++i) + local_n[i] = local_start[i] = 0; + else { + XM(block_coords)(sz, k, my_pe, local_start); + for (i = 0; i < sz->rnk; ++i) { + local_n[i] = XM(block)(sz->dims[i].n, sz->dims[i].b[k], + local_start[i]); + local_start[i] *= sz->dims[i].b[k]; + } + } +} + +static INT prod(int rnk, const ptrdiff_t *local_n) +{ + int i; + INT N = 1; + for (i = 0; i < rnk; ++i) N *= local_n[i]; + return N; +} + +ptrdiff_t XM(local_size_guru)(int rnk, const XM(ddim) *dims0, + ptrdiff_t howmany, MPI_Comm comm, + ptrdiff_t *local_n_in, + ptrdiff_t *local_start_in, + ptrdiff_t *local_n_out, + ptrdiff_t *local_start_out, + int sign, unsigned flags) +{ + INT N; + int my_pe, n_pes, i; + dtensor *sz; + + if (rnk == 0) + return howmany; + + MPI_Comm_rank(comm, &my_pe); + MPI_Comm_size(comm, &n_pes); + sz = default_sz(rnk, dims0, n_pes, 0); + + /* Now, we must figure out how much local space the user should + allocate (or at least an upper bound). This depends strongly + on the exact algorithms we employ...ugh! FIXME: get this info + from the solvers somehow? */ + N = 1; /* never return zero allocation size */ + if (rnk > 1 && XM(is_block1d)(sz, IB) && XM(is_block1d)(sz, OB)) { + INT Nafter; + ddim odims[2]; + + /* dft-rank-geq2-transposed */ + odims[0] = sz->dims[0]; odims[1] = sz->dims[1]; /* save */ + /* we may need extra space for transposed intermediate data */ + for (i = 0; i < 2; ++i) + if (XM(num_blocks)(sz->dims[i].n, sz->dims[i].b[IB]) == 1 && + XM(num_blocks)(sz->dims[i].n, sz->dims[i].b[OB]) == 1) { + sz->dims[i].b[IB] + = XM(default_block)(sz->dims[i].n, n_pes); + sz->dims[1-i].b[IB] = sz->dims[1-i].n; + local_size(my_pe, sz, IB, local_n_in, local_start_in); + N = X(imax)(N, prod(rnk, local_n_in)); + sz->dims[i] = odims[i]; + sz->dims[1-i] = odims[1-i]; + break; + } + + /* dft-rank-geq2 */ + Nafter = howmany; + for (i = 1; i < sz->rnk; ++i) Nafter *= sz->dims[i].n; + N = X(imax)(N, (sz->dims[0].n + * XM(block)(Nafter, XM(default_block)(Nafter, n_pes), + my_pe) + howmany - 1) / howmany); + + /* dft-rank-geq2 with dimensions swapped */ + Nafter = howmany * sz->dims[0].n; + for (i = 2; i < sz->rnk; ++i) Nafter *= sz->dims[i].n; + N = X(imax)(N, (sz->dims[1].n + * XM(block)(Nafter, XM(default_block)(Nafter, n_pes), + my_pe) + howmany - 1) / howmany); + } + else if (rnk == 1) { + if (howmany >= n_pes && !MPI_FLAGS(flags)) { /* dft-rank1-bigvec */ + ptrdiff_t n[2], start[2]; + dtensor *sz2 = XM(mkdtensor)(2); + sz2->dims[0] = sz->dims[0]; + sz2->dims[0].b[IB] = sz->dims[0].n; + sz2->dims[1].n = sz2->dims[1].b[OB] = howmany; + sz2->dims[1].b[IB] = XM(default_block)(howmany, n_pes); + local_size(my_pe, sz2, IB, n, start); + XM(dtensor_destroy)(sz2); + N = X(imax)(N, (prod(2, n) + howmany - 1) / howmany); + } + else { /* dft-rank1 */ + INT r, m, rblock[2], mblock[2]; + + /* Since the 1d transforms are so different, we require + the user to call local_size_1d for this case. Ugh. */ + CK(sign == FFTW_FORWARD || sign == FFTW_BACKWARD); + + if ((r = XM(choose_radix)(sz->dims[0], n_pes, flags, sign, + rblock, mblock))) { + m = sz->dims[0].n / r; + if (flags & FFTW_MPI_SCRAMBLED_IN) + sz->dims[0].b[IB] = rblock[IB] * m; + else { /* !SCRAMBLED_IN */ + sz->dims[0].b[IB] = r * mblock[IB]; + N = X(imax)(N, rblock[IB] * m); + } + if (flags & FFTW_MPI_SCRAMBLED_OUT) + sz->dims[0].b[OB] = r * mblock[OB]; + else { /* !SCRAMBLED_OUT */ + N = X(imax)(N, r * mblock[OB]); + sz->dims[0].b[OB] = rblock[OB] * m; + } + } + } + } + + local_size(my_pe, sz, IB, local_n_in, local_start_in); + local_size(my_pe, sz, OB, local_n_out, local_start_out); + + /* at least, make sure we have enough space to store input & output */ + N = X(imax)(N, X(imax)(prod(rnk, local_n_in), prod(rnk, local_n_out))); + + XM(dtensor_destroy)(sz); + return N * howmany; +} + +ptrdiff_t XM(local_size_many_transposed)(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t xblock, ptrdiff_t yblock, + MPI_Comm comm, + ptrdiff_t *local_nx, + ptrdiff_t *local_x_start, + ptrdiff_t *local_ny, + ptrdiff_t *local_y_start) +{ + ptrdiff_t N; + XM(ddim) *dims; + ptrdiff_t *local; + + if (rnk == 0) { + *local_nx = *local_ny = 1; + *local_x_start = *local_y_start = 0; + return howmany; + } + + dims = simple_dims(rnk, n); + local = (ptrdiff_t *) MALLOC(sizeof(ptrdiff_t) * rnk * 4, TENSORS); + + /* default 1d block distribution, with transposed output + if yblock < n[1] */ + dims[0].ib = xblock; + if (rnk > 1) { + if (yblock < n[1]) + dims[1].ob = yblock; + else + dims[0].ob = xblock; + } + else + dims[0].ob = xblock; /* FIXME: 1d not really supported here + since we don't have flags/sign */ + + N = XM(local_size_guru)(rnk, dims, howmany, comm, + local, local + rnk, + local + 2*rnk, local + 3*rnk, + 0, 0); + *local_nx = local[0]; + *local_x_start = local[rnk]; + if (rnk > 1) { + *local_ny = local[2*rnk + 1]; + *local_y_start = local[3*rnk + 1]; + } + else { + *local_ny = *local_nx; + *local_y_start = *local_x_start; + } + X(ifree)(local); + X(ifree)(dims); + return N; +} + +ptrdiff_t XM(local_size_many)(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t xblock, + MPI_Comm comm, + ptrdiff_t *local_nx, + ptrdiff_t *local_x_start) +{ + ptrdiff_t local_ny, local_y_start; + return XM(local_size_many_transposed)(rnk, n, howmany, + xblock, rnk > 1 + ? n[1] : FFTW_MPI_DEFAULT_BLOCK, + comm, + local_nx, local_x_start, + &local_ny, &local_y_start); +} + + +ptrdiff_t XM(local_size_transposed)(int rnk, const ptrdiff_t *n, + MPI_Comm comm, + ptrdiff_t *local_nx, + ptrdiff_t *local_x_start, + ptrdiff_t *local_ny, + ptrdiff_t *local_y_start) +{ + return XM(local_size_many_transposed)(rnk, n, 1, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + comm, + local_nx, local_x_start, + local_ny, local_y_start); +} + +ptrdiff_t XM(local_size)(int rnk, const ptrdiff_t *n, + MPI_Comm comm, + ptrdiff_t *local_nx, + ptrdiff_t *local_x_start) +{ + return XM(local_size_many)(rnk, n, 1, FFTW_MPI_DEFAULT_BLOCK, comm, + local_nx, local_x_start); +} + +ptrdiff_t XM(local_size_many_1d)(ptrdiff_t nx, ptrdiff_t howmany, + MPI_Comm comm, int sign, unsigned flags, + ptrdiff_t *local_nx, ptrdiff_t *local_x_start, + ptrdiff_t *local_ny, ptrdiff_t *local_y_start) +{ + XM(ddim) d; + d.n = nx; + d.ib = d.ob = FFTW_MPI_DEFAULT_BLOCK; + return XM(local_size_guru)(1, &d, howmany, comm, + local_nx, local_x_start, + local_ny, local_y_start, sign, flags); +} + +ptrdiff_t XM(local_size_1d)(ptrdiff_t nx, + MPI_Comm comm, int sign, unsigned flags, + ptrdiff_t *local_nx, ptrdiff_t *local_x_start, + ptrdiff_t *local_ny, ptrdiff_t *local_y_start) +{ + return XM(local_size_many_1d)(nx, 1, comm, sign, flags, + local_nx, local_x_start, + local_ny, local_y_start); +} + +ptrdiff_t XM(local_size_2d_transposed)(ptrdiff_t nx, ptrdiff_t ny, + MPI_Comm comm, + ptrdiff_t *local_nx, + ptrdiff_t *local_x_start, + ptrdiff_t *local_ny, + ptrdiff_t *local_y_start) +{ + ptrdiff_t n[2]; + n[0] = nx; n[1] = ny; + return XM(local_size_transposed)(2, n, comm, + local_nx, local_x_start, + local_ny, local_y_start); +} + +ptrdiff_t XM(local_size_2d)(ptrdiff_t nx, ptrdiff_t ny, MPI_Comm comm, + ptrdiff_t *local_nx, ptrdiff_t *local_x_start) +{ + ptrdiff_t n[2]; + n[0] = nx; n[1] = ny; + return XM(local_size)(2, n, comm, local_nx, local_x_start); +} + +ptrdiff_t XM(local_size_3d_transposed)(ptrdiff_t nx, ptrdiff_t ny, + ptrdiff_t nz, + MPI_Comm comm, + ptrdiff_t *local_nx, + ptrdiff_t *local_x_start, + ptrdiff_t *local_ny, + ptrdiff_t *local_y_start) +{ + ptrdiff_t n[3]; + n[0] = nx; n[1] = ny; n[2] = nz; + return XM(local_size_transposed)(3, n, comm, + local_nx, local_x_start, + local_ny, local_y_start); +} + +ptrdiff_t XM(local_size_3d)(ptrdiff_t nx, ptrdiff_t ny, ptrdiff_t nz, + MPI_Comm comm, + ptrdiff_t *local_nx, ptrdiff_t *local_x_start) +{ + ptrdiff_t n[3]; + n[0] = nx; n[1] = ny; n[2] = nz; + return XM(local_size)(3, n, comm, local_nx, local_x_start); +} + +/*************************************************************************/ +/* Transpose API */ + +X(plan) XM(plan_many_transpose)(ptrdiff_t nx, ptrdiff_t ny, + ptrdiff_t howmany, + ptrdiff_t xblock, ptrdiff_t yblock, + R *in, R *out, + MPI_Comm comm, unsigned flags) +{ + int n_pes; + XM(init)(); + + if (howmany < 0 || xblock < 0 || yblock < 0 || + nx <= 0 || ny <= 0) return 0; + + MPI_Comm_size(comm, &n_pes); + if (!xblock) xblock = XM(default_block)(nx, n_pes); + if (!yblock) yblock = XM(default_block)(ny, n_pes); + if (n_pes < XM(num_blocks)(nx, xblock) + || n_pes < XM(num_blocks)(ny, yblock)) + return 0; + + return + X(mkapiplan)(FFTW_FORWARD, flags, + XM(mkproblem_transpose)(nx, ny, howmany, + in, out, xblock, yblock, + comm, MPI_FLAGS(flags))); +} + +X(plan) XM(plan_transpose)(ptrdiff_t nx, ptrdiff_t ny, R *in, R *out, + MPI_Comm comm, unsigned flags) + +{ + return XM(plan_many_transpose)(nx, ny, 1, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + in, out, comm, flags); +} + +/*************************************************************************/ +/* Complex DFT API */ + +X(plan) XM(plan_guru_dft)(int rnk, const XM(ddim) *dims0, + ptrdiff_t howmany, + C *in, C *out, + MPI_Comm comm, int sign, unsigned flags) +{ + int n_pes, i; + dtensor *sz; + + XM(init)(); + + if (howmany < 0 || rnk < 1) return 0; + for (i = 0; i < rnk; ++i) + if (dims0[i].n < 1 || dims0[i].ib < 0 || dims0[i].ob < 0) + return 0; + + MPI_Comm_size(comm, &n_pes); + sz = default_sz(rnk, dims0, n_pes, 0); + + if (XM(num_blocks_total)(sz, IB) > n_pes + || XM(num_blocks_total)(sz, OB) > n_pes) { + XM(dtensor_destroy)(sz); + return 0; + } + + return + X(mkapiplan)(sign, flags, + XM(mkproblem_dft_d)(sz, howmany, + (R *) in, (R *) out, + comm, sign, + MPI_FLAGS(flags))); +} + +X(plan) XM(plan_many_dft)(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + C *in, C *out, + MPI_Comm comm, int sign, unsigned flags) +{ + XM(ddim) *dims = simple_dims(rnk, n); + X(plan) pln; + + if (rnk == 1) { + dims[0].ib = iblock; + dims[0].ob = oblock; + } + else if (rnk > 1) { + dims[0 != (flags & FFTW_MPI_TRANSPOSED_IN)].ib = iblock; + dims[0 != (flags & FFTW_MPI_TRANSPOSED_OUT)].ob = oblock; + } + + pln = XM(plan_guru_dft)(rnk,dims,howmany, in,out, comm, sign, flags); + X(ifree)(dims); + return pln; +} + +X(plan) XM(plan_dft)(int rnk, const ptrdiff_t *n, C *in, C *out, + MPI_Comm comm, int sign, unsigned flags) +{ + return XM(plan_many_dft)(rnk, n, 1, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + in, out, comm, sign, flags); +} + +X(plan) XM(plan_dft_1d)(ptrdiff_t nx, C *in, C *out, + MPI_Comm comm, int sign, unsigned flags) +{ + return XM(plan_dft)(1, &nx, in, out, comm, sign, flags); +} + +X(plan) XM(plan_dft_2d)(ptrdiff_t nx, ptrdiff_t ny, C *in, C *out, + MPI_Comm comm, int sign, unsigned flags) +{ + ptrdiff_t n[2]; + n[0] = nx; n[1] = ny; + return XM(plan_dft)(2, n, in, out, comm, sign, flags); +} + +X(plan) XM(plan_dft_3d)(ptrdiff_t nx, ptrdiff_t ny, ptrdiff_t nz, + C *in, C *out, + MPI_Comm comm, int sign, unsigned flags) +{ + ptrdiff_t n[3]; + n[0] = nx; n[1] = ny; n[2] = nz; + return XM(plan_dft)(3, n, in, out, comm, sign, flags); +} + +/*************************************************************************/ +/* R2R API */ + +X(plan) XM(plan_guru_r2r)(int rnk, const XM(ddim) *dims0, + ptrdiff_t howmany, + R *in, R *out, + MPI_Comm comm, const X(r2r_kind) *kind, + unsigned flags) +{ + int n_pes, i; + dtensor *sz; + rdft_kind *k; + X(plan) pln; + + XM(init)(); + + if (howmany < 0 || rnk < 1) return 0; + for (i = 0; i < rnk; ++i) + if (dims0[i].n < 1 || dims0[i].ib < 0 || dims0[i].ob < 0) + return 0; + + k = X(map_r2r_kind)(rnk, kind); + + MPI_Comm_size(comm, &n_pes); + sz = default_sz(rnk, dims0, n_pes, 0); + + if (XM(num_blocks_total)(sz, IB) > n_pes + || XM(num_blocks_total)(sz, OB) > n_pes) { + XM(dtensor_destroy)(sz); + return 0; + } + + pln = X(mkapiplan)(0, flags, + XM(mkproblem_rdft_d)(sz, howmany, + in, out, + comm, k, MPI_FLAGS(flags))); + X(ifree0)(k); + return pln; +} + +X(plan) XM(plan_many_r2r)(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + R *in, R *out, + MPI_Comm comm, const X(r2r_kind) *kind, + unsigned flags) +{ + XM(ddim) *dims = simple_dims(rnk, n); + X(plan) pln; + + if (rnk == 1) { + dims[0].ib = iblock; + dims[0].ob = oblock; + } + else if (rnk > 1) { + dims[0 != (flags & FFTW_MPI_TRANSPOSED_IN)].ib = iblock; + dims[0 != (flags & FFTW_MPI_TRANSPOSED_OUT)].ob = oblock; + } + + pln = XM(plan_guru_r2r)(rnk,dims,howmany, in,out, comm, kind, flags); + X(ifree)(dims); + return pln; +} + +X(plan) XM(plan_r2r)(int rnk, const ptrdiff_t *n, R *in, R *out, + MPI_Comm comm, + const X(r2r_kind) *kind, + unsigned flags) +{ + return XM(plan_many_r2r)(rnk, n, 1, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + in, out, comm, kind, flags); +} + +X(plan) XM(plan_r2r_2d)(ptrdiff_t nx, ptrdiff_t ny, R *in, R *out, + MPI_Comm comm, + X(r2r_kind) kindx, X(r2r_kind) kindy, + unsigned flags) +{ + ptrdiff_t n[2]; + X(r2r_kind) kind[2]; + n[0] = nx; n[1] = ny; + kind[0] = kindx; kind[1] = kindy; + return XM(plan_r2r)(2, n, in, out, comm, kind, flags); +} + +X(plan) XM(plan_r2r_3d)(ptrdiff_t nx, ptrdiff_t ny, ptrdiff_t nz, + R *in, R *out, + MPI_Comm comm, + X(r2r_kind) kindx, X(r2r_kind) kindy, + X(r2r_kind) kindz, + unsigned flags) +{ + ptrdiff_t n[3]; + X(r2r_kind) kind[3]; + n[0] = nx; n[1] = ny; n[2] = nz; + kind[0] = kindx; kind[1] = kindy; kind[2] = kindz; + return XM(plan_r2r)(3, n, in, out, comm, kind, flags); +} + +/*************************************************************************/ +/* R2C/C2R API */ + +static X(plan) plan_guru_rdft2(int rnk, const XM(ddim) *dims0, + ptrdiff_t howmany, + R *r, C *c, + MPI_Comm comm, rdft_kind kind, unsigned flags) +{ + int n_pes, i; + dtensor *sz; + R *cr = (R *) c; + + XM(init)(); + + if (howmany < 0 || rnk < 2) return 0; + for (i = 0; i < rnk; ++i) + if (dims0[i].n < 1 || dims0[i].ib < 0 || dims0[i].ob < 0) + return 0; + + MPI_Comm_size(comm, &n_pes); + sz = default_sz(rnk, dims0, n_pes, 1); + + sz->dims[rnk-1].n = dims0[rnk-1].n / 2 + 1; + if (XM(num_blocks_total)(sz, IB) > n_pes + || XM(num_blocks_total)(sz, OB) > n_pes) { + XM(dtensor_destroy)(sz); + return 0; + } + sz->dims[rnk-1].n = dims0[rnk-1].n; + + if (kind == R2HC) + return X(mkapiplan)(0, flags, + XM(mkproblem_rdft2_d)(sz, howmany, + r, cr, comm, R2HC, + MPI_FLAGS(flags))); + else + return X(mkapiplan)(0, flags, + XM(mkproblem_rdft2_d)(sz, howmany, + cr, r, comm, HC2R, + MPI_FLAGS(flags))); +} + +X(plan) XM(plan_many_dft_r2c)(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + R *in, C *out, + MPI_Comm comm, unsigned flags) +{ + XM(ddim) *dims = simple_dims(rnk, n); + X(plan) pln; + + if (rnk == 1) { + dims[0].ib = iblock; + dims[0].ob = oblock; + } + else if (rnk > 1) { + dims[0 != (flags & FFTW_MPI_TRANSPOSED_IN)].ib = iblock; + dims[0 != (flags & FFTW_MPI_TRANSPOSED_OUT)].ob = oblock; + } + + pln = plan_guru_rdft2(rnk,dims,howmany, in,out, comm, R2HC, flags); + X(ifree)(dims); + return pln; +} + +X(plan) XM(plan_many_dft_c2r)(int rnk, const ptrdiff_t *n, + ptrdiff_t howmany, + ptrdiff_t iblock, ptrdiff_t oblock, + C *in, R *out, + MPI_Comm comm, unsigned flags) +{ + XM(ddim) *dims = simple_dims(rnk, n); + X(plan) pln; + + if (rnk == 1) { + dims[0].ib = iblock; + dims[0].ob = oblock; + } + else if (rnk > 1) { + dims[0 != (flags & FFTW_MPI_TRANSPOSED_IN)].ib = iblock; + dims[0 != (flags & FFTW_MPI_TRANSPOSED_OUT)].ob = oblock; + } + + pln = plan_guru_rdft2(rnk,dims,howmany, out,in, comm, HC2R, flags); + X(ifree)(dims); + return pln; +} + +X(plan) XM(plan_dft_r2c)(int rnk, const ptrdiff_t *n, R *in, C *out, + MPI_Comm comm, unsigned flags) +{ + return XM(plan_many_dft_r2c)(rnk, n, 1, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + in, out, comm, flags); +} + +X(plan) XM(plan_dft_r2c_2d)(ptrdiff_t nx, ptrdiff_t ny, R *in, C *out, + MPI_Comm comm, unsigned flags) +{ + ptrdiff_t n[2]; + n[0] = nx; n[1] = ny; + return XM(plan_dft_r2c)(2, n, in, out, comm, flags); +} + +X(plan) XM(plan_dft_r2c_3d)(ptrdiff_t nx, ptrdiff_t ny, ptrdiff_t nz, + R *in, C *out, MPI_Comm comm, unsigned flags) +{ + ptrdiff_t n[3]; + n[0] = nx; n[1] = ny; n[2] = nz; + return XM(plan_dft_r2c)(3, n, in, out, comm, flags); +} + +X(plan) XM(plan_dft_c2r)(int rnk, const ptrdiff_t *n, C *in, R *out, + MPI_Comm comm, unsigned flags) +{ + return XM(plan_many_dft_c2r)(rnk, n, 1, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + in, out, comm, flags); +} + +X(plan) XM(plan_dft_c2r_2d)(ptrdiff_t nx, ptrdiff_t ny, C *in, R *out, + MPI_Comm comm, unsigned flags) +{ + ptrdiff_t n[2]; + n[0] = nx; n[1] = ny; + return XM(plan_dft_c2r)(2, n, in, out, comm, flags); +} + +X(plan) XM(plan_dft_c2r_3d)(ptrdiff_t nx, ptrdiff_t ny, ptrdiff_t nz, + C *in, R *out, MPI_Comm comm, unsigned flags) +{ + ptrdiff_t n[3]; + n[0] = nx; n[1] = ny; n[2] = nz; + return XM(plan_dft_c2r)(3, n, in, out, comm, flags); +} + +/*************************************************************************/ +/* New-array execute functions */ + +void XM(execute_dft)(const X(plan) p, C *in, C *out) { + /* internally, MPI plans are just rdft plans */ + X(execute_r2r)(p, (R*) in, (R*) out); +} + +void XM(execute_dft_r2c)(const X(plan) p, R *in, C *out) { + /* internally, MPI plans are just rdft plans */ + X(execute_r2r)(p, in, (R*) out); +} + +void XM(execute_dft_c2r)(const X(plan) p, C *in, R *out) { + /* internally, MPI plans are just rdft plans */ + X(execute_r2r)(p, (R*) in, out); +} + +void XM(execute_r2r)(const X(plan) p, R *in, R *out) { + /* internally, MPI plans are just rdft plans */ + X(execute_r2r)(p, in, out); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/block.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/block.c new file mode 100644 index 000000000..e249b0aee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/block.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +INT XM(num_blocks)(INT n, INT block) +{ + return (n + block - 1) / block; +} + +int XM(num_blocks_ok)(INT n, INT block, MPI_Comm comm) +{ + int n_pes; + MPI_Comm_size(comm, &n_pes); + return n_pes >= XM(num_blocks)(n, block); +} + +/* Pick a default block size for dividing a problem of size n among + n_pes processes. Divide as equally as possible, while minimizing + the maximum block size among the processes as well as the number of + processes with nonzero blocks. */ +INT XM(default_block)(INT n, int n_pes) +{ + return ((n + n_pes - 1) / n_pes); +} + +/* For a given block size and dimension n, compute the block size + on the given process. */ +INT XM(block)(INT n, INT block, int which_block) +{ + INT d = n - which_block * block; + return d <= 0 ? 0 : (d > block ? block : d); +} + +static INT num_blocks_kind(const ddim *dim, block_kind k) +{ + return XM(num_blocks)(dim->n, dim->b[k]); +} + +INT XM(num_blocks_total)(const dtensor *sz, block_kind k) +{ + if (FINITE_RNK(sz->rnk)) { + int i; + INT ntot = 1; + for (i = 0; i < sz->rnk; ++i) + ntot *= num_blocks_kind(sz->dims + i, k); + return ntot; + } + else + return 0; +} + +int XM(idle_process)(const dtensor *sz, block_kind k, int which_pe) +{ + return (which_pe >= XM(num_blocks_total)(sz, k)); +} + +/* Given a non-idle process which_pe, computes the coordinate + vector coords[rnk] giving the coordinates of a block in the + matrix of blocks. k specifies whether we are talking about + the input or output data distribution. */ +void XM(block_coords)(const dtensor *sz, block_kind k, int which_pe, + INT *coords) +{ + int i; + A(!XM(idle_process)(sz, k, which_pe) && FINITE_RNK(sz->rnk)); + for (i = sz->rnk - 1; i >= 0; --i) { + INT nb = num_blocks_kind(sz->dims + i, k); + coords[i] = which_pe % nb; + which_pe /= nb; + } +} + +INT XM(total_block)(const dtensor *sz, block_kind k, int which_pe) +{ + if (XM(idle_process)(sz, k, which_pe)) + return 0; + else { + int i; + INT N = 1, *coords; + STACK_MALLOC(INT*, coords, sizeof(INT) * sz->rnk); + XM(block_coords)(sz, k, which_pe, coords); + for (i = 0; i < sz->rnk; ++i) + N *= XM(block)(sz->dims[i].n, sz->dims[i].b[k], coords[i]); + STACK_FREE(coords); + return N; + } +} + +/* returns whether sz is local for dims >= dim */ +int XM(is_local_after)(int dim, const dtensor *sz, block_kind k) +{ + if (FINITE_RNK(sz->rnk)) + for (; dim < sz->rnk; ++dim) + if (XM(num_blocks)(sz->dims[dim].n, sz->dims[dim].b[k]) > 1) + return 0; + return 1; +} + +int XM(is_local)(const dtensor *sz, block_kind k) +{ + return XM(is_local_after)(0, sz, k); +} + +/* Return whether sz is distributed for k according to a simple + 1d block distribution in the first or second dimensions */ +int XM(is_block1d)(const dtensor *sz, block_kind k) +{ + int i; + if (!FINITE_RNK(sz->rnk)) return 0; + for (i = 0; i < sz->rnk && num_blocks_kind(sz->dims + i, k) == 1; ++i) ; + return(i < sz->rnk && i < 2 && XM(is_local_after)(i + 1, sz, k)); + +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/choose-radix.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/choose-radix.c new file mode 100644 index 000000000..e1575b501 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/choose-radix.c @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* Return the radix r for a 1d MPI transform of a distributed dimension d, + with the given flags and transform size. That is, decomposes d.n + as r * m, Cooley-Tukey style. Also computes the block sizes rblock + and mblock. Returns 0 if such a decomposition is not feasible. + This is unfortunately somewhat complicated. + + A distributed Cooley-Tukey algorithm works as follows (see dft-rank1.c): + + d.n is initially distributed as an m x r array with block size mblock[IB]. + Then it is internally transposed to an r x m array with block size + rblock[IB]. Then it is internally transposed to m x r again with block + size mblock[OB]. Finally, it is transposed to r x m with block size + rblock[IB]. + + If flags & SCRAMBLED_IN, then the first transpose is skipped (the array + starts out as r x m). If flags & SCRAMBLED_OUT, then the last transpose + is skipped (the array ends up as m x r). To make sure the forward + and backward transforms use the same "scrambling" format, we swap r + and m when sign != FFT_SIGN. + + There are some downsides to this, especially in the case where + either m or r is not divisible by n_pes. For one thing, it means + that in general we can't use the same block size for the input and + output. For another thing, it means that we can't in general honor + a user's "requested" block sizes in d.b[]. Therefore, for simplicity, + we simply ignore d.b[] for now. +*/ +INT XM(choose_radix)(ddim d, int n_pes, unsigned flags, int sign, + INT rblock[2], INT mblock[2]) +{ + INT r, m; + + UNUSED(flags); /* we would need this if we paid attention to d.b[*] */ + + /* If n_pes is a factor of d.n, then choose r to be d.n / n_pes. + This not only ensures that the input (the m dimension) is + equally distributed if possible, and at the r dimension is + maximally equally distributed (if d.n/n_pes >= n_pes), it also + makes one of the local transpositions in the algorithm + trivial. */ + if (d.n % n_pes == 0 /* it's good if n_pes divides d.n ...*/ + && d.n / n_pes >= n_pes /* .. unless we can't use n_pes processes */) + r = d.n / n_pes; + else { /* n_pes does not divide d.n, pick a factor close to sqrt(d.n) */ + for (r = X(isqrt)(d.n); d.n % r != 0; ++r) + ; + } + if (r == 1 || r == d.n) return 0; /* punt if we can't reduce size */ + + if (sign != FFT_SIGN) { /* swap {m,r} so that scrambling is reversible */ + m = r; + r = d.n / m; + } + else + m = d.n / r; + + rblock[IB] = rblock[OB] = XM(default_block)(r, n_pes); + mblock[IB] = mblock[OB] = XM(default_block)(m, n_pes); + + return r; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/conf.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/conf.c new file mode 100644 index 000000000..fdbc98747 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/conf.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "mpi-transpose.h" +#include "mpi-dft.h" +#include "mpi-rdft.h" +#include "mpi-rdft2.h" + +static const solvtab s = +{ + SOLVTAB(XM(transpose_pairwise_register)), + SOLVTAB(XM(transpose_alltoall_register)), + SOLVTAB(XM(transpose_recurse_register)), + SOLVTAB(XM(dft_rank_geq2_register)), + SOLVTAB(XM(dft_rank_geq2_transposed_register)), + SOLVTAB(XM(dft_serial_register)), + SOLVTAB(XM(dft_rank1_bigvec_register)), + SOLVTAB(XM(dft_rank1_register)), + SOLVTAB(XM(rdft_rank_geq2_register)), + SOLVTAB(XM(rdft_rank_geq2_transposed_register)), + SOLVTAB(XM(rdft_serial_register)), + SOLVTAB(XM(rdft_rank1_bigvec_register)), + SOLVTAB(XM(rdft2_rank_geq2_register)), + SOLVTAB(XM(rdft2_rank_geq2_transposed_register)), + SOLVTAB(XM(rdft2_serial_register)), + SOLVTAB_END +}; + +void XM(conf_standard)(planner *p) +{ + X(solvtab_exec)(s, p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-problem.c new file mode 100644 index 000000000..8c952a94e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-problem.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-dft.h" + +static void destroy(problem *ego_) +{ + problem_mpi_dft *ego = (problem_mpi_dft *) ego_; + XM(dtensor_destroy)(ego->sz); + MPI_Comm_free(&ego->comm); + X(ifree)(ego_); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + int i; + X(md5puts)(m, "mpi-dft"); + X(md5int)(m, p->I == p->O); + /* don't include alignment -- may differ between processes + X(md5int)(m, X(ialignment_of)(p->I)); + X(md5int)(m, X(ialignment_of)(p->O)); + ... note that applicability of MPI plans does not depend + on alignment (although optimality may, in principle). */ + XM(dtensor_md5)(m, p->sz); + X(md5INT)(m, p->vn); + X(md5int)(m, p->sign); + X(md5int)(m, p->flags); + MPI_Comm_size(p->comm, &i); X(md5int)(m, i); + A(XM(md5_equal)(*m, p->comm)); +} + +static void print(const problem *ego_, printer *p) +{ + const problem_mpi_dft *ego = (const problem_mpi_dft *) ego_; + int i; + p->print(p, "(mpi-dft %d %d %d ", + ego->I == ego->O, + X(ialignment_of)(ego->I), + X(ialignment_of)(ego->O)); + XM(dtensor_print)(ego->sz, p); + p->print(p, " %D %d %d", ego->vn, ego->sign, ego->flags); + MPI_Comm_size(ego->comm, &i); p->print(p, " %d)", i); +} + +static void zero(const problem *ego_) +{ + const problem_mpi_dft *ego = (const problem_mpi_dft *) ego_; + R *I = ego->I; + INT i, N; + int my_pe; + + MPI_Comm_rank(ego->comm, &my_pe); + N = 2 * ego->vn * XM(total_block)(ego->sz, IB, my_pe); + for (i = 0; i < N; ++i) I[i] = K(0.0); +} + +static const problem_adt padt = +{ + PROBLEM_MPI_DFT, + hash, + zero, + print, + destroy +}; + +problem *XM(mkproblem_dft)(const dtensor *sz, INT vn, + R *I, R *O, + MPI_Comm comm, + int sign, + unsigned flags) +{ + problem_mpi_dft *ego = + (problem_mpi_dft *)X(mkproblem)(sizeof(problem_mpi_dft), &padt); + int n_pes; + + A(XM(dtensor_validp)(sz) && FINITE_RNK(sz->rnk)); + MPI_Comm_size(comm, &n_pes); + A(n_pes >= XM(num_blocks_total)(sz, IB) + && n_pes >= XM(num_blocks_total)(sz, OB)); + A(vn >= 0); + A(sign == -1 || sign == 1); + + /* enforce pointer equality if untainted pointers are equal */ + if (UNTAINT(I) == UNTAINT(O)) + I = O = JOIN_TAINT(I, O); + + ego->sz = XM(dtensor_canonical)(sz, 1); + ego->vn = vn; + ego->I = I; + ego->O = O; + ego->sign = sign; + + /* canonicalize: replace TRANSPOSED_IN with TRANSPOSED_OUT by + swapping the first two dimensions (for rnk > 1) */ + if ((flags & TRANSPOSED_IN) && ego->sz->rnk > 1) { + ddim dim0 = ego->sz->dims[0]; + ego->sz->dims[0] = ego->sz->dims[1]; + ego->sz->dims[1] = dim0; + flags &= ~TRANSPOSED_IN; + flags ^= TRANSPOSED_OUT; + } + ego->flags = flags; + + MPI_Comm_dup(comm, &ego->comm); + + return &(ego->super); +} + +problem *XM(mkproblem_dft_d)(dtensor *sz, INT vn, + R *I, R *O, + MPI_Comm comm, + int sign, + unsigned flags) +{ + problem *p = XM(mkproblem_dft)(sz, vn, I, O, comm, sign, flags); + XM(dtensor_destroy)(sz); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank-geq2-transposed.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank-geq2-transposed.c new file mode 100644 index 000000000..e6d8ee0aa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank-geq2-transposed.c @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex DFTs of rank >= 2, for the case where we are distributed + across the first dimension only, and the output is transposed both + in data distribution and in ordering (for the first 2 dimensions). + + (Note that we don't have to handle the case where the input is + transposed, since this is equivalent to transposed output with the + first two dimensions swapped, and is automatically canonicalized as + such by dft-problem.c. */ + +#include "mpi-dft.h" +#include "mpi-transpose.h" +#include "dft/dft.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_dft super; + + plan *cld1, *cldt, *cld2; + INT roff, ioff; + int preserve_input; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_dft *cld1, *cld2; + plan_rdft *cldt; + INT roff = ego->roff, ioff = ego->ioff; + + /* DFT local dimensions */ + cld1 = (plan_dft *) ego->cld1; + if (ego->preserve_input) { + cld1->apply(ego->cld1, I+roff, I+ioff, O+roff, O+ioff); + I = O; + } + else + cld1->apply(ego->cld1, I+roff, I+ioff, I+roff, I+ioff); + + /* global transpose */ + cldt = (plan_rdft *) ego->cldt; + cldt->apply(ego->cldt, I, O); + + /* DFT final local dimension */ + cld2 = (plan_dft *) ego->cld2; + cld2->apply(ego->cld2, O+roff, O+ioff, O+roff, O+ioff); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + return (1 + && p->sz->rnk > 1 + && p->flags == TRANSPOSED_OUT + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && XM(is_local_after)(1, p->sz, IB) + && XM(is_local_after)(2, p->sz, OB) + && XM(num_blocks)(p->sz->dims[0].n, p->sz->dims[0].b[OB]) == 1 + && (!NO_SLOWP(plnr) /* slow if dft-serial is applicable */ + || !XM(dft_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cldt, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cldt); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-dft-rank-geq2-transposed%s%(%p%)%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", + ego->cld1, ego->cldt, ego->cld2); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_dft *p; + P *pln; + plan *cld1 = 0, *cldt = 0, *cld2 = 0; + R *ri, *ii, *ro, *io, *I, *O; + tensor *sz; + int i, my_pe, n_pes; + INT nrest; + static const plan_adt padt = { + XM(dft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_dft *) p_; + + X(extract_reim)(p->sign, I = p->I, &ri, &ii); + X(extract_reim)(p->sign, O = p->O, &ro, &io); + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) + I = O; + else { + ro = ri; + io = ii; + } + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + sz = X(mktensor)(p->sz->rnk - 1); /* tensor of last rnk-1 dimensions */ + i = p->sz->rnk - 2; A(i >= 0); + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = 2 * p->vn; + for (--i; i >= 0; --i) { + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = sz->dims[i+1].n * sz->dims[i+1].is; + } + nrest = 1; for (i = 1; i < sz->rnk; ++i) nrest *= sz->dims[i].n; + { + INT is = sz->dims[0].n * sz->dims[0].is; + INT b = XM(block)(p->sz->dims[0].n, p->sz->dims[0].b[IB], my_pe); + cld1 = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(sz, + X(mktensor_2d)(b, is, is, + p->vn, 2, 2), + ri, ii, ro, io)); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + nrest *= p->vn; + cldt = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + p->sz->dims[0].n, p->sz->dims[1].n, nrest * 2, + I, O, + p->sz->dims[0].b[IB], p->sz->dims[1].b[OB], + p->comm, 0)); + if (XM(any_true)(!cldt, p->comm)) goto nada; + + X(extract_reim)(p->sign, O, &ro, &io); + { + INT is = p->sz->dims[0].n * nrest * 2; + INT b = XM(block)(p->sz->dims[1].n, p->sz->dims[1].b[OB], my_pe); + cld2 = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)( + p->sz->dims[0].n, + nrest * 2, nrest * 2), + X(mktensor_2d)(b, is, is, + nrest, 2, 2), + ro, io, ro, io)); + if (XM(any_true)(!cld2, p->comm)) goto nada; + } + + pln = MKPLAN_MPI_DFT(P, &padt, apply); + pln->cld1 = cld1; + pln->cldt = cldt; + pln->cld2 = cld2; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->roff = ri - p->I; + pln->ioff = ii - p->I; + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + X(ops_add2)(&cldt->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cldt); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(dft_rank_geq2_transposed_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank-geq2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank-geq2.c new file mode 100644 index 000000000..3e17f46ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank-geq2.c @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex DFTs of rank >= 2, for the case where we are distributed + across the first dimension only, and the output is not transposed. */ + +#include "mpi-dft.h" +#include "dft/dft.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_dft super; + + plan *cld1, *cld2; + INT roff, ioff; + int preserve_input; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_dft *cld1; + plan_rdft *cld2; + INT roff = ego->roff, ioff = ego->ioff; + + /* DFT local dimensions */ + cld1 = (plan_dft *) ego->cld1; + if (ego->preserve_input) { + cld1->apply(ego->cld1, I+roff, I+ioff, O+roff, O+ioff); + I = O; + } + else + cld1->apply(ego->cld1, I+roff, I+ioff, I+roff, I+ioff); + + /* DFT non-local dimension (via dft-rank1-bigvec, usually): */ + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, I, O); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + return (1 + && p->sz->rnk > 1 + && p->flags == 0 /* TRANSPOSED/SCRAMBLED_IN/OUT not supported */ + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && XM(is_local_after)(1, p->sz, IB) + && XM(is_local_after)(1, p->sz, OB) + && (!NO_SLOWP(plnr) /* slow if dft-serial is applicable */ + || !XM(dft_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-dft-rank-geq2%s%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", ego->cld1, ego->cld2); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_dft *p; + P *pln; + plan *cld1 = 0, *cld2 = 0; + R *ri, *ii, *ro, *io, *I, *O; + tensor *sz; + dtensor *sz2; + int i, my_pe, n_pes; + INT nrest; + static const plan_adt padt = { + XM(dft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_dft *) p_; + + X(extract_reim)(p->sign, I = p->I, &ri, &ii); + X(extract_reim)(p->sign, O = p->O, &ro, &io); + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) + I = O; + else { + ro = ri; + io = ii; + } + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + sz = X(mktensor)(p->sz->rnk - 1); /* tensor of last rnk-1 dimensions */ + i = p->sz->rnk - 2; A(i >= 0); + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = 2 * p->vn; + for (--i; i >= 0; --i) { + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = sz->dims[i+1].n * sz->dims[i+1].is; + } + nrest = X(tensor_sz)(sz); + { + INT is = sz->dims[0].n * sz->dims[0].is; + INT b = XM(block)(p->sz->dims[0].n, p->sz->dims[0].b[IB], my_pe); + cld1 = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(sz, + X(mktensor_2d)(b, is, is, + p->vn, 2, 2), + ri, ii, ro, io)); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + sz2 = XM(mkdtensor)(1); /* tensor for first (distributed) dimension */ + sz2->dims[0] = p->sz->dims[0]; + cld2 = X(mkplan_d)(plnr, XM(mkproblem_dft_d)(sz2, nrest * p->vn, + I, O, p->comm, p->sign, + RANK1_BIGVEC_ONLY)); + if (XM(any_true)(!cld2, p->comm)) goto nada; + + pln = MKPLAN_MPI_DFT(P, &padt, apply); + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->roff = ri - p->I; + pln->ioff = ii - p->I; + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(dft_rank_geq2_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank1-bigvec.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank1-bigvec.c new file mode 100644 index 000000000..cf55e54a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank1-bigvec.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex DFTs of rank == 1 when the vector length vn is >= # processes. + In this case, we don't need to use a six-step type algorithm, and can + instead transpose the DFT dimension with the vector dimension to + make the DFT local. */ + +#include "mpi-dft.h" +#include "mpi-transpose.h" +#include "dft/dft.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ + rearrangement rearrange; +} S; + +typedef struct { + plan_mpi_dft super; + + plan *cldt_before, *cld, *cldt_after; + INT roff, ioff; + int preserve_input; + rearrangement rearrange; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + plan_rdft *cldt_before, *cldt_after; + INT roff = ego->roff, ioff = ego->ioff; + + /* global transpose */ + cldt_before = (plan_rdft *) ego->cldt_before; + cldt_before->apply(ego->cldt_before, I, O); + + if (ego->preserve_input) I = O; + + /* 1d DFT(s) */ + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, O+roff, O+ioff, I+roff, I+ioff); + + /* global transpose */ + cldt_after = (plan_rdft *) ego->cldt_after; + cldt_after->apply(ego->cldt_after, I, O); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + int n_pes; + MPI_Comm_size(p->comm, &n_pes); + return (1 + && p->sz->rnk == 1 + && !(p->flags & ~RANK1_BIGVEC_ONLY) + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && (p->vn >= n_pes /* TODO: relax this, using more memory? */ + || (p->flags & RANK1_BIGVEC_ONLY)) + + && XM(rearrange_applicable)(ego->rearrange, + p->sz->dims[0], p->vn, n_pes) + + && (!NO_SLOWP(plnr) /* slow if dft-serial is applicable */ + || !XM(dft_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldt_before, wakefulness); + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldt_after, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldt_after); + X(plan_destroy_internal)(ego->cld); + X(plan_destroy_internal)(ego->cldt_before); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const char descrip[][16] = { "contig", "discontig", "square-after", + "square-middle", "square-before" }; + p->print(p, "(mpi-dft-rank1-bigvec/%s%s %(%p%) %(%p%) %(%p%))", + descrip[ego->rearrange], ego->preserve_input==2 ?"/p":"", + ego->cldt_before, ego->cld, ego->cldt_after); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_dft *p; + P *pln; + plan *cld = 0, *cldt_before = 0, *cldt_after = 0; + R *ri, *ii, *ro, *io, *I, *O; + INT yblock, yb, nx, ny, vn; + int my_pe, n_pes; + static const plan_adt padt = { + XM(dft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_dft *) p_; + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + nx = p->sz->dims[0].n; + if (!(ny = XM(rearrange_ny)(ego->rearrange, p->sz->dims[0],p->vn,n_pes))) + return (plan *) 0; + vn = p->vn / ny; + A(ny * vn == p->vn); + + yblock = XM(default_block)(ny, n_pes); + cldt_before = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + nx, ny, vn*2, + I = p->I, O = p->O, + p->sz->dims[0].b[IB], yblock, + p->comm, 0)); + if (XM(any_true)(!cldt_before, p->comm)) goto nada; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) { I = O; } + + X(extract_reim)(p->sign, I, &ri, &ii); + X(extract_reim)(p->sign, O, &ro, &io); + + yb = XM(block)(ny, yblock, my_pe); + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)(nx, vn*2, vn*2), + X(mktensor_2d)(yb, vn*2*nx, vn*2*nx, + vn, 2, 2), + ro, io, ri, ii)); + if (XM(any_true)(!cld, p->comm)) goto nada; + + cldt_after = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + ny, nx, vn*2, + I, O, + yblock, p->sz->dims[0].b[OB], + p->comm, 0)); + if (XM(any_true)(!cldt_after, p->comm)) goto nada; + + pln = MKPLAN_MPI_DFT(P, &padt, apply); + + pln->cldt_before = cldt_before; + pln->cld = cld; + pln->cldt_after = cldt_after; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->roff = ro - p->O; + pln->ioff = io - p->O; + pln->rearrange = ego->rearrange; + + X(ops_add)(&cldt_before->ops, &cld->ops, &pln->super.super.ops); + X(ops_add2)(&cldt_after->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldt_after); + X(plan_destroy_internal)(cld); + X(plan_destroy_internal)(cldt_before); + return (plan *) 0; +} + +static solver *mksolver(rearrangement rearrange, int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->rearrange = rearrange; + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(dft_rank1_bigvec_register)(planner *p) +{ + rearrangement rearrange; + int preserve_input; + FORALL_REARRANGE(rearrange) + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(rearrange, preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank1.c new file mode 100644 index 000000000..d2028897f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-rank1.c @@ -0,0 +1,352 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex DFTs of rank == 1 via six-step algorithm. */ + +#include "mpi-dft.h" +#include "mpi-transpose.h" +#include "dft/dft.h" + +typedef struct { + solver super; + rdftapply apply; /* apply_ddft_first or apply_ddft_last */ + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_dft super; + + triggen *t; + plan *cldt, *cld_ddft, *cld_dft; + INT roff, ioff; + int preserve_input; + INT vn, xmin, xmax, xs, m, r; +} P; + +static void do_twiddle(triggen *t, INT ir, INT m, INT vn, R *xr, R *xi) +{ + void (*rotate)(triggen *, INT, R, R, R *) = t->rotate; + INT im, iv; + for (im = 0; im < m; ++im) + for (iv = 0; iv < vn; ++iv) { + /* TODO: modify/inline rotate function + so that it can do whole vn vector at once? */ + R c[2]; + rotate(t, ir * im, *xr, *xi, c); + *xr = c[0]; *xi = c[1]; + xr += 2; xi += 2; + } +} + +/* radix-r DFT of size r*m. This is equivalent to an m x r 2d DFT, + plus twiddle factors between the size-m and size-r 1d DFTs, where + the m dimension is initially distributed. The output is transposed + to r x m where the r dimension is distributed. + + This algorithm follows the general sequence: + global transpose (m x r -> r x m) + DFTs of size m + multiply by twiddles + global transpose (r x m -> m x r) + DFTs of size r + global transpose (m x r -> r x m) + where the multiplication by twiddles can come before or after + the middle transpose. The first/last transposes are omitted + for SCRAMBLED_IN/OUT formats, respectively. + + However, we wish to exploit our dft-rank1-bigvec solver, which + solves a vector of distributed DFTs via transpose+dft+transpose. + Therefore, we can group *either* the DFTs of size m *or* the + DFTs of size r with their surrounding transposes as a single + distributed-DFT (ddft) plan. These two variations correspond to + apply_ddft_first or apply_ddft_last, respectively. +*/ + +static void apply_ddft_first(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_dft *cld_dft; + plan_rdft *cldt, *cld_ddft; + INT roff, ioff, im, mmax, ms, r, vn; + triggen *t; + R *dI, *dO; + + /* distributed size-m DFTs, with output in m x r format */ + cld_ddft = (plan_rdft *) ego->cld_ddft; + cld_ddft->apply(ego->cld_ddft, I, O); + + cldt = (plan_rdft *) ego->cldt; + if (ego->preserve_input || !cldt) I = O; + + /* twiddle multiplications, followed by 1d DFTs of size-r */ + cld_dft = (plan_dft *) ego->cld_dft; + roff = ego->roff; ioff = ego->ioff; + mmax = ego->xmax; ms = ego->xs; + t = ego->t; r = ego->r; vn = ego->vn; + dI = O; dO = I; + for (im = ego->xmin; im <= mmax; ++im) { + do_twiddle(t, im, r, vn, dI+roff, dI+ioff); + cld_dft->apply((plan *) cld_dft, dI+roff, dI+ioff, dO+roff, dO+ioff); + dI += ms; dO += ms; + } + + /* final global transpose (m x r -> r x m), if not SCRAMBLED_OUT */ + if (cldt) + cldt->apply((plan *) cldt, I, O); +} + +static void apply_ddft_last(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_dft *cld_dft; + plan_rdft *cldt, *cld_ddft; + INT roff, ioff, ir, rmax, rs, m, vn; + triggen *t; + R *dI, *dO0, *dO; + + /* initial global transpose (m x r -> r x m), if not SCRAMBLED_IN */ + cldt = (plan_rdft *) ego->cldt; + if (cldt) { + cldt->apply((plan *) cldt, I, O); + dI = O; + } + else + dI = I; + if (ego->preserve_input) dO = O; else dO = I; + dO0 = dO; + + /* 1d DFTs of size m, followed by twiddle multiplications */ + cld_dft = (plan_dft *) ego->cld_dft; + roff = ego->roff; ioff = ego->ioff; + rmax = ego->xmax; rs = ego->xs; + t = ego->t; m = ego->m; vn = ego->vn; + for (ir = ego->xmin; ir <= rmax; ++ir) { + cld_dft->apply((plan *) cld_dft, dI+roff, dI+ioff, dO+roff, dO+ioff); + do_twiddle(t, ir, m, vn, dO+roff, dO+ioff); + dI += rs; dO += rs; + } + + /* distributed size-r DFTs, with output in r x m format */ + cld_ddft = (plan_rdft *) ego->cld_ddft; + cld_ddft->apply(ego->cld_ddft, dO0, O); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr, + INT *r, INT rblock[2], INT mblock[2]) +{ + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + int n_pes; + MPI_Comm_size(p->comm, &n_pes); + return (1 + && p->sz->rnk == 1 + + && ONLY_SCRAMBLEDP(p->flags) + + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + + && (!(p->flags & SCRAMBLED_IN) || ego->apply == apply_ddft_last) + && (!(p->flags & SCRAMBLED_OUT) || ego->apply == apply_ddft_first) + + && (!NO_SLOWP(plnr) /* slow if dft-serial is applicable */ + || !XM(dft_serial_applicable)(p)) + + /* disallow if dft-rank1-bigvec is applicable since the + data distribution may be slightly different (ugh!) */ + && (p->vn < n_pes || p->flags) + + && (*r = XM(choose_radix)(p->sz->dims[0], n_pes, + p->flags, p->sign, + rblock, mblock)) + + /* ddft_first or last has substantial advantages in the + bigvec transpositions for the common case where + n_pes == n/r or r, respectively */ + && (!NO_UGLYP(plnr) + || !(*r == n_pes && ego->apply == apply_ddft_first) + || !(p->sz->dims[0].n / *r == n_pes + && ego->apply == apply_ddft_last)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldt, wakefulness); + X(plan_awake)(ego->cld_dft, wakefulness); + X(plan_awake)(ego->cld_ddft, wakefulness); + + switch (wakefulness) { + case SLEEPY: + X(triggen_destroy)(ego->t); ego->t = 0; + break; + default: + ego->t = X(mktriggen)(AWAKE_SQRTN_TABLE, ego->r * ego->m); + break; + } +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldt); + X(plan_destroy_internal)(ego->cld_dft); + X(plan_destroy_internal)(ego->cld_ddft); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-dft-rank1/%D%s%s%(%p%)%(%p%)%(%p%))", + ego->r, + ego->super.apply == apply_ddft_first ? "/first" : "/last", + ego->preserve_input==2 ?"/p":"", + ego->cld_ddft, ego->cld_dft, ego->cldt); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_dft *p; + P *pln; + plan *cld_dft = 0, *cld_ddft = 0, *cldt = 0; + R *ri, *ii, *ro, *io, *I, *O; + INT r, rblock[2], m, mblock[2], rp, mp, mpblock[2], mpb; + int my_pe, n_pes, preserve_input, ddft_first; + dtensor *sz; + static const plan_adt padt = { + XM(dft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr, &r, rblock, mblock)) + return (plan *) 0; + + p = (const problem_mpi_dft *) p_; + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + m = p->sz->dims[0].n / r; + + /* some hackery so that we can plan both ddft_first and ddft_last + as if they were ddft_first */ + if ((ddft_first = (ego->apply == apply_ddft_first))) { + rp = r; mp = m; + mpblock[IB] = mblock[IB]; mpblock[OB] = mblock[OB]; + mpb = XM(block)(mp, mpblock[OB], my_pe); + } + else { + rp = m; mp = r; + mpblock[IB] = rblock[IB]; mpblock[OB] = rblock[OB]; + mpb = XM(block)(mp, mpblock[IB], my_pe); + } + + preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + + sz = XM(mkdtensor)(1); + sz->dims[0].n = mp; + sz->dims[0].b[IB] = mpblock[IB]; + sz->dims[0].b[OB] = mpblock[OB]; + I = (ddft_first || !preserve_input) ? p->I : p->O; + O = p->O; + cld_ddft = X(mkplan_d)(plnr, XM(mkproblem_dft_d)(sz, rp * p->vn, + I, O, p->comm, p->sign, + RANK1_BIGVEC_ONLY)); + if (XM(any_true)(!cld_ddft, p->comm)) goto nada; + + I = TAINT((ddft_first || !p->flags) ? p->O : p->I, rp * p->vn * 2); + O = TAINT((preserve_input || (ddft_first && p->flags)) ? p->O : p->I, + rp * p->vn * 2); + X(extract_reim)(p->sign, I, &ri, &ii); + X(extract_reim)(p->sign, O, &ro, &io); + cld_dft = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)(rp, p->vn*2,p->vn*2), + X(mktensor_1d)(p->vn, 2, 2), + ri, ii, ro, io)); + if (XM(any_true)(!cld_dft, p->comm)) goto nada; + + if (!p->flags) { /* !(SCRAMBLED_IN or SCRAMBLED_OUT) */ + I = (ddft_first && preserve_input) ? p->O : p->I; + O = p->O; + cldt = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + m, r, p->vn * 2, + I, O, + ddft_first ? mblock[OB] : mblock[IB], + ddft_first ? rblock[OB] : rblock[IB], + p->comm, 0)); + if (XM(any_true)(!cldt, p->comm)) goto nada; + } + + pln = MKPLAN_MPI_DFT(P, &padt, ego->apply); + + pln->cld_ddft = cld_ddft; + pln->cld_dft = cld_dft; + pln->cldt = cldt; + pln->preserve_input = preserve_input; + X(extract_reim)(p->sign, p->O, &ro, &io); + pln->roff = ro - p->O; + pln->ioff = io - p->O; + pln->vn = p->vn; + pln->m = m; + pln->r = r; + pln->xmin = (ddft_first ? mblock[OB] : rblock[IB]) * my_pe; + pln->xmax = pln->xmin + mpb - 1; + pln->xs = rp * p->vn * 2; + pln->t = 0; + + X(ops_add)(&cld_ddft->ops, &cld_dft->ops, &pln->super.super.ops); + if (cldt) X(ops_add2)(&cldt->ops, &pln->super.super.ops); + { + double n0 = (1 + pln->xmax - pln->xmin) * (mp - 1) * pln->vn; + pln->super.super.ops.mul += 8 * n0; + pln->super.super.ops.add += 4 * n0; + pln->super.super.ops.other += 8 * n0; + } + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldt); + X(plan_destroy_internal)(cld_dft); + X(plan_destroy_internal)(cld_ddft); + return (plan *) 0; +} + +static solver *mksolver(rdftapply apply, int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->apply = apply; + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(dft_rank1_register)(planner *p) +{ + rdftapply apply[] = { apply_ddft_first, apply_ddft_last }; + unsigned int iapply; + int preserve_input; + for (iapply = 0; iapply < sizeof(apply) / sizeof(apply[0]); ++iapply) + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(apply[iapply], preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-serial.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-serial.c new file mode 100644 index 000000000..d112f9c73 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-serial.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* "MPI" DFTs where all of the data is on one processor...just + call through to serial API. */ + +#include "mpi-dft.h" +#include "dft/dft.h" + +typedef struct { + plan_mpi_dft super; + plan *cld; + INT roff, ioff; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + INT roff = ego->roff, ioff = ego->ioff; + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, I+roff, I+ioff, O+roff, O+ioff); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-dft-serial %(%p%))", ego->cld); +} + +int XM(dft_serial_applicable)(const problem_mpi_dft *p) +{ + return (1 + && p->flags == 0 /* TRANSPOSED/SCRAMBLED_IN/OUT not supported */ + && ((XM(is_local)(p->sz, IB) && XM(is_local)(p->sz, OB)) + || p->vn == 0)); +} + +static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) +{ + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + P *pln; + plan *cld; + int my_pe; + R *ri, *ii, *ro, *io; + static const plan_adt padt = { + XM(dft_solve), awake, print, destroy + }; + + UNUSED(ego); + + /* check whether applicable: */ + if (!XM(dft_serial_applicable)(p)) + return (plan *) 0; + + X(extract_reim)(p->sign, p->I, &ri, &ii); + X(extract_reim)(p->sign, p->O, &ro, &io); + + MPI_Comm_rank(p->comm, &my_pe); + if (my_pe == 0 && p->vn > 0) { + int i, rnk = p->sz->rnk; + tensor *sz = X(mktensor)(p->sz->rnk); + sz->dims[rnk - 1].is = sz->dims[rnk - 1].os = 2 * p->vn; + sz->dims[rnk - 1].n = p->sz->dims[rnk - 1].n; + for (i = rnk - 1; i > 0; --i) { + sz->dims[i - 1].is = sz->dims[i - 1].os = + sz->dims[i].is * sz->dims[i].n; + sz->dims[i - 1].n = p->sz->dims[i - 1].n; + } + + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(sz, + X(mktensor_1d)(p->vn, 2, 2), + ri, ii, ro, io)); + } + else { /* idle process: make nop plan */ + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_0d)(), + X(mktensor_1d)(0,0,0), + ri, ii, ro, io)); + } + if (XM(any_true)(!cld, p->comm)) return (plan *) 0; + + pln = MKPLAN_MPI_DFT(P, &padt, apply); + pln->cld = cld; + pln->roff = ro - p->O; + pln->ioff = io - p->O; + X(ops_cpy)(&cld->ops, &pln->super.super.ops); + return &(pln->super.super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_MPI_DFT, mkplan, 0 }; + return MKSOLVER(solver, &sadt); +} + +void XM(dft_serial_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-solve.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-solve.c new file mode 100644 index 000000000..ea9a6d211 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dft-solve.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-dft.h" + +/* use the apply() operation for MPI_DFT problems */ +void XM(dft_solve)(const plan *ego_, const problem *p_) +{ + const plan_mpi_dft *ego = (const plan_mpi_dft *) ego_; + const problem_mpi_dft *p = (const problem_mpi_dft *) p_; + ego->apply(ego_, UNTAINT(p->I), UNTAINT(p->O)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dtensor.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dtensor.c new file mode 100644 index 000000000..e26112deb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/dtensor.c @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +dtensor *XM(mkdtensor)(int rnk) +{ + dtensor *x; + + A(rnk >= 0); + +#if defined(STRUCT_HACK_KR) + if (FINITE_RNK(rnk) && rnk > 1) + x = (dtensor *)MALLOC(sizeof(dtensor) + (rnk - 1) * sizeof(ddim), + TENSORS); + else + x = (dtensor *)MALLOC(sizeof(dtensor), TENSORS); +#elif defined(STRUCT_HACK_C99) + if (FINITE_RNK(rnk)) + x = (dtensor *)MALLOC(sizeof(dtensor) + rnk * sizeof(ddim), + TENSORS); + else + x = (dtensor *)MALLOC(sizeof(dtensor), TENSORS); +#else + x = (dtensor *)MALLOC(sizeof(dtensor), TENSORS); + if (FINITE_RNK(rnk) && rnk > 0) + x->dims = (ddim *)MALLOC(sizeof(ddim) * rnk, TENSORS); + else + x->dims = 0; +#endif + + x->rnk = rnk; + return x; +} + +void XM(dtensor_destroy)(dtensor *sz) +{ +#if !defined(STRUCT_HACK_C99) && !defined(STRUCT_HACK_KR) + X(ifree0)(sz->dims); +#endif + X(ifree)(sz); +} + +void XM(dtensor_md5)(md5 *p, const dtensor *t) +{ + int i; + X(md5int)(p, t->rnk); + if (FINITE_RNK(t->rnk)) { + for (i = 0; i < t->rnk; ++i) { + const ddim *q = t->dims + i; + X(md5INT)(p, q->n); + X(md5INT)(p, q->b[IB]); + X(md5INT)(p, q->b[OB]); + } + } +} + +dtensor *XM(dtensor_copy)(const dtensor *sz) +{ + dtensor *x = XM(mkdtensor)(sz->rnk); + int i; + if (FINITE_RNK(sz->rnk)) + for (i = 0; i < sz->rnk; ++i) + x->dims[i] = sz->dims[i]; + return x; +} + +dtensor *XM(dtensor_canonical)(const dtensor *sz, int compress) +{ + int i, rnk; + dtensor *x; + block_kind k; + + if (!FINITE_RNK(sz->rnk)) + return XM(mkdtensor)(sz->rnk); + for (i = rnk = 0; i < sz->rnk; ++i) { + if (sz->dims[i].n <= 0) + return XM(mkdtensor)(RNK_MINFTY); + else if (!compress || sz->dims[i].n > 1) + ++rnk; + } + x = XM(mkdtensor)(rnk); + for (i = rnk = 0; i < sz->rnk; ++i) { + if (!compress || sz->dims[i].n > 1) { + x->dims[rnk].n = sz->dims[i].n; + FORALL_BLOCK_KIND(k) { + if (XM(num_blocks)(sz->dims[i].n, sz->dims[i].b[k]) == 1) + x->dims[rnk].b[k] = sz->dims[i].n; + else + x->dims[rnk].b[k] = sz->dims[i].b[k]; + } + ++rnk; + } + } + return x; +} + +int XM(dtensor_validp)(const dtensor *sz) +{ + int i; + if (sz->rnk < 0) return 0; + if (FINITE_RNK(sz->rnk)) + for (i = 0; i < sz->rnk; ++i) + if (sz->dims[i].n < 0 + || sz->dims[i].b[IB] <= 0 + || sz->dims[i].b[OB] <= 0) + return 0; + return 1; +} + +void XM(dtensor_print)(const dtensor *t, printer *p) +{ + if (FINITE_RNK(t->rnk)) { + int i; + int first = 1; + p->print(p, "("); + for (i = 0; i < t->rnk; ++i) { + const ddim *d = t->dims + i; + p->print(p, "%s(%D %D %D)", + first ? "" : " ", + d->n, d->b[IB], d->b[OB]); + first = 0; + } + p->print(p, ")"); + } else { + p->print(p, "rank-minfty"); + } + +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03-wrap.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03-wrap.c new file mode 100644 index 000000000..1441bb15c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03-wrap.c @@ -0,0 +1,284 @@ +/* Generated automatically. DO NOT EDIT! */ + +#include "fftw3-mpi.h" +#include "ifftw-mpi.h" + +FFTW_EXTERN ptrdiff_t XM(local_size_many_transposed_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start); +FFTW_EXTERN ptrdiff_t XM(local_size_many_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t block0, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start); +FFTW_EXTERN ptrdiff_t XM(local_size_transposed_f03)(int rnk, const ptrdiff_t * n, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start); +FFTW_EXTERN ptrdiff_t XM(local_size_f03)(int rnk, const ptrdiff_t * n, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start); +FFTW_EXTERN ptrdiff_t XM(local_size_many_1d_f03)(ptrdiff_t n0, ptrdiff_t howmany, MPI_Fint f_comm, int sign, unsigned flags, ptrdiff_t * local_ni, ptrdiff_t * local_i_start, ptrdiff_t * local_no, ptrdiff_t * local_o_start); +FFTW_EXTERN ptrdiff_t XM(local_size_1d_f03)(ptrdiff_t n0, MPI_Fint f_comm, int sign, unsigned flags, ptrdiff_t * local_ni, ptrdiff_t * local_i_start, ptrdiff_t * local_no, ptrdiff_t * local_o_start); +FFTW_EXTERN ptrdiff_t XM(local_size_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start); +FFTW_EXTERN ptrdiff_t XM(local_size_2d_transposed_f03)(ptrdiff_t n0, ptrdiff_t n1, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start); +FFTW_EXTERN ptrdiff_t XM(local_size_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start); +FFTW_EXTERN ptrdiff_t XM(local_size_3d_transposed_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start); +FFTW_EXTERN X(plan) XM(plan_many_transpose_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1, R * in, R * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_transpose_f03)(ptrdiff_t n0, ptrdiff_t n1, R * in, R * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_many_dft_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t block, ptrdiff_t tblock, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_f03)(int rnk, const ptrdiff_t * n, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_1d_f03)(ptrdiff_t n0, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_many_r2r_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t iblock, ptrdiff_t oblock, R * in, R * out, MPI_Fint f_comm, const X(r2r_kind) * kind, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_r2r_f03)(int rnk, const ptrdiff_t * n, R * in, R * out, MPI_Fint f_comm, const X(r2r_kind) * kind, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_r2r_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, R * in, R * out, MPI_Fint f_comm, X(r2r_kind) kind0, X(r2r_kind) kind1, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_r2r_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R * in, R * out, MPI_Fint f_comm, X(r2r_kind) kind0, X(r2r_kind) kind1, X(r2r_kind) kind2, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_many_dft_r2c_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t iblock, ptrdiff_t oblock, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_r2c_f03)(int rnk, const ptrdiff_t * n, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_r2c_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_r2c_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_many_dft_c2r_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t iblock, ptrdiff_t oblock, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_c2r_f03)(int rnk, const ptrdiff_t * n, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_c2r_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN X(plan) XM(plan_dft_c2r_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags); +FFTW_EXTERN void XM(gather_wisdom_f03)(MPI_Fint f_comm_); +FFTW_EXTERN void XM(broadcast_wisdom_f03)(MPI_Fint f_comm_); + +ptrdiff_t XM(local_size_many_transposed_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_many_transposed)(rnk,n,howmany,block0,block1,comm,local_n0,local_0_start,local_n1,local_1_start); +} + +ptrdiff_t XM(local_size_many_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t block0, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_many)(rnk,n,howmany,block0,comm,local_n0,local_0_start); +} + +ptrdiff_t XM(local_size_transposed_f03)(int rnk, const ptrdiff_t * n, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_transposed)(rnk,n,comm,local_n0,local_0_start,local_n1,local_1_start); +} + +ptrdiff_t XM(local_size_f03)(int rnk, const ptrdiff_t * n, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size)(rnk,n,comm,local_n0,local_0_start); +} + +ptrdiff_t XM(local_size_many_1d_f03)(ptrdiff_t n0, ptrdiff_t howmany, MPI_Fint f_comm, int sign, unsigned flags, ptrdiff_t * local_ni, ptrdiff_t * local_i_start, ptrdiff_t * local_no, ptrdiff_t * local_o_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_many_1d)(n0,howmany,comm,sign,flags,local_ni,local_i_start,local_no,local_o_start); +} + +ptrdiff_t XM(local_size_1d_f03)(ptrdiff_t n0, MPI_Fint f_comm, int sign, unsigned flags, ptrdiff_t * local_ni, ptrdiff_t * local_i_start, ptrdiff_t * local_no, ptrdiff_t * local_o_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_1d)(n0,comm,sign,flags,local_ni,local_i_start,local_no,local_o_start); +} + +ptrdiff_t XM(local_size_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_2d)(n0,n1,comm,local_n0,local_0_start); +} + +ptrdiff_t XM(local_size_2d_transposed_f03)(ptrdiff_t n0, ptrdiff_t n1, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_2d_transposed)(n0,n1,comm,local_n0,local_0_start,local_n1,local_1_start); +} + +ptrdiff_t XM(local_size_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_3d)(n0,n1,n2,comm,local_n0,local_0_start); +} + +ptrdiff_t XM(local_size_3d_transposed_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Fint f_comm, ptrdiff_t * local_n0, ptrdiff_t * local_0_start, ptrdiff_t * local_n1, ptrdiff_t * local_1_start) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(local_size_3d_transposed)(n0,n1,n2,comm,local_n0,local_0_start,local_n1,local_1_start); +} + +X(plan) XM(plan_many_transpose_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1, R * in, R * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_many_transpose)(n0,n1,howmany,block0,block1,in,out,comm,flags); +} + +X(plan) XM(plan_transpose_f03)(ptrdiff_t n0, ptrdiff_t n1, R * in, R * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_transpose)(n0,n1,in,out,comm,flags); +} + +X(plan) XM(plan_many_dft_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t block, ptrdiff_t tblock, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_many_dft)(rnk,n,howmany,block,tblock,in,out,comm,sign,flags); +} + +X(plan) XM(plan_dft_f03)(int rnk, const ptrdiff_t * n, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft)(rnk,n,in,out,comm,sign,flags); +} + +X(plan) XM(plan_dft_1d_f03)(ptrdiff_t n0, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_1d)(n0,in,out,comm,sign,flags); +} + +X(plan) XM(plan_dft_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_2d)(n0,n1,in,out,comm,sign,flags); +} + +X(plan) XM(plan_dft_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, X(complex) * in, X(complex) * out, MPI_Fint f_comm, int sign, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_3d)(n0,n1,n2,in,out,comm,sign,flags); +} + +X(plan) XM(plan_many_r2r_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t iblock, ptrdiff_t oblock, R * in, R * out, MPI_Fint f_comm, const X(r2r_kind) * kind, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_many_r2r)(rnk,n,howmany,iblock,oblock,in,out,comm,kind,flags); +} + +X(plan) XM(plan_r2r_f03)(int rnk, const ptrdiff_t * n, R * in, R * out, MPI_Fint f_comm, const X(r2r_kind) * kind, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_r2r)(rnk,n,in,out,comm,kind,flags); +} + +X(plan) XM(plan_r2r_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, R * in, R * out, MPI_Fint f_comm, X(r2r_kind) kind0, X(r2r_kind) kind1, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_r2r_2d)(n0,n1,in,out,comm,kind0,kind1,flags); +} + +X(plan) XM(plan_r2r_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R * in, R * out, MPI_Fint f_comm, X(r2r_kind) kind0, X(r2r_kind) kind1, X(r2r_kind) kind2, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_r2r_3d)(n0,n1,n2,in,out,comm,kind0,kind1,kind2,flags); +} + +X(plan) XM(plan_many_dft_r2c_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t iblock, ptrdiff_t oblock, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_many_dft_r2c)(rnk,n,howmany,iblock,oblock,in,out,comm,flags); +} + +X(plan) XM(plan_dft_r2c_f03)(int rnk, const ptrdiff_t * n, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_r2c)(rnk,n,in,out,comm,flags); +} + +X(plan) XM(plan_dft_r2c_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_r2c_2d)(n0,n1,in,out,comm,flags); +} + +X(plan) XM(plan_dft_r2c_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R * in, X(complex) * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_r2c_3d)(n0,n1,n2,in,out,comm,flags); +} + +X(plan) XM(plan_many_dft_c2r_f03)(int rnk, const ptrdiff_t * n, ptrdiff_t howmany, ptrdiff_t iblock, ptrdiff_t oblock, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_many_dft_c2r)(rnk,n,howmany,iblock,oblock,in,out,comm,flags); +} + +X(plan) XM(plan_dft_c2r_f03)(int rnk, const ptrdiff_t * n, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_c2r)(rnk,n,in,out,comm,flags); +} + +X(plan) XM(plan_dft_c2r_2d_f03)(ptrdiff_t n0, ptrdiff_t n1, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_c2r_2d)(n0,n1,in,out,comm,flags); +} + +X(plan) XM(plan_dft_c2r_3d_f03)(ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, X(complex) * in, R * out, MPI_Fint f_comm, unsigned flags) +{ + MPI_Comm comm; + + comm = MPI_Comm_f2c(f_comm); + return XM(plan_dft_c2r_3d)(n0,n1,n2,in,out,comm,flags); +} + +void XM(gather_wisdom_f03)(MPI_Fint f_comm_) +{ + MPI_Comm comm_; + + comm_ = MPI_Comm_f2c(f_comm_); + XM(gather_wisdom)(comm_); +} + +void XM(broadcast_wisdom_f03)(MPI_Fint f_comm_) +{ + MPI_Comm comm_; + + comm_ = MPI_Comm_f2c(f_comm_); + XM(broadcast_wisdom)(comm_); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03-wrap.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03-wrap.sh new file mode 100755 index 000000000..530a0d08b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03-wrap.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +# Script to generate Fortran 2003 wrappers for FFTW's MPI functions. This +# is necessary because MPI provides no way to deal with C MPI_Comm handles +# from Fortran (where MPI_Comm == integer), but does provide a way to +# deal with Fortran MPI_Comm handles from C (via MPI_Comm_f2c). So, +# every FFTW function that takes an MPI_Comm argument needs a wrapper +# function that takes a Fortran integer and converts it to MPI_Comm. + +echo "/* Generated automatically. DO NOT EDIT! */" +echo + +echo "#include \"fftw3-mpi.h\"" +echo "#include \"ifftw-mpi.h\"" +echo + +# Declare prototypes using FFTW_EXTERN, important for Windows DLLs +grep -v 'mpi.h' fftw3-mpi.h | gcc -E -I../api - |grep "fftw_mpi_init" |tr ';' '\n' | grep "MPI_Comm" | perl genf03-wrap.pl | grep "MPI_Fint" | sed 's/^/FFTW_EXTERN /;s/$/;/' + +grep -v 'mpi.h' fftw3-mpi.h | gcc -E -I../api - |grep "fftw_mpi_init" |tr ';' '\n' | grep "MPI_Comm" | perl genf03-wrap.pl + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03api.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03api.sh new file mode 100755 index 000000000..fb36c1d90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/f03api.sh @@ -0,0 +1,43 @@ +#! /bin/sh + +# Script to generate Fortran 2003 interface declarations for FFTW's MPI +# interface from the fftw3-mpi.h header file. + +# This is designed so that the Fortran caller can do: +# use, intrinsic :: iso_c_binding +# implicit none +# include 'fftw3-mpi.f03' +# and then call the C FFTW MPI functions directly, with type checking. +# +# One caveat: because there is no standard way to conver MPI_Comm objects +# from Fortran (= integer) to C (= opaque type), the Fortran interface +# technically calls C wrapper functions (also auto-generated) which +# call MPI_Comm_f2c to convert the communicators as needed. + +echo "! Generated automatically. DO NOT EDIT!" +echo + +echo " include 'fftw3.f03'" +echo + +# Extract constants +perl -pe 's/#define +([A-Z0-9_]+) +\(([+-]?[0-9]+)U?\)/\n integer\(C_INTPTR_T\), parameter :: \1 = \2\n/g' < fftw3-mpi.h | grep 'integer(C_INTPTR_T)' +perl -pe 'if (/#define +([A-Z0-9_]+) +\(([0-9]+)U? *<< *([0-9]+)\)/) { print "\n integer\(C_INT\), parameter :: $1 = ",$2 << $3,"\n"; }' < fftw3-mpi.h | grep 'integer(C_INT)' + +# Extract function declarations +for p in $*; do + if test "$p" = "d"; then p=""; fi + + echo + cat < +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +struct fftw_mpi_ddim_do_not_use_me { + ptrdiff_t n; /* dimension size */ + ptrdiff_t ib; /* input block */ + ptrdiff_t ob; /* output block */ +}; + +/* + huge second-order macro that defines prototypes for all API + functions. We expand this macro for each supported precision + + XM: name-mangling macro (MPI) + X: name-mangling macro (serial) + R: real data type + C: complex data type +*/ + +#define FFTW_MPI_DEFINE_API(XM, X, R, C) \ + \ +typedef struct fftw_mpi_ddim_do_not_use_me XM(ddim); \ + \ +FFTW_EXTERN void XM(init)(void); \ +FFTW_EXTERN void XM(cleanup)(void); \ + \ +FFTW_EXTERN ptrdiff_t XM(local_size_many_transposed) \ + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \ + ptrdiff_t block0, ptrdiff_t block1, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \ + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_many) \ + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \ + ptrdiff_t block0, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_transposed) \ + (int rnk, const ptrdiff_t *n, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \ + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size) \ + (int rnk, const ptrdiff_t *n, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_many_1d)( \ + ptrdiff_t n0, ptrdiff_t howmany, \ + MPI_Comm comm, int sign, unsigned flags, \ + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, \ + ptrdiff_t *local_no, ptrdiff_t *local_o_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_1d)( \ + ptrdiff_t n0, MPI_Comm comm, int sign, unsigned flags, \ + ptrdiff_t *local_ni, ptrdiff_t *local_i_start, \ + ptrdiff_t *local_no, ptrdiff_t *local_o_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_2d)( \ + ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_2d_transposed)( \ + ptrdiff_t n0, ptrdiff_t n1, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \ + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_3d)( \ + ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start); \ +FFTW_EXTERN ptrdiff_t XM(local_size_3d_transposed)( \ + ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, MPI_Comm comm, \ + ptrdiff_t *local_n0, ptrdiff_t *local_0_start, \ + ptrdiff_t *local_n1, ptrdiff_t *local_1_start); \ + \ +FFTW_EXTERN X(plan) XM(plan_many_transpose) \ + (ptrdiff_t n0, ptrdiff_t n1, \ + ptrdiff_t howmany, ptrdiff_t block0, ptrdiff_t block1, \ + R *in, R *out, MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_transpose) \ + (ptrdiff_t n0, ptrdiff_t n1, \ + R *in, R *out, MPI_Comm comm, unsigned flags); \ + \ +FFTW_EXTERN X(plan) XM(plan_many_dft) \ + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \ + ptrdiff_t block, ptrdiff_t tblock, C *in, C *out, \ + MPI_Comm comm, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft) \ + (int rnk, const ptrdiff_t *n, C *in, C *out, \ + MPI_Comm comm, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_1d) \ + (ptrdiff_t n0, C *in, C *out, \ + MPI_Comm comm, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_2d) \ + (ptrdiff_t n0, ptrdiff_t n1, C *in, C *out, \ + MPI_Comm comm, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_3d) \ + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, C *out, \ + MPI_Comm comm, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) XM(plan_many_r2r) \ + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \ + ptrdiff_t iblock, ptrdiff_t oblock, R *in, R *out, \ + MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_r2r) \ + (int rnk, const ptrdiff_t *n, R *in, R *out, \ + MPI_Comm comm, const X(r2r_kind) *kind, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_r2r_2d) \ + (ptrdiff_t n0, ptrdiff_t n1, R *in, R *out, MPI_Comm comm, \ + X(r2r_kind) kind0, X(r2r_kind) kind1, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_r2r_3d) \ + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, \ + R *in, R *out, MPI_Comm comm, X(r2r_kind) kind0, \ + X(r2r_kind) kind1, X(r2r_kind) kind2, unsigned flags); \ + \ +FFTW_EXTERN X(plan) XM(plan_many_dft_r2c) \ + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \ + ptrdiff_t iblock, ptrdiff_t oblock, R *in, C *out, \ + MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_r2c) \ + (int rnk, const ptrdiff_t *n, R *in, C *out, \ + MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_r2c_2d) \ + (ptrdiff_t n0, ptrdiff_t n1, R *in, C *out, \ + MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_r2c_3d) \ + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, R *in, C *out, \ + MPI_Comm comm, unsigned flags); \ + \ +FFTW_EXTERN X(plan) XM(plan_many_dft_c2r) \ + (int rnk, const ptrdiff_t *n, ptrdiff_t howmany, \ + ptrdiff_t iblock, ptrdiff_t oblock, C *in, R *out, \ + MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_c2r) \ + (int rnk, const ptrdiff_t *n, C *in, R *out, \ + MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_c2r_2d) \ + (ptrdiff_t n0, ptrdiff_t n1, C *in, R *out, \ + MPI_Comm comm, unsigned flags); \ +FFTW_EXTERN X(plan) XM(plan_dft_c2r_3d) \ + (ptrdiff_t n0, ptrdiff_t n1, ptrdiff_t n2, C *in, R *out, \ + MPI_Comm comm, unsigned flags); \ + \ +FFTW_EXTERN void XM(gather_wisdom)(MPI_Comm comm_); \ +FFTW_EXTERN void XM(broadcast_wisdom)(MPI_Comm comm_); \ + \ +FFTW_EXTERN void XM(execute_dft)(X(plan) p, C *in, C *out); \ +FFTW_EXTERN void XM(execute_dft_r2c)(X(plan) p, R *in, C *out); \ +FFTW_EXTERN void XM(execute_dft_c2r)(X(plan) p, C *in, R *out); \ +FFTW_EXTERN void XM(execute_r2r)(X(plan) p, R *in, R *out); + + + +/* end of FFTW_MPI_DEFINE_API macro */ + +#define FFTW_MPI_MANGLE_DOUBLE(name) FFTW_MANGLE_DOUBLE(FFTW_CONCAT(mpi_,name)) +#define FFTW_MPI_MANGLE_FLOAT(name) FFTW_MANGLE_FLOAT(FFTW_CONCAT(mpi_,name)) +#define FFTW_MPI_MANGLE_LONG_DOUBLE(name) FFTW_MANGLE_LONG_DOUBLE(FFTW_CONCAT(mpi_,name)) + +FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_DOUBLE, FFTW_MANGLE_DOUBLE, double, fftw_complex) +FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_FLOAT, FFTW_MANGLE_FLOAT, float, fftwf_complex) +FFTW_MPI_DEFINE_API(FFTW_MPI_MANGLE_LONG_DOUBLE, FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex) + +#define FFTW_MPI_DEFAULT_BLOCK (0) + +/* MPI-specific flags */ +#define FFTW_MPI_SCRAMBLED_IN (1U << 27) +#define FFTW_MPI_SCRAMBLED_OUT (1U << 28) +#define FFTW_MPI_TRANSPOSED_IN (1U << 29) +#define FFTW_MPI_TRANSPOSED_OUT (1U << 30) + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FFTW3_MPI_H */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/fftw3l-mpi.f03.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/fftw3l-mpi.f03.in new file mode 100644 index 000000000..a006f7604 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/fftw3l-mpi.f03.in @@ -0,0 +1,405 @@ +! Generated automatically. DO NOT EDIT! + + include 'fftw3l.f03' + + + type, bind(C) :: fftwl_mpi_ddim + integer(C_INTPTR_T) n, ib, ob + end type fftwl_mpi_ddim + + interface + subroutine fftwl_mpi_init() bind(C, name='fftwl_mpi_init') + import + end subroutine fftwl_mpi_init + + subroutine fftwl_mpi_cleanup() bind(C, name='fftwl_mpi_cleanup') + import + end subroutine fftwl_mpi_cleanup + + integer(C_INTPTR_T) function fftwl_mpi_local_size_many_transposed(rnk,n,howmany,block0,block1,comm,local_n0,local_0_start, & + local_n1,local_1_start) & + bind(C, name='fftwl_mpi_local_size_many_transposed_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: block0 + integer(C_INTPTR_T), value :: block1 + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + integer(C_INTPTR_T), intent(out) :: local_n1 + integer(C_INTPTR_T), intent(out) :: local_1_start + end function fftwl_mpi_local_size_many_transposed + + integer(C_INTPTR_T) function fftwl_mpi_local_size_many(rnk,n,howmany,block0,comm,local_n0,local_0_start) & + bind(C, name='fftwl_mpi_local_size_many_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: block0 + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + end function fftwl_mpi_local_size_many + + integer(C_INTPTR_T) function fftwl_mpi_local_size_transposed(rnk,n,comm,local_n0,local_0_start,local_n1,local_1_start) & + bind(C, name='fftwl_mpi_local_size_transposed_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + integer(C_INTPTR_T), intent(out) :: local_n1 + integer(C_INTPTR_T), intent(out) :: local_1_start + end function fftwl_mpi_local_size_transposed + + integer(C_INTPTR_T) function fftwl_mpi_local_size(rnk,n,comm,local_n0,local_0_start) bind(C, name='fftwl_mpi_local_size_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + end function fftwl_mpi_local_size + + integer(C_INTPTR_T) function fftwl_mpi_local_size_many_1d(n0,howmany,comm,sign,flags,local_ni,local_i_start,local_no, & + local_o_start) bind(C, name='fftwl_mpi_local_size_many_1d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: howmany + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + integer(C_INTPTR_T), intent(out) :: local_ni + integer(C_INTPTR_T), intent(out) :: local_i_start + integer(C_INTPTR_T), intent(out) :: local_no + integer(C_INTPTR_T), intent(out) :: local_o_start + end function fftwl_mpi_local_size_many_1d + + integer(C_INTPTR_T) function fftwl_mpi_local_size_1d(n0,comm,sign,flags,local_ni,local_i_start,local_no,local_o_start) & + bind(C, name='fftwl_mpi_local_size_1d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + integer(C_INTPTR_T), intent(out) :: local_ni + integer(C_INTPTR_T), intent(out) :: local_i_start + integer(C_INTPTR_T), intent(out) :: local_no + integer(C_INTPTR_T), intent(out) :: local_o_start + end function fftwl_mpi_local_size_1d + + integer(C_INTPTR_T) function fftwl_mpi_local_size_2d(n0,n1,comm,local_n0,local_0_start) & + bind(C, name='fftwl_mpi_local_size_2d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + end function fftwl_mpi_local_size_2d + + integer(C_INTPTR_T) function fftwl_mpi_local_size_2d_transposed(n0,n1,comm,local_n0,local_0_start,local_n1,local_1_start) & + bind(C, name='fftwl_mpi_local_size_2d_transposed_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + integer(C_INTPTR_T), intent(out) :: local_n1 + integer(C_INTPTR_T), intent(out) :: local_1_start + end function fftwl_mpi_local_size_2d_transposed + + integer(C_INTPTR_T) function fftwl_mpi_local_size_3d(n0,n1,n2,comm,local_n0,local_0_start) & + bind(C, name='fftwl_mpi_local_size_3d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: n2 + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + end function fftwl_mpi_local_size_3d + + integer(C_INTPTR_T) function fftwl_mpi_local_size_3d_transposed(n0,n1,n2,comm,local_n0,local_0_start,local_n1,local_1_start) & + bind(C, name='fftwl_mpi_local_size_3d_transposed_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: n2 + integer(C_MPI_FINT), value :: comm + integer(C_INTPTR_T), intent(out) :: local_n0 + integer(C_INTPTR_T), intent(out) :: local_0_start + integer(C_INTPTR_T), intent(out) :: local_n1 + integer(C_INTPTR_T), intent(out) :: local_1_start + end function fftwl_mpi_local_size_3d_transposed + + type(C_PTR) function fftwl_mpi_plan_many_transpose(n0,n1,howmany,block0,block1,in,out,comm,flags) & + bind(C, name='fftwl_mpi_plan_many_transpose_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: block0 + integer(C_INTPTR_T), value :: block1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_many_transpose + + type(C_PTR) function fftwl_mpi_plan_transpose(n0,n1,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_transpose_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_transpose + + type(C_PTR) function fftwl_mpi_plan_many_dft(rnk,n,howmany,block,tblock,in,out,comm,sign,flags) & + bind(C, name='fftwl_mpi_plan_many_dft_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: block + integer(C_INTPTR_T), value :: tblock + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_mpi_plan_many_dft + + type(C_PTR) function fftwl_mpi_plan_dft(rnk,n,in,out,comm,sign,flags) bind(C, name='fftwl_mpi_plan_dft_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft + + type(C_PTR) function fftwl_mpi_plan_dft_1d(n0,in,out,comm,sign,flags) bind(C, name='fftwl_mpi_plan_dft_1d_f03') + import + integer(C_INTPTR_T), value :: n0 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_1d + + type(C_PTR) function fftwl_mpi_plan_dft_2d(n0,n1,in,out,comm,sign,flags) bind(C, name='fftwl_mpi_plan_dft_2d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_2d + + type(C_PTR) function fftwl_mpi_plan_dft_3d(n0,n1,n2,in,out,comm,sign,flags) bind(C, name='fftwl_mpi_plan_dft_3d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: n2 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: sign + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_3d + + type(C_PTR) function fftwl_mpi_plan_many_r2r(rnk,n,howmany,iblock,oblock,in,out,comm,kind,flags) & + bind(C, name='fftwl_mpi_plan_many_r2r_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: iblock + integer(C_INTPTR_T), value :: oblock + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_mpi_plan_many_r2r + + type(C_PTR) function fftwl_mpi_plan_r2r(rnk,n,in,out,comm,kind,flags) bind(C, name='fftwl_mpi_plan_r2r_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_FFTW_R2R_KIND), dimension(*), intent(in) :: kind + integer(C_INT), value :: flags + end function fftwl_mpi_plan_r2r + + type(C_PTR) function fftwl_mpi_plan_r2r_2d(n0,n1,in,out,comm,kind0,kind1,flags) bind(C, name='fftwl_mpi_plan_r2r_2d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_INT), value :: flags + end function fftwl_mpi_plan_r2r_2d + + type(C_PTR) function fftwl_mpi_plan_r2r_3d(n0,n1,n2,in,out,comm,kind0,kind1,kind2,flags) & + bind(C, name='fftwl_mpi_plan_r2r_3d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: n2 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_FFTW_R2R_KIND), value :: kind0 + integer(C_FFTW_R2R_KIND), value :: kind1 + integer(C_FFTW_R2R_KIND), value :: kind2 + integer(C_INT), value :: flags + end function fftwl_mpi_plan_r2r_3d + + type(C_PTR) function fftwl_mpi_plan_many_dft_r2c(rnk,n,howmany,iblock,oblock,in,out,comm,flags) & + bind(C, name='fftwl_mpi_plan_many_dft_r2c_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: iblock + integer(C_INTPTR_T), value :: oblock + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_many_dft_r2c + + type(C_PTR) function fftwl_mpi_plan_dft_r2c(rnk,n,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_dft_r2c_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_r2c + + type(C_PTR) function fftwl_mpi_plan_dft_r2c_2d(n0,n1,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_dft_r2c_2d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_r2c_2d + + type(C_PTR) function fftwl_mpi_plan_dft_r2c_3d(n0,n1,n2,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_dft_r2c_3d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: n2 + real(C_LONG_DOUBLE), dimension(*), intent(out) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_r2c_3d + + type(C_PTR) function fftwl_mpi_plan_many_dft_c2r(rnk,n,howmany,iblock,oblock,in,out,comm,flags) & + bind(C, name='fftwl_mpi_plan_many_dft_c2r_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + integer(C_INTPTR_T), value :: howmany + integer(C_INTPTR_T), value :: iblock + integer(C_INTPTR_T), value :: oblock + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_many_dft_c2r + + type(C_PTR) function fftwl_mpi_plan_dft_c2r(rnk,n,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_dft_c2r_f03') + import + integer(C_INT), value :: rnk + integer(C_INTPTR_T), dimension(*), intent(in) :: n + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_c2r + + type(C_PTR) function fftwl_mpi_plan_dft_c2r_2d(n0,n1,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_dft_c2r_2d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_c2r_2d + + type(C_PTR) function fftwl_mpi_plan_dft_c2r_3d(n0,n1,n2,in,out,comm,flags) bind(C, name='fftwl_mpi_plan_dft_c2r_3d_f03') + import + integer(C_INTPTR_T), value :: n0 + integer(C_INTPTR_T), value :: n1 + integer(C_INTPTR_T), value :: n2 + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + integer(C_MPI_FINT), value :: comm + integer(C_INT), value :: flags + end function fftwl_mpi_plan_dft_c2r_3d + + subroutine fftwl_mpi_gather_wisdom(comm_) bind(C, name='fftwl_mpi_gather_wisdom_f03') + import + integer(C_MPI_FINT), value :: comm_ + end subroutine fftwl_mpi_gather_wisdom + + subroutine fftwl_mpi_broadcast_wisdom(comm_) bind(C, name='fftwl_mpi_broadcast_wisdom_f03') + import + integer(C_MPI_FINT), value :: comm_ + end subroutine fftwl_mpi_broadcast_wisdom + + subroutine fftwl_mpi_execute_dft(p,in,out) bind(C, name='fftwl_mpi_execute_dft') + import + type(C_PTR), value :: p + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwl_mpi_execute_dft + + subroutine fftwl_mpi_execute_dft_r2c(p,in,out) bind(C, name='fftwl_mpi_execute_dft_r2c') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(out) :: out + end subroutine fftwl_mpi_execute_dft_r2c + + subroutine fftwl_mpi_execute_dft_c2r(p,in,out) bind(C, name='fftwl_mpi_execute_dft_c2r') + import + type(C_PTR), value :: p + complex(C_LONG_DOUBLE_COMPLEX), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_mpi_execute_dft_c2r + + subroutine fftwl_mpi_execute_r2r(p,in,out) bind(C, name='fftwl_mpi_execute_r2r') + import + type(C_PTR), value :: p + real(C_LONG_DOUBLE), dimension(*), intent(inout) :: in + real(C_LONG_DOUBLE), dimension(*), intent(out) :: out + end subroutine fftwl_mpi_execute_r2r + + end interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/genf03-wrap.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/genf03-wrap.pl new file mode 100755 index 000000000..85638496d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/genf03-wrap.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl -w +# Generate Fortran 2003 wrappers (which translate MPI_Comm from f2c) from +# function declarations of the form (one per line): +# extern fftw_mpi_(...args...) +# extern fftw_mpi_(...args...) +# ... +# with no line breaks within a given function. (It's too much work to +# write a general parser, since we just have to handle FFTW's header files.) +# Each declaration has at least one MPI_Comm argument. + +sub canonicalize_type { + my($type); + ($type) = @_; + $type =~ s/ +/ /g; + $type =~ s/^ //; + $type =~ s/ $//; + $type =~ s/([^\* ])\*/$1 \*/g; + $type =~ s/double/R/; + $type =~ s/fftw_([A-Za-z0-9_]+)/X(\1)/; + return $type; +} + +while (<>) { + next if /^ *$/; + if (/^ *extern +([a-zA-Z_0-9 ]+[ \*]) *fftw_mpi_([a-zA-Z_0-9]+) *\((.*)\) *$/) { + $ret = &canonicalize_type($1); + $name = $2; + + $args = $3; + + + print "\n$ret XM(${name}_f03)("; + + $comma = ""; + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $argname = $2; + print $comma; + if ($argtype eq "MPI_Comm") { + print "MPI_Fint f_$argname"; + } + else { + print "$argtype $argname"; + } + $comma = ", "; + } + print ")\n{\n"; + + print " MPI_Comm "; + $comma = ""; + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $argname = $2; + if ($argtype eq "MPI_Comm") { + print "$comma$argname"; + $comma = ", "; + } + } + print ";\n\n"; + + foreach $arg (split(/ *, */, $args)) { + $arg =~ /^([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) *$/; + $argtype = &canonicalize_type($1); + $argname = $2; + if ($argtype eq "MPI_Comm") { + print " $argname = MPI_Comm_f2c(f_$argname);\n"; + } + } + + $argnames = $args; + $argnames =~ s/([a-zA-Z_0-9 ]+[ \*]) *([a-zA-Z_0-9]+) */$2/g; + print " "; + print "return " if ($ret ne "void"); + print "XM($name)($argnames);\n}\n"; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/ifftw-mpi.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/ifftw-mpi.h new file mode 100644 index 000000000..23cb6a1ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/ifftw-mpi.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* FFTW-MPI internal header file */ +#ifndef __IFFTW_MPI_H__ +#define __IFFTW_MPI_H__ + +#include "kernel/ifftw.h" +#include "rdft/rdft.h" + +#include + +/* mpi problem flags: problem-dependent meaning, but in general + SCRAMBLED means some reordering *within* the dimensions, while + TRANSPOSED means some reordering *of* the dimensions */ +#define SCRAMBLED_IN (1 << 0) +#define SCRAMBLED_OUT (1 << 1) +#define TRANSPOSED_IN (1 << 2) +#define TRANSPOSED_OUT (1 << 3) +#define RANK1_BIGVEC_ONLY (1 << 4) /* for rank=1, allow only bigvec solver */ + +#define ONLY_SCRAMBLEDP(flags) (!((flags) & ~(SCRAMBLED_IN|SCRAMBLED_OUT))) +#define ONLY_TRANSPOSEDP(flags) (!((flags) & ~(TRANSPOSED_IN|TRANSPOSED_OUT))) + +#if defined(FFTW_SINGLE) +# define FFTW_MPI_TYPE MPI_FLOAT +#elif defined(FFTW_LDOUBLE) +# define FFTW_MPI_TYPE MPI_LONG_DOUBLE +#elif defined(FFTW_QUAD) +# error MPI quad-precision type is unknown +#else +# define FFTW_MPI_TYPE MPI_DOUBLE +#endif + +/* all fftw-mpi identifiers start with fftw_mpi (or fftwf_mpi etc.) */ +#define XM(name) X(CONCAT(mpi_, name)) + +/***********************************************************************/ +/* block distributions */ + +/* a distributed dimension of length n with input and output block + sizes ib and ob, respectively. */ +typedef enum { IB = 0, OB } block_kind; +typedef struct { + INT n; + INT b[2]; /* b[IB], b[OB] */ +} ddim; + +/* Loop over k in {IB, OB}. Note: need explicit casts for C++. */ +#define FORALL_BLOCK_KIND(k) for (k = IB; k <= OB; k = (block_kind) (((int) k) + 1)) + +/* unlike tensors in the serial FFTW, the ordering of the dtensor + dimensions matters - both the array and the block layout are + row-major order. */ +typedef struct { + int rnk; +#if defined(STRUCT_HACK_KR) + ddim dims[1]; +#elif defined(STRUCT_HACK_C99) + ddim dims[]; +#else + ddim *dims; +#endif +} dtensor; + + +/* dtensor.c: */ +dtensor *XM(mkdtensor)(int rnk); +void XM(dtensor_destroy)(dtensor *sz); +dtensor *XM(dtensor_copy)(const dtensor *sz); +dtensor *XM(dtensor_canonical)(const dtensor *sz, int compress); +int XM(dtensor_validp)(const dtensor *sz); +void XM(dtensor_md5)(md5 *p, const dtensor *t); +void XM(dtensor_print)(const dtensor *t, printer *p); + +/* block.c: */ + +/* for a single distributed dimension: */ +INT XM(num_blocks)(INT n, INT block); +int XM(num_blocks_ok)(INT n, INT block, MPI_Comm comm); +INT XM(default_block)(INT n, int n_pes); +INT XM(block)(INT n, INT block, int which_block); + +/* for multiple distributed dimensions: */ +INT XM(num_blocks_total)(const dtensor *sz, block_kind k); +int XM(idle_process)(const dtensor *sz, block_kind k, int which_pe); +void XM(block_coords)(const dtensor *sz, block_kind k, int which_pe, + INT *coords); +INT XM(total_block)(const dtensor *sz, block_kind k, int which_pe); +int XM(is_local_after)(int dim, const dtensor *sz, block_kind k); +int XM(is_local)(const dtensor *sz, block_kind k); +int XM(is_block1d)(const dtensor *sz, block_kind k); + +/* choose-radix.c */ +INT XM(choose_radix)(ddim d, int n_pes, unsigned flags, int sign, + INT rblock[2], INT mblock[2]); + +/***********************************************************************/ +/* any_true.c */ +int XM(any_true)(int condition, MPI_Comm comm); +int XM(md5_equal)(md5 m, MPI_Comm comm); + +/* conf.c */ +void XM(conf_standard)(planner *p); + +/***********************************************************************/ +/* rearrange.c */ + +/* Different ways to rearrange the vector dimension vn during transposition, + reflecting different tradeoffs between ease of transposition and + contiguity during the subsequent DFTs. + + TODO: can we pare this down to CONTIG and DISCONTIG, at least + in MEASURE mode? SQUARE_MIDDLE is also used for 1d destroy-input DFTs. */ +typedef enum { + CONTIG = 0, /* vn x 1: make subsequent DFTs contiguous */ + DISCONTIG, /* P x (vn/P) for P processes */ + SQUARE_BEFORE, /* try to get square transpose at beginning */ + SQUARE_MIDDLE, /* try to get square transpose in the middle */ + SQUARE_AFTER /* try to get square transpose at end */ +} rearrangement; + +/* skipping SQUARE_AFTER since it doesn't seem to offer any advantage + over SQUARE_BEFORE */ +#define FORALL_REARRANGE(rearrange) for (rearrange = CONTIG; rearrange <= SQUARE_MIDDLE; rearrange = (rearrangement) (((int) rearrange) + 1)) + +int XM(rearrange_applicable)(rearrangement rearrange, + ddim dim0, INT vn, int n_pes); +INT XM(rearrange_ny)(rearrangement rearrange, ddim dim0, INT vn, int n_pes); + +/***********************************************************************/ + +#endif /* __IFFTW_MPI_H__ */ + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-bench.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-bench.c new file mode 100644 index 000000000..d4dd931c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-bench.c @@ -0,0 +1,844 @@ +/**************************************************************************/ +/* NOTE to users: this is the FFTW-MPI self-test and benchmark program. + It is probably NOT a good place to learn FFTW usage, since it has a + lot of added complexity in order to exercise and test the full API, + etcetera. We suggest reading the manual. */ +/**************************************************************************/ + +#include +#include +#include +#include "fftw3-mpi.h" +#include "tests/fftw-bench.h" + +#if defined(BENCHFFT_SINGLE) +# define BENCH_MPI_TYPE MPI_FLOAT +#elif defined(BENCHFFT_LDOUBLE) +# define BENCH_MPI_TYPE MPI_LONG_DOUBLE +#elif defined(BENCHFFT_QUAD) +# error MPI quad-precision type is unknown +#else +# define BENCH_MPI_TYPE MPI_DOUBLE +#endif + +#if SIZEOF_PTRDIFF_T == SIZEOF_INT +# define FFTW_MPI_PTRDIFF_T MPI_INT +#elif SIZEOF_PTRDIFF_T == SIZEOF_LONG +# define FFTW_MPI_PTRDIFF_T MPI_LONG +#elif SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG +# define FFTW_MPI_PTRDIFF_T MPI_LONG_LONG +#else +# error MPI type for ptrdiff_t is unknown +# define FFTW_MPI_PTRDIFF_T MPI_LONG +#endif + +static const char *mkversion(void) { return FFTW(version); } +static const char *mkcc(void) { return FFTW(cc); } +static const char *mkcodelet_optim(void) { return FFTW(codelet_optim); } +static const char *mknproc(void) { + static char buf[32]; + int ncpus; + MPI_Comm_size(MPI_COMM_WORLD, &ncpus); +#ifdef HAVE_SNPRINTF + snprintf(buf, 32, "%d", ncpus); +#else + sprintf(buf, "%d", ncpus); +#endif + return buf; +} + +BEGIN_BENCH_DOC +BENCH_DOC("name", "fftw3_mpi") +BENCH_DOCF("version", mkversion) +BENCH_DOCF("cc", mkcc) +BENCH_DOCF("codelet-optim", mkcodelet_optim) +BENCH_DOCF("nproc", mknproc) +END_BENCH_DOC + +static int n_pes = 1, my_pe = 0; + +/* global variables describing the shape of the data and its distribution */ +static int rnk; +static ptrdiff_t vn, iNtot, oNtot; +static ptrdiff_t *local_ni=0, *local_starti=0; +static ptrdiff_t *local_no=0, *local_starto=0; +static ptrdiff_t *all_local_ni=0, *all_local_starti=0; /* n_pes x rnk arrays */ +static ptrdiff_t *all_local_no=0, *all_local_starto=0; /* n_pes x rnk arrays */ +static ptrdiff_t *istrides = 0, *ostrides = 0; +static ptrdiff_t *total_ni=0, *total_no=0; +static int *isend_cnt = 0, *isend_off = 0; /* for MPI_Scatterv */ +static int *orecv_cnt = 0, *orecv_off = 0; /* for MPI_Gatherv */ + +static bench_real *local_in = 0, *local_out = 0; +static bench_real *all_local_in = 0, *all_local_out = 0; +static int all_local_in_alloc = 0, all_local_out_alloc = 0; +static FFTW(plan) plan_scramble_in = 0, plan_unscramble_out = 0; + +static void alloc_rnk(int rnk_) { + rnk = rnk_; + bench_free(local_ni); + if (rnk == 0) + local_ni = 0; + else + local_ni = (ptrdiff_t *) bench_malloc(sizeof(ptrdiff_t) * rnk + * (8 + n_pes * 4)); + + local_starti = local_ni + rnk; + local_no = local_ni + 2 * rnk; + local_starto = local_ni + 3 * rnk; + istrides = local_ni + 4 * rnk; + ostrides = local_ni + 5 * rnk; + total_ni = local_ni + 6 * rnk; + total_no = local_ni + 7 * rnk; + all_local_ni = local_ni + 8 * rnk; + all_local_starti = local_ni + (8 + n_pes) * rnk; + all_local_no = local_ni + (8 + 2 * n_pes) * rnk; + all_local_starto = local_ni + (8 + 3 * n_pes) * rnk; +} + +static void setup_gather_scatter(void) +{ + int i, j; + ptrdiff_t off; + + MPI_Gather(local_ni, rnk, FFTW_MPI_PTRDIFF_T, + all_local_ni, rnk, FFTW_MPI_PTRDIFF_T, + 0, MPI_COMM_WORLD); + MPI_Bcast(all_local_ni, rnk*n_pes, FFTW_MPI_PTRDIFF_T, 0, MPI_COMM_WORLD); + MPI_Gather(local_starti, rnk, FFTW_MPI_PTRDIFF_T, + all_local_starti, rnk, FFTW_MPI_PTRDIFF_T, + 0, MPI_COMM_WORLD); + MPI_Bcast(all_local_starti, rnk*n_pes, FFTW_MPI_PTRDIFF_T, 0, MPI_COMM_WORLD); + + MPI_Gather(local_no, rnk, FFTW_MPI_PTRDIFF_T, + all_local_no, rnk, FFTW_MPI_PTRDIFF_T, + 0, MPI_COMM_WORLD); + MPI_Bcast(all_local_no, rnk*n_pes, FFTW_MPI_PTRDIFF_T, 0, MPI_COMM_WORLD); + MPI_Gather(local_starto, rnk, FFTW_MPI_PTRDIFF_T, + all_local_starto, rnk, FFTW_MPI_PTRDIFF_T, + 0, MPI_COMM_WORLD); + MPI_Bcast(all_local_starto, rnk*n_pes, FFTW_MPI_PTRDIFF_T, 0, MPI_COMM_WORLD); + + off = 0; + for (i = 0; i < n_pes; ++i) { + ptrdiff_t N = vn; + for (j = 0; j < rnk; ++j) + N *= all_local_ni[i * rnk + j]; + isend_cnt[i] = N; + isend_off[i] = off; + off += N; + } + iNtot = off; + all_local_in_alloc = 1; + + istrides[rnk - 1] = vn; + for (j = rnk - 2; j >= 0; --j) + istrides[j] = total_ni[j + 1] * istrides[j + 1]; + + off = 0; + for (i = 0; i < n_pes; ++i) { + ptrdiff_t N = vn; + for (j = 0; j < rnk; ++j) + N *= all_local_no[i * rnk + j]; + orecv_cnt[i] = N; + orecv_off[i] = off; + off += N; + } + oNtot = off; + all_local_out_alloc = 1; + + ostrides[rnk - 1] = vn; + for (j = rnk - 2; j >= 0; --j) + ostrides[j] = total_no[j + 1] * ostrides[j + 1]; +} + +static void copy_block_out(const bench_real *in, + int rnk, ptrdiff_t *n, ptrdiff_t *start, + ptrdiff_t is, ptrdiff_t *os, ptrdiff_t vn, + bench_real *out) +{ + ptrdiff_t i; + if (rnk == 0) { + for (i = 0; i < vn; ++i) + out[i] = in[i]; + } + else if (rnk == 1) { /* this case is just an optimization */ + ptrdiff_t j; + out += start[0] * os[0]; + for (j = 0; j < n[0]; ++j) { + for (i = 0; i < vn; ++i) + out[i] = in[i]; + in += is; + out += os[0]; + } + } + else { + /* we should do n[0] for locality, but this way is simpler to code */ + for (i = 0; i < n[rnk - 1]; ++i) + copy_block_out(in + i * is, + rnk - 1, n, start, is * n[rnk - 1], os, vn, + out + (start[rnk - 1] + i) * os[rnk - 1]); + } +} + +static void copy_block_in(bench_real *in, + int rnk, ptrdiff_t *n, ptrdiff_t *start, + ptrdiff_t is, ptrdiff_t *os, ptrdiff_t vn, + const bench_real *out) +{ + ptrdiff_t i; + if (rnk == 0) { + for (i = 0; i < vn; ++i) + in[i] = out[i]; + } + else if (rnk == 1) { /* this case is just an optimization */ + ptrdiff_t j; + out += start[0] * os[0]; + for (j = 0; j < n[0]; ++j) { + for (i = 0; i < vn; ++i) + in[i] = out[i]; + in += is; + out += os[0]; + } + } + else { + /* we should do n[0] for locality, but this way is simpler to code */ + for (i = 0; i < n[rnk - 1]; ++i) + copy_block_in(in + i * is, + rnk - 1, n, start, is * n[rnk - 1], os, vn, + out + (start[rnk - 1] + i) * os[rnk - 1]); + } +} + +static void do_scatter_in(bench_real *in) +{ + bench_real *ali; + int i; + if (all_local_in_alloc) { + bench_free(all_local_in); + all_local_in = (bench_real*) bench_malloc(iNtot*sizeof(bench_real)); + all_local_in_alloc = 0; + } + ali = all_local_in; + for (i = 0; i < n_pes; ++i) { + copy_block_in(ali, + rnk, all_local_ni + i * rnk, + all_local_starti + i * rnk, + vn, istrides, vn, + in); + ali += isend_cnt[i]; + } + MPI_Scatterv(all_local_in, isend_cnt, isend_off, BENCH_MPI_TYPE, + local_in, isend_cnt[my_pe], BENCH_MPI_TYPE, + 0, MPI_COMM_WORLD); +} + +static void do_gather_out(bench_real *out) +{ + bench_real *alo; + int i; + + if (all_local_out_alloc) { + bench_free(all_local_out); + all_local_out = (bench_real*) bench_malloc(oNtot*sizeof(bench_real)); + all_local_out_alloc = 0; + } + MPI_Gatherv(local_out, orecv_cnt[my_pe], BENCH_MPI_TYPE, + all_local_out, orecv_cnt, orecv_off, BENCH_MPI_TYPE, + 0, MPI_COMM_WORLD); + MPI_Bcast(all_local_out, oNtot, BENCH_MPI_TYPE, 0, MPI_COMM_WORLD); + alo = all_local_out; + for (i = 0; i < n_pes; ++i) { + copy_block_out(alo, + rnk, all_local_no + i * rnk, + all_local_starto + i * rnk, + vn, ostrides, vn, + out); + alo += orecv_cnt[i]; + } +} + +static void alloc_local(ptrdiff_t nreal, int inplace) +{ + bench_free(local_in); + if (local_out != local_in) bench_free(local_out); + local_in = local_out = 0; + if (nreal > 0) { + ptrdiff_t i; + local_in = (bench_real*) bench_malloc(nreal * sizeof(bench_real)); + if (inplace) + local_out = local_in; + else + local_out = (bench_real*) bench_malloc(nreal * sizeof(bench_real)); + for (i = 0; i < nreal; ++i) local_in[i] = local_out[i] = 0.0; + } +} + +void after_problem_rcopy_from(bench_problem *p, bench_real *ri) +{ + UNUSED(p); + do_scatter_in(ri); + if (plan_scramble_in) FFTW(execute)(plan_scramble_in); +} + +void after_problem_rcopy_to(bench_problem *p, bench_real *ro) +{ + UNUSED(p); + if (plan_unscramble_out) FFTW(execute)(plan_unscramble_out); + do_gather_out(ro); +} + +void after_problem_ccopy_from(bench_problem *p, bench_real *ri, bench_real *ii) +{ + UNUSED(ii); + after_problem_rcopy_from(p, ri); +} + +void after_problem_ccopy_to(bench_problem *p, bench_real *ro, bench_real *io) +{ + UNUSED(io); + after_problem_rcopy_to(p, ro); +} + +void after_problem_hccopy_from(bench_problem *p, bench_real *ri, bench_real *ii) +{ + UNUSED(ii); + after_problem_rcopy_from(p, ri); +} + +void after_problem_hccopy_to(bench_problem *p, bench_real *ro, bench_real *io) +{ + UNUSED(io); + after_problem_rcopy_to(p, ro); +} + +static FFTW(plan) mkplan_transpose_local(ptrdiff_t nx, ptrdiff_t ny, + ptrdiff_t vn, + bench_real *in, bench_real *out) +{ + FFTW(iodim64) hdims[3]; + FFTW(r2r_kind) k[3]; + FFTW(plan) pln; + + hdims[0].n = nx; + hdims[0].is = ny * vn; + hdims[0].os = vn; + hdims[1].n = ny; + hdims[1].is = vn; + hdims[1].os = nx * vn; + hdims[2].n = vn; + hdims[2].is = 1; + hdims[2].os = 1; + k[0] = k[1] = k[2] = FFTW_R2HC; + pln = FFTW(plan_guru64_r2r)(0, 0, 3, hdims, in, out, k, FFTW_ESTIMATE); + BENCH_ASSERT(pln != 0); + return pln; +} + +static int tensor_rowmajor_transposedp(bench_tensor *t) +{ + bench_iodim *d; + int i; + + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); + if (t->rnk < 2) + return 0; + + d = t->dims; + if (d[0].is != d[1].is * d[1].n + || d[0].os != d[1].is + || d[1].os != d[0].os * d[0].n) + return 0; + if (t->rnk > 2 && d[1].is != d[2].is * d[2].n) + return 0; + for (i = 2; i + 1 < t->rnk; ++i) { + d = t->dims + i; + if (d[0].is != d[1].is * d[1].n + || d[0].os != d[1].os * d[1].n) + return 0; + } + + if (t->rnk > 2 && t->dims[t->rnk-1].is != t->dims[t->rnk-1].os) + return 0; + return 1; +} + +static int tensor_contiguousp(bench_tensor *t, int s) +{ + return (t->dims[t->rnk-1].is == s + && ((tensor_rowmajorp(t) && + t->dims[t->rnk-1].is == t->dims[t->rnk-1].os) + || tensor_rowmajor_transposedp(t))); +} + +static FFTW(plan) mkplan_complex(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln = 0; + int i; + ptrdiff_t ntot; + + vn = p->vecsz->rnk == 1 ? p->vecsz->dims[0].n : 1; + + if (p->sz->rnk < 1 + || p->split + || !tensor_contiguousp(p->sz, vn) + || tensor_rowmajor_transposedp(p->sz) + || p->vecsz->rnk > 1 + || (p->vecsz->rnk == 1 && (p->vecsz->dims[0].is != 1 + || p->vecsz->dims[0].os != 1))) + return 0; + + alloc_rnk(p->sz->rnk); + for (i = 0; i < rnk; ++i) { + total_ni[i] = total_no[i] = p->sz->dims[i].n; + local_ni[i] = local_no[i] = total_ni[i]; + local_starti[i] = local_starto[i] = 0; + } + if (rnk > 1) { + ptrdiff_t n, start, nT, startT; + ntot = FFTW(mpi_local_size_many_transposed) + (p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, FFTW_MPI_DEFAULT_BLOCK, + MPI_COMM_WORLD, + &n, &start, &nT, &startT); + if (flags & FFTW_MPI_TRANSPOSED_IN) { + local_ni[1] = nT; + local_starti[1] = startT; + } + else { + local_ni[0] = n; + local_starti[0] = start; + } + if (flags & FFTW_MPI_TRANSPOSED_OUT) { + local_no[1] = nT; + local_starto[1] = startT; + } + else { + local_no[0] = n; + local_starto[0] = start; + } + } + else if (rnk == 1) { + ntot = FFTW(mpi_local_size_many_1d) + (total_ni[0], vn, MPI_COMM_WORLD, p->sign, flags, + local_ni, local_starti, local_no, local_starto); + } + alloc_local(ntot * 2, p->in == p->out); + + pln = FFTW(mpi_plan_many_dft)(p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + (FFTW(complex) *) local_in, + (FFTW(complex) *) local_out, + MPI_COMM_WORLD, p->sign, flags); + + vn *= 2; + + if (rnk > 1) { + ptrdiff_t nrest = 1; + for (i = 2; i < rnk; ++i) nrest *= p->sz->dims[i].n; + if (flags & FFTW_MPI_TRANSPOSED_IN) + plan_scramble_in = mkplan_transpose_local( + p->sz->dims[0].n, local_ni[1], vn * nrest, + local_in, local_in); + if (flags & FFTW_MPI_TRANSPOSED_OUT) + plan_unscramble_out = mkplan_transpose_local( + local_no[1], p->sz->dims[0].n, vn * nrest, + local_out, local_out); + } + + return pln; +} + +static int tensor_real_contiguousp(bench_tensor *t, int sign, int s) +{ + return (t->dims[t->rnk-1].is == s + && ((tensor_real_rowmajorp(t, sign, 1) && + t->dims[t->rnk-1].is == t->dims[t->rnk-1].os))); +} + +static FFTW(plan) mkplan_real(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln = 0; + int i; + ptrdiff_t ntot; + + vn = p->vecsz->rnk == 1 ? p->vecsz->dims[0].n : 1; + + if (p->sz->rnk < 2 + || p->split + || !tensor_real_contiguousp(p->sz, p->sign, vn) + || tensor_rowmajor_transposedp(p->sz) + || p->vecsz->rnk > 1 + || (p->vecsz->rnk == 1 && (p->vecsz->dims[0].is != 1 + || p->vecsz->dims[0].os != 1))) + return 0; + + alloc_rnk(p->sz->rnk); + for (i = 0; i < rnk; ++i) { + total_ni[i] = total_no[i] = p->sz->dims[i].n; + local_ni[i] = local_no[i] = total_ni[i]; + local_starti[i] = local_starto[i] = 0; + } + local_ni[rnk-1] = local_no[rnk-1] = total_ni[rnk-1] = total_no[rnk-1] + = p->sz->dims[rnk-1].n / 2 + 1; + { + ptrdiff_t n, start, nT, startT; + ntot = FFTW(mpi_local_size_many_transposed) + (p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, FFTW_MPI_DEFAULT_BLOCK, + MPI_COMM_WORLD, + &n, &start, &nT, &startT); + if (flags & FFTW_MPI_TRANSPOSED_IN) { + local_ni[1] = nT; + local_starti[1] = startT; + } + else { + local_ni[0] = n; + local_starti[0] = start; + } + if (flags & FFTW_MPI_TRANSPOSED_OUT) { + local_no[1] = nT; + local_starto[1] = startT; + } + else { + local_no[0] = n; + local_starto[0] = start; + } + } + alloc_local(ntot * 2, p->in == p->out); + + total_ni[rnk - 1] = p->sz->dims[rnk - 1].n; + if (p->sign < 0) + pln = FFTW(mpi_plan_many_dft_r2c)(p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + local_in, + (FFTW(complex) *) local_out, + MPI_COMM_WORLD, flags); + else + pln = FFTW(mpi_plan_many_dft_c2r)(p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + (FFTW(complex) *) local_in, + local_out, + MPI_COMM_WORLD, flags); + + total_ni[rnk - 1] = p->sz->dims[rnk - 1].n / 2 + 1; + vn *= 2; + + { + ptrdiff_t nrest = 1; + for (i = 2; i < rnk; ++i) nrest *= total_ni[i]; + if (flags & FFTW_MPI_TRANSPOSED_IN) + plan_scramble_in = mkplan_transpose_local( + total_ni[0], local_ni[1], vn * nrest, + local_in, local_in); + if (flags & FFTW_MPI_TRANSPOSED_OUT) + plan_unscramble_out = mkplan_transpose_local( + local_no[1], total_ni[0], vn * nrest, + local_out, local_out); + } + + return pln; +} + +static FFTW(plan) mkplan_transpose(bench_problem *p, unsigned flags) +{ + ptrdiff_t ntot, nx, ny; + int ix=0, iy=1, i; + const bench_iodim *d = p->vecsz->dims; + FFTW(plan) pln; + + if (p->vecsz->rnk == 3) { + for (i = 0; i < 3; ++i) + if (d[i].is == 1 && d[i].os == 1) { + vn = d[i].n; + ix = (i + 1) % 3; + iy = (i + 2) % 3; + break; + } + if (i == 3) return 0; + } + else { + vn = 1; + ix = 0; + iy = 1; + } + + if (d[ix].is == d[iy].n * vn && d[ix].os == vn + && d[iy].os == d[ix].n * vn && d[iy].is == vn) { + nx = d[ix].n; + ny = d[iy].n; + } + else if (d[iy].is == d[ix].n * vn && d[iy].os == vn + && d[ix].os == d[iy].n * vn && d[ix].is == vn) { + nx = d[iy].n; + ny = d[ix].n; + } + else + return 0; + + alloc_rnk(2); + ntot = vn * FFTW(mpi_local_size_2d_transposed)(nx, ny, MPI_COMM_WORLD, + &local_ni[0], + &local_starti[0], + &local_no[0], + &local_starto[0]); + local_ni[1] = ny; + local_starti[1] = 0; + local_no[1] = nx; + local_starto[1] = 0; + total_ni[0] = nx; total_ni[1] = ny; + total_no[1] = nx; total_no[0] = ny; + alloc_local(ntot, p->in == p->out); + + pln = FFTW(mpi_plan_many_transpose)(nx, ny, vn, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + local_in, local_out, + MPI_COMM_WORLD, flags); + + if (flags & FFTW_MPI_TRANSPOSED_IN) + plan_scramble_in = mkplan_transpose_local(local_ni[0], ny, vn, + local_in, local_in); + if (flags & FFTW_MPI_TRANSPOSED_OUT) + plan_unscramble_out = mkplan_transpose_local + (nx, local_no[0], vn, local_out, local_out); + +#if 0 + if (pln && vn == 1) { + int i, j; + bench_real *ri = (bench_real *) p->in; + bench_real *ro = (bench_real *) p->out; + if (!ri || !ro) return pln; + setup_gather_scatter(); + for (i = 0; i < nx * ny; ++i) + ri[i] = i; + after_problem_rcopy_from(p, ri); + FFTW(execute)(pln); + after_problem_rcopy_to(p, ro); + if (my_pe == 0) { + for (i = 0; i < nx; ++i) { + for (j = 0; j < ny; ++j) + printf(" %3g", ro[j * nx + i]); + printf("\n"); + } + } + } +#endif + + return pln; +} + +static FFTW(plan) mkplan_r2r(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln = 0; + int i; + ptrdiff_t ntot; + FFTW(r2r_kind) *k; + + if ((p->sz->rnk == 0 || (p->sz->rnk == 1 && p->sz->dims[0].n == 1)) + && p->vecsz->rnk >= 2 && p->vecsz->rnk <= 3) + return mkplan_transpose(p, flags); + + vn = p->vecsz->rnk == 1 ? p->vecsz->dims[0].n : 1; + + if (p->sz->rnk < 1 + || p->split + || !tensor_contiguousp(p->sz, vn) + || tensor_rowmajor_transposedp(p->sz) + || p->vecsz->rnk > 1 + || (p->vecsz->rnk == 1 && (p->vecsz->dims[0].is != 1 + || p->vecsz->dims[0].os != 1))) + return 0; + + alloc_rnk(p->sz->rnk); + for (i = 0; i < rnk; ++i) { + total_ni[i] = total_no[i] = p->sz->dims[i].n; + local_ni[i] = local_no[i] = total_ni[i]; + local_starti[i] = local_starto[i] = 0; + } + if (rnk > 1) { + ptrdiff_t n, start, nT, startT; + ntot = FFTW(mpi_local_size_many_transposed) + (p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, FFTW_MPI_DEFAULT_BLOCK, + MPI_COMM_WORLD, + &n, &start, &nT, &startT); + if (flags & FFTW_MPI_TRANSPOSED_IN) { + local_ni[1] = nT; + local_starti[1] = startT; + } + else { + local_ni[0] = n; + local_starti[0] = start; + } + if (flags & FFTW_MPI_TRANSPOSED_OUT) { + local_no[1] = nT; + local_starto[1] = startT; + } + else { + local_no[0] = n; + local_starto[0] = start; + } + } + else if (rnk == 1) { + ntot = FFTW(mpi_local_size_many_1d) + (total_ni[0], vn, MPI_COMM_WORLD, p->sign, flags, + local_ni, local_starti, local_no, local_starto); + } + alloc_local(ntot, p->in == p->out); + + k = (FFTW(r2r_kind) *) bench_malloc(sizeof(FFTW(r2r_kind)) * p->sz->rnk); + for (i = 0; i < p->sz->rnk; ++i) + switch (p->k[i]) { + case R2R_R2HC: k[i] = FFTW_R2HC; break; + case R2R_HC2R: k[i] = FFTW_HC2R; break; + case R2R_DHT: k[i] = FFTW_DHT; break; + case R2R_REDFT00: k[i] = FFTW_REDFT00; break; + case R2R_REDFT01: k[i] = FFTW_REDFT01; break; + case R2R_REDFT10: k[i] = FFTW_REDFT10; break; + case R2R_REDFT11: k[i] = FFTW_REDFT11; break; + case R2R_RODFT00: k[i] = FFTW_RODFT00; break; + case R2R_RODFT01: k[i] = FFTW_RODFT01; break; + case R2R_RODFT10: k[i] = FFTW_RODFT10; break; + case R2R_RODFT11: k[i] = FFTW_RODFT11; break; + default: BENCH_ASSERT(0); + } + + pln = FFTW(mpi_plan_many_r2r)(p->sz->rnk, total_ni, vn, + FFTW_MPI_DEFAULT_BLOCK, + FFTW_MPI_DEFAULT_BLOCK, + local_in, local_out, + MPI_COMM_WORLD, k, flags); + bench_free(k); + + if (rnk > 1) { + ptrdiff_t nrest = 1; + for (i = 2; i < rnk; ++i) nrest *= p->sz->dims[i].n; + if (flags & FFTW_MPI_TRANSPOSED_IN) + plan_scramble_in = mkplan_transpose_local( + p->sz->dims[0].n, local_ni[1], vn * nrest, + local_in, local_in); + if (flags & FFTW_MPI_TRANSPOSED_OUT) + plan_unscramble_out = mkplan_transpose_local( + local_no[1], p->sz->dims[0].n, vn * nrest, + local_out, local_out); + } + + return pln; +} + +FFTW(plan) mkplan(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln = 0; + FFTW(destroy_plan)(plan_scramble_in); plan_scramble_in = 0; + FFTW(destroy_plan)(plan_unscramble_out); plan_unscramble_out = 0; + if (p->scrambled_in) { + if (p->sz->rnk == 1 && p->sz->dims[0].n != 1) + flags |= FFTW_MPI_SCRAMBLED_IN; + else + flags |= FFTW_MPI_TRANSPOSED_IN; + } + if (p->scrambled_out) { + if (p->sz->rnk == 1 && p->sz->dims[0].n != 1) + flags |= FFTW_MPI_SCRAMBLED_OUT; + else + flags |= FFTW_MPI_TRANSPOSED_OUT; + } + switch (p->kind) { + case PROBLEM_COMPLEX: + pln =mkplan_complex(p, flags); + break; + case PROBLEM_REAL: + pln = mkplan_real(p, flags); + break; + case PROBLEM_R2R: + pln = mkplan_r2r(p, flags); + break; + default: BENCH_ASSERT(0); + } + if (pln) setup_gather_scatter(); + return pln; +} + +void main_init(int *argc, char ***argv) +{ +#ifdef HAVE_SMP +# if MPI_VERSION >= 2 /* for MPI_Init_thread */ + int provided; + MPI_Init_thread(argc, argv, MPI_THREAD_FUNNELED, &provided); + threads_ok = provided >= MPI_THREAD_FUNNELED; +# else + MPI_Init(argc, argv); + threads_ok = 0; +# endif +#else + MPI_Init(argc, argv); +#endif + MPI_Comm_rank(MPI_COMM_WORLD, &my_pe); + MPI_Comm_size(MPI_COMM_WORLD, &n_pes); + if (my_pe != 0) verbose = -999; + no_speed_allocation = 1; /* so we can benchmark transforms > memory */ + always_pad_real = 1; /* out-of-place real transforms are padded */ + isend_cnt = (int *) bench_malloc(sizeof(int) * n_pes); + isend_off = (int *) bench_malloc(sizeof(int) * n_pes); + orecv_cnt = (int *) bench_malloc(sizeof(int) * n_pes); + orecv_off = (int *) bench_malloc(sizeof(int) * n_pes); + + /* init_threads must be called before any other FFTW function, + including mpi_init, because it has to register the threads hooks + before the planner is initalized */ +#ifdef HAVE_SMP + if (threads_ok) { BENCH_ASSERT(FFTW(init_threads)()); } +#endif + FFTW(mpi_init)(); +} + +void initial_cleanup(void) +{ + alloc_rnk(0); + alloc_local(0, 0); + bench_free(all_local_in); all_local_in = 0; + bench_free(all_local_out); all_local_out = 0; + bench_free(isend_off); isend_off = 0; + bench_free(isend_cnt); isend_cnt = 0; + bench_free(orecv_off); orecv_off = 0; + bench_free(orecv_cnt); orecv_cnt = 0; + FFTW(destroy_plan)(plan_scramble_in); plan_scramble_in = 0; + FFTW(destroy_plan)(plan_unscramble_out); plan_unscramble_out = 0; +} + +void final_cleanup(void) +{ + MPI_Finalize(); +} + +void bench_exit(int status) +{ + MPI_Abort(MPI_COMM_WORLD, status); +} + +double bench_cost_postprocess(double cost) +{ + double cost_max; + MPI_Allreduce(&cost, &cost_max, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); + return cost_max; +} + + +int import_wisdom(FILE *f) +{ + int success = 1, sall; + if (my_pe == 0) success = FFTW(import_wisdom_from_file)(f); + FFTW(mpi_broadcast_wisdom)(MPI_COMM_WORLD); + MPI_Allreduce(&success, &sall, 1, MPI_INT, MPI_LAND, MPI_COMM_WORLD); + return sall; +} + +void export_wisdom(FILE *f) +{ + FFTW(mpi_gather_wisdom)(MPI_COMM_WORLD); + if (my_pe == 0) FFTW(export_wisdom_to_file)(f); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-dft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-dft.h new file mode 100644 index 000000000..0e132f31e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-dft.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* problem.c: */ +typedef struct { + problem super; + dtensor *sz; + INT vn; /* vector length (vector stride 1) */ + R *I, *O; /* contiguous interleaved arrays */ + + int sign; /* FFTW_FORWARD / FFTW_BACKWARD */ + unsigned flags; /* TRANSPOSED_IN/OUT meaningful for rnk>1 only + SCRAMBLED_IN/OUT meaningful for 1d transforms only */ + + MPI_Comm comm; +} problem_mpi_dft; + +problem *XM(mkproblem_dft)(const dtensor *sz, INT vn, + R *I, R *O, MPI_Comm comm, + int sign, unsigned flags); +problem *XM(mkproblem_dft_d)(dtensor *sz, INT vn, + R *I, R *O, MPI_Comm comm, + int sign, unsigned flags); + +/* solve.c: */ +void XM(dft_solve)(const plan *ego_, const problem *p_); + +/* plans have same operands as rdft plans, so just re-use */ +typedef plan_rdft plan_mpi_dft; +#define MKPLAN_MPI_DFT(type, adt, apply) \ + (type *)X(mkplan_rdft)(sizeof(type), adt, apply) + +int XM(dft_serial_applicable)(const problem_mpi_dft *p); + +/* various solvers */ +void XM(dft_rank_geq2_register)(planner *p); +void XM(dft_rank_geq2_transposed_register)(planner *p); +void XM(dft_serial_register)(planner *p); +void XM(dft_rank1_bigvec_register)(planner *p); +void XM(dft_rank1_register)(planner *p); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-rdft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-rdft.h new file mode 100644 index 000000000..c80eb5046 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-rdft.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* problem.c: */ +typedef struct { + problem super; + dtensor *sz; + INT vn; /* vector length (vector stride 1) */ + R *I, *O; /* contiguous interleaved arrays */ + + + unsigned flags; /* TRANSPOSED_IN/OUT meaningful for rnk>1 only + SCRAMBLED_IN/OUT meaningful for 1d transforms only */ + + MPI_Comm comm; + +#if defined(STRUCT_HACK_KR) + rdft_kind kind[1]; +#elif defined(STRUCT_HACK_C99) + rdft_kind kind[]; +#else + rdft_kind *kind; +#endif +} problem_mpi_rdft; + +problem *XM(mkproblem_rdft)(const dtensor *sz, INT vn, + R *I, R *O, MPI_Comm comm, + const rdft_kind *kind, unsigned flags); +problem *XM(mkproblem_rdft_d)(dtensor *sz, INT vn, + R *I, R *O, MPI_Comm comm, + const rdft_kind *kind, unsigned flags); + +/* solve.c: */ +void XM(rdft_solve)(const plan *ego_, const problem *p_); + +/* plans have same operands as rdft plans, so just re-use */ +typedef plan_rdft plan_mpi_rdft; +#define MKPLAN_MPI_RDFT(type, adt, apply) \ + (type *)X(mkplan_rdft)(sizeof(type), adt, apply) + +int XM(rdft_serial_applicable)(const problem_mpi_rdft *p); + +/* various solvers */ +void XM(rdft_rank_geq2_register)(planner *p); +void XM(rdft_rank_geq2_transposed_register)(planner *p); +void XM(rdft_serial_register)(planner *p); +void XM(rdft_rank1_bigvec_register)(planner *p); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-rdft2.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-rdft2.h new file mode 100644 index 000000000..ad07fd58b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-rdft2.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* r2c and c2r transforms. The sz dtensor, as usual, gives the size + of the "logical" complex array. For the last dimension N, however, + only N/2+1 complex numbers are stored for the complex data. Moreover, + for the real data, the last dimension is *always* padded to a size + 2*(N/2+1). (Contrast this with the serial API, where there is only + padding for in-place plans.) */ + +/* problem.c: */ +typedef struct { + problem super; + dtensor *sz; + INT vn; /* vector length (vector stride 1) */ + R *I, *O; /* contiguous interleaved arrays */ + + rdft_kind kind; /* assert(kind < DHT) */ + unsigned flags; /* TRANSPOSED_IN/OUT meaningful for rnk>1 only + SCRAMBLED_IN/OUT meaningful for 1d transforms only */ + + MPI_Comm comm; +} problem_mpi_rdft2; + +problem *XM(mkproblem_rdft2)(const dtensor *sz, INT vn, + R *I, R *O, MPI_Comm comm, + rdft_kind kind, unsigned flags); +problem *XM(mkproblem_rdft2_d)(dtensor *sz, INT vn, + R *I, R *O, MPI_Comm comm, + rdft_kind kind, unsigned flags); + +/* solve.c: */ +void XM(rdft2_solve)(const plan *ego_, const problem *p_); + +/* plans have same operands as rdft plans, so just re-use */ +typedef plan_rdft plan_mpi_rdft2; +#define MKPLAN_MPI_RDFT2(type, adt, apply) \ + (type *)X(mkplan_rdft)(sizeof(type), adt, apply) + +int XM(rdft2_serial_applicable)(const problem_mpi_rdft2 *p); + +/* various solvers */ +void XM(rdft2_rank_geq2_register)(planner *p); +void XM(rdft2_rank_geq2_transposed_register)(planner *p); +void XM(rdft2_serial_register)(planner *p); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-transpose.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-transpose.h new file mode 100644 index 000000000..37e8d6501 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/mpi-transpose.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* tproblem.c: */ +typedef struct { + problem super; + INT vn; /* vector length (vector stride 1) */ + INT nx, ny; /* nx x ny transposed to ny x nx */ + R *I, *O; /* contiguous real arrays (both same size!) */ + + unsigned flags; /* TRANSPOSED_IN: input is *locally* transposed + TRANSPOSED_OUT: output is *locally* transposed */ + + INT block, tblock; /* block size, slab decomposition; + tblock is for transposed blocks on output */ + + MPI_Comm comm; +} problem_mpi_transpose; + +problem *XM(mkproblem_transpose)(INT nx, INT ny, INT vn, + R *I, R *O, + INT block, INT tblock, + MPI_Comm comm, + unsigned flags); + +/* tsolve.c: */ +void XM(transpose_solve)(const plan *ego_, const problem *p_); + +/* plans have same operands as rdft plans, so just re-use */ +typedef plan_rdft plan_mpi_transpose; +#define MKPLAN_MPI_TRANSPOSE(type, adt, apply) \ + (type *)X(mkplan_rdft)(sizeof(type), adt, apply) + +/* transpose-pairwise.c: */ +int XM(mkplans_posttranspose)(const problem_mpi_transpose *p, planner *plnr, + R *I, R *O, int my_pe, + plan **cld2, plan **cld2rest, plan **cld3, + INT *rest_Ioff, INT *rest_Ooff); +/* various solvers */ +void XM(transpose_pairwise_register)(planner *p); +void XM(transpose_alltoall_register)(planner *p); +void XM(transpose_recurse_register)(planner *p); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-problem.c new file mode 100644 index 000000000..c3b209e7d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-problem.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-rdft.h" + +static void destroy(problem *ego_) +{ + problem_mpi_rdft *ego = (problem_mpi_rdft *) ego_; + XM(dtensor_destroy)(ego->sz); + MPI_Comm_free(&ego->comm); +#if !defined(STRUCT_HACK_C99) && !defined(STRUCT_HACK_KR) + X(ifree0)(ego->kind); +#endif + X(ifree)(ego_); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_mpi_rdft *p = (const problem_mpi_rdft *) p_; + int i; + X(md5puts)(m, "mpi-dft"); + X(md5int)(m, p->I == p->O); + /* don't include alignment -- may differ between processes + X(md5int)(m, X(ialignment_of)(p->I)); + X(md5int)(m, X(ialignment_of)(p->O)); + ... note that applicability of MPI plans does not depend + on alignment (although optimality may, in principle). */ + XM(dtensor_md5)(m, p->sz); + X(md5INT)(m, p->vn); + for (i = 0; i < p->sz->rnk; ++i) + X(md5int)(m, p->kind[i]); + X(md5int)(m, p->flags); + MPI_Comm_size(p->comm, &i); X(md5int)(m, i); + A(XM(md5_equal)(*m, p->comm)); +} + +static void print(const problem *ego_, printer *p) +{ + const problem_mpi_rdft *ego = (const problem_mpi_rdft *) ego_; + int i; + p->print(p, "(mpi-rdft %d %d %d ", + ego->I == ego->O, + X(ialignment_of)(ego->I), + X(ialignment_of)(ego->O)); + XM(dtensor_print)(ego->sz, p); + for (i = 0; i < ego->sz->rnk; ++i) + p->print(p, " %d", (int)ego->kind[i]); + p->print(p, " %D %d", ego->vn, ego->flags); + MPI_Comm_size(ego->comm, &i); p->print(p, " %d)", i); +} + +static void zero(const problem *ego_) +{ + const problem_mpi_rdft *ego = (const problem_mpi_rdft *) ego_; + R *I = ego->I; + INT i, N; + int my_pe; + + MPI_Comm_rank(ego->comm, &my_pe); + N = ego->vn * XM(total_block)(ego->sz, IB, my_pe); + for (i = 0; i < N; ++i) I[i] = K(0.0); +} + +static const problem_adt padt = +{ + PROBLEM_MPI_RDFT, + hash, + zero, + print, + destroy +}; + +problem *XM(mkproblem_rdft)(const dtensor *sz, INT vn, + R *I, R *O, + MPI_Comm comm, + const rdft_kind *kind, unsigned flags) +{ + problem_mpi_rdft *ego; + int i, rnk = sz->rnk; + int n_pes; + + A(XM(dtensor_validp)(sz) && FINITE_RNK(sz->rnk)); + MPI_Comm_size(comm, &n_pes); + A(n_pes >= XM(num_blocks_total)(sz, IB) + && n_pes >= XM(num_blocks_total)(sz, OB)); + A(vn >= 0); + +#if defined(STRUCT_HACK_KR) + ego = (problem_mpi_rdft *) X(mkproblem)(sizeof(problem_mpi_rdft) + + sizeof(rdft_kind) + * (rnk > 0 ? rnk - 1 : 0), &padt); +#elif defined(STRUCT_HACK_C99) + ego = (problem_mpi_rdft *) X(mkproblem)(sizeof(problem_mpi_rdft) + + sizeof(rdft_kind) * rnk, &padt); +#else + ego = (problem_mpi_rdft *) X(mkproblem)(sizeof(problem_mpi_rdft), &padt); + ego->kind = (rdft_kind *) MALLOC(sizeof(rdft_kind) * rnk, PROBLEMS); +#endif + + /* enforce pointer equality if untainted pointers are equal */ + if (UNTAINT(I) == UNTAINT(O)) + I = O = JOIN_TAINT(I, O); + + ego->sz = XM(dtensor_canonical)(sz, 0); + ego->vn = vn; + ego->I = I; + ego->O = O; + for (i = 0; i< ego->sz->rnk; ++i) + ego->kind[i] = kind[i]; + + /* canonicalize: replace TRANSPOSED_IN with TRANSPOSED_OUT by + swapping the first two dimensions (for rnk > 1) */ + if ((flags & TRANSPOSED_IN) && ego->sz->rnk > 1) { + rdft_kind k = ego->kind[0]; + ddim dim0 = ego->sz->dims[0]; + ego->sz->dims[0] = ego->sz->dims[1]; + ego->sz->dims[1] = dim0; + ego->kind[0] = ego->kind[1]; + ego->kind[1] = k; + flags &= ~TRANSPOSED_IN; + flags ^= TRANSPOSED_OUT; + } + ego->flags = flags; + + MPI_Comm_dup(comm, &ego->comm); + + return &(ego->super); +} + +problem *XM(mkproblem_rdft_d)(dtensor *sz, INT vn, + R *I, R *O, + MPI_Comm comm, + const rdft_kind *kind, unsigned flags) +{ + problem *p = XM(mkproblem_rdft)(sz, vn, I, O, comm, kind, flags); + XM(dtensor_destroy)(sz); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank-geq2-transposed.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank-geq2-transposed.c new file mode 100644 index 000000000..763fff79e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank-geq2-transposed.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex RDFTs of rank >= 2, for the case where we are distributed + across the first dimension only, and the output is transposed both + in data distribution and in ordering (for the first 2 dimensions). + + (Note that we don't have to handle the case where the input is + transposed, since this is equivalent to transposed output with the + first two dimensions swapped, and is automatically canonicalized as + such by rdft-problem.c. */ + +#include "mpi-rdft.h" +#include "mpi-transpose.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_rdft super; + + plan *cld1, *cldt, *cld2; + INT roff, ioff; + int preserve_input; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld1, *cld2, *cldt; + + /* RDFT local dimensions */ + cld1 = (plan_rdft *) ego->cld1; + if (ego->preserve_input) { + cld1->apply(ego->cld1, I, O); + I = O; + } + else + cld1->apply(ego->cld1, I, I); + + /* global transpose */ + cldt = (plan_rdft *) ego->cldt; + cldt->apply(ego->cldt, I, O); + + /* RDFT final local dimension */ + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, O, O); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_rdft *p = (const problem_mpi_rdft *) p_; + return (1 + && p->sz->rnk > 1 + && p->flags == TRANSPOSED_OUT + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && XM(is_local_after)(1, p->sz, IB) + && XM(is_local_after)(2, p->sz, OB) + && XM(num_blocks)(p->sz->dims[0].n, p->sz->dims[0].b[OB]) == 1 + && (!NO_SLOWP(plnr) /* slow if rdft-serial is applicable */ + || !XM(rdft_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cldt, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cldt); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-rdft-rank-geq2-transposed%s%(%p%)%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", + ego->cld1, ego->cldt, ego->cld2); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_rdft *p; + P *pln; + plan *cld1 = 0, *cldt = 0, *cld2 = 0; + R *I, *O, *I2; + tensor *sz; + int i, my_pe, n_pes; + INT nrest; + static const plan_adt padt = { + XM(rdft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_rdft *) p_; + + I2 = I = p->I; + O = p->O; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) + I = O; + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + sz = X(mktensor)(p->sz->rnk - 1); /* tensor of last rnk-1 dimensions */ + i = p->sz->rnk - 2; A(i >= 0); + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = p->vn; + for (--i; i >= 0; --i) { + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = sz->dims[i+1].n * sz->dims[i+1].is; + } + nrest = 1; for (i = 1; i < sz->rnk; ++i) nrest *= sz->dims[i].n; + { + INT is = sz->dims[0].n * sz->dims[0].is; + INT b = XM(block)(p->sz->dims[0].n, p->sz->dims[0].b[IB], my_pe); + cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)(sz, + X(mktensor_2d)(b, is, is, + p->vn, 1, 1), + I2, I, p->kind + 1)); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + nrest *= p->vn; + cldt = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + p->sz->dims[0].n, p->sz->dims[1].n, nrest, + I, O, + p->sz->dims[0].b[IB], p->sz->dims[1].b[OB], + p->comm, 0)); + if (XM(any_true)(!cldt, p->comm)) goto nada; + + { + INT is = p->sz->dims[0].n * nrest; + INT b = XM(block)(p->sz->dims[1].n, p->sz->dims[1].b[OB], my_pe); + cld2 = X(mkplan_d)(plnr, + X(mkproblem_rdft_1_d)(X(mktensor_1d)( + p->sz->dims[0].n, + nrest, nrest), + X(mktensor_2d)(b, is, is, + nrest, 1, 1), + O, O, p->kind[0])); + if (XM(any_true)(!cld2, p->comm)) goto nada; + } + + pln = MKPLAN_MPI_RDFT(P, &padt, apply); + pln->cld1 = cld1; + pln->cldt = cldt; + pln->cld2 = cld2; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + X(ops_add2)(&cldt->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cldt); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(rdft_rank_geq2_transposed_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank-geq2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank-geq2.c new file mode 100644 index 000000000..1f38c1ddf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank-geq2.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex RDFTs of rank >= 2, for the case where we are distributed + across the first dimension only, and the output is not transposed. */ + +#include "mpi-rdft.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_rdft super; + + plan *cld1, *cld2; + int preserve_input; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld1, *cld2; + + /* RDFT local dimensions */ + cld1 = (plan_rdft *) ego->cld1; + if (ego->preserve_input) { + cld1->apply(ego->cld1, I, O); + I = O; + } + else + cld1->apply(ego->cld1, I, I); + + /* RDFT non-local dimension (via rdft-rank1-bigvec, usually): */ + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, I, O); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_rdft *p = (const problem_mpi_rdft *) p_; + return (1 + && p->sz->rnk > 1 + && p->flags == 0 /* TRANSPOSED/SCRAMBLED_IN/OUT not supported */ + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && XM(is_local_after)(1, p->sz, IB) + && XM(is_local_after)(1, p->sz, OB) + && (!NO_SLOWP(plnr) /* slow if rdft-serial is applicable */ + || !XM(rdft_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-rdft-rank-geq2%s%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", ego->cld1, ego->cld2); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_rdft *p; + P *pln; + plan *cld1 = 0, *cld2 = 0; + R *I, *O, *I2; + tensor *sz; + dtensor *sz2; + int i, my_pe, n_pes; + INT nrest; + static const plan_adt padt = { + XM(rdft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_rdft *) p_; + + I2 = I = p->I; + O = p->O; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) + I = O; + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + sz = X(mktensor)(p->sz->rnk - 1); /* tensor of last rnk-1 dimensions */ + i = p->sz->rnk - 2; A(i >= 0); + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = p->vn; + for (--i; i >= 0; --i) { + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = sz->dims[i+1].n * sz->dims[i+1].is; + } + nrest = X(tensor_sz)(sz); + { + INT is = sz->dims[0].n * sz->dims[0].is; + INT b = XM(block)(p->sz->dims[0].n, p->sz->dims[0].b[IB], my_pe); + cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)(sz, + X(mktensor_2d)(b, is, is, + p->vn, 1, 1), + I2, I, p->kind + 1)); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + sz2 = XM(mkdtensor)(1); /* tensor for first (distributed) dimension */ + sz2->dims[0] = p->sz->dims[0]; + cld2 = X(mkplan_d)(plnr, XM(mkproblem_rdft_d)(sz2, nrest * p->vn, + I, O, + p->comm, p->kind, + RANK1_BIGVEC_ONLY)); + if (XM(any_true)(!cld2, p->comm)) goto nada; + + pln = MKPLAN_MPI_RDFT(P, &padt, apply); + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(rdft_rank_geq2_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank1-bigvec.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank1-bigvec.c new file mode 100644 index 000000000..0ad967cd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-rank1-bigvec.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex RDFTs of rank == 1 when the vector length vn is >= # processes. + In this case, we don't need to use a six-step type algorithm, and can + instead transpose the RDFT dimension with the vector dimension to + make the RDFT local. */ + +#include "mpi-rdft.h" +#include "mpi-transpose.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ + rearrangement rearrange; +} S; + +typedef struct { + plan_mpi_rdft super; + + plan *cldt_before, *cld, *cldt_after; + int preserve_input; + rearrangement rearrange; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld, *cldt_before, *cldt_after; + + /* global transpose */ + cldt_before = (plan_rdft *) ego->cldt_before; + cldt_before->apply(ego->cldt_before, I, O); + + if (ego->preserve_input) I = O; + + /* 1d RDFT(s) */ + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, O, I); + + /* global transpose */ + cldt_after = (plan_rdft *) ego->cldt_after; + cldt_after->apply(ego->cldt_after, I, O); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_rdft *p = (const problem_mpi_rdft *) p_; + int n_pes; + MPI_Comm_size(p->comm, &n_pes); + return (1 + && p->sz->rnk == 1 + && !(p->flags & ~RANK1_BIGVEC_ONLY) + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + +#if 0 /* don't need this check since no other rank-1 rdft solver */ + && (p->vn >= n_pes /* TODO: relax this, using more memory? */ + || (p->flags & RANK1_BIGVEC_ONLY)) +#endif + + && XM(rearrange_applicable)(ego->rearrange, + p->sz->dims[0], p->vn, n_pes) + + && (!NO_SLOWP(plnr) /* slow if rdft-serial is applicable */ + || !XM(rdft_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldt_before, wakefulness); + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldt_after, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldt_after); + X(plan_destroy_internal)(ego->cld); + X(plan_destroy_internal)(ego->cldt_before); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const char descrip[][16] = { "contig", "discontig", "square-after", + "square-middle", "square-before" }; + p->print(p, "(mpi-rdft-rank1-bigvec/%s%s %(%p%) %(%p%) %(%p%))", + descrip[ego->rearrange], ego->preserve_input==2 ?"/p":"", + ego->cldt_before, ego->cld, ego->cldt_after); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_rdft *p; + P *pln; + plan *cld = 0, *cldt_before = 0, *cldt_after = 0; + R *I, *O; + INT yblock, yb, nx, ny, vn; + int my_pe, n_pes; + static const plan_adt padt = { + XM(rdft_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_rdft *) p_; + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + nx = p->sz->dims[0].n; + if (!(ny = XM(rearrange_ny)(ego->rearrange, p->sz->dims[0],p->vn,n_pes))) + return (plan *) 0; + vn = p->vn / ny; + A(ny * vn == p->vn); + + yblock = XM(default_block)(ny, n_pes); + cldt_before = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + nx, ny, vn, + I = p->I, O = p->O, + p->sz->dims[0].b[IB], yblock, + p->comm, 0)); + if (XM(any_true)(!cldt_before, p->comm)) goto nada; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) { I = O; } + + yb = XM(block)(ny, yblock, my_pe); + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_1_d)(X(mktensor_1d)(nx, vn, vn), + X(mktensor_2d)(yb, vn*nx, vn*nx, + vn, 1, 1), + O, I, p->kind[0])); + if (XM(any_true)(!cld, p->comm)) goto nada; + + cldt_after = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + ny, nx, vn, + I, O, + yblock, p->sz->dims[0].b[OB], + p->comm, 0)); + if (XM(any_true)(!cldt_after, p->comm)) goto nada; + + pln = MKPLAN_MPI_RDFT(P, &padt, apply); + + pln->cldt_before = cldt_before; + pln->cld = cld; + pln->cldt_after = cldt_after; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->rearrange = ego->rearrange; + + X(ops_add)(&cldt_before->ops, &cld->ops, &pln->super.super.ops); + X(ops_add2)(&cldt_after->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldt_after); + X(plan_destroy_internal)(cld); + X(plan_destroy_internal)(cldt_before); + return (plan *) 0; +} + +static solver *mksolver(rearrangement rearrange, int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->rearrange = rearrange; + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(rdft_rank1_bigvec_register)(planner *p) +{ + rearrangement rearrange; + int preserve_input; + FORALL_REARRANGE(rearrange) + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(rearrange, preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-serial.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-serial.c new file mode 100644 index 000000000..7b81b6fd3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-serial.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* "MPI" RDFTs where all of the data is on one processor...just + call through to serial API. */ + +#include "mpi-rdft.h" + +typedef struct { + plan_mpi_rdft super; + plan *cld; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, I, O); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-rdft-serial %(%p%))", ego->cld); +} + +int XM(rdft_serial_applicable)(const problem_mpi_rdft *p) +{ + return (1 + && p->flags == 0 /* TRANSPOSED/SCRAMBLED_IN/OUT not supported */ + && ((XM(is_local)(p->sz, IB) && XM(is_local)(p->sz, OB)) + || p->vn == 0)); +} + +static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) +{ + const problem_mpi_rdft *p = (const problem_mpi_rdft *) p_; + P *pln; + plan *cld; + int my_pe; + static const plan_adt padt = { + XM(rdft_solve), awake, print, destroy + }; + + UNUSED(ego); + + /* check whether applicable: */ + if (!XM(rdft_serial_applicable)(p)) + return (plan *) 0; + + MPI_Comm_rank(p->comm, &my_pe); + if (my_pe == 0 && p->vn > 0) { + int i, rnk = p->sz->rnk; + tensor *sz = X(mktensor)(rnk); + rdft_kind *kind + = (rdft_kind *) MALLOC(sizeof(rdft_kind) * rnk, PROBLEMS); + sz->dims[rnk - 1].is = sz->dims[rnk - 1].os = p->vn; + sz->dims[rnk - 1].n = p->sz->dims[rnk - 1].n; + for (i = rnk - 1; i > 0; --i) { + sz->dims[i - 1].is = sz->dims[i - 1].os = + sz->dims[i].is * sz->dims[i].n; + sz->dims[i - 1].n = p->sz->dims[i - 1].n; + } + for (i = 0; i < rnk; ++i) + kind[i] = p->kind[i]; + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)(sz, + X(mktensor_1d)(p->vn, 1, 1), + p->I, p->O, kind)); + X(ifree0)(kind); + } + else { /* idle process: make nop plan */ + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_1d)(0,0,0), + p->I, p->O)); + } + if (XM(any_true)(!cld, p->comm)) return (plan *) 0; + + pln = MKPLAN_MPI_RDFT(P, &padt, apply); + pln->cld = cld; + X(ops_cpy)(&cld->ops, &pln->super.super.ops); + return &(pln->super.super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT, mkplan, 0 }; + return MKSOLVER(solver, &sadt); +} + +void XM(rdft_serial_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-solve.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-solve.c new file mode 100644 index 000000000..e8f4f5a8f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft-solve.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-rdft.h" + +/* use the apply() operation for MPI_RDFT problems */ +void XM(rdft_solve)(const plan *ego_, const problem *p_) +{ + const plan_mpi_rdft *ego = (const plan_mpi_rdft *) ego_; + const problem_mpi_rdft *p = (const problem_mpi_rdft *) p_; + ego->apply(ego_, UNTAINT(p->I), UNTAINT(p->O)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-problem.c new file mode 100644 index 000000000..16baf1bdc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-problem.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-rdft2.h" + +static void destroy(problem *ego_) +{ + problem_mpi_rdft2 *ego = (problem_mpi_rdft2 *) ego_; + XM(dtensor_destroy)(ego->sz); + MPI_Comm_free(&ego->comm); + X(ifree)(ego_); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_mpi_rdft2 *p = (const problem_mpi_rdft2 *) p_; + int i; + X(md5puts)(m, "mpi-rdft2"); + X(md5int)(m, p->I == p->O); + /* don't include alignment -- may differ between processes + X(md5int)(m, X(ialignment_of)(p->I)); + X(md5int)(m, X(ialignment_of)(p->O)); + ... note that applicability of MPI plans does not depend + on alignment (although optimality may, in principle). */ + XM(dtensor_md5)(m, p->sz); + X(md5INT)(m, p->vn); + X(md5int)(m, p->kind); + X(md5int)(m, p->flags); + MPI_Comm_size(p->comm, &i); X(md5int)(m, i); + A(XM(md5_equal)(*m, p->comm)); +} + +static void print(const problem *ego_, printer *p) +{ + const problem_mpi_rdft2 *ego = (const problem_mpi_rdft2 *) ego_; + int i; + p->print(p, "(mpi-rdft2 %d %d %d ", + ego->I == ego->O, + X(ialignment_of)(ego->I), + X(ialignment_of)(ego->O)); + XM(dtensor_print)(ego->sz, p); + p->print(p, " %D %d %d", ego->vn, (int) ego->kind, ego->flags); + MPI_Comm_size(ego->comm, &i); p->print(p, " %d)", i); +} + +static void zero(const problem *ego_) +{ + const problem_mpi_rdft2 *ego = (const problem_mpi_rdft2 *) ego_; + R *I = ego->I; + dtensor *sz; + INT i, N; + int my_pe; + + sz = XM(dtensor_copy)(ego->sz); + sz->dims[sz->rnk - 1].n = sz->dims[sz->rnk - 1].n / 2 + 1; + MPI_Comm_rank(ego->comm, &my_pe); + N = 2 * ego->vn * XM(total_block)(sz, IB, my_pe); + XM(dtensor_destroy)(sz); + for (i = 0; i < N; ++i) I[i] = K(0.0); +} + +static const problem_adt padt = +{ + PROBLEM_MPI_RDFT2, + hash, + zero, + print, + destroy +}; + +problem *XM(mkproblem_rdft2)(const dtensor *sz, INT vn, + R *I, R *O, + MPI_Comm comm, + rdft_kind kind, + unsigned flags) +{ + problem_mpi_rdft2 *ego = + (problem_mpi_rdft2 *)X(mkproblem)(sizeof(problem_mpi_rdft2), &padt); + int n_pes; + + A(XM(dtensor_validp)(sz) && FINITE_RNK(sz->rnk) && sz->rnk > 1); + MPI_Comm_size(comm, &n_pes); + A(vn >= 0); + A(kind == R2HC || kind == HC2R); + + /* enforce pointer equality if untainted pointers are equal */ + if (UNTAINT(I) == UNTAINT(O)) + I = O = JOIN_TAINT(I, O); + + ego->sz = XM(dtensor_canonical)(sz, 0); +#ifdef FFTW_DEBUG + ego->sz->dims[sz->rnk - 1].n = sz->dims[sz->rnk - 1].n / 2 + 1; + A(n_pes >= XM(num_blocks_total)(ego->sz, IB) + && n_pes >= XM(num_blocks_total)(ego->sz, OB)); + ego->sz->dims[sz->rnk - 1].n = sz->dims[sz->rnk - 1].n; +#endif + + ego->vn = vn; + ego->I = I; + ego->O = O; + ego->kind = kind; + + /* We only support TRANSPOSED_OUT for r2c and TRANSPOSED_IN for + c2r transforms. */ + + ego->flags = flags; + + MPI_Comm_dup(comm, &ego->comm); + + return &(ego->super); +} + +problem *XM(mkproblem_rdft2_d)(dtensor *sz, INT vn, + R *I, R *O, + MPI_Comm comm, + rdft_kind kind, + unsigned flags) +{ + problem *p = XM(mkproblem_rdft2)(sz, vn, I, O, comm, kind, flags); + XM(dtensor_destroy)(sz); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-rank-geq2-transposed.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-rank-geq2-transposed.c new file mode 100644 index 000000000..dabe105c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-rank-geq2-transposed.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Real-input (r2c) DFTs of rank >= 2, for the case where we are distributed + across the first dimension only, and the output is transposed both + in data distribution and in ordering (for the first 2 dimensions). + + Conversely, real-output (c2r) DFTs where the input is transposed. + + We don't currently support transposed-input r2c or transposed-output + c2r transforms. */ + +#include "mpi-rdft2.h" +#include "mpi-transpose.h" +#include "rdft/rdft.h" +#include "dft/dft.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_rdft2 super; + + plan *cld1, *cldt, *cld2; + INT vn; + int preserve_input; +} P; + +static void apply_r2c(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld1; + plan_dft *cld2; + plan_rdft *cldt; + + /* RDFT2 local dimensions */ + cld1 = (plan_rdft2 *) ego->cld1; + if (ego->preserve_input) { + cld1->apply(ego->cld1, I, I+ego->vn, O, O+1); + I = O; + } + else + cld1->apply(ego->cld1, I, I+ego->vn, I, I+1); + + /* global transpose */ + cldt = (plan_rdft *) ego->cldt; + cldt->apply(ego->cldt, I, O); + + /* DFT final local dimension */ + cld2 = (plan_dft *) ego->cld2; + cld2->apply(ego->cld2, O, O+1, O, O+1); +} + +static void apply_c2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld1; + plan_dft *cld2; + plan_rdft *cldt; + + /* IDFT local dimensions */ + cld2 = (plan_dft *) ego->cld2; + if (ego->preserve_input) { + cld2->apply(ego->cld2, I+1, I, O+1, O); + I = O; + } + else + cld2->apply(ego->cld2, I+1, I, I+1, I); + + /* global transpose */ + cldt = (plan_rdft *) ego->cldt; + cldt->apply(ego->cldt, I, O); + + /* RDFT2 final local dimension */ + cld1 = (plan_rdft2 *) ego->cld1; + cld1->apply(ego->cld1, O, O+ego->vn, O, O+1); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_rdft2 *p = (const problem_mpi_rdft2 *) p_; + return (1 + && p->sz->rnk > 1 + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && ((p->flags == TRANSPOSED_OUT && p->kind == R2HC + && XM(is_local_after)(1, p->sz, IB) + && XM(is_local_after)(2, p->sz, OB) + && XM(num_blocks)(p->sz->dims[0].n, + p->sz->dims[0].b[OB]) == 1) + || + (p->flags == TRANSPOSED_IN && p->kind == HC2R + && XM(is_local_after)(1, p->sz, OB) + && XM(is_local_after)(2, p->sz, IB) + && XM(num_blocks)(p->sz->dims[0].n, + p->sz->dims[0].b[IB]) == 1)) + && (!NO_SLOWP(plnr) /* slow if rdft2-serial is applicable */ + || !XM(rdft2_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cldt, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cldt); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-rdft2-rank-geq2-transposed%s%(%p%)%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", + ego->cld1, ego->cldt, ego->cld2); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_rdft2 *p; + P *pln; + plan *cld1 = 0, *cldt = 0, *cld2 = 0; + R *r0, *r1, *cr, *ci, *ri, *ii, *ro, *io, *I, *O; + tensor *sz; + int i, my_pe, n_pes; + INT nrest, n1, b1; + static const plan_adt padt = { + XM(rdft2_solve), awake, print, destroy + }; + block_kind k1, k2; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_rdft2 *) p_; + + I = p->I; O = p->O; + if (p->kind == R2HC) { + k1 = IB; k2 = OB; + r1 = (r0 = I) + p->vn; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) { + ci = (cr = O) + 1; + I = O; + } + else + ci = (cr = I) + 1; + io = ii = (ro = ri = O) + 1; + } + else { + k1 = OB; k2 = IB; + r1 = (r0 = O) + p->vn; + ci = (cr = O) + 1; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) { + ri = (ii = I) + 1; + ro = (io = O) + 1; + I = O; + } + else + ro = ri = (io = ii = I) + 1; + } + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + sz = X(mktensor)(p->sz->rnk - 1); /* tensor of last rnk-1 dimensions */ + i = p->sz->rnk - 2; A(i >= 0); + sz->dims[i].n = p->sz->dims[i+1].n / 2 + 1; + sz->dims[i].is = sz->dims[i].os = 2 * p->vn; + for (--i; i >= 0; --i) { + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = sz->dims[i+1].n * sz->dims[i+1].is; + } + nrest = 1; for (i = 1; i < sz->rnk; ++i) nrest *= sz->dims[i].n; + { + INT ivs = 1 + (p->kind == HC2R), ovs = 1 + (p->kind == R2HC); + INT is = sz->dims[0].n * sz->dims[0].is; + INT b = XM(block)(p->sz->dims[0].n, p->sz->dims[0].b[k1], my_pe); + sz->dims[p->sz->rnk - 2].n = p->sz->dims[p->sz->rnk - 1].n; + cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)(sz, + X(mktensor_2d)(b, is, is, + p->vn,ivs,ovs), + r0, r1, cr, ci, p->kind)); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + nrest *= p->vn; + n1 = p->sz->dims[1].n; + b1 = p->sz->dims[1].b[k2]; + if (p->sz->rnk == 2) { /* n1 dimension is cut in ~half */ + n1 = n1 / 2 + 1; + b1 = b1 == p->sz->dims[1].n ? n1 : b1; + } + + if (p->kind == R2HC) + cldt = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + p->sz->dims[0].n, n1, nrest * 2, + I, O, + p->sz->dims[0].b[IB], b1, + p->comm, 0)); + else + cldt = X(mkplan_d)(plnr, + XM(mkproblem_transpose)( + n1, p->sz->dims[0].n, nrest * 2, + I, O, + b1, p->sz->dims[0].b[OB], + p->comm, 0)); + if (XM(any_true)(!cldt, p->comm)) goto nada; + + { + INT is = p->sz->dims[0].n * nrest * 2; + INT b = XM(block)(n1, b1, my_pe); + cld2 = X(mkplan_d)(plnr, + X(mkproblem_dft_d)(X(mktensor_1d)( + p->sz->dims[0].n, + nrest * 2, nrest * 2), + X(mktensor_2d)(b, is, is, + nrest, 2, 2), + ri, ii, ro, io)); + if (XM(any_true)(!cld2, p->comm)) goto nada; + } + + pln = MKPLAN_MPI_RDFT2(P, &padt, p->kind == R2HC ? apply_r2c : apply_c2r); + pln->cld1 = cld1; + pln->cldt = cldt; + pln->cld2 = cld2; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->vn = p->vn; + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + X(ops_add2)(&cldt->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cldt); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(rdft2_rank_geq2_transposed_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-rank-geq2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-rank-geq2.c new file mode 100644 index 000000000..93f27581c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-rank-geq2.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Complex RDFT2s of rank >= 2, for the case where we are distributed + across the first dimension only, and the output is not transposed. */ + +#include "mpi-dft.h" +#include "mpi-rdft2.h" +#include "rdft/rdft.h" + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_rdft2 super; + + plan *cld1, *cld2; + INT vn; + int preserve_input; +} P; + +static void apply_r2c(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld1; + plan_rdft *cld2; + + /* RDFT2 local dimensions */ + cld1 = (plan_rdft2 *) ego->cld1; + if (ego->preserve_input) { + cld1->apply(ego->cld1, I, I+ego->vn, O, O+1); + I = O; + } + else + cld1->apply(ego->cld1, I, I+ego->vn, I, I+1); + + /* DFT non-local dimension (via dft-rank1-bigvec, usually): */ + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, I, O); +} + +static void apply_c2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld1; + plan_rdft *cld2; + + /* DFT non-local dimension (via dft-rank1-bigvec, usually): */ + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, I, O); + + /* RDFT2 local dimensions */ + cld1 = (plan_rdft2 *) ego->cld1; + cld1->apply(ego->cld1, O, O+ego->vn, O, O+1); + +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_rdft2 *p = (const problem_mpi_rdft2 *) p_; + return (1 + && p->sz->rnk > 1 + && p->flags == 0 /* TRANSPOSED/SCRAMBLED_IN/OUT not supported */ + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O + && p->kind == R2HC)) + && XM(is_local_after)(1, p->sz, IB) + && XM(is_local_after)(1, p->sz, OB) + && (!NO_SLOWP(plnr) /* slow if rdft2-serial is applicable */ + || !XM(rdft2_serial_applicable)(p)) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-rdft2-rank-geq2%s%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", ego->cld1, ego->cld2); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_rdft2 *p; + P *pln; + plan *cld1 = 0, *cld2 = 0; + R *r0, *r1, *cr, *ci, *I, *O; + tensor *sz; + dtensor *sz2; + int i, my_pe, n_pes; + INT nrest; + static const plan_adt padt = { + XM(rdft2_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_rdft2 *) p_; + + I = p->I; O = p->O; + if (p->kind == R2HC) { + r1 = (r0 = p->I) + p->vn; + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) { + ci = (cr = p->O) + 1; + I = O; + } + else + ci = (cr = p->I) + 1; + } + else { + r1 = (r0 = p->O) + p->vn; + ci = (cr = p->O) + 1; + } + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + sz = X(mktensor)(p->sz->rnk - 1); /* tensor of last rnk-1 dimensions */ + i = p->sz->rnk - 2; A(i >= 0); + sz->dims[i].is = sz->dims[i].os = 2 * p->vn; + sz->dims[i].n = p->sz->dims[i+1].n / 2 + 1; + for (--i; i >= 0; --i) { + sz->dims[i].n = p->sz->dims[i+1].n; + sz->dims[i].is = sz->dims[i].os = sz->dims[i+1].n * sz->dims[i+1].is; + } + nrest = X(tensor_sz)(sz); + { + INT ivs = 1 + (p->kind == HC2R), ovs = 1 + (p->kind == R2HC); + INT is = sz->dims[0].n * sz->dims[0].is; + INT b = XM(block)(p->sz->dims[0].n, p->sz->dims[0].b[IB], my_pe); + sz->dims[p->sz->rnk - 2].n = p->sz->dims[p->sz->rnk - 1].n; + cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)(sz, + X(mktensor_2d)(b, is, is, + p->vn,ivs,ovs), + r0, r1, cr, ci, p->kind)); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + sz2 = XM(mkdtensor)(1); /* tensor for first (distributed) dimension */ + sz2->dims[0] = p->sz->dims[0]; + cld2 = X(mkplan_d)(plnr, XM(mkproblem_dft_d)(sz2, nrest * p->vn, + I, O, p->comm, + p->kind == R2HC ? + FFT_SIGN : -FFT_SIGN, + RANK1_BIGVEC_ONLY)); + if (XM(any_true)(!cld2, p->comm)) goto nada; + + pln = MKPLAN_MPI_RDFT2(P, &padt, p->kind == R2HC ? apply_r2c : apply_c2r); + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->vn = p->vn; + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(rdft2_rank_geq2_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-serial.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-serial.c new file mode 100644 index 000000000..b5e2c7aed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-serial.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* "MPI" DFTs where all of the data is on one processor...just + call through to serial API. */ + +#include "mpi-rdft2.h" +#include "rdft/rdft.h" + +typedef struct { + plan_mpi_rdft2 super; + plan *cld; + INT vn; +} P; + +static void apply_r2c(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld; + cld = (plan_rdft2 *) ego->cld; + cld->apply(ego->cld, I, I+ego->vn, O, O+1); +} + +static void apply_c2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld; + cld = (plan_rdft2 *) ego->cld; + cld->apply(ego->cld, O, O+ego->vn, I, I+1); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-rdft2-serial %(%p%))", ego->cld); +} + +int XM(rdft2_serial_applicable)(const problem_mpi_rdft2 *p) +{ + return (1 + && p->flags == 0 /* TRANSPOSED/SCRAMBLED_IN/OUT not supported */ + && ((XM(is_local)(p->sz, IB) && XM(is_local)(p->sz, OB)) + || p->vn == 0)); +} + +static plan *mkplan(const solver *ego, const problem *p_, planner *plnr) +{ + const problem_mpi_rdft2 *p = (const problem_mpi_rdft2 *) p_; + P *pln; + plan *cld; + int my_pe; + R *r0, *r1, *cr, *ci; + static const plan_adt padt = { + XM(rdft2_solve), awake, print, destroy + }; + + UNUSED(ego); + + /* check whether applicable: */ + if (!XM(rdft2_serial_applicable)(p)) + return (plan *) 0; + + if (p->kind == R2HC) { + r1 = (r0 = p->I) + p->vn; + ci = (cr = p->O) + 1; + } + else { + r1 = (r0 = p->O) + p->vn; + ci = (cr = p->I) + 1; + } + + MPI_Comm_rank(p->comm, &my_pe); + if (my_pe == 0 && p->vn > 0) { + INT ivs = 1 + (p->kind == HC2R), ovs = 1 + (p->kind == R2HC); + int i, rnk = p->sz->rnk; + tensor *sz = X(mktensor)(p->sz->rnk); + sz->dims[rnk - 1].is = sz->dims[rnk - 1].os = 2 * p->vn; + sz->dims[rnk - 1].n = p->sz->dims[rnk - 1].n / 2 + 1; + for (i = rnk - 1; i > 0; --i) { + sz->dims[i - 1].is = sz->dims[i - 1].os = + sz->dims[i].is * sz->dims[i].n; + sz->dims[i - 1].n = p->sz->dims[i - 1].n; + } + sz->dims[rnk - 1].n = p->sz->dims[rnk - 1].n; + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)(sz, + X(mktensor_1d)(p->vn,ivs,ovs), + r0, r1, cr, ci, p->kind)); + } + else { /* idle process: make nop plan */ + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)(X(mktensor_0d)(), + X(mktensor_1d)(0,0,0), + cr, ci, cr, ci, HC2R)); + } + if (XM(any_true)(!cld, p->comm)) return (plan *) 0; + + pln = MKPLAN_MPI_RDFT2(P, &padt, p->kind == R2HC ? apply_r2c : apply_c2r); + pln->cld = cld; + pln->vn = p->vn; + X(ops_cpy)(&cld->ops, &pln->super.super.ops); + return &(pln->super.super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_MPI_RDFT2, mkplan, 0 }; + return MKSOLVER(solver, &sadt); +} + +void XM(rdft2_serial_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-solve.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-solve.c new file mode 100644 index 000000000..0d311d857 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rdft2-solve.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-rdft2.h" + +/* use the apply() operation for MPI_RDFT2 problems */ +void XM(rdft2_solve)(const plan *ego_, const problem *p_) +{ + const plan_mpi_rdft2 *ego = (const plan_mpi_rdft2 *) ego_; + const problem_mpi_rdft2 *p = (const problem_mpi_rdft2 *) p_; + ego->apply(ego_, UNTAINT(p->I), UNTAINT(p->O)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rearrange.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rearrange.c new file mode 100644 index 000000000..d6a0aa932 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/rearrange.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ifftw-mpi.h" + +/* common functions for rearrangements of the data for the *-rank1-bigvec + solvers */ + +static int div_mult(INT b, INT a) { + return (a > b && a % b == 0); +} +static int div_mult2(INT b, INT a, INT n) { + return (div_mult(b, a) && div_mult(n, b)); +} + +int XM(rearrange_applicable)(rearrangement rearrange, + ddim dim0, INT vn, int n_pes) +{ + /* note: it is important that cases other than CONTIG be + applicable only when the resulting transpose dimension + is divisible by n_pes; otherwise, the allocation size + returned by the API will be incorrect */ + return ((rearrange != DISCONTIG || div_mult(n_pes, vn)) + && (rearrange != SQUARE_BEFORE + || div_mult2(dim0.b[IB], vn, n_pes)) + && (rearrange != SQUARE_AFTER + || (dim0.b[IB] != dim0.b[OB] + && div_mult2(dim0.b[OB], vn, n_pes))) + && (rearrange != SQUARE_MIDDLE + || div_mult(dim0.n * n_pes, vn))); +} + +INT XM(rearrange_ny)(rearrangement rearrange, ddim dim0, INT vn, int n_pes) +{ + switch (rearrange) { + case CONTIG: + return vn; + case DISCONTIG: + return n_pes; + case SQUARE_BEFORE: + return dim0.b[IB]; + case SQUARE_AFTER: + return dim0.b[OB]; + case SQUARE_MIDDLE: + return dim0.n * n_pes; + } + return 0; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/testsched.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/testsched.c new file mode 100644 index 000000000..df6ec4abf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/testsched.c @@ -0,0 +1,552 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 1999-2003, 2007-8 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/**********************************************************************/ +/* This is a modified and combined version of the sched.c and + test_sched.c files shipped with FFTW 2, written to implement and + test various all-to-all communications scheduling patterns. + + It is not used in FFTW 3, but I keep it around in case we ever want + to play with this again or to change algorithms. In particular, I + used it to implement and test the fill1_comm_sched routine in + transpose-pairwise.c, which allows us to create a schedule for one + process at a time and is much more compact than the FFTW 2 code. + + Note that the scheduling algorithm is somewhat modified from that + of FFTW 2. Originally, I thought that one "stall" in the schedule + was unavoidable for odd numbers of processes, since this is the + case for the soccer-timetabling problem. However, because of the + self-communication step, we can use the self-communication to fill + in the stalls. (Thanks to Ralf Wildenhues for pointing this out.) + This greatly simplifies the process re-sorting algorithm. */ + +/**********************************************************************/ + +#include +#include + +/* This file contains routines to compute communications schedules for + all-to-all communications (complete exchanges) that are performed + in-place. (That is, the block that processor x sends to processor + y gets replaced on processor x by a block received from processor y.) + + A schedule, int **sched, is a two-dimensional array where + sched[pe][i] is the processor that pe expects to exchange a message + with on the i-th step of the exchange. sched[pe][i] == -1 for the + i after the last exchange scheduled on pe. + + Here, processors (pe's, for processing elements), are numbered from + 0 to npes-1. + + There are a couple of constraints that a schedule should satisfy + (besides the obvious one that every processor has to communicate + with every other processor exactly once). + + * First, and most importantly, there must be no deadlocks. + + * Second, we would like to overlap communications as much as possible, + so that all exchanges occur in parallel. It turns out that perfect + overlap is possible for all number of processes (npes). + + It turns out that this scheduling problem is actually well-studied, + and good solutions are known. The problem is known as a + "time-tabling" problem, and is specifically the problem of + scheduling a sports competition (where n teams must compete exactly + once with every other team). The problem is discussed and + algorithms are presented in: + + [1] J. A. M. Schreuder, "Constructing Timetables for Sport + Competitions," Mathematical Programming Study 13, pp. 58-67 (1980). + + [2] A. Schaerf, "Scheduling Sport Tournaments using Constraint + Logic Programming," Proc. of 12th Europ. Conf. on + Artif. Intell. (ECAI-96), pp. 634-639 (Budapest 1996). + http://hermes.dis.uniromal.it/~aschaerf/publications.html + + (These people actually impose a lot of additional constraints that + we don't care about, so they are solving harder problems. [1] gives + a simple enough algorithm for our purposes, though.) + + In the timetabling problem, N teams can all play one another in N-1 + steps if N is even, and N steps if N is odd. Here, however, + there is a "self-communication" step (a team must also "play itself") + and so we can always make an optimal N-step schedule regardless of N. + + However, we have to do more: for a particular processor, the + communications schedule must be sorted in ascending or descending + order of processor index. (This is necessary so that the data + coming in for the transpose does not overwrite data that will be + sent later; for that processor the incoming and outgoing blocks are + of different non-zero sizes.) Fortunately, because the schedule + is stall free, each parallel step of the schedule is independent + of every other step, and we can reorder the steps arbitrarily + to achieve any desired order on a particular process. +*/ + +void free_comm_schedule(int **sched, int npes) +{ + if (sched) { + int i; + + for (i = 0; i < npes; ++i) + free(sched[i]); + free(sched); + } +} + +void empty_comm_schedule(int **sched, int npes) +{ + int i; + for (i = 0; i < npes; ++i) + sched[i][0] = -1; +} + +extern void fill_comm_schedule(int **sched, int npes); + +/* Create a new communications schedule for a given number of processors. + The schedule is initialized to a deadlock-free, maximum overlap + schedule. Returns NULL on an error (may print a message to + stderr if there is a program bug detected). */ +int **make_comm_schedule(int npes) +{ + int **sched; + int i; + + sched = (int **) malloc(sizeof(int *) * npes); + if (!sched) + return NULL; + + for (i = 0; i < npes; ++i) + sched[i] = NULL; + + for (i = 0; i < npes; ++i) { + sched[i] = (int *) malloc(sizeof(int) * 10 * (npes + 1)); + if (!sched[i]) { + free_comm_schedule(sched,npes); + return NULL; + } + } + + empty_comm_schedule(sched,npes); + fill_comm_schedule(sched,npes); + + if (!check_comm_schedule(sched,npes)) { + free_comm_schedule(sched,npes); + return NULL; + } + + return sched; +} + +static void add_dest_to_comm_schedule(int **sched, int pe, int dest) +{ + int i; + + for (i = 0; sched[pe][i] != -1; ++i) + ; + + sched[pe][i] = dest; + sched[pe][i+1] = -1; +} + +static void add_pair_to_comm_schedule(int **sched, int pe1, int pe2) +{ + add_dest_to_comm_schedule(sched, pe1, pe2); + if (pe1 != pe2) + add_dest_to_comm_schedule(sched, pe2, pe1); +} + +/* Simplification of algorithm presented in [1] (we have fewer + constraints). Produces a perfect schedule (npes steps). */ + +void fill_comm_schedule(int **sched, int npes) +{ + int pe, i, n; + + if (npes % 2 == 0) { + n = npes; + for (pe = 0; pe < npes; ++pe) + add_pair_to_comm_schedule(sched,pe,pe); + } + else + n = npes + 1; + + for (pe = 0; pe < n - 1; ++pe) { + add_pair_to_comm_schedule(sched, pe, npes % 2 == 0 ? npes - 1 : pe); + + for (i = 1; i < n/2; ++i) { + int pe_a, pe_b; + + pe_a = pe - i; + if (pe_a < 0) + pe_a += n - 1; + + pe_b = (pe + i) % (n - 1); + + add_pair_to_comm_schedule(sched,pe_a,pe_b); + } + } +} + +/* given an array sched[npes], fills it with the communications + schedule for process pe. */ +void fill1_comm_sched(int *sched, int which_pe, int npes) +{ + int pe, i, n, s = 0; + if (npes % 2 == 0) { + n = npes; + sched[s++] = which_pe; + } + else + n = npes + 1; + for (pe = 0; pe < n - 1; ++pe) { + if (npes % 2 == 0) { + if (pe == which_pe) sched[s++] = npes - 1; + else if (npes - 1 == which_pe) sched[s++] = pe; + } + else if (pe == which_pe) sched[s++] = pe; + + if (pe != which_pe && which_pe < n - 1) { + i = (pe - which_pe + (n - 1)) % (n - 1); + if (i < n/2) + sched[s++] = (pe + i) % (n - 1); + + i = (which_pe - pe + (n - 1)) % (n - 1); + if (i < n/2) + sched[s++] = (pe - i + (n - 1)) % (n - 1); + } + } + if (s != npes) { + fprintf(stderr, "bug in fill1_com_schedule (%d, %d/%d)\n", + s, which_pe, npes); + exit(EXIT_FAILURE); + } +} + +/* sort the communication schedule sched for npes so that the schedule + on process sortpe is ascending or descending (!ascending). */ +static void sort1_comm_sched(int *sched, int npes, int sortpe, int ascending) +{ + int *sortsched, i; + sortsched = (int *) malloc(npes * sizeof(int) * 2); + fill1_comm_sched(sortsched, sortpe, npes); + if (ascending) + for (i = 0; i < npes; ++i) + sortsched[npes + sortsched[i]] = sched[i]; + else + for (i = 0; i < npes; ++i) + sortsched[2*npes - 1 - sortsched[i]] = sched[i]; + for (i = 0; i < npes; ++i) + sched[i] = sortsched[npes + i]; + free(sortsched); +} + +/* Below, we have various checks in case of bugs: */ + +/* check for deadlocks by simulating the schedule and looking for + cycles in the dependency list; returns 0 if there are deadlocks + (or other errors) */ +static int check_schedule_deadlock(int **sched, int npes) +{ + int *step, *depend, *visited, pe, pe2, period, done = 0; + int counter = 0; + + /* step[pe] is the step in the schedule that a given pe is on */ + step = (int *) malloc(sizeof(int) * npes); + + /* depend[pe] is the pe' that pe is currently waiting for a message + from (-1 if none) */ + depend = (int *) malloc(sizeof(int) * npes); + + /* visited[pe] tells whether we have visited the current pe already + when we are looking for cycles. */ + visited = (int *) malloc(sizeof(int) * npes); + + if (!step || !depend || !visited) { + free(step); free(depend); free(visited); + return 0; + } + + for (pe = 0; pe < npes; ++pe) + step[pe] = 0; + + while (!done) { + ++counter; + + for (pe = 0; pe < npes; ++pe) + depend[pe] = sched[pe][step[pe]]; + + /* now look for cycles in the dependencies with period > 2: */ + for (pe = 0; pe < npes; ++pe) + if (depend[pe] != -1) { + for (pe2 = 0; pe2 < npes; ++pe2) + visited[pe2] = 0; + + period = 0; + pe2 = pe; + do { + visited[pe2] = period + 1; + pe2 = depend[pe2]; + period++; + } while (pe2 != -1 && !visited[pe2]); + + if (pe2 == -1) { + fprintf(stderr, + "BUG: unterminated cycle in schedule!\n"); + free(step); free(depend); + free(visited); + return 0; + } + if (period - (visited[pe2] - 1) > 2) { + fprintf(stderr,"BUG: deadlock in schedule!\n"); + free(step); free(depend); + free(visited); + return 0; + } + + if (pe2 == pe) + step[pe]++; + } + + done = 1; + for (pe = 0; pe < npes; ++pe) + if (sched[pe][step[pe]] != -1) { + done = 0; + break; + } + } + + free(step); free(depend); free(visited); + return (counter > 0 ? counter : 1); +} + +/* sanity checks; prints message and returns 0 on failure. + undocumented feature: the return value on success is actually the + number of steps required for the schedule to complete, counting + stalls. */ +int check_comm_schedule(int **sched, int npes) +{ + int pe, i, comm_pe; + + for (pe = 0; pe < npes; ++pe) { + for (comm_pe = 0; comm_pe < npes; ++comm_pe) { + for (i = 0; sched[pe][i] != -1 && sched[pe][i] != comm_pe; ++i) + ; + if (sched[pe][i] == -1) { + fprintf(stderr,"BUG: schedule never sends message from " + "%d to %d.\n",pe,comm_pe); + return 0; /* never send message to comm_pe */ + } + } + for (i = 0; sched[pe][i] != -1; ++i) + ; + if (i != npes) { + fprintf(stderr,"BUG: schedule sends too many messages from " + "%d\n",pe); + return 0; + } + } + return check_schedule_deadlock(sched,npes); +} + +/* invert the order of all the schedules; this has no effect on + its required properties. */ +void invert_comm_schedule(int **sched, int npes) +{ + int pe, i; + + for (pe = 0; pe < npes; ++pe) + for (i = 0; i < npes/2; ++i) { + int dummy = sched[pe][i]; + sched[pe][i] = sched[pe][npes-1-i]; + sched[pe][npes-1-i] = dummy; + } +} + +/* Sort the schedule for sort_pe in ascending order of processor + index. Unfortunately, for odd npes (when schedule has a stall + to begin with) this will introduce an extra stall due to + the motion of the self-communication past a stall. We could + fix this if it were really important. Actually, we don't + get an extra stall when sort_pe == 0 or npes-1, which is sufficient + for our purposes. */ +void sort_comm_schedule(int **sched, int npes, int sort_pe) +{ + int i,j,pe; + + /* Note that we can do this sort in O(npes) swaps because we know + that the numbers we are sorting are just 0...npes-1. But we'll + just do a bubble sort for simplicity here. */ + + for (i = 0; i < npes - 1; ++i) + for (j = i + 1; j < npes; ++j) + if (sched[sort_pe][i] > sched[sort_pe][j]) { + for (pe = 0; pe < npes; ++pe) { + int s = sched[pe][i]; + sched[pe][i] = sched[pe][j]; + sched[pe][j] = s; + } + } +} + +/* print the schedule (for debugging purposes) */ +void print_comm_schedule(int **sched, int npes) +{ + int pe, i, width; + + if (npes < 10) + width = 1; + else if (npes < 100) + width = 2; + else + width = 3; + + for (pe = 0; pe < npes; ++pe) { + printf("pe %*d schedule:", width, pe); + for (i = 0; sched[pe][i] != -1; ++i) + printf(" %*d",width,sched[pe][i]); + printf("\n"); + } +} + +int main(int argc, char **argv) +{ + int **sched; + int npes = -1, sortpe = -1, steps, i; + + if (argc >= 2) { + npes = atoi(argv[1]); + if (npes <= 0) { + fprintf(stderr,"npes must be positive!"); + return 1; + } + } + if (argc >= 3) { + sortpe = atoi(argv[2]); + if (sortpe < 0 || sortpe >= npes) { + fprintf(stderr,"sortpe must be between 0 and npes-1.\n"); + return 1; + } + } + + if (npes != -1) { + printf("Computing schedule for npes = %d:\n",npes); + sched = make_comm_schedule(npes); + if (!sched) { + fprintf(stderr,"Out of memory!"); + return 6; + } + + if (steps = check_comm_schedule(sched,npes)) + printf("schedule OK (takes %d steps to complete).\n", steps); + else + printf("schedule not OK.\n"); + + print_comm_schedule(sched, npes); + + if (sortpe != -1) { + printf("\nRe-creating schedule for pe = %d...\n", sortpe); + int *sched1 = (int*) malloc(sizeof(int) * npes); + for (i = 0; i < npes; ++i) sched1[i] = -1; + fill1_comm_sched(sched1, sortpe, npes); + printf(" ="); + for (i = 0; i < npes; ++i) + printf(" %*d", npes < 10 ? 1 : (npes < 100 ? 2 : 3), + sched1[i]); + printf("\n"); + + printf("\nSorting schedule for sortpe = %d...\n", sortpe); + sort_comm_schedule(sched,npes,sortpe); + + if (steps = check_comm_schedule(sched,npes)) + printf("schedule OK (takes %d steps to complete).\n", + steps); + else + printf("schedule not OK.\n"); + + print_comm_schedule(sched, npes); + + printf("\nInverting schedule...\n"); + invert_comm_schedule(sched,npes); + + if (steps = check_comm_schedule(sched,npes)) + printf("schedule OK (takes %d steps to complete).\n", + steps); + else + printf("schedule not OK.\n"); + + print_comm_schedule(sched, npes); + + free_comm_schedule(sched,npes); + + free(sched1); + } + } + else { + printf("Doing infinite tests...\n"); + for (npes = 1; ; ++npes) { + int *sched1 = (int*) malloc(sizeof(int) * npes); + printf("npes = %d...",npes); + sched = make_comm_schedule(npes); + if (!sched) { + fprintf(stderr,"Out of memory!\n"); + return 5; + } + for (sortpe = 0; sortpe < npes; ++sortpe) { + empty_comm_schedule(sched,npes); + fill_comm_schedule(sched,npes); + if (!check_comm_schedule(sched,npes)) { + fprintf(stderr, + "\n -- fill error for sortpe = %d!\n",sortpe); + return 2; + } + + for (i = 0; i < npes; ++i) sched1[i] = -1; + fill1_comm_sched(sched1, sortpe, npes); + for (i = 0; i < npes; ++i) + if (sched1[i] != sched[sortpe][i]) + fprintf(stderr, + "\n -- fill1 error for pe = %d!\n", + sortpe); + + sort_comm_schedule(sched,npes,sortpe); + if (!check_comm_schedule(sched,npes)) { + fprintf(stderr, + "\n -- sort error for sortpe = %d!\n",sortpe); + return 3; + } + invert_comm_schedule(sched,npes); + if (!check_comm_schedule(sched,npes)) { + fprintf(stderr, + "\n -- invert error for sortpe = %d!\n", + sortpe); + return 4; + } + } + free_comm_schedule(sched,npes); + printf("OK\n"); + if (npes % 50 == 0) + printf("(...Hit Ctrl-C to stop...)\n"); + free(sched1); + } + } + + return 0; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-alltoall.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-alltoall.c new file mode 100644 index 000000000..a405b0607 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-alltoall.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* plans for distributed out-of-place transpose using MPI_Alltoall, + and which destroy the input array (unless TRANSPOSED_IN is used) */ + +#include "mpi-transpose.h" +#include + +typedef struct { + solver super; + int copy_transposed_in; /* whether to copy the input for TRANSPOSED_IN, + which makes the final transpose out-of-place + but costs an extra copy and requires us + to destroy the input */ +} S; + +typedef struct { + plan_mpi_transpose super; + + plan *cld1, *cld2, *cld2rest, *cld3; + + MPI_Comm comm; + int *send_block_sizes, *send_block_offsets; + int *recv_block_sizes, *recv_block_offsets; + + INT rest_Ioff, rest_Ooff; + + int equal_blocks; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld1, *cld2, *cld2rest, *cld3; + + /* transpose locally to get contiguous chunks */ + cld1 = (plan_rdft *) ego->cld1; + if (cld1) { + cld1->apply(ego->cld1, I, O); + + /* transpose chunks globally */ + if (ego->equal_blocks) + MPI_Alltoall(O, ego->send_block_sizes[0], FFTW_MPI_TYPE, + I, ego->recv_block_sizes[0], FFTW_MPI_TYPE, + ego->comm); + else + MPI_Alltoallv(O, ego->send_block_sizes, ego->send_block_offsets, + FFTW_MPI_TYPE, + I, ego->recv_block_sizes, ego->recv_block_offsets, + FFTW_MPI_TYPE, + ego->comm); + } + else { /* TRANSPOSED_IN, no need to destroy input */ + /* transpose chunks globally */ + if (ego->equal_blocks) + MPI_Alltoall(I, ego->send_block_sizes[0], FFTW_MPI_TYPE, + O, ego->recv_block_sizes[0], FFTW_MPI_TYPE, + ego->comm); + else + MPI_Alltoallv(I, ego->send_block_sizes, ego->send_block_offsets, + FFTW_MPI_TYPE, + O, ego->recv_block_sizes, ego->recv_block_offsets, + FFTW_MPI_TYPE, + ego->comm); + I = O; /* final transpose (if any) is in-place */ + } + + /* transpose locally, again, to get ordinary row-major */ + cld2 = (plan_rdft *) ego->cld2; + if (cld2) { + cld2->apply(ego->cld2, I, O); + cld2rest = (plan_rdft *) ego->cld2rest; + if (cld2rest) { /* leftover from unequal block sizes */ + cld2rest->apply(ego->cld2rest, + I + ego->rest_Ioff, O + ego->rest_Ooff); + cld3 = (plan_rdft *) ego->cld3; + if (cld3) + cld3->apply(ego->cld3, O, O); + /* else TRANSPOSED_OUT is true and user wants O transposed */ + } + } +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; + return (1 + && p->I != p->O + && (!NO_DESTROY_INPUTP(plnr) || + ((p->flags & TRANSPOSED_IN) && !ego->copy_transposed_in)) + && ((p->flags & TRANSPOSED_IN) || !ego->copy_transposed_in) + && ONLY_TRANSPOSEDP(p->flags) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); + X(plan_awake)(ego->cld2rest, wakefulness); + X(plan_awake)(ego->cld3, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(ifree0)(ego->send_block_sizes); + MPI_Comm_free(&ego->comm); + X(plan_destroy_internal)(ego->cld3); + X(plan_destroy_internal)(ego->cld2rest); + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-transpose-alltoall%s%(%p%)%(%p%)%(%p%)%(%p%))", + ego->equal_blocks ? "/e" : "", + ego->cld1, ego->cld2, ego->cld2rest, ego->cld3); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_transpose *p; + P *pln; + plan *cld1 = 0, *cld2 = 0, *cld2rest = 0, *cld3 = 0; + INT b, bt, vn, rest_Ioff, rest_Ooff; + R *I; + int *sbs, *sbo, *rbs, *rbo; + int pe, my_pe, n_pes; + int equal_blocks = 1; + static const plan_adt padt = { + XM(transpose_solve), awake, print, destroy + }; + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_transpose *) p_; + vn = p->vn; + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + b = XM(block)(p->nx, p->block, my_pe); + + if (p->flags & TRANSPOSED_IN) { /* I is already transposed */ + if (ego->copy_transposed_in) { + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_1d) + (b * p->ny * vn, 1, 1), + I = p->I, p->O), + 0, 0, NO_SLOW); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + else + I = p->O; /* final transpose is in-place */ + } + else { /* transpose b x ny x vn -> ny x b x vn */ + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_3d) + (b, p->ny * vn, vn, + p->ny, vn, b * vn, + vn, 1, 1), + I = p->I, p->O), + 0, 0, NO_SLOW); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + + if (XM(any_true)(!XM(mkplans_posttranspose)(p, plnr, I, p->O, my_pe, + &cld2, &cld2rest, &cld3, + &rest_Ioff, &rest_Ooff), + p->comm)) goto nada; + + pln = MKPLAN_MPI_TRANSPOSE(P, &padt, apply); + + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->cld2rest = cld2rest; + pln->rest_Ioff = rest_Ioff; + pln->rest_Ooff = rest_Ooff; + pln->cld3 = cld3; + + MPI_Comm_dup(p->comm, &pln->comm); + + /* Compute sizes/offsets of blocks to send for all-to-all command. */ + sbs = (int *) MALLOC(4 * n_pes * sizeof(int), PLANS); + sbo = sbs + n_pes; + rbs = sbo + n_pes; + rbo = rbs + n_pes; + b = XM(block)(p->nx, p->block, my_pe); + bt = XM(block)(p->ny, p->tblock, my_pe); + for (pe = 0; pe < n_pes; ++pe) { + INT db, dbt; /* destination block sizes */ + db = XM(block)(p->nx, p->block, pe); + dbt = XM(block)(p->ny, p->tblock, pe); + if (db != p->block || dbt != p->tblock) + equal_blocks = 0; + + /* MPI requires type "int" here; apparently it + has no 64-bit API? Grrr. */ + sbs[pe] = (int) (b * dbt * vn); + sbo[pe] = (int) (pe * (b * p->tblock) * vn); + rbs[pe] = (int) (db * bt * vn); + rbo[pe] = (int) (pe * (p->block * bt) * vn); + } + pln->send_block_sizes = sbs; + pln->send_block_offsets = sbo; + pln->recv_block_sizes = rbs; + pln->recv_block_offsets = rbo; + pln->equal_blocks = equal_blocks; + + X(ops_zero)(&pln->super.super.ops); + if (cld1) X(ops_add2)(&cld1->ops, &pln->super.super.ops); + if (cld2) X(ops_add2)(&cld2->ops, &pln->super.super.ops); + if (cld2rest) X(ops_add2)(&cld2rest->ops, &pln->super.super.ops); + if (cld3) X(ops_add2)(&cld3->ops, &pln->super.super.ops); + /* FIXME: should MPI operations be counted in "other" somehow? */ + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld3); + X(plan_destroy_internal)(cld2rest); + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int copy_transposed_in) +{ + static const solver_adt sadt = { PROBLEM_MPI_TRANSPOSE, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->copy_transposed_in = copy_transposed_in; + return &(slv->super); +} + +void XM(transpose_alltoall_register)(planner *p) +{ + int cti; + for (cti = 0; cti <= 1; ++cti) + REGISTER_SOLVER(p, mksolver(cti)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-pairwise.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-pairwise.c new file mode 100644 index 000000000..53d20cfa3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-pairwise.c @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Distributed transposes using a sequence of carefully scheduled + pairwise exchanges. This has the advantage that it can be done + in-place, or out-of-place while preserving the input, using buffer + space proportional to the local size divided by the number of + processes (i.e. to the total array size divided by the number of + processes squared). */ + +#include "mpi-transpose.h" +#include + +typedef struct { + solver super; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_transpose super; + + plan *cld1, *cld2, *cld2rest, *cld3; + INT rest_Ioff, rest_Ooff; + + int n_pes, my_pe, *sched; + INT *send_block_sizes, *send_block_offsets; + INT *recv_block_sizes, *recv_block_offsets; + MPI_Comm comm; + int preserve_input; +} P; + +static void transpose_chunks(int *sched, int n_pes, int my_pe, + INT *sbs, INT *sbo, INT *rbs, INT *rbo, + MPI_Comm comm, + R *I, R *O) +{ + if (sched) { + int i; + MPI_Status status; + + /* TODO: explore non-synchronous send/recv? */ + + if (I == O) { + R *buf = (R*) MALLOC(sizeof(R) * sbs[0], BUFFERS); + + for (i = 0; i < n_pes; ++i) { + int pe = sched[i]; + if (my_pe == pe) { + if (rbo[pe] != sbo[pe]) + memmove(O + rbo[pe], O + sbo[pe], + sbs[pe] * sizeof(R)); + } + else { + memcpy(buf, O + sbo[pe], sbs[pe] * sizeof(R)); + MPI_Sendrecv(buf, (int) (sbs[pe]), FFTW_MPI_TYPE, + pe, (my_pe * n_pes + pe) & 0xffff, + O + rbo[pe], (int) (rbs[pe]), + FFTW_MPI_TYPE, + pe, (pe * n_pes + my_pe) & 0xffff, + comm, &status); + } + } + + X(ifree)(buf); + } + else { /* I != O */ + for (i = 0; i < n_pes; ++i) { + int pe = sched[i]; + if (my_pe == pe) + memcpy(O + rbo[pe], I + sbo[pe], sbs[pe] * sizeof(R)); + else + MPI_Sendrecv(I + sbo[pe], (int) (sbs[pe]), + FFTW_MPI_TYPE, + pe, (my_pe * n_pes + pe) & 0xffff, + O + rbo[pe], (int) (rbs[pe]), + FFTW_MPI_TYPE, + pe, (pe * n_pes + my_pe) & 0xffff, + comm, &status); + } + } + } +} + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld1, *cld2, *cld2rest, *cld3; + + /* transpose locally to get contiguous chunks */ + cld1 = (plan_rdft *) ego->cld1; + if (cld1) { + cld1->apply(ego->cld1, I, O); + + if (ego->preserve_input) I = O; + + /* transpose chunks globally */ + transpose_chunks(ego->sched, ego->n_pes, ego->my_pe, + ego->send_block_sizes, ego->send_block_offsets, + ego->recv_block_sizes, ego->recv_block_offsets, + ego->comm, O, I); + } + else if (ego->preserve_input) { + /* transpose chunks globally */ + transpose_chunks(ego->sched, ego->n_pes, ego->my_pe, + ego->send_block_sizes, ego->send_block_offsets, + ego->recv_block_sizes, ego->recv_block_offsets, + ego->comm, I, O); + + I = O; + } + else { + /* transpose chunks globally */ + transpose_chunks(ego->sched, ego->n_pes, ego->my_pe, + ego->send_block_sizes, ego->send_block_offsets, + ego->recv_block_sizes, ego->recv_block_offsets, + ego->comm, I, I); + } + + /* transpose locally, again, to get ordinary row-major; + this may take two transposes if the block sizes are unequal + (3 subplans, two of which operate on disjoint data) */ + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, I, O); + cld2rest = (plan_rdft *) ego->cld2rest; + if (cld2rest) { + cld2rest->apply(ego->cld2rest, + I + ego->rest_Ioff, O + ego->rest_Ooff); + cld3 = (plan_rdft *) ego->cld3; + if (cld3) + cld3->apply(ego->cld3, O, O); + /* else TRANSPOSED_OUT is true and user wants O transposed */ + } +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; + /* Note: this is *not* UGLY for out-of-place, destroy-input plans; + the planner often prefers transpose-pairwise to transpose-alltoall, + at least with LAM MPI on my machine. */ + return (1 + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && ONLY_TRANSPOSEDP(p->flags)); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); + X(plan_awake)(ego->cld2rest, wakefulness); + X(plan_awake)(ego->cld3, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(ifree0)(ego->sched); + X(ifree0)(ego->send_block_sizes); + MPI_Comm_free(&ego->comm); + X(plan_destroy_internal)(ego->cld3); + X(plan_destroy_internal)(ego->cld2rest); + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-transpose-pairwise%s%(%p%)%(%p%)%(%p%)%(%p%))", + ego->preserve_input==2 ?"/p":"", + ego->cld1, ego->cld2, ego->cld2rest, ego->cld3); +} + +/* Given a process which_pe and a number of processes npes, fills + the array sched[npes] with a sequence of processes to communicate + with for a deadlock-free, optimum-overlap all-to-all communication. + (All processes must call this routine to get their own schedules.) + The schedule can be re-ordered arbitrarily as long as all processes + apply the same permutation to their schedules. + + The algorithm here is based upon the one described in: + J. A. M. Schreuder, "Constructing timetables for sport + competitions," Mathematical Programming Study 13, pp. 58-67 (1980). + In a sport competition, you have N teams and want every team to + play every other team in as short a time as possible (maximum overlap + between games). This timetabling problem is therefore identical + to that of an all-to-all communications problem. In our case, there + is one wrinkle: as part of the schedule, the process must do + some data transfer with itself (local data movement), analogous + to a requirement that each team "play itself" in addition to other + teams. With this wrinkle, it turns out that an optimal timetable + (N parallel games) can be constructed for any N, not just for even + N as in the original problem described by Schreuder. +*/ +static void fill1_comm_sched(int *sched, int which_pe, int npes) +{ + int pe, i, n, s = 0; + A(which_pe >= 0 && which_pe < npes); + if (npes % 2 == 0) { + n = npes; + sched[s++] = which_pe; + } + else + n = npes + 1; + for (pe = 0; pe < n - 1; ++pe) { + if (npes % 2 == 0) { + if (pe == which_pe) sched[s++] = npes - 1; + else if (npes - 1 == which_pe) sched[s++] = pe; + } + else if (pe == which_pe) sched[s++] = pe; + + if (pe != which_pe && which_pe < n - 1) { + i = (pe - which_pe + (n - 1)) % (n - 1); + if (i < n/2) + sched[s++] = (pe + i) % (n - 1); + + i = (which_pe - pe + (n - 1)) % (n - 1); + if (i < n/2) + sched[s++] = (pe - i + (n - 1)) % (n - 1); + } + } + A(s == npes); +} + +/* Sort the communication schedule sched for npes so that the schedule + on process sortpe is ascending or descending (!ascending). This is + necessary to allow in-place transposes when the problem does not + divide equally among the processes. In this case there is one + process where the incoming blocks are bigger/smaller than the + outgoing blocks and thus have to be received in + descending/ascending order, respectively, to avoid overwriting data + before it is sent. */ +static void sort1_comm_sched(int *sched, int npes, int sortpe, int ascending) +{ + int *sortsched, i; + sortsched = (int *) MALLOC(npes * sizeof(int) * 2, OTHER); + fill1_comm_sched(sortsched, sortpe, npes); + if (ascending) + for (i = 0; i < npes; ++i) + sortsched[npes + sortsched[i]] = sched[i]; + else + for (i = 0; i < npes; ++i) + sortsched[2*npes - 1 - sortsched[i]] = sched[i]; + for (i = 0; i < npes; ++i) + sched[i] = sortsched[npes + i]; + X(ifree)(sortsched); +} + +/* make the plans to do the post-MPI transpositions (shared with + transpose-alltoall) */ +int XM(mkplans_posttranspose)(const problem_mpi_transpose *p, planner *plnr, + R *I, R *O, int my_pe, + plan **cld2, plan **cld2rest, plan **cld3, + INT *rest_Ioff, INT *rest_Ooff) +{ + INT vn = p->vn; + INT b = p->block; + INT bt = XM(block)(p->ny, p->tblock, my_pe); + INT nxb = p->nx / b; /* number of equal-sized blocks */ + INT nxr = p->nx - nxb * b; /* leftover rows after equal blocks */ + + *cld2 = *cld2rest = *cld3 = NULL; + *rest_Ioff = *rest_Ooff = 0; + + if (!(p->flags & TRANSPOSED_OUT) && (nxr == 0 || I != O)) { + INT nx = p->nx * vn; + b *= vn; + *cld2 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_3d) + (nxb, bt * b, b, + bt, b, nx, + b, 1, 1), + I, O), + 0, 0, NO_SLOW); + if (!*cld2) goto nada; + + if (nxr > 0) { + *rest_Ioff = nxb * bt * b; + *rest_Ooff = nxb * b; + b = nxr * vn; + *cld2rest = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_2d) + (bt, b, nx, + b, 1, 1), + I + *rest_Ioff, + O + *rest_Ooff), + 0, 0, NO_SLOW); + if (!*cld2rest) goto nada; + } + } + else { + *cld2 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_4d) + (nxb, bt * b * vn, bt * b * vn, + bt, b * vn, vn, + b, vn, bt * vn, + vn, 1, 1), + I, O), + 0, 0, NO_SLOW); + if (!*cld2) goto nada; + + *rest_Ioff = *rest_Ooff = nxb * bt * b * vn; + *cld2rest = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d) + (bt, nxr * vn, vn, + nxr, vn, bt * vn, + vn, 1, 1), + I + *rest_Ioff, O + *rest_Ooff), + 0, 0, NO_SLOW); + if (!*cld2rest) goto nada; + + if (!(p->flags & TRANSPOSED_OUT)) { + *cld3 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d) + (p->nx, bt * vn, vn, + bt, vn, p->nx * vn, + vn, 1, 1), + O, O), + 0, 0, NO_SLOW); + if (!*cld3) goto nada; + } + } + + return 1; + +nada: + X(plan_destroy_internal)(*cld3); + X(plan_destroy_internal)(*cld2rest); + X(plan_destroy_internal)(*cld2); + *cld2 = *cld2rest = *cld3 = NULL; + return 0; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_transpose *p; + P *pln; + plan *cld1 = 0, *cld2 = 0, *cld2rest = 0, *cld3 = 0; + INT b, bt, vn, rest_Ioff, rest_Ooff; + INT *sbs, *sbo, *rbs, *rbo; + int pe, my_pe, n_pes, sort_pe = -1, ascending = 1; + R *I, *O; + static const plan_adt padt = { + XM(transpose_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_mpi_transpose *) p_; + vn = p->vn; + I = p->I; O = p->O; + + MPI_Comm_rank(p->comm, &my_pe); + MPI_Comm_size(p->comm, &n_pes); + + b = XM(block)(p->nx, p->block, my_pe); + + if (!(p->flags & TRANSPOSED_IN)) { /* b x ny x vn -> ny x b x vn */ + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_3d) + (b, p->ny * vn, vn, + p->ny, vn, b * vn, + vn, 1, 1), + I, O), + 0, 0, NO_SLOW); + if (XM(any_true)(!cld1, p->comm)) goto nada; + } + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) I = O; + + if (XM(any_true)(!XM(mkplans_posttranspose)(p, plnr, I, O, my_pe, + &cld2, &cld2rest, &cld3, + &rest_Ioff, &rest_Ooff), + p->comm)) goto nada; + + pln = MKPLAN_MPI_TRANSPOSE(P, &padt, apply); + + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->cld2rest = cld2rest; + pln->rest_Ioff = rest_Ioff; + pln->rest_Ooff = rest_Ooff; + pln->cld3 = cld3; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + + MPI_Comm_dup(p->comm, &pln->comm); + + n_pes = (int) X(imax)(XM(num_blocks)(p->nx, p->block), + XM(num_blocks)(p->ny, p->tblock)); + + /* Compute sizes/offsets of blocks to exchange between processors */ + sbs = (INT *) MALLOC(4 * n_pes * sizeof(INT), PLANS); + sbo = sbs + n_pes; + rbs = sbo + n_pes; + rbo = rbs + n_pes; + b = XM(block)(p->nx, p->block, my_pe); + bt = XM(block)(p->ny, p->tblock, my_pe); + for (pe = 0; pe < n_pes; ++pe) { + INT db, dbt; /* destination block sizes */ + db = XM(block)(p->nx, p->block, pe); + dbt = XM(block)(p->ny, p->tblock, pe); + + sbs[pe] = b * dbt * vn; + sbo[pe] = pe * (b * p->tblock) * vn; + rbs[pe] = db * bt * vn; + rbo[pe] = pe * (p->block * bt) * vn; + + if (db * dbt > 0 && db * p->tblock != p->block * dbt) { + A(sort_pe == -1); /* only one process should need sorting */ + sort_pe = pe; + ascending = db * p->tblock > p->block * dbt; + } + } + pln->n_pes = n_pes; + pln->my_pe = my_pe; + pln->send_block_sizes = sbs; + pln->send_block_offsets = sbo; + pln->recv_block_sizes = rbs; + pln->recv_block_offsets = rbo; + + if (my_pe >= n_pes) { + pln->sched = 0; /* this process is not doing anything */ + } + else { + pln->sched = (int *) MALLOC(n_pes * sizeof(int), PLANS); + fill1_comm_sched(pln->sched, my_pe, n_pes); + if (sort_pe >= 0) + sort1_comm_sched(pln->sched, n_pes, sort_pe, ascending); + } + + X(ops_zero)(&pln->super.super.ops); + if (cld1) X(ops_add2)(&cld1->ops, &pln->super.super.ops); + if (cld2) X(ops_add2)(&cld2->ops, &pln->super.super.ops); + if (cld2rest) X(ops_add2)(&cld2rest->ops, &pln->super.super.ops); + if (cld3) X(ops_add2)(&cld3->ops, &pln->super.super.ops); + /* FIXME: should MPI operations be counted in "other" somehow? */ + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld3); + X(plan_destroy_internal)(cld2rest); + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input) +{ + static const solver_adt sadt = { PROBLEM_MPI_TRANSPOSE, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + return &(slv->super); +} + +void XM(transpose_pairwise_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) + REGISTER_SOLVER(p, mksolver(preserve_input)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-problem.c new file mode 100644 index 000000000..33468ea07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-problem.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-transpose.h" + +static void destroy(problem *ego_) +{ + problem_mpi_transpose *ego = (problem_mpi_transpose *) ego_; + MPI_Comm_free(&ego->comm); + X(ifree)(ego_); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; + int i; + X(md5puts)(m, "mpi-transpose"); + X(md5int)(m, p->I == p->O); + /* don't include alignment -- may differ between processes + X(md5int)(m, X(ialignment_of)(p->I)); + X(md5int)(m, X(ialignment_of)(p->O)); + ... note that applicability of MPI plans does not depend + on alignment (although optimality may, in principle). */ + X(md5INT)(m, p->vn); + X(md5INT)(m, p->nx); + X(md5INT)(m, p->ny); + X(md5INT)(m, p->block); + X(md5INT)(m, p->tblock); + MPI_Comm_size(p->comm, &i); X(md5int)(m, i); + A(XM(md5_equal)(*m, p->comm)); +} + +static void print(const problem *ego_, printer *p) +{ + const problem_mpi_transpose *ego = (const problem_mpi_transpose *) ego_; + int i; + MPI_Comm_size(ego->comm, &i); + p->print(p, "(mpi-transpose %d %d %d %D %D %D %D %D %d)", + ego->I == ego->O, + X(ialignment_of)(ego->I), + X(ialignment_of)(ego->O), + ego->vn, + ego->nx, ego->ny, + ego->block, ego->tblock, + i); +} + +static void zero(const problem *ego_) +{ + const problem_mpi_transpose *ego = (const problem_mpi_transpose *) ego_; + R *I = ego->I; + INT i, N = ego->vn * ego->ny; + int my_pe; + + MPI_Comm_rank(ego->comm, &my_pe); + N *= XM(block)(ego->nx, ego->block, my_pe); + + for (i = 0; i < N; ++i) I[i] = K(0.0); +} + +static const problem_adt padt = +{ + PROBLEM_MPI_TRANSPOSE, + hash, + zero, + print, + destroy +}; + +problem *XM(mkproblem_transpose)(INT nx, INT ny, INT vn, + R *I, R *O, + INT block, INT tblock, + MPI_Comm comm, + unsigned flags) +{ + problem_mpi_transpose *ego = + (problem_mpi_transpose *)X(mkproblem)(sizeof(problem_mpi_transpose), &padt); + + A(nx > 0 && ny > 0 && vn > 0); + A(block > 0 && XM(num_blocks_ok)(nx, block, comm) + && tblock > 0 && XM(num_blocks_ok)(ny, tblock, comm)); + + /* enforce pointer equality if untainted pointers are equal */ + if (UNTAINT(I) == UNTAINT(O)) + I = O = JOIN_TAINT(I, O); + + ego->nx = nx; + ego->ny = ny; + ego->vn = vn; + ego->I = I; + ego->O = O; + ego->block = block > nx ? nx : block; + ego->tblock = tblock > ny ? ny : tblock; + + /* canonicalize flags: we can freely assume that the data is + "transposed" if one of the dimensions is 1. */ + if (ego->block == 1) + flags |= TRANSPOSED_IN; + if (ego->tblock == 1) + flags |= TRANSPOSED_OUT; + ego->flags = flags; + + MPI_Comm_dup(comm, &ego->comm); + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-recurse.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-recurse.c new file mode 100644 index 000000000..c1e0f3f82 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-recurse.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Recursive "radix-r" distributed transpose, which breaks a transpose + over p processes into p/r transposes over r processes plus r + transposes over p/r processes. If performed recursively, this + produces a total of O(p log p) messages vs. O(p^2) messages for a + direct approach. + + However, this is not necessarily an improvement. The total size of + all the messages is actually increased from O(N) to O(N log p) + where N is the total data size. Also, the amount of local data + rearrangement is increased. So, it's not clear, a priori, what the + best algorithm will be, and we'll leave it to the planner. (In + theory and practice, it looks like this becomes advantageous for + large p, in the limit where the message sizes are small and + latency-dominated.) +*/ + +#include "mpi-transpose.h" +#include + +typedef struct { + solver super; + int (*radix)(int np); + const char *nam; + int preserve_input; /* preserve input even if DESTROY_INPUT was passed */ +} S; + +typedef struct { + plan_mpi_transpose super; + + plan *cld1, *cldtr, *cldtm; + int preserve_input; + + int r; /* "radix" */ + const char *nam; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld1, *cldtr, *cldtm; + + cld1 = (plan_rdft *) ego->cld1; + if (cld1) cld1->apply((plan *) cld1, I, O); + + if (ego->preserve_input) I = O; + + cldtr = (plan_rdft *) ego->cldtr; + if (cldtr) cldtr->apply((plan *) cldtr, O, I); + + cldtm = (plan_rdft *) ego->cldtm; + if (cldtm) cldtm->apply((plan *) cldtm, I, O); +} + +static int radix_sqrt(int np) +{ + int r; + for (r = (int) (X(isqrt)(np)); np % r != 0; ++r) + ; + return r; +} + +static int radix_first(int np) +{ + int r = (int) (X(first_divisor)(np)); + return (r >= (int) (X(isqrt)(np)) ? 0 : r); +} + +/* the local allocated space on process pe required for the given transpose + dimensions and block sizes */ +static INT transpose_space(INT nx, INT ny, INT block, INT tblock, int pe) +{ + return X(imax)(XM(block)(nx, block, pe) * ny, + nx * XM(block)(ny, tblock, pe)); +} + +/* check whether the recursive transposes fit within the space + that must have been allocated on each process for this transpose; + this must be modified if the subdivision in mkplan is changed! */ +static int enough_space(INT nx, INT ny, INT block, INT tblock, + int r, int n_pes) +{ + int pe; + int m = n_pes / r; + for (pe = 0; pe < n_pes; ++pe) { + INT space = transpose_space(nx, ny, block, tblock, pe); + INT b1 = XM(block)(nx, r * block, pe / r); + INT b2 = XM(block)(ny, m * tblock, pe % r); + if (transpose_space(b1, ny, block, m*tblock, pe % r) > space + || transpose_space(nx, b2, r*block, tblock, pe / r) > space) + return 0; + } + return 1; +} + +/* In theory, transpose-recurse becomes advantageous for message sizes + below some minimum, assuming that the time is dominated by + communications. In practice, we want to constrain the minimum + message size for transpose-recurse to keep the planning time down. + I've set this conservatively according to some simple experiments + on a Cray XT3 where the crossover message size was 128, although on + a larger-latency machine the crossover will be larger. */ +#define SMALL_MESSAGE 2048 + +static int applicable(const S *ego, const problem *p_, + const planner *plnr, int *r) +{ + const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; + int n_pes; + MPI_Comm_size(p->comm, &n_pes); + return (1 + && p->tblock * n_pes == p->ny + && (!ego->preserve_input || (!NO_DESTROY_INPUTP(plnr) + && p->I != p->O)) + && (*r = ego->radix(n_pes)) && *r < n_pes && *r > 1 + && enough_space(p->nx, p->ny, p->block, p->tblock, *r, n_pes) + && (!CONSERVE_MEMORYP(plnr) || *r > 8 + || !X(toobig)((p->nx * (p->ny / n_pes) * p->vn) / *r)) + && (!NO_SLOWP(plnr) || + (p->nx * (p->ny / n_pes) * p->vn) / n_pes <= SMALL_MESSAGE) + && ONLY_TRANSPOSEDP(p->flags) + ); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cldtr, wakefulness); + X(plan_awake)(ego->cldtm, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldtm); + X(plan_destroy_internal)(ego->cldtr); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(mpi-transpose-recurse/%s/%d%s%(%p%)%(%p%)%(%p%))", + ego->nam, ego->r, ego->preserve_input==2 ?"/p":"", + ego->cld1, ego->cldtr, ego->cldtm); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_mpi_transpose *p; + P *pln; + plan *cld1 = 0, *cldtr = 0, *cldtm = 0; + R *I, *O; + int me, np, r, m; + INT b; + MPI_Comm comm2; + static const plan_adt padt = { + XM(transpose_solve), awake, print, destroy + }; + + UNUSED(ego); + + if (!applicable(ego, p_, plnr, &r)) + return (plan *) 0; + + p = (const problem_mpi_transpose *) p_; + + MPI_Comm_size(p->comm, &np); + MPI_Comm_rank(p->comm, &me); + m = np / r; + A(r * m == np); + + I = p->I; O = p->O; + + b = XM(block)(p->nx, p->block, me); + A(p->tblock * np == p->ny); /* this is currently required for cld1 */ + if (p->flags & TRANSPOSED_IN) { + /* m x r x (bt x b x vn) -> r x m x (bt x b x vn) */ + INT vn = p->vn * b * p->tblock; + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_3d) + (m, r*vn, vn, + r, vn, m*vn, + vn, 1, 1), + I, O), + 0, 0, NO_SLOW); + } + else if (I != O) { /* combine cld1 with TRANSPOSED_IN permutation */ + /* b x m x r x bt x vn -> r x m x bt x b x vn */ + INT vn = p->vn; + INT bt = p->tblock; + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_5d) + (b, m*r*bt*vn, vn, + m, r*bt*vn, bt*b*vn, + r, bt*vn, m*bt*b*vn, + bt, vn, b*vn, + vn, 1, 1), + I, O), + 0, 0, NO_SLOW); + } + else { /* TRANSPOSED_IN permutation must be separate for in-place */ + /* b x (m x r) x bt x vn -> b x (r x m) x bt x vn */ + INT vn = p->vn * p->tblock; + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_0_d)(X(mktensor_4d) + (m, r*vn, vn, + r, vn, m*vn, + vn, 1, 1, + b, np*vn, np*vn), + I, O), + 0, 0, NO_SLOW); + } + if (XM(any_true)(!cld1, p->comm)) goto nada; + + if (ego->preserve_input || NO_DESTROY_INPUTP(plnr)) I = O; + + b = XM(block)(p->nx, r * p->block, me / r); + MPI_Comm_split(p->comm, me / r, me, &comm2); + if (b) + cldtr = X(mkplan_d)(plnr, XM(mkproblem_transpose) + (b, p->ny, p->vn, + O, I, p->block, m * p->tblock, comm2, + p->I != p->O + ? TRANSPOSED_IN : (p->flags & TRANSPOSED_IN))); + MPI_Comm_free(&comm2); + if (XM(any_true)(b && !cldtr, p->comm)) goto nada; + + b = XM(block)(p->ny, m * p->tblock, me % r); + MPI_Comm_split(p->comm, me % r, me, &comm2); + if (b) + cldtm = X(mkplan_d)(plnr, XM(mkproblem_transpose) + (p->nx, b, p->vn, + I, O, r * p->block, p->tblock, comm2, + TRANSPOSED_IN | (p->flags & TRANSPOSED_OUT))); + MPI_Comm_free(&comm2); + if (XM(any_true)(b && !cldtm, p->comm)) goto nada; + + pln = MKPLAN_MPI_TRANSPOSE(P, &padt, apply); + + pln->cld1 = cld1; + pln->cldtr = cldtr; + pln->cldtm = cldtm; + pln->preserve_input = ego->preserve_input ? 2 : NO_DESTROY_INPUTP(plnr); + pln->r = r; + pln->nam = ego->nam; + + pln->super.super.ops = cld1->ops; + if (cldtr) X(ops_add2)(&cldtr->ops, &pln->super.super.ops); + if (cldtm) X(ops_add2)(&cldtm->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldtm); + X(plan_destroy_internal)(cldtr); + X(plan_destroy_internal)(cld1); + return (plan *) 0; +} + +static solver *mksolver(int preserve_input, + int (*radix)(int np), const char *nam) +{ + static const solver_adt sadt = { PROBLEM_MPI_TRANSPOSE, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->preserve_input = preserve_input; + slv->radix = radix; + slv->nam = nam; + return &(slv->super); +} + +void XM(transpose_recurse_register)(planner *p) +{ + int preserve_input; + for (preserve_input = 0; preserve_input <= 1; ++preserve_input) { + REGISTER_SOLVER(p, mksolver(preserve_input, radix_sqrt, "sqrt")); + REGISTER_SOLVER(p, mksolver(preserve_input, radix_first, "first")); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-solve.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-solve.c new file mode 100644 index 000000000..0d0e18e17 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/transpose-solve.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "mpi-transpose.h" + +/* use the apply() operation for MPI_TRANSPOSE problems */ +void XM(transpose_solve)(const plan *ego_, const problem *p_) +{ + const plan_mpi_transpose *ego = (const plan_mpi_transpose *) ego_; + const problem_mpi_transpose *p = (const problem_mpi_transpose *) p_; + ego->apply(ego_, UNTAINT(p->I), UNTAINT(p->O)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/wisdom-api.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/wisdom-api.c new file mode 100644 index 000000000..ba7a43471 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/mpi/wisdom-api.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "fftw3-mpi.h" +#include "ifftw-mpi.h" +#include + +#if SIZEOF_SIZE_T == SIZEOF_UNSIGNED_INT +# define FFTW_MPI_SIZE_T MPI_UNSIGNED +#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG +# define FFTW_MPI_SIZE_T MPI_UNSIGNED_LONG +#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG_LONG +# define FFTW_MPI_SIZE_T MPI_UNSIGNED_LONG_LONG +#else +# error MPI type for size_t is unknown +# define FFTW_MPI_SIZE_T MPI_UNSIGNED_LONG +#endif + +/* Import wisdom from all processes to process 0, as prelude to + exporting a single wisdom file (this is convenient when we are + running on identical processors, to avoid the annoyance of having + per-process wisdom files). In order to make the time for this + operation logarithmic in the number of processors (rather than + linear), we employ a tree reduction algorithm. This means that the + wisdom is modified on processes other than root, which shouldn't + matter in practice. */ +void XM(gather_wisdom)(MPI_Comm comm_) +{ + MPI_Comm comm, comm2; + int my_pe, n_pes; + char *wis; + size_t wislen; + MPI_Status status; + + MPI_Comm_dup(comm_, &comm); + MPI_Comm_rank(comm, &my_pe); + MPI_Comm_size(comm, &n_pes); + + if (n_pes > 2) { /* recursively split into even/odd processes */ + MPI_Comm_split(comm, my_pe % 2, my_pe, &comm2); + XM(gather_wisdom)(comm2); + MPI_Comm_free(&comm2); + } + if (n_pes > 1 && my_pe < 2) { /* import process 1 -> 0 */ + if (my_pe == 1) { + wis = X(export_wisdom_to_string)(); + wislen = strlen(wis) + 1; + MPI_Send(&wislen, 1, FFTW_MPI_SIZE_T, 0, 111, comm); + MPI_Send(wis, wislen, MPI_CHAR, 0, 222, comm); + free(wis); + } + else /* my_pe == 0 */ { + MPI_Recv(&wislen, 1, FFTW_MPI_SIZE_T, 1, 111, comm, &status); + wis = (char *) MALLOC(wislen * sizeof(char), OTHER); + MPI_Recv(wis, wislen, MPI_CHAR, 1, 222, comm, &status); + if (!X(import_wisdom_from_string)(wis)) + MPI_Abort(comm, 1); + X(ifree)(wis); + } + } + MPI_Comm_free(&comm); +} + +/* broadcast wisdom from process 0 to all other processes; this + is useful so that we can import wisdom once and not worry + about parallel I/O or process-specific wisdom, although of + course it assumes that all the processes have identical + performance characteristics (i.e. identical hardware). */ +void XM(broadcast_wisdom)(MPI_Comm comm_) +{ + MPI_Comm comm; + int my_pe; + char *wis; + size_t wislen; + + MPI_Comm_dup(comm_, &comm); + MPI_Comm_rank(comm, &my_pe); + + if (my_pe != 0) { + MPI_Bcast(&wislen, 1, FFTW_MPI_SIZE_T, 0, comm); + wis = (char *) MALLOC(wislen * sizeof(char), OTHER); + MPI_Bcast(wis, wislen, MPI_CHAR, 0, comm); + if (!X(import_wisdom_from_string)(wis)) + MPI_Abort(comm, 1); + X(ifree)(wis); + } + else /* my_pe == 0 */ { + wis = X(export_wisdom_to_string)(); + wislen = strlen(wis) + 1; + MPI_Bcast(&wislen, 1, FFTW_MPI_SIZE_T, 0, comm); + MPI_Bcast(wis, wislen, MPI_CHAR, 0, comm); + X(free)(wis); + } + MPI_Comm_free(&comm); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/Makefile.am new file mode 100644 index 000000000..fa96b2978 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/Makefile.am @@ -0,0 +1,15 @@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = scalar simd + +noinst_LTLIBRARIES = librdft.la + +RDFT2 = buffered2.c direct2.c nop2.c rank0-rdft2.c rank-geq2-rdft2.c \ +plan2.c problem2.c solve2.c vrank-geq1-rdft2.c rdft2-rdft.c \ +rdft2-tensor-max-index.c rdft2-inplace-strides.c rdft2-strides.c \ +khc2c.c ct-hc2c.h ct-hc2c.c ct-hc2c-direct.c + +librdft_la_SOURCES = hc2hc.h hc2hc.c dft-r2hc.c dht-r2hc.c dht-rader.c \ +buffered.c codelet-rdft.h conf.c direct-r2r.c direct-r2c.c generic.c \ +hc2hc-direct.c hc2hc-generic.c khc2hc.c kr2c.c kr2r.c indirect.c nop.c \ +plan.c problem.c rank0.c rank-geq2.c rdft.h rdft-dht.c solve.c \ +vrank-geq1.c vrank3-transpose.c $(RDFT2) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/Makefile.in new file mode 100644 index 000000000..7ec149aa5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/Makefile.in @@ -0,0 +1,803 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_la_LIBADD = +am__objects_1 = buffered2.lo direct2.lo nop2.lo rank0-rdft2.lo \ + rank-geq2-rdft2.lo plan2.lo problem2.lo solve2.lo \ + vrank-geq1-rdft2.lo rdft2-rdft.lo rdft2-tensor-max-index.lo \ + rdft2-inplace-strides.lo rdft2-strides.lo khc2c.lo ct-hc2c.lo \ + ct-hc2c-direct.lo +am_librdft_la_OBJECTS = hc2hc.lo dft-r2hc.lo dht-r2hc.lo dht-rader.lo \ + buffered.lo conf.lo direct-r2r.lo direct-r2c.lo generic.lo \ + hc2hc-direct.lo hc2hc-generic.lo khc2hc.lo kr2c.lo kr2r.lo \ + indirect.lo nop.lo plan.lo problem.lo rank0.lo rank-geq2.lo \ + rdft-dht.lo solve.lo vrank-geq1.lo vrank3-transpose.lo \ + $(am__objects_1) +librdft_la_OBJECTS = $(am_librdft_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_la_SOURCES) +DIST_SOURCES = $(librdft_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = scalar simd +noinst_LTLIBRARIES = librdft.la +RDFT2 = buffered2.c direct2.c nop2.c rank0-rdft2.c rank-geq2-rdft2.c \ +plan2.c problem2.c solve2.c vrank-geq1-rdft2.c rdft2-rdft.c \ +rdft2-tensor-max-index.c rdft2-inplace-strides.c rdft2-strides.c \ +khc2c.c ct-hc2c.h ct-hc2c.c ct-hc2c-direct.c + +librdft_la_SOURCES = hc2hc.h hc2hc.c dft-r2hc.c dht-r2hc.c dht-rader.c \ +buffered.c codelet-rdft.h conf.c direct-r2r.c direct-r2c.c generic.c \ +hc2hc-direct.c hc2hc-generic.c khc2hc.c kr2c.c kr2r.c indirect.c nop.c \ +plan.c problem.c rank0.c rank-geq2.c rdft.h rdft-dht.c solve.c \ +vrank-geq1.c vrank3-transpose.c $(RDFT2) + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft.la: $(librdft_la_OBJECTS) $(librdft_la_DEPENDENCIES) $(EXTRA_librdft_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(librdft_la_OBJECTS) $(librdft_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffered.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffered2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ct-hc2c-direct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ct-hc2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dft-r2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dht-r2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dht-rader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/direct-r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/direct-r2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/direct2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2hc-direct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2hc-generic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indirect.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/khc2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/khc2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kr2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kr2r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nop2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plan2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/problem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/problem2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rank-geq2-rdft2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rank-geq2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rank0-rdft2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rank0.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft-dht.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-inplace-strides.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-rdft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-strides.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdft2-tensor-max-index.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solve2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vrank-geq1-rdft2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vrank-geq1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vrank3-transpose.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/buffered.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/buffered.c new file mode 100644 index 000000000..dfc704cd6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/buffered.c @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +typedef struct { + solver super; + size_t maxnbuf_ndx; +} S; + +static const INT maxnbufs[] = { 8, 256 }; + +typedef struct { + plan_rdft super; + + plan *cld, *cldcpy, *cldrest; + INT n, vl, nbuf, bufdist; + INT ivs_by_nbuf, ovs_by_nbuf; +} P; + +/* transform a vector input with the help of bufs */ +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld = (plan_rdft *) ego->cld; + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + plan_rdft *cldrest; + INT i, vl = ego->vl, nbuf = ego->nbuf; + INT ivs_by_nbuf = ego->ivs_by_nbuf, ovs_by_nbuf = ego->ovs_by_nbuf; + R *bufs; + + bufs = (R *)MALLOC(sizeof(R) * nbuf * ego->bufdist, BUFFERS); + + for (i = nbuf; i <= vl; i += nbuf) { + /* transform to bufs: */ + cld->apply((plan *) cld, I, bufs); + I += ivs_by_nbuf; + + /* copy back */ + cldcpy->apply((plan *) cldcpy, bufs, O); + O += ovs_by_nbuf; + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_rdft *) ego->cldrest; + cldrest->apply((plan *) cldrest, I, O); +} + +/* for hc2r problems, copy the input into buffer, and then + transform buffer->output, which allows for destruction of the + buffer */ +static void apply_hc2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld = (plan_rdft *) ego->cld; + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + plan_rdft *cldrest; + INT i, vl = ego->vl, nbuf = ego->nbuf; + INT ivs_by_nbuf = ego->ivs_by_nbuf, ovs_by_nbuf = ego->ovs_by_nbuf; + R *bufs; + + bufs = (R *)MALLOC(sizeof(R) * nbuf * ego->bufdist, BUFFERS); + + for (i = nbuf; i <= vl; i += nbuf) { + /* copy input into bufs: */ + cldcpy->apply((plan *) cldcpy, I, bufs); + I += ivs_by_nbuf; + + /* transform to output */ + cld->apply((plan *) cld, bufs, O); + O += ovs_by_nbuf; + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_rdft *) ego->cldrest; + cldrest->apply((plan *) cldrest, I, O); +} + + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldcpy, wakefulness); + X(plan_awake)(ego->cldrest, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldrest); + X(plan_destroy_internal)(ego->cldcpy); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rdft-buffered-%D%v/%D-%D%(%p%)%(%p%)%(%p%))", + ego->n, ego->nbuf, + ego->vl, ego->bufdist % ego->n, + ego->cld, ego->cldcpy, ego->cldrest); +} + +static int applicable0(const S *ego, const problem *p_, const planner *plnr) +{ + const problem_rdft *p = (const problem_rdft *) p_; + iodim *d = p->sz->dims; + + if (1 + && p->vecsz->rnk <= 1 + && p->sz->rnk == 1 + ) { + INT vl, ivs, ovs; + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + + if (X(toobig)(d[0].n) && CONSERVE_MEMORYP(plnr)) + return 0; + + /* if this solver is redundant, in the sense that a solver + of lower index generates the same plan, then prune this + solver */ + if (X(nbuf_redundant)(d[0].n, vl, + ego->maxnbuf_ndx, + maxnbufs, NELEM(maxnbufs))) + return 0; + + if (p->I != p->O) { + if (p->kind[0] == HC2R) { + /* Allow HC2R problems only if the input is to be + preserved. This solver sets NO_DESTROY_INPUT, + which prevents infinite loops */ + return (NO_DESTROY_INPUTP(plnr)); + } else { + /* + In principle, the buffered transforms might be useful + when working out of place. However, in order to + prevent infinite loops in the planner, we require + that the output stride of the buffered transforms be + greater than 1. + */ + return (d[0].os > 1); + } + } + + /* + * If the problem is in place, the input/output strides must + * be the same or the whole thing must fit in the buffer. + */ + if (X(tensor_inplace_strides2)(p->sz, p->vecsz)) + return 1; + + if (/* fits into buffer: */ + ((p->vecsz->rnk == 0) + || + (X(nbuf)(d[0].n, p->vecsz->dims[0].n, + maxnbufs[ego->maxnbuf_ndx]) + == p->vecsz->dims[0].n))) + return 1; + } + + return 0; +} + +static int applicable(const S *ego, const problem *p_, const planner *plnr) +{ + const problem_rdft *p; + + if (NO_BUFFERINGP(plnr)) return 0; + + if (!applicable0(ego, p_, plnr)) return 0; + + p = (const problem_rdft *) p_; + if (p->kind[0] == HC2R) { + if (NO_UGLYP(plnr)) { + /* UGLY if in-place and too big, since the problem + could be solved via transpositions */ + if (p->I == p->O && X(toobig)(p->sz->dims[0].n)) + return 0; + } + } else { + if (NO_UGLYP(plnr)) { + if (p->I != p->O) return 0; + if (X(toobig)(p->sz->dims[0].n)) return 0; + } + } + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const S *ego = (const S *)ego_; + plan *cld = (plan *) 0; + plan *cldcpy = (plan *) 0; + plan *cldrest = (plan *) 0; + const problem_rdft *p = (const problem_rdft *) p_; + R *bufs = (R *) 0; + INT nbuf = 0, bufdist, n, vl; + INT ivs, ovs; + int hc2rp; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego, p_, plnr)) + goto nada; + + n = X(tensor_sz)(p->sz); + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + hc2rp = (p->kind[0] == HC2R); + + nbuf = X(nbuf)(n, vl, maxnbufs[ego->maxnbuf_ndx]); + bufdist = X(bufdist)(n, vl); + A(nbuf > 0); + + /* initial allocation for the purpose of planning */ + bufs = (R *) MALLOC(sizeof(R) * nbuf * bufdist, BUFFERS); + + if (hc2rp) { + /* allow destruction of buffer */ + cld = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(n, 1, p->sz->dims[0].os), + X(mktensor_1d)(nbuf, bufdist, ovs), + bufs, TAINT(p->O, ovs * nbuf), p->kind), + 0, 0, NO_DESTROY_INPUT); + if (!cld) goto nada; + + /* copying input into buffer buffer is a rank-0 transform: */ + cldcpy = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_2d)(nbuf, ivs, bufdist, + n, p->sz->dims[0].is, 1), + TAINT(p->I, ivs * nbuf), bufs)); + if (!cldcpy) goto nada; + } else { + /* allow destruction of input if problem is in place */ + cld = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(n, p->sz->dims[0].is, 1), + X(mktensor_1d)(nbuf, ivs, bufdist), + TAINT(p->I, ivs * nbuf), bufs, p->kind), + 0, 0, (p->I == p->O) ? NO_DESTROY_INPUT : 0); + if (!cld) goto nada; + + /* copying back from the buffer is a rank-0 transform: */ + cldcpy = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_2d)(nbuf, bufdist, ovs, + n, 1, p->sz->dims[0].os), + bufs, TAINT(p->O, ovs * nbuf))); + if (!cldcpy) goto nada; + } + + /* deallocate buffers, let apply() allocate them for real */ + X(ifree)(bufs); + bufs = 0; + + /* plan the leftover transforms (cldrest): */ + { + INT id = ivs * (nbuf * (vl / nbuf)); + INT od = ovs * (nbuf * (vl / nbuf)); + cldrest = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(tensor_copy)(p->sz), + X(mktensor_1d)(vl % nbuf, ivs, ovs), + p->I + id, p->O + od, p->kind)); + } + if (!cldrest) goto nada; + + pln = MKPLAN_RDFT(P, &padt, hc2rp ? apply_hc2r : apply); + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->cldrest = cldrest; + pln->n = n; + pln->vl = vl; + pln->ivs_by_nbuf = ivs * nbuf; + pln->ovs_by_nbuf = ovs * nbuf; + + pln->nbuf = nbuf; + pln->bufdist = bufdist; + + { + opcnt t; + X(ops_add)(&cld->ops, &cldcpy->ops, &t); + X(ops_madd)(vl / nbuf, &t, &cldrest->ops, &pln->super.super.ops); + } + + return &(pln->super.super); + + nada: + X(ifree0)(bufs); + X(plan_destroy_internal)(cldrest); + X(plan_destroy_internal)(cldcpy); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +static solver *mksolver(size_t maxnbuf_ndx) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->maxnbuf_ndx = maxnbuf_ndx; + return &(slv->super); +} + +void X(rdft_buffered_register)(planner *p) +{ + size_t i; + for (i = 0; i < NELEM(maxnbufs); ++i) + REGISTER_SOLVER(p, mksolver(i)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/buffered2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/buffered2.c new file mode 100644 index 000000000..4535d80cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/buffered2.c @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* buffering of rdft2. We always buffer the complex array */ + +#include "rdft/rdft.h" +#include "dft/dft.h" + +typedef struct { + solver super; + size_t maxnbuf_ndx; +} S; + +static const INT maxnbufs[] = { 8, 256 }; + +typedef struct { + plan_rdft2 super; + + plan *cld, *cldcpy, *cldrest; + INT n, vl, nbuf, bufdist; + INT ivs_by_nbuf, ovs_by_nbuf; + INT ioffset, roffset; +} P; + +/* transform a vector input with the help of bufs */ +static void apply_r2hc(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld = (plan_rdft2 *) ego->cld; + plan_dft *cldcpy = (plan_dft *) ego->cldcpy; + INT i, vl = ego->vl, nbuf = ego->nbuf; + INT ivs_by_nbuf = ego->ivs_by_nbuf, ovs_by_nbuf = ego->ovs_by_nbuf; + R *bufs = (R *)MALLOC(sizeof(R) * nbuf * ego->bufdist, BUFFERS); + R *bufr = bufs + ego->roffset; + R *bufi = bufs + ego->ioffset; + plan_rdft2 *cldrest; + + for (i = nbuf; i <= vl; i += nbuf) { + /* transform to bufs: */ + cld->apply((plan *) cld, r0, r1, bufr, bufi); + r0 += ivs_by_nbuf; r1 += ivs_by_nbuf; + + /* copy back */ + cldcpy->apply((plan *) cldcpy, bufr, bufi, cr, ci); + cr += ovs_by_nbuf; ci += ovs_by_nbuf; + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_rdft2 *) ego->cldrest; + cldrest->apply((plan *) cldrest, r0, r1, cr, ci); +} + +/* for hc2r problems, copy the input into buffer, and then + transform buffer->output, which allows for destruction of the + buffer */ +static void apply_hc2r(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld = (plan_rdft2 *) ego->cld; + plan_dft *cldcpy = (plan_dft *) ego->cldcpy; + INT i, vl = ego->vl, nbuf = ego->nbuf; + INT ivs_by_nbuf = ego->ivs_by_nbuf, ovs_by_nbuf = ego->ovs_by_nbuf; + R *bufs = (R *)MALLOC(sizeof(R) * nbuf * ego->bufdist, BUFFERS); + R *bufr = bufs + ego->roffset; + R *bufi = bufs + ego->ioffset; + plan_rdft2 *cldrest; + + for (i = nbuf; i <= vl; i += nbuf) { + /* copy input into bufs: */ + cldcpy->apply((plan *) cldcpy, cr, ci, bufr, bufi); + cr += ivs_by_nbuf; ci += ivs_by_nbuf; + + /* transform to output */ + cld->apply((plan *) cld, r0, r1, bufr, bufi); + r0 += ovs_by_nbuf; r1 += ovs_by_nbuf; + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_rdft2 *) ego->cldrest; + cldrest->apply((plan *) cldrest, r0, r1, cr, ci); +} + + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldcpy, wakefulness); + X(plan_awake)(ego->cldrest, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldrest); + X(plan_destroy_internal)(ego->cldcpy); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rdft2-buffered-%D%v/%D-%D%(%p%)%(%p%)%(%p%))", + ego->n, ego->nbuf, + ego->vl, ego->bufdist % ego->n, + ego->cld, ego->cldcpy, ego->cldrest); +} + +static int applicable0(const S *ego, const problem *p_, const planner *plnr) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + iodim *d = p->sz->dims; + + if (1 + && p->vecsz->rnk <= 1 + && p->sz->rnk == 1 + + /* we assume even n throughout */ + && (d[0].n % 2) == 0 + + /* and we only consider these two cases */ + && (p->kind == R2HC || p->kind == HC2R) + + ) { + INT vl, ivs, ovs; + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + + if (X(toobig)(d[0].n) && CONSERVE_MEMORYP(plnr)) + return 0; + + /* if this solver is redundant, in the sense that a solver + of lower index generates the same plan, then prune this + solver */ + if (X(nbuf_redundant)(d[0].n, vl, + ego->maxnbuf_ndx, + maxnbufs, NELEM(maxnbufs))) + return 0; + + if (p->r0 != p->cr) { + if (p->kind == HC2R) { + /* Allow HC2R problems only if the input is to be + preserved. This solver sets NO_DESTROY_INPUT, + which prevents infinite loops */ + return (NO_DESTROY_INPUTP(plnr)); + } else { + /* + In principle, the buffered transforms might be useful + when working out of place. However, in order to + prevent infinite loops in the planner, we require + that the output stride of the buffered transforms be + greater than 2. + */ + return (d[0].os > 2); + } + } + + /* + * If the problem is in place, the input/output strides must + * be the same or the whole thing must fit in the buffer. + */ + if (X(rdft2_inplace_strides(p, RNK_MINFTY))) + return 1; + + if (/* fits into buffer: */ + ((p->vecsz->rnk == 0) + || + (X(nbuf)(d[0].n, p->vecsz->dims[0].n, + maxnbufs[ego->maxnbuf_ndx]) + == p->vecsz->dims[0].n))) + return 1; + } + + return 0; +} + +static int applicable(const S *ego, const problem *p_, const planner *plnr) +{ + const problem_rdft2 *p; + + if (NO_BUFFERINGP(plnr)) return 0; + + if (!applicable0(ego, p_, plnr)) return 0; + + p = (const problem_rdft2 *) p_; + if (p->kind == HC2R) { + if (NO_UGLYP(plnr)) { + /* UGLY if in-place and too big, since the problem + could be solved via transpositions */ + if (p->r0 == p->cr && X(toobig)(p->sz->dims[0].n)) + return 0; + } + } else { + if (NO_UGLYP(plnr)) { + if (p->r0 != p->cr || X(toobig)(p->sz->dims[0].n)) + return 0; + } + } + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const S *ego = (const S *)ego_; + plan *cld = (plan *) 0; + plan *cldcpy = (plan *) 0; + plan *cldrest = (plan *) 0; + const problem_rdft2 *p = (const problem_rdft2 *) p_; + R *bufs = (R *) 0; + INT nbuf = 0, bufdist, n, vl; + INT ivs, ovs, ioffset, roffset, id, od; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + if (!applicable(ego, p_, plnr)) + goto nada; + + n = X(tensor_sz)(p->sz); + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + + nbuf = X(nbuf)(n, vl, maxnbufs[ego->maxnbuf_ndx]); + bufdist = X(bufdist)(n + 2, vl); /* complex-side rdft2 stores N+2 + real numbers */ + A(nbuf > 0); + + /* attempt to keep real and imaginary part in the same order, + so as to allow optimizations in the the copy plan */ + roffset = (p->cr - p->ci > 0) ? (INT)1 : (INT)0; + ioffset = 1 - roffset; + + /* initial allocation for the purpose of planning */ + bufs = (R *) MALLOC(sizeof(R) * nbuf * bufdist, BUFFERS); + + id = ivs * (nbuf * (vl / nbuf)); + od = ovs * (nbuf * (vl / nbuf)); + + if (p->kind == R2HC) { + /* allow destruction of input if problem is in place */ + cld = X(mkplan_f_d)( + plnr, + X(mkproblem_rdft2_d)( + X(mktensor_1d)(n, p->sz->dims[0].is, 2), + X(mktensor_1d)(nbuf, ivs, bufdist), + TAINT(p->r0, ivs * nbuf), TAINT(p->r1, ivs * nbuf), + bufs + roffset, bufs + ioffset, p->kind), + 0, 0, (p->r0 == p->cr) ? NO_DESTROY_INPUT : 0); + if (!cld) goto nada; + + /* copying back from the buffer is a rank-0 DFT: */ + cldcpy = X(mkplan_d)( + plnr, + X(mkproblem_dft_d)( + X(mktensor_0d)(), + X(mktensor_2d)(nbuf, bufdist, ovs, + n/2+1, 2, p->sz->dims[0].os), + bufs + roffset, bufs + ioffset, + TAINT(p->cr, ovs * nbuf), TAINT(p->ci, ovs * nbuf) )); + if (!cldcpy) goto nada; + + X(ifree)(bufs); bufs = 0; + + cldrest = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)( + X(tensor_copy)(p->sz), + X(mktensor_1d)(vl % nbuf, ivs, ovs), + p->r0 + id, p->r1 + id, + p->cr + od, p->ci + od, + p->kind)); + if (!cldrest) goto nada; + pln = MKPLAN_RDFT2(P, &padt, apply_r2hc); + } else { + /* allow destruction of buffer */ + cld = X(mkplan_f_d)( + plnr, + X(mkproblem_rdft2_d)( + X(mktensor_1d)(n, 2, p->sz->dims[0].os), + X(mktensor_1d)(nbuf, bufdist, ovs), + TAINT(p->r0, ovs * nbuf), TAINT(p->r1, ovs * nbuf), + bufs + roffset, bufs + ioffset, p->kind), + 0, 0, NO_DESTROY_INPUT); + if (!cld) goto nada; + + /* copying input into buffer is a rank-0 DFT: */ + cldcpy = X(mkplan_d)( + plnr, + X(mkproblem_dft_d)( + X(mktensor_0d)(), + X(mktensor_2d)(nbuf, ivs, bufdist, + n/2+1, p->sz->dims[0].is, 2), + TAINT(p->cr, ivs * nbuf), TAINT(p->ci, ivs * nbuf), + bufs + roffset, bufs + ioffset)); + if (!cldcpy) goto nada; + + X(ifree)(bufs); bufs = 0; + + cldrest = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)( + X(tensor_copy)(p->sz), + X(mktensor_1d)(vl % nbuf, ivs, ovs), + p->r0 + od, p->r1 + od, + p->cr + id, p->ci + id, + p->kind)); + if (!cldrest) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, apply_hc2r); + } + + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->cldrest = cldrest; + pln->n = n; + pln->vl = vl; + pln->ivs_by_nbuf = ivs * nbuf; + pln->ovs_by_nbuf = ovs * nbuf; + pln->roffset = roffset; + pln->ioffset = ioffset; + + pln->nbuf = nbuf; + pln->bufdist = bufdist; + + { + opcnt t; + X(ops_add)(&cld->ops, &cldcpy->ops, &t); + X(ops_madd)(vl / nbuf, &t, &cldrest->ops, &pln->super.super.ops); + } + + return &(pln->super.super); + + nada: + X(ifree0)(bufs); + X(plan_destroy_internal)(cldrest); + X(plan_destroy_internal)(cldcpy); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +static solver *mksolver(size_t maxnbuf_ndx) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->maxnbuf_ndx = maxnbuf_ndx; + return &(slv->super); +} + +void X(rdft2_buffered_register)(planner *p) +{ + size_t i; + for (i = 0; i < NELEM(maxnbufs); ++i) + REGISTER_SOLVER(p, mksolver(i)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/codelet-rdft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/codelet-rdft.h new file mode 100644 index 000000000..789040f65 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/codelet-rdft.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* + * This header file must include every file or define every + * type or macro which is required to compile a codelet. + */ + +#ifndef __RDFT_CODELET_H__ +#define __RDFT_CODELET_H__ + +#include "kernel/ifftw.h" + +/************************************************************** + * types of codelets + **************************************************************/ + +/* FOOab, with a,b in {0,1}, denotes the FOO transform + where a/b say whether the input/output are shifted by + half a sample/slot. */ + +typedef enum { + R2HC00, R2HC01, R2HC10, R2HC11, + HC2R00, HC2R01, HC2R10, HC2R11, + DHT, + REDFT00, REDFT01, REDFT10, REDFT11, /* real-even == DCT's */ + RODFT00, RODFT01, RODFT10, RODFT11 /* real-odd == DST's */ +} rdft_kind; + +/* standard R2HC/HC2R transforms are unshifted */ +#define R2HC R2HC00 +#define HC2R HC2R00 + +#define R2HCII R2HC01 +#define HC2RIII HC2R10 + +/* (k) >= R2HC00 produces a warning under gcc because checking x >= 0 + is superfluous for unsigned values...but it is needed because other + compilers (e.g. icc) may define the enum to be a signed int...grrr. */ +#define R2HC_KINDP(k) ((k) >= R2HC00 && (k) <= R2HC11) /* uses kr2hc_genus */ +#define HC2R_KINDP(k) ((k) >= HC2R00 && (k) <= HC2R11) /* uses khc2r_genus */ + +#define R2R_KINDP(k) ((k) >= DHT) /* uses kr2r_genus */ + +#define REDFT_KINDP(k) ((k) >= REDFT00 && (k) <= REDFT11) +#define RODFT_KINDP(k) ((k) >= RODFT00 && (k) <= RODFT11) +#define REODFT_KINDP(k) ((k) >= REDFT00 && (k) <= RODFT11) + +/* codelets with real input (output) and complex output (input) */ +typedef struct kr2c_desc_s kr2c_desc; + +typedef struct { + rdft_kind kind; + INT vl; +} kr2c_genus; + +struct kr2c_desc_s { + INT n; /* size of transform computed */ + const char *nam; + opcnt ops; + const kr2c_genus *genus; +}; + +typedef void (*kr2c) (R *R0, R *R1, R *Cr, R *Ci, + stride rs, stride csr, stride csi, + INT vl, INT ivs, INT ovs); +void X(kr2c_register)(planner *p, kr2c codelet, const kr2c_desc *desc); + +/* half-complex to half-complex DIT/DIF codelets: */ +typedef struct hc2hc_desc_s hc2hc_desc; + +typedef struct { + rdft_kind kind; + INT vl; +} hc2hc_genus; + +struct hc2hc_desc_s { + INT radix; + const char *nam; + const tw_instr *tw; + const hc2hc_genus *genus; + opcnt ops; +}; + +typedef void (*khc2hc) (R *rioarray, R *iioarray, const R *W, + stride rs, INT mb, INT me, INT ms); +void X(khc2hc_register)(planner *p, khc2hc codelet, const hc2hc_desc *desc); + +/* half-complex to rdft2-complex DIT/DIF codelets: */ +typedef struct hc2c_desc_s hc2c_desc; + +typedef enum { + HC2C_VIA_RDFT, + HC2C_VIA_DFT +} hc2c_kind; + +typedef struct { + int (*okp)( + const R *Rp, const R *Ip, const R *Rm, const R *Im, + INT rs, INT mb, INT me, INT ms, + const planner *plnr); + rdft_kind kind; + INT vl; +} hc2c_genus; + +struct hc2c_desc_s { + INT radix; + const char *nam; + const tw_instr *tw; + const hc2c_genus *genus; + opcnt ops; +}; + +typedef void (*khc2c) (R *Rp, R *Ip, R *Rm, R *Im, const R *W, + stride rs, INT mb, INT me, INT ms); +void X(khc2c_register)(planner *p, khc2c codelet, const hc2c_desc *desc, + hc2c_kind hc2ckind); + +extern const solvtab X(solvtab_rdft_r2cf); +extern const solvtab X(solvtab_rdft_r2cb); +extern const solvtab X(solvtab_rdft_sse2); +extern const solvtab X(solvtab_rdft_avx); +extern const solvtab X(solvtab_rdft_avx_128_fma); +extern const solvtab X(solvtab_rdft_avx2); +extern const solvtab X(solvtab_rdft_avx2_128); +extern const solvtab X(solvtab_rdft_avx512); +extern const solvtab X(solvtab_rdft_kcvi); +extern const solvtab X(solvtab_rdft_altivec); +extern const solvtab X(solvtab_rdft_vsx); +extern const solvtab X(solvtab_rdft_neon); +extern const solvtab X(solvtab_rdft_generic_simd128); +extern const solvtab X(solvtab_rdft_generic_simd256); + +/* real-input & output DFT-like codelets (DHT, etc.) */ +typedef struct kr2r_desc_s kr2r_desc; + +typedef struct { + INT vl; +} kr2r_genus; + +struct kr2r_desc_s { + INT n; /* size of transform computed */ + const char *nam; + opcnt ops; + const kr2r_genus *genus; + rdft_kind kind; +}; + +typedef void (*kr2r) (const R *I, R *O, stride is, stride os, + INT vl, INT ivs, INT ovs); +void X(kr2r_register)(planner *p, kr2r codelet, const kr2r_desc *desc); + +extern const solvtab X(solvtab_rdft_r2r); + +#endif /* __RDFT_CODELET_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/conf.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/conf.c new file mode 100644 index 000000000..5fe8d665f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/conf.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +static const solvtab s = +{ + SOLVTAB(X(rdft_indirect_register)), + SOLVTAB(X(rdft_rank0_register)), + SOLVTAB(X(rdft_vrank3_transpose_register)), + SOLVTAB(X(rdft_vrank_geq1_register)), + + SOLVTAB(X(rdft_nop_register)), + SOLVTAB(X(rdft_buffered_register)), + SOLVTAB(X(rdft_generic_register)), + SOLVTAB(X(rdft_rank_geq2_register)), + + SOLVTAB(X(dft_r2hc_register)), + + SOLVTAB(X(rdft_dht_register)), + SOLVTAB(X(dht_r2hc_register)), + SOLVTAB(X(dht_rader_register)), + + SOLVTAB(X(rdft2_vrank_geq1_register)), + SOLVTAB(X(rdft2_nop_register)), + SOLVTAB(X(rdft2_rank0_register)), + SOLVTAB(X(rdft2_buffered_register)), + SOLVTAB(X(rdft2_rank_geq2_register)), + SOLVTAB(X(rdft2_rdft_register)), + + SOLVTAB(X(hc2hc_generic_register)), + + SOLVTAB_END +}; + +void X(rdft_conf_standard)(planner *p) +{ + X(solvtab_exec)(s, p); + X(solvtab_exec)(X(solvtab_rdft_r2cf), p); + X(solvtab_exec)(X(solvtab_rdft_r2cb), p); + X(solvtab_exec)(X(solvtab_rdft_r2r), p); + +#if HAVE_SSE2 + if (X(have_simd_sse2)()) + X(solvtab_exec)(X(solvtab_rdft_sse2), p); +#endif +#if HAVE_AVX + if (X(have_simd_avx)()) + X(solvtab_exec)(X(solvtab_rdft_avx), p); +#endif +#if HAVE_AVX_128_FMA + if (X(have_simd_avx_128_fma)()) + X(solvtab_exec)(X(solvtab_rdft_avx_128_fma), p); +#endif +#if HAVE_AVX2 + if (X(have_simd_avx2)()) + X(solvtab_exec)(X(solvtab_rdft_avx2), p); + if (X(have_simd_avx2_128)()) + X(solvtab_exec)(X(solvtab_rdft_avx2_128), p); +#endif +#if HAVE_AVX512 + if (X(have_simd_avx512)()) + X(solvtab_exec)(X(solvtab_rdft_avx512), p); +#endif +#if HAVE_KCVI + if (X(have_simd_kcvi)()) + X(solvtab_exec)(X(solvtab_rdft_kcvi), p); +#endif +#if HAVE_ALTIVEC + if (X(have_simd_altivec)()) + X(solvtab_exec)(X(solvtab_rdft_altivec), p); +#endif +#if HAVE_VSX + if (X(have_simd_vsx)()) + X(solvtab_exec)(X(solvtab_rdft_vsx), p); +#endif +#if HAVE_NEON + if (X(have_simd_neon)()) + X(solvtab_exec)(X(solvtab_rdft_neon), p); +#endif +#if HAVE_GENERIC_SIMD128 + X(solvtab_exec)(X(solvtab_rdft_generic_simd128), p); +#endif +#if HAVE_GENERIC_SIMD256 + X(solvtab_exec)(X(solvtab_rdft_generic_simd256), p); +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c-direct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c-direct.c new file mode 100644 index 000000000..bc8662f7a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c-direct.c @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "ct-hc2c.h" + +typedef struct { + hc2c_solver super; + const hc2c_desc *desc; + int bufferedp; + khc2c k; +} S; + +typedef struct { + plan_hc2c super; + khc2c k; + plan *cld0, *cldm; /* children for 0th and middle butterflies */ + INT r, m, v, extra_iter; + INT ms, vs; + stride rs, brs; + twid *td; + const S *slv; +} P; + +/************************************************************* + Nonbuffered code + *************************************************************/ +static void apply(const plan *ego_, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld0 = (plan_rdft2 *) ego->cld0; + plan_rdft2 *cldm = (plan_rdft2 *) ego->cldm; + INT i, m = ego->m, v = ego->v; + INT ms = ego->ms, vs = ego->vs; + + for (i = 0; i < v; ++i, cr += vs, ci += vs) { + cld0->apply((plan *) cld0, cr, ci, cr, ci); + ego->k(cr + ms, ci + ms, cr + (m-1)*ms, ci + (m-1)*ms, + ego->td->W, ego->rs, 1, (m+1)/2, ms); + cldm->apply((plan *) cldm, cr + (m/2)*ms, ci + (m/2)*ms, + cr + (m/2)*ms, ci + (m/2)*ms); + } +} + +static void apply_extra_iter(const plan *ego_, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld0 = (plan_rdft2 *) ego->cld0; + plan_rdft2 *cldm = (plan_rdft2 *) ego->cldm; + INT i, m = ego->m, v = ego->v; + INT ms = ego->ms, vs = ego->vs; + INT mm = (m-1)/2; + + for (i = 0; i < v; ++i, cr += vs, ci += vs) { + cld0->apply((plan *) cld0, cr, ci, cr, ci); + + /* for 4-way SIMD when (m+1)/2-1 is odd: iterate over an + even vector length MM-1, and then execute the last + iteration as a 2-vector with vector stride 0. The + twiddle factors of the second half of the last iteration + are bogus, but we only store the results of the first + half. */ + ego->k(cr + ms, ci + ms, cr + (m-1)*ms, ci + (m-1)*ms, + ego->td->W, ego->rs, 1, mm, ms); + ego->k(cr + mm*ms, ci + mm*ms, cr + (m-mm)*ms, ci + (m-mm)*ms, + ego->td->W, ego->rs, mm, mm+2, 0); + cldm->apply((plan *) cldm, cr + (m/2)*ms, ci + (m/2)*ms, + cr + (m/2)*ms, ci + (m/2)*ms); + } + +} + +/************************************************************* + Buffered code + *************************************************************/ + +/* should not be 2^k to avoid associativity conflicts */ +static INT compute_batchsize(INT radix) +{ + /* round up to multiple of 4 */ + radix += 3; + radix &= -4; + + return (radix + 2); +} + +static void dobatch(const P *ego, R *Rp, R *Ip, R *Rm, R *Im, + INT mb, INT me, INT extra_iter, R *bufp) +{ + INT b = WS(ego->brs, 1); + INT rs = WS(ego->rs, 1); + INT ms = ego->ms; + R *bufm = bufp + b - 2; + INT n = me - mb; + + X(cpy2d_pair_ci)(Rp + mb * ms, Ip + mb * ms, bufp, bufp + 1, + ego->r / 2, rs, b, + n, ms, 2); + X(cpy2d_pair_ci)(Rm - mb * ms, Im - mb * ms, bufm, bufm + 1, + ego->r / 2, rs, b, + n, -ms, -2); + + if (extra_iter) { + /* initialize the extra_iter element to 0. It would be ok + to leave it uninitialized, since we transform uninitialized + data and ignore the result. However, we want to avoid + FP exceptions in case somebody is trapping them. */ + A(n < compute_batchsize(ego->r)); + X(zero1d_pair)(bufp + 2*n, bufp + 1 + 2*n, ego->r / 2, b); + X(zero1d_pair)(bufm - 2*n, bufm + 1 - 2*n, ego->r / 2, b); + } + + ego->k(bufp, bufp + 1, bufm, bufm + 1, ego->td->W, + ego->brs, mb, me + extra_iter, 2); + X(cpy2d_pair_co)(bufp, bufp + 1, Rp + mb * ms, Ip + mb * ms, + ego->r / 2, b, rs, + n, 2, ms); + X(cpy2d_pair_co)(bufm, bufm + 1, Rm - mb * ms, Im - mb * ms, + ego->r / 2, b, rs, + n, -2, -ms); +} + +static void apply_buf(const plan *ego_, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft2 *cld0 = (plan_rdft2 *) ego->cld0; + plan_rdft2 *cldm = (plan_rdft2 *) ego->cldm; + INT i, j, ms = ego->ms, v = ego->v; + INT batchsz = compute_batchsize(ego->r); + R *buf; + INT mb = 1, me = (ego->m+1) / 2; + size_t bufsz = ego->r * batchsz * 2 * sizeof(R); + + BUF_ALLOC(R *, buf, bufsz); + + for (i = 0; i < v; ++i, cr += ego->vs, ci += ego->vs) { + R *Rp = cr; + R *Ip = ci; + R *Rm = cr + ego->m * ms; + R *Im = ci + ego->m * ms; + + cld0->apply((plan *) cld0, Rp, Ip, Rp, Ip); + + for (j = mb; j + batchsz < me; j += batchsz) + dobatch(ego, Rp, Ip, Rm, Im, j, j + batchsz, 0, buf); + + dobatch(ego, Rp, Ip, Rm, Im, j, me, ego->extra_iter, buf); + + cldm->apply((plan *) cldm, + Rp + me * ms, Ip + me * ms, + Rp + me * ms, Ip + me * ms); + + } + + BUF_FREE(buf, bufsz); +} + +/************************************************************* + common code + *************************************************************/ +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld0, wakefulness); + X(plan_awake)(ego->cldm, wakefulness); + X(twiddle_awake)(wakefulness, &ego->td, ego->slv->desc->tw, + ego->r * ego->m, ego->r, + (ego->m - 1) / 2 + ego->extra_iter); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld0); + X(plan_destroy_internal)(ego->cldm); + X(stride_destroy)(ego->rs); + X(stride_destroy)(ego->brs); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *slv = ego->slv; + const hc2c_desc *e = slv->desc; + + if (slv->bufferedp) + p->print(p, "(hc2c-directbuf/%D-%D/%D/%D%v \"%s\"%(%p%)%(%p%))", + compute_batchsize(ego->r), + ego->r, X(twiddle_length)(ego->r, e->tw), + ego->extra_iter, ego->v, e->nam, + ego->cld0, ego->cldm); + else + p->print(p, "(hc2c-direct-%D/%D/%D%v \"%s\"%(%p%)%(%p%))", + ego->r, X(twiddle_length)(ego->r, e->tw), + ego->extra_iter, ego->v, e->nam, + ego->cld0, ego->cldm); +} + +static int applicable0(const S *ego, rdft_kind kind, + INT r, INT rs, + INT m, INT ms, + INT v, INT vs, + const R *cr, const R *ci, + const planner *plnr, + INT *extra_iter) +{ + const hc2c_desc *e = ego->desc; + UNUSED(v); + + return ( + 1 + && r == e->radix + && kind == e->genus->kind + + /* first v-loop iteration */ + && ((*extra_iter = 0, + e->genus->okp(cr + ms, ci + ms, cr + (m-1)*ms, ci + (m-1)*ms, + rs, 1, (m+1)/2, ms, plnr)) + || + (*extra_iter = 1, + ((e->genus->okp(cr + ms, ci + ms, cr + (m-1)*ms, ci + (m-1)*ms, + rs, 1, (m-1)/2, ms, plnr)) + && + (e->genus->okp(cr + ms, ci + ms, cr + (m-1)*ms, ci + (m-1)*ms, + rs, (m-1)/2, (m-1)/2 + 2, 0, plnr))))) + + /* subsequent v-loop iterations */ + && (cr += vs, ci += vs, 1) + + && e->genus->okp(cr + ms, ci + ms, cr + (m-1)*ms, ci + (m-1)*ms, + rs, 1, (m+1)/2 - *extra_iter, ms, plnr) + ); +} + +static int applicable0_buf(const S *ego, rdft_kind kind, + INT r, INT rs, + INT m, INT ms, + INT v, INT vs, + const R *cr, const R *ci, + const planner *plnr, INT *extra_iter) +{ + const hc2c_desc *e = ego->desc; + INT batchsz, brs; + UNUSED(v); UNUSED(rs); UNUSED(ms); UNUSED(vs); + + return ( + 1 + && r == e->radix + && kind == e->genus->kind + + /* ignore cr, ci, use buffer */ + && (cr = (const R *)0, ci = cr + 1, + batchsz = compute_batchsize(r), + brs = 4 * batchsz, 1) + + && e->genus->okp(cr, ci, cr + brs - 2, ci + brs - 2, + brs, 1, 1+batchsz, 2, plnr) + + && ((*extra_iter = 0, + e->genus->okp(cr, ci, cr + brs - 2, ci + brs - 2, + brs, 1, 1 + (((m-1)/2) % batchsz), 2, plnr)) + || + (*extra_iter = 1, + e->genus->okp(cr, ci, cr + brs - 2, ci + brs - 2, + brs, 1, 1 + 1 + (((m-1)/2) % batchsz), 2, plnr))) + + ); +} + +static int applicable(const S *ego, rdft_kind kind, + INT r, INT rs, + INT m, INT ms, + INT v, INT vs, + R *cr, R *ci, + const planner *plnr, INT *extra_iter) +{ + if (ego->bufferedp) { + if (!applicable0_buf(ego, kind, r, rs, m, ms, v, vs, cr, ci, plnr, + extra_iter)) + return 0; + } else { + if (!applicable0(ego, kind, r, rs, m, ms, v, vs, cr, ci, plnr, + extra_iter)) + return 0; + } + + if (NO_UGLYP(plnr) && X(ct_uglyp)((ego->bufferedp? (INT)512 : (INT)16), + v, m * r, r)) + return 0; + + return 1; +} + +static plan *mkcldw(const hc2c_solver *ego_, rdft_kind kind, + INT r, INT rs, + INT m, INT ms, + INT v, INT vs, + R *cr, R *ci, + planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const hc2c_desc *e = ego->desc; + plan *cld0 = 0, *cldm = 0; + INT imid = (m / 2) * ms; + INT extra_iter; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + if (!applicable(ego, kind, r, rs, m, ms, v, vs, cr, ci, plnr, + &extra_iter)) + return (plan *)0; + + cld0 = X(mkplan_d)( + plnr, + X(mkproblem_rdft2_d)(X(mktensor_1d)(r, rs, rs), + X(mktensor_0d)(), + TAINT(cr, vs), TAINT(ci, vs), + TAINT(cr, vs), TAINT(ci, vs), + kind)); + if (!cld0) goto nada; + + cldm = X(mkplan_d)( + plnr, + X(mkproblem_rdft2_d)(((m % 2) ? + X(mktensor_0d)() : X(mktensor_1d)(r, rs, rs) ), + X(mktensor_0d)(), + TAINT(cr + imid, vs), TAINT(ci + imid, vs), + TAINT(cr + imid, vs), TAINT(ci + imid, vs), + kind == R2HC ? R2HCII : HC2RIII)); + if (!cldm) goto nada; + + if (ego->bufferedp) + pln = MKPLAN_HC2C(P, &padt, apply_buf); + else + pln = MKPLAN_HC2C(P, &padt, extra_iter ? apply_extra_iter : apply); + + pln->k = ego->k; + pln->td = 0; + pln->r = r; pln->rs = X(mkstride)(r, rs); + pln->m = m; pln->ms = ms; + pln->v = v; pln->vs = vs; + pln->slv = ego; + pln->brs = X(mkstride)(r, 4 * compute_batchsize(r)); + pln->cld0 = cld0; + pln->cldm = cldm; + pln->extra_iter = extra_iter; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(v * (((m - 1) / 2) / e->genus->vl), + &e->ops, &pln->super.super.ops); + X(ops_madd2)(v, &cld0->ops, &pln->super.super.ops); + X(ops_madd2)(v, &cldm->ops, &pln->super.super.ops); + + if (ego->bufferedp) + pln->super.super.ops.other += 4 * r * m * v; + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld0); + X(plan_destroy_internal)(cldm); + return 0; +} + +static void regone(planner *plnr, khc2c codelet, + const hc2c_desc *desc, + hc2c_kind hc2ckind, + int bufferedp) +{ + S *slv = (S *)X(mksolver_hc2c)(sizeof(S), desc->radix, hc2ckind, mkcldw); + slv->k = codelet; + slv->desc = desc; + slv->bufferedp = bufferedp; + REGISTER_SOLVER(plnr, &(slv->super.super)); +} + +void X(regsolver_hc2c_direct)(planner *plnr, khc2c codelet, + const hc2c_desc *desc, + hc2c_kind hc2ckind) +{ + regone(plnr, codelet, desc, hc2ckind, /* bufferedp */0); + regone(plnr, codelet, desc, hc2ckind, /* bufferedp */1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c.c new file mode 100644 index 000000000..80b757686 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c.c @@ -0,0 +1,296 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "ct-hc2c.h" +#include "dft/dft.h" + +typedef struct { + plan_rdft2 super; + plan *cld; + plan *cldw; + INT r; +} P; + +static void apply_dit(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld; + plan_hc2c *cldw; + UNUSED(r1); + + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, r0, cr); + + cldw = (plan_hc2c *) ego->cldw; + cldw->apply(ego->cldw, cr, ci); +} + +static void apply_dif(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld; + plan_hc2c *cldw; + UNUSED(r1); + + cldw = (plan_hc2c *) ego->cldw; + cldw->apply(ego->cldw, cr, ci); + + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, cr, r0); +} + +static void apply_dit_dft(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + plan_hc2c *cldw; + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, r0, r1, cr, ci); + + cldw = (plan_hc2c *) ego->cldw; + cldw->apply(ego->cldw, cr, ci); +} + +static void apply_dif_dft(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + plan_hc2c *cldw; + + cldw = (plan_hc2c *) ego->cldw; + cldw->apply(ego->cldw, cr, ci); + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ci, cr, r1, r0); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldw, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldw); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rdft2-ct-%s/%D%(%p%)%(%p%))", + (ego->super.apply == apply_dit || + ego->super.apply == apply_dit_dft) + ? "dit" : "dif", + ego->r, ego->cldw, ego->cld); +} + +static int applicable0(const hc2c_solver *ego, const problem *p_, planner *plnr) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + INT r; + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + + && (/* either the problem is R2HC, which is solved by DIT */ + (p->kind == R2HC) + || + /* or the problem is HC2R, in which case it is solved + by DIF, which destroys the input */ + (p->kind == HC2R && + (p->r0 == p->cr || !NO_DESTROY_INPUTP(plnr)))) + + && ((r = X(choose_radix)(ego->r, p->sz->dims[0].n)) > 0) + && p->sz->dims[0].n > r); +} + +static int hc2c_applicable(const hc2c_solver *ego, const problem *p_, + planner *plnr) +{ + const problem_rdft2 *p; + + if (!applicable0(ego, p_, plnr)) + return 0; + + p = (const problem_rdft2 *) p_; + + return (0 + || p->vecsz->rnk == 0 + || !NO_VRECURSEP(plnr) + ); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const hc2c_solver *ego = (const hc2c_solver *) ego_; + const problem_rdft2 *p; + P *pln = 0; + plan *cld = 0, *cldw = 0; + INT n, r, m, v, ivs, ovs; + iodim *d; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + if (!hc2c_applicable(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_rdft2 *) p_; + d = p->sz->dims; + n = d[0].n; + r = X(choose_radix)(ego->r, n); + A((r % 2) == 0); + m = n / r; + + X(tensor_tornk1)(p->vecsz, &v, &ivs, &ovs); + + switch (p->kind) { + case R2HC: + cldw = ego->mkcldw(ego, R2HC, + r, m * d[0].os, + m, d[0].os, + v, ovs, + p->cr, p->ci, plnr); + if (!cldw) goto nada; + + switch (ego->hc2ckind) { + case HC2C_VIA_RDFT: + cld = X(mkplan_d)( + plnr, + X(mkproblem_rdft_1_d)( + X(mktensor_1d)(m, (r/2)*d[0].is, d[0].os), + X(mktensor_3d)( + 2, p->r1 - p->r0, p->ci - p->cr, + r / 2, d[0].is, m * d[0].os, + v, ivs, ovs), + p->r0, p->cr, R2HC) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, apply_dit); + break; + + case HC2C_VIA_DFT: + cld = X(mkplan_d)( + plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(m, (r/2)*d[0].is, d[0].os), + X(mktensor_2d)( + r / 2, d[0].is, m * d[0].os, + v, ivs, ovs), + p->r0, p->r1, p->cr, p->ci) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, apply_dit_dft); + break; + } + break; + + case HC2R: + cldw = ego->mkcldw(ego, HC2R, + r, m * d[0].is, + m, d[0].is, + v, ivs, + p->cr, p->ci, plnr); + if (!cldw) goto nada; + + switch (ego->hc2ckind) { + case HC2C_VIA_RDFT: + cld = X(mkplan_d)( + plnr, + X(mkproblem_rdft_1_d)( + X(mktensor_1d)(m, d[0].is, (r/2)*d[0].os), + X(mktensor_3d)( + 2, p->ci - p->cr, p->r1 - p->r0, + r / 2, m * d[0].is, d[0].os, + v, ivs, ovs), + p->cr, p->r0, HC2R) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, apply_dif); + break; + + case HC2C_VIA_DFT: + cld = X(mkplan_d)( + plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(m, d[0].is, (r/2)*d[0].os), + X(mktensor_2d)( + r / 2, m * d[0].is, d[0].os, + v, ivs, ovs), + p->ci, p->cr, p->r1, p->r0) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, apply_dif_dft); + break; + } + break; + + default: + A(0); + } + + pln->cld = cld; + pln->cldw = cldw; + pln->r = r; + X(ops_add)(&cld->ops, &cldw->ops, &pln->super.super.ops); + + /* inherit could_prune_now_p attribute from cldw */ + pln->super.super.could_prune_now_p = cldw->could_prune_now_p; + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldw); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +hc2c_solver *X(mksolver_hc2c)(size_t size, INT r, + hc2c_kind hc2ckind, + hc2c_mkinferior mkcldw) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + hc2c_solver *slv = (hc2c_solver *)X(mksolver)(size, &sadt); + slv->r = r; + slv->hc2ckind = hc2ckind; + slv->mkcldw = mkcldw; + return slv; +} + +plan *X(mkplan_hc2c)(size_t size, const plan_adt *adt, hc2capply apply) +{ + plan_hc2c *ego; + + ego = (plan_hc2c *) X(mkplan)(size, adt); + ego->apply = apply; + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c.h new file mode 100644 index 000000000..41bf4d887 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/ct-hc2c.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/rdft.h" + +typedef void (*hc2capply) (const plan *ego, R *cr, R *ci); +typedef struct hc2c_solver_s hc2c_solver; +typedef plan *(*hc2c_mkinferior)(const hc2c_solver *ego, rdft_kind kind, + INT r, INT rs, + INT m, INT ms, + INT v, INT vs, + R *cr, R *ci, + planner *plnr); + +typedef struct { + plan super; + hc2capply apply; +} plan_hc2c; + +extern plan *X(mkplan_hc2c)(size_t size, const plan_adt *adt, + hc2capply apply); + +#define MKPLAN_HC2C(type, adt, apply) \ + (type *)X(mkplan_hc2c)(sizeof(type), adt, apply) + +struct hc2c_solver_s { + solver super; + INT r; + + hc2c_mkinferior mkcldw; + hc2c_kind hc2ckind; +}; + +hc2c_solver *X(mksolver_hc2c)(size_t size, INT r, + hc2c_kind hc2ckind, + hc2c_mkinferior mkcldw); + +void X(regsolver_hc2c_direct)(planner *plnr, khc2c codelet, + const hc2c_desc *desc, + hc2c_kind hc2ckind); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dft-r2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dft-r2hc.c new file mode 100644 index 000000000..e9aaf9232 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dft-r2hc.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Compute the complex DFT by combining R2HC RDFTs on the real + and imaginary parts. This could be useful for people just wanting + to link to the real codelets and not the complex ones. It could + also even be faster than the complex algorithms for split (as opposed + to interleaved) real/imag complex data. */ + +#include "rdft/rdft.h" +#include "dft/dft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_dft super; + plan *cld; + INT ishift, oshift; + INT os; + INT n; +} P; + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + INT n; + + UNUSED(ii); + + { /* transform vector of real & imag parts: */ + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, ri + ego->ishift, ro + ego->oshift); + } + + n = ego->n; + if (n > 1) { + INT i, os = ego->os; + for (i = 1; i < (n + 1)/2; ++i) { + E rop, iop, iom, rom; + rop = ro[os * i]; + iop = io[os * i]; + rom = ro[os * (n - i)]; + iom = io[os * (n - i)]; + ro[os * i] = rop - iom; + io[os * i] = iop + rom; + ro[os * (n - i)] = rop + iom; + io[os * (n - i)] = iop - rom; + } + } +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(dft-r2hc-%D%(%p%))", ego->n, ego->cld); +} + + +static int applicable0(const problem *p_) +{ + const problem_dft *p = (const problem_dft *) p_; + return ((p->sz->rnk == 1 && p->vecsz->rnk == 0) + || (p->sz->rnk == 0 && FINITE_RNK(p->vecsz->rnk)) + ); +} + +static int splitp(R *r, R *i, INT n, INT s) +{ + return ((r > i ? (r - i) : (i - r)) >= n * (s > 0 ? s : 0-s)); +} + +static int applicable(const problem *p_, const planner *plnr) +{ + if (!applicable0(p_)) return 0; + + { + const problem_dft *p = (const problem_dft *) p_; + + /* rank-0 problems are always OK */ + if (p->sz->rnk == 0) return 1; + + /* this solver is ok for split arrays */ + if (p->sz->rnk == 1 && + splitp(p->ri, p->ii, p->sz->dims[0].n, p->sz->dims[0].is) && + splitp(p->ro, p->io, p->sz->dims[0].n, p->sz->dims[0].os)) + return 1; + + return !(NO_DFT_R2HCP(plnr)); + } +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_dft *p; + plan *cld; + INT ishift = 0, oshift = 0; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + UNUSED(ego_); + if (!applicable(p_, plnr)) + return (plan *)0; + + p = (const problem_dft *) p_; + + { + tensor *ri_vec = X(mktensor_1d)(2, p->ii - p->ri, p->io - p->ro); + tensor *cld_vec = X(tensor_append)(ri_vec, p->vecsz); + int i; + for (i = 0; i < cld_vec->rnk; ++i) { /* make all istrides > 0 */ + if (cld_vec->dims[i].is < 0) { + INT nm1 = cld_vec->dims[i].n - 1; + ishift -= nm1 * (cld_vec->dims[i].is *= -1); + oshift -= nm1 * (cld_vec->dims[i].os *= -1); + } + } + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_1)(p->sz, cld_vec, + p->ri + ishift, + p->ro + oshift, R2HC)); + X(tensor_destroy2)(ri_vec, cld_vec); + } + if (!cld) return (plan *)0; + + pln = MKPLAN_DFT(P, &padt, apply); + + if (p->sz->rnk == 0) { + pln->n = 1; + pln->os = 0; + } + else { + pln->n = p->sz->dims[0].n; + pln->os = p->sz->dims[0].os; + } + pln->ishift = ishift; + pln->oshift = oshift; + + pln->cld = cld; + + pln->super.super.ops = cld->ops; + pln->super.super.ops.other += 8 * ((pln->n - 1)/2); + pln->super.super.ops.add += 4 * ((pln->n - 1)/2); + pln->super.super.ops.other += 1; /* estimator hack for nop plans */ + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(dft_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dht-r2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dht-r2hc.c new file mode 100644 index 000000000..1863443c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dht-r2hc.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Solve a DHT problem (Discrete Hartley Transform) via post-processing + of an R2HC problem. */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + INT os; + INT n; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT os = ego->os; + INT i, n = ego->n; + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, I, O); + } + + for (i = 1; i < n - i; ++i) { + E a, b; + a = O[os * i]; + b = O[os * (n - i)]; +#if FFT_SIGN == -1 + O[os * i] = a - b; + O[os * (n - i)] = a + b; +#else + O[os * i] = a + b; + O[os * (n - i)] = a - b; +#endif + } +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(dht-r2hc-%D%(%p%))", ego->n, ego->cld); +} + +static int applicable0(const problem *p_, const planner *plnr) +{ + const problem_rdft *p = (const problem_rdft *) p_; + return (1 + && !NO_DHT_R2HCP(plnr) + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + && p->kind[0] == DHT + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + UNUSED(ego); + return (!NO_SLOWP(plnr) && applicable0(p, plnr)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + /* NO_DHT_R2HC stops infinite loops with rdft-dht.c */ + cld = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_1)(p->sz, p->vecsz, + p->I, p->O, R2HC), + NO_DHT_R2HC, 0, 0); + if (!cld) return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->n = p->sz->dims[0].n; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + + pln->super.super.ops = cld->ops; + pln->super.super.ops.other += 4 * ((pln->n - 1)/2); + pln->super.super.ops.add += 2 * ((pln->n - 1)/2); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(dht_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dht-rader.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dht-rader.c new file mode 100644 index 000000000..5caf5a131 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/dht-rader.c @@ -0,0 +1,386 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/rdft.h" + +/* + * Compute DHTs of prime sizes using Rader's trick: turn them + * into convolutions of size n - 1, which we then perform via a pair + * of FFTs. (We can then do prime real FFTs via rdft-dht.c.) + * + * Optionally (determined by the "pad" field of the solver), we can + * perform the (cyclic) convolution by zero-padding to a size + * >= 2*(n-1) - 1. This is advantageous if n-1 has large prime factors. + * + */ + +typedef struct { + solver super; + int pad; +} S; + +typedef struct { + plan_rdft super; + + plan *cld1, *cld2; + R *omega; + INT n, npad, g, ginv; + INT is, os; + plan *cld_omega; +} P; + +static rader_tl *omegas = 0; + +/***************************************************************************/ + +/* If R2HC_ONLY_CONV is 1, we use a trick to perform the convolution + purely in terms of R2HC transforms, as opposed to R2HC followed by H2RC. + This requires a few more operations, but allows us to share the same + plan/codelets for both Rader children. */ +#define R2HC_ONLY_CONV 1 + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT n = ego->n; /* prime */ + INT npad = ego->npad; /* == n - 1 for unpadded Rader; always even */ + INT is = ego->is, os; + INT k, gpower, g; + R *buf, *omega; + R r0; + + buf = (R *) MALLOC(sizeof(R) * npad, BUFFERS); + + /* First, permute the input, storing in buf: */ + g = ego->g; + for (gpower = 1, k = 0; k < n - 1; ++k, gpower = MULMOD(gpower, g, n)) { + buf[k] = I[gpower * is]; + } + /* gpower == g^(n-1) mod n == 1 */; + + A(n - 1 <= npad); + for (k = n - 1; k < npad; ++k) /* optionally, zero-pad convolution */ + buf[k] = 0; + + os = ego->os; + + /* compute RDFT of buf, storing in buf (i.e., in-place): */ + { + plan_rdft *cld = (plan_rdft *) ego->cld1; + cld->apply((plan *) cld, buf, buf); + } + + /* set output DC component: */ + O[0] = (r0 = I[0]) + buf[0]; + + /* now, multiply by omega: */ + omega = ego->omega; + buf[0] *= omega[0]; + for (k = 1; k < npad/2; ++k) { + E rB, iB, rW, iW, a, b; + rW = omega[k]; + iW = omega[npad - k]; + rB = buf[k]; + iB = buf[npad - k]; + a = rW * rB - iW * iB; + b = rW * iB + iW * rB; +#if R2HC_ONLY_CONV + buf[k] = a + b; + buf[npad - k] = a - b; +#else + buf[k] = a; + buf[npad - k] = b; +#endif + } + /* Nyquist component: */ + A(k + k == npad); /* since npad is even */ + buf[k] *= omega[k]; + + /* this will add input[0] to all of the outputs after the ifft */ + buf[0] += r0; + + /* inverse FFT: */ + { + plan_rdft *cld = (plan_rdft *) ego->cld2; + cld->apply((plan *) cld, buf, buf); + } + + /* do inverse permutation to unshuffle the output: */ + A(gpower == 1); +#if R2HC_ONLY_CONV + O[os] = buf[0]; + gpower = g = ego->ginv; + A(npad == n - 1 || npad/2 >= n - 1); + if (npad == n - 1) { + for (k = 1; k < npad/2; ++k, gpower = MULMOD(gpower, g, n)) { + O[gpower * os] = buf[k] + buf[npad - k]; + } + O[gpower * os] = buf[k]; + ++k, gpower = MULMOD(gpower, g, n); + for (; k < npad; ++k, gpower = MULMOD(gpower, g, n)) { + O[gpower * os] = buf[npad - k] - buf[k]; + } + } + else { + for (k = 1; k < n - 1; ++k, gpower = MULMOD(gpower, g, n)) { + O[gpower * os] = buf[k] + buf[npad - k]; + } + } +#else + g = ego->ginv; + for (k = 0; k < n - 1; ++k, gpower = MULMOD(gpower, g, n)) { + O[gpower * os] = buf[k]; + } +#endif + A(gpower == 1); + + X(ifree)(buf); +} + +static R *mkomega(enum wakefulness wakefulness, + plan *p_, INT n, INT npad, INT ginv) +{ + plan_rdft *p = (plan_rdft *) p_; + R *omega; + INT i, gpower; + trigreal scale; + triggen *t; + + if ((omega = X(rader_tl_find)(n, npad + 1, ginv, omegas))) + return omega; + + omega = (R *)MALLOC(sizeof(R) * npad, TWIDDLES); + + scale = npad; /* normalization for convolution */ + + t = X(mktriggen)(wakefulness, n); + for (i = 0, gpower = 1; i < n-1; ++i, gpower = MULMOD(gpower, ginv, n)) { + trigreal w[2]; + t->cexpl(t, gpower, w); + omega[i] = (w[0] + w[1]) / scale; + } + X(triggen_destroy)(t); + A(gpower == 1); + + A(npad == n - 1 || npad >= 2*(n - 1) - 1); + + for (; i < npad; ++i) + omega[i] = K(0.0); + if (npad > n - 1) + for (i = 1; i < n-1; ++i) + omega[npad - i] = omega[n - 1 - i]; + + p->apply(p_, omega, omega); + + X(rader_tl_insert)(n, npad + 1, ginv, omega, &omegas); + return omega; +} + +static void free_omega(R *omega) +{ + X(rader_tl_delete)(omega, &omegas); +} + +/***************************************************************************/ + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); + X(plan_awake)(ego->cld_omega, wakefulness); + + switch (wakefulness) { + case SLEEPY: + free_omega(ego->omega); + ego->omega = 0; + break; + default: + ego->g = X(find_generator)(ego->n); + ego->ginv = X(power_mod)(ego->g, ego->n - 2, ego->n); + A(MULMOD(ego->g, ego->ginv, ego->n) == 1); + + A(!ego->omega); + ego->omega = mkomega(wakefulness, + ego->cld_omega,ego->n,ego->npad,ego->ginv); + break; + } +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld_omega); + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + + p->print(p, "(dht-rader-%D/%D%ois=%oos=%(%p%)", + ego->n, ego->npad, ego->is, ego->os, ego->cld1); + if (ego->cld2 != ego->cld1) + p->print(p, "%(%p%)", ego->cld2); + if (ego->cld_omega != ego->cld1 && ego->cld_omega != ego->cld2) + p->print(p, "%(%p%)", ego->cld_omega); + p->putchr(p, ')'); +} + +static int applicable(const solver *ego, const problem *p_, const planner *plnr) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego); + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + && p->kind[0] == DHT + && X(is_prime)(p->sz->dims[0].n) + && p->sz->dims[0].n > 2 + && CIMPLIES(NO_SLOWP(plnr), p->sz->dims[0].n > RADER_MAX_SLOW) + /* proclaim the solver SLOW if p-1 is not easily + factorizable. Unlike in the complex case where + Bluestein can solve the problem, in the DHT case we + may have no other choice */ + && CIMPLIES(NO_SLOWP(plnr), X(factors_into_small_primes)(p->sz->dims[0].n - 1)) + ); +} + +static INT choose_transform_size(INT minsz) +{ + static const INT primes[] = { 2, 3, 5, 0 }; + while (!X(factors_into)(minsz, primes) || minsz % 2) + ++minsz; + return minsz; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + P *pln; + INT n, npad; + INT is, os; + plan *cld1 = (plan *) 0; + plan *cld2 = (plan *) 0; + plan *cld_omega = (plan *) 0; + R *buf = (R *) 0; + problem *cldp; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *) 0; + + n = p->sz->dims[0].n; + is = p->sz->dims[0].is; + os = p->sz->dims[0].os; + + if (ego->pad) + npad = choose_transform_size(2 * (n - 1) - 1); + else + npad = n - 1; + + /* initial allocation for the purpose of planning */ + buf = (R *) MALLOC(sizeof(R) * npad, BUFFERS); + + cld1 = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_1_d)(X(mktensor_1d)(npad, 1, 1), + X(mktensor_1d)(1, 0, 0), + buf, buf, + R2HC), + NO_SLOW, 0, 0); + if (!cld1) goto nada; + + cldp = + X(mkproblem_rdft_1_d)( + X(mktensor_1d)(npad, 1, 1), + X(mktensor_1d)(1, 0, 0), + buf, buf, +#if R2HC_ONLY_CONV + R2HC +#else + HC2R +#endif + ); + if (!(cld2 = X(mkplan_f_d)(plnr, cldp, NO_SLOW, 0, 0))) + goto nada; + + /* plan for omega */ + cld_omega = X(mkplan_f_d)(plnr, + X(mkproblem_rdft_1_d)( + X(mktensor_1d)(npad, 1, 1), + X(mktensor_1d)(1, 0, 0), + buf, buf, R2HC), + NO_SLOW, ESTIMATE, 0); + if (!cld_omega) goto nada; + + /* deallocate buffers; let awake() or apply() allocate them for real */ + X(ifree)(buf); + buf = 0; + + pln = MKPLAN_RDFT(P, &padt, apply); + pln->cld1 = cld1; + pln->cld2 = cld2; + pln->cld_omega = cld_omega; + pln->omega = 0; + pln->n = n; + pln->npad = npad; + pln->is = is; + pln->os = os; + + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + pln->super.super.ops.other += (npad/2-1)*6 + npad + n + (n-1) * ego->pad; + pln->super.super.ops.add += (npad/2-1)*2 + 2 + (n-1) * ego->pad; + pln->super.super.ops.mul += (npad/2-1)*4 + 2 + ego->pad; +#if R2HC_ONLY_CONV + pln->super.super.ops.other += n-2 - ego->pad; + pln->super.super.ops.add += (npad/2-1)*2 + (n-2) - ego->pad; +#endif + + return &(pln->super.super); + + nada: + X(ifree0)(buf); + X(plan_destroy_internal)(cld_omega); + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + return 0; +} + +/* constructors */ + +static solver *mksolver(int pad) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->pad = pad; + return &(slv->super); +} + +void X(dht_rader_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver(0)); + REGISTER_SOLVER(p, mksolver(1)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct-r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct-r2c.c new file mode 100644 index 000000000..37c831010 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct-r2c.c @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* direct RDFT solver, using r2c codelets */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + const kr2c_desc *desc; + kr2c k; + int bufferedp; +} S; + +typedef struct { + plan_rdft super; + + stride rs, csr, csi; + stride brs, bcsr, bcsi; + INT n, vl, rs0, ivs, ovs, ioffset, bioffset; + kr2c k; + const S *slv; +} P; + +/************************************************************* + Nonbuffered code + *************************************************************/ +static void apply_r2hc(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + ASSERT_ALIGNED_DOUBLE; + ego->k(I, I + ego->rs0, O, O + ego->ioffset, + ego->rs, ego->csr, ego->csi, + ego->vl, ego->ivs, ego->ovs); +} + +static void apply_hc2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + ASSERT_ALIGNED_DOUBLE; + ego->k(O, O + ego->rs0, I, I + ego->ioffset, + ego->rs, ego->csr, ego->csi, + ego->vl, ego->ivs, ego->ovs); +} + +/************************************************************* + Buffered code + *************************************************************/ +/* should not be 2^k to avoid associativity conflicts */ +static INT compute_batchsize(INT radix) +{ + /* round up to multiple of 4 */ + radix += 3; + radix &= -4; + + return (radix + 2); +} + +static void dobatch_r2hc(const P *ego, R *I, R *O, R *buf, INT batchsz) +{ + X(cpy2d_ci)(I, buf, + ego->n, ego->rs0, WS(ego->bcsr /* hack */, 1), + batchsz, ego->ivs, 1, 1); + + if (IABS(WS(ego->csr, 1)) < IABS(ego->ovs)) { + /* transform directly to output */ + ego->k(buf, buf + WS(ego->bcsr /* hack */, 1), + O, O + ego->ioffset, + ego->brs, ego->csr, ego->csi, + batchsz, 1, ego->ovs); + } else { + /* transform to buffer and copy back */ + ego->k(buf, buf + WS(ego->bcsr /* hack */, 1), + buf, buf + ego->bioffset, + ego->brs, ego->bcsr, ego->bcsi, + batchsz, 1, 1); + X(cpy2d_co)(buf, O, + ego->n, WS(ego->bcsr, 1), WS(ego->csr, 1), + batchsz, 1, ego->ovs, 1); + } +} + +static void dobatch_hc2r(const P *ego, R *I, R *O, R *buf, INT batchsz) +{ + if (IABS(WS(ego->csr, 1)) < IABS(ego->ivs)) { + /* transform directly from input */ + ego->k(buf, buf + WS(ego->bcsr /* hack */, 1), + I, I + ego->ioffset, + ego->brs, ego->csr, ego->csi, + batchsz, ego->ivs, 1); + } else { + /* copy into buffer and transform in place */ + X(cpy2d_ci)(I, buf, + ego->n, WS(ego->csr, 1), WS(ego->bcsr, 1), + batchsz, ego->ivs, 1, 1); + ego->k(buf, buf + WS(ego->bcsr /* hack */, 1), + buf, buf + ego->bioffset, + ego->brs, ego->bcsr, ego->bcsi, + batchsz, 1, 1); + } + X(cpy2d_co)(buf, O, + ego->n, WS(ego->bcsr /* hack */, 1), ego->rs0, + batchsz, 1, ego->ovs, 1); +} + +static void iterate(const P *ego, R *I, R *O, + void (*dobatch)(const P *ego, R *I, R *O, + R *buf, INT batchsz)) +{ + R *buf; + INT vl = ego->vl; + INT n = ego->n; + INT i; + INT batchsz = compute_batchsize(n); + size_t bufsz = n * batchsz * sizeof(R); + + BUF_ALLOC(R *, buf, bufsz); + + for (i = 0; i < vl - batchsz; i += batchsz) { + dobatch(ego, I, O, buf, batchsz); + I += batchsz * ego->ivs; + O += batchsz * ego->ovs; + } + dobatch(ego, I, O, buf, vl - i); + + BUF_FREE(buf, bufsz); +} + +static void apply_buf_r2hc(const plan *ego_, R *I, R *O) +{ + iterate((const P *) ego_, I, O, dobatch_r2hc); +} + +static void apply_buf_hc2r(const plan *ego_, R *I, R *O) +{ + iterate((const P *) ego_, I, O, dobatch_hc2r); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(stride_destroy)(ego->rs); + X(stride_destroy)(ego->csr); + X(stride_destroy)(ego->csi); + X(stride_destroy)(ego->brs); + X(stride_destroy)(ego->bcsr); + X(stride_destroy)(ego->bcsi); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->slv; + + if (ego->slv->bufferedp) + p->print(p, "(rdft-%s-directbuf/%D-r2c-%D%v \"%s\")", + X(rdft_kind_str)(s->desc->genus->kind), + /* hack */ WS(ego->bcsr, 1), ego->n, + ego->vl, s->desc->nam); + + else + p->print(p, "(rdft-%s-direct-r2c-%D%v \"%s\")", + X(rdft_kind_str)(s->desc->genus->kind), ego->n, + ego->vl, s->desc->nam); +} + +static INT ioffset(rdft_kind kind, INT sz, INT s) +{ + return(s * ((kind == R2HC || kind == HC2R) ? sz : (sz - 1))); +} + +static int applicable(const solver *ego_, const problem *p_) +{ + const S *ego = (const S *) ego_; + const kr2c_desc *desc = ego->desc; + const problem_rdft *p = (const problem_rdft *) p_; + INT vl, ivs, ovs; + + return ( + 1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n == desc->n + && p->kind[0] == desc->genus->kind + + /* check strides etc */ + && X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs) + + && (0 + /* can operate out-of-place */ + || p->I != p->O + + /* computing one transform */ + || vl == 1 + + /* can operate in-place as long as strides are the same */ + || X(tensor_inplace_strides2)(p->sz, p->vecsz) + ) + ); +} + +static int applicable_buf(const solver *ego_, const problem *p_) +{ + const S *ego = (const S *) ego_; + const kr2c_desc *desc = ego->desc; + const problem_rdft *p = (const problem_rdft *) p_; + INT vl, ivs, ovs, batchsz; + + return ( + 1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n == desc->n + && p->kind[0] == desc->genus->kind + + /* check strides etc */ + && X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs) + + && (batchsz = compute_batchsize(desc->n), 1) + + && (0 + /* can operate out-of-place */ + || p->I != p->O + + /* can operate in-place as long as strides are the same */ + || X(tensor_inplace_strides2)(p->sz, p->vecsz) + + /* can do it if the problem fits in the buffer, no matter + what the strides are */ + || vl <= batchsz + ) + ); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const problem_rdft *p; + iodim *d; + INT rs, cs, b, n; + + static const plan_adt padt = { + X(rdft_solve), X(null_awake), print, destroy + }; + + UNUSED(plnr); + + if (ego->bufferedp) { + if (!applicable_buf(ego_, p_)) + return (plan *)0; + } else { + if (!applicable(ego_, p_)) + return (plan *)0; + } + + p = (const problem_rdft *) p_; + + if (R2HC_KINDP(p->kind[0])) { + rs = p->sz->dims[0].is; cs = p->sz->dims[0].os; + pln = MKPLAN_RDFT(P, &padt, + ego->bufferedp ? apply_buf_r2hc : apply_r2hc); + } else { + rs = p->sz->dims[0].os; cs = p->sz->dims[0].is; + pln = MKPLAN_RDFT(P, &padt, + ego->bufferedp ? apply_buf_hc2r : apply_hc2r); + } + + d = p->sz->dims; + n = d[0].n; + + pln->k = ego->k; + pln->n = n; + + pln->rs0 = rs; + pln->rs = X(mkstride)(n, 2 * rs); + pln->csr = X(mkstride)(n, cs); + pln->csi = X(mkstride)(n, -cs); + pln->ioffset = ioffset(p->kind[0], n, cs); + + b = compute_batchsize(n); + pln->brs = X(mkstride)(n, 2 * b); + pln->bcsr = X(mkstride)(n, b); + pln->bcsi = X(mkstride)(n, -b); + pln->bioffset = ioffset(p->kind[0], n, b); + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + pln->slv = ego; + X(ops_zero)(&pln->super.super.ops); + + X(ops_madd2)(pln->vl / ego->desc->genus->vl, + &ego->desc->ops, + &pln->super.super.ops); + + if (ego->bufferedp) + pln->super.super.ops.other += 2 * n * pln->vl; + + pln->super.super.could_prune_now_p = !ego->bufferedp; + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(kr2c k, const kr2c_desc *desc, int bufferedp) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->k = k; + slv->desc = desc; + slv->bufferedp = bufferedp; + return &(slv->super); +} + +solver *X(mksolver_rdft_r2c_direct)(kr2c k, const kr2c_desc *desc) +{ + return mksolver(k, desc, 0); +} + +solver *X(mksolver_rdft_r2c_directbuf)(kr2c k, const kr2c_desc *desc) +{ + return mksolver(k, desc, 1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct-r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct-r2r.c new file mode 100644 index 000000000..f23aa48f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct-r2r.c @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* direct RDFT solver, using r2r codelets */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + const kr2r_desc *desc; + kr2r k; +} S; + +typedef struct { + plan_rdft super; + + INT vl, ivs, ovs; + stride is, os; + kr2r k; + const S *slv; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + ASSERT_ALIGNED_DOUBLE; + ego->k(I, O, ego->is, ego->os, ego->vl, ego->ivs, ego->ovs); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(stride_destroy)(ego->is); + X(stride_destroy)(ego->os); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->slv; + + p->print(p, "(rdft-%s-direct-r2r-%D%v \"%s\")", + X(rdft_kind_str)(s->desc->kind), s->desc->n, + ego->vl, s->desc->nam); +} + +static int applicable(const solver *ego_, const problem *p_) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + INT vl; + INT ivs, ovs; + + return ( + 1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n == ego->desc->n + && p->kind[0] == ego->desc->kind + + /* check strides etc */ + && X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs) + + && (0 + /* can operate out-of-place */ + || p->I != p->O + + /* computing one transform */ + || vl == 1 + + /* can operate in-place as long as strides are the same */ + || X(tensor_inplace_strides2)(p->sz, p->vecsz) + ) + ); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const problem_rdft *p; + iodim *d; + + static const plan_adt padt = { + X(rdft_solve), X(null_awake), print, destroy + }; + + UNUSED(plnr); + + if (!applicable(ego_, p_)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + + pln = MKPLAN_RDFT(P, &padt, apply); + + d = p->sz->dims; + + pln->k = ego->k; + + pln->is = X(mkstride)(d->n, d->is); + pln->os = X(mkstride)(d->n, d->os); + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + pln->slv = ego; + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl / ego->desc->genus->vl, + &ego->desc->ops, + &pln->super.super.ops); + + pln->super.super.could_prune_now_p = 1; + + return &(pln->super.super); +} + +/* constructor */ +solver *X(mksolver_rdft_r2r_direct)(kr2r k, const kr2r_desc *desc) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->k = k; + slv->desc = desc; + return &(slv->super); +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct2.c new file mode 100644 index 000000000..e0a5e8017 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/direct2.c @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* direct RDFT2 R2HC/HC2R solver, if we have a codelet */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + const kr2c_desc *desc; + kr2c k; +} S; + +typedef struct { + plan_rdft2 super; + + stride rs, cs; + INT vl; + INT ivs, ovs; + kr2c k; + const S *slv; + INT ilast; +} P; + +static void apply(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + ASSERT_ALIGNED_DOUBLE; + ego->k(r0, r1, cr, ci, + ego->rs, ego->cs, ego->cs, + ego->vl, ego->ivs, ego->ovs); +} + +static void apply_r2hc(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + INT i, vl = ego->vl, ovs = ego->ovs; + ASSERT_ALIGNED_DOUBLE; + ego->k(r0, r1, cr, ci, + ego->rs, ego->cs, ego->cs, + vl, ego->ivs, ovs); + for (i = 0; i < vl; ++i, ci += ovs) + ci[0] = ci[ego->ilast] = 0; +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(stride_destroy)(ego->rs); + X(stride_destroy)(ego->cs); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->slv; + + p->print(p, "(rdft2-%s-direct-%D%v \"%s\")", + X(rdft_kind_str)(s->desc->genus->kind), s->desc->n, + ego->vl, s->desc->nam); +} + +static int applicable(const solver *ego_, const problem *p_) +{ + const S *ego = (const S *) ego_; + const kr2c_desc *desc = ego->desc; + const problem_rdft2 *p = (const problem_rdft2 *) p_; + INT vl; + INT ivs, ovs; + + return ( + 1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n == desc->n + && p->kind == desc->genus->kind + + /* check strides etc */ + && X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs) + + && (0 + /* can operate out-of-place */ + || p->r0 != p->cr + + /* + * can compute one transform in-place, no matter + * what the strides are. + */ + || p->vecsz->rnk == 0 + + /* can operate in-place as long as strides are the same */ + || X(rdft2_inplace_strides)(p, RNK_MINFTY) + ) + ); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const problem_rdft2 *p; + iodim *d; + int r2hc_kindp; + + static const plan_adt padt = { + X(rdft2_solve), X(null_awake), print, destroy + }; + + UNUSED(plnr); + + if (!applicable(ego_, p_)) + return (plan *)0; + + p = (const problem_rdft2 *) p_; + + r2hc_kindp = R2HC_KINDP(p->kind); + A(r2hc_kindp || HC2R_KINDP(p->kind)); + + pln = MKPLAN_RDFT2(P, &padt, p->kind == R2HC ? apply_r2hc : apply); + + d = p->sz->dims; + + pln->k = ego->k; + + pln->rs = X(mkstride)(d->n, r2hc_kindp ? d->is : d->os); + pln->cs = X(mkstride)(d->n, r2hc_kindp ? d->os : d->is); + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + /* Nyquist freq., if any */ + pln->ilast = (d->n % 2) ? 0 : (d->n/2) * d->os; + + pln->slv = ego; + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl / ego->desc->genus->vl, + &ego->desc->ops, + &pln->super.super.ops); + if (p->kind == R2HC) + pln->super.super.ops.other += 2 * pln->vl; /* + 2 stores */ + + pln->super.super.could_prune_now_p = 1; + return &(pln->super.super); +} + +/* constructor */ +solver *X(mksolver_rdft2_direct)(kr2c k, const kr2c_desc *desc) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->k = k; + slv->desc = desc; + return &(slv->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/generic.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/generic.c new file mode 100644 index 000000000..506856414 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/generic.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + rdft_kind kind; +} S; + +typedef struct { + plan_rdft super; + twid *td; + INT n, is, os; + rdft_kind kind; +} P; + +/***************************************************************************/ + +static void cdot_r2hc(INT n, const E *x, const R *w, R *or0, R *oi1) +{ + INT i; + + E rr = x[0], ri = 0; + x += 1; + for (i = 1; i + i < n; ++i) { + rr += x[0] * w[0]; + ri += x[1] * w[1]; + x += 2; w += 2; + } + *or0 = rr; + *oi1 = ri; +} + +static void hartley_r2hc(INT n, const R *xr, INT xs, E *o, R *pr) +{ + INT i; + E sr; + o[0] = sr = xr[0]; o += 1; + for (i = 1; i + i < n; ++i) { + R a, b; + a = xr[i * xs]; + b = xr[(n - i) * xs]; + sr += (o[0] = a + b); +#if FFT_SIGN == -1 + o[1] = b - a; +#else + o[1] = a - b; +#endif + o += 2; + } + *pr = sr; +} + +static void apply_r2hc(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT i; + INT n = ego->n, is = ego->is, os = ego->os; + const R *W = ego->td->W; + E *buf; + size_t bufsz = n * sizeof(E); + + BUF_ALLOC(E *, buf, bufsz); + hartley_r2hc(n, I, is, buf, O); + + for (i = 1; i + i < n; ++i) { + cdot_r2hc(n, buf, W, O + i * os, O + (n - i) * os); + W += n - 1; + } + + BUF_FREE(buf, bufsz); +} + + +static void cdot_hc2r(INT n, const E *x, const R *w, R *or0, R *or1) +{ + INT i; + + E rr = x[0], ii = 0; + x += 1; + for (i = 1; i + i < n; ++i) { + rr += x[0] * w[0]; + ii += x[1] * w[1]; + x += 2; w += 2; + } +#if FFT_SIGN == -1 + *or0 = rr - ii; + *or1 = rr + ii; +#else + *or0 = rr + ii; + *or1 = rr - ii; +#endif +} + +static void hartley_hc2r(INT n, const R *x, INT xs, E *o, R *pr) +{ + INT i; + E sr; + + o[0] = sr = x[0]; o += 1; + for (i = 1; i + i < n; ++i) { + sr += (o[0] = x[i * xs] + x[i * xs]); + o[1] = x[(n - i) * xs] + x[(n - i) * xs]; + o += 2; + } + *pr = sr; +} + +static void apply_hc2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT i; + INT n = ego->n, is = ego->is, os = ego->os; + const R *W = ego->td->W; + E *buf; + size_t bufsz = n * sizeof(E); + + BUF_ALLOC(E *, buf, bufsz); + hartley_hc2r(n, I, is, buf, O); + + for (i = 1; i + i < n; ++i) { + cdot_hc2r(n, buf, W, O + i * os, O + (n - i) * os); + W += n - 1; + } + + BUF_FREE(buf, bufsz); +} + + +/***************************************************************************/ + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr half_tw[] = { + { TW_HALF, 1, 0 }, + { TW_NEXT, 1, 0 } + }; + + X(twiddle_awake)(wakefulness, &ego->td, half_tw, ego->n, ego->n, + (ego->n - 1) / 2); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + + p->print(p, "(rdft-generic-%s-%D)", + ego->kind == R2HC ? "r2hc" : "hc2r", + ego->n); +} + +static int applicable(const S *ego, const problem *p_, + const planner *plnr) +{ + const problem_rdft *p = (const problem_rdft *) p_; + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + && (p->sz->dims[0].n % 2) == 1 + && CIMPLIES(NO_LARGE_GENERICP(plnr), p->sz->dims[0].n < GENERIC_MIN_BAD) + && CIMPLIES(NO_SLOWP(plnr), p->sz->dims[0].n > GENERIC_MAX_SLOW) + && X(is_prime)(p->sz->dims[0].n) + && p->kind[0] == ego->kind + ); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *)ego_; + const problem_rdft *p; + P *pln; + INT n; + + static const plan_adt padt = { + X(rdft_solve), awake, print, X(plan_null_destroy) + }; + + if (!applicable(ego, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + pln = MKPLAN_RDFT(P, &padt, + R2HC_KINDP(p->kind[0]) ? apply_r2hc : apply_hc2r); + + pln->n = n = p->sz->dims[0].n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->td = 0; + pln->kind = ego->kind; + + pln->super.super.ops.add = (n-1) * 2.5; + pln->super.super.ops.mul = 0; + pln->super.super.ops.fma = 0.5 * (n-1) * (n-1) ; +#if 0 /* these are nice pipelined sequential loads and should cost nothing */ + pln->super.super.ops.other = (n-1)*(2 + 1 + (n-1)); /* approximate */ +#endif + + return &(pln->super.super); +} + +static solver *mksolver(rdft_kind kind) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->kind = kind; + return &(slv->super); +} + +void X(rdft_generic_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver(R2HC)); + REGISTER_SOLVER(p, mksolver(HC2R)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc-direct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc-direct.c new file mode 100644 index 000000000..284a8bbaf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc-direct.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/hc2hc.h" + +typedef struct { + hc2hc_solver super; + const hc2hc_desc *desc; + khc2hc k; + int bufferedp; +} S; + +typedef struct { + plan_hc2hc super; + khc2hc k; + plan *cld0, *cldm; /* children for 0th and middle butterflies */ + INT r, m, v; + INT ms, vs, mb, me; + stride rs, brs; + twid *td; + const S *slv; +} P; + +/************************************************************* + Nonbuffered code +*************************************************************/ +static void apply(const plan *ego_, R *IO) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld0 = (plan_rdft *) ego->cld0; + plan_rdft *cldm = (plan_rdft *) ego->cldm; + INT i, m = ego->m, v = ego->v; + INT mb = ego->mb, me = ego->me; + INT ms = ego->ms, vs = ego->vs; + + for (i = 0; i < v; ++i, IO += vs) { + cld0->apply((plan *) cld0, IO, IO); + ego->k(IO + ms * mb, IO + (m - mb) * ms, + ego->td->W, ego->rs, mb, me, ms); + cldm->apply((plan *) cldm, IO + (m/2) * ms, IO + (m/2) * ms); + } +} + +/************************************************************* + Buffered code +*************************************************************/ + +/* should not be 2^k to avoid associativity conflicts */ +static INT compute_batchsize(INT radix) +{ + /* round up to multiple of 4 */ + radix += 3; + radix &= -4; + + return (radix + 2); +} + +static void dobatch(const P *ego, R *IOp, R *IOm, + INT mb, INT me, R *bufp) +{ + INT b = WS(ego->brs, 1); + INT rs = WS(ego->rs, 1); + INT r = ego->r; + INT ms = ego->ms; + R *bufm = bufp + b - 1; + + X(cpy2d_ci)(IOp + mb * ms, bufp, r, rs, b, me - mb, ms, 1, 1); + X(cpy2d_ci)(IOm - mb * ms, bufm, r, rs, b, me - mb, -ms, -1, 1); + + ego->k(bufp, bufm, ego->td->W, ego->brs, mb, me, 1); + + X(cpy2d_co)(bufp, IOp + mb * ms, r, b, rs, me - mb, 1, ms, 1); + X(cpy2d_co)(bufm, IOm - mb * ms, r, b, rs, me - mb, -1, -ms, 1); +} + +static void apply_buf(const plan *ego_, R *IO) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld0 = (plan_rdft *) ego->cld0; + plan_rdft *cldm = (plan_rdft *) ego->cldm; + INT i, j, m = ego->m, v = ego->v, r = ego->r; + INT mb = ego->mb, me = ego->me, ms = ego->ms; + INT batchsz = compute_batchsize(r); + R *buf; + size_t bufsz = r * batchsz * 2 * sizeof(R); + + BUF_ALLOC(R *, buf, bufsz); + + for (i = 0; i < v; ++i, IO += ego->vs) { + R *IOp = IO; + R *IOm = IO + m * ms; + + cld0->apply((plan *) cld0, IO, IO); + + for (j = mb; j + batchsz < me; j += batchsz) + dobatch(ego, IOp, IOm, j, j + batchsz, buf); + + dobatch(ego, IOp, IOm, j, me, buf); + + cldm->apply((plan *) cldm, IO + ms * (m/2), IO + ms * (m/2)); + } + + BUF_FREE(buf, bufsz); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld0, wakefulness); + X(plan_awake)(ego->cldm, wakefulness); + X(twiddle_awake)(wakefulness, &ego->td, ego->slv->desc->tw, + ego->r * ego->m, ego->r, (ego->m - 1) / 2); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld0); + X(plan_destroy_internal)(ego->cldm); + X(stride_destroy)(ego->rs); + X(stride_destroy)(ego->brs); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *slv = ego->slv; + const hc2hc_desc *e = slv->desc; + INT batchsz = compute_batchsize(ego->r); + + if (slv->bufferedp) + p->print(p, "(hc2hc-directbuf/%D-%D/%D%v \"%s\"%(%p%)%(%p%))", + batchsz, ego->r, X(twiddle_length)(ego->r, e->tw), + ego->v, e->nam, ego->cld0, ego->cldm); + else + p->print(p, "(hc2hc-direct-%D/%D%v \"%s\"%(%p%)%(%p%))", + ego->r, X(twiddle_length)(ego->r, e->tw), ego->v, e->nam, + ego->cld0, ego->cldm); +} + +static int applicable0(const S *ego, rdft_kind kind, INT r) +{ + const hc2hc_desc *e = ego->desc; + + return (1 + && r == e->radix + && kind == e->genus->kind + ); +} + +static int applicable(const S *ego, rdft_kind kind, INT r, INT m, INT v, + const planner *plnr) +{ + if (!applicable0(ego, kind, r)) + return 0; + + if (NO_UGLYP(plnr) && X(ct_uglyp)((ego->bufferedp? (INT)512 : (INT)16), + v, m * r, r)) + return 0; + + return 1; +} + +#define CLDMP(m, mstart, mcount) (2 * ((mstart) + (mcount)) == (m) + 2) +#define CLD0P(mstart) ((mstart) == 0) + +static plan *mkcldw(const hc2hc_solver *ego_, + rdft_kind kind, INT r, INT m, INT ms, INT v, INT vs, + INT mstart, INT mcount, + R *IO, planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + const hc2hc_desc *e = ego->desc; + plan *cld0 = 0, *cldm = 0; + INT imid = (m / 2) * ms; + INT rs = m * ms; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + if (!applicable(ego, kind, r, m, v, plnr)) + return (plan *)0; + + cld0 = X(mkplan_d)( + plnr, + X(mkproblem_rdft_1_d)((CLD0P(mstart) ? + X(mktensor_1d)(r, rs, rs) : X(mktensor_0d)()), + X(mktensor_0d)(), + TAINT(IO, vs), TAINT(IO, vs), + kind)); + if (!cld0) goto nada; + + cldm = X(mkplan_d)( + plnr, + X(mkproblem_rdft_1_d)((CLDMP(m, mstart, mcount) ? + X(mktensor_1d)(r, rs, rs) : X(mktensor_0d)()), + X(mktensor_0d)(), + TAINT(IO + imid, vs), TAINT(IO + imid, vs), + kind == R2HC ? R2HCII : HC2RIII)); + if (!cldm) goto nada; + + pln = MKPLAN_HC2HC(P, &padt, ego->bufferedp ? apply_buf : apply); + + pln->k = ego->k; + pln->td = 0; + pln->r = r; pln->rs = X(mkstride)(r, rs); + pln->m = m; pln->ms = ms; + pln->v = v; pln->vs = vs; + pln->slv = ego; + pln->brs = X(mkstride)(r, 2 * compute_batchsize(r)); + pln->cld0 = cld0; + pln->cldm = cldm; + pln->mb = mstart + CLD0P(mstart); + pln->me = mstart + mcount - CLDMP(m, mstart, mcount); + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(v * ((pln->me - pln->mb) / e->genus->vl), + &e->ops, &pln->super.super.ops); + X(ops_madd2)(v, &cld0->ops, &pln->super.super.ops); + X(ops_madd2)(v, &cldm->ops, &pln->super.super.ops); + + if (ego->bufferedp) + pln->super.super.ops.other += 4 * r * (pln->me - pln->mb) * v; + + pln->super.super.could_prune_now_p = + (!ego->bufferedp && r >= 5 && r < 64 && m >= r); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld0); + X(plan_destroy_internal)(cldm); + return 0; +} + +static void regone(planner *plnr, khc2hc codelet, const hc2hc_desc *desc, + int bufferedp) +{ + S *slv = (S *)X(mksolver_hc2hc)(sizeof(S), desc->radix, mkcldw); + slv->k = codelet; + slv->desc = desc; + slv->bufferedp = bufferedp; + REGISTER_SOLVER(plnr, &(slv->super.super)); + if (X(mksolver_hc2hc_hook)) { + slv = (S *)X(mksolver_hc2hc_hook)(sizeof(S), desc->radix, mkcldw); + slv->k = codelet; + slv->desc = desc; + slv->bufferedp = bufferedp; + REGISTER_SOLVER(plnr, &(slv->super.super)); + } +} + +void X(regsolver_hc2hc_direct)(planner *plnr, khc2hc codelet, + const hc2hc_desc *desc) +{ + regone(plnr, codelet, desc, /* bufferedp */0); + regone(plnr, codelet, desc, /* bufferedp */1); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc-generic.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc-generic.c new file mode 100644 index 000000000..334020e26 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc-generic.c @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* express a hc2hc problem in terms of rdft + multiplication by + twiddle factors */ + +#include "rdft/hc2hc.h" + +typedef hc2hc_solver S; + +typedef struct { + plan_hc2hc super; + + INT r, m, s, vl, vs, mstart1, mcount1; + plan *cld0; + plan *cld; + twid *td; +} P; + + +/**************************************************************/ +static void mktwiddle(P *ego, enum wakefulness wakefulness) +{ + static const tw_instr tw[] = { { TW_HALF, 0, 0 }, { TW_NEXT, 1, 0 } }; + + /* note that R and M are swapped, to allow for sequential + access both to data and twiddles */ + X(twiddle_awake)(wakefulness, &ego->td, tw, + ego->r * ego->m, ego->m, ego->r); +} + +static void bytwiddle(const P *ego, R *IO, R sign) +{ + INT i, j, k; + INT r = ego->r, m = ego->m, s = ego->s, vl = ego->vl, vs = ego->vs; + INT ms = m * s; + INT mstart1 = ego->mstart1, mcount1 = ego->mcount1; + INT wrem = 2 * ((m-1)/2 - mcount1); + + for (i = 0; i < vl; ++i, IO += vs) { + const R *W = ego->td->W; + + A(m % 2 == 1); + for (k = 1, W += (m - 1) + 2*(mstart1-1); k < r; ++k) { + /* pr := IO + (j + mstart1) * s + k * ms */ + R *pr = IO + mstart1 * s + k * ms; + + /* pi := IO + (m - j - mstart1) * s + k * ms */ + R *pi = IO - mstart1 * s + (k + 1) * ms; + + for (j = 0; j < mcount1; ++j, pr += s, pi -= s) { + E xr = *pr; + E xi = *pi; + E wr = W[0]; + E wi = sign * W[1]; + *pr = xr * wr - xi * wi; + *pi = xi * wr + xr * wi; + W += 2; + } + W += wrem; + } + } +} + +static void swapri(R *IO, INT r, INT m, INT s, INT jstart, INT jend) +{ + INT k; + INT ms = m * s; + INT js = jstart * s; + for (k = 0; k + k < r; ++k) { + /* pr := IO + (m - j) * s + k * ms */ + R *pr = IO + (k + 1) * ms - js; + /* pi := IO + (m - j) * s + (r - 1 - k) * ms */ + R *pi = IO + (r - k) * ms - js; + INT j; + for (j = jstart; j < jend; j += 1, pr -= s, pi -= s) { + R t = *pr; + *pr = *pi; + *pi = t; + } + } +} + +static void reorder_dit(const P *ego, R *IO) +{ + INT i, k; + INT r = ego->r, m = ego->m, s = ego->s, vl = ego->vl, vs = ego->vs; + INT ms = m * s; + INT mstart1 = ego->mstart1, mend1 = mstart1 + ego->mcount1; + + for (i = 0; i < vl; ++i, IO += vs) { + for (k = 1; k + k < r; ++k) { + R *p0 = IO + k * ms; + R *p1 = IO + (r - k) * ms; + INT j; + + for (j = mstart1; j < mend1; ++j) { + E rp, ip, im, rm; + rp = p0[j * s]; + im = p1[ms - j * s]; + rm = p1[j * s]; + ip = p0[ms - j * s]; + p0[j * s] = rp - im; + p1[ms - j * s] = rp + im; + p1[j * s] = rm - ip; + p0[ms - j * s] = ip + rm; + } + } + + swapri(IO, r, m, s, mstart1, mend1); + } +} + +static void reorder_dif(const P *ego, R *IO) +{ + INT i, k; + INT r = ego->r, m = ego->m, s = ego->s, vl = ego->vl, vs = ego->vs; + INT ms = m * s; + INT mstart1 = ego->mstart1, mend1 = mstart1 + ego->mcount1; + + for (i = 0; i < vl; ++i, IO += vs) { + swapri(IO, r, m, s, mstart1, mend1); + + for (k = 1; k + k < r; ++k) { + R *p0 = IO + k * ms; + R *p1 = IO + (r - k) * ms; + const R half = K(0.5); + INT j; + + for (j = mstart1; j < mend1; ++j) { + E rp, ip, im, rm; + rp = half * p0[j * s]; + im = half * p1[ms - j * s]; + rm = half * p1[j * s]; + ip = half * p0[ms - j * s]; + p0[j * s] = rp + im; + p1[ms - j * s] = im - rp; + p1[j * s] = rm + ip; + p0[ms - j * s] = ip - rm; + } + } + } +} + +static int applicable(rdft_kind kind, INT r, INT m, const planner *plnr) +{ + return (1 + && (kind == R2HC || kind == HC2R) + && (m % 2) + && (r % 2) + && !NO_SLOWP(plnr) + ); +} + +/**************************************************************/ + +static void apply_dit(const plan *ego_, R *IO) +{ + const P *ego = (const P *) ego_; + INT start; + plan_rdft *cld, *cld0; + + bytwiddle(ego, IO, K(-1.0)); + + cld0 = (plan_rdft *) ego->cld0; + cld0->apply(ego->cld0, IO, IO); + + start = ego->mstart1 * ego->s; + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, IO + start, IO + start); + + reorder_dit(ego, IO); +} + +static void apply_dif(const plan *ego_, R *IO) +{ + const P *ego = (const P *) ego_; + INT start; + plan_rdft *cld, *cld0; + + reorder_dif(ego, IO); + + cld0 = (plan_rdft *) ego->cld0; + cld0->apply(ego->cld0, IO, IO); + + start = ego->mstart1 * ego->s; + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, IO + start, IO + start); + + bytwiddle(ego, IO, K(1.0)); +} + + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld0, wakefulness); + X(plan_awake)(ego->cld, wakefulness); + mktwiddle(ego, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); + X(plan_destroy_internal)(ego->cld0); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(hc2hc-generic-%s-%D-%D%v%(%p%)%(%p%))", + ego->super.apply == apply_dit ? "dit" : "dif", + ego->r, ego->m, ego->vl, ego->cld0, ego->cld); +} + +static plan *mkcldw(const hc2hc_solver *ego_, + rdft_kind kind, INT r, INT m, INT s, INT vl, INT vs, + INT mstart, INT mcount, + R *IO, planner *plnr) +{ + P *pln; + plan *cld0 = 0, *cld = 0; + INT mstart1, mcount1, mstride; + + static const plan_adt padt = { + 0, awake, print, destroy + }; + + UNUSED(ego_); + + A(mstart >= 0 && mcount > 0 && mstart + mcount <= (m+2)/2); + + if (!applicable(kind, r, m, plnr)) + return (plan *)0; + + A(m % 2); + mstart1 = mstart + (mstart == 0); + mcount1 = mcount - (mstart == 0); + mstride = m - (mstart + mcount - 1) - mstart1; + + /* 0th (DC) transform (vl of these), if mstart == 0 */ + cld0 = X(mkplan_d)(plnr, + X(mkproblem_rdft_1_d)( + mstart == 0 ? X(mktensor_1d)(r, m * s, m * s) + : X(mktensor_0d)(), + X(mktensor_1d)(vl, vs, vs), + IO, IO, kind) + ); + if (!cld0) goto nada; + + /* twiddle transforms: there are 2 x mcount1 x vl of these + (where 2 corresponds to the real and imaginary parts) ... + the 2 x mcount1 loops are combined if mstart=0 and mcount=(m+2)/2. */ + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_1_d)( + X(mktensor_1d)(r, m * s, m * s), + X(mktensor_3d)(2, mstride * s, mstride * s, + mcount1, s, s, + vl, vs, vs), + IO + s * mstart1, IO + s * mstart1, kind) + ); + if (!cld) goto nada; + + pln = MKPLAN_HC2HC(P, &padt, (kind == R2HC) ? apply_dit : apply_dif); + pln->cld = cld; + pln->cld0 = cld0; + pln->r = r; + pln->m = m; + pln->s = s; + pln->vl = vl; + pln->vs = vs; + pln->td = 0; + pln->mstart1 = mstart1; + pln->mcount1 = mcount1; + + { + double n0 = 0.5 * (r - 1) * (2 * mcount1) * vl; + pln->super.super.ops = cld->ops; + pln->super.super.ops.mul += (kind == R2HC ? 5.0 : 7.0) * n0; + pln->super.super.ops.add += 4.0 * n0; + pln->super.super.ops.other += 11.0 * n0; + } + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld); + X(plan_destroy_internal)(cld0); + return (plan *) 0; +} + +static void regsolver(planner *plnr, INT r) +{ + S *slv = (S *)X(mksolver_hc2hc)(sizeof(S), r, mkcldw); + REGISTER_SOLVER(plnr, &(slv->super)); + if (X(mksolver_hc2hc_hook)) { + slv = (S *)X(mksolver_hc2hc_hook)(sizeof(S), r, mkcldw); + REGISTER_SOLVER(plnr, &(slv->super)); + } +} + +void X(hc2hc_generic_register)(planner *p) +{ + regsolver(p, 0); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc.c new file mode 100644 index 000000000..433d98320 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/hc2hc.h" + +hc2hc_solver *(*X(mksolver_hc2hc_hook))(size_t, INT, hc2hc_mkinferior) = 0; + +typedef struct { + plan_rdft super; + plan *cld; + plan *cldw; + INT r; +} P; + +static void apply_dit(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld; + plan_hc2hc *cldw; + + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, I, O); + + cldw = (plan_hc2hc *) ego->cldw; + cldw->apply(ego->cldw, O); +} + +static void apply_dif(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld; + plan_hc2hc *cldw; + + cldw = (plan_hc2hc *) ego->cldw; + cldw->apply(ego->cldw, I); + + cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, I, O); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldw, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldw); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rdft-ct-%s/%D%(%p%)%(%p%))", + ego->super.apply == apply_dit ? "dit" : "dif", + ego->r, ego->cldw, ego->cld); +} + +static int applicable0(const hc2hc_solver *ego, const problem *p_, planner *plnr) +{ + const problem_rdft *p = (const problem_rdft *) p_; + INT r; + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + + && (/* either the problem is R2HC, which is solved by DIT */ + (p->kind[0] == R2HC) + || + /* or the problem is HC2R, in which case it is solved + by DIF, which destroys the input */ + (p->kind[0] == HC2R && + (p->I == p->O || !NO_DESTROY_INPUTP(plnr)))) + + && ((r = X(choose_radix)(ego->r, p->sz->dims[0].n)) > 0) + && p->sz->dims[0].n > r); +} + +int X(hc2hc_applicable)(const hc2hc_solver *ego, const problem *p_, planner *plnr) +{ + const problem_rdft *p; + + if (!applicable0(ego, p_, plnr)) + return 0; + + p = (const problem_rdft *) p_; + + return (0 + || p->vecsz->rnk == 0 + || !NO_VRECURSEP(plnr) + ); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const hc2hc_solver *ego = (const hc2hc_solver *) ego_; + const problem_rdft *p; + P *pln = 0; + plan *cld = 0, *cldw = 0; + INT n, r, m, v, ivs, ovs; + iodim *d; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (NO_NONTHREADEDP(plnr) || !X(hc2hc_applicable)(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_rdft *) p_; + d = p->sz->dims; + n = d[0].n; + r = X(choose_radix)(ego->r, n); + m = n / r; + + X(tensor_tornk1)(p->vecsz, &v, &ivs, &ovs); + + switch (p->kind[0]) { + case R2HC: + cldw = ego->mkcldw(ego, + R2HC, r, m, d[0].os, v, ovs, 0, (m+2)/2, + p->O, plnr); + if (!cldw) goto nada; + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(m, r * d[0].is, d[0].os), + X(mktensor_2d)(r, d[0].is, m * d[0].os, + v, ivs, ovs), + p->I, p->O, p->kind) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT(P, &padt, apply_dit); + break; + + case HC2R: + cldw = ego->mkcldw(ego, + HC2R, r, m, d[0].is, v, ivs, 0, (m+2)/2, + p->I, plnr); + if (!cldw) goto nada; + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(m, d[0].is, r * d[0].os), + X(mktensor_2d)(r, m * d[0].is, d[0].os, + v, ivs, ovs), + p->I, p->O, p->kind) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT(P, &padt, apply_dif); + break; + + default: + A(0); + } + + pln->cld = cld; + pln->cldw = cldw; + pln->r = r; + X(ops_add)(&cld->ops, &cldw->ops, &pln->super.super.ops); + + /* inherit could_prune_now_p attribute from cldw */ + pln->super.super.could_prune_now_p = cldw->could_prune_now_p; + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldw); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +hc2hc_solver *X(mksolver_hc2hc)(size_t size, INT r, hc2hc_mkinferior mkcldw) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + hc2hc_solver *slv = (hc2hc_solver *)X(mksolver)(size, &sadt); + slv->r = r; + slv->mkcldw = mkcldw; + return slv; +} + +plan *X(mkplan_hc2hc)(size_t size, const plan_adt *adt, hc2hcapply apply) +{ + plan_hc2hc *ego; + + ego = (plan_hc2hc *) X(mkplan)(size, adt); + ego->apply = apply; + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc.h new file mode 100644 index 000000000..cf003fc68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/hc2hc.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/rdft.h" + +typedef void (*hc2hcapply) (const plan *ego, R *IO); +typedef struct hc2hc_solver_s hc2hc_solver; +typedef plan *(*hc2hc_mkinferior)(const hc2hc_solver *ego, + rdft_kind kind, INT r, INT m, INT s, + INT vl, INT vs, INT mstart, INT mcount, + R *IO, planner *plnr); + +typedef struct { + plan super; + hc2hcapply apply; +} plan_hc2hc; + +extern plan *X(mkplan_hc2hc)(size_t size, const plan_adt *adt, + hc2hcapply apply); + +#define MKPLAN_HC2HC(type, adt, apply) \ + (type *)X(mkplan_hc2hc)(sizeof(type), adt, apply) + +struct hc2hc_solver_s { + solver super; + INT r; + + hc2hc_mkinferior mkcldw; +}; + +hc2hc_solver *X(mksolver_hc2hc)(size_t size, INT r, hc2hc_mkinferior mkcldw); +extern hc2hc_solver *(*X(mksolver_hc2hc_hook))(size_t, INT, hc2hc_mkinferior); + +void X(regsolver_hc2hc_direct)(planner *plnr, khc2hc codelet, + const hc2hc_desc *desc); + +int X(hc2hc_applicable)(const hc2hc_solver *, const problem *, planner *); diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/indirect.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/indirect.c new file mode 100644 index 000000000..f981dfcb5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/indirect.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +/* solvers/plans for vectors of small RDFT's that cannot be done + in-place directly. Use a rank-0 plan to rearrange the data + before or after the transform. Can also change an out-of-place + plan into a copy + in-place (where the in-place transform + is e.g. unit stride). */ + +/* FIXME: merge with rank-geq2.c(?), since this is just a special case + of a rank split where the first/second transform has rank 0. */ + +#include "rdft/rdft.h" + +typedef problem *(*mkcld_t) (const problem_rdft *p); + +typedef struct { + rdftapply apply; + problem *(*mkcld)(const problem_rdft *p); + const char *nam; +} ndrct_adt; + +typedef struct { + solver super; + const ndrct_adt *adt; +} S; + +typedef struct { + plan_rdft super; + plan *cldcpy, *cld; + const S *slv; +} P; + +/*-----------------------------------------------------------------------*/ +/* first rearrange, then transform */ +static void apply_before(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + + { + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + cldcpy->apply(ego->cldcpy, I, O); + } + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, O, O); + } +} + +static problem *mkcld_before(const problem_rdft *p) +{ + return X(mkproblem_rdft_d)(X(tensor_copy_inplace)(p->sz, INPLACE_OS), + X(tensor_copy_inplace)(p->vecsz, INPLACE_OS), + p->O, p->O, p->kind); +} + +static const ndrct_adt adt_before = +{ + apply_before, mkcld_before, "rdft-indirect-before" +}; + +/*-----------------------------------------------------------------------*/ +/* first transform, then rearrange */ + +static void apply_after(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply(ego->cld, I, I); + } + { + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + cldcpy->apply(ego->cldcpy, I, O); + } +} + +static problem *mkcld_after(const problem_rdft *p) +{ + return X(mkproblem_rdft_d)(X(tensor_copy_inplace)(p->sz, INPLACE_IS), + X(tensor_copy_inplace)(p->vecsz, INPLACE_IS), + p->I, p->I, p->kind); +} + +static const ndrct_adt adt_after = +{ + apply_after, mkcld_after, "rdft-indirect-after" +}; + +/*-----------------------------------------------------------------------*/ +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); + X(plan_destroy_internal)(ego->cldcpy); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldcpy, wakefulness); + X(plan_awake)(ego->cld, wakefulness); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->slv; + p->print(p, "(%s%(%p%)%(%p%))", s->adt->nam, ego->cld, ego->cldcpy); +} + +static int applicable0(const solver *ego_, const problem *p_, + const planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + return (1 + && FINITE_RNK(p->vecsz->rnk) + + /* problem must be a nontrivial transform, not just a copy */ + && p->sz->rnk > 0 + + && (0 + + /* problem must be in-place & require some + rearrangement of the data */ + || (p->I == p->O + && !(X(tensor_inplace_strides2)(p->sz, p->vecsz))) + + /* or problem must be out of place, transforming + from stride 1/2 to bigger stride, for apply_after */ + || (p->I != p->O && ego->adt->apply == apply_after + && !NO_DESTROY_INPUTP(plnr) + && X(tensor_min_istride)(p->sz) <= 2 + && X(tensor_min_ostride)(p->sz) > 2) + + /* or problem must be out of place, transforming + to stride 1/2 from bigger stride, for apply_before */ + || (p->I != p->O && ego->adt->apply == apply_before + && X(tensor_min_ostride)(p->sz) <= 2 + && X(tensor_min_istride)(p->sz) > 2) + + ) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr) +{ + if (!applicable0(ego_, p_, plnr)) return 0; + + if (NO_INDIRECT_OP_P(plnr)) { + const problem_rdft *p = (const problem_rdft *)p_; + if (p->I != p->O) return 0; + } + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const problem_rdft *p = (const problem_rdft *) p_; + const S *ego = (const S *) ego_; + P *pln; + plan *cld = 0, *cldcpy = 0; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *) 0; + + cldcpy = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(tensor_append)(p->vecsz, p->sz), + p->I, p->O)); + if (!cldcpy) goto nada; + + cld = X(mkplan_f_d)(plnr, ego->adt->mkcld(p), NO_BUFFERING, 0, 0); + if (!cld) goto nada; + + pln = MKPLAN_RDFT(P, &padt, ego->adt->apply); + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->slv = ego; + X(ops_add)(&cld->ops, &cldcpy->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld); + X(plan_destroy_internal)(cldcpy); + return (plan *)0; +} + +static solver *mksolver(const ndrct_adt *adt) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->adt = adt; + return &(slv->super); +} + +void X(rdft_indirect_register)(planner *p) +{ + unsigned i; + static const ndrct_adt *const adts[] = { + &adt_before, &adt_after + }; + + for (i = 0; i < sizeof(adts) / sizeof(adts[0]); ++i) + REGISTER_SOLVER(p, mksolver(adts[i])); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/khc2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/khc2c.c new file mode 100644 index 000000000..38d1bc8d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/khc2c.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "ct-hc2c.h" + +void X(khc2c_register)(planner *p, khc2c codelet, const hc2c_desc *desc, + hc2c_kind hc2ckind) +{ + X(regsolver_hc2c_direct)(p, codelet, desc, hc2ckind); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/khc2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/khc2hc.c new file mode 100644 index 000000000..49e4ad178 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/khc2hc.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/hc2hc.h" + +void X(khc2hc_register)(planner *p, khc2hc codelet, const hc2hc_desc *desc) +{ + X(regsolver_hc2hc_direct)(p, codelet, desc); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/kr2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/kr2c.c new file mode 100644 index 000000000..c0d37b1f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/kr2c.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +void X(kr2c_register)(planner *p, kr2c codelet, const kr2c_desc *desc) +{ + REGISTER_SOLVER(p, X(mksolver_rdft_r2c_direct)(codelet, desc)); + REGISTER_SOLVER(p, X(mksolver_rdft_r2c_directbuf)(codelet, desc)); + REGISTER_SOLVER(p, X(mksolver_rdft2_direct)(codelet, desc)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/kr2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/kr2r.c new file mode 100644 index 000000000..42835c486 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/kr2r.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +void X(kr2r_register)(planner *p, kr2r codelet, const kr2r_desc *desc) +{ + REGISTER_SOLVER(p, X(mksolver_rdft_r2r_direct)(codelet, desc)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/nop.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/nop.c new file mode 100644 index 000000000..e4f803402 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/nop.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for vrank -infty RDFTs (nothing to do) */ + +#include "rdft/rdft.h" + +static void apply(const plan *ego_, R *I, R *O) +{ + UNUSED(ego_); + UNUSED(I); + UNUSED(O); +} + +static int applicable(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + return 0 + /* case 1 : -infty vector rank */ + || (p->vecsz->rnk == RNK_MINFTY) + + /* case 2 : rank-0 in-place rdft */ + || (1 + && p->sz->rnk == 0 + && FINITE_RNK(p->vecsz->rnk) + && p->O == p->I + && X(tensor_inplace_strides)(p->vecsz) + ); +} + +static void print(const plan *ego, printer *p) +{ + UNUSED(ego); + p->print(p, "(rdft-nop)"); +} + +static plan *mkplan(const solver *ego, const problem *p, planner *plnr) +{ + static const plan_adt padt = { + X(rdft_solve), X(null_awake), print, X(plan_null_destroy) + }; + plan_rdft *pln; + + UNUSED(plnr); + + if (!applicable(ego, p)) + return (plan *) 0; + pln = MKPLAN_RDFT(plan_rdft, &padt, apply); + X(ops_zero)(&pln->super.ops); + + return &(pln->super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + return MKSOLVER(solver, &sadt); +} + +void X(rdft_nop_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/nop2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/nop2.c new file mode 100644 index 000000000..676588b6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/nop2.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for vrank -infty RDFT2s (nothing to do), as well as in-place + rank-0 HC2R. Note that in-place rank-0 R2HC is *not* a no-op, because + we have to set the imaginary parts of the output to zero. */ + +#include "rdft/rdft.h" + +static void apply(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + UNUSED(ego_); + UNUSED(r0); + UNUSED(r1); + UNUSED(cr); + UNUSED(ci); +} + +static int applicable(const solver *ego_, const problem *p_) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + UNUSED(ego_); + + return(0 + /* case 1 : -infty vector rank */ + || (p->vecsz->rnk == RNK_MINFTY) + + /* case 2 : rank-0 in-place rdft, except that + R2HC is not a no-op because it sets the imaginary + part to 0 */ + || (1 + && p->kind != R2HC + && p->sz->rnk == 0 + && FINITE_RNK(p->vecsz->rnk) + && (p->r0 == p->cr) + && X(rdft2_inplace_strides)(p, RNK_MINFTY) + )); +} + +static void print(const plan *ego, printer *p) +{ + UNUSED(ego); + p->print(p, "(rdft2-nop)"); +} + +static plan *mkplan(const solver *ego, const problem *p, planner *plnr) +{ + static const plan_adt padt = { + X(rdft2_solve), X(null_awake), print, X(plan_null_destroy) + }; + plan_rdft2 *pln; + + UNUSED(plnr); + + if (!applicable(ego, p)) + return (plan *) 0; + pln = MKPLAN_RDFT2(plan_rdft2, &padt, apply); + X(ops_zero)(&pln->super.ops); + + return &(pln->super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + return MKSOLVER(solver, &sadt); +} + +void X(rdft2_nop_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/plan.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/plan.c new file mode 100644 index 000000000..9a6781818 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/plan.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +plan *X(mkplan_rdft)(size_t size, const plan_adt *adt, rdftapply apply) +{ + plan_rdft *ego; + + ego = (plan_rdft *) X(mkplan)(size, adt); + ego->apply = apply; + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/plan2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/plan2.c new file mode 100644 index 000000000..f97c646e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/plan2.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +plan *X(mkplan_rdft2)(size_t size, const plan_adt *adt, rdft2apply apply) +{ + plan_rdft2 *ego; + + ego = (plan_rdft2 *) X(mkplan)(size, adt); + ego->apply = apply; + + return &(ego->super); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/problem.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/problem.c new file mode 100644 index 000000000..a10db0348 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/problem.c @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" +#include + +static void destroy(problem *ego_) +{ + problem_rdft *ego = (problem_rdft *) ego_; +#if !defined(STRUCT_HACK_C99) && !defined(STRUCT_HACK_KR) + X(ifree0)(ego->kind); +#endif + X(tensor_destroy2)(ego->vecsz, ego->sz); + X(ifree)(ego_); +} + +static void kind_hash(md5 *m, const rdft_kind *kind, int rnk) +{ + int i; + for (i = 0; i < rnk; ++i) + X(md5int)(m, kind[i]); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_rdft *p = (const problem_rdft *) p_; + X(md5puts)(m, "rdft"); + X(md5int)(m, p->I == p->O); + kind_hash(m, p->kind, p->sz->rnk); + X(md5int)(m, X(ialignment_of)(p->I)); + X(md5int)(m, X(ialignment_of)(p->O)); + X(tensor_md5)(m, p->sz); + X(tensor_md5)(m, p->vecsz); +} + +static void recur(const iodim *dims, int rnk, R *I) +{ + if (rnk == RNK_MINFTY) + return; + else if (rnk == 0) + I[0] = K(0.0); + else if (rnk > 0) { + INT i, n = dims[0].n, is = dims[0].is; + + if (rnk == 1) { + /* this case is redundant but faster */ + for (i = 0; i < n; ++i) + I[i * is] = K(0.0); + } else { + for (i = 0; i < n; ++i) + recur(dims + 1, rnk - 1, I + i * is); + } + } +} + +void X(rdft_zerotens)(tensor *sz, R *I) +{ + recur(sz->dims, sz->rnk, I); +} + +#define KSTR_LEN 8 + +const char *X(rdft_kind_str)(rdft_kind kind) +{ + static const char kstr[][KSTR_LEN] = { + "r2hc", "r2hc01", "r2hc10", "r2hc11", + "hc2r", "hc2r01", "hc2r10", "hc2r11", + "dht", + "redft00", "redft01", "redft10", "redft11", + "rodft00", "rodft01", "rodft10", "rodft11" + }; + A(kind >= 0 && kind < sizeof(kstr) / KSTR_LEN); + return kstr[kind]; +} + +static void print(const problem *ego_, printer *p) +{ + const problem_rdft *ego = (const problem_rdft *) ego_; + int i; + p->print(p, "(rdft %d %D %T %T", + X(ialignment_of)(ego->I), + (INT)(ego->O - ego->I), + ego->sz, + ego->vecsz); + for (i = 0; i < ego->sz->rnk; ++i) + p->print(p, " %d", (int)ego->kind[i]); + p->print(p, ")"); +} + +static void zero(const problem *ego_) +{ + const problem_rdft *ego = (const problem_rdft *) ego_; + tensor *sz = X(tensor_append)(ego->vecsz, ego->sz); + X(rdft_zerotens)(sz, UNTAINT(ego->I)); + X(tensor_destroy)(sz); +} + +static const problem_adt padt = +{ + PROBLEM_RDFT, + hash, + zero, + print, + destroy +}; + +/* Dimensions of size 1 that are not REDFT/RODFT are no-ops and can be + eliminated. REDFT/RODFT unit dimensions often have factors of 2.0 + and suchlike from normalization and phases, although in principle + these constant factors from different dimensions could be combined. */ +static int nontrivial(const iodim *d, rdft_kind kind) +{ + return (d->n > 1 || kind == R2HC11 || kind == HC2R11 + || (REODFT_KINDP(kind) && kind != REDFT01 && kind != RODFT01)); +} + +problem *X(mkproblem_rdft)(const tensor *sz, const tensor *vecsz, + R *I, R *O, const rdft_kind *kind) +{ + problem_rdft *ego; + int rnk = sz->rnk; + int i; + + A(X(tensor_kosherp)(sz)); + A(X(tensor_kosherp)(vecsz)); + A(FINITE_RNK(sz->rnk)); + + if (UNTAINT(I) == UNTAINT(O)) + I = O = JOIN_TAINT(I, O); + + if (I == O && !X(tensor_inplace_locations)(sz, vecsz)) + return X(mkproblem_unsolvable)(); + + for (i = rnk = 0; i < sz->rnk; ++i) { + A(sz->dims[i].n > 0); + if (nontrivial(sz->dims + i, kind[i])) + ++rnk; + } + +#if defined(STRUCT_HACK_KR) + ego = (problem_rdft *) X(mkproblem)(sizeof(problem_rdft) + + sizeof(rdft_kind) + * (rnk > 0 ? rnk - 1u : 0u), &padt); +#elif defined(STRUCT_HACK_C99) + ego = (problem_rdft *) X(mkproblem)(sizeof(problem_rdft) + + sizeof(rdft_kind) * (unsigned)rnk, &padt); +#else + ego = (problem_rdft *) X(mkproblem)(sizeof(problem_rdft), &padt); + ego->kind = (rdft_kind *) MALLOC(sizeof(rdft_kind) * (unsigned)rnk, PROBLEMS); +#endif + + /* do compression and sorting as in X(tensor_compress), but take + transform kind into account (sigh) */ + ego->sz = X(mktensor)(rnk); + for (i = rnk = 0; i < sz->rnk; ++i) { + if (nontrivial(sz->dims + i, kind[i])) { + ego->kind[rnk] = kind[i]; + ego->sz->dims[rnk++] = sz->dims[i]; + } + } + for (i = 0; i + 1 < rnk; ++i) { + int j; + for (j = i + 1; j < rnk; ++j) + if (X(dimcmp)(ego->sz->dims + i, ego->sz->dims + j) > 0) { + iodim dswap; + rdft_kind kswap; + dswap = ego->sz->dims[i]; + ego->sz->dims[i] = ego->sz->dims[j]; + ego->sz->dims[j] = dswap; + kswap = ego->kind[i]; + ego->kind[i] = ego->kind[j]; + ego->kind[j] = kswap; + } + } + + for (i = 0; i < rnk; ++i) + if (ego->sz->dims[i].n == 2 && (ego->kind[i] == REDFT00 + || ego->kind[i] == DHT + || ego->kind[i] == HC2R)) + ego->kind[i] = R2HC; /* size-2 transforms are equivalent */ + + ego->vecsz = X(tensor_compress_contiguous)(vecsz); + ego->I = I; + ego->O = O; + + A(FINITE_RNK(ego->sz->rnk)); + + return &(ego->super); +} + +/* Same as X(mkproblem_rdft), but also destroy input tensors. */ +problem *X(mkproblem_rdft_d)(tensor *sz, tensor *vecsz, + R *I, R *O, const rdft_kind *kind) +{ + problem *p = X(mkproblem_rdft)(sz, vecsz, I, O, kind); + X(tensor_destroy2)(vecsz, sz); + return p; +} + +/* As above, but for rnk <= 1 only and takes a scalar kind parameter */ +problem *X(mkproblem_rdft_1)(const tensor *sz, const tensor *vecsz, + R *I, R *O, rdft_kind kind) +{ + A(sz->rnk <= 1); + return X(mkproblem_rdft)(sz, vecsz, I, O, &kind); +} + +problem *X(mkproblem_rdft_1_d)(tensor *sz, tensor *vecsz, + R *I, R *O, rdft_kind kind) +{ + A(sz->rnk <= 1); + return X(mkproblem_rdft_d)(sz, vecsz, I, O, &kind); +} + +/* create a zero-dimensional problem */ +problem *X(mkproblem_rdft_0_d)(tensor *vecsz, R *I, R *O) +{ + return X(mkproblem_rdft_d)(X(mktensor_0d)(), vecsz, I, O, + (const rdft_kind *)0); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/problem2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/problem2.c new file mode 100644 index 000000000..a14452588 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/problem2.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "dft/dft.h" +#include "rdft/rdft.h" +#include + +static void destroy(problem *ego_) +{ + problem_rdft2 *ego = (problem_rdft2 *) ego_; + X(tensor_destroy2)(ego->vecsz, ego->sz); + X(ifree)(ego_); +} + +static void hash(const problem *p_, md5 *m) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + X(md5puts)(m, "rdft2"); + X(md5int)(m, p->r0 == p->cr); + X(md5INT)(m, p->r1 - p->r0); + X(md5INT)(m, p->ci - p->cr); + X(md5int)(m, X(ialignment_of)(p->r0)); + X(md5int)(m, X(ialignment_of)(p->r1)); + X(md5int)(m, X(ialignment_of)(p->cr)); + X(md5int)(m, X(ialignment_of)(p->ci)); + X(md5int)(m, p->kind); + X(tensor_md5)(m, p->sz); + X(tensor_md5)(m, p->vecsz); +} + +static void print(const problem *ego_, printer *p) +{ + const problem_rdft2 *ego = (const problem_rdft2 *) ego_; + p->print(p, "(rdft2 %d %d %T %T)", + (int)(ego->cr == ego->r0), + (int)(ego->kind), + ego->sz, + ego->vecsz); +} + +static void recur(const iodim *dims, int rnk, R *I0, R *I1) +{ + if (rnk == RNK_MINFTY) + return; + else if (rnk == 0) + I0[0] = K(0.0); + else if (rnk > 0) { + INT i, n = dims[0].n, is = dims[0].is; + + if (rnk == 1) { + for (i = 0; i < n - 1; i += 2) { + *I0 = *I1 = K(0.0); + I0 += is; I1 += is; + } + if (i < n) + *I0 = K(0.0); + } else { + for (i = 0; i < n; ++i) + recur(dims + 1, rnk - 1, I0 + i * is, I1 + i * is); + } + } +} + +static void vrecur(const iodim *vdims, int vrnk, + const iodim *dims, int rnk, R *I0, R *I1) +{ + if (vrnk == RNK_MINFTY) + return; + else if (vrnk == 0) + recur(dims, rnk, I0, I1); + else if (vrnk > 0) { + INT i, n = vdims[0].n, is = vdims[0].is; + + for (i = 0; i < n; ++i) + vrecur(vdims + 1, vrnk - 1, + dims, rnk, I0 + i * is, I1 + i * is); + } +} + +INT X(rdft2_complex_n)(INT real_n, rdft_kind kind) +{ + switch (kind) { + case R2HC: + case HC2R: + return (real_n / 2) + 1; + case R2HCII: + case HC2RIII: + return (real_n + 1) / 2; + default: + /* can't happen */ + A(0); + return 0; + } +} + +static void zero(const problem *ego_) +{ + const problem_rdft2 *ego = (const problem_rdft2 *) ego_; + if (R2HC_KINDP(ego->kind)) { + /* FIXME: can we avoid the double recursion somehow? */ + vrecur(ego->vecsz->dims, ego->vecsz->rnk, + ego->sz->dims, ego->sz->rnk, + UNTAINT(ego->r0), UNTAINT(ego->r1)); + } else { + tensor *sz; + tensor *sz2 = X(tensor_copy)(ego->sz); + int rnk = sz2->rnk; + if (rnk > 0) /* ~half as many complex outputs */ + sz2->dims[rnk-1].n = + X(rdft2_complex_n)(sz2->dims[rnk-1].n, ego->kind); + sz = X(tensor_append)(ego->vecsz, sz2); + X(tensor_destroy)(sz2); + X(dft_zerotens)(sz, UNTAINT(ego->cr), UNTAINT(ego->ci)); + X(tensor_destroy)(sz); + } +} + +static const problem_adt padt = +{ + PROBLEM_RDFT2, + hash, + zero, + print, + destroy +}; + +problem *X(mkproblem_rdft2)(const tensor *sz, const tensor *vecsz, + R *r0, R *r1, R *cr, R *ci, + rdft_kind kind) +{ + problem_rdft2 *ego; + + A(kind == R2HC || kind == R2HCII || kind == HC2R || kind == HC2RIII); + A(X(tensor_kosherp)(sz)); + A(X(tensor_kosherp)(vecsz)); + A(FINITE_RNK(sz->rnk)); + + /* require in-place problems to use r0 == cr */ + if (UNTAINT(r0) == UNTAINT(ci)) + return X(mkproblem_unsolvable)(); + + /* FIXME: should check UNTAINT(r1) == UNTAINT(cr) but + only if odd elements exist, which requires compressing the + tensors first */ + + if (UNTAINT(r0) == UNTAINT(cr)) + r0 = cr = JOIN_TAINT(r0, cr); + + ego = (problem_rdft2 *)X(mkproblem)(sizeof(problem_rdft2), &padt); + + if (sz->rnk > 1) { /* have to compress rnk-1 dims separately, ugh */ + tensor *szc = X(tensor_copy_except)(sz, sz->rnk - 1); + tensor *szr = X(tensor_copy_sub)(sz, sz->rnk - 1, 1); + tensor *szcc = X(tensor_compress)(szc); + if (szcc->rnk > 0) + ego->sz = X(tensor_append)(szcc, szr); + else + ego->sz = X(tensor_compress)(szr); + X(tensor_destroy2)(szc, szr); X(tensor_destroy)(szcc); + } else { + ego->sz = X(tensor_compress)(sz); + } + ego->vecsz = X(tensor_compress_contiguous)(vecsz); + ego->r0 = r0; + ego->r1 = r1; + ego->cr = cr; + ego->ci = ci; + ego->kind = kind; + + A(FINITE_RNK(ego->sz->rnk)); + return &(ego->super); + +} + +/* Same as X(mkproblem_rdft2), but also destroy input tensors. */ +problem *X(mkproblem_rdft2_d)(tensor *sz, tensor *vecsz, + R *r0, R *r1, R *cr, R *ci, rdft_kind kind) +{ + problem *p = X(mkproblem_rdft2)(sz, vecsz, r0, r1, cr, ci, kind); + X(tensor_destroy2)(vecsz, sz); + return p; +} + +/* Same as X(mkproblem_rdft2_d), but with only one R pointer. + Used by the API. */ +problem *X(mkproblem_rdft2_d_3pointers)(tensor *sz, tensor *vecsz, + R *r0, R *cr, R *ci, rdft_kind kind) +{ + problem *p; + int rnk = sz->rnk; + R *r1; + + if (rnk == 0) + r1 = r0; + else if (R2HC_KINDP(kind)) { + r1 = r0 + sz->dims[rnk-1].is; + sz->dims[rnk-1].is *= 2; + } else { + r1 = r0 + sz->dims[rnk-1].os; + sz->dims[rnk-1].os *= 2; + } + + p = X(mkproblem_rdft2)(sz, vecsz, r0, r1, cr, ci, kind); + X(tensor_destroy2)(vecsz, sz); + return p; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank-geq2-rdft2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank-geq2-rdft2.c new file mode 100644 index 000000000..dde1b3d6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank-geq2-rdft2.c @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for RDFT2 of rank >= 2 (multidimensional) */ + +#include "rdft/rdft.h" +#include "dft/dft.h" + +typedef struct { + solver super; + int spltrnk; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_dft super; + plan *cldr, *cldc; + const S *solver; +} P; + +static void apply_r2hc(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + + { + plan_rdft2 *cldr = (plan_rdft2 *) ego->cldr; + cldr->apply((plan *) cldr, r0, r1, cr, ci); + } + + { + plan_dft *cldc = (plan_dft *) ego->cldc; + cldc->apply((plan *) cldc, cr, ci, cr, ci); + } +} + +static void apply_hc2r(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + + { + plan_dft *cldc = (plan_dft *) ego->cldc; + cldc->apply((plan *) cldc, ci, cr, ci, cr); + } + + { + plan_rdft2 *cldr = (plan_rdft2 *) ego->cldr; + cldr->apply((plan *) cldr, r0, r1, cr, ci); + } + +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cldr, wakefulness); + X(plan_awake)(ego->cldc, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldr); + X(plan_destroy_internal)(ego->cldc); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + p->print(p, "(rdft2-rank>=2/%d%(%p%)%(%p%))", + s->spltrnk, ego->cldr, ego->cldc); +} + +static int picksplit(const S *ego, const tensor *sz, int *rp) +{ + A(sz->rnk > 1); /* cannot split rnk <= 1 */ + if (!X(pickdim)(ego->spltrnk, ego->buddies, ego->nbuddies, sz, 1, rp)) + return 0; + *rp += 1; /* convert from dim. index to rank */ + if (*rp >= sz->rnk) /* split must reduce rank */ + return 0; + return 1; +} + +static int applicable0(const solver *ego_, const problem *p_, int *rp, + const planner *plnr) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + const S *ego = (const S *)ego_; + return (1 + && FINITE_RNK(p->sz->rnk) && FINITE_RNK(p->vecsz->rnk) + + /* FIXME: multidimensional R2HCII ? */ + && (p->kind == R2HC || p->kind == HC2R) + + && p->sz->rnk >= 2 + && picksplit(ego, p->sz, rp) + && (0 + + /* can work out-of-place, but HC2R destroys input */ + || (p->r0 != p->cr && + (p->kind == R2HC || !NO_DESTROY_INPUTP(plnr))) + + /* FIXME: what are sufficient conditions for inplace? */ + || (p->r0 == p->cr)) + ); +} + +/* TODO: revise this. */ +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *rp) +{ + const S *ego = (const S *)ego_; + + if (!applicable0(ego_, p_, rp, plnr)) return 0; + + if (NO_RANK_SPLITSP(plnr) && (ego->spltrnk != ego->buddies[0])) + return 0; + + if (NO_UGLYP(plnr)) { + const problem_rdft2 *p = (const problem_rdft2 *) p_; + + /* Heuristic: if the vector stride is greater than the transform + size, don't use (prefer to do the vector loop first with a + vrank-geq1 plan). */ + if (p->vecsz->rnk > 0 && + X(tensor_min_stride)(p->vecsz) + > X(rdft2_tensor_max_index)(p->sz, p->kind)) + return 0; + } + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft2 *p; + P *pln; + plan *cldr = 0, *cldc = 0; + tensor *sz1, *sz2, *vecszi, *sz2i; + int spltrnk; + inplace_kind k; + problem *cldp; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &spltrnk)) + return (plan *) 0; + + p = (const problem_rdft2 *) p_; + X(tensor_split)(p->sz, &sz1, spltrnk, &sz2); + + k = p->kind == R2HC ? INPLACE_OS : INPLACE_IS; + vecszi = X(tensor_copy_inplace)(p->vecsz, k); + sz2i = X(tensor_copy_inplace)(sz2, k); + + /* complex data is ~half of real */ + sz2i->dims[sz2i->rnk - 1].n = sz2i->dims[sz2i->rnk - 1].n/2 + 1; + + cldr = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)(X(tensor_copy)(sz2), + X(tensor_append)(p->vecsz, sz1), + p->r0, p->r1, + p->cr, p->ci, p->kind)); + if (!cldr) goto nada; + + if (p->kind == R2HC) + cldp = X(mkproblem_dft_d)(X(tensor_copy_inplace)(sz1, k), + X(tensor_append)(vecszi, sz2i), + p->cr, p->ci, p->cr, p->ci); + else /* HC2R must swap re/im parts to get IDFT */ + cldp = X(mkproblem_dft_d)(X(tensor_copy_inplace)(sz1, k), + X(tensor_append)(vecszi, sz2i), + p->ci, p->cr, p->ci, p->cr); + cldc = X(mkplan_d)(plnr, cldp); + if (!cldc) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, p->kind == R2HC ? apply_r2hc : apply_hc2r); + + pln->cldr = cldr; + pln->cldc = cldc; + + pln->solver = ego; + X(ops_add)(&cldr->ops, &cldc->ops, &pln->super.super.ops); + + X(tensor_destroy4)(sz2i, vecszi, sz2, sz1); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cldr); + X(plan_destroy_internal)(cldc); + X(tensor_destroy4)(sz2i, vecszi, sz2, sz1); + return (plan *) 0; +} + +static solver *mksolver(int spltrnk, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->spltrnk = spltrnk; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(rdft2_rank_geq2_register)(planner *p) +{ + static const int buddies[] = { 1, 0, -2 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); + + /* FIXME: Should we try more buddies? See also dft/rank-geq2. */ +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank-geq2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank-geq2.c new file mode 100644 index 000000000..c09dad9f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank-geq2.c @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for RDFT of rank >= 2 (multidimensional) */ + +/* FIXME: this solver cannot strictly be applied to multidimensional + DHTs, since the latter are not separable...up to rnk-1 additional + post-processing passes may be required. See also: + + R. N. Bracewell, O. Buneman, H. Hao, and J. Villasenor, "Fast + two-dimensional Hartley transform," Proc. IEEE 74, 1282-1283 (1986). + + H. Hao and R. N. Bracewell, "A three-dimensional DFT algorithm + using the fast Hartley transform," Proc. IEEE 75(2), 264-266 (1987). +*/ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + int spltrnk; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_rdft super; + + plan *cld1, *cld2; + const S *solver; +} P; + +/* Compute multi-dimensional RDFT by applying the two cld plans + (lower-rnk RDFTs). */ +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld1, *cld2; + + cld1 = (plan_rdft *) ego->cld1; + cld1->apply(ego->cld1, I, O); + + cld2 = (plan_rdft *) ego->cld2; + cld2->apply(ego->cld2, O, O); +} + + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + p->print(p, "(rdft-rank>=2/%d%(%p%)%(%p%))", + s->spltrnk, ego->cld1, ego->cld2); +} + +static int picksplit(const S *ego, const tensor *sz, int *rp) +{ + A(sz->rnk > 1); /* cannot split rnk <= 1 */ + if (!X(pickdim)(ego->spltrnk, ego->buddies, ego->nbuddies, sz, 1, rp)) + return 0; + *rp += 1; /* convert from dim. index to rank */ + if (*rp >= sz->rnk) /* split must reduce rank */ + return 0; + return 1; +} + +static int applicable0(const solver *ego_, const problem *p_, int *rp) +{ + const problem_rdft *p = (const problem_rdft *) p_; + const S *ego = (const S *)ego_; + return (1 + && FINITE_RNK(p->sz->rnk) && FINITE_RNK(p->vecsz->rnk) + && p->sz->rnk >= 2 + && picksplit(ego, p->sz, rp) + ); +} + +/* TODO: revise this. */ +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *rp) +{ + const S *ego = (const S *)ego_; + + if (!applicable0(ego_, p_, rp)) return 0; + + if (NO_RANK_SPLITSP(plnr) && (ego->spltrnk != ego->buddies[0])) + return 0; + + if (NO_UGLYP(plnr)) { + /* Heuristic: if the vector stride is greater than the transform + sz, don't use (prefer to do the vector loop first with a + vrank-geq1 plan). */ + const problem_rdft *p = (const problem_rdft *) p_; + + if (p->vecsz->rnk > 0 && + X(tensor_min_stride)(p->vecsz) > X(tensor_max_index)(p->sz)) + return 0; + } + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p; + P *pln; + plan *cld1 = 0, *cld2 = 0; + tensor *sz1, *sz2, *vecszi, *sz2i; + int spltrnk; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &spltrnk)) + return (plan *) 0; + + p = (const problem_rdft *) p_; + X(tensor_split)(p->sz, &sz1, spltrnk, &sz2); + vecszi = X(tensor_copy_inplace)(p->vecsz, INPLACE_OS); + sz2i = X(tensor_copy_inplace)(sz2, INPLACE_OS); + + cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)(X(tensor_copy)(sz2), + X(tensor_append)(p->vecsz, sz1), + p->I, p->O, p->kind + spltrnk)); + if (!cld1) goto nada; + + cld2 = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(tensor_copy_inplace)(sz1, INPLACE_OS), + X(tensor_append)(vecszi, sz2i), + p->O, p->O, p->kind)); + if (!cld2) goto nada; + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->cld1 = cld1; + pln->cld2 = cld2; + + pln->solver = ego; + X(ops_add)(&cld1->ops, &cld2->ops, &pln->super.super.ops); + + X(tensor_destroy4)(sz2, sz1, vecszi, sz2i); + + return &(pln->super.super); + + nada: + X(plan_destroy_internal)(cld2); + X(plan_destroy_internal)(cld1); + X(tensor_destroy4)(sz2, sz1, vecszi, sz2i); + return (plan *) 0; +} + +static solver *mksolver(int spltrnk, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->spltrnk = spltrnk; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(rdft_rank_geq2_register)(planner *p) +{ + static const int buddies[] = { 1, 0, -2 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); + + /* FIXME: Should we try more buddies? See also dft/rank-geq2. */ +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank0-rdft2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank0-rdft2.c new file mode 100644 index 000000000..c5ebee754 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank0-rdft2.c @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for rank-0 RDFT2 (copy operations, plus setting 0 imag. parts) */ + +#include "rdft/rdft.h" + +#ifdef HAVE_STRING_H +#include /* for memcpy() */ +#endif + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + INT vl; + INT ivs, ovs; + plan *cldcpy; +} P; + +static int applicable(const problem *p_) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + return (1 + && p->sz->rnk == 0 + && (p->kind == HC2R + || + (1 + && p->kind == R2HC + + && p->vecsz->rnk <= 1 + + && ((p->r0 != p->cr) + || + X(rdft2_inplace_strides)(p, RNK_MINFTY)) )) + ); +} + +static void apply_r2hc(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + INT i, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + + UNUSED(r1); /* rank-0 has no real odd-index elements */ + + for (i = 4; i <= vl; i += 4) { + R x0, x1, x2, x3; + x0 = *r0; r0 += ivs; + x1 = *r0; r0 += ivs; + x2 = *r0; r0 += ivs; + x3 = *r0; r0 += ivs; + *cr = x0; cr += ovs; + *ci = K(0.0); ci += ovs; + *cr = x1; cr += ovs; + *ci = K(0.0); ci += ovs; + *cr = x2; cr += ovs; + *ci = K(0.0); ci += ovs; + *cr = x3; cr += ovs; + *ci = K(0.0); ci += ovs; + } + for (; i < vl + 4; ++i) { + R x0; + x0 = *r0; r0 += ivs; + *cr = x0; cr += ovs; + *ci = K(0.0); ci += ovs; + } +} + +/* in-place r2hc rank-0: set imaginary parts of output to 0 */ +static void apply_r2hc_inplace(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + INT i, vl = ego->vl; + INT ovs = ego->ovs; + + UNUSED(r0); UNUSED(r1); UNUSED(cr); + + for (i = 4; i <= vl; i += 4) { + *ci = K(0.0); ci += ovs; + *ci = K(0.0); ci += ovs; + *ci = K(0.0); ci += ovs; + *ci = K(0.0); ci += ovs; + } + for (; i < vl + 4; ++i) { + *ci = K(0.0); ci += ovs; + } +} + +/* a rank-0 HC2R rdft2 problem is just a copy from cr to r0, + so we can use a rank-0 rdft plan */ +static void apply_hc2r(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + UNUSED(ci); + UNUSED(r1); + cldcpy->apply((plan *) cldcpy, cr, r0); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + if (ego->cldcpy) + X(plan_awake)(ego->cldcpy, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + if (ego->cldcpy) + X(plan_destroy_internal)(ego->cldcpy); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + if (ego->cldcpy) + p->print(p, "(rdft2-hc2r-rank0%(%p%))", ego->cldcpy); + else + p->print(p, "(rdft2-r2hc-rank0%v)", ego->vl); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const problem_rdft2 *p; + plan *cldcpy = (plan *) 0; + P *pln; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + UNUSED(ego_); + + if (!applicable(p_)) + return (plan *) 0; + + p = (const problem_rdft2 *) p_; + + if (p->kind == HC2R) { + cldcpy = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(tensor_copy)(p->vecsz), + p->cr, p->r0)); + if (!cldcpy) return (plan *) 0; + } + + pln = MKPLAN_RDFT2(P, &padt, + p->kind == R2HC ? + (p->r0 == p->cr ? apply_r2hc_inplace : apply_r2hc) + : apply_hc2r); + + if (p->kind == R2HC) + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + pln->cldcpy = cldcpy; + + if (p->kind == R2HC) { + /* vl loads, 2*vl stores */ + X(ops_other)(3 * pln->vl, &pln->super.super.ops); + } + else { + pln->super.super.ops = cldcpy->ops; + } + + return &(pln->super.super); +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(rdft2_rank0_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank0.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank0.c new file mode 100644 index 000000000..f9feb235b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rank0.c @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* plans for rank-0 RDFTs (copy operations) */ + +#include "rdft/rdft.h" + +#ifdef HAVE_STRING_H +#include /* for memcpy() */ +#endif + +#define MAXRNK 32 /* FIXME: should malloc() */ + +typedef struct { + plan_rdft super; + INT vl; + int rnk; + iodim d[MAXRNK]; + const char *nam; +} P; + +typedef struct { + solver super; + rdftapply apply; + int (*applicable)(const P *pln, const problem_rdft *p); + const char *nam; +} S; + +/* copy up to MAXRNK dimensions from problem into plan. If a + contiguous dimension exists, save its length in pln->vl */ +static int fill_iodim(P *pln, const problem_rdft *p) +{ + int i; + const tensor *vecsz = p->vecsz; + + pln->vl = 1; + pln->rnk = 0; + for (i = 0; i < vecsz->rnk; ++i) { + /* extract contiguous dimensions */ + if (pln->vl == 1 && + vecsz->dims[i].is == 1 && vecsz->dims[i].os == 1) + pln->vl = vecsz->dims[i].n; + else if (pln->rnk == MAXRNK) + return 0; + else + pln->d[pln->rnk++] = vecsz->dims[i]; + } + + return 1; +} + +/* generic higher-rank copy routine, calls cpy2d() to do the real work */ +static void copy(const iodim *d, int rnk, INT vl, + R *I, R *O, + cpy2d_func cpy2d) +{ + A(rnk >= 2); + if (rnk == 2) + cpy2d(I, O, d[0].n, d[0].is, d[0].os, d[1].n, d[1].is, d[1].os, vl); + else { + INT i; + for (i = 0; i < d[0].n; ++i, I += d[0].is, O += d[0].os) + copy(d + 1, rnk - 1, vl, I, O, cpy2d); + } +} + +/* FIXME: should be more general */ +static int transposep(const P *pln) +{ + int i; + + for (i = 0; i < pln->rnk - 2; ++i) + if (pln->d[i].is != pln->d[i].os) + return 0; + + return (pln->d[i].n == pln->d[i+1].n && + pln->d[i].is == pln->d[i+1].os && + pln->d[i].os == pln->d[i+1].is); +} + +/* generic higher-rank transpose routine, calls transpose2d() to do + * the real work */ +static void transpose(const iodim *d, int rnk, INT vl, + R *I, + transpose_func transpose2d) +{ + A(rnk >= 2); + if (rnk == 2) + transpose2d(I, d[0].n, d[0].is, d[0].os, vl); + else { + INT i; + for (i = 0; i < d[0].n; ++i, I += d[0].is) + transpose(d + 1, rnk - 1, vl, I, transpose2d); + } +} + +/**************************************************************/ +/* rank 0,1,2, out of place, iterative */ +static void apply_iter(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + + switch (ego->rnk) { + case 0: + X(cpy1d)(I, O, ego->vl, 1, 1, 1); + break; + case 1: + X(cpy1d)(I, O, + ego->d[0].n, ego->d[0].is, ego->d[0].os, + ego->vl); + break; + default: + copy(ego->d, ego->rnk, ego->vl, I, O, X(cpy2d_ci)); + break; + } +} + +static int applicable_iter(const P *pln, const problem_rdft *p) +{ + UNUSED(pln); + return (p->I != p->O); +} + +/**************************************************************/ +/* out of place, write contiguous output */ +static void apply_cpy2dco(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + copy(ego->d, ego->rnk, ego->vl, I, O, X(cpy2d_co)); +} + +static int applicable_cpy2dco(const P *pln, const problem_rdft *p) +{ + int rnk = pln->rnk; + return (1 + && p->I != p->O + && rnk >= 2 + + /* must not duplicate apply_iter */ + && (X(iabs)(pln->d[rnk - 2].is) <= X(iabs)(pln->d[rnk - 1].is) + || + X(iabs)(pln->d[rnk - 2].os) <= X(iabs)(pln->d[rnk - 1].os)) + ); +} + +/**************************************************************/ +/* out of place, tiled, no buffering */ +static void apply_tiled(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + copy(ego->d, ego->rnk, ego->vl, I, O, X(cpy2d_tiled)); +} + +static int applicable_tiled(const P *pln, const problem_rdft *p) +{ + return (1 + && p->I != p->O + && pln->rnk >= 2 + + /* somewhat arbitrary */ + && X(compute_tilesz)(pln->vl, 1) > 4 + ); +} + +/**************************************************************/ +/* out of place, tiled, with buffer */ +static void apply_tiledbuf(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + copy(ego->d, ego->rnk, ego->vl, I, O, X(cpy2d_tiledbuf)); +} + +#define applicable_tiledbuf applicable_tiled + +/**************************************************************/ +/* rank 0, out of place, using memcpy */ +static void apply_memcpy(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + + A(ego->rnk == 0); + memcpy(O, I, ego->vl * sizeof(R)); +} + +static int applicable_memcpy(const P *pln, const problem_rdft *p) +{ + return (1 + && p->I != p->O + && pln->rnk == 0 + && pln->vl > 2 /* do not bother memcpy-ing complex numbers */ + ); +} + +/**************************************************************/ +/* rank > 0 vecloop, out of place, using memcpy (e.g. out-of-place + transposes of vl-tuples ... for large vl it should be more + efficient to use memcpy than the tiled stuff). */ + +static void memcpy_loop(size_t cpysz, int rnk, const iodim *d, R *I, R *O) +{ + INT i, n = d->n, is = d->is, os = d->os; + if (rnk == 1) + for (i = 0; i < n; ++i, I += is, O += os) + memcpy(O, I, cpysz); + else { + --rnk; ++d; + for (i = 0; i < n; ++i, I += is, O += os) + memcpy_loop(cpysz, rnk, d, I, O); + } +} + +static void apply_memcpy_loop(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + memcpy_loop(ego->vl * sizeof(R), ego->rnk, ego->d, I, O); +} + +static int applicable_memcpy_loop(const P *pln, const problem_rdft *p) +{ + return (p->I != p->O + && pln->rnk > 0 + && pln->vl > 2 /* do not bother memcpy-ing complex numbers */); +} + +/**************************************************************/ +/* rank 2, in place, square transpose, iterative */ +static void apply_ip_sq(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + UNUSED(O); + transpose(ego->d, ego->rnk, ego->vl, I, X(transpose)); +} + + +static int applicable_ip_sq(const P *pln, const problem_rdft *p) +{ + return (1 + && p->I == p->O + && pln->rnk >= 2 + && transposep(pln)); +} + +/**************************************************************/ +/* rank 2, in place, square transpose, tiled */ +static void apply_ip_sq_tiled(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + UNUSED(O); + transpose(ego->d, ego->rnk, ego->vl, I, X(transpose_tiled)); +} + +static int applicable_ip_sq_tiled(const P *pln, const problem_rdft *p) +{ + return (1 + && applicable_ip_sq(pln, p) + + /* somewhat arbitrary */ + && X(compute_tilesz)(pln->vl, 2) > 4 + ); +} + +/**************************************************************/ +/* rank 2, in place, square transpose, tiled, buffered */ +static void apply_ip_sq_tiledbuf(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + UNUSED(O); + transpose(ego->d, ego->rnk, ego->vl, I, X(transpose_tiledbuf)); +} + +#define applicable_ip_sq_tiledbuf applicable_ip_sq_tiled + +/**************************************************************/ +static int applicable(const S *ego, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + P pln; + return (1 + && p->sz->rnk == 0 + && FINITE_RNK(p->vecsz->rnk) + && fill_iodim(&pln, p) + && ego->applicable(&pln, p) + ); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + int i; + p->print(p, "(%s/%D", ego->nam, ego->vl); + for (i = 0; i < ego->rnk; ++i) + p->print(p, "%v", ego->d[i].n); + p->print(p, ")"); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const problem_rdft *p; + const S *ego = (const S *) ego_; + P *pln; + int retval; + + static const plan_adt padt = { + X(rdft_solve), X(null_awake), print, X(plan_null_destroy) + }; + + UNUSED(plnr); + + if (!applicable(ego, p_)) + return (plan *) 0; + + p = (const problem_rdft *) p_; + pln = MKPLAN_RDFT(P, &padt, ego->apply); + + retval = fill_iodim(pln, p); + (void)retval; /* UNUSED unless DEBUG */ + A(retval); + A(pln->vl > 0); /* because FINITE_RNK(p->vecsz->rnk) holds */ + pln->nam = ego->nam; + + /* X(tensor_sz)(p->vecsz) loads, X(tensor_sz)(p->vecsz) stores */ + X(ops_other)(2 * X(tensor_sz)(p->vecsz), &pln->super.super.ops); + return &(pln->super.super); +} + + +void X(rdft_rank0_register)(planner *p) +{ + unsigned i; + static struct { + rdftapply apply; + int (*applicable)(const P *, const problem_rdft *); + const char *nam; + } tab[] = { + { apply_memcpy, applicable_memcpy, "rdft-rank0-memcpy" }, + { apply_memcpy_loop, applicable_memcpy_loop, + "rdft-rank0-memcpy-loop" }, + { apply_iter, applicable_iter, "rdft-rank0-iter-ci" }, + { apply_cpy2dco, applicable_cpy2dco, "rdft-rank0-iter-co" }, + { apply_tiled, applicable_tiled, "rdft-rank0-tiled" }, + { apply_tiledbuf, applicable_tiledbuf, "rdft-rank0-tiledbuf" }, + { apply_ip_sq, applicable_ip_sq, "rdft-rank0-ip-sq" }, + { + apply_ip_sq_tiled, + applicable_ip_sq_tiled, + "rdft-rank0-ip-sq-tiled" + }, + { + apply_ip_sq_tiledbuf, + applicable_ip_sq_tiledbuf, + "rdft-rank0-ip-sq-tiledbuf" + }, + }; + + for (i = 0; i < sizeof(tab) / sizeof(tab[0]); ++i) { + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->apply = tab[i].apply; + slv->applicable = tab[i].applicable; + slv->nam = tab[i].nam; + REGISTER_SOLVER(p, &(slv->super)); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft-dht.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft-dht.c new file mode 100644 index 000000000..3424fbeab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft-dht.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Solve an R2HC/HC2R problem via post/pre processing of a DHT. This + is mainly useful because we can use Rader to compute DHTs of prime + sizes. It also allows us to express hc2r problems in terms of r2hc + (via dht-r2hc), and to do hc2r problems without destroying the input. */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + INT is, os; + INT n; +} P; + +static void apply_r2hc(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT os; + INT i, n; + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, I, O); + } + + n = ego->n; + os = ego->os; + for (i = 1; i < n - i; ++i) { + E a, b; + a = K(0.5) * O[os * i]; + b = K(0.5) * O[os * (n - i)]; + O[os * i] = a + b; +#if FFT_SIGN == -1 + O[os * (n - i)] = b - a; +#else + O[os * (n - i)] = a - b; +#endif + } +} + +/* hc2r, destroying input as usual */ +static void apply_hc2r(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is; + INT i, n = ego->n; + + for (i = 1; i < n - i; ++i) { + E a, b; + a = I[is * i]; + b = I[is * (n - i)]; +#if FFT_SIGN == -1 + I[is * i] = a - b; + I[is * (n - i)] = a + b; +#else + I[is * i] = a + b; + I[is * (n - i)] = a - b; +#endif + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, I, O); + } +} + +/* hc2r, without destroying input */ +static void apply_hc2r_save(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + + O[0] = I[0]; + for (i = 1; i < n - i; ++i) { + E a, b; + a = I[is * i]; + b = I[is * (n - i)]; +#if FFT_SIGN == -1 + O[os * i] = a - b; + O[os * (n - i)] = a + b; +#else + O[os * i] = a + b; + O[os * (n - i)] = a - b; +#endif + } + if (i == n - i) + O[os * i] = I[is * i]; + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, O, O); + } +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(%s-dht-%D%(%p%))", + ego->super.apply == apply_r2hc ? "r2hc" : "hc2r", + ego->n, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk == 0 + && (p->kind[0] == R2HC || p->kind[0] == HC2R) + + /* hack: size-2 DHT etc. are defined as being equivalent + to size-2 R2HC in problem.c, so we need this to prevent + infinite loops for size 2 in EXHAUSTIVE mode: */ + && p->sz->dims[0].n > 2 + ); +} + +static int applicable(const solver *ego, const problem *p_, + const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p_)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + problem *cldp; + plan *cld; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + if (p->kind[0] == R2HC || !NO_DESTROY_INPUTP(plnr)) + cldp = X(mkproblem_rdft_1)(p->sz, p->vecsz, p->I, p->O, DHT); + else { + tensor *sz = X(tensor_copy_inplace)(p->sz, INPLACE_OS); + cldp = X(mkproblem_rdft_1)(sz, p->vecsz, p->O, p->O, DHT); + X(tensor_destroy)(sz); + } + cld = X(mkplan_d)(plnr, cldp); + if (!cld) return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, p->kind[0] == R2HC ? + apply_r2hc : (NO_DESTROY_INPUTP(plnr) ? + apply_hc2r_save : apply_hc2r)); + pln->n = p->sz->dims[0].n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + + pln->super.super.ops = cld->ops; + pln->super.super.ops.other += 4 * ((pln->n - 1)/2); + pln->super.super.ops.add += 2 * ((pln->n - 1)/2); + if (p->kind[0] == R2HC) + pln->super.super.ops.mul += 2 * ((pln->n - 1)/2); + if (pln->super.apply == apply_hc2r_save) + pln->super.super.ops.other += 2 + (pln->n % 2 ? 0 : 2); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(rdft_dht_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft.h new file mode 100644 index 000000000..4dff775db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft.h @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __RDFT_H__ +#define __RDFT_H__ + +#include "kernel/ifftw.h" +#include "rdft/codelet-rdft.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* problem.c: */ +typedef struct { + problem super; + tensor *sz, *vecsz; + R *I, *O; +#if defined(STRUCT_HACK_KR) + rdft_kind kind[1]; +#elif defined(STRUCT_HACK_C99) + rdft_kind kind[]; +#else + rdft_kind *kind; +#endif +} problem_rdft; + +void X(rdft_zerotens)(tensor *sz, R *I); +problem *X(mkproblem_rdft)(const tensor *sz, const tensor *vecsz, + R *I, R *O, const rdft_kind *kind); +problem *X(mkproblem_rdft_d)(tensor *sz, tensor *vecsz, + R *I, R *O, const rdft_kind *kind); +problem *X(mkproblem_rdft_0_d)(tensor *vecsz, R *I, R *O); +problem *X(mkproblem_rdft_1)(const tensor *sz, const tensor *vecsz, + R *I, R *O, rdft_kind kind); +problem *X(mkproblem_rdft_1_d)(tensor *sz, tensor *vecsz, + R *I, R *O, rdft_kind kind); + +const char *X(rdft_kind_str)(rdft_kind kind); + +/* solve.c: */ +void X(rdft_solve)(const plan *ego_, const problem *p_); + +/* plan.c: */ +typedef void (*rdftapply) (const plan *ego, R *I, R *O); + +typedef struct { + plan super; + rdftapply apply; +} plan_rdft; + +plan *X(mkplan_rdft)(size_t size, const plan_adt *adt, rdftapply apply); + +#define MKPLAN_RDFT(type, adt, apply) \ + (type *)X(mkplan_rdft)(sizeof(type), adt, apply) + +/* various solvers */ + +solver *X(mksolver_rdft_r2c_direct)(kr2c k, const kr2c_desc *desc); +solver *X(mksolver_rdft_r2c_directbuf)(kr2c k, const kr2c_desc *desc); +solver *X(mksolver_rdft_r2r_direct)(kr2r k, const kr2r_desc *desc); + +void X(rdft_rank0_register)(planner *p); +void X(rdft_vrank3_transpose_register)(planner *p); +void X(rdft_rank_geq2_register)(planner *p); +void X(rdft_indirect_register)(planner *p); +void X(rdft_vrank_geq1_register)(planner *p); +void X(rdft_buffered_register)(planner *p); +void X(rdft_generic_register)(planner *p); +void X(rdft_rader_hc2hc_register)(planner *p); +void X(rdft_dht_register)(planner *p); +void X(dht_r2hc_register)(planner *p); +void X(dht_rader_register)(planner *p); +void X(dft_r2hc_register)(planner *p); +void X(rdft_nop_register)(planner *p); +void X(hc2hc_generic_register)(planner *p); + +/****************************************************************************/ +/* problem2.c: */ +/* + An RDFT2 problem transforms a 1d real array r[n] with stride is/os + to/from an "unpacked" complex array {rio,iio}[n/2 + 1] with stride + os/is. R0 points to the first even element of the real array. + R1 points to the first odd element of the real array. + + Strides on the real side of the transform express distances + between consecutive elements of the same array (even or odd). + E.g., for a contiguous input + + R0 R1 R2 R3 ... + + the input stride would be 2, not 1. This convention is necessary + for hc2c codelets to work, since they transpose even/odd with + real/imag. + + Multidimensional transforms use complex DFTs for the + noncontiguous dimensions. vecsz has the usual interpretation. +*/ +typedef struct { + problem super; + tensor *sz; + tensor *vecsz; + R *r0, *r1; + R *cr, *ci; + rdft_kind kind; /* assert(kind < DHT) */ +} problem_rdft2; + +problem *X(mkproblem_rdft2)(const tensor *sz, const tensor *vecsz, + R *r0, R *r1, R *cr, R *ci, rdft_kind kind); +problem *X(mkproblem_rdft2_d)(tensor *sz, tensor *vecsz, + R *r0, R *r1, R *cr, R *ci, rdft_kind kind); +problem *X(mkproblem_rdft2_d_3pointers)(tensor *sz, tensor *vecsz, + R *r, R *cr, R *ci, rdft_kind kind); +int X(rdft2_inplace_strides)(const problem_rdft2 *p, int vdim); +INT X(rdft2_tensor_max_index)(const tensor *sz, rdft_kind k); +void X(rdft2_strides)(rdft_kind kind, const iodim *d, INT *rs, INT *cs); +INT X(rdft2_complex_n)(INT real_n, rdft_kind kind); + +/* verify.c: */ +void X(rdft2_verify)(plan *pln, const problem_rdft2 *p, int rounds); + +/* solve.c: */ +void X(rdft2_solve)(const plan *ego_, const problem *p_); + +/* plan.c: */ +typedef void (*rdft2apply) (const plan *ego, R *r0, R *r1, R *cr, R *ci); + +typedef struct { + plan super; + rdft2apply apply; +} plan_rdft2; + +plan *X(mkplan_rdft2)(size_t size, const plan_adt *adt, rdft2apply apply); + +#define MKPLAN_RDFT2(type, adt, apply) \ + (type *)X(mkplan_rdft2)(sizeof(type), adt, apply) + +/* various solvers */ + +solver *X(mksolver_rdft2_direct)(kr2c k, const kr2c_desc *desc); + +void X(rdft2_vrank_geq1_register)(planner *p); +void X(rdft2_buffered_register)(planner *p); +void X(rdft2_rdft_register)(planner *p); +void X(rdft2_nop_register)(planner *p); +void X(rdft2_rank0_register)(planner *p); +void X(rdft2_rank_geq2_register)(planner *p); + +/****************************************************************************/ + +/* configurations */ +void X(rdft_conf_standard)(planner *p); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* __RDFT_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-inplace-strides.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-inplace-strides.c new file mode 100644 index 000000000..5d1b4e722 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-inplace-strides.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +/* Check if the vecsz/sz strides are consistent with the problem + being in-place for vecsz.dim[vdim], or for all dimensions + if vdim == RNK_MINFTY. We can't just use tensor_inplace_strides + because rdft transforms have the unfortunate property of + differing input and output sizes. This routine is not + exhaustive; we only return 1 for the most common case. */ +int X(rdft2_inplace_strides)(const problem_rdft2 *p, int vdim) +{ + INT N, Nc; + INT rs, cs; + int i; + + for (i = 0; i + 1 < p->sz->rnk; ++i) + if (p->sz->dims[i].is != p->sz->dims[i].os) + return 0; + + if (!FINITE_RNK(p->vecsz->rnk) || p->vecsz->rnk == 0) + return 1; + if (!FINITE_RNK(vdim)) { /* check all vector dimensions */ + for (vdim = 0; vdim < p->vecsz->rnk; ++vdim) + if (!X(rdft2_inplace_strides)(p, vdim)) + return 0; + return 1; + } + + A(vdim < p->vecsz->rnk); + if (p->sz->rnk == 0) + return(p->vecsz->dims[vdim].is == p->vecsz->dims[vdim].os); + + N = X(tensor_sz)(p->sz); + Nc = (N / p->sz->dims[p->sz->rnk-1].n) * + (p->sz->dims[p->sz->rnk-1].n/2 + 1); + X(rdft2_strides)(p->kind, p->sz->dims + p->sz->rnk - 1, &rs, &cs); + + /* the factor of 2 comes from the fact that RS is the stride + of p->r0 and p->r1, which is twice as large as the strides + in the r2r case */ + return(p->vecsz->dims[vdim].is == p->vecsz->dims[vdim].os + && (X(iabs)(2 * p->vecsz->dims[vdim].os) + >= X(imax)(2 * Nc * X(iabs)(cs), N * X(iabs)(rs)))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-rdft.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-rdft.c new file mode 100644 index 000000000..1858858b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-rdft.c @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft2 super; + + plan *cld, *cldrest; + INT n, vl, nbuf, bufdist; + INT cs, ivs, ovs; +} P; + +/***************************************************************************/ + +/* FIXME: have alternate copy functions that push a vector loop inside + the n loops? */ + +/* copy halfcomplex array r (contiguous) to complex (strided) array rio/iio. */ +static void hc2c(INT n, R *r, R *rio, R *iio, INT os) +{ + INT i; + + rio[0] = r[0]; + iio[0] = 0; + + for (i = 1; i + i < n; ++i) { + rio[i * os] = r[i]; + iio[i * os] = r[n - i]; + } + + if (i + i == n) { /* store the Nyquist frequency */ + rio[i * os] = r[i]; + iio[i * os] = K(0.0); + } +} + +/* reverse of hc2c */ +static void c2hc(INT n, R *rio, R *iio, INT is, R *r) +{ + INT i; + + r[0] = rio[0]; + + for (i = 1; i + i < n; ++i) { + r[i] = rio[i * is]; + r[n - i] = iio[i * is]; + } + + if (i + i == n) /* store the Nyquist frequency */ + r[i] = rio[i * is]; +} + +/***************************************************************************/ + +static void apply_r2hc(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld = (plan_rdft *) ego->cld; + INT i, j, vl = ego->vl, nbuf = ego->nbuf, bufdist = ego->bufdist; + INT n = ego->n; + INT ivs = ego->ivs, ovs = ego->ovs, os = ego->cs; + R *bufs = (R *)MALLOC(sizeof(R) * nbuf * bufdist, BUFFERS); + plan_rdft2 *cldrest; + + for (i = nbuf; i <= vl; i += nbuf) { + /* transform to bufs: */ + cld->apply((plan *) cld, r0, bufs); + r0 += ivs * nbuf; r1 += ivs * nbuf; + + /* copy back */ + for (j = 0; j < nbuf; ++j, cr += ovs, ci += ovs) + hc2c(n, bufs + j*bufdist, cr, ci, os); + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_rdft2 *) ego->cldrest; + cldrest->apply((plan *) cldrest, r0, r1, cr, ci); +} + +static void apply_hc2r(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld = (plan_rdft *) ego->cld; + INT i, j, vl = ego->vl, nbuf = ego->nbuf, bufdist = ego->bufdist; + INT n = ego->n; + INT ivs = ego->ivs, ovs = ego->ovs, is = ego->cs; + R *bufs = (R *)MALLOC(sizeof(R) * nbuf * bufdist, BUFFERS); + plan_rdft2 *cldrest; + + for (i = nbuf; i <= vl; i += nbuf) { + /* copy to bufs */ + for (j = 0; j < nbuf; ++j, cr += ivs, ci += ivs) + c2hc(n, cr, ci, is, bufs + j*bufdist); + + /* transform back: */ + cld->apply((plan *) cld, bufs, r0); + r0 += ovs * nbuf; r1 += ovs * nbuf; + } + + X(ifree)(bufs); + + /* Do the remaining transforms, if any: */ + cldrest = (plan_rdft2 *) ego->cldrest; + cldrest->apply((plan *) cldrest, r0, r1, cr, ci); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldrest, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldrest); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rdft2-rdft-%s-%D%v/%D-%D%(%p%)%(%p%))", + ego->super.apply == apply_r2hc ? "r2hc" : "hc2r", + ego->n, ego->nbuf, + ego->vl, ego->bufdist % ego->n, + ego->cld, ego->cldrest); +} + +static INT min_nbuf(const problem_rdft2 *p, INT n, INT vl) +{ + INT is, os, ivs, ovs; + + if (p->r0 != p->cr) + return 1; + if (X(rdft2_inplace_strides(p, RNK_MINFTY))) + return 1; + A(p->vecsz->rnk == 1); /* rank 0 and MINFTY are inplace */ + + X(rdft2_strides)(p->kind, p->sz->dims, &is, &os); + X(rdft2_strides)(p->kind, p->vecsz->dims, &ivs, &ovs); + + /* handle one potentially common case: "contiguous" real and + complex arrays, which overlap because of the differing sizes. */ + if (n * X(iabs)(is) <= X(iabs)(ivs) + && (n/2 + 1) * X(iabs)(os) <= X(iabs)(ovs) + && ( ((p->cr - p->ci) <= X(iabs)(os)) || + ((p->ci - p->cr) <= X(iabs)(os)) ) + && ivs > 0 && ovs > 0) { + INT vsmin = X(imin)(ivs, ovs); + INT vsmax = X(imax)(ivs, ovs); + return(((vsmax - vsmin) * vl + vsmin - 1) / vsmin); + } + + return vl; /* punt: just buffer the whole vector */ +} + +static int applicable0(const problem *p_, const S *ego, const planner *plnr) +{ + const problem_rdft2 *p = (const problem_rdft2 *) p_; + UNUSED(ego); + return(1 + && p->vecsz->rnk <= 1 + && p->sz->rnk == 1 + + /* FIXME: does it make sense to do R2HCII ? */ + && (p->kind == R2HC || p->kind == HC2R) + + /* real strides must allow for reduction to rdft */ + && (2 * (p->r1 - p->r0) == + (((p->kind == R2HC) ? p->sz->dims[0].is : p->sz->dims[0].os))) + + && !(X(toobig)(p->sz->dims[0].n) && CONSERVE_MEMORYP(plnr)) + ); +} + +static int applicable(const problem *p_, const S *ego, const planner *plnr) +{ + const problem_rdft2 *p; + + if (NO_BUFFERINGP(plnr)) return 0; + + if (!applicable0(p_, ego, plnr)) return 0; + + p = (const problem_rdft2 *) p_; + if (NO_UGLYP(plnr)) { + if (p->r0 != p->cr) return 0; + if (X(toobig)(p->sz->dims[0].n)) return 0; + } + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + P *pln; + plan *cld = (plan *) 0; + plan *cldrest = (plan *) 0; + const problem_rdft2 *p = (const problem_rdft2 *) p_; + R *bufs = (R *) 0; + INT nbuf = 0, bufdist, n, vl; + INT ivs, ovs, rs, id, od; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + if (!applicable(p_, ego, plnr)) + goto nada; + + n = p->sz->dims[0].n; + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + + nbuf = X(imax)(X(nbuf)(n, vl, 0), min_nbuf(p, n, vl)); + bufdist = X(bufdist)(n, vl); + A(nbuf > 0); + + /* initial allocation for the purpose of planning */ + bufs = (R *) MALLOC(sizeof(R) * nbuf * bufdist, BUFFERS); + + id = ivs * (nbuf * (vl / nbuf)); + od = ovs * (nbuf * (vl / nbuf)); + + if (p->kind == R2HC) { + cld = X(mkplan_f_d)( + plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(n, p->sz->dims[0].is/2, 1), + X(mktensor_1d)(nbuf, ivs, bufdist), + TAINT(p->r0, ivs * nbuf), bufs, &p->kind), + 0, 0, (p->r0 == p->cr) ? NO_DESTROY_INPUT : 0); + if (!cld) goto nada; + X(ifree)(bufs); bufs = 0; + + cldrest = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)( + X(tensor_copy)(p->sz), + X(mktensor_1d)(vl % nbuf, ivs, ovs), + p->r0 + id, p->r1 + id, + p->cr + od, p->ci + od, + p->kind)); + if (!cldrest) goto nada; + + pln = MKPLAN_RDFT2(P, &padt, apply_r2hc); + } else { + A(p->kind == HC2R); + cld = X(mkplan_f_d)( + plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(n, 1, p->sz->dims[0].os/2), + X(mktensor_1d)(nbuf, bufdist, ovs), + bufs, TAINT(p->r0, ovs * nbuf), &p->kind), + 0, 0, NO_DESTROY_INPUT); /* always ok to destroy bufs */ + if (!cld) goto nada; + X(ifree)(bufs); bufs = 0; + + cldrest = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)( + X(tensor_copy)(p->sz), + X(mktensor_1d)(vl % nbuf, ivs, ovs), + p->r0 + od, p->r1 + od, + p->cr + id, p->ci + id, + p->kind)); + if (!cldrest) goto nada; + pln = MKPLAN_RDFT2(P, &padt, apply_hc2r); + } + + pln->cld = cld; + pln->cldrest = cldrest; + pln->n = n; + pln->vl = vl; + pln->ivs = ivs; + pln->ovs = ovs; + X(rdft2_strides)(p->kind, &p->sz->dims[0], &rs, &pln->cs); + pln->nbuf = nbuf; + pln->bufdist = bufdist; + + X(ops_madd)(vl / nbuf, &cld->ops, &cldrest->ops, + &pln->super.super.ops); + pln->super.super.ops.other += (p->kind == R2HC ? (n + 2) : n) * vl; + + return &(pln->super.super); + + nada: + X(ifree0)(bufs); + X(plan_destroy_internal)(cldrest); + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(rdft2_rdft_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-strides.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-strides.c new file mode 100644 index 000000000..8b86fb73d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-strides.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/rdft.h" + +/* Deal with annoyance because the tensor (is,os) applies to + (r,rio/iio) for R2HC and vice-versa for HC2R. We originally had + (is,os) always apply to (r,rio/iio), but this causes other + headaches with the tensor functions. */ +void X(rdft2_strides)(rdft_kind kind, const iodim *d, INT *rs, INT *cs) +{ + if (kind == R2HC) { + *rs = d->is; + *cs = d->os; + } + else { + A(kind == HC2R); + *rs = d->os; + *cs = d->is; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-tensor-max-index.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-tensor-max-index.c new file mode 100644 index 000000000..9c9301572 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/rdft2-tensor-max-index.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +/* like X(tensor_max_index), but takes into account the special n/2+1 + final dimension for the complex output/input of an R2HC/HC2R transform. */ +INT X(rdft2_tensor_max_index)(const tensor *sz, rdft_kind k) +{ + int i; + INT n = 0; + + A(FINITE_RNK(sz->rnk)); + for (i = 0; i + 1 < sz->rnk; ++i) { + const iodim *p = sz->dims + i; + n += (p->n - 1) * X(imax)(X(iabs)(p->is), X(iabs)(p->os)); + } + if (i < sz->rnk) { + const iodim *p = sz->dims + i; + INT is, os; + X(rdft2_strides)(k, p, &is, &os); + n += X(imax)((p->n - 1) * X(iabs)(is), (p->n/2) * X(iabs)(os)); + } + return n; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/Makefile.am new file mode 100644 index 000000000..692c38a5c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/Makefile.am @@ -0,0 +1,7 @@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = r2cf r2cb r2r +noinst_LTLIBRARIES = librdft_scalar.la + +librdft_scalar_la_SOURCES = hb.h r2cb.h r2cbIII.h hf.h hfb.c r2c.c \ +r2cf.h r2cfII.h r2r.c r2r.h hc2c.c hc2cf.h hc2cb.h + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/Makefile.in new file mode 100644 index 000000000..77a39ac75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/Makefile.in @@ -0,0 +1,749 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/scalar +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_scalar_la_LIBADD = +am_librdft_scalar_la_OBJECTS = hfb.lo r2c.lo r2r.lo hc2c.lo +librdft_scalar_la_OBJECTS = $(am_librdft_scalar_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_scalar_la_SOURCES) +DIST_SOURCES = $(librdft_scalar_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = r2cf r2cb r2r +noinst_LTLIBRARIES = librdft_scalar.la +librdft_scalar_la_SOURCES = hb.h r2cb.h r2cbIII.h hf.h hfb.c r2c.c \ +r2cf.h r2cfII.h r2r.c r2r.h hc2c.c hc2cf.h hc2cb.h + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/scalar/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/scalar/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_scalar.la: $(librdft_scalar_la_OBJECTS) $(librdft_scalar_la_DEPENDENCIES) $(EXTRA_librdft_scalar_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(librdft_scalar_la_OBJECTS) $(librdft_scalar_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hfb.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2r.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hb.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hb.h new file mode 100644 index 000000000..990220873 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hb.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_hb_genus) +extern const hc2hc_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2c.c new file mode 100644 index 000000000..f5c187586 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2c.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/codelet-rdft.h" +#include "rdft/scalar/hc2cf.h" + +static int okp(const R *Rp, const R *Ip, const R *Rm, const R *Im, + INT rs, INT mb, INT me, INT ms, + const planner *plnr) +{ + UNUSED(Rp); UNUSED(Ip); UNUSED(Rm); UNUSED(Im); + UNUSED(rs); UNUSED(mb); UNUSED(me); UNUSED(ms); UNUSED(plnr); + + return 1; +} + +const hc2c_genus GENUS = { okp, R2HC, 1 }; + +#undef GENUS +#include "rdft/scalar/hc2cb.h" + +const hc2c_genus GENUS = { okp, HC2R, 1 }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2cb.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2cb.h new file mode 100644 index 000000000..b1067a25f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2cb.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_hc2cb_genus) +extern const hc2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2cf.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2cf.h new file mode 100644 index 000000000..3e49982a5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hc2cf.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_hc2cf_genus) +extern const hc2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hf.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hf.h new file mode 100644 index 000000000..16ed31b14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hf.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_hf_genus) +extern const hc2hc_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hfb.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hfb.c new file mode 100644 index 000000000..3608864ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/hfb.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/codelet-rdft.h" +#include "rdft/scalar/hf.h" + +const hc2hc_genus GENUS = { R2HC, 1 }; + +#undef GENUS +#include "rdft/scalar/hb.h" + +const hc2hc_genus GENUS = { HC2R, 1 }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2c.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2c.c new file mode 100644 index 000000000..4239492f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2c.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/codelet-rdft.h" + +#include "rdft/scalar/r2cf.h" +const kr2c_genus GENUS = { R2HC, 1 }; +#undef GENUS + +#include "rdft/scalar/r2cfII.h" +const kr2c_genus GENUS = { R2HCII, 1 }; +#undef GENUS + +#include "rdft/scalar/r2cb.h" +const kr2c_genus GENUS = { HC2R, 1 }; +#undef GENUS + +#include "rdft/scalar/r2cbIII.h" +const kr2c_genus GENUS = { HC2RIII, 1 }; +#undef GENUS diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb.h new file mode 100644 index 000000000..4e98f5b55 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_r2cb_genus) +extern const kr2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/Makefile.am new file mode 100644 index 000000000..169fbec61 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/Makefile.am @@ -0,0 +1,109 @@ +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = librdft_scalar_r2cb.la + +########################################################################### +# r2cb_ is a hard-coded complex-to-real FFT of size (base cases +# of real-output FFT recursion) +R2CB = r2cb_2.c r2cb_3.c r2cb_4.c r2cb_5.c r2cb_6.c r2cb_7.c r2cb_8.c \ +r2cb_9.c r2cb_10.c r2cb_11.c r2cb_12.c r2cb_13.c r2cb_14.c r2cb_15.c \ +r2cb_16.c r2cb_32.c r2cb_64.c r2cb_128.c r2cb_20.c r2cb_25.c +# r2cb_30.c r2cb_40.c r2cb_50.c + +########################################################################### +# hb_ is a "twiddle" FFT of size , implementing a radix-r DIF +# step for a real-output FFT. Every hb codelet must have a +# corresponding r2cbIII codelet (see below)! +HB = hb_2.c hb_3.c hb_4.c hb_5.c hb_6.c hb_7.c hb_8.c hb_9.c \ +hb_10.c hb_12.c hb_15.c hb_16.c hb_32.c hb_64.c \ +hb_20.c hb_25.c # hb_30.c hb_40.c hb_50.c + +# like hb, but generates part of its trig table on the fly (good for large n) +HB2 = hb2_4.c hb2_8.c hb2_16.c hb2_32.c \ +hb2_5.c hb2_20.c hb2_25.c + +# an r2cb transform where the output is shifted by half a sample (input +# is multiplied by a phase). This is needed as part of the DIF recursion; +# every hb_ or hb2_ codelet should have a corresponding r2cbIII_ +R2CBIII = r2cbIII_2.c r2cbIII_3.c r2cbIII_4.c r2cbIII_5.c r2cbIII_6.c \ +r2cbIII_7.c r2cbIII_8.c r2cbIII_9.c r2cbIII_10.c r2cbIII_12.c \ +r2cbIII_15.c r2cbIII_16.c r2cbIII_32.c r2cbIII_64.c \ +r2cbIII_20.c r2cbIII_25.c # r2cbIII_30.c r2cbIII_40.c r2cbIII_50.c + +########################################################################### +# hc2cb_ is a "twiddle" FFT of size , implementing a radix-r DIF +# step for a real-input FFT with rdft2-style output. must be even. +HC2CB = hc2cb_2.c hc2cb_4.c hc2cb_6.c hc2cb_8.c hc2cb_10.c hc2cb_12.c \ +hc2cb_16.c hc2cb_32.c \ +hc2cb_20.c # hc2cb_30.c + +HC2CBDFT = hc2cbdft_2.c hc2cbdft_4.c hc2cbdft_6.c hc2cbdft_8.c \ +hc2cbdft_10.c hc2cbdft_12.c hc2cbdft_16.c hc2cbdft_32.c \ +hc2cbdft_20.c # hc2cbdft_30.c + +# like hc2cb, but generates part of its trig table on the fly (good +# for large n) +HC2CB2 = hc2cb2_4.c hc2cb2_8.c hc2cb2_16.c hc2cb2_32.c \ +hc2cb2_20.c # hc2cb2_30.c +HC2CBDFT2 = hc2cbdft2_4.c hc2cbdft2_8.c hc2cbdft2_16.c hc2cbdft2_32.c \ +hc2cbdft2_20.c # hc2cbdft2_30.c + +########################################################################### +ALL_CODELETS = $(R2CB) $(HB) $(HB2) $(R2CBIII) $(HC2CB) $(HC2CB2) \ +$(HC2CBDFT) $(HC2CBDFT2) + +BUILT_SOURCES= $(ALL_CODELETS) $(CODLIST) + +librdft_scalar_r2cb_la_SOURCES = $(BUILT_SOURCES) + +SOLVTAB_NAME = X(solvtab_rdft_r2cb) +XRENAME=X + +# special rules for regenerating codelets. +include $(top_srcdir)/support/Makefile.codelets + +if MAINTAINER_MODE +FLAGS_R2CB=$(RDFT_FLAGS_COMMON) -sign 1 +FLAGS_HB=$(RDFT_FLAGS_COMMON) -sign 1 +FLAGS_HB2=$(RDFT_FLAGS_COMMON) -sign 1 -twiddle-log3 -precompute-twiddles +FLAGS_HC2CB=$(RDFT_FLAGS_COMMON) -sign 1 +FLAGS_HC2CB2=$(RDFT_FLAGS_COMMON) -sign 1 -twiddle-log3 -precompute-twiddles +FLAGS_R2CBIII=$(RDFT_FLAGS_COMMON) -sign 1 + +r2cb_%.c: $(CODELET_DEPS) $(GEN_R2CB) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CB) $(FLAGS_R2CB) -n $* -name r2cb_$* -include "rdft/scalar/r2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +hb_%.c: $(CODELET_DEPS) $(GEN_HC2HC) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HB) -n $* -dif -name hb_$* -include "rdft/scalar/hb.h") | $(ADD_DATE) | $(INDENT) >$@ + +hb2_%.c: $(CODELET_DEPS) $(GEN_HC2HC) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HB2) -n $* -dif -name hb2_$* -include "rdft/scalar/hb.h") | $(ADD_DATE) | $(INDENT) >$@ + +r2cbIII_%.c: $(CODELET_DEPS) $(GEN_R2CB) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CB) $(FLAGS_R2CB) -n $* -name r2cbIII_$* -dft-III -include "rdft/scalar/r2cbIII.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cb_%.c: $(CODELET_DEPS) $(GEN_HC2C) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CB) -n $* -dif -name hc2cb_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cb2_%.c: $(CODELET_DEPS) $(GEN_HC2C) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CB2) -n $* -dif -name hc2cb2_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cbdft_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CB) -n $* -dif -name hc2cbdft_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cbdft2_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CB) -n $* -dif -name hc2cbdft2_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/Makefile.in new file mode 100644 index 000000000..9a077acbe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/Makefile.in @@ -0,0 +1,925 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/scalar/r2cb +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_scalar_r2cb_la_LIBADD = +am__objects_1 = r2cb_2.lo r2cb_3.lo r2cb_4.lo r2cb_5.lo r2cb_6.lo \ + r2cb_7.lo r2cb_8.lo r2cb_9.lo r2cb_10.lo r2cb_11.lo r2cb_12.lo \ + r2cb_13.lo r2cb_14.lo r2cb_15.lo r2cb_16.lo r2cb_32.lo \ + r2cb_64.lo r2cb_128.lo r2cb_20.lo r2cb_25.lo +am__objects_2 = hb_2.lo hb_3.lo hb_4.lo hb_5.lo hb_6.lo hb_7.lo \ + hb_8.lo hb_9.lo hb_10.lo hb_12.lo hb_15.lo hb_16.lo hb_32.lo \ + hb_64.lo hb_20.lo hb_25.lo +am__objects_3 = hb2_4.lo hb2_8.lo hb2_16.lo hb2_32.lo hb2_5.lo \ + hb2_20.lo hb2_25.lo +am__objects_4 = r2cbIII_2.lo r2cbIII_3.lo r2cbIII_4.lo r2cbIII_5.lo \ + r2cbIII_6.lo r2cbIII_7.lo r2cbIII_8.lo r2cbIII_9.lo \ + r2cbIII_10.lo r2cbIII_12.lo r2cbIII_15.lo r2cbIII_16.lo \ + r2cbIII_32.lo r2cbIII_64.lo r2cbIII_20.lo r2cbIII_25.lo +am__objects_5 = hc2cb_2.lo hc2cb_4.lo hc2cb_6.lo hc2cb_8.lo \ + hc2cb_10.lo hc2cb_12.lo hc2cb_16.lo hc2cb_32.lo hc2cb_20.lo +am__objects_6 = hc2cb2_4.lo hc2cb2_8.lo hc2cb2_16.lo hc2cb2_32.lo \ + hc2cb2_20.lo +am__objects_7 = hc2cbdft_2.lo hc2cbdft_4.lo hc2cbdft_6.lo \ + hc2cbdft_8.lo hc2cbdft_10.lo hc2cbdft_12.lo hc2cbdft_16.lo \ + hc2cbdft_32.lo hc2cbdft_20.lo +am__objects_8 = hc2cbdft2_4.lo hc2cbdft2_8.lo hc2cbdft2_16.lo \ + hc2cbdft2_32.lo hc2cbdft2_20.lo +am__objects_9 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) +am__objects_10 = codlist.lo +am__objects_11 = $(am__objects_9) $(am__objects_10) +am_librdft_scalar_r2cb_la_OBJECTS = $(am__objects_11) +librdft_scalar_r2cb_la_OBJECTS = $(am_librdft_scalar_r2cb_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_scalar_r2cb_la_SOURCES) +DIST_SOURCES = $(librdft_scalar_r2cb_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/support/Makefile.codelets +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = librdft_scalar_r2cb.la + +########################################################################### +# r2cb_ is a hard-coded complex-to-real FFT of size (base cases +# of real-output FFT recursion) +R2CB = r2cb_2.c r2cb_3.c r2cb_4.c r2cb_5.c r2cb_6.c r2cb_7.c r2cb_8.c \ +r2cb_9.c r2cb_10.c r2cb_11.c r2cb_12.c r2cb_13.c r2cb_14.c r2cb_15.c \ +r2cb_16.c r2cb_32.c r2cb_64.c r2cb_128.c r2cb_20.c r2cb_25.c + +# r2cb_30.c r2cb_40.c r2cb_50.c + +########################################################################### +# hb_ is a "twiddle" FFT of size , implementing a radix-r DIF +# step for a real-output FFT. Every hb codelet must have a +# corresponding r2cbIII codelet (see below)! +HB = hb_2.c hb_3.c hb_4.c hb_5.c hb_6.c hb_7.c hb_8.c hb_9.c \ +hb_10.c hb_12.c hb_15.c hb_16.c hb_32.c hb_64.c \ +hb_20.c hb_25.c # hb_30.c hb_40.c hb_50.c + + +# like hb, but generates part of its trig table on the fly (good for large n) +HB2 = hb2_4.c hb2_8.c hb2_16.c hb2_32.c \ +hb2_5.c hb2_20.c hb2_25.c + + +# an r2cb transform where the output is shifted by half a sample (input +# is multiplied by a phase). This is needed as part of the DIF recursion; +# every hb_ or hb2_ codelet should have a corresponding r2cbIII_ +R2CBIII = r2cbIII_2.c r2cbIII_3.c r2cbIII_4.c r2cbIII_5.c r2cbIII_6.c \ +r2cbIII_7.c r2cbIII_8.c r2cbIII_9.c r2cbIII_10.c r2cbIII_12.c \ +r2cbIII_15.c r2cbIII_16.c r2cbIII_32.c r2cbIII_64.c \ +r2cbIII_20.c r2cbIII_25.c # r2cbIII_30.c r2cbIII_40.c r2cbIII_50.c + + +########################################################################### +# hc2cb_ is a "twiddle" FFT of size , implementing a radix-r DIF +# step for a real-input FFT with rdft2-style output. must be even. +HC2CB = hc2cb_2.c hc2cb_4.c hc2cb_6.c hc2cb_8.c hc2cb_10.c hc2cb_12.c \ +hc2cb_16.c hc2cb_32.c \ +hc2cb_20.c # hc2cb_30.c + +HC2CBDFT = hc2cbdft_2.c hc2cbdft_4.c hc2cbdft_6.c hc2cbdft_8.c \ +hc2cbdft_10.c hc2cbdft_12.c hc2cbdft_16.c hc2cbdft_32.c \ +hc2cbdft_20.c # hc2cbdft_30.c + + +# like hc2cb, but generates part of its trig table on the fly (good +# for large n) +HC2CB2 = hc2cb2_4.c hc2cb2_8.c hc2cb2_16.c hc2cb2_32.c \ +hc2cb2_20.c # hc2cb2_30.c + +HC2CBDFT2 = hc2cbdft2_4.c hc2cbdft2_8.c hc2cbdft2_16.c hc2cbdft2_32.c \ +hc2cbdft2_20.c # hc2cbdft2_30.c + + +########################################################################### +ALL_CODELETS = $(R2CB) $(HB) $(HB2) $(R2CBIII) $(HC2CB) $(HC2CB2) \ +$(HC2CBDFT) $(HC2CBDFT2) + +BUILT_SOURCES = $(ALL_CODELETS) $(CODLIST) +librdft_scalar_r2cb_la_SOURCES = $(BUILT_SOURCES) +SOLVTAB_NAME = X(solvtab_rdft_r2cb) +XRENAME = X +CODLIST = codlist.c +CODELET_NAME = codelet_ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +@MAINTAINER_MODE_TRUE@TWOVERS = sh ${top_srcdir}/support/twovers.sh +@MAINTAINER_MODE_TRUE@GENFFTDIR = ${top_builddir}/genfft +@MAINTAINER_MODE_TRUE@GEN_NOTW = ${GENFFTDIR}/gen_notw.native +@MAINTAINER_MODE_TRUE@GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +@MAINTAINER_MODE_TRUE@GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +@MAINTAINER_MODE_TRUE@GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +@MAINTAINER_MODE_TRUE@GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +@MAINTAINER_MODE_TRUE@GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +@MAINTAINER_MODE_TRUE@GEN_R2R = ${GENFFTDIR}/gen_r2r.native +@MAINTAINER_MODE_TRUE@PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +@MAINTAINER_MODE_TRUE@PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +@MAINTAINER_MODE_TRUE@ADD_DATE = sed -e s/@DATE@/"`date`"/ +@MAINTAINER_MODE_TRUE@COPYRIGHT = ${top_srcdir}/COPYRIGHT +@MAINTAINER_MODE_TRUE@CODELET_DEPS = $(COPYRIGHT) $(PRELUDE) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_DFT = cat $(COPYRIGHT) $(PRELUDE_DFT) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_RDFT = cat $(COPYRIGHT) $(PRELUDE_RDFT) +@MAINTAINER_MODE_TRUE@FLAGS_COMMON = -compact -variables 4 +@MAINTAINER_MODE_TRUE@DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +@MAINTAINER_MODE_TRUE@RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# special rules for regenerating codelets. +@MAINTAINER_MODE_TRUE@FLAGS_R2CB = $(RDFT_FLAGS_COMMON) -sign 1 +@MAINTAINER_MODE_TRUE@FLAGS_HB = $(RDFT_FLAGS_COMMON) -sign 1 +@MAINTAINER_MODE_TRUE@FLAGS_HB2 = $(RDFT_FLAGS_COMMON) -sign 1 -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_HC2CB = $(RDFT_FLAGS_COMMON) -sign 1 +@MAINTAINER_MODE_TRUE@FLAGS_HC2CB2 = $(RDFT_FLAGS_COMMON) -sign 1 -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_R2CBIII = $(RDFT_FLAGS_COMMON) -sign 1 +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/support/Makefile.codelets $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/scalar/r2cb/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/scalar/r2cb/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/support/Makefile.codelets $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_scalar_r2cb.la: $(librdft_scalar_r2cb_la_OBJECTS) $(librdft_scalar_r2cb_la_DEPENDENCIES) $(EXTRA_librdft_scalar_r2cb_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(librdft_scalar_r2cb_la_OBJECTS) $(librdft_scalar_r2cb_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb2_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hb_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb2_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cb_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft2_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdft_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cbIII_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cb_9.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +# rule to build codlist +@MAINTAINER_MODE_TRUE@$(CODLIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "#include \"kernel/ifftw.h\""; \ +@MAINTAINER_MODE_TRUE@ echo $(INCLUDE_SIMD_HEADER); \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo "extern const solvtab $(SOLVTAB_NAME);"; \ +@MAINTAINER_MODE_TRUE@ echo "const solvtab $(SOLVTAB_NAME) = {"; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB_END"; \ +@MAINTAINER_MODE_TRUE@ echo "};"; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# cancel the hideous builtin rules that cause an infinite loop +@MAINTAINER_MODE_TRUE@%: %.o +@MAINTAINER_MODE_TRUE@%: %.s +@MAINTAINER_MODE_TRUE@%: %.c +@MAINTAINER_MODE_TRUE@%: %.S + +@MAINTAINER_MODE_TRUE@r2cb_%.c: $(CODELET_DEPS) $(GEN_R2CB) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CB) $(FLAGS_R2CB) -n $* -name r2cb_$* -include "rdft/scalar/r2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hb_%.c: $(CODELET_DEPS) $(GEN_HC2HC) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HB) -n $* -dif -name hb_$* -include "rdft/scalar/hb.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hb2_%.c: $(CODELET_DEPS) $(GEN_HC2HC) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HB2) -n $* -dif -name hb2_$* -include "rdft/scalar/hb.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@r2cbIII_%.c: $(CODELET_DEPS) $(GEN_R2CB) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CB) $(FLAGS_R2CB) -n $* -name r2cbIII_$* -dft-III -include "rdft/scalar/r2cbIII.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cb_%.c: $(CODELET_DEPS) $(GEN_HC2C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CB) -n $* -dif -name hc2cb_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cb2_%.c: $(CODELET_DEPS) $(GEN_HC2C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CB2) -n $* -dif -name hc2cb2_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cbdft_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CB) -n $* -dif -name hc2cbdft_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cbdft2_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CB) -n $* -dif -name hc2cbdft2_$* -include "rdft/scalar/hc2cb.h") | $(ADD_DATE) | $(INDENT) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/codlist.c new file mode 100644 index 000000000..2a4894c90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/codlist.c @@ -0,0 +1,183 @@ +#include "kernel/ifftw.h" + + +extern void X(codelet_r2cb_2)(planner *); +extern void X(codelet_r2cb_3)(planner *); +extern void X(codelet_r2cb_4)(planner *); +extern void X(codelet_r2cb_5)(planner *); +extern void X(codelet_r2cb_6)(planner *); +extern void X(codelet_r2cb_7)(planner *); +extern void X(codelet_r2cb_8)(planner *); +extern void X(codelet_r2cb_9)(planner *); +extern void X(codelet_r2cb_10)(planner *); +extern void X(codelet_r2cb_11)(planner *); +extern void X(codelet_r2cb_12)(planner *); +extern void X(codelet_r2cb_13)(planner *); +extern void X(codelet_r2cb_14)(planner *); +extern void X(codelet_r2cb_15)(planner *); +extern void X(codelet_r2cb_16)(planner *); +extern void X(codelet_r2cb_32)(planner *); +extern void X(codelet_r2cb_64)(planner *); +extern void X(codelet_r2cb_128)(planner *); +extern void X(codelet_r2cb_20)(planner *); +extern void X(codelet_r2cb_25)(planner *); +extern void X(codelet_hb_2)(planner *); +extern void X(codelet_hb_3)(planner *); +extern void X(codelet_hb_4)(planner *); +extern void X(codelet_hb_5)(planner *); +extern void X(codelet_hb_6)(planner *); +extern void X(codelet_hb_7)(planner *); +extern void X(codelet_hb_8)(planner *); +extern void X(codelet_hb_9)(planner *); +extern void X(codelet_hb_10)(planner *); +extern void X(codelet_hb_12)(planner *); +extern void X(codelet_hb_15)(planner *); +extern void X(codelet_hb_16)(planner *); +extern void X(codelet_hb_32)(planner *); +extern void X(codelet_hb_64)(planner *); +extern void X(codelet_hb_20)(planner *); +extern void X(codelet_hb_25)(planner *); +extern void X(codelet_hb2_4)(planner *); +extern void X(codelet_hb2_8)(planner *); +extern void X(codelet_hb2_16)(planner *); +extern void X(codelet_hb2_32)(planner *); +extern void X(codelet_hb2_5)(planner *); +extern void X(codelet_hb2_20)(planner *); +extern void X(codelet_hb2_25)(planner *); +extern void X(codelet_r2cbIII_2)(planner *); +extern void X(codelet_r2cbIII_3)(planner *); +extern void X(codelet_r2cbIII_4)(planner *); +extern void X(codelet_r2cbIII_5)(planner *); +extern void X(codelet_r2cbIII_6)(planner *); +extern void X(codelet_r2cbIII_7)(planner *); +extern void X(codelet_r2cbIII_8)(planner *); +extern void X(codelet_r2cbIII_9)(planner *); +extern void X(codelet_r2cbIII_10)(planner *); +extern void X(codelet_r2cbIII_12)(planner *); +extern void X(codelet_r2cbIII_15)(planner *); +extern void X(codelet_r2cbIII_16)(planner *); +extern void X(codelet_r2cbIII_32)(planner *); +extern void X(codelet_r2cbIII_64)(planner *); +extern void X(codelet_r2cbIII_20)(planner *); +extern void X(codelet_r2cbIII_25)(planner *); +extern void X(codelet_hc2cb_2)(planner *); +extern void X(codelet_hc2cb_4)(planner *); +extern void X(codelet_hc2cb_6)(planner *); +extern void X(codelet_hc2cb_8)(planner *); +extern void X(codelet_hc2cb_10)(planner *); +extern void X(codelet_hc2cb_12)(planner *); +extern void X(codelet_hc2cb_16)(planner *); +extern void X(codelet_hc2cb_32)(planner *); +extern void X(codelet_hc2cb_20)(planner *); +extern void X(codelet_hc2cb2_4)(planner *); +extern void X(codelet_hc2cb2_8)(planner *); +extern void X(codelet_hc2cb2_16)(planner *); +extern void X(codelet_hc2cb2_32)(planner *); +extern void X(codelet_hc2cb2_20)(planner *); +extern void X(codelet_hc2cbdft_2)(planner *); +extern void X(codelet_hc2cbdft_4)(planner *); +extern void X(codelet_hc2cbdft_6)(planner *); +extern void X(codelet_hc2cbdft_8)(planner *); +extern void X(codelet_hc2cbdft_10)(planner *); +extern void X(codelet_hc2cbdft_12)(planner *); +extern void X(codelet_hc2cbdft_16)(planner *); +extern void X(codelet_hc2cbdft_32)(planner *); +extern void X(codelet_hc2cbdft_20)(planner *); +extern void X(codelet_hc2cbdft2_4)(planner *); +extern void X(codelet_hc2cbdft2_8)(planner *); +extern void X(codelet_hc2cbdft2_16)(planner *); +extern void X(codelet_hc2cbdft2_32)(planner *); +extern void X(codelet_hc2cbdft2_20)(planner *); + + +extern const solvtab X(solvtab_rdft_r2cb); +const solvtab X(solvtab_rdft_r2cb) = { + SOLVTAB(X(codelet_r2cb_2)), + SOLVTAB(X(codelet_r2cb_3)), + SOLVTAB(X(codelet_r2cb_4)), + SOLVTAB(X(codelet_r2cb_5)), + SOLVTAB(X(codelet_r2cb_6)), + SOLVTAB(X(codelet_r2cb_7)), + SOLVTAB(X(codelet_r2cb_8)), + SOLVTAB(X(codelet_r2cb_9)), + SOLVTAB(X(codelet_r2cb_10)), + SOLVTAB(X(codelet_r2cb_11)), + SOLVTAB(X(codelet_r2cb_12)), + SOLVTAB(X(codelet_r2cb_13)), + SOLVTAB(X(codelet_r2cb_14)), + SOLVTAB(X(codelet_r2cb_15)), + SOLVTAB(X(codelet_r2cb_16)), + SOLVTAB(X(codelet_r2cb_32)), + SOLVTAB(X(codelet_r2cb_64)), + SOLVTAB(X(codelet_r2cb_128)), + SOLVTAB(X(codelet_r2cb_20)), + SOLVTAB(X(codelet_r2cb_25)), + SOLVTAB(X(codelet_hb_2)), + SOLVTAB(X(codelet_hb_3)), + SOLVTAB(X(codelet_hb_4)), + SOLVTAB(X(codelet_hb_5)), + SOLVTAB(X(codelet_hb_6)), + SOLVTAB(X(codelet_hb_7)), + SOLVTAB(X(codelet_hb_8)), + SOLVTAB(X(codelet_hb_9)), + SOLVTAB(X(codelet_hb_10)), + SOLVTAB(X(codelet_hb_12)), + SOLVTAB(X(codelet_hb_15)), + SOLVTAB(X(codelet_hb_16)), + SOLVTAB(X(codelet_hb_32)), + SOLVTAB(X(codelet_hb_64)), + SOLVTAB(X(codelet_hb_20)), + SOLVTAB(X(codelet_hb_25)), + SOLVTAB(X(codelet_hb2_4)), + SOLVTAB(X(codelet_hb2_8)), + SOLVTAB(X(codelet_hb2_16)), + SOLVTAB(X(codelet_hb2_32)), + SOLVTAB(X(codelet_hb2_5)), + SOLVTAB(X(codelet_hb2_20)), + SOLVTAB(X(codelet_hb2_25)), + SOLVTAB(X(codelet_r2cbIII_2)), + SOLVTAB(X(codelet_r2cbIII_3)), + SOLVTAB(X(codelet_r2cbIII_4)), + SOLVTAB(X(codelet_r2cbIII_5)), + SOLVTAB(X(codelet_r2cbIII_6)), + SOLVTAB(X(codelet_r2cbIII_7)), + SOLVTAB(X(codelet_r2cbIII_8)), + SOLVTAB(X(codelet_r2cbIII_9)), + SOLVTAB(X(codelet_r2cbIII_10)), + SOLVTAB(X(codelet_r2cbIII_12)), + SOLVTAB(X(codelet_r2cbIII_15)), + SOLVTAB(X(codelet_r2cbIII_16)), + SOLVTAB(X(codelet_r2cbIII_32)), + SOLVTAB(X(codelet_r2cbIII_64)), + SOLVTAB(X(codelet_r2cbIII_20)), + SOLVTAB(X(codelet_r2cbIII_25)), + SOLVTAB(X(codelet_hc2cb_2)), + SOLVTAB(X(codelet_hc2cb_4)), + SOLVTAB(X(codelet_hc2cb_6)), + SOLVTAB(X(codelet_hc2cb_8)), + SOLVTAB(X(codelet_hc2cb_10)), + SOLVTAB(X(codelet_hc2cb_12)), + SOLVTAB(X(codelet_hc2cb_16)), + SOLVTAB(X(codelet_hc2cb_32)), + SOLVTAB(X(codelet_hc2cb_20)), + SOLVTAB(X(codelet_hc2cb2_4)), + SOLVTAB(X(codelet_hc2cb2_8)), + SOLVTAB(X(codelet_hc2cb2_16)), + SOLVTAB(X(codelet_hc2cb2_32)), + SOLVTAB(X(codelet_hc2cb2_20)), + SOLVTAB(X(codelet_hc2cbdft_2)), + SOLVTAB(X(codelet_hc2cbdft_4)), + SOLVTAB(X(codelet_hc2cbdft_6)), + SOLVTAB(X(codelet_hc2cbdft_8)), + SOLVTAB(X(codelet_hc2cbdft_10)), + SOLVTAB(X(codelet_hc2cbdft_12)), + SOLVTAB(X(codelet_hc2cbdft_16)), + SOLVTAB(X(codelet_hc2cbdft_32)), + SOLVTAB(X(codelet_hc2cbdft_20)), + SOLVTAB(X(codelet_hc2cbdft2_4)), + SOLVTAB(X(codelet_hc2cbdft2_8)), + SOLVTAB(X(codelet_hc2cbdft2_16)), + SOLVTAB(X(codelet_hc2cbdft2_32)), + SOLVTAB(X(codelet_hc2cbdft2_20)), + SOLVTAB_END +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_16.c new file mode 100644 index 000000000..02fba64ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_16.c @@ -0,0 +1,858 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:37 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 16 -dif -name hb2_16 -include rdft/scalar/hb.h */ + +/* + * This function contains 196 FP additions, 134 FP multiplications, + * (or, 104 additions, 42 multiplications, 92 fused multiply/add), + * 93 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tv, Tw, T2z, T2C, TB, TF, Ty, Tz, T1V, TA, T2G, T3Q, T3C, T3g, T3L; + E T30, T3m, T3z, T3w, T3s, T1X, T1Y, T2u, T2c, T2p, TE, TG, T1G, T1o, T1D; + { + E T3f, T3l, T2F, T3r, T2Z, T3v, TD, Tx; + Tv = W[0]; + Tw = W[2]; + Tx = Tv * Tw; + T2z = W[6]; + T3f = Tv * T2z; + T2C = W[7]; + T3l = Tv * T2C; + TB = W[4]; + T2F = Tv * TB; + T3r = Tw * TB; + TF = W[5]; + T2Z = Tv * TF; + T3v = Tw * TF; + Ty = W[1]; + Tz = W[3]; + TD = Tv * Tz; + T1V = FMA(Ty, Tz, Tx); + TA = FNMS(Ty, Tz, Tx); + T2G = FNMS(Ty, TF, T2F); + T3Q = FMA(Tz, TB, T3v); + T3C = FNMS(Ty, TB, T2Z); + T3g = FMA(Ty, T2C, T3f); + T3L = FNMS(Tz, TF, T3r); + T30 = FMA(Ty, TB, T2Z); + T3m = FNMS(Ty, T2z, T3l); + T3z = FMA(Ty, TF, T2F); + T3w = FNMS(Tz, TB, T3v); + T3s = FMA(Tz, TF, T3r); + { + E T1W, T2b, TC, T1n; + T1W = T1V * TB; + T2b = T1V * TF; + T1X = FNMS(Ty, Tw, TD); + T1Y = FNMS(T1X, TF, T1W); + T2u = FNMS(T1X, TB, T2b); + T2c = FMA(T1X, TB, T2b); + T2p = FMA(T1X, TF, T1W); + TC = TA * TB; + T1n = TA * TF; + TE = FMA(Ty, Tw, TD); + TG = FNMS(TE, TF, TC); + T1G = FNMS(TE, TB, T1n); + T1o = FMA(TE, TB, T1n); + T1D = FMA(TE, TF, TC); + } + } + { + E TL, T1Z, T2d, T1t, T31, T34, T3n, T3D, T3E, T3R, T1w, T20, Tf, T3M, T2L; + E T3h, TW, T2e, T3G, T3H, T3N, T2Q, T36, T2V, T37, Tu, T3S, T18, T1z, T24; + E T2g, T27, T2h, T1j, T1y; + { + E T3, TH, TU, T2I, T1s, T32, T6, T1p, Ta, TM, TK, T33, TP, T2J, Td; + E TR; + { + E T1, T2, TS, TT; + T1 = cr[0]; + T2 = ci[WS(rs, 7)]; + T3 = T1 + T2; + TH = T1 - T2; + TS = ci[WS(rs, 9)]; + TT = cr[WS(rs, 14)]; + TU = TS + TT; + T2I = TS - TT; + } + { + E T1q, T1r, T4, T5; + T1q = ci[WS(rs, 15)]; + T1r = cr[WS(rs, 8)]; + T1s = T1q + T1r; + T32 = T1q - T1r; + T4 = cr[WS(rs, 4)]; + T5 = ci[WS(rs, 3)]; + T6 = T4 + T5; + T1p = T4 - T5; + } + { + E T8, T9, TI, TJ; + T8 = cr[WS(rs, 2)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + TM = T8 - T9; + TI = ci[WS(rs, 11)]; + TJ = cr[WS(rs, 12)]; + TK = TI + TJ; + T33 = TI - TJ; + } + { + E TN, TO, Tb, Tc; + TN = ci[WS(rs, 13)]; + TO = cr[WS(rs, 10)]; + TP = TN + TO; + T2J = TN - TO; + Tb = ci[WS(rs, 1)]; + Tc = cr[WS(rs, 6)]; + Td = Tb + Tc; + TR = Tb - Tc; + } + TL = TH - TK; + T1Z = TH + TK; + T2d = T1s - T1p; + T1t = T1p + T1s; + T31 = Ta - Td; + T34 = T32 - T33; + T3n = T34 - T31; + { + E T1u, T1v, T7, Te; + T3D = T32 + T33; + T3E = T2J + T2I; + T3R = T3D - T3E; + T1u = TM + TP; + T1v = TR + TU; + T1w = T1u - T1v; + T20 = T1u + T1v; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T3M = T7 - Te; + { + E T2H, T2K, TQ, TV; + T2H = T3 - T6; + T2K = T2I - T2J; + T2L = T2H + T2K; + T3h = T2H - T2K; + TQ = TM - TP; + TV = TR - TU; + TW = TQ + TV; + T2e = TQ - TV; + } + } + } + { + E Ti, T1e, T1c, T2N, T1h, T2O, Tl, T19, Tp, T13, T11, T2S, T16, T2T, Ts; + E TY, T2M, T2P; + { + E Tg, Th, T1a, T1b; + Tg = cr[WS(rs, 1)]; + Th = ci[WS(rs, 6)]; + Ti = Tg + Th; + T1e = Tg - Th; + T1a = ci[WS(rs, 14)]; + T1b = cr[WS(rs, 9)]; + T1c = T1a + T1b; + T2N = T1a - T1b; + } + { + E T1f, T1g, Tj, Tk; + T1f = ci[WS(rs, 10)]; + T1g = cr[WS(rs, 13)]; + T1h = T1f + T1g; + T2O = T1f - T1g; + Tj = cr[WS(rs, 5)]; + Tk = ci[WS(rs, 2)]; + Tl = Tj + Tk; + T19 = Tj - Tk; + } + { + E Tn, To, TZ, T10; + Tn = ci[0]; + To = cr[WS(rs, 7)]; + Tp = Tn + To; + T13 = Tn - To; + TZ = ci[WS(rs, 8)]; + T10 = cr[WS(rs, 15)]; + T11 = TZ + T10; + T2S = TZ - T10; + } + { + E T14, T15, Tq, Tr; + T14 = ci[WS(rs, 12)]; + T15 = cr[WS(rs, 11)]; + T16 = T14 + T15; + T2T = T14 - T15; + Tq = cr[WS(rs, 3)]; + Tr = ci[WS(rs, 4)]; + Ts = Tq + Tr; + TY = Tq - Tr; + } + T3G = T2N + T2O; + T3H = T2S + T2T; + T3N = T3H - T3G; + T2M = Ti - Tl; + T2P = T2N - T2O; + T2Q = T2M - T2P; + T36 = T2M + T2P; + { + E T2R, T2U, Tm, Tt; + T2R = Tp - Ts; + T2U = T2S - T2T; + T2V = T2R + T2U; + T37 = T2U - T2R; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T3S = Tm - Tt; + } + { + E T12, T17, T22, T23; + T12 = TY - T11; + T17 = T13 - T16; + T18 = FNMS(KP414213562, T17, T12); + T1z = FMA(KP414213562, T12, T17); + T22 = T1c - T19; + T23 = T1e + T1h; + T24 = FNMS(KP414213562, T23, T22); + T2g = FMA(KP414213562, T22, T23); + } + { + E T25, T26, T1d, T1i; + T25 = TY + T11; + T26 = T13 + T16; + T27 = FNMS(KP414213562, T26, T25); + T2h = FMA(KP414213562, T25, T26); + T1d = T19 + T1c; + T1i = T1e - T1h; + T1j = FMA(KP414213562, T1i, T1d); + T1y = FNMS(KP414213562, T1d, T1i); + } + } + cr[0] = Tf + Tu; + { + E T3B, T3K, T3F, T3I, T3J, T3A; + T3A = Tf - Tu; + T3B = T3z * T3A; + T3K = T3C * T3A; + T3F = T3D + T3E; + T3I = T3G + T3H; + T3J = T3F - T3I; + ci[0] = T3F + T3I; + ci[WS(rs, 8)] = FMA(T3z, T3J, T3K); + cr[WS(rs, 8)] = FNMS(T3C, T3J, T3B); + } + { + E T3O, T3P, T3T, T3U; + T3O = T3M - T3N; + T3P = T3L * T3O; + T3T = T3R - T3S; + T3U = T3L * T3T; + cr[WS(rs, 12)] = FNMS(T3Q, T3T, T3P); + ci[WS(rs, 12)] = FMA(T3Q, T3O, T3U); + } + { + E T3V, T3W, T3X, T3Y; + T3V = T3M + T3N; + T3W = TA * T3V; + T3X = T3S + T3R; + T3Y = TA * T3X; + cr[WS(rs, 4)] = FNMS(TE, T3X, T3W); + ci[WS(rs, 4)] = FMA(TE, T3V, T3Y); + } + { + E T3j, T3t, T3p, T3x, T3i, T3o; + T3i = T37 - T36; + T3j = FNMS(KP707106781, T3i, T3h); + T3t = FMA(KP707106781, T3i, T3h); + T3o = T2Q - T2V; + T3p = FNMS(KP707106781, T3o, T3n); + T3x = FMA(KP707106781, T3o, T3n); + { + E T3k, T3q, T3u, T3y; + T3k = T3g * T3j; + cr[WS(rs, 14)] = FNMS(T3m, T3p, T3k); + T3q = T3g * T3p; + ci[WS(rs, 14)] = FMA(T3m, T3j, T3q); + T3u = T3s * T3t; + cr[WS(rs, 6)] = FNMS(T3w, T3x, T3u); + T3y = T3s * T3x; + ci[WS(rs, 6)] = FMA(T3w, T3t, T3y); + } + } + { + E T2X, T3b, T39, T3d, T2W, T35, T38; + T2W = T2Q + T2V; + T2X = FNMS(KP707106781, T2W, T2L); + T3b = FMA(KP707106781, T2W, T2L); + T35 = T31 + T34; + T38 = T36 + T37; + T39 = FNMS(KP707106781, T38, T35); + T3d = FMA(KP707106781, T38, T35); + { + E T2Y, T3a, T3c, T3e; + T2Y = T2G * T2X; + cr[WS(rs, 10)] = FNMS(T30, T39, T2Y); + T3a = T30 * T2X; + ci[WS(rs, 10)] = FMA(T2G, T39, T3a); + T3c = T1V * T3b; + cr[WS(rs, 2)] = FNMS(T1X, T3d, T3c); + T3e = T1X * T3b; + ci[WS(rs, 2)] = FMA(T1V, T3d, T3e); + } + } + { + E T29, T2l, T2j, T2n; + { + E T21, T28, T2f, T2i; + T21 = FNMS(KP707106781, T20, T1Z); + T28 = T24 + T27; + T29 = FMA(KP923879532, T28, T21); + T2l = FNMS(KP923879532, T28, T21); + T2f = FMA(KP707106781, T2e, T2d); + T2i = T2g - T2h; + T2j = FNMS(KP923879532, T2i, T2f); + T2n = FMA(KP923879532, T2i, T2f); + } + { + E T2a, T2k, T2m, T2o; + T2a = T1Y * T29; + cr[WS(rs, 11)] = FNMS(T2c, T2j, T2a); + T2k = T2c * T29; + ci[WS(rs, 11)] = FMA(T1Y, T2j, T2k); + T2m = Tw * T2l; + cr[WS(rs, 3)] = FNMS(Tz, T2n, T2m); + T2o = Tz * T2l; + ci[WS(rs, 3)] = FMA(Tw, T2n, T2o); + } + } + { + E T1l, T1E, T1B, T1H; + { + E TX, T1k, T1x, T1A; + TX = FNMS(KP707106781, TW, TL); + T1k = T18 - T1j; + T1l = FNMS(KP923879532, T1k, TX); + T1E = FMA(KP923879532, T1k, TX); + T1x = FNMS(KP707106781, T1w, T1t); + T1A = T1y - T1z; + T1B = FNMS(KP923879532, T1A, T1x); + T1H = FMA(KP923879532, T1A, T1x); + } + { + E T1m, T1C, T1F, T1I; + T1m = TG * T1l; + cr[WS(rs, 13)] = FNMS(T1o, T1B, T1m); + T1C = T1o * T1l; + ci[WS(rs, 13)] = FMA(TG, T1B, T1C); + T1F = T1D * T1E; + cr[WS(rs, 5)] = FNMS(T1G, T1H, T1F); + T1I = T1G * T1E; + ci[WS(rs, 5)] = FMA(T1D, T1H, T1I); + } + } + { + E T2s, T2A, T2x, T2D; + { + E T2q, T2r, T2v, T2w; + T2q = FMA(KP707106781, T20, T1Z); + T2r = T2g + T2h; + T2s = FNMS(KP923879532, T2r, T2q); + T2A = FMA(KP923879532, T2r, T2q); + T2v = FNMS(KP707106781, T2e, T2d); + T2w = T27 - T24; + T2x = FMA(KP923879532, T2w, T2v); + T2D = FNMS(KP923879532, T2w, T2v); + } + { + E T2t, T2y, T2B, T2E; + T2t = T2p * T2s; + cr[WS(rs, 7)] = FNMS(T2u, T2x, T2t); + T2y = T2p * T2x; + ci[WS(rs, 7)] = FMA(T2u, T2s, T2y); + T2B = T2z * T2A; + cr[WS(rs, 15)] = FNMS(T2C, T2D, T2B); + T2E = T2z * T2D; + ci[WS(rs, 15)] = FMA(T2C, T2A, T2E); + } + } + { + E T1L, T1R, T1P, T1T; + { + E T1J, T1K, T1N, T1O; + T1J = FMA(KP707106781, TW, TL); + T1K = T1y + T1z; + T1L = FNMS(KP923879532, T1K, T1J); + T1R = FMA(KP923879532, T1K, T1J); + T1N = FMA(KP707106781, T1w, T1t); + T1O = T1j + T18; + T1P = FNMS(KP923879532, T1O, T1N); + T1T = FMA(KP923879532, T1O, T1N); + } + { + E T1M, T1Q, T1S, T1U; + T1M = TB * T1L; + cr[WS(rs, 9)] = FNMS(TF, T1P, T1M); + T1Q = TB * T1P; + ci[WS(rs, 9)] = FMA(TF, T1L, T1Q); + T1S = Tv * T1R; + cr[WS(rs, 1)] = FNMS(Ty, T1T, T1S); + T1U = Tv * T1T; + ci[WS(rs, 1)] = FMA(Ty, T1R, T1U); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hb2_16", twinstr, &GENUS, {104, 42, 92, 0} }; + +void X(codelet_hb2_16) (planner *p) { + X(khc2hc_register) (p, hb2_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 16 -dif -name hb2_16 -include rdft/scalar/hb.h */ + +/* + * This function contains 196 FP additions, 108 FP multiplications, + * (or, 156 additions, 68 multiplications, 40 fused multiply/add), + * 80 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tv, Ty, T1l, T1n, T1p, T1t, T27, T25, Tz, Tw, TB, T21, T1P, T1H, T1X; + E T17, T1L, T1N, T1v, T1w, T1x, T1B, T2F, T2T, T2b, T2R, T3j, T3x, T35, T3t; + { + E TA, T1J, T15, T1G, Tx, T1K, T16, T1F; + { + E T1m, T1s, T1o, T1r; + Tv = W[0]; + Ty = W[1]; + T1l = W[2]; + T1n = W[3]; + T1m = Tv * T1l; + T1s = Ty * T1l; + T1o = Ty * T1n; + T1r = Tv * T1n; + T1p = T1m + T1o; + T1t = T1r - T1s; + T27 = T1r + T1s; + T25 = T1m - T1o; + Tz = W[5]; + TA = Ty * Tz; + T1J = T1l * Tz; + T15 = Tv * Tz; + T1G = T1n * Tz; + Tw = W[4]; + Tx = Tv * Tw; + T1K = T1n * Tw; + T16 = Ty * Tw; + T1F = T1l * Tw; + } + TB = Tx - TA; + T21 = T1J + T1K; + T1P = T15 - T16; + T1H = T1F + T1G; + T1X = T1F - T1G; + T17 = T15 + T16; + T1L = T1J - T1K; + T1N = Tx + TA; + T1v = W[6]; + T1w = W[7]; + T1x = FMA(Tv, T1v, Ty * T1w); + T1B = FNMS(Ty, T1v, Tv * T1w); + { + E T2D, T2E, T29, T2a; + T2D = T25 * Tz; + T2E = T27 * Tw; + T2F = T2D + T2E; + T2T = T2D - T2E; + T29 = T25 * Tw; + T2a = T27 * Tz; + T2b = T29 - T2a; + T2R = T29 + T2a; + } + { + E T3h, T3i, T33, T34; + T3h = T1p * Tz; + T3i = T1t * Tw; + T3j = T3h + T3i; + T3x = T3h - T3i; + T33 = T1p * Tw; + T34 = T1t * Tz; + T35 = T33 - T34; + T3t = T33 + T34; + } + } + { + E T7, T36, T3k, TC, T1f, T2e, T2I, T1Q, Te, TJ, T1R, T18, T2L, T37, T2l; + E T3l, Tm, T1T, TT, T1h, T2A, T2N, T3b, T3n, Tt, T1U, T12, T1i, T2t, T2O; + E T3e, T3o; + { + E T3, T2c, T1e, T2d, T6, T2G, T1b, T2H; + { + E T1, T2, T1c, T1d; + T1 = cr[0]; + T2 = ci[WS(rs, 7)]; + T3 = T1 + T2; + T2c = T1 - T2; + T1c = ci[WS(rs, 11)]; + T1d = cr[WS(rs, 12)]; + T1e = T1c - T1d; + T2d = T1c + T1d; + } + { + E T4, T5, T19, T1a; + T4 = cr[WS(rs, 4)]; + T5 = ci[WS(rs, 3)]; + T6 = T4 + T5; + T2G = T4 - T5; + T19 = ci[WS(rs, 15)]; + T1a = cr[WS(rs, 8)]; + T1b = T19 - T1a; + T2H = T19 + T1a; + } + T7 = T3 + T6; + T36 = T2c + T2d; + T3k = T2H - T2G; + TC = T3 - T6; + T1f = T1b - T1e; + T2e = T2c - T2d; + T2I = T2G + T2H; + T1Q = T1b + T1e; + } + { + E Ta, T2f, TI, T2g, Td, T2i, TF, T2j; + { + E T8, T9, TG, TH; + T8 = cr[WS(rs, 2)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + T2f = T8 - T9; + TG = ci[WS(rs, 13)]; + TH = cr[WS(rs, 10)]; + TI = TG - TH; + T2g = TG + TH; + } + { + E Tb, Tc, TD, TE; + Tb = ci[WS(rs, 1)]; + Tc = cr[WS(rs, 6)]; + Td = Tb + Tc; + T2i = Tb - Tc; + TD = ci[WS(rs, 9)]; + TE = cr[WS(rs, 14)]; + TF = TD - TE; + T2j = TD + TE; + } + Te = Ta + Td; + TJ = TF - TI; + T1R = TI + TF; + T18 = Ta - Td; + { + E T2J, T2K, T2h, T2k; + T2J = T2f + T2g; + T2K = T2i + T2j; + T2L = KP707106781 * (T2J - T2K); + T37 = KP707106781 * (T2J + T2K); + T2h = T2f - T2g; + T2k = T2i - T2j; + T2l = KP707106781 * (T2h + T2k); + T3l = KP707106781 * (T2h - T2k); + } + } + { + E Ti, T2x, TR, T2y, Tl, T2u, TO, T2v, TL, TS; + { + E Tg, Th, TP, TQ; + Tg = cr[WS(rs, 1)]; + Th = ci[WS(rs, 6)]; + Ti = Tg + Th; + T2x = Tg - Th; + TP = ci[WS(rs, 10)]; + TQ = cr[WS(rs, 13)]; + TR = TP - TQ; + T2y = TP + TQ; + } + { + E Tj, Tk, TM, TN; + Tj = cr[WS(rs, 5)]; + Tk = ci[WS(rs, 2)]; + Tl = Tj + Tk; + T2u = Tj - Tk; + TM = ci[WS(rs, 14)]; + TN = cr[WS(rs, 9)]; + TO = TM - TN; + T2v = TM + TN; + } + Tm = Ti + Tl; + T1T = TO + TR; + TL = Ti - Tl; + TS = TO - TR; + TT = TL - TS; + T1h = TL + TS; + { + E T2w, T2z, T39, T3a; + T2w = T2u + T2v; + T2z = T2x - T2y; + T2A = FMA(KP923879532, T2w, KP382683432 * T2z); + T2N = FNMS(KP382683432, T2w, KP923879532 * T2z); + T39 = T2x + T2y; + T3a = T2v - T2u; + T3b = FNMS(KP923879532, T3a, KP382683432 * T39); + T3n = FMA(KP382683432, T3a, KP923879532 * T39); + } + } + { + E Tp, T2q, T10, T2r, Ts, T2n, TX, T2o, TU, T11; + { + E Tn, To, TY, TZ; + Tn = ci[0]; + To = cr[WS(rs, 7)]; + Tp = Tn + To; + T2q = Tn - To; + TY = ci[WS(rs, 12)]; + TZ = cr[WS(rs, 11)]; + T10 = TY - TZ; + T2r = TY + TZ; + } + { + E Tq, Tr, TV, TW; + Tq = cr[WS(rs, 3)]; + Tr = ci[WS(rs, 4)]; + Ts = Tq + Tr; + T2n = Tq - Tr; + TV = ci[WS(rs, 8)]; + TW = cr[WS(rs, 15)]; + TX = TV - TW; + T2o = TV + TW; + } + Tt = Tp + Ts; + T1U = TX + T10; + TU = Tp - Ts; + T11 = TX - T10; + T12 = TU + T11; + T1i = T11 - TU; + { + E T2p, T2s, T3c, T3d; + T2p = T2n - T2o; + T2s = T2q - T2r; + T2t = FNMS(KP382683432, T2s, KP923879532 * T2p); + T2O = FMA(KP382683432, T2p, KP923879532 * T2s); + T3c = T2q + T2r; + T3d = T2n + T2o; + T3e = FNMS(KP923879532, T3d, KP382683432 * T3c); + T3o = FMA(KP382683432, T3d, KP923879532 * T3c); + } + } + { + E Tf, Tu, T1O, T1S, T1V, T1W; + Tf = T7 + Te; + Tu = Tm + Tt; + T1O = Tf - Tu; + T1S = T1Q + T1R; + T1V = T1T + T1U; + T1W = T1S - T1V; + cr[0] = Tf + Tu; + ci[0] = T1S + T1V; + cr[WS(rs, 8)] = FNMS(T1P, T1W, T1N * T1O); + ci[WS(rs, 8)] = FMA(T1P, T1O, T1N * T1W); + } + { + E T3g, T3r, T3q, T3s; + { + E T38, T3f, T3m, T3p; + T38 = T36 - T37; + T3f = T3b + T3e; + T3g = T38 - T3f; + T3r = T38 + T3f; + T3m = T3k + T3l; + T3p = T3n - T3o; + T3q = T3m - T3p; + T3s = T3m + T3p; + } + cr[WS(rs, 11)] = FNMS(T3j, T3q, T35 * T3g); + ci[WS(rs, 11)] = FMA(T3j, T3g, T35 * T3q); + cr[WS(rs, 3)] = FNMS(T1n, T3s, T1l * T3r); + ci[WS(rs, 3)] = FMA(T1n, T3r, T1l * T3s); + } + { + E T3w, T3B, T3A, T3C; + { + E T3u, T3v, T3y, T3z; + T3u = T36 + T37; + T3v = T3n + T3o; + T3w = T3u - T3v; + T3B = T3u + T3v; + T3y = T3k - T3l; + T3z = T3b - T3e; + T3A = T3y + T3z; + T3C = T3y - T3z; + } + cr[WS(rs, 7)] = FNMS(T3x, T3A, T3t * T3w); + ci[WS(rs, 7)] = FMA(T3t, T3A, T3x * T3w); + cr[WS(rs, 15)] = FNMS(T1w, T3C, T1v * T3B); + ci[WS(rs, 15)] = FMA(T1v, T3C, T1w * T3B); + } + { + E T14, T1q, T1k, T1u; + { + E TK, T13, T1g, T1j; + TK = TC + TJ; + T13 = KP707106781 * (TT + T12); + T14 = TK - T13; + T1q = TK + T13; + T1g = T18 + T1f; + T1j = KP707106781 * (T1h + T1i); + T1k = T1g - T1j; + T1u = T1g + T1j; + } + cr[WS(rs, 10)] = FNMS(T17, T1k, TB * T14); + ci[WS(rs, 10)] = FMA(T17, T14, TB * T1k); + cr[WS(rs, 2)] = FNMS(T1t, T1u, T1p * T1q); + ci[WS(rs, 2)] = FMA(T1t, T1q, T1p * T1u); + } + { + E T1A, T1I, T1E, T1M; + { + E T1y, T1z, T1C, T1D; + T1y = TC - TJ; + T1z = KP707106781 * (T1i - T1h); + T1A = T1y - T1z; + T1I = T1y + T1z; + T1C = T1f - T18; + T1D = KP707106781 * (TT - T12); + T1E = T1C - T1D; + T1M = T1C + T1D; + } + cr[WS(rs, 14)] = FNMS(T1B, T1E, T1x * T1A); + ci[WS(rs, 14)] = FMA(T1x, T1E, T1B * T1A); + cr[WS(rs, 6)] = FNMS(T1L, T1M, T1H * T1I); + ci[WS(rs, 6)] = FMA(T1H, T1M, T1L * T1I); + } + { + E T2C, T2S, T2Q, T2U; + { + E T2m, T2B, T2M, T2P; + T2m = T2e - T2l; + T2B = T2t - T2A; + T2C = T2m - T2B; + T2S = T2m + T2B; + T2M = T2I - T2L; + T2P = T2N - T2O; + T2Q = T2M - T2P; + T2U = T2M + T2P; + } + cr[WS(rs, 13)] = FNMS(T2F, T2Q, T2b * T2C); + ci[WS(rs, 13)] = FMA(T2F, T2C, T2b * T2Q); + cr[WS(rs, 5)] = FNMS(T2T, T2U, T2R * T2S); + ci[WS(rs, 5)] = FMA(T2T, T2S, T2R * T2U); + } + { + E T2X, T31, T30, T32; + { + E T2V, T2W, T2Y, T2Z; + T2V = T2e + T2l; + T2W = T2N + T2O; + T2X = T2V - T2W; + T31 = T2V + T2W; + T2Y = T2I + T2L; + T2Z = T2A + T2t; + T30 = T2Y - T2Z; + T32 = T2Y + T2Z; + } + cr[WS(rs, 9)] = FNMS(Tz, T30, Tw * T2X); + ci[WS(rs, 9)] = FMA(Tw, T30, Tz * T2X); + cr[WS(rs, 1)] = FNMS(Ty, T32, Tv * T31); + ci[WS(rs, 1)] = FMA(Tv, T32, Ty * T31); + } + { + E T20, T26, T24, T28; + { + E T1Y, T1Z, T22, T23; + T1Y = T7 - Te; + T1Z = T1U - T1T; + T20 = T1Y - T1Z; + T26 = T1Y + T1Z; + T22 = T1Q - T1R; + T23 = Tm - Tt; + T24 = T22 - T23; + T28 = T23 + T22; + } + cr[WS(rs, 12)] = FNMS(T21, T24, T1X * T20); + ci[WS(rs, 12)] = FMA(T1X, T24, T21 * T20); + cr[WS(rs, 4)] = FNMS(T27, T28, T25 * T26); + ci[WS(rs, 4)] = FMA(T25, T28, T27 * T26); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hb2_16", twinstr, &GENUS, {156, 68, 40, 0} }; + +void X(codelet_hb2_16) (planner *p) { + X(khc2hc_register) (p, hb2_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_20.c new file mode 100644 index 000000000..963a9d242 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_20.c @@ -0,0 +1,1087 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:40 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 20 -dif -name hb2_20 -include rdft/scalar/hb.h */ + +/* + * This function contains 276 FP additions, 198 FP multiplications, + * (or, 136 additions, 58 multiplications, 140 fused multiply/add), + * 129 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(40, rs)) { + E TD, TH, TE, T1L, T1N, T1X, TG, T29, TI, T2b, T1V, T1O, T24, T36, T5b; + E T1S, T1Y, T3b, T3e, T2o, T2Y, T2U, T31, T2s, T4y, T4u, T2f, T2c, T2g, T5g; + E T2k, T1s, T48, T4c, T5q, T5m, T4k, T4f; + { + E T1r, T1M, T2T, T1R, T2X, T23, T2r, T1W, T2n, T2a, TF, T4x; + TD = W[0]; + TH = W[3]; + TE = W[2]; + TF = TD * TE; + T1r = TD * TH; + T1L = W[6]; + T1M = TD * T1L; + T2T = TE * T1L; + T1N = W[7]; + T1R = TD * T1N; + T2X = TE * T1N; + T1X = W[5]; + T23 = TE * T1X; + T2r = TD * T1X; + TG = W[1]; + T29 = FNMS(TG, TH, TF); + TI = FMA(TG, TH, TF); + T2b = FMA(TG, TE, T1r); + T1V = W[4]; + T1W = TE * T1V; + T2n = TD * T1V; + T2a = T29 * T1V; + T1O = FMA(TG, T1N, T1M); + T24 = FNMS(TH, T1V, T23); + T36 = FNMS(TG, T1V, T2r); + T5b = FNMS(T2b, T1X, T2a); + T1S = FNMS(TG, T1L, T1R); + T1Y = FMA(TH, T1X, T1W); + T3b = FNMS(TH, T1X, T1W); + T3e = FMA(TH, T1V, T23); + T2o = FNMS(TG, T1X, T2n); + T2Y = FNMS(TH, T1L, T2X); + T2U = FMA(TH, T1N, T2T); + T31 = FMA(TG, T1X, T2n); + T2s = FMA(TG, T1V, T2r); + T4x = T29 * T1N; + T4y = FNMS(T2b, T1L, T4x); + { + E T4t, T2e, T2d, T2j; + T4t = T29 * T1L; + T4u = FMA(T2b, T1N, T4t); + T2e = T29 * T1X; + T2f = FNMS(T2b, T1V, T2e); + T2c = FMA(T2b, T1X, T2a); + T2d = T2c * T1L; + T2j = T2c * T1N; + T2g = FMA(T2f, T1N, T2d); + T5g = FMA(T2b, T1V, T2e); + T2k = FNMS(T2f, T1L, T2j); + { + E T47, T5p, T4b, T5l; + T47 = TI * T1V; + T5p = TI * T1N; + T4b = TI * T1X; + T5l = TI * T1L; + T1s = FNMS(TG, TE, T1r); + T48 = FMA(T1s, T1X, T47); + T4c = FNMS(T1s, T1V, T4b); + T5q = FNMS(T1s, T1L, T5p); + T5m = FMA(T1s, T1N, T5l); + T4k = FMA(T1s, T1V, T4b); + T4f = FNMS(T1s, T1X, T47); + } + } + } + { + E T7, T4B, T4V, TJ, T1z, T3j, T3V, T2H, T18, T42, T43, T1n, T2D, T53, T52; + E T2A, T1H, T4R, T4O, T1G, T2O, T3I, T2P, T3P, T2I, T2J, T2K, T1A, T1B, T1C; + E TC, T2w, T3Y, T40, T4I, T4K, TQ, TS, T3y, T3A, T4Y, T50; + { + E T3, T3h, T1y, T3i, T6, T3U, T1v, T3T; + { + E T1, T2, T1w, T1x; + T1 = cr[0]; + T2 = ci[WS(rs, 9)]; + T3 = T1 + T2; + T3h = T1 - T2; + T1w = ci[WS(rs, 14)]; + T1x = cr[WS(rs, 15)]; + T1y = T1w - T1x; + T3i = T1w + T1x; + } + { + E T4, T5, T1t, T1u; + T4 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 4)]; + T6 = T4 + T5; + T3U = T4 - T5; + T1t = ci[WS(rs, 19)]; + T1u = cr[WS(rs, 10)]; + T1v = T1t - T1u; + T3T = T1t + T1u; + } + T7 = T3 + T6; + T4B = T3h - T3i; + T4V = T3U + T3T; + TJ = T3 - T6; + T1z = T1v - T1y; + T3j = T3h + T3i; + T3V = T3T - T3U; + T2H = T1v + T1y; + } + { + E Te, T4C, T4M, TK, T1f, T3m, T3L, T2y, TA, T4G, T4Q, TO, T17, T3w, T3H; + E T2C, Tl, T4D, T4N, TL, T1m, T3p, T3O, T2z, Tt, T4F, T4P, TN, T10, T3t; + E T3E, T2B; + { + E Ta, T3k, T1e, T3l, Td, T3K, T1b, T3J; + { + E T8, T9, T1c, T1d; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + T3k = T8 - T9; + T1c = ci[WS(rs, 10)]; + T1d = cr[WS(rs, 19)]; + T1e = T1c - T1d; + T3l = T1c + T1d; + } + { + E Tb, Tc, T19, T1a; + Tb = cr[WS(rs, 9)]; + Tc = ci[0]; + Td = Tb + Tc; + T3K = Tb - Tc; + T19 = ci[WS(rs, 15)]; + T1a = cr[WS(rs, 14)]; + T1b = T19 - T1a; + T3J = T19 + T1a; + } + Te = Ta + Td; + T4C = T3k - T3l; + T4M = T3K + T3J; + TK = Ta - Td; + T1f = T1b - T1e; + T3m = T3k + T3l; + T3L = T3J - T3K; + T2y = T1b + T1e; + } + { + E Tw, T3u, Tz, T3F, T13, T3G, T16, T3v; + { + E Tu, Tv, Tx, Ty; + Tu = ci[WS(rs, 7)]; + Tv = cr[WS(rs, 2)]; + Tw = Tu + Tv; + T3u = Tu - Tv; + Tx = ci[WS(rs, 2)]; + Ty = cr[WS(rs, 7)]; + Tz = Tx + Ty; + T3F = Tx - Ty; + } + { + E T11, T12, T14, T15; + T11 = ci[WS(rs, 17)]; + T12 = cr[WS(rs, 12)]; + T13 = T11 - T12; + T3G = T11 + T12; + T14 = ci[WS(rs, 12)]; + T15 = cr[WS(rs, 17)]; + T16 = T14 - T15; + T3v = T14 + T15; + } + TA = Tw + Tz; + T4G = T3u + T3v; + T4Q = T3F - T3G; + TO = Tw - Tz; + T17 = T13 - T16; + T3w = T3u - T3v; + T3H = T3F + T3G; + T2C = T13 + T16; + } + { + E Th, T3n, T1l, T3o, Tk, T3M, T1i, T3N; + { + E Tf, Tg, T1j, T1k; + Tf = ci[WS(rs, 3)]; + Tg = cr[WS(rs, 6)]; + Th = Tf + Tg; + T3n = Tf - Tg; + T1j = ci[WS(rs, 18)]; + T1k = cr[WS(rs, 11)]; + T1l = T1j - T1k; + T3o = T1j + T1k; + } + { + E Ti, Tj, T1g, T1h; + Ti = cr[WS(rs, 1)]; + Tj = ci[WS(rs, 8)]; + Tk = Ti + Tj; + T3M = Ti - Tj; + T1g = ci[WS(rs, 13)]; + T1h = cr[WS(rs, 16)]; + T1i = T1g - T1h; + T3N = T1g + T1h; + } + Tl = Th + Tk; + T4D = T3n - T3o; + T4N = T3M - T3N; + TL = Th - Tk; + T1m = T1i - T1l; + T3p = T3n + T3o; + T3O = T3M + T3N; + T2z = T1i + T1l; + } + { + E Tp, T3r, TZ, T3s, Ts, T3D, TW, T3C; + { + E Tn, To, TX, TY; + Tn = cr[WS(rs, 8)]; + To = ci[WS(rs, 1)]; + Tp = Tn + To; + T3r = Tn - To; + TX = ci[WS(rs, 16)]; + TY = cr[WS(rs, 13)]; + TZ = TX - TY; + T3s = TX + TY; + } + { + E Tq, Tr, TU, TV; + Tq = ci[WS(rs, 6)]; + Tr = cr[WS(rs, 3)]; + Ts = Tq + Tr; + T3D = Tq - Tr; + TU = ci[WS(rs, 11)]; + TV = cr[WS(rs, 18)]; + TW = TU - TV; + T3C = TU + TV; + } + Tt = Tp + Ts; + T4F = T3r + T3s; + T4P = T3D + T3C; + TN = Tp - Ts; + T10 = TW - TZ; + T3t = T3r - T3s; + T3E = T3C - T3D; + T2B = TW + TZ; + } + T18 = T10 - T17; + T42 = T3t - T3w; + T43 = T3m - T3p; + T1n = T1f - T1m; + T2D = T2B - T2C; + T53 = T4F - T4G; + T52 = T4C - T4D; + T2A = T2y - T2z; + T1H = TK - TL; + T4R = T4P - T4Q; + T4O = T4M - T4N; + T1G = TN - TO; + T2O = Te - Tl; + T3I = T3E + T3H; + T2P = Tt - TA; + T3P = T3L + T3O; + T2I = T2y + T2z; + T2J = T2B + T2C; + T2K = T2I + T2J; + T1A = T1f + T1m; + T1B = T10 + T17; + T1C = T1A + T1B; + { + E Tm, TB, TM, TP; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T2w = Tm - TB; + { + E T3W, T3X, T4E, T4H; + T3W = T3L - T3O; + T3X = T3E - T3H; + T3Y = T3W + T3X; + T40 = T3W - T3X; + T4E = T4C + T4D; + T4H = T4F + T4G; + T4I = T4E + T4H; + T4K = T4E - T4H; + } + TM = TK + TL; + TP = TN + TO; + TQ = TM + TP; + TS = TM - TP; + { + E T3q, T3x, T4W, T4X; + T3q = T3m + T3p; + T3x = T3t + T3w; + T3y = T3q + T3x; + T3A = T3q - T3x; + T4W = T4M + T4N; + T4X = T4P + T4Q; + T4Y = T4W + T4X; + T50 = T4W - T4X; + } + } + } + cr[0] = T7 + TC; + ci[0] = T2H + T2K; + { + E T2t, T2q, T2u, T2p; + T2t = T1z + T1C; + T2p = TJ + TQ; + T2q = T2o * T2p; + T2u = T2s * T2p; + cr[WS(rs, 10)] = FNMS(T2s, T2t, T2q); + ci[WS(rs, 10)] = FMA(T2o, T2t, T2u); + } + { + E T5t, T5u, T5v, T5w; + T5t = T4B + T4I; + T5u = T2c * T5t; + T5v = T4V + T4Y; + T5w = T2c * T5v; + cr[WS(rs, 5)] = FNMS(T2f, T5v, T5u); + ci[WS(rs, 5)] = FMA(T2f, T5t, T5w); + } + { + E T4v, T4w, T4z, T4A; + T4v = T3j + T3y; + T4w = T4u * T4v; + T4z = T3V + T3Y; + T4A = T4u * T4z; + cr[WS(rs, 15)] = FNMS(T4y, T4z, T4w); + ci[WS(rs, 15)] = FMA(T4y, T4v, T4A); + } + { + E T3R, T4p, T49, T4i, T45, T4r, T4d, T4n; + { + E T3Q, T4h, T3B, T4g, T3z; + T3Q = FNMS(KP618033988, T3P, T3I); + T4h = FMA(KP618033988, T3I, T3P); + T3z = FNMS(KP250000000, T3y, T3j); + T3B = FNMS(KP559016994, T3A, T3z); + T4g = FMA(KP559016994, T3A, T3z); + T3R = FNMS(KP951056516, T3Q, T3B); + T4p = FMA(KP951056516, T4h, T4g); + T49 = FMA(KP951056516, T3Q, T3B); + T4i = FNMS(KP951056516, T4h, T4g); + } + { + E T44, T4m, T41, T4l, T3Z; + T44 = FNMS(KP618033988, T43, T42); + T4m = FMA(KP618033988, T42, T43); + T3Z = FNMS(KP250000000, T3Y, T3V); + T41 = FNMS(KP559016994, T40, T3Z); + T4l = FMA(KP559016994, T40, T3Z); + T45 = FMA(KP951056516, T44, T41); + T4r = FNMS(KP951056516, T4m, T4l); + T4d = FNMS(KP951056516, T44, T41); + T4n = FMA(KP951056516, T4m, T4l); + } + { + E T3S, T46, T4a, T4e; + T3S = TE * T3R; + cr[WS(rs, 3)] = FNMS(TH, T45, T3S); + T46 = TE * T45; + ci[WS(rs, 3)] = FMA(TH, T3R, T46); + T4a = T48 * T49; + cr[WS(rs, 7)] = FNMS(T4c, T4d, T4a); + T4e = T48 * T4d; + ci[WS(rs, 7)] = FMA(T4c, T49, T4e); + } + { + E T4j, T4o, T4q, T4s; + T4j = T4f * T4i; + cr[WS(rs, 11)] = FNMS(T4k, T4n, T4j); + T4o = T4f * T4n; + ci[WS(rs, 11)] = FMA(T4k, T4i, T4o); + T4q = T1L * T4p; + cr[WS(rs, 19)] = FNMS(T1N, T4r, T4q); + T4s = T1L * T4r; + ci[WS(rs, 19)] = FMA(T1N, T4p, T4s); + } + } + { + E T4T, T5n, T57, T5e, T55, T5r, T59, T5j; + { + E T4S, T5d, T4L, T5c, T4J; + T4S = FMA(KP618033988, T4R, T4O); + T5d = FNMS(KP618033988, T4O, T4R); + T4J = FNMS(KP250000000, T4I, T4B); + T4L = FMA(KP559016994, T4K, T4J); + T5c = FNMS(KP559016994, T4K, T4J); + T4T = FNMS(KP951056516, T4S, T4L); + T5n = FMA(KP951056516, T5d, T5c); + T57 = FMA(KP951056516, T4S, T4L); + T5e = FNMS(KP951056516, T5d, T5c); + } + { + E T54, T5i, T51, T5h, T4Z; + T54 = FMA(KP618033988, T53, T52); + T5i = FNMS(KP618033988, T52, T53); + T4Z = FNMS(KP250000000, T4Y, T4V); + T51 = FMA(KP559016994, T50, T4Z); + T5h = FNMS(KP559016994, T50, T4Z); + T55 = FMA(KP951056516, T54, T51); + T5r = FNMS(KP951056516, T5i, T5h); + T59 = FNMS(KP951056516, T54, T51); + T5j = FMA(KP951056516, T5i, T5h); + } + { + E T4U, T56, T58, T5a; + T4U = TD * T4T; + cr[WS(rs, 1)] = FNMS(TG, T55, T4U); + T56 = TD * T55; + ci[WS(rs, 1)] = FMA(TG, T4T, T56); + T58 = T1V * T57; + cr[WS(rs, 9)] = FNMS(T1X, T59, T58); + T5a = T1V * T59; + ci[WS(rs, 9)] = FMA(T1X, T57, T5a); + } + { + E T5f, T5k, T5o, T5s; + T5f = T5b * T5e; + cr[WS(rs, 13)] = FNMS(T5g, T5j, T5f); + T5k = T5b * T5j; + ci[WS(rs, 13)] = FMA(T5g, T5e, T5k); + T5o = T5m * T5n; + cr[WS(rs, 17)] = FNMS(T5q, T5r, T5o); + T5s = T5m * T5r; + ci[WS(rs, 17)] = FMA(T5q, T5n, T5s); + } + } + { + E T2Q, T38, T2N, T37, T2F, T3c, T2V, T34, T2L, T2M; + T2Q = FMA(KP618033988, T2P, T2O); + T38 = FNMS(KP618033988, T2O, T2P); + T2L = FNMS(KP250000000, T2K, T2H); + T2M = T2I - T2J; + T2N = FMA(KP559016994, T2M, T2L); + T37 = FNMS(KP559016994, T2M, T2L); + { + E T2E, T33, T2x, T32, T2v; + T2E = FMA(KP618033988, T2D, T2A); + T33 = FNMS(KP618033988, T2A, T2D); + T2v = FNMS(KP250000000, TC, T7); + T2x = FMA(KP559016994, T2w, T2v); + T32 = FNMS(KP559016994, T2w, T2v); + T2F = FMA(KP951056516, T2E, T2x); + T3c = FMA(KP951056516, T33, T32); + T2V = FNMS(KP951056516, T2E, T2x); + T34 = FNMS(KP951056516, T33, T32); + } + { + E T2G, T2S, T2R, T3d, T3g, T3f; + T2G = T29 * T2F; + T2S = T2b * T2F; + T2R = FNMS(KP951056516, T2Q, T2N); + cr[WS(rs, 4)] = FNMS(T2b, T2R, T2G); + ci[WS(rs, 4)] = FMA(T29, T2R, T2S); + T3d = T3b * T3c; + T3g = T3e * T3c; + T3f = FNMS(KP951056516, T38, T37); + cr[WS(rs, 12)] = FNMS(T3e, T3f, T3d); + ci[WS(rs, 12)] = FMA(T3b, T3f, T3g); + } + { + E T2W, T30, T2Z, T35, T3a, T39; + T2W = T2U * T2V; + T30 = T2Y * T2V; + T2Z = FMA(KP951056516, T2Q, T2N); + cr[WS(rs, 16)] = FNMS(T2Y, T2Z, T2W); + ci[WS(rs, 16)] = FMA(T2U, T2Z, T30); + T35 = T31 * T34; + T3a = T36 * T34; + T39 = FMA(KP951056516, T38, T37); + cr[WS(rs, 8)] = FNMS(T36, T39, T35); + ci[WS(rs, 8)] = FMA(T31, T39, T3a); + } + } + { + E T1I, T26, T1F, T25, T1p, T2h, T1P, T21, T1D, T1E; + T1I = FNMS(KP618033988, T1H, T1G); + T26 = FMA(KP618033988, T1G, T1H); + T1D = FNMS(KP250000000, T1C, T1z); + T1E = T1A - T1B; + T1F = FNMS(KP559016994, T1E, T1D); + T25 = FMA(KP559016994, T1E, T1D); + { + E T1o, T20, TT, T1Z, TR; + T1o = FNMS(KP618033988, T1n, T18); + T20 = FMA(KP618033988, T18, T1n); + TR = FNMS(KP250000000, TQ, TJ); + TT = FNMS(KP559016994, TS, TR); + T1Z = FMA(KP559016994, TS, TR); + T1p = FMA(KP951056516, T1o, TT); + T2h = FMA(KP951056516, T20, T1Z); + T1P = FNMS(KP951056516, T1o, TT); + T21 = FNMS(KP951056516, T20, T1Z); + } + { + E T1q, T1K, T1J, T2i, T2m, T2l; + T1q = TI * T1p; + T1K = T1s * T1p; + T1J = FNMS(KP951056516, T1I, T1F); + cr[WS(rs, 2)] = FNMS(T1s, T1J, T1q); + ci[WS(rs, 2)] = FMA(TI, T1J, T1K); + T2i = T2g * T2h; + T2m = T2k * T2h; + T2l = FNMS(KP951056516, T26, T25); + cr[WS(rs, 14)] = FNMS(T2k, T2l, T2i); + ci[WS(rs, 14)] = FMA(T2g, T2l, T2m); + } + { + E T1Q, T1U, T1T, T22, T28, T27; + T1Q = T1O * T1P; + T1U = T1S * T1P; + T1T = FMA(KP951056516, T1I, T1F); + cr[WS(rs, 18)] = FNMS(T1S, T1T, T1Q); + ci[WS(rs, 18)] = FMA(T1O, T1T, T1U); + T22 = T1Y * T21; + T28 = T24 * T21; + T27 = FMA(KP951056516, T26, T25); + cr[WS(rs, 6)] = FNMS(T24, T27, T22); + ci[WS(rs, 6)] = FMA(T1Y, T27, T28); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hb2_20", twinstr, &GENUS, {136, 58, 140, 0} }; + +void X(codelet_hb2_20) (planner *p) { + X(khc2hc_register) (p, hb2_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 20 -dif -name hb2_20 -include rdft/scalar/hb.h */ + +/* + * This function contains 276 FP additions, 164 FP multiplications, + * (or, 204 additions, 92 multiplications, 72 fused multiply/add), + * 137 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(40, rs)) { + E TD, TG, TE, TH, TJ, T1t, T27, T25, T1T, T1R, T1V, T2j, T2Z, T21, T2X; + E T2T, T2n, T2P, T3V, T41, T3R, T3X, T29, T2c, T4H, T4L, T1L, T1M, T1N, T2d; + E T4R, T1P, T4P, T49, T2N, T2f, T47, T2L; + { + E T1U, T2l, T1Z, T2i, T1S, T2m, T20, T2h; + { + E TF, T1s, TI, T1r; + TD = W[0]; + TG = W[1]; + TE = W[2]; + TH = W[3]; + TF = TD * TE; + T1s = TG * TE; + TI = TG * TH; + T1r = TD * TH; + TJ = TF + TI; + T1t = T1r - T1s; + T27 = T1r + T1s; + T25 = TF - TI; + T1T = W[5]; + T1U = TH * T1T; + T2l = TD * T1T; + T1Z = TE * T1T; + T2i = TG * T1T; + T1R = W[4]; + T1S = TE * T1R; + T2m = TG * T1R; + T20 = TH * T1R; + T2h = TD * T1R; + } + T1V = T1S + T1U; + T2j = T2h - T2i; + T2Z = T1Z + T20; + T21 = T1Z - T20; + T2X = T1S - T1U; + T2T = T2l - T2m; + T2n = T2l + T2m; + T2P = T2h + T2i; + { + E T3T, T3U, T3P, T3Q; + T3T = TJ * T1T; + T3U = T1t * T1R; + T3V = T3T - T3U; + T41 = T3T + T3U; + T3P = TJ * T1R; + T3Q = T1t * T1T; + T3R = T3P + T3Q; + T3X = T3P - T3Q; + { + E T26, T28, T2a, T2b; + T26 = T25 * T1R; + T28 = T27 * T1T; + T29 = T26 + T28; + T2a = T25 * T1T; + T2b = T27 * T1R; + T2c = T2a - T2b; + T4H = T26 - T28; + T4L = T2a + T2b; + T1L = W[6]; + T1M = W[7]; + T1N = FMA(TD, T1L, TG * T1M); + T2d = FMA(T29, T1L, T2c * T1M); + T4R = FNMS(T1t, T1L, TJ * T1M); + T1P = FNMS(TG, T1L, TD * T1M); + T4P = FMA(TJ, T1L, T1t * T1M); + T49 = FNMS(T27, T1L, T25 * T1M); + T2N = FNMS(TH, T1L, TE * T1M); + T2f = FNMS(T2c, T1L, T29 * T1M); + T47 = FMA(T25, T1L, T27 * T1M); + T2L = FMA(TE, T1L, TH * T1M); + } + } + } + { + E T7, T4i, T4x, TK, T1D, T3i, T3E, T2D, T19, T3L, T3M, T1o, T2x, T4C, T4B; + E T2u, T1v, T4r, T4o, T1u, T2H, T37, T2I, T3e, T3p, T3w, T3x, Tm, TB, TC; + E T4u, T4v, T4y, T2A, T2B, T2E, T1E, T1F, T1G, T4d, T4g, T4j, T3F, T3G, T3H; + E TN, TQ, TR, T48, T4a; + { + E T3, T3g, T1C, T3h, T6, T3D, T1z, T3C; + { + E T1, T2, T1A, T1B; + T1 = cr[0]; + T2 = ci[WS(rs, 9)]; + T3 = T1 + T2; + T3g = T1 - T2; + T1A = ci[WS(rs, 14)]; + T1B = cr[WS(rs, 15)]; + T1C = T1A - T1B; + T3h = T1A + T1B; + } + { + E T4, T5, T1x, T1y; + T4 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 4)]; + T6 = T4 + T5; + T3D = T4 - T5; + T1x = ci[WS(rs, 19)]; + T1y = cr[WS(rs, 10)]; + T1z = T1x - T1y; + T3C = T1x + T1y; + } + T7 = T3 + T6; + T4i = T3g - T3h; + T4x = T3D + T3C; + TK = T3 - T6; + T1D = T1z - T1C; + T3i = T3g + T3h; + T3E = T3C - T3D; + T2D = T1z + T1C; + } + { + E Te, T4b, T4m, TL, T11, T33, T3l, T2s, TA, T4f, T4q, TP, T1n, T3d, T3v; + E T2w, Tl, T4c, T4n, TM, T18, T36, T3o, T2t, Tt, T4e, T4p, TO, T1g, T3a; + E T3s, T2v; + { + E Ta, T3j, T10, T3k, Td, T32, TX, T31; + { + E T8, T9, TY, TZ; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + T3j = T8 - T9; + TY = ci[WS(rs, 10)]; + TZ = cr[WS(rs, 19)]; + T10 = TY - TZ; + T3k = TY + TZ; + } + { + E Tb, Tc, TV, TW; + Tb = cr[WS(rs, 9)]; + Tc = ci[0]; + Td = Tb + Tc; + T32 = Tb - Tc; + TV = ci[WS(rs, 15)]; + TW = cr[WS(rs, 14)]; + TX = TV - TW; + T31 = TV + TW; + } + Te = Ta + Td; + T4b = T3j - T3k; + T4m = T32 + T31; + TL = Ta - Td; + T11 = TX - T10; + T33 = T31 - T32; + T3l = T3j + T3k; + T2s = TX + T10; + } + { + E Tw, T3t, Tz, T3b, T1j, T3c, T1m, T3u; + { + E Tu, Tv, Tx, Ty; + Tu = ci[WS(rs, 7)]; + Tv = cr[WS(rs, 2)]; + Tw = Tu + Tv; + T3t = Tu - Tv; + Tx = ci[WS(rs, 2)]; + Ty = cr[WS(rs, 7)]; + Tz = Tx + Ty; + T3b = Tx - Ty; + } + { + E T1h, T1i, T1k, T1l; + T1h = ci[WS(rs, 17)]; + T1i = cr[WS(rs, 12)]; + T1j = T1h - T1i; + T3c = T1h + T1i; + T1k = ci[WS(rs, 12)]; + T1l = cr[WS(rs, 17)]; + T1m = T1k - T1l; + T3u = T1k + T1l; + } + TA = Tw + Tz; + T4f = T3t + T3u; + T4q = T3b - T3c; + TP = Tw - Tz; + T1n = T1j - T1m; + T3d = T3b + T3c; + T3v = T3t - T3u; + T2w = T1j + T1m; + } + { + E Th, T3m, T17, T3n, Tk, T34, T14, T35; + { + E Tf, Tg, T15, T16; + Tf = ci[WS(rs, 3)]; + Tg = cr[WS(rs, 6)]; + Th = Tf + Tg; + T3m = Tf - Tg; + T15 = ci[WS(rs, 18)]; + T16 = cr[WS(rs, 11)]; + T17 = T15 - T16; + T3n = T15 + T16; + } + { + E Ti, Tj, T12, T13; + Ti = cr[WS(rs, 1)]; + Tj = ci[WS(rs, 8)]; + Tk = Ti + Tj; + T34 = Ti - Tj; + T12 = ci[WS(rs, 13)]; + T13 = cr[WS(rs, 16)]; + T14 = T12 - T13; + T35 = T12 + T13; + } + Tl = Th + Tk; + T4c = T3m - T3n; + T4n = T34 - T35; + TM = Th - Tk; + T18 = T14 - T17; + T36 = T34 + T35; + T3o = T3m + T3n; + T2t = T14 + T17; + } + { + E Tp, T3q, T1f, T3r, Ts, T39, T1c, T38; + { + E Tn, To, T1d, T1e; + Tn = cr[WS(rs, 8)]; + To = ci[WS(rs, 1)]; + Tp = Tn + To; + T3q = Tn - To; + T1d = ci[WS(rs, 16)]; + T1e = cr[WS(rs, 13)]; + T1f = T1d - T1e; + T3r = T1d + T1e; + } + { + E Tq, Tr, T1a, T1b; + Tq = ci[WS(rs, 6)]; + Tr = cr[WS(rs, 3)]; + Ts = Tq + Tr; + T39 = Tq - Tr; + T1a = ci[WS(rs, 11)]; + T1b = cr[WS(rs, 18)]; + T1c = T1a - T1b; + T38 = T1a + T1b; + } + Tt = Tp + Ts; + T4e = T3q + T3r; + T4p = T39 + T38; + TO = Tp - Ts; + T1g = T1c - T1f; + T3a = T38 - T39; + T3s = T3q - T3r; + T2v = T1c + T1f; + } + T19 = T11 - T18; + T3L = T3l - T3o; + T3M = T3s - T3v; + T1o = T1g - T1n; + T2x = T2v - T2w; + T4C = T4e - T4f; + T4B = T4b - T4c; + T2u = T2s - T2t; + T1v = TO - TP; + T4r = T4p - T4q; + T4o = T4m - T4n; + T1u = TL - TM; + T2H = Te - Tl; + T37 = T33 + T36; + T2I = Tt - TA; + T3e = T3a + T3d; + T3p = T3l + T3o; + T3w = T3s + T3v; + T3x = T3p + T3w; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T4u = T4m + T4n; + T4v = T4p + T4q; + T4y = T4u + T4v; + T2A = T2s + T2t; + T2B = T2v + T2w; + T2E = T2A + T2B; + T1E = T11 + T18; + T1F = T1g + T1n; + T1G = T1E + T1F; + T4d = T4b + T4c; + T4g = T4e + T4f; + T4j = T4d + T4g; + T3F = T33 - T36; + T3G = T3a - T3d; + T3H = T3F + T3G; + TN = TL + TM; + TQ = TO + TP; + TR = TN + TQ; + } + cr[0] = T7 + TC; + ci[0] = T2D + T2E; + { + E T2k, T2o, T4T, T4U; + T2k = TK + TR; + T2o = T1D + T1G; + cr[WS(rs, 10)] = FNMS(T2n, T2o, T2j * T2k); + ci[WS(rs, 10)] = FMA(T2n, T2k, T2j * T2o); + T4T = T4i + T4j; + T4U = T4x + T4y; + cr[WS(rs, 5)] = FNMS(T2c, T4U, T29 * T4T); + ci[WS(rs, 5)] = FMA(T29, T4U, T2c * T4T); + } + T48 = T3i + T3x; + T4a = T3E + T3H; + cr[WS(rs, 15)] = FNMS(T49, T4a, T47 * T48); + ci[WS(rs, 15)] = FMA(T47, T4a, T49 * T48); + { + E T2y, T2J, T2V, T2R, T2G, T2U, T2r, T2Q; + T2y = FMA(KP951056516, T2u, KP587785252 * T2x); + T2J = FMA(KP951056516, T2H, KP587785252 * T2I); + T2V = FNMS(KP951056516, T2I, KP587785252 * T2H); + T2R = FNMS(KP951056516, T2x, KP587785252 * T2u); + { + E T2C, T2F, T2p, T2q; + T2C = KP559016994 * (T2A - T2B); + T2F = FNMS(KP250000000, T2E, T2D); + T2G = T2C + T2F; + T2U = T2F - T2C; + T2p = KP559016994 * (Tm - TB); + T2q = FNMS(KP250000000, TC, T7); + T2r = T2p + T2q; + T2Q = T2q - T2p; + } + { + E T2z, T2K, T2Y, T30; + T2z = T2r + T2y; + T2K = T2G - T2J; + cr[WS(rs, 4)] = FNMS(T27, T2K, T25 * T2z); + ci[WS(rs, 4)] = FMA(T27, T2z, T25 * T2K); + T2Y = T2Q - T2R; + T30 = T2V + T2U; + cr[WS(rs, 12)] = FNMS(T2Z, T30, T2X * T2Y); + ci[WS(rs, 12)] = FMA(T2Z, T2Y, T2X * T30); + } + { + E T2M, T2O, T2S, T2W; + T2M = T2r - T2y; + T2O = T2J + T2G; + cr[WS(rs, 16)] = FNMS(T2N, T2O, T2L * T2M); + ci[WS(rs, 16)] = FMA(T2N, T2M, T2L * T2O); + T2S = T2Q + T2R; + T2W = T2U - T2V; + cr[WS(rs, 8)] = FNMS(T2T, T2W, T2P * T2S); + ci[WS(rs, 8)] = FMA(T2T, T2S, T2P * T2W); + } + } + { + E T4s, T4D, T4N, T4I, T4A, T4M, T4l, T4J; + T4s = FMA(KP951056516, T4o, KP587785252 * T4r); + T4D = FMA(KP951056516, T4B, KP587785252 * T4C); + T4N = FNMS(KP951056516, T4C, KP587785252 * T4B); + T4I = FNMS(KP951056516, T4r, KP587785252 * T4o); + { + E T4w, T4z, T4h, T4k; + T4w = KP559016994 * (T4u - T4v); + T4z = FNMS(KP250000000, T4y, T4x); + T4A = T4w + T4z; + T4M = T4z - T4w; + T4h = KP559016994 * (T4d - T4g); + T4k = FNMS(KP250000000, T4j, T4i); + T4l = T4h + T4k; + T4J = T4k - T4h; + } + { + E T4t, T4E, T4Q, T4S; + T4t = T4l - T4s; + T4E = T4A + T4D; + cr[WS(rs, 1)] = FNMS(TG, T4E, TD * T4t); + ci[WS(rs, 1)] = FMA(TD, T4E, TG * T4t); + T4Q = T4J - T4I; + T4S = T4M + T4N; + cr[WS(rs, 17)] = FNMS(T4R, T4S, T4P * T4Q); + ci[WS(rs, 17)] = FMA(T4P, T4S, T4R * T4Q); + } + { + E T4F, T4G, T4K, T4O; + T4F = T4s + T4l; + T4G = T4A - T4D; + cr[WS(rs, 9)] = FNMS(T1T, T4G, T1R * T4F); + ci[WS(rs, 9)] = FMA(T1R, T4G, T1T * T4F); + T4K = T4I + T4J; + T4O = T4M - T4N; + cr[WS(rs, 13)] = FNMS(T4L, T4O, T4H * T4K); + ci[WS(rs, 13)] = FMA(T4H, T4O, T4L * T4K); + } + } + { + E T1p, T1w, T22, T1X, T1J, T23, TU, T1W; + T1p = FNMS(KP951056516, T1o, KP587785252 * T19); + T1w = FNMS(KP951056516, T1v, KP587785252 * T1u); + T22 = FMA(KP951056516, T1u, KP587785252 * T1v); + T1X = FMA(KP951056516, T19, KP587785252 * T1o); + { + E T1H, T1I, TS, TT; + T1H = FNMS(KP250000000, T1G, T1D); + T1I = KP559016994 * (T1E - T1F); + T1J = T1H - T1I; + T23 = T1I + T1H; + TS = FNMS(KP250000000, TR, TK); + TT = KP559016994 * (TN - TQ); + TU = TS - TT; + T1W = TT + TS; + } + { + E T1q, T1K, T2e, T2g; + T1q = TU - T1p; + T1K = T1w + T1J; + cr[WS(rs, 2)] = FNMS(T1t, T1K, TJ * T1q); + ci[WS(rs, 2)] = FMA(T1t, T1q, TJ * T1K); + T2e = T1W + T1X; + T2g = T23 - T22; + cr[WS(rs, 14)] = FNMS(T2f, T2g, T2d * T2e); + ci[WS(rs, 14)] = FMA(T2f, T2e, T2d * T2g); + } + { + E T1O, T1Q, T1Y, T24; + T1O = TU + T1p; + T1Q = T1J - T1w; + cr[WS(rs, 18)] = FNMS(T1P, T1Q, T1N * T1O); + ci[WS(rs, 18)] = FMA(T1P, T1O, T1N * T1Q); + T1Y = T1W - T1X; + T24 = T22 + T23; + cr[WS(rs, 6)] = FNMS(T21, T24, T1V * T1Y); + ci[WS(rs, 6)] = FMA(T21, T1Y, T1V * T24); + } + } + { + E T3f, T3N, T43, T3Z, T3K, T42, T3A, T3Y; + T3f = FNMS(KP951056516, T3e, KP587785252 * T37); + T3N = FNMS(KP951056516, T3M, KP587785252 * T3L); + T43 = FMA(KP951056516, T3L, KP587785252 * T3M); + T3Z = FMA(KP951056516, T37, KP587785252 * T3e); + { + E T3I, T3J, T3y, T3z; + T3I = FNMS(KP250000000, T3H, T3E); + T3J = KP559016994 * (T3F - T3G); + T3K = T3I - T3J; + T42 = T3J + T3I; + T3y = FNMS(KP250000000, T3x, T3i); + T3z = KP559016994 * (T3p - T3w); + T3A = T3y - T3z; + T3Y = T3z + T3y; + } + { + E T3B, T3O, T45, T46; + T3B = T3f + T3A; + T3O = T3K - T3N; + cr[WS(rs, 3)] = FNMS(TH, T3O, TE * T3B); + ci[WS(rs, 3)] = FMA(TE, T3O, TH * T3B); + T45 = T3Z + T3Y; + T46 = T42 - T43; + cr[WS(rs, 19)] = FNMS(T1M, T46, T1L * T45); + ci[WS(rs, 19)] = FMA(T1L, T46, T1M * T45); + } + { + E T3S, T3W, T40, T44; + T3S = T3A - T3f; + T3W = T3K + T3N; + cr[WS(rs, 7)] = FNMS(T3V, T3W, T3R * T3S); + ci[WS(rs, 7)] = FMA(T3R, T3W, T3V * T3S); + T40 = T3Y - T3Z; + T44 = T42 + T43; + cr[WS(rs, 11)] = FNMS(T41, T44, T3X * T40); + ci[WS(rs, 11)] = FMA(T3X, T44, T41 * T40); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hb2_20", twinstr, &GENUS, {204, 92, 72, 0} }; + +void X(codelet_hb2_20) (planner *p) { + X(khc2hc_register) (p, hb2_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_25.c new file mode 100644 index 000000000..124a737b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_25.c @@ -0,0 +1,1642 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:41 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 25 -dif -name hb2_25 -include rdft/scalar/hb.h */ + +/* + * This function contains 440 FP additions, 434 FP multiplications, + * (or, 84 additions, 78 multiplications, 356 fused multiply/add), + * 206 stack variables, 47 constants, and 100 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(50, rs)) { + E TN, TT, TO, TR, T23, T25, TQ, TS, T4l, TW, T4n, TX, T2e, T2y, T4z; + E T2q, T76, T4o, T8d, T2u, T4e, T4i, T8a, T86, T71, T6Y, T6U, T26, T2a, T3U; + E T8o, T8s, T4B, T4C, T4G, T2k, T5w, T5C, T6E, T5T, T4u, T7g, T7c, T1I, TY; + E T5I, T8i, T5M; + { + E T2x, T2p, T85, T4d, T2t, T89, T4h, TU, T4m, T2j, T3T, TP, TV, T2d, T5v; + E T5B; + TN = W[0]; + TT = W[4]; + TO = W[2]; + TR = W[3]; + TP = TN * TO; + T2x = TO * TT; + TV = TN * TR; + T2d = TN * TT; + T23 = W[6]; + T2p = TT * T23; + T85 = TN * T23; + T4d = TO * T23; + T25 = W[7]; + T2t = TT * T25; + T89 = TN * T25; + T4h = TO * T25; + TQ = W[1]; + TS = FNMS(TQ, TR, TP); + T4l = FMA(TQ, TR, TP); + TU = TS * TT; + T4m = T4l * TT; + TW = FMA(TQ, TO, TV); + T4n = FNMS(TQ, TO, TV); + TX = W[5]; + T2j = TN * TX; + T3T = TO * TX; + T2e = FNMS(TQ, TX, T2d); + T2y = FMA(TR, TX, T2x); + T4z = FMA(TQ, TX, T2d); + T2q = FMA(TX, T25, T2p); + T76 = FMA(TR, TT, T3T); + T4o = FNMS(T4n, TX, T4m); + T8d = FNMS(TW, TX, TU); + T2u = FNMS(TX, T23, T2t); + T4e = FMA(TR, T25, T4d); + T4i = FNMS(TR, T23, T4h); + T8a = FNMS(TQ, T23, T89); + T86 = FMA(TQ, T25, T85); + { + E T6X, T6T, T24, T29; + T71 = FNMS(TR, TX, T2x); + T6X = T4l * T25; + T6Y = FNMS(T4n, T23, T6X); + T6T = T4l * T23; + T6U = FMA(T4n, T25, T6T); + T24 = TS * T23; + T26 = FMA(TW, T25, T24); + T29 = TS * T25; + T2a = FNMS(TW, T23, T29); + } + { + E T8n, T8r, T4A, T4F; + T8n = T2y * T23; + T8r = T2y * T25; + T3U = FNMS(TR, TT, T3T); + T8o = FMA(T3U, T25, T8n); + T8s = FNMS(T3U, T23, T8r); + T4A = T4z * T23; + T4F = T4z * T25; + T4B = FNMS(TQ, TT, T2j); + T4C = FMA(T4B, T25, T4A); + T4G = FNMS(T4B, T23, T4F); + } + T5v = T2e * T23; + T5B = T2e * T25; + T2k = FMA(TQ, TT, T2j); + T5w = FMA(T2k, T25, T5v); + T5C = FNMS(T2k, T23, T5B); + { + E T4t, T7b, T7f, T1H, T5H, T5L; + T4t = T4l * TX; + T6E = FNMS(T4n, TT, T4t); + T5T = FMA(T4n, TX, T4m); + T7b = T5T * T23; + T7f = T5T * T25; + T4u = FMA(T4n, TT, T4t); + T7g = FNMS(T6E, T23, T7f); + T7c = FMA(T6E, T25, T7b); + T1H = TS * TX; + T1I = FNMS(TW, TT, T1H); + TY = FMA(TW, TX, TU); + T5H = TY * T23; + T5L = TY * T25; + T5I = FMA(T1I, T25, T5H); + T8i = FMA(TW, TT, T1H); + T5M = FNMS(T1I, T23, T5L); + } + } + { + E T9, T40, T1R, T6G, T6F, T3X, T6H, T2F, T7n, T4N, T5W, T1k, T1S, T1D, T1T; + E Ti, Tr, Ts, TB, TK, TL, TM, T6p, T7K, T6w, T7A, T2U, T56, T3K, T4X; + E T6i, T7J, T6v, T7x, T39, T57, T3L, T50, T3E, T59, T3O, T4Q, T63, T7H, T6y; + E T7t, T3p, T5a, T3N, T4T, T6a, T7G, T6z, T7q; + { + E T1, T1J, T8, T3Z, T2A, T3Y, T1Q, T3W, T2C, T2D, T3V; + T1 = cr[0]; + T1J = ci[WS(rs, 24)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = cr[WS(rs, 5)]; + T3 = ci[WS(rs, 4)]; + T4 = T2 + T3; + T5 = cr[WS(rs, 10)]; + T6 = ci[WS(rs, 9)]; + T7 = T5 + T6; + T8 = T4 + T7; + T3Z = T5 - T6; + T2A = T4 - T7; + T3Y = T2 - T3; + } + { + E T1K, T1L, T1M, T1N, T1O, T1P; + T1K = ci[WS(rs, 19)]; + T1L = cr[WS(rs, 20)]; + T1M = T1K - T1L; + T1N = ci[WS(rs, 14)]; + T1O = cr[WS(rs, 15)]; + T1P = T1N - T1O; + T1Q = T1M + T1P; + T3W = T1M - T1P; + T2C = T1K + T1L; + T2D = T1N + T1O; + } + T9 = T1 + T8; + T40 = FMA(KP618033988, T3Z, T3Y); + T1R = T1J + T1Q; + T6G = FNMS(KP618033988, T3Y, T3Z); + T3V = FNMS(KP250000000, T1Q, T1J); + T6F = FNMS(KP559016994, T3W, T3V); + T3X = FMA(KP559016994, T3W, T3V); + T6H = FNMS(KP951056516, T6G, T6F); + { + E T2E, T5V, T2B, T5U, T2z; + T2E = FMA(KP618033988, T2D, T2C); + T5V = FNMS(KP618033988, T2C, T2D); + T2z = FNMS(KP250000000, T8, T1); + T2B = FMA(KP559016994, T2A, T2z); + T5U = FNMS(KP559016994, T2A, T2z); + T2F = FNMS(KP951056516, T2E, T2B); + T7n = FNMS(KP951056516, T5V, T5U); + T4N = FMA(KP951056516, T2E, T2B); + T5W = FMA(KP951056516, T5V, T5U); + } + } + { + E Ta, T2H, T6n, T2S, Th, T2G, TC, T3r, T5Y, T3C, TJ, T3q, Tj, T30, T6d; + E T33, Tq, T32, T1u, T3v, T61, T3y, T1B, T3x, T12, T2L, T6k, T2O, T19, T2N; + E T1b, T2W, T6g, T37, T1i, T2V, T1l, T3g, T68, T3j, T1s, T3i, Tt, T3c, T65; + E T3n, TA, T3b; + { + E Tg, T2R, Td, T2Q; + Ta = cr[WS(rs, 1)]; + { + E Te, Tf, Tb, Tc; + Te = cr[WS(rs, 11)]; + Tf = ci[WS(rs, 8)]; + Tg = Te + Tf; + T2R = Tf - Te; + Tb = cr[WS(rs, 6)]; + Tc = ci[WS(rs, 3)]; + Td = Tb + Tc; + T2Q = Tb - Tc; + } + T2H = Td - Tg; + T6n = FMA(KP618033988, T2Q, T2R); + T2S = FNMS(KP618033988, T2R, T2Q); + Th = Td + Tg; + T2G = FNMS(KP250000000, Th, Ta); + } + { + E TI, T3B, TF, T3A; + TC = cr[WS(rs, 3)]; + { + E TG, TH, TD, TE; + TG = ci[WS(rs, 11)]; + TH = ci[WS(rs, 6)]; + TI = TG + TH; + T3B = TG - TH; + TD = cr[WS(rs, 8)]; + TE = ci[WS(rs, 1)]; + TF = TD + TE; + T3A = TD - TE; + } + T3r = TI - TF; + T5Y = FNMS(KP618033988, T3A, T3B); + T3C = FMA(KP618033988, T3B, T3A); + TJ = TF + TI; + T3q = FNMS(KP250000000, TJ, TC); + } + { + E Tp, T2Z, Tm, T2Y; + Tj = cr[WS(rs, 4)]; + { + E Tn, To, Tk, Tl; + Tn = ci[WS(rs, 10)]; + To = ci[WS(rs, 5)]; + Tp = Tn + To; + T2Z = To - Tn; + Tk = cr[WS(rs, 9)]; + Tl = ci[0]; + Tm = Tk + Tl; + T2Y = Tl - Tk; + } + T30 = FMA(KP618033988, T2Z, T2Y); + T6d = FNMS(KP618033988, T2Y, T2Z); + T33 = Tm - Tp; + Tq = Tm + Tp; + T32 = FMS(KP250000000, Tq, Tj); + } + { + E T1A, T3u, T1x, T3t; + T1u = ci[WS(rs, 21)]; + { + E T1y, T1z, T1v, T1w; + T1y = cr[WS(rs, 13)]; + T1z = cr[WS(rs, 18)]; + T1A = T1y + T1z; + T3u = T1z - T1y; + T1v = ci[WS(rs, 16)]; + T1w = cr[WS(rs, 23)]; + T1x = T1v - T1w; + T3t = T1v + T1w; + } + T3v = FMA(KP618033988, T3u, T3t); + T61 = FNMS(KP618033988, T3t, T3u); + T3y = T1x + T1A; + T1B = T1x - T1A; + T3x = FMS(KP250000000, T1B, T1u); + } + { + E T18, T2K, T15, T2J; + T12 = ci[WS(rs, 23)]; + { + E T16, T17, T13, T14; + T16 = ci[WS(rs, 13)]; + T17 = cr[WS(rs, 16)]; + T18 = T16 - T17; + T2K = T16 + T17; + T13 = ci[WS(rs, 18)]; + T14 = cr[WS(rs, 21)]; + T15 = T13 - T14; + T2J = T13 + T14; + } + T2L = FMA(KP618033988, T2K, T2J); + T6k = FNMS(KP618033988, T2J, T2K); + T2O = T15 - T18; + T19 = T15 + T18; + T2N = FNMS(KP250000000, T19, T12); + } + { + E T1h, T36, T1e, T35; + T1b = ci[WS(rs, 20)]; + { + E T1f, T1g, T1c, T1d; + T1f = cr[WS(rs, 14)]; + T1g = cr[WS(rs, 19)]; + T1h = T1f + T1g; + T36 = T1g - T1f; + T1c = ci[WS(rs, 15)]; + T1d = cr[WS(rs, 24)]; + T1e = T1c - T1d; + T35 = T1c + T1d; + } + T2W = T1e + T1h; + T6g = FNMS(KP618033988, T35, T36); + T37 = FMA(KP618033988, T36, T35); + T1i = T1e - T1h; + T2V = FMS(KP250000000, T1i, T1b); + } + { + E T1o, T3e, T1r, T3f; + T1l = ci[WS(rs, 22)]; + { + E T1m, T1n, T1p, T1q; + T1m = ci[WS(rs, 17)]; + T1n = cr[WS(rs, 22)]; + T1o = T1m - T1n; + T3e = T1m + T1n; + T1p = ci[WS(rs, 12)]; + T1q = cr[WS(rs, 17)]; + T1r = T1p - T1q; + T3f = T1p + T1q; + } + T3g = FMA(KP618033988, T3f, T3e); + T68 = FNMS(KP618033988, T3e, T3f); + T3j = T1o - T1r; + T1s = T1o + T1r; + T3i = FMS(KP250000000, T1s, T1l); + } + { + E Tw, T3l, Tz, T3m; + Tt = cr[WS(rs, 2)]; + { + E Tu, Tv, Tx, Ty; + Tu = cr[WS(rs, 7)]; + Tv = ci[WS(rs, 2)]; + Tw = Tu + Tv; + T3l = Tu - Tv; + Tx = cr[WS(rs, 12)]; + Ty = ci[WS(rs, 7)]; + Tz = Tx + Ty; + T3m = Ty - Tx; + } + T3c = Tz - Tw; + T65 = FMA(KP618033988, T3l, T3m); + T3n = FNMS(KP618033988, T3m, T3l); + TA = Tw + Tz; + T3b = FNMS(KP250000000, TA, Tt); + } + { + E T1a, T1j, T1t, T1C; + T1a = T12 + T19; + T1j = T1b + T1i; + T1k = T1a - T1j; + T1S = T1a + T1j; + T1t = T1l + T1s; + T1C = T1u + T1B; + T1D = T1t - T1C; + T1T = T1t + T1C; + } + Ti = Ta + Th; + Tr = Tj + Tq; + Ts = Ti + Tr; + TB = Tt + TA; + TK = TC + TJ; + TL = TB + TK; + TM = Ts + TL; + { + E T6l, T7y, T6o, T7z, T6j, T6m; + T6j = FNMS(KP559016994, T2H, T2G); + T6l = FMA(KP951056516, T6k, T6j); + T7y = FNMS(KP951056516, T6k, T6j); + T6m = FNMS(KP559016994, T2O, T2N); + T6o = FMA(KP951056516, T6n, T6m); + T7z = FNMS(KP951056516, T6n, T6m); + T6p = FNMS(KP549754652, T6o, T6l); + T7K = FMA(KP939062505, T7y, T7z); + T6w = FMA(KP549754652, T6l, T6o); + T7A = FNMS(KP939062505, T7z, T7y); + } + { + E T2M, T4W, T2T, T4V, T2I, T2P; + T2I = FMA(KP559016994, T2H, T2G); + T2M = FNMS(KP951056516, T2L, T2I); + T4W = FMA(KP951056516, T2L, T2I); + T2P = FMA(KP559016994, T2O, T2N); + T2T = FMA(KP951056516, T2S, T2P); + T4V = FNMS(KP951056516, T2S, T2P); + T2U = FNMS(KP256756360, T2T, T2M); + T56 = FMA(KP634619297, T4V, T4W); + T3K = FMA(KP256756360, T2M, T2T); + T4X = FNMS(KP634619297, T4W, T4V); + } + { + E T6e, T7w, T6h, T7v, T6c, T6f; + T6c = FMA(KP559016994, T2W, T2V); + T6e = FNMS(KP951056516, T6d, T6c); + T7w = FMA(KP951056516, T6d, T6c); + T6f = FMA(KP559016994, T33, T32); + T6h = FNMS(KP951056516, T6g, T6f); + T7v = FMA(KP951056516, T6g, T6f); + T6i = FMA(KP470564281, T6h, T6e); + T7J = FNMS(KP126329378, T7v, T7w); + T6v = FNMS(KP470564281, T6e, T6h); + T7x = FMA(KP126329378, T7w, T7v); + } + { + E T31, T4Y, T38, T4Z, T2X, T34; + T2X = FNMS(KP559016994, T2W, T2V); + T31 = FMA(KP951056516, T30, T2X); + T4Y = FNMS(KP951056516, T30, T2X); + T34 = FNMS(KP559016994, T33, T32); + T38 = FMA(KP951056516, T37, T34); + T4Z = FNMS(KP951056516, T37, T34); + T39 = FNMS(KP634619297, T38, T31); + T57 = FMA(KP827271945, T4Y, T4Z); + T3L = FMA(KP634619297, T31, T38); + T50 = FNMS(KP827271945, T4Z, T4Y); + } + { + E T3w, T4O, T3D, T4P, T3s, T3z; + T3s = FNMS(KP559016994, T3r, T3q); + T3w = FNMS(KP951056516, T3v, T3s); + T4O = FMA(KP951056516, T3v, T3s); + T3z = FNMS(KP559016994, T3y, T3x); + T3D = FNMS(KP951056516, T3C, T3z); + T4P = FMA(KP951056516, T3C, T3z); + T3E = FMA(KP939062505, T3D, T3w); + T59 = FMA(KP126329378, T4O, T4P); + T3O = FNMS(KP939062505, T3w, T3D); + T4Q = FNMS(KP126329378, T4P, T4O); + } + { + E T5Z, T7r, T62, T7s, T5X, T60; + T5X = FMA(KP559016994, T3y, T3x); + T5Z = FMA(KP951056516, T5Y, T5X); + T7r = FNMS(KP951056516, T5Y, T5X); + T60 = FMA(KP559016994, T3r, T3q); + T62 = FMA(KP951056516, T61, T60); + T7s = FNMS(KP951056516, T61, T60); + T63 = FMA(KP062914667, T62, T5Z); + T7H = FMA(KP827271945, T7r, T7s); + T6y = FNMS(KP062914667, T5Z, T62); + T7t = FNMS(KP827271945, T7s, T7r); + } + { + E T3h, T4S, T3o, T4R, T3d, T3k; + T3d = FNMS(KP559016994, T3c, T3b); + T3h = FNMS(KP951056516, T3g, T3d); + T4S = FMA(KP951056516, T3g, T3d); + T3k = FNMS(KP559016994, T3j, T3i); + T3o = FNMS(KP951056516, T3n, T3k); + T4R = FMA(KP951056516, T3n, T3k); + T3p = FMA(KP549754652, T3o, T3h); + T5a = FMA(KP470564281, T4R, T4S); + T3N = FNMS(KP549754652, T3h, T3o); + T4T = FNMS(KP470564281, T4S, T4R); + } + { + E T66, T7o, T69, T7p, T64, T67; + T64 = FMA(KP559016994, T3j, T3i); + T66 = FNMS(KP951056516, T65, T64); + T7o = FMA(KP951056516, T65, T64); + T67 = FMA(KP559016994, T3c, T3b); + T69 = FMA(KP951056516, T68, T67); + T7p = FNMS(KP951056516, T68, T67); + T6a = FMA(KP634619297, T69, T66); + T7G = FNMS(KP062914667, T7o, T7p); + T6z = FNMS(KP634619297, T66, T69); + T7q = FMA(KP062914667, T7p, T7o); + } + } + cr[0] = T9 + TM; + { + E T1U, T1X, T2l, T20, T2m, T1F, T2r, T27, T2h; + { + E T1W, T1V, T1Y, T1Z; + T1W = T1S - T1T; + T1U = T1S + T1T; + T1V = FNMS(KP250000000, T1U, T1R); + T1X = FMA(KP559016994, T1W, T1V); + T2l = FNMS(KP559016994, T1W, T1V); + T1Y = Ti - Tr; + T1Z = TB - TK; + T20 = FMA(KP618033988, T1Z, T1Y); + T2m = FNMS(KP618033988, T1Y, T1Z); + { + E T1E, T2g, T11, T2f, TZ, T10; + T1E = FMA(KP618033988, T1D, T1k); + T2g = FNMS(KP618033988, T1k, T1D); + TZ = FNMS(KP250000000, TM, T9); + T10 = Ts - TL; + T11 = FMA(KP559016994, T10, TZ); + T2f = FNMS(KP559016994, T10, TZ); + T1F = FNMS(KP951056516, T1E, T11); + T2r = FNMS(KP951056516, T2g, T2f); + T27 = FMA(KP951056516, T1E, T11); + T2h = FMA(KP951056516, T2g, T2f); + } + } + { + E T2s, T2w, T2v, T1G, T22, T21; + ci[0] = T1R + T1U; + T2s = T2q * T2r; + T2w = T2u * T2r; + T2v = FMA(KP951056516, T2m, T2l); + cr[WS(rs, 15)] = FNMS(T2u, T2v, T2s); + ci[WS(rs, 15)] = FMA(T2q, T2v, T2w); + T1G = TY * T1F; + T22 = T1I * T1F; + T21 = FMA(KP951056516, T20, T1X); + cr[WS(rs, 5)] = FNMS(T1I, T21, T1G); + ci[WS(rs, 5)] = FMA(TY, T21, T22); + { + E T28, T2c, T2b, T2i, T2o, T2n; + T28 = T26 * T27; + T2c = T2a * T27; + T2b = FNMS(KP951056516, T20, T1X); + cr[WS(rs, 20)] = FNMS(T2a, T2b, T28); + ci[WS(rs, 20)] = FMA(T26, T2b, T2c); + T2i = T2e * T2h; + T2o = T2k * T2h; + T2n = FNMS(KP951056516, T2m, T2l); + cr[WS(rs, 10)] = FNMS(T2k, T2n, T2i); + ci[WS(rs, 10)] = FMA(T2e, T2n, T2o); + } + } + } + { + E T6B, T73, T6Q, T78, T7j, T6u, T72, T7l, T6N, T77, T7k, T7m; + { + E T6x, T6A, T6O, T6P; + T6x = FMA(KP968479752, T6w, T6v); + T6A = FNMS(KP845997307, T6z, T6y); + T6B = FNMS(KP681693190, T6A, T6x); + T73 = FMA(KP560319534, T6x, T6A); + T6O = FNMS(KP968479752, T6p, T6i); + T6P = FNMS(KP845997307, T6a, T63); + T6Q = FMA(KP681693190, T6P, T6O); + T78 = FNMS(KP560319534, T6O, T6P); + } + { + E T6r, T6t, T6b, T6q, T6s; + T6b = FMA(KP845997307, T6a, T63); + T6q = FMA(KP968479752, T6p, T6i); + T6r = FMA(KP906616052, T6q, T6b); + T6t = FNMS(KP906616052, T6q, T6b); + T7j = FMA(KP998026728, T6r, T5W); + T6s = FNMS(KP249506682, T6r, T5W); + T6u = FNMS(KP557913902, T6t, T6s); + T72 = FMA(KP557913902, T6t, T6s); + } + { + E T6K, T6M, T6I, T6J, T6L; + T6I = FMA(KP845997307, T6z, T6y); + T6J = FNMS(KP968479752, T6w, T6v); + T6K = FNMS(KP906616052, T6J, T6I); + T6M = FMA(KP906616052, T6J, T6I); + T7l = FMA(KP998026728, T6K, T6H); + T6L = FNMS(KP249506682, T6K, T6H); + T6N = FNMS(KP557913902, T6M, T6L); + T77 = FMA(KP557913902, T6M, T6L); + } + T7k = T4l * T7j; + cr[WS(rs, 2)] = FNMS(T4n, T7l, T7k); + T7m = T4l * T7l; + ci[WS(rs, 2)] = FMA(T4n, T7j, T7m); + { + E T6C, T6D, T6R, T6S; + T6C = FNMS(KP860541664, T6B, T6u); + T6D = T5T * T6C; + T6R = FNMS(KP860541664, T6Q, T6N); + T6S = T5T * T6R; + cr[WS(rs, 7)] = FNMS(T6E, T6R, T6D); + ci[WS(rs, 7)] = FMA(T6E, T6C, T6S); + } + { + E T7d, T7e, T7h, T7i; + T7d = FMA(KP949179823, T73, T72); + T7e = T7c * T7d; + T7h = FNMS(KP949179823, T78, T77); + T7i = T7c * T7h; + cr[WS(rs, 17)] = FNMS(T7g, T7h, T7e); + ci[WS(rs, 17)] = FMA(T7g, T7d, T7i); + } + { + E T74, T75, T79, T7a; + T74 = FNMS(KP949179823, T73, T72); + T75 = T71 * T74; + T79 = FMA(KP949179823, T78, T77); + T7a = T71 * T79; + cr[WS(rs, 12)] = FNMS(T76, T79, T75); + ci[WS(rs, 12)] = FMA(T76, T74, T7a); + } + { + E T6V, T6W, T6Z, T70; + T6V = FMA(KP860541664, T6B, T6u); + T6W = T6U * T6V; + T6Z = FMA(KP860541664, T6Q, T6N); + T70 = T6U * T6Z; + cr[WS(rs, 22)] = FNMS(T6Y, T6Z, T6W); + ci[WS(rs, 22)] = FMA(T6Y, T6V, T70); + } + } + { + E T7U, T8f, T82, T8k, T7F, T7M, T7X, T7Y, T7D, T7R, T8e, T7I, T7L, T7E, T7O; + E T7N; + { + E T7S, T7T, T80, T81; + T7S = FNMS(KP734762448, T7K, T7J); + T7T = FNMS(KP772036680, T7H, T7G); + T7U = FNMS(KP621716863, T7T, T7S); + T8f = FMA(KP614372930, T7S, T7T); + T80 = FNMS(KP734762448, T7A, T7x); + T81 = FNMS(KP772036680, T7t, T7q); + T82 = FNMS(KP621716863, T81, T80); + T8k = FMA(KP614372930, T80, T81); + } + T7F = FMA(KP951056516, T6G, T6F); + T7I = FMA(KP772036680, T7H, T7G); + T7L = FMA(KP734762448, T7K, T7J); + T7M = FMA(KP994076283, T7L, T7I); + T7X = FNMS(KP249506682, T7M, T7F); + T7Y = FNMS(KP994076283, T7L, T7I); + { + E T7C, T7Q, T7u, T7B, T7P; + T7u = FMA(KP772036680, T7t, T7q); + T7B = FMA(KP734762448, T7A, T7x); + T7C = FMA(KP994076283, T7B, T7u); + T7Q = FNMS(KP994076283, T7B, T7u); + T7D = FMA(KP998026728, T7C, T7n); + T7P = FNMS(KP249506682, T7C, T7n); + T7R = FNMS(KP557913902, T7Q, T7P); + T8e = FMA(KP557913902, T7Q, T7P); + } + T7E = TO * T7D; + T7O = TR * T7D; + T7N = FMA(KP998026728, T7M, T7F); + cr[WS(rs, 3)] = FNMS(TR, T7N, T7E); + ci[WS(rs, 3)] = FMA(TO, T7N, T7O); + { + E T8l, T8t, T8q, T8u, T8h, T8m, T8j, T8p, T8g; + T8j = FMA(KP557913902, T7Y, T7X); + T8l = FNMS(KP949179823, T8k, T8j); + T8t = FMA(KP949179823, T8k, T8j); + T8p = FNMS(KP949179823, T8f, T8e); + T8q = T8o * T8p; + T8u = T8s * T8p; + T8g = FMA(KP949179823, T8f, T8e); + T8h = T8d * T8g; + T8m = T8i * T8g; + cr[WS(rs, 13)] = FNMS(T8i, T8l, T8h); + ci[WS(rs, 13)] = FMA(T8d, T8l, T8m); + cr[WS(rs, 18)] = FNMS(T8s, T8t, T8q); + ci[WS(rs, 18)] = FMA(T8o, T8t, T8u); + } + { + E T83, T8b, T88, T8c, T7W, T84, T7Z, T87, T7V; + T7Z = FNMS(KP557913902, T7Y, T7X); + T83 = FNMS(KP943557151, T82, T7Z); + T8b = FMA(KP943557151, T82, T7Z); + T87 = FNMS(KP943557151, T7U, T7R); + T88 = T86 * T87; + T8c = T8a * T87; + T7V = FMA(KP943557151, T7U, T7R); + T7W = T4z * T7V; + T84 = T4B * T7V; + cr[WS(rs, 8)] = FNMS(T4B, T83, T7W); + ci[WS(rs, 8)] = FMA(T4z, T83, T84); + cr[WS(rs, 23)] = FNMS(T8a, T8b, T88); + ci[WS(rs, 23)] = FMA(T86, T8b, T8c); + } + } + { + E T5c, T5y, T5o, T5E, T5f, T5i, T5j, T5k, T5P, T55, T5x, T5g, T5h, T5Q, T5S; + E T5R; + { + E T58, T5b, T5m, T5n; + T58 = FNMS(KP912575812, T57, T56); + T5b = FNMS(KP912018591, T5a, T59); + T5c = FNMS(KP726211448, T5b, T58); + T5y = FMA(KP525970792, T58, T5b); + T5m = FNMS(KP912575812, T50, T4X); + T5n = FMA(KP912018591, T4T, T4Q); + T5o = FNMS(KP726211448, T5n, T5m); + T5E = FMA(KP525970792, T5m, T5n); + } + T5f = FNMS(KP951056516, T40, T3X); + T5g = FMA(KP912018591, T5a, T59); + T5h = FMA(KP912575812, T57, T56); + T5i = FMA(KP851038619, T5h, T5g); + T5j = FNMS(KP248028675, T5i, T5f); + T5k = FNMS(KP851038619, T5h, T5g); + { + E T52, T54, T4U, T51, T53; + T4U = FNMS(KP912018591, T4T, T4Q); + T51 = FMA(KP912575812, T50, T4X); + T52 = FMA(KP851038619, T51, T4U); + T54 = FNMS(KP851038619, T51, T4U); + T5P = FNMS(KP992114701, T52, T4N); + T53 = FMA(KP248028675, T52, T4N); + T55 = FMA(KP554608978, T54, T53); + T5x = FNMS(KP554608978, T54, T53); + } + T5Q = TS * T5P; + T5S = TW * T5P; + T5R = FMA(KP992114701, T5i, T5f); + cr[WS(rs, 4)] = FNMS(TW, T5R, T5Q); + ci[WS(rs, 4)] = FMA(TS, T5R, T5S); + { + E T5F, T5N, T5K, T5O, T5A, T5G, T5D, T5J, T5z; + T5D = FMA(KP554608978, T5k, T5j); + T5F = FNMS(KP943557151, T5E, T5D); + T5N = FMA(KP943557151, T5E, T5D); + T5J = FMA(KP943557151, T5y, T5x); + T5K = T5I * T5J; + T5O = T5M * T5J; + T5z = FNMS(KP943557151, T5y, T5x); + T5A = T5w * T5z; + T5G = T5C * T5z; + cr[WS(rs, 14)] = FNMS(T5C, T5F, T5A); + ci[WS(rs, 14)] = FMA(T5w, T5F, T5G); + cr[WS(rs, 19)] = FNMS(T5M, T5N, T5K); + ci[WS(rs, 19)] = FMA(T5I, T5N, T5O); + } + { + E T5p, T5t, T5s, T5u, T5e, T5q, T5l, T5r, T5d; + T5l = FNMS(KP554608978, T5k, T5j); + T5p = FNMS(KP803003575, T5o, T5l); + T5t = FMA(KP803003575, T5o, T5l); + T5r = FMA(KP803003575, T5c, T55); + T5s = T23 * T5r; + T5u = T25 * T5r; + T5d = FNMS(KP803003575, T5c, T55); + T5e = TT * T5d; + T5q = TX * T5d; + cr[WS(rs, 9)] = FNMS(TX, T5p, T5e); + ci[WS(rs, 9)] = FMA(TT, T5p, T5q); + cr[WS(rs, 24)] = FNMS(T25, T5t, T5s); + ci[WS(rs, 24)] = FMA(T23, T5t, T5u); + } + } + { + E T3Q, T4q, T4a, T4w, T41, T44, T45, T46, T4J, T3J, T4p, T42, T43, T4K, T4M; + E T4L; + { + E T3M, T3P, T48, T49; + T3M = FMA(KP871714437, T3L, T3K); + T3P = FNMS(KP831864738, T3O, T3N); + T3Q = FNMS(KP559154169, T3P, T3M); + T4q = FMA(KP683113946, T3M, T3P); + T48 = FNMS(KP871714437, T39, T2U); + T49 = FNMS(KP831864738, T3E, T3p); + T4a = FMA(KP559154169, T49, T48); + T4w = FNMS(KP683113946, T48, T49); + } + T41 = FMA(KP951056516, T40, T3X); + T42 = FNMS(KP871714437, T3L, T3K); + T43 = FMA(KP831864738, T3O, T3N); + T44 = FNMS(KP904730450, T43, T42); + T45 = FNMS(KP242145790, T44, T41); + T46 = FMA(KP904730450, T43, T42); + { + E T3G, T3I, T3a, T3F, T3H; + T3a = FMA(KP871714437, T39, T2U); + T3F = FMA(KP831864738, T3E, T3p); + T3G = FMA(KP904730450, T3F, T3a); + T3I = FNMS(KP904730450, T3F, T3a); + T4J = FMA(KP968583161, T3G, T2F); + T3H = FNMS(KP242145790, T3G, T2F); + T3J = FMA(KP541454447, T3I, T3H); + T4p = FNMS(KP541454447, T3I, T3H); + } + T4K = TN * T4J; + T4M = TQ * T4J; + T4L = FMA(KP968583161, T44, T41); + cr[WS(rs, 1)] = FNMS(TQ, T4L, T4K); + ci[WS(rs, 1)] = FMA(TN, T4L, T4M); + { + E T4x, T4H, T4E, T4I, T4s, T4y, T4v, T4D, T4r; + T4v = FNMS(KP541454447, T46, T45); + T4x = FNMS(KP833417178, T4w, T4v); + T4H = FMA(KP833417178, T4w, T4v); + T4D = FMA(KP833417178, T4q, T4p); + T4E = T4C * T4D; + T4I = T4G * T4D; + T4r = FNMS(KP833417178, T4q, T4p); + T4s = T4o * T4r; + T4y = T4u * T4r; + cr[WS(rs, 11)] = FNMS(T4u, T4x, T4s); + ci[WS(rs, 11)] = FMA(T4o, T4x, T4y); + cr[WS(rs, 16)] = FNMS(T4G, T4H, T4E); + ci[WS(rs, 16)] = FMA(T4C, T4H, T4I); + } + { + E T4b, T4j, T4g, T4k, T3S, T4c, T47, T4f, T3R; + T47 = FMA(KP541454447, T46, T45); + T4b = FMA(KP921177326, T4a, T47); + T4j = FNMS(KP921177326, T4a, T47); + T4f = FMA(KP921177326, T3Q, T3J); + T4g = T4e * T4f; + T4k = T4i * T4f; + T3R = FNMS(KP921177326, T3Q, T3J); + T3S = T2y * T3R; + T4c = T3U * T3R; + cr[WS(rs, 6)] = FNMS(T3U, T4b, T3S); + ci[WS(rs, 6)] = FMA(T2y, T4b, T4c); + cr[WS(rs, 21)] = FNMS(T4i, T4j, T4g); + ci[WS(rs, 21)] = FMA(T4e, T4j, T4k); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 24}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hb2_25", twinstr, &GENUS, {84, 78, 356, 0} }; + +void X(codelet_hb2_25) (planner *p) { + X(khc2hc_register) (p, hb2_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 25 -dif -name hb2_25 -include rdft/scalar/hb.h */ + +/* + * This function contains 440 FP additions, 340 FP multiplications, + * (or, 280 additions, 180 multiplications, 160 fused multiply/add), + * 155 stack variables, 20 constants, and 100 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(50, rs)) { + E TN, TQ, TO, TR, TT, TY, T2t, T2r, TZ, TU, T4f, T4l, T2d, T4v, T5m; + E T2j, T5l, T4X, T2v, T11, T3R, T1L, T5d, T6x, T5h, T6t, T25, T26, T27, T29; + E T6D, T7v, T49, T7l, T7p, T7t, T2p, T2n, T4b, T4p, T5n, T6B, T5b, T5p, T6p; + E T6r, T59, T4r; + { + E T2c, T4j, T2h, T4e, T2b, T4k, T2i, T4d; + { + E TP, TX, TS, TW; + TN = W[0]; + TQ = W[1]; + TO = W[2]; + TR = W[3]; + TP = TN * TO; + TX = TQ * TO; + TS = TQ * TR; + TW = TN * TR; + TT = TP - TS; + TY = TW + TX; + T2t = TW - TX; + T2r = TP + TS; + TZ = W[5]; + T2c = TQ * TZ; + T4j = TO * TZ; + T2h = TN * TZ; + T4e = TR * TZ; + TU = W[4]; + T2b = TN * TU; + T4k = TR * TU; + T2i = TQ * TU; + T4d = TO * TU; + } + T4f = T4d - T4e; + T4l = T4j + T4k; + { + E T2s, T2u, TV, T10, T3P, T3Q, T1J, T1K; + T2d = T2b - T2c; + T4v = T2b + T2c; + T5m = T4j - T4k; + T2j = T2h + T2i; + T5l = T4d + T4e; + T4X = T2h - T2i; + T2s = T2r * TU; + T2u = T2t * TZ; + T2v = T2s + T2u; + TV = TT * TU; + T10 = TY * TZ; + T11 = TV + T10; + T3P = T2r * TZ; + T3Q = T2t * TU; + T3R = T3P - T3Q; + T1J = TT * TZ; + T1K = TY * TU; + T1L = T1J - T1K; + T5d = TV - T10; + T6x = T3P + T3Q; + T5h = T1J + T1K; + T6t = T2s - T2u; + T25 = W[6]; + T26 = W[7]; + T27 = FMA(TT, T25, TY * T26); + T29 = FNMS(TY, T25, TT * T26); + T6D = FNMS(T4X, T25, T4v * T26); + T7v = FNMS(T1L, T25, T11 * T26); + T49 = FMA(T2r, T25, T2t * T26); + T7l = FMA(T2d, T25, T2j * T26); + T7p = FNMS(T2j, T25, T2d * T26); + T7t = FMA(T11, T25, T1L * T26); + T2p = FNMS(TZ, T25, TU * T26); + T2n = FMA(TU, T25, TZ * T26); + T4b = FNMS(T2t, T25, T2r * T26); + T4p = FMA(T2v, T25, T3R * T26); + T5n = FMA(T5l, T25, T5m * T26); + T6B = FMA(T4v, T25, T4X * T26); + T5b = FNMS(TQ, T25, TN * T26); + T5p = FNMS(T5m, T25, T5l * T26); + T6p = FMA(TO, T25, TR * T26); + T6r = FNMS(TR, T25, TO * T26); + T59 = FMA(TN, T25, TQ * T26); + T4r = FNMS(T3R, T25, T2v * T26); + } + } + { + E T9, T6i, T40, T3z, T5Y, Ti, Tr, Ts, T1d, T1m, T1P, T2K, T4P, T3H, T4y; + E T5G, T71, T65, T6N, T5z, T70, T64, T6K, T2Z, T4Q, T3I, T4B, T20, T5Z, T3C; + E T43, T6j, TB, TK, TL, T1w, T1F, T1Q, T3f, T4S, T3K, T4F, T5V, T74, T68; + E T6U, T5O, T73, T67, T6R, T3u, T4T, T3L, T4I; + { + E T1, T4, T7, T8, T3Z, T3Y, T3x, T3y; + T1 = cr[0]; + { + E T2, T3, T5, T6; + T2 = cr[WS(rs, 5)]; + T3 = ci[WS(rs, 4)]; + T4 = T2 + T3; + T5 = cr[WS(rs, 10)]; + T6 = ci[WS(rs, 9)]; + T7 = T5 + T6; + T8 = T4 + T7; + T3Z = T5 - T6; + T3Y = T2 - T3; + } + T9 = T1 + T8; + T6i = FMA(KP951056516, T3Y, KP587785252 * T3Z); + T40 = FNMS(KP951056516, T3Z, KP587785252 * T3Y); + T3x = FNMS(KP250000000, T8, T1); + T3y = KP559016994 * (T4 - T7); + T3z = T3x - T3y; + T5Y = T3y + T3x; + } + { + E Ta, T2x, T5w, T2F, Th, T2w, T1e, T2P, T5B, T2X, T1l, T2O, Tj, T2N, T5D; + E T2T, Tq, T2S, T15, T2B, T5u, T2H, T1c, T2G; + { + E Tg, T2E, Td, T2D; + Ta = cr[WS(rs, 1)]; + { + E Te, Tf, Tb, Tc; + Te = cr[WS(rs, 11)]; + Tf = ci[WS(rs, 8)]; + Tg = Te + Tf; + T2E = Te - Tf; + Tb = cr[WS(rs, 6)]; + Tc = ci[WS(rs, 3)]; + Td = Tb + Tc; + T2D = Tb - Tc; + } + T2x = KP559016994 * (Td - Tg); + T5w = FMA(KP951056516, T2D, KP587785252 * T2E); + T2F = FNMS(KP951056516, T2E, KP587785252 * T2D); + Th = Td + Tg; + T2w = FNMS(KP250000000, Th, Ta); + } + { + E T1k, T2W, T1h, T2V; + T1e = ci[WS(rs, 20)]; + { + E T1i, T1j, T1f, T1g; + T1i = cr[WS(rs, 14)]; + T1j = cr[WS(rs, 19)]; + T1k = T1i + T1j; + T2W = T1j - T1i; + T1f = ci[WS(rs, 15)]; + T1g = cr[WS(rs, 24)]; + T1h = T1f - T1g; + T2V = T1f + T1g; + } + T2P = KP559016994 * (T1h + T1k); + T5B = FMA(KP951056516, T2V, KP587785252 * T2W); + T2X = FNMS(KP951056516, T2W, KP587785252 * T2V); + T1l = T1h - T1k; + T2O = FNMS(KP250000000, T1l, T1e); + } + { + E Tp, T2M, Tm, T2L; + Tj = cr[WS(rs, 4)]; + { + E Tn, To, Tk, Tl; + Tn = ci[WS(rs, 10)]; + To = ci[WS(rs, 5)]; + Tp = Tn + To; + T2M = Tn - To; + Tk = cr[WS(rs, 9)]; + Tl = ci[0]; + Tm = Tk + Tl; + T2L = Tk - Tl; + } + T2N = FNMS(KP951056516, T2M, KP587785252 * T2L); + T5D = FMA(KP951056516, T2L, KP587785252 * T2M); + T2T = KP559016994 * (Tm - Tp); + Tq = Tm + Tp; + T2S = FNMS(KP250000000, Tq, Tj); + } + { + E T1b, T2A, T18, T2z; + T15 = ci[WS(rs, 23)]; + { + E T19, T1a, T16, T17; + T19 = ci[WS(rs, 13)]; + T1a = cr[WS(rs, 16)]; + T1b = T19 - T1a; + T2A = T19 + T1a; + T16 = ci[WS(rs, 18)]; + T17 = cr[WS(rs, 21)]; + T18 = T16 - T17; + T2z = T16 + T17; + } + T2B = FNMS(KP951056516, T2A, KP587785252 * T2z); + T5u = FMA(KP951056516, T2z, KP587785252 * T2A); + T2H = KP559016994 * (T18 - T1b); + T1c = T18 + T1b; + T2G = FNMS(KP250000000, T1c, T15); + } + Ti = Ta + Th; + Tr = Tj + Tq; + Ts = Ti + Tr; + T1d = T15 + T1c; + T1m = T1e + T1l; + T1P = T1d + T1m; + { + E T2C, T4w, T2J, T4x, T2y, T2I; + T2y = T2w - T2x; + T2C = T2y - T2B; + T4w = T2y + T2B; + T2I = T2G - T2H; + T2J = T2F + T2I; + T4x = T2I - T2F; + T2K = FNMS(KP481753674, T2J, KP876306680 * T2C); + T4P = FMA(KP728968627, T4x, KP684547105 * T4w); + T3H = FMA(KP876306680, T2J, KP481753674 * T2C); + T4y = FNMS(KP684547105, T4x, KP728968627 * T4w); + } + { + E T5C, T6M, T5F, T6L, T5A, T5E; + T5A = T2T + T2S; + T5C = T5A - T5B; + T6M = T5A + T5B; + T5E = T2O + T2P; + T5F = T5D + T5E; + T6L = T5E - T5D; + T5G = FNMS(KP844327925, T5F, KP535826794 * T5C); + T71 = FMA(KP637423989, T6L, KP770513242 * T6M); + T65 = FMA(KP535826794, T5F, KP844327925 * T5C); + T6N = FNMS(KP637423989, T6M, KP770513242 * T6L); + } + { + E T5v, T6I, T5y, T6J, T5t, T5x; + T5t = T2x + T2w; + T5v = T5t - T5u; + T6I = T5t + T5u; + T5x = T2H + T2G; + T5y = T5w + T5x; + T6J = T5x - T5w; + T5z = FNMS(KP248689887, T5y, KP968583161 * T5v); + T70 = FMA(KP535826794, T6J, KP844327925 * T6I); + T64 = FMA(KP968583161, T5y, KP248689887 * T5v); + T6K = FNMS(KP844327925, T6J, KP535826794 * T6I); + } + { + E T2R, T4z, T2Y, T4A, T2Q, T2U; + T2Q = T2O - T2P; + T2R = T2N + T2Q; + T4z = T2Q - T2N; + T2U = T2S - T2T; + T2Y = T2U - T2X; + T4A = T2U + T2X; + T2Z = FMA(KP904827052, T2R, KP425779291 * T2Y); + T4Q = FNMS(KP992114701, T4z, KP125333233 * T4A); + T3I = FNMS(KP425779291, T2R, KP904827052 * T2Y); + T4B = FMA(KP125333233, T4z, KP992114701 * T4A); + } + } + { + E T1S, T1V, T1Y, T1Z, T3B, T3A, T41, T42; + T1S = ci[WS(rs, 24)]; + { + E T1T, T1U, T1W, T1X; + T1T = ci[WS(rs, 19)]; + T1U = cr[WS(rs, 20)]; + T1V = T1T - T1U; + T1W = ci[WS(rs, 14)]; + T1X = cr[WS(rs, 15)]; + T1Y = T1W - T1X; + T1Z = T1V + T1Y; + T3B = T1W + T1X; + T3A = T1T + T1U; + } + T20 = T1S + T1Z; + T5Z = FMA(KP951056516, T3A, KP587785252 * T3B); + T3C = FNMS(KP951056516, T3B, KP587785252 * T3A); + T41 = FNMS(KP250000000, T1Z, T1S); + T42 = KP559016994 * (T1V - T1Y); + T43 = T41 - T42; + T6j = T42 + T41; + } + { + E Tt, T32, T5L, T3a, TA, T31, T1o, T36, T5J, T3c, T1v, T3b, TC, T3h, T5S; + E T3p, TJ, T3g, T1x, T3l, T5Q, T3r, T1E, T3q; + { + E Tw, T38, Tz, T39; + Tt = cr[WS(rs, 2)]; + { + E Tu, Tv, Tx, Ty; + Tu = cr[WS(rs, 7)]; + Tv = ci[WS(rs, 2)]; + Tw = Tu + Tv; + T38 = Tu - Tv; + Tx = cr[WS(rs, 12)]; + Ty = ci[WS(rs, 7)]; + Tz = Tx + Ty; + T39 = Tx - Ty; + } + T32 = KP559016994 * (Tw - Tz); + T5L = FMA(KP951056516, T38, KP587785252 * T39); + T3a = FNMS(KP951056516, T39, KP587785252 * T38); + TA = Tw + Tz; + T31 = FNMS(KP250000000, TA, Tt); + } + { + E T1r, T34, T1u, T35; + T1o = ci[WS(rs, 22)]; + { + E T1p, T1q, T1s, T1t; + T1p = ci[WS(rs, 17)]; + T1q = cr[WS(rs, 22)]; + T1r = T1p - T1q; + T34 = T1p + T1q; + T1s = ci[WS(rs, 12)]; + T1t = cr[WS(rs, 17)]; + T1u = T1s - T1t; + T35 = T1s + T1t; + } + T36 = FNMS(KP951056516, T35, KP587785252 * T34); + T5J = FMA(KP951056516, T34, KP587785252 * T35); + T3c = KP559016994 * (T1r - T1u); + T1v = T1r + T1u; + T3b = FNMS(KP250000000, T1v, T1o); + } + { + E TI, T3o, TF, T3n; + TC = cr[WS(rs, 3)]; + { + E TG, TH, TD, TE; + TG = ci[WS(rs, 11)]; + TH = ci[WS(rs, 6)]; + TI = TG + TH; + T3o = TG - TH; + TD = cr[WS(rs, 8)]; + TE = ci[WS(rs, 1)]; + TF = TD + TE; + T3n = TD - TE; + } + T3h = KP559016994 * (TF - TI); + T5S = FMA(KP951056516, T3n, KP587785252 * T3o); + T3p = FNMS(KP951056516, T3o, KP587785252 * T3n); + TJ = TF + TI; + T3g = FNMS(KP250000000, TJ, TC); + } + { + E T1D, T3k, T1A, T3j; + T1x = ci[WS(rs, 21)]; + { + E T1B, T1C, T1y, T1z; + T1B = cr[WS(rs, 13)]; + T1C = cr[WS(rs, 18)]; + T1D = T1B + T1C; + T3k = T1C - T1B; + T1y = ci[WS(rs, 16)]; + T1z = cr[WS(rs, 23)]; + T1A = T1y - T1z; + T3j = T1y + T1z; + } + T3l = FNMS(KP951056516, T3k, KP587785252 * T3j); + T5Q = FMA(KP951056516, T3j, KP587785252 * T3k); + T3r = KP559016994 * (T1A + T1D); + T1E = T1A - T1D; + T3q = FNMS(KP250000000, T1E, T1x); + } + TB = Tt + TA; + TK = TC + TJ; + TL = TB + TK; + T1w = T1o + T1v; + T1F = T1x + T1E; + T1Q = T1w + T1F; + { + E T37, T4D, T3e, T4E, T33, T3d; + T33 = T31 - T32; + T37 = T33 - T36; + T4D = T33 + T36; + T3d = T3b - T3c; + T3e = T3a + T3d; + T4E = T3d - T3a; + T3f = FNMS(KP844327925, T3e, KP535826794 * T37); + T4S = FMA(KP062790519, T4E, KP998026728 * T4D); + T3K = FMA(KP535826794, T3e, KP844327925 * T37); + T4F = FNMS(KP998026728, T4E, KP062790519 * T4D); + } + { + E T5R, T6T, T5U, T6S, T5P, T5T; + T5P = T3h + T3g; + T5R = T5P - T5Q; + T6T = T5P + T5Q; + T5T = T3q + T3r; + T5U = T5S + T5T; + T6S = T5T - T5S; + T5V = FNMS(KP684547105, T5U, KP728968627 * T5R); + T74 = FNMS(KP992114701, T6S, KP125333233 * T6T); + T68 = FMA(KP728968627, T5U, KP684547105 * T5R); + T6U = FMA(KP125333233, T6S, KP992114701 * T6T); + } + { + E T5K, T6Q, T5N, T6P, T5I, T5M; + T5I = T32 + T31; + T5K = T5I - T5J; + T6Q = T5I + T5J; + T5M = T3c + T3b; + T5N = T5L + T5M; + T6P = T5M - T5L; + T5O = FNMS(KP481753674, T5N, KP876306680 * T5K); + T73 = FNMS(KP425779291, T6P, KP904827052 * T6Q); + T67 = FMA(KP876306680, T5N, KP481753674 * T5K); + T6R = FMA(KP904827052, T6P, KP425779291 * T6Q); + } + { + E T3m, T4H, T3t, T4G, T3i, T3s; + T3i = T3g - T3h; + T3m = T3i - T3l; + T4H = T3i + T3l; + T3s = T3q - T3r; + T3t = T3p + T3s; + T4G = T3s - T3p; + T3u = FNMS(KP998026728, T3t, KP062790519 * T3m); + T4T = FNMS(KP637423989, T4G, KP770513242 * T4H); + T3L = FMA(KP062790519, T3t, KP998026728 * T3m); + T4I = FMA(KP770513242, T4G, KP637423989 * T4H); + } + } + { + E TM, T14, T2e, T21, T23, T2l, T1H, T2f, T1O, T2k; + { + E T12, T13, T1R, T22; + T12 = KP559016994 * (Ts - TL); + TM = Ts + TL; + T13 = FNMS(KP250000000, TM, T9); + T14 = T12 + T13; + T2e = T13 - T12; + T1R = KP559016994 * (T1P - T1Q); + T21 = T1P + T1Q; + T22 = FNMS(KP250000000, T21, T20); + T23 = T1R + T22; + T2l = T22 - T1R; + } + { + E T1n, T1G, T1M, T1N; + T1n = T1d - T1m; + T1G = T1w - T1F; + T1H = FMA(KP951056516, T1n, KP587785252 * T1G); + T2f = FNMS(KP951056516, T1G, KP587785252 * T1n); + T1M = Ti - Tr; + T1N = TB - TK; + T1O = FMA(KP951056516, T1M, KP587785252 * T1N); + T2k = FNMS(KP951056516, T1N, KP587785252 * T1M); + } + { + E T1I, T24, T2o, T2q; + cr[0] = T9 + TM; + ci[0] = T20 + T21; + T1I = T14 - T1H; + T24 = T1O + T23; + cr[WS(rs, 5)] = FNMS(T1L, T24, T11 * T1I); + ci[WS(rs, 5)] = FMA(T1L, T1I, T11 * T24); + T2o = T2e + T2f; + T2q = T2l - T2k; + cr[WS(rs, 15)] = FNMS(T2p, T2q, T2n * T2o); + ci[WS(rs, 15)] = FMA(T2p, T2o, T2n * T2q); + { + E T2g, T2m, T28, T2a; + T2g = T2e - T2f; + T2m = T2k + T2l; + cr[WS(rs, 10)] = FNMS(T2j, T2m, T2d * T2g); + ci[WS(rs, 10)] = FMA(T2j, T2g, T2d * T2m); + T28 = T14 + T1H; + T2a = T23 - T1O; + cr[WS(rs, 20)] = FNMS(T29, T2a, T27 * T28); + ci[WS(rs, 20)] = FMA(T29, T28, T27 * T2a); + } + } + } + { + E T76, T7n, T7a, T7q, T6H, T6W, T6X, T6Y, T7e, T7f, T7d, T7g, T7x, T7y; + { + E T72, T75, T78, T79; + T72 = T70 + T71; + T75 = T73 - T74; + T76 = FMA(KP951056516, T72, KP587785252 * T75); + T7n = FNMS(KP951056516, T75, KP587785252 * T72); + T78 = T6K - T6N; + T79 = T6U - T6R; + T7a = FMA(KP951056516, T78, KP587785252 * T79); + T7q = FNMS(KP951056516, T79, KP587785252 * T78); + } + { + E T6O, T6V, T7b, T7c; + T6H = T5Y + T5Z; + T6O = T6K + T6N; + T6V = T6R + T6U; + T6W = T6O - T6V; + T6X = FNMS(KP250000000, T6W, T6H); + T6Y = KP559016994 * (T6O + T6V); + T7e = T6j - T6i; + T7b = T70 - T71; + T7c = T73 + T74; + T7f = T7b + T7c; + T7d = KP559016994 * (T7b - T7c); + T7g = FNMS(KP250000000, T7f, T7e); + } + T7x = T6H + T6W; + T7y = T7e + T7f; + cr[WS(rs, 4)] = FNMS(TY, T7y, TT * T7x); + ci[WS(rs, 4)] = FMA(TY, T7x, TT * T7y); + { + E T7o, T7u, T7s, T7w, T7m, T7r; + T7m = T6X - T6Y; + T7o = T7m - T7n; + T7u = T7m + T7n; + T7r = T7g - T7d; + T7s = T7q + T7r; + T7w = T7r - T7q; + cr[WS(rs, 14)] = FNMS(T7p, T7s, T7l * T7o); + ci[WS(rs, 14)] = FMA(T7p, T7o, T7l * T7s); + cr[WS(rs, 19)] = FNMS(T7v, T7w, T7t * T7u); + ci[WS(rs, 19)] = FMA(T7v, T7u, T7t * T7w); + } + { + E T77, T7j, T7i, T7k, T6Z, T7h; + T6Z = T6X + T6Y; + T77 = T6Z - T76; + T7j = T6Z + T76; + T7h = T7d + T7g; + T7i = T7a + T7h; + T7k = T7h - T7a; + cr[WS(rs, 9)] = FNMS(TZ, T7i, TU * T77); + ci[WS(rs, 9)] = FMA(TZ, T77, TU * T7i); + cr[WS(rs, 24)] = FNMS(T26, T7k, T25 * T7j); + ci[WS(rs, 24)] = FMA(T26, T7j, T25 * T7k); + } + } + { + E T3N, T4h, T3U, T4m, T3D, T3E, T3w, T3F, T44, T45, T3X, T46, T4t, T4u; + { + E T3J, T3M, T3S, T3T; + T3J = T3H - T3I; + T3M = T3K - T3L; + T3N = FMA(KP951056516, T3J, KP587785252 * T3M); + T4h = FNMS(KP951056516, T3M, KP587785252 * T3J); + T3S = T2K + T2Z; + T3T = T3f - T3u; + T3U = FMA(KP951056516, T3S, KP587785252 * T3T); + T4m = FNMS(KP951056516, T3T, KP587785252 * T3S); + } + { + E T30, T3v, T3V, T3W; + T3D = T3z - T3C; + T30 = T2K - T2Z; + T3v = T3f + T3u; + T3E = T30 + T3v; + T3w = KP559016994 * (T30 - T3v); + T3F = FNMS(KP250000000, T3E, T3D); + T44 = T40 + T43; + T3V = T3H + T3I; + T3W = T3K + T3L; + T45 = T3V + T3W; + T3X = KP559016994 * (T3V - T3W); + T46 = FNMS(KP250000000, T45, T44); + } + T4t = T3D + T3E; + T4u = T44 + T45; + cr[WS(rs, 2)] = FNMS(T2t, T4u, T2r * T4t); + ci[WS(rs, 2)] = FMA(T2t, T4t, T2r * T4u); + { + E T4i, T4q, T4o, T4s, T4g, T4n; + T4g = T3F - T3w; + T4i = T4g - T4h; + T4q = T4g + T4h; + T4n = T46 - T3X; + T4o = T4m + T4n; + T4s = T4n - T4m; + cr[WS(rs, 12)] = FNMS(T4l, T4o, T4f * T4i); + ci[WS(rs, 12)] = FMA(T4l, T4i, T4f * T4o); + cr[WS(rs, 17)] = FNMS(T4r, T4s, T4p * T4q); + ci[WS(rs, 17)] = FMA(T4r, T4q, T4p * T4s); + } + { + E T3O, T4a, T48, T4c, T3G, T47; + T3G = T3w + T3F; + T3O = T3G - T3N; + T4a = T3G + T3N; + T47 = T3X + T46; + T48 = T3U + T47; + T4c = T47 - T3U; + cr[WS(rs, 7)] = FNMS(T3R, T48, T2v * T3O); + ci[WS(rs, 7)] = FMA(T3R, T3O, T2v * T48); + cr[WS(rs, 22)] = FNMS(T4b, T4c, T49 * T4a); + ci[WS(rs, 22)] = FMA(T4b, T4a, T49 * T4c); + } + } + { + E T4V, T5f, T50, T5i, T4L, T4M, T4K, T4N, T54, T55, T53, T56, T5r, T5s; + { + E T4R, T4U, T4Y, T4Z; + T4R = T4P - T4Q; + T4U = T4S - T4T; + T4V = FMA(KP951056516, T4R, KP587785252 * T4U); + T5f = FNMS(KP951056516, T4U, KP587785252 * T4R); + T4Y = T4y + T4B; + T4Z = T4F + T4I; + T50 = FMA(KP951056516, T4Y, KP587785252 * T4Z); + T5i = FNMS(KP951056516, T4Z, KP587785252 * T4Y); + } + { + E T4C, T4J, T51, T52; + T4L = T3z + T3C; + T4C = T4y - T4B; + T4J = T4F - T4I; + T4M = T4C + T4J; + T4K = KP559016994 * (T4C - T4J); + T4N = FNMS(KP250000000, T4M, T4L); + T54 = T43 - T40; + T51 = T4P + T4Q; + T52 = T4S + T4T; + T55 = T51 + T52; + T53 = KP559016994 * (T51 - T52); + T56 = FNMS(KP250000000, T55, T54); + } + T5r = T4L + T4M; + T5s = T54 + T55; + cr[WS(rs, 3)] = FNMS(TR, T5s, TO * T5r); + ci[WS(rs, 3)] = FMA(TR, T5r, TO * T5s); + { + E T5g, T5o, T5k, T5q, T5e, T5j; + T5e = T4N - T4K; + T5g = T5e - T5f; + T5o = T5e + T5f; + T5j = T56 - T53; + T5k = T5i + T5j; + T5q = T5j - T5i; + cr[WS(rs, 13)] = FNMS(T5h, T5k, T5d * T5g); + ci[WS(rs, 13)] = FMA(T5h, T5g, T5d * T5k); + cr[WS(rs, 18)] = FNMS(T5p, T5q, T5n * T5o); + ci[WS(rs, 18)] = FMA(T5p, T5o, T5n * T5q); + } + { + E T4W, T5a, T58, T5c, T4O, T57; + T4O = T4K + T4N; + T4W = T4O - T4V; + T5a = T4O + T4V; + T57 = T53 + T56; + T58 = T50 + T57; + T5c = T57 - T50; + cr[WS(rs, 8)] = FNMS(T4X, T58, T4v * T4W); + ci[WS(rs, 8)] = FMA(T4X, T4W, T4v * T58); + cr[WS(rs, 23)] = FNMS(T5b, T5c, T59 * T5a); + ci[WS(rs, 23)] = FMA(T5b, T5a, T59 * T5c); + } + } + { + E T6a, T6v, T6e, T6y, T60, T61, T5X, T62, T6k, T6l, T6h, T6m, T6F, T6G; + { + E T66, T69, T6c, T6d; + T66 = T64 - T65; + T69 = T67 - T68; + T6a = FMA(KP951056516, T66, KP587785252 * T69); + T6v = FNMS(KP951056516, T69, KP587785252 * T66); + T6c = T5z - T5G; + T6d = T5O - T5V; + T6e = FMA(KP951056516, T6c, KP587785252 * T6d); + T6y = FNMS(KP951056516, T6d, KP587785252 * T6c); + } + { + E T5H, T5W, T6f, T6g; + T60 = T5Y - T5Z; + T5H = T5z + T5G; + T5W = T5O + T5V; + T61 = T5H + T5W; + T5X = KP559016994 * (T5H - T5W); + T62 = FNMS(KP250000000, T61, T60); + T6k = T6i + T6j; + T6f = T64 + T65; + T6g = T67 + T68; + T6l = T6f + T6g; + T6h = KP559016994 * (T6f - T6g); + T6m = FNMS(KP250000000, T6l, T6k); + } + T6F = T60 + T61; + T6G = T6k + T6l; + cr[WS(rs, 1)] = FNMS(TQ, T6G, TN * T6F); + ci[WS(rs, 1)] = FMA(TQ, T6F, TN * T6G); + { + E T6w, T6C, T6A, T6E, T6u, T6z; + T6u = T62 - T5X; + T6w = T6u - T6v; + T6C = T6u + T6v; + T6z = T6m - T6h; + T6A = T6y + T6z; + T6E = T6z - T6y; + cr[WS(rs, 11)] = FNMS(T6x, T6A, T6t * T6w); + ci[WS(rs, 11)] = FMA(T6x, T6w, T6t * T6A); + cr[WS(rs, 16)] = FNMS(T6D, T6E, T6B * T6C); + ci[WS(rs, 16)] = FMA(T6D, T6C, T6B * T6E); + } + { + E T6b, T6q, T6o, T6s, T63, T6n; + T63 = T5X + T62; + T6b = T63 - T6a; + T6q = T63 + T6a; + T6n = T6h + T6m; + T6o = T6e + T6n; + T6s = T6n - T6e; + cr[WS(rs, 6)] = FNMS(T5m, T6o, T5l * T6b); + ci[WS(rs, 6)] = FMA(T5m, T6b, T5l * T6o); + cr[WS(rs, 21)] = FNMS(T6r, T6s, T6p * T6q); + ci[WS(rs, 21)] = FMA(T6r, T6q, T6p * T6s); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 24}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hb2_25", twinstr, &GENUS, {280, 180, 160, 0} }; + +void X(codelet_hb2_25) (planner *p) { + X(khc2hc_register) (p, hb2_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_32.c new file mode 100644 index 000000000..db91722c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_32.c @@ -0,0 +1,1882 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:38 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 32 -dif -name hb2_32 -include rdft/scalar/hb.h */ + +/* + * This function contains 488 FP additions, 350 FP multiplications, + * (or, 236 additions, 98 multiplications, 252 fused multiply/add), + * 164 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T11, T14, T12, T37, T17, T1b, T39, T3a, T3v, T3d, T3x, T15, T16, T5X, T4p; + E T3G, T78, T7e, T8S, T9s, T8P, T8V, T98, T9m, T7I, T7C, T3y, T4b, T3C, T4g; + E T5u, T6b, T5I, T6e, T1a, T1c, T2O, T4r, T4s, T4W, T3J, T3K, T3Y, T5Z, T60; + E T66, T3i, T3q, T3l, T3e, T7S, T8K, T8m, T8E, T5k, T5U, T5R, T5e, T6i, T7s; + E T6O, T7o; + { + E T77, T9l, T7B, T7d, T9r, T7H, T3b, T5d, T19, T3I; + { + E T13, T3F, T38, T3c; + T11 = W[2]; + T14 = W[3]; + T12 = W[4]; + T37 = W[0]; + T13 = T11 * T12; + T3F = T37 * T12; + T38 = T37 * T11; + T3c = T37 * T14; + T17 = W[6]; + T77 = T37 * T17; + T9l = T12 * T17; + T7B = T11 * T17; + T1b = W[7]; + T7d = T37 * T1b; + T9r = T12 * T1b; + T7H = T11 * T1b; + T39 = W[1]; + T3a = FNMS(T39, T14, T38); + T3v = FMA(T39, T14, T38); + T3b = T3a * T12; + T5d = T3v * T12; + T3d = FMA(T39, T11, T3c); + T3x = FNMS(T39, T11, T3c); + T15 = W[5]; + T19 = T11 * T15; + T3I = T37 * T15; + T16 = FMA(T14, T15, T13); + T5X = FNMS(T14, T15, T13); + T4p = FMA(T39, T15, T3F); + T3G = FNMS(T39, T15, T3F); + } + T78 = FNMS(T39, T1b, T77); + T7e = FMA(T39, T17, T7d); + T8S = FMA(T14, T17, T7H); + T9s = FNMS(T15, T17, T9r); + T8P = FNMS(T14, T1b, T7B); + T8V = FMA(T39, T1b, T77); + T98 = FNMS(T39, T17, T7d); + T9m = FMA(T15, T1b, T9l); + T7I = FNMS(T14, T17, T7H); + T7C = FMA(T14, T1b, T7B); + { + E T3w, T3B, T5Y, T65; + T3w = T3v * T17; + T3y = FNMS(T3x, T1b, T3w); + T4b = FMA(T3x, T1b, T3w); + T3B = T3v * T1b; + T3C = FMA(T3x, T17, T3B); + T4g = FNMS(T3x, T17, T3B); + { + E T5t, T5H, T18, T2N; + T5t = T3a * T17; + T5u = FMA(T3d, T1b, T5t); + T6b = FNMS(T3d, T1b, T5t); + T5H = T3a * T1b; + T5I = FNMS(T3d, T17, T5H); + T6e = FMA(T3d, T17, T5H); + T18 = T16 * T17; + T2N = T16 * T1b; + T1a = FNMS(T14, T12, T19); + T1c = FMA(T1a, T1b, T18); + T2O = FNMS(T1a, T17, T2N); + } + { + E T4q, T4V, T3H, T3X; + T4q = T4p * T17; + T4V = T4p * T1b; + T4r = FNMS(T39, T12, T3I); + T4s = FMA(T4r, T1b, T4q); + T4W = FNMS(T4r, T17, T4V); + T3H = T3G * T17; + T3X = T3G * T1b; + T3J = FMA(T39, T12, T3I); + T3K = FMA(T3J, T1b, T3H); + T3Y = FNMS(T3J, T17, T3X); + } + T5Y = T5X * T17; + T65 = T5X * T1b; + T5Z = FMA(T14, T12, T19); + T60 = FMA(T5Z, T1b, T5Y); + T66 = FNMS(T5Z, T17, T65); + { + E T8D, T8J, T7R, T8l, T3h; + T3h = T3a * T15; + T3i = FNMS(T3d, T12, T3h); + T3q = FMA(T3d, T12, T3h); + T3l = FNMS(T3d, T15, T3b); + T8D = T3l * T17; + T8J = T3l * T1b; + T3e = FMA(T3d, T15, T3b); + T7R = T3e * T17; + T8l = T3e * T1b; + T7S = FMA(T3i, T1b, T7R); + T8K = FNMS(T3q, T17, T8J); + T8m = FNMS(T3i, T17, T8l); + T8E = FMA(T3q, T1b, T8D); + } + { + E T6h, T6N, T7n, T7r, T5j; + T5j = T3v * T15; + T5k = FMA(T3x, T12, T5j); + T5U = FNMS(T3x, T12, T5j); + T5R = FMA(T3x, T15, T5d); + T6h = T5R * T17; + T6N = T5R * T1b; + T5e = FNMS(T3x, T15, T5d); + T7n = T5e * T17; + T7r = T5e * T1b; + T6i = FMA(T5U, T1b, T6h); + T7s = FNMS(T5k, T17, T7r); + T6O = FNMS(T5U, T17, T6N); + T7o = FMA(T5k, T1b, T7n); + } + } + } + { + E Tf, T6j, T7V, T8W, T8p, T99, T1t, T3L, T2X, T3Z, T4Z, T5J, T6W, T7t, T4v; + E T5v, TZ, T7x, T28, T3S, T91, T9d, T2h, T3R, T4Q, T5B, T8a, T8v, T4N, T5C; + E T6J, T6Z, TK, T7w, T2z, T3P, T94, T9c, T2I, T3O, T4J, T5y, T8h, T8u, T4G; + E T5z, T6A, T6Y, Tu, T6P, T82, T9a, T8s, T8X, T1Q, T40, T30, T3M, T52, T5w; + E T6q, T7u, T4C, T5K; + { + E T3, T1d, T6, T2P, T2S, T6Q, T1g, T6R, Td, T6U, T1r, T2V, Ta, T6T, T1m; + E T2U; + { + E T1, T2, T1e, T1f; + T1 = cr[0]; + T2 = ci[WS(rs, 15)]; + T3 = T1 + T2; + T1d = T1 - T2; + { + E T4, T5, T2Q, T2R; + T4 = cr[WS(rs, 8)]; + T5 = ci[WS(rs, 7)]; + T6 = T4 + T5; + T2P = T4 - T5; + T2Q = ci[WS(rs, 31)]; + T2R = cr[WS(rs, 16)]; + T2S = T2Q + T2R; + T6Q = T2Q - T2R; + } + T1e = ci[WS(rs, 23)]; + T1f = cr[WS(rs, 24)]; + T1g = T1e + T1f; + T6R = T1e - T1f; + { + E Tb, Tc, T1n, T1o, T1p, T1q; + Tb = ci[WS(rs, 3)]; + Tc = cr[WS(rs, 12)]; + T1n = Tb - Tc; + T1o = ci[WS(rs, 19)]; + T1p = cr[WS(rs, 28)]; + T1q = T1o + T1p; + Td = Tb + Tc; + T6U = T1o - T1p; + T1r = T1n - T1q; + T2V = T1n + T1q; + } + { + E T8, T9, T1i, T1j, T1k, T1l; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 11)]; + T1i = T8 - T9; + T1j = ci[WS(rs, 27)]; + T1k = cr[WS(rs, 20)]; + T1l = T1j + T1k; + Ta = T8 + T9; + T6T = T1j - T1k; + T1m = T1i - T1l; + T2U = T1i + T1l; + } + } + { + E T7, Te, T7T, T7U; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T6j = T7 - Te; + T7T = T3 - T6; + T7U = T6U - T6T; + T7V = T7T - T7U; + T8W = T7T + T7U; + } + { + E T8n, T8o, T1h, T1s; + T8n = T6Q - T6R; + T8o = Ta - Td; + T8p = T8n - T8o; + T99 = T8o + T8n; + T1h = T1d - T1g; + T1s = T1m + T1r; + T1t = FNMS(KP707106781, T1s, T1h); + T3L = FMA(KP707106781, T1s, T1h); + } + { + E T2T, T2W, T4X, T4Y; + T2T = T2P + T2S; + T2W = T2U - T2V; + T2X = FNMS(KP707106781, T2W, T2T); + T3Z = FMA(KP707106781, T2W, T2T); + T4X = T2S - T2P; + T4Y = T1m - T1r; + T4Z = FMA(KP707106781, T4Y, T4X); + T5J = FNMS(KP707106781, T4Y, T4X); + } + { + E T6S, T6V, T4t, T4u; + T6S = T6Q + T6R; + T6V = T6T + T6U; + T6W = T6S - T6V; + T7t = T6S + T6V; + T4t = T1d + T1g; + T4u = T2U + T2V; + T4v = FNMS(KP707106781, T4u, T4t); + T5v = FMA(KP707106781, T4u, T4t); + } + } + { + E TR, T87, T1S, T29, T1V, T84, T2c, T6E, TY, T85, T88, T21, T26, T2f, T6H; + E T2e, T86, T89; + { + E TL, TM, TN, TO, TP, TQ; + TL = ci[0]; + TM = cr[WS(rs, 15)]; + TN = TL + TM; + TO = cr[WS(rs, 7)]; + TP = ci[WS(rs, 8)]; + TQ = TO + TP; + TR = TN + TQ; + T87 = TN - TQ; + T1S = TO - TP; + T29 = TL - TM; + } + { + E T1T, T1U, T6C, T2a, T2b, T6D; + T1T = ci[WS(rs, 16)]; + T1U = cr[WS(rs, 31)]; + T6C = T1T - T1U; + T2a = ci[WS(rs, 24)]; + T2b = cr[WS(rs, 23)]; + T6D = T2a - T2b; + T1V = T1T + T1U; + T84 = T6C - T6D; + T2c = T2a + T2b; + T6E = T6C + T6D; + } + { + E TU, T1X, T25, T6G, TX, T22, T20, T6F; + { + E TS, TT, T23, T24; + TS = cr[WS(rs, 3)]; + TT = ci[WS(rs, 12)]; + TU = TS + TT; + T1X = TS - TT; + T23 = ci[WS(rs, 20)]; + T24 = cr[WS(rs, 27)]; + T25 = T23 + T24; + T6G = T23 - T24; + } + { + E TV, TW, T1Y, T1Z; + TV = ci[WS(rs, 4)]; + TW = cr[WS(rs, 11)]; + TX = TV + TW; + T22 = TV - TW; + T1Y = ci[WS(rs, 28)]; + T1Z = cr[WS(rs, 19)]; + T20 = T1Y + T1Z; + T6F = T1Y - T1Z; + } + TY = TU + TX; + T85 = TU - TX; + T88 = T6G - T6F; + T21 = T1X + T20; + T26 = T22 + T25; + T2f = T22 - T25; + T6H = T6F + T6G; + T2e = T1X - T20; + } + TZ = TR + TY; + T7x = T6E + T6H; + { + E T1W, T27, T8Z, T90; + T1W = T1S - T1V; + T27 = T21 - T26; + T28 = FNMS(KP707106781, T27, T1W); + T3S = FMA(KP707106781, T27, T1W); + T8Z = T85 + T84; + T90 = T87 + T88; + T91 = FNMS(KP414213562, T90, T8Z); + T9d = FMA(KP414213562, T8Z, T90); + } + { + E T2d, T2g, T4O, T4P; + T2d = T29 - T2c; + T2g = T2e + T2f; + T2h = FNMS(KP707106781, T2g, T2d); + T3R = FMA(KP707106781, T2g, T2d); + T4O = T1S + T1V; + T4P = T2e - T2f; + T4Q = FNMS(KP707106781, T4P, T4O); + T5B = FMA(KP707106781, T4P, T4O); + } + T86 = T84 - T85; + T89 = T87 - T88; + T8a = FMA(KP414213562, T89, T86); + T8v = FNMS(KP414213562, T86, T89); + { + E T4L, T4M, T6B, T6I; + T4L = T29 + T2c; + T4M = T21 + T26; + T4N = FNMS(KP707106781, T4M, T4L); + T5C = FMA(KP707106781, T4M, T4L); + T6B = TR - TY; + T6I = T6E - T6H; + T6J = T6B + T6I; + T6Z = T6I - T6B; + } + } + { + E TC, T8e, T2j, T2A, T2m, T8b, T2D, T6v, TJ, T8c, T8f, T2s, T2x, T2G, T6y; + E T2F, T8d, T8g; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = cr[WS(rs, 1)]; + Tx = ci[WS(rs, 14)]; + Ty = Tw + Tx; + Tz = cr[WS(rs, 9)]; + TA = ci[WS(rs, 6)]; + TB = Tz + TA; + TC = Ty + TB; + T8e = Ty - TB; + T2j = Tz - TA; + T2A = Tw - Tx; + } + { + E T2k, T2l, T6t, T2B, T2C, T6u; + T2k = ci[WS(rs, 30)]; + T2l = cr[WS(rs, 17)]; + T6t = T2k - T2l; + T2B = ci[WS(rs, 22)]; + T2C = cr[WS(rs, 25)]; + T6u = T2B - T2C; + T2m = T2k + T2l; + T8b = T6t - T6u; + T2D = T2B + T2C; + T6v = T6t + T6u; + } + { + E TF, T2o, T2w, T6x, TI, T2t, T2r, T6w; + { + E TD, TE, T2u, T2v; + TD = cr[WS(rs, 5)]; + TE = ci[WS(rs, 10)]; + TF = TD + TE; + T2o = TD - TE; + T2u = ci[WS(rs, 18)]; + T2v = cr[WS(rs, 29)]; + T2w = T2u + T2v; + T6x = T2u - T2v; + } + { + E TG, TH, T2p, T2q; + TG = ci[WS(rs, 2)]; + TH = cr[WS(rs, 13)]; + TI = TG + TH; + T2t = TG - TH; + T2p = ci[WS(rs, 26)]; + T2q = cr[WS(rs, 21)]; + T2r = T2p + T2q; + T6w = T2p - T2q; + } + TJ = TF + TI; + T8c = TF - TI; + T8f = T6x - T6w; + T2s = T2o + T2r; + T2x = T2t + T2w; + T2G = T2t - T2w; + T6y = T6w + T6x; + T2F = T2o - T2r; + } + TK = TC + TJ; + T7w = T6v + T6y; + { + E T2n, T2y, T92, T93; + T2n = T2j + T2m; + T2y = T2s - T2x; + T2z = FNMS(KP707106781, T2y, T2n); + T3P = FMA(KP707106781, T2y, T2n); + T92 = T8c + T8b; + T93 = T8e + T8f; + T94 = FMA(KP414213562, T93, T92); + T9c = FNMS(KP414213562, T92, T93); + } + { + E T2E, T2H, T4H, T4I; + T2E = T2A - T2D; + T2H = T2F + T2G; + T2I = FNMS(KP707106781, T2H, T2E); + T3O = FMA(KP707106781, T2H, T2E); + T4H = T2m - T2j; + T4I = T2G - T2F; + T4J = FNMS(KP707106781, T4I, T4H); + T5y = FMA(KP707106781, T4I, T4H); + } + T8d = T8b - T8c; + T8g = T8e - T8f; + T8h = FNMS(KP414213562, T8g, T8d); + T8u = FMA(KP414213562, T8d, T8g); + { + E T4E, T4F, T6s, T6z; + T4E = T2A + T2D; + T4F = T2s + T2x; + T4G = FNMS(KP707106781, T4F, T4E); + T5z = FMA(KP707106781, T4F, T4E); + T6s = TC - TJ; + T6z = T6v - T6y; + T6A = T6s - T6z; + T6Y = T6s + T6z; + } + } + { + E Ti, T6o, Tl, T6n, T1J, T1O, T80, T7Z, T4x, T4w, Tp, T6l, Ts, T6k, T1y; + E T1D, T7X, T7W, T4A, T4z; + { + E T1K, T1N, T1F, T1I; + { + E Tg, Th, T1L, T1M; + Tg = cr[WS(rs, 2)]; + Th = ci[WS(rs, 13)]; + Ti = Tg + Th; + T1K = Tg - Th; + T1L = ci[WS(rs, 21)]; + T1M = cr[WS(rs, 26)]; + T1N = T1L + T1M; + T6o = T1L - T1M; + } + { + E Tj, Tk, T1G, T1H; + Tj = cr[WS(rs, 10)]; + Tk = ci[WS(rs, 5)]; + Tl = Tj + Tk; + T1F = Tj - Tk; + T1G = ci[WS(rs, 29)]; + T1H = cr[WS(rs, 18)]; + T1I = T1G + T1H; + T6n = T1G - T1H; + } + T1J = T1F + T1I; + T1O = T1K - T1N; + T80 = T6n - T6o; + T7Z = Ti - Tl; + T4x = T1K + T1N; + T4w = T1I - T1F; + } + { + E T1z, T1C, T1u, T1x; + { + E Tn, To, T1A, T1B; + Tn = ci[WS(rs, 1)]; + To = cr[WS(rs, 14)]; + Tp = Tn + To; + T1z = Tn - To; + T1A = ci[WS(rs, 25)]; + T1B = cr[WS(rs, 22)]; + T1C = T1A + T1B; + T6l = T1A - T1B; + } + { + E Tq, Tr, T1v, T1w; + Tq = cr[WS(rs, 6)]; + Tr = ci[WS(rs, 9)]; + Ts = Tq + Tr; + T1u = Tq - Tr; + T1v = ci[WS(rs, 17)]; + T1w = cr[WS(rs, 30)]; + T1x = T1v + T1w; + T6k = T1v - T1w; + } + T1y = T1u - T1x; + T1D = T1z - T1C; + T7X = Tp - Ts; + T7W = T6k - T6l; + T4A = T1z + T1C; + T4z = T1u + T1x; + } + { + E Tm, Tt, T7Y, T81; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T6P = Tm - Tt; + T7Y = T7W - T7X; + T81 = T7Z + T80; + T82 = T7Y - T81; + T9a = T81 + T7Y; + } + { + E T8q, T8r, T1E, T1P; + T8q = T7Z - T80; + T8r = T7X + T7W; + T8s = T8q - T8r; + T8X = T8q + T8r; + T1E = FNMS(KP414213562, T1D, T1y); + T1P = FMA(KP414213562, T1O, T1J); + T1Q = T1E - T1P; + T40 = T1P + T1E; + } + { + E T2Y, T2Z, T50, T51; + T2Y = FNMS(KP414213562, T1J, T1O); + T2Z = FMA(KP414213562, T1y, T1D); + T30 = T2Y - T2Z; + T3M = T2Y + T2Z; + T50 = FMA(KP414213562, T4w, T4x); + T51 = FMA(KP414213562, T4z, T4A); + T52 = T50 - T51; + T5w = T50 + T51; + } + { + E T6m, T6p, T4y, T4B; + T6m = T6k + T6l; + T6p = T6n + T6o; + T6q = T6m - T6p; + T7u = T6p + T6m; + T4y = FNMS(KP414213562, T4x, T4w); + T4B = FNMS(KP414213562, T4A, T4z); + T4C = T4y + T4B; + T5K = T4B - T4y; + } + } + { + E Tv, T10, T7p, T7v, T7y, T7z, T7q, T7A; + Tv = Tf + Tu; + T10 = TK + TZ; + T7p = Tv - T10; + T7v = T7t + T7u; + T7y = T7w + T7x; + T7z = T7v - T7y; + cr[0] = Tv + T10; + ci[0] = T7v + T7y; + T7q = T7o * T7p; + cr[WS(rs, 16)] = FNMS(T7s, T7z, T7q); + T7A = T7s * T7p; + ci[WS(rs, 16)] = FMA(T7o, T7z, T7A); + } + { + E T9p, T9x, T9v, T9z; + { + E T9n, T9o, T9t, T9u; + T9n = FMA(KP707106781, T8X, T8W); + T9o = T9c + T9d; + T9p = FNMS(KP923879532, T9o, T9n); + T9x = FMA(KP923879532, T9o, T9n); + T9t = FMA(KP707106781, T9a, T99); + T9u = T94 + T91; + T9v = FNMS(KP923879532, T9u, T9t); + T9z = FMA(KP923879532, T9u, T9t); + } + { + E T9q, T9w, T9y, T9A; + T9q = T9m * T9p; + cr[WS(rs, 18)] = FNMS(T9s, T9v, T9q); + T9w = T9m * T9v; + ci[WS(rs, 18)] = FMA(T9s, T9p, T9w); + T9y = T3v * T9x; + cr[WS(rs, 2)] = FNMS(T3x, T9z, T9y); + T9A = T3v * T9z; + ci[WS(rs, 2)] = FMA(T3x, T9x, T9A); + } + } + { + E T8H, T8Q, T8N, T8T; + { + E T8F, T8G, T8L, T8M; + T8F = FNMS(KP707106781, T82, T7V); + T8G = T8u + T8v; + T8H = FNMS(KP923879532, T8G, T8F); + T8Q = FMA(KP923879532, T8G, T8F); + T8L = FNMS(KP707106781, T8s, T8p); + T8M = T8h + T8a; + T8N = FNMS(KP923879532, T8M, T8L); + T8T = FMA(KP923879532, T8M, T8L); + } + { + E T8I, T8O, T8R, T8U; + T8I = T8E * T8H; + cr[WS(rs, 14)] = FNMS(T8K, T8N, T8I); + T8O = T8E * T8N; + ci[WS(rs, 14)] = FMA(T8K, T8H, T8O); + T8R = T8P * T8Q; + cr[WS(rs, 30)] = FNMS(T8S, T8T, T8R); + T8U = T8P * T8T; + ci[WS(rs, 30)] = FMA(T8S, T8Q, T8U); + } + } + { + E T7b, T7j, T7h, T7l; + { + E T79, T7a, T7f, T7g; + T79 = T6j - T6q; + T7a = T6Z - T6Y; + T7b = FNMS(KP707106781, T7a, T79); + T7j = FMA(KP707106781, T7a, T79); + T7f = T6W - T6P; + T7g = T6A - T6J; + T7h = FNMS(KP707106781, T7g, T7f); + T7l = FMA(KP707106781, T7g, T7f); + } + { + E T7c, T7i, T7k, T7m; + T7c = T78 * T7b; + cr[WS(rs, 28)] = FNMS(T7e, T7h, T7c); + T7i = T78 * T7h; + ci[WS(rs, 28)] = FMA(T7e, T7b, T7i); + T7k = T5X * T7j; + cr[WS(rs, 12)] = FNMS(T5Z, T7l, T7k); + T7m = T5X * T7l; + ci[WS(rs, 12)] = FMA(T5Z, T7j, T7m); + } + } + { + E T96, T9h, T9f, T9j; + { + E T8Y, T95, T9b, T9e; + T8Y = FNMS(KP707106781, T8X, T8W); + T95 = T91 - T94; + T96 = FNMS(KP923879532, T95, T8Y); + T9h = FMA(KP923879532, T95, T8Y); + T9b = FNMS(KP707106781, T9a, T99); + T9e = T9c - T9d; + T9f = FNMS(KP923879532, T9e, T9b); + T9j = FMA(KP923879532, T9e, T9b); + } + { + E T97, T9g, T9i, T9k; + T97 = T8V * T96; + cr[WS(rs, 26)] = FNMS(T98, T9f, T97); + T9g = T98 * T96; + ci[WS(rs, 26)] = FMA(T8V, T9f, T9g); + T9i = T3G * T9h; + cr[WS(rs, 10)] = FNMS(T3J, T9j, T9i); + T9k = T3J * T9h; + ci[WS(rs, 10)] = FMA(T3G, T9j, T9k); + } + } + { + E T6L, T73, T71, T75; + { + E T6r, T6K, T6X, T70; + T6r = T6j + T6q; + T6K = T6A + T6J; + T6L = FNMS(KP707106781, T6K, T6r); + T73 = FMA(KP707106781, T6K, T6r); + T6X = T6P + T6W; + T70 = T6Y + T6Z; + T71 = FNMS(KP707106781, T70, T6X); + T75 = FMA(KP707106781, T70, T6X); + } + { + E T6M, T72, T74, T76; + T6M = T6i * T6L; + cr[WS(rs, 20)] = FNMS(T6O, T71, T6M); + T72 = T6O * T6L; + ci[WS(rs, 20)] = FMA(T6i, T71, T72); + T74 = T3a * T73; + cr[WS(rs, 4)] = FNMS(T3d, T75, T74); + T76 = T3d * T73; + ci[WS(rs, 4)] = FMA(T3a, T75, T76); + } + } + { + E T7F, T7N, T7L, T7P; + { + E T7D, T7E, T7J, T7K; + T7D = Tf - Tu; + T7E = T7x - T7w; + T7F = T7D - T7E; + T7N = T7D + T7E; + T7J = T7t - T7u; + T7K = TK - TZ; + T7L = T7J - T7K; + T7P = T7K + T7J; + } + { + E T7G, T7M, T7O, T7Q; + T7G = T7C * T7F; + cr[WS(rs, 24)] = FNMS(T7I, T7L, T7G); + T7M = T7C * T7L; + ci[WS(rs, 24)] = FMA(T7I, T7F, T7M); + T7O = T4p * T7N; + cr[WS(rs, 8)] = FNMS(T4r, T7P, T7O); + T7Q = T4p * T7P; + ci[WS(rs, 8)] = FMA(T4r, T7N, T7Q); + } + } + { + E T8j, T8z, T8x, T8B; + { + E T83, T8i, T8t, T8w; + T83 = FMA(KP707106781, T82, T7V); + T8i = T8a - T8h; + T8j = FNMS(KP923879532, T8i, T83); + T8z = FMA(KP923879532, T8i, T83); + T8t = FMA(KP707106781, T8s, T8p); + T8w = T8u - T8v; + T8x = FNMS(KP923879532, T8w, T8t); + T8B = FMA(KP923879532, T8w, T8t); + } + { + E T8k, T8y, T8A, T8C; + T8k = T7S * T8j; + cr[WS(rs, 22)] = FNMS(T8m, T8x, T8k); + T8y = T8m * T8j; + ci[WS(rs, 22)] = FMA(T7S, T8x, T8y); + T8A = T16 * T8z; + cr[WS(rs, 6)] = FNMS(T1a, T8B, T8A); + T8C = T1a * T8z; + ci[WS(rs, 6)] = FMA(T16, T8B, T8C); + } + } + { + E T3r, T2L, T3s, T3f, T35, T3z, T3j, T3o; + T3r = FNMS(KP923879532, T30, T2X); + { + E T1R, T2i, T2J, T2K; + T1R = FMA(KP923879532, T1Q, T1t); + T2i = FMA(KP668178637, T2h, T28); + T2J = FNMS(KP668178637, T2I, T2z); + T2K = T2i - T2J; + T2L = FNMS(KP831469612, T2K, T1R); + T3s = T2J + T2i; + T3f = FMA(KP831469612, T2K, T1R); + } + { + E T31, T3m, T34, T3n, T32, T33; + T31 = FMA(KP923879532, T30, T2X); + T3m = FNMS(KP923879532, T1Q, T1t); + T32 = FMA(KP668178637, T2z, T2I); + T33 = FNMS(KP668178637, T28, T2h); + T34 = T32 - T33; + T3n = T32 + T33; + T35 = FNMS(KP831469612, T34, T31); + T3z = FMA(KP831469612, T3n, T3m); + T3j = FMA(KP831469612, T34, T31); + T3o = FNMS(KP831469612, T3n, T3m); + } + { + E T2M, T36, T3g, T3k; + T2M = T1c * T2L; + cr[WS(rs, 21)] = FNMS(T2O, T35, T2M); + T36 = T1c * T35; + ci[WS(rs, 21)] = FMA(T2O, T2L, T36); + T3g = T3e * T3f; + cr[WS(rs, 5)] = FNMS(T3i, T3j, T3g); + T3k = T3e * T3j; + ci[WS(rs, 5)] = FMA(T3i, T3f, T3k); + { + E T3A, T3E, T3D, T3p, T3u, T3t; + T3A = T3y * T3z; + T3E = T3C * T3z; + T3D = FMA(KP831469612, T3s, T3r); + cr[WS(rs, 29)] = FNMS(T3C, T3D, T3A); + ci[WS(rs, 29)] = FMA(T3y, T3D, T3E); + T3p = T3l * T3o; + T3u = T3q * T3o; + T3t = FNMS(KP831469612, T3s, T3r); + cr[WS(rs, 13)] = FNMS(T3q, T3t, T3p); + ci[WS(rs, 13)] = FMA(T3l, T3t, T3u); + } + } + } + { + E T53, T56, T5p, T5h, T4T, T5r, T59, T5n; + T53 = FMA(KP923879532, T52, T4Z); + { + E T5f, T54, T55, T5g; + T5f = FMA(KP923879532, T4C, T4v); + T54 = FMA(KP668178637, T4G, T4J); + T55 = FMA(KP668178637, T4N, T4Q); + T5g = T54 + T55; + T56 = T54 - T55; + T5p = FMA(KP831469612, T5g, T5f); + T5h = FNMS(KP831469612, T5g, T5f); + } + { + E T4D, T5l, T4S, T5m, T4K, T4R; + T4D = FNMS(KP923879532, T4C, T4v); + T5l = FNMS(KP923879532, T52, T4Z); + T4K = FNMS(KP668178637, T4J, T4G); + T4R = FNMS(KP668178637, T4Q, T4N); + T4S = T4K + T4R; + T5m = T4K - T4R; + T4T = FNMS(KP831469612, T4S, T4D); + T5r = FNMS(KP831469612, T5m, T5l); + T59 = FMA(KP831469612, T4S, T4D); + T5n = FMA(KP831469612, T5m, T5l); + } + { + E T5i, T5o, T5q, T5s; + T5i = T5e * T5h; + cr[WS(rs, 11)] = FNMS(T5k, T5n, T5i); + T5o = T5e * T5n; + ci[WS(rs, 11)] = FMA(T5k, T5h, T5o); + T5q = T17 * T5p; + cr[WS(rs, 27)] = FNMS(T1b, T5r, T5q); + T5s = T17 * T5r; + ci[WS(rs, 27)] = FMA(T1b, T5p, T5s); + { + E T5a, T5c, T5b, T4U, T58, T57; + T5a = T11 * T59; + T5c = T14 * T59; + T5b = FMA(KP831469612, T56, T53); + cr[WS(rs, 3)] = FNMS(T14, T5b, T5a); + ci[WS(rs, 3)] = FMA(T11, T5b, T5c); + T4U = T4s * T4T; + T58 = T4W * T4T; + T57 = FNMS(KP831469612, T56, T53); + cr[WS(rs, 19)] = FNMS(T4W, T57, T4U); + ci[WS(rs, 19)] = FMA(T4s, T57, T58); + } + } + } + { + E T41, T44, T4l, T4e, T3V, T4n, T47, T4j; + T41 = FMA(KP923879532, T40, T3Z); + { + E T4c, T42, T43, T4d; + T4c = FNMS(KP923879532, T3M, T3L); + T42 = FMA(KP198912367, T3O, T3P); + T43 = FNMS(KP198912367, T3R, T3S); + T4d = T43 - T42; + T44 = T42 + T43; + T4l = FMA(KP980785280, T4d, T4c); + T4e = FNMS(KP980785280, T4d, T4c); + } + { + E T3N, T4h, T3U, T4i, T3Q, T3T; + T3N = FMA(KP923879532, T3M, T3L); + T4h = FNMS(KP923879532, T40, T3Z); + T3Q = FNMS(KP198912367, T3P, T3O); + T3T = FMA(KP198912367, T3S, T3R); + T3U = T3Q + T3T; + T4i = T3Q - T3T; + T3V = FNMS(KP980785280, T3U, T3N); + T4n = FMA(KP980785280, T4i, T4h); + T47 = FMA(KP980785280, T3U, T3N); + T4j = FNMS(KP980785280, T4i, T4h); + } + { + E T4f, T4k, T4m, T4o; + T4f = T4b * T4e; + cr[WS(rs, 25)] = FNMS(T4g, T4j, T4f); + T4k = T4b * T4j; + ci[WS(rs, 25)] = FMA(T4g, T4e, T4k); + T4m = T12 * T4l; + cr[WS(rs, 9)] = FNMS(T15, T4n, T4m); + T4o = T12 * T4n; + ci[WS(rs, 9)] = FMA(T15, T4l, T4o); + { + E T48, T4a, T49, T3W, T46, T45; + T48 = T37 * T47; + T4a = T39 * T47; + T49 = FMA(KP980785280, T44, T41); + cr[WS(rs, 1)] = FNMS(T39, T49, T48); + ci[WS(rs, 1)] = FMA(T37, T49, T4a); + T3W = T3K * T3V; + T46 = T3Y * T3V; + T45 = FNMS(KP980785280, T44, T41); + cr[WS(rs, 17)] = FNMS(T3Y, T45, T3W); + ci[WS(rs, 17)] = FMA(T3K, T45, T46); + } + } + } + { + E T5L, T5O, T6c, T63, T5F, T6f, T5S, T69; + T5L = FMA(KP923879532, T5K, T5J); + { + E T61, T5M, T5N, T62; + T61 = FMA(KP923879532, T5w, T5v); + T5M = FMA(KP198912367, T5y, T5z); + T5N = FMA(KP198912367, T5B, T5C); + T62 = T5M + T5N; + T5O = T5M - T5N; + T6c = FMA(KP980785280, T62, T61); + T63 = FNMS(KP980785280, T62, T61); + } + { + E T5x, T67, T5E, T68, T5A, T5D; + T5x = FNMS(KP923879532, T5w, T5v); + T67 = FNMS(KP923879532, T5K, T5J); + T5A = FNMS(KP198912367, T5z, T5y); + T5D = FNMS(KP198912367, T5C, T5B); + T5E = T5A + T5D; + T68 = T5D - T5A; + T5F = FMA(KP980785280, T5E, T5x); + T6f = FNMS(KP980785280, T68, T67); + T5S = FNMS(KP980785280, T5E, T5x); + T69 = FMA(KP980785280, T68, T67); + } + { + E T64, T6a, T6d, T6g; + T64 = T60 * T63; + cr[WS(rs, 15)] = FNMS(T66, T69, T64); + T6a = T60 * T69; + ci[WS(rs, 15)] = FMA(T66, T63, T6a); + T6d = T6b * T6c; + cr[WS(rs, 31)] = FNMS(T6e, T6f, T6d); + T6g = T6b * T6f; + ci[WS(rs, 31)] = FMA(T6e, T6c, T6g); + { + E T5T, T5W, T5V, T5G, T5Q, T5P; + T5T = T5R * T5S; + T5W = T5U * T5S; + T5V = FMA(KP980785280, T5O, T5L); + cr[WS(rs, 7)] = FNMS(T5U, T5V, T5T); + ci[WS(rs, 7)] = FMA(T5R, T5V, T5W); + T5G = T5u * T5F; + T5Q = T5I * T5F; + T5P = FNMS(KP980785280, T5O, T5L); + cr[WS(rs, 23)] = FNMS(T5I, T5P, T5G); + ci[WS(rs, 23)] = FMA(T5u, T5P, T5Q); + } + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hb2_32", twinstr, &GENUS, {236, 98, 252, 0} }; + +void X(codelet_hb2_32) (planner *p) { + X(khc2hc_register) (p, hb2_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 32 -dif -name hb2_32 -include rdft/scalar/hb.h */ + +/* + * This function contains 488 FP additions, 280 FP multiplications, + * (or, 376 additions, 168 multiplications, 112 fused multiply/add), + * 160 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T11, T14, T12, T15, T17, T2z, T2B, T1c, T18, T1d, T1g, T1k, T2F, T2L, T3t; + E T4H, T3h, T3V, T3b, T4v, T4T, T4X, T6t, T71, T6z, T75, T81, T8x, T8f, T8z; + E T2R, T2V, T8p, T8t, T4r, T4t, T53, T69, T3n, T3r, T7P, T7T, T4P, T4R, T6F; + E T6R, T1f, T2X, T1j, T2Y, T1l, T31, T2d, T2Z, T49, T4h, T4c, T4i, T4d, T4n; + E T4f, T4j; + { + E T2P, T3q, T2U, T3l, T2Q, T3p, T2T, T3m, T2D, T3g, T2K, T39, T2E, T3f, T2J; + E T3a; + { + E T13, T1b, T16, T1a; + T11 = W[0]; + T14 = W[1]; + T12 = W[2]; + T15 = W[3]; + T13 = T11 * T12; + T1b = T14 * T12; + T16 = T14 * T15; + T1a = T11 * T15; + T17 = T13 + T16; + T2z = T13 - T16; + T2B = T1a + T1b; + T1c = T1a - T1b; + T18 = W[4]; + T2P = T12 * T18; + T3q = T14 * T18; + T2U = T15 * T18; + T3l = T11 * T18; + T1d = W[5]; + T2Q = T15 * T1d; + T3p = T11 * T1d; + T2T = T12 * T1d; + T3m = T14 * T1d; + T1g = W[6]; + T2D = T11 * T1g; + T3g = T15 * T1g; + T2K = T14 * T1g; + T39 = T12 * T1g; + T1k = W[7]; + T2E = T14 * T1k; + T3f = T12 * T1k; + T2J = T11 * T1k; + T3a = T15 * T1k; + } + T2F = T2D - T2E; + T2L = T2J + T2K; + T3t = T39 - T3a; + T4H = T2J - T2K; + T3h = T3f - T3g; + T3V = T3f + T3g; + T3b = T39 + T3a; + T4v = T2D + T2E; + T4T = FMA(T18, T1g, T1d * T1k); + T4X = FNMS(T1d, T1g, T18 * T1k); + { + E T6r, T6s, T6x, T6y; + T6r = T17 * T1g; + T6s = T1c * T1k; + T6t = T6r - T6s; + T71 = T6r + T6s; + T6x = T17 * T1k; + T6y = T1c * T1g; + T6z = T6x + T6y; + T75 = T6x - T6y; + } + { + E T7Z, T80, T8d, T8e; + T7Z = T2z * T1g; + T80 = T2B * T1k; + T81 = T7Z + T80; + T8x = T7Z - T80; + T8d = T2z * T1k; + T8e = T2B * T1g; + T8f = T8d - T8e; + T8z = T8d + T8e; + T2R = T2P - T2Q; + T2V = T2T + T2U; + T8p = FMA(T2R, T1g, T2V * T1k); + T8t = FNMS(T2V, T1g, T2R * T1k); + } + T4r = T2P + T2Q; + T4t = T2T - T2U; + T53 = FMA(T4r, T1g, T4t * T1k); + T69 = FNMS(T4t, T1g, T4r * T1k); + T3n = T3l + T3m; + T3r = T3p - T3q; + T7P = FMA(T3n, T1g, T3r * T1k); + T7T = FNMS(T3r, T1g, T3n * T1k); + T4P = T3l - T3m; + T4R = T3p + T3q; + T6F = FMA(T4P, T1g, T4R * T1k); + T6R = FNMS(T4R, T1g, T4P * T1k); + { + E T19, T1e, T1h, T1i; + T19 = T17 * T18; + T1e = T1c * T1d; + T1f = T19 + T1e; + T2X = T19 - T1e; + T1h = T17 * T1d; + T1i = T1c * T18; + T1j = T1h - T1i; + T2Y = T1h + T1i; + } + T1l = FMA(T1f, T1g, T1j * T1k); + T31 = FNMS(T2Y, T1g, T2X * T1k); + T2d = FNMS(T1j, T1g, T1f * T1k); + T2Z = FMA(T2X, T1g, T2Y * T1k); + { + E T47, T48, T4a, T4b; + T47 = T2z * T18; + T48 = T2B * T1d; + T49 = T47 - T48; + T4h = T47 + T48; + T4a = T2z * T1d; + T4b = T2B * T18; + T4c = T4a + T4b; + T4i = T4a - T4b; + } + T4d = FMA(T49, T1g, T4c * T1k); + T4n = FNMS(T4i, T1g, T4h * T1k); + T4f = FNMS(T4c, T1g, T49 * T1k); + T4j = FMA(T4h, T1g, T4i * T1k); + } + { + E T56, T7b, T7C, T6c, Tf, T1m, T6f, T7c, T3Y, T4I, T2t, T32, T5d, T7D, T3w; + E T4w, Tu, T2e, T7g, T7F, T7j, T7G, T1B, T33, T3z, T40, T5l, T6i, T5s, T6h; + E T3C, T3Z, TK, T1D, T7v, T86, T7y, T85, T1S, T35, T3O, T4C, T5F, T6J, T5M; + E T6K, T3R, T4D, TZ, T1U, T7o, T89, T7r, T88, T29, T36, T3H, T4z, T5Y, T6M; + E T65, T6N, T3K, T4A; + { + E T3, T54, T2o, T58, T2r, T5b, T6, T6a, Ta, T57, T2h, T6b, T2k, T55, Td; + E T5a; + { + E T1, T2, T2m, T2n; + T1 = cr[0]; + T2 = ci[WS(rs, 15)]; + T3 = T1 + T2; + T54 = T1 - T2; + T2m = ci[WS(rs, 27)]; + T2n = cr[WS(rs, 20)]; + T2o = T2m - T2n; + T58 = T2m + T2n; + } + { + E T2p, T2q, T4, T5; + T2p = ci[WS(rs, 19)]; + T2q = cr[WS(rs, 28)]; + T2r = T2p - T2q; + T5b = T2p + T2q; + T4 = cr[WS(rs, 8)]; + T5 = ci[WS(rs, 7)]; + T6 = T4 + T5; + T6a = T4 - T5; + } + { + E T8, T9, T2f, T2g; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 11)]; + Ta = T8 + T9; + T57 = T8 - T9; + T2f = ci[WS(rs, 31)]; + T2g = cr[WS(rs, 16)]; + T2h = T2f - T2g; + T6b = T2f + T2g; + } + { + E T2i, T2j, Tb, Tc; + T2i = ci[WS(rs, 23)]; + T2j = cr[WS(rs, 24)]; + T2k = T2i - T2j; + T55 = T2i + T2j; + Tb = ci[WS(rs, 3)]; + Tc = cr[WS(rs, 12)]; + Td = Tb + Tc; + T5a = Tb - Tc; + } + { + E T7, Te, T2l, T2s; + T56 = T54 - T55; + T7b = T54 + T55; + T7C = T6b - T6a; + T6c = T6a + T6b; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T1m = T7 - Te; + { + E T6d, T6e, T3W, T3X; + T6d = T57 + T58; + T6e = T5a + T5b; + T6f = KP707106781 * (T6d - T6e); + T7c = KP707106781 * (T6d + T6e); + T3W = T2h - T2k; + T3X = Ta - Td; + T3Y = T3W - T3X; + T4I = T3X + T3W; + } + T2l = T2h + T2k; + T2s = T2o + T2r; + T2t = T2l - T2s; + T32 = T2l + T2s; + { + E T59, T5c, T3u, T3v; + T59 = T57 - T58; + T5c = T5a - T5b; + T5d = KP707106781 * (T59 + T5c); + T7D = KP707106781 * (T59 - T5c); + T3u = T3 - T6; + T3v = T2r - T2o; + T3w = T3u - T3v; + T4w = T3u + T3v; + } + } + } + { + E Ti, T5p, T1w, T5n, T1z, T5q, Tl, T5m, Tp, T5i, T1p, T5g, T1s, T5j, Ts; + E T5f; + { + E Tg, Th, T1u, T1v; + Tg = cr[WS(rs, 2)]; + Th = ci[WS(rs, 13)]; + Ti = Tg + Th; + T5p = Tg - Th; + T1u = ci[WS(rs, 29)]; + T1v = cr[WS(rs, 18)]; + T1w = T1u - T1v; + T5n = T1u + T1v; + } + { + E T1x, T1y, Tj, Tk; + T1x = ci[WS(rs, 21)]; + T1y = cr[WS(rs, 26)]; + T1z = T1x - T1y; + T5q = T1x + T1y; + Tj = cr[WS(rs, 10)]; + Tk = ci[WS(rs, 5)]; + Tl = Tj + Tk; + T5m = Tj - Tk; + } + { + E Tn, To, T1n, T1o; + Tn = ci[WS(rs, 1)]; + To = cr[WS(rs, 14)]; + Tp = Tn + To; + T5i = Tn - To; + T1n = ci[WS(rs, 17)]; + T1o = cr[WS(rs, 30)]; + T1p = T1n - T1o; + T5g = T1n + T1o; + } + { + E T1q, T1r, Tq, Tr; + T1q = ci[WS(rs, 25)]; + T1r = cr[WS(rs, 22)]; + T1s = T1q - T1r; + T5j = T1q + T1r; + Tq = cr[WS(rs, 6)]; + Tr = ci[WS(rs, 9)]; + Ts = Tq + Tr; + T5f = Tq - Tr; + } + { + E Tm, Tt, T7e, T7f; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T2e = Tm - Tt; + T7e = T5p + T5q; + T7f = T5n - T5m; + T7g = FNMS(KP923879532, T7f, KP382683432 * T7e); + T7F = FMA(KP382683432, T7f, KP923879532 * T7e); + } + { + E T7h, T7i, T1t, T1A; + T7h = T5i + T5j; + T7i = T5f + T5g; + T7j = FNMS(KP923879532, T7i, KP382683432 * T7h); + T7G = FMA(KP382683432, T7i, KP923879532 * T7h); + T1t = T1p + T1s; + T1A = T1w + T1z; + T1B = T1t - T1A; + T33 = T1A + T1t; + } + { + E T3x, T3y, T5h, T5k; + T3x = T1p - T1s; + T3y = Tp - Ts; + T3z = T3x - T3y; + T40 = T3y + T3x; + T5h = T5f - T5g; + T5k = T5i - T5j; + T5l = FNMS(KP382683432, T5k, KP923879532 * T5h); + T6i = FMA(KP382683432, T5h, KP923879532 * T5k); + } + { + E T5o, T5r, T3A, T3B; + T5o = T5m + T5n; + T5r = T5p - T5q; + T5s = FMA(KP923879532, T5o, KP382683432 * T5r); + T6h = FNMS(KP382683432, T5o, KP923879532 * T5r); + T3A = Ti - Tl; + T3B = T1w - T1z; + T3C = T3A + T3B; + T3Z = T3A - T3B; + } + } + { + E Ty, T5v, TB, T5G, T1J, T5w, T1G, T5H, TI, T5K, T1Q, T5D, TF, T5J, T1N; + E T5A; + { + E Tw, Tx, T1E, T1F; + Tw = cr[WS(rs, 1)]; + Tx = ci[WS(rs, 14)]; + Ty = Tw + Tx; + T5v = Tw - Tx; + { + E Tz, TA, T1H, T1I; + Tz = cr[WS(rs, 9)]; + TA = ci[WS(rs, 6)]; + TB = Tz + TA; + T5G = Tz - TA; + T1H = ci[WS(rs, 22)]; + T1I = cr[WS(rs, 25)]; + T1J = T1H - T1I; + T5w = T1H + T1I; + } + T1E = ci[WS(rs, 30)]; + T1F = cr[WS(rs, 17)]; + T1G = T1E - T1F; + T5H = T1E + T1F; + { + E TG, TH, T5B, T1O, T1P, T5C; + TG = ci[WS(rs, 2)]; + TH = cr[WS(rs, 13)]; + T5B = TG - TH; + T1O = ci[WS(rs, 18)]; + T1P = cr[WS(rs, 29)]; + T5C = T1O + T1P; + TI = TG + TH; + T5K = T5B + T5C; + T1Q = T1O - T1P; + T5D = T5B - T5C; + } + { + E TD, TE, T5y, T1L, T1M, T5z; + TD = cr[WS(rs, 5)]; + TE = ci[WS(rs, 10)]; + T5y = TD - TE; + T1L = ci[WS(rs, 26)]; + T1M = cr[WS(rs, 21)]; + T5z = T1L + T1M; + TF = TD + TE; + T5J = T5y + T5z; + T1N = T1L - T1M; + T5A = T5y - T5z; + } + } + { + E TC, TJ, T7t, T7u; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T1D = TC - TJ; + T7t = T5H - T5G; + T7u = KP707106781 * (T5A - T5D); + T7v = T7t + T7u; + T86 = T7t - T7u; + } + { + E T7w, T7x, T1K, T1R; + T7w = T5v + T5w; + T7x = KP707106781 * (T5J + T5K); + T7y = T7w - T7x; + T85 = T7w + T7x; + T1K = T1G + T1J; + T1R = T1N + T1Q; + T1S = T1K - T1R; + T35 = T1K + T1R; + } + { + E T3M, T3N, T5x, T5E; + T3M = T1G - T1J; + T3N = TF - TI; + T3O = T3M - T3N; + T4C = T3N + T3M; + T5x = T5v - T5w; + T5E = KP707106781 * (T5A + T5D); + T5F = T5x - T5E; + T6J = T5x + T5E; + } + { + E T5I, T5L, T3P, T3Q; + T5I = T5G + T5H; + T5L = KP707106781 * (T5J - T5K); + T5M = T5I - T5L; + T6K = T5I + T5L; + T3P = Ty - TB; + T3Q = T1Q - T1N; + T3R = T3P - T3Q; + T4D = T3P + T3Q; + } + } + { + E TN, T5O, TQ, T5Z, T20, T5P, T1X, T60, TX, T63, T27, T5W, TU, T62, T24; + E T5T; + { + E TL, TM, T1V, T1W; + TL = ci[0]; + TM = cr[WS(rs, 15)]; + TN = TL + TM; + T5O = TL - TM; + { + E TO, TP, T1Y, T1Z; + TO = cr[WS(rs, 7)]; + TP = ci[WS(rs, 8)]; + TQ = TO + TP; + T5Z = TO - TP; + T1Y = ci[WS(rs, 24)]; + T1Z = cr[WS(rs, 23)]; + T20 = T1Y - T1Z; + T5P = T1Y + T1Z; + } + T1V = ci[WS(rs, 16)]; + T1W = cr[WS(rs, 31)]; + T1X = T1V - T1W; + T60 = T1V + T1W; + { + E TV, TW, T5U, T25, T26, T5V; + TV = ci[WS(rs, 4)]; + TW = cr[WS(rs, 11)]; + T5U = TV - TW; + T25 = ci[WS(rs, 20)]; + T26 = cr[WS(rs, 27)]; + T5V = T25 + T26; + TX = TV + TW; + T63 = T5U + T5V; + T27 = T25 - T26; + T5W = T5U - T5V; + } + { + E TS, TT, T5R, T22, T23, T5S; + TS = cr[WS(rs, 3)]; + TT = ci[WS(rs, 12)]; + T5R = TS - TT; + T22 = ci[WS(rs, 28)]; + T23 = cr[WS(rs, 19)]; + T5S = T22 + T23; + TU = TS + TT; + T62 = T5R + T5S; + T24 = T22 - T23; + T5T = T5R - T5S; + } + } + { + E TR, TY, T7m, T7n; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T1U = TR - TY; + T7m = KP707106781 * (T5T - T5W); + T7n = T5Z + T60; + T7o = T7m - T7n; + T89 = T7n + T7m; + } + { + E T7p, T7q, T21, T28; + T7p = T5O + T5P; + T7q = KP707106781 * (T62 + T63); + T7r = T7p - T7q; + T88 = T7p + T7q; + T21 = T1X + T20; + T28 = T24 + T27; + T29 = T21 - T28; + T36 = T21 + T28; + } + { + E T3F, T3G, T5Q, T5X; + T3F = T1X - T20; + T3G = TU - TX; + T3H = T3F - T3G; + T4z = T3G + T3F; + T5Q = T5O - T5P; + T5X = KP707106781 * (T5T + T5W); + T5Y = T5Q - T5X; + T6M = T5Q + T5X; + } + { + E T61, T64, T3I, T3J; + T61 = T5Z - T60; + T64 = KP707106781 * (T62 - T63); + T65 = T61 - T64; + T6N = T61 + T64; + T3I = TN - TQ; + T3J = T27 - T24; + T3K = T3I - T3J; + T4A = T3I + T3J; + } + } + { + E Tv, T10, T30, T34, T37, T38; + Tv = Tf + Tu; + T10 = TK + TZ; + T30 = Tv - T10; + T34 = T32 + T33; + T37 = T35 + T36; + T38 = T34 - T37; + cr[0] = Tv + T10; + ci[0] = T34 + T37; + cr[WS(rs, 16)] = FNMS(T31, T38, T2Z * T30); + ci[WS(rs, 16)] = FMA(T31, T30, T2Z * T38); + } + { + E T3e, T3o, T3k, T3s; + { + E T3c, T3d, T3i, T3j; + T3c = Tf - Tu; + T3d = T36 - T35; + T3e = T3c - T3d; + T3o = T3c + T3d; + T3i = T32 - T33; + T3j = TK - TZ; + T3k = T3i - T3j; + T3s = T3j + T3i; + } + cr[WS(rs, 24)] = FNMS(T3h, T3k, T3b * T3e); + ci[WS(rs, 24)] = FMA(T3b, T3k, T3h * T3e); + cr[WS(rs, 8)] = FNMS(T3r, T3s, T3n * T3o); + ci[WS(rs, 8)] = FMA(T3n, T3s, T3r * T3o); + } + { + E T1C, T2u, T2M, T2G, T2x, T2H, T2b, T2N; + T1C = T1m + T1B; + T2u = T2e + T2t; + T2M = T2t - T2e; + T2G = T1m - T1B; + { + E T2v, T2w, T1T, T2a; + T2v = T1D + T1S; + T2w = T29 - T1U; + T2x = KP707106781 * (T2v + T2w); + T2H = KP707106781 * (T2w - T2v); + T1T = T1D - T1S; + T2a = T1U + T29; + T2b = KP707106781 * (T1T + T2a); + T2N = KP707106781 * (T1T - T2a); + } + { + E T2c, T2y, T2S, T2W; + T2c = T1C - T2b; + T2y = T2u - T2x; + cr[WS(rs, 20)] = FNMS(T2d, T2y, T1l * T2c); + ci[WS(rs, 20)] = FMA(T2d, T2c, T1l * T2y); + T2S = T2G + T2H; + T2W = T2M + T2N; + cr[WS(rs, 12)] = FNMS(T2V, T2W, T2R * T2S); + ci[WS(rs, 12)] = FMA(T2R, T2W, T2V * T2S); + } + { + E T2A, T2C, T2I, T2O; + T2A = T1C + T2b; + T2C = T2u + T2x; + cr[WS(rs, 4)] = FNMS(T2B, T2C, T2z * T2A); + ci[WS(rs, 4)] = FMA(T2B, T2A, T2z * T2C); + T2I = T2G - T2H; + T2O = T2M - T2N; + cr[WS(rs, 28)] = FNMS(T2L, T2O, T2F * T2I); + ci[WS(rs, 28)] = FMA(T2F, T2O, T2L * T2I); + } + } + { + E T4y, T4U, T4K, T4Y, T4F, T4Z, T4N, T4V, T4x, T4J; + T4x = KP707106781 * (T3Z + T40); + T4y = T4w - T4x; + T4U = T4w + T4x; + T4J = KP707106781 * (T3C + T3z); + T4K = T4I - T4J; + T4Y = T4I + T4J; + { + E T4B, T4E, T4L, T4M; + T4B = FNMS(KP382683432, T4A, KP923879532 * T4z); + T4E = FMA(KP923879532, T4C, KP382683432 * T4D); + T4F = T4B - T4E; + T4Z = T4E + T4B; + T4L = FNMS(KP382683432, T4C, KP923879532 * T4D); + T4M = FMA(KP382683432, T4z, KP923879532 * T4A); + T4N = T4L - T4M; + T4V = T4L + T4M; + } + { + E T4G, T4O, T51, T52; + T4G = T4y - T4F; + T4O = T4K - T4N; + cr[WS(rs, 26)] = FNMS(T4H, T4O, T4v * T4G); + ci[WS(rs, 26)] = FMA(T4H, T4G, T4v * T4O); + T51 = T4U + T4V; + T52 = T4Y + T4Z; + cr[WS(rs, 2)] = FNMS(T1c, T52, T17 * T51); + ci[WS(rs, 2)] = FMA(T17, T52, T1c * T51); + } + { + E T4Q, T4S, T4W, T50; + T4Q = T4y + T4F; + T4S = T4K + T4N; + cr[WS(rs, 10)] = FNMS(T4R, T4S, T4P * T4Q); + ci[WS(rs, 10)] = FMA(T4R, T4Q, T4P * T4S); + T4W = T4U - T4V; + T50 = T4Y - T4Z; + cr[WS(rs, 18)] = FNMS(T4X, T50, T4T * T4W); + ci[WS(rs, 18)] = FMA(T4T, T50, T4X * T4W); + } + } + { + E T3E, T4k, T42, T4o, T3T, T4p, T45, T4l, T3D, T41; + T3D = KP707106781 * (T3z - T3C); + T3E = T3w - T3D; + T4k = T3w + T3D; + T41 = KP707106781 * (T3Z - T40); + T42 = T3Y - T41; + T4o = T3Y + T41; + { + E T3L, T3S, T43, T44; + T3L = FNMS(KP923879532, T3K, KP382683432 * T3H); + T3S = FMA(KP382683432, T3O, KP923879532 * T3R); + T3T = T3L - T3S; + T4p = T3S + T3L; + T43 = FNMS(KP923879532, T3O, KP382683432 * T3R); + T44 = FMA(KP923879532, T3H, KP382683432 * T3K); + T45 = T43 - T44; + T4l = T43 + T44; + } + { + E T3U, T46, T4s, T4u; + T3U = T3E - T3T; + T46 = T42 - T45; + cr[WS(rs, 30)] = FNMS(T3V, T46, T3t * T3U); + ci[WS(rs, 30)] = FMA(T3V, T3U, T3t * T46); + T4s = T4k + T4l; + T4u = T4o + T4p; + cr[WS(rs, 6)] = FNMS(T4t, T4u, T4r * T4s); + ci[WS(rs, 6)] = FMA(T4r, T4u, T4t * T4s); + } + { + E T4e, T4g, T4m, T4q; + T4e = T3E + T3T; + T4g = T42 + T45; + cr[WS(rs, 14)] = FNMS(T4f, T4g, T4d * T4e); + ci[WS(rs, 14)] = FMA(T4f, T4e, T4d * T4g); + T4m = T4k - T4l; + T4q = T4o - T4p; + cr[WS(rs, 22)] = FNMS(T4n, T4q, T4j * T4m); + ci[WS(rs, 22)] = FMA(T4j, T4q, T4n * T4m); + } + } + { + E T6I, T72, T6X, T73, T6P, T77, T6U, T76; + { + E T6G, T6H, T6V, T6W; + T6G = T56 + T5d; + T6H = T6h + T6i; + T6I = T6G + T6H; + T72 = T6G - T6H; + T6V = FMA(KP195090322, T6J, KP980785280 * T6K); + T6W = FNMS(KP195090322, T6M, KP980785280 * T6N); + T6X = T6V + T6W; + T73 = T6W - T6V; + } + { + E T6L, T6O, T6S, T6T; + T6L = FNMS(KP195090322, T6K, KP980785280 * T6J); + T6O = FMA(KP980785280, T6M, KP195090322 * T6N); + T6P = T6L + T6O; + T77 = T6L - T6O; + T6S = T6c + T6f; + T6T = T5s + T5l; + T6U = T6S + T6T; + T76 = T6S - T6T; + } + { + E T6Q, T6Y, T79, T7a; + T6Q = T6I - T6P; + T6Y = T6U - T6X; + cr[WS(rs, 17)] = FNMS(T6R, T6Y, T6F * T6Q); + ci[WS(rs, 17)] = FMA(T6R, T6Q, T6F * T6Y); + T79 = T72 + T73; + T7a = T76 + T77; + cr[WS(rs, 9)] = FNMS(T1d, T7a, T18 * T79); + ci[WS(rs, 9)] = FMA(T18, T7a, T1d * T79); + } + { + E T6Z, T70, T74, T78; + T6Z = T6I + T6P; + T70 = T6U + T6X; + cr[WS(rs, 1)] = FNMS(T14, T70, T11 * T6Z); + ci[WS(rs, 1)] = FMA(T14, T6Z, T11 * T70); + T74 = T72 - T73; + T78 = T76 - T77; + cr[WS(rs, 25)] = FNMS(T75, T78, T71 * T74); + ci[WS(rs, 25)] = FMA(T71, T78, T75 * T74); + } + } + { + E T84, T8q, T8l, T8r, T8b, T8v, T8i, T8u; + { + E T82, T83, T8j, T8k; + T82 = T7b + T7c; + T83 = T7F + T7G; + T84 = T82 - T83; + T8q = T82 + T83; + T8j = FMA(KP195090322, T86, KP980785280 * T85); + T8k = FMA(KP195090322, T89, KP980785280 * T88); + T8l = T8j - T8k; + T8r = T8j + T8k; + } + { + E T87, T8a, T8g, T8h; + T87 = FNMS(KP980785280, T86, KP195090322 * T85); + T8a = FNMS(KP980785280, T89, KP195090322 * T88); + T8b = T87 + T8a; + T8v = T87 - T8a; + T8g = T7C - T7D; + T8h = T7g - T7j; + T8i = T8g + T8h; + T8u = T8g - T8h; + } + { + E T8c, T8m, T8y, T8A; + T8c = T84 - T8b; + T8m = T8i - T8l; + cr[WS(rs, 23)] = FNMS(T8f, T8m, T81 * T8c); + ci[WS(rs, 23)] = FMA(T8f, T8c, T81 * T8m); + T8y = T8q + T8r; + T8A = T8u - T8v; + cr[WS(rs, 31)] = FNMS(T8z, T8A, T8x * T8y); + ci[WS(rs, 31)] = FMA(T8x, T8A, T8z * T8y); + } + { + E T8n, T8o, T8s, T8w; + T8n = T84 + T8b; + T8o = T8i + T8l; + cr[WS(rs, 7)] = FNMS(T1j, T8o, T1f * T8n); + ci[WS(rs, 7)] = FMA(T1j, T8n, T1f * T8o); + T8s = T8q - T8r; + T8w = T8u + T8v; + cr[WS(rs, 15)] = FNMS(T8t, T8w, T8p * T8s); + ci[WS(rs, 15)] = FMA(T8p, T8w, T8t * T8s); + } + } + { + E T5u, T6u, T6n, T6v, T67, T6B, T6k, T6A; + { + E T5e, T5t, T6l, T6m; + T5e = T56 - T5d; + T5t = T5l - T5s; + T5u = T5e + T5t; + T6u = T5e - T5t; + T6l = FMA(KP831469612, T5F, KP555570233 * T5M); + T6m = FNMS(KP831469612, T5Y, KP555570233 * T65); + T6n = T6l + T6m; + T6v = T6m - T6l; + } + { + E T5N, T66, T6g, T6j; + T5N = FNMS(KP831469612, T5M, KP555570233 * T5F); + T66 = FMA(KP555570233, T5Y, KP831469612 * T65); + T67 = T5N + T66; + T6B = T5N - T66; + T6g = T6c - T6f; + T6j = T6h - T6i; + T6k = T6g + T6j; + T6A = T6g - T6j; + } + { + E T68, T6o, T6D, T6E; + T68 = T5u - T67; + T6o = T6k - T6n; + cr[WS(rs, 21)] = FNMS(T69, T6o, T53 * T68); + ci[WS(rs, 21)] = FMA(T69, T68, T53 * T6o); + T6D = T6u + T6v; + T6E = T6A + T6B; + cr[WS(rs, 13)] = FNMS(T4c, T6E, T49 * T6D); + ci[WS(rs, 13)] = FMA(T49, T6E, T4c * T6D); + } + { + E T6p, T6q, T6w, T6C; + T6p = T5u + T67; + T6q = T6k + T6n; + cr[WS(rs, 5)] = FNMS(T4i, T6q, T4h * T6p); + ci[WS(rs, 5)] = FMA(T4i, T6p, T4h * T6q); + T6w = T6u - T6v; + T6C = T6A - T6B; + cr[WS(rs, 29)] = FNMS(T6z, T6C, T6t * T6w); + ci[WS(rs, 29)] = FMA(T6t, T6C, T6z * T6w); + } + } + { + E T7l, T7Q, T7L, T7R, T7A, T7V, T7I, T7U; + { + E T7d, T7k, T7J, T7K; + T7d = T7b - T7c; + T7k = T7g + T7j; + T7l = T7d - T7k; + T7Q = T7d + T7k; + T7J = FNMS(KP555570233, T7v, KP831469612 * T7y); + T7K = FMA(KP555570233, T7o, KP831469612 * T7r); + T7L = T7J - T7K; + T7R = T7J + T7K; + } + { + E T7s, T7z, T7E, T7H; + T7s = FNMS(KP555570233, T7r, KP831469612 * T7o); + T7z = FMA(KP831469612, T7v, KP555570233 * T7y); + T7A = T7s - T7z; + T7V = T7z + T7s; + T7E = T7C + T7D; + T7H = T7F - T7G; + T7I = T7E - T7H; + T7U = T7E + T7H; + } + { + E T7B, T7M, T7X, T7Y; + T7B = T7l - T7A; + T7M = T7I - T7L; + cr[WS(rs, 27)] = FNMS(T1k, T7M, T1g * T7B); + ci[WS(rs, 27)] = FMA(T1k, T7B, T1g * T7M); + T7X = T7Q + T7R; + T7Y = T7U + T7V; + cr[WS(rs, 3)] = FNMS(T15, T7Y, T12 * T7X); + ci[WS(rs, 3)] = FMA(T12, T7Y, T15 * T7X); + } + { + E T7N, T7O, T7S, T7W; + T7N = T7l + T7A; + T7O = T7I + T7L; + cr[WS(rs, 11)] = FNMS(T2Y, T7O, T2X * T7N); + ci[WS(rs, 11)] = FMA(T2Y, T7N, T2X * T7O); + T7S = T7Q - T7R; + T7W = T7U - T7V; + cr[WS(rs, 19)] = FNMS(T7T, T7W, T7P * T7S); + ci[WS(rs, 19)] = FMA(T7P, T7W, T7T * T7S); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hb2_32", twinstr, &GENUS, {376, 168, 112, 0} }; + +void X(codelet_hb2_32) (planner *p) { + X(khc2hc_register) (p, hb2_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_4.c new file mode 100644 index 000000000..3eee573d7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_4.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:37 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 4 -dif -name hb2_4 -include rdft/scalar/hb.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 33 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(8, rs)) { + E T7, Tb, T8, Ta, Tc, Tg, T9, Tf; + T7 = W[0]; + Tb = W[3]; + T8 = W[2]; + T9 = T7 * T8; + Tf = T7 * Tb; + Ta = W[1]; + Tc = FMA(Ta, Tb, T9); + Tg = FNMS(Ta, T8, Tf); + { + E T3, T6, Td, Tj, Tz, Tx, Tr, Tm, Tv, Ts, Tw, TA; + { + E Th, Ti, Tu, Tk, Tl, Tq, Tp, Tt; + Th = ci[WS(rs, 3)]; + Ti = cr[WS(rs, 2)]; + Tu = Th + Ti; + Tk = ci[WS(rs, 2)]; + Tl = cr[WS(rs, 3)]; + Tq = Tk + Tl; + { + E T1, T2, T4, T5; + T1 = cr[0]; + T2 = ci[WS(rs, 1)]; + T3 = T1 + T2; + Tp = T1 - T2; + T4 = cr[WS(rs, 1)]; + T5 = ci[0]; + T6 = T4 + T5; + Tt = T4 - T5; + } + Td = T3 - T6; + Tj = Th - Ti; + Tz = Tu - Tt; + Tx = Tp + Tq; + Tr = Tp - Tq; + Tm = Tk - Tl; + Tv = Tt + Tu; + } + cr[0] = T3 + T6; + ci[0] = Tj + Tm; + Ts = T7 * Tr; + cr[WS(rs, 1)] = FNMS(Ta, Tv, Ts); + Tw = T7 * Tv; + ci[WS(rs, 1)] = FMA(Ta, Tr, Tw); + TA = T8 * Tz; + ci[WS(rs, 3)] = FMA(Tb, Tx, TA); + { + E Ty, Te, To, Tn; + Ty = T8 * Tx; + cr[WS(rs, 3)] = FNMS(Tb, Tz, Ty); + Te = Tc * Td; + To = Tg * Td; + Tn = Tj - Tm; + cr[WS(rs, 2)] = FNMS(Tg, Tn, Te); + ci[WS(rs, 2)] = FMA(Tc, Tn, To); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hb2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hb2_4) (planner *p) { + X(khc2hc_register) (p, hb2_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 4 -dif -name hb2_4 -include rdft/scalar/hb.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(8, rs)) { + E T7, T9, T8, Ta, Tb, Td; + T7 = W[0]; + T9 = W[1]; + T8 = W[2]; + Ta = W[3]; + Tb = FMA(T7, T8, T9 * Ta); + Td = FNMS(T9, T8, T7 * Ta); + { + E T3, Tl, T6, To, Tg, Tp, Tj, Tm, Tc, Tk; + { + E T1, T2, T4, T5; + T1 = cr[0]; + T2 = ci[WS(rs, 1)]; + T3 = T1 + T2; + Tl = T1 - T2; + T4 = cr[WS(rs, 1)]; + T5 = ci[0]; + T6 = T4 + T5; + To = T4 - T5; + } + { + E Te, Tf, Th, Ti; + Te = ci[WS(rs, 3)]; + Tf = cr[WS(rs, 2)]; + Tg = Te - Tf; + Tp = Te + Tf; + Th = ci[WS(rs, 2)]; + Ti = cr[WS(rs, 3)]; + Tj = Th - Ti; + Tm = Th + Ti; + } + cr[0] = T3 + T6; + ci[0] = Tg + Tj; + Tc = T3 - T6; + Tk = Tg - Tj; + cr[WS(rs, 2)] = FNMS(Td, Tk, Tb * Tc); + ci[WS(rs, 2)] = FMA(Td, Tc, Tb * Tk); + { + E Tn, Tq, Tr, Ts; + Tn = Tl - Tm; + Tq = To + Tp; + cr[WS(rs, 1)] = FNMS(T9, Tq, T7 * Tn); + ci[WS(rs, 1)] = FMA(T7, Tq, T9 * Tn); + Tr = Tl + Tm; + Ts = Tp - To; + cr[WS(rs, 3)] = FNMS(Ta, Ts, T8 * Tr); + ci[WS(rs, 3)] = FMA(T8, Ts, Ta * Tr); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hb2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hb2_4) (planner *p) { + X(khc2hc_register) (p, hb2_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_5.c new file mode 100644 index 000000000..2ae951f16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_5.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:40 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 5 -dif -name hb2_5 -include rdft/scalar/hb.h */ + +/* + * This function contains 44 FP additions, 40 FP multiplications, + * (or, 14 additions, 10 multiplications, 30 fused multiply/add), + * 37 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(10, rs)) { + E T9, TB, Tz, Tm, TC, TO, TG, TJ, TA, TF; + T9 = W[0]; + TB = W[3]; + Tz = W[2]; + TA = T9 * Tz; + TF = T9 * TB; + Tm = W[1]; + TC = FNMS(Tm, TB, TA); + TO = FNMS(Tm, Tz, TF); + TG = FMA(Tm, Tz, TF); + TJ = FMA(Tm, TB, TA); + { + E T1, Tb, TQ, Tw, T8, Ta, Tn, Tj, TL, Ts, Tq, Tr; + { + E T4, Tu, T7, Tv; + T1 = cr[0]; + { + E T2, T3, T5, T6; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + Tu = T2 - T3; + T5 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = T5 + T6; + Tv = T5 - T6; + } + Tb = T4 - T7; + TQ = FNMS(KP618033988, Tu, Tv); + Tw = FMA(KP618033988, Tv, Tu); + T8 = T4 + T7; + Ta = FNMS(KP250000000, T8, T1); + } + { + E Tf, To, Ti, Tp; + Tn = ci[WS(rs, 4)]; + { + E Td, Te, Tg, Th; + Td = ci[WS(rs, 3)]; + Te = cr[WS(rs, 4)]; + Tf = Td + Te; + To = Td - Te; + Tg = ci[WS(rs, 2)]; + Th = cr[WS(rs, 3)]; + Ti = Tg + Th; + Tp = Tg - Th; + } + Tj = FMA(KP618033988, Ti, Tf); + TL = FNMS(KP618033988, Tf, Ti); + Ts = To - Tp; + Tq = To + Tp; + Tr = FNMS(KP250000000, Tq, Tn); + } + cr[0] = T1 + T8; + ci[0] = Tn + Tq; + { + E Tk, TD, Tx, TH, Tc, Tt; + Tc = FMA(KP559016994, Tb, Ta); + Tk = FNMS(KP951056516, Tj, Tc); + TD = FMA(KP951056516, Tj, Tc); + Tt = FMA(KP559016994, Ts, Tr); + Tx = FMA(KP951056516, Tw, Tt); + TH = FNMS(KP951056516, Tw, Tt); + { + E Tl, Ty, TE, TI; + Tl = T9 * Tk; + cr[WS(rs, 1)] = FNMS(Tm, Tx, Tl); + Ty = Tm * Tk; + ci[WS(rs, 1)] = FMA(T9, Tx, Ty); + TE = TC * TD; + cr[WS(rs, 4)] = FNMS(TG, TH, TE); + TI = TG * TD; + ci[WS(rs, 4)] = FMA(TC, TH, TI); + } + } + { + E TM, TT, TR, TV, TK, TP; + TK = FNMS(KP559016994, Tb, Ta); + TM = FMA(KP951056516, TL, TK); + TT = FNMS(KP951056516, TL, TK); + TP = FNMS(KP559016994, Ts, Tr); + TR = FNMS(KP951056516, TQ, TP); + TV = FMA(KP951056516, TQ, TP); + { + E TN, TS, TU, TW; + TN = TJ * TM; + cr[WS(rs, 2)] = FNMS(TO, TR, TN); + TS = TO * TM; + ci[WS(rs, 2)] = FMA(TJ, TR, TS); + TU = Tz * TT; + cr[WS(rs, 3)] = FNMS(TB, TV, TU); + TW = TB * TT; + ci[WS(rs, 3)] = FMA(Tz, TV, TW); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hb2_5", twinstr, &GENUS, {14, 10, 30, 0} }; + +void X(codelet_hb2_5) (planner *p) { + X(khc2hc_register) (p, hb2_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 5 -dif -name hb2_5 -include rdft/scalar/hb.h */ + +/* + * This function contains 44 FP additions, 32 FP multiplications, + * (or, 30 additions, 18 multiplications, 14 fused multiply/add), + * 33 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(10, rs)) { + E Th, Tk, Ti, Tl, Tn, TP, Tx, TN; + { + E Tj, Tw, Tm, Tv; + Th = W[0]; + Tk = W[1]; + Ti = W[2]; + Tl = W[3]; + Tj = Th * Ti; + Tw = Tk * Ti; + Tm = Tk * Tl; + Tv = Th * Tl; + Tn = Tj + Tm; + TP = Tv + Tw; + Tx = Tv - Tw; + TN = Tj - Tm; + } + { + E T1, Tp, TK, TA, T8, To, T9, Tt, TI, TC, Tg, TB; + { + E T4, Ty, T7, Tz; + T1 = cr[0]; + { + E T2, T3, T5, T6; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + Ty = T2 - T3; + T5 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = T5 + T6; + Tz = T5 - T6; + } + Tp = KP559016994 * (T4 - T7); + TK = FMA(KP951056516, Ty, KP587785252 * Tz); + TA = FNMS(KP951056516, Tz, KP587785252 * Ty); + T8 = T4 + T7; + To = FNMS(KP250000000, T8, T1); + } + { + E Tc, Tr, Tf, Ts; + T9 = ci[WS(rs, 4)]; + { + E Ta, Tb, Td, Te; + Ta = ci[WS(rs, 3)]; + Tb = cr[WS(rs, 4)]; + Tc = Ta - Tb; + Tr = Ta + Tb; + Td = ci[WS(rs, 2)]; + Te = cr[WS(rs, 3)]; + Tf = Td - Te; + Ts = Td + Te; + } + Tt = FNMS(KP951056516, Ts, KP587785252 * Tr); + TI = FMA(KP951056516, Tr, KP587785252 * Ts); + TC = KP559016994 * (Tc - Tf); + Tg = Tc + Tf; + TB = FNMS(KP250000000, Tg, T9); + } + cr[0] = T1 + T8; + ci[0] = T9 + Tg; + { + E Tu, TF, TE, TG, Tq, TD; + Tq = To - Tp; + Tu = Tq - Tt; + TF = Tq + Tt; + TD = TB - TC; + TE = TA + TD; + TG = TD - TA; + cr[WS(rs, 2)] = FNMS(Tx, TE, Tn * Tu); + ci[WS(rs, 2)] = FMA(Tn, TE, Tx * Tu); + cr[WS(rs, 3)] = FNMS(Tl, TG, Ti * TF); + ci[WS(rs, 3)] = FMA(Ti, TG, Tl * TF); + } + { + E TJ, TO, TM, TQ, TH, TL; + TH = Tp + To; + TJ = TH - TI; + TO = TH + TI; + TL = TC + TB; + TM = TK + TL; + TQ = TL - TK; + cr[WS(rs, 1)] = FNMS(Tk, TM, Th * TJ); + ci[WS(rs, 1)] = FMA(Th, TM, Tk * TJ); + cr[WS(rs, 4)] = FNMS(TP, TQ, TN * TO); + ci[WS(rs, 4)] = FMA(TN, TQ, TP * TO); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hb2_5", twinstr, &GENUS, {30, 18, 14, 0} }; + +void X(codelet_hb2_5) (planner *p) { + X(khc2hc_register) (p, hb2_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_8.c new file mode 100644 index 000000000..11e75d3fa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb2_8.c @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:37 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 8 -dif -name hb2_8 -include rdft/scalar/hb.h */ + +/* + * This function contains 74 FP additions, 50 FP multiplications, + * (or, 44 additions, 20 multiplications, 30 fused multiply/add), + * 47 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E Tf, Tg, Tl, Tp, Ti, Tj, Tk, T1b, T1u, T1e, T1o, To, Tq, TK; + { + E Th, T1n, T1t, Tn, Tm, TJ; + Tf = W[0]; + Tg = W[2]; + Th = Tf * Tg; + Tl = W[4]; + T1n = Tf * Tl; + Tp = W[5]; + T1t = Tf * Tp; + Ti = W[1]; + Tj = W[3]; + Tn = Tf * Tj; + Tk = FMA(Ti, Tj, Th); + T1b = FNMS(Ti, Tj, Th); + T1u = FNMS(Ti, Tl, T1t); + T1e = FMA(Ti, Tg, Tn); + T1o = FMA(Ti, Tp, T1n); + Tm = Tk * Tl; + TJ = Tk * Tp; + To = FNMS(Ti, Tg, Tn); + Tq = FMA(To, Tp, Tm); + TK = FNMS(To, Tl, TJ); + } + { + E T7, T1p, T1v, Tv, TP, T13, T1h, TZ, Te, T1k, T1w, T1q, TQ, TR, T10; + E TG, T14; + { + E T3, Tr, TO, T1f, T6, TL, Tu, T1g; + { + E T1, T2, TM, TN; + T1 = cr[0]; + T2 = ci[WS(rs, 3)]; + T3 = T1 + T2; + Tr = T1 - T2; + TM = ci[WS(rs, 7)]; + TN = cr[WS(rs, 4)]; + TO = TM + TN; + T1f = TM - TN; + } + { + E T4, T5, Ts, Tt; + T4 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 1)]; + T6 = T4 + T5; + TL = T4 - T5; + Ts = ci[WS(rs, 5)]; + Tt = cr[WS(rs, 6)]; + Tu = Ts + Tt; + T1g = Ts - Tt; + } + T7 = T3 + T6; + T1p = T3 - T6; + T1v = T1f - T1g; + Tv = Tr - Tu; + TP = TL + TO; + T13 = TO - TL; + T1h = T1f + T1g; + TZ = Tr + Tu; + } + { + E Ta, Tw, TE, T1j, Td, TB, Tz, T1i, TA, TF; + { + E T8, T9, TC, TD; + T8 = cr[WS(rs, 1)]; + T9 = ci[WS(rs, 2)]; + Ta = T8 + T9; + Tw = T8 - T9; + TC = ci[WS(rs, 4)]; + TD = cr[WS(rs, 7)]; + TE = TC + TD; + T1j = TC - TD; + } + { + E Tb, Tc, Tx, Ty; + Tb = ci[0]; + Tc = cr[WS(rs, 3)]; + Td = Tb + Tc; + TB = Tb - Tc; + Tx = ci[WS(rs, 6)]; + Ty = cr[WS(rs, 5)]; + Tz = Tx + Ty; + T1i = Tx - Ty; + } + Te = Ta + Td; + T1k = T1i + T1j; + T1w = Ta - Td; + T1q = T1j - T1i; + TQ = Tw + Tz; + TR = TB + TE; + T10 = TQ + TR; + TA = Tw - Tz; + TF = TB - TE; + TG = TA + TF; + T14 = TA - TF; + } + cr[0] = T7 + Te; + ci[0] = T1h + T1k; + { + E T11, T12, T15, T16; + T11 = FNMS(KP707106781, T10, TZ); + T12 = Tg * T11; + T15 = FMA(KP707106781, T14, T13); + T16 = Tg * T15; + cr[WS(rs, 3)] = FNMS(Tj, T15, T12); + ci[WS(rs, 3)] = FMA(Tj, T11, T16); + } + { + E T1z, T1A, T1B, T1C; + T1z = T1p + T1q; + T1A = Tk * T1z; + T1B = T1w + T1v; + T1C = Tk * T1B; + cr[WS(rs, 2)] = FNMS(To, T1B, T1A); + ci[WS(rs, 2)] = FMA(To, T1z, T1C); + } + { + E T17, T18, T19, T1a; + T17 = FMA(KP707106781, T10, TZ); + T18 = Tl * T17; + T19 = FNMS(KP707106781, T14, T13); + T1a = Tl * T19; + cr[WS(rs, 7)] = FNMS(Tp, T19, T18); + ci[WS(rs, 7)] = FMA(Tp, T17, T1a); + } + { + E T1l, T1d, T1m, T1c; + T1l = T1h - T1k; + T1c = T7 - Te; + T1d = T1b * T1c; + T1m = T1e * T1c; + cr[WS(rs, 4)] = FNMS(T1e, T1l, T1d); + ci[WS(rs, 4)] = FMA(T1b, T1l, T1m); + } + { + E T1r, T1s, T1x, T1y; + T1r = T1p - T1q; + T1s = T1o * T1r; + T1x = T1v - T1w; + T1y = T1o * T1x; + cr[WS(rs, 6)] = FNMS(T1u, T1x, T1s); + ci[WS(rs, 6)] = FMA(T1u, T1r, T1y); + } + { + E TT, TX, TW, TY, TI, TU, TS, TV, TH; + TS = TQ - TR; + TT = FNMS(KP707106781, TS, TP); + TX = FMA(KP707106781, TS, TP); + TV = FMA(KP707106781, TG, Tv); + TW = Tf * TV; + TY = Ti * TV; + TH = FNMS(KP707106781, TG, Tv); + TI = Tq * TH; + TU = TK * TH; + cr[WS(rs, 5)] = FNMS(TK, TT, TI); + ci[WS(rs, 5)] = FMA(Tq, TT, TU); + cr[WS(rs, 1)] = FNMS(Ti, TX, TW); + ci[WS(rs, 1)] = FMA(Tf, TX, TY); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hb2_8", twinstr, &GENUS, {44, 20, 30, 0} }; + +void X(codelet_hb2_8) (planner *p) { + X(khc2hc_register) (p, hb2_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 8 -dif -name hb2_8 -include rdft/scalar/hb.h */ + +/* + * This function contains 74 FP additions, 44 FP multiplications, + * (or, 56 additions, 26 multiplications, 18 fused multiply/add), + * 46 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb2_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E Tf, Ti, Tg, Tj, Tl, Tp, TP, TR, TF, TG, TH, T15, TL, TT; + { + E Th, To, Tk, Tn; + Tf = W[0]; + Ti = W[1]; + Tg = W[2]; + Tj = W[3]; + Th = Tf * Tg; + To = Ti * Tg; + Tk = Ti * Tj; + Tn = Tf * Tj; + Tl = Th - Tk; + Tp = Tn + To; + TP = Th + Tk; + TR = Tn - To; + TF = W[4]; + TG = W[5]; + TH = FMA(Tf, TF, Ti * TG); + T15 = FNMS(TR, TF, TP * TG); + TL = FNMS(Ti, TF, Tf * TG); + TT = FMA(TP, TF, TR * TG); + } + { + E T7, T1f, T1i, Tw, TI, TW, T18, TM, Te, T19, T1a, TD, TJ, TZ, T12; + E TN, Tm, TE; + { + E T3, TU, Tv, TV, T6, T16, Ts, T17; + { + E T1, T2, Tt, Tu; + T1 = cr[0]; + T2 = ci[WS(rs, 3)]; + T3 = T1 + T2; + TU = T1 - T2; + Tt = ci[WS(rs, 5)]; + Tu = cr[WS(rs, 6)]; + Tv = Tt - Tu; + TV = Tt + Tu; + } + { + E T4, T5, Tq, Tr; + T4 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 1)]; + T6 = T4 + T5; + T16 = T4 - T5; + Tq = ci[WS(rs, 7)]; + Tr = cr[WS(rs, 4)]; + Ts = Tq - Tr; + T17 = Tq + Tr; + } + T7 = T3 + T6; + T1f = TU + TV; + T1i = T17 - T16; + Tw = Ts + Tv; + TI = T3 - T6; + TW = TU - TV; + T18 = T16 + T17; + TM = Ts - Tv; + } + { + E Ta, TX, TC, T11, Td, T10, Tz, TY; + { + E T8, T9, TA, TB; + T8 = cr[WS(rs, 1)]; + T9 = ci[WS(rs, 2)]; + Ta = T8 + T9; + TX = T8 - T9; + TA = ci[WS(rs, 4)]; + TB = cr[WS(rs, 7)]; + TC = TA - TB; + T11 = TA + TB; + } + { + E Tb, Tc, Tx, Ty; + Tb = ci[0]; + Tc = cr[WS(rs, 3)]; + Td = Tb + Tc; + T10 = Tb - Tc; + Tx = ci[WS(rs, 6)]; + Ty = cr[WS(rs, 5)]; + Tz = Tx - Ty; + TY = Tx + Ty; + } + Te = Ta + Td; + T19 = TX + TY; + T1a = T10 + T11; + TD = Tz + TC; + TJ = TC - Tz; + TZ = TX - TY; + T12 = T10 - T11; + TN = Ta - Td; + } + cr[0] = T7 + Te; + ci[0] = Tw + TD; + Tm = T7 - Te; + TE = Tw - TD; + cr[WS(rs, 4)] = FNMS(Tp, TE, Tl * Tm); + ci[WS(rs, 4)] = FMA(Tp, Tm, Tl * TE); + { + E TQ, TS, TK, TO; + TQ = TI + TJ; + TS = TN + TM; + cr[WS(rs, 2)] = FNMS(TR, TS, TP * TQ); + ci[WS(rs, 2)] = FMA(TP, TS, TR * TQ); + TK = TI - TJ; + TO = TM - TN; + cr[WS(rs, 6)] = FNMS(TL, TO, TH * TK); + ci[WS(rs, 6)] = FMA(TH, TO, TL * TK); + } + { + E T1h, T1l, T1k, T1m, T1g, T1j; + T1g = KP707106781 * (T19 + T1a); + T1h = T1f - T1g; + T1l = T1f + T1g; + T1j = KP707106781 * (TZ - T12); + T1k = T1i + T1j; + T1m = T1i - T1j; + cr[WS(rs, 3)] = FNMS(Tj, T1k, Tg * T1h); + ci[WS(rs, 3)] = FMA(Tg, T1k, Tj * T1h); + cr[WS(rs, 7)] = FNMS(TG, T1m, TF * T1l); + ci[WS(rs, 7)] = FMA(TF, T1m, TG * T1l); + } + { + E T14, T1d, T1c, T1e, T13, T1b; + T13 = KP707106781 * (TZ + T12); + T14 = TW - T13; + T1d = TW + T13; + T1b = KP707106781 * (T19 - T1a); + T1c = T18 - T1b; + T1e = T18 + T1b; + cr[WS(rs, 5)] = FNMS(T15, T1c, TT * T14); + ci[WS(rs, 5)] = FMA(T15, T14, TT * T1c); + cr[WS(rs, 1)] = FNMS(Ti, T1e, Tf * T1d); + ci[WS(rs, 1)] = FMA(Ti, T1d, Tf * T1e); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hb2_8", twinstr, &GENUS, {56, 26, 18, 0} }; + +void X(codelet_hb2_8) (planner *p) { + X(khc2hc_register) (p, hb2_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_10.c new file mode 100644 index 000000000..bfd0c41e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_10.c @@ -0,0 +1,513 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:32 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -dif -name hb_10 -include rdft/scalar/hb.h */ + +/* + * This function contains 102 FP additions, 72 FP multiplications, + * (or, 48 additions, 18 multiplications, 54 fused multiply/add), + * 47 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_10(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 18, MAKE_VOLATILE_STRIDE(20, rs)) { + E TH, T1B, TB, T11, T1E, T1G, TK, TM, T1x, T1V, T3, T1g, Tl, T1I, T1J; + E TO, TP, T1p, Ti, Tk, T1n, T1o, TF, TG; + TF = ci[WS(rs, 9)]; + TG = cr[WS(rs, 5)]; + TH = TF - TG; + T1B = TF + TG; + { + E Tp, T1u, Tz, T1s, Ts, T1v, Tw, T1r; + { + E Tn, To, Tx, Ty; + Tn = ci[WS(rs, 5)]; + To = cr[WS(rs, 9)]; + Tp = Tn - To; + T1u = Tn + To; + Tx = ci[WS(rs, 6)]; + Ty = cr[WS(rs, 8)]; + Tz = Tx - Ty; + T1s = Tx + Ty; + } + { + E Tq, Tr, Tu, Tv; + Tq = ci[WS(rs, 8)]; + Tr = cr[WS(rs, 6)]; + Ts = Tq - Tr; + T1v = Tq + Tr; + Tu = ci[WS(rs, 7)]; + Tv = cr[WS(rs, 7)]; + Tw = Tu - Tv; + T1r = Tu + Tv; + } + { + E Tt, TA, T1C, T1D; + Tt = Tp - Ts; + TA = Tw - Tz; + TB = FNMS(KP618033988, TA, Tt); + T11 = FMA(KP618033988, Tt, TA); + T1C = T1r - T1s; + T1D = T1u - T1v; + T1E = T1C + T1D; + T1G = T1C - T1D; + } + { + E TI, TJ, T1t, T1w; + TI = Tw + Tz; + TJ = Tp + Ts; + TK = TI + TJ; + TM = TI - TJ; + T1t = T1r + T1s; + T1w = T1u + T1v; + T1x = FMA(KP618033988, T1w, T1t); + T1V = FNMS(KP618033988, T1t, T1w); + } + } + { + E Td, T1k, Tg, T1l, Th, T1m, T6, T1h, T9, T1i, Ta, T1j, T1, T2; + T1 = cr[0]; + T2 = ci[WS(rs, 4)]; + T3 = T1 + T2; + T1g = T1 - T2; + { + E Tb, Tc, Te, Tf; + Tb = cr[WS(rs, 4)]; + Tc = ci[0]; + Td = Tb + Tc; + T1k = Tb - Tc; + Te = ci[WS(rs, 3)]; + Tf = cr[WS(rs, 1)]; + Tg = Te + Tf; + T1l = Te - Tf; + } + Th = Td + Tg; + T1m = T1k + T1l; + { + E T4, T5, T7, T8; + T4 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 2)]; + T6 = T4 + T5; + T1h = T4 - T5; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 3)]; + T9 = T7 + T8; + T1i = T7 - T8; + } + Ta = T6 + T9; + T1j = T1h + T1i; + Tl = Ta - Th; + T1I = T1h - T1i; + T1J = T1k - T1l; + TO = Td - Tg; + TP = T6 - T9; + T1p = T1j - T1m; + Ti = Ta + Th; + Tk = FNMS(KP250000000, Ti, T3); + T1n = T1j + T1m; + T1o = FNMS(KP250000000, T1n, T1g); + } + cr[0] = T3 + Ti; + ci[0] = TH + TK; + { + E T2d, T29, T2b, T2c, T2e, T2a; + T2d = T1B + T1E; + T2a = T1g + T1n; + T29 = W[8]; + T2b = T29 * T2a; + T2c = W[9]; + T2e = T2c * T2a; + cr[WS(rs, 5)] = FNMS(T2c, T2d, T2b); + ci[WS(rs, 5)] = FMA(T29, T2d, T2e); + } + { + E TQ, T16, TC, TU, TN, T15, T12, T1a, Tm, TL, T10; + TQ = FNMS(KP618033988, TP, TO); + T16 = FMA(KP618033988, TO, TP); + Tm = FNMS(KP559016994, Tl, Tk); + TC = FMA(KP951056516, TB, Tm); + TU = FNMS(KP951056516, TB, Tm); + TL = FNMS(KP250000000, TK, TH); + TN = FNMS(KP559016994, TM, TL); + T15 = FMA(KP559016994, TM, TL); + T10 = FMA(KP559016994, Tl, Tk); + T12 = FMA(KP951056516, T11, T10); + T1a = FNMS(KP951056516, T11, T10); + { + E TR, TE, TS, Tj, TD; + TR = FNMS(KP951056516, TQ, TN); + TE = W[3]; + TS = TE * TC; + Tj = W[2]; + TD = Tj * TC; + cr[WS(rs, 2)] = FNMS(TE, TR, TD); + ci[WS(rs, 2)] = FMA(Tj, TR, TS); + } + { + E T1d, T1c, T1e, T19, T1b; + T1d = FMA(KP951056516, T16, T15); + T1c = W[11]; + T1e = T1c * T1a; + T19 = W[10]; + T1b = T19 * T1a; + cr[WS(rs, 6)] = FNMS(T1c, T1d, T1b); + ci[WS(rs, 6)] = FMA(T19, T1d, T1e); + } + { + E TX, TW, TY, TT, TV; + TX = FMA(KP951056516, TQ, TN); + TW = W[15]; + TY = TW * TU; + TT = W[14]; + TV = TT * TU; + cr[WS(rs, 8)] = FNMS(TW, TX, TV); + ci[WS(rs, 8)] = FMA(TT, TX, TY); + } + { + E T17, T14, T18, TZ, T13; + T17 = FNMS(KP951056516, T16, T15); + T14 = W[7]; + T18 = T14 * T12; + TZ = W[6]; + T13 = TZ * T12; + cr[WS(rs, 4)] = FNMS(T14, T17, T13); + ci[WS(rs, 4)] = FMA(TZ, T17, T18); + } + } + { + E T1K, T20, T1y, T1O, T1H, T1Z, T1W, T24, T1q, T1F, T1U; + T1K = FMA(KP618033988, T1J, T1I); + T20 = FNMS(KP618033988, T1I, T1J); + T1q = FMA(KP559016994, T1p, T1o); + T1y = FNMS(KP951056516, T1x, T1q); + T1O = FMA(KP951056516, T1x, T1q); + T1F = FNMS(KP250000000, T1E, T1B); + T1H = FMA(KP559016994, T1G, T1F); + T1Z = FNMS(KP559016994, T1G, T1F); + T1U = FNMS(KP559016994, T1p, T1o); + T1W = FNMS(KP951056516, T1V, T1U); + T24 = FMA(KP951056516, T1V, T1U); + { + E T1L, T1A, T1M, T1f, T1z; + T1L = FMA(KP951056516, T1K, T1H); + T1A = W[1]; + T1M = T1A * T1y; + T1f = W[0]; + T1z = T1f * T1y; + cr[WS(rs, 1)] = FNMS(T1A, T1L, T1z); + ci[WS(rs, 1)] = FMA(T1f, T1L, T1M); + } + { + E T27, T26, T28, T23, T25; + T27 = FNMS(KP951056516, T20, T1Z); + T26 = W[13]; + T28 = T26 * T24; + T23 = W[12]; + T25 = T23 * T24; + cr[WS(rs, 7)] = FNMS(T26, T27, T25); + ci[WS(rs, 7)] = FMA(T23, T27, T28); + } + { + E T1R, T1Q, T1S, T1N, T1P; + T1R = FNMS(KP951056516, T1K, T1H); + T1Q = W[17]; + T1S = T1Q * T1O; + T1N = W[16]; + T1P = T1N * T1O; + cr[WS(rs, 9)] = FNMS(T1Q, T1R, T1P); + ci[WS(rs, 9)] = FMA(T1N, T1R, T1S); + } + { + E T21, T1Y, T22, T1T, T1X; + T21 = FMA(KP951056516, T20, T1Z); + T1Y = W[5]; + T22 = T1Y * T1W; + T1T = W[4]; + T1X = T1T * T1W; + cr[WS(rs, 3)] = FNMS(T1Y, T21, T1X); + ci[WS(rs, 3)] = FMA(T1T, T21, T22); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 10, "hb_10", twinstr, &GENUS, {48, 18, 54, 0} }; + +void X(codelet_hb_10) (planner *p) { + X(khc2hc_register) (p, hb_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -dif -name hb_10 -include rdft/scalar/hb.h */ + +/* + * This function contains 102 FP additions, 60 FP multiplications, + * (or, 72 additions, 30 multiplications, 30 fused multiply/add), + * 41 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_10(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 18, MAKE_VOLATILE_STRIDE(20, rs)) { + E T3, T18, TE, TF, T1B, T1A, T1f, T1t, Ti, Tl, TJ, T1i, Tt, TA, T1w; + E T1v, T1p, T1E, TM, TO; + { + E T1, T2, TH, TI; + T1 = cr[0]; + T2 = ci[WS(rs, 4)]; + T3 = T1 + T2; + T18 = T1 - T2; + { + E T6, T19, Tg, T1d, T9, T1a, Td, T1c; + { + E T4, T5, Te, Tf; + T4 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 2)]; + T6 = T4 + T5; + T19 = T4 - T5; + Te = ci[WS(rs, 3)]; + Tf = cr[WS(rs, 1)]; + Tg = Te + Tf; + T1d = Te - Tf; + } + { + E T7, T8, Tb, Tc; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 3)]; + T9 = T7 + T8; + T1a = T7 - T8; + Tb = cr[WS(rs, 4)]; + Tc = ci[0]; + Td = Tb + Tc; + T1c = Tb - Tc; + } + TE = T6 - T9; + TF = Td - Tg; + T1B = T1c - T1d; + T1A = T19 - T1a; + { + E T1b, T1e, Ta, Th; + T1b = T19 + T1a; + T1e = T1c + T1d; + T1f = T1b + T1e; + T1t = KP559016994 * (T1b - T1e); + Ta = T6 + T9; + Th = Td + Tg; + Ti = Ta + Th; + Tl = KP559016994 * (Ta - Th); + } + } + TH = ci[WS(rs, 9)]; + TI = cr[WS(rs, 5)]; + TJ = TH - TI; + T1i = TH + TI; + { + E Tp, T1j, Tz, T1n, Ts, T1k, Tw, T1m; + { + E Tn, To, Tx, Ty; + Tn = ci[WS(rs, 7)]; + To = cr[WS(rs, 7)]; + Tp = Tn - To; + T1j = Tn + To; + Tx = ci[WS(rs, 8)]; + Ty = cr[WS(rs, 6)]; + Tz = Tx - Ty; + T1n = Tx + Ty; + } + { + E Tq, Tr, Tu, Tv; + Tq = ci[WS(rs, 6)]; + Tr = cr[WS(rs, 8)]; + Ts = Tq - Tr; + T1k = Tq + Tr; + Tu = ci[WS(rs, 5)]; + Tv = cr[WS(rs, 9)]; + Tw = Tu - Tv; + T1m = Tu + Tv; + } + Tt = Tp - Ts; + TA = Tw - Tz; + T1w = T1m + T1n; + T1v = T1j + T1k; + { + E T1l, T1o, TK, TL; + T1l = T1j - T1k; + T1o = T1m - T1n; + T1p = T1l + T1o; + T1E = KP559016994 * (T1l - T1o); + TK = Tp + Ts; + TL = Tw + Tz; + TM = TK + TL; + TO = KP559016994 * (TK - TL); + } + } + } + cr[0] = T3 + Ti; + ci[0] = TJ + TM; + { + E T1g, T1q, T17, T1h; + T1g = T18 + T1f; + T1q = T1i + T1p; + T17 = W[8]; + T1h = W[9]; + cr[WS(rs, 5)] = FNMS(T1h, T1q, T17 * T1g); + ci[WS(rs, 5)] = FMA(T1h, T1g, T17 * T1q); + } + { + E TB, TG, T11, TX, TP, T10, Tm, TW, TN, Tk; + TB = FNMS(KP951056516, TA, KP587785252 * Tt); + TG = FNMS(KP951056516, TF, KP587785252 * TE); + T11 = FMA(KP951056516, TE, KP587785252 * TF); + TX = FMA(KP951056516, Tt, KP587785252 * TA); + TN = FNMS(KP250000000, TM, TJ); + TP = TN - TO; + T10 = TO + TN; + Tk = FNMS(KP250000000, Ti, T3); + Tm = Tk - Tl; + TW = Tl + Tk; + { + E TC, TQ, Tj, TD; + TC = Tm - TB; + TQ = TG + TP; + Tj = W[2]; + TD = W[3]; + cr[WS(rs, 2)] = FNMS(TD, TQ, Tj * TC); + ci[WS(rs, 2)] = FMA(TD, TC, Tj * TQ); + } + { + E T14, T16, T13, T15; + T14 = TW - TX; + T16 = T11 + T10; + T13 = W[10]; + T15 = W[11]; + cr[WS(rs, 6)] = FNMS(T15, T16, T13 * T14); + ci[WS(rs, 6)] = FMA(T15, T14, T13 * T16); + } + { + E TS, TU, TR, TT; + TS = Tm + TB; + TU = TP - TG; + TR = W[14]; + TT = W[15]; + cr[WS(rs, 8)] = FNMS(TT, TU, TR * TS); + ci[WS(rs, 8)] = FMA(TT, TS, TR * TU); + } + { + E TY, T12, TV, TZ; + TY = TW + TX; + T12 = T10 - T11; + TV = W[6]; + TZ = W[7]; + cr[WS(rs, 4)] = FNMS(TZ, T12, TV * TY); + ci[WS(rs, 4)] = FMA(TZ, TY, TV * T12); + } + } + { + E T1x, T1C, T1Q, T1N, T1F, T1R, T1u, T1M, T1D, T1s; + T1x = FNMS(KP951056516, T1w, KP587785252 * T1v); + T1C = FNMS(KP951056516, T1B, KP587785252 * T1A); + T1Q = FMA(KP951056516, T1A, KP587785252 * T1B); + T1N = FMA(KP951056516, T1v, KP587785252 * T1w); + T1D = FNMS(KP250000000, T1p, T1i); + T1F = T1D - T1E; + T1R = T1E + T1D; + T1s = FNMS(KP250000000, T1f, T18); + T1u = T1s - T1t; + T1M = T1t + T1s; + { + E T1y, T1G, T1r, T1z; + T1y = T1u - T1x; + T1G = T1C + T1F; + T1r = W[12]; + T1z = W[13]; + cr[WS(rs, 7)] = FNMS(T1z, T1G, T1r * T1y); + ci[WS(rs, 7)] = FMA(T1r, T1G, T1z * T1y); + } + { + E T1U, T1W, T1T, T1V; + T1U = T1M + T1N; + T1W = T1R - T1Q; + T1T = W[16]; + T1V = W[17]; + cr[WS(rs, 9)] = FNMS(T1V, T1W, T1T * T1U); + ci[WS(rs, 9)] = FMA(T1T, T1W, T1V * T1U); + } + { + E T1I, T1K, T1H, T1J; + T1I = T1u + T1x; + T1K = T1F - T1C; + T1H = W[4]; + T1J = W[5]; + cr[WS(rs, 3)] = FNMS(T1J, T1K, T1H * T1I); + ci[WS(rs, 3)] = FMA(T1H, T1K, T1J * T1I); + } + { + E T1O, T1S, T1L, T1P; + T1O = T1M - T1N; + T1S = T1Q + T1R; + T1L = W[0]; + T1P = W[1]; + cr[WS(rs, 1)] = FNMS(T1P, T1S, T1L * T1O); + ci[WS(rs, 1)] = FMA(T1L, T1S, T1P * T1O); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 10, "hb_10", twinstr, &GENUS, {72, 30, 30, 0} }; + +void X(codelet_hb_10) (planner *p) { + X(khc2hc_register) (p, hb_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_12.c new file mode 100644 index 000000000..c5fa33a8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_12.c @@ -0,0 +1,597 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:32 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -dif -name hb_12 -include rdft/scalar/hb.h */ + +/* + * This function contains 118 FP additions, 68 FP multiplications, + * (or, 72 additions, 22 multiplications, 46 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_12(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 22, MAKE_VOLATILE_STRIDE(24, rs)) { + E T18, T20, T1b, T21, T1s, T2a, T1p, T29, TI, TN, TO, Tb, To, T1f, T23; + E T1i, T24, T1z, T2d, T1w, T2c, Tt, Ty, Tz, Tm, TD; + { + E T1, TE, TM, T6, T4, T1o, TH, T17, TL, T1a, T9, T1r; + T1 = cr[0]; + TE = ci[WS(rs, 11)]; + TM = cr[WS(rs, 6)]; + T6 = ci[WS(rs, 5)]; + { + E T2, T3, TF, TG; + T2 = cr[WS(rs, 4)]; + T3 = ci[WS(rs, 3)]; + T4 = T2 + T3; + T1o = T2 - T3; + TF = ci[WS(rs, 7)]; + TG = cr[WS(rs, 8)]; + TH = TF - TG; + T17 = TF + TG; + } + { + E TJ, TK, T7, T8; + TJ = ci[WS(rs, 9)]; + TK = cr[WS(rs, 10)]; + TL = TJ - TK; + T1a = TJ + TK; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 2)]; + T9 = T7 + T8; + T1r = T7 - T8; + } + { + E T16, T19, T1q, T1n, T5, Ta; + T16 = FNMS(KP500000000, T4, T1); + T18 = FNMS(KP866025403, T17, T16); + T20 = FMA(KP866025403, T17, T16); + T19 = FNMS(KP500000000, T9, T6); + T1b = FMA(KP866025403, T1a, T19); + T21 = FNMS(KP866025403, T1a, T19); + T1q = FMA(KP500000000, TL, TM); + T1s = FNMS(KP866025403, T1r, T1q); + T2a = FMA(KP866025403, T1r, T1q); + T1n = FNMS(KP500000000, TH, TE); + T1p = FMA(KP866025403, T1o, T1n); + T29 = FNMS(KP866025403, T1o, T1n); + TI = TE + TH; + TN = TL - TM; + TO = TI - TN; + T5 = T1 + T4; + Ta = T6 + T9; + Tb = T5 + Ta; + To = T5 - Ta; + } + } + { + E Tc, Tp, Tx, Th, Tf, T1v, Ts, T1e, Tw, T1h, Tk, T1y; + Tc = cr[WS(rs, 3)]; + Tp = ci[WS(rs, 8)]; + Tx = cr[WS(rs, 9)]; + Th = ci[WS(rs, 2)]; + { + E Td, Te, Tq, Tr; + Td = ci[WS(rs, 4)]; + Te = ci[0]; + Tf = Td + Te; + T1v = Td - Te; + Tq = cr[WS(rs, 7)]; + Tr = cr[WS(rs, 11)]; + Ts = Tq + Tr; + T1e = Tq - Tr; + } + { + E Tu, Tv, Ti, Tj; + Tu = ci[WS(rs, 10)]; + Tv = ci[WS(rs, 6)]; + Tw = Tu + Tv; + T1h = Tv - Tu; + Ti = cr[WS(rs, 1)]; + Tj = cr[WS(rs, 5)]; + Tk = Ti + Tj; + T1y = Ti - Tj; + } + { + E T1d, T1g, T1x, T1u, Tg, Tl; + T1d = FNMS(KP500000000, Tf, Tc); + T1f = FMA(KP866025403, T1e, T1d); + T23 = FNMS(KP866025403, T1e, T1d); + T1g = FNMS(KP500000000, Tk, Th); + T1i = FMA(KP866025403, T1h, T1g); + T24 = FNMS(KP866025403, T1h, T1g); + T1x = FMA(KP500000000, Tw, Tx); + T1z = FNMS(KP866025403, T1y, T1x); + T2d = FMA(KP866025403, T1y, T1x); + T1u = FMA(KP500000000, Ts, Tp); + T1w = FMA(KP866025403, T1v, T1u); + T2c = FNMS(KP866025403, T1v, T1u); + Tt = Tp - Ts; + Ty = Tw - Tx; + Tz = Tt - Ty; + Tg = Tc + Tf; + Tl = Th + Tk; + Tm = Tg + Tl; + TD = Tg - Tl; + } + } + cr[0] = Tb + Tm; + { + E TA, TP, TB, TQ, Tn, TC; + TA = To - Tz; + TP = TD + TO; + Tn = W[16]; + TB = Tn * TA; + TQ = Tn * TP; + TC = W[17]; + cr[WS(rs, 9)] = FNMS(TC, TP, TB); + ci[WS(rs, 9)] = FMA(TC, TA, TQ); + } + { + E TS, TV, TT, TW, TR, TU; + TS = To + Tz; + TV = TO - TD; + TR = W[4]; + TT = TR * TS; + TW = TR * TV; + TU = W[5]; + cr[WS(rs, 3)] = FNMS(TU, TV, TT); + ci[WS(rs, 3)] = FMA(TU, TS, TW); + } + { + E T11, T12, T13, TX, TZ, T10, T14, TY; + T11 = TI + TN; + T12 = Tt + Ty; + T13 = T11 - T12; + TY = Tb - Tm; + TX = W[10]; + TZ = TX * TY; + T10 = W[11]; + T14 = T10 * TY; + ci[0] = T11 + T12; + ci[WS(rs, 6)] = FMA(TX, T13, T14); + cr[WS(rs, 6)] = FNMS(T10, T13, TZ); + } + { + E T1k, T1E, T1B, T1H; + { + E T1c, T1j, T1t, T1A; + T1c = T18 + T1b; + T1j = T1f + T1i; + T1k = T1c - T1j; + T1E = T1c + T1j; + T1t = T1p - T1s; + T1A = T1w - T1z; + T1B = T1t - T1A; + T1H = T1t + T1A; + } + { + E T15, T1l, T1m, T1C; + T15 = W[18]; + T1l = T15 * T1k; + T1m = W[19]; + T1C = T1m * T1k; + cr[WS(rs, 10)] = FNMS(T1m, T1B, T1l); + ci[WS(rs, 10)] = FMA(T15, T1B, T1C); + } + { + E T1D, T1F, T1G, T1I; + T1D = W[6]; + T1F = T1D * T1E; + T1G = W[7]; + T1I = T1G * T1E; + cr[WS(rs, 4)] = FNMS(T1G, T1H, T1F); + ci[WS(rs, 4)] = FMA(T1D, T1H, T1I); + } + } + { + E T26, T2i, T2f, T2l; + { + E T22, T25, T2b, T2e; + T22 = T20 + T21; + T25 = T23 + T24; + T26 = T22 - T25; + T2i = T22 + T25; + T2b = T29 - T2a; + T2e = T2c - T2d; + T2f = T2b - T2e; + T2l = T2b + T2e; + } + { + E T1Z, T27, T28, T2g; + T1Z = W[2]; + T27 = T1Z * T26; + T28 = W[3]; + T2g = T28 * T26; + cr[WS(rs, 2)] = FNMS(T28, T2f, T27); + ci[WS(rs, 2)] = FMA(T1Z, T2f, T2g); + } + { + E T2h, T2j, T2k, T2m; + T2h = W[14]; + T2j = T2h * T2i; + T2k = W[15]; + T2m = T2k * T2i; + cr[WS(rs, 8)] = FNMS(T2k, T2l, T2j); + ci[WS(rs, 8)] = FMA(T2h, T2l, T2m); + } + } + { + E T2q, T2y, T2v, T2B; + { + E T2o, T2p, T2t, T2u; + T2o = T20 - T21; + T2p = T2c + T2d; + T2q = T2o - T2p; + T2y = T2o + T2p; + T2t = T29 + T2a; + T2u = T23 - T24; + T2v = T2t + T2u; + T2B = T2t - T2u; + } + { + E T2r, T2w, T2n, T2s; + T2n = W[8]; + T2r = T2n * T2q; + T2w = T2n * T2v; + T2s = W[9]; + cr[WS(rs, 5)] = FNMS(T2s, T2v, T2r); + ci[WS(rs, 5)] = FMA(T2s, T2q, T2w); + } + { + E T2z, T2C, T2x, T2A; + T2x = W[20]; + T2z = T2x * T2y; + T2C = T2x * T2B; + T2A = W[21]; + cr[WS(rs, 11)] = FNMS(T2A, T2B, T2z); + ci[WS(rs, 11)] = FMA(T2A, T2y, T2C); + } + } + { + E T1M, T1U, T1R, T1X; + { + E T1K, T1L, T1P, T1Q; + T1K = T18 - T1b; + T1L = T1w + T1z; + T1M = T1K - T1L; + T1U = T1K + T1L; + T1P = T1p + T1s; + T1Q = T1f - T1i; + T1R = T1P + T1Q; + T1X = T1P - T1Q; + } + { + E T1N, T1S, T1J, T1O; + T1J = W[0]; + T1N = T1J * T1M; + T1S = T1J * T1R; + T1O = W[1]; + cr[WS(rs, 1)] = FNMS(T1O, T1R, T1N); + ci[WS(rs, 1)] = FMA(T1O, T1M, T1S); + } + { + E T1V, T1Y, T1T, T1W; + T1T = W[12]; + T1V = T1T * T1U; + T1Y = T1T * T1X; + T1W = W[13]; + cr[WS(rs, 7)] = FNMS(T1W, T1X, T1V); + ci[WS(rs, 7)] = FMA(T1W, T1U, T1Y); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 12, "hb_12", twinstr, &GENUS, {72, 22, 46, 0} }; + +void X(codelet_hb_12) (planner *p) { + X(khc2hc_register) (p, hb_12, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -dif -name hb_12 -include rdft/scalar/hb.h */ + +/* + * This function contains 118 FP additions, 60 FP multiplications, + * (or, 88 additions, 30 multiplications, 30 fused multiply/add), + * 39 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_12(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 22, MAKE_VOLATILE_STRIDE(24, rs)) { + E T5, TH, T12, T1M, T1i, T1U, Tg, Tt, T19, T1X, T1p, T1P, Ta, TM, T15; + E T1N, T1l, T1V, Tl, Ty, T1c, T1Y, T1s, T1Q; + { + E T1, TD, T4, T1g, TG, T11, T10, T1h; + T1 = cr[0]; + TD = ci[WS(rs, 11)]; + { + E T2, T3, TE, TF; + T2 = cr[WS(rs, 4)]; + T3 = ci[WS(rs, 3)]; + T4 = T2 + T3; + T1g = KP866025403 * (T2 - T3); + TE = ci[WS(rs, 7)]; + TF = cr[WS(rs, 8)]; + TG = TE - TF; + T11 = KP866025403 * (TE + TF); + } + T5 = T1 + T4; + TH = TD + TG; + T10 = FNMS(KP500000000, T4, T1); + T12 = T10 - T11; + T1M = T10 + T11; + T1h = FNMS(KP500000000, TG, TD); + T1i = T1g + T1h; + T1U = T1h - T1g; + } + { + E Tc, Tp, Tf, T17, Ts, T1o, T18, T1n; + Tc = cr[WS(rs, 3)]; + Tp = ci[WS(rs, 8)]; + { + E Td, Te, Tq, Tr; + Td = ci[WS(rs, 4)]; + Te = ci[0]; + Tf = Td + Te; + T17 = KP866025403 * (Td - Te); + Tq = cr[WS(rs, 7)]; + Tr = cr[WS(rs, 11)]; + Ts = Tq + Tr; + T1o = KP866025403 * (Tq - Tr); + } + Tg = Tc + Tf; + Tt = Tp - Ts; + T18 = FMA(KP500000000, Ts, Tp); + T19 = T17 + T18; + T1X = T18 - T17; + T1n = FNMS(KP500000000, Tf, Tc); + T1p = T1n + T1o; + T1P = T1n - T1o; + } + { + E T6, TL, T9, T1j, TK, T14, T13, T1k; + T6 = ci[WS(rs, 5)]; + TL = cr[WS(rs, 6)]; + { + E T7, T8, TI, TJ; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 2)]; + T9 = T7 + T8; + T1j = KP866025403 * (T7 - T8); + TI = ci[WS(rs, 9)]; + TJ = cr[WS(rs, 10)]; + TK = TI - TJ; + T14 = KP866025403 * (TI + TJ); + } + Ta = T6 + T9; + TM = TK - TL; + T13 = FNMS(KP500000000, T9, T6); + T15 = T13 + T14; + T1N = T13 - T14; + T1k = FMA(KP500000000, TK, TL); + T1l = T1j - T1k; + T1V = T1j + T1k; + } + { + E Th, Tx, Tk, T1a, Tw, T1r, T1b, T1q; + Th = ci[WS(rs, 2)]; + Tx = cr[WS(rs, 9)]; + { + E Ti, Tj, Tu, Tv; + Ti = cr[WS(rs, 1)]; + Tj = cr[WS(rs, 5)]; + Tk = Ti + Tj; + T1a = KP866025403 * (Ti - Tj); + Tu = ci[WS(rs, 10)]; + Tv = ci[WS(rs, 6)]; + Tw = Tu + Tv; + T1r = KP866025403 * (Tv - Tu); + } + Tl = Th + Tk; + Ty = Tw - Tx; + T1b = FMA(KP500000000, Tw, Tx); + T1c = T1a - T1b; + T1Y = T1a + T1b; + T1q = FNMS(KP500000000, Tk, Th); + T1s = T1q + T1r; + T1Q = T1q - T1r; + } + { + E Tb, Tm, TU, TW, TX, TY, TT, TV; + Tb = T5 + Ta; + Tm = Tg + Tl; + TU = Tb - Tm; + TW = TH + TM; + TX = Tt + Ty; + TY = TW - TX; + cr[0] = Tb + Tm; + ci[0] = TW + TX; + TT = W[10]; + TV = W[11]; + cr[WS(rs, 6)] = FNMS(TV, TY, TT * TU); + ci[WS(rs, 6)] = FMA(TV, TU, TT * TY); + } + { + E TA, TQ, TO, TS; + { + E To, Tz, TC, TN; + To = T5 - Ta; + Tz = Tt - Ty; + TA = To - Tz; + TQ = To + Tz; + TC = Tg - Tl; + TN = TH - TM; + TO = TC + TN; + TS = TN - TC; + } + { + E Tn, TB, TP, TR; + Tn = W[16]; + TB = W[17]; + cr[WS(rs, 9)] = FNMS(TB, TO, Tn * TA); + ci[WS(rs, 9)] = FMA(Tn, TO, TB * TA); + TP = W[4]; + TR = W[5]; + cr[WS(rs, 3)] = FNMS(TR, TS, TP * TQ); + ci[WS(rs, 3)] = FMA(TP, TS, TR * TQ); + } + } + { + E T28, T2e, T2c, T2g; + { + E T26, T27, T2a, T2b; + T26 = T1M - T1N; + T27 = T1X + T1Y; + T28 = T26 - T27; + T2e = T26 + T27; + T2a = T1U + T1V; + T2b = T1P - T1Q; + T2c = T2a + T2b; + T2g = T2a - T2b; + } + { + E T25, T29, T2d, T2f; + T25 = W[8]; + T29 = W[9]; + cr[WS(rs, 5)] = FNMS(T29, T2c, T25 * T28); + ci[WS(rs, 5)] = FMA(T25, T2c, T29 * T28); + T2d = W[20]; + T2f = W[21]; + cr[WS(rs, 11)] = FNMS(T2f, T2g, T2d * T2e); + ci[WS(rs, 11)] = FMA(T2d, T2g, T2f * T2e); + } + } + { + E T1S, T22, T20, T24; + { + E T1O, T1R, T1W, T1Z; + T1O = T1M + T1N; + T1R = T1P + T1Q; + T1S = T1O - T1R; + T22 = T1O + T1R; + T1W = T1U - T1V; + T1Z = T1X - T1Y; + T20 = T1W - T1Z; + T24 = T1W + T1Z; + } + { + E T1L, T1T, T21, T23; + T1L = W[2]; + T1T = W[3]; + cr[WS(rs, 2)] = FNMS(T1T, T20, T1L * T1S); + ci[WS(rs, 2)] = FMA(T1T, T1S, T1L * T20); + T21 = W[14]; + T23 = W[15]; + cr[WS(rs, 8)] = FNMS(T23, T24, T21 * T22); + ci[WS(rs, 8)] = FMA(T23, T22, T21 * T24); + } + } + { + E T1C, T1I, T1G, T1K; + { + E T1A, T1B, T1E, T1F; + T1A = T12 + T15; + T1B = T1p + T1s; + T1C = T1A - T1B; + T1I = T1A + T1B; + T1E = T1i + T1l; + T1F = T19 + T1c; + T1G = T1E - T1F; + T1K = T1E + T1F; + } + { + E T1z, T1D, T1H, T1J; + T1z = W[18]; + T1D = W[19]; + cr[WS(rs, 10)] = FNMS(T1D, T1G, T1z * T1C); + ci[WS(rs, 10)] = FMA(T1D, T1C, T1z * T1G); + T1H = W[6]; + T1J = W[7]; + cr[WS(rs, 4)] = FNMS(T1J, T1K, T1H * T1I); + ci[WS(rs, 4)] = FMA(T1J, T1I, T1H * T1K); + } + } + { + E T1e, T1w, T1u, T1y; + { + E T16, T1d, T1m, T1t; + T16 = T12 - T15; + T1d = T19 - T1c; + T1e = T16 - T1d; + T1w = T16 + T1d; + T1m = T1i - T1l; + T1t = T1p - T1s; + T1u = T1m + T1t; + T1y = T1m - T1t; + } + { + E TZ, T1f, T1v, T1x; + TZ = W[0]; + T1f = W[1]; + cr[WS(rs, 1)] = FNMS(T1f, T1u, TZ * T1e); + ci[WS(rs, 1)] = FMA(TZ, T1u, T1f * T1e); + T1v = W[12]; + T1x = W[13]; + cr[WS(rs, 7)] = FNMS(T1x, T1y, T1v * T1w); + ci[WS(rs, 7)] = FMA(T1v, T1y, T1x * T1w); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 12, "hb_12", twinstr, &GENUS, {88, 30, 30, 0} }; + +void X(codelet_hb_12) (planner *p) { + X(khc2hc_register) (p, hb_12, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_15.c new file mode 100644 index 000000000..d8e1b7e4a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_15.c @@ -0,0 +1,810 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:32 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 15 -dif -name hb_15 -include rdft/scalar/hb.h */ + +/* + * This function contains 184 FP additions, 140 FP multiplications, + * (or, 72 additions, 28 multiplications, 112 fused multiply/add), + * 78 stack variables, 6 constants, and 60 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_15(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 28); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 28, MAKE_VOLATILE_STRIDE(30, rs)) { + E T5, T11, T1C, T2U, T2f, T3f, TH, T19, T18, TS, T12, T13, T14, T3a, T3g; + E Ts, Tv, T37, T3h, T28, T2h, T21, T2g, T2V, T2W, T2X, T2Y, T2Z, T30, T31; + E T1F, T1I, T1J, T1M, T1P, T1Q, T1R; + { + E T1, TX, T4, T2e, T10, T1B, T1A, T2d; + T1 = cr[0]; + TX = ci[WS(rs, 14)]; + { + E T2, T3, TY, TZ; + T2 = cr[WS(rs, 5)]; + T3 = ci[WS(rs, 4)]; + T4 = T2 + T3; + T2e = T2 - T3; + TY = ci[WS(rs, 9)]; + TZ = cr[WS(rs, 10)]; + T10 = TY - TZ; + T1B = TY + TZ; + } + T5 = T1 + T4; + T11 = TX + T10; + T1A = FNMS(KP500000000, T4, T1); + T1C = FNMS(KP866025403, T1B, T1A); + T2U = FMA(KP866025403, T1B, T1A); + T2d = FNMS(KP500000000, T10, TX); + T2f = FMA(KP866025403, T2e, T2d); + T3f = FNMS(KP866025403, T2e, T2d); + } + { + E Ta, T1W, T1D, Tl, T23, T1K, Tf, T1Z, T1G, TR, T1Y, T1H, Tq, T26, T1N; + E TG, T25, T1O, TM, T1V, T1E, TB, T22, T1L, T38, T39; + { + E T6, T7, T8, T9; + T6 = cr[WS(rs, 3)]; + T7 = ci[WS(rs, 6)]; + T8 = ci[WS(rs, 1)]; + T9 = T7 + T8; + Ta = T6 + T9; + T1W = T7 - T8; + T1D = FNMS(KP500000000, T9, T6); + } + { + E Th, Ti, Tj, Tk; + Th = cr[WS(rs, 6)]; + Ti = ci[WS(rs, 3)]; + Tj = cr[WS(rs, 1)]; + Tk = Ti + Tj; + Tl = Th + Tk; + T23 = Ti - Tj; + T1K = FNMS(KP500000000, Tk, Th); + } + { + E Tb, Tc, Td, Te; + Tb = ci[WS(rs, 2)]; + Tc = cr[WS(rs, 2)]; + Td = cr[WS(rs, 7)]; + Te = Tc + Td; + Tf = Tb + Te; + T1Z = Tc - Td; + T1G = FNMS(KP500000000, Te, Tb); + } + { + E TQ, TN, TO, TP; + TQ = cr[WS(rs, 12)]; + TN = ci[WS(rs, 12)]; + TO = ci[WS(rs, 7)]; + TP = TN + TO; + TR = TP - TQ; + T1Y = FMA(KP500000000, TP, TQ); + T1H = TO - TN; + } + { + E Tm, Tn, To, Tp; + Tm = ci[WS(rs, 5)]; + Tn = ci[0]; + To = cr[WS(rs, 4)]; + Tp = Tn + To; + Tq = Tm + Tp; + T26 = Tn - To; + T1N = FNMS(KP500000000, Tp, Tm); + } + { + E TF, TC, TD, TE; + TF = cr[WS(rs, 9)]; + TC = ci[WS(rs, 10)]; + TD = cr[WS(rs, 14)]; + TE = TC - TD; + TG = TE - TF; + T25 = FMA(KP500000000, TE, TF); + T1O = TC + TD; + } + { + E TI, TJ, TK, TL; + TI = ci[WS(rs, 11)]; + TJ = cr[WS(rs, 8)]; + TK = cr[WS(rs, 13)]; + TL = TJ + TK; + TM = TI - TL; + T1V = FMA(KP500000000, TL, TI); + T1E = TJ - TK; + } + { + E Tx, Ty, Tz, TA; + Tx = ci[WS(rs, 8)]; + Ty = ci[WS(rs, 13)]; + Tz = cr[WS(rs, 11)]; + TA = Ty - Tz; + TB = Tx + TA; + T22 = FNMS(KP500000000, TA, Tx); + T1L = Ty + Tz; + } + TH = TB - TG; + T19 = Ta - Tf; + T18 = Tl - Tq; + TS = TM - TR; + T12 = TM + TR; + T13 = TB + TG; + T14 = T12 + T13; + T38 = FNMS(KP866025403, T1W, T1V); + T39 = FMA(KP866025403, T1Z, T1Y); + T3a = T38 + T39; + T3g = T38 - T39; + { + E Tg, Tr, T1X, T20; + Tg = Ta + Tf; + Tr = Tl + Tq; + Ts = Tg + Tr; + Tv = Tg - Tr; + { + E T35, T36, T24, T27; + T35 = FNMS(KP866025403, T23, T22); + T36 = FMA(KP866025403, T26, T25); + T37 = T35 + T36; + T3h = T35 - T36; + T24 = FMA(KP866025403, T23, T22); + T27 = FNMS(KP866025403, T26, T25); + T28 = T24 + T27; + T2h = T24 - T27; + } + T1X = FMA(KP866025403, T1W, T1V); + T20 = FNMS(KP866025403, T1Z, T1Y); + T21 = T1X + T20; + T2g = T1X - T20; + T2V = FNMS(KP866025403, T1E, T1D); + T2W = FNMS(KP866025403, T1H, T1G); + T2X = T2V + T2W; + T2Y = FNMS(KP866025403, T1L, T1K); + T2Z = FNMS(KP866025403, T1O, T1N); + T30 = T2Y + T2Z; + T31 = T2X + T30; + T1F = FMA(KP866025403, T1E, T1D); + T1I = FMA(KP866025403, T1H, T1G); + T1J = T1F + T1I; + T1M = FMA(KP866025403, T1L, T1K); + T1P = FMA(KP866025403, T1O, T1N); + T1Q = T1M + T1P; + T1R = T1J + T1Q; + } + } + cr[0] = T5 + Ts; + ci[0] = T11 + T14; + { + E T1a, T1q, T17, T1p, TU, T1u, T1e, T1m, T15, T16; + T1a = FNMS(KP618033988, T19, T18); + T1q = FMA(KP618033988, T18, T19); + T15 = FNMS(KP250000000, T14, T11); + T16 = T12 - T13; + T17 = FNMS(KP559016994, T16, T15); + T1p = FMA(KP559016994, T16, T15); + { + E TT, T1l, Tw, T1k, Tu; + TT = FNMS(KP618033988, TS, TH); + T1l = FMA(KP618033988, TH, TS); + Tu = FNMS(KP250000000, Ts, T5); + Tw = FNMS(KP559016994, Tv, Tu); + T1k = FMA(KP559016994, Tv, Tu); + TU = FNMS(KP951056516, TT, Tw); + T1u = FMA(KP951056516, T1l, T1k); + T1e = FMA(KP951056516, TT, Tw); + T1m = FNMS(KP951056516, T1l, T1k); + } + { + E T1b, TW, T1c, Tt, TV; + T1b = FMA(KP951056516, T1a, T17); + TW = W[5]; + T1c = TW * TU; + Tt = W[4]; + TV = Tt * TU; + cr[WS(rs, 3)] = FNMS(TW, T1b, TV); + ci[WS(rs, 3)] = FMA(Tt, T1b, T1c); + } + { + E T1x, T1w, T1y, T1t, T1v; + T1x = FNMS(KP951056516, T1q, T1p); + T1w = W[17]; + T1y = T1w * T1u; + T1t = W[16]; + T1v = T1t * T1u; + cr[WS(rs, 9)] = FNMS(T1w, T1x, T1v); + ci[WS(rs, 9)] = FMA(T1t, T1x, T1y); + } + { + E T1h, T1g, T1i, T1d, T1f; + T1h = FNMS(KP951056516, T1a, T17); + T1g = W[23]; + T1i = T1g * T1e; + T1d = W[22]; + T1f = T1d * T1e; + cr[WS(rs, 12)] = FNMS(T1g, T1h, T1f); + ci[WS(rs, 12)] = FMA(T1d, T1h, T1i); + } + { + E T1r, T1o, T1s, T1j, T1n; + T1r = FMA(KP951056516, T1q, T1p); + T1o = W[11]; + T1s = T1o * T1m; + T1j = W[10]; + T1n = T1j * T1m; + cr[WS(rs, 6)] = FNMS(T1o, T1r, T1n); + ci[WS(rs, 6)] = FMA(T1j, T1r, T1s); + } + } + { + E T2o, T2E, T2N, T2P, T2Q, T2S, T2l, T2R, T2D, T2a, T2I, T2s, T2A; + { + E T2m, T2n, T2O, T2k, T2i, T2j; + T2m = T1F - T1I; + T2n = T1M - T1P; + T2o = FMA(KP618033988, T2n, T2m); + T2E = FNMS(KP618033988, T2m, T2n); + T2O = T1C + T1R; + T2N = W[18]; + T2P = T2N * T2O; + T2Q = W[19]; + T2S = T2Q * T2O; + T2k = T2g - T2h; + T2i = T2g + T2h; + T2j = FNMS(KP250000000, T2i, T2f); + T2l = FMA(KP559016994, T2k, T2j); + T2R = T2f + T2i; + T2D = FNMS(KP559016994, T2k, T2j); + { + E T29, T2z, T1U, T2y, T1S, T1T; + T29 = FMA(KP618033988, T28, T21); + T2z = FNMS(KP618033988, T21, T28); + T1S = FNMS(KP250000000, T1R, T1C); + T1T = T1J - T1Q; + T1U = FMA(KP559016994, T1T, T1S); + T2y = FNMS(KP559016994, T1T, T1S); + T2a = FNMS(KP951056516, T29, T1U); + T2I = FNMS(KP951056516, T2z, T2y); + T2s = FMA(KP951056516, T29, T1U); + T2A = FMA(KP951056516, T2z, T2y); + } + } + cr[WS(rs, 10)] = FNMS(T2Q, T2R, T2P); + ci[WS(rs, 10)] = FMA(T2N, T2R, T2S); + { + E T2p, T2c, T2q, T1z, T2b; + T2p = FMA(KP951056516, T2o, T2l); + T2c = W[1]; + T2q = T2c * T2a; + T1z = W[0]; + T2b = T1z * T2a; + cr[WS(rs, 1)] = FNMS(T2c, T2p, T2b); + ci[WS(rs, 1)] = FMA(T1z, T2p, T2q); + } + { + E T2L, T2K, T2M, T2H, T2J; + T2L = FMA(KP951056516, T2E, T2D); + T2K = W[25]; + T2M = T2K * T2I; + T2H = W[24]; + T2J = T2H * T2I; + cr[WS(rs, 13)] = FNMS(T2K, T2L, T2J); + ci[WS(rs, 13)] = FMA(T2H, T2L, T2M); + } + { + E T2F, T2C, T2G, T2x, T2B; + T2F = FNMS(KP951056516, T2E, T2D); + T2C = W[13]; + T2G = T2C * T2A; + T2x = W[12]; + T2B = T2x * T2A; + cr[WS(rs, 7)] = FNMS(T2C, T2F, T2B); + ci[WS(rs, 7)] = FMA(T2x, T2F, T2G); + } + { + E T2v, T2u, T2w, T2r, T2t; + T2v = FNMS(KP951056516, T2o, T2l); + T2u = W[7]; + T2w = T2u * T2s; + T2r = W[6]; + T2t = T2r * T2s; + cr[WS(rs, 4)] = FNMS(T2u, T2v, T2t); + ci[WS(rs, 4)] = FMA(T2r, T2v, T2w); + } + } + { + E T3o, T3E, T3N, T3P, T3Q, T3S, T3l, T3R, T3D, T3c, T3I, T3s, T3A; + { + E T3m, T3n, T3O, T3k, T3i, T3j; + T3m = T2Y - T2Z; + T3n = T2V - T2W; + T3o = FNMS(KP618033988, T3n, T3m); + T3E = FMA(KP618033988, T3m, T3n); + T3O = T2U + T31; + T3N = W[8]; + T3P = T3N * T3O; + T3Q = W[9]; + T3S = T3Q * T3O; + T3k = T3g - T3h; + T3i = T3g + T3h; + T3j = FNMS(KP250000000, T3i, T3f); + T3l = FNMS(KP559016994, T3k, T3j); + T3R = T3f + T3i; + T3D = FMA(KP559016994, T3k, T3j); + { + E T3b, T3z, T34, T3y, T32, T33; + T3b = FNMS(KP618033988, T3a, T37); + T3z = FMA(KP618033988, T37, T3a); + T32 = FNMS(KP250000000, T31, T2U); + T33 = T2X - T30; + T34 = FNMS(KP559016994, T33, T32); + T3y = FMA(KP559016994, T33, T32); + T3c = FMA(KP951056516, T3b, T34); + T3I = FMA(KP951056516, T3z, T3y); + T3s = FNMS(KP951056516, T3b, T34); + T3A = FNMS(KP951056516, T3z, T3y); + } + } + cr[WS(rs, 5)] = FNMS(T3Q, T3R, T3P); + ci[WS(rs, 5)] = FMA(T3N, T3R, T3S); + { + E T3p, T3e, T3q, T2T, T3d; + T3p = FNMS(KP951056516, T3o, T3l); + T3e = W[3]; + T3q = T3e * T3c; + T2T = W[2]; + T3d = T2T * T3c; + cr[WS(rs, 2)] = FNMS(T3e, T3p, T3d); + ci[WS(rs, 2)] = FMA(T2T, T3p, T3q); + } + { + E T3L, T3K, T3M, T3H, T3J; + T3L = FNMS(KP951056516, T3E, T3D); + T3K = W[27]; + T3M = T3K * T3I; + T3H = W[26]; + T3J = T3H * T3I; + cr[WS(rs, 14)] = FNMS(T3K, T3L, T3J); + ci[WS(rs, 14)] = FMA(T3H, T3L, T3M); + } + { + E T3F, T3C, T3G, T3x, T3B; + T3F = FMA(KP951056516, T3E, T3D); + T3C = W[21]; + T3G = T3C * T3A; + T3x = W[20]; + T3B = T3x * T3A; + cr[WS(rs, 11)] = FNMS(T3C, T3F, T3B); + ci[WS(rs, 11)] = FMA(T3x, T3F, T3G); + } + { + E T3v, T3u, T3w, T3r, T3t; + T3v = FMA(KP951056516, T3o, T3l); + T3u = W[15]; + T3w = T3u * T3s; + T3r = W[14]; + T3t = T3r * T3s; + cr[WS(rs, 8)] = FNMS(T3u, T3v, T3t); + ci[WS(rs, 8)] = FMA(T3r, T3v, T3w); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 15, "hb_15", twinstr, &GENUS, {72, 28, 112, 0} }; + +void X(codelet_hb_15) (planner *p) { + X(khc2hc_register) (p, hb_15, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 15 -dif -name hb_15 -include rdft/scalar/hb.h */ + +/* + * This function contains 184 FP additions, 112 FP multiplications, + * (or, 128 additions, 56 multiplications, 56 fused multiply/add), + * 75 stack variables, 6 constants, and 60 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_15(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 28); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 28, MAKE_VOLATILE_STRIDE(30, rs)) { + E T5, T10, T1J, T2C, T2c, T2M, TH, T18, T17, TS, T2Q, T2R, T2S, Tg, Tr; + E Ts, T11, T12, T13, T2N, T2O, T2P, T1u, T1x, T1y, T1W, T1Z, T28, T1P, T1S; + E T27, T1B, T1E, T1F, T2G, T2H, T2I, T2D, T2E, T2F; + { + E T1, TW, T4, T2a, TZ, T1I, T1H, T2b; + T1 = cr[0]; + TW = ci[WS(rs, 14)]; + { + E T2, T3, TX, TY; + T2 = cr[WS(rs, 5)]; + T3 = ci[WS(rs, 4)]; + T4 = T2 + T3; + T2a = KP866025403 * (T2 - T3); + TX = ci[WS(rs, 9)]; + TY = cr[WS(rs, 10)]; + TZ = TX - TY; + T1I = KP866025403 * (TX + TY); + } + T5 = T1 + T4; + T10 = TW + TZ; + T1H = FNMS(KP500000000, T4, T1); + T1J = T1H - T1I; + T2C = T1H + T1I; + T2b = FNMS(KP500000000, TZ, TW); + T2c = T2a + T2b; + T2M = T2b - T2a; + } + { + E Ta, T1N, T1s, Tl, T1U, T1z, Tf, T1Q, T1v, TG, T1R, T1w, Tq, T1X, T1C; + E TM, T1V, T1A, TB, T1O, T1t, TR, T1Y, T1D; + { + E T6, T7, T8, T9; + T6 = cr[WS(rs, 3)]; + T7 = ci[WS(rs, 6)]; + T8 = ci[WS(rs, 1)]; + T9 = T7 + T8; + Ta = T6 + T9; + T1N = KP866025403 * (T7 - T8); + T1s = FNMS(KP500000000, T9, T6); + } + { + E Th, Ti, Tj, Tk; + Th = cr[WS(rs, 6)]; + Ti = ci[WS(rs, 3)]; + Tj = cr[WS(rs, 1)]; + Tk = Ti + Tj; + Tl = Th + Tk; + T1U = KP866025403 * (Ti - Tj); + T1z = FNMS(KP500000000, Tk, Th); + } + { + E Tb, Tc, Td, Te; + Tb = ci[WS(rs, 2)]; + Tc = cr[WS(rs, 2)]; + Td = cr[WS(rs, 7)]; + Te = Tc + Td; + Tf = Tb + Te; + T1Q = KP866025403 * (Tc - Td); + T1v = FNMS(KP500000000, Te, Tb); + } + { + E TF, TC, TD, TE; + TF = cr[WS(rs, 12)]; + TC = ci[WS(rs, 12)]; + TD = ci[WS(rs, 7)]; + TE = TC + TD; + TG = TE - TF; + T1R = FMA(KP500000000, TE, TF); + T1w = KP866025403 * (TD - TC); + } + { + E Tm, Tn, To, Tp; + Tm = ci[WS(rs, 5)]; + Tn = ci[0]; + To = cr[WS(rs, 4)]; + Tp = Tn + To; + Tq = Tm + Tp; + T1X = KP866025403 * (Tn - To); + T1C = FNMS(KP500000000, Tp, Tm); + } + { + E TI, TJ, TK, TL; + TI = ci[WS(rs, 8)]; + TJ = ci[WS(rs, 13)]; + TK = cr[WS(rs, 11)]; + TL = TJ - TK; + TM = TI + TL; + T1V = FNMS(KP500000000, TL, TI); + T1A = KP866025403 * (TJ + TK); + } + { + E Tx, Ty, Tz, TA; + Tx = ci[WS(rs, 11)]; + Ty = cr[WS(rs, 8)]; + Tz = cr[WS(rs, 13)]; + TA = Ty + Tz; + TB = Tx - TA; + T1O = FMA(KP500000000, TA, Tx); + T1t = KP866025403 * (Ty - Tz); + } + { + E TQ, TN, TO, TP; + TQ = cr[WS(rs, 9)]; + TN = ci[WS(rs, 10)]; + TO = cr[WS(rs, 14)]; + TP = TN - TO; + TR = TP - TQ; + T1Y = FMA(KP500000000, TP, TQ); + T1D = KP866025403 * (TN + TO); + } + TH = TB - TG; + T18 = Tl - Tq; + T17 = Ta - Tf; + TS = TM - TR; + T2Q = T1V - T1U; + T2R = T1X + T1Y; + T2S = T2Q - T2R; + Tg = Ta + Tf; + Tr = Tl + Tq; + Ts = Tg + Tr; + T11 = TB + TG; + T12 = TM + TR; + T13 = T11 + T12; + T2N = T1O - T1N; + T2O = T1Q + T1R; + T2P = T2N - T2O; + T1u = T1s + T1t; + T1x = T1v + T1w; + T1y = T1u + T1x; + T1W = T1U + T1V; + T1Z = T1X - T1Y; + T28 = T1W + T1Z; + T1P = T1N + T1O; + T1S = T1Q - T1R; + T27 = T1P + T1S; + T1B = T1z + T1A; + T1E = T1C + T1D; + T1F = T1B + T1E; + T2G = T1z - T1A; + T2H = T1C - T1D; + T2I = T2G + T2H; + T2D = T1s - T1t; + T2E = T1v - T1w; + T2F = T2D + T2E; + } + cr[0] = T5 + Ts; + ci[0] = T10 + T13; + { + E TT, T19, T1k, T1h, T16, T1l, Tw, T1g; + TT = FNMS(KP951056516, TS, KP587785252 * TH); + T19 = FNMS(KP951056516, T18, KP587785252 * T17); + T1k = FMA(KP951056516, T17, KP587785252 * T18); + T1h = FMA(KP951056516, TH, KP587785252 * TS); + { + E T14, T15, Tu, Tv; + T14 = FNMS(KP250000000, T13, T10); + T15 = KP559016994 * (T11 - T12); + T16 = T14 - T15; + T1l = T15 + T14; + Tu = FNMS(KP250000000, Ts, T5); + Tv = KP559016994 * (Tg - Tr); + Tw = Tu - Tv; + T1g = Tv + Tu; + } + { + E TU, T1a, Tt, TV; + TU = Tw + TT; + T1a = T16 - T19; + Tt = W[4]; + TV = W[5]; + cr[WS(rs, 3)] = FNMS(TV, T1a, Tt * TU); + ci[WS(rs, 3)] = FMA(TV, TU, Tt * T1a); + } + { + E T1o, T1q, T1n, T1p; + T1o = T1g + T1h; + T1q = T1l - T1k; + T1n = W[16]; + T1p = W[17]; + cr[WS(rs, 9)] = FNMS(T1p, T1q, T1n * T1o); + ci[WS(rs, 9)] = FMA(T1p, T1o, T1n * T1q); + } + { + E T1c, T1e, T1b, T1d; + T1c = Tw - TT; + T1e = T19 + T16; + T1b = W[22]; + T1d = W[23]; + cr[WS(rs, 12)] = FNMS(T1d, T1e, T1b * T1c); + ci[WS(rs, 12)] = FMA(T1d, T1c, T1b * T1e); + } + { + E T1i, T1m, T1f, T1j; + T1i = T1g - T1h; + T1m = T1k + T1l; + T1f = W[10]; + T1j = W[11]; + cr[WS(rs, 6)] = FNMS(T1j, T1m, T1f * T1i); + ci[WS(rs, 6)] = FMA(T1j, T1i, T1f * T1m); + } + } + { + E T21, T2n, T26, T2q, T1M, T2y, T2m, T2f, T2A, T2r, T2x, T2z; + { + E T1T, T20, T24, T25; + T1T = T1P - T1S; + T20 = T1W - T1Z; + T21 = FMA(KP951056516, T1T, KP587785252 * T20); + T2n = FNMS(KP951056516, T20, KP587785252 * T1T); + T24 = T1u - T1x; + T25 = T1B - T1E; + T26 = FMA(KP951056516, T24, KP587785252 * T25); + T2q = FNMS(KP951056516, T25, KP587785252 * T24); + } + { + E T1G, T1K, T1L, T29, T2d, T2e; + T1G = KP559016994 * (T1y - T1F); + T1K = T1y + T1F; + T1L = FNMS(KP250000000, T1K, T1J); + T1M = T1G + T1L; + T2y = T1J + T1K; + T2m = T1L - T1G; + T29 = KP559016994 * (T27 - T28); + T2d = T27 + T28; + T2e = FNMS(KP250000000, T2d, T2c); + T2f = T29 + T2e; + T2A = T2c + T2d; + T2r = T2e - T29; + } + T2x = W[18]; + T2z = W[19]; + cr[WS(rs, 10)] = FNMS(T2z, T2A, T2x * T2y); + ci[WS(rs, 10)] = FMA(T2z, T2y, T2x * T2A); + { + E T2u, T2w, T2t, T2v; + T2u = T2m + T2n; + T2w = T2r - T2q; + T2t = W[24]; + T2v = W[25]; + cr[WS(rs, 13)] = FNMS(T2v, T2w, T2t * T2u); + ci[WS(rs, 13)] = FMA(T2v, T2u, T2t * T2w); + } + { + E T22, T2g, T1r, T23; + T22 = T1M - T21; + T2g = T26 + T2f; + T1r = W[0]; + T23 = W[1]; + cr[WS(rs, 1)] = FNMS(T23, T2g, T1r * T22); + ci[WS(rs, 1)] = FMA(T23, T22, T1r * T2g); + } + { + E T2i, T2k, T2h, T2j; + T2i = T1M + T21; + T2k = T2f - T26; + T2h = W[6]; + T2j = W[7]; + cr[WS(rs, 4)] = FNMS(T2j, T2k, T2h * T2i); + ci[WS(rs, 4)] = FMA(T2j, T2i, T2h * T2k); + } + { + E T2o, T2s, T2l, T2p; + T2o = T2m - T2n; + T2s = T2q + T2r; + T2l = W[12]; + T2p = W[13]; + cr[WS(rs, 7)] = FNMS(T2p, T2s, T2l * T2o); + ci[WS(rs, 7)] = FMA(T2p, T2o, T2l * T2s); + } + } + { + E T31, T3h, T36, T3k, T2K, T3g, T2Y, T2U, T3l, T39, T2B, T2L; + { + E T2Z, T30, T34, T35; + T2Z = T2N + T2O; + T30 = T2Q + T2R; + T31 = FNMS(KP951056516, T30, KP587785252 * T2Z); + T3h = FMA(KP951056516, T2Z, KP587785252 * T30); + T34 = T2D - T2E; + T35 = T2G - T2H; + T36 = FNMS(KP951056516, T35, KP587785252 * T34); + T3k = FMA(KP951056516, T34, KP587785252 * T35); + } + { + E T2X, T2J, T2W, T38, T2T, T37; + T2X = KP559016994 * (T2F - T2I); + T2J = T2F + T2I; + T2W = FNMS(KP250000000, T2J, T2C); + T2K = T2C + T2J; + T3g = T2X + T2W; + T2Y = T2W - T2X; + T38 = KP559016994 * (T2P - T2S); + T2T = T2P + T2S; + T37 = FNMS(KP250000000, T2T, T2M); + T2U = T2M + T2T; + T3l = T38 + T37; + T39 = T37 - T38; + } + T2B = W[8]; + T2L = W[9]; + cr[WS(rs, 5)] = FNMS(T2L, T2U, T2B * T2K); + ci[WS(rs, 5)] = FMA(T2L, T2K, T2B * T2U); + { + E T3o, T3q, T3n, T3p; + T3o = T3g + T3h; + T3q = T3l - T3k; + T3n = W[26]; + T3p = W[27]; + cr[WS(rs, 14)] = FNMS(T3p, T3q, T3n * T3o); + ci[WS(rs, 14)] = FMA(T3n, T3q, T3p * T3o); + } + { + E T32, T3a, T2V, T33; + T32 = T2Y - T31; + T3a = T36 + T39; + T2V = W[2]; + T33 = W[3]; + cr[WS(rs, 2)] = FNMS(T33, T3a, T2V * T32); + ci[WS(rs, 2)] = FMA(T2V, T3a, T33 * T32); + } + { + E T3c, T3e, T3b, T3d; + T3c = T2Y + T31; + T3e = T39 - T36; + T3b = W[14]; + T3d = W[15]; + cr[WS(rs, 8)] = FNMS(T3d, T3e, T3b * T3c); + ci[WS(rs, 8)] = FMA(T3b, T3e, T3d * T3c); + } + { + E T3i, T3m, T3f, T3j; + T3i = T3g - T3h; + T3m = T3k + T3l; + T3f = W[20]; + T3j = W[21]; + cr[WS(rs, 11)] = FNMS(T3j, T3m, T3f * T3i); + ci[WS(rs, 11)] = FMA(T3f, T3m, T3j * T3i); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 15, "hb_15", twinstr, &GENUS, {128, 56, 56, 0} }; + +void X(codelet_hb_15) (planner *p) { + X(khc2hc_register) (p, hb_15, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_16.c new file mode 100644 index 000000000..0df7e5040 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_16.c @@ -0,0 +1,833 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:32 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hb_16 -include rdft/scalar/hb.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 104 additions, 30 multiplications, 70 fused multiply/add), + * 63 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 30, MAKE_VOLATILE_STRIDE(32, rs)) { + E TA, T1O, T21, T1h, T2P, T2S, T3b, T3p, T3q, T3D, T1k, T1P, Tf, T3y, T2A; + E T36, TL, T22, T3s, T3t, T3z, T2F, T2U, T2K, T2V, Tu, T3E, TX, T1n, T1T; + E T24, T1W, T25, T18, T1m; + { + E T3, Tw, TJ, T2x, T1g, T2Q, T6, T1d, Ta, TB, Tz, T2R, TE, T2y, Td; + E TG; + { + E T1, T2, TH, TI; + T1 = cr[0]; + T2 = ci[WS(rs, 7)]; + T3 = T1 + T2; + Tw = T1 - T2; + TH = ci[WS(rs, 9)]; + TI = cr[WS(rs, 14)]; + TJ = TH + TI; + T2x = TH - TI; + } + { + E T1e, T1f, T4, T5; + T1e = ci[WS(rs, 15)]; + T1f = cr[WS(rs, 8)]; + T1g = T1e + T1f; + T2Q = T1e - T1f; + T4 = cr[WS(rs, 4)]; + T5 = ci[WS(rs, 3)]; + T6 = T4 + T5; + T1d = T4 - T5; + } + { + E T8, T9, Tx, Ty; + T8 = cr[WS(rs, 2)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + TB = T8 - T9; + Tx = ci[WS(rs, 11)]; + Ty = cr[WS(rs, 12)]; + Tz = Tx + Ty; + T2R = Tx - Ty; + } + { + E TC, TD, Tb, Tc; + TC = ci[WS(rs, 13)]; + TD = cr[WS(rs, 10)]; + TE = TC + TD; + T2y = TC - TD; + Tb = ci[WS(rs, 1)]; + Tc = cr[WS(rs, 6)]; + Td = Tb + Tc; + TG = Tb - Tc; + } + TA = Tw - Tz; + T1O = Tw + Tz; + T21 = T1g - T1d; + T1h = T1d + T1g; + T2P = Ta - Td; + T2S = T2Q - T2R; + T3b = T2S - T2P; + { + E T1i, T1j, T7, Te; + T3p = T2Q + T2R; + T3q = T2y + T2x; + T3D = T3p - T3q; + T1i = TB + TE; + T1j = TG + TJ; + T1k = T1i - T1j; + T1P = T1i + T1j; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T3y = T7 - Te; + { + E T2w, T2z, TF, TK; + T2w = T3 - T6; + T2z = T2x - T2y; + T2A = T2w + T2z; + T36 = T2w - T2z; + TF = TB - TE; + TK = TG - TJ; + TL = TF + TK; + T22 = TF - TK; + } + } + } + { + E Ti, T13, T11, T2C, T16, T2D, Tl, TY, Tp, TS, TQ, T2H, TV, T2I, Ts; + E TN, T2B, T2E; + { + E Tg, Th, TZ, T10; + Tg = cr[WS(rs, 1)]; + Th = ci[WS(rs, 6)]; + Ti = Tg + Th; + T13 = Tg - Th; + TZ = ci[WS(rs, 14)]; + T10 = cr[WS(rs, 9)]; + T11 = TZ + T10; + T2C = TZ - T10; + } + { + E T14, T15, Tj, Tk; + T14 = ci[WS(rs, 10)]; + T15 = cr[WS(rs, 13)]; + T16 = T14 + T15; + T2D = T14 - T15; + Tj = cr[WS(rs, 5)]; + Tk = ci[WS(rs, 2)]; + Tl = Tj + Tk; + TY = Tj - Tk; + } + { + E Tn, To, TO, TP; + Tn = ci[0]; + To = cr[WS(rs, 7)]; + Tp = Tn + To; + TS = Tn - To; + TO = ci[WS(rs, 8)]; + TP = cr[WS(rs, 15)]; + TQ = TO + TP; + T2H = TO - TP; + } + { + E TT, TU, Tq, Tr; + TT = ci[WS(rs, 12)]; + TU = cr[WS(rs, 11)]; + TV = TT + TU; + T2I = TT - TU; + Tq = cr[WS(rs, 3)]; + Tr = ci[WS(rs, 4)]; + Ts = Tq + Tr; + TN = Tq - Tr; + } + T3s = T2C + T2D; + T3t = T2H + T2I; + T3z = T3t - T3s; + T2B = Ti - Tl; + T2E = T2C - T2D; + T2F = T2B - T2E; + T2U = T2B + T2E; + { + E T2G, T2J, Tm, Tt; + T2G = Tp - Ts; + T2J = T2H - T2I; + T2K = T2G + T2J; + T2V = T2J - T2G; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T3E = Tm - Tt; + } + { + E TR, TW, T1R, T1S; + TR = TN - TQ; + TW = TS - TV; + TX = FNMS(KP414213562, TW, TR); + T1n = FMA(KP414213562, TR, TW); + T1R = T11 - TY; + T1S = T13 + T16; + T1T = FNMS(KP414213562, T1S, T1R); + T24 = FMA(KP414213562, T1R, T1S); + } + { + E T1U, T1V, T12, T17; + T1U = TN + TQ; + T1V = TS + TV; + T1W = FNMS(KP414213562, T1V, T1U); + T25 = FMA(KP414213562, T1U, T1V); + T12 = TY + T11; + T17 = T13 - T16; + T18 = FMA(KP414213562, T17, T12); + T1m = FNMS(KP414213562, T12, T17); + } + } + cr[0] = Tf + Tu; + { + E T3r, T3u, T3v, T3l, T3n, T3o, T3w, T3m; + T3r = T3p + T3q; + T3u = T3s + T3t; + T3v = T3r - T3u; + T3m = Tf - Tu; + T3l = W[14]; + T3n = T3l * T3m; + T3o = W[15]; + T3w = T3o * T3m; + ci[0] = T3r + T3u; + ci[WS(rs, 8)] = FMA(T3l, T3v, T3w); + cr[WS(rs, 8)] = FNMS(T3o, T3v, T3n); + } + { + E T3A, T3F, T3B, T3G, T3x, T3C; + T3A = T3y - T3z; + T3F = T3D - T3E; + T3x = W[22]; + T3B = T3x * T3A; + T3G = T3x * T3F; + T3C = W[23]; + cr[WS(rs, 12)] = FNMS(T3C, T3F, T3B); + ci[WS(rs, 12)] = FMA(T3C, T3A, T3G); + } + { + E T3I, T3L, T3J, T3M, T3H, T3K; + T3I = T3y + T3z; + T3L = T3E + T3D; + T3H = W[6]; + T3J = T3H * T3I; + T3M = T3H * T3L; + T3K = W[7]; + cr[WS(rs, 4)] = FNMS(T3K, T3L, T3J); + ci[WS(rs, 4)] = FMA(T3K, T3I, T3M); + } + { + E T38, T3g, T3d, T3j, T37, T3c; + T37 = T2V - T2U; + T38 = FNMS(KP707106781, T37, T36); + T3g = FMA(KP707106781, T37, T36); + T3c = T2F - T2K; + T3d = FNMS(KP707106781, T3c, T3b); + T3j = FMA(KP707106781, T3c, T3b); + { + E T39, T3e, T35, T3a; + T35 = W[26]; + T39 = T35 * T38; + T3e = T35 * T3d; + T3a = W[27]; + cr[WS(rs, 14)] = FNMS(T3a, T3d, T39); + ci[WS(rs, 14)] = FMA(T3a, T38, T3e); + } + { + E T3h, T3k, T3f, T3i; + T3f = W[10]; + T3h = T3f * T3g; + T3k = T3f * T3j; + T3i = W[11]; + cr[WS(rs, 6)] = FNMS(T3i, T3j, T3h); + ci[WS(rs, 6)] = FMA(T3i, T3g, T3k); + } + } + { + E T2M, T30, T2X, T33, T2L, T2T, T2W; + T2L = T2F + T2K; + T2M = FNMS(KP707106781, T2L, T2A); + T30 = FMA(KP707106781, T2L, T2A); + T2T = T2P + T2S; + T2W = T2U + T2V; + T2X = FNMS(KP707106781, T2W, T2T); + T33 = FMA(KP707106781, T2W, T2T); + { + E T2v, T2N, T2O, T2Y; + T2v = W[18]; + T2N = T2v * T2M; + T2O = W[19]; + T2Y = T2O * T2M; + cr[WS(rs, 10)] = FNMS(T2O, T2X, T2N); + ci[WS(rs, 10)] = FMA(T2v, T2X, T2Y); + } + { + E T2Z, T31, T32, T34; + T2Z = W[2]; + T31 = T2Z * T30; + T32 = W[3]; + T34 = T32 * T30; + cr[WS(rs, 2)] = FNMS(T32, T33, T31); + ci[WS(rs, 2)] = FMA(T2Z, T33, T34); + } + } + { + E T1Y, T2a, T27, T2d; + { + E T1Q, T1X, T23, T26; + T1Q = FNMS(KP707106781, T1P, T1O); + T1X = T1T + T1W; + T1Y = FMA(KP923879532, T1X, T1Q); + T2a = FNMS(KP923879532, T1X, T1Q); + T23 = FMA(KP707106781, T22, T21); + T26 = T24 - T25; + T27 = FNMS(KP923879532, T26, T23); + T2d = FMA(KP923879532, T26, T23); + } + { + E T1N, T1Z, T20, T28; + T1N = W[20]; + T1Z = T1N * T1Y; + T20 = W[21]; + T28 = T20 * T1Y; + cr[WS(rs, 11)] = FNMS(T20, T27, T1Z); + ci[WS(rs, 11)] = FMA(T1N, T27, T28); + } + { + E T29, T2b, T2c, T2e; + T29 = W[4]; + T2b = T29 * T2a; + T2c = W[5]; + T2e = T2c * T2a; + cr[WS(rs, 3)] = FNMS(T2c, T2d, T2b); + ci[WS(rs, 3)] = FMA(T29, T2d, T2e); + } + } + { + E T1a, T1s, T1p, T1v; + { + E TM, T19, T1l, T1o; + TM = FNMS(KP707106781, TL, TA); + T19 = TX - T18; + T1a = FNMS(KP923879532, T19, TM); + T1s = FMA(KP923879532, T19, TM); + T1l = FNMS(KP707106781, T1k, T1h); + T1o = T1m - T1n; + T1p = FNMS(KP923879532, T1o, T1l); + T1v = FMA(KP923879532, T1o, T1l); + } + { + E Tv, T1b, T1c, T1q; + Tv = W[24]; + T1b = Tv * T1a; + T1c = W[25]; + T1q = T1c * T1a; + cr[WS(rs, 13)] = FNMS(T1c, T1p, T1b); + ci[WS(rs, 13)] = FMA(Tv, T1p, T1q); + } + { + E T1r, T1t, T1u, T1w; + T1r = W[8]; + T1t = T1r * T1s; + T1u = W[9]; + T1w = T1u * T1s; + cr[WS(rs, 5)] = FNMS(T1u, T1v, T1t); + ci[WS(rs, 5)] = FMA(T1r, T1v, T1w); + } + } + { + E T2i, T2q, T2n, T2t; + { + E T2g, T2h, T2l, T2m; + T2g = FMA(KP707106781, T1P, T1O); + T2h = T24 + T25; + T2i = FNMS(KP923879532, T2h, T2g); + T2q = FMA(KP923879532, T2h, T2g); + T2l = FNMS(KP707106781, T22, T21); + T2m = T1W - T1T; + T2n = FMA(KP923879532, T2m, T2l); + T2t = FNMS(KP923879532, T2m, T2l); + } + { + E T2j, T2o, T2f, T2k; + T2f = W[12]; + T2j = T2f * T2i; + T2o = T2f * T2n; + T2k = W[13]; + cr[WS(rs, 7)] = FNMS(T2k, T2n, T2j); + ci[WS(rs, 7)] = FMA(T2k, T2i, T2o); + } + { + E T2r, T2u, T2p, T2s; + T2p = W[28]; + T2r = T2p * T2q; + T2u = T2p * T2t; + T2s = W[29]; + cr[WS(rs, 15)] = FNMS(T2s, T2t, T2r); + ci[WS(rs, 15)] = FMA(T2s, T2q, T2u); + } + } + { + E T1A, T1I, T1F, T1L; + { + E T1y, T1z, T1D, T1E; + T1y = FMA(KP707106781, TL, TA); + T1z = T1m + T1n; + T1A = FNMS(KP923879532, T1z, T1y); + T1I = FMA(KP923879532, T1z, T1y); + T1D = FMA(KP707106781, T1k, T1h); + T1E = T18 + TX; + T1F = FNMS(KP923879532, T1E, T1D); + T1L = FMA(KP923879532, T1E, T1D); + } + { + E T1B, T1G, T1x, T1C; + T1x = W[16]; + T1B = T1x * T1A; + T1G = T1x * T1F; + T1C = W[17]; + cr[WS(rs, 9)] = FNMS(T1C, T1F, T1B); + ci[WS(rs, 9)] = FMA(T1C, T1A, T1G); + } + { + E T1J, T1M, T1H, T1K; + T1H = W[0]; + T1J = T1H * T1I; + T1M = T1H * T1L; + T1K = W[1]; + cr[WS(rs, 1)] = FNMS(T1K, T1L, T1J); + ci[WS(rs, 1)] = FMA(T1K, T1I, T1M); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hb_16", twinstr, &GENUS, {104, 30, 70, 0} }; + +void X(codelet_hb_16) (planner *p) { + X(khc2hc_register) (p, hb_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hb_16 -include rdft/scalar/hb.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 136 additions, 46 multiplications, 38 fused multiply/add), + * 50 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 30, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T2K, T2W, Tw, T17, T1S, T2k, T1w, Te, TD, T1x, T10, T2n, T2L, T1Z; + E T2X, Tm, T1z, TN, T19, T2e, T2p, T2P, T2Z, Tt, T1A, TW, T1a, T27, T2q; + E T2S, T30; + { + E T3, T1Q, T16, T1R, T6, T2i, T13, T2j; + { + E T1, T2, T14, T15; + T1 = cr[0]; + T2 = ci[WS(rs, 7)]; + T3 = T1 + T2; + T1Q = T1 - T2; + T14 = ci[WS(rs, 11)]; + T15 = cr[WS(rs, 12)]; + T16 = T14 - T15; + T1R = T14 + T15; + } + { + E T4, T5, T11, T12; + T4 = cr[WS(rs, 4)]; + T5 = ci[WS(rs, 3)]; + T6 = T4 + T5; + T2i = T4 - T5; + T11 = ci[WS(rs, 15)]; + T12 = cr[WS(rs, 8)]; + T13 = T11 - T12; + T2j = T11 + T12; + } + T7 = T3 + T6; + T2K = T1Q + T1R; + T2W = T2j - T2i; + Tw = T3 - T6; + T17 = T13 - T16; + T1S = T1Q - T1R; + T2k = T2i + T2j; + T1w = T13 + T16; + } + { + E Ta, T1T, TC, T1U, Td, T1W, Tz, T1X; + { + E T8, T9, TA, TB; + T8 = cr[WS(rs, 2)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + T1T = T8 - T9; + TA = ci[WS(rs, 13)]; + TB = cr[WS(rs, 10)]; + TC = TA - TB; + T1U = TA + TB; + } + { + E Tb, Tc, Tx, Ty; + Tb = ci[WS(rs, 1)]; + Tc = cr[WS(rs, 6)]; + Td = Tb + Tc; + T1W = Tb - Tc; + Tx = ci[WS(rs, 9)]; + Ty = cr[WS(rs, 14)]; + Tz = Tx - Ty; + T1X = Tx + Ty; + } + Te = Ta + Td; + TD = Tz - TC; + T1x = TC + Tz; + T10 = Ta - Td; + { + E T2l, T2m, T1V, T1Y; + T2l = T1T + T1U; + T2m = T1W + T1X; + T2n = KP707106781 * (T2l - T2m); + T2L = KP707106781 * (T2l + T2m); + T1V = T1T - T1U; + T1Y = T1W - T1X; + T1Z = KP707106781 * (T1V + T1Y); + T2X = KP707106781 * (T1V - T1Y); + } + } + { + E Ti, T2b, TL, T2c, Tl, T28, TI, T29, TF, TM; + { + E Tg, Th, TJ, TK; + Tg = cr[WS(rs, 1)]; + Th = ci[WS(rs, 6)]; + Ti = Tg + Th; + T2b = Tg - Th; + TJ = ci[WS(rs, 10)]; + TK = cr[WS(rs, 13)]; + TL = TJ - TK; + T2c = TJ + TK; + } + { + E Tj, Tk, TG, TH; + Tj = cr[WS(rs, 5)]; + Tk = ci[WS(rs, 2)]; + Tl = Tj + Tk; + T28 = Tj - Tk; + TG = ci[WS(rs, 14)]; + TH = cr[WS(rs, 9)]; + TI = TG - TH; + T29 = TG + TH; + } + Tm = Ti + Tl; + T1z = TI + TL; + TF = Ti - Tl; + TM = TI - TL; + TN = TF - TM; + T19 = TF + TM; + { + E T2a, T2d, T2N, T2O; + T2a = T28 + T29; + T2d = T2b - T2c; + T2e = FMA(KP923879532, T2a, KP382683432 * T2d); + T2p = FNMS(KP382683432, T2a, KP923879532 * T2d); + T2N = T2b + T2c; + T2O = T29 - T28; + T2P = FNMS(KP923879532, T2O, KP382683432 * T2N); + T2Z = FMA(KP382683432, T2O, KP923879532 * T2N); + } + } + { + E Tp, T24, TU, T25, Ts, T21, TR, T22, TO, TV; + { + E Tn, To, TS, TT; + Tn = ci[0]; + To = cr[WS(rs, 7)]; + Tp = Tn + To; + T24 = Tn - To; + TS = ci[WS(rs, 12)]; + TT = cr[WS(rs, 11)]; + TU = TS - TT; + T25 = TS + TT; + } + { + E Tq, Tr, TP, TQ; + Tq = cr[WS(rs, 3)]; + Tr = ci[WS(rs, 4)]; + Ts = Tq + Tr; + T21 = Tq - Tr; + TP = ci[WS(rs, 8)]; + TQ = cr[WS(rs, 15)]; + TR = TP - TQ; + T22 = TP + TQ; + } + Tt = Tp + Ts; + T1A = TR + TU; + TO = Tp - Ts; + TV = TR - TU; + TW = TO + TV; + T1a = TV - TO; + { + E T23, T26, T2Q, T2R; + T23 = T21 - T22; + T26 = T24 - T25; + T27 = FNMS(KP382683432, T26, KP923879532 * T23); + T2q = FMA(KP382683432, T23, KP923879532 * T26); + T2Q = T24 + T25; + T2R = T21 + T22; + T2S = FNMS(KP923879532, T2R, KP382683432 * T2Q); + T30 = FMA(KP382683432, T2R, KP923879532 * T2Q); + } + } + { + E Tf, Tu, T1u, T1y, T1B, T1C, T1t, T1v; + Tf = T7 + Te; + Tu = Tm + Tt; + T1u = Tf - Tu; + T1y = T1w + T1x; + T1B = T1z + T1A; + T1C = T1y - T1B; + cr[0] = Tf + Tu; + ci[0] = T1y + T1B; + T1t = W[14]; + T1v = W[15]; + cr[WS(rs, 8)] = FNMS(T1v, T1C, T1t * T1u); + ci[WS(rs, 8)] = FMA(T1v, T1u, T1t * T1C); + } + { + E T2U, T34, T32, T36; + { + E T2M, T2T, T2Y, T31; + T2M = T2K - T2L; + T2T = T2P + T2S; + T2U = T2M - T2T; + T34 = T2M + T2T; + T2Y = T2W + T2X; + T31 = T2Z - T30; + T32 = T2Y - T31; + T36 = T2Y + T31; + } + { + E T2J, T2V, T33, T35; + T2J = W[20]; + T2V = W[21]; + cr[WS(rs, 11)] = FNMS(T2V, T32, T2J * T2U); + ci[WS(rs, 11)] = FMA(T2V, T2U, T2J * T32); + T33 = W[4]; + T35 = W[5]; + cr[WS(rs, 3)] = FNMS(T35, T36, T33 * T34); + ci[WS(rs, 3)] = FMA(T35, T34, T33 * T36); + } + } + { + E T3a, T3g, T3e, T3i; + { + E T38, T39, T3c, T3d; + T38 = T2K + T2L; + T39 = T2Z + T30; + T3a = T38 - T39; + T3g = T38 + T39; + T3c = T2W - T2X; + T3d = T2P - T2S; + T3e = T3c + T3d; + T3i = T3c - T3d; + } + { + E T37, T3b, T3f, T3h; + T37 = W[12]; + T3b = W[13]; + cr[WS(rs, 7)] = FNMS(T3b, T3e, T37 * T3a); + ci[WS(rs, 7)] = FMA(T37, T3e, T3b * T3a); + T3f = W[28]; + T3h = W[29]; + cr[WS(rs, 15)] = FNMS(T3h, T3i, T3f * T3g); + ci[WS(rs, 15)] = FMA(T3f, T3i, T3h * T3g); + } + } + { + E TY, T1e, T1c, T1g; + { + E TE, TX, T18, T1b; + TE = Tw + TD; + TX = KP707106781 * (TN + TW); + TY = TE - TX; + T1e = TE + TX; + T18 = T10 + T17; + T1b = KP707106781 * (T19 + T1a); + T1c = T18 - T1b; + T1g = T18 + T1b; + } + { + E Tv, TZ, T1d, T1f; + Tv = W[18]; + TZ = W[19]; + cr[WS(rs, 10)] = FNMS(TZ, T1c, Tv * TY); + ci[WS(rs, 10)] = FMA(TZ, TY, Tv * T1c); + T1d = W[2]; + T1f = W[3]; + cr[WS(rs, 2)] = FNMS(T1f, T1g, T1d * T1e); + ci[WS(rs, 2)] = FMA(T1f, T1e, T1d * T1g); + } + } + { + E T1k, T1q, T1o, T1s; + { + E T1i, T1j, T1m, T1n; + T1i = Tw - TD; + T1j = KP707106781 * (T1a - T19); + T1k = T1i - T1j; + T1q = T1i + T1j; + T1m = T17 - T10; + T1n = KP707106781 * (TN - TW); + T1o = T1m - T1n; + T1s = T1m + T1n; + } + { + E T1h, T1l, T1p, T1r; + T1h = W[26]; + T1l = W[27]; + cr[WS(rs, 14)] = FNMS(T1l, T1o, T1h * T1k); + ci[WS(rs, 14)] = FMA(T1h, T1o, T1l * T1k); + T1p = W[10]; + T1r = W[11]; + cr[WS(rs, 6)] = FNMS(T1r, T1s, T1p * T1q); + ci[WS(rs, 6)] = FMA(T1p, T1s, T1r * T1q); + } + } + { + E T2g, T2u, T2s, T2w; + { + E T20, T2f, T2o, T2r; + T20 = T1S - T1Z; + T2f = T27 - T2e; + T2g = T20 - T2f; + T2u = T20 + T2f; + T2o = T2k - T2n; + T2r = T2p - T2q; + T2s = T2o - T2r; + T2w = T2o + T2r; + } + { + E T1P, T2h, T2t, T2v; + T1P = W[24]; + T2h = W[25]; + cr[WS(rs, 13)] = FNMS(T2h, T2s, T1P * T2g); + ci[WS(rs, 13)] = FMA(T2h, T2g, T1P * T2s); + T2t = W[8]; + T2v = W[9]; + cr[WS(rs, 5)] = FNMS(T2v, T2w, T2t * T2u); + ci[WS(rs, 5)] = FMA(T2v, T2u, T2t * T2w); + } + } + { + E T2A, T2G, T2E, T2I; + { + E T2y, T2z, T2C, T2D; + T2y = T1S + T1Z; + T2z = T2p + T2q; + T2A = T2y - T2z; + T2G = T2y + T2z; + T2C = T2k + T2n; + T2D = T2e + T27; + T2E = T2C - T2D; + T2I = T2C + T2D; + } + { + E T2x, T2B, T2F, T2H; + T2x = W[16]; + T2B = W[17]; + cr[WS(rs, 9)] = FNMS(T2B, T2E, T2x * T2A); + ci[WS(rs, 9)] = FMA(T2x, T2E, T2B * T2A); + T2F = W[0]; + T2H = W[1]; + cr[WS(rs, 1)] = FNMS(T2H, T2I, T2F * T2G); + ci[WS(rs, 1)] = FMA(T2F, T2I, T2H * T2G); + } + } + { + E T1G, T1M, T1K, T1O; + { + E T1E, T1F, T1I, T1J; + T1E = T7 - Te; + T1F = T1A - T1z; + T1G = T1E - T1F; + T1M = T1E + T1F; + T1I = T1w - T1x; + T1J = Tm - Tt; + T1K = T1I - T1J; + T1O = T1J + T1I; + } + { + E T1D, T1H, T1L, T1N; + T1D = W[22]; + T1H = W[23]; + cr[WS(rs, 12)] = FNMS(T1H, T1K, T1D * T1G); + ci[WS(rs, 12)] = FMA(T1D, T1K, T1H * T1G); + T1L = W[6]; + T1N = W[7]; + cr[WS(rs, 4)] = FNMS(T1N, T1O, T1L * T1M); + ci[WS(rs, 4)] = FMA(T1L, T1O, T1N * T1M); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hb_16", twinstr, &GENUS, {136, 46, 38, 0} }; + +void X(codelet_hb_16) (planner *p) { + X(khc2hc_register) (p, hb_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_2.c new file mode 100644 index 000000000..6e193ad93 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_2.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -dif -name hb_2 -include rdft/scalar/hb.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_2(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs)) { + E T1, T2, T6, T3, T4, T9; + T1 = cr[0]; + T2 = ci[0]; + T6 = T1 - T2; + T3 = ci[WS(rs, 1)]; + T4 = cr[WS(rs, 1)]; + T9 = T3 + T4; + cr[0] = T1 + T2; + ci[0] = T3 - T4; + { + E T5, T7, T8, Ta; + T5 = W[0]; + T7 = T5 * T6; + T8 = W[1]; + Ta = T8 * T6; + cr[WS(rs, 1)] = FNMS(T8, T9, T7); + ci[WS(rs, 1)] = FMA(T5, T9, Ta); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 2, "hb_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hb_2) (planner *p) { + X(khc2hc_register) (p, hb_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -dif -name hb_2 -include rdft/scalar/hb.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_2(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs)) { + E T1, T2, T6, T3, T4, T8, T5, T7; + T1 = cr[0]; + T2 = ci[0]; + T6 = T1 - T2; + T3 = ci[WS(rs, 1)]; + T4 = cr[WS(rs, 1)]; + T8 = T3 + T4; + cr[0] = T1 + T2; + ci[0] = T3 - T4; + T5 = W[0]; + T7 = W[1]; + cr[WS(rs, 1)] = FNMS(T7, T8, T5 * T6); + ci[WS(rs, 1)] = FMA(T7, T6, T5 * T8); + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 2, "hb_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hb_2) (planner *p) { + X(khc2hc_register) (p, hb_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_20.c new file mode 100644 index 000000000..dd23f6e79 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_20.c @@ -0,0 +1,1064 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:36 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hb_20 -include rdft/scalar/hb.h */ + +/* + * This function contains 246 FP additions, 148 FP multiplications, + * (or, 136 additions, 38 multiplications, 110 fused multiply/add), + * 91 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 38, MAKE_VOLATILE_STRIDE(40, rs)) { + E T7, T4e, T4z, TE, T1t, T2W, T3z, T2l, T13, T3G, T3H, T1i, T2g, T4H, T4G; + E T2d, T1B, T4u, T4r, T1A, T2s, T3l, T2t, T3s, T2m, T2n, T2o, T1u, T1v, T1w; + E TC, T29, T3C, T3E, T4l, T4n, TL, TN, T3b, T3d, T4C, T4E; + { + E T3, T2U, T1s, T2V, T6, T3y, T1p, T3x; + { + E T1, T2, T1q, T1r; + T1 = cr[0]; + T2 = ci[WS(rs, 9)]; + T3 = T1 + T2; + T2U = T1 - T2; + T1q = ci[WS(rs, 14)]; + T1r = cr[WS(rs, 15)]; + T1s = T1q - T1r; + T2V = T1q + T1r; + } + { + E T4, T5, T1n, T1o; + T4 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 4)]; + T6 = T4 + T5; + T3y = T4 - T5; + T1n = ci[WS(rs, 19)]; + T1o = cr[WS(rs, 10)]; + T1p = T1n - T1o; + T3x = T1n + T1o; + } + T7 = T3 + T6; + T4e = T2U - T2V; + T4z = T3y + T3x; + TE = T3 - T6; + T1t = T1p - T1s; + T2W = T2U + T2V; + T3z = T3x - T3y; + T2l = T1p + T1s; + } + { + E Te, T4f, T4p, TF, T1a, T2Z, T3o, T2b, TA, T4j, T4t, TJ, T12, T39, T3k; + E T2f, Tl, T4g, T4q, TG, T1h, T32, T3r, T2c, Tt, T4i, T4s, TI, TV, T36; + E T3h, T2e; + { + E Ta, T2X, T19, T2Y, Td, T3n, T16, T3m; + { + E T8, T9, T17, T18; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + T2X = T8 - T9; + T17 = ci[WS(rs, 10)]; + T18 = cr[WS(rs, 19)]; + T19 = T17 - T18; + T2Y = T17 + T18; + } + { + E Tb, Tc, T14, T15; + Tb = cr[WS(rs, 9)]; + Tc = ci[0]; + Td = Tb + Tc; + T3n = Tb - Tc; + T14 = ci[WS(rs, 15)]; + T15 = cr[WS(rs, 14)]; + T16 = T14 - T15; + T3m = T14 + T15; + } + Te = Ta + Td; + T4f = T2X - T2Y; + T4p = T3n + T3m; + TF = Ta - Td; + T1a = T16 - T19; + T2Z = T2X + T2Y; + T3o = T3m - T3n; + T2b = T16 + T19; + } + { + E Tw, T37, Tz, T3i, TY, T3j, T11, T38; + { + E Tu, Tv, Tx, Ty; + Tu = ci[WS(rs, 7)]; + Tv = cr[WS(rs, 2)]; + Tw = Tu + Tv; + T37 = Tu - Tv; + Tx = ci[WS(rs, 2)]; + Ty = cr[WS(rs, 7)]; + Tz = Tx + Ty; + T3i = Tx - Ty; + } + { + E TW, TX, TZ, T10; + TW = ci[WS(rs, 17)]; + TX = cr[WS(rs, 12)]; + TY = TW - TX; + T3j = TW + TX; + TZ = ci[WS(rs, 12)]; + T10 = cr[WS(rs, 17)]; + T11 = TZ - T10; + T38 = TZ + T10; + } + TA = Tw + Tz; + T4j = T37 + T38; + T4t = T3i - T3j; + TJ = Tw - Tz; + T12 = TY - T11; + T39 = T37 - T38; + T3k = T3i + T3j; + T2f = TY + T11; + } + { + E Th, T30, T1g, T31, Tk, T3p, T1d, T3q; + { + E Tf, Tg, T1e, T1f; + Tf = ci[WS(rs, 3)]; + Tg = cr[WS(rs, 6)]; + Th = Tf + Tg; + T30 = Tf - Tg; + T1e = ci[WS(rs, 18)]; + T1f = cr[WS(rs, 11)]; + T1g = T1e - T1f; + T31 = T1e + T1f; + } + { + E Ti, Tj, T1b, T1c; + Ti = cr[WS(rs, 1)]; + Tj = ci[WS(rs, 8)]; + Tk = Ti + Tj; + T3p = Ti - Tj; + T1b = ci[WS(rs, 13)]; + T1c = cr[WS(rs, 16)]; + T1d = T1b - T1c; + T3q = T1b + T1c; + } + Tl = Th + Tk; + T4g = T30 - T31; + T4q = T3p - T3q; + TG = Th - Tk; + T1h = T1d - T1g; + T32 = T30 + T31; + T3r = T3p + T3q; + T2c = T1d + T1g; + } + { + E Tp, T34, TU, T35, Ts, T3g, TR, T3f; + { + E Tn, To, TS, TT; + Tn = cr[WS(rs, 8)]; + To = ci[WS(rs, 1)]; + Tp = Tn + To; + T34 = Tn - To; + TS = ci[WS(rs, 16)]; + TT = cr[WS(rs, 13)]; + TU = TS - TT; + T35 = TS + TT; + } + { + E Tq, Tr, TP, TQ; + Tq = ci[WS(rs, 6)]; + Tr = cr[WS(rs, 3)]; + Ts = Tq + Tr; + T3g = Tq - Tr; + TP = ci[WS(rs, 11)]; + TQ = cr[WS(rs, 18)]; + TR = TP - TQ; + T3f = TP + TQ; + } + Tt = Tp + Ts; + T4i = T34 + T35; + T4s = T3g + T3f; + TI = Tp - Ts; + TV = TR - TU; + T36 = T34 - T35; + T3h = T3f - T3g; + T2e = TR + TU; + } + T13 = TV - T12; + T3G = T36 - T39; + T3H = T2Z - T32; + T1i = T1a - T1h; + T2g = T2e - T2f; + T4H = T4i - T4j; + T4G = T4f - T4g; + T2d = T2b - T2c; + T1B = TF - TG; + T4u = T4s - T4t; + T4r = T4p - T4q; + T1A = TI - TJ; + T2s = Te - Tl; + T3l = T3h + T3k; + T2t = Tt - TA; + T3s = T3o + T3r; + T2m = T2b + T2c; + T2n = T2e + T2f; + T2o = T2m + T2n; + T1u = T1a + T1h; + T1v = TV + T12; + T1w = T1u + T1v; + { + E Tm, TB, TH, TK; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T29 = Tm - TB; + { + E T3A, T3B, T4h, T4k; + T3A = T3o - T3r; + T3B = T3h - T3k; + T3C = T3A + T3B; + T3E = T3A - T3B; + T4h = T4f + T4g; + T4k = T4i + T4j; + T4l = T4h + T4k; + T4n = T4h - T4k; + } + TH = TF + TG; + TK = TI + TJ; + TL = TH + TK; + TN = TH - TK; + { + E T33, T3a, T4A, T4B; + T33 = T2Z + T32; + T3a = T36 + T39; + T3b = T33 + T3a; + T3d = T33 - T3a; + T4A = T4p + T4q; + T4B = T4s + T4t; + T4C = T4A + T4B; + T4E = T4A - T4B; + } + } + } + cr[0] = T7 + TC; + ci[0] = T2l + T2o; + { + E T25, T21, T23, T24, T26, T22; + T25 = T1t + T1w; + T22 = TE + TL; + T21 = W[18]; + T23 = T21 * T22; + T24 = W[19]; + T26 = T24 * T22; + cr[WS(rs, 10)] = FNMS(T24, T25, T23); + ci[WS(rs, 10)] = FMA(T21, T25, T26); + } + { + E T58, T5b, T59, T5c, T57, T5a; + T58 = T4e + T4l; + T5b = T4z + T4C; + T57 = W[8]; + T59 = T57 * T58; + T5c = T57 * T5b; + T5a = W[9]; + cr[WS(rs, 5)] = FNMS(T5a, T5b, T59); + ci[WS(rs, 5)] = FMA(T5a, T58, T5c); + } + { + E T48, T4b, T49, T4c, T47, T4a; + T48 = T2W + T3b; + T4b = T3z + T3C; + T47 = W[28]; + T49 = T47 * T48; + T4c = T47 * T4b; + T4a = W[29]; + cr[WS(rs, 15)] = FNMS(T4a, T4b, T49); + ci[WS(rs, 15)] = FMA(T4a, T48, T4c); + } + { + E T3u, T42, T3M, T3U, T3J, T45, T3P, T3Z; + { + E T3t, T3T, T3e, T3S, T3c; + T3t = FNMS(KP618033988, T3s, T3l); + T3T = FMA(KP618033988, T3l, T3s); + T3c = FNMS(KP250000000, T3b, T2W); + T3e = FNMS(KP559016994, T3d, T3c); + T3S = FMA(KP559016994, T3d, T3c); + T3u = FNMS(KP951056516, T3t, T3e); + T42 = FMA(KP951056516, T3T, T3S); + T3M = FMA(KP951056516, T3t, T3e); + T3U = FNMS(KP951056516, T3T, T3S); + } + { + E T3I, T3Y, T3F, T3X, T3D; + T3I = FNMS(KP618033988, T3H, T3G); + T3Y = FMA(KP618033988, T3G, T3H); + T3D = FNMS(KP250000000, T3C, T3z); + T3F = FNMS(KP559016994, T3E, T3D); + T3X = FMA(KP559016994, T3E, T3D); + T3J = FMA(KP951056516, T3I, T3F); + T45 = FNMS(KP951056516, T3Y, T3X); + T3P = FNMS(KP951056516, T3I, T3F); + T3Z = FMA(KP951056516, T3Y, T3X); + } + { + E T3v, T3K, T2T, T3w; + T2T = W[4]; + T3v = T2T * T3u; + T3K = T2T * T3J; + T3w = W[5]; + cr[WS(rs, 3)] = FNMS(T3w, T3J, T3v); + ci[WS(rs, 3)] = FMA(T3w, T3u, T3K); + } + { + E T43, T46, T41, T44; + T41 = W[36]; + T43 = T41 * T42; + T46 = T41 * T45; + T44 = W[37]; + cr[WS(rs, 19)] = FNMS(T44, T45, T43); + ci[WS(rs, 19)] = FMA(T44, T42, T46); + } + { + E T3N, T3Q, T3L, T3O; + T3L = W[12]; + T3N = T3L * T3M; + T3Q = T3L * T3P; + T3O = W[13]; + cr[WS(rs, 7)] = FNMS(T3O, T3P, T3N); + ci[WS(rs, 7)] = FMA(T3O, T3M, T3Q); + } + { + E T3V, T40, T3R, T3W; + T3R = W[20]; + T3V = T3R * T3U; + T40 = T3R * T3Z; + T3W = W[21]; + cr[WS(rs, 11)] = FNMS(T3W, T3Z, T3V); + ci[WS(rs, 11)] = FMA(T3W, T3U, T40); + } + } + { + E T4w, T52, T4M, T4U, T4J, T55, T4P, T4Z; + { + E T4v, T4T, T4o, T4S, T4m; + T4v = FMA(KP618033988, T4u, T4r); + T4T = FNMS(KP618033988, T4r, T4u); + T4m = FNMS(KP250000000, T4l, T4e); + T4o = FMA(KP559016994, T4n, T4m); + T4S = FNMS(KP559016994, T4n, T4m); + T4w = FNMS(KP951056516, T4v, T4o); + T52 = FMA(KP951056516, T4T, T4S); + T4M = FMA(KP951056516, T4v, T4o); + T4U = FNMS(KP951056516, T4T, T4S); + } + { + E T4I, T4Y, T4F, T4X, T4D; + T4I = FMA(KP618033988, T4H, T4G); + T4Y = FNMS(KP618033988, T4G, T4H); + T4D = FNMS(KP250000000, T4C, T4z); + T4F = FMA(KP559016994, T4E, T4D); + T4X = FNMS(KP559016994, T4E, T4D); + T4J = FMA(KP951056516, T4I, T4F); + T55 = FNMS(KP951056516, T4Y, T4X); + T4P = FNMS(KP951056516, T4I, T4F); + T4Z = FMA(KP951056516, T4Y, T4X); + } + { + E T4x, T4K, T4d, T4y; + T4d = W[0]; + T4x = T4d * T4w; + T4K = T4d * T4J; + T4y = W[1]; + cr[WS(rs, 1)] = FNMS(T4y, T4J, T4x); + ci[WS(rs, 1)] = FMA(T4y, T4w, T4K); + } + { + E T53, T56, T51, T54; + T51 = W[32]; + T53 = T51 * T52; + T56 = T51 * T55; + T54 = W[33]; + cr[WS(rs, 17)] = FNMS(T54, T55, T53); + ci[WS(rs, 17)] = FMA(T54, T52, T56); + } + { + E T4N, T4Q, T4L, T4O; + T4L = W[16]; + T4N = T4L * T4M; + T4Q = T4L * T4P; + T4O = W[17]; + cr[WS(rs, 9)] = FNMS(T4O, T4P, T4N); + ci[WS(rs, 9)] = FMA(T4O, T4M, T4Q); + } + { + E T4V, T50, T4R, T4W; + T4R = W[24]; + T4V = T4R * T4U; + T50 = T4R * T4Z; + T4W = W[25]; + cr[WS(rs, 13)] = FNMS(T4W, T4Z, T4V); + ci[WS(rs, 13)] = FMA(T4W, T4U, T50); + } + } + { + E T2u, T2K, T2r, T2J, T2i, T2O, T2y, T2G, T2p, T2q; + T2u = FMA(KP618033988, T2t, T2s); + T2K = FNMS(KP618033988, T2s, T2t); + T2p = FNMS(KP250000000, T2o, T2l); + T2q = T2m - T2n; + T2r = FMA(KP559016994, T2q, T2p); + T2J = FNMS(KP559016994, T2q, T2p); + { + E T2h, T2F, T2a, T2E, T28; + T2h = FMA(KP618033988, T2g, T2d); + T2F = FNMS(KP618033988, T2d, T2g); + T28 = FNMS(KP250000000, TC, T7); + T2a = FMA(KP559016994, T29, T28); + T2E = FNMS(KP559016994, T29, T28); + T2i = FMA(KP951056516, T2h, T2a); + T2O = FMA(KP951056516, T2F, T2E); + T2y = FNMS(KP951056516, T2h, T2a); + T2G = FNMS(KP951056516, T2F, T2E); + } + { + E T2v, T2k, T2w, T27, T2j; + T2v = FNMS(KP951056516, T2u, T2r); + T2k = W[7]; + T2w = T2k * T2i; + T27 = W[6]; + T2j = T27 * T2i; + cr[WS(rs, 4)] = FNMS(T2k, T2v, T2j); + ci[WS(rs, 4)] = FMA(T27, T2v, T2w); + } + { + E T2R, T2Q, T2S, T2N, T2P; + T2R = FNMS(KP951056516, T2K, T2J); + T2Q = W[23]; + T2S = T2Q * T2O; + T2N = W[22]; + T2P = T2N * T2O; + cr[WS(rs, 12)] = FNMS(T2Q, T2R, T2P); + ci[WS(rs, 12)] = FMA(T2N, T2R, T2S); + } + { + E T2B, T2A, T2C, T2x, T2z; + T2B = FMA(KP951056516, T2u, T2r); + T2A = W[31]; + T2C = T2A * T2y; + T2x = W[30]; + T2z = T2x * T2y; + cr[WS(rs, 16)] = FNMS(T2A, T2B, T2z); + ci[WS(rs, 16)] = FMA(T2x, T2B, T2C); + } + { + E T2L, T2I, T2M, T2D, T2H; + T2L = FMA(KP951056516, T2K, T2J); + T2I = W[15]; + T2M = T2I * T2G; + T2D = W[14]; + T2H = T2D * T2G; + cr[WS(rs, 8)] = FNMS(T2I, T2L, T2H); + ci[WS(rs, 8)] = FMA(T2D, T2L, T2M); + } + } + { + E T1C, T1S, T1z, T1R, T1k, T1W, T1G, T1O, T1x, T1y; + T1C = FNMS(KP618033988, T1B, T1A); + T1S = FMA(KP618033988, T1A, T1B); + T1x = FNMS(KP250000000, T1w, T1t); + T1y = T1u - T1v; + T1z = FNMS(KP559016994, T1y, T1x); + T1R = FMA(KP559016994, T1y, T1x); + { + E T1j, T1N, TO, T1M, TM; + T1j = FNMS(KP618033988, T1i, T13); + T1N = FMA(KP618033988, T13, T1i); + TM = FNMS(KP250000000, TL, TE); + TO = FNMS(KP559016994, TN, TM); + T1M = FMA(KP559016994, TN, TM); + T1k = FMA(KP951056516, T1j, TO); + T1W = FMA(KP951056516, T1N, T1M); + T1G = FNMS(KP951056516, T1j, TO); + T1O = FNMS(KP951056516, T1N, T1M); + } + { + E T1D, T1m, T1E, TD, T1l; + T1D = FNMS(KP951056516, T1C, T1z); + T1m = W[3]; + T1E = T1m * T1k; + TD = W[2]; + T1l = TD * T1k; + cr[WS(rs, 2)] = FNMS(T1m, T1D, T1l); + ci[WS(rs, 2)] = FMA(TD, T1D, T1E); + } + { + E T1Z, T1Y, T20, T1V, T1X; + T1Z = FNMS(KP951056516, T1S, T1R); + T1Y = W[27]; + T20 = T1Y * T1W; + T1V = W[26]; + T1X = T1V * T1W; + cr[WS(rs, 14)] = FNMS(T1Y, T1Z, T1X); + ci[WS(rs, 14)] = FMA(T1V, T1Z, T20); + } + { + E T1J, T1I, T1K, T1F, T1H; + T1J = FMA(KP951056516, T1C, T1z); + T1I = W[35]; + T1K = T1I * T1G; + T1F = W[34]; + T1H = T1F * T1G; + cr[WS(rs, 18)] = FNMS(T1I, T1J, T1H); + ci[WS(rs, 18)] = FMA(T1F, T1J, T1K); + } + { + E T1T, T1Q, T1U, T1L, T1P; + T1T = FMA(KP951056516, T1S, T1R); + T1Q = W[11]; + T1U = T1Q * T1O; + T1L = W[10]; + T1P = T1L * T1O; + cr[WS(rs, 6)] = FNMS(T1Q, T1T, T1P); + ci[WS(rs, 6)] = FMA(T1L, T1T, T1U); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hb_20", twinstr, &GENUS, {136, 38, 110, 0} }; + +void X(codelet_hb_20) (planner *p) { + X(khc2hc_register) (p, hb_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hb_20 -include rdft/scalar/hb.h */ + +/* + * This function contains 246 FP additions, 124 FP multiplications, + * (or, 184 additions, 62 multiplications, 62 fused multiply/add), + * 97 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 38, MAKE_VOLATILE_STRIDE(40, rs)) { + E T7, T3T, T49, TE, T1v, T2T, T3g, T2d, T13, T3n, T3o, T1i, T26, T4e, T4d; + E T23, T1n, T42, T3Z, T1m, T2h, T2I, T2i, T2P, T30, T37, T38, Tm, TB, TC; + E T46, T47, T4a, T2a, T2b, T2e, T1w, T1x, T1y, T3O, T3R, T3U, T3h, T3i, T3j; + E TH, TK, TL; + { + E T3, T2R, T1u, T2S, T6, T3f, T1r, T3e; + { + E T1, T2, T1s, T1t; + T1 = cr[0]; + T2 = ci[WS(rs, 9)]; + T3 = T1 + T2; + T2R = T1 - T2; + T1s = ci[WS(rs, 14)]; + T1t = cr[WS(rs, 15)]; + T1u = T1s - T1t; + T2S = T1s + T1t; + } + { + E T4, T5, T1p, T1q; + T4 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 4)]; + T6 = T4 + T5; + T3f = T4 - T5; + T1p = ci[WS(rs, 19)]; + T1q = cr[WS(rs, 10)]; + T1r = T1p - T1q; + T3e = T1p + T1q; + } + T7 = T3 + T6; + T3T = T2R - T2S; + T49 = T3f + T3e; + TE = T3 - T6; + T1v = T1r - T1u; + T2T = T2R + T2S; + T3g = T3e - T3f; + T2d = T1r + T1u; + } + { + E Te, T3M, T3X, TF, TV, T2E, T2W, T21, TA, T3Q, T41, TJ, T1h, T2O, T36; + E T25, Tl, T3N, T3Y, TG, T12, T2H, T2Z, T22, Tt, T3P, T40, TI, T1a, T2L; + E T33, T24; + { + E Ta, T2U, TU, T2V, Td, T2D, TR, T2C; + { + E T8, T9, TS, TT; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 5)]; + Ta = T8 + T9; + T2U = T8 - T9; + TS = ci[WS(rs, 10)]; + TT = cr[WS(rs, 19)]; + TU = TS - TT; + T2V = TS + TT; + } + { + E Tb, Tc, TP, TQ; + Tb = cr[WS(rs, 9)]; + Tc = ci[0]; + Td = Tb + Tc; + T2D = Tb - Tc; + TP = ci[WS(rs, 15)]; + TQ = cr[WS(rs, 14)]; + TR = TP - TQ; + T2C = TP + TQ; + } + Te = Ta + Td; + T3M = T2U - T2V; + T3X = T2D + T2C; + TF = Ta - Td; + TV = TR - TU; + T2E = T2C - T2D; + T2W = T2U + T2V; + T21 = TR + TU; + } + { + E Tw, T34, Tz, T2M, T1d, T2N, T1g, T35; + { + E Tu, Tv, Tx, Ty; + Tu = ci[WS(rs, 7)]; + Tv = cr[WS(rs, 2)]; + Tw = Tu + Tv; + T34 = Tu - Tv; + Tx = ci[WS(rs, 2)]; + Ty = cr[WS(rs, 7)]; + Tz = Tx + Ty; + T2M = Tx - Ty; + } + { + E T1b, T1c, T1e, T1f; + T1b = ci[WS(rs, 17)]; + T1c = cr[WS(rs, 12)]; + T1d = T1b - T1c; + T2N = T1b + T1c; + T1e = ci[WS(rs, 12)]; + T1f = cr[WS(rs, 17)]; + T1g = T1e - T1f; + T35 = T1e + T1f; + } + TA = Tw + Tz; + T3Q = T34 + T35; + T41 = T2M - T2N; + TJ = Tw - Tz; + T1h = T1d - T1g; + T2O = T2M + T2N; + T36 = T34 - T35; + T25 = T1d + T1g; + } + { + E Th, T2X, T11, T2Y, Tk, T2F, TY, T2G; + { + E Tf, Tg, TZ, T10; + Tf = ci[WS(rs, 3)]; + Tg = cr[WS(rs, 6)]; + Th = Tf + Tg; + T2X = Tf - Tg; + TZ = ci[WS(rs, 18)]; + T10 = cr[WS(rs, 11)]; + T11 = TZ - T10; + T2Y = TZ + T10; + } + { + E Ti, Tj, TW, TX; + Ti = cr[WS(rs, 1)]; + Tj = ci[WS(rs, 8)]; + Tk = Ti + Tj; + T2F = Ti - Tj; + TW = ci[WS(rs, 13)]; + TX = cr[WS(rs, 16)]; + TY = TW - TX; + T2G = TW + TX; + } + Tl = Th + Tk; + T3N = T2X - T2Y; + T3Y = T2F - T2G; + TG = Th - Tk; + T12 = TY - T11; + T2H = T2F + T2G; + T2Z = T2X + T2Y; + T22 = TY + T11; + } + { + E Tp, T31, T19, T32, Ts, T2K, T16, T2J; + { + E Tn, To, T17, T18; + Tn = cr[WS(rs, 8)]; + To = ci[WS(rs, 1)]; + Tp = Tn + To; + T31 = Tn - To; + T17 = ci[WS(rs, 16)]; + T18 = cr[WS(rs, 13)]; + T19 = T17 - T18; + T32 = T17 + T18; + } + { + E Tq, Tr, T14, T15; + Tq = ci[WS(rs, 6)]; + Tr = cr[WS(rs, 3)]; + Ts = Tq + Tr; + T2K = Tq - Tr; + T14 = ci[WS(rs, 11)]; + T15 = cr[WS(rs, 18)]; + T16 = T14 - T15; + T2J = T14 + T15; + } + Tt = Tp + Ts; + T3P = T31 + T32; + T40 = T2K + T2J; + TI = Tp - Ts; + T1a = T16 - T19; + T2L = T2J - T2K; + T33 = T31 - T32; + T24 = T16 + T19; + } + T13 = TV - T12; + T3n = T2W - T2Z; + T3o = T33 - T36; + T1i = T1a - T1h; + T26 = T24 - T25; + T4e = T3P - T3Q; + T4d = T3M - T3N; + T23 = T21 - T22; + T1n = TI - TJ; + T42 = T40 - T41; + T3Z = T3X - T3Y; + T1m = TF - TG; + T2h = Te - Tl; + T2I = T2E + T2H; + T2i = Tt - TA; + T2P = T2L + T2O; + T30 = T2W + T2Z; + T37 = T33 + T36; + T38 = T30 + T37; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T46 = T3X + T3Y; + T47 = T40 + T41; + T4a = T46 + T47; + T2a = T21 + T22; + T2b = T24 + T25; + T2e = T2a + T2b; + T1w = TV + T12; + T1x = T1a + T1h; + T1y = T1w + T1x; + T3O = T3M + T3N; + T3R = T3P + T3Q; + T3U = T3O + T3R; + T3h = T2E - T2H; + T3i = T2L - T2O; + T3j = T3h + T3i; + TH = TF + TG; + TK = TI + TJ; + TL = TH + TK; + } + cr[0] = T7 + TC; + ci[0] = T2d + T2e; + { + E T1U, T1W, T1T, T1V; + T1U = TE + TL; + T1W = T1v + T1y; + T1T = W[18]; + T1V = W[19]; + cr[WS(rs, 10)] = FNMS(T1V, T1W, T1T * T1U); + ci[WS(rs, 10)] = FMA(T1V, T1U, T1T * T1W); + } + { + E T4y, T4A, T4x, T4z; + T4y = T3T + T3U; + T4A = T49 + T4a; + T4x = W[8]; + T4z = W[9]; + cr[WS(rs, 5)] = FNMS(T4z, T4A, T4x * T4y); + ci[WS(rs, 5)] = FMA(T4x, T4A, T4z * T4y); + } + { + E T3I, T3K, T3H, T3J; + T3I = T2T + T38; + T3K = T3g + T3j; + T3H = W[28]; + T3J = W[29]; + cr[WS(rs, 15)] = FNMS(T3J, T3K, T3H * T3I); + ci[WS(rs, 15)] = FMA(T3H, T3K, T3J * T3I); + } + { + E T27, T2j, T2v, T2r, T2g, T2u, T20, T2q; + T27 = FMA(KP951056516, T23, KP587785252 * T26); + T2j = FMA(KP951056516, T2h, KP587785252 * T2i); + T2v = FNMS(KP951056516, T2i, KP587785252 * T2h); + T2r = FNMS(KP951056516, T26, KP587785252 * T23); + { + E T2c, T2f, T1Y, T1Z; + T2c = KP559016994 * (T2a - T2b); + T2f = FNMS(KP250000000, T2e, T2d); + T2g = T2c + T2f; + T2u = T2f - T2c; + T1Y = KP559016994 * (Tm - TB); + T1Z = FNMS(KP250000000, TC, T7); + T20 = T1Y + T1Z; + T2q = T1Z - T1Y; + } + { + E T28, T2k, T1X, T29; + T28 = T20 + T27; + T2k = T2g - T2j; + T1X = W[6]; + T29 = W[7]; + cr[WS(rs, 4)] = FNMS(T29, T2k, T1X * T28); + ci[WS(rs, 4)] = FMA(T29, T28, T1X * T2k); + } + { + E T2y, T2A, T2x, T2z; + T2y = T2q - T2r; + T2A = T2v + T2u; + T2x = W[22]; + T2z = W[23]; + cr[WS(rs, 12)] = FNMS(T2z, T2A, T2x * T2y); + ci[WS(rs, 12)] = FMA(T2z, T2y, T2x * T2A); + } + { + E T2m, T2o, T2l, T2n; + T2m = T20 - T27; + T2o = T2j + T2g; + T2l = W[30]; + T2n = W[31]; + cr[WS(rs, 16)] = FNMS(T2n, T2o, T2l * T2m); + ci[WS(rs, 16)] = FMA(T2n, T2m, T2l * T2o); + } + { + E T2s, T2w, T2p, T2t; + T2s = T2q + T2r; + T2w = T2u - T2v; + T2p = W[14]; + T2t = W[15]; + cr[WS(rs, 8)] = FNMS(T2t, T2w, T2p * T2s); + ci[WS(rs, 8)] = FMA(T2t, T2s, T2p * T2w); + } + } + { + E T43, T4f, T4r, T4m, T4c, T4q, T3W, T4n; + T43 = FMA(KP951056516, T3Z, KP587785252 * T42); + T4f = FMA(KP951056516, T4d, KP587785252 * T4e); + T4r = FNMS(KP951056516, T4e, KP587785252 * T4d); + T4m = FNMS(KP951056516, T42, KP587785252 * T3Z); + { + E T48, T4b, T3S, T3V; + T48 = KP559016994 * (T46 - T47); + T4b = FNMS(KP250000000, T4a, T49); + T4c = T48 + T4b; + T4q = T4b - T48; + T3S = KP559016994 * (T3O - T3R); + T3V = FNMS(KP250000000, T3U, T3T); + T3W = T3S + T3V; + T4n = T3V - T3S; + } + { + E T44, T4g, T3L, T45; + T44 = T3W - T43; + T4g = T4c + T4f; + T3L = W[0]; + T45 = W[1]; + cr[WS(rs, 1)] = FNMS(T45, T4g, T3L * T44); + ci[WS(rs, 1)] = FMA(T3L, T4g, T45 * T44); + } + { + E T4u, T4w, T4t, T4v; + T4u = T4n - T4m; + T4w = T4q + T4r; + T4t = W[32]; + T4v = W[33]; + cr[WS(rs, 17)] = FNMS(T4v, T4w, T4t * T4u); + ci[WS(rs, 17)] = FMA(T4t, T4w, T4v * T4u); + } + { + E T4i, T4k, T4h, T4j; + T4i = T43 + T3W; + T4k = T4c - T4f; + T4h = W[16]; + T4j = W[17]; + cr[WS(rs, 9)] = FNMS(T4j, T4k, T4h * T4i); + ci[WS(rs, 9)] = FMA(T4h, T4k, T4j * T4i); + } + { + E T4o, T4s, T4l, T4p; + T4o = T4m + T4n; + T4s = T4q - T4r; + T4l = W[24]; + T4p = W[25]; + cr[WS(rs, 13)] = FNMS(T4p, T4s, T4l * T4o); + ci[WS(rs, 13)] = FMA(T4l, T4s, T4p * T4o); + } + } + { + E T1j, T1o, T1M, T1J, T1B, T1N, TO, T1I; + T1j = FNMS(KP951056516, T1i, KP587785252 * T13); + T1o = FNMS(KP951056516, T1n, KP587785252 * T1m); + T1M = FMA(KP951056516, T1m, KP587785252 * T1n); + T1J = FMA(KP951056516, T13, KP587785252 * T1i); + { + E T1z, T1A, TM, TN; + T1z = FNMS(KP250000000, T1y, T1v); + T1A = KP559016994 * (T1w - T1x); + T1B = T1z - T1A; + T1N = T1A + T1z; + TM = FNMS(KP250000000, TL, TE); + TN = KP559016994 * (TH - TK); + TO = TM - TN; + T1I = TN + TM; + } + { + E T1k, T1C, TD, T1l; + T1k = TO - T1j; + T1C = T1o + T1B; + TD = W[2]; + T1l = W[3]; + cr[WS(rs, 2)] = FNMS(T1l, T1C, TD * T1k); + ci[WS(rs, 2)] = FMA(T1l, T1k, TD * T1C); + } + { + E T1Q, T1S, T1P, T1R; + T1Q = T1I + T1J; + T1S = T1N - T1M; + T1P = W[26]; + T1R = W[27]; + cr[WS(rs, 14)] = FNMS(T1R, T1S, T1P * T1Q); + ci[WS(rs, 14)] = FMA(T1R, T1Q, T1P * T1S); + } + { + E T1E, T1G, T1D, T1F; + T1E = TO + T1j; + T1G = T1B - T1o; + T1D = W[34]; + T1F = W[35]; + cr[WS(rs, 18)] = FNMS(T1F, T1G, T1D * T1E); + ci[WS(rs, 18)] = FMA(T1F, T1E, T1D * T1G); + } + { + E T1K, T1O, T1H, T1L; + T1K = T1I - T1J; + T1O = T1M + T1N; + T1H = W[10]; + T1L = W[11]; + cr[WS(rs, 6)] = FNMS(T1L, T1O, T1H * T1K); + ci[WS(rs, 6)] = FMA(T1L, T1K, T1H * T1O); + } + } + { + E T2Q, T3p, T3B, T3x, T3m, T3A, T3b, T3w; + T2Q = FNMS(KP951056516, T2P, KP587785252 * T2I); + T3p = FNMS(KP951056516, T3o, KP587785252 * T3n); + T3B = FMA(KP951056516, T3n, KP587785252 * T3o); + T3x = FMA(KP951056516, T2I, KP587785252 * T2P); + { + E T3k, T3l, T39, T3a; + T3k = FNMS(KP250000000, T3j, T3g); + T3l = KP559016994 * (T3h - T3i); + T3m = T3k - T3l; + T3A = T3l + T3k; + T39 = FNMS(KP250000000, T38, T2T); + T3a = KP559016994 * (T30 - T37); + T3b = T39 - T3a; + T3w = T3a + T39; + } + { + E T3c, T3q, T2B, T3d; + T3c = T2Q + T3b; + T3q = T3m - T3p; + T2B = W[4]; + T3d = W[5]; + cr[WS(rs, 3)] = FNMS(T3d, T3q, T2B * T3c); + ci[WS(rs, 3)] = FMA(T2B, T3q, T3d * T3c); + } + { + E T3E, T3G, T3D, T3F; + T3E = T3x + T3w; + T3G = T3A - T3B; + T3D = W[36]; + T3F = W[37]; + cr[WS(rs, 19)] = FNMS(T3F, T3G, T3D * T3E); + ci[WS(rs, 19)] = FMA(T3D, T3G, T3F * T3E); + } + { + E T3s, T3u, T3r, T3t; + T3s = T3b - T2Q; + T3u = T3m + T3p; + T3r = W[12]; + T3t = W[13]; + cr[WS(rs, 7)] = FNMS(T3t, T3u, T3r * T3s); + ci[WS(rs, 7)] = FMA(T3r, T3u, T3t * T3s); + } + { + E T3y, T3C, T3v, T3z; + T3y = T3w - T3x; + T3C = T3A + T3B; + T3v = W[20]; + T3z = W[21]; + cr[WS(rs, 11)] = FNMS(T3z, T3C, T3v * T3y); + ci[WS(rs, 11)] = FMA(T3v, T3C, T3z * T3y); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hb_20", twinstr, &GENUS, {184, 62, 62, 0} }; + +void X(codelet_hb_20) (planner *p) { + X(khc2hc_register) (p, hb_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_25.c new file mode 100644 index 000000000..14459889b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_25.c @@ -0,0 +1,1609 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:37 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 25 -dif -name hb_25 -include rdft/scalar/hb.h */ + +/* + * This function contains 400 FP additions, 364 FP multiplications, + * (or, 84 additions, 48 multiplications, 316 fused multiply/add), + * 158 stack variables, 47 constants, and 100 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 48); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 48, MAKE_VOLATILE_STRIDE(50, rs)) { + E T9, T3E, T1F, T6e, T6d, T3B, T6f, T2k, T6U, T4k, T5u, T19, T1G, T1s, T1H; + E Ti, Tr, Ts, TB, TK, TL, TM, T5X, T7i, T64, T77, T2z, T4D, T3p, T4u; + E T5Q, T7h, T63, T74, T2O, T4E, T3q, T4x, T3j, T4G, T3t, T4n, T5B, T7f, T66; + E T70, T34, T4H, T3s, T4q, T5I, T7e, T67, T6X; + { + E T1, T1x, T8, T3D, T2f, T3C, T1E, T3A, T2h, T2i, T3z; + T1 = cr[0]; + T1x = ci[WS(rs, 24)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = cr[WS(rs, 5)]; + T3 = ci[WS(rs, 4)]; + T4 = T2 + T3; + T5 = cr[WS(rs, 10)]; + T6 = ci[WS(rs, 9)]; + T7 = T5 + T6; + T8 = T4 + T7; + T3D = T5 - T6; + T2f = T4 - T7; + T3C = T2 - T3; + } + { + E T1y, T1z, T1A, T1B, T1C, T1D; + T1y = ci[WS(rs, 19)]; + T1z = cr[WS(rs, 20)]; + T1A = T1y - T1z; + T1B = ci[WS(rs, 14)]; + T1C = cr[WS(rs, 15)]; + T1D = T1B - T1C; + T1E = T1A + T1D; + T3A = T1A - T1D; + T2h = T1y + T1z; + T2i = T1B + T1C; + } + T9 = T1 + T8; + T3E = FMA(KP618033988, T3D, T3C); + T1F = T1x + T1E; + T6e = FNMS(KP618033988, T3C, T3D); + T3z = FNMS(KP250000000, T1E, T1x); + T6d = FNMS(KP559016994, T3A, T3z); + T3B = FMA(KP559016994, T3A, T3z); + T6f = FNMS(KP951056516, T6e, T6d); + { + E T2j, T5t, T2g, T5s, T2e; + T2j = FMA(KP618033988, T2i, T2h); + T5t = FNMS(KP618033988, T2h, T2i); + T2e = FNMS(KP250000000, T8, T1); + T2g = FMA(KP559016994, T2f, T2e); + T5s = FNMS(KP559016994, T2f, T2e); + T2k = FNMS(KP951056516, T2j, T2g); + T6U = FNMS(KP951056516, T5t, T5s); + T4k = FMA(KP951056516, T2j, T2g); + T5u = FMA(KP951056516, T5t, T5s); + } + } + { + E Ta, T2m, T5V, T2x, Th, T2l, TC, T36, T5w, T3h, TJ, T35, Tj, T2F, T5L; + E T2I, Tq, T2H, T1j, T3a, T5z, T3d, T1q, T3c, TR, T2q, T5S, T2t, TY, T2s; + E T10, T2B, T5O, T2M, T17, T2A, T1a, T2V, T5G, T2Y, T1h, T2X, Tt, T2R, T5D; + E T32, TA, T2Q; + { + E Tg, T2w, Td, T2v; + Ta = cr[WS(rs, 1)]; + { + E Te, Tf, Tb, Tc; + Te = cr[WS(rs, 11)]; + Tf = ci[WS(rs, 8)]; + Tg = Te + Tf; + T2w = Tf - Te; + Tb = cr[WS(rs, 6)]; + Tc = ci[WS(rs, 3)]; + Td = Tb + Tc; + T2v = Tb - Tc; + } + T2m = Td - Tg; + T5V = FMA(KP618033988, T2v, T2w); + T2x = FNMS(KP618033988, T2w, T2v); + Th = Td + Tg; + T2l = FNMS(KP250000000, Th, Ta); + } + { + E TI, T3g, TF, T3f; + TC = cr[WS(rs, 3)]; + { + E TG, TH, TD, TE; + TG = ci[WS(rs, 11)]; + TH = ci[WS(rs, 6)]; + TI = TG + TH; + T3g = TG - TH; + TD = cr[WS(rs, 8)]; + TE = ci[WS(rs, 1)]; + TF = TD + TE; + T3f = TD - TE; + } + T36 = TI - TF; + T5w = FNMS(KP618033988, T3f, T3g); + T3h = FMA(KP618033988, T3g, T3f); + TJ = TF + TI; + T35 = FNMS(KP250000000, TJ, TC); + } + { + E Tp, T2E, Tm, T2D; + Tj = cr[WS(rs, 4)]; + { + E Tn, To, Tk, Tl; + Tn = ci[WS(rs, 10)]; + To = ci[WS(rs, 5)]; + Tp = Tn + To; + T2E = To - Tn; + Tk = cr[WS(rs, 9)]; + Tl = ci[0]; + Tm = Tk + Tl; + T2D = Tl - Tk; + } + T2F = FMA(KP618033988, T2E, T2D); + T5L = FNMS(KP618033988, T2D, T2E); + T2I = Tm - Tp; + Tq = Tm + Tp; + T2H = FMS(KP250000000, Tq, Tj); + } + { + E T1p, T39, T1m, T38; + T1j = ci[WS(rs, 21)]; + { + E T1n, T1o, T1k, T1l; + T1n = cr[WS(rs, 13)]; + T1o = cr[WS(rs, 18)]; + T1p = T1n + T1o; + T39 = T1o - T1n; + T1k = ci[WS(rs, 16)]; + T1l = cr[WS(rs, 23)]; + T1m = T1k - T1l; + T38 = T1k + T1l; + } + T3a = FMA(KP618033988, T39, T38); + T5z = FNMS(KP618033988, T38, T39); + T3d = T1m + T1p; + T1q = T1m - T1p; + T3c = FMS(KP250000000, T1q, T1j); + } + { + E TX, T2p, TU, T2o; + TR = ci[WS(rs, 23)]; + { + E TV, TW, TS, TT; + TV = ci[WS(rs, 13)]; + TW = cr[WS(rs, 16)]; + TX = TV - TW; + T2p = TV + TW; + TS = ci[WS(rs, 18)]; + TT = cr[WS(rs, 21)]; + TU = TS - TT; + T2o = TS + TT; + } + T2q = FMA(KP618033988, T2p, T2o); + T5S = FNMS(KP618033988, T2o, T2p); + T2t = TU - TX; + TY = TU + TX; + T2s = FNMS(KP250000000, TY, TR); + } + { + E T16, T2L, T13, T2K; + T10 = ci[WS(rs, 20)]; + { + E T14, T15, T11, T12; + T14 = cr[WS(rs, 14)]; + T15 = cr[WS(rs, 19)]; + T16 = T14 + T15; + T2L = T15 - T14; + T11 = ci[WS(rs, 15)]; + T12 = cr[WS(rs, 24)]; + T13 = T11 - T12; + T2K = T11 + T12; + } + T2B = T13 + T16; + T5O = FNMS(KP618033988, T2K, T2L); + T2M = FMA(KP618033988, T2L, T2K); + T17 = T13 - T16; + T2A = FMS(KP250000000, T17, T10); + } + { + E T1d, T2T, T1g, T2U; + T1a = ci[WS(rs, 22)]; + { + E T1b, T1c, T1e, T1f; + T1b = ci[WS(rs, 17)]; + T1c = cr[WS(rs, 22)]; + T1d = T1b - T1c; + T2T = T1b + T1c; + T1e = ci[WS(rs, 12)]; + T1f = cr[WS(rs, 17)]; + T1g = T1e - T1f; + T2U = T1e + T1f; + } + T2V = FMA(KP618033988, T2U, T2T); + T5G = FNMS(KP618033988, T2T, T2U); + T2Y = T1d - T1g; + T1h = T1d + T1g; + T2X = FMS(KP250000000, T1h, T1a); + } + { + E Tw, T30, Tz, T31; + Tt = cr[WS(rs, 2)]; + { + E Tu, Tv, Tx, Ty; + Tu = cr[WS(rs, 7)]; + Tv = ci[WS(rs, 2)]; + Tw = Tu + Tv; + T30 = Tu - Tv; + Tx = cr[WS(rs, 12)]; + Ty = ci[WS(rs, 7)]; + Tz = Tx + Ty; + T31 = Ty - Tx; + } + T2R = Tz - Tw; + T5D = FMA(KP618033988, T30, T31); + T32 = FNMS(KP618033988, T31, T30); + TA = Tw + Tz; + T2Q = FNMS(KP250000000, TA, Tt); + } + { + E TZ, T18, T1i, T1r; + TZ = TR + TY; + T18 = T10 + T17; + T19 = TZ - T18; + T1G = TZ + T18; + T1i = T1a + T1h; + T1r = T1j + T1q; + T1s = T1i - T1r; + T1H = T1i + T1r; + } + Ti = Ta + Th; + Tr = Tj + Tq; + Ts = Ti + Tr; + TB = Tt + TA; + TK = TC + TJ; + TL = TB + TK; + TM = Ts + TL; + { + E T5T, T75, T5W, T76, T5R, T5U; + T5R = FNMS(KP559016994, T2m, T2l); + T5T = FMA(KP951056516, T5S, T5R); + T75 = FNMS(KP951056516, T5S, T5R); + T5U = FNMS(KP559016994, T2t, T2s); + T5W = FMA(KP951056516, T5V, T5U); + T76 = FNMS(KP951056516, T5V, T5U); + T5X = FNMS(KP549754652, T5W, T5T); + T7i = FMA(KP939062505, T75, T76); + T64 = FMA(KP549754652, T5T, T5W); + T77 = FNMS(KP939062505, T76, T75); + } + { + E T2r, T4t, T2y, T4s, T2n, T2u; + T2n = FMA(KP559016994, T2m, T2l); + T2r = FNMS(KP951056516, T2q, T2n); + T4t = FMA(KP951056516, T2q, T2n); + T2u = FMA(KP559016994, T2t, T2s); + T2y = FMA(KP951056516, T2x, T2u); + T4s = FNMS(KP951056516, T2x, T2u); + T2z = FNMS(KP256756360, T2y, T2r); + T4D = FMA(KP634619297, T4s, T4t); + T3p = FMA(KP256756360, T2r, T2y); + T4u = FNMS(KP634619297, T4t, T4s); + } + { + E T5M, T73, T5P, T72, T5K, T5N; + T5K = FMA(KP559016994, T2B, T2A); + T5M = FNMS(KP951056516, T5L, T5K); + T73 = FMA(KP951056516, T5L, T5K); + T5N = FMA(KP559016994, T2I, T2H); + T5P = FNMS(KP951056516, T5O, T5N); + T72 = FMA(KP951056516, T5O, T5N); + T5Q = FMA(KP470564281, T5P, T5M); + T7h = FNMS(KP126329378, T72, T73); + T63 = FNMS(KP470564281, T5M, T5P); + T74 = FMA(KP126329378, T73, T72); + } + { + E T2G, T4v, T2N, T4w, T2C, T2J; + T2C = FNMS(KP559016994, T2B, T2A); + T2G = FMA(KP951056516, T2F, T2C); + T4v = FNMS(KP951056516, T2F, T2C); + T2J = FNMS(KP559016994, T2I, T2H); + T2N = FMA(KP951056516, T2M, T2J); + T4w = FNMS(KP951056516, T2M, T2J); + T2O = FNMS(KP634619297, T2N, T2G); + T4E = FMA(KP827271945, T4v, T4w); + T3q = FMA(KP634619297, T2G, T2N); + T4x = FNMS(KP827271945, T4w, T4v); + } + { + E T3b, T4l, T3i, T4m, T37, T3e; + T37 = FNMS(KP559016994, T36, T35); + T3b = FNMS(KP951056516, T3a, T37); + T4l = FMA(KP951056516, T3a, T37); + T3e = FNMS(KP559016994, T3d, T3c); + T3i = FNMS(KP951056516, T3h, T3e); + T4m = FMA(KP951056516, T3h, T3e); + T3j = FMA(KP939062505, T3i, T3b); + T4G = FMA(KP126329378, T4l, T4m); + T3t = FNMS(KP939062505, T3b, T3i); + T4n = FNMS(KP126329378, T4m, T4l); + } + { + E T5x, T6Y, T5A, T6Z, T5v, T5y; + T5v = FMA(KP559016994, T3d, T3c); + T5x = FMA(KP951056516, T5w, T5v); + T6Y = FNMS(KP951056516, T5w, T5v); + T5y = FMA(KP559016994, T36, T35); + T5A = FMA(KP951056516, T5z, T5y); + T6Z = FNMS(KP951056516, T5z, T5y); + T5B = FMA(KP062914667, T5A, T5x); + T7f = FMA(KP827271945, T6Y, T6Z); + T66 = FNMS(KP062914667, T5x, T5A); + T70 = FNMS(KP827271945, T6Z, T6Y); + } + { + E T2W, T4p, T33, T4o, T2S, T2Z; + T2S = FNMS(KP559016994, T2R, T2Q); + T2W = FNMS(KP951056516, T2V, T2S); + T4p = FMA(KP951056516, T2V, T2S); + T2Z = FNMS(KP559016994, T2Y, T2X); + T33 = FNMS(KP951056516, T32, T2Z); + T4o = FMA(KP951056516, T32, T2Z); + T34 = FMA(KP549754652, T33, T2W); + T4H = FMA(KP470564281, T4o, T4p); + T3s = FNMS(KP549754652, T2W, T33); + T4q = FNMS(KP470564281, T4p, T4o); + } + { + E T5E, T6V, T5H, T6W, T5C, T5F; + T5C = FMA(KP559016994, T2Y, T2X); + T5E = FNMS(KP951056516, T5D, T5C); + T6V = FMA(KP951056516, T5D, T5C); + T5F = FMA(KP559016994, T2R, T2Q); + T5H = FMA(KP951056516, T5G, T5F); + T6W = FNMS(KP951056516, T5G, T5F); + T5I = FMA(KP634619297, T5H, T5E); + T7e = FNMS(KP062914667, T6V, T6W); + T67 = FNMS(KP634619297, T5E, T5H); + T6X = FMA(KP062914667, T6W, T6V); + } + } + cr[0] = T9 + TM; + { + E T1I, T1L, T23, T1O, T24, T1u, T28, T1S, T20; + { + E T1K, T1J, T1M, T1N; + T1K = T1G - T1H; + T1I = T1G + T1H; + T1J = FNMS(KP250000000, T1I, T1F); + T1L = FMA(KP559016994, T1K, T1J); + T23 = FNMS(KP559016994, T1K, T1J); + T1M = Ti - Tr; + T1N = TB - TK; + T1O = FMA(KP618033988, T1N, T1M); + T24 = FNMS(KP618033988, T1M, T1N); + { + E T1t, T1Z, TQ, T1Y, TO, TP; + T1t = FMA(KP618033988, T1s, T19); + T1Z = FNMS(KP618033988, T19, T1s); + TO = FNMS(KP250000000, TM, T9); + TP = Ts - TL; + TQ = FMA(KP559016994, TP, TO); + T1Y = FNMS(KP559016994, TP, TO); + T1u = FNMS(KP951056516, T1t, TQ); + T28 = FNMS(KP951056516, T1Z, T1Y); + T1S = FMA(KP951056516, T1t, TQ); + T20 = FMA(KP951056516, T1Z, T1Y); + } + } + ci[0] = T1F + T1I; + { + E T2b, T2a, T2c, T27, T29; + T2b = FMA(KP951056516, T24, T23); + T2a = W[29]; + T2c = T2a * T28; + T27 = W[28]; + T29 = T27 * T28; + cr[WS(rs, 15)] = FNMS(T2a, T2b, T29); + ci[WS(rs, 15)] = FMA(T27, T2b, T2c); + } + { + E T1P, T1w, T1Q, TN, T1v; + T1P = FMA(KP951056516, T1O, T1L); + T1w = W[9]; + T1Q = T1w * T1u; + TN = W[8]; + T1v = TN * T1u; + cr[WS(rs, 5)] = FNMS(T1w, T1P, T1v); + ci[WS(rs, 5)] = FMA(TN, T1P, T1Q); + } + { + E T1V, T1U, T1W, T1R, T1T; + T1V = FNMS(KP951056516, T1O, T1L); + T1U = W[39]; + T1W = T1U * T1S; + T1R = W[38]; + T1T = T1R * T1S; + cr[WS(rs, 20)] = FNMS(T1U, T1V, T1T); + ci[WS(rs, 20)] = FMA(T1R, T1V, T1W); + } + { + E T25, T22, T26, T1X, T21; + T25 = FNMS(KP951056516, T24, T23); + T22 = W[19]; + T26 = T22 * T20; + T1X = W[18]; + T21 = T1X * T20; + cr[WS(rs, 10)] = FNMS(T22, T25, T21); + ci[WS(rs, 10)] = FMA(T1X, T25, T26); + } + } + { + E T69, T6z, T6o, T6E, T6O, T62, T6y, T6R, T6l, T6D; + { + E T65, T68, T6m, T6n; + T65 = FMA(KP968479752, T64, T63); + T68 = FNMS(KP845997307, T67, T66); + T69 = FNMS(KP681693190, T68, T65); + T6z = FMA(KP560319534, T65, T68); + T6m = FNMS(KP968479752, T5X, T5Q); + T6n = FNMS(KP845997307, T5I, T5B); + T6o = FMA(KP681693190, T6n, T6m); + T6E = FNMS(KP560319534, T6m, T6n); + } + { + E T5Z, T61, T5J, T5Y, T60; + T5J = FMA(KP845997307, T5I, T5B); + T5Y = FMA(KP968479752, T5X, T5Q); + T5Z = FMA(KP906616052, T5Y, T5J); + T61 = FNMS(KP906616052, T5Y, T5J); + T6O = FMA(KP998026728, T5Z, T5u); + T60 = FNMS(KP249506682, T5Z, T5u); + T62 = FNMS(KP557913902, T61, T60); + T6y = FMA(KP557913902, T61, T60); + } + { + E T6i, T6k, T6g, T6h, T6j; + T6g = FMA(KP845997307, T67, T66); + T6h = FNMS(KP968479752, T64, T63); + T6i = FNMS(KP906616052, T6h, T6g); + T6k = FMA(KP906616052, T6h, T6g); + T6R = FMA(KP998026728, T6i, T6f); + T6j = FNMS(KP249506682, T6i, T6f); + T6l = FNMS(KP557913902, T6k, T6j); + T6D = FMA(KP557913902, T6k, T6j); + } + { + E T6P, T6S, T6N, T6Q; + T6N = W[2]; + T6P = T6N * T6O; + T6S = T6N * T6R; + T6Q = W[3]; + cr[WS(rs, 2)] = FNMS(T6Q, T6R, T6P); + ci[WS(rs, 2)] = FMA(T6Q, T6O, T6S); + } + { + E T6I, T6L, T6J, T6M, T6H, T6K; + T6I = FMA(KP949179823, T6z, T6y); + T6L = FNMS(KP949179823, T6E, T6D); + T6H = W[32]; + T6J = T6H * T6I; + T6M = T6H * T6L; + T6K = W[33]; + cr[WS(rs, 17)] = FNMS(T6K, T6L, T6J); + ci[WS(rs, 17)] = FMA(T6K, T6I, T6M); + } + { + E T6a, T6p, T6b, T6q, T5r, T6c; + T6a = FNMS(KP860541664, T69, T62); + T6p = FNMS(KP860541664, T6o, T6l); + T5r = W[12]; + T6b = T5r * T6a; + T6q = T5r * T6p; + T6c = W[13]; + cr[WS(rs, 7)] = FNMS(T6c, T6p, T6b); + ci[WS(rs, 7)] = FMA(T6c, T6a, T6q); + } + { + E T6s, T6v, T6t, T6w, T6r, T6u; + T6s = FMA(KP860541664, T69, T62); + T6v = FMA(KP860541664, T6o, T6l); + T6r = W[42]; + T6t = T6r * T6s; + T6w = T6r * T6v; + T6u = W[43]; + cr[WS(rs, 22)] = FNMS(T6u, T6v, T6t); + ci[WS(rs, 22)] = FMA(T6u, T6s, T6w); + } + { + E T6A, T6F, T6B, T6G, T6x, T6C; + T6A = FNMS(KP949179823, T6z, T6y); + T6F = FMA(KP949179823, T6E, T6D); + T6x = W[22]; + T6B = T6x * T6A; + T6G = T6x * T6F; + T6C = W[23]; + cr[WS(rs, 12)] = FNMS(T6C, T6F, T6B); + ci[WS(rs, 12)] = FMA(T6C, T6A, T6G); + } + } + { + E T7t, T7N, T7C, T7S, T7d, T7k, T7x, T7y, T7a, T7q, T7M, T7g, T7j; + { + E T7r, T7s, T7A, T7B; + T7r = FNMS(KP734762448, T7i, T7h); + T7s = FNMS(KP772036680, T7f, T7e); + T7t = FNMS(KP621716863, T7s, T7r); + T7N = FMA(KP614372930, T7r, T7s); + T7A = FNMS(KP734762448, T77, T74); + T7B = FNMS(KP772036680, T70, T6X); + T7C = FNMS(KP621716863, T7B, T7A); + T7S = FMA(KP614372930, T7A, T7B); + } + T7d = FMA(KP951056516, T6e, T6d); + T7g = FMA(KP772036680, T7f, T7e); + T7j = FMA(KP734762448, T7i, T7h); + T7k = FMA(KP994076283, T7j, T7g); + T7x = FNMS(KP249506682, T7k, T7d); + T7y = FNMS(KP994076283, T7j, T7g); + { + E T79, T7p, T71, T78, T7o; + T71 = FMA(KP772036680, T70, T6X); + T78 = FMA(KP734762448, T77, T74); + T79 = FMA(KP994076283, T78, T71); + T7p = FNMS(KP994076283, T78, T71); + T7a = FMA(KP998026728, T79, T6U); + T7o = FNMS(KP249506682, T79, T6U); + T7q = FNMS(KP557913902, T7p, T7o); + T7M = FMA(KP557913902, T7p, T7o); + } + { + E T7l, T7c, T7m, T6T, T7b; + T7l = FMA(KP998026728, T7k, T7d); + T7c = W[5]; + T7m = T7c * T7a; + T6T = W[4]; + T7b = T6T * T7a; + cr[WS(rs, 3)] = FNMS(T7c, T7l, T7b); + ci[WS(rs, 3)] = FMA(T6T, T7l, T7m); + } + { + E T7T, T7Z, T7V, T7X, T7Y, T80, T7L, T7P, T7Q, T7U, T7R, T7W, T7O; + T7R = FMA(KP557913902, T7y, T7x); + T7T = FNMS(KP949179823, T7S, T7R); + T7Z = FMA(KP949179823, T7S, T7R); + T7W = FNMS(KP949179823, T7N, T7M); + T7V = W[34]; + T7X = T7V * T7W; + T7Y = W[35]; + T80 = T7Y * T7W; + T7O = FMA(KP949179823, T7N, T7M); + T7L = W[24]; + T7P = T7L * T7O; + T7Q = W[25]; + T7U = T7Q * T7O; + cr[WS(rs, 13)] = FNMS(T7Q, T7T, T7P); + ci[WS(rs, 13)] = FMA(T7L, T7T, T7U); + cr[WS(rs, 18)] = FNMS(T7Y, T7Z, T7X); + ci[WS(rs, 18)] = FMA(T7V, T7Z, T80); + } + { + E T7D, T7J, T7F, T7H, T7I, T7K, T7n, T7v, T7w, T7E, T7z, T7G, T7u; + T7z = FNMS(KP557913902, T7y, T7x); + T7D = FNMS(KP943557151, T7C, T7z); + T7J = FMA(KP943557151, T7C, T7z); + T7G = FNMS(KP943557151, T7t, T7q); + T7F = W[44]; + T7H = T7F * T7G; + T7I = W[45]; + T7K = T7I * T7G; + T7u = FMA(KP943557151, T7t, T7q); + T7n = W[14]; + T7v = T7n * T7u; + T7w = W[15]; + T7E = T7w * T7u; + cr[WS(rs, 8)] = FNMS(T7w, T7D, T7v); + ci[WS(rs, 8)] = FMA(T7n, T7D, T7E); + cr[WS(rs, 23)] = FNMS(T7I, T7J, T7H); + ci[WS(rs, 23)] = FMA(T7F, T7J, T7K); + } + } + { + E T4J, T57, T4W, T5c, T4N, T4Q, T4R, T4S, T5m, T4C, T56, T4O, T4P; + { + E T4F, T4I, T4U, T4V; + T4F = FNMS(KP912575812, T4E, T4D); + T4I = FNMS(KP912018591, T4H, T4G); + T4J = FNMS(KP726211448, T4I, T4F); + T57 = FMA(KP525970792, T4F, T4I); + T4U = FNMS(KP912575812, T4x, T4u); + T4V = FMA(KP912018591, T4q, T4n); + T4W = FNMS(KP726211448, T4V, T4U); + T5c = FMA(KP525970792, T4U, T4V); + } + T4N = FNMS(KP951056516, T3E, T3B); + T4O = FMA(KP912018591, T4H, T4G); + T4P = FMA(KP912575812, T4E, T4D); + T4Q = FMA(KP851038619, T4P, T4O); + T4R = FNMS(KP248028675, T4Q, T4N); + T4S = FNMS(KP851038619, T4P, T4O); + { + E T4z, T4B, T4r, T4y, T4A; + T4r = FNMS(KP912018591, T4q, T4n); + T4y = FMA(KP912575812, T4x, T4u); + T4z = FMA(KP851038619, T4y, T4r); + T4B = FNMS(KP851038619, T4y, T4r); + T5m = FNMS(KP992114701, T4z, T4k); + T4A = FMA(KP248028675, T4z, T4k); + T4C = FMA(KP554608978, T4B, T4A); + T56 = FNMS(KP554608978, T4B, T4A); + } + { + E T5p, T5o, T5q, T5l, T5n; + T5p = FMA(KP992114701, T4Q, T4N); + T5o = W[7]; + T5q = T5o * T5m; + T5l = W[6]; + T5n = T5l * T5m; + cr[WS(rs, 4)] = FNMS(T5o, T5p, T5n); + ci[WS(rs, 4)] = FMA(T5l, T5p, T5q); + } + { + E T5d, T5j, T5f, T5h, T5i, T5k, T55, T59, T5a, T5e, T5b, T5g, T58; + T5b = FMA(KP554608978, T4S, T4R); + T5d = FNMS(KP943557151, T5c, T5b); + T5j = FMA(KP943557151, T5c, T5b); + T5g = FMA(KP943557151, T57, T56); + T5f = W[36]; + T5h = T5f * T5g; + T5i = W[37]; + T5k = T5i * T5g; + T58 = FNMS(KP943557151, T57, T56); + T55 = W[26]; + T59 = T55 * T58; + T5a = W[27]; + T5e = T5a * T58; + cr[WS(rs, 14)] = FNMS(T5a, T5d, T59); + ci[WS(rs, 14)] = FMA(T55, T5d, T5e); + cr[WS(rs, 19)] = FNMS(T5i, T5j, T5h); + ci[WS(rs, 19)] = FMA(T5f, T5j, T5k); + } + { + E T4X, T53, T4Z, T51, T52, T54, T4j, T4L, T4M, T4Y, T4T, T50, T4K; + T4T = FNMS(KP554608978, T4S, T4R); + T4X = FNMS(KP803003575, T4W, T4T); + T53 = FMA(KP803003575, T4W, T4T); + T50 = FMA(KP803003575, T4J, T4C); + T4Z = W[46]; + T51 = T4Z * T50; + T52 = W[47]; + T54 = T52 * T50; + T4K = FNMS(KP803003575, T4J, T4C); + T4j = W[16]; + T4L = T4j * T4K; + T4M = W[17]; + T4Y = T4M * T4K; + cr[WS(rs, 9)] = FNMS(T4M, T4X, T4L); + ci[WS(rs, 9)] = FMA(T4j, T4X, T4Y); + cr[WS(rs, 24)] = FNMS(T52, T53, T51); + ci[WS(rs, 24)] = FMA(T4Z, T53, T54); + } + } + { + E T3v, T3Z, T3O, T44, T3F, T3I, T3J, T3K, T4e, T3o, T3Y, T3G, T3H; + { + E T3r, T3u, T3M, T3N; + T3r = FMA(KP871714437, T3q, T3p); + T3u = FNMS(KP831864738, T3t, T3s); + T3v = FNMS(KP559154169, T3u, T3r); + T3Z = FMA(KP683113946, T3r, T3u); + T3M = FNMS(KP871714437, T2O, T2z); + T3N = FNMS(KP831864738, T3j, T34); + T3O = FMA(KP559154169, T3N, T3M); + T44 = FNMS(KP683113946, T3M, T3N); + } + T3F = FMA(KP951056516, T3E, T3B); + T3G = FNMS(KP871714437, T3q, T3p); + T3H = FMA(KP831864738, T3t, T3s); + T3I = FNMS(KP904730450, T3H, T3G); + T3J = FNMS(KP242145790, T3I, T3F); + T3K = FMA(KP904730450, T3H, T3G); + { + E T3l, T3n, T2P, T3k, T3m; + T2P = FMA(KP871714437, T2O, T2z); + T3k = FMA(KP831864738, T3j, T34); + T3l = FMA(KP904730450, T3k, T2P); + T3n = FNMS(KP904730450, T3k, T2P); + T4e = FMA(KP968583161, T3l, T2k); + T3m = FNMS(KP242145790, T3l, T2k); + T3o = FMA(KP541454447, T3n, T3m); + T3Y = FNMS(KP541454447, T3n, T3m); + } + { + E T4h, T4g, T4i, T4d, T4f; + T4h = FMA(KP968583161, T3I, T3F); + T4g = W[1]; + T4i = T4g * T4e; + T4d = W[0]; + T4f = T4d * T4e; + cr[WS(rs, 1)] = FNMS(T4g, T4h, T4f); + ci[WS(rs, 1)] = FMA(T4d, T4h, T4i); + } + { + E T45, T4b, T47, T49, T4a, T4c, T3X, T41, T42, T46, T43, T48, T40; + T43 = FNMS(KP541454447, T3K, T3J); + T45 = FNMS(KP833417178, T44, T43); + T4b = FMA(KP833417178, T44, T43); + T48 = FMA(KP833417178, T3Z, T3Y); + T47 = W[30]; + T49 = T47 * T48; + T4a = W[31]; + T4c = T4a * T48; + T40 = FNMS(KP833417178, T3Z, T3Y); + T3X = W[20]; + T41 = T3X * T40; + T42 = W[21]; + T46 = T42 * T40; + cr[WS(rs, 11)] = FNMS(T42, T45, T41); + ci[WS(rs, 11)] = FMA(T3X, T45, T46); + cr[WS(rs, 16)] = FNMS(T4a, T4b, T49); + ci[WS(rs, 16)] = FMA(T47, T4b, T4c); + } + { + E T3P, T3V, T3R, T3T, T3U, T3W, T2d, T3x, T3y, T3Q, T3L, T3S, T3w; + T3L = FMA(KP541454447, T3K, T3J); + T3P = FMA(KP921177326, T3O, T3L); + T3V = FNMS(KP921177326, T3O, T3L); + T3S = FMA(KP921177326, T3v, T3o); + T3R = W[40]; + T3T = T3R * T3S; + T3U = W[41]; + T3W = T3U * T3S; + T3w = FNMS(KP921177326, T3v, T3o); + T2d = W[10]; + T3x = T2d * T3w; + T3y = W[11]; + T3Q = T3y * T3w; + cr[WS(rs, 6)] = FNMS(T3y, T3P, T3x); + ci[WS(rs, 6)] = FMA(T2d, T3P, T3Q); + cr[WS(rs, 21)] = FNMS(T3U, T3V, T3T); + ci[WS(rs, 21)] = FMA(T3R, T3V, T3W); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 25}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hb_25", twinstr, &GENUS, {84, 48, 316, 0} }; + +void X(codelet_hb_25) (planner *p) { + X(khc2hc_register) (p, hb_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 25 -dif -name hb_25 -include rdft/scalar/hb.h */ + +/* + * This function contains 400 FP additions, 280 FP multiplications, + * (or, 260 additions, 140 multiplications, 140 fused multiply/add), + * 107 stack variables, 20 constants, and 100 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 48); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 48, MAKE_VOLATILE_STRIDE(50, rs)) { + E T9, T5Q, T3y, T39, T5v, Ti, Tr, Ts, TZ, T18, T1z, T2k, T4l, T3h, T44; + E T5d, T6C, T5C, T6o, T56, T6B, T5B, T6l, T2z, T4m, T3i, T47, T1K, T5w, T3c; + E T3B, T5R, TB, TK, TL, T1i, T1r, T1A, T2P, T4o, T3k, T4b, T5s, T6F, T5F; + E T6v, T5l, T6E, T5E, T6s, T34, T4p, T3l, T4e; + { + E T1, T4, T7, T8, T3x, T3w, T37, T38; + T1 = cr[0]; + { + E T2, T3, T5, T6; + T2 = cr[WS(rs, 5)]; + T3 = ci[WS(rs, 4)]; + T4 = T2 + T3; + T5 = cr[WS(rs, 10)]; + T6 = ci[WS(rs, 9)]; + T7 = T5 + T6; + T8 = T4 + T7; + T3x = T5 - T6; + T3w = T2 - T3; + } + T9 = T1 + T8; + T5Q = FMA(KP951056516, T3w, KP587785252 * T3x); + T3y = FNMS(KP951056516, T3x, KP587785252 * T3w); + T37 = FNMS(KP250000000, T8, T1); + T38 = KP559016994 * (T4 - T7); + T39 = T37 - T38; + T5v = T38 + T37; + } + { + E Ta, T27, T53, T2f, Th, T26, T10, T2p, T58, T2x, T17, T2o, Tj, T2n, T5a; + E T2t, Tq, T2s, TR, T2b, T51, T2h, TY, T2g; + { + E Tg, T2e, Td, T2d; + Ta = cr[WS(rs, 1)]; + { + E Te, Tf, Tb, Tc; + Te = cr[WS(rs, 11)]; + Tf = ci[WS(rs, 8)]; + Tg = Te + Tf; + T2e = Te - Tf; + Tb = cr[WS(rs, 6)]; + Tc = ci[WS(rs, 3)]; + Td = Tb + Tc; + T2d = Tb - Tc; + } + T27 = KP559016994 * (Td - Tg); + T53 = FMA(KP951056516, T2d, KP587785252 * T2e); + T2f = FNMS(KP951056516, T2e, KP587785252 * T2d); + Th = Td + Tg; + T26 = FNMS(KP250000000, Th, Ta); + } + { + E T16, T2w, T13, T2v; + T10 = ci[WS(rs, 20)]; + { + E T14, T15, T11, T12; + T14 = cr[WS(rs, 14)]; + T15 = cr[WS(rs, 19)]; + T16 = T14 + T15; + T2w = T15 - T14; + T11 = ci[WS(rs, 15)]; + T12 = cr[WS(rs, 24)]; + T13 = T11 - T12; + T2v = T11 + T12; + } + T2p = KP559016994 * (T13 + T16); + T58 = FMA(KP951056516, T2v, KP587785252 * T2w); + T2x = FNMS(KP951056516, T2w, KP587785252 * T2v); + T17 = T13 - T16; + T2o = FNMS(KP250000000, T17, T10); + } + { + E Tp, T2m, Tm, T2l; + Tj = cr[WS(rs, 4)]; + { + E Tn, To, Tk, Tl; + Tn = ci[WS(rs, 10)]; + To = ci[WS(rs, 5)]; + Tp = Tn + To; + T2m = Tn - To; + Tk = cr[WS(rs, 9)]; + Tl = ci[0]; + Tm = Tk + Tl; + T2l = Tk - Tl; + } + T2n = FNMS(KP951056516, T2m, KP587785252 * T2l); + T5a = FMA(KP951056516, T2l, KP587785252 * T2m); + T2t = KP559016994 * (Tm - Tp); + Tq = Tm + Tp; + T2s = FNMS(KP250000000, Tq, Tj); + } + { + E TX, T2a, TU, T29; + TR = ci[WS(rs, 23)]; + { + E TV, TW, TS, TT; + TV = ci[WS(rs, 13)]; + TW = cr[WS(rs, 16)]; + TX = TV - TW; + T2a = TV + TW; + TS = ci[WS(rs, 18)]; + TT = cr[WS(rs, 21)]; + TU = TS - TT; + T29 = TS + TT; + } + T2b = FNMS(KP951056516, T2a, KP587785252 * T29); + T51 = FMA(KP951056516, T29, KP587785252 * T2a); + T2h = KP559016994 * (TU - TX); + TY = TU + TX; + T2g = FNMS(KP250000000, TY, TR); + } + Ti = Ta + Th; + Tr = Tj + Tq; + Ts = Ti + Tr; + TZ = TR + TY; + T18 = T10 + T17; + T1z = TZ + T18; + { + E T2c, T42, T2j, T43, T28, T2i; + T28 = T26 - T27; + T2c = T28 - T2b; + T42 = T28 + T2b; + T2i = T2g - T2h; + T2j = T2f + T2i; + T43 = T2i - T2f; + T2k = FNMS(KP481753674, T2j, KP876306680 * T2c); + T4l = FMA(KP728968627, T43, KP684547105 * T42); + T3h = FMA(KP876306680, T2j, KP481753674 * T2c); + T44 = FNMS(KP684547105, T43, KP728968627 * T42); + } + { + E T59, T6n, T5c, T6m, T57, T5b; + T57 = T2t + T2s; + T59 = T57 - T58; + T6n = T57 + T58; + T5b = T2o + T2p; + T5c = T5a + T5b; + T6m = T5b - T5a; + T5d = FNMS(KP844327925, T5c, KP535826794 * T59); + T6C = FMA(KP637423989, T6m, KP770513242 * T6n); + T5C = FMA(KP535826794, T5c, KP844327925 * T59); + T6o = FNMS(KP637423989, T6n, KP770513242 * T6m); + } + { + E T52, T6j, T55, T6k, T50, T54; + T50 = T27 + T26; + T52 = T50 - T51; + T6j = T50 + T51; + T54 = T2h + T2g; + T55 = T53 + T54; + T6k = T54 - T53; + T56 = FNMS(KP248689887, T55, KP968583161 * T52); + T6B = FMA(KP535826794, T6k, KP844327925 * T6j); + T5B = FMA(KP968583161, T55, KP248689887 * T52); + T6l = FNMS(KP844327925, T6k, KP535826794 * T6j); + } + { + E T2r, T45, T2y, T46, T2q, T2u; + T2q = T2o - T2p; + T2r = T2n + T2q; + T45 = T2q - T2n; + T2u = T2s - T2t; + T2y = T2u - T2x; + T46 = T2u + T2x; + T2z = FMA(KP904827052, T2r, KP425779291 * T2y); + T4m = FNMS(KP992114701, T45, KP125333233 * T46); + T3i = FNMS(KP425779291, T2r, KP904827052 * T2y); + T47 = FMA(KP125333233, T45, KP992114701 * T46); + } + } + { + E T1C, T1F, T1I, T1J, T3b, T3a, T3z, T3A; + T1C = ci[WS(rs, 24)]; + { + E T1D, T1E, T1G, T1H; + T1D = ci[WS(rs, 19)]; + T1E = cr[WS(rs, 20)]; + T1F = T1D - T1E; + T1G = ci[WS(rs, 14)]; + T1H = cr[WS(rs, 15)]; + T1I = T1G - T1H; + T1J = T1F + T1I; + T3b = T1G + T1H; + T3a = T1D + T1E; + } + T1K = T1C + T1J; + T5w = FMA(KP951056516, T3a, KP587785252 * T3b); + T3c = FNMS(KP951056516, T3b, KP587785252 * T3a); + T3z = FNMS(KP250000000, T1J, T1C); + T3A = KP559016994 * (T1F - T1I); + T3B = T3z - T3A; + T5R = T3A + T3z; + } + { + E Tt, T2C, T5i, T2K, TA, T2B, T1a, T2G, T5g, T2M, T1h, T2L, TC, T2R, T5p; + E T2Z, TJ, T2Q, T1j, T2V, T5n, T31, T1q, T30; + { + E Tw, T2I, Tz, T2J; + Tt = cr[WS(rs, 2)]; + { + E Tu, Tv, Tx, Ty; + Tu = cr[WS(rs, 7)]; + Tv = ci[WS(rs, 2)]; + Tw = Tu + Tv; + T2I = Tu - Tv; + Tx = cr[WS(rs, 12)]; + Ty = ci[WS(rs, 7)]; + Tz = Tx + Ty; + T2J = Tx - Ty; + } + T2C = KP559016994 * (Tw - Tz); + T5i = FMA(KP951056516, T2I, KP587785252 * T2J); + T2K = FNMS(KP951056516, T2J, KP587785252 * T2I); + TA = Tw + Tz; + T2B = FNMS(KP250000000, TA, Tt); + } + { + E T1d, T2E, T1g, T2F; + T1a = ci[WS(rs, 22)]; + { + E T1b, T1c, T1e, T1f; + T1b = ci[WS(rs, 17)]; + T1c = cr[WS(rs, 22)]; + T1d = T1b - T1c; + T2E = T1b + T1c; + T1e = ci[WS(rs, 12)]; + T1f = cr[WS(rs, 17)]; + T1g = T1e - T1f; + T2F = T1e + T1f; + } + T2G = FNMS(KP951056516, T2F, KP587785252 * T2E); + T5g = FMA(KP951056516, T2E, KP587785252 * T2F); + T2M = KP559016994 * (T1d - T1g); + T1h = T1d + T1g; + T2L = FNMS(KP250000000, T1h, T1a); + } + { + E TI, T2Y, TF, T2X; + TC = cr[WS(rs, 3)]; + { + E TG, TH, TD, TE; + TG = ci[WS(rs, 11)]; + TH = ci[WS(rs, 6)]; + TI = TG + TH; + T2Y = TG - TH; + TD = cr[WS(rs, 8)]; + TE = ci[WS(rs, 1)]; + TF = TD + TE; + T2X = TD - TE; + } + T2R = KP559016994 * (TF - TI); + T5p = FMA(KP951056516, T2X, KP587785252 * T2Y); + T2Z = FNMS(KP951056516, T2Y, KP587785252 * T2X); + TJ = TF + TI; + T2Q = FNMS(KP250000000, TJ, TC); + } + { + E T1p, T2U, T1m, T2T; + T1j = ci[WS(rs, 21)]; + { + E T1n, T1o, T1k, T1l; + T1n = cr[WS(rs, 13)]; + T1o = cr[WS(rs, 18)]; + T1p = T1n + T1o; + T2U = T1o - T1n; + T1k = ci[WS(rs, 16)]; + T1l = cr[WS(rs, 23)]; + T1m = T1k - T1l; + T2T = T1k + T1l; + } + T2V = FNMS(KP951056516, T2U, KP587785252 * T2T); + T5n = FMA(KP951056516, T2T, KP587785252 * T2U); + T31 = KP559016994 * (T1m + T1p); + T1q = T1m - T1p; + T30 = FNMS(KP250000000, T1q, T1j); + } + TB = Tt + TA; + TK = TC + TJ; + TL = TB + TK; + T1i = T1a + T1h; + T1r = T1j + T1q; + T1A = T1i + T1r; + { + E T2H, T49, T2O, T4a, T2D, T2N; + T2D = T2B - T2C; + T2H = T2D - T2G; + T49 = T2D + T2G; + T2N = T2L - T2M; + T2O = T2K + T2N; + T4a = T2N - T2K; + T2P = FNMS(KP844327925, T2O, KP535826794 * T2H); + T4o = FMA(KP062790519, T4a, KP998026728 * T49); + T3k = FMA(KP535826794, T2O, KP844327925 * T2H); + T4b = FNMS(KP998026728, T4a, KP062790519 * T49); + } + { + E T5o, T6u, T5r, T6t, T5m, T5q; + T5m = T2R + T2Q; + T5o = T5m - T5n; + T6u = T5m + T5n; + T5q = T30 + T31; + T5r = T5p + T5q; + T6t = T5q - T5p; + T5s = FNMS(KP684547105, T5r, KP728968627 * T5o); + T6F = FNMS(KP992114701, T6t, KP125333233 * T6u); + T5F = FMA(KP728968627, T5r, KP684547105 * T5o); + T6v = FMA(KP125333233, T6t, KP992114701 * T6u); + } + { + E T5h, T6r, T5k, T6q, T5f, T5j; + T5f = T2C + T2B; + T5h = T5f - T5g; + T6r = T5f + T5g; + T5j = T2M + T2L; + T5k = T5i + T5j; + T6q = T5j - T5i; + T5l = FNMS(KP481753674, T5k, KP876306680 * T5h); + T6E = FNMS(KP425779291, T6q, KP904827052 * T6r); + T5E = FMA(KP876306680, T5k, KP481753674 * T5h); + T6s = FMA(KP904827052, T6q, KP425779291 * T6r); + } + { + E T2W, T4d, T33, T4c, T2S, T32; + T2S = T2Q - T2R; + T2W = T2S - T2V; + T4d = T2S + T2V; + T32 = T30 - T31; + T33 = T2Z + T32; + T4c = T32 - T2Z; + T34 = FNMS(KP998026728, T33, KP062790519 * T2W); + T4p = FNMS(KP637423989, T4c, KP770513242 * T4d); + T3l = FMA(KP062790519, T33, KP998026728 * T2W); + T4e = FMA(KP770513242, T4c, KP637423989 * T4d); + } + } + { + E TM, TQ, T1U, T1L, T1N, T1Z, T1t, T1V, T1y, T1Y; + { + E TO, TP, T1B, T1M; + TO = KP559016994 * (Ts - TL); + TM = Ts + TL; + TP = FNMS(KP250000000, TM, T9); + TQ = TO + TP; + T1U = TP - TO; + T1B = KP559016994 * (T1z - T1A); + T1L = T1z + T1A; + T1M = FNMS(KP250000000, T1L, T1K); + T1N = T1B + T1M; + T1Z = T1M - T1B; + } + { + E T19, T1s, T1w, T1x; + T19 = TZ - T18; + T1s = T1i - T1r; + T1t = FMA(KP951056516, T19, KP587785252 * T1s); + T1V = FNMS(KP951056516, T1s, KP587785252 * T19); + T1w = Ti - Tr; + T1x = TB - TK; + T1y = FMA(KP951056516, T1w, KP587785252 * T1x); + T1Y = FNMS(KP951056516, T1x, KP587785252 * T1w); + } + cr[0] = T9 + TM; + ci[0] = T1K + T1L; + { + E T1u, T1O, TN, T1v; + T1u = TQ - T1t; + T1O = T1y + T1N; + TN = W[8]; + T1v = W[9]; + cr[WS(rs, 5)] = FNMS(T1v, T1O, TN * T1u); + ci[WS(rs, 5)] = FMA(T1v, T1u, TN * T1O); + } + { + E T22, T24, T21, T23; + T22 = T1U + T1V; + T24 = T1Z - T1Y; + T21 = W[28]; + T23 = W[29]; + cr[WS(rs, 15)] = FNMS(T23, T24, T21 * T22); + ci[WS(rs, 15)] = FMA(T23, T22, T21 * T24); + } + { + E T1W, T20, T1T, T1X; + T1W = T1U - T1V; + T20 = T1Y + T1Z; + T1T = W[18]; + T1X = W[19]; + cr[WS(rs, 10)] = FNMS(T1X, T20, T1T * T1W); + ci[WS(rs, 10)] = FMA(T1X, T1W, T1T * T20); + } + { + E T1Q, T1S, T1P, T1R; + T1Q = TQ + T1t; + T1S = T1N - T1y; + T1P = W[38]; + T1R = W[39]; + cr[WS(rs, 20)] = FNMS(T1R, T1S, T1P * T1Q); + ci[WS(rs, 20)] = FMA(T1R, T1Q, T1P * T1S); + } + } + { + E T6H, T71, T6M, T74, T6i, T6x, T6y, T6z, T6Q, T6R, T6P, T6S; + { + E T6D, T6G, T6K, T6L; + T6D = T6B + T6C; + T6G = T6E - T6F; + T6H = FMA(KP951056516, T6D, KP587785252 * T6G); + T71 = FNMS(KP951056516, T6G, KP587785252 * T6D); + T6K = T6l - T6o; + T6L = T6v - T6s; + T6M = FMA(KP951056516, T6K, KP587785252 * T6L); + T74 = FNMS(KP951056516, T6L, KP587785252 * T6K); + } + { + E T6p, T6w, T6N, T6O; + T6i = T5v + T5w; + T6p = T6l + T6o; + T6w = T6s + T6v; + T6x = T6p - T6w; + T6y = FNMS(KP250000000, T6x, T6i); + T6z = KP559016994 * (T6p + T6w); + T6Q = T5R - T5Q; + T6N = T6B - T6C; + T6O = T6E + T6F; + T6R = T6N + T6O; + T6P = KP559016994 * (T6N - T6O); + T6S = FNMS(KP250000000, T6R, T6Q); + } + { + E T7c, T7e, T7b, T7d; + T7c = T6i + T6x; + T7e = T6Q + T6R; + T7b = W[6]; + T7d = W[7]; + cr[WS(rs, 4)] = FNMS(T7d, T7e, T7b * T7c); + ci[WS(rs, 4)] = FMA(T7d, T7c, T7b * T7e); + } + { + E T72, T78, T76, T7a, T70, T75; + T70 = T6y - T6z; + T72 = T70 - T71; + T78 = T70 + T71; + T75 = T6S - T6P; + T76 = T74 + T75; + T7a = T75 - T74; + { + E T6Z, T73, T77, T79; + T6Z = W[26]; + T73 = W[27]; + cr[WS(rs, 14)] = FNMS(T73, T76, T6Z * T72); + ci[WS(rs, 14)] = FMA(T73, T72, T6Z * T76); + T77 = W[36]; + T79 = W[37]; + cr[WS(rs, 19)] = FNMS(T79, T7a, T77 * T78); + ci[WS(rs, 19)] = FMA(T79, T78, T77 * T7a); + } + } + { + E T6I, T6W, T6U, T6Y, T6A, T6T; + T6A = T6y + T6z; + T6I = T6A - T6H; + T6W = T6A + T6H; + T6T = T6P + T6S; + T6U = T6M + T6T; + T6Y = T6T - T6M; + { + E T6h, T6J, T6V, T6X; + T6h = W[16]; + T6J = W[17]; + cr[WS(rs, 9)] = FNMS(T6J, T6U, T6h * T6I); + ci[WS(rs, 9)] = FMA(T6J, T6I, T6h * T6U); + T6V = W[46]; + T6X = W[47]; + cr[WS(rs, 24)] = FNMS(T6X, T6Y, T6V * T6W); + ci[WS(rs, 24)] = FMA(T6X, T6W, T6V * T6Y); + } + } + } + { + E T3n, T3N, T3s, T3Q, T3d, T3e, T36, T3f, T3C, T3D, T3v, T3E; + { + E T3j, T3m, T3q, T3r; + T3j = T3h - T3i; + T3m = T3k - T3l; + T3n = FMA(KP951056516, T3j, KP587785252 * T3m); + T3N = FNMS(KP951056516, T3m, KP587785252 * T3j); + T3q = T2k + T2z; + T3r = T2P - T34; + T3s = FMA(KP951056516, T3q, KP587785252 * T3r); + T3Q = FNMS(KP951056516, T3r, KP587785252 * T3q); + } + { + E T2A, T35, T3t, T3u; + T3d = T39 - T3c; + T2A = T2k - T2z; + T35 = T2P + T34; + T3e = T2A + T35; + T36 = KP559016994 * (T2A - T35); + T3f = FNMS(KP250000000, T3e, T3d); + T3C = T3y + T3B; + T3t = T3h + T3i; + T3u = T3k + T3l; + T3D = T3t + T3u; + T3v = KP559016994 * (T3t - T3u); + T3E = FNMS(KP250000000, T3D, T3C); + } + { + E T3Y, T40, T3X, T3Z; + T3Y = T3d + T3e; + T40 = T3C + T3D; + T3X = W[2]; + T3Z = W[3]; + cr[WS(rs, 2)] = FNMS(T3Z, T40, T3X * T3Y); + ci[WS(rs, 2)] = FMA(T3Z, T3Y, T3X * T40); + } + { + E T3O, T3U, T3S, T3W, T3M, T3R; + T3M = T3f - T36; + T3O = T3M - T3N; + T3U = T3M + T3N; + T3R = T3E - T3v; + T3S = T3Q + T3R; + T3W = T3R - T3Q; + { + E T3L, T3P, T3T, T3V; + T3L = W[22]; + T3P = W[23]; + cr[WS(rs, 12)] = FNMS(T3P, T3S, T3L * T3O); + ci[WS(rs, 12)] = FMA(T3P, T3O, T3L * T3S); + T3T = W[32]; + T3V = W[33]; + cr[WS(rs, 17)] = FNMS(T3V, T3W, T3T * T3U); + ci[WS(rs, 17)] = FMA(T3V, T3U, T3T * T3W); + } + } + { + E T3o, T3I, T3G, T3K, T3g, T3F; + T3g = T36 + T3f; + T3o = T3g - T3n; + T3I = T3g + T3n; + T3F = T3v + T3E; + T3G = T3s + T3F; + T3K = T3F - T3s; + { + E T25, T3p, T3H, T3J; + T25 = W[12]; + T3p = W[13]; + cr[WS(rs, 7)] = FNMS(T3p, T3G, T25 * T3o); + ci[WS(rs, 7)] = FMA(T3p, T3o, T25 * T3G); + T3H = W[42]; + T3J = W[43]; + cr[WS(rs, 22)] = FNMS(T3J, T3K, T3H * T3I); + ci[WS(rs, 22)] = FMA(T3J, T3I, T3H * T3K); + } + } + } + { + E T4r, T4L, T4w, T4O, T4h, T4i, T4g, T4j, T4A, T4B, T4z, T4C; + { + E T4n, T4q, T4u, T4v; + T4n = T4l - T4m; + T4q = T4o - T4p; + T4r = FMA(KP951056516, T4n, KP587785252 * T4q); + T4L = FNMS(KP951056516, T4q, KP587785252 * T4n); + T4u = T44 + T47; + T4v = T4b + T4e; + T4w = FMA(KP951056516, T4u, KP587785252 * T4v); + T4O = FNMS(KP951056516, T4v, KP587785252 * T4u); + } + { + E T48, T4f, T4x, T4y; + T4h = T39 + T3c; + T48 = T44 - T47; + T4f = T4b - T4e; + T4i = T48 + T4f; + T4g = KP559016994 * (T48 - T4f); + T4j = FNMS(KP250000000, T4i, T4h); + T4A = T3B - T3y; + T4x = T4l + T4m; + T4y = T4o + T4p; + T4B = T4x + T4y; + T4z = KP559016994 * (T4x - T4y); + T4C = FNMS(KP250000000, T4B, T4A); + } + { + E T4W, T4Y, T4V, T4X; + T4W = T4h + T4i; + T4Y = T4A + T4B; + T4V = W[4]; + T4X = W[5]; + cr[WS(rs, 3)] = FNMS(T4X, T4Y, T4V * T4W); + ci[WS(rs, 3)] = FMA(T4X, T4W, T4V * T4Y); + } + { + E T4M, T4S, T4Q, T4U, T4K, T4P; + T4K = T4j - T4g; + T4M = T4K - T4L; + T4S = T4K + T4L; + T4P = T4C - T4z; + T4Q = T4O + T4P; + T4U = T4P - T4O; + { + E T4J, T4N, T4R, T4T; + T4J = W[24]; + T4N = W[25]; + cr[WS(rs, 13)] = FNMS(T4N, T4Q, T4J * T4M); + ci[WS(rs, 13)] = FMA(T4N, T4M, T4J * T4Q); + T4R = W[34]; + T4T = W[35]; + cr[WS(rs, 18)] = FNMS(T4T, T4U, T4R * T4S); + ci[WS(rs, 18)] = FMA(T4T, T4S, T4R * T4U); + } + } + { + E T4s, T4G, T4E, T4I, T4k, T4D; + T4k = T4g + T4j; + T4s = T4k - T4r; + T4G = T4k + T4r; + T4D = T4z + T4C; + T4E = T4w + T4D; + T4I = T4D - T4w; + { + E T41, T4t, T4F, T4H; + T41 = W[14]; + T4t = W[15]; + cr[WS(rs, 8)] = FNMS(T4t, T4E, T41 * T4s); + ci[WS(rs, 8)] = FMA(T4t, T4s, T41 * T4E); + T4F = W[44]; + T4H = W[45]; + cr[WS(rs, 23)] = FNMS(T4H, T4I, T4F * T4G); + ci[WS(rs, 23)] = FMA(T4H, T4G, T4F * T4I); + } + } + } + { + E T5H, T63, T5M, T66, T5x, T5y, T5u, T5z, T5S, T5T, T5P, T5U; + { + E T5D, T5G, T5K, T5L; + T5D = T5B - T5C; + T5G = T5E - T5F; + T5H = FMA(KP951056516, T5D, KP587785252 * T5G); + T63 = FNMS(KP951056516, T5G, KP587785252 * T5D); + T5K = T56 - T5d; + T5L = T5l - T5s; + T5M = FMA(KP951056516, T5K, KP587785252 * T5L); + T66 = FNMS(KP951056516, T5L, KP587785252 * T5K); + } + { + E T5e, T5t, T5N, T5O; + T5x = T5v - T5w; + T5e = T56 + T5d; + T5t = T5l + T5s; + T5y = T5e + T5t; + T5u = KP559016994 * (T5e - T5t); + T5z = FNMS(KP250000000, T5y, T5x); + T5S = T5Q + T5R; + T5N = T5B + T5C; + T5O = T5E + T5F; + T5T = T5N + T5O; + T5P = KP559016994 * (T5N - T5O); + T5U = FNMS(KP250000000, T5T, T5S); + } + { + E T6e, T6g, T6d, T6f; + T6e = T5x + T5y; + T6g = T5S + T5T; + T6d = W[0]; + T6f = W[1]; + cr[WS(rs, 1)] = FNMS(T6f, T6g, T6d * T6e); + ci[WS(rs, 1)] = FMA(T6f, T6e, T6d * T6g); + } + { + E T64, T6a, T68, T6c, T62, T67; + T62 = T5z - T5u; + T64 = T62 - T63; + T6a = T62 + T63; + T67 = T5U - T5P; + T68 = T66 + T67; + T6c = T67 - T66; + { + E T61, T65, T69, T6b; + T61 = W[20]; + T65 = W[21]; + cr[WS(rs, 11)] = FNMS(T65, T68, T61 * T64); + ci[WS(rs, 11)] = FMA(T65, T64, T61 * T68); + T69 = W[30]; + T6b = W[31]; + cr[WS(rs, 16)] = FNMS(T6b, T6c, T69 * T6a); + ci[WS(rs, 16)] = FMA(T6b, T6a, T69 * T6c); + } + } + { + E T5I, T5Y, T5W, T60, T5A, T5V; + T5A = T5u + T5z; + T5I = T5A - T5H; + T5Y = T5A + T5H; + T5V = T5P + T5U; + T5W = T5M + T5V; + T60 = T5V - T5M; + { + E T4Z, T5J, T5X, T5Z; + T4Z = W[10]; + T5J = W[11]; + cr[WS(rs, 6)] = FNMS(T5J, T5W, T4Z * T5I); + ci[WS(rs, 6)] = FMA(T5J, T5I, T4Z * T5W); + T5X = W[40]; + T5Z = W[41]; + cr[WS(rs, 21)] = FNMS(T5Z, T60, T5X * T5Y); + ci[WS(rs, 21)] = FMA(T5Z, T5Y, T5X * T60); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 25}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hb_25", twinstr, &GENUS, {260, 140, 140, 0} }; + +void X(codelet_hb_25) (planner *p) { + X(khc2hc_register) (p, hb_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_3.c new file mode 100644 index 000000000..d40718231 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_3.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 3 -dif -name hb_3 -include rdft/scalar/hb.h */ + +/* + * This function contains 16 FP additions, 14 FP multiplications, + * (or, 6 additions, 4 multiplications, 10 fused multiply/add), + * 17 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_3(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs)) { + E T1, T4, T6, Tg, Td, Te, T9, Tf; + { + E T2, T3, T7, T8; + T1 = cr[0]; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + T6 = FNMS(KP500000000, T4, T1); + Tg = T2 - T3; + Td = ci[WS(rs, 2)]; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 2)]; + Te = T7 - T8; + T9 = T7 + T8; + Tf = FNMS(KP500000000, Te, Td); + } + cr[0] = T1 + T4; + ci[0] = Td + Te; + { + E Th, T5, Tb, Tc, Ti, Ta; + Th = FMA(KP866025403, Tg, Tf); + Ta = FNMS(KP866025403, T9, T6); + T5 = W[0]; + Tb = T5 * Ta; + Tc = W[1]; + Ti = Tc * Ta; + cr[WS(rs, 1)] = FNMS(Tc, Th, Tb); + ci[WS(rs, 1)] = FMA(T5, Th, Ti); + } + { + E Tn, Tj, Tl, Tm, To, Tk; + Tn = FNMS(KP866025403, Tg, Tf); + Tk = FMA(KP866025403, T9, T6); + Tj = W[2]; + Tl = Tj * Tk; + Tm = W[3]; + To = Tm * Tk; + cr[WS(rs, 2)] = FNMS(Tm, Tn, Tl); + ci[WS(rs, 2)] = FMA(Tj, Tn, To); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 3, "hb_3", twinstr, &GENUS, {6, 4, 10, 0} }; + +void X(codelet_hb_3) (planner *p) { + X(khc2hc_register) (p, hb_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 3 -dif -name hb_3 -include rdft/scalar/hb.h */ + +/* + * This function contains 16 FP additions, 12 FP multiplications, + * (or, 10 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_3(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs)) { + E T1, T4, Ta, Te, T5, T8, Tb, Tf; + { + E T2, T3, T6, T7; + T1 = cr[0]; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + Ta = FNMS(KP500000000, T4, T1); + Te = KP866025403 * (T2 - T3); + T5 = ci[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = cr[WS(rs, 2)]; + T8 = T6 - T7; + Tb = KP866025403 * (T6 + T7); + Tf = FNMS(KP500000000, T8, T5); + } + cr[0] = T1 + T4; + ci[0] = T5 + T8; + { + E Tc, Tg, T9, Td; + Tc = Ta - Tb; + Tg = Te + Tf; + T9 = W[0]; + Td = W[1]; + cr[WS(rs, 1)] = FNMS(Td, Tg, T9 * Tc); + ci[WS(rs, 1)] = FMA(T9, Tg, Td * Tc); + } + { + E Ti, Tk, Th, Tj; + Ti = Ta + Tb; + Tk = Tf - Te; + Th = W[2]; + Tj = W[3]; + cr[WS(rs, 2)] = FNMS(Tj, Tk, Th * Ti); + ci[WS(rs, 2)] = FMA(Th, Tk, Tj * Ti); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 3, "hb_3", twinstr, &GENUS, {10, 6, 6, 0} }; + +void X(codelet_hb_3) (planner *p) { + X(khc2hc_register) (p, hb_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_32.c new file mode 100644 index 000000000..5cc035e6f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_32.c @@ -0,0 +1,1843 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:33 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hb_32 -include rdft/scalar/hb.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 236 additions, 62 multiplications, 198 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 62, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tf, T5K, T7k, T8k, T7N, T8x, T1i, T3i, T2L, T3v, T4v, T5f, T6m, T6T, T42; + E T52, TZ, T6X, T1X, T3p, T8p, T8B, T26, T3o, T4n, T58, T7z, T7T, T4k, T59; + E T6a, T6p, TK, T6W, T2o, T3m, T8s, T8A, T2x, T3l, T4g, T55, T7G, T7S, T4d; + E T56, T61, T6o, Tu, T6f, T7r, T8y, T7Q, T8l, T1F, T3w, T2O, T3j, T4y, T53; + E T5R, T6U, T49, T5g; + { + E T3, T12, T6, T2D, T2G, T6g, T15, T6h, Td, T6k, T1g, T2J, Ta, T6j, T1b; + E T2I; + { + E T1, T2, T13, T14; + T1 = cr[0]; + T2 = ci[WS(rs, 15)]; + T3 = T1 + T2; + T12 = T1 - T2; + { + E T4, T5, T2E, T2F; + T4 = cr[WS(rs, 8)]; + T5 = ci[WS(rs, 7)]; + T6 = T4 + T5; + T2D = T4 - T5; + T2E = ci[WS(rs, 31)]; + T2F = cr[WS(rs, 16)]; + T2G = T2E + T2F; + T6g = T2E - T2F; + } + T13 = ci[WS(rs, 23)]; + T14 = cr[WS(rs, 24)]; + T15 = T13 + T14; + T6h = T13 - T14; + { + E Tb, Tc, T1c, T1d, T1e, T1f; + Tb = ci[WS(rs, 3)]; + Tc = cr[WS(rs, 12)]; + T1c = Tb - Tc; + T1d = ci[WS(rs, 19)]; + T1e = cr[WS(rs, 28)]; + T1f = T1d + T1e; + Td = Tb + Tc; + T6k = T1d - T1e; + T1g = T1c - T1f; + T2J = T1c + T1f; + } + { + E T8, T9, T17, T18, T19, T1a; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 11)]; + T17 = T8 - T9; + T18 = ci[WS(rs, 27)]; + T19 = cr[WS(rs, 20)]; + T1a = T18 + T19; + Ta = T8 + T9; + T6j = T18 - T19; + T1b = T17 - T1a; + T2I = T17 + T1a; + } + } + { + E T7, Te, T7i, T7j; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T5K = T7 - Te; + T7i = T3 - T6; + T7j = T6k - T6j; + T7k = T7i - T7j; + T8k = T7i + T7j; + } + { + E T7L, T7M, T16, T1h; + T7L = T6g - T6h; + T7M = Ta - Td; + T7N = T7L - T7M; + T8x = T7M + T7L; + T16 = T12 - T15; + T1h = T1b + T1g; + T1i = FNMS(KP707106781, T1h, T16); + T3i = FMA(KP707106781, T1h, T16); + } + { + E T2H, T2K, T4t, T4u; + T2H = T2D + T2G; + T2K = T2I - T2J; + T2L = FNMS(KP707106781, T2K, T2H); + T3v = FMA(KP707106781, T2K, T2H); + T4t = T2G - T2D; + T4u = T1b - T1g; + T4v = FMA(KP707106781, T4u, T4t); + T5f = FNMS(KP707106781, T4u, T4t); + } + { + E T6i, T6l, T40, T41; + T6i = T6g + T6h; + T6l = T6j + T6k; + T6m = T6i - T6l; + T6T = T6i + T6l; + T40 = T12 + T15; + T41 = T2I + T2J; + T42 = FNMS(KP707106781, T41, T40); + T52 = FMA(KP707106781, T41, T40); + } + } + { + E TR, T7w, T1H, T1Y, T1K, T7t, T21, T65, TY, T7u, T7x, T1Q, T1V, T24, T68; + E T23, T7v, T7y; + { + E TL, TM, TN, TO, TP, TQ; + TL = ci[0]; + TM = cr[WS(rs, 15)]; + TN = TL + TM; + TO = cr[WS(rs, 7)]; + TP = ci[WS(rs, 8)]; + TQ = TO + TP; + TR = TN + TQ; + T7w = TN - TQ; + T1H = TO - TP; + T1Y = TL - TM; + } + { + E T1I, T1J, T63, T1Z, T20, T64; + T1I = ci[WS(rs, 16)]; + T1J = cr[WS(rs, 31)]; + T63 = T1I - T1J; + T1Z = ci[WS(rs, 24)]; + T20 = cr[WS(rs, 23)]; + T64 = T1Z - T20; + T1K = T1I + T1J; + T7t = T63 - T64; + T21 = T1Z + T20; + T65 = T63 + T64; + } + { + E TU, T1M, T1U, T67, TX, T1R, T1P, T66; + { + E TS, TT, T1S, T1T; + TS = cr[WS(rs, 3)]; + TT = ci[WS(rs, 12)]; + TU = TS + TT; + T1M = TS - TT; + T1S = ci[WS(rs, 20)]; + T1T = cr[WS(rs, 27)]; + T1U = T1S + T1T; + T67 = T1S - T1T; + } + { + E TV, TW, T1N, T1O; + TV = ci[WS(rs, 4)]; + TW = cr[WS(rs, 11)]; + TX = TV + TW; + T1R = TV - TW; + T1N = ci[WS(rs, 28)]; + T1O = cr[WS(rs, 19)]; + T1P = T1N + T1O; + T66 = T1N - T1O; + } + TY = TU + TX; + T7u = TU - TX; + T7x = T67 - T66; + T1Q = T1M + T1P; + T1V = T1R + T1U; + T24 = T1R - T1U; + T68 = T66 + T67; + T23 = T1M - T1P; + } + TZ = TR + TY; + T6X = T65 + T68; + { + E T1L, T1W, T8n, T8o; + T1L = T1H - T1K; + T1W = T1Q - T1V; + T1X = FNMS(KP707106781, T1W, T1L); + T3p = FMA(KP707106781, T1W, T1L); + T8n = T7u + T7t; + T8o = T7w + T7x; + T8p = FNMS(KP414213562, T8o, T8n); + T8B = FMA(KP414213562, T8n, T8o); + } + { + E T22, T25, T4l, T4m; + T22 = T1Y - T21; + T25 = T23 + T24; + T26 = FNMS(KP707106781, T25, T22); + T3o = FMA(KP707106781, T25, T22); + T4l = T1H + T1K; + T4m = T23 - T24; + T4n = FNMS(KP707106781, T4m, T4l); + T58 = FMA(KP707106781, T4m, T4l); + } + T7v = T7t - T7u; + T7y = T7w - T7x; + T7z = FMA(KP414213562, T7y, T7v); + T7T = FNMS(KP414213562, T7v, T7y); + { + E T4i, T4j, T62, T69; + T4i = T1Y + T21; + T4j = T1Q + T1V; + T4k = FNMS(KP707106781, T4j, T4i); + T59 = FMA(KP707106781, T4j, T4i); + T62 = TR - TY; + T69 = T65 - T68; + T6a = T62 + T69; + T6p = T69 - T62; + } + } + { + E TC, T7D, T28, T2p, T2b, T7A, T2s, T5W, TJ, T7B, T7E, T2h, T2m, T2v, T5Z; + E T2u, T7C, T7F; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = cr[WS(rs, 1)]; + Tx = ci[WS(rs, 14)]; + Ty = Tw + Tx; + Tz = cr[WS(rs, 9)]; + TA = ci[WS(rs, 6)]; + TB = Tz + TA; + TC = Ty + TB; + T7D = Ty - TB; + T28 = Tz - TA; + T2p = Tw - Tx; + } + { + E T29, T2a, T5U, T2q, T2r, T5V; + T29 = ci[WS(rs, 30)]; + T2a = cr[WS(rs, 17)]; + T5U = T29 - T2a; + T2q = ci[WS(rs, 22)]; + T2r = cr[WS(rs, 25)]; + T5V = T2q - T2r; + T2b = T29 + T2a; + T7A = T5U - T5V; + T2s = T2q + T2r; + T5W = T5U + T5V; + } + { + E TF, T2d, T2l, T5Y, TI, T2i, T2g, T5X; + { + E TD, TE, T2j, T2k; + TD = cr[WS(rs, 5)]; + TE = ci[WS(rs, 10)]; + TF = TD + TE; + T2d = TD - TE; + T2j = ci[WS(rs, 18)]; + T2k = cr[WS(rs, 29)]; + T2l = T2j + T2k; + T5Y = T2j - T2k; + } + { + E TG, TH, T2e, T2f; + TG = ci[WS(rs, 2)]; + TH = cr[WS(rs, 13)]; + TI = TG + TH; + T2i = TG - TH; + T2e = ci[WS(rs, 26)]; + T2f = cr[WS(rs, 21)]; + T2g = T2e + T2f; + T5X = T2e - T2f; + } + TJ = TF + TI; + T7B = TF - TI; + T7E = T5Y - T5X; + T2h = T2d + T2g; + T2m = T2i + T2l; + T2v = T2i - T2l; + T5Z = T5X + T5Y; + T2u = T2d - T2g; + } + TK = TC + TJ; + T6W = T5W + T5Z; + { + E T2c, T2n, T8q, T8r; + T2c = T28 + T2b; + T2n = T2h - T2m; + T2o = FNMS(KP707106781, T2n, T2c); + T3m = FMA(KP707106781, T2n, T2c); + T8q = T7B + T7A; + T8r = T7D + T7E; + T8s = FMA(KP414213562, T8r, T8q); + T8A = FNMS(KP414213562, T8q, T8r); + } + { + E T2t, T2w, T4e, T4f; + T2t = T2p - T2s; + T2w = T2u + T2v; + T2x = FNMS(KP707106781, T2w, T2t); + T3l = FMA(KP707106781, T2w, T2t); + T4e = T2b - T28; + T4f = T2v - T2u; + T4g = FNMS(KP707106781, T4f, T4e); + T55 = FMA(KP707106781, T4f, T4e); + } + T7C = T7A - T7B; + T7F = T7D - T7E; + T7G = FNMS(KP414213562, T7F, T7C); + T7S = FMA(KP414213562, T7C, T7F); + { + E T4b, T4c, T5T, T60; + T4b = T2p + T2s; + T4c = T2h + T2m; + T4d = FNMS(KP707106781, T4c, T4b); + T56 = FMA(KP707106781, T4c, T4b); + T5T = TC - TJ; + T60 = T5W - T5Z; + T61 = T5T - T60; + T6o = T5T + T60; + } + } + { + E Ti, T5P, Tl, T5O, T1y, T1D, T7p, T7o, T44, T43, Tp, T5M, Ts, T5L, T1n; + E T1s, T7m, T7l, T47, T46; + { + E T1z, T1C, T1u, T1x; + { + E Tg, Th, T1A, T1B; + Tg = cr[WS(rs, 2)]; + Th = ci[WS(rs, 13)]; + Ti = Tg + Th; + T1z = Tg - Th; + T1A = ci[WS(rs, 21)]; + T1B = cr[WS(rs, 26)]; + T1C = T1A + T1B; + T5P = T1A - T1B; + } + { + E Tj, Tk, T1v, T1w; + Tj = cr[WS(rs, 10)]; + Tk = ci[WS(rs, 5)]; + Tl = Tj + Tk; + T1u = Tj - Tk; + T1v = ci[WS(rs, 29)]; + T1w = cr[WS(rs, 18)]; + T1x = T1v + T1w; + T5O = T1v - T1w; + } + T1y = T1u + T1x; + T1D = T1z - T1C; + T7p = T5O - T5P; + T7o = Ti - Tl; + T44 = T1z + T1C; + T43 = T1x - T1u; + } + { + E T1o, T1r, T1j, T1m; + { + E Tn, To, T1p, T1q; + Tn = ci[WS(rs, 1)]; + To = cr[WS(rs, 14)]; + Tp = Tn + To; + T1o = Tn - To; + T1p = ci[WS(rs, 25)]; + T1q = cr[WS(rs, 22)]; + T1r = T1p + T1q; + T5M = T1p - T1q; + } + { + E Tq, Tr, T1k, T1l; + Tq = cr[WS(rs, 6)]; + Tr = ci[WS(rs, 9)]; + Ts = Tq + Tr; + T1j = Tq - Tr; + T1k = ci[WS(rs, 17)]; + T1l = cr[WS(rs, 30)]; + T1m = T1k + T1l; + T5L = T1k - T1l; + } + T1n = T1j - T1m; + T1s = T1o - T1r; + T7m = Tp - Ts; + T7l = T5L - T5M; + T47 = T1o + T1r; + T46 = T1j + T1m; + } + { + E Tm, Tt, T7n, T7q; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T6f = Tm - Tt; + T7n = T7l - T7m; + T7q = T7o + T7p; + T7r = T7n - T7q; + T8y = T7q + T7n; + } + { + E T7O, T7P, T1t, T1E; + T7O = T7o - T7p; + T7P = T7m + T7l; + T7Q = T7O - T7P; + T8l = T7O + T7P; + T1t = FNMS(KP414213562, T1s, T1n); + T1E = FMA(KP414213562, T1D, T1y); + T1F = T1t - T1E; + T3w = T1E + T1t; + } + { + E T2M, T2N, T4w, T4x; + T2M = FNMS(KP414213562, T1y, T1D); + T2N = FMA(KP414213562, T1n, T1s); + T2O = T2M - T2N; + T3j = T2M + T2N; + T4w = FMA(KP414213562, T43, T44); + T4x = FMA(KP414213562, T46, T47); + T4y = T4w - T4x; + T53 = T4w + T4x; + } + { + E T5N, T5Q, T45, T48; + T5N = T5L + T5M; + T5Q = T5O + T5P; + T5R = T5N - T5Q; + T6U = T5Q + T5N; + T45 = FNMS(KP414213562, T44, T43); + T48 = FNMS(KP414213562, T47, T46); + T49 = T45 + T48; + T5g = T48 - T45; + } + } + { + E Tv, T10, T6Q, T6V, T6Y, T6Z; + Tv = Tf + Tu; + T10 = TK + TZ; + T6Q = Tv - T10; + T6V = T6T + T6U; + T6Y = T6W + T6X; + T6Z = T6V - T6Y; + cr[0] = Tv + T10; + ci[0] = T6V + T6Y; + { + E T6P, T6R, T6S, T70; + T6P = W[30]; + T6R = T6P * T6Q; + T6S = W[31]; + T70 = T6S * T6Q; + cr[WS(rs, 16)] = FNMS(T6S, T6Z, T6R); + ci[WS(rs, 16)] = FMA(T6P, T6Z, T70); + } + } + { + E T8O, T8W, T8T, T8Z; + { + E T8M, T8N, T8R, T8S; + T8M = FMA(KP707106781, T8l, T8k); + T8N = T8A + T8B; + T8O = FNMS(KP923879532, T8N, T8M); + T8W = FMA(KP923879532, T8N, T8M); + T8R = FMA(KP707106781, T8y, T8x); + T8S = T8s + T8p; + T8T = FNMS(KP923879532, T8S, T8R); + T8Z = FMA(KP923879532, T8S, T8R); + } + { + E T8P, T8U, T8L, T8Q; + T8L = W[34]; + T8P = T8L * T8O; + T8U = T8L * T8T; + T8Q = W[35]; + cr[WS(rs, 18)] = FNMS(T8Q, T8T, T8P); + ci[WS(rs, 18)] = FMA(T8Q, T8O, T8U); + } + { + E T8X, T90, T8V, T8Y; + T8V = W[2]; + T8X = T8V * T8W; + T90 = T8V * T8Z; + T8Y = W[3]; + cr[WS(rs, 2)] = FNMS(T8Y, T8Z, T8X); + ci[WS(rs, 2)] = FMA(T8Y, T8W, T90); + } + } + { + E T86, T8e, T8b, T8h; + { + E T84, T85, T89, T8a; + T84 = FNMS(KP707106781, T7r, T7k); + T85 = T7S + T7T; + T86 = FNMS(KP923879532, T85, T84); + T8e = FMA(KP923879532, T85, T84); + T89 = FNMS(KP707106781, T7Q, T7N); + T8a = T7G + T7z; + T8b = FNMS(KP923879532, T8a, T89); + T8h = FMA(KP923879532, T8a, T89); + } + { + E T87, T8c, T83, T88; + T83 = W[26]; + T87 = T83 * T86; + T8c = T83 * T8b; + T88 = W[27]; + cr[WS(rs, 14)] = FNMS(T88, T8b, T87); + ci[WS(rs, 14)] = FMA(T88, T86, T8c); + } + { + E T8f, T8i, T8d, T8g; + T8d = W[58]; + T8f = T8d * T8e; + T8i = T8d * T8h; + T8g = W[59]; + cr[WS(rs, 30)] = FNMS(T8g, T8h, T8f); + ci[WS(rs, 30)] = FMA(T8g, T8e, T8i); + } + } + { + E T6C, T6K, T6H, T6N; + { + E T6A, T6B, T6F, T6G; + T6A = T5K - T5R; + T6B = T6p - T6o; + T6C = FNMS(KP707106781, T6B, T6A); + T6K = FMA(KP707106781, T6B, T6A); + T6F = T6m - T6f; + T6G = T61 - T6a; + T6H = FNMS(KP707106781, T6G, T6F); + T6N = FMA(KP707106781, T6G, T6F); + } + { + E T6D, T6I, T6z, T6E; + T6z = W[54]; + T6D = T6z * T6C; + T6I = T6z * T6H; + T6E = W[55]; + cr[WS(rs, 28)] = FNMS(T6E, T6H, T6D); + ci[WS(rs, 28)] = FMA(T6E, T6C, T6I); + } + { + E T6L, T6O, T6J, T6M; + T6J = W[22]; + T6L = T6J * T6K; + T6O = T6J * T6N; + T6M = W[23]; + cr[WS(rs, 12)] = FNMS(T6M, T6N, T6L); + ci[WS(rs, 12)] = FMA(T6M, T6K, T6O); + } + } + { + E T8u, T8G, T8D, T8J; + { + E T8m, T8t, T8z, T8C; + T8m = FNMS(KP707106781, T8l, T8k); + T8t = T8p - T8s; + T8u = FNMS(KP923879532, T8t, T8m); + T8G = FMA(KP923879532, T8t, T8m); + T8z = FNMS(KP707106781, T8y, T8x); + T8C = T8A - T8B; + T8D = FNMS(KP923879532, T8C, T8z); + T8J = FMA(KP923879532, T8C, T8z); + } + { + E T8j, T8v, T8w, T8E; + T8j = W[50]; + T8v = T8j * T8u; + T8w = W[51]; + T8E = T8w * T8u; + cr[WS(rs, 26)] = FNMS(T8w, T8D, T8v); + ci[WS(rs, 26)] = FMA(T8j, T8D, T8E); + } + { + E T8F, T8H, T8I, T8K; + T8F = W[18]; + T8H = T8F * T8G; + T8I = W[19]; + T8K = T8I * T8G; + cr[WS(rs, 10)] = FNMS(T8I, T8J, T8H); + ci[WS(rs, 10)] = FMA(T8F, T8J, T8K); + } + } + { + E T6c, T6u, T6r, T6x; + { + E T5S, T6b, T6n, T6q; + T5S = T5K + T5R; + T6b = T61 + T6a; + T6c = FNMS(KP707106781, T6b, T5S); + T6u = FMA(KP707106781, T6b, T5S); + T6n = T6f + T6m; + T6q = T6o + T6p; + T6r = FNMS(KP707106781, T6q, T6n); + T6x = FMA(KP707106781, T6q, T6n); + } + { + E T5J, T6d, T6e, T6s; + T5J = W[38]; + T6d = T5J * T6c; + T6e = W[39]; + T6s = T6e * T6c; + cr[WS(rs, 20)] = FNMS(T6e, T6r, T6d); + ci[WS(rs, 20)] = FMA(T5J, T6r, T6s); + } + { + E T6t, T6v, T6w, T6y; + T6t = W[6]; + T6v = T6t * T6u; + T6w = W[7]; + T6y = T6w * T6u; + cr[WS(rs, 4)] = FNMS(T6w, T6x, T6v); + ci[WS(rs, 4)] = FMA(T6t, T6x, T6y); + } + } + { + E T74, T7c, T79, T7f; + { + E T72, T73, T77, T78; + T72 = Tf - Tu; + T73 = T6X - T6W; + T74 = T72 - T73; + T7c = T72 + T73; + T77 = T6T - T6U; + T78 = TK - TZ; + T79 = T77 - T78; + T7f = T78 + T77; + } + { + E T75, T7a, T71, T76; + T71 = W[46]; + T75 = T71 * T74; + T7a = T71 * T79; + T76 = W[47]; + cr[WS(rs, 24)] = FNMS(T76, T79, T75); + ci[WS(rs, 24)] = FMA(T76, T74, T7a); + } + { + E T7d, T7g, T7b, T7e; + T7b = W[14]; + T7d = T7b * T7c; + T7g = T7b * T7f; + T7e = W[15]; + cr[WS(rs, 8)] = FNMS(T7e, T7f, T7d); + ci[WS(rs, 8)] = FMA(T7e, T7c, T7g); + } + } + { + E T7I, T7Y, T7V, T81; + { + E T7s, T7H, T7R, T7U; + T7s = FMA(KP707106781, T7r, T7k); + T7H = T7z - T7G; + T7I = FNMS(KP923879532, T7H, T7s); + T7Y = FMA(KP923879532, T7H, T7s); + T7R = FMA(KP707106781, T7Q, T7N); + T7U = T7S - T7T; + T7V = FNMS(KP923879532, T7U, T7R); + T81 = FMA(KP923879532, T7U, T7R); + } + { + E T7h, T7J, T7K, T7W; + T7h = W[42]; + T7J = T7h * T7I; + T7K = W[43]; + T7W = T7K * T7I; + cr[WS(rs, 22)] = FNMS(T7K, T7V, T7J); + ci[WS(rs, 22)] = FMA(T7h, T7V, T7W); + } + { + E T7X, T7Z, T80, T82; + T7X = W[10]; + T7Z = T7X * T7Y; + T80 = W[11]; + T82 = T80 * T7Y; + cr[WS(rs, 6)] = FNMS(T80, T81, T7Z); + ci[WS(rs, 6)] = FMA(T7X, T81, T82); + } + } + { + E T37, T2A, T38, T2W, T2T, T3c, T2Z, T34; + T37 = FNMS(KP923879532, T2O, T2L); + { + E T1G, T27, T2y, T2z; + T1G = FMA(KP923879532, T1F, T1i); + T27 = FMA(KP668178637, T26, T1X); + T2y = FNMS(KP668178637, T2x, T2o); + T2z = T27 - T2y; + T2A = FNMS(KP831469612, T2z, T1G); + T38 = T2y + T27; + T2W = FMA(KP831469612, T2z, T1G); + } + { + E T2P, T32, T2S, T33, T2Q, T2R; + T2P = FMA(KP923879532, T2O, T2L); + T32 = FNMS(KP923879532, T1F, T1i); + T2Q = FMA(KP668178637, T2o, T2x); + T2R = FNMS(KP668178637, T1X, T26); + T2S = T2Q - T2R; + T33 = T2Q + T2R; + T2T = FNMS(KP831469612, T2S, T2P); + T3c = FMA(KP831469612, T33, T32); + T2Z = FMA(KP831469612, T2S, T2P); + T34 = FNMS(KP831469612, T33, T32); + } + { + E T2B, T2U, T11, T2C; + T11 = W[40]; + T2B = T11 * T2A; + T2U = T11 * T2T; + T2C = W[41]; + cr[WS(rs, 21)] = FNMS(T2C, T2T, T2B); + ci[WS(rs, 21)] = FMA(T2C, T2A, T2U); + } + { + E T2X, T30, T2V, T2Y; + T2V = W[8]; + T2X = T2V * T2W; + T30 = T2V * T2Z; + T2Y = W[9]; + cr[WS(rs, 5)] = FNMS(T2Y, T2Z, T2X); + ci[WS(rs, 5)] = FMA(T2Y, T2W, T30); + } + { + E T39, T36, T3a, T31, T35; + T39 = FNMS(KP831469612, T38, T37); + T36 = W[25]; + T3a = T36 * T34; + T31 = W[24]; + T35 = T31 * T34; + cr[WS(rs, 13)] = FNMS(T36, T39, T35); + ci[WS(rs, 13)] = FMA(T31, T39, T3a); + } + { + E T3f, T3e, T3g, T3b, T3d; + T3f = FMA(KP831469612, T38, T37); + T3e = W[57]; + T3g = T3e * T3c; + T3b = W[56]; + T3d = T3b * T3c; + cr[WS(rs, 29)] = FNMS(T3e, T3f, T3d); + ci[WS(rs, 29)] = FMA(T3b, T3f, T3g); + } + } + { + E T4z, T4C, T4W, T4O, T4q, T4Z, T4G, T4T; + T4z = FMA(KP923879532, T4y, T4v); + { + E T4M, T4A, T4B, T4N; + T4M = FMA(KP923879532, T49, T42); + T4A = FMA(KP668178637, T4d, T4g); + T4B = FMA(KP668178637, T4k, T4n); + T4N = T4A + T4B; + T4C = T4A - T4B; + T4W = FMA(KP831469612, T4N, T4M); + T4O = FNMS(KP831469612, T4N, T4M); + } + { + E T4a, T4R, T4p, T4S, T4h, T4o; + T4a = FNMS(KP923879532, T49, T42); + T4R = FNMS(KP923879532, T4y, T4v); + T4h = FNMS(KP668178637, T4g, T4d); + T4o = FNMS(KP668178637, T4n, T4k); + T4p = T4h + T4o; + T4S = T4h - T4o; + T4q = FNMS(KP831469612, T4p, T4a); + T4Z = FNMS(KP831469612, T4S, T4R); + T4G = FMA(KP831469612, T4p, T4a); + T4T = FMA(KP831469612, T4S, T4R); + } + { + E T4P, T4U, T4L, T4Q; + T4L = W[20]; + T4P = T4L * T4O; + T4U = T4L * T4T; + T4Q = W[21]; + cr[WS(rs, 11)] = FNMS(T4Q, T4T, T4P); + ci[WS(rs, 11)] = FMA(T4Q, T4O, T4U); + } + { + E T4X, T50, T4V, T4Y; + T4V = W[52]; + T4X = T4V * T4W; + T50 = T4V * T4Z; + T4Y = W[53]; + cr[WS(rs, 27)] = FNMS(T4Y, T4Z, T4X); + ci[WS(rs, 27)] = FMA(T4Y, T4W, T50); + } + { + E T4D, T4s, T4E, T3Z, T4r; + T4D = FNMS(KP831469612, T4C, T4z); + T4s = W[37]; + T4E = T4s * T4q; + T3Z = W[36]; + T4r = T3Z * T4q; + cr[WS(rs, 19)] = FNMS(T4s, T4D, T4r); + ci[WS(rs, 19)] = FMA(T3Z, T4D, T4E); + } + { + E T4J, T4I, T4K, T4F, T4H; + T4J = FMA(KP831469612, T4C, T4z); + T4I = W[5]; + T4K = T4I * T4G; + T4F = W[4]; + T4H = T4F * T4G; + cr[WS(rs, 3)] = FNMS(T4I, T4J, T4H); + ci[WS(rs, 3)] = FMA(T4F, T4J, T4K); + } + } + { + E T3x, T3A, T3U, T3M, T3s, T3X, T3E, T3R; + T3x = FMA(KP923879532, T3w, T3v); + { + E T3K, T3y, T3z, T3L; + T3K = FNMS(KP923879532, T3j, T3i); + T3y = FMA(KP198912367, T3l, T3m); + T3z = FNMS(KP198912367, T3o, T3p); + T3L = T3z - T3y; + T3A = T3y + T3z; + T3U = FMA(KP980785280, T3L, T3K); + T3M = FNMS(KP980785280, T3L, T3K); + } + { + E T3k, T3P, T3r, T3Q, T3n, T3q; + T3k = FMA(KP923879532, T3j, T3i); + T3P = FNMS(KP923879532, T3w, T3v); + T3n = FNMS(KP198912367, T3m, T3l); + T3q = FMA(KP198912367, T3p, T3o); + T3r = T3n + T3q; + T3Q = T3n - T3q; + T3s = FNMS(KP980785280, T3r, T3k); + T3X = FMA(KP980785280, T3Q, T3P); + T3E = FMA(KP980785280, T3r, T3k); + T3R = FNMS(KP980785280, T3Q, T3P); + } + { + E T3N, T3S, T3J, T3O; + T3J = W[48]; + T3N = T3J * T3M; + T3S = T3J * T3R; + T3O = W[49]; + cr[WS(rs, 25)] = FNMS(T3O, T3R, T3N); + ci[WS(rs, 25)] = FMA(T3O, T3M, T3S); + } + { + E T3V, T3Y, T3T, T3W; + T3T = W[16]; + T3V = T3T * T3U; + T3Y = T3T * T3X; + T3W = W[17]; + cr[WS(rs, 9)] = FNMS(T3W, T3X, T3V); + ci[WS(rs, 9)] = FMA(T3W, T3U, T3Y); + } + { + E T3B, T3u, T3C, T3h, T3t; + T3B = FNMS(KP980785280, T3A, T3x); + T3u = W[33]; + T3C = T3u * T3s; + T3h = W[32]; + T3t = T3h * T3s; + cr[WS(rs, 17)] = FNMS(T3u, T3B, T3t); + ci[WS(rs, 17)] = FMA(T3h, T3B, T3C); + } + { + E T3H, T3G, T3I, T3D, T3F; + T3H = FMA(KP980785280, T3A, T3x); + T3G = W[1]; + T3I = T3G * T3E; + T3D = W[0]; + T3F = T3D * T3E; + cr[WS(rs, 1)] = FNMS(T3G, T3H, T3F); + ci[WS(rs, 1)] = FMA(T3D, T3H, T3I); + } + } + { + E T5h, T5k, T5E, T5w, T5c, T5H, T5o, T5B; + T5h = FMA(KP923879532, T5g, T5f); + { + E T5u, T5i, T5j, T5v; + T5u = FMA(KP923879532, T53, T52); + T5i = FMA(KP198912367, T55, T56); + T5j = FMA(KP198912367, T58, T59); + T5v = T5i + T5j; + T5k = T5i - T5j; + T5E = FMA(KP980785280, T5v, T5u); + T5w = FNMS(KP980785280, T5v, T5u); + } + { + E T54, T5z, T5b, T5A, T57, T5a; + T54 = FNMS(KP923879532, T53, T52); + T5z = FNMS(KP923879532, T5g, T5f); + T57 = FNMS(KP198912367, T56, T55); + T5a = FNMS(KP198912367, T59, T58); + T5b = T57 + T5a; + T5A = T5a - T57; + T5c = FMA(KP980785280, T5b, T54); + T5H = FNMS(KP980785280, T5A, T5z); + T5o = FNMS(KP980785280, T5b, T54); + T5B = FMA(KP980785280, T5A, T5z); + } + { + E T5x, T5C, T5t, T5y; + T5t = W[28]; + T5x = T5t * T5w; + T5C = T5t * T5B; + T5y = W[29]; + cr[WS(rs, 15)] = FNMS(T5y, T5B, T5x); + ci[WS(rs, 15)] = FMA(T5y, T5w, T5C); + } + { + E T5F, T5I, T5D, T5G; + T5D = W[60]; + T5F = T5D * T5E; + T5I = T5D * T5H; + T5G = W[61]; + cr[WS(rs, 31)] = FNMS(T5G, T5H, T5F); + ci[WS(rs, 31)] = FMA(T5G, T5E, T5I); + } + { + E T5l, T5e, T5m, T51, T5d; + T5l = FNMS(KP980785280, T5k, T5h); + T5e = W[45]; + T5m = T5e * T5c; + T51 = W[44]; + T5d = T51 * T5c; + cr[WS(rs, 23)] = FNMS(T5e, T5l, T5d); + ci[WS(rs, 23)] = FMA(T51, T5l, T5m); + } + { + E T5r, T5q, T5s, T5n, T5p; + T5r = FMA(KP980785280, T5k, T5h); + T5q = W[13]; + T5s = T5q * T5o; + T5n = W[12]; + T5p = T5n * T5o; + cr[WS(rs, 7)] = FNMS(T5q, T5r, T5p); + ci[WS(rs, 7)] = FMA(T5n, T5r, T5s); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hb_32", twinstr, &GENUS, {236, 62, 198, 0} }; + +void X(codelet_hb_32) (planner *p) { + X(khc2hc_register) (p, hb_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hb_32 -include rdft/scalar/hb.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 340 additions, 114 multiplications, 94 fused multiply/add), + * 98 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 62, MAKE_VOLATILE_STRIDE(64, rs)) { + E T4o, T6y, T70, T5u, Tf, T12, T5x, T6z, T3m, T3Y, T29, T2y, T4v, T71, T2U; + E T3M, Tu, T1U, T6D, T73, T6G, T74, T1h, T2z, T2X, T3o, T4D, T5A, T4K, T5z; + E T30, T3n, TK, T1j, T6S, T7w, T6V, T7v, T1y, T2B, T3c, T3S, T4X, T61, T54; + E T62, T3f, T3T, TZ, T1A, T6L, T7z, T6O, T7y, T1P, T2C, T35, T3P, T5g, T64; + E T5n, T65, T38, T3Q; + { + E T3, T4m, T24, T4q, T27, T4t, T6, T5s, Ta, T4p, T1X, T5t, T20, T4n, Td; + E T4s; + { + E T1, T2, T22, T23; + T1 = cr[0]; + T2 = ci[WS(rs, 15)]; + T3 = T1 + T2; + T4m = T1 - T2; + T22 = ci[WS(rs, 27)]; + T23 = cr[WS(rs, 20)]; + T24 = T22 - T23; + T4q = T22 + T23; + } + { + E T25, T26, T4, T5; + T25 = ci[WS(rs, 19)]; + T26 = cr[WS(rs, 28)]; + T27 = T25 - T26; + T4t = T25 + T26; + T4 = cr[WS(rs, 8)]; + T5 = ci[WS(rs, 7)]; + T6 = T4 + T5; + T5s = T4 - T5; + } + { + E T8, T9, T1V, T1W; + T8 = cr[WS(rs, 4)]; + T9 = ci[WS(rs, 11)]; + Ta = T8 + T9; + T4p = T8 - T9; + T1V = ci[WS(rs, 31)]; + T1W = cr[WS(rs, 16)]; + T1X = T1V - T1W; + T5t = T1V + T1W; + } + { + E T1Y, T1Z, Tb, Tc; + T1Y = ci[WS(rs, 23)]; + T1Z = cr[WS(rs, 24)]; + T20 = T1Y - T1Z; + T4n = T1Y + T1Z; + Tb = ci[WS(rs, 3)]; + Tc = cr[WS(rs, 12)]; + Td = Tb + Tc; + T4s = Tb - Tc; + } + { + E T7, Te, T21, T28; + T4o = T4m - T4n; + T6y = T4m + T4n; + T70 = T5t - T5s; + T5u = T5s + T5t; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T12 = T7 - Te; + { + E T5v, T5w, T3k, T3l; + T5v = T4p + T4q; + T5w = T4s + T4t; + T5x = KP707106781 * (T5v - T5w); + T6z = KP707106781 * (T5v + T5w); + T3k = T1X - T20; + T3l = Ta - Td; + T3m = T3k - T3l; + T3Y = T3l + T3k; + } + T21 = T1X + T20; + T28 = T24 + T27; + T29 = T21 - T28; + T2y = T21 + T28; + { + E T4r, T4u, T2S, T2T; + T4r = T4p - T4q; + T4u = T4s - T4t; + T4v = KP707106781 * (T4r + T4u); + T71 = KP707106781 * (T4r - T4u); + T2S = T3 - T6; + T2T = T27 - T24; + T2U = T2S - T2T; + T3M = T2S + T2T; + } + } + } + { + E Ti, T4H, T1c, T4F, T1f, T4I, Tl, T4E, Tp, T4A, T15, T4y, T18, T4B, Ts; + E T4x; + { + E Tg, Th, T1a, T1b; + Tg = cr[WS(rs, 2)]; + Th = ci[WS(rs, 13)]; + Ti = Tg + Th; + T4H = Tg - Th; + T1a = ci[WS(rs, 29)]; + T1b = cr[WS(rs, 18)]; + T1c = T1a - T1b; + T4F = T1a + T1b; + } + { + E T1d, T1e, Tj, Tk; + T1d = ci[WS(rs, 21)]; + T1e = cr[WS(rs, 26)]; + T1f = T1d - T1e; + T4I = T1d + T1e; + Tj = cr[WS(rs, 10)]; + Tk = ci[WS(rs, 5)]; + Tl = Tj + Tk; + T4E = Tj - Tk; + } + { + E Tn, To, T13, T14; + Tn = ci[WS(rs, 1)]; + To = cr[WS(rs, 14)]; + Tp = Tn + To; + T4A = Tn - To; + T13 = ci[WS(rs, 17)]; + T14 = cr[WS(rs, 30)]; + T15 = T13 - T14; + T4y = T13 + T14; + } + { + E T16, T17, Tq, Tr; + T16 = ci[WS(rs, 25)]; + T17 = cr[WS(rs, 22)]; + T18 = T16 - T17; + T4B = T16 + T17; + Tq = cr[WS(rs, 6)]; + Tr = ci[WS(rs, 9)]; + Ts = Tq + Tr; + T4x = Tq - Tr; + } + { + E Tm, Tt, T6B, T6C; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T1U = Tm - Tt; + T6B = T4H + T4I; + T6C = T4F - T4E; + T6D = FNMS(KP923879532, T6C, KP382683432 * T6B); + T73 = FMA(KP382683432, T6C, KP923879532 * T6B); + } + { + E T6E, T6F, T19, T1g; + T6E = T4A + T4B; + T6F = T4x + T4y; + T6G = FNMS(KP923879532, T6F, KP382683432 * T6E); + T74 = FMA(KP382683432, T6F, KP923879532 * T6E); + T19 = T15 + T18; + T1g = T1c + T1f; + T1h = T19 - T1g; + T2z = T1g + T19; + } + { + E T2V, T2W, T4z, T4C; + T2V = T15 - T18; + T2W = Tp - Ts; + T2X = T2V - T2W; + T3o = T2W + T2V; + T4z = T4x - T4y; + T4C = T4A - T4B; + T4D = FNMS(KP382683432, T4C, KP923879532 * T4z); + T5A = FMA(KP382683432, T4z, KP923879532 * T4C); + } + { + E T4G, T4J, T2Y, T2Z; + T4G = T4E + T4F; + T4J = T4H - T4I; + T4K = FMA(KP923879532, T4G, KP382683432 * T4J); + T5z = FNMS(KP382683432, T4G, KP923879532 * T4J); + T2Y = Ti - Tl; + T2Z = T1c - T1f; + T30 = T2Y + T2Z; + T3n = T2Y - T2Z; + } + } + { + E Ty, T4N, TB, T4Y, T1p, T4O, T1m, T4Z, TI, T52, T1w, T4V, TF, T51, T1t; + E T4S; + { + E Tw, Tx, T1k, T1l; + Tw = cr[WS(rs, 1)]; + Tx = ci[WS(rs, 14)]; + Ty = Tw + Tx; + T4N = Tw - Tx; + { + E Tz, TA, T1n, T1o; + Tz = cr[WS(rs, 9)]; + TA = ci[WS(rs, 6)]; + TB = Tz + TA; + T4Y = Tz - TA; + T1n = ci[WS(rs, 22)]; + T1o = cr[WS(rs, 25)]; + T1p = T1n - T1o; + T4O = T1n + T1o; + } + T1k = ci[WS(rs, 30)]; + T1l = cr[WS(rs, 17)]; + T1m = T1k - T1l; + T4Z = T1k + T1l; + { + E TG, TH, T4T, T1u, T1v, T4U; + TG = ci[WS(rs, 2)]; + TH = cr[WS(rs, 13)]; + T4T = TG - TH; + T1u = ci[WS(rs, 18)]; + T1v = cr[WS(rs, 29)]; + T4U = T1u + T1v; + TI = TG + TH; + T52 = T4T + T4U; + T1w = T1u - T1v; + T4V = T4T - T4U; + } + { + E TD, TE, T4Q, T1r, T1s, T4R; + TD = cr[WS(rs, 5)]; + TE = ci[WS(rs, 10)]; + T4Q = TD - TE; + T1r = ci[WS(rs, 26)]; + T1s = cr[WS(rs, 21)]; + T4R = T1r + T1s; + TF = TD + TE; + T51 = T4Q + T4R; + T1t = T1r - T1s; + T4S = T4Q - T4R; + } + } + { + E TC, TJ, T6Q, T6R; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T1j = TC - TJ; + T6Q = T4Z - T4Y; + T6R = KP707106781 * (T4S - T4V); + T6S = T6Q + T6R; + T7w = T6Q - T6R; + } + { + E T6T, T6U, T1q, T1x; + T6T = T4N + T4O; + T6U = KP707106781 * (T51 + T52); + T6V = T6T - T6U; + T7v = T6T + T6U; + T1q = T1m + T1p; + T1x = T1t + T1w; + T1y = T1q - T1x; + T2B = T1q + T1x; + } + { + E T3a, T3b, T4P, T4W; + T3a = T1m - T1p; + T3b = TF - TI; + T3c = T3a - T3b; + T3S = T3b + T3a; + T4P = T4N - T4O; + T4W = KP707106781 * (T4S + T4V); + T4X = T4P - T4W; + T61 = T4P + T4W; + } + { + E T50, T53, T3d, T3e; + T50 = T4Y + T4Z; + T53 = KP707106781 * (T51 - T52); + T54 = T50 - T53; + T62 = T50 + T53; + T3d = Ty - TB; + T3e = T1w - T1t; + T3f = T3d - T3e; + T3T = T3d + T3e; + } + } + { + E TN, T56, TQ, T5h, T1G, T57, T1D, T5i, TX, T5l, T1N, T5e, TU, T5k, T1K; + E T5b; + { + E TL, TM, T1B, T1C; + TL = ci[0]; + TM = cr[WS(rs, 15)]; + TN = TL + TM; + T56 = TL - TM; + { + E TO, TP, T1E, T1F; + TO = cr[WS(rs, 7)]; + TP = ci[WS(rs, 8)]; + TQ = TO + TP; + T5h = TO - TP; + T1E = ci[WS(rs, 24)]; + T1F = cr[WS(rs, 23)]; + T1G = T1E - T1F; + T57 = T1E + T1F; + } + T1B = ci[WS(rs, 16)]; + T1C = cr[WS(rs, 31)]; + T1D = T1B - T1C; + T5i = T1B + T1C; + { + E TV, TW, T5c, T1L, T1M, T5d; + TV = ci[WS(rs, 4)]; + TW = cr[WS(rs, 11)]; + T5c = TV - TW; + T1L = ci[WS(rs, 20)]; + T1M = cr[WS(rs, 27)]; + T5d = T1L + T1M; + TX = TV + TW; + T5l = T5c + T5d; + T1N = T1L - T1M; + T5e = T5c - T5d; + } + { + E TS, TT, T59, T1I, T1J, T5a; + TS = cr[WS(rs, 3)]; + TT = ci[WS(rs, 12)]; + T59 = TS - TT; + T1I = ci[WS(rs, 28)]; + T1J = cr[WS(rs, 19)]; + T5a = T1I + T1J; + TU = TS + TT; + T5k = T59 + T5a; + T1K = T1I - T1J; + T5b = T59 - T5a; + } + } + { + E TR, TY, T6J, T6K; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T1A = TR - TY; + T6J = KP707106781 * (T5b - T5e); + T6K = T5h + T5i; + T6L = T6J - T6K; + T7z = T6K + T6J; + } + { + E T6M, T6N, T1H, T1O; + T6M = T56 + T57; + T6N = KP707106781 * (T5k + T5l); + T6O = T6M - T6N; + T7y = T6M + T6N; + T1H = T1D + T1G; + T1O = T1K + T1N; + T1P = T1H - T1O; + T2C = T1H + T1O; + } + { + E T33, T34, T58, T5f; + T33 = T1D - T1G; + T34 = TU - TX; + T35 = T33 - T34; + T3P = T34 + T33; + T58 = T56 - T57; + T5f = KP707106781 * (T5b + T5e); + T5g = T58 - T5f; + T64 = T58 + T5f; + } + { + E T5j, T5m, T36, T37; + T5j = T5h - T5i; + T5m = KP707106781 * (T5k - T5l); + T5n = T5j - T5m; + T65 = T5j + T5m; + T36 = TN - TQ; + T37 = T1N - T1K; + T38 = T36 - T37; + T3Q = T36 + T37; + } + } + { + E Tv, T10, T2w, T2A, T2D, T2E, T2v, T2x; + Tv = Tf + Tu; + T10 = TK + TZ; + T2w = Tv - T10; + T2A = T2y + T2z; + T2D = T2B + T2C; + T2E = T2A - T2D; + cr[0] = Tv + T10; + ci[0] = T2A + T2D; + T2v = W[30]; + T2x = W[31]; + cr[WS(rs, 16)] = FNMS(T2x, T2E, T2v * T2w); + ci[WS(rs, 16)] = FMA(T2x, T2w, T2v * T2E); + } + { + E T2I, T2O, T2M, T2Q; + { + E T2G, T2H, T2K, T2L; + T2G = Tf - Tu; + T2H = T2C - T2B; + T2I = T2G - T2H; + T2O = T2G + T2H; + T2K = T2y - T2z; + T2L = TK - TZ; + T2M = T2K - T2L; + T2Q = T2L + T2K; + } + { + E T2F, T2J, T2N, T2P; + T2F = W[46]; + T2J = W[47]; + cr[WS(rs, 24)] = FNMS(T2J, T2M, T2F * T2I); + ci[WS(rs, 24)] = FMA(T2F, T2M, T2J * T2I); + T2N = W[14]; + T2P = W[15]; + cr[WS(rs, 8)] = FNMS(T2P, T2Q, T2N * T2O); + ci[WS(rs, 8)] = FMA(T2N, T2Q, T2P * T2O); + } + } + { + E T1i, T2a, T2o, T2k, T2d, T2l, T1R, T2p; + T1i = T12 + T1h; + T2a = T1U + T29; + T2o = T29 - T1U; + T2k = T12 - T1h; + { + E T2b, T2c, T1z, T1Q; + T2b = T1j + T1y; + T2c = T1P - T1A; + T2d = KP707106781 * (T2b + T2c); + T2l = KP707106781 * (T2c - T2b); + T1z = T1j - T1y; + T1Q = T1A + T1P; + T1R = KP707106781 * (T1z + T1Q); + T2p = KP707106781 * (T1z - T1Q); + } + { + E T1S, T2e, T11, T1T; + T1S = T1i - T1R; + T2e = T2a - T2d; + T11 = W[38]; + T1T = W[39]; + cr[WS(rs, 20)] = FNMS(T1T, T2e, T11 * T1S); + ci[WS(rs, 20)] = FMA(T1T, T1S, T11 * T2e); + } + { + E T2s, T2u, T2r, T2t; + T2s = T2k + T2l; + T2u = T2o + T2p; + T2r = W[22]; + T2t = W[23]; + cr[WS(rs, 12)] = FNMS(T2t, T2u, T2r * T2s); + ci[WS(rs, 12)] = FMA(T2r, T2u, T2t * T2s); + } + { + E T2g, T2i, T2f, T2h; + T2g = T1i + T1R; + T2i = T2a + T2d; + T2f = W[6]; + T2h = W[7]; + cr[WS(rs, 4)] = FNMS(T2h, T2i, T2f * T2g); + ci[WS(rs, 4)] = FMA(T2h, T2g, T2f * T2i); + } + { + E T2m, T2q, T2j, T2n; + T2m = T2k - T2l; + T2q = T2o - T2p; + T2j = W[54]; + T2n = W[55]; + cr[WS(rs, 28)] = FNMS(T2n, T2q, T2j * T2m); + ci[WS(rs, 28)] = FMA(T2j, T2q, T2n * T2m); + } + } + { + E T3O, T4a, T40, T4e, T3V, T4f, T43, T4b, T3N, T3Z; + T3N = KP707106781 * (T3n + T3o); + T3O = T3M - T3N; + T4a = T3M + T3N; + T3Z = KP707106781 * (T30 + T2X); + T40 = T3Y - T3Z; + T4e = T3Y + T3Z; + { + E T3R, T3U, T41, T42; + T3R = FNMS(KP382683432, T3Q, KP923879532 * T3P); + T3U = FMA(KP923879532, T3S, KP382683432 * T3T); + T3V = T3R - T3U; + T4f = T3U + T3R; + T41 = FNMS(KP382683432, T3S, KP923879532 * T3T); + T42 = FMA(KP382683432, T3P, KP923879532 * T3Q); + T43 = T41 - T42; + T4b = T41 + T42; + } + { + E T3W, T44, T3L, T3X; + T3W = T3O - T3V; + T44 = T40 - T43; + T3L = W[50]; + T3X = W[51]; + cr[WS(rs, 26)] = FNMS(T3X, T44, T3L * T3W); + ci[WS(rs, 26)] = FMA(T3X, T3W, T3L * T44); + } + { + E T4i, T4k, T4h, T4j; + T4i = T4a + T4b; + T4k = T4e + T4f; + T4h = W[2]; + T4j = W[3]; + cr[WS(rs, 2)] = FNMS(T4j, T4k, T4h * T4i); + ci[WS(rs, 2)] = FMA(T4h, T4k, T4j * T4i); + } + { + E T46, T48, T45, T47; + T46 = T3O + T3V; + T48 = T40 + T43; + T45 = W[18]; + T47 = W[19]; + cr[WS(rs, 10)] = FNMS(T47, T48, T45 * T46); + ci[WS(rs, 10)] = FMA(T47, T46, T45 * T48); + } + { + E T4c, T4g, T49, T4d; + T4c = T4a - T4b; + T4g = T4e - T4f; + T49 = W[34]; + T4d = W[35]; + cr[WS(rs, 18)] = FNMS(T4d, T4g, T49 * T4c); + ci[WS(rs, 18)] = FMA(T49, T4g, T4d * T4c); + } + } + { + E T32, T3A, T3q, T3E, T3h, T3F, T3t, T3B, T31, T3p; + T31 = KP707106781 * (T2X - T30); + T32 = T2U - T31; + T3A = T2U + T31; + T3p = KP707106781 * (T3n - T3o); + T3q = T3m - T3p; + T3E = T3m + T3p; + { + E T39, T3g, T3r, T3s; + T39 = FNMS(KP923879532, T38, KP382683432 * T35); + T3g = FMA(KP382683432, T3c, KP923879532 * T3f); + T3h = T39 - T3g; + T3F = T3g + T39; + T3r = FNMS(KP923879532, T3c, KP382683432 * T3f); + T3s = FMA(KP923879532, T35, KP382683432 * T38); + T3t = T3r - T3s; + T3B = T3r + T3s; + } + { + E T3i, T3u, T2R, T3j; + T3i = T32 - T3h; + T3u = T3q - T3t; + T2R = W[58]; + T3j = W[59]; + cr[WS(rs, 30)] = FNMS(T3j, T3u, T2R * T3i); + ci[WS(rs, 30)] = FMA(T3j, T3i, T2R * T3u); + } + { + E T3I, T3K, T3H, T3J; + T3I = T3A + T3B; + T3K = T3E + T3F; + T3H = W[10]; + T3J = W[11]; + cr[WS(rs, 6)] = FNMS(T3J, T3K, T3H * T3I); + ci[WS(rs, 6)] = FMA(T3H, T3K, T3J * T3I); + } + { + E T3w, T3y, T3v, T3x; + T3w = T32 + T3h; + T3y = T3q + T3t; + T3v = W[26]; + T3x = W[27]; + cr[WS(rs, 14)] = FNMS(T3x, T3y, T3v * T3w); + ci[WS(rs, 14)] = FMA(T3x, T3w, T3v * T3y); + } + { + E T3C, T3G, T3z, T3D; + T3C = T3A - T3B; + T3G = T3E - T3F; + T3z = W[42]; + T3D = W[43]; + cr[WS(rs, 22)] = FNMS(T3D, T3G, T3z * T3C); + ci[WS(rs, 22)] = FMA(T3z, T3G, T3D * T3C); + } + } + { + E T60, T6m, T6f, T6n, T67, T6r, T6c, T6q; + { + E T5Y, T5Z, T6d, T6e; + T5Y = T4o + T4v; + T5Z = T5z + T5A; + T60 = T5Y + T5Z; + T6m = T5Y - T5Z; + T6d = FMA(KP195090322, T61, KP980785280 * T62); + T6e = FNMS(KP195090322, T64, KP980785280 * T65); + T6f = T6d + T6e; + T6n = T6e - T6d; + } + { + E T63, T66, T6a, T6b; + T63 = FNMS(KP195090322, T62, KP980785280 * T61); + T66 = FMA(KP980785280, T64, KP195090322 * T65); + T67 = T63 + T66; + T6r = T63 - T66; + T6a = T5u + T5x; + T6b = T4K + T4D; + T6c = T6a + T6b; + T6q = T6a - T6b; + } + { + E T68, T6g, T5X, T69; + T68 = T60 - T67; + T6g = T6c - T6f; + T5X = W[32]; + T69 = W[33]; + cr[WS(rs, 17)] = FNMS(T69, T6g, T5X * T68); + ci[WS(rs, 17)] = FMA(T69, T68, T5X * T6g); + } + { + E T6u, T6w, T6t, T6v; + T6u = T6m + T6n; + T6w = T6q + T6r; + T6t = W[16]; + T6v = W[17]; + cr[WS(rs, 9)] = FNMS(T6v, T6w, T6t * T6u); + ci[WS(rs, 9)] = FMA(T6t, T6w, T6v * T6u); + } + { + E T6i, T6k, T6h, T6j; + T6i = T60 + T67; + T6k = T6c + T6f; + T6h = W[0]; + T6j = W[1]; + cr[WS(rs, 1)] = FNMS(T6j, T6k, T6h * T6i); + ci[WS(rs, 1)] = FMA(T6j, T6i, T6h * T6k); + } + { + E T6o, T6s, T6l, T6p; + T6o = T6m - T6n; + T6s = T6q - T6r; + T6l = W[48]; + T6p = W[49]; + cr[WS(rs, 25)] = FNMS(T6p, T6s, T6l * T6o); + ci[WS(rs, 25)] = FMA(T6l, T6s, T6p * T6o); + } + } + { + E T7u, T7Q, T7J, T7R, T7B, T7V, T7G, T7U; + { + E T7s, T7t, T7H, T7I; + T7s = T6y + T6z; + T7t = T73 + T74; + T7u = T7s - T7t; + T7Q = T7s + T7t; + T7H = FMA(KP195090322, T7w, KP980785280 * T7v); + T7I = FMA(KP195090322, T7z, KP980785280 * T7y); + T7J = T7H - T7I; + T7R = T7H + T7I; + } + { + E T7x, T7A, T7E, T7F; + T7x = FNMS(KP980785280, T7w, KP195090322 * T7v); + T7A = FNMS(KP980785280, T7z, KP195090322 * T7y); + T7B = T7x + T7A; + T7V = T7x - T7A; + T7E = T70 - T71; + T7F = T6D - T6G; + T7G = T7E + T7F; + T7U = T7E - T7F; + } + { + E T7C, T7K, T7r, T7D; + T7C = T7u - T7B; + T7K = T7G - T7J; + T7r = W[44]; + T7D = W[45]; + cr[WS(rs, 23)] = FNMS(T7D, T7K, T7r * T7C); + ci[WS(rs, 23)] = FMA(T7D, T7C, T7r * T7K); + } + { + E T7Y, T80, T7X, T7Z; + T7Y = T7Q + T7R; + T80 = T7U - T7V; + T7X = W[60]; + T7Z = W[61]; + cr[WS(rs, 31)] = FNMS(T7Z, T80, T7X * T7Y); + ci[WS(rs, 31)] = FMA(T7X, T80, T7Z * T7Y); + } + { + E T7M, T7O, T7L, T7N; + T7M = T7u + T7B; + T7O = T7G + T7J; + T7L = W[12]; + T7N = W[13]; + cr[WS(rs, 7)] = FNMS(T7N, T7O, T7L * T7M); + ci[WS(rs, 7)] = FMA(T7N, T7M, T7L * T7O); + } + { + E T7S, T7W, T7P, T7T; + T7S = T7Q - T7R; + T7W = T7U + T7V; + T7P = W[28]; + T7T = W[29]; + cr[WS(rs, 15)] = FNMS(T7T, T7W, T7P * T7S); + ci[WS(rs, 15)] = FMA(T7P, T7W, T7T * T7S); + } + } + { + E T4M, T5M, T5F, T5N, T5p, T5R, T5C, T5Q; + { + E T4w, T4L, T5D, T5E; + T4w = T4o - T4v; + T4L = T4D - T4K; + T4M = T4w + T4L; + T5M = T4w - T4L; + T5D = FMA(KP831469612, T4X, KP555570233 * T54); + T5E = FNMS(KP831469612, T5g, KP555570233 * T5n); + T5F = T5D + T5E; + T5N = T5E - T5D; + } + { + E T55, T5o, T5y, T5B; + T55 = FNMS(KP831469612, T54, KP555570233 * T4X); + T5o = FMA(KP555570233, T5g, KP831469612 * T5n); + T5p = T55 + T5o; + T5R = T55 - T5o; + T5y = T5u - T5x; + T5B = T5z - T5A; + T5C = T5y + T5B; + T5Q = T5y - T5B; + } + { + E T5q, T5G, T4l, T5r; + T5q = T4M - T5p; + T5G = T5C - T5F; + T4l = W[40]; + T5r = W[41]; + cr[WS(rs, 21)] = FNMS(T5r, T5G, T4l * T5q); + ci[WS(rs, 21)] = FMA(T5r, T5q, T4l * T5G); + } + { + E T5U, T5W, T5T, T5V; + T5U = T5M + T5N; + T5W = T5Q + T5R; + T5T = W[24]; + T5V = W[25]; + cr[WS(rs, 13)] = FNMS(T5V, T5W, T5T * T5U); + ci[WS(rs, 13)] = FMA(T5T, T5W, T5V * T5U); + } + { + E T5I, T5K, T5H, T5J; + T5I = T4M + T5p; + T5K = T5C + T5F; + T5H = W[8]; + T5J = W[9]; + cr[WS(rs, 5)] = FNMS(T5J, T5K, T5H * T5I); + ci[WS(rs, 5)] = FMA(T5J, T5I, T5H * T5K); + } + { + E T5O, T5S, T5L, T5P; + T5O = T5M - T5N; + T5S = T5Q - T5R; + T5L = W[56]; + T5P = W[57]; + cr[WS(rs, 29)] = FNMS(T5P, T5S, T5L * T5O); + ci[WS(rs, 29)] = FMA(T5L, T5S, T5P * T5O); + } + } + { + E T6I, T7g, T79, T7h, T6X, T7l, T76, T7k; + { + E T6A, T6H, T77, T78; + T6A = T6y - T6z; + T6H = T6D + T6G; + T6I = T6A - T6H; + T7g = T6A + T6H; + T77 = FNMS(KP555570233, T6S, KP831469612 * T6V); + T78 = FMA(KP555570233, T6L, KP831469612 * T6O); + T79 = T77 - T78; + T7h = T77 + T78; + } + { + E T6P, T6W, T72, T75; + T6P = FNMS(KP555570233, T6O, KP831469612 * T6L); + T6W = FMA(KP831469612, T6S, KP555570233 * T6V); + T6X = T6P - T6W; + T7l = T6W + T6P; + T72 = T70 + T71; + T75 = T73 - T74; + T76 = T72 - T75; + T7k = T72 + T75; + } + { + E T6Y, T7a, T6x, T6Z; + T6Y = T6I - T6X; + T7a = T76 - T79; + T6x = W[52]; + T6Z = W[53]; + cr[WS(rs, 27)] = FNMS(T6Z, T7a, T6x * T6Y); + ci[WS(rs, 27)] = FMA(T6Z, T6Y, T6x * T7a); + } + { + E T7o, T7q, T7n, T7p; + T7o = T7g + T7h; + T7q = T7k + T7l; + T7n = W[4]; + T7p = W[5]; + cr[WS(rs, 3)] = FNMS(T7p, T7q, T7n * T7o); + ci[WS(rs, 3)] = FMA(T7n, T7q, T7p * T7o); + } + { + E T7c, T7e, T7b, T7d; + T7c = T6I + T6X; + T7e = T76 + T79; + T7b = W[20]; + T7d = W[21]; + cr[WS(rs, 11)] = FNMS(T7d, T7e, T7b * T7c); + ci[WS(rs, 11)] = FMA(T7d, T7c, T7b * T7e); + } + { + E T7i, T7m, T7f, T7j; + T7i = T7g - T7h; + T7m = T7k - T7l; + T7f = W[36]; + T7j = W[37]; + cr[WS(rs, 19)] = FNMS(T7j, T7m, T7f * T7i); + ci[WS(rs, 19)] = FMA(T7f, T7m, T7j * T7i); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hb_32", twinstr, &GENUS, {340, 114, 94, 0} }; + +void X(codelet_hb_32) (planner *p) { + X(khc2hc_register) (p, hb_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_4.c new file mode 100644 index 000000000..69c8f16f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_4.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hb_4 -include rdft/scalar/hb.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 22 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs)) { + E T3, T6, T8, Td, Tx, Tu, Tm, Tg, Tr; + { + E Tb, Tc, Tq, Te, Tf, Tl, Tk, Tp; + Tb = ci[WS(rs, 3)]; + Tc = cr[WS(rs, 2)]; + Tq = Tb + Tc; + Te = ci[WS(rs, 2)]; + Tf = cr[WS(rs, 3)]; + Tl = Te + Tf; + { + E T1, T2, T4, T5; + T1 = cr[0]; + T2 = ci[WS(rs, 1)]; + T3 = T1 + T2; + Tk = T1 - T2; + T4 = cr[WS(rs, 1)]; + T5 = ci[0]; + T6 = T4 + T5; + Tp = T4 - T5; + } + T8 = T3 - T6; + Td = Tb - Tc; + Tx = Tq - Tp; + Tu = Tk + Tl; + Tm = Tk - Tl; + Tg = Te - Tf; + Tr = Tp + Tq; + } + cr[0] = T3 + T6; + ci[0] = Td + Tg; + { + E Tn, Ts, Tj, To; + Tj = W[0]; + Tn = Tj * Tm; + Ts = Tj * Tr; + To = W[1]; + cr[WS(rs, 1)] = FNMS(To, Tr, Tn); + ci[WS(rs, 1)] = FMA(To, Tm, Ts); + } + { + E Tv, Ty, Tt, Tw; + Tt = W[4]; + Tv = Tt * Tu; + Ty = Tt * Tx; + Tw = W[5]; + cr[WS(rs, 3)] = FNMS(Tw, Tx, Tv); + ci[WS(rs, 3)] = FMA(Tw, Tu, Ty); + } + { + E Th, Ta, Ti, T7, T9; + Th = Td - Tg; + Ta = W[3]; + Ti = Ta * T8; + T7 = W[2]; + T9 = T7 * T8; + cr[WS(rs, 2)] = FNMS(Ta, Th, T9); + ci[WS(rs, 2)] = FMA(T7, Th, Ti); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hb_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hb_4) (planner *p) { + X(khc2hc_register) (p, hb_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hb_4 -include rdft/scalar/hb.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs)) { + E T3, Ti, T6, Tm, Tc, Tn, Tf, Tj; + { + E T1, T2, T4, T5; + T1 = cr[0]; + T2 = ci[WS(rs, 1)]; + T3 = T1 + T2; + Ti = T1 - T2; + T4 = cr[WS(rs, 1)]; + T5 = ci[0]; + T6 = T4 + T5; + Tm = T4 - T5; + } + { + E Ta, Tb, Td, Te; + Ta = ci[WS(rs, 3)]; + Tb = cr[WS(rs, 2)]; + Tc = Ta - Tb; + Tn = Ta + Tb; + Td = ci[WS(rs, 2)]; + Te = cr[WS(rs, 3)]; + Tf = Td - Te; + Tj = Td + Te; + } + cr[0] = T3 + T6; + ci[0] = Tc + Tf; + { + E T8, Tg, T7, T9; + T8 = T3 - T6; + Tg = Tc - Tf; + T7 = W[2]; + T9 = W[3]; + cr[WS(rs, 2)] = FNMS(T9, Tg, T7 * T8); + ci[WS(rs, 2)] = FMA(T9, T8, T7 * Tg); + } + { + E Tk, To, Th, Tl; + Tk = Ti - Tj; + To = Tm + Tn; + Th = W[0]; + Tl = W[1]; + cr[WS(rs, 1)] = FNMS(Tl, To, Th * Tk); + ci[WS(rs, 1)] = FMA(Th, To, Tl * Tk); + } + { + E Tq, Ts, Tp, Tr; + Tq = Ti + Tj; + Ts = Tn - Tm; + Tp = W[4]; + Tr = W[5]; + cr[WS(rs, 3)] = FNMS(Tr, Ts, Tp * Tq); + ci[WS(rs, 3)] = FMA(Tp, Ts, Tr * Tq); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hb_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hb_4) (planner *p) { + X(khc2hc_register) (p, hb_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_5.c new file mode 100644 index 000000000..3e24c59bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_5.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 5 -dif -name hb_5 -include rdft/scalar/hb.h */ + +/* + * This function contains 40 FP additions, 34 FP multiplications, + * (or, 14 additions, 8 multiplications, 26 fused multiply/add), + * 27 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs)) { + E T1, Tb, TM, Tw, T8, Ta, Tn, Tj, TH, Ts, Tq, Tr; + { + E T4, Tu, T7, Tv; + T1 = cr[0]; + { + E T2, T3, T5, T6; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + Tu = T2 - T3; + T5 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = T5 + T6; + Tv = T5 - T6; + } + Tb = T4 - T7; + TM = FNMS(KP618033988, Tu, Tv); + Tw = FMA(KP618033988, Tv, Tu); + T8 = T4 + T7; + Ta = FNMS(KP250000000, T8, T1); + } + { + E Tf, To, Ti, Tp; + Tn = ci[WS(rs, 4)]; + { + E Td, Te, Tg, Th; + Td = ci[WS(rs, 3)]; + Te = cr[WS(rs, 4)]; + Tf = Td + Te; + To = Td - Te; + Tg = ci[WS(rs, 2)]; + Th = cr[WS(rs, 3)]; + Ti = Tg + Th; + Tp = Tg - Th; + } + Tj = FMA(KP618033988, Ti, Tf); + TH = FNMS(KP618033988, Tf, Ti); + Ts = To - Tp; + Tq = To + Tp; + Tr = FNMS(KP250000000, Tq, Tn); + } + cr[0] = T1 + T8; + ci[0] = Tn + Tq; + { + E Tk, TA, Tx, TD, Tc, Tt; + Tc = FMA(KP559016994, Tb, Ta); + Tk = FNMS(KP951056516, Tj, Tc); + TA = FMA(KP951056516, Tj, Tc); + Tt = FMA(KP559016994, Ts, Tr); + Tx = FMA(KP951056516, Tw, Tt); + TD = FNMS(KP951056516, Tw, Tt); + { + E T9, Tl, Tm, Ty; + T9 = W[0]; + Tl = T9 * Tk; + Tm = W[1]; + Ty = Tm * Tk; + cr[WS(rs, 1)] = FNMS(Tm, Tx, Tl); + ci[WS(rs, 1)] = FMA(T9, Tx, Ty); + } + { + E Tz, TB, TC, TE; + Tz = W[6]; + TB = Tz * TA; + TC = W[7]; + TE = TC * TA; + cr[WS(rs, 4)] = FNMS(TC, TD, TB); + ci[WS(rs, 4)] = FMA(Tz, TD, TE); + } + } + { + E TI, TQ, TN, TT, TG, TL; + TG = FNMS(KP559016994, Tb, Ta); + TI = FMA(KP951056516, TH, TG); + TQ = FNMS(KP951056516, TH, TG); + TL = FNMS(KP559016994, Ts, Tr); + TN = FNMS(KP951056516, TM, TL); + TT = FMA(KP951056516, TM, TL); + { + E TF, TJ, TK, TO; + TF = W[2]; + TJ = TF * TI; + TK = W[3]; + TO = TK * TI; + cr[WS(rs, 2)] = FNMS(TK, TN, TJ); + ci[WS(rs, 2)] = FMA(TF, TN, TO); + } + { + E TP, TR, TS, TU; + TP = W[4]; + TR = TP * TQ; + TS = W[5]; + TU = TS * TQ; + cr[WS(rs, 3)] = FNMS(TS, TT, TR); + ci[WS(rs, 3)] = FMA(TP, TT, TU); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 5}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hb_5", twinstr, &GENUS, {14, 8, 26, 0} }; + +void X(codelet_hb_5) (planner *p) { + X(khc2hc_register) (p, hb_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 5 -dif -name hb_5 -include rdft/scalar/hb.h */ + +/* + * This function contains 40 FP additions, 28 FP multiplications, + * (or, 26 additions, 14 multiplications, 14 fused multiply/add), + * 27 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs)) { + E T1, Tj, TG, Ts, T8, Ti, T9, Tn, TD, Tu, Tg, Tt; + { + E T4, Tq, T7, Tr; + T1 = cr[0]; + { + E T2, T3, T5, T6; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + Tq = T2 - T3; + T5 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = T5 + T6; + Tr = T5 - T6; + } + Tj = KP559016994 * (T4 - T7); + TG = FMA(KP951056516, Tq, KP587785252 * Tr); + Ts = FNMS(KP951056516, Tr, KP587785252 * Tq); + T8 = T4 + T7; + Ti = FNMS(KP250000000, T8, T1); + } + { + E Tc, Tl, Tf, Tm; + T9 = ci[WS(rs, 4)]; + { + E Ta, Tb, Td, Te; + Ta = ci[WS(rs, 3)]; + Tb = cr[WS(rs, 4)]; + Tc = Ta - Tb; + Tl = Ta + Tb; + Td = ci[WS(rs, 2)]; + Te = cr[WS(rs, 3)]; + Tf = Td - Te; + Tm = Td + Te; + } + Tn = FNMS(KP951056516, Tm, KP587785252 * Tl); + TD = FMA(KP951056516, Tl, KP587785252 * Tm); + Tu = KP559016994 * (Tc - Tf); + Tg = Tc + Tf; + Tt = FNMS(KP250000000, Tg, T9); + } + cr[0] = T1 + T8; + ci[0] = T9 + Tg; + { + E To, Ty, Tw, TA, Tk, Tv; + Tk = Ti - Tj; + To = Tk - Tn; + Ty = Tk + Tn; + Tv = Tt - Tu; + Tw = Ts + Tv; + TA = Tv - Ts; + { + E Th, Tp, Tx, Tz; + Th = W[2]; + Tp = W[3]; + cr[WS(rs, 2)] = FNMS(Tp, Tw, Th * To); + ci[WS(rs, 2)] = FMA(Th, Tw, Tp * To); + Tx = W[4]; + Tz = W[5]; + cr[WS(rs, 3)] = FNMS(Tz, TA, Tx * Ty); + ci[WS(rs, 3)] = FMA(Tx, TA, Tz * Ty); + } + } + { + E TE, TK, TI, TM, TC, TH; + TC = Tj + Ti; + TE = TC - TD; + TK = TC + TD; + TH = Tu + Tt; + TI = TG + TH; + TM = TH - TG; + { + E TB, TF, TJ, TL; + TB = W[0]; + TF = W[1]; + cr[WS(rs, 1)] = FNMS(TF, TI, TB * TE); + ci[WS(rs, 1)] = FMA(TB, TI, TF * TE); + TJ = W[6]; + TL = W[7]; + cr[WS(rs, 4)] = FNMS(TL, TM, TJ * TK); + ci[WS(rs, 4)] = FMA(TJ, TM, TL * TK); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 5}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hb_5", twinstr, &GENUS, {26, 14, 14, 0} }; + +void X(codelet_hb_5) (planner *p) { + X(khc2hc_register) (p, hb_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_6.c new file mode 100644 index 000000000..68b31f01f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_6.c @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -dif -name hb_6 -include rdft/scalar/hb.h */ + +/* + * This function contains 46 FP additions, 32 FP multiplications, + * (or, 24 additions, 10 multiplications, 22 fused multiply/add), + * 31 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_6(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs)) { + E Td, Tn, TO, TJ, TN, Tk, Tr, T3, TC, Ts, TQ, Ta, Tm, TF, TG; + { + E Tb, Tc, Tg, TH, Tj, TI; + Tb = ci[WS(rs, 5)]; + Tc = cr[WS(rs, 3)]; + Td = Tb - Tc; + { + E Te, Tf, Th, Ti; + Te = ci[WS(rs, 3)]; + Tf = cr[WS(rs, 5)]; + Tg = Te - Tf; + TH = Te + Tf; + Th = ci[WS(rs, 4)]; + Ti = cr[WS(rs, 4)]; + Tj = Th - Ti; + TI = Th + Ti; + } + Tn = Tj - Tg; + TO = TH - TI; + TJ = TH + TI; + TN = Tb + Tc; + Tk = Tg + Tj; + Tr = FNMS(KP500000000, Tk, Td); + } + { + E T6, TD, T9, TE, T1, T2; + T1 = cr[0]; + T2 = ci[WS(rs, 2)]; + T3 = T1 + T2; + TC = T1 - T2; + { + E T4, T5, T7, T8; + T4 = cr[WS(rs, 2)]; + T5 = ci[0]; + T6 = T4 + T5; + TD = T4 - T5; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 1)]; + T9 = T7 + T8; + TE = T7 - T8; + } + Ts = T6 - T9; + TQ = TD - TE; + Ta = T6 + T9; + Tm = FNMS(KP500000000, Ta, T3); + TF = TD + TE; + TG = FNMS(KP500000000, TF, TC); + } + cr[0] = T3 + Ta; + ci[0] = Td + Tk; + { + E To, Tt, Tp, Tu, Tl, Tq; + To = FNMS(KP866025403, Tn, Tm); + Tt = FNMS(KP866025403, Ts, Tr); + Tl = W[2]; + Tp = Tl * To; + Tu = Tl * Tt; + Tq = W[3]; + cr[WS(rs, 2)] = FNMS(Tq, Tt, Tp); + ci[WS(rs, 2)] = FMA(Tq, To, Tu); + } + { + E T13, TZ, T11, T12, T14, T10; + T13 = TN + TO; + T10 = TC + TF; + TZ = W[4]; + T11 = TZ * T10; + T12 = W[5]; + T14 = T12 * T10; + cr[WS(rs, 3)] = FNMS(T12, T13, T11); + ci[WS(rs, 3)] = FMA(TZ, T13, T14); + } + { + E Tw, Tz, Tx, TA, Tv, Ty; + Tw = FMA(KP866025403, Tn, Tm); + Tz = FMA(KP866025403, Ts, Tr); + Tv = W[6]; + Tx = Tv * Tw; + TA = Tv * Tz; + Ty = W[7]; + cr[WS(rs, 4)] = FNMS(Ty, Tz, Tx); + ci[WS(rs, 4)] = FMA(Ty, Tw, TA); + } + { + E TR, TX, TT, TV, TW, TY, TB, TL, TM, TS, TP, TU, TK; + TP = FNMS(KP500000000, TO, TN); + TR = FMA(KP866025403, TQ, TP); + TX = FNMS(KP866025403, TQ, TP); + TU = FMA(KP866025403, TJ, TG); + TT = W[8]; + TV = TT * TU; + TW = W[9]; + TY = TW * TU; + TK = FNMS(KP866025403, TJ, TG); + TB = W[0]; + TL = TB * TK; + TM = W[1]; + TS = TM * TK; + cr[WS(rs, 1)] = FNMS(TM, TR, TL); + ci[WS(rs, 1)] = FMA(TB, TR, TS); + cr[WS(rs, 5)] = FNMS(TW, TX, TV); + ci[WS(rs, 5)] = FMA(TT, TX, TY); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 6, "hb_6", twinstr, &GENUS, {24, 10, 22, 0} }; + +void X(codelet_hb_6) (planner *p) { + X(khc2hc_register) (p, hb_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -dif -name hb_6 -include rdft/scalar/hb.h */ + +/* + * This function contains 46 FP additions, 28 FP multiplications, + * (or, 32 additions, 14 multiplications, 14 fused multiply/add), + * 27 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_6(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs)) { + E T3, Ty, Ta, TO, Tr, TB, Td, TE, Tk, TL, Tn, TH; + { + E T1, T2, Tb, Tc; + T1 = cr[0]; + T2 = ci[WS(rs, 2)]; + T3 = T1 + T2; + Ty = T1 - T2; + { + E T6, Tz, T9, TA; + { + E T4, T5, T7, T8; + T4 = cr[WS(rs, 2)]; + T5 = ci[0]; + T6 = T4 + T5; + Tz = T4 - T5; + T7 = ci[WS(rs, 1)]; + T8 = cr[WS(rs, 1)]; + T9 = T7 + T8; + TA = T7 - T8; + } + Ta = T6 + T9; + TO = KP866025403 * (Tz - TA); + Tr = KP866025403 * (T6 - T9); + TB = Tz + TA; + } + Tb = ci[WS(rs, 5)]; + Tc = cr[WS(rs, 3)]; + Td = Tb - Tc; + TE = Tb + Tc; + { + E Tg, TG, Tj, TF; + { + E Te, Tf, Th, Ti; + Te = ci[WS(rs, 3)]; + Tf = cr[WS(rs, 5)]; + Tg = Te - Tf; + TG = Te + Tf; + Th = ci[WS(rs, 4)]; + Ti = cr[WS(rs, 4)]; + Tj = Th - Ti; + TF = Th + Ti; + } + Tk = Tg + Tj; + TL = KP866025403 * (TG + TF); + Tn = KP866025403 * (Tj - Tg); + TH = TF - TG; + } + } + cr[0] = T3 + Ta; + ci[0] = Td + Tk; + { + E TC, TI, Tx, TD; + TC = Ty + TB; + TI = TE - TH; + Tx = W[4]; + TD = W[5]; + cr[WS(rs, 3)] = FNMS(TD, TI, Tx * TC); + ci[WS(rs, 3)] = FMA(TD, TC, Tx * TI); + } + { + E To, Tu, Ts, Tw, Tm, Tq; + Tm = FNMS(KP500000000, Ta, T3); + To = Tm - Tn; + Tu = Tm + Tn; + Tq = FNMS(KP500000000, Tk, Td); + Ts = Tq - Tr; + Tw = Tr + Tq; + { + E Tl, Tp, Tt, Tv; + Tl = W[2]; + Tp = W[3]; + cr[WS(rs, 2)] = FNMS(Tp, Ts, Tl * To); + ci[WS(rs, 2)] = FMA(Tl, Ts, Tp * To); + Tt = W[6]; + Tv = W[7]; + cr[WS(rs, 4)] = FNMS(Tv, Tw, Tt * Tu); + ci[WS(rs, 4)] = FMA(Tt, Tw, Tv * Tu); + } + } + { + E TM, TS, TQ, TU, TK, TP; + TK = FNMS(KP500000000, TB, Ty); + TM = TK - TL; + TS = TK + TL; + TP = FMA(KP500000000, TH, TE); + TQ = TO + TP; + TU = TP - TO; + { + E TJ, TN, TR, TT; + TJ = W[0]; + TN = W[1]; + cr[WS(rs, 1)] = FNMS(TN, TQ, TJ * TM); + ci[WS(rs, 1)] = FMA(TN, TM, TJ * TQ); + TR = W[8]; + TT = W[9]; + cr[WS(rs, 5)] = FNMS(TT, TU, TR * TS); + ci[WS(rs, 5)] = FMA(TT, TS, TR * TU); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 6, "hb_6", twinstr, &GENUS, {32, 14, 14, 0} }; + +void X(codelet_hb_6) (planner *p) { + X(khc2hc_register) (p, hb_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_64.c new file mode 100644 index 000000000..0232e7111 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_64.c @@ -0,0 +1,4025 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:33 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 64 -dif -name hb_64 -include rdft/scalar/hb.h */ + +/* + * This function contains 1038 FP additions, 644 FP multiplications, + * (or, 520 additions, 126 multiplications, 518 fused multiply/add), + * 192 stack variables, 15 constants, and 256 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_64(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 126); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 126, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tv, Thy, T5B, T7n, Tey, TfP, TjB, Tkl, T2k, T6U, T2H, T7o, Tia, TiH, Tj8; + E Tk8, T5E, T6V, T9N, Tbz, T9Q, Tb7, Tev, Tgh, T8G, Tb6, T8N, TbA, TcU, TfO; + E Td5, Tgi, T10, Ti3, Tje, TjC, ThF, TiI, Tds, TeA, Tjb, TjD, Tdh, TeB, TfT; + E Tgl, TfW, Tgk, T39, T7r, T5H, T6Z, T8V, TbC, T9S, Tbb, T3A, T7q, T5G, T72; + E T92, TbD, T9T, Tbe, T1w, ThH, Tjq, Tke, Tjt, Tkf, ThO, TiK, Tec, TgT, Tfc; + E Tgb, Tel, TgU, Tfd, Tg8, T5a, T82, T83, T5n, T6i, T77, T7a, T6j, T9f, Tcb; + E Tcc, T9m, Tar, Tbj, Tbm, Tas, T21, ThQ, Tjj, Tkb, Tjm, Tkc, ThX, TiL, TdL; + E TgW, Tf9, Tg4, TdU, TgX, Tfa, Tg1, T4h, T7Z, T80, T4u, T6f, T7e, T7h, T6g; + E T9y, Tce, Tcf, T9F, Tau, Tbq, Tbt, Tav; + { + E T3, T6, T7, T5t, T24, Tes, Ter, T27, Ti4, T5w, Ta, TcR, Td, TcS, Te; + E T2d, Ti5, T5z, T5y, T2i, Tm, Td3, Ti7, T2p, T2u, T8I, Td0, T8H, Tt, TcY; + E Ti8, T2A, T2F, T8L, TcX, T8K; + { + E T1, T2, T4, T5; + T1 = cr[0]; + T2 = ci[WS(rs, 31)]; + T3 = T1 + T2; + T4 = cr[WS(rs, 16)]; + T5 = ci[WS(rs, 15)]; + T6 = T4 + T5; + T7 = T3 + T6; + T5t = T4 - T5; + T24 = T1 - T2; + } + { + E T25, T26, T5u, T5v; + T25 = ci[WS(rs, 47)]; + T26 = cr[WS(rs, 48)]; + Tes = T25 - T26; + T5u = ci[WS(rs, 63)]; + T5v = cr[WS(rs, 32)]; + Ter = T5u - T5v; + T27 = T25 + T26; + Ti4 = Ter + Tes; + T5w = T5u + T5v; + } + { + E T29, T2h, T2e, T2c; + { + E T8, T9, T2f, T2g; + T8 = cr[WS(rs, 8)]; + T9 = ci[WS(rs, 23)]; + Ta = T8 + T9; + T29 = T8 - T9; + T2f = ci[WS(rs, 39)]; + T2g = cr[WS(rs, 56)]; + T2h = T2f + T2g; + TcR = T2f - T2g; + } + { + E Tb, Tc, T2a, T2b; + Tb = ci[WS(rs, 7)]; + Tc = cr[WS(rs, 24)]; + Td = Tb + Tc; + T2e = Tb - Tc; + T2a = ci[WS(rs, 55)]; + T2b = cr[WS(rs, 40)]; + T2c = T2a + T2b; + TcS = T2a - T2b; + } + Te = Ta + Td; + T2d = T29 - T2c; + Ti5 = TcS + TcR; + T5z = T2e + T2h; + T5y = T29 + T2c; + T2i = T2e - T2h; + } + { + E Ti, T2l, T2t, Td1, Tl, T2q, T2o, Td2; + { + E Tg, Th, T2r, T2s; + Tg = cr[WS(rs, 4)]; + Th = ci[WS(rs, 27)]; + Ti = Tg + Th; + T2l = Tg - Th; + T2r = ci[WS(rs, 59)]; + T2s = cr[WS(rs, 36)]; + T2t = T2r + T2s; + Td1 = T2r - T2s; + } + { + E Tj, Tk, T2m, T2n; + Tj = cr[WS(rs, 20)]; + Tk = ci[WS(rs, 11)]; + Tl = Tj + Tk; + T2q = Tj - Tk; + T2m = ci[WS(rs, 43)]; + T2n = cr[WS(rs, 52)]; + T2o = T2m + T2n; + Td2 = T2m - T2n; + } + Tm = Ti + Tl; + Td3 = Td1 - Td2; + Ti7 = Td1 + Td2; + T2p = T2l - T2o; + T2u = T2q + T2t; + T8I = T2l + T2o; + Td0 = Ti - Tl; + T8H = T2t - T2q; + } + { + E Tp, T2w, T2E, TcV, Ts, T2B, T2z, TcW; + { + E Tn, To, T2C, T2D; + Tn = ci[WS(rs, 3)]; + To = cr[WS(rs, 28)]; + Tp = Tn + To; + T2w = Tn - To; + T2C = ci[WS(rs, 35)]; + T2D = cr[WS(rs, 60)]; + T2E = T2C + T2D; + TcV = T2C - T2D; + } + { + E Tq, Tr, T2x, T2y; + Tq = cr[WS(rs, 12)]; + Tr = ci[WS(rs, 19)]; + Ts = Tq + Tr; + T2B = Tq - Tr; + T2x = ci[WS(rs, 51)]; + T2y = cr[WS(rs, 44)]; + T2z = T2x + T2y; + TcW = T2x - T2y; + } + Tt = Tp + Ts; + TcY = Tp - Ts; + Ti8 = TcV + TcW; + T2A = T2w - T2z; + T2F = T2B - T2E; + T8L = T2w + T2z; + TcX = TcV - TcW; + T8K = T2B + T2E; + } + { + E Tf, Tu, T5x, T5A; + Tf = T7 + Te; + Tu = Tm + Tt; + Tv = Tf + Tu; + Thy = Tf - Tu; + T5x = T5t + T5w; + T5A = T5y - T5z; + T5B = FMA(KP707106781, T5A, T5x); + T7n = FNMS(KP707106781, T5A, T5x); + } + { + E Tew, Tex, Tjz, TjA; + Tew = Td0 - Td3; + Tex = TcY + TcX; + Tey = Tew - Tex; + TfP = Tew + Tex; + Tjz = Ti4 - Ti5; + TjA = Tm - Tt; + TjB = Tjz - TjA; + Tkl = TjA + Tjz; + } + { + E T28, T2j, T2v, T2G; + T28 = T24 - T27; + T2j = T2d + T2i; + T2k = FMA(KP707106781, T2j, T28); + T6U = FNMS(KP707106781, T2j, T28); + T2v = FNMS(KP414213562, T2u, T2p); + T2G = FMA(KP414213562, T2F, T2A); + T2H = T2v + T2G; + T7o = T2v - T2G; + } + { + E Ti6, Ti9, Tj6, Tj7; + Ti6 = Ti4 + Ti5; + Ti9 = Ti7 + Ti8; + Tia = Ti6 - Ti9; + TiH = Ti6 + Ti9; + Tj6 = T7 - Te; + Tj7 = Ti8 - Ti7; + Tj8 = Tj6 - Tj7; + Tk8 = Tj6 + Tj7; + } + { + E T5C, T5D, T9L, T9M; + T5C = FMA(KP414213562, T2p, T2u); + T5D = FNMS(KP414213562, T2A, T2F); + T5E = T5C + T5D; + T6V = T5D - T5C; + T9L = T5w - T5t; + T9M = T2d - T2i; + T9N = FMA(KP707106781, T9M, T9L); + Tbz = FNMS(KP707106781, T9M, T9L); + } + { + E T9O, T9P, Tet, Teu; + T9O = FMA(KP414213562, T8H, T8I); + T9P = FMA(KP414213562, T8K, T8L); + T9Q = T9O - T9P; + Tb7 = T9O + T9P; + Tet = Ter - Tes; + Teu = Ta - Td; + Tev = Tet - Teu; + Tgh = Teu + Tet; + } + { + E T8E, T8F, T8J, T8M; + T8E = T24 + T27; + T8F = T5y + T5z; + T8G = FNMS(KP707106781, T8F, T8E); + Tb6 = FMA(KP707106781, T8F, T8E); + T8J = FNMS(KP414213562, T8I, T8H); + T8M = FNMS(KP414213562, T8L, T8K); + T8N = T8J + T8M; + TbA = T8M - T8J; + } + { + E TcQ, TcT, TcZ, Td4; + TcQ = T3 - T6; + TcT = TcR - TcS; + TcU = TcQ - TcT; + TfO = TcQ + TcT; + TcZ = TcX - TcY; + Td4 = Td0 + Td3; + Td5 = TcZ - Td4; + Tgi = Td4 + TcZ; + } + } + { + E TC, Tdn, ThC, T3e, T3v, T8S, Tdk, T8P, TY, Tdf, ThA, T2S, T2X, T36, Tda; + E T35, TJ, Tdq, ThD, T3j, T3o, T3x, Tdl, T3w, TR, Tdc, Thz, T2N, T34, T8Z; + E Td9, T8W; + { + E Ty, T3r, T3u, Tdj, TB, T3a, T3d, Tdi; + { + E Tw, Tx, T3s, T3t; + Tw = cr[WS(rs, 2)]; + Tx = ci[WS(rs, 29)]; + Ty = Tw + Tx; + T3r = Tw - Tx; + T3s = ci[WS(rs, 45)]; + T3t = cr[WS(rs, 50)]; + T3u = T3s + T3t; + Tdj = T3s - T3t; + } + { + E Tz, TA, T3b, T3c; + Tz = cr[WS(rs, 18)]; + TA = ci[WS(rs, 13)]; + TB = Tz + TA; + T3a = Tz - TA; + T3b = ci[WS(rs, 61)]; + T3c = cr[WS(rs, 34)]; + T3d = T3b + T3c; + Tdi = T3b - T3c; + } + TC = Ty + TB; + Tdn = Ty - TB; + ThC = Tdi + Tdj; + T3e = T3a + T3d; + T3v = T3r - T3u; + T8S = T3r + T3u; + Tdk = Tdi - Tdj; + T8P = T3d - T3a; + } + { + E TU, T2O, T2W, Tdd, TX, T2T, T2R, Tde; + { + E TS, TT, T2U, T2V; + TS = cr[WS(rs, 6)]; + TT = ci[WS(rs, 25)]; + TU = TS + TT; + T2O = TS - TT; + T2U = ci[WS(rs, 41)]; + T2V = cr[WS(rs, 54)]; + T2W = T2U + T2V; + Tdd = T2U - T2V; + } + { + E TV, TW, T2P, T2Q; + TV = ci[WS(rs, 9)]; + TW = cr[WS(rs, 22)]; + TX = TV + TW; + T2T = TV - TW; + T2P = ci[WS(rs, 57)]; + T2Q = cr[WS(rs, 38)]; + T2R = T2P + T2Q; + Tde = T2P - T2Q; + } + TY = TU + TX; + Tdf = Tdd - Tde; + ThA = Tde + Tdd; + T2S = T2O + T2R; + T2X = T2T + T2W; + T36 = T2T - T2W; + Tda = TU - TX; + T35 = T2O - T2R; + } + { + E TF, T3f, T3n, Tdo, TI, T3k, T3i, Tdp; + { + E TD, TE, T3l, T3m; + TD = cr[WS(rs, 10)]; + TE = ci[WS(rs, 21)]; + TF = TD + TE; + T3f = TD - TE; + T3l = ci[WS(rs, 37)]; + T3m = cr[WS(rs, 58)]; + T3n = T3l + T3m; + Tdo = T3l - T3m; + } + { + E TG, TH, T3g, T3h; + TG = ci[WS(rs, 5)]; + TH = cr[WS(rs, 26)]; + TI = TG + TH; + T3k = TG - TH; + T3g = ci[WS(rs, 53)]; + T3h = cr[WS(rs, 42)]; + T3i = T3g + T3h; + Tdp = T3g - T3h; + } + TJ = TF + TI; + Tdq = Tdo - Tdp; + ThD = Tdp + Tdo; + T3j = T3f + T3i; + T3o = T3k + T3n; + T3x = T3k - T3n; + Tdl = TF - TI; + T3w = T3f - T3i; + } + { + E TN, T30, T33, Td8, TQ, T2J, T2M, Td7; + { + E TL, TM, T31, T32; + TL = ci[WS(rs, 1)]; + TM = cr[WS(rs, 30)]; + TN = TL + TM; + T30 = TL - TM; + T31 = ci[WS(rs, 49)]; + T32 = cr[WS(rs, 46)]; + T33 = T31 + T32; + Td8 = T31 - T32; + } + { + E TO, TP, T2K, T2L; + TO = cr[WS(rs, 14)]; + TP = ci[WS(rs, 17)]; + TQ = TO + TP; + T2J = TO - TP; + T2K = ci[WS(rs, 33)]; + T2L = cr[WS(rs, 62)]; + T2M = T2K + T2L; + Td7 = T2K - T2L; + } + TR = TN + TQ; + Tdc = TN - TQ; + Thz = Td7 + Td8; + T2N = T2J - T2M; + T34 = T30 - T33; + T8Z = T30 + T33; + Td9 = Td7 - Td8; + T8W = T2J + T2M; + } + { + E TK, TZ, Tdm, Tdr; + TK = TC + TJ; + TZ = TR + TY; + T10 = TK + TZ; + Ti3 = TK - TZ; + { + E Tjc, Tjd, ThB, ThE; + Tjc = TC - TJ; + Tjd = ThC - ThD; + Tje = Tjc + Tjd; + TjC = Tjc - Tjd; + ThB = Thz + ThA; + ThE = ThC + ThD; + ThF = ThB - ThE; + TiI = ThE + ThB; + } + Tdm = Tdk - Tdl; + Tdr = Tdn - Tdq; + Tds = FNMS(KP414213562, Tdr, Tdm); + TeA = FMA(KP414213562, Tdm, Tdr); + { + E Tj9, Tja, Tdb, Tdg; + Tj9 = Thz - ThA; + Tja = TR - TY; + Tjb = Tj9 - Tja; + TjD = Tja + Tj9; + Tdb = Td9 - Tda; + Tdg = Tdc - Tdf; + Tdh = FMA(KP414213562, Tdg, Tdb); + TeB = FNMS(KP414213562, Tdb, Tdg); + } + } + { + E TfR, TfS, TfU, TfV; + TfR = Tda + Td9; + TfS = Tdc + Tdf; + TfT = FNMS(KP414213562, TfS, TfR); + Tgl = FMA(KP414213562, TfR, TfS); + TfU = Tdl + Tdk; + TfV = Tdn + Tdq; + TfW = FMA(KP414213562, TfV, TfU); + Tgk = FNMS(KP414213562, TfU, TfV); + { + E T2Z, T6X, T38, T6Y, T2Y, T37; + T2Y = T2S - T2X; + T2Z = FMA(KP707106781, T2Y, T2N); + T6X = FNMS(KP707106781, T2Y, T2N); + T37 = T35 + T36; + T38 = FMA(KP707106781, T37, T34); + T6Y = FNMS(KP707106781, T37, T34); + T39 = FNMS(KP198912367, T38, T2Z); + T7r = FNMS(KP668178637, T6X, T6Y); + T5H = FMA(KP198912367, T2Z, T38); + T6Z = FMA(KP668178637, T6Y, T6X); + } + } + { + E T8R, Tb9, T8U, Tba, T8Q, T8T; + T8Q = T3x - T3w; + T8R = FNMS(KP707106781, T8Q, T8P); + Tb9 = FMA(KP707106781, T8Q, T8P); + T8T = T3j + T3o; + T8U = FNMS(KP707106781, T8T, T8S); + Tba = FMA(KP707106781, T8T, T8S); + T8V = FMA(KP668178637, T8U, T8R); + TbC = FMA(KP198912367, Tb9, Tba); + T9S = FNMS(KP668178637, T8R, T8U); + Tbb = FNMS(KP198912367, Tba, Tb9); + } + { + E T3q, T70, T3z, T71, T3p, T3y; + T3p = T3j - T3o; + T3q = FMA(KP707106781, T3p, T3e); + T70 = FNMS(KP707106781, T3p, T3e); + T3y = T3w + T3x; + T3z = FMA(KP707106781, T3y, T3v); + T71 = FNMS(KP707106781, T3y, T3v); + T3A = FMA(KP198912367, T3z, T3q); + T7q = FMA(KP668178637, T70, T71); + T5G = FNMS(KP198912367, T3q, T3z); + T72 = FNMS(KP668178637, T71, T70); + } + { + E T8Y, Tbc, T91, Tbd, T8X, T90; + T8X = T35 - T36; + T8Y = FNMS(KP707106781, T8X, T8W); + Tbc = FMA(KP707106781, T8X, T8W); + T90 = T2S + T2X; + T91 = FNMS(KP707106781, T90, T8Z); + Tbd = FMA(KP707106781, T90, T8Z); + T92 = FMA(KP668178637, T91, T8Y); + TbD = FMA(KP198912367, Tbc, Tbd); + T9T = FNMS(KP668178637, T8Y, T91); + Tbe = FNMS(KP198912367, Tbd, Tbc); + } + } + { + E T18, Ted, ThI, T4A, T5f, T9g, TdY, T95, T1u, Te4, ThM, T52, T57, T9c, Te1; + E T9b, T1f, Teg, ThJ, T4F, T4K, T5h, TdZ, T5g, T1n, Te9, ThL, T4R, T4W, T99; + E Te6, T98; + { + E T14, T5b, T5e, TdX, T17, T4w, T4z, TdW; + { + E T12, T13, T5c, T5d; + T12 = cr[WS(rs, 1)]; + T13 = ci[WS(rs, 30)]; + T14 = T12 + T13; + T5b = T12 - T13; + T5c = ci[WS(rs, 46)]; + T5d = cr[WS(rs, 49)]; + T5e = T5c + T5d; + TdX = T5c - T5d; + } + { + E T15, T16, T4x, T4y; + T15 = cr[WS(rs, 17)]; + T16 = ci[WS(rs, 14)]; + T17 = T15 + T16; + T4w = T15 - T16; + T4x = ci[WS(rs, 62)]; + T4y = cr[WS(rs, 33)]; + T4z = T4x + T4y; + TdW = T4x - T4y; + } + T18 = T14 + T17; + Ted = T14 - T17; + ThI = TdW + TdX; + T4A = T4w + T4z; + T5f = T5b - T5e; + T9g = T5b + T5e; + TdY = TdW - TdX; + T95 = T4z - T4w; + } + { + E T1q, T53, T56, Te3, T1t, T4Y, T51, Te2; + { + E T1o, T1p, T54, T55; + T1o = ci[WS(rs, 2)]; + T1p = cr[WS(rs, 29)]; + T1q = T1o + T1p; + T53 = T1o - T1p; + T54 = ci[WS(rs, 50)]; + T55 = cr[WS(rs, 45)]; + T56 = T54 + T55; + Te3 = T54 - T55; + } + { + E T1r, T1s, T4Z, T50; + T1r = cr[WS(rs, 13)]; + T1s = ci[WS(rs, 18)]; + T1t = T1r + T1s; + T4Y = T1r - T1s; + T4Z = ci[WS(rs, 34)]; + T50 = cr[WS(rs, 61)]; + T51 = T4Z + T50; + Te2 = T4Z - T50; + } + T1u = T1q + T1t; + Te4 = Te2 - Te3; + ThM = Te2 + Te3; + T52 = T4Y - T51; + T57 = T53 - T56; + T9c = T4Y + T51; + Te1 = T1q - T1t; + T9b = T53 + T56; + } + { + E T1b, T4B, T4J, Tee, T1e, T4G, T4E, Tef; + { + E T19, T1a, T4H, T4I; + T19 = cr[WS(rs, 9)]; + T1a = ci[WS(rs, 22)]; + T1b = T19 + T1a; + T4B = T19 - T1a; + T4H = ci[WS(rs, 38)]; + T4I = cr[WS(rs, 57)]; + T4J = T4H + T4I; + Tee = T4H - T4I; + } + { + E T1c, T1d, T4C, T4D; + T1c = ci[WS(rs, 6)]; + T1d = cr[WS(rs, 25)]; + T1e = T1c + T1d; + T4G = T1c - T1d; + T4C = ci[WS(rs, 54)]; + T4D = cr[WS(rs, 41)]; + T4E = T4C + T4D; + Tef = T4C - T4D; + } + T1f = T1b + T1e; + Teg = Tee - Tef; + ThJ = Tef + Tee; + T4F = T4B + T4E; + T4K = T4G + T4J; + T5h = T4G - T4J; + TdZ = T1b - T1e; + T5g = T4B - T4E; + } + { + E T1j, T4S, T4V, Te8, T1m, T4N, T4Q, Te7; + { + E T1h, T1i, T4T, T4U; + T1h = cr[WS(rs, 5)]; + T1i = ci[WS(rs, 26)]; + T1j = T1h + T1i; + T4S = T1h - T1i; + T4T = ci[WS(rs, 42)]; + T4U = cr[WS(rs, 53)]; + T4V = T4T + T4U; + Te8 = T4T - T4U; + } + { + E T1k, T1l, T4O, T4P; + T1k = cr[WS(rs, 21)]; + T1l = ci[WS(rs, 10)]; + T1m = T1k + T1l; + T4N = T1k - T1l; + T4O = ci[WS(rs, 58)]; + T4P = cr[WS(rs, 37)]; + T4Q = T4O + T4P; + Te7 = T4O - T4P; + } + T1n = T1j + T1m; + Te9 = Te7 - Te8; + ThL = Te7 + Te8; + T4R = T4N + T4Q; + T4W = T4S - T4V; + T99 = T4Q - T4N; + Te6 = T1j - T1m; + T98 = T4S + T4V; + } + { + E T1g, T1v, Tjo, Tjp; + T1g = T18 + T1f; + T1v = T1n + T1u; + T1w = T1g + T1v; + ThH = T1g - T1v; + Tjo = ThI - ThJ; + Tjp = T1n - T1u; + Tjq = Tjo - Tjp; + Tke = Tjp + Tjo; + } + { + E Tjr, Tjs, ThK, ThN; + Tjr = T18 - T1f; + Tjs = ThM - ThL; + Tjt = Tjr - Tjs; + Tkf = Tjr + Tjs; + ThK = ThI + ThJ; + ThN = ThL + ThM; + ThO = ThK - ThN; + TiK = ThK + ThN; + } + { + E Te0, Tg9, Teb, Tga, Te5, Tea; + Te0 = TdY - TdZ; + Tg9 = Ted + Teg; + Te5 = Te1 + Te4; + Tea = Te6 - Te9; + Teb = Te5 - Tea; + Tga = Tea + Te5; + Tec = FNMS(KP707106781, Teb, Te0); + TgT = FMA(KP707106781, Tga, Tg9); + Tfc = FMA(KP707106781, Teb, Te0); + Tgb = FNMS(KP707106781, Tga, Tg9); + } + { + E Teh, Tg6, Tek, Tg7, Tei, Tej; + Teh = Ted - Teg; + Tg6 = TdZ + TdY; + Tei = Te6 + Te9; + Tej = Te4 - Te1; + Tek = Tei - Tej; + Tg7 = Tei + Tej; + Tel = FNMS(KP707106781, Tek, Teh); + TgU = FMA(KP707106781, Tg7, Tg6); + Tfd = FMA(KP707106781, Tek, Teh); + Tg8 = FNMS(KP707106781, Tg7, Tg6); + } + { + E T4M, T78, T5j, T75, T59, T76, T5m, T79, T4L, T5i; + T4L = T4F - T4K; + T4M = FMA(KP707106781, T4L, T4A); + T78 = FNMS(KP707106781, T4L, T4A); + T5i = T5g + T5h; + T5j = FMA(KP707106781, T5i, T5f); + T75 = FNMS(KP707106781, T5i, T5f); + { + E T4X, T58, T5k, T5l; + T4X = FMA(KP414213562, T4W, T4R); + T58 = FNMS(KP414213562, T57, T52); + T59 = T4X + T58; + T76 = T4X - T58; + T5k = FNMS(KP414213562, T4R, T4W); + T5l = FMA(KP414213562, T52, T57); + T5m = T5k + T5l; + T79 = T5l - T5k; + } + T5a = FNMS(KP923879532, T59, T4M); + T82 = FMA(KP923879532, T79, T78); + T83 = FMA(KP923879532, T76, T75); + T5n = FNMS(KP923879532, T5m, T5j); + T6i = FMA(KP923879532, T59, T4M); + T77 = FNMS(KP923879532, T76, T75); + T7a = FNMS(KP923879532, T79, T78); + T6j = FMA(KP923879532, T5m, T5j); + } + { + E T97, Tbk, T9i, Tbh, T9e, Tbi, T9l, Tbl, T96, T9h; + T96 = T5h - T5g; + T97 = FNMS(KP707106781, T96, T95); + Tbk = FMA(KP707106781, T96, T95); + T9h = T4F + T4K; + T9i = FNMS(KP707106781, T9h, T9g); + Tbh = FMA(KP707106781, T9h, T9g); + { + E T9a, T9d, T9j, T9k; + T9a = FMA(KP414213562, T99, T98); + T9d = FMA(KP414213562, T9c, T9b); + T9e = T9a - T9d; + Tbi = T9a + T9d; + T9j = FNMS(KP414213562, T98, T99); + T9k = FNMS(KP414213562, T9b, T9c); + T9l = T9j + T9k; + Tbl = T9j - T9k; + } + T9f = FNMS(KP923879532, T9e, T97); + Tcb = FMA(KP923879532, Tbl, Tbk); + Tcc = FMA(KP923879532, Tbi, Tbh); + T9m = FMA(KP923879532, T9l, T9i); + Tar = FNMS(KP923879532, T9l, T9i); + Tbj = FNMS(KP923879532, Tbi, Tbh); + Tbm = FNMS(KP923879532, Tbl, Tbk); + Tas = FMA(KP923879532, T9e, T97); + } + } + { + E T1D, TdM, ThR, T3H, T4m, T9z, Tdx, T9o, T1Z, TdD, ThV, T49, T4e, T9s, TdA; + E T9r, T1K, TdP, ThS, T3M, T3R, T4o, Tdy, T4n, T1S, TdI, ThU, T3Y, T43, T9v; + E TdF, T9u; + { + E T1z, T4i, T4l, Tdw, T1C, T3D, T3G, Tdv; + { + E T1x, T1y, T4j, T4k; + T1x = ci[0]; + T1y = cr[WS(rs, 31)]; + T1z = T1x + T1y; + T4i = T1x - T1y; + T4j = ci[WS(rs, 48)]; + T4k = cr[WS(rs, 47)]; + T4l = T4j + T4k; + Tdw = T4j - T4k; + } + { + E T1A, T1B, T3E, T3F; + T1A = cr[WS(rs, 15)]; + T1B = ci[WS(rs, 16)]; + T1C = T1A + T1B; + T3D = T1A - T1B; + T3E = ci[WS(rs, 32)]; + T3F = cr[WS(rs, 63)]; + T3G = T3E + T3F; + Tdv = T3E - T3F; + } + T1D = T1z + T1C; + TdM = T1z - T1C; + ThR = Tdv + Tdw; + T3H = T3D - T3G; + T4m = T4i - T4l; + T9z = T4i + T4l; + Tdx = Tdv - Tdw; + T9o = T3D + T3G; + } + { + E T1V, T4a, T4d, TdC, T1Y, T45, T48, TdB; + { + E T1T, T1U, T4b, T4c; + T1T = ci[WS(rs, 4)]; + T1U = cr[WS(rs, 27)]; + T1V = T1T + T1U; + T4a = T1T - T1U; + T4b = ci[WS(rs, 52)]; + T4c = cr[WS(rs, 43)]; + T4d = T4b + T4c; + TdC = T4b - T4c; + } + { + E T1W, T1X, T46, T47; + T1W = cr[WS(rs, 11)]; + T1X = ci[WS(rs, 20)]; + T1Y = T1W + T1X; + T45 = T1W - T1X; + T46 = ci[WS(rs, 36)]; + T47 = cr[WS(rs, 59)]; + T48 = T46 + T47; + TdB = T46 - T47; + } + T1Z = T1V + T1Y; + TdD = TdB - TdC; + ThV = TdB + TdC; + T49 = T45 - T48; + T4e = T4a - T4d; + T9s = T45 + T48; + TdA = T1V - T1Y; + T9r = T4a + T4d; + } + { + E T1G, T3I, T3Q, TdN, T1J, T3N, T3L, TdO; + { + E T1E, T1F, T3O, T3P; + T1E = cr[WS(rs, 7)]; + T1F = ci[WS(rs, 24)]; + T1G = T1E + T1F; + T3I = T1E - T1F; + T3O = ci[WS(rs, 40)]; + T3P = cr[WS(rs, 55)]; + T3Q = T3O + T3P; + TdN = T3O - T3P; + } + { + E T1H, T1I, T3J, T3K; + T1H = ci[WS(rs, 8)]; + T1I = cr[WS(rs, 23)]; + T1J = T1H + T1I; + T3N = T1H - T1I; + T3J = ci[WS(rs, 56)]; + T3K = cr[WS(rs, 39)]; + T3L = T3J + T3K; + TdO = T3J - T3K; + } + T1K = T1G + T1J; + TdP = TdN - TdO; + ThS = TdO + TdN; + T3M = T3I + T3L; + T3R = T3N + T3Q; + T4o = T3N - T3Q; + Tdy = T1G - T1J; + T4n = T3I - T3L; + } + { + E T1O, T3Z, T42, TdH, T1R, T3U, T3X, TdG; + { + E T1M, T1N, T40, T41; + T1M = cr[WS(rs, 3)]; + T1N = ci[WS(rs, 28)]; + T1O = T1M + T1N; + T3Z = T1M - T1N; + T40 = ci[WS(rs, 44)]; + T41 = cr[WS(rs, 51)]; + T42 = T40 + T41; + TdH = T40 - T41; + } + { + E T1P, T1Q, T3V, T3W; + T1P = cr[WS(rs, 19)]; + T1Q = ci[WS(rs, 12)]; + T1R = T1P + T1Q; + T3U = T1P - T1Q; + T3V = ci[WS(rs, 60)]; + T3W = cr[WS(rs, 35)]; + T3X = T3V + T3W; + TdG = T3V - T3W; + } + T1S = T1O + T1R; + TdI = TdG - TdH; + ThU = TdG + TdH; + T3Y = T3U + T3X; + T43 = T3Z - T42; + T9v = T3U - T3X; + TdF = T1O - T1R; + T9u = T3Z + T42; + } + { + E T1L, T20, Tjh, Tji; + T1L = T1D + T1K; + T20 = T1S + T1Z; + T21 = T1L + T20; + ThQ = T1L - T20; + Tjh = ThR - ThS; + Tji = T1S - T1Z; + Tjj = Tjh - Tji; + Tkb = Tji + Tjh; + } + { + E Tjk, Tjl, ThT, ThW; + Tjk = T1D - T1K; + Tjl = ThV - ThU; + Tjm = Tjk - Tjl; + Tkc = Tjk + Tjl; + ThT = ThR + ThS; + ThW = ThU + ThV; + ThX = ThT - ThW; + TiL = ThT + ThW; + } + { + E Tdz, Tg2, TdK, Tg3, TdE, TdJ; + Tdz = Tdx - Tdy; + Tg2 = TdM + TdP; + TdE = TdA + TdD; + TdJ = TdF - TdI; + TdK = TdE - TdJ; + Tg3 = TdJ + TdE; + TdL = FNMS(KP707106781, TdK, Tdz); + TgW = FMA(KP707106781, Tg3, Tg2); + Tf9 = FMA(KP707106781, TdK, Tdz); + Tg4 = FNMS(KP707106781, Tg3, Tg2); + } + { + E TdQ, TfZ, TdT, Tg0, TdR, TdS; + TdQ = TdM - TdP; + TfZ = Tdy + Tdx; + TdR = TdF + TdI; + TdS = TdD - TdA; + TdT = TdR - TdS; + Tg0 = TdR + TdS; + TdU = FNMS(KP707106781, TdT, TdQ); + TgX = FMA(KP707106781, Tg0, TfZ); + Tfa = FMA(KP707106781, TdT, TdQ); + Tg1 = FNMS(KP707106781, Tg0, TfZ); + } + { + E T3T, T7f, T4q, T7c, T4g, T7d, T4t, T7g, T3S, T4p; + T3S = T3M - T3R; + T3T = FMA(KP707106781, T3S, T3H); + T7f = FNMS(KP707106781, T3S, T3H); + T4p = T4n + T4o; + T4q = FMA(KP707106781, T4p, T4m); + T7c = FNMS(KP707106781, T4p, T4m); + { + E T44, T4f, T4r, T4s; + T44 = FMA(KP414213562, T43, T3Y); + T4f = FNMS(KP414213562, T4e, T49); + T4g = T44 + T4f; + T7d = T44 - T4f; + T4r = FNMS(KP414213562, T3Y, T43); + T4s = FMA(KP414213562, T49, T4e); + T4t = T4r + T4s; + T7g = T4s - T4r; + } + T4h = FNMS(KP923879532, T4g, T3T); + T7Z = FMA(KP923879532, T7g, T7f); + T80 = FMA(KP923879532, T7d, T7c); + T4u = FNMS(KP923879532, T4t, T4q); + T6f = FMA(KP923879532, T4g, T3T); + T7e = FNMS(KP923879532, T7d, T7c); + T7h = FNMS(KP923879532, T7g, T7f); + T6g = FMA(KP923879532, T4t, T4q); + } + { + E T9q, Tbr, T9B, Tbo, T9x, Tbp, T9E, Tbs, T9p, T9A; + T9p = T4n - T4o; + T9q = FNMS(KP707106781, T9p, T9o); + Tbr = FMA(KP707106781, T9p, T9o); + T9A = T3M + T3R; + T9B = FNMS(KP707106781, T9A, T9z); + Tbo = FMA(KP707106781, T9A, T9z); + { + E T9t, T9w, T9C, T9D; + T9t = FMA(KP414213562, T9s, T9r); + T9w = FNMS(KP414213562, T9v, T9u); + T9x = T9t - T9w; + Tbp = T9w + T9t; + T9C = FMA(KP414213562, T9u, T9v); + T9D = FNMS(KP414213562, T9r, T9s); + T9E = T9C - T9D; + Tbs = T9C + T9D; + } + T9y = FNMS(KP923879532, T9x, T9q); + Tce = FMA(KP923879532, Tbs, Tbr); + Tcf = FMA(KP923879532, Tbp, Tbo); + T9F = FNMS(KP923879532, T9E, T9B); + Tau = FMA(KP923879532, T9E, T9B); + Tbq = FNMS(KP923879532, Tbp, Tbo); + Tbt = FNMS(KP923879532, Tbs, Tbr); + Tav = FMA(KP923879532, T9x, T9q); + } + } + { + E T11, T22, TiE, TiJ, TiM, TiN; + T11 = Tv + T10; + T22 = T1w + T21; + TiE = T11 - T22; + TiJ = TiH + TiI; + TiM = TiK + TiL; + TiN = TiJ - TiM; + cr[0] = T11 + T22; + ci[0] = TiJ + TiM; + { + E TiD, TiF, TiG, TiO; + TiD = W[62]; + TiF = TiD * TiE; + TiG = W[63]; + TiO = TiG * TiE; + cr[WS(rs, 32)] = FNMS(TiG, TiN, TiF); + ci[WS(rs, 32)] = FMA(TiD, TiN, TiO); + } + } + { + E TiS, Tj0, TiX, Tj3; + { + E TiQ, TiR, TiV, TiW; + TiQ = Tv - T10; + TiR = TiL - TiK; + TiS = TiQ - TiR; + Tj0 = TiQ + TiR; + TiV = TiH - TiI; + TiW = T1w - T21; + TiX = TiV - TiW; + Tj3 = TiW + TiV; + } + { + E TiT, TiY, TiP, TiU; + TiP = W[94]; + TiT = TiP * TiS; + TiY = TiP * TiX; + TiU = W[95]; + cr[WS(rs, 48)] = FNMS(TiU, TiX, TiT); + ci[WS(rs, 48)] = FMA(TiU, TiS, TiY); + } + { + E Tj1, Tj4, TiZ, Tj2; + TiZ = W[30]; + Tj1 = TiZ * Tj0; + Tj4 = TiZ * Tj3; + Tj2 = W[31]; + cr[WS(rs, 16)] = FNMS(Tj2, Tj3, Tj1); + ci[WS(rs, 16)] = FMA(Tj2, Tj0, Tj4); + } + } + { + E Tib, Tie, Tiy, Tiq, Ti0, TiB, Tii, Tiv; + Tib = Ti3 + Tia; + { + E Tio, Tic, Tid, Tip; + Tio = Thy - ThF; + Tic = ThH + ThO; + Tid = ThX - ThQ; + Tip = Tid - Tic; + Tie = Tic + Tid; + Tiy = FMA(KP707106781, Tip, Tio); + Tiq = FNMS(KP707106781, Tip, Tio); + } + { + E ThG, Tit, ThZ, Tiu, ThP, ThY; + ThG = Thy + ThF; + Tit = Tia - Ti3; + ThP = ThH - ThO; + ThY = ThQ + ThX; + ThZ = ThP + ThY; + Tiu = ThP - ThY; + Ti0 = FNMS(KP707106781, ThZ, ThG); + TiB = FMA(KP707106781, Tiu, Tit); + Tii = FMA(KP707106781, ThZ, ThG); + Tiv = FNMS(KP707106781, Tiu, Tit); + } + { + E Tir, Tiw, Tin, Tis; + Tin = W[110]; + Tir = Tin * Tiq; + Tiw = Tin * Tiv; + Tis = W[111]; + cr[WS(rs, 56)] = FNMS(Tis, Tiv, Tir); + ci[WS(rs, 56)] = FMA(Tis, Tiq, Tiw); + } + { + E Tiz, TiC, Tix, TiA; + Tix = W[46]; + Tiz = Tix * Tiy; + TiC = Tix * TiB; + TiA = W[47]; + cr[WS(rs, 24)] = FNMS(TiA, TiB, Tiz); + ci[WS(rs, 24)] = FMA(TiA, Tiy, TiC); + } + { + E Tif, Ti2, Tig, Thx, Ti1; + Tif = FNMS(KP707106781, Tie, Tib); + Ti2 = W[79]; + Tig = Ti2 * Ti0; + Thx = W[78]; + Ti1 = Thx * Ti0; + cr[WS(rs, 40)] = FNMS(Ti2, Tif, Ti1); + ci[WS(rs, 40)] = FMA(Thx, Tif, Tig); + } + { + E Til, Tik, Tim, Tih, Tij; + Til = FMA(KP707106781, Tie, Tib); + Tik = W[15]; + Tim = Tik * Tii; + Tih = W[14]; + Tij = Tih * Tii; + cr[WS(rs, 8)] = FNMS(Tik, Til, Tij); + ci[WS(rs, 8)] = FMA(Tih, Til, Tim); + } + } + { + E Tjw, Tk2, Tk5, TjF, TjI, TjU, TjZ, TjM; + { + E TjE, TjX, Tjg, TjS, TjG, TjH, TjT, Tjv, TjY, Tjf, Tjn, Tju; + TjE = TjC - TjD; + TjX = FNMS(KP707106781, TjE, TjB); + Tjf = Tjb - Tje; + Tjg = FMA(KP707106781, Tjf, Tj8); + TjS = FNMS(KP707106781, Tjf, Tj8); + TjG = FMA(KP414213562, Tjq, Tjt); + TjH = FNMS(KP414213562, Tjj, Tjm); + TjT = TjG + TjH; + Tjn = FMA(KP414213562, Tjm, Tjj); + Tju = FNMS(KP414213562, Tjt, Tjq); + Tjv = Tjn - Tju; + TjY = Tju + Tjn; + Tjw = FNMS(KP923879532, Tjv, Tjg); + Tk2 = FMA(KP923879532, TjT, TjS); + Tk5 = FMA(KP923879532, TjY, TjX); + TjF = FMA(KP707106781, TjE, TjB); + TjI = TjG - TjH; + TjU = FNMS(KP923879532, TjT, TjS); + TjZ = FNMS(KP923879532, TjY, TjX); + TjM = FMA(KP923879532, Tjv, Tjg); + } + { + E TjV, Tk0, TjR, TjW; + TjR = W[54]; + TjV = TjR * TjU; + Tk0 = TjR * TjZ; + TjW = W[55]; + cr[WS(rs, 28)] = FNMS(TjW, TjZ, TjV); + ci[WS(rs, 28)] = FMA(TjW, TjU, Tk0); + } + { + E Tk3, Tk6, Tk1, Tk4; + Tk1 = W[118]; + Tk3 = Tk1 * Tk2; + Tk6 = Tk1 * Tk5; + Tk4 = W[119]; + cr[WS(rs, 60)] = FNMS(Tk4, Tk5, Tk3); + ci[WS(rs, 60)] = FMA(Tk4, Tk2, Tk6); + } + { + E TjJ, Tjy, TjK, Tj5, Tjx; + TjJ = FNMS(KP923879532, TjI, TjF); + Tjy = W[87]; + TjK = Tjy * Tjw; + Tj5 = W[86]; + Tjx = Tj5 * Tjw; + cr[WS(rs, 44)] = FNMS(Tjy, TjJ, Tjx); + ci[WS(rs, 44)] = FMA(Tj5, TjJ, TjK); + } + { + E TjP, TjO, TjQ, TjL, TjN; + TjP = FMA(KP923879532, TjI, TjF); + TjO = W[23]; + TjQ = TjO * TjM; + TjL = W[22]; + TjN = TjL * TjM; + cr[WS(rs, 12)] = FNMS(TjO, TjP, TjN); + ci[WS(rs, 12)] = FMA(TjL, TjP, TjQ); + } + } + { + E Tki, TkK, TkN, Tkn, Tkq, TkC, TkH, Tku; + { + E Tkm, TkF, Tka, TkA, Tko, Tkp, TkB, Tkh, TkG, Tk9, Tkd, Tkg; + Tkm = Tje + Tjb; + TkF = FMA(KP707106781, Tkm, Tkl); + Tk9 = TjC + TjD; + Tka = FNMS(KP707106781, Tk9, Tk8); + TkA = FMA(KP707106781, Tk9, Tk8); + Tko = FNMS(KP414213562, Tke, Tkf); + Tkp = FMA(KP414213562, Tkb, Tkc); + TkB = Tko + Tkp; + Tkd = FNMS(KP414213562, Tkc, Tkb); + Tkg = FMA(KP414213562, Tkf, Tke); + Tkh = Tkd - Tkg; + TkG = Tkg + Tkd; + Tki = FNMS(KP923879532, Tkh, Tka); + TkK = FMA(KP923879532, TkB, TkA); + TkN = FMA(KP923879532, TkG, TkF); + Tkn = FNMS(KP707106781, Tkm, Tkl); + Tkq = Tko - Tkp; + TkC = FNMS(KP923879532, TkB, TkA); + TkH = FNMS(KP923879532, TkG, TkF); + Tku = FMA(KP923879532, Tkh, Tka); + } + { + E TkD, TkI, Tkz, TkE; + Tkz = W[70]; + TkD = Tkz * TkC; + TkI = Tkz * TkH; + TkE = W[71]; + cr[WS(rs, 36)] = FNMS(TkE, TkH, TkD); + ci[WS(rs, 36)] = FMA(TkE, TkC, TkI); + } + { + E TkL, TkO, TkJ, TkM; + TkJ = W[6]; + TkL = TkJ * TkK; + TkO = TkJ * TkN; + TkM = W[7]; + cr[WS(rs, 4)] = FNMS(TkM, TkN, TkL); + ci[WS(rs, 4)] = FMA(TkM, TkK, TkO); + } + { + E Tkr, Tkk, Tks, Tk7, Tkj; + Tkr = FNMS(KP923879532, Tkq, Tkn); + Tkk = W[103]; + Tks = Tkk * Tki; + Tk7 = W[102]; + Tkj = Tk7 * Tki; + cr[WS(rs, 52)] = FNMS(Tkk, Tkr, Tkj); + ci[WS(rs, 52)] = FMA(Tk7, Tkr, Tks); + } + { + E Tkx, Tkw, Tky, Tkt, Tkv; + Tkx = FMA(KP923879532, Tkq, Tkn); + Tkw = W[39]; + Tky = Tkw * Tku; + Tkt = W[38]; + Tkv = Tkt * Tku; + cr[WS(rs, 20)] = FNMS(Tkw, Tkx, Tkv); + ci[WS(rs, 20)] = FMA(Tkt, Tkx, Tky); + } + } + { + E T5q, T66, T69, T5J, T5M, T5Y, T63, T5Q; + { + E T5F, T5I, T61, T5K, T5L, T5X, T3C, T5W, T5p, T62; + T5F = FNMS(KP923879532, T5E, T5B); + T5I = T5G - T5H; + T61 = FNMS(KP980785280, T5I, T5F); + T5K = FMA(KP820678790, T5a, T5n); + T5L = FNMS(KP820678790, T4h, T4u); + T5X = T5K + T5L; + { + E T2I, T3B, T4v, T5o; + T2I = FNMS(KP923879532, T2H, T2k); + T3B = T39 - T3A; + T3C = FMA(KP980785280, T3B, T2I); + T5W = FNMS(KP980785280, T3B, T2I); + T4v = FMA(KP820678790, T4u, T4h); + T5o = FNMS(KP820678790, T5n, T5a); + T5p = T4v - T5o; + T62 = T5o + T4v; + } + T5q = FNMS(KP773010453, T5p, T3C); + T66 = FMA(KP773010453, T5X, T5W); + T69 = FMA(KP773010453, T62, T61); + T5J = FMA(KP980785280, T5I, T5F); + T5M = T5K - T5L; + T5Y = FNMS(KP773010453, T5X, T5W); + T63 = FNMS(KP773010453, T62, T61); + T5Q = FMA(KP773010453, T5p, T3C); + } + { + E T5Z, T64, T5V, T60; + T5V = W[48]; + T5Z = T5V * T5Y; + T64 = T5V * T63; + T60 = W[49]; + cr[WS(rs, 25)] = FNMS(T60, T63, T5Z); + ci[WS(rs, 25)] = FMA(T60, T5Y, T64); + } + { + E T67, T6a, T65, T68; + T65 = W[112]; + T67 = T65 * T66; + T6a = T65 * T69; + T68 = W[113]; + cr[WS(rs, 57)] = FNMS(T68, T69, T67); + ci[WS(rs, 57)] = FMA(T68, T66, T6a); + } + { + E T5N, T5s, T5O, T23, T5r; + T5N = FNMS(KP773010453, T5M, T5J); + T5s = W[81]; + T5O = T5s * T5q; + T23 = W[80]; + T5r = T23 * T5q; + cr[WS(rs, 41)] = FNMS(T5s, T5N, T5r); + ci[WS(rs, 41)] = FMA(T23, T5N, T5O); + } + { + E T5T, T5S, T5U, T5P, T5R; + T5T = FMA(KP773010453, T5M, T5J); + T5S = W[17]; + T5U = T5S * T5Q; + T5P = W[16]; + T5R = T5P * T5Q; + cr[WS(rs, 9)] = FNMS(T5S, T5T, T5R); + ci[WS(rs, 9)] = FMA(T5P, T5T, T5U); + } + } + { + E Tge, TgG, TgK, Tgr, Tgu, TgC, TgF, Tgx; + { + E Tg5, Tgc, Tgd, Tgj, Tgm, Tgn, TfY, TgA, Tgq, TgB; + Tg5 = FMA(KP668178637, Tg4, Tg1); + Tgc = FNMS(KP668178637, Tgb, Tg8); + Tgd = Tg5 - Tgc; + Tgj = FNMS(KP707106781, Tgi, Tgh); + Tgm = Tgk - Tgl; + Tgn = FMA(KP923879532, Tgm, Tgj); + { + E TfQ, TfX, Tgo, Tgp; + TfQ = FNMS(KP707106781, TfP, TfO); + TfX = TfT - TfW; + TfY = FMA(KP923879532, TfX, TfQ); + TgA = FNMS(KP923879532, TfX, TfQ); + Tgo = FMA(KP668178637, Tg8, Tgb); + Tgp = FNMS(KP668178637, Tg1, Tg4); + Tgq = Tgo - Tgp; + TgB = Tgo + Tgp; + } + Tge = FNMS(KP831469612, Tgd, TfY); + TgG = Tgc + Tg5; + TgK = FMA(KP831469612, TgB, TgA); + Tgr = FNMS(KP831469612, Tgq, Tgn); + Tgu = FMA(KP831469612, Tgd, TfY); + TgC = FNMS(KP831469612, TgB, TgA); + TgF = FNMS(KP923879532, Tgm, Tgj); + Tgx = FMA(KP831469612, Tgq, Tgn); + } + { + E Tgf, Tgs, TfN, Tgg; + TfN = W[82]; + Tgf = TfN * Tge; + Tgs = TfN * Tgr; + Tgg = W[83]; + cr[WS(rs, 42)] = FNMS(Tgg, Tgr, Tgf); + ci[WS(rs, 42)] = FMA(Tgg, Tge, Tgs); + } + { + E Tgv, Tgy, Tgt, Tgw; + Tgt = W[18]; + Tgv = Tgt * Tgu; + Tgy = Tgt * Tgx; + Tgw = W[19]; + cr[WS(rs, 10)] = FNMS(Tgw, Tgx, Tgv); + ci[WS(rs, 10)] = FMA(Tgw, Tgu, Tgy); + } + { + E TgH, TgE, TgI, Tgz, TgD; + TgH = FNMS(KP831469612, TgG, TgF); + TgE = W[51]; + TgI = TgE * TgC; + Tgz = W[50]; + TgD = Tgz * TgC; + cr[WS(rs, 26)] = FNMS(TgE, TgH, TgD); + ci[WS(rs, 26)] = FMA(Tgz, TgH, TgI); + } + { + E TgN, TgM, TgO, TgJ, TgL; + TgN = FMA(KP831469612, TgG, TgF); + TgM = W[115]; + TgO = TgM * TgK; + TgJ = W[114]; + TgL = TgJ * TgK; + cr[WS(rs, 58)] = FNMS(TgM, TgN, TgL); + ci[WS(rs, 58)] = FMA(TgJ, TgN, TgO); + } + } + { + E Th0, Ths, Thv, Th5, Th8, Thk, Thp, Thc; + { + E Th3, Th4, Thn, Th6, Th7, Thj, TgS, Thi, TgZ, Tho; + Th3 = FMA(KP707106781, Tgi, Tgh); + Th4 = TfW + TfT; + Thn = FNMS(KP923879532, Th4, Th3); + Th6 = FMA(KP198912367, TgT, TgU); + Th7 = FNMS(KP198912367, TgW, TgX); + Thj = Th7 - Th6; + { + E TgQ, TgR, TgV, TgY; + TgQ = FMA(KP707106781, TfP, TfO); + TgR = Tgk + Tgl; + TgS = FMA(KP923879532, TgR, TgQ); + Thi = FNMS(KP923879532, TgR, TgQ); + TgV = FNMS(KP198912367, TgU, TgT); + TgY = FMA(KP198912367, TgX, TgW); + TgZ = TgV + TgY; + Tho = TgV - TgY; + } + Th0 = FNMS(KP980785280, TgZ, TgS); + Ths = FMA(KP980785280, Thj, Thi); + Thv = FMA(KP980785280, Tho, Thn); + Th5 = FMA(KP923879532, Th4, Th3); + Th8 = Th6 + Th7; + Thk = FNMS(KP980785280, Thj, Thi); + Thp = FNMS(KP980785280, Tho, Thn); + Thc = FMA(KP980785280, TgZ, TgS); + } + { + E Thl, Thq, Thh, Thm; + Thh = W[98]; + Thl = Thh * Thk; + Thq = Thh * Thp; + Thm = W[99]; + cr[WS(rs, 50)] = FNMS(Thm, Thp, Thl); + ci[WS(rs, 50)] = FMA(Thm, Thk, Thq); + } + { + E Tht, Thw, Thr, Thu; + Thr = W[34]; + Tht = Thr * Ths; + Thw = Thr * Thv; + Thu = W[35]; + cr[WS(rs, 18)] = FNMS(Thu, Thv, Tht); + ci[WS(rs, 18)] = FMA(Thu, Ths, Thw); + } + { + E Th9, Th2, Tha, TgP, Th1; + Th9 = FNMS(KP980785280, Th8, Th5); + Th2 = W[67]; + Tha = Th2 * Th0; + TgP = W[66]; + Th1 = TgP * Th0; + cr[WS(rs, 34)] = FNMS(Th2, Th9, Th1); + ci[WS(rs, 34)] = FMA(TgP, Th9, Tha); + } + { + E Thf, The, Thg, Thb, Thd; + Thf = FMA(KP980785280, Th8, Th5); + The = W[3]; + Thg = The * Thc; + Thb = W[2]; + Thd = Thb * Thc; + cr[WS(rs, 2)] = FNMS(The, Thf, Thd); + ci[WS(rs, 2)] = FMA(Thb, Thf, Thg); + } + } + { + E T6m, T6O, T6R, T6r, T6u, T6G, T6L, T6y; + { + E T6p, T6q, T6J, T6s, T6t, T6F, T6e, T6E, T6l, T6K; + T6p = FMA(KP923879532, T5E, T5B); + T6q = T3A + T39; + T6J = FMA(KP980785280, T6q, T6p); + T6s = FNMS(KP098491403, T6i, T6j); + T6t = FMA(KP098491403, T6f, T6g); + T6F = T6s + T6t; + { + E T6c, T6d, T6h, T6k; + T6c = FMA(KP923879532, T2H, T2k); + T6d = T5G + T5H; + T6e = FNMS(KP980785280, T6d, T6c); + T6E = FMA(KP980785280, T6d, T6c); + T6h = FNMS(KP098491403, T6g, T6f); + T6k = FMA(KP098491403, T6j, T6i); + T6l = T6h - T6k; + T6K = T6k + T6h; + } + T6m = FNMS(KP995184726, T6l, T6e); + T6O = FMA(KP995184726, T6F, T6E); + T6R = FMA(KP995184726, T6K, T6J); + T6r = FNMS(KP980785280, T6q, T6p); + T6u = T6s - T6t; + T6G = FNMS(KP995184726, T6F, T6E); + T6L = FNMS(KP995184726, T6K, T6J); + T6y = FMA(KP995184726, T6l, T6e); + } + { + E T6H, T6M, T6D, T6I; + T6D = W[64]; + T6H = T6D * T6G; + T6M = T6D * T6L; + T6I = W[65]; + cr[WS(rs, 33)] = FNMS(T6I, T6L, T6H); + ci[WS(rs, 33)] = FMA(T6I, T6G, T6M); + } + { + E T6P, T6S, T6N, T6Q; + T6N = W[0]; + T6P = T6N * T6O; + T6S = T6N * T6R; + T6Q = W[1]; + cr[WS(rs, 1)] = FNMS(T6Q, T6R, T6P); + ci[WS(rs, 1)] = FMA(T6Q, T6O, T6S); + } + { + E T6v, T6o, T6w, T6b, T6n; + T6v = FNMS(KP995184726, T6u, T6r); + T6o = W[97]; + T6w = T6o * T6m; + T6b = W[96]; + T6n = T6b * T6m; + cr[WS(rs, 49)] = FNMS(T6o, T6v, T6n); + ci[WS(rs, 49)] = FMA(T6b, T6v, T6w); + } + { + E T6B, T6A, T6C, T6x, T6z; + T6B = FMA(KP995184726, T6u, T6r); + T6A = W[33]; + T6C = T6A * T6y; + T6x = W[32]; + T6z = T6x * T6y; + cr[WS(rs, 17)] = FNMS(T6A, T6B, T6z); + ci[WS(rs, 17)] = FMA(T6x, T6B, T6C); + } + } + { + E Tbw, Tc2, Tc5, TbF, TbI, TbU, TbZ, TbM; + { + E TbB, TbE, TbX, TbG, TbH, TbT, Tbg, TbS, Tbv, TbY; + TbB = FMA(KP923879532, TbA, Tbz); + TbE = TbC - TbD; + TbX = FNMS(KP980785280, TbE, TbB); + TbG = FMA(KP820678790, Tbj, Tbm); + TbH = FMA(KP820678790, Tbq, Tbt); + TbT = TbG + TbH; + { + E Tb8, Tbf, Tbn, Tbu; + Tb8 = FNMS(KP923879532, Tb7, Tb6); + Tbf = Tbb + Tbe; + Tbg = FNMS(KP980785280, Tbf, Tb8); + TbS = FMA(KP980785280, Tbf, Tb8); + Tbn = FNMS(KP820678790, Tbm, Tbj); + Tbu = FNMS(KP820678790, Tbt, Tbq); + Tbv = Tbn + Tbu; + TbY = Tbn - Tbu; + } + Tbw = FNMS(KP773010453, Tbv, Tbg); + Tc2 = FMA(KP773010453, TbT, TbS); + Tc5 = FNMS(KP773010453, TbY, TbX); + TbF = FMA(KP980785280, TbE, TbB); + TbI = TbG - TbH; + TbU = FNMS(KP773010453, TbT, TbS); + TbZ = FMA(KP773010453, TbY, TbX); + TbM = FMA(KP773010453, Tbv, Tbg); + } + { + E TbV, Tc0, TbR, TbW; + TbR = W[44]; + TbV = TbR * TbU; + Tc0 = TbR * TbZ; + TbW = W[45]; + cr[WS(rs, 23)] = FNMS(TbW, TbZ, TbV); + ci[WS(rs, 23)] = FMA(TbW, TbU, Tc0); + } + { + E Tc3, Tc6, Tc1, Tc4; + Tc1 = W[108]; + Tc3 = Tc1 * Tc2; + Tc6 = Tc1 * Tc5; + Tc4 = W[109]; + cr[WS(rs, 55)] = FNMS(Tc4, Tc5, Tc3); + ci[WS(rs, 55)] = FMA(Tc4, Tc2, Tc6); + } + { + E TbJ, Tby, TbK, Tb5, Tbx; + TbJ = FNMS(KP773010453, TbI, TbF); + Tby = W[77]; + TbK = Tby * Tbw; + Tb5 = W[76]; + Tbx = Tb5 * Tbw; + cr[WS(rs, 39)] = FNMS(Tby, TbJ, Tbx); + ci[WS(rs, 39)] = FMA(Tb5, TbJ, TbK); + } + { + E TbP, TbO, TbQ, TbL, TbN; + TbP = FMA(KP773010453, TbI, TbF); + TbO = W[13]; + TbQ = TbO * TbM; + TbL = W[12]; + TbN = TbL * TbM; + cr[WS(rs, 7)] = FNMS(TbO, TbP, TbN); + ci[WS(rs, 7)] = FMA(TbL, TbP, TbQ); + } + } + { + E Tay, Tb0, Tb3, TaD, TaG, TaS, TaX, TaK; + { + E TaB, TaC, TaV, TaE, TaF, TaR, Taq, TaQ, Tax, TaW; + TaB = FMA(KP923879532, T9Q, T9N); + TaC = T8V - T92; + TaV = FNMS(KP831469612, TaC, TaB); + TaE = FMA(KP303346683, Tar, Tas); + TaF = FMA(KP303346683, Tau, Tav); + TaR = TaE + TaF; + { + E Tao, Tap, Tat, Taw; + Tao = FNMS(KP923879532, T8N, T8G); + Tap = T9S + T9T; + Taq = FMA(KP831469612, Tap, Tao); + TaQ = FNMS(KP831469612, Tap, Tao); + Tat = FNMS(KP303346683, Tas, Tar); + Taw = FNMS(KP303346683, Tav, Tau); + Tax = Tat + Taw; + TaW = Tat - Taw; + } + Tay = FNMS(KP956940335, Tax, Taq); + Tb0 = FMA(KP956940335, TaR, TaQ); + Tb3 = FNMS(KP956940335, TaW, TaV); + TaD = FMA(KP831469612, TaC, TaB); + TaG = TaE - TaF; + TaS = FNMS(KP956940335, TaR, TaQ); + TaX = FMA(KP956940335, TaW, TaV); + TaK = FMA(KP956940335, Tax, Taq); + } + { + E TaT, TaY, TaP, TaU; + TaP = W[36]; + TaT = TaP * TaS; + TaY = TaP * TaX; + TaU = W[37]; + cr[WS(rs, 19)] = FNMS(TaU, TaX, TaT); + ci[WS(rs, 19)] = FMA(TaU, TaS, TaY); + } + { + E Tb1, Tb4, TaZ, Tb2; + TaZ = W[100]; + Tb1 = TaZ * Tb0; + Tb4 = TaZ * Tb3; + Tb2 = W[101]; + cr[WS(rs, 51)] = FNMS(Tb2, Tb3, Tb1); + ci[WS(rs, 51)] = FMA(Tb2, Tb0, Tb4); + } + { + E TaH, TaA, TaI, Tan, Taz; + TaH = FNMS(KP956940335, TaG, TaD); + TaA = W[69]; + TaI = TaA * Tay; + Tan = W[68]; + Taz = Tan * Tay; + cr[WS(rs, 35)] = FNMS(TaA, TaH, Taz); + ci[WS(rs, 35)] = FMA(Tan, TaH, TaI); + } + { + E TaN, TaM, TaO, TaJ, TaL; + TaN = FMA(KP956940335, TaG, TaD); + TaM = W[5]; + TaO = TaM * TaK; + TaJ = W[4]; + TaL = TaJ * TaK; + cr[WS(rs, 3)] = FNMS(TaM, TaN, TaL); + ci[WS(rs, 3)] = FMA(TaJ, TaN, TaO); + } + } + { + E Tfg, TfI, TfL, Tfl, Tfo, TfA, TfF, Tfs; + { + E Tfj, Tfk, TfD, Tfm, Tfn, Tfz, Tf8, Tfy, Tff, TfE; + Tfj = FNMS(KP707106781, Tey, Tev); + Tfk = Tds + Tdh; + TfD = FMA(KP923879532, Tfk, Tfj); + Tfm = FMA(KP198912367, Tfc, Tfd); + Tfn = FNMS(KP198912367, Tf9, Tfa); + Tfz = Tfm + Tfn; + { + E Tf6, Tf7, Tfb, Tfe; + Tf6 = FNMS(KP707106781, Td5, TcU); + Tf7 = TeA + TeB; + Tf8 = FNMS(KP923879532, Tf7, Tf6); + Tfy = FMA(KP923879532, Tf7, Tf6); + Tfb = FMA(KP198912367, Tfa, Tf9); + Tfe = FNMS(KP198912367, Tfd, Tfc); + Tff = Tfb - Tfe; + TfE = Tfe + Tfb; + } + Tfg = FNMS(KP980785280, Tff, Tf8); + TfI = FMA(KP980785280, Tfz, Tfy); + TfL = FMA(KP980785280, TfE, TfD); + Tfl = FNMS(KP923879532, Tfk, Tfj); + Tfo = Tfm - Tfn; + TfA = FNMS(KP980785280, Tfz, Tfy); + TfF = FNMS(KP980785280, TfE, TfD); + Tfs = FMA(KP980785280, Tff, Tf8); + } + { + E TfB, TfG, Tfx, TfC; + Tfx = W[58]; + TfB = Tfx * TfA; + TfG = Tfx * TfF; + TfC = W[59]; + cr[WS(rs, 30)] = FNMS(TfC, TfF, TfB); + ci[WS(rs, 30)] = FMA(TfC, TfA, TfG); + } + { + E TfJ, TfM, TfH, TfK; + TfH = W[122]; + TfJ = TfH * TfI; + TfM = TfH * TfL; + TfK = W[123]; + cr[WS(rs, 62)] = FNMS(TfK, TfL, TfJ); + ci[WS(rs, 62)] = FMA(TfK, TfI, TfM); + } + { + E Tfp, Tfi, Tfq, Tf5, Tfh; + Tfp = FNMS(KP980785280, Tfo, Tfl); + Tfi = W[91]; + Tfq = Tfi * Tfg; + Tf5 = W[90]; + Tfh = Tf5 * Tfg; + cr[WS(rs, 46)] = FNMS(Tfi, Tfp, Tfh); + ci[WS(rs, 46)] = FMA(Tf5, Tfp, Tfq); + } + { + E Tfv, Tfu, Tfw, Tfr, Tft; + Tfv = FMA(KP980785280, Tfo, Tfl); + Tfu = W[27]; + Tfw = Tfu * Tfs; + Tfr = W[26]; + Tft = Tfr * Tfs; + cr[WS(rs, 14)] = FNMS(Tfu, Tfv, Tft); + ci[WS(rs, 14)] = FMA(Tfr, Tfv, Tfw); + } + } + { + E T7k, T7Q, T7T, T7t, T7w, T7I, T7N, T7A; + { + E T7p, T7s, T7L, T7u, T7v, T7H, T74, T7G, T7j, T7M; + T7p = FMA(KP923879532, T7o, T7n); + T7s = T7q - T7r; + T7L = FNMS(KP831469612, T7s, T7p); + T7u = FMA(KP534511135, T77, T7a); + T7v = FNMS(KP534511135, T7e, T7h); + T7H = T7v - T7u; + { + E T6W, T73, T7b, T7i; + T6W = FMA(KP923879532, T6V, T6U); + T73 = T6Z - T72; + T74 = FMA(KP831469612, T73, T6W); + T7G = FNMS(KP831469612, T73, T6W); + T7b = FNMS(KP534511135, T7a, T77); + T7i = FMA(KP534511135, T7h, T7e); + T7j = T7b + T7i; + T7M = T7b - T7i; + } + T7k = FNMS(KP881921264, T7j, T74); + T7Q = FMA(KP881921264, T7H, T7G); + T7T = FMA(KP881921264, T7M, T7L); + T7t = FMA(KP831469612, T7s, T7p); + T7w = T7u + T7v; + T7I = FNMS(KP881921264, T7H, T7G); + T7N = FNMS(KP881921264, T7M, T7L); + T7A = FMA(KP881921264, T7j, T74); + } + { + E T7J, T7O, T7F, T7K; + T7F = W[104]; + T7J = T7F * T7I; + T7O = T7F * T7N; + T7K = W[105]; + cr[WS(rs, 53)] = FNMS(T7K, T7N, T7J); + ci[WS(rs, 53)] = FMA(T7K, T7I, T7O); + } + { + E T7R, T7U, T7P, T7S; + T7P = W[40]; + T7R = T7P * T7Q; + T7U = T7P * T7T; + T7S = W[41]; + cr[WS(rs, 21)] = FNMS(T7S, T7T, T7R); + ci[WS(rs, 21)] = FMA(T7S, T7Q, T7U); + } + { + E T7x, T7m, T7y, T6T, T7l; + T7x = FNMS(KP881921264, T7w, T7t); + T7m = W[73]; + T7y = T7m * T7k; + T6T = W[72]; + T7l = T6T * T7k; + cr[WS(rs, 37)] = FNMS(T7m, T7x, T7l); + ci[WS(rs, 37)] = FMA(T6T, T7x, T7y); + } + { + E T7D, T7C, T7E, T7z, T7B; + T7D = FMA(KP881921264, T7w, T7t); + T7C = W[9]; + T7E = T7C * T7A; + T7z = W[8]; + T7B = T7z * T7A; + cr[WS(rs, 5)] = FNMS(T7C, T7D, T7B); + ci[WS(rs, 5)] = FMA(T7z, T7D, T7E); + } + } + { + E T86, T8u, T8y, T8f, T8i, T8q, T8t, T8l; + { + E T81, T84, T85, T89, T8a, T8b, T7Y, T8o, T8e, T8p; + T81 = FMA(KP303346683, T80, T7Z); + T84 = FNMS(KP303346683, T83, T82); + T85 = T81 - T84; + T89 = FNMS(KP923879532, T7o, T7n); + T8a = T72 + T6Z; + T8b = FNMS(KP831469612, T8a, T89); + { + E T7W, T7X, T8c, T8d; + T7W = FNMS(KP923879532, T6V, T6U); + T7X = T7q + T7r; + T7Y = FNMS(KP831469612, T7X, T7W); + T8o = FMA(KP831469612, T7X, T7W); + T8c = FMA(KP303346683, T82, T83); + T8d = FNMS(KP303346683, T7Z, T80); + T8e = T8c - T8d; + T8p = T8c + T8d; + } + T86 = FNMS(KP956940335, T85, T7Y); + T8u = T84 + T81; + T8y = FMA(KP956940335, T8p, T8o); + T8f = FNMS(KP956940335, T8e, T8b); + T8i = FMA(KP956940335, T85, T7Y); + T8q = FNMS(KP956940335, T8p, T8o); + T8t = FMA(KP831469612, T8a, T89); + T8l = FMA(KP956940335, T8e, T8b); + } + { + E T87, T8g, T7V, T88; + T7V = W[88]; + T87 = T7V * T86; + T8g = T7V * T8f; + T88 = W[89]; + cr[WS(rs, 45)] = FNMS(T88, T8f, T87); + ci[WS(rs, 45)] = FMA(T88, T86, T8g); + } + { + E T8j, T8m, T8h, T8k; + T8h = W[24]; + T8j = T8h * T8i; + T8m = T8h * T8l; + T8k = W[25]; + cr[WS(rs, 13)] = FNMS(T8k, T8l, T8j); + ci[WS(rs, 13)] = FMA(T8k, T8i, T8m); + } + { + E T8v, T8s, T8w, T8n, T8r; + T8v = FNMS(KP956940335, T8u, T8t); + T8s = W[57]; + T8w = T8s * T8q; + T8n = W[56]; + T8r = T8n * T8q; + cr[WS(rs, 29)] = FNMS(T8s, T8v, T8r); + ci[WS(rs, 29)] = FMA(T8n, T8v, T8w); + } + { + E T8B, T8A, T8C, T8x, T8z; + T8B = FMA(KP956940335, T8u, T8t); + T8A = W[121]; + T8C = T8A * T8y; + T8x = W[120]; + T8z = T8x * T8y; + cr[WS(rs, 61)] = FNMS(T8A, T8B, T8z); + ci[WS(rs, 61)] = FMA(T8x, T8B, T8C); + } + } + { + E T9I, Tai, Tal, T9V, T9Y, Taa, Taf, Ta2; + { + E T9R, T9U, Tad, T9W, T9X, Ta9, T94, Ta8, T9H, Tae; + T9R = FNMS(KP923879532, T9Q, T9N); + T9U = T9S - T9T; + Tad = FNMS(KP831469612, T9U, T9R); + T9W = FMA(KP534511135, T9f, T9m); + T9X = FMA(KP534511135, T9y, T9F); + Ta9 = T9W + T9X; + { + E T8O, T93, T9n, T9G; + T8O = FMA(KP923879532, T8N, T8G); + T93 = T8V + T92; + T94 = FNMS(KP831469612, T93, T8O); + Ta8 = FMA(KP831469612, T93, T8O); + T9n = FNMS(KP534511135, T9m, T9f); + T9G = FNMS(KP534511135, T9F, T9y); + T9H = T9n + T9G; + Tae = T9G - T9n; + } + T9I = FMA(KP881921264, T9H, T94); + Tai = FMA(KP881921264, Ta9, Ta8); + Tal = FNMS(KP881921264, Tae, Tad); + T9V = FMA(KP831469612, T9U, T9R); + T9Y = T9W - T9X; + Taa = FNMS(KP881921264, Ta9, Ta8); + Taf = FMA(KP881921264, Tae, Tad); + Ta2 = FNMS(KP881921264, T9H, T94); + } + { + E Tab, Tag, Ta7, Tac; + Ta7 = W[52]; + Tab = Ta7 * Taa; + Tag = Ta7 * Taf; + Tac = W[53]; + cr[WS(rs, 27)] = FNMS(Tac, Taf, Tab); + ci[WS(rs, 27)] = FMA(Tac, Taa, Tag); + } + { + E Taj, Tam, Tah, Tak; + Tah = W[116]; + Taj = Tah * Tai; + Tam = Tah * Tal; + Tak = W[117]; + cr[WS(rs, 59)] = FNMS(Tak, Tal, Taj); + ci[WS(rs, 59)] = FMA(Tak, Tai, Tam); + } + { + E T9Z, T9K, Ta0, T8D, T9J; + T9Z = FNMS(KP881921264, T9Y, T9V); + T9K = W[85]; + Ta0 = T9K * T9I; + T8D = W[84]; + T9J = T8D * T9I; + cr[WS(rs, 43)] = FNMS(T9K, T9Z, T9J); + ci[WS(rs, 43)] = FMA(T8D, T9Z, Ta0); + } + { + E Ta5, Ta4, Ta6, Ta1, Ta3; + Ta5 = FMA(KP881921264, T9Y, T9V); + Ta4 = W[21]; + Ta6 = Ta4 * Ta2; + Ta1 = W[20]; + Ta3 = Ta1 * Ta2; + cr[WS(rs, 11)] = FNMS(Ta4, Ta5, Ta3); + ci[WS(rs, 11)] = FMA(Ta1, Ta5, Ta6); + } + } + { + E Teo, Tf0, Tf3, TeD, TeG, TeS, TeX, TeK; + { + E Tez, TeC, TeV, TeE, TeF, TeR, Tdu, TeQ, Ten, TeW; + Tez = FMA(KP707106781, Tey, Tev); + TeC = TeA - TeB; + TeV = FMA(KP923879532, TeC, Tez); + TeE = FNMS(KP668178637, Tec, Tel); + TeF = FMA(KP668178637, TdL, TdU); + TeR = TeE + TeF; + { + E Td6, Tdt, TdV, Tem; + Td6 = FMA(KP707106781, Td5, TcU); + Tdt = Tdh - Tds; + Tdu = FNMS(KP923879532, Tdt, Td6); + TeQ = FMA(KP923879532, Tdt, Td6); + TdV = FNMS(KP668178637, TdU, TdL); + Tem = FMA(KP668178637, Tel, Tec); + Ten = TdV - Tem; + TeW = Tem + TdV; + } + Teo = FNMS(KP831469612, Ten, Tdu); + Tf0 = FMA(KP831469612, TeR, TeQ); + Tf3 = FMA(KP831469612, TeW, TeV); + TeD = FNMS(KP923879532, TeC, Tez); + TeG = TeE - TeF; + TeS = FNMS(KP831469612, TeR, TeQ); + TeX = FNMS(KP831469612, TeW, TeV); + TeK = FMA(KP831469612, Ten, Tdu); + } + { + E TeT, TeY, TeP, TeU; + TeP = W[74]; + TeT = TeP * TeS; + TeY = TeP * TeX; + TeU = W[75]; + cr[WS(rs, 38)] = FNMS(TeU, TeX, TeT); + ci[WS(rs, 38)] = FMA(TeU, TeS, TeY); + } + { + E Tf1, Tf4, TeZ, Tf2; + TeZ = W[10]; + Tf1 = TeZ * Tf0; + Tf4 = TeZ * Tf3; + Tf2 = W[11]; + cr[WS(rs, 6)] = FNMS(Tf2, Tf3, Tf1); + ci[WS(rs, 6)] = FMA(Tf2, Tf0, Tf4); + } + { + E TeH, Teq, TeI, TcP, Tep; + TeH = FNMS(KP831469612, TeG, TeD); + Teq = W[107]; + TeI = Teq * Teo; + TcP = W[106]; + Tep = TcP * Teo; + cr[WS(rs, 54)] = FNMS(Teq, TeH, Tep); + ci[WS(rs, 54)] = FMA(TcP, TeH, TeI); + } + { + E TeN, TeM, TeO, TeJ, TeL; + TeN = FMA(KP831469612, TeG, TeD); + TeM = W[43]; + TeO = TeM * TeK; + TeJ = W[42]; + TeL = TeJ * TeK; + cr[WS(rs, 22)] = FNMS(TeM, TeN, TeL); + ci[WS(rs, 22)] = FMA(TeJ, TeN, TeO); + } + } + { + E Tci, TcK, TcN, Tcn, Tcq, TcC, TcH, Tcu; + { + E Tcl, Tcm, TcF, Tco, Tcp, TcB, Tca, TcA, Tch, TcG; + Tcl = FNMS(KP923879532, TbA, Tbz); + Tcm = Tbe - Tbb; + TcF = FNMS(KP980785280, Tcm, Tcl); + Tco = FMA(KP098491403, Tcb, Tcc); + Tcp = FMA(KP098491403, Tce, Tcf); + TcB = Tco + Tcp; + { + E Tc8, Tc9, Tcd, Tcg; + Tc8 = FMA(KP923879532, Tb7, Tb6); + Tc9 = TbC + TbD; + Tca = FNMS(KP980785280, Tc9, Tc8); + TcA = FMA(KP980785280, Tc9, Tc8); + Tcd = FNMS(KP098491403, Tcc, Tcb); + Tcg = FNMS(KP098491403, Tcf, Tce); + Tch = Tcd + Tcg; + TcG = Tcg - Tcd; + } + Tci = FMA(KP995184726, Tch, Tca); + TcK = FMA(KP995184726, TcB, TcA); + TcN = FNMS(KP995184726, TcG, TcF); + Tcn = FMA(KP980785280, Tcm, Tcl); + Tcq = Tco - Tcp; + TcC = FNMS(KP995184726, TcB, TcA); + TcH = FMA(KP995184726, TcG, TcF); + Tcu = FNMS(KP995184726, Tch, Tca); + } + { + E TcD, TcI, Tcz, TcE; + Tcz = W[60]; + TcD = Tcz * TcC; + TcI = Tcz * TcH; + TcE = W[61]; + cr[WS(rs, 31)] = FNMS(TcE, TcH, TcD); + ci[WS(rs, 31)] = FMA(TcE, TcC, TcI); + } + { + E TcL, TcO, TcJ, TcM; + TcJ = W[124]; + TcL = TcJ * TcK; + TcO = TcJ * TcN; + TcM = W[125]; + cr[WS(rs, 63)] = FNMS(TcM, TcN, TcL); + ci[WS(rs, 63)] = FMA(TcM, TcK, TcO); + } + { + E Tcr, Tck, Tcs, Tc7, Tcj; + Tcr = FNMS(KP995184726, Tcq, Tcn); + Tck = W[93]; + Tcs = Tck * Tci; + Tc7 = W[92]; + Tcj = Tc7 * Tci; + cr[WS(rs, 47)] = FNMS(Tck, Tcr, Tcj); + ci[WS(rs, 47)] = FMA(Tc7, Tcr, Tcs); + } + { + E Tcx, Tcw, Tcy, Tct, Tcv; + Tcx = FMA(KP995184726, Tcq, Tcn); + Tcw = W[29]; + Tcy = Tcw * Tcu; + Tct = W[28]; + Tcv = Tct * Tcu; + cr[WS(rs, 15)] = FNMS(Tcw, Tcx, Tcv); + ci[WS(rs, 15)] = FMA(Tct, Tcx, Tcy); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 64}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 64, "hb_64", twinstr, &GENUS, {520, 126, 518, 0} }; + +void X(codelet_hb_64) (planner *p) { + X(khc2hc_register) (p, hb_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 64 -dif -name hb_64 -include rdft/scalar/hb.h */ + +/* + * This function contains 1038 FP additions, 500 FP multiplications, + * (or, 808 additions, 270 multiplications, 230 fused multiply/add), + * 196 stack variables, 15 constants, and 256 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_64(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 126); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 126, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tf, T8C, Tfa, Thk, Tgg, ThM, T2c, T5O, T4K, T6g, Tag, TdE, TcA, Te6, T7P; + E T94, TK, T7o, T38, T4P, Tfv, Thn, T5W, T6j, Tb0, TdK, Tfs, Tho, T8K, T97; + E Tb7, TdL, TZ, T7l, T2P, T4Q, Tfo, Thq, T5T, T6k, TaH, TdH, Tfl, Thr, T8H; + E T98, TaO, TdI, Tu, T95, Tfh, ThN, Tgj, Thl, T2v, T6h, T4N, T5P, Tav, Te7; + E TcD, TdF, T7S, T8D, T1L, T20, T7A, T7D, T7G, T7H, T40, T62, Tg1, Thv, Tg8; + E Thz, Tg5, Thw, T4t, T5Z, T4j, T60, T4w, T63, TbY, TdS, Tcd, TdQ, TfU, Thy; + E T8P, T9z, T8S, T9A, Tcl, TdP, Tco, TdT, T1g, T1v, T7r, T7u, T7x, T7y, T3j; + E T69, TfI, ThD, TfP, ThG, TfM, ThC, T3M, T66, T3C, T67, T3P, T6a, Tbl, TdZ; + E TbA, TdX, TfB, ThF, T8W, T9C, T8Z, T9D, TbI, TdW, TbL, Te0; + { + E T3, Ta6, T6, Tcu, T4I, Ta7, T4F, Tcv, Td, Tcy, T27, Tae, Ta, Tcx, T2a; + E Tab; + { + E T1, T2, T4D, T4E; + T1 = cr[0]; + T2 = ci[WS(rs, 31)]; + T3 = T1 + T2; + Ta6 = T1 - T2; + { + E T4, T5, T4G, T4H; + T4 = cr[WS(rs, 16)]; + T5 = ci[WS(rs, 15)]; + T6 = T4 + T5; + Tcu = T4 - T5; + T4G = ci[WS(rs, 47)]; + T4H = cr[WS(rs, 48)]; + T4I = T4G - T4H; + Ta7 = T4G + T4H; + } + T4D = ci[WS(rs, 63)]; + T4E = cr[WS(rs, 32)]; + T4F = T4D - T4E; + Tcv = T4D + T4E; + { + E Tb, Tc, Tac, T25, T26, Tad; + Tb = ci[WS(rs, 7)]; + Tc = cr[WS(rs, 24)]; + Tac = Tb - Tc; + T25 = ci[WS(rs, 39)]; + T26 = cr[WS(rs, 56)]; + Tad = T25 + T26; + Td = Tb + Tc; + Tcy = Tac + Tad; + T27 = T25 - T26; + Tae = Tac - Tad; + } + { + E T8, T9, Ta9, T28, T29, Taa; + T8 = cr[WS(rs, 8)]; + T9 = ci[WS(rs, 23)]; + Ta9 = T8 - T9; + T28 = ci[WS(rs, 55)]; + T29 = cr[WS(rs, 40)]; + Taa = T28 + T29; + Ta = T8 + T9; + Tcx = Ta9 + Taa; + T2a = T28 - T29; + Tab = Ta9 - Taa; + } + } + { + E T7, Te, Tf8, Tf9; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T8C = T7 - Te; + Tf8 = Ta6 + Ta7; + Tf9 = KP707106781 * (Tcx + Tcy); + Tfa = Tf8 - Tf9; + Thk = Tf8 + Tf9; + } + { + E Tge, Tgf, T24, T2b; + Tge = Tcv - Tcu; + Tgf = KP707106781 * (Tab - Tae); + Tgg = Tge + Tgf; + ThM = Tge - Tgf; + T24 = T3 - T6; + T2b = T27 - T2a; + T2c = T24 + T2b; + T5O = T24 - T2b; + } + { + E T4C, T4J, Ta8, Taf; + T4C = Ta - Td; + T4J = T4F - T4I; + T4K = T4C + T4J; + T6g = T4J - T4C; + Ta8 = Ta6 - Ta7; + Taf = KP707106781 * (Tab + Tae); + Tag = Ta8 - Taf; + TdE = Ta8 + Taf; + } + { + E Tcw, Tcz, T7N, T7O; + Tcw = Tcu + Tcv; + Tcz = KP707106781 * (Tcx - Tcy); + TcA = Tcw - Tcz; + Te6 = Tcw + Tcz; + T7N = T4F + T4I; + T7O = T2a + T27; + T7P = T7N + T7O; + T94 = T7N - T7O; + } + } + { + E TC, Tb1, T2Z, TaQ, T2X, Tb2, T7m, TaR, TJ, Tb4, Tb5, T2Q, T36, TaV, TaY; + E T7n, Tfq, Tfr; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = cr[WS(rs, 2)]; + Tx = ci[WS(rs, 29)]; + Ty = Tw + Tx; + Tz = cr[WS(rs, 18)]; + TA = ci[WS(rs, 13)]; + TB = Tz + TA; + TC = Ty + TB; + Tb1 = Tz - TA; + T2Z = Ty - TB; + TaQ = Tw - Tx; + } + { + E T2R, T2S, T2T, T2U, T2V, T2W; + T2R = ci[WS(rs, 61)]; + T2S = cr[WS(rs, 34)]; + T2T = T2R - T2S; + T2U = ci[WS(rs, 45)]; + T2V = cr[WS(rs, 50)]; + T2W = T2U - T2V; + T2X = T2T - T2W; + Tb2 = T2R + T2S; + T7m = T2T + T2W; + TaR = T2U + T2V; + } + { + E TF, TaT, T35, TaU, TI, TaW, T32, TaX; + { + E TD, TE, T33, T34; + TD = cr[WS(rs, 10)]; + TE = ci[WS(rs, 21)]; + TF = TD + TE; + TaT = TD - TE; + T33 = ci[WS(rs, 53)]; + T34 = cr[WS(rs, 42)]; + T35 = T33 - T34; + TaU = T33 + T34; + } + { + E TG, TH, T30, T31; + TG = ci[WS(rs, 5)]; + TH = cr[WS(rs, 26)]; + TI = TG + TH; + TaW = TG - TH; + T30 = ci[WS(rs, 37)]; + T31 = cr[WS(rs, 58)]; + T32 = T30 - T31; + TaX = T30 + T31; + } + TJ = TF + TI; + Tb4 = TaT + TaU; + Tb5 = TaW + TaX; + T2Q = TF - TI; + T36 = T32 - T35; + TaV = TaT - TaU; + TaY = TaW - TaX; + T7n = T35 + T32; + } + TK = TC + TJ; + T7o = T7m + T7n; + { + E T2Y, T37, Tft, Tfu; + T2Y = T2Q + T2X; + T37 = T2Z + T36; + T38 = FMA(KP923879532, T2Y, KP382683432 * T37); + T4P = FNMS(KP382683432, T2Y, KP923879532 * T37); + Tft = TaQ + TaR; + Tfu = KP707106781 * (Tb4 + Tb5); + Tfv = Tft - Tfu; + Thn = Tft + Tfu; + } + { + E T5U, T5V, TaS, TaZ; + T5U = T2X - T2Q; + T5V = T2Z - T36; + T5W = FMA(KP382683432, T5U, KP923879532 * T5V); + T6j = FNMS(KP923879532, T5U, KP382683432 * T5V); + TaS = TaQ - TaR; + TaZ = KP707106781 * (TaV + TaY); + Tb0 = TaS - TaZ; + TdK = TaS + TaZ; + } + Tfq = Tb2 - Tb1; + Tfr = KP707106781 * (TaV - TaY); + Tfs = Tfq + Tfr; + Tho = Tfq - Tfr; + { + E T8I, T8J, Tb3, Tb6; + T8I = TC - TJ; + T8J = T7m - T7n; + T8K = T8I + T8J; + T97 = T8I - T8J; + Tb3 = Tb1 + Tb2; + Tb6 = KP707106781 * (Tb4 - Tb5); + Tb7 = Tb3 - Tb6; + TdL = Tb3 + Tb6; + } + } + { + E TR, TaI, T2G, Tax, T2E, TaJ, T7j, Tay, TY, TaL, TaM, T2x, T2N, TaC, TaF; + E T7k, Tfj, Tfk; + { + E TL, TM, TN, TO, TP, TQ; + TL = ci[WS(rs, 1)]; + TM = cr[WS(rs, 30)]; + TN = TL + TM; + TO = cr[WS(rs, 14)]; + TP = ci[WS(rs, 17)]; + TQ = TO + TP; + TR = TN + TQ; + TaI = TL - TM; + T2G = TN - TQ; + Tax = TO - TP; + } + { + E T2y, T2z, T2A, T2B, T2C, T2D; + T2y = ci[WS(rs, 33)]; + T2z = cr[WS(rs, 62)]; + T2A = T2y - T2z; + T2B = ci[WS(rs, 49)]; + T2C = cr[WS(rs, 46)]; + T2D = T2B - T2C; + T2E = T2A - T2D; + TaJ = T2B + T2C; + T7j = T2A + T2D; + Tay = T2y + T2z; + } + { + E TU, TaA, T2M, TaB, TX, TaD, T2J, TaE; + { + E TS, TT, T2K, T2L; + TS = cr[WS(rs, 6)]; + TT = ci[WS(rs, 25)]; + TU = TS + TT; + TaA = TS - TT; + T2K = ci[WS(rs, 57)]; + T2L = cr[WS(rs, 38)]; + T2M = T2K - T2L; + TaB = T2K + T2L; + } + { + E TV, TW, T2H, T2I; + TV = ci[WS(rs, 9)]; + TW = cr[WS(rs, 22)]; + TX = TV + TW; + TaD = TV - TW; + T2H = ci[WS(rs, 41)]; + T2I = cr[WS(rs, 54)]; + T2J = T2H - T2I; + TaE = T2H + T2I; + } + TY = TU + TX; + TaL = TaA - TaB; + TaM = TaD - TaE; + T2x = TU - TX; + T2N = T2J - T2M; + TaC = TaA + TaB; + TaF = TaD + TaE; + T7k = T2M + T2J; + } + TZ = TR + TY; + T7l = T7j + T7k; + { + E T2F, T2O, Tfm, Tfn; + T2F = T2x + T2E; + T2O = T2G + T2N; + T2P = FNMS(KP382683432, T2O, KP923879532 * T2F); + T4Q = FMA(KP382683432, T2F, KP923879532 * T2O); + Tfm = TaI + TaJ; + Tfn = KP707106781 * (TaC + TaF); + Tfo = Tfm - Tfn; + Thq = Tfm + Tfn; + } + { + E T5R, T5S, Taz, TaG; + T5R = T2E - T2x; + T5S = T2G - T2N; + T5T = FNMS(KP923879532, T5S, KP382683432 * T5R); + T6k = FMA(KP923879532, T5R, KP382683432 * T5S); + Taz = Tax - Tay; + TaG = KP707106781 * (TaC - TaF); + TaH = Taz - TaG; + TdH = Taz + TaG; + } + Tfj = KP707106781 * (TaL - TaM); + Tfk = Tax + Tay; + Tfl = Tfj - Tfk; + Thr = Tfk + Tfj; + { + E T8F, T8G, TaK, TaN; + T8F = T7j - T7k; + T8G = TR - TY; + T8H = T8F - T8G; + T98 = T8G + T8F; + TaK = TaI - TaJ; + TaN = KP707106781 * (TaL + TaM); + TaO = TaK - TaN; + TdI = TaK + TaN; + } + } + { + E Ti, T2j, Tl, T2g, T2d, T2k, Tfc, Tfb, Tat, Taq, Tp, T2s, Ts, T2p, T2m; + E T2t, Tff, Tfe, Tam, Taj; + { + E Tar, Tas, Tao, Tap; + { + E Tg, Th, T2h, T2i; + Tg = cr[WS(rs, 4)]; + Th = ci[WS(rs, 27)]; + Ti = Tg + Th; + Tar = Tg - Th; + T2h = ci[WS(rs, 43)]; + T2i = cr[WS(rs, 52)]; + T2j = T2h - T2i; + Tas = T2h + T2i; + } + { + E Tj, Tk, T2e, T2f; + Tj = cr[WS(rs, 20)]; + Tk = ci[WS(rs, 11)]; + Tl = Tj + Tk; + Tao = Tj - Tk; + T2e = ci[WS(rs, 59)]; + T2f = cr[WS(rs, 36)]; + T2g = T2e - T2f; + Tap = T2e + T2f; + } + T2d = Ti - Tl; + T2k = T2g - T2j; + Tfc = Tap - Tao; + Tfb = Tar + Tas; + Tat = Tar - Tas; + Taq = Tao + Tap; + } + { + E Tak, Tal, Tah, Tai; + { + E Tn, To, T2q, T2r; + Tn = ci[WS(rs, 3)]; + To = cr[WS(rs, 28)]; + Tp = Tn + To; + Tak = Tn - To; + T2q = ci[WS(rs, 51)]; + T2r = cr[WS(rs, 44)]; + T2s = T2q - T2r; + Tal = T2q + T2r; + } + { + E Tq, Tr, T2n, T2o; + Tq = cr[WS(rs, 12)]; + Tr = ci[WS(rs, 19)]; + Ts = Tq + Tr; + Tah = Tq - Tr; + T2n = ci[WS(rs, 35)]; + T2o = cr[WS(rs, 60)]; + T2p = T2n - T2o; + Tai = T2n + T2o; + } + T2m = Tp - Ts; + T2t = T2p - T2s; + Tff = Tah + Tai; + Tfe = Tak + Tal; + Tam = Tak - Tal; + Taj = Tah - Tai; + } + { + E Tm, Tt, Tfd, Tfg; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T95 = Tm - Tt; + Tfd = FNMS(KP923879532, Tfc, KP382683432 * Tfb); + Tfg = FNMS(KP923879532, Tff, KP382683432 * Tfe); + Tfh = Tfd + Tfg; + ThN = Tfd - Tfg; + } + { + E Tgh, Tgi, T2l, T2u; + Tgh = FMA(KP382683432, Tfc, KP923879532 * Tfb); + Tgi = FMA(KP382683432, Tff, KP923879532 * Tfe); + Tgj = Tgh - Tgi; + Thl = Tgh + Tgi; + T2l = T2d - T2k; + T2u = T2m + T2t; + T2v = KP707106781 * (T2l + T2u); + T6h = KP707106781 * (T2l - T2u); + } + { + E T4L, T4M, Tan, Tau; + T4L = T2d + T2k; + T4M = T2t - T2m; + T4N = KP707106781 * (T4L + T4M); + T5P = KP707106781 * (T4M - T4L); + Tan = FNMS(KP382683432, Tam, KP923879532 * Taj); + Tau = FMA(KP923879532, Taq, KP382683432 * Tat); + Tav = Tan - Tau; + Te7 = Tau + Tan; + } + { + E TcB, TcC, T7Q, T7R; + TcB = FNMS(KP382683432, Taq, KP923879532 * Tat); + TcC = FMA(KP382683432, Taj, KP923879532 * Tam); + TcD = TcB - TcC; + TdF = TcB + TcC; + T7Q = T2g + T2j; + T7R = T2p + T2s; + T7S = T7Q + T7R; + T8D = T7R - T7Q; + } + } + { + E T1z, T1C, T1D, Tcf, TbO, T4o, T4r, T7B, Tcg, TbP, T1G, T3Y, T1J, T3V, T1K; + E T7C, Tcj, Tci, TbW, TbT, T1S, TfV, TfW, T41, T48, Tc8, Tcb, T7E, T1Z, TfY; + E TfZ, T4a, T4h, Tc1, Tc4, T7F; + { + E T1x, T1y, T1A, T1B; + T1x = ci[0]; + T1y = cr[WS(rs, 31)]; + T1z = T1x + T1y; + T1A = cr[WS(rs, 15)]; + T1B = ci[WS(rs, 16)]; + T1C = T1A + T1B; + T1D = T1z + T1C; + Tcf = T1A - T1B; + TbO = T1x - T1y; + } + { + E T4m, T4n, T4p, T4q; + T4m = ci[WS(rs, 32)]; + T4n = cr[WS(rs, 63)]; + T4o = T4m - T4n; + T4p = ci[WS(rs, 48)]; + T4q = cr[WS(rs, 47)]; + T4r = T4p - T4q; + T7B = T4o + T4r; + Tcg = T4m + T4n; + TbP = T4p + T4q; + } + { + E TbR, TbS, TbU, TbV; + { + E T1E, T1F, T3W, T3X; + T1E = cr[WS(rs, 7)]; + T1F = ci[WS(rs, 24)]; + T1G = T1E + T1F; + TbR = T1E - T1F; + T3W = ci[WS(rs, 56)]; + T3X = cr[WS(rs, 39)]; + T3Y = T3W - T3X; + TbS = T3W + T3X; + } + { + E T1H, T1I, T3T, T3U; + T1H = ci[WS(rs, 8)]; + T1I = cr[WS(rs, 23)]; + T1J = T1H + T1I; + TbU = T1H - T1I; + T3T = ci[WS(rs, 40)]; + T3U = cr[WS(rs, 55)]; + T3V = T3T - T3U; + TbV = T3T + T3U; + } + T1K = T1G + T1J; + T7C = T3Y + T3V; + Tcj = TbU + TbV; + Tci = TbR + TbS; + TbW = TbU - TbV; + TbT = TbR - TbS; + } + { + E T1O, Tc9, T47, Tca, T1R, Tc6, T44, Tc7; + { + E T1M, T1N, T45, T46; + T1M = cr[WS(rs, 3)]; + T1N = ci[WS(rs, 28)]; + T1O = T1M + T1N; + Tc9 = T1M - T1N; + T45 = ci[WS(rs, 44)]; + T46 = cr[WS(rs, 51)]; + T47 = T45 - T46; + Tca = T45 + T46; + } + { + E T1P, T1Q, T42, T43; + T1P = cr[WS(rs, 19)]; + T1Q = ci[WS(rs, 12)]; + T1R = T1P + T1Q; + Tc6 = T1P - T1Q; + T42 = ci[WS(rs, 60)]; + T43 = cr[WS(rs, 35)]; + T44 = T42 - T43; + Tc7 = T42 + T43; + } + T1S = T1O + T1R; + TfV = Tc9 + Tca; + TfW = Tc7 - Tc6; + T41 = T1O - T1R; + T48 = T44 - T47; + Tc8 = Tc6 + Tc7; + Tcb = Tc9 - Tca; + T7E = T44 + T47; + } + { + E T1V, Tc2, T4g, Tc3, T1Y, TbZ, T4d, Tc0; + { + E T1T, T1U, T4e, T4f; + T1T = ci[WS(rs, 4)]; + T1U = cr[WS(rs, 27)]; + T1V = T1T + T1U; + Tc2 = T1T - T1U; + T4e = ci[WS(rs, 52)]; + T4f = cr[WS(rs, 43)]; + T4g = T4e - T4f; + Tc3 = T4e + T4f; + } + { + E T1W, T1X, T4b, T4c; + T1W = cr[WS(rs, 11)]; + T1X = ci[WS(rs, 20)]; + T1Y = T1W + T1X; + TbZ = T1W - T1X; + T4b = ci[WS(rs, 36)]; + T4c = cr[WS(rs, 59)]; + T4d = T4b - T4c; + Tc0 = T4b + T4c; + } + T1Z = T1V + T1Y; + TfY = Tc2 + Tc3; + TfZ = TbZ + Tc0; + T4a = T1V - T1Y; + T4h = T4d - T4g; + Tc1 = TbZ - Tc0; + Tc4 = Tc2 - Tc3; + T7F = T4d + T4g; + } + T1L = T1D + T1K; + T20 = T1S + T1Z; + T7A = T1L - T20; + T7D = T7B + T7C; + T7G = T7E + T7F; + T7H = T7D - T7G; + { + E T3S, T3Z, TfX, Tg0; + T3S = T1z - T1C; + T3Z = T3V - T3Y; + T40 = T3S + T3Z; + T62 = T3S - T3Z; + TfX = FNMS(KP923879532, TfW, KP382683432 * TfV); + Tg0 = FNMS(KP923879532, TfZ, KP382683432 * TfY); + Tg1 = TfX + Tg0; + Thv = TfX - Tg0; + } + { + E Tg6, Tg7, Tg3, Tg4; + Tg6 = FMA(KP382683432, TfW, KP923879532 * TfV); + Tg7 = FMA(KP382683432, TfZ, KP923879532 * TfY); + Tg8 = Tg6 - Tg7; + Thz = Tg6 + Tg7; + Tg3 = KP707106781 * (TbT - TbW); + Tg4 = Tcf + Tcg; + Tg5 = Tg3 - Tg4; + Thw = Tg4 + Tg3; + } + { + E T4l, T4s, T49, T4i; + T4l = T1G - T1J; + T4s = T4o - T4r; + T4t = T4l + T4s; + T5Z = T4s - T4l; + T49 = T41 - T48; + T4i = T4a + T4h; + T4j = KP707106781 * (T49 + T4i); + T60 = KP707106781 * (T49 - T4i); + } + { + E T4u, T4v, TbQ, TbX; + T4u = T41 + T48; + T4v = T4h - T4a; + T4w = KP707106781 * (T4u + T4v); + T63 = KP707106781 * (T4v - T4u); + TbQ = TbO - TbP; + TbX = KP707106781 * (TbT + TbW); + TbY = TbQ - TbX; + TdS = TbQ + TbX; + } + { + E Tc5, Tcc, TfS, TfT; + Tc5 = FNMS(KP382683432, Tc4, KP923879532 * Tc1); + Tcc = FMA(KP923879532, Tc8, KP382683432 * Tcb); + Tcd = Tc5 - Tcc; + TdQ = Tcc + Tc5; + TfS = TbO + TbP; + TfT = KP707106781 * (Tci + Tcj); + TfU = TfS - TfT; + Thy = TfS + TfT; + } + { + E T8N, T8O, T8Q, T8R; + T8N = T7B - T7C; + T8O = T1S - T1Z; + T8P = T8N - T8O; + T9z = T8O + T8N; + T8Q = T1D - T1K; + T8R = T7F - T7E; + T8S = T8Q - T8R; + T9A = T8Q + T8R; + } + { + E Tch, Tck, Tcm, Tcn; + Tch = Tcf - Tcg; + Tck = KP707106781 * (Tci - Tcj); + Tcl = Tch - Tck; + TdP = Tch + Tck; + Tcm = FNMS(KP382683432, Tc8, KP923879532 * Tcb); + Tcn = FMA(KP382683432, Tc1, KP923879532 * Tc4); + Tco = Tcm - Tcn; + TdT = Tcm + Tcn; + } + } + { + E T14, T17, T18, TbC, Tbb, T3H, T3K, T7s, TbD, Tbc, T1b, T3h, T1e, T3e, T1f; + E T7t, TbG, TbF, Tbj, Tbg, T1n, TfC, TfD, T3k, T3r, Tbv, Tby, T7v, T1u, TfF; + E TfG, T3t, T3A, Tbo, Tbr, T7w; + { + E T12, T13, T15, T16; + T12 = cr[WS(rs, 1)]; + T13 = ci[WS(rs, 30)]; + T14 = T12 + T13; + T15 = cr[WS(rs, 17)]; + T16 = ci[WS(rs, 14)]; + T17 = T15 + T16; + T18 = T14 + T17; + TbC = T15 - T16; + Tbb = T12 - T13; + } + { + E T3F, T3G, T3I, T3J; + T3F = ci[WS(rs, 62)]; + T3G = cr[WS(rs, 33)]; + T3H = T3F - T3G; + T3I = ci[WS(rs, 46)]; + T3J = cr[WS(rs, 49)]; + T3K = T3I - T3J; + T7s = T3H + T3K; + TbD = T3F + T3G; + Tbc = T3I + T3J; + } + { + E Tbe, Tbf, Tbh, Tbi; + { + E T19, T1a, T3f, T3g; + T19 = cr[WS(rs, 9)]; + T1a = ci[WS(rs, 22)]; + T1b = T19 + T1a; + Tbe = T19 - T1a; + T3f = ci[WS(rs, 54)]; + T3g = cr[WS(rs, 41)]; + T3h = T3f - T3g; + Tbf = T3f + T3g; + } + { + E T1c, T1d, T3c, T3d; + T1c = ci[WS(rs, 6)]; + T1d = cr[WS(rs, 25)]; + T1e = T1c + T1d; + Tbh = T1c - T1d; + T3c = ci[WS(rs, 38)]; + T3d = cr[WS(rs, 57)]; + T3e = T3c - T3d; + Tbi = T3c + T3d; + } + T1f = T1b + T1e; + T7t = T3h + T3e; + TbG = Tbh + Tbi; + TbF = Tbe + Tbf; + Tbj = Tbh - Tbi; + Tbg = Tbe - Tbf; + } + { + E T1j, Tbw, T3q, Tbx, T1m, Tbt, T3n, Tbu; + { + E T1h, T1i, T3o, T3p; + T1h = cr[WS(rs, 5)]; + T1i = ci[WS(rs, 26)]; + T1j = T1h + T1i; + Tbw = T1h - T1i; + T3o = ci[WS(rs, 42)]; + T3p = cr[WS(rs, 53)]; + T3q = T3o - T3p; + Tbx = T3o + T3p; + } + { + E T1k, T1l, T3l, T3m; + T1k = cr[WS(rs, 21)]; + T1l = ci[WS(rs, 10)]; + T1m = T1k + T1l; + Tbt = T1k - T1l; + T3l = ci[WS(rs, 58)]; + T3m = cr[WS(rs, 37)]; + T3n = T3l - T3m; + Tbu = T3l + T3m; + } + T1n = T1j + T1m; + TfC = Tbw + Tbx; + TfD = Tbu - Tbt; + T3k = T1j - T1m; + T3r = T3n - T3q; + Tbv = Tbt + Tbu; + Tby = Tbw - Tbx; + T7v = T3n + T3q; + } + { + E T1q, Tbp, T3z, Tbq, T1t, Tbm, T3w, Tbn; + { + E T1o, T1p, T3x, T3y; + T1o = ci[WS(rs, 2)]; + T1p = cr[WS(rs, 29)]; + T1q = T1o + T1p; + Tbp = T1o - T1p; + T3x = ci[WS(rs, 50)]; + T3y = cr[WS(rs, 45)]; + T3z = T3x - T3y; + Tbq = T3x + T3y; + } + { + E T1r, T1s, T3u, T3v; + T1r = cr[WS(rs, 13)]; + T1s = ci[WS(rs, 18)]; + T1t = T1r + T1s; + Tbm = T1r - T1s; + T3u = ci[WS(rs, 34)]; + T3v = cr[WS(rs, 61)]; + T3w = T3u - T3v; + Tbn = T3u + T3v; + } + T1u = T1q + T1t; + TfF = Tbp + Tbq; + TfG = Tbm + Tbn; + T3t = T1q - T1t; + T3A = T3w - T3z; + Tbo = Tbm - Tbn; + Tbr = Tbp - Tbq; + T7w = T3w + T3z; + } + T1g = T18 + T1f; + T1v = T1n + T1u; + T7r = T1g - T1v; + T7u = T7s + T7t; + T7x = T7v + T7w; + T7y = T7u - T7x; + { + E T3b, T3i, TfE, TfH; + T3b = T14 - T17; + T3i = T3e - T3h; + T3j = T3b + T3i; + T69 = T3b - T3i; + TfE = FNMS(KP923879532, TfD, KP382683432 * TfC); + TfH = FNMS(KP923879532, TfG, KP382683432 * TfF); + TfI = TfE + TfH; + ThD = TfE - TfH; + } + { + E TfN, TfO, TfK, TfL; + TfN = FMA(KP382683432, TfD, KP923879532 * TfC); + TfO = FMA(KP382683432, TfG, KP923879532 * TfF); + TfP = TfN - TfO; + ThG = TfN + TfO; + TfK = TbD - TbC; + TfL = KP707106781 * (Tbg - Tbj); + TfM = TfK + TfL; + ThC = TfK - TfL; + } + { + E T3E, T3L, T3s, T3B; + T3E = T1b - T1e; + T3L = T3H - T3K; + T3M = T3E + T3L; + T66 = T3L - T3E; + T3s = T3k - T3r; + T3B = T3t + T3A; + T3C = KP707106781 * (T3s + T3B); + T67 = KP707106781 * (T3s - T3B); + } + { + E T3N, T3O, Tbd, Tbk; + T3N = T3k + T3r; + T3O = T3A - T3t; + T3P = KP707106781 * (T3N + T3O); + T6a = KP707106781 * (T3O - T3N); + Tbd = Tbb - Tbc; + Tbk = KP707106781 * (Tbg + Tbj); + Tbl = Tbd - Tbk; + TdZ = Tbd + Tbk; + } + { + E Tbs, Tbz, Tfz, TfA; + Tbs = FNMS(KP382683432, Tbr, KP923879532 * Tbo); + Tbz = FMA(KP923879532, Tbv, KP382683432 * Tby); + TbA = Tbs - Tbz; + TdX = Tbz + Tbs; + Tfz = Tbb + Tbc; + TfA = KP707106781 * (TbF + TbG); + TfB = Tfz - TfA; + ThF = Tfz + TfA; + } + { + E T8U, T8V, T8X, T8Y; + T8U = T7s - T7t; + T8V = T1n - T1u; + T8W = T8U - T8V; + T9C = T8V + T8U; + T8X = T18 - T1f; + T8Y = T7w - T7v; + T8Z = T8X - T8Y; + T9D = T8X + T8Y; + } + { + E TbE, TbH, TbJ, TbK; + TbE = TbC + TbD; + TbH = KP707106781 * (TbF - TbG); + TbI = TbE - TbH; + TdW = TbE + TbH; + TbJ = FNMS(KP382683432, Tbv, KP923879532 * Tby); + TbK = FMA(KP382683432, Tbo, KP923879532 * Tbr); + TbL = TbJ - TbK; + Te0 = TbJ + TbK; + } + } + { + E T11, T8q, T8n, T8r, T22, T8v, T8k, T8u; + { + E Tv, T10, T8l, T8m; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + T8q = Tv - T10; + T8l = T7u + T7x; + T8m = T7D + T7G; + T8n = T8l + T8m; + T8r = T8m - T8l; + } + { + E T1w, T21, T8i, T8j; + T1w = T1g + T1v; + T21 = T1L + T20; + T22 = T1w + T21; + T8v = T1w - T21; + T8i = T7P + T7S; + T8j = T7o + T7l; + T8k = T8i + T8j; + T8u = T8i - T8j; + } + cr[0] = T11 + T22; + ci[0] = T8k + T8n; + { + E T8g, T8o, T8f, T8h; + T8g = T11 - T22; + T8o = T8k - T8n; + T8f = W[62]; + T8h = W[63]; + cr[WS(rs, 32)] = FNMS(T8h, T8o, T8f * T8g); + ci[WS(rs, 32)] = FMA(T8h, T8g, T8f * T8o); + } + { + E T8s, T8w, T8p, T8t; + T8s = T8q - T8r; + T8w = T8u - T8v; + T8p = W[94]; + T8t = W[95]; + cr[WS(rs, 48)] = FNMS(T8t, T8w, T8p * T8s); + ci[WS(rs, 48)] = FMA(T8p, T8w, T8t * T8s); + } + { + E T8y, T8A, T8x, T8z; + T8y = T8q + T8r; + T8A = T8v + T8u; + T8x = W[30]; + T8z = W[31]; + cr[WS(rs, 16)] = FNMS(T8z, T8A, T8x * T8y); + ci[WS(rs, 16)] = FMA(T8x, T8A, T8z * T8y); + } + } + { + E T9y, T9U, T9N, T9V, T9F, T9Z, T9K, T9Y; + { + E T9w, T9x, T9L, T9M; + T9w = T8C + T8D; + T9x = KP707106781 * (T97 + T98); + T9y = T9w - T9x; + T9U = T9w + T9x; + T9L = FNMS(KP382683432, T9C, KP923879532 * T9D); + T9M = FMA(KP382683432, T9z, KP923879532 * T9A); + T9N = T9L - T9M; + T9V = T9L + T9M; + } + { + E T9B, T9E, T9I, T9J; + T9B = FNMS(KP382683432, T9A, KP923879532 * T9z); + T9E = FMA(KP923879532, T9C, KP382683432 * T9D); + T9F = T9B - T9E; + T9Z = T9E + T9B; + T9I = T95 + T94; + T9J = KP707106781 * (T8K + T8H); + T9K = T9I - T9J; + T9Y = T9I + T9J; + } + { + E T9G, T9O, T9v, T9H; + T9G = T9y - T9F; + T9O = T9K - T9N; + T9v = W[102]; + T9H = W[103]; + cr[WS(rs, 52)] = FNMS(T9H, T9O, T9v * T9G); + ci[WS(rs, 52)] = FMA(T9H, T9G, T9v * T9O); + } + { + E Ta2, Ta4, Ta1, Ta3; + Ta2 = T9U + T9V; + Ta4 = T9Y + T9Z; + Ta1 = W[6]; + Ta3 = W[7]; + cr[WS(rs, 4)] = FNMS(Ta3, Ta4, Ta1 * Ta2); + ci[WS(rs, 4)] = FMA(Ta1, Ta4, Ta3 * Ta2); + } + { + E T9Q, T9S, T9P, T9R; + T9Q = T9y + T9F; + T9S = T9K + T9N; + T9P = W[38]; + T9R = W[39]; + cr[WS(rs, 20)] = FNMS(T9R, T9S, T9P * T9Q); + ci[WS(rs, 20)] = FMA(T9R, T9Q, T9P * T9S); + } + { + E T9W, Ta0, T9T, T9X; + T9W = T9U - T9V; + Ta0 = T9Y - T9Z; + T9T = W[70]; + T9X = W[71]; + cr[WS(rs, 36)] = FNMS(T9X, Ta0, T9T * T9W); + ci[WS(rs, 36)] = FMA(T9T, Ta0, T9X * T9W); + } + } + { + E T8M, T9k, T9d, T9l, T91, T9p, T9a, T9o; + { + E T8E, T8L, T9b, T9c; + T8E = T8C - T8D; + T8L = KP707106781 * (T8H - T8K); + T8M = T8E - T8L; + T9k = T8E + T8L; + T9b = FNMS(KP923879532, T8W, KP382683432 * T8Z); + T9c = FMA(KP923879532, T8P, KP382683432 * T8S); + T9d = T9b - T9c; + T9l = T9b + T9c; + } + { + E T8T, T90, T96, T99; + T8T = FNMS(KP923879532, T8S, KP382683432 * T8P); + T90 = FMA(KP382683432, T8W, KP923879532 * T8Z); + T91 = T8T - T90; + T9p = T90 + T8T; + T96 = T94 - T95; + T99 = KP707106781 * (T97 - T98); + T9a = T96 - T99; + T9o = T96 + T99; + } + { + E T92, T9e, T8B, T93; + T92 = T8M - T91; + T9e = T9a - T9d; + T8B = W[118]; + T93 = W[119]; + cr[WS(rs, 60)] = FNMS(T93, T9e, T8B * T92); + ci[WS(rs, 60)] = FMA(T93, T92, T8B * T9e); + } + { + E T9s, T9u, T9r, T9t; + T9s = T9k + T9l; + T9u = T9o + T9p; + T9r = W[22]; + T9t = W[23]; + cr[WS(rs, 12)] = FNMS(T9t, T9u, T9r * T9s); + ci[WS(rs, 12)] = FMA(T9r, T9u, T9t * T9s); + } + { + E T9g, T9i, T9f, T9h; + T9g = T8M + T91; + T9i = T9a + T9d; + T9f = W[54]; + T9h = W[55]; + cr[WS(rs, 28)] = FNMS(T9h, T9i, T9f * T9g); + ci[WS(rs, 28)] = FMA(T9h, T9g, T9f * T9i); + } + { + E T9m, T9q, T9j, T9n; + T9m = T9k - T9l; + T9q = T9o - T9p; + T9j = W[86]; + T9n = W[87]; + cr[WS(rs, 44)] = FNMS(T9n, T9q, T9j * T9m); + ci[WS(rs, 44)] = FMA(T9j, T9q, T9n * T9m); + } + } + { + E T7q, T84, T7X, T85, T7J, T89, T7U, T88; + { + E T7i, T7p, T7V, T7W; + T7i = Tf - Tu; + T7p = T7l - T7o; + T7q = T7i + T7p; + T84 = T7i - T7p; + T7V = T7r + T7y; + T7W = T7H - T7A; + T7X = KP707106781 * (T7V + T7W); + T85 = KP707106781 * (T7W - T7V); + } + { + E T7z, T7I, T7M, T7T; + T7z = T7r - T7y; + T7I = T7A + T7H; + T7J = KP707106781 * (T7z + T7I); + T89 = KP707106781 * (T7z - T7I); + T7M = TK - TZ; + T7T = T7P - T7S; + T7U = T7M + T7T; + T88 = T7T - T7M; + } + { + E T7K, T7Y, T7h, T7L; + T7K = T7q - T7J; + T7Y = T7U - T7X; + T7h = W[78]; + T7L = W[79]; + cr[WS(rs, 40)] = FNMS(T7L, T7Y, T7h * T7K); + ci[WS(rs, 40)] = FMA(T7L, T7K, T7h * T7Y); + } + { + E T8c, T8e, T8b, T8d; + T8c = T84 + T85; + T8e = T88 + T89; + T8b = W[46]; + T8d = W[47]; + cr[WS(rs, 24)] = FNMS(T8d, T8e, T8b * T8c); + ci[WS(rs, 24)] = FMA(T8b, T8e, T8d * T8c); + } + { + E T80, T82, T7Z, T81; + T80 = T7q + T7J; + T82 = T7U + T7X; + T7Z = W[14]; + T81 = W[15]; + cr[WS(rs, 8)] = FNMS(T81, T82, T7Z * T80); + ci[WS(rs, 8)] = FMA(T81, T80, T7Z * T82); + } + { + E T86, T8a, T83, T87; + T86 = T84 - T85; + T8a = T88 - T89; + T83 = W[110]; + T87 = W[111]; + cr[WS(rs, 56)] = FNMS(T87, T8a, T83 * T86); + ci[WS(rs, 56)] = FMA(T83, T8a, T87 * T86); + } + } + { + E T6K, T76, T6W, T7a, T6R, T7b, T6Z, T77; + { + E T6I, T6J, T6U, T6V; + T6I = T5O + T5P; + T6J = T6j + T6k; + T6K = T6I - T6J; + T76 = T6I + T6J; + T6U = T6g + T6h; + T6V = T5W + T5T; + T6W = T6U - T6V; + T7a = T6U + T6V; + { + E T6N, T6Y, T6Q, T6X; + { + E T6L, T6M, T6O, T6P; + T6L = T5Z + T60; + T6M = T62 + T63; + T6N = FNMS(KP555570233, T6M, KP831469612 * T6L); + T6Y = FMA(KP555570233, T6L, KP831469612 * T6M); + T6O = T66 + T67; + T6P = T69 + T6a; + T6Q = FMA(KP831469612, T6O, KP555570233 * T6P); + T6X = FNMS(KP555570233, T6O, KP831469612 * T6P); + } + T6R = T6N - T6Q; + T7b = T6Q + T6N; + T6Z = T6X - T6Y; + T77 = T6X + T6Y; + } + } + { + E T6S, T70, T6H, T6T; + T6S = T6K - T6R; + T70 = T6W - T6Z; + T6H = W[106]; + T6T = W[107]; + cr[WS(rs, 54)] = FNMS(T6T, T70, T6H * T6S); + ci[WS(rs, 54)] = FMA(T6T, T6S, T6H * T70); + } + { + E T7e, T7g, T7d, T7f; + T7e = T76 + T77; + T7g = T7a + T7b; + T7d = W[10]; + T7f = W[11]; + cr[WS(rs, 6)] = FNMS(T7f, T7g, T7d * T7e); + ci[WS(rs, 6)] = FMA(T7d, T7g, T7f * T7e); + } + { + E T72, T74, T71, T73; + T72 = T6K + T6R; + T74 = T6W + T6Z; + T71 = W[42]; + T73 = W[43]; + cr[WS(rs, 22)] = FNMS(T73, T74, T71 * T72); + ci[WS(rs, 22)] = FMA(T73, T72, T71 * T74); + } + { + E T78, T7c, T75, T79; + T78 = T76 - T77; + T7c = T7a - T7b; + T75 = W[74]; + T79 = W[75]; + cr[WS(rs, 38)] = FNMS(T79, T7c, T75 * T78); + ci[WS(rs, 38)] = FMA(T75, T7c, T79 * T78); + } + } + { + E T3a, T52, T4S, T56, T4z, T57, T4V, T53; + { + E T2w, T39, T4O, T4R; + T2w = T2c - T2v; + T39 = T2P - T38; + T3a = T2w + T39; + T52 = T2w - T39; + T4O = T4K - T4N; + T4R = T4P - T4Q; + T4S = T4O + T4R; + T56 = T4O - T4R; + { + E T3R, T4T, T4y, T4U; + { + E T3D, T3Q, T4k, T4x; + T3D = T3j - T3C; + T3Q = T3M - T3P; + T3R = FNMS(KP831469612, T3Q, KP555570233 * T3D); + T4T = FMA(KP831469612, T3D, KP555570233 * T3Q); + T4k = T40 - T4j; + T4x = T4t - T4w; + T4y = FMA(KP555570233, T4k, KP831469612 * T4x); + T4U = FNMS(KP831469612, T4k, KP555570233 * T4x); + } + T4z = T3R + T4y; + T57 = T3R - T4y; + T4V = T4T + T4U; + T53 = T4U - T4T; + } + } + { + E T4A, T4W, T23, T4B; + T4A = T3a - T4z; + T4W = T4S - T4V; + T23 = W[82]; + T4B = W[83]; + cr[WS(rs, 42)] = FNMS(T4B, T4W, T23 * T4A); + ci[WS(rs, 42)] = FMA(T4B, T4A, T23 * T4W); + } + { + E T5a, T5c, T59, T5b; + T5a = T52 + T53; + T5c = T56 + T57; + T59 = W[50]; + T5b = W[51]; + cr[WS(rs, 26)] = FNMS(T5b, T5c, T59 * T5a); + ci[WS(rs, 26)] = FMA(T59, T5c, T5b * T5a); + } + { + E T4Y, T50, T4X, T4Z; + T4Y = T3a + T4z; + T50 = T4S + T4V; + T4X = W[18]; + T4Z = W[19]; + cr[WS(rs, 10)] = FNMS(T4Z, T50, T4X * T4Y); + ci[WS(rs, 10)] = FMA(T4Z, T4Y, T4X * T50); + } + { + E T54, T58, T51, T55; + T54 = T52 - T53; + T58 = T56 - T57; + T51 = W[114]; + T55 = W[115]; + cr[WS(rs, 58)] = FNMS(T55, T58, T51 * T54); + ci[WS(rs, 58)] = FMA(T51, T58, T55 * T54); + } + } + { + E T5g, T5C, T5s, T5G, T5n, T5H, T5v, T5D; + { + E T5e, T5f, T5q, T5r; + T5e = T2c + T2v; + T5f = T4P + T4Q; + T5g = T5e + T5f; + T5C = T5e - T5f; + T5q = T4K + T4N; + T5r = T38 + T2P; + T5s = T5q + T5r; + T5G = T5q - T5r; + { + E T5j, T5t, T5m, T5u; + { + E T5h, T5i, T5k, T5l; + T5h = T3j + T3C; + T5i = T3M + T3P; + T5j = FNMS(KP195090322, T5i, KP980785280 * T5h); + T5t = FMA(KP195090322, T5h, KP980785280 * T5i); + T5k = T40 + T4j; + T5l = T4t + T4w; + T5m = FMA(KP980785280, T5k, KP195090322 * T5l); + T5u = FNMS(KP195090322, T5k, KP980785280 * T5l); + } + T5n = T5j + T5m; + T5H = T5j - T5m; + T5v = T5t + T5u; + T5D = T5u - T5t; + } + } + { + E T5o, T5w, T5d, T5p; + T5o = T5g - T5n; + T5w = T5s - T5v; + T5d = W[66]; + T5p = W[67]; + cr[WS(rs, 34)] = FNMS(T5p, T5w, T5d * T5o); + ci[WS(rs, 34)] = FMA(T5p, T5o, T5d * T5w); + } + { + E T5K, T5M, T5J, T5L; + T5K = T5C + T5D; + T5M = T5G + T5H; + T5J = W[34]; + T5L = W[35]; + cr[WS(rs, 18)] = FNMS(T5L, T5M, T5J * T5K); + ci[WS(rs, 18)] = FMA(T5J, T5M, T5L * T5K); + } + { + E T5y, T5A, T5x, T5z; + T5y = T5g + T5n; + T5A = T5s + T5v; + T5x = W[2]; + T5z = W[3]; + cr[WS(rs, 2)] = FNMS(T5z, T5A, T5x * T5y); + ci[WS(rs, 2)] = FMA(T5z, T5y, T5x * T5A); + } + { + E T5E, T5I, T5B, T5F; + T5E = T5C - T5D; + T5I = T5G - T5H; + T5B = W[98]; + T5F = W[99]; + cr[WS(rs, 50)] = FNMS(T5F, T5I, T5B * T5E); + ci[WS(rs, 50)] = FMA(T5B, T5I, T5F * T5E); + } + } + { + E T5Y, T6w, T6m, T6A, T6d, T6B, T6p, T6x; + { + E T5Q, T5X, T6i, T6l; + T5Q = T5O - T5P; + T5X = T5T - T5W; + T5Y = T5Q - T5X; + T6w = T5Q + T5X; + T6i = T6g - T6h; + T6l = T6j - T6k; + T6m = T6i - T6l; + T6A = T6i + T6l; + { + E T65, T6o, T6c, T6n; + { + E T61, T64, T68, T6b; + T61 = T5Z - T60; + T64 = T62 - T63; + T65 = FNMS(KP980785280, T64, KP195090322 * T61); + T6o = FMA(KP980785280, T61, KP195090322 * T64); + T68 = T66 - T67; + T6b = T69 - T6a; + T6c = FMA(KP195090322, T68, KP980785280 * T6b); + T6n = FNMS(KP980785280, T68, KP195090322 * T6b); + } + T6d = T65 - T6c; + T6B = T6c + T65; + T6p = T6n - T6o; + T6x = T6n + T6o; + } + } + { + E T6e, T6q, T5N, T6f; + T6e = T5Y - T6d; + T6q = T6m - T6p; + T5N = W[122]; + T6f = W[123]; + cr[WS(rs, 62)] = FNMS(T6f, T6q, T5N * T6e); + ci[WS(rs, 62)] = FMA(T6f, T6e, T5N * T6q); + } + { + E T6E, T6G, T6D, T6F; + T6E = T6w + T6x; + T6G = T6A + T6B; + T6D = W[26]; + T6F = W[27]; + cr[WS(rs, 14)] = FNMS(T6F, T6G, T6D * T6E); + ci[WS(rs, 14)] = FMA(T6D, T6G, T6F * T6E); + } + { + E T6s, T6u, T6r, T6t; + T6s = T5Y + T6d; + T6u = T6m + T6p; + T6r = W[58]; + T6t = W[59]; + cr[WS(rs, 30)] = FNMS(T6t, T6u, T6r * T6s); + ci[WS(rs, 30)] = FMA(T6t, T6s, T6r * T6u); + } + { + E T6y, T6C, T6v, T6z; + T6y = T6w - T6x; + T6C = T6A - T6B; + T6v = W[90]; + T6z = W[91]; + cr[WS(rs, 46)] = FNMS(T6z, T6C, T6v * T6y); + ci[WS(rs, 46)] = FMA(T6v, T6C, T6z * T6y); + } + } + { + E Tba, Tdw, TcS, Tdi, TcI, Tds, TcW, Td6, Tcr, TcX, TcL, TcT, Tdd, Tdx, Tdl; + E Tdt; + { + E Taw, Tdg, Tb9, Tdh, TaP, Tb8; + Taw = Tag - Tav; + Tdg = TcA + TcD; + TaP = FNMS(KP831469612, TaO, KP555570233 * TaH); + Tb8 = FMA(KP831469612, Tb0, KP555570233 * Tb7); + Tb9 = TaP - Tb8; + Tdh = Tb8 + TaP; + Tba = Taw + Tb9; + Tdw = Tdg - Tdh; + TcS = Taw - Tb9; + Tdi = Tdg + Tdh; + } + { + E TcE, Td4, TcH, Td5, TcF, TcG; + TcE = TcA - TcD; + Td4 = Tag + Tav; + TcF = FNMS(KP831469612, Tb7, KP555570233 * Tb0); + TcG = FMA(KP555570233, TaO, KP831469612 * TaH); + TcH = TcF - TcG; + Td5 = TcF + TcG; + TcI = TcE + TcH; + Tds = Td4 - Td5; + TcW = TcE - TcH; + Td6 = Td4 + Td5; + } + { + E TbN, TcJ, Tcq, TcK; + { + E TbB, TbM, Tce, Tcp; + TbB = Tbl - TbA; + TbM = TbI - TbL; + TbN = FNMS(KP956940335, TbM, KP290284677 * TbB); + TcJ = FMA(KP956940335, TbB, KP290284677 * TbM); + Tce = TbY - Tcd; + Tcp = Tcl - Tco; + Tcq = FMA(KP290284677, Tce, KP956940335 * Tcp); + TcK = FNMS(KP956940335, Tce, KP290284677 * Tcp); + } + Tcr = TbN + Tcq; + TcX = TbN - Tcq; + TcL = TcJ + TcK; + TcT = TcK - TcJ; + } + { + E Td9, Tdj, Tdc, Tdk; + { + E Td7, Td8, Tda, Tdb; + Td7 = Tbl + TbA; + Td8 = TbI + TbL; + Td9 = FNMS(KP471396736, Td8, KP881921264 * Td7); + Tdj = FMA(KP471396736, Td7, KP881921264 * Td8); + Tda = TbY + Tcd; + Tdb = Tcl + Tco; + Tdc = FMA(KP881921264, Tda, KP471396736 * Tdb); + Tdk = FNMS(KP471396736, Tda, KP881921264 * Tdb); + } + Tdd = Td9 + Tdc; + Tdx = Td9 - Tdc; + Tdl = Tdj + Tdk; + Tdt = Tdk - Tdj; + } + { + E Tcs, TcM, Ta5, Tct; + Tcs = Tba - Tcr; + TcM = TcI - TcL; + Ta5 = W[88]; + Tct = W[89]; + cr[WS(rs, 45)] = FNMS(Tct, TcM, Ta5 * Tcs); + ci[WS(rs, 45)] = FMA(Tct, Tcs, Ta5 * TcM); + } + { + E Tdu, Tdy, Tdr, Tdv; + Tdu = Tds - Tdt; + Tdy = Tdw - Tdx; + Tdr = W[104]; + Tdv = W[105]; + cr[WS(rs, 53)] = FNMS(Tdv, Tdy, Tdr * Tdu); + ci[WS(rs, 53)] = FMA(Tdr, Tdy, Tdv * Tdu); + } + { + E TdA, TdC, Tdz, TdB; + TdA = Tds + Tdt; + TdC = Tdw + Tdx; + Tdz = W[40]; + TdB = W[41]; + cr[WS(rs, 21)] = FNMS(TdB, TdC, Tdz * TdA); + ci[WS(rs, 21)] = FMA(Tdz, TdC, TdB * TdA); + } + { + E TcO, TcQ, TcN, TcP; + TcO = Tba + Tcr; + TcQ = TcI + TcL; + TcN = W[24]; + TcP = W[25]; + cr[WS(rs, 13)] = FNMS(TcP, TcQ, TcN * TcO); + ci[WS(rs, 13)] = FMA(TcP, TcO, TcN * TcQ); + } + { + E TcU, TcY, TcR, TcV; + TcU = TcS - TcT; + TcY = TcW - TcX; + TcR = W[120]; + TcV = W[121]; + cr[WS(rs, 61)] = FNMS(TcV, TcY, TcR * TcU); + ci[WS(rs, 61)] = FMA(TcR, TcY, TcV * TcU); + } + { + E Tde, Tdm, Td3, Tdf; + Tde = Td6 - Tdd; + Tdm = Tdi - Tdl; + Td3 = W[72]; + Tdf = W[73]; + cr[WS(rs, 37)] = FNMS(Tdf, Tdm, Td3 * Tde); + ci[WS(rs, 37)] = FMA(Tdf, Tde, Td3 * Tdm); + } + { + E Tdo, Tdq, Tdn, Tdp; + Tdo = Td6 + Tdd; + Tdq = Tdi + Tdl; + Tdn = W[8]; + Tdp = W[9]; + cr[WS(rs, 5)] = FNMS(Tdp, Tdq, Tdn * Tdo); + ci[WS(rs, 5)] = FMA(Tdp, Tdo, Tdn * Tdq); + } + { + E Td0, Td2, TcZ, Td1; + Td0 = TcS + TcT; + Td2 = TcW + TcX; + TcZ = W[56]; + Td1 = W[57]; + cr[WS(rs, 29)] = FNMS(Td1, Td2, TcZ * Td0); + ci[WS(rs, 29)] = FMA(TcZ, Td2, Td1 * Td0); + } + } + { + E Tfy, Thc, Tgy, TgY, Tgo, Th8, TgC, TgM, Tgb, TgD, Tgr, Tgz, TgT, Thd, Th1; + E Th9; + { + E Tfi, TgW, Tfx, TgX, Tfp, Tfw; + Tfi = Tfa - Tfh; + TgW = Tgg + Tgj; + Tfp = FNMS(KP555570233, Tfo, KP831469612 * Tfl); + Tfw = FMA(KP831469612, Tfs, KP555570233 * Tfv); + Tfx = Tfp - Tfw; + TgX = Tfw + Tfp; + Tfy = Tfi + Tfx; + Thc = TgW - TgX; + Tgy = Tfi - Tfx; + TgY = TgW + TgX; + } + { + E Tgk, TgK, Tgn, TgL, Tgl, Tgm; + Tgk = Tgg - Tgj; + TgK = Tfa + Tfh; + Tgl = FNMS(KP555570233, Tfs, KP831469612 * Tfv); + Tgm = FMA(KP555570233, Tfl, KP831469612 * Tfo); + Tgn = Tgl - Tgm; + TgL = Tgl + Tgm; + Tgo = Tgk + Tgn; + Th8 = TgK - TgL; + TgC = Tgk - Tgn; + TgM = TgK + TgL; + } + { + E TfR, Tgp, Tga, Tgq; + { + E TfJ, TfQ, Tg2, Tg9; + TfJ = TfB - TfI; + TfQ = TfM - TfP; + TfR = FNMS(KP881921264, TfQ, KP471396736 * TfJ); + Tgp = FMA(KP881921264, TfJ, KP471396736 * TfQ); + Tg2 = TfU - Tg1; + Tg9 = Tg5 - Tg8; + Tga = FMA(KP471396736, Tg2, KP881921264 * Tg9); + Tgq = FNMS(KP881921264, Tg2, KP471396736 * Tg9); + } + Tgb = TfR + Tga; + TgD = TfR - Tga; + Tgr = Tgp + Tgq; + Tgz = Tgq - Tgp; + } + { + E TgP, TgZ, TgS, Th0; + { + E TgN, TgO, TgQ, TgR; + TgN = TfB + TfI; + TgO = TfM + TfP; + TgP = FNMS(KP290284677, TgO, KP956940335 * TgN); + TgZ = FMA(KP290284677, TgN, KP956940335 * TgO); + TgQ = TfU + Tg1; + TgR = Tg5 + Tg8; + TgS = FMA(KP956940335, TgQ, KP290284677 * TgR); + Th0 = FNMS(KP290284677, TgQ, KP956940335 * TgR); + } + TgT = TgP + TgS; + Thd = TgP - TgS; + Th1 = TgZ + Th0; + Th9 = Th0 - TgZ; + } + { + E Tgc, Tgs, Tf7, Tgd; + Tgc = Tfy - Tgb; + Tgs = Tgo - Tgr; + Tf7 = W[84]; + Tgd = W[85]; + cr[WS(rs, 43)] = FNMS(Tgd, Tgs, Tf7 * Tgc); + ci[WS(rs, 43)] = FMA(Tgd, Tgc, Tf7 * Tgs); + } + { + E Tha, The, Th7, Thb; + Tha = Th8 - Th9; + The = Thc - Thd; + Th7 = W[100]; + Thb = W[101]; + cr[WS(rs, 51)] = FNMS(Thb, The, Th7 * Tha); + ci[WS(rs, 51)] = FMA(Th7, The, Thb * Tha); + } + { + E Thg, Thi, Thf, Thh; + Thg = Th8 + Th9; + Thi = Thc + Thd; + Thf = W[36]; + Thh = W[37]; + cr[WS(rs, 19)] = FNMS(Thh, Thi, Thf * Thg); + ci[WS(rs, 19)] = FMA(Thf, Thi, Thh * Thg); + } + { + E Tgu, Tgw, Tgt, Tgv; + Tgu = Tfy + Tgb; + Tgw = Tgo + Tgr; + Tgt = W[20]; + Tgv = W[21]; + cr[WS(rs, 11)] = FNMS(Tgv, Tgw, Tgt * Tgu); + ci[WS(rs, 11)] = FMA(Tgv, Tgu, Tgt * Tgw); + } + { + E TgA, TgE, Tgx, TgB; + TgA = Tgy - Tgz; + TgE = TgC - TgD; + Tgx = W[116]; + TgB = W[117]; + cr[WS(rs, 59)] = FNMS(TgB, TgE, Tgx * TgA); + ci[WS(rs, 59)] = FMA(Tgx, TgE, TgB * TgA); + } + { + E TgU, Th2, TgJ, TgV; + TgU = TgM - TgT; + Th2 = TgY - Th1; + TgJ = W[68]; + TgV = W[69]; + cr[WS(rs, 35)] = FNMS(TgV, Th2, TgJ * TgU); + ci[WS(rs, 35)] = FMA(TgV, TgU, TgJ * Th2); + } + { + E Th4, Th6, Th3, Th5; + Th4 = TgM + TgT; + Th6 = TgY + Th1; + Th3 = W[4]; + Th5 = W[5]; + cr[WS(rs, 3)] = FNMS(Th5, Th6, Th3 * Th4); + ci[WS(rs, 3)] = FMA(Th5, Th4, Th3 * Th6); + } + { + E TgG, TgI, TgF, TgH; + TgG = Tgy + Tgz; + TgI = TgC + TgD; + TgF = W[52]; + TgH = W[53]; + cr[WS(rs, 27)] = FNMS(TgH, TgI, TgF * TgG); + ci[WS(rs, 27)] = FMA(TgF, TgI, TgH * TgG); + } + } + { + E TdO, Tf0, Tem, TeM, Tec, TeW, Teq, TeA, Te3, Ter, Tef, Ten, TeH, Tf1, TeP; + E TeX; + { + E TdG, TeK, TdN, TeL, TdJ, TdM; + TdG = TdE - TdF; + TeK = Te6 + Te7; + TdJ = FNMS(KP195090322, TdI, KP980785280 * TdH); + TdM = FMA(KP195090322, TdK, KP980785280 * TdL); + TdN = TdJ - TdM; + TeL = TdM + TdJ; + TdO = TdG - TdN; + Tf0 = TeK + TeL; + Tem = TdG + TdN; + TeM = TeK - TeL; + } + { + E Te8, Tey, Teb, Tez, Te9, Tea; + Te8 = Te6 - Te7; + Tey = TdE + TdF; + Te9 = FNMS(KP195090322, TdL, KP980785280 * TdK); + Tea = FMA(KP980785280, TdI, KP195090322 * TdH); + Teb = Te9 - Tea; + Tez = Te9 + Tea; + Tec = Te8 - Teb; + TeW = Tey + Tez; + Teq = Te8 + Teb; + TeA = Tey - Tez; + } + { + E TdV, Tee, Te2, Ted; + { + E TdR, TdU, TdY, Te1; + TdR = TdP - TdQ; + TdU = TdS - TdT; + TdV = FNMS(KP773010453, TdU, KP634393284 * TdR); + Tee = FMA(KP773010453, TdR, KP634393284 * TdU); + TdY = TdW - TdX; + Te1 = TdZ - Te0; + Te2 = FMA(KP634393284, TdY, KP773010453 * Te1); + Ted = FNMS(KP773010453, TdY, KP634393284 * Te1); + } + Te3 = TdV - Te2; + Ter = Te2 + TdV; + Tef = Ted - Tee; + Ten = Ted + Tee; + } + { + E TeD, TeO, TeG, TeN; + { + E TeB, TeC, TeE, TeF; + TeB = TdP + TdQ; + TeC = TdS + TdT; + TeD = FNMS(KP098017140, TeC, KP995184726 * TeB); + TeO = FMA(KP098017140, TeB, KP995184726 * TeC); + TeE = TdW + TdX; + TeF = TdZ + Te0; + TeG = FMA(KP995184726, TeE, KP098017140 * TeF); + TeN = FNMS(KP098017140, TeE, KP995184726 * TeF); + } + TeH = TeD - TeG; + Tf1 = TeG + TeD; + TeP = TeN - TeO; + TeX = TeN + TeO; + } + { + E Te4, Teg, TdD, Te5; + Te4 = TdO - Te3; + Teg = Tec - Tef; + TdD = W[112]; + Te5 = W[113]; + cr[WS(rs, 57)] = FNMS(Te5, Teg, TdD * Te4); + ci[WS(rs, 57)] = FMA(Te5, Te4, TdD * Teg); + } + { + E TeY, Tf2, TeV, TeZ; + TeY = TeW - TeX; + Tf2 = Tf0 - Tf1; + TeV = W[64]; + TeZ = W[65]; + cr[WS(rs, 33)] = FNMS(TeZ, Tf2, TeV * TeY); + ci[WS(rs, 33)] = FMA(TeV, Tf2, TeZ * TeY); + } + { + E Tf4, Tf6, Tf3, Tf5; + Tf4 = TeW + TeX; + Tf6 = Tf0 + Tf1; + Tf3 = W[0]; + Tf5 = W[1]; + cr[WS(rs, 1)] = FNMS(Tf5, Tf6, Tf3 * Tf4); + ci[WS(rs, 1)] = FMA(Tf3, Tf6, Tf5 * Tf4); + } + { + E Tei, Tek, Teh, Tej; + Tei = TdO + Te3; + Tek = Tec + Tef; + Teh = W[48]; + Tej = W[49]; + cr[WS(rs, 25)] = FNMS(Tej, Tek, Teh * Tei); + ci[WS(rs, 25)] = FMA(Tej, Tei, Teh * Tek); + } + { + E Teo, Tes, Tel, Tep; + Teo = Tem - Ten; + Tes = Teq - Ter; + Tel = W[80]; + Tep = W[81]; + cr[WS(rs, 41)] = FNMS(Tep, Tes, Tel * Teo); + ci[WS(rs, 41)] = FMA(Tel, Tes, Tep * Teo); + } + { + E TeI, TeQ, Tex, TeJ; + TeI = TeA - TeH; + TeQ = TeM - TeP; + Tex = W[96]; + TeJ = W[97]; + cr[WS(rs, 49)] = FNMS(TeJ, TeQ, Tex * TeI); + ci[WS(rs, 49)] = FMA(TeJ, TeI, Tex * TeQ); + } + { + E TeS, TeU, TeR, TeT; + TeS = TeA + TeH; + TeU = TeM + TeP; + TeR = W[32]; + TeT = W[33]; + cr[WS(rs, 17)] = FNMS(TeT, TeU, TeR * TeS); + ci[WS(rs, 17)] = FMA(TeT, TeS, TeR * TeU); + } + { + E Teu, Tew, Tet, Tev; + Teu = Tem + Ten; + Tew = Teq + Ter; + Tet = W[16]; + Tev = W[17]; + cr[WS(rs, 9)] = FNMS(Tev, Tew, Tet * Teu); + ci[WS(rs, 9)] = FMA(Tet, Tew, Tev * Teu); + } + } + { + E Thu, TiG, Ti2, Tis, ThS, TiC, Ti6, Tig, ThJ, Ti7, ThV, Ti3, Tin, TiH, Tiv; + E TiD; + { + E Thm, Tiq, Tht, Tir, Thp, Ths; + Thm = Thk - Thl; + Tiq = ThM - ThN; + Thp = FNMS(KP980785280, Tho, KP195090322 * Thn); + Ths = FNMS(KP980785280, Thr, KP195090322 * Thq); + Tht = Thp + Ths; + Tir = Thp - Ths; + Thu = Thm - Tht; + TiG = Tiq - Tir; + Ti2 = Thm + Tht; + Tis = Tiq + Tir; + } + { + E ThO, Tie, ThR, Tif, ThP, ThQ; + ThO = ThM + ThN; + Tie = Thk + Thl; + ThP = FMA(KP195090322, Tho, KP980785280 * Thn); + ThQ = FMA(KP195090322, Thr, KP980785280 * Thq); + ThR = ThP - ThQ; + Tif = ThP + ThQ; + ThS = ThO - ThR; + TiC = Tie + Tif; + Ti6 = ThO + ThR; + Tig = Tie - Tif; + } + { + E ThB, ThU, ThI, ThT; + { + E Thx, ThA, ThE, ThH; + Thx = Thv - Thw; + ThA = Thy - Thz; + ThB = FNMS(KP634393284, ThA, KP773010453 * Thx); + ThU = FMA(KP634393284, Thx, KP773010453 * ThA); + ThE = ThC + ThD; + ThH = ThF - ThG; + ThI = FMA(KP773010453, ThE, KP634393284 * ThH); + ThT = FNMS(KP634393284, ThE, KP773010453 * ThH); + } + ThJ = ThB - ThI; + Ti7 = ThI + ThB; + ThV = ThT - ThU; + Ti3 = ThT + ThU; + } + { + E Tij, Tit, Tim, Tiu; + { + E Tih, Tii, Tik, Til; + Tih = ThF + ThG; + Tii = ThC - ThD; + Tij = FNMS(KP995184726, Tii, KP098017140 * Tih); + Tit = FMA(KP098017140, Tii, KP995184726 * Tih); + Tik = Thy + Thz; + Til = Thw + Thv; + Tim = FNMS(KP995184726, Til, KP098017140 * Tik); + Tiu = FMA(KP098017140, Til, KP995184726 * Tik); + } + Tin = Tij + Tim; + TiH = Tij - Tim; + Tiv = Tit - Tiu; + TiD = Tit + Tiu; + } + { + E ThK, ThW, Thj, ThL; + ThK = Thu - ThJ; + ThW = ThS - ThV; + Thj = W[108]; + ThL = W[109]; + cr[WS(rs, 55)] = FNMS(ThL, ThW, Thj * ThK); + ci[WS(rs, 55)] = FMA(ThL, ThK, Thj * ThW); + } + { + E TiE, TiI, TiB, TiF; + TiE = TiC - TiD; + TiI = TiG + TiH; + TiB = W[60]; + TiF = W[61]; + cr[WS(rs, 31)] = FNMS(TiF, TiI, TiB * TiE); + ci[WS(rs, 31)] = FMA(TiB, TiI, TiF * TiE); + } + { + E TiK, TiM, TiJ, TiL; + TiK = TiC + TiD; + TiM = TiG - TiH; + TiJ = W[124]; + TiL = W[125]; + cr[WS(rs, 63)] = FNMS(TiL, TiM, TiJ * TiK); + ci[WS(rs, 63)] = FMA(TiJ, TiM, TiL * TiK); + } + { + E ThY, Ti0, ThX, ThZ; + ThY = Thu + ThJ; + Ti0 = ThS + ThV; + ThX = W[44]; + ThZ = W[45]; + cr[WS(rs, 23)] = FNMS(ThZ, Ti0, ThX * ThY); + ci[WS(rs, 23)] = FMA(ThZ, ThY, ThX * Ti0); + } + { + E Ti4, Ti8, Ti1, Ti5; + Ti4 = Ti2 - Ti3; + Ti8 = Ti6 - Ti7; + Ti1 = W[76]; + Ti5 = W[77]; + cr[WS(rs, 39)] = FNMS(Ti5, Ti8, Ti1 * Ti4); + ci[WS(rs, 39)] = FMA(Ti1, Ti8, Ti5 * Ti4); + } + { + E Tio, Tiw, Tid, Tip; + Tio = Tig - Tin; + Tiw = Tis - Tiv; + Tid = W[92]; + Tip = W[93]; + cr[WS(rs, 47)] = FNMS(Tip, Tiw, Tid * Tio); + ci[WS(rs, 47)] = FMA(Tip, Tio, Tid * Tiw); + } + { + E Tiy, TiA, Tix, Tiz; + Tiy = Tig + Tin; + TiA = Tis + Tiv; + Tix = W[28]; + Tiz = W[29]; + cr[WS(rs, 15)] = FNMS(Tiz, TiA, Tix * Tiy); + ci[WS(rs, 15)] = FMA(Tiz, Tiy, Tix * TiA); + } + { + E Tia, Tic, Ti9, Tib; + Tia = Ti2 + Ti3; + Tic = Ti6 + Ti7; + Ti9 = W[12]; + Tib = W[13]; + cr[WS(rs, 7)] = FNMS(Tib, Tic, Ti9 * Tia); + ci[WS(rs, 7)] = FMA(Ti9, Tic, Tib * Tia); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 64}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 64, "hb_64", twinstr, &GENUS, {808, 270, 230, 0} }; + +void X(codelet_hb_64) (planner *p) { + X(khc2hc_register) (p, hb_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_7.c new file mode 100644 index 000000000..eefba8b2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_7.c @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 7 -dif -name hb_7 -include rdft/scalar/hb.h */ + +/* + * This function contains 72 FP additions, 66 FP multiplications, + * (or, 18 additions, 12 multiplications, 54 fused multiply/add), + * 41 stack variables, 6 constants, and 28 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_7(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 12); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 12, MAKE_VOLATILE_STRIDE(14, rs)) { + E T1, T4, TC, T7, TB, Ta, TA, TD, TZ, T1l, T1b, TP, Td, Tt, Tw; + E Tv, Tu, Tp, Ty, T1j, T1e, TX, TS; + T1 = cr[0]; + { + E T2, T3, T1a, TO, Tc; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + TC = T2 - T3; + { + E T5, T6, T8, T9; + T5 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = T5 + T6; + TB = T5 - T6; + T8 = cr[WS(rs, 3)]; + T9 = ci[WS(rs, 2)]; + Ta = T8 + T9; + TA = T8 - T9; + } + TD = FNMS(KP554958132, TC, TB); + TZ = FMA(KP554958132, TB, TA); + T1l = FMA(KP554958132, TA, TC); + T1a = FNMS(KP356895867, T7, T4); + T1b = FNMS(KP692021471, T1a, Ta); + TO = FNMS(KP356895867, T4, Ta); + TP = FNMS(KP692021471, TO, T7); + Tc = FNMS(KP356895867, Ta, T7); + Td = FNMS(KP692021471, Tc, T4); + } + Tt = ci[WS(rs, 6)]; + { + E Th, Tk, Tn, Tf, Tg; + Tf = ci[WS(rs, 3)]; + Tg = cr[WS(rs, 4)]; + Th = Tf + Tg; + Tw = Tf - Tg; + { + E Ti, Tj, Tl, Tm; + Ti = ci[WS(rs, 4)]; + Tj = cr[WS(rs, 5)]; + Tk = Ti + Tj; + Tv = Ti - Tj; + Tl = ci[WS(rs, 5)]; + Tm = cr[WS(rs, 6)]; + Tn = Tl + Tm; + Tu = Tl - Tm; + } + { + E To, Tx, T1i, T1d, TW, TR; + To = FNMS(KP554958132, Tn, Tk); + Tp = FNMS(KP801937735, To, Th); + Tx = FNMS(KP356895867, Tw, Tv); + Ty = FNMS(KP692021471, Tx, Tu); + T1i = FNMS(KP356895867, Tv, Tu); + T1j = FNMS(KP692021471, T1i, Tw); + T1d = FMA(KP554958132, Th, Tn); + T1e = FMA(KP801937735, T1d, Tk); + TW = FNMS(KP356895867, Tu, Tw); + TX = FNMS(KP692021471, TW, Tv); + TR = FMA(KP554958132, Tk, Th); + TS = FNMS(KP801937735, TR, Tn); + } + } + cr[0] = T1 + T4 + T7 + Ta; + ci[0] = Tt + Tu + Tv + Tw; + { + E Tq, TI, TF, TL, Te, Tz, TE; + Te = FNMS(KP900968867, Td, T1); + Tq = FNMS(KP974927912, Tp, Te); + TI = FMA(KP974927912, Tp, Te); + Tz = FNMS(KP900968867, Ty, Tt); + TE = FNMS(KP801937735, TD, TA); + TF = FMA(KP974927912, TE, Tz); + TL = FNMS(KP974927912, TE, Tz); + { + E Tb, Tr, Ts, TG; + Tb = W[4]; + Tr = Tb * Tq; + Ts = W[5]; + TG = Ts * Tq; + cr[WS(rs, 3)] = FNMS(Ts, TF, Tr); + ci[WS(rs, 3)] = FMA(Tb, TF, TG); + } + { + E TH, TJ, TK, TM; + TH = W[6]; + TJ = TH * TI; + TK = W[7]; + TM = TK * TI; + cr[WS(rs, 4)] = FNMS(TK, TL, TJ); + ci[WS(rs, 4)] = FMA(TH, TL, TM); + } + } + { + E TT, T14, T11, T17, TQ, TY, T10; + TQ = FNMS(KP900968867, TP, T1); + TT = FNMS(KP974927912, TS, TQ); + T14 = FMA(KP974927912, TS, TQ); + TY = FNMS(KP900968867, TX, Tt); + T10 = FNMS(KP801937735, TZ, TC); + T11 = FMA(KP974927912, T10, TY); + T17 = FNMS(KP974927912, T10, TY); + { + E TN, TU, TV, T12; + TN = W[2]; + TU = TN * TT; + TV = W[3]; + T12 = TV * TT; + cr[WS(rs, 2)] = FNMS(TV, T11, TU); + ci[WS(rs, 2)] = FMA(TN, T11, T12); + } + { + E T13, T15, T16, T18; + T13 = W[8]; + T15 = T13 * T14; + T16 = W[9]; + T18 = T16 * T14; + cr[WS(rs, 5)] = FNMS(T16, T17, T15); + ci[WS(rs, 5)] = FMA(T13, T17, T18); + } + } + { + E T1f, T1q, T1n, T1t, T1c, T1k, T1m; + T1c = FNMS(KP900968867, T1b, T1); + T1f = FNMS(KP974927912, T1e, T1c); + T1q = FMA(KP974927912, T1e, T1c); + T1k = FNMS(KP900968867, T1j, Tt); + T1m = FMA(KP801937735, T1l, TB); + T1n = FMA(KP974927912, T1m, T1k); + T1t = FNMS(KP974927912, T1m, T1k); + { + E T19, T1g, T1h, T1o; + T19 = W[0]; + T1g = T19 * T1f; + T1h = W[1]; + T1o = T1h * T1f; + cr[WS(rs, 1)] = FNMS(T1h, T1n, T1g); + ci[WS(rs, 1)] = FMA(T19, T1n, T1o); + } + { + E T1p, T1r, T1s, T1u; + T1p = W[10]; + T1r = T1p * T1q; + T1s = W[11]; + T1u = T1s * T1q; + cr[WS(rs, 6)] = FNMS(T1s, T1t, T1r); + ci[WS(rs, 6)] = FMA(T1p, T1t, T1u); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 7, "hb_7", twinstr, &GENUS, {18, 12, 54, 0} }; + +void X(codelet_hb_7) (planner *p) { + X(khc2hc_register) (p, hb_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 7 -dif -name hb_7 -include rdft/scalar/hb.h */ + +/* + * This function contains 72 FP additions, 60 FP multiplications, + * (or, 36 additions, 24 multiplications, 36 fused multiply/add), + * 36 stack variables, 6 constants, and 28 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_7(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 12); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 12, MAKE_VOLATILE_STRIDE(14, rs)) { + E T1, T4, T7, Ta, Tx, TI, TV, TQ, TE, Tm, Tb, Te, Th, Tk, Tq; + E TF, TR, TU, TJ, Tt; + { + E Tu, Tw, Tv, T2, T3; + T1 = cr[0]; + T2 = cr[WS(rs, 1)]; + T3 = ci[0]; + T4 = T2 + T3; + Tu = T2 - T3; + { + E T5, T6, T8, T9; + T5 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 1)]; + T7 = T5 + T6; + Tw = T5 - T6; + T8 = cr[WS(rs, 3)]; + T9 = ci[WS(rs, 2)]; + Ta = T8 + T9; + Tv = T8 - T9; + } + Tx = FMA(KP433883739, Tu, KP974927912 * Tv) - (KP781831482 * Tw); + TI = FMA(KP781831482, Tu, KP974927912 * Tw) + (KP433883739 * Tv); + TV = FNMS(KP781831482, Tv, KP974927912 * Tu) - (KP433883739 * Tw); + TQ = FMA(KP623489801, Ta, T1) + FNMA(KP900968867, T7, KP222520933 * T4); + TE = FMA(KP623489801, T4, T1) + FNMA(KP900968867, Ta, KP222520933 * T7); + Tm = FMA(KP623489801, T7, T1) + FNMA(KP222520933, Ta, KP900968867 * T4); + } + { + E Tp, Tn, To, Tc, Td; + Tb = ci[WS(rs, 6)]; + Tc = ci[WS(rs, 5)]; + Td = cr[WS(rs, 6)]; + Te = Tc - Td; + Tp = Tc + Td; + { + E Tf, Tg, Ti, Tj; + Tf = ci[WS(rs, 4)]; + Tg = cr[WS(rs, 5)]; + Th = Tf - Tg; + Tn = Tf + Tg; + Ti = ci[WS(rs, 3)]; + Tj = cr[WS(rs, 4)]; + Tk = Ti - Tj; + To = Ti + Tj; + } + Tq = FNMS(KP974927912, To, KP781831482 * Tn) - (KP433883739 * Tp); + TF = FMA(KP781831482, Tp, KP974927912 * Tn) + (KP433883739 * To); + TR = FMA(KP433883739, Tn, KP781831482 * To) - (KP974927912 * Tp); + TU = FMA(KP623489801, Tk, Tb) + FNMA(KP900968867, Th, KP222520933 * Te); + TJ = FMA(KP623489801, Te, Tb) + FNMA(KP900968867, Tk, KP222520933 * Th); + Tt = FMA(KP623489801, Th, Tb) + FNMA(KP222520933, Tk, KP900968867 * Te); + } + cr[0] = T1 + T4 + T7 + Ta; + ci[0] = Tb + Te + Th + Tk; + { + E Tr, Ty, Tl, Ts; + Tr = Tm - Tq; + Ty = Tt - Tx; + Tl = W[6]; + Ts = W[7]; + cr[WS(rs, 4)] = FNMS(Ts, Ty, Tl * Tr); + ci[WS(rs, 4)] = FMA(Tl, Ty, Ts * Tr); + } + { + E TY, T10, TX, TZ; + TY = TQ + TR; + T10 = TV + TU; + TX = W[2]; + TZ = W[3]; + cr[WS(rs, 2)] = FNMS(TZ, T10, TX * TY); + ci[WS(rs, 2)] = FMA(TX, T10, TZ * TY); + } + { + E TA, TC, Tz, TB; + TA = Tm + Tq; + TC = Tx + Tt; + Tz = W[4]; + TB = W[5]; + cr[WS(rs, 3)] = FNMS(TB, TC, Tz * TA); + ci[WS(rs, 3)] = FMA(Tz, TC, TB * TA); + } + { + E TM, TO, TL, TN; + TM = TE + TF; + TO = TJ - TI; + TL = W[10]; + TN = W[11]; + cr[WS(rs, 6)] = FNMS(TN, TO, TL * TM); + ci[WS(rs, 6)] = FMA(TL, TO, TN * TM); + } + { + E TS, TW, TP, TT; + TS = TQ - TR; + TW = TU - TV; + TP = W[8]; + TT = W[9]; + cr[WS(rs, 5)] = FNMS(TT, TW, TP * TS); + ci[WS(rs, 5)] = FMA(TP, TW, TT * TS); + } + { + E TG, TK, TD, TH; + TG = TE - TF; + TK = TI + TJ; + TD = W[0]; + TH = W[1]; + cr[WS(rs, 1)] = FNMS(TH, TK, TD * TG); + ci[WS(rs, 1)] = FMA(TD, TK, TH * TG); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 7, "hb_7", twinstr, &GENUS, {36, 24, 36, 0} }; + +void X(codelet_hb_7) (planner *p) { + X(khc2hc_register) (p, hb_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_8.c new file mode 100644 index 000000000..b90a143d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_8.c @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:32 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hb_8 -include rdft/scalar/hb.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 44 additions, 14 multiplications, 22 fused multiply/add), + * 33 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs)) { + E T7, T1i, T1n, Tk, TD, TV, T1b, TQ, Te, T1e, T1o, T1j, TE, TF, TR; + E Tv, TW; + { + E T3, Tg, TC, T19, T6, Tz, Tj, T1a; + { + E T1, T2, TA, TB; + T1 = cr[0]; + T2 = ci[WS(rs, 3)]; + T3 = T1 + T2; + Tg = T1 - T2; + TA = ci[WS(rs, 7)]; + TB = cr[WS(rs, 4)]; + TC = TA + TB; + T19 = TA - TB; + } + { + E T4, T5, Th, Ti; + T4 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 1)]; + T6 = T4 + T5; + Tz = T4 - T5; + Th = ci[WS(rs, 5)]; + Ti = cr[WS(rs, 6)]; + Tj = Th + Ti; + T1a = Th - Ti; + } + T7 = T3 + T6; + T1i = T3 - T6; + T1n = T19 - T1a; + Tk = Tg - Tj; + TD = Tz + TC; + TV = TC - Tz; + T1b = T19 + T1a; + TQ = Tg + Tj; + } + { + E Ta, Tl, Tt, T1d, Td, Tq, To, T1c, Tp, Tu; + { + E T8, T9, Tr, Ts; + T8 = cr[WS(rs, 1)]; + T9 = ci[WS(rs, 2)]; + Ta = T8 + T9; + Tl = T8 - T9; + Tr = ci[WS(rs, 4)]; + Ts = cr[WS(rs, 7)]; + Tt = Tr + Ts; + T1d = Tr - Ts; + } + { + E Tb, Tc, Tm, Tn; + Tb = ci[0]; + Tc = cr[WS(rs, 3)]; + Td = Tb + Tc; + Tq = Tb - Tc; + Tm = ci[WS(rs, 6)]; + Tn = cr[WS(rs, 5)]; + To = Tm + Tn; + T1c = Tm - Tn; + } + Te = Ta + Td; + T1e = T1c + T1d; + T1o = Ta - Td; + T1j = T1d - T1c; + TE = Tl + To; + TF = Tq + Tt; + TR = TE + TF; + Tp = Tl - To; + Tu = Tq - Tt; + Tv = Tp + Tu; + TW = Tp - Tu; + } + cr[0] = T7 + Te; + ci[0] = T1b + T1e; + { + E TS, TX, TT, TY, TP, TU; + TS = FNMS(KP707106781, TR, TQ); + TX = FMA(KP707106781, TW, TV); + TP = W[4]; + TT = TP * TS; + TY = TP * TX; + TU = W[5]; + cr[WS(rs, 3)] = FNMS(TU, TX, TT); + ci[WS(rs, 3)] = FMA(TU, TS, TY); + } + { + E T1s, T1v, T1t, T1w, T1r, T1u; + T1s = T1i + T1j; + T1v = T1o + T1n; + T1r = W[2]; + T1t = T1r * T1s; + T1w = T1r * T1v; + T1u = W[3]; + cr[WS(rs, 2)] = FNMS(T1u, T1v, T1t); + ci[WS(rs, 2)] = FMA(T1u, T1s, T1w); + } + { + E T10, T13, T11, T14, TZ, T12; + T10 = FMA(KP707106781, TR, TQ); + T13 = FNMS(KP707106781, TW, TV); + TZ = W[12]; + T11 = TZ * T10; + T14 = TZ * T13; + T12 = W[13]; + cr[WS(rs, 7)] = FNMS(T12, T13, T11); + ci[WS(rs, 7)] = FMA(T12, T10, T14); + } + { + E T1f, T15, T17, T18, T1g, T16; + T1f = T1b - T1e; + T16 = T7 - Te; + T15 = W[6]; + T17 = T15 * T16; + T18 = W[7]; + T1g = T18 * T16; + cr[WS(rs, 4)] = FNMS(T18, T1f, T17); + ci[WS(rs, 4)] = FMA(T15, T1f, T1g); + } + { + E T1k, T1p, T1l, T1q, T1h, T1m; + T1k = T1i - T1j; + T1p = T1n - T1o; + T1h = W[10]; + T1l = T1h * T1k; + T1q = T1h * T1p; + T1m = W[11]; + cr[WS(rs, 6)] = FNMS(T1m, T1p, T1l); + ci[WS(rs, 6)] = FMA(T1m, T1k, T1q); + } + { + E TH, TN, TJ, TL, TM, TO, Tf, Tx, Ty, TI, TG, TK, Tw; + TG = TE - TF; + TH = FNMS(KP707106781, TG, TD); + TN = FMA(KP707106781, TG, TD); + TK = FMA(KP707106781, Tv, Tk); + TJ = W[0]; + TL = TJ * TK; + TM = W[1]; + TO = TM * TK; + Tw = FNMS(KP707106781, Tv, Tk); + Tf = W[8]; + Tx = Tf * Tw; + Ty = W[9]; + TI = Ty * Tw; + cr[WS(rs, 5)] = FNMS(Ty, TH, Tx); + ci[WS(rs, 5)] = FMA(Tf, TH, TI); + cr[WS(rs, 1)] = FNMS(TM, TN, TL); + ci[WS(rs, 1)] = FMA(TJ, TN, TO); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hb_8", twinstr, &GENUS, {44, 14, 22, 0} }; + +void X(codelet_hb_8) (planner *p) { + X(khc2hc_register) (p, hb_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hb_8 -include rdft/scalar/hb.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 52 additions, 18 multiplications, 14 fused multiply/add), + * 30 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs)) { + E T7, T18, T1c, To, Ty, TM, TY, TC, Te, TZ, T10, Tv, Tz, TP, TS; + E TD; + { + E T3, TK, Tn, TL, T6, TW, Tk, TX; + { + E T1, T2, Tl, Tm; + T1 = cr[0]; + T2 = ci[WS(rs, 3)]; + T3 = T1 + T2; + TK = T1 - T2; + Tl = ci[WS(rs, 5)]; + Tm = cr[WS(rs, 6)]; + Tn = Tl - Tm; + TL = Tl + Tm; + } + { + E T4, T5, Ti, Tj; + T4 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 1)]; + T6 = T4 + T5; + TW = T4 - T5; + Ti = ci[WS(rs, 7)]; + Tj = cr[WS(rs, 4)]; + Tk = Ti - Tj; + TX = Ti + Tj; + } + T7 = T3 + T6; + T18 = TK + TL; + T1c = TX - TW; + To = Tk + Tn; + Ty = T3 - T6; + TM = TK - TL; + TY = TW + TX; + TC = Tk - Tn; + } + { + E Ta, TN, Tu, TR, Td, TQ, Tr, TO; + { + E T8, T9, Ts, Tt; + T8 = cr[WS(rs, 1)]; + T9 = ci[WS(rs, 2)]; + Ta = T8 + T9; + TN = T8 - T9; + Ts = ci[WS(rs, 4)]; + Tt = cr[WS(rs, 7)]; + Tu = Ts - Tt; + TR = Ts + Tt; + } + { + E Tb, Tc, Tp, Tq; + Tb = ci[0]; + Tc = cr[WS(rs, 3)]; + Td = Tb + Tc; + TQ = Tb - Tc; + Tp = ci[WS(rs, 6)]; + Tq = cr[WS(rs, 5)]; + Tr = Tp - Tq; + TO = Tp + Tq; + } + Te = Ta + Td; + TZ = TN + TO; + T10 = TQ + TR; + Tv = Tr + Tu; + Tz = Tu - Tr; + TP = TN - TO; + TS = TQ - TR; + TD = Ta - Td; + } + cr[0] = T7 + Te; + ci[0] = To + Tv; + { + E Tg, Tw, Tf, Th; + Tg = T7 - Te; + Tw = To - Tv; + Tf = W[6]; + Th = W[7]; + cr[WS(rs, 4)] = FNMS(Th, Tw, Tf * Tg); + ci[WS(rs, 4)] = FMA(Th, Tg, Tf * Tw); + } + { + E TG, TI, TF, TH; + TG = Ty + Tz; + TI = TD + TC; + TF = W[2]; + TH = W[3]; + cr[WS(rs, 2)] = FNMS(TH, TI, TF * TG); + ci[WS(rs, 2)] = FMA(TF, TI, TH * TG); + } + { + E TA, TE, Tx, TB; + TA = Ty - Tz; + TE = TC - TD; + Tx = W[10]; + TB = W[11]; + cr[WS(rs, 6)] = FNMS(TB, TE, Tx * TA); + ci[WS(rs, 6)] = FMA(Tx, TE, TB * TA); + } + { + E T1a, T1g, T1e, T1i, T19, T1d; + T19 = KP707106781 * (TZ + T10); + T1a = T18 - T19; + T1g = T18 + T19; + T1d = KP707106781 * (TP - TS); + T1e = T1c + T1d; + T1i = T1c - T1d; + { + E T17, T1b, T1f, T1h; + T17 = W[4]; + T1b = W[5]; + cr[WS(rs, 3)] = FNMS(T1b, T1e, T17 * T1a); + ci[WS(rs, 3)] = FMA(T17, T1e, T1b * T1a); + T1f = W[12]; + T1h = W[13]; + cr[WS(rs, 7)] = FNMS(T1h, T1i, T1f * T1g); + ci[WS(rs, 7)] = FMA(T1f, T1i, T1h * T1g); + } + } + { + E TU, T14, T12, T16, TT, T11; + TT = KP707106781 * (TP + TS); + TU = TM - TT; + T14 = TM + TT; + T11 = KP707106781 * (TZ - T10); + T12 = TY - T11; + T16 = TY + T11; + { + E TJ, TV, T13, T15; + TJ = W[8]; + TV = W[9]; + cr[WS(rs, 5)] = FNMS(TV, T12, TJ * TU); + ci[WS(rs, 5)] = FMA(TV, TU, TJ * T12); + T13 = W[0]; + T15 = W[1]; + cr[WS(rs, 1)] = FNMS(T15, T16, T13 * T14); + ci[WS(rs, 1)] = FMA(T15, T14, T13 * T16); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hb_8", twinstr, &GENUS, {52, 18, 14, 0} }; + +void X(codelet_hb_8) (planner *p) { + X(khc2hc_register) (p, hb_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_9.c new file mode 100644 index 000000000..0ebe53dd0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hb_9.c @@ -0,0 +1,497 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:32 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 9 -dif -name hb_9 -include rdft/scalar/hb.h */ + +/* + * This function contains 96 FP additions, 88 FP multiplications, + * (or, 24 additions, 16 multiplications, 72 fused multiply/add), + * 53 stack variables, 10 constants, and 36 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_9(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP954188894, +0.954188894138671133499268364187245676532219158); + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP492403876, +0.492403876506104029683371512294761506835321626); + DK(KP777861913, +0.777861913430206160028177977318626690410586096); + DK(KP839099631, +0.839099631177280011763127298123181364687434283); + DK(KP176326980, +0.176326980708464973471090386868618986121633062); + DK(KP363970234, +0.363970234266202361351047882776834043890471784); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 16); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 16, MAKE_VOLATILE_STRIDE(18, rs)) { + E T5, Tl, TQ, T1y, T1b, T1J, Tg, TE, Tw, Tz, T1E, T1L, T1B, T1K, T14; + E T1d, TX, T1c; + { + E T1, Th, T4, T1a, Tk, TP, TO, T19; + T1 = cr[0]; + Th = ci[WS(rs, 8)]; + { + E T2, T3, Ti, Tj; + T2 = cr[WS(rs, 3)]; + T3 = ci[WS(rs, 2)]; + T4 = T2 + T3; + T1a = T2 - T3; + Ti = ci[WS(rs, 5)]; + Tj = cr[WS(rs, 6)]; + Tk = Ti - Tj; + TP = Ti + Tj; + } + T5 = T1 + T4; + Tl = Th + Tk; + TO = FNMS(KP500000000, T4, T1); + TQ = FNMS(KP866025403, TP, TO); + T1y = FMA(KP866025403, TP, TO); + T19 = FNMS(KP500000000, Tk, Th); + T1b = FMA(KP866025403, T1a, T19); + T1J = FNMS(KP866025403, T1a, T19); + } + { + E T6, T9, TY, T12, Tm, Tp, TZ, T11, Tb, Te, TS, TU, Tr, Tu, TR; + E TV; + { + E T7, T8, Tn, To; + T6 = cr[WS(rs, 1)]; + T7 = cr[WS(rs, 4)]; + T8 = ci[WS(rs, 1)]; + T9 = T7 + T8; + TY = FNMS(KP500000000, T9, T6); + T12 = T7 - T8; + Tm = ci[WS(rs, 7)]; + Tn = ci[WS(rs, 4)]; + To = cr[WS(rs, 7)]; + Tp = Tn - To; + TZ = Tn + To; + T11 = FMS(KP500000000, Tp, Tm); + } + { + E Tc, Td, Ts, Tt; + Tb = cr[WS(rs, 2)]; + Tc = ci[WS(rs, 3)]; + Td = ci[0]; + Te = Tc + Td; + TS = Td - Tc; + TU = FNMS(KP500000000, Te, Tb); + Tr = ci[WS(rs, 6)]; + Ts = cr[WS(rs, 5)]; + Tt = cr[WS(rs, 8)]; + Tu = Ts + Tt; + TR = FMA(KP500000000, Tu, Tr); + TV = Ts - Tt; + } + { + E Ta, Tf, T1z, T1A; + Ta = T6 + T9; + Tf = Tb + Te; + Tg = Ta + Tf; + TE = Ta - Tf; + { + E Tq, Tv, T1C, T1D; + Tq = Tm + Tp; + Tv = Tr - Tu; + Tw = Tq + Tv; + Tz = Tv - Tq; + T1C = FNMS(KP866025403, TV, TU); + T1D = FMA(KP866025403, TS, TR); + T1E = FMA(KP363970234, T1D, T1C); + T1L = FNMS(KP363970234, T1C, T1D); + } + T1z = FMA(KP866025403, T12, T11); + T1A = FMA(KP866025403, TZ, TY); + T1B = FMA(KP176326980, T1A, T1z); + T1K = FNMS(KP176326980, T1z, T1A); + { + E T10, T13, TT, TW; + T10 = FNMS(KP866025403, TZ, TY); + T13 = FNMS(KP866025403, T12, T11); + T14 = FMA(KP839099631, T13, T10); + T1d = FNMS(KP839099631, T10, T13); + TT = FNMS(KP866025403, TS, TR); + TW = FMA(KP866025403, TV, TU); + TX = FNMS(KP176326980, TW, TT); + T1c = FMA(KP176326980, TT, TW); + } + } + } + cr[0] = T5 + Tg; + ci[0] = Tl + Tw; + { + E TA, TI, TF, TL, Ty, TD; + Ty = FNMS(KP500000000, Tg, T5); + TA = FNMS(KP866025403, Tz, Ty); + TI = FMA(KP866025403, Tz, Ty); + TD = FNMS(KP500000000, Tw, Tl); + TF = FNMS(KP866025403, TE, TD); + TL = FMA(KP866025403, TE, TD); + { + E TB, TG, Tx, TC; + Tx = W[10]; + TB = Tx * TA; + TG = Tx * TF; + TC = W[11]; + cr[WS(rs, 6)] = FNMS(TC, TF, TB); + ci[WS(rs, 6)] = FMA(TC, TA, TG); + } + { + E TJ, TM, TH, TK; + TH = W[4]; + TJ = TH * TI; + TM = TH * TL; + TK = W[5]; + cr[WS(rs, 3)] = FNMS(TK, TL, TJ); + ci[WS(rs, 3)] = FMA(TK, TI, TM); + } + } + { + E T16, T1s, T1k, T1f, T1v, T1p; + { + E T1j, T15, T1i, T1o, T1e, T1n; + T1j = FMA(KP777861913, T1d, T1c); + T15 = FNMS(KP777861913, T14, TX); + T1i = FMA(KP492403876, T15, TQ); + T16 = FNMS(KP984807753, T15, TQ); + T1s = FMA(KP852868531, T1j, T1i); + T1k = FNMS(KP852868531, T1j, T1i); + T1o = FMA(KP777861913, T14, TX); + T1e = FNMS(KP777861913, T1d, T1c); + T1n = FNMS(KP492403876, T1e, T1b); + T1f = FMA(KP984807753, T1e, T1b); + T1v = FMA(KP852868531, T1o, T1n); + T1p = FNMS(KP852868531, T1o, T1n); + } + { + E TN, T17, T18, T1g; + TN = W[0]; + T17 = TN * T16; + T18 = W[1]; + T1g = T18 * T16; + cr[WS(rs, 1)] = FNMS(T18, T1f, T17); + ci[WS(rs, 1)] = FMA(TN, T1f, T1g); + } + { + E T1t, T1w, T1r, T1u; + T1r = W[6]; + T1t = T1r * T1s; + T1w = T1r * T1v; + T1u = W[7]; + cr[WS(rs, 4)] = FNMS(T1u, T1v, T1t); + ci[WS(rs, 4)] = FMA(T1u, T1s, T1w); + } + { + E T1l, T1q, T1h, T1m; + T1h = W[12]; + T1l = T1h * T1k; + T1q = T1h * T1p; + T1m = W[13]; + cr[WS(rs, 7)] = FNMS(T1m, T1p, T1l); + ci[WS(rs, 7)] = FMA(T1m, T1k, T1q); + } + } + { + E T1W, T1N, T1V, T1G, T20, T1S; + T1W = FMA(KP954188894, T1E, T1B); + { + E T1M, T1R, T1F, T1Q; + T1M = FNMS(KP954188894, T1L, T1K); + T1N = FMA(KP984807753, T1M, T1J); + T1V = FNMS(KP492403876, T1M, T1J); + T1R = FMA(KP954188894, T1L, T1K); + T1F = FNMS(KP954188894, T1E, T1B); + T1Q = FNMS(KP492403876, T1F, T1y); + T1G = FMA(KP984807753, T1F, T1y); + T20 = FMA(KP852868531, T1R, T1Q); + T1S = FNMS(KP852868531, T1R, T1Q); + } + { + E T1H, T1O, T1x, T1I; + T1x = W[2]; + T1H = T1x * T1G; + T1O = T1x * T1N; + T1I = W[3]; + cr[WS(rs, 2)] = FNMS(T1I, T1N, T1H); + ci[WS(rs, 2)] = FMA(T1I, T1G, T1O); + } + { + E T23, T22, T24, T1Z, T21; + T23 = FNMS(KP852868531, T1W, T1V); + T22 = W[15]; + T24 = T22 * T20; + T1Z = W[14]; + T21 = T1Z * T20; + cr[WS(rs, 8)] = FNMS(T22, T23, T21); + ci[WS(rs, 8)] = FMA(T1Z, T23, T24); + } + { + E T1X, T1U, T1Y, T1P, T1T; + T1X = FMA(KP852868531, T1W, T1V); + T1U = W[9]; + T1Y = T1U * T1S; + T1P = W[8]; + T1T = T1P * T1S; + cr[WS(rs, 5)] = FNMS(T1U, T1X, T1T); + ci[WS(rs, 5)] = FMA(T1P, T1X, T1Y); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 9}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 9, "hb_9", twinstr, &GENUS, {24, 16, 72, 0} }; + +void X(codelet_hb_9) (planner *p) { + X(khc2hc_register) (p, hb_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 9 -dif -name hb_9 -include rdft/scalar/hb.h */ + +/* + * This function contains 96 FP additions, 72 FP multiplications, + * (or, 60 additions, 36 multiplications, 36 fused multiply/add), + * 53 stack variables, 8 constants, and 36 memory accesses + */ +#include "rdft/scalar/hb.h" + +static void hb_9(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP342020143, +0.342020143325668733044099614682259580763083368); + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 16); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 16, MAKE_VOLATILE_STRIDE(18, rs)) { + E T5, Tl, TM, T1o, T16, T1y, Ta, Tf, Tg, Tq, Tv, Tw, TT, T17, T1u; + E T1A, T1r, T1z, T10, T18; + { + E T1, Th, T4, T14, Tk, TL, TK, T15; + T1 = cr[0]; + Th = ci[WS(rs, 8)]; + { + E T2, T3, Ti, Tj; + T2 = cr[WS(rs, 3)]; + T3 = ci[WS(rs, 2)]; + T4 = T2 + T3; + T14 = KP866025403 * (T2 - T3); + Ti = ci[WS(rs, 5)]; + Tj = cr[WS(rs, 6)]; + Tk = Ti - Tj; + TL = KP866025403 * (Ti + Tj); + } + T5 = T1 + T4; + Tl = Th + Tk; + TK = FNMS(KP500000000, T4, T1); + TM = TK - TL; + T1o = TK + TL; + T15 = FNMS(KP500000000, Tk, Th); + T16 = T14 + T15; + T1y = T15 - T14; + } + { + E T6, T9, TN, TQ, Tm, Tp, TO, TR, Tb, Te, TU, TX, Tr, Tu, TV; + E TY; + { + E T7, T8, Tn, To; + T6 = cr[WS(rs, 1)]; + T7 = cr[WS(rs, 4)]; + T8 = ci[WS(rs, 1)]; + T9 = T7 + T8; + TN = FNMS(KP500000000, T9, T6); + TQ = KP866025403 * (T7 - T8); + Tm = ci[WS(rs, 7)]; + Tn = ci[WS(rs, 4)]; + To = cr[WS(rs, 7)]; + Tp = Tn - To; + TO = KP866025403 * (Tn + To); + TR = FNMS(KP500000000, Tp, Tm); + } + { + E Tc, Td, Ts, Tt; + Tb = cr[WS(rs, 2)]; + Tc = ci[WS(rs, 3)]; + Td = ci[0]; + Te = Tc + Td; + TU = FNMS(KP500000000, Te, Tb); + TX = KP866025403 * (Tc - Td); + Tr = ci[WS(rs, 6)]; + Ts = cr[WS(rs, 5)]; + Tt = cr[WS(rs, 8)]; + Tu = Ts + Tt; + TV = KP866025403 * (Ts - Tt); + TY = FMA(KP500000000, Tu, Tr); + } + { + E TP, TS, T1s, T1t; + Ta = T6 + T9; + Tf = Tb + Te; + Tg = Ta + Tf; + Tq = Tm + Tp; + Tv = Tr - Tu; + Tw = Tq + Tv; + TP = TN - TO; + TS = TQ + TR; + TT = FNMS(KP642787609, TS, KP766044443 * TP); + T17 = FMA(KP766044443, TS, KP642787609 * TP); + T1s = TU - TV; + T1t = TY - TX; + T1u = FMA(KP939692620, T1s, KP342020143 * T1t); + T1A = FNMS(KP939692620, T1t, KP342020143 * T1s); + { + E T1p, T1q, TW, TZ; + T1p = TN + TO; + T1q = TR - TQ; + T1r = FNMS(KP984807753, T1q, KP173648177 * T1p); + T1z = FMA(KP173648177, T1q, KP984807753 * T1p); + TW = TU + TV; + TZ = TX + TY; + T10 = FNMS(KP984807753, TZ, KP173648177 * TW); + T18 = FMA(KP984807753, TW, KP173648177 * TZ); + } + } + } + cr[0] = T5 + Tg; + ci[0] = Tl + Tw; + { + E TA, TG, TE, TI; + { + E Ty, Tz, TC, TD; + Ty = FNMS(KP500000000, Tg, T5); + Tz = KP866025403 * (Tv - Tq); + TA = Ty - Tz; + TG = Ty + Tz; + TC = FNMS(KP500000000, Tw, Tl); + TD = KP866025403 * (Ta - Tf); + TE = TC - TD; + TI = TD + TC; + } + { + E Tx, TB, TF, TH; + Tx = W[10]; + TB = W[11]; + cr[WS(rs, 6)] = FNMS(TB, TE, Tx * TA); + ci[WS(rs, 6)] = FMA(Tx, TE, TB * TA); + TF = W[4]; + TH = W[5]; + cr[WS(rs, 3)] = FNMS(TH, TI, TF * TG); + ci[WS(rs, 3)] = FMA(TF, TI, TH * TG); + } + } + { + E T1d, T1h, T12, T1c, T1a, T1g, T11, T19, TJ, T13; + T1d = KP866025403 * (T18 - T17); + T1h = KP866025403 * (TT - T10); + T11 = TT + T10; + T12 = TM + T11; + T1c = FNMS(KP500000000, T11, TM); + T19 = T17 + T18; + T1a = T16 + T19; + T1g = FNMS(KP500000000, T19, T16); + TJ = W[0]; + T13 = W[1]; + cr[WS(rs, 1)] = FNMS(T13, T1a, TJ * T12); + ci[WS(rs, 1)] = FMA(T13, T12, TJ * T1a); + { + E T1k, T1m, T1j, T1l; + T1k = T1c + T1d; + T1m = T1h + T1g; + T1j = W[6]; + T1l = W[7]; + cr[WS(rs, 4)] = FNMS(T1l, T1m, T1j * T1k); + ci[WS(rs, 4)] = FMA(T1j, T1m, T1l * T1k); + } + { + E T1e, T1i, T1b, T1f; + T1e = T1c - T1d; + T1i = T1g - T1h; + T1b = W[12]; + T1f = W[13]; + cr[WS(rs, 7)] = FNMS(T1f, T1i, T1b * T1e); + ci[WS(rs, 7)] = FMA(T1b, T1i, T1f * T1e); + } + } + { + E T1F, T1J, T1w, T1E, T1C, T1I, T1v, T1B, T1n, T1x; + T1F = KP866025403 * (T1A - T1z); + T1J = KP866025403 * (T1r + T1u); + T1v = T1r - T1u; + T1w = T1o + T1v; + T1E = FNMS(KP500000000, T1v, T1o); + T1B = T1z + T1A; + T1C = T1y + T1B; + T1I = FNMS(KP500000000, T1B, T1y); + T1n = W[2]; + T1x = W[3]; + cr[WS(rs, 2)] = FNMS(T1x, T1C, T1n * T1w); + ci[WS(rs, 2)] = FMA(T1n, T1C, T1x * T1w); + { + E T1M, T1O, T1L, T1N; + T1M = T1F + T1E; + T1O = T1I + T1J; + T1L = W[8]; + T1N = W[9]; + cr[WS(rs, 5)] = FNMS(T1N, T1O, T1L * T1M); + ci[WS(rs, 5)] = FMA(T1N, T1M, T1L * T1O); + } + { + E T1G, T1K, T1D, T1H; + T1G = T1E - T1F; + T1K = T1I - T1J; + T1D = W[14]; + T1H = W[15]; + cr[WS(rs, 8)] = FNMS(T1H, T1K, T1D * T1G); + ci[WS(rs, 8)] = FMA(T1H, T1G, T1D * T1K); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 9}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 9, "hb_9", twinstr, &GENUS, {60, 36, 36, 0} }; + +void X(codelet_hb_9) (planner *p) { + X(khc2hc_register) (p, hb_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_16.c new file mode 100644 index 000000000..f48d9b3f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_16.c @@ -0,0 +1,858 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:55 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 16 -dif -name hc2cb2_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 196 FP additions, 134 FP multiplications, + * (or, 104 additions, 42 multiplications, 92 fused multiply/add), + * 93 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tv, Tw, T2z, T2C, TB, TF, Ty, Tz, T1V, TA, T2G, T3Q, T3C, T3g, T3L; + E T30, T3m, T3z, T3w, T3s, T1X, T1Y, T2u, T2c, T2p, TE, TG, T1G, T1o, T1D; + { + E T3f, T3l, T2F, T3r, T2Z, T3v, TD, Tx; + Tv = W[0]; + Tw = W[2]; + Tx = Tv * Tw; + T2z = W[6]; + T3f = Tv * T2z; + T2C = W[7]; + T3l = Tv * T2C; + TB = W[4]; + T2F = Tv * TB; + T3r = Tw * TB; + TF = W[5]; + T2Z = Tv * TF; + T3v = Tw * TF; + Ty = W[1]; + Tz = W[3]; + TD = Tv * Tz; + T1V = FMA(Ty, Tz, Tx); + TA = FNMS(Ty, Tz, Tx); + T2G = FNMS(Ty, TF, T2F); + T3Q = FMA(Tz, TB, T3v); + T3C = FNMS(Ty, TB, T2Z); + T3g = FMA(Ty, T2C, T3f); + T3L = FNMS(Tz, TF, T3r); + T30 = FMA(Ty, TB, T2Z); + T3m = FNMS(Ty, T2z, T3l); + T3z = FMA(Ty, TF, T2F); + T3w = FNMS(Tz, TB, T3v); + T3s = FMA(Tz, TF, T3r); + { + E T1W, T2b, TC, T1n; + T1W = T1V * TB; + T2b = T1V * TF; + T1X = FNMS(Ty, Tw, TD); + T1Y = FNMS(T1X, TF, T1W); + T2u = FNMS(T1X, TB, T2b); + T2c = FMA(T1X, TB, T2b); + T2p = FMA(T1X, TF, T1W); + TC = TA * TB; + T1n = TA * TF; + TE = FMA(Ty, Tw, TD); + TG = FNMS(TE, TF, TC); + T1G = FNMS(TE, TB, T1n); + T1o = FMA(TE, TB, T1n); + T1D = FMA(TE, TF, TC); + } + } + { + E TL, T1Z, T2d, T1t, T31, T34, T3n, T3D, T3E, T3R, T1w, T20, Tf, T3M, T2L; + E T3h, TW, T2e, T3G, T3H, T3N, T2Q, T36, T2V, T37, Tu, T3S, T18, T1z, T24; + E T2g, T27, T2h, T1j, T1y; + { + E T3, TH, T1s, T32, T6, T1p, TK, T33, Ta, TM, TP, T2J, Td, TR, TU; + E T2I; + { + E T1, T2, T1q, T1r; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + TH = T1 - T2; + T1q = Ip[0]; + T1r = Im[WS(rs, 7)]; + T1s = T1q + T1r; + T32 = T1q - T1r; + } + { + E T4, T5, TI, TJ; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + T1p = T4 - T5; + TI = Ip[WS(rs, 4)]; + TJ = Im[WS(rs, 3)]; + TK = TI + TJ; + T33 = TI - TJ; + } + { + E T8, T9, TN, TO; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + TM = T8 - T9; + TN = Ip[WS(rs, 2)]; + TO = Im[WS(rs, 5)]; + TP = TN + TO; + T2J = TN - TO; + } + { + E Tb, Tc, TS, TT; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + Td = Tb + Tc; + TR = Tb - Tc; + TS = Ip[WS(rs, 6)]; + TT = Im[WS(rs, 1)]; + TU = TS + TT; + T2I = TS - TT; + } + TL = TH - TK; + T1Z = TH + TK; + T2d = T1s - T1p; + T1t = T1p + T1s; + T31 = Ta - Td; + T34 = T32 - T33; + T3n = T34 - T31; + { + E T1u, T1v, T7, Te; + T3D = T32 + T33; + T3E = T2J + T2I; + T3R = T3D - T3E; + T1u = TM + TP; + T1v = TR + TU; + T1w = T1u - T1v; + T20 = T1u + T1v; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T3M = T7 - Te; + { + E T2H, T2K, TQ, TV; + T2H = T3 - T6; + T2K = T2I - T2J; + T2L = T2H + T2K; + T3h = T2H - T2K; + TQ = TM - TP; + TV = TR - TU; + TW = TQ + TV; + T2e = TQ - TV; + } + } + } + { + E Ti, T1e, T1c, T2N, Tl, T19, T1h, T2O, Tp, T13, T11, T2S, Ts, TY, T16; + E T2T, T2M, T2P; + { + E Tg, Th, T1a, T1b; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + T1e = Tg - Th; + T1a = Ip[WS(rs, 1)]; + T1b = Im[WS(rs, 6)]; + T1c = T1a + T1b; + T2N = T1a - T1b; + } + { + E Tj, Tk, T1f, T1g; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + T19 = Tj - Tk; + T1f = Ip[WS(rs, 5)]; + T1g = Im[WS(rs, 2)]; + T1h = T1f + T1g; + T2O = T1f - T1g; + } + { + E Tn, To, TZ, T10; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T13 = Tn - To; + TZ = Ip[WS(rs, 7)]; + T10 = Im[0]; + T11 = TZ + T10; + T2S = TZ - T10; + } + { + E Tq, Tr, T14, T15; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + TY = Tq - Tr; + T14 = Ip[WS(rs, 3)]; + T15 = Im[WS(rs, 4)]; + T16 = T14 + T15; + T2T = T14 - T15; + } + T3G = T2N + T2O; + T3H = T2S + T2T; + T3N = T3H - T3G; + T2M = Ti - Tl; + T2P = T2N - T2O; + T2Q = T2M - T2P; + T36 = T2M + T2P; + { + E T2R, T2U, Tm, Tt; + T2R = Tp - Ts; + T2U = T2S - T2T; + T2V = T2R + T2U; + T37 = T2U - T2R; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T3S = Tm - Tt; + } + { + E T12, T17, T22, T23; + T12 = TY - T11; + T17 = T13 - T16; + T18 = FNMS(KP414213562, T17, T12); + T1z = FMA(KP414213562, T12, T17); + T22 = T1c - T19; + T23 = T1e + T1h; + T24 = FNMS(KP414213562, T23, T22); + T2g = FMA(KP414213562, T22, T23); + } + { + E T25, T26, T1d, T1i; + T25 = TY + T11; + T26 = T13 + T16; + T27 = FNMS(KP414213562, T26, T25); + T2h = FMA(KP414213562, T25, T26); + T1d = T19 + T1c; + T1i = T1e - T1h; + T1j = FMA(KP414213562, T1i, T1d); + T1y = FNMS(KP414213562, T1d, T1i); + } + } + Rp[0] = Tf + Tu; + { + E T3B, T3K, T3F, T3I, T3J, T3A; + T3A = Tf - Tu; + T3B = T3z * T3A; + T3K = T3C * T3A; + T3F = T3D + T3E; + T3I = T3G + T3H; + T3J = T3F - T3I; + Rm[0] = T3F + T3I; + Rm[WS(rs, 4)] = FMA(T3z, T3J, T3K); + Rp[WS(rs, 4)] = FNMS(T3C, T3J, T3B); + } + { + E T3O, T3P, T3T, T3U; + T3O = T3M - T3N; + T3P = T3L * T3O; + T3T = T3R - T3S; + T3U = T3L * T3T; + Rp[WS(rs, 6)] = FNMS(T3Q, T3T, T3P); + Rm[WS(rs, 6)] = FMA(T3Q, T3O, T3U); + } + { + E T3V, T3W, T3X, T3Y; + T3V = T3M + T3N; + T3W = TA * T3V; + T3X = T3S + T3R; + T3Y = TA * T3X; + Rp[WS(rs, 2)] = FNMS(TE, T3X, T3W); + Rm[WS(rs, 2)] = FMA(TE, T3V, T3Y); + } + { + E T3j, T3t, T3p, T3x, T3i, T3o; + T3i = T37 - T36; + T3j = FNMS(KP707106781, T3i, T3h); + T3t = FMA(KP707106781, T3i, T3h); + T3o = T2Q - T2V; + T3p = FNMS(KP707106781, T3o, T3n); + T3x = FMA(KP707106781, T3o, T3n); + { + E T3k, T3q, T3u, T3y; + T3k = T3g * T3j; + Rp[WS(rs, 7)] = FNMS(T3m, T3p, T3k); + T3q = T3g * T3p; + Rm[WS(rs, 7)] = FMA(T3m, T3j, T3q); + T3u = T3s * T3t; + Rp[WS(rs, 3)] = FNMS(T3w, T3x, T3u); + T3y = T3s * T3x; + Rm[WS(rs, 3)] = FMA(T3w, T3t, T3y); + } + } + { + E T2X, T3b, T39, T3d, T2W, T35, T38; + T2W = T2Q + T2V; + T2X = FNMS(KP707106781, T2W, T2L); + T3b = FMA(KP707106781, T2W, T2L); + T35 = T31 + T34; + T38 = T36 + T37; + T39 = FNMS(KP707106781, T38, T35); + T3d = FMA(KP707106781, T38, T35); + { + E T2Y, T3a, T3c, T3e; + T2Y = T2G * T2X; + Rp[WS(rs, 5)] = FNMS(T30, T39, T2Y); + T3a = T30 * T2X; + Rm[WS(rs, 5)] = FMA(T2G, T39, T3a); + T3c = T1V * T3b; + Rp[WS(rs, 1)] = FNMS(T1X, T3d, T3c); + T3e = T1X * T3b; + Rm[WS(rs, 1)] = FMA(T1V, T3d, T3e); + } + } + { + E T29, T2l, T2j, T2n; + { + E T21, T28, T2f, T2i; + T21 = FNMS(KP707106781, T20, T1Z); + T28 = T24 + T27; + T29 = FMA(KP923879532, T28, T21); + T2l = FNMS(KP923879532, T28, T21); + T2f = FMA(KP707106781, T2e, T2d); + T2i = T2g - T2h; + T2j = FNMS(KP923879532, T2i, T2f); + T2n = FMA(KP923879532, T2i, T2f); + } + { + E T2a, T2k, T2m, T2o; + T2a = T1Y * T29; + Ip[WS(rs, 5)] = FNMS(T2c, T2j, T2a); + T2k = T2c * T29; + Im[WS(rs, 5)] = FMA(T1Y, T2j, T2k); + T2m = Tw * T2l; + Ip[WS(rs, 1)] = FNMS(Tz, T2n, T2m); + T2o = Tz * T2l; + Im[WS(rs, 1)] = FMA(Tw, T2n, T2o); + } + } + { + E T1l, T1E, T1B, T1H; + { + E TX, T1k, T1x, T1A; + TX = FNMS(KP707106781, TW, TL); + T1k = T18 - T1j; + T1l = FNMS(KP923879532, T1k, TX); + T1E = FMA(KP923879532, T1k, TX); + T1x = FNMS(KP707106781, T1w, T1t); + T1A = T1y - T1z; + T1B = FNMS(KP923879532, T1A, T1x); + T1H = FMA(KP923879532, T1A, T1x); + } + { + E T1m, T1C, T1F, T1I; + T1m = TG * T1l; + Ip[WS(rs, 6)] = FNMS(T1o, T1B, T1m); + T1C = T1o * T1l; + Im[WS(rs, 6)] = FMA(TG, T1B, T1C); + T1F = T1D * T1E; + Ip[WS(rs, 2)] = FNMS(T1G, T1H, T1F); + T1I = T1G * T1E; + Im[WS(rs, 2)] = FMA(T1D, T1H, T1I); + } + } + { + E T2s, T2A, T2x, T2D; + { + E T2q, T2r, T2v, T2w; + T2q = FMA(KP707106781, T20, T1Z); + T2r = T2g + T2h; + T2s = FNMS(KP923879532, T2r, T2q); + T2A = FMA(KP923879532, T2r, T2q); + T2v = FNMS(KP707106781, T2e, T2d); + T2w = T27 - T24; + T2x = FMA(KP923879532, T2w, T2v); + T2D = FNMS(KP923879532, T2w, T2v); + } + { + E T2t, T2y, T2B, T2E; + T2t = T2p * T2s; + Ip[WS(rs, 3)] = FNMS(T2u, T2x, T2t); + T2y = T2p * T2x; + Im[WS(rs, 3)] = FMA(T2u, T2s, T2y); + T2B = T2z * T2A; + Ip[WS(rs, 7)] = FNMS(T2C, T2D, T2B); + T2E = T2z * T2D; + Im[WS(rs, 7)] = FMA(T2C, T2A, T2E); + } + } + { + E T1L, T1R, T1P, T1T; + { + E T1J, T1K, T1N, T1O; + T1J = FMA(KP707106781, TW, TL); + T1K = T1y + T1z; + T1L = FNMS(KP923879532, T1K, T1J); + T1R = FMA(KP923879532, T1K, T1J); + T1N = FMA(KP707106781, T1w, T1t); + T1O = T1j + T18; + T1P = FNMS(KP923879532, T1O, T1N); + T1T = FMA(KP923879532, T1O, T1N); + } + { + E T1M, T1Q, T1S, T1U; + T1M = TB * T1L; + Ip[WS(rs, 4)] = FNMS(TF, T1P, T1M); + T1Q = TB * T1P; + Im[WS(rs, 4)] = FMA(TF, T1L, T1Q); + T1S = Tv * T1R; + Ip[0] = FNMS(Ty, T1T, T1S); + T1U = Tv * T1T; + Im[0] = FMA(Ty, T1R, T1U); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cb2_16", twinstr, &GENUS, {104, 42, 92, 0} }; + +void X(codelet_hc2cb2_16) (planner *p) { + X(khc2c_register) (p, hc2cb2_16, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 16 -dif -name hc2cb2_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 196 FP additions, 108 FP multiplications, + * (or, 156 additions, 68 multiplications, 40 fused multiply/add), + * 80 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tv, Ty, T1l, T1n, T1p, T1t, T27, T25, Tz, Tw, TB, T21, T1P, T1H, T1X; + E T17, T1L, T1N, T1v, T1w, T1x, T1B, T2F, T2T, T2b, T2R, T3j, T3x, T35, T3t; + { + E TA, T1J, T15, T1G, Tx, T1K, T16, T1F; + { + E T1m, T1s, T1o, T1r; + Tv = W[0]; + Ty = W[1]; + T1l = W[2]; + T1n = W[3]; + T1m = Tv * T1l; + T1s = Ty * T1l; + T1o = Ty * T1n; + T1r = Tv * T1n; + T1p = T1m + T1o; + T1t = T1r - T1s; + T27 = T1r + T1s; + T25 = T1m - T1o; + Tz = W[5]; + TA = Ty * Tz; + T1J = T1l * Tz; + T15 = Tv * Tz; + T1G = T1n * Tz; + Tw = W[4]; + Tx = Tv * Tw; + T1K = T1n * Tw; + T16 = Ty * Tw; + T1F = T1l * Tw; + } + TB = Tx - TA; + T21 = T1J + T1K; + T1P = T15 - T16; + T1H = T1F + T1G; + T1X = T1F - T1G; + T17 = T15 + T16; + T1L = T1J - T1K; + T1N = Tx + TA; + T1v = W[6]; + T1w = W[7]; + T1x = FMA(Tv, T1v, Ty * T1w); + T1B = FNMS(Ty, T1v, Tv * T1w); + { + E T2D, T2E, T29, T2a; + T2D = T25 * Tz; + T2E = T27 * Tw; + T2F = T2D + T2E; + T2T = T2D - T2E; + T29 = T25 * Tw; + T2a = T27 * Tz; + T2b = T29 - T2a; + T2R = T29 + T2a; + } + { + E T3h, T3i, T33, T34; + T3h = T1p * Tz; + T3i = T1t * Tw; + T3j = T3h + T3i; + T3x = T3h - T3i; + T33 = T1p * Tw; + T34 = T1t * Tz; + T35 = T33 - T34; + T3t = T33 + T34; + } + } + { + E T7, T36, T3k, TC, T1f, T2e, T2I, T1Q, Te, TJ, T1R, T18, T2L, T37, T2l; + E T3l, Tm, T1T, TT, T1h, T2A, T2N, T3b, T3n, Tt, T1U, T12, T1i, T2t, T2O; + E T3e, T3o; + { + E T3, T2c, T1b, T2H, T6, T2G, T1e, T2d; + { + E T1, T2, T19, T1a; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + T2c = T1 - T2; + T19 = Ip[0]; + T1a = Im[WS(rs, 7)]; + T1b = T19 - T1a; + T2H = T19 + T1a; + } + { + E T4, T5, T1c, T1d; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + T2G = T4 - T5; + T1c = Ip[WS(rs, 4)]; + T1d = Im[WS(rs, 3)]; + T1e = T1c - T1d; + T2d = T1c + T1d; + } + T7 = T3 + T6; + T36 = T2c + T2d; + T3k = T2H - T2G; + TC = T3 - T6; + T1f = T1b - T1e; + T2e = T2c - T2d; + T2I = T2G + T2H; + T1Q = T1b + T1e; + } + { + E Ta, T2f, TI, T2g, Td, T2i, TF, T2j; + { + E T8, T9, TG, TH; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T2f = T8 - T9; + TG = Ip[WS(rs, 2)]; + TH = Im[WS(rs, 5)]; + TI = TG - TH; + T2g = TG + TH; + } + { + E Tb, Tc, TD, TE; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + Td = Tb + Tc; + T2i = Tb - Tc; + TD = Ip[WS(rs, 6)]; + TE = Im[WS(rs, 1)]; + TF = TD - TE; + T2j = TD + TE; + } + Te = Ta + Td; + TJ = TF - TI; + T1R = TI + TF; + T18 = Ta - Td; + { + E T2J, T2K, T2h, T2k; + T2J = T2f + T2g; + T2K = T2i + T2j; + T2L = KP707106781 * (T2J - T2K); + T37 = KP707106781 * (T2J + T2K); + T2h = T2f - T2g; + T2k = T2i - T2j; + T2l = KP707106781 * (T2h + T2k); + T3l = KP707106781 * (T2h - T2k); + } + } + { + E Ti, T2x, TO, T2v, Tl, T2u, TR, T2y, TL, TS; + { + E Tg, Th, TM, TN; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + T2x = Tg - Th; + TM = Ip[WS(rs, 1)]; + TN = Im[WS(rs, 6)]; + TO = TM - TN; + T2v = TM + TN; + } + { + E Tj, Tk, TP, TQ; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + T2u = Tj - Tk; + TP = Ip[WS(rs, 5)]; + TQ = Im[WS(rs, 2)]; + TR = TP - TQ; + T2y = TP + TQ; + } + Tm = Ti + Tl; + T1T = TO + TR; + TL = Ti - Tl; + TS = TO - TR; + TT = TL - TS; + T1h = TL + TS; + { + E T2w, T2z, T39, T3a; + T2w = T2u + T2v; + T2z = T2x - T2y; + T2A = FMA(KP923879532, T2w, KP382683432 * T2z); + T2N = FNMS(KP382683432, T2w, KP923879532 * T2z); + T39 = T2x + T2y; + T3a = T2v - T2u; + T3b = FNMS(KP923879532, T3a, KP382683432 * T39); + T3n = FMA(KP382683432, T3a, KP923879532 * T39); + } + } + { + E Tp, T2q, TX, T2o, Ts, T2n, T10, T2r, TU, T11; + { + E Tn, To, TV, TW; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T2q = Tn - To; + TV = Ip[WS(rs, 7)]; + TW = Im[0]; + TX = TV - TW; + T2o = TV + TW; + } + { + E Tq, Tr, TY, TZ; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + T2n = Tq - Tr; + TY = Ip[WS(rs, 3)]; + TZ = Im[WS(rs, 4)]; + T10 = TY - TZ; + T2r = TY + TZ; + } + Tt = Tp + Ts; + T1U = TX + T10; + TU = Tp - Ts; + T11 = TX - T10; + T12 = TU + T11; + T1i = T11 - TU; + { + E T2p, T2s, T3c, T3d; + T2p = T2n - T2o; + T2s = T2q - T2r; + T2t = FNMS(KP382683432, T2s, KP923879532 * T2p); + T2O = FMA(KP382683432, T2p, KP923879532 * T2s); + T3c = T2q + T2r; + T3d = T2n + T2o; + T3e = FNMS(KP923879532, T3d, KP382683432 * T3c); + T3o = FMA(KP382683432, T3d, KP923879532 * T3c); + } + } + { + E Tf, Tu, T1O, T1S, T1V, T1W; + Tf = T7 + Te; + Tu = Tm + Tt; + T1O = Tf - Tu; + T1S = T1Q + T1R; + T1V = T1T + T1U; + T1W = T1S - T1V; + Rp[0] = Tf + Tu; + Rm[0] = T1S + T1V; + Rp[WS(rs, 4)] = FNMS(T1P, T1W, T1N * T1O); + Rm[WS(rs, 4)] = FMA(T1P, T1O, T1N * T1W); + } + { + E T3g, T3r, T3q, T3s; + { + E T38, T3f, T3m, T3p; + T38 = T36 - T37; + T3f = T3b + T3e; + T3g = T38 - T3f; + T3r = T38 + T3f; + T3m = T3k + T3l; + T3p = T3n - T3o; + T3q = T3m - T3p; + T3s = T3m + T3p; + } + Ip[WS(rs, 5)] = FNMS(T3j, T3q, T35 * T3g); + Im[WS(rs, 5)] = FMA(T3j, T3g, T35 * T3q); + Ip[WS(rs, 1)] = FNMS(T1n, T3s, T1l * T3r); + Im[WS(rs, 1)] = FMA(T1n, T3r, T1l * T3s); + } + { + E T3w, T3B, T3A, T3C; + { + E T3u, T3v, T3y, T3z; + T3u = T36 + T37; + T3v = T3n + T3o; + T3w = T3u - T3v; + T3B = T3u + T3v; + T3y = T3k - T3l; + T3z = T3b - T3e; + T3A = T3y + T3z; + T3C = T3y - T3z; + } + Ip[WS(rs, 3)] = FNMS(T3x, T3A, T3t * T3w); + Im[WS(rs, 3)] = FMA(T3t, T3A, T3x * T3w); + Ip[WS(rs, 7)] = FNMS(T1w, T3C, T1v * T3B); + Im[WS(rs, 7)] = FMA(T1v, T3C, T1w * T3B); + } + { + E T14, T1q, T1k, T1u; + { + E TK, T13, T1g, T1j; + TK = TC + TJ; + T13 = KP707106781 * (TT + T12); + T14 = TK - T13; + T1q = TK + T13; + T1g = T18 + T1f; + T1j = KP707106781 * (T1h + T1i); + T1k = T1g - T1j; + T1u = T1g + T1j; + } + Rp[WS(rs, 5)] = FNMS(T17, T1k, TB * T14); + Rm[WS(rs, 5)] = FMA(T17, T14, TB * T1k); + Rp[WS(rs, 1)] = FNMS(T1t, T1u, T1p * T1q); + Rm[WS(rs, 1)] = FMA(T1t, T1q, T1p * T1u); + } + { + E T1A, T1I, T1E, T1M; + { + E T1y, T1z, T1C, T1D; + T1y = TC - TJ; + T1z = KP707106781 * (T1i - T1h); + T1A = T1y - T1z; + T1I = T1y + T1z; + T1C = T1f - T18; + T1D = KP707106781 * (TT - T12); + T1E = T1C - T1D; + T1M = T1C + T1D; + } + Rp[WS(rs, 7)] = FNMS(T1B, T1E, T1x * T1A); + Rm[WS(rs, 7)] = FMA(T1x, T1E, T1B * T1A); + Rp[WS(rs, 3)] = FNMS(T1L, T1M, T1H * T1I); + Rm[WS(rs, 3)] = FMA(T1H, T1M, T1L * T1I); + } + { + E T2C, T2S, T2Q, T2U; + { + E T2m, T2B, T2M, T2P; + T2m = T2e - T2l; + T2B = T2t - T2A; + T2C = T2m - T2B; + T2S = T2m + T2B; + T2M = T2I - T2L; + T2P = T2N - T2O; + T2Q = T2M - T2P; + T2U = T2M + T2P; + } + Ip[WS(rs, 6)] = FNMS(T2F, T2Q, T2b * T2C); + Im[WS(rs, 6)] = FMA(T2F, T2C, T2b * T2Q); + Ip[WS(rs, 2)] = FNMS(T2T, T2U, T2R * T2S); + Im[WS(rs, 2)] = FMA(T2T, T2S, T2R * T2U); + } + { + E T2X, T31, T30, T32; + { + E T2V, T2W, T2Y, T2Z; + T2V = T2e + T2l; + T2W = T2N + T2O; + T2X = T2V - T2W; + T31 = T2V + T2W; + T2Y = T2I + T2L; + T2Z = T2A + T2t; + T30 = T2Y - T2Z; + T32 = T2Y + T2Z; + } + Ip[WS(rs, 4)] = FNMS(Tz, T30, Tw * T2X); + Im[WS(rs, 4)] = FMA(Tw, T30, Tz * T2X); + Ip[0] = FNMS(Ty, T32, Tv * T31); + Im[0] = FMA(Tv, T32, Ty * T31); + } + { + E T20, T26, T24, T28; + { + E T1Y, T1Z, T22, T23; + T1Y = T7 - Te; + T1Z = T1U - T1T; + T20 = T1Y - T1Z; + T26 = T1Y + T1Z; + T22 = T1Q - T1R; + T23 = Tm - Tt; + T24 = T22 - T23; + T28 = T23 + T22; + } + Rp[WS(rs, 6)] = FNMS(T21, T24, T1X * T20); + Rm[WS(rs, 6)] = FMA(T1X, T24, T21 * T20); + Rp[WS(rs, 2)] = FNMS(T27, T28, T25 * T26); + Rm[WS(rs, 2)] = FMA(T25, T28, T27 * T26); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cb2_16", twinstr, &GENUS, {156, 68, 40, 0} }; + +void X(codelet_hc2cb2_16) (planner *p) { + X(khc2c_register) (p, hc2cb2_16, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_20.c new file mode 100644 index 000000000..4e4b7f804 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_20.c @@ -0,0 +1,1087 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:57 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 20 -dif -name hc2cb2_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 276 FP additions, 198 FP multiplications, + * (or, 136 additions, 58 multiplications, 140 fused multiply/add), + * 129 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(80, rs)) { + E TD, TH, TE, T1L, T1N, T1X, TG, T29, TI, T2b, T1V, T1O, T24, T36, T5b; + E T1S, T1Y, T3b, T3e, T2o, T2Y, T2U, T31, T2s, T4y, T4u, T2f, T2c, T2g, T5g; + E T2k, T1s, T48, T4c, T5q, T5m, T4k, T4f; + { + E T1r, T1M, T2T, T1R, T2X, T23, T2r, T1W, T2n, T2a, TF, T4x; + TD = W[0]; + TH = W[3]; + TE = W[2]; + TF = TD * TE; + T1r = TD * TH; + T1L = W[6]; + T1M = TD * T1L; + T2T = TE * T1L; + T1N = W[7]; + T1R = TD * T1N; + T2X = TE * T1N; + T1X = W[5]; + T23 = TE * T1X; + T2r = TD * T1X; + TG = W[1]; + T29 = FNMS(TG, TH, TF); + TI = FMA(TG, TH, TF); + T2b = FMA(TG, TE, T1r); + T1V = W[4]; + T1W = TE * T1V; + T2n = TD * T1V; + T2a = T29 * T1V; + T1O = FMA(TG, T1N, T1M); + T24 = FNMS(TH, T1V, T23); + T36 = FNMS(TG, T1V, T2r); + T5b = FNMS(T2b, T1X, T2a); + T1S = FNMS(TG, T1L, T1R); + T1Y = FMA(TH, T1X, T1W); + T3b = FNMS(TH, T1X, T1W); + T3e = FMA(TH, T1V, T23); + T2o = FNMS(TG, T1X, T2n); + T2Y = FNMS(TH, T1L, T2X); + T2U = FMA(TH, T1N, T2T); + T31 = FMA(TG, T1X, T2n); + T2s = FMA(TG, T1V, T2r); + T4x = T29 * T1N; + T4y = FNMS(T2b, T1L, T4x); + { + E T4t, T2e, T2d, T2j; + T4t = T29 * T1L; + T4u = FMA(T2b, T1N, T4t); + T2e = T29 * T1X; + T2f = FNMS(T2b, T1V, T2e); + T2c = FMA(T2b, T1X, T2a); + T2d = T2c * T1L; + T2j = T2c * T1N; + T2g = FMA(T2f, T1N, T2d); + T5g = FMA(T2b, T1V, T2e); + T2k = FNMS(T2f, T1L, T2j); + { + E T47, T5p, T4b, T5l; + T47 = TI * T1V; + T5p = TI * T1N; + T4b = TI * T1X; + T5l = TI * T1L; + T1s = FNMS(TG, TE, T1r); + T48 = FMA(T1s, T1X, T47); + T4c = FNMS(T1s, T1V, T4b); + T5q = FNMS(T1s, T1L, T5p); + T5m = FMA(T1s, T1N, T5l); + T4k = FMA(T1s, T1V, T4b); + T4f = FNMS(T1s, T1X, T47); + } + } + } + { + E T7, T4B, T4V, TJ, T1z, T3j, T3V, T2H, T18, T42, T43, T1n, T2D, T53, T52; + E T2A, T1H, T4R, T4O, T1G, T2O, T3I, T2P, T3P, T2I, T2J, T2K, T1A, T1B, T1C; + E TC, T2w, T3Y, T40, T4I, T4K, TQ, TS, T3y, T3A, T4Y, T50; + { + E T3, T3h, T1v, T3T, T6, T3U, T1y, T3i; + { + E T1, T2, T1t, T1u; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T3h = T1 - T2; + T1t = Ip[0]; + T1u = Im[WS(rs, 9)]; + T1v = T1t - T1u; + T3T = T1t + T1u; + } + { + E T4, T5, T1w, T1x; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + T3U = T4 - T5; + T1w = Ip[WS(rs, 5)]; + T1x = Im[WS(rs, 4)]; + T1y = T1w - T1x; + T3i = T1w + T1x; + } + T7 = T3 + T6; + T4B = T3h - T3i; + T4V = T3U + T3T; + TJ = T3 - T6; + T1z = T1v - T1y; + T3j = T3h + T3i; + T3V = T3T - T3U; + T2H = T1v + T1y; + } + { + E Te, T4C, T4M, TK, T1f, T3m, T3L, T2y, TA, T4G, T4Q, TO, T17, T3w, T3H; + E T2C, Tl, T4D, T4N, TL, T1m, T3p, T3O, T2z, Tt, T4F, T4P, TN, T10, T3t; + E T3E, T2B; + { + E Ta, T3k, T1b, T3J, Td, T3K, T1e, T3l; + { + E T8, T9, T19, T1a; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T3k = T8 - T9; + T19 = Ip[WS(rs, 4)]; + T1a = Im[WS(rs, 5)]; + T1b = T19 - T1a; + T3J = T19 + T1a; + } + { + E Tb, Tc, T1c, T1d; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + T3K = Tb - Tc; + T1c = Ip[WS(rs, 9)]; + T1d = Im[0]; + T1e = T1c - T1d; + T3l = T1c + T1d; + } + Te = Ta + Td; + T4C = T3k - T3l; + T4M = T3K + T3J; + TK = Ta - Td; + T1f = T1b - T1e; + T3m = T3k + T3l; + T3L = T3J - T3K; + T2y = T1b + T1e; + } + { + E Tw, T3u, T13, T3G, Tz, T3F, T16, T3v; + { + E Tu, Tv, T11, T12; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T3u = Tu - Tv; + T11 = Ip[WS(rs, 2)]; + T12 = Im[WS(rs, 7)]; + T13 = T11 - T12; + T3G = T11 + T12; + } + { + E Tx, Ty, T14, T15; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + T3F = Tx - Ty; + T14 = Ip[WS(rs, 7)]; + T15 = Im[WS(rs, 2)]; + T16 = T14 - T15; + T3v = T14 + T15; + } + TA = Tw + Tz; + T4G = T3u + T3v; + T4Q = T3F - T3G; + TO = Tw - Tz; + T17 = T13 - T16; + T3w = T3u - T3v; + T3H = T3F + T3G; + T2C = T13 + T16; + } + { + E Th, T3n, T1i, T3N, Tk, T3M, T1l, T3o; + { + E Tf, Tg, T1g, T1h; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T3n = Tf - Tg; + T1g = Ip[WS(rs, 6)]; + T1h = Im[WS(rs, 3)]; + T1i = T1g - T1h; + T3N = T1g + T1h; + } + { + E Ti, Tj, T1j, T1k; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + T3M = Ti - Tj; + T1j = Ip[WS(rs, 1)]; + T1k = Im[WS(rs, 8)]; + T1l = T1j - T1k; + T3o = T1j + T1k; + } + Tl = Th + Tk; + T4D = T3n - T3o; + T4N = T3M - T3N; + TL = Th - Tk; + T1m = T1i - T1l; + T3p = T3n + T3o; + T3O = T3M + T3N; + T2z = T1i + T1l; + } + { + E Tp, T3r, TW, T3C, Ts, T3D, TZ, T3s; + { + E Tn, To, TU, TV; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T3r = Tn - To; + TU = Ip[WS(rs, 8)]; + TV = Im[WS(rs, 1)]; + TW = TU - TV; + T3C = TU + TV; + } + { + E Tq, Tr, TX, TY; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + T3D = Tq - Tr; + TX = Ip[WS(rs, 3)]; + TY = Im[WS(rs, 6)]; + TZ = TX - TY; + T3s = TX + TY; + } + Tt = Tp + Ts; + T4F = T3r + T3s; + T4P = T3D + T3C; + TN = Tp - Ts; + T10 = TW - TZ; + T3t = T3r - T3s; + T3E = T3C - T3D; + T2B = TW + TZ; + } + T18 = T10 - T17; + T42 = T3t - T3w; + T43 = T3m - T3p; + T1n = T1f - T1m; + T2D = T2B - T2C; + T53 = T4F - T4G; + T52 = T4C - T4D; + T2A = T2y - T2z; + T1H = TK - TL; + T4R = T4P - T4Q; + T4O = T4M - T4N; + T1G = TN - TO; + T2O = Te - Tl; + T3I = T3E + T3H; + T2P = Tt - TA; + T3P = T3L + T3O; + T2I = T2y + T2z; + T2J = T2B + T2C; + T2K = T2I + T2J; + T1A = T1f + T1m; + T1B = T10 + T17; + T1C = T1A + T1B; + { + E Tm, TB, TM, TP; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T2w = Tm - TB; + { + E T3W, T3X, T4E, T4H; + T3W = T3L - T3O; + T3X = T3E - T3H; + T3Y = T3W + T3X; + T40 = T3W - T3X; + T4E = T4C + T4D; + T4H = T4F + T4G; + T4I = T4E + T4H; + T4K = T4E - T4H; + } + TM = TK + TL; + TP = TN + TO; + TQ = TM + TP; + TS = TM - TP; + { + E T3q, T3x, T4W, T4X; + T3q = T3m + T3p; + T3x = T3t + T3w; + T3y = T3q + T3x; + T3A = T3q - T3x; + T4W = T4M + T4N; + T4X = T4P + T4Q; + T4Y = T4W + T4X; + T50 = T4W - T4X; + } + } + } + Rp[0] = T7 + TC; + Rm[0] = T2H + T2K; + { + E T2t, T2q, T2u, T2p; + T2t = T1z + T1C; + T2p = TJ + TQ; + T2q = T2o * T2p; + T2u = T2s * T2p; + Rp[WS(rs, 5)] = FNMS(T2s, T2t, T2q); + Rm[WS(rs, 5)] = FMA(T2o, T2t, T2u); + } + { + E T5t, T5u, T5v, T5w; + T5t = T4B + T4I; + T5u = T2c * T5t; + T5v = T4V + T4Y; + T5w = T2c * T5v; + Ip[WS(rs, 2)] = FNMS(T2f, T5v, T5u); + Im[WS(rs, 2)] = FMA(T2f, T5t, T5w); + } + { + E T4v, T4w, T4z, T4A; + T4v = T3j + T3y; + T4w = T4u * T4v; + T4z = T3V + T3Y; + T4A = T4u * T4z; + Ip[WS(rs, 7)] = FNMS(T4y, T4z, T4w); + Im[WS(rs, 7)] = FMA(T4y, T4v, T4A); + } + { + E T3R, T4p, T49, T4i, T45, T4r, T4d, T4n; + { + E T3Q, T4h, T3B, T4g, T3z; + T3Q = FNMS(KP618033988, T3P, T3I); + T4h = FMA(KP618033988, T3I, T3P); + T3z = FNMS(KP250000000, T3y, T3j); + T3B = FNMS(KP559016994, T3A, T3z); + T4g = FMA(KP559016994, T3A, T3z); + T3R = FNMS(KP951056516, T3Q, T3B); + T4p = FMA(KP951056516, T4h, T4g); + T49 = FMA(KP951056516, T3Q, T3B); + T4i = FNMS(KP951056516, T4h, T4g); + } + { + E T44, T4m, T41, T4l, T3Z; + T44 = FNMS(KP618033988, T43, T42); + T4m = FMA(KP618033988, T42, T43); + T3Z = FNMS(KP250000000, T3Y, T3V); + T41 = FNMS(KP559016994, T40, T3Z); + T4l = FMA(KP559016994, T40, T3Z); + T45 = FMA(KP951056516, T44, T41); + T4r = FNMS(KP951056516, T4m, T4l); + T4d = FNMS(KP951056516, T44, T41); + T4n = FMA(KP951056516, T4m, T4l); + } + { + E T3S, T46, T4a, T4e; + T3S = TE * T3R; + Ip[WS(rs, 1)] = FNMS(TH, T45, T3S); + T46 = TE * T45; + Im[WS(rs, 1)] = FMA(TH, T3R, T46); + T4a = T48 * T49; + Ip[WS(rs, 3)] = FNMS(T4c, T4d, T4a); + T4e = T48 * T4d; + Im[WS(rs, 3)] = FMA(T4c, T49, T4e); + } + { + E T4j, T4o, T4q, T4s; + T4j = T4f * T4i; + Ip[WS(rs, 5)] = FNMS(T4k, T4n, T4j); + T4o = T4f * T4n; + Im[WS(rs, 5)] = FMA(T4k, T4i, T4o); + T4q = T1L * T4p; + Ip[WS(rs, 9)] = FNMS(T1N, T4r, T4q); + T4s = T1L * T4r; + Im[WS(rs, 9)] = FMA(T1N, T4p, T4s); + } + } + { + E T4T, T5n, T57, T5e, T55, T5r, T59, T5j; + { + E T4S, T5d, T4L, T5c, T4J; + T4S = FMA(KP618033988, T4R, T4O); + T5d = FNMS(KP618033988, T4O, T4R); + T4J = FNMS(KP250000000, T4I, T4B); + T4L = FMA(KP559016994, T4K, T4J); + T5c = FNMS(KP559016994, T4K, T4J); + T4T = FNMS(KP951056516, T4S, T4L); + T5n = FMA(KP951056516, T5d, T5c); + T57 = FMA(KP951056516, T4S, T4L); + T5e = FNMS(KP951056516, T5d, T5c); + } + { + E T54, T5i, T51, T5h, T4Z; + T54 = FMA(KP618033988, T53, T52); + T5i = FNMS(KP618033988, T52, T53); + T4Z = FNMS(KP250000000, T4Y, T4V); + T51 = FMA(KP559016994, T50, T4Z); + T5h = FNMS(KP559016994, T50, T4Z); + T55 = FMA(KP951056516, T54, T51); + T5r = FNMS(KP951056516, T5i, T5h); + T59 = FNMS(KP951056516, T54, T51); + T5j = FMA(KP951056516, T5i, T5h); + } + { + E T4U, T56, T58, T5a; + T4U = TD * T4T; + Ip[0] = FNMS(TG, T55, T4U); + T56 = TD * T55; + Im[0] = FMA(TG, T4T, T56); + T58 = T1V * T57; + Ip[WS(rs, 4)] = FNMS(T1X, T59, T58); + T5a = T1V * T59; + Im[WS(rs, 4)] = FMA(T1X, T57, T5a); + } + { + E T5f, T5k, T5o, T5s; + T5f = T5b * T5e; + Ip[WS(rs, 6)] = FNMS(T5g, T5j, T5f); + T5k = T5b * T5j; + Im[WS(rs, 6)] = FMA(T5g, T5e, T5k); + T5o = T5m * T5n; + Ip[WS(rs, 8)] = FNMS(T5q, T5r, T5o); + T5s = T5m * T5r; + Im[WS(rs, 8)] = FMA(T5q, T5n, T5s); + } + } + { + E T2Q, T38, T2N, T37, T2F, T3c, T2V, T34, T2L, T2M; + T2Q = FMA(KP618033988, T2P, T2O); + T38 = FNMS(KP618033988, T2O, T2P); + T2L = FNMS(KP250000000, T2K, T2H); + T2M = T2I - T2J; + T2N = FMA(KP559016994, T2M, T2L); + T37 = FNMS(KP559016994, T2M, T2L); + { + E T2E, T33, T2x, T32, T2v; + T2E = FMA(KP618033988, T2D, T2A); + T33 = FNMS(KP618033988, T2A, T2D); + T2v = FNMS(KP250000000, TC, T7); + T2x = FMA(KP559016994, T2w, T2v); + T32 = FNMS(KP559016994, T2w, T2v); + T2F = FMA(KP951056516, T2E, T2x); + T3c = FMA(KP951056516, T33, T32); + T2V = FNMS(KP951056516, T2E, T2x); + T34 = FNMS(KP951056516, T33, T32); + } + { + E T2G, T2S, T2R, T3d, T3g, T3f; + T2G = T29 * T2F; + T2S = T2b * T2F; + T2R = FNMS(KP951056516, T2Q, T2N); + Rp[WS(rs, 2)] = FNMS(T2b, T2R, T2G); + Rm[WS(rs, 2)] = FMA(T29, T2R, T2S); + T3d = T3b * T3c; + T3g = T3e * T3c; + T3f = FNMS(KP951056516, T38, T37); + Rp[WS(rs, 6)] = FNMS(T3e, T3f, T3d); + Rm[WS(rs, 6)] = FMA(T3b, T3f, T3g); + } + { + E T2W, T30, T2Z, T35, T3a, T39; + T2W = T2U * T2V; + T30 = T2Y * T2V; + T2Z = FMA(KP951056516, T2Q, T2N); + Rp[WS(rs, 8)] = FNMS(T2Y, T2Z, T2W); + Rm[WS(rs, 8)] = FMA(T2U, T2Z, T30); + T35 = T31 * T34; + T3a = T36 * T34; + T39 = FMA(KP951056516, T38, T37); + Rp[WS(rs, 4)] = FNMS(T36, T39, T35); + Rm[WS(rs, 4)] = FMA(T31, T39, T3a); + } + } + { + E T1I, T26, T1F, T25, T1p, T2h, T1P, T21, T1D, T1E; + T1I = FNMS(KP618033988, T1H, T1G); + T26 = FMA(KP618033988, T1G, T1H); + T1D = FNMS(KP250000000, T1C, T1z); + T1E = T1A - T1B; + T1F = FNMS(KP559016994, T1E, T1D); + T25 = FMA(KP559016994, T1E, T1D); + { + E T1o, T20, TT, T1Z, TR; + T1o = FNMS(KP618033988, T1n, T18); + T20 = FMA(KP618033988, T18, T1n); + TR = FNMS(KP250000000, TQ, TJ); + TT = FNMS(KP559016994, TS, TR); + T1Z = FMA(KP559016994, TS, TR); + T1p = FMA(KP951056516, T1o, TT); + T2h = FMA(KP951056516, T20, T1Z); + T1P = FNMS(KP951056516, T1o, TT); + T21 = FNMS(KP951056516, T20, T1Z); + } + { + E T1q, T1K, T1J, T2i, T2m, T2l; + T1q = TI * T1p; + T1K = T1s * T1p; + T1J = FNMS(KP951056516, T1I, T1F); + Rp[WS(rs, 1)] = FNMS(T1s, T1J, T1q); + Rm[WS(rs, 1)] = FMA(TI, T1J, T1K); + T2i = T2g * T2h; + T2m = T2k * T2h; + T2l = FNMS(KP951056516, T26, T25); + Rp[WS(rs, 7)] = FNMS(T2k, T2l, T2i); + Rm[WS(rs, 7)] = FMA(T2g, T2l, T2m); + } + { + E T1Q, T1U, T1T, T22, T28, T27; + T1Q = T1O * T1P; + T1U = T1S * T1P; + T1T = FMA(KP951056516, T1I, T1F); + Rp[WS(rs, 9)] = FNMS(T1S, T1T, T1Q); + Rm[WS(rs, 9)] = FMA(T1O, T1T, T1U); + T22 = T1Y * T21; + T28 = T24 * T21; + T27 = FMA(KP951056516, T26, T25); + Rp[WS(rs, 3)] = FNMS(T24, T27, T22); + Rm[WS(rs, 3)] = FMA(T1Y, T27, T28); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cb2_20", twinstr, &GENUS, {136, 58, 140, 0} }; + +void X(codelet_hc2cb2_20) (planner *p) { + X(khc2c_register) (p, hc2cb2_20, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 20 -dif -name hc2cb2_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 276 FP additions, 164 FP multiplications, + * (or, 204 additions, 92 multiplications, 72 fused multiply/add), + * 137 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(80, rs)) { + E TD, TG, TE, TH, TJ, T1t, T27, T25, T1T, T1R, T1V, T2j, T2Z, T21, T2X; + E T2T, T2n, T2P, T3V, T41, T3R, T3X, T29, T2c, T4H, T4L, T1L, T1M, T1N, T2d; + E T4R, T1P, T4P, T49, T2N, T2f, T47, T2L; + { + E T1U, T2l, T1Z, T2i, T1S, T2m, T20, T2h; + { + E TF, T1s, TI, T1r; + TD = W[0]; + TG = W[1]; + TE = W[2]; + TH = W[3]; + TF = TD * TE; + T1s = TG * TE; + TI = TG * TH; + T1r = TD * TH; + TJ = TF + TI; + T1t = T1r - T1s; + T27 = T1r + T1s; + T25 = TF - TI; + T1T = W[5]; + T1U = TH * T1T; + T2l = TD * T1T; + T1Z = TE * T1T; + T2i = TG * T1T; + T1R = W[4]; + T1S = TE * T1R; + T2m = TG * T1R; + T20 = TH * T1R; + T2h = TD * T1R; + } + T1V = T1S + T1U; + T2j = T2h - T2i; + T2Z = T1Z + T20; + T21 = T1Z - T20; + T2X = T1S - T1U; + T2T = T2l - T2m; + T2n = T2l + T2m; + T2P = T2h + T2i; + { + E T3T, T3U, T3P, T3Q; + T3T = TJ * T1T; + T3U = T1t * T1R; + T3V = T3T - T3U; + T41 = T3T + T3U; + T3P = TJ * T1R; + T3Q = T1t * T1T; + T3R = T3P + T3Q; + T3X = T3P - T3Q; + { + E T26, T28, T2a, T2b; + T26 = T25 * T1R; + T28 = T27 * T1T; + T29 = T26 + T28; + T2a = T25 * T1T; + T2b = T27 * T1R; + T2c = T2a - T2b; + T4H = T26 - T28; + T4L = T2a + T2b; + T1L = W[6]; + T1M = W[7]; + T1N = FMA(TD, T1L, TG * T1M); + T2d = FMA(T29, T1L, T2c * T1M); + T4R = FNMS(T1t, T1L, TJ * T1M); + T1P = FNMS(TG, T1L, TD * T1M); + T4P = FMA(TJ, T1L, T1t * T1M); + T49 = FNMS(T27, T1L, T25 * T1M); + T2N = FNMS(TH, T1L, TE * T1M); + T2f = FNMS(T2c, T1L, T29 * T1M); + T47 = FMA(T25, T1L, T27 * T1M); + T2L = FMA(TE, T1L, TH * T1M); + } + } + } + { + E T7, T4i, T4x, TK, T1D, T3i, T3E, T2D, T19, T3L, T3M, T1o, T2x, T4C, T4B; + E T2u, T1v, T4r, T4o, T1u, T2H, T37, T2I, T3e, T3p, T3w, T3x, Tm, TB, TC; + E T4u, T4v, T4y, T2A, T2B, T2E, T1E, T1F, T1G, T4d, T4g, T4j, T3F, T3G, T3H; + E TN, TQ, TR, T48, T4a; + { + E T3, T3g, T1z, T3C, T6, T3D, T1C, T3h; + { + E T1, T2, T1x, T1y; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T3g = T1 - T2; + T1x = Ip[0]; + T1y = Im[WS(rs, 9)]; + T1z = T1x - T1y; + T3C = T1x + T1y; + } + { + E T4, T5, T1A, T1B; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + T3D = T4 - T5; + T1A = Ip[WS(rs, 5)]; + T1B = Im[WS(rs, 4)]; + T1C = T1A - T1B; + T3h = T1A + T1B; + } + T7 = T3 + T6; + T4i = T3g - T3h; + T4x = T3D + T3C; + TK = T3 - T6; + T1D = T1z - T1C; + T3i = T3g + T3h; + T3E = T3C - T3D; + T2D = T1z + T1C; + } + { + E Te, T4b, T4m, TL, T11, T33, T3l, T2s, TA, T4f, T4q, TP, T1n, T3d, T3v; + E T2w, Tl, T4c, T4n, TM, T18, T36, T3o, T2t, Tt, T4e, T4p, TO, T1g, T3a; + E T3s, T2v; + { + E Ta, T3j, TX, T31, Td, T32, T10, T3k; + { + E T8, T9, TV, TW; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T3j = T8 - T9; + TV = Ip[WS(rs, 4)]; + TW = Im[WS(rs, 5)]; + TX = TV - TW; + T31 = TV + TW; + } + { + E Tb, Tc, TY, TZ; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + T32 = Tb - Tc; + TY = Ip[WS(rs, 9)]; + TZ = Im[0]; + T10 = TY - TZ; + T3k = TY + TZ; + } + Te = Ta + Td; + T4b = T3j - T3k; + T4m = T32 + T31; + TL = Ta - Td; + T11 = TX - T10; + T33 = T31 - T32; + T3l = T3j + T3k; + T2s = TX + T10; + } + { + E Tw, T3t, T1j, T3c, Tz, T3b, T1m, T3u; + { + E Tu, Tv, T1h, T1i; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T3t = Tu - Tv; + T1h = Ip[WS(rs, 2)]; + T1i = Im[WS(rs, 7)]; + T1j = T1h - T1i; + T3c = T1h + T1i; + } + { + E Tx, Ty, T1k, T1l; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + T3b = Tx - Ty; + T1k = Ip[WS(rs, 7)]; + T1l = Im[WS(rs, 2)]; + T1m = T1k - T1l; + T3u = T1k + T1l; + } + TA = Tw + Tz; + T4f = T3t + T3u; + T4q = T3b - T3c; + TP = Tw - Tz; + T1n = T1j - T1m; + T3d = T3b + T3c; + T3v = T3t - T3u; + T2w = T1j + T1m; + } + { + E Th, T3m, T14, T35, Tk, T34, T17, T3n; + { + E Tf, Tg, T12, T13; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T3m = Tf - Tg; + T12 = Ip[WS(rs, 6)]; + T13 = Im[WS(rs, 3)]; + T14 = T12 - T13; + T35 = T12 + T13; + } + { + E Ti, Tj, T15, T16; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + T34 = Ti - Tj; + T15 = Ip[WS(rs, 1)]; + T16 = Im[WS(rs, 8)]; + T17 = T15 - T16; + T3n = T15 + T16; + } + Tl = Th + Tk; + T4c = T3m - T3n; + T4n = T34 - T35; + TM = Th - Tk; + T18 = T14 - T17; + T36 = T34 + T35; + T3o = T3m + T3n; + T2t = T14 + T17; + } + { + E Tp, T3q, T1c, T38, Ts, T39, T1f, T3r; + { + E Tn, To, T1a, T1b; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T3q = Tn - To; + T1a = Ip[WS(rs, 8)]; + T1b = Im[WS(rs, 1)]; + T1c = T1a - T1b; + T38 = T1a + T1b; + } + { + E Tq, Tr, T1d, T1e; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + T39 = Tq - Tr; + T1d = Ip[WS(rs, 3)]; + T1e = Im[WS(rs, 6)]; + T1f = T1d - T1e; + T3r = T1d + T1e; + } + Tt = Tp + Ts; + T4e = T3q + T3r; + T4p = T39 + T38; + TO = Tp - Ts; + T1g = T1c - T1f; + T3a = T38 - T39; + T3s = T3q - T3r; + T2v = T1c + T1f; + } + T19 = T11 - T18; + T3L = T3l - T3o; + T3M = T3s - T3v; + T1o = T1g - T1n; + T2x = T2v - T2w; + T4C = T4e - T4f; + T4B = T4b - T4c; + T2u = T2s - T2t; + T1v = TO - TP; + T4r = T4p - T4q; + T4o = T4m - T4n; + T1u = TL - TM; + T2H = Te - Tl; + T37 = T33 + T36; + T2I = Tt - TA; + T3e = T3a + T3d; + T3p = T3l + T3o; + T3w = T3s + T3v; + T3x = T3p + T3w; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T4u = T4m + T4n; + T4v = T4p + T4q; + T4y = T4u + T4v; + T2A = T2s + T2t; + T2B = T2v + T2w; + T2E = T2A + T2B; + T1E = T11 + T18; + T1F = T1g + T1n; + T1G = T1E + T1F; + T4d = T4b + T4c; + T4g = T4e + T4f; + T4j = T4d + T4g; + T3F = T33 - T36; + T3G = T3a - T3d; + T3H = T3F + T3G; + TN = TL + TM; + TQ = TO + TP; + TR = TN + TQ; + } + Rp[0] = T7 + TC; + Rm[0] = T2D + T2E; + { + E T2k, T2o, T4T, T4U; + T2k = TK + TR; + T2o = T1D + T1G; + Rp[WS(rs, 5)] = FNMS(T2n, T2o, T2j * T2k); + Rm[WS(rs, 5)] = FMA(T2n, T2k, T2j * T2o); + T4T = T4i + T4j; + T4U = T4x + T4y; + Ip[WS(rs, 2)] = FNMS(T2c, T4U, T29 * T4T); + Im[WS(rs, 2)] = FMA(T29, T4U, T2c * T4T); + } + T48 = T3i + T3x; + T4a = T3E + T3H; + Ip[WS(rs, 7)] = FNMS(T49, T4a, T47 * T48); + Im[WS(rs, 7)] = FMA(T47, T4a, T49 * T48); + { + E T2y, T2J, T2V, T2R, T2G, T2U, T2r, T2Q; + T2y = FMA(KP951056516, T2u, KP587785252 * T2x); + T2J = FMA(KP951056516, T2H, KP587785252 * T2I); + T2V = FNMS(KP951056516, T2I, KP587785252 * T2H); + T2R = FNMS(KP951056516, T2x, KP587785252 * T2u); + { + E T2C, T2F, T2p, T2q; + T2C = KP559016994 * (T2A - T2B); + T2F = FNMS(KP250000000, T2E, T2D); + T2G = T2C + T2F; + T2U = T2F - T2C; + T2p = KP559016994 * (Tm - TB); + T2q = FNMS(KP250000000, TC, T7); + T2r = T2p + T2q; + T2Q = T2q - T2p; + } + { + E T2z, T2K, T2Y, T30; + T2z = T2r + T2y; + T2K = T2G - T2J; + Rp[WS(rs, 2)] = FNMS(T27, T2K, T25 * T2z); + Rm[WS(rs, 2)] = FMA(T27, T2z, T25 * T2K); + T2Y = T2Q - T2R; + T30 = T2V + T2U; + Rp[WS(rs, 6)] = FNMS(T2Z, T30, T2X * T2Y); + Rm[WS(rs, 6)] = FMA(T2Z, T2Y, T2X * T30); + } + { + E T2M, T2O, T2S, T2W; + T2M = T2r - T2y; + T2O = T2J + T2G; + Rp[WS(rs, 8)] = FNMS(T2N, T2O, T2L * T2M); + Rm[WS(rs, 8)] = FMA(T2N, T2M, T2L * T2O); + T2S = T2Q + T2R; + T2W = T2U - T2V; + Rp[WS(rs, 4)] = FNMS(T2T, T2W, T2P * T2S); + Rm[WS(rs, 4)] = FMA(T2T, T2S, T2P * T2W); + } + } + { + E T4s, T4D, T4N, T4I, T4A, T4M, T4l, T4J; + T4s = FMA(KP951056516, T4o, KP587785252 * T4r); + T4D = FMA(KP951056516, T4B, KP587785252 * T4C); + T4N = FNMS(KP951056516, T4C, KP587785252 * T4B); + T4I = FNMS(KP951056516, T4r, KP587785252 * T4o); + { + E T4w, T4z, T4h, T4k; + T4w = KP559016994 * (T4u - T4v); + T4z = FNMS(KP250000000, T4y, T4x); + T4A = T4w + T4z; + T4M = T4z - T4w; + T4h = KP559016994 * (T4d - T4g); + T4k = FNMS(KP250000000, T4j, T4i); + T4l = T4h + T4k; + T4J = T4k - T4h; + } + { + E T4t, T4E, T4Q, T4S; + T4t = T4l - T4s; + T4E = T4A + T4D; + Ip[0] = FNMS(TG, T4E, TD * T4t); + Im[0] = FMA(TD, T4E, TG * T4t); + T4Q = T4J - T4I; + T4S = T4M + T4N; + Ip[WS(rs, 8)] = FNMS(T4R, T4S, T4P * T4Q); + Im[WS(rs, 8)] = FMA(T4P, T4S, T4R * T4Q); + } + { + E T4F, T4G, T4K, T4O; + T4F = T4s + T4l; + T4G = T4A - T4D; + Ip[WS(rs, 4)] = FNMS(T1T, T4G, T1R * T4F); + Im[WS(rs, 4)] = FMA(T1R, T4G, T1T * T4F); + T4K = T4I + T4J; + T4O = T4M - T4N; + Ip[WS(rs, 6)] = FNMS(T4L, T4O, T4H * T4K); + Im[WS(rs, 6)] = FMA(T4H, T4O, T4L * T4K); + } + } + { + E T1p, T1w, T22, T1X, T1J, T23, TU, T1W; + T1p = FNMS(KP951056516, T1o, KP587785252 * T19); + T1w = FNMS(KP951056516, T1v, KP587785252 * T1u); + T22 = FMA(KP951056516, T1u, KP587785252 * T1v); + T1X = FMA(KP951056516, T19, KP587785252 * T1o); + { + E T1H, T1I, TS, TT; + T1H = FNMS(KP250000000, T1G, T1D); + T1I = KP559016994 * (T1E - T1F); + T1J = T1H - T1I; + T23 = T1I + T1H; + TS = FNMS(KP250000000, TR, TK); + TT = KP559016994 * (TN - TQ); + TU = TS - TT; + T1W = TT + TS; + } + { + E T1q, T1K, T2e, T2g; + T1q = TU - T1p; + T1K = T1w + T1J; + Rp[WS(rs, 1)] = FNMS(T1t, T1K, TJ * T1q); + Rm[WS(rs, 1)] = FMA(T1t, T1q, TJ * T1K); + T2e = T1W + T1X; + T2g = T23 - T22; + Rp[WS(rs, 7)] = FNMS(T2f, T2g, T2d * T2e); + Rm[WS(rs, 7)] = FMA(T2f, T2e, T2d * T2g); + } + { + E T1O, T1Q, T1Y, T24; + T1O = TU + T1p; + T1Q = T1J - T1w; + Rp[WS(rs, 9)] = FNMS(T1P, T1Q, T1N * T1O); + Rm[WS(rs, 9)] = FMA(T1P, T1O, T1N * T1Q); + T1Y = T1W - T1X; + T24 = T22 + T23; + Rp[WS(rs, 3)] = FNMS(T21, T24, T1V * T1Y); + Rm[WS(rs, 3)] = FMA(T21, T1Y, T1V * T24); + } + } + { + E T3f, T3N, T43, T3Z, T3K, T42, T3A, T3Y; + T3f = FNMS(KP951056516, T3e, KP587785252 * T37); + T3N = FNMS(KP951056516, T3M, KP587785252 * T3L); + T43 = FMA(KP951056516, T3L, KP587785252 * T3M); + T3Z = FMA(KP951056516, T37, KP587785252 * T3e); + { + E T3I, T3J, T3y, T3z; + T3I = FNMS(KP250000000, T3H, T3E); + T3J = KP559016994 * (T3F - T3G); + T3K = T3I - T3J; + T42 = T3J + T3I; + T3y = FNMS(KP250000000, T3x, T3i); + T3z = KP559016994 * (T3p - T3w); + T3A = T3y - T3z; + T3Y = T3z + T3y; + } + { + E T3B, T3O, T45, T46; + T3B = T3f + T3A; + T3O = T3K - T3N; + Ip[WS(rs, 1)] = FNMS(TH, T3O, TE * T3B); + Im[WS(rs, 1)] = FMA(TE, T3O, TH * T3B); + T45 = T3Z + T3Y; + T46 = T42 - T43; + Ip[WS(rs, 9)] = FNMS(T1M, T46, T1L * T45); + Im[WS(rs, 9)] = FMA(T1L, T46, T1M * T45); + } + { + E T3S, T3W, T40, T44; + T3S = T3A - T3f; + T3W = T3K + T3N; + Ip[WS(rs, 3)] = FNMS(T3V, T3W, T3R * T3S); + Im[WS(rs, 3)] = FMA(T3R, T3W, T3V * T3S); + T40 = T3Y - T3Z; + T44 = T42 + T43; + Ip[WS(rs, 5)] = FNMS(T41, T44, T3X * T40); + Im[WS(rs, 5)] = FMA(T3X, T44, T41 * T40); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cb2_20", twinstr, &GENUS, {204, 92, 72, 0} }; + +void X(codelet_hc2cb2_20) (planner *p) { + X(khc2c_register) (p, hc2cb2_20, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_32.c new file mode 100644 index 000000000..2fc32d6bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_32.c @@ -0,0 +1,1882 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:55 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 32 -dif -name hc2cb2_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 488 FP additions, 350 FP multiplications, + * (or, 236 additions, 98 multiplications, 252 fused multiply/add), + * 164 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(128, rs)) { + E T11, T14, T12, T37, T17, T1b, T39, T3a, T3v, T3d, T3x, T15, T16, T5X, T4p; + E T3G, T78, T7e, T8S, T9s, T8P, T8V, T98, T9m, T7I, T7C, T3y, T4b, T3C, T4g; + E T5u, T6b, T5I, T6e, T1a, T1c, T2O, T4r, T4s, T4W, T3J, T3K, T3Y, T5Z, T60; + E T66, T3i, T3q, T3l, T3e, T7S, T8K, T8m, T8E, T5k, T5U, T5R, T5e, T6i, T7s; + E T6O, T7o; + { + E T77, T9l, T7B, T7d, T9r, T7H, T3b, T5d, T19, T3I; + { + E T13, T3F, T38, T3c; + T11 = W[2]; + T14 = W[3]; + T12 = W[4]; + T37 = W[0]; + T13 = T11 * T12; + T3F = T37 * T12; + T38 = T37 * T11; + T3c = T37 * T14; + T17 = W[6]; + T77 = T37 * T17; + T9l = T12 * T17; + T7B = T11 * T17; + T1b = W[7]; + T7d = T37 * T1b; + T9r = T12 * T1b; + T7H = T11 * T1b; + T39 = W[1]; + T3a = FNMS(T39, T14, T38); + T3v = FMA(T39, T14, T38); + T3b = T3a * T12; + T5d = T3v * T12; + T3d = FMA(T39, T11, T3c); + T3x = FNMS(T39, T11, T3c); + T15 = W[5]; + T19 = T11 * T15; + T3I = T37 * T15; + T16 = FMA(T14, T15, T13); + T5X = FNMS(T14, T15, T13); + T4p = FMA(T39, T15, T3F); + T3G = FNMS(T39, T15, T3F); + } + T78 = FNMS(T39, T1b, T77); + T7e = FMA(T39, T17, T7d); + T8S = FMA(T14, T17, T7H); + T9s = FNMS(T15, T17, T9r); + T8P = FNMS(T14, T1b, T7B); + T8V = FMA(T39, T1b, T77); + T98 = FNMS(T39, T17, T7d); + T9m = FMA(T15, T1b, T9l); + T7I = FNMS(T14, T17, T7H); + T7C = FMA(T14, T1b, T7B); + { + E T3w, T3B, T5Y, T65; + T3w = T3v * T17; + T3y = FNMS(T3x, T1b, T3w); + T4b = FMA(T3x, T1b, T3w); + T3B = T3v * T1b; + T3C = FMA(T3x, T17, T3B); + T4g = FNMS(T3x, T17, T3B); + { + E T5t, T5H, T18, T2N; + T5t = T3a * T17; + T5u = FMA(T3d, T1b, T5t); + T6b = FNMS(T3d, T1b, T5t); + T5H = T3a * T1b; + T5I = FNMS(T3d, T17, T5H); + T6e = FMA(T3d, T17, T5H); + T18 = T16 * T17; + T2N = T16 * T1b; + T1a = FNMS(T14, T12, T19); + T1c = FMA(T1a, T1b, T18); + T2O = FNMS(T1a, T17, T2N); + } + { + E T4q, T4V, T3H, T3X; + T4q = T4p * T17; + T4V = T4p * T1b; + T4r = FNMS(T39, T12, T3I); + T4s = FMA(T4r, T1b, T4q); + T4W = FNMS(T4r, T17, T4V); + T3H = T3G * T17; + T3X = T3G * T1b; + T3J = FMA(T39, T12, T3I); + T3K = FMA(T3J, T1b, T3H); + T3Y = FNMS(T3J, T17, T3X); + } + T5Y = T5X * T17; + T65 = T5X * T1b; + T5Z = FMA(T14, T12, T19); + T60 = FMA(T5Z, T1b, T5Y); + T66 = FNMS(T5Z, T17, T65); + { + E T8D, T8J, T7R, T8l, T3h; + T3h = T3a * T15; + T3i = FNMS(T3d, T12, T3h); + T3q = FMA(T3d, T12, T3h); + T3l = FNMS(T3d, T15, T3b); + T8D = T3l * T17; + T8J = T3l * T1b; + T3e = FMA(T3d, T15, T3b); + T7R = T3e * T17; + T8l = T3e * T1b; + T7S = FMA(T3i, T1b, T7R); + T8K = FNMS(T3q, T17, T8J); + T8m = FNMS(T3i, T17, T8l); + T8E = FMA(T3q, T1b, T8D); + } + { + E T6h, T6N, T7n, T7r, T5j; + T5j = T3v * T15; + T5k = FMA(T3x, T12, T5j); + T5U = FNMS(T3x, T12, T5j); + T5R = FMA(T3x, T15, T5d); + T6h = T5R * T17; + T6N = T5R * T1b; + T5e = FNMS(T3x, T15, T5d); + T7n = T5e * T17; + T7r = T5e * T1b; + T6i = FMA(T5U, T1b, T6h); + T7s = FNMS(T5k, T17, T7r); + T6O = FNMS(T5U, T17, T6N); + T7o = FMA(T5k, T1b, T7n); + } + } + } + { + E Tf, T6j, T7V, T8W, T8p, T99, T1t, T3L, T2X, T3Z, T4Z, T5J, T6W, T7t, T4v; + E T5v, TZ, T7x, T28, T3S, T91, T9d, T2h, T3R, T4Q, T5B, T8a, T8v, T4N, T5C; + E T6J, T6Z, TK, T7w, T2z, T3P, T94, T9c, T2I, T3O, T4J, T5y, T8h, T8u, T4G; + E T5z, T6A, T6Y, Tu, T6P, T82, T9a, T8s, T8X, T1Q, T40, T30, T3M, T52, T5w; + E T6q, T7u, T4C, T5K; + { + E T3, T1d, T2S, T6Q, T6, T2P, T1g, T6R, Td, T6U, T1r, T2V, Ta, T6T, T1m; + E T2U; + { + E T1, T2, T1e, T1f; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T1d = T1 - T2; + { + E T2Q, T2R, T4, T5; + T2Q = Ip[0]; + T2R = Im[WS(rs, 15)]; + T2S = T2Q + T2R; + T6Q = T2Q - T2R; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T2P = T4 - T5; + } + T1e = Ip[WS(rs, 8)]; + T1f = Im[WS(rs, 7)]; + T1g = T1e + T1f; + T6R = T1e - T1f; + { + E Tb, Tc, T1n, T1o, T1p, T1q; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + T1n = Tb - Tc; + T1o = Ip[WS(rs, 12)]; + T1p = Im[WS(rs, 3)]; + T1q = T1o + T1p; + Td = Tb + Tc; + T6U = T1o - T1p; + T1r = T1n - T1q; + T2V = T1n + T1q; + } + { + E T8, T9, T1i, T1j, T1k, T1l; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + T1i = T8 - T9; + T1j = Ip[WS(rs, 4)]; + T1k = Im[WS(rs, 11)]; + T1l = T1j + T1k; + Ta = T8 + T9; + T6T = T1j - T1k; + T1m = T1i - T1l; + T2U = T1i + T1l; + } + } + { + E T7, Te, T7T, T7U; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T6j = T7 - Te; + T7T = T3 - T6; + T7U = T6U - T6T; + T7V = T7T - T7U; + T8W = T7T + T7U; + } + { + E T8n, T8o, T1h, T1s; + T8n = T6Q - T6R; + T8o = Ta - Td; + T8p = T8n - T8o; + T99 = T8o + T8n; + T1h = T1d - T1g; + T1s = T1m + T1r; + T1t = FNMS(KP707106781, T1s, T1h); + T3L = FMA(KP707106781, T1s, T1h); + } + { + E T2T, T2W, T4X, T4Y; + T2T = T2P + T2S; + T2W = T2U - T2V; + T2X = FNMS(KP707106781, T2W, T2T); + T3Z = FMA(KP707106781, T2W, T2T); + T4X = T2S - T2P; + T4Y = T1m - T1r; + T4Z = FMA(KP707106781, T4Y, T4X); + T5J = FNMS(KP707106781, T4Y, T4X); + } + { + E T6S, T6V, T4t, T4u; + T6S = T6Q + T6R; + T6V = T6T + T6U; + T6W = T6S - T6V; + T7t = T6S + T6V; + T4t = T1d + T1g; + T4u = T2U + T2V; + T4v = FNMS(KP707106781, T4u, T4t); + T5v = FMA(KP707106781, T4u, T4t); + } + } + { + E TR, T87, T1S, T29, T1V, T84, T2c, T6E, TY, T85, T88, T21, T26, T2f, T6H; + E T2e, T86, T89; + { + E TL, TM, TN, TO, TP, TQ; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + TR = TN + TQ; + T87 = TN - TQ; + T1S = TO - TP; + T29 = TL - TM; + } + { + E T1T, T1U, T6C, T2a, T2b, T6D; + T1T = Ip[WS(rs, 15)]; + T1U = Im[0]; + T6C = T1T - T1U; + T2a = Ip[WS(rs, 7)]; + T2b = Im[WS(rs, 8)]; + T6D = T2a - T2b; + T1V = T1T + T1U; + T84 = T6C - T6D; + T2c = T2a + T2b; + T6E = T6C + T6D; + } + { + E TU, T1X, T20, T6F, TX, T22, T25, T6G; + { + E TS, TT, T1Y, T1Z; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + TU = TS + TT; + T1X = TS - TT; + T1Y = Ip[WS(rs, 3)]; + T1Z = Im[WS(rs, 12)]; + T20 = T1Y + T1Z; + T6F = T1Y - T1Z; + } + { + E TV, TW, T23, T24; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + TX = TV + TW; + T22 = TV - TW; + T23 = Ip[WS(rs, 11)]; + T24 = Im[WS(rs, 4)]; + T25 = T23 + T24; + T6G = T23 - T24; + } + TY = TU + TX; + T85 = TU - TX; + T88 = T6G - T6F; + T21 = T1X + T20; + T26 = T22 + T25; + T2f = T22 - T25; + T6H = T6F + T6G; + T2e = T1X - T20; + } + TZ = TR + TY; + T7x = T6E + T6H; + { + E T1W, T27, T8Z, T90; + T1W = T1S - T1V; + T27 = T21 - T26; + T28 = FNMS(KP707106781, T27, T1W); + T3S = FMA(KP707106781, T27, T1W); + T8Z = T85 + T84; + T90 = T87 + T88; + T91 = FNMS(KP414213562, T90, T8Z); + T9d = FMA(KP414213562, T8Z, T90); + } + { + E T2d, T2g, T4O, T4P; + T2d = T29 - T2c; + T2g = T2e + T2f; + T2h = FNMS(KP707106781, T2g, T2d); + T3R = FMA(KP707106781, T2g, T2d); + T4O = T1S + T1V; + T4P = T2e - T2f; + T4Q = FNMS(KP707106781, T4P, T4O); + T5B = FMA(KP707106781, T4P, T4O); + } + T86 = T84 - T85; + T89 = T87 - T88; + T8a = FMA(KP414213562, T89, T86); + T8v = FNMS(KP414213562, T86, T89); + { + E T4L, T4M, T6B, T6I; + T4L = T29 + T2c; + T4M = T21 + T26; + T4N = FNMS(KP707106781, T4M, T4L); + T5C = FMA(KP707106781, T4M, T4L); + T6B = TR - TY; + T6I = T6E - T6H; + T6J = T6B + T6I; + T6Z = T6I - T6B; + } + } + { + E TC, T8e, T2j, T2A, T2m, T8b, T2D, T6v, TJ, T8c, T8f, T2s, T2x, T2G, T6y; + E T2F, T8d, T8g; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + TC = Ty + TB; + T8e = Ty - TB; + T2j = Tz - TA; + T2A = Tw - Tx; + } + { + E T2k, T2l, T6t, T2B, T2C, T6u; + T2k = Ip[WS(rs, 1)]; + T2l = Im[WS(rs, 14)]; + T6t = T2k - T2l; + T2B = Ip[WS(rs, 9)]; + T2C = Im[WS(rs, 6)]; + T6u = T2B - T2C; + T2m = T2k + T2l; + T8b = T6t - T6u; + T2D = T2B + T2C; + T6v = T6t + T6u; + } + { + E TF, T2o, T2r, T6w, TI, T2t, T2w, T6x; + { + E TD, TE, T2p, T2q; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + TF = TD + TE; + T2o = TD - TE; + T2p = Ip[WS(rs, 5)]; + T2q = Im[WS(rs, 10)]; + T2r = T2p + T2q; + T6w = T2p - T2q; + } + { + E TG, TH, T2u, T2v; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + TI = TG + TH; + T2t = TG - TH; + T2u = Ip[WS(rs, 13)]; + T2v = Im[WS(rs, 2)]; + T2w = T2u + T2v; + T6x = T2u - T2v; + } + TJ = TF + TI; + T8c = TF - TI; + T8f = T6x - T6w; + T2s = T2o + T2r; + T2x = T2t + T2w; + T2G = T2t - T2w; + T6y = T6w + T6x; + T2F = T2o - T2r; + } + TK = TC + TJ; + T7w = T6v + T6y; + { + E T2n, T2y, T92, T93; + T2n = T2j + T2m; + T2y = T2s - T2x; + T2z = FNMS(KP707106781, T2y, T2n); + T3P = FMA(KP707106781, T2y, T2n); + T92 = T8c + T8b; + T93 = T8e + T8f; + T94 = FMA(KP414213562, T93, T92); + T9c = FNMS(KP414213562, T92, T93); + } + { + E T2E, T2H, T4H, T4I; + T2E = T2A - T2D; + T2H = T2F + T2G; + T2I = FNMS(KP707106781, T2H, T2E); + T3O = FMA(KP707106781, T2H, T2E); + T4H = T2m - T2j; + T4I = T2G - T2F; + T4J = FNMS(KP707106781, T4I, T4H); + T5y = FMA(KP707106781, T4I, T4H); + } + T8d = T8b - T8c; + T8g = T8e - T8f; + T8h = FNMS(KP414213562, T8g, T8d); + T8u = FMA(KP414213562, T8d, T8g); + { + E T4E, T4F, T6s, T6z; + T4E = T2A + T2D; + T4F = T2s + T2x; + T4G = FNMS(KP707106781, T4F, T4E); + T5z = FMA(KP707106781, T4F, T4E); + T6s = TC - TJ; + T6z = T6v - T6y; + T6A = T6s - T6z; + T6Y = T6s + T6z; + } + } + { + E Ti, T6n, Tl, T6o, T1J, T1O, T80, T7Z, T4x, T4w, Tp, T6k, Ts, T6l, T1y; + E T1D, T7X, T7W, T4A, T4z; + { + E T1K, T1I, T1F, T1N; + { + E Tg, Th, T1G, T1H; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T1K = Tg - Th; + T1G = Ip[WS(rs, 2)]; + T1H = Im[WS(rs, 13)]; + T1I = T1G + T1H; + T6n = T1G - T1H; + } + { + E Tj, Tk, T1L, T1M; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T1F = Tj - Tk; + T1L = Ip[WS(rs, 10)]; + T1M = Im[WS(rs, 5)]; + T1N = T1L + T1M; + T6o = T1L - T1M; + } + T1J = T1F + T1I; + T1O = T1K - T1N; + T80 = T6n - T6o; + T7Z = Ti - Tl; + T4x = T1K + T1N; + T4w = T1I - T1F; + } + { + E T1z, T1x, T1u, T1C; + { + E Tn, To, T1v, T1w; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T1z = Tn - To; + T1v = Ip[WS(rs, 14)]; + T1w = Im[WS(rs, 1)]; + T1x = T1v + T1w; + T6k = T1v - T1w; + } + { + E Tq, Tr, T1A, T1B; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T1u = Tq - Tr; + T1A = Ip[WS(rs, 6)]; + T1B = Im[WS(rs, 9)]; + T1C = T1A + T1B; + T6l = T1A - T1B; + } + T1y = T1u - T1x; + T1D = T1z - T1C; + T7X = Tp - Ts; + T7W = T6k - T6l; + T4A = T1z + T1C; + T4z = T1u + T1x; + } + { + E Tm, Tt, T7Y, T81; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T6P = Tm - Tt; + T7Y = T7W - T7X; + T81 = T7Z + T80; + T82 = T7Y - T81; + T9a = T81 + T7Y; + } + { + E T8q, T8r, T1E, T1P; + T8q = T7Z - T80; + T8r = T7X + T7W; + T8s = T8q - T8r; + T8X = T8q + T8r; + T1E = FNMS(KP414213562, T1D, T1y); + T1P = FMA(KP414213562, T1O, T1J); + T1Q = T1E - T1P; + T40 = T1P + T1E; + } + { + E T2Y, T2Z, T50, T51; + T2Y = FNMS(KP414213562, T1J, T1O); + T2Z = FMA(KP414213562, T1y, T1D); + T30 = T2Y - T2Z; + T3M = T2Y + T2Z; + T50 = FMA(KP414213562, T4w, T4x); + T51 = FMA(KP414213562, T4z, T4A); + T52 = T50 - T51; + T5w = T50 + T51; + } + { + E T6m, T6p, T4y, T4B; + T6m = T6k + T6l; + T6p = T6n + T6o; + T6q = T6m - T6p; + T7u = T6p + T6m; + T4y = FNMS(KP414213562, T4x, T4w); + T4B = FNMS(KP414213562, T4A, T4z); + T4C = T4y + T4B; + T5K = T4B - T4y; + } + } + { + E Tv, T10, T7p, T7v, T7y, T7z, T7q, T7A; + Tv = Tf + Tu; + T10 = TK + TZ; + T7p = Tv - T10; + T7v = T7t + T7u; + T7y = T7w + T7x; + T7z = T7v - T7y; + Rp[0] = Tv + T10; + Rm[0] = T7v + T7y; + T7q = T7o * T7p; + Rp[WS(rs, 8)] = FNMS(T7s, T7z, T7q); + T7A = T7s * T7p; + Rm[WS(rs, 8)] = FMA(T7o, T7z, T7A); + } + { + E T9p, T9x, T9v, T9z; + { + E T9n, T9o, T9t, T9u; + T9n = FMA(KP707106781, T8X, T8W); + T9o = T9c + T9d; + T9p = FNMS(KP923879532, T9o, T9n); + T9x = FMA(KP923879532, T9o, T9n); + T9t = FMA(KP707106781, T9a, T99); + T9u = T94 + T91; + T9v = FNMS(KP923879532, T9u, T9t); + T9z = FMA(KP923879532, T9u, T9t); + } + { + E T9q, T9w, T9y, T9A; + T9q = T9m * T9p; + Rp[WS(rs, 9)] = FNMS(T9s, T9v, T9q); + T9w = T9m * T9v; + Rm[WS(rs, 9)] = FMA(T9s, T9p, T9w); + T9y = T3v * T9x; + Rp[WS(rs, 1)] = FNMS(T3x, T9z, T9y); + T9A = T3v * T9z; + Rm[WS(rs, 1)] = FMA(T3x, T9x, T9A); + } + } + { + E T8H, T8Q, T8N, T8T; + { + E T8F, T8G, T8L, T8M; + T8F = FNMS(KP707106781, T82, T7V); + T8G = T8u + T8v; + T8H = FNMS(KP923879532, T8G, T8F); + T8Q = FMA(KP923879532, T8G, T8F); + T8L = FNMS(KP707106781, T8s, T8p); + T8M = T8h + T8a; + T8N = FNMS(KP923879532, T8M, T8L); + T8T = FMA(KP923879532, T8M, T8L); + } + { + E T8I, T8O, T8R, T8U; + T8I = T8E * T8H; + Rp[WS(rs, 7)] = FNMS(T8K, T8N, T8I); + T8O = T8E * T8N; + Rm[WS(rs, 7)] = FMA(T8K, T8H, T8O); + T8R = T8P * T8Q; + Rp[WS(rs, 15)] = FNMS(T8S, T8T, T8R); + T8U = T8P * T8T; + Rm[WS(rs, 15)] = FMA(T8S, T8Q, T8U); + } + } + { + E T7b, T7j, T7h, T7l; + { + E T79, T7a, T7f, T7g; + T79 = T6j - T6q; + T7a = T6Z - T6Y; + T7b = FNMS(KP707106781, T7a, T79); + T7j = FMA(KP707106781, T7a, T79); + T7f = T6W - T6P; + T7g = T6A - T6J; + T7h = FNMS(KP707106781, T7g, T7f); + T7l = FMA(KP707106781, T7g, T7f); + } + { + E T7c, T7i, T7k, T7m; + T7c = T78 * T7b; + Rp[WS(rs, 14)] = FNMS(T7e, T7h, T7c); + T7i = T78 * T7h; + Rm[WS(rs, 14)] = FMA(T7e, T7b, T7i); + T7k = T5X * T7j; + Rp[WS(rs, 6)] = FNMS(T5Z, T7l, T7k); + T7m = T5X * T7l; + Rm[WS(rs, 6)] = FMA(T5Z, T7j, T7m); + } + } + { + E T96, T9h, T9f, T9j; + { + E T8Y, T95, T9b, T9e; + T8Y = FNMS(KP707106781, T8X, T8W); + T95 = T91 - T94; + T96 = FNMS(KP923879532, T95, T8Y); + T9h = FMA(KP923879532, T95, T8Y); + T9b = FNMS(KP707106781, T9a, T99); + T9e = T9c - T9d; + T9f = FNMS(KP923879532, T9e, T9b); + T9j = FMA(KP923879532, T9e, T9b); + } + { + E T97, T9g, T9i, T9k; + T97 = T8V * T96; + Rp[WS(rs, 13)] = FNMS(T98, T9f, T97); + T9g = T98 * T96; + Rm[WS(rs, 13)] = FMA(T8V, T9f, T9g); + T9i = T3G * T9h; + Rp[WS(rs, 5)] = FNMS(T3J, T9j, T9i); + T9k = T3J * T9h; + Rm[WS(rs, 5)] = FMA(T3G, T9j, T9k); + } + } + { + E T6L, T73, T71, T75; + { + E T6r, T6K, T6X, T70; + T6r = T6j + T6q; + T6K = T6A + T6J; + T6L = FNMS(KP707106781, T6K, T6r); + T73 = FMA(KP707106781, T6K, T6r); + T6X = T6P + T6W; + T70 = T6Y + T6Z; + T71 = FNMS(KP707106781, T70, T6X); + T75 = FMA(KP707106781, T70, T6X); + } + { + E T6M, T72, T74, T76; + T6M = T6i * T6L; + Rp[WS(rs, 10)] = FNMS(T6O, T71, T6M); + T72 = T6O * T6L; + Rm[WS(rs, 10)] = FMA(T6i, T71, T72); + T74 = T3a * T73; + Rp[WS(rs, 2)] = FNMS(T3d, T75, T74); + T76 = T3d * T73; + Rm[WS(rs, 2)] = FMA(T3a, T75, T76); + } + } + { + E T7F, T7N, T7L, T7P; + { + E T7D, T7E, T7J, T7K; + T7D = Tf - Tu; + T7E = T7x - T7w; + T7F = T7D - T7E; + T7N = T7D + T7E; + T7J = T7t - T7u; + T7K = TK - TZ; + T7L = T7J - T7K; + T7P = T7K + T7J; + } + { + E T7G, T7M, T7O, T7Q; + T7G = T7C * T7F; + Rp[WS(rs, 12)] = FNMS(T7I, T7L, T7G); + T7M = T7C * T7L; + Rm[WS(rs, 12)] = FMA(T7I, T7F, T7M); + T7O = T4p * T7N; + Rp[WS(rs, 4)] = FNMS(T4r, T7P, T7O); + T7Q = T4p * T7P; + Rm[WS(rs, 4)] = FMA(T4r, T7N, T7Q); + } + } + { + E T8j, T8z, T8x, T8B; + { + E T83, T8i, T8t, T8w; + T83 = FMA(KP707106781, T82, T7V); + T8i = T8a - T8h; + T8j = FNMS(KP923879532, T8i, T83); + T8z = FMA(KP923879532, T8i, T83); + T8t = FMA(KP707106781, T8s, T8p); + T8w = T8u - T8v; + T8x = FNMS(KP923879532, T8w, T8t); + T8B = FMA(KP923879532, T8w, T8t); + } + { + E T8k, T8y, T8A, T8C; + T8k = T7S * T8j; + Rp[WS(rs, 11)] = FNMS(T8m, T8x, T8k); + T8y = T8m * T8j; + Rm[WS(rs, 11)] = FMA(T7S, T8x, T8y); + T8A = T16 * T8z; + Rp[WS(rs, 3)] = FNMS(T1a, T8B, T8A); + T8C = T1a * T8z; + Rm[WS(rs, 3)] = FMA(T16, T8B, T8C); + } + } + { + E T3r, T2L, T3s, T3f, T35, T3z, T3j, T3o; + T3r = FNMS(KP923879532, T30, T2X); + { + E T1R, T2i, T2J, T2K; + T1R = FMA(KP923879532, T1Q, T1t); + T2i = FMA(KP668178637, T2h, T28); + T2J = FNMS(KP668178637, T2I, T2z); + T2K = T2i - T2J; + T2L = FNMS(KP831469612, T2K, T1R); + T3s = T2J + T2i; + T3f = FMA(KP831469612, T2K, T1R); + } + { + E T31, T3m, T34, T3n, T32, T33; + T31 = FMA(KP923879532, T30, T2X); + T3m = FNMS(KP923879532, T1Q, T1t); + T32 = FMA(KP668178637, T2z, T2I); + T33 = FNMS(KP668178637, T28, T2h); + T34 = T32 - T33; + T3n = T32 + T33; + T35 = FNMS(KP831469612, T34, T31); + T3z = FMA(KP831469612, T3n, T3m); + T3j = FMA(KP831469612, T34, T31); + T3o = FNMS(KP831469612, T3n, T3m); + } + { + E T2M, T36, T3g, T3k; + T2M = T1c * T2L; + Ip[WS(rs, 10)] = FNMS(T2O, T35, T2M); + T36 = T1c * T35; + Im[WS(rs, 10)] = FMA(T2O, T2L, T36); + T3g = T3e * T3f; + Ip[WS(rs, 2)] = FNMS(T3i, T3j, T3g); + T3k = T3e * T3j; + Im[WS(rs, 2)] = FMA(T3i, T3f, T3k); + { + E T3A, T3E, T3D, T3p, T3u, T3t; + T3A = T3y * T3z; + T3E = T3C * T3z; + T3D = FMA(KP831469612, T3s, T3r); + Ip[WS(rs, 14)] = FNMS(T3C, T3D, T3A); + Im[WS(rs, 14)] = FMA(T3y, T3D, T3E); + T3p = T3l * T3o; + T3u = T3q * T3o; + T3t = FNMS(KP831469612, T3s, T3r); + Ip[WS(rs, 6)] = FNMS(T3q, T3t, T3p); + Im[WS(rs, 6)] = FMA(T3l, T3t, T3u); + } + } + } + { + E T53, T56, T5p, T5h, T4T, T5r, T59, T5n; + T53 = FMA(KP923879532, T52, T4Z); + { + E T5f, T54, T55, T5g; + T5f = FMA(KP923879532, T4C, T4v); + T54 = FMA(KP668178637, T4G, T4J); + T55 = FMA(KP668178637, T4N, T4Q); + T5g = T54 + T55; + T56 = T54 - T55; + T5p = FMA(KP831469612, T5g, T5f); + T5h = FNMS(KP831469612, T5g, T5f); + } + { + E T4D, T5l, T4S, T5m, T4K, T4R; + T4D = FNMS(KP923879532, T4C, T4v); + T5l = FNMS(KP923879532, T52, T4Z); + T4K = FNMS(KP668178637, T4J, T4G); + T4R = FNMS(KP668178637, T4Q, T4N); + T4S = T4K + T4R; + T5m = T4K - T4R; + T4T = FNMS(KP831469612, T4S, T4D); + T5r = FNMS(KP831469612, T5m, T5l); + T59 = FMA(KP831469612, T4S, T4D); + T5n = FMA(KP831469612, T5m, T5l); + } + { + E T5i, T5o, T5q, T5s; + T5i = T5e * T5h; + Ip[WS(rs, 5)] = FNMS(T5k, T5n, T5i); + T5o = T5e * T5n; + Im[WS(rs, 5)] = FMA(T5k, T5h, T5o); + T5q = T17 * T5p; + Ip[WS(rs, 13)] = FNMS(T1b, T5r, T5q); + T5s = T17 * T5r; + Im[WS(rs, 13)] = FMA(T1b, T5p, T5s); + { + E T5a, T5c, T5b, T4U, T58, T57; + T5a = T11 * T59; + T5c = T14 * T59; + T5b = FMA(KP831469612, T56, T53); + Ip[WS(rs, 1)] = FNMS(T14, T5b, T5a); + Im[WS(rs, 1)] = FMA(T11, T5b, T5c); + T4U = T4s * T4T; + T58 = T4W * T4T; + T57 = FNMS(KP831469612, T56, T53); + Ip[WS(rs, 9)] = FNMS(T4W, T57, T4U); + Im[WS(rs, 9)] = FMA(T4s, T57, T58); + } + } + } + { + E T41, T44, T4l, T4e, T3V, T4n, T47, T4j; + T41 = FMA(KP923879532, T40, T3Z); + { + E T4c, T42, T43, T4d; + T4c = FNMS(KP923879532, T3M, T3L); + T42 = FMA(KP198912367, T3O, T3P); + T43 = FNMS(KP198912367, T3R, T3S); + T4d = T43 - T42; + T44 = T42 + T43; + T4l = FMA(KP980785280, T4d, T4c); + T4e = FNMS(KP980785280, T4d, T4c); + } + { + E T3N, T4h, T3U, T4i, T3Q, T3T; + T3N = FMA(KP923879532, T3M, T3L); + T4h = FNMS(KP923879532, T40, T3Z); + T3Q = FNMS(KP198912367, T3P, T3O); + T3T = FMA(KP198912367, T3S, T3R); + T3U = T3Q + T3T; + T4i = T3Q - T3T; + T3V = FNMS(KP980785280, T3U, T3N); + T4n = FMA(KP980785280, T4i, T4h); + T47 = FMA(KP980785280, T3U, T3N); + T4j = FNMS(KP980785280, T4i, T4h); + } + { + E T4f, T4k, T4m, T4o; + T4f = T4b * T4e; + Ip[WS(rs, 12)] = FNMS(T4g, T4j, T4f); + T4k = T4b * T4j; + Im[WS(rs, 12)] = FMA(T4g, T4e, T4k); + T4m = T12 * T4l; + Ip[WS(rs, 4)] = FNMS(T15, T4n, T4m); + T4o = T12 * T4n; + Im[WS(rs, 4)] = FMA(T15, T4l, T4o); + { + E T48, T4a, T49, T3W, T46, T45; + T48 = T37 * T47; + T4a = T39 * T47; + T49 = FMA(KP980785280, T44, T41); + Ip[0] = FNMS(T39, T49, T48); + Im[0] = FMA(T37, T49, T4a); + T3W = T3K * T3V; + T46 = T3Y * T3V; + T45 = FNMS(KP980785280, T44, T41); + Ip[WS(rs, 8)] = FNMS(T3Y, T45, T3W); + Im[WS(rs, 8)] = FMA(T3K, T45, T46); + } + } + } + { + E T5L, T5O, T6c, T63, T5F, T6f, T5S, T69; + T5L = FMA(KP923879532, T5K, T5J); + { + E T61, T5M, T5N, T62; + T61 = FMA(KP923879532, T5w, T5v); + T5M = FMA(KP198912367, T5y, T5z); + T5N = FMA(KP198912367, T5B, T5C); + T62 = T5M + T5N; + T5O = T5M - T5N; + T6c = FMA(KP980785280, T62, T61); + T63 = FNMS(KP980785280, T62, T61); + } + { + E T5x, T67, T5E, T68, T5A, T5D; + T5x = FNMS(KP923879532, T5w, T5v); + T67 = FNMS(KP923879532, T5K, T5J); + T5A = FNMS(KP198912367, T5z, T5y); + T5D = FNMS(KP198912367, T5C, T5B); + T5E = T5A + T5D; + T68 = T5D - T5A; + T5F = FMA(KP980785280, T5E, T5x); + T6f = FNMS(KP980785280, T68, T67); + T5S = FNMS(KP980785280, T5E, T5x); + T69 = FMA(KP980785280, T68, T67); + } + { + E T64, T6a, T6d, T6g; + T64 = T60 * T63; + Ip[WS(rs, 7)] = FNMS(T66, T69, T64); + T6a = T60 * T69; + Im[WS(rs, 7)] = FMA(T66, T63, T6a); + T6d = T6b * T6c; + Ip[WS(rs, 15)] = FNMS(T6e, T6f, T6d); + T6g = T6b * T6f; + Im[WS(rs, 15)] = FMA(T6e, T6c, T6g); + { + E T5T, T5W, T5V, T5G, T5Q, T5P; + T5T = T5R * T5S; + T5W = T5U * T5S; + T5V = FMA(KP980785280, T5O, T5L); + Ip[WS(rs, 3)] = FNMS(T5U, T5V, T5T); + Im[WS(rs, 3)] = FMA(T5R, T5V, T5W); + T5G = T5u * T5F; + T5Q = T5I * T5F; + T5P = FNMS(KP980785280, T5O, T5L); + Ip[WS(rs, 11)] = FNMS(T5I, T5P, T5G); + Im[WS(rs, 11)] = FMA(T5u, T5P, T5Q); + } + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cb2_32", twinstr, &GENUS, {236, 98, 252, 0} }; + +void X(codelet_hc2cb2_32) (planner *p) { + X(khc2c_register) (p, hc2cb2_32, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 32 -dif -name hc2cb2_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 488 FP additions, 280 FP multiplications, + * (or, 376 additions, 168 multiplications, 112 fused multiply/add), + * 160 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(128, rs)) { + E T11, T14, T12, T15, T17, T2z, T2B, T1c, T18, T1d, T1g, T1k, T2F, T2L, T3t; + E T4H, T3h, T3V, T3b, T4v, T4T, T4X, T6t, T71, T6z, T75, T81, T8x, T8f, T8z; + E T2R, T2V, T8p, T8t, T4r, T4t, T53, T69, T3n, T3r, T7P, T7T, T4P, T4R, T6F; + E T6R, T1f, T2X, T1j, T2Y, T1l, T31, T2d, T2Z, T49, T4h, T4c, T4i, T4d, T4n; + E T4f, T4j; + { + E T2P, T3q, T2U, T3l, T2Q, T3p, T2T, T3m, T2D, T3g, T2K, T39, T2E, T3f, T2J; + E T3a; + { + E T13, T1b, T16, T1a; + T11 = W[0]; + T14 = W[1]; + T12 = W[2]; + T15 = W[3]; + T13 = T11 * T12; + T1b = T14 * T12; + T16 = T14 * T15; + T1a = T11 * T15; + T17 = T13 + T16; + T2z = T13 - T16; + T2B = T1a + T1b; + T1c = T1a - T1b; + T18 = W[4]; + T2P = T12 * T18; + T3q = T14 * T18; + T2U = T15 * T18; + T3l = T11 * T18; + T1d = W[5]; + T2Q = T15 * T1d; + T3p = T11 * T1d; + T2T = T12 * T1d; + T3m = T14 * T1d; + T1g = W[6]; + T2D = T11 * T1g; + T3g = T15 * T1g; + T2K = T14 * T1g; + T39 = T12 * T1g; + T1k = W[7]; + T2E = T14 * T1k; + T3f = T12 * T1k; + T2J = T11 * T1k; + T3a = T15 * T1k; + } + T2F = T2D - T2E; + T2L = T2J + T2K; + T3t = T39 - T3a; + T4H = T2J - T2K; + T3h = T3f - T3g; + T3V = T3f + T3g; + T3b = T39 + T3a; + T4v = T2D + T2E; + T4T = FMA(T18, T1g, T1d * T1k); + T4X = FNMS(T1d, T1g, T18 * T1k); + { + E T6r, T6s, T6x, T6y; + T6r = T17 * T1g; + T6s = T1c * T1k; + T6t = T6r - T6s; + T71 = T6r + T6s; + T6x = T17 * T1k; + T6y = T1c * T1g; + T6z = T6x + T6y; + T75 = T6x - T6y; + } + { + E T7Z, T80, T8d, T8e; + T7Z = T2z * T1g; + T80 = T2B * T1k; + T81 = T7Z + T80; + T8x = T7Z - T80; + T8d = T2z * T1k; + T8e = T2B * T1g; + T8f = T8d - T8e; + T8z = T8d + T8e; + T2R = T2P - T2Q; + T2V = T2T + T2U; + T8p = FMA(T2R, T1g, T2V * T1k); + T8t = FNMS(T2V, T1g, T2R * T1k); + } + T4r = T2P + T2Q; + T4t = T2T - T2U; + T53 = FMA(T4r, T1g, T4t * T1k); + T69 = FNMS(T4t, T1g, T4r * T1k); + T3n = T3l + T3m; + T3r = T3p - T3q; + T7P = FMA(T3n, T1g, T3r * T1k); + T7T = FNMS(T3r, T1g, T3n * T1k); + T4P = T3l - T3m; + T4R = T3p + T3q; + T6F = FMA(T4P, T1g, T4R * T1k); + T6R = FNMS(T4R, T1g, T4P * T1k); + { + E T19, T1e, T1h, T1i; + T19 = T17 * T18; + T1e = T1c * T1d; + T1f = T19 + T1e; + T2X = T19 - T1e; + T1h = T17 * T1d; + T1i = T1c * T18; + T1j = T1h - T1i; + T2Y = T1h + T1i; + } + T1l = FMA(T1f, T1g, T1j * T1k); + T31 = FNMS(T2Y, T1g, T2X * T1k); + T2d = FNMS(T1j, T1g, T1f * T1k); + T2Z = FMA(T2X, T1g, T2Y * T1k); + { + E T47, T48, T4a, T4b; + T47 = T2z * T18; + T48 = T2B * T1d; + T49 = T47 - T48; + T4h = T47 + T48; + T4a = T2z * T1d; + T4b = T2B * T18; + T4c = T4a + T4b; + T4i = T4a - T4b; + } + T4d = FMA(T49, T1g, T4c * T1k); + T4n = FNMS(T4i, T1g, T4h * T1k); + T4f = FNMS(T4c, T1g, T49 * T1k); + T4j = FMA(T4h, T1g, T4i * T1k); + } + { + E T56, T7b, T7C, T6c, Tf, T1m, T6f, T7c, T3Y, T4I, T2t, T32, T5d, T7D, T3w; + E T4w, Tu, T2e, T7g, T7F, T7j, T7G, T1B, T33, T3z, T40, T5l, T6i, T5s, T6h; + E T3C, T3Z, TK, T1D, T7v, T86, T7y, T85, T1S, T35, T3O, T4C, T5F, T6J, T5M; + E T6K, T3R, T4D, TZ, T1U, T7o, T89, T7r, T88, T29, T36, T3H, T4z, T5Y, T6M; + E T65, T6N, T3K, T4A; + { + E T3, T54, T2h, T6b, T6, T6a, T2k, T55, Ta, T57, T2o, T58, Td, T5a, T2r; + E T5b; + { + E T1, T2, T2f, T2g; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T54 = T1 - T2; + T2f = Ip[0]; + T2g = Im[WS(rs, 15)]; + T2h = T2f - T2g; + T6b = T2f + T2g; + } + { + E T4, T5, T2i, T2j; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T6a = T4 - T5; + T2i = Ip[WS(rs, 8)]; + T2j = Im[WS(rs, 7)]; + T2k = T2i - T2j; + T55 = T2i + T2j; + } + { + E T8, T9, T2m, T2n; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + Ta = T8 + T9; + T57 = T8 - T9; + T2m = Ip[WS(rs, 4)]; + T2n = Im[WS(rs, 11)]; + T2o = T2m - T2n; + T58 = T2m + T2n; + } + { + E Tb, Tc, T2p, T2q; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + Td = Tb + Tc; + T5a = Tb - Tc; + T2p = Ip[WS(rs, 12)]; + T2q = Im[WS(rs, 3)]; + T2r = T2p - T2q; + T5b = T2p + T2q; + } + { + E T7, Te, T2l, T2s; + T56 = T54 - T55; + T7b = T54 + T55; + T7C = T6b - T6a; + T6c = T6a + T6b; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T1m = T7 - Te; + { + E T6d, T6e, T3W, T3X; + T6d = T57 + T58; + T6e = T5a + T5b; + T6f = KP707106781 * (T6d - T6e); + T7c = KP707106781 * (T6d + T6e); + T3W = T2h - T2k; + T3X = Ta - Td; + T3Y = T3W - T3X; + T4I = T3X + T3W; + } + T2l = T2h + T2k; + T2s = T2o + T2r; + T2t = T2l - T2s; + T32 = T2l + T2s; + { + E T59, T5c, T3u, T3v; + T59 = T57 - T58; + T5c = T5a - T5b; + T5d = KP707106781 * (T59 + T5c); + T7D = KP707106781 * (T59 - T5c); + T3u = T3 - T6; + T3v = T2r - T2o; + T3w = T3u - T3v; + T4w = T3u + T3v; + } + } + } + { + E Ti, T5p, T1w, T5n, Tl, T5m, T1z, T5q, Tp, T5i, T1p, T5g, Ts, T5f, T1s; + E T5j; + { + E Tg, Th, T1u, T1v; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T5p = Tg - Th; + T1u = Ip[WS(rs, 2)]; + T1v = Im[WS(rs, 13)]; + T1w = T1u - T1v; + T5n = T1u + T1v; + } + { + E Tj, Tk, T1x, T1y; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T5m = Tj - Tk; + T1x = Ip[WS(rs, 10)]; + T1y = Im[WS(rs, 5)]; + T1z = T1x - T1y; + T5q = T1x + T1y; + } + { + E Tn, To, T1n, T1o; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T5i = Tn - To; + T1n = Ip[WS(rs, 14)]; + T1o = Im[WS(rs, 1)]; + T1p = T1n - T1o; + T5g = T1n + T1o; + } + { + E Tq, Tr, T1q, T1r; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T5f = Tq - Tr; + T1q = Ip[WS(rs, 6)]; + T1r = Im[WS(rs, 9)]; + T1s = T1q - T1r; + T5j = T1q + T1r; + } + { + E Tm, Tt, T7e, T7f; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T2e = Tm - Tt; + T7e = T5p + T5q; + T7f = T5n - T5m; + T7g = FNMS(KP923879532, T7f, KP382683432 * T7e); + T7F = FMA(KP382683432, T7f, KP923879532 * T7e); + } + { + E T7h, T7i, T1t, T1A; + T7h = T5i + T5j; + T7i = T5f + T5g; + T7j = FNMS(KP923879532, T7i, KP382683432 * T7h); + T7G = FMA(KP382683432, T7i, KP923879532 * T7h); + T1t = T1p + T1s; + T1A = T1w + T1z; + T1B = T1t - T1A; + T33 = T1A + T1t; + } + { + E T3x, T3y, T5h, T5k; + T3x = T1p - T1s; + T3y = Tp - Ts; + T3z = T3x - T3y; + T40 = T3y + T3x; + T5h = T5f - T5g; + T5k = T5i - T5j; + T5l = FNMS(KP382683432, T5k, KP923879532 * T5h); + T6i = FMA(KP382683432, T5h, KP923879532 * T5k); + } + { + E T5o, T5r, T3A, T3B; + T5o = T5m + T5n; + T5r = T5p - T5q; + T5s = FMA(KP923879532, T5o, KP382683432 * T5r); + T6h = FNMS(KP382683432, T5o, KP923879532 * T5r); + T3A = Ti - Tl; + T3B = T1w - T1z; + T3C = T3A + T3B; + T3Z = T3A - T3B; + } + } + { + E Ty, T5v, T1G, T5H, TB, T5G, T1J, T5w, TI, T5K, T1Q, T5D, TF, T5J, T1N; + E T5A; + { + E Tw, Tx, T1H, T1I; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + T5v = Tw - Tx; + { + E T1E, T1F, Tz, TA; + T1E = Ip[WS(rs, 1)]; + T1F = Im[WS(rs, 14)]; + T1G = T1E - T1F; + T5H = T1E + T1F; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + T5G = Tz - TA; + } + T1H = Ip[WS(rs, 9)]; + T1I = Im[WS(rs, 6)]; + T1J = T1H - T1I; + T5w = T1H + T1I; + { + E TG, TH, T5B, T1O, T1P, T5C; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + T5B = TG - TH; + T1O = Ip[WS(rs, 13)]; + T1P = Im[WS(rs, 2)]; + T5C = T1O + T1P; + TI = TG + TH; + T5K = T5B + T5C; + T1Q = T1O - T1P; + T5D = T5B - T5C; + } + { + E TD, TE, T5y, T1L, T1M, T5z; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + T5y = TD - TE; + T1L = Ip[WS(rs, 5)]; + T1M = Im[WS(rs, 10)]; + T5z = T1L + T1M; + TF = TD + TE; + T5J = T5y + T5z; + T1N = T1L - T1M; + T5A = T5y - T5z; + } + } + { + E TC, TJ, T7t, T7u; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T1D = TC - TJ; + T7t = T5H - T5G; + T7u = KP707106781 * (T5A - T5D); + T7v = T7t + T7u; + T86 = T7t - T7u; + } + { + E T7w, T7x, T1K, T1R; + T7w = T5v + T5w; + T7x = KP707106781 * (T5J + T5K); + T7y = T7w - T7x; + T85 = T7w + T7x; + T1K = T1G + T1J; + T1R = T1N + T1Q; + T1S = T1K - T1R; + T35 = T1K + T1R; + } + { + E T3M, T3N, T5x, T5E; + T3M = T1G - T1J; + T3N = TF - TI; + T3O = T3M - T3N; + T4C = T3N + T3M; + T5x = T5v - T5w; + T5E = KP707106781 * (T5A + T5D); + T5F = T5x - T5E; + T6J = T5x + T5E; + } + { + E T5I, T5L, T3P, T3Q; + T5I = T5G + T5H; + T5L = KP707106781 * (T5J - T5K); + T5M = T5I - T5L; + T6K = T5I + T5L; + T3P = Ty - TB; + T3Q = T1Q - T1N; + T3R = T3P - T3Q; + T4D = T3P + T3Q; + } + } + { + E TN, T5O, T1X, T60, TQ, T5Z, T20, T5P, TX, T63, T27, T5W, TU, T62, T24; + E T5T; + { + E TL, TM, T1Y, T1Z; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + T5O = TL - TM; + { + E T1V, T1W, TO, TP; + T1V = Ip[WS(rs, 15)]; + T1W = Im[0]; + T1X = T1V - T1W; + T60 = T1V + T1W; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + T5Z = TO - TP; + } + T1Y = Ip[WS(rs, 7)]; + T1Z = Im[WS(rs, 8)]; + T20 = T1Y - T1Z; + T5P = T1Y + T1Z; + { + E TV, TW, T5U, T25, T26, T5V; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + T5U = TV - TW; + T25 = Ip[WS(rs, 11)]; + T26 = Im[WS(rs, 4)]; + T5V = T25 + T26; + TX = TV + TW; + T63 = T5U + T5V; + T27 = T25 - T26; + T5W = T5U - T5V; + } + { + E TS, TT, T5R, T22, T23, T5S; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + T5R = TS - TT; + T22 = Ip[WS(rs, 3)]; + T23 = Im[WS(rs, 12)]; + T5S = T22 + T23; + TU = TS + TT; + T62 = T5R + T5S; + T24 = T22 - T23; + T5T = T5R - T5S; + } + } + { + E TR, TY, T7m, T7n; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T1U = TR - TY; + T7m = KP707106781 * (T5T - T5W); + T7n = T5Z + T60; + T7o = T7m - T7n; + T89 = T7n + T7m; + } + { + E T7p, T7q, T21, T28; + T7p = T5O + T5P; + T7q = KP707106781 * (T62 + T63); + T7r = T7p - T7q; + T88 = T7p + T7q; + T21 = T1X + T20; + T28 = T24 + T27; + T29 = T21 - T28; + T36 = T21 + T28; + } + { + E T3F, T3G, T5Q, T5X; + T3F = T1X - T20; + T3G = TU - TX; + T3H = T3F - T3G; + T4z = T3G + T3F; + T5Q = T5O - T5P; + T5X = KP707106781 * (T5T + T5W); + T5Y = T5Q - T5X; + T6M = T5Q + T5X; + } + { + E T61, T64, T3I, T3J; + T61 = T5Z - T60; + T64 = KP707106781 * (T62 - T63); + T65 = T61 - T64; + T6N = T61 + T64; + T3I = TN - TQ; + T3J = T27 - T24; + T3K = T3I - T3J; + T4A = T3I + T3J; + } + } + { + E Tv, T10, T30, T34, T37, T38; + Tv = Tf + Tu; + T10 = TK + TZ; + T30 = Tv - T10; + T34 = T32 + T33; + T37 = T35 + T36; + T38 = T34 - T37; + Rp[0] = Tv + T10; + Rm[0] = T34 + T37; + Rp[WS(rs, 8)] = FNMS(T31, T38, T2Z * T30); + Rm[WS(rs, 8)] = FMA(T31, T30, T2Z * T38); + } + { + E T3e, T3o, T3k, T3s; + { + E T3c, T3d, T3i, T3j; + T3c = Tf - Tu; + T3d = T36 - T35; + T3e = T3c - T3d; + T3o = T3c + T3d; + T3i = T32 - T33; + T3j = TK - TZ; + T3k = T3i - T3j; + T3s = T3j + T3i; + } + Rp[WS(rs, 12)] = FNMS(T3h, T3k, T3b * T3e); + Rm[WS(rs, 12)] = FMA(T3b, T3k, T3h * T3e); + Rp[WS(rs, 4)] = FNMS(T3r, T3s, T3n * T3o); + Rm[WS(rs, 4)] = FMA(T3n, T3s, T3r * T3o); + } + { + E T1C, T2u, T2M, T2G, T2x, T2H, T2b, T2N; + T1C = T1m + T1B; + T2u = T2e + T2t; + T2M = T2t - T2e; + T2G = T1m - T1B; + { + E T2v, T2w, T1T, T2a; + T2v = T1D + T1S; + T2w = T29 - T1U; + T2x = KP707106781 * (T2v + T2w); + T2H = KP707106781 * (T2w - T2v); + T1T = T1D - T1S; + T2a = T1U + T29; + T2b = KP707106781 * (T1T + T2a); + T2N = KP707106781 * (T1T - T2a); + } + { + E T2c, T2y, T2S, T2W; + T2c = T1C - T2b; + T2y = T2u - T2x; + Rp[WS(rs, 10)] = FNMS(T2d, T2y, T1l * T2c); + Rm[WS(rs, 10)] = FMA(T2d, T2c, T1l * T2y); + T2S = T2G + T2H; + T2W = T2M + T2N; + Rp[WS(rs, 6)] = FNMS(T2V, T2W, T2R * T2S); + Rm[WS(rs, 6)] = FMA(T2R, T2W, T2V * T2S); + } + { + E T2A, T2C, T2I, T2O; + T2A = T1C + T2b; + T2C = T2u + T2x; + Rp[WS(rs, 2)] = FNMS(T2B, T2C, T2z * T2A); + Rm[WS(rs, 2)] = FMA(T2B, T2A, T2z * T2C); + T2I = T2G - T2H; + T2O = T2M - T2N; + Rp[WS(rs, 14)] = FNMS(T2L, T2O, T2F * T2I); + Rm[WS(rs, 14)] = FMA(T2F, T2O, T2L * T2I); + } + } + { + E T4y, T4U, T4K, T4Y, T4F, T4Z, T4N, T4V, T4x, T4J; + T4x = KP707106781 * (T3Z + T40); + T4y = T4w - T4x; + T4U = T4w + T4x; + T4J = KP707106781 * (T3C + T3z); + T4K = T4I - T4J; + T4Y = T4I + T4J; + { + E T4B, T4E, T4L, T4M; + T4B = FNMS(KP382683432, T4A, KP923879532 * T4z); + T4E = FMA(KP923879532, T4C, KP382683432 * T4D); + T4F = T4B - T4E; + T4Z = T4E + T4B; + T4L = FNMS(KP382683432, T4C, KP923879532 * T4D); + T4M = FMA(KP382683432, T4z, KP923879532 * T4A); + T4N = T4L - T4M; + T4V = T4L + T4M; + } + { + E T4G, T4O, T51, T52; + T4G = T4y - T4F; + T4O = T4K - T4N; + Rp[WS(rs, 13)] = FNMS(T4H, T4O, T4v * T4G); + Rm[WS(rs, 13)] = FMA(T4H, T4G, T4v * T4O); + T51 = T4U + T4V; + T52 = T4Y + T4Z; + Rp[WS(rs, 1)] = FNMS(T1c, T52, T17 * T51); + Rm[WS(rs, 1)] = FMA(T17, T52, T1c * T51); + } + { + E T4Q, T4S, T4W, T50; + T4Q = T4y + T4F; + T4S = T4K + T4N; + Rp[WS(rs, 5)] = FNMS(T4R, T4S, T4P * T4Q); + Rm[WS(rs, 5)] = FMA(T4R, T4Q, T4P * T4S); + T4W = T4U - T4V; + T50 = T4Y - T4Z; + Rp[WS(rs, 9)] = FNMS(T4X, T50, T4T * T4W); + Rm[WS(rs, 9)] = FMA(T4T, T50, T4X * T4W); + } + } + { + E T3E, T4k, T42, T4o, T3T, T4p, T45, T4l, T3D, T41; + T3D = KP707106781 * (T3z - T3C); + T3E = T3w - T3D; + T4k = T3w + T3D; + T41 = KP707106781 * (T3Z - T40); + T42 = T3Y - T41; + T4o = T3Y + T41; + { + E T3L, T3S, T43, T44; + T3L = FNMS(KP923879532, T3K, KP382683432 * T3H); + T3S = FMA(KP382683432, T3O, KP923879532 * T3R); + T3T = T3L - T3S; + T4p = T3S + T3L; + T43 = FNMS(KP923879532, T3O, KP382683432 * T3R); + T44 = FMA(KP923879532, T3H, KP382683432 * T3K); + T45 = T43 - T44; + T4l = T43 + T44; + } + { + E T3U, T46, T4s, T4u; + T3U = T3E - T3T; + T46 = T42 - T45; + Rp[WS(rs, 15)] = FNMS(T3V, T46, T3t * T3U); + Rm[WS(rs, 15)] = FMA(T3V, T3U, T3t * T46); + T4s = T4k + T4l; + T4u = T4o + T4p; + Rp[WS(rs, 3)] = FNMS(T4t, T4u, T4r * T4s); + Rm[WS(rs, 3)] = FMA(T4r, T4u, T4t * T4s); + } + { + E T4e, T4g, T4m, T4q; + T4e = T3E + T3T; + T4g = T42 + T45; + Rp[WS(rs, 7)] = FNMS(T4f, T4g, T4d * T4e); + Rm[WS(rs, 7)] = FMA(T4f, T4e, T4d * T4g); + T4m = T4k - T4l; + T4q = T4o - T4p; + Rp[WS(rs, 11)] = FNMS(T4n, T4q, T4j * T4m); + Rm[WS(rs, 11)] = FMA(T4j, T4q, T4n * T4m); + } + } + { + E T6I, T72, T6X, T73, T6P, T77, T6U, T76; + { + E T6G, T6H, T6V, T6W; + T6G = T56 + T5d; + T6H = T6h + T6i; + T6I = T6G + T6H; + T72 = T6G - T6H; + T6V = FMA(KP195090322, T6J, KP980785280 * T6K); + T6W = FNMS(KP195090322, T6M, KP980785280 * T6N); + T6X = T6V + T6W; + T73 = T6W - T6V; + } + { + E T6L, T6O, T6S, T6T; + T6L = FNMS(KP195090322, T6K, KP980785280 * T6J); + T6O = FMA(KP980785280, T6M, KP195090322 * T6N); + T6P = T6L + T6O; + T77 = T6L - T6O; + T6S = T6c + T6f; + T6T = T5s + T5l; + T6U = T6S + T6T; + T76 = T6S - T6T; + } + { + E T6Q, T6Y, T79, T7a; + T6Q = T6I - T6P; + T6Y = T6U - T6X; + Ip[WS(rs, 8)] = FNMS(T6R, T6Y, T6F * T6Q); + Im[WS(rs, 8)] = FMA(T6R, T6Q, T6F * T6Y); + T79 = T72 + T73; + T7a = T76 + T77; + Ip[WS(rs, 4)] = FNMS(T1d, T7a, T18 * T79); + Im[WS(rs, 4)] = FMA(T18, T7a, T1d * T79); + } + { + E T6Z, T70, T74, T78; + T6Z = T6I + T6P; + T70 = T6U + T6X; + Ip[0] = FNMS(T14, T70, T11 * T6Z); + Im[0] = FMA(T14, T6Z, T11 * T70); + T74 = T72 - T73; + T78 = T76 - T77; + Ip[WS(rs, 12)] = FNMS(T75, T78, T71 * T74); + Im[WS(rs, 12)] = FMA(T71, T78, T75 * T74); + } + } + { + E T84, T8q, T8l, T8r, T8b, T8v, T8i, T8u; + { + E T82, T83, T8j, T8k; + T82 = T7b + T7c; + T83 = T7F + T7G; + T84 = T82 - T83; + T8q = T82 + T83; + T8j = FMA(KP195090322, T86, KP980785280 * T85); + T8k = FMA(KP195090322, T89, KP980785280 * T88); + T8l = T8j - T8k; + T8r = T8j + T8k; + } + { + E T87, T8a, T8g, T8h; + T87 = FNMS(KP980785280, T86, KP195090322 * T85); + T8a = FNMS(KP980785280, T89, KP195090322 * T88); + T8b = T87 + T8a; + T8v = T87 - T8a; + T8g = T7C - T7D; + T8h = T7g - T7j; + T8i = T8g + T8h; + T8u = T8g - T8h; + } + { + E T8c, T8m, T8y, T8A; + T8c = T84 - T8b; + T8m = T8i - T8l; + Ip[WS(rs, 11)] = FNMS(T8f, T8m, T81 * T8c); + Im[WS(rs, 11)] = FMA(T8f, T8c, T81 * T8m); + T8y = T8q + T8r; + T8A = T8u - T8v; + Ip[WS(rs, 15)] = FNMS(T8z, T8A, T8x * T8y); + Im[WS(rs, 15)] = FMA(T8x, T8A, T8z * T8y); + } + { + E T8n, T8o, T8s, T8w; + T8n = T84 + T8b; + T8o = T8i + T8l; + Ip[WS(rs, 3)] = FNMS(T1j, T8o, T1f * T8n); + Im[WS(rs, 3)] = FMA(T1j, T8n, T1f * T8o); + T8s = T8q - T8r; + T8w = T8u + T8v; + Ip[WS(rs, 7)] = FNMS(T8t, T8w, T8p * T8s); + Im[WS(rs, 7)] = FMA(T8p, T8w, T8t * T8s); + } + } + { + E T5u, T6u, T6n, T6v, T67, T6B, T6k, T6A; + { + E T5e, T5t, T6l, T6m; + T5e = T56 - T5d; + T5t = T5l - T5s; + T5u = T5e + T5t; + T6u = T5e - T5t; + T6l = FMA(KP831469612, T5F, KP555570233 * T5M); + T6m = FNMS(KP831469612, T5Y, KP555570233 * T65); + T6n = T6l + T6m; + T6v = T6m - T6l; + } + { + E T5N, T66, T6g, T6j; + T5N = FNMS(KP831469612, T5M, KP555570233 * T5F); + T66 = FMA(KP555570233, T5Y, KP831469612 * T65); + T67 = T5N + T66; + T6B = T5N - T66; + T6g = T6c - T6f; + T6j = T6h - T6i; + T6k = T6g + T6j; + T6A = T6g - T6j; + } + { + E T68, T6o, T6D, T6E; + T68 = T5u - T67; + T6o = T6k - T6n; + Ip[WS(rs, 10)] = FNMS(T69, T6o, T53 * T68); + Im[WS(rs, 10)] = FMA(T69, T68, T53 * T6o); + T6D = T6u + T6v; + T6E = T6A + T6B; + Ip[WS(rs, 6)] = FNMS(T4c, T6E, T49 * T6D); + Im[WS(rs, 6)] = FMA(T49, T6E, T4c * T6D); + } + { + E T6p, T6q, T6w, T6C; + T6p = T5u + T67; + T6q = T6k + T6n; + Ip[WS(rs, 2)] = FNMS(T4i, T6q, T4h * T6p); + Im[WS(rs, 2)] = FMA(T4i, T6p, T4h * T6q); + T6w = T6u - T6v; + T6C = T6A - T6B; + Ip[WS(rs, 14)] = FNMS(T6z, T6C, T6t * T6w); + Im[WS(rs, 14)] = FMA(T6t, T6C, T6z * T6w); + } + } + { + E T7l, T7Q, T7L, T7R, T7A, T7V, T7I, T7U; + { + E T7d, T7k, T7J, T7K; + T7d = T7b - T7c; + T7k = T7g + T7j; + T7l = T7d - T7k; + T7Q = T7d + T7k; + T7J = FNMS(KP555570233, T7v, KP831469612 * T7y); + T7K = FMA(KP555570233, T7o, KP831469612 * T7r); + T7L = T7J - T7K; + T7R = T7J + T7K; + } + { + E T7s, T7z, T7E, T7H; + T7s = FNMS(KP555570233, T7r, KP831469612 * T7o); + T7z = FMA(KP831469612, T7v, KP555570233 * T7y); + T7A = T7s - T7z; + T7V = T7z + T7s; + T7E = T7C + T7D; + T7H = T7F - T7G; + T7I = T7E - T7H; + T7U = T7E + T7H; + } + { + E T7B, T7M, T7X, T7Y; + T7B = T7l - T7A; + T7M = T7I - T7L; + Ip[WS(rs, 13)] = FNMS(T1k, T7M, T1g * T7B); + Im[WS(rs, 13)] = FMA(T1k, T7B, T1g * T7M); + T7X = T7Q + T7R; + T7Y = T7U + T7V; + Ip[WS(rs, 1)] = FNMS(T15, T7Y, T12 * T7X); + Im[WS(rs, 1)] = FMA(T12, T7Y, T15 * T7X); + } + { + E T7N, T7O, T7S, T7W; + T7N = T7l + T7A; + T7O = T7I + T7L; + Ip[WS(rs, 5)] = FNMS(T2Y, T7O, T2X * T7N); + Im[WS(rs, 5)] = FMA(T2Y, T7N, T2X * T7O); + T7S = T7Q - T7R; + T7W = T7U - T7V; + Ip[WS(rs, 9)] = FNMS(T7T, T7W, T7P * T7S); + Im[WS(rs, 9)] = FMA(T7P, T7W, T7T * T7S); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cb2_32", twinstr, &GENUS, {376, 168, 112, 0} }; + +void X(codelet_hc2cb2_32) (planner *p) { + X(khc2c_register) (p, hc2cb2_32, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_4.c new file mode 100644 index 000000000..867acca7c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_4.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:54 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 4 -dif -name hc2cb2_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 33 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 4, MAKE_VOLATILE_STRIDE(16, rs)) { + E T7, Tb, T8, Ta, Tc, Tg, T9, Tf; + T7 = W[0]; + Tb = W[3]; + T8 = W[2]; + T9 = T7 * T8; + Tf = T7 * Tb; + Ta = W[1]; + Tc = FMA(Ta, Tb, T9); + Tg = FNMS(Ta, T8, Tf); + { + E T3, T6, Td, Tj, Tz, Tx, Tr, Tm, Tv, Ts, Tw, TA; + { + E Th, Ti, Tu, Tp, Tk, Tl, Tq, Tt; + { + E T1, T2, T4, T5; + Th = Ip[0]; + Ti = Im[WS(rs, 1)]; + Tu = Th + Ti; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tp = T1 - T2; + Tk = Ip[WS(rs, 1)]; + Tl = Im[0]; + Tq = Tk + Tl; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + Tt = T4 - T5; + } + Td = T3 - T6; + Tj = Th - Ti; + Tz = Tu - Tt; + Tx = Tp + Tq; + Tr = Tp - Tq; + Tm = Tk - Tl; + Tv = Tt + Tu; + } + Rp[0] = T3 + T6; + Rm[0] = Tj + Tm; + Ts = T7 * Tr; + Ip[0] = FNMS(Ta, Tv, Ts); + Tw = T7 * Tv; + Im[0] = FMA(Ta, Tr, Tw); + TA = T8 * Tz; + Im[WS(rs, 1)] = FMA(Tb, Tx, TA); + { + E Ty, Te, To, Tn; + Ty = T8 * Tx; + Ip[WS(rs, 1)] = FNMS(Tb, Tz, Ty); + Te = Tc * Td; + To = Tg * Td; + Tn = Tj - Tm; + Rp[WS(rs, 1)] = FNMS(Tg, Tn, Te); + Rm[WS(rs, 1)] = FMA(Tc, Tn, To); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cb2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hc2cb2_4) (planner *p) { + X(khc2c_register) (p, hc2cb2_4, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 4 -dif -name hc2cb2_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 4, MAKE_VOLATILE_STRIDE(16, rs)) { + E T7, T9, T8, Ta, Tb, Td; + T7 = W[0]; + T9 = W[1]; + T8 = W[2]; + Ta = W[3]; + Tb = FMA(T7, T8, T9 * Ta); + Td = FNMS(T9, T8, T7 * Ta); + { + E T3, Tl, Tg, Tp, T6, To, Tj, Tm, Tc, Tk; + { + E T1, T2, Te, Tf; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tl = T1 - T2; + Te = Ip[0]; + Tf = Im[WS(rs, 1)]; + Tg = Te - Tf; + Tp = Te + Tf; + } + { + E T4, T5, Th, Ti; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + To = T4 - T5; + Th = Ip[WS(rs, 1)]; + Ti = Im[0]; + Tj = Th - Ti; + Tm = Th + Ti; + } + Rp[0] = T3 + T6; + Rm[0] = Tg + Tj; + Tc = T3 - T6; + Tk = Tg - Tj; + Rp[WS(rs, 1)] = FNMS(Td, Tk, Tb * Tc); + Rm[WS(rs, 1)] = FMA(Td, Tc, Tb * Tk); + { + E Tn, Tq, Tr, Ts; + Tn = Tl - Tm; + Tq = To + Tp; + Ip[0] = FNMS(T9, Tq, T7 * Tn); + Im[0] = FMA(T7, Tq, T9 * Tn); + Tr = Tl + Tm; + Ts = Tp - To; + Ip[WS(rs, 1)] = FNMS(Ta, Ts, T8 * Tr); + Im[WS(rs, 1)] = FMA(T8, Ts, Ta * Tr); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cb2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hc2cb2_4) (planner *p) { + X(khc2c_register) (p, hc2cb2_4, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_8.c new file mode 100644 index 000000000..1dc6d4199 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb2_8.c @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:54 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 8 -dif -name hc2cb2_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 74 FP additions, 50 FP multiplications, + * (or, 44 additions, 20 multiplications, 30 fused multiply/add), + * 47 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tf, Tg, Tl, Tp, Ti, Tj, Tk, T1b, T1u, T1e, T1o, To, Tq, TK; + { + E Th, T1n, T1t, Tn, Tm, TJ; + Tf = W[0]; + Tg = W[2]; + Th = Tf * Tg; + Tl = W[4]; + T1n = Tf * Tl; + Tp = W[5]; + T1t = Tf * Tp; + Ti = W[1]; + Tj = W[3]; + Tn = Tf * Tj; + Tk = FMA(Ti, Tj, Th); + T1b = FNMS(Ti, Tj, Th); + T1u = FNMS(Ti, Tl, T1t); + T1e = FMA(Ti, Tg, Tn); + T1o = FMA(Ti, Tp, T1n); + Tm = Tk * Tl; + TJ = Tk * Tp; + To = FNMS(Ti, Tg, Tn); + Tq = FMA(To, Tp, Tm); + TK = FNMS(To, Tl, TJ); + } + { + E T7, T1p, T1v, Tv, TP, T13, T1h, TZ, Te, T1k, T1w, T1q, TQ, TR, T10; + E TG, T14; + { + E T3, Tr, TO, T1f, T6, TL, Tu, T1g; + { + E T1, T2, TM, TN; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + Tr = T1 - T2; + TM = Ip[0]; + TN = Im[WS(rs, 3)]; + TO = TM + TN; + T1f = TM - TN; + } + { + E T4, T5, Ts, Tt; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + TL = T4 - T5; + Ts = Ip[WS(rs, 2)]; + Tt = Im[WS(rs, 1)]; + Tu = Ts + Tt; + T1g = Ts - Tt; + } + T7 = T3 + T6; + T1p = T3 - T6; + T1v = T1f - T1g; + Tv = Tr - Tu; + TP = TL + TO; + T13 = TO - TL; + T1h = T1f + T1g; + TZ = Tr + Tu; + } + { + E Ta, Tw, Tz, T1i, Td, TB, TE, T1j, TA, TF; + { + E T8, T9, Tx, Ty; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + Tw = T8 - T9; + Tx = Ip[WS(rs, 1)]; + Ty = Im[WS(rs, 2)]; + Tz = Tx + Ty; + T1i = Tx - Ty; + } + { + E Tb, Tc, TC, TD; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + TB = Tb - Tc; + TC = Ip[WS(rs, 3)]; + TD = Im[0]; + TE = TC + TD; + T1j = TC - TD; + } + Te = Ta + Td; + T1k = T1i + T1j; + T1w = Ta - Td; + T1q = T1j - T1i; + TQ = Tw + Tz; + TR = TB + TE; + T10 = TQ + TR; + TA = Tw - Tz; + TF = TB - TE; + TG = TA + TF; + T14 = TA - TF; + } + Rp[0] = T7 + Te; + Rm[0] = T1h + T1k; + { + E T11, T12, T15, T16; + T11 = FNMS(KP707106781, T10, TZ); + T12 = Tg * T11; + T15 = FMA(KP707106781, T14, T13); + T16 = Tg * T15; + Ip[WS(rs, 1)] = FNMS(Tj, T15, T12); + Im[WS(rs, 1)] = FMA(Tj, T11, T16); + } + { + E T1z, T1A, T1B, T1C; + T1z = T1p + T1q; + T1A = Tk * T1z; + T1B = T1w + T1v; + T1C = Tk * T1B; + Rp[WS(rs, 1)] = FNMS(To, T1B, T1A); + Rm[WS(rs, 1)] = FMA(To, T1z, T1C); + } + { + E T17, T18, T19, T1a; + T17 = FMA(KP707106781, T10, TZ); + T18 = Tl * T17; + T19 = FNMS(KP707106781, T14, T13); + T1a = Tl * T19; + Ip[WS(rs, 3)] = FNMS(Tp, T19, T18); + Im[WS(rs, 3)] = FMA(Tp, T17, T1a); + } + { + E T1l, T1d, T1m, T1c; + T1l = T1h - T1k; + T1c = T7 - Te; + T1d = T1b * T1c; + T1m = T1e * T1c; + Rp[WS(rs, 2)] = FNMS(T1e, T1l, T1d); + Rm[WS(rs, 2)] = FMA(T1b, T1l, T1m); + } + { + E T1r, T1s, T1x, T1y; + T1r = T1p - T1q; + T1s = T1o * T1r; + T1x = T1v - T1w; + T1y = T1o * T1x; + Rp[WS(rs, 3)] = FNMS(T1u, T1x, T1s); + Rm[WS(rs, 3)] = FMA(T1u, T1r, T1y); + } + { + E TT, TX, TW, TY, TI, TU, TS, TV, TH; + TS = TQ - TR; + TT = FNMS(KP707106781, TS, TP); + TX = FMA(KP707106781, TS, TP); + TV = FMA(KP707106781, TG, Tv); + TW = Tf * TV; + TY = Ti * TV; + TH = FNMS(KP707106781, TG, Tv); + TI = Tq * TH; + TU = TK * TH; + Ip[WS(rs, 2)] = FNMS(TK, TT, TI); + Im[WS(rs, 2)] = FMA(Tq, TT, TU); + Ip[0] = FNMS(Ti, TX, TW); + Im[0] = FMA(Tf, TX, TY); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cb2_8", twinstr, &GENUS, {44, 20, 30, 0} }; + +void X(codelet_hc2cb2_8) (planner *p) { + X(khc2c_register) (p, hc2cb2_8, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -twiddle-log3 -precompute-twiddles -n 8 -dif -name hc2cb2_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 74 FP additions, 44 FP multiplications, + * (or, 56 additions, 26 multiplications, 18 fused multiply/add), + * 46 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tf, Ti, Tg, Tj, Tl, Tp, TP, TR, TF, TG, TH, T15, TL, TT; + { + E Th, To, Tk, Tn; + Tf = W[0]; + Ti = W[1]; + Tg = W[2]; + Tj = W[3]; + Th = Tf * Tg; + To = Ti * Tg; + Tk = Ti * Tj; + Tn = Tf * Tj; + Tl = Th - Tk; + Tp = Tn + To; + TP = Th + Tk; + TR = Tn - To; + TF = W[4]; + TG = W[5]; + TH = FMA(Tf, TF, Ti * TG); + T15 = FNMS(TR, TF, TP * TG); + TL = FNMS(Ti, TF, Tf * TG); + TT = FMA(TP, TF, TR * TG); + } + { + E T7, T1f, T1i, Tw, TI, TW, T18, TM, Te, T19, T1a, TD, TJ, TZ, T12; + E TN, Tm, TE; + { + E T3, TU, Ts, T17, T6, T16, Tv, TV; + { + E T1, T2, Tq, Tr; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + TU = T1 - T2; + Tq = Ip[0]; + Tr = Im[WS(rs, 3)]; + Ts = Tq - Tr; + T17 = Tq + Tr; + } + { + E T4, T5, Tt, Tu; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + T16 = T4 - T5; + Tt = Ip[WS(rs, 2)]; + Tu = Im[WS(rs, 1)]; + Tv = Tt - Tu; + TV = Tt + Tu; + } + T7 = T3 + T6; + T1f = TU + TV; + T1i = T17 - T16; + Tw = Ts + Tv; + TI = T3 - T6; + TW = TU - TV; + T18 = T16 + T17; + TM = Ts - Tv; + } + { + E Ta, TX, Tz, TY, Td, T10, TC, T11; + { + E T8, T9, Tx, Ty; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + TX = T8 - T9; + Tx = Ip[WS(rs, 1)]; + Ty = Im[WS(rs, 2)]; + Tz = Tx - Ty; + TY = Tx + Ty; + } + { + E Tb, Tc, TA, TB; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + T10 = Tb - Tc; + TA = Ip[WS(rs, 3)]; + TB = Im[0]; + TC = TA - TB; + T11 = TA + TB; + } + Te = Ta + Td; + T19 = TX + TY; + T1a = T10 + T11; + TD = Tz + TC; + TJ = TC - Tz; + TZ = TX - TY; + T12 = T10 - T11; + TN = Ta - Td; + } + Rp[0] = T7 + Te; + Rm[0] = Tw + TD; + Tm = T7 - Te; + TE = Tw - TD; + Rp[WS(rs, 2)] = FNMS(Tp, TE, Tl * Tm); + Rm[WS(rs, 2)] = FMA(Tp, Tm, Tl * TE); + { + E TQ, TS, TK, TO; + TQ = TI + TJ; + TS = TN + TM; + Rp[WS(rs, 1)] = FNMS(TR, TS, TP * TQ); + Rm[WS(rs, 1)] = FMA(TP, TS, TR * TQ); + TK = TI - TJ; + TO = TM - TN; + Rp[WS(rs, 3)] = FNMS(TL, TO, TH * TK); + Rm[WS(rs, 3)] = FMA(TH, TO, TL * TK); + } + { + E T1h, T1l, T1k, T1m, T1g, T1j; + T1g = KP707106781 * (T19 + T1a); + T1h = T1f - T1g; + T1l = T1f + T1g; + T1j = KP707106781 * (TZ - T12); + T1k = T1i + T1j; + T1m = T1i - T1j; + Ip[WS(rs, 1)] = FNMS(Tj, T1k, Tg * T1h); + Im[WS(rs, 1)] = FMA(Tg, T1k, Tj * T1h); + Ip[WS(rs, 3)] = FNMS(TG, T1m, TF * T1l); + Im[WS(rs, 3)] = FMA(TF, T1m, TG * T1l); + } + { + E T14, T1d, T1c, T1e, T13, T1b; + T13 = KP707106781 * (TZ + T12); + T14 = TW - T13; + T1d = TW + T13; + T1b = KP707106781 * (T19 - T1a); + T1c = T18 - T1b; + T1e = T18 + T1b; + Ip[WS(rs, 2)] = FNMS(T15, T1c, TT * T14); + Im[WS(rs, 2)] = FMA(T15, T14, TT * T1c); + Ip[0] = FNMS(Ti, T1e, Tf * T1d); + Im[0] = FMA(Ti, T1d, Tf * T1e); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cb2_8", twinstr, &GENUS, {56, 26, 18, 0} }; + +void X(codelet_hc2cb2_8) (planner *p) { + X(khc2c_register) (p, hc2cb2_8, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_10.c new file mode 100644 index 000000000..ddb504fc7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_10.c @@ -0,0 +1,513 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:52 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -dif -name hc2cb_10 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 102 FP additions, 72 FP multiplications, + * (or, 48 additions, 18 multiplications, 54 fused multiply/add), + * 47 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E TH, T1B, TB, T11, T1E, T1G, TK, TM, T1x, T1V, T3, T1g, Tl, T1I, T1J; + E TO, TP, T1p, Ti, Tk, T1n, T1o, TF, TG; + TF = Ip[0]; + TG = Im[WS(rs, 4)]; + TH = TF - TG; + T1B = TF + TG; + { + E Tp, T1u, Tz, T1s, Ts, T1v, Tw, T1r; + { + E Tn, To, Tx, Ty; + Tn = Ip[WS(rs, 4)]; + To = Im[0]; + Tp = Tn - To; + T1u = Tn + To; + Tx = Ip[WS(rs, 3)]; + Ty = Im[WS(rs, 1)]; + Tz = Tx - Ty; + T1s = Tx + Ty; + } + { + E Tq, Tr, Tu, Tv; + Tq = Ip[WS(rs, 1)]; + Tr = Im[WS(rs, 3)]; + Ts = Tq - Tr; + T1v = Tq + Tr; + Tu = Ip[WS(rs, 2)]; + Tv = Im[WS(rs, 2)]; + Tw = Tu - Tv; + T1r = Tu + Tv; + } + { + E Tt, TA, T1C, T1D; + Tt = Tp - Ts; + TA = Tw - Tz; + TB = FNMS(KP618033988, TA, Tt); + T11 = FMA(KP618033988, Tt, TA); + T1C = T1r - T1s; + T1D = T1u - T1v; + T1E = T1C + T1D; + T1G = T1C - T1D; + } + { + E TI, TJ, T1t, T1w; + TI = Tw + Tz; + TJ = Tp + Ts; + TK = TI + TJ; + TM = TI - TJ; + T1t = T1r + T1s; + T1w = T1u + T1v; + T1x = FMA(KP618033988, T1w, T1t); + T1V = FNMS(KP618033988, T1t, T1w); + } + } + { + E Td, T1k, Tg, T1l, Th, T1m, T6, T1h, T9, T1i, Ta, T1j, T1, T2; + T1 = Rp[0]; + T2 = Rm[WS(rs, 4)]; + T3 = T1 + T2; + T1g = T1 - T2; + { + E Tb, Tc, Te, Tf; + Tb = Rp[WS(rs, 4)]; + Tc = Rm[0]; + Td = Tb + Tc; + T1k = Tb - Tc; + Te = Rm[WS(rs, 3)]; + Tf = Rp[WS(rs, 1)]; + Tg = Te + Tf; + T1l = Te - Tf; + } + Th = Td + Tg; + T1m = T1k + T1l; + { + E T4, T5, T7, T8; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 2)]; + T6 = T4 + T5; + T1h = T4 - T5; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 3)]; + T9 = T7 + T8; + T1i = T7 - T8; + } + Ta = T6 + T9; + T1j = T1h + T1i; + Tl = Ta - Th; + T1I = T1h - T1i; + T1J = T1k - T1l; + TO = Td - Tg; + TP = T6 - T9; + T1p = T1j - T1m; + Ti = Ta + Th; + Tk = FNMS(KP250000000, Ti, T3); + T1n = T1j + T1m; + T1o = FNMS(KP250000000, T1n, T1g); + } + Rp[0] = T3 + Ti; + Rm[0] = TH + TK; + { + E T2d, T29, T2b, T2c, T2e, T2a; + T2d = T1B + T1E; + T2a = T1g + T1n; + T29 = W[8]; + T2b = T29 * T2a; + T2c = W[9]; + T2e = T2c * T2a; + Ip[WS(rs, 2)] = FNMS(T2c, T2d, T2b); + Im[WS(rs, 2)] = FMA(T29, T2d, T2e); + } + { + E TQ, T16, TC, TU, TN, T15, T12, T1a, Tm, TL, T10; + TQ = FNMS(KP618033988, TP, TO); + T16 = FMA(KP618033988, TO, TP); + Tm = FNMS(KP559016994, Tl, Tk); + TC = FMA(KP951056516, TB, Tm); + TU = FNMS(KP951056516, TB, Tm); + TL = FNMS(KP250000000, TK, TH); + TN = FNMS(KP559016994, TM, TL); + T15 = FMA(KP559016994, TM, TL); + T10 = FMA(KP559016994, Tl, Tk); + T12 = FMA(KP951056516, T11, T10); + T1a = FNMS(KP951056516, T11, T10); + { + E TR, TE, TS, Tj, TD; + TR = FNMS(KP951056516, TQ, TN); + TE = W[3]; + TS = TE * TC; + Tj = W[2]; + TD = Tj * TC; + Rp[WS(rs, 1)] = FNMS(TE, TR, TD); + Rm[WS(rs, 1)] = FMA(Tj, TR, TS); + } + { + E T1d, T1c, T1e, T19, T1b; + T1d = FMA(KP951056516, T16, T15); + T1c = W[11]; + T1e = T1c * T1a; + T19 = W[10]; + T1b = T19 * T1a; + Rp[WS(rs, 3)] = FNMS(T1c, T1d, T1b); + Rm[WS(rs, 3)] = FMA(T19, T1d, T1e); + } + { + E TX, TW, TY, TT, TV; + TX = FMA(KP951056516, TQ, TN); + TW = W[15]; + TY = TW * TU; + TT = W[14]; + TV = TT * TU; + Rp[WS(rs, 4)] = FNMS(TW, TX, TV); + Rm[WS(rs, 4)] = FMA(TT, TX, TY); + } + { + E T17, T14, T18, TZ, T13; + T17 = FNMS(KP951056516, T16, T15); + T14 = W[7]; + T18 = T14 * T12; + TZ = W[6]; + T13 = TZ * T12; + Rp[WS(rs, 2)] = FNMS(T14, T17, T13); + Rm[WS(rs, 2)] = FMA(TZ, T17, T18); + } + } + { + E T1K, T20, T1y, T1O, T1H, T1Z, T1W, T24, T1q, T1F, T1U; + T1K = FMA(KP618033988, T1J, T1I); + T20 = FNMS(KP618033988, T1I, T1J); + T1q = FMA(KP559016994, T1p, T1o); + T1y = FNMS(KP951056516, T1x, T1q); + T1O = FMA(KP951056516, T1x, T1q); + T1F = FNMS(KP250000000, T1E, T1B); + T1H = FMA(KP559016994, T1G, T1F); + T1Z = FNMS(KP559016994, T1G, T1F); + T1U = FNMS(KP559016994, T1p, T1o); + T1W = FNMS(KP951056516, T1V, T1U); + T24 = FMA(KP951056516, T1V, T1U); + { + E T1L, T1A, T1M, T1f, T1z; + T1L = FMA(KP951056516, T1K, T1H); + T1A = W[1]; + T1M = T1A * T1y; + T1f = W[0]; + T1z = T1f * T1y; + Ip[0] = FNMS(T1A, T1L, T1z); + Im[0] = FMA(T1f, T1L, T1M); + } + { + E T27, T26, T28, T23, T25; + T27 = FNMS(KP951056516, T20, T1Z); + T26 = W[13]; + T28 = T26 * T24; + T23 = W[12]; + T25 = T23 * T24; + Ip[WS(rs, 3)] = FNMS(T26, T27, T25); + Im[WS(rs, 3)] = FMA(T23, T27, T28); + } + { + E T1R, T1Q, T1S, T1N, T1P; + T1R = FNMS(KP951056516, T1K, T1H); + T1Q = W[17]; + T1S = T1Q * T1O; + T1N = W[16]; + T1P = T1N * T1O; + Ip[WS(rs, 4)] = FNMS(T1Q, T1R, T1P); + Im[WS(rs, 4)] = FMA(T1N, T1R, T1S); + } + { + E T21, T1Y, T22, T1T, T1X; + T21 = FMA(KP951056516, T20, T1Z); + T1Y = W[5]; + T22 = T1Y * T1W; + T1T = W[4]; + T1X = T1T * T1W; + Ip[WS(rs, 1)] = FNMS(T1Y, T21, T1X); + Im[WS(rs, 1)] = FMA(T1T, T21, T22); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cb_10", twinstr, &GENUS, {48, 18, 54, 0} }; + +void X(codelet_hc2cb_10) (planner *p) { + X(khc2c_register) (p, hc2cb_10, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -dif -name hc2cb_10 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 102 FP additions, 60 FP multiplications, + * (or, 72 additions, 30 multiplications, 30 fused multiply/add), + * 39 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E T3, T18, TJ, T1i, TE, TF, T1B, T1A, T1f, T1t, Ti, Tl, Tt, TA, T1w; + E T1v, T1p, T1E, TM, TO; + { + E T1, T2, TH, TI; + T1 = Rp[0]; + T2 = Rm[WS(rs, 4)]; + T3 = T1 + T2; + T18 = T1 - T2; + TH = Ip[0]; + TI = Im[WS(rs, 4)]; + TJ = TH - TI; + T1i = TH + TI; + } + { + E T6, T19, Tg, T1d, T9, T1a, Td, T1c; + { + E T4, T5, Te, Tf; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 2)]; + T6 = T4 + T5; + T19 = T4 - T5; + Te = Rm[WS(rs, 3)]; + Tf = Rp[WS(rs, 1)]; + Tg = Te + Tf; + T1d = Te - Tf; + } + { + E T7, T8, Tb, Tc; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 3)]; + T9 = T7 + T8; + T1a = T7 - T8; + Tb = Rp[WS(rs, 4)]; + Tc = Rm[0]; + Td = Tb + Tc; + T1c = Tb - Tc; + } + TE = T6 - T9; + TF = Td - Tg; + T1B = T1c - T1d; + T1A = T19 - T1a; + { + E T1b, T1e, Ta, Th; + T1b = T19 + T1a; + T1e = T1c + T1d; + T1f = T1b + T1e; + T1t = KP559016994 * (T1b - T1e); + Ta = T6 + T9; + Th = Td + Tg; + Ti = Ta + Th; + Tl = KP559016994 * (Ta - Th); + } + } + { + E Tp, T1j, Tz, T1n, Ts, T1k, Tw, T1m; + { + E Tn, To, Tx, Ty; + Tn = Ip[WS(rs, 2)]; + To = Im[WS(rs, 2)]; + Tp = Tn - To; + T1j = Tn + To; + Tx = Ip[WS(rs, 1)]; + Ty = Im[WS(rs, 3)]; + Tz = Tx - Ty; + T1n = Tx + Ty; + } + { + E Tq, Tr, Tu, Tv; + Tq = Ip[WS(rs, 3)]; + Tr = Im[WS(rs, 1)]; + Ts = Tq - Tr; + T1k = Tq + Tr; + Tu = Ip[WS(rs, 4)]; + Tv = Im[0]; + Tw = Tu - Tv; + T1m = Tu + Tv; + } + Tt = Tp - Ts; + TA = Tw - Tz; + T1w = T1m + T1n; + T1v = T1j + T1k; + { + E T1l, T1o, TK, TL; + T1l = T1j - T1k; + T1o = T1m - T1n; + T1p = T1l + T1o; + T1E = KP559016994 * (T1l - T1o); + TK = Tp + Ts; + TL = Tw + Tz; + TM = TK + TL; + TO = KP559016994 * (TK - TL); + } + } + Rp[0] = T3 + Ti; + Rm[0] = TJ + TM; + { + E T1g, T1q, T17, T1h; + T1g = T18 + T1f; + T1q = T1i + T1p; + T17 = W[8]; + T1h = W[9]; + Ip[WS(rs, 2)] = FNMS(T1h, T1q, T17 * T1g); + Im[WS(rs, 2)] = FMA(T1h, T1g, T17 * T1q); + } + { + E TB, TG, T11, TX, TP, T10, Tm, TW, TN, Tk; + TB = FNMS(KP951056516, TA, KP587785252 * Tt); + TG = FNMS(KP951056516, TF, KP587785252 * TE); + T11 = FMA(KP951056516, TE, KP587785252 * TF); + TX = FMA(KP951056516, Tt, KP587785252 * TA); + TN = FNMS(KP250000000, TM, TJ); + TP = TN - TO; + T10 = TO + TN; + Tk = FNMS(KP250000000, Ti, T3); + Tm = Tk - Tl; + TW = Tl + Tk; + { + E TC, TQ, Tj, TD; + TC = Tm - TB; + TQ = TG + TP; + Tj = W[2]; + TD = W[3]; + Rp[WS(rs, 1)] = FNMS(TD, TQ, Tj * TC); + Rm[WS(rs, 1)] = FMA(TD, TC, Tj * TQ); + } + { + E T14, T16, T13, T15; + T14 = TW - TX; + T16 = T11 + T10; + T13 = W[10]; + T15 = W[11]; + Rp[WS(rs, 3)] = FNMS(T15, T16, T13 * T14); + Rm[WS(rs, 3)] = FMA(T15, T14, T13 * T16); + } + { + E TS, TU, TR, TT; + TS = Tm + TB; + TU = TP - TG; + TR = W[14]; + TT = W[15]; + Rp[WS(rs, 4)] = FNMS(TT, TU, TR * TS); + Rm[WS(rs, 4)] = FMA(TT, TS, TR * TU); + } + { + E TY, T12, TV, TZ; + TY = TW + TX; + T12 = T10 - T11; + TV = W[6]; + TZ = W[7]; + Rp[WS(rs, 2)] = FNMS(TZ, T12, TV * TY); + Rm[WS(rs, 2)] = FMA(TZ, TY, TV * T12); + } + } + { + E T1x, T1C, T1Q, T1N, T1F, T1R, T1u, T1M, T1D, T1s; + T1x = FNMS(KP951056516, T1w, KP587785252 * T1v); + T1C = FNMS(KP951056516, T1B, KP587785252 * T1A); + T1Q = FMA(KP951056516, T1A, KP587785252 * T1B); + T1N = FMA(KP951056516, T1v, KP587785252 * T1w); + T1D = FNMS(KP250000000, T1p, T1i); + T1F = T1D - T1E; + T1R = T1E + T1D; + T1s = FNMS(KP250000000, T1f, T18); + T1u = T1s - T1t; + T1M = T1t + T1s; + { + E T1y, T1G, T1r, T1z; + T1y = T1u - T1x; + T1G = T1C + T1F; + T1r = W[12]; + T1z = W[13]; + Ip[WS(rs, 3)] = FNMS(T1z, T1G, T1r * T1y); + Im[WS(rs, 3)] = FMA(T1r, T1G, T1z * T1y); + } + { + E T1U, T1W, T1T, T1V; + T1U = T1M + T1N; + T1W = T1R - T1Q; + T1T = W[16]; + T1V = W[17]; + Ip[WS(rs, 4)] = FNMS(T1V, T1W, T1T * T1U); + Im[WS(rs, 4)] = FMA(T1T, T1W, T1V * T1U); + } + { + E T1I, T1K, T1H, T1J; + T1I = T1u + T1x; + T1K = T1F - T1C; + T1H = W[4]; + T1J = W[5]; + Ip[WS(rs, 1)] = FNMS(T1J, T1K, T1H * T1I); + Im[WS(rs, 1)] = FMA(T1H, T1K, T1J * T1I); + } + { + E T1O, T1S, T1L, T1P; + T1O = T1M - T1N; + T1S = T1Q + T1R; + T1L = W[0]; + T1P = W[1]; + Ip[0] = FNMS(T1P, T1S, T1L * T1O); + Im[0] = FMA(T1L, T1S, T1P * T1O); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cb_10", twinstr, &GENUS, {72, 30, 30, 0} }; + +void X(codelet_hc2cb_10) (planner *p) { + X(khc2c_register) (p, hc2cb_10, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_12.c new file mode 100644 index 000000000..09357b9ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_12.c @@ -0,0 +1,597 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:52 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -dif -name hc2cb_12 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 118 FP additions, 68 FP multiplications, + * (or, 72 additions, 22 multiplications, 46 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E T18, T20, T1b, T21, T1s, T2a, T1p, T29, TI, TN, TO, Tb, To, T1f, T23; + E T1i, T24, T1z, T2d, T1w, T2c, Tt, Ty, Tz, Tm, TD; + { + E T1, TE, T6, TM, T4, T1o, TH, T17, T9, T1r, TL, T1a; + T1 = Rp[0]; + TE = Ip[0]; + T6 = Rm[WS(rs, 5)]; + TM = Im[WS(rs, 5)]; + { + E T2, T3, TF, TG; + T2 = Rp[WS(rs, 4)]; + T3 = Rm[WS(rs, 3)]; + T4 = T2 + T3; + T1o = T2 - T3; + TF = Ip[WS(rs, 4)]; + TG = Im[WS(rs, 3)]; + TH = TF - TG; + T17 = TF + TG; + } + { + E T7, T8, TJ, TK; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 2)]; + T9 = T7 + T8; + T1r = T7 - T8; + TJ = Ip[WS(rs, 2)]; + TK = Im[WS(rs, 1)]; + TL = TJ - TK; + T1a = TJ + TK; + } + { + E T16, T19, T1q, T1n, T5, Ta; + T16 = FNMS(KP500000000, T4, T1); + T18 = FNMS(KP866025403, T17, T16); + T20 = FMA(KP866025403, T17, T16); + T19 = FNMS(KP500000000, T9, T6); + T1b = FMA(KP866025403, T1a, T19); + T21 = FNMS(KP866025403, T1a, T19); + T1q = FMA(KP500000000, TL, TM); + T1s = FNMS(KP866025403, T1r, T1q); + T2a = FMA(KP866025403, T1r, T1q); + T1n = FNMS(KP500000000, TH, TE); + T1p = FMA(KP866025403, T1o, T1n); + T29 = FNMS(KP866025403, T1o, T1n); + TI = TE + TH; + TN = TL - TM; + TO = TI - TN; + T5 = T1 + T4; + Ta = T6 + T9; + Tb = T5 + Ta; + To = T5 - Ta; + } + } + { + E Tc, Tp, Th, Tx, Tf, T1v, Ts, T1e, Tk, T1y, Tw, T1h; + Tc = Rp[WS(rs, 3)]; + Tp = Ip[WS(rs, 3)]; + Th = Rm[WS(rs, 2)]; + Tx = Im[WS(rs, 2)]; + { + E Td, Te, Tq, Tr; + Td = Rm[WS(rs, 4)]; + Te = Rm[0]; + Tf = Td + Te; + T1v = Td - Te; + Tq = Im[WS(rs, 4)]; + Tr = Im[0]; + Ts = Tq + Tr; + T1e = Tq - Tr; + } + { + E Ti, Tj, Tu, Tv; + Ti = Rp[WS(rs, 1)]; + Tj = Rp[WS(rs, 5)]; + Tk = Ti + Tj; + T1y = Ti - Tj; + Tu = Ip[WS(rs, 1)]; + Tv = Ip[WS(rs, 5)]; + Tw = Tu + Tv; + T1h = Tv - Tu; + } + { + E T1d, T1g, T1x, T1u, Tg, Tl; + T1d = FNMS(KP500000000, Tf, Tc); + T1f = FMA(KP866025403, T1e, T1d); + T23 = FNMS(KP866025403, T1e, T1d); + T1g = FNMS(KP500000000, Tk, Th); + T1i = FMA(KP866025403, T1h, T1g); + T24 = FNMS(KP866025403, T1h, T1g); + T1x = FMA(KP500000000, Tw, Tx); + T1z = FNMS(KP866025403, T1y, T1x); + T2d = FMA(KP866025403, T1y, T1x); + T1u = FMA(KP500000000, Ts, Tp); + T1w = FMA(KP866025403, T1v, T1u); + T2c = FNMS(KP866025403, T1v, T1u); + Tt = Tp - Ts; + Ty = Tw - Tx; + Tz = Tt - Ty; + Tg = Tc + Tf; + Tl = Th + Tk; + Tm = Tg + Tl; + TD = Tg - Tl; + } + } + Rp[0] = Tb + Tm; + { + E TA, TP, TB, TQ, Tn, TC; + TA = To - Tz; + TP = TD + TO; + Tn = W[16]; + TB = Tn * TA; + TQ = Tn * TP; + TC = W[17]; + Ip[WS(rs, 4)] = FNMS(TC, TP, TB); + Im[WS(rs, 4)] = FMA(TC, TA, TQ); + } + { + E TS, TV, TT, TW, TR, TU; + TS = To + Tz; + TV = TO - TD; + TR = W[4]; + TT = TR * TS; + TW = TR * TV; + TU = W[5]; + Ip[WS(rs, 1)] = FNMS(TU, TV, TT); + Im[WS(rs, 1)] = FMA(TU, TS, TW); + } + { + E T11, T12, T13, TX, TZ, T10, T14, TY; + T11 = TI + TN; + T12 = Tt + Ty; + T13 = T11 - T12; + TY = Tb - Tm; + TX = W[10]; + TZ = TX * TY; + T10 = W[11]; + T14 = T10 * TY; + Rm[0] = T11 + T12; + Rm[WS(rs, 3)] = FMA(TX, T13, T14); + Rp[WS(rs, 3)] = FNMS(T10, T13, TZ); + } + { + E T1k, T1E, T1B, T1H; + { + E T1c, T1j, T1t, T1A; + T1c = T18 + T1b; + T1j = T1f + T1i; + T1k = T1c - T1j; + T1E = T1c + T1j; + T1t = T1p - T1s; + T1A = T1w - T1z; + T1B = T1t - T1A; + T1H = T1t + T1A; + } + { + E T15, T1l, T1m, T1C; + T15 = W[18]; + T1l = T15 * T1k; + T1m = W[19]; + T1C = T1m * T1k; + Rp[WS(rs, 5)] = FNMS(T1m, T1B, T1l); + Rm[WS(rs, 5)] = FMA(T15, T1B, T1C); + } + { + E T1D, T1F, T1G, T1I; + T1D = W[6]; + T1F = T1D * T1E; + T1G = W[7]; + T1I = T1G * T1E; + Rp[WS(rs, 2)] = FNMS(T1G, T1H, T1F); + Rm[WS(rs, 2)] = FMA(T1D, T1H, T1I); + } + } + { + E T26, T2i, T2f, T2l; + { + E T22, T25, T2b, T2e; + T22 = T20 + T21; + T25 = T23 + T24; + T26 = T22 - T25; + T2i = T22 + T25; + T2b = T29 - T2a; + T2e = T2c - T2d; + T2f = T2b - T2e; + T2l = T2b + T2e; + } + { + E T1Z, T27, T28, T2g; + T1Z = W[2]; + T27 = T1Z * T26; + T28 = W[3]; + T2g = T28 * T26; + Rp[WS(rs, 1)] = FNMS(T28, T2f, T27); + Rm[WS(rs, 1)] = FMA(T1Z, T2f, T2g); + } + { + E T2h, T2j, T2k, T2m; + T2h = W[14]; + T2j = T2h * T2i; + T2k = W[15]; + T2m = T2k * T2i; + Rp[WS(rs, 4)] = FNMS(T2k, T2l, T2j); + Rm[WS(rs, 4)] = FMA(T2h, T2l, T2m); + } + } + { + E T2q, T2y, T2v, T2B; + { + E T2o, T2p, T2t, T2u; + T2o = T20 - T21; + T2p = T2c + T2d; + T2q = T2o - T2p; + T2y = T2o + T2p; + T2t = T29 + T2a; + T2u = T23 - T24; + T2v = T2t + T2u; + T2B = T2t - T2u; + } + { + E T2r, T2w, T2n, T2s; + T2n = W[8]; + T2r = T2n * T2q; + T2w = T2n * T2v; + T2s = W[9]; + Ip[WS(rs, 2)] = FNMS(T2s, T2v, T2r); + Im[WS(rs, 2)] = FMA(T2s, T2q, T2w); + } + { + E T2z, T2C, T2x, T2A; + T2x = W[20]; + T2z = T2x * T2y; + T2C = T2x * T2B; + T2A = W[21]; + Ip[WS(rs, 5)] = FNMS(T2A, T2B, T2z); + Im[WS(rs, 5)] = FMA(T2A, T2y, T2C); + } + } + { + E T1M, T1U, T1R, T1X; + { + E T1K, T1L, T1P, T1Q; + T1K = T18 - T1b; + T1L = T1w + T1z; + T1M = T1K - T1L; + T1U = T1K + T1L; + T1P = T1p + T1s; + T1Q = T1f - T1i; + T1R = T1P + T1Q; + T1X = T1P - T1Q; + } + { + E T1N, T1S, T1J, T1O; + T1J = W[0]; + T1N = T1J * T1M; + T1S = T1J * T1R; + T1O = W[1]; + Ip[0] = FNMS(T1O, T1R, T1N); + Im[0] = FMA(T1O, T1M, T1S); + } + { + E T1V, T1Y, T1T, T1W; + T1T = W[12]; + T1V = T1T * T1U; + T1Y = T1T * T1X; + T1W = W[13]; + Ip[WS(rs, 3)] = FNMS(T1W, T1X, T1V); + Im[WS(rs, 3)] = FMA(T1W, T1U, T1Y); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cb_12", twinstr, &GENUS, {72, 22, 46, 0} }; + +void X(codelet_hc2cb_12) (planner *p) { + X(khc2c_register) (p, hc2cb_12, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -dif -name hc2cb_12 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 118 FP additions, 60 FP multiplications, + * (or, 88 additions, 30 multiplications, 30 fused multiply/add), + * 39 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E T5, TH, T12, T1M, T1i, T1U, Tl, Ty, T1c, T1Y, T1s, T1Q, Ta, TM, T15; + E T1N, T1l, T1V, Tg, Tt, T19, T1X, T1p, T1P; + { + E T1, TD, T4, T1g, TG, T11, T10, T1h; + T1 = Rp[0]; + TD = Ip[0]; + { + E T2, T3, TE, TF; + T2 = Rp[WS(rs, 4)]; + T3 = Rm[WS(rs, 3)]; + T4 = T2 + T3; + T1g = KP866025403 * (T2 - T3); + TE = Ip[WS(rs, 4)]; + TF = Im[WS(rs, 3)]; + TG = TE - TF; + T11 = KP866025403 * (TE + TF); + } + T5 = T1 + T4; + TH = TD + TG; + T10 = FNMS(KP500000000, T4, T1); + T12 = T10 - T11; + T1M = T10 + T11; + T1h = FNMS(KP500000000, TG, TD); + T1i = T1g + T1h; + T1U = T1h - T1g; + } + { + E Th, Tx, Tk, T1a, Tw, T1r, T1b, T1q; + Th = Rm[WS(rs, 2)]; + Tx = Im[WS(rs, 2)]; + { + E Ti, Tj, Tu, Tv; + Ti = Rp[WS(rs, 1)]; + Tj = Rp[WS(rs, 5)]; + Tk = Ti + Tj; + T1a = KP866025403 * (Ti - Tj); + Tu = Ip[WS(rs, 1)]; + Tv = Ip[WS(rs, 5)]; + Tw = Tu + Tv; + T1r = KP866025403 * (Tv - Tu); + } + Tl = Th + Tk; + Ty = Tw - Tx; + T1b = FMA(KP500000000, Tw, Tx); + T1c = T1a - T1b; + T1Y = T1a + T1b; + T1q = FNMS(KP500000000, Tk, Th); + T1s = T1q + T1r; + T1Q = T1q - T1r; + } + { + E T6, TL, T9, T1j, TK, T14, T13, T1k; + T6 = Rm[WS(rs, 5)]; + TL = Im[WS(rs, 5)]; + { + E T7, T8, TI, TJ; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 2)]; + T9 = T7 + T8; + T1j = KP866025403 * (T7 - T8); + TI = Ip[WS(rs, 2)]; + TJ = Im[WS(rs, 1)]; + TK = TI - TJ; + T14 = KP866025403 * (TI + TJ); + } + Ta = T6 + T9; + TM = TK - TL; + T13 = FNMS(KP500000000, T9, T6); + T15 = T13 + T14; + T1N = T13 - T14; + T1k = FMA(KP500000000, TK, TL); + T1l = T1j - T1k; + T1V = T1j + T1k; + } + { + E Tc, Tp, Tf, T17, Ts, T1o, T18, T1n; + Tc = Rp[WS(rs, 3)]; + Tp = Ip[WS(rs, 3)]; + { + E Td, Te, Tq, Tr; + Td = Rm[WS(rs, 4)]; + Te = Rm[0]; + Tf = Td + Te; + T17 = KP866025403 * (Td - Te); + Tq = Im[WS(rs, 4)]; + Tr = Im[0]; + Ts = Tq + Tr; + T1o = KP866025403 * (Tq - Tr); + } + Tg = Tc + Tf; + Tt = Tp - Ts; + T18 = FMA(KP500000000, Ts, Tp); + T19 = T17 + T18; + T1X = T18 - T17; + T1n = FNMS(KP500000000, Tf, Tc); + T1p = T1n + T1o; + T1P = T1n - T1o; + } + { + E Tb, Tm, TU, TW, TX, TY, TT, TV; + Tb = T5 + Ta; + Tm = Tg + Tl; + TU = Tb - Tm; + TW = TH + TM; + TX = Tt + Ty; + TY = TW - TX; + Rp[0] = Tb + Tm; + Rm[0] = TW + TX; + TT = W[10]; + TV = W[11]; + Rp[WS(rs, 3)] = FNMS(TV, TY, TT * TU); + Rm[WS(rs, 3)] = FMA(TV, TU, TT * TY); + } + { + E TA, TQ, TO, TS; + { + E To, Tz, TC, TN; + To = T5 - Ta; + Tz = Tt - Ty; + TA = To - Tz; + TQ = To + Tz; + TC = Tg - Tl; + TN = TH - TM; + TO = TC + TN; + TS = TN - TC; + } + { + E Tn, TB, TP, TR; + Tn = W[16]; + TB = W[17]; + Ip[WS(rs, 4)] = FNMS(TB, TO, Tn * TA); + Im[WS(rs, 4)] = FMA(Tn, TO, TB * TA); + TP = W[4]; + TR = W[5]; + Ip[WS(rs, 1)] = FNMS(TR, TS, TP * TQ); + Im[WS(rs, 1)] = FMA(TP, TS, TR * TQ); + } + } + { + E T28, T2e, T2c, T2g; + { + E T26, T27, T2a, T2b; + T26 = T1M - T1N; + T27 = T1X + T1Y; + T28 = T26 - T27; + T2e = T26 + T27; + T2a = T1U + T1V; + T2b = T1P - T1Q; + T2c = T2a + T2b; + T2g = T2a - T2b; + } + { + E T25, T29, T2d, T2f; + T25 = W[8]; + T29 = W[9]; + Ip[WS(rs, 2)] = FNMS(T29, T2c, T25 * T28); + Im[WS(rs, 2)] = FMA(T25, T2c, T29 * T28); + T2d = W[20]; + T2f = W[21]; + Ip[WS(rs, 5)] = FNMS(T2f, T2g, T2d * T2e); + Im[WS(rs, 5)] = FMA(T2d, T2g, T2f * T2e); + } + } + { + E T1S, T22, T20, T24; + { + E T1O, T1R, T1W, T1Z; + T1O = T1M + T1N; + T1R = T1P + T1Q; + T1S = T1O - T1R; + T22 = T1O + T1R; + T1W = T1U - T1V; + T1Z = T1X - T1Y; + T20 = T1W - T1Z; + T24 = T1W + T1Z; + } + { + E T1L, T1T, T21, T23; + T1L = W[2]; + T1T = W[3]; + Rp[WS(rs, 1)] = FNMS(T1T, T20, T1L * T1S); + Rm[WS(rs, 1)] = FMA(T1T, T1S, T1L * T20); + T21 = W[14]; + T23 = W[15]; + Rp[WS(rs, 4)] = FNMS(T23, T24, T21 * T22); + Rm[WS(rs, 4)] = FMA(T23, T22, T21 * T24); + } + } + { + E T1C, T1I, T1G, T1K; + { + E T1A, T1B, T1E, T1F; + T1A = T12 + T15; + T1B = T1p + T1s; + T1C = T1A - T1B; + T1I = T1A + T1B; + T1E = T1i + T1l; + T1F = T19 + T1c; + T1G = T1E - T1F; + T1K = T1E + T1F; + } + { + E T1z, T1D, T1H, T1J; + T1z = W[18]; + T1D = W[19]; + Rp[WS(rs, 5)] = FNMS(T1D, T1G, T1z * T1C); + Rm[WS(rs, 5)] = FMA(T1D, T1C, T1z * T1G); + T1H = W[6]; + T1J = W[7]; + Rp[WS(rs, 2)] = FNMS(T1J, T1K, T1H * T1I); + Rm[WS(rs, 2)] = FMA(T1J, T1I, T1H * T1K); + } + } + { + E T1e, T1w, T1u, T1y; + { + E T16, T1d, T1m, T1t; + T16 = T12 - T15; + T1d = T19 - T1c; + T1e = T16 - T1d; + T1w = T16 + T1d; + T1m = T1i - T1l; + T1t = T1p - T1s; + T1u = T1m + T1t; + T1y = T1m - T1t; + } + { + E TZ, T1f, T1v, T1x; + TZ = W[0]; + T1f = W[1]; + Ip[0] = FNMS(T1f, T1u, TZ * T1e); + Im[0] = FMA(TZ, T1u, T1f * T1e); + T1v = W[12]; + T1x = W[13]; + Ip[WS(rs, 3)] = FNMS(T1x, T1y, T1v * T1w); + Im[WS(rs, 3)] = FMA(T1v, T1y, T1x * T1w); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cb_12", twinstr, &GENUS, {88, 30, 30, 0} }; + +void X(codelet_hc2cb_12) (planner *p) { + X(khc2c_register) (p, hc2cb_12, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_16.c new file mode 100644 index 000000000..268a50c0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_16.c @@ -0,0 +1,833 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:52 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hc2cb_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 104 additions, 30 multiplications, 70 fused multiply/add), + * 63 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E TA, T1O, T21, T1h, T2P, T2S, T3b, T3p, T3q, T3D, T1k, T1P, Tf, T3y, T2A; + E T36, TL, T22, T3s, T3t, T3z, T2F, T2U, T2K, T2V, Tu, T3E, TX, T1n, T1T; + E T24, T1W, T25, T18, T1m; + { + E T3, Tw, T1g, T2Q, T6, T1d, Tz, T2R, Ta, TB, TE, T2y, Td, TG, TJ; + E T2x; + { + E T1, T2, T1e, T1f; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + Tw = T1 - T2; + T1e = Ip[0]; + T1f = Im[WS(rs, 7)]; + T1g = T1e + T1f; + T2Q = T1e - T1f; + } + { + E T4, T5, Tx, Ty; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + T1d = T4 - T5; + Tx = Ip[WS(rs, 4)]; + Ty = Im[WS(rs, 3)]; + Tz = Tx + Ty; + T2R = Tx - Ty; + } + { + E T8, T9, TC, TD; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + TB = T8 - T9; + TC = Ip[WS(rs, 2)]; + TD = Im[WS(rs, 5)]; + TE = TC + TD; + T2y = TC - TD; + } + { + E Tb, Tc, TH, TI; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + Td = Tb + Tc; + TG = Tb - Tc; + TH = Ip[WS(rs, 6)]; + TI = Im[WS(rs, 1)]; + TJ = TH + TI; + T2x = TH - TI; + } + TA = Tw - Tz; + T1O = Tw + Tz; + T21 = T1g - T1d; + T1h = T1d + T1g; + T2P = Ta - Td; + T2S = T2Q - T2R; + T3b = T2S - T2P; + { + E T1i, T1j, T7, Te; + T3p = T2Q + T2R; + T3q = T2y + T2x; + T3D = T3p - T3q; + T1i = TB + TE; + T1j = TG + TJ; + T1k = T1i - T1j; + T1P = T1i + T1j; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T3y = T7 - Te; + { + E T2w, T2z, TF, TK; + T2w = T3 - T6; + T2z = T2x - T2y; + T2A = T2w + T2z; + T36 = T2w - T2z; + TF = TB - TE; + TK = TG - TJ; + TL = TF + TK; + T22 = TF - TK; + } + } + } + { + E Ti, T13, T11, T2C, Tl, TY, T16, T2D, Tp, TS, TQ, T2H, Ts, TN, TV; + E T2I, T2B, T2E; + { + E Tg, Th, TZ, T10; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + T13 = Tg - Th; + TZ = Ip[WS(rs, 1)]; + T10 = Im[WS(rs, 6)]; + T11 = TZ + T10; + T2C = TZ - T10; + } + { + E Tj, Tk, T14, T15; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + TY = Tj - Tk; + T14 = Ip[WS(rs, 5)]; + T15 = Im[WS(rs, 2)]; + T16 = T14 + T15; + T2D = T14 - T15; + } + { + E Tn, To, TO, TP; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + TS = Tn - To; + TO = Ip[WS(rs, 7)]; + TP = Im[0]; + TQ = TO + TP; + T2H = TO - TP; + } + { + E Tq, Tr, TT, TU; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + TN = Tq - Tr; + TT = Ip[WS(rs, 3)]; + TU = Im[WS(rs, 4)]; + TV = TT + TU; + T2I = TT - TU; + } + T3s = T2C + T2D; + T3t = T2H + T2I; + T3z = T3t - T3s; + T2B = Ti - Tl; + T2E = T2C - T2D; + T2F = T2B - T2E; + T2U = T2B + T2E; + { + E T2G, T2J, Tm, Tt; + T2G = Tp - Ts; + T2J = T2H - T2I; + T2K = T2G + T2J; + T2V = T2J - T2G; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T3E = Tm - Tt; + } + { + E TR, TW, T1R, T1S; + TR = TN - TQ; + TW = TS - TV; + TX = FNMS(KP414213562, TW, TR); + T1n = FMA(KP414213562, TR, TW); + T1R = T11 - TY; + T1S = T13 + T16; + T1T = FNMS(KP414213562, T1S, T1R); + T24 = FMA(KP414213562, T1R, T1S); + } + { + E T1U, T1V, T12, T17; + T1U = TN + TQ; + T1V = TS + TV; + T1W = FNMS(KP414213562, T1V, T1U); + T25 = FMA(KP414213562, T1U, T1V); + T12 = TY + T11; + T17 = T13 - T16; + T18 = FMA(KP414213562, T17, T12); + T1m = FNMS(KP414213562, T12, T17); + } + } + Rp[0] = Tf + Tu; + { + E T3r, T3u, T3v, T3l, T3n, T3o, T3w, T3m; + T3r = T3p + T3q; + T3u = T3s + T3t; + T3v = T3r - T3u; + T3m = Tf - Tu; + T3l = W[14]; + T3n = T3l * T3m; + T3o = W[15]; + T3w = T3o * T3m; + Rm[0] = T3r + T3u; + Rm[WS(rs, 4)] = FMA(T3l, T3v, T3w); + Rp[WS(rs, 4)] = FNMS(T3o, T3v, T3n); + } + { + E T3A, T3F, T3B, T3G, T3x, T3C; + T3A = T3y - T3z; + T3F = T3D - T3E; + T3x = W[22]; + T3B = T3x * T3A; + T3G = T3x * T3F; + T3C = W[23]; + Rp[WS(rs, 6)] = FNMS(T3C, T3F, T3B); + Rm[WS(rs, 6)] = FMA(T3C, T3A, T3G); + } + { + E T3I, T3L, T3J, T3M, T3H, T3K; + T3I = T3y + T3z; + T3L = T3E + T3D; + T3H = W[6]; + T3J = T3H * T3I; + T3M = T3H * T3L; + T3K = W[7]; + Rp[WS(rs, 2)] = FNMS(T3K, T3L, T3J); + Rm[WS(rs, 2)] = FMA(T3K, T3I, T3M); + } + { + E T38, T3g, T3d, T3j, T37, T3c; + T37 = T2V - T2U; + T38 = FNMS(KP707106781, T37, T36); + T3g = FMA(KP707106781, T37, T36); + T3c = T2F - T2K; + T3d = FNMS(KP707106781, T3c, T3b); + T3j = FMA(KP707106781, T3c, T3b); + { + E T39, T3e, T35, T3a; + T35 = W[26]; + T39 = T35 * T38; + T3e = T35 * T3d; + T3a = W[27]; + Rp[WS(rs, 7)] = FNMS(T3a, T3d, T39); + Rm[WS(rs, 7)] = FMA(T3a, T38, T3e); + } + { + E T3h, T3k, T3f, T3i; + T3f = W[10]; + T3h = T3f * T3g; + T3k = T3f * T3j; + T3i = W[11]; + Rp[WS(rs, 3)] = FNMS(T3i, T3j, T3h); + Rm[WS(rs, 3)] = FMA(T3i, T3g, T3k); + } + } + { + E T2M, T30, T2X, T33, T2L, T2T, T2W; + T2L = T2F + T2K; + T2M = FNMS(KP707106781, T2L, T2A); + T30 = FMA(KP707106781, T2L, T2A); + T2T = T2P + T2S; + T2W = T2U + T2V; + T2X = FNMS(KP707106781, T2W, T2T); + T33 = FMA(KP707106781, T2W, T2T); + { + E T2v, T2N, T2O, T2Y; + T2v = W[18]; + T2N = T2v * T2M; + T2O = W[19]; + T2Y = T2O * T2M; + Rp[WS(rs, 5)] = FNMS(T2O, T2X, T2N); + Rm[WS(rs, 5)] = FMA(T2v, T2X, T2Y); + } + { + E T2Z, T31, T32, T34; + T2Z = W[2]; + T31 = T2Z * T30; + T32 = W[3]; + T34 = T32 * T30; + Rp[WS(rs, 1)] = FNMS(T32, T33, T31); + Rm[WS(rs, 1)] = FMA(T2Z, T33, T34); + } + } + { + E T1Y, T2a, T27, T2d; + { + E T1Q, T1X, T23, T26; + T1Q = FNMS(KP707106781, T1P, T1O); + T1X = T1T + T1W; + T1Y = FMA(KP923879532, T1X, T1Q); + T2a = FNMS(KP923879532, T1X, T1Q); + T23 = FMA(KP707106781, T22, T21); + T26 = T24 - T25; + T27 = FNMS(KP923879532, T26, T23); + T2d = FMA(KP923879532, T26, T23); + } + { + E T1N, T1Z, T20, T28; + T1N = W[20]; + T1Z = T1N * T1Y; + T20 = W[21]; + T28 = T20 * T1Y; + Ip[WS(rs, 5)] = FNMS(T20, T27, T1Z); + Im[WS(rs, 5)] = FMA(T1N, T27, T28); + } + { + E T29, T2b, T2c, T2e; + T29 = W[4]; + T2b = T29 * T2a; + T2c = W[5]; + T2e = T2c * T2a; + Ip[WS(rs, 1)] = FNMS(T2c, T2d, T2b); + Im[WS(rs, 1)] = FMA(T29, T2d, T2e); + } + } + { + E T1a, T1s, T1p, T1v; + { + E TM, T19, T1l, T1o; + TM = FNMS(KP707106781, TL, TA); + T19 = TX - T18; + T1a = FNMS(KP923879532, T19, TM); + T1s = FMA(KP923879532, T19, TM); + T1l = FNMS(KP707106781, T1k, T1h); + T1o = T1m - T1n; + T1p = FNMS(KP923879532, T1o, T1l); + T1v = FMA(KP923879532, T1o, T1l); + } + { + E Tv, T1b, T1c, T1q; + Tv = W[24]; + T1b = Tv * T1a; + T1c = W[25]; + T1q = T1c * T1a; + Ip[WS(rs, 6)] = FNMS(T1c, T1p, T1b); + Im[WS(rs, 6)] = FMA(Tv, T1p, T1q); + } + { + E T1r, T1t, T1u, T1w; + T1r = W[8]; + T1t = T1r * T1s; + T1u = W[9]; + T1w = T1u * T1s; + Ip[WS(rs, 2)] = FNMS(T1u, T1v, T1t); + Im[WS(rs, 2)] = FMA(T1r, T1v, T1w); + } + } + { + E T2i, T2q, T2n, T2t; + { + E T2g, T2h, T2l, T2m; + T2g = FMA(KP707106781, T1P, T1O); + T2h = T24 + T25; + T2i = FNMS(KP923879532, T2h, T2g); + T2q = FMA(KP923879532, T2h, T2g); + T2l = FNMS(KP707106781, T22, T21); + T2m = T1W - T1T; + T2n = FMA(KP923879532, T2m, T2l); + T2t = FNMS(KP923879532, T2m, T2l); + } + { + E T2j, T2o, T2f, T2k; + T2f = W[12]; + T2j = T2f * T2i; + T2o = T2f * T2n; + T2k = W[13]; + Ip[WS(rs, 3)] = FNMS(T2k, T2n, T2j); + Im[WS(rs, 3)] = FMA(T2k, T2i, T2o); + } + { + E T2r, T2u, T2p, T2s; + T2p = W[28]; + T2r = T2p * T2q; + T2u = T2p * T2t; + T2s = W[29]; + Ip[WS(rs, 7)] = FNMS(T2s, T2t, T2r); + Im[WS(rs, 7)] = FMA(T2s, T2q, T2u); + } + } + { + E T1A, T1I, T1F, T1L; + { + E T1y, T1z, T1D, T1E; + T1y = FMA(KP707106781, TL, TA); + T1z = T1m + T1n; + T1A = FNMS(KP923879532, T1z, T1y); + T1I = FMA(KP923879532, T1z, T1y); + T1D = FMA(KP707106781, T1k, T1h); + T1E = T18 + TX; + T1F = FNMS(KP923879532, T1E, T1D); + T1L = FMA(KP923879532, T1E, T1D); + } + { + E T1B, T1G, T1x, T1C; + T1x = W[16]; + T1B = T1x * T1A; + T1G = T1x * T1F; + T1C = W[17]; + Ip[WS(rs, 4)] = FNMS(T1C, T1F, T1B); + Im[WS(rs, 4)] = FMA(T1C, T1A, T1G); + } + { + E T1J, T1M, T1H, T1K; + T1H = W[0]; + T1J = T1H * T1I; + T1M = T1H * T1L; + T1K = W[1]; + Ip[0] = FNMS(T1K, T1L, T1J); + Im[0] = FMA(T1K, T1I, T1M); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cb_16", twinstr, &GENUS, {104, 30, 70, 0} }; + +void X(codelet_hc2cb_16) (planner *p) { + X(khc2c_register) (p, hc2cb_16, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hc2cb_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 136 additions, 46 multiplications, 38 fused multiply/add), + * 50 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E T7, T2K, T2W, Tw, T17, T1S, T2k, T1w, Te, TD, T1x, T10, T2n, T2L, T1Z; + E T2X, Tm, T1z, TN, T19, T2e, T2p, T2P, T2Z, Tt, T1A, TW, T1a, T27, T2q; + E T2S, T30; + { + E T3, T1Q, T13, T2j, T6, T2i, T16, T1R; + { + E T1, T2, T11, T12; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + T1Q = T1 - T2; + T11 = Ip[0]; + T12 = Im[WS(rs, 7)]; + T13 = T11 - T12; + T2j = T11 + T12; + } + { + E T4, T5, T14, T15; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + T2i = T4 - T5; + T14 = Ip[WS(rs, 4)]; + T15 = Im[WS(rs, 3)]; + T16 = T14 - T15; + T1R = T14 + T15; + } + T7 = T3 + T6; + T2K = T1Q + T1R; + T2W = T2j - T2i; + Tw = T3 - T6; + T17 = T13 - T16; + T1S = T1Q - T1R; + T2k = T2i + T2j; + T1w = T13 + T16; + } + { + E Ta, T1T, TC, T1U, Td, T1W, Tz, T1X; + { + E T8, T9, TA, TB; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T1T = T8 - T9; + TA = Ip[WS(rs, 2)]; + TB = Im[WS(rs, 5)]; + TC = TA - TB; + T1U = TA + TB; + } + { + E Tb, Tc, Tx, Ty; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + Td = Tb + Tc; + T1W = Tb - Tc; + Tx = Ip[WS(rs, 6)]; + Ty = Im[WS(rs, 1)]; + Tz = Tx - Ty; + T1X = Tx + Ty; + } + Te = Ta + Td; + TD = Tz - TC; + T1x = TC + Tz; + T10 = Ta - Td; + { + E T2l, T2m, T1V, T1Y; + T2l = T1T + T1U; + T2m = T1W + T1X; + T2n = KP707106781 * (T2l - T2m); + T2L = KP707106781 * (T2l + T2m); + T1V = T1T - T1U; + T1Y = T1W - T1X; + T1Z = KP707106781 * (T1V + T1Y); + T2X = KP707106781 * (T1V - T1Y); + } + } + { + E Ti, T2b, TI, T29, Tl, T28, TL, T2c, TF, TM; + { + E Tg, Th, TG, TH; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + T2b = Tg - Th; + TG = Ip[WS(rs, 1)]; + TH = Im[WS(rs, 6)]; + TI = TG - TH; + T29 = TG + TH; + } + { + E Tj, Tk, TJ, TK; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + T28 = Tj - Tk; + TJ = Ip[WS(rs, 5)]; + TK = Im[WS(rs, 2)]; + TL = TJ - TK; + T2c = TJ + TK; + } + Tm = Ti + Tl; + T1z = TI + TL; + TF = Ti - Tl; + TM = TI - TL; + TN = TF - TM; + T19 = TF + TM; + { + E T2a, T2d, T2N, T2O; + T2a = T28 + T29; + T2d = T2b - T2c; + T2e = FMA(KP923879532, T2a, KP382683432 * T2d); + T2p = FNMS(KP382683432, T2a, KP923879532 * T2d); + T2N = T2b + T2c; + T2O = T29 - T28; + T2P = FNMS(KP923879532, T2O, KP382683432 * T2N); + T2Z = FMA(KP382683432, T2O, KP923879532 * T2N); + } + } + { + E Tp, T24, TR, T22, Ts, T21, TU, T25, TO, TV; + { + E Tn, To, TP, TQ; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T24 = Tn - To; + TP = Ip[WS(rs, 7)]; + TQ = Im[0]; + TR = TP - TQ; + T22 = TP + TQ; + } + { + E Tq, Tr, TS, TT; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + T21 = Tq - Tr; + TS = Ip[WS(rs, 3)]; + TT = Im[WS(rs, 4)]; + TU = TS - TT; + T25 = TS + TT; + } + Tt = Tp + Ts; + T1A = TR + TU; + TO = Tp - Ts; + TV = TR - TU; + TW = TO + TV; + T1a = TV - TO; + { + E T23, T26, T2Q, T2R; + T23 = T21 - T22; + T26 = T24 - T25; + T27 = FNMS(KP382683432, T26, KP923879532 * T23); + T2q = FMA(KP382683432, T23, KP923879532 * T26); + T2Q = T24 + T25; + T2R = T21 + T22; + T2S = FNMS(KP923879532, T2R, KP382683432 * T2Q); + T30 = FMA(KP382683432, T2R, KP923879532 * T2Q); + } + } + { + E Tf, Tu, T1u, T1y, T1B, T1C, T1t, T1v; + Tf = T7 + Te; + Tu = Tm + Tt; + T1u = Tf - Tu; + T1y = T1w + T1x; + T1B = T1z + T1A; + T1C = T1y - T1B; + Rp[0] = Tf + Tu; + Rm[0] = T1y + T1B; + T1t = W[14]; + T1v = W[15]; + Rp[WS(rs, 4)] = FNMS(T1v, T1C, T1t * T1u); + Rm[WS(rs, 4)] = FMA(T1v, T1u, T1t * T1C); + } + { + E T2U, T34, T32, T36; + { + E T2M, T2T, T2Y, T31; + T2M = T2K - T2L; + T2T = T2P + T2S; + T2U = T2M - T2T; + T34 = T2M + T2T; + T2Y = T2W + T2X; + T31 = T2Z - T30; + T32 = T2Y - T31; + T36 = T2Y + T31; + } + { + E T2J, T2V, T33, T35; + T2J = W[20]; + T2V = W[21]; + Ip[WS(rs, 5)] = FNMS(T2V, T32, T2J * T2U); + Im[WS(rs, 5)] = FMA(T2V, T2U, T2J * T32); + T33 = W[4]; + T35 = W[5]; + Ip[WS(rs, 1)] = FNMS(T35, T36, T33 * T34); + Im[WS(rs, 1)] = FMA(T35, T34, T33 * T36); + } + } + { + E T3a, T3g, T3e, T3i; + { + E T38, T39, T3c, T3d; + T38 = T2K + T2L; + T39 = T2Z + T30; + T3a = T38 - T39; + T3g = T38 + T39; + T3c = T2W - T2X; + T3d = T2P - T2S; + T3e = T3c + T3d; + T3i = T3c - T3d; + } + { + E T37, T3b, T3f, T3h; + T37 = W[12]; + T3b = W[13]; + Ip[WS(rs, 3)] = FNMS(T3b, T3e, T37 * T3a); + Im[WS(rs, 3)] = FMA(T37, T3e, T3b * T3a); + T3f = W[28]; + T3h = W[29]; + Ip[WS(rs, 7)] = FNMS(T3h, T3i, T3f * T3g); + Im[WS(rs, 7)] = FMA(T3f, T3i, T3h * T3g); + } + } + { + E TY, T1e, T1c, T1g; + { + E TE, TX, T18, T1b; + TE = Tw + TD; + TX = KP707106781 * (TN + TW); + TY = TE - TX; + T1e = TE + TX; + T18 = T10 + T17; + T1b = KP707106781 * (T19 + T1a); + T1c = T18 - T1b; + T1g = T18 + T1b; + } + { + E Tv, TZ, T1d, T1f; + Tv = W[18]; + TZ = W[19]; + Rp[WS(rs, 5)] = FNMS(TZ, T1c, Tv * TY); + Rm[WS(rs, 5)] = FMA(TZ, TY, Tv * T1c); + T1d = W[2]; + T1f = W[3]; + Rp[WS(rs, 1)] = FNMS(T1f, T1g, T1d * T1e); + Rm[WS(rs, 1)] = FMA(T1f, T1e, T1d * T1g); + } + } + { + E T1k, T1q, T1o, T1s; + { + E T1i, T1j, T1m, T1n; + T1i = Tw - TD; + T1j = KP707106781 * (T1a - T19); + T1k = T1i - T1j; + T1q = T1i + T1j; + T1m = T17 - T10; + T1n = KP707106781 * (TN - TW); + T1o = T1m - T1n; + T1s = T1m + T1n; + } + { + E T1h, T1l, T1p, T1r; + T1h = W[26]; + T1l = W[27]; + Rp[WS(rs, 7)] = FNMS(T1l, T1o, T1h * T1k); + Rm[WS(rs, 7)] = FMA(T1h, T1o, T1l * T1k); + T1p = W[10]; + T1r = W[11]; + Rp[WS(rs, 3)] = FNMS(T1r, T1s, T1p * T1q); + Rm[WS(rs, 3)] = FMA(T1p, T1s, T1r * T1q); + } + } + { + E T2g, T2u, T2s, T2w; + { + E T20, T2f, T2o, T2r; + T20 = T1S - T1Z; + T2f = T27 - T2e; + T2g = T20 - T2f; + T2u = T20 + T2f; + T2o = T2k - T2n; + T2r = T2p - T2q; + T2s = T2o - T2r; + T2w = T2o + T2r; + } + { + E T1P, T2h, T2t, T2v; + T1P = W[24]; + T2h = W[25]; + Ip[WS(rs, 6)] = FNMS(T2h, T2s, T1P * T2g); + Im[WS(rs, 6)] = FMA(T2h, T2g, T1P * T2s); + T2t = W[8]; + T2v = W[9]; + Ip[WS(rs, 2)] = FNMS(T2v, T2w, T2t * T2u); + Im[WS(rs, 2)] = FMA(T2v, T2u, T2t * T2w); + } + } + { + E T2A, T2G, T2E, T2I; + { + E T2y, T2z, T2C, T2D; + T2y = T1S + T1Z; + T2z = T2p + T2q; + T2A = T2y - T2z; + T2G = T2y + T2z; + T2C = T2k + T2n; + T2D = T2e + T27; + T2E = T2C - T2D; + T2I = T2C + T2D; + } + { + E T2x, T2B, T2F, T2H; + T2x = W[16]; + T2B = W[17]; + Ip[WS(rs, 4)] = FNMS(T2B, T2E, T2x * T2A); + Im[WS(rs, 4)] = FMA(T2x, T2E, T2B * T2A); + T2F = W[0]; + T2H = W[1]; + Ip[0] = FNMS(T2H, T2I, T2F * T2G); + Im[0] = FMA(T2F, T2I, T2H * T2G); + } + } + { + E T1G, T1M, T1K, T1O; + { + E T1E, T1F, T1I, T1J; + T1E = T7 - Te; + T1F = T1A - T1z; + T1G = T1E - T1F; + T1M = T1E + T1F; + T1I = T1w - T1x; + T1J = Tm - Tt; + T1K = T1I - T1J; + T1O = T1J + T1I; + } + { + E T1D, T1H, T1L, T1N; + T1D = W[22]; + T1H = W[23]; + Rp[WS(rs, 6)] = FNMS(T1H, T1K, T1D * T1G); + Rm[WS(rs, 6)] = FMA(T1D, T1K, T1H * T1G); + T1L = W[6]; + T1N = W[7]; + Rp[WS(rs, 2)] = FNMS(T1N, T1O, T1L * T1M); + Rm[WS(rs, 2)] = FMA(T1L, T1O, T1N * T1M); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cb_16", twinstr, &GENUS, {136, 46, 38, 0} }; + +void X(codelet_hc2cb_16) (planner *p) { + X(khc2c_register) (p, hc2cb_16, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_2.c new file mode 100644 index 000000000..1921700fa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_2.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:51 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -dif -name hc2cb_2 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, T2, T6, T3, T4, T9; + T1 = Rp[0]; + T2 = Rm[0]; + T6 = T1 - T2; + T3 = Ip[0]; + T4 = Im[0]; + T9 = T3 + T4; + Rp[0] = T1 + T2; + Rm[0] = T3 - T4; + { + E T5, T7, T8, Ta; + T5 = W[0]; + T7 = T5 * T6; + T8 = W[1]; + Ta = T8 * T6; + Ip[0] = FNMS(T8, T9, T7); + Im[0] = FMA(T5, T9, Ta); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cb_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hc2cb_2) (planner *p) { + X(khc2c_register) (p, hc2cb_2, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -dif -name hc2cb_2 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, T2, T6, T3, T4, T8, T5, T7; + T1 = Rp[0]; + T2 = Rm[0]; + T6 = T1 - T2; + T3 = Ip[0]; + T4 = Im[0]; + T8 = T3 + T4; + Rp[0] = T1 + T2; + Rm[0] = T3 - T4; + T5 = W[0]; + T7 = W[1]; + Ip[0] = FNMS(T7, T8, T5 * T6); + Im[0] = FMA(T7, T6, T5 * T8); + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cb_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hc2cb_2) (planner *p) { + X(khc2c_register) (p, hc2cb_2, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_20.c new file mode 100644 index 000000000..9fe6faabd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_20.c @@ -0,0 +1,1064 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:54 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hc2cb_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 246 FP additions, 148 FP multiplications, + * (or, 136 additions, 38 multiplications, 110 fused multiply/add), + * 91 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T7, T4e, T4z, TE, T1t, T2W, T3z, T2l, T13, T3G, T3H, T1i, T2g, T4H, T4G; + E T2d, T1B, T4u, T4r, T1A, T2s, T3l, T2t, T3s, T2m, T2n, T2o, T1u, T1v, T1w; + E TC, T29, T3C, T3E, T4l, T4n, TL, TN, T3b, T3d, T4C, T4E; + { + E T3, T2U, T1p, T3x, T6, T3y, T1s, T2V; + { + E T1, T2, T1n, T1o; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T2U = T1 - T2; + T1n = Ip[0]; + T1o = Im[WS(rs, 9)]; + T1p = T1n - T1o; + T3x = T1n + T1o; + } + { + E T4, T5, T1q, T1r; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + T3y = T4 - T5; + T1q = Ip[WS(rs, 5)]; + T1r = Im[WS(rs, 4)]; + T1s = T1q - T1r; + T2V = T1q + T1r; + } + T7 = T3 + T6; + T4e = T2U - T2V; + T4z = T3y + T3x; + TE = T3 - T6; + T1t = T1p - T1s; + T2W = T2U + T2V; + T3z = T3x - T3y; + T2l = T1p + T1s; + } + { + E Te, T4f, T4p, TF, T1a, T2Z, T3o, T2b, TA, T4j, T4t, TJ, T12, T39, T3k; + E T2f, Tl, T4g, T4q, TG, T1h, T32, T3r, T2c, Tt, T4i, T4s, TI, TV, T36; + E T3h, T2e; + { + E Ta, T2X, T16, T3m, Td, T3n, T19, T2Y; + { + E T8, T9, T14, T15; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T2X = T8 - T9; + T14 = Ip[WS(rs, 4)]; + T15 = Im[WS(rs, 5)]; + T16 = T14 - T15; + T3m = T14 + T15; + } + { + E Tb, Tc, T17, T18; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + T3n = Tb - Tc; + T17 = Ip[WS(rs, 9)]; + T18 = Im[0]; + T19 = T17 - T18; + T2Y = T17 + T18; + } + Te = Ta + Td; + T4f = T2X - T2Y; + T4p = T3n + T3m; + TF = Ta - Td; + T1a = T16 - T19; + T2Z = T2X + T2Y; + T3o = T3m - T3n; + T2b = T16 + T19; + } + { + E Tw, T37, TY, T3j, Tz, T3i, T11, T38; + { + E Tu, Tv, TW, TX; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T37 = Tu - Tv; + TW = Ip[WS(rs, 2)]; + TX = Im[WS(rs, 7)]; + TY = TW - TX; + T3j = TW + TX; + } + { + E Tx, Ty, TZ, T10; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + T3i = Tx - Ty; + TZ = Ip[WS(rs, 7)]; + T10 = Im[WS(rs, 2)]; + T11 = TZ - T10; + T38 = TZ + T10; + } + TA = Tw + Tz; + T4j = T37 + T38; + T4t = T3i - T3j; + TJ = Tw - Tz; + T12 = TY - T11; + T39 = T37 - T38; + T3k = T3i + T3j; + T2f = TY + T11; + } + { + E Th, T30, T1d, T3q, Tk, T3p, T1g, T31; + { + E Tf, Tg, T1b, T1c; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T30 = Tf - Tg; + T1b = Ip[WS(rs, 6)]; + T1c = Im[WS(rs, 3)]; + T1d = T1b - T1c; + T3q = T1b + T1c; + } + { + E Ti, Tj, T1e, T1f; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + T3p = Ti - Tj; + T1e = Ip[WS(rs, 1)]; + T1f = Im[WS(rs, 8)]; + T1g = T1e - T1f; + T31 = T1e + T1f; + } + Tl = Th + Tk; + T4g = T30 - T31; + T4q = T3p - T3q; + TG = Th - Tk; + T1h = T1d - T1g; + T32 = T30 + T31; + T3r = T3p + T3q; + T2c = T1d + T1g; + } + { + E Tp, T34, TR, T3f, Ts, T3g, TU, T35; + { + E Tn, To, TP, TQ; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T34 = Tn - To; + TP = Ip[WS(rs, 8)]; + TQ = Im[WS(rs, 1)]; + TR = TP - TQ; + T3f = TP + TQ; + } + { + E Tq, Tr, TS, TT; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + T3g = Tq - Tr; + TS = Ip[WS(rs, 3)]; + TT = Im[WS(rs, 6)]; + TU = TS - TT; + T35 = TS + TT; + } + Tt = Tp + Ts; + T4i = T34 + T35; + T4s = T3g + T3f; + TI = Tp - Ts; + TV = TR - TU; + T36 = T34 - T35; + T3h = T3f - T3g; + T2e = TR + TU; + } + T13 = TV - T12; + T3G = T36 - T39; + T3H = T2Z - T32; + T1i = T1a - T1h; + T2g = T2e - T2f; + T4H = T4i - T4j; + T4G = T4f - T4g; + T2d = T2b - T2c; + T1B = TF - TG; + T4u = T4s - T4t; + T4r = T4p - T4q; + T1A = TI - TJ; + T2s = Te - Tl; + T3l = T3h + T3k; + T2t = Tt - TA; + T3s = T3o + T3r; + T2m = T2b + T2c; + T2n = T2e + T2f; + T2o = T2m + T2n; + T1u = T1a + T1h; + T1v = TV + T12; + T1w = T1u + T1v; + { + E Tm, TB, TH, TK; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T29 = Tm - TB; + { + E T3A, T3B, T4h, T4k; + T3A = T3o - T3r; + T3B = T3h - T3k; + T3C = T3A + T3B; + T3E = T3A - T3B; + T4h = T4f + T4g; + T4k = T4i + T4j; + T4l = T4h + T4k; + T4n = T4h - T4k; + } + TH = TF + TG; + TK = TI + TJ; + TL = TH + TK; + TN = TH - TK; + { + E T33, T3a, T4A, T4B; + T33 = T2Z + T32; + T3a = T36 + T39; + T3b = T33 + T3a; + T3d = T33 - T3a; + T4A = T4p + T4q; + T4B = T4s + T4t; + T4C = T4A + T4B; + T4E = T4A - T4B; + } + } + } + Rp[0] = T7 + TC; + Rm[0] = T2l + T2o; + { + E T25, T21, T23, T24, T26, T22; + T25 = T1t + T1w; + T22 = TE + TL; + T21 = W[18]; + T23 = T21 * T22; + T24 = W[19]; + T26 = T24 * T22; + Rp[WS(rs, 5)] = FNMS(T24, T25, T23); + Rm[WS(rs, 5)] = FMA(T21, T25, T26); + } + { + E T58, T5b, T59, T5c, T57, T5a; + T58 = T4e + T4l; + T5b = T4z + T4C; + T57 = W[8]; + T59 = T57 * T58; + T5c = T57 * T5b; + T5a = W[9]; + Ip[WS(rs, 2)] = FNMS(T5a, T5b, T59); + Im[WS(rs, 2)] = FMA(T5a, T58, T5c); + } + { + E T48, T4b, T49, T4c, T47, T4a; + T48 = T2W + T3b; + T4b = T3z + T3C; + T47 = W[28]; + T49 = T47 * T48; + T4c = T47 * T4b; + T4a = W[29]; + Ip[WS(rs, 7)] = FNMS(T4a, T4b, T49); + Im[WS(rs, 7)] = FMA(T4a, T48, T4c); + } + { + E T3u, T42, T3M, T3U, T3J, T45, T3P, T3Z; + { + E T3t, T3T, T3e, T3S, T3c; + T3t = FNMS(KP618033988, T3s, T3l); + T3T = FMA(KP618033988, T3l, T3s); + T3c = FNMS(KP250000000, T3b, T2W); + T3e = FNMS(KP559016994, T3d, T3c); + T3S = FMA(KP559016994, T3d, T3c); + T3u = FNMS(KP951056516, T3t, T3e); + T42 = FMA(KP951056516, T3T, T3S); + T3M = FMA(KP951056516, T3t, T3e); + T3U = FNMS(KP951056516, T3T, T3S); + } + { + E T3I, T3Y, T3F, T3X, T3D; + T3I = FNMS(KP618033988, T3H, T3G); + T3Y = FMA(KP618033988, T3G, T3H); + T3D = FNMS(KP250000000, T3C, T3z); + T3F = FNMS(KP559016994, T3E, T3D); + T3X = FMA(KP559016994, T3E, T3D); + T3J = FMA(KP951056516, T3I, T3F); + T45 = FNMS(KP951056516, T3Y, T3X); + T3P = FNMS(KP951056516, T3I, T3F); + T3Z = FMA(KP951056516, T3Y, T3X); + } + { + E T3v, T3K, T2T, T3w; + T2T = W[4]; + T3v = T2T * T3u; + T3K = T2T * T3J; + T3w = W[5]; + Ip[WS(rs, 1)] = FNMS(T3w, T3J, T3v); + Im[WS(rs, 1)] = FMA(T3w, T3u, T3K); + } + { + E T43, T46, T41, T44; + T41 = W[36]; + T43 = T41 * T42; + T46 = T41 * T45; + T44 = W[37]; + Ip[WS(rs, 9)] = FNMS(T44, T45, T43); + Im[WS(rs, 9)] = FMA(T44, T42, T46); + } + { + E T3N, T3Q, T3L, T3O; + T3L = W[12]; + T3N = T3L * T3M; + T3Q = T3L * T3P; + T3O = W[13]; + Ip[WS(rs, 3)] = FNMS(T3O, T3P, T3N); + Im[WS(rs, 3)] = FMA(T3O, T3M, T3Q); + } + { + E T3V, T40, T3R, T3W; + T3R = W[20]; + T3V = T3R * T3U; + T40 = T3R * T3Z; + T3W = W[21]; + Ip[WS(rs, 5)] = FNMS(T3W, T3Z, T3V); + Im[WS(rs, 5)] = FMA(T3W, T3U, T40); + } + } + { + E T4w, T52, T4M, T4U, T4J, T55, T4P, T4Z; + { + E T4v, T4T, T4o, T4S, T4m; + T4v = FMA(KP618033988, T4u, T4r); + T4T = FNMS(KP618033988, T4r, T4u); + T4m = FNMS(KP250000000, T4l, T4e); + T4o = FMA(KP559016994, T4n, T4m); + T4S = FNMS(KP559016994, T4n, T4m); + T4w = FNMS(KP951056516, T4v, T4o); + T52 = FMA(KP951056516, T4T, T4S); + T4M = FMA(KP951056516, T4v, T4o); + T4U = FNMS(KP951056516, T4T, T4S); + } + { + E T4I, T4Y, T4F, T4X, T4D; + T4I = FMA(KP618033988, T4H, T4G); + T4Y = FNMS(KP618033988, T4G, T4H); + T4D = FNMS(KP250000000, T4C, T4z); + T4F = FMA(KP559016994, T4E, T4D); + T4X = FNMS(KP559016994, T4E, T4D); + T4J = FMA(KP951056516, T4I, T4F); + T55 = FNMS(KP951056516, T4Y, T4X); + T4P = FNMS(KP951056516, T4I, T4F); + T4Z = FMA(KP951056516, T4Y, T4X); + } + { + E T4x, T4K, T4d, T4y; + T4d = W[0]; + T4x = T4d * T4w; + T4K = T4d * T4J; + T4y = W[1]; + Ip[0] = FNMS(T4y, T4J, T4x); + Im[0] = FMA(T4y, T4w, T4K); + } + { + E T53, T56, T51, T54; + T51 = W[32]; + T53 = T51 * T52; + T56 = T51 * T55; + T54 = W[33]; + Ip[WS(rs, 8)] = FNMS(T54, T55, T53); + Im[WS(rs, 8)] = FMA(T54, T52, T56); + } + { + E T4N, T4Q, T4L, T4O; + T4L = W[16]; + T4N = T4L * T4M; + T4Q = T4L * T4P; + T4O = W[17]; + Ip[WS(rs, 4)] = FNMS(T4O, T4P, T4N); + Im[WS(rs, 4)] = FMA(T4O, T4M, T4Q); + } + { + E T4V, T50, T4R, T4W; + T4R = W[24]; + T4V = T4R * T4U; + T50 = T4R * T4Z; + T4W = W[25]; + Ip[WS(rs, 6)] = FNMS(T4W, T4Z, T4V); + Im[WS(rs, 6)] = FMA(T4W, T4U, T50); + } + } + { + E T2u, T2K, T2r, T2J, T2i, T2O, T2y, T2G, T2p, T2q; + T2u = FMA(KP618033988, T2t, T2s); + T2K = FNMS(KP618033988, T2s, T2t); + T2p = FNMS(KP250000000, T2o, T2l); + T2q = T2m - T2n; + T2r = FMA(KP559016994, T2q, T2p); + T2J = FNMS(KP559016994, T2q, T2p); + { + E T2h, T2F, T2a, T2E, T28; + T2h = FMA(KP618033988, T2g, T2d); + T2F = FNMS(KP618033988, T2d, T2g); + T28 = FNMS(KP250000000, TC, T7); + T2a = FMA(KP559016994, T29, T28); + T2E = FNMS(KP559016994, T29, T28); + T2i = FMA(KP951056516, T2h, T2a); + T2O = FMA(KP951056516, T2F, T2E); + T2y = FNMS(KP951056516, T2h, T2a); + T2G = FNMS(KP951056516, T2F, T2E); + } + { + E T2v, T2k, T2w, T27, T2j; + T2v = FNMS(KP951056516, T2u, T2r); + T2k = W[7]; + T2w = T2k * T2i; + T27 = W[6]; + T2j = T27 * T2i; + Rp[WS(rs, 2)] = FNMS(T2k, T2v, T2j); + Rm[WS(rs, 2)] = FMA(T27, T2v, T2w); + } + { + E T2R, T2Q, T2S, T2N, T2P; + T2R = FNMS(KP951056516, T2K, T2J); + T2Q = W[23]; + T2S = T2Q * T2O; + T2N = W[22]; + T2P = T2N * T2O; + Rp[WS(rs, 6)] = FNMS(T2Q, T2R, T2P); + Rm[WS(rs, 6)] = FMA(T2N, T2R, T2S); + } + { + E T2B, T2A, T2C, T2x, T2z; + T2B = FMA(KP951056516, T2u, T2r); + T2A = W[31]; + T2C = T2A * T2y; + T2x = W[30]; + T2z = T2x * T2y; + Rp[WS(rs, 8)] = FNMS(T2A, T2B, T2z); + Rm[WS(rs, 8)] = FMA(T2x, T2B, T2C); + } + { + E T2L, T2I, T2M, T2D, T2H; + T2L = FMA(KP951056516, T2K, T2J); + T2I = W[15]; + T2M = T2I * T2G; + T2D = W[14]; + T2H = T2D * T2G; + Rp[WS(rs, 4)] = FNMS(T2I, T2L, T2H); + Rm[WS(rs, 4)] = FMA(T2D, T2L, T2M); + } + } + { + E T1C, T1S, T1z, T1R, T1k, T1W, T1G, T1O, T1x, T1y; + T1C = FNMS(KP618033988, T1B, T1A); + T1S = FMA(KP618033988, T1A, T1B); + T1x = FNMS(KP250000000, T1w, T1t); + T1y = T1u - T1v; + T1z = FNMS(KP559016994, T1y, T1x); + T1R = FMA(KP559016994, T1y, T1x); + { + E T1j, T1N, TO, T1M, TM; + T1j = FNMS(KP618033988, T1i, T13); + T1N = FMA(KP618033988, T13, T1i); + TM = FNMS(KP250000000, TL, TE); + TO = FNMS(KP559016994, TN, TM); + T1M = FMA(KP559016994, TN, TM); + T1k = FMA(KP951056516, T1j, TO); + T1W = FMA(KP951056516, T1N, T1M); + T1G = FNMS(KP951056516, T1j, TO); + T1O = FNMS(KP951056516, T1N, T1M); + } + { + E T1D, T1m, T1E, TD, T1l; + T1D = FNMS(KP951056516, T1C, T1z); + T1m = W[3]; + T1E = T1m * T1k; + TD = W[2]; + T1l = TD * T1k; + Rp[WS(rs, 1)] = FNMS(T1m, T1D, T1l); + Rm[WS(rs, 1)] = FMA(TD, T1D, T1E); + } + { + E T1Z, T1Y, T20, T1V, T1X; + T1Z = FNMS(KP951056516, T1S, T1R); + T1Y = W[27]; + T20 = T1Y * T1W; + T1V = W[26]; + T1X = T1V * T1W; + Rp[WS(rs, 7)] = FNMS(T1Y, T1Z, T1X); + Rm[WS(rs, 7)] = FMA(T1V, T1Z, T20); + } + { + E T1J, T1I, T1K, T1F, T1H; + T1J = FMA(KP951056516, T1C, T1z); + T1I = W[35]; + T1K = T1I * T1G; + T1F = W[34]; + T1H = T1F * T1G; + Rp[WS(rs, 9)] = FNMS(T1I, T1J, T1H); + Rm[WS(rs, 9)] = FMA(T1F, T1J, T1K); + } + { + E T1T, T1Q, T1U, T1L, T1P; + T1T = FMA(KP951056516, T1S, T1R); + T1Q = W[11]; + T1U = T1Q * T1O; + T1L = W[10]; + T1P = T1L * T1O; + Rp[WS(rs, 3)] = FNMS(T1Q, T1T, T1P); + Rm[WS(rs, 3)] = FMA(T1L, T1T, T1U); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cb_20", twinstr, &GENUS, {136, 38, 110, 0} }; + +void X(codelet_hc2cb_20) (planner *p) { + X(khc2c_register) (p, hc2cb_20, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hc2cb_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 246 FP additions, 124 FP multiplications, + * (or, 184 additions, 62 multiplications, 62 fused multiply/add), + * 97 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T7, T3T, T49, TE, T1v, T2T, T3g, T2d, T13, T3n, T3o, T1i, T26, T4e, T4d; + E T23, T1n, T42, T3Z, T1m, T2h, T2I, T2i, T2P, T30, T37, T38, Tm, TB, TC; + E T46, T47, T4a, T2a, T2b, T2e, T1w, T1x, T1y, T3O, T3R, T3U, T3h, T3i, T3j; + E TH, TK, TL; + { + E T3, T2R, T1r, T3e, T6, T3f, T1u, T2S; + { + E T1, T2, T1p, T1q; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T2R = T1 - T2; + T1p = Ip[0]; + T1q = Im[WS(rs, 9)]; + T1r = T1p - T1q; + T3e = T1p + T1q; + } + { + E T4, T5, T1s, T1t; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + T3f = T4 - T5; + T1s = Ip[WS(rs, 5)]; + T1t = Im[WS(rs, 4)]; + T1u = T1s - T1t; + T2S = T1s + T1t; + } + T7 = T3 + T6; + T3T = T2R - T2S; + T49 = T3f + T3e; + TE = T3 - T6; + T1v = T1r - T1u; + T2T = T2R + T2S; + T3g = T3e - T3f; + T2d = T1r + T1u; + } + { + E Te, T3M, T3X, TF, TV, T2E, T2W, T21, TA, T3Q, T41, TJ, T1h, T2O, T36; + E T25, Tl, T3N, T3Y, TG, T12, T2H, T2Z, T22, Tt, T3P, T40, TI, T1a, T2L; + E T33, T24; + { + E Ta, T2U, TR, T2C, Td, T2D, TU, T2V; + { + E T8, T9, TP, TQ; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T2U = T8 - T9; + TP = Ip[WS(rs, 4)]; + TQ = Im[WS(rs, 5)]; + TR = TP - TQ; + T2C = TP + TQ; + } + { + E Tb, Tc, TS, TT; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + T2D = Tb - Tc; + TS = Ip[WS(rs, 9)]; + TT = Im[0]; + TU = TS - TT; + T2V = TS + TT; + } + Te = Ta + Td; + T3M = T2U - T2V; + T3X = T2D + T2C; + TF = Ta - Td; + TV = TR - TU; + T2E = T2C - T2D; + T2W = T2U + T2V; + T21 = TR + TU; + } + { + E Tw, T34, T1d, T2N, Tz, T2M, T1g, T35; + { + E Tu, Tv, T1b, T1c; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T34 = Tu - Tv; + T1b = Ip[WS(rs, 2)]; + T1c = Im[WS(rs, 7)]; + T1d = T1b - T1c; + T2N = T1b + T1c; + } + { + E Tx, Ty, T1e, T1f; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + T2M = Tx - Ty; + T1e = Ip[WS(rs, 7)]; + T1f = Im[WS(rs, 2)]; + T1g = T1e - T1f; + T35 = T1e + T1f; + } + TA = Tw + Tz; + T3Q = T34 + T35; + T41 = T2M - T2N; + TJ = Tw - Tz; + T1h = T1d - T1g; + T2O = T2M + T2N; + T36 = T34 - T35; + T25 = T1d + T1g; + } + { + E Th, T2X, TY, T2G, Tk, T2F, T11, T2Y; + { + E Tf, Tg, TW, TX; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T2X = Tf - Tg; + TW = Ip[WS(rs, 6)]; + TX = Im[WS(rs, 3)]; + TY = TW - TX; + T2G = TW + TX; + } + { + E Ti, Tj, TZ, T10; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + T2F = Ti - Tj; + TZ = Ip[WS(rs, 1)]; + T10 = Im[WS(rs, 8)]; + T11 = TZ - T10; + T2Y = TZ + T10; + } + Tl = Th + Tk; + T3N = T2X - T2Y; + T3Y = T2F - T2G; + TG = Th - Tk; + T12 = TY - T11; + T2H = T2F + T2G; + T2Z = T2X + T2Y; + T22 = TY + T11; + } + { + E Tp, T31, T16, T2J, Ts, T2K, T19, T32; + { + E Tn, To, T14, T15; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T31 = Tn - To; + T14 = Ip[WS(rs, 8)]; + T15 = Im[WS(rs, 1)]; + T16 = T14 - T15; + T2J = T14 + T15; + } + { + E Tq, Tr, T17, T18; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + T2K = Tq - Tr; + T17 = Ip[WS(rs, 3)]; + T18 = Im[WS(rs, 6)]; + T19 = T17 - T18; + T32 = T17 + T18; + } + Tt = Tp + Ts; + T3P = T31 + T32; + T40 = T2K + T2J; + TI = Tp - Ts; + T1a = T16 - T19; + T2L = T2J - T2K; + T33 = T31 - T32; + T24 = T16 + T19; + } + T13 = TV - T12; + T3n = T2W - T2Z; + T3o = T33 - T36; + T1i = T1a - T1h; + T26 = T24 - T25; + T4e = T3P - T3Q; + T4d = T3M - T3N; + T23 = T21 - T22; + T1n = TI - TJ; + T42 = T40 - T41; + T3Z = T3X - T3Y; + T1m = TF - TG; + T2h = Te - Tl; + T2I = T2E + T2H; + T2i = Tt - TA; + T2P = T2L + T2O; + T30 = T2W + T2Z; + T37 = T33 + T36; + T38 = T30 + T37; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T46 = T3X + T3Y; + T47 = T40 + T41; + T4a = T46 + T47; + T2a = T21 + T22; + T2b = T24 + T25; + T2e = T2a + T2b; + T1w = TV + T12; + T1x = T1a + T1h; + T1y = T1w + T1x; + T3O = T3M + T3N; + T3R = T3P + T3Q; + T3U = T3O + T3R; + T3h = T2E - T2H; + T3i = T2L - T2O; + T3j = T3h + T3i; + TH = TF + TG; + TK = TI + TJ; + TL = TH + TK; + } + Rp[0] = T7 + TC; + Rm[0] = T2d + T2e; + { + E T1U, T1W, T1T, T1V; + T1U = TE + TL; + T1W = T1v + T1y; + T1T = W[18]; + T1V = W[19]; + Rp[WS(rs, 5)] = FNMS(T1V, T1W, T1T * T1U); + Rm[WS(rs, 5)] = FMA(T1V, T1U, T1T * T1W); + } + { + E T4y, T4A, T4x, T4z; + T4y = T3T + T3U; + T4A = T49 + T4a; + T4x = W[8]; + T4z = W[9]; + Ip[WS(rs, 2)] = FNMS(T4z, T4A, T4x * T4y); + Im[WS(rs, 2)] = FMA(T4x, T4A, T4z * T4y); + } + { + E T3I, T3K, T3H, T3J; + T3I = T2T + T38; + T3K = T3g + T3j; + T3H = W[28]; + T3J = W[29]; + Ip[WS(rs, 7)] = FNMS(T3J, T3K, T3H * T3I); + Im[WS(rs, 7)] = FMA(T3H, T3K, T3J * T3I); + } + { + E T27, T2j, T2v, T2r, T2g, T2u, T20, T2q; + T27 = FMA(KP951056516, T23, KP587785252 * T26); + T2j = FMA(KP951056516, T2h, KP587785252 * T2i); + T2v = FNMS(KP951056516, T2i, KP587785252 * T2h); + T2r = FNMS(KP951056516, T26, KP587785252 * T23); + { + E T2c, T2f, T1Y, T1Z; + T2c = KP559016994 * (T2a - T2b); + T2f = FNMS(KP250000000, T2e, T2d); + T2g = T2c + T2f; + T2u = T2f - T2c; + T1Y = KP559016994 * (Tm - TB); + T1Z = FNMS(KP250000000, TC, T7); + T20 = T1Y + T1Z; + T2q = T1Z - T1Y; + } + { + E T28, T2k, T1X, T29; + T28 = T20 + T27; + T2k = T2g - T2j; + T1X = W[6]; + T29 = W[7]; + Rp[WS(rs, 2)] = FNMS(T29, T2k, T1X * T28); + Rm[WS(rs, 2)] = FMA(T29, T28, T1X * T2k); + } + { + E T2y, T2A, T2x, T2z; + T2y = T2q - T2r; + T2A = T2v + T2u; + T2x = W[22]; + T2z = W[23]; + Rp[WS(rs, 6)] = FNMS(T2z, T2A, T2x * T2y); + Rm[WS(rs, 6)] = FMA(T2z, T2y, T2x * T2A); + } + { + E T2m, T2o, T2l, T2n; + T2m = T20 - T27; + T2o = T2j + T2g; + T2l = W[30]; + T2n = W[31]; + Rp[WS(rs, 8)] = FNMS(T2n, T2o, T2l * T2m); + Rm[WS(rs, 8)] = FMA(T2n, T2m, T2l * T2o); + } + { + E T2s, T2w, T2p, T2t; + T2s = T2q + T2r; + T2w = T2u - T2v; + T2p = W[14]; + T2t = W[15]; + Rp[WS(rs, 4)] = FNMS(T2t, T2w, T2p * T2s); + Rm[WS(rs, 4)] = FMA(T2t, T2s, T2p * T2w); + } + } + { + E T43, T4f, T4r, T4m, T4c, T4q, T3W, T4n; + T43 = FMA(KP951056516, T3Z, KP587785252 * T42); + T4f = FMA(KP951056516, T4d, KP587785252 * T4e); + T4r = FNMS(KP951056516, T4e, KP587785252 * T4d); + T4m = FNMS(KP951056516, T42, KP587785252 * T3Z); + { + E T48, T4b, T3S, T3V; + T48 = KP559016994 * (T46 - T47); + T4b = FNMS(KP250000000, T4a, T49); + T4c = T48 + T4b; + T4q = T4b - T48; + T3S = KP559016994 * (T3O - T3R); + T3V = FNMS(KP250000000, T3U, T3T); + T3W = T3S + T3V; + T4n = T3V - T3S; + } + { + E T44, T4g, T3L, T45; + T44 = T3W - T43; + T4g = T4c + T4f; + T3L = W[0]; + T45 = W[1]; + Ip[0] = FNMS(T45, T4g, T3L * T44); + Im[0] = FMA(T3L, T4g, T45 * T44); + } + { + E T4u, T4w, T4t, T4v; + T4u = T4n - T4m; + T4w = T4q + T4r; + T4t = W[32]; + T4v = W[33]; + Ip[WS(rs, 8)] = FNMS(T4v, T4w, T4t * T4u); + Im[WS(rs, 8)] = FMA(T4t, T4w, T4v * T4u); + } + { + E T4i, T4k, T4h, T4j; + T4i = T43 + T3W; + T4k = T4c - T4f; + T4h = W[16]; + T4j = W[17]; + Ip[WS(rs, 4)] = FNMS(T4j, T4k, T4h * T4i); + Im[WS(rs, 4)] = FMA(T4h, T4k, T4j * T4i); + } + { + E T4o, T4s, T4l, T4p; + T4o = T4m + T4n; + T4s = T4q - T4r; + T4l = W[24]; + T4p = W[25]; + Ip[WS(rs, 6)] = FNMS(T4p, T4s, T4l * T4o); + Im[WS(rs, 6)] = FMA(T4l, T4s, T4p * T4o); + } + } + { + E T1j, T1o, T1M, T1J, T1B, T1N, TO, T1I; + T1j = FNMS(KP951056516, T1i, KP587785252 * T13); + T1o = FNMS(KP951056516, T1n, KP587785252 * T1m); + T1M = FMA(KP951056516, T1m, KP587785252 * T1n); + T1J = FMA(KP951056516, T13, KP587785252 * T1i); + { + E T1z, T1A, TM, TN; + T1z = FNMS(KP250000000, T1y, T1v); + T1A = KP559016994 * (T1w - T1x); + T1B = T1z - T1A; + T1N = T1A + T1z; + TM = FNMS(KP250000000, TL, TE); + TN = KP559016994 * (TH - TK); + TO = TM - TN; + T1I = TN + TM; + } + { + E T1k, T1C, TD, T1l; + T1k = TO - T1j; + T1C = T1o + T1B; + TD = W[2]; + T1l = W[3]; + Rp[WS(rs, 1)] = FNMS(T1l, T1C, TD * T1k); + Rm[WS(rs, 1)] = FMA(T1l, T1k, TD * T1C); + } + { + E T1Q, T1S, T1P, T1R; + T1Q = T1I + T1J; + T1S = T1N - T1M; + T1P = W[26]; + T1R = W[27]; + Rp[WS(rs, 7)] = FNMS(T1R, T1S, T1P * T1Q); + Rm[WS(rs, 7)] = FMA(T1R, T1Q, T1P * T1S); + } + { + E T1E, T1G, T1D, T1F; + T1E = TO + T1j; + T1G = T1B - T1o; + T1D = W[34]; + T1F = W[35]; + Rp[WS(rs, 9)] = FNMS(T1F, T1G, T1D * T1E); + Rm[WS(rs, 9)] = FMA(T1F, T1E, T1D * T1G); + } + { + E T1K, T1O, T1H, T1L; + T1K = T1I - T1J; + T1O = T1M + T1N; + T1H = W[10]; + T1L = W[11]; + Rp[WS(rs, 3)] = FNMS(T1L, T1O, T1H * T1K); + Rm[WS(rs, 3)] = FMA(T1L, T1K, T1H * T1O); + } + } + { + E T2Q, T3p, T3B, T3x, T3m, T3A, T3b, T3w; + T2Q = FNMS(KP951056516, T2P, KP587785252 * T2I); + T3p = FNMS(KP951056516, T3o, KP587785252 * T3n); + T3B = FMA(KP951056516, T3n, KP587785252 * T3o); + T3x = FMA(KP951056516, T2I, KP587785252 * T2P); + { + E T3k, T3l, T39, T3a; + T3k = FNMS(KP250000000, T3j, T3g); + T3l = KP559016994 * (T3h - T3i); + T3m = T3k - T3l; + T3A = T3l + T3k; + T39 = FNMS(KP250000000, T38, T2T); + T3a = KP559016994 * (T30 - T37); + T3b = T39 - T3a; + T3w = T3a + T39; + } + { + E T3c, T3q, T2B, T3d; + T3c = T2Q + T3b; + T3q = T3m - T3p; + T2B = W[4]; + T3d = W[5]; + Ip[WS(rs, 1)] = FNMS(T3d, T3q, T2B * T3c); + Im[WS(rs, 1)] = FMA(T2B, T3q, T3d * T3c); + } + { + E T3E, T3G, T3D, T3F; + T3E = T3x + T3w; + T3G = T3A - T3B; + T3D = W[36]; + T3F = W[37]; + Ip[WS(rs, 9)] = FNMS(T3F, T3G, T3D * T3E); + Im[WS(rs, 9)] = FMA(T3D, T3G, T3F * T3E); + } + { + E T3s, T3u, T3r, T3t; + T3s = T3b - T2Q; + T3u = T3m + T3p; + T3r = W[12]; + T3t = W[13]; + Ip[WS(rs, 3)] = FNMS(T3t, T3u, T3r * T3s); + Im[WS(rs, 3)] = FMA(T3r, T3u, T3t * T3s); + } + { + E T3y, T3C, T3v, T3z; + T3y = T3w - T3x; + T3C = T3A + T3B; + T3v = W[20]; + T3z = W[21]; + Ip[WS(rs, 5)] = FNMS(T3z, T3C, T3v * T3y); + Im[WS(rs, 5)] = FMA(T3v, T3C, T3z * T3y); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cb_20", twinstr, &GENUS, {184, 62, 62, 0} }; + +void X(codelet_hc2cb_20) (planner *p) { + X(khc2c_register) (p, hc2cb_20, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_32.c new file mode 100644 index 000000000..c7591412c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_32.c @@ -0,0 +1,1843 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:53 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hc2cb_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 236 additions, 62 multiplications, 198 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tf, T5K, T7k, T8k, T7N, T8x, T1i, T3i, T2L, T3v, T4v, T5f, T6m, T6T, T42; + E T52, TZ, T6X, T1X, T3p, T8p, T8B, T26, T3o, T4n, T58, T7z, T7T, T4k, T59; + E T6a, T6p, TK, T6W, T2o, T3m, T8s, T8A, T2x, T3l, T4g, T55, T7G, T7S, T4d; + E T56, T61, T6o, Tu, T6f, T7r, T8y, T7Q, T8l, T1F, T3w, T2O, T3j, T4y, T53; + E T5R, T6U, T49, T5g; + { + E T3, T12, T2G, T6g, T6, T2D, T15, T6h, Td, T6k, T1g, T2J, Ta, T6j, T1b; + E T2I; + { + E T1, T2, T13, T14; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T12 = T1 - T2; + { + E T2E, T2F, T4, T5; + T2E = Ip[0]; + T2F = Im[WS(rs, 15)]; + T2G = T2E + T2F; + T6g = T2E - T2F; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T2D = T4 - T5; + } + T13 = Ip[WS(rs, 8)]; + T14 = Im[WS(rs, 7)]; + T15 = T13 + T14; + T6h = T13 - T14; + { + E Tb, Tc, T1c, T1d, T1e, T1f; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + T1c = Tb - Tc; + T1d = Ip[WS(rs, 12)]; + T1e = Im[WS(rs, 3)]; + T1f = T1d + T1e; + Td = Tb + Tc; + T6k = T1d - T1e; + T1g = T1c - T1f; + T2J = T1c + T1f; + } + { + E T8, T9, T17, T18, T19, T1a; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + T17 = T8 - T9; + T18 = Ip[WS(rs, 4)]; + T19 = Im[WS(rs, 11)]; + T1a = T18 + T19; + Ta = T8 + T9; + T6j = T18 - T19; + T1b = T17 - T1a; + T2I = T17 + T1a; + } + } + { + E T7, Te, T7i, T7j; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T5K = T7 - Te; + T7i = T3 - T6; + T7j = T6k - T6j; + T7k = T7i - T7j; + T8k = T7i + T7j; + } + { + E T7L, T7M, T16, T1h; + T7L = T6g - T6h; + T7M = Ta - Td; + T7N = T7L - T7M; + T8x = T7M + T7L; + T16 = T12 - T15; + T1h = T1b + T1g; + T1i = FNMS(KP707106781, T1h, T16); + T3i = FMA(KP707106781, T1h, T16); + } + { + E T2H, T2K, T4t, T4u; + T2H = T2D + T2G; + T2K = T2I - T2J; + T2L = FNMS(KP707106781, T2K, T2H); + T3v = FMA(KP707106781, T2K, T2H); + T4t = T2G - T2D; + T4u = T1b - T1g; + T4v = FMA(KP707106781, T4u, T4t); + T5f = FNMS(KP707106781, T4u, T4t); + } + { + E T6i, T6l, T40, T41; + T6i = T6g + T6h; + T6l = T6j + T6k; + T6m = T6i - T6l; + T6T = T6i + T6l; + T40 = T12 + T15; + T41 = T2I + T2J; + T42 = FNMS(KP707106781, T41, T40); + T52 = FMA(KP707106781, T41, T40); + } + } + { + E TR, T7w, T1H, T1Y, T1K, T7t, T21, T65, TY, T7u, T7x, T1Q, T1V, T24, T68; + E T23, T7v, T7y; + { + E TL, TM, TN, TO, TP, TQ; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + TR = TN + TQ; + T7w = TN - TQ; + T1H = TO - TP; + T1Y = TL - TM; + } + { + E T1I, T1J, T63, T1Z, T20, T64; + T1I = Ip[WS(rs, 15)]; + T1J = Im[0]; + T63 = T1I - T1J; + T1Z = Ip[WS(rs, 7)]; + T20 = Im[WS(rs, 8)]; + T64 = T1Z - T20; + T1K = T1I + T1J; + T7t = T63 - T64; + T21 = T1Z + T20; + T65 = T63 + T64; + } + { + E TU, T1M, T1P, T66, TX, T1R, T1U, T67; + { + E TS, TT, T1N, T1O; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + TU = TS + TT; + T1M = TS - TT; + T1N = Ip[WS(rs, 3)]; + T1O = Im[WS(rs, 12)]; + T1P = T1N + T1O; + T66 = T1N - T1O; + } + { + E TV, TW, T1S, T1T; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + TX = TV + TW; + T1R = TV - TW; + T1S = Ip[WS(rs, 11)]; + T1T = Im[WS(rs, 4)]; + T1U = T1S + T1T; + T67 = T1S - T1T; + } + TY = TU + TX; + T7u = TU - TX; + T7x = T67 - T66; + T1Q = T1M + T1P; + T1V = T1R + T1U; + T24 = T1R - T1U; + T68 = T66 + T67; + T23 = T1M - T1P; + } + TZ = TR + TY; + T6X = T65 + T68; + { + E T1L, T1W, T8n, T8o; + T1L = T1H - T1K; + T1W = T1Q - T1V; + T1X = FNMS(KP707106781, T1W, T1L); + T3p = FMA(KP707106781, T1W, T1L); + T8n = T7u + T7t; + T8o = T7w + T7x; + T8p = FNMS(KP414213562, T8o, T8n); + T8B = FMA(KP414213562, T8n, T8o); + } + { + E T22, T25, T4l, T4m; + T22 = T1Y - T21; + T25 = T23 + T24; + T26 = FNMS(KP707106781, T25, T22); + T3o = FMA(KP707106781, T25, T22); + T4l = T1H + T1K; + T4m = T23 - T24; + T4n = FNMS(KP707106781, T4m, T4l); + T58 = FMA(KP707106781, T4m, T4l); + } + T7v = T7t - T7u; + T7y = T7w - T7x; + T7z = FMA(KP414213562, T7y, T7v); + T7T = FNMS(KP414213562, T7v, T7y); + { + E T4i, T4j, T62, T69; + T4i = T1Y + T21; + T4j = T1Q + T1V; + T4k = FNMS(KP707106781, T4j, T4i); + T59 = FMA(KP707106781, T4j, T4i); + T62 = TR - TY; + T69 = T65 - T68; + T6a = T62 + T69; + T6p = T69 - T62; + } + } + { + E TC, T7D, T28, T2p, T2b, T7A, T2s, T5W, TJ, T7B, T7E, T2h, T2m, T2v, T5Z; + E T2u, T7C, T7F; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + TC = Ty + TB; + T7D = Ty - TB; + T28 = Tz - TA; + T2p = Tw - Tx; + } + { + E T29, T2a, T5U, T2q, T2r, T5V; + T29 = Ip[WS(rs, 1)]; + T2a = Im[WS(rs, 14)]; + T5U = T29 - T2a; + T2q = Ip[WS(rs, 9)]; + T2r = Im[WS(rs, 6)]; + T5V = T2q - T2r; + T2b = T29 + T2a; + T7A = T5U - T5V; + T2s = T2q + T2r; + T5W = T5U + T5V; + } + { + E TF, T2d, T2g, T5X, TI, T2i, T2l, T5Y; + { + E TD, TE, T2e, T2f; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + TF = TD + TE; + T2d = TD - TE; + T2e = Ip[WS(rs, 5)]; + T2f = Im[WS(rs, 10)]; + T2g = T2e + T2f; + T5X = T2e - T2f; + } + { + E TG, TH, T2j, T2k; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + TI = TG + TH; + T2i = TG - TH; + T2j = Ip[WS(rs, 13)]; + T2k = Im[WS(rs, 2)]; + T2l = T2j + T2k; + T5Y = T2j - T2k; + } + TJ = TF + TI; + T7B = TF - TI; + T7E = T5Y - T5X; + T2h = T2d + T2g; + T2m = T2i + T2l; + T2v = T2i - T2l; + T5Z = T5X + T5Y; + T2u = T2d - T2g; + } + TK = TC + TJ; + T6W = T5W + T5Z; + { + E T2c, T2n, T8q, T8r; + T2c = T28 + T2b; + T2n = T2h - T2m; + T2o = FNMS(KP707106781, T2n, T2c); + T3m = FMA(KP707106781, T2n, T2c); + T8q = T7B + T7A; + T8r = T7D + T7E; + T8s = FMA(KP414213562, T8r, T8q); + T8A = FNMS(KP414213562, T8q, T8r); + } + { + E T2t, T2w, T4e, T4f; + T2t = T2p - T2s; + T2w = T2u + T2v; + T2x = FNMS(KP707106781, T2w, T2t); + T3l = FMA(KP707106781, T2w, T2t); + T4e = T2b - T28; + T4f = T2v - T2u; + T4g = FNMS(KP707106781, T4f, T4e); + T55 = FMA(KP707106781, T4f, T4e); + } + T7C = T7A - T7B; + T7F = T7D - T7E; + T7G = FNMS(KP414213562, T7F, T7C); + T7S = FMA(KP414213562, T7C, T7F); + { + E T4b, T4c, T5T, T60; + T4b = T2p + T2s; + T4c = T2h + T2m; + T4d = FNMS(KP707106781, T4c, T4b); + T56 = FMA(KP707106781, T4c, T4b); + T5T = TC - TJ; + T60 = T5W - T5Z; + T61 = T5T - T60; + T6o = T5T + T60; + } + } + { + E Ti, T5O, Tl, T5P, T1y, T1D, T7p, T7o, T44, T43, Tp, T5L, Ts, T5M, T1n; + E T1s, T7m, T7l, T47, T46; + { + E T1z, T1x, T1u, T1C; + { + E Tg, Th, T1v, T1w; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T1z = Tg - Th; + T1v = Ip[WS(rs, 2)]; + T1w = Im[WS(rs, 13)]; + T1x = T1v + T1w; + T5O = T1v - T1w; + } + { + E Tj, Tk, T1A, T1B; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T1u = Tj - Tk; + T1A = Ip[WS(rs, 10)]; + T1B = Im[WS(rs, 5)]; + T1C = T1A + T1B; + T5P = T1A - T1B; + } + T1y = T1u + T1x; + T1D = T1z - T1C; + T7p = T5O - T5P; + T7o = Ti - Tl; + T44 = T1z + T1C; + T43 = T1x - T1u; + } + { + E T1o, T1m, T1j, T1r; + { + E Tn, To, T1k, T1l; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T1o = Tn - To; + T1k = Ip[WS(rs, 14)]; + T1l = Im[WS(rs, 1)]; + T1m = T1k + T1l; + T5L = T1k - T1l; + } + { + E Tq, Tr, T1p, T1q; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T1j = Tq - Tr; + T1p = Ip[WS(rs, 6)]; + T1q = Im[WS(rs, 9)]; + T1r = T1p + T1q; + T5M = T1p - T1q; + } + T1n = T1j - T1m; + T1s = T1o - T1r; + T7m = Tp - Ts; + T7l = T5L - T5M; + T47 = T1o + T1r; + T46 = T1j + T1m; + } + { + E Tm, Tt, T7n, T7q; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T6f = Tm - Tt; + T7n = T7l - T7m; + T7q = T7o + T7p; + T7r = T7n - T7q; + T8y = T7q + T7n; + } + { + E T7O, T7P, T1t, T1E; + T7O = T7o - T7p; + T7P = T7m + T7l; + T7Q = T7O - T7P; + T8l = T7O + T7P; + T1t = FNMS(KP414213562, T1s, T1n); + T1E = FMA(KP414213562, T1D, T1y); + T1F = T1t - T1E; + T3w = T1E + T1t; + } + { + E T2M, T2N, T4w, T4x; + T2M = FNMS(KP414213562, T1y, T1D); + T2N = FMA(KP414213562, T1n, T1s); + T2O = T2M - T2N; + T3j = T2M + T2N; + T4w = FMA(KP414213562, T43, T44); + T4x = FMA(KP414213562, T46, T47); + T4y = T4w - T4x; + T53 = T4w + T4x; + } + { + E T5N, T5Q, T45, T48; + T5N = T5L + T5M; + T5Q = T5O + T5P; + T5R = T5N - T5Q; + T6U = T5Q + T5N; + T45 = FNMS(KP414213562, T44, T43); + T48 = FNMS(KP414213562, T47, T46); + T49 = T45 + T48; + T5g = T48 - T45; + } + } + { + E Tv, T10, T6Q, T6V, T6Y, T6Z; + Tv = Tf + Tu; + T10 = TK + TZ; + T6Q = Tv - T10; + T6V = T6T + T6U; + T6Y = T6W + T6X; + T6Z = T6V - T6Y; + Rp[0] = Tv + T10; + Rm[0] = T6V + T6Y; + { + E T6P, T6R, T6S, T70; + T6P = W[30]; + T6R = T6P * T6Q; + T6S = W[31]; + T70 = T6S * T6Q; + Rp[WS(rs, 8)] = FNMS(T6S, T6Z, T6R); + Rm[WS(rs, 8)] = FMA(T6P, T6Z, T70); + } + } + { + E T8O, T8W, T8T, T8Z; + { + E T8M, T8N, T8R, T8S; + T8M = FMA(KP707106781, T8l, T8k); + T8N = T8A + T8B; + T8O = FNMS(KP923879532, T8N, T8M); + T8W = FMA(KP923879532, T8N, T8M); + T8R = FMA(KP707106781, T8y, T8x); + T8S = T8s + T8p; + T8T = FNMS(KP923879532, T8S, T8R); + T8Z = FMA(KP923879532, T8S, T8R); + } + { + E T8P, T8U, T8L, T8Q; + T8L = W[34]; + T8P = T8L * T8O; + T8U = T8L * T8T; + T8Q = W[35]; + Rp[WS(rs, 9)] = FNMS(T8Q, T8T, T8P); + Rm[WS(rs, 9)] = FMA(T8Q, T8O, T8U); + } + { + E T8X, T90, T8V, T8Y; + T8V = W[2]; + T8X = T8V * T8W; + T90 = T8V * T8Z; + T8Y = W[3]; + Rp[WS(rs, 1)] = FNMS(T8Y, T8Z, T8X); + Rm[WS(rs, 1)] = FMA(T8Y, T8W, T90); + } + } + { + E T86, T8e, T8b, T8h; + { + E T84, T85, T89, T8a; + T84 = FNMS(KP707106781, T7r, T7k); + T85 = T7S + T7T; + T86 = FNMS(KP923879532, T85, T84); + T8e = FMA(KP923879532, T85, T84); + T89 = FNMS(KP707106781, T7Q, T7N); + T8a = T7G + T7z; + T8b = FNMS(KP923879532, T8a, T89); + T8h = FMA(KP923879532, T8a, T89); + } + { + E T87, T8c, T83, T88; + T83 = W[26]; + T87 = T83 * T86; + T8c = T83 * T8b; + T88 = W[27]; + Rp[WS(rs, 7)] = FNMS(T88, T8b, T87); + Rm[WS(rs, 7)] = FMA(T88, T86, T8c); + } + { + E T8f, T8i, T8d, T8g; + T8d = W[58]; + T8f = T8d * T8e; + T8i = T8d * T8h; + T8g = W[59]; + Rp[WS(rs, 15)] = FNMS(T8g, T8h, T8f); + Rm[WS(rs, 15)] = FMA(T8g, T8e, T8i); + } + } + { + E T6C, T6K, T6H, T6N; + { + E T6A, T6B, T6F, T6G; + T6A = T5K - T5R; + T6B = T6p - T6o; + T6C = FNMS(KP707106781, T6B, T6A); + T6K = FMA(KP707106781, T6B, T6A); + T6F = T6m - T6f; + T6G = T61 - T6a; + T6H = FNMS(KP707106781, T6G, T6F); + T6N = FMA(KP707106781, T6G, T6F); + } + { + E T6D, T6I, T6z, T6E; + T6z = W[54]; + T6D = T6z * T6C; + T6I = T6z * T6H; + T6E = W[55]; + Rp[WS(rs, 14)] = FNMS(T6E, T6H, T6D); + Rm[WS(rs, 14)] = FMA(T6E, T6C, T6I); + } + { + E T6L, T6O, T6J, T6M; + T6J = W[22]; + T6L = T6J * T6K; + T6O = T6J * T6N; + T6M = W[23]; + Rp[WS(rs, 6)] = FNMS(T6M, T6N, T6L); + Rm[WS(rs, 6)] = FMA(T6M, T6K, T6O); + } + } + { + E T8u, T8G, T8D, T8J; + { + E T8m, T8t, T8z, T8C; + T8m = FNMS(KP707106781, T8l, T8k); + T8t = T8p - T8s; + T8u = FNMS(KP923879532, T8t, T8m); + T8G = FMA(KP923879532, T8t, T8m); + T8z = FNMS(KP707106781, T8y, T8x); + T8C = T8A - T8B; + T8D = FNMS(KP923879532, T8C, T8z); + T8J = FMA(KP923879532, T8C, T8z); + } + { + E T8j, T8v, T8w, T8E; + T8j = W[50]; + T8v = T8j * T8u; + T8w = W[51]; + T8E = T8w * T8u; + Rp[WS(rs, 13)] = FNMS(T8w, T8D, T8v); + Rm[WS(rs, 13)] = FMA(T8j, T8D, T8E); + } + { + E T8F, T8H, T8I, T8K; + T8F = W[18]; + T8H = T8F * T8G; + T8I = W[19]; + T8K = T8I * T8G; + Rp[WS(rs, 5)] = FNMS(T8I, T8J, T8H); + Rm[WS(rs, 5)] = FMA(T8F, T8J, T8K); + } + } + { + E T6c, T6u, T6r, T6x; + { + E T5S, T6b, T6n, T6q; + T5S = T5K + T5R; + T6b = T61 + T6a; + T6c = FNMS(KP707106781, T6b, T5S); + T6u = FMA(KP707106781, T6b, T5S); + T6n = T6f + T6m; + T6q = T6o + T6p; + T6r = FNMS(KP707106781, T6q, T6n); + T6x = FMA(KP707106781, T6q, T6n); + } + { + E T5J, T6d, T6e, T6s; + T5J = W[38]; + T6d = T5J * T6c; + T6e = W[39]; + T6s = T6e * T6c; + Rp[WS(rs, 10)] = FNMS(T6e, T6r, T6d); + Rm[WS(rs, 10)] = FMA(T5J, T6r, T6s); + } + { + E T6t, T6v, T6w, T6y; + T6t = W[6]; + T6v = T6t * T6u; + T6w = W[7]; + T6y = T6w * T6u; + Rp[WS(rs, 2)] = FNMS(T6w, T6x, T6v); + Rm[WS(rs, 2)] = FMA(T6t, T6x, T6y); + } + } + { + E T74, T7c, T79, T7f; + { + E T72, T73, T77, T78; + T72 = Tf - Tu; + T73 = T6X - T6W; + T74 = T72 - T73; + T7c = T72 + T73; + T77 = T6T - T6U; + T78 = TK - TZ; + T79 = T77 - T78; + T7f = T78 + T77; + } + { + E T75, T7a, T71, T76; + T71 = W[46]; + T75 = T71 * T74; + T7a = T71 * T79; + T76 = W[47]; + Rp[WS(rs, 12)] = FNMS(T76, T79, T75); + Rm[WS(rs, 12)] = FMA(T76, T74, T7a); + } + { + E T7d, T7g, T7b, T7e; + T7b = W[14]; + T7d = T7b * T7c; + T7g = T7b * T7f; + T7e = W[15]; + Rp[WS(rs, 4)] = FNMS(T7e, T7f, T7d); + Rm[WS(rs, 4)] = FMA(T7e, T7c, T7g); + } + } + { + E T7I, T7Y, T7V, T81; + { + E T7s, T7H, T7R, T7U; + T7s = FMA(KP707106781, T7r, T7k); + T7H = T7z - T7G; + T7I = FNMS(KP923879532, T7H, T7s); + T7Y = FMA(KP923879532, T7H, T7s); + T7R = FMA(KP707106781, T7Q, T7N); + T7U = T7S - T7T; + T7V = FNMS(KP923879532, T7U, T7R); + T81 = FMA(KP923879532, T7U, T7R); + } + { + E T7h, T7J, T7K, T7W; + T7h = W[42]; + T7J = T7h * T7I; + T7K = W[43]; + T7W = T7K * T7I; + Rp[WS(rs, 11)] = FNMS(T7K, T7V, T7J); + Rm[WS(rs, 11)] = FMA(T7h, T7V, T7W); + } + { + E T7X, T7Z, T80, T82; + T7X = W[10]; + T7Z = T7X * T7Y; + T80 = W[11]; + T82 = T80 * T7Y; + Rp[WS(rs, 3)] = FNMS(T80, T81, T7Z); + Rm[WS(rs, 3)] = FMA(T7X, T81, T82); + } + } + { + E T37, T2A, T38, T2W, T2T, T3c, T2Z, T34; + T37 = FNMS(KP923879532, T2O, T2L); + { + E T1G, T27, T2y, T2z; + T1G = FMA(KP923879532, T1F, T1i); + T27 = FMA(KP668178637, T26, T1X); + T2y = FNMS(KP668178637, T2x, T2o); + T2z = T27 - T2y; + T2A = FNMS(KP831469612, T2z, T1G); + T38 = T2y + T27; + T2W = FMA(KP831469612, T2z, T1G); + } + { + E T2P, T32, T2S, T33, T2Q, T2R; + T2P = FMA(KP923879532, T2O, T2L); + T32 = FNMS(KP923879532, T1F, T1i); + T2Q = FMA(KP668178637, T2o, T2x); + T2R = FNMS(KP668178637, T1X, T26); + T2S = T2Q - T2R; + T33 = T2Q + T2R; + T2T = FNMS(KP831469612, T2S, T2P); + T3c = FMA(KP831469612, T33, T32); + T2Z = FMA(KP831469612, T2S, T2P); + T34 = FNMS(KP831469612, T33, T32); + } + { + E T2B, T2U, T11, T2C; + T11 = W[40]; + T2B = T11 * T2A; + T2U = T11 * T2T; + T2C = W[41]; + Ip[WS(rs, 10)] = FNMS(T2C, T2T, T2B); + Im[WS(rs, 10)] = FMA(T2C, T2A, T2U); + } + { + E T2X, T30, T2V, T2Y; + T2V = W[8]; + T2X = T2V * T2W; + T30 = T2V * T2Z; + T2Y = W[9]; + Ip[WS(rs, 2)] = FNMS(T2Y, T2Z, T2X); + Im[WS(rs, 2)] = FMA(T2Y, T2W, T30); + } + { + E T39, T36, T3a, T31, T35; + T39 = FNMS(KP831469612, T38, T37); + T36 = W[25]; + T3a = T36 * T34; + T31 = W[24]; + T35 = T31 * T34; + Ip[WS(rs, 6)] = FNMS(T36, T39, T35); + Im[WS(rs, 6)] = FMA(T31, T39, T3a); + } + { + E T3f, T3e, T3g, T3b, T3d; + T3f = FMA(KP831469612, T38, T37); + T3e = W[57]; + T3g = T3e * T3c; + T3b = W[56]; + T3d = T3b * T3c; + Ip[WS(rs, 14)] = FNMS(T3e, T3f, T3d); + Im[WS(rs, 14)] = FMA(T3b, T3f, T3g); + } + } + { + E T4z, T4C, T4W, T4O, T4q, T4Z, T4G, T4T; + T4z = FMA(KP923879532, T4y, T4v); + { + E T4M, T4A, T4B, T4N; + T4M = FMA(KP923879532, T49, T42); + T4A = FMA(KP668178637, T4d, T4g); + T4B = FMA(KP668178637, T4k, T4n); + T4N = T4A + T4B; + T4C = T4A - T4B; + T4W = FMA(KP831469612, T4N, T4M); + T4O = FNMS(KP831469612, T4N, T4M); + } + { + E T4a, T4R, T4p, T4S, T4h, T4o; + T4a = FNMS(KP923879532, T49, T42); + T4R = FNMS(KP923879532, T4y, T4v); + T4h = FNMS(KP668178637, T4g, T4d); + T4o = FNMS(KP668178637, T4n, T4k); + T4p = T4h + T4o; + T4S = T4h - T4o; + T4q = FNMS(KP831469612, T4p, T4a); + T4Z = FNMS(KP831469612, T4S, T4R); + T4G = FMA(KP831469612, T4p, T4a); + T4T = FMA(KP831469612, T4S, T4R); + } + { + E T4P, T4U, T4L, T4Q; + T4L = W[20]; + T4P = T4L * T4O; + T4U = T4L * T4T; + T4Q = W[21]; + Ip[WS(rs, 5)] = FNMS(T4Q, T4T, T4P); + Im[WS(rs, 5)] = FMA(T4Q, T4O, T4U); + } + { + E T4X, T50, T4V, T4Y; + T4V = W[52]; + T4X = T4V * T4W; + T50 = T4V * T4Z; + T4Y = W[53]; + Ip[WS(rs, 13)] = FNMS(T4Y, T4Z, T4X); + Im[WS(rs, 13)] = FMA(T4Y, T4W, T50); + } + { + E T4D, T4s, T4E, T3Z, T4r; + T4D = FNMS(KP831469612, T4C, T4z); + T4s = W[37]; + T4E = T4s * T4q; + T3Z = W[36]; + T4r = T3Z * T4q; + Ip[WS(rs, 9)] = FNMS(T4s, T4D, T4r); + Im[WS(rs, 9)] = FMA(T3Z, T4D, T4E); + } + { + E T4J, T4I, T4K, T4F, T4H; + T4J = FMA(KP831469612, T4C, T4z); + T4I = W[5]; + T4K = T4I * T4G; + T4F = W[4]; + T4H = T4F * T4G; + Ip[WS(rs, 1)] = FNMS(T4I, T4J, T4H); + Im[WS(rs, 1)] = FMA(T4F, T4J, T4K); + } + } + { + E T3x, T3A, T3U, T3M, T3s, T3X, T3E, T3R; + T3x = FMA(KP923879532, T3w, T3v); + { + E T3K, T3y, T3z, T3L; + T3K = FNMS(KP923879532, T3j, T3i); + T3y = FMA(KP198912367, T3l, T3m); + T3z = FNMS(KP198912367, T3o, T3p); + T3L = T3z - T3y; + T3A = T3y + T3z; + T3U = FMA(KP980785280, T3L, T3K); + T3M = FNMS(KP980785280, T3L, T3K); + } + { + E T3k, T3P, T3r, T3Q, T3n, T3q; + T3k = FMA(KP923879532, T3j, T3i); + T3P = FNMS(KP923879532, T3w, T3v); + T3n = FNMS(KP198912367, T3m, T3l); + T3q = FMA(KP198912367, T3p, T3o); + T3r = T3n + T3q; + T3Q = T3n - T3q; + T3s = FNMS(KP980785280, T3r, T3k); + T3X = FMA(KP980785280, T3Q, T3P); + T3E = FMA(KP980785280, T3r, T3k); + T3R = FNMS(KP980785280, T3Q, T3P); + } + { + E T3N, T3S, T3J, T3O; + T3J = W[48]; + T3N = T3J * T3M; + T3S = T3J * T3R; + T3O = W[49]; + Ip[WS(rs, 12)] = FNMS(T3O, T3R, T3N); + Im[WS(rs, 12)] = FMA(T3O, T3M, T3S); + } + { + E T3V, T3Y, T3T, T3W; + T3T = W[16]; + T3V = T3T * T3U; + T3Y = T3T * T3X; + T3W = W[17]; + Ip[WS(rs, 4)] = FNMS(T3W, T3X, T3V); + Im[WS(rs, 4)] = FMA(T3W, T3U, T3Y); + } + { + E T3B, T3u, T3C, T3h, T3t; + T3B = FNMS(KP980785280, T3A, T3x); + T3u = W[33]; + T3C = T3u * T3s; + T3h = W[32]; + T3t = T3h * T3s; + Ip[WS(rs, 8)] = FNMS(T3u, T3B, T3t); + Im[WS(rs, 8)] = FMA(T3h, T3B, T3C); + } + { + E T3H, T3G, T3I, T3D, T3F; + T3H = FMA(KP980785280, T3A, T3x); + T3G = W[1]; + T3I = T3G * T3E; + T3D = W[0]; + T3F = T3D * T3E; + Ip[0] = FNMS(T3G, T3H, T3F); + Im[0] = FMA(T3D, T3H, T3I); + } + } + { + E T5h, T5k, T5E, T5w, T5c, T5H, T5o, T5B; + T5h = FMA(KP923879532, T5g, T5f); + { + E T5u, T5i, T5j, T5v; + T5u = FMA(KP923879532, T53, T52); + T5i = FMA(KP198912367, T55, T56); + T5j = FMA(KP198912367, T58, T59); + T5v = T5i + T5j; + T5k = T5i - T5j; + T5E = FMA(KP980785280, T5v, T5u); + T5w = FNMS(KP980785280, T5v, T5u); + } + { + E T54, T5z, T5b, T5A, T57, T5a; + T54 = FNMS(KP923879532, T53, T52); + T5z = FNMS(KP923879532, T5g, T5f); + T57 = FNMS(KP198912367, T56, T55); + T5a = FNMS(KP198912367, T59, T58); + T5b = T57 + T5a; + T5A = T5a - T57; + T5c = FMA(KP980785280, T5b, T54); + T5H = FNMS(KP980785280, T5A, T5z); + T5o = FNMS(KP980785280, T5b, T54); + T5B = FMA(KP980785280, T5A, T5z); + } + { + E T5x, T5C, T5t, T5y; + T5t = W[28]; + T5x = T5t * T5w; + T5C = T5t * T5B; + T5y = W[29]; + Ip[WS(rs, 7)] = FNMS(T5y, T5B, T5x); + Im[WS(rs, 7)] = FMA(T5y, T5w, T5C); + } + { + E T5F, T5I, T5D, T5G; + T5D = W[60]; + T5F = T5D * T5E; + T5I = T5D * T5H; + T5G = W[61]; + Ip[WS(rs, 15)] = FNMS(T5G, T5H, T5F); + Im[WS(rs, 15)] = FMA(T5G, T5E, T5I); + } + { + E T5l, T5e, T5m, T51, T5d; + T5l = FNMS(KP980785280, T5k, T5h); + T5e = W[45]; + T5m = T5e * T5c; + T51 = W[44]; + T5d = T51 * T5c; + Ip[WS(rs, 11)] = FNMS(T5e, T5l, T5d); + Im[WS(rs, 11)] = FMA(T51, T5l, T5m); + } + { + E T5r, T5q, T5s, T5n, T5p; + T5r = FMA(KP980785280, T5k, T5h); + T5q = W[13]; + T5s = T5q * T5o; + T5n = W[12]; + T5p = T5n * T5o; + Ip[WS(rs, 3)] = FNMS(T5q, T5r, T5p); + Im[WS(rs, 3)] = FMA(T5n, T5r, T5s); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cb_32", twinstr, &GENUS, {236, 62, 198, 0} }; + +void X(codelet_hc2cb_32) (planner *p) { + X(khc2c_register) (p, hc2cb_32, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hc2cb_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 340 additions, 114 multiplications, 94 fused multiply/add), + * 98 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E T4o, T6y, T70, T5u, Tf, T12, T5x, T6z, T3m, T3Y, T29, T2y, T4v, T71, T2U; + E T3M, Tu, T1U, T6D, T73, T6G, T74, T1h, T2z, T2X, T3o, T4D, T5A, T4K, T5z; + E T30, T3n, TK, T1j, T6S, T7w, T6V, T7v, T1y, T2B, T3c, T3S, T4X, T61, T54; + E T62, T3f, T3T, TZ, T1A, T6L, T7z, T6O, T7y, T1P, T2C, T35, T3P, T5g, T64; + E T5n, T65, T38, T3Q; + { + E T3, T4m, T1X, T5t, T6, T5s, T20, T4n, Ta, T4p, T24, T4q, Td, T4s, T27; + E T4t; + { + E T1, T2, T1V, T1W; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T4m = T1 - T2; + T1V = Ip[0]; + T1W = Im[WS(rs, 15)]; + T1X = T1V - T1W; + T5t = T1V + T1W; + } + { + E T4, T5, T1Y, T1Z; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T5s = T4 - T5; + T1Y = Ip[WS(rs, 8)]; + T1Z = Im[WS(rs, 7)]; + T20 = T1Y - T1Z; + T4n = T1Y + T1Z; + } + { + E T8, T9, T22, T23; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + Ta = T8 + T9; + T4p = T8 - T9; + T22 = Ip[WS(rs, 4)]; + T23 = Im[WS(rs, 11)]; + T24 = T22 - T23; + T4q = T22 + T23; + } + { + E Tb, Tc, T25, T26; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + Td = Tb + Tc; + T4s = Tb - Tc; + T25 = Ip[WS(rs, 12)]; + T26 = Im[WS(rs, 3)]; + T27 = T25 - T26; + T4t = T25 + T26; + } + { + E T7, Te, T21, T28; + T4o = T4m - T4n; + T6y = T4m + T4n; + T70 = T5t - T5s; + T5u = T5s + T5t; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T12 = T7 - Te; + { + E T5v, T5w, T3k, T3l; + T5v = T4p + T4q; + T5w = T4s + T4t; + T5x = KP707106781 * (T5v - T5w); + T6z = KP707106781 * (T5v + T5w); + T3k = T1X - T20; + T3l = Ta - Td; + T3m = T3k - T3l; + T3Y = T3l + T3k; + } + T21 = T1X + T20; + T28 = T24 + T27; + T29 = T21 - T28; + T2y = T21 + T28; + { + E T4r, T4u, T2S, T2T; + T4r = T4p - T4q; + T4u = T4s - T4t; + T4v = KP707106781 * (T4r + T4u); + T71 = KP707106781 * (T4r - T4u); + T2S = T3 - T6; + T2T = T27 - T24; + T2U = T2S - T2T; + T3M = T2S + T2T; + } + } + } + { + E Ti, T4H, T1c, T4F, Tl, T4E, T1f, T4I, Tp, T4A, T15, T4y, Ts, T4x, T18; + E T4B; + { + E Tg, Th, T1a, T1b; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T4H = Tg - Th; + T1a = Ip[WS(rs, 2)]; + T1b = Im[WS(rs, 13)]; + T1c = T1a - T1b; + T4F = T1a + T1b; + } + { + E Tj, Tk, T1d, T1e; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T4E = Tj - Tk; + T1d = Ip[WS(rs, 10)]; + T1e = Im[WS(rs, 5)]; + T1f = T1d - T1e; + T4I = T1d + T1e; + } + { + E Tn, To, T13, T14; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T4A = Tn - To; + T13 = Ip[WS(rs, 14)]; + T14 = Im[WS(rs, 1)]; + T15 = T13 - T14; + T4y = T13 + T14; + } + { + E Tq, Tr, T16, T17; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T4x = Tq - Tr; + T16 = Ip[WS(rs, 6)]; + T17 = Im[WS(rs, 9)]; + T18 = T16 - T17; + T4B = T16 + T17; + } + { + E Tm, Tt, T6B, T6C; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T1U = Tm - Tt; + T6B = T4H + T4I; + T6C = T4F - T4E; + T6D = FNMS(KP923879532, T6C, KP382683432 * T6B); + T73 = FMA(KP382683432, T6C, KP923879532 * T6B); + } + { + E T6E, T6F, T19, T1g; + T6E = T4A + T4B; + T6F = T4x + T4y; + T6G = FNMS(KP923879532, T6F, KP382683432 * T6E); + T74 = FMA(KP382683432, T6F, KP923879532 * T6E); + T19 = T15 + T18; + T1g = T1c + T1f; + T1h = T19 - T1g; + T2z = T1g + T19; + } + { + E T2V, T2W, T4z, T4C; + T2V = T15 - T18; + T2W = Tp - Ts; + T2X = T2V - T2W; + T3o = T2W + T2V; + T4z = T4x - T4y; + T4C = T4A - T4B; + T4D = FNMS(KP382683432, T4C, KP923879532 * T4z); + T5A = FMA(KP382683432, T4z, KP923879532 * T4C); + } + { + E T4G, T4J, T2Y, T2Z; + T4G = T4E + T4F; + T4J = T4H - T4I; + T4K = FMA(KP923879532, T4G, KP382683432 * T4J); + T5z = FNMS(KP382683432, T4G, KP923879532 * T4J); + T2Y = Ti - Tl; + T2Z = T1c - T1f; + T30 = T2Y + T2Z; + T3n = T2Y - T2Z; + } + } + { + E Ty, T4N, T1m, T4Z, TB, T4Y, T1p, T4O, TI, T52, T1w, T4V, TF, T51, T1t; + E T4S; + { + E Tw, Tx, T1n, T1o; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + T4N = Tw - Tx; + { + E T1k, T1l, Tz, TA; + T1k = Ip[WS(rs, 1)]; + T1l = Im[WS(rs, 14)]; + T1m = T1k - T1l; + T4Z = T1k + T1l; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + T4Y = Tz - TA; + } + T1n = Ip[WS(rs, 9)]; + T1o = Im[WS(rs, 6)]; + T1p = T1n - T1o; + T4O = T1n + T1o; + { + E TG, TH, T4T, T1u, T1v, T4U; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + T4T = TG - TH; + T1u = Ip[WS(rs, 13)]; + T1v = Im[WS(rs, 2)]; + T4U = T1u + T1v; + TI = TG + TH; + T52 = T4T + T4U; + T1w = T1u - T1v; + T4V = T4T - T4U; + } + { + E TD, TE, T4Q, T1r, T1s, T4R; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + T4Q = TD - TE; + T1r = Ip[WS(rs, 5)]; + T1s = Im[WS(rs, 10)]; + T4R = T1r + T1s; + TF = TD + TE; + T51 = T4Q + T4R; + T1t = T1r - T1s; + T4S = T4Q - T4R; + } + } + { + E TC, TJ, T6Q, T6R; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T1j = TC - TJ; + T6Q = T4Z - T4Y; + T6R = KP707106781 * (T4S - T4V); + T6S = T6Q + T6R; + T7w = T6Q - T6R; + } + { + E T6T, T6U, T1q, T1x; + T6T = T4N + T4O; + T6U = KP707106781 * (T51 + T52); + T6V = T6T - T6U; + T7v = T6T + T6U; + T1q = T1m + T1p; + T1x = T1t + T1w; + T1y = T1q - T1x; + T2B = T1q + T1x; + } + { + E T3a, T3b, T4P, T4W; + T3a = T1m - T1p; + T3b = TF - TI; + T3c = T3a - T3b; + T3S = T3b + T3a; + T4P = T4N - T4O; + T4W = KP707106781 * (T4S + T4V); + T4X = T4P - T4W; + T61 = T4P + T4W; + } + { + E T50, T53, T3d, T3e; + T50 = T4Y + T4Z; + T53 = KP707106781 * (T51 - T52); + T54 = T50 - T53; + T62 = T50 + T53; + T3d = Ty - TB; + T3e = T1w - T1t; + T3f = T3d - T3e; + T3T = T3d + T3e; + } + } + { + E TN, T56, T1D, T5i, TQ, T5h, T1G, T57, TX, T5l, T1N, T5e, TU, T5k, T1K; + E T5b; + { + E TL, TM, T1E, T1F; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + T56 = TL - TM; + { + E T1B, T1C, TO, TP; + T1B = Ip[WS(rs, 15)]; + T1C = Im[0]; + T1D = T1B - T1C; + T5i = T1B + T1C; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + T5h = TO - TP; + } + T1E = Ip[WS(rs, 7)]; + T1F = Im[WS(rs, 8)]; + T1G = T1E - T1F; + T57 = T1E + T1F; + { + E TV, TW, T5c, T1L, T1M, T5d; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + T5c = TV - TW; + T1L = Ip[WS(rs, 11)]; + T1M = Im[WS(rs, 4)]; + T5d = T1L + T1M; + TX = TV + TW; + T5l = T5c + T5d; + T1N = T1L - T1M; + T5e = T5c - T5d; + } + { + E TS, TT, T59, T1I, T1J, T5a; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + T59 = TS - TT; + T1I = Ip[WS(rs, 3)]; + T1J = Im[WS(rs, 12)]; + T5a = T1I + T1J; + TU = TS + TT; + T5k = T59 + T5a; + T1K = T1I - T1J; + T5b = T59 - T5a; + } + } + { + E TR, TY, T6J, T6K; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T1A = TR - TY; + T6J = KP707106781 * (T5b - T5e); + T6K = T5h + T5i; + T6L = T6J - T6K; + T7z = T6K + T6J; + } + { + E T6M, T6N, T1H, T1O; + T6M = T56 + T57; + T6N = KP707106781 * (T5k + T5l); + T6O = T6M - T6N; + T7y = T6M + T6N; + T1H = T1D + T1G; + T1O = T1K + T1N; + T1P = T1H - T1O; + T2C = T1H + T1O; + } + { + E T33, T34, T58, T5f; + T33 = T1D - T1G; + T34 = TU - TX; + T35 = T33 - T34; + T3P = T34 + T33; + T58 = T56 - T57; + T5f = KP707106781 * (T5b + T5e); + T5g = T58 - T5f; + T64 = T58 + T5f; + } + { + E T5j, T5m, T36, T37; + T5j = T5h - T5i; + T5m = KP707106781 * (T5k - T5l); + T5n = T5j - T5m; + T65 = T5j + T5m; + T36 = TN - TQ; + T37 = T1N - T1K; + T38 = T36 - T37; + T3Q = T36 + T37; + } + } + { + E Tv, T10, T2w, T2A, T2D, T2E, T2v, T2x; + Tv = Tf + Tu; + T10 = TK + TZ; + T2w = Tv - T10; + T2A = T2y + T2z; + T2D = T2B + T2C; + T2E = T2A - T2D; + Rp[0] = Tv + T10; + Rm[0] = T2A + T2D; + T2v = W[30]; + T2x = W[31]; + Rp[WS(rs, 8)] = FNMS(T2x, T2E, T2v * T2w); + Rm[WS(rs, 8)] = FMA(T2x, T2w, T2v * T2E); + } + { + E T2I, T2O, T2M, T2Q; + { + E T2G, T2H, T2K, T2L; + T2G = Tf - Tu; + T2H = T2C - T2B; + T2I = T2G - T2H; + T2O = T2G + T2H; + T2K = T2y - T2z; + T2L = TK - TZ; + T2M = T2K - T2L; + T2Q = T2L + T2K; + } + { + E T2F, T2J, T2N, T2P; + T2F = W[46]; + T2J = W[47]; + Rp[WS(rs, 12)] = FNMS(T2J, T2M, T2F * T2I); + Rm[WS(rs, 12)] = FMA(T2F, T2M, T2J * T2I); + T2N = W[14]; + T2P = W[15]; + Rp[WS(rs, 4)] = FNMS(T2P, T2Q, T2N * T2O); + Rm[WS(rs, 4)] = FMA(T2N, T2Q, T2P * T2O); + } + } + { + E T1i, T2a, T2o, T2k, T2d, T2l, T1R, T2p; + T1i = T12 + T1h; + T2a = T1U + T29; + T2o = T29 - T1U; + T2k = T12 - T1h; + { + E T2b, T2c, T1z, T1Q; + T2b = T1j + T1y; + T2c = T1P - T1A; + T2d = KP707106781 * (T2b + T2c); + T2l = KP707106781 * (T2c - T2b); + T1z = T1j - T1y; + T1Q = T1A + T1P; + T1R = KP707106781 * (T1z + T1Q); + T2p = KP707106781 * (T1z - T1Q); + } + { + E T1S, T2e, T11, T1T; + T1S = T1i - T1R; + T2e = T2a - T2d; + T11 = W[38]; + T1T = W[39]; + Rp[WS(rs, 10)] = FNMS(T1T, T2e, T11 * T1S); + Rm[WS(rs, 10)] = FMA(T1T, T1S, T11 * T2e); + } + { + E T2s, T2u, T2r, T2t; + T2s = T2k + T2l; + T2u = T2o + T2p; + T2r = W[22]; + T2t = W[23]; + Rp[WS(rs, 6)] = FNMS(T2t, T2u, T2r * T2s); + Rm[WS(rs, 6)] = FMA(T2r, T2u, T2t * T2s); + } + { + E T2g, T2i, T2f, T2h; + T2g = T1i + T1R; + T2i = T2a + T2d; + T2f = W[6]; + T2h = W[7]; + Rp[WS(rs, 2)] = FNMS(T2h, T2i, T2f * T2g); + Rm[WS(rs, 2)] = FMA(T2h, T2g, T2f * T2i); + } + { + E T2m, T2q, T2j, T2n; + T2m = T2k - T2l; + T2q = T2o - T2p; + T2j = W[54]; + T2n = W[55]; + Rp[WS(rs, 14)] = FNMS(T2n, T2q, T2j * T2m); + Rm[WS(rs, 14)] = FMA(T2j, T2q, T2n * T2m); + } + } + { + E T3O, T4a, T40, T4e, T3V, T4f, T43, T4b, T3N, T3Z; + T3N = KP707106781 * (T3n + T3o); + T3O = T3M - T3N; + T4a = T3M + T3N; + T3Z = KP707106781 * (T30 + T2X); + T40 = T3Y - T3Z; + T4e = T3Y + T3Z; + { + E T3R, T3U, T41, T42; + T3R = FNMS(KP382683432, T3Q, KP923879532 * T3P); + T3U = FMA(KP923879532, T3S, KP382683432 * T3T); + T3V = T3R - T3U; + T4f = T3U + T3R; + T41 = FNMS(KP382683432, T3S, KP923879532 * T3T); + T42 = FMA(KP382683432, T3P, KP923879532 * T3Q); + T43 = T41 - T42; + T4b = T41 + T42; + } + { + E T3W, T44, T3L, T3X; + T3W = T3O - T3V; + T44 = T40 - T43; + T3L = W[50]; + T3X = W[51]; + Rp[WS(rs, 13)] = FNMS(T3X, T44, T3L * T3W); + Rm[WS(rs, 13)] = FMA(T3X, T3W, T3L * T44); + } + { + E T4i, T4k, T4h, T4j; + T4i = T4a + T4b; + T4k = T4e + T4f; + T4h = W[2]; + T4j = W[3]; + Rp[WS(rs, 1)] = FNMS(T4j, T4k, T4h * T4i); + Rm[WS(rs, 1)] = FMA(T4h, T4k, T4j * T4i); + } + { + E T46, T48, T45, T47; + T46 = T3O + T3V; + T48 = T40 + T43; + T45 = W[18]; + T47 = W[19]; + Rp[WS(rs, 5)] = FNMS(T47, T48, T45 * T46); + Rm[WS(rs, 5)] = FMA(T47, T46, T45 * T48); + } + { + E T4c, T4g, T49, T4d; + T4c = T4a - T4b; + T4g = T4e - T4f; + T49 = W[34]; + T4d = W[35]; + Rp[WS(rs, 9)] = FNMS(T4d, T4g, T49 * T4c); + Rm[WS(rs, 9)] = FMA(T49, T4g, T4d * T4c); + } + } + { + E T32, T3A, T3q, T3E, T3h, T3F, T3t, T3B, T31, T3p; + T31 = KP707106781 * (T2X - T30); + T32 = T2U - T31; + T3A = T2U + T31; + T3p = KP707106781 * (T3n - T3o); + T3q = T3m - T3p; + T3E = T3m + T3p; + { + E T39, T3g, T3r, T3s; + T39 = FNMS(KP923879532, T38, KP382683432 * T35); + T3g = FMA(KP382683432, T3c, KP923879532 * T3f); + T3h = T39 - T3g; + T3F = T3g + T39; + T3r = FNMS(KP923879532, T3c, KP382683432 * T3f); + T3s = FMA(KP923879532, T35, KP382683432 * T38); + T3t = T3r - T3s; + T3B = T3r + T3s; + } + { + E T3i, T3u, T2R, T3j; + T3i = T32 - T3h; + T3u = T3q - T3t; + T2R = W[58]; + T3j = W[59]; + Rp[WS(rs, 15)] = FNMS(T3j, T3u, T2R * T3i); + Rm[WS(rs, 15)] = FMA(T3j, T3i, T2R * T3u); + } + { + E T3I, T3K, T3H, T3J; + T3I = T3A + T3B; + T3K = T3E + T3F; + T3H = W[10]; + T3J = W[11]; + Rp[WS(rs, 3)] = FNMS(T3J, T3K, T3H * T3I); + Rm[WS(rs, 3)] = FMA(T3H, T3K, T3J * T3I); + } + { + E T3w, T3y, T3v, T3x; + T3w = T32 + T3h; + T3y = T3q + T3t; + T3v = W[26]; + T3x = W[27]; + Rp[WS(rs, 7)] = FNMS(T3x, T3y, T3v * T3w); + Rm[WS(rs, 7)] = FMA(T3x, T3w, T3v * T3y); + } + { + E T3C, T3G, T3z, T3D; + T3C = T3A - T3B; + T3G = T3E - T3F; + T3z = W[42]; + T3D = W[43]; + Rp[WS(rs, 11)] = FNMS(T3D, T3G, T3z * T3C); + Rm[WS(rs, 11)] = FMA(T3z, T3G, T3D * T3C); + } + } + { + E T60, T6m, T6f, T6n, T67, T6r, T6c, T6q; + { + E T5Y, T5Z, T6d, T6e; + T5Y = T4o + T4v; + T5Z = T5z + T5A; + T60 = T5Y + T5Z; + T6m = T5Y - T5Z; + T6d = FMA(KP195090322, T61, KP980785280 * T62); + T6e = FNMS(KP195090322, T64, KP980785280 * T65); + T6f = T6d + T6e; + T6n = T6e - T6d; + } + { + E T63, T66, T6a, T6b; + T63 = FNMS(KP195090322, T62, KP980785280 * T61); + T66 = FMA(KP980785280, T64, KP195090322 * T65); + T67 = T63 + T66; + T6r = T63 - T66; + T6a = T5u + T5x; + T6b = T4K + T4D; + T6c = T6a + T6b; + T6q = T6a - T6b; + } + { + E T68, T6g, T5X, T69; + T68 = T60 - T67; + T6g = T6c - T6f; + T5X = W[32]; + T69 = W[33]; + Ip[WS(rs, 8)] = FNMS(T69, T6g, T5X * T68); + Im[WS(rs, 8)] = FMA(T69, T68, T5X * T6g); + } + { + E T6u, T6w, T6t, T6v; + T6u = T6m + T6n; + T6w = T6q + T6r; + T6t = W[16]; + T6v = W[17]; + Ip[WS(rs, 4)] = FNMS(T6v, T6w, T6t * T6u); + Im[WS(rs, 4)] = FMA(T6t, T6w, T6v * T6u); + } + { + E T6i, T6k, T6h, T6j; + T6i = T60 + T67; + T6k = T6c + T6f; + T6h = W[0]; + T6j = W[1]; + Ip[0] = FNMS(T6j, T6k, T6h * T6i); + Im[0] = FMA(T6j, T6i, T6h * T6k); + } + { + E T6o, T6s, T6l, T6p; + T6o = T6m - T6n; + T6s = T6q - T6r; + T6l = W[48]; + T6p = W[49]; + Ip[WS(rs, 12)] = FNMS(T6p, T6s, T6l * T6o); + Im[WS(rs, 12)] = FMA(T6l, T6s, T6p * T6o); + } + } + { + E T7u, T7Q, T7J, T7R, T7B, T7V, T7G, T7U; + { + E T7s, T7t, T7H, T7I; + T7s = T6y + T6z; + T7t = T73 + T74; + T7u = T7s - T7t; + T7Q = T7s + T7t; + T7H = FMA(KP195090322, T7w, KP980785280 * T7v); + T7I = FMA(KP195090322, T7z, KP980785280 * T7y); + T7J = T7H - T7I; + T7R = T7H + T7I; + } + { + E T7x, T7A, T7E, T7F; + T7x = FNMS(KP980785280, T7w, KP195090322 * T7v); + T7A = FNMS(KP980785280, T7z, KP195090322 * T7y); + T7B = T7x + T7A; + T7V = T7x - T7A; + T7E = T70 - T71; + T7F = T6D - T6G; + T7G = T7E + T7F; + T7U = T7E - T7F; + } + { + E T7C, T7K, T7r, T7D; + T7C = T7u - T7B; + T7K = T7G - T7J; + T7r = W[44]; + T7D = W[45]; + Ip[WS(rs, 11)] = FNMS(T7D, T7K, T7r * T7C); + Im[WS(rs, 11)] = FMA(T7D, T7C, T7r * T7K); + } + { + E T7Y, T80, T7X, T7Z; + T7Y = T7Q + T7R; + T80 = T7U - T7V; + T7X = W[60]; + T7Z = W[61]; + Ip[WS(rs, 15)] = FNMS(T7Z, T80, T7X * T7Y); + Im[WS(rs, 15)] = FMA(T7X, T80, T7Z * T7Y); + } + { + E T7M, T7O, T7L, T7N; + T7M = T7u + T7B; + T7O = T7G + T7J; + T7L = W[12]; + T7N = W[13]; + Ip[WS(rs, 3)] = FNMS(T7N, T7O, T7L * T7M); + Im[WS(rs, 3)] = FMA(T7N, T7M, T7L * T7O); + } + { + E T7S, T7W, T7P, T7T; + T7S = T7Q - T7R; + T7W = T7U + T7V; + T7P = W[28]; + T7T = W[29]; + Ip[WS(rs, 7)] = FNMS(T7T, T7W, T7P * T7S); + Im[WS(rs, 7)] = FMA(T7P, T7W, T7T * T7S); + } + } + { + E T4M, T5M, T5F, T5N, T5p, T5R, T5C, T5Q; + { + E T4w, T4L, T5D, T5E; + T4w = T4o - T4v; + T4L = T4D - T4K; + T4M = T4w + T4L; + T5M = T4w - T4L; + T5D = FMA(KP831469612, T4X, KP555570233 * T54); + T5E = FNMS(KP831469612, T5g, KP555570233 * T5n); + T5F = T5D + T5E; + T5N = T5E - T5D; + } + { + E T55, T5o, T5y, T5B; + T55 = FNMS(KP831469612, T54, KP555570233 * T4X); + T5o = FMA(KP555570233, T5g, KP831469612 * T5n); + T5p = T55 + T5o; + T5R = T55 - T5o; + T5y = T5u - T5x; + T5B = T5z - T5A; + T5C = T5y + T5B; + T5Q = T5y - T5B; + } + { + E T5q, T5G, T4l, T5r; + T5q = T4M - T5p; + T5G = T5C - T5F; + T4l = W[40]; + T5r = W[41]; + Ip[WS(rs, 10)] = FNMS(T5r, T5G, T4l * T5q); + Im[WS(rs, 10)] = FMA(T5r, T5q, T4l * T5G); + } + { + E T5U, T5W, T5T, T5V; + T5U = T5M + T5N; + T5W = T5Q + T5R; + T5T = W[24]; + T5V = W[25]; + Ip[WS(rs, 6)] = FNMS(T5V, T5W, T5T * T5U); + Im[WS(rs, 6)] = FMA(T5T, T5W, T5V * T5U); + } + { + E T5I, T5K, T5H, T5J; + T5I = T4M + T5p; + T5K = T5C + T5F; + T5H = W[8]; + T5J = W[9]; + Ip[WS(rs, 2)] = FNMS(T5J, T5K, T5H * T5I); + Im[WS(rs, 2)] = FMA(T5J, T5I, T5H * T5K); + } + { + E T5O, T5S, T5L, T5P; + T5O = T5M - T5N; + T5S = T5Q - T5R; + T5L = W[56]; + T5P = W[57]; + Ip[WS(rs, 14)] = FNMS(T5P, T5S, T5L * T5O); + Im[WS(rs, 14)] = FMA(T5L, T5S, T5P * T5O); + } + } + { + E T6I, T7g, T79, T7h, T6X, T7l, T76, T7k; + { + E T6A, T6H, T77, T78; + T6A = T6y - T6z; + T6H = T6D + T6G; + T6I = T6A - T6H; + T7g = T6A + T6H; + T77 = FNMS(KP555570233, T6S, KP831469612 * T6V); + T78 = FMA(KP555570233, T6L, KP831469612 * T6O); + T79 = T77 - T78; + T7h = T77 + T78; + } + { + E T6P, T6W, T72, T75; + T6P = FNMS(KP555570233, T6O, KP831469612 * T6L); + T6W = FMA(KP831469612, T6S, KP555570233 * T6V); + T6X = T6P - T6W; + T7l = T6W + T6P; + T72 = T70 + T71; + T75 = T73 - T74; + T76 = T72 - T75; + T7k = T72 + T75; + } + { + E T6Y, T7a, T6x, T6Z; + T6Y = T6I - T6X; + T7a = T76 - T79; + T6x = W[52]; + T6Z = W[53]; + Ip[WS(rs, 13)] = FNMS(T6Z, T7a, T6x * T6Y); + Im[WS(rs, 13)] = FMA(T6Z, T6Y, T6x * T7a); + } + { + E T7o, T7q, T7n, T7p; + T7o = T7g + T7h; + T7q = T7k + T7l; + T7n = W[4]; + T7p = W[5]; + Ip[WS(rs, 1)] = FNMS(T7p, T7q, T7n * T7o); + Im[WS(rs, 1)] = FMA(T7n, T7q, T7p * T7o); + } + { + E T7c, T7e, T7b, T7d; + T7c = T6I + T6X; + T7e = T76 + T79; + T7b = W[20]; + T7d = W[21]; + Ip[WS(rs, 5)] = FNMS(T7d, T7e, T7b * T7c); + Im[WS(rs, 5)] = FMA(T7d, T7c, T7b * T7e); + } + { + E T7i, T7m, T7f, T7j; + T7i = T7g - T7h; + T7m = T7k - T7l; + T7f = W[36]; + T7j = W[37]; + Ip[WS(rs, 9)] = FNMS(T7j, T7m, T7f * T7i); + Im[WS(rs, 9)] = FMA(T7f, T7m, T7j * T7i); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cb_32", twinstr, &GENUS, {340, 114, 94, 0} }; + +void X(codelet_hc2cb_32) (planner *p) { + X(khc2c_register) (p, hc2cb_32, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_4.c new file mode 100644 index 000000000..b278611cf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_4.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:51 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hc2cb_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 22 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T3, T6, T8, Td, Tx, Tu, Tm, Tg, Tr; + { + E Tb, Tc, Tq, Tk, Te, Tf, Tl, Tp; + { + E T1, T2, T4, T5; + Tb = Ip[0]; + Tc = Im[WS(rs, 1)]; + Tq = Tb + Tc; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tk = T1 - T2; + Te = Ip[WS(rs, 1)]; + Tf = Im[0]; + Tl = Te + Tf; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + Tp = T4 - T5; + } + T8 = T3 - T6; + Td = Tb - Tc; + Tx = Tq - Tp; + Tu = Tk + Tl; + Tm = Tk - Tl; + Tg = Te - Tf; + Tr = Tp + Tq; + } + Rp[0] = T3 + T6; + Rm[0] = Td + Tg; + { + E Tn, Ts, Tj, To; + Tj = W[0]; + Tn = Tj * Tm; + Ts = Tj * Tr; + To = W[1]; + Ip[0] = FNMS(To, Tr, Tn); + Im[0] = FMA(To, Tm, Ts); + } + { + E Tv, Ty, Tt, Tw; + Tt = W[4]; + Tv = Tt * Tu; + Ty = Tt * Tx; + Tw = W[5]; + Ip[WS(rs, 1)] = FNMS(Tw, Tx, Tv); + Im[WS(rs, 1)] = FMA(Tw, Tu, Ty); + } + { + E Th, Ta, Ti, T7, T9; + Th = Td - Tg; + Ta = W[3]; + Ti = Ta * T8; + T7 = W[2]; + T9 = T7 * T8; + Rp[WS(rs, 1)] = FNMS(Ta, Th, T9); + Rm[WS(rs, 1)] = FMA(T7, Th, Ti); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cb_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hc2cb_4) (planner *p) { + X(khc2c_register) (p, hc2cb_4, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hc2cb_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T3, Ti, Tc, Tn, T6, Tm, Tf, Tj; + { + E T1, T2, Ta, Tb; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Ti = T1 - T2; + Ta = Ip[0]; + Tb = Im[WS(rs, 1)]; + Tc = Ta - Tb; + Tn = Ta + Tb; + } + { + E T4, T5, Td, Te; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + Tm = T4 - T5; + Td = Ip[WS(rs, 1)]; + Te = Im[0]; + Tf = Td - Te; + Tj = Td + Te; + } + Rp[0] = T3 + T6; + Rm[0] = Tc + Tf; + { + E T8, Tg, T7, T9; + T8 = T3 - T6; + Tg = Tc - Tf; + T7 = W[2]; + T9 = W[3]; + Rp[WS(rs, 1)] = FNMS(T9, Tg, T7 * T8); + Rm[WS(rs, 1)] = FMA(T9, T8, T7 * Tg); + } + { + E Tk, To, Th, Tl; + Tk = Ti - Tj; + To = Tm + Tn; + Th = W[0]; + Tl = W[1]; + Ip[0] = FNMS(Tl, To, Th * Tk); + Im[0] = FMA(Th, To, Tl * Tk); + } + { + E Tq, Ts, Tp, Tr; + Tq = Ti + Tj; + Ts = Tn - Tm; + Tp = W[4]; + Tr = W[5]; + Ip[WS(rs, 1)] = FNMS(Tr, Ts, Tp * Tq); + Im[WS(rs, 1)] = FMA(Tp, Ts, Tr * Tq); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cb_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hc2cb_4) (planner *p) { + X(khc2c_register) (p, hc2cb_4, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_6.c new file mode 100644 index 000000000..d8eab7608 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_6.c @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:51 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -dif -name hc2cb_6 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 46 FP additions, 32 FP multiplications, + * (or, 24 additions, 10 multiplications, 22 fused multiply/add), + * 31 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E Td, Tn, TO, TJ, TN, Tk, Tr, T3, TC, Ts, TQ, Ta, Tm, TF, TG; + { + E Tb, Tc, Tj, TI, Tg, TH; + Tb = Ip[0]; + Tc = Im[WS(rs, 2)]; + Td = Tb - Tc; + { + E Th, Ti, Te, Tf; + Th = Ip[WS(rs, 1)]; + Ti = Im[WS(rs, 1)]; + Tj = Th - Ti; + TI = Th + Ti; + Te = Ip[WS(rs, 2)]; + Tf = Im[0]; + Tg = Te - Tf; + TH = Te + Tf; + } + Tn = Tj - Tg; + TO = TH - TI; + TJ = TH + TI; + TN = Tb + Tc; + Tk = Tg + Tj; + Tr = FNMS(KP500000000, Tk, Td); + } + { + E T9, TE, T6, TD, T1, T2; + T1 = Rp[0]; + T2 = Rm[WS(rs, 2)]; + T3 = T1 + T2; + TC = T1 - T2; + { + E T7, T8, T4, T5; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 1)]; + T9 = T7 + T8; + TE = T7 - T8; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[0]; + T6 = T4 + T5; + TD = T4 - T5; + } + Ts = T6 - T9; + TQ = TD - TE; + Ta = T6 + T9; + Tm = FNMS(KP500000000, Ta, T3); + TF = TD + TE; + TG = FNMS(KP500000000, TF, TC); + } + Rp[0] = T3 + Ta; + Rm[0] = Td + Tk; + { + E To, Tt, Tp, Tu, Tl, Tq; + To = FNMS(KP866025403, Tn, Tm); + Tt = FNMS(KP866025403, Ts, Tr); + Tl = W[2]; + Tp = Tl * To; + Tu = Tl * Tt; + Tq = W[3]; + Rp[WS(rs, 1)] = FNMS(Tq, Tt, Tp); + Rm[WS(rs, 1)] = FMA(Tq, To, Tu); + } + { + E T13, TZ, T11, T12, T14, T10; + T13 = TN + TO; + T10 = TC + TF; + TZ = W[4]; + T11 = TZ * T10; + T12 = W[5]; + T14 = T12 * T10; + Ip[WS(rs, 1)] = FNMS(T12, T13, T11); + Im[WS(rs, 1)] = FMA(TZ, T13, T14); + } + { + E Tw, Tz, Tx, TA, Tv, Ty; + Tw = FMA(KP866025403, Tn, Tm); + Tz = FMA(KP866025403, Ts, Tr); + Tv = W[6]; + Tx = Tv * Tw; + TA = Tv * Tz; + Ty = W[7]; + Rp[WS(rs, 2)] = FNMS(Ty, Tz, Tx); + Rm[WS(rs, 2)] = FMA(Ty, Tw, TA); + } + { + E TR, TX, TT, TV, TW, TY, TB, TL, TM, TS, TP, TU, TK; + TP = FNMS(KP500000000, TO, TN); + TR = FMA(KP866025403, TQ, TP); + TX = FNMS(KP866025403, TQ, TP); + TU = FMA(KP866025403, TJ, TG); + TT = W[8]; + TV = TT * TU; + TW = W[9]; + TY = TW * TU; + TK = FNMS(KP866025403, TJ, TG); + TB = W[0]; + TL = TB * TK; + TM = W[1]; + TS = TM * TK; + Ip[0] = FNMS(TM, TR, TL); + Im[0] = FMA(TB, TR, TS); + Ip[WS(rs, 2)] = FNMS(TW, TX, TV); + Im[WS(rs, 2)] = FMA(TT, TX, TY); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cb_6", twinstr, &GENUS, {24, 10, 22, 0} }; + +void X(codelet_hc2cb_6) (planner *p) { + X(khc2c_register) (p, hc2cb_6, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -dif -name hc2cb_6 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 46 FP additions, 28 FP multiplications, + * (or, 32 additions, 14 multiplications, 14 fused multiply/add), + * 25 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E T3, Ty, Td, TE, Ta, TO, Tr, TB, Tk, TL, Tn, TH; + { + E T1, T2, Tb, Tc; + T1 = Rp[0]; + T2 = Rm[WS(rs, 2)]; + T3 = T1 + T2; + Ty = T1 - T2; + Tb = Ip[0]; + Tc = Im[WS(rs, 2)]; + Td = Tb - Tc; + TE = Tb + Tc; + } + { + E T6, Tz, T9, TA; + { + E T4, T5, T7, T8; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[0]; + T6 = T4 + T5; + Tz = T4 - T5; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 1)]; + T9 = T7 + T8; + TA = T7 - T8; + } + Ta = T6 + T9; + TO = KP866025403 * (Tz - TA); + Tr = KP866025403 * (T6 - T9); + TB = Tz + TA; + } + { + E Tg, TG, Tj, TF; + { + E Te, Tf, Th, Ti; + Te = Ip[WS(rs, 2)]; + Tf = Im[0]; + Tg = Te - Tf; + TG = Te + Tf; + Th = Ip[WS(rs, 1)]; + Ti = Im[WS(rs, 1)]; + Tj = Th - Ti; + TF = Th + Ti; + } + Tk = Tg + Tj; + TL = KP866025403 * (TG + TF); + Tn = KP866025403 * (Tj - Tg); + TH = TF - TG; + } + Rp[0] = T3 + Ta; + Rm[0] = Td + Tk; + { + E TC, TI, Tx, TD; + TC = Ty + TB; + TI = TE - TH; + Tx = W[4]; + TD = W[5]; + Ip[WS(rs, 1)] = FNMS(TD, TI, Tx * TC); + Im[WS(rs, 1)] = FMA(TD, TC, Tx * TI); + } + { + E To, Tu, Ts, Tw, Tm, Tq; + Tm = FNMS(KP500000000, Ta, T3); + To = Tm - Tn; + Tu = Tm + Tn; + Tq = FNMS(KP500000000, Tk, Td); + Ts = Tq - Tr; + Tw = Tr + Tq; + { + E Tl, Tp, Tt, Tv; + Tl = W[2]; + Tp = W[3]; + Rp[WS(rs, 1)] = FNMS(Tp, Ts, Tl * To); + Rm[WS(rs, 1)] = FMA(Tl, Ts, Tp * To); + Tt = W[6]; + Tv = W[7]; + Rp[WS(rs, 2)] = FNMS(Tv, Tw, Tt * Tu); + Rm[WS(rs, 2)] = FMA(Tt, Tw, Tv * Tu); + } + } + { + E TM, TS, TQ, TU, TK, TP; + TK = FNMS(KP500000000, TB, Ty); + TM = TK - TL; + TS = TK + TL; + TP = FMA(KP500000000, TH, TE); + TQ = TO + TP; + TU = TP - TO; + { + E TJ, TN, TR, TT; + TJ = W[0]; + TN = W[1]; + Ip[0] = FNMS(TN, TQ, TJ * TM); + Im[0] = FMA(TN, TM, TJ * TQ); + TR = W[8]; + TT = W[9]; + Ip[WS(rs, 2)] = FNMS(TT, TU, TR * TS); + Im[WS(rs, 2)] = FMA(TT, TS, TR * TU); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cb_6", twinstr, &GENUS, {32, 14, 14, 0} }; + +void X(codelet_hc2cb_6) (planner *p) { + X(khc2c_register) (p, hc2cb_6, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_8.c new file mode 100644 index 000000000..d825b45ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cb_8.c @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:51 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hc2cb_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 44 additions, 14 multiplications, 22 fused multiply/add), + * 33 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T1i, T1n, Tk, TD, TV, T1b, TQ, Te, T1e, T1o, T1j, TE, TF, TR; + E Tv, TW; + { + E T3, Tg, TC, T19, T6, Tz, Tj, T1a; + { + E T1, T2, TA, TB; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + Tg = T1 - T2; + TA = Ip[0]; + TB = Im[WS(rs, 3)]; + TC = TA + TB; + T19 = TA - TB; + } + { + E T4, T5, Th, Ti; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + Tz = T4 - T5; + Th = Ip[WS(rs, 2)]; + Ti = Im[WS(rs, 1)]; + Tj = Th + Ti; + T1a = Th - Ti; + } + T7 = T3 + T6; + T1i = T3 - T6; + T1n = T19 - T1a; + Tk = Tg - Tj; + TD = Tz + TC; + TV = TC - Tz; + T1b = T19 + T1a; + TQ = Tg + Tj; + } + { + E Ta, Tl, To, T1c, Td, Tq, Tt, T1d, Tp, Tu; + { + E T8, T9, Tm, Tn; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + Tl = T8 - T9; + Tm = Ip[WS(rs, 1)]; + Tn = Im[WS(rs, 2)]; + To = Tm + Tn; + T1c = Tm - Tn; + } + { + E Tb, Tc, Tr, Ts; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + Tq = Tb - Tc; + Tr = Ip[WS(rs, 3)]; + Ts = Im[0]; + Tt = Tr + Ts; + T1d = Tr - Ts; + } + Te = Ta + Td; + T1e = T1c + T1d; + T1o = Ta - Td; + T1j = T1d - T1c; + TE = Tl + To; + TF = Tq + Tt; + TR = TE + TF; + Tp = Tl - To; + Tu = Tq - Tt; + Tv = Tp + Tu; + TW = Tp - Tu; + } + Rp[0] = T7 + Te; + Rm[0] = T1b + T1e; + { + E TS, TX, TT, TY, TP, TU; + TS = FNMS(KP707106781, TR, TQ); + TX = FMA(KP707106781, TW, TV); + TP = W[4]; + TT = TP * TS; + TY = TP * TX; + TU = W[5]; + Ip[WS(rs, 1)] = FNMS(TU, TX, TT); + Im[WS(rs, 1)] = FMA(TU, TS, TY); + } + { + E T1s, T1v, T1t, T1w, T1r, T1u; + T1s = T1i + T1j; + T1v = T1o + T1n; + T1r = W[2]; + T1t = T1r * T1s; + T1w = T1r * T1v; + T1u = W[3]; + Rp[WS(rs, 1)] = FNMS(T1u, T1v, T1t); + Rm[WS(rs, 1)] = FMA(T1u, T1s, T1w); + } + { + E T10, T13, T11, T14, TZ, T12; + T10 = FMA(KP707106781, TR, TQ); + T13 = FNMS(KP707106781, TW, TV); + TZ = W[12]; + T11 = TZ * T10; + T14 = TZ * T13; + T12 = W[13]; + Ip[WS(rs, 3)] = FNMS(T12, T13, T11); + Im[WS(rs, 3)] = FMA(T12, T10, T14); + } + { + E T1f, T15, T17, T18, T1g, T16; + T1f = T1b - T1e; + T16 = T7 - Te; + T15 = W[6]; + T17 = T15 * T16; + T18 = W[7]; + T1g = T18 * T16; + Rp[WS(rs, 2)] = FNMS(T18, T1f, T17); + Rm[WS(rs, 2)] = FMA(T15, T1f, T1g); + } + { + E T1k, T1p, T1l, T1q, T1h, T1m; + T1k = T1i - T1j; + T1p = T1n - T1o; + T1h = W[10]; + T1l = T1h * T1k; + T1q = T1h * T1p; + T1m = W[11]; + Rp[WS(rs, 3)] = FNMS(T1m, T1p, T1l); + Rm[WS(rs, 3)] = FMA(T1m, T1k, T1q); + } + { + E TH, TN, TJ, TL, TM, TO, Tf, Tx, Ty, TI, TG, TK, Tw; + TG = TE - TF; + TH = FNMS(KP707106781, TG, TD); + TN = FMA(KP707106781, TG, TD); + TK = FMA(KP707106781, Tv, Tk); + TJ = W[0]; + TL = TJ * TK; + TM = W[1]; + TO = TM * TK; + Tw = FNMS(KP707106781, Tv, Tk); + Tf = W[8]; + Tx = Tf * Tw; + Ty = W[9]; + TI = Ty * Tw; + Ip[WS(rs, 2)] = FNMS(Ty, TH, Tx); + Im[WS(rs, 2)] = FMA(Tf, TH, TI); + Ip[0] = FNMS(TM, TN, TL); + Im[0] = FMA(TJ, TN, TO); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cb_8", twinstr, &GENUS, {44, 14, 22, 0} }; + +void X(codelet_hc2cb_8) (planner *p) { + X(khc2c_register) (p, hc2cb_8, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hc2cb_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 52 additions, 18 multiplications, 14 fused multiply/add), + * 30 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cb_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T18, T1c, To, Ty, TM, TY, TC, Te, TZ, T10, Tv, Tz, TP, TS; + E TD; + { + E T3, TK, Tk, TX, T6, TW, Tn, TL; + { + E T1, T2, Ti, Tj; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + TK = T1 - T2; + Ti = Ip[0]; + Tj = Im[WS(rs, 3)]; + Tk = Ti - Tj; + TX = Ti + Tj; + } + { + E T4, T5, Tl, Tm; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + TW = T4 - T5; + Tl = Ip[WS(rs, 2)]; + Tm = Im[WS(rs, 1)]; + Tn = Tl - Tm; + TL = Tl + Tm; + } + T7 = T3 + T6; + T18 = TK + TL; + T1c = TX - TW; + To = Tk + Tn; + Ty = T3 - T6; + TM = TK - TL; + TY = TW + TX; + TC = Tk - Tn; + } + { + E Ta, TN, Tr, TO, Td, TQ, Tu, TR; + { + E T8, T9, Tp, Tq; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + TN = T8 - T9; + Tp = Ip[WS(rs, 1)]; + Tq = Im[WS(rs, 2)]; + Tr = Tp - Tq; + TO = Tp + Tq; + } + { + E Tb, Tc, Ts, Tt; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + TQ = Tb - Tc; + Ts = Ip[WS(rs, 3)]; + Tt = Im[0]; + Tu = Ts - Tt; + TR = Ts + Tt; + } + Te = Ta + Td; + TZ = TN + TO; + T10 = TQ + TR; + Tv = Tr + Tu; + Tz = Tu - Tr; + TP = TN - TO; + TS = TQ - TR; + TD = Ta - Td; + } + Rp[0] = T7 + Te; + Rm[0] = To + Tv; + { + E Tg, Tw, Tf, Th; + Tg = T7 - Te; + Tw = To - Tv; + Tf = W[6]; + Th = W[7]; + Rp[WS(rs, 2)] = FNMS(Th, Tw, Tf * Tg); + Rm[WS(rs, 2)] = FMA(Th, Tg, Tf * Tw); + } + { + E TG, TI, TF, TH; + TG = Ty + Tz; + TI = TD + TC; + TF = W[2]; + TH = W[3]; + Rp[WS(rs, 1)] = FNMS(TH, TI, TF * TG); + Rm[WS(rs, 1)] = FMA(TF, TI, TH * TG); + } + { + E TA, TE, Tx, TB; + TA = Ty - Tz; + TE = TC - TD; + Tx = W[10]; + TB = W[11]; + Rp[WS(rs, 3)] = FNMS(TB, TE, Tx * TA); + Rm[WS(rs, 3)] = FMA(Tx, TE, TB * TA); + } + { + E T1a, T1g, T1e, T1i, T19, T1d; + T19 = KP707106781 * (TZ + T10); + T1a = T18 - T19; + T1g = T18 + T19; + T1d = KP707106781 * (TP - TS); + T1e = T1c + T1d; + T1i = T1c - T1d; + { + E T17, T1b, T1f, T1h; + T17 = W[4]; + T1b = W[5]; + Ip[WS(rs, 1)] = FNMS(T1b, T1e, T17 * T1a); + Im[WS(rs, 1)] = FMA(T17, T1e, T1b * T1a); + T1f = W[12]; + T1h = W[13]; + Ip[WS(rs, 3)] = FNMS(T1h, T1i, T1f * T1g); + Im[WS(rs, 3)] = FMA(T1f, T1i, T1h * T1g); + } + } + { + E TU, T14, T12, T16, TT, T11; + TT = KP707106781 * (TP + TS); + TU = TM - TT; + T14 = TM + TT; + T11 = KP707106781 * (TZ - T10); + T12 = TY - T11; + T16 = TY + T11; + { + E TJ, TV, T13, T15; + TJ = W[8]; + TV = W[9]; + Ip[WS(rs, 2)] = FNMS(TV, T12, TJ * TU); + Im[WS(rs, 2)] = FMA(TV, TU, TJ * T12); + T13 = W[0]; + T15 = W[1]; + Ip[0] = FNMS(T15, T16, T13 * T14); + Im[0] = FMA(T15, T14, T13 * T16); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cb_8", twinstr, &GENUS, {52, 18, 14, 0} }; + +void X(codelet_hc2cb_8) (planner *p) { + X(khc2c_register) (p, hc2cb_8, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_16.c new file mode 100644 index 000000000..cfdadb792 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_16.c @@ -0,0 +1,892 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:00 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hc2cbdft2_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 206 FP additions, 100 FP multiplications, + * (or, 136 additions, 30 multiplications, 70 fused multiply/add), + * 66 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tf, T20, T32, T3Q, T3f, T3V, TN, T2a, T1m, T2f, T2G, T3G, T2T, T3L, T1F; + E T26, T2J, T2M, T2N, T2U, T2V, T3H, Tu, T25, T3i, T3R, T1a, T2g, T1y, T21; + E T39, T3W, T1p, T2b; + { + E T3, T1e, TA, T1C, T6, Tx, T1h, T1D, Td, T1A, TL, T1k, Ta, T1z, TG; + E T1j; + { + E T1, T2, T1f, T1g; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + T1e = T1 - T2; + { + E Ty, Tz, T4, T5; + Ty = Ip[0]; + Tz = Im[WS(rs, 7)]; + TA = Ty + Tz; + T1C = Ty - Tz; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + Tx = T4 - T5; + } + T1f = Ip[WS(rs, 4)]; + T1g = Im[WS(rs, 3)]; + T1h = T1f + T1g; + T1D = T1f - T1g; + { + E Tb, Tc, TH, TI, TJ, TK; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + TH = Tb - Tc; + TI = Im[WS(rs, 1)]; + TJ = Ip[WS(rs, 6)]; + TK = TI + TJ; + Td = Tb + Tc; + T1A = TJ - TI; + TL = TH + TK; + T1k = TH - TK; + } + { + E T8, T9, TC, TD, TE, TF; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + TC = T8 - T9; + TD = Ip[WS(rs, 2)]; + TE = Im[WS(rs, 5)]; + TF = TD + TE; + Ta = T8 + T9; + T1z = TD - TE; + TG = TC + TF; + T1j = TC - TF; + } + } + { + E T7, Te, T30, T31; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T20 = T7 - Te; + T30 = TA - Tx; + T31 = T1j - T1k; + T32 = FMA(KP707106781, T31, T30); + T3Q = FNMS(KP707106781, T31, T30); + } + { + E T3d, T3e, TB, TM; + T3d = T1e + T1h; + T3e = TG + TL; + T3f = FNMS(KP707106781, T3e, T3d); + T3V = FMA(KP707106781, T3e, T3d); + TB = Tx + TA; + TM = TG - TL; + TN = FMA(KP707106781, TM, TB); + T2a = FNMS(KP707106781, TM, TB); + } + { + E T1i, T1l, T2E, T2F; + T1i = T1e - T1h; + T1l = T1j + T1k; + T1m = FMA(KP707106781, T1l, T1i); + T2f = FNMS(KP707106781, T1l, T1i); + T2E = T3 - T6; + T2F = T1A - T1z; + T2G = T2E + T2F; + T3G = T2E - T2F; + } + { + E T2R, T2S, T1B, T1E; + T2R = Ta - Td; + T2S = T1C - T1D; + T2T = T2R + T2S; + T3L = T2S - T2R; + T1B = T1z + T1A; + T1E = T1C + T1D; + T1F = T1B + T1E; + T26 = T1E - T1B; + } + } + { + E Ti, T1s, Tl, T1t, TS, TX, T34, T33, T2I, T2H, Tp, T1v, Ts, T1w, T13; + E T18, T37, T36, T2L, T2K; + { + E TT, TR, TO, TW; + { + E Tg, Th, TP, TQ; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + TT = Tg - Th; + TP = Ip[WS(rs, 1)]; + TQ = Im[WS(rs, 6)]; + TR = TP + TQ; + T1s = TP - TQ; + } + { + E Tj, Tk, TU, TV; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + TO = Tj - Tk; + TU = Ip[WS(rs, 5)]; + TV = Im[WS(rs, 2)]; + TW = TU + TV; + T1t = TU - TV; + } + TS = TO + TR; + TX = TT - TW; + T34 = TR - TO; + T33 = TT + TW; + T2I = T1s - T1t; + T2H = Ti - Tl; + } + { + E T14, T12, TZ, T17; + { + E Tn, To, T10, T11; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T14 = Tn - To; + T10 = Im[0]; + T11 = Ip[WS(rs, 7)]; + T12 = T10 + T11; + T1v = T11 - T10; + } + { + E Tq, Tr, T15, T16; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + TZ = Tq - Tr; + T15 = Ip[WS(rs, 3)]; + T16 = Im[WS(rs, 4)]; + T17 = T15 + T16; + T1w = T15 - T16; + } + T13 = TZ - T12; + T18 = T14 - T17; + T37 = TZ + T12; + T36 = T14 + T17; + T2L = T1v - T1w; + T2K = Tp - Ts; + } + T2J = T2H - T2I; + T2M = T2K + T2L; + T2N = T2J + T2M; + T2U = T2H + T2I; + T2V = T2L - T2K; + T3H = T2V - T2U; + { + E Tm, Tt, T3g, T3h; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T25 = Tm - Tt; + T3g = FNMS(KP414213562, T33, T34); + T3h = FNMS(KP414213562, T36, T37); + T3i = T3g + T3h; + T3R = T3h - T3g; + } + { + E TY, T19, T1u, T1x; + TY = FMA(KP414213562, TX, TS); + T19 = FNMS(KP414213562, T18, T13); + T1a = TY + T19; + T2g = T19 - TY; + T1u = T1s + T1t; + T1x = T1v + T1w; + T1y = T1u + T1x; + T21 = T1x - T1u; + } + { + E T35, T38, T1n, T1o; + T35 = FMA(KP414213562, T34, T33); + T38 = FMA(KP414213562, T37, T36); + T39 = T35 - T38; + T3W = T35 + T38; + T1n = FNMS(KP414213562, TS, TX); + T1o = FMA(KP414213562, T13, T18); + T1p = T1n + T1o; + T2b = T1n - T1o; + } + } + { + E Tv, T1G, T1b, T1q, T1c, T1H, Tw, T1r, T1I, T1d; + Tv = Tf + Tu; + T1G = T1y + T1F; + T1b = FMA(KP923879532, T1a, TN); + T1q = FMA(KP923879532, T1p, T1m); + Tw = W[0]; + T1c = Tw * T1b; + T1H = Tw * T1q; + T1d = W[1]; + T1r = FMA(T1d, T1q, T1c); + T1I = FNMS(T1d, T1b, T1H); + Rp[0] = Tv - T1r; + Ip[0] = T1G + T1I; + Rm[0] = Tv + T1r; + Im[0] = T1I - T1G; + } + { + E T1N, T1J, T1L, T1M, T1V, T1Q, T1T, T1R, T1X, T1K, T1P; + T1N = T1F - T1y; + T1K = Tf - Tu; + T1J = W[14]; + T1L = T1J * T1K; + T1M = W[15]; + T1V = T1M * T1K; + T1Q = FNMS(KP923879532, T1a, TN); + T1T = FNMS(KP923879532, T1p, T1m); + T1P = W[16]; + T1R = T1P * T1Q; + T1X = T1P * T1T; + { + E T1O, T1W, T1U, T1Y, T1S; + T1O = FNMS(T1M, T1N, T1L); + T1W = FMA(T1J, T1N, T1V); + T1S = W[17]; + T1U = FMA(T1S, T1T, T1R); + T1Y = FNMS(T1S, T1Q, T1X); + Rp[WS(rs, 4)] = T1O - T1U; + Ip[WS(rs, 4)] = T1W + T1Y; + Rm[WS(rs, 4)] = T1O + T1U; + Im[WS(rs, 4)] = T1Y - T1W; + } + } + { + E T2r, T2n, T2p, T2q, T2z, T2u, T2x, T2v, T2B, T2o, T2t; + T2r = T26 - T25; + T2o = T20 - T21; + T2n = W[22]; + T2p = T2n * T2o; + T2q = W[23]; + T2z = T2q * T2o; + T2u = FNMS(KP923879532, T2b, T2a); + T2x = FNMS(KP923879532, T2g, T2f); + T2t = W[24]; + T2v = T2t * T2u; + T2B = T2t * T2x; + { + E T2s, T2A, T2y, T2C, T2w; + T2s = FNMS(T2q, T2r, T2p); + T2A = FMA(T2n, T2r, T2z); + T2w = W[25]; + T2y = FMA(T2w, T2x, T2v); + T2C = FNMS(T2w, T2u, T2B); + Rp[WS(rs, 6)] = T2s - T2y; + Ip[WS(rs, 6)] = T2A + T2C; + Rm[WS(rs, 6)] = T2s + T2y; + Im[WS(rs, 6)] = T2C - T2A; + } + } + { + E T27, T1Z, T23, T24, T2j, T2c, T2h, T2d, T2l, T22, T29; + T27 = T25 + T26; + T22 = T20 + T21; + T1Z = W[6]; + T23 = T1Z * T22; + T24 = W[7]; + T2j = T24 * T22; + T2c = FMA(KP923879532, T2b, T2a); + T2h = FMA(KP923879532, T2g, T2f); + T29 = W[8]; + T2d = T29 * T2c; + T2l = T29 * T2h; + { + E T28, T2k, T2i, T2m, T2e; + T28 = FNMS(T24, T27, T23); + T2k = FMA(T1Z, T27, T2j); + T2e = W[9]; + T2i = FMA(T2e, T2h, T2d); + T2m = FNMS(T2e, T2c, T2l); + Rp[WS(rs, 2)] = T28 - T2i; + Ip[WS(rs, 2)] = T2k + T2m; + Rm[WS(rs, 2)] = T28 + T2i; + Im[WS(rs, 2)] = T2m - T2k; + } + } + { + E T3N, T47, T43, T45, T46, T4f, T3F, T3J, T3K, T3Z, T3S, T3X, T3T, T41, T4a; + E T4d, T4b, T4h; + { + E T3M, T44, T3I, T3P, T49; + T3M = T2J - T2M; + T3N = FMA(KP707106781, T3M, T3L); + T47 = FNMS(KP707106781, T3M, T3L); + T44 = FNMS(KP707106781, T3H, T3G); + T43 = W[26]; + T45 = T43 * T44; + T46 = W[27]; + T4f = T46 * T44; + T3I = FMA(KP707106781, T3H, T3G); + T3F = W[10]; + T3J = T3F * T3I; + T3K = W[11]; + T3Z = T3K * T3I; + T3S = FMA(KP923879532, T3R, T3Q); + T3X = FNMS(KP923879532, T3W, T3V); + T3P = W[12]; + T3T = T3P * T3S; + T41 = T3P * T3X; + T4a = FNMS(KP923879532, T3R, T3Q); + T4d = FMA(KP923879532, T3W, T3V); + T49 = W[28]; + T4b = T49 * T4a; + T4h = T49 * T4d; + } + { + E T3O, T40, T3Y, T42, T3U; + T3O = FNMS(T3K, T3N, T3J); + T40 = FMA(T3F, T3N, T3Z); + T3U = W[13]; + T3Y = FMA(T3U, T3X, T3T); + T42 = FNMS(T3U, T3S, T41); + Rp[WS(rs, 3)] = T3O - T3Y; + Ip[WS(rs, 3)] = T40 + T42; + Rm[WS(rs, 3)] = T3O + T3Y; + Im[WS(rs, 3)] = T42 - T40; + } + { + E T48, T4g, T4e, T4i, T4c; + T48 = FNMS(T46, T47, T45); + T4g = FMA(T43, T47, T4f); + T4c = W[29]; + T4e = FMA(T4c, T4d, T4b); + T4i = FNMS(T4c, T4a, T4h); + Rp[WS(rs, 7)] = T48 - T4e; + Ip[WS(rs, 7)] = T4g + T4i; + Rm[WS(rs, 7)] = T48 + T4e; + Im[WS(rs, 7)] = T4i - T4g; + } + } + { + E T2X, T3t, T3p, T3r, T3s, T3B, T2D, T2P, T2Q, T3l, T3a, T3j, T3b, T3n, T3w; + E T3z, T3x, T3D; + { + E T2W, T3q, T2O, T2Z, T3v; + T2W = T2U + T2V; + T2X = FMA(KP707106781, T2W, T2T); + T3t = FNMS(KP707106781, T2W, T2T); + T3q = FNMS(KP707106781, T2N, T2G); + T3p = W[18]; + T3r = T3p * T3q; + T3s = W[19]; + T3B = T3s * T3q; + T2O = FMA(KP707106781, T2N, T2G); + T2D = W[2]; + T2P = T2D * T2O; + T2Q = W[3]; + T3l = T2Q * T2O; + T3a = FMA(KP923879532, T39, T32); + T3j = FNMS(KP923879532, T3i, T3f); + T2Z = W[4]; + T3b = T2Z * T3a; + T3n = T2Z * T3j; + T3w = FNMS(KP923879532, T39, T32); + T3z = FMA(KP923879532, T3i, T3f); + T3v = W[20]; + T3x = T3v * T3w; + T3D = T3v * T3z; + } + { + E T2Y, T3m, T3k, T3o, T3c; + T2Y = FNMS(T2Q, T2X, T2P); + T3m = FMA(T2D, T2X, T3l); + T3c = W[5]; + T3k = FMA(T3c, T3j, T3b); + T3o = FNMS(T3c, T3a, T3n); + Rp[WS(rs, 1)] = T2Y - T3k; + Ip[WS(rs, 1)] = T3m + T3o; + Rm[WS(rs, 1)] = T2Y + T3k; + Im[WS(rs, 1)] = T3o - T3m; + } + { + E T3u, T3C, T3A, T3E, T3y; + T3u = FNMS(T3s, T3t, T3r); + T3C = FMA(T3p, T3t, T3B); + T3y = W[21]; + T3A = FMA(T3y, T3z, T3x); + T3E = FNMS(T3y, T3w, T3D); + Rp[WS(rs, 5)] = T3u - T3A; + Ip[WS(rs, 5)] = T3C + T3E; + Rm[WS(rs, 5)] = T3u + T3A; + Im[WS(rs, 5)] = T3E - T3C; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cbdft2_16", twinstr, &GENUS, {136, 30, 70, 0} }; + +void X(codelet_hc2cbdft2_16) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_16, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hc2cbdft2_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 206 FP additions, 84 FP multiplications, + * (or, 168 additions, 46 multiplications, 38 fused multiply/add), + * 60 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E TB, T2L, T30, T1n, Tf, T1U, T2H, T3p, T1E, T1Z, TM, T31, T2s, T3k, T1i; + E T2M, Tu, T1Y, T2Q, T2X, T2T, T2Y, TY, T1d, T19, T1e, T2v, T2C, T2y, T2D; + E T1x, T1V; + { + E T3, T1j, TA, T1B, T6, Tx, T1m, T1C, Ta, TC, TF, T1y, Td, TH, TK; + E T1z; + { + E T1, T2, Ty, Tz; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + T1j = T1 - T2; + Ty = Ip[0]; + Tz = Im[WS(rs, 7)]; + TA = Ty + Tz; + T1B = Ty - Tz; + } + { + E T4, T5, T1k, T1l; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + Tx = T4 - T5; + T1k = Ip[WS(rs, 4)]; + T1l = Im[WS(rs, 3)]; + T1m = T1k + T1l; + T1C = T1k - T1l; + } + { + E T8, T9, TD, TE; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + TC = T8 - T9; + TD = Ip[WS(rs, 2)]; + TE = Im[WS(rs, 5)]; + TF = TD + TE; + T1y = TD - TE; + } + { + E Tb, Tc, TI, TJ; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + Td = Tb + Tc; + TH = Tb - Tc; + TI = Im[WS(rs, 1)]; + TJ = Ip[WS(rs, 6)]; + TK = TI + TJ; + T1z = TJ - TI; + } + { + E T7, Te, TG, TL; + TB = Tx + TA; + T2L = TA - Tx; + T30 = T1j + T1m; + T1n = T1j - T1m; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T1U = T7 - Te; + { + E T2F, T2G, T1A, T1D; + T2F = Ta - Td; + T2G = T1B - T1C; + T2H = T2F + T2G; + T3p = T2G - T2F; + T1A = T1y + T1z; + T1D = T1B + T1C; + T1E = T1A + T1D; + T1Z = T1D - T1A; + } + TG = TC + TF; + TL = TH + TK; + TM = KP707106781 * (TG - TL); + T31 = KP707106781 * (TG + TL); + { + E T2q, T2r, T1g, T1h; + T2q = T3 - T6; + T2r = T1z - T1y; + T2s = T2q + T2r; + T3k = T2q - T2r; + T1g = TC - TF; + T1h = TH - TK; + T1i = KP707106781 * (T1g + T1h); + T2M = KP707106781 * (T1g - T1h); + } + } + } + { + E Ti, TT, TR, T1r, Tl, TO, TW, T1s, Tp, T14, T12, T1u, Ts, TZ, T17; + E T1v; + { + E Tg, Th, TP, TQ; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + TT = Tg - Th; + TP = Ip[WS(rs, 1)]; + TQ = Im[WS(rs, 6)]; + TR = TP + TQ; + T1r = TP - TQ; + } + { + E Tj, Tk, TU, TV; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + TO = Tj - Tk; + TU = Ip[WS(rs, 5)]; + TV = Im[WS(rs, 2)]; + TW = TU + TV; + T1s = TU - TV; + } + { + E Tn, To, T10, T11; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T14 = Tn - To; + T10 = Im[0]; + T11 = Ip[WS(rs, 7)]; + T12 = T10 + T11; + T1u = T11 - T10; + } + { + E Tq, Tr, T15, T16; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + TZ = Tq - Tr; + T15 = Ip[WS(rs, 3)]; + T16 = Im[WS(rs, 4)]; + T17 = T15 + T16; + T1v = T15 - T16; + } + { + E Tm, Tt, T2O, T2P; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T1Y = Tm - Tt; + T2O = TR - TO; + T2P = TT + TW; + T2Q = FMA(KP382683432, T2O, KP923879532 * T2P); + T2X = FNMS(KP923879532, T2O, KP382683432 * T2P); + } + { + E T2R, T2S, TS, TX; + T2R = TZ + T12; + T2S = T14 + T17; + T2T = FMA(KP382683432, T2R, KP923879532 * T2S); + T2Y = FNMS(KP923879532, T2R, KP382683432 * T2S); + TS = TO + TR; + TX = TT - TW; + TY = FMA(KP923879532, TS, KP382683432 * TX); + T1d = FNMS(KP382683432, TS, KP923879532 * TX); + } + { + E T13, T18, T2t, T2u; + T13 = TZ - T12; + T18 = T14 - T17; + T19 = FNMS(KP382683432, T18, KP923879532 * T13); + T1e = FMA(KP382683432, T13, KP923879532 * T18); + T2t = Ti - Tl; + T2u = T1r - T1s; + T2v = T2t - T2u; + T2C = T2t + T2u; + } + { + E T2w, T2x, T1t, T1w; + T2w = Tp - Ts; + T2x = T1u - T1v; + T2y = T2w + T2x; + T2D = T2x - T2w; + T1t = T1r + T1s; + T1w = T1u + T1v; + T1x = T1t + T1w; + T1V = T1w - T1t; + } + } + { + E Tv, T1F, T1b, T1N, T1p, T1P, T1L, T1R; + Tv = Tf + Tu; + T1F = T1x + T1E; + { + E TN, T1a, T1f, T1o; + TN = TB + TM; + T1a = TY + T19; + T1b = TN + T1a; + T1N = TN - T1a; + T1f = T1d + T1e; + T1o = T1i + T1n; + T1p = T1f + T1o; + T1P = T1o - T1f; + { + E T1I, T1K, T1H, T1J; + T1I = Tf - Tu; + T1K = T1E - T1x; + T1H = W[14]; + T1J = W[15]; + T1L = FNMS(T1J, T1K, T1H * T1I); + T1R = FMA(T1J, T1I, T1H * T1K); + } + } + { + E T1q, T1G, Tw, T1c; + Tw = W[0]; + T1c = W[1]; + T1q = FMA(Tw, T1b, T1c * T1p); + T1G = FNMS(T1c, T1b, Tw * T1p); + Rp[0] = Tv - T1q; + Ip[0] = T1F + T1G; + Rm[0] = Tv + T1q; + Im[0] = T1G - T1F; + } + { + E T1Q, T1S, T1M, T1O; + T1M = W[16]; + T1O = W[17]; + T1Q = FMA(T1M, T1N, T1O * T1P); + T1S = FNMS(T1O, T1N, T1M * T1P); + Rp[WS(rs, 4)] = T1L - T1Q; + Ip[WS(rs, 4)] = T1R + T1S; + Rm[WS(rs, 4)] = T1L + T1Q; + Im[WS(rs, 4)] = T1S - T1R; + } + } + { + E T25, T2j, T29, T2l, T21, T2b, T2h, T2n; + { + E T23, T24, T27, T28; + T23 = TB - TM; + T24 = T1d - T1e; + T25 = T23 + T24; + T2j = T23 - T24; + T27 = T19 - TY; + T28 = T1n - T1i; + T29 = T27 + T28; + T2l = T28 - T27; + } + { + E T1W, T20, T1T, T1X; + T1W = T1U + T1V; + T20 = T1Y + T1Z; + T1T = W[6]; + T1X = W[7]; + T21 = FNMS(T1X, T20, T1T * T1W); + T2b = FMA(T1X, T1W, T1T * T20); + } + { + E T2e, T2g, T2d, T2f; + T2e = T1U - T1V; + T2g = T1Z - T1Y; + T2d = W[22]; + T2f = W[23]; + T2h = FNMS(T2f, T2g, T2d * T2e); + T2n = FMA(T2f, T2e, T2d * T2g); + } + { + E T2a, T2c, T22, T26; + T22 = W[8]; + T26 = W[9]; + T2a = FMA(T22, T25, T26 * T29); + T2c = FNMS(T26, T25, T22 * T29); + Rp[WS(rs, 2)] = T21 - T2a; + Ip[WS(rs, 2)] = T2b + T2c; + Rm[WS(rs, 2)] = T21 + T2a; + Im[WS(rs, 2)] = T2c - T2b; + } + { + E T2m, T2o, T2i, T2k; + T2i = W[24]; + T2k = W[25]; + T2m = FMA(T2i, T2j, T2k * T2l); + T2o = FNMS(T2k, T2j, T2i * T2l); + Rp[WS(rs, 6)] = T2h - T2m; + Ip[WS(rs, 6)] = T2n + T2o; + Rm[WS(rs, 6)] = T2h + T2m; + Im[WS(rs, 6)] = T2o - T2n; + } + } + { + E T2A, T38, T2I, T3a, T2V, T3d, T33, T3f, T2z, T2E; + T2z = KP707106781 * (T2v + T2y); + T2A = T2s + T2z; + T38 = T2s - T2z; + T2E = KP707106781 * (T2C + T2D); + T2I = T2E + T2H; + T3a = T2H - T2E; + { + E T2N, T2U, T2Z, T32; + T2N = T2L + T2M; + T2U = T2Q - T2T; + T2V = T2N + T2U; + T3d = T2N - T2U; + T2Z = T2X + T2Y; + T32 = T30 - T31; + T33 = T2Z + T32; + T3f = T32 - T2Z; + } + { + E T2J, T35, T34, T36; + { + E T2p, T2B, T2K, T2W; + T2p = W[2]; + T2B = W[3]; + T2J = FNMS(T2B, T2I, T2p * T2A); + T35 = FMA(T2B, T2A, T2p * T2I); + T2K = W[4]; + T2W = W[5]; + T34 = FMA(T2K, T2V, T2W * T33); + T36 = FNMS(T2W, T2V, T2K * T33); + } + Rp[WS(rs, 1)] = T2J - T34; + Ip[WS(rs, 1)] = T35 + T36; + Rm[WS(rs, 1)] = T2J + T34; + Im[WS(rs, 1)] = T36 - T35; + } + { + E T3b, T3h, T3g, T3i; + { + E T37, T39, T3c, T3e; + T37 = W[18]; + T39 = W[19]; + T3b = FNMS(T39, T3a, T37 * T38); + T3h = FMA(T39, T38, T37 * T3a); + T3c = W[20]; + T3e = W[21]; + T3g = FMA(T3c, T3d, T3e * T3f); + T3i = FNMS(T3e, T3d, T3c * T3f); + } + Rp[WS(rs, 5)] = T3b - T3g; + Ip[WS(rs, 5)] = T3h + T3i; + Rm[WS(rs, 5)] = T3b + T3g; + Im[WS(rs, 5)] = T3i - T3h; + } + } + { + E T3m, T3E, T3q, T3G, T3v, T3J, T3z, T3L, T3l, T3o; + T3l = KP707106781 * (T2D - T2C); + T3m = T3k + T3l; + T3E = T3k - T3l; + T3o = KP707106781 * (T2v - T2y); + T3q = T3o + T3p; + T3G = T3p - T3o; + { + E T3t, T3u, T3x, T3y; + T3t = T2L - T2M; + T3u = T2X - T2Y; + T3v = T3t + T3u; + T3J = T3t - T3u; + T3x = T31 + T30; + T3y = T2Q + T2T; + T3z = T3x - T3y; + T3L = T3y + T3x; + } + { + E T3r, T3B, T3A, T3C; + { + E T3j, T3n, T3s, T3w; + T3j = W[10]; + T3n = W[11]; + T3r = FNMS(T3n, T3q, T3j * T3m); + T3B = FMA(T3n, T3m, T3j * T3q); + T3s = W[12]; + T3w = W[13]; + T3A = FMA(T3s, T3v, T3w * T3z); + T3C = FNMS(T3w, T3v, T3s * T3z); + } + Rp[WS(rs, 3)] = T3r - T3A; + Ip[WS(rs, 3)] = T3B + T3C; + Rm[WS(rs, 3)] = T3r + T3A; + Im[WS(rs, 3)] = T3C - T3B; + } + { + E T3H, T3N, T3M, T3O; + { + E T3D, T3F, T3I, T3K; + T3D = W[26]; + T3F = W[27]; + T3H = FNMS(T3F, T3G, T3D * T3E); + T3N = FMA(T3F, T3E, T3D * T3G); + T3I = W[28]; + T3K = W[29]; + T3M = FMA(T3I, T3J, T3K * T3L); + T3O = FNMS(T3K, T3J, T3I * T3L); + } + Rp[WS(rs, 7)] = T3H - T3M; + Ip[WS(rs, 7)] = T3N + T3O; + Rm[WS(rs, 7)] = T3H + T3M; + Im[WS(rs, 7)] = T3O - T3N; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cbdft2_16", twinstr, &GENUS, {168, 46, 38, 0} }; + +void X(codelet_hc2cbdft2_16) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_16, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_20.c new file mode 100644 index 000000000..bb2117937 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_20.c @@ -0,0 +1,1149 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:01 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hc2cbdft2_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 286 FP additions, 148 FP multiplications, + * (or, 176 additions, 38 multiplications, 110 fused multiply/add), + * 104 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T27, T2o, T3T, T41, T2p, T40, T1N, T2Q, T1w, T2L, T4n, T59, T4A, T5e, T24; + E T2m, T2h, T2Z, T3P, T4J, T3W, T3Y, T7, TC, T2c, T2d, T3y, T3F, T3G, T3H; + E T46, T4d, T4e, T4f, T4r, T4u, T4v, T4w, T1E, T1H, T1I, T1J, TJ, T16, T17; + E T18; + { + E T3, T1A, TI, T25, T6, TF, T1D, T26, Te, T47, T4k, TO, T1e, T3z, T3M; + E T1S, Tt, T4a, T4h, TZ, T1p, T3C, T3J, T1Z, TA, T4b, T4i, T14, T1u, T3D; + E T3K, T22, Tl, T48, T4l, TT, T1j, T3A, T3N, T1V; + { + E T1, T2, TG, TH; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T1A = T1 - T2; + TG = Ip[0]; + TH = Im[WS(rs, 9)]; + TI = TG + TH; + T25 = TG - TH; + } + { + E T4, T5, T1B, T1C; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + TF = T4 - T5; + T1B = Ip[WS(rs, 5)]; + T1C = Im[WS(rs, 4)]; + T1D = T1B + T1C; + T26 = T1B - T1C; + } + { + E Ta, T1a, TN, T1Q, Td, TK, T1d, T1R; + { + E T8, T9, TL, TM; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T1a = T8 - T9; + TL = Ip[WS(rs, 4)]; + TM = Im[WS(rs, 5)]; + TN = TL + TM; + T1Q = TL - TM; + } + { + E Tb, Tc, T1b, T1c; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + TK = Tb - Tc; + T1b = Ip[WS(rs, 9)]; + T1c = Im[0]; + T1d = T1b + T1c; + T1R = T1b - T1c; + } + Te = Ta + Td; + T47 = TN - TK; + T4k = T1a + T1d; + TO = TK + TN; + T1e = T1a - T1d; + T3z = Ta - Td; + T3M = T1Q - T1R; + T1S = T1Q + T1R; + } + { + E Tp, T1l, TY, T1X, Ts, TV, T1o, T1Y; + { + E Tn, To, TW, TX; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T1l = Tn - To; + TW = Ip[WS(rs, 8)]; + TX = Im[WS(rs, 1)]; + TY = TW + TX; + T1X = TW - TX; + } + { + E Tq, Tr, T1m, T1n; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + TV = Tq - Tr; + T1m = Im[WS(rs, 6)]; + T1n = Ip[WS(rs, 3)]; + T1o = T1m + T1n; + T1Y = T1n - T1m; + } + Tt = Tp + Ts; + T4a = TY - TV; + T4h = T1l - T1o; + TZ = TV + TY; + T1p = T1l + T1o; + T3C = Tp - Ts; + T3J = T1X - T1Y; + T1Z = T1X + T1Y; + } + { + E Tw, T1q, T13, T20, Tz, T10, T1t, T21; + { + E Tu, Tv, T11, T12; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T1q = Tu - Tv; + T11 = Im[WS(rs, 7)]; + T12 = Ip[WS(rs, 2)]; + T13 = T11 + T12; + T20 = T12 - T11; + } + { + E Tx, Ty, T1r, T1s; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + T10 = Tx - Ty; + T1r = Im[WS(rs, 2)]; + T1s = Ip[WS(rs, 7)]; + T1t = T1r + T1s; + T21 = T1s - T1r; + } + TA = Tw + Tz; + T4b = T10 + T13; + T4i = T1q - T1t; + T14 = T10 - T13; + T1u = T1q + T1t; + T3D = Tw - Tz; + T3K = T20 - T21; + T22 = T20 + T21; + } + { + E Th, T1f, TS, T1T, Tk, TP, T1i, T1U; + { + E Tf, Tg, TQ, TR; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T1f = Tf - Tg; + TQ = Im[WS(rs, 3)]; + TR = Ip[WS(rs, 6)]; + TS = TQ + TR; + T1T = TR - TQ; + } + { + E Ti, Tj, T1g, T1h; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + TP = Ti - Tj; + T1g = Ip[WS(rs, 1)]; + T1h = Im[WS(rs, 8)]; + T1i = T1g + T1h; + T1U = T1g - T1h; + } + Tl = Th + Tk; + T48 = TP + TS; + T4l = T1f + T1i; + TT = TP - TS; + T1j = T1f - T1i; + T3A = Th - Tk; + T3N = T1T - T1U; + T1V = T1T + T1U; + } + T27 = T25 + T26; + T2o = Tt - TA; + T3T = T25 - T26; + T41 = T3z - T3A; + T2p = Te - Tl; + { + E T1L, T1M, T1k, T1v; + T40 = T3C - T3D; + T1L = TO - TT; + T1M = TZ - T14; + T1N = FMA(KP618033988, T1M, T1L); + T2Q = FNMS(KP618033988, T1L, T1M); + T1k = T1e - T1j; + T1v = T1p - T1u; + T1w = FMA(KP618033988, T1v, T1k); + T2L = FNMS(KP618033988, T1k, T1v); + { + E T4j, T4m, T4y, T4z; + T4j = T4h - T4i; + T4m = T4k - T4l; + T4n = FNMS(KP618033988, T4m, T4j); + T59 = FMA(KP618033988, T4j, T4m); + T4y = T4a + T4b; + T4z = T47 + T48; + T4A = FNMS(KP618033988, T4z, T4y); + T5e = FMA(KP618033988, T4y, T4z); + } + } + { + E T3L, T3O, T4s, T4t; + { + E T1W, T23, T2f, T2g; + T1W = T1S + T1V; + T23 = T1Z + T22; + T24 = T1W + T23; + T2m = T1W - T23; + T2f = T1Z - T22; + T2g = T1S - T1V; + T2h = FNMS(KP618033988, T2g, T2f); + T2Z = FMA(KP618033988, T2f, T2g); + } + T3L = T3J - T3K; + T3O = T3M - T3N; + T3P = FNMS(KP618033988, T3O, T3L); + T4J = FMA(KP618033988, T3L, T3O); + { + E T3U, T3V, Tm, TB; + T3U = T3M + T3N; + T3V = T3J + T3K; + T3W = T3U + T3V; + T3Y = T3U - T3V; + T7 = T3 + T6; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T2c = FNMS(KP250000000, TC, T7); + T2d = Tm - TB; + } + { + E T3B, T3E, T49, T4c; + T3y = T3 - T6; + T3B = T3z + T3A; + T3E = T3C + T3D; + T3F = T3B + T3E; + T3G = FNMS(KP250000000, T3F, T3y); + T3H = T3B - T3E; + T46 = TI - TF; + T49 = T47 - T48; + T4c = T4a - T4b; + T4d = T49 + T4c; + T4e = FNMS(KP250000000, T4d, T46); + T4f = T49 - T4c; + } + T4r = T1A + T1D; + T4s = T4k + T4l; + T4t = T4h + T4i; + T4u = T4s + T4t; + T4v = FNMS(KP250000000, T4u, T4r); + T4w = T4s - T4t; + { + E T1F, T1G, TU, T15; + T1E = T1A - T1D; + T1F = T1e + T1j; + T1G = T1p + T1u; + T1H = T1F + T1G; + T1I = FNMS(KP250000000, T1H, T1E); + T1J = T1F - T1G; + TJ = TF + TI; + TU = TO + TT; + T15 = TZ + T14; + T16 = TU + T15; + T17 = FNMS(KP250000000, T16, TJ); + T18 = TU - T15; + } + } + } + { + E TD, T28, T3o, T3r, T3p, T3v, T2r, T3l, T2H, T35, T2b, T2j, T2k, T2z, T2D; + E T2F, T2G, T2T, T2X, T31, T32, T3d, T3h, T3j, T3k, T3t, T1x, T2u, T1O, T2x; + E T1y, T29, T2v, T2B, T2M, T38, T2R, T3b, T2N, T2V, T39, T3f, T3n, T1P, T2a; + E T1z; + TD = T7 + TC; + T28 = T24 + T27; + T3o = TJ + T16; + T3r = T1H + T1E; + T3n = W[8]; + T3p = T3n * T3o; + T3v = T3n * T3r; + { + E T2q, T34, T2n, T33, T2l; + T2q = FNMS(KP618033988, T2p, T2o); + T34 = FMA(KP618033988, T2o, T2p); + T2l = FNMS(KP250000000, T24, T27); + T2n = FNMS(KP559016994, T2m, T2l); + T33 = FMA(KP559016994, T2m, T2l); + T2r = FMA(KP951056516, T2q, T2n); + T3l = FNMS(KP951056516, T34, T33); + T2H = FNMS(KP951056516, T2q, T2n); + T35 = FMA(KP951056516, T34, T33); + } + { + E T2i, T2E, T2e, T30, T3i, T2Y; + T2e = FNMS(KP559016994, T2d, T2c); + T2i = FNMS(KP951056516, T2h, T2e); + T2E = FMA(KP951056516, T2h, T2e); + T2b = W[14]; + T2j = T2b * T2i; + T2k = W[15]; + T2z = T2k * T2i; + T2D = W[22]; + T2F = T2D * T2E; + T2G = W[23]; + T2T = T2G * T2E; + T2Y = FMA(KP559016994, T2d, T2c); + T30 = FNMS(KP951056516, T2Z, T2Y); + T3i = FMA(KP951056516, T2Z, T2Y); + T2X = W[30]; + T31 = T2X * T30; + T32 = W[31]; + T3d = T32 * T30; + T3h = W[6]; + T3j = T3h * T3i; + T3k = W[7]; + T3t = T3k * T3i; + } + { + E T19, T1K, TE, T2t; + T19 = FMA(KP559016994, T18, T17); + T1x = FMA(KP951056516, T1w, T19); + T2u = FNMS(KP951056516, T1w, T19); + T1K = FMA(KP559016994, T1J, T1I); + T1O = FNMS(KP951056516, T1N, T1K); + T2x = FMA(KP951056516, T1N, T1K); + TE = W[0]; + T1y = TE * T1x; + T29 = TE * T1O; + T2t = W[16]; + T2v = T2t * T2u; + T2B = T2t * T2x; + } + { + E T2K, T2P, T2J, T37; + T2K = FNMS(KP559016994, T18, T17); + T2M = FMA(KP951056516, T2L, T2K); + T38 = FNMS(KP951056516, T2L, T2K); + T2P = FNMS(KP559016994, T1J, T1I); + T2R = FNMS(KP951056516, T2Q, T2P); + T3b = FMA(KP951056516, T2Q, T2P); + T2J = W[24]; + T2N = T2J * T2M; + T2V = T2J * T2R; + T37 = W[32]; + T39 = T37 * T38; + T3f = T37 * T3b; + } + T1z = W[1]; + T1P = FMA(T1z, T1O, T1y); + T2a = FNMS(T1z, T1x, T29); + Rp[0] = TD - T1P; + Ip[0] = T28 + T2a; + Rm[0] = TD + T1P; + Im[0] = T2a - T28; + { + E T3m, T3u, T3s, T3w, T3q; + T3m = FNMS(T3k, T3l, T3j); + T3u = FMA(T3h, T3l, T3t); + T3q = W[9]; + T3s = FMA(T3q, T3r, T3p); + T3w = FNMS(T3q, T3o, T3v); + Rp[WS(rs, 2)] = T3m - T3s; + Ip[WS(rs, 2)] = T3u + T3w; + Rm[WS(rs, 2)] = T3m + T3s; + Im[WS(rs, 2)] = T3w - T3u; + } + { + E T2s, T2A, T2y, T2C, T2w; + T2s = FNMS(T2k, T2r, T2j); + T2A = FMA(T2b, T2r, T2z); + T2w = W[17]; + T2y = FMA(T2w, T2x, T2v); + T2C = FNMS(T2w, T2u, T2B); + Rp[WS(rs, 4)] = T2s - T2y; + Ip[WS(rs, 4)] = T2A + T2C; + Rm[WS(rs, 4)] = T2s + T2y; + Im[WS(rs, 4)] = T2C - T2A; + } + { + E T2I, T2U, T2S, T2W, T2O; + T2I = FNMS(T2G, T2H, T2F); + T2U = FMA(T2D, T2H, T2T); + T2O = W[25]; + T2S = FMA(T2O, T2R, T2N); + T2W = FNMS(T2O, T2M, T2V); + Rp[WS(rs, 6)] = T2I - T2S; + Ip[WS(rs, 6)] = T2U + T2W; + Rm[WS(rs, 6)] = T2I + T2S; + Im[WS(rs, 6)] = T2W - T2U; + } + { + E T36, T3e, T3c, T3g, T3a; + T36 = FNMS(T32, T35, T31); + T3e = FMA(T2X, T35, T3d); + T3a = W[33]; + T3c = FMA(T3a, T3b, T39); + T3g = FNMS(T3a, T38, T3f); + Rp[WS(rs, 8)] = T36 - T3c; + Ip[WS(rs, 8)] = T3e + T3g; + Rm[WS(rs, 8)] = T36 + T3c; + Im[WS(rs, 8)] = T3g - T3e; + } + } + { + E T55, T51, T53, T54, T5h, T5I, T5L, T5J, T5P, T43, T5F, T4P, T5p, T3x, T3R; + E T3S, T4D, T5l, T5n, T5o, T5x, T4H, T4L, T4M, T4X, T5B, T5D, T5E, T5N, T4o; + E T4S, T4B, T4V, T4p, T4F, T4T, T4Z, T5a, T5s, T5f, T5v, T5b, T5j, T5t, T5z; + E T52, T5H; + T55 = T3W + T3T; + T52 = T3y + T3F; + T51 = W[18]; + T53 = T51 * T52; + T54 = W[19]; + T5h = T54 * T52; + T5I = T46 + T4d; + T5L = T4u + T4r; + T5H = W[28]; + T5J = T5H * T5I; + T5P = T5H * T5L; + { + E T42, T4O, T3Z, T4N, T3X; + T42 = FNMS(KP618033988, T41, T40); + T4O = FMA(KP618033988, T40, T41); + T3X = FNMS(KP250000000, T3W, T3T); + T3Z = FNMS(KP559016994, T3Y, T3X); + T4N = FMA(KP559016994, T3Y, T3X); + T43 = FNMS(KP951056516, T42, T3Z); + T5F = FNMS(KP951056516, T4O, T4N); + T4P = FMA(KP951056516, T4O, T4N); + T5p = FMA(KP951056516, T42, T3Z); + } + { + E T3Q, T5m, T3I, T4K, T5C, T4I; + T3I = FNMS(KP559016994, T3H, T3G); + T3Q = FMA(KP951056516, T3P, T3I); + T5m = FNMS(KP951056516, T3P, T3I); + T3x = W[2]; + T3R = T3x * T3Q; + T3S = W[3]; + T4D = T3S * T3Q; + T5l = W[34]; + T5n = T5l * T5m; + T5o = W[35]; + T5x = T5o * T5m; + T4I = FMA(KP559016994, T3H, T3G); + T4K = FNMS(KP951056516, T4J, T4I); + T5C = FMA(KP951056516, T4J, T4I); + T4H = W[10]; + T4L = T4H * T4K; + T4M = W[11]; + T4X = T4M * T4K; + T5B = W[26]; + T5D = T5B * T5C; + T5E = W[27]; + T5N = T5E * T5C; + } + { + E T4g, T4x, T45, T4R; + T4g = FNMS(KP559016994, T4f, T4e); + T4o = FMA(KP951056516, T4n, T4g); + T4S = FNMS(KP951056516, T4n, T4g); + T4x = FNMS(KP559016994, T4w, T4v); + T4B = FNMS(KP951056516, T4A, T4x); + T4V = FMA(KP951056516, T4A, T4x); + T45 = W[4]; + T4p = T45 * T4o; + T4F = T45 * T4B; + T4R = W[12]; + T4T = T4R * T4S; + T4Z = T4R * T4V; + } + { + E T58, T5d, T57, T5r; + T58 = FMA(KP559016994, T4f, T4e); + T5a = FMA(KP951056516, T59, T58); + T5s = FNMS(KP951056516, T59, T58); + T5d = FMA(KP559016994, T4w, T4v); + T5f = FNMS(KP951056516, T5e, T5d); + T5v = FMA(KP951056516, T5e, T5d); + T57 = W[20]; + T5b = T57 * T5a; + T5j = T57 * T5f; + T5r = W[36]; + T5t = T5r * T5s; + T5z = T5r * T5v; + } + { + E T44, T4E, T4C, T4G, T4q; + T44 = FNMS(T3S, T43, T3R); + T4E = FMA(T3x, T43, T4D); + T4q = W[5]; + T4C = FMA(T4q, T4B, T4p); + T4G = FNMS(T4q, T4o, T4F); + Rp[WS(rs, 1)] = T44 - T4C; + Ip[WS(rs, 1)] = T4E + T4G; + Rm[WS(rs, 1)] = T44 + T4C; + Im[WS(rs, 1)] = T4G - T4E; + } + { + E T5G, T5O, T5M, T5Q, T5K; + T5G = FNMS(T5E, T5F, T5D); + T5O = FMA(T5B, T5F, T5N); + T5K = W[29]; + T5M = FMA(T5K, T5L, T5J); + T5Q = FNMS(T5K, T5I, T5P); + Rp[WS(rs, 7)] = T5G - T5M; + Ip[WS(rs, 7)] = T5O + T5Q; + Rm[WS(rs, 7)] = T5G + T5M; + Im[WS(rs, 7)] = T5Q - T5O; + } + { + E T4Q, T4Y, T4W, T50, T4U; + T4Q = FNMS(T4M, T4P, T4L); + T4Y = FMA(T4H, T4P, T4X); + T4U = W[13]; + T4W = FMA(T4U, T4V, T4T); + T50 = FNMS(T4U, T4S, T4Z); + Rp[WS(rs, 3)] = T4Q - T4W; + Ip[WS(rs, 3)] = T4Y + T50; + Rm[WS(rs, 3)] = T4Q + T4W; + Im[WS(rs, 3)] = T50 - T4Y; + } + { + E T56, T5i, T5g, T5k, T5c; + T56 = FNMS(T54, T55, T53); + T5i = FMA(T51, T55, T5h); + T5c = W[21]; + T5g = FMA(T5c, T5f, T5b); + T5k = FNMS(T5c, T5a, T5j); + Rp[WS(rs, 5)] = T56 - T5g; + Ip[WS(rs, 5)] = T5i + T5k; + Rm[WS(rs, 5)] = T56 + T5g; + Im[WS(rs, 5)] = T5k - T5i; + } + { + E T5q, T5y, T5w, T5A, T5u; + T5q = FNMS(T5o, T5p, T5n); + T5y = FMA(T5l, T5p, T5x); + T5u = W[37]; + T5w = FMA(T5u, T5v, T5t); + T5A = FNMS(T5u, T5s, T5z); + Rp[WS(rs, 9)] = T5q - T5w; + Ip[WS(rs, 9)] = T5y + T5A; + Rm[WS(rs, 9)] = T5q + T5w; + Im[WS(rs, 9)] = T5A - T5y; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cbdft2_20", twinstr, &GENUS, {176, 38, 110, 0} }; + +void X(codelet_hc2cbdft2_20) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_20, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hc2cbdft2_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 286 FP additions, 124 FP multiplications, + * (or, 224 additions, 62 multiplications, 62 fused multiply/add), + * 89 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T7, T3N, T4a, T16, T1G, T3g, T3D, T26, T1k, T3A, T3B, T1v, T2e, T48, T47; + E T2d, T1L, T43, T40, T1K, T2l, T3t, T2m, T3w, T3n, T3p, TC, T2b, T4d, T4f; + E T23, T2j, T1B, T1H, T3U, T3W, T3G, T3I, T11, T17; + { + E T3, T1C, T15, T24, T6, T12, T1F, T25; + { + E T1, T2, T13, T14; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T1C = T1 - T2; + T13 = Ip[0]; + T14 = Im[WS(rs, 9)]; + T15 = T13 + T14; + T24 = T13 - T14; + } + { + E T4, T5, T1D, T1E; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + T12 = T4 - T5; + T1D = Ip[WS(rs, 5)]; + T1E = Im[WS(rs, 4)]; + T1F = T1D + T1E; + T25 = T1D - T1E; + } + T7 = T3 + T6; + T3N = T15 - T12; + T4a = T1C + T1F; + T16 = T12 + T15; + T1G = T1C - T1F; + T3g = T3 - T6; + T3D = T24 - T25; + T26 = T24 + T25; + } + { + E Te, T3O, T3Y, TJ, T1e, T3h, T3r, T1R, TA, T3S, T42, TZ, T1u, T3l, T3v; + E T21, Tl, T3P, T3Z, TO, T1j, T3i, T3s, T1U, Tt, T3R, T41, TU, T1p, T3k; + E T3u, T1Y; + { + E Ta, T1a, TI, T1P, Td, TF, T1d, T1Q; + { + E T8, T9, TG, TH; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T1a = T8 - T9; + TG = Ip[WS(rs, 4)]; + TH = Im[WS(rs, 5)]; + TI = TG + TH; + T1P = TG - TH; + } + { + E Tb, Tc, T1b, T1c; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + TF = Tb - Tc; + T1b = Ip[WS(rs, 9)]; + T1c = Im[0]; + T1d = T1b + T1c; + T1Q = T1b - T1c; + } + Te = Ta + Td; + T3O = TI - TF; + T3Y = T1a + T1d; + TJ = TF + TI; + T1e = T1a - T1d; + T3h = Ta - Td; + T3r = T1P - T1Q; + T1R = T1P + T1Q; + } + { + E Tw, T1q, TY, T1Z, Tz, TV, T1t, T20; + { + E Tu, Tv, TW, TX; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T1q = Tu - Tv; + TW = Im[WS(rs, 7)]; + TX = Ip[WS(rs, 2)]; + TY = TW + TX; + T1Z = TX - TW; + } + { + E Tx, Ty, T1r, T1s; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + TV = Tx - Ty; + T1r = Im[WS(rs, 2)]; + T1s = Ip[WS(rs, 7)]; + T1t = T1r + T1s; + T20 = T1s - T1r; + } + TA = Tw + Tz; + T3S = TV + TY; + T42 = T1q - T1t; + TZ = TV - TY; + T1u = T1q + T1t; + T3l = Tw - Tz; + T3v = T1Z - T20; + T21 = T1Z + T20; + } + { + E Th, T1f, TN, T1S, Tk, TK, T1i, T1T; + { + E Tf, Tg, TL, TM; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T1f = Tf - Tg; + TL = Im[WS(rs, 3)]; + TM = Ip[WS(rs, 6)]; + TN = TL + TM; + T1S = TM - TL; + } + { + E Ti, Tj, T1g, T1h; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + TK = Ti - Tj; + T1g = Ip[WS(rs, 1)]; + T1h = Im[WS(rs, 8)]; + T1i = T1g + T1h; + T1T = T1g - T1h; + } + Tl = Th + Tk; + T3P = TK + TN; + T3Z = T1f + T1i; + TO = TK - TN; + T1j = T1f - T1i; + T3i = Th - Tk; + T3s = T1S - T1T; + T1U = T1S + T1T; + } + { + E Tp, T1l, TT, T1W, Ts, TQ, T1o, T1X; + { + E Tn, To, TR, TS; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T1l = Tn - To; + TR = Ip[WS(rs, 8)]; + TS = Im[WS(rs, 1)]; + TT = TR + TS; + T1W = TR - TS; + } + { + E Tq, Tr, T1m, T1n; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + TQ = Tq - Tr; + T1m = Im[WS(rs, 6)]; + T1n = Ip[WS(rs, 3)]; + T1o = T1m + T1n; + T1X = T1n - T1m; + } + Tt = Tp + Ts; + T3R = TT - TQ; + T41 = T1l - T1o; + TU = TQ + TT; + T1p = T1l + T1o; + T3k = Tp - Ts; + T3u = T1W - T1X; + T1Y = T1W + T1X; + } + T1k = T1e - T1j; + T3A = T3h - T3i; + T3B = T3k - T3l; + T1v = T1p - T1u; + T2e = T1Y - T21; + T48 = T3R + T3S; + T47 = T3O + T3P; + T2d = T1R - T1U; + T1L = TU - TZ; + T43 = T41 - T42; + T40 = T3Y - T3Z; + T1K = TJ - TO; + T2l = Te - Tl; + T3t = T3r - T3s; + T2m = Tt - TA; + T3w = T3u - T3v; + { + E T3j, T3m, Tm, TB; + T3j = T3h + T3i; + T3m = T3k + T3l; + T3n = T3j + T3m; + T3p = KP559016994 * (T3j - T3m); + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T2b = KP559016994 * (Tm - TB); + } + { + E T4b, T4c, T3Q, T3T; + T4b = T3Y + T3Z; + T4c = T41 + T42; + T4d = T4b + T4c; + T4f = KP559016994 * (T4b - T4c); + { + E T1V, T22, T1z, T1A; + T1V = T1R + T1U; + T22 = T1Y + T21; + T23 = T1V + T22; + T2j = KP559016994 * (T1V - T22); + T1z = T1e + T1j; + T1A = T1p + T1u; + T1B = KP559016994 * (T1z - T1A); + T1H = T1z + T1A; + } + T3Q = T3O - T3P; + T3T = T3R - T3S; + T3U = T3Q + T3T; + T3W = KP559016994 * (T3Q - T3T); + { + E T3E, T3F, TP, T10; + T3E = T3r + T3s; + T3F = T3u + T3v; + T3G = T3E + T3F; + T3I = KP559016994 * (T3E - T3F); + TP = TJ + TO; + T10 = TU + TZ; + T11 = KP559016994 * (TP - T10); + T17 = TP + T10; + } + } + } + { + E TD, T27, T3c, T3e, T2o, T36, T2A, T2U, T1N, T2Z, T2t, T2J, T1x, T2X, T2r; + E T2F, T2g, T34, T2y, T2Q; + TD = T7 + TC; + T27 = T23 + T26; + { + E T39, T3b, T38, T3a; + T39 = T16 + T17; + T3b = T1H + T1G; + T38 = W[8]; + T3a = W[9]; + T3c = FMA(T38, T39, T3a * T3b); + T3e = FNMS(T3a, T39, T38 * T3b); + } + { + E T2n, T2S, T2k, T2T, T2i; + T2n = FNMS(KP951056516, T2m, KP587785252 * T2l); + T2S = FMA(KP951056516, T2l, KP587785252 * T2m); + T2i = FNMS(KP250000000, T23, T26); + T2k = T2i - T2j; + T2T = T2j + T2i; + T2o = T2k - T2n; + T36 = T2T - T2S; + T2A = T2n + T2k; + T2U = T2S + T2T; + } + { + E T1M, T2H, T1J, T2I, T1I; + T1M = FMA(KP951056516, T1K, KP587785252 * T1L); + T2H = FNMS(KP951056516, T1L, KP587785252 * T1K); + T1I = FNMS(KP250000000, T1H, T1G); + T1J = T1B + T1I; + T2I = T1I - T1B; + T1N = T1J - T1M; + T2Z = T2I - T2H; + T2t = T1M + T1J; + T2J = T2H + T2I; + } + { + E T1w, T2E, T19, T2D, T18; + T1w = FMA(KP951056516, T1k, KP587785252 * T1v); + T2E = FNMS(KP951056516, T1v, KP587785252 * T1k); + T18 = FNMS(KP250000000, T17, T16); + T19 = T11 + T18; + T2D = T18 - T11; + T1x = T19 + T1w; + T2X = T2D + T2E; + T2r = T19 - T1w; + T2F = T2D - T2E; + } + { + E T2f, T2P, T2c, T2O, T2a; + T2f = FNMS(KP951056516, T2e, KP587785252 * T2d); + T2P = FMA(KP951056516, T2d, KP587785252 * T2e); + T2a = FNMS(KP250000000, TC, T7); + T2c = T2a - T2b; + T2O = T2b + T2a; + T2g = T2c + T2f; + T34 = T2O + T2P; + T2y = T2c - T2f; + T2Q = T2O - T2P; + } + { + E T1O, T28, TE, T1y; + TE = W[0]; + T1y = W[1]; + T1O = FMA(TE, T1x, T1y * T1N); + T28 = FNMS(T1y, T1x, TE * T1N); + Rp[0] = TD - T1O; + Ip[0] = T27 + T28; + Rm[0] = TD + T1O; + Im[0] = T28 - T27; + } + { + E T37, T3d, T33, T35; + T33 = W[6]; + T35 = W[7]; + T37 = FNMS(T35, T36, T33 * T34); + T3d = FMA(T35, T34, T33 * T36); + Rp[WS(rs, 2)] = T37 - T3c; + Ip[WS(rs, 2)] = T3d + T3e; + Rm[WS(rs, 2)] = T37 + T3c; + Im[WS(rs, 2)] = T3e - T3d; + } + { + E T2p, T2v, T2u, T2w; + { + E T29, T2h, T2q, T2s; + T29 = W[14]; + T2h = W[15]; + T2p = FNMS(T2h, T2o, T29 * T2g); + T2v = FMA(T2h, T2g, T29 * T2o); + T2q = W[16]; + T2s = W[17]; + T2u = FMA(T2q, T2r, T2s * T2t); + T2w = FNMS(T2s, T2r, T2q * T2t); + } + Rp[WS(rs, 4)] = T2p - T2u; + Ip[WS(rs, 4)] = T2v + T2w; + Rm[WS(rs, 4)] = T2p + T2u; + Im[WS(rs, 4)] = T2w - T2v; + } + { + E T2B, T2L, T2K, T2M; + { + E T2x, T2z, T2C, T2G; + T2x = W[22]; + T2z = W[23]; + T2B = FNMS(T2z, T2A, T2x * T2y); + T2L = FMA(T2z, T2y, T2x * T2A); + T2C = W[24]; + T2G = W[25]; + T2K = FMA(T2C, T2F, T2G * T2J); + T2M = FNMS(T2G, T2F, T2C * T2J); + } + Rp[WS(rs, 6)] = T2B - T2K; + Ip[WS(rs, 6)] = T2L + T2M; + Rm[WS(rs, 6)] = T2B + T2K; + Im[WS(rs, 6)] = T2M - T2L; + } + { + E T2V, T31, T30, T32; + { + E T2N, T2R, T2W, T2Y; + T2N = W[30]; + T2R = W[31]; + T2V = FNMS(T2R, T2U, T2N * T2Q); + T31 = FMA(T2R, T2Q, T2N * T2U); + T2W = W[32]; + T2Y = W[33]; + T30 = FMA(T2W, T2X, T2Y * T2Z); + T32 = FNMS(T2Y, T2X, T2W * T2Z); + } + Rp[WS(rs, 8)] = T2V - T30; + Ip[WS(rs, 8)] = T31 + T32; + Rm[WS(rs, 8)] = T2V + T30; + Im[WS(rs, 8)] = T32 - T31; + } + } + { + E T4F, T4P, T5c, T5e, T3y, T54, T4o, T4S, T4h, T4Z, T4x, T4N, T45, T4X, T4v; + E T4J, T3K, T56, T4s, T4U; + { + E T4C, T4E, T4B, T4D; + T4C = T3g + T3n; + T4E = T3G + T3D; + T4B = W[18]; + T4D = W[19]; + T4F = FNMS(T4D, T4E, T4B * T4C); + T4P = FMA(T4D, T4C, T4B * T4E); + } + { + E T59, T5b, T58, T5a; + T59 = T3N + T3U; + T5b = T4d + T4a; + T58 = W[28]; + T5a = W[29]; + T5c = FMA(T58, T59, T5a * T5b); + T5e = FNMS(T5a, T59, T58 * T5b); + } + { + E T3x, T4n, T3q, T4m, T3o; + T3x = FNMS(KP951056516, T3w, KP587785252 * T3t); + T4n = FMA(KP951056516, T3t, KP587785252 * T3w); + T3o = FNMS(KP250000000, T3n, T3g); + T3q = T3o - T3p; + T4m = T3p + T3o; + T3y = T3q - T3x; + T54 = T4m + T4n; + T4o = T4m - T4n; + T4S = T3q + T3x; + } + { + E T49, T4M, T4g, T4L, T4e; + T49 = FNMS(KP951056516, T48, KP587785252 * T47); + T4M = FMA(KP951056516, T47, KP587785252 * T48); + T4e = FNMS(KP250000000, T4d, T4a); + T4g = T4e - T4f; + T4L = T4f + T4e; + T4h = T49 + T4g; + T4Z = T4M + T4L; + T4x = T4g - T49; + T4N = T4L - T4M; + } + { + E T44, T4I, T3X, T4H, T3V; + T44 = FNMS(KP951056516, T43, KP587785252 * T40); + T4I = FMA(KP951056516, T40, KP587785252 * T43); + T3V = FNMS(KP250000000, T3U, T3N); + T3X = T3V - T3W; + T4H = T3W + T3V; + T45 = T3X - T44; + T4X = T4H - T4I; + T4v = T3X + T44; + T4J = T4H + T4I; + } + { + E T3C, T4q, T3J, T4r, T3H; + T3C = FNMS(KP951056516, T3B, KP587785252 * T3A); + T4q = FMA(KP951056516, T3A, KP587785252 * T3B); + T3H = FNMS(KP250000000, T3G, T3D); + T3J = T3H - T3I; + T4r = T3I + T3H; + T3K = T3C + T3J; + T56 = T4r - T4q; + T4s = T4q + T4r; + T4U = T3J - T3C; + } + { + E T4O, T4Q, T4G, T4K; + T4G = W[20]; + T4K = W[21]; + T4O = FMA(T4G, T4J, T4K * T4N); + T4Q = FNMS(T4K, T4J, T4G * T4N); + Rp[WS(rs, 5)] = T4F - T4O; + Ip[WS(rs, 5)] = T4P + T4Q; + Rm[WS(rs, 5)] = T4F + T4O; + Im[WS(rs, 5)] = T4Q - T4P; + } + { + E T57, T5d, T53, T55; + T53 = W[26]; + T55 = W[27]; + T57 = FNMS(T55, T56, T53 * T54); + T5d = FMA(T55, T54, T53 * T56); + Rp[WS(rs, 7)] = T57 - T5c; + Ip[WS(rs, 7)] = T5d + T5e; + Rm[WS(rs, 7)] = T57 + T5c; + Im[WS(rs, 7)] = T5e - T5d; + } + { + E T3L, T4j, T4i, T4k; + { + E T3f, T3z, T3M, T46; + T3f = W[2]; + T3z = W[3]; + T3L = FNMS(T3z, T3K, T3f * T3y); + T4j = FMA(T3z, T3y, T3f * T3K); + T3M = W[4]; + T46 = W[5]; + T4i = FMA(T3M, T45, T46 * T4h); + T4k = FNMS(T46, T45, T3M * T4h); + } + Rp[WS(rs, 1)] = T3L - T4i; + Ip[WS(rs, 1)] = T4j + T4k; + Rm[WS(rs, 1)] = T3L + T4i; + Im[WS(rs, 1)] = T4k - T4j; + } + { + E T4t, T4z, T4y, T4A; + { + E T4l, T4p, T4u, T4w; + T4l = W[10]; + T4p = W[11]; + T4t = FNMS(T4p, T4s, T4l * T4o); + T4z = FMA(T4p, T4o, T4l * T4s); + T4u = W[12]; + T4w = W[13]; + T4y = FMA(T4u, T4v, T4w * T4x); + T4A = FNMS(T4w, T4v, T4u * T4x); + } + Rp[WS(rs, 3)] = T4t - T4y; + Ip[WS(rs, 3)] = T4z + T4A; + Rm[WS(rs, 3)] = T4t + T4y; + Im[WS(rs, 3)] = T4A - T4z; + } + { + E T4V, T51, T50, T52; + { + E T4R, T4T, T4W, T4Y; + T4R = W[34]; + T4T = W[35]; + T4V = FNMS(T4T, T4U, T4R * T4S); + T51 = FMA(T4T, T4S, T4R * T4U); + T4W = W[36]; + T4Y = W[37]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T52 = FNMS(T4Y, T4X, T4W * T4Z); + } + Rp[WS(rs, 9)] = T4V - T50; + Ip[WS(rs, 9)] = T51 + T52; + Rm[WS(rs, 9)] = T4V + T50; + Im[WS(rs, 9)] = T52 - T51; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cbdft2_20", twinstr, &GENUS, {224, 62, 62, 0} }; + +void X(codelet_hc2cbdft2_20) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_20, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_32.c new file mode 100644 index 000000000..526cb784e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_32.c @@ -0,0 +1,1950 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:00 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hc2cbdft2_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 498 FP additions, 260 FP multiplications, + * (or, 300 additions, 62 multiplications, 198 fused multiply/add), + * 122 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E T3h, T4B, Tv, T3K, T6T, T8Y, T7i, T8L, T7f, T8X, T1G, T4Y, T1j, T4K, T2M; + E T4X, T6d, T8C, T66, T8o, T6M, T8K, T2P, T4L, T3o, T4C, T4q, T5q, T6C, T8p; + E T6z, T8B, TK, TZ, T10, T32, T39, T3L, T4t, T4E, T8t, T8F, T4w, T4F, T8w; + E T8E, T6l, T6E, T6s, T6F, T28, T51, T2R, T4P, T71, T90, T7k, T8P, T2z, T50; + E T2S, T4S, T78, T91, T7l, T8S; + { + E T16, T3l, T2H, T3m, T3, T6, T7, T2E, T13, Ta, Td, Te, T1c, T3j, T3i; + E T2J, T1h, T2K, Tt, T6Q, T6R, T1z, T1E, T6a, T6b, T3g, Tm, T6N, T6O, T1o; + E T1t, T67, T68, T3d, T4o, T4p; + { + E T14, T15, T2F, T2G; + T14 = Ip[0]; + T15 = Im[WS(rs, 15)]; + T16 = T14 + T15; + T3l = T14 - T15; + T2F = Ip[WS(rs, 8)]; + T2G = Im[WS(rs, 7)]; + T2H = T2F + T2G; + T3m = T2F - T2G; + { + E T1, T2, T4, T5; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T7 = T3 + T6; + T2E = T1 - T2; + T13 = T4 - T5; + } + } + { + E T19, T1a, T1b, T18, T1e, T1f, T1g, T1d; + { + E T8, T9, Tb, Tc; + T19 = Ip[WS(rs, 4)]; + T1a = Im[WS(rs, 11)]; + T1b = T19 + T1a; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + Ta = T8 + T9; + T18 = T8 - T9; + T1e = Im[WS(rs, 3)]; + T1f = Ip[WS(rs, 12)]; + T1g = T1e + T1f; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + Td = Tb + Tc; + T1d = Tb - Tc; + } + Te = Ta + Td; + T1c = T18 + T1b; + T3j = T1f - T1e; + T3i = T19 - T1a; + T2J = T18 - T1b; + T1h = T1d + T1g; + T2K = T1d - T1g; + } + { + E Tp, T1A, T1y, T3e, Ts, T1v, T1D, T3f; + { + E Tn, To, T1w, T1x; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T1A = Tn - To; + T1w = Im[WS(rs, 1)]; + T1x = Ip[WS(rs, 14)]; + T1y = T1w + T1x; + T3e = T1x - T1w; + } + { + E Tq, Tr, T1B, T1C; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T1v = Tq - Tr; + T1B = Ip[WS(rs, 6)]; + T1C = Im[WS(rs, 9)]; + T1D = T1B + T1C; + T3f = T1B - T1C; + } + Tt = Tp + Ts; + T6Q = T1A + T1D; + T6R = T1v + T1y; + T1z = T1v - T1y; + T1E = T1A - T1D; + T6a = Tp - Ts; + T6b = T3e - T3f; + T3g = T3e + T3f; + } + { + E Ti, T1p, T1n, T3b, Tl, T1k, T1s, T3c; + { + E Tg, Th, T1l, T1m; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T1p = Tg - Th; + T1l = Ip[WS(rs, 2)]; + T1m = Im[WS(rs, 13)]; + T1n = T1l + T1m; + T3b = T1l - T1m; + } + { + E Tj, Tk, T1q, T1r; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T1k = Tj - Tk; + T1q = Ip[WS(rs, 10)]; + T1r = Im[WS(rs, 5)]; + T1s = T1q + T1r; + T3c = T1q - T1r; + } + Tm = Ti + Tl; + T6N = T1p + T1s; + T6O = T1n - T1k; + T1o = T1k + T1n; + T1t = T1p - T1s; + T67 = Ti - Tl; + T68 = T3b - T3c; + T3d = T3b + T3c; + } + T3h = T3d + T3g; + T4B = Tm - Tt; + { + E Tf, Tu, T6P, T6S; + Tf = T7 + Te; + Tu = Tm + Tt; + Tv = Tf + Tu; + T3K = Tf - Tu; + T6P = FMA(KP414213562, T6O, T6N); + T6S = FMA(KP414213562, T6R, T6Q); + T6T = T6P - T6S; + T8Y = T6P + T6S; + } + { + E T7g, T7h, T7d, T7e; + T7g = FNMS(KP414213562, T6N, T6O); + T7h = FNMS(KP414213562, T6Q, T6R); + T7i = T7g + T7h; + T8L = T7h - T7g; + T7d = T2E + T2H; + T7e = T1c + T1h; + T7f = FNMS(KP707106781, T7e, T7d); + T8X = FMA(KP707106781, T7e, T7d); + } + { + E T1u, T1F, T17, T1i; + T1u = FMA(KP414213562, T1t, T1o); + T1F = FNMS(KP414213562, T1E, T1z); + T1G = T1u + T1F; + T4Y = T1F - T1u; + T17 = T13 + T16; + T1i = T1c - T1h; + T1j = FMA(KP707106781, T1i, T17); + T4K = FNMS(KP707106781, T1i, T17); + } + { + E T2I, T2L, T69, T6c; + T2I = T2E - T2H; + T2L = T2J + T2K; + T2M = FMA(KP707106781, T2L, T2I); + T4X = FNMS(KP707106781, T2L, T2I); + T69 = T67 - T68; + T6c = T6a + T6b; + T6d = T69 + T6c; + T8C = T69 - T6c; + } + { + E T64, T65, T6K, T6L; + T64 = T3 - T6; + T65 = T3j - T3i; + T66 = T64 + T65; + T8o = T64 - T65; + T6K = T16 - T13; + T6L = T2J - T2K; + T6M = FMA(KP707106781, T6L, T6K); + T8K = FNMS(KP707106781, T6L, T6K); + } + { + E T2N, T2O, T3k, T3n; + T2N = FNMS(KP414213562, T1o, T1t); + T2O = FMA(KP414213562, T1z, T1E); + T2P = T2N + T2O; + T4L = T2N - T2O; + T3k = T3i + T3j; + T3n = T3l + T3m; + T3o = T3k + T3n; + T4C = T3n - T3k; + } + T4o = T7 - Te; + T4p = T3g - T3d; + T4q = T4o + T4p; + T5q = T4o - T4p; + { + E T6A, T6B, T6x, T6y; + T6A = T67 + T68; + T6B = T6b - T6a; + T6C = T6A + T6B; + T8p = T6B - T6A; + T6x = Ta - Td; + T6y = T3l - T3m; + T6z = T6x + T6y; + T8B = T6y - T6x; + } + } + { + E TC, T6V, T6Y, T1M, T23, T6f, T6j, T31, TY, T6n, T6p, T2i, T2n, T2w, T35; + E T2v, TJ, T6g, T6i, T1R, T1W, T25, T2Y, T24, TR, T72, T75, T2d, T2u, T6m; + E T6q, T38; + { + E Ty, T1Z, T1L, T2Z, TB, T1I, T22, T30; + { + E Tw, Tx, T1J, T1K; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + T1Z = Tw - Tx; + T1J = Ip[WS(rs, 1)]; + T1K = Im[WS(rs, 14)]; + T1L = T1J + T1K; + T2Z = T1J - T1K; + } + { + E Tz, TA, T20, T21; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + T1I = Tz - TA; + T20 = Ip[WS(rs, 9)]; + T21 = Im[WS(rs, 6)]; + T22 = T20 + T21; + T30 = T20 - T21; + } + TC = Ty + TB; + T6V = T1L - T1I; + T6Y = T1Z + T22; + T1M = T1I + T1L; + T23 = T1Z - T22; + T6f = Ty - TB; + T6j = T2Z - T30; + T31 = T2Z + T30; + } + { + E TU, T2e, T2h, T33, TX, T2j, T2m, T34; + { + E TS, TT, T2f, T2g; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + TU = TS + TT; + T2e = TS - TT; + T2f = Ip[WS(rs, 3)]; + T2g = Im[WS(rs, 12)]; + T2h = T2f + T2g; + T33 = T2f - T2g; + } + { + E TV, TW, T2k, T2l; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + TX = TV + TW; + T2j = TV - TW; + T2k = Im[WS(rs, 4)]; + T2l = Ip[WS(rs, 11)]; + T2m = T2k + T2l; + T34 = T2l - T2k; + } + TY = TU + TX; + T6n = T34 - T33; + T6p = TU - TX; + T2i = T2e + T2h; + T2n = T2j + T2m; + T2w = T2j - T2m; + T35 = T33 + T34; + T2v = T2e - T2h; + } + { + E TF, T1N, T1Q, T2W, TI, T1S, T1V, T2X; + { + E TD, TE, T1O, T1P; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + TF = TD + TE; + T1N = TD - TE; + T1O = Ip[WS(rs, 5)]; + T1P = Im[WS(rs, 10)]; + T1Q = T1O + T1P; + T2W = T1O - T1P; + } + { + E TG, TH, T1T, T1U; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + TI = TG + TH; + T1S = TG - TH; + T1T = Im[WS(rs, 2)]; + T1U = Ip[WS(rs, 13)]; + T1V = T1T + T1U; + T2X = T1U - T1T; + } + TJ = TF + TI; + T6g = T2X - T2W; + T6i = TF - TI; + T1R = T1N + T1Q; + T1W = T1S + T1V; + T25 = T1S - T1V; + T2Y = T2W + T2X; + T24 = T1N - T1Q; + } + { + E TN, T2q, T2c, T36, TQ, T29, T2t, T37; + { + E TL, TM, T2a, T2b; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + T2q = TL - TM; + T2a = Im[0]; + T2b = Ip[WS(rs, 15)]; + T2c = T2a + T2b; + T36 = T2b - T2a; + } + { + E TO, TP, T2r, T2s; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + T29 = TO - TP; + T2r = Ip[WS(rs, 7)]; + T2s = Im[WS(rs, 8)]; + T2t = T2r + T2s; + T37 = T2r - T2s; + } + TR = TN + TQ; + T72 = T29 + T2c; + T75 = T2q + T2t; + T2d = T29 - T2c; + T2u = T2q - T2t; + T6m = TN - TQ; + T6q = T36 - T37; + T38 = T36 + T37; + } + { + E T4r, T4s, T8r, T8s; + TK = TC + TJ; + TZ = TR + TY; + T10 = TK + TZ; + T32 = T2Y + T31; + T39 = T35 + T38; + T3L = T39 - T32; + T4r = TC - TJ; + T4s = T31 - T2Y; + T4t = T4r - T4s; + T4E = T4r + T4s; + T8r = T6q - T6p; + T8s = T6m - T6n; + T8t = FMA(KP414213562, T8s, T8r); + T8F = FNMS(KP414213562, T8r, T8s); + { + E T4u, T4v, T8u, T8v; + T4u = TR - TY; + T4v = T38 - T35; + T4w = T4u + T4v; + T4F = T4v - T4u; + T8u = T6j - T6i; + T8v = T6f - T6g; + T8w = FNMS(KP414213562, T8v, T8u); + T8E = FMA(KP414213562, T8u, T8v); + } + } + { + E T6h, T6k, T6o, T6r; + T6h = T6f + T6g; + T6k = T6i + T6j; + T6l = FNMS(KP414213562, T6k, T6h); + T6E = FMA(KP414213562, T6h, T6k); + T6o = T6m + T6n; + T6r = T6p + T6q; + T6s = FMA(KP414213562, T6r, T6o); + T6F = FNMS(KP414213562, T6o, T6r); + { + E T1Y, T4O, T27, T4N, T1X, T26; + T1X = T1R - T1W; + T1Y = FMA(KP707106781, T1X, T1M); + T4O = FNMS(KP707106781, T1X, T1M); + T26 = T24 + T25; + T27 = FMA(KP707106781, T26, T23); + T4N = FNMS(KP707106781, T26, T23); + T28 = FMA(KP198912367, T27, T1Y); + T51 = FNMS(KP668178637, T4N, T4O); + T2R = FNMS(KP198912367, T1Y, T27); + T4P = FMA(KP668178637, T4O, T4N); + } + } + { + E T6X, T8O, T70, T8N, T6W, T6Z; + T6W = T25 - T24; + T6X = FNMS(KP707106781, T6W, T6V); + T8O = FMA(KP707106781, T6W, T6V); + T6Z = T1R + T1W; + T70 = FNMS(KP707106781, T6Z, T6Y); + T8N = FMA(KP707106781, T6Z, T6Y); + T71 = FMA(KP668178637, T70, T6X); + T90 = FNMS(KP198912367, T8N, T8O); + T7k = FNMS(KP668178637, T6X, T70); + T8P = FMA(KP198912367, T8O, T8N); + } + { + E T2p, T4R, T2y, T4Q, T2o, T2x; + T2o = T2i - T2n; + T2p = FMA(KP707106781, T2o, T2d); + T4R = FNMS(KP707106781, T2o, T2d); + T2x = T2v + T2w; + T2y = FMA(KP707106781, T2x, T2u); + T4Q = FNMS(KP707106781, T2x, T2u); + T2z = FNMS(KP198912367, T2y, T2p); + T50 = FMA(KP668178637, T4Q, T4R); + T2S = FMA(KP198912367, T2p, T2y); + T4S = FNMS(KP668178637, T4R, T4Q); + } + { + E T74, T8R, T77, T8Q, T73, T76; + T73 = T2v - T2w; + T74 = FNMS(KP707106781, T73, T72); + T8R = FMA(KP707106781, T73, T72); + T76 = T2i + T2n; + T77 = FNMS(KP707106781, T76, T75); + T8Q = FMA(KP707106781, T76, T75); + T78 = FMA(KP668178637, T77, T74); + T91 = FNMS(KP198912367, T8Q, T8R); + T7l = FNMS(KP668178637, T74, T77); + T8S = FMA(KP198912367, T8R, T8Q); + } + } + { + E T11, T3q, T3x, T3t, T3v, T3w, T3F, T2B, T3A, T2U, T3D, T2C, T3r, T3B, T3H; + E T2V, T3s, T2D; + { + E T3a, T3p, T3u, T12, T3z; + T11 = Tv + T10; + T3a = T32 + T39; + T3p = T3h + T3o; + T3q = T3a + T3p; + T3x = T3p - T3a; + T3u = Tv - T10; + T3t = W[30]; + T3v = T3t * T3u; + T3w = W[31]; + T3F = T3w * T3u; + { + E T1H, T2A, T2Q, T2T; + T1H = FMA(KP923879532, T1G, T1j); + T2A = T28 + T2z; + T2B = FMA(KP980785280, T2A, T1H); + T3A = FNMS(KP980785280, T2A, T1H); + T2Q = FMA(KP923879532, T2P, T2M); + T2T = T2R + T2S; + T2U = FMA(KP980785280, T2T, T2Q); + T3D = FNMS(KP980785280, T2T, T2Q); + } + T12 = W[0]; + T2C = T12 * T2B; + T3r = T12 * T2U; + T3z = W[32]; + T3B = T3z * T3A; + T3H = T3z * T3D; + } + T2D = W[1]; + T2V = FMA(T2D, T2U, T2C); + T3s = FNMS(T2D, T2B, T3r); + Rp[0] = T11 - T2V; + Ip[0] = T3q + T3s; + Rm[0] = T11 + T2V; + Im[0] = T3s - T3q; + { + E T3y, T3G, T3E, T3I, T3C; + T3y = FNMS(T3w, T3x, T3v); + T3G = FMA(T3t, T3x, T3F); + T3C = W[33]; + T3E = FMA(T3C, T3D, T3B); + T3I = FNMS(T3C, T3A, T3H); + Rp[WS(rs, 8)] = T3y - T3E; + Ip[WS(rs, 8)] = T3G + T3I; + Rm[WS(rs, 8)] = T3y + T3E; + Im[WS(rs, 8)] = T3I - T3G; + } + } + { + E T3R, T4b, T47, T49, T4a, T4j, T3J, T3N, T3O, T43, T3W, T4e, T41, T4h, T3X; + E T45, T4f, T4l; + { + E T3P, T3Q, T48, T3M, T3T, T4d; + T3P = TK - TZ; + T3Q = T3o - T3h; + T3R = T3P + T3Q; + T4b = T3Q - T3P; + T48 = T3K - T3L; + T47 = W[46]; + T49 = T47 * T48; + T4a = W[47]; + T4j = T4a * T48; + T3M = T3K + T3L; + T3J = W[14]; + T3N = T3J * T3M; + T3O = W[15]; + T43 = T3O * T3M; + { + E T3U, T3V, T3Z, T40; + T3U = FNMS(KP923879532, T1G, T1j); + T3V = T2R - T2S; + T3W = FMA(KP980785280, T3V, T3U); + T4e = FNMS(KP980785280, T3V, T3U); + T3Z = FNMS(KP923879532, T2P, T2M); + T40 = T2z - T28; + T41 = FMA(KP980785280, T40, T3Z); + T4h = FNMS(KP980785280, T40, T3Z); + } + T3T = W[16]; + T3X = T3T * T3W; + T45 = T3T * T41; + T4d = W[48]; + T4f = T4d * T4e; + T4l = T4d * T4h; + } + { + E T3S, T44, T42, T46, T3Y; + T3S = FNMS(T3O, T3R, T3N); + T44 = FMA(T3J, T3R, T43); + T3Y = W[17]; + T42 = FMA(T3Y, T41, T3X); + T46 = FNMS(T3Y, T3W, T45); + Rp[WS(rs, 4)] = T3S - T42; + Ip[WS(rs, 4)] = T44 + T46; + Rm[WS(rs, 4)] = T3S + T42; + Im[WS(rs, 4)] = T46 - T44; + } + { + E T4c, T4k, T4i, T4m, T4g; + T4c = FNMS(T4a, T4b, T49); + T4k = FMA(T47, T4b, T4j); + T4g = W[49]; + T4i = FMA(T4g, T4h, T4f); + T4m = FNMS(T4g, T4e, T4l); + Rp[WS(rs, 12)] = T4c - T4i; + Ip[WS(rs, 12)] = T4k + T4m; + Rm[WS(rs, 12)] = T4c + T4i; + Im[WS(rs, 12)] = T4m - T4k; + } + } + { + E T4H, T5d, T4n, T4z, T4A, T55, T59, T5b, T5c, T5l, T4U, T5g, T53, T5j, T4V; + E T57, T5h, T5n, T4D, T4G; + T4D = T4B + T4C; + T4G = T4E + T4F; + T4H = FMA(KP707106781, T4G, T4D); + T5d = FNMS(KP707106781, T4G, T4D); + { + E T4y, T5a, T4x, T4J, T5f; + T4x = T4t + T4w; + T4y = FMA(KP707106781, T4x, T4q); + T5a = FNMS(KP707106781, T4x, T4q); + T4n = W[6]; + T4z = T4n * T4y; + T4A = W[7]; + T55 = T4A * T4y; + T59 = W[38]; + T5b = T59 * T5a; + T5c = W[39]; + T5l = T5c * T5a; + { + E T4M, T4T, T4Z, T52; + T4M = FMA(KP923879532, T4L, T4K); + T4T = T4P - T4S; + T4U = FMA(KP831469612, T4T, T4M); + T5g = FNMS(KP831469612, T4T, T4M); + T4Z = FMA(KP923879532, T4Y, T4X); + T52 = T50 - T51; + T53 = FMA(KP831469612, T52, T4Z); + T5j = FNMS(KP831469612, T52, T4Z); + } + T4J = W[8]; + T4V = T4J * T4U; + T57 = T4J * T53; + T5f = W[40]; + T5h = T5f * T5g; + T5n = T5f * T5j; + } + { + E T4I, T56, T54, T58, T4W; + T4I = FNMS(T4A, T4H, T4z); + T56 = FMA(T4n, T4H, T55); + T4W = W[9]; + T54 = FMA(T4W, T53, T4V); + T58 = FNMS(T4W, T4U, T57); + Rp[WS(rs, 2)] = T4I - T54; + Ip[WS(rs, 2)] = T56 + T58; + Rm[WS(rs, 2)] = T4I + T54; + Im[WS(rs, 2)] = T58 - T56; + } + { + E T5e, T5m, T5k, T5o, T5i; + T5e = FNMS(T5c, T5d, T5b); + T5m = FMA(T59, T5d, T5l); + T5i = W[41]; + T5k = FMA(T5i, T5j, T5h); + T5o = FNMS(T5i, T5g, T5n); + Rp[WS(rs, 10)] = T5e - T5k; + Ip[WS(rs, 10)] = T5m + T5o; + Rm[WS(rs, 10)] = T5e + T5k; + Im[WS(rs, 10)] = T5o - T5m; + } + } + { + E T5x, T5R, T5p, T5t, T5u, T5J, T5N, T5P, T5Q, T5Z, T5C, T5U, T5H, T5X, T5D; + E T5L, T5V, T61, T5v, T5w; + T5v = T4C - T4B; + T5w = T4t - T4w; + T5x = FMA(KP707106781, T5w, T5v); + T5R = FNMS(KP707106781, T5w, T5v); + { + E T5s, T5O, T5r, T5z, T5T; + T5r = T4F - T4E; + T5s = FMA(KP707106781, T5r, T5q); + T5O = FNMS(KP707106781, T5r, T5q); + T5p = W[22]; + T5t = T5p * T5s; + T5u = W[23]; + T5J = T5u * T5s; + T5N = W[54]; + T5P = T5N * T5O; + T5Q = W[55]; + T5Z = T5Q * T5O; + { + E T5A, T5B, T5F, T5G; + T5A = FNMS(KP923879532, T4L, T4K); + T5B = T51 + T50; + T5C = FNMS(KP831469612, T5B, T5A); + T5U = FMA(KP831469612, T5B, T5A); + T5F = FNMS(KP923879532, T4Y, T4X); + T5G = T4P + T4S; + T5H = FNMS(KP831469612, T5G, T5F); + T5X = FMA(KP831469612, T5G, T5F); + } + T5z = W[24]; + T5D = T5z * T5C; + T5L = T5z * T5H; + T5T = W[56]; + T5V = T5T * T5U; + T61 = T5T * T5X; + } + { + E T5y, T5K, T5I, T5M, T5E; + T5y = FNMS(T5u, T5x, T5t); + T5K = FMA(T5p, T5x, T5J); + T5E = W[25]; + T5I = FMA(T5E, T5H, T5D); + T5M = FNMS(T5E, T5C, T5L); + Rp[WS(rs, 6)] = T5y - T5I; + Ip[WS(rs, 6)] = T5K + T5M; + Rm[WS(rs, 6)] = T5y + T5I; + Im[WS(rs, 6)] = T5M - T5K; + } + { + E T5S, T60, T5Y, T62, T5W; + T5S = FNMS(T5Q, T5R, T5P); + T60 = FMA(T5N, T5R, T5Z); + T5W = W[57]; + T5Y = FMA(T5W, T5X, T5V); + T62 = FNMS(T5W, T5U, T61); + Rp[WS(rs, 14)] = T5S - T5Y; + Ip[WS(rs, 14)] = T60 + T62; + Rm[WS(rs, 14)] = T5S + T5Y; + Im[WS(rs, 14)] = T62 - T60; + } + } + { + E T6H, T7x, T63, T6v, T6w, T7p, T7t, T7v, T7w, T7F, T7a, T7A, T7n, T7D, T7b; + E T7r, T7B, T7H; + { + E T6D, T6G, T6J, T7z; + T6D = FMA(KP707106781, T6C, T6z); + T6G = T6E + T6F; + T6H = FMA(KP923879532, T6G, T6D); + T7x = FNMS(KP923879532, T6G, T6D); + { + E T6u, T7u, T6e, T6t; + T6e = FMA(KP707106781, T6d, T66); + T6t = T6l + T6s; + T6u = FMA(KP923879532, T6t, T6e); + T7u = FNMS(KP923879532, T6t, T6e); + T63 = W[2]; + T6v = T63 * T6u; + T6w = W[3]; + T7p = T6w * T6u; + T7t = W[34]; + T7v = T7t * T7u; + T7w = W[35]; + T7F = T7w * T7u; + } + { + E T6U, T79, T7j, T7m; + T6U = FMA(KP923879532, T6T, T6M); + T79 = T71 - T78; + T7a = FMA(KP831469612, T79, T6U); + T7A = FNMS(KP831469612, T79, T6U); + T7j = FNMS(KP923879532, T7i, T7f); + T7m = T7k + T7l; + T7n = FMA(KP831469612, T7m, T7j); + T7D = FNMS(KP831469612, T7m, T7j); + } + T6J = W[4]; + T7b = T6J * T7a; + T7r = T6J * T7n; + T7z = W[36]; + T7B = T7z * T7A; + T7H = T7z * T7D; + } + { + E T6I, T7q, T7o, T7s, T7c; + T6I = FNMS(T6w, T6H, T6v); + T7q = FMA(T63, T6H, T7p); + T7c = W[5]; + T7o = FMA(T7c, T7n, T7b); + T7s = FNMS(T7c, T7a, T7r); + Rp[WS(rs, 1)] = T6I - T7o; + Ip[WS(rs, 1)] = T7q + T7s; + Rm[WS(rs, 1)] = T6I + T7o; + Im[WS(rs, 1)] = T7s - T7q; + } + { + E T7y, T7G, T7E, T7I, T7C; + T7y = FNMS(T7w, T7x, T7v); + T7G = FMA(T7t, T7x, T7F); + T7C = W[37]; + T7E = FMA(T7C, T7D, T7B); + T7I = FNMS(T7C, T7A, T7H); + Rp[WS(rs, 9)] = T7y - T7E; + Ip[WS(rs, 9)] = T7G + T7I; + Rm[WS(rs, 9)] = T7y + T7E; + Im[WS(rs, 9)] = T7I - T7G; + } + } + { + E T8H, T9d, T8n, T8z, T8A, T95, T99, T9b, T9c, T9l, T8U, T9g, T93, T9j, T8V; + E T97, T9h, T9n; + { + E T8D, T8G, T8J, T9f; + T8D = FMA(KP707106781, T8C, T8B); + T8G = T8E - T8F; + T8H = FMA(KP923879532, T8G, T8D); + T9d = FNMS(KP923879532, T8G, T8D); + { + E T8y, T9a, T8q, T8x; + T8q = FMA(KP707106781, T8p, T8o); + T8x = T8t - T8w; + T8y = FMA(KP923879532, T8x, T8q); + T9a = FNMS(KP923879532, T8x, T8q); + T8n = W[10]; + T8z = T8n * T8y; + T8A = W[11]; + T95 = T8A * T8y; + T99 = W[42]; + T9b = T99 * T9a; + T9c = W[43]; + T9l = T9c * T9a; + } + { + E T8M, T8T, T8Z, T92; + T8M = FMA(KP923879532, T8L, T8K); + T8T = T8P - T8S; + T8U = FMA(KP980785280, T8T, T8M); + T9g = FNMS(KP980785280, T8T, T8M); + T8Z = FNMS(KP923879532, T8Y, T8X); + T92 = T90 + T91; + T93 = FNMS(KP980785280, T92, T8Z); + T9j = FMA(KP980785280, T92, T8Z); + } + T8J = W[12]; + T8V = T8J * T8U; + T97 = T8J * T93; + T9f = W[44]; + T9h = T9f * T9g; + T9n = T9f * T9j; + } + { + E T8I, T96, T94, T98, T8W; + T8I = FNMS(T8A, T8H, T8z); + T96 = FMA(T8n, T8H, T95); + T8W = W[13]; + T94 = FMA(T8W, T93, T8V); + T98 = FNMS(T8W, T8U, T97); + Rp[WS(rs, 3)] = T8I - T94; + Ip[WS(rs, 3)] = T96 + T98; + Rm[WS(rs, 3)] = T8I + T94; + Im[WS(rs, 3)] = T98 - T96; + } + { + E T9e, T9m, T9k, T9o, T9i; + T9e = FNMS(T9c, T9d, T9b); + T9m = FMA(T99, T9d, T9l); + T9i = W[45]; + T9k = FMA(T9i, T9j, T9h); + T9o = FNMS(T9i, T9g, T9n); + Rp[WS(rs, 11)] = T9e - T9k; + Ip[WS(rs, 11)] = T9m + T9o; + Rm[WS(rs, 11)] = T9e + T9k; + Im[WS(rs, 11)] = T9o - T9m; + } + } + { + E T9x, T9R, T9p, T9t, T9u, T9J, T9N, T9P, T9Q, T9Z, T9C, T9U, T9H, T9X, T9D; + E T9L, T9V, Ta1; + { + E T9v, T9w, T9z, T9T; + T9v = FNMS(KP707106781, T8C, T8B); + T9w = T8w + T8t; + T9x = FNMS(KP923879532, T9w, T9v); + T9R = FMA(KP923879532, T9w, T9v); + { + E T9s, T9O, T9q, T9r; + T9q = FNMS(KP707106781, T8p, T8o); + T9r = T8E + T8F; + T9s = FNMS(KP923879532, T9r, T9q); + T9O = FMA(KP923879532, T9r, T9q); + T9p = W[26]; + T9t = T9p * T9s; + T9u = W[27]; + T9J = T9u * T9s; + T9N = W[58]; + T9P = T9N * T9O; + T9Q = W[59]; + T9Z = T9Q * T9O; + } + { + E T9A, T9B, T9F, T9G; + T9A = FNMS(KP923879532, T8L, T8K); + T9B = T91 - T90; + T9C = FMA(KP980785280, T9B, T9A); + T9U = FNMS(KP980785280, T9B, T9A); + T9F = FMA(KP923879532, T8Y, T8X); + T9G = T8P + T8S; + T9H = FNMS(KP980785280, T9G, T9F); + T9X = FMA(KP980785280, T9G, T9F); + } + T9z = W[28]; + T9D = T9z * T9C; + T9L = T9z * T9H; + T9T = W[60]; + T9V = T9T * T9U; + Ta1 = T9T * T9X; + } + { + E T9y, T9K, T9I, T9M, T9E; + T9y = FNMS(T9u, T9x, T9t); + T9K = FMA(T9p, T9x, T9J); + T9E = W[29]; + T9I = FMA(T9E, T9H, T9D); + T9M = FNMS(T9E, T9C, T9L); + Rp[WS(rs, 7)] = T9y - T9I; + Ip[WS(rs, 7)] = T9K + T9M; + Rm[WS(rs, 7)] = T9y + T9I; + Im[WS(rs, 7)] = T9M - T9K; + } + { + E T9S, Ta0, T9Y, Ta2, T9W; + T9S = FNMS(T9Q, T9R, T9P); + Ta0 = FMA(T9N, T9R, T9Z); + T9W = W[61]; + T9Y = FMA(T9W, T9X, T9V); + Ta2 = FNMS(T9W, T9U, Ta1); + Rp[WS(rs, 15)] = T9S - T9Y; + Ip[WS(rs, 15)] = Ta0 + Ta2; + Rm[WS(rs, 15)] = T9S + T9Y; + Im[WS(rs, 15)] = Ta2 - Ta0; + } + } + { + E T7R, T8b, T7J, T7N, T7O, T83, T87, T89, T8a, T8j, T7W, T8e, T81, T8h, T7X; + E T85, T8f, T8l; + { + E T7P, T7Q, T7T, T8d; + T7P = FNMS(KP707106781, T6C, T6z); + T7Q = T6l - T6s; + T7R = FMA(KP923879532, T7Q, T7P); + T8b = FNMS(KP923879532, T7Q, T7P); + { + E T7M, T88, T7K, T7L; + T7K = FNMS(KP707106781, T6d, T66); + T7L = T6F - T6E; + T7M = FMA(KP923879532, T7L, T7K); + T88 = FNMS(KP923879532, T7L, T7K); + T7J = W[18]; + T7N = T7J * T7M; + T7O = W[19]; + T83 = T7O * T7M; + T87 = W[50]; + T89 = T87 * T88; + T8a = W[51]; + T8j = T8a * T88; + } + { + E T7U, T7V, T7Z, T80; + T7U = FNMS(KP923879532, T6T, T6M); + T7V = T7k - T7l; + T7W = FMA(KP831469612, T7V, T7U); + T8e = FNMS(KP831469612, T7V, T7U); + T7Z = FMA(KP923879532, T7i, T7f); + T80 = T71 + T78; + T81 = FNMS(KP831469612, T80, T7Z); + T8h = FMA(KP831469612, T80, T7Z); + } + T7T = W[20]; + T7X = T7T * T7W; + T85 = T7T * T81; + T8d = W[52]; + T8f = T8d * T8e; + T8l = T8d * T8h; + } + { + E T7S, T84, T82, T86, T7Y; + T7S = FNMS(T7O, T7R, T7N); + T84 = FMA(T7J, T7R, T83); + T7Y = W[21]; + T82 = FMA(T7Y, T81, T7X); + T86 = FNMS(T7Y, T7W, T85); + Rp[WS(rs, 5)] = T7S - T82; + Ip[WS(rs, 5)] = T84 + T86; + Rm[WS(rs, 5)] = T7S + T82; + Im[WS(rs, 5)] = T86 - T84; + } + { + E T8c, T8k, T8i, T8m, T8g; + T8c = FNMS(T8a, T8b, T89); + T8k = FMA(T87, T8b, T8j); + T8g = W[53]; + T8i = FMA(T8g, T8h, T8f); + T8m = FNMS(T8g, T8e, T8l); + Rp[WS(rs, 13)] = T8c - T8i; + Ip[WS(rs, 13)] = T8k + T8m; + Rm[WS(rs, 13)] = T8c + T8i; + Im[WS(rs, 13)] = T8m - T8k; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cbdft2_32", twinstr, &GENUS, {300, 62, 198, 0} }; + +void X(codelet_hc2cbdft2_32) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_32, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hc2cbdft2_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 498 FP additions, 208 FP multiplications, + * (or, 404 additions, 114 multiplications, 94 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tf, T4a, T6h, T7Z, T6P, T8e, T1j, T4v, T2R, T4L, T5C, T7E, T6a, T7U, T3n; + E T4q, TZ, T38, T2p, T4B, T7M, T7R, T2y, T4C, T5Y, T63, T6C, T86, T4i, T4n; + E T6z, T85, TK, T31, T1Y, T4y, T7J, T7Q, T27, T4z, T5R, T62, T6v, T83, T4f; + E T4m, T6s, T82, Tu, T4p, T6o, T8f, T6M, T80, T1G, T4K, T2I, T4w, T5J, T7T; + E T67, T7F, T3g, T4b; + { + E T3, T2M, T16, T3k, T6, T13, T2P, T3l, Td, T3i, T1h, T2K, Ta, T3h, T1c; + E T2J; + { + E T1, T2, T2N, T2O; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T2M = T1 - T2; + { + E T14, T15, T4, T5; + T14 = Ip[0]; + T15 = Im[WS(rs, 15)]; + T16 = T14 + T15; + T3k = T14 - T15; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T13 = T4 - T5; + } + T2N = Ip[WS(rs, 8)]; + T2O = Im[WS(rs, 7)]; + T2P = T2N + T2O; + T3l = T2N - T2O; + { + E Tb, Tc, T1d, T1e, T1f, T1g; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + T1d = Tb - Tc; + T1e = Im[WS(rs, 3)]; + T1f = Ip[WS(rs, 12)]; + T1g = T1e + T1f; + Td = Tb + Tc; + T3i = T1f - T1e; + T1h = T1d + T1g; + T2K = T1d - T1g; + } + { + E T8, T9, T18, T19, T1a, T1b; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + T18 = T8 - T9; + T19 = Ip[WS(rs, 4)]; + T1a = Im[WS(rs, 11)]; + T1b = T19 + T1a; + Ta = T8 + T9; + T3h = T19 - T1a; + T1c = T18 + T1b; + T2J = T18 - T1b; + } + } + { + E T7, Te, T6f, T6g; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T4a = T7 - Te; + T6f = T16 - T13; + T6g = KP707106781 * (T2J - T2K); + T6h = T6f + T6g; + T7Z = T6f - T6g; + } + { + E T6N, T6O, T17, T1i; + T6N = T2M + T2P; + T6O = KP707106781 * (T1c + T1h); + T6P = T6N - T6O; + T8e = T6O + T6N; + T17 = T13 + T16; + T1i = KP707106781 * (T1c - T1h); + T1j = T17 + T1i; + T4v = T17 - T1i; + } + { + E T2L, T2Q, T5A, T5B; + T2L = KP707106781 * (T2J + T2K); + T2Q = T2M - T2P; + T2R = T2L + T2Q; + T4L = T2Q - T2L; + T5A = T3 - T6; + T5B = T3i - T3h; + T5C = T5A + T5B; + T7E = T5A - T5B; + } + { + E T68, T69, T3j, T3m; + T68 = Ta - Td; + T69 = T3k - T3l; + T6a = T68 + T69; + T7U = T69 - T68; + T3j = T3h + T3i; + T3m = T3k + T3l; + T3n = T3j + T3m; + T4q = T3m - T3j; + } + } + { + E TR, T5S, T29, T2t, T2c, T5W, T2w, T37, TY, T5T, T5V, T2i, T2n, T2r, T34; + E T2q, T6A, T6B; + { + E TL, TM, TN, TO, TP, TQ; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + TR = TN + TQ; + T5S = TN - TQ; + T29 = TO - TP; + T2t = TL - TM; + } + { + E T2a, T2b, T35, T2u, T2v, T36; + T2a = Im[0]; + T2b = Ip[WS(rs, 15)]; + T35 = T2b - T2a; + T2u = Ip[WS(rs, 7)]; + T2v = Im[WS(rs, 8)]; + T36 = T2u - T2v; + T2c = T2a + T2b; + T5W = T35 - T36; + T2w = T2u + T2v; + T37 = T35 + T36; + } + { + E TU, T2e, T2h, T32, TX, T2j, T2m, T33; + { + E TS, TT, T2f, T2g; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + TU = TS + TT; + T2e = TS - TT; + T2f = Ip[WS(rs, 3)]; + T2g = Im[WS(rs, 12)]; + T2h = T2f + T2g; + T32 = T2f - T2g; + } + { + E TV, TW, T2k, T2l; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + TX = TV + TW; + T2j = TV - TW; + T2k = Im[WS(rs, 4)]; + T2l = Ip[WS(rs, 11)]; + T2m = T2k + T2l; + T33 = T2l - T2k; + } + TY = TU + TX; + T5T = T33 - T32; + T5V = TU - TX; + T2i = T2e + T2h; + T2n = T2j + T2m; + T2r = T2j - T2m; + T34 = T32 + T33; + T2q = T2e - T2h; + } + TZ = TR + TY; + T38 = T34 + T37; + { + E T2d, T2o, T7K, T7L; + T2d = T29 - T2c; + T2o = KP707106781 * (T2i - T2n); + T2p = T2d + T2o; + T4B = T2d - T2o; + T7K = T5S - T5T; + T7L = T5W - T5V; + T7M = FMA(KP382683432, T7K, KP923879532 * T7L); + T7R = FNMS(KP923879532, T7K, KP382683432 * T7L); + } + { + E T2s, T2x, T5U, T5X; + T2s = KP707106781 * (T2q + T2r); + T2x = T2t - T2w; + T2y = T2s + T2x; + T4C = T2x - T2s; + T5U = T5S + T5T; + T5X = T5V + T5W; + T5Y = FMA(KP923879532, T5U, KP382683432 * T5X); + T63 = FNMS(KP382683432, T5U, KP923879532 * T5X); + } + T6A = T2t + T2w; + T6B = KP707106781 * (T2i + T2n); + T6C = T6A - T6B; + T86 = T6B + T6A; + { + E T4g, T4h, T6x, T6y; + T4g = TR - TY; + T4h = T37 - T34; + T4i = T4g + T4h; + T4n = T4h - T4g; + T6x = KP707106781 * (T2q - T2r); + T6y = T29 + T2c; + T6z = T6x - T6y; + T85 = T6y + T6x; + } + } + { + E TC, T5L, T1I, T22, T1L, T5P, T25, T30, TJ, T5M, T5O, T1R, T1W, T20, T2X; + E T1Z, T6t, T6u; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + TC = Ty + TB; + T5L = Ty - TB; + T1I = Tz - TA; + T22 = Tw - Tx; + } + { + E T1J, T1K, T2Y, T23, T24, T2Z; + T1J = Ip[WS(rs, 1)]; + T1K = Im[WS(rs, 14)]; + T2Y = T1J - T1K; + T23 = Ip[WS(rs, 9)]; + T24 = Im[WS(rs, 6)]; + T2Z = T23 - T24; + T1L = T1J + T1K; + T5P = T2Y - T2Z; + T25 = T23 + T24; + T30 = T2Y + T2Z; + } + { + E TF, T1N, T1Q, T2V, TI, T1S, T1V, T2W; + { + E TD, TE, T1O, T1P; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + TF = TD + TE; + T1N = TD - TE; + T1O = Ip[WS(rs, 5)]; + T1P = Im[WS(rs, 10)]; + T1Q = T1O + T1P; + T2V = T1O - T1P; + } + { + E TG, TH, T1T, T1U; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + TI = TG + TH; + T1S = TG - TH; + T1T = Im[WS(rs, 2)]; + T1U = Ip[WS(rs, 13)]; + T1V = T1T + T1U; + T2W = T1U - T1T; + } + TJ = TF + TI; + T5M = T2W - T2V; + T5O = TF - TI; + T1R = T1N + T1Q; + T1W = T1S + T1V; + T20 = T1S - T1V; + T2X = T2V + T2W; + T1Z = T1N - T1Q; + } + TK = TC + TJ; + T31 = T2X + T30; + { + E T1M, T1X, T7H, T7I; + T1M = T1I + T1L; + T1X = KP707106781 * (T1R - T1W); + T1Y = T1M + T1X; + T4y = T1M - T1X; + T7H = T5L - T5M; + T7I = T5P - T5O; + T7J = FNMS(KP923879532, T7I, KP382683432 * T7H); + T7Q = FMA(KP923879532, T7H, KP382683432 * T7I); + } + { + E T21, T26, T5N, T5Q; + T21 = KP707106781 * (T1Z + T20); + T26 = T22 - T25; + T27 = T21 + T26; + T4z = T26 - T21; + T5N = T5L + T5M; + T5Q = T5O + T5P; + T5R = FNMS(KP382683432, T5Q, KP923879532 * T5N); + T62 = FMA(KP382683432, T5N, KP923879532 * T5Q); + } + T6t = T22 + T25; + T6u = KP707106781 * (T1R + T1W); + T6v = T6t - T6u; + T83 = T6u + T6t; + { + E T4d, T4e, T6q, T6r; + T4d = TC - TJ; + T4e = T30 - T2X; + T4f = T4d - T4e; + T4m = T4d + T4e; + T6q = T1L - T1I; + T6r = KP707106781 * (T1Z - T20); + T6s = T6q + T6r; + T82 = T6q - T6r; + } + } + { + E Ti, T3a, Tl, T3b, T1o, T1t, T6j, T6i, T5E, T5D, Tp, T3d, Ts, T3e, T1z; + E T1E, T6m, T6l, T5H, T5G; + { + E T1p, T1n, T1k, T1s; + { + E Tg, Th, T1l, T1m; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T1p = Tg - Th; + T1l = Ip[WS(rs, 2)]; + T1m = Im[WS(rs, 13)]; + T1n = T1l + T1m; + T3a = T1l - T1m; + } + { + E Tj, Tk, T1q, T1r; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T1k = Tj - Tk; + T1q = Ip[WS(rs, 10)]; + T1r = Im[WS(rs, 5)]; + T1s = T1q + T1r; + T3b = T1q - T1r; + } + T1o = T1k + T1n; + T1t = T1p - T1s; + T6j = T1p + T1s; + T6i = T1n - T1k; + T5E = T3a - T3b; + T5D = Ti - Tl; + } + { + E T1A, T1y, T1v, T1D; + { + E Tn, To, T1w, T1x; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T1A = Tn - To; + T1w = Im[WS(rs, 1)]; + T1x = Ip[WS(rs, 14)]; + T1y = T1w + T1x; + T3d = T1x - T1w; + } + { + E Tq, Tr, T1B, T1C; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T1v = Tq - Tr; + T1B = Ip[WS(rs, 6)]; + T1C = Im[WS(rs, 9)]; + T1D = T1B + T1C; + T3e = T1B - T1C; + } + T1z = T1v - T1y; + T1E = T1A - T1D; + T6m = T1A + T1D; + T6l = T1v + T1y; + T5H = T3d - T3e; + T5G = Tp - Ts; + } + { + E Tm, Tt, T6k, T6n; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T4p = Tm - Tt; + T6k = FMA(KP382683432, T6i, KP923879532 * T6j); + T6n = FMA(KP382683432, T6l, KP923879532 * T6m); + T6o = T6k - T6n; + T8f = T6k + T6n; + } + { + E T6K, T6L, T1u, T1F; + T6K = FNMS(KP923879532, T6i, KP382683432 * T6j); + T6L = FNMS(KP923879532, T6l, KP382683432 * T6m); + T6M = T6K + T6L; + T80 = T6K - T6L; + T1u = FMA(KP923879532, T1o, KP382683432 * T1t); + T1F = FNMS(KP382683432, T1E, KP923879532 * T1z); + T1G = T1u + T1F; + T4K = T1F - T1u; + } + { + E T2G, T2H, T5F, T5I; + T2G = FNMS(KP382683432, T1o, KP923879532 * T1t); + T2H = FMA(KP382683432, T1z, KP923879532 * T1E); + T2I = T2G + T2H; + T4w = T2G - T2H; + T5F = T5D - T5E; + T5I = T5G + T5H; + T5J = KP707106781 * (T5F + T5I); + T7T = KP707106781 * (T5F - T5I); + } + { + E T65, T66, T3c, T3f; + T65 = T5D + T5E; + T66 = T5H - T5G; + T67 = KP707106781 * (T65 + T66); + T7F = KP707106781 * (T66 - T65); + T3c = T3a + T3b; + T3f = T3d + T3e; + T3g = T3c + T3f; + T4b = T3f - T3c; + } + } + { + E T11, T3s, T3p, T3u, T3K, T40, T3G, T3Y, T2T, T43, T3z, T3P, T2B, T45, T3x; + E T3T; + { + E Tv, T10, T3E, T3F; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + T3s = Tv - T10; + { + E T39, T3o, T3I, T3J; + T39 = T31 + T38; + T3o = T3g + T3n; + T3p = T39 + T3o; + T3u = T3o - T39; + T3I = TK - TZ; + T3J = T3n - T3g; + T3K = T3I + T3J; + T40 = T3J - T3I; + } + T3E = Tf - Tu; + T3F = T38 - T31; + T3G = T3E + T3F; + T3Y = T3E - T3F; + { + E T2S, T3N, T2F, T3O, T2D, T2E; + T2S = T2I + T2R; + T3N = T1j - T1G; + T2D = FNMS(KP195090322, T1Y, KP980785280 * T27); + T2E = FMA(KP195090322, T2p, KP980785280 * T2y); + T2F = T2D + T2E; + T3O = T2D - T2E; + T2T = T2F + T2S; + T43 = T3N - T3O; + T3z = T2S - T2F; + T3P = T3N + T3O; + } + { + E T1H, T3S, T2A, T3R, T28, T2z; + T1H = T1j + T1G; + T3S = T2R - T2I; + T28 = FMA(KP980785280, T1Y, KP195090322 * T27); + T2z = FNMS(KP195090322, T2y, KP980785280 * T2p); + T2A = T28 + T2z; + T3R = T2z - T28; + T2B = T1H + T2A; + T45 = T3S - T3R; + T3x = T1H - T2A; + T3T = T3R + T3S; + } + } + { + E T2U, T3q, T12, T2C; + T12 = W[0]; + T2C = W[1]; + T2U = FMA(T12, T2B, T2C * T2T); + T3q = FNMS(T2C, T2B, T12 * T2T); + Rp[0] = T11 - T2U; + Ip[0] = T3p + T3q; + Rm[0] = T11 + T2U; + Im[0] = T3q - T3p; + } + { + E T41, T47, T46, T48; + { + E T3X, T3Z, T42, T44; + T3X = W[46]; + T3Z = W[47]; + T41 = FNMS(T3Z, T40, T3X * T3Y); + T47 = FMA(T3Z, T3Y, T3X * T40); + T42 = W[48]; + T44 = W[49]; + T46 = FMA(T42, T43, T44 * T45); + T48 = FNMS(T44, T43, T42 * T45); + } + Rp[WS(rs, 12)] = T41 - T46; + Ip[WS(rs, 12)] = T47 + T48; + Rm[WS(rs, 12)] = T41 + T46; + Im[WS(rs, 12)] = T48 - T47; + } + { + E T3v, T3B, T3A, T3C; + { + E T3r, T3t, T3w, T3y; + T3r = W[30]; + T3t = W[31]; + T3v = FNMS(T3t, T3u, T3r * T3s); + T3B = FMA(T3t, T3s, T3r * T3u); + T3w = W[32]; + T3y = W[33]; + T3A = FMA(T3w, T3x, T3y * T3z); + T3C = FNMS(T3y, T3x, T3w * T3z); + } + Rp[WS(rs, 8)] = T3v - T3A; + Ip[WS(rs, 8)] = T3B + T3C; + Rm[WS(rs, 8)] = T3v + T3A; + Im[WS(rs, 8)] = T3C - T3B; + } + { + E T3L, T3V, T3U, T3W; + { + E T3D, T3H, T3M, T3Q; + T3D = W[14]; + T3H = W[15]; + T3L = FNMS(T3H, T3K, T3D * T3G); + T3V = FMA(T3H, T3G, T3D * T3K); + T3M = W[16]; + T3Q = W[17]; + T3U = FMA(T3M, T3P, T3Q * T3T); + T3W = FNMS(T3Q, T3P, T3M * T3T); + } + Rp[WS(rs, 4)] = T3L - T3U; + Ip[WS(rs, 4)] = T3V + T3W; + Rm[WS(rs, 4)] = T3L + T3U; + Im[WS(rs, 4)] = T3W - T3V; + } + } + { + E T7O, T8m, T7W, T8o, T8E, T8U, T8A, T8S, T8h, T8X, T8t, T8J, T89, T8Z, T8r; + E T8N; + { + E T7G, T7N, T8y, T8z; + T7G = T7E + T7F; + T7N = T7J + T7M; + T7O = T7G + T7N; + T8m = T7G - T7N; + { + E T7S, T7V, T8C, T8D; + T7S = T7Q + T7R; + T7V = T7T + T7U; + T7W = T7S + T7V; + T8o = T7V - T7S; + T8C = T7J - T7M; + T8D = T7U - T7T; + T8E = T8C + T8D; + T8U = T8D - T8C; + } + T8y = T7E - T7F; + T8z = T7R - T7Q; + T8A = T8y + T8z; + T8S = T8y - T8z; + { + E T8g, T8H, T8d, T8I, T8b, T8c; + T8g = T8e - T8f; + T8H = T7Z - T80; + T8b = FNMS(KP980785280, T82, KP195090322 * T83); + T8c = FNMS(KP980785280, T85, KP195090322 * T86); + T8d = T8b + T8c; + T8I = T8b - T8c; + T8h = T8d + T8g; + T8X = T8H - T8I; + T8t = T8g - T8d; + T8J = T8H + T8I; + } + { + E T81, T8L, T88, T8M, T84, T87; + T81 = T7Z + T80; + T8L = T8f + T8e; + T84 = FMA(KP195090322, T82, KP980785280 * T83); + T87 = FMA(KP195090322, T85, KP980785280 * T86); + T88 = T84 - T87; + T8M = T84 + T87; + T89 = T81 + T88; + T8Z = T8M + T8L; + T8r = T81 - T88; + T8N = T8L - T8M; + } + } + { + E T7X, T8j, T8i, T8k; + { + E T7D, T7P, T7Y, T8a; + T7D = W[10]; + T7P = W[11]; + T7X = FNMS(T7P, T7W, T7D * T7O); + T8j = FMA(T7P, T7O, T7D * T7W); + T7Y = W[12]; + T8a = W[13]; + T8i = FMA(T7Y, T89, T8a * T8h); + T8k = FNMS(T8a, T89, T7Y * T8h); + } + Rp[WS(rs, 3)] = T7X - T8i; + Ip[WS(rs, 3)] = T8j + T8k; + Rm[WS(rs, 3)] = T7X + T8i; + Im[WS(rs, 3)] = T8k - T8j; + } + { + E T8V, T91, T90, T92; + { + E T8R, T8T, T8W, T8Y; + T8R = W[58]; + T8T = W[59]; + T8V = FNMS(T8T, T8U, T8R * T8S); + T91 = FMA(T8T, T8S, T8R * T8U); + T8W = W[60]; + T8Y = W[61]; + T90 = FMA(T8W, T8X, T8Y * T8Z); + T92 = FNMS(T8Y, T8X, T8W * T8Z); + } + Rp[WS(rs, 15)] = T8V - T90; + Ip[WS(rs, 15)] = T91 + T92; + Rm[WS(rs, 15)] = T8V + T90; + Im[WS(rs, 15)] = T92 - T91; + } + { + E T8p, T8v, T8u, T8w; + { + E T8l, T8n, T8q, T8s; + T8l = W[42]; + T8n = W[43]; + T8p = FNMS(T8n, T8o, T8l * T8m); + T8v = FMA(T8n, T8m, T8l * T8o); + T8q = W[44]; + T8s = W[45]; + T8u = FMA(T8q, T8r, T8s * T8t); + T8w = FNMS(T8s, T8r, T8q * T8t); + } + Rp[WS(rs, 11)] = T8p - T8u; + Ip[WS(rs, 11)] = T8v + T8w; + Rm[WS(rs, 11)] = T8p + T8u; + Im[WS(rs, 11)] = T8w - T8v; + } + { + E T8F, T8P, T8O, T8Q; + { + E T8x, T8B, T8G, T8K; + T8x = W[26]; + T8B = W[27]; + T8F = FNMS(T8B, T8E, T8x * T8A); + T8P = FMA(T8B, T8A, T8x * T8E); + T8G = W[28]; + T8K = W[29]; + T8O = FMA(T8G, T8J, T8K * T8N); + T8Q = FNMS(T8K, T8J, T8G * T8N); + } + Rp[WS(rs, 7)] = T8F - T8O; + Ip[WS(rs, 7)] = T8P + T8Q; + Rm[WS(rs, 7)] = T8F + T8O; + Im[WS(rs, 7)] = T8Q - T8P; + } + } + { + E T4k, T4S, T4s, T4U, T5a, T5q, T56, T5o, T4N, T5t, T4Z, T5f, T4F, T5v, T4X; + E T5j; + { + E T4c, T4j, T54, T55; + T4c = T4a + T4b; + T4j = KP707106781 * (T4f + T4i); + T4k = T4c + T4j; + T4S = T4c - T4j; + { + E T4o, T4r, T58, T59; + T4o = KP707106781 * (T4m + T4n); + T4r = T4p + T4q; + T4s = T4o + T4r; + T4U = T4r - T4o; + T58 = KP707106781 * (T4f - T4i); + T59 = T4q - T4p; + T5a = T58 + T59; + T5q = T59 - T58; + } + T54 = T4a - T4b; + T55 = KP707106781 * (T4n - T4m); + T56 = T54 + T55; + T5o = T54 - T55; + { + E T4M, T5d, T4J, T5e, T4H, T4I; + T4M = T4K + T4L; + T5d = T4v - T4w; + T4H = FNMS(KP831469612, T4y, KP555570233 * T4z); + T4I = FMA(KP831469612, T4B, KP555570233 * T4C); + T4J = T4H + T4I; + T5e = T4H - T4I; + T4N = T4J + T4M; + T5t = T5d - T5e; + T4Z = T4M - T4J; + T5f = T5d + T5e; + } + { + E T4x, T5i, T4E, T5h, T4A, T4D; + T4x = T4v + T4w; + T5i = T4L - T4K; + T4A = FMA(KP555570233, T4y, KP831469612 * T4z); + T4D = FNMS(KP831469612, T4C, KP555570233 * T4B); + T4E = T4A + T4D; + T5h = T4D - T4A; + T4F = T4x + T4E; + T5v = T5i - T5h; + T4X = T4x - T4E; + T5j = T5h + T5i; + } + } + { + E T4t, T4P, T4O, T4Q; + { + E T49, T4l, T4u, T4G; + T49 = W[6]; + T4l = W[7]; + T4t = FNMS(T4l, T4s, T49 * T4k); + T4P = FMA(T4l, T4k, T49 * T4s); + T4u = W[8]; + T4G = W[9]; + T4O = FMA(T4u, T4F, T4G * T4N); + T4Q = FNMS(T4G, T4F, T4u * T4N); + } + Rp[WS(rs, 2)] = T4t - T4O; + Ip[WS(rs, 2)] = T4P + T4Q; + Rm[WS(rs, 2)] = T4t + T4O; + Im[WS(rs, 2)] = T4Q - T4P; + } + { + E T5r, T5x, T5w, T5y; + { + E T5n, T5p, T5s, T5u; + T5n = W[54]; + T5p = W[55]; + T5r = FNMS(T5p, T5q, T5n * T5o); + T5x = FMA(T5p, T5o, T5n * T5q); + T5s = W[56]; + T5u = W[57]; + T5w = FMA(T5s, T5t, T5u * T5v); + T5y = FNMS(T5u, T5t, T5s * T5v); + } + Rp[WS(rs, 14)] = T5r - T5w; + Ip[WS(rs, 14)] = T5x + T5y; + Rm[WS(rs, 14)] = T5r + T5w; + Im[WS(rs, 14)] = T5y - T5x; + } + { + E T4V, T51, T50, T52; + { + E T4R, T4T, T4W, T4Y; + T4R = W[38]; + T4T = W[39]; + T4V = FNMS(T4T, T4U, T4R * T4S); + T51 = FMA(T4T, T4S, T4R * T4U); + T4W = W[40]; + T4Y = W[41]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T52 = FNMS(T4Y, T4X, T4W * T4Z); + } + Rp[WS(rs, 10)] = T4V - T50; + Ip[WS(rs, 10)] = T51 + T52; + Rm[WS(rs, 10)] = T4V + T50; + Im[WS(rs, 10)] = T52 - T51; + } + { + E T5b, T5l, T5k, T5m; + { + E T53, T57, T5c, T5g; + T53 = W[22]; + T57 = W[23]; + T5b = FNMS(T57, T5a, T53 * T56); + T5l = FMA(T57, T56, T53 * T5a); + T5c = W[24]; + T5g = W[25]; + T5k = FMA(T5c, T5f, T5g * T5j); + T5m = FNMS(T5g, T5f, T5c * T5j); + } + Rp[WS(rs, 6)] = T5b - T5k; + Ip[WS(rs, 6)] = T5l + T5m; + Rm[WS(rs, 6)] = T5b + T5k; + Im[WS(rs, 6)] = T5m - T5l; + } + } + { + E T60, T6W, T6c, T6Y, T7e, T7u, T7a, T7s, T6R, T7x, T73, T7j, T6F, T7z, T71; + E T7n; + { + E T5K, T5Z, T78, T79; + T5K = T5C + T5J; + T5Z = T5R + T5Y; + T60 = T5K + T5Z; + T6W = T5K - T5Z; + { + E T64, T6b, T7c, T7d; + T64 = T62 + T63; + T6b = T67 + T6a; + T6c = T64 + T6b; + T6Y = T6b - T64; + T7c = T5R - T5Y; + T7d = T6a - T67; + T7e = T7c + T7d; + T7u = T7d - T7c; + } + T78 = T5C - T5J; + T79 = T63 - T62; + T7a = T78 + T79; + T7s = T78 - T79; + { + E T6Q, T7h, T6J, T7i, T6H, T6I; + T6Q = T6M + T6P; + T7h = T6h - T6o; + T6H = FNMS(KP555570233, T6s, KP831469612 * T6v); + T6I = FMA(KP555570233, T6z, KP831469612 * T6C); + T6J = T6H + T6I; + T7i = T6H - T6I; + T6R = T6J + T6Q; + T7x = T7h - T7i; + T73 = T6Q - T6J; + T7j = T7h + T7i; + } + { + E T6p, T7m, T6E, T7l, T6w, T6D; + T6p = T6h + T6o; + T7m = T6P - T6M; + T6w = FMA(KP831469612, T6s, KP555570233 * T6v); + T6D = FNMS(KP555570233, T6C, KP831469612 * T6z); + T6E = T6w + T6D; + T7l = T6D - T6w; + T6F = T6p + T6E; + T7z = T7m - T7l; + T71 = T6p - T6E; + T7n = T7l + T7m; + } + } + { + E T6d, T6T, T6S, T6U; + { + E T5z, T61, T6e, T6G; + T5z = W[2]; + T61 = W[3]; + T6d = FNMS(T61, T6c, T5z * T60); + T6T = FMA(T61, T60, T5z * T6c); + T6e = W[4]; + T6G = W[5]; + T6S = FMA(T6e, T6F, T6G * T6R); + T6U = FNMS(T6G, T6F, T6e * T6R); + } + Rp[WS(rs, 1)] = T6d - T6S; + Ip[WS(rs, 1)] = T6T + T6U; + Rm[WS(rs, 1)] = T6d + T6S; + Im[WS(rs, 1)] = T6U - T6T; + } + { + E T7v, T7B, T7A, T7C; + { + E T7r, T7t, T7w, T7y; + T7r = W[50]; + T7t = W[51]; + T7v = FNMS(T7t, T7u, T7r * T7s); + T7B = FMA(T7t, T7s, T7r * T7u); + T7w = W[52]; + T7y = W[53]; + T7A = FMA(T7w, T7x, T7y * T7z); + T7C = FNMS(T7y, T7x, T7w * T7z); + } + Rp[WS(rs, 13)] = T7v - T7A; + Ip[WS(rs, 13)] = T7B + T7C; + Rm[WS(rs, 13)] = T7v + T7A; + Im[WS(rs, 13)] = T7C - T7B; + } + { + E T6Z, T75, T74, T76; + { + E T6V, T6X, T70, T72; + T6V = W[34]; + T6X = W[35]; + T6Z = FNMS(T6X, T6Y, T6V * T6W); + T75 = FMA(T6X, T6W, T6V * T6Y); + T70 = W[36]; + T72 = W[37]; + T74 = FMA(T70, T71, T72 * T73); + T76 = FNMS(T72, T71, T70 * T73); + } + Rp[WS(rs, 9)] = T6Z - T74; + Ip[WS(rs, 9)] = T75 + T76; + Rm[WS(rs, 9)] = T6Z + T74; + Im[WS(rs, 9)] = T76 - T75; + } + { + E T7f, T7p, T7o, T7q; + { + E T77, T7b, T7g, T7k; + T77 = W[18]; + T7b = W[19]; + T7f = FNMS(T7b, T7e, T77 * T7a); + T7p = FMA(T7b, T7a, T77 * T7e); + T7g = W[20]; + T7k = W[21]; + T7o = FMA(T7g, T7j, T7k * T7n); + T7q = FNMS(T7k, T7j, T7g * T7n); + } + Rp[WS(rs, 5)] = T7f - T7o; + Ip[WS(rs, 5)] = T7p + T7q; + Rm[WS(rs, 5)] = T7f + T7o; + Im[WS(rs, 5)] = T7q - T7p; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cbdft2_32", twinstr, &GENUS, {404, 114, 94, 0} }; + +void X(codelet_hc2cbdft2_32) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_32, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_4.c new file mode 100644 index 000000000..701557fb3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_4.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:00 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hc2cbdft2_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 30 FP additions, 12 FP multiplications, + * (or, 24 additions, 6 multiplications, 6 fused multiply/add), + * 23 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T3, Tm, T6, Tn, Td, Tk, TB, Ty, Tv, Ts; + { + E Tg, Tc, T9, Tj; + { + E T1, T2, Ta, Tb; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tg = T1 - T2; + Ta = Ip[0]; + Tb = Im[WS(rs, 1)]; + Tc = Ta + Tb; + Tm = Ta - Tb; + } + { + E T4, T5, Th, Ti; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + T9 = T4 - T5; + Th = Ip[WS(rs, 1)]; + Ti = Im[0]; + Tj = Th + Ti; + Tn = Th - Ti; + } + Td = T9 + Tc; + Tk = Tg - Tj; + TB = Tg + Tj; + Ty = Tc - T9; + Tv = Tm - Tn; + Ts = T3 - T6; + } + { + E T7, To, Te, Tp, T8, Tl, Tq, Tf; + T7 = T3 + T6; + To = Tm + Tn; + T8 = W[0]; + Te = T8 * Td; + Tp = T8 * Tk; + Tf = W[1]; + Tl = FMA(Tf, Tk, Te); + Tq = FNMS(Tf, Td, Tp); + Rp[0] = T7 - Tl; + Ip[0] = To + Tq; + Rm[0] = T7 + Tl; + Im[0] = Tq - To; + } + { + E Tr, Tt, Tu, TD, Tz, TF, Tx; + Tr = W[2]; + Tt = Tr * Ts; + Tu = W[3]; + TD = Tu * Ts; + Tx = W[4]; + Tz = Tx * Ty; + TF = Tx * TB; + { + E Tw, TE, TC, TG, TA; + Tw = FNMS(Tu, Tv, Tt); + TE = FMA(Tr, Tv, TD); + TA = W[5]; + TC = FMA(TA, TB, Tz); + TG = FNMS(TA, Ty, TF); + Rp[WS(rs, 1)] = Tw - TC; + Ip[WS(rs, 1)] = TE + TG; + Rm[WS(rs, 1)] = Tw + TC; + Im[WS(rs, 1)] = TG - TE; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cbdft2_4", twinstr, &GENUS, {24, 6, 6, 0} }; + +void X(codelet_hc2cbdft2_4) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_4, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hc2cbdft2_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 30 FP additions, 12 FP multiplications, + * (or, 24 additions, 6 multiplications, 6 fused multiply/add), + * 19 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T3, Tl, T6, Tm, Td, Tj, Tx, Tv, Ts, Tq; + { + E Tf, Tc, T9, Ti; + { + E T1, T2, Ta, Tb; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tf = T1 - T2; + Ta = Ip[0]; + Tb = Im[WS(rs, 1)]; + Tc = Ta + Tb; + Tl = Ta - Tb; + } + { + E T4, T5, Tg, Th; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + T9 = T4 - T5; + Tg = Ip[WS(rs, 1)]; + Th = Im[0]; + Ti = Tg + Th; + Tm = Tg - Th; + } + Td = T9 + Tc; + Tj = Tf - Ti; + Tx = Tf + Ti; + Tv = Tc - T9; + Ts = Tl - Tm; + Tq = T3 - T6; + } + { + E T7, Tn, Tk, To, T8, Te; + T7 = T3 + T6; + Tn = Tl + Tm; + T8 = W[0]; + Te = W[1]; + Tk = FMA(T8, Td, Te * Tj); + To = FNMS(Te, Td, T8 * Tj); + Rp[0] = T7 - Tk; + Ip[0] = Tn + To; + Rm[0] = T7 + Tk; + Im[0] = To - Tn; + } + { + E Tt, Tz, Ty, TA; + { + E Tp, Tr, Tu, Tw; + Tp = W[2]; + Tr = W[3]; + Tt = FNMS(Tr, Ts, Tp * Tq); + Tz = FMA(Tr, Tq, Tp * Ts); + Tu = W[4]; + Tw = W[5]; + Ty = FMA(Tu, Tv, Tw * Tx); + TA = FNMS(Tw, Tv, Tu * Tx); + } + Rp[WS(rs, 1)] = Tt - Ty; + Ip[WS(rs, 1)] = Tz + TA; + Rm[WS(rs, 1)] = Tt + Ty; + Im[WS(rs, 1)] = TA - Tz; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cbdft2_4", twinstr, &GENUS, {24, 6, 6, 0} }; + +void X(codelet_hc2cbdft2_4) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_4, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_8.c new file mode 100644 index 000000000..c8ad9380f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft2_8.c @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:00 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hc2cbdft2_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 82 FP additions, 36 FP multiplications, + * (or, 60 additions, 14 multiplications, 22 fused multiply/add), + * 41 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tl, T1p, T1g, TM, T1k, TE, TP, T1f, T7, Te, TU, TH, T1l, Tw, T1q; + E T1c, T1y; + { + E T3, TA, Tk, TN, T6, Th, TD, TO, Ta, Tm, Tp, TK, Td, Tr, Tu; + E TL, TF, TG; + { + E T1, T2, Ti, Tj; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + TA = T1 - T2; + Ti = Ip[0]; + Tj = Im[WS(rs, 3)]; + Tk = Ti + Tj; + TN = Ti - Tj; + } + { + E T4, T5, TB, TC; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + Th = T4 - T5; + TB = Ip[WS(rs, 2)]; + TC = Im[WS(rs, 1)]; + TD = TB + TC; + TO = TB - TC; + } + { + E T8, T9, Tn, To; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + Tm = T8 - T9; + Tn = Ip[WS(rs, 1)]; + To = Im[WS(rs, 2)]; + Tp = Tn + To; + TK = Tn - To; + } + { + E Tb, Tc, Ts, Tt; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + Tr = Tb - Tc; + Ts = Im[0]; + Tt = Ip[WS(rs, 3)]; + Tu = Ts + Tt; + TL = Tt - Ts; + } + Tl = Th + Tk; + T1p = TA + TD; + T1g = TN - TO; + TM = TK + TL; + T1k = Tk - Th; + TE = TA - TD; + TP = TN + TO; + T1f = Ta - Td; + T7 = T3 + T6; + Te = Ta + Td; + TU = T7 - Te; + TF = Tm - Tp; + TG = Tr - Tu; + TH = TF + TG; + T1l = TF - TG; + { + E Tq, Tv, T1a, T1b; + Tq = Tm + Tp; + Tv = Tr + Tu; + Tw = Tq - Tv; + T1q = Tq + Tv; + T1a = T3 - T6; + T1b = TL - TK; + T1c = T1a + T1b; + T1y = T1a - T1b; + } + } + { + E Tf, TQ, Tx, TI, Ty, TR, Tg, TJ, TS, Tz; + Tf = T7 + Te; + TQ = TM + TP; + Tx = FMA(KP707106781, Tw, Tl); + TI = FMA(KP707106781, TH, TE); + Tg = W[0]; + Ty = Tg * Tx; + TR = Tg * TI; + Tz = W[1]; + TJ = FMA(Tz, TI, Ty); + TS = FNMS(Tz, Tx, TR); + Rp[0] = Tf - TJ; + Ip[0] = TQ + TS; + Rm[0] = Tf + TJ; + Im[0] = TS - TQ; + } + { + E T1B, T1A, T1J, T1x, T1z, T1E, T1H, T1F, T1L, T1D; + T1B = T1g - T1f; + T1A = W[11]; + T1J = T1A * T1y; + T1x = W[10]; + T1z = T1x * T1y; + T1E = FNMS(KP707106781, T1l, T1k); + T1H = FMA(KP707106781, T1q, T1p); + T1D = W[12]; + T1F = T1D * T1E; + T1L = T1D * T1H; + { + E T1C, T1K, T1I, T1M, T1G; + T1C = FNMS(T1A, T1B, T1z); + T1K = FMA(T1x, T1B, T1J); + T1G = W[13]; + T1I = FMA(T1G, T1H, T1F); + T1M = FNMS(T1G, T1E, T1L); + Rp[WS(rs, 3)] = T1C - T1I; + Ip[WS(rs, 3)] = T1K + T1M; + Rm[WS(rs, 3)] = T1C + T1I; + Im[WS(rs, 3)] = T1M - T1K; + } + } + { + E TX, TW, T15, TT, TV, T10, T13, T11, T17, TZ; + TX = TP - TM; + TW = W[7]; + T15 = TW * TU; + TT = W[6]; + TV = TT * TU; + T10 = FNMS(KP707106781, Tw, Tl); + T13 = FNMS(KP707106781, TH, TE); + TZ = W[8]; + T11 = TZ * T10; + T17 = TZ * T13; + { + E TY, T16, T14, T18, T12; + TY = FNMS(TW, TX, TV); + T16 = FMA(TT, TX, T15); + T12 = W[9]; + T14 = FMA(T12, T13, T11); + T18 = FNMS(T12, T10, T17); + Rp[WS(rs, 2)] = TY - T14; + Ip[WS(rs, 2)] = T16 + T18; + Rm[WS(rs, 2)] = TY + T14; + Im[WS(rs, 2)] = T18 - T16; + } + } + { + E T1h, T1e, T1t, T19, T1d, T1m, T1r, T1n, T1v, T1j; + T1h = T1f + T1g; + T1e = W[3]; + T1t = T1e * T1c; + T19 = W[2]; + T1d = T19 * T1c; + T1m = FMA(KP707106781, T1l, T1k); + T1r = FNMS(KP707106781, T1q, T1p); + T1j = W[4]; + T1n = T1j * T1m; + T1v = T1j * T1r; + { + E T1i, T1u, T1s, T1w, T1o; + T1i = FNMS(T1e, T1h, T1d); + T1u = FMA(T19, T1h, T1t); + T1o = W[5]; + T1s = FMA(T1o, T1r, T1n); + T1w = FNMS(T1o, T1m, T1v); + Rp[WS(rs, 1)] = T1i - T1s; + Ip[WS(rs, 1)] = T1u + T1w; + Rm[WS(rs, 1)] = T1i + T1s; + Im[WS(rs, 1)] = T1w - T1u; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cbdft2_8", twinstr, &GENUS, {60, 14, 22, 0} }; + +void X(codelet_hc2cbdft2_8) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_8, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hc2cbdft2_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 82 FP additions, 32 FP multiplications, + * (or, 68 additions, 18 multiplications, 14 fused multiply/add), + * 30 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T1d, T1h, Tl, TG, T14, T19, TO, Te, TL, T18, T15, TB, T1e, Tw; + E T1i; + { + E T3, TC, Tk, TM, T6, Th, TF, TN; + { + E T1, T2, Ti, Tj; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + TC = T1 - T2; + Ti = Ip[0]; + Tj = Im[WS(rs, 3)]; + Tk = Ti + Tj; + TM = Ti - Tj; + } + { + E T4, T5, TD, TE; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + Th = T4 - T5; + TD = Ip[WS(rs, 2)]; + TE = Im[WS(rs, 1)]; + TF = TD + TE; + TN = TD - TE; + } + T7 = T3 + T6; + T1d = Tk - Th; + T1h = TC + TF; + Tl = Th + Tk; + TG = TC - TF; + T14 = T3 - T6; + T19 = TM - TN; + TO = TM + TN; + } + { + E Ta, Tm, Tp, TJ, Td, Tr, Tu, TK; + { + E T8, T9, Tn, To; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + Tm = T8 - T9; + Tn = Ip[WS(rs, 1)]; + To = Im[WS(rs, 2)]; + Tp = Tn + To; + TJ = Tn - To; + } + { + E Tb, Tc, Ts, Tt; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + Tr = Tb - Tc; + Ts = Im[0]; + Tt = Ip[WS(rs, 3)]; + Tu = Ts + Tt; + TK = Tt - Ts; + } + Te = Ta + Td; + TL = TJ + TK; + T18 = Ta - Td; + T15 = TK - TJ; + { + E Tz, TA, Tq, Tv; + Tz = Tm - Tp; + TA = Tr - Tu; + TB = KP707106781 * (Tz + TA); + T1e = KP707106781 * (Tz - TA); + Tq = Tm + Tp; + Tv = Tr + Tu; + Tw = KP707106781 * (Tq - Tv); + T1i = KP707106781 * (Tq + Tv); + } + } + { + E Tf, TP, TI, TQ; + Tf = T7 + Te; + TP = TL + TO; + { + E Tx, TH, Tg, Ty; + Tx = Tl + Tw; + TH = TB + TG; + Tg = W[0]; + Ty = W[1]; + TI = FMA(Tg, Tx, Ty * TH); + TQ = FNMS(Ty, Tx, Tg * TH); + } + Rp[0] = Tf - TI; + Ip[0] = TP + TQ; + Rm[0] = Tf + TI; + Im[0] = TQ - TP; + } + { + E T1r, T1x, T1w, T1y; + { + E T1o, T1q, T1n, T1p; + T1o = T14 - T15; + T1q = T19 - T18; + T1n = W[10]; + T1p = W[11]; + T1r = FNMS(T1p, T1q, T1n * T1o); + T1x = FMA(T1p, T1o, T1n * T1q); + } + { + E T1t, T1v, T1s, T1u; + T1t = T1d - T1e; + T1v = T1i + T1h; + T1s = W[12]; + T1u = W[13]; + T1w = FMA(T1s, T1t, T1u * T1v); + T1y = FNMS(T1u, T1t, T1s * T1v); + } + Rp[WS(rs, 3)] = T1r - T1w; + Ip[WS(rs, 3)] = T1x + T1y; + Rm[WS(rs, 3)] = T1r + T1w; + Im[WS(rs, 3)] = T1y - T1x; + } + { + E TV, T11, T10, T12; + { + E TS, TU, TR, TT; + TS = T7 - Te; + TU = TO - TL; + TR = W[6]; + TT = W[7]; + TV = FNMS(TT, TU, TR * TS); + T11 = FMA(TT, TS, TR * TU); + } + { + E TX, TZ, TW, TY; + TX = Tl - Tw; + TZ = TG - TB; + TW = W[8]; + TY = W[9]; + T10 = FMA(TW, TX, TY * TZ); + T12 = FNMS(TY, TX, TW * TZ); + } + Rp[WS(rs, 2)] = TV - T10; + Ip[WS(rs, 2)] = T11 + T12; + Rm[WS(rs, 2)] = TV + T10; + Im[WS(rs, 2)] = T12 - T11; + } + { + E T1b, T1l, T1k, T1m; + { + E T16, T1a, T13, T17; + T16 = T14 + T15; + T1a = T18 + T19; + T13 = W[2]; + T17 = W[3]; + T1b = FNMS(T17, T1a, T13 * T16); + T1l = FMA(T17, T16, T13 * T1a); + } + { + E T1f, T1j, T1c, T1g; + T1f = T1d + T1e; + T1j = T1h - T1i; + T1c = W[4]; + T1g = W[5]; + T1k = FMA(T1c, T1f, T1g * T1j); + T1m = FNMS(T1g, T1f, T1c * T1j); + } + Rp[WS(rs, 1)] = T1b - T1k; + Ip[WS(rs, 1)] = T1l + T1m; + Rm[WS(rs, 1)] = T1b + T1k; + Im[WS(rs, 1)] = T1m - T1l; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cbdft2_8", twinstr, &GENUS, {68, 18, 14, 0} }; + +void X(codelet_hc2cbdft2_8) (planner *p) { + X(khc2c_register) (p, hc2cbdft2_8, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_10.c new file mode 100644 index 000000000..e68873659 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_10.c @@ -0,0 +1,545 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:58 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -dif -name hc2cbdft_10 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 122 FP additions, 72 FP multiplications, + * (or, 68 additions, 18 multiplications, 54 fused multiply/add), + * 91 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E T3, Tl, Tu, T14, Ti, T13, Ts, Tt, T1p, T23, TZ, T1z, TQ, T1g, TV; + E T1l, TT, TU, T1j, T1k, T1c, T1Y, TK, T1u; + { + E Td, Tp, Tg, Tq, Th, Tr, T6, Tm, T9, Tn, Ta, To, T1, T2; + T1 = Rp[0]; + T2 = Rm[WS(rs, 4)]; + T3 = T1 + T2; + Tl = T1 - T2; + { + E Tb, Tc, Te, Tf; + Tb = Rp[WS(rs, 4)]; + Tc = Rm[0]; + Td = Tb + Tc; + Tp = Tb - Tc; + Te = Rm[WS(rs, 3)]; + Tf = Rp[WS(rs, 1)]; + Tg = Te + Tf; + Tq = Te - Tf; + } + Th = Td + Tg; + Tr = Tp + Tq; + { + E T4, T5, T7, T8; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 2)]; + T6 = T4 + T5; + Tm = T4 - T5; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 3)]; + T9 = T7 + T8; + Tn = T7 - T8; + } + Ta = T6 + T9; + To = Tm + Tn; + Tu = To - Tr; + T14 = Ta - Th; + Ti = Ta + Th; + T13 = FNMS(KP250000000, Ti, T3); + Ts = To + Tr; + Tt = FNMS(KP250000000, Ts, Tl); + { + E T1n, T1o, TX, TY; + T1n = Td - Tg; + T1o = T6 - T9; + T1p = FNMS(KP618033988, T1o, T1n); + T23 = FMA(KP618033988, T1n, T1o); + TX = Tm - Tn; + TY = Tp - Tq; + TZ = FMA(KP618033988, TY, TX); + T1z = FNMS(KP618033988, TX, TY); + } + } + { + E TF, T16, TI, T17, TS, T1i, Ty, T19, TB, T1a, TR, T1h, TO, TP; + TO = Ip[0]; + TP = Im[WS(rs, 4)]; + TQ = TO + TP; + T1g = TO - TP; + { + E TD, TE, TG, TH; + TD = Ip[WS(rs, 4)]; + TE = Im[0]; + TF = TD + TE; + T16 = TD - TE; + TG = Im[WS(rs, 3)]; + TH = Ip[WS(rs, 1)]; + TI = TG + TH; + T17 = TH - TG; + } + TS = TF - TI; + T1i = T16 + T17; + { + E Tw, Tx, Tz, TA; + Tw = Ip[WS(rs, 2)]; + Tx = Im[WS(rs, 2)]; + Ty = Tw + Tx; + T19 = Tw - Tx; + Tz = Im[WS(rs, 1)]; + TA = Ip[WS(rs, 3)]; + TB = Tz + TA; + T1a = TA - Tz; + } + TR = Ty - TB; + T1h = T19 + T1a; + TV = TR - TS; + T1l = T1h - T1i; + TT = TR + TS; + TU = FNMS(KP250000000, TT, TQ); + T1j = T1h + T1i; + T1k = FNMS(KP250000000, T1j, T1g); + { + E T18, T1b, TC, TJ; + T18 = T16 - T17; + T1b = T19 - T1a; + T1c = FNMS(KP618033988, T1b, T18); + T1Y = FMA(KP618033988, T18, T1b); + TC = Ty + TB; + TJ = TF + TI; + TK = FMA(KP618033988, TJ, TC); + T1u = FNMS(KP618033988, TC, TJ); + } + } + { + E Tj, T2y, T2a, T1A, T2q, T10, T1Q, T24, T2k, T1q, T1K, T26, T28, T29, T2c; + E Tk, TM, TN, T2w, T1M, T1O, T1P, T1S, T1s, T1w, T1x, T1C, T2m, T2o, T2p; + E T2s, T12, T1e, T1f, T1E, T1G, T1I, T1J, T1U, T1W, T20, T21, T2e, T2g, T2i; + E T2j, T2u, T1y, TW, T22, T2l, T2r; + Tj = T3 + Ti; + T2y = T1g + T1j; + T2a = TQ + TT; + T1y = FNMS(KP559016994, TV, TU); + T1A = FMA(KP951056516, T1z, T1y); + T2q = FNMS(KP951056516, T1z, T1y); + TW = FMA(KP559016994, TV, TU); + T10 = FMA(KP951056516, TZ, TW); + T1Q = FNMS(KP951056516, TZ, TW); + T22 = FMA(KP559016994, T1l, T1k); + T24 = FNMS(KP951056516, T23, T22); + T2k = FMA(KP951056516, T23, T22); + { + E T1m, T1v, T2n, T1t; + T1m = FNMS(KP559016994, T1l, T1k); + T1q = FNMS(KP951056516, T1p, T1m); + T1K = FMA(KP951056516, T1p, T1m); + { + E T27, TL, T1N, Tv; + T27 = Tl + Ts; + T26 = W[9]; + T28 = T26 * T27; + T29 = W[8]; + T2c = T29 * T27; + Tv = FMA(KP559016994, Tu, Tt); + TL = FNMS(KP951056516, TK, Tv); + T1N = FMA(KP951056516, TK, Tv); + Tk = W[1]; + TM = Tk * TL; + TN = W[0]; + T2w = TN * TL; + T1M = W[17]; + T1O = T1M * T1N; + T1P = W[16]; + T1S = T1P * T1N; + } + T1t = FNMS(KP559016994, Tu, Tt); + T1v = FNMS(KP951056516, T1u, T1t); + T2n = FMA(KP951056516, T1u, T1t); + T1s = W[5]; + T1w = T1s * T1v; + T1x = W[4]; + T1C = T1x * T1v; + T2m = W[13]; + T2o = T2m * T2n; + T2p = W[12]; + T2s = T2p * T2n; + { + E T1d, T1H, T15, T1Z, T2h, T1X; + T15 = FNMS(KP559016994, T14, T13); + T1d = FMA(KP951056516, T1c, T15); + T1H = FNMS(KP951056516, T1c, T15); + T12 = W[2]; + T1e = T12 * T1d; + T1f = W[3]; + T1E = T1f * T1d; + T1G = W[14]; + T1I = T1G * T1H; + T1J = W[15]; + T1U = T1J * T1H; + T1X = FMA(KP559016994, T14, T13); + T1Z = FMA(KP951056516, T1Y, T1X); + T2h = FNMS(KP951056516, T1Y, T1X); + T1W = W[6]; + T20 = T1W * T1Z; + T21 = W[7]; + T2e = T21 * T1Z; + T2g = W[10]; + T2i = T2g * T2h; + T2j = W[11]; + T2u = T2j * T2h; + } + } + { + E T11, T2x, T1r, T1B; + T11 = FMA(TN, T10, TM); + Rp[0] = Tj - T11; + Rm[0] = Tj + T11; + T2x = FNMS(Tk, T10, T2w); + Im[0] = T2x - T2y; + Ip[0] = T2x + T2y; + T1r = FNMS(T1f, T1q, T1e); + T1B = FMA(T1x, T1A, T1w); + Rp[WS(rs, 1)] = T1r - T1B; + Rm[WS(rs, 1)] = T1B + T1r; + { + E T1D, T1F, T1L, T1R; + T1D = FNMS(T1s, T1A, T1C); + T1F = FMA(T12, T1q, T1E); + Im[WS(rs, 1)] = T1D - T1F; + Ip[WS(rs, 1)] = T1D + T1F; + T1L = FNMS(T1J, T1K, T1I); + T1R = FMA(T1P, T1Q, T1O); + Rp[WS(rs, 4)] = T1L - T1R; + Rm[WS(rs, 4)] = T1R + T1L; + } + } + { + E T1T, T1V, T2t, T2v; + T1T = FNMS(T1M, T1Q, T1S); + T1V = FMA(T1G, T1K, T1U); + Im[WS(rs, 4)] = T1T - T1V; + Ip[WS(rs, 4)] = T1T + T1V; + T2t = FNMS(T2m, T2q, T2s); + T2v = FMA(T2g, T2k, T2u); + Im[WS(rs, 3)] = T2t - T2v; + Ip[WS(rs, 3)] = T2t + T2v; + } + T2l = FNMS(T2j, T2k, T2i); + T2r = FMA(T2p, T2q, T2o); + Rp[WS(rs, 3)] = T2l - T2r; + Rm[WS(rs, 3)] = T2r + T2l; + { + E T25, T2b, T2d, T2f; + T25 = FNMS(T21, T24, T20); + T2b = FMA(T29, T2a, T28); + Rp[WS(rs, 2)] = T25 - T2b; + Rm[WS(rs, 2)] = T2b + T25; + T2d = FNMS(T26, T2a, T2c); + T2f = FMA(T1W, T24, T2e); + Im[WS(rs, 2)] = T2d - T2f; + Ip[WS(rs, 2)] = T2d + T2f; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cbdft_10", twinstr, &GENUS, {68, 18, 54, 0} }; + +void X(codelet_hc2cbdft_10) (planner *p) { + X(khc2c_register) (p, hc2cbdft_10, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -dif -name hc2cbdft_10 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 122 FP additions, 60 FP multiplications, + * (or, 92 additions, 30 multiplications, 30 fused multiply/add), + * 61 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E T3, TS, TR, T13, Ti, T12, TT, TU, T1g, T1T, Tr, T1s, TJ, T1h, TG; + E T1m, TK, TL, T1k, T1l, T1b, T1P, TY, T1w; + { + E Td, To, Tg, Tp, Th, TQ, T6, Tl, T9, Tm, Ta, TP, T1, T2; + T1 = Rp[0]; + T2 = Rm[WS(rs, 4)]; + T3 = T1 + T2; + TS = T1 - T2; + { + E Tb, Tc, Te, Tf; + Tb = Rp[WS(rs, 4)]; + Tc = Rm[0]; + Td = Tb + Tc; + To = Tb - Tc; + Te = Rm[WS(rs, 3)]; + Tf = Rp[WS(rs, 1)]; + Tg = Te + Tf; + Tp = Te - Tf; + } + Th = Td + Tg; + TQ = To + Tp; + { + E T4, T5, T7, T8; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 2)]; + T6 = T4 + T5; + Tl = T4 - T5; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 3)]; + T9 = T7 + T8; + Tm = T7 - T8; + } + Ta = T6 + T9; + TP = Tl + Tm; + TR = KP559016994 * (TP - TQ); + T13 = KP559016994 * (Ta - Th); + Ti = Ta + Th; + T12 = FNMS(KP250000000, Ti, T3); + TT = TP + TQ; + TU = FNMS(KP250000000, TT, TS); + { + E T1e, T1f, Tn, Tq; + T1e = T6 - T9; + T1f = Td - Tg; + T1g = FNMS(KP951056516, T1f, KP587785252 * T1e); + T1T = FMA(KP951056516, T1e, KP587785252 * T1f); + Tn = Tl - Tm; + Tq = To - Tp; + Tr = FMA(KP951056516, Tn, KP587785252 * Tq); + T1s = FNMS(KP951056516, Tq, KP587785252 * Tn); + } + } + { + E TB, T18, TE, T19, TF, T1j, Tu, T15, Tx, T16, Ty, T1i, TH, TI; + TH = Ip[0]; + TI = Im[WS(rs, 4)]; + TJ = TH + TI; + T1h = TH - TI; + { + E Tz, TA, TC, TD; + Tz = Ip[WS(rs, 4)]; + TA = Im[0]; + TB = Tz + TA; + T18 = Tz - TA; + TC = Im[WS(rs, 3)]; + TD = Ip[WS(rs, 1)]; + TE = TC + TD; + T19 = TD - TC; + } + TF = TB - TE; + T1j = T18 + T19; + { + E Ts, Tt, Tv, Tw; + Ts = Ip[WS(rs, 2)]; + Tt = Im[WS(rs, 2)]; + Tu = Ts + Tt; + T15 = Ts - Tt; + Tv = Im[WS(rs, 1)]; + Tw = Ip[WS(rs, 3)]; + Tx = Tv + Tw; + T16 = Tw - Tv; + } + Ty = Tu - Tx; + T1i = T15 + T16; + TG = KP559016994 * (Ty - TF); + T1m = KP559016994 * (T1i - T1j); + TK = Ty + TF; + TL = FNMS(KP250000000, TK, TJ); + T1k = T1i + T1j; + T1l = FNMS(KP250000000, T1k, T1h); + { + E T17, T1a, TW, TX; + T17 = T15 - T16; + T1a = T18 - T19; + T1b = FNMS(KP951056516, T1a, KP587785252 * T17); + T1P = FMA(KP951056516, T17, KP587785252 * T1a); + TW = Tu + Tx; + TX = TB + TE; + TY = FMA(KP951056516, TW, KP587785252 * TX); + T1w = FNMS(KP951056516, TX, KP587785252 * TW); + } + } + { + E Tj, T2g, TN, T1H, T1U, T26, TZ, T1J, T1Q, T24, T1c, T1C, T1t, T29, T1o; + E T1E, T1x, T2b, T20, T21, TM, T1S, TV; + Tj = T3 + Ti; + T2g = T1h + T1k; + TM = TG + TL; + TN = Tr + TM; + T1H = TM - Tr; + T1S = T1m + T1l; + T1U = T1S - T1T; + T26 = T1T + T1S; + TV = TR + TU; + TZ = TV - TY; + T1J = TV + TY; + { + E T1O, T14, T1r, T1n, T1v; + T1O = T13 + T12; + T1Q = T1O + T1P; + T24 = T1O - T1P; + T14 = T12 - T13; + T1c = T14 - T1b; + T1C = T14 + T1b; + T1r = TL - TG; + T1t = T1r - T1s; + T29 = T1s + T1r; + T1n = T1l - T1m; + T1o = T1g + T1n; + T1E = T1n - T1g; + T1v = TU - TR; + T1x = T1v + T1w; + T2b = T1v - T1w; + { + E T1X, T1Z, T1W, T1Y; + T1X = TS + TT; + T1Z = TJ + TK; + T1W = W[9]; + T1Y = W[8]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T21 = FNMS(T1W, T1Z, T1Y * T1X); + } + } + { + E T10, T2f, Tk, TO; + Tk = W[0]; + TO = W[1]; + T10 = FMA(Tk, TN, TO * TZ); + T2f = FNMS(TO, TN, Tk * TZ); + Rp[0] = Tj - T10; + Ip[0] = T2f + T2g; + Rm[0] = Tj + T10; + Im[0] = T2f - T2g; + } + { + E T1V, T22, T1N, T1R; + T1N = W[6]; + T1R = W[7]; + T1V = FNMS(T1R, T1U, T1N * T1Q); + T22 = FMA(T1R, T1Q, T1N * T1U); + Rp[WS(rs, 2)] = T1V - T20; + Ip[WS(rs, 2)] = T21 + T22; + Rm[WS(rs, 2)] = T20 + T1V; + Im[WS(rs, 2)] = T21 - T22; + } + { + E T1p, T1A, T1y, T1z; + { + E T11, T1d, T1q, T1u; + T11 = W[2]; + T1d = W[3]; + T1p = FNMS(T1d, T1o, T11 * T1c); + T1A = FMA(T1d, T1c, T11 * T1o); + T1q = W[4]; + T1u = W[5]; + T1y = FMA(T1q, T1t, T1u * T1x); + T1z = FNMS(T1u, T1t, T1q * T1x); + } + Rp[WS(rs, 1)] = T1p - T1y; + Ip[WS(rs, 1)] = T1z + T1A; + Rm[WS(rs, 1)] = T1y + T1p; + Im[WS(rs, 1)] = T1z - T1A; + } + { + E T1F, T1M, T1K, T1L; + { + E T1B, T1D, T1G, T1I; + T1B = W[14]; + T1D = W[15]; + T1F = FNMS(T1D, T1E, T1B * T1C); + T1M = FMA(T1D, T1C, T1B * T1E); + T1G = W[16]; + T1I = W[17]; + T1K = FMA(T1G, T1H, T1I * T1J); + T1L = FNMS(T1I, T1H, T1G * T1J); + } + Rp[WS(rs, 4)] = T1F - T1K; + Ip[WS(rs, 4)] = T1L + T1M; + Rm[WS(rs, 4)] = T1K + T1F; + Im[WS(rs, 4)] = T1L - T1M; + } + { + E T27, T2e, T2c, T2d; + { + E T23, T25, T28, T2a; + T23 = W[10]; + T25 = W[11]; + T27 = FNMS(T25, T26, T23 * T24); + T2e = FMA(T25, T24, T23 * T26); + T28 = W[12]; + T2a = W[13]; + T2c = FMA(T28, T29, T2a * T2b); + T2d = FNMS(T2a, T29, T28 * T2b); + } + Rp[WS(rs, 3)] = T27 - T2c; + Ip[WS(rs, 3)] = T2d + T2e; + Rm[WS(rs, 3)] = T2c + T27; + Im[WS(rs, 3)] = T2d - T2e; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cbdft_10", twinstr, &GENUS, {92, 30, 30, 0} }; + +void X(codelet_hc2cbdft_10) (planner *p) { + X(khc2c_register) (p, hc2cbdft_10, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_12.c new file mode 100644 index 000000000..a3bf40d19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_12.c @@ -0,0 +1,643 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:58 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -dif -name hc2cbdft_12 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 142 FP additions, 68 FP multiplications, + * (or, 96 additions, 22 multiplications, 46 fused multiply/add), + * 55 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E Tv, TC, TD, T1L, T1M, T2y, Tb, T1Z, T1E, T2D, T1e, T1U, TY, T2o, T13; + E T18, T19, T1O, T1P, T2E, Tm, T1V, T1H, T2z, T1h, T20, TO, T2p; + { + E T1, T4, Tu, TS, Tp, Ts, Tt, TT, T6, T9, TB, TV, Tw, Tz, TA; + E TW; + { + E T2, T3, Tq, Tr; + T1 = Rp[0]; + T2 = Rp[WS(rs, 4)]; + T3 = Rm[WS(rs, 3)]; + T4 = T2 + T3; + Tu = T2 - T3; + TS = FNMS(KP500000000, T4, T1); + Tp = Ip[0]; + Tq = Ip[WS(rs, 4)]; + Tr = Im[WS(rs, 3)]; + Ts = Tq - Tr; + Tt = FNMS(KP500000000, Ts, Tp); + TT = Tr + Tq; + } + { + E T7, T8, Tx, Ty; + T6 = Rm[WS(rs, 5)]; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 2)]; + T9 = T7 + T8; + TB = T7 - T8; + TV = FNMS(KP500000000, T9, T6); + Tw = Im[WS(rs, 5)]; + Tx = Im[WS(rs, 1)]; + Ty = Ip[WS(rs, 2)]; + Tz = Tx - Ty; + TA = FNMS(KP500000000, Tz, Tw); + TW = Tx + Ty; + } + { + E T5, Ta, T1C, T1D; + Tv = FMA(KP866025403, Tu, Tt); + TC = FNMS(KP866025403, TB, TA); + TD = Tv + TC; + T1L = FNMS(KP866025403, Tu, Tt); + T1M = FMA(KP866025403, TB, TA); + T2y = T1L + T1M; + T5 = T1 + T4; + Ta = T6 + T9; + Tb = T5 + Ta; + T1Z = T5 - Ta; + T1C = FMA(KP866025403, TT, TS); + T1D = FNMS(KP866025403, TW, TV); + T1E = T1C + T1D; + T2D = T1C - T1D; + { + E T1c, T1d, TU, TX; + T1c = Tp + Ts; + T1d = Tw + Tz; + T1e = T1c - T1d; + T1U = T1c + T1d; + TU = FNMS(KP866025403, TT, TS); + TX = FMA(KP866025403, TW, TV); + TY = TU - TX; + T2o = TU + TX; + } + } + } + { + E Tc, Tf, TE, T12, TZ, T10, TH, T11, Th, Tk, TJ, T17, T14, T15, TM; + E T16; + { + E Td, Te, TF, TG; + Tc = Rp[WS(rs, 3)]; + Td = Rm[WS(rs, 4)]; + Te = Rm[0]; + Tf = Td + Te; + TE = FNMS(KP500000000, Tf, Tc); + T12 = Td - Te; + TZ = Ip[WS(rs, 3)]; + TF = Im[WS(rs, 4)]; + TG = Im[0]; + T10 = TF + TG; + TH = TF - TG; + T11 = FMA(KP500000000, T10, TZ); + } + { + E Ti, Tj, TK, TL; + Th = Rm[WS(rs, 2)]; + Ti = Rp[WS(rs, 1)]; + Tj = Rp[WS(rs, 5)]; + Tk = Ti + Tj; + TJ = FNMS(KP500000000, Tk, Th); + T17 = Ti - Tj; + T14 = Im[WS(rs, 2)]; + TK = Ip[WS(rs, 5)]; + TL = Ip[WS(rs, 1)]; + T15 = TK + TL; + TM = TK - TL; + T16 = FMA(KP500000000, T15, T14); + } + { + E Tg, Tl, T1F, T1G; + T13 = FMA(KP866025403, T12, T11); + T18 = FNMS(KP866025403, T17, T16); + T19 = T13 + T18; + T1O = FNMS(KP866025403, T12, T11); + T1P = FMA(KP866025403, T17, T16); + T2E = T1O + T1P; + Tg = Tc + Tf; + Tl = Th + Tk; + Tm = Tg + Tl; + T1V = Tg - Tl; + T1F = FNMS(KP866025403, TH, TE); + T1G = FNMS(KP866025403, TM, TJ); + T1H = T1F + T1G; + T2z = T1F - T1G; + { + E T1f, T1g, TI, TN; + T1f = TZ - T10; + T1g = T15 - T14; + T1h = T1f + T1g; + T20 = T1f - T1g; + TI = FMA(KP866025403, TH, TE); + TN = FMA(KP866025403, TM, TJ); + TO = TI - TN; + T2p = TI + TN; + } + } + } + { + E Tn, T1i, TP, T1a, TQ, T1j, To, T1b, T1k, TR; + Tn = Tb + Tm; + T1i = T1e + T1h; + TP = TD + TO; + T1a = TY - T19; + To = W[0]; + TQ = To * TP; + T1j = To * T1a; + TR = W[1]; + T1b = FMA(TR, T1a, TQ); + T1k = FNMS(TR, TP, T1j); + Rp[0] = Tn - T1b; + Ip[0] = T1i + T1k; + Rm[0] = Tn + T1b; + Im[0] = T1k - T1i; + } + { + E T1p, T1l, T1n, T1o, T1x, T1s, T1v, T1t, T1z, T1m, T1r; + T1p = T1e - T1h; + T1m = Tb - Tm; + T1l = W[10]; + T1n = T1l * T1m; + T1o = W[11]; + T1x = T1o * T1m; + T1s = TD - TO; + T1v = TY + T19; + T1r = W[12]; + T1t = T1r * T1s; + T1z = T1r * T1v; + { + E T1q, T1y, T1w, T1A, T1u; + T1q = FNMS(T1o, T1p, T1n); + T1y = FMA(T1l, T1p, T1x); + T1u = W[13]; + T1w = FMA(T1u, T1v, T1t); + T1A = FNMS(T1u, T1s, T1z); + Rp[WS(rs, 3)] = T1q - T1w; + Ip[WS(rs, 3)] = T1y + T1A; + Rm[WS(rs, 3)] = T1q + T1w; + Im[WS(rs, 3)] = T1A - T1y; + } + } + { + E T1R, T2b, T27, T29, T2a, T2l, T1B, T1J, T1K, T25, T1W, T21, T1X, T23, T2e; + E T2h, T2f, T2j; + { + E T1N, T1Q, T28, T1I, T1T, T2d; + T1N = T1L - T1M; + T1Q = T1O - T1P; + T1R = T1N - T1Q; + T2b = T1N + T1Q; + T28 = T1E + T1H; + T27 = W[14]; + T29 = T27 * T28; + T2a = W[15]; + T2l = T2a * T28; + T1I = T1E - T1H; + T1B = W[2]; + T1J = T1B * T1I; + T1K = W[3]; + T25 = T1K * T1I; + T1W = T1U - T1V; + T21 = T1Z + T20; + T1T = W[4]; + T1X = T1T * T1W; + T23 = T1T * T21; + T2e = T1V + T1U; + T2h = T1Z - T20; + T2d = W[16]; + T2f = T2d * T2e; + T2j = T2d * T2h; + } + { + E T1S, T26, T22, T24, T1Y; + T1S = FNMS(T1K, T1R, T1J); + T26 = FMA(T1B, T1R, T25); + T1Y = W[5]; + T22 = FMA(T1Y, T21, T1X); + T24 = FNMS(T1Y, T1W, T23); + Rp[WS(rs, 1)] = T1S - T22; + Ip[WS(rs, 1)] = T24 + T26; + Rm[WS(rs, 1)] = T22 + T1S; + Im[WS(rs, 1)] = T24 - T26; + } + { + E T2c, T2m, T2i, T2k, T2g; + T2c = FNMS(T2a, T2b, T29); + T2m = FMA(T27, T2b, T2l); + T2g = W[17]; + T2i = FMA(T2g, T2h, T2f); + T2k = FNMS(T2g, T2e, T2j); + Rp[WS(rs, 4)] = T2c - T2i; + Ip[WS(rs, 4)] = T2k + T2m; + Rm[WS(rs, 4)] = T2i + T2c; + Im[WS(rs, 4)] = T2k - T2m; + } + } + { + E T2v, T2P, T2L, T2N, T2O, T2X, T2n, T2r, T2s, T2H, T2A, T2F, T2B, T2J, T2S; + E T2V, T2T, T2Z; + { + E T2t, T2u, T2M, T2q, T2x, T2R; + T2t = Tv - TC; + T2u = T13 - T18; + T2v = T2t + T2u; + T2P = T2t - T2u; + T2M = T2o - T2p; + T2L = W[18]; + T2N = T2L * T2M; + T2O = W[19]; + T2X = T2O * T2M; + T2q = T2o + T2p; + T2n = W[6]; + T2r = T2n * T2q; + T2s = W[7]; + T2H = T2s * T2q; + T2A = T2y + T2z; + T2F = T2D - T2E; + T2x = W[8]; + T2B = T2x * T2A; + T2J = T2x * T2F; + T2S = T2y - T2z; + T2V = T2D + T2E; + T2R = W[20]; + T2T = T2R * T2S; + T2Z = T2R * T2V; + } + { + E T2w, T2I, T2G, T2K, T2C; + T2w = FNMS(T2s, T2v, T2r); + T2I = FMA(T2n, T2v, T2H); + T2C = W[9]; + T2G = FMA(T2C, T2F, T2B); + T2K = FNMS(T2C, T2A, T2J); + Rp[WS(rs, 2)] = T2w - T2G; + Ip[WS(rs, 2)] = T2I + T2K; + Rm[WS(rs, 2)] = T2w + T2G; + Im[WS(rs, 2)] = T2K - T2I; + } + { + E T2Q, T2Y, T2W, T30, T2U; + T2Q = FNMS(T2O, T2P, T2N); + T2Y = FMA(T2L, T2P, T2X); + T2U = W[21]; + T2W = FMA(T2U, T2V, T2T); + T30 = FNMS(T2U, T2S, T2Z); + Rp[WS(rs, 5)] = T2Q - T2W; + Ip[WS(rs, 5)] = T2Y + T30; + Rm[WS(rs, 5)] = T2Q + T2W; + Im[WS(rs, 5)] = T30 - T2Y; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cbdft_12", twinstr, &GENUS, {96, 22, 46, 0} }; + +void X(codelet_hc2cbdft_12) (planner *p) { + X(khc2c_register) (p, hc2cbdft_12, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -dif -name hc2cbdft_12 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 142 FP additions, 60 FP multiplications, + * (or, 112 additions, 30 multiplications, 30 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E Tv, T1E, TC, T1F, TW, T1x, TT, T1w, T1d, T1N, Tb, T1R, TI, T1z, TN; + E T1A, T17, T1I, T12, T1H, T1g, T1S, Tm, T1O; + { + E T1, Tq, T6, TA, T4, Tp, Tt, TS, T9, Tw, Tz, TV; + T1 = Rp[0]; + Tq = Ip[0]; + T6 = Rm[WS(rs, 5)]; + TA = Im[WS(rs, 5)]; + { + E T2, T3, Tr, Ts; + T2 = Rp[WS(rs, 4)]; + T3 = Rm[WS(rs, 3)]; + T4 = T2 + T3; + Tp = KP866025403 * (T2 - T3); + Tr = Im[WS(rs, 3)]; + Ts = Ip[WS(rs, 4)]; + Tt = Tr - Ts; + TS = KP866025403 * (Tr + Ts); + } + { + E T7, T8, Tx, Ty; + T7 = Rm[WS(rs, 1)]; + T8 = Rp[WS(rs, 2)]; + T9 = T7 + T8; + Tw = KP866025403 * (T7 - T8); + Tx = Im[WS(rs, 1)]; + Ty = Ip[WS(rs, 2)]; + Tz = Tx - Ty; + TV = KP866025403 * (Tx + Ty); + } + { + E Tu, TB, TU, TR; + Tu = FMA(KP500000000, Tt, Tq); + Tv = Tp + Tu; + T1E = Tu - Tp; + TB = FMS(KP500000000, Tz, TA); + TC = Tw + TB; + T1F = TB - Tw; + TU = FNMS(KP500000000, T9, T6); + TW = TU + TV; + T1x = TU - TV; + TR = FNMS(KP500000000, T4, T1); + TT = TR - TS; + T1w = TR + TS; + { + E T1b, T1c, T5, Ta; + T1b = Tq - Tt; + T1c = Tz + TA; + T1d = T1b - T1c; + T1N = T1b + T1c; + T5 = T1 + T4; + Ta = T6 + T9; + Tb = T5 + Ta; + T1R = T5 - Ta; + } + } + } + { + E Tc, T10, Th, T15, Tf, TY, TH, TZ, Tk, T13, TM, T14; + Tc = Rp[WS(rs, 3)]; + T10 = Ip[WS(rs, 3)]; + Th = Rm[WS(rs, 2)]; + T15 = Im[WS(rs, 2)]; + { + E Td, Te, TF, TG; + Td = Rm[WS(rs, 4)]; + Te = Rm[0]; + Tf = Td + Te; + TY = KP866025403 * (Td - Te); + TF = Im[WS(rs, 4)]; + TG = Im[0]; + TH = KP866025403 * (TF - TG); + TZ = TF + TG; + } + { + E Ti, Tj, TK, TL; + Ti = Rp[WS(rs, 1)]; + Tj = Rp[WS(rs, 5)]; + Tk = Ti + Tj; + T13 = KP866025403 * (Ti - Tj); + TK = Ip[WS(rs, 5)]; + TL = Ip[WS(rs, 1)]; + TM = KP866025403 * (TK - TL); + T14 = TK + TL; + } + { + E TE, TJ, T16, T11; + TE = FNMS(KP500000000, Tf, Tc); + TI = TE + TH; + T1z = TE - TH; + TJ = FNMS(KP500000000, Tk, Th); + TN = TJ + TM; + T1A = TJ - TM; + T16 = FMA(KP500000000, T14, T15); + T17 = T13 - T16; + T1I = T13 + T16; + T11 = FMA(KP500000000, TZ, T10); + T12 = TY + T11; + T1H = T11 - TY; + { + E T1e, T1f, Tg, Tl; + T1e = T10 - TZ; + T1f = T14 - T15; + T1g = T1e + T1f; + T1S = T1e - T1f; + Tg = Tc + Tf; + Tl = Th + Tk; + Tm = Tg + Tl; + T1O = Tg - Tl; + } + } + } + { + E Tn, T1h, TP, T1p, T19, T1r, T1n, T1t; + Tn = Tb + Tm; + T1h = T1d + T1g; + { + E TD, TO, TX, T18; + TD = Tv - TC; + TO = TI - TN; + TP = TD + TO; + T1p = TD - TO; + TX = TT - TW; + T18 = T12 - T17; + T19 = TX - T18; + T1r = TX + T18; + { + E T1k, T1m, T1j, T1l; + T1k = Tb - Tm; + T1m = T1d - T1g; + T1j = W[10]; + T1l = W[11]; + T1n = FNMS(T1l, T1m, T1j * T1k); + T1t = FMA(T1l, T1k, T1j * T1m); + } + } + { + E T1a, T1i, To, TQ; + To = W[0]; + TQ = W[1]; + T1a = FMA(To, TP, TQ * T19); + T1i = FNMS(TQ, TP, To * T19); + Rp[0] = Tn - T1a; + Ip[0] = T1h + T1i; + Rm[0] = Tn + T1a; + Im[0] = T1i - T1h; + } + { + E T1s, T1u, T1o, T1q; + T1o = W[12]; + T1q = W[13]; + T1s = FMA(T1o, T1p, T1q * T1r); + T1u = FNMS(T1q, T1p, T1o * T1r); + Rp[WS(rs, 3)] = T1n - T1s; + Ip[WS(rs, 3)] = T1t + T1u; + Rm[WS(rs, 3)] = T1n + T1s; + Im[WS(rs, 3)] = T1u - T1t; + } + } + { + E T1C, T1Y, T1K, T20, T1U, T1V, T26, T27; + { + E T1y, T1B, T1G, T1J; + T1y = T1w + T1x; + T1B = T1z + T1A; + T1C = T1y - T1B; + T1Y = T1y + T1B; + T1G = T1E + T1F; + T1J = T1H - T1I; + T1K = T1G - T1J; + T20 = T1G + T1J; + } + { + E T1P, T1T, T1M, T1Q; + T1P = T1N - T1O; + T1T = T1R + T1S; + T1M = W[4]; + T1Q = W[5]; + T1U = FMA(T1M, T1P, T1Q * T1T); + T1V = FNMS(T1Q, T1P, T1M * T1T); + } + { + E T23, T25, T22, T24; + T23 = T1O + T1N; + T25 = T1R - T1S; + T22 = W[16]; + T24 = W[17]; + T26 = FMA(T22, T23, T24 * T25); + T27 = FNMS(T24, T23, T22 * T25); + } + { + E T1L, T1W, T1v, T1D; + T1v = W[2]; + T1D = W[3]; + T1L = FNMS(T1D, T1K, T1v * T1C); + T1W = FMA(T1D, T1C, T1v * T1K); + Rp[WS(rs, 1)] = T1L - T1U; + Ip[WS(rs, 1)] = T1V + T1W; + Rm[WS(rs, 1)] = T1U + T1L; + Im[WS(rs, 1)] = T1V - T1W; + } + { + E T21, T28, T1X, T1Z; + T1X = W[14]; + T1Z = W[15]; + T21 = FNMS(T1Z, T20, T1X * T1Y); + T28 = FMA(T1Z, T1Y, T1X * T20); + Rp[WS(rs, 4)] = T21 - T26; + Ip[WS(rs, 4)] = T27 + T28; + Rm[WS(rs, 4)] = T26 + T21; + Im[WS(rs, 4)] = T27 - T28; + } + } + { + E T2c, T2u, T2p, T2B, T2g, T2w, T2l, T2z; + { + E T2a, T2b, T2n, T2o; + T2a = TT + TW; + T2b = TI + TN; + T2c = T2a + T2b; + T2u = T2a - T2b; + T2n = T1w - T1x; + T2o = T1H + T1I; + T2p = T2n - T2o; + T2B = T2n + T2o; + } + { + E T2e, T2f, T2j, T2k; + T2e = Tv + TC; + T2f = T12 + T17; + T2g = T2e + T2f; + T2w = T2e - T2f; + T2j = T1E - T1F; + T2k = T1z - T1A; + T2l = T2j + T2k; + T2z = T2j - T2k; + } + { + E T2h, T2r, T2q, T2s; + { + E T29, T2d, T2i, T2m; + T29 = W[6]; + T2d = W[7]; + T2h = FNMS(T2d, T2g, T29 * T2c); + T2r = FMA(T2d, T2c, T29 * T2g); + T2i = W[8]; + T2m = W[9]; + T2q = FMA(T2i, T2l, T2m * T2p); + T2s = FNMS(T2m, T2l, T2i * T2p); + } + Rp[WS(rs, 2)] = T2h - T2q; + Ip[WS(rs, 2)] = T2r + T2s; + Rm[WS(rs, 2)] = T2h + T2q; + Im[WS(rs, 2)] = T2s - T2r; + } + { + E T2x, T2D, T2C, T2E; + { + E T2t, T2v, T2y, T2A; + T2t = W[18]; + T2v = W[19]; + T2x = FNMS(T2v, T2w, T2t * T2u); + T2D = FMA(T2v, T2u, T2t * T2w); + T2y = W[20]; + T2A = W[21]; + T2C = FMA(T2y, T2z, T2A * T2B); + T2E = FNMS(T2A, T2z, T2y * T2B); + } + Rp[WS(rs, 5)] = T2x - T2C; + Ip[WS(rs, 5)] = T2D + T2E; + Rm[WS(rs, 5)] = T2x + T2C; + Im[WS(rs, 5)] = T2E - T2D; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cbdft_12", twinstr, &GENUS, {112, 30, 30, 0} }; + +void X(codelet_hc2cbdft_12) (planner *p) { + X(khc2c_register) (p, hc2cbdft_12, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_16.c new file mode 100644 index 000000000..d23efd964 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_16.c @@ -0,0 +1,892 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:58 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hc2cbdft_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 206 FP additions, 100 FP multiplications, + * (or, 136 additions, 30 multiplications, 70 fused multiply/add), + * 66 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tf, T20, T32, T3Q, T3f, T3V, TN, T2a, T1m, T2f, T2G, T3G, T2T, T3L, T1F; + E T26, T2J, T2M, T2N, T2U, T2V, T3H, Tu, T25, T3i, T3R, T1a, T2g, T1y, T21; + E T39, T3W, T1p, T2b; + { + E T3, T1e, TA, T1C, T6, Tx, T1h, T1D, Td, T1A, TL, T1k, Ta, T1z, TG; + E T1j; + { + E T1, T2, T1f, T1g; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + T1e = T1 - T2; + { + E Ty, Tz, T4, T5; + Ty = Ip[0]; + Tz = Im[WS(rs, 7)]; + TA = Ty + Tz; + T1C = Ty - Tz; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + Tx = T4 - T5; + } + T1f = Ip[WS(rs, 4)]; + T1g = Im[WS(rs, 3)]; + T1h = T1f + T1g; + T1D = T1f - T1g; + { + E Tb, Tc, TH, TI, TJ, TK; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + TH = Tb - Tc; + TI = Im[WS(rs, 1)]; + TJ = Ip[WS(rs, 6)]; + TK = TI + TJ; + Td = Tb + Tc; + T1A = TJ - TI; + TL = TH + TK; + T1k = TH - TK; + } + { + E T8, T9, TC, TD, TE, TF; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + TC = T8 - T9; + TD = Ip[WS(rs, 2)]; + TE = Im[WS(rs, 5)]; + TF = TD + TE; + Ta = T8 + T9; + T1z = TD - TE; + TG = TC + TF; + T1j = TC - TF; + } + } + { + E T7, Te, T30, T31; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T20 = T7 - Te; + T30 = TA - Tx; + T31 = T1j - T1k; + T32 = FMA(KP707106781, T31, T30); + T3Q = FNMS(KP707106781, T31, T30); + } + { + E T3d, T3e, TB, TM; + T3d = T1e + T1h; + T3e = TG + TL; + T3f = FNMS(KP707106781, T3e, T3d); + T3V = FMA(KP707106781, T3e, T3d); + TB = Tx + TA; + TM = TG - TL; + TN = FMA(KP707106781, TM, TB); + T2a = FNMS(KP707106781, TM, TB); + } + { + E T1i, T1l, T2E, T2F; + T1i = T1e - T1h; + T1l = T1j + T1k; + T1m = FMA(KP707106781, T1l, T1i); + T2f = FNMS(KP707106781, T1l, T1i); + T2E = T3 - T6; + T2F = T1A - T1z; + T2G = T2E + T2F; + T3G = T2E - T2F; + } + { + E T2R, T2S, T1B, T1E; + T2R = Ta - Td; + T2S = T1C - T1D; + T2T = T2R + T2S; + T3L = T2S - T2R; + T1B = T1z + T1A; + T1E = T1C + T1D; + T1F = T1B + T1E; + T26 = T1E - T1B; + } + } + { + E Ti, T1s, Tl, T1t, TS, TX, T34, T33, T2I, T2H, Tp, T1v, Ts, T1w, T13; + E T18, T37, T36, T2L, T2K; + { + E TT, TR, TO, TW; + { + E Tg, Th, TP, TQ; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + TT = Tg - Th; + TP = Ip[WS(rs, 1)]; + TQ = Im[WS(rs, 6)]; + TR = TP + TQ; + T1s = TP - TQ; + } + { + E Tj, Tk, TU, TV; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + TO = Tj - Tk; + TU = Ip[WS(rs, 5)]; + TV = Im[WS(rs, 2)]; + TW = TU + TV; + T1t = TU - TV; + } + TS = TO + TR; + TX = TT - TW; + T34 = TR - TO; + T33 = TT + TW; + T2I = T1s - T1t; + T2H = Ti - Tl; + } + { + E T14, T12, TZ, T17; + { + E Tn, To, T10, T11; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T14 = Tn - To; + T10 = Im[0]; + T11 = Ip[WS(rs, 7)]; + T12 = T10 + T11; + T1v = T11 - T10; + } + { + E Tq, Tr, T15, T16; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + TZ = Tq - Tr; + T15 = Ip[WS(rs, 3)]; + T16 = Im[WS(rs, 4)]; + T17 = T15 + T16; + T1w = T15 - T16; + } + T13 = TZ - T12; + T18 = T14 - T17; + T37 = TZ + T12; + T36 = T14 + T17; + T2L = T1v - T1w; + T2K = Tp - Ts; + } + T2J = T2H - T2I; + T2M = T2K + T2L; + T2N = T2J + T2M; + T2U = T2H + T2I; + T2V = T2L - T2K; + T3H = T2V - T2U; + { + E Tm, Tt, T3g, T3h; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T25 = Tm - Tt; + T3g = FNMS(KP414213562, T33, T34); + T3h = FNMS(KP414213562, T36, T37); + T3i = T3g + T3h; + T3R = T3h - T3g; + } + { + E TY, T19, T1u, T1x; + TY = FMA(KP414213562, TX, TS); + T19 = FNMS(KP414213562, T18, T13); + T1a = TY + T19; + T2g = T19 - TY; + T1u = T1s + T1t; + T1x = T1v + T1w; + T1y = T1u + T1x; + T21 = T1x - T1u; + } + { + E T35, T38, T1n, T1o; + T35 = FMA(KP414213562, T34, T33); + T38 = FMA(KP414213562, T37, T36); + T39 = T35 - T38; + T3W = T35 + T38; + T1n = FNMS(KP414213562, TS, TX); + T1o = FMA(KP414213562, T13, T18); + T1p = T1n + T1o; + T2b = T1n - T1o; + } + } + { + E Tv, T1G, T1b, T1q, T1c, T1H, Tw, T1r, T1I, T1d; + Tv = Tf + Tu; + T1G = T1y + T1F; + T1b = FMA(KP923879532, T1a, TN); + T1q = FMA(KP923879532, T1p, T1m); + Tw = W[0]; + T1c = Tw * T1b; + T1H = Tw * T1q; + T1d = W[1]; + T1r = FMA(T1d, T1q, T1c); + T1I = FNMS(T1d, T1b, T1H); + Rp[0] = Tv - T1r; + Ip[0] = T1G + T1I; + Rm[0] = Tv + T1r; + Im[0] = T1I - T1G; + } + { + E T1N, T1J, T1L, T1M, T1V, T1Q, T1T, T1R, T1X, T1K, T1P; + T1N = T1F - T1y; + T1K = Tf - Tu; + T1J = W[14]; + T1L = T1J * T1K; + T1M = W[15]; + T1V = T1M * T1K; + T1Q = FNMS(KP923879532, T1a, TN); + T1T = FNMS(KP923879532, T1p, T1m); + T1P = W[16]; + T1R = T1P * T1Q; + T1X = T1P * T1T; + { + E T1O, T1W, T1U, T1Y, T1S; + T1O = FNMS(T1M, T1N, T1L); + T1W = FMA(T1J, T1N, T1V); + T1S = W[17]; + T1U = FMA(T1S, T1T, T1R); + T1Y = FNMS(T1S, T1Q, T1X); + Rp[WS(rs, 4)] = T1O - T1U; + Ip[WS(rs, 4)] = T1W + T1Y; + Rm[WS(rs, 4)] = T1O + T1U; + Im[WS(rs, 4)] = T1Y - T1W; + } + } + { + E T2r, T2n, T2p, T2q, T2z, T2u, T2x, T2v, T2B, T2o, T2t; + T2r = T26 - T25; + T2o = T20 - T21; + T2n = W[22]; + T2p = T2n * T2o; + T2q = W[23]; + T2z = T2q * T2o; + T2u = FNMS(KP923879532, T2b, T2a); + T2x = FNMS(KP923879532, T2g, T2f); + T2t = W[24]; + T2v = T2t * T2u; + T2B = T2t * T2x; + { + E T2s, T2A, T2y, T2C, T2w; + T2s = FNMS(T2q, T2r, T2p); + T2A = FMA(T2n, T2r, T2z); + T2w = W[25]; + T2y = FMA(T2w, T2x, T2v); + T2C = FNMS(T2w, T2u, T2B); + Rp[WS(rs, 6)] = T2s - T2y; + Ip[WS(rs, 6)] = T2A + T2C; + Rm[WS(rs, 6)] = T2s + T2y; + Im[WS(rs, 6)] = T2C - T2A; + } + } + { + E T27, T1Z, T23, T24, T2j, T2c, T2h, T2d, T2l, T22, T29; + T27 = T25 + T26; + T22 = T20 + T21; + T1Z = W[6]; + T23 = T1Z * T22; + T24 = W[7]; + T2j = T24 * T22; + T2c = FMA(KP923879532, T2b, T2a); + T2h = FMA(KP923879532, T2g, T2f); + T29 = W[8]; + T2d = T29 * T2c; + T2l = T29 * T2h; + { + E T28, T2k, T2i, T2m, T2e; + T28 = FNMS(T24, T27, T23); + T2k = FMA(T1Z, T27, T2j); + T2e = W[9]; + T2i = FMA(T2e, T2h, T2d); + T2m = FNMS(T2e, T2c, T2l); + Rp[WS(rs, 2)] = T28 - T2i; + Ip[WS(rs, 2)] = T2k + T2m; + Rm[WS(rs, 2)] = T28 + T2i; + Im[WS(rs, 2)] = T2m - T2k; + } + } + { + E T3N, T47, T43, T45, T46, T4f, T3F, T3J, T3K, T3Z, T3S, T3X, T3T, T41, T4a; + E T4d, T4b, T4h; + { + E T3M, T44, T3I, T3P, T49; + T3M = T2J - T2M; + T3N = FMA(KP707106781, T3M, T3L); + T47 = FNMS(KP707106781, T3M, T3L); + T44 = FNMS(KP707106781, T3H, T3G); + T43 = W[26]; + T45 = T43 * T44; + T46 = W[27]; + T4f = T46 * T44; + T3I = FMA(KP707106781, T3H, T3G); + T3F = W[10]; + T3J = T3F * T3I; + T3K = W[11]; + T3Z = T3K * T3I; + T3S = FMA(KP923879532, T3R, T3Q); + T3X = FNMS(KP923879532, T3W, T3V); + T3P = W[12]; + T3T = T3P * T3S; + T41 = T3P * T3X; + T4a = FNMS(KP923879532, T3R, T3Q); + T4d = FMA(KP923879532, T3W, T3V); + T49 = W[28]; + T4b = T49 * T4a; + T4h = T49 * T4d; + } + { + E T3O, T40, T3Y, T42, T3U; + T3O = FNMS(T3K, T3N, T3J); + T40 = FMA(T3F, T3N, T3Z); + T3U = W[13]; + T3Y = FMA(T3U, T3X, T3T); + T42 = FNMS(T3U, T3S, T41); + Rp[WS(rs, 3)] = T3O - T3Y; + Ip[WS(rs, 3)] = T40 + T42; + Rm[WS(rs, 3)] = T3O + T3Y; + Im[WS(rs, 3)] = T42 - T40; + } + { + E T48, T4g, T4e, T4i, T4c; + T48 = FNMS(T46, T47, T45); + T4g = FMA(T43, T47, T4f); + T4c = W[29]; + T4e = FMA(T4c, T4d, T4b); + T4i = FNMS(T4c, T4a, T4h); + Rp[WS(rs, 7)] = T48 - T4e; + Ip[WS(rs, 7)] = T4g + T4i; + Rm[WS(rs, 7)] = T48 + T4e; + Im[WS(rs, 7)] = T4i - T4g; + } + } + { + E T2X, T3t, T3p, T3r, T3s, T3B, T2D, T2P, T2Q, T3l, T3a, T3j, T3b, T3n, T3w; + E T3z, T3x, T3D; + { + E T2W, T3q, T2O, T2Z, T3v; + T2W = T2U + T2V; + T2X = FMA(KP707106781, T2W, T2T); + T3t = FNMS(KP707106781, T2W, T2T); + T3q = FNMS(KP707106781, T2N, T2G); + T3p = W[18]; + T3r = T3p * T3q; + T3s = W[19]; + T3B = T3s * T3q; + T2O = FMA(KP707106781, T2N, T2G); + T2D = W[2]; + T2P = T2D * T2O; + T2Q = W[3]; + T3l = T2Q * T2O; + T3a = FMA(KP923879532, T39, T32); + T3j = FNMS(KP923879532, T3i, T3f); + T2Z = W[4]; + T3b = T2Z * T3a; + T3n = T2Z * T3j; + T3w = FNMS(KP923879532, T39, T32); + T3z = FMA(KP923879532, T3i, T3f); + T3v = W[20]; + T3x = T3v * T3w; + T3D = T3v * T3z; + } + { + E T2Y, T3m, T3k, T3o, T3c; + T2Y = FNMS(T2Q, T2X, T2P); + T3m = FMA(T2D, T2X, T3l); + T3c = W[5]; + T3k = FMA(T3c, T3j, T3b); + T3o = FNMS(T3c, T3a, T3n); + Rp[WS(rs, 1)] = T2Y - T3k; + Ip[WS(rs, 1)] = T3m + T3o; + Rm[WS(rs, 1)] = T2Y + T3k; + Im[WS(rs, 1)] = T3o - T3m; + } + { + E T3u, T3C, T3A, T3E, T3y; + T3u = FNMS(T3s, T3t, T3r); + T3C = FMA(T3p, T3t, T3B); + T3y = W[21]; + T3A = FMA(T3y, T3z, T3x); + T3E = FNMS(T3y, T3w, T3D); + Rp[WS(rs, 5)] = T3u - T3A; + Ip[WS(rs, 5)] = T3C + T3E; + Rm[WS(rs, 5)] = T3u + T3A; + Im[WS(rs, 5)] = T3E - T3C; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cbdft_16", twinstr, &GENUS, {136, 30, 70, 0} }; + +void X(codelet_hc2cbdft_16) (planner *p) { + X(khc2c_register) (p, hc2cbdft_16, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -dif -name hc2cbdft_16 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 206 FP additions, 84 FP multiplications, + * (or, 168 additions, 46 multiplications, 38 fused multiply/add), + * 60 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E TB, T2L, T30, T1n, Tf, T1U, T2H, T3p, T1E, T1Z, TM, T31, T2s, T3k, T1i; + E T2M, Tu, T1Y, T2Q, T2X, T2T, T2Y, TY, T1d, T19, T1e, T2v, T2C, T2y, T2D; + E T1x, T1V; + { + E T3, T1j, TA, T1B, T6, Tx, T1m, T1C, Ta, TC, TF, T1y, Td, TH, TK; + E T1z; + { + E T1, T2, Ty, Tz; + T1 = Rp[0]; + T2 = Rm[WS(rs, 7)]; + T3 = T1 + T2; + T1j = T1 - T2; + Ty = Ip[0]; + Tz = Im[WS(rs, 7)]; + TA = Ty + Tz; + T1B = Ty - Tz; + } + { + E T4, T5, T1k, T1l; + T4 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 3)]; + T6 = T4 + T5; + Tx = T4 - T5; + T1k = Ip[WS(rs, 4)]; + T1l = Im[WS(rs, 3)]; + T1m = T1k + T1l; + T1C = T1k - T1l; + } + { + E T8, T9, TD, TE; + T8 = Rp[WS(rs, 2)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + TC = T8 - T9; + TD = Ip[WS(rs, 2)]; + TE = Im[WS(rs, 5)]; + TF = TD + TE; + T1y = TD - TE; + } + { + E Tb, Tc, TI, TJ; + Tb = Rm[WS(rs, 1)]; + Tc = Rp[WS(rs, 6)]; + Td = Tb + Tc; + TH = Tb - Tc; + TI = Im[WS(rs, 1)]; + TJ = Ip[WS(rs, 6)]; + TK = TI + TJ; + T1z = TJ - TI; + } + { + E T7, Te, TG, TL; + TB = Tx + TA; + T2L = TA - Tx; + T30 = T1j + T1m; + T1n = T1j - T1m; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T1U = T7 - Te; + { + E T2F, T2G, T1A, T1D; + T2F = Ta - Td; + T2G = T1B - T1C; + T2H = T2F + T2G; + T3p = T2G - T2F; + T1A = T1y + T1z; + T1D = T1B + T1C; + T1E = T1A + T1D; + T1Z = T1D - T1A; + } + TG = TC + TF; + TL = TH + TK; + TM = KP707106781 * (TG - TL); + T31 = KP707106781 * (TG + TL); + { + E T2q, T2r, T1g, T1h; + T2q = T3 - T6; + T2r = T1z - T1y; + T2s = T2q + T2r; + T3k = T2q - T2r; + T1g = TC - TF; + T1h = TH - TK; + T1i = KP707106781 * (T1g + T1h); + T2M = KP707106781 * (T1g - T1h); + } + } + } + { + E Ti, TT, TR, T1r, Tl, TO, TW, T1s, Tp, T14, T12, T1u, Ts, TZ, T17; + E T1v; + { + E Tg, Th, TP, TQ; + Tg = Rp[WS(rs, 1)]; + Th = Rm[WS(rs, 6)]; + Ti = Tg + Th; + TT = Tg - Th; + TP = Ip[WS(rs, 1)]; + TQ = Im[WS(rs, 6)]; + TR = TP + TQ; + T1r = TP - TQ; + } + { + E Tj, Tk, TU, TV; + Tj = Rp[WS(rs, 5)]; + Tk = Rm[WS(rs, 2)]; + Tl = Tj + Tk; + TO = Tj - Tk; + TU = Ip[WS(rs, 5)]; + TV = Im[WS(rs, 2)]; + TW = TU + TV; + T1s = TU - TV; + } + { + E Tn, To, T10, T11; + Tn = Rm[0]; + To = Rp[WS(rs, 7)]; + Tp = Tn + To; + T14 = Tn - To; + T10 = Im[0]; + T11 = Ip[WS(rs, 7)]; + T12 = T10 + T11; + T1u = T11 - T10; + } + { + E Tq, Tr, T15, T16; + Tq = Rp[WS(rs, 3)]; + Tr = Rm[WS(rs, 4)]; + Ts = Tq + Tr; + TZ = Tq - Tr; + T15 = Ip[WS(rs, 3)]; + T16 = Im[WS(rs, 4)]; + T17 = T15 + T16; + T1v = T15 - T16; + } + { + E Tm, Tt, T2O, T2P; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T1Y = Tm - Tt; + T2O = TR - TO; + T2P = TT + TW; + T2Q = FMA(KP382683432, T2O, KP923879532 * T2P); + T2X = FNMS(KP923879532, T2O, KP382683432 * T2P); + } + { + E T2R, T2S, TS, TX; + T2R = TZ + T12; + T2S = T14 + T17; + T2T = FMA(KP382683432, T2R, KP923879532 * T2S); + T2Y = FNMS(KP923879532, T2R, KP382683432 * T2S); + TS = TO + TR; + TX = TT - TW; + TY = FMA(KP923879532, TS, KP382683432 * TX); + T1d = FNMS(KP382683432, TS, KP923879532 * TX); + } + { + E T13, T18, T2t, T2u; + T13 = TZ - T12; + T18 = T14 - T17; + T19 = FNMS(KP382683432, T18, KP923879532 * T13); + T1e = FMA(KP382683432, T13, KP923879532 * T18); + T2t = Ti - Tl; + T2u = T1r - T1s; + T2v = T2t - T2u; + T2C = T2t + T2u; + } + { + E T2w, T2x, T1t, T1w; + T2w = Tp - Ts; + T2x = T1u - T1v; + T2y = T2w + T2x; + T2D = T2x - T2w; + T1t = T1r + T1s; + T1w = T1u + T1v; + T1x = T1t + T1w; + T1V = T1w - T1t; + } + } + { + E Tv, T1F, T1b, T1N, T1p, T1P, T1L, T1R; + Tv = Tf + Tu; + T1F = T1x + T1E; + { + E TN, T1a, T1f, T1o; + TN = TB + TM; + T1a = TY + T19; + T1b = TN + T1a; + T1N = TN - T1a; + T1f = T1d + T1e; + T1o = T1i + T1n; + T1p = T1f + T1o; + T1P = T1o - T1f; + { + E T1I, T1K, T1H, T1J; + T1I = Tf - Tu; + T1K = T1E - T1x; + T1H = W[14]; + T1J = W[15]; + T1L = FNMS(T1J, T1K, T1H * T1I); + T1R = FMA(T1J, T1I, T1H * T1K); + } + } + { + E T1q, T1G, Tw, T1c; + Tw = W[0]; + T1c = W[1]; + T1q = FMA(Tw, T1b, T1c * T1p); + T1G = FNMS(T1c, T1b, Tw * T1p); + Rp[0] = Tv - T1q; + Ip[0] = T1F + T1G; + Rm[0] = Tv + T1q; + Im[0] = T1G - T1F; + } + { + E T1Q, T1S, T1M, T1O; + T1M = W[16]; + T1O = W[17]; + T1Q = FMA(T1M, T1N, T1O * T1P); + T1S = FNMS(T1O, T1N, T1M * T1P); + Rp[WS(rs, 4)] = T1L - T1Q; + Ip[WS(rs, 4)] = T1R + T1S; + Rm[WS(rs, 4)] = T1L + T1Q; + Im[WS(rs, 4)] = T1S - T1R; + } + } + { + E T25, T2j, T29, T2l, T21, T2b, T2h, T2n; + { + E T23, T24, T27, T28; + T23 = TB - TM; + T24 = T1d - T1e; + T25 = T23 + T24; + T2j = T23 - T24; + T27 = T19 - TY; + T28 = T1n - T1i; + T29 = T27 + T28; + T2l = T28 - T27; + } + { + E T1W, T20, T1T, T1X; + T1W = T1U + T1V; + T20 = T1Y + T1Z; + T1T = W[6]; + T1X = W[7]; + T21 = FNMS(T1X, T20, T1T * T1W); + T2b = FMA(T1X, T1W, T1T * T20); + } + { + E T2e, T2g, T2d, T2f; + T2e = T1U - T1V; + T2g = T1Z - T1Y; + T2d = W[22]; + T2f = W[23]; + T2h = FNMS(T2f, T2g, T2d * T2e); + T2n = FMA(T2f, T2e, T2d * T2g); + } + { + E T2a, T2c, T22, T26; + T22 = W[8]; + T26 = W[9]; + T2a = FMA(T22, T25, T26 * T29); + T2c = FNMS(T26, T25, T22 * T29); + Rp[WS(rs, 2)] = T21 - T2a; + Ip[WS(rs, 2)] = T2b + T2c; + Rm[WS(rs, 2)] = T21 + T2a; + Im[WS(rs, 2)] = T2c - T2b; + } + { + E T2m, T2o, T2i, T2k; + T2i = W[24]; + T2k = W[25]; + T2m = FMA(T2i, T2j, T2k * T2l); + T2o = FNMS(T2k, T2j, T2i * T2l); + Rp[WS(rs, 6)] = T2h - T2m; + Ip[WS(rs, 6)] = T2n + T2o; + Rm[WS(rs, 6)] = T2h + T2m; + Im[WS(rs, 6)] = T2o - T2n; + } + } + { + E T2A, T38, T2I, T3a, T2V, T3d, T33, T3f, T2z, T2E; + T2z = KP707106781 * (T2v + T2y); + T2A = T2s + T2z; + T38 = T2s - T2z; + T2E = KP707106781 * (T2C + T2D); + T2I = T2E + T2H; + T3a = T2H - T2E; + { + E T2N, T2U, T2Z, T32; + T2N = T2L + T2M; + T2U = T2Q - T2T; + T2V = T2N + T2U; + T3d = T2N - T2U; + T2Z = T2X + T2Y; + T32 = T30 - T31; + T33 = T2Z + T32; + T3f = T32 - T2Z; + } + { + E T2J, T35, T34, T36; + { + E T2p, T2B, T2K, T2W; + T2p = W[2]; + T2B = W[3]; + T2J = FNMS(T2B, T2I, T2p * T2A); + T35 = FMA(T2B, T2A, T2p * T2I); + T2K = W[4]; + T2W = W[5]; + T34 = FMA(T2K, T2V, T2W * T33); + T36 = FNMS(T2W, T2V, T2K * T33); + } + Rp[WS(rs, 1)] = T2J - T34; + Ip[WS(rs, 1)] = T35 + T36; + Rm[WS(rs, 1)] = T2J + T34; + Im[WS(rs, 1)] = T36 - T35; + } + { + E T3b, T3h, T3g, T3i; + { + E T37, T39, T3c, T3e; + T37 = W[18]; + T39 = W[19]; + T3b = FNMS(T39, T3a, T37 * T38); + T3h = FMA(T39, T38, T37 * T3a); + T3c = W[20]; + T3e = W[21]; + T3g = FMA(T3c, T3d, T3e * T3f); + T3i = FNMS(T3e, T3d, T3c * T3f); + } + Rp[WS(rs, 5)] = T3b - T3g; + Ip[WS(rs, 5)] = T3h + T3i; + Rm[WS(rs, 5)] = T3b + T3g; + Im[WS(rs, 5)] = T3i - T3h; + } + } + { + E T3m, T3E, T3q, T3G, T3v, T3J, T3z, T3L, T3l, T3o; + T3l = KP707106781 * (T2D - T2C); + T3m = T3k + T3l; + T3E = T3k - T3l; + T3o = KP707106781 * (T2v - T2y); + T3q = T3o + T3p; + T3G = T3p - T3o; + { + E T3t, T3u, T3x, T3y; + T3t = T2L - T2M; + T3u = T2X - T2Y; + T3v = T3t + T3u; + T3J = T3t - T3u; + T3x = T31 + T30; + T3y = T2Q + T2T; + T3z = T3x - T3y; + T3L = T3y + T3x; + } + { + E T3r, T3B, T3A, T3C; + { + E T3j, T3n, T3s, T3w; + T3j = W[10]; + T3n = W[11]; + T3r = FNMS(T3n, T3q, T3j * T3m); + T3B = FMA(T3n, T3m, T3j * T3q); + T3s = W[12]; + T3w = W[13]; + T3A = FMA(T3s, T3v, T3w * T3z); + T3C = FNMS(T3w, T3v, T3s * T3z); + } + Rp[WS(rs, 3)] = T3r - T3A; + Ip[WS(rs, 3)] = T3B + T3C; + Rm[WS(rs, 3)] = T3r + T3A; + Im[WS(rs, 3)] = T3C - T3B; + } + { + E T3H, T3N, T3M, T3O; + { + E T3D, T3F, T3I, T3K; + T3D = W[26]; + T3F = W[27]; + T3H = FNMS(T3F, T3G, T3D * T3E); + T3N = FMA(T3F, T3E, T3D * T3G); + T3I = W[28]; + T3K = W[29]; + T3M = FMA(T3I, T3J, T3K * T3L); + T3O = FNMS(T3K, T3J, T3I * T3L); + } + Rp[WS(rs, 7)] = T3H - T3M; + Ip[WS(rs, 7)] = T3N + T3O; + Rm[WS(rs, 7)] = T3H + T3M; + Im[WS(rs, 7)] = T3O - T3N; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cbdft_16", twinstr, &GENUS, {168, 46, 38, 0} }; + +void X(codelet_hc2cbdft_16) (planner *p) { + X(khc2c_register) (p, hc2cbdft_16, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_2.c new file mode 100644 index 000000000..06e6a63d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_2.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:57 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -dif -name hc2cbdft_2 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 10 FP additions, 4 FP multiplications, + * (or, 8 additions, 2 multiplications, 2 fused multiply/add), + * 15 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T3, Ta, Tc, T9, Td, T4, T8, Tb, Te; + { + E T1, T2, T5, T6, T7; + T1 = Ip[0]; + T2 = Im[0]; + T3 = T1 - T2; + Ta = T1 + T2; + T5 = Rp[0]; + T6 = Rm[0]; + T7 = T5 - T6; + Tc = T5 + T6; + T9 = W[1]; + Td = T9 * T7; + T4 = W[0]; + T8 = T4 * T7; + } + Tb = FNMS(T9, Ta, T8); + Ip[0] = T3 + Tb; + Im[0] = Tb - T3; + Te = FMA(T4, Ta, Td); + Rp[0] = Tc - Te; + Rm[0] = Tc + Te; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cbdft_2", twinstr, &GENUS, {8, 2, 2, 0} }; + +void X(codelet_hc2cbdft_2) (planner *p) { + X(khc2c_register) (p, hc2cbdft_2, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -dif -name hc2cbdft_2 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 10 FP additions, 4 FP multiplications, + * (or, 8 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T3, T9, T7, Tb; + { + E T1, T2, T5, T6; + T1 = Ip[0]; + T2 = Im[0]; + T3 = T1 - T2; + T9 = T1 + T2; + T5 = Rp[0]; + T6 = Rm[0]; + T7 = T5 - T6; + Tb = T5 + T6; + } + { + E Ta, Tc, T4, T8; + T4 = W[0]; + T8 = W[1]; + Ta = FNMS(T8, T9, T4 * T7); + Tc = FMA(T8, T7, T4 * T9); + Ip[0] = T3 + Ta; + Rp[0] = Tb - Tc; + Im[0] = Ta - T3; + Rm[0] = Tb + Tc; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cbdft_2", twinstr, &GENUS, {8, 2, 2, 0} }; + +void X(codelet_hc2cbdft_2) (planner *p) { + X(khc2c_register) (p, hc2cbdft_2, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_20.c new file mode 100644 index 000000000..c7c4ced51 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_20.c @@ -0,0 +1,1149 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:59 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hc2cbdft_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 286 FP additions, 148 FP multiplications, + * (or, 176 additions, 38 multiplications, 110 fused multiply/add), + * 104 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T27, T2o, T3T, T41, T2p, T40, T1N, T2Q, T1w, T2L, T4n, T59, T4A, T5e, T24; + E T2m, T2h, T2Z, T3P, T4J, T3W, T3Y, T7, TC, T2c, T2d, T3y, T3F, T3G, T3H; + E T46, T4d, T4e, T4f, T4r, T4u, T4v, T4w, T1E, T1H, T1I, T1J, TJ, T16, T17; + E T18; + { + E T3, T1A, TI, T25, T6, TF, T1D, T26, Te, T47, T4k, TO, T1e, T3z, T3M; + E T1S, Tt, T4a, T4h, TZ, T1p, T3C, T3J, T1Z, TA, T4b, T4i, T14, T1u, T3D; + E T3K, T22, Tl, T48, T4l, TT, T1j, T3A, T3N, T1V; + { + E T1, T2, TG, TH; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T1A = T1 - T2; + TG = Ip[0]; + TH = Im[WS(rs, 9)]; + TI = TG + TH; + T25 = TG - TH; + } + { + E T4, T5, T1B, T1C; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + TF = T4 - T5; + T1B = Ip[WS(rs, 5)]; + T1C = Im[WS(rs, 4)]; + T1D = T1B + T1C; + T26 = T1B - T1C; + } + { + E Ta, T1a, TN, T1Q, Td, TK, T1d, T1R; + { + E T8, T9, TL, TM; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T1a = T8 - T9; + TL = Ip[WS(rs, 4)]; + TM = Im[WS(rs, 5)]; + TN = TL + TM; + T1Q = TL - TM; + } + { + E Tb, Tc, T1b, T1c; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + TK = Tb - Tc; + T1b = Ip[WS(rs, 9)]; + T1c = Im[0]; + T1d = T1b + T1c; + T1R = T1b - T1c; + } + Te = Ta + Td; + T47 = TN - TK; + T4k = T1a + T1d; + TO = TK + TN; + T1e = T1a - T1d; + T3z = Ta - Td; + T3M = T1Q - T1R; + T1S = T1Q + T1R; + } + { + E Tp, T1l, TY, T1X, Ts, TV, T1o, T1Y; + { + E Tn, To, TW, TX; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T1l = Tn - To; + TW = Ip[WS(rs, 8)]; + TX = Im[WS(rs, 1)]; + TY = TW + TX; + T1X = TW - TX; + } + { + E Tq, Tr, T1m, T1n; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + TV = Tq - Tr; + T1m = Im[WS(rs, 6)]; + T1n = Ip[WS(rs, 3)]; + T1o = T1m + T1n; + T1Y = T1n - T1m; + } + Tt = Tp + Ts; + T4a = TY - TV; + T4h = T1l - T1o; + TZ = TV + TY; + T1p = T1l + T1o; + T3C = Tp - Ts; + T3J = T1X - T1Y; + T1Z = T1X + T1Y; + } + { + E Tw, T1q, T13, T20, Tz, T10, T1t, T21; + { + E Tu, Tv, T11, T12; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T1q = Tu - Tv; + T11 = Im[WS(rs, 7)]; + T12 = Ip[WS(rs, 2)]; + T13 = T11 + T12; + T20 = T12 - T11; + } + { + E Tx, Ty, T1r, T1s; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + T10 = Tx - Ty; + T1r = Im[WS(rs, 2)]; + T1s = Ip[WS(rs, 7)]; + T1t = T1r + T1s; + T21 = T1s - T1r; + } + TA = Tw + Tz; + T4b = T10 + T13; + T4i = T1q - T1t; + T14 = T10 - T13; + T1u = T1q + T1t; + T3D = Tw - Tz; + T3K = T20 - T21; + T22 = T20 + T21; + } + { + E Th, T1f, TS, T1T, Tk, TP, T1i, T1U; + { + E Tf, Tg, TQ, TR; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T1f = Tf - Tg; + TQ = Im[WS(rs, 3)]; + TR = Ip[WS(rs, 6)]; + TS = TQ + TR; + T1T = TR - TQ; + } + { + E Ti, Tj, T1g, T1h; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + TP = Ti - Tj; + T1g = Ip[WS(rs, 1)]; + T1h = Im[WS(rs, 8)]; + T1i = T1g + T1h; + T1U = T1g - T1h; + } + Tl = Th + Tk; + T48 = TP + TS; + T4l = T1f + T1i; + TT = TP - TS; + T1j = T1f - T1i; + T3A = Th - Tk; + T3N = T1T - T1U; + T1V = T1T + T1U; + } + T27 = T25 + T26; + T2o = Tt - TA; + T3T = T25 - T26; + T41 = T3z - T3A; + T2p = Te - Tl; + { + E T1L, T1M, T1k, T1v; + T40 = T3C - T3D; + T1L = TO - TT; + T1M = TZ - T14; + T1N = FMA(KP618033988, T1M, T1L); + T2Q = FNMS(KP618033988, T1L, T1M); + T1k = T1e - T1j; + T1v = T1p - T1u; + T1w = FMA(KP618033988, T1v, T1k); + T2L = FNMS(KP618033988, T1k, T1v); + { + E T4j, T4m, T4y, T4z; + T4j = T4h - T4i; + T4m = T4k - T4l; + T4n = FNMS(KP618033988, T4m, T4j); + T59 = FMA(KP618033988, T4j, T4m); + T4y = T4a + T4b; + T4z = T47 + T48; + T4A = FNMS(KP618033988, T4z, T4y); + T5e = FMA(KP618033988, T4y, T4z); + } + } + { + E T3L, T3O, T4s, T4t; + { + E T1W, T23, T2f, T2g; + T1W = T1S + T1V; + T23 = T1Z + T22; + T24 = T1W + T23; + T2m = T1W - T23; + T2f = T1Z - T22; + T2g = T1S - T1V; + T2h = FNMS(KP618033988, T2g, T2f); + T2Z = FMA(KP618033988, T2f, T2g); + } + T3L = T3J - T3K; + T3O = T3M - T3N; + T3P = FNMS(KP618033988, T3O, T3L); + T4J = FMA(KP618033988, T3L, T3O); + { + E T3U, T3V, Tm, TB; + T3U = T3M + T3N; + T3V = T3J + T3K; + T3W = T3U + T3V; + T3Y = T3U - T3V; + T7 = T3 + T6; + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T2c = FNMS(KP250000000, TC, T7); + T2d = Tm - TB; + } + { + E T3B, T3E, T49, T4c; + T3y = T3 - T6; + T3B = T3z + T3A; + T3E = T3C + T3D; + T3F = T3B + T3E; + T3G = FNMS(KP250000000, T3F, T3y); + T3H = T3B - T3E; + T46 = TI - TF; + T49 = T47 - T48; + T4c = T4a - T4b; + T4d = T49 + T4c; + T4e = FNMS(KP250000000, T4d, T46); + T4f = T49 - T4c; + } + T4r = T1A + T1D; + T4s = T4k + T4l; + T4t = T4h + T4i; + T4u = T4s + T4t; + T4v = FNMS(KP250000000, T4u, T4r); + T4w = T4s - T4t; + { + E T1F, T1G, TU, T15; + T1E = T1A - T1D; + T1F = T1e + T1j; + T1G = T1p + T1u; + T1H = T1F + T1G; + T1I = FNMS(KP250000000, T1H, T1E); + T1J = T1F - T1G; + TJ = TF + TI; + TU = TO + TT; + T15 = TZ + T14; + T16 = TU + T15; + T17 = FNMS(KP250000000, T16, TJ); + T18 = TU - T15; + } + } + } + { + E TD, T28, T3o, T3r, T3p, T3v, T2r, T3l, T2H, T35, T2b, T2j, T2k, T2z, T2D; + E T2F, T2G, T2T, T2X, T31, T32, T3d, T3h, T3j, T3k, T3t, T1x, T2u, T1O, T2x; + E T1y, T29, T2v, T2B, T2M, T38, T2R, T3b, T2N, T2V, T39, T3f, T3n, T1P, T2a; + E T1z; + TD = T7 + TC; + T28 = T24 + T27; + T3o = TJ + T16; + T3r = T1H + T1E; + T3n = W[8]; + T3p = T3n * T3o; + T3v = T3n * T3r; + { + E T2q, T34, T2n, T33, T2l; + T2q = FNMS(KP618033988, T2p, T2o); + T34 = FMA(KP618033988, T2o, T2p); + T2l = FNMS(KP250000000, T24, T27); + T2n = FNMS(KP559016994, T2m, T2l); + T33 = FMA(KP559016994, T2m, T2l); + T2r = FMA(KP951056516, T2q, T2n); + T3l = FNMS(KP951056516, T34, T33); + T2H = FNMS(KP951056516, T2q, T2n); + T35 = FMA(KP951056516, T34, T33); + } + { + E T2i, T2E, T2e, T30, T3i, T2Y; + T2e = FNMS(KP559016994, T2d, T2c); + T2i = FNMS(KP951056516, T2h, T2e); + T2E = FMA(KP951056516, T2h, T2e); + T2b = W[14]; + T2j = T2b * T2i; + T2k = W[15]; + T2z = T2k * T2i; + T2D = W[22]; + T2F = T2D * T2E; + T2G = W[23]; + T2T = T2G * T2E; + T2Y = FMA(KP559016994, T2d, T2c); + T30 = FNMS(KP951056516, T2Z, T2Y); + T3i = FMA(KP951056516, T2Z, T2Y); + T2X = W[30]; + T31 = T2X * T30; + T32 = W[31]; + T3d = T32 * T30; + T3h = W[6]; + T3j = T3h * T3i; + T3k = W[7]; + T3t = T3k * T3i; + } + { + E T19, T1K, TE, T2t; + T19 = FMA(KP559016994, T18, T17); + T1x = FMA(KP951056516, T1w, T19); + T2u = FNMS(KP951056516, T1w, T19); + T1K = FMA(KP559016994, T1J, T1I); + T1O = FNMS(KP951056516, T1N, T1K); + T2x = FMA(KP951056516, T1N, T1K); + TE = W[0]; + T1y = TE * T1x; + T29 = TE * T1O; + T2t = W[16]; + T2v = T2t * T2u; + T2B = T2t * T2x; + } + { + E T2K, T2P, T2J, T37; + T2K = FNMS(KP559016994, T18, T17); + T2M = FMA(KP951056516, T2L, T2K); + T38 = FNMS(KP951056516, T2L, T2K); + T2P = FNMS(KP559016994, T1J, T1I); + T2R = FNMS(KP951056516, T2Q, T2P); + T3b = FMA(KP951056516, T2Q, T2P); + T2J = W[24]; + T2N = T2J * T2M; + T2V = T2J * T2R; + T37 = W[32]; + T39 = T37 * T38; + T3f = T37 * T3b; + } + T1z = W[1]; + T1P = FMA(T1z, T1O, T1y); + T2a = FNMS(T1z, T1x, T29); + Rp[0] = TD - T1P; + Ip[0] = T28 + T2a; + Rm[0] = TD + T1P; + Im[0] = T2a - T28; + { + E T3m, T3u, T3s, T3w, T3q; + T3m = FNMS(T3k, T3l, T3j); + T3u = FMA(T3h, T3l, T3t); + T3q = W[9]; + T3s = FMA(T3q, T3r, T3p); + T3w = FNMS(T3q, T3o, T3v); + Rp[WS(rs, 2)] = T3m - T3s; + Ip[WS(rs, 2)] = T3u + T3w; + Rm[WS(rs, 2)] = T3m + T3s; + Im[WS(rs, 2)] = T3w - T3u; + } + { + E T2s, T2A, T2y, T2C, T2w; + T2s = FNMS(T2k, T2r, T2j); + T2A = FMA(T2b, T2r, T2z); + T2w = W[17]; + T2y = FMA(T2w, T2x, T2v); + T2C = FNMS(T2w, T2u, T2B); + Rp[WS(rs, 4)] = T2s - T2y; + Ip[WS(rs, 4)] = T2A + T2C; + Rm[WS(rs, 4)] = T2s + T2y; + Im[WS(rs, 4)] = T2C - T2A; + } + { + E T2I, T2U, T2S, T2W, T2O; + T2I = FNMS(T2G, T2H, T2F); + T2U = FMA(T2D, T2H, T2T); + T2O = W[25]; + T2S = FMA(T2O, T2R, T2N); + T2W = FNMS(T2O, T2M, T2V); + Rp[WS(rs, 6)] = T2I - T2S; + Ip[WS(rs, 6)] = T2U + T2W; + Rm[WS(rs, 6)] = T2I + T2S; + Im[WS(rs, 6)] = T2W - T2U; + } + { + E T36, T3e, T3c, T3g, T3a; + T36 = FNMS(T32, T35, T31); + T3e = FMA(T2X, T35, T3d); + T3a = W[33]; + T3c = FMA(T3a, T3b, T39); + T3g = FNMS(T3a, T38, T3f); + Rp[WS(rs, 8)] = T36 - T3c; + Ip[WS(rs, 8)] = T3e + T3g; + Rm[WS(rs, 8)] = T36 + T3c; + Im[WS(rs, 8)] = T3g - T3e; + } + } + { + E T55, T51, T53, T54, T5h, T5I, T5L, T5J, T5P, T43, T5F, T4P, T5p, T3x, T3R; + E T3S, T4D, T5l, T5n, T5o, T5x, T4H, T4L, T4M, T4X, T5B, T5D, T5E, T5N, T4o; + E T4S, T4B, T4V, T4p, T4F, T4T, T4Z, T5a, T5s, T5f, T5v, T5b, T5j, T5t, T5z; + E T52, T5H; + T55 = T3W + T3T; + T52 = T3y + T3F; + T51 = W[18]; + T53 = T51 * T52; + T54 = W[19]; + T5h = T54 * T52; + T5I = T46 + T4d; + T5L = T4u + T4r; + T5H = W[28]; + T5J = T5H * T5I; + T5P = T5H * T5L; + { + E T42, T4O, T3Z, T4N, T3X; + T42 = FNMS(KP618033988, T41, T40); + T4O = FMA(KP618033988, T40, T41); + T3X = FNMS(KP250000000, T3W, T3T); + T3Z = FNMS(KP559016994, T3Y, T3X); + T4N = FMA(KP559016994, T3Y, T3X); + T43 = FNMS(KP951056516, T42, T3Z); + T5F = FNMS(KP951056516, T4O, T4N); + T4P = FMA(KP951056516, T4O, T4N); + T5p = FMA(KP951056516, T42, T3Z); + } + { + E T3Q, T5m, T3I, T4K, T5C, T4I; + T3I = FNMS(KP559016994, T3H, T3G); + T3Q = FMA(KP951056516, T3P, T3I); + T5m = FNMS(KP951056516, T3P, T3I); + T3x = W[2]; + T3R = T3x * T3Q; + T3S = W[3]; + T4D = T3S * T3Q; + T5l = W[34]; + T5n = T5l * T5m; + T5o = W[35]; + T5x = T5o * T5m; + T4I = FMA(KP559016994, T3H, T3G); + T4K = FNMS(KP951056516, T4J, T4I); + T5C = FMA(KP951056516, T4J, T4I); + T4H = W[10]; + T4L = T4H * T4K; + T4M = W[11]; + T4X = T4M * T4K; + T5B = W[26]; + T5D = T5B * T5C; + T5E = W[27]; + T5N = T5E * T5C; + } + { + E T4g, T4x, T45, T4R; + T4g = FNMS(KP559016994, T4f, T4e); + T4o = FMA(KP951056516, T4n, T4g); + T4S = FNMS(KP951056516, T4n, T4g); + T4x = FNMS(KP559016994, T4w, T4v); + T4B = FNMS(KP951056516, T4A, T4x); + T4V = FMA(KP951056516, T4A, T4x); + T45 = W[4]; + T4p = T45 * T4o; + T4F = T45 * T4B; + T4R = W[12]; + T4T = T4R * T4S; + T4Z = T4R * T4V; + } + { + E T58, T5d, T57, T5r; + T58 = FMA(KP559016994, T4f, T4e); + T5a = FMA(KP951056516, T59, T58); + T5s = FNMS(KP951056516, T59, T58); + T5d = FMA(KP559016994, T4w, T4v); + T5f = FNMS(KP951056516, T5e, T5d); + T5v = FMA(KP951056516, T5e, T5d); + T57 = W[20]; + T5b = T57 * T5a; + T5j = T57 * T5f; + T5r = W[36]; + T5t = T5r * T5s; + T5z = T5r * T5v; + } + { + E T44, T4E, T4C, T4G, T4q; + T44 = FNMS(T3S, T43, T3R); + T4E = FMA(T3x, T43, T4D); + T4q = W[5]; + T4C = FMA(T4q, T4B, T4p); + T4G = FNMS(T4q, T4o, T4F); + Rp[WS(rs, 1)] = T44 - T4C; + Ip[WS(rs, 1)] = T4E + T4G; + Rm[WS(rs, 1)] = T44 + T4C; + Im[WS(rs, 1)] = T4G - T4E; + } + { + E T5G, T5O, T5M, T5Q, T5K; + T5G = FNMS(T5E, T5F, T5D); + T5O = FMA(T5B, T5F, T5N); + T5K = W[29]; + T5M = FMA(T5K, T5L, T5J); + T5Q = FNMS(T5K, T5I, T5P); + Rp[WS(rs, 7)] = T5G - T5M; + Ip[WS(rs, 7)] = T5O + T5Q; + Rm[WS(rs, 7)] = T5G + T5M; + Im[WS(rs, 7)] = T5Q - T5O; + } + { + E T4Q, T4Y, T4W, T50, T4U; + T4Q = FNMS(T4M, T4P, T4L); + T4Y = FMA(T4H, T4P, T4X); + T4U = W[13]; + T4W = FMA(T4U, T4V, T4T); + T50 = FNMS(T4U, T4S, T4Z); + Rp[WS(rs, 3)] = T4Q - T4W; + Ip[WS(rs, 3)] = T4Y + T50; + Rm[WS(rs, 3)] = T4Q + T4W; + Im[WS(rs, 3)] = T50 - T4Y; + } + { + E T56, T5i, T5g, T5k, T5c; + T56 = FNMS(T54, T55, T53); + T5i = FMA(T51, T55, T5h); + T5c = W[21]; + T5g = FMA(T5c, T5f, T5b); + T5k = FNMS(T5c, T5a, T5j); + Rp[WS(rs, 5)] = T56 - T5g; + Ip[WS(rs, 5)] = T5i + T5k; + Rm[WS(rs, 5)] = T56 + T5g; + Im[WS(rs, 5)] = T5k - T5i; + } + { + E T5q, T5y, T5w, T5A, T5u; + T5q = FNMS(T5o, T5p, T5n); + T5y = FMA(T5l, T5p, T5x); + T5u = W[37]; + T5w = FMA(T5u, T5v, T5t); + T5A = FNMS(T5u, T5s, T5z); + Rp[WS(rs, 9)] = T5q - T5w; + Ip[WS(rs, 9)] = T5y + T5A; + Rm[WS(rs, 9)] = T5q + T5w; + Im[WS(rs, 9)] = T5A - T5y; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cbdft_20", twinstr, &GENUS, {176, 38, 110, 0} }; + +void X(codelet_hc2cbdft_20) (planner *p) { + X(khc2c_register) (p, hc2cbdft_20, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -dif -name hc2cbdft_20 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 286 FP additions, 124 FP multiplications, + * (or, 224 additions, 62 multiplications, 62 fused multiply/add), + * 89 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T7, T3N, T4a, T16, T1G, T3g, T3D, T26, T1k, T3A, T3B, T1v, T2e, T48, T47; + E T2d, T1L, T43, T40, T1K, T2l, T3t, T2m, T3w, T3n, T3p, TC, T2b, T4d, T4f; + E T23, T2j, T1B, T1H, T3U, T3W, T3G, T3I, T11, T17; + { + E T3, T1C, T15, T24, T6, T12, T1F, T25; + { + E T1, T2, T13, T14; + T1 = Rp[0]; + T2 = Rm[WS(rs, 9)]; + T3 = T1 + T2; + T1C = T1 - T2; + T13 = Ip[0]; + T14 = Im[WS(rs, 9)]; + T15 = T13 + T14; + T24 = T13 - T14; + } + { + E T4, T5, T1D, T1E; + T4 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 4)]; + T6 = T4 + T5; + T12 = T4 - T5; + T1D = Ip[WS(rs, 5)]; + T1E = Im[WS(rs, 4)]; + T1F = T1D + T1E; + T25 = T1D - T1E; + } + T7 = T3 + T6; + T3N = T15 - T12; + T4a = T1C + T1F; + T16 = T12 + T15; + T1G = T1C - T1F; + T3g = T3 - T6; + T3D = T24 - T25; + T26 = T24 + T25; + } + { + E Te, T3O, T3Y, TJ, T1e, T3h, T3r, T1R, TA, T3S, T42, TZ, T1u, T3l, T3v; + E T21, Tl, T3P, T3Z, TO, T1j, T3i, T3s, T1U, Tt, T3R, T41, TU, T1p, T3k; + E T3u, T1Y; + { + E Ta, T1a, TI, T1P, Td, TF, T1d, T1Q; + { + E T8, T9, TG, TH; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 5)]; + Ta = T8 + T9; + T1a = T8 - T9; + TG = Ip[WS(rs, 4)]; + TH = Im[WS(rs, 5)]; + TI = TG + TH; + T1P = TG - TH; + } + { + E Tb, Tc, T1b, T1c; + Tb = Rp[WS(rs, 9)]; + Tc = Rm[0]; + Td = Tb + Tc; + TF = Tb - Tc; + T1b = Ip[WS(rs, 9)]; + T1c = Im[0]; + T1d = T1b + T1c; + T1Q = T1b - T1c; + } + Te = Ta + Td; + T3O = TI - TF; + T3Y = T1a + T1d; + TJ = TF + TI; + T1e = T1a - T1d; + T3h = Ta - Td; + T3r = T1P - T1Q; + T1R = T1P + T1Q; + } + { + E Tw, T1q, TY, T1Z, Tz, TV, T1t, T20; + { + E Tu, Tv, TW, TX; + Tu = Rm[WS(rs, 7)]; + Tv = Rp[WS(rs, 2)]; + Tw = Tu + Tv; + T1q = Tu - Tv; + TW = Im[WS(rs, 7)]; + TX = Ip[WS(rs, 2)]; + TY = TW + TX; + T1Z = TX - TW; + } + { + E Tx, Ty, T1r, T1s; + Tx = Rm[WS(rs, 2)]; + Ty = Rp[WS(rs, 7)]; + Tz = Tx + Ty; + TV = Tx - Ty; + T1r = Im[WS(rs, 2)]; + T1s = Ip[WS(rs, 7)]; + T1t = T1r + T1s; + T20 = T1s - T1r; + } + TA = Tw + Tz; + T3S = TV + TY; + T42 = T1q - T1t; + TZ = TV - TY; + T1u = T1q + T1t; + T3l = Tw - Tz; + T3v = T1Z - T20; + T21 = T1Z + T20; + } + { + E Th, T1f, TN, T1S, Tk, TK, T1i, T1T; + { + E Tf, Tg, TL, TM; + Tf = Rm[WS(rs, 3)]; + Tg = Rp[WS(rs, 6)]; + Th = Tf + Tg; + T1f = Tf - Tg; + TL = Im[WS(rs, 3)]; + TM = Ip[WS(rs, 6)]; + TN = TL + TM; + T1S = TM - TL; + } + { + E Ti, Tj, T1g, T1h; + Ti = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 8)]; + Tk = Ti + Tj; + TK = Ti - Tj; + T1g = Ip[WS(rs, 1)]; + T1h = Im[WS(rs, 8)]; + T1i = T1g + T1h; + T1T = T1g - T1h; + } + Tl = Th + Tk; + T3P = TK + TN; + T3Z = T1f + T1i; + TO = TK - TN; + T1j = T1f - T1i; + T3i = Th - Tk; + T3s = T1S - T1T; + T1U = T1S + T1T; + } + { + E Tp, T1l, TT, T1W, Ts, TQ, T1o, T1X; + { + E Tn, To, TR, TS; + Tn = Rp[WS(rs, 8)]; + To = Rm[WS(rs, 1)]; + Tp = Tn + To; + T1l = Tn - To; + TR = Ip[WS(rs, 8)]; + TS = Im[WS(rs, 1)]; + TT = TR + TS; + T1W = TR - TS; + } + { + E Tq, Tr, T1m, T1n; + Tq = Rm[WS(rs, 6)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq + Tr; + TQ = Tq - Tr; + T1m = Im[WS(rs, 6)]; + T1n = Ip[WS(rs, 3)]; + T1o = T1m + T1n; + T1X = T1n - T1m; + } + Tt = Tp + Ts; + T3R = TT - TQ; + T41 = T1l - T1o; + TU = TQ + TT; + T1p = T1l + T1o; + T3k = Tp - Ts; + T3u = T1W - T1X; + T1Y = T1W + T1X; + } + T1k = T1e - T1j; + T3A = T3h - T3i; + T3B = T3k - T3l; + T1v = T1p - T1u; + T2e = T1Y - T21; + T48 = T3R + T3S; + T47 = T3O + T3P; + T2d = T1R - T1U; + T1L = TU - TZ; + T43 = T41 - T42; + T40 = T3Y - T3Z; + T1K = TJ - TO; + T2l = Te - Tl; + T3t = T3r - T3s; + T2m = Tt - TA; + T3w = T3u - T3v; + { + E T3j, T3m, Tm, TB; + T3j = T3h + T3i; + T3m = T3k + T3l; + T3n = T3j + T3m; + T3p = KP559016994 * (T3j - T3m); + Tm = Te + Tl; + TB = Tt + TA; + TC = Tm + TB; + T2b = KP559016994 * (Tm - TB); + } + { + E T4b, T4c, T3Q, T3T; + T4b = T3Y + T3Z; + T4c = T41 + T42; + T4d = T4b + T4c; + T4f = KP559016994 * (T4b - T4c); + { + E T1V, T22, T1z, T1A; + T1V = T1R + T1U; + T22 = T1Y + T21; + T23 = T1V + T22; + T2j = KP559016994 * (T1V - T22); + T1z = T1e + T1j; + T1A = T1p + T1u; + T1B = KP559016994 * (T1z - T1A); + T1H = T1z + T1A; + } + T3Q = T3O - T3P; + T3T = T3R - T3S; + T3U = T3Q + T3T; + T3W = KP559016994 * (T3Q - T3T); + { + E T3E, T3F, TP, T10; + T3E = T3r + T3s; + T3F = T3u + T3v; + T3G = T3E + T3F; + T3I = KP559016994 * (T3E - T3F); + TP = TJ + TO; + T10 = TU + TZ; + T11 = KP559016994 * (TP - T10); + T17 = TP + T10; + } + } + } + { + E TD, T27, T3c, T3e, T2o, T36, T2A, T2U, T1N, T2Z, T2t, T2J, T1x, T2X, T2r; + E T2F, T2g, T34, T2y, T2Q; + TD = T7 + TC; + T27 = T23 + T26; + { + E T39, T3b, T38, T3a; + T39 = T16 + T17; + T3b = T1H + T1G; + T38 = W[8]; + T3a = W[9]; + T3c = FMA(T38, T39, T3a * T3b); + T3e = FNMS(T3a, T39, T38 * T3b); + } + { + E T2n, T2S, T2k, T2T, T2i; + T2n = FNMS(KP951056516, T2m, KP587785252 * T2l); + T2S = FMA(KP951056516, T2l, KP587785252 * T2m); + T2i = FNMS(KP250000000, T23, T26); + T2k = T2i - T2j; + T2T = T2j + T2i; + T2o = T2k - T2n; + T36 = T2T - T2S; + T2A = T2n + T2k; + T2U = T2S + T2T; + } + { + E T1M, T2H, T1J, T2I, T1I; + T1M = FMA(KP951056516, T1K, KP587785252 * T1L); + T2H = FNMS(KP951056516, T1L, KP587785252 * T1K); + T1I = FNMS(KP250000000, T1H, T1G); + T1J = T1B + T1I; + T2I = T1I - T1B; + T1N = T1J - T1M; + T2Z = T2I - T2H; + T2t = T1M + T1J; + T2J = T2H + T2I; + } + { + E T1w, T2E, T19, T2D, T18; + T1w = FMA(KP951056516, T1k, KP587785252 * T1v); + T2E = FNMS(KP951056516, T1v, KP587785252 * T1k); + T18 = FNMS(KP250000000, T17, T16); + T19 = T11 + T18; + T2D = T18 - T11; + T1x = T19 + T1w; + T2X = T2D + T2E; + T2r = T19 - T1w; + T2F = T2D - T2E; + } + { + E T2f, T2P, T2c, T2O, T2a; + T2f = FNMS(KP951056516, T2e, KP587785252 * T2d); + T2P = FMA(KP951056516, T2d, KP587785252 * T2e); + T2a = FNMS(KP250000000, TC, T7); + T2c = T2a - T2b; + T2O = T2b + T2a; + T2g = T2c + T2f; + T34 = T2O + T2P; + T2y = T2c - T2f; + T2Q = T2O - T2P; + } + { + E T1O, T28, TE, T1y; + TE = W[0]; + T1y = W[1]; + T1O = FMA(TE, T1x, T1y * T1N); + T28 = FNMS(T1y, T1x, TE * T1N); + Rp[0] = TD - T1O; + Ip[0] = T27 + T28; + Rm[0] = TD + T1O; + Im[0] = T28 - T27; + } + { + E T37, T3d, T33, T35; + T33 = W[6]; + T35 = W[7]; + T37 = FNMS(T35, T36, T33 * T34); + T3d = FMA(T35, T34, T33 * T36); + Rp[WS(rs, 2)] = T37 - T3c; + Ip[WS(rs, 2)] = T3d + T3e; + Rm[WS(rs, 2)] = T37 + T3c; + Im[WS(rs, 2)] = T3e - T3d; + } + { + E T2p, T2v, T2u, T2w; + { + E T29, T2h, T2q, T2s; + T29 = W[14]; + T2h = W[15]; + T2p = FNMS(T2h, T2o, T29 * T2g); + T2v = FMA(T2h, T2g, T29 * T2o); + T2q = W[16]; + T2s = W[17]; + T2u = FMA(T2q, T2r, T2s * T2t); + T2w = FNMS(T2s, T2r, T2q * T2t); + } + Rp[WS(rs, 4)] = T2p - T2u; + Ip[WS(rs, 4)] = T2v + T2w; + Rm[WS(rs, 4)] = T2p + T2u; + Im[WS(rs, 4)] = T2w - T2v; + } + { + E T2B, T2L, T2K, T2M; + { + E T2x, T2z, T2C, T2G; + T2x = W[22]; + T2z = W[23]; + T2B = FNMS(T2z, T2A, T2x * T2y); + T2L = FMA(T2z, T2y, T2x * T2A); + T2C = W[24]; + T2G = W[25]; + T2K = FMA(T2C, T2F, T2G * T2J); + T2M = FNMS(T2G, T2F, T2C * T2J); + } + Rp[WS(rs, 6)] = T2B - T2K; + Ip[WS(rs, 6)] = T2L + T2M; + Rm[WS(rs, 6)] = T2B + T2K; + Im[WS(rs, 6)] = T2M - T2L; + } + { + E T2V, T31, T30, T32; + { + E T2N, T2R, T2W, T2Y; + T2N = W[30]; + T2R = W[31]; + T2V = FNMS(T2R, T2U, T2N * T2Q); + T31 = FMA(T2R, T2Q, T2N * T2U); + T2W = W[32]; + T2Y = W[33]; + T30 = FMA(T2W, T2X, T2Y * T2Z); + T32 = FNMS(T2Y, T2X, T2W * T2Z); + } + Rp[WS(rs, 8)] = T2V - T30; + Ip[WS(rs, 8)] = T31 + T32; + Rm[WS(rs, 8)] = T2V + T30; + Im[WS(rs, 8)] = T32 - T31; + } + } + { + E T4F, T4P, T5c, T5e, T3y, T54, T4o, T4S, T4h, T4Z, T4x, T4N, T45, T4X, T4v; + E T4J, T3K, T56, T4s, T4U; + { + E T4C, T4E, T4B, T4D; + T4C = T3g + T3n; + T4E = T3G + T3D; + T4B = W[18]; + T4D = W[19]; + T4F = FNMS(T4D, T4E, T4B * T4C); + T4P = FMA(T4D, T4C, T4B * T4E); + } + { + E T59, T5b, T58, T5a; + T59 = T3N + T3U; + T5b = T4d + T4a; + T58 = W[28]; + T5a = W[29]; + T5c = FMA(T58, T59, T5a * T5b); + T5e = FNMS(T5a, T59, T58 * T5b); + } + { + E T3x, T4n, T3q, T4m, T3o; + T3x = FNMS(KP951056516, T3w, KP587785252 * T3t); + T4n = FMA(KP951056516, T3t, KP587785252 * T3w); + T3o = FNMS(KP250000000, T3n, T3g); + T3q = T3o - T3p; + T4m = T3p + T3o; + T3y = T3q - T3x; + T54 = T4m + T4n; + T4o = T4m - T4n; + T4S = T3q + T3x; + } + { + E T49, T4M, T4g, T4L, T4e; + T49 = FNMS(KP951056516, T48, KP587785252 * T47); + T4M = FMA(KP951056516, T47, KP587785252 * T48); + T4e = FNMS(KP250000000, T4d, T4a); + T4g = T4e - T4f; + T4L = T4f + T4e; + T4h = T49 + T4g; + T4Z = T4M + T4L; + T4x = T4g - T49; + T4N = T4L - T4M; + } + { + E T44, T4I, T3X, T4H, T3V; + T44 = FNMS(KP951056516, T43, KP587785252 * T40); + T4I = FMA(KP951056516, T40, KP587785252 * T43); + T3V = FNMS(KP250000000, T3U, T3N); + T3X = T3V - T3W; + T4H = T3W + T3V; + T45 = T3X - T44; + T4X = T4H - T4I; + T4v = T3X + T44; + T4J = T4H + T4I; + } + { + E T3C, T4q, T3J, T4r, T3H; + T3C = FNMS(KP951056516, T3B, KP587785252 * T3A); + T4q = FMA(KP951056516, T3A, KP587785252 * T3B); + T3H = FNMS(KP250000000, T3G, T3D); + T3J = T3H - T3I; + T4r = T3I + T3H; + T3K = T3C + T3J; + T56 = T4r - T4q; + T4s = T4q + T4r; + T4U = T3J - T3C; + } + { + E T4O, T4Q, T4G, T4K; + T4G = W[20]; + T4K = W[21]; + T4O = FMA(T4G, T4J, T4K * T4N); + T4Q = FNMS(T4K, T4J, T4G * T4N); + Rp[WS(rs, 5)] = T4F - T4O; + Ip[WS(rs, 5)] = T4P + T4Q; + Rm[WS(rs, 5)] = T4F + T4O; + Im[WS(rs, 5)] = T4Q - T4P; + } + { + E T57, T5d, T53, T55; + T53 = W[26]; + T55 = W[27]; + T57 = FNMS(T55, T56, T53 * T54); + T5d = FMA(T55, T54, T53 * T56); + Rp[WS(rs, 7)] = T57 - T5c; + Ip[WS(rs, 7)] = T5d + T5e; + Rm[WS(rs, 7)] = T57 + T5c; + Im[WS(rs, 7)] = T5e - T5d; + } + { + E T3L, T4j, T4i, T4k; + { + E T3f, T3z, T3M, T46; + T3f = W[2]; + T3z = W[3]; + T3L = FNMS(T3z, T3K, T3f * T3y); + T4j = FMA(T3z, T3y, T3f * T3K); + T3M = W[4]; + T46 = W[5]; + T4i = FMA(T3M, T45, T46 * T4h); + T4k = FNMS(T46, T45, T3M * T4h); + } + Rp[WS(rs, 1)] = T3L - T4i; + Ip[WS(rs, 1)] = T4j + T4k; + Rm[WS(rs, 1)] = T3L + T4i; + Im[WS(rs, 1)] = T4k - T4j; + } + { + E T4t, T4z, T4y, T4A; + { + E T4l, T4p, T4u, T4w; + T4l = W[10]; + T4p = W[11]; + T4t = FNMS(T4p, T4s, T4l * T4o); + T4z = FMA(T4p, T4o, T4l * T4s); + T4u = W[12]; + T4w = W[13]; + T4y = FMA(T4u, T4v, T4w * T4x); + T4A = FNMS(T4w, T4v, T4u * T4x); + } + Rp[WS(rs, 3)] = T4t - T4y; + Ip[WS(rs, 3)] = T4z + T4A; + Rm[WS(rs, 3)] = T4t + T4y; + Im[WS(rs, 3)] = T4A - T4z; + } + { + E T4V, T51, T50, T52; + { + E T4R, T4T, T4W, T4Y; + T4R = W[34]; + T4T = W[35]; + T4V = FNMS(T4T, T4U, T4R * T4S); + T51 = FMA(T4T, T4S, T4R * T4U); + T4W = W[36]; + T4Y = W[37]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T52 = FNMS(T4Y, T4X, T4W * T4Z); + } + Rp[WS(rs, 9)] = T4V - T50; + Ip[WS(rs, 9)] = T51 + T52; + Rm[WS(rs, 9)] = T4V + T50; + Im[WS(rs, 9)] = T52 - T51; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cbdft_20", twinstr, &GENUS, {224, 62, 62, 0} }; + +void X(codelet_hc2cbdft_20) (planner *p) { + X(khc2c_register) (p, hc2cbdft_20, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_32.c new file mode 100644 index 000000000..98a5625f7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_32.c @@ -0,0 +1,1950 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:59 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hc2cbdft_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 498 FP additions, 260 FP multiplications, + * (or, 300 additions, 62 multiplications, 198 fused multiply/add), + * 122 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E T3h, T4B, Tv, T3K, T6T, T8Y, T7i, T8L, T7f, T8X, T1G, T4Y, T1j, T4K, T2M; + E T4X, T6d, T8C, T66, T8o, T6M, T8K, T2P, T4L, T3o, T4C, T4q, T5q, T6C, T8p; + E T6z, T8B, TK, TZ, T10, T32, T39, T3L, T4t, T4E, T8t, T8F, T4w, T4F, T8w; + E T8E, T6l, T6E, T6s, T6F, T28, T51, T2R, T4P, T71, T90, T7k, T8P, T2z, T50; + E T2S, T4S, T78, T91, T7l, T8S; + { + E T16, T3l, T2H, T3m, T3, T6, T7, T2E, T13, Ta, Td, Te, T1c, T3j, T3i; + E T2J, T1h, T2K, Tt, T6Q, T6R, T1z, T1E, T6a, T6b, T3g, Tm, T6N, T6O, T1o; + E T1t, T67, T68, T3d, T4o, T4p; + { + E T14, T15, T2F, T2G; + T14 = Ip[0]; + T15 = Im[WS(rs, 15)]; + T16 = T14 + T15; + T3l = T14 - T15; + T2F = Ip[WS(rs, 8)]; + T2G = Im[WS(rs, 7)]; + T2H = T2F + T2G; + T3m = T2F - T2G; + { + E T1, T2, T4, T5; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T7 = T3 + T6; + T2E = T1 - T2; + T13 = T4 - T5; + } + } + { + E T19, T1a, T1b, T18, T1e, T1f, T1g, T1d; + { + E T8, T9, Tb, Tc; + T19 = Ip[WS(rs, 4)]; + T1a = Im[WS(rs, 11)]; + T1b = T19 + T1a; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + Ta = T8 + T9; + T18 = T8 - T9; + T1e = Im[WS(rs, 3)]; + T1f = Ip[WS(rs, 12)]; + T1g = T1e + T1f; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + Td = Tb + Tc; + T1d = Tb - Tc; + } + Te = Ta + Td; + T1c = T18 + T1b; + T3j = T1f - T1e; + T3i = T19 - T1a; + T2J = T18 - T1b; + T1h = T1d + T1g; + T2K = T1d - T1g; + } + { + E Tp, T1A, T1y, T3e, Ts, T1v, T1D, T3f; + { + E Tn, To, T1w, T1x; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T1A = Tn - To; + T1w = Im[WS(rs, 1)]; + T1x = Ip[WS(rs, 14)]; + T1y = T1w + T1x; + T3e = T1x - T1w; + } + { + E Tq, Tr, T1B, T1C; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T1v = Tq - Tr; + T1B = Ip[WS(rs, 6)]; + T1C = Im[WS(rs, 9)]; + T1D = T1B + T1C; + T3f = T1B - T1C; + } + Tt = Tp + Ts; + T6Q = T1A + T1D; + T6R = T1v + T1y; + T1z = T1v - T1y; + T1E = T1A - T1D; + T6a = Tp - Ts; + T6b = T3e - T3f; + T3g = T3e + T3f; + } + { + E Ti, T1p, T1n, T3b, Tl, T1k, T1s, T3c; + { + E Tg, Th, T1l, T1m; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T1p = Tg - Th; + T1l = Ip[WS(rs, 2)]; + T1m = Im[WS(rs, 13)]; + T1n = T1l + T1m; + T3b = T1l - T1m; + } + { + E Tj, Tk, T1q, T1r; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T1k = Tj - Tk; + T1q = Ip[WS(rs, 10)]; + T1r = Im[WS(rs, 5)]; + T1s = T1q + T1r; + T3c = T1q - T1r; + } + Tm = Ti + Tl; + T6N = T1p + T1s; + T6O = T1n - T1k; + T1o = T1k + T1n; + T1t = T1p - T1s; + T67 = Ti - Tl; + T68 = T3b - T3c; + T3d = T3b + T3c; + } + T3h = T3d + T3g; + T4B = Tm - Tt; + { + E Tf, Tu, T6P, T6S; + Tf = T7 + Te; + Tu = Tm + Tt; + Tv = Tf + Tu; + T3K = Tf - Tu; + T6P = FMA(KP414213562, T6O, T6N); + T6S = FMA(KP414213562, T6R, T6Q); + T6T = T6P - T6S; + T8Y = T6P + T6S; + } + { + E T7g, T7h, T7d, T7e; + T7g = FNMS(KP414213562, T6N, T6O); + T7h = FNMS(KP414213562, T6Q, T6R); + T7i = T7g + T7h; + T8L = T7h - T7g; + T7d = T2E + T2H; + T7e = T1c + T1h; + T7f = FNMS(KP707106781, T7e, T7d); + T8X = FMA(KP707106781, T7e, T7d); + } + { + E T1u, T1F, T17, T1i; + T1u = FMA(KP414213562, T1t, T1o); + T1F = FNMS(KP414213562, T1E, T1z); + T1G = T1u + T1F; + T4Y = T1F - T1u; + T17 = T13 + T16; + T1i = T1c - T1h; + T1j = FMA(KP707106781, T1i, T17); + T4K = FNMS(KP707106781, T1i, T17); + } + { + E T2I, T2L, T69, T6c; + T2I = T2E - T2H; + T2L = T2J + T2K; + T2M = FMA(KP707106781, T2L, T2I); + T4X = FNMS(KP707106781, T2L, T2I); + T69 = T67 - T68; + T6c = T6a + T6b; + T6d = T69 + T6c; + T8C = T69 - T6c; + } + { + E T64, T65, T6K, T6L; + T64 = T3 - T6; + T65 = T3j - T3i; + T66 = T64 + T65; + T8o = T64 - T65; + T6K = T16 - T13; + T6L = T2J - T2K; + T6M = FMA(KP707106781, T6L, T6K); + T8K = FNMS(KP707106781, T6L, T6K); + } + { + E T2N, T2O, T3k, T3n; + T2N = FNMS(KP414213562, T1o, T1t); + T2O = FMA(KP414213562, T1z, T1E); + T2P = T2N + T2O; + T4L = T2N - T2O; + T3k = T3i + T3j; + T3n = T3l + T3m; + T3o = T3k + T3n; + T4C = T3n - T3k; + } + T4o = T7 - Te; + T4p = T3g - T3d; + T4q = T4o + T4p; + T5q = T4o - T4p; + { + E T6A, T6B, T6x, T6y; + T6A = T67 + T68; + T6B = T6b - T6a; + T6C = T6A + T6B; + T8p = T6B - T6A; + T6x = Ta - Td; + T6y = T3l - T3m; + T6z = T6x + T6y; + T8B = T6y - T6x; + } + } + { + E TC, T6V, T6Y, T1M, T23, T6f, T6j, T31, TY, T6n, T6p, T2i, T2n, T2w, T35; + E T2v, TJ, T6g, T6i, T1R, T1W, T25, T2Y, T24, TR, T72, T75, T2d, T2u, T6m; + E T6q, T38; + { + E Ty, T1Z, T1L, T2Z, TB, T1I, T22, T30; + { + E Tw, Tx, T1J, T1K; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + T1Z = Tw - Tx; + T1J = Ip[WS(rs, 1)]; + T1K = Im[WS(rs, 14)]; + T1L = T1J + T1K; + T2Z = T1J - T1K; + } + { + E Tz, TA, T20, T21; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + T1I = Tz - TA; + T20 = Ip[WS(rs, 9)]; + T21 = Im[WS(rs, 6)]; + T22 = T20 + T21; + T30 = T20 - T21; + } + TC = Ty + TB; + T6V = T1L - T1I; + T6Y = T1Z + T22; + T1M = T1I + T1L; + T23 = T1Z - T22; + T6f = Ty - TB; + T6j = T2Z - T30; + T31 = T2Z + T30; + } + { + E TU, T2e, T2h, T33, TX, T2j, T2m, T34; + { + E TS, TT, T2f, T2g; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + TU = TS + TT; + T2e = TS - TT; + T2f = Ip[WS(rs, 3)]; + T2g = Im[WS(rs, 12)]; + T2h = T2f + T2g; + T33 = T2f - T2g; + } + { + E TV, TW, T2k, T2l; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + TX = TV + TW; + T2j = TV - TW; + T2k = Im[WS(rs, 4)]; + T2l = Ip[WS(rs, 11)]; + T2m = T2k + T2l; + T34 = T2l - T2k; + } + TY = TU + TX; + T6n = T34 - T33; + T6p = TU - TX; + T2i = T2e + T2h; + T2n = T2j + T2m; + T2w = T2j - T2m; + T35 = T33 + T34; + T2v = T2e - T2h; + } + { + E TF, T1N, T1Q, T2W, TI, T1S, T1V, T2X; + { + E TD, TE, T1O, T1P; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + TF = TD + TE; + T1N = TD - TE; + T1O = Ip[WS(rs, 5)]; + T1P = Im[WS(rs, 10)]; + T1Q = T1O + T1P; + T2W = T1O - T1P; + } + { + E TG, TH, T1T, T1U; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + TI = TG + TH; + T1S = TG - TH; + T1T = Im[WS(rs, 2)]; + T1U = Ip[WS(rs, 13)]; + T1V = T1T + T1U; + T2X = T1U - T1T; + } + TJ = TF + TI; + T6g = T2X - T2W; + T6i = TF - TI; + T1R = T1N + T1Q; + T1W = T1S + T1V; + T25 = T1S - T1V; + T2Y = T2W + T2X; + T24 = T1N - T1Q; + } + { + E TN, T2q, T2c, T36, TQ, T29, T2t, T37; + { + E TL, TM, T2a, T2b; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + T2q = TL - TM; + T2a = Im[0]; + T2b = Ip[WS(rs, 15)]; + T2c = T2a + T2b; + T36 = T2b - T2a; + } + { + E TO, TP, T2r, T2s; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + T29 = TO - TP; + T2r = Ip[WS(rs, 7)]; + T2s = Im[WS(rs, 8)]; + T2t = T2r + T2s; + T37 = T2r - T2s; + } + TR = TN + TQ; + T72 = T29 + T2c; + T75 = T2q + T2t; + T2d = T29 - T2c; + T2u = T2q - T2t; + T6m = TN - TQ; + T6q = T36 - T37; + T38 = T36 + T37; + } + { + E T4r, T4s, T8r, T8s; + TK = TC + TJ; + TZ = TR + TY; + T10 = TK + TZ; + T32 = T2Y + T31; + T39 = T35 + T38; + T3L = T39 - T32; + T4r = TC - TJ; + T4s = T31 - T2Y; + T4t = T4r - T4s; + T4E = T4r + T4s; + T8r = T6q - T6p; + T8s = T6m - T6n; + T8t = FMA(KP414213562, T8s, T8r); + T8F = FNMS(KP414213562, T8r, T8s); + { + E T4u, T4v, T8u, T8v; + T4u = TR - TY; + T4v = T38 - T35; + T4w = T4u + T4v; + T4F = T4v - T4u; + T8u = T6j - T6i; + T8v = T6f - T6g; + T8w = FNMS(KP414213562, T8v, T8u); + T8E = FMA(KP414213562, T8u, T8v); + } + } + { + E T6h, T6k, T6o, T6r; + T6h = T6f + T6g; + T6k = T6i + T6j; + T6l = FNMS(KP414213562, T6k, T6h); + T6E = FMA(KP414213562, T6h, T6k); + T6o = T6m + T6n; + T6r = T6p + T6q; + T6s = FMA(KP414213562, T6r, T6o); + T6F = FNMS(KP414213562, T6o, T6r); + { + E T1Y, T4O, T27, T4N, T1X, T26; + T1X = T1R - T1W; + T1Y = FMA(KP707106781, T1X, T1M); + T4O = FNMS(KP707106781, T1X, T1M); + T26 = T24 + T25; + T27 = FMA(KP707106781, T26, T23); + T4N = FNMS(KP707106781, T26, T23); + T28 = FMA(KP198912367, T27, T1Y); + T51 = FNMS(KP668178637, T4N, T4O); + T2R = FNMS(KP198912367, T1Y, T27); + T4P = FMA(KP668178637, T4O, T4N); + } + } + { + E T6X, T8O, T70, T8N, T6W, T6Z; + T6W = T25 - T24; + T6X = FNMS(KP707106781, T6W, T6V); + T8O = FMA(KP707106781, T6W, T6V); + T6Z = T1R + T1W; + T70 = FNMS(KP707106781, T6Z, T6Y); + T8N = FMA(KP707106781, T6Z, T6Y); + T71 = FMA(KP668178637, T70, T6X); + T90 = FNMS(KP198912367, T8N, T8O); + T7k = FNMS(KP668178637, T6X, T70); + T8P = FMA(KP198912367, T8O, T8N); + } + { + E T2p, T4R, T2y, T4Q, T2o, T2x; + T2o = T2i - T2n; + T2p = FMA(KP707106781, T2o, T2d); + T4R = FNMS(KP707106781, T2o, T2d); + T2x = T2v + T2w; + T2y = FMA(KP707106781, T2x, T2u); + T4Q = FNMS(KP707106781, T2x, T2u); + T2z = FNMS(KP198912367, T2y, T2p); + T50 = FMA(KP668178637, T4Q, T4R); + T2S = FMA(KP198912367, T2p, T2y); + T4S = FNMS(KP668178637, T4R, T4Q); + } + { + E T74, T8R, T77, T8Q, T73, T76; + T73 = T2v - T2w; + T74 = FNMS(KP707106781, T73, T72); + T8R = FMA(KP707106781, T73, T72); + T76 = T2i + T2n; + T77 = FNMS(KP707106781, T76, T75); + T8Q = FMA(KP707106781, T76, T75); + T78 = FMA(KP668178637, T77, T74); + T91 = FNMS(KP198912367, T8Q, T8R); + T7l = FNMS(KP668178637, T74, T77); + T8S = FMA(KP198912367, T8R, T8Q); + } + } + { + E T11, T3q, T3x, T3t, T3v, T3w, T3F, T2B, T3A, T2U, T3D, T2C, T3r, T3B, T3H; + E T2V, T3s, T2D; + { + E T3a, T3p, T3u, T12, T3z; + T11 = Tv + T10; + T3a = T32 + T39; + T3p = T3h + T3o; + T3q = T3a + T3p; + T3x = T3p - T3a; + T3u = Tv - T10; + T3t = W[30]; + T3v = T3t * T3u; + T3w = W[31]; + T3F = T3w * T3u; + { + E T1H, T2A, T2Q, T2T; + T1H = FMA(KP923879532, T1G, T1j); + T2A = T28 + T2z; + T2B = FMA(KP980785280, T2A, T1H); + T3A = FNMS(KP980785280, T2A, T1H); + T2Q = FMA(KP923879532, T2P, T2M); + T2T = T2R + T2S; + T2U = FMA(KP980785280, T2T, T2Q); + T3D = FNMS(KP980785280, T2T, T2Q); + } + T12 = W[0]; + T2C = T12 * T2B; + T3r = T12 * T2U; + T3z = W[32]; + T3B = T3z * T3A; + T3H = T3z * T3D; + } + T2D = W[1]; + T2V = FMA(T2D, T2U, T2C); + T3s = FNMS(T2D, T2B, T3r); + Rp[0] = T11 - T2V; + Ip[0] = T3q + T3s; + Rm[0] = T11 + T2V; + Im[0] = T3s - T3q; + { + E T3y, T3G, T3E, T3I, T3C; + T3y = FNMS(T3w, T3x, T3v); + T3G = FMA(T3t, T3x, T3F); + T3C = W[33]; + T3E = FMA(T3C, T3D, T3B); + T3I = FNMS(T3C, T3A, T3H); + Rp[WS(rs, 8)] = T3y - T3E; + Ip[WS(rs, 8)] = T3G + T3I; + Rm[WS(rs, 8)] = T3y + T3E; + Im[WS(rs, 8)] = T3I - T3G; + } + } + { + E T3R, T4b, T47, T49, T4a, T4j, T3J, T3N, T3O, T43, T3W, T4e, T41, T4h, T3X; + E T45, T4f, T4l; + { + E T3P, T3Q, T48, T3M, T3T, T4d; + T3P = TK - TZ; + T3Q = T3o - T3h; + T3R = T3P + T3Q; + T4b = T3Q - T3P; + T48 = T3K - T3L; + T47 = W[46]; + T49 = T47 * T48; + T4a = W[47]; + T4j = T4a * T48; + T3M = T3K + T3L; + T3J = W[14]; + T3N = T3J * T3M; + T3O = W[15]; + T43 = T3O * T3M; + { + E T3U, T3V, T3Z, T40; + T3U = FNMS(KP923879532, T1G, T1j); + T3V = T2R - T2S; + T3W = FMA(KP980785280, T3V, T3U); + T4e = FNMS(KP980785280, T3V, T3U); + T3Z = FNMS(KP923879532, T2P, T2M); + T40 = T2z - T28; + T41 = FMA(KP980785280, T40, T3Z); + T4h = FNMS(KP980785280, T40, T3Z); + } + T3T = W[16]; + T3X = T3T * T3W; + T45 = T3T * T41; + T4d = W[48]; + T4f = T4d * T4e; + T4l = T4d * T4h; + } + { + E T3S, T44, T42, T46, T3Y; + T3S = FNMS(T3O, T3R, T3N); + T44 = FMA(T3J, T3R, T43); + T3Y = W[17]; + T42 = FMA(T3Y, T41, T3X); + T46 = FNMS(T3Y, T3W, T45); + Rp[WS(rs, 4)] = T3S - T42; + Ip[WS(rs, 4)] = T44 + T46; + Rm[WS(rs, 4)] = T3S + T42; + Im[WS(rs, 4)] = T46 - T44; + } + { + E T4c, T4k, T4i, T4m, T4g; + T4c = FNMS(T4a, T4b, T49); + T4k = FMA(T47, T4b, T4j); + T4g = W[49]; + T4i = FMA(T4g, T4h, T4f); + T4m = FNMS(T4g, T4e, T4l); + Rp[WS(rs, 12)] = T4c - T4i; + Ip[WS(rs, 12)] = T4k + T4m; + Rm[WS(rs, 12)] = T4c + T4i; + Im[WS(rs, 12)] = T4m - T4k; + } + } + { + E T4H, T5d, T4n, T4z, T4A, T55, T59, T5b, T5c, T5l, T4U, T5g, T53, T5j, T4V; + E T57, T5h, T5n, T4D, T4G; + T4D = T4B + T4C; + T4G = T4E + T4F; + T4H = FMA(KP707106781, T4G, T4D); + T5d = FNMS(KP707106781, T4G, T4D); + { + E T4y, T5a, T4x, T4J, T5f; + T4x = T4t + T4w; + T4y = FMA(KP707106781, T4x, T4q); + T5a = FNMS(KP707106781, T4x, T4q); + T4n = W[6]; + T4z = T4n * T4y; + T4A = W[7]; + T55 = T4A * T4y; + T59 = W[38]; + T5b = T59 * T5a; + T5c = W[39]; + T5l = T5c * T5a; + { + E T4M, T4T, T4Z, T52; + T4M = FMA(KP923879532, T4L, T4K); + T4T = T4P - T4S; + T4U = FMA(KP831469612, T4T, T4M); + T5g = FNMS(KP831469612, T4T, T4M); + T4Z = FMA(KP923879532, T4Y, T4X); + T52 = T50 - T51; + T53 = FMA(KP831469612, T52, T4Z); + T5j = FNMS(KP831469612, T52, T4Z); + } + T4J = W[8]; + T4V = T4J * T4U; + T57 = T4J * T53; + T5f = W[40]; + T5h = T5f * T5g; + T5n = T5f * T5j; + } + { + E T4I, T56, T54, T58, T4W; + T4I = FNMS(T4A, T4H, T4z); + T56 = FMA(T4n, T4H, T55); + T4W = W[9]; + T54 = FMA(T4W, T53, T4V); + T58 = FNMS(T4W, T4U, T57); + Rp[WS(rs, 2)] = T4I - T54; + Ip[WS(rs, 2)] = T56 + T58; + Rm[WS(rs, 2)] = T4I + T54; + Im[WS(rs, 2)] = T58 - T56; + } + { + E T5e, T5m, T5k, T5o, T5i; + T5e = FNMS(T5c, T5d, T5b); + T5m = FMA(T59, T5d, T5l); + T5i = W[41]; + T5k = FMA(T5i, T5j, T5h); + T5o = FNMS(T5i, T5g, T5n); + Rp[WS(rs, 10)] = T5e - T5k; + Ip[WS(rs, 10)] = T5m + T5o; + Rm[WS(rs, 10)] = T5e + T5k; + Im[WS(rs, 10)] = T5o - T5m; + } + } + { + E T5x, T5R, T5p, T5t, T5u, T5J, T5N, T5P, T5Q, T5Z, T5C, T5U, T5H, T5X, T5D; + E T5L, T5V, T61, T5v, T5w; + T5v = T4C - T4B; + T5w = T4t - T4w; + T5x = FMA(KP707106781, T5w, T5v); + T5R = FNMS(KP707106781, T5w, T5v); + { + E T5s, T5O, T5r, T5z, T5T; + T5r = T4F - T4E; + T5s = FMA(KP707106781, T5r, T5q); + T5O = FNMS(KP707106781, T5r, T5q); + T5p = W[22]; + T5t = T5p * T5s; + T5u = W[23]; + T5J = T5u * T5s; + T5N = W[54]; + T5P = T5N * T5O; + T5Q = W[55]; + T5Z = T5Q * T5O; + { + E T5A, T5B, T5F, T5G; + T5A = FNMS(KP923879532, T4L, T4K); + T5B = T51 + T50; + T5C = FNMS(KP831469612, T5B, T5A); + T5U = FMA(KP831469612, T5B, T5A); + T5F = FNMS(KP923879532, T4Y, T4X); + T5G = T4P + T4S; + T5H = FNMS(KP831469612, T5G, T5F); + T5X = FMA(KP831469612, T5G, T5F); + } + T5z = W[24]; + T5D = T5z * T5C; + T5L = T5z * T5H; + T5T = W[56]; + T5V = T5T * T5U; + T61 = T5T * T5X; + } + { + E T5y, T5K, T5I, T5M, T5E; + T5y = FNMS(T5u, T5x, T5t); + T5K = FMA(T5p, T5x, T5J); + T5E = W[25]; + T5I = FMA(T5E, T5H, T5D); + T5M = FNMS(T5E, T5C, T5L); + Rp[WS(rs, 6)] = T5y - T5I; + Ip[WS(rs, 6)] = T5K + T5M; + Rm[WS(rs, 6)] = T5y + T5I; + Im[WS(rs, 6)] = T5M - T5K; + } + { + E T5S, T60, T5Y, T62, T5W; + T5S = FNMS(T5Q, T5R, T5P); + T60 = FMA(T5N, T5R, T5Z); + T5W = W[57]; + T5Y = FMA(T5W, T5X, T5V); + T62 = FNMS(T5W, T5U, T61); + Rp[WS(rs, 14)] = T5S - T5Y; + Ip[WS(rs, 14)] = T60 + T62; + Rm[WS(rs, 14)] = T5S + T5Y; + Im[WS(rs, 14)] = T62 - T60; + } + } + { + E T6H, T7x, T63, T6v, T6w, T7p, T7t, T7v, T7w, T7F, T7a, T7A, T7n, T7D, T7b; + E T7r, T7B, T7H; + { + E T6D, T6G, T6J, T7z; + T6D = FMA(KP707106781, T6C, T6z); + T6G = T6E + T6F; + T6H = FMA(KP923879532, T6G, T6D); + T7x = FNMS(KP923879532, T6G, T6D); + { + E T6u, T7u, T6e, T6t; + T6e = FMA(KP707106781, T6d, T66); + T6t = T6l + T6s; + T6u = FMA(KP923879532, T6t, T6e); + T7u = FNMS(KP923879532, T6t, T6e); + T63 = W[2]; + T6v = T63 * T6u; + T6w = W[3]; + T7p = T6w * T6u; + T7t = W[34]; + T7v = T7t * T7u; + T7w = W[35]; + T7F = T7w * T7u; + } + { + E T6U, T79, T7j, T7m; + T6U = FMA(KP923879532, T6T, T6M); + T79 = T71 - T78; + T7a = FMA(KP831469612, T79, T6U); + T7A = FNMS(KP831469612, T79, T6U); + T7j = FNMS(KP923879532, T7i, T7f); + T7m = T7k + T7l; + T7n = FMA(KP831469612, T7m, T7j); + T7D = FNMS(KP831469612, T7m, T7j); + } + T6J = W[4]; + T7b = T6J * T7a; + T7r = T6J * T7n; + T7z = W[36]; + T7B = T7z * T7A; + T7H = T7z * T7D; + } + { + E T6I, T7q, T7o, T7s, T7c; + T6I = FNMS(T6w, T6H, T6v); + T7q = FMA(T63, T6H, T7p); + T7c = W[5]; + T7o = FMA(T7c, T7n, T7b); + T7s = FNMS(T7c, T7a, T7r); + Rp[WS(rs, 1)] = T6I - T7o; + Ip[WS(rs, 1)] = T7q + T7s; + Rm[WS(rs, 1)] = T6I + T7o; + Im[WS(rs, 1)] = T7s - T7q; + } + { + E T7y, T7G, T7E, T7I, T7C; + T7y = FNMS(T7w, T7x, T7v); + T7G = FMA(T7t, T7x, T7F); + T7C = W[37]; + T7E = FMA(T7C, T7D, T7B); + T7I = FNMS(T7C, T7A, T7H); + Rp[WS(rs, 9)] = T7y - T7E; + Ip[WS(rs, 9)] = T7G + T7I; + Rm[WS(rs, 9)] = T7y + T7E; + Im[WS(rs, 9)] = T7I - T7G; + } + } + { + E T8H, T9d, T8n, T8z, T8A, T95, T99, T9b, T9c, T9l, T8U, T9g, T93, T9j, T8V; + E T97, T9h, T9n; + { + E T8D, T8G, T8J, T9f; + T8D = FMA(KP707106781, T8C, T8B); + T8G = T8E - T8F; + T8H = FMA(KP923879532, T8G, T8D); + T9d = FNMS(KP923879532, T8G, T8D); + { + E T8y, T9a, T8q, T8x; + T8q = FMA(KP707106781, T8p, T8o); + T8x = T8t - T8w; + T8y = FMA(KP923879532, T8x, T8q); + T9a = FNMS(KP923879532, T8x, T8q); + T8n = W[10]; + T8z = T8n * T8y; + T8A = W[11]; + T95 = T8A * T8y; + T99 = W[42]; + T9b = T99 * T9a; + T9c = W[43]; + T9l = T9c * T9a; + } + { + E T8M, T8T, T8Z, T92; + T8M = FMA(KP923879532, T8L, T8K); + T8T = T8P - T8S; + T8U = FMA(KP980785280, T8T, T8M); + T9g = FNMS(KP980785280, T8T, T8M); + T8Z = FNMS(KP923879532, T8Y, T8X); + T92 = T90 + T91; + T93 = FNMS(KP980785280, T92, T8Z); + T9j = FMA(KP980785280, T92, T8Z); + } + T8J = W[12]; + T8V = T8J * T8U; + T97 = T8J * T93; + T9f = W[44]; + T9h = T9f * T9g; + T9n = T9f * T9j; + } + { + E T8I, T96, T94, T98, T8W; + T8I = FNMS(T8A, T8H, T8z); + T96 = FMA(T8n, T8H, T95); + T8W = W[13]; + T94 = FMA(T8W, T93, T8V); + T98 = FNMS(T8W, T8U, T97); + Rp[WS(rs, 3)] = T8I - T94; + Ip[WS(rs, 3)] = T96 + T98; + Rm[WS(rs, 3)] = T8I + T94; + Im[WS(rs, 3)] = T98 - T96; + } + { + E T9e, T9m, T9k, T9o, T9i; + T9e = FNMS(T9c, T9d, T9b); + T9m = FMA(T99, T9d, T9l); + T9i = W[45]; + T9k = FMA(T9i, T9j, T9h); + T9o = FNMS(T9i, T9g, T9n); + Rp[WS(rs, 11)] = T9e - T9k; + Ip[WS(rs, 11)] = T9m + T9o; + Rm[WS(rs, 11)] = T9e + T9k; + Im[WS(rs, 11)] = T9o - T9m; + } + } + { + E T9x, T9R, T9p, T9t, T9u, T9J, T9N, T9P, T9Q, T9Z, T9C, T9U, T9H, T9X, T9D; + E T9L, T9V, Ta1; + { + E T9v, T9w, T9z, T9T; + T9v = FNMS(KP707106781, T8C, T8B); + T9w = T8w + T8t; + T9x = FNMS(KP923879532, T9w, T9v); + T9R = FMA(KP923879532, T9w, T9v); + { + E T9s, T9O, T9q, T9r; + T9q = FNMS(KP707106781, T8p, T8o); + T9r = T8E + T8F; + T9s = FNMS(KP923879532, T9r, T9q); + T9O = FMA(KP923879532, T9r, T9q); + T9p = W[26]; + T9t = T9p * T9s; + T9u = W[27]; + T9J = T9u * T9s; + T9N = W[58]; + T9P = T9N * T9O; + T9Q = W[59]; + T9Z = T9Q * T9O; + } + { + E T9A, T9B, T9F, T9G; + T9A = FNMS(KP923879532, T8L, T8K); + T9B = T91 - T90; + T9C = FMA(KP980785280, T9B, T9A); + T9U = FNMS(KP980785280, T9B, T9A); + T9F = FMA(KP923879532, T8Y, T8X); + T9G = T8P + T8S; + T9H = FNMS(KP980785280, T9G, T9F); + T9X = FMA(KP980785280, T9G, T9F); + } + T9z = W[28]; + T9D = T9z * T9C; + T9L = T9z * T9H; + T9T = W[60]; + T9V = T9T * T9U; + Ta1 = T9T * T9X; + } + { + E T9y, T9K, T9I, T9M, T9E; + T9y = FNMS(T9u, T9x, T9t); + T9K = FMA(T9p, T9x, T9J); + T9E = W[29]; + T9I = FMA(T9E, T9H, T9D); + T9M = FNMS(T9E, T9C, T9L); + Rp[WS(rs, 7)] = T9y - T9I; + Ip[WS(rs, 7)] = T9K + T9M; + Rm[WS(rs, 7)] = T9y + T9I; + Im[WS(rs, 7)] = T9M - T9K; + } + { + E T9S, Ta0, T9Y, Ta2, T9W; + T9S = FNMS(T9Q, T9R, T9P); + Ta0 = FMA(T9N, T9R, T9Z); + T9W = W[61]; + T9Y = FMA(T9W, T9X, T9V); + Ta2 = FNMS(T9W, T9U, Ta1); + Rp[WS(rs, 15)] = T9S - T9Y; + Ip[WS(rs, 15)] = Ta0 + Ta2; + Rm[WS(rs, 15)] = T9S + T9Y; + Im[WS(rs, 15)] = Ta2 - Ta0; + } + } + { + E T7R, T8b, T7J, T7N, T7O, T83, T87, T89, T8a, T8j, T7W, T8e, T81, T8h, T7X; + E T85, T8f, T8l; + { + E T7P, T7Q, T7T, T8d; + T7P = FNMS(KP707106781, T6C, T6z); + T7Q = T6l - T6s; + T7R = FMA(KP923879532, T7Q, T7P); + T8b = FNMS(KP923879532, T7Q, T7P); + { + E T7M, T88, T7K, T7L; + T7K = FNMS(KP707106781, T6d, T66); + T7L = T6F - T6E; + T7M = FMA(KP923879532, T7L, T7K); + T88 = FNMS(KP923879532, T7L, T7K); + T7J = W[18]; + T7N = T7J * T7M; + T7O = W[19]; + T83 = T7O * T7M; + T87 = W[50]; + T89 = T87 * T88; + T8a = W[51]; + T8j = T8a * T88; + } + { + E T7U, T7V, T7Z, T80; + T7U = FNMS(KP923879532, T6T, T6M); + T7V = T7k - T7l; + T7W = FMA(KP831469612, T7V, T7U); + T8e = FNMS(KP831469612, T7V, T7U); + T7Z = FMA(KP923879532, T7i, T7f); + T80 = T71 + T78; + T81 = FNMS(KP831469612, T80, T7Z); + T8h = FMA(KP831469612, T80, T7Z); + } + T7T = W[20]; + T7X = T7T * T7W; + T85 = T7T * T81; + T8d = W[52]; + T8f = T8d * T8e; + T8l = T8d * T8h; + } + { + E T7S, T84, T82, T86, T7Y; + T7S = FNMS(T7O, T7R, T7N); + T84 = FMA(T7J, T7R, T83); + T7Y = W[21]; + T82 = FMA(T7Y, T81, T7X); + T86 = FNMS(T7Y, T7W, T85); + Rp[WS(rs, 5)] = T7S - T82; + Ip[WS(rs, 5)] = T84 + T86; + Rm[WS(rs, 5)] = T7S + T82; + Im[WS(rs, 5)] = T86 - T84; + } + { + E T8c, T8k, T8i, T8m, T8g; + T8c = FNMS(T8a, T8b, T89); + T8k = FMA(T87, T8b, T8j); + T8g = W[53]; + T8i = FMA(T8g, T8h, T8f); + T8m = FNMS(T8g, T8e, T8l); + Rp[WS(rs, 13)] = T8c - T8i; + Ip[WS(rs, 13)] = T8k + T8m; + Rm[WS(rs, 13)] = T8c + T8i; + Im[WS(rs, 13)] = T8m - T8k; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cbdft_32", twinstr, &GENUS, {300, 62, 198, 0} }; + +void X(codelet_hc2cbdft_32) (planner *p) { + X(khc2c_register) (p, hc2cbdft_32, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -dif -name hc2cbdft_32 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 498 FP additions, 208 FP multiplications, + * (or, 404 additions, 114 multiplications, 94 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tf, T4a, T6h, T7Z, T6P, T8e, T1j, T4v, T2R, T4L, T5C, T7E, T6a, T7U, T3n; + E T4q, TZ, T38, T2p, T4B, T7M, T7R, T2y, T4C, T5Y, T63, T6C, T86, T4i, T4n; + E T6z, T85, TK, T31, T1Y, T4y, T7J, T7Q, T27, T4z, T5R, T62, T6v, T83, T4f; + E T4m, T6s, T82, Tu, T4p, T6o, T8f, T6M, T80, T1G, T4K, T2I, T4w, T5J, T7T; + E T67, T7F, T3g, T4b; + { + E T3, T2M, T16, T3k, T6, T13, T2P, T3l, Td, T3i, T1h, T2K, Ta, T3h, T1c; + E T2J; + { + E T1, T2, T2N, T2O; + T1 = Rp[0]; + T2 = Rm[WS(rs, 15)]; + T3 = T1 + T2; + T2M = T1 - T2; + { + E T14, T15, T4, T5; + T14 = Ip[0]; + T15 = Im[WS(rs, 15)]; + T16 = T14 + T15; + T3k = T14 - T15; + T4 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 7)]; + T6 = T4 + T5; + T13 = T4 - T5; + } + T2N = Ip[WS(rs, 8)]; + T2O = Im[WS(rs, 7)]; + T2P = T2N + T2O; + T3l = T2N - T2O; + { + E Tb, Tc, T1d, T1e, T1f, T1g; + Tb = Rm[WS(rs, 3)]; + Tc = Rp[WS(rs, 12)]; + T1d = Tb - Tc; + T1e = Im[WS(rs, 3)]; + T1f = Ip[WS(rs, 12)]; + T1g = T1e + T1f; + Td = Tb + Tc; + T3i = T1f - T1e; + T1h = T1d + T1g; + T2K = T1d - T1g; + } + { + E T8, T9, T18, T19, T1a, T1b; + T8 = Rp[WS(rs, 4)]; + T9 = Rm[WS(rs, 11)]; + T18 = T8 - T9; + T19 = Ip[WS(rs, 4)]; + T1a = Im[WS(rs, 11)]; + T1b = T19 + T1a; + Ta = T8 + T9; + T3h = T19 - T1a; + T1c = T18 + T1b; + T2J = T18 - T1b; + } + } + { + E T7, Te, T6f, T6g; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T4a = T7 - Te; + T6f = T16 - T13; + T6g = KP707106781 * (T2J - T2K); + T6h = T6f + T6g; + T7Z = T6f - T6g; + } + { + E T6N, T6O, T17, T1i; + T6N = T2M + T2P; + T6O = KP707106781 * (T1c + T1h); + T6P = T6N - T6O; + T8e = T6O + T6N; + T17 = T13 + T16; + T1i = KP707106781 * (T1c - T1h); + T1j = T17 + T1i; + T4v = T17 - T1i; + } + { + E T2L, T2Q, T5A, T5B; + T2L = KP707106781 * (T2J + T2K); + T2Q = T2M - T2P; + T2R = T2L + T2Q; + T4L = T2Q - T2L; + T5A = T3 - T6; + T5B = T3i - T3h; + T5C = T5A + T5B; + T7E = T5A - T5B; + } + { + E T68, T69, T3j, T3m; + T68 = Ta - Td; + T69 = T3k - T3l; + T6a = T68 + T69; + T7U = T69 - T68; + T3j = T3h + T3i; + T3m = T3k + T3l; + T3n = T3j + T3m; + T4q = T3m - T3j; + } + } + { + E TR, T5S, T29, T2t, T2c, T5W, T2w, T37, TY, T5T, T5V, T2i, T2n, T2r, T34; + E T2q, T6A, T6B; + { + E TL, TM, TN, TO, TP, TQ; + TL = Rm[0]; + TM = Rp[WS(rs, 15)]; + TN = TL + TM; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 8)]; + TQ = TO + TP; + TR = TN + TQ; + T5S = TN - TQ; + T29 = TO - TP; + T2t = TL - TM; + } + { + E T2a, T2b, T35, T2u, T2v, T36; + T2a = Im[0]; + T2b = Ip[WS(rs, 15)]; + T35 = T2b - T2a; + T2u = Ip[WS(rs, 7)]; + T2v = Im[WS(rs, 8)]; + T36 = T2u - T2v; + T2c = T2a + T2b; + T5W = T35 - T36; + T2w = T2u + T2v; + T37 = T35 + T36; + } + { + E TU, T2e, T2h, T32, TX, T2j, T2m, T33; + { + E TS, TT, T2f, T2g; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 12)]; + TU = TS + TT; + T2e = TS - TT; + T2f = Ip[WS(rs, 3)]; + T2g = Im[WS(rs, 12)]; + T2h = T2f + T2g; + T32 = T2f - T2g; + } + { + E TV, TW, T2k, T2l; + TV = Rm[WS(rs, 4)]; + TW = Rp[WS(rs, 11)]; + TX = TV + TW; + T2j = TV - TW; + T2k = Im[WS(rs, 4)]; + T2l = Ip[WS(rs, 11)]; + T2m = T2k + T2l; + T33 = T2l - T2k; + } + TY = TU + TX; + T5T = T33 - T32; + T5V = TU - TX; + T2i = T2e + T2h; + T2n = T2j + T2m; + T2r = T2j - T2m; + T34 = T32 + T33; + T2q = T2e - T2h; + } + TZ = TR + TY; + T38 = T34 + T37; + { + E T2d, T2o, T7K, T7L; + T2d = T29 - T2c; + T2o = KP707106781 * (T2i - T2n); + T2p = T2d + T2o; + T4B = T2d - T2o; + T7K = T5S - T5T; + T7L = T5W - T5V; + T7M = FMA(KP382683432, T7K, KP923879532 * T7L); + T7R = FNMS(KP923879532, T7K, KP382683432 * T7L); + } + { + E T2s, T2x, T5U, T5X; + T2s = KP707106781 * (T2q + T2r); + T2x = T2t - T2w; + T2y = T2s + T2x; + T4C = T2x - T2s; + T5U = T5S + T5T; + T5X = T5V + T5W; + T5Y = FMA(KP923879532, T5U, KP382683432 * T5X); + T63 = FNMS(KP382683432, T5U, KP923879532 * T5X); + } + T6A = T2t + T2w; + T6B = KP707106781 * (T2i + T2n); + T6C = T6A - T6B; + T86 = T6B + T6A; + { + E T4g, T4h, T6x, T6y; + T4g = TR - TY; + T4h = T37 - T34; + T4i = T4g + T4h; + T4n = T4h - T4g; + T6x = KP707106781 * (T2q - T2r); + T6y = T29 + T2c; + T6z = T6x - T6y; + T85 = T6y + T6x; + } + } + { + E TC, T5L, T1I, T22, T1L, T5P, T25, T30, TJ, T5M, T5O, T1R, T1W, T20, T2X; + E T1Z, T6t, T6u; + { + E Tw, Tx, Ty, Tz, TA, TB; + Tw = Rp[WS(rs, 1)]; + Tx = Rm[WS(rs, 14)]; + Ty = Tw + Tx; + Tz = Rp[WS(rs, 9)]; + TA = Rm[WS(rs, 6)]; + TB = Tz + TA; + TC = Ty + TB; + T5L = Ty - TB; + T1I = Tz - TA; + T22 = Tw - Tx; + } + { + E T1J, T1K, T2Y, T23, T24, T2Z; + T1J = Ip[WS(rs, 1)]; + T1K = Im[WS(rs, 14)]; + T2Y = T1J - T1K; + T23 = Ip[WS(rs, 9)]; + T24 = Im[WS(rs, 6)]; + T2Z = T23 - T24; + T1L = T1J + T1K; + T5P = T2Y - T2Z; + T25 = T23 + T24; + T30 = T2Y + T2Z; + } + { + E TF, T1N, T1Q, T2V, TI, T1S, T1V, T2W; + { + E TD, TE, T1O, T1P; + TD = Rp[WS(rs, 5)]; + TE = Rm[WS(rs, 10)]; + TF = TD + TE; + T1N = TD - TE; + T1O = Ip[WS(rs, 5)]; + T1P = Im[WS(rs, 10)]; + T1Q = T1O + T1P; + T2V = T1O - T1P; + } + { + E TG, TH, T1T, T1U; + TG = Rm[WS(rs, 2)]; + TH = Rp[WS(rs, 13)]; + TI = TG + TH; + T1S = TG - TH; + T1T = Im[WS(rs, 2)]; + T1U = Ip[WS(rs, 13)]; + T1V = T1T + T1U; + T2W = T1U - T1T; + } + TJ = TF + TI; + T5M = T2W - T2V; + T5O = TF - TI; + T1R = T1N + T1Q; + T1W = T1S + T1V; + T20 = T1S - T1V; + T2X = T2V + T2W; + T1Z = T1N - T1Q; + } + TK = TC + TJ; + T31 = T2X + T30; + { + E T1M, T1X, T7H, T7I; + T1M = T1I + T1L; + T1X = KP707106781 * (T1R - T1W); + T1Y = T1M + T1X; + T4y = T1M - T1X; + T7H = T5L - T5M; + T7I = T5P - T5O; + T7J = FNMS(KP923879532, T7I, KP382683432 * T7H); + T7Q = FMA(KP923879532, T7H, KP382683432 * T7I); + } + { + E T21, T26, T5N, T5Q; + T21 = KP707106781 * (T1Z + T20); + T26 = T22 - T25; + T27 = T21 + T26; + T4z = T26 - T21; + T5N = T5L + T5M; + T5Q = T5O + T5P; + T5R = FNMS(KP382683432, T5Q, KP923879532 * T5N); + T62 = FMA(KP382683432, T5N, KP923879532 * T5Q); + } + T6t = T22 + T25; + T6u = KP707106781 * (T1R + T1W); + T6v = T6t - T6u; + T83 = T6u + T6t; + { + E T4d, T4e, T6q, T6r; + T4d = TC - TJ; + T4e = T30 - T2X; + T4f = T4d - T4e; + T4m = T4d + T4e; + T6q = T1L - T1I; + T6r = KP707106781 * (T1Z - T20); + T6s = T6q + T6r; + T82 = T6q - T6r; + } + } + { + E Ti, T3a, Tl, T3b, T1o, T1t, T6j, T6i, T5E, T5D, Tp, T3d, Ts, T3e, T1z; + E T1E, T6m, T6l, T5H, T5G; + { + E T1p, T1n, T1k, T1s; + { + E Tg, Th, T1l, T1m; + Tg = Rp[WS(rs, 2)]; + Th = Rm[WS(rs, 13)]; + Ti = Tg + Th; + T1p = Tg - Th; + T1l = Ip[WS(rs, 2)]; + T1m = Im[WS(rs, 13)]; + T1n = T1l + T1m; + T3a = T1l - T1m; + } + { + E Tj, Tk, T1q, T1r; + Tj = Rp[WS(rs, 10)]; + Tk = Rm[WS(rs, 5)]; + Tl = Tj + Tk; + T1k = Tj - Tk; + T1q = Ip[WS(rs, 10)]; + T1r = Im[WS(rs, 5)]; + T1s = T1q + T1r; + T3b = T1q - T1r; + } + T1o = T1k + T1n; + T1t = T1p - T1s; + T6j = T1p + T1s; + T6i = T1n - T1k; + T5E = T3a - T3b; + T5D = Ti - Tl; + } + { + E T1A, T1y, T1v, T1D; + { + E Tn, To, T1w, T1x; + Tn = Rm[WS(rs, 1)]; + To = Rp[WS(rs, 14)]; + Tp = Tn + To; + T1A = Tn - To; + T1w = Im[WS(rs, 1)]; + T1x = Ip[WS(rs, 14)]; + T1y = T1w + T1x; + T3d = T1x - T1w; + } + { + E Tq, Tr, T1B, T1C; + Tq = Rp[WS(rs, 6)]; + Tr = Rm[WS(rs, 9)]; + Ts = Tq + Tr; + T1v = Tq - Tr; + T1B = Ip[WS(rs, 6)]; + T1C = Im[WS(rs, 9)]; + T1D = T1B + T1C; + T3e = T1B - T1C; + } + T1z = T1v - T1y; + T1E = T1A - T1D; + T6m = T1A + T1D; + T6l = T1v + T1y; + T5H = T3d - T3e; + T5G = Tp - Ts; + } + { + E Tm, Tt, T6k, T6n; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T4p = Tm - Tt; + T6k = FMA(KP382683432, T6i, KP923879532 * T6j); + T6n = FMA(KP382683432, T6l, KP923879532 * T6m); + T6o = T6k - T6n; + T8f = T6k + T6n; + } + { + E T6K, T6L, T1u, T1F; + T6K = FNMS(KP923879532, T6i, KP382683432 * T6j); + T6L = FNMS(KP923879532, T6l, KP382683432 * T6m); + T6M = T6K + T6L; + T80 = T6K - T6L; + T1u = FMA(KP923879532, T1o, KP382683432 * T1t); + T1F = FNMS(KP382683432, T1E, KP923879532 * T1z); + T1G = T1u + T1F; + T4K = T1F - T1u; + } + { + E T2G, T2H, T5F, T5I; + T2G = FNMS(KP382683432, T1o, KP923879532 * T1t); + T2H = FMA(KP382683432, T1z, KP923879532 * T1E); + T2I = T2G + T2H; + T4w = T2G - T2H; + T5F = T5D - T5E; + T5I = T5G + T5H; + T5J = KP707106781 * (T5F + T5I); + T7T = KP707106781 * (T5F - T5I); + } + { + E T65, T66, T3c, T3f; + T65 = T5D + T5E; + T66 = T5H - T5G; + T67 = KP707106781 * (T65 + T66); + T7F = KP707106781 * (T66 - T65); + T3c = T3a + T3b; + T3f = T3d + T3e; + T3g = T3c + T3f; + T4b = T3f - T3c; + } + } + { + E T11, T3s, T3p, T3u, T3K, T40, T3G, T3Y, T2T, T43, T3z, T3P, T2B, T45, T3x; + E T3T; + { + E Tv, T10, T3E, T3F; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + T3s = Tv - T10; + { + E T39, T3o, T3I, T3J; + T39 = T31 + T38; + T3o = T3g + T3n; + T3p = T39 + T3o; + T3u = T3o - T39; + T3I = TK - TZ; + T3J = T3n - T3g; + T3K = T3I + T3J; + T40 = T3J - T3I; + } + T3E = Tf - Tu; + T3F = T38 - T31; + T3G = T3E + T3F; + T3Y = T3E - T3F; + { + E T2S, T3N, T2F, T3O, T2D, T2E; + T2S = T2I + T2R; + T3N = T1j - T1G; + T2D = FNMS(KP195090322, T1Y, KP980785280 * T27); + T2E = FMA(KP195090322, T2p, KP980785280 * T2y); + T2F = T2D + T2E; + T3O = T2D - T2E; + T2T = T2F + T2S; + T43 = T3N - T3O; + T3z = T2S - T2F; + T3P = T3N + T3O; + } + { + E T1H, T3S, T2A, T3R, T28, T2z; + T1H = T1j + T1G; + T3S = T2R - T2I; + T28 = FMA(KP980785280, T1Y, KP195090322 * T27); + T2z = FNMS(KP195090322, T2y, KP980785280 * T2p); + T2A = T28 + T2z; + T3R = T2z - T28; + T2B = T1H + T2A; + T45 = T3S - T3R; + T3x = T1H - T2A; + T3T = T3R + T3S; + } + } + { + E T2U, T3q, T12, T2C; + T12 = W[0]; + T2C = W[1]; + T2U = FMA(T12, T2B, T2C * T2T); + T3q = FNMS(T2C, T2B, T12 * T2T); + Rp[0] = T11 - T2U; + Ip[0] = T3p + T3q; + Rm[0] = T11 + T2U; + Im[0] = T3q - T3p; + } + { + E T41, T47, T46, T48; + { + E T3X, T3Z, T42, T44; + T3X = W[46]; + T3Z = W[47]; + T41 = FNMS(T3Z, T40, T3X * T3Y); + T47 = FMA(T3Z, T3Y, T3X * T40); + T42 = W[48]; + T44 = W[49]; + T46 = FMA(T42, T43, T44 * T45); + T48 = FNMS(T44, T43, T42 * T45); + } + Rp[WS(rs, 12)] = T41 - T46; + Ip[WS(rs, 12)] = T47 + T48; + Rm[WS(rs, 12)] = T41 + T46; + Im[WS(rs, 12)] = T48 - T47; + } + { + E T3v, T3B, T3A, T3C; + { + E T3r, T3t, T3w, T3y; + T3r = W[30]; + T3t = W[31]; + T3v = FNMS(T3t, T3u, T3r * T3s); + T3B = FMA(T3t, T3s, T3r * T3u); + T3w = W[32]; + T3y = W[33]; + T3A = FMA(T3w, T3x, T3y * T3z); + T3C = FNMS(T3y, T3x, T3w * T3z); + } + Rp[WS(rs, 8)] = T3v - T3A; + Ip[WS(rs, 8)] = T3B + T3C; + Rm[WS(rs, 8)] = T3v + T3A; + Im[WS(rs, 8)] = T3C - T3B; + } + { + E T3L, T3V, T3U, T3W; + { + E T3D, T3H, T3M, T3Q; + T3D = W[14]; + T3H = W[15]; + T3L = FNMS(T3H, T3K, T3D * T3G); + T3V = FMA(T3H, T3G, T3D * T3K); + T3M = W[16]; + T3Q = W[17]; + T3U = FMA(T3M, T3P, T3Q * T3T); + T3W = FNMS(T3Q, T3P, T3M * T3T); + } + Rp[WS(rs, 4)] = T3L - T3U; + Ip[WS(rs, 4)] = T3V + T3W; + Rm[WS(rs, 4)] = T3L + T3U; + Im[WS(rs, 4)] = T3W - T3V; + } + } + { + E T7O, T8m, T7W, T8o, T8E, T8U, T8A, T8S, T8h, T8X, T8t, T8J, T89, T8Z, T8r; + E T8N; + { + E T7G, T7N, T8y, T8z; + T7G = T7E + T7F; + T7N = T7J + T7M; + T7O = T7G + T7N; + T8m = T7G - T7N; + { + E T7S, T7V, T8C, T8D; + T7S = T7Q + T7R; + T7V = T7T + T7U; + T7W = T7S + T7V; + T8o = T7V - T7S; + T8C = T7J - T7M; + T8D = T7U - T7T; + T8E = T8C + T8D; + T8U = T8D - T8C; + } + T8y = T7E - T7F; + T8z = T7R - T7Q; + T8A = T8y + T8z; + T8S = T8y - T8z; + { + E T8g, T8H, T8d, T8I, T8b, T8c; + T8g = T8e - T8f; + T8H = T7Z - T80; + T8b = FNMS(KP980785280, T82, KP195090322 * T83); + T8c = FNMS(KP980785280, T85, KP195090322 * T86); + T8d = T8b + T8c; + T8I = T8b - T8c; + T8h = T8d + T8g; + T8X = T8H - T8I; + T8t = T8g - T8d; + T8J = T8H + T8I; + } + { + E T81, T8L, T88, T8M, T84, T87; + T81 = T7Z + T80; + T8L = T8f + T8e; + T84 = FMA(KP195090322, T82, KP980785280 * T83); + T87 = FMA(KP195090322, T85, KP980785280 * T86); + T88 = T84 - T87; + T8M = T84 + T87; + T89 = T81 + T88; + T8Z = T8M + T8L; + T8r = T81 - T88; + T8N = T8L - T8M; + } + } + { + E T7X, T8j, T8i, T8k; + { + E T7D, T7P, T7Y, T8a; + T7D = W[10]; + T7P = W[11]; + T7X = FNMS(T7P, T7W, T7D * T7O); + T8j = FMA(T7P, T7O, T7D * T7W); + T7Y = W[12]; + T8a = W[13]; + T8i = FMA(T7Y, T89, T8a * T8h); + T8k = FNMS(T8a, T89, T7Y * T8h); + } + Rp[WS(rs, 3)] = T7X - T8i; + Ip[WS(rs, 3)] = T8j + T8k; + Rm[WS(rs, 3)] = T7X + T8i; + Im[WS(rs, 3)] = T8k - T8j; + } + { + E T8V, T91, T90, T92; + { + E T8R, T8T, T8W, T8Y; + T8R = W[58]; + T8T = W[59]; + T8V = FNMS(T8T, T8U, T8R * T8S); + T91 = FMA(T8T, T8S, T8R * T8U); + T8W = W[60]; + T8Y = W[61]; + T90 = FMA(T8W, T8X, T8Y * T8Z); + T92 = FNMS(T8Y, T8X, T8W * T8Z); + } + Rp[WS(rs, 15)] = T8V - T90; + Ip[WS(rs, 15)] = T91 + T92; + Rm[WS(rs, 15)] = T8V + T90; + Im[WS(rs, 15)] = T92 - T91; + } + { + E T8p, T8v, T8u, T8w; + { + E T8l, T8n, T8q, T8s; + T8l = W[42]; + T8n = W[43]; + T8p = FNMS(T8n, T8o, T8l * T8m); + T8v = FMA(T8n, T8m, T8l * T8o); + T8q = W[44]; + T8s = W[45]; + T8u = FMA(T8q, T8r, T8s * T8t); + T8w = FNMS(T8s, T8r, T8q * T8t); + } + Rp[WS(rs, 11)] = T8p - T8u; + Ip[WS(rs, 11)] = T8v + T8w; + Rm[WS(rs, 11)] = T8p + T8u; + Im[WS(rs, 11)] = T8w - T8v; + } + { + E T8F, T8P, T8O, T8Q; + { + E T8x, T8B, T8G, T8K; + T8x = W[26]; + T8B = W[27]; + T8F = FNMS(T8B, T8E, T8x * T8A); + T8P = FMA(T8B, T8A, T8x * T8E); + T8G = W[28]; + T8K = W[29]; + T8O = FMA(T8G, T8J, T8K * T8N); + T8Q = FNMS(T8K, T8J, T8G * T8N); + } + Rp[WS(rs, 7)] = T8F - T8O; + Ip[WS(rs, 7)] = T8P + T8Q; + Rm[WS(rs, 7)] = T8F + T8O; + Im[WS(rs, 7)] = T8Q - T8P; + } + } + { + E T4k, T4S, T4s, T4U, T5a, T5q, T56, T5o, T4N, T5t, T4Z, T5f, T4F, T5v, T4X; + E T5j; + { + E T4c, T4j, T54, T55; + T4c = T4a + T4b; + T4j = KP707106781 * (T4f + T4i); + T4k = T4c + T4j; + T4S = T4c - T4j; + { + E T4o, T4r, T58, T59; + T4o = KP707106781 * (T4m + T4n); + T4r = T4p + T4q; + T4s = T4o + T4r; + T4U = T4r - T4o; + T58 = KP707106781 * (T4f - T4i); + T59 = T4q - T4p; + T5a = T58 + T59; + T5q = T59 - T58; + } + T54 = T4a - T4b; + T55 = KP707106781 * (T4n - T4m); + T56 = T54 + T55; + T5o = T54 - T55; + { + E T4M, T5d, T4J, T5e, T4H, T4I; + T4M = T4K + T4L; + T5d = T4v - T4w; + T4H = FNMS(KP831469612, T4y, KP555570233 * T4z); + T4I = FMA(KP831469612, T4B, KP555570233 * T4C); + T4J = T4H + T4I; + T5e = T4H - T4I; + T4N = T4J + T4M; + T5t = T5d - T5e; + T4Z = T4M - T4J; + T5f = T5d + T5e; + } + { + E T4x, T5i, T4E, T5h, T4A, T4D; + T4x = T4v + T4w; + T5i = T4L - T4K; + T4A = FMA(KP555570233, T4y, KP831469612 * T4z); + T4D = FNMS(KP831469612, T4C, KP555570233 * T4B); + T4E = T4A + T4D; + T5h = T4D - T4A; + T4F = T4x + T4E; + T5v = T5i - T5h; + T4X = T4x - T4E; + T5j = T5h + T5i; + } + } + { + E T4t, T4P, T4O, T4Q; + { + E T49, T4l, T4u, T4G; + T49 = W[6]; + T4l = W[7]; + T4t = FNMS(T4l, T4s, T49 * T4k); + T4P = FMA(T4l, T4k, T49 * T4s); + T4u = W[8]; + T4G = W[9]; + T4O = FMA(T4u, T4F, T4G * T4N); + T4Q = FNMS(T4G, T4F, T4u * T4N); + } + Rp[WS(rs, 2)] = T4t - T4O; + Ip[WS(rs, 2)] = T4P + T4Q; + Rm[WS(rs, 2)] = T4t + T4O; + Im[WS(rs, 2)] = T4Q - T4P; + } + { + E T5r, T5x, T5w, T5y; + { + E T5n, T5p, T5s, T5u; + T5n = W[54]; + T5p = W[55]; + T5r = FNMS(T5p, T5q, T5n * T5o); + T5x = FMA(T5p, T5o, T5n * T5q); + T5s = W[56]; + T5u = W[57]; + T5w = FMA(T5s, T5t, T5u * T5v); + T5y = FNMS(T5u, T5t, T5s * T5v); + } + Rp[WS(rs, 14)] = T5r - T5w; + Ip[WS(rs, 14)] = T5x + T5y; + Rm[WS(rs, 14)] = T5r + T5w; + Im[WS(rs, 14)] = T5y - T5x; + } + { + E T4V, T51, T50, T52; + { + E T4R, T4T, T4W, T4Y; + T4R = W[38]; + T4T = W[39]; + T4V = FNMS(T4T, T4U, T4R * T4S); + T51 = FMA(T4T, T4S, T4R * T4U); + T4W = W[40]; + T4Y = W[41]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T52 = FNMS(T4Y, T4X, T4W * T4Z); + } + Rp[WS(rs, 10)] = T4V - T50; + Ip[WS(rs, 10)] = T51 + T52; + Rm[WS(rs, 10)] = T4V + T50; + Im[WS(rs, 10)] = T52 - T51; + } + { + E T5b, T5l, T5k, T5m; + { + E T53, T57, T5c, T5g; + T53 = W[22]; + T57 = W[23]; + T5b = FNMS(T57, T5a, T53 * T56); + T5l = FMA(T57, T56, T53 * T5a); + T5c = W[24]; + T5g = W[25]; + T5k = FMA(T5c, T5f, T5g * T5j); + T5m = FNMS(T5g, T5f, T5c * T5j); + } + Rp[WS(rs, 6)] = T5b - T5k; + Ip[WS(rs, 6)] = T5l + T5m; + Rm[WS(rs, 6)] = T5b + T5k; + Im[WS(rs, 6)] = T5m - T5l; + } + } + { + E T60, T6W, T6c, T6Y, T7e, T7u, T7a, T7s, T6R, T7x, T73, T7j, T6F, T7z, T71; + E T7n; + { + E T5K, T5Z, T78, T79; + T5K = T5C + T5J; + T5Z = T5R + T5Y; + T60 = T5K + T5Z; + T6W = T5K - T5Z; + { + E T64, T6b, T7c, T7d; + T64 = T62 + T63; + T6b = T67 + T6a; + T6c = T64 + T6b; + T6Y = T6b - T64; + T7c = T5R - T5Y; + T7d = T6a - T67; + T7e = T7c + T7d; + T7u = T7d - T7c; + } + T78 = T5C - T5J; + T79 = T63 - T62; + T7a = T78 + T79; + T7s = T78 - T79; + { + E T6Q, T7h, T6J, T7i, T6H, T6I; + T6Q = T6M + T6P; + T7h = T6h - T6o; + T6H = FNMS(KP555570233, T6s, KP831469612 * T6v); + T6I = FMA(KP555570233, T6z, KP831469612 * T6C); + T6J = T6H + T6I; + T7i = T6H - T6I; + T6R = T6J + T6Q; + T7x = T7h - T7i; + T73 = T6Q - T6J; + T7j = T7h + T7i; + } + { + E T6p, T7m, T6E, T7l, T6w, T6D; + T6p = T6h + T6o; + T7m = T6P - T6M; + T6w = FMA(KP831469612, T6s, KP555570233 * T6v); + T6D = FNMS(KP555570233, T6C, KP831469612 * T6z); + T6E = T6w + T6D; + T7l = T6D - T6w; + T6F = T6p + T6E; + T7z = T7m - T7l; + T71 = T6p - T6E; + T7n = T7l + T7m; + } + } + { + E T6d, T6T, T6S, T6U; + { + E T5z, T61, T6e, T6G; + T5z = W[2]; + T61 = W[3]; + T6d = FNMS(T61, T6c, T5z * T60); + T6T = FMA(T61, T60, T5z * T6c); + T6e = W[4]; + T6G = W[5]; + T6S = FMA(T6e, T6F, T6G * T6R); + T6U = FNMS(T6G, T6F, T6e * T6R); + } + Rp[WS(rs, 1)] = T6d - T6S; + Ip[WS(rs, 1)] = T6T + T6U; + Rm[WS(rs, 1)] = T6d + T6S; + Im[WS(rs, 1)] = T6U - T6T; + } + { + E T7v, T7B, T7A, T7C; + { + E T7r, T7t, T7w, T7y; + T7r = W[50]; + T7t = W[51]; + T7v = FNMS(T7t, T7u, T7r * T7s); + T7B = FMA(T7t, T7s, T7r * T7u); + T7w = W[52]; + T7y = W[53]; + T7A = FMA(T7w, T7x, T7y * T7z); + T7C = FNMS(T7y, T7x, T7w * T7z); + } + Rp[WS(rs, 13)] = T7v - T7A; + Ip[WS(rs, 13)] = T7B + T7C; + Rm[WS(rs, 13)] = T7v + T7A; + Im[WS(rs, 13)] = T7C - T7B; + } + { + E T6Z, T75, T74, T76; + { + E T6V, T6X, T70, T72; + T6V = W[34]; + T6X = W[35]; + T6Z = FNMS(T6X, T6Y, T6V * T6W); + T75 = FMA(T6X, T6W, T6V * T6Y); + T70 = W[36]; + T72 = W[37]; + T74 = FMA(T70, T71, T72 * T73); + T76 = FNMS(T72, T71, T70 * T73); + } + Rp[WS(rs, 9)] = T6Z - T74; + Ip[WS(rs, 9)] = T75 + T76; + Rm[WS(rs, 9)] = T6Z + T74; + Im[WS(rs, 9)] = T76 - T75; + } + { + E T7f, T7p, T7o, T7q; + { + E T77, T7b, T7g, T7k; + T77 = W[18]; + T7b = W[19]; + T7f = FNMS(T7b, T7e, T77 * T7a); + T7p = FMA(T7b, T7a, T77 * T7e); + T7g = W[20]; + T7k = W[21]; + T7o = FMA(T7g, T7j, T7k * T7n); + T7q = FNMS(T7k, T7j, T7g * T7n); + } + Rp[WS(rs, 5)] = T7f - T7o; + Ip[WS(rs, 5)] = T7p + T7q; + Rm[WS(rs, 5)] = T7f + T7o; + Im[WS(rs, 5)] = T7q - T7p; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cbdft_32", twinstr, &GENUS, {404, 114, 94, 0} }; + +void X(codelet_hc2cbdft_32) (planner *p) { + X(khc2c_register) (p, hc2cbdft_32, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_4.c new file mode 100644 index 000000000..7a025e6b4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_4.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:57 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hc2cbdft_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 30 FP additions, 12 FP multiplications, + * (or, 24 additions, 6 multiplications, 6 fused multiply/add), + * 23 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T3, Tm, T6, Tn, Td, Tk, TB, Ty, Tv, Ts; + { + E Tg, Tc, T9, Tj; + { + E T1, T2, Ta, Tb; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tg = T1 - T2; + Ta = Ip[0]; + Tb = Im[WS(rs, 1)]; + Tc = Ta + Tb; + Tm = Ta - Tb; + } + { + E T4, T5, Th, Ti; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + T9 = T4 - T5; + Th = Ip[WS(rs, 1)]; + Ti = Im[0]; + Tj = Th + Ti; + Tn = Th - Ti; + } + Td = T9 + Tc; + Tk = Tg - Tj; + TB = Tg + Tj; + Ty = Tc - T9; + Tv = Tm - Tn; + Ts = T3 - T6; + } + { + E T7, To, Te, Tp, T8, Tl, Tq, Tf; + T7 = T3 + T6; + To = Tm + Tn; + T8 = W[0]; + Te = T8 * Td; + Tp = T8 * Tk; + Tf = W[1]; + Tl = FMA(Tf, Tk, Te); + Tq = FNMS(Tf, Td, Tp); + Rp[0] = T7 - Tl; + Ip[0] = To + Tq; + Rm[0] = T7 + Tl; + Im[0] = Tq - To; + } + { + E Tr, Tt, Tu, TD, Tz, TF, Tx; + Tr = W[2]; + Tt = Tr * Ts; + Tu = W[3]; + TD = Tu * Ts; + Tx = W[4]; + Tz = Tx * Ty; + TF = Tx * TB; + { + E Tw, TE, TC, TG, TA; + Tw = FNMS(Tu, Tv, Tt); + TE = FMA(Tr, Tv, TD); + TA = W[5]; + TC = FMA(TA, TB, Tz); + TG = FNMS(TA, Ty, TF); + Rp[WS(rs, 1)] = Tw - TC; + Ip[WS(rs, 1)] = TE + TG; + Rm[WS(rs, 1)] = Tw + TC; + Im[WS(rs, 1)] = TG - TE; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cbdft_4", twinstr, &GENUS, {24, 6, 6, 0} }; + +void X(codelet_hc2cbdft_4) (planner *p) { + X(khc2c_register) (p, hc2cbdft_4, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -dif -name hc2cbdft_4 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 30 FP additions, 12 FP multiplications, + * (or, 24 additions, 6 multiplications, 6 fused multiply/add), + * 19 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T3, Tl, T6, Tm, Td, Tj, Tx, Tv, Ts, Tq; + { + E Tf, Tc, T9, Ti; + { + E T1, T2, Ta, Tb; + T1 = Rp[0]; + T2 = Rm[WS(rs, 1)]; + T3 = T1 + T2; + Tf = T1 - T2; + Ta = Ip[0]; + Tb = Im[WS(rs, 1)]; + Tc = Ta + Tb; + Tl = Ta - Tb; + } + { + E T4, T5, Tg, Th; + T4 = Rp[WS(rs, 1)]; + T5 = Rm[0]; + T6 = T4 + T5; + T9 = T4 - T5; + Tg = Ip[WS(rs, 1)]; + Th = Im[0]; + Ti = Tg + Th; + Tm = Tg - Th; + } + Td = T9 + Tc; + Tj = Tf - Ti; + Tx = Tf + Ti; + Tv = Tc - T9; + Ts = Tl - Tm; + Tq = T3 - T6; + } + { + E T7, Tn, Tk, To, T8, Te; + T7 = T3 + T6; + Tn = Tl + Tm; + T8 = W[0]; + Te = W[1]; + Tk = FMA(T8, Td, Te * Tj); + To = FNMS(Te, Td, T8 * Tj); + Rp[0] = T7 - Tk; + Ip[0] = Tn + To; + Rm[0] = T7 + Tk; + Im[0] = To - Tn; + } + { + E Tt, Tz, Ty, TA; + { + E Tp, Tr, Tu, Tw; + Tp = W[2]; + Tr = W[3]; + Tt = FNMS(Tr, Ts, Tp * Tq); + Tz = FMA(Tr, Tq, Tp * Ts); + Tu = W[4]; + Tw = W[5]; + Ty = FMA(Tu, Tv, Tw * Tx); + TA = FNMS(Tw, Tv, Tu * Tx); + } + Rp[WS(rs, 1)] = Tt - Ty; + Ip[WS(rs, 1)] = Tz + TA; + Rm[WS(rs, 1)] = Tt + Ty; + Im[WS(rs, 1)] = TA - Tz; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cbdft_4", twinstr, &GENUS, {24, 6, 6, 0} }; + +void X(codelet_hc2cbdft_4) (planner *p) { + X(khc2c_register) (p, hc2cbdft_4, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_6.c new file mode 100644 index 000000000..064357708 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_6.c @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:57 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -dif -name hc2cbdft_6 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 58 FP additions, 32 FP multiplications, + * (or, 36 additions, 10 multiplications, 22 fused multiply/add), + * 34 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E Tp, TD, Tj, TV, Tq, Tr, TG, TP, T4, Ts, TQ, Tb, Tc, TA, TU; + { + E Tf, TF, Ti, TE, Td, Te; + Td = Ip[WS(rs, 1)]; + Te = Im[WS(rs, 1)]; + Tf = Td - Te; + TF = Te + Td; + { + E Tn, To, Tg, Th; + Tn = Ip[0]; + To = Im[WS(rs, 2)]; + Tp = Tn - To; + TD = Tn + To; + Tg = Ip[WS(rs, 2)]; + Th = Im[0]; + Ti = Tg - Th; + TE = Tg + Th; + } + Tj = Tf - Ti; + TV = TF + TE; + Tq = Tf + Ti; + Tr = FNMS(KP500000000, Tq, Tp); + TG = TE - TF; + TP = FNMS(KP500000000, TG, TD); + } + { + E Tw, Ta, Ty, T7, Tx, T2, T3, Tz; + T2 = Rp[0]; + T3 = Rm[WS(rs, 2)]; + T4 = T2 + T3; + Tw = T2 - T3; + { + E T8, T9, T5, T6; + T8 = Rm[WS(rs, 1)]; + T9 = Rp[WS(rs, 1)]; + Ta = T8 + T9; + Ty = T8 - T9; + T5 = Rp[WS(rs, 2)]; + T6 = Rm[0]; + T7 = T5 + T6; + Tx = T5 - T6; + } + Ts = T7 - Ta; + TQ = Tx - Ty; + Tb = T7 + Ta; + Tc = FNMS(KP500000000, Tb, T4); + Tz = Tx + Ty; + TA = Tw + Tz; + TU = FNMS(KP500000000, Tz, Tw); + } + { + E TN, TY, TR, TW, TS, TZ, TO, TX, T10, TT; + TN = T4 + Tb; + TY = Tp + Tq; + TR = FMA(KP866025403, TQ, TP); + TW = FNMS(KP866025403, TV, TU); + TO = W[0]; + TS = TO * TR; + TZ = TO * TW; + TT = W[1]; + TX = FMA(TT, TW, TS); + T10 = FNMS(TT, TR, TZ); + Rp[0] = TN - TX; + Ip[0] = TY + T10; + Rm[0] = TN + TX; + Im[0] = T10 - TY; + } + { + E Tt, TH, Tv, TB, TC, TL, T1, Tl, Tm, TJ, Tk; + Tt = FNMS(KP866025403, Ts, Tr); + TH = TD + TG; + Tv = W[4]; + TB = Tv * TA; + TC = W[5]; + TL = TC * TA; + Tk = FNMS(KP866025403, Tj, Tc); + T1 = W[3]; + Tl = T1 * Tk; + Tm = W[2]; + TJ = Tm * Tk; + { + E Tu, TI, TK, TM; + Tu = FMA(Tm, Tt, Tl); + TI = FNMS(TC, TH, TB); + Ip[WS(rs, 1)] = Tu + TI; + Im[WS(rs, 1)] = TI - Tu; + TK = FNMS(T1, Tt, TJ); + TM = FMA(Tv, TH, TL); + Rp[WS(rs, 1)] = TK - TM; + Rm[WS(rs, 1)] = TK + TM; + } + } + { + E T15, T11, T13, T14, T1d, T18, T1b, T19, T1f, T12, T17; + T15 = FMA(KP866025403, Ts, Tr); + T12 = FMA(KP866025403, Tj, Tc); + T11 = W[6]; + T13 = T11 * T12; + T14 = W[7]; + T1d = T14 * T12; + T18 = FNMS(KP866025403, TQ, TP); + T1b = FMA(KP866025403, TV, TU); + T17 = W[8]; + T19 = T17 * T18; + T1f = T17 * T1b; + { + E T16, T1e, T1c, T1g, T1a; + T16 = FNMS(T14, T15, T13); + T1e = FMA(T11, T15, T1d); + T1a = W[9]; + T1c = FMA(T1a, T1b, T19); + T1g = FNMS(T1a, T18, T1f); + Rp[WS(rs, 2)] = T16 - T1c; + Ip[WS(rs, 2)] = T1e + T1g; + Rm[WS(rs, 2)] = T16 + T1c; + Im[WS(rs, 2)] = T1g - T1e; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cbdft_6", twinstr, &GENUS, {36, 10, 22, 0} }; + +void X(codelet_hc2cbdft_6) (planner *p) { + X(khc2c_register) (p, hc2cbdft_6, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -dif -name hc2cbdft_6 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 58 FP additions, 28 FP multiplications, + * (or, 44 additions, 14 multiplications, 14 fused multiply/add), + * 29 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E T4, Tv, Tr, TL, Tb, Tc, Ty, TP, To, TB, Tj, TQ, Tp, Tq, TE; + E TM; + { + E Ta, Tx, T7, Tw, T2, T3; + T2 = Rp[0]; + T3 = Rm[WS(rs, 2)]; + T4 = T2 + T3; + Tv = T2 - T3; + { + E T8, T9, T5, T6; + T8 = Rm[WS(rs, 1)]; + T9 = Rp[WS(rs, 1)]; + Ta = T8 + T9; + Tx = T8 - T9; + T5 = Rp[WS(rs, 2)]; + T6 = Rm[0]; + T7 = T5 + T6; + Tw = T5 - T6; + } + Tr = KP866025403 * (T7 - Ta); + TL = KP866025403 * (Tw - Tx); + Tb = T7 + Ta; + Tc = FNMS(KP500000000, Tb, T4); + Ty = Tw + Tx; + TP = FNMS(KP500000000, Ty, Tv); + } + { + E Tf, TC, Ti, TD, Td, Te; + Td = Ip[WS(rs, 1)]; + Te = Im[WS(rs, 1)]; + Tf = Td - Te; + TC = Te + Td; + { + E Tm, Tn, Tg, Th; + Tm = Ip[0]; + Tn = Im[WS(rs, 2)]; + To = Tm - Tn; + TB = Tm + Tn; + Tg = Ip[WS(rs, 2)]; + Th = Im[0]; + Ti = Tg - Th; + TD = Tg + Th; + } + Tj = KP866025403 * (Tf - Ti); + TQ = KP866025403 * (TC + TD); + Tp = Tf + Ti; + Tq = FNMS(KP500000000, Tp, To); + TE = TC - TD; + TM = FMA(KP500000000, TE, TB); + } + { + E TJ, TT, TS, TU; + TJ = T4 + Tb; + TT = To + Tp; + { + E TN, TR, TK, TO; + TN = TL + TM; + TR = TP - TQ; + TK = W[0]; + TO = W[1]; + TS = FMA(TK, TN, TO * TR); + TU = FNMS(TO, TN, TK * TR); + } + Rp[0] = TJ - TS; + Ip[0] = TT + TU; + Rm[0] = TJ + TS; + Im[0] = TU - TT; + } + { + E TZ, T15, T14, T16; + { + E TW, TY, TV, TX; + TW = Tc + Tj; + TY = Tr + Tq; + TV = W[6]; + TX = W[7]; + TZ = FNMS(TX, TY, TV * TW); + T15 = FMA(TX, TW, TV * TY); + } + { + E T11, T13, T10, T12; + T11 = TM - TL; + T13 = TP + TQ; + T10 = W[8]; + T12 = W[9]; + T14 = FMA(T10, T11, T12 * T13); + T16 = FNMS(T12, T11, T10 * T13); + } + Rp[WS(rs, 2)] = TZ - T14; + Ip[WS(rs, 2)] = T15 + T16; + Rm[WS(rs, 2)] = TZ + T14; + Im[WS(rs, 2)] = T16 - T15; + } + { + E Tt, TH, TG, TI; + { + E Tk, Ts, T1, Tl; + Tk = Tc - Tj; + Ts = Tq - Tr; + T1 = W[3]; + Tl = W[2]; + Tt = FMA(T1, Tk, Tl * Ts); + TH = FNMS(T1, Ts, Tl * Tk); + } + { + E Tz, TF, Tu, TA; + Tz = Tv + Ty; + TF = TB - TE; + Tu = W[4]; + TA = W[5]; + TG = FNMS(TA, TF, Tu * Tz); + TI = FMA(TA, Tz, Tu * TF); + } + Ip[WS(rs, 1)] = Tt + TG; + Rp[WS(rs, 1)] = TH - TI; + Im[WS(rs, 1)] = TG - Tt; + Rm[WS(rs, 1)] = TH + TI; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cbdft_6", twinstr, &GENUS, {44, 14, 14, 0} }; + +void X(codelet_hc2cbdft_6) (planner *p) { + X(khc2c_register) (p, hc2cbdft_6, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_8.c new file mode 100644 index 000000000..a71d5a779 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/hc2cbdft_8.c @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:58 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hc2cbdft_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 82 FP additions, 36 FP multiplications, + * (or, 60 additions, 14 multiplications, 22 fused multiply/add), + * 41 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tl, T1p, T1g, TM, T1k, TE, TP, T1f, T7, Te, TU, TH, T1l, Tw, T1q; + E T1c, T1y; + { + E T3, TA, Tk, TN, T6, Th, TD, TO, Ta, Tm, Tp, TK, Td, Tr, Tu; + E TL, TF, TG; + { + E T1, T2, Ti, Tj; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + TA = T1 - T2; + Ti = Ip[0]; + Tj = Im[WS(rs, 3)]; + Tk = Ti + Tj; + TN = Ti - Tj; + } + { + E T4, T5, TB, TC; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + Th = T4 - T5; + TB = Ip[WS(rs, 2)]; + TC = Im[WS(rs, 1)]; + TD = TB + TC; + TO = TB - TC; + } + { + E T8, T9, Tn, To; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + Tm = T8 - T9; + Tn = Ip[WS(rs, 1)]; + To = Im[WS(rs, 2)]; + Tp = Tn + To; + TK = Tn - To; + } + { + E Tb, Tc, Ts, Tt; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + Tr = Tb - Tc; + Ts = Im[0]; + Tt = Ip[WS(rs, 3)]; + Tu = Ts + Tt; + TL = Tt - Ts; + } + Tl = Th + Tk; + T1p = TA + TD; + T1g = TN - TO; + TM = TK + TL; + T1k = Tk - Th; + TE = TA - TD; + TP = TN + TO; + T1f = Ta - Td; + T7 = T3 + T6; + Te = Ta + Td; + TU = T7 - Te; + TF = Tm - Tp; + TG = Tr - Tu; + TH = TF + TG; + T1l = TF - TG; + { + E Tq, Tv, T1a, T1b; + Tq = Tm + Tp; + Tv = Tr + Tu; + Tw = Tq - Tv; + T1q = Tq + Tv; + T1a = T3 - T6; + T1b = TL - TK; + T1c = T1a + T1b; + T1y = T1a - T1b; + } + } + { + E Tf, TQ, Tx, TI, Ty, TR, Tg, TJ, TS, Tz; + Tf = T7 + Te; + TQ = TM + TP; + Tx = FMA(KP707106781, Tw, Tl); + TI = FMA(KP707106781, TH, TE); + Tg = W[0]; + Ty = Tg * Tx; + TR = Tg * TI; + Tz = W[1]; + TJ = FMA(Tz, TI, Ty); + TS = FNMS(Tz, Tx, TR); + Rp[0] = Tf - TJ; + Ip[0] = TQ + TS; + Rm[0] = Tf + TJ; + Im[0] = TS - TQ; + } + { + E T1B, T1A, T1J, T1x, T1z, T1E, T1H, T1F, T1L, T1D; + T1B = T1g - T1f; + T1A = W[11]; + T1J = T1A * T1y; + T1x = W[10]; + T1z = T1x * T1y; + T1E = FNMS(KP707106781, T1l, T1k); + T1H = FMA(KP707106781, T1q, T1p); + T1D = W[12]; + T1F = T1D * T1E; + T1L = T1D * T1H; + { + E T1C, T1K, T1I, T1M, T1G; + T1C = FNMS(T1A, T1B, T1z); + T1K = FMA(T1x, T1B, T1J); + T1G = W[13]; + T1I = FMA(T1G, T1H, T1F); + T1M = FNMS(T1G, T1E, T1L); + Rp[WS(rs, 3)] = T1C - T1I; + Ip[WS(rs, 3)] = T1K + T1M; + Rm[WS(rs, 3)] = T1C + T1I; + Im[WS(rs, 3)] = T1M - T1K; + } + } + { + E TX, TW, T15, TT, TV, T10, T13, T11, T17, TZ; + TX = TP - TM; + TW = W[7]; + T15 = TW * TU; + TT = W[6]; + TV = TT * TU; + T10 = FNMS(KP707106781, Tw, Tl); + T13 = FNMS(KP707106781, TH, TE); + TZ = W[8]; + T11 = TZ * T10; + T17 = TZ * T13; + { + E TY, T16, T14, T18, T12; + TY = FNMS(TW, TX, TV); + T16 = FMA(TT, TX, T15); + T12 = W[9]; + T14 = FMA(T12, T13, T11); + T18 = FNMS(T12, T10, T17); + Rp[WS(rs, 2)] = TY - T14; + Ip[WS(rs, 2)] = T16 + T18; + Rm[WS(rs, 2)] = TY + T14; + Im[WS(rs, 2)] = T18 - T16; + } + } + { + E T1h, T1e, T1t, T19, T1d, T1m, T1r, T1n, T1v, T1j; + T1h = T1f + T1g; + T1e = W[3]; + T1t = T1e * T1c; + T19 = W[2]; + T1d = T19 * T1c; + T1m = FMA(KP707106781, T1l, T1k); + T1r = FNMS(KP707106781, T1q, T1p); + T1j = W[4]; + T1n = T1j * T1m; + T1v = T1j * T1r; + { + E T1i, T1u, T1s, T1w, T1o; + T1i = FNMS(T1e, T1h, T1d); + T1u = FMA(T19, T1h, T1t); + T1o = W[5]; + T1s = FMA(T1o, T1r, T1n); + T1w = FNMS(T1o, T1m, T1v); + Rp[WS(rs, 1)] = T1i - T1s; + Ip[WS(rs, 1)] = T1u + T1w; + Rm[WS(rs, 1)] = T1i + T1s; + Im[WS(rs, 1)] = T1w - T1u; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cbdft_8", twinstr, &GENUS, {60, 14, 22, 0} }; + +void X(codelet_hc2cbdft_8) (planner *p) { + X(khc2c_register) (p, hc2cbdft_8, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -dif -name hc2cbdft_8 -include rdft/scalar/hc2cb.h */ + +/* + * This function contains 82 FP additions, 32 FP multiplications, + * (or, 68 additions, 18 multiplications, 14 fused multiply/add), + * 30 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cb.h" + +static void hc2cbdft_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T1d, T1h, Tl, TG, T14, T19, TO, Te, TL, T18, T15, TB, T1e, Tw; + E T1i; + { + E T3, TC, Tk, TM, T6, Th, TF, TN; + { + E T1, T2, Ti, Tj; + T1 = Rp[0]; + T2 = Rm[WS(rs, 3)]; + T3 = T1 + T2; + TC = T1 - T2; + Ti = Ip[0]; + Tj = Im[WS(rs, 3)]; + Tk = Ti + Tj; + TM = Ti - Tj; + } + { + E T4, T5, TD, TE; + T4 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 1)]; + T6 = T4 + T5; + Th = T4 - T5; + TD = Ip[WS(rs, 2)]; + TE = Im[WS(rs, 1)]; + TF = TD + TE; + TN = TD - TE; + } + T7 = T3 + T6; + T1d = Tk - Th; + T1h = TC + TF; + Tl = Th + Tk; + TG = TC - TF; + T14 = T3 - T6; + T19 = TM - TN; + TO = TM + TN; + } + { + E Ta, Tm, Tp, TJ, Td, Tr, Tu, TK; + { + E T8, T9, Tn, To; + T8 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 2)]; + Ta = T8 + T9; + Tm = T8 - T9; + Tn = Ip[WS(rs, 1)]; + To = Im[WS(rs, 2)]; + Tp = Tn + To; + TJ = Tn - To; + } + { + E Tb, Tc, Ts, Tt; + Tb = Rm[0]; + Tc = Rp[WS(rs, 3)]; + Td = Tb + Tc; + Tr = Tb - Tc; + Ts = Im[0]; + Tt = Ip[WS(rs, 3)]; + Tu = Ts + Tt; + TK = Tt - Ts; + } + Te = Ta + Td; + TL = TJ + TK; + T18 = Ta - Td; + T15 = TK - TJ; + { + E Tz, TA, Tq, Tv; + Tz = Tm - Tp; + TA = Tr - Tu; + TB = KP707106781 * (Tz + TA); + T1e = KP707106781 * (Tz - TA); + Tq = Tm + Tp; + Tv = Tr + Tu; + Tw = KP707106781 * (Tq - Tv); + T1i = KP707106781 * (Tq + Tv); + } + } + { + E Tf, TP, TI, TQ; + Tf = T7 + Te; + TP = TL + TO; + { + E Tx, TH, Tg, Ty; + Tx = Tl + Tw; + TH = TB + TG; + Tg = W[0]; + Ty = W[1]; + TI = FMA(Tg, Tx, Ty * TH); + TQ = FNMS(Ty, Tx, Tg * TH); + } + Rp[0] = Tf - TI; + Ip[0] = TP + TQ; + Rm[0] = Tf + TI; + Im[0] = TQ - TP; + } + { + E T1r, T1x, T1w, T1y; + { + E T1o, T1q, T1n, T1p; + T1o = T14 - T15; + T1q = T19 - T18; + T1n = W[10]; + T1p = W[11]; + T1r = FNMS(T1p, T1q, T1n * T1o); + T1x = FMA(T1p, T1o, T1n * T1q); + } + { + E T1t, T1v, T1s, T1u; + T1t = T1d - T1e; + T1v = T1i + T1h; + T1s = W[12]; + T1u = W[13]; + T1w = FMA(T1s, T1t, T1u * T1v); + T1y = FNMS(T1u, T1t, T1s * T1v); + } + Rp[WS(rs, 3)] = T1r - T1w; + Ip[WS(rs, 3)] = T1x + T1y; + Rm[WS(rs, 3)] = T1r + T1w; + Im[WS(rs, 3)] = T1y - T1x; + } + { + E TV, T11, T10, T12; + { + E TS, TU, TR, TT; + TS = T7 - Te; + TU = TO - TL; + TR = W[6]; + TT = W[7]; + TV = FNMS(TT, TU, TR * TS); + T11 = FMA(TT, TS, TR * TU); + } + { + E TX, TZ, TW, TY; + TX = Tl - Tw; + TZ = TG - TB; + TW = W[8]; + TY = W[9]; + T10 = FMA(TW, TX, TY * TZ); + T12 = FNMS(TY, TX, TW * TZ); + } + Rp[WS(rs, 2)] = TV - T10; + Ip[WS(rs, 2)] = T11 + T12; + Rm[WS(rs, 2)] = TV + T10; + Im[WS(rs, 2)] = T12 - T11; + } + { + E T1b, T1l, T1k, T1m; + { + E T16, T1a, T13, T17; + T16 = T14 + T15; + T1a = T18 + T19; + T13 = W[2]; + T17 = W[3]; + T1b = FNMS(T17, T1a, T13 * T16); + T1l = FMA(T17, T16, T13 * T1a); + } + { + E T1f, T1j, T1c, T1g; + T1f = T1d + T1e; + T1j = T1h - T1i; + T1c = W[4]; + T1g = W[5]; + T1k = FMA(T1c, T1f, T1g * T1j); + T1m = FNMS(T1g, T1f, T1c * T1j); + } + Rp[WS(rs, 1)] = T1b - T1k; + Ip[WS(rs, 1)] = T1l + T1m; + Rm[WS(rs, 1)] = T1b + T1k; + Im[WS(rs, 1)] = T1m - T1l; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cbdft_8", twinstr, &GENUS, {68, 18, 14, 0} }; + +void X(codelet_hc2cbdft_8) (planner *p) { + X(khc2c_register) (p, hc2cbdft_8, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_10.c new file mode 100644 index 000000000..ef1ebefe6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_10.c @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:44 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -name r2cbIII_10 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 32 FP additions, 28 FP multiplications, + * (or, 14 additions, 10 multiplications, 18 fused multiply/add), + * 22 stack variables, 5 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T1, To, T8, Tt, Ta, Ts, Te, Tq, Th, Tn; + T1 = Cr[WS(csr, 2)]; + To = Ci[WS(csi, 2)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = Cr[WS(csr, 4)]; + T3 = Cr[0]; + T4 = T2 + T3; + T5 = Cr[WS(csr, 3)]; + T6 = Cr[WS(csr, 1)]; + T7 = T5 + T6; + T8 = T4 + T7; + Tt = T5 - T6; + Ta = T7 - T4; + Ts = T2 - T3; + } + { + E Tc, Td, Tl, Tf, Tg, Tm; + Tc = Ci[WS(csi, 3)]; + Td = Ci[WS(csi, 1)]; + Tl = Tc + Td; + Tf = Ci[WS(csi, 4)]; + Tg = Ci[0]; + Tm = Tf + Tg; + Te = Tc - Td; + Tq = Tl + Tm; + Th = Tf - Tg; + Tn = Tl - Tm; + } + R0[0] = KP2_000000000 * (T1 + T8); + R1[WS(rs, 2)] = KP2_000000000 * (Tn - To); + { + E Ti, Tk, Tb, Tj, T9; + Ti = FMA(KP618033988, Th, Te); + Tk = FNMS(KP618033988, Te, Th); + T9 = FMS(KP250000000, T8, T1); + Tb = FNMS(KP559016994, Ta, T9); + Tj = FMA(KP559016994, Ta, T9); + R0[WS(rs, 1)] = KP2_000000000 * (FMA(KP951056516, Ti, Tb)); + R0[WS(rs, 3)] = KP2_000000000 * (FMA(KP951056516, Tk, Tj)); + R0[WS(rs, 4)] = -(KP2_000000000 * (FNMS(KP951056516, Ti, Tb))); + R0[WS(rs, 2)] = -(KP2_000000000 * (FNMS(KP951056516, Tk, Tj))); + } + { + E Tu, Tw, Tr, Tv, Tp; + Tu = FMA(KP618033988, Tt, Ts); + Tw = FNMS(KP618033988, Ts, Tt); + Tp = FMA(KP250000000, Tn, To); + Tr = FMA(KP559016994, Tq, Tp); + Tv = FNMS(KP559016994, Tq, Tp); + R1[0] = -(KP2_000000000 * (FMA(KP951056516, Tu, Tr))); + R1[WS(rs, 3)] = KP2_000000000 * (FNMS(KP951056516, Tw, Tv)); + R1[WS(rs, 4)] = -(KP2_000000000 * (FNMS(KP951056516, Tu, Tr))); + R1[WS(rs, 1)] = KP2_000000000 * (FMA(KP951056516, Tw, Tv)); + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cbIII_10", {14, 10, 18, 0}, &GENUS }; + +void X(codelet_r2cbIII_10) (planner *p) { + X(kr2c_register) (p, r2cbIII_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -name r2cbIII_10 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 32 FP additions, 16 FP multiplications, + * (or, 26 additions, 10 multiplications, 6 fused multiply/add), + * 22 stack variables, 5 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T1, To, T8, Tq, Ta, Tp, Te, Ts, Th, Tn; + T1 = Cr[WS(csr, 2)]; + To = Ci[WS(csi, 2)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = Cr[WS(csr, 4)]; + T3 = Cr[0]; + T4 = T2 + T3; + T5 = Cr[WS(csr, 3)]; + T6 = Cr[WS(csr, 1)]; + T7 = T5 + T6; + T8 = T4 + T7; + Tq = T5 - T6; + Ta = KP1_118033988 * (T7 - T4); + Tp = T2 - T3; + } + { + E Tc, Td, Tm, Tf, Tg, Tl; + Tc = Ci[WS(csi, 4)]; + Td = Ci[0]; + Tm = Tc + Td; + Tf = Ci[WS(csi, 1)]; + Tg = Ci[WS(csi, 3)]; + Tl = Tg + Tf; + Te = Tc - Td; + Ts = KP1_118033988 * (Tl + Tm); + Th = Tf - Tg; + Tn = Tl - Tm; + } + R0[0] = KP2_000000000 * (T1 + T8); + R1[WS(rs, 2)] = KP2_000000000 * (Tn - To); + { + E Ti, Tj, Tb, Tk, T9; + Ti = FNMS(KP1_902113032, Th, KP1_175570504 * Te); + Tj = FMA(KP1_175570504, Th, KP1_902113032 * Te); + T9 = FNMS(KP2_000000000, T1, KP500000000 * T8); + Tb = T9 - Ta; + Tk = T9 + Ta; + R0[WS(rs, 1)] = Tb + Ti; + R0[WS(rs, 3)] = Tk + Tj; + R0[WS(rs, 4)] = Ti - Tb; + R0[WS(rs, 2)] = Tj - Tk; + } + { + E Tr, Tv, Tu, Tw, Tt; + Tr = FMA(KP1_902113032, Tp, KP1_175570504 * Tq); + Tv = FNMS(KP1_175570504, Tp, KP1_902113032 * Tq); + Tt = FMA(KP500000000, Tn, KP2_000000000 * To); + Tu = Ts + Tt; + Tw = Tt - Ts; + R1[0] = -(Tr + Tu); + R1[WS(rs, 3)] = Tw - Tv; + R1[WS(rs, 4)] = Tr - Tu; + R1[WS(rs, 1)] = Tv + Tw; + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cbIII_10", {26, 10, 6, 0}, &GENUS }; + +void X(codelet_r2cbIII_10) (planner *p) { + X(kr2c_register) (p, r2cbIII_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_12.c new file mode 100644 index 000000000..5dade28c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_12.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:44 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -name r2cbIII_12 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 42 FP additions, 20 FP multiplications, + * (or, 30 additions, 8 multiplications, 12 fused multiply/add), + * 25 stack variables, 4 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E T5, Tx, Tb, Te, Tw, Ts, Ta, TA, Tg, Tj, Tz, Tp, Tt, Tu; + { + E T1, T2, T3, T4; + T1 = Cr[WS(csr, 1)]; + T2 = Cr[WS(csr, 5)]; + T3 = Cr[WS(csr, 2)]; + T4 = T2 + T3; + T5 = T1 + T4; + Tx = T2 - T3; + Tb = FNMS(KP2_000000000, T1, T4); + } + { + E Tq, Tc, Td, Tr; + Tq = Ci[WS(csi, 1)]; + Tc = Ci[WS(csi, 5)]; + Td = Ci[WS(csi, 2)]; + Tr = Td - Tc; + Te = Tc + Td; + Tw = FMA(KP2_000000000, Tq, Tr); + Ts = Tq - Tr; + } + { + E T6, T7, T8, T9; + T6 = Cr[WS(csr, 4)]; + T7 = Cr[0]; + T8 = Cr[WS(csr, 3)]; + T9 = T7 + T8; + Ta = T6 + T9; + TA = T7 - T8; + Tg = FNMS(KP2_000000000, T6, T9); + } + { + E To, Th, Ti, Tn; + To = Ci[WS(csi, 4)]; + Th = Ci[0]; + Ti = Ci[WS(csi, 3)]; + Tn = Ti - Th; + Tj = Th + Ti; + Tz = FMA(KP2_000000000, To, Tn); + Tp = Tn - To; + } + R0[0] = KP2_000000000 * (T5 + Ta); + R0[WS(rs, 3)] = KP2_000000000 * (Ts + Tp); + Tt = Tp - Ts; + Tu = T5 - Ta; + R1[WS(rs, 1)] = KP1_414213562 * (Tt - Tu); + R1[WS(rs, 4)] = KP1_414213562 * (Tu + Tt); + { + E Tf, Tk, Tv, Ty, TB, TC; + Tf = FMA(KP1_732050807, Te, Tb); + Tk = FNMS(KP1_732050807, Tj, Tg); + Tv = Tk - Tf; + Ty = FMA(KP1_732050807, Tx, Tw); + TB = FNMS(KP1_732050807, TA, Tz); + TC = Ty + TB; + R0[WS(rs, 2)] = Tf + Tk; + R0[WS(rs, 5)] = TB - Ty; + R1[0] = KP707106781 * (Tv - TC); + R1[WS(rs, 3)] = KP707106781 * (Tv + TC); + } + { + E Tl, Tm, TF, TD, TE, TG; + Tl = FNMS(KP1_732050807, Te, Tb); + Tm = FMA(KP1_732050807, Tj, Tg); + TF = Tl - Tm; + TD = FMA(KP1_732050807, TA, Tz); + TE = FNMS(KP1_732050807, Tx, Tw); + TG = TE + TD; + R0[WS(rs, 4)] = -(Tl + Tm); + R1[WS(rs, 2)] = KP707106781 * (TF + TG); + R0[WS(rs, 1)] = TD - TE; + R1[WS(rs, 5)] = KP707106781 * (TF - TG); + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cbIII_12", {30, 8, 12, 0}, &GENUS }; + +void X(codelet_r2cbIII_12) (planner *p) { + X(kr2c_register) (p, r2cbIII_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -name r2cbIII_12 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 42 FP additions, 20 FP multiplications, + * (or, 38 additions, 16 multiplications, 4 fused multiply/add), + * 25 stack variables, 4 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E T5, Tw, Tb, Te, Tx, Ts, Ta, TA, Tg, Tj, Tz, Tp, Tt, Tu; + { + E T1, T2, T3, T4; + T1 = Cr[WS(csr, 1)]; + T2 = Cr[WS(csr, 5)]; + T3 = Cr[WS(csr, 2)]; + T4 = T2 + T3; + T5 = T1 + T4; + Tw = KP866025403 * (T2 - T3); + Tb = FNMS(KP500000000, T4, T1); + } + { + E Tq, Tc, Td, Tr; + Tq = Ci[WS(csi, 1)]; + Tc = Ci[WS(csi, 5)]; + Td = Ci[WS(csi, 2)]; + Tr = Td - Tc; + Te = KP866025403 * (Tc + Td); + Tx = FMA(KP500000000, Tr, Tq); + Ts = Tq - Tr; + } + { + E T6, T7, T8, T9; + T6 = Cr[WS(csr, 4)]; + T7 = Cr[0]; + T8 = Cr[WS(csr, 3)]; + T9 = T7 + T8; + Ta = T6 + T9; + TA = KP866025403 * (T7 - T8); + Tg = FNMS(KP500000000, T9, T6); + } + { + E To, Th, Ti, Tn; + To = Ci[WS(csi, 4)]; + Th = Ci[0]; + Ti = Ci[WS(csi, 3)]; + Tn = Ti - Th; + Tj = KP866025403 * (Th + Ti); + Tz = FMA(KP500000000, Tn, To); + Tp = Tn - To; + } + R0[0] = KP2_000000000 * (T5 + Ta); + R0[WS(rs, 3)] = KP2_000000000 * (Ts + Tp); + Tt = Tp - Ts; + Tu = T5 - Ta; + R1[WS(rs, 1)] = KP1_414213562 * (Tt - Tu); + R1[WS(rs, 4)] = KP1_414213562 * (Tu + Tt); + { + E Tf, Tk, Tv, Ty, TB, TC; + Tf = Tb - Te; + Tk = Tg + Tj; + Tv = Tf - Tk; + Ty = Tw + Tx; + TB = Tz - TA; + TC = Ty + TB; + R0[WS(rs, 2)] = -(KP2_000000000 * (Tf + Tk)); + R0[WS(rs, 5)] = KP2_000000000 * (TB - Ty); + R1[0] = KP1_414213562 * (Tv - TC); + R1[WS(rs, 3)] = KP1_414213562 * (Tv + TC); + } + { + E Tl, Tm, TF, TD, TE, TG; + Tl = Tb + Te; + Tm = Tg - Tj; + TF = Tm - Tl; + TD = TA + Tz; + TE = Tx - Tw; + TG = TE + TD; + R0[WS(rs, 4)] = KP2_000000000 * (Tl + Tm); + R1[WS(rs, 2)] = KP1_414213562 * (TF + TG); + R0[WS(rs, 1)] = KP2_000000000 * (TD - TE); + R1[WS(rs, 5)] = KP1_414213562 * (TF - TG); + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cbIII_12", {38, 16, 4, 0}, &GENUS }; + +void X(codelet_r2cbIII_12) (planner *p) { + X(kr2c_register) (p, r2cbIII_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_15.c new file mode 100644 index 000000000..b125b57b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_15.c @@ -0,0 +1,305 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:44 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 15 -name r2cbIII_15 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 64 FP additions, 43 FP multiplications, + * (or, 21 additions, 0 multiplications, 43 fused multiply/add), + * 42 stack variables, 9 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E Tk, TA, T5, Th, Tz, T6, Tn, TX, TR, Td, Tm, TI, Tv, TN, TD; + E TL, TM, Ti, Tj, T12, Te, T11; + Ti = Ci[WS(csi, 4)]; + Tj = Ci[WS(csi, 1)]; + Tk = FMA(KP618033988, Tj, Ti); + TA = FNMS(KP618033988, Ti, Tj); + { + E T1, T4, Tg, T2, T3, Tf; + T1 = Cr[WS(csr, 7)]; + T2 = Cr[WS(csr, 4)]; + T3 = Cr[WS(csr, 1)]; + T4 = T2 + T3; + Tg = T2 - T3; + T5 = FMA(KP2_000000000, T4, T1); + Tf = FNMS(KP500000000, T4, T1); + Th = FMA(KP1_118033988, Tg, Tf); + Tz = FNMS(KP1_118033988, Tg, Tf); + } + { + E Tc, TP, T9, TQ; + T6 = Cr[WS(csr, 2)]; + { + E Ta, Tb, T7, T8; + Ta = Cr[WS(csr, 3)]; + Tb = Cr[WS(csr, 6)]; + Tc = Ta + Tb; + TP = Ta - Tb; + T7 = Cr[0]; + T8 = Cr[WS(csr, 5)]; + T9 = T7 + T8; + TQ = T7 - T8; + } + Tn = T9 - Tc; + TX = FMA(KP618033988, TP, TQ); + TR = FNMS(KP618033988, TQ, TP); + Td = T9 + Tc; + Tm = FNMS(KP250000000, Td, T6); + } + { + E Tu, TK, Tr, TJ; + TI = Ci[WS(csi, 2)]; + { + E Ts, Tt, Tp, Tq; + Ts = Ci[WS(csi, 3)]; + Tt = Ci[WS(csi, 6)]; + Tu = Ts - Tt; + TK = Ts + Tt; + Tp = Ci[0]; + Tq = Ci[WS(csi, 5)]; + Tr = Tp + Tq; + TJ = Tq - Tp; + } + Tv = FMA(KP618033988, Tu, Tr); + TN = TJ + TK; + TD = FNMS(KP618033988, Tr, Tu); + TL = TJ - TK; + TM = FNMS(KP250000000, TL, TI); + } + T12 = TL + TI; + Te = T6 + Td; + T11 = Te - T5; + R0[0] = FMA(KP2_000000000, Te, T5); + R0[WS(rs, 5)] = FMS(KP1_732050807, T12, T11); + R1[WS(rs, 2)] = FMA(KP1_732050807, T12, T11); + { + E TB, TF, TE, TG, TS, TU, TC, TO, TH, TT; + TB = FNMS(KP1_902113032, TA, Tz); + TF = FMA(KP1_902113032, TA, Tz); + TC = FNMS(KP559016994, Tn, Tm); + TE = FMA(KP951056516, TD, TC); + TG = FNMS(KP951056516, TD, TC); + TO = FNMS(KP559016994, TN, TM); + TS = FMA(KP951056516, TR, TO); + TU = FNMS(KP951056516, TR, TO); + R0[WS(rs, 6)] = FMA(KP2_000000000, TE, TB); + R1[WS(rs, 1)] = -(FMA(KP2_000000000, TG, TF)); + TH = TB - TE; + R0[WS(rs, 1)] = FNMS(KP1_732050807, TS, TH); + R1[WS(rs, 3)] = -(FMA(KP1_732050807, TS, TH)); + TT = TF - TG; + R0[WS(rs, 4)] = FNMS(KP1_732050807, TU, TT); + R1[WS(rs, 6)] = -(FMA(KP1_732050807, TU, TT)); + } + { + E Tl, Tx, Tw, Ty, TY, T10, To, TW, TV, TZ; + Tl = FNMS(KP1_902113032, Tk, Th); + Tx = FMA(KP1_902113032, Tk, Th); + To = FMA(KP559016994, Tn, Tm); + Tw = FMA(KP951056516, Tv, To); + Ty = FNMS(KP951056516, Tv, To); + TW = FMA(KP559016994, TN, TM); + TY = FNMS(KP951056516, TX, TW); + T10 = FMA(KP951056516, TX, TW); + R1[WS(rs, 4)] = -(FMA(KP2_000000000, Tw, Tl)); + R0[WS(rs, 3)] = FMA(KP2_000000000, Ty, Tx); + TV = Ty - Tx; + R1[0] = FNMS(KP1_732050807, TY, TV); + R1[WS(rs, 5)] = FMA(KP1_732050807, TY, TV); + TZ = Tl - Tw; + R0[WS(rs, 7)] = FNMS(KP1_732050807, T10, TZ); + R0[WS(rs, 2)] = FMA(KP1_732050807, T10, TZ); + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cbIII_15", {21, 0, 43, 0}, &GENUS }; + +void X(codelet_r2cbIII_15) (planner *p) { + X(kr2c_register) (p, r2cbIII_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 15 -name r2cbIII_15 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 64 FP additions, 26 FP multiplications, + * (or, 49 additions, 11 multiplications, 15 fused multiply/add), + * 47 stack variables, 14 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP433012701, +0.433012701892219323381861585376468091735701313); + DK(KP968245836, +0.968245836551854221294816349945599902708230426); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP1_647278207, +1.647278207092663851754840078556380006059321028); + DK(KP1_018073920, +1.018073920910254366901961726787815297021466329); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E Tv, TD, T5, Ts, TC, T6, Tf, TW, TK, Td, Tg, TP, To, TN, TA; + E TO, TQ, Tt, Tu, T12, Te, T11; + Tt = Ci[WS(csi, 4)]; + Tu = Ci[WS(csi, 1)]; + Tv = FMA(KP1_902113032, Tt, KP1_175570504 * Tu); + TD = FNMS(KP1_175570504, Tt, KP1_902113032 * Tu); + { + E T1, T4, Tq, T2, T3, Tr; + T1 = Cr[WS(csr, 7)]; + T2 = Cr[WS(csr, 4)]; + T3 = Cr[WS(csr, 1)]; + T4 = T2 + T3; + Tq = KP1_118033988 * (T2 - T3); + T5 = FMA(KP2_000000000, T4, T1); + Tr = FNMS(KP500000000, T4, T1); + Ts = Tq + Tr; + TC = Tr - Tq; + } + { + E Tc, TJ, T9, TI; + T6 = Cr[WS(csr, 2)]; + { + E Ta, Tb, T7, T8; + Ta = Cr[WS(csr, 3)]; + Tb = Cr[WS(csr, 6)]; + Tc = Ta + Tb; + TJ = Ta - Tb; + T7 = Cr[0]; + T8 = Cr[WS(csr, 5)]; + T9 = T7 + T8; + TI = T7 - T8; + } + Tf = KP559016994 * (T9 - Tc); + TW = FNMS(KP1_647278207, TJ, KP1_018073920 * TI); + TK = FMA(KP1_647278207, TI, KP1_018073920 * TJ); + Td = T9 + Tc; + Tg = FNMS(KP250000000, Td, T6); + } + { + E Tn, TM, Tk, TL; + TP = Ci[WS(csi, 2)]; + { + E Tl, Tm, Ti, Tj; + Tl = Ci[WS(csi, 3)]; + Tm = Ci[WS(csi, 6)]; + Tn = Tl - Tm; + TM = Tl + Tm; + Ti = Ci[0]; + Tj = Ci[WS(csi, 5)]; + Tk = Ti + Tj; + TL = Ti - Tj; + } + To = FMA(KP951056516, Tk, KP587785252 * Tn); + TN = KP968245836 * (TL - TM); + TA = FNMS(KP587785252, Tk, KP951056516 * Tn); + TO = TL + TM; + TQ = FMA(KP433012701, TO, KP1_732050807 * TP); + } + T12 = KP1_732050807 * (TP - TO); + Te = T6 + Td; + T11 = Te - T5; + R0[0] = FMA(KP2_000000000, Te, T5); + R0[WS(rs, 5)] = T12 - T11; + R1[WS(rs, 2)] = T11 + T12; + { + E TE, TG, TB, TF, TY, T10, Tz, TX, TV, TZ; + TE = TC - TD; + TG = TC + TD; + Tz = Tg - Tf; + TB = Tz + TA; + TF = TA - Tz; + TX = TN + TQ; + TY = TW - TX; + T10 = TW + TX; + R0[WS(rs, 6)] = FMA(KP2_000000000, TB, TE); + R1[WS(rs, 1)] = FMS(KP2_000000000, TF, TG); + TV = TE - TB; + R0[WS(rs, 1)] = TV + TY; + R1[WS(rs, 3)] = TY - TV; + TZ = TF + TG; + R0[WS(rs, 4)] = TZ - T10; + R1[WS(rs, 6)] = -(TZ + T10); + } + { + E Tw, Ty, Tp, Tx, TS, TU, Th, TR, TH, TT; + Tw = Ts - Tv; + Ty = Ts + Tv; + Th = Tf + Tg; + Tp = Th + To; + Tx = Th - To; + TR = TN - TQ; + TS = TK + TR; + TU = TR - TK; + R1[WS(rs, 4)] = -(FMA(KP2_000000000, Tp, Tw)); + R0[WS(rs, 3)] = FMA(KP2_000000000, Tx, Ty); + TH = Tx - Ty; + R1[WS(rs, 5)] = TH - TS; + R1[0] = TH + TS; + TT = Tw - Tp; + R0[WS(rs, 2)] = TT - TU; + R0[WS(rs, 7)] = TT + TU; + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cbIII_15", {49, 11, 15, 0}, &GENUS }; + +void X(codelet_r2cbIII_15) (planner *p) { + X(kr2c_register) (p, r2cbIII_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_16.c new file mode 100644 index 000000000..360fcd5f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_16.c @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:44 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -name r2cbIII_16 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 46 additions, 16 multiplications, 20 fused multiply/add), + * 40 stack variables, 9 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T7, TW, T13, Tj, TA, TK, TP, TH, Te, TX, T12, To, Tt, TC, TS; + E TB, TT, TY; + { + E T3, Tf, Tz, TU, T6, Tw, Ti, TV; + { + E T1, T2, Tx, Ty; + T1 = Cr[0]; + T2 = Cr[WS(csr, 7)]; + T3 = T1 + T2; + Tf = T1 - T2; + Tx = Ci[0]; + Ty = Ci[WS(csi, 7)]; + Tz = Tx + Ty; + TU = Ty - Tx; + } + { + E T4, T5, Tg, Th; + T4 = Cr[WS(csr, 4)]; + T5 = Cr[WS(csr, 3)]; + T6 = T4 + T5; + Tw = T4 - T5; + Tg = Ci[WS(csi, 4)]; + Th = Ci[WS(csi, 3)]; + Ti = Tg + Th; + TV = Th - Tg; + } + T7 = T3 + T6; + TW = TU - TV; + T13 = TV + TU; + Tj = Tf - Ti; + TA = Tw + Tz; + TK = Tw - Tz; + TP = T3 - T6; + TH = Tf + Ti; + } + { + E Ta, Tk, Tn, TR, Td, Tp, Ts, TQ; + { + E T8, T9, Tl, Tm; + T8 = Cr[WS(csr, 2)]; + T9 = Cr[WS(csr, 5)]; + Ta = T8 + T9; + Tk = T8 - T9; + Tl = Ci[WS(csi, 2)]; + Tm = Ci[WS(csi, 5)]; + Tn = Tl + Tm; + TR = Tl - Tm; + } + { + E Tb, Tc, Tq, Tr; + Tb = Cr[WS(csr, 1)]; + Tc = Cr[WS(csr, 6)]; + Td = Tb + Tc; + Tp = Tb - Tc; + Tq = Ci[WS(csi, 1)]; + Tr = Ci[WS(csi, 6)]; + Ts = Tq + Tr; + TQ = Tr - Tq; + } + Te = Ta + Td; + TX = Ta - Td; + T12 = TR + TQ; + To = Tk - Tn; + Tt = Tp - Ts; + TC = Tk + Tn; + TS = TQ - TR; + TB = Tp + Ts; + } + R0[0] = KP2_000000000 * (T7 + Te); + R0[WS(rs, 4)] = KP2_000000000 * (T13 - T12); + TT = TP + TS; + TY = TW - TX; + R0[WS(rs, 1)] = KP1_847759065 * (FMA(KP414213562, TY, TT)); + R0[WS(rs, 5)] = KP1_847759065 * (FNMS(KP414213562, TT, TY)); + { + E T11, T14, TZ, T10; + T11 = T7 - Te; + T14 = T12 + T13; + R0[WS(rs, 2)] = KP1_414213562 * (T11 + T14); + R0[WS(rs, 6)] = KP1_414213562 * (T14 - T11); + TZ = TX + TW; + T10 = TP - TS; + R0[WS(rs, 3)] = KP1_847759065 * (FMA(KP414213562, T10, TZ)); + R0[WS(rs, 7)] = -(KP1_847759065 * (FNMS(KP414213562, TZ, T10))); + } + { + E TJ, TO, TM, TN, TI, TL; + TI = TC + TB; + TJ = FNMS(KP707106781, TI, TH); + TO = FMA(KP707106781, TI, TH); + TL = To - Tt; + TM = FNMS(KP707106781, TL, TK); + TN = FMA(KP707106781, TL, TK); + R1[WS(rs, 1)] = KP1_662939224 * (FMA(KP668178637, TM, TJ)); + R1[WS(rs, 7)] = -(KP1_961570560 * (FNMS(KP198912367, TN, TO))); + R1[WS(rs, 5)] = KP1_662939224 * (FNMS(KP668178637, TJ, TM)); + R1[WS(rs, 3)] = KP1_961570560 * (FMA(KP198912367, TO, TN)); + } + { + E Tv, TG, TE, TF, Tu, TD; + Tu = To + Tt; + Tv = FMA(KP707106781, Tu, Tj); + TG = FNMS(KP707106781, Tu, Tj); + TD = TB - TC; + TE = FNMS(KP707106781, TD, TA); + TF = FMA(KP707106781, TD, TA); + R1[0] = KP1_961570560 * (FNMS(KP198912367, TE, Tv)); + R1[WS(rs, 6)] = -(KP1_662939224 * (FMA(KP668178637, TF, TG))); + R1[WS(rs, 4)] = -(KP1_961570560 * (FMA(KP198912367, Tv, TE))); + R1[WS(rs, 2)] = -(KP1_662939224 * (FNMS(KP668178637, TG, TF))); + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cbIII_16", {46, 16, 20, 0}, &GENUS }; + +void X(codelet_r2cbIII_16) (planner *p) { + X(kr2c_register) (p, r2cbIII_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -name r2cbIII_16 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 54 additions, 20 multiplications, 12 fused multiply/add), + * 40 stack variables, 9 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T7, TW, T13, Tj, TD, TK, TP, TH, Te, TX, T12, To, Tt, Tx, TS; + E Tw, TT, TY; + { + E T3, Tf, TC, TV, T6, Tz, Ti, TU; + { + E T1, T2, TA, TB; + T1 = Cr[0]; + T2 = Cr[WS(csr, 7)]; + T3 = T1 + T2; + Tf = T1 - T2; + TA = Ci[0]; + TB = Ci[WS(csi, 7)]; + TC = TA + TB; + TV = TB - TA; + } + { + E T4, T5, Tg, Th; + T4 = Cr[WS(csr, 4)]; + T5 = Cr[WS(csr, 3)]; + T6 = T4 + T5; + Tz = T4 - T5; + Tg = Ci[WS(csi, 4)]; + Th = Ci[WS(csi, 3)]; + Ti = Tg + Th; + TU = Tg - Th; + } + T7 = T3 + T6; + TW = TU + TV; + T13 = TV - TU; + Tj = Tf - Ti; + TD = Tz + TC; + TK = Tz - TC; + TP = T3 - T6; + TH = Tf + Ti; + } + { + E Ta, Tk, Tn, TR, Td, Tp, Ts, TQ; + { + E T8, T9, Tl, Tm; + T8 = Cr[WS(csr, 2)]; + T9 = Cr[WS(csr, 5)]; + Ta = T8 + T9; + Tk = T8 - T9; + Tl = Ci[WS(csi, 2)]; + Tm = Ci[WS(csi, 5)]; + Tn = Tl + Tm; + TR = Tl - Tm; + } + { + E Tb, Tc, Tq, Tr; + Tb = Cr[WS(csr, 1)]; + Tc = Cr[WS(csr, 6)]; + Td = Tb + Tc; + Tp = Tb - Tc; + Tq = Ci[WS(csi, 1)]; + Tr = Ci[WS(csi, 6)]; + Ts = Tq + Tr; + TQ = Tr - Tq; + } + Te = Ta + Td; + TX = Ta - Td; + T12 = TR + TQ; + To = Tk - Tn; + Tt = Tp - Ts; + Tx = Tp + Ts; + TS = TQ - TR; + Tw = Tk + Tn; + } + R0[0] = KP2_000000000 * (T7 + Te); + R0[WS(rs, 4)] = KP2_000000000 * (T13 - T12); + TT = TP + TS; + TY = TW - TX; + R0[WS(rs, 1)] = FMA(KP1_847759065, TT, KP765366864 * TY); + R0[WS(rs, 5)] = FNMS(KP765366864, TT, KP1_847759065 * TY); + { + E T11, T14, TZ, T10; + T11 = T7 - Te; + T14 = T12 + T13; + R0[WS(rs, 2)] = KP1_414213562 * (T11 + T14); + R0[WS(rs, 6)] = KP1_414213562 * (T14 - T11); + TZ = TP - TS; + T10 = TX + TW; + R0[WS(rs, 3)] = FMA(KP765366864, TZ, KP1_847759065 * T10); + R0[WS(rs, 7)] = FNMS(KP1_847759065, TZ, KP765366864 * T10); + } + { + E TJ, TN, TM, TO, TI, TL; + TI = KP707106781 * (Tw + Tx); + TJ = TH - TI; + TN = TH + TI; + TL = KP707106781 * (To - Tt); + TM = TK - TL; + TO = TL + TK; + R1[WS(rs, 1)] = FMA(KP1_662939224, TJ, KP1_111140466 * TM); + R1[WS(rs, 7)] = FNMS(KP1_961570560, TN, KP390180644 * TO); + R1[WS(rs, 5)] = FNMS(KP1_111140466, TJ, KP1_662939224 * TM); + R1[WS(rs, 3)] = FMA(KP390180644, TN, KP1_961570560 * TO); + } + { + E Tv, TF, TE, TG, Tu, Ty; + Tu = KP707106781 * (To + Tt); + Tv = Tj + Tu; + TF = Tj - Tu; + Ty = KP707106781 * (Tw - Tx); + TE = Ty + TD; + TG = Ty - TD; + R1[0] = FNMS(KP390180644, TE, KP1_961570560 * Tv); + R1[WS(rs, 6)] = FNMS(KP1_662939224, TF, KP1_111140466 * TG); + R1[WS(rs, 4)] = -(FMA(KP390180644, Tv, KP1_961570560 * TE)); + R1[WS(rs, 2)] = FMA(KP1_111140466, TF, KP1_662939224 * TG); + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cbIII_16", {54, 20, 12, 0}, &GENUS }; + +void X(codelet_r2cbIII_16) (planner *p) { + X(kr2c_register) (p, r2cbIII_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_2.c new file mode 100644 index 000000000..e2d3c1fbe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_2.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -name r2cbIII_2 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 0 FP additions, 2 FP multiplications, + * (or, 0 additions, 2 multiplications, 0 fused multiply/add), + * 4 stack variables, 1 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = Cr[0]; + T2 = Ci[0]; + R0[0] = KP2_000000000 * T1; + R1[0] = -(KP2_000000000 * T2); + } + } +} + +static const kr2c_desc desc = { 2, "r2cbIII_2", {0, 2, 0, 0}, &GENUS }; + +void X(codelet_r2cbIII_2) (planner *p) { + X(kr2c_register) (p, r2cbIII_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -name r2cbIII_2 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 0 FP additions, 2 FP multiplications, + * (or, 0 additions, 2 multiplications, 0 fused multiply/add), + * 4 stack variables, 1 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = Cr[0]; + T2 = Ci[0]; + R0[0] = KP2_000000000 * T1; + R1[0] = -(KP2_000000000 * T2); + } + } +} + +static const kr2c_desc desc = { 2, "r2cbIII_2", {0, 2, 0, 0}, &GENUS }; + +void X(codelet_r2cbIII_2) (planner *p) { + X(kr2c_register) (p, r2cbIII_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_20.c new file mode 100644 index 000000000..5c931b66a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_20.c @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:49 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -name r2cbIII_20 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 94 FP additions, 56 FP multiplications, + * (or, 58 additions, 20 multiplications, 36 fused multiply/add), + * 43 stack variables, 6 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T1, Tk, T1l, TZ, T8, Tj, TQ, Ts, TV, TI, TT, TU, Ta, Tv, T1i; + E T1a, Th, Tu, T11, TD, T16, TL, T14, T15; + { + E T7, TY, T4, TX; + T1 = Cr[WS(csr, 2)]; + { + E T5, T6, T2, T3; + T5 = Cr[WS(csr, 9)]; + T6 = Cr[WS(csr, 5)]; + T7 = T5 + T6; + TY = T5 - T6; + T2 = Cr[WS(csr, 6)]; + T3 = Cr[WS(csr, 1)]; + T4 = T2 + T3; + TX = T2 - T3; + } + Tk = T4 - T7; + T1l = FNMS(KP618033988, TX, TY); + TZ = FMA(KP618033988, TY, TX); + T8 = T4 + T7; + Tj = FNMS(KP250000000, T8, T1); + } + { + E Tr, TS, To, TR; + TQ = Ci[WS(csi, 2)]; + { + E Tp, Tq, Tm, Tn; + Tp = Ci[WS(csi, 5)]; + Tq = Ci[WS(csi, 9)]; + Tr = Tp - Tq; + TS = Tp + Tq; + Tm = Ci[WS(csi, 6)]; + Tn = Ci[WS(csi, 1)]; + To = Tm + Tn; + TR = Tm - Tn; + } + Ts = FMA(KP618033988, Tr, To); + TV = TR + TS; + TI = FNMS(KP618033988, To, Tr); + TT = TR - TS; + TU = FNMS(KP250000000, TT, TQ); + } + { + E Tg, T19, Td, T18; + Ta = Cr[WS(csr, 7)]; + { + E Te, Tf, Tb, Tc; + Te = Cr[0]; + Tf = Cr[WS(csr, 4)]; + Tg = Te + Tf; + T19 = Te - Tf; + Tb = Cr[WS(csr, 3)]; + Tc = Cr[WS(csr, 8)]; + Td = Tb + Tc; + T18 = Tb - Tc; + } + Tv = Td - Tg; + T1i = FNMS(KP618033988, T18, T19); + T1a = FMA(KP618033988, T19, T18); + Th = Td + Tg; + Tu = FNMS(KP250000000, Th, Ta); + } + { + E TC, T13, Tz, T12; + T11 = Ci[WS(csi, 7)]; + { + E TA, TB, Tx, Ty; + TA = Ci[WS(csi, 4)]; + TB = Ci[0]; + TC = TA - TB; + T13 = TB + TA; + Tx = Ci[WS(csi, 3)]; + Ty = Ci[WS(csi, 8)]; + Tz = Tx + Ty; + T12 = Tx - Ty; + } + TD = FMA(KP618033988, TC, Tz); + T16 = T12 + T13; + TL = FNMS(KP618033988, Tz, TC); + T14 = T12 - T13; + T15 = FNMS(KP250000000, T14, T11); + } + { + E T9, Ti, T1w, T1t, T1u, T1v; + T9 = T1 + T8; + Ti = Ta + Th; + T1w = T9 - Ti; + T1t = TT + TQ; + T1u = T14 + T11; + T1v = T1t + T1u; + R0[0] = KP2_000000000 * (T9 + Ti); + R0[WS(rs, 5)] = KP2_000000000 * (T1u - T1t); + R1[WS(rs, 2)] = KP1_414213562 * (T1v - T1w); + R1[WS(rs, 7)] = KP1_414213562 * (T1w + T1v); + } + { + E TJ, TN, T1m, T1q, TM, TO, T1j, T1r; + { + E TH, T1k, TK, T1h; + TH = FNMS(KP559016994, Tk, Tj); + TJ = FNMS(KP951056516, TI, TH); + TN = FMA(KP951056516, TI, TH); + T1k = FNMS(KP559016994, TV, TU); + T1m = FNMS(KP951056516, T1l, T1k); + T1q = FMA(KP951056516, T1l, T1k); + TK = FNMS(KP559016994, Tv, Tu); + TM = FMA(KP951056516, TL, TK); + TO = FNMS(KP951056516, TL, TK); + T1h = FNMS(KP559016994, T16, T15); + T1j = FMA(KP951056516, T1i, T1h); + T1r = FNMS(KP951056516, T1i, T1h); + } + R0[WS(rs, 4)] = KP2_000000000 * (TJ + TM); + R0[WS(rs, 6)] = -(KP2_000000000 * (TN + TO)); + R0[WS(rs, 9)] = KP2_000000000 * (T1r - T1q); + R0[WS(rs, 1)] = KP2_000000000 * (T1j - T1m); + { + E T1p, T1s, T1n, T1o; + T1p = TM - TJ; + T1s = T1q + T1r; + R1[WS(rs, 1)] = KP1_414213562 * (T1p - T1s); + R1[WS(rs, 6)] = KP1_414213562 * (T1p + T1s); + T1n = TN - TO; + T1o = T1m + T1j; + R1[WS(rs, 8)] = KP1_414213562 * (T1n - T1o); + R1[WS(rs, 3)] = KP1_414213562 * (T1n + T1o); + } + } + { + E Tt, TF, T1b, T1f, TE, TG, T10, T1e; + { + E Tl, T17, Tw, TW; + Tl = FMA(KP559016994, Tk, Tj); + Tt = FNMS(KP951056516, Ts, Tl); + TF = FMA(KP951056516, Ts, Tl); + T17 = FMA(KP559016994, T16, T15); + T1b = FNMS(KP951056516, T1a, T17); + T1f = FMA(KP951056516, T1a, T17); + Tw = FMA(KP559016994, Tv, Tu); + TE = FMA(KP951056516, TD, Tw); + TG = FNMS(KP951056516, TD, Tw); + TW = FMA(KP559016994, TV, TU); + T10 = FMA(KP951056516, TZ, TW); + T1e = FNMS(KP951056516, TZ, TW); + } + R0[WS(rs, 8)] = KP2_000000000 * (Tt + TE); + R0[WS(rs, 2)] = -(KP2_000000000 * (TF + TG)); + R0[WS(rs, 7)] = KP2_000000000 * (T1e - T1f); + R0[WS(rs, 3)] = KP2_000000000 * (T10 - T1b); + { + E T1d, T1g, TP, T1c; + T1d = TF - TG; + T1g = T1e + T1f; + R1[WS(rs, 4)] = KP1_414213562 * (T1d - T1g); + R1[WS(rs, 9)] = -(KP1_414213562 * (T1d + T1g)); + TP = Tt - TE; + T1c = T10 + T1b; + R1[0] = KP1_414213562 * (TP - T1c); + R1[WS(rs, 5)] = -(KP1_414213562 * (TP + T1c)); + } + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cbIII_20", {58, 20, 36, 0}, &GENUS }; + +void X(codelet_r2cbIII_20) (planner *p) { + X(kr2c_register) (p, r2cbIII_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -name r2cbIII_20 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 94 FP additions, 44 FP multiplications, + * (or, 82 additions, 32 multiplications, 12 fused multiply/add), + * 43 stack variables, 6 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T1, Tj, T1k, T13, T8, Tk, T17, Ts, T16, TI, T18, T19, Ta, Tu, T1i; + E TS, Th, Tv, TX, TD, TV, TL, TW, TY; + { + E T7, T12, T4, T11; + T1 = Cr[WS(csr, 2)]; + { + E T5, T6, T2, T3; + T5 = Cr[WS(csr, 9)]; + T6 = Cr[WS(csr, 5)]; + T7 = T5 + T6; + T12 = T5 - T6; + T2 = Cr[WS(csr, 6)]; + T3 = Cr[WS(csr, 1)]; + T4 = T2 + T3; + T11 = T2 - T3; + } + Tj = KP559016994 * (T4 - T7); + T1k = FNMS(KP951056516, T12, KP587785252 * T11); + T13 = FMA(KP951056516, T11, KP587785252 * T12); + T8 = T4 + T7; + Tk = FNMS(KP250000000, T8, T1); + } + { + E Tr, T15, To, T14; + T17 = Ci[WS(csi, 2)]; + { + E Tp, Tq, Tm, Tn; + Tp = Ci[WS(csi, 5)]; + Tq = Ci[WS(csi, 9)]; + Tr = Tp - Tq; + T15 = Tp + Tq; + Tm = Ci[WS(csi, 6)]; + Tn = Ci[WS(csi, 1)]; + To = Tm + Tn; + T14 = Tm - Tn; + } + Ts = FMA(KP951056516, To, KP587785252 * Tr); + T16 = KP559016994 * (T14 + T15); + TI = FNMS(KP951056516, Tr, KP587785252 * To); + T18 = T14 - T15; + T19 = FNMS(KP250000000, T18, T17); + } + { + E Tg, TR, Td, TQ; + Ta = Cr[WS(csr, 7)]; + { + E Te, Tf, Tb, Tc; + Te = Cr[0]; + Tf = Cr[WS(csr, 4)]; + Tg = Te + Tf; + TR = Te - Tf; + Tb = Cr[WS(csr, 3)]; + Tc = Cr[WS(csr, 8)]; + Td = Tb + Tc; + TQ = Tb - Tc; + } + Tu = KP559016994 * (Td - Tg); + T1i = FNMS(KP951056516, TR, KP587785252 * TQ); + TS = FMA(KP951056516, TQ, KP587785252 * TR); + Th = Td + Tg; + Tv = FNMS(KP250000000, Th, Ta); + } + { + E TC, TU, Tz, TT; + TX = Ci[WS(csi, 7)]; + { + E TA, TB, Tx, Ty; + TA = Ci[WS(csi, 4)]; + TB = Ci[0]; + TC = TA - TB; + TU = TB + TA; + Tx = Ci[WS(csi, 3)]; + Ty = Ci[WS(csi, 8)]; + Tz = Tx + Ty; + TT = Ty - Tx; + } + TD = FMA(KP951056516, Tz, KP587785252 * TC); + TV = KP559016994 * (TT - TU); + TL = FNMS(KP587785252, Tz, KP951056516 * TC); + TW = TT + TU; + TY = FMA(KP250000000, TW, TX); + } + { + E T9, Ti, T1w, T1t, T1u, T1v; + T9 = T1 + T8; + Ti = Ta + Th; + T1w = T9 - Ti; + T1t = T18 + T17; + T1u = TX - TW; + T1v = T1t + T1u; + R0[0] = KP2_000000000 * (T9 + Ti); + R0[WS(rs, 5)] = KP2_000000000 * (T1u - T1t); + R1[WS(rs, 2)] = KP1_414213562 * (T1v - T1w); + R1[WS(rs, 7)] = KP1_414213562 * (T1w + T1v); + } + { + E TJ, TO, T1m, T1q, TM, TN, T1j, T1r; + { + E TH, T1l, TK, T1h; + TH = Tk - Tj; + TJ = TH + TI; + TO = TH - TI; + T1l = T19 - T16; + T1m = T1k + T1l; + T1q = T1l - T1k; + TK = Tv - Tu; + TM = TK + TL; + TN = TL - TK; + T1h = TV + TY; + T1j = T1h - T1i; + T1r = T1i + T1h; + } + R0[WS(rs, 4)] = KP2_000000000 * (TJ + TM); + R0[WS(rs, 6)] = KP2_000000000 * (TN - TO); + R0[WS(rs, 9)] = KP2_000000000 * (T1r - T1q); + R0[WS(rs, 1)] = KP2_000000000 * (T1j - T1m); + { + E T1p, T1s, T1n, T1o; + T1p = TM - TJ; + T1s = T1q + T1r; + R1[WS(rs, 1)] = KP1_414213562 * (T1p - T1s); + R1[WS(rs, 6)] = KP1_414213562 * (T1p + T1s); + T1n = TO + TN; + T1o = T1m + T1j; + R1[WS(rs, 8)] = KP1_414213562 * (T1n - T1o); + R1[WS(rs, 3)] = KP1_414213562 * (T1n + T1o); + } + } + { + E Tt, TG, T1b, T1f, TE, TF, T10, T1e; + { + E Tl, T1a, Tw, TZ; + Tl = Tj + Tk; + Tt = Tl - Ts; + TG = Tl + Ts; + T1a = T16 + T19; + T1b = T13 + T1a; + T1f = T1a - T13; + Tw = Tu + Tv; + TE = Tw + TD; + TF = TD - Tw; + TZ = TV - TY; + T10 = TS + TZ; + T1e = TZ - TS; + } + R0[WS(rs, 8)] = KP2_000000000 * (Tt + TE); + R0[WS(rs, 2)] = KP2_000000000 * (TF - TG); + R0[WS(rs, 7)] = KP2_000000000 * (T1f + T1e); + R0[WS(rs, 3)] = KP2_000000000 * (T1b + T10); + { + E T1d, T1g, TP, T1c; + T1d = TG + TF; + T1g = T1e - T1f; + R1[WS(rs, 4)] = KP1_414213562 * (T1d + T1g); + R1[WS(rs, 9)] = KP1_414213562 * (T1g - T1d); + TP = Tt - TE; + T1c = T10 - T1b; + R1[0] = KP1_414213562 * (TP + T1c); + R1[WS(rs, 5)] = KP1_414213562 * (T1c - TP); + } + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cbIII_20", {82, 32, 12, 0}, &GENUS }; + +void X(codelet_r2cbIII_20) (planner *p) { + X(kr2c_register) (p, r2cbIII_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_25.c new file mode 100644 index 000000000..c2516b05f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_25.c @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:50 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 25 -name r2cbIII_25 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 152 FP additions, 120 FP multiplications, + * (or, 32 additions, 0 multiplications, 120 fused multiply/add), + * 88 stack variables, 44 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP979740652, +0.979740652857618686258237536568998933733477632); + DK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DK(KP438153340, +0.438153340021931793654057951961031291699532119); + DK(KP963507348, +0.963507348203430549974383005744259307057084020); + DK(KP595480289, +0.595480289600000014706716770488118292997907308); + DK(KP641441904, +0.641441904830606407298806329068862424939687989); + DK(KP1_606007150, +1.606007150877320829666881187140752009270929701); + DK(KP1_721083328, +1.721083328735889354196523361841037632825608373); + DK(KP1_011627398, +1.011627398597394192215998921771049272931807941); + DK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DK(KP452413526, +0.452413526233009763856834323966348796985206956); + DK(KP933137358, +0.933137358350283770603023973254446451924190884); + DK(KP576710603, +0.576710603632765877371579268136471017090111488); + DK(KP662318342, +0.662318342759882818626911127577439236802190210); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP1_842354653, +1.842354653930286640500894870830132058718564461); + DK(KP1_666834356, +1.666834356657377354817925100486477686277992119); + DK(KP1_082908895, +1.082908895072625554092571180165639018104066379); + DK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DK(KP484291580, +0.484291580564315559745084187732367906918006201); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP1_386580726, +1.386580726567734802700860150804827247498955921); + DK(KP1_898359647, +1.898359647016882523151110931686726543423167685); + DK(KP1_115827804, +1.115827804063668528375399296931134075984874304); + DK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DK(KP499013364, +0.499013364214135780976168403431725276668452610); + DK(KP730409924, +0.730409924561256563751459444999838399157094302); + DK(KP451418159, +0.451418159099103183892477933432151804893354132); + DK(KP846146756, +0.846146756728608505452954290121135880883743802); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E TS, T1O, T5, TP, T1N, Tz, Ty, Te, T17, T2i, T1B, T1V, T10, T2h, T1C; + E T1S, TI, TH, Tn, T1m, T2e, T1y, T1Z, T1f, T2f, T1z, T22, TQ, TR; + TQ = Ci[WS(csi, 7)]; + TR = Ci[WS(csi, 2)]; + TS = FMA(KP618033988, TR, TQ); + T1O = FNMS(KP618033988, TQ, TR); + { + E T1, T4, TO, T2, T3, TN; + T1 = Cr[WS(csr, 12)]; + T2 = Cr[WS(csr, 7)]; + T3 = Cr[WS(csr, 2)]; + T4 = T2 + T3; + TO = T3 - T2; + T5 = FMA(KP2_000000000, T4, T1); + TN = FNMS(KP500000000, T4, T1); + TP = FNMS(KP1_118033988, TO, TN); + T1N = FMA(KP1_118033988, TO, TN); + } + { + E T6, Td, T15, TV, T14, T12, TX, TY; + T6 = Cr[WS(csr, 11)]; + Tz = Ci[WS(csi, 11)]; + { + E T7, T8, T9, Ta, Tb, Tc; + T7 = Cr[WS(csr, 6)]; + T8 = Cr[WS(csr, 8)]; + T9 = T7 + T8; + Ta = Cr[WS(csr, 1)]; + Tb = Cr[WS(csr, 3)]; + Tc = Ta + Tb; + Td = T9 + Tc; + T15 = Tb - Ta; + TV = Tc - T9; + T14 = T8 - T7; + } + { + E Ts, Tt, Tu, Tv, Tw, Tx; + Ts = Ci[WS(csi, 8)]; + Tt = Ci[WS(csi, 6)]; + Tu = Ts - Tt; + Tv = Ci[WS(csi, 3)]; + Tw = Ci[WS(csi, 1)]; + Tx = Tv - Tw; + Ty = Tu + Tx; + T12 = Tx - Tu; + TX = Tt + Ts; + TY = Tw + Tv; + } + Te = T6 + Td; + { + E T16, T1U, T13, T1T, T11; + T16 = FMA(KP618033988, T15, T14); + T1U = FNMS(KP618033988, T14, T15); + T11 = FMA(KP250000000, Ty, Tz); + T13 = FMA(KP559016994, T12, T11); + T1T = FNMS(KP559016994, T12, T11); + T17 = FMA(KP951056516, T16, T13); + T2i = FMA(KP951056516, T1U, T1T); + T1B = FNMS(KP951056516, T16, T13); + T1V = FNMS(KP951056516, T1U, T1T); + } + { + E TZ, T1R, TW, T1Q, TU; + TZ = FMA(KP618033988, TY, TX); + T1R = FNMS(KP618033988, TX, TY); + TU = FMS(KP250000000, Td, T6); + TW = FMA(KP559016994, TV, TU); + T1Q = FNMS(KP559016994, TV, TU); + T10 = FNMS(KP951056516, TZ, TW); + T2h = FNMS(KP951056516, T1R, T1Q); + T1C = FMA(KP951056516, TZ, TW); + T1S = FMA(KP951056516, T1R, T1Q); + } + } + { + E Tf, Tm, T1k, T1a, T1j, T1h, T1c, T1d; + Tf = Cr[WS(csr, 10)]; + TI = Ci[WS(csi, 10)]; + { + E Tg, Th, Ti, Tj, Tk, Tl; + Tg = Cr[WS(csr, 5)]; + Th = Cr[WS(csr, 9)]; + Ti = Tg + Th; + Tj = Cr[0]; + Tk = Cr[WS(csr, 4)]; + Tl = Tj + Tk; + Tm = Ti + Tl; + T1k = Tk - Tj; + T1a = Ti - Tl; + T1j = Tg - Th; + } + { + E TB, TC, TD, TE, TF, TG; + TB = Ci[WS(csi, 9)]; + TC = Ci[WS(csi, 5)]; + TD = TB - TC; + TE = Ci[WS(csi, 4)]; + TF = Ci[0]; + TG = TE - TF; + TH = TD + TG; + T1h = TD - TG; + T1c = TC + TB; + T1d = TF + TE; + } + Tn = Tf + Tm; + { + E T1l, T1Y, T1i, T1X, T1g; + T1l = FNMS(KP618033988, T1k, T1j); + T1Y = FMA(KP618033988, T1j, T1k); + T1g = FMA(KP250000000, TH, TI); + T1i = FNMS(KP559016994, T1h, T1g); + T1X = FMA(KP559016994, T1h, T1g); + T1m = FNMS(KP951056516, T1l, T1i); + T2e = FMA(KP951056516, T1Y, T1X); + T1y = FMA(KP951056516, T1l, T1i); + T1Z = FNMS(KP951056516, T1Y, T1X); + } + { + E T1e, T21, T1b, T20, T19; + T1e = FMA(KP618033988, T1d, T1c); + T21 = FNMS(KP618033988, T1c, T1d); + T19 = FMS(KP250000000, Tm, Tf); + T1b = FNMS(KP559016994, T1a, T19); + T20 = FMA(KP559016994, T1a, T19); + T1f = FNMS(KP951056516, T1e, T1b); + T2f = FNMS(KP951056516, T21, T20); + T1z = FMA(KP951056516, T1e, T1b); + T22 = FMA(KP951056516, T21, T20); + } + } + { + E Tq, To, Tp, TK, TM, TA, TJ, TL, Tr; + Tq = Tn - Te; + To = Te + Tn; + Tp = FNMS(KP500000000, To, T5); + TA = Ty - Tz; + TJ = TH - TI; + TK = FMA(KP618033988, TJ, TA); + TM = FNMS(KP618033988, TA, TJ); + R0[0] = FMA(KP2_000000000, To, T5); + TL = FMA(KP1_118033988, Tq, Tp); + R0[WS(rs, 5)] = FMA(KP1_902113032, TM, TL); + R1[WS(rs, 7)] = FMS(KP1_902113032, TM, TL); + Tr = FNMS(KP1_118033988, Tq, Tp); + R1[WS(rs, 2)] = FMS(KP1_902113032, TK, Tr); + R0[WS(rs, 10)] = FMA(KP1_902113032, TK, Tr); + } + { + E T2q, T2s, T2d, T2k, T2l, T2m, T2r, T2n; + { + E T2o, T2p, T2g, T2j; + T2o = FMA(KP939062505, T2h, T2i); + T2p = FMA(KP062914667, T2e, T2f); + T2q = FMA(KP846146756, T2p, T2o); + T2s = FNMS(KP451418159, T2o, T2p); + T2d = FMA(KP1_902113032, T1O, T1N); + T2g = FNMS(KP062914667, T2f, T2e); + T2j = FNMS(KP939062505, T2i, T2h); + T2k = FNMS(KP730409924, T2j, T2g); + T2l = FNMS(KP499013364, T2k, T2d); + T2m = FMA(KP730409924, T2j, T2g); + } + R1[WS(rs, 1)] = -(FMA(KP1_996053456, T2k, T2d)); + T2r = FMA(KP1_115827804, T2m, T2l); + R1[WS(rs, 6)] = FMS(KP1_898359647, T2s, T2r); + R0[WS(rs, 9)] = FMA(KP1_898359647, T2s, T2r); + T2n = FNMS(KP1_115827804, T2m, T2l); + R0[WS(rs, 4)] = FMA(KP1_386580726, T2q, T2n); + R1[WS(rs, 11)] = FMS(KP1_386580726, T2q, T2n); + } + { + E T1u, T1w, TT, T1o, T1p, T1q, T1v, T1r; + { + E T1s, T1t, T18, T1n; + T1s = FMA(KP256756360, T10, T17); + T1t = FMA(KP549754652, T1f, T1m); + T1u = FMA(KP559154169, T1t, T1s); + T1w = FNMS(KP683113946, T1s, T1t); + TT = FMA(KP1_902113032, TS, TP); + T18 = FNMS(KP256756360, T17, T10); + T1n = FNMS(KP549754652, T1m, T1f); + T1o = FMA(KP904730450, T1n, T18); + T1p = FMA(KP484291580, T1o, TT); + T1q = FNMS(KP904730450, T1n, T18); + } + R1[0] = FMS(KP1_937166322, T1o, TT); + T1v = FMA(KP1_082908895, T1q, T1p); + R1[WS(rs, 5)] = FMS(KP1_666834356, T1w, T1v); + R0[WS(rs, 8)] = FMA(KP1_666834356, T1w, T1v); + T1r = FNMS(KP1_082908895, T1q, T1p); + R0[WS(rs, 3)] = FMA(KP1_842354653, T1u, T1r); + R1[WS(rs, 10)] = FMS(KP1_842354653, T1u, T1r); + } + { + E T1K, T1M, T1x, T1E, T1F, T1G, T1L, T1H; + { + E T1I, T1J, T1A, T1D; + T1I = FMA(KP634619297, T1B, T1C); + T1J = FNMS(KP470564281, T1y, T1z); + T1K = FMA(KP662318342, T1J, T1I); + T1M = FNMS(KP576710603, T1I, T1J); + T1x = FNMS(KP1_902113032, TS, TP); + T1A = FMA(KP470564281, T1z, T1y); + T1D = FNMS(KP634619297, T1C, T1B); + T1E = FMA(KP933137358, T1D, T1A); + T1F = FNMS(KP452413526, T1E, T1x); + T1G = FNMS(KP933137358, T1D, T1A); + } + R0[WS(rs, 2)] = FMA(KP1_809654104, T1E, T1x); + T1L = FMA(KP1_011627398, T1G, T1F); + R0[WS(rs, 7)] = FNMS(KP1_721083328, T1M, T1L); + R1[WS(rs, 9)] = -(FMA(KP1_721083328, T1M, T1L)); + T1H = FNMS(KP1_011627398, T1G, T1F); + R1[WS(rs, 4)] = -(FMA(KP1_606007150, T1K, T1H)); + R0[WS(rs, 12)] = FNMS(KP1_606007150, T1K, T1H); + } + { + E T2a, T2c, T1P, T24, T25, T26, T2b, T27; + { + E T28, T29, T1W, T23; + T28 = FMA(KP634619297, T1Z, T22); + T29 = FMA(KP549754652, T1S, T1V); + T2a = FNMS(KP641441904, T29, T28); + T2c = FMA(KP595480289, T28, T29); + T1P = FNMS(KP1_902113032, T1O, T1N); + T1W = FNMS(KP549754652, T1V, T1S); + T23 = FNMS(KP634619297, T22, T1Z); + T24 = FNMS(KP963507348, T23, T1W); + T25 = FMA(KP438153340, T24, T1P); + T26 = FMA(KP963507348, T23, T1W); + } + R0[WS(rs, 1)] = FNMS(KP1_752613360, T24, T1P); + T2b = FNMS(KP979740652, T26, T25); + R0[WS(rs, 11)] = FNMS(KP1_666834356, T2c, T2b); + R1[WS(rs, 3)] = -(FMA(KP1_666834356, T2c, T2b)); + T27 = FMA(KP979740652, T26, T25); + R0[WS(rs, 6)] = FNMS(KP1_606007150, T2a, T27); + R1[WS(rs, 8)] = -(FMA(KP1_606007150, T2a, T27)); + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cbIII_25", {32, 0, 120, 0}, &GENUS }; + +void X(codelet_r2cbIII_25) (planner *p) { + X(kr2c_register) (p, r2cbIII_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 25 -name r2cbIII_25 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 152 FP additions, 98 FP multiplications, + * (or, 100 additions, 46 multiplications, 52 fused multiply/add), + * 65 stack variables, 21 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E TS, T1O, T5, TP, T1N, TI, TH, Te, T17, T2h, T1y, T1V, T10, T2g, T1x; + E T1S, Tz, Ty, Tn, T1m, T2e, T1B, T22, T1f, T2d, T1A, T1Z, TQ, TR; + TQ = Ci[WS(csi, 2)]; + TR = Ci[WS(csi, 7)]; + TS = FNMS(KP1_175570504, TR, KP1_902113032 * TQ); + T1O = FMA(KP1_902113032, TR, KP1_175570504 * TQ); + { + E T1, T4, TN, T2, T3, TO; + T1 = Cr[WS(csr, 12)]; + T2 = Cr[WS(csr, 7)]; + T3 = Cr[WS(csr, 2)]; + T4 = T2 + T3; + TN = KP1_118033988 * (T3 - T2); + T5 = FMA(KP2_000000000, T4, T1); + TO = FMS(KP500000000, T4, T1); + TP = TN - TO; + T1N = TO + TN; + } + { + E T6, Td, T15, TU, T14, T11, TX, TY; + T6 = Cr[WS(csr, 11)]; + TI = Ci[WS(csi, 11)]; + { + E T7, T8, T9, Ta, Tb, Tc; + T7 = Cr[WS(csr, 6)]; + T8 = Cr[WS(csr, 8)]; + T9 = T7 + T8; + Ta = Cr[WS(csr, 1)]; + Tb = Cr[WS(csr, 3)]; + Tc = Ta + Tb; + Td = T9 + Tc; + T15 = Ta - Tb; + TU = KP559016994 * (Tc - T9); + T14 = T8 - T7; + } + { + E TB, TC, TD, TE, TF, TG; + TB = Ci[WS(csi, 6)]; + TC = Ci[WS(csi, 8)]; + TD = TB - TC; + TE = Ci[WS(csi, 1)]; + TF = Ci[WS(csi, 3)]; + TG = TE - TF; + TH = TD + TG; + T11 = KP559016994 * (TD - TG); + TX = TB + TC; + TY = TE + TF; + } + Te = T6 + Td; + { + E T16, T1T, T13, T1U, T12; + T16 = FMA(KP587785252, T14, KP951056516 * T15); + T1T = FNMS(KP587785252, T15, KP951056516 * T14); + T12 = FNMS(KP250000000, TH, TI); + T13 = T11 - T12; + T1U = T11 + T12; + T17 = T13 - T16; + T2h = T1T - T1U; + T1y = T16 + T13; + T1V = T1T + T1U; + } + { + E TZ, T1R, TW, T1Q, TV; + TZ = FNMS(KP951056516, TY, KP587785252 * TX); + T1R = FMA(KP951056516, TX, KP587785252 * TY); + TV = FMS(KP250000000, Td, T6); + TW = TU - TV; + T1Q = TV + TU; + T10 = TW + TZ; + T2g = T1Q + T1R; + T1x = TZ - TW; + T1S = T1Q - T1R; + } + } + { + E Tf, Tm, T1k, T19, T1j, T1g, T1c, T1d; + Tf = Cr[WS(csr, 10)]; + Tz = Ci[WS(csi, 10)]; + { + E Tg, Th, Ti, Tj, Tk, Tl; + Tg = Cr[WS(csr, 5)]; + Th = Cr[WS(csr, 9)]; + Ti = Tg + Th; + Tj = Cr[0]; + Tk = Cr[WS(csr, 4)]; + Tl = Tj + Tk; + Tm = Ti + Tl; + T1k = Tj - Tk; + T19 = KP559016994 * (Tl - Ti); + T1j = Th - Tg; + } + { + E Ts, Tt, Tu, Tv, Tw, Tx; + Ts = Ci[WS(csi, 4)]; + Tt = Ci[0]; + Tu = Ts - Tt; + Tv = Ci[WS(csi, 5)]; + Tw = Ci[WS(csi, 9)]; + Tx = Tv - Tw; + Ty = Tu - Tx; + T1g = KP559016994 * (Tx + Tu); + T1c = Tv + Tw; + T1d = Tt + Ts; + } + Tn = Tf + Tm; + { + E T1l, T20, T1i, T21, T1h; + T1l = FMA(KP587785252, T1j, KP951056516 * T1k); + T20 = FNMS(KP587785252, T1k, KP951056516 * T1j); + T1h = FMA(KP250000000, Ty, Tz); + T1i = T1g - T1h; + T21 = T1g + T1h; + T1m = T1i - T1l; + T2e = T21 - T20; + T1B = T1l + T1i; + T22 = T20 + T21; + } + { + E T1e, T1Y, T1b, T1X, T1a; + T1e = FNMS(KP951056516, T1d, KP587785252 * T1c); + T1Y = FMA(KP951056516, T1c, KP587785252 * T1d); + T1a = FMS(KP250000000, Tm, Tf); + T1b = T19 - T1a; + T1X = T1a + T19; + T1f = T1b + T1e; + T2d = T1X + T1Y; + T1A = T1e - T1b; + T1Z = T1X - T1Y; + } + } + { + E Tq, To, Tp, TK, TM, TA, TJ, TL, Tr; + Tq = KP1_118033988 * (Tn - Te); + To = Te + Tn; + Tp = FMS(KP500000000, To, T5); + TA = Ty - Tz; + TJ = TH + TI; + TK = FNMS(KP1_902113032, TJ, KP1_175570504 * TA); + TM = FMA(KP1_175570504, TJ, KP1_902113032 * TA); + R0[0] = FMA(KP2_000000000, To, T5); + TL = Tq - Tp; + R0[WS(rs, 5)] = TL + TM; + R1[WS(rs, 7)] = TM - TL; + Tr = Tp + Tq; + R1[WS(rs, 2)] = Tr + TK; + R0[WS(rs, 10)] = TK - Tr; + } + { + E T2q, T2s, T2k, T2j, T2l, T2m, T2r, T2n; + { + E T2o, T2p, T2f, T2i; + T2o = FNMS(KP904827052, T2d, KP425779291 * T2e); + T2p = FNMS(KP535826794, T2h, KP844327925 * T2g); + T2q = FNMS(KP1_902113032, T2p, KP1_175570504 * T2o); + T2s = FMA(KP1_175570504, T2p, KP1_902113032 * T2o); + T2k = T1N + T1O; + T2f = FMA(KP425779291, T2d, KP904827052 * T2e); + T2i = FMA(KP535826794, T2g, KP844327925 * T2h); + T2j = T2f - T2i; + T2l = FMA(KP500000000, T2j, T2k); + T2m = KP1_118033988 * (T2i + T2f); + } + R0[WS(rs, 2)] = FMS(KP2_000000000, T2j, T2k); + T2r = T2m - T2l; + R0[WS(rs, 7)] = T2r + T2s; + R1[WS(rs, 9)] = T2s - T2r; + T2n = T2l + T2m; + R1[WS(rs, 4)] = T2n + T2q; + R0[WS(rs, 12)] = T2q - T2n; + } + { + E T1u, T1w, TT, T1o, T1p, T1q, T1v, T1r; + { + E T1s, T1t, T18, T1n; + T1s = FMA(KP481753674, T10, KP876306680 * T17); + T1t = FMA(KP844327925, T1f, KP535826794 * T1m); + T1u = FMA(KP1_902113032, T1s, KP1_175570504 * T1t); + T1w = FNMS(KP1_175570504, T1s, KP1_902113032 * T1t); + TT = TP - TS; + T18 = FNMS(KP481753674, T17, KP876306680 * T10); + T1n = FNMS(KP844327925, T1m, KP535826794 * T1f); + T1o = T18 + T1n; + T1p = FMS(KP500000000, T1o, TT); + T1q = KP1_118033988 * (T1n - T18); + } + R0[WS(rs, 1)] = FMA(KP2_000000000, T1o, TT); + T1v = T1q - T1p; + R0[WS(rs, 6)] = T1v + T1w; + R1[WS(rs, 8)] = T1w - T1v; + T1r = T1p + T1q; + R1[WS(rs, 3)] = T1r + T1u; + R0[WS(rs, 11)] = T1u - T1r; + } + { + E T1H, T1L, T1E, T1D, T1I, T1J, T1M, T1K; + { + E T1F, T1G, T1z, T1C; + T1F = FNMS(KP062790519, T1B, KP998026728 * T1A); + T1G = FNMS(KP684547105, T1x, KP728968627 * T1y); + T1H = FNMS(KP1_902113032, T1G, KP1_175570504 * T1F); + T1L = FMA(KP1_175570504, T1G, KP1_902113032 * T1F); + T1E = TP + TS; + T1z = FMA(KP728968627, T1x, KP684547105 * T1y); + T1C = FMA(KP062790519, T1A, KP998026728 * T1B); + T1D = T1z + T1C; + T1I = FMA(KP500000000, T1D, T1E); + T1J = KP1_118033988 * (T1C - T1z); + } + R1[WS(rs, 1)] = FMS(KP2_000000000, T1D, T1E); + T1M = T1J - T1I; + R0[WS(rs, 9)] = T1L - T1M; + R1[WS(rs, 6)] = T1L + T1M; + T1K = T1I + T1J; + R1[WS(rs, 11)] = T1H - T1K; + R0[WS(rs, 4)] = T1H + T1K; + } + { + E T2a, T2c, T1P, T24, T25, T26, T2b, T27; + { + E T28, T29, T1W, T23; + T28 = FMA(KP248689887, T1S, KP968583161 * T1V); + T29 = FMA(KP481753674, T1Z, KP876306680 * T22); + T2a = FMA(KP1_902113032, T28, KP1_175570504 * T29); + T2c = FNMS(KP1_175570504, T28, KP1_902113032 * T29); + T1P = T1N - T1O; + T1W = FNMS(KP248689887, T1V, KP968583161 * T1S); + T23 = FNMS(KP481753674, T22, KP876306680 * T1Z); + T24 = T1W + T23; + T25 = FMS(KP500000000, T24, T1P); + T26 = KP1_118033988 * (T23 - T1W); + } + R1[0] = FMA(KP2_000000000, T24, T1P); + T2b = T26 - T25; + R1[WS(rs, 5)] = T2b + T2c; + R0[WS(rs, 8)] = T2c - T2b; + T27 = T25 + T26; + R0[WS(rs, 3)] = T27 + T2a; + R1[WS(rs, 10)] = T2a - T27; + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cbIII_25", {100, 46, 52, 0}, &GENUS }; + +void X(codelet_r2cbIII_25) (planner *p) { + X(kr2c_register) (p, r2cbIII_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_3.c new file mode 100644 index 000000000..cf6aace73 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_3.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 3 -name r2cbIII_3 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 4 FP additions, 3 FP multiplications, + * (or, 1 additions, 0 multiplications, 3 fused multiply/add), + * 7 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T4, T1, T2, T3; + T4 = Ci[0]; + T1 = Cr[WS(csr, 1)]; + T2 = Cr[0]; + T3 = T2 - T1; + R0[0] = FMA(KP2_000000000, T2, T1); + R0[WS(rs, 1)] = -(FMA(KP1_732050807, T4, T3)); + R1[0] = FNMS(KP1_732050807, T4, T3); + } + } +} + +static const kr2c_desc desc = { 3, "r2cbIII_3", {1, 0, 3, 0}, &GENUS }; + +void X(codelet_r2cbIII_3) (planner *p) { + X(kr2c_register) (p, r2cbIII_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 3 -name r2cbIII_3 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 4 FP additions, 2 FP multiplications, + * (or, 3 additions, 1 multiplications, 1 fused multiply/add), + * 8 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T5, T1, T2, T3, T4; + T4 = Ci[0]; + T5 = KP1_732050807 * T4; + T1 = Cr[WS(csr, 1)]; + T2 = Cr[0]; + T3 = T2 - T1; + R0[0] = FMA(KP2_000000000, T2, T1); + R0[WS(rs, 1)] = -(T3 + T5); + R1[0] = T3 - T5; + } + } +} + +static const kr2c_desc desc = { 3, "r2cbIII_3", {3, 1, 1, 0}, &GENUS }; + +void X(codelet_r2cbIII_3) (planner *p) { + X(kr2c_register) (p, r2cbIII_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_32.c new file mode 100644 index 000000000..32d3f79c3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_32.c @@ -0,0 +1,713 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:45 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -name r2cbIII_32 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 106 additions, 32 multiplications, 68 fused multiply/add), + * 65 stack variables, 18 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T7, T2i, T2E, Tz, T1e, T1I, T1Z, T1x, Te, T22, T2F, T2j, T1h, T1y, TK; + E T1J, Tm, T2B, TW, T1k, T1C, T1M, T28, T2m, Tt, T2A, T17, T1j, T1F, T1L; + E T2d, T2l; + { + E T3, Tv, T1d, T2g, T6, T1a, Ty, T2h; + { + E T1, T2, T1b, T1c; + T1 = Cr[0]; + T2 = Cr[WS(csr, 15)]; + T3 = T1 + T2; + Tv = T1 - T2; + T1b = Ci[0]; + T1c = Ci[WS(csi, 15)]; + T1d = T1b + T1c; + T2g = T1c - T1b; + } + { + E T4, T5, Tw, Tx; + T4 = Cr[WS(csr, 8)]; + T5 = Cr[WS(csr, 7)]; + T6 = T4 + T5; + T1a = T4 - T5; + Tw = Ci[WS(csi, 8)]; + Tx = Ci[WS(csi, 7)]; + Ty = Tw + Tx; + T2h = Tx - Tw; + } + T7 = T3 + T6; + T2i = T2g - T2h; + T2E = T2h + T2g; + Tz = Tv - Ty; + T1e = T1a + T1d; + T1I = T1a - T1d; + T1Z = T3 - T6; + T1x = Tv + Ty; + } + { + E Ta, TA, TD, T20, Td, TF, TI, T21; + { + E T8, T9, TB, TC; + T8 = Cr[WS(csr, 4)]; + T9 = Cr[WS(csr, 11)]; + Ta = T8 + T9; + TA = T8 - T9; + TB = Ci[WS(csi, 4)]; + TC = Ci[WS(csi, 11)]; + TD = TB + TC; + T20 = TC - TB; + } + { + E Tb, Tc, TG, TH; + Tb = Cr[WS(csr, 3)]; + Tc = Cr[WS(csr, 12)]; + Td = Tb + Tc; + TF = Tb - Tc; + TG = Ci[WS(csi, 3)]; + TH = Ci[WS(csi, 12)]; + TI = TG + TH; + T21 = TG - TH; + } + Te = Ta + Td; + T22 = T20 - T21; + T2F = T20 + T21; + T2j = Ta - Td; + { + E T1f, T1g, TE, TJ; + T1f = TF + TI; + T1g = TA + TD; + T1h = T1f - T1g; + T1y = T1g + T1f; + TE = TA - TD; + TJ = TF - TI; + TK = TE + TJ; + T1J = TE - TJ; + } + } + { + E Ti, TM, TU, T25, Tl, TR, TP, T26, TQ, TV; + { + E Tg, Th, TS, TT; + Tg = Cr[WS(csr, 2)]; + Th = Cr[WS(csr, 13)]; + Ti = Tg + Th; + TM = Tg - Th; + TS = Ci[WS(csi, 2)]; + TT = Ci[WS(csi, 13)]; + TU = TS + TT; + T25 = TS - TT; + } + { + E Tj, Tk, TN, TO; + Tj = Cr[WS(csr, 10)]; + Tk = Cr[WS(csr, 5)]; + Tl = Tj + Tk; + TR = Tj - Tk; + TN = Ci[WS(csi, 10)]; + TO = Ci[WS(csi, 5)]; + TP = TN + TO; + T26 = TN - TO; + } + Tm = Ti + Tl; + T2B = T26 + T25; + TQ = TM - TP; + TV = TR + TU; + TW = FNMS(KP414213562, TV, TQ); + T1k = FMA(KP414213562, TQ, TV); + { + E T1A, T1B, T24, T27; + T1A = TR - TU; + T1B = TM + TP; + T1C = FMA(KP414213562, T1B, T1A); + T1M = FNMS(KP414213562, T1A, T1B); + T24 = Ti - Tl; + T27 = T25 - T26; + T28 = T24 - T27; + T2m = T24 + T27; + } + } + { + E Tp, TX, T14, T2a, Ts, T15, T10, T2b, T11, T16; + { + E Tn, To, T12, T13; + Tn = Cr[WS(csr, 1)]; + To = Cr[WS(csr, 14)]; + Tp = Tn + To; + TX = Tn - To; + T12 = Ci[WS(csi, 1)]; + T13 = Ci[WS(csi, 14)]; + T14 = T12 + T13; + T2a = T13 - T12; + } + { + E Tq, Tr, TY, TZ; + Tq = Cr[WS(csr, 6)]; + Tr = Cr[WS(csr, 9)]; + Ts = Tq + Tr; + T15 = Tq - Tr; + TY = Ci[WS(csi, 6)]; + TZ = Ci[WS(csi, 9)]; + T10 = TY + TZ; + T2b = TY - TZ; + } + Tt = Tp + Ts; + T2A = T2b + T2a; + T11 = TX - T10; + T16 = T14 - T15; + T17 = FNMS(KP414213562, T16, T11); + T1j = FMA(KP414213562, T11, T16); + { + E T1D, T1E, T29, T2c; + T1D = T15 + T14; + T1E = TX + T10; + T1F = FNMS(KP414213562, T1E, T1D); + T1L = FMA(KP414213562, T1D, T1E); + T29 = Tp - Ts; + T2c = T2a - T2b; + T2d = T29 + T2c; + T2l = T29 - T2c; + } + } + { + E Tf, Tu, T2L, T2M, T2N, T2O; + Tf = T7 + Te; + Tu = Tm + Tt; + T2L = Tf - Tu; + T2M = T2B + T2A; + T2N = T2F + T2E; + T2O = T2M + T2N; + R0[0] = KP2_000000000 * (Tf + Tu); + R0[WS(rs, 8)] = KP2_000000000 * (T2N - T2M); + R0[WS(rs, 4)] = KP1_414213562 * (T2L + T2O); + R0[WS(rs, 12)] = KP1_414213562 * (T2O - T2L); + } + { + E T2t, T2y, T2w, T2x; + { + E T2r, T2s, T2u, T2v; + T2r = T1Z - T22; + T2s = T2m + T2l; + T2t = FNMS(KP707106781, T2s, T2r); + T2y = FMA(KP707106781, T2s, T2r); + T2u = T2j + T2i; + T2v = T28 - T2d; + T2w = FNMS(KP707106781, T2v, T2u); + T2x = FMA(KP707106781, T2v, T2u); + } + R0[WS(rs, 3)] = KP1_662939224 * (FMA(KP668178637, T2w, T2t)); + R0[WS(rs, 15)] = -(KP1_961570560 * (FNMS(KP198912367, T2x, T2y))); + R0[WS(rs, 11)] = KP1_662939224 * (FNMS(KP668178637, T2t, T2w)); + R0[WS(rs, 7)] = KP1_961570560 * (FMA(KP198912367, T2y, T2x)); + } + { + E T2D, T2K, T2I, T2J; + { + E T2z, T2C, T2G, T2H; + T2z = T7 - Te; + T2C = T2A - T2B; + T2D = T2z + T2C; + T2K = T2z - T2C; + T2G = T2E - T2F; + T2H = Tm - Tt; + T2I = T2G - T2H; + T2J = T2H + T2G; + } + R0[WS(rs, 2)] = KP1_847759065 * (FMA(KP414213562, T2I, T2D)); + R0[WS(rs, 14)] = -(KP1_847759065 * (FNMS(KP414213562, T2J, T2K))); + R0[WS(rs, 10)] = KP1_847759065 * (FNMS(KP414213562, T2D, T2I)); + R0[WS(rs, 6)] = KP1_847759065 * (FMA(KP414213562, T2K, T2J)); + } + { + E T19, T1o, T1m, T1n; + { + E TL, T18, T1i, T1l; + TL = FMA(KP707106781, TK, Tz); + T18 = TW + T17; + T19 = FMA(KP923879532, T18, TL); + T1o = FNMS(KP923879532, T18, TL); + T1i = FNMS(KP707106781, T1h, T1e); + T1l = T1j - T1k; + T1m = FNMS(KP923879532, T1l, T1i); + T1n = FMA(KP923879532, T1l, T1i); + } + R1[0] = KP1_990369453 * (FNMS(KP098491403, T1m, T19)); + R1[WS(rs, 12)] = -(KP1_546020906 * (FMA(KP820678790, T1n, T1o))); + R1[WS(rs, 8)] = -(KP1_990369453 * (FMA(KP098491403, T19, T1m))); + R1[WS(rs, 4)] = -(KP1_546020906 * (FNMS(KP820678790, T1o, T1n))); + } + { + E T1r, T1w, T1u, T1v; + { + E T1p, T1q, T1s, T1t; + T1p = FNMS(KP707106781, TK, Tz); + T1q = T1k + T1j; + T1r = FNMS(KP923879532, T1q, T1p); + T1w = FMA(KP923879532, T1q, T1p); + T1s = FMA(KP707106781, T1h, T1e); + T1t = TW - T17; + T1u = FMA(KP923879532, T1t, T1s); + T1v = FNMS(KP923879532, T1t, T1s); + } + R1[WS(rs, 2)] = KP1_763842528 * (FNMS(KP534511135, T1u, T1r)); + R1[WS(rs, 14)] = -(KP1_913880671 * (FMA(KP303346683, T1v, T1w))); + R1[WS(rs, 10)] = -(KP1_763842528 * (FMA(KP534511135, T1r, T1u))); + R1[WS(rs, 6)] = -(KP1_913880671 * (FNMS(KP303346683, T1w, T1v))); + } + { + E T1T, T1Y, T1W, T1X; + { + E T1R, T1S, T1U, T1V; + T1R = FMA(KP707106781, T1y, T1x); + T1S = T1M + T1L; + T1T = FNMS(KP923879532, T1S, T1R); + T1Y = FMA(KP923879532, T1S, T1R); + T1U = FMA(KP707106781, T1J, T1I); + T1V = T1C + T1F; + T1W = FNMS(KP923879532, T1V, T1U); + T1X = FMA(KP923879532, T1V, T1U); + } + R1[WS(rs, 3)] = KP1_546020906 * (FMA(KP820678790, T1W, T1T)); + R1[WS(rs, 15)] = -(KP1_990369453 * (FNMS(KP098491403, T1X, T1Y))); + R1[WS(rs, 11)] = KP1_546020906 * (FNMS(KP820678790, T1T, T1W)); + R1[WS(rs, 7)] = KP1_990369453 * (FMA(KP098491403, T1Y, T1X)); + } + { + E T2f, T2q, T2o, T2p; + { + E T23, T2e, T2k, T2n; + T23 = T1Z + T22; + T2e = T28 + T2d; + T2f = FMA(KP707106781, T2e, T23); + T2q = FNMS(KP707106781, T2e, T23); + T2k = T2i - T2j; + T2n = T2l - T2m; + T2o = FMA(KP707106781, T2n, T2k); + T2p = FNMS(KP707106781, T2n, T2k); + } + R0[WS(rs, 1)] = KP1_961570560 * (FMA(KP198912367, T2o, T2f)); + R0[WS(rs, 13)] = -(KP1_662939224 * (FNMS(KP668178637, T2p, T2q))); + R0[WS(rs, 9)] = KP1_961570560 * (FNMS(KP198912367, T2f, T2o)); + R0[WS(rs, 5)] = KP1_662939224 * (FMA(KP668178637, T2q, T2p)); + } + { + E T1H, T1Q, T1O, T1P; + { + E T1z, T1G, T1K, T1N; + T1z = FNMS(KP707106781, T1y, T1x); + T1G = T1C - T1F; + T1H = FMA(KP923879532, T1G, T1z); + T1Q = FNMS(KP923879532, T1G, T1z); + T1K = FNMS(KP707106781, T1J, T1I); + T1N = T1L - T1M; + T1O = FMA(KP923879532, T1N, T1K); + T1P = FNMS(KP923879532, T1N, T1K); + } + R1[WS(rs, 1)] = KP1_913880671 * (FMA(KP303346683, T1O, T1H)); + R1[WS(rs, 13)] = -(KP1_763842528 * (FNMS(KP534511135, T1P, T1Q))); + R1[WS(rs, 9)] = KP1_913880671 * (FNMS(KP303346683, T1H, T1O)); + R1[WS(rs, 5)] = KP1_763842528 * (FMA(KP534511135, T1Q, T1P)); + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cbIII_32", {106, 32, 68, 0}, &GENUS }; + +void X(codelet_r2cbIII_32) (planner *p) { + X(kr2c_register) (p, r2cbIII_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -name r2cbIII_32 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 138 additions, 48 multiplications, 36 fused multiply/add), + * 66 stack variables, 19 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP580569354, +0.580569354508924735272384751634790549382952557); + DK(KP942793473, +0.942793473651995297112775251810508755314920638); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP1_268786568, +1.268786568327290996430343226450986741351374190); + DK(KP196034280, +0.196034280659121203988391127777283691722273346); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T7, T2i, T2F, Tz, T1k, T1I, T1Z, T1x, Te, T22, T2E, T2j, T1f, T1y, TK; + E T1J, Tm, T2B, TW, T1a, T1C, T1L, T28, T2l, Tt, T2A, T17, T1b, T1F, T1M; + E T2d, T2m; + { + E T3, Tv, T1j, T2h, T6, T1g, Ty, T2g; + { + E T1, T2, T1h, T1i; + T1 = Cr[0]; + T2 = Cr[WS(csr, 15)]; + T3 = T1 + T2; + Tv = T1 - T2; + T1h = Ci[0]; + T1i = Ci[WS(csi, 15)]; + T1j = T1h + T1i; + T2h = T1i - T1h; + } + { + E T4, T5, Tw, Tx; + T4 = Cr[WS(csr, 8)]; + T5 = Cr[WS(csr, 7)]; + T6 = T4 + T5; + T1g = T4 - T5; + Tw = Ci[WS(csi, 8)]; + Tx = Ci[WS(csi, 7)]; + Ty = Tw + Tx; + T2g = Tw - Tx; + } + T7 = T3 + T6; + T2i = T2g + T2h; + T2F = T2h - T2g; + Tz = Tv - Ty; + T1k = T1g + T1j; + T1I = T1g - T1j; + T1Z = T3 - T6; + T1x = Tv + Ty; + } + { + E Ta, TA, TD, T21, Td, TF, TI, T20; + { + E T8, T9, TB, TC; + T8 = Cr[WS(csr, 4)]; + T9 = Cr[WS(csr, 11)]; + Ta = T8 + T9; + TA = T8 - T9; + TB = Ci[WS(csi, 4)]; + TC = Ci[WS(csi, 11)]; + TD = TB + TC; + T21 = TB - TC; + } + { + E Tb, Tc, TG, TH; + Tb = Cr[WS(csr, 3)]; + Tc = Cr[WS(csr, 12)]; + Td = Tb + Tc; + TF = Tb - Tc; + TG = Ci[WS(csi, 3)]; + TH = Ci[WS(csi, 12)]; + TI = TG + TH; + T20 = TH - TG; + } + Te = Ta + Td; + T22 = T20 - T21; + T2E = T21 + T20; + T2j = Ta - Td; + { + E T1d, T1e, TE, TJ; + T1d = TA + TD; + T1e = TF + TI; + T1f = KP707106781 * (T1d - T1e); + T1y = KP707106781 * (T1d + T1e); + TE = TA - TD; + TJ = TF - TI; + TK = KP707106781 * (TE + TJ); + T1J = KP707106781 * (TE - TJ); + } + } + { + E Ti, TM, TU, T25, Tl, TR, TP, T26, TQ, TV; + { + E Tg, Th, TS, TT; + Tg = Cr[WS(csr, 2)]; + Th = Cr[WS(csr, 13)]; + Ti = Tg + Th; + TM = Tg - Th; + TS = Ci[WS(csi, 2)]; + TT = Ci[WS(csi, 13)]; + TU = TS + TT; + T25 = TS - TT; + } + { + E Tj, Tk, TN, TO; + Tj = Cr[WS(csr, 10)]; + Tk = Cr[WS(csr, 5)]; + Tl = Tj + Tk; + TR = Tj - Tk; + TN = Ci[WS(csi, 10)]; + TO = Ci[WS(csi, 5)]; + TP = TN + TO; + T26 = TN - TO; + } + Tm = Ti + Tl; + T2B = T26 + T25; + TQ = TM - TP; + TV = TR + TU; + TW = FNMS(KP382683432, TV, KP923879532 * TQ); + T1a = FMA(KP382683432, TQ, KP923879532 * TV); + { + E T1A, T1B, T24, T27; + T1A = TM + TP; + T1B = TU - TR; + T1C = FNMS(KP923879532, T1B, KP382683432 * T1A); + T1L = FMA(KP923879532, T1A, KP382683432 * T1B); + T24 = Ti - Tl; + T27 = T25 - T26; + T28 = T24 - T27; + T2l = T24 + T27; + } + } + { + E Tp, TX, T15, T2a, Ts, T12, T10, T2b, T11, T16; + { + E Tn, To, T13, T14; + Tn = Cr[WS(csr, 1)]; + To = Cr[WS(csr, 14)]; + Tp = Tn + To; + TX = Tn - To; + T13 = Ci[WS(csi, 1)]; + T14 = Ci[WS(csi, 14)]; + T15 = T13 + T14; + T2a = T14 - T13; + } + { + E Tq, Tr, TY, TZ; + Tq = Cr[WS(csr, 6)]; + Tr = Cr[WS(csr, 9)]; + Ts = Tq + Tr; + T12 = Tq - Tr; + TY = Ci[WS(csi, 6)]; + TZ = Ci[WS(csi, 9)]; + T10 = TY + TZ; + T2b = TY - TZ; + } + Tt = Tp + Ts; + T2A = T2b + T2a; + T11 = TX - T10; + T16 = T12 - T15; + T17 = FMA(KP923879532, T11, KP382683432 * T16); + T1b = FNMS(KP382683432, T11, KP923879532 * T16); + { + E T1D, T1E, T29, T2c; + T1D = TX + T10; + T1E = T12 + T15; + T1F = FNMS(KP923879532, T1E, KP382683432 * T1D); + T1M = FMA(KP923879532, T1D, KP382683432 * T1E); + T29 = Tp - Ts; + T2c = T2a - T2b; + T2d = T29 + T2c; + T2m = T2c - T29; + } + } + { + E Tf, Tu, T2L, T2M, T2N, T2O; + Tf = T7 + Te; + Tu = Tm + Tt; + T2L = Tf - Tu; + T2M = T2B + T2A; + T2N = T2F - T2E; + T2O = T2M + T2N; + R0[0] = KP2_000000000 * (Tf + Tu); + R0[WS(rs, 8)] = KP2_000000000 * (T2N - T2M); + R0[WS(rs, 4)] = KP1_414213562 * (T2L + T2O); + R0[WS(rs, 12)] = KP1_414213562 * (T2O - T2L); + } + { + E T2t, T2x, T2w, T2y; + { + E T2r, T2s, T2u, T2v; + T2r = T1Z - T22; + T2s = KP707106781 * (T2m - T2l); + T2t = T2r + T2s; + T2x = T2r - T2s; + T2u = T2j + T2i; + T2v = KP707106781 * (T28 - T2d); + T2w = T2u - T2v; + T2y = T2v + T2u; + } + R0[WS(rs, 3)] = FMA(KP1_662939224, T2t, KP1_111140466 * T2w); + R0[WS(rs, 15)] = FNMS(KP1_961570560, T2x, KP390180644 * T2y); + R0[WS(rs, 11)] = FNMS(KP1_111140466, T2t, KP1_662939224 * T2w); + R0[WS(rs, 7)] = FMA(KP390180644, T2x, KP1_961570560 * T2y); + } + { + E T2D, T2J, T2I, T2K; + { + E T2z, T2C, T2G, T2H; + T2z = T7 - Te; + T2C = T2A - T2B; + T2D = T2z + T2C; + T2J = T2z - T2C; + T2G = T2E + T2F; + T2H = Tm - Tt; + T2I = T2G - T2H; + T2K = T2H + T2G; + } + R0[WS(rs, 2)] = FMA(KP1_847759065, T2D, KP765366864 * T2I); + R0[WS(rs, 14)] = FNMS(KP1_847759065, T2J, KP765366864 * T2K); + R0[WS(rs, 10)] = FNMS(KP765366864, T2D, KP1_847759065 * T2I); + R0[WS(rs, 6)] = FMA(KP765366864, T2J, KP1_847759065 * T2K); + } + { + E T19, T1n, T1m, T1o; + { + E TL, T18, T1c, T1l; + TL = Tz + TK; + T18 = TW + T17; + T19 = TL + T18; + T1n = TL - T18; + T1c = T1a + T1b; + T1l = T1f + T1k; + T1m = T1c + T1l; + T1o = T1c - T1l; + } + R1[0] = FNMS(KP196034280, T1m, KP1_990369453 * T19); + R1[WS(rs, 12)] = FNMS(KP1_546020906, T1n, KP1_268786568 * T1o); + R1[WS(rs, 8)] = -(FMA(KP196034280, T19, KP1_990369453 * T1m)); + R1[WS(rs, 4)] = FMA(KP1_268786568, T1n, KP1_546020906 * T1o); + } + { + E T1r, T1v, T1u, T1w; + { + E T1p, T1q, T1s, T1t; + T1p = Tz - TK; + T1q = T1b - T1a; + T1r = T1p + T1q; + T1v = T1p - T1q; + T1s = T1f - T1k; + T1t = TW - T17; + T1u = T1s - T1t; + T1w = T1t + T1s; + } + R1[WS(rs, 2)] = FMA(KP1_763842528, T1r, KP942793473 * T1u); + R1[WS(rs, 14)] = FNMS(KP1_913880671, T1v, KP580569354 * T1w); + R1[WS(rs, 10)] = FNMS(KP942793473, T1r, KP1_763842528 * T1u); + R1[WS(rs, 6)] = FMA(KP580569354, T1v, KP1_913880671 * T1w); + } + { + E T1T, T1X, T1W, T1Y; + { + E T1R, T1S, T1U, T1V; + T1R = T1x + T1y; + T1S = T1L + T1M; + T1T = T1R - T1S; + T1X = T1R + T1S; + T1U = T1J + T1I; + T1V = T1C - T1F; + T1W = T1U - T1V; + T1Y = T1V + T1U; + } + R1[WS(rs, 3)] = FMA(KP1_546020906, T1T, KP1_268786568 * T1W); + R1[WS(rs, 15)] = FNMS(KP1_990369453, T1X, KP196034280 * T1Y); + R1[WS(rs, 11)] = FNMS(KP1_268786568, T1T, KP1_546020906 * T1W); + R1[WS(rs, 7)] = FMA(KP196034280, T1X, KP1_990369453 * T1Y); + } + { + E T2f, T2p, T2o, T2q; + { + E T23, T2e, T2k, T2n; + T23 = T1Z + T22; + T2e = KP707106781 * (T28 + T2d); + T2f = T23 + T2e; + T2p = T23 - T2e; + T2k = T2i - T2j; + T2n = KP707106781 * (T2l + T2m); + T2o = T2k - T2n; + T2q = T2n + T2k; + } + R0[WS(rs, 1)] = FMA(KP1_961570560, T2f, KP390180644 * T2o); + R0[WS(rs, 13)] = FNMS(KP1_662939224, T2p, KP1_111140466 * T2q); + R0[WS(rs, 9)] = FNMS(KP390180644, T2f, KP1_961570560 * T2o); + R0[WS(rs, 5)] = FMA(KP1_111140466, T2p, KP1_662939224 * T2q); + } + { + E T1H, T1P, T1O, T1Q; + { + E T1z, T1G, T1K, T1N; + T1z = T1x - T1y; + T1G = T1C + T1F; + T1H = T1z + T1G; + T1P = T1z - T1G; + T1K = T1I - T1J; + T1N = T1L - T1M; + T1O = T1K - T1N; + T1Q = T1N + T1K; + } + R1[WS(rs, 1)] = FMA(KP1_913880671, T1H, KP580569354 * T1O); + R1[WS(rs, 13)] = FNMS(KP1_763842528, T1P, KP942793473 * T1Q); + R1[WS(rs, 9)] = FNMS(KP580569354, T1H, KP1_913880671 * T1O); + R1[WS(rs, 5)] = FMA(KP942793473, T1P, KP1_763842528 * T1Q); + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cbIII_32", {138, 48, 36, 0}, &GENUS }; + +void X(codelet_r2cbIII_32) (planner *p) { + X(kr2c_register) (p, r2cbIII_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_4.c new file mode 100644 index 000000000..4f5b56a72 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_4.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -name r2cbIII_4 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 6 additions, 4 multiplications, 0 fused multiply/add), + * 9 stack variables, 2 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T1, T2, T3, T4, T5, T6; + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T3 = T1 - T2; + T4 = Ci[0]; + T5 = Ci[WS(csi, 1)]; + T6 = T4 + T5; + R0[0] = KP2_000000000 * (T1 + T2); + R0[WS(rs, 1)] = KP2_000000000 * (T5 - T4); + R1[0] = KP1_414213562 * (T3 - T6); + R1[WS(rs, 1)] = -(KP1_414213562 * (T3 + T6)); + } + } +} + +static const kr2c_desc desc = { 4, "r2cbIII_4", {6, 4, 0, 0}, &GENUS }; + +void X(codelet_r2cbIII_4) (planner *p) { + X(kr2c_register) (p, r2cbIII_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -name r2cbIII_4 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 6 additions, 4 multiplications, 0 fused multiply/add), + * 9 stack variables, 2 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T1, T2, T3, T4, T5, T6; + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T3 = T1 - T2; + T4 = Ci[0]; + T5 = Ci[WS(csi, 1)]; + T6 = T4 + T5; + R0[0] = KP2_000000000 * (T1 + T2); + R0[WS(rs, 1)] = KP2_000000000 * (T5 - T4); + R1[0] = KP1_414213562 * (T3 - T6); + R1[WS(rs, 1)] = -(KP1_414213562 * (T3 + T6)); + } + } +} + +static const kr2c_desc desc = { 4, "r2cbIII_4", {6, 4, 0, 0}, &GENUS }; + +void X(codelet_r2cbIII_4) (planner *p) { + X(kr2c_register) (p, r2cbIII_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_5.c new file mode 100644 index 000000000..93c16f356 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_5.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 5 -name r2cbIII_5 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 12 FP additions, 10 FP multiplications, + * (or, 2 additions, 0 multiplications, 10 fused multiply/add), + * 18 stack variables, 5 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E Ta, Tc, T1, T4, T5, T6, Tb, T7; + { + E T8, T9, T2, T3; + T8 = Ci[WS(csi, 1)]; + T9 = Ci[0]; + Ta = FMA(KP618033988, T9, T8); + Tc = FMS(KP618033988, T8, T9); + T1 = Cr[WS(csr, 2)]; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[0]; + T4 = T2 + T3; + T5 = FNMS(KP500000000, T4, T1); + T6 = T3 - T2; + } + R0[0] = FMA(KP2_000000000, T4, T1); + Tb = FMA(KP1_118033988, T6, T5); + R0[WS(rs, 1)] = FMA(KP1_902113032, Tc, Tb); + R1[WS(rs, 1)] = FMS(KP1_902113032, Tc, Tb); + T7 = FNMS(KP1_118033988, T6, T5); + R1[0] = -(FMA(KP1_902113032, Ta, T7)); + R0[WS(rs, 2)] = FNMS(KP1_902113032, Ta, T7); + } + } +} + +static const kr2c_desc desc = { 5, "r2cbIII_5", {2, 0, 10, 0}, &GENUS }; + +void X(codelet_r2cbIII_5) (planner *p) { + X(kr2c_register) (p, r2cbIII_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 5 -name r2cbIII_5 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 12 FP additions, 7 FP multiplications, + * (or, 8 additions, 3 multiplications, 4 fused multiply/add), + * 18 stack variables, 5 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E Ta, Tc, T1, T4, T5, T6, Tb, T7; + { + E T8, T9, T2, T3; + T8 = Ci[WS(csi, 1)]; + T9 = Ci[0]; + Ta = FMA(KP1_902113032, T8, KP1_175570504 * T9); + Tc = FNMS(KP1_902113032, T9, KP1_175570504 * T8); + T1 = Cr[WS(csr, 2)]; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[0]; + T4 = T2 + T3; + T5 = FMS(KP500000000, T4, T1); + T6 = KP1_118033988 * (T3 - T2); + } + R0[0] = FMA(KP2_000000000, T4, T1); + Tb = T6 - T5; + R0[WS(rs, 1)] = Tb + Tc; + R1[WS(rs, 1)] = Tc - Tb; + T7 = T5 + T6; + R1[0] = T7 - Ta; + R0[WS(rs, 2)] = -(T7 + Ta); + } + } +} + +static const kr2c_desc desc = { 5, "r2cbIII_5", {8, 3, 4, 0}, &GENUS }; + +void X(codelet_r2cbIII_5) (planner *p) { + X(kr2c_register) (p, r2cbIII_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_6.c new file mode 100644 index 000000000..7d0d4d7f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_6.c @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -name r2cbIII_6 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 12 FP additions, 8 FP multiplications, + * (or, 6 additions, 2 multiplications, 6 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T1, T8, T4, Ta, T7, Tc, T9, Tb; + T1 = Cr[WS(csr, 1)]; + T8 = Ci[WS(csi, 1)]; + { + E T2, T3, T5, T6; + T2 = Cr[WS(csr, 2)]; + T3 = Cr[0]; + T4 = T2 + T3; + Ta = T2 - T3; + T5 = Ci[WS(csi, 2)]; + T6 = Ci[0]; + T7 = T5 + T6; + Tc = T5 - T6; + } + R0[0] = KP2_000000000 * (T1 + T4); + R1[WS(rs, 1)] = KP2_000000000 * (T8 - T7); + T9 = FMA(KP2_000000000, T8, T7); + R1[0] = -(FMA(KP1_732050807, Ta, T9)); + R1[WS(rs, 2)] = FMS(KP1_732050807, Ta, T9); + Tb = FNMS(KP2_000000000, T1, T4); + R0[WS(rs, 1)] = FMA(KP1_732050807, Tc, Tb); + R0[WS(rs, 2)] = FMS(KP1_732050807, Tc, Tb); + } + } +} + +static const kr2c_desc desc = { 6, "r2cbIII_6", {6, 2, 6, 0}, &GENUS }; + +void X(codelet_r2cbIII_6) (planner *p) { + X(kr2c_register) (p, r2cbIII_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -name r2cbIII_6 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 12 FP additions, 6 FP multiplications, + * (or, 10 additions, 4 multiplications, 2 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T1, T6, T4, T5, T9, Tb, Ta, Tc; + T1 = Cr[WS(csr, 1)]; + T6 = Ci[WS(csi, 1)]; + { + E T2, T3, T7, T8; + T2 = Cr[WS(csr, 2)]; + T3 = Cr[0]; + T4 = T2 + T3; + T5 = KP1_732050807 * (T2 - T3); + T7 = Ci[WS(csi, 2)]; + T8 = Ci[0]; + T9 = T7 + T8; + Tb = KP1_732050807 * (T7 - T8); + } + R0[0] = KP2_000000000 * (T1 + T4); + R1[WS(rs, 1)] = KP2_000000000 * (T6 - T9); + Ta = FMA(KP2_000000000, T6, T9); + R1[0] = -(T5 + Ta); + R1[WS(rs, 2)] = T5 - Ta; + Tc = FMS(KP2_000000000, T1, T4); + R0[WS(rs, 1)] = Tb - Tc; + R0[WS(rs, 2)] = Tc + Tb; + } + } +} + +static const kr2c_desc desc = { 6, "r2cbIII_6", {10, 4, 2, 0}, &GENUS }; + +void X(codelet_r2cbIII_6) (planner *p) { + X(kr2c_register) (p, r2cbIII_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_64.c new file mode 100644 index 000000000..e093242f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_64.c @@ -0,0 +1,1587 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:45 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 64 -name r2cbIII_64 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 238 additions, 64 multiplications, 196 fused multiply/add), + * 127 stack variables, 36 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP906347169, +0.906347169019147157946142717268914412664134293); + DK(KP1_481902250, +1.481902250709918182351233794990325459457910619); + DK(KP472964775, +0.472964775891319928124438237972992463904131113); + DK(KP1_807978586, +1.807978586246886663172400594461074097420264050); + DK(KP049126849, +0.049126849769467254105343321271313617079695752); + DK(KP1_997590912, +1.997590912410344785429543209518201388886407229); + DK(KP357805721, +0.357805721314524104672487743774474392487532769); + DK(KP1_883088130, +1.883088130366041556825018805199004714371179592); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP741650546, +0.741650546272035369581266691172079863842265220); + DK(KP1_606415062, +1.606415062961289819613353025926283847759138854); + DK(KP599376933, +0.599376933681923766271389869014404232837890546); + DK(KP1_715457220, +1.715457220000544139804539968569540274084981599); + DK(KP148335987, +0.148335987538347428753676511486911367000625355); + DK(KP1_978353019, +1.978353019929561946903347476032486127967379067); + DK(KP250486960, +0.250486960191305461595702160124721208578685568); + DK(KP1_940062506, +1.940062506389087985207968414572200502913731924); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E T15, T3t, T3U, T2E, Tf, T6b, T6u, T6Q, T4L, T5J, T1g, T3V, T5q, T5U, T2H; + E T3u, Tu, T6v, T4V, T5r, T6e, T6R, T1s, T2K, T1D, T2J, T3B, T3X, T4Q, T5s; + E T3y, T3Y, TK, T6g, T57, T5M, T6j, T6N, T1W, T35, T25, T34, T3J, T4i, T52; + E T5N, T3G, T4j, TZ, T6l, T5i, T5P, T6o, T6M, T2n, T38, T2w, T37, T3Q, T4l; + E T5d, T5Q, T3N, T4m; + { + E T3, T11, T2D, T5m, T6, T2A, T14, T5n, Ta, T16, T19, T4I, Td, T1b, T1e; + E T4J; + { + E T1, T2, T2B, T2C; + T1 = Cr[0]; + T2 = Cr[WS(csr, 31)]; + T3 = T1 + T2; + T11 = T1 - T2; + T2B = Ci[0]; + T2C = Ci[WS(csi, 31)]; + T2D = T2B + T2C; + T5m = T2C - T2B; + } + { + E T4, T5, T12, T13; + T4 = Cr[WS(csr, 16)]; + T5 = Cr[WS(csr, 15)]; + T6 = T4 + T5; + T2A = T4 - T5; + T12 = Ci[WS(csi, 16)]; + T13 = Ci[WS(csi, 15)]; + T14 = T12 + T13; + T5n = T13 - T12; + } + { + E T8, T9, T17, T18; + T8 = Cr[WS(csr, 8)]; + T9 = Cr[WS(csr, 23)]; + Ta = T8 + T9; + T16 = T8 - T9; + T17 = Ci[WS(csi, 8)]; + T18 = Ci[WS(csi, 23)]; + T19 = T17 + T18; + T4I = T18 - T17; + } + { + E Tb, Tc, T1c, T1d; + Tb = Cr[WS(csr, 7)]; + Tc = Cr[WS(csr, 24)]; + Td = Tb + Tc; + T1b = Tb - Tc; + T1c = Ci[WS(csi, 7)]; + T1d = Ci[WS(csi, 24)]; + T1e = T1c + T1d; + T4J = T1c - T1d; + } + { + E T7, Te, T1a, T1f; + T15 = T11 - T14; + T3t = T11 + T14; + T3U = T2A - T2D; + T2E = T2A + T2D; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T6b = T7 - Te; + { + E T6s, T6t, T4H, T4K; + T6s = T5n + T5m; + T6t = T4I + T4J; + T6u = T6s - T6t; + T6Q = T6t + T6s; + T4H = T3 - T6; + T4K = T4I - T4J; + T4L = T4H + T4K; + T5J = T4H - T4K; + } + T1a = T16 - T19; + T1f = T1b - T1e; + T1g = T1a + T1f; + T3V = T1a - T1f; + { + E T5o, T5p, T2F, T2G; + T5o = T5m - T5n; + T5p = Ta - Td; + T5q = T5o - T5p; + T5U = T5p + T5o; + T2F = T1b + T1e; + T2G = T16 + T19; + T2H = T2F - T2G; + T3u = T2G + T2F; + } + } + } + { + E Ti, T1i, T1q, T4O, Tl, T1n, T1l, T4N, Tp, T1t, T1A, T4T, Ts, T1B, T1w; + E T4S; + { + E Tg, Th, T1o, T1p; + Tg = Cr[WS(csr, 4)]; + Th = Cr[WS(csr, 27)]; + Ti = Tg + Th; + T1i = Tg - Th; + T1o = Ci[WS(csi, 4)]; + T1p = Ci[WS(csi, 27)]; + T1q = T1o + T1p; + T4O = T1p - T1o; + } + { + E Tj, Tk, T1j, T1k; + Tj = Cr[WS(csr, 20)]; + Tk = Cr[WS(csr, 11)]; + Tl = Tj + Tk; + T1n = Tj - Tk; + T1j = Ci[WS(csi, 20)]; + T1k = Ci[WS(csi, 11)]; + T1l = T1j + T1k; + T4N = T1k - T1j; + } + { + E Tn, To, T1y, T1z; + Tn = Cr[WS(csr, 3)]; + To = Cr[WS(csr, 28)]; + Tp = Tn + To; + T1t = Tn - To; + T1y = Ci[WS(csi, 3)]; + T1z = Ci[WS(csi, 28)]; + T1A = T1y + T1z; + T4T = T1y - T1z; + } + { + E Tq, Tr, T1u, T1v; + Tq = Cr[WS(csr, 12)]; + Tr = Cr[WS(csr, 19)]; + Ts = Tq + Tr; + T1B = Tq - Tr; + T1u = Ci[WS(csi, 12)]; + T1v = Ci[WS(csi, 19)]; + T1w = T1u + T1v; + T4S = T1v - T1u; + } + { + E Tm, Tt, T4R, T4U; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T6v = Tm - Tt; + T4R = Tp - Ts; + T4U = T4S - T4T; + T4V = T4R + T4U; + T5r = T4R - T4U; + } + { + E T6c, T6d, T1m, T1r; + T6c = T4N + T4O; + T6d = T4S + T4T; + T6e = T6c - T6d; + T6R = T6c + T6d; + T1m = T1i - T1l; + T1r = T1n + T1q; + T1s = FNMS(KP414213562, T1r, T1m); + T2K = FMA(KP414213562, T1m, T1r); + } + { + E T1x, T1C, T3z, T3A; + T1x = T1t - T1w; + T1C = T1A - T1B; + T1D = FNMS(KP414213562, T1C, T1x); + T2J = FMA(KP414213562, T1x, T1C); + T3z = T1B + T1A; + T3A = T1t + T1w; + T3B = FNMS(KP414213562, T3A, T3z); + T3X = FMA(KP414213562, T3z, T3A); + } + { + E T4M, T4P, T3w, T3x; + T4M = Ti - Tl; + T4P = T4N - T4O; + T4Q = T4M - T4P; + T5s = T4M + T4P; + T3w = T1n - T1q; + T3x = T1i + T1l; + T3y = FMA(KP414213562, T3x, T3w); + T3Y = FNMS(KP414213562, T3w, T3x); + } + } + { + E Ty, T1G, T20, T54, TB, T1X, T1J, T53, TI, T4Z, T1U, T22, TF, T50, T1P; + E T23; + { + E Tw, Tx, T1H, T1I; + Tw = Cr[WS(csr, 2)]; + Tx = Cr[WS(csr, 29)]; + Ty = Tw + Tx; + T1G = Tw - Tx; + { + E T1Y, T1Z, Tz, TA; + T1Y = Ci[WS(csi, 2)]; + T1Z = Ci[WS(csi, 29)]; + T20 = T1Y + T1Z; + T54 = T1Y - T1Z; + Tz = Cr[WS(csr, 18)]; + TA = Cr[WS(csr, 13)]; + TB = Tz + TA; + T1X = Tz - TA; + } + T1H = Ci[WS(csi, 18)]; + T1I = Ci[WS(csi, 13)]; + T1J = T1H + T1I; + T53 = T1H - T1I; + { + E TG, TH, T1Q, T1R, T1S, T1T; + TG = Cr[WS(csr, 5)]; + TH = Cr[WS(csr, 26)]; + T1Q = TG - TH; + T1R = Ci[WS(csi, 5)]; + T1S = Ci[WS(csi, 26)]; + T1T = T1R + T1S; + TI = TG + TH; + T4Z = T1S - T1R; + T1U = T1Q - T1T; + T22 = T1Q + T1T; + } + { + E TD, TE, T1L, T1M, T1N, T1O; + TD = Cr[WS(csr, 10)]; + TE = Cr[WS(csr, 21)]; + T1L = TD - TE; + T1M = Ci[WS(csi, 10)]; + T1N = Ci[WS(csi, 21)]; + T1O = T1M + T1N; + TF = TD + TE; + T50 = T1M - T1N; + T1P = T1L - T1O; + T23 = T1L + T1O; + } + } + { + E TC, TJ, T55, T56; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T6g = TC - TJ; + T55 = T53 - T54; + T56 = TF - TI; + T57 = T55 - T56; + T5M = T56 + T55; + } + { + E T6h, T6i, T1K, T1V; + T6h = T53 + T54; + T6i = T50 + T4Z; + T6j = T6h - T6i; + T6N = T6i + T6h; + T1K = T1G - T1J; + T1V = T1P + T1U; + T1W = FMA(KP707106781, T1V, T1K); + T35 = FNMS(KP707106781, T1V, T1K); + } + { + E T21, T24, T3H, T3I; + T21 = T1X + T20; + T24 = T22 - T23; + T25 = FNMS(KP707106781, T24, T21); + T34 = FMA(KP707106781, T24, T21); + T3H = T1X - T20; + T3I = T1P - T1U; + T3J = FNMS(KP707106781, T3I, T3H); + T4i = FMA(KP707106781, T3I, T3H); + } + { + E T4Y, T51, T3E, T3F; + T4Y = Ty - TB; + T51 = T4Z - T50; + T52 = T4Y + T51; + T5N = T4Y - T51; + T3E = T1G + T1J; + T3F = T23 + T22; + T3G = FNMS(KP707106781, T3F, T3E); + T4j = FMA(KP707106781, T3F, T3E); + } + } + { + E TN, T27, T2q, T5f, TQ, T2r, T2a, T5e, TX, T5a, T2l, T2t, TU, T5b, T2g; + E T2u; + { + E TL, TM, T28, T29; + TL = Cr[WS(csr, 1)]; + TM = Cr[WS(csr, 30)]; + TN = TL + TM; + T27 = TL - TM; + { + E T2o, T2p, TO, TP; + T2o = Ci[WS(csi, 1)]; + T2p = Ci[WS(csi, 30)]; + T2q = T2o + T2p; + T5f = T2p - T2o; + TO = Cr[WS(csr, 14)]; + TP = Cr[WS(csr, 17)]; + TQ = TO + TP; + T2r = TO - TP; + } + T28 = Ci[WS(csi, 14)]; + T29 = Ci[WS(csi, 17)]; + T2a = T28 + T29; + T5e = T28 - T29; + { + E TV, TW, T2h, T2i, T2j, T2k; + TV = Cr[WS(csr, 9)]; + TW = Cr[WS(csr, 22)]; + T2h = TV - TW; + T2i = Ci[WS(csi, 9)]; + T2j = Ci[WS(csi, 22)]; + T2k = T2i + T2j; + TX = TV + TW; + T5a = T2j - T2i; + T2l = T2h - T2k; + T2t = T2h + T2k; + } + { + E TS, TT, T2c, T2d, T2e, T2f; + TS = Cr[WS(csr, 6)]; + TT = Cr[WS(csr, 25)]; + T2c = TS - TT; + T2d = Ci[WS(csi, 6)]; + T2e = Ci[WS(csi, 25)]; + T2f = T2d + T2e; + TU = TS + TT; + T5b = T2d - T2e; + T2g = T2c - T2f; + T2u = T2c + T2f; + } + } + { + E TR, TY, T5g, T5h; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T6l = TR - TY; + T5g = T5e - T5f; + T5h = TU - TX; + T5i = T5g - T5h; + T5P = T5h + T5g; + } + { + E T6m, T6n, T2b, T2m; + T6m = T5e + T5f; + T6n = T5b + T5a; + T6o = T6m - T6n; + T6M = T6n + T6m; + T2b = T27 - T2a; + T2m = T2g + T2l; + T2n = FMA(KP707106781, T2m, T2b); + T38 = FNMS(KP707106781, T2m, T2b); + } + { + E T2s, T2v, T3O, T3P; + T2s = T2q - T2r; + T2v = T2t - T2u; + T2w = FMA(KP707106781, T2v, T2s); + T37 = FNMS(KP707106781, T2v, T2s); + T3O = T2r + T2q; + T3P = T2g - T2l; + T3Q = FNMS(KP707106781, T3P, T3O); + T4l = FMA(KP707106781, T3P, T3O); + } + { + E T59, T5c, T3L, T3M; + T59 = TN - TQ; + T5c = T5a - T5b; + T5d = T59 + T5c; + T5Q = T59 - T5c; + T3L = T27 + T2a; + T3M = T2u + T2t; + T3N = FNMS(KP707106781, T3M, T3L); + T4m = FMA(KP707106781, T3M, T3L); + } + } + { + E Tv, T10, T6X, T6Y, T6Z, T70; + Tv = Tf + Tu; + T10 = TK + TZ; + T6X = Tv - T10; + T6Y = T6N + T6M; + T6Z = T6R + T6Q; + T70 = T6Y + T6Z; + R0[0] = KP2_000000000 * (Tv + T10); + R0[WS(rs, 16)] = KP2_000000000 * (T6Z - T6Y); + R0[WS(rs, 8)] = KP1_414213562 * (T6X + T70); + R0[WS(rs, 24)] = KP1_414213562 * (T70 - T6X); + } + { + E T6P, T6W, T6U, T6V; + { + E T6L, T6O, T6S, T6T; + T6L = Tf - Tu; + T6O = T6M - T6N; + T6P = T6L + T6O; + T6W = T6L - T6O; + T6S = T6Q - T6R; + T6T = TK - TZ; + T6U = T6S - T6T; + T6V = T6T + T6S; + } + R0[WS(rs, 4)] = KP1_847759065 * (FMA(KP414213562, T6U, T6P)); + R0[WS(rs, 28)] = -(KP1_847759065 * (FNMS(KP414213562, T6V, T6W))); + R0[WS(rs, 20)] = KP1_847759065 * (FNMS(KP414213562, T6P, T6U)); + R0[WS(rs, 12)] = KP1_847759065 * (FMA(KP414213562, T6W, T6V)); + } + { + E T6f, T6w, T6G, T6D, T6z, T6E, T6q, T6H; + T6f = T6b + T6e; + T6w = T6u - T6v; + T6G = T6v + T6u; + T6D = T6b - T6e; + { + E T6x, T6y, T6k, T6p; + T6x = T6l - T6o; + T6y = T6g + T6j; + T6z = T6x - T6y; + T6E = T6y + T6x; + T6k = T6g - T6j; + T6p = T6l + T6o; + T6q = T6k + T6p; + T6H = T6k - T6p; + } + { + E T6r, T6A, T6J, T6K; + T6r = FMA(KP707106781, T6q, T6f); + T6A = FMA(KP707106781, T6z, T6w); + R0[WS(rs, 2)] = KP1_961570560 * (FMA(KP198912367, T6A, T6r)); + R0[WS(rs, 18)] = KP1_961570560 * (FNMS(KP198912367, T6r, T6A)); + T6J = FMA(KP707106781, T6H, T6G); + T6K = FMA(KP707106781, T6E, T6D); + R0[WS(rs, 14)] = KP1_961570560 * (FMA(KP198912367, T6K, T6J)); + R0[WS(rs, 30)] = -(KP1_961570560 * (FNMS(KP198912367, T6J, T6K))); + } + { + E T6B, T6C, T6F, T6I; + T6B = FNMS(KP707106781, T6z, T6w); + T6C = FNMS(KP707106781, T6q, T6f); + R0[WS(rs, 10)] = KP1_662939224 * (FMA(KP668178637, T6C, T6B)); + R0[WS(rs, 26)] = -(KP1_662939224 * (FNMS(KP668178637, T6B, T6C))); + T6F = FNMS(KP707106781, T6E, T6D); + T6I = FNMS(KP707106781, T6H, T6G); + R0[WS(rs, 6)] = KP1_662939224 * (FMA(KP668178637, T6I, T6F)); + R0[WS(rs, 22)] = KP1_662939224 * (FNMS(KP668178637, T6F, T6I)); + } + } + { + E T5L, T63, T5W, T66, T5S, T67, T5Z, T64, T5K, T5V; + T5K = T5s + T5r; + T5L = FNMS(KP707106781, T5K, T5J); + T63 = FMA(KP707106781, T5K, T5J); + T5V = T4Q - T4V; + T5W = FNMS(KP707106781, T5V, T5U); + T66 = FMA(KP707106781, T5V, T5U); + { + E T5O, T5R, T5X, T5Y; + T5O = FMA(KP414213562, T5N, T5M); + T5R = FNMS(KP414213562, T5Q, T5P); + T5S = T5O - T5R; + T67 = T5O + T5R; + T5X = FMA(KP414213562, T5P, T5Q); + T5Y = FNMS(KP414213562, T5M, T5N); + T5Z = T5X - T5Y; + T64 = T5Y + T5X; + } + { + E T5T, T60, T69, T6a; + T5T = FMA(KP923879532, T5S, T5L); + T60 = FMA(KP923879532, T5Z, T5W); + R0[WS(rs, 3)] = KP1_913880671 * (FMA(KP303346683, T60, T5T)); + R0[WS(rs, 19)] = KP1_913880671 * (FNMS(KP303346683, T5T, T60)); + T69 = FMA(KP923879532, T67, T66); + T6a = FMA(KP923879532, T64, T63); + R0[WS(rs, 15)] = KP1_990369453 * (FMA(KP098491403, T6a, T69)); + R0[WS(rs, 31)] = -(KP1_990369453 * (FNMS(KP098491403, T69, T6a))); + } + { + E T61, T62, T65, T68; + T61 = FNMS(KP923879532, T5Z, T5W); + T62 = FNMS(KP923879532, T5S, T5L); + R0[WS(rs, 11)] = KP1_763842528 * (FMA(KP534511135, T62, T61)); + R0[WS(rs, 27)] = -(KP1_763842528 * (FNMS(KP534511135, T61, T62))); + T65 = FNMS(KP923879532, T64, T63); + T68 = FNMS(KP923879532, T67, T66); + R0[WS(rs, 7)] = KP1_546020906 * (FMA(KP820678790, T68, T65)); + R0[WS(rs, 23)] = KP1_546020906 * (FNMS(KP820678790, T65, T68)); + } + } + { + E T4X, T5B, T5u, T5E, T5k, T5F, T5x, T5C, T4W, T5t; + T4W = T4Q + T4V; + T4X = FMA(KP707106781, T4W, T4L); + T5B = FNMS(KP707106781, T4W, T4L); + T5t = T5r - T5s; + T5u = FMA(KP707106781, T5t, T5q); + T5E = FNMS(KP707106781, T5t, T5q); + { + E T58, T5j, T5v, T5w; + T58 = FMA(KP414213562, T57, T52); + T5j = FNMS(KP414213562, T5i, T5d); + T5k = T58 + T5j; + T5F = T58 - T5j; + T5v = FNMS(KP414213562, T52, T57); + T5w = FMA(KP414213562, T5d, T5i); + T5x = T5v + T5w; + T5C = T5w - T5v; + } + { + E T5l, T5y, T5H, T5I; + T5l = FMA(KP923879532, T5k, T4X); + T5y = FMA(KP923879532, T5x, T5u); + R0[WS(rs, 1)] = KP1_990369453 * (FMA(KP098491403, T5y, T5l)); + R0[WS(rs, 17)] = KP1_990369453 * (FNMS(KP098491403, T5l, T5y)); + T5H = FMA(KP923879532, T5F, T5E); + T5I = FMA(KP923879532, T5C, T5B); + R0[WS(rs, 13)] = KP1_913880671 * (FMA(KP303346683, T5I, T5H)); + R0[WS(rs, 29)] = -(KP1_913880671 * (FNMS(KP303346683, T5H, T5I))); + } + { + E T5z, T5A, T5D, T5G; + T5z = FNMS(KP923879532, T5x, T5u); + T5A = FNMS(KP923879532, T5k, T4X); + R0[WS(rs, 9)] = KP1_546020906 * (FMA(KP820678790, T5A, T5z)); + R0[WS(rs, 25)] = -(KP1_546020906 * (FNMS(KP820678790, T5z, T5A))); + T5D = FNMS(KP923879532, T5C, T5B); + T5G = FNMS(KP923879532, T5F, T5E); + R0[WS(rs, 5)] = KP1_763842528 * (FMA(KP534511135, T5G, T5D)); + R0[WS(rs, 21)] = KP1_763842528 * (FNMS(KP534511135, T5D, T5G)); + } + } + { + E T33, T3l, T3h, T3m, T3a, T3p, T3e, T3o; + { + E T31, T32, T3f, T3g; + T31 = FNMS(KP707106781, T1g, T15); + T32 = T2K + T2J; + T33 = FNMS(KP923879532, T32, T31); + T3l = FMA(KP923879532, T32, T31); + T3f = FMA(KP668178637, T37, T38); + T3g = FMA(KP668178637, T34, T35); + T3h = T3f - T3g; + T3m = T3g + T3f; + } + { + E T36, T39, T3c, T3d; + T36 = FNMS(KP668178637, T35, T34); + T39 = FNMS(KP668178637, T38, T37); + T3a = T36 + T39; + T3p = T39 - T36; + T3c = FMA(KP707106781, T2H, T2E); + T3d = T1s - T1D; + T3e = FMA(KP923879532, T3d, T3c); + T3o = FNMS(KP923879532, T3d, T3c); + } + { + E T3b, T3i, T3r, T3s; + T3b = FNMS(KP831469612, T3a, T33); + T3i = FNMS(KP831469612, T3h, T3e); + R1[WS(rs, 2)] = KP1_940062506 * (FNMS(KP250486960, T3i, T3b)); + R1[WS(rs, 18)] = -(KP1_940062506 * (FMA(KP250486960, T3b, T3i))); + T3r = FNMS(KP831469612, T3p, T3o); + T3s = FMA(KP831469612, T3m, T3l); + R1[WS(rs, 14)] = -(KP1_978353019 * (FNMS(KP148335987, T3s, T3r))); + R1[WS(rs, 30)] = -(KP1_978353019 * (FMA(KP148335987, T3r, T3s))); + } + { + E T3j, T3k, T3n, T3q; + T3j = FMA(KP831469612, T3h, T3e); + T3k = FMA(KP831469612, T3a, T33); + R1[WS(rs, 10)] = -(KP1_715457220 * (FNMS(KP599376933, T3k, T3j))); + R1[WS(rs, 26)] = -(KP1_715457220 * (FMA(KP599376933, T3j, T3k))); + T3n = FNMS(KP831469612, T3m, T3l); + T3q = FMA(KP831469612, T3p, T3o); + R1[WS(rs, 6)] = KP1_606415062 * (FNMS(KP741650546, T3q, T3n)); + R1[WS(rs, 22)] = -(KP1_606415062 * (FMA(KP741650546, T3n, T3q))); + } + } + { + E T4h, T4z, T4v, T4A, T4o, T4D, T4s, T4C; + { + E T4f, T4g, T4t, T4u; + T4f = FMA(KP707106781, T3u, T3t); + T4g = T3Y + T3X; + T4h = FNMS(KP923879532, T4g, T4f); + T4z = FMA(KP923879532, T4g, T4f); + T4t = FMA(KP198912367, T4l, T4m); + T4u = FNMS(KP198912367, T4i, T4j); + T4v = T4t - T4u; + T4A = T4u + T4t; + } + { + E T4k, T4n, T4q, T4r; + T4k = FMA(KP198912367, T4j, T4i); + T4n = FNMS(KP198912367, T4m, T4l); + T4o = T4k - T4n; + T4D = T4k + T4n; + T4q = FMA(KP707106781, T3V, T3U); + T4r = T3y + T3B; + T4s = FNMS(KP923879532, T4r, T4q); + T4C = FMA(KP923879532, T4r, T4q); + } + { + E T4p, T4w, T4F, T4G; + T4p = FMA(KP980785280, T4o, T4h); + T4w = FMA(KP980785280, T4v, T4s); + R1[WS(rs, 3)] = KP1_883088130 * (FMA(KP357805721, T4w, T4p)); + R1[WS(rs, 19)] = KP1_883088130 * (FNMS(KP357805721, T4p, T4w)); + T4F = FMA(KP980785280, T4D, T4C); + T4G = FMA(KP980785280, T4A, T4z); + R1[WS(rs, 15)] = KP1_997590912 * (FMA(KP049126849, T4G, T4F)); + R1[WS(rs, 31)] = -(KP1_997590912 * (FNMS(KP049126849, T4F, T4G))); + } + { + E T4x, T4y, T4B, T4E; + T4x = FNMS(KP980785280, T4v, T4s); + T4y = FNMS(KP980785280, T4o, T4h); + R1[WS(rs, 11)] = KP1_807978586 * (FMA(KP472964775, T4y, T4x)); + R1[WS(rs, 27)] = -(KP1_807978586 * (FNMS(KP472964775, T4x, T4y))); + T4B = FNMS(KP980785280, T4A, T4z); + T4E = FNMS(KP980785280, T4D, T4C); + R1[WS(rs, 7)] = KP1_481902250 * (FMA(KP906347169, T4E, T4B)); + R1[WS(rs, 23)] = KP1_481902250 * (FNMS(KP906347169, T4B, T4E)); + } + } + { + E T1F, T2T, T2P, T2U, T2y, T2X, T2M, T2W; + { + E T1h, T1E, T2N, T2O; + T1h = FMA(KP707106781, T1g, T15); + T1E = T1s + T1D; + T1F = FMA(KP923879532, T1E, T1h); + T2T = FNMS(KP923879532, T1E, T1h); + T2N = FMA(KP198912367, T2n, T2w); + T2O = FMA(KP198912367, T1W, T25); + T2P = T2N - T2O; + T2U = T2O + T2N; + } + { + E T26, T2x, T2I, T2L; + T26 = FNMS(KP198912367, T25, T1W); + T2x = FNMS(KP198912367, T2w, T2n); + T2y = T26 + T2x; + T2X = T26 - T2x; + T2I = FNMS(KP707106781, T2H, T2E); + T2L = T2J - T2K; + T2M = FNMS(KP923879532, T2L, T2I); + T2W = FMA(KP923879532, T2L, T2I); + } + { + E T2z, T2Q, T2Z, T30; + T2z = FMA(KP980785280, T2y, T1F); + T2Q = FNMS(KP980785280, T2P, T2M); + R1[0] = KP1_997590912 * (FNMS(KP049126849, T2Q, T2z)); + R1[WS(rs, 16)] = -(KP1_997590912 * (FMA(KP049126849, T2z, T2Q))); + T2Z = FNMS(KP980785280, T2X, T2W); + T30 = FMA(KP980785280, T2U, T2T); + R1[WS(rs, 12)] = -(KP1_883088130 * (FNMS(KP357805721, T30, T2Z))); + R1[WS(rs, 28)] = -(KP1_883088130 * (FMA(KP357805721, T2Z, T30))); + } + { + E T2R, T2S, T2V, T2Y; + T2R = FMA(KP980785280, T2P, T2M); + T2S = FNMS(KP980785280, T2y, T1F); + R1[WS(rs, 8)] = -(KP1_481902250 * (FNMS(KP906347169, T2S, T2R))); + R1[WS(rs, 24)] = -(KP1_481902250 * (FMA(KP906347169, T2R, T2S))); + T2V = FNMS(KP980785280, T2U, T2T); + T2Y = FMA(KP980785280, T2X, T2W); + R1[WS(rs, 4)] = KP1_807978586 * (FNMS(KP472964775, T2Y, T2V)); + R1[WS(rs, 20)] = -(KP1_807978586 * (FMA(KP472964775, T2V, T2Y))); + } + } + { + E T3D, T47, T43, T48, T3S, T4b, T40, T4a; + { + E T3v, T3C, T41, T42; + T3v = FNMS(KP707106781, T3u, T3t); + T3C = T3y - T3B; + T3D = FMA(KP923879532, T3C, T3v); + T47 = FNMS(KP923879532, T3C, T3v); + T41 = FNMS(KP668178637, T3G, T3J); + T42 = FMA(KP668178637, T3N, T3Q); + T43 = T41 + T42; + T48 = T42 - T41; + } + { + E T3K, T3R, T3W, T3Z; + T3K = FMA(KP668178637, T3J, T3G); + T3R = FNMS(KP668178637, T3Q, T3N); + T3S = T3K + T3R; + T4b = T3K - T3R; + T3W = FNMS(KP707106781, T3V, T3U); + T3Z = T3X - T3Y; + T40 = FMA(KP923879532, T3Z, T3W); + T4a = FNMS(KP923879532, T3Z, T3W); + } + { + E T3T, T44, T4d, T4e; + T3T = FMA(KP831469612, T3S, T3D); + T44 = FMA(KP831469612, T43, T40); + R1[WS(rs, 1)] = KP1_978353019 * (FMA(KP148335987, T44, T3T)); + R1[WS(rs, 17)] = KP1_978353019 * (FNMS(KP148335987, T3T, T44)); + T4d = FMA(KP831469612, T4b, T4a); + T4e = FMA(KP831469612, T48, T47); + R1[WS(rs, 13)] = KP1_940062506 * (FMA(KP250486960, T4e, T4d)); + R1[WS(rs, 29)] = -(KP1_940062506 * (FNMS(KP250486960, T4d, T4e))); + } + { + E T45, T46, T49, T4c; + T45 = FNMS(KP831469612, T43, T40); + T46 = FNMS(KP831469612, T3S, T3D); + R1[WS(rs, 9)] = KP1_606415062 * (FMA(KP741650546, T46, T45)); + R1[WS(rs, 25)] = -(KP1_606415062 * (FNMS(KP741650546, T45, T46))); + T49 = FNMS(KP831469612, T48, T47); + T4c = FNMS(KP831469612, T4b, T4a); + R1[WS(rs, 5)] = KP1_715457220 * (FMA(KP599376933, T4c, T49)); + R1[WS(rs, 21)] = KP1_715457220 * (FNMS(KP599376933, T49, T4c)); + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cbIII_64", {238, 64, 196, 0}, &GENUS }; + +void X(codelet_r2cbIII_64) (planner *p) { + X(kr2c_register) (p, r2cbIII_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 64 -name r2cbIII_64 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 342 additions, 116 multiplications, 92 fused multiply/add), + * 130 stack variables, 39 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_343117909, +1.343117909694036801250753700854843606457501264); + DK(KP1_481902250, +1.481902250709918182351233794990325459457910619); + DK(KP1_807978586, +1.807978586246886663172400594461074097420264050); + DK(KP855110186, +0.855110186860564188641933713777597068609157259); + DK(KP1_997590912, +1.997590912410344785429543209518201388886407229); + DK(KP098135348, +0.098135348654836028509909953885365316629490726); + DK(KP673779706, +0.673779706784440101378506425238295140955533559); + DK(KP1_883088130, +1.883088130366041556825018805199004714371179592); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP1_191398608, +1.191398608984866686934073057659939779023852677); + DK(KP1_606415062, +1.606415062961289819613353025926283847759138854); + DK(KP1_715457220, +1.715457220000544139804539968569540274084981599); + DK(KP1_028205488, +1.028205488386443453187387677937631545216098241); + DK(KP1_978353019, +1.978353019929561946903347476032486127967379067); + DK(KP293460948, +0.293460948910723503317700259293435639412430633); + DK(KP485960359, +0.485960359806527779896548324154942236641981567); + DK(KP1_940062506, +1.940062506389087985207968414572200502913731924); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP1_268786568, +1.268786568327290996430343226450986741351374190); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP942793473, +0.942793473651995297112775251810508755314920638); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP196034280, +0.196034280659121203988391127777283691722273346); + DK(KP580569354, +0.580569354508924735272384751634790549382952557); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E T15, T3t, T3U, T2N, Tf, T6b, T6u, T6R, T4L, T5J, T1g, T3V, T5q, T5U, T2I; + E T3u, Tu, T6v, T4V, T5s, T6e, T6Q, T1s, T2D, T1D, T2E, T3B, T3Y, T4Q, T5r; + E T3y, T3X, TK, T6g, T57, T5N, T6j, T6N, T1W, T34, T25, T35, T3J, T4j, T52; + E T5M, T3G, T4i, TZ, T6l, T5i, T5Q, T6o, T6M, T2n, T37, T2w, T38, T3Q, T4m; + E T5d, T5P, T3N, T4l; + { + E T3, T11, T2M, T5n, T6, T2J, T14, T5m, Ta, T16, T19, T4J, Td, T1b, T1e; + E T4I; + { + E T1, T2, T2K, T2L; + T1 = Cr[0]; + T2 = Cr[WS(csr, 31)]; + T3 = T1 + T2; + T11 = T1 - T2; + T2K = Ci[0]; + T2L = Ci[WS(csi, 31)]; + T2M = T2K + T2L; + T5n = T2L - T2K; + } + { + E T4, T5, T12, T13; + T4 = Cr[WS(csr, 16)]; + T5 = Cr[WS(csr, 15)]; + T6 = T4 + T5; + T2J = T4 - T5; + T12 = Ci[WS(csi, 16)]; + T13 = Ci[WS(csi, 15)]; + T14 = T12 + T13; + T5m = T12 - T13; + } + { + E T8, T9, T17, T18; + T8 = Cr[WS(csr, 8)]; + T9 = Cr[WS(csr, 23)]; + Ta = T8 + T9; + T16 = T8 - T9; + T17 = Ci[WS(csi, 8)]; + T18 = Ci[WS(csi, 23)]; + T19 = T17 + T18; + T4J = T17 - T18; + } + { + E Tb, Tc, T1c, T1d; + Tb = Cr[WS(csr, 7)]; + Tc = Cr[WS(csr, 24)]; + Td = Tb + Tc; + T1b = Tb - Tc; + T1c = Ci[WS(csi, 7)]; + T1d = Ci[WS(csi, 24)]; + T1e = T1c + T1d; + T4I = T1d - T1c; + } + { + E T7, Te, T1a, T1f; + T15 = T11 - T14; + T3t = T11 + T14; + T3U = T2J - T2M; + T2N = T2J + T2M; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + T6b = T7 - Te; + { + E T6s, T6t, T4H, T4K; + T6s = T4J + T4I; + T6t = T5n - T5m; + T6u = T6s + T6t; + T6R = T6t - T6s; + T4H = T3 - T6; + T4K = T4I - T4J; + T4L = T4H + T4K; + T5J = T4H - T4K; + } + T1a = T16 - T19; + T1f = T1b - T1e; + T1g = KP707106781 * (T1a + T1f); + T3V = KP707106781 * (T1a - T1f); + { + E T5o, T5p, T2G, T2H; + T5o = T5m + T5n; + T5p = Ta - Td; + T5q = T5o - T5p; + T5U = T5p + T5o; + T2G = T16 + T19; + T2H = T1b + T1e; + T2I = KP707106781 * (T2G - T2H); + T3u = KP707106781 * (T2G + T2H); + } + } + } + { + E Ti, T1i, T1q, T4N, Tl, T1n, T1l, T4O, Tp, T1t, T1B, T4S, Ts, T1y, T1w; + E T4T; + { + E Tg, Th, T1o, T1p; + Tg = Cr[WS(csr, 4)]; + Th = Cr[WS(csr, 27)]; + Ti = Tg + Th; + T1i = Tg - Th; + T1o = Ci[WS(csi, 4)]; + T1p = Ci[WS(csi, 27)]; + T1q = T1o + T1p; + T4N = T1o - T1p; + } + { + E Tj, Tk, T1j, T1k; + Tj = Cr[WS(csr, 20)]; + Tk = Cr[WS(csr, 11)]; + Tl = Tj + Tk; + T1n = Tj - Tk; + T1j = Ci[WS(csi, 20)]; + T1k = Ci[WS(csi, 11)]; + T1l = T1j + T1k; + T4O = T1j - T1k; + } + { + E Tn, To, T1z, T1A; + Tn = Cr[WS(csr, 3)]; + To = Cr[WS(csr, 28)]; + Tp = Tn + To; + T1t = Tn - To; + T1z = Ci[WS(csi, 3)]; + T1A = Ci[WS(csi, 28)]; + T1B = T1z + T1A; + T4S = T1A - T1z; + } + { + E Tq, Tr, T1u, T1v; + Tq = Cr[WS(csr, 12)]; + Tr = Cr[WS(csr, 19)]; + Ts = Tq + Tr; + T1y = Tq - Tr; + T1u = Ci[WS(csi, 12)]; + T1v = Ci[WS(csi, 19)]; + T1w = T1u + T1v; + T4T = T1u - T1v; + } + { + E Tm, Tt, T4R, T4U; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T6v = Tm - Tt; + T4R = Tp - Ts; + T4U = T4S - T4T; + T4V = T4R + T4U; + T5s = T4U - T4R; + } + { + E T6c, T6d, T1m, T1r; + T6c = T4T + T4S; + T6d = T4O + T4N; + T6e = T6c - T6d; + T6Q = T6d + T6c; + T1m = T1i - T1l; + T1r = T1n + T1q; + T1s = FNMS(KP382683432, T1r, KP923879532 * T1m); + T2D = FMA(KP382683432, T1m, KP923879532 * T1r); + } + { + E T1x, T1C, T3z, T3A; + T1x = T1t - T1w; + T1C = T1y - T1B; + T1D = FMA(KP923879532, T1x, KP382683432 * T1C); + T2E = FNMS(KP382683432, T1x, KP923879532 * T1C); + T3z = T1t + T1w; + T3A = T1y + T1B; + T3B = FNMS(KP923879532, T3A, KP382683432 * T3z); + T3Y = FMA(KP923879532, T3z, KP382683432 * T3A); + } + { + E T4M, T4P, T3w, T3x; + T4M = Ti - Tl; + T4P = T4N - T4O; + T4Q = T4M - T4P; + T5r = T4M + T4P; + T3w = T1i + T1l; + T3x = T1q - T1n; + T3y = FNMS(KP923879532, T3x, KP382683432 * T3w); + T3X = FMA(KP923879532, T3w, KP382683432 * T3x); + } + } + { + E Ty, T1G, T23, T54, TB, T20, T1J, T55, TI, T4Z, T1U, T1Y, TF, T50, T1P; + E T1X; + { + E Tw, Tx, T1H, T1I; + Tw = Cr[WS(csr, 2)]; + Tx = Cr[WS(csr, 29)]; + Ty = Tw + Tx; + T1G = Tw - Tx; + { + E T21, T22, Tz, TA; + T21 = Ci[WS(csi, 2)]; + T22 = Ci[WS(csi, 29)]; + T23 = T21 + T22; + T54 = T21 - T22; + Tz = Cr[WS(csr, 18)]; + TA = Cr[WS(csr, 13)]; + TB = Tz + TA; + T20 = Tz - TA; + } + T1H = Ci[WS(csi, 18)]; + T1I = Ci[WS(csi, 13)]; + T1J = T1H + T1I; + T55 = T1H - T1I; + { + E TG, TH, T1Q, T1R, T1S, T1T; + TG = Cr[WS(csr, 5)]; + TH = Cr[WS(csr, 26)]; + T1Q = TG - TH; + T1R = Ci[WS(csi, 5)]; + T1S = Ci[WS(csi, 26)]; + T1T = T1R + T1S; + TI = TG + TH; + T4Z = T1S - T1R; + T1U = T1Q - T1T; + T1Y = T1Q + T1T; + } + { + E TD, TE, T1L, T1M, T1N, T1O; + TD = Cr[WS(csr, 10)]; + TE = Cr[WS(csr, 21)]; + T1L = TD - TE; + T1M = Ci[WS(csi, 10)]; + T1N = Ci[WS(csi, 21)]; + T1O = T1M + T1N; + TF = TD + TE; + T50 = T1M - T1N; + T1P = T1L - T1O; + T1X = T1L + T1O; + } + } + { + E TC, TJ, T53, T56; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T6g = TC - TJ; + T53 = TF - TI; + T56 = T54 - T55; + T57 = T53 + T56; + T5N = T56 - T53; + } + { + E T6h, T6i, T1K, T1V; + T6h = T55 + T54; + T6i = T50 + T4Z; + T6j = T6h - T6i; + T6N = T6i + T6h; + T1K = T1G - T1J; + T1V = KP707106781 * (T1P + T1U); + T1W = T1K + T1V; + T34 = T1K - T1V; + } + { + E T1Z, T24, T3H, T3I; + T1Z = KP707106781 * (T1X - T1Y); + T24 = T20 + T23; + T25 = T1Z + T24; + T35 = T24 - T1Z; + T3H = KP707106781 * (T1P - T1U); + T3I = T23 - T20; + T3J = T3H + T3I; + T4j = T3I - T3H; + } + { + E T4Y, T51, T3E, T3F; + T4Y = Ty - TB; + T51 = T4Z - T50; + T52 = T4Y + T51; + T5M = T4Y - T51; + T3E = T1G + T1J; + T3F = KP707106781 * (T1X + T1Y); + T3G = T3E - T3F; + T4i = T3E + T3F; + } + } + { + E TN, T27, T2u, T5f, TQ, T2r, T2a, T5g, TX, T5a, T2l, T2p, TU, T5b, T2g; + E T2o; + { + E TL, TM, T28, T29; + TL = Cr[WS(csr, 1)]; + TM = Cr[WS(csr, 30)]; + TN = TL + TM; + T27 = TL - TM; + { + E T2s, T2t, TO, TP; + T2s = Ci[WS(csi, 1)]; + T2t = Ci[WS(csi, 30)]; + T2u = T2s + T2t; + T5f = T2t - T2s; + TO = Cr[WS(csr, 14)]; + TP = Cr[WS(csr, 17)]; + TQ = TO + TP; + T2r = TO - TP; + } + T28 = Ci[WS(csi, 14)]; + T29 = Ci[WS(csi, 17)]; + T2a = T28 + T29; + T5g = T28 - T29; + { + E TV, TW, T2h, T2i, T2j, T2k; + TV = Cr[WS(csr, 9)]; + TW = Cr[WS(csr, 22)]; + T2h = TV - TW; + T2i = Ci[WS(csi, 9)]; + T2j = Ci[WS(csi, 22)]; + T2k = T2i + T2j; + TX = TV + TW; + T5a = T2j - T2i; + T2l = T2h - T2k; + T2p = T2h + T2k; + } + { + E TS, TT, T2c, T2d, T2e, T2f; + TS = Cr[WS(csr, 6)]; + TT = Cr[WS(csr, 25)]; + T2c = TS - TT; + T2d = Ci[WS(csi, 6)]; + T2e = Ci[WS(csi, 25)]; + T2f = T2d + T2e; + TU = TS + TT; + T5b = T2d - T2e; + T2g = T2c - T2f; + T2o = T2c + T2f; + } + } + { + E TR, TY, T5e, T5h; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T6l = TR - TY; + T5e = TU - TX; + T5h = T5f - T5g; + T5i = T5e + T5h; + T5Q = T5h - T5e; + } + { + E T6m, T6n, T2b, T2m; + T6m = T5g + T5f; + T6n = T5b + T5a; + T6o = T6m - T6n; + T6M = T6n + T6m; + T2b = T27 - T2a; + T2m = KP707106781 * (T2g + T2l); + T2n = T2b + T2m; + T37 = T2b - T2m; + } + { + E T2q, T2v, T3O, T3P; + T2q = KP707106781 * (T2o - T2p); + T2v = T2r - T2u; + T2w = T2q + T2v; + T38 = T2v - T2q; + T3O = KP707106781 * (T2g - T2l); + T3P = T2r + T2u; + T3Q = T3O - T3P; + T4m = T3O + T3P; + } + { + E T59, T5c, T3L, T3M; + T59 = TN - TQ; + T5c = T5a - T5b; + T5d = T59 + T5c; + T5P = T59 - T5c; + T3L = T27 + T2a; + T3M = KP707106781 * (T2o + T2p); + T3N = T3L - T3M; + T4l = T3L + T3M; + } + } + { + E Tv, T10, T6X, T6Y, T6Z, T70; + Tv = Tf + Tu; + T10 = TK + TZ; + T6X = Tv - T10; + T6Y = T6N + T6M; + T6Z = T6R - T6Q; + T70 = T6Y + T6Z; + R0[0] = KP2_000000000 * (Tv + T10); + R0[WS(rs, 16)] = KP2_000000000 * (T6Z - T6Y); + R0[WS(rs, 8)] = KP1_414213562 * (T6X + T70); + R0[WS(rs, 24)] = KP1_414213562 * (T70 - T6X); + } + { + E T6P, T6V, T6U, T6W; + { + E T6L, T6O, T6S, T6T; + T6L = Tf - Tu; + T6O = T6M - T6N; + T6P = T6L + T6O; + T6V = T6L - T6O; + T6S = T6Q + T6R; + T6T = TK - TZ; + T6U = T6S - T6T; + T6W = T6T + T6S; + } + R0[WS(rs, 4)] = FMA(KP1_847759065, T6P, KP765366864 * T6U); + R0[WS(rs, 28)] = FNMS(KP1_847759065, T6V, KP765366864 * T6W); + R0[WS(rs, 20)] = FNMS(KP765366864, T6P, KP1_847759065 * T6U); + R0[WS(rs, 12)] = FMA(KP765366864, T6V, KP1_847759065 * T6W); + } + { + E T6f, T6w, T6G, T6D, T6z, T6E, T6q, T6H; + T6f = T6b + T6e; + T6w = T6u - T6v; + T6G = T6v + T6u; + T6D = T6b - T6e; + { + E T6x, T6y, T6k, T6p; + T6x = T6g + T6j; + T6y = T6o - T6l; + T6z = KP707106781 * (T6x + T6y); + T6E = KP707106781 * (T6y - T6x); + T6k = T6g - T6j; + T6p = T6l + T6o; + T6q = KP707106781 * (T6k + T6p); + T6H = KP707106781 * (T6k - T6p); + } + { + E T6r, T6A, T6J, T6K; + T6r = T6f + T6q; + T6A = T6w - T6z; + R0[WS(rs, 2)] = FMA(KP1_961570560, T6r, KP390180644 * T6A); + R0[WS(rs, 18)] = FNMS(KP390180644, T6r, KP1_961570560 * T6A); + T6J = T6D - T6E; + T6K = T6H + T6G; + R0[WS(rs, 14)] = FMA(KP390180644, T6J, KP1_961570560 * T6K); + R0[WS(rs, 30)] = FNMS(KP1_961570560, T6J, KP390180644 * T6K); + } + { + E T6B, T6C, T6F, T6I; + T6B = T6f - T6q; + T6C = T6z + T6w; + R0[WS(rs, 10)] = FMA(KP1_111140466, T6B, KP1_662939224 * T6C); + R0[WS(rs, 26)] = FNMS(KP1_662939224, T6B, KP1_111140466 * T6C); + T6F = T6D + T6E; + T6I = T6G - T6H; + R0[WS(rs, 6)] = FMA(KP1_662939224, T6F, KP1_111140466 * T6I); + R0[WS(rs, 22)] = FNMS(KP1_111140466, T6F, KP1_662939224 * T6I); + } + } + { + E T5L, T63, T5W, T66, T5S, T67, T5Z, T64, T5K, T5V; + T5K = KP707106781 * (T5s - T5r); + T5L = T5J + T5K; + T63 = T5J - T5K; + T5V = KP707106781 * (T4Q - T4V); + T5W = T5U - T5V; + T66 = T5V + T5U; + { + E T5O, T5R, T5X, T5Y; + T5O = FNMS(KP923879532, T5N, KP382683432 * T5M); + T5R = FMA(KP382683432, T5P, KP923879532 * T5Q); + T5S = T5O + T5R; + T67 = T5O - T5R; + T5X = FMA(KP923879532, T5M, KP382683432 * T5N); + T5Y = FNMS(KP923879532, T5P, KP382683432 * T5Q); + T5Z = T5X + T5Y; + T64 = T5Y - T5X; + } + { + E T5T, T60, T69, T6a; + T5T = T5L + T5S; + T60 = T5W - T5Z; + R0[WS(rs, 3)] = FMA(KP1_913880671, T5T, KP580569354 * T60); + R0[WS(rs, 19)] = FNMS(KP580569354, T5T, KP1_913880671 * T60); + T69 = T63 - T64; + T6a = T67 + T66; + R0[WS(rs, 15)] = FMA(KP196034280, T69, KP1_990369453 * T6a); + R0[WS(rs, 31)] = FNMS(KP1_990369453, T69, KP196034280 * T6a); + } + { + E T61, T62, T65, T68; + T61 = T5L - T5S; + T62 = T5Z + T5W; + R0[WS(rs, 11)] = FMA(KP942793473, T61, KP1_763842528 * T62); + R0[WS(rs, 27)] = FNMS(KP1_763842528, T61, KP942793473 * T62); + T65 = T63 + T64; + T68 = T66 - T67; + R0[WS(rs, 7)] = FMA(KP1_546020906, T65, KP1_268786568 * T68); + R0[WS(rs, 23)] = FNMS(KP1_268786568, T65, KP1_546020906 * T68); + } + } + { + E T4X, T5B, T5u, T5E, T5k, T5F, T5x, T5C, T4W, T5t; + T4W = KP707106781 * (T4Q + T4V); + T4X = T4L + T4W; + T5B = T4L - T4W; + T5t = KP707106781 * (T5r + T5s); + T5u = T5q - T5t; + T5E = T5t + T5q; + { + E T58, T5j, T5v, T5w; + T58 = FNMS(KP382683432, T57, KP923879532 * T52); + T5j = FMA(KP923879532, T5d, KP382683432 * T5i); + T5k = T58 + T5j; + T5F = T58 - T5j; + T5v = FMA(KP382683432, T52, KP923879532 * T57); + T5w = FNMS(KP382683432, T5d, KP923879532 * T5i); + T5x = T5v + T5w; + T5C = T5w - T5v; + } + { + E T5l, T5y, T5H, T5I; + T5l = T4X + T5k; + T5y = T5u - T5x; + R0[WS(rs, 1)] = FMA(KP1_990369453, T5l, KP196034280 * T5y); + R0[WS(rs, 17)] = FNMS(KP196034280, T5l, KP1_990369453 * T5y); + T5H = T5B - T5C; + T5I = T5F + T5E; + R0[WS(rs, 13)] = FMA(KP580569354, T5H, KP1_913880671 * T5I); + R0[WS(rs, 29)] = FNMS(KP1_913880671, T5H, KP580569354 * T5I); + } + { + E T5z, T5A, T5D, T5G; + T5z = T4X - T5k; + T5A = T5x + T5u; + R0[WS(rs, 9)] = FMA(KP1_268786568, T5z, KP1_546020906 * T5A); + R0[WS(rs, 25)] = FNMS(KP1_546020906, T5z, KP1_268786568 * T5A); + T5D = T5B + T5C; + T5G = T5E - T5F; + R0[WS(rs, 5)] = FMA(KP1_763842528, T5D, KP942793473 * T5G); + R0[WS(rs, 21)] = FNMS(KP942793473, T5D, KP1_763842528 * T5G); + } + } + { + E T33, T3l, T3h, T3m, T3a, T3p, T3e, T3o; + { + E T31, T32, T3f, T3g; + T31 = T15 - T1g; + T32 = T2E - T2D; + T33 = T31 + T32; + T3l = T31 - T32; + T3f = FMA(KP831469612, T34, KP555570233 * T35); + T3g = FNMS(KP831469612, T37, KP555570233 * T38); + T3h = T3f + T3g; + T3m = T3g - T3f; + } + { + E T36, T39, T3c, T3d; + T36 = FNMS(KP831469612, T35, KP555570233 * T34); + T39 = FMA(KP555570233, T37, KP831469612 * T38); + T3a = T36 + T39; + T3p = T36 - T39; + T3c = T2I - T2N; + T3d = T1s - T1D; + T3e = T3c - T3d; + T3o = T3d + T3c; + } + { + E T3b, T3i, T3r, T3s; + T3b = T33 + T3a; + T3i = T3e - T3h; + R1[WS(rs, 2)] = FMA(KP1_940062506, T3b, KP485960359 * T3i); + R1[WS(rs, 18)] = FNMS(KP485960359, T3b, KP1_940062506 * T3i); + T3r = T3l - T3m; + T3s = T3p + T3o; + R1[WS(rs, 14)] = FMA(KP293460948, T3r, KP1_978353019 * T3s); + R1[WS(rs, 30)] = FNMS(KP1_978353019, T3r, KP293460948 * T3s); + } + { + E T3j, T3k, T3n, T3q; + T3j = T33 - T3a; + T3k = T3h + T3e; + R1[WS(rs, 10)] = FMA(KP1_028205488, T3j, KP1_715457220 * T3k); + R1[WS(rs, 26)] = FNMS(KP1_715457220, T3j, KP1_028205488 * T3k); + T3n = T3l + T3m; + T3q = T3o - T3p; + R1[WS(rs, 6)] = FMA(KP1_606415062, T3n, KP1_191398608 * T3q); + R1[WS(rs, 22)] = FNMS(KP1_191398608, T3n, KP1_606415062 * T3q); + } + } + { + E T4h, T4z, T4v, T4A, T4o, T4D, T4s, T4C; + { + E T4f, T4g, T4t, T4u; + T4f = T3t + T3u; + T4g = T3X + T3Y; + T4h = T4f - T4g; + T4z = T4f + T4g; + T4t = FMA(KP980785280, T4i, KP195090322 * T4j); + T4u = FMA(KP980785280, T4l, KP195090322 * T4m); + T4v = T4t - T4u; + T4A = T4t + T4u; + } + { + E T4k, T4n, T4q, T4r; + T4k = FNMS(KP980785280, T4j, KP195090322 * T4i); + T4n = FNMS(KP980785280, T4m, KP195090322 * T4l); + T4o = T4k + T4n; + T4D = T4k - T4n; + T4q = T3V + T3U; + T4r = T3y - T3B; + T4s = T4q - T4r; + T4C = T4r + T4q; + } + { + E T4p, T4w, T4F, T4G; + T4p = T4h + T4o; + T4w = T4s - T4v; + R1[WS(rs, 3)] = FMA(KP1_883088130, T4p, KP673779706 * T4w); + R1[WS(rs, 19)] = FNMS(KP673779706, T4p, KP1_883088130 * T4w); + T4F = T4z + T4A; + T4G = T4D + T4C; + R1[WS(rs, 15)] = FMA(KP098135348, T4F, KP1_997590912 * T4G); + R1[WS(rs, 31)] = FNMS(KP1_997590912, T4F, KP098135348 * T4G); + } + { + E T4x, T4y, T4B, T4E; + T4x = T4h - T4o; + T4y = T4v + T4s; + R1[WS(rs, 11)] = FMA(KP855110186, T4x, KP1_807978586 * T4y); + R1[WS(rs, 27)] = FNMS(KP1_807978586, T4x, KP855110186 * T4y); + T4B = T4z - T4A; + T4E = T4C - T4D; + R1[WS(rs, 7)] = FMA(KP1_481902250, T4B, KP1_343117909 * T4E); + R1[WS(rs, 23)] = FNMS(KP1_343117909, T4B, KP1_481902250 * T4E); + } + } + { + E T1F, T2T, T2P, T2W, T2y, T2X, T2C, T2U; + { + E T1h, T1E, T2F, T2O; + T1h = T15 + T1g; + T1E = T1s + T1D; + T1F = T1h + T1E; + T2T = T1h - T1E; + T2F = T2D + T2E; + T2O = T2I + T2N; + T2P = T2F + T2O; + T2W = T2F - T2O; + } + { + E T26, T2x, T2A, T2B; + T26 = FNMS(KP195090322, T25, KP980785280 * T1W); + T2x = FMA(KP980785280, T2n, KP195090322 * T2w); + T2y = T26 + T2x; + T2X = T26 - T2x; + T2A = FMA(KP195090322, T1W, KP980785280 * T25); + T2B = FNMS(KP195090322, T2n, KP980785280 * T2w); + T2C = T2A + T2B; + T2U = T2B - T2A; + } + { + E T2z, T2Q, T2Z, T30; + T2z = T1F + T2y; + T2Q = T2C + T2P; + R1[0] = FNMS(KP098135348, T2Q, KP1_997590912 * T2z); + R1[WS(rs, 16)] = -(FMA(KP098135348, T2z, KP1_997590912 * T2Q)); + T2Z = T2T - T2U; + T30 = T2X + T2W; + R1[WS(rs, 12)] = FMA(KP673779706, T2Z, KP1_883088130 * T30); + R1[WS(rs, 28)] = FNMS(KP1_883088130, T2Z, KP673779706 * T30); + } + { + E T2R, T2S, T2V, T2Y; + T2R = T1F - T2y; + T2S = T2C - T2P; + R1[WS(rs, 8)] = FMA(KP1_343117909, T2R, KP1_481902250 * T2S); + R1[WS(rs, 24)] = FNMS(KP1_481902250, T2R, KP1_343117909 * T2S); + T2V = T2T + T2U; + T2Y = T2W - T2X; + R1[WS(rs, 4)] = FMA(KP1_807978586, T2V, KP855110186 * T2Y); + R1[WS(rs, 20)] = FNMS(KP855110186, T2V, KP1_807978586 * T2Y); + } + } + { + E T3D, T47, T43, T48, T3S, T4b, T40, T4a; + { + E T3v, T3C, T41, T42; + T3v = T3t - T3u; + T3C = T3y + T3B; + T3D = T3v + T3C; + T47 = T3v - T3C; + T41 = FMA(KP555570233, T3G, KP831469612 * T3J); + T42 = FNMS(KP555570233, T3N, KP831469612 * T3Q); + T43 = T41 + T42; + T48 = T42 - T41; + } + { + E T3K, T3R, T3W, T3Z; + T3K = FNMS(KP555570233, T3J, KP831469612 * T3G); + T3R = FMA(KP831469612, T3N, KP555570233 * T3Q); + T3S = T3K + T3R; + T4b = T3K - T3R; + T3W = T3U - T3V; + T3Z = T3X - T3Y; + T40 = T3W - T3Z; + T4a = T3Z + T3W; + } + { + E T3T, T44, T4d, T4e; + T3T = T3D + T3S; + T44 = T40 - T43; + R1[WS(rs, 1)] = FMA(KP1_978353019, T3T, KP293460948 * T44); + R1[WS(rs, 17)] = FNMS(KP293460948, T3T, KP1_978353019 * T44); + T4d = T47 - T48; + T4e = T4b + T4a; + R1[WS(rs, 13)] = FMA(KP485960359, T4d, KP1_940062506 * T4e); + R1[WS(rs, 29)] = FNMS(KP1_940062506, T4d, KP485960359 * T4e); + } + { + E T45, T46, T49, T4c; + T45 = T3D - T3S; + T46 = T43 + T40; + R1[WS(rs, 9)] = FMA(KP1_191398608, T45, KP1_606415062 * T46); + R1[WS(rs, 25)] = FNMS(KP1_606415062, T45, KP1_191398608 * T46); + T49 = T47 + T48; + T4c = T4a - T4b; + R1[WS(rs, 5)] = FMA(KP1_715457220, T49, KP1_028205488 * T4c); + R1[WS(rs, 21)] = FNMS(KP1_028205488, T49, KP1_715457220 * T4c); + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cbIII_64", {342, 116, 92, 0}, &GENUS }; + +void X(codelet_r2cbIII_64) (planner *p) { + X(kr2c_register) (p, r2cbIII_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_7.c new file mode 100644 index 000000000..e92a06daa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_7.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 7 -name r2cbIII_7 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 24 FP additions, 22 FP multiplications, + * (or, 2 additions, 0 multiplications, 22 fused multiply/add), + * 27 stack variables, 7 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_949855824, +1.949855824363647214036263365987862434465571601); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP1_801937735, +1.801937735804838252472204639014890102331838324); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T1, T9, Tb, Ta, Tc, Tm, Th, T7, Tk, Tf, T5, Tl, Tn; + T1 = Cr[WS(csr, 3)]; + T9 = Ci[WS(csi, 1)]; + Tb = Ci[0]; + Ta = Ci[WS(csi, 2)]; + Tc = FMA(KP554958132, Tb, Ta); + Tm = FNMS(KP554958132, Ta, T9); + Th = FMA(KP554958132, T9, Tb); + { + E T2, T4, T3, T6, Tj, Te; + T2 = Cr[WS(csr, 2)]; + T4 = Cr[0]; + T3 = Cr[WS(csr, 1)]; + T6 = FNMS(KP356895867, T3, T2); + Tj = FNMS(KP356895867, T4, T3); + Te = FNMS(KP356895867, T2, T4); + T7 = FNMS(KP692021471, T6, T4); + Tk = FNMS(KP692021471, Tj, T2); + Tf = FNMS(KP692021471, Te, T3); + T5 = T2 + T3 + T4; + } + R0[0] = FMA(KP2_000000000, T5, T1); + Tl = FNMS(KP1_801937735, Tk, T1); + Tn = FNMS(KP801937735, Tm, Tb); + R1[WS(rs, 1)] = -(FMA(KP1_949855824, Tn, Tl)); + R0[WS(rs, 2)] = FNMS(KP1_949855824, Tn, Tl); + { + E T8, Td, Tg, Ti; + T8 = FNMS(KP1_801937735, T7, T1); + Td = FMA(KP801937735, Tc, T9); + R1[0] = -(FMA(KP1_949855824, Td, T8)); + R0[WS(rs, 3)] = FNMS(KP1_949855824, Td, T8); + Tg = FNMS(KP1_801937735, Tf, T1); + Ti = FNMS(KP801937735, Th, Ta); + R0[WS(rs, 1)] = FMA(KP1_949855824, Ti, Tg); + R1[WS(rs, 2)] = FMS(KP1_949855824, Ti, Tg); + } + } + } +} + +static const kr2c_desc desc = { 7, "r2cbIII_7", {2, 0, 22, 0}, &GENUS }; + +void X(codelet_r2cbIII_7) (planner *p) { + X(kr2c_register) (p, r2cbIII_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 7 -name r2cbIII_7 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 24 FP additions, 19 FP multiplications, + * (or, 9 additions, 4 multiplications, 15 fused multiply/add), + * 21 stack variables, 7 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_246979603, +1.246979603717467061050009768008479621264549462); + DK(KP1_801937735, +1.801937735804838252472204639014890102331838324); + DK(KP445041867, +0.445041867912628808577805128993589518932711138); + DK(KP867767478, +0.867767478235116240951536665696717509219981456); + DK(KP1_949855824, +1.949855824363647214036263365987862434465571601); + DK(KP1_563662964, +1.563662964936059617416889053348115500464669037); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T9, Td, Tb, T1, T4, T2, T3, T5, Tc, Ta, T6, T8, T7; + T6 = Ci[WS(csi, 2)]; + T8 = Ci[0]; + T7 = Ci[WS(csi, 1)]; + T9 = FMA(KP1_563662964, T6, KP1_949855824 * T7) + (KP867767478 * T8); + Td = FNMS(KP1_949855824, T8, KP1_563662964 * T7) - (KP867767478 * T6); + Tb = FNMS(KP1_563662964, T8, KP1_949855824 * T6) - (KP867767478 * T7); + T1 = Cr[WS(csr, 3)]; + T4 = Cr[0]; + T2 = Cr[WS(csr, 2)]; + T3 = Cr[WS(csr, 1)]; + T5 = FMA(KP445041867, T3, KP1_801937735 * T4) + FNMA(KP1_246979603, T2, T1); + Tc = FMA(KP1_801937735, T2, KP445041867 * T4) + FNMA(KP1_246979603, T3, T1); + Ta = FMA(KP1_246979603, T4, T1) + FNMA(KP1_801937735, T3, KP445041867 * T2); + R1[0] = T5 - T9; + R0[WS(rs, 3)] = -(T5 + T9); + R0[WS(rs, 2)] = Td - Tc; + R1[WS(rs, 1)] = Tc + Td; + R1[WS(rs, 2)] = Tb - Ta; + R0[WS(rs, 1)] = Ta + Tb; + R0[0] = FMA(KP2_000000000, T2 + T3 + T4, T1); + } + } +} + +static const kr2c_desc desc = { 7, "r2cbIII_7", {9, 4, 15, 0}, &GENUS }; + +void X(codelet_r2cbIII_7) (planner *p) { + X(kr2c_register) (p, r2cbIII_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_8.c new file mode 100644 index 000000000..95381dcc0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_8.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -name r2cbIII_8 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 18 additions, 8 multiplications, 4 fused multiply/add), + * 19 stack variables, 4 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T3, T7, Tf, Tl, T6, Tc, Ta, Tk, Tb, Tg; + { + E T1, T2, Td, Te; + T1 = Cr[0]; + T2 = Cr[WS(csr, 3)]; + T3 = T1 + T2; + T7 = T1 - T2; + Td = Ci[0]; + Te = Ci[WS(csi, 3)]; + Tf = Td + Te; + Tl = Te - Td; + } + { + E T4, T5, T8, T9; + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 1)]; + T6 = T4 + T5; + Tc = T4 - T5; + T8 = Ci[WS(csi, 2)]; + T9 = Ci[WS(csi, 1)]; + Ta = T8 + T9; + Tk = T8 - T9; + } + R0[0] = KP2_000000000 * (T3 + T6); + R0[WS(rs, 2)] = KP2_000000000 * (Tl - Tk); + Tb = T7 - Ta; + Tg = Tc + Tf; + R1[0] = KP1_847759065 * (FNMS(KP414213562, Tg, Tb)); + R1[WS(rs, 2)] = -(KP1_847759065 * (FMA(KP414213562, Tb, Tg))); + { + E Th, Ti, Tj, Tm; + Th = Tc - Tf; + Ti = T7 + Ta; + R1[WS(rs, 1)] = KP1_847759065 * (FMA(KP414213562, Ti, Th)); + R1[WS(rs, 3)] = -(KP1_847759065 * (FNMS(KP414213562, Th, Ti))); + Tj = T3 - T6; + Tm = Tk + Tl; + R0[WS(rs, 1)] = KP1_414213562 * (Tj + Tm); + R0[WS(rs, 3)] = KP1_414213562 * (Tm - Tj); + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cbIII_8", {18, 8, 4, 0}, &GENUS }; + +void X(codelet_r2cbIII_8) (planner *p) { + X(kr2c_register) (p, r2cbIII_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -name r2cbIII_8 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 18 additions, 8 multiplications, 4 fused multiply/add), + * 19 stack variables, 4 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T3, T7, Tf, Tl, T6, Tc, Ta, Tk, Tb, Tg; + { + E T1, T2, Td, Te; + T1 = Cr[0]; + T2 = Cr[WS(csr, 3)]; + T3 = T1 + T2; + T7 = T1 - T2; + Td = Ci[0]; + Te = Ci[WS(csi, 3)]; + Tf = Td + Te; + Tl = Te - Td; + } + { + E T4, T5, T8, T9; + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 1)]; + T6 = T4 + T5; + Tc = T4 - T5; + T8 = Ci[WS(csi, 2)]; + T9 = Ci[WS(csi, 1)]; + Ta = T8 + T9; + Tk = T8 - T9; + } + R0[0] = KP2_000000000 * (T3 + T6); + R0[WS(rs, 2)] = KP2_000000000 * (Tl - Tk); + Tb = T7 - Ta; + Tg = Tc + Tf; + R1[0] = FNMS(KP765366864, Tg, KP1_847759065 * Tb); + R1[WS(rs, 2)] = -(FMA(KP765366864, Tb, KP1_847759065 * Tg)); + { + E Th, Ti, Tj, Tm; + Th = T7 + Ta; + Ti = Tc - Tf; + R1[WS(rs, 1)] = FMA(KP765366864, Th, KP1_847759065 * Ti); + R1[WS(rs, 3)] = FNMS(KP1_847759065, Th, KP765366864 * Ti); + Tj = T3 - T6; + Tm = Tk + Tl; + R0[WS(rs, 1)] = KP1_414213562 * (Tj + Tm); + R0[WS(rs, 3)] = KP1_414213562 * (Tm - Tj); + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cbIII_8", {18, 8, 4, 0}, &GENUS }; + +void X(codelet_r2cbIII_8) (planner *p) { + X(kr2c_register) (p, r2cbIII_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_9.c new file mode 100644 index 000000000..8b16bd62d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cbIII_9.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 9 -name r2cbIII_9 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 32 FP additions, 24 FP multiplications, + * (or, 8 additions, 0 multiplications, 24 fused multiply/add), + * 35 stack variables, 12 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_705737063, +1.705737063904886419256501927880148143872040591); + DK(KP1_969615506, +1.969615506024416118733486049179046027341286503); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP176326980, +0.176326980708464973471090386868618986121633062); + DK(KP1_326827896, +1.326827896337876792410842639271782594433726619); + DK(KP1_532088886, +1.532088886237956070404785301110833347871664914); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP839099631, +0.839099631177280011763127298123181364687434283); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T3, Tr, Th, Td, Tc, T8, Tn, Ts, Tk, Tt, T9, Te; + { + E Tg, T1, T2, Tf; + Tg = Ci[WS(csi, 1)]; + T1 = Cr[WS(csr, 4)]; + T2 = Cr[WS(csr, 1)]; + Tf = T2 - T1; + T3 = FMA(KP2_000000000, T2, T1); + Tr = FMA(KP1_732050807, Tg, Tf); + Th = FNMS(KP1_732050807, Tg, Tf); + } + { + E T4, T7, Tm, Tj, Tl, Ti; + T4 = Cr[WS(csr, 3)]; + Td = Ci[WS(csi, 3)]; + { + E T5, T6, Ta, Tb; + T5 = Cr[0]; + T6 = Cr[WS(csr, 2)]; + T7 = T5 + T6; + Tm = T5 - T6; + Ta = Ci[WS(csi, 2)]; + Tb = Ci[0]; + Tc = Ta - Tb; + Tj = Tb + Ta; + } + T8 = T4 + T7; + Tl = FMA(KP500000000, Tc, Td); + Tn = FNMS(KP866025403, Tm, Tl); + Ts = FMA(KP866025403, Tm, Tl); + Ti = FNMS(KP500000000, T7, T4); + Tk = FMA(KP866025403, Tj, Ti); + Tt = FNMS(KP866025403, Tj, Ti); + } + R0[0] = FMA(KP2_000000000, T8, T3); + T9 = T8 - T3; + Te = Tc - Td; + R1[WS(rs, 1)] = FMA(KP1_732050807, Te, T9); + R0[WS(rs, 3)] = FMS(KP1_732050807, Te, T9); + { + E Tq, To, Tp, Tw, Tu, Tv; + Tq = FNMS(KP839099631, Tk, Tn); + To = FMA(KP839099631, Tn, Tk); + Tp = FMA(KP766044443, To, Th); + R1[0] = FNMS(KP1_532088886, To, Th); + R1[WS(rs, 3)] = FMA(KP1_326827896, Tq, Tp); + R0[WS(rs, 2)] = FMS(KP1_326827896, Tq, Tp); + Tw = FNMS(KP176326980, Ts, Tt); + Tu = FMA(KP176326980, Tt, Ts); + Tv = FMA(KP984807753, Tu, Tr); + R0[WS(rs, 1)] = FMS(KP1_969615506, Tu, Tr); + R1[WS(rs, 2)] = FMA(KP1_705737063, Tw, Tv); + R0[WS(rs, 4)] = FMS(KP1_705737063, Tw, Tv); + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cbIII_9", {8, 0, 24, 0}, &GENUS }; + +void X(codelet_r2cbIII_9) (planner *p) { + X(kr2c_register) (p, r2cbIII_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 9 -name r2cbIII_9 -dft-III -include rdft/scalar/r2cbIII.h */ + +/* + * This function contains 32 FP additions, 18 FP multiplications, + * (or, 22 additions, 8 multiplications, 10 fused multiply/add), + * 35 stack variables, 12 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cbIII.h" + +static void r2cbIII_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP1_326827896, +1.326827896337876792410842639271782594433726619); + DK(KP1_113340798, +1.113340798452838732905825904094046265936583811); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP1_705737063, +1.705737063904886419256501927880148143872040591); + DK(KP300767466, +0.300767466360870593278543795225003852144476517); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T3, Ts, Ti, Td, Tc, T8, To, Tu, Tl, Tt, T9, Te; + { + E Th, T1, T2, Tf, Tg; + Tg = Ci[WS(csi, 1)]; + Th = KP1_732050807 * Tg; + T1 = Cr[WS(csr, 4)]; + T2 = Cr[WS(csr, 1)]; + Tf = T2 - T1; + T3 = FMA(KP2_000000000, T2, T1); + Ts = Tf - Th; + Ti = Tf + Th; + } + { + E T4, T7, Tm, Tk, Tn, Tj; + T4 = Cr[WS(csr, 3)]; + Td = Ci[WS(csi, 3)]; + { + E T5, T6, Ta, Tb; + T5 = Cr[0]; + T6 = Cr[WS(csr, 2)]; + T7 = T5 + T6; + Tm = KP866025403 * (T6 - T5); + Ta = Ci[WS(csi, 2)]; + Tb = Ci[0]; + Tc = Ta - Tb; + Tk = KP866025403 * (Tb + Ta); + } + T8 = T4 + T7; + Tn = FMA(KP500000000, Tc, Td); + To = Tm - Tn; + Tu = Tm + Tn; + Tj = FMS(KP500000000, T7, T4); + Tl = Tj + Tk; + Tt = Tj - Tk; + } + R0[0] = FMA(KP2_000000000, T8, T3); + T9 = T8 - T3; + Te = KP1_732050807 * (Tc - Td); + R1[WS(rs, 1)] = T9 + Te; + R0[WS(rs, 3)] = Te - T9; + { + E Tr, Tp, Tq, Tx, Tv, Tw; + Tr = FNMS(KP1_705737063, Tl, KP300767466 * To); + Tp = FMA(KP173648177, Tl, KP984807753 * To); + Tq = Ti - Tp; + R0[WS(rs, 1)] = -(FMA(KP2_000000000, Tp, Ti)); + R0[WS(rs, 4)] = Tr - Tq; + R1[WS(rs, 2)] = Tq + Tr; + Tx = FMA(KP1_113340798, Tt, KP1_326827896 * Tu); + Tv = FNMS(KP642787609, Tu, KP766044443 * Tt); + Tw = Tv - Ts; + R1[0] = FMA(KP2_000000000, Tv, Ts); + R1[WS(rs, 3)] = Tx - Tw; + R0[WS(rs, 2)] = Tw + Tx; + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cbIII_9", {22, 8, 10, 0}, &GENUS }; + +void X(codelet_r2cbIII_9) (planner *p) { + X(kr2c_register) (p, r2cbIII_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_10.c new file mode 100644 index 000000000..c8369ec4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_10.c @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -name r2cb_10 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 34 FP additions, 20 FP multiplications, + * (or, 14 additions, 0 multiplications, 20 fused multiply/add), + * 26 stack variables, 5 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T3, Tb, Tn, Tu, Tk, Tv, Ta, Ts, Te, Tg, Ti, Tj; + { + E T1, T2, Tl, Tm; + T1 = Cr[0]; + T2 = Cr[WS(csr, 5)]; + T3 = T1 - T2; + Tb = T1 + T2; + Tl = Ci[WS(csi, 2)]; + Tm = Ci[WS(csi, 3)]; + Tn = Tl - Tm; + Tu = Tl + Tm; + } + Ti = Ci[WS(csi, 4)]; + Tj = Ci[WS(csi, 1)]; + Tk = Ti - Tj; + Tv = Ti + Tj; + { + E T6, Tc, T9, Td; + { + E T4, T5, T7, T8; + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 3)]; + T6 = T4 - T5; + Tc = T4 + T5; + T7 = Cr[WS(csr, 4)]; + T8 = Cr[WS(csr, 1)]; + T9 = T7 - T8; + Td = T7 + T8; + } + Ta = T6 + T9; + Ts = T6 - T9; + Te = Tc + Td; + Tg = Tc - Td; + } + R1[WS(rs, 2)] = FMA(KP2_000000000, Ta, T3); + R0[0] = FMA(KP2_000000000, Te, Tb); + { + E To, Tq, Th, Tp, Tf; + To = FNMS(KP618033988, Tn, Tk); + Tq = FMA(KP618033988, Tk, Tn); + Tf = FNMS(KP500000000, Te, Tb); + Th = FNMS(KP1_118033988, Tg, Tf); + Tp = FMA(KP1_118033988, Tg, Tf); + R0[WS(rs, 4)] = FNMS(KP1_902113032, To, Th); + R0[WS(rs, 2)] = FMA(KP1_902113032, Tq, Tp); + R0[WS(rs, 1)] = FMA(KP1_902113032, To, Th); + R0[WS(rs, 3)] = FNMS(KP1_902113032, Tq, Tp); + } + { + E Tw, Ty, Tt, Tx, Tr; + Tw = FMA(KP618033988, Tv, Tu); + Ty = FNMS(KP618033988, Tu, Tv); + Tr = FNMS(KP500000000, Ta, T3); + Tt = FMA(KP1_118033988, Ts, Tr); + Tx = FNMS(KP1_118033988, Ts, Tr); + R1[0] = FNMS(KP1_902113032, Tw, Tt); + R1[WS(rs, 3)] = FMA(KP1_902113032, Ty, Tx); + R1[WS(rs, 4)] = FMA(KP1_902113032, Tw, Tt); + R1[WS(rs, 1)] = FNMS(KP1_902113032, Ty, Tx); + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cb_10", {14, 0, 20, 0}, &GENUS }; + +void X(codelet_r2cb_10) (planner *p) { + X(kr2c_register) (p, r2cb_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 10 -name r2cb_10 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 34 FP additions, 14 FP multiplications, + * (or, 26 additions, 6 multiplications, 8 fused multiply/add), + * 26 stack variables, 5 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T3, Tb, Tn, Tv, Tk, Tu, Ta, Ts, Te, Tg, Ti, Tj; + { + E T1, T2, Tl, Tm; + T1 = Cr[0]; + T2 = Cr[WS(csr, 5)]; + T3 = T1 - T2; + Tb = T1 + T2; + Tl = Ci[WS(csi, 4)]; + Tm = Ci[WS(csi, 1)]; + Tn = Tl - Tm; + Tv = Tl + Tm; + } + Ti = Ci[WS(csi, 2)]; + Tj = Ci[WS(csi, 3)]; + Tk = Ti - Tj; + Tu = Ti + Tj; + { + E T6, Tc, T9, Td; + { + E T4, T5, T7, T8; + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 3)]; + T6 = T4 - T5; + Tc = T4 + T5; + T7 = Cr[WS(csr, 4)]; + T8 = Cr[WS(csr, 1)]; + T9 = T7 - T8; + Td = T7 + T8; + } + Ta = T6 + T9; + Ts = KP1_118033988 * (T6 - T9); + Te = Tc + Td; + Tg = KP1_118033988 * (Tc - Td); + } + R1[WS(rs, 2)] = FMA(KP2_000000000, Ta, T3); + R0[0] = FMA(KP2_000000000, Te, Tb); + { + E To, Tq, Th, Tp, Tf; + To = FNMS(KP1_902113032, Tn, KP1_175570504 * Tk); + Tq = FMA(KP1_902113032, Tk, KP1_175570504 * Tn); + Tf = FNMS(KP500000000, Te, Tb); + Th = Tf - Tg; + Tp = Tg + Tf; + R0[WS(rs, 1)] = Th - To; + R0[WS(rs, 2)] = Tp + Tq; + R0[WS(rs, 4)] = Th + To; + R0[WS(rs, 3)] = Tp - Tq; + } + { + E Tw, Ty, Tt, Tx, Tr; + Tw = FNMS(KP1_902113032, Tv, KP1_175570504 * Tu); + Ty = FMA(KP1_902113032, Tu, KP1_175570504 * Tv); + Tr = FNMS(KP500000000, Ta, T3); + Tt = Tr - Ts; + Tx = Ts + Tr; + R1[WS(rs, 3)] = Tt - Tw; + R1[WS(rs, 4)] = Tx + Ty; + R1[WS(rs, 1)] = Tt + Tw; + R1[0] = Tx - Ty; + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cb_10", {26, 6, 8, 0}, &GENUS }; + +void X(codelet_r2cb_10) (planner *p) { + X(kr2c_register) (p, r2cb_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_11.c new file mode 100644 index 000000000..cd5d595b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_11.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 11 -name r2cb_11 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 60 FP additions, 56 FP multiplications, + * (or, 4 additions, 0 multiplications, 56 fused multiply/add), + * 44 stack variables, 11 constants, and 22 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_11(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_979642883, +1.979642883761865464752184075553437574753038744); + DK(KP918985947, +0.918985947228994779780736114132655398124909697); + DK(KP830830026, +0.830830026003772851058548298459246407048009821); + DK(KP1_918985947, +1.918985947228994779780736114132655398124909697); + DK(KP876768831, +0.876768831002589333891339807079336796764054852); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP778434453, +0.778434453334651800608337670740821884709317477); + DK(KP634356270, +0.634356270682424498893150776899916060542806975); + DK(KP342584725, +0.342584725681637509502641509861112333758894680); + DK(KP715370323, +0.715370323453429719112414662767260662417897278); + DK(KP521108558, +0.521108558113202722944698153526659300680427422); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(44, rs), MAKE_VOLATILE_STRIDE(44, csr), MAKE_VOLATILE_STRIDE(44, csi)) { + E T1, Td, Th, Te, Tf, Tg, Tj, TT, Ts, TB, TK, T2, T6, T3, T4; + E T5, Ta, To, TP, TG, Tx, T7; + T1 = Cr[0]; + { + E Ti, TS, Tr, TA, TJ; + Td = Ci[WS(csi, 3)]; + Th = Ci[WS(csi, 5)]; + Te = Ci[WS(csi, 2)]; + Tf = Ci[WS(csi, 4)]; + Tg = Ci[WS(csi, 1)]; + Ti = FMA(KP521108558, Th, Tg); + TS = FMS(KP521108558, Tg, Te); + Tr = FMA(KP521108558, Td, Th); + TA = FNMS(KP521108558, Te, Tf); + TJ = FMA(KP521108558, Tf, Td); + Tj = FMA(KP715370323, Ti, Tf); + TT = FMA(KP715370323, TS, Td); + Ts = FNMS(KP715370323, Tr, Te); + TB = FMA(KP715370323, TA, Th); + TK = FMA(KP715370323, TJ, Tg); + } + { + E T8, TN, Tm, Tv, TE; + T2 = Cr[WS(csr, 1)]; + T6 = Cr[WS(csr, 5)]; + T3 = Cr[WS(csr, 2)]; + T4 = Cr[WS(csr, 3)]; + T5 = Cr[WS(csr, 4)]; + T8 = FNMS(KP342584725, T4, T3); + TN = FNMS(KP342584725, T6, T5); + Tm = FNMS(KP342584725, T5, T2); + Tv = FNMS(KP342584725, T2, T4); + TE = FNMS(KP342584725, T3, T6); + { + E T9, Tn, TO, TF, Tw; + T9 = FNMS(KP634356270, T8, T5); + Ta = FNMS(KP778434453, T9, T2); + Tn = FNMS(KP634356270, Tm, T3); + To = FNMS(KP778434453, Tn, T6); + TO = FNMS(KP634356270, TN, T4); + TP = FNMS(KP778434453, TO, T3); + TF = FNMS(KP634356270, TE, T2); + TG = FNMS(KP778434453, TF, T4); + Tw = FNMS(KP634356270, Tv, T6); + Tx = FNMS(KP778434453, Tw, T5); + T7 = T2 + T3 + T4 + T5 + T6; + } + } + R0[0] = FMA(KP2_000000000, T7, T1); + { + E Tc, Tl, Tb, Tk; + Tb = FNMS(KP876768831, Ta, T6); + Tc = FNMS(KP1_918985947, Tb, T1); + Tk = FMA(KP830830026, Tj, Te); + Tl = FMA(KP918985947, Tk, Td); + R1[0] = FNMS(KP1_979642883, Tl, Tc); + R0[WS(rs, 5)] = FMA(KP1_979642883, Tl, Tc); + } + { + E TR, TV, TQ, TU; + TQ = FNMS(KP876768831, TP, T2); + TR = FNMS(KP1_918985947, TQ, T1); + TU = FNMS(KP830830026, TT, Tf); + TV = FNMS(KP918985947, TU, Th); + R1[WS(rs, 2)] = FNMS(KP1_979642883, TV, TR); + R0[WS(rs, 3)] = FMA(KP1_979642883, TV, TR); + } + { + E TI, TM, TH, TL; + TH = FNMS(KP876768831, TG, T5); + TI = FNMS(KP1_918985947, TH, T1); + TL = FNMS(KP830830026, TK, Th); + TM = FMA(KP918985947, TL, Te); + R1[WS(rs, 3)] = FNMS(KP1_979642883, TM, TI); + R0[WS(rs, 2)] = FMA(KP1_979642883, TM, TI); + } + { + E Tz, TD, Ty, TC; + Ty = FNMS(KP876768831, Tx, T3); + Tz = FNMS(KP1_918985947, Ty, T1); + TC = FNMS(KP830830026, TB, Td); + TD = FNMS(KP918985947, TC, Tg); + R1[WS(rs, 1)] = FNMS(KP1_979642883, TD, Tz); + R0[WS(rs, 4)] = FMA(KP1_979642883, TD, Tz); + } + { + E Tq, Tu, Tp, Tt; + Tp = FNMS(KP876768831, To, T4); + Tq = FNMS(KP1_918985947, Tp, T1); + Tt = FMA(KP830830026, Ts, Tg); + Tu = FNMS(KP918985947, Tt, Tf); + R1[WS(rs, 4)] = FNMS(KP1_979642883, Tu, Tq); + R0[WS(rs, 1)] = FMA(KP1_979642883, Tu, Tq); + } + } + } +} + +static const kr2c_desc desc = { 11, "r2cb_11", {4, 0, 56, 0}, &GENUS }; + +void X(codelet_r2cb_11) (planner *p) { + X(kr2c_register) (p, r2cb_11, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 11 -name r2cb_11 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 60 FP additions, 51 FP multiplications, + * (or, 19 additions, 10 multiplications, 41 fused multiply/add), + * 33 stack variables, 11 constants, and 22 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_11(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_918985947, +1.918985947228994779780736114132655398124909697); + DK(KP1_309721467, +1.309721467890570128113850144932587106367582399); + DK(KP284629676, +0.284629676546570280887585337232739337582102722); + DK(KP830830026, +0.830830026003772851058548298459246407048009821); + DK(KP1_682507065, +1.682507065662362337723623297838735435026584997); + DK(KP563465113, +0.563465113682859395422835830693233798071555798); + DK(KP1_511499148, +1.511499148708516567548071687944688840359434890); + DK(KP1_979642883, +1.979642883761865464752184075553437574753038744); + DK(KP1_819263990, +1.819263990709036742823430766158056920120482102); + DK(KP1_081281634, +1.081281634911195164215271908637383390863541216); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(44, rs), MAKE_VOLATILE_STRIDE(44, csr), MAKE_VOLATILE_STRIDE(44, csi)) { + E Td, Tl, Tf, Th, Tj, T1, T2, T6, T5, T4, T3, T7, Tk, Te, Tg; + E Ti; + { + E T8, Tc, T9, Ta, Tb; + T8 = Ci[WS(csi, 2)]; + Tc = Ci[WS(csi, 1)]; + T9 = Ci[WS(csi, 4)]; + Ta = Ci[WS(csi, 5)]; + Tb = Ci[WS(csi, 3)]; + Td = FMA(KP1_081281634, T8, KP1_819263990 * T9) + FNMA(KP1_979642883, Ta, KP1_511499148 * Tb) - (KP563465113 * Tc); + Tl = FMA(KP1_979642883, T8, KP1_819263990 * Ta) + FNMA(KP563465113, T9, KP1_081281634 * Tb) - (KP1_511499148 * Tc); + Tf = FMA(KP563465113, T8, KP1_819263990 * Tb) + FNMA(KP1_511499148, Ta, KP1_081281634 * T9) - (KP1_979642883 * Tc); + Th = FMA(KP1_081281634, Tc, KP1_819263990 * T8) + FMA(KP1_979642883, Tb, KP1_511499148 * T9) + (KP563465113 * Ta); + Tj = FMA(KP563465113, Tb, KP1_979642883 * T9) + FNMS(KP1_511499148, T8, KP1_081281634 * Ta) - (KP1_819263990 * Tc); + } + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T6 = Cr[WS(csr, 5)]; + T5 = Cr[WS(csr, 4)]; + T4 = Cr[WS(csr, 3)]; + T3 = Cr[WS(csr, 2)]; + T7 = FMA(KP1_682507065, T3, T1) + FNMS(KP284629676, T6, KP830830026 * T5) + FNMA(KP1_309721467, T4, KP1_918985947 * T2); + Tk = FMA(KP1_682507065, T4, T1) + FNMS(KP1_918985947, T5, KP830830026 * T6) + FNMA(KP284629676, T3, KP1_309721467 * T2); + Te = FMA(KP830830026, T4, T1) + FNMS(KP1_309721467, T6, KP1_682507065 * T5) + FNMA(KP1_918985947, T3, KP284629676 * T2); + Tg = FMA(KP1_682507065, T2, T1) + FNMS(KP1_918985947, T6, KP830830026 * T3) + FNMA(KP1_309721467, T5, KP284629676 * T4); + Ti = FMA(KP830830026, T2, T1) + FNMS(KP284629676, T5, KP1_682507065 * T6) + FNMA(KP1_918985947, T4, KP1_309721467 * T3); + R0[WS(rs, 3)] = T7 - Td; + R0[WS(rs, 4)] = Te - Tf; + R0[WS(rs, 2)] = Tk + Tl; + R1[WS(rs, 2)] = T7 + Td; + R1[WS(rs, 3)] = Tk - Tl; + R0[WS(rs, 1)] = Ti + Tj; + R1[WS(rs, 1)] = Te + Tf; + R0[WS(rs, 5)] = Tg + Th; + R1[0] = Tg - Th; + R1[WS(rs, 4)] = Ti - Tj; + R0[0] = FMA(KP2_000000000, T2 + T3 + T4 + T5 + T6, T1); + } + } +} + +static const kr2c_desc desc = { 11, "r2cb_11", {19, 10, 41, 0}, &GENUS }; + +void X(codelet_r2cb_11) (planner *p) { + X(kr2c_register) (p, r2cb_11, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_12.c new file mode 100644 index 000000000..e23a62ff3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_12.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -name r2cb_12 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 38 FP additions, 16 FP multiplications, + * (or, 22 additions, 0 multiplications, 16 fused multiply/add), + * 25 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E T8, Tb, Tk, Tz, Tu, Tv, Tn, Ty, T3, Tp, Tf, T6, Tq, Ti; + { + E T9, Ta, Tl, Tm; + T8 = Cr[WS(csr, 3)]; + T9 = Cr[WS(csr, 5)]; + Ta = Cr[WS(csr, 1)]; + Tb = T9 + Ta; + Tk = FNMS(KP2_000000000, T8, Tb); + Tz = T9 - Ta; + Tu = Ci[WS(csi, 3)]; + Tl = Ci[WS(csi, 5)]; + Tm = Ci[WS(csi, 1)]; + Tv = Tl + Tm; + Tn = Tl - Tm; + Ty = FMA(KP2_000000000, Tu, Tv); + } + { + E Te, T1, T2, Td; + Te = Ci[WS(csi, 4)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 4)]; + Td = T1 - T2; + T3 = FMA(KP2_000000000, T2, T1); + Tp = FNMS(KP1_732050807, Te, Td); + Tf = FMA(KP1_732050807, Te, Td); + } + { + E Th, T4, T5, Tg; + Th = Ci[WS(csi, 2)]; + T4 = Cr[WS(csr, 6)]; + T5 = Cr[WS(csr, 2)]; + Tg = T4 - T5; + T6 = FMA(KP2_000000000, T5, T4); + Tq = FMA(KP1_732050807, Th, Tg); + Ti = FNMS(KP1_732050807, Th, Tg); + } + { + E T7, Tc, Tx, TA; + T7 = T3 + T6; + Tc = T8 + Tb; + R0[WS(rs, 3)] = FNMS(KP2_000000000, Tc, T7); + R0[0] = FMA(KP2_000000000, Tc, T7); + { + E Tj, To, TB, TC; + Tj = Tf + Ti; + To = FMA(KP1_732050807, Tn, Tk); + R0[WS(rs, 1)] = Tj + To; + R0[WS(rs, 4)] = Tj - To; + TB = Tf - Ti; + TC = FNMS(KP1_732050807, Tz, Ty); + R1[WS(rs, 2)] = TB - TC; + R1[WS(rs, 5)] = TB + TC; + } + Tx = Tp - Tq; + TA = FMA(KP1_732050807, Tz, Ty); + R1[0] = Tx - TA; + R1[WS(rs, 3)] = Tx + TA; + { + E Tt, Tw, Tr, Ts; + Tt = T3 - T6; + Tw = Tu - Tv; + R1[WS(rs, 4)] = FNMS(KP2_000000000, Tw, Tt); + R1[WS(rs, 1)] = FMA(KP2_000000000, Tw, Tt); + Tr = Tp + Tq; + Ts = FNMS(KP1_732050807, Tn, Tk); + R0[WS(rs, 5)] = Tr + Ts; + R0[WS(rs, 2)] = Tr - Ts; + } + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cb_12", {22, 0, 16, 0}, &GENUS }; + +void X(codelet_r2cb_12) (planner *p) { + X(kr2c_register) (p, r2cb_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 12 -name r2cb_12 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 38 FP additions, 10 FP multiplications, + * (or, 34 additions, 6 multiplications, 4 fused multiply/add), + * 25 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E T8, Tb, Tm, TA, Tw, Tx, Tp, TB, T3, Tr, Tg, T6, Ts, Tk; + { + E T9, Ta, Tn, To; + T8 = Cr[WS(csr, 3)]; + T9 = Cr[WS(csr, 5)]; + Ta = Cr[WS(csr, 1)]; + Tb = T9 + Ta; + Tm = FMS(KP2_000000000, T8, Tb); + TA = KP1_732050807 * (T9 - Ta); + Tw = Ci[WS(csi, 3)]; + Tn = Ci[WS(csi, 5)]; + To = Ci[WS(csi, 1)]; + Tx = Tn + To; + Tp = KP1_732050807 * (Tn - To); + TB = FMA(KP2_000000000, Tw, Tx); + } + { + E Tf, T1, T2, Td, Te; + Te = Ci[WS(csi, 4)]; + Tf = KP1_732050807 * Te; + T1 = Cr[0]; + T2 = Cr[WS(csr, 4)]; + Td = T1 - T2; + T3 = FMA(KP2_000000000, T2, T1); + Tr = Td - Tf; + Tg = Td + Tf; + } + { + E Tj, T4, T5, Th, Ti; + Ti = Ci[WS(csi, 2)]; + Tj = KP1_732050807 * Ti; + T4 = Cr[WS(csr, 6)]; + T5 = Cr[WS(csr, 2)]; + Th = T4 - T5; + T6 = FMA(KP2_000000000, T5, T4); + Ts = Th + Tj; + Tk = Th - Tj; + } + { + E T7, Tc, Tz, TC; + T7 = T3 + T6; + Tc = KP2_000000000 * (T8 + Tb); + R0[WS(rs, 3)] = T7 - Tc; + R0[0] = T7 + Tc; + { + E Tl, Tq, TD, TE; + Tl = Tg + Tk; + Tq = Tm - Tp; + R0[WS(rs, 1)] = Tl - Tq; + R0[WS(rs, 4)] = Tl + Tq; + TD = Tg - Tk; + TE = TB - TA; + R1[WS(rs, 2)] = TD - TE; + R1[WS(rs, 5)] = TD + TE; + } + Tz = Tr - Ts; + TC = TA + TB; + R1[0] = Tz - TC; + R1[WS(rs, 3)] = Tz + TC; + { + E Tv, Ty, Tt, Tu; + Tv = T3 - T6; + Ty = KP2_000000000 * (Tw - Tx); + R1[WS(rs, 4)] = Tv - Ty; + R1[WS(rs, 1)] = Tv + Ty; + Tt = Tr + Ts; + Tu = Tm + Tp; + R0[WS(rs, 5)] = Tt - Tu; + R0[WS(rs, 2)] = Tt + Tu; + } + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cb_12", {34, 6, 4, 0}, &GENUS }; + +void X(codelet_r2cb_12) (planner *p) { + X(kr2c_register) (p, r2cb_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_128.c new file mode 100644 index 000000000..adabab3be --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_128.c @@ -0,0 +1,3248 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 128 -name r2cb_128 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 956 FP additions, 540 FP multiplications, + * (or, 416 additions, 0 multiplications, 540 fused multiply/add), + * 195 stack variables, 36 constants, and 256 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_128(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_715457220, +1.715457220000544139804539968569540274084981599); + DK(KP599376933, +0.599376933681923766271389869014404232837890546); + DK(KP1_606415062, +1.606415062961289819613353025926283847759138854); + DK(KP741650546, +0.741650546272035369581266691172079863842265220); + DK(KP1_940062506, +1.940062506389087985207968414572200502913731924); + DK(KP250486960, +0.250486960191305461595702160124721208578685568); + DK(KP1_978353019, +1.978353019929561946903347476032486127967379067); + DK(KP148335987, +0.148335987538347428753676511486911367000625355); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP1_807978586, +1.807978586246886663172400594461074097420264050); + DK(KP472964775, +0.472964775891319928124438237972992463904131113); + DK(KP1_481902250, +1.481902250709918182351233794990325459457910619); + DK(KP906347169, +0.906347169019147157946142717268914412664134293); + DK(KP1_883088130, +1.883088130366041556825018805199004714371179592); + DK(KP357805721, +0.357805721314524104672487743774474392487532769); + DK(KP1_997590912, +1.997590912410344785429543209518201388886407229); + DK(KP049126849, +0.049126849769467254105343321271313617079695752); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(512, rs), MAKE_VOLATILE_STRIDE(512, csr), MAKE_VOLATILE_STRIDE(512, csi)) { + E T9, Tdr, Ta9, Tcl, T2d, T6b, T7j, T91, Tg, Tds, T2o, T6c, T7m, T92, Tae; + E Tcm, Tw, Tdu, Tap, Tco, Tdx, TeM, T2G, T6f, T2P, T6e, T7t, T94, Tak, Tcp; + E T7q, T95, T1i, TdM, TbD, TcL, Te6, Tf0, T42, T6q, T5t, T6B, T8j, T9r, TaY; + E TcA, T7S, T9g, TM, TdA, TaN, Tcv, TdI, TeP, T38, T6i, T3F, T6l, T7J, T9b; + E Taw, Tcs, T7y, T98, T1N, TeW, T4H, T6x, TdV, Te8, T4Q, T6w, T86, T9j, TcI; + E TcO, T83, T9k, Tbl, TbI, T22, TeV, T58, T6u, Te0, Te9, T5h, T6t, T8d, T9m; + E TcF, TcP, T8a, T9n, Tbw, TbJ, T1x, Te3, TbG, TcB, TdP, Tf1, T4p, T6C, T5w; + E T6r, T8m, T9h, Tb9, TcM, T7Z, T9s, T11, TdF, TaQ, Tct, TdD, TeQ, T3v, T6m; + E T3I, T6j, T7M, T99, TaH, Tcw, T7F, T9c; + { + E T4, T26, T3, T25, T8, T28, T2b, Ta8, T1, T2, T5, Ta7; + T4 = Cr[WS(csr, 32)]; + T26 = Ci[WS(csi, 32)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 64)]; + T3 = T1 + T2; + T25 = T1 - T2; + { + E T6, T7, T29, T2a; + T6 = Cr[WS(csr, 16)]; + T7 = Cr[WS(csr, 48)]; + T8 = T6 + T7; + T28 = T6 - T7; + T29 = Ci[WS(csi, 16)]; + T2a = Ci[WS(csi, 48)]; + T2b = T29 + T2a; + Ta8 = T29 - T2a; + } + T5 = FMA(KP2_000000000, T4, T3); + T9 = FMA(KP2_000000000, T8, T5); + Tdr = FNMS(KP2_000000000, T8, T5); + Ta7 = FNMS(KP2_000000000, T4, T3); + Ta9 = FNMS(KP2_000000000, Ta8, Ta7); + Tcl = FMA(KP2_000000000, Ta8, Ta7); + { + E T27, T2c, T7h, T7i; + T27 = FNMS(KP2_000000000, T26, T25); + T2c = T28 - T2b; + T2d = FMA(KP1_414213562, T2c, T27); + T6b = FNMS(KP1_414213562, T2c, T27); + T7h = FMA(KP2_000000000, T26, T25); + T7i = T28 + T2b; + T7j = FNMS(KP1_414213562, T7i, T7h); + T91 = FMA(KP1_414213562, T7i, T7h); + } + } + { + E Tc, T2e, T2m, Tab, Tf, T2j, T2h, Tac, T2i, T2n; + { + E Ta, Tb, T2k, T2l; + Ta = Cr[WS(csr, 8)]; + Tb = Cr[WS(csr, 56)]; + Tc = Ta + Tb; + T2e = Ta - Tb; + T2k = Ci[WS(csi, 8)]; + T2l = Ci[WS(csi, 56)]; + T2m = T2k + T2l; + Tab = T2k - T2l; + } + { + E Td, Te, T2f, T2g; + Td = Cr[WS(csr, 40)]; + Te = Cr[WS(csr, 24)]; + Tf = Td + Te; + T2j = Td - Te; + T2f = Ci[WS(csi, 40)]; + T2g = Ci[WS(csi, 24)]; + T2h = T2f + T2g; + Tac = T2f - T2g; + } + Tg = Tc + Tf; + Tds = Tac + Tab; + T2i = T2e - T2h; + T2n = T2j + T2m; + T2o = FNMS(KP414213562, T2n, T2i); + T6c = FMA(KP414213562, T2i, T2n); + { + E T7k, T7l, Taa, Tad; + T7k = T2m - T2j; + T7l = T2e + T2h; + T7m = FNMS(KP414213562, T7l, T7k); + T92 = FMA(KP414213562, T7k, T7l); + Taa = Tc - Tf; + Tad = Tab - Tac; + Tae = Taa - Tad; + Tcm = Taa + Tad; + } + } + { + E Tk, T2q, T2K, Tam, Tn, T2H, T2t, Tan, Tu, Tah, T2E, T2N, Tr, Tai, T2z; + E T2M; + { + E Ti, Tj, T2r, T2s; + Ti = Cr[WS(csr, 4)]; + Tj = Cr[WS(csr, 60)]; + Tk = Ti + Tj; + T2q = Ti - Tj; + { + E T2I, T2J, Tl, Tm; + T2I = Ci[WS(csi, 4)]; + T2J = Ci[WS(csi, 60)]; + T2K = T2I + T2J; + Tam = T2I - T2J; + Tl = Cr[WS(csr, 36)]; + Tm = Cr[WS(csr, 28)]; + Tn = Tl + Tm; + T2H = Tl - Tm; + } + T2r = Ci[WS(csi, 36)]; + T2s = Ci[WS(csi, 28)]; + T2t = T2r + T2s; + Tan = T2r - T2s; + { + E Ts, Tt, T2A, T2B, T2C, T2D; + Ts = Cr[WS(csr, 12)]; + Tt = Cr[WS(csr, 52)]; + T2A = Ts - Tt; + T2B = Ci[WS(csi, 12)]; + T2C = Ci[WS(csi, 52)]; + T2D = T2B + T2C; + Tu = Ts + Tt; + Tah = T2C - T2B; + T2E = T2A - T2D; + T2N = T2A + T2D; + } + { + E Tp, Tq, T2v, T2w, T2x, T2y; + Tp = Cr[WS(csr, 20)]; + Tq = Cr[WS(csr, 44)]; + T2v = Tp - Tq; + T2w = Ci[WS(csi, 20)]; + T2x = Ci[WS(csi, 44)]; + T2y = T2w + T2x; + Tr = Tp + Tq; + Tai = T2w - T2x; + T2z = T2v - T2y; + T2M = T2v + T2y; + } + } + { + E To, Tv, Tal, Tao; + To = Tk + Tn; + Tv = Tr + Tu; + Tw = To + Tv; + Tdu = To - Tv; + Tal = Tr - Tu; + Tao = Tam - Tan; + Tap = Tal + Tao; + Tco = Tao - Tal; + } + { + E Tdv, Tdw, T2u, T2F; + Tdv = Tan + Tam; + Tdw = Tai + Tah; + Tdx = Tdv - Tdw; + TeM = Tdw + Tdv; + T2u = T2q - T2t; + T2F = T2z + T2E; + T2G = FMA(KP707106781, T2F, T2u); + T6f = FNMS(KP707106781, T2F, T2u); + } + { + E T2L, T2O, T7r, T7s; + T2L = T2H + T2K; + T2O = T2M - T2N; + T2P = FMA(KP707106781, T2O, T2L); + T6e = FNMS(KP707106781, T2O, T2L); + T7r = T2K - T2H; + T7s = T2E - T2z; + T7t = FNMS(KP707106781, T7s, T7r); + T94 = FMA(KP707106781, T7s, T7r); + } + { + E Tag, Taj, T7o, T7p; + Tag = Tk - Tn; + Taj = Tah - Tai; + Tak = Tag + Taj; + Tcp = Tag - Taj; + T7o = T2q + T2t; + T7p = T2M + T2N; + T7q = FNMS(KP707106781, T7p, T7o); + T95 = FMA(KP707106781, T7p, T7o); + } + } + { + E T16, T3M, T5o, TbA, T19, T5l, T3P, TbB, T1g, TaV, T40, T5r, T1d, TaW, T3V; + E T5q; + { + E T14, T15, T3N, T3O; + T14 = Cr[WS(csr, 1)]; + T15 = Cr[WS(csr, 63)]; + T16 = T14 + T15; + T3M = T14 - T15; + { + E T5m, T5n, T17, T18; + T5m = Ci[WS(csi, 1)]; + T5n = Ci[WS(csi, 63)]; + T5o = T5m + T5n; + TbA = T5m - T5n; + T17 = Cr[WS(csr, 33)]; + T18 = Cr[WS(csr, 31)]; + T19 = T17 + T18; + T5l = T17 - T18; + } + T3N = Ci[WS(csi, 33)]; + T3O = Ci[WS(csi, 31)]; + T3P = T3N + T3O; + TbB = T3N - T3O; + { + E T1e, T1f, T3W, T3X, T3Y, T3Z; + T1e = Cr[WS(csr, 15)]; + T1f = Cr[WS(csr, 49)]; + T3W = T1e - T1f; + T3X = Ci[WS(csi, 15)]; + T3Y = Ci[WS(csi, 49)]; + T3Z = T3X + T3Y; + T1g = T1e + T1f; + TaV = T3Y - T3X; + T40 = T3W - T3Z; + T5r = T3W + T3Z; + } + { + E T1b, T1c, T3R, T3S, T3T, T3U; + T1b = Cr[WS(csr, 17)]; + T1c = Cr[WS(csr, 47)]; + T3R = T1b - T1c; + T3S = Ci[WS(csi, 17)]; + T3T = Ci[WS(csi, 47)]; + T3U = T3S + T3T; + T1d = T1b + T1c; + TaW = T3S - T3T; + T3V = T3R - T3U; + T5q = T3R + T3U; + } + } + { + E T1a, T1h, Tbz, TbC; + T1a = T16 + T19; + T1h = T1d + T1g; + T1i = T1a + T1h; + TdM = T1a - T1h; + Tbz = T1d - T1g; + TbC = TbA - TbB; + TbD = Tbz + TbC; + TcL = TbC - Tbz; + } + { + E Te4, Te5, T3Q, T41; + Te4 = TbB + TbA; + Te5 = TaW + TaV; + Te6 = Te4 - Te5; + Tf0 = Te5 + Te4; + T3Q = T3M - T3P; + T41 = T3V + T40; + T42 = FMA(KP707106781, T41, T3Q); + T6q = FNMS(KP707106781, T41, T3Q); + } + { + E T5p, T5s, T8h, T8i; + T5p = T5l + T5o; + T5s = T5q - T5r; + T5t = FMA(KP707106781, T5s, T5p); + T6B = FNMS(KP707106781, T5s, T5p); + T8h = T5o - T5l; + T8i = T40 - T3V; + T8j = FNMS(KP707106781, T8i, T8h); + T9r = FMA(KP707106781, T8i, T8h); + } + { + E TaU, TaX, T7Q, T7R; + TaU = T16 - T19; + TaX = TaV - TaW; + TaY = TaU + TaX; + TcA = TaU - TaX; + T7Q = T3M + T3P; + T7R = T5q + T5r; + T7S = FNMS(KP707106781, T7R, T7Q); + T9g = FMA(KP707106781, T7R, T7Q); + } + } + { + E TA, T2S, T3A, TaK, TD, T3x, T2V, TaL, TK, Tat, T36, T3D, TH, Tau, T31; + E T3C; + { + E Ty, Tz, T2T, T2U; + Ty = Cr[WS(csr, 2)]; + Tz = Cr[WS(csr, 62)]; + TA = Ty + Tz; + T2S = Ty - Tz; + { + E T3y, T3z, TB, TC; + T3y = Ci[WS(csi, 2)]; + T3z = Ci[WS(csi, 62)]; + T3A = T3y + T3z; + TaK = T3y - T3z; + TB = Cr[WS(csr, 34)]; + TC = Cr[WS(csr, 30)]; + TD = TB + TC; + T3x = TB - TC; + } + T2T = Ci[WS(csi, 34)]; + T2U = Ci[WS(csi, 30)]; + T2V = T2T + T2U; + TaL = T2T - T2U; + { + E TI, TJ, T32, T33, T34, T35; + TI = Cr[WS(csr, 14)]; + TJ = Cr[WS(csr, 50)]; + T32 = TI - TJ; + T33 = Ci[WS(csi, 14)]; + T34 = Ci[WS(csi, 50)]; + T35 = T33 + T34; + TK = TI + TJ; + Tat = T34 - T33; + T36 = T32 - T35; + T3D = T32 + T35; + } + { + E TF, TG, T2X, T2Y, T2Z, T30; + TF = Cr[WS(csr, 18)]; + TG = Cr[WS(csr, 46)]; + T2X = TF - TG; + T2Y = Ci[WS(csi, 18)]; + T2Z = Ci[WS(csi, 46)]; + T30 = T2Y + T2Z; + TH = TF + TG; + Tau = T2Y - T2Z; + T31 = T2X - T30; + T3C = T2X + T30; + } + } + { + E TE, TL, TaJ, TaM; + TE = TA + TD; + TL = TH + TK; + TM = TE + TL; + TdA = TE - TL; + TaJ = TH - TK; + TaM = TaK - TaL; + TaN = TaJ + TaM; + Tcv = TaM - TaJ; + } + { + E TdG, TdH, T2W, T37; + TdG = TaL + TaK; + TdH = Tau + Tat; + TdI = TdG - TdH; + TeP = TdH + TdG; + T2W = T2S - T2V; + T37 = T31 + T36; + T38 = FMA(KP707106781, T37, T2W); + T6i = FNMS(KP707106781, T37, T2W); + } + { + E T3B, T3E, T7H, T7I; + T3B = T3x + T3A; + T3E = T3C - T3D; + T3F = FMA(KP707106781, T3E, T3B); + T6l = FNMS(KP707106781, T3E, T3B); + T7H = T3A - T3x; + T7I = T36 - T31; + T7J = FNMS(KP707106781, T7I, T7H); + T9b = FMA(KP707106781, T7I, T7H); + } + { + E Tas, Tav, T7w, T7x; + Tas = TA - TD; + Tav = Tat - Tau; + Taw = Tas + Tav; + Tcs = Tas - Tav; + T7w = T2S + T2V; + T7x = T3C + T3D; + T7y = FNMS(KP707106781, T7x, T7w); + T98 = FMA(KP707106781, T7x, T7w); + } + } + { + E T1F, Tbb, T4r, T4I, T4u, TdS, T4L, Tbj, T1M, Tbg, TdT, T4A, T4F, T4O, Tbe; + E T4N, TcG, TcH; + { + E T1z, T1A, T1B, T1C, T1D, T1E; + T1z = Cr[WS(csr, 5)]; + T1A = Cr[WS(csr, 59)]; + T1B = T1z + T1A; + T1C = Cr[WS(csr, 37)]; + T1D = Cr[WS(csr, 27)]; + T1E = T1C + T1D; + T1F = T1B + T1E; + Tbb = T1B - T1E; + T4r = T1z - T1A; + T4I = T1C - T1D; + } + { + E T4s, T4t, Tbi, T4J, T4K, Tbh; + T4s = Ci[WS(csi, 37)]; + T4t = Ci[WS(csi, 27)]; + Tbi = T4s - T4t; + T4J = Ci[WS(csi, 5)]; + T4K = Ci[WS(csi, 59)]; + Tbh = T4J - T4K; + T4u = T4s + T4t; + TdS = Tbi + Tbh; + T4L = T4J + T4K; + Tbj = Tbh - Tbi; + } + { + E T1I, T4w, T4z, Tbd, T1L, T4B, T4E, Tbc; + { + E T1G, T1H, T4x, T4y; + T1G = Cr[WS(csr, 21)]; + T1H = Cr[WS(csr, 43)]; + T1I = T1G + T1H; + T4w = T1G - T1H; + T4x = Ci[WS(csi, 21)]; + T4y = Ci[WS(csi, 43)]; + T4z = T4x + T4y; + Tbd = T4x - T4y; + } + { + E T1J, T1K, T4C, T4D; + T1J = Cr[WS(csr, 11)]; + T1K = Cr[WS(csr, 53)]; + T1L = T1J + T1K; + T4B = T1J - T1K; + T4C = Ci[WS(csi, 11)]; + T4D = Ci[WS(csi, 53)]; + T4E = T4C + T4D; + Tbc = T4D - T4C; + } + T1M = T1I + T1L; + Tbg = T1I - T1L; + TdT = Tbd + Tbc; + T4A = T4w - T4z; + T4F = T4B - T4E; + T4O = T4B + T4E; + Tbe = Tbc - Tbd; + T4N = T4w + T4z; + } + T1N = T1F + T1M; + TeW = TdT + TdS; + { + E T4v, T4G, TdR, TdU; + T4v = T4r - T4u; + T4G = T4A + T4F; + T4H = FMA(KP707106781, T4G, T4v); + T6x = FNMS(KP707106781, T4G, T4v); + TdR = T1F - T1M; + TdU = TdS - TdT; + TdV = TdR - TdU; + Te8 = TdR + TdU; + } + { + E T4M, T4P, T84, T85; + T4M = T4I + T4L; + T4P = T4N - T4O; + T4Q = FMA(KP707106781, T4P, T4M); + T6w = FNMS(KP707106781, T4P, T4M); + T84 = T4L - T4I; + T85 = T4F - T4A; + T86 = FNMS(KP707106781, T85, T84); + T9j = FMA(KP707106781, T85, T84); + } + TcG = Tbj - Tbg; + TcH = Tbb - Tbe; + TcI = FNMS(KP414213562, TcH, TcG); + TcO = FMA(KP414213562, TcG, TcH); + { + E T81, T82, Tbf, Tbk; + T81 = T4r + T4u; + T82 = T4N + T4O; + T83 = FNMS(KP707106781, T82, T81); + T9k = FMA(KP707106781, T82, T81); + Tbf = Tbb + Tbe; + Tbk = Tbg + Tbj; + Tbl = FNMS(KP414213562, Tbk, Tbf); + TbI = FMA(KP414213562, Tbf, Tbk); + } + } + { + E T1U, Tbm, T4S, T59, T4V, TdX, T5c, Tbu, T21, Tbr, TdY, T51, T56, T5f, Tbp; + E T5e, TcD, TcE; + { + E T1O, T1P, T1Q, T1R, T1S, T1T; + T1O = Cr[WS(csr, 3)]; + T1P = Cr[WS(csr, 61)]; + T1Q = T1O + T1P; + T1R = Cr[WS(csr, 29)]; + T1S = Cr[WS(csr, 35)]; + T1T = T1R + T1S; + T1U = T1Q + T1T; + Tbm = T1Q - T1T; + T4S = T1O - T1P; + T59 = T1R - T1S; + } + { + E T4T, T4U, Tbt, T5a, T5b, Tbs; + T4T = Ci[WS(csi, 29)]; + T4U = Ci[WS(csi, 35)]; + Tbt = T4T - T4U; + T5a = Ci[WS(csi, 3)]; + T5b = Ci[WS(csi, 61)]; + Tbs = T5b - T5a; + T4V = T4T + T4U; + TdX = Tbt + Tbs; + T5c = T5a + T5b; + Tbu = Tbs - Tbt; + } + { + E T1X, T4X, T50, Tbo, T20, T52, T55, Tbn; + { + E T1V, T1W, T4Y, T4Z; + T1V = Cr[WS(csr, 13)]; + T1W = Cr[WS(csr, 51)]; + T1X = T1V + T1W; + T4X = T1V - T1W; + T4Y = Ci[WS(csi, 13)]; + T4Z = Ci[WS(csi, 51)]; + T50 = T4Y + T4Z; + Tbo = T4Y - T4Z; + } + { + E T1Y, T1Z, T53, T54; + T1Y = Cr[WS(csr, 19)]; + T1Z = Cr[WS(csr, 45)]; + T20 = T1Y + T1Z; + T52 = T1Y - T1Z; + T53 = Ci[WS(csi, 19)]; + T54 = Ci[WS(csi, 45)]; + T55 = T53 + T54; + Tbn = T54 - T53; + } + T21 = T1X + T20; + Tbr = T1X - T20; + TdY = Tbo + Tbn; + T51 = T4X - T50; + T56 = T52 - T55; + T5f = T52 + T55; + Tbp = Tbn - Tbo; + T5e = T4X + T50; + } + T22 = T1U + T21; + TeV = TdY + TdX; + { + E T4W, T57, TdW, TdZ; + T4W = T4S - T4V; + T57 = T51 + T56; + T58 = FMA(KP707106781, T57, T4W); + T6u = FNMS(KP707106781, T57, T4W); + TdW = T1U - T21; + TdZ = TdX - TdY; + Te0 = TdW + TdZ; + Te9 = TdZ - TdW; + } + { + E T5d, T5g, T8b, T8c; + T5d = T59 - T5c; + T5g = T5e - T5f; + T5h = FMA(KP707106781, T5g, T5d); + T6t = FNMS(KP707106781, T5g, T5d); + T8b = T59 + T5c; + T8c = T56 - T51; + T8d = FMA(KP707106781, T8c, T8b); + T9m = FNMS(KP707106781, T8c, T8b); + } + TcD = Tbu - Tbr; + TcE = Tbm - Tbp; + TcF = FMA(KP414213562, TcE, TcD); + TcP = FNMS(KP414213562, TcD, TcE); + { + E T88, T89, Tbq, Tbv; + T88 = T4S + T4V; + T89 = T5e + T5f; + T8a = FNMS(KP707106781, T89, T88); + T9n = FMA(KP707106781, T89, T88); + Tbq = Tbm + Tbp; + Tbv = Tbr + Tbu; + Tbw = FMA(KP414213562, Tbv, Tbq); + TbJ = FNMS(KP414213562, Tbq, Tbv); + } + } + { + E T1l, Tb0, T1o, Tb1, T47, T4c, Tb2, TaZ, T7U, T7T, T1s, Tb5, T1v, Tb6, T4i; + E T4n, Tb7, Tb4, T7X, T7W; + { + E T43, T4b, T48, T46; + { + E T1j, T1k, T49, T4a; + T1j = Cr[WS(csr, 9)]; + T1k = Cr[WS(csr, 55)]; + T1l = T1j + T1k; + T43 = T1j - T1k; + T49 = Ci[WS(csi, 9)]; + T4a = Ci[WS(csi, 55)]; + T4b = T49 + T4a; + Tb0 = T49 - T4a; + } + { + E T1m, T1n, T44, T45; + T1m = Cr[WS(csr, 41)]; + T1n = Cr[WS(csr, 23)]; + T1o = T1m + T1n; + T48 = T1m - T1n; + T44 = Ci[WS(csi, 41)]; + T45 = Ci[WS(csi, 23)]; + T46 = T44 + T45; + Tb1 = T44 - T45; + } + T47 = T43 - T46; + T4c = T48 + T4b; + Tb2 = Tb0 - Tb1; + TaZ = T1l - T1o; + T7U = T43 + T46; + T7T = T4b - T48; + } + { + E T4e, T4m, T4j, T4h; + { + E T1q, T1r, T4k, T4l; + T1q = Cr[WS(csr, 7)]; + T1r = Cr[WS(csr, 57)]; + T1s = T1q + T1r; + T4e = T1q - T1r; + T4k = Ci[WS(csi, 7)]; + T4l = Ci[WS(csi, 57)]; + T4m = T4k + T4l; + Tb5 = T4l - T4k; + } + { + E T1t, T1u, T4f, T4g; + T1t = Cr[WS(csr, 25)]; + T1u = Cr[WS(csr, 39)]; + T1v = T1t + T1u; + T4j = T1t - T1u; + T4f = Ci[WS(csi, 25)]; + T4g = Ci[WS(csi, 39)]; + T4h = T4f + T4g; + Tb6 = T4f - T4g; + } + T4i = T4e - T4h; + T4n = T4j - T4m; + Tb7 = Tb5 - Tb6; + Tb4 = T1s - T1v; + T7X = T4e + T4h; + T7W = T4j + T4m; + } + { + E T1p, T1w, TbE, TbF; + T1p = T1l + T1o; + T1w = T1s + T1v; + T1x = T1p + T1w; + Te3 = T1p - T1w; + TbE = TaZ + Tb2; + TbF = Tb7 - Tb4; + TbG = TbE + TbF; + TcB = TbE - TbF; + } + { + E TdN, TdO, T4d, T4o; + TdN = Tb6 + Tb5; + TdO = Tb1 + Tb0; + TdP = TdN - TdO; + Tf1 = TdO + TdN; + T4d = FNMS(KP414213562, T4c, T47); + T4o = FMA(KP414213562, T4n, T4i); + T4p = T4d + T4o; + T6C = T4o - T4d; + } + { + E T5u, T5v, T8k, T8l; + T5u = FMA(KP414213562, T47, T4c); + T5v = FNMS(KP414213562, T4i, T4n); + T5w = T5u + T5v; + T6r = T5u - T5v; + T8k = FMA(KP414213562, T7T, T7U); + T8l = FMA(KP414213562, T7W, T7X); + T8m = T8k - T8l; + T9h = T8k + T8l; + } + { + E Tb3, Tb8, T7V, T7Y; + Tb3 = TaZ - Tb2; + Tb8 = Tb4 + Tb7; + Tb9 = Tb3 + Tb8; + TcM = Tb8 - Tb3; + T7V = FNMS(KP414213562, T7U, T7T); + T7Y = FNMS(KP414213562, T7X, T7W); + T7Z = T7V + T7Y; + T9s = T7V - T7Y; + } + } + { + E TP, Tay, TS, Taz, T3d, T3i, TaA, Tax, T7A, T7z, TW, TaD, TZ, TaE, T3o; + E T3t, TaF, TaC, T7D, T7C; + { + E T39, T3h, T3e, T3c; + { + E TN, TO, T3f, T3g; + TN = Cr[WS(csr, 10)]; + TO = Cr[WS(csr, 54)]; + TP = TN + TO; + T39 = TN - TO; + T3f = Ci[WS(csi, 10)]; + T3g = Ci[WS(csi, 54)]; + T3h = T3f + T3g; + Tay = T3f - T3g; + } + { + E TQ, TR, T3a, T3b; + TQ = Cr[WS(csr, 42)]; + TR = Cr[WS(csr, 22)]; + TS = TQ + TR; + T3e = TQ - TR; + T3a = Ci[WS(csi, 42)]; + T3b = Ci[WS(csi, 22)]; + T3c = T3a + T3b; + Taz = T3a - T3b; + } + T3d = T39 - T3c; + T3i = T3e + T3h; + TaA = Tay - Taz; + Tax = TP - TS; + T7A = T39 + T3c; + T7z = T3h - T3e; + } + { + E T3k, T3s, T3p, T3n; + { + E TU, TV, T3q, T3r; + TU = Cr[WS(csr, 6)]; + TV = Cr[WS(csr, 58)]; + TW = TU + TV; + T3k = TU - TV; + T3q = Ci[WS(csi, 6)]; + T3r = Ci[WS(csi, 58)]; + T3s = T3q + T3r; + TaD = T3r - T3q; + } + { + E TX, TY, T3l, T3m; + TX = Cr[WS(csr, 26)]; + TY = Cr[WS(csr, 38)]; + TZ = TX + TY; + T3p = TX - TY; + T3l = Ci[WS(csi, 26)]; + T3m = Ci[WS(csi, 38)]; + T3n = T3l + T3m; + TaE = T3l - T3m; + } + T3o = T3k - T3n; + T3t = T3p - T3s; + TaF = TaD - TaE; + TaC = TW - TZ; + T7D = T3k + T3n; + T7C = T3p + T3s; + } + { + E TT, T10, TaO, TaP; + TT = TP + TS; + T10 = TW + TZ; + T11 = TT + T10; + TdF = TT - T10; + TaO = Tax + TaA; + TaP = TaF - TaC; + TaQ = TaO + TaP; + Tct = TaO - TaP; + } + { + E TdB, TdC, T3j, T3u; + TdB = TaE + TaD; + TdC = Taz + Tay; + TdD = TdB - TdC; + TeQ = TdC + TdB; + T3j = FNMS(KP414213562, T3i, T3d); + T3u = FMA(KP414213562, T3t, T3o); + T3v = T3j + T3u; + T6m = T3u - T3j; + } + { + E T3G, T3H, T7K, T7L; + T3G = FMA(KP414213562, T3d, T3i); + T3H = FNMS(KP414213562, T3o, T3t); + T3I = T3G + T3H; + T6j = T3G - T3H; + T7K = FMA(KP414213562, T7z, T7A); + T7L = FMA(KP414213562, T7C, T7D); + T7M = T7K - T7L; + T99 = T7K + T7L; + } + { + E TaB, TaG, T7B, T7E; + TaB = Tax - TaA; + TaG = TaC + TaF; + TaH = TaB + TaG; + Tcw = TaG - TaB; + T7B = FNMS(KP414213562, T7A, T7z); + T7E = FNMS(KP414213562, T7D, T7C); + T7F = T7B + T7E; + T9c = T7B - T7E; + } + } + { + E T12, Tfg, Tx, Tff, T24, Tfi, Tfl, Tfq, Th, T13, Tfp; + T12 = TM + T11; + Tfg = TeQ + TeP; + Th = FMA(KP2_000000000, Tg, T9); + Tx = FMA(KP2_000000000, Tw, Th); + Tff = FNMS(KP2_000000000, Tw, Th); + { + E T1y, T23, Tfj, Tfk; + T1y = T1i + T1x; + T23 = T1N + T22; + T24 = T1y + T23; + Tfi = T1y - T23; + Tfj = Tf1 + Tf0; + Tfk = TeW + TeV; + Tfl = Tfj - Tfk; + Tfq = Tfk + Tfj; + } + T13 = FMA(KP2_000000000, T12, Tx); + R0[WS(rs, 32)] = FNMS(KP2_000000000, T24, T13); + R0[0] = FMA(KP2_000000000, T24, T13); + Tfp = FNMS(KP2_000000000, T12, Tx); + R0[WS(rs, 16)] = FNMS(KP2_000000000, Tfq, Tfp); + R0[WS(rs, 48)] = FMA(KP2_000000000, Tfq, Tfp); + { + E Tfh, Tfm, Tfn, Tfo; + Tfh = FNMS(KP2_000000000, Tfg, Tff); + Tfm = Tfi - Tfl; + R0[WS(rs, 40)] = FNMS(KP1_414213562, Tfm, Tfh); + R0[WS(rs, 8)] = FMA(KP1_414213562, Tfm, Tfh); + Tfn = FMA(KP2_000000000, Tfg, Tff); + Tfo = Tfi + Tfl; + R0[WS(rs, 24)] = FNMS(KP1_414213562, Tfo, Tfn); + R0[WS(rs, 56)] = FMA(KP1_414213562, Tfo, Tfn); + } + } + { + E TeN, Tf7, Tf3, Tfa, TeS, Tf8, TeY, Tfb, TeL, TeZ, Tf2; + TeL = FNMS(KP2_000000000, Tg, T9); + TeN = FNMS(KP2_000000000, TeM, TeL); + Tf7 = FMA(KP2_000000000, TeM, TeL); + TeZ = T1N - T22; + Tf2 = Tf0 - Tf1; + Tf3 = TeZ + Tf2; + Tfa = Tf2 - TeZ; + { + E TeO, TeR, TeU, TeX; + TeO = TM - T11; + TeR = TeP - TeQ; + TeS = TeO - TeR; + Tf8 = TeO + TeR; + TeU = T1i - T1x; + TeX = TeV - TeW; + TeY = TeU + TeX; + Tfb = TeU - TeX; + } + { + E TeT, Tf4, Tfd, Tfe; + TeT = FMA(KP1_414213562, TeS, TeN); + Tf4 = FNMS(KP414213562, Tf3, TeY); + R0[WS(rs, 36)] = FNMS(KP1_847759065, Tf4, TeT); + R0[WS(rs, 4)] = FMA(KP1_847759065, Tf4, TeT); + Tfd = FMA(KP1_414213562, Tf8, Tf7); + Tfe = FMA(KP414213562, Tfa, Tfb); + R0[WS(rs, 28)] = FNMS(KP1_847759065, Tfe, Tfd); + R0[WS(rs, 60)] = FMA(KP1_847759065, Tfe, Tfd); + } + { + E Tf5, Tf6, Tf9, Tfc; + Tf5 = FNMS(KP1_414213562, TeS, TeN); + Tf6 = FMA(KP414213562, TeY, Tf3); + R0[WS(rs, 20)] = FNMS(KP1_847759065, Tf6, Tf5); + R0[WS(rs, 52)] = FMA(KP1_847759065, Tf6, Tf5); + Tf9 = FNMS(KP1_414213562, Tf8, Tf7); + Tfc = FNMS(KP414213562, Tfb, Tfa); + R0[WS(rs, 12)] = FNMS(KP1_847759065, Tfc, Tf9); + R0[WS(rs, 44)] = FMA(KP1_847759065, Tfc, Tf9); + } + } + { + E Tar, TbP, TbL, TbS, TaS, TbQ, Tby, TbT; + { + E Taf, Taq, TbH, TbK; + Taf = FMA(KP1_414213562, Tae, Ta9); + Taq = FNMS(KP414213562, Tap, Tak); + Tar = FMA(KP1_847759065, Taq, Taf); + TbP = FNMS(KP1_847759065, Taq, Taf); + TbH = FMA(KP707106781, TbG, TbD); + TbK = TbI + TbJ; + TbL = FMA(KP923879532, TbK, TbH); + TbS = FNMS(KP923879532, TbK, TbH); + } + { + E TaI, TaR, Tba, Tbx; + TaI = FMA(KP707106781, TaH, Taw); + TaR = FMA(KP707106781, TaQ, TaN); + TaS = FNMS(KP198912367, TaR, TaI); + TbQ = FMA(KP198912367, TaI, TaR); + Tba = FMA(KP707106781, Tb9, TaY); + Tbx = Tbl + Tbw; + Tby = FMA(KP923879532, Tbx, Tba); + TbT = FNMS(KP923879532, Tbx, Tba); + } + { + E TaT, TbM, TbV, TbW; + TaT = FMA(KP1_961570560, TaS, Tar); + TbM = FNMS(KP098491403, TbL, Tby); + R0[WS(rs, 33)] = FNMS(KP1_990369453, TbM, TaT); + R0[WS(rs, 1)] = FMA(KP1_990369453, TbM, TaT); + TbV = FMA(KP1_961570560, TbQ, TbP); + TbW = FMA(KP820678790, TbS, TbT); + R0[WS(rs, 25)] = FNMS(KP1_546020906, TbW, TbV); + R0[WS(rs, 57)] = FMA(KP1_546020906, TbW, TbV); + } + { + E TbN, TbO, TbR, TbU; + TbN = FNMS(KP1_961570560, TaS, Tar); + TbO = FMA(KP098491403, Tby, TbL); + R0[WS(rs, 17)] = FNMS(KP1_990369453, TbO, TbN); + R0[WS(rs, 49)] = FMA(KP1_990369453, TbO, TbN); + TbR = FNMS(KP1_961570560, TbQ, TbP); + TbU = FNMS(KP820678790, TbT, TbS); + R0[WS(rs, 9)] = FNMS(KP1_546020906, TbU, TbR); + R0[WS(rs, 41)] = FMA(KP1_546020906, TbU, TbR); + } + } + { + E Tdz, Tef, Teb, Tei, TdK, Teg, Te2, Tej; + { + E Tdt, Tdy, Te7, Tea; + Tdt = FNMS(KP2_000000000, Tds, Tdr); + Tdy = Tdu - Tdx; + Tdz = FMA(KP1_414213562, Tdy, Tdt); + Tef = FNMS(KP1_414213562, Tdy, Tdt); + Te7 = Te3 + Te6; + Tea = Te8 + Te9; + Teb = FMA(KP707106781, Tea, Te7); + Tei = FNMS(KP707106781, Tea, Te7); + } + { + E TdE, TdJ, TdQ, Te1; + TdE = TdA + TdD; + TdJ = TdF + TdI; + TdK = FNMS(KP414213562, TdJ, TdE); + Teg = FMA(KP414213562, TdE, TdJ); + TdQ = TdM + TdP; + Te1 = TdV + Te0; + Te2 = FMA(KP707106781, Te1, TdQ); + Tej = FNMS(KP707106781, Te1, TdQ); + } + { + E TdL, Tec, Tel, Tem; + TdL = FMA(KP1_847759065, TdK, Tdz); + Tec = FNMS(KP198912367, Teb, Te2); + R0[WS(rs, 34)] = FNMS(KP1_961570560, Tec, TdL); + R0[WS(rs, 2)] = FMA(KP1_961570560, Tec, TdL); + Tel = FMA(KP1_847759065, Teg, Tef); + Tem = FMA(KP668178637, Tei, Tej); + R0[WS(rs, 26)] = FNMS(KP1_662939224, Tem, Tel); + R0[WS(rs, 58)] = FMA(KP1_662939224, Tem, Tel); + } + { + E Ted, Tee, Teh, Tek; + Ted = FNMS(KP1_847759065, TdK, Tdz); + Tee = FMA(KP198912367, Te2, Teb); + R0[WS(rs, 18)] = FNMS(KP1_961570560, Tee, Ted); + R0[WS(rs, 50)] = FMA(KP1_961570560, Tee, Ted); + Teh = FNMS(KP1_847759065, Teg, Tef); + Tek = FNMS(KP668178637, Tej, Tei); + R0[WS(rs, 10)] = FNMS(KP1_662939224, Tek, Teh); + R0[WS(rs, 42)] = FMA(KP1_662939224, Tek, Teh); + } + } + { + E TbZ, Tcd, Tc9, Tcg, Tc2, Tce, Tc6, Tch; + { + E TbX, TbY, Tc7, Tc8; + TbX = FNMS(KP1_414213562, Tae, Ta9); + TbY = FMA(KP414213562, Tak, Tap); + TbZ = FNMS(KP1_847759065, TbY, TbX); + Tcd = FMA(KP1_847759065, TbY, TbX); + Tc7 = FNMS(KP707106781, TbG, TbD); + Tc8 = Tbw - Tbl; + Tc9 = FNMS(KP923879532, Tc8, Tc7); + Tcg = FMA(KP923879532, Tc8, Tc7); + } + { + E Tc0, Tc1, Tc4, Tc5; + Tc0 = FNMS(KP707106781, TaQ, TaN); + Tc1 = FNMS(KP707106781, TaH, Taw); + Tc2 = FNMS(KP668178637, Tc1, Tc0); + Tce = FMA(KP668178637, Tc0, Tc1); + Tc4 = FNMS(KP707106781, Tb9, TaY); + Tc5 = TbI - TbJ; + Tc6 = FNMS(KP923879532, Tc5, Tc4); + Tch = FMA(KP923879532, Tc5, Tc4); + } + { + E Tc3, Tca, Tcj, Tck; + Tc3 = FNMS(KP1_662939224, Tc2, TbZ); + Tca = FNMS(KP534511135, Tc9, Tc6); + R0[WS(rs, 37)] = FNMS(KP1_763842528, Tca, Tc3); + R0[WS(rs, 5)] = FMA(KP1_763842528, Tca, Tc3); + Tcj = FMA(KP1_662939224, Tce, Tcd); + Tck = FMA(KP303346683, Tcg, Tch); + R0[WS(rs, 29)] = FNMS(KP1_913880671, Tck, Tcj); + R0[WS(rs, 61)] = FMA(KP1_913880671, Tck, Tcj); + } + { + E Tcb, Tcc, Tcf, Tci; + Tcb = FMA(KP1_662939224, Tc2, TbZ); + Tcc = FMA(KP534511135, Tc6, Tc9); + R0[WS(rs, 21)] = FNMS(KP1_763842528, Tcc, Tcb); + R0[WS(rs, 53)] = FMA(KP1_763842528, Tcc, Tcb); + Tcf = FNMS(KP1_662939224, Tce, Tcd); + Tci = FNMS(KP303346683, Tch, Tcg); + R0[WS(rs, 13)] = FNMS(KP1_913880671, Tci, Tcf); + R0[WS(rs, 45)] = FMA(KP1_913880671, Tci, Tcf); + } + } + { + E Tep, TeD, Tez, TeG, Tes, TeE, Tew, TeH; + { + E Ten, Teo, Tex, Tey; + Ten = FMA(KP2_000000000, Tds, Tdr); + Teo = Tdu + Tdx; + Tep = FNMS(KP1_414213562, Teo, Ten); + TeD = FMA(KP1_414213562, Teo, Ten); + Tex = Te6 - Te3; + Tey = Te0 - TdV; + Tez = FNMS(KP707106781, Tey, Tex); + TeG = FMA(KP707106781, Tey, Tex); + } + { + E Teq, Ter, Teu, Tev; + Teq = TdI - TdF; + Ter = TdA - TdD; + Tes = FNMS(KP414213562, Ter, Teq); + TeE = FMA(KP414213562, Teq, Ter); + Teu = TdM - TdP; + Tev = Te8 - Te9; + Tew = FNMS(KP707106781, Tev, Teu); + TeH = FMA(KP707106781, Tev, Teu); + } + { + E Tet, TeA, TeJ, TeK; + Tet = FNMS(KP1_847759065, Tes, Tep); + TeA = FNMS(KP668178637, Tez, Tew); + R0[WS(rs, 38)] = FNMS(KP1_662939224, TeA, Tet); + R0[WS(rs, 6)] = FMA(KP1_662939224, TeA, Tet); + TeJ = FMA(KP1_847759065, TeE, TeD); + TeK = FMA(KP198912367, TeG, TeH); + R0[WS(rs, 30)] = FNMS(KP1_961570560, TeK, TeJ); + R0[WS(rs, 62)] = FMA(KP1_961570560, TeK, TeJ); + } + { + E TeB, TeC, TeF, TeI; + TeB = FMA(KP1_847759065, Tes, Tep); + TeC = FMA(KP668178637, Tew, Tez); + R0[WS(rs, 22)] = FNMS(KP1_662939224, TeC, TeB); + R0[WS(rs, 54)] = FMA(KP1_662939224, TeC, TeB); + TeF = FNMS(KP1_847759065, TeE, TeD); + TeI = FNMS(KP198912367, TeH, TeG); + R0[WS(rs, 14)] = FNMS(KP1_961570560, TeI, TeF); + R0[WS(rs, 46)] = FMA(KP1_961570560, TeI, TeF); + } + } + { + E Tcr, TcV, TcR, TcY, Tcy, TcW, TcK, TcZ; + { + E Tcn, Tcq, TcN, TcQ; + Tcn = FNMS(KP1_414213562, Tcm, Tcl); + Tcq = FNMS(KP414213562, Tcp, Tco); + Tcr = FNMS(KP1_847759065, Tcq, Tcn); + TcV = FMA(KP1_847759065, Tcq, Tcn); + TcN = FNMS(KP707106781, TcM, TcL); + TcQ = TcO - TcP; + TcR = FMA(KP923879532, TcQ, TcN); + TcY = FNMS(KP923879532, TcQ, TcN); + } + { + E Tcu, Tcx, TcC, TcJ; + Tcu = FNMS(KP707106781, Tct, Tcs); + Tcx = FNMS(KP707106781, Tcw, Tcv); + Tcy = FNMS(KP668178637, Tcx, Tcu); + TcW = FMA(KP668178637, Tcu, Tcx); + TcC = FNMS(KP707106781, TcB, TcA); + TcJ = TcF - TcI; + TcK = FMA(KP923879532, TcJ, TcC); + TcZ = FNMS(KP923879532, TcJ, TcC); + } + { + E Tcz, TcS, Td1, Td2; + Tcz = FMA(KP1_662939224, Tcy, Tcr); + TcS = FNMS(KP303346683, TcR, TcK); + R0[WS(rs, 35)] = FNMS(KP1_913880671, TcS, Tcz); + R0[WS(rs, 3)] = FMA(KP1_913880671, TcS, Tcz); + Td1 = FMA(KP1_662939224, TcW, TcV); + Td2 = FMA(KP534511135, TcY, TcZ); + R0[WS(rs, 27)] = FNMS(KP1_763842528, Td2, Td1); + R0[WS(rs, 59)] = FMA(KP1_763842528, Td2, Td1); + } + { + E TcT, TcU, TcX, Td0; + TcT = FNMS(KP1_662939224, Tcy, Tcr); + TcU = FMA(KP303346683, TcK, TcR); + R0[WS(rs, 19)] = FNMS(KP1_913880671, TcU, TcT); + R0[WS(rs, 51)] = FMA(KP1_913880671, TcU, TcT); + TcX = FNMS(KP1_662939224, TcW, TcV); + Td0 = FNMS(KP534511135, TcZ, TcY); + R0[WS(rs, 11)] = FNMS(KP1_763842528, Td0, TcX); + R0[WS(rs, 43)] = FMA(KP1_763842528, Td0, TcX); + } + } + { + E Td5, Tdj, Tdf, Tdm, Td8, Tdk, Tdc, Tdn; + { + E Td3, Td4, Tdd, Tde; + Td3 = FMA(KP1_414213562, Tcm, Tcl); + Td4 = FMA(KP414213562, Tco, Tcp); + Td5 = FNMS(KP1_847759065, Td4, Td3); + Tdj = FMA(KP1_847759065, Td4, Td3); + Tdd = FMA(KP707106781, TcM, TcL); + Tde = TcI + TcF; + Tdf = FNMS(KP923879532, Tde, Tdd); + Tdm = FMA(KP923879532, Tde, Tdd); + } + { + E Td6, Td7, Tda, Tdb; + Td6 = FMA(KP707106781, Tcw, Tcv); + Td7 = FMA(KP707106781, Tct, Tcs); + Td8 = FNMS(KP198912367, Td7, Td6); + Tdk = FMA(KP198912367, Td6, Td7); + Tda = FMA(KP707106781, TcB, TcA); + Tdb = TcO + TcP; + Tdc = FNMS(KP923879532, Tdb, Tda); + Tdn = FMA(KP923879532, Tdb, Tda); + } + { + E Td9, Tdg, Tdp, Tdq; + Td9 = FNMS(KP1_961570560, Td8, Td5); + Tdg = FNMS(KP820678790, Tdf, Tdc); + R0[WS(rs, 39)] = FNMS(KP1_546020906, Tdg, Td9); + R0[WS(rs, 7)] = FMA(KP1_546020906, Tdg, Td9); + Tdp = FMA(KP1_961570560, Tdk, Tdj); + Tdq = FMA(KP098491403, Tdm, Tdn); + R0[WS(rs, 31)] = FNMS(KP1_990369453, Tdq, Tdp); + R0[WS(rs, 63)] = FMA(KP1_990369453, Tdq, Tdp); + } + { + E Tdh, Tdi, Tdl, Tdo; + Tdh = FMA(KP1_961570560, Td8, Td5); + Tdi = FMA(KP820678790, Tdc, Tdf); + R0[WS(rs, 23)] = FNMS(KP1_546020906, Tdi, Tdh); + R0[WS(rs, 55)] = FMA(KP1_546020906, Tdi, Tdh); + Tdl = FNMS(KP1_961570560, Tdk, Tdj); + Tdo = FNMS(KP098491403, Tdn, Tdm); + R0[WS(rs, 15)] = FNMS(KP1_990369453, Tdo, Tdl); + R0[WS(rs, 47)] = FMA(KP1_990369453, Tdo, Tdl); + } + } + { + E T2R, T5F, T3K, T5G, T5S, T64, T5P, T63, T5B, T67, T5I, T5W, T5k, T66, T5J; + E T5Z; + { + E T2p, T2Q, T5N, T5O; + T2p = FMA(KP1_847759065, T2o, T2d); + T2Q = FNMS(KP198912367, T2P, T2G); + T2R = FMA(KP1_961570560, T2Q, T2p); + T5F = FNMS(KP1_961570560, T2Q, T2p); + { + E T3w, T3J, T5Q, T5R; + T3w = FMA(KP923879532, T3v, T38); + T3J = FMA(KP923879532, T3I, T3F); + T3K = FNMS(KP098491403, T3J, T3w); + T5G = FMA(KP098491403, T3w, T3J); + T5Q = FNMS(KP923879532, T3I, T3F); + T5R = FNMS(KP923879532, T3v, T38); + T5S = FNMS(KP820678790, T5R, T5Q); + T64 = FMA(KP820678790, T5Q, T5R); + } + T5N = FNMS(KP1_847759065, T2o, T2d); + T5O = FMA(KP198912367, T2G, T2P); + T5P = FNMS(KP1_961570560, T5O, T5N); + T63 = FMA(KP1_961570560, T5O, T5N); + { + E T5x, T5U, T5A, T5V, T5y, T5z; + T5x = FMA(KP923879532, T5w, T5t); + T5U = FNMS(KP923879532, T4p, T42); + T5y = FMA(KP198912367, T4H, T4Q); + T5z = FNMS(KP198912367, T58, T5h); + T5A = T5y + T5z; + T5V = T5y - T5z; + T5B = FMA(KP980785280, T5A, T5x); + T67 = FMA(KP980785280, T5V, T5U); + T5I = FNMS(KP980785280, T5A, T5x); + T5W = FNMS(KP980785280, T5V, T5U); + } + { + E T4q, T5X, T5j, T5Y, T4R, T5i; + T4q = FMA(KP923879532, T4p, T42); + T5X = FNMS(KP923879532, T5w, T5t); + T4R = FNMS(KP198912367, T4Q, T4H); + T5i = FMA(KP198912367, T5h, T58); + T5j = T4R + T5i; + T5Y = T5i - T4R; + T5k = FMA(KP980785280, T5j, T4q); + T66 = FMA(KP980785280, T5Y, T5X); + T5J = FNMS(KP980785280, T5j, T4q); + T5Z = FNMS(KP980785280, T5Y, T5X); + } + } + { + E T3L, T5C, T65, T68; + T3L = FMA(KP1_990369453, T3K, T2R); + T5C = FNMS(KP049126849, T5B, T5k); + R1[WS(rs, 32)] = FNMS(KP1_997590912, T5C, T3L); + R1[0] = FMA(KP1_997590912, T5C, T3L); + T65 = FNMS(KP1_546020906, T64, T63); + T68 = FNMS(KP357805721, T67, T66); + R1[WS(rs, 12)] = FNMS(KP1_883088130, T68, T65); + R1[WS(rs, 44)] = FMA(KP1_883088130, T68, T65); + } + { + E T69, T6a, T5D, T5E; + T69 = FMA(KP1_546020906, T64, T63); + T6a = FMA(KP357805721, T66, T67); + R1[WS(rs, 28)] = FNMS(KP1_883088130, T6a, T69); + R1[WS(rs, 60)] = FMA(KP1_883088130, T6a, T69); + T5D = FNMS(KP1_990369453, T3K, T2R); + T5E = FMA(KP049126849, T5k, T5B); + R1[WS(rs, 16)] = FNMS(KP1_997590912, T5E, T5D); + R1[WS(rs, 48)] = FMA(KP1_997590912, T5E, T5D); + } + { + E T5H, T5K, T5T, T60; + T5H = FNMS(KP1_990369453, T5G, T5F); + T5K = FNMS(KP906347169, T5J, T5I); + R1[WS(rs, 8)] = FNMS(KP1_481902250, T5K, T5H); + R1[WS(rs, 40)] = FMA(KP1_481902250, T5K, T5H); + T5T = FNMS(KP1_546020906, T5S, T5P); + T60 = FNMS(KP472964775, T5Z, T5W); + R1[WS(rs, 36)] = FNMS(KP1_807978586, T60, T5T); + R1[WS(rs, 4)] = FMA(KP1_807978586, T60, T5T); + } + { + E T61, T62, T5L, T5M; + T61 = FMA(KP1_546020906, T5S, T5P); + T62 = FMA(KP472964775, T5W, T5Z); + R1[WS(rs, 20)] = FNMS(KP1_807978586, T62, T61); + R1[WS(rs, 52)] = FMA(KP1_807978586, T62, T61); + T5L = FMA(KP1_990369453, T5G, T5F); + T5M = FMA(KP906347169, T5I, T5J); + R1[WS(rs, 24)] = FNMS(KP1_481902250, T5M, T5L); + R1[WS(rs, 56)] = FMA(KP1_481902250, T5M, T5L); + } + } + { + E T7v, T8v, T7O, T8w, T8I, T8U, T8F, T8T, T8r, T8X, T8y, T8M, T8g, T8W, T8z; + E T8P; + { + E T7n, T7u, T8D, T8E; + T7n = FNMS(KP1_847759065, T7m, T7j); + T7u = FNMS(KP668178637, T7t, T7q); + T7v = FMA(KP1_662939224, T7u, T7n); + T8v = FNMS(KP1_662939224, T7u, T7n); + { + E T7G, T7N, T8G, T8H; + T7G = FNMS(KP923879532, T7F, T7y); + T7N = FMA(KP923879532, T7M, T7J); + T7O = FNMS(KP303346683, T7N, T7G); + T8w = FMA(KP303346683, T7G, T7N); + T8G = FNMS(KP923879532, T7M, T7J); + T8H = FMA(KP923879532, T7F, T7y); + T8I = FNMS(KP534511135, T8H, T8G); + T8U = FMA(KP534511135, T8G, T8H); + } + T8D = FMA(KP1_847759065, T7m, T7j); + T8E = FMA(KP668178637, T7q, T7t); + T8F = FNMS(KP1_662939224, T8E, T8D); + T8T = FMA(KP1_662939224, T8E, T8D); + { + E T8n, T8K, T8q, T8L, T8o, T8p; + T8n = FMA(KP923879532, T8m, T8j); + T8K = FMA(KP923879532, T7Z, T7S); + T8o = FMA(KP668178637, T83, T86); + T8p = FMA(KP668178637, T8a, T8d); + T8q = T8o - T8p; + T8L = T8o + T8p; + T8r = FMA(KP831469612, T8q, T8n); + T8X = FMA(KP831469612, T8L, T8K); + T8y = FNMS(KP831469612, T8q, T8n); + T8M = FNMS(KP831469612, T8L, T8K); + } + { + E T80, T8N, T8f, T8O, T87, T8e; + T80 = FNMS(KP923879532, T7Z, T7S); + T8N = FNMS(KP923879532, T8m, T8j); + T87 = FNMS(KP668178637, T86, T83); + T8e = FNMS(KP668178637, T8d, T8a); + T8f = T87 + T8e; + T8O = T8e - T87; + T8g = FMA(KP831469612, T8f, T80); + T8W = FMA(KP831469612, T8O, T8N); + T8z = FNMS(KP831469612, T8f, T80); + T8P = FNMS(KP831469612, T8O, T8N); + } + } + { + E T7P, T8s, T8V, T8Y; + T7P = FMA(KP1_913880671, T7O, T7v); + T8s = FNMS(KP148335987, T8r, T8g); + R1[WS(rs, 33)] = FNMS(KP1_978353019, T8s, T7P); + R1[WS(rs, 1)] = FMA(KP1_978353019, T8s, T7P); + T8V = FNMS(KP1_763842528, T8U, T8T); + T8Y = FNMS(KP250486960, T8X, T8W); + R1[WS(rs, 13)] = FNMS(KP1_940062506, T8Y, T8V); + R1[WS(rs, 45)] = FMA(KP1_940062506, T8Y, T8V); + } + { + E T8Z, T90, T8t, T8u; + T8Z = FMA(KP1_763842528, T8U, T8T); + T90 = FMA(KP250486960, T8W, T8X); + R1[WS(rs, 29)] = FNMS(KP1_940062506, T90, T8Z); + R1[WS(rs, 61)] = FMA(KP1_940062506, T90, T8Z); + T8t = FNMS(KP1_913880671, T7O, T7v); + T8u = FMA(KP148335987, T8g, T8r); + R1[WS(rs, 17)] = FNMS(KP1_978353019, T8u, T8t); + R1[WS(rs, 49)] = FMA(KP1_978353019, T8u, T8t); + } + { + E T8x, T8A, T8J, T8Q; + T8x = FNMS(KP1_913880671, T8w, T8v); + T8A = FNMS(KP741650546, T8z, T8y); + R1[WS(rs, 9)] = FNMS(KP1_606415062, T8A, T8x); + R1[WS(rs, 41)] = FMA(KP1_606415062, T8A, T8x); + T8J = FNMS(KP1_763842528, T8I, T8F); + T8Q = FNMS(KP599376933, T8P, T8M); + R1[WS(rs, 37)] = FNMS(KP1_715457220, T8Q, T8J); + R1[WS(rs, 5)] = FMA(KP1_715457220, T8Q, T8J); + } + { + E T8R, T8S, T8B, T8C; + T8R = FMA(KP1_763842528, T8I, T8F); + T8S = FMA(KP599376933, T8M, T8P); + R1[WS(rs, 21)] = FNMS(KP1_715457220, T8S, T8R); + R1[WS(rs, 53)] = FMA(KP1_715457220, T8S, T8R); + T8B = FMA(KP1_913880671, T8w, T8v); + T8C = FMA(KP741650546, T8y, T8z); + R1[WS(rs, 25)] = FNMS(KP1_606415062, T8C, T8B); + R1[WS(rs, 57)] = FMA(KP1_606415062, T8C, T8B); + } + } + { + E T6h, T6L, T6o, T6M, T6Y, T7a, T6V, T79, T6H, T7d, T6O, T72, T6A, T7c, T6P; + E T75; + { + E T6d, T6g, T6T, T6U; + T6d = FNMS(KP1_847759065, T6c, T6b); + T6g = FNMS(KP668178637, T6f, T6e); + T6h = FNMS(KP1_662939224, T6g, T6d); + T6L = FMA(KP1_662939224, T6g, T6d); + { + E T6k, T6n, T6W, T6X; + T6k = FNMS(KP923879532, T6j, T6i); + T6n = FNMS(KP923879532, T6m, T6l); + T6o = FNMS(KP534511135, T6n, T6k); + T6M = FMA(KP534511135, T6k, T6n); + T6W = FMA(KP923879532, T6m, T6l); + T6X = FMA(KP923879532, T6j, T6i); + T6Y = FNMS(KP303346683, T6X, T6W); + T7a = FMA(KP303346683, T6W, T6X); + } + T6T = FMA(KP1_847759065, T6c, T6b); + T6U = FMA(KP668178637, T6e, T6f); + T6V = FNMS(KP1_662939224, T6U, T6T); + T79 = FMA(KP1_662939224, T6U, T6T); + { + E T6D, T70, T6G, T71, T6E, T6F; + T6D = FNMS(KP923879532, T6C, T6B); + T70 = FMA(KP923879532, T6r, T6q); + T6E = FMA(KP668178637, T6w, T6x); + T6F = FNMS(KP668178637, T6t, T6u); + T6G = T6E - T6F; + T71 = T6E + T6F; + T6H = FMA(KP831469612, T6G, T6D); + T7d = FMA(KP831469612, T71, T70); + T6O = FNMS(KP831469612, T6G, T6D); + T72 = FNMS(KP831469612, T71, T70); + } + { + E T6s, T73, T6z, T74, T6v, T6y; + T6s = FNMS(KP923879532, T6r, T6q); + T73 = FMA(KP923879532, T6C, T6B); + T6v = FMA(KP668178637, T6u, T6t); + T6y = FNMS(KP668178637, T6x, T6w); + T6z = T6v - T6y; + T74 = T6y + T6v; + T6A = FMA(KP831469612, T6z, T6s); + T7c = FMA(KP831469612, T74, T73); + T6P = FNMS(KP831469612, T6z, T6s); + T75 = FNMS(KP831469612, T74, T73); + } + } + { + E T6p, T6I, T7b, T7e; + T6p = FMA(KP1_763842528, T6o, T6h); + T6I = FNMS(KP250486960, T6H, T6A); + R1[WS(rs, 34)] = FNMS(KP1_940062506, T6I, T6p); + R1[WS(rs, 2)] = FMA(KP1_940062506, T6I, T6p); + T7b = FNMS(KP1_913880671, T7a, T79); + T7e = FNMS(KP148335987, T7d, T7c); + R1[WS(rs, 14)] = FNMS(KP1_978353019, T7e, T7b); + R1[WS(rs, 46)] = FMA(KP1_978353019, T7e, T7b); + } + { + E T7f, T7g, T6J, T6K; + T7f = FMA(KP1_913880671, T7a, T79); + T7g = FMA(KP148335987, T7c, T7d); + R1[WS(rs, 30)] = FNMS(KP1_978353019, T7g, T7f); + R1[WS(rs, 62)] = FMA(KP1_978353019, T7g, T7f); + T6J = FNMS(KP1_763842528, T6o, T6h); + T6K = FMA(KP250486960, T6A, T6H); + R1[WS(rs, 18)] = FNMS(KP1_940062506, T6K, T6J); + R1[WS(rs, 50)] = FMA(KP1_940062506, T6K, T6J); + } + { + E T6N, T6Q, T6Z, T76; + T6N = FNMS(KP1_763842528, T6M, T6L); + T6Q = FNMS(KP599376933, T6P, T6O); + R1[WS(rs, 10)] = FNMS(KP1_715457220, T6Q, T6N); + R1[WS(rs, 42)] = FMA(KP1_715457220, T6Q, T6N); + T6Z = FNMS(KP1_913880671, T6Y, T6V); + T76 = FNMS(KP741650546, T75, T72); + R1[WS(rs, 38)] = FNMS(KP1_606415062, T76, T6Z); + R1[WS(rs, 6)] = FMA(KP1_606415062, T76, T6Z); + } + { + E T77, T78, T6R, T6S; + T77 = FMA(KP1_913880671, T6Y, T6V); + T78 = FMA(KP741650546, T72, T75); + R1[WS(rs, 22)] = FNMS(KP1_606415062, T78, T77); + R1[WS(rs, 54)] = FMA(KP1_606415062, T78, T77); + T6R = FMA(KP1_763842528, T6M, T6L); + T6S = FMA(KP599376933, T6O, T6P); + R1[WS(rs, 26)] = FNMS(KP1_715457220, T6S, T6R); + R1[WS(rs, 58)] = FMA(KP1_715457220, T6S, T6R); + } + } + { + E T97, T9B, T9e, T9C, T9O, Ta0, T9L, T9Z, T9x, Ta3, T9E, T9S, T9q, Ta2, T9F; + E T9V; + { + E T93, T96, T9J, T9K; + T93 = FNMS(KP1_847759065, T92, T91); + T96 = FNMS(KP198912367, T95, T94); + T97 = FNMS(KP1_961570560, T96, T93); + T9B = FMA(KP1_961570560, T96, T93); + { + E T9a, T9d, T9M, T9N; + T9a = FNMS(KP923879532, T99, T98); + T9d = FNMS(KP923879532, T9c, T9b); + T9e = FNMS(KP820678790, T9d, T9a); + T9C = FMA(KP820678790, T9a, T9d); + T9M = FMA(KP923879532, T9c, T9b); + T9N = FMA(KP923879532, T99, T98); + T9O = FNMS(KP098491403, T9N, T9M); + Ta0 = FMA(KP098491403, T9M, T9N); + } + T9J = FMA(KP1_847759065, T92, T91); + T9K = FMA(KP198912367, T94, T95); + T9L = FNMS(KP1_961570560, T9K, T9J); + T9Z = FMA(KP1_961570560, T9K, T9J); + { + E T9t, T9Q, T9w, T9R, T9u, T9v; + T9t = FNMS(KP923879532, T9s, T9r); + T9Q = FMA(KP923879532, T9h, T9g); + T9u = FMA(KP198912367, T9j, T9k); + T9v = FMA(KP198912367, T9m, T9n); + T9w = T9u - T9v; + T9R = T9u + T9v; + T9x = FMA(KP980785280, T9w, T9t); + Ta3 = FMA(KP980785280, T9R, T9Q); + T9E = FNMS(KP980785280, T9w, T9t); + T9S = FNMS(KP980785280, T9R, T9Q); + } + { + E T9i, T9T, T9p, T9U, T9l, T9o; + T9i = FNMS(KP923879532, T9h, T9g); + T9T = FMA(KP923879532, T9s, T9r); + T9l = FNMS(KP198912367, T9k, T9j); + T9o = FNMS(KP198912367, T9n, T9m); + T9p = T9l + T9o; + T9U = T9l - T9o; + T9q = FNMS(KP980785280, T9p, T9i); + Ta2 = FMA(KP980785280, T9U, T9T); + T9F = FMA(KP980785280, T9p, T9i); + T9V = FNMS(KP980785280, T9U, T9T); + } + } + { + E T9f, T9y, Ta1, Ta4; + T9f = FMA(KP1_546020906, T9e, T97); + T9y = FNMS(KP357805721, T9x, T9q); + R1[WS(rs, 35)] = FNMS(KP1_883088130, T9y, T9f); + R1[WS(rs, 3)] = FMA(KP1_883088130, T9y, T9f); + Ta1 = FNMS(KP1_990369453, Ta0, T9Z); + Ta4 = FNMS(KP049126849, Ta3, Ta2); + R1[WS(rs, 15)] = FNMS(KP1_997590912, Ta4, Ta1); + R1[WS(rs, 47)] = FMA(KP1_997590912, Ta4, Ta1); + } + { + E Ta5, Ta6, T9z, T9A; + Ta5 = FMA(KP1_990369453, Ta0, T9Z); + Ta6 = FMA(KP049126849, Ta2, Ta3); + R1[WS(rs, 31)] = FNMS(KP1_997590912, Ta6, Ta5); + R1[WS(rs, 63)] = FMA(KP1_997590912, Ta6, Ta5); + T9z = FNMS(KP1_546020906, T9e, T97); + T9A = FMA(KP357805721, T9q, T9x); + R1[WS(rs, 19)] = FNMS(KP1_883088130, T9A, T9z); + R1[WS(rs, 51)] = FMA(KP1_883088130, T9A, T9z); + } + { + E T9D, T9G, T9P, T9W; + T9D = FNMS(KP1_546020906, T9C, T9B); + T9G = FNMS(KP472964775, T9F, T9E); + R1[WS(rs, 11)] = FNMS(KP1_807978586, T9G, T9D); + R1[WS(rs, 43)] = FMA(KP1_807978586, T9G, T9D); + T9P = FNMS(KP1_990369453, T9O, T9L); + T9W = FNMS(KP906347169, T9V, T9S); + R1[WS(rs, 39)] = FNMS(KP1_481902250, T9W, T9P); + R1[WS(rs, 7)] = FMA(KP1_481902250, T9W, T9P); + } + { + E T9X, T9Y, T9H, T9I; + T9X = FMA(KP1_990369453, T9O, T9L); + T9Y = FMA(KP906347169, T9S, T9V); + R1[WS(rs, 23)] = FNMS(KP1_481902250, T9Y, T9X); + R1[WS(rs, 55)] = FMA(KP1_481902250, T9Y, T9X); + T9H = FMA(KP1_546020906, T9C, T9B); + T9I = FMA(KP472964775, T9E, T9F); + R1[WS(rs, 27)] = FNMS(KP1_807978586, T9I, T9H); + R1[WS(rs, 59)] = FMA(KP1_807978586, T9I, T9H); + } + } + } + } +} + +static const kr2c_desc desc = { 128, "r2cb_128", {416, 0, 540, 0}, &GENUS }; + +void X(codelet_r2cb_128) (planner *p) { + X(kr2c_register) (p, r2cb_128, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 128 -name r2cb_128 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 956 FP additions, 342 FP multiplications, + * (or, 812 additions, 198 multiplications, 144 fused multiply/add), + * 198 stack variables, 39 constants, and 256 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_128(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_028205488, +1.028205488386443453187387677937631545216098241); + DK(KP1_715457220, +1.715457220000544139804539968569540274084981599); + DK(KP1_606415062, +1.606415062961289819613353025926283847759138854); + DK(KP1_191398608, +1.191398608984866686934073057659939779023852677); + DK(KP1_940062506, +1.940062506389087985207968414572200502913731924); + DK(KP485960359, +0.485960359806527779896548324154942236641981567); + DK(KP293460948, +0.293460948910723503317700259293435639412430633); + DK(KP1_978353019, +1.978353019929561946903347476032486127967379067); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP855110186, +0.855110186860564188641933713777597068609157259); + DK(KP1_807978586, +1.807978586246886663172400594461074097420264050); + DK(KP1_481902250, +1.481902250709918182351233794990325459457910619); + DK(KP1_343117909, +1.343117909694036801250753700854843606457501264); + DK(KP1_883088130, +1.883088130366041556825018805199004714371179592); + DK(KP673779706, +0.673779706784440101378506425238295140955533559); + DK(KP098135348, +0.098135348654836028509909953885365316629490726); + DK(KP1_997590912, +1.997590912410344785429543209518201388886407229); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP580569354, +0.580569354508924735272384751634790549382952557); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP942793473, +0.942793473651995297112775251810508755314920638); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP1_268786568, +1.268786568327290996430343226450986741351374190); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP196034280, +0.196034280659121203988391127777283691722273346); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(512, rs), MAKE_VOLATILE_STRIDE(512, csr), MAKE_VOLATILE_STRIDE(512, csi)) { + E Ta, T6q, T2a, T5k, T8x, Tbx, TcF, Ten, Th, T6r, T2j, T5l, T8E, Tby, TcI; + E Teo, Tx, T6t, TcM, Teq, TcP, Ter, T2t, T5n, T2C, T5o, T8Q, TbA, T8X, TbB; + E T6w, T7L, T1j, T6L, Tde, TeC, TdL, TeR, T3v, T5z, T4I, T5O, T9O, TbM, TaV; + E Tc1, T78, T7Z, TN, T6z, TcU, Teu, Td8, Tey, T2N, T5r, T3j, T5v, T9a, TbE; + E T9A, TbI, T6H, T7O, T1O, T7V, T48, T4u, Tds, TeG, T5E, T5K, Taf, TbP, Tdp; + E TeF, T6U, T72, Tam, TbQ, T23, T7U, T4r, T4v, Tdz, TeJ, T5H, T5L, Tay, TbS; + E Tdw, TeI, T6Z, T73, TaF, TbT, T1y, T75, Tdl, TeQ, TdI, TeD, T3O, T5N, T4z; + E T5A, Ta3, Tc0, TaO, TbN, T6O, T80, T12, T6E, Td1, Tex, Td5, Tev, T36, T5u; + E T3a, T5s, T9p, TbH, T9t, TbF, T6C, T7P; + { + E T5, T8s, T3, T8q, T9, T8u, T29, T8v, T6, T26; + { + E T4, T8r, T1, T2; + T4 = Cr[WS(csr, 32)]; + T5 = KP2_000000000 * T4; + T8r = Ci[WS(csi, 32)]; + T8s = KP2_000000000 * T8r; + T1 = Cr[0]; + T2 = Cr[WS(csr, 64)]; + T3 = T1 + T2; + T8q = T1 - T2; + { + E T7, T8, T27, T28; + T7 = Cr[WS(csr, 16)]; + T8 = Cr[WS(csr, 48)]; + T9 = KP2_000000000 * (T7 + T8); + T8u = T7 - T8; + T27 = Ci[WS(csi, 16)]; + T28 = Ci[WS(csi, 48)]; + T29 = KP2_000000000 * (T27 - T28); + T8v = T27 + T28; + } + } + T6 = T3 + T5; + Ta = T6 + T9; + T6q = T6 - T9; + T26 = T3 - T5; + T2a = T26 - T29; + T5k = T26 + T29; + { + E T8t, T8w, TcD, TcE; + T8t = T8q - T8s; + T8w = KP1_414213562 * (T8u - T8v); + T8x = T8t + T8w; + Tbx = T8t - T8w; + TcD = T8q + T8s; + TcE = KP1_414213562 * (T8u + T8v); + TcF = TcD - TcE; + Ten = TcD + TcE; + } + } + { + E Td, T8y, T2e, T8C, Tg, T8B, T2h, T8z, T2b, T2i; + { + E Tb, Tc, T2c, T2d; + Tb = Cr[WS(csr, 8)]; + Tc = Cr[WS(csr, 56)]; + Td = Tb + Tc; + T8y = Tb - Tc; + T2c = Ci[WS(csi, 8)]; + T2d = Ci[WS(csi, 56)]; + T2e = T2c - T2d; + T8C = T2c + T2d; + } + { + E Te, Tf, T2f, T2g; + Te = Cr[WS(csr, 40)]; + Tf = Cr[WS(csr, 24)]; + Tg = Te + Tf; + T8B = Te - Tf; + T2f = Ci[WS(csi, 40)]; + T2g = Ci[WS(csi, 24)]; + T2h = T2f - T2g; + T8z = T2f + T2g; + } + Th = KP2_000000000 * (Td + Tg); + T6r = KP2_000000000 * (T2h + T2e); + T2b = Td - Tg; + T2i = T2e - T2h; + T2j = KP1_414213562 * (T2b - T2i); + T5l = KP1_414213562 * (T2b + T2i); + { + E T8A, T8D, TcG, TcH; + T8A = T8y - T8z; + T8D = T8B + T8C; + T8E = FNMS(KP765366864, T8D, KP1_847759065 * T8A); + Tby = FMA(KP765366864, T8A, KP1_847759065 * T8D); + TcG = T8y + T8z; + TcH = T8C - T8B; + TcI = FNMS(KP1_847759065, TcH, KP765366864 * TcG); + Teo = FMA(KP1_847759065, TcG, KP765366864 * TcH); + } + } + { + E Tl, T8G, T2x, T8V, To, T8U, T2A, T8H, Tv, T8S, T2o, T8O, Ts, T8R, T2r; + E T8L; + { + E Tj, Tk, T2y, T2z; + Tj = Cr[WS(csr, 4)]; + Tk = Cr[WS(csr, 60)]; + Tl = Tj + Tk; + T8G = Tj - Tk; + { + E T2v, T2w, Tm, Tn; + T2v = Ci[WS(csi, 4)]; + T2w = Ci[WS(csi, 60)]; + T2x = T2v - T2w; + T8V = T2v + T2w; + Tm = Cr[WS(csr, 36)]; + Tn = Cr[WS(csr, 28)]; + To = Tm + Tn; + T8U = Tm - Tn; + } + T2y = Ci[WS(csi, 36)]; + T2z = Ci[WS(csi, 28)]; + T2A = T2y - T2z; + T8H = T2y + T2z; + { + E Tt, Tu, T8M, T2m, T2n, T8N; + Tt = Cr[WS(csr, 12)]; + Tu = Cr[WS(csr, 52)]; + T8M = Tt - Tu; + T2m = Ci[WS(csi, 52)]; + T2n = Ci[WS(csi, 12)]; + T8N = T2n + T2m; + Tv = Tt + Tu; + T8S = T8M + T8N; + T2o = T2m - T2n; + T8O = T8M - T8N; + } + { + E Tq, Tr, T8J, T2p, T2q, T8K; + Tq = Cr[WS(csr, 20)]; + Tr = Cr[WS(csr, 44)]; + T8J = Tq - Tr; + T2p = Ci[WS(csi, 20)]; + T2q = Ci[WS(csi, 44)]; + T8K = T2p + T2q; + Ts = Tq + Tr; + T8R = T8J + T8K; + T2r = T2p - T2q; + T8L = T8J - T8K; + } + } + { + E Tp, Tw, TcK, TcL; + Tp = Tl + To; + Tw = Ts + Tv; + Tx = KP2_000000000 * (Tp + Tw); + T6t = Tp - Tw; + TcK = T8G + T8H; + TcL = KP707106781 * (T8R + T8S); + TcM = TcK - TcL; + Teq = TcK + TcL; + } + { + E TcN, TcO, T2l, T2s; + TcN = KP707106781 * (T8L - T8O); + TcO = T8V - T8U; + TcP = TcN + TcO; + Ter = TcO - TcN; + T2l = Tl - To; + T2s = T2o - T2r; + T2t = T2l + T2s; + T5n = T2l - T2s; + } + { + E T2u, T2B, T8I, T8P; + T2u = Ts - Tv; + T2B = T2x - T2A; + T2C = T2u + T2B; + T5o = T2B - T2u; + T8I = T8G - T8H; + T8P = KP707106781 * (T8L + T8O); + T8Q = T8I + T8P; + TbA = T8I - T8P; + } + { + E T8T, T8W, T6u, T6v; + T8T = KP707106781 * (T8R - T8S); + T8W = T8U + T8V; + T8X = T8T + T8W; + TbB = T8W - T8T; + T6u = T2A + T2x; + T6v = T2r + T2o; + T6w = T6u - T6v; + T7L = KP2_000000000 * (T6v + T6u); + } + } + { + E T17, T9E, T4D, TaT, T1a, TaS, T4G, T9F, T1h, TaQ, T3q, T9M, T1e, TaP, T3t; + E T9J; + { + E T15, T16, T4E, T4F; + T15 = Cr[WS(csr, 1)]; + T16 = Cr[WS(csr, 63)]; + T17 = T15 + T16; + T9E = T15 - T16; + { + E T4B, T4C, T18, T19; + T4B = Ci[WS(csi, 1)]; + T4C = Ci[WS(csi, 63)]; + T4D = T4B - T4C; + TaT = T4B + T4C; + T18 = Cr[WS(csr, 33)]; + T19 = Cr[WS(csr, 31)]; + T1a = T18 + T19; + TaS = T18 - T19; + } + T4E = Ci[WS(csi, 33)]; + T4F = Ci[WS(csi, 31)]; + T4G = T4E - T4F; + T9F = T4E + T4F; + { + E T1f, T1g, T9K, T3o, T3p, T9L; + T1f = Cr[WS(csr, 15)]; + T1g = Cr[WS(csr, 49)]; + T9K = T1f - T1g; + T3o = Ci[WS(csi, 49)]; + T3p = Ci[WS(csi, 15)]; + T9L = T3p + T3o; + T1h = T1f + T1g; + TaQ = T9K + T9L; + T3q = T3o - T3p; + T9M = T9K - T9L; + } + { + E T1c, T1d, T9H, T3r, T3s, T9I; + T1c = Cr[WS(csr, 17)]; + T1d = Cr[WS(csr, 47)]; + T9H = T1c - T1d; + T3r = Ci[WS(csi, 17)]; + T3s = Ci[WS(csi, 47)]; + T9I = T3r + T3s; + T1e = T1c + T1d; + TaP = T9H + T9I; + T3t = T3r - T3s; + T9J = T9H - T9I; + } + } + { + E T1b, T1i, Tdc, Tdd; + T1b = T17 + T1a; + T1i = T1e + T1h; + T1j = T1b + T1i; + T6L = T1b - T1i; + Tdc = T9E + T9F; + Tdd = KP707106781 * (TaP + TaQ); + Tde = Tdc - Tdd; + TeC = Tdc + Tdd; + } + { + E TdJ, TdK, T3n, T3u; + TdJ = KP707106781 * (T9J - T9M); + TdK = TaT - TaS; + TdL = TdJ + TdK; + TeR = TdK - TdJ; + T3n = T17 - T1a; + T3u = T3q - T3t; + T3v = T3n + T3u; + T5z = T3n - T3u; + } + { + E T4A, T4H, T9G, T9N; + T4A = T1e - T1h; + T4H = T4D - T4G; + T4I = T4A + T4H; + T5O = T4H - T4A; + T9G = T9E - T9F; + T9N = KP707106781 * (T9J + T9M); + T9O = T9G + T9N; + TbM = T9G - T9N; + } + { + E TaR, TaU, T76, T77; + TaR = KP707106781 * (TaP - TaQ); + TaU = TaS + TaT; + TaV = TaR + TaU; + Tc1 = TaU - TaR; + T76 = T4G + T4D; + T77 = T3t + T3q; + T78 = T76 - T77; + T7Z = T77 + T76; + } + } + { + E TB, T90, T3e, T9y, TE, T9x, T3h, T91, TL, T9v, T2I, T98, TI, T9u, T2L; + E T95; + { + E Tz, TA, T3f, T3g; + Tz = Cr[WS(csr, 2)]; + TA = Cr[WS(csr, 62)]; + TB = Tz + TA; + T90 = Tz - TA; + { + E T3c, T3d, TC, TD; + T3c = Ci[WS(csi, 2)]; + T3d = Ci[WS(csi, 62)]; + T3e = T3c - T3d; + T9y = T3c + T3d; + TC = Cr[WS(csr, 34)]; + TD = Cr[WS(csr, 30)]; + TE = TC + TD; + T9x = TC - TD; + } + T3f = Ci[WS(csi, 34)]; + T3g = Ci[WS(csi, 30)]; + T3h = T3f - T3g; + T91 = T3f + T3g; + { + E TJ, TK, T96, T2G, T2H, T97; + TJ = Cr[WS(csr, 14)]; + TK = Cr[WS(csr, 50)]; + T96 = TJ - TK; + T2G = Ci[WS(csi, 50)]; + T2H = Ci[WS(csi, 14)]; + T97 = T2H + T2G; + TL = TJ + TK; + T9v = T96 + T97; + T2I = T2G - T2H; + T98 = T96 - T97; + } + { + E TG, TH, T93, T2J, T2K, T94; + TG = Cr[WS(csr, 18)]; + TH = Cr[WS(csr, 46)]; + T93 = TG - TH; + T2J = Ci[WS(csi, 18)]; + T2K = Ci[WS(csi, 46)]; + T94 = T2J + T2K; + TI = TG + TH; + T9u = T93 + T94; + T2L = T2J - T2K; + T95 = T93 - T94; + } + } + { + E TF, TM, TcS, TcT; + TF = TB + TE; + TM = TI + TL; + TN = TF + TM; + T6z = TF - TM; + TcS = T90 + T91; + TcT = KP707106781 * (T9u + T9v); + TcU = TcS - TcT; + Teu = TcS + TcT; + } + { + E Td6, Td7, T2F, T2M; + Td6 = KP707106781 * (T95 - T98); + Td7 = T9y - T9x; + Td8 = Td6 + Td7; + Tey = Td7 - Td6; + T2F = TB - TE; + T2M = T2I - T2L; + T2N = T2F + T2M; + T5r = T2F - T2M; + } + { + E T3b, T3i, T92, T99; + T3b = TI - TL; + T3i = T3e - T3h; + T3j = T3b + T3i; + T5v = T3i - T3b; + T92 = T90 - T91; + T99 = KP707106781 * (T95 + T98); + T9a = T92 + T99; + TbE = T92 - T99; + } + { + E T9w, T9z, T6F, T6G; + T9w = KP707106781 * (T9u - T9v); + T9z = T9x + T9y; + T9A = T9w + T9z; + TbI = T9z - T9w; + T6F = T3h + T3e; + T6G = T2L + T2I; + T6H = T6F - T6G; + T7O = T6G + T6F; + } + } + { + E T1G, Taj, T3Q, Ta5, T46, Tak, T6R, Ta6, T1N, Tag, Tah, T3X, T3Z, Taa, Tad; + E T6S, Tdn, Tdo; + { + E T1A, T1B, T1C, T1D, T1E, T1F; + T1A = Cr[WS(csr, 5)]; + T1B = Cr[WS(csr, 59)]; + T1C = T1A + T1B; + T1D = Cr[WS(csr, 37)]; + T1E = Cr[WS(csr, 27)]; + T1F = T1D + T1E; + T1G = T1C + T1F; + Taj = T1D - T1E; + T3Q = T1C - T1F; + Ta5 = T1A - T1B; + } + { + E T40, T41, T42, T43, T44, T45; + T40 = Ci[WS(csi, 5)]; + T41 = Ci[WS(csi, 59)]; + T42 = T40 - T41; + T43 = Ci[WS(csi, 37)]; + T44 = Ci[WS(csi, 27)]; + T45 = T43 - T44; + T46 = T42 - T45; + Tak = T40 + T41; + T6R = T45 + T42; + Ta6 = T43 + T44; + } + { + E T1J, Ta8, T3W, Ta9, T1M, Tab, T3T, Tac; + { + E T1H, T1I, T3U, T3V; + T1H = Cr[WS(csr, 21)]; + T1I = Cr[WS(csr, 43)]; + T1J = T1H + T1I; + Ta8 = T1H - T1I; + T3U = Ci[WS(csi, 21)]; + T3V = Ci[WS(csi, 43)]; + T3W = T3U - T3V; + Ta9 = T3U + T3V; + } + { + E T1K, T1L, T3R, T3S; + T1K = Cr[WS(csr, 11)]; + T1L = Cr[WS(csr, 53)]; + T1M = T1K + T1L; + Tab = T1K - T1L; + T3R = Ci[WS(csi, 53)]; + T3S = Ci[WS(csi, 11)]; + T3T = T3R - T3S; + Tac = T3S + T3R; + } + T1N = T1J + T1M; + Tag = Ta8 + Ta9; + Tah = Tab + Tac; + T3X = T3T - T3W; + T3Z = T1J - T1M; + Taa = Ta8 - Ta9; + Tad = Tab - Tac; + T6S = T3W + T3T; + } + T1O = T1G + T1N; + T7V = T6S + T6R; + { + E T3Y, T47, Tdq, Tdr; + T3Y = T3Q + T3X; + T47 = T3Z + T46; + T48 = FNMS(KP382683432, T47, KP923879532 * T3Y); + T4u = FMA(KP382683432, T3Y, KP923879532 * T47); + Tdq = KP707106781 * (Taa - Tad); + Tdr = Tak - Taj; + Tds = Tdq + Tdr; + TeG = Tdr - Tdq; + } + { + E T5C, T5D, Ta7, Tae; + T5C = T3Q - T3X; + T5D = T46 - T3Z; + T5E = FNMS(KP923879532, T5D, KP382683432 * T5C); + T5K = FMA(KP923879532, T5C, KP382683432 * T5D); + Ta7 = Ta5 - Ta6; + Tae = KP707106781 * (Taa + Tad); + Taf = Ta7 + Tae; + TbP = Ta7 - Tae; + } + Tdn = Ta5 + Ta6; + Tdo = KP707106781 * (Tag + Tah); + Tdp = Tdn - Tdo; + TeF = Tdn + Tdo; + { + E T6Q, T6T, Tai, Tal; + T6Q = T1G - T1N; + T6T = T6R - T6S; + T6U = T6Q - T6T; + T72 = T6Q + T6T; + Tai = KP707106781 * (Tag - Tah); + Tal = Taj + Tak; + Tam = Tai + Tal; + TbQ = Tal - Tai; + } + } + { + E T1V, TaC, T49, Tao, T4p, TaD, T6W, Tap, T22, Taz, TaA, T4g, T4i, Tat, Taw; + E T6X, Tdu, Tdv; + { + E T1P, T1Q, T1R, T1S, T1T, T1U; + T1P = Cr[WS(csr, 3)]; + T1Q = Cr[WS(csr, 61)]; + T1R = T1P + T1Q; + T1S = Cr[WS(csr, 29)]; + T1T = Cr[WS(csr, 35)]; + T1U = T1S + T1T; + T1V = T1R + T1U; + TaC = T1S - T1T; + T49 = T1R - T1U; + Tao = T1P - T1Q; + } + { + E T4j, T4k, T4l, T4m, T4n, T4o; + T4j = Ci[WS(csi, 61)]; + T4k = Ci[WS(csi, 3)]; + T4l = T4j - T4k; + T4m = Ci[WS(csi, 29)]; + T4n = Ci[WS(csi, 35)]; + T4o = T4m - T4n; + T4p = T4l - T4o; + TaD = T4k + T4j; + T6W = T4o + T4l; + Tap = T4m + T4n; + } + { + E T1Y, Tar, T4f, Tas, T21, Tau, T4c, Tav; + { + E T1W, T1X, T4d, T4e; + T1W = Cr[WS(csr, 13)]; + T1X = Cr[WS(csr, 51)]; + T1Y = T1W + T1X; + Tar = T1W - T1X; + T4d = Ci[WS(csi, 13)]; + T4e = Ci[WS(csi, 51)]; + T4f = T4d - T4e; + Tas = T4d + T4e; + } + { + E T1Z, T20, T4a, T4b; + T1Z = Cr[WS(csr, 19)]; + T20 = Cr[WS(csr, 45)]; + T21 = T1Z + T20; + Tau = T1Z - T20; + T4a = Ci[WS(csi, 45)]; + T4b = Ci[WS(csi, 19)]; + T4c = T4a - T4b; + Tav = T4b + T4a; + } + T22 = T1Y + T21; + Taz = Tar + Tas; + TaA = Tau + Tav; + T4g = T4c - T4f; + T4i = T1Y - T21; + Tat = Tar - Tas; + Taw = Tau - Tav; + T6X = T4f + T4c; + } + T23 = T1V + T22; + T7U = T6X + T6W; + { + E T4h, T4q, Tdx, Tdy; + T4h = T49 + T4g; + T4q = T4i + T4p; + T4r = FMA(KP923879532, T4h, KP382683432 * T4q); + T4v = FNMS(KP382683432, T4h, KP923879532 * T4q); + Tdx = KP707106781 * (Tat - Taw); + Tdy = TaC + TaD; + Tdz = Tdx - Tdy; + TeJ = Tdx + Tdy; + } + { + E T5F, T5G, Taq, Tax; + T5F = T49 - T4g; + T5G = T4p - T4i; + T5H = FMA(KP382683432, T5F, KP923879532 * T5G); + T5L = FNMS(KP923879532, T5F, KP382683432 * T5G); + Taq = Tao - Tap; + Tax = KP707106781 * (Tat + Taw); + Tay = Taq + Tax; + TbS = Taq - Tax; + } + Tdu = Tao + Tap; + Tdv = KP707106781 * (Taz + TaA); + Tdw = Tdu - Tdv; + TeI = Tdu + Tdv; + { + E T6V, T6Y, TaB, TaE; + T6V = T1V - T22; + T6Y = T6W - T6X; + T6Z = T6V + T6Y; + T73 = T6Y - T6V; + TaB = KP707106781 * (Taz - TaA); + TaE = TaC - TaD; + TaF = TaB + TaE; + TbT = TaE - TaB; + } + } + { + E T1m, T3z, T1p, T3C, T3w, T3D, Tdg, Tdf, T9U, T9R, T1t, T3I, T1w, T3L, T3F; + E T3M, Tdj, Tdi, Ta1, T9Y; + { + E T9P, T9T, T9S, T9Q; + { + E T1k, T1l, T3x, T3y; + T1k = Cr[WS(csr, 9)]; + T1l = Cr[WS(csr, 55)]; + T1m = T1k + T1l; + T9P = T1k - T1l; + T3x = Ci[WS(csi, 9)]; + T3y = Ci[WS(csi, 55)]; + T3z = T3x - T3y; + T9T = T3x + T3y; + } + { + E T1n, T1o, T3A, T3B; + T1n = Cr[WS(csr, 41)]; + T1o = Cr[WS(csr, 23)]; + T1p = T1n + T1o; + T9S = T1n - T1o; + T3A = Ci[WS(csi, 41)]; + T3B = Ci[WS(csi, 23)]; + T3C = T3A - T3B; + T9Q = T3A + T3B; + } + T3w = T1m - T1p; + T3D = T3z - T3C; + Tdg = T9T - T9S; + Tdf = T9P + T9Q; + T9U = T9S + T9T; + T9R = T9P - T9Q; + } + { + E T9W, Ta0, T9Z, T9X; + { + E T1r, T1s, T3G, T3H; + T1r = Cr[WS(csr, 7)]; + T1s = Cr[WS(csr, 57)]; + T1t = T1r + T1s; + T9W = T1r - T1s; + T3G = Ci[WS(csi, 57)]; + T3H = Ci[WS(csi, 7)]; + T3I = T3G - T3H; + Ta0 = T3H + T3G; + } + { + E T1u, T1v, T3J, T3K; + T1u = Cr[WS(csr, 25)]; + T1v = Cr[WS(csr, 39)]; + T1w = T1u + T1v; + T9Z = T1u - T1v; + T3J = Ci[WS(csi, 25)]; + T3K = Ci[WS(csi, 39)]; + T3L = T3J - T3K; + T9X = T3J + T3K; + } + T3F = T1t - T1w; + T3M = T3I - T3L; + Tdj = T9Z + Ta0; + Tdi = T9W + T9X; + Ta1 = T9Z - Ta0; + T9Y = T9W - T9X; + } + { + E T1q, T1x, Tdh, Tdk; + T1q = T1m + T1p; + T1x = T1t + T1w; + T1y = T1q + T1x; + T75 = T1q - T1x; + Tdh = FNMS(KP923879532, Tdg, KP382683432 * Tdf); + Tdk = FNMS(KP923879532, Tdj, KP382683432 * Tdi); + Tdl = Tdh + Tdk; + TeQ = Tdh - Tdk; + } + { + E TdG, TdH, T3E, T3N; + TdG = FMA(KP923879532, Tdf, KP382683432 * Tdg); + TdH = FMA(KP923879532, Tdi, KP382683432 * Tdj); + TdI = TdG - TdH; + TeD = TdG + TdH; + T3E = T3w - T3D; + T3N = T3F + T3M; + T3O = KP707106781 * (T3E + T3N); + T5N = KP707106781 * (T3E - T3N); + } + { + E T4x, T4y, T9V, Ta2; + T4x = T3w + T3D; + T4y = T3M - T3F; + T4z = KP707106781 * (T4x + T4y); + T5A = KP707106781 * (T4y - T4x); + T9V = FNMS(KP382683432, T9U, KP923879532 * T9R); + Ta2 = FMA(KP923879532, T9Y, KP382683432 * Ta1); + Ta3 = T9V + Ta2; + Tc0 = T9V - Ta2; + } + { + E TaM, TaN, T6M, T6N; + TaM = FMA(KP382683432, T9R, KP923879532 * T9U); + TaN = FNMS(KP382683432, T9Y, KP923879532 * Ta1); + TaO = TaM + TaN; + TbN = TaN - TaM; + T6M = T3L + T3I; + T6N = T3C + T3z; + T6O = T6M - T6N; + T80 = T6N + T6M; + } + } + { + E TQ, T2R, TT, T2U, T2O, T2V, TcW, TcV, T9g, T9d, TX, T30, T10, T33, T2X; + E T34, TcZ, TcY, T9n, T9k; + { + E T9b, T9f, T9e, T9c; + { + E TO, TP, T2P, T2Q; + TO = Cr[WS(csr, 10)]; + TP = Cr[WS(csr, 54)]; + TQ = TO + TP; + T9b = TO - TP; + T2P = Ci[WS(csi, 10)]; + T2Q = Ci[WS(csi, 54)]; + T2R = T2P - T2Q; + T9f = T2P + T2Q; + } + { + E TR, TS, T2S, T2T; + TR = Cr[WS(csr, 42)]; + TS = Cr[WS(csr, 22)]; + TT = TR + TS; + T9e = TR - TS; + T2S = Ci[WS(csi, 42)]; + T2T = Ci[WS(csi, 22)]; + T2U = T2S - T2T; + T9c = T2S + T2T; + } + T2O = TQ - TT; + T2V = T2R - T2U; + TcW = T9f - T9e; + TcV = T9b + T9c; + T9g = T9e + T9f; + T9d = T9b - T9c; + } + { + E T9i, T9m, T9l, T9j; + { + E TV, TW, T2Y, T2Z; + TV = Cr[WS(csr, 6)]; + TW = Cr[WS(csr, 58)]; + TX = TV + TW; + T9i = TV - TW; + T2Y = Ci[WS(csi, 58)]; + T2Z = Ci[WS(csi, 6)]; + T30 = T2Y - T2Z; + T9m = T2Z + T2Y; + } + { + E TY, TZ, T31, T32; + TY = Cr[WS(csr, 26)]; + TZ = Cr[WS(csr, 38)]; + T10 = TY + TZ; + T9l = TY - TZ; + T31 = Ci[WS(csi, 26)]; + T32 = Ci[WS(csi, 38)]; + T33 = T31 - T32; + T9j = T31 + T32; + } + T2X = TX - T10; + T34 = T30 - T33; + TcZ = T9l + T9m; + TcY = T9i + T9j; + T9n = T9l - T9m; + T9k = T9i - T9j; + } + { + E TU, T11, TcX, Td0; + TU = TQ + TT; + T11 = TX + T10; + T12 = TU + T11; + T6E = TU - T11; + TcX = FNMS(KP923879532, TcW, KP382683432 * TcV); + Td0 = FNMS(KP923879532, TcZ, KP382683432 * TcY); + Td1 = TcX + Td0; + Tex = TcX - Td0; + } + { + E Td3, Td4, T2W, T35; + Td3 = FMA(KP923879532, TcV, KP382683432 * TcW); + Td4 = FMA(KP923879532, TcY, KP382683432 * TcZ); + Td5 = Td3 - Td4; + Tev = Td3 + Td4; + T2W = T2O - T2V; + T35 = T2X + T34; + T36 = KP707106781 * (T2W + T35); + T5u = KP707106781 * (T2W - T35); + } + { + E T38, T39, T9h, T9o; + T38 = T2O + T2V; + T39 = T34 - T2X; + T3a = KP707106781 * (T38 + T39); + T5s = KP707106781 * (T39 - T38); + T9h = FNMS(KP382683432, T9g, KP923879532 * T9d); + T9o = FMA(KP923879532, T9k, KP382683432 * T9n); + T9p = T9h + T9o; + TbH = T9h - T9o; + } + { + E T9r, T9s, T6A, T6B; + T9r = FMA(KP382683432, T9d, KP923879532 * T9g); + T9s = FNMS(KP382683432, T9k, KP923879532 * T9n); + T9t = T9r + T9s; + TbF = T9s - T9r; + T6A = T33 + T30; + T6B = T2U + T2R; + T6C = T6A - T6B; + T7P = T6B + T6A; + } + } + { + E T13, T8f, Ty, T8e, T25, T8h, T8k, T8p, Ti, T14, T8o; + T13 = KP2_000000000 * (TN + T12); + T8f = KP2_000000000 * (T7P + T7O); + Ti = Ta + Th; + Ty = Ti + Tx; + T8e = Ti - Tx; + { + E T1z, T24, T8i, T8j; + T1z = T1j + T1y; + T24 = T1O + T23; + T25 = KP2_000000000 * (T1z + T24); + T8h = T1z - T24; + T8i = T80 + T7Z; + T8j = T7V + T7U; + T8k = T8i - T8j; + T8p = KP2_000000000 * (T8j + T8i); + } + T14 = Ty + T13; + R0[WS(rs, 32)] = T14 - T25; + R0[0] = T14 + T25; + T8o = Ty - T13; + R0[WS(rs, 16)] = T8o - T8p; + R0[WS(rs, 48)] = T8o + T8p; + { + E T8g, T8l, T8m, T8n; + T8g = T8e - T8f; + T8l = KP1_414213562 * (T8h - T8k); + R0[WS(rs, 40)] = T8g - T8l; + R0[WS(rs, 8)] = T8g + T8l; + T8m = T8e + T8f; + T8n = KP1_414213562 * (T8h + T8k); + R0[WS(rs, 24)] = T8m - T8n; + R0[WS(rs, 56)] = T8m + T8n; + } + } + { + E T7M, T86, T82, T8a, T7R, T87, T7X, T89, T7K, T7Y, T81; + T7K = Ta - Th; + T7M = T7K - T7L; + T86 = T7K + T7L; + T7Y = T1O - T23; + T81 = T7Z - T80; + T82 = T7Y + T81; + T8a = T81 - T7Y; + { + E T7N, T7Q, T7T, T7W; + T7N = TN - T12; + T7Q = T7O - T7P; + T7R = KP1_414213562 * (T7N - T7Q); + T87 = KP1_414213562 * (T7N + T7Q); + T7T = T1j - T1y; + T7W = T7U - T7V; + T7X = T7T + T7W; + T89 = T7T - T7W; + } + { + E T7S, T83, T8c, T8d; + T7S = T7M + T7R; + T83 = FNMS(KP765366864, T82, KP1_847759065 * T7X); + R0[WS(rs, 36)] = T7S - T83; + R0[WS(rs, 4)] = T7S + T83; + T8c = T86 + T87; + T8d = FMA(KP1_847759065, T89, KP765366864 * T8a); + R0[WS(rs, 28)] = T8c - T8d; + R0[WS(rs, 60)] = T8c + T8d; + } + { + E T84, T85, T88, T8b; + T84 = T7M - T7R; + T85 = FMA(KP765366864, T7X, KP1_847759065 * T82); + R0[WS(rs, 20)] = T84 - T85; + R0[WS(rs, 52)] = T84 + T85; + T88 = T86 - T87; + T8b = FNMS(KP1_847759065, T8a, KP765366864 * T89); + R0[WS(rs, 44)] = T88 - T8b; + R0[WS(rs, 12)] = T88 + T8b; + } + } + { + E T2E, T4O, T4K, T4S, T3l, T4P, T4t, T4R; + { + E T2k, T2D, T4w, T4J; + T2k = T2a + T2j; + T2D = FNMS(KP765366864, T2C, KP1_847759065 * T2t); + T2E = T2k + T2D; + T4O = T2k - T2D; + T4w = T4u + T4v; + T4J = T4z + T4I; + T4K = T4w + T4J; + T4S = T4J - T4w; + } + { + E T37, T3k, T3P, T4s; + T37 = T2N + T36; + T3k = T3a + T3j; + T3l = FNMS(KP390180644, T3k, KP1_961570560 * T37); + T4P = FMA(KP390180644, T37, KP1_961570560 * T3k); + T3P = T3v + T3O; + T4s = T48 + T4r; + T4t = T3P + T4s; + T4R = T3P - T4s; + } + { + E T3m, T4L, T4U, T4V; + T3m = T2E + T3l; + T4L = FNMS(KP196034280, T4K, KP1_990369453 * T4t); + R0[WS(rs, 33)] = T3m - T4L; + R0[WS(rs, 1)] = T3m + T4L; + T4U = T4O + T4P; + T4V = FMA(KP1_546020906, T4R, KP1_268786568 * T4S); + R0[WS(rs, 25)] = T4U - T4V; + R0[WS(rs, 57)] = T4U + T4V; + } + { + E T4M, T4N, T4Q, T4T; + T4M = T2E - T3l; + T4N = FMA(KP196034280, T4t, KP1_990369453 * T4K); + R0[WS(rs, 17)] = T4M - T4N; + R0[WS(rs, 49)] = T4M + T4N; + T4Q = T4O - T4P; + T4T = FNMS(KP1_546020906, T4S, KP1_268786568 * T4R); + R0[WS(rs, 41)] = T4Q - T4T; + R0[WS(rs, 9)] = T4Q + T4T; + } + } + { + E T6y, T7e, T7a, T7i, T6J, T7f, T71, T7h; + { + E T6s, T6x, T74, T79; + T6s = T6q - T6r; + T6x = KP1_414213562 * (T6t - T6w); + T6y = T6s + T6x; + T7e = T6s - T6x; + T74 = KP707106781 * (T72 + T73); + T79 = T75 + T78; + T7a = T74 + T79; + T7i = T79 - T74; + } + { + E T6D, T6I, T6P, T70; + T6D = T6z + T6C; + T6I = T6E + T6H; + T6J = FNMS(KP765366864, T6I, KP1_847759065 * T6D); + T7f = FMA(KP765366864, T6D, KP1_847759065 * T6I); + T6P = T6L + T6O; + T70 = KP707106781 * (T6U + T6Z); + T71 = T6P + T70; + T7h = T6P - T70; + } + { + E T6K, T7b, T7k, T7l; + T6K = T6y + T6J; + T7b = FNMS(KP390180644, T7a, KP1_961570560 * T71); + R0[WS(rs, 34)] = T6K - T7b; + R0[WS(rs, 2)] = T6K + T7b; + T7k = T7e + T7f; + T7l = FMA(KP1_662939224, T7h, KP1_111140466 * T7i); + R0[WS(rs, 26)] = T7k - T7l; + R0[WS(rs, 58)] = T7k + T7l; + } + { + E T7c, T7d, T7g, T7j; + T7c = T6y - T6J; + T7d = FMA(KP390180644, T71, KP1_961570560 * T7a); + R0[WS(rs, 18)] = T7c - T7d; + R0[WS(rs, 50)] = T7c + T7d; + T7g = T7e - T7f; + T7j = FNMS(KP1_662939224, T7i, KP1_111140466 * T7h); + R0[WS(rs, 42)] = T7g - T7j; + R0[WS(rs, 10)] = T7g + T7j; + } + } + { + E T4Y, T5c, T58, T5g, T51, T5d, T55, T5f; + { + E T4W, T4X, T56, T57; + T4W = T2a - T2j; + T4X = FMA(KP765366864, T2t, KP1_847759065 * T2C); + T4Y = T4W - T4X; + T5c = T4W + T4X; + T56 = T48 - T4r; + T57 = T4I - T4z; + T58 = T56 + T57; + T5g = T57 - T56; + } + { + E T4Z, T50, T53, T54; + T4Z = T2N - T36; + T50 = T3j - T3a; + T51 = FNMS(KP1_662939224, T50, KP1_111140466 * T4Z); + T5d = FMA(KP1_662939224, T4Z, KP1_111140466 * T50); + T53 = T3v - T3O; + T54 = T4v - T4u; + T55 = T53 + T54; + T5f = T53 - T54; + } + { + E T52, T59, T5i, T5j; + T52 = T4Y + T51; + T59 = FNMS(KP942793473, T58, KP1_763842528 * T55); + R0[WS(rs, 37)] = T52 - T59; + R0[WS(rs, 5)] = T52 + T59; + T5i = T5c + T5d; + T5j = FMA(KP1_913880671, T5f, KP580569354 * T5g); + R0[WS(rs, 29)] = T5i - T5j; + R0[WS(rs, 61)] = T5i + T5j; + } + { + E T5a, T5b, T5e, T5h; + T5a = T4Y - T51; + T5b = FMA(KP942793473, T55, KP1_763842528 * T58); + R0[WS(rs, 21)] = T5a - T5b; + R0[WS(rs, 53)] = T5a + T5b; + T5e = T5c - T5d; + T5h = FNMS(KP1_913880671, T5g, KP580569354 * T5f); + R0[WS(rs, 45)] = T5e - T5h; + R0[WS(rs, 13)] = T5e + T5h; + } + } + { + E T7o, T7C, T7y, T7G, T7r, T7D, T7v, T7F; + { + E T7m, T7n, T7w, T7x; + T7m = T6q + T6r; + T7n = KP1_414213562 * (T6t + T6w); + T7o = T7m - T7n; + T7C = T7m + T7n; + T7w = KP707106781 * (T6U - T6Z); + T7x = T78 - T75; + T7y = T7w + T7x; + T7G = T7x - T7w; + } + { + E T7p, T7q, T7t, T7u; + T7p = T6z - T6C; + T7q = T6H - T6E; + T7r = FNMS(KP1_847759065, T7q, KP765366864 * T7p); + T7D = FMA(KP1_847759065, T7p, KP765366864 * T7q); + T7t = T6L - T6O; + T7u = KP707106781 * (T73 - T72); + T7v = T7t + T7u; + T7F = T7t - T7u; + } + { + E T7s, T7z, T7I, T7J; + T7s = T7o + T7r; + T7z = FNMS(KP1_111140466, T7y, KP1_662939224 * T7v); + R0[WS(rs, 38)] = T7s - T7z; + R0[WS(rs, 6)] = T7s + T7z; + T7I = T7C + T7D; + T7J = FMA(KP1_961570560, T7F, KP390180644 * T7G); + R0[WS(rs, 30)] = T7I - T7J; + R0[WS(rs, 62)] = T7I + T7J; + } + { + E T7A, T7B, T7E, T7H; + T7A = T7o - T7r; + T7B = FMA(KP1_111140466, T7v, KP1_662939224 * T7y); + R0[WS(rs, 22)] = T7A - T7B; + R0[WS(rs, 54)] = T7A + T7B; + T7E = T7C - T7D; + T7H = FNMS(KP1_961570560, T7G, KP390180644 * T7F); + R0[WS(rs, 46)] = T7E - T7H; + R0[WS(rs, 14)] = T7E + T7H; + } + } + { + E T5q, T5U, T5Q, T5Y, T5x, T5V, T5J, T5X; + { + E T5m, T5p, T5M, T5P; + T5m = T5k - T5l; + T5p = FNMS(KP1_847759065, T5o, KP765366864 * T5n); + T5q = T5m + T5p; + T5U = T5m - T5p; + T5M = T5K + T5L; + T5P = T5N + T5O; + T5Q = T5M + T5P; + T5Y = T5P - T5M; + } + { + E T5t, T5w, T5B, T5I; + T5t = T5r + T5s; + T5w = T5u + T5v; + T5x = FNMS(KP1_111140466, T5w, KP1_662939224 * T5t); + T5V = FMA(KP1_111140466, T5t, KP1_662939224 * T5w); + T5B = T5z + T5A; + T5I = T5E + T5H; + T5J = T5B + T5I; + T5X = T5B - T5I; + } + { + E T5y, T5R, T60, T61; + T5y = T5q + T5x; + T5R = FNMS(KP580569354, T5Q, KP1_913880671 * T5J); + R0[WS(rs, 35)] = T5y - T5R; + R0[WS(rs, 3)] = T5y + T5R; + T60 = T5U + T5V; + T61 = FMA(KP1_763842528, T5X, KP942793473 * T5Y); + R0[WS(rs, 27)] = T60 - T61; + R0[WS(rs, 59)] = T60 + T61; + } + { + E T5S, T5T, T5W, T5Z; + T5S = T5q - T5x; + T5T = FMA(KP580569354, T5J, KP1_913880671 * T5Q); + R0[WS(rs, 19)] = T5S - T5T; + R0[WS(rs, 51)] = T5S + T5T; + T5W = T5U - T5V; + T5Z = FNMS(KP1_763842528, T5Y, KP942793473 * T5X); + R0[WS(rs, 43)] = T5W - T5Z; + R0[WS(rs, 11)] = T5W + T5Z; + } + } + { + E T64, T6i, T6e, T6m, T67, T6j, T6b, T6l; + { + E T62, T63, T6c, T6d; + T62 = T5k + T5l; + T63 = FMA(KP1_847759065, T5n, KP765366864 * T5o); + T64 = T62 - T63; + T6i = T62 + T63; + T6c = T5E - T5H; + T6d = T5O - T5N; + T6e = T6c + T6d; + T6m = T6d - T6c; + } + { + E T65, T66, T69, T6a; + T65 = T5r - T5s; + T66 = T5v - T5u; + T67 = FNMS(KP1_961570560, T66, KP390180644 * T65); + T6j = FMA(KP1_961570560, T65, KP390180644 * T66); + T69 = T5z - T5A; + T6a = T5L - T5K; + T6b = T69 + T6a; + T6l = T69 - T6a; + } + { + E T68, T6f, T6o, T6p; + T68 = T64 + T67; + T6f = FNMS(KP1_268786568, T6e, KP1_546020906 * T6b); + R0[WS(rs, 39)] = T68 - T6f; + R0[WS(rs, 7)] = T68 + T6f; + T6o = T6i + T6j; + T6p = FMA(KP1_990369453, T6l, KP196034280 * T6m); + R0[WS(rs, 31)] = T6o - T6p; + R0[WS(rs, 63)] = T6o + T6p; + } + { + E T6g, T6h, T6k, T6n; + T6g = T64 - T67; + T6h = FMA(KP1_268786568, T6b, KP1_546020906 * T6e); + R0[WS(rs, 23)] = T6g - T6h; + R0[WS(rs, 55)] = T6g + T6h; + T6k = T6i - T6j; + T6n = FNMS(KP1_990369453, T6m, KP196034280 * T6l); + R0[WS(rs, 47)] = T6k - T6n; + R0[WS(rs, 15)] = T6k + T6n; + } + } + { + E T8Z, Tb1, T9C, Tb2, Tbe, Tbq, Tbb, Tbp, TaX, Tbs, Tb5, Tbi, TaI, Tbt, Tb4; + E Tbl; + { + E T8F, T8Y, Tb9, Tba; + T8F = T8x + T8E; + T8Y = FNMS(KP390180644, T8X, KP1_961570560 * T8Q); + T8Z = T8F + T8Y; + Tb1 = T8F - T8Y; + { + E T9q, T9B, Tbc, Tbd; + T9q = T9a + T9p; + T9B = T9t + T9A; + T9C = FNMS(KP196034280, T9B, KP1_990369453 * T9q); + Tb2 = FMA(KP196034280, T9q, KP1_990369453 * T9B); + Tbc = T9a - T9p; + Tbd = T9A - T9t; + Tbe = FNMS(KP1_546020906, Tbd, KP1_268786568 * Tbc); + Tbq = FMA(KP1_546020906, Tbc, KP1_268786568 * Tbd); + } + Tb9 = T8x - T8E; + Tba = FMA(KP390180644, T8Q, KP1_961570560 * T8X); + Tbb = Tb9 - Tba; + Tbp = Tb9 + Tba; + { + E TaW, Tbg, TaL, Tbh, TaJ, TaK; + TaW = TaO + TaV; + Tbg = T9O - Ta3; + TaJ = FMA(KP195090322, Taf, KP980785280 * Tam); + TaK = FNMS(KP195090322, Tay, KP980785280 * TaF); + TaL = TaJ + TaK; + Tbh = TaK - TaJ; + TaX = TaL + TaW; + Tbs = Tbg - Tbh; + Tb5 = TaW - TaL; + Tbi = Tbg + Tbh; + } + { + E Ta4, Tbk, TaH, Tbj, Tan, TaG; + Ta4 = T9O + Ta3; + Tbk = TaV - TaO; + Tan = FNMS(KP195090322, Tam, KP980785280 * Taf); + TaG = FMA(KP980785280, Tay, KP195090322 * TaF); + TaH = Tan + TaG; + Tbj = Tan - TaG; + TaI = Ta4 + TaH; + Tbt = Tbk - Tbj; + Tb4 = Ta4 - TaH; + Tbl = Tbj + Tbk; + } + } + { + E T9D, TaY, Tbr, Tbu; + T9D = T8Z + T9C; + TaY = FNMS(KP098135348, TaX, KP1_997590912 * TaI); + R1[WS(rs, 32)] = T9D - TaY; + R1[0] = T9D + TaY; + Tbr = Tbp - Tbq; + Tbu = FNMS(KP1_883088130, Tbt, KP673779706 * Tbs); + R1[WS(rs, 44)] = Tbr - Tbu; + R1[WS(rs, 12)] = Tbr + Tbu; + } + { + E Tbv, Tbw, TaZ, Tb0; + Tbv = Tbp + Tbq; + Tbw = FMA(KP1_883088130, Tbs, KP673779706 * Tbt); + R1[WS(rs, 28)] = Tbv - Tbw; + R1[WS(rs, 60)] = Tbv + Tbw; + TaZ = T8Z - T9C; + Tb0 = FMA(KP098135348, TaI, KP1_997590912 * TaX); + R1[WS(rs, 16)] = TaZ - Tb0; + R1[WS(rs, 48)] = TaZ + Tb0; + } + { + E Tb3, Tb6, Tbf, Tbm; + Tb3 = Tb1 - Tb2; + Tb6 = FNMS(KP1_481902250, Tb5, KP1_343117909 * Tb4); + R1[WS(rs, 40)] = Tb3 - Tb6; + R1[WS(rs, 8)] = Tb3 + Tb6; + Tbf = Tbb + Tbe; + Tbm = FNMS(KP855110186, Tbl, KP1_807978586 * Tbi); + R1[WS(rs, 36)] = Tbf - Tbm; + R1[WS(rs, 4)] = Tbf + Tbm; + } + { + E Tbn, Tbo, Tb7, Tb8; + Tbn = Tbb - Tbe; + Tbo = FMA(KP855110186, Tbi, KP1_807978586 * Tbl); + R1[WS(rs, 20)] = Tbn - Tbo; + R1[WS(rs, 52)] = Tbn + Tbo; + Tb7 = Tb1 + Tb2; + Tb8 = FMA(KP1_481902250, Tb4, KP1_343117909 * Tb5); + R1[WS(rs, 24)] = Tb7 - Tb8; + R1[WS(rs, 56)] = Tb7 + Tb8; + } + } + { + E TcR, TdR, Tda, TdS, Te4, Teg, Te1, Tef, TdN, Tei, TdV, Te8, TdC, Tej, TdU; + E Teb; + { + E TcJ, TcQ, TdZ, Te0; + TcJ = TcF + TcI; + TcQ = FNMS(KP1_111140466, TcP, KP1_662939224 * TcM); + TcR = TcJ + TcQ; + TdR = TcJ - TcQ; + { + E Td2, Td9, Te2, Te3; + Td2 = TcU + Td1; + Td9 = Td5 + Td8; + Tda = FNMS(KP580569354, Td9, KP1_913880671 * Td2); + TdS = FMA(KP580569354, Td2, KP1_913880671 * Td9); + Te2 = TcU - Td1; + Te3 = Td8 - Td5; + Te4 = FNMS(KP1_763842528, Te3, KP942793473 * Te2); + Teg = FMA(KP1_763842528, Te2, KP942793473 * Te3); + } + TdZ = TcF - TcI; + Te0 = FMA(KP1_111140466, TcM, KP1_662939224 * TcP); + Te1 = TdZ - Te0; + Tef = TdZ + Te0; + { + E TdM, Te6, TdF, Te7, TdD, TdE; + TdM = TdI + TdL; + Te6 = Tde - Tdl; + TdD = FMA(KP555570233, Tdp, KP831469612 * Tds); + TdE = FNMS(KP555570233, Tdw, KP831469612 * Tdz); + TdF = TdD + TdE; + Te7 = TdE - TdD; + TdN = TdF + TdM; + Tei = Te6 - Te7; + TdV = TdM - TdF; + Te8 = Te6 + Te7; + } + { + E Tdm, Tea, TdB, Te9, Tdt, TdA; + Tdm = Tde + Tdl; + Tea = TdL - TdI; + Tdt = FNMS(KP555570233, Tds, KP831469612 * Tdp); + TdA = FMA(KP831469612, Tdw, KP555570233 * Tdz); + TdB = Tdt + TdA; + Te9 = Tdt - TdA; + TdC = Tdm + TdB; + Tej = Tea - Te9; + TdU = Tdm - TdB; + Teb = Te9 + Tea; + } + } + { + E Tdb, TdO, Teh, Tek; + Tdb = TcR + Tda; + TdO = FNMS(KP293460948, TdN, KP1_978353019 * TdC); + R1[WS(rs, 33)] = Tdb - TdO; + R1[WS(rs, 1)] = Tdb + TdO; + Teh = Tef - Teg; + Tek = FNMS(KP1_940062506, Tej, KP485960359 * Tei); + R1[WS(rs, 45)] = Teh - Tek; + R1[WS(rs, 13)] = Teh + Tek; + } + { + E Tel, Tem, TdP, TdQ; + Tel = Tef + Teg; + Tem = FMA(KP1_940062506, Tei, KP485960359 * Tej); + R1[WS(rs, 29)] = Tel - Tem; + R1[WS(rs, 61)] = Tel + Tem; + TdP = TcR - Tda; + TdQ = FMA(KP293460948, TdC, KP1_978353019 * TdN); + R1[WS(rs, 17)] = TdP - TdQ; + R1[WS(rs, 49)] = TdP + TdQ; + } + { + E TdT, TdW, Te5, Tec; + TdT = TdR - TdS; + TdW = FNMS(KP1_606415062, TdV, KP1_191398608 * TdU); + R1[WS(rs, 41)] = TdT - TdW; + R1[WS(rs, 9)] = TdT + TdW; + Te5 = Te1 + Te4; + Tec = FNMS(KP1_028205488, Teb, KP1_715457220 * Te8); + R1[WS(rs, 37)] = Te5 - Tec; + R1[WS(rs, 5)] = Te5 + Tec; + } + { + E Ted, Tee, TdX, TdY; + Ted = Te1 - Te4; + Tee = FMA(KP1_028205488, Te8, KP1_715457220 * Teb); + R1[WS(rs, 21)] = Ted - Tee; + R1[WS(rs, 53)] = Ted + Tee; + TdX = TdR + TdS; + TdY = FMA(KP1_606415062, TdU, KP1_191398608 * TdV); + R1[WS(rs, 25)] = TdX - TdY; + R1[WS(rs, 57)] = TdX + TdY; + } + } + { + E TbD, Tc7, TbK, Tc8, Tck, Tcw, Tch, Tcv, Tc3, Tcy, Tcb, Tco, TbW, Tcz, Tca; + E Tcr; + { + E Tbz, TbC, Tcf, Tcg; + Tbz = Tbx - Tby; + TbC = FNMS(KP1_662939224, TbB, KP1_111140466 * TbA); + TbD = Tbz + TbC; + Tc7 = Tbz - TbC; + { + E TbG, TbJ, Tci, Tcj; + TbG = TbE + TbF; + TbJ = TbH + TbI; + TbK = FNMS(KP942793473, TbJ, KP1_763842528 * TbG); + Tc8 = FMA(KP942793473, TbG, KP1_763842528 * TbJ); + Tci = TbE - TbF; + Tcj = TbI - TbH; + Tck = FNMS(KP1_913880671, Tcj, KP580569354 * Tci); + Tcw = FMA(KP1_913880671, Tci, KP580569354 * Tcj); + } + Tcf = Tbx + Tby; + Tcg = FMA(KP1_662939224, TbA, KP1_111140466 * TbB); + Tch = Tcf - Tcg; + Tcv = Tcf + Tcg; + { + E Tc2, Tcm, TbZ, Tcn, TbX, TbY; + Tc2 = Tc0 + Tc1; + Tcm = TbM - TbN; + TbX = FMA(KP831469612, TbP, KP555570233 * TbQ); + TbY = FNMS(KP831469612, TbS, KP555570233 * TbT); + TbZ = TbX + TbY; + Tcn = TbY - TbX; + Tc3 = TbZ + Tc2; + Tcy = Tcm - Tcn; + Tcb = Tc2 - TbZ; + Tco = Tcm + Tcn; + } + { + E TbO, Tcq, TbV, Tcp, TbR, TbU; + TbO = TbM + TbN; + Tcq = Tc1 - Tc0; + TbR = FNMS(KP831469612, TbQ, KP555570233 * TbP); + TbU = FMA(KP555570233, TbS, KP831469612 * TbT); + TbV = TbR + TbU; + Tcp = TbR - TbU; + TbW = TbO + TbV; + Tcz = Tcq - Tcp; + Tca = TbO - TbV; + Tcr = Tcp + Tcq; + } + } + { + E TbL, Tc4, Tcx, TcA; + TbL = TbD + TbK; + Tc4 = FNMS(KP485960359, Tc3, KP1_940062506 * TbW); + R1[WS(rs, 34)] = TbL - Tc4; + R1[WS(rs, 2)] = TbL + Tc4; + Tcx = Tcv - Tcw; + TcA = FNMS(KP1_978353019, Tcz, KP293460948 * Tcy); + R1[WS(rs, 46)] = Tcx - TcA; + R1[WS(rs, 14)] = Tcx + TcA; + } + { + E TcB, TcC, Tc5, Tc6; + TcB = Tcv + Tcw; + TcC = FMA(KP1_978353019, Tcy, KP293460948 * Tcz); + R1[WS(rs, 30)] = TcB - TcC; + R1[WS(rs, 62)] = TcB + TcC; + Tc5 = TbD - TbK; + Tc6 = FMA(KP485960359, TbW, KP1_940062506 * Tc3); + R1[WS(rs, 18)] = Tc5 - Tc6; + R1[WS(rs, 50)] = Tc5 + Tc6; + } + { + E Tc9, Tcc, Tcl, Tcs; + Tc9 = Tc7 - Tc8; + Tcc = FNMS(KP1_715457220, Tcb, KP1_028205488 * Tca); + R1[WS(rs, 42)] = Tc9 - Tcc; + R1[WS(rs, 10)] = Tc9 + Tcc; + Tcl = Tch + Tck; + Tcs = FNMS(KP1_191398608, Tcr, KP1_606415062 * Tco); + R1[WS(rs, 38)] = Tcl - Tcs; + R1[WS(rs, 6)] = Tcl + Tcs; + } + { + E Tct, Tcu, Tcd, Tce; + Tct = Tch - Tck; + Tcu = FMA(KP1_191398608, Tco, KP1_606415062 * Tcr); + R1[WS(rs, 22)] = Tct - Tcu; + R1[WS(rs, 54)] = Tct + Tcu; + Tcd = Tc7 + Tc8; + Tce = FMA(KP1_715457220, Tca, KP1_028205488 * Tcb); + R1[WS(rs, 26)] = Tcd - Tce; + R1[WS(rs, 58)] = Tcd + Tce; + } + } + { + E Tet, TeX, TeA, TeY, Tfa, Tfm, Tf7, Tfl, TeT, Tfo, Tf1, Tfe, TeM, Tfp, Tf0; + E Tfh; + { + E Tep, Tes, Tf5, Tf6; + Tep = Ten - Teo; + Tes = FNMS(KP1_961570560, Ter, KP390180644 * Teq); + Tet = Tep + Tes; + TeX = Tep - Tes; + { + E Tew, Tez, Tf8, Tf9; + Tew = Teu - Tev; + Tez = Tex + Tey; + TeA = FNMS(KP1_268786568, Tez, KP1_546020906 * Tew); + TeY = FMA(KP1_268786568, Tew, KP1_546020906 * Tez); + Tf8 = Teu + Tev; + Tf9 = Tey - Tex; + Tfa = FNMS(KP1_990369453, Tf9, KP196034280 * Tf8); + Tfm = FMA(KP1_990369453, Tf8, KP196034280 * Tf9); + } + Tf5 = Ten + Teo; + Tf6 = FMA(KP1_961570560, Teq, KP390180644 * Ter); + Tf7 = Tf5 - Tf6; + Tfl = Tf5 + Tf6; + { + E TeS, Tfc, TeP, Tfd, TeN, TeO; + TeS = TeQ + TeR; + Tfc = TeC + TeD; + TeN = FMA(KP980785280, TeF, KP195090322 * TeG); + TeO = FMA(KP980785280, TeI, KP195090322 * TeJ); + TeP = TeN - TeO; + Tfd = TeN + TeO; + TeT = TeP + TeS; + Tfo = Tfc + Tfd; + Tf1 = TeS - TeP; + Tfe = Tfc - Tfd; + } + { + E TeE, Tfg, TeL, Tff, TeH, TeK; + TeE = TeC - TeD; + Tfg = TeR - TeQ; + TeH = FNMS(KP980785280, TeG, KP195090322 * TeF); + TeK = FNMS(KP980785280, TeJ, KP195090322 * TeI); + TeL = TeH + TeK; + Tff = TeH - TeK; + TeM = TeE + TeL; + Tfp = Tfg - Tff; + Tf0 = TeE - TeL; + Tfh = Tff + Tfg; + } + } + { + E TeB, TeU, Tfn, Tfq; + TeB = Tet + TeA; + TeU = FNMS(KP673779706, TeT, KP1_883088130 * TeM); + R1[WS(rs, 35)] = TeB - TeU; + R1[WS(rs, 3)] = TeB + TeU; + Tfn = Tfl - Tfm; + Tfq = FNMS(KP1_997590912, Tfp, KP098135348 * Tfo); + R1[WS(rs, 47)] = Tfn - Tfq; + R1[WS(rs, 15)] = Tfn + Tfq; + } + { + E Tfr, Tfs, TeV, TeW; + Tfr = Tfl + Tfm; + Tfs = FMA(KP1_997590912, Tfo, KP098135348 * Tfp); + R1[WS(rs, 31)] = Tfr - Tfs; + R1[WS(rs, 63)] = Tfr + Tfs; + TeV = Tet - TeA; + TeW = FMA(KP673779706, TeM, KP1_883088130 * TeT); + R1[WS(rs, 19)] = TeV - TeW; + R1[WS(rs, 51)] = TeV + TeW; + } + { + E TeZ, Tf2, Tfb, Tfi; + TeZ = TeX - TeY; + Tf2 = FNMS(KP1_807978586, Tf1, KP855110186 * Tf0); + R1[WS(rs, 43)] = TeZ - Tf2; + R1[WS(rs, 11)] = TeZ + Tf2; + Tfb = Tf7 + Tfa; + Tfi = FNMS(KP1_343117909, Tfh, KP1_481902250 * Tfe); + R1[WS(rs, 39)] = Tfb - Tfi; + R1[WS(rs, 7)] = Tfb + Tfi; + } + { + E Tfj, Tfk, Tf3, Tf4; + Tfj = Tf7 - Tfa; + Tfk = FMA(KP1_343117909, Tfe, KP1_481902250 * Tfh); + R1[WS(rs, 23)] = Tfj - Tfk; + R1[WS(rs, 55)] = Tfj + Tfk; + Tf3 = TeX + TeY; + Tf4 = FMA(KP1_807978586, Tf0, KP855110186 * Tf1); + R1[WS(rs, 27)] = Tf3 - Tf4; + R1[WS(rs, 59)] = Tf3 + Tf4; + } + } + } + } +} + +static const kr2c_desc desc = { 128, "r2cb_128", {812, 198, 144, 0}, &GENUS }; + +void X(codelet_r2cb_128) (planner *p) { + X(kr2c_register) (p, r2cb_128, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_13.c new file mode 100644 index 000000000..8e7926657 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_13.c @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 13 -name r2cb_13 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 76 FP additions, 58 FP multiplications, + * (or, 18 additions, 0 multiplications, 58 fused multiply/add), + * 63 stack variables, 26 constants, and 26 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_13(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP875502302, +0.875502302409147941146295545768755143177842006); + DK(KP1_040057143, +1.040057143777729238234261000998465604986476278); + DK(KP968287244, +0.968287244361984016049539446938120421179794516); + DK(KP1_150281458, +1.150281458948006242736771094910906776922003215); + DK(KP1_200954543, +1.200954543865330565851538506669526018704025697); + DK(KP769338817, +0.769338817572980603471413688209101117038278899); + DK(KP686558370, +0.686558370781754340655719594850823015421401653); + DK(KP226109445, +0.226109445035782405468510155372505010481906348); + DK(KP1_033041561, +1.033041561246979445681802577138034271410067244); + DK(KP581704778, +0.581704778510515730456870384989698884939833902); + DK(KP1_007074065, +1.007074065727533254493747707736933954186697125); + DK(KP600925212, +0.600925212577331548853203544578415991041882762); + DK(KP859542535, +0.859542535098774820163672132761689612766401925); + DK(KP503537032, +0.503537032863766627246873853868466977093348562); + DK(KP522026385, +0.522026385161275033714027226654165028300441940); + DK(KP957805992, +0.957805992594665126462521754605754580515587217); + DK(KP853480001, +0.853480001859823990758994934970528322872359049); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP514918778, +0.514918778086315755491789696138117261566051239); + DK(KP301479260, +0.301479260047709873958013540496673347309208464); + DK(KP166666666, +0.166666666666666666666666666666666666666666667); + DK(KP612264650, +0.612264650376756543746494474777125408779395514); + DK(KP302775637, +0.302775637731994646559610633735247973125648287); + DK(KP038632954, +0.038632954644348171955506895830342264440241080); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(52, rs), MAKE_VOLATILE_STRIDE(52, csr), MAKE_VOLATILE_STRIDE(52, csi)) { + E TG, TU, TN, T16, TJ, TV, T1, Tp, Tc, Td, Tg, Tj, Tk, Tm, Tn; + E To; + { + E Ts, Tv, Tw, TE, TB, TC, Tz, TD, TA, TF; + { + E Tt, Tu, Tx, Ty; + Ts = Ci[WS(csi, 5)]; + Tt = Ci[WS(csi, 2)]; + Tu = Ci[WS(csi, 6)]; + Tv = Tt + Tu; + Tw = FNMS(KP500000000, Tv, Ts); + TE = Tu - Tt; + TB = Ci[WS(csi, 1)]; + Tx = Ci[WS(csi, 3)]; + Ty = Ci[WS(csi, 4)]; + TC = Tx - Ty; + Tz = Tx + Ty; + TD = FNMS(KP500000000, TC, TB); + } + TA = FMA(KP866025403, Tz, Tw); + TF = FMA(KP866025403, TE, TD); + TG = FNMS(KP038632954, TF, TA); + TU = FMA(KP038632954, TA, TF); + { + E TL, TM, TH, TI; + TL = Ts + Tv; + TM = TB + TC; + TN = FMA(KP302775637, TM, TL); + T16 = FNMS(KP302775637, TL, TM); + TH = FNMS(KP866025403, Tz, Tw); + TI = FNMS(KP866025403, TE, TD); + TJ = FNMS(KP612264650, TI, TH); + TV = FMA(KP612264650, TH, TI); + } + } + { + E Tb, Ti, Tf, T6, Th, Te; + T1 = Cr[0]; + { + E T7, T8, T9, Ta; + T7 = Cr[WS(csr, 5)]; + T8 = Cr[WS(csr, 2)]; + T9 = Cr[WS(csr, 6)]; + Ta = T8 + T9; + Tb = T7 + Ta; + Ti = FMS(KP500000000, Ta, T7); + Tf = T8 - T9; + } + { + E T2, T3, T4, T5; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[WS(csr, 3)]; + T4 = Cr[WS(csr, 4)]; + T5 = T3 + T4; + T6 = T2 + T5; + Th = FNMS(KP500000000, T5, T2); + Te = T3 - T4; + } + Tp = T6 - Tb; + Tc = T6 + Tb; + Td = FNMS(KP166666666, Tc, T1); + Tg = Te + Tf; + Tj = Th - Ti; + Tk = FMA(KP301479260, Tj, Tg); + Tm = Th + Ti; + Tn = Te - Tf; + To = FNMS(KP514918778, Tn, Tm); + } + R0[0] = FMA(KP2_000000000, Tc, T1); + { + E TW, T14, TO, TS, T18, T1e, TR, T13, Tr, T1d, TZ, T19; + { + E TK, T17, TP, TQ; + TW = FMA(KP853480001, TV, TU); + T14 = FMA(KP853480001, TJ, TG); + TK = FNMS(KP853480001, TJ, TG); + TO = FMA(KP957805992, TN, TK); + TS = FNMS(KP522026385, TK, TN); + T17 = FNMS(KP853480001, TV, TU); + T18 = FNMS(KP522026385, T17, T16); + T1e = FMA(KP957805992, T16, T17); + TP = FNMS(KP503537032, Tk, Td); + TQ = FNMS(KP859542535, To, Tp); + TR = FMA(KP600925212, TQ, TP); + T13 = FNMS(KP600925212, TQ, TP); + { + E Tl, Tq, TX, TY; + Tl = FMA(KP1_007074065, Tk, Td); + Tq = FMA(KP581704778, Tp, To); + Tr = FMA(KP1_033041561, Tq, Tl); + T1d = FNMS(KP1_033041561, Tq, Tl); + TX = FNMS(KP226109445, Tg, Tj); + TY = FMA(KP686558370, Tm, Tn); + TZ = FNMS(KP769338817, TY, TX); + T19 = FMA(KP769338817, TY, TX); + } + } + R1[0] = FNMS(KP1_200954543, TO, Tr); + R1[WS(rs, 2)] = FNMS(KP1_200954543, T1e, T1d); + R0[WS(rs, 4)] = FMA(KP1_200954543, T1e, T1d); + R0[WS(rs, 6)] = FMA(KP1_200954543, TO, Tr); + { + E TT, T10, T15, T1a; + TT = FNMS(KP1_150281458, TS, TR); + T10 = FNMS(KP968287244, TZ, TW); + R1[WS(rs, 1)] = FNMS(KP1_040057143, T10, TT); + R1[WS(rs, 4)] = FMA(KP1_040057143, T10, TT); + T15 = FMA(KP1_040057143, T14, T13); + T1a = FNMS(KP875502302, T19, T18); + R0[WS(rs, 1)] = FNMS(KP1_150281458, T1a, T15); + R1[WS(rs, 3)] = FMA(KP1_150281458, T1a, T15); + } + { + E T1b, T1c, T11, T12; + T1b = FNMS(KP1_040057143, T14, T13); + T1c = FMA(KP875502302, T19, T18); + R0[WS(rs, 3)] = FNMS(KP1_150281458, T1c, T1b); + R1[WS(rs, 5)] = FMA(KP1_150281458, T1c, T1b); + T11 = FMA(KP1_150281458, TS, TR); + T12 = FMA(KP968287244, TZ, TW); + R0[WS(rs, 2)] = FNMS(KP1_040057143, T12, T11); + R0[WS(rs, 5)] = FMA(KP1_040057143, T12, T11); + } + } + } + } +} + +static const kr2c_desc desc = { 13, "r2cb_13", {18, 0, 58, 0}, &GENUS }; + +void X(codelet_r2cb_13) (planner *p) { + X(kr2c_register) (p, r2cb_13, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 13 -name r2cb_13 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 76 FP additions, 35 FP multiplications, + * (or, 56 additions, 15 multiplications, 20 fused multiply/add), + * 56 stack variables, 19 constants, and 26 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_13(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_007074065, +1.007074065727533254493747707736933954186697125); + DK(KP227708958, +0.227708958111581597949308691735310621069285120); + DK(KP531932498, +0.531932498429674575175042127684371897596660533); + DK(KP774781170, +0.774781170935234584261351932853525703557550433); + DK(KP265966249, +0.265966249214837287587521063842185948798330267); + DK(KP516520780, +0.516520780623489722840901288569017135705033622); + DK(KP151805972, +0.151805972074387731966205794490207080712856746); + DK(KP503537032, +0.503537032863766627246873853868466977093348562); + DK(KP166666666, +0.166666666666666666666666666666666666666666667); + DK(KP600925212, +0.600925212577331548853203544578415991041882762); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP256247671, +0.256247671582936600958684654061725059144125175); + DK(KP156891391, +0.156891391051584611046832726756003269660212636); + DK(KP348277202, +0.348277202304271810011321589858529485233929352); + DK(KP1_150281458, +1.150281458948006242736771094910906776922003215); + DK(KP300238635, +0.300238635966332641462884626667381504676006424); + DK(KP011599105, +0.011599105605768290721655456654083252189827041); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(52, rs), MAKE_VOLATILE_STRIDE(52, csr), MAKE_VOLATILE_STRIDE(52, csi)) { + E TG, TS, TR, T15, TJ, TT, T1, Tm, Tc, Td, Tg, Tj, Tk, Tn, To; + E Tp; + { + E Ts, Tv, Tw, TE, TC, TB, Tz, TD, TA, TF; + { + E Tt, Tu, Tx, Ty; + Ts = Ci[WS(csi, 1)]; + Tt = Ci[WS(csi, 3)]; + Tu = Ci[WS(csi, 4)]; + Tv = Tt - Tu; + Tw = FMS(KP2_000000000, Ts, Tv); + TE = KP1_732050807 * (Tt + Tu); + TC = Ci[WS(csi, 5)]; + Tx = Ci[WS(csi, 6)]; + Ty = Ci[WS(csi, 2)]; + TB = Tx + Ty; + Tz = KP1_732050807 * (Tx - Ty); + TD = FNMS(KP2_000000000, TC, TB); + } + TA = Tw + Tz; + TF = TD - TE; + TG = FMA(KP011599105, TA, KP300238635 * TF); + TS = FNMS(KP011599105, TF, KP300238635 * TA); + { + E TP, TQ, TH, TI; + TP = Ts + Tv; + TQ = TB + TC; + TR = FNMS(KP348277202, TQ, KP1_150281458 * TP); + T15 = FMA(KP348277202, TP, KP1_150281458 * TQ); + TH = Tw - Tz; + TI = TE + TD; + TJ = FMA(KP156891391, TH, KP256247671 * TI); + TT = FNMS(KP256247671, TH, KP156891391 * TI); + } + } + { + E Tb, Ti, Tf, T6, Th, Te; + T1 = Cr[0]; + { + E T7, T8, T9, Ta; + T7 = Cr[WS(csr, 5)]; + T8 = Cr[WS(csr, 2)]; + T9 = Cr[WS(csr, 6)]; + Ta = T8 + T9; + Tb = T7 + Ta; + Ti = FNMS(KP500000000, Ta, T7); + Tf = T8 - T9; + } + { + E T2, T3, T4, T5; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[WS(csr, 3)]; + T4 = Cr[WS(csr, 4)]; + T5 = T3 + T4; + T6 = T2 + T5; + Th = FNMS(KP500000000, T5, T2); + Te = T3 - T4; + } + Tm = KP600925212 * (T6 - Tb); + Tc = T6 + Tb; + Td = FNMS(KP166666666, Tc, T1); + Tg = Te + Tf; + Tj = Th + Ti; + Tk = FMA(KP503537032, Tg, KP151805972 * Tj); + Tn = Th - Ti; + To = Te - Tf; + Tp = FNMS(KP265966249, To, KP516520780 * Tn); + } + R0[0] = FMA(KP2_000000000, Tc, T1); + { + E TK, T1b, TV, T12, T16, T18, TO, T1a, Tr, T17, T11, T13; + { + E TU, T14, TM, TN; + TK = KP1_732050807 * (TG + TJ); + T1b = KP1_732050807 * (TS - TT); + TU = TS + TT; + TV = TR - TU; + T12 = FMA(KP2_000000000, TU, TR); + T14 = TG - TJ; + T16 = FMS(KP2_000000000, T14, T15); + T18 = T14 + T15; + TM = FMA(KP774781170, To, KP531932498 * Tn); + TN = FNMS(KP1_007074065, Tj, KP227708958 * Tg); + TO = TM - TN; + T1a = TM + TN; + { + E Tl, Tq, TZ, T10; + Tl = Td - Tk; + Tq = Tm - Tp; + Tr = Tl - Tq; + T17 = Tq + Tl; + TZ = FMA(KP2_000000000, Tk, Td); + T10 = FMA(KP2_000000000, Tp, Tm); + T11 = TZ - T10; + T13 = T10 + TZ; + } + } + R1[WS(rs, 2)] = T11 - T12; + R0[WS(rs, 6)] = T13 - T16; + R1[0] = T13 + T16; + R0[WS(rs, 4)] = T11 + T12; + { + E TL, TW, T19, T1c; + TL = Tr - TK; + TW = TO - TV; + R1[WS(rs, 3)] = TL - TW; + R0[WS(rs, 1)] = TL + TW; + T19 = T17 - T18; + T1c = T1a + T1b; + R1[WS(rs, 1)] = T19 - T1c; + R1[WS(rs, 4)] = T1c + T19; + } + { + E T1d, T1e, TX, TY; + T1d = T1a - T1b; + T1e = T17 + T18; + R0[WS(rs, 2)] = T1d + T1e; + R0[WS(rs, 5)] = T1e - T1d; + TX = Tr + TK; + TY = TO + TV; + R0[WS(rs, 3)] = TX - TY; + R1[WS(rs, 5)] = TX + TY; + } + } + } + } +} + +static const kr2c_desc desc = { 13, "r2cb_13", {56, 15, 20, 0}, &GENUS }; + +void X(codelet_r2cb_13) (planner *p) { + X(kr2c_register) (p, r2cb_13, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_14.c new file mode 100644 index 000000000..ba21a84bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_14.c @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 14 -name r2cb_14 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 62 FP additions, 44 FP multiplications, + * (or, 18 additions, 0 multiplications, 44 fused multiply/add), + * 46 stack variables, 7 constants, and 28 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_14(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_949855824, +1.949855824363647214036263365987862434465571601); + DK(KP1_801937735, +1.801937735804838252472204639014890102331838324); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(56, rs), MAKE_VOLATILE_STRIDE(56, csr), MAKE_VOLATILE_STRIDE(56, csi)) { + E T3, Te, To, TK, Tu, TM, Tr, TL, Tv, TA, TX, TS, TN, TF, T6; + E Tf, Tc, Th, T9, Tg, Tj, Tx, TU, TP, TH, TC, T1, T2, Td, Ti; + T1 = Cr[0]; + T2 = Cr[WS(csr, 7)]; + T3 = T1 - T2; + Te = T1 + T2; + { + E Tm, Tn, T4, T5; + Tm = Ci[WS(csi, 4)]; + Tn = Ci[WS(csi, 3)]; + To = Tm - Tn; + TK = Tm + Tn; + { + E Ts, Tt, Tp, Tq; + Ts = Ci[WS(csi, 6)]; + Tt = Ci[WS(csi, 1)]; + Tu = Ts - Tt; + TM = Ts + Tt; + Tp = Ci[WS(csi, 2)]; + Tq = Ci[WS(csi, 5)]; + Tr = Tp - Tq; + TL = Tp + Tq; + } + Tv = FMA(KP554958132, Tu, Tr); + TA = FMA(KP554958132, To, Tu); + TX = FNMS(KP554958132, TL, TK); + TS = FMA(KP554958132, TK, TM); + TN = FMA(KP554958132, TM, TL); + TF = FNMS(KP554958132, Tr, To); + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 5)]; + T6 = T4 - T5; + Tf = T4 + T5; + { + E Ta, Tb, T7, T8; + Ta = Cr[WS(csr, 6)]; + Tb = Cr[WS(csr, 1)]; + Tc = Ta - Tb; + Th = Ta + Tb; + T7 = Cr[WS(csr, 4)]; + T8 = Cr[WS(csr, 3)]; + T9 = T7 - T8; + Tg = T7 + T8; + } + Tj = FNMS(KP356895867, Tg, Tf); + Tx = FNMS(KP356895867, Tf, Th); + TU = FNMS(KP356895867, Tc, T9); + TP = FNMS(KP356895867, T6, Tc); + TH = FNMS(KP356895867, T9, T6); + TC = FNMS(KP356895867, Th, Tg); + } + Td = T6 + T9 + Tc; + R1[WS(rs, 3)] = FMA(KP2_000000000, Td, T3); + Ti = Tf + Tg + Th; + R0[0] = FMA(KP2_000000000, Ti, Te); + { + E Tw, Tl, Tk, TY, TW, TV; + Tw = FMA(KP801937735, Tv, To); + Tk = FNMS(KP692021471, Tj, Th); + Tl = FNMS(KP1_801937735, Tk, Te); + R0[WS(rs, 4)] = FNMS(KP1_949855824, Tw, Tl); + R0[WS(rs, 3)] = FMA(KP1_949855824, Tw, Tl); + TY = FNMS(KP801937735, TX, TM); + TV = FNMS(KP692021471, TU, T6); + TW = FNMS(KP1_801937735, TV, T3); + R1[WS(rs, 1)] = FNMS(KP1_949855824, TY, TW); + R1[WS(rs, 5)] = FMA(KP1_949855824, TY, TW); + } + { + E TB, Tz, Ty, TO, TJ, TI; + TB = FNMS(KP801937735, TA, Tr); + Ty = FNMS(KP692021471, Tx, Tg); + Tz = FNMS(KP1_801937735, Ty, Te); + R0[WS(rs, 1)] = FNMS(KP1_949855824, TB, Tz); + R0[WS(rs, 6)] = FMA(KP1_949855824, TB, Tz); + TO = FMA(KP801937735, TN, TK); + TI = FNMS(KP692021471, TH, Tc); + TJ = FNMS(KP1_801937735, TI, T3); + R1[0] = FNMS(KP1_949855824, TO, TJ); + R1[WS(rs, 6)] = FMA(KP1_949855824, TO, TJ); + } + { + E TT, TR, TQ, TG, TE, TD; + TT = FNMS(KP801937735, TS, TL); + TQ = FNMS(KP692021471, TP, T9); + TR = FNMS(KP1_801937735, TQ, T3); + R1[WS(rs, 4)] = FNMS(KP1_949855824, TT, TR); + R1[WS(rs, 2)] = FMA(KP1_949855824, TT, TR); + TG = FNMS(KP801937735, TF, Tu); + TD = FNMS(KP692021471, TC, Tf); + TE = FNMS(KP1_801937735, TD, Te); + R0[WS(rs, 5)] = FNMS(KP1_949855824, TG, TE); + R0[WS(rs, 2)] = FMA(KP1_949855824, TG, TE); + } + } + } +} + +static const kr2c_desc desc = { 14, "r2cb_14", {18, 0, 44, 0}, &GENUS }; + +void X(codelet_r2cb_14) (planner *p) { + X(kr2c_register) (p, r2cb_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 14 -name r2cb_14 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 62 FP additions, 38 FP multiplications, + * (or, 36 additions, 12 multiplications, 26 fused multiply/add), + * 28 stack variables, 7 constants, and 28 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_14(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_801937735, +1.801937735804838252472204639014890102331838324); + DK(KP445041867, +0.445041867912628808577805128993589518932711138); + DK(KP1_246979603, +1.246979603717467061050009768008479621264549462); + DK(KP867767478, +0.867767478235116240951536665696717509219981456); + DK(KP1_949855824, +1.949855824363647214036263365987862434465571601); + DK(KP1_563662964, +1.563662964936059617416889053348115500464669037); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(56, rs), MAKE_VOLATILE_STRIDE(56, csr), MAKE_VOLATILE_STRIDE(56, csi)) { + E T3, Td, T6, Te, Tq, Tz, Tn, Ty, Tc, Tg, Tk, Tx, T9, Tf, T1; + E T2; + T1 = Cr[0]; + T2 = Cr[WS(csr, 7)]; + T3 = T1 - T2; + Td = T1 + T2; + { + E T4, T5, To, Tp; + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 5)]; + T6 = T4 - T5; + Te = T4 + T5; + To = Ci[WS(csi, 2)]; + Tp = Ci[WS(csi, 5)]; + Tq = To - Tp; + Tz = To + Tp; + } + { + E Tl, Tm, Ta, Tb; + Tl = Ci[WS(csi, 6)]; + Tm = Ci[WS(csi, 1)]; + Tn = Tl - Tm; + Ty = Tl + Tm; + Ta = Cr[WS(csr, 6)]; + Tb = Cr[WS(csr, 1)]; + Tc = Ta - Tb; + Tg = Ta + Tb; + } + { + E Ti, Tj, T7, T8; + Ti = Ci[WS(csi, 4)]; + Tj = Ci[WS(csi, 3)]; + Tk = Ti - Tj; + Tx = Ti + Tj; + T7 = Cr[WS(csr, 4)]; + T8 = Cr[WS(csr, 3)]; + T9 = T7 - T8; + Tf = T7 + T8; + } + R1[WS(rs, 3)] = FMA(KP2_000000000, T6 + T9 + Tc, T3); + R0[0] = FMA(KP2_000000000, Te + Tf + Tg, Td); + { + E Tr, Th, TE, TD; + Tr = FNMS(KP1_949855824, Tn, KP1_563662964 * Tk) - (KP867767478 * Tq); + Th = FMA(KP1_246979603, Tf, Td) + FNMA(KP445041867, Tg, KP1_801937735 * Te); + R0[WS(rs, 2)] = Th - Tr; + R0[WS(rs, 5)] = Th + Tr; + TE = FMA(KP867767478, Tx, KP1_563662964 * Ty) - (KP1_949855824 * Tz); + TD = FMA(KP1_246979603, Tc, T3) + FNMA(KP1_801937735, T9, KP445041867 * T6); + R1[WS(rs, 2)] = TD - TE; + R1[WS(rs, 4)] = TD + TE; + } + { + E Tt, Ts, TA, Tw; + Tt = FMA(KP867767478, Tk, KP1_563662964 * Tn) - (KP1_949855824 * Tq); + Ts = FMA(KP1_246979603, Tg, Td) + FNMA(KP1_801937735, Tf, KP445041867 * Te); + R0[WS(rs, 6)] = Ts - Tt; + R0[WS(rs, 1)] = Ts + Tt; + TA = FNMS(KP1_949855824, Ty, KP1_563662964 * Tx) - (KP867767478 * Tz); + Tw = FMA(KP1_246979603, T9, T3) + FNMA(KP445041867, Tc, KP1_801937735 * T6); + R1[WS(rs, 5)] = Tw - TA; + R1[WS(rs, 1)] = Tw + TA; + } + { + E TC, TB, Tv, Tu; + TC = FMA(KP1_563662964, Tz, KP1_949855824 * Tx) + (KP867767478 * Ty); + TB = FMA(KP1_246979603, T6, T3) + FNMA(KP1_801937735, Tc, KP445041867 * T9); + R1[0] = TB - TC; + R1[WS(rs, 6)] = TB + TC; + Tv = FMA(KP1_563662964, Tq, KP1_949855824 * Tk) + (KP867767478 * Tn); + Tu = FMA(KP1_246979603, Te, Td) + FNMA(KP1_801937735, Tg, KP445041867 * Tf); + R0[WS(rs, 4)] = Tu - Tv; + R0[WS(rs, 3)] = Tu + Tv; + } + } + } +} + +static const kr2c_desc desc = { 14, "r2cb_14", {36, 12, 26, 0}, &GENUS }; + +void X(codelet_r2cb_14) (planner *p) { + X(kr2c_register) (p, r2cb_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_15.c new file mode 100644 index 000000000..551633a00 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_15.c @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 15 -name r2cb_15 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 64 FP additions, 43 FP multiplications, + * (or, 21 additions, 0 multiplications, 43 fused multiply/add), + * 46 stack variables, 9 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E T3, Tt, Th, TC, TY, TZ, TD, TH, TI, Tm, Tu, Tr, Tv, T8, Td; + E Te; + { + E Tg, T1, T2, Tf; + Tg = Ci[WS(csi, 5)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 5)]; + Tf = T1 - T2; + T3 = FMA(KP2_000000000, T2, T1); + Tt = FNMS(KP1_732050807, Tg, Tf); + Th = FMA(KP1_732050807, Tg, Tf); + } + { + E T4, TA, T9, TF, T5, T6, T7, Ta, Tb, Tc, Tq, TG, Tl, TB, Ti; + E Tn; + T4 = Cr[WS(csr, 3)]; + TA = Ci[WS(csi, 3)]; + T9 = Cr[WS(csr, 6)]; + TF = Ci[WS(csi, 6)]; + T5 = Cr[WS(csr, 7)]; + T6 = Cr[WS(csr, 2)]; + T7 = T5 + T6; + Ta = Cr[WS(csr, 4)]; + Tb = Cr[WS(csr, 1)]; + Tc = Ta + Tb; + { + E To, Tp, Tj, Tk; + To = Ci[WS(csi, 4)]; + Tp = Ci[WS(csi, 1)]; + Tq = To + Tp; + TG = Tp - To; + Tj = Ci[WS(csi, 7)]; + Tk = Ci[WS(csi, 2)]; + Tl = Tj - Tk; + TB = Tj + Tk; + } + TC = FMA(KP500000000, TB, TA); + TY = TG + TF; + TZ = TA - TB; + TD = T5 - T6; + TH = FNMS(KP500000000, TG, TF); + TI = Ta - Tb; + Ti = FNMS(KP2_000000000, T4, T7); + Tm = FMA(KP1_732050807, Tl, Ti); + Tu = FNMS(KP1_732050807, Tl, Ti); + Tn = FNMS(KP2_000000000, T9, Tc); + Tr = FMA(KP1_732050807, Tq, Tn); + Tv = FNMS(KP1_732050807, Tq, Tn); + T8 = T4 + T7; + Td = T9 + Tc; + Te = T8 + Td; + } + R0[0] = FMA(KP2_000000000, Te, T3); + { + E T10, T12, TX, T11, TV, TW; + T10 = FNMS(KP618033988, TZ, TY); + T12 = FMA(KP618033988, TY, TZ); + TV = FNMS(KP500000000, Te, T3); + TW = T8 - Td; + TX = FNMS(KP1_118033988, TW, TV); + T11 = FMA(KP1_118033988, TW, TV); + R1[WS(rs, 1)] = FNMS(KP1_902113032, T10, TX); + R1[WS(rs, 4)] = FMA(KP1_902113032, T12, T11); + R0[WS(rs, 6)] = FMA(KP1_902113032, T10, TX); + R0[WS(rs, 3)] = FNMS(KP1_902113032, T12, T11); + } + { + E TO, Ts, TN, TS, TU, TQ, TR, TT, TP; + TO = Tr - Tm; + Ts = Tm + Tr; + TN = FMA(KP250000000, Ts, Th); + TQ = FNMS(KP866025403, TI, TH); + TR = FNMS(KP866025403, TD, TC); + TS = FNMS(KP618033988, TR, TQ); + TU = FMA(KP618033988, TQ, TR); + R1[WS(rs, 2)] = Th - Ts; + TT = FMA(KP559016994, TO, TN); + R1[WS(rs, 5)] = FNMS(KP1_902113032, TU, TT); + R0[WS(rs, 7)] = FMA(KP1_902113032, TU, TT); + TP = FNMS(KP559016994, TO, TN); + R0[WS(rs, 4)] = FNMS(KP1_902113032, TS, TP); + R0[WS(rs, 1)] = FMA(KP1_902113032, TS, TP); + } + { + E Ty, Tw, Tx, TK, TM, TE, TJ, TL, Tz; + Ty = Tv - Tu; + Tw = Tu + Tv; + Tx = FMA(KP250000000, Tw, Tt); + TE = FMA(KP866025403, TD, TC); + TJ = FMA(KP866025403, TI, TH); + TK = FMA(KP618033988, TJ, TE); + TM = FNMS(KP618033988, TE, TJ); + R0[WS(rs, 5)] = Tt - Tw; + TL = FNMS(KP559016994, Ty, Tx); + R1[WS(rs, 6)] = FNMS(KP1_902113032, TM, TL); + R1[WS(rs, 3)] = FMA(KP1_902113032, TM, TL); + Tz = FMA(KP559016994, Ty, Tx); + R1[0] = FNMS(KP1_902113032, TK, Tz); + R0[WS(rs, 2)] = FMA(KP1_902113032, TK, Tz); + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cb_15", {21, 0, 43, 0}, &GENUS }; + +void X(codelet_r2cb_15) (planner *p) { + X(kr2c_register) (p, r2cb_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 15 -name r2cb_15 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 64 FP additions, 31 FP multiplications, + * (or, 47 additions, 14 multiplications, 17 fused multiply/add), + * 44 stack variables, 7 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E T3, Tu, Ti, TB, TZ, T10, TE, TG, TJ, Tn, Tv, Ts, Tw, T8, Td; + E Te; + { + E Th, T1, T2, Tf, Tg; + Tg = Ci[WS(csi, 5)]; + Th = KP1_732050807 * Tg; + T1 = Cr[0]; + T2 = Cr[WS(csr, 5)]; + Tf = T1 - T2; + T3 = FMA(KP2_000000000, T2, T1); + Tu = Tf - Th; + Ti = Tf + Th; + } + { + E T4, TD, T9, TI, T5, T6, T7, Ta, Tb, Tc, Tr, TH, Tm, TC, Tj; + E To; + T4 = Cr[WS(csr, 3)]; + TD = Ci[WS(csi, 3)]; + T9 = Cr[WS(csr, 6)]; + TI = Ci[WS(csi, 6)]; + T5 = Cr[WS(csr, 7)]; + T6 = Cr[WS(csr, 2)]; + T7 = T5 + T6; + Ta = Cr[WS(csr, 4)]; + Tb = Cr[WS(csr, 1)]; + Tc = Ta + Tb; + { + E Tp, Tq, Tk, Tl; + Tp = Ci[WS(csi, 4)]; + Tq = Ci[WS(csi, 1)]; + Tr = KP866025403 * (Tp + Tq); + TH = Tp - Tq; + Tk = Ci[WS(csi, 7)]; + Tl = Ci[WS(csi, 2)]; + Tm = KP866025403 * (Tk - Tl); + TC = Tk + Tl; + } + TB = KP866025403 * (T5 - T6); + TZ = TD - TC; + T10 = TI - TH; + TE = FMA(KP500000000, TC, TD); + TG = KP866025403 * (Ta - Tb); + TJ = FMA(KP500000000, TH, TI); + Tj = FNMS(KP500000000, T7, T4); + Tn = Tj - Tm; + Tv = Tj + Tm; + To = FNMS(KP500000000, Tc, T9); + Ts = To - Tr; + Tw = To + Tr; + T8 = T4 + T7; + Td = T9 + Tc; + Te = T8 + Td; + } + R0[0] = FMA(KP2_000000000, Te, T3); + { + E T11, T13, TY, T12, TW, TX; + T11 = FNMS(KP1_902113032, T10, KP1_175570504 * TZ); + T13 = FMA(KP1_902113032, TZ, KP1_175570504 * T10); + TW = FNMS(KP500000000, Te, T3); + TX = KP1_118033988 * (T8 - Td); + TY = TW - TX; + T12 = TX + TW; + R0[WS(rs, 6)] = TY - T11; + R1[WS(rs, 4)] = T12 + T13; + R1[WS(rs, 1)] = TY + T11; + R0[WS(rs, 3)] = T12 - T13; + } + { + E TP, Tt, TO, TT, TV, TR, TS, TU, TQ; + TP = KP1_118033988 * (Tn - Ts); + Tt = Tn + Ts; + TO = FNMS(KP500000000, Tt, Ti); + TR = TE - TB; + TS = TJ - TG; + TT = FNMS(KP1_902113032, TS, KP1_175570504 * TR); + TV = FMA(KP1_902113032, TR, KP1_175570504 * TS); + R1[WS(rs, 2)] = FMA(KP2_000000000, Tt, Ti); + TU = TP + TO; + R1[WS(rs, 5)] = TU - TV; + R0[WS(rs, 7)] = TU + TV; + TQ = TO - TP; + R0[WS(rs, 1)] = TQ - TT; + R0[WS(rs, 4)] = TQ + TT; + } + { + E Tz, Tx, Ty, TL, TN, TF, TK, TM, TA; + Tz = KP1_118033988 * (Tv - Tw); + Tx = Tv + Tw; + Ty = FNMS(KP500000000, Tx, Tu); + TF = TB + TE; + TK = TG + TJ; + TL = FNMS(KP1_902113032, TK, KP1_175570504 * TF); + TN = FMA(KP1_902113032, TF, KP1_175570504 * TK); + R0[WS(rs, 5)] = FMA(KP2_000000000, Tx, Tu); + TM = Tz + Ty; + R1[0] = TM - TN; + R0[WS(rs, 2)] = TM + TN; + TA = Ty - Tz; + R1[WS(rs, 3)] = TA - TL; + R1[WS(rs, 6)] = TA + TL; + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cb_15", {47, 14, 17, 0}, &GENUS }; + +void X(codelet_r2cb_15) (planner *p) { + X(kr2c_register) (p, r2cb_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_16.c new file mode 100644 index 000000000..5f890a63e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_16.c @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -name r2cb_16 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 58 FP additions, 32 FP multiplications, + * (or, 26 additions, 0 multiplications, 32 fused multiply/add), + * 31 stack variables, 4 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T5, TL, Tj, TD, T8, TM, To, TE, Tc, TP, Tf, TQ, Tu, Tz, TR; + E TO, TH, TG; + { + E T4, Ti, T3, Th, T1, T2; + T4 = Cr[WS(csr, 4)]; + Ti = Ci[WS(csi, 4)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 8)]; + T3 = T1 + T2; + Th = T1 - T2; + T5 = FMA(KP2_000000000, T4, T3); + TL = FNMS(KP2_000000000, T4, T3); + Tj = FNMS(KP2_000000000, Ti, Th); + TD = FMA(KP2_000000000, Ti, Th); + } + { + E T6, T7, Tk, Tl, Tm, Tn; + T6 = Cr[WS(csr, 2)]; + T7 = Cr[WS(csr, 6)]; + Tk = T6 - T7; + Tl = Ci[WS(csi, 2)]; + Tm = Ci[WS(csi, 6)]; + Tn = Tl + Tm; + T8 = T6 + T7; + TM = Tl - Tm; + To = Tk - Tn; + TE = Tk + Tn; + } + { + E Tq, Ty, Tv, Tt; + { + E Ta, Tb, Tw, Tx; + Ta = Cr[WS(csr, 1)]; + Tb = Cr[WS(csr, 7)]; + Tc = Ta + Tb; + Tq = Ta - Tb; + Tw = Ci[WS(csi, 1)]; + Tx = Ci[WS(csi, 7)]; + Ty = Tw + Tx; + TP = Tw - Tx; + } + { + E Td, Te, Tr, Ts; + Td = Cr[WS(csr, 5)]; + Te = Cr[WS(csr, 3)]; + Tf = Td + Te; + Tv = Td - Te; + Tr = Ci[WS(csi, 5)]; + Ts = Ci[WS(csi, 3)]; + Tt = Tr + Ts; + TQ = Tr - Ts; + } + Tu = Tq - Tt; + Tz = Tv + Ty; + TR = TP - TQ; + TO = Tc - Tf; + TH = Tq + Tt; + TG = Ty - Tv; + } + { + E T9, Tg, TT, TU; + T9 = FMA(KP2_000000000, T8, T5); + Tg = Tc + Tf; + R0[WS(rs, 4)] = FNMS(KP2_000000000, Tg, T9); + R0[0] = FMA(KP2_000000000, Tg, T9); + TT = FMA(KP2_000000000, TM, TL); + TU = TO + TR; + R0[WS(rs, 3)] = FNMS(KP1_414213562, TU, TT); + R0[WS(rs, 7)] = FMA(KP1_414213562, TU, TT); + } + { + E TV, TW, Tp, TA; + TV = FNMS(KP2_000000000, T8, T5); + TW = TQ + TP; + R0[WS(rs, 2)] = FNMS(KP2_000000000, TW, TV); + R0[WS(rs, 6)] = FMA(KP2_000000000, TW, TV); + Tp = FMA(KP1_414213562, To, Tj); + TA = FNMS(KP414213562, Tz, Tu); + R1[WS(rs, 4)] = FNMS(KP1_847759065, TA, Tp); + R1[0] = FMA(KP1_847759065, TA, Tp); + } + { + E TB, TC, TJ, TK; + TB = FNMS(KP1_414213562, To, Tj); + TC = FMA(KP414213562, Tu, Tz); + R1[WS(rs, 2)] = FNMS(KP1_847759065, TC, TB); + R1[WS(rs, 6)] = FMA(KP1_847759065, TC, TB); + TJ = FMA(KP1_414213562, TE, TD); + TK = FMA(KP414213562, TG, TH); + R1[WS(rs, 3)] = FNMS(KP1_847759065, TK, TJ); + R1[WS(rs, 7)] = FMA(KP1_847759065, TK, TJ); + } + { + E TN, TS, TF, TI; + TN = FNMS(KP2_000000000, TM, TL); + TS = TO - TR; + R0[WS(rs, 5)] = FNMS(KP1_414213562, TS, TN); + R0[WS(rs, 1)] = FMA(KP1_414213562, TS, TN); + TF = FNMS(KP1_414213562, TE, TD); + TI = FNMS(KP414213562, TH, TG); + R1[WS(rs, 1)] = FNMS(KP1_847759065, TI, TF); + R1[WS(rs, 5)] = FMA(KP1_847759065, TI, TF); + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cb_16", {26, 0, 32, 0}, &GENUS }; + +void X(codelet_r2cb_16) (planner *p) { + X(kr2c_register) (p, r2cb_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 16 -name r2cb_16 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 58 FP additions, 18 FP multiplications, + * (or, 54 additions, 14 multiplications, 4 fused multiply/add), + * 31 stack variables, 4 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T9, TS, Tl, TG, T6, TR, Ti, TD, Td, Tq, Tg, Tt, Tn, Tu, TV; + E TU, TN, TK; + { + E T7, T8, TE, Tj, Tk, TF; + T7 = Cr[WS(csr, 2)]; + T8 = Cr[WS(csr, 6)]; + TE = T7 - T8; + Tj = Ci[WS(csi, 2)]; + Tk = Ci[WS(csi, 6)]; + TF = Tj + Tk; + T9 = KP2_000000000 * (T7 + T8); + TS = KP1_414213562 * (TE + TF); + Tl = KP2_000000000 * (Tj - Tk); + TG = KP1_414213562 * (TE - TF); + } + { + E T5, TC, T3, TA; + { + E T4, TB, T1, T2; + T4 = Cr[WS(csr, 4)]; + T5 = KP2_000000000 * T4; + TB = Ci[WS(csi, 4)]; + TC = KP2_000000000 * TB; + T1 = Cr[0]; + T2 = Cr[WS(csr, 8)]; + T3 = T1 + T2; + TA = T1 - T2; + } + T6 = T3 + T5; + TR = TA + TC; + Ti = T3 - T5; + TD = TA - TC; + } + { + E TI, TM, TL, TJ; + { + E Tb, Tc, To, Tp; + Tb = Cr[WS(csr, 1)]; + Tc = Cr[WS(csr, 7)]; + Td = Tb + Tc; + TI = Tb - Tc; + To = Ci[WS(csi, 1)]; + Tp = Ci[WS(csi, 7)]; + Tq = To - Tp; + TM = To + Tp; + } + { + E Te, Tf, Tr, Ts; + Te = Cr[WS(csr, 5)]; + Tf = Cr[WS(csr, 3)]; + Tg = Te + Tf; + TL = Te - Tf; + Tr = Ci[WS(csi, 5)]; + Ts = Ci[WS(csi, 3)]; + Tt = Tr - Ts; + TJ = Tr + Ts; + } + Tn = Td - Tg; + Tu = Tq - Tt; + TV = TM - TL; + TU = TI + TJ; + TN = TL + TM; + TK = TI - TJ; + } + { + E Ta, Th, TT, TW; + Ta = T6 + T9; + Th = KP2_000000000 * (Td + Tg); + R0[WS(rs, 4)] = Ta - Th; + R0[0] = Ta + Th; + TT = TR - TS; + TW = FNMS(KP1_847759065, TV, KP765366864 * TU); + R1[WS(rs, 5)] = TT - TW; + R1[WS(rs, 1)] = TT + TW; + } + { + E TX, TY, Tm, Tv; + TX = TR + TS; + TY = FMA(KP1_847759065, TU, KP765366864 * TV); + R1[WS(rs, 3)] = TX - TY; + R1[WS(rs, 7)] = TX + TY; + Tm = Ti - Tl; + Tv = KP1_414213562 * (Tn - Tu); + R0[WS(rs, 5)] = Tm - Tv; + R0[WS(rs, 1)] = Tm + Tv; + } + { + E Tw, Tx, TH, TO; + Tw = Ti + Tl; + Tx = KP1_414213562 * (Tn + Tu); + R0[WS(rs, 3)] = Tw - Tx; + R0[WS(rs, 7)] = Tw + Tx; + TH = TD + TG; + TO = FNMS(KP765366864, TN, KP1_847759065 * TK); + R1[WS(rs, 4)] = TH - TO; + R1[0] = TH + TO; + } + { + E TP, TQ, Ty, Tz; + TP = TD - TG; + TQ = FMA(KP765366864, TK, KP1_847759065 * TN); + R1[WS(rs, 2)] = TP - TQ; + R1[WS(rs, 6)] = TP + TQ; + Ty = T6 - T9; + Tz = KP2_000000000 * (Tt + Tq); + R0[WS(rs, 2)] = Ty - Tz; + R0[WS(rs, 6)] = Ty + Tz; + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cb_16", {54, 14, 4, 0}, &GENUS }; + +void X(codelet_r2cb_16) (planner *p) { + X(kr2c_register) (p, r2cb_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_2.c new file mode 100644 index 000000000..4300bea37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_2.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -name r2cb_2 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 3 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + R1[0] = T1 - T2; + R0[0] = T1 + T2; + } + } +} + +static const kr2c_desc desc = { 2, "r2cb_2", {2, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cb_2) (planner *p) { + X(kr2c_register) (p, r2cb_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 2 -name r2cb_2 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 3 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + R1[0] = T1 - T2; + R0[0] = T1 + T2; + } + } +} + +static const kr2c_desc desc = { 2, "r2cb_2", {2, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cb_2) (planner *p) { + X(kr2c_register) (p, r2cb_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_20.c new file mode 100644 index 000000000..371afd1b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_20.c @@ -0,0 +1,371 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:30 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -name r2cb_20 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 86 FP additions, 44 FP multiplications, + * (or, 42 additions, 0 multiplications, 44 fused multiply/add), + * 50 stack variables, 5 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T5, TD, Tl, Tr, TO, T1l, T1d, T10, T1k, TT, T11, T1a, Tc, Tj, Tk; + E Tw, TB, TC, Tm, Tn, To, TE, TF, TG; + { + E T4, Tq, T3, Tp, T1, T2; + T4 = Cr[WS(csr, 5)]; + Tq = Ci[WS(csi, 5)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 10)]; + T3 = T1 + T2; + Tp = T1 - T2; + T5 = FNMS(KP2_000000000, T4, T3); + TD = FNMS(KP2_000000000, Tq, Tp); + Tl = FMA(KP2_000000000, T4, T3); + Tr = FMA(KP2_000000000, Tq, Tp); + } + { + E T8, Ts, TR, T19, Tb, T18, Tv, TS, Tf, Tx, TM, T1c, Ti, T1b, TA; + E TN; + { + E T6, T7, TP, TQ; + T6 = Cr[WS(csr, 4)]; + T7 = Cr[WS(csr, 6)]; + T8 = T6 + T7; + Ts = T6 - T7; + TP = Ci[WS(csi, 4)]; + TQ = Ci[WS(csi, 6)]; + TR = TP - TQ; + T19 = TP + TQ; + } + { + E T9, Ta, Tt, Tu; + T9 = Cr[WS(csr, 9)]; + Ta = Cr[WS(csr, 1)]; + Tb = T9 + Ta; + T18 = T9 - Ta; + Tt = Ci[WS(csi, 9)]; + Tu = Ci[WS(csi, 1)]; + Tv = Tt + Tu; + TS = Tt - Tu; + } + { + E Td, Te, TK, TL; + Td = Cr[WS(csr, 8)]; + Te = Cr[WS(csr, 2)]; + Tf = Td + Te; + Tx = Td - Te; + TK = Ci[WS(csi, 8)]; + TL = Ci[WS(csi, 2)]; + TM = TK - TL; + T1c = TK + TL; + } + { + E Tg, Th, Ty, Tz; + Tg = Cr[WS(csr, 7)]; + Th = Cr[WS(csr, 3)]; + Ti = Tg + Th; + T1b = Tg - Th; + Ty = Ci[WS(csi, 7)]; + Tz = Ci[WS(csi, 3)]; + TA = Ty + Tz; + TN = Tz - Ty; + } + TO = TM - TN; + T1l = T19 - T18; + T1d = T1b + T1c; + T10 = TS + TR; + T1k = T1c - T1b; + TT = TR - TS; + T11 = TN + TM; + T1a = T18 + T19; + Tc = T8 - Tb; + Tj = Tf - Ti; + Tk = Tc + Tj; + Tw = Ts + Tv; + TB = Tx - TA; + TC = Tw + TB; + Tm = T8 + Tb; + Tn = Tf + Ti; + To = Tm + Tn; + TE = Ts - Tv; + TF = Tx + TA; + TG = TE + TF; + } + R0[WS(rs, 5)] = FMA(KP2_000000000, Tk, T5); + R1[WS(rs, 7)] = FMA(KP2_000000000, TC, Tr); + R1[WS(rs, 2)] = FMA(KP2_000000000, TG, TD); + R0[0] = FMA(KP2_000000000, To, Tl); + { + E TU, TW, TJ, TV, TH, TI; + TU = FNMS(KP618033988, TT, TO); + TW = FMA(KP618033988, TO, TT); + TH = FNMS(KP500000000, Tk, T5); + TI = Tc - Tj; + TJ = FNMS(KP1_118033988, TI, TH); + TV = FMA(KP1_118033988, TI, TH); + R0[WS(rs, 9)] = FNMS(KP1_902113032, TU, TJ); + R0[WS(rs, 7)] = FMA(KP1_902113032, TW, TV); + R0[WS(rs, 1)] = FMA(KP1_902113032, TU, TJ); + R0[WS(rs, 3)] = FNMS(KP1_902113032, TW, TV); + } + { + E T1e, T1g, T17, T1f, T15, T16; + T1e = FMA(KP618033988, T1d, T1a); + T1g = FNMS(KP618033988, T1a, T1d); + T15 = FNMS(KP500000000, TG, TD); + T16 = TE - TF; + T17 = FMA(KP1_118033988, T16, T15); + T1f = FNMS(KP1_118033988, T16, T15); + R1[0] = FNMS(KP1_902113032, T1e, T17); + R1[WS(rs, 8)] = FMA(KP1_902113032, T1g, T1f); + R1[WS(rs, 4)] = FMA(KP1_902113032, T1e, T17); + R1[WS(rs, 6)] = FNMS(KP1_902113032, T1g, T1f); + } + { + E T1m, T1o, T1j, T1n, T1h, T1i; + T1m = FNMS(KP618033988, T1l, T1k); + T1o = FMA(KP618033988, T1k, T1l); + T1h = FNMS(KP500000000, TC, Tr); + T1i = Tw - TB; + T1j = FNMS(KP1_118033988, T1i, T1h); + T1n = FMA(KP1_118033988, T1i, T1h); + R1[WS(rs, 1)] = FNMS(KP1_902113032, T1m, T1j); + R1[WS(rs, 9)] = FMA(KP1_902113032, T1o, T1n); + R1[WS(rs, 3)] = FMA(KP1_902113032, T1m, T1j); + R1[WS(rs, 5)] = FNMS(KP1_902113032, T1o, T1n); + } + { + E T12, T14, TZ, T13, TX, TY; + T12 = FMA(KP618033988, T11, T10); + T14 = FNMS(KP618033988, T10, T11); + TX = FNMS(KP500000000, To, Tl); + TY = Tm - Tn; + TZ = FMA(KP1_118033988, TY, TX); + T13 = FNMS(KP1_118033988, TY, TX); + R0[WS(rs, 8)] = FNMS(KP1_902113032, T12, TZ); + R0[WS(rs, 6)] = FMA(KP1_902113032, T14, T13); + R0[WS(rs, 2)] = FMA(KP1_902113032, T12, TZ); + R0[WS(rs, 4)] = FNMS(KP1_902113032, T14, T13); + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cb_20", {42, 0, 44, 0}, &GENUS }; + +void X(codelet_r2cb_20) (planner *p) { + X(kr2c_register) (p, r2cb_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 20 -name r2cb_20 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 86 FP additions, 30 FP multiplications, + * (or, 70 additions, 14 multiplications, 16 fused multiply/add), + * 50 stack variables, 5 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T6, TF, Tm, Tt, TQ, T1n, T1f, T12, T1m, TV, T13, T1c, Td, Tk, Tl; + E Ty, TD, TE, Tn, To, Tp, TG, TH, TI; + { + E T5, Ts, T3, Tq; + { + E T4, Tr, T1, T2; + T4 = Cr[WS(csr, 5)]; + T5 = KP2_000000000 * T4; + Tr = Ci[WS(csi, 5)]; + Ts = KP2_000000000 * Tr; + T1 = Cr[0]; + T2 = Cr[WS(csr, 10)]; + T3 = T1 + T2; + Tq = T1 - T2; + } + T6 = T3 - T5; + TF = Tq - Ts; + Tm = T3 + T5; + Tt = Tq + Ts; + } + { + E T9, Tu, TO, T1b, Tc, T1a, Tx, TP, Tg, Tz, TT, T1e, Tj, T1d, TC; + E TU; + { + E T7, T8, TM, TN; + T7 = Cr[WS(csr, 4)]; + T8 = Cr[WS(csr, 6)]; + T9 = T7 + T8; + Tu = T7 - T8; + TM = Ci[WS(csi, 4)]; + TN = Ci[WS(csi, 6)]; + TO = TM - TN; + T1b = TM + TN; + } + { + E Ta, Tb, Tv, Tw; + Ta = Cr[WS(csr, 9)]; + Tb = Cr[WS(csr, 1)]; + Tc = Ta + Tb; + T1a = Ta - Tb; + Tv = Ci[WS(csi, 9)]; + Tw = Ci[WS(csi, 1)]; + Tx = Tv + Tw; + TP = Tv - Tw; + } + { + E Te, Tf, TR, TS; + Te = Cr[WS(csr, 8)]; + Tf = Cr[WS(csr, 2)]; + Tg = Te + Tf; + Tz = Te - Tf; + TR = Ci[WS(csi, 8)]; + TS = Ci[WS(csi, 2)]; + TT = TR - TS; + T1e = TR + TS; + } + { + E Th, Ti, TA, TB; + Th = Cr[WS(csr, 7)]; + Ti = Cr[WS(csr, 3)]; + Tj = Th + Ti; + T1d = Th - Ti; + TA = Ci[WS(csi, 7)]; + TB = Ci[WS(csi, 3)]; + TC = TA + TB; + TU = TB - TA; + } + TQ = TO - TP; + T1n = T1e - T1d; + T1f = T1d + T1e; + T12 = TP + TO; + T1m = T1b - T1a; + TV = TT - TU; + T13 = TU + TT; + T1c = T1a + T1b; + Td = T9 - Tc; + Tk = Tg - Tj; + Tl = Td + Tk; + Ty = Tu + Tx; + TD = Tz - TC; + TE = Ty + TD; + Tn = T9 + Tc; + To = Tg + Tj; + Tp = Tn + To; + TG = Tu - Tx; + TH = Tz + TC; + TI = TG + TH; + } + R0[WS(rs, 5)] = FMA(KP2_000000000, Tl, T6); + R1[WS(rs, 7)] = FMA(KP2_000000000, TE, Tt); + R1[WS(rs, 2)] = FMA(KP2_000000000, TI, TF); + R0[0] = FMA(KP2_000000000, Tp, Tm); + { + E TW, TY, TL, TX, TJ, TK; + TW = FNMS(KP1_902113032, TV, KP1_175570504 * TQ); + TY = FMA(KP1_902113032, TQ, KP1_175570504 * TV); + TJ = FNMS(KP500000000, Tl, T6); + TK = KP1_118033988 * (Td - Tk); + TL = TJ - TK; + TX = TK + TJ; + R0[WS(rs, 1)] = TL - TW; + R0[WS(rs, 7)] = TX + TY; + R0[WS(rs, 9)] = TL + TW; + R0[WS(rs, 3)] = TX - TY; + } + { + E T1g, T1i, T19, T1h, T17, T18; + T1g = FNMS(KP1_902113032, T1f, KP1_175570504 * T1c); + T1i = FMA(KP1_902113032, T1c, KP1_175570504 * T1f); + T17 = FNMS(KP500000000, TI, TF); + T18 = KP1_118033988 * (TG - TH); + T19 = T17 - T18; + T1h = T18 + T17; + R1[WS(rs, 8)] = T19 - T1g; + R1[WS(rs, 4)] = T1h + T1i; + R1[WS(rs, 6)] = T19 + T1g; + R1[0] = T1h - T1i; + } + { + E T1o, T1q, T1l, T1p, T1j, T1k; + T1o = FNMS(KP1_902113032, T1n, KP1_175570504 * T1m); + T1q = FMA(KP1_902113032, T1m, KP1_175570504 * T1n); + T1j = FNMS(KP500000000, TE, Tt); + T1k = KP1_118033988 * (Ty - TD); + T1l = T1j - T1k; + T1p = T1k + T1j; + R1[WS(rs, 3)] = T1l - T1o; + R1[WS(rs, 9)] = T1p + T1q; + R1[WS(rs, 1)] = T1l + T1o; + R1[WS(rs, 5)] = T1p - T1q; + } + { + E T14, T16, T11, T15, TZ, T10; + T14 = FNMS(KP1_902113032, T13, KP1_175570504 * T12); + T16 = FMA(KP1_902113032, T12, KP1_175570504 * T13); + TZ = FNMS(KP500000000, Tp, Tm); + T10 = KP1_118033988 * (Tn - To); + T11 = TZ - T10; + T15 = T10 + TZ; + R0[WS(rs, 6)] = T11 - T14; + R0[WS(rs, 2)] = T15 + T16; + R0[WS(rs, 4)] = T11 + T14; + R0[WS(rs, 8)] = T15 - T16; + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cb_20", {70, 14, 16, 0}, &GENUS }; + +void X(codelet_r2cb_20) (planner *p) { + X(kr2c_register) (p, r2cb_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_25.c new file mode 100644 index 000000000..762142cee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_25.c @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:30 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 25 -name r2cb_25 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 152 FP additions, 120 FP multiplications, + * (or, 32 additions, 0 multiplications, 120 fused multiply/add), + * 88 stack variables, 44 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP979740652, +0.979740652857618686258237536568998933733477632); + DK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DK(KP438153340, +0.438153340021931793654057951961031291699532119); + DK(KP963507348, +0.963507348203430549974383005744259307057084020); + DK(KP641441904, +0.641441904830606407298806329068862424939687989); + DK(KP595480289, +0.595480289600000014706716770488118292997907308); + DK(KP1_721083328, +1.721083328735889354196523361841037632825608373); + DK(KP1_606007150, +1.606007150877320829666881187140752009270929701); + DK(KP1_011627398, +1.011627398597394192215998921771049272931807941); + DK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DK(KP452413526, +0.452413526233009763856834323966348796985206956); + DK(KP933137358, +0.933137358350283770603023973254446451924190884); + DK(KP662318342, +0.662318342759882818626911127577439236802190210); + DK(KP576710603, +0.576710603632765877371579268136471017090111488); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP1_842354653, +1.842354653930286640500894870830132058718564461); + DK(KP1_666834356, +1.666834356657377354817925100486477686277992119); + DK(KP1_082908895, +1.082908895072625554092571180165639018104066379); + DK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DK(KP484291580, +0.484291580564315559745084187732367906918006201); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP1_386580726, +1.386580726567734802700860150804827247498955921); + DK(KP1_898359647, +1.898359647016882523151110931686726543423167685); + DK(KP1_115827804, +1.115827804063668528375399296931134075984874304); + DK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DK(KP499013364, +0.499013364214135780976168403431725276668452610); + DK(KP730409924, +0.730409924561256563751459444999838399157094302); + DK(KP451418159, +0.451418159099103183892477933432151804893354132); + DK(KP846146756, +0.846146756728608505452954290121135880883743802); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E Tu, T1G, T5, Tr, T1F, TH, TK, Te, TR, T2a, T1t, T1N, TG, T29, T1u; + E T1K, T14, T17, Tn, T1e, T26, T1q, T1R, T13, T27, T1r, T1U, Ts, Tt; + Ts = Ci[WS(csi, 5)]; + Tt = Ci[WS(csi, 10)]; + Tu = FMA(KP618033988, Tt, Ts); + T1G = FMS(KP618033988, Ts, Tt); + { + E T1, T4, Tq, T2, T3, Tp; + T1 = Cr[0]; + T2 = Cr[WS(csr, 5)]; + T3 = Cr[WS(csr, 10)]; + T4 = T2 + T3; + Tq = T2 - T3; + T5 = FMA(KP2_000000000, T4, T1); + Tp = FNMS(KP500000000, T4, T1); + Tr = FMA(KP1_118033988, Tq, Tp); + T1F = FNMS(KP1_118033988, Tq, Tp); + } + { + E T6, Td, TP, Tx, TO, TB, TM, TE; + T6 = Cr[WS(csr, 1)]; + TH = Ci[WS(csi, 1)]; + { + E T7, T8, T9, Ta, Tb, Tc; + T7 = Cr[WS(csr, 6)]; + T8 = Cr[WS(csr, 4)]; + T9 = T7 + T8; + Ta = Cr[WS(csr, 11)]; + Tb = Cr[WS(csr, 9)]; + Tc = Ta + Tb; + Td = T9 + Tc; + TP = Tb - Ta; + Tx = T9 - Tc; + TO = T7 - T8; + } + { + E Tz, TA, TI, TC, TD, TJ; + Tz = Ci[WS(csi, 6)]; + TA = Ci[WS(csi, 4)]; + TI = Tz - TA; + TC = Ci[WS(csi, 11)]; + TD = Ci[WS(csi, 9)]; + TJ = TC - TD; + TB = Tz + TA; + TM = TI - TJ; + TE = TC + TD; + TK = TI + TJ; + } + Te = T6 + Td; + { + E TQ, T1M, TN, T1L, TL; + TQ = FNMS(KP618033988, TP, TO); + T1M = FMA(KP618033988, TO, TP); + TL = FNMS(KP250000000, TK, TH); + TN = FMA(KP559016994, TM, TL); + T1L = FNMS(KP559016994, TM, TL); + TR = FMA(KP951056516, TQ, TN); + T2a = FNMS(KP951056516, T1M, T1L); + T1t = FNMS(KP951056516, TQ, TN); + T1N = FMA(KP951056516, T1M, T1L); + } + { + E TF, T1J, Ty, T1I, Tw; + TF = FMA(KP618033988, TE, TB); + T1J = FNMS(KP618033988, TB, TE); + Tw = FNMS(KP250000000, Td, T6); + Ty = FMA(KP559016994, Tx, Tw); + T1I = FNMS(KP559016994, Tx, Tw); + TG = FNMS(KP951056516, TF, Ty); + T29 = FNMS(KP951056516, T1J, T1I); + T1u = FMA(KP951056516, TF, Ty); + T1K = FMA(KP951056516, T1J, T1I); + } + } + { + E Tf, Tm, T1c, TU, T1b, TY, T19, T11; + Tf = Cr[WS(csr, 2)]; + T14 = Ci[WS(csi, 2)]; + { + E Tg, Th, Ti, Tj, Tk, Tl; + Tg = Cr[WS(csr, 7)]; + Th = Cr[WS(csr, 3)]; + Ti = Tg + Th; + Tj = Cr[WS(csr, 12)]; + Tk = Cr[WS(csr, 8)]; + Tl = Tj + Tk; + Tm = Ti + Tl; + T1c = Tj - Tk; + TU = Tl - Ti; + T1b = Th - Tg; + } + { + E TW, TX, T15, TZ, T10, T16; + TW = Ci[WS(csi, 7)]; + TX = Ci[WS(csi, 3)]; + T15 = TW - TX; + TZ = Ci[WS(csi, 12)]; + T10 = Ci[WS(csi, 8)]; + T16 = TZ - T10; + TY = TW + TX; + T19 = T16 - T15; + T11 = TZ + T10; + T17 = T15 + T16; + } + Tn = Tf + Tm; + { + E T1d, T1Q, T1a, T1P, T18; + T1d = FNMS(KP618033988, T1c, T1b); + T1Q = FMA(KP618033988, T1b, T1c); + T18 = FNMS(KP250000000, T17, T14); + T1a = FNMS(KP559016994, T19, T18); + T1P = FMA(KP559016994, T19, T18); + T1e = FNMS(KP951056516, T1d, T1a); + T26 = FMA(KP951056516, T1Q, T1P); + T1q = FMA(KP951056516, T1d, T1a); + T1R = FNMS(KP951056516, T1Q, T1P); + } + { + E T12, T1T, TV, T1S, TT; + T12 = FMA(KP618033988, T11, TY); + T1T = FNMS(KP618033988, TY, T11); + TT = FNMS(KP250000000, Tm, Tf); + TV = FNMS(KP559016994, TU, TT); + T1S = FMA(KP559016994, TU, TT); + T13 = FNMS(KP951056516, T12, TV); + T27 = FNMS(KP951056516, T1T, T1S); + T1r = FMA(KP951056516, T12, TV); + T1U = FMA(KP951056516, T1T, T1S); + } + } + { + E T2m, To, T2l, T2q, T2s, T2o, T2p, T2r, T2n; + T2m = Te - Tn; + To = Te + Tn; + T2l = FNMS(KP500000000, To, T5); + T2o = TK + TH; + T2p = T17 + T14; + T2q = FMA(KP618033988, T2p, T2o); + T2s = FNMS(KP618033988, T2o, T2p); + R0[0] = FMA(KP2_000000000, To, T5); + T2r = FNMS(KP1_118033988, T2m, T2l); + R1[WS(rs, 7)] = FNMS(KP1_902113032, T2s, T2r); + R0[WS(rs, 5)] = FMA(KP1_902113032, T2s, T2r); + T2n = FMA(KP1_118033988, T2m, T2l); + R1[WS(rs, 2)] = FNMS(KP1_902113032, T2q, T2n); + R0[WS(rs, 10)] = FMA(KP1_902113032, T2q, T2n); + } + { + E T2i, T2k, T25, T2c, T2d, T2e, T2j, T2f; + { + E T2g, T2h, T28, T2b; + T2g = FMA(KP939062505, T29, T2a); + T2h = FMA(KP062914667, T26, T27); + T2i = FMA(KP846146756, T2h, T2g); + T2k = FNMS(KP451418159, T2g, T2h); + T25 = FMA(KP1_902113032, T1G, T1F); + T28 = FNMS(KP062914667, T27, T26); + T2b = FNMS(KP939062505, T2a, T29); + T2c = FNMS(KP730409924, T2b, T28); + T2d = FMA(KP499013364, T2c, T25); + T2e = FMA(KP730409924, T2b, T28); + } + R1[WS(rs, 1)] = FNMS(KP1_996053456, T2c, T25); + T2j = FNMS(KP1_115827804, T2e, T2d); + R0[WS(rs, 9)] = FNMS(KP1_898359647, T2k, T2j); + R1[WS(rs, 6)] = FMA(KP1_898359647, T2k, T2j); + T2f = FMA(KP1_115827804, T2e, T2d); + R0[WS(rs, 4)] = FNMS(KP1_386580726, T2i, T2f); + R1[WS(rs, 11)] = FMA(KP1_386580726, T2i, T2f); + } + { + E T1m, T1o, Tv, T1g, T1h, T1i, T1n, T1j; + { + E T1k, T1l, TS, T1f; + T1k = FMA(KP256756360, TG, TR); + T1l = FMA(KP549754652, T13, T1e); + T1m = FMA(KP559154169, T1l, T1k); + T1o = FNMS(KP683113946, T1k, T1l); + Tv = FNMS(KP1_902113032, Tu, Tr); + TS = FNMS(KP256756360, TR, TG); + T1f = FNMS(KP549754652, T1e, T13); + T1g = FMA(KP904730450, T1f, TS); + T1h = FNMS(KP484291580, T1g, Tv); + T1i = FNMS(KP904730450, T1f, TS); + } + R1[0] = FMA(KP1_937166322, T1g, Tv); + T1n = FNMS(KP1_082908895, T1i, T1h); + R0[WS(rs, 8)] = FNMS(KP1_666834356, T1o, T1n); + R1[WS(rs, 5)] = FMA(KP1_666834356, T1o, T1n); + T1j = FMA(KP1_082908895, T1i, T1h); + R0[WS(rs, 3)] = FNMS(KP1_842354653, T1m, T1j); + R1[WS(rs, 10)] = FMA(KP1_842354653, T1m, T1j); + } + { + E T1C, T1E, T1p, T1w, T1x, T1y, T1D, T1z; + { + E T1A, T1B, T1s, T1v; + T1A = FNMS(KP470564281, T1q, T1r); + T1B = FMA(KP634619297, T1t, T1u); + T1C = FNMS(KP576710603, T1B, T1A); + T1E = FMA(KP662318342, T1A, T1B); + T1p = FMA(KP1_902113032, Tu, Tr); + T1s = FMA(KP470564281, T1r, T1q); + T1v = FNMS(KP634619297, T1u, T1t); + T1w = FMA(KP933137358, T1v, T1s); + T1x = FMA(KP452413526, T1w, T1p); + T1y = FNMS(KP933137358, T1v, T1s); + } + R0[WS(rs, 2)] = FNMS(KP1_809654104, T1w, T1p); + T1D = FMA(KP1_011627398, T1y, T1x); + R1[WS(rs, 4)] = FNMS(KP1_606007150, T1E, T1D); + R0[WS(rs, 12)] = FMA(KP1_606007150, T1E, T1D); + T1z = FNMS(KP1_011627398, T1y, T1x); + R0[WS(rs, 7)] = FMA(KP1_721083328, T1C, T1z); + R1[WS(rs, 9)] = FNMS(KP1_721083328, T1C, T1z); + } + { + E T22, T24, T1H, T1W, T1X, T1Y, T23, T1Z; + { + E T20, T21, T1O, T1V; + T20 = FMA(KP549754652, T1K, T1N); + T21 = FMA(KP634619297, T1R, T1U); + T22 = FMA(KP595480289, T21, T20); + T24 = FNMS(KP641441904, T20, T21); + T1H = FNMS(KP1_902113032, T1G, T1F); + T1O = FNMS(KP549754652, T1N, T1K); + T1V = FNMS(KP634619297, T1U, T1R); + T1W = FNMS(KP963507348, T1V, T1O); + T1X = FNMS(KP438153340, T1W, T1H); + T1Y = FMA(KP963507348, T1V, T1O); + } + R0[WS(rs, 1)] = FMA(KP1_752613360, T1W, T1H); + T23 = FNMS(KP979740652, T1Y, T1X); + R0[WS(rs, 6)] = FMA(KP1_606007150, T24, T23); + R1[WS(rs, 8)] = FNMS(KP1_606007150, T24, T23); + T1Z = FMA(KP979740652, T1Y, T1X); + R1[WS(rs, 3)] = FNMS(KP1_666834356, T22, T1Z); + R0[WS(rs, 11)] = FMA(KP1_666834356, T22, T1Z); + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cb_25", {32, 0, 120, 0}, &GENUS }; + +void X(codelet_r2cb_25) (planner *p) { + X(kr2c_register) (p, r2cb_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 25 -name r2cb_25 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 152 FP additions, 98 FP multiplications, + * (or, 100 additions, 46 multiplications, 52 fused multiply/add), + * 65 stack variables, 21 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E Tu, T1G, T5, Tr, T1F, TN, TO, Te, TR, T27, T1r, T1N, TG, T26, T1q; + E T1K, T1a, T1b, Tn, T1e, T2a, T1u, T1U, T13, T29, T1t, T1R, Ts, Tt; + Ts = Ci[WS(csi, 5)]; + Tt = Ci[WS(csi, 10)]; + Tu = FMA(KP1_902113032, Ts, KP1_175570504 * Tt); + T1G = FNMS(KP1_902113032, Tt, KP1_175570504 * Ts); + { + E T1, T4, Tp, T2, T3, Tq; + T1 = Cr[0]; + T2 = Cr[WS(csr, 5)]; + T3 = Cr[WS(csr, 10)]; + T4 = T2 + T3; + Tp = KP1_118033988 * (T2 - T3); + T5 = FMA(KP2_000000000, T4, T1); + Tq = FNMS(KP500000000, T4, T1); + Tr = Tp + Tq; + T1F = Tq - Tp; + } + { + E T6, Td, TI, Tw, TH, TB, TE, TM; + T6 = Cr[WS(csr, 1)]; + TN = Ci[WS(csi, 1)]; + { + E T7, T8, T9, Ta, Tb, Tc; + T7 = Cr[WS(csr, 6)]; + T8 = Cr[WS(csr, 4)]; + T9 = T7 + T8; + Ta = Cr[WS(csr, 11)]; + Tb = Cr[WS(csr, 9)]; + Tc = Ta + Tb; + Td = T9 + Tc; + TI = Ta - Tb; + Tw = KP559016994 * (T9 - Tc); + TH = T7 - T8; + } + { + E Tz, TA, TK, TC, TD, TL; + Tz = Ci[WS(csi, 6)]; + TA = Ci[WS(csi, 4)]; + TK = Tz - TA; + TC = Ci[WS(csi, 11)]; + TD = Ci[WS(csi, 9)]; + TL = TC - TD; + TB = Tz + TA; + TO = TK + TL; + TE = TC + TD; + TM = KP559016994 * (TK - TL); + } + Te = T6 + Td; + { + E TJ, T1L, TQ, T1M, TP; + TJ = FMA(KP951056516, TH, KP587785252 * TI); + T1L = FNMS(KP951056516, TI, KP587785252 * TH); + TP = FNMS(KP250000000, TO, TN); + TQ = TM + TP; + T1M = TP - TM; + TR = TJ + TQ; + T27 = T1M - T1L; + T1r = TQ - TJ; + T1N = T1L + T1M; + } + { + E TF, T1J, Ty, T1I, Tx; + TF = FMA(KP951056516, TB, KP587785252 * TE); + T1J = FNMS(KP951056516, TE, KP587785252 * TB); + Tx = FNMS(KP250000000, Td, T6); + Ty = Tw + Tx; + T1I = Tx - Tw; + TG = Ty - TF; + T26 = T1I + T1J; + T1q = Ty + TF; + T1K = T1I - T1J; + } + } + { + E Tf, Tm, T15, TT, T14, TY, T11, T19; + Tf = Cr[WS(csr, 2)]; + T1a = Ci[WS(csi, 2)]; + { + E Tg, Th, Ti, Tj, Tk, Tl; + Tg = Cr[WS(csr, 7)]; + Th = Cr[WS(csr, 3)]; + Ti = Tg + Th; + Tj = Cr[WS(csr, 12)]; + Tk = Cr[WS(csr, 8)]; + Tl = Tj + Tk; + Tm = Ti + Tl; + T15 = Tj - Tk; + TT = KP559016994 * (Ti - Tl); + T14 = Tg - Th; + } + { + E TW, TX, T17, TZ, T10, T18; + TW = Ci[WS(csi, 7)]; + TX = Ci[WS(csi, 3)]; + T17 = TW - TX; + TZ = Ci[WS(csi, 12)]; + T10 = Ci[WS(csi, 8)]; + T18 = TZ - T10; + TY = TW + TX; + T1b = T17 + T18; + T11 = TZ + T10; + T19 = KP559016994 * (T17 - T18); + } + Tn = Tf + Tm; + { + E T16, T1S, T1d, T1T, T1c; + T16 = FMA(KP951056516, T14, KP587785252 * T15); + T1S = FNMS(KP951056516, T15, KP587785252 * T14); + T1c = FNMS(KP250000000, T1b, T1a); + T1d = T19 + T1c; + T1T = T1c - T19; + T1e = T16 + T1d; + T2a = T1T - T1S; + T1u = T1d - T16; + T1U = T1S + T1T; + } + { + E T12, T1Q, TV, T1P, TU; + T12 = FMA(KP951056516, TY, KP587785252 * T11); + T1Q = FNMS(KP951056516, T11, KP587785252 * TY); + TU = FNMS(KP250000000, Tm, Tf); + TV = TT + TU; + T1P = TU - TT; + T13 = TV - T12; + T29 = T1P + T1Q; + T1t = TV + T12; + T1R = T1P - T1Q; + } + } + { + E T2m, To, T2l, T2q, T2s, T2o, T2p, T2r, T2n; + T2m = KP1_118033988 * (Te - Tn); + To = Te + Tn; + T2l = FNMS(KP500000000, To, T5); + T2o = TO + TN; + T2p = T1b + T1a; + T2q = FNMS(KP1_902113032, T2p, KP1_175570504 * T2o); + T2s = FMA(KP1_902113032, T2o, KP1_175570504 * T2p); + R0[0] = FMA(KP2_000000000, To, T5); + T2r = T2m + T2l; + R1[WS(rs, 2)] = T2r - T2s; + R0[WS(rs, 10)] = T2r + T2s; + T2n = T2l - T2m; + R0[WS(rs, 5)] = T2n - T2q; + R1[WS(rs, 7)] = T2n + T2q; + } + { + E T2i, T2k, T25, T2c, T2d, T2e, T2j, T2f; + { + E T2g, T2h, T28, T2b; + T2g = FMA(KP684547105, T26, KP728968627 * T27); + T2h = FMA(KP998026728, T29, KP062790519 * T2a); + T2i = FNMS(KP1_902113032, T2h, KP1_175570504 * T2g); + T2k = FMA(KP1_902113032, T2g, KP1_175570504 * T2h); + T25 = T1F + T1G; + T28 = FNMS(KP684547105, T27, KP728968627 * T26); + T2b = FNMS(KP998026728, T2a, KP062790519 * T29); + T2c = T28 + T2b; + T2d = FNMS(KP500000000, T2c, T25); + T2e = KP1_118033988 * (T28 - T2b); + } + R1[WS(rs, 1)] = FMA(KP2_000000000, T2c, T25); + T2j = T2e + T2d; + R0[WS(rs, 4)] = T2j - T2k; + R1[WS(rs, 11)] = T2j + T2k; + T2f = T2d - T2e; + R1[WS(rs, 6)] = T2f - T2i; + R0[WS(rs, 9)] = T2f + T2i; + } + { + E T1m, T1o, Tv, T1g, T1h, T1i, T1n, T1j; + { + E T1k, T1l, TS, T1f; + T1k = FMA(KP248689887, TG, KP968583161 * TR); + T1l = FMA(KP481753674, T13, KP876306680 * T1e); + T1m = FNMS(KP1_902113032, T1l, KP1_175570504 * T1k); + T1o = FMA(KP1_902113032, T1k, KP1_175570504 * T1l); + Tv = Tr - Tu; + TS = FNMS(KP248689887, TR, KP968583161 * TG); + T1f = FNMS(KP481753674, T1e, KP876306680 * T13); + T1g = TS + T1f; + T1h = FNMS(KP500000000, T1g, Tv); + T1i = KP1_118033988 * (TS - T1f); + } + R1[0] = FMA(KP2_000000000, T1g, Tv); + T1n = T1i + T1h; + R0[WS(rs, 3)] = T1n - T1o; + R1[WS(rs, 10)] = T1n + T1o; + T1j = T1h - T1i; + R1[WS(rs, 5)] = T1j - T1m; + R0[WS(rs, 8)] = T1j + T1m; + } + { + E T1C, T1E, T1p, T1w, T1x, T1y, T1D, T1z; + { + E T1A, T1B, T1s, T1v; + T1A = FMA(KP844327925, T1q, KP535826794 * T1r); + T1B = FNMS(KP425779291, T1u, KP904827052 * T1t); + T1C = FNMS(KP1_902113032, T1B, KP1_175570504 * T1A); + T1E = FMA(KP1_902113032, T1A, KP1_175570504 * T1B); + T1p = Tr + Tu; + T1s = FNMS(KP844327925, T1r, KP535826794 * T1q); + T1v = FMA(KP425779291, T1t, KP904827052 * T1u); + T1w = T1s - T1v; + T1x = FNMS(KP500000000, T1w, T1p); + T1y = KP1_118033988 * (T1s + T1v); + } + R0[WS(rs, 2)] = FMA(KP2_000000000, T1w, T1p); + T1D = T1x + T1y; + R1[WS(rs, 4)] = T1D - T1E; + R0[WS(rs, 12)] = T1E + T1D; + T1z = T1x - T1y; + R0[WS(rs, 7)] = T1z - T1C; + R1[WS(rs, 9)] = T1C + T1z; + } + { + E T22, T24, T1H, T1W, T1X, T1Y, T23, T1Z; + { + E T20, T21, T1O, T1V; + T20 = FMA(KP481753674, T1K, KP876306680 * T1N); + T21 = FMA(KP844327925, T1R, KP535826794 * T1U); + T22 = FNMS(KP1_902113032, T21, KP1_175570504 * T20); + T24 = FMA(KP1_902113032, T20, KP1_175570504 * T21); + T1H = T1F - T1G; + T1O = FNMS(KP481753674, T1N, KP876306680 * T1K); + T1V = FNMS(KP844327925, T1U, KP535826794 * T1R); + T1W = T1O + T1V; + T1X = FNMS(KP500000000, T1W, T1H); + T1Y = KP1_118033988 * (T1O - T1V); + } + R0[WS(rs, 1)] = FMA(KP2_000000000, T1W, T1H); + T23 = T1Y + T1X; + R1[WS(rs, 3)] = T23 - T24; + R0[WS(rs, 11)] = T23 + T24; + T1Z = T1X - T1Y; + R0[WS(rs, 6)] = T1Z - T22; + R1[WS(rs, 8)] = T1Z + T22; + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cb_25", {100, 46, 52, 0}, &GENUS }; + +void X(codelet_r2cb_25) (planner *p) { + X(kr2c_register) (p, r2cb_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_3.c new file mode 100644 index 000000000..ea6fc30a3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_3.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 3 -name r2cb_3 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 4 FP additions, 3 FP multiplications, + * (or, 1 additions, 0 multiplications, 3 fused multiply/add), + * 7 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T4, T1, T2, T3; + T4 = Ci[WS(csi, 1)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T3 = T1 - T2; + R0[0] = FMA(KP2_000000000, T2, T1); + R0[WS(rs, 1)] = FMA(KP1_732050807, T4, T3); + R1[0] = FNMS(KP1_732050807, T4, T3); + } + } +} + +static const kr2c_desc desc = { 3, "r2cb_3", {1, 0, 3, 0}, &GENUS }; + +void X(codelet_r2cb_3) (planner *p) { + X(kr2c_register) (p, r2cb_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 3 -name r2cb_3 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 4 FP additions, 2 FP multiplications, + * (or, 3 additions, 1 multiplications, 1 fused multiply/add), + * 8 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T5, T1, T2, T3, T4; + T4 = Ci[WS(csi, 1)]; + T5 = KP1_732050807 * T4; + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T3 = T1 - T2; + R0[0] = FMA(KP2_000000000, T2, T1); + R0[WS(rs, 1)] = T3 + T5; + R1[0] = T3 - T5; + } + } +} + +static const kr2c_desc desc = { 3, "r2cb_3", {3, 1, 1, 0}, &GENUS }; + +void X(codelet_r2cb_3) (planner *p) { + X(kr2c_register) (p, r2cb_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_32.c new file mode 100644 index 000000000..9db88de97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_32.c @@ -0,0 +1,639 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -name r2cb_32 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 156 FP additions, 84 FP multiplications, + * (or, 72 additions, 0 multiplications, 84 fused multiply/add), + * 54 stack variables, 9 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T5, T1R, Tz, T1t, T8, T1S, TE, T1u, Tg, T1X, T2m, TK, TP, T1x, T1U; + E T1w, To, T28, T2p, TW, T1d, T1D, T20, T1A, Tv, T23, T2q, T25, T1g, T1B; + E T17, T1E; + { + E T4, Ty, T3, Tx, T1, T2; + T4 = Cr[WS(csr, 8)]; + Ty = Ci[WS(csi, 8)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 16)]; + T3 = T1 + T2; + Tx = T1 - T2; + T5 = FMA(KP2_000000000, T4, T3); + T1R = FNMS(KP2_000000000, T4, T3); + Tz = FNMS(KP2_000000000, Ty, Tx); + T1t = FMA(KP2_000000000, Ty, Tx); + } + { + E T6, T7, TA, TB, TC, TD; + T6 = Cr[WS(csr, 4)]; + T7 = Cr[WS(csr, 12)]; + TA = T6 - T7; + TB = Ci[WS(csi, 4)]; + TC = Ci[WS(csi, 12)]; + TD = TB + TC; + T8 = T6 + T7; + T1S = TB - TC; + TE = TA - TD; + T1u = TA + TD; + } + { + E Tc, TG, TO, T1V, Tf, TL, TJ, T1W; + { + E Ta, Tb, TM, TN; + Ta = Cr[WS(csr, 2)]; + Tb = Cr[WS(csr, 14)]; + Tc = Ta + Tb; + TG = Ta - Tb; + TM = Ci[WS(csi, 2)]; + TN = Ci[WS(csi, 14)]; + TO = TM + TN; + T1V = TM - TN; + } + { + E Td, Te, TH, TI; + Td = Cr[WS(csr, 10)]; + Te = Cr[WS(csr, 6)]; + Tf = Td + Te; + TL = Td - Te; + TH = Ci[WS(csi, 10)]; + TI = Ci[WS(csi, 6)]; + TJ = TH + TI; + T1W = TH - TI; + } + Tg = Tc + Tf; + T1X = T1V - T1W; + T2m = T1W + T1V; + TK = TG - TJ; + TP = TL + TO; + T1x = TG + TJ; + T1U = Tc - Tf; + T1w = TO - TL; + } + { + E Tk, TS, T1c, T26, Tn, T19, TV, T27; + { + E Ti, Tj, T1a, T1b; + Ti = Cr[WS(csr, 1)]; + Tj = Cr[WS(csr, 15)]; + Tk = Ti + Tj; + TS = Ti - Tj; + T1a = Ci[WS(csi, 1)]; + T1b = Ci[WS(csi, 15)]; + T1c = T1a + T1b; + T26 = T1a - T1b; + } + { + E Tl, Tm, TT, TU; + Tl = Cr[WS(csr, 9)]; + Tm = Cr[WS(csr, 7)]; + Tn = Tl + Tm; + T19 = Tl - Tm; + TT = Ci[WS(csi, 9)]; + TU = Ci[WS(csi, 7)]; + TV = TT + TU; + T27 = TT - TU; + } + To = Tk + Tn; + T28 = T26 - T27; + T2p = T27 + T26; + TW = TS - TV; + T1d = T19 + T1c; + T1D = T1c - T19; + T20 = Tk - Tn; + T1A = TS + TV; + } + { + E Tr, TX, T10, T22, Tu, T12, T15, T21; + { + E Tp, Tq, TY, TZ; + Tp = Cr[WS(csr, 5)]; + Tq = Cr[WS(csr, 11)]; + Tr = Tp + Tq; + TX = Tp - Tq; + TY = Ci[WS(csi, 5)]; + TZ = Ci[WS(csi, 11)]; + T10 = TY + TZ; + T22 = TY - TZ; + } + { + E Ts, Tt, T13, T14; + Ts = Cr[WS(csr, 3)]; + Tt = Cr[WS(csr, 13)]; + Tu = Ts + Tt; + T12 = Ts - Tt; + T13 = Ci[WS(csi, 3)]; + T14 = Ci[WS(csi, 13)]; + T15 = T13 + T14; + T21 = T14 - T13; + } + Tv = Tr + Tu; + T23 = T21 - T22; + T2q = T22 + T21; + T25 = Tr - Tu; + { + E T1e, T1f, T11, T16; + T1e = TX + T10; + T1f = T12 + T15; + T1g = T1e - T1f; + T1B = T1e + T1f; + T11 = TX - T10; + T16 = T12 - T15; + T17 = T11 + T16; + T1E = T16 - T11; + } + } + { + E Tw, T2w, Th, T2v, T9; + Tw = To + Tv; + T2w = T2q + T2p; + T9 = FMA(KP2_000000000, T8, T5); + Th = FMA(KP2_000000000, Tg, T9); + T2v = FNMS(KP2_000000000, Tg, T9); + R0[WS(rs, 8)] = FNMS(KP2_000000000, Tw, Th); + R0[WS(rs, 12)] = FMA(KP2_000000000, T2w, T2v); + R0[0] = FMA(KP2_000000000, Tw, Th); + R0[WS(rs, 4)] = FNMS(KP2_000000000, T2w, T2v); + } + { + E T2n, T2t, T2s, T2u, T2l, T2o, T2r; + T2l = FNMS(KP2_000000000, T8, T5); + T2n = FNMS(KP2_000000000, T2m, T2l); + T2t = FMA(KP2_000000000, T2m, T2l); + T2o = To - Tv; + T2r = T2p - T2q; + T2s = T2o - T2r; + T2u = T2o + T2r; + R0[WS(rs, 10)] = FNMS(KP1_414213562, T2s, T2n); + R0[WS(rs, 14)] = FMA(KP1_414213562, T2u, T2t); + R0[WS(rs, 2)] = FMA(KP1_414213562, T2s, T2n); + R0[WS(rs, 6)] = FNMS(KP1_414213562, T2u, T2t); + } + { + E TR, T1j, T1i, T1k; + { + E TF, TQ, T18, T1h; + TF = FMA(KP1_414213562, TE, Tz); + TQ = FNMS(KP414213562, TP, TK); + TR = FMA(KP1_847759065, TQ, TF); + T1j = FNMS(KP1_847759065, TQ, TF); + T18 = FMA(KP707106781, T17, TW); + T1h = FMA(KP707106781, T1g, T1d); + T1i = FNMS(KP198912367, T1h, T18); + T1k = FMA(KP198912367, T18, T1h); + } + R1[WS(rs, 8)] = FNMS(KP1_961570560, T1i, TR); + R1[WS(rs, 12)] = FMA(KP1_961570560, T1k, T1j); + R1[0] = FMA(KP1_961570560, T1i, TR); + R1[WS(rs, 4)] = FNMS(KP1_961570560, T1k, T1j); + } + { + E T2f, T2j, T2i, T2k; + { + E T2d, T2e, T2g, T2h; + T2d = FMA(KP2_000000000, T1S, T1R); + T2e = T1U + T1X; + T2f = FNMS(KP1_414213562, T2e, T2d); + T2j = FMA(KP1_414213562, T2e, T2d); + T2g = T28 - T25; + T2h = T20 - T23; + T2i = FNMS(KP414213562, T2h, T2g); + T2k = FMA(KP414213562, T2g, T2h); + } + R0[WS(rs, 3)] = FNMS(KP1_847759065, T2i, T2f); + R0[WS(rs, 15)] = FMA(KP1_847759065, T2k, T2j); + R0[WS(rs, 11)] = FMA(KP1_847759065, T2i, T2f); + R0[WS(rs, 7)] = FNMS(KP1_847759065, T2k, T2j); + } + { + E T1n, T1r, T1q, T1s; + { + E T1l, T1m, T1o, T1p; + T1l = FNMS(KP1_414213562, TE, Tz); + T1m = FMA(KP414213562, TK, TP); + T1n = FNMS(KP1_847759065, T1m, T1l); + T1r = FMA(KP1_847759065, T1m, T1l); + T1o = FNMS(KP707106781, T1g, T1d); + T1p = FNMS(KP707106781, T17, TW); + T1q = FNMS(KP668178637, T1p, T1o); + T1s = FMA(KP668178637, T1o, T1p); + } + R1[WS(rs, 2)] = FNMS(KP1_662939224, T1q, T1n); + R1[WS(rs, 14)] = FMA(KP1_662939224, T1s, T1r); + R1[WS(rs, 10)] = FMA(KP1_662939224, T1q, T1n); + R1[WS(rs, 6)] = FNMS(KP1_662939224, T1s, T1r); + } + { + E T1L, T1P, T1O, T1Q; + { + E T1J, T1K, T1M, T1N; + T1J = FMA(KP1_414213562, T1u, T1t); + T1K = FMA(KP414213562, T1w, T1x); + T1L = FNMS(KP1_847759065, T1K, T1J); + T1P = FMA(KP1_847759065, T1K, T1J); + T1M = FMA(KP707106781, T1E, T1D); + T1N = FMA(KP707106781, T1B, T1A); + T1O = FNMS(KP198912367, T1N, T1M); + T1Q = FMA(KP198912367, T1M, T1N); + } + R1[WS(rs, 3)] = FNMS(KP1_961570560, T1O, T1L); + R1[WS(rs, 15)] = FMA(KP1_961570560, T1Q, T1P); + R1[WS(rs, 11)] = FMA(KP1_961570560, T1O, T1L); + R1[WS(rs, 7)] = FNMS(KP1_961570560, T1Q, T1P); + } + { + E T1Z, T2b, T2a, T2c; + { + E T1T, T1Y, T24, T29; + T1T = FNMS(KP2_000000000, T1S, T1R); + T1Y = T1U - T1X; + T1Z = FMA(KP1_414213562, T1Y, T1T); + T2b = FNMS(KP1_414213562, T1Y, T1T); + T24 = T20 + T23; + T29 = T25 + T28; + T2a = FNMS(KP414213562, T29, T24); + T2c = FMA(KP414213562, T24, T29); + } + R0[WS(rs, 9)] = FNMS(KP1_847759065, T2a, T1Z); + R0[WS(rs, 13)] = FMA(KP1_847759065, T2c, T2b); + R0[WS(rs, 1)] = FMA(KP1_847759065, T2a, T1Z); + R0[WS(rs, 5)] = FNMS(KP1_847759065, T2c, T2b); + } + { + E T1z, T1H, T1G, T1I; + { + E T1v, T1y, T1C, T1F; + T1v = FNMS(KP1_414213562, T1u, T1t); + T1y = FNMS(KP414213562, T1x, T1w); + T1z = FNMS(KP1_847759065, T1y, T1v); + T1H = FMA(KP1_847759065, T1y, T1v); + T1C = FNMS(KP707106781, T1B, T1A); + T1F = FNMS(KP707106781, T1E, T1D); + T1G = FNMS(KP668178637, T1F, T1C); + T1I = FMA(KP668178637, T1C, T1F); + } + R1[WS(rs, 9)] = FNMS(KP1_662939224, T1G, T1z); + R1[WS(rs, 13)] = FMA(KP1_662939224, T1I, T1H); + R1[WS(rs, 1)] = FMA(KP1_662939224, T1G, T1z); + R1[WS(rs, 5)] = FNMS(KP1_662939224, T1I, T1H); + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cb_32", {72, 0, 84, 0}, &GENUS }; + +void X(codelet_r2cb_32) (planner *p) { + X(kr2c_register) (p, r2cb_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 32 -name r2cb_32 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 156 FP additions, 50 FP multiplications, + * (or, 140 additions, 34 multiplications, 16 fused multiply/add), + * 54 stack variables, 9 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T9, T2c, TB, T1y, T6, T2b, Ty, T1v, Th, T2e, T2f, TD, TK, T1C, T1F; + E T1h, Tp, T2i, T2m, TN, T13, T1K, T1Y, T1k, Tw, TU, T1l, TW, T1V, T2j; + E T1R, T2l; + { + E T7, T8, T1w, Tz, TA, T1x; + T7 = Cr[WS(csr, 4)]; + T8 = Cr[WS(csr, 12)]; + T1w = T7 - T8; + Tz = Ci[WS(csi, 4)]; + TA = Ci[WS(csi, 12)]; + T1x = Tz + TA; + T9 = KP2_000000000 * (T7 + T8); + T2c = KP1_414213562 * (T1w + T1x); + TB = KP2_000000000 * (Tz - TA); + T1y = KP1_414213562 * (T1w - T1x); + } + { + E T5, T1u, T3, T1s; + { + E T4, T1t, T1, T2; + T4 = Cr[WS(csr, 8)]; + T5 = KP2_000000000 * T4; + T1t = Ci[WS(csi, 8)]; + T1u = KP2_000000000 * T1t; + T1 = Cr[0]; + T2 = Cr[WS(csr, 16)]; + T3 = T1 + T2; + T1s = T1 - T2; + } + T6 = T3 + T5; + T2b = T1s + T1u; + Ty = T3 - T5; + T1v = T1s - T1u; + } + { + E Td, T1A, TG, T1E, Tg, T1D, TJ, T1B; + { + E Tb, Tc, TE, TF; + Tb = Cr[WS(csr, 2)]; + Tc = Cr[WS(csr, 14)]; + Td = Tb + Tc; + T1A = Tb - Tc; + TE = Ci[WS(csi, 2)]; + TF = Ci[WS(csi, 14)]; + TG = TE - TF; + T1E = TE + TF; + } + { + E Te, Tf, TH, TI; + Te = Cr[WS(csr, 10)]; + Tf = Cr[WS(csr, 6)]; + Tg = Te + Tf; + T1D = Te - Tf; + TH = Ci[WS(csi, 10)]; + TI = Ci[WS(csi, 6)]; + TJ = TH - TI; + T1B = TH + TI; + } + Th = KP2_000000000 * (Td + Tg); + T2e = T1A + T1B; + T2f = T1E - T1D; + TD = Td - Tg; + TK = TG - TJ; + T1C = T1A - T1B; + T1F = T1D + T1E; + T1h = KP2_000000000 * (TJ + TG); + } + { + E Tl, T1I, TZ, T1X, To, T1W, T12, T1J; + { + E Tj, Tk, TX, TY; + Tj = Cr[WS(csr, 1)]; + Tk = Cr[WS(csr, 15)]; + Tl = Tj + Tk; + T1I = Tj - Tk; + TX = Ci[WS(csi, 1)]; + TY = Ci[WS(csi, 15)]; + TZ = TX - TY; + T1X = TX + TY; + } + { + E Tm, Tn, T10, T11; + Tm = Cr[WS(csr, 9)]; + Tn = Cr[WS(csr, 7)]; + To = Tm + Tn; + T1W = Tm - Tn; + T10 = Ci[WS(csi, 9)]; + T11 = Ci[WS(csi, 7)]; + T12 = T10 - T11; + T1J = T10 + T11; + } + Tp = Tl + To; + T2i = T1I + T1J; + T2m = T1X - T1W; + TN = Tl - To; + T13 = TZ - T12; + T1K = T1I - T1J; + T1Y = T1W + T1X; + T1k = T12 + TZ; + } + { + E Ts, T1L, TT, T1M, Tv, T1O, TQ, T1P; + { + E Tq, Tr, TR, TS; + Tq = Cr[WS(csr, 5)]; + Tr = Cr[WS(csr, 11)]; + Ts = Tq + Tr; + T1L = Tq - Tr; + TR = Ci[WS(csi, 5)]; + TS = Ci[WS(csi, 11)]; + TT = TR - TS; + T1M = TR + TS; + } + { + E Tt, Tu, TO, TP; + Tt = Cr[WS(csr, 3)]; + Tu = Cr[WS(csr, 13)]; + Tv = Tt + Tu; + T1O = Tt - Tu; + TO = Ci[WS(csi, 13)]; + TP = Ci[WS(csi, 3)]; + TQ = TO - TP; + T1P = TP + TO; + } + Tw = Ts + Tv; + TU = TQ - TT; + T1l = TT + TQ; + TW = Ts - Tv; + { + E T1T, T1U, T1N, T1Q; + T1T = T1L + T1M; + T1U = T1O + T1P; + T1V = KP707106781 * (T1T - T1U); + T2j = KP707106781 * (T1T + T1U); + T1N = T1L - T1M; + T1Q = T1O - T1P; + T1R = KP707106781 * (T1N + T1Q); + T2l = KP707106781 * (T1N - T1Q); + } + } + { + E Tx, T1r, Ti, T1q, Ta; + Tx = KP2_000000000 * (Tp + Tw); + T1r = KP2_000000000 * (T1l + T1k); + Ta = T6 + T9; + Ti = Ta + Th; + T1q = Ta - Th; + R0[WS(rs, 8)] = Ti - Tx; + R0[WS(rs, 12)] = T1q + T1r; + R0[0] = Ti + Tx; + R0[WS(rs, 4)] = T1q - T1r; + } + { + E T1i, T1o, T1n, T1p, T1g, T1j, T1m; + T1g = T6 - T9; + T1i = T1g - T1h; + T1o = T1g + T1h; + T1j = Tp - Tw; + T1m = T1k - T1l; + T1n = KP1_414213562 * (T1j - T1m); + T1p = KP1_414213562 * (T1j + T1m); + R0[WS(rs, 10)] = T1i - T1n; + R0[WS(rs, 14)] = T1o + T1p; + R0[WS(rs, 2)] = T1i + T1n; + R0[WS(rs, 6)] = T1o - T1p; + } + { + E TM, T16, T15, T17; + { + E TC, TL, TV, T14; + TC = Ty - TB; + TL = KP1_414213562 * (TD - TK); + TM = TC + TL; + T16 = TC - TL; + TV = TN + TU; + T14 = TW + T13; + T15 = FNMS(KP765366864, T14, KP1_847759065 * TV); + T17 = FMA(KP765366864, TV, KP1_847759065 * T14); + } + R0[WS(rs, 9)] = TM - T15; + R0[WS(rs, 13)] = T16 + T17; + R0[WS(rs, 1)] = TM + T15; + R0[WS(rs, 5)] = T16 - T17; + } + { + E T2t, T2x, T2w, T2y; + { + E T2r, T2s, T2u, T2v; + T2r = T2b + T2c; + T2s = FMA(KP1_847759065, T2e, KP765366864 * T2f); + T2t = T2r - T2s; + T2x = T2r + T2s; + T2u = T2i + T2j; + T2v = T2m - T2l; + T2w = FNMS(KP1_961570560, T2v, KP390180644 * T2u); + T2y = FMA(KP1_961570560, T2u, KP390180644 * T2v); + } + R1[WS(rs, 11)] = T2t - T2w; + R1[WS(rs, 15)] = T2x + T2y; + R1[WS(rs, 3)] = T2t + T2w; + R1[WS(rs, 7)] = T2x - T2y; + } + { + E T1a, T1e, T1d, T1f; + { + E T18, T19, T1b, T1c; + T18 = Ty + TB; + T19 = KP1_414213562 * (TD + TK); + T1a = T18 - T19; + T1e = T18 + T19; + T1b = TN - TU; + T1c = T13 - TW; + T1d = FNMS(KP1_847759065, T1c, KP765366864 * T1b); + T1f = FMA(KP1_847759065, T1b, KP765366864 * T1c); + } + R0[WS(rs, 11)] = T1a - T1d; + R0[WS(rs, 15)] = T1e + T1f; + R0[WS(rs, 3)] = T1a + T1d; + R0[WS(rs, 7)] = T1e - T1f; + } + { + E T25, T29, T28, T2a; + { + E T23, T24, T26, T27; + T23 = T1v - T1y; + T24 = FMA(KP765366864, T1C, KP1_847759065 * T1F); + T25 = T23 - T24; + T29 = T23 + T24; + T26 = T1K - T1R; + T27 = T1Y - T1V; + T28 = FNMS(KP1_662939224, T27, KP1_111140466 * T26); + T2a = FMA(KP1_662939224, T26, KP1_111140466 * T27); + } + R1[WS(rs, 10)] = T25 - T28; + R1[WS(rs, 14)] = T29 + T2a; + R1[WS(rs, 2)] = T25 + T28; + R1[WS(rs, 6)] = T29 - T2a; + } + { + E T2h, T2p, T2o, T2q; + { + E T2d, T2g, T2k, T2n; + T2d = T2b - T2c; + T2g = FNMS(KP1_847759065, T2f, KP765366864 * T2e); + T2h = T2d + T2g; + T2p = T2d - T2g; + T2k = T2i - T2j; + T2n = T2l + T2m; + T2o = FNMS(KP1_111140466, T2n, KP1_662939224 * T2k); + T2q = FMA(KP1_111140466, T2k, KP1_662939224 * T2n); + } + R1[WS(rs, 9)] = T2h - T2o; + R1[WS(rs, 13)] = T2p + T2q; + R1[WS(rs, 1)] = T2h + T2o; + R1[WS(rs, 5)] = T2p - T2q; + } + { + E T1H, T21, T20, T22; + { + E T1z, T1G, T1S, T1Z; + T1z = T1v + T1y; + T1G = FNMS(KP765366864, T1F, KP1_847759065 * T1C); + T1H = T1z + T1G; + T21 = T1z - T1G; + T1S = T1K + T1R; + T1Z = T1V + T1Y; + T20 = FNMS(KP390180644, T1Z, KP1_961570560 * T1S); + T22 = FMA(KP390180644, T1S, KP1_961570560 * T1Z); + } + R1[WS(rs, 8)] = T1H - T20; + R1[WS(rs, 12)] = T21 + T22; + R1[0] = T1H + T20; + R1[WS(rs, 4)] = T21 - T22; + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cb_32", {140, 34, 16, 0}, &GENUS }; + +void X(codelet_r2cb_32) (planner *p) { + X(kr2c_register) (p, r2cb_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_4.c new file mode 100644 index 000000000..1342b7c4d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_4.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -name r2cb_4 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 2 additions, 0 multiplications, 4 fused multiply/add), + * 8 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T4, T6, T3, T5, T1, T2; + T4 = Cr[WS(csr, 1)]; + T6 = Ci[WS(csi, 1)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 2)]; + T3 = T1 + T2; + T5 = T1 - T2; + R0[WS(rs, 1)] = FNMS(KP2_000000000, T4, T3); + R1[WS(rs, 1)] = FMA(KP2_000000000, T6, T5); + R0[0] = FMA(KP2_000000000, T4, T3); + R1[0] = FNMS(KP2_000000000, T6, T5); + } + } +} + +static const kr2c_desc desc = { 4, "r2cb_4", {2, 0, 4, 0}, &GENUS }; + +void X(codelet_r2cb_4) (planner *p) { + X(kr2c_register) (p, r2cb_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 4 -name r2cb_4 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 6 FP additions, 2 FP multiplications, + * (or, 6 additions, 2 multiplications, 0 fused multiply/add), + * 10 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T5, T8, T3, T6; + { + E T4, T7, T1, T2; + T4 = Cr[WS(csr, 1)]; + T5 = KP2_000000000 * T4; + T7 = Ci[WS(csi, 1)]; + T8 = KP2_000000000 * T7; + T1 = Cr[0]; + T2 = Cr[WS(csr, 2)]; + T3 = T1 + T2; + T6 = T1 - T2; + } + R0[WS(rs, 1)] = T3 - T5; + R1[WS(rs, 1)] = T6 + T8; + R0[0] = T3 + T5; + R1[0] = T6 - T8; + } + } +} + +static const kr2c_desc desc = { 4, "r2cb_4", {6, 2, 0, 0}, &GENUS }; + +void X(codelet_r2cb_4) (planner *p) { + X(kr2c_register) (p, r2cb_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_5.c new file mode 100644 index 000000000..4b03ad830 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_5.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 5 -name r2cb_5 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 12 FP additions, 10 FP multiplications, + * (or, 2 additions, 0 multiplications, 10 fused multiply/add), + * 18 stack variables, 5 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E Ta, Tc, T1, T4, T5, T6, Tb, T7; + { + E T8, T9, T2, T3; + T8 = Ci[WS(csi, 1)]; + T9 = Ci[WS(csi, 2)]; + Ta = FMA(KP618033988, T9, T8); + Tc = FMS(KP618033988, T8, T9); + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[WS(csr, 2)]; + T4 = T2 + T3; + T5 = FNMS(KP500000000, T4, T1); + T6 = T2 - T3; + } + R0[0] = FMA(KP2_000000000, T4, T1); + Tb = FNMS(KP1_118033988, T6, T5); + R0[WS(rs, 1)] = FNMS(KP1_902113032, Tc, Tb); + R1[WS(rs, 1)] = FMA(KP1_902113032, Tc, Tb); + T7 = FMA(KP1_118033988, T6, T5); + R1[0] = FNMS(KP1_902113032, Ta, T7); + R0[WS(rs, 2)] = FMA(KP1_902113032, Ta, T7); + } + } +} + +static const kr2c_desc desc = { 5, "r2cb_5", {2, 0, 10, 0}, &GENUS }; + +void X(codelet_r2cb_5) (planner *p) { + X(kr2c_register) (p, r2cb_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 5 -name r2cb_5 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 12 FP additions, 7 FP multiplications, + * (or, 8 additions, 3 multiplications, 4 fused multiply/add), + * 18 stack variables, 5 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_118033988, +1.118033988749894848204586834365638117720309180); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_902113032, +1.902113032590307144232878666758764286811397268); + DK(KP1_175570504, +1.175570504584946258337411909278145537195304875); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E Ta, Tc, T1, T4, T5, T6, Tb, T7; + { + E T8, T9, T2, T3; + T8 = Ci[WS(csi, 1)]; + T9 = Ci[WS(csi, 2)]; + Ta = FNMS(KP1_902113032, T9, KP1_175570504 * T8); + Tc = FMA(KP1_902113032, T8, KP1_175570504 * T9); + T1 = Cr[0]; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[WS(csr, 2)]; + T4 = T2 + T3; + T5 = FNMS(KP500000000, T4, T1); + T6 = KP1_118033988 * (T2 - T3); + } + R0[0] = FMA(KP2_000000000, T4, T1); + Tb = T6 + T5; + R1[0] = Tb - Tc; + R0[WS(rs, 2)] = Tb + Tc; + T7 = T5 - T6; + R0[WS(rs, 1)] = T7 - Ta; + R1[WS(rs, 1)] = T7 + Ta; + } + } +} + +static const kr2c_desc desc = { 5, "r2cb_5", {8, 3, 4, 0}, &GENUS }; + +void X(codelet_r2cb_5) (planner *p) { + X(kr2c_register) (p, r2cb_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_6.c new file mode 100644 index 000000000..a2fb8373b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_6.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -name r2cb_6 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 14 FP additions, 6 FP multiplications, + * (or, 8 additions, 0 multiplications, 6 fused multiply/add), + * 17 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T3, T7, Tc, Te, T6, T8, T1, T2, T9, Td; + T1 = Cr[0]; + T2 = Cr[WS(csr, 3)]; + T3 = T1 + T2; + T7 = T1 - T2; + { + E Ta, Tb, T4, T5; + Ta = Ci[WS(csi, 2)]; + Tb = Ci[WS(csi, 1)]; + Tc = Ta - Tb; + Te = Ta + Tb; + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 1)]; + T6 = T4 + T5; + T8 = T5 - T4; + } + R0[0] = FMA(KP2_000000000, T6, T3); + R1[WS(rs, 1)] = FNMS(KP2_000000000, T8, T7); + T9 = T3 - T6; + R0[WS(rs, 2)] = FNMS(KP1_732050807, Tc, T9); + R0[WS(rs, 1)] = FMA(KP1_732050807, Tc, T9); + Td = T7 + T8; + R1[0] = FNMS(KP1_732050807, Te, Td); + R1[WS(rs, 2)] = FMA(KP1_732050807, Te, Td); + } + } +} + +static const kr2c_desc desc = { 6, "r2cb_6", {8, 0, 6, 0}, &GENUS }; + +void X(codelet_r2cb_6) (planner *p) { + X(kr2c_register) (p, r2cb_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 6 -name r2cb_6 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 14 FP additions, 4 FP multiplications, + * (or, 12 additions, 2 multiplications, 2 fused multiply/add), + * 17 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T3, T7, Tc, Te, T6, T8, T1, T2, T9, Td; + T1 = Cr[0]; + T2 = Cr[WS(csr, 3)]; + T3 = T1 - T2; + T7 = T1 + T2; + { + E Ta, Tb, T4, T5; + Ta = Ci[WS(csi, 2)]; + Tb = Ci[WS(csi, 1)]; + Tc = KP1_732050807 * (Ta - Tb); + Te = KP1_732050807 * (Ta + Tb); + T4 = Cr[WS(csr, 2)]; + T5 = Cr[WS(csr, 1)]; + T6 = T4 - T5; + T8 = T4 + T5; + } + R1[WS(rs, 1)] = FMA(KP2_000000000, T6, T3); + R0[0] = FMA(KP2_000000000, T8, T7); + T9 = T7 - T8; + R0[WS(rs, 2)] = T9 - Tc; + R0[WS(rs, 1)] = T9 + Tc; + Td = T3 - T6; + R1[0] = Td - Te; + R1[WS(rs, 2)] = Td + Te; + } + } +} + +static const kr2c_desc desc = { 6, "r2cb_6", {12, 2, 2, 0}, &GENUS }; + +void X(codelet_r2cb_6) (planner *p) { + X(kr2c_register) (p, r2cb_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_64.c new file mode 100644 index 000000000..1fff857cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_64.c @@ -0,0 +1,1412 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 64 -name r2cb_64 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 394 FP additions, 216 FP multiplications, + * (or, 178 additions, 0 multiplications, 216 fused multiply/add), + * 109 stack variables, 18 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E T9, T5H, T4p, T5j, T1b, T2T, T3j, T3Z, Tg, T5I, T1m, T2U, T3m, T40, T4u; + E T5k, T1s, T3o, T3r, T1J, To, Tv, T5K, T5L, T5M, T5N, T4A, T5n, T1D, T3s; + E T4F, T5m, T1M, T3p, T1U, T3w, T3H, T2z, TM, T5Q, T5Y, T6f, T4M, T5q, T25; + E T3I, T53, T5t, T2C, T3x, T11, T5V, T4W, T55, T5T, T6g, T2h, T2E, T2s, T2F; + E T3E, T3L, T4R, T54, T3B, T3K; + { + E T4, T14, T3, T13, T8, T16, T19, T4o, T1, T2, T5, T4n; + T4 = Cr[WS(csr, 16)]; + T14 = Ci[WS(csi, 16)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 32)]; + T3 = T1 + T2; + T13 = T1 - T2; + { + E T6, T7, T17, T18; + T6 = Cr[WS(csr, 8)]; + T7 = Cr[WS(csr, 24)]; + T8 = T6 + T7; + T16 = T6 - T7; + T17 = Ci[WS(csi, 8)]; + T18 = Ci[WS(csi, 24)]; + T19 = T17 + T18; + T4o = T17 - T18; + } + T5 = FMA(KP2_000000000, T4, T3); + T9 = FMA(KP2_000000000, T8, T5); + T5H = FNMS(KP2_000000000, T8, T5); + T4n = FNMS(KP2_000000000, T4, T3); + T4p = FNMS(KP2_000000000, T4o, T4n); + T5j = FMA(KP2_000000000, T4o, T4n); + { + E T15, T1a, T3h, T3i; + T15 = FNMS(KP2_000000000, T14, T13); + T1a = T16 - T19; + T1b = FMA(KP1_414213562, T1a, T15); + T2T = FNMS(KP1_414213562, T1a, T15); + T3h = FMA(KP2_000000000, T14, T13); + T3i = T16 + T19; + T3j = FNMS(KP1_414213562, T3i, T3h); + T3Z = FMA(KP1_414213562, T3i, T3h); + } + } + { + E Tc, T1c, T1k, T4r, Tf, T1h, T1f, T4s, T1g, T1l; + { + E Ta, Tb, T1i, T1j; + Ta = Cr[WS(csr, 4)]; + Tb = Cr[WS(csr, 28)]; + Tc = Ta + Tb; + T1c = Ta - Tb; + T1i = Ci[WS(csi, 4)]; + T1j = Ci[WS(csi, 28)]; + T1k = T1i + T1j; + T4r = T1i - T1j; + } + { + E Td, Te, T1d, T1e; + Td = Cr[WS(csr, 20)]; + Te = Cr[WS(csr, 12)]; + Tf = Td + Te; + T1h = Td - Te; + T1d = Ci[WS(csi, 20)]; + T1e = Ci[WS(csi, 12)]; + T1f = T1d + T1e; + T4s = T1d - T1e; + } + Tg = Tc + Tf; + T5I = T4s + T4r; + T1g = T1c - T1f; + T1l = T1h + T1k; + T1m = FNMS(KP414213562, T1l, T1g); + T2U = FMA(KP414213562, T1g, T1l); + { + E T3k, T3l, T4q, T4t; + T3k = T1k - T1h; + T3l = T1c + T1f; + T3m = FNMS(KP414213562, T3l, T3k); + T40 = FMA(KP414213562, T3k, T3l); + T4q = Tc - Tf; + T4t = T4r - T4s; + T4u = T4q - T4t; + T5k = T4q + T4t; + } + } + { + E Tk, T1o, T1I, T4C, Tn, T1F, T1r, T4D, Tr, T1t, T1w, T4y, Tu, T1y, T1B; + E T4x; + { + E Ti, Tj, T1G, T1H; + Ti = Cr[WS(csr, 2)]; + Tj = Cr[WS(csr, 30)]; + Tk = Ti + Tj; + T1o = Ti - Tj; + T1G = Ci[WS(csi, 2)]; + T1H = Ci[WS(csi, 30)]; + T1I = T1G + T1H; + T4C = T1G - T1H; + } + { + E Tl, Tm, T1p, T1q; + Tl = Cr[WS(csr, 18)]; + Tm = Cr[WS(csr, 14)]; + Tn = Tl + Tm; + T1F = Tl - Tm; + T1p = Ci[WS(csi, 18)]; + T1q = Ci[WS(csi, 14)]; + T1r = T1p + T1q; + T4D = T1p - T1q; + } + { + E Tp, Tq, T1u, T1v; + Tp = Cr[WS(csr, 10)]; + Tq = Cr[WS(csr, 22)]; + Tr = Tp + Tq; + T1t = Tp - Tq; + T1u = Ci[WS(csi, 10)]; + T1v = Ci[WS(csi, 22)]; + T1w = T1u + T1v; + T4y = T1u - T1v; + } + { + E Ts, Tt, T1z, T1A; + Ts = Cr[WS(csr, 6)]; + Tt = Cr[WS(csr, 26)]; + Tu = Ts + Tt; + T1y = Ts - Tt; + T1z = Ci[WS(csi, 6)]; + T1A = Ci[WS(csi, 26)]; + T1B = T1z + T1A; + T4x = T1A - T1z; + } + T1s = T1o - T1r; + T3o = T1o + T1r; + T3r = T1I - T1F; + T1J = T1F + T1I; + To = Tk + Tn; + Tv = Tr + Tu; + T5K = To - Tv; + { + E T4w, T4z, T1x, T1C; + T5L = T4D + T4C; + T5M = T4y + T4x; + T5N = T5L - T5M; + T4w = Tk - Tn; + T4z = T4x - T4y; + T4A = T4w + T4z; + T5n = T4w - T4z; + T1x = T1t - T1w; + T1C = T1y - T1B; + T1D = T1x + T1C; + T3s = T1C - T1x; + { + E T4B, T4E, T1K, T1L; + T4B = Tr - Tu; + T4E = T4C - T4D; + T4F = T4B + T4E; + T5m = T4E - T4B; + T1K = T1t + T1w; + T1L = T1y + T1B; + T1M = T1K - T1L; + T3p = T1K + T1L; + } + } + } + { + E TA, T1Q, T2y, T50, TD, T2v, T1T, T51, TH, T1V, T1Y, T4K, TK, T20, T23; + E T4J; + { + E Ty, Tz, T2w, T2x; + Ty = Cr[WS(csr, 1)]; + Tz = Cr[WS(csr, 31)]; + TA = Ty + Tz; + T1Q = Ty - Tz; + T2w = Ci[WS(csi, 1)]; + T2x = Ci[WS(csi, 31)]; + T2y = T2w + T2x; + T50 = T2w - T2x; + } + { + E TB, TC, T1R, T1S; + TB = Cr[WS(csr, 17)]; + TC = Cr[WS(csr, 15)]; + TD = TB + TC; + T2v = TB - TC; + T1R = Ci[WS(csi, 17)]; + T1S = Ci[WS(csi, 15)]; + T1T = T1R + T1S; + T51 = T1R - T1S; + } + { + E TF, TG, T1W, T1X; + TF = Cr[WS(csr, 9)]; + TG = Cr[WS(csr, 23)]; + TH = TF + TG; + T1V = TF - TG; + T1W = Ci[WS(csi, 9)]; + T1X = Ci[WS(csi, 23)]; + T1Y = T1W + T1X; + T4K = T1W - T1X; + } + { + E TI, TJ, T21, T22; + TI = Cr[WS(csr, 7)]; + TJ = Cr[WS(csr, 25)]; + TK = TI + TJ; + T20 = TI - TJ; + T21 = Ci[WS(csi, 7)]; + T22 = Ci[WS(csi, 25)]; + T23 = T21 + T22; + T4J = T22 - T21; + } + { + E TE, TL, T1Z, T24; + T1U = T1Q - T1T; + T3w = T1Q + T1T; + T3H = T2y - T2v; + T2z = T2v + T2y; + TE = TA + TD; + TL = TH + TK; + TM = TE + TL; + T5Q = TE - TL; + { + E T5W, T5X, T4I, T4L; + T5W = T51 + T50; + T5X = T4K + T4J; + T5Y = T5W - T5X; + T6f = T5X + T5W; + T4I = TA - TD; + T4L = T4J - T4K; + T4M = T4I + T4L; + T5q = T4I - T4L; + } + T1Z = T1V - T1Y; + T24 = T20 - T23; + T25 = T1Z + T24; + T3I = T24 - T1Z; + { + E T4Z, T52, T2A, T2B; + T4Z = TH - TK; + T52 = T50 - T51; + T53 = T4Z + T52; + T5t = T52 - T4Z; + T2A = T1V + T1Y; + T2B = T20 + T23; + T2C = T2A - T2B; + T3x = T2A + T2B; + } + } + } + { + E TP, T27, T2f, T4O, TS, T2c, T2a, T4P, TW, T2i, T2q, T4T, TZ, T2n, T2l; + E T4U; + { + E TN, TO, T2d, T2e; + TN = Cr[WS(csr, 5)]; + TO = Cr[WS(csr, 27)]; + TP = TN + TO; + T27 = TN - TO; + T2d = Ci[WS(csi, 5)]; + T2e = Ci[WS(csi, 27)]; + T2f = T2d + T2e; + T4O = T2d - T2e; + } + { + E TQ, TR, T28, T29; + TQ = Cr[WS(csr, 21)]; + TR = Cr[WS(csr, 11)]; + TS = TQ + TR; + T2c = TQ - TR; + T28 = Ci[WS(csi, 21)]; + T29 = Ci[WS(csi, 11)]; + T2a = T28 + T29; + T4P = T28 - T29; + } + { + E TU, TV, T2o, T2p; + TU = Cr[WS(csr, 3)]; + TV = Cr[WS(csr, 29)]; + TW = TU + TV; + T2i = TU - TV; + T2o = Ci[WS(csi, 3)]; + T2p = Ci[WS(csi, 29)]; + T2q = T2o + T2p; + T4T = T2p - T2o; + } + { + E TX, TY, T2j, T2k; + TX = Cr[WS(csr, 13)]; + TY = Cr[WS(csr, 19)]; + TZ = TX + TY; + T2n = TX - TY; + T2j = Ci[WS(csi, 13)]; + T2k = Ci[WS(csi, 19)]; + T2l = T2j + T2k; + T4U = T2j - T2k; + } + { + E TT, T10, T4S, T4V; + TT = TP + TS; + T10 = TW + TZ; + T11 = TT + T10; + T5V = TT - T10; + T4S = TW - TZ; + T4V = T4T - T4U; + T4W = T4S + T4V; + T55 = T4V - T4S; + } + { + E T5R, T5S, T2b, T2g; + T5R = T4U + T4T; + T5S = T4P + T4O; + T5T = T5R - T5S; + T6g = T5S + T5R; + T2b = T27 - T2a; + T2g = T2c + T2f; + T2h = FNMS(KP414213562, T2g, T2b); + T2E = FMA(KP414213562, T2b, T2g); + } + { + E T2m, T2r, T3C, T3D; + T2m = T2i - T2l; + T2r = T2n - T2q; + T2s = FMA(KP414213562, T2r, T2m); + T2F = FNMS(KP414213562, T2m, T2r); + T3C = T2n + T2q; + T3D = T2i + T2l; + T3E = FNMS(KP414213562, T3D, T3C); + T3L = FMA(KP414213562, T3C, T3D); + } + { + E T4N, T4Q, T3z, T3A; + T4N = TP - TS; + T4Q = T4O - T4P; + T4R = T4N - T4Q; + T54 = T4N + T4Q; + T3z = T2f - T2c; + T3A = T27 + T2a; + T3B = FNMS(KP414213562, T3A, T3z); + T3K = FMA(KP414213562, T3z, T3A); + } + } + { + E T12, T6m, Tx, T6l, Th, Tw; + T12 = TM + T11; + T6m = T6g + T6f; + Th = FMA(KP2_000000000, Tg, T9); + Tw = To + Tv; + Tx = FMA(KP2_000000000, Tw, Th); + T6l = FNMS(KP2_000000000, Tw, Th); + R0[WS(rs, 16)] = FNMS(KP2_000000000, T12, Tx); + R0[WS(rs, 24)] = FMA(KP2_000000000, T6m, T6l); + R0[0] = FMA(KP2_000000000, T12, Tx); + R0[WS(rs, 8)] = FNMS(KP2_000000000, T6m, T6l); + } + { + E T65, T69, T68, T6a; + { + E T63, T64, T66, T67; + T63 = FMA(KP2_000000000, T5I, T5H); + T64 = T5K + T5N; + T65 = FNMS(KP1_414213562, T64, T63); + T69 = FMA(KP1_414213562, T64, T63); + T66 = T5Y - T5V; + T67 = T5Q - T5T; + T68 = FNMS(KP414213562, T67, T66); + T6a = FMA(KP414213562, T66, T67); + } + R0[WS(rs, 6)] = FNMS(KP1_847759065, T68, T65); + R0[WS(rs, 30)] = FMA(KP1_847759065, T6a, T69); + R0[WS(rs, 22)] = FMA(KP1_847759065, T68, T65); + R0[WS(rs, 14)] = FNMS(KP1_847759065, T6a, T69); + } + { + E T6d, T6j, T6i, T6k; + { + E T6b, T6c, T6e, T6h; + T6b = FNMS(KP2_000000000, Tg, T9); + T6c = T5M + T5L; + T6d = FNMS(KP2_000000000, T6c, T6b); + T6j = FMA(KP2_000000000, T6c, T6b); + T6e = TM - T11; + T6h = T6f - T6g; + T6i = T6e - T6h; + T6k = T6e + T6h; + } + R0[WS(rs, 20)] = FNMS(KP1_414213562, T6i, T6d); + R0[WS(rs, 28)] = FMA(KP1_414213562, T6k, T6j); + R0[WS(rs, 4)] = FMA(KP1_414213562, T6i, T6d); + R0[WS(rs, 12)] = FNMS(KP1_414213562, T6k, T6j); + } + { + E T5P, T61, T60, T62; + { + E T5J, T5O, T5U, T5Z; + T5J = FNMS(KP2_000000000, T5I, T5H); + T5O = T5K - T5N; + T5P = FMA(KP1_414213562, T5O, T5J); + T61 = FNMS(KP1_414213562, T5O, T5J); + T5U = T5Q + T5T; + T5Z = T5V + T5Y; + T60 = FNMS(KP414213562, T5Z, T5U); + T62 = FMA(KP414213562, T5U, T5Z); + } + R0[WS(rs, 18)] = FNMS(KP1_847759065, T60, T5P); + R0[WS(rs, 26)] = FMA(KP1_847759065, T62, T61); + R0[WS(rs, 2)] = FMA(KP1_847759065, T60, T5P); + R0[WS(rs, 10)] = FNMS(KP1_847759065, T62, T61); + } + { + E T4Y, T5f, T57, T5e, T4H, T59, T5d, T5h, T4X, T56; + T4X = T4R + T4W; + T4Y = FMA(KP707106781, T4X, T4M); + T5f = FNMS(KP707106781, T4X, T4M); + T56 = T54 + T55; + T57 = FMA(KP707106781, T56, T53); + T5e = FNMS(KP707106781, T56, T53); + { + E T4v, T4G, T5b, T5c; + T4v = FMA(KP1_414213562, T4u, T4p); + T4G = FNMS(KP414213562, T4F, T4A); + T4H = FMA(KP1_847759065, T4G, T4v); + T59 = FNMS(KP1_847759065, T4G, T4v); + T5b = FNMS(KP1_414213562, T4u, T4p); + T5c = FMA(KP414213562, T4A, T4F); + T5d = FNMS(KP1_847759065, T5c, T5b); + T5h = FMA(KP1_847759065, T5c, T5b); + } + { + E T58, T5i, T5a, T5g; + T58 = FNMS(KP198912367, T57, T4Y); + R0[WS(rs, 17)] = FNMS(KP1_961570560, T58, T4H); + R0[WS(rs, 1)] = FMA(KP1_961570560, T58, T4H); + T5i = FMA(KP668178637, T5e, T5f); + R0[WS(rs, 13)] = FNMS(KP1_662939224, T5i, T5h); + R0[WS(rs, 29)] = FMA(KP1_662939224, T5i, T5h); + T5a = FMA(KP198912367, T4Y, T57); + R0[WS(rs, 9)] = FNMS(KP1_961570560, T5a, T59); + R0[WS(rs, 25)] = FMA(KP1_961570560, T5a, T59); + T5g = FNMS(KP668178637, T5f, T5e); + R0[WS(rs, 5)] = FNMS(KP1_662939224, T5g, T5d); + R0[WS(rs, 21)] = FMA(KP1_662939224, T5g, T5d); + } + } + { + E T5s, T5D, T5v, T5C, T5p, T5x, T5B, T5F, T5r, T5u; + T5r = T54 - T55; + T5s = FNMS(KP707106781, T5r, T5q); + T5D = FMA(KP707106781, T5r, T5q); + T5u = T4W - T4R; + T5v = FNMS(KP707106781, T5u, T5t); + T5C = FMA(KP707106781, T5u, T5t); + { + E T5l, T5o, T5z, T5A; + T5l = FNMS(KP1_414213562, T5k, T5j); + T5o = FNMS(KP414213562, T5n, T5m); + T5p = FNMS(KP1_847759065, T5o, T5l); + T5x = FMA(KP1_847759065, T5o, T5l); + T5z = FMA(KP1_414213562, T5k, T5j); + T5A = FMA(KP414213562, T5m, T5n); + T5B = FNMS(KP1_847759065, T5A, T5z); + T5F = FMA(KP1_847759065, T5A, T5z); + } + { + E T5w, T5G, T5y, T5E; + T5w = FNMS(KP668178637, T5v, T5s); + R0[WS(rs, 19)] = FNMS(KP1_662939224, T5w, T5p); + R0[WS(rs, 3)] = FMA(KP1_662939224, T5w, T5p); + T5G = FMA(KP198912367, T5C, T5D); + R0[WS(rs, 15)] = FNMS(KP1_961570560, T5G, T5F); + R0[WS(rs, 31)] = FMA(KP1_961570560, T5G, T5F); + T5y = FMA(KP668178637, T5s, T5v); + R0[WS(rs, 11)] = FNMS(KP1_662939224, T5y, T5x); + R0[WS(rs, 27)] = FMA(KP1_662939224, T5y, T5x); + T5E = FNMS(KP198912367, T5D, T5C); + R0[WS(rs, 7)] = FNMS(KP1_961570560, T5E, T5B); + R0[WS(rs, 23)] = FMA(KP1_961570560, T5E, T5B); + } + } + { + E T3n, T3R, T3u, T3S, T3G, T3V, T3N, T3U, T3q, T3t; + T3n = FNMS(KP1_847759065, T3m, T3j); + T3R = FMA(KP1_847759065, T3m, T3j); + T3q = FNMS(KP707106781, T3p, T3o); + T3t = FNMS(KP707106781, T3s, T3r); + T3u = FNMS(KP668178637, T3t, T3q); + T3S = FMA(KP668178637, T3q, T3t); + { + E T3y, T3F, T3J, T3M; + T3y = FNMS(KP707106781, T3x, T3w); + T3F = T3B + T3E; + T3G = FNMS(KP923879532, T3F, T3y); + T3V = FMA(KP923879532, T3F, T3y); + T3J = FNMS(KP707106781, T3I, T3H); + T3M = T3K - T3L; + T3N = FMA(KP923879532, T3M, T3J); + T3U = FNMS(KP923879532, T3M, T3J); + } + { + E T3v, T3O, T3X, T3Y; + T3v = FMA(KP1_662939224, T3u, T3n); + T3O = FNMS(KP303346683, T3N, T3G); + R1[WS(rs, 17)] = FNMS(KP1_913880671, T3O, T3v); + R1[WS(rs, 1)] = FMA(KP1_913880671, T3O, T3v); + T3X = FMA(KP1_662939224, T3S, T3R); + T3Y = FMA(KP534511135, T3U, T3V); + R1[WS(rs, 13)] = FNMS(KP1_763842528, T3Y, T3X); + R1[WS(rs, 29)] = FMA(KP1_763842528, T3Y, T3X); + } + { + E T3P, T3Q, T3T, T3W; + T3P = FNMS(KP1_662939224, T3u, T3n); + T3Q = FMA(KP303346683, T3G, T3N); + R1[WS(rs, 9)] = FNMS(KP1_913880671, T3Q, T3P); + R1[WS(rs, 25)] = FMA(KP1_913880671, T3Q, T3P); + T3T = FNMS(KP1_662939224, T3S, T3R); + T3W = FNMS(KP534511135, T3V, T3U); + R1[WS(rs, 5)] = FNMS(KP1_763842528, T3W, T3T); + R1[WS(rs, 21)] = FMA(KP1_763842528, T3W, T3T); + } + } + { + E T1n, T2L, T1O, T2M, T2u, T2P, T2H, T2O, T1E, T1N; + T1n = FMA(KP1_847759065, T1m, T1b); + T2L = FNMS(KP1_847759065, T1m, T1b); + T1E = FMA(KP707106781, T1D, T1s); + T1N = FMA(KP707106781, T1M, T1J); + T1O = FNMS(KP198912367, T1N, T1E); + T2M = FMA(KP198912367, T1E, T1N); + { + E T26, T2t, T2D, T2G; + T26 = FMA(KP707106781, T25, T1U); + T2t = T2h + T2s; + T2u = FMA(KP923879532, T2t, T26); + T2P = FNMS(KP923879532, T2t, T26); + T2D = FMA(KP707106781, T2C, T2z); + T2G = T2E + T2F; + T2H = FMA(KP923879532, T2G, T2D); + T2O = FNMS(KP923879532, T2G, T2D); + } + { + E T1P, T2I, T2R, T2S; + T1P = FMA(KP1_961570560, T1O, T1n); + T2I = FNMS(KP098491403, T2H, T2u); + R1[WS(rs, 16)] = FNMS(KP1_990369453, T2I, T1P); + R1[0] = FMA(KP1_990369453, T2I, T1P); + T2R = FMA(KP1_961570560, T2M, T2L); + T2S = FMA(KP820678790, T2O, T2P); + R1[WS(rs, 12)] = FNMS(KP1_546020906, T2S, T2R); + R1[WS(rs, 28)] = FMA(KP1_546020906, T2S, T2R); + } + { + E T2J, T2K, T2N, T2Q; + T2J = FNMS(KP1_961570560, T1O, T1n); + T2K = FMA(KP098491403, T2u, T2H); + R1[WS(rs, 8)] = FNMS(KP1_990369453, T2K, T2J); + R1[WS(rs, 24)] = FMA(KP1_990369453, T2K, T2J); + T2N = FNMS(KP1_961570560, T2M, T2L); + T2Q = FNMS(KP820678790, T2P, T2O); + R1[WS(rs, 4)] = FNMS(KP1_546020906, T2Q, T2N); + R1[WS(rs, 20)] = FMA(KP1_546020906, T2Q, T2N); + } + } + { + E T41, T4f, T44, T4g, T48, T4j, T4b, T4i, T42, T43; + T41 = FNMS(KP1_847759065, T40, T3Z); + T4f = FMA(KP1_847759065, T40, T3Z); + T42 = FMA(KP707106781, T3s, T3r); + T43 = FMA(KP707106781, T3p, T3o); + T44 = FNMS(KP198912367, T43, T42); + T4g = FMA(KP198912367, T42, T43); + { + E T46, T47, T49, T4a; + T46 = FMA(KP707106781, T3x, T3w); + T47 = T3K + T3L; + T48 = FNMS(KP923879532, T47, T46); + T4j = FMA(KP923879532, T47, T46); + T49 = FMA(KP707106781, T3I, T3H); + T4a = T3B - T3E; + T4b = FNMS(KP923879532, T4a, T49); + T4i = FMA(KP923879532, T4a, T49); + } + { + E T45, T4c, T4l, T4m; + T45 = FNMS(KP1_961570560, T44, T41); + T4c = FNMS(KP820678790, T4b, T48); + R1[WS(rs, 19)] = FNMS(KP1_546020906, T4c, T45); + R1[WS(rs, 3)] = FMA(KP1_546020906, T4c, T45); + T4l = FMA(KP1_961570560, T4g, T4f); + T4m = FMA(KP098491403, T4i, T4j); + R1[WS(rs, 15)] = FNMS(KP1_990369453, T4m, T4l); + R1[WS(rs, 31)] = FMA(KP1_990369453, T4m, T4l); + } + { + E T4d, T4e, T4h, T4k; + T4d = FMA(KP1_961570560, T44, T41); + T4e = FMA(KP820678790, T48, T4b); + R1[WS(rs, 11)] = FNMS(KP1_546020906, T4e, T4d); + R1[WS(rs, 27)] = FMA(KP1_546020906, T4e, T4d); + T4h = FNMS(KP1_961570560, T4g, T4f); + T4k = FNMS(KP098491403, T4j, T4i); + R1[WS(rs, 7)] = FNMS(KP1_990369453, T4k, T4h); + R1[WS(rs, 23)] = FMA(KP1_990369453, T4k, T4h); + } + } + { + E T2V, T39, T2Y, T3a, T32, T3d, T35, T3c, T2W, T2X; + T2V = FNMS(KP1_847759065, T2U, T2T); + T39 = FMA(KP1_847759065, T2U, T2T); + T2W = FNMS(KP707106781, T1M, T1J); + T2X = FNMS(KP707106781, T1D, T1s); + T2Y = FNMS(KP668178637, T2X, T2W); + T3a = FMA(KP668178637, T2W, T2X); + { + E T30, T31, T33, T34; + T30 = FNMS(KP707106781, T25, T1U); + T31 = T2E - T2F; + T32 = FNMS(KP923879532, T31, T30); + T3d = FMA(KP923879532, T31, T30); + T33 = FNMS(KP707106781, T2C, T2z); + T34 = T2s - T2h; + T35 = FNMS(KP923879532, T34, T33); + T3c = FMA(KP923879532, T34, T33); + } + { + E T2Z, T36, T3f, T3g; + T2Z = FNMS(KP1_662939224, T2Y, T2V); + T36 = FNMS(KP534511135, T35, T32); + R1[WS(rs, 18)] = FNMS(KP1_763842528, T36, T2Z); + R1[WS(rs, 2)] = FMA(KP1_763842528, T36, T2Z); + T3f = FMA(KP1_662939224, T3a, T39); + T3g = FMA(KP303346683, T3c, T3d); + R1[WS(rs, 14)] = FNMS(KP1_913880671, T3g, T3f); + R1[WS(rs, 30)] = FMA(KP1_913880671, T3g, T3f); + } + { + E T37, T38, T3b, T3e; + T37 = FMA(KP1_662939224, T2Y, T2V); + T38 = FMA(KP534511135, T32, T35); + R1[WS(rs, 10)] = FNMS(KP1_763842528, T38, T37); + R1[WS(rs, 26)] = FMA(KP1_763842528, T38, T37); + T3b = FNMS(KP1_662939224, T3a, T39); + T3e = FNMS(KP303346683, T3d, T3c); + R1[WS(rs, 6)] = FNMS(KP1_913880671, T3e, T3b); + R1[WS(rs, 22)] = FMA(KP1_913880671, T3e, T3b); + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cb_64", {178, 0, 216, 0}, &GENUS }; + +void X(codelet_r2cb_64) (planner *p) { + X(kr2c_register) (p, r2cb_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 64 -name r2cb_64 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 394 FP additions, 134 FP multiplications, + * (or, 342 additions, 82 multiplications, 52 fused multiply/add), + * 110 stack variables, 19 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_268786568, +1.268786568327290996430343226450986741351374190); + DK(KP1_546020906, +1.546020906725473921621813219516939601942082586); + DK(KP196034280, +0.196034280659121203988391127777283691722273346); + DK(KP1_990369453, +1.990369453344393772489673906218959843150949737); + DK(KP942793473, +0.942793473651995297112775251810508755314920638); + DK(KP1_763842528, +1.763842528696710059425513727320776699016885241); + DK(KP580569354, +0.580569354508924735272384751634790549382952557); + DK(KP1_913880671, +1.913880671464417729871595773960539938965698411); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E Ta, T2S, T18, T2u, T3F, T4V, T5l, T61, Th, T2T, T1h, T2v, T3M, T4W, T5o; + E T62, T3Q, T5q, T5u, T44, Tp, Tw, T2V, T2W, T2X, T2Y, T3X, T5t, T1r, T2x; + E T41, T5r, T1A, T2y, T4a, T5y, T5N, T4H, TN, T31, T4E, T5z, T39, T3q, T1L; + E T2B, T4h, T5M, T2h, T2F, T12, T36, T5D, T5J, T5G, T5K, T1U, T26, T23, T27; + E T4p, T4z, T4w, T4A, T34, T3r; + { + E T5, T3A, T3, T3y, T9, T3C, T17, T3D, T6, T14; + { + E T4, T3z, T1, T2; + T4 = Cr[WS(csr, 16)]; + T5 = KP2_000000000 * T4; + T3z = Ci[WS(csi, 16)]; + T3A = KP2_000000000 * T3z; + T1 = Cr[0]; + T2 = Cr[WS(csr, 32)]; + T3 = T1 + T2; + T3y = T1 - T2; + { + E T7, T8, T15, T16; + T7 = Cr[WS(csr, 8)]; + T8 = Cr[WS(csr, 24)]; + T9 = KP2_000000000 * (T7 + T8); + T3C = T7 - T8; + T15 = Ci[WS(csi, 8)]; + T16 = Ci[WS(csi, 24)]; + T17 = KP2_000000000 * (T15 - T16); + T3D = T15 + T16; + } + } + T6 = T3 + T5; + Ta = T6 + T9; + T2S = T6 - T9; + T14 = T3 - T5; + T18 = T14 - T17; + T2u = T14 + T17; + { + E T3B, T3E, T5j, T5k; + T3B = T3y - T3A; + T3E = KP1_414213562 * (T3C - T3D); + T3F = T3B + T3E; + T4V = T3B - T3E; + T5j = T3y + T3A; + T5k = KP1_414213562 * (T3C + T3D); + T5l = T5j - T5k; + T61 = T5j + T5k; + } + } + { + E Td, T3G, T1c, T3K, Tg, T3J, T1f, T3H, T19, T1g; + { + E Tb, Tc, T1a, T1b; + Tb = Cr[WS(csr, 4)]; + Tc = Cr[WS(csr, 28)]; + Td = Tb + Tc; + T3G = Tb - Tc; + T1a = Ci[WS(csi, 4)]; + T1b = Ci[WS(csi, 28)]; + T1c = T1a - T1b; + T3K = T1a + T1b; + } + { + E Te, Tf, T1d, T1e; + Te = Cr[WS(csr, 20)]; + Tf = Cr[WS(csr, 12)]; + Tg = Te + Tf; + T3J = Te - Tf; + T1d = Ci[WS(csi, 20)]; + T1e = Ci[WS(csi, 12)]; + T1f = T1d - T1e; + T3H = T1d + T1e; + } + Th = KP2_000000000 * (Td + Tg); + T2T = KP2_000000000 * (T1f + T1c); + T19 = Td - Tg; + T1g = T1c - T1f; + T1h = KP1_414213562 * (T19 - T1g); + T2v = KP1_414213562 * (T19 + T1g); + { + E T3I, T3L, T5m, T5n; + T3I = T3G - T3H; + T3L = T3J + T3K; + T3M = FNMS(KP765366864, T3L, KP1_847759065 * T3I); + T4W = FMA(KP765366864, T3I, KP1_847759065 * T3L); + T5m = T3G + T3H; + T5n = T3K - T3J; + T5o = FNMS(KP1_847759065, T5n, KP765366864 * T5m); + T62 = FMA(KP1_847759065, T5m, KP765366864 * T5n); + } + } + { + E Tl, T3O, T1v, T43, To, T42, T1y, T3P, Ts, T3R, T1p, T3S, Tv, T3U, T1m; + E T3V; + { + E Tj, Tk, T1t, T1u; + Tj = Cr[WS(csr, 2)]; + Tk = Cr[WS(csr, 30)]; + Tl = Tj + Tk; + T3O = Tj - Tk; + T1t = Ci[WS(csi, 2)]; + T1u = Ci[WS(csi, 30)]; + T1v = T1t - T1u; + T43 = T1t + T1u; + } + { + E Tm, Tn, T1w, T1x; + Tm = Cr[WS(csr, 18)]; + Tn = Cr[WS(csr, 14)]; + To = Tm + Tn; + T42 = Tm - Tn; + T1w = Ci[WS(csi, 18)]; + T1x = Ci[WS(csi, 14)]; + T1y = T1w - T1x; + T3P = T1w + T1x; + } + { + E Tq, Tr, T1n, T1o; + Tq = Cr[WS(csr, 10)]; + Tr = Cr[WS(csr, 22)]; + Ts = Tq + Tr; + T3R = Tq - Tr; + T1n = Ci[WS(csi, 10)]; + T1o = Ci[WS(csi, 22)]; + T1p = T1n - T1o; + T3S = T1n + T1o; + } + { + E Tt, Tu, T1k, T1l; + Tt = Cr[WS(csr, 6)]; + Tu = Cr[WS(csr, 26)]; + Tv = Tt + Tu; + T3U = Tt - Tu; + T1k = Ci[WS(csi, 26)]; + T1l = Ci[WS(csi, 6)]; + T1m = T1k - T1l; + T3V = T1l + T1k; + } + T3Q = T3O - T3P; + T5q = T3O + T3P; + T5u = T43 - T42; + T44 = T42 + T43; + Tp = Tl + To; + Tw = Ts + Tv; + T2V = Tp - Tw; + { + E T3T, T3W, T1j, T1q; + T2W = T1y + T1v; + T2X = T1p + T1m; + T2Y = T2W - T2X; + T3T = T3R - T3S; + T3W = T3U - T3V; + T3X = KP707106781 * (T3T + T3W); + T5t = KP707106781 * (T3T - T3W); + T1j = Tl - To; + T1q = T1m - T1p; + T1r = T1j + T1q; + T2x = T1j - T1q; + { + E T3Z, T40, T1s, T1z; + T3Z = T3R + T3S; + T40 = T3U + T3V; + T41 = KP707106781 * (T3Z - T40); + T5r = KP707106781 * (T3Z + T40); + T1s = Ts - Tv; + T1z = T1v - T1y; + T1A = T1s + T1z; + T2y = T1z - T1s; + } + } + } + { + E TB, T48, T2c, T4G, TE, T4F, T2f, T49, TI, T4b, T1J, T4c, TL, T4e, T1G; + E T4f; + { + E Tz, TA, T2a, T2b; + Tz = Cr[WS(csr, 1)]; + TA = Cr[WS(csr, 31)]; + TB = Tz + TA; + T48 = Tz - TA; + T2a = Ci[WS(csi, 1)]; + T2b = Ci[WS(csi, 31)]; + T2c = T2a - T2b; + T4G = T2a + T2b; + } + { + E TC, TD, T2d, T2e; + TC = Cr[WS(csr, 17)]; + TD = Cr[WS(csr, 15)]; + TE = TC + TD; + T4F = TC - TD; + T2d = Ci[WS(csi, 17)]; + T2e = Ci[WS(csi, 15)]; + T2f = T2d - T2e; + T49 = T2d + T2e; + } + { + E TG, TH, T1H, T1I; + TG = Cr[WS(csr, 9)]; + TH = Cr[WS(csr, 23)]; + TI = TG + TH; + T4b = TG - TH; + T1H = Ci[WS(csi, 9)]; + T1I = Ci[WS(csi, 23)]; + T1J = T1H - T1I; + T4c = T1H + T1I; + } + { + E TJ, TK, T1E, T1F; + TJ = Cr[WS(csr, 7)]; + TK = Cr[WS(csr, 25)]; + TL = TJ + TK; + T4e = TJ - TK; + T1E = Ci[WS(csi, 25)]; + T1F = Ci[WS(csi, 7)]; + T1G = T1E - T1F; + T4f = T1F + T1E; + } + { + E TF, TM, T1D, T1K; + T4a = T48 - T49; + T5y = T48 + T49; + T5N = T4G - T4F; + T4H = T4F + T4G; + TF = TB + TE; + TM = TI + TL; + TN = TF + TM; + T31 = TF - TM; + { + E T4C, T4D, T37, T38; + T4C = T4b + T4c; + T4D = T4e + T4f; + T4E = KP707106781 * (T4C - T4D); + T5z = KP707106781 * (T4C + T4D); + T37 = T2f + T2c; + T38 = T1J + T1G; + T39 = T37 - T38; + T3q = T38 + T37; + } + T1D = TB - TE; + T1K = T1G - T1J; + T1L = T1D + T1K; + T2B = T1D - T1K; + { + E T4d, T4g, T29, T2g; + T4d = T4b - T4c; + T4g = T4e - T4f; + T4h = KP707106781 * (T4d + T4g); + T5M = KP707106781 * (T4d - T4g); + T29 = TI - TL; + T2g = T2c - T2f; + T2h = T29 + T2g; + T2F = T2g - T29; + } + } + } + { + E TQ, T4j, T1P, T4n, TT, T4m, T1S, T4k, TX, T4q, T1Y, T4u, T10, T4t, T21; + E T4r; + { + E TO, TP, T1N, T1O; + TO = Cr[WS(csr, 5)]; + TP = Cr[WS(csr, 27)]; + TQ = TO + TP; + T4j = TO - TP; + T1N = Ci[WS(csi, 5)]; + T1O = Ci[WS(csi, 27)]; + T1P = T1N - T1O; + T4n = T1N + T1O; + } + { + E TR, TS, T1Q, T1R; + TR = Cr[WS(csr, 21)]; + TS = Cr[WS(csr, 11)]; + TT = TR + TS; + T4m = TR - TS; + T1Q = Ci[WS(csi, 21)]; + T1R = Ci[WS(csi, 11)]; + T1S = T1Q - T1R; + T4k = T1Q + T1R; + } + { + E TV, TW, T1W, T1X; + TV = Cr[WS(csr, 3)]; + TW = Cr[WS(csr, 29)]; + TX = TV + TW; + T4q = TV - TW; + T1W = Ci[WS(csi, 29)]; + T1X = Ci[WS(csi, 3)]; + T1Y = T1W - T1X; + T4u = T1X + T1W; + } + { + E TY, TZ, T1Z, T20; + TY = Cr[WS(csr, 13)]; + TZ = Cr[WS(csr, 19)]; + T10 = TY + TZ; + T4t = TY - TZ; + T1Z = Ci[WS(csi, 13)]; + T20 = Ci[WS(csi, 19)]; + T21 = T1Z - T20; + T4r = T1Z + T20; + } + { + E TU, T11, T5B, T5C; + TU = TQ + TT; + T11 = TX + T10; + T12 = TU + T11; + T36 = TU - T11; + T5B = T4j + T4k; + T5C = T4n - T4m; + T5D = FNMS(KP923879532, T5C, KP382683432 * T5B); + T5J = FMA(KP923879532, T5B, KP382683432 * T5C); + } + { + E T5E, T5F, T1M, T1T; + T5E = T4q + T4r; + T5F = T4t + T4u; + T5G = FNMS(KP923879532, T5F, KP382683432 * T5E); + T5K = FMA(KP923879532, T5E, KP382683432 * T5F); + T1M = TQ - TT; + T1T = T1P - T1S; + T1U = T1M - T1T; + T26 = T1M + T1T; + } + { + E T1V, T22, T4l, T4o; + T1V = TX - T10; + T22 = T1Y - T21; + T23 = T1V + T22; + T27 = T22 - T1V; + T4l = T4j - T4k; + T4o = T4m + T4n; + T4p = FNMS(KP382683432, T4o, KP923879532 * T4l); + T4z = FMA(KP382683432, T4l, KP923879532 * T4o); + } + { + E T4s, T4v, T32, T33; + T4s = T4q - T4r; + T4v = T4t - T4u; + T4w = FMA(KP923879532, T4s, KP382683432 * T4v); + T4A = FNMS(KP382683432, T4s, KP923879532 * T4v); + T32 = T21 + T1Y; + T33 = T1S + T1P; + T34 = T32 - T33; + T3r = T33 + T32; + } + } + { + E T13, T3x, Ty, T3w, Ti, Tx; + T13 = KP2_000000000 * (TN + T12); + T3x = KP2_000000000 * (T3r + T3q); + Ti = Ta + Th; + Tx = KP2_000000000 * (Tp + Tw); + Ty = Ti + Tx; + T3w = Ti - Tx; + R0[WS(rs, 16)] = Ty - T13; + R0[WS(rs, 24)] = T3w + T3x; + R0[0] = Ty + T13; + R0[WS(rs, 8)] = T3w - T3x; + } + { + E T3g, T3k, T3j, T3l; + { + E T3e, T3f, T3h, T3i; + T3e = T2S + T2T; + T3f = KP1_414213562 * (T2V + T2Y); + T3g = T3e - T3f; + T3k = T3e + T3f; + T3h = T31 - T34; + T3i = T39 - T36; + T3j = FNMS(KP1_847759065, T3i, KP765366864 * T3h); + T3l = FMA(KP1_847759065, T3h, KP765366864 * T3i); + } + R0[WS(rs, 22)] = T3g - T3j; + R0[WS(rs, 30)] = T3k + T3l; + R0[WS(rs, 6)] = T3g + T3j; + R0[WS(rs, 14)] = T3k - T3l; + } + { + E T3o, T3u, T3t, T3v; + { + E T3m, T3n, T3p, T3s; + T3m = Ta - Th; + T3n = KP2_000000000 * (T2X + T2W); + T3o = T3m - T3n; + T3u = T3m + T3n; + T3p = TN - T12; + T3s = T3q - T3r; + T3t = KP1_414213562 * (T3p - T3s); + T3v = KP1_414213562 * (T3p + T3s); + } + R0[WS(rs, 20)] = T3o - T3t; + R0[WS(rs, 28)] = T3u + T3v; + R0[WS(rs, 4)] = T3o + T3t; + R0[WS(rs, 12)] = T3u - T3v; + } + { + E T30, T3c, T3b, T3d; + { + E T2U, T2Z, T35, T3a; + T2U = T2S - T2T; + T2Z = KP1_414213562 * (T2V - T2Y); + T30 = T2U + T2Z; + T3c = T2U - T2Z; + T35 = T31 + T34; + T3a = T36 + T39; + T3b = FNMS(KP765366864, T3a, KP1_847759065 * T35); + T3d = FMA(KP765366864, T35, KP1_847759065 * T3a); + } + R0[WS(rs, 18)] = T30 - T3b; + R0[WS(rs, 26)] = T3c + T3d; + R0[WS(rs, 2)] = T30 + T3b; + R0[WS(rs, 10)] = T3c - T3d; + } + { + E T25, T2p, T2i, T2q, T1C, T2k, T2o, T2s, T24, T28; + T24 = KP707106781 * (T1U + T23); + T25 = T1L + T24; + T2p = T1L - T24; + T28 = KP707106781 * (T26 + T27); + T2i = T28 + T2h; + T2q = T2h - T28; + { + E T1i, T1B, T2m, T2n; + T1i = T18 + T1h; + T1B = FNMS(KP765366864, T1A, KP1_847759065 * T1r); + T1C = T1i + T1B; + T2k = T1i - T1B; + T2m = T18 - T1h; + T2n = FMA(KP765366864, T1r, KP1_847759065 * T1A); + T2o = T2m - T2n; + T2s = T2m + T2n; + } + { + E T2j, T2t, T2l, T2r; + T2j = FNMS(KP390180644, T2i, KP1_961570560 * T25); + R0[WS(rs, 17)] = T1C - T2j; + R0[WS(rs, 1)] = T1C + T2j; + T2t = FMA(KP1_662939224, T2p, KP1_111140466 * T2q); + R0[WS(rs, 13)] = T2s - T2t; + R0[WS(rs, 29)] = T2s + T2t; + T2l = FMA(KP390180644, T25, KP1_961570560 * T2i); + R0[WS(rs, 9)] = T2k - T2l; + R0[WS(rs, 25)] = T2k + T2l; + T2r = FNMS(KP1_662939224, T2q, KP1_111140466 * T2p); + R0[WS(rs, 21)] = T2o - T2r; + R0[WS(rs, 5)] = T2o + T2r; + } + } + { + E T2D, T2N, T2G, T2O, T2A, T2I, T2M, T2Q, T2C, T2E; + T2C = KP707106781 * (T27 - T26); + T2D = T2B + T2C; + T2N = T2B - T2C; + T2E = KP707106781 * (T1U - T23); + T2G = T2E + T2F; + T2O = T2F - T2E; + { + E T2w, T2z, T2K, T2L; + T2w = T2u - T2v; + T2z = FNMS(KP1_847759065, T2y, KP765366864 * T2x); + T2A = T2w + T2z; + T2I = T2w - T2z; + T2K = T2u + T2v; + T2L = FMA(KP1_847759065, T2x, KP765366864 * T2y); + T2M = T2K - T2L; + T2Q = T2K + T2L; + } + { + E T2H, T2R, T2J, T2P; + T2H = FNMS(KP1_111140466, T2G, KP1_662939224 * T2D); + R0[WS(rs, 19)] = T2A - T2H; + R0[WS(rs, 3)] = T2A + T2H; + T2R = FMA(KP1_961570560, T2N, KP390180644 * T2O); + R0[WS(rs, 15)] = T2Q - T2R; + R0[WS(rs, 31)] = T2Q + T2R; + T2J = FMA(KP1_111140466, T2D, KP1_662939224 * T2G); + R0[WS(rs, 11)] = T2I - T2J; + R0[WS(rs, 27)] = T2I + T2J; + T2P = FNMS(KP1_961570560, T2O, KP390180644 * T2N); + R0[WS(rs, 23)] = T2M - T2P; + R0[WS(rs, 7)] = T2M + T2P; + } + } + { + E T5p, T5T, T5w, T5U, T5I, T5W, T5P, T5X, T5s, T5v; + T5p = T5l + T5o; + T5T = T5l - T5o; + T5s = T5q - T5r; + T5v = T5t + T5u; + T5w = FNMS(KP1_111140466, T5v, KP1_662939224 * T5s); + T5U = FMA(KP1_111140466, T5s, KP1_662939224 * T5v); + { + E T5A, T5H, T5L, T5O; + T5A = T5y - T5z; + T5H = T5D + T5G; + T5I = T5A + T5H; + T5W = T5A - T5H; + T5L = T5J - T5K; + T5O = T5M + T5N; + T5P = T5L + T5O; + T5X = T5O - T5L; + } + { + E T5x, T5Q, T5Z, T60; + T5x = T5p + T5w; + T5Q = FNMS(KP580569354, T5P, KP1_913880671 * T5I); + R1[WS(rs, 17)] = T5x - T5Q; + R1[WS(rs, 1)] = T5x + T5Q; + T5Z = T5T + T5U; + T60 = FMA(KP1_763842528, T5W, KP942793473 * T5X); + R1[WS(rs, 13)] = T5Z - T60; + R1[WS(rs, 29)] = T5Z + T60; + } + { + E T5R, T5S, T5V, T5Y; + T5R = T5p - T5w; + T5S = FMA(KP580569354, T5I, KP1_913880671 * T5P); + R1[WS(rs, 9)] = T5R - T5S; + R1[WS(rs, 25)] = T5R + T5S; + T5V = T5T - T5U; + T5Y = FNMS(KP1_763842528, T5X, KP942793473 * T5W); + R1[WS(rs, 21)] = T5V - T5Y; + R1[WS(rs, 5)] = T5V + T5Y; + } + } + { + E T3N, T4N, T46, T4O, T4y, T4Q, T4J, T4R, T3Y, T45; + T3N = T3F + T3M; + T4N = T3F - T3M; + T3Y = T3Q + T3X; + T45 = T41 + T44; + T46 = FNMS(KP390180644, T45, KP1_961570560 * T3Y); + T4O = FMA(KP390180644, T3Y, KP1_961570560 * T45); + { + E T4i, T4x, T4B, T4I; + T4i = T4a + T4h; + T4x = T4p + T4w; + T4y = T4i + T4x; + T4Q = T4i - T4x; + T4B = T4z + T4A; + T4I = T4E + T4H; + T4J = T4B + T4I; + T4R = T4I - T4B; + } + { + E T47, T4K, T4T, T4U; + T47 = T3N + T46; + T4K = FNMS(KP196034280, T4J, KP1_990369453 * T4y); + R1[WS(rs, 16)] = T47 - T4K; + R1[0] = T47 + T4K; + T4T = T4N + T4O; + T4U = FMA(KP1_546020906, T4Q, KP1_268786568 * T4R); + R1[WS(rs, 12)] = T4T - T4U; + R1[WS(rs, 28)] = T4T + T4U; + } + { + E T4L, T4M, T4P, T4S; + T4L = T3N - T46; + T4M = FMA(KP196034280, T4y, KP1_990369453 * T4J); + R1[WS(rs, 8)] = T4L - T4M; + R1[WS(rs, 24)] = T4L + T4M; + T4P = T4N - T4O; + T4S = FNMS(KP1_546020906, T4R, KP1_268786568 * T4Q); + R1[WS(rs, 20)] = T4P - T4S; + R1[WS(rs, 4)] = T4P + T4S; + } + } + { + E T63, T6h, T66, T6i, T6a, T6k, T6d, T6l, T64, T65; + T63 = T61 - T62; + T6h = T61 + T62; + T64 = T5q + T5r; + T65 = T5u - T5t; + T66 = FNMS(KP1_961570560, T65, KP390180644 * T64); + T6i = FMA(KP1_961570560, T64, KP390180644 * T65); + { + E T68, T69, T6b, T6c; + T68 = T5y + T5z; + T69 = T5J + T5K; + T6a = T68 - T69; + T6k = T68 + T69; + T6b = T5D - T5G; + T6c = T5N - T5M; + T6d = T6b + T6c; + T6l = T6c - T6b; + } + { + E T67, T6e, T6n, T6o; + T67 = T63 + T66; + T6e = FNMS(KP1_268786568, T6d, KP1_546020906 * T6a); + R1[WS(rs, 19)] = T67 - T6e; + R1[WS(rs, 3)] = T67 + T6e; + T6n = T6h + T6i; + T6o = FMA(KP1_990369453, T6k, KP196034280 * T6l); + R1[WS(rs, 15)] = T6n - T6o; + R1[WS(rs, 31)] = T6n + T6o; + } + { + E T6f, T6g, T6j, T6m; + T6f = T63 - T66; + T6g = FMA(KP1_268786568, T6a, KP1_546020906 * T6d); + R1[WS(rs, 11)] = T6f - T6g; + R1[WS(rs, 27)] = T6f + T6g; + T6j = T6h - T6i; + T6m = FNMS(KP1_990369453, T6l, KP196034280 * T6k); + R1[WS(rs, 23)] = T6j - T6m; + R1[WS(rs, 7)] = T6j + T6m; + } + } + { + E T4X, T5b, T50, T5c, T54, T5e, T57, T5f, T4Y, T4Z; + T4X = T4V - T4W; + T5b = T4V + T4W; + T4Y = T3Q - T3X; + T4Z = T44 - T41; + T50 = FNMS(KP1_662939224, T4Z, KP1_111140466 * T4Y); + T5c = FMA(KP1_662939224, T4Y, KP1_111140466 * T4Z); + { + E T52, T53, T55, T56; + T52 = T4a - T4h; + T53 = T4A - T4z; + T54 = T52 + T53; + T5e = T52 - T53; + T55 = T4p - T4w; + T56 = T4H - T4E; + T57 = T55 + T56; + T5f = T56 - T55; + } + { + E T51, T58, T5h, T5i; + T51 = T4X + T50; + T58 = FNMS(KP942793473, T57, KP1_763842528 * T54); + R1[WS(rs, 18)] = T51 - T58; + R1[WS(rs, 2)] = T51 + T58; + T5h = T5b + T5c; + T5i = FMA(KP1_913880671, T5e, KP580569354 * T5f); + R1[WS(rs, 14)] = T5h - T5i; + R1[WS(rs, 30)] = T5h + T5i; + } + { + E T59, T5a, T5d, T5g; + T59 = T4X - T50; + T5a = FMA(KP942793473, T54, KP1_763842528 * T57); + R1[WS(rs, 10)] = T59 - T5a; + R1[WS(rs, 26)] = T59 + T5a; + T5d = T5b - T5c; + T5g = FNMS(KP1_913880671, T5f, KP580569354 * T5e); + R1[WS(rs, 22)] = T5d - T5g; + R1[WS(rs, 6)] = T5d + T5g; + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cb_64", {342, 82, 52, 0}, &GENUS }; + +void X(codelet_r2cb_64) (planner *p) { + X(kr2c_register) (p, r2cb_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_7.c new file mode 100644 index 000000000..45465fd92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_7.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 7 -name r2cb_7 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 24 FP additions, 22 FP multiplications, + * (or, 2 additions, 0 multiplications, 22 fused multiply/add), + * 27 stack variables, 7 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_949855824, +1.949855824363647214036263365987862434465571601); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP1_801937735, +1.801937735804838252472204639014890102331838324); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T1, T9, Tb, Ta, Tc, Tm, Th, T7, Tk, Tf, T5, Tl, Tn; + T1 = Cr[0]; + T9 = Ci[WS(csi, 2)]; + Tb = Ci[WS(csi, 3)]; + Ta = Ci[WS(csi, 1)]; + Tc = FMA(KP554958132, Tb, Ta); + Tm = FMS(KP554958132, Ta, T9); + Th = FMA(KP554958132, T9, Tb); + { + E T2, T4, T3, T6, Tj, Te; + T2 = Cr[WS(csr, 1)]; + T4 = Cr[WS(csr, 3)]; + T3 = Cr[WS(csr, 2)]; + T6 = FNMS(KP356895867, T3, T2); + Tj = FNMS(KP356895867, T4, T3); + Te = FNMS(KP356895867, T2, T4); + T7 = FNMS(KP692021471, T6, T4); + Tk = FNMS(KP692021471, Tj, T2); + Tf = FNMS(KP692021471, Te, T3); + T5 = T2 + T3 + T4; + } + R0[0] = FMA(KP2_000000000, T5, T1); + Tl = FNMS(KP1_801937735, Tk, T1); + Tn = FMA(KP801937735, Tm, Tb); + R1[WS(rs, 1)] = FNMS(KP1_949855824, Tn, Tl); + R0[WS(rs, 2)] = FMA(KP1_949855824, Tn, Tl); + { + E T8, Td, Tg, Ti; + T8 = FNMS(KP1_801937735, T7, T1); + Td = FMA(KP801937735, Tc, T9); + R1[0] = FNMS(KP1_949855824, Td, T8); + R0[WS(rs, 3)] = FMA(KP1_949855824, Td, T8); + Tg = FNMS(KP1_801937735, Tf, T1); + Ti = FNMS(KP801937735, Th, Ta); + R0[WS(rs, 1)] = FNMS(KP1_949855824, Ti, Tg); + R1[WS(rs, 2)] = FMA(KP1_949855824, Ti, Tg); + } + } + } +} + +static const kr2c_desc desc = { 7, "r2cb_7", {2, 0, 22, 0}, &GENUS }; + +void X(codelet_r2cb_7) (planner *p) { + X(kr2c_register) (p, r2cb_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 7 -name r2cb_7 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 24 FP additions, 19 FP multiplications, + * (or, 11 additions, 6 multiplications, 13 fused multiply/add), + * 21 stack variables, 7 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_801937735, +1.801937735804838252472204639014890102331838324); + DK(KP445041867, +0.445041867912628808577805128993589518932711138); + DK(KP1_246979603, +1.246979603717467061050009768008479621264549462); + DK(KP867767478, +0.867767478235116240951536665696717509219981456); + DK(KP1_949855824, +1.949855824363647214036263365987862434465571601); + DK(KP1_563662964, +1.563662964936059617416889053348115500464669037); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T9, Td, Tb, T1, T4, T2, T3, T5, Tc, Ta, T6, T8, T7; + T6 = Ci[WS(csi, 2)]; + T8 = Ci[WS(csi, 1)]; + T7 = Ci[WS(csi, 3)]; + T9 = FNMS(KP1_949855824, T7, KP1_563662964 * T6) - (KP867767478 * T8); + Td = FMA(KP867767478, T6, KP1_563662964 * T7) - (KP1_949855824 * T8); + Tb = FMA(KP1_563662964, T8, KP1_949855824 * T6) + (KP867767478 * T7); + T1 = Cr[0]; + T4 = Cr[WS(csr, 3)]; + T2 = Cr[WS(csr, 1)]; + T3 = Cr[WS(csr, 2)]; + T5 = FMA(KP1_246979603, T3, T1) + FNMA(KP445041867, T4, KP1_801937735 * T2); + Tc = FMA(KP1_246979603, T4, T1) + FNMA(KP1_801937735, T3, KP445041867 * T2); + Ta = FMA(KP1_246979603, T2, T1) + FNMA(KP1_801937735, T4, KP445041867 * T3); + R0[WS(rs, 2)] = T5 - T9; + R1[WS(rs, 1)] = T5 + T9; + R0[WS(rs, 1)] = Tc + Td; + R1[WS(rs, 2)] = Tc - Td; + R0[WS(rs, 3)] = Ta + Tb; + R1[0] = Ta - Tb; + R0[0] = FMA(KP2_000000000, T2 + T3 + T4, T1); + } + } +} + +static const kr2c_desc desc = { 7, "r2cb_7", {11, 6, 13, 0}, &GENUS }; + +void X(codelet_r2cb_7) (planner *p) { + X(kr2c_register) (p, r2cb_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_8.c new file mode 100644 index 000000000..c8ef0c3f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_8.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -name r2cb_8 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 20 FP additions, 12 FP multiplications, + * (or, 8 additions, 0 multiplications, 12 fused multiply/add), + * 19 stack variables, 2 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T4, Ta, T3, T9, T8, Tc, Tf, Tk, T1, T2, T5, Tj; + T4 = Cr[WS(csr, 2)]; + Ta = Ci[WS(csi, 2)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 4)]; + T3 = T1 + T2; + T9 = T1 - T2; + { + E T6, T7, Td, Te; + T6 = Cr[WS(csr, 1)]; + T7 = Cr[WS(csr, 3)]; + T8 = T6 + T7; + Tc = T6 - T7; + Td = Ci[WS(csi, 1)]; + Te = Ci[WS(csi, 3)]; + Tf = Td + Te; + Tk = Td - Te; + } + T5 = FMA(KP2_000000000, T4, T3); + R0[WS(rs, 2)] = FNMS(KP2_000000000, T8, T5); + R0[0] = FMA(KP2_000000000, T8, T5); + Tj = FNMS(KP2_000000000, T4, T3); + R0[WS(rs, 1)] = FNMS(KP2_000000000, Tk, Tj); + R0[WS(rs, 3)] = FMA(KP2_000000000, Tk, Tj); + { + E Tb, Tg, Th, Ti; + Tb = FNMS(KP2_000000000, Ta, T9); + Tg = Tc - Tf; + R1[WS(rs, 2)] = FNMS(KP1_414213562, Tg, Tb); + R1[0] = FMA(KP1_414213562, Tg, Tb); + Th = FMA(KP2_000000000, Ta, T9); + Ti = Tc + Tf; + R1[WS(rs, 1)] = FNMS(KP1_414213562, Ti, Th); + R1[WS(rs, 3)] = FMA(KP1_414213562, Ti, Th); + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cb_8", {8, 0, 12, 0}, &GENUS }; + +void X(codelet_r2cb_8) (planner *p) { + X(kr2c_register) (p, r2cb_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 8 -name r2cb_8 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 20 FP additions, 6 FP multiplications, + * (or, 20 additions, 6 multiplications, 0 fused multiply/add), + * 21 stack variables, 2 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T5, Tg, T3, Te, T9, Ti, Td, Tj, T6, Ta; + { + E T4, Tf, T1, T2; + T4 = Cr[WS(csr, 2)]; + T5 = KP2_000000000 * T4; + Tf = Ci[WS(csi, 2)]; + Tg = KP2_000000000 * Tf; + T1 = Cr[0]; + T2 = Cr[WS(csr, 4)]; + T3 = T1 + T2; + Te = T1 - T2; + { + E T7, T8, Tb, Tc; + T7 = Cr[WS(csr, 1)]; + T8 = Cr[WS(csr, 3)]; + T9 = KP2_000000000 * (T7 + T8); + Ti = T7 - T8; + Tb = Ci[WS(csi, 1)]; + Tc = Ci[WS(csi, 3)]; + Td = KP2_000000000 * (Tb - Tc); + Tj = Tb + Tc; + } + } + T6 = T3 + T5; + R0[WS(rs, 2)] = T6 - T9; + R0[0] = T6 + T9; + Ta = T3 - T5; + R0[WS(rs, 1)] = Ta - Td; + R0[WS(rs, 3)] = Ta + Td; + { + E Th, Tk, Tl, Tm; + Th = Te - Tg; + Tk = KP1_414213562 * (Ti - Tj); + R1[WS(rs, 2)] = Th - Tk; + R1[0] = Th + Tk; + Tl = Te + Tg; + Tm = KP1_414213562 * (Ti + Tj); + R1[WS(rs, 1)] = Tl - Tm; + R1[WS(rs, 3)] = Tl + Tm; + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cb_8", {20, 6, 0, 0}, &GENUS }; + +void X(codelet_r2cb_8) (planner *p) { + X(kr2c_register) (p, r2cb_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_9.c new file mode 100644 index 000000000..1b61a6942 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cb/r2cb_9.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cb.native -fma -compact -variables 4 -pipeline-latency 4 -sign 1 -n 9 -name r2cb_9 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 32 FP additions, 24 FP multiplications, + * (or, 8 additions, 0 multiplications, 24 fused multiply/add), + * 35 stack variables, 12 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_705737063, +1.705737063904886419256501927880148143872040591); + DK(KP1_969615506, +1.969615506024416118733486049179046027341286503); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP176326980, +0.176326980708464973471090386868618986121633062); + DK(KP1_326827896, +1.326827896337876792410842639271782594433726619); + DK(KP1_532088886, +1.532088886237956070404785301110833347871664914); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP839099631, +0.839099631177280011763127298123181364687434283); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T3, Tp, Tb, Th, Ti, T8, Tl, Tq, Tg, Tr, Tv, Tw; + { + E Ta, T1, T2, T9; + Ta = Ci[WS(csi, 3)]; + T1 = Cr[0]; + T2 = Cr[WS(csr, 3)]; + T9 = T1 - T2; + T3 = FMA(KP2_000000000, T2, T1); + Tp = FMA(KP1_732050807, Ta, T9); + Tb = FNMS(KP1_732050807, Ta, T9); + } + { + E T4, T7, Tk, Tf, Tj, Tc; + T4 = Cr[WS(csr, 1)]; + Th = Ci[WS(csi, 1)]; + { + E T5, T6, Td, Te; + T5 = Cr[WS(csr, 4)]; + T6 = Cr[WS(csr, 2)]; + T7 = T5 + T6; + Tk = T6 - T5; + Td = Ci[WS(csi, 4)]; + Te = Ci[WS(csi, 2)]; + Tf = Td + Te; + Ti = Td - Te; + } + T8 = T4 + T7; + Tj = FNMS(KP500000000, Ti, Th); + Tl = FNMS(KP866025403, Tk, Tj); + Tq = FMA(KP866025403, Tk, Tj); + Tc = FNMS(KP500000000, T7, T4); + Tg = FNMS(KP866025403, Tf, Tc); + Tr = FMA(KP866025403, Tf, Tc); + } + R0[0] = FMA(KP2_000000000, T8, T3); + Tv = T3 - T8; + Tw = Ti + Th; + R1[WS(rs, 1)] = FNMS(KP1_732050807, Tw, Tv); + R0[WS(rs, 3)] = FMA(KP1_732050807, Tw, Tv); + { + E To, Tm, Tn, Tu, Ts, Tt; + To = FMA(KP839099631, Tg, Tl); + Tm = FNMS(KP839099631, Tl, Tg); + Tn = FNMS(KP766044443, Tm, Tb); + R1[0] = FMA(KP1_532088886, Tm, Tb); + R1[WS(rs, 3)] = FMA(KP1_326827896, To, Tn); + R0[WS(rs, 2)] = FNMS(KP1_326827896, To, Tn); + Tu = FMA(KP176326980, Tq, Tr); + Ts = FNMS(KP176326980, Tr, Tq); + Tt = FMA(KP984807753, Ts, Tp); + R0[WS(rs, 1)] = FNMS(KP1_969615506, Ts, Tp); + R0[WS(rs, 4)] = FMA(KP1_705737063, Tu, Tt); + R1[WS(rs, 2)] = FNMS(KP1_705737063, Tu, Tt); + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cb_9", {8, 0, 24, 0}, &GENUS }; + +void X(codelet_r2cb_9) (planner *p) { + X(kr2c_register) (p, r2cb_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cb.native -compact -variables 4 -pipeline-latency 4 -sign 1 -n 9 -name r2cb_9 -include rdft/scalar/r2cb.h */ + +/* + * This function contains 32 FP additions, 18 FP multiplications, + * (or, 22 additions, 8 multiplications, 10 fused multiply/add), + * 35 stack variables, 12 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cb.h" + +static void r2cb_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP300767466, +0.300767466360870593278543795225003852144476517); + DK(KP1_705737063, +1.705737063904886419256501927880148143872040591); + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP1_326827896, +1.326827896337876792410842639271782594433726619); + DK(KP1_113340798, +1.113340798452838732905825904094046265936583811); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ovs, R1 = R1 + ovs, Cr = Cr + ivs, Ci = Ci + ivs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T3, Tq, Tc, Tk, Tj, T8, Tm, Ts, Th, Tr, Tw, Tx; + { + E Tb, T1, T2, T9, Ta; + Ta = Ci[WS(csi, 3)]; + Tb = KP1_732050807 * Ta; + T1 = Cr[0]; + T2 = Cr[WS(csr, 3)]; + T9 = T1 - T2; + T3 = FMA(KP2_000000000, T2, T1); + Tq = T9 + Tb; + Tc = T9 - Tb; + } + { + E T4, T7, Ti, Tg, Tl, Td; + T4 = Cr[WS(csr, 1)]; + Tk = Ci[WS(csi, 1)]; + { + E T5, T6, Te, Tf; + T5 = Cr[WS(csr, 4)]; + T6 = Cr[WS(csr, 2)]; + T7 = T5 + T6; + Ti = KP866025403 * (T5 - T6); + Te = Ci[WS(csi, 4)]; + Tf = Ci[WS(csi, 2)]; + Tg = KP866025403 * (Te + Tf); + Tj = Tf - Te; + } + T8 = T4 + T7; + Tl = FMA(KP500000000, Tj, Tk); + Tm = Ti + Tl; + Ts = Tl - Ti; + Td = FNMS(KP500000000, T7, T4); + Th = Td - Tg; + Tr = Td + Tg; + } + R0[0] = FMA(KP2_000000000, T8, T3); + Tw = T3 - T8; + Tx = KP1_732050807 * (Tk - Tj); + R1[WS(rs, 1)] = Tw - Tx; + R0[WS(rs, 3)] = Tw + Tx; + { + E Tp, Tn, To, Tv, Tt, Tu; + Tp = FMA(KP1_113340798, Th, KP1_326827896 * Tm); + Tn = FNMS(KP642787609, Tm, KP766044443 * Th); + To = Tc - Tn; + R1[0] = FMA(KP2_000000000, Tn, Tc); + R1[WS(rs, 3)] = To + Tp; + R0[WS(rs, 2)] = To - Tp; + Tv = FMA(KP1_705737063, Tr, KP300767466 * Ts); + Tt = FNMS(KP984807753, Ts, KP173648177 * Tr); + Tu = Tq - Tt; + R0[WS(rs, 1)] = FMA(KP2_000000000, Tt, Tq); + R0[WS(rs, 4)] = Tu + Tv; + R1[WS(rs, 2)] = Tu - Tv; + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cb_9", {22, 8, 10, 0}, &GENUS }; + +void X(codelet_r2cb_9) (planner *p) { + X(kr2c_register) (p, r2cb_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cbIII.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cbIII.h new file mode 100644 index 000000000..b676ddbc7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cbIII.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_r2cbIII_genus) +extern const kr2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf.h new file mode 100644 index 000000000..06759dc55 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_r2cf_genus) +extern const kr2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/Makefile.am new file mode 100644 index 000000000..2be36d8c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/Makefile.am @@ -0,0 +1,109 @@ +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = librdft_scalar_r2cf.la + +########################################################################### +# r2cf_ is a hard-coded real-to-complex FFT of size (base cases +# of real-input FFT recursion) +R2CF = r2cf_2.c r2cf_3.c r2cf_4.c r2cf_5.c r2cf_6.c r2cf_7.c r2cf_8.c \ +r2cf_9.c r2cf_10.c r2cf_11.c r2cf_12.c r2cf_13.c r2cf_14.c r2cf_15.c \ +r2cf_16.c r2cf_32.c r2cf_64.c r2cf_128.c \ +r2cf_20.c r2cf_25.c # r2cf_30.c r2cf_40.c r2cf_50.c + +########################################################################### +# hf_ is a "twiddle" FFT of size , implementing a radix-r DIT +# step for a real-input FFT. Every hf codelet must have a +# corresponding r2cfII codelet (see below)! +HF = hf_2.c hf_3.c hf_4.c hf_5.c hf_6.c hf_7.c hf_8.c hf_9.c \ +hf_10.c hf_12.c hf_15.c hf_16.c hf_32.c hf_64.c \ +hf_20.c hf_25.c # hf_30.c hf_40.c hf_50.c + +# like hf, but generates part of its trig table on the fly (good for large n) +HF2 = hf2_4.c hf2_8.c hf2_16.c hf2_32.c \ +hf2_5.c hf2_20.c hf2_25.c + +# an r2cf transform where the input is shifted by half a sample (output +# is multiplied by a phase). This is needed as part of the DIT recursion; +# every hf_ or hf2_ codelet should have a corresponding r2cfII_ +R2CFII = r2cfII_2.c r2cfII_3.c r2cfII_4.c r2cfII_5.c r2cfII_6.c \ +r2cfII_7.c r2cfII_8.c r2cfII_9.c r2cfII_10.c r2cfII_12.c r2cfII_15.c \ +r2cfII_16.c r2cfII_32.c r2cfII_64.c \ +r2cfII_20.c r2cfII_25.c # r2cfII_30.c r2cfII_40.c r2cfII_50.c + +########################################################################### +# hc2cf_ is a "twiddle" FFT of size , implementing a radix-r DIT +# step for a real-input FFT with rdft2-style output. must be even. +HC2CF = hc2cf_2.c hc2cf_4.c hc2cf_6.c hc2cf_8.c hc2cf_10.c hc2cf_12.c \ +hc2cf_16.c hc2cf_32.c \ +hc2cf_20.c # hc2cf_30.c + +HC2CFDFT = hc2cfdft_2.c hc2cfdft_4.c hc2cfdft_6.c hc2cfdft_8.c \ +hc2cfdft_10.c hc2cfdft_12.c hc2cfdft_16.c hc2cfdft_32.c \ +hc2cfdft_20.c # hc2cfdft_30.c + +# like hc2cf, but generates part of its trig table on the fly (good +# for large n) +HC2CF2 = hc2cf2_4.c hc2cf2_8.c hc2cf2_16.c hc2cf2_32.c \ +hc2cf2_20.c # hc2cf2_30.c +HC2CFDFT2 = hc2cfdft2_4.c hc2cfdft2_8.c hc2cfdft2_16.c hc2cfdft2_32.c \ +hc2cfdft2_20.c # hc2cfdft2_30.c + +########################################################################### +ALL_CODELETS = $(R2CF) $(HF) $(HF2) $(R2CFII) $(HC2CF) $(HC2CF2) \ +$(HC2CFDFT) $(HC2CFDFT2) + +BUILT_SOURCES= $(ALL_CODELETS) $(CODLIST) + +librdft_scalar_r2cf_la_SOURCES = $(BUILT_SOURCES) + +SOLVTAB_NAME = X(solvtab_rdft_r2cf) +XRENAME=X + +# special rules for regenerating codelets. +include $(top_srcdir)/support/Makefile.codelets + +if MAINTAINER_MODE +FLAGS_R2CF=$(RDFT_FLAGS_COMMON) +FLAGS_HF=$(RDFT_FLAGS_COMMON) +FLAGS_HF2=$(RDFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +FLAGS_HC2CF=$(RDFT_FLAGS_COMMON) +FLAGS_HC2CF2=$(RDFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +FLAGS_R2CFII=$(RDFT_FLAGS_COMMON) + +r2cf_%.c: $(CODELET_DEPS) $(GEN_R2CF) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CF) $(FLAGS_R2CF) -n $* -name r2cf_$* -include "rdft/scalar/r2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +hf_%.c: $(CODELET_DEPS) $(GEN_HC2HC) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HF) -n $* -dit -name hf_$* -include "rdft/scalar/hf.h") | $(ADD_DATE) | $(INDENT) >$@ + +hf2_%.c: $(CODELET_DEPS) $(GEN_HC2HC) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HF2) -n $* -dit -name hf2_$* -include "rdft/scalar/hf.h") | $(ADD_DATE) | $(INDENT) >$@ + +r2cfII_%.c: $(CODELET_DEPS) $(GEN_R2CF) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CF) $(FLAGS_R2CF) -n $* -name r2cfII_$* -dft-II -include "rdft/scalar/r2cfII.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cf_%.c: $(CODELET_DEPS) $(GEN_HC2C) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CF) -n $* -dit -name hc2cf_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cf2_%.c: $(CODELET_DEPS) $(GEN_HC2C) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CF2) -n $* -dit -name hc2cf2_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cfdft_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CF) -n $* -dit -name hc2cfdft_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cfdft2_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CF2) -n $* -dit -name hc2cfdft2_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/Makefile.in new file mode 100644 index 000000000..31c113537 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/Makefile.in @@ -0,0 +1,925 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/scalar/r2cf +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_scalar_r2cf_la_LIBADD = +am__objects_1 = r2cf_2.lo r2cf_3.lo r2cf_4.lo r2cf_5.lo r2cf_6.lo \ + r2cf_7.lo r2cf_8.lo r2cf_9.lo r2cf_10.lo r2cf_11.lo r2cf_12.lo \ + r2cf_13.lo r2cf_14.lo r2cf_15.lo r2cf_16.lo r2cf_32.lo \ + r2cf_64.lo r2cf_128.lo r2cf_20.lo r2cf_25.lo +am__objects_2 = hf_2.lo hf_3.lo hf_4.lo hf_5.lo hf_6.lo hf_7.lo \ + hf_8.lo hf_9.lo hf_10.lo hf_12.lo hf_15.lo hf_16.lo hf_32.lo \ + hf_64.lo hf_20.lo hf_25.lo +am__objects_3 = hf2_4.lo hf2_8.lo hf2_16.lo hf2_32.lo hf2_5.lo \ + hf2_20.lo hf2_25.lo +am__objects_4 = r2cfII_2.lo r2cfII_3.lo r2cfII_4.lo r2cfII_5.lo \ + r2cfII_6.lo r2cfII_7.lo r2cfII_8.lo r2cfII_9.lo r2cfII_10.lo \ + r2cfII_12.lo r2cfII_15.lo r2cfII_16.lo r2cfII_32.lo \ + r2cfII_64.lo r2cfII_20.lo r2cfII_25.lo +am__objects_5 = hc2cf_2.lo hc2cf_4.lo hc2cf_6.lo hc2cf_8.lo \ + hc2cf_10.lo hc2cf_12.lo hc2cf_16.lo hc2cf_32.lo hc2cf_20.lo +am__objects_6 = hc2cf2_4.lo hc2cf2_8.lo hc2cf2_16.lo hc2cf2_32.lo \ + hc2cf2_20.lo +am__objects_7 = hc2cfdft_2.lo hc2cfdft_4.lo hc2cfdft_6.lo \ + hc2cfdft_8.lo hc2cfdft_10.lo hc2cfdft_12.lo hc2cfdft_16.lo \ + hc2cfdft_32.lo hc2cfdft_20.lo +am__objects_8 = hc2cfdft2_4.lo hc2cfdft2_8.lo hc2cfdft2_16.lo \ + hc2cfdft2_32.lo hc2cfdft2_20.lo +am__objects_9 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_4) $(am__objects_5) $(am__objects_6) \ + $(am__objects_7) $(am__objects_8) +am__objects_10 = codlist.lo +am__objects_11 = $(am__objects_9) $(am__objects_10) +am_librdft_scalar_r2cf_la_OBJECTS = $(am__objects_11) +librdft_scalar_r2cf_la_OBJECTS = $(am_librdft_scalar_r2cf_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_scalar_r2cf_la_SOURCES) +DIST_SOURCES = $(librdft_scalar_r2cf_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/support/Makefile.codelets +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = librdft_scalar_r2cf.la + +########################################################################### +# r2cf_ is a hard-coded real-to-complex FFT of size (base cases +# of real-input FFT recursion) +R2CF = r2cf_2.c r2cf_3.c r2cf_4.c r2cf_5.c r2cf_6.c r2cf_7.c r2cf_8.c \ +r2cf_9.c r2cf_10.c r2cf_11.c r2cf_12.c r2cf_13.c r2cf_14.c r2cf_15.c \ +r2cf_16.c r2cf_32.c r2cf_64.c r2cf_128.c \ +r2cf_20.c r2cf_25.c # r2cf_30.c r2cf_40.c r2cf_50.c + + +########################################################################### +# hf_ is a "twiddle" FFT of size , implementing a radix-r DIT +# step for a real-input FFT. Every hf codelet must have a +# corresponding r2cfII codelet (see below)! +HF = hf_2.c hf_3.c hf_4.c hf_5.c hf_6.c hf_7.c hf_8.c hf_9.c \ +hf_10.c hf_12.c hf_15.c hf_16.c hf_32.c hf_64.c \ +hf_20.c hf_25.c # hf_30.c hf_40.c hf_50.c + + +# like hf, but generates part of its trig table on the fly (good for large n) +HF2 = hf2_4.c hf2_8.c hf2_16.c hf2_32.c \ +hf2_5.c hf2_20.c hf2_25.c + + +# an r2cf transform where the input is shifted by half a sample (output +# is multiplied by a phase). This is needed as part of the DIT recursion; +# every hf_ or hf2_ codelet should have a corresponding r2cfII_ +R2CFII = r2cfII_2.c r2cfII_3.c r2cfII_4.c r2cfII_5.c r2cfII_6.c \ +r2cfII_7.c r2cfII_8.c r2cfII_9.c r2cfII_10.c r2cfII_12.c r2cfII_15.c \ +r2cfII_16.c r2cfII_32.c r2cfII_64.c \ +r2cfII_20.c r2cfII_25.c # r2cfII_30.c r2cfII_40.c r2cfII_50.c + + +########################################################################### +# hc2cf_ is a "twiddle" FFT of size , implementing a radix-r DIT +# step for a real-input FFT with rdft2-style output. must be even. +HC2CF = hc2cf_2.c hc2cf_4.c hc2cf_6.c hc2cf_8.c hc2cf_10.c hc2cf_12.c \ +hc2cf_16.c hc2cf_32.c \ +hc2cf_20.c # hc2cf_30.c + +HC2CFDFT = hc2cfdft_2.c hc2cfdft_4.c hc2cfdft_6.c hc2cfdft_8.c \ +hc2cfdft_10.c hc2cfdft_12.c hc2cfdft_16.c hc2cfdft_32.c \ +hc2cfdft_20.c # hc2cfdft_30.c + + +# like hc2cf, but generates part of its trig table on the fly (good +# for large n) +HC2CF2 = hc2cf2_4.c hc2cf2_8.c hc2cf2_16.c hc2cf2_32.c \ +hc2cf2_20.c # hc2cf2_30.c + +HC2CFDFT2 = hc2cfdft2_4.c hc2cfdft2_8.c hc2cfdft2_16.c hc2cfdft2_32.c \ +hc2cfdft2_20.c # hc2cfdft2_30.c + + +########################################################################### +ALL_CODELETS = $(R2CF) $(HF) $(HF2) $(R2CFII) $(HC2CF) $(HC2CF2) \ +$(HC2CFDFT) $(HC2CFDFT2) + +BUILT_SOURCES = $(ALL_CODELETS) $(CODLIST) +librdft_scalar_r2cf_la_SOURCES = $(BUILT_SOURCES) +SOLVTAB_NAME = X(solvtab_rdft_r2cf) +XRENAME = X +CODLIST = codlist.c +CODELET_NAME = codelet_ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +@MAINTAINER_MODE_TRUE@TWOVERS = sh ${top_srcdir}/support/twovers.sh +@MAINTAINER_MODE_TRUE@GENFFTDIR = ${top_builddir}/genfft +@MAINTAINER_MODE_TRUE@GEN_NOTW = ${GENFFTDIR}/gen_notw.native +@MAINTAINER_MODE_TRUE@GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +@MAINTAINER_MODE_TRUE@GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +@MAINTAINER_MODE_TRUE@GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +@MAINTAINER_MODE_TRUE@GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +@MAINTAINER_MODE_TRUE@GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +@MAINTAINER_MODE_TRUE@GEN_R2R = ${GENFFTDIR}/gen_r2r.native +@MAINTAINER_MODE_TRUE@PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +@MAINTAINER_MODE_TRUE@PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +@MAINTAINER_MODE_TRUE@ADD_DATE = sed -e s/@DATE@/"`date`"/ +@MAINTAINER_MODE_TRUE@COPYRIGHT = ${top_srcdir}/COPYRIGHT +@MAINTAINER_MODE_TRUE@CODELET_DEPS = $(COPYRIGHT) $(PRELUDE) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_DFT = cat $(COPYRIGHT) $(PRELUDE_DFT) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_RDFT = cat $(COPYRIGHT) $(PRELUDE_RDFT) +@MAINTAINER_MODE_TRUE@FLAGS_COMMON = -compact -variables 4 +@MAINTAINER_MODE_TRUE@DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +@MAINTAINER_MODE_TRUE@RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# special rules for regenerating codelets. +@MAINTAINER_MODE_TRUE@FLAGS_R2CF = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_HF = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_HF2 = $(RDFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_HC2CF = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_HC2CF2 = $(RDFT_FLAGS_COMMON) -twiddle-log3 -precompute-twiddles +@MAINTAINER_MODE_TRUE@FLAGS_R2CFII = $(RDFT_FLAGS_COMMON) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/support/Makefile.codelets $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/scalar/r2cf/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/scalar/r2cf/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/support/Makefile.codelets $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_scalar_r2cf.la: $(librdft_scalar_r2cf_la_OBJECTS) $(librdft_scalar_r2cf_la_DEPENDENCIES) $(EXTRA_librdft_scalar_r2cf_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(librdft_scalar_r2cf_la_OBJECTS) $(librdft_scalar_r2cf_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf2_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cf_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft2_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdft_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf2_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hf_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cfII_9.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_11.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_128.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_13.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_14.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_15.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_25.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_3.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_7.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r2cf_9.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +# rule to build codlist +@MAINTAINER_MODE_TRUE@$(CODLIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "#include \"kernel/ifftw.h\""; \ +@MAINTAINER_MODE_TRUE@ echo $(INCLUDE_SIMD_HEADER); \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo "extern const solvtab $(SOLVTAB_NAME);"; \ +@MAINTAINER_MODE_TRUE@ echo "const solvtab $(SOLVTAB_NAME) = {"; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB_END"; \ +@MAINTAINER_MODE_TRUE@ echo "};"; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# cancel the hideous builtin rules that cause an infinite loop +@MAINTAINER_MODE_TRUE@%: %.o +@MAINTAINER_MODE_TRUE@%: %.s +@MAINTAINER_MODE_TRUE@%: %.c +@MAINTAINER_MODE_TRUE@%: %.S + +@MAINTAINER_MODE_TRUE@r2cf_%.c: $(CODELET_DEPS) $(GEN_R2CF) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CF) $(FLAGS_R2CF) -n $* -name r2cf_$* -include "rdft/scalar/r2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hf_%.c: $(CODELET_DEPS) $(GEN_HC2HC) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HF) -n $* -dit -name hf_$* -include "rdft/scalar/hf.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hf2_%.c: $(CODELET_DEPS) $(GEN_HC2HC) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2HC) $(FLAGS_HF2) -n $* -dit -name hf2_$* -include "rdft/scalar/hf.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@r2cfII_%.c: $(CODELET_DEPS) $(GEN_R2CF) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2CF) $(FLAGS_R2CF) -n $* -name r2cfII_$* -dft-II -include "rdft/scalar/r2cfII.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cf_%.c: $(CODELET_DEPS) $(GEN_HC2C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CF) -n $* -dit -name hc2cf_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cf2_%.c: $(CODELET_DEPS) $(GEN_HC2C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2C) $(FLAGS_HC2CF2) -n $* -dit -name hc2cf2_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cfdft_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CF) -n $* -dit -name hc2cfdft_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cfdft2_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT) $(FLAGS_HC2CF2) -n $* -dit -name hc2cfdft2_$* -include "rdft/scalar/hc2cf.h") | $(ADD_DATE) | $(INDENT) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/codlist.c new file mode 100644 index 000000000..d594c7209 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/codlist.c @@ -0,0 +1,183 @@ +#include "kernel/ifftw.h" + + +extern void X(codelet_r2cf_2)(planner *); +extern void X(codelet_r2cf_3)(planner *); +extern void X(codelet_r2cf_4)(planner *); +extern void X(codelet_r2cf_5)(planner *); +extern void X(codelet_r2cf_6)(planner *); +extern void X(codelet_r2cf_7)(planner *); +extern void X(codelet_r2cf_8)(planner *); +extern void X(codelet_r2cf_9)(planner *); +extern void X(codelet_r2cf_10)(planner *); +extern void X(codelet_r2cf_11)(planner *); +extern void X(codelet_r2cf_12)(planner *); +extern void X(codelet_r2cf_13)(planner *); +extern void X(codelet_r2cf_14)(planner *); +extern void X(codelet_r2cf_15)(planner *); +extern void X(codelet_r2cf_16)(planner *); +extern void X(codelet_r2cf_32)(planner *); +extern void X(codelet_r2cf_64)(planner *); +extern void X(codelet_r2cf_128)(planner *); +extern void X(codelet_r2cf_20)(planner *); +extern void X(codelet_r2cf_25)(planner *); +extern void X(codelet_hf_2)(planner *); +extern void X(codelet_hf_3)(planner *); +extern void X(codelet_hf_4)(planner *); +extern void X(codelet_hf_5)(planner *); +extern void X(codelet_hf_6)(planner *); +extern void X(codelet_hf_7)(planner *); +extern void X(codelet_hf_8)(planner *); +extern void X(codelet_hf_9)(planner *); +extern void X(codelet_hf_10)(planner *); +extern void X(codelet_hf_12)(planner *); +extern void X(codelet_hf_15)(planner *); +extern void X(codelet_hf_16)(planner *); +extern void X(codelet_hf_32)(planner *); +extern void X(codelet_hf_64)(planner *); +extern void X(codelet_hf_20)(planner *); +extern void X(codelet_hf_25)(planner *); +extern void X(codelet_hf2_4)(planner *); +extern void X(codelet_hf2_8)(planner *); +extern void X(codelet_hf2_16)(planner *); +extern void X(codelet_hf2_32)(planner *); +extern void X(codelet_hf2_5)(planner *); +extern void X(codelet_hf2_20)(planner *); +extern void X(codelet_hf2_25)(planner *); +extern void X(codelet_r2cfII_2)(planner *); +extern void X(codelet_r2cfII_3)(planner *); +extern void X(codelet_r2cfII_4)(planner *); +extern void X(codelet_r2cfII_5)(planner *); +extern void X(codelet_r2cfII_6)(planner *); +extern void X(codelet_r2cfII_7)(planner *); +extern void X(codelet_r2cfII_8)(planner *); +extern void X(codelet_r2cfII_9)(planner *); +extern void X(codelet_r2cfII_10)(planner *); +extern void X(codelet_r2cfII_12)(planner *); +extern void X(codelet_r2cfII_15)(planner *); +extern void X(codelet_r2cfII_16)(planner *); +extern void X(codelet_r2cfII_32)(planner *); +extern void X(codelet_r2cfII_64)(planner *); +extern void X(codelet_r2cfII_20)(planner *); +extern void X(codelet_r2cfII_25)(planner *); +extern void X(codelet_hc2cf_2)(planner *); +extern void X(codelet_hc2cf_4)(planner *); +extern void X(codelet_hc2cf_6)(planner *); +extern void X(codelet_hc2cf_8)(planner *); +extern void X(codelet_hc2cf_10)(planner *); +extern void X(codelet_hc2cf_12)(planner *); +extern void X(codelet_hc2cf_16)(planner *); +extern void X(codelet_hc2cf_32)(planner *); +extern void X(codelet_hc2cf_20)(planner *); +extern void X(codelet_hc2cf2_4)(planner *); +extern void X(codelet_hc2cf2_8)(planner *); +extern void X(codelet_hc2cf2_16)(planner *); +extern void X(codelet_hc2cf2_32)(planner *); +extern void X(codelet_hc2cf2_20)(planner *); +extern void X(codelet_hc2cfdft_2)(planner *); +extern void X(codelet_hc2cfdft_4)(planner *); +extern void X(codelet_hc2cfdft_6)(planner *); +extern void X(codelet_hc2cfdft_8)(planner *); +extern void X(codelet_hc2cfdft_10)(planner *); +extern void X(codelet_hc2cfdft_12)(planner *); +extern void X(codelet_hc2cfdft_16)(planner *); +extern void X(codelet_hc2cfdft_32)(planner *); +extern void X(codelet_hc2cfdft_20)(planner *); +extern void X(codelet_hc2cfdft2_4)(planner *); +extern void X(codelet_hc2cfdft2_8)(planner *); +extern void X(codelet_hc2cfdft2_16)(planner *); +extern void X(codelet_hc2cfdft2_32)(planner *); +extern void X(codelet_hc2cfdft2_20)(planner *); + + +extern const solvtab X(solvtab_rdft_r2cf); +const solvtab X(solvtab_rdft_r2cf) = { + SOLVTAB(X(codelet_r2cf_2)), + SOLVTAB(X(codelet_r2cf_3)), + SOLVTAB(X(codelet_r2cf_4)), + SOLVTAB(X(codelet_r2cf_5)), + SOLVTAB(X(codelet_r2cf_6)), + SOLVTAB(X(codelet_r2cf_7)), + SOLVTAB(X(codelet_r2cf_8)), + SOLVTAB(X(codelet_r2cf_9)), + SOLVTAB(X(codelet_r2cf_10)), + SOLVTAB(X(codelet_r2cf_11)), + SOLVTAB(X(codelet_r2cf_12)), + SOLVTAB(X(codelet_r2cf_13)), + SOLVTAB(X(codelet_r2cf_14)), + SOLVTAB(X(codelet_r2cf_15)), + SOLVTAB(X(codelet_r2cf_16)), + SOLVTAB(X(codelet_r2cf_32)), + SOLVTAB(X(codelet_r2cf_64)), + SOLVTAB(X(codelet_r2cf_128)), + SOLVTAB(X(codelet_r2cf_20)), + SOLVTAB(X(codelet_r2cf_25)), + SOLVTAB(X(codelet_hf_2)), + SOLVTAB(X(codelet_hf_3)), + SOLVTAB(X(codelet_hf_4)), + SOLVTAB(X(codelet_hf_5)), + SOLVTAB(X(codelet_hf_6)), + SOLVTAB(X(codelet_hf_7)), + SOLVTAB(X(codelet_hf_8)), + SOLVTAB(X(codelet_hf_9)), + SOLVTAB(X(codelet_hf_10)), + SOLVTAB(X(codelet_hf_12)), + SOLVTAB(X(codelet_hf_15)), + SOLVTAB(X(codelet_hf_16)), + SOLVTAB(X(codelet_hf_32)), + SOLVTAB(X(codelet_hf_64)), + SOLVTAB(X(codelet_hf_20)), + SOLVTAB(X(codelet_hf_25)), + SOLVTAB(X(codelet_hf2_4)), + SOLVTAB(X(codelet_hf2_8)), + SOLVTAB(X(codelet_hf2_16)), + SOLVTAB(X(codelet_hf2_32)), + SOLVTAB(X(codelet_hf2_5)), + SOLVTAB(X(codelet_hf2_20)), + SOLVTAB(X(codelet_hf2_25)), + SOLVTAB(X(codelet_r2cfII_2)), + SOLVTAB(X(codelet_r2cfII_3)), + SOLVTAB(X(codelet_r2cfII_4)), + SOLVTAB(X(codelet_r2cfII_5)), + SOLVTAB(X(codelet_r2cfII_6)), + SOLVTAB(X(codelet_r2cfII_7)), + SOLVTAB(X(codelet_r2cfII_8)), + SOLVTAB(X(codelet_r2cfII_9)), + SOLVTAB(X(codelet_r2cfII_10)), + SOLVTAB(X(codelet_r2cfII_12)), + SOLVTAB(X(codelet_r2cfII_15)), + SOLVTAB(X(codelet_r2cfII_16)), + SOLVTAB(X(codelet_r2cfII_32)), + SOLVTAB(X(codelet_r2cfII_64)), + SOLVTAB(X(codelet_r2cfII_20)), + SOLVTAB(X(codelet_r2cfII_25)), + SOLVTAB(X(codelet_hc2cf_2)), + SOLVTAB(X(codelet_hc2cf_4)), + SOLVTAB(X(codelet_hc2cf_6)), + SOLVTAB(X(codelet_hc2cf_8)), + SOLVTAB(X(codelet_hc2cf_10)), + SOLVTAB(X(codelet_hc2cf_12)), + SOLVTAB(X(codelet_hc2cf_16)), + SOLVTAB(X(codelet_hc2cf_32)), + SOLVTAB(X(codelet_hc2cf_20)), + SOLVTAB(X(codelet_hc2cf2_4)), + SOLVTAB(X(codelet_hc2cf2_8)), + SOLVTAB(X(codelet_hc2cf2_16)), + SOLVTAB(X(codelet_hc2cf2_32)), + SOLVTAB(X(codelet_hc2cf2_20)), + SOLVTAB(X(codelet_hc2cfdft_2)), + SOLVTAB(X(codelet_hc2cfdft_4)), + SOLVTAB(X(codelet_hc2cfdft_6)), + SOLVTAB(X(codelet_hc2cfdft_8)), + SOLVTAB(X(codelet_hc2cfdft_10)), + SOLVTAB(X(codelet_hc2cfdft_12)), + SOLVTAB(X(codelet_hc2cfdft_16)), + SOLVTAB(X(codelet_hc2cfdft_32)), + SOLVTAB(X(codelet_hc2cfdft_20)), + SOLVTAB(X(codelet_hc2cfdft2_4)), + SOLVTAB(X(codelet_hc2cfdft2_8)), + SOLVTAB(X(codelet_hc2cfdft2_16)), + SOLVTAB(X(codelet_hc2cfdft2_32)), + SOLVTAB(X(codelet_hc2cfdft2_20)), + SOLVTAB_END +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_16.c new file mode 100644 index 000000000..89d1dc92e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_16.c @@ -0,0 +1,836 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:08 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -dit -name hc2cf2_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 196 FP additions, 134 FP multiplications, + * (or, 104 additions, 42 multiplications, 92 fused multiply/add), + * 90 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T2, Tf, TM, TO, T3, T6, T5, Th, Tz, Ti, T7, TZ, TT, Tq, TW; + E Tb, Tu, TP, TI, TF, TC, T1z, T1O, T1D, T1L, Tm, T1f, T1p, T1j, T1m; + { + E TN, TS, T4, Tp, Ta, Tt, Tl, Tg; + T2 = W[0]; + Tf = W[2]; + Tg = T2 * Tf; + TM = W[6]; + TN = T2 * TM; + TO = W[7]; + TS = T2 * TO; + T3 = W[4]; + T4 = T2 * T3; + Tp = Tf * T3; + T6 = W[5]; + Ta = T2 * T6; + Tt = Tf * T6; + T5 = W[1]; + Th = W[3]; + Tl = T2 * Th; + Tz = FMA(T5, Th, Tg); + Ti = FNMS(T5, Th, Tg); + T7 = FMA(T5, T6, T4); + TZ = FNMS(Th, T3, Tt); + TT = FNMS(T5, TM, TS); + Tq = FNMS(Th, T6, Tp); + TW = FMA(Th, T6, Tp); + Tb = FNMS(T5, T3, Ta); + Tu = FMA(Th, T3, Tt); + TP = FMA(T5, TO, TN); + TI = FMA(T5, T3, Ta); + TF = FNMS(T5, T6, T4); + { + E T1y, T1C, T1e, T1i; + T1y = Tz * T3; + T1C = Tz * T6; + TC = FNMS(T5, Tf, Tl); + T1z = FMA(TC, T6, T1y); + T1O = FMA(TC, T3, T1C); + T1D = FNMS(TC, T3, T1C); + T1L = FNMS(TC, T6, T1y); + T1e = Ti * T3; + T1i = Ti * T6; + Tm = FMA(T5, Tf, Tl); + T1f = FMA(Tm, T6, T1e); + T1p = FMA(Tm, T3, T1i); + T1j = FNMS(Tm, T3, T1i); + T1m = FNMS(Tm, T6, T1e); + } + } + { + E Te, T1U, T3A, T3L, T1G, T2D, T2B, T3h, T1R, T2w, T2I, T3i, Tx, T3M, T1Z; + E T3w, TL, T26, T25, T37, T1d, T2o, T2l, T3c, T1s, T2m, T2t, T3d, T12, T28; + E T2d, T38; + { + E T1, T3z, T8, T9, Tc, T3x, Td, T3y; + T1 = Rp[0]; + T3z = Rm[0]; + T8 = Rp[WS(rs, 4)]; + T9 = T7 * T8; + Tc = Rm[WS(rs, 4)]; + T3x = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Te = T1 + Td; + T1U = T1 - Td; + T3y = FNMS(Tb, T8, T3x); + T3A = T3y + T3z; + T3L = T3z - T3y; + } + { + E T1u, T1v, T1w, T2x, T1A, T1B, T1E, T2z; + T1u = Ip[WS(rs, 7)]; + T1v = TM * T1u; + T1w = Im[WS(rs, 7)]; + T2x = TM * T1w; + T1A = Ip[WS(rs, 3)]; + T1B = T1z * T1A; + T1E = Im[WS(rs, 3)]; + T2z = T1z * T1E; + { + E T1x, T1F, T2y, T2A; + T1x = FMA(TO, T1w, T1v); + T1F = FMA(T1D, T1E, T1B); + T1G = T1x + T1F; + T2D = T1x - T1F; + T2y = FNMS(TO, T1u, T2x); + T2A = FNMS(T1D, T1A, T2z); + T2B = T2y - T2A; + T3h = T2y + T2A; + } + } + { + E T1H, T1I, T1J, T2E, T1M, T1N, T1P, T2G; + T1H = Ip[WS(rs, 1)]; + T1I = Tf * T1H; + T1J = Im[WS(rs, 1)]; + T2E = Tf * T1J; + T1M = Ip[WS(rs, 5)]; + T1N = T1L * T1M; + T1P = Im[WS(rs, 5)]; + T2G = T1L * T1P; + { + E T1K, T1Q, T2F, T2H; + T1K = FMA(Th, T1J, T1I); + T1Q = FMA(T1O, T1P, T1N); + T1R = T1K + T1Q; + T2w = T1Q - T1K; + T2F = FNMS(Th, T1H, T2E); + T2H = FNMS(T1O, T1M, T2G); + T2I = T2F - T2H; + T3i = T2F + T2H; + } + } + { + E Tj, Tk, Tn, T1V, Tr, Ts, Tv, T1X; + Tj = Rp[WS(rs, 2)]; + Tk = Ti * Tj; + Tn = Rm[WS(rs, 2)]; + T1V = Ti * Tn; + Tr = Rp[WS(rs, 6)]; + Ts = Tq * Tr; + Tv = Rm[WS(rs, 6)]; + T1X = Tq * Tv; + { + E To, Tw, T1W, T1Y; + To = FMA(Tm, Tn, Tk); + Tw = FMA(Tu, Tv, Ts); + Tx = To + Tw; + T3M = To - Tw; + T1W = FNMS(Tm, Tj, T1V); + T1Y = FNMS(Tu, Tr, T1X); + T1Z = T1W - T1Y; + T3w = T1W + T1Y; + } + } + { + E TA, TB, TD, T21, TG, TH, TJ, T23; + TA = Rp[WS(rs, 1)]; + TB = Tz * TA; + TD = Rm[WS(rs, 1)]; + T21 = Tz * TD; + TG = Rp[WS(rs, 5)]; + TH = TF * TG; + TJ = Rm[WS(rs, 5)]; + T23 = TF * TJ; + { + E TE, TK, T22, T24; + TE = FMA(TC, TD, TB); + TK = FMA(TI, TJ, TH); + TL = TE + TK; + T26 = TE - TK; + T22 = FNMS(TC, TA, T21); + T24 = FNMS(TI, TG, T23); + T25 = T22 - T24; + T37 = T22 + T24; + } + } + { + E T15, T16, T17, T2h, T19, T1a, T1b, T2j; + T15 = Ip[0]; + T16 = T2 * T15; + T17 = Im[0]; + T2h = T2 * T17; + T19 = Ip[WS(rs, 4)]; + T1a = T3 * T19; + T1b = Im[WS(rs, 4)]; + T2j = T3 * T1b; + { + E T18, T1c, T2i, T2k; + T18 = FMA(T5, T17, T16); + T1c = FMA(T6, T1b, T1a); + T1d = T18 + T1c; + T2o = T18 - T1c; + T2i = FNMS(T5, T15, T2h); + T2k = FNMS(T6, T19, T2j); + T2l = T2i - T2k; + T3c = T2i + T2k; + } + } + { + E T1g, T1h, T1k, T2p, T1n, T1o, T1q, T2r; + T1g = Ip[WS(rs, 2)]; + T1h = T1f * T1g; + T1k = Im[WS(rs, 2)]; + T2p = T1f * T1k; + T1n = Ip[WS(rs, 6)]; + T1o = T1m * T1n; + T1q = Im[WS(rs, 6)]; + T2r = T1m * T1q; + { + E T1l, T1r, T2q, T2s; + T1l = FMA(T1j, T1k, T1h); + T1r = FMA(T1p, T1q, T1o); + T1s = T1l + T1r; + T2m = T1l - T1r; + T2q = FNMS(T1j, T1g, T2p); + T2s = FNMS(T1p, T1n, T2r); + T2t = T2q - T2s; + T3d = T2q + T2s; + } + } + { + E TQ, TR, TU, T29, TX, TY, T10, T2b; + TQ = Rp[WS(rs, 7)]; + TR = TP * TQ; + TU = Rm[WS(rs, 7)]; + T29 = TP * TU; + TX = Rp[WS(rs, 3)]; + TY = TW * TX; + T10 = Rm[WS(rs, 3)]; + T2b = TW * T10; + { + E TV, T11, T2a, T2c; + TV = FMA(TT, TU, TR); + T11 = FMA(TZ, T10, TY); + T12 = TV + T11; + T28 = TV - T11; + T2a = FNMS(TT, TQ, T29); + T2c = FNMS(TZ, TX, T2b); + T2d = T2a - T2c; + T38 = T2a + T2c; + } + } + { + E T14, T3q, T3C, T3E, T1T, T3D, T3t, T3u; + { + E Ty, T13, T3v, T3B; + Ty = Te + Tx; + T13 = TL + T12; + T14 = Ty + T13; + T3q = Ty - T13; + T3v = T37 + T38; + T3B = T3w + T3A; + T3C = T3v + T3B; + T3E = T3B - T3v; + } + { + E T1t, T1S, T3r, T3s; + T1t = T1d + T1s; + T1S = T1G + T1R; + T1T = T1t + T1S; + T3D = T1S - T1t; + T3r = T3c + T3d; + T3s = T3h + T3i; + T3t = T3r - T3s; + T3u = T3r + T3s; + } + Rm[WS(rs, 7)] = T14 - T1T; + Im[WS(rs, 7)] = T3u - T3C; + Rp[0] = T14 + T1T; + Ip[0] = T3u + T3C; + Rm[WS(rs, 3)] = T3q - T3t; + Im[WS(rs, 3)] = T3D - T3E; + Rp[WS(rs, 4)] = T3q + T3t; + Ip[WS(rs, 4)] = T3D + T3E; + } + { + E T3a, T3m, T3H, T3J, T3f, T3n, T3k, T3o; + { + E T36, T39, T3F, T3G; + T36 = Te - Tx; + T39 = T37 - T38; + T3a = T36 + T39; + T3m = T36 - T39; + T3F = T12 - TL; + T3G = T3A - T3w; + T3H = T3F + T3G; + T3J = T3G - T3F; + } + { + E T3b, T3e, T3g, T3j; + T3b = T1d - T1s; + T3e = T3c - T3d; + T3f = T3b + T3e; + T3n = T3e - T3b; + T3g = T1G - T1R; + T3j = T3h - T3i; + T3k = T3g - T3j; + T3o = T3g + T3j; + } + { + E T3l, T3I, T3p, T3K; + T3l = T3f + T3k; + Rm[WS(rs, 5)] = FNMS(KP707106781, T3l, T3a); + Rp[WS(rs, 2)] = FMA(KP707106781, T3l, T3a); + T3I = T3n + T3o; + Im[WS(rs, 5)] = FMS(KP707106781, T3I, T3H); + Ip[WS(rs, 2)] = FMA(KP707106781, T3I, T3H); + T3p = T3n - T3o; + Rm[WS(rs, 1)] = FNMS(KP707106781, T3p, T3m); + Rp[WS(rs, 6)] = FMA(KP707106781, T3p, T3m); + T3K = T3k - T3f; + Im[WS(rs, 1)] = FMS(KP707106781, T3K, T3J); + Ip[WS(rs, 6)] = FMA(KP707106781, T3K, T3J); + } + } + { + E T20, T3N, T3T, T2Q, T2f, T3O, T30, T34, T2T, T3U, T2v, T2N, T2X, T33, T2K; + E T2O; + { + E T27, T2e, T2n, T2u; + T20 = T1U - T1Z; + T3N = T3L - T3M; + T3T = T3M + T3L; + T2Q = T1U + T1Z; + T27 = T25 - T26; + T2e = T28 + T2d; + T2f = T27 - T2e; + T3O = T27 + T2e; + { + E T2Y, T2Z, T2R, T2S; + T2Y = T2D + T2I; + T2Z = T2B + T2w; + T30 = FNMS(KP414213562, T2Z, T2Y); + T34 = FMA(KP414213562, T2Y, T2Z); + T2R = T26 + T25; + T2S = T28 - T2d; + T2T = T2R + T2S; + T3U = T2S - T2R; + } + T2n = T2l + T2m; + T2u = T2o - T2t; + T2v = FMA(KP414213562, T2u, T2n); + T2N = FNMS(KP414213562, T2n, T2u); + { + E T2V, T2W, T2C, T2J; + T2V = T2o + T2t; + T2W = T2l - T2m; + T2X = FMA(KP414213562, T2W, T2V); + T33 = FNMS(KP414213562, T2V, T2W); + T2C = T2w - T2B; + T2J = T2D - T2I; + T2K = FMA(KP414213562, T2J, T2C); + T2O = FNMS(KP414213562, T2C, T2J); + } + } + { + E T2g, T2L, T3V, T3W; + T2g = FMA(KP707106781, T2f, T20); + T2L = T2v + T2K; + Rm[WS(rs, 4)] = FNMS(KP923879532, T2L, T2g); + Rp[WS(rs, 3)] = FMA(KP923879532, T2L, T2g); + T3V = FMA(KP707106781, T3U, T3T); + T3W = T2O - T2N; + Im[WS(rs, 4)] = FMS(KP923879532, T3W, T3V); + Ip[WS(rs, 3)] = FMA(KP923879532, T3W, T3V); + } + { + E T2M, T2P, T3X, T3Y; + T2M = FNMS(KP707106781, T2f, T20); + T2P = T2N + T2O; + Rp[WS(rs, 7)] = FNMS(KP923879532, T2P, T2M); + Rm[0] = FMA(KP923879532, T2P, T2M); + T3X = FNMS(KP707106781, T3U, T3T); + T3Y = T2K - T2v; + Im[0] = FMS(KP923879532, T3Y, T3X); + Ip[WS(rs, 7)] = FMA(KP923879532, T3Y, T3X); + } + { + E T2U, T31, T3P, T3Q; + T2U = FMA(KP707106781, T2T, T2Q); + T31 = T2X + T30; + Rm[WS(rs, 6)] = FNMS(KP923879532, T31, T2U); + Rp[WS(rs, 1)] = FMA(KP923879532, T31, T2U); + T3P = FMA(KP707106781, T3O, T3N); + T3Q = T33 + T34; + Im[WS(rs, 6)] = FMS(KP923879532, T3Q, T3P); + Ip[WS(rs, 1)] = FMA(KP923879532, T3Q, T3P); + } + { + E T32, T35, T3R, T3S; + T32 = FNMS(KP707106781, T2T, T2Q); + T35 = T33 - T34; + Rm[WS(rs, 2)] = FNMS(KP923879532, T35, T32); + Rp[WS(rs, 5)] = FMA(KP923879532, T35, T32); + T3R = FNMS(KP707106781, T3O, T3N); + T3S = T30 - T2X; + Im[WS(rs, 2)] = FMS(KP923879532, T3S, T3R); + Ip[WS(rs, 5)] = FMA(KP923879532, T3S, T3R); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cf2_16", twinstr, &GENUS, {104, 42, 92, 0} }; + +void X(codelet_hc2cf2_16) (planner *p) { + X(khc2c_register) (p, hc2cf2_16, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -dit -name hc2cf2_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 196 FP additions, 108 FP multiplications, + * (or, 156 additions, 68 multiplications, 40 fused multiply/add), + * 82 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T2, T5, Tg, Ti, Tk, To, TE, TC, T6, T3, T8, TW, TJ, Tt, TU; + E Tc, Tx, TH, TN, TO, TP, TR, T1f, T1k, T1b, T1i, T1y, T1H, T1u, T1F; + { + E T7, Tv, Ta, Ts, T4, Tw, Tb, Tr; + { + E Th, Tn, Tj, Tm; + T2 = W[0]; + T5 = W[1]; + Tg = W[2]; + Ti = W[3]; + Th = T2 * Tg; + Tn = T5 * Tg; + Tj = T5 * Ti; + Tm = T2 * Ti; + Tk = Th - Tj; + To = Tm + Tn; + TE = Tm - Tn; + TC = Th + Tj; + T6 = W[5]; + T7 = T5 * T6; + Tv = Tg * T6; + Ta = T2 * T6; + Ts = Ti * T6; + T3 = W[4]; + T4 = T2 * T3; + Tw = Ti * T3; + Tb = T5 * T3; + Tr = Tg * T3; + } + T8 = T4 + T7; + TW = Tv - Tw; + TJ = Ta + Tb; + Tt = Tr - Ts; + TU = Tr + Ts; + Tc = Ta - Tb; + Tx = Tv + Tw; + TH = T4 - T7; + TN = W[6]; + TO = W[7]; + TP = FMA(T2, TN, T5 * TO); + TR = FNMS(T5, TN, T2 * TO); + { + E T1d, T1e, T19, T1a; + T1d = Tk * T6; + T1e = To * T3; + T1f = T1d - T1e; + T1k = T1d + T1e; + T19 = Tk * T3; + T1a = To * T6; + T1b = T19 + T1a; + T1i = T19 - T1a; + } + { + E T1w, T1x, T1s, T1t; + T1w = TC * T6; + T1x = TE * T3; + T1y = T1w - T1x; + T1H = T1w + T1x; + T1s = TC * T3; + T1t = TE * T6; + T1u = T1s + T1t; + T1F = T1s - T1t; + } + } + { + E Tf, T3r, T1N, T3e, TA, T3s, T1Q, T3b, TM, T2M, T1W, T2w, TZ, T2N, T21; + E T2x, T1B, T1K, T2V, T2W, T2X, T2Y, T2j, T2D, T2o, T2E, T18, T1n, T2Q, T2R; + E T2S, T2T, T28, T2A, T2d, T2B; + { + E T1, T3d, Te, T3c, T9, Td; + T1 = Rp[0]; + T3d = Rm[0]; + T9 = Rp[WS(rs, 4)]; + Td = Rm[WS(rs, 4)]; + Te = FMA(T8, T9, Tc * Td); + T3c = FNMS(Tc, T9, T8 * Td); + Tf = T1 + Te; + T3r = T3d - T3c; + T1N = T1 - Te; + T3e = T3c + T3d; + } + { + E Tq, T1O, Tz, T1P; + { + E Tl, Tp, Tu, Ty; + Tl = Rp[WS(rs, 2)]; + Tp = Rm[WS(rs, 2)]; + Tq = FMA(Tk, Tl, To * Tp); + T1O = FNMS(To, Tl, Tk * Tp); + Tu = Rp[WS(rs, 6)]; + Ty = Rm[WS(rs, 6)]; + Tz = FMA(Tt, Tu, Tx * Ty); + T1P = FNMS(Tx, Tu, Tt * Ty); + } + TA = Tq + Tz; + T3s = Tq - Tz; + T1Q = T1O - T1P; + T3b = T1O + T1P; + } + { + E TG, T1S, TL, T1T, T1U, T1V; + { + E TD, TF, TI, TK; + TD = Rp[WS(rs, 1)]; + TF = Rm[WS(rs, 1)]; + TG = FMA(TC, TD, TE * TF); + T1S = FNMS(TE, TD, TC * TF); + TI = Rp[WS(rs, 5)]; + TK = Rm[WS(rs, 5)]; + TL = FMA(TH, TI, TJ * TK); + T1T = FNMS(TJ, TI, TH * TK); + } + TM = TG + TL; + T2M = T1S + T1T; + T1U = T1S - T1T; + T1V = TG - TL; + T1W = T1U - T1V; + T2w = T1V + T1U; + } + { + E TT, T1Y, TY, T1Z, T1X, T20; + { + E TQ, TS, TV, TX; + TQ = Rp[WS(rs, 7)]; + TS = Rm[WS(rs, 7)]; + TT = FMA(TP, TQ, TR * TS); + T1Y = FNMS(TR, TQ, TP * TS); + TV = Rp[WS(rs, 3)]; + TX = Rm[WS(rs, 3)]; + TY = FMA(TU, TV, TW * TX); + T1Z = FNMS(TW, TV, TU * TX); + } + TZ = TT + TY; + T2N = T1Y + T1Z; + T1X = TT - TY; + T20 = T1Y - T1Z; + T21 = T1X + T20; + T2x = T1X - T20; + } + { + E T1r, T2k, T1J, T2h, T1A, T2l, T1E, T2g; + { + E T1p, T1q, T1G, T1I; + T1p = Ip[WS(rs, 7)]; + T1q = Im[WS(rs, 7)]; + T1r = FMA(TN, T1p, TO * T1q); + T2k = FNMS(TO, T1p, TN * T1q); + T1G = Ip[WS(rs, 5)]; + T1I = Im[WS(rs, 5)]; + T1J = FMA(T1F, T1G, T1H * T1I); + T2h = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1v, T1z, T1C, T1D; + T1v = Ip[WS(rs, 3)]; + T1z = Im[WS(rs, 3)]; + T1A = FMA(T1u, T1v, T1y * T1z); + T2l = FNMS(T1y, T1v, T1u * T1z); + T1C = Ip[WS(rs, 1)]; + T1D = Im[WS(rs, 1)]; + T1E = FMA(Tg, T1C, Ti * T1D); + T2g = FNMS(Ti, T1C, Tg * T1D); + } + T1B = T1r + T1A; + T1K = T1E + T1J; + T2V = T1B - T1K; + T2W = T2k + T2l; + T2X = T2g + T2h; + T2Y = T2W - T2X; + { + E T2f, T2i, T2m, T2n; + T2f = T1r - T1A; + T2i = T2g - T2h; + T2j = T2f - T2i; + T2D = T2f + T2i; + T2m = T2k - T2l; + T2n = T1E - T1J; + T2o = T2m + T2n; + T2E = T2m - T2n; + } + } + { + E T14, T24, T1m, T2b, T17, T25, T1h, T2a; + { + E T12, T13, T1j, T1l; + T12 = Ip[0]; + T13 = Im[0]; + T14 = FMA(T2, T12, T5 * T13); + T24 = FNMS(T5, T12, T2 * T13); + T1j = Ip[WS(rs, 6)]; + T1l = Im[WS(rs, 6)]; + T1m = FMA(T1i, T1j, T1k * T1l); + T2b = FNMS(T1k, T1j, T1i * T1l); + } + { + E T15, T16, T1c, T1g; + T15 = Ip[WS(rs, 4)]; + T16 = Im[WS(rs, 4)]; + T17 = FMA(T3, T15, T6 * T16); + T25 = FNMS(T6, T15, T3 * T16); + T1c = Ip[WS(rs, 2)]; + T1g = Im[WS(rs, 2)]; + T1h = FMA(T1b, T1c, T1f * T1g); + T2a = FNMS(T1f, T1c, T1b * T1g); + } + T18 = T14 + T17; + T1n = T1h + T1m; + T2Q = T18 - T1n; + T2R = T24 + T25; + T2S = T2a + T2b; + T2T = T2R - T2S; + { + E T26, T27, T29, T2c; + T26 = T24 - T25; + T27 = T1h - T1m; + T28 = T26 + T27; + T2A = T26 - T27; + T29 = T14 - T17; + T2c = T2a - T2b; + T2d = T29 - T2c; + T2B = T29 + T2c; + } + } + { + E T23, T2r, T3A, T3C, T2q, T3B, T2u, T3x; + { + E T1R, T22, T3y, T3z; + T1R = T1N - T1Q; + T22 = KP707106781 * (T1W - T21); + T23 = T1R + T22; + T2r = T1R - T22; + T3y = KP707106781 * (T2x - T2w); + T3z = T3s + T3r; + T3A = T3y + T3z; + T3C = T3z - T3y; + } + { + E T2e, T2p, T2s, T2t; + T2e = FMA(KP923879532, T28, KP382683432 * T2d); + T2p = FNMS(KP923879532, T2o, KP382683432 * T2j); + T2q = T2e + T2p; + T3B = T2p - T2e; + T2s = FNMS(KP923879532, T2d, KP382683432 * T28); + T2t = FMA(KP382683432, T2o, KP923879532 * T2j); + T2u = T2s - T2t; + T3x = T2s + T2t; + } + Rm[WS(rs, 4)] = T23 - T2q; + Im[WS(rs, 4)] = T3x - T3A; + Rp[WS(rs, 3)] = T23 + T2q; + Ip[WS(rs, 3)] = T3x + T3A; + Rm[0] = T2r - T2u; + Im[0] = T3B - T3C; + Rp[WS(rs, 7)] = T2r + T2u; + Ip[WS(rs, 7)] = T3B + T3C; + } + { + E T2P, T31, T3m, T3o, T30, T3n, T34, T3j; + { + E T2L, T2O, T3k, T3l; + T2L = Tf - TA; + T2O = T2M - T2N; + T2P = T2L + T2O; + T31 = T2L - T2O; + T3k = TZ - TM; + T3l = T3e - T3b; + T3m = T3k + T3l; + T3o = T3l - T3k; + } + { + E T2U, T2Z, T32, T33; + T2U = T2Q + T2T; + T2Z = T2V - T2Y; + T30 = KP707106781 * (T2U + T2Z); + T3n = KP707106781 * (T2Z - T2U); + T32 = T2T - T2Q; + T33 = T2V + T2Y; + T34 = KP707106781 * (T32 - T33); + T3j = KP707106781 * (T32 + T33); + } + Rm[WS(rs, 5)] = T2P - T30; + Im[WS(rs, 5)] = T3j - T3m; + Rp[WS(rs, 2)] = T2P + T30; + Ip[WS(rs, 2)] = T3j + T3m; + Rm[WS(rs, 1)] = T31 - T34; + Im[WS(rs, 1)] = T3n - T3o; + Rp[WS(rs, 6)] = T31 + T34; + Ip[WS(rs, 6)] = T3n + T3o; + } + { + E T2z, T2H, T3u, T3w, T2G, T3v, T2K, T3p; + { + E T2v, T2y, T3q, T3t; + T2v = T1N + T1Q; + T2y = KP707106781 * (T2w + T2x); + T2z = T2v + T2y; + T2H = T2v - T2y; + T3q = KP707106781 * (T1W + T21); + T3t = T3r - T3s; + T3u = T3q + T3t; + T3w = T3t - T3q; + } + { + E T2C, T2F, T2I, T2J; + T2C = FMA(KP382683432, T2A, KP923879532 * T2B); + T2F = FNMS(KP382683432, T2E, KP923879532 * T2D); + T2G = T2C + T2F; + T3v = T2F - T2C; + T2I = FNMS(KP382683432, T2B, KP923879532 * T2A); + T2J = FMA(KP923879532, T2E, KP382683432 * T2D); + T2K = T2I - T2J; + T3p = T2I + T2J; + } + Rm[WS(rs, 6)] = T2z - T2G; + Im[WS(rs, 6)] = T3p - T3u; + Rp[WS(rs, 1)] = T2z + T2G; + Ip[WS(rs, 1)] = T3p + T3u; + Rm[WS(rs, 2)] = T2H - T2K; + Im[WS(rs, 2)] = T3v - T3w; + Rp[WS(rs, 5)] = T2H + T2K; + Ip[WS(rs, 5)] = T3v + T3w; + } + { + E T11, T35, T3g, T3i, T1M, T3h, T38, T39; + { + E TB, T10, T3a, T3f; + TB = Tf + TA; + T10 = TM + TZ; + T11 = TB + T10; + T35 = TB - T10; + T3a = T2M + T2N; + T3f = T3b + T3e; + T3g = T3a + T3f; + T3i = T3f - T3a; + } + { + E T1o, T1L, T36, T37; + T1o = T18 + T1n; + T1L = T1B + T1K; + T1M = T1o + T1L; + T3h = T1L - T1o; + T36 = T2R + T2S; + T37 = T2W + T2X; + T38 = T36 - T37; + T39 = T36 + T37; + } + Rm[WS(rs, 7)] = T11 - T1M; + Im[WS(rs, 7)] = T39 - T3g; + Rp[0] = T11 + T1M; + Ip[0] = T39 + T3g; + Rm[WS(rs, 3)] = T35 - T38; + Im[WS(rs, 3)] = T3h - T3i; + Rp[WS(rs, 4)] = T35 + T38; + Ip[WS(rs, 4)] = T3h + T3i; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cf2_16", twinstr, &GENUS, {156, 68, 40, 0} }; + +void X(codelet_hc2cf2_16) (planner *p) { + X(khc2c_register) (p, hc2cf2_16, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_20.c new file mode 100644 index 000000000..46e2de4f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_20.c @@ -0,0 +1,1097 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -dit -name hc2cf2_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 276 FP additions, 198 FP multiplications, + * (or, 136 additions, 58 multiplications, 140 fused multiply/add), + * 95 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(80, rs)) { + E T2, Th, Tf, T6, T5, Ti, Tl, T1n, T3, Tt, Tv, T7, T17, T1L, T24; + E Tb, T13, T1P, T21, T1b, T1D, T1A, T1H, T1f, TA, Tw, Tq, Tm, TK, T1S; + E TO, T1p, T1q, T1u, T2n, T2k, T2h, T2d; + { + E Tk, Ta, T1e, T4, T1a, Tj, T12, T1G, T16, T1K, Tg, Tz; + T2 = W[0]; + Th = W[3]; + Tf = W[2]; + Tg = T2 * Tf; + Tk = T2 * Th; + T6 = W[5]; + Ta = T2 * T6; + T1e = Tf * T6; + T5 = W[1]; + Ti = FNMS(T5, Th, Tg); + Tl = FMA(T5, Tf, Tk); + T1n = FMA(T5, Th, Tg); + T3 = W[4]; + T4 = T2 * T3; + T1a = Tf * T3; + Tj = Ti * T3; + Tt = W[6]; + T12 = Tf * Tt; + T1G = T2 * Tt; + Tv = W[7]; + T16 = Tf * Tv; + T1K = T2 * Tv; + T7 = FNMS(T5, T6, T4); + T17 = FNMS(Th, Tt, T16); + T1L = FNMS(T5, Tt, T1K); + T24 = FMA(Th, T3, T1e); + Tb = FMA(T5, T3, Ta); + T13 = FMA(Th, Tv, T12); + T1P = FNMS(Tl, T6, Tj); + T21 = FNMS(Th, T6, T1a); + T1b = FMA(Th, T6, T1a); + T1D = FNMS(T5, T3, Ta); + T1A = FMA(T5, T6, T4); + T1H = FMA(T5, Tv, T1G); + T1f = FNMS(Th, T3, T1e); + Tz = Ti * Tv; + TA = FNMS(Tl, Tt, Tz); + { + E Tu, Tp, TJ, TN; + Tu = Ti * Tt; + Tw = FMA(Tl, Tv, Tu); + Tp = Ti * T6; + Tq = FNMS(Tl, T3, Tp); + Tm = FMA(Tl, T6, Tj); + TJ = Tm * Tt; + TN = Tm * Tv; + TK = FMA(Tq, Tv, TJ); + T1S = FMA(Tl, T3, Tp); + TO = FNMS(Tq, Tt, TN); + { + E T1o, T2g, T1t, T2c; + T1o = T1n * T3; + T2g = T1n * Tv; + T1t = T1n * T6; + T2c = T1n * Tt; + T1p = FNMS(T5, Tf, Tk); + T1q = FNMS(T1p, T6, T1o); + T1u = FMA(T1p, T3, T1t); + T2n = FNMS(T1p, T3, T1t); + T2k = FMA(T1p, T6, T1o); + T2h = FNMS(T1p, Tt, T2g); + T2d = FMA(T1p, Tv, T2c); + } + } + } + { + E Te, T2C, T4L, T57, TD, T58, T2H, T4H, T11, T2v, T4d, T4z, T2P, T3P, T3J; + E T3Z, T2r, T2z, T4n, T4v, T3b, T3T, T3n, T43, T20, T2y, T4k, T4w, T34, T3S; + E T3u, T42, T1y, T2w, T4g, T4y, T2W, T3Q, T3C, T40; + { + E T1, T4K, T8, T9, Tc, T4I, Td, T4J; + T1 = Rp[0]; + T4K = Rm[0]; + T8 = Rp[WS(rs, 5)]; + T9 = T7 * T8; + Tc = Rm[WS(rs, 5)]; + T4I = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Te = T1 + Td; + T2C = T1 - Td; + T4J = FNMS(Tb, T8, T4I); + T4L = T4J + T4K; + T57 = T4K - T4J; + } + { + E Tn, To, Tr, T2D, Tx, Ty, TB, T2F; + Tn = Ip[WS(rs, 2)]; + To = Tm * Tn; + Tr = Im[WS(rs, 2)]; + T2D = Tm * Tr; + Tx = Ip[WS(rs, 7)]; + Ty = Tw * Tx; + TB = Im[WS(rs, 7)]; + T2F = Tw * TB; + { + E Ts, TC, T2E, T2G; + Ts = FMA(Tq, Tr, To); + TC = FMA(TA, TB, Ty); + TD = Ts + TC; + T58 = Ts - TC; + T2E = FNMS(Tq, Tn, T2D); + T2G = FNMS(TA, Tx, T2F); + T2H = T2E - T2G; + T4H = T2E + T2G; + } + } + { + E TI, T3F, TZ, T2N, TQ, T3H, TV, T2L; + { + E TF, TG, TH, T3E; + TF = Rp[WS(rs, 2)]; + TG = Ti * TF; + TH = Rm[WS(rs, 2)]; + T3E = Ti * TH; + TI = FMA(Tl, TH, TG); + T3F = FNMS(Tl, TF, T3E); + } + { + E TW, TX, TY, T2M; + TW = Ip[WS(rs, 9)]; + TX = Tt * TW; + TY = Im[WS(rs, 9)]; + T2M = Tt * TY; + TZ = FMA(Tv, TY, TX); + T2N = FNMS(Tv, TW, T2M); + } + { + E TL, TM, TP, T3G; + TL = Rp[WS(rs, 7)]; + TM = TK * TL; + TP = Rm[WS(rs, 7)]; + T3G = TK * TP; + TQ = FMA(TO, TP, TM); + T3H = FNMS(TO, TL, T3G); + } + { + E TS, TT, TU, T2K; + TS = Ip[WS(rs, 4)]; + TT = T3 * TS; + TU = Im[WS(rs, 4)]; + T2K = T3 * TU; + TV = FMA(T6, TU, TT); + T2L = FNMS(T6, TS, T2K); + } + { + E TR, T10, T4b, T4c; + TR = TI + TQ; + T10 = TV + TZ; + T11 = TR - T10; + T2v = TR + T10; + T4b = T3F + T3H; + T4c = T2L + T2N; + T4d = T4b + T4c; + T4z = T4c - T4b; + } + { + E T2J, T2O, T3D, T3I; + T2J = TI - TQ; + T2O = T2L - T2N; + T2P = T2J - T2O; + T3P = T2J + T2O; + T3D = TZ - TV; + T3I = T3F - T3H; + T3J = T3D - T3I; + T3Z = T3I + T3D; + } + } + { + E T26, T3j, T2p, T39, T2a, T3l, T2j, T37; + { + E T22, T23, T25, T3i; + T22 = Rp[WS(rs, 6)]; + T23 = T21 * T22; + T25 = Rm[WS(rs, 6)]; + T3i = T21 * T25; + T26 = FMA(T24, T25, T23); + T3j = FNMS(T24, T22, T3i); + } + { + E T2l, T2m, T2o, T38; + T2l = Ip[WS(rs, 3)]; + T2m = T2k * T2l; + T2o = Im[WS(rs, 3)]; + T38 = T2k * T2o; + T2p = FMA(T2n, T2o, T2m); + T39 = FNMS(T2n, T2l, T38); + } + { + E T27, T28, T29, T3k; + T27 = Rp[WS(rs, 1)]; + T28 = T1n * T27; + T29 = Rm[WS(rs, 1)]; + T3k = T1n * T29; + T2a = FMA(T1p, T29, T28); + T3l = FNMS(T1p, T27, T3k); + } + { + E T2e, T2f, T2i, T36; + T2e = Ip[WS(rs, 8)]; + T2f = T2d * T2e; + T2i = Im[WS(rs, 8)]; + T36 = T2d * T2i; + T2j = FMA(T2h, T2i, T2f); + T37 = FNMS(T2h, T2e, T36); + } + { + E T2b, T2q, T4l, T4m; + T2b = T26 + T2a; + T2q = T2j + T2p; + T2r = T2b - T2q; + T2z = T2b + T2q; + T4l = T3j + T3l; + T4m = T37 + T39; + T4n = T4l + T4m; + T4v = T4m - T4l; + } + { + E T35, T3a, T3h, T3m; + T35 = T26 - T2a; + T3a = T37 - T39; + T3b = T35 - T3a; + T3T = T35 + T3a; + T3h = T2p - T2j; + T3m = T3j - T3l; + T3n = T3h - T3m; + T43 = T3m + T3h; + } + } + { + E T1F, T3q, T1Y, T32, T1N, T3s, T1U, T30; + { + E T1B, T1C, T1E, T3p; + T1B = Rp[WS(rs, 4)]; + T1C = T1A * T1B; + T1E = Rm[WS(rs, 4)]; + T3p = T1A * T1E; + T1F = FMA(T1D, T1E, T1C); + T3q = FNMS(T1D, T1B, T3p); + } + { + E T1V, T1W, T1X, T31; + T1V = Ip[WS(rs, 1)]; + T1W = Tf * T1V; + T1X = Im[WS(rs, 1)]; + T31 = Tf * T1X; + T1Y = FMA(Th, T1X, T1W); + T32 = FNMS(Th, T1V, T31); + } + { + E T1I, T1J, T1M, T3r; + T1I = Rp[WS(rs, 9)]; + T1J = T1H * T1I; + T1M = Rm[WS(rs, 9)]; + T3r = T1H * T1M; + T1N = FMA(T1L, T1M, T1J); + T3s = FNMS(T1L, T1I, T3r); + } + { + E T1Q, T1R, T1T, T2Z; + T1Q = Ip[WS(rs, 6)]; + T1R = T1P * T1Q; + T1T = Im[WS(rs, 6)]; + T2Z = T1P * T1T; + T1U = FMA(T1S, T1T, T1R); + T30 = FNMS(T1S, T1Q, T2Z); + } + { + E T1O, T1Z, T4i, T4j; + T1O = T1F + T1N; + T1Z = T1U + T1Y; + T20 = T1O - T1Z; + T2y = T1O + T1Z; + T4i = T3q + T3s; + T4j = T30 + T32; + T4k = T4i + T4j; + T4w = T4j - T4i; + } + { + E T2Y, T33, T3o, T3t; + T2Y = T1F - T1N; + T33 = T30 - T32; + T34 = T2Y - T33; + T3S = T2Y + T33; + T3o = T1Y - T1U; + T3t = T3q - T3s; + T3u = T3o - T3t; + T42 = T3t + T3o; + } + } + { + E T19, T3y, T1w, T2U, T1h, T3A, T1m, T2S; + { + E T14, T15, T18, T3x; + T14 = Rp[WS(rs, 8)]; + T15 = T13 * T14; + T18 = Rm[WS(rs, 8)]; + T3x = T13 * T18; + T19 = FMA(T17, T18, T15); + T3y = FNMS(T17, T14, T3x); + } + { + E T1r, T1s, T1v, T2T; + T1r = Ip[WS(rs, 5)]; + T1s = T1q * T1r; + T1v = Im[WS(rs, 5)]; + T2T = T1q * T1v; + T1w = FMA(T1u, T1v, T1s); + T2U = FNMS(T1u, T1r, T2T); + } + { + E T1c, T1d, T1g, T3z; + T1c = Rp[WS(rs, 3)]; + T1d = T1b * T1c; + T1g = Rm[WS(rs, 3)]; + T3z = T1b * T1g; + T1h = FMA(T1f, T1g, T1d); + T3A = FNMS(T1f, T1c, T3z); + } + { + E T1j, T1k, T1l, T2R; + T1j = Ip[0]; + T1k = T2 * T1j; + T1l = Im[0]; + T2R = T2 * T1l; + T1m = FMA(T5, T1l, T1k); + T2S = FNMS(T5, T1j, T2R); + } + { + E T1i, T1x, T4e, T4f; + T1i = T19 + T1h; + T1x = T1m + T1w; + T1y = T1i - T1x; + T2w = T1i + T1x; + T4e = T3y + T3A; + T4f = T2S + T2U; + T4g = T4e + T4f; + T4y = T4f - T4e; + } + { + E T2Q, T2V, T3w, T3B; + T2Q = T19 - T1h; + T2V = T2S - T2U; + T2W = T2Q - T2V; + T3Q = T2Q + T2V; + T3w = T1w - T1m; + T3B = T3y - T3A; + T3C = T3w - T3B; + T40 = T3B + T3w; + } + } + { + E T4B, T4D, TE, T2t, T4s, T4t, T4C, T4u; + { + E T4x, T4A, T1z, T2s; + T4x = T4v - T4w; + T4A = T4y - T4z; + T4B = FNMS(KP618033988, T4A, T4x); + T4D = FMA(KP618033988, T4x, T4A); + TE = Te - TD; + T1z = T11 + T1y; + T2s = T20 + T2r; + T2t = T1z + T2s; + T4s = FNMS(KP250000000, T2t, TE); + T4t = T1z - T2s; + } + Rm[WS(rs, 9)] = TE + T2t; + T4C = FMA(KP559016994, T4t, T4s); + Rm[WS(rs, 5)] = FNMS(KP951056516, T4D, T4C); + Rp[WS(rs, 6)] = FMA(KP951056516, T4D, T4C); + T4u = FNMS(KP559016994, T4t, T4s); + Rp[WS(rs, 2)] = FNMS(KP951056516, T4B, T4u); + Rm[WS(rs, 1)] = FMA(KP951056516, T4B, T4u); + } + { + E T54, T56, T4Y, T4X, T4Z, T50, T55, T51; + { + E T52, T53, T4V, T4W; + T52 = T20 - T2r; + T53 = T1y - T11; + T54 = FMA(KP618033988, T53, T52); + T56 = FNMS(KP618033988, T52, T53); + T4Y = T4L - T4H; + T4V = T4z + T4y; + T4W = T4w + T4v; + T4X = T4V + T4W; + T4Z = FMA(KP250000000, T4X, T4Y); + T50 = T4W - T4V; + } + Im[WS(rs, 9)] = T4X - T4Y; + T55 = FMA(KP559016994, T50, T4Z); + Im[WS(rs, 5)] = FMS(KP951056516, T56, T55); + Ip[WS(rs, 6)] = FMA(KP951056516, T56, T55); + T51 = FNMS(KP559016994, T50, T4Z); + Im[WS(rs, 1)] = FMS(KP951056516, T54, T51); + Ip[WS(rs, 2)] = FMA(KP951056516, T54, T51); + } + { + E T4p, T4r, T2u, T2B, T48, T49, T4q, T4a; + { + E T4h, T4o, T2x, T2A; + T4h = T4d - T4g; + T4o = T4k - T4n; + T4p = FMA(KP618033988, T4o, T4h); + T4r = FNMS(KP618033988, T4h, T4o); + T2u = Te + TD; + T2x = T2v + T2w; + T2A = T2y + T2z; + T2B = T2x + T2A; + T48 = FNMS(KP250000000, T2B, T2u); + T49 = T2x - T2A; + } + Rp[0] = T2u + T2B; + T4q = FNMS(KP559016994, T49, T48); + Rm[WS(rs, 7)] = FNMS(KP951056516, T4r, T4q); + Rp[WS(rs, 8)] = FMA(KP951056516, T4r, T4q); + T4a = FMA(KP559016994, T49, T48); + Rp[WS(rs, 4)] = FNMS(KP951056516, T4p, T4a); + Rm[WS(rs, 3)] = FMA(KP951056516, T4p, T4a); + } + { + E T4S, T4U, T4M, T4G, T4N, T4O, T4T, T4P; + { + E T4Q, T4R, T4E, T4F; + T4Q = T2v - T2w; + T4R = T2z - T2y; + T4S = FNMS(KP618033988, T4R, T4Q); + T4U = FMA(KP618033988, T4Q, T4R); + T4M = T4H + T4L; + T4E = T4d + T4g; + T4F = T4k + T4n; + T4G = T4E + T4F; + T4N = FNMS(KP250000000, T4G, T4M); + T4O = T4E - T4F; + } + Ip[0] = T4G + T4M; + T4T = FNMS(KP559016994, T4O, T4N); + Im[WS(rs, 7)] = FMS(KP951056516, T4U, T4T); + Ip[WS(rs, 8)] = FMA(KP951056516, T4U, T4T); + T4P = FMA(KP559016994, T4O, T4N); + Im[WS(rs, 3)] = FMS(KP951056516, T4S, T4P); + Ip[WS(rs, 4)] = FMA(KP951056516, T4S, T4P); + } + { + E T3L, T3N, T2I, T3d, T3e, T3f, T3M, T3g; + { + E T3v, T3K, T2X, T3c; + T3v = T3n - T3u; + T3K = T3C - T3J; + T3L = FNMS(KP618033988, T3K, T3v); + T3N = FMA(KP618033988, T3v, T3K); + T2I = T2C - T2H; + T2X = T2P + T2W; + T3c = T34 + T3b; + T3d = T2X + T3c; + T3e = FNMS(KP250000000, T3d, T2I); + T3f = T2X - T3c; + } + Rm[WS(rs, 4)] = T2I + T3d; + T3M = FMA(KP559016994, T3f, T3e); + Rm[WS(rs, 8)] = FMA(KP951056516, T3N, T3M); + Rm[0] = FNMS(KP951056516, T3N, T3M); + T3g = FNMS(KP559016994, T3f, T3e); + Rp[WS(rs, 3)] = FMA(KP951056516, T3L, T3g); + Rp[WS(rs, 7)] = FNMS(KP951056516, T3L, T3g); + } + { + E T5u, T5w, T5o, T5n, T5p, T5q, T5v, T5r; + { + E T5s, T5t, T5l, T5m; + T5s = T2P - T2W; + T5t = T34 - T3b; + T5u = FMA(KP618033988, T5t, T5s); + T5w = FNMS(KP618033988, T5s, T5t); + T5o = T58 + T57; + T5l = T3J + T3C; + T5m = T3u + T3n; + T5n = T5l + T5m; + T5p = FMA(KP250000000, T5n, T5o); + T5q = T5l - T5m; + } + Im[WS(rs, 4)] = T5n - T5o; + T5v = FMA(KP559016994, T5q, T5p); + Ip[WS(rs, 3)] = FNMS(KP951056516, T5w, T5v); + Ip[WS(rs, 7)] = FMA(KP951056516, T5w, T5v); + T5r = FNMS(KP559016994, T5q, T5p); + Im[WS(rs, 8)] = FMS(KP951056516, T5u, T5r); + Im[0] = -(FMA(KP951056516, T5u, T5r)); + } + { + E T45, T47, T3O, T3V, T3W, T3X, T46, T3Y; + { + E T41, T44, T3R, T3U; + T41 = T3Z - T40; + T44 = T42 - T43; + T45 = FMA(KP618033988, T44, T41); + T47 = FNMS(KP618033988, T41, T44); + T3O = T2C + T2H; + T3R = T3P + T3Q; + T3U = T3S + T3T; + T3V = T3R + T3U; + T3W = FNMS(KP250000000, T3V, T3O); + T3X = T3R - T3U; + } + Rp[WS(rs, 5)] = T3O + T3V; + T46 = FNMS(KP559016994, T3X, T3W); + Rm[WS(rs, 6)] = FMA(KP951056516, T47, T46); + Rm[WS(rs, 2)] = FNMS(KP951056516, T47, T46); + T3Y = FMA(KP559016994, T3X, T3W); + Rp[WS(rs, 1)] = FMA(KP951056516, T45, T3Y); + Rp[WS(rs, 9)] = FNMS(KP951056516, T45, T3Y); + } + { + E T5i, T5k, T59, T5c, T5d, T5e, T5j, T5f; + { + E T5g, T5h, T5a, T5b; + T5g = T3S - T3T; + T5h = T3P - T3Q; + T5i = FNMS(KP618033988, T5h, T5g); + T5k = FMA(KP618033988, T5g, T5h); + T59 = T57 - T58; + T5a = T3Z + T40; + T5b = T42 + T43; + T5c = T5a + T5b; + T5d = FNMS(KP250000000, T5c, T59); + T5e = T5a - T5b; + } + Ip[WS(rs, 5)] = T5c + T59; + T5j = FMA(KP559016994, T5e, T5d); + Ip[WS(rs, 1)] = FNMS(KP951056516, T5k, T5j); + Ip[WS(rs, 9)] = FMA(KP951056516, T5k, T5j); + T5f = FNMS(KP559016994, T5e, T5d); + Im[WS(rs, 6)] = FMS(KP951056516, T5i, T5f); + Im[WS(rs, 2)] = -(FMA(KP951056516, T5i, T5f)); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cf2_20", twinstr, &GENUS, {136, 58, 140, 0} }; + +void X(codelet_hc2cf2_20) (planner *p) { + X(khc2c_register) (p, hc2cf2_20, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -dit -name hc2cf2_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 276 FP additions, 164 FP multiplications, + * (or, 204 additions, 92 multiplications, 72 fused multiply/add), + * 123 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(80, rs)) { + E T2, T5, Tg, Ti, Tk, To, T1h, T1f, T6, T3, T8, T14, T1Q, Tc, T1O; + E T1v, T18, T1t, T1n, T24, T1j, T22, Tq, Tu, T1E, T1G, Tx, Ty, Tz, TJ; + E T1Z, TB, T1X, T1A, TZ, TL, T1y, TX; + { + E T7, T16, Ta, T13, T4, T17, Tb, T12; + { + E Th, Tn, Tj, Tm; + T2 = W[0]; + T5 = W[1]; + Tg = W[2]; + Ti = W[3]; + Th = T2 * Tg; + Tn = T5 * Tg; + Tj = T5 * Ti; + Tm = T2 * Ti; + Tk = Th - Tj; + To = Tm + Tn; + T1h = Tm - Tn; + T1f = Th + Tj; + T6 = W[5]; + T7 = T5 * T6; + T16 = Tg * T6; + Ta = T2 * T6; + T13 = Ti * T6; + T3 = W[4]; + T4 = T2 * T3; + T17 = Ti * T3; + Tb = T5 * T3; + T12 = Tg * T3; + } + T8 = T4 - T7; + T14 = T12 + T13; + T1Q = T16 + T17; + Tc = Ta + Tb; + T1O = T12 - T13; + T1v = Ta - Tb; + T18 = T16 - T17; + T1t = T4 + T7; + { + E T1l, T1m, T1g, T1i; + T1l = T1f * T6; + T1m = T1h * T3; + T1n = T1l + T1m; + T24 = T1l - T1m; + T1g = T1f * T3; + T1i = T1h * T6; + T1j = T1g - T1i; + T22 = T1g + T1i; + { + E Tl, Tp, Ts, Tt; + Tl = Tk * T3; + Tp = To * T6; + Tq = Tl + Tp; + Ts = Tk * T6; + Tt = To * T3; + Tu = Ts - Tt; + T1E = Tl - Tp; + T1G = Ts + Tt; + Tx = W[6]; + Ty = W[7]; + Tz = FMA(Tk, Tx, To * Ty); + TJ = FMA(Tq, Tx, Tu * Ty); + T1Z = FNMS(T1h, Tx, T1f * Ty); + TB = FNMS(To, Tx, Tk * Ty); + T1X = FMA(T1f, Tx, T1h * Ty); + T1A = FNMS(T5, Tx, T2 * Ty); + TZ = FNMS(Ti, Tx, Tg * Ty); + TL = FNMS(Tu, Tx, Tq * Ty); + T1y = FMA(T2, Tx, T5 * Ty); + TX = FMA(Tg, Tx, Ti * Ty); + } + } + } + { + E TF, T2b, T4D, T4M, T2K, T3r, T4a, T4m, T1N, T28, T29, T3J, T3M, T44, T3U; + E T3V, T4j, T2f, T2g, T2h, T2n, T2s, T4K, T3g, T3h, T4z, T3n, T3o, T3p, T30; + E T35, T36, TW, T1r, T1s, T3C, T3F, T43, T3X, T3Y, T4k, T2c, T2d, T2e, T2y; + E T2D, T4J, T3d, T3e, T4y, T3k, T3l, T3m, T2P, T2U, T2V; + { + E T1, T48, Te, T47, Tw, T2H, TD, T2I, T9, Td; + T1 = Rp[0]; + T48 = Rm[0]; + T9 = Rp[WS(rs, 5)]; + Td = Rm[WS(rs, 5)]; + Te = FMA(T8, T9, Tc * Td); + T47 = FNMS(Tc, T9, T8 * Td); + { + E Tr, Tv, TA, TC; + Tr = Ip[WS(rs, 2)]; + Tv = Im[WS(rs, 2)]; + Tw = FMA(Tq, Tr, Tu * Tv); + T2H = FNMS(Tu, Tr, Tq * Tv); + TA = Ip[WS(rs, 7)]; + TC = Im[WS(rs, 7)]; + TD = FMA(Tz, TA, TB * TC); + T2I = FNMS(TB, TA, Tz * TC); + } + { + E Tf, TE, T4B, T4C; + Tf = T1 + Te; + TE = Tw + TD; + TF = Tf - TE; + T2b = Tf + TE; + T4B = T48 - T47; + T4C = Tw - TD; + T4D = T4B - T4C; + T4M = T4C + T4B; + } + { + E T2G, T2J, T46, T49; + T2G = T1 - Te; + T2J = T2H - T2I; + T2K = T2G - T2J; + T3r = T2G + T2J; + T46 = T2H + T2I; + T49 = T47 + T48; + T4a = T46 + T49; + T4m = T49 - T46; + } + } + { + E T1D, T3H, T2l, T2W, T27, T3L, T2r, T34, T1M, T3I, T2m, T2Z, T1W, T3K, T2q; + E T31; + { + E T1x, T2j, T1C, T2k; + { + E T1u, T1w, T1z, T1B; + T1u = Rp[WS(rs, 4)]; + T1w = Rm[WS(rs, 4)]; + T1x = FMA(T1t, T1u, T1v * T1w); + T2j = FNMS(T1v, T1u, T1t * T1w); + T1z = Rp[WS(rs, 9)]; + T1B = Rm[WS(rs, 9)]; + T1C = FMA(T1y, T1z, T1A * T1B); + T2k = FNMS(T1A, T1z, T1y * T1B); + } + T1D = T1x + T1C; + T3H = T2j + T2k; + T2l = T2j - T2k; + T2W = T1x - T1C; + } + { + E T21, T32, T26, T33; + { + E T1Y, T20, T23, T25; + T1Y = Ip[WS(rs, 8)]; + T20 = Im[WS(rs, 8)]; + T21 = FMA(T1X, T1Y, T1Z * T20); + T32 = FNMS(T1Z, T1Y, T1X * T20); + T23 = Ip[WS(rs, 3)]; + T25 = Im[WS(rs, 3)]; + T26 = FMA(T22, T23, T24 * T25); + T33 = FNMS(T24, T23, T22 * T25); + } + T27 = T21 + T26; + T3L = T32 + T33; + T2r = T21 - T26; + T34 = T32 - T33; + } + { + E T1I, T2X, T1L, T2Y; + { + E T1F, T1H, T1J, T1K; + T1F = Ip[WS(rs, 6)]; + T1H = Im[WS(rs, 6)]; + T1I = FMA(T1E, T1F, T1G * T1H); + T2X = FNMS(T1G, T1F, T1E * T1H); + T1J = Ip[WS(rs, 1)]; + T1K = Im[WS(rs, 1)]; + T1L = FMA(Tg, T1J, Ti * T1K); + T2Y = FNMS(Ti, T1J, Tg * T1K); + } + T1M = T1I + T1L; + T3I = T2X + T2Y; + T2m = T1I - T1L; + T2Z = T2X - T2Y; + } + { + E T1S, T2o, T1V, T2p; + { + E T1P, T1R, T1T, T1U; + T1P = Rp[WS(rs, 6)]; + T1R = Rm[WS(rs, 6)]; + T1S = FMA(T1O, T1P, T1Q * T1R); + T2o = FNMS(T1Q, T1P, T1O * T1R); + T1T = Rp[WS(rs, 1)]; + T1U = Rm[WS(rs, 1)]; + T1V = FMA(T1f, T1T, T1h * T1U); + T2p = FNMS(T1h, T1T, T1f * T1U); + } + T1W = T1S + T1V; + T3K = T2o + T2p; + T2q = T2o - T2p; + T31 = T1S - T1V; + } + T1N = T1D - T1M; + T28 = T1W - T27; + T29 = T1N + T28; + T3J = T3H + T3I; + T3M = T3K + T3L; + T44 = T3J + T3M; + T3U = T3H - T3I; + T3V = T3L - T3K; + T4j = T3V - T3U; + T2f = T1D + T1M; + T2g = T1W + T27; + T2h = T2f + T2g; + T2n = T2l + T2m; + T2s = T2q + T2r; + T4K = T2n + T2s; + T3g = T2l - T2m; + T3h = T2q - T2r; + T4z = T3g + T3h; + T3n = T2W + T2Z; + T3o = T31 + T34; + T3p = T3n + T3o; + T30 = T2W - T2Z; + T35 = T31 - T34; + T36 = T30 + T35; + } + { + E TO, T3A, T2w, T2L, T1q, T3E, T2z, T2T, TV, T3B, T2x, T2O, T1b, T3D, T2C; + E T2Q; + { + E TI, T2u, TN, T2v; + { + E TG, TH, TK, TM; + TG = Rp[WS(rs, 2)]; + TH = Rm[WS(rs, 2)]; + TI = FMA(Tk, TG, To * TH); + T2u = FNMS(To, TG, Tk * TH); + TK = Rp[WS(rs, 7)]; + TM = Rm[WS(rs, 7)]; + TN = FMA(TJ, TK, TL * TM); + T2v = FNMS(TL, TK, TJ * TM); + } + TO = TI + TN; + T3A = T2u + T2v; + T2w = T2u - T2v; + T2L = TI - TN; + } + { + E T1e, T2R, T1p, T2S; + { + E T1c, T1d, T1k, T1o; + T1c = Ip[0]; + T1d = Im[0]; + T1e = FMA(T2, T1c, T5 * T1d); + T2R = FNMS(T5, T1c, T2 * T1d); + T1k = Ip[WS(rs, 5)]; + T1o = Im[WS(rs, 5)]; + T1p = FMA(T1j, T1k, T1n * T1o); + T2S = FNMS(T1n, T1k, T1j * T1o); + } + T1q = T1e + T1p; + T3E = T2R + T2S; + T2z = T1p - T1e; + T2T = T2R - T2S; + } + { + E TR, T2M, TU, T2N; + { + E TP, TQ, TS, TT; + TP = Ip[WS(rs, 4)]; + TQ = Im[WS(rs, 4)]; + TR = FMA(T3, TP, T6 * TQ); + T2M = FNMS(T6, TP, T3 * TQ); + TS = Ip[WS(rs, 9)]; + TT = Im[WS(rs, 9)]; + TU = FMA(Tx, TS, Ty * TT); + T2N = FNMS(Ty, TS, Tx * TT); + } + TV = TR + TU; + T3B = T2M + T2N; + T2x = TR - TU; + T2O = T2M - T2N; + } + { + E T11, T2A, T1a, T2B; + { + E TY, T10, T15, T19; + TY = Rp[WS(rs, 8)]; + T10 = Rm[WS(rs, 8)]; + T11 = FMA(TX, TY, TZ * T10); + T2A = FNMS(TZ, TY, TX * T10); + T15 = Rp[WS(rs, 3)]; + T19 = Rm[WS(rs, 3)]; + T1a = FMA(T14, T15, T18 * T19); + T2B = FNMS(T18, T15, T14 * T19); + } + T1b = T11 + T1a; + T3D = T2A + T2B; + T2C = T2A - T2B; + T2Q = T11 - T1a; + } + TW = TO - TV; + T1r = T1b - T1q; + T1s = TW + T1r; + T3C = T3A + T3B; + T3F = T3D + T3E; + T43 = T3C + T3F; + T3X = T3A - T3B; + T3Y = T3D - T3E; + T4k = T3X + T3Y; + T2c = TO + TV; + T2d = T1b + T1q; + T2e = T2c + T2d; + T2y = T2w + T2x; + T2D = T2z - T2C; + T4J = T2D - T2y; + T3d = T2w - T2x; + T3e = T2C + T2z; + T4y = T3d + T3e; + T3k = T2L + T2O; + T3l = T2Q + T2T; + T3m = T3k + T3l; + T2P = T2L - T2O; + T2U = T2Q - T2T; + T2V = T2P + T2U; + } + { + E T3S, T2a, T3R, T40, T42, T3W, T3Z, T41, T3T; + T3S = KP559016994 * (T1s - T29); + T2a = T1s + T29; + T3R = FNMS(KP250000000, T2a, TF); + T3W = T3U + T3V; + T3Z = T3X - T3Y; + T40 = FNMS(KP587785252, T3Z, KP951056516 * T3W); + T42 = FMA(KP951056516, T3Z, KP587785252 * T3W); + Rm[WS(rs, 9)] = TF + T2a; + T41 = T3S + T3R; + Rm[WS(rs, 5)] = T41 - T42; + Rp[WS(rs, 6)] = T41 + T42; + T3T = T3R - T3S; + Rp[WS(rs, 2)] = T3T - T40; + Rm[WS(rs, 1)] = T3T + T40; + } + { + E T4r, T4l, T4q, T4p, T4t, T4n, T4o, T4u, T4s; + T4r = KP559016994 * (T4k + T4j); + T4l = T4j - T4k; + T4q = FMA(KP250000000, T4l, T4m); + T4n = T1r - TW; + T4o = T1N - T28; + T4p = FMA(KP587785252, T4n, KP951056516 * T4o); + T4t = FNMS(KP587785252, T4o, KP951056516 * T4n); + Im[WS(rs, 9)] = T4l - T4m; + T4u = T4r + T4q; + Im[WS(rs, 5)] = T4t - T4u; + Ip[WS(rs, 6)] = T4t + T4u; + T4s = T4q - T4r; + Im[WS(rs, 1)] = T4p - T4s; + Ip[WS(rs, 2)] = T4p + T4s; + } + { + E T3x, T2i, T3y, T3O, T3Q, T3G, T3N, T3P, T3z; + T3x = KP559016994 * (T2e - T2h); + T2i = T2e + T2h; + T3y = FNMS(KP250000000, T2i, T2b); + T3G = T3C - T3F; + T3N = T3J - T3M; + T3O = FMA(KP951056516, T3G, KP587785252 * T3N); + T3Q = FNMS(KP587785252, T3G, KP951056516 * T3N); + Rp[0] = T2b + T2i; + T3P = T3y - T3x; + Rm[WS(rs, 7)] = T3P - T3Q; + Rp[WS(rs, 8)] = T3P + T3Q; + T3z = T3x + T3y; + Rp[WS(rs, 4)] = T3z - T3O; + Rm[WS(rs, 3)] = T3z + T3O; + } + { + E T4e, T45, T4f, T4d, T4h, T4b, T4c, T4i, T4g; + T4e = KP559016994 * (T43 - T44); + T45 = T43 + T44; + T4f = FNMS(KP250000000, T45, T4a); + T4b = T2c - T2d; + T4c = T2f - T2g; + T4d = FMA(KP951056516, T4b, KP587785252 * T4c); + T4h = FNMS(KP951056516, T4c, KP587785252 * T4b); + Ip[0] = T45 + T4a; + T4i = T4f - T4e; + Im[WS(rs, 7)] = T4h - T4i; + Ip[WS(rs, 8)] = T4h + T4i; + T4g = T4e + T4f; + Im[WS(rs, 3)] = T4d - T4g; + Ip[WS(rs, 4)] = T4d + T4g; + } + { + E T39, T37, T38, T2F, T3b, T2t, T2E, T3c, T3a; + T39 = KP559016994 * (T2V - T36); + T37 = T2V + T36; + T38 = FNMS(KP250000000, T37, T2K); + T2t = T2n - T2s; + T2E = T2y + T2D; + T2F = FNMS(KP587785252, T2E, KP951056516 * T2t); + T3b = FMA(KP951056516, T2E, KP587785252 * T2t); + Rm[WS(rs, 4)] = T2K + T37; + T3c = T39 + T38; + Rm[WS(rs, 8)] = T3b + T3c; + Rm[0] = T3c - T3b; + T3a = T38 - T39; + Rp[WS(rs, 3)] = T2F + T3a; + Rp[WS(rs, 7)] = T3a - T2F; + } + { + E T4Q, T4L, T4R, T4P, T4U, T4N, T4O, T4T, T4S; + T4Q = KP559016994 * (T4J + T4K); + T4L = T4J - T4K; + T4R = FMA(KP250000000, T4L, T4M); + T4N = T2P - T2U; + T4O = T30 - T35; + T4P = FMA(KP951056516, T4N, KP587785252 * T4O); + T4U = FNMS(KP587785252, T4N, KP951056516 * T4O); + Im[WS(rs, 4)] = T4L - T4M; + T4T = T4Q + T4R; + Ip[WS(rs, 3)] = T4T - T4U; + Ip[WS(rs, 7)] = T4U + T4T; + T4S = T4Q - T4R; + Im[WS(rs, 8)] = T4P + T4S; + Im[0] = T4S - T4P; + } + { + E T3q, T3s, T3t, T3j, T3v, T3f, T3i, T3w, T3u; + T3q = KP559016994 * (T3m - T3p); + T3s = T3m + T3p; + T3t = FNMS(KP250000000, T3s, T3r); + T3f = T3d - T3e; + T3i = T3g - T3h; + T3j = FMA(KP951056516, T3f, KP587785252 * T3i); + T3v = FNMS(KP587785252, T3f, KP951056516 * T3i); + Rp[WS(rs, 5)] = T3r + T3s; + T3w = T3t - T3q; + Rm[WS(rs, 6)] = T3v + T3w; + Rm[WS(rs, 2)] = T3w - T3v; + T3u = T3q + T3t; + Rp[WS(rs, 1)] = T3j + T3u; + Rp[WS(rs, 9)] = T3u - T3j; + } + { + E T4A, T4E, T4F, T4x, T4I, T4v, T4w, T4H, T4G; + T4A = KP559016994 * (T4y - T4z); + T4E = T4y + T4z; + T4F = FNMS(KP250000000, T4E, T4D); + T4v = T3n - T3o; + T4w = T3k - T3l; + T4x = FNMS(KP587785252, T4w, KP951056516 * T4v); + T4I = FMA(KP951056516, T4w, KP587785252 * T4v); + Ip[WS(rs, 5)] = T4E + T4D; + T4H = T4A + T4F; + Ip[WS(rs, 1)] = T4H - T4I; + Ip[WS(rs, 9)] = T4I + T4H; + T4G = T4A - T4F; + Im[WS(rs, 6)] = T4x + T4G; + Im[WS(rs, 2)] = T4G - T4x; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cf2_20", twinstr, &GENUS, {204, 92, 72, 0} }; + +void X(codelet_hc2cf2_20) (planner *p) { + X(khc2c_register) (p, hc2cf2_20, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_32.c new file mode 100644 index 000000000..9f20d409f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_32.c @@ -0,0 +1,1893 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:09 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -dit -name hc2cf2_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 488 FP additions, 350 FP multiplications, + * (or, 236 additions, 98 multiplications, 252 fused multiply/add), + * 164 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(128, rs)) { + E T2, T8, T3, T6, Te, Ti, T5, T7, TJ, Tb, TM, Tc, Ts, T23, T1w; + E T19, TA, TE, T1s, T1N, T1o, T1C, T1F, T1K, T15, T11, T2F, T31, T2J, T34; + E T3f, T3z, T3j, T3C, Tw, T3M, T3Q, T1z, T2s, T2w, T1d, T3n, T3r, T26, T2T; + E T2X, Th, TR, TP, Td, Tj, TW, Tn, TS, T1U, T2b, T29, T1R, T1V, T2g; + E T1Z, T2c; + { + E Tz, T1n, T10, TD, T1r, T14, T9, T1Q, Tv, T1c; + { + E T4, T18, Ta, Tr; + T2 = W[0]; + T8 = W[4]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + T18 = T3 * T8; + Ta = T2 * T6; + Tr = T2 * T8; + Te = W[6]; + Tz = T3 * Te; + T1n = T8 * Te; + T10 = T2 * Te; + Ti = W[7]; + TD = T3 * Ti; + T1r = T8 * Ti; + T14 = T2 * Ti; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + TJ = FNMS(T5, T6, T4); + T9 = T7 * T8; + T1Q = TJ * T8; + Tb = FNMS(T5, T3, Ta); + TM = FMA(T5, T3, Ta); + Tc = W[5]; + Tv = T2 * Tc; + T1c = T3 * Tc; + Ts = FMA(T5, Tc, Tr); + T23 = FMA(T6, Tc, T18); + T1w = FNMS(T5, Tc, Tr); + T19 = FNMS(T6, Tc, T18); + } + TA = FMA(T6, Ti, Tz); + TE = FNMS(T6, Te, TD); + T1s = FNMS(Tc, Te, T1r); + T1N = FMA(T6, Te, TD); + T1o = FMA(Tc, Ti, T1n); + T1C = FMA(T5, Ti, T10); + T1F = FNMS(T5, Te, T14); + T1K = FNMS(T6, Ti, Tz); + T15 = FMA(T5, Te, T14); + T11 = FNMS(T5, Ti, T10); + { + E T2E, T2I, T2S, T2W; + T2E = T7 * Te; + T2F = FMA(Tb, Ti, T2E); + T31 = FNMS(Tb, Ti, T2E); + T2I = T7 * Ti; + T2J = FNMS(Tb, Te, T2I); + T34 = FMA(Tb, Te, T2I); + { + E T3e, T3i, T3L, T3P; + T3e = TJ * Te; + T3f = FNMS(TM, Ti, T3e); + T3z = FMA(TM, Ti, T3e); + T3i = TJ * Ti; + T3j = FMA(TM, Te, T3i); + T3C = FNMS(TM, Te, T3i); + T3L = Ts * Te; + T3P = Ts * Ti; + Tw = FNMS(T5, T8, Tv); + T3M = FMA(Tw, Ti, T3L); + T3Q = FNMS(Tw, Te, T3P); + } + { + E T2r, T2v, T3m, T3q; + T2r = T1w * Te; + T2v = T1w * Ti; + T1z = FMA(T5, T8, Tv); + T2s = FMA(T1z, Ti, T2r); + T2w = FNMS(T1z, Te, T2v); + T3m = T19 * Te; + T3q = T19 * Ti; + T1d = FMA(T6, T8, T1c); + T3n = FMA(T1d, Ti, T3m); + T3r = FNMS(T1d, Te, T3q); + } + T2S = T23 * Te; + T2W = T23 * Ti; + T26 = FNMS(T6, T8, T1c); + T2T = FMA(T26, Ti, T2S); + T2X = FNMS(T26, Te, T2W); + { + E TQ, TV, Tf, Tm, Tg; + Tg = T7 * Tc; + Th = FMA(Tb, T8, Tg); + TR = FNMS(Tb, T8, Tg); + TP = FMA(Tb, Tc, T9); + TQ = TP * Te; + TV = TP * Ti; + Td = FNMS(Tb, Tc, T9); + Tf = Td * Te; + Tm = Td * Ti; + Tj = FMA(Th, Ti, Tf); + TW = FNMS(TR, Te, TV); + Tn = FNMS(Th, Te, Tm); + TS = FMA(TR, Ti, TQ); + } + { + E T2a, T2f, T1S, T1Y, T1T; + T1T = TJ * Tc; + T1U = FMA(TM, T8, T1T); + T2b = FNMS(TM, T8, T1T); + T29 = FMA(TM, Tc, T1Q); + T2a = T29 * Te; + T2f = T29 * Ti; + T1R = FNMS(TM, Tc, T1Q); + T1S = T1R * Te; + T1Y = T1R * Ti; + T1V = FMA(T1U, Ti, T1S); + T2g = FNMS(T2b, Te, T2f); + T1Z = FNMS(T1U, Te, T1Y); + T2c = FMA(T2b, Ti, T2a); + } + } + } + { + E Tq, T46, T8H, T97, TH, T98, T4b, T8D, TZ, T7f, T4j, T6t, T1g, T7g, T4q; + E T6u, T1v, T1I, T7m, T7j, T7k, T7l, T4z, T6y, T4G, T6x, T22, T2j, T7o, T7p; + E T7q, T7r, T4O, T6B, T4V, T6A, T3G, T7L, T7J, T8n, T5E, T6M, T61, T6P, T2N; + E T7A, T7x, T8i, T55, T6F, T5s, T6I, T43, T7G, T7O, T8o, T5L, T62, T5S, T63; + E T3c, T7y, T7D, T8j, T5c, T5t, T5j, T5u; + { + E T1, T8G, Tk, Tl, To, T8E, Tp, T8F; + T1 = Rp[0]; + T8G = Rm[0]; + Tk = Rp[WS(rs, 8)]; + Tl = Tj * Tk; + To = Rm[WS(rs, 8)]; + T8E = Tj * To; + Tp = FMA(Tn, To, Tl); + Tq = T1 + Tp; + T46 = T1 - Tp; + T8F = FNMS(Tn, Tk, T8E); + T8H = T8F + T8G; + T97 = T8G - T8F; + } + { + E Tt, Tu, Tx, T47, TB, TC, TF, T49; + Tt = Rp[WS(rs, 4)]; + Tu = Ts * Tt; + Tx = Rm[WS(rs, 4)]; + T47 = Ts * Tx; + TB = Rp[WS(rs, 12)]; + TC = TA * TB; + TF = Rm[WS(rs, 12)]; + T49 = TA * TF; + { + E Ty, TG, T48, T4a; + Ty = FMA(Tw, Tx, Tu); + TG = FMA(TE, TF, TC); + TH = Ty + TG; + T98 = Ty - TG; + T48 = FNMS(Tw, Tt, T47); + T4a = FNMS(TE, TB, T49); + T4b = T48 - T4a; + T8D = T48 + T4a; + } + } + { + E TO, T4f, TY, T4h, T4d, T4i; + { + E TK, TL, TN, T4e; + TK = Rp[WS(rs, 2)]; + TL = TJ * TK; + TN = Rm[WS(rs, 2)]; + T4e = TJ * TN; + TO = FMA(TM, TN, TL); + T4f = FNMS(TM, TK, T4e); + } + { + E TT, TU, TX, T4g; + TT = Rp[WS(rs, 10)]; + TU = TS * TT; + TX = Rm[WS(rs, 10)]; + T4g = TS * TX; + TY = FMA(TW, TX, TU); + T4h = FNMS(TW, TT, T4g); + } + TZ = TO + TY; + T7f = T4f + T4h; + T4d = TO - TY; + T4i = T4f - T4h; + T4j = T4d + T4i; + T6t = T4i - T4d; + } + { + E T17, T4m, T1f, T4o, T4k, T4p; + { + E T12, T13, T16, T4l; + T12 = Rp[WS(rs, 14)]; + T13 = T11 * T12; + T16 = Rm[WS(rs, 14)]; + T4l = T11 * T16; + T17 = FMA(T15, T16, T13); + T4m = FNMS(T15, T12, T4l); + } + { + E T1a, T1b, T1e, T4n; + T1a = Rp[WS(rs, 6)]; + T1b = T19 * T1a; + T1e = Rm[WS(rs, 6)]; + T4n = T19 * T1e; + T1f = FMA(T1d, T1e, T1b); + T4o = FNMS(T1d, T1a, T4n); + } + T1g = T17 + T1f; + T7g = T4m + T4o; + T4k = T17 - T1f; + T4p = T4m - T4o; + T4q = T4k - T4p; + T6u = T4k + T4p; + } + { + E T1m, T4B, T1H, T4x, T1u, T4D, T1B, T4v; + { + E T1j, T1k, T1l, T4A; + T1j = Rp[WS(rs, 1)]; + T1k = T7 * T1j; + T1l = Rm[WS(rs, 1)]; + T4A = T7 * T1l; + T1m = FMA(Tb, T1l, T1k); + T4B = FNMS(Tb, T1j, T4A); + } + { + E T1D, T1E, T1G, T4w; + T1D = Rp[WS(rs, 13)]; + T1E = T1C * T1D; + T1G = Rm[WS(rs, 13)]; + T4w = T1C * T1G; + T1H = FMA(T1F, T1G, T1E); + T4x = FNMS(T1F, T1D, T4w); + } + { + E T1p, T1q, T1t, T4C; + T1p = Rp[WS(rs, 9)]; + T1q = T1o * T1p; + T1t = Rm[WS(rs, 9)]; + T4C = T1o * T1t; + T1u = FMA(T1s, T1t, T1q); + T4D = FNMS(T1s, T1p, T4C); + } + { + E T1x, T1y, T1A, T4u; + T1x = Rp[WS(rs, 5)]; + T1y = T1w * T1x; + T1A = Rm[WS(rs, 5)]; + T4u = T1w * T1A; + T1B = FMA(T1z, T1A, T1y); + T4v = FNMS(T1z, T1x, T4u); + } + T1v = T1m + T1u; + T1I = T1B + T1H; + T7m = T1v - T1I; + T7j = T4B + T4D; + T7k = T4v + T4x; + T7l = T7j - T7k; + { + E T4t, T4y, T4E, T4F; + T4t = T1m - T1u; + T4y = T4v - T4x; + T4z = T4t + T4y; + T6y = T4t - T4y; + T4E = T4B - T4D; + T4F = T1B - T1H; + T4G = T4E - T4F; + T6x = T4E + T4F; + } + } + { + E T1P, T4Q, T2i, T4M, T21, T4S, T28, T4K; + { + E T1L, T1M, T1O, T4P; + T1L = Rp[WS(rs, 15)]; + T1M = T1K * T1L; + T1O = Rm[WS(rs, 15)]; + T4P = T1K * T1O; + T1P = FMA(T1N, T1O, T1M); + T4Q = FNMS(T1N, T1L, T4P); + } + { + E T2d, T2e, T2h, T4L; + T2d = Rp[WS(rs, 11)]; + T2e = T2c * T2d; + T2h = Rm[WS(rs, 11)]; + T4L = T2c * T2h; + T2i = FMA(T2g, T2h, T2e); + T4M = FNMS(T2g, T2d, T4L); + } + { + E T1W, T1X, T20, T4R; + T1W = Rp[WS(rs, 7)]; + T1X = T1V * T1W; + T20 = Rm[WS(rs, 7)]; + T4R = T1V * T20; + T21 = FMA(T1Z, T20, T1X); + T4S = FNMS(T1Z, T1W, T4R); + } + { + E T24, T25, T27, T4J; + T24 = Rp[WS(rs, 3)]; + T25 = T23 * T24; + T27 = Rm[WS(rs, 3)]; + T4J = T23 * T27; + T28 = FMA(T26, T27, T25); + T4K = FNMS(T26, T24, T4J); + } + T22 = T1P + T21; + T2j = T28 + T2i; + T7o = T22 - T2j; + T7p = T4Q + T4S; + T7q = T4K + T4M; + T7r = T7p - T7q; + { + E T4I, T4N, T4T, T4U; + T4I = T1P - T21; + T4N = T4K - T4M; + T4O = T4I + T4N; + T6B = T4I - T4N; + T4T = T4Q - T4S; + T4U = T28 - T2i; + T4V = T4T - T4U; + T6A = T4T + T4U; + } + } + { + E T3l, T5W, T3E, T5C, T3t, T5Y, T3y, T5A; + { + E T3g, T3h, T3k, T5V; + T3g = Ip[WS(rs, 15)]; + T3h = T3f * T3g; + T3k = Im[WS(rs, 15)]; + T5V = T3f * T3k; + T3l = FMA(T3j, T3k, T3h); + T5W = FNMS(T3j, T3g, T5V); + } + { + E T3A, T3B, T3D, T5B; + T3A = Ip[WS(rs, 11)]; + T3B = T3z * T3A; + T3D = Im[WS(rs, 11)]; + T5B = T3z * T3D; + T3E = FMA(T3C, T3D, T3B); + T5C = FNMS(T3C, T3A, T5B); + } + { + E T3o, T3p, T3s, T5X; + T3o = Ip[WS(rs, 7)]; + T3p = T3n * T3o; + T3s = Im[WS(rs, 7)]; + T5X = T3n * T3s; + T3t = FMA(T3r, T3s, T3p); + T5Y = FNMS(T3r, T3o, T5X); + } + { + E T3v, T3w, T3x, T5z; + T3v = Ip[WS(rs, 3)]; + T3w = TP * T3v; + T3x = Im[WS(rs, 3)]; + T5z = TP * T3x; + T3y = FMA(TR, T3x, T3w); + T5A = FNMS(TR, T3v, T5z); + } + { + E T3u, T3F, T7H, T7I; + T3u = T3l + T3t; + T3F = T3y + T3E; + T3G = T3u + T3F; + T7L = T3u - T3F; + T7H = T5W + T5Y; + T7I = T5A + T5C; + T7J = T7H - T7I; + T8n = T7H + T7I; + } + { + E T5y, T5D, T5Z, T60; + T5y = T3l - T3t; + T5D = T5A - T5C; + T5E = T5y + T5D; + T6M = T5y - T5D; + T5Z = T5W - T5Y; + T60 = T3E - T3y; + T61 = T5Z + T60; + T6P = T60 - T5Z; + } + } + { + E T2q, T5n, T2L, T53, T2y, T5p, T2D, T51; + { + E T2n, T2o, T2p, T5m; + T2n = Ip[0]; + T2o = T2 * T2n; + T2p = Im[0]; + T5m = T2 * T2p; + T2q = FMA(T5, T2p, T2o); + T5n = FNMS(T5, T2n, T5m); + } + { + E T2G, T2H, T2K, T52; + T2G = Ip[WS(rs, 12)]; + T2H = T2F * T2G; + T2K = Im[WS(rs, 12)]; + T52 = T2F * T2K; + T2L = FMA(T2J, T2K, T2H); + T53 = FNMS(T2J, T2G, T52); + } + { + E T2t, T2u, T2x, T5o; + T2t = Ip[WS(rs, 8)]; + T2u = T2s * T2t; + T2x = Im[WS(rs, 8)]; + T5o = T2s * T2x; + T2y = FMA(T2w, T2x, T2u); + T5p = FNMS(T2w, T2t, T5o); + } + { + E T2A, T2B, T2C, T50; + T2A = Ip[WS(rs, 4)]; + T2B = T8 * T2A; + T2C = Im[WS(rs, 4)]; + T50 = T8 * T2C; + T2D = FMA(Tc, T2C, T2B); + T51 = FNMS(Tc, T2A, T50); + } + { + E T2z, T2M, T7v, T7w; + T2z = T2q + T2y; + T2M = T2D + T2L; + T2N = T2z + T2M; + T7A = T2z - T2M; + T7v = T5n + T5p; + T7w = T51 + T53; + T7x = T7v - T7w; + T8i = T7v + T7w; + } + { + E T4Z, T54, T5q, T5r; + T4Z = T2q - T2y; + T54 = T51 - T53; + T55 = T4Z + T54; + T6F = T4Z - T54; + T5q = T5n - T5p; + T5r = T2D - T2L; + T5s = T5q - T5r; + T6I = T5q + T5r; + } + } + { + E T3K, T5H, T41, T5Q, T3S, T5J, T3X, T5O; + { + E T3H, T3I, T3J, T5G; + T3H = Ip[WS(rs, 1)]; + T3I = T3 * T3H; + T3J = Im[WS(rs, 1)]; + T5G = T3 * T3J; + T3K = FMA(T6, T3J, T3I); + T5H = FNMS(T6, T3H, T5G); + } + { + E T3Y, T3Z, T40, T5P; + T3Y = Ip[WS(rs, 5)]; + T3Z = Td * T3Y; + T40 = Im[WS(rs, 5)]; + T5P = Td * T40; + T41 = FMA(Th, T40, T3Z); + T5Q = FNMS(Th, T3Y, T5P); + } + { + E T3N, T3O, T3R, T5I; + T3N = Ip[WS(rs, 9)]; + T3O = T3M * T3N; + T3R = Im[WS(rs, 9)]; + T5I = T3M * T3R; + T3S = FMA(T3Q, T3R, T3O); + T5J = FNMS(T3Q, T3N, T5I); + } + { + E T3U, T3V, T3W, T5N; + T3U = Ip[WS(rs, 13)]; + T3V = Te * T3U; + T3W = Im[WS(rs, 13)]; + T5N = Te * T3W; + T3X = FMA(Ti, T3W, T3V); + T5O = FNMS(Ti, T3U, T5N); + } + { + E T3T, T42, T7M, T7N; + T3T = T3K + T3S; + T42 = T3X + T41; + T43 = T3T + T42; + T7G = T42 - T3T; + T7M = T5H + T5J; + T7N = T5O + T5Q; + T7O = T7M - T7N; + T8o = T7M + T7N; + } + { + E T5F, T5K, T5M, T5R; + T5F = T3K - T3S; + T5K = T5H - T5J; + T5L = T5F + T5K; + T62 = T5K - T5F; + T5M = T3X - T41; + T5R = T5O - T5Q; + T5S = T5M - T5R; + T63 = T5M + T5R; + } + } + { + E T2R, T58, T3a, T5h, T2Z, T5a, T36, T5f; + { + E T2O, T2P, T2Q, T57; + T2O = Ip[WS(rs, 2)]; + T2P = T29 * T2O; + T2Q = Im[WS(rs, 2)]; + T57 = T29 * T2Q; + T2R = FMA(T2b, T2Q, T2P); + T58 = FNMS(T2b, T2O, T57); + } + { + E T37, T38, T39, T5g; + T37 = Ip[WS(rs, 6)]; + T38 = T1R * T37; + T39 = Im[WS(rs, 6)]; + T5g = T1R * T39; + T3a = FMA(T1U, T39, T38); + T5h = FNMS(T1U, T37, T5g); + } + { + E T2U, T2V, T2Y, T59; + T2U = Ip[WS(rs, 10)]; + T2V = T2T * T2U; + T2Y = Im[WS(rs, 10)]; + T59 = T2T * T2Y; + T2Z = FMA(T2X, T2Y, T2V); + T5a = FNMS(T2X, T2U, T59); + } + { + E T32, T33, T35, T5e; + T32 = Ip[WS(rs, 14)]; + T33 = T31 * T32; + T35 = Im[WS(rs, 14)]; + T5e = T31 * T35; + T36 = FMA(T34, T35, T33); + T5f = FNMS(T34, T32, T5e); + } + { + E T30, T3b, T7B, T7C; + T30 = T2R + T2Z; + T3b = T36 + T3a; + T3c = T30 + T3b; + T7y = T3b - T30; + T7B = T58 + T5a; + T7C = T5f + T5h; + T7D = T7B - T7C; + T8j = T7B + T7C; + } + { + E T56, T5b, T5d, T5i; + T56 = T2R - T2Z; + T5b = T58 - T5a; + T5c = T56 + T5b; + T5t = T5b - T56; + T5d = T36 - T3a; + T5i = T5f - T5h; + T5j = T5d - T5i; + T5u = T5d + T5i; + } + } + { + E T1i, T8c, T8z, T8A, T8J, T8O, T2l, T8N, T45, T8L, T8l, T8t, T8q, T8u, T8f; + E T8B; + { + E TI, T1h, T8x, T8y; + TI = Tq + TH; + T1h = TZ + T1g; + T1i = TI + T1h; + T8c = TI - T1h; + T8x = T8i + T8j; + T8y = T8n + T8o; + T8z = T8x - T8y; + T8A = T8x + T8y; + } + { + E T8C, T8I, T1J, T2k; + T8C = T7f + T7g; + T8I = T8D + T8H; + T8J = T8C + T8I; + T8O = T8I - T8C; + T1J = T1v + T1I; + T2k = T22 + T2j; + T2l = T1J + T2k; + T8N = T2k - T1J; + } + { + E T3d, T44, T8h, T8k; + T3d = T2N + T3c; + T44 = T3G + T43; + T45 = T3d + T44; + T8L = T44 - T3d; + T8h = T2N - T3c; + T8k = T8i - T8j; + T8l = T8h + T8k; + T8t = T8k - T8h; + } + { + E T8m, T8p, T8d, T8e; + T8m = T3G - T43; + T8p = T8n - T8o; + T8q = T8m - T8p; + T8u = T8m + T8p; + T8d = T7j + T7k; + T8e = T7p + T7q; + T8f = T8d - T8e; + T8B = T8d + T8e; + } + { + E T2m, T8K, T8w, T8M; + T2m = T1i + T2l; + Rm[WS(rs, 15)] = T2m - T45; + Rp[0] = T2m + T45; + T8K = T8B + T8J; + Im[WS(rs, 15)] = T8A - T8K; + Ip[0] = T8A + T8K; + T8w = T1i - T2l; + Rm[WS(rs, 7)] = T8w - T8z; + Rp[WS(rs, 8)] = T8w + T8z; + T8M = T8J - T8B; + Im[WS(rs, 7)] = T8L - T8M; + Ip[WS(rs, 8)] = T8L + T8M; + } + { + E T8g, T8r, T8P, T8Q; + T8g = T8c + T8f; + T8r = T8l + T8q; + Rm[WS(rs, 11)] = FNMS(KP707106781, T8r, T8g); + Rp[WS(rs, 4)] = FMA(KP707106781, T8r, T8g); + T8P = T8N + T8O; + T8Q = T8t + T8u; + Im[WS(rs, 11)] = FMS(KP707106781, T8Q, T8P); + Ip[WS(rs, 4)] = FMA(KP707106781, T8Q, T8P); + } + { + E T8s, T8v, T8R, T8S; + T8s = T8c - T8f; + T8v = T8t - T8u; + Rm[WS(rs, 3)] = FNMS(KP707106781, T8v, T8s); + Rp[WS(rs, 12)] = FMA(KP707106781, T8v, T8s); + T8R = T8O - T8N; + T8S = T8q - T8l; + Im[WS(rs, 3)] = FMS(KP707106781, T8S, T8R); + Ip[WS(rs, 12)] = FMA(KP707106781, T8S, T8R); + } + } + { + E T7i, T7W, T86, T8a, T8V, T91, T7t, T8W, T7F, T7T, T7Z, T92, T83, T89, T7Q; + E T7U; + { + E T7e, T7h, T84, T85; + T7e = Tq - TH; + T7h = T7f - T7g; + T7i = T7e - T7h; + T7W = T7e + T7h; + T84 = T7L + T7O; + T85 = T7J + T7G; + T86 = FNMS(KP414213562, T85, T84); + T8a = FMA(KP414213562, T84, T85); + } + { + E T8T, T8U, T7n, T7s; + T8T = T1g - TZ; + T8U = T8H - T8D; + T8V = T8T + T8U; + T91 = T8U - T8T; + T7n = T7l - T7m; + T7s = T7o + T7r; + T7t = T7n - T7s; + T8W = T7n + T7s; + } + { + E T7z, T7E, T7X, T7Y; + T7z = T7x - T7y; + T7E = T7A - T7D; + T7F = FMA(KP414213562, T7E, T7z); + T7T = FNMS(KP414213562, T7z, T7E); + T7X = T7m + T7l; + T7Y = T7o - T7r; + T7Z = T7X + T7Y; + T92 = T7Y - T7X; + } + { + E T81, T82, T7K, T7P; + T81 = T7A + T7D; + T82 = T7x + T7y; + T83 = FMA(KP414213562, T82, T81); + T89 = FNMS(KP414213562, T81, T82); + T7K = T7G - T7J; + T7P = T7L - T7O; + T7Q = FMA(KP414213562, T7P, T7K); + T7U = FNMS(KP414213562, T7K, T7P); + } + { + E T7u, T7R, T93, T94; + T7u = FMA(KP707106781, T7t, T7i); + T7R = T7F + T7Q; + Rm[WS(rs, 9)] = FNMS(KP923879532, T7R, T7u); + Rp[WS(rs, 6)] = FMA(KP923879532, T7R, T7u); + T93 = FMA(KP707106781, T92, T91); + T94 = T7U - T7T; + Im[WS(rs, 9)] = FMS(KP923879532, T94, T93); + Ip[WS(rs, 6)] = FMA(KP923879532, T94, T93); + } + { + E T7S, T7V, T95, T96; + T7S = FNMS(KP707106781, T7t, T7i); + T7V = T7T + T7U; + Rp[WS(rs, 14)] = FNMS(KP923879532, T7V, T7S); + Rm[WS(rs, 1)] = FMA(KP923879532, T7V, T7S); + T95 = FNMS(KP707106781, T92, T91); + T96 = T7Q - T7F; + Im[WS(rs, 1)] = FMS(KP923879532, T96, T95); + Ip[WS(rs, 14)] = FMA(KP923879532, T96, T95); + } + { + E T80, T87, T8X, T8Y; + T80 = FMA(KP707106781, T7Z, T7W); + T87 = T83 + T86; + Rm[WS(rs, 13)] = FNMS(KP923879532, T87, T80); + Rp[WS(rs, 2)] = FMA(KP923879532, T87, T80); + T8X = FMA(KP707106781, T8W, T8V); + T8Y = T89 + T8a; + Im[WS(rs, 13)] = FMS(KP923879532, T8Y, T8X); + Ip[WS(rs, 2)] = FMA(KP923879532, T8Y, T8X); + } + { + E T88, T8b, T8Z, T90; + T88 = FNMS(KP707106781, T7Z, T7W); + T8b = T89 - T8a; + Rm[WS(rs, 5)] = FNMS(KP923879532, T8b, T88); + Rp[WS(rs, 10)] = FMA(KP923879532, T8b, T88); + T8Z = FNMS(KP707106781, T8W, T8V); + T90 = T86 - T83; + Im[WS(rs, 5)] = FMS(KP923879532, T90, T8Z); + Ip[WS(rs, 10)] = FMA(KP923879532, T90, T8Z); + } + } + { + E T4s, T6c, T4X, T9i, T9b, T9h, T6f, T9c, T66, T6q, T6a, T6m, T5x, T6p, T69; + E T6j; + { + E T4c, T4r, T6d, T6e; + T4c = T46 + T4b; + T4r = T4j + T4q; + T4s = FMA(KP707106781, T4r, T4c); + T6c = FNMS(KP707106781, T4r, T4c); + { + E T4H, T4W, T99, T9a; + T4H = FMA(KP414213562, T4G, T4z); + T4W = FNMS(KP414213562, T4V, T4O); + T4X = T4H + T4W; + T9i = T4W - T4H; + T99 = T97 - T98; + T9a = T6t + T6u; + T9b = FMA(KP707106781, T9a, T99); + T9h = FNMS(KP707106781, T9a, T99); + } + T6d = FNMS(KP414213562, T4z, T4G); + T6e = FMA(KP414213562, T4O, T4V); + T6f = T6d - T6e; + T9c = T6d + T6e; + { + E T5U, T6k, T65, T6l, T5T, T64; + T5T = T5L + T5S; + T5U = FMA(KP707106781, T5T, T5E); + T6k = FNMS(KP707106781, T5T, T5E); + T64 = T62 + T63; + T65 = FMA(KP707106781, T64, T61); + T6l = FNMS(KP707106781, T64, T61); + T66 = FNMS(KP198912367, T65, T5U); + T6q = FNMS(KP668178637, T6k, T6l); + T6a = FMA(KP198912367, T5U, T65); + T6m = FMA(KP668178637, T6l, T6k); + } + { + E T5l, T6h, T5w, T6i, T5k, T5v; + T5k = T5c + T5j; + T5l = FMA(KP707106781, T5k, T55); + T6h = FNMS(KP707106781, T5k, T55); + T5v = T5t + T5u; + T5w = FMA(KP707106781, T5v, T5s); + T6i = FNMS(KP707106781, T5v, T5s); + T5x = FMA(KP198912367, T5w, T5l); + T6p = FMA(KP668178637, T6h, T6i); + T69 = FNMS(KP198912367, T5l, T5w); + T6j = FNMS(KP668178637, T6i, T6h); + } + } + { + E T4Y, T67, T9d, T9e; + T4Y = FMA(KP923879532, T4X, T4s); + T67 = T5x + T66; + Rm[WS(rs, 14)] = FNMS(KP980785280, T67, T4Y); + Rp[WS(rs, 1)] = FMA(KP980785280, T67, T4Y); + T9d = FMA(KP923879532, T9c, T9b); + T9e = T69 + T6a; + Im[WS(rs, 14)] = FMS(KP980785280, T9e, T9d); + Ip[WS(rs, 1)] = FMA(KP980785280, T9e, T9d); + } + { + E T68, T6b, T9f, T9g; + T68 = FNMS(KP923879532, T4X, T4s); + T6b = T69 - T6a; + Rm[WS(rs, 6)] = FNMS(KP980785280, T6b, T68); + Rp[WS(rs, 9)] = FMA(KP980785280, T6b, T68); + T9f = FNMS(KP923879532, T9c, T9b); + T9g = T66 - T5x; + Im[WS(rs, 6)] = FMS(KP980785280, T9g, T9f); + Ip[WS(rs, 9)] = FMA(KP980785280, T9g, T9f); + } + { + E T6g, T6n, T9l, T9m; + T6g = FNMS(KP923879532, T6f, T6c); + T6n = T6j + T6m; + Rp[WS(rs, 13)] = FNMS(KP831469612, T6n, T6g); + Rm[WS(rs, 2)] = FMA(KP831469612, T6n, T6g); + T9l = FNMS(KP923879532, T9i, T9h); + T9m = T6p + T6q; + Im[WS(rs, 2)] = -(FMA(KP831469612, T9m, T9l)); + Ip[WS(rs, 13)] = FNMS(KP831469612, T9m, T9l); + } + { + E T6o, T6r, T9j, T9k; + T6o = FMA(KP923879532, T6f, T6c); + T6r = T6p - T6q; + Rm[WS(rs, 10)] = FNMS(KP831469612, T6r, T6o); + Rp[WS(rs, 5)] = FMA(KP831469612, T6r, T6o); + T9j = FMA(KP923879532, T9i, T9h); + T9k = T6m - T6j; + Im[WS(rs, 10)] = FMS(KP831469612, T9k, T9j); + Ip[WS(rs, 5)] = FMA(KP831469612, T9k, T9j); + } + } + { + E T6w, T6Y, T6D, T9w, T9p, T9v, T71, T9q, T6S, T7c, T6W, T78, T6L, T7b, T6V; + E T75; + { + E T6s, T6v, T6Z, T70; + T6s = T46 - T4b; + T6v = T6t - T6u; + T6w = FMA(KP707106781, T6v, T6s); + T6Y = FNMS(KP707106781, T6v, T6s); + { + E T6z, T6C, T9n, T9o; + T6z = FMA(KP414213562, T6y, T6x); + T6C = FNMS(KP414213562, T6B, T6A); + T6D = T6z - T6C; + T9w = T6z + T6C; + T9n = T98 + T97; + T9o = T4q - T4j; + T9p = FMA(KP707106781, T9o, T9n); + T9v = FNMS(KP707106781, T9o, T9n); + } + T6Z = FNMS(KP414213562, T6x, T6y); + T70 = FMA(KP414213562, T6A, T6B); + T71 = T6Z + T70; + T9q = T70 - T6Z; + { + E T6O, T77, T6R, T76, T6N, T6Q; + T6N = T63 - T62; + T6O = FNMS(KP707106781, T6N, T6M); + T77 = FMA(KP707106781, T6N, T6M); + T6Q = T5S - T5L; + T6R = FNMS(KP707106781, T6Q, T6P); + T76 = FMA(KP707106781, T6Q, T6P); + T6S = FMA(KP668178637, T6R, T6O); + T7c = FNMS(KP198912367, T76, T77); + T6W = FNMS(KP668178637, T6O, T6R); + T78 = FMA(KP198912367, T77, T76); + } + { + E T6H, T74, T6K, T73, T6G, T6J; + T6G = T5u - T5t; + T6H = FNMS(KP707106781, T6G, T6F); + T74 = FMA(KP707106781, T6G, T6F); + T6J = T5c - T5j; + T6K = FNMS(KP707106781, T6J, T6I); + T73 = FMA(KP707106781, T6J, T6I); + T6L = FMA(KP668178637, T6K, T6H); + T7b = FNMS(KP198912367, T73, T74); + T6V = FNMS(KP668178637, T6H, T6K); + T75 = FMA(KP198912367, T74, T73); + } + } + { + E T6E, T6T, T9r, T9s; + T6E = FMA(KP923879532, T6D, T6w); + T6T = T6L + T6S; + Rm[WS(rs, 12)] = FNMS(KP831469612, T6T, T6E); + Rp[WS(rs, 3)] = FMA(KP831469612, T6T, T6E); + T9r = FMA(KP923879532, T9q, T9p); + T9s = T6V - T6W; + Im[WS(rs, 12)] = FMS(KP831469612, T9s, T9r); + Ip[WS(rs, 3)] = FMA(KP831469612, T9s, T9r); + } + { + E T6U, T6X, T9t, T9u; + T6U = FNMS(KP923879532, T6D, T6w); + T6X = T6V + T6W; + Rm[WS(rs, 4)] = FNMS(KP831469612, T6X, T6U); + Rp[WS(rs, 11)] = FMA(KP831469612, T6X, T6U); + T9t = FNMS(KP923879532, T9q, T9p); + T9u = T6S - T6L; + Im[WS(rs, 4)] = FMS(KP831469612, T9u, T9t); + Ip[WS(rs, 11)] = FMA(KP831469612, T9u, T9t); + } + { + E T72, T79, T9x, T9y; + T72 = FNMS(KP923879532, T71, T6Y); + T79 = T75 + T78; + Rm[WS(rs, 8)] = FNMS(KP980785280, T79, T72); + Rp[WS(rs, 7)] = FMA(KP980785280, T79, T72); + T9x = FNMS(KP923879532, T9w, T9v); + T9y = T7c - T7b; + Im[WS(rs, 8)] = FMS(KP980785280, T9y, T9x); + Ip[WS(rs, 7)] = FMA(KP980785280, T9y, T9x); + } + { + E T7a, T7d, T9z, T9A; + T7a = FMA(KP923879532, T71, T6Y); + T7d = T7b + T7c; + Rp[WS(rs, 15)] = FNMS(KP980785280, T7d, T7a); + Rm[0] = FMA(KP980785280, T7d, T7a); + T9z = FMA(KP923879532, T9w, T9v); + T9A = T78 - T75; + Im[0] = FMS(KP980785280, T9A, T9z); + Ip[WS(rs, 15)] = FMA(KP980785280, T9A, T9z); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cf2_32", twinstr, &GENUS, {236, 98, 252, 0} }; + +void X(codelet_hc2cf2_32) (planner *p) { + X(khc2c_register) (p, hc2cf2_32, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -dit -name hc2cf2_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 488 FP additions, 280 FP multiplications, + * (or, 376 additions, 168 multiplications, 112 fused multiply/add), + * 158 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(128, rs)) { + E T2, T5, T3, T6, T8, TM, TO, Td, T9, Te, Th, Tl, TD, TH, T1y; + E T1H, T15, T1A, T11, T1F, T1n, T1p, T2q, T2I, T2u, T2K, T2V, T3b, T2Z, T3d; + E Tu, Ty, T3l, T3n, T1t, T1v, T2f, T2h, T1a, T1e, T32, T34, T1W, T1Y, T2C; + E T2E, Tg, TR, Tk, TS, Tm, TV, To, TT, T1M, T21, T1P, T22, T1Q, T25; + E T1S, T23; + { + E Ts, T1d, Tx, T18, Tt, T1c, Tw, T19, TB, T14, TG, TZ, TC, T13, TF; + E T10; + { + E T4, Tc, T7, Tb; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tc = T5 * T3; + T7 = T5 * T6; + Tb = T2 * T6; + T8 = T4 + T7; + TM = T4 - T7; + TO = Tb + Tc; + Td = Tb - Tc; + T9 = W[4]; + Ts = T2 * T9; + T1d = T6 * T9; + Tx = T5 * T9; + T18 = T3 * T9; + Te = W[5]; + Tt = T5 * Te; + T1c = T3 * Te; + Tw = T2 * Te; + T19 = T6 * Te; + Th = W[6]; + TB = T3 * Th; + T14 = T5 * Th; + TG = T6 * Th; + TZ = T2 * Th; + Tl = W[7]; + TC = T6 * Tl; + T13 = T2 * Tl; + TF = T3 * Tl; + T10 = T5 * Tl; + } + TD = TB + TC; + TH = TF - TG; + T1y = TZ + T10; + T1H = TF + TG; + T15 = T13 + T14; + T1A = T13 - T14; + T11 = TZ - T10; + T1F = TB - TC; + T1n = FMA(T9, Th, Te * Tl); + T1p = FNMS(Te, Th, T9 * Tl); + { + E T2o, T2p, T2s, T2t; + T2o = T8 * Th; + T2p = Td * Tl; + T2q = T2o + T2p; + T2I = T2o - T2p; + T2s = T8 * Tl; + T2t = Td * Th; + T2u = T2s - T2t; + T2K = T2s + T2t; + } + { + E T2T, T2U, T2X, T2Y; + T2T = TM * Th; + T2U = TO * Tl; + T2V = T2T - T2U; + T3b = T2T + T2U; + T2X = TM * Tl; + T2Y = TO * Th; + T2Z = T2X + T2Y; + T3d = T2X - T2Y; + Tu = Ts + Tt; + Ty = Tw - Tx; + T3l = FMA(Tu, Th, Ty * Tl); + T3n = FNMS(Ty, Th, Tu * Tl); + } + T1t = Ts - Tt; + T1v = Tw + Tx; + T2f = FMA(T1t, Th, T1v * Tl); + T2h = FNMS(T1v, Th, T1t * Tl); + T1a = T18 - T19; + T1e = T1c + T1d; + T32 = FMA(T1a, Th, T1e * Tl); + T34 = FNMS(T1e, Th, T1a * Tl); + T1W = T18 + T19; + T1Y = T1c - T1d; + T2C = FMA(T1W, Th, T1Y * Tl); + T2E = FNMS(T1Y, Th, T1W * Tl); + { + E Ta, Tf, Ti, Tj; + Ta = T8 * T9; + Tf = Td * Te; + Tg = Ta - Tf; + TR = Ta + Tf; + Ti = T8 * Te; + Tj = Td * T9; + Tk = Ti + Tj; + TS = Ti - Tj; + } + Tm = FMA(Tg, Th, Tk * Tl); + TV = FNMS(TS, Th, TR * Tl); + To = FNMS(Tk, Th, Tg * Tl); + TT = FMA(TR, Th, TS * Tl); + { + E T1K, T1L, T1N, T1O; + T1K = TM * T9; + T1L = TO * Te; + T1M = T1K - T1L; + T21 = T1K + T1L; + T1N = TM * Te; + T1O = TO * T9; + T1P = T1N + T1O; + T22 = T1N - T1O; + } + T1Q = FMA(T1M, Th, T1P * Tl); + T25 = FNMS(T22, Th, T21 * Tl); + T1S = FNMS(T1P, Th, T1M * Tl); + T23 = FMA(T21, Th, T22 * Tl); + } + { + E TL, T6f, T8c, T8q, T3F, T5t, T7I, T7W, T2y, T6B, T6y, T7j, T4k, T5J, T4B; + E T5G, T3h, T6H, T6O, T7o, T4L, T5N, T52, T5Q, T1i, T7V, T6i, T7D, T3K, T5u; + E T3P, T5v, T1E, T6n, T6m, T7e, T3W, T5y, T41, T5z, T29, T6p, T6s, T7f, T47; + E T5B, T4c, T5C, T2R, T6z, T6E, T7k, T4v, T5H, T4E, T5K, T3y, T6P, T6K, T7p; + E T4W, T5R, T55, T5O; + { + E T1, T7G, Tq, T7F, TA, T3C, TJ, T3D, Tn, Tp; + T1 = Rp[0]; + T7G = Rm[0]; + Tn = Rp[WS(rs, 8)]; + Tp = Rm[WS(rs, 8)]; + Tq = FMA(Tm, Tn, To * Tp); + T7F = FNMS(To, Tn, Tm * Tp); + { + E Tv, Tz, TE, TI; + Tv = Rp[WS(rs, 4)]; + Tz = Rm[WS(rs, 4)]; + TA = FMA(Tu, Tv, Ty * Tz); + T3C = FNMS(Ty, Tv, Tu * Tz); + TE = Rp[WS(rs, 12)]; + TI = Rm[WS(rs, 12)]; + TJ = FMA(TD, TE, TH * TI); + T3D = FNMS(TH, TE, TD * TI); + } + { + E Tr, TK, T8a, T8b; + Tr = T1 + Tq; + TK = TA + TJ; + TL = Tr + TK; + T6f = Tr - TK; + T8a = T7G - T7F; + T8b = TA - TJ; + T8c = T8a - T8b; + T8q = T8b + T8a; + } + { + E T3B, T3E, T7E, T7H; + T3B = T1 - Tq; + T3E = T3C - T3D; + T3F = T3B - T3E; + T5t = T3B + T3E; + T7E = T3C + T3D; + T7H = T7F + T7G; + T7I = T7E + T7H; + T7W = T7H - T7E; + } + } + { + E T2e, T4g, T2w, T4z, T2j, T4h, T2n, T4y; + { + E T2c, T2d, T2r, T2v; + T2c = Ip[0]; + T2d = Im[0]; + T2e = FMA(T2, T2c, T5 * T2d); + T4g = FNMS(T5, T2c, T2 * T2d); + T2r = Ip[WS(rs, 12)]; + T2v = Im[WS(rs, 12)]; + T2w = FMA(T2q, T2r, T2u * T2v); + T4z = FNMS(T2u, T2r, T2q * T2v); + } + { + E T2g, T2i, T2l, T2m; + T2g = Ip[WS(rs, 8)]; + T2i = Im[WS(rs, 8)]; + T2j = FMA(T2f, T2g, T2h * T2i); + T4h = FNMS(T2h, T2g, T2f * T2i); + T2l = Ip[WS(rs, 4)]; + T2m = Im[WS(rs, 4)]; + T2n = FMA(T9, T2l, Te * T2m); + T4y = FNMS(Te, T2l, T9 * T2m); + } + { + E T2k, T2x, T6w, T6x; + T2k = T2e + T2j; + T2x = T2n + T2w; + T2y = T2k + T2x; + T6B = T2k - T2x; + T6w = T4g + T4h; + T6x = T4y + T4z; + T6y = T6w - T6x; + T7j = T6w + T6x; + } + { + E T4i, T4j, T4x, T4A; + T4i = T4g - T4h; + T4j = T2n - T2w; + T4k = T4i + T4j; + T5J = T4i - T4j; + T4x = T2e - T2j; + T4A = T4y - T4z; + T4B = T4x - T4A; + T5G = T4x + T4A; + } + } + { + E T31, T4Y, T3f, T4J, T36, T4Z, T3a, T4I; + { + E T2W, T30, T3c, T3e; + T2W = Ip[WS(rs, 15)]; + T30 = Im[WS(rs, 15)]; + T31 = FMA(T2V, T2W, T2Z * T30); + T4Y = FNMS(T2Z, T2W, T2V * T30); + T3c = Ip[WS(rs, 11)]; + T3e = Im[WS(rs, 11)]; + T3f = FMA(T3b, T3c, T3d * T3e); + T4J = FNMS(T3d, T3c, T3b * T3e); + } + { + E T33, T35, T38, T39; + T33 = Ip[WS(rs, 7)]; + T35 = Im[WS(rs, 7)]; + T36 = FMA(T32, T33, T34 * T35); + T4Z = FNMS(T34, T33, T32 * T35); + T38 = Ip[WS(rs, 3)]; + T39 = Im[WS(rs, 3)]; + T3a = FMA(TR, T38, TS * T39); + T4I = FNMS(TS, T38, TR * T39); + } + { + E T37, T3g, T6M, T6N; + T37 = T31 + T36; + T3g = T3a + T3f; + T3h = T37 + T3g; + T6H = T37 - T3g; + T6M = T4Y + T4Z; + T6N = T4I + T4J; + T6O = T6M - T6N; + T7o = T6M + T6N; + } + { + E T4H, T4K, T50, T51; + T4H = T31 - T36; + T4K = T4I - T4J; + T4L = T4H - T4K; + T5N = T4H + T4K; + T50 = T4Y - T4Z; + T51 = T3a - T3f; + T52 = T50 + T51; + T5Q = T50 - T51; + } + } + { + E TQ, T3G, T1g, T3N, TX, T3H, T17, T3M; + { + E TN, TP, T1b, T1f; + TN = Rp[WS(rs, 2)]; + TP = Rm[WS(rs, 2)]; + TQ = FMA(TM, TN, TO * TP); + T3G = FNMS(TO, TN, TM * TP); + T1b = Rp[WS(rs, 6)]; + T1f = Rm[WS(rs, 6)]; + T1g = FMA(T1a, T1b, T1e * T1f); + T3N = FNMS(T1e, T1b, T1a * T1f); + } + { + E TU, TW, T12, T16; + TU = Rp[WS(rs, 10)]; + TW = Rm[WS(rs, 10)]; + TX = FMA(TT, TU, TV * TW); + T3H = FNMS(TV, TU, TT * TW); + T12 = Rp[WS(rs, 14)]; + T16 = Rm[WS(rs, 14)]; + T17 = FMA(T11, T12, T15 * T16); + T3M = FNMS(T15, T12, T11 * T16); + } + { + E TY, T1h, T6g, T6h; + TY = TQ + TX; + T1h = T17 + T1g; + T1i = TY + T1h; + T7V = T1h - TY; + T6g = T3G + T3H; + T6h = T3M + T3N; + T6i = T6g - T6h; + T7D = T6g + T6h; + } + { + E T3I, T3J, T3L, T3O; + T3I = T3G - T3H; + T3J = TQ - TX; + T3K = T3I - T3J; + T5u = T3J + T3I; + T3L = T17 - T1g; + T3O = T3M - T3N; + T3P = T3L + T3O; + T5v = T3L - T3O; + } + } + { + E T1m, T3S, T1C, T3Z, T1r, T3T, T1x, T3Y; + { + E T1k, T1l, T1z, T1B; + T1k = Rp[WS(rs, 1)]; + T1l = Rm[WS(rs, 1)]; + T1m = FMA(T8, T1k, Td * T1l); + T3S = FNMS(Td, T1k, T8 * T1l); + T1z = Rp[WS(rs, 13)]; + T1B = Rm[WS(rs, 13)]; + T1C = FMA(T1y, T1z, T1A * T1B); + T3Z = FNMS(T1A, T1z, T1y * T1B); + } + { + E T1o, T1q, T1u, T1w; + T1o = Rp[WS(rs, 9)]; + T1q = Rm[WS(rs, 9)]; + T1r = FMA(T1n, T1o, T1p * T1q); + T3T = FNMS(T1p, T1o, T1n * T1q); + T1u = Rp[WS(rs, 5)]; + T1w = Rm[WS(rs, 5)]; + T1x = FMA(T1t, T1u, T1v * T1w); + T3Y = FNMS(T1v, T1u, T1t * T1w); + } + { + E T1s, T1D, T6k, T6l; + T1s = T1m + T1r; + T1D = T1x + T1C; + T1E = T1s + T1D; + T6n = T1s - T1D; + T6k = T3S + T3T; + T6l = T3Y + T3Z; + T6m = T6k - T6l; + T7e = T6k + T6l; + } + { + E T3U, T3V, T3X, T40; + T3U = T3S - T3T; + T3V = T1x - T1C; + T3W = T3U + T3V; + T5y = T3U - T3V; + T3X = T1m - T1r; + T40 = T3Y - T3Z; + T41 = T3X - T40; + T5z = T3X + T40; + } + } + { + E T1J, T43, T27, T4a, T1U, T44, T20, T49; + { + E T1G, T1I, T24, T26; + T1G = Rp[WS(rs, 15)]; + T1I = Rm[WS(rs, 15)]; + T1J = FMA(T1F, T1G, T1H * T1I); + T43 = FNMS(T1H, T1G, T1F * T1I); + T24 = Rp[WS(rs, 11)]; + T26 = Rm[WS(rs, 11)]; + T27 = FMA(T23, T24, T25 * T26); + T4a = FNMS(T25, T24, T23 * T26); + } + { + E T1R, T1T, T1X, T1Z; + T1R = Rp[WS(rs, 7)]; + T1T = Rm[WS(rs, 7)]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T44 = FNMS(T1S, T1R, T1Q * T1T); + T1X = Rp[WS(rs, 3)]; + T1Z = Rm[WS(rs, 3)]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T49 = FNMS(T1Y, T1X, T1W * T1Z); + } + { + E T1V, T28, T6q, T6r; + T1V = T1J + T1U; + T28 = T20 + T27; + T29 = T1V + T28; + T6p = T1V - T28; + T6q = T43 + T44; + T6r = T49 + T4a; + T6s = T6q - T6r; + T7f = T6q + T6r; + } + { + E T45, T46, T48, T4b; + T45 = T43 - T44; + T46 = T20 - T27; + T47 = T45 + T46; + T5B = T45 - T46; + T48 = T1J - T1U; + T4b = T49 - T4a; + T4c = T48 - T4b; + T5C = T48 + T4b; + } + } + { + E T2B, T4r, T2G, T4s, T4q, T4t, T2M, T4m, T2P, T4n, T4l, T4o; + { + E T2z, T2A, T2D, T2F; + T2z = Ip[WS(rs, 2)]; + T2A = Im[WS(rs, 2)]; + T2B = FMA(T21, T2z, T22 * T2A); + T4r = FNMS(T22, T2z, T21 * T2A); + T2D = Ip[WS(rs, 10)]; + T2F = Im[WS(rs, 10)]; + T2G = FMA(T2C, T2D, T2E * T2F); + T4s = FNMS(T2E, T2D, T2C * T2F); + } + T4q = T2B - T2G; + T4t = T4r - T4s; + { + E T2J, T2L, T2N, T2O; + T2J = Ip[WS(rs, 14)]; + T2L = Im[WS(rs, 14)]; + T2M = FMA(T2I, T2J, T2K * T2L); + T4m = FNMS(T2K, T2J, T2I * T2L); + T2N = Ip[WS(rs, 6)]; + T2O = Im[WS(rs, 6)]; + T2P = FMA(T1M, T2N, T1P * T2O); + T4n = FNMS(T1P, T2N, T1M * T2O); + } + T4l = T2M - T2P; + T4o = T4m - T4n; + { + E T2H, T2Q, T6C, T6D; + T2H = T2B + T2G; + T2Q = T2M + T2P; + T2R = T2H + T2Q; + T6z = T2Q - T2H; + T6C = T4r + T4s; + T6D = T4m + T4n; + T6E = T6C - T6D; + T7k = T6C + T6D; + } + { + E T4p, T4u, T4C, T4D; + T4p = T4l - T4o; + T4u = T4q + T4t; + T4v = KP707106781 * (T4p - T4u); + T5H = KP707106781 * (T4u + T4p); + T4C = T4t - T4q; + T4D = T4l + T4o; + T4E = KP707106781 * (T4C - T4D); + T5K = KP707106781 * (T4C + T4D); + } + } + { + E T3k, T4M, T3p, T4N, T4O, T4P, T3t, T4S, T3w, T4T, T4R, T4U; + { + E T3i, T3j, T3m, T3o; + T3i = Ip[WS(rs, 1)]; + T3j = Im[WS(rs, 1)]; + T3k = FMA(T3, T3i, T6 * T3j); + T4M = FNMS(T6, T3i, T3 * T3j); + T3m = Ip[WS(rs, 9)]; + T3o = Im[WS(rs, 9)]; + T3p = FMA(T3l, T3m, T3n * T3o); + T4N = FNMS(T3n, T3m, T3l * T3o); + } + T4O = T4M - T4N; + T4P = T3k - T3p; + { + E T3r, T3s, T3u, T3v; + T3r = Ip[WS(rs, 13)]; + T3s = Im[WS(rs, 13)]; + T3t = FMA(Th, T3r, Tl * T3s); + T4S = FNMS(Tl, T3r, Th * T3s); + T3u = Ip[WS(rs, 5)]; + T3v = Im[WS(rs, 5)]; + T3w = FMA(Tg, T3u, Tk * T3v); + T4T = FNMS(Tk, T3u, Tg * T3v); + } + T4R = T3t - T3w; + T4U = T4S - T4T; + { + E T3q, T3x, T6I, T6J; + T3q = T3k + T3p; + T3x = T3t + T3w; + T3y = T3q + T3x; + T6P = T3x - T3q; + T6I = T4M + T4N; + T6J = T4S + T4T; + T6K = T6I - T6J; + T7p = T6I + T6J; + } + { + E T4Q, T4V, T53, T54; + T4Q = T4O - T4P; + T4V = T4R + T4U; + T4W = KP707106781 * (T4Q - T4V); + T5R = KP707106781 * (T4Q + T4V); + T53 = T4R - T4U; + T54 = T4P + T4O; + T55 = KP707106781 * (T53 - T54); + T5O = KP707106781 * (T54 + T53); + } + } + { + E T2b, T7x, T7K, T7M, T3A, T7L, T7A, T7B; + { + E T1j, T2a, T7C, T7J; + T1j = TL + T1i; + T2a = T1E + T29; + T2b = T1j + T2a; + T7x = T1j - T2a; + T7C = T7e + T7f; + T7J = T7D + T7I; + T7K = T7C + T7J; + T7M = T7J - T7C; + } + { + E T2S, T3z, T7y, T7z; + T2S = T2y + T2R; + T3z = T3h + T3y; + T3A = T2S + T3z; + T7L = T3z - T2S; + T7y = T7j + T7k; + T7z = T7o + T7p; + T7A = T7y - T7z; + T7B = T7y + T7z; + } + Rm[WS(rs, 15)] = T2b - T3A; + Im[WS(rs, 15)] = T7B - T7K; + Rp[0] = T2b + T3A; + Ip[0] = T7B + T7K; + Rm[WS(rs, 7)] = T7x - T7A; + Im[WS(rs, 7)] = T7L - T7M; + Rp[WS(rs, 8)] = T7x + T7A; + Ip[WS(rs, 8)] = T7L + T7M; + } + { + E T7h, T7t, T7Q, T7S, T7m, T7u, T7r, T7v; + { + E T7d, T7g, T7O, T7P; + T7d = TL - T1i; + T7g = T7e - T7f; + T7h = T7d + T7g; + T7t = T7d - T7g; + T7O = T29 - T1E; + T7P = T7I - T7D; + T7Q = T7O + T7P; + T7S = T7P - T7O; + } + { + E T7i, T7l, T7n, T7q; + T7i = T2y - T2R; + T7l = T7j - T7k; + T7m = T7i + T7l; + T7u = T7l - T7i; + T7n = T3h - T3y; + T7q = T7o - T7p; + T7r = T7n - T7q; + T7v = T7n + T7q; + } + { + E T7s, T7N, T7w, T7R; + T7s = KP707106781 * (T7m + T7r); + Rm[WS(rs, 11)] = T7h - T7s; + Rp[WS(rs, 4)] = T7h + T7s; + T7N = KP707106781 * (T7u + T7v); + Im[WS(rs, 11)] = T7N - T7Q; + Ip[WS(rs, 4)] = T7N + T7Q; + T7w = KP707106781 * (T7u - T7v); + Rm[WS(rs, 3)] = T7t - T7w; + Rp[WS(rs, 12)] = T7t + T7w; + T7R = KP707106781 * (T7r - T7m); + Im[WS(rs, 3)] = T7R - T7S; + Ip[WS(rs, 12)] = T7R + T7S; + } + } + { + E T6j, T7X, T83, T6X, T6u, T7U, T77, T7b, T70, T82, T6G, T6U, T74, T7a, T6R; + E T6V; + { + E T6o, T6t, T6A, T6F; + T6j = T6f - T6i; + T7X = T7V + T7W; + T83 = T7W - T7V; + T6X = T6f + T6i; + T6o = T6m - T6n; + T6t = T6p + T6s; + T6u = KP707106781 * (T6o - T6t); + T7U = KP707106781 * (T6o + T6t); + { + E T75, T76, T6Y, T6Z; + T75 = T6H + T6K; + T76 = T6O + T6P; + T77 = FNMS(KP382683432, T76, KP923879532 * T75); + T7b = FMA(KP923879532, T76, KP382683432 * T75); + T6Y = T6n + T6m; + T6Z = T6p - T6s; + T70 = KP707106781 * (T6Y + T6Z); + T82 = KP707106781 * (T6Z - T6Y); + } + T6A = T6y - T6z; + T6F = T6B - T6E; + T6G = FMA(KP923879532, T6A, KP382683432 * T6F); + T6U = FNMS(KP923879532, T6F, KP382683432 * T6A); + { + E T72, T73, T6L, T6Q; + T72 = T6y + T6z; + T73 = T6B + T6E; + T74 = FMA(KP382683432, T72, KP923879532 * T73); + T7a = FNMS(KP382683432, T73, KP923879532 * T72); + T6L = T6H - T6K; + T6Q = T6O - T6P; + T6R = FNMS(KP923879532, T6Q, KP382683432 * T6L); + T6V = FMA(KP382683432, T6Q, KP923879532 * T6L); + } + } + { + E T6v, T6S, T81, T84; + T6v = T6j + T6u; + T6S = T6G + T6R; + Rm[WS(rs, 9)] = T6v - T6S; + Rp[WS(rs, 6)] = T6v + T6S; + T81 = T6U + T6V; + T84 = T82 + T83; + Im[WS(rs, 9)] = T81 - T84; + Ip[WS(rs, 6)] = T81 + T84; + } + { + E T6T, T6W, T85, T86; + T6T = T6j - T6u; + T6W = T6U - T6V; + Rm[WS(rs, 1)] = T6T - T6W; + Rp[WS(rs, 14)] = T6T + T6W; + T85 = T6R - T6G; + T86 = T83 - T82; + Im[WS(rs, 1)] = T85 - T86; + Ip[WS(rs, 14)] = T85 + T86; + } + { + E T71, T78, T7T, T7Y; + T71 = T6X + T70; + T78 = T74 + T77; + Rm[WS(rs, 13)] = T71 - T78; + Rp[WS(rs, 2)] = T71 + T78; + T7T = T7a + T7b; + T7Y = T7U + T7X; + Im[WS(rs, 13)] = T7T - T7Y; + Ip[WS(rs, 2)] = T7T + T7Y; + } + { + E T79, T7c, T7Z, T80; + T79 = T6X - T70; + T7c = T7a - T7b; + Rm[WS(rs, 5)] = T79 - T7c; + Rp[WS(rs, 10)] = T79 + T7c; + T7Z = T77 - T74; + T80 = T7X - T7U; + Im[WS(rs, 5)] = T7Z - T80; + Ip[WS(rs, 10)] = T7Z + T80; + } + } + { + E T3R, T5d, T8r, T8x, T4e, T8o, T5n, T5r, T4G, T5a, T5g, T8w, T5k, T5q, T57; + E T5b, T3Q, T8p; + T3Q = KP707106781 * (T3K - T3P); + T3R = T3F - T3Q; + T5d = T3F + T3Q; + T8p = KP707106781 * (T5v - T5u); + T8r = T8p + T8q; + T8x = T8q - T8p; + { + E T42, T4d, T5l, T5m; + T42 = FNMS(KP923879532, T41, KP382683432 * T3W); + T4d = FMA(KP382683432, T47, KP923879532 * T4c); + T4e = T42 - T4d; + T8o = T42 + T4d; + T5l = T4L + T4W; + T5m = T52 + T55; + T5n = FNMS(KP555570233, T5m, KP831469612 * T5l); + T5r = FMA(KP831469612, T5m, KP555570233 * T5l); + } + { + E T4w, T4F, T5e, T5f; + T4w = T4k - T4v; + T4F = T4B - T4E; + T4G = FMA(KP980785280, T4w, KP195090322 * T4F); + T5a = FNMS(KP980785280, T4F, KP195090322 * T4w); + T5e = FMA(KP923879532, T3W, KP382683432 * T41); + T5f = FNMS(KP923879532, T47, KP382683432 * T4c); + T5g = T5e + T5f; + T8w = T5f - T5e; + } + { + E T5i, T5j, T4X, T56; + T5i = T4k + T4v; + T5j = T4B + T4E; + T5k = FMA(KP555570233, T5i, KP831469612 * T5j); + T5q = FNMS(KP555570233, T5j, KP831469612 * T5i); + T4X = T4L - T4W; + T56 = T52 - T55; + T57 = FNMS(KP980785280, T56, KP195090322 * T4X); + T5b = FMA(KP195090322, T56, KP980785280 * T4X); + } + { + E T4f, T58, T8v, T8y; + T4f = T3R + T4e; + T58 = T4G + T57; + Rm[WS(rs, 8)] = T4f - T58; + Rp[WS(rs, 7)] = T4f + T58; + T8v = T5a + T5b; + T8y = T8w + T8x; + Im[WS(rs, 8)] = T8v - T8y; + Ip[WS(rs, 7)] = T8v + T8y; + } + { + E T59, T5c, T8z, T8A; + T59 = T3R - T4e; + T5c = T5a - T5b; + Rm[0] = T59 - T5c; + Rp[WS(rs, 15)] = T59 + T5c; + T8z = T57 - T4G; + T8A = T8x - T8w; + Im[0] = T8z - T8A; + Ip[WS(rs, 15)] = T8z + T8A; + } + { + E T5h, T5o, T8n, T8s; + T5h = T5d + T5g; + T5o = T5k + T5n; + Rm[WS(rs, 12)] = T5h - T5o; + Rp[WS(rs, 3)] = T5h + T5o; + T8n = T5q + T5r; + T8s = T8o + T8r; + Im[WS(rs, 12)] = T8n - T8s; + Ip[WS(rs, 3)] = T8n + T8s; + } + { + E T5p, T5s, T8t, T8u; + T5p = T5d - T5g; + T5s = T5q - T5r; + Rm[WS(rs, 4)] = T5p - T5s; + Rp[WS(rs, 11)] = T5p + T5s; + T8t = T5n - T5k; + T8u = T8r - T8o; + Im[WS(rs, 4)] = T8t - T8u; + Ip[WS(rs, 11)] = T8t + T8u; + } + } + { + E T5x, T5Z, T8d, T8j, T5E, T88, T69, T6d, T5M, T5W, T62, T8i, T66, T6c, T5T; + E T5X, T5w, T89; + T5w = KP707106781 * (T5u + T5v); + T5x = T5t - T5w; + T5Z = T5t + T5w; + T89 = KP707106781 * (T3K + T3P); + T8d = T89 + T8c; + T8j = T8c - T89; + { + E T5A, T5D, T67, T68; + T5A = FNMS(KP382683432, T5z, KP923879532 * T5y); + T5D = FMA(KP923879532, T5B, KP382683432 * T5C); + T5E = T5A - T5D; + T88 = T5A + T5D; + T67 = T5N + T5O; + T68 = T5Q + T5R; + T69 = FNMS(KP195090322, T68, KP980785280 * T67); + T6d = FMA(KP195090322, T67, KP980785280 * T68); + } + { + E T5I, T5L, T60, T61; + T5I = T5G - T5H; + T5L = T5J - T5K; + T5M = FMA(KP555570233, T5I, KP831469612 * T5L); + T5W = FNMS(KP831469612, T5I, KP555570233 * T5L); + T60 = FMA(KP382683432, T5y, KP923879532 * T5z); + T61 = FNMS(KP382683432, T5B, KP923879532 * T5C); + T62 = T60 + T61; + T8i = T61 - T60; + } + { + E T64, T65, T5P, T5S; + T64 = T5G + T5H; + T65 = T5J + T5K; + T66 = FMA(KP980785280, T64, KP195090322 * T65); + T6c = FNMS(KP195090322, T64, KP980785280 * T65); + T5P = T5N - T5O; + T5S = T5Q - T5R; + T5T = FNMS(KP831469612, T5S, KP555570233 * T5P); + T5X = FMA(KP831469612, T5P, KP555570233 * T5S); + } + { + E T5F, T5U, T8h, T8k; + T5F = T5x + T5E; + T5U = T5M + T5T; + Rm[WS(rs, 10)] = T5F - T5U; + Rp[WS(rs, 5)] = T5F + T5U; + T8h = T5W + T5X; + T8k = T8i + T8j; + Im[WS(rs, 10)] = T8h - T8k; + Ip[WS(rs, 5)] = T8h + T8k; + } + { + E T5V, T5Y, T8l, T8m; + T5V = T5x - T5E; + T5Y = T5W - T5X; + Rm[WS(rs, 2)] = T5V - T5Y; + Rp[WS(rs, 13)] = T5V + T5Y; + T8l = T5T - T5M; + T8m = T8j - T8i; + Im[WS(rs, 2)] = T8l - T8m; + Ip[WS(rs, 13)] = T8l + T8m; + } + { + E T63, T6a, T87, T8e; + T63 = T5Z + T62; + T6a = T66 + T69; + Rm[WS(rs, 14)] = T63 - T6a; + Rp[WS(rs, 1)] = T63 + T6a; + T87 = T6c + T6d; + T8e = T88 + T8d; + Im[WS(rs, 14)] = T87 - T8e; + Ip[WS(rs, 1)] = T87 + T8e; + } + { + E T6b, T6e, T8f, T8g; + T6b = T5Z - T62; + T6e = T6c - T6d; + Rm[WS(rs, 6)] = T6b - T6e; + Rp[WS(rs, 9)] = T6b + T6e; + T8f = T69 - T66; + T8g = T8d - T88; + Im[WS(rs, 6)] = T8f - T8g; + Ip[WS(rs, 9)] = T8f + T8g; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cf2_32", twinstr, &GENUS, {376, 168, 112, 0} }; + +void X(codelet_hc2cf2_32) (planner *p) { + X(khc2c_register) (p, hc2cf2_32, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_4.c new file mode 100644 index 000000000..ad114b5e4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_4.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:08 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -dit -name hc2cf2_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 4, MAKE_VOLATILE_STRIDE(16, rs)) { + E T2, T6, T3, T5, T7, Tb, T4, Ta; + T2 = W[0]; + T6 = W[3]; + T3 = W[2]; + T4 = T2 * T3; + Ta = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Tb = FNMS(T5, T3, Ta); + { + E T1, Tx, Td, Tw, Ti, Tq, Tm, Ts; + T1 = Rp[0]; + Tx = Rm[0]; + { + E T8, T9, Tc, Tv; + T8 = Rp[WS(rs, 1)]; + T9 = T7 * T8; + Tc = Rm[WS(rs, 1)]; + Tv = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Tw = FNMS(Tb, T8, Tv); + } + { + E Tf, Tg, Th, Tp; + Tf = Ip[0]; + Tg = T2 * Tf; + Th = Im[0]; + Tp = T2 * Th; + Ti = FMA(T5, Th, Tg); + Tq = FNMS(T5, Tf, Tp); + } + { + E Tj, Tk, Tl, Tr; + Tj = Ip[WS(rs, 1)]; + Tk = T3 * Tj; + Tl = Im[WS(rs, 1)]; + Tr = T3 * Tl; + Tm = FMA(T6, Tl, Tk); + Ts = FNMS(T6, Tj, Tr); + } + { + E Te, Tn, Tu, Ty; + Te = T1 + Td; + Tn = Ti + Tm; + Rm[WS(rs, 1)] = Te - Tn; + Rp[0] = Te + Tn; + Tu = Tq + Ts; + Ty = Tw + Tx; + Im[WS(rs, 1)] = Tu - Ty; + Ip[0] = Tu + Ty; + } + { + E To, Tt, Tz, TA; + To = T1 - Td; + Tt = Tq - Ts; + Rm[0] = To - Tt; + Rp[WS(rs, 1)] = To + Tt; + Tz = Tm - Ti; + TA = Tx - Tw; + Im[0] = Tz - TA; + Ip[WS(rs, 1)] = Tz + TA; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cf2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hc2cf2_4) (planner *p) { + X(khc2c_register) (p, hc2cf2_4, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -dit -name hc2cf2_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 4, MAKE_VOLATILE_STRIDE(16, rs)) { + E T2, T4, T3, T5, T6, T8; + T2 = W[0]; + T4 = W[1]; + T3 = W[2]; + T5 = W[3]; + T6 = FMA(T2, T3, T4 * T5); + T8 = FNMS(T4, T3, T2 * T5); + { + E T1, Tp, Ta, To, Te, Tk, Th, Tl, T7, T9; + T1 = Rp[0]; + Tp = Rm[0]; + T7 = Rp[WS(rs, 1)]; + T9 = Rm[WS(rs, 1)]; + Ta = FMA(T6, T7, T8 * T9); + To = FNMS(T8, T7, T6 * T9); + { + E Tc, Td, Tf, Tg; + Tc = Ip[0]; + Td = Im[0]; + Te = FMA(T2, Tc, T4 * Td); + Tk = FNMS(T4, Tc, T2 * Td); + Tf = Ip[WS(rs, 1)]; + Tg = Im[WS(rs, 1)]; + Th = FMA(T3, Tf, T5 * Tg); + Tl = FNMS(T5, Tf, T3 * Tg); + } + { + E Tb, Ti, Tn, Tq; + Tb = T1 + Ta; + Ti = Te + Th; + Rm[WS(rs, 1)] = Tb - Ti; + Rp[0] = Tb + Ti; + Tn = Tk + Tl; + Tq = To + Tp; + Im[WS(rs, 1)] = Tn - Tq; + Ip[0] = Tn + Tq; + } + { + E Tj, Tm, Tr, Ts; + Tj = T1 - Ta; + Tm = Tk - Tl; + Rm[0] = Tj - Tm; + Rp[WS(rs, 1)] = Tj + Tm; + Tr = Th - Te; + Ts = Tp - To; + Im[0] = Tr - Ts; + Ip[WS(rs, 1)] = Tr + Ts; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cf2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hc2cf2_4) (planner *p) { + X(khc2c_register) (p, hc2cf2_4, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_8.c new file mode 100644 index 000000000..fa5855add --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf2_8.c @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:08 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -dit -name hc2cf2_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 74 FP additions, 50 FP multiplications, + * (or, 44 additions, 20 multiplications, 30 fused multiply/add), + * 48 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(32, rs)) { + E T2, T3, Tl, Tn, T5, T6, Tf, T7, Ts, Tb, To, Ti, TC, TG; + { + E T4, Tm, Tr, Ta, TB, TF; + T2 = W[0]; + T3 = W[2]; + T4 = T2 * T3; + Tl = W[4]; + Tm = T2 * Tl; + Tn = W[5]; + Tr = T2 * Tn; + T5 = W[1]; + T6 = W[3]; + Ta = T2 * T6; + Tf = FMA(T5, T6, T4); + T7 = FNMS(T5, T6, T4); + Ts = FNMS(T5, Tl, Tr); + Tb = FMA(T5, T3, Ta); + To = FMA(T5, Tn, Tm); + TB = Tf * Tl; + TF = Tf * Tn; + Ti = FNMS(T5, T3, Ta); + TC = FMA(Ti, Tn, TB); + TG = FNMS(Ti, Tl, TF); + } + { + E T1, T1s, Td, T1r, Tu, TY, Tk, TW, TN, TR, T18, T1a, T1c, T1d, TA; + E TI, T11, T13, T15, T16; + T1 = Rp[0]; + T1s = Rm[0]; + { + E T8, T9, Tc, T1q; + T8 = Rp[WS(rs, 2)]; + T9 = T7 * T8; + Tc = Rm[WS(rs, 2)]; + T1q = T7 * Tc; + Td = FMA(Tb, Tc, T9); + T1r = FNMS(Tb, T8, T1q); + } + { + E Tp, Tq, Tt, TX; + Tp = Rp[WS(rs, 3)]; + Tq = To * Tp; + Tt = Rm[WS(rs, 3)]; + TX = To * Tt; + Tu = FMA(Ts, Tt, Tq); + TY = FNMS(Ts, Tp, TX); + } + { + E Tg, Th, Tj, TV; + Tg = Rp[WS(rs, 1)]; + Th = Tf * Tg; + Tj = Rm[WS(rs, 1)]; + TV = Tf * Tj; + Tk = FMA(Ti, Tj, Th); + TW = FNMS(Ti, Tg, TV); + } + { + E TK, TL, TM, T19, TO, TP, TQ, T1b; + TK = Ip[WS(rs, 3)]; + TL = Tl * TK; + TM = Im[WS(rs, 3)]; + T19 = Tl * TM; + TO = Ip[WS(rs, 1)]; + TP = T3 * TO; + TQ = Im[WS(rs, 1)]; + T1b = T3 * TQ; + TN = FMA(Tn, TM, TL); + TR = FMA(T6, TQ, TP); + T18 = TN - TR; + T1a = FNMS(Tn, TK, T19); + T1c = FNMS(T6, TO, T1b); + T1d = T1a - T1c; + } + { + E Tx, Ty, Tz, T12, TD, TE, TH, T14; + Tx = Ip[0]; + Ty = T2 * Tx; + Tz = Im[0]; + T12 = T2 * Tz; + TD = Ip[WS(rs, 2)]; + TE = TC * TD; + TH = Im[WS(rs, 2)]; + T14 = TC * TH; + TA = FMA(T5, Tz, Ty); + TI = FMA(TG, TH, TE); + T11 = TA - TI; + T13 = FNMS(T5, Tx, T12); + T15 = FNMS(TG, TD, T14); + T16 = T13 - T15; + } + { + E T10, T1g, T1z, T1B, T1f, T1C, T1j, T1A; + { + E TU, TZ, T1x, T1y; + TU = T1 - Td; + TZ = TW - TY; + T10 = TU + TZ; + T1g = TU - TZ; + T1x = T1s - T1r; + T1y = Tk - Tu; + T1z = T1x - T1y; + T1B = T1y + T1x; + } + { + E T17, T1e, T1h, T1i; + T17 = T11 + T16; + T1e = T18 - T1d; + T1f = T17 + T1e; + T1C = T1e - T17; + T1h = T16 - T11; + T1i = T18 + T1d; + T1j = T1h - T1i; + T1A = T1h + T1i; + } + Rm[WS(rs, 2)] = FNMS(KP707106781, T1f, T10); + Im[WS(rs, 2)] = FMS(KP707106781, T1A, T1z); + Rp[WS(rs, 1)] = FMA(KP707106781, T1f, T10); + Ip[WS(rs, 1)] = FMA(KP707106781, T1A, T1z); + Rm[0] = FNMS(KP707106781, T1j, T1g); + Im[0] = FMS(KP707106781, T1C, T1B); + Rp[WS(rs, 3)] = FMA(KP707106781, T1j, T1g); + Ip[WS(rs, 3)] = FMA(KP707106781, T1C, T1B); + } + { + E Tw, T1k, T1u, T1w, TT, T1v, T1n, T1o; + { + E Te, Tv, T1p, T1t; + Te = T1 + Td; + Tv = Tk + Tu; + Tw = Te + Tv; + T1k = Te - Tv; + T1p = TW + TY; + T1t = T1r + T1s; + T1u = T1p + T1t; + T1w = T1t - T1p; + } + { + E TJ, TS, T1l, T1m; + TJ = TA + TI; + TS = TN + TR; + TT = TJ + TS; + T1v = TS - TJ; + T1l = T13 + T15; + T1m = T1a + T1c; + T1n = T1l - T1m; + T1o = T1l + T1m; + } + Rm[WS(rs, 3)] = Tw - TT; + Im[WS(rs, 3)] = T1o - T1u; + Rp[0] = Tw + TT; + Ip[0] = T1o + T1u; + Rm[WS(rs, 1)] = T1k - T1n; + Im[WS(rs, 1)] = T1v - T1w; + Rp[WS(rs, 2)] = T1k + T1n; + Ip[WS(rs, 2)] = T1v + T1w; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cf2_8", twinstr, &GENUS, {44, 20, 30, 0} }; + +void X(codelet_hc2cf2_8) (planner *p) { + X(khc2c_register) (p, hc2cf2_8, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -dit -name hc2cf2_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 74 FP additions, 44 FP multiplications, + * (or, 56 additions, 26 multiplications, 18 fused multiply/add), + * 42 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(32, rs)) { + E T2, T5, T3, T6, T8, Tc, Tg, Ti, Tl, Tm, Tn, Tz, Tp, Tx; + { + E T4, Tb, T7, Ta; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tb = T5 * T3; + T7 = T5 * T6; + Ta = T2 * T6; + T8 = T4 - T7; + Tc = Ta + Tb; + Tg = T4 + T7; + Ti = Ta - Tb; + Tl = W[4]; + Tm = W[5]; + Tn = FMA(T2, Tl, T5 * Tm); + Tz = FNMS(Ti, Tl, Tg * Tm); + Tp = FNMS(T5, Tl, T2 * Tm); + Tx = FMA(Tg, Tl, Ti * Tm); + } + { + E Tf, T1i, TL, T1d, TJ, T17, TV, TY, Ts, T1j, TO, T1a, TC, T16, TQ; + E TT; + { + E T1, T1c, Te, T1b, T9, Td; + T1 = Rp[0]; + T1c = Rm[0]; + T9 = Rp[WS(rs, 2)]; + Td = Rm[WS(rs, 2)]; + Te = FMA(T8, T9, Tc * Td); + T1b = FNMS(Tc, T9, T8 * Td); + Tf = T1 + Te; + T1i = T1c - T1b; + TL = T1 - Te; + T1d = T1b + T1c; + } + { + E TF, TW, TI, TX; + { + E TD, TE, TG, TH; + TD = Ip[WS(rs, 3)]; + TE = Im[WS(rs, 3)]; + TF = FMA(Tl, TD, Tm * TE); + TW = FNMS(Tm, TD, Tl * TE); + TG = Ip[WS(rs, 1)]; + TH = Im[WS(rs, 1)]; + TI = FMA(T3, TG, T6 * TH); + TX = FNMS(T6, TG, T3 * TH); + } + TJ = TF + TI; + T17 = TW + TX; + TV = TF - TI; + TY = TW - TX; + } + { + E Tk, TM, Tr, TN; + { + E Th, Tj, To, Tq; + Th = Rp[WS(rs, 1)]; + Tj = Rm[WS(rs, 1)]; + Tk = FMA(Tg, Th, Ti * Tj); + TM = FNMS(Ti, Th, Tg * Tj); + To = Rp[WS(rs, 3)]; + Tq = Rm[WS(rs, 3)]; + Tr = FMA(Tn, To, Tp * Tq); + TN = FNMS(Tp, To, Tn * Tq); + } + Ts = Tk + Tr; + T1j = Tk - Tr; + TO = TM - TN; + T1a = TM + TN; + } + { + E Tw, TR, TB, TS; + { + E Tu, Tv, Ty, TA; + Tu = Ip[0]; + Tv = Im[0]; + Tw = FMA(T2, Tu, T5 * Tv); + TR = FNMS(T5, Tu, T2 * Tv); + Ty = Ip[WS(rs, 2)]; + TA = Im[WS(rs, 2)]; + TB = FMA(Tx, Ty, Tz * TA); + TS = FNMS(Tz, Ty, Tx * TA); + } + TC = Tw + TB; + T16 = TR + TS; + TQ = Tw - TB; + TT = TR - TS; + } + { + E Tt, TK, T1f, T1g; + Tt = Tf + Ts; + TK = TC + TJ; + Rm[WS(rs, 3)] = Tt - TK; + Rp[0] = Tt + TK; + { + E T19, T1e, T15, T18; + T19 = T16 + T17; + T1e = T1a + T1d; + Im[WS(rs, 3)] = T19 - T1e; + Ip[0] = T19 + T1e; + T15 = Tf - Ts; + T18 = T16 - T17; + Rm[WS(rs, 1)] = T15 - T18; + Rp[WS(rs, 2)] = T15 + T18; + } + T1f = TJ - TC; + T1g = T1d - T1a; + Im[WS(rs, 1)] = T1f - T1g; + Ip[WS(rs, 2)] = T1f + T1g; + { + E T11, T1k, T14, T1h, T12, T13; + T11 = TL - TO; + T1k = T1i - T1j; + T12 = TT - TQ; + T13 = TV + TY; + T14 = KP707106781 * (T12 - T13); + T1h = KP707106781 * (T12 + T13); + Rm[0] = T11 - T14; + Ip[WS(rs, 1)] = T1h + T1k; + Rp[WS(rs, 3)] = T11 + T14; + Im[WS(rs, 2)] = T1h - T1k; + } + { + E TP, T1m, T10, T1l, TU, TZ; + TP = TL + TO; + T1m = T1j + T1i; + TU = TQ + TT; + TZ = TV - TY; + T10 = KP707106781 * (TU + TZ); + T1l = KP707106781 * (TZ - TU); + Rm[WS(rs, 2)] = TP - T10; + Ip[WS(rs, 3)] = T1l + T1m; + Rp[WS(rs, 1)] = TP + T10; + Im[0] = T1l - T1m; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cf2_8", twinstr, &GENUS, {56, 26, 18, 0} }; + +void X(codelet_hc2cf2_8) (planner *p) { + X(khc2c_register) (p, hc2cf2_8, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_10.c new file mode 100644 index 000000000..e9163d5cd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_10.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:56 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -dit -name hc2cf_10 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 102 FP additions, 72 FP multiplications, + * (or, 48 additions, 18 multiplications, 54 fused multiply/add), + * 47 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E T8, T26, T12, T1U, TM, TZ, T10, T1I, T1J, T24, T16, T17, T18, T1h, T1m; + E T1P, Tl, Ty, Tz, T1F, T1G, T23, T13, T14, T15, T1s, T1x, T1O; + { + E T1, T1T, T3, T6, T4, T1R, T2, T7, T1S, T5; + T1 = Rp[0]; + T1T = Rm[0]; + T3 = Ip[WS(rs, 2)]; + T6 = Im[WS(rs, 2)]; + T2 = W[8]; + T4 = T2 * T3; + T1R = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T1S = FNMS(T5, T3, T1R); + T8 = T1 - T7; + T26 = T1T - T1S; + T12 = T1 + T7; + T1U = T1S + T1T; + } + { + E TF, T1e, TY, T1l, TL, T1g, TS, T1j; + { + E TB, TE, TC, T1d, TA, TD; + TB = Rp[WS(rs, 2)]; + TE = Rm[WS(rs, 2)]; + TA = W[6]; + TC = TA * TB; + T1d = TA * TE; + TD = W[7]; + TF = FMA(TD, TE, TC); + T1e = FNMS(TD, TB, T1d); + } + { + E TU, TX, TV, T1k, TT, TW; + TU = Ip[0]; + TX = Im[0]; + TT = W[0]; + TV = TT * TU; + T1k = TT * TX; + TW = W[1]; + TY = FMA(TW, TX, TV); + T1l = FNMS(TW, TU, T1k); + } + { + E TH, TK, TI, T1f, TG, TJ; + TH = Ip[WS(rs, 4)]; + TK = Im[WS(rs, 4)]; + TG = W[16]; + TI = TG * TH; + T1f = TG * TK; + TJ = W[17]; + TL = FMA(TJ, TK, TI); + T1g = FNMS(TJ, TH, T1f); + } + { + E TO, TR, TP, T1i, TN, TQ; + TO = Rp[WS(rs, 3)]; + TR = Rm[WS(rs, 3)]; + TN = W[10]; + TP = TN * TO; + T1i = TN * TR; + TQ = W[11]; + TS = FMA(TQ, TR, TP); + T1j = FNMS(TQ, TO, T1i); + } + TM = TF - TL; + TZ = TS - TY; + T10 = TM + TZ; + T1I = T1l - T1j; + T1J = T1g - T1e; + T24 = T1J + T1I; + T16 = TF + TL; + T17 = TS + TY; + T18 = T16 + T17; + T1h = T1e + T1g; + T1m = T1j + T1l; + T1P = T1h + T1m; + } + { + E Te, T1p, Tx, T1w, Tk, T1r, Tr, T1u; + { + E Ta, Td, Tb, T1o, T9, Tc; + Ta = Rp[WS(rs, 1)]; + Td = Rm[WS(rs, 1)]; + T9 = W[2]; + Tb = T9 * Ta; + T1o = T9 * Td; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + T1p = FNMS(Tc, Ta, T1o); + } + { + E Tt, Tw, Tu, T1v, Ts, Tv; + Tt = Ip[WS(rs, 1)]; + Tw = Im[WS(rs, 1)]; + Ts = W[4]; + Tu = Ts * Tt; + T1v = Ts * Tw; + Tv = W[5]; + Tx = FMA(Tv, Tw, Tu); + T1w = FNMS(Tv, Tt, T1v); + } + { + E Tg, Tj, Th, T1q, Tf, Ti; + Tg = Ip[WS(rs, 3)]; + Tj = Im[WS(rs, 3)]; + Tf = W[12]; + Th = Tf * Tg; + T1q = Tf * Tj; + Ti = W[13]; + Tk = FMA(Ti, Tj, Th); + T1r = FNMS(Ti, Tg, T1q); + } + { + E Tn, Tq, To, T1t, Tm, Tp; + Tn = Rp[WS(rs, 4)]; + Tq = Rm[WS(rs, 4)]; + Tm = W[14]; + To = Tm * Tn; + T1t = Tm * Tq; + Tp = W[15]; + Tr = FMA(Tp, Tq, To); + T1u = FNMS(Tp, Tn, T1t); + } + Tl = Te - Tk; + Ty = Tr - Tx; + Tz = Tl + Ty; + T1F = T1w - T1u; + T1G = T1r - T1p; + T23 = T1G + T1F; + T13 = Te + Tk; + T14 = Tr + Tx; + T15 = T13 + T14; + T1s = T1p + T1r; + T1x = T1u + T1w; + T1O = T1s + T1x; + } + { + E T1D, T11, T1C, T1L, T1N, T1H, T1K, T1M, T1E; + T1D = Tz - T10; + T11 = Tz + T10; + T1C = FNMS(KP250000000, T11, T8); + T1H = T1F - T1G; + T1K = T1I - T1J; + T1L = FMA(KP618033988, T1K, T1H); + T1N = FNMS(KP618033988, T1H, T1K); + Rm[WS(rs, 4)] = T8 + T11; + T1M = FNMS(KP559016994, T1D, T1C); + Rm[WS(rs, 2)] = FNMS(KP951056516, T1N, T1M); + Rp[WS(rs, 3)] = FMA(KP951056516, T1N, T1M); + T1E = FMA(KP559016994, T1D, T1C); + Rm[0] = FNMS(KP951056516, T1L, T1E); + Rp[WS(rs, 1)] = FMA(KP951056516, T1L, T1E); + } + { + E T28, T25, T27, T2c, T2e, T2a, T2b, T2d, T29; + T28 = T24 - T23; + T25 = T23 + T24; + T27 = FMA(KP250000000, T25, T26); + T2a = Ty - Tl; + T2b = TZ - TM; + T2c = FMA(KP618033988, T2b, T2a); + T2e = FNMS(KP618033988, T2a, T2b); + Im[WS(rs, 4)] = T25 - T26; + T2d = FNMS(KP559016994, T28, T27); + Im[WS(rs, 2)] = FMS(KP951056516, T2e, T2d); + Ip[WS(rs, 3)] = FMA(KP951056516, T2e, T2d); + T29 = FMA(KP559016994, T28, T27); + Im[0] = FMS(KP951056516, T2c, T29); + Ip[WS(rs, 1)] = FMA(KP951056516, T2c, T29); + } + { + E T1b, T19, T1a, T1z, T1B, T1n, T1y, T1A, T1c; + T1b = T15 - T18; + T19 = T15 + T18; + T1a = FNMS(KP250000000, T19, T12); + T1n = T1h - T1m; + T1y = T1s - T1x; + T1z = FNMS(KP618033988, T1y, T1n); + T1B = FMA(KP618033988, T1n, T1y); + Rp[0] = T12 + T19; + T1A = FMA(KP559016994, T1b, T1a); + Rp[WS(rs, 4)] = FNMS(KP951056516, T1B, T1A); + Rm[WS(rs, 3)] = FMA(KP951056516, T1B, T1A); + T1c = FNMS(KP559016994, T1b, T1a); + Rp[WS(rs, 2)] = FNMS(KP951056516, T1z, T1c); + Rm[WS(rs, 1)] = FMA(KP951056516, T1z, T1c); + } + { + E T1W, T1Q, T1V, T20, T22, T1Y, T1Z, T21, T1X; + T1W = T1O - T1P; + T1Q = T1O + T1P; + T1V = FNMS(KP250000000, T1Q, T1U); + T1Y = T16 - T17; + T1Z = T13 - T14; + T20 = FNMS(KP618033988, T1Z, T1Y); + T22 = FMA(KP618033988, T1Y, T1Z); + Ip[0] = T1Q + T1U; + T21 = FMA(KP559016994, T1W, T1V); + Im[WS(rs, 3)] = FMS(KP951056516, T22, T21); + Ip[WS(rs, 4)] = FMA(KP951056516, T22, T21); + T1X = FNMS(KP559016994, T1W, T1V); + Im[WS(rs, 1)] = FMS(KP951056516, T20, T1X); + Ip[WS(rs, 2)] = FMA(KP951056516, T20, T1X); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cf_10", twinstr, &GENUS, {48, 18, 54, 0} }; + +void X(codelet_hc2cf_10) (planner *p) { + X(khc2c_register) (p, hc2cf_10, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 10 -dit -name hc2cf_10 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 102 FP additions, 60 FP multiplications, + * (or, 72 additions, 30 multiplications, 30 fused multiply/add), + * 45 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E T7, T1O, TT, T1C, TF, TQ, TR, T1r, T1s, T1L, TX, TY, TZ, T16, T19; + E T1y, Ti, Tt, Tu, T1o, T1p, T1M, TU, TV, TW, T1d, T1g, T1x; + { + E T1, T1B, T6, T1A; + T1 = Rp[0]; + T1B = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Ip[WS(rs, 2)]; + T5 = Im[WS(rs, 2)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T1A = FNMS(T4, T3, T2 * T5); + } + T7 = T1 - T6; + T1O = T1B - T1A; + TT = T1 + T6; + T1C = T1A + T1B; + } + { + E Tz, T14, TP, T18, TE, T15, TK, T17; + { + E Tw, Ty, Tv, Tx; + Tw = Rp[WS(rs, 2)]; + Ty = Rm[WS(rs, 2)]; + Tv = W[6]; + Tx = W[7]; + Tz = FMA(Tv, Tw, Tx * Ty); + T14 = FNMS(Tx, Tw, Tv * Ty); + } + { + E TM, TO, TL, TN; + TM = Ip[0]; + TO = Im[0]; + TL = W[0]; + TN = W[1]; + TP = FMA(TL, TM, TN * TO); + T18 = FNMS(TN, TM, TL * TO); + } + { + E TB, TD, TA, TC; + TB = Ip[WS(rs, 4)]; + TD = Im[WS(rs, 4)]; + TA = W[16]; + TC = W[17]; + TE = FMA(TA, TB, TC * TD); + T15 = FNMS(TC, TB, TA * TD); + } + { + E TH, TJ, TG, TI; + TH = Rp[WS(rs, 3)]; + TJ = Rm[WS(rs, 3)]; + TG = W[10]; + TI = W[11]; + TK = FMA(TG, TH, TI * TJ); + T17 = FNMS(TI, TH, TG * TJ); + } + TF = Tz - TE; + TQ = TK - TP; + TR = TF + TQ; + T1r = T14 - T15; + T1s = T18 - T17; + T1L = T1s - T1r; + TX = Tz + TE; + TY = TK + TP; + TZ = TX + TY; + T16 = T14 + T15; + T19 = T17 + T18; + T1y = T16 + T19; + } + { + E Tc, T1b, Ts, T1f, Th, T1c, Tn, T1e; + { + E T9, Tb, T8, Ta; + T9 = Rp[WS(rs, 1)]; + Tb = Rm[WS(rs, 1)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + T1b = FNMS(Ta, T9, T8 * Tb); + } + { + E Tp, Tr, To, Tq; + Tp = Ip[WS(rs, 1)]; + Tr = Im[WS(rs, 1)]; + To = W[4]; + Tq = W[5]; + Ts = FMA(To, Tp, Tq * Tr); + T1f = FNMS(Tq, Tp, To * Tr); + } + { + E Te, Tg, Td, Tf; + Te = Ip[WS(rs, 3)]; + Tg = Im[WS(rs, 3)]; + Td = W[12]; + Tf = W[13]; + Th = FMA(Td, Te, Tf * Tg); + T1c = FNMS(Tf, Te, Td * Tg); + } + { + E Tk, Tm, Tj, Tl; + Tk = Rp[WS(rs, 4)]; + Tm = Rm[WS(rs, 4)]; + Tj = W[14]; + Tl = W[15]; + Tn = FMA(Tj, Tk, Tl * Tm); + T1e = FNMS(Tl, Tk, Tj * Tm); + } + Ti = Tc - Th; + Tt = Tn - Ts; + Tu = Ti + Tt; + T1o = T1b - T1c; + T1p = T1e - T1f; + T1M = T1o + T1p; + TU = Tc + Th; + TV = Tn + Ts; + TW = TU + TV; + T1d = T1b + T1c; + T1g = T1e + T1f; + T1x = T1d + T1g; + } + { + E T1l, TS, T1m, T1u, T1w, T1q, T1t, T1v, T1n; + T1l = KP559016994 * (Tu - TR); + TS = Tu + TR; + T1m = FNMS(KP250000000, TS, T7); + T1q = T1o - T1p; + T1t = T1r + T1s; + T1u = FMA(KP951056516, T1q, KP587785252 * T1t); + T1w = FNMS(KP587785252, T1q, KP951056516 * T1t); + Rm[WS(rs, 4)] = T7 + TS; + T1v = T1m - T1l; + Rm[WS(rs, 2)] = T1v - T1w; + Rp[WS(rs, 3)] = T1v + T1w; + T1n = T1l + T1m; + Rm[0] = T1n - T1u; + Rp[WS(rs, 1)] = T1n + T1u; + } + { + E T1S, T1N, T1T, T1R, T1V, T1P, T1Q, T1W, T1U; + T1S = KP559016994 * (T1M + T1L); + T1N = T1L - T1M; + T1T = FMA(KP250000000, T1N, T1O); + T1P = TQ - TF; + T1Q = Ti - Tt; + T1R = FNMS(KP951056516, T1Q, KP587785252 * T1P); + T1V = FMA(KP587785252, T1Q, KP951056516 * T1P); + Im[WS(rs, 4)] = T1N - T1O; + T1W = T1T - T1S; + Im[WS(rs, 2)] = T1V - T1W; + Ip[WS(rs, 3)] = T1V + T1W; + T1U = T1S + T1T; + Im[0] = T1R - T1U; + Ip[WS(rs, 1)] = T1R + T1U; + } + { + E T12, T10, T11, T1i, T1k, T1a, T1h, T1j, T13; + T12 = KP559016994 * (TW - TZ); + T10 = TW + TZ; + T11 = FNMS(KP250000000, T10, TT); + T1a = T16 - T19; + T1h = T1d - T1g; + T1i = FNMS(KP587785252, T1h, KP951056516 * T1a); + T1k = FMA(KP951056516, T1h, KP587785252 * T1a); + Rp[0] = TT + T10; + T1j = T12 + T11; + Rp[WS(rs, 4)] = T1j - T1k; + Rm[WS(rs, 3)] = T1j + T1k; + T13 = T11 - T12; + Rp[WS(rs, 2)] = T13 - T1i; + Rm[WS(rs, 1)] = T13 + T1i; + } + { + E T1H, T1z, T1G, T1F, T1J, T1D, T1E, T1K, T1I; + T1H = KP559016994 * (T1x - T1y); + T1z = T1x + T1y; + T1G = FNMS(KP250000000, T1z, T1C); + T1D = TX - TY; + T1E = TU - TV; + T1F = FNMS(KP587785252, T1E, KP951056516 * T1D); + T1J = FMA(KP951056516, T1E, KP587785252 * T1D); + Ip[0] = T1z + T1C; + T1K = T1H + T1G; + Im[WS(rs, 3)] = T1J - T1K; + Ip[WS(rs, 4)] = T1J + T1K; + T1I = T1G - T1H; + Im[WS(rs, 1)] = T1F - T1I; + Ip[WS(rs, 2)] = T1F + T1I; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cf_10", twinstr, &GENUS, {72, 30, 30, 0} }; + +void X(codelet_hc2cf_10) (planner *p) { + X(khc2c_register) (p, hc2cf_10, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_12.c new file mode 100644 index 000000000..742aec9d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_12.c @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:57 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -dit -name hc2cf_12 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 118 FP additions, 68 FP multiplications, + * (or, 72 additions, 22 multiplications, 46 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E T1, T2i, Tl, T2e, T10, T1Y, TG, T1S, Ty, T2s, T1s, T2f, T1d, T21, T1H; + E T1Z, Te, T2p, T1l, T2h, TT, T1V, T1A, T1T; + T1 = Rp[0]; + T2i = Rm[0]; + { + E Th, Tk, Ti, T2d, Tg, Tj; + Th = Rp[WS(rs, 3)]; + Tk = Rm[WS(rs, 3)]; + Tg = W[10]; + Ti = Tg * Th; + T2d = Tg * Tk; + Tj = W[11]; + Tl = FMA(Tj, Tk, Ti); + T2e = FNMS(Tj, Th, T2d); + } + { + E TW, TZ, TX, T1X, TV, TY; + TW = Ip[WS(rs, 4)]; + TZ = Im[WS(rs, 4)]; + TV = W[16]; + TX = TV * TW; + T1X = TV * TZ; + TY = W[17]; + T10 = FMA(TY, TZ, TX); + T1Y = FNMS(TY, TW, T1X); + } + { + E TC, TF, TD, T1R, TB, TE; + TC = Ip[WS(rs, 1)]; + TF = Im[WS(rs, 1)]; + TB = W[4]; + TD = TB * TC; + T1R = TB * TF; + TE = W[5]; + TG = FMA(TE, TF, TD); + T1S = FNMS(TE, TC, T1R); + } + { + E Tn, Tq, To, T1o, Tt, Tw, Tu, T1q, Tm, Ts; + Tn = Rp[WS(rs, 5)]; + Tq = Rm[WS(rs, 5)]; + Tm = W[18]; + To = Tm * Tn; + T1o = Tm * Tq; + Tt = Rp[WS(rs, 1)]; + Tw = Rm[WS(rs, 1)]; + Ts = W[2]; + Tu = Ts * Tt; + T1q = Ts * Tw; + { + E Tr, T1p, Tx, T1r, Tp, Tv; + Tp = W[19]; + Tr = FMA(Tp, Tq, To); + T1p = FNMS(Tp, Tn, T1o); + Tv = W[3]; + Tx = FMA(Tv, Tw, Tu); + T1r = FNMS(Tv, Tt, T1q); + Ty = Tr + Tx; + T2s = Tx - Tr; + T1s = T1p - T1r; + T2f = T1p + T1r; + } + } + { + E T12, T15, T13, T1D, T18, T1b, T19, T1F, T11, T17; + T12 = Ip[0]; + T15 = Im[0]; + T11 = W[0]; + T13 = T11 * T12; + T1D = T11 * T15; + T18 = Ip[WS(rs, 2)]; + T1b = Im[WS(rs, 2)]; + T17 = W[8]; + T19 = T17 * T18; + T1F = T17 * T1b; + { + E T16, T1E, T1c, T1G, T14, T1a; + T14 = W[1]; + T16 = FMA(T14, T15, T13); + T1E = FNMS(T14, T12, T1D); + T1a = W[9]; + T1c = FMA(T1a, T1b, T19); + T1G = FNMS(T1a, T18, T1F); + T1d = T16 + T1c; + T21 = T1c - T16; + T1H = T1E - T1G; + T1Z = T1E + T1G; + } + } + { + E T3, T6, T4, T1h, T9, Tc, Ta, T1j, T2, T8; + T3 = Rp[WS(rs, 2)]; + T6 = Rm[WS(rs, 2)]; + T2 = W[6]; + T4 = T2 * T3; + T1h = T2 * T6; + T9 = Rp[WS(rs, 4)]; + Tc = Rm[WS(rs, 4)]; + T8 = W[14]; + Ta = T8 * T9; + T1j = T8 * Tc; + { + E T7, T1i, Td, T1k, T5, Tb; + T5 = W[7]; + T7 = FMA(T5, T6, T4); + T1i = FNMS(T5, T3, T1h); + Tb = W[15]; + Td = FMA(Tb, Tc, Ta); + T1k = FNMS(Tb, T9, T1j); + Te = T7 + Td; + T2p = Td - T7; + T1l = T1i - T1k; + T2h = T1i + T1k; + } + } + { + E TI, TL, TJ, T1w, TO, TR, TP, T1y, TH, TN; + TI = Ip[WS(rs, 3)]; + TL = Im[WS(rs, 3)]; + TH = W[12]; + TJ = TH * TI; + T1w = TH * TL; + TO = Ip[WS(rs, 5)]; + TR = Im[WS(rs, 5)]; + TN = W[20]; + TP = TN * TO; + T1y = TN * TR; + { + E TM, T1x, TS, T1z, TK, TQ; + TK = W[13]; + TM = FMA(TK, TL, TJ); + T1x = FNMS(TK, TI, T1w); + TQ = W[21]; + TS = FMA(TQ, TR, TP); + T1z = FNMS(TQ, TO, T1y); + TT = TM + TS; + T1V = TS - TM; + T1A = T1x - T1z; + T1T = T1x + T1z; + } + } + { + E TA, T28, T2k, T2m, T1f, T2l, T2b, T2c; + { + E Tf, Tz, T2g, T2j; + Tf = T1 + Te; + Tz = Tl + Ty; + TA = Tf + Tz; + T28 = Tf - Tz; + T2g = T2e + T2f; + T2j = T2h + T2i; + T2k = T2g + T2j; + T2m = T2j - T2g; + } + { + E TU, T1e, T29, T2a; + TU = TG + TT; + T1e = T10 + T1d; + T1f = TU + T1e; + T2l = TU - T1e; + T29 = T1S + T1T; + T2a = T1Y + T1Z; + T2b = T29 - T2a; + T2c = T29 + T2a; + } + Rm[WS(rs, 5)] = TA - T1f; + Im[WS(rs, 5)] = T2c - T2k; + Rp[0] = TA + T1f; + Ip[0] = T2c + T2k; + Rp[WS(rs, 3)] = T28 - T2b; + Ip[WS(rs, 3)] = T2l + T2m; + Rm[WS(rs, 2)] = T28 + T2b; + Im[WS(rs, 2)] = T2l - T2m; + } + { + E T1m, T1K, T2q, T2z, T2t, T2y, T1t, T1L, T1B, T1N, T1W, T25, T22, T26, T1I; + E T1O; + { + E T1g, T2o, T2r, T1n; + T1g = FNMS(KP500000000, Te, T1); + T1m = FNMS(KP866025403, T1l, T1g); + T1K = FMA(KP866025403, T1l, T1g); + T2o = FNMS(KP500000000, T2h, T2i); + T2q = FMA(KP866025403, T2p, T2o); + T2z = FNMS(KP866025403, T2p, T2o); + T2r = FNMS(KP500000000, T2f, T2e); + T2t = FMA(KP866025403, T2s, T2r); + T2y = FNMS(KP866025403, T2s, T2r); + T1n = FNMS(KP500000000, Ty, Tl); + T1t = FNMS(KP866025403, T1s, T1n); + T1L = FMA(KP866025403, T1s, T1n); + } + { + E T1v, T1U, T20, T1C; + T1v = FNMS(KP500000000, TT, TG); + T1B = FNMS(KP866025403, T1A, T1v); + T1N = FMA(KP866025403, T1A, T1v); + T1U = FNMS(KP500000000, T1T, T1S); + T1W = FNMS(KP866025403, T1V, T1U); + T25 = FMA(KP866025403, T1V, T1U); + T20 = FNMS(KP500000000, T1Z, T1Y); + T22 = FNMS(KP866025403, T21, T20); + T26 = FMA(KP866025403, T21, T20); + T1C = FNMS(KP500000000, T1d, T10); + T1I = FNMS(KP866025403, T1H, T1C); + T1O = FMA(KP866025403, T1H, T1C); + } + { + E T1u, T1J, T2x, T2A; + T1u = T1m + T1t; + T1J = T1B + T1I; + Rp[WS(rs, 2)] = T1u - T1J; + Rm[WS(rs, 3)] = T1u + T1J; + T2x = T1W + T22; + T2A = T2y + T2z; + Im[WS(rs, 3)] = -(T2x + T2A); + Ip[WS(rs, 2)] = T2A - T2x; + } + { + E T1M, T1P, T2v, T2w; + T1M = T1K + T1L; + T1P = T1N + T1O; + Rm[WS(rs, 1)] = T1M - T1P; + Rp[WS(rs, 4)] = T1M + T1P; + T2v = T25 + T26; + T2w = T2t + T2q; + Im[WS(rs, 1)] = T2v - T2w; + Ip[WS(rs, 4)] = T2v + T2w; + } + { + E T1Q, T23, T2B, T2C; + T1Q = T1m - T1t; + T23 = T1W - T22; + Rm[0] = T1Q - T23; + Rp[WS(rs, 5)] = T1Q + T23; + T2B = T1I - T1B; + T2C = T2z - T2y; + Im[0] = T2B - T2C; + Ip[WS(rs, 5)] = T2B + T2C; + } + { + E T24, T27, T2n, T2u; + T24 = T1K - T1L; + T27 = T25 - T26; + Rm[WS(rs, 4)] = T24 - T27; + Rp[WS(rs, 1)] = T24 + T27; + T2n = T1O - T1N; + T2u = T2q - T2t; + Im[WS(rs, 4)] = T2n - T2u; + Ip[WS(rs, 1)] = T2n + T2u; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cf_12", twinstr, &GENUS, {72, 22, 46, 0} }; + +void X(codelet_hc2cf_12) (planner *p) { + X(khc2c_register) (p, hc2cf_12, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 12 -dit -name hc2cf_12 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 118 FP additions, 60 FP multiplications, + * (or, 88 additions, 30 multiplications, 30 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E T1, T1W, T18, T22, Tc, T15, T1V, T23, TR, T1E, T1o, T1D, T12, T1l, T1F; + E T1G, Ti, T1S, T1d, T25, Tt, T1a, T1T, T26, TA, T1y, T1j, T1B, TL, T1g; + E T1z, T1A; + { + E T6, T16, Tb, T17; + T1 = Rp[0]; + T1W = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 2)]; + T2 = W[6]; + T4 = W[7]; + T6 = FMA(T2, T3, T4 * T5); + T16 = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = Rp[WS(rs, 4)]; + Ta = Rm[WS(rs, 4)]; + T7 = W[14]; + T9 = W[15]; + Tb = FMA(T7, T8, T9 * Ta); + T17 = FNMS(T9, T8, T7 * Ta); + } + T18 = KP866025403 * (T16 - T17); + T22 = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + T15 = FNMS(KP500000000, Tc, T1); + T1V = T16 + T17; + T23 = FNMS(KP500000000, T1V, T1W); + } + { + E T11, T1n, TW, T1m; + { + E TO, TQ, TN, TP; + TO = Ip[WS(rs, 4)]; + TQ = Im[WS(rs, 4)]; + TN = W[16]; + TP = W[17]; + TR = FMA(TN, TO, TP * TQ); + T1E = FNMS(TP, TO, TN * TQ); + } + { + E TY, T10, TX, TZ; + TY = Ip[WS(rs, 2)]; + T10 = Im[WS(rs, 2)]; + TX = W[8]; + TZ = W[9]; + T11 = FMA(TX, TY, TZ * T10); + T1n = FNMS(TZ, TY, TX * T10); + } + { + E TT, TV, TS, TU; + TT = Ip[0]; + TV = Im[0]; + TS = W[0]; + TU = W[1]; + TW = FMA(TS, TT, TU * TV); + T1m = FNMS(TU, TT, TS * TV); + } + T1o = KP866025403 * (T1m - T1n); + T1D = KP866025403 * (T11 - TW); + T12 = TW + T11; + T1l = FNMS(KP500000000, T12, TR); + T1F = T1m + T1n; + T1G = FNMS(KP500000000, T1F, T1E); + } + { + E Ts, T1c, Tn, T1b; + { + E Tf, Th, Te, Tg; + Tf = Rp[WS(rs, 3)]; + Th = Rm[WS(rs, 3)]; + Te = W[10]; + Tg = W[11]; + Ti = FMA(Te, Tf, Tg * Th); + T1S = FNMS(Tg, Tf, Te * Th); + } + { + E Tp, Tr, To, Tq; + Tp = Rp[WS(rs, 1)]; + Tr = Rm[WS(rs, 1)]; + To = W[2]; + Tq = W[3]; + Ts = FMA(To, Tp, Tq * Tr); + T1c = FNMS(Tq, Tp, To * Tr); + } + { + E Tk, Tm, Tj, Tl; + Tk = Rp[WS(rs, 5)]; + Tm = Rm[WS(rs, 5)]; + Tj = W[18]; + Tl = W[19]; + Tn = FMA(Tj, Tk, Tl * Tm); + T1b = FNMS(Tl, Tk, Tj * Tm); + } + T1d = KP866025403 * (T1b - T1c); + T25 = KP866025403 * (Ts - Tn); + Tt = Tn + Ts; + T1a = FNMS(KP500000000, Tt, Ti); + T1T = T1b + T1c; + T26 = FNMS(KP500000000, T1T, T1S); + } + { + E TK, T1i, TF, T1h; + { + E Tx, Tz, Tw, Ty; + Tx = Ip[WS(rs, 1)]; + Tz = Im[WS(rs, 1)]; + Tw = W[4]; + Ty = W[5]; + TA = FMA(Tw, Tx, Ty * Tz); + T1y = FNMS(Ty, Tx, Tw * Tz); + } + { + E TH, TJ, TG, TI; + TH = Ip[WS(rs, 5)]; + TJ = Im[WS(rs, 5)]; + TG = W[20]; + TI = W[21]; + TK = FMA(TG, TH, TI * TJ); + T1i = FNMS(TI, TH, TG * TJ); + } + { + E TC, TE, TB, TD; + TC = Ip[WS(rs, 3)]; + TE = Im[WS(rs, 3)]; + TB = W[12]; + TD = W[13]; + TF = FMA(TB, TC, TD * TE); + T1h = FNMS(TD, TC, TB * TE); + } + T1j = KP866025403 * (T1h - T1i); + T1B = KP866025403 * (TK - TF); + TL = TF + TK; + T1g = FNMS(KP500000000, TL, TA); + T1z = T1h + T1i; + T1A = FNMS(KP500000000, T1z, T1y); + } + { + E Tv, T1N, T1Y, T20, T14, T1Z, T1Q, T1R; + { + E Td, Tu, T1U, T1X; + Td = T1 + Tc; + Tu = Ti + Tt; + Tv = Td + Tu; + T1N = Td - Tu; + T1U = T1S + T1T; + T1X = T1V + T1W; + T1Y = T1U + T1X; + T20 = T1X - T1U; + } + { + E TM, T13, T1O, T1P; + TM = TA + TL; + T13 = TR + T12; + T14 = TM + T13; + T1Z = TM - T13; + T1O = T1y + T1z; + T1P = T1E + T1F; + T1Q = T1O - T1P; + T1R = T1O + T1P; + } + Rm[WS(rs, 5)] = Tv - T14; + Im[WS(rs, 5)] = T1R - T1Y; + Rp[0] = Tv + T14; + Ip[0] = T1R + T1Y; + Rp[WS(rs, 3)] = T1N - T1Q; + Ip[WS(rs, 3)] = T1Z + T20; + Rm[WS(rs, 2)] = T1N + T1Q; + Im[WS(rs, 2)] = T1Z - T20; + } + { + E T1t, T1J, T28, T2a, T1w, T21, T1M, T29; + { + E T1r, T1s, T24, T27; + T1r = T15 + T18; + T1s = T1a + T1d; + T1t = T1r + T1s; + T1J = T1r - T1s; + T24 = T22 + T23; + T27 = T25 + T26; + T28 = T24 - T27; + T2a = T27 + T24; + } + { + E T1u, T1v, T1K, T1L; + T1u = T1g + T1j; + T1v = T1l + T1o; + T1w = T1u + T1v; + T21 = T1v - T1u; + T1K = T1B + T1A; + T1L = T1D + T1G; + T1M = T1K - T1L; + T29 = T1K + T1L; + } + Rm[WS(rs, 1)] = T1t - T1w; + Im[WS(rs, 1)] = T29 - T2a; + Rp[WS(rs, 4)] = T1t + T1w; + Ip[WS(rs, 4)] = T29 + T2a; + Rm[WS(rs, 4)] = T1J - T1M; + Im[WS(rs, 4)] = T21 - T28; + Rp[WS(rs, 1)] = T1J + T1M; + Ip[WS(rs, 1)] = T21 + T28; + } + { + E T1f, T1x, T2e, T2g, T1q, T2f, T1I, T2b; + { + E T19, T1e, T2c, T2d; + T19 = T15 - T18; + T1e = T1a - T1d; + T1f = T19 + T1e; + T1x = T19 - T1e; + T2c = T26 - T25; + T2d = T23 - T22; + T2e = T2c + T2d; + T2g = T2d - T2c; + } + { + E T1k, T1p, T1C, T1H; + T1k = T1g - T1j; + T1p = T1l - T1o; + T1q = T1k + T1p; + T2f = T1p - T1k; + T1C = T1A - T1B; + T1H = T1D - T1G; + T1I = T1C + T1H; + T2b = T1H - T1C; + } + Rp[WS(rs, 2)] = T1f - T1q; + Ip[WS(rs, 2)] = T2b + T2e; + Rm[WS(rs, 3)] = T1f + T1q; + Im[WS(rs, 3)] = T2b - T2e; + Rm[0] = T1x - T1I; + Im[0] = T2f - T2g; + Rp[WS(rs, 5)] = T1x + T1I; + Ip[WS(rs, 5)] = T2f + T2g; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cf_12", twinstr, &GENUS, {88, 30, 30, 0} }; + +void X(codelet_hc2cf_12) (planner *p) { + X(khc2c_register) (p, hc2cf_12, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_16.c new file mode 100644 index 000000000..7baacca30 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_16.c @@ -0,0 +1,796 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:57 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -dit -name hc2cf_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 104 additions, 30 multiplications, 70 fused multiply/add), + * 60 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E T8, T3z, T1I, T3o, T1s, T35, T2p, T2r, T1F, T36, T2k, T2w, Tl, T3A, T1N; + E T3k, Tz, T2V, T1T, T1U, T11, T30, T29, T2c, T1e, T31, T2a, T2h, TM, T2W; + E T1W, T21; + { + E T1, T3n, T3, T6, T4, T3l, T2, T7, T3m, T5; + T1 = Rp[0]; + T3n = Rm[0]; + T3 = Rp[WS(rs, 4)]; + T6 = Rm[WS(rs, 4)]; + T2 = W[14]; + T4 = T2 * T3; + T3l = T2 * T6; + T5 = W[15]; + T7 = FMA(T5, T6, T4); + T3m = FNMS(T5, T3, T3l); + T8 = T1 + T7; + T3z = T3n - T3m; + T1I = T1 - T7; + T3o = T3m + T3n; + } + { + E T1h, T1k, T1i, T2l, T1n, T1q, T1o, T2n, T1g, T1m; + T1h = Ip[WS(rs, 7)]; + T1k = Im[WS(rs, 7)]; + T1g = W[28]; + T1i = T1g * T1h; + T2l = T1g * T1k; + T1n = Ip[WS(rs, 3)]; + T1q = Im[WS(rs, 3)]; + T1m = W[12]; + T1o = T1m * T1n; + T2n = T1m * T1q; + { + E T1l, T2m, T1r, T2o, T1j, T1p; + T1j = W[29]; + T1l = FMA(T1j, T1k, T1i); + T2m = FNMS(T1j, T1h, T2l); + T1p = W[13]; + T1r = FMA(T1p, T1q, T1o); + T2o = FNMS(T1p, T1n, T2n); + T1s = T1l + T1r; + T35 = T2m + T2o; + T2p = T2m - T2o; + T2r = T1l - T1r; + } + } + { + E T1u, T1x, T1v, T2s, T1A, T1D, T1B, T2u, T1t, T1z; + T1u = Ip[WS(rs, 1)]; + T1x = Im[WS(rs, 1)]; + T1t = W[4]; + T1v = T1t * T1u; + T2s = T1t * T1x; + T1A = Ip[WS(rs, 5)]; + T1D = Im[WS(rs, 5)]; + T1z = W[20]; + T1B = T1z * T1A; + T2u = T1z * T1D; + { + E T1y, T2t, T1E, T2v, T1w, T1C; + T1w = W[5]; + T1y = FMA(T1w, T1x, T1v); + T2t = FNMS(T1w, T1u, T2s); + T1C = W[21]; + T1E = FMA(T1C, T1D, T1B); + T2v = FNMS(T1C, T1A, T2u); + T1F = T1y + T1E; + T36 = T2t + T2v; + T2k = T1E - T1y; + T2w = T2t - T2v; + } + } + { + E Ta, Td, Tb, T1J, Tg, Tj, Th, T1L, T9, Tf; + Ta = Rp[WS(rs, 2)]; + Td = Rm[WS(rs, 2)]; + T9 = W[6]; + Tb = T9 * Ta; + T1J = T9 * Td; + Tg = Rp[WS(rs, 6)]; + Tj = Rm[WS(rs, 6)]; + Tf = W[22]; + Th = Tf * Tg; + T1L = Tf * Tj; + { + E Te, T1K, Tk, T1M, Tc, Ti; + Tc = W[7]; + Te = FMA(Tc, Td, Tb); + T1K = FNMS(Tc, Ta, T1J); + Ti = W[23]; + Tk = FMA(Ti, Tj, Th); + T1M = FNMS(Ti, Tg, T1L); + Tl = Te + Tk; + T3A = Te - Tk; + T1N = T1K - T1M; + T3k = T1K + T1M; + } + } + { + E To, Tr, Tp, T1P, Tu, Tx, Tv, T1R, Tn, Tt; + To = Rp[WS(rs, 1)]; + Tr = Rm[WS(rs, 1)]; + Tn = W[2]; + Tp = Tn * To; + T1P = Tn * Tr; + Tu = Rp[WS(rs, 5)]; + Tx = Rm[WS(rs, 5)]; + Tt = W[18]; + Tv = Tt * Tu; + T1R = Tt * Tx; + { + E Ts, T1Q, Ty, T1S, Tq, Tw; + Tq = W[3]; + Ts = FMA(Tq, Tr, Tp); + T1Q = FNMS(Tq, To, T1P); + Tw = W[19]; + Ty = FMA(Tw, Tx, Tv); + T1S = FNMS(Tw, Tu, T1R); + Tz = Ts + Ty; + T2V = T1Q + T1S; + T1T = T1Q - T1S; + T1U = Ts - Ty; + } + } + { + E TQ, TT, TR, T25, TW, TZ, TX, T27, TP, TV; + TQ = Ip[0]; + TT = Im[0]; + TP = W[0]; + TR = TP * TQ; + T25 = TP * TT; + TW = Ip[WS(rs, 4)]; + TZ = Im[WS(rs, 4)]; + TV = W[16]; + TX = TV * TW; + T27 = TV * TZ; + { + E TU, T26, T10, T28, TS, TY; + TS = W[1]; + TU = FMA(TS, TT, TR); + T26 = FNMS(TS, TQ, T25); + TY = W[17]; + T10 = FMA(TY, TZ, TX); + T28 = FNMS(TY, TW, T27); + T11 = TU + T10; + T30 = T26 + T28; + T29 = T26 - T28; + T2c = TU - T10; + } + } + { + E T13, T16, T14, T2d, T19, T1c, T1a, T2f, T12, T18; + T13 = Ip[WS(rs, 2)]; + T16 = Im[WS(rs, 2)]; + T12 = W[8]; + T14 = T12 * T13; + T2d = T12 * T16; + T19 = Ip[WS(rs, 6)]; + T1c = Im[WS(rs, 6)]; + T18 = W[24]; + T1a = T18 * T19; + T2f = T18 * T1c; + { + E T17, T2e, T1d, T2g, T15, T1b; + T15 = W[9]; + T17 = FMA(T15, T16, T14); + T2e = FNMS(T15, T13, T2d); + T1b = W[25]; + T1d = FMA(T1b, T1c, T1a); + T2g = FNMS(T1b, T19, T2f); + T1e = T17 + T1d; + T31 = T2e + T2g; + T2a = T17 - T1d; + T2h = T2e - T2g; + } + } + { + E TB, TE, TC, T1X, TH, TK, TI, T1Z, TA, TG; + TB = Rp[WS(rs, 7)]; + TE = Rm[WS(rs, 7)]; + TA = W[26]; + TC = TA * TB; + T1X = TA * TE; + TH = Rp[WS(rs, 3)]; + TK = Rm[WS(rs, 3)]; + TG = W[10]; + TI = TG * TH; + T1Z = TG * TK; + { + E TF, T1Y, TL, T20, TD, TJ; + TD = W[27]; + TF = FMA(TD, TE, TC); + T1Y = FNMS(TD, TB, T1X); + TJ = W[11]; + TL = FMA(TJ, TK, TI); + T20 = FNMS(TJ, TH, T1Z); + TM = TF + TL; + T2W = T1Y + T20; + T1W = TF - TL; + T21 = T1Y - T20; + } + } + { + E TO, T3e, T3q, T3s, T1H, T3r, T3h, T3i; + { + E Tm, TN, T3j, T3p; + Tm = T8 + Tl; + TN = Tz + TM; + TO = Tm + TN; + T3e = Tm - TN; + T3j = T2V + T2W; + T3p = T3k + T3o; + T3q = T3j + T3p; + T3s = T3p - T3j; + } + { + E T1f, T1G, T3f, T3g; + T1f = T11 + T1e; + T1G = T1s + T1F; + T1H = T1f + T1G; + T3r = T1G - T1f; + T3f = T30 + T31; + T3g = T35 + T36; + T3h = T3f - T3g; + T3i = T3f + T3g; + } + Rm[WS(rs, 7)] = TO - T1H; + Im[WS(rs, 7)] = T3i - T3q; + Rp[0] = TO + T1H; + Ip[0] = T3i + T3q; + Rm[WS(rs, 3)] = T3e - T3h; + Im[WS(rs, 3)] = T3r - T3s; + Rp[WS(rs, 4)] = T3e + T3h; + Ip[WS(rs, 4)] = T3r + T3s; + } + { + E T2Y, T3a, T3v, T3x, T33, T3b, T38, T3c; + { + E T2U, T2X, T3t, T3u; + T2U = T8 - Tl; + T2X = T2V - T2W; + T2Y = T2U + T2X; + T3a = T2U - T2X; + T3t = TM - Tz; + T3u = T3o - T3k; + T3v = T3t + T3u; + T3x = T3u - T3t; + } + { + E T2Z, T32, T34, T37; + T2Z = T11 - T1e; + T32 = T30 - T31; + T33 = T2Z + T32; + T3b = T32 - T2Z; + T34 = T1s - T1F; + T37 = T35 - T36; + T38 = T34 - T37; + T3c = T34 + T37; + } + { + E T39, T3w, T3d, T3y; + T39 = T33 + T38; + Rm[WS(rs, 5)] = FNMS(KP707106781, T39, T2Y); + Rp[WS(rs, 2)] = FMA(KP707106781, T39, T2Y); + T3w = T3b + T3c; + Im[WS(rs, 5)] = FMS(KP707106781, T3w, T3v); + Ip[WS(rs, 2)] = FMA(KP707106781, T3w, T3v); + T3d = T3b - T3c; + Rm[WS(rs, 1)] = FNMS(KP707106781, T3d, T3a); + Rp[WS(rs, 6)] = FMA(KP707106781, T3d, T3a); + T3y = T38 - T33; + Im[WS(rs, 1)] = FMS(KP707106781, T3y, T3x); + Ip[WS(rs, 6)] = FMA(KP707106781, T3y, T3x); + } + } + { + E T1O, T3B, T3H, T2E, T23, T3C, T2O, T2S, T2H, T3I, T2j, T2B, T2L, T2R, T2y; + E T2C; + { + E T1V, T22, T2b, T2i; + T1O = T1I - T1N; + T3B = T3z - T3A; + T3H = T3A + T3z; + T2E = T1I + T1N; + T1V = T1T - T1U; + T22 = T1W + T21; + T23 = T1V - T22; + T3C = T1V + T22; + { + E T2M, T2N, T2F, T2G; + T2M = T2r + T2w; + T2N = T2p + T2k; + T2O = FNMS(KP414213562, T2N, T2M); + T2S = FMA(KP414213562, T2M, T2N); + T2F = T1U + T1T; + T2G = T1W - T21; + T2H = T2F + T2G; + T3I = T2G - T2F; + } + T2b = T29 + T2a; + T2i = T2c - T2h; + T2j = FMA(KP414213562, T2i, T2b); + T2B = FNMS(KP414213562, T2b, T2i); + { + E T2J, T2K, T2q, T2x; + T2J = T2c + T2h; + T2K = T29 - T2a; + T2L = FMA(KP414213562, T2K, T2J); + T2R = FNMS(KP414213562, T2J, T2K); + T2q = T2k - T2p; + T2x = T2r - T2w; + T2y = FMA(KP414213562, T2x, T2q); + T2C = FNMS(KP414213562, T2q, T2x); + } + } + { + E T24, T2z, T3J, T3K; + T24 = FMA(KP707106781, T23, T1O); + T2z = T2j + T2y; + Rm[WS(rs, 4)] = FNMS(KP923879532, T2z, T24); + Rp[WS(rs, 3)] = FMA(KP923879532, T2z, T24); + T3J = FMA(KP707106781, T3I, T3H); + T3K = T2C - T2B; + Im[WS(rs, 4)] = FMS(KP923879532, T3K, T3J); + Ip[WS(rs, 3)] = FMA(KP923879532, T3K, T3J); + } + { + E T2A, T2D, T3L, T3M; + T2A = FNMS(KP707106781, T23, T1O); + T2D = T2B + T2C; + Rp[WS(rs, 7)] = FNMS(KP923879532, T2D, T2A); + Rm[0] = FMA(KP923879532, T2D, T2A); + T3L = FNMS(KP707106781, T3I, T3H); + T3M = T2y - T2j; + Im[0] = FMS(KP923879532, T3M, T3L); + Ip[WS(rs, 7)] = FMA(KP923879532, T3M, T3L); + } + { + E T2I, T2P, T3D, T3E; + T2I = FMA(KP707106781, T2H, T2E); + T2P = T2L + T2O; + Rm[WS(rs, 6)] = FNMS(KP923879532, T2P, T2I); + Rp[WS(rs, 1)] = FMA(KP923879532, T2P, T2I); + T3D = FMA(KP707106781, T3C, T3B); + T3E = T2R + T2S; + Im[WS(rs, 6)] = FMS(KP923879532, T3E, T3D); + Ip[WS(rs, 1)] = FMA(KP923879532, T3E, T3D); + } + { + E T2Q, T2T, T3F, T3G; + T2Q = FNMS(KP707106781, T2H, T2E); + T2T = T2R - T2S; + Rm[WS(rs, 2)] = FNMS(KP923879532, T2T, T2Q); + Rp[WS(rs, 5)] = FMA(KP923879532, T2T, T2Q); + T3F = FNMS(KP707106781, T3C, T3B); + T3G = T2O - T2L; + Im[WS(rs, 2)] = FMS(KP923879532, T3G, T3F); + Ip[WS(rs, 5)] = FMA(KP923879532, T3G, T3F); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cf_16", twinstr, &GENUS, {104, 30, 70, 0} }; + +void X(codelet_hc2cf_16) (planner *p) { + X(khc2c_register) (p, hc2cf_16, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 16 -dit -name hc2cf_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 136 additions, 46 multiplications, 38 fused multiply/add), + * 52 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E T7, T37, T1t, T2U, Ti, T38, T1w, T2R, Tu, T2s, T1C, T2c, TF, T2t, T1H; + E T2d, T1f, T1q, T2B, T2C, T2D, T2E, T1Z, T2j, T24, T2k, TS, T13, T2w, T2x; + E T2y, T2z, T1O, T2g, T1T, T2h; + { + E T1, T2T, T6, T2S; + T1 = Rp[0]; + T2T = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Rp[WS(rs, 4)]; + T5 = Rm[WS(rs, 4)]; + T2 = W[14]; + T4 = W[15]; + T6 = FMA(T2, T3, T4 * T5); + T2S = FNMS(T4, T3, T2 * T5); + } + T7 = T1 + T6; + T37 = T2T - T2S; + T1t = T1 - T6; + T2U = T2S + T2T; + } + { + E Tc, T1u, Th, T1v; + { + E T9, Tb, T8, Ta; + T9 = Rp[WS(rs, 2)]; + Tb = Rm[WS(rs, 2)]; + T8 = W[6]; + Ta = W[7]; + Tc = FMA(T8, T9, Ta * Tb); + T1u = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = Rp[WS(rs, 6)]; + Tg = Rm[WS(rs, 6)]; + Td = W[22]; + Tf = W[23]; + Th = FMA(Td, Te, Tf * Tg); + T1v = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc + Th; + T38 = Tc - Th; + T1w = T1u - T1v; + T2R = T1u + T1v; + } + { + E To, T1y, Tt, T1z, T1A, T1B; + { + E Tl, Tn, Tk, Tm; + Tl = Rp[WS(rs, 1)]; + Tn = Rm[WS(rs, 1)]; + Tk = W[2]; + Tm = W[3]; + To = FMA(Tk, Tl, Tm * Tn); + T1y = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = Rp[WS(rs, 5)]; + Ts = Rm[WS(rs, 5)]; + Tp = W[18]; + Tr = W[19]; + Tt = FMA(Tp, Tq, Tr * Ts); + T1z = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T2s = T1y + T1z; + T1A = T1y - T1z; + T1B = To - Tt; + T1C = T1A - T1B; + T2c = T1B + T1A; + } + { + E Tz, T1E, TE, T1F, T1D, T1G; + { + E Tw, Ty, Tv, Tx; + Tw = Rp[WS(rs, 7)]; + Ty = Rm[WS(rs, 7)]; + Tv = W[26]; + Tx = W[27]; + Tz = FMA(Tv, Tw, Tx * Ty); + T1E = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = Rp[WS(rs, 3)]; + TD = Rm[WS(rs, 3)]; + TA = W[10]; + TC = W[11]; + TE = FMA(TA, TB, TC * TD); + T1F = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T2t = T1E + T1F; + T1D = Tz - TE; + T1G = T1E - T1F; + T1H = T1D + T1G; + T2d = T1D - T1G; + } + { + E T19, T20, T1p, T1X, T1e, T21, T1k, T1W; + { + E T16, T18, T15, T17; + T16 = Ip[WS(rs, 7)]; + T18 = Im[WS(rs, 7)]; + T15 = W[28]; + T17 = W[29]; + T19 = FMA(T15, T16, T17 * T18); + T20 = FNMS(T17, T16, T15 * T18); + } + { + E T1m, T1o, T1l, T1n; + T1m = Ip[WS(rs, 5)]; + T1o = Im[WS(rs, 5)]; + T1l = W[20]; + T1n = W[21]; + T1p = FMA(T1l, T1m, T1n * T1o); + T1X = FNMS(T1n, T1m, T1l * T1o); + } + { + E T1b, T1d, T1a, T1c; + T1b = Ip[WS(rs, 3)]; + T1d = Im[WS(rs, 3)]; + T1a = W[12]; + T1c = W[13]; + T1e = FMA(T1a, T1b, T1c * T1d); + T21 = FNMS(T1c, T1b, T1a * T1d); + } + { + E T1h, T1j, T1g, T1i; + T1h = Ip[WS(rs, 1)]; + T1j = Im[WS(rs, 1)]; + T1g = W[4]; + T1i = W[5]; + T1k = FMA(T1g, T1h, T1i * T1j); + T1W = FNMS(T1i, T1h, T1g * T1j); + } + T1f = T19 + T1e; + T1q = T1k + T1p; + T2B = T1f - T1q; + T2C = T20 + T21; + T2D = T1W + T1X; + T2E = T2C - T2D; + { + E T1V, T1Y, T22, T23; + T1V = T19 - T1e; + T1Y = T1W - T1X; + T1Z = T1V - T1Y; + T2j = T1V + T1Y; + T22 = T20 - T21; + T23 = T1k - T1p; + T24 = T22 + T23; + T2k = T22 - T23; + } + } + { + E TM, T1K, T12, T1R, TR, T1L, TX, T1Q; + { + E TJ, TL, TI, TK; + TJ = Ip[0]; + TL = Im[0]; + TI = W[0]; + TK = W[1]; + TM = FMA(TI, TJ, TK * TL); + T1K = FNMS(TK, TJ, TI * TL); + } + { + E TZ, T11, TY, T10; + TZ = Ip[WS(rs, 6)]; + T11 = Im[WS(rs, 6)]; + TY = W[24]; + T10 = W[25]; + T12 = FMA(TY, TZ, T10 * T11); + T1R = FNMS(T10, TZ, TY * T11); + } + { + E TO, TQ, TN, TP; + TO = Ip[WS(rs, 4)]; + TQ = Im[WS(rs, 4)]; + TN = W[16]; + TP = W[17]; + TR = FMA(TN, TO, TP * TQ); + T1L = FNMS(TP, TO, TN * TQ); + } + { + E TU, TW, TT, TV; + TU = Ip[WS(rs, 2)]; + TW = Im[WS(rs, 2)]; + TT = W[8]; + TV = W[9]; + TX = FMA(TT, TU, TV * TW); + T1Q = FNMS(TV, TU, TT * TW); + } + TS = TM + TR; + T13 = TX + T12; + T2w = TS - T13; + T2x = T1K + T1L; + T2y = T1Q + T1R; + T2z = T2x - T2y; + { + E T1M, T1N, T1P, T1S; + T1M = T1K - T1L; + T1N = TX - T12; + T1O = T1M + T1N; + T2g = T1M - T1N; + T1P = TM - TR; + T1S = T1Q - T1R; + T1T = T1P - T1S; + T2h = T1P + T1S; + } + } + { + E T1J, T27, T3g, T3i, T26, T3h, T2a, T3d; + { + E T1x, T1I, T3e, T3f; + T1x = T1t - T1w; + T1I = KP707106781 * (T1C - T1H); + T1J = T1x + T1I; + T27 = T1x - T1I; + T3e = KP707106781 * (T2d - T2c); + T3f = T38 + T37; + T3g = T3e + T3f; + T3i = T3f - T3e; + } + { + E T1U, T25, T28, T29; + T1U = FMA(KP923879532, T1O, KP382683432 * T1T); + T25 = FNMS(KP923879532, T24, KP382683432 * T1Z); + T26 = T1U + T25; + T3h = T25 - T1U; + T28 = FNMS(KP923879532, T1T, KP382683432 * T1O); + T29 = FMA(KP382683432, T24, KP923879532 * T1Z); + T2a = T28 - T29; + T3d = T28 + T29; + } + Rm[WS(rs, 4)] = T1J - T26; + Im[WS(rs, 4)] = T3d - T3g; + Rp[WS(rs, 3)] = T1J + T26; + Ip[WS(rs, 3)] = T3d + T3g; + Rm[0] = T27 - T2a; + Im[0] = T3h - T3i; + Rp[WS(rs, 7)] = T27 + T2a; + Ip[WS(rs, 7)] = T3h + T3i; + } + { + E T2v, T2H, T32, T34, T2G, T33, T2K, T2Z; + { + E T2r, T2u, T30, T31; + T2r = T7 - Ti; + T2u = T2s - T2t; + T2v = T2r + T2u; + T2H = T2r - T2u; + T30 = TF - Tu; + T31 = T2U - T2R; + T32 = T30 + T31; + T34 = T31 - T30; + } + { + E T2A, T2F, T2I, T2J; + T2A = T2w + T2z; + T2F = T2B - T2E; + T2G = KP707106781 * (T2A + T2F); + T33 = KP707106781 * (T2F - T2A); + T2I = T2z - T2w; + T2J = T2B + T2E; + T2K = KP707106781 * (T2I - T2J); + T2Z = KP707106781 * (T2I + T2J); + } + Rm[WS(rs, 5)] = T2v - T2G; + Im[WS(rs, 5)] = T2Z - T32; + Rp[WS(rs, 2)] = T2v + T2G; + Ip[WS(rs, 2)] = T2Z + T32; + Rm[WS(rs, 1)] = T2H - T2K; + Im[WS(rs, 1)] = T33 - T34; + Rp[WS(rs, 6)] = T2H + T2K; + Ip[WS(rs, 6)] = T33 + T34; + } + { + E T2f, T2n, T3a, T3c, T2m, T3b, T2q, T35; + { + E T2b, T2e, T36, T39; + T2b = T1t + T1w; + T2e = KP707106781 * (T2c + T2d); + T2f = T2b + T2e; + T2n = T2b - T2e; + T36 = KP707106781 * (T1C + T1H); + T39 = T37 - T38; + T3a = T36 + T39; + T3c = T39 - T36; + } + { + E T2i, T2l, T2o, T2p; + T2i = FMA(KP382683432, T2g, KP923879532 * T2h); + T2l = FNMS(KP382683432, T2k, KP923879532 * T2j); + T2m = T2i + T2l; + T3b = T2l - T2i; + T2o = FNMS(KP382683432, T2h, KP923879532 * T2g); + T2p = FMA(KP923879532, T2k, KP382683432 * T2j); + T2q = T2o - T2p; + T35 = T2o + T2p; + } + Rm[WS(rs, 6)] = T2f - T2m; + Im[WS(rs, 6)] = T35 - T3a; + Rp[WS(rs, 1)] = T2f + T2m; + Ip[WS(rs, 1)] = T35 + T3a; + Rm[WS(rs, 2)] = T2n - T2q; + Im[WS(rs, 2)] = T3b - T3c; + Rp[WS(rs, 5)] = T2n + T2q; + Ip[WS(rs, 5)] = T3b + T3c; + } + { + E TH, T2L, T2W, T2Y, T1s, T2X, T2O, T2P; + { + E Tj, TG, T2Q, T2V; + Tj = T7 + Ti; + TG = Tu + TF; + TH = Tj + TG; + T2L = Tj - TG; + T2Q = T2s + T2t; + T2V = T2R + T2U; + T2W = T2Q + T2V; + T2Y = T2V - T2Q; + } + { + E T14, T1r, T2M, T2N; + T14 = TS + T13; + T1r = T1f + T1q; + T1s = T14 + T1r; + T2X = T1r - T14; + T2M = T2x + T2y; + T2N = T2C + T2D; + T2O = T2M - T2N; + T2P = T2M + T2N; + } + Rm[WS(rs, 7)] = TH - T1s; + Im[WS(rs, 7)] = T2P - T2W; + Rp[0] = TH + T1s; + Ip[0] = T2P + T2W; + Rm[WS(rs, 3)] = T2L - T2O; + Im[WS(rs, 3)] = T2X - T2Y; + Rp[WS(rs, 4)] = T2L + T2O; + Ip[WS(rs, 4)] = T2X + T2Y; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cf_16", twinstr, &GENUS, {136, 46, 38, 0} }; + +void X(codelet_hc2cf_16) (planner *p) { + X(khc2c_register) (p, hc2cf_16, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_2.c new file mode 100644 index 000000000..888bb53d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_2.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:55 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -dit -name hc2cf_2 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, Ta, T3, T6, T4, T8, T2, T7, T9, T5; + T1 = Rp[0]; + Ta = Rm[0]; + T3 = Ip[0]; + T6 = Im[0]; + T2 = W[0]; + T4 = T2 * T3; + T8 = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + T9 = FNMS(T5, T3, T8); + Rm[0] = T1 - T7; + Im[0] = T9 - Ta; + Rp[0] = T1 + T7; + Ip[0] = T9 + Ta; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cf_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hc2cf_2) (planner *p) { + X(khc2c_register) (p, hc2cf_2, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 2 -dit -name hc2cf_2 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, T8, T6, T7; + T1 = Rp[0]; + T8 = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Ip[0]; + T5 = Im[0]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + T7 = FNMS(T4, T3, T2 * T5); + } + Rm[0] = T1 - T6; + Im[0] = T7 - T8; + Rp[0] = T1 + T6; + Ip[0] = T7 + T8; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cf_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hc2cf_2) (planner *p) { + X(khc2c_register) (p, hc2cf_2, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_20.c new file mode 100644 index 000000000..6778a820b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_20.c @@ -0,0 +1,1050 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:08 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -dit -name hc2cf_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 246 FP additions, 148 FP multiplications, + * (or, 136 additions, 38 multiplications, 110 fused multiply/add), + * 61 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T8, T4N, T2i, T4r, Tl, T4O, T2n, T4n, TN, T2b, T3T, T4f, T2v, T3v, T3p; + E T3F, T27, T2f, T43, T4b, T2R, T3z, T33, T3J, T1G, T2e, T40, T4c, T2K, T3y; + E T3a, T3I, T1e, T2c, T3W, T4e, T2C, T3w, T3i, T3G; + { + E T1, T4q, T3, T6, T4, T4o, T2, T7, T4p, T5; + T1 = Rp[0]; + T4q = Rm[0]; + T3 = Rp[WS(rs, 5)]; + T6 = Rm[WS(rs, 5)]; + T2 = W[18]; + T4 = T2 * T3; + T4o = T2 * T6; + T5 = W[19]; + T7 = FMA(T5, T6, T4); + T4p = FNMS(T5, T3, T4o); + T8 = T1 + T7; + T4N = T4q - T4p; + T2i = T1 - T7; + T4r = T4p + T4q; + } + { + E Ta, Td, Tb, T2j, Tg, Tj, Th, T2l, T9, Tf; + Ta = Ip[WS(rs, 2)]; + Td = Im[WS(rs, 2)]; + T9 = W[8]; + Tb = T9 * Ta; + T2j = T9 * Td; + Tg = Ip[WS(rs, 7)]; + Tj = Im[WS(rs, 7)]; + Tf = W[28]; + Th = Tf * Tg; + T2l = Tf * Tj; + { + E Te, T2k, Tk, T2m, Tc, Ti; + Tc = W[9]; + Te = FMA(Tc, Td, Tb); + T2k = FNMS(Tc, Ta, T2j); + Ti = W[29]; + Tk = FMA(Ti, Tj, Th); + T2m = FNMS(Ti, Tg, T2l); + Tl = Te + Tk; + T4O = Te - Tk; + T2n = T2k - T2m; + T4n = T2k + T2m; + } + } + { + E Ts, T3l, TL, T2t, Ty, T3n, TF, T2r; + { + E To, Tr, Tp, T3k, Tn, Tq; + To = Rp[WS(rs, 2)]; + Tr = Rm[WS(rs, 2)]; + Tn = W[6]; + Tp = Tn * To; + T3k = Tn * Tr; + Tq = W[7]; + Ts = FMA(Tq, Tr, Tp); + T3l = FNMS(Tq, To, T3k); + } + { + E TH, TK, TI, T2s, TG, TJ; + TH = Ip[WS(rs, 9)]; + TK = Im[WS(rs, 9)]; + TG = W[36]; + TI = TG * TH; + T2s = TG * TK; + TJ = W[37]; + TL = FMA(TJ, TK, TI); + T2t = FNMS(TJ, TH, T2s); + } + { + E Tu, Tx, Tv, T3m, Tt, Tw; + Tu = Rp[WS(rs, 7)]; + Tx = Rm[WS(rs, 7)]; + Tt = W[26]; + Tv = Tt * Tu; + T3m = Tt * Tx; + Tw = W[27]; + Ty = FMA(Tw, Tx, Tv); + T3n = FNMS(Tw, Tu, T3m); + } + { + E TB, TE, TC, T2q, TA, TD; + TB = Ip[WS(rs, 4)]; + TE = Im[WS(rs, 4)]; + TA = W[16]; + TC = TA * TB; + T2q = TA * TE; + TD = W[17]; + TF = FMA(TD, TE, TC); + T2r = FNMS(TD, TB, T2q); + } + { + E Tz, TM, T3R, T3S; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz - TM; + T2b = Tz + TM; + T3R = T3l + T3n; + T3S = T2r + T2t; + T3T = T3R + T3S; + T4f = T3S - T3R; + } + { + E T2p, T2u, T3j, T3o; + T2p = Ts - Ty; + T2u = T2r - T2t; + T2v = T2p - T2u; + T3v = T2p + T2u; + T3j = TL - TF; + T3o = T3l - T3n; + T3p = T3j - T3o; + T3F = T3o + T3j; + } + } + { + E T1M, T2Z, T25, T2P, T1S, T31, T1Z, T2N; + { + E T1I, T1L, T1J, T2Y, T1H, T1K; + T1I = Rp[WS(rs, 6)]; + T1L = Rm[WS(rs, 6)]; + T1H = W[22]; + T1J = T1H * T1I; + T2Y = T1H * T1L; + T1K = W[23]; + T1M = FMA(T1K, T1L, T1J); + T2Z = FNMS(T1K, T1I, T2Y); + } + { + E T21, T24, T22, T2O, T20, T23; + T21 = Ip[WS(rs, 3)]; + T24 = Im[WS(rs, 3)]; + T20 = W[12]; + T22 = T20 * T21; + T2O = T20 * T24; + T23 = W[13]; + T25 = FMA(T23, T24, T22); + T2P = FNMS(T23, T21, T2O); + } + { + E T1O, T1R, T1P, T30, T1N, T1Q; + T1O = Rp[WS(rs, 1)]; + T1R = Rm[WS(rs, 1)]; + T1N = W[2]; + T1P = T1N * T1O; + T30 = T1N * T1R; + T1Q = W[3]; + T1S = FMA(T1Q, T1R, T1P); + T31 = FNMS(T1Q, T1O, T30); + } + { + E T1V, T1Y, T1W, T2M, T1U, T1X; + T1V = Ip[WS(rs, 8)]; + T1Y = Im[WS(rs, 8)]; + T1U = W[32]; + T1W = T1U * T1V; + T2M = T1U * T1Y; + T1X = W[33]; + T1Z = FMA(T1X, T1Y, T1W); + T2N = FNMS(T1X, T1V, T2M); + } + { + E T1T, T26, T41, T42; + T1T = T1M + T1S; + T26 = T1Z + T25; + T27 = T1T - T26; + T2f = T1T + T26; + T41 = T2Z + T31; + T42 = T2N + T2P; + T43 = T41 + T42; + T4b = T42 - T41; + } + { + E T2L, T2Q, T2X, T32; + T2L = T1M - T1S; + T2Q = T2N - T2P; + T2R = T2L - T2Q; + T3z = T2L + T2Q; + T2X = T25 - T1Z; + T32 = T2Z - T31; + T33 = T2X - T32; + T3J = T32 + T2X; + } + } + { + E T1l, T36, T1E, T2I, T1r, T38, T1y, T2G; + { + E T1h, T1k, T1i, T35, T1g, T1j; + T1h = Rp[WS(rs, 4)]; + T1k = Rm[WS(rs, 4)]; + T1g = W[14]; + T1i = T1g * T1h; + T35 = T1g * T1k; + T1j = W[15]; + T1l = FMA(T1j, T1k, T1i); + T36 = FNMS(T1j, T1h, T35); + } + { + E T1A, T1D, T1B, T2H, T1z, T1C; + T1A = Ip[WS(rs, 1)]; + T1D = Im[WS(rs, 1)]; + T1z = W[4]; + T1B = T1z * T1A; + T2H = T1z * T1D; + T1C = W[5]; + T1E = FMA(T1C, T1D, T1B); + T2I = FNMS(T1C, T1A, T2H); + } + { + E T1n, T1q, T1o, T37, T1m, T1p; + T1n = Rp[WS(rs, 9)]; + T1q = Rm[WS(rs, 9)]; + T1m = W[34]; + T1o = T1m * T1n; + T37 = T1m * T1q; + T1p = W[35]; + T1r = FMA(T1p, T1q, T1o); + T38 = FNMS(T1p, T1n, T37); + } + { + E T1u, T1x, T1v, T2F, T1t, T1w; + T1u = Ip[WS(rs, 6)]; + T1x = Im[WS(rs, 6)]; + T1t = W[24]; + T1v = T1t * T1u; + T2F = T1t * T1x; + T1w = W[25]; + T1y = FMA(T1w, T1x, T1v); + T2G = FNMS(T1w, T1u, T2F); + } + { + E T1s, T1F, T3Y, T3Z; + T1s = T1l + T1r; + T1F = T1y + T1E; + T1G = T1s - T1F; + T2e = T1s + T1F; + T3Y = T36 + T38; + T3Z = T2G + T2I; + T40 = T3Y + T3Z; + T4c = T3Z - T3Y; + } + { + E T2E, T2J, T34, T39; + T2E = T1l - T1r; + T2J = T2G - T2I; + T2K = T2E - T2J; + T3y = T2E + T2J; + T34 = T1E - T1y; + T39 = T36 - T38; + T3a = T34 - T39; + T3I = T39 + T34; + } + } + { + E TT, T3e, T1c, T2A, TZ, T3g, T16, T2y; + { + E TP, TS, TQ, T3d, TO, TR; + TP = Rp[WS(rs, 8)]; + TS = Rm[WS(rs, 8)]; + TO = W[30]; + TQ = TO * TP; + T3d = TO * TS; + TR = W[31]; + TT = FMA(TR, TS, TQ); + T3e = FNMS(TR, TP, T3d); + } + { + E T18, T1b, T19, T2z, T17, T1a; + T18 = Ip[WS(rs, 5)]; + T1b = Im[WS(rs, 5)]; + T17 = W[20]; + T19 = T17 * T18; + T2z = T17 * T1b; + T1a = W[21]; + T1c = FMA(T1a, T1b, T19); + T2A = FNMS(T1a, T18, T2z); + } + { + E TV, TY, TW, T3f, TU, TX; + TV = Rp[WS(rs, 3)]; + TY = Rm[WS(rs, 3)]; + TU = W[10]; + TW = TU * TV; + T3f = TU * TY; + TX = W[11]; + TZ = FMA(TX, TY, TW); + T3g = FNMS(TX, TV, T3f); + } + { + E T12, T15, T13, T2x, T11, T14; + T12 = Ip[0]; + T15 = Im[0]; + T11 = W[0]; + T13 = T11 * T12; + T2x = T11 * T15; + T14 = W[1]; + T16 = FMA(T14, T15, T13); + T2y = FNMS(T14, T12, T2x); + } + { + E T10, T1d, T3U, T3V; + T10 = TT + TZ; + T1d = T16 + T1c; + T1e = T10 - T1d; + T2c = T10 + T1d; + T3U = T3e + T3g; + T3V = T2y + T2A; + T3W = T3U + T3V; + T4e = T3V - T3U; + } + { + E T2w, T2B, T3c, T3h; + T2w = TT - TZ; + T2B = T2y - T2A; + T2C = T2w - T2B; + T3w = T2w + T2B; + T3c = T1c - T16; + T3h = T3e - T3g; + T3i = T3c - T3h; + T3G = T3h + T3c; + } + } + { + E T4h, T4j, Tm, T29, T48, T49, T4i, T4a; + { + E T4d, T4g, T1f, T28; + T4d = T4b - T4c; + T4g = T4e - T4f; + T4h = FNMS(KP618033988, T4g, T4d); + T4j = FMA(KP618033988, T4d, T4g); + Tm = T8 - Tl; + T1f = TN + T1e; + T28 = T1G + T27; + T29 = T1f + T28; + T48 = FNMS(KP250000000, T29, Tm); + T49 = T1f - T28; + } + Rm[WS(rs, 9)] = Tm + T29; + T4i = FMA(KP559016994, T49, T48); + Rm[WS(rs, 5)] = FNMS(KP951056516, T4j, T4i); + Rp[WS(rs, 6)] = FMA(KP951056516, T4j, T4i); + T4a = FNMS(KP559016994, T49, T48); + Rp[WS(rs, 2)] = FNMS(KP951056516, T4h, T4a); + Rm[WS(rs, 1)] = FMA(KP951056516, T4h, T4a); + } + { + E T4K, T4M, T4E, T4D, T4F, T4G, T4L, T4H; + { + E T4I, T4J, T4B, T4C; + T4I = T1G - T27; + T4J = T1e - TN; + T4K = FMA(KP618033988, T4J, T4I); + T4M = FNMS(KP618033988, T4I, T4J); + T4E = T4r - T4n; + T4B = T4f + T4e; + T4C = T4c + T4b; + T4D = T4B + T4C; + T4F = FMA(KP250000000, T4D, T4E); + T4G = T4C - T4B; + } + Im[WS(rs, 9)] = T4D - T4E; + T4L = FMA(KP559016994, T4G, T4F); + Im[WS(rs, 5)] = FMS(KP951056516, T4M, T4L); + Ip[WS(rs, 6)] = FMA(KP951056516, T4M, T4L); + T4H = FNMS(KP559016994, T4G, T4F); + Im[WS(rs, 1)] = FMS(KP951056516, T4K, T4H); + Ip[WS(rs, 2)] = FMA(KP951056516, T4K, T4H); + } + { + E T45, T47, T2a, T2h, T3O, T3P, T46, T3Q; + { + E T3X, T44, T2d, T2g; + T3X = T3T - T3W; + T44 = T40 - T43; + T45 = FMA(KP618033988, T44, T3X); + T47 = FNMS(KP618033988, T3X, T44); + T2a = T8 + Tl; + T2d = T2b + T2c; + T2g = T2e + T2f; + T2h = T2d + T2g; + T3O = FNMS(KP250000000, T2h, T2a); + T3P = T2d - T2g; + } + Rp[0] = T2a + T2h; + T46 = FNMS(KP559016994, T3P, T3O); + Rm[WS(rs, 7)] = FNMS(KP951056516, T47, T46); + Rp[WS(rs, 8)] = FMA(KP951056516, T47, T46); + T3Q = FMA(KP559016994, T3P, T3O); + Rp[WS(rs, 4)] = FNMS(KP951056516, T45, T3Q); + Rm[WS(rs, 3)] = FMA(KP951056516, T45, T3Q); + } + { + E T4y, T4A, T4s, T4m, T4t, T4u, T4z, T4v; + { + E T4w, T4x, T4k, T4l; + T4w = T2b - T2c; + T4x = T2f - T2e; + T4y = FNMS(KP618033988, T4x, T4w); + T4A = FMA(KP618033988, T4w, T4x); + T4s = T4n + T4r; + T4k = T3T + T3W; + T4l = T40 + T43; + T4m = T4k + T4l; + T4t = FNMS(KP250000000, T4m, T4s); + T4u = T4k - T4l; + } + Ip[0] = T4m + T4s; + T4z = FNMS(KP559016994, T4u, T4t); + Im[WS(rs, 7)] = FMS(KP951056516, T4A, T4z); + Ip[WS(rs, 8)] = FMA(KP951056516, T4A, T4z); + T4v = FMA(KP559016994, T4u, T4t); + Im[WS(rs, 3)] = FMS(KP951056516, T4y, T4v); + Ip[WS(rs, 4)] = FMA(KP951056516, T4y, T4v); + } + { + E T3r, T3t, T2o, T2T, T2U, T2V, T3s, T2W; + { + E T3b, T3q, T2D, T2S; + T3b = T33 - T3a; + T3q = T3i - T3p; + T3r = FNMS(KP618033988, T3q, T3b); + T3t = FMA(KP618033988, T3b, T3q); + T2o = T2i - T2n; + T2D = T2v + T2C; + T2S = T2K + T2R; + T2T = T2D + T2S; + T2U = FNMS(KP250000000, T2T, T2o); + T2V = T2D - T2S; + } + Rm[WS(rs, 4)] = T2o + T2T; + T3s = FMA(KP559016994, T2V, T2U); + Rm[WS(rs, 8)] = FMA(KP951056516, T3t, T3s); + Rm[0] = FNMS(KP951056516, T3t, T3s); + T2W = FNMS(KP559016994, T2V, T2U); + Rp[WS(rs, 3)] = FMA(KP951056516, T3r, T2W); + Rp[WS(rs, 7)] = FNMS(KP951056516, T3r, T2W); + } + { + E T5a, T5c, T54, T53, T55, T56, T5b, T57; + { + E T58, T59, T51, T52; + T58 = T2v - T2C; + T59 = T2K - T2R; + T5a = FMA(KP618033988, T59, T58); + T5c = FNMS(KP618033988, T58, T59); + T54 = T4O + T4N; + T51 = T3p + T3i; + T52 = T3a + T33; + T53 = T51 + T52; + T55 = FMA(KP250000000, T53, T54); + T56 = T51 - T52; + } + Im[WS(rs, 4)] = T53 - T54; + T5b = FMA(KP559016994, T56, T55); + Ip[WS(rs, 3)] = FNMS(KP951056516, T5c, T5b); + Ip[WS(rs, 7)] = FMA(KP951056516, T5c, T5b); + T57 = FNMS(KP559016994, T56, T55); + Im[WS(rs, 8)] = FMS(KP951056516, T5a, T57); + Im[0] = -(FMA(KP951056516, T5a, T57)); + } + { + E T3L, T3N, T3u, T3B, T3C, T3D, T3M, T3E; + { + E T3H, T3K, T3x, T3A; + T3H = T3F - T3G; + T3K = T3I - T3J; + T3L = FMA(KP618033988, T3K, T3H); + T3N = FNMS(KP618033988, T3H, T3K); + T3u = T2i + T2n; + T3x = T3v + T3w; + T3A = T3y + T3z; + T3B = T3x + T3A; + T3C = FNMS(KP250000000, T3B, T3u); + T3D = T3x - T3A; + } + Rp[WS(rs, 5)] = T3u + T3B; + T3M = FNMS(KP559016994, T3D, T3C); + Rm[WS(rs, 6)] = FMA(KP951056516, T3N, T3M); + Rm[WS(rs, 2)] = FNMS(KP951056516, T3N, T3M); + T3E = FMA(KP559016994, T3D, T3C); + Rp[WS(rs, 1)] = FMA(KP951056516, T3L, T3E); + Rp[WS(rs, 9)] = FNMS(KP951056516, T3L, T3E); + } + { + E T4Y, T50, T4P, T4S, T4T, T4U, T4Z, T4V; + { + E T4W, T4X, T4Q, T4R; + T4W = T3y - T3z; + T4X = T3v - T3w; + T4Y = FNMS(KP618033988, T4X, T4W); + T50 = FMA(KP618033988, T4W, T4X); + T4P = T4N - T4O; + T4Q = T3F + T3G; + T4R = T3I + T3J; + T4S = T4Q + T4R; + T4T = FNMS(KP250000000, T4S, T4P); + T4U = T4Q - T4R; + } + Ip[WS(rs, 5)] = T4S + T4P; + T4Z = FMA(KP559016994, T4U, T4T); + Ip[WS(rs, 1)] = FNMS(KP951056516, T50, T4Z); + Ip[WS(rs, 9)] = FMA(KP951056516, T50, T4Z); + T4V = FNMS(KP559016994, T4U, T4T); + Im[WS(rs, 6)] = FMS(KP951056516, T4Y, T4V); + Im[WS(rs, 2)] = -(FMA(KP951056516, T4Y, T4V)); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cf_20", twinstr, &GENUS, {136, 38, 110, 0} }; + +void X(codelet_hc2cf_20) (planner *p) { + X(khc2c_register) (p, hc2cf_20, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 20 -dit -name hc2cf_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 246 FP additions, 124 FP multiplications, + * (or, 184 additions, 62 multiplications, 62 fused multiply/add), + * 85 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E Tj, T1R, T4j, T4s, T2q, T37, T3Q, T42, T1r, T1O, T1P, T3p, T3s, T3K, T3A; + E T3B, T3Z, T1V, T1W, T1X, T23, T28, T4q, T2W, T2X, T4f, T33, T34, T35, T2G; + E T2L, T2M, TG, T13, T14, T3i, T3l, T3J, T3D, T3E, T40, T1S, T1T, T1U, T2e; + E T2j, T4p, T2T, T2U, T4e, T30, T31, T32, T2v, T2A, T2B; + { + E T1, T3O, T6, T3N, Tc, T2n, Th, T2o; + T1 = Rp[0]; + T3O = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Rp[WS(rs, 5)]; + T5 = Rm[WS(rs, 5)]; + T2 = W[18]; + T4 = W[19]; + T6 = FMA(T2, T3, T4 * T5); + T3N = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = Ip[WS(rs, 2)]; + Tb = Im[WS(rs, 2)]; + T8 = W[8]; + Ta = W[9]; + Tc = FMA(T8, T9, Ta * Tb); + T2n = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = Ip[WS(rs, 7)]; + Tg = Im[WS(rs, 7)]; + Td = W[28]; + Tf = W[29]; + Th = FMA(Td, Te, Tf * Tg); + T2o = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, T4h, T4i; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 - Ti; + T1R = T7 + Ti; + T4h = T3O - T3N; + T4i = Tc - Th; + T4j = T4h - T4i; + T4s = T4i + T4h; + } + { + E T2m, T2p, T3M, T3P; + T2m = T1 - T6; + T2p = T2n - T2o; + T2q = T2m - T2p; + T37 = T2m + T2p; + T3M = T2n + T2o; + T3P = T3N + T3O; + T3Q = T3M + T3P; + T42 = T3P - T3M; + } + } + { + E T1f, T3n, T21, T2C, T1N, T3r, T27, T2K, T1q, T3o, T22, T2F, T1C, T3q, T26; + E T2H; + { + E T19, T1Z, T1e, T20; + { + E T16, T18, T15, T17; + T16 = Rp[WS(rs, 4)]; + T18 = Rm[WS(rs, 4)]; + T15 = W[14]; + T17 = W[15]; + T19 = FMA(T15, T16, T17 * T18); + T1Z = FNMS(T17, T16, T15 * T18); + } + { + E T1b, T1d, T1a, T1c; + T1b = Rp[WS(rs, 9)]; + T1d = Rm[WS(rs, 9)]; + T1a = W[34]; + T1c = W[35]; + T1e = FMA(T1a, T1b, T1c * T1d); + T20 = FNMS(T1c, T1b, T1a * T1d); + } + T1f = T19 + T1e; + T3n = T1Z + T20; + T21 = T1Z - T20; + T2C = T19 - T1e; + } + { + E T1H, T2I, T1M, T2J; + { + E T1E, T1G, T1D, T1F; + T1E = Ip[WS(rs, 8)]; + T1G = Im[WS(rs, 8)]; + T1D = W[32]; + T1F = W[33]; + T1H = FMA(T1D, T1E, T1F * T1G); + T2I = FNMS(T1F, T1E, T1D * T1G); + } + { + E T1J, T1L, T1I, T1K; + T1J = Ip[WS(rs, 3)]; + T1L = Im[WS(rs, 3)]; + T1I = W[12]; + T1K = W[13]; + T1M = FMA(T1I, T1J, T1K * T1L); + T2J = FNMS(T1K, T1J, T1I * T1L); + } + T1N = T1H + T1M; + T3r = T2I + T2J; + T27 = T1H - T1M; + T2K = T2I - T2J; + } + { + E T1k, T2D, T1p, T2E; + { + E T1h, T1j, T1g, T1i; + T1h = Ip[WS(rs, 6)]; + T1j = Im[WS(rs, 6)]; + T1g = W[24]; + T1i = W[25]; + T1k = FMA(T1g, T1h, T1i * T1j); + T2D = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1m, T1o, T1l, T1n; + T1m = Ip[WS(rs, 1)]; + T1o = Im[WS(rs, 1)]; + T1l = W[4]; + T1n = W[5]; + T1p = FMA(T1l, T1m, T1n * T1o); + T2E = FNMS(T1n, T1m, T1l * T1o); + } + T1q = T1k + T1p; + T3o = T2D + T2E; + T22 = T1k - T1p; + T2F = T2D - T2E; + } + { + E T1w, T24, T1B, T25; + { + E T1t, T1v, T1s, T1u; + T1t = Rp[WS(rs, 6)]; + T1v = Rm[WS(rs, 6)]; + T1s = W[22]; + T1u = W[23]; + T1w = FMA(T1s, T1t, T1u * T1v); + T24 = FNMS(T1u, T1t, T1s * T1v); + } + { + E T1y, T1A, T1x, T1z; + T1y = Rp[WS(rs, 1)]; + T1A = Rm[WS(rs, 1)]; + T1x = W[2]; + T1z = W[3]; + T1B = FMA(T1x, T1y, T1z * T1A); + T25 = FNMS(T1z, T1y, T1x * T1A); + } + T1C = T1w + T1B; + T3q = T24 + T25; + T26 = T24 - T25; + T2H = T1w - T1B; + } + T1r = T1f - T1q; + T1O = T1C - T1N; + T1P = T1r + T1O; + T3p = T3n + T3o; + T3s = T3q + T3r; + T3K = T3p + T3s; + T3A = T3n - T3o; + T3B = T3r - T3q; + T3Z = T3B - T3A; + T1V = T1f + T1q; + T1W = T1C + T1N; + T1X = T1V + T1W; + T23 = T21 + T22; + T28 = T26 + T27; + T4q = T23 + T28; + T2W = T21 - T22; + T2X = T26 - T27; + T4f = T2W + T2X; + T33 = T2C + T2F; + T34 = T2H + T2K; + T35 = T33 + T34; + T2G = T2C - T2F; + T2L = T2H - T2K; + T2M = T2G + T2L; + } + { + E Tu, T3g, T2c, T2r, T12, T3k, T2f, T2z, TF, T3h, T2d, T2u, TR, T3j, T2i; + E T2w; + { + E To, T2a, Tt, T2b; + { + E Tl, Tn, Tk, Tm; + Tl = Rp[WS(rs, 2)]; + Tn = Rm[WS(rs, 2)]; + Tk = W[6]; + Tm = W[7]; + To = FMA(Tk, Tl, Tm * Tn); + T2a = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = Rp[WS(rs, 7)]; + Ts = Rm[WS(rs, 7)]; + Tp = W[26]; + Tr = W[27]; + Tt = FMA(Tp, Tq, Tr * Ts); + T2b = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T3g = T2a + T2b; + T2c = T2a - T2b; + T2r = To - Tt; + } + { + E TW, T2x, T11, T2y; + { + E TT, TV, TS, TU; + TT = Ip[0]; + TV = Im[0]; + TS = W[0]; + TU = W[1]; + TW = FMA(TS, TT, TU * TV); + T2x = FNMS(TU, TT, TS * TV); + } + { + E TY, T10, TX, TZ; + TY = Ip[WS(rs, 5)]; + T10 = Im[WS(rs, 5)]; + TX = W[20]; + TZ = W[21]; + T11 = FMA(TX, TY, TZ * T10); + T2y = FNMS(TZ, TY, TX * T10); + } + T12 = TW + T11; + T3k = T2x + T2y; + T2f = T11 - TW; + T2z = T2x - T2y; + } + { + E Tz, T2s, TE, T2t; + { + E Tw, Ty, Tv, Tx; + Tw = Ip[WS(rs, 4)]; + Ty = Im[WS(rs, 4)]; + Tv = W[16]; + Tx = W[17]; + Tz = FMA(Tv, Tw, Tx * Ty); + T2s = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = Ip[WS(rs, 9)]; + TD = Im[WS(rs, 9)]; + TA = W[36]; + TC = W[37]; + TE = FMA(TA, TB, TC * TD); + T2t = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T3h = T2s + T2t; + T2d = Tz - TE; + T2u = T2s - T2t; + } + { + E TL, T2g, TQ, T2h; + { + E TI, TK, TH, TJ; + TI = Rp[WS(rs, 8)]; + TK = Rm[WS(rs, 8)]; + TH = W[30]; + TJ = W[31]; + TL = FMA(TH, TI, TJ * TK); + T2g = FNMS(TJ, TI, TH * TK); + } + { + E TN, TP, TM, TO; + TN = Rp[WS(rs, 3)]; + TP = Rm[WS(rs, 3)]; + TM = W[10]; + TO = W[11]; + TQ = FMA(TM, TN, TO * TP); + T2h = FNMS(TO, TN, TM * TP); + } + TR = TL + TQ; + T3j = T2g + T2h; + T2i = T2g - T2h; + T2w = TL - TQ; + } + TG = Tu - TF; + T13 = TR - T12; + T14 = TG + T13; + T3i = T3g + T3h; + T3l = T3j + T3k; + T3J = T3i + T3l; + T3D = T3g - T3h; + T3E = T3j - T3k; + T40 = T3D + T3E; + T1S = Tu + TF; + T1T = TR + T12; + T1U = T1S + T1T; + T2e = T2c + T2d; + T2j = T2f - T2i; + T4p = T2j - T2e; + T2T = T2c - T2d; + T2U = T2i + T2f; + T4e = T2T + T2U; + T30 = T2r + T2u; + T31 = T2w + T2z; + T32 = T30 + T31; + T2v = T2r - T2u; + T2A = T2w - T2z; + T2B = T2v + T2A; + } + { + E T3y, T1Q, T3x, T3G, T3I, T3C, T3F, T3H, T3z; + T3y = KP559016994 * (T14 - T1P); + T1Q = T14 + T1P; + T3x = FNMS(KP250000000, T1Q, Tj); + T3C = T3A + T3B; + T3F = T3D - T3E; + T3G = FNMS(KP587785252, T3F, KP951056516 * T3C); + T3I = FMA(KP951056516, T3F, KP587785252 * T3C); + Rm[WS(rs, 9)] = Tj + T1Q; + T3H = T3y + T3x; + Rm[WS(rs, 5)] = T3H - T3I; + Rp[WS(rs, 6)] = T3H + T3I; + T3z = T3x - T3y; + Rp[WS(rs, 2)] = T3z - T3G; + Rm[WS(rs, 1)] = T3z + T3G; + } + { + E T47, T41, T46, T45, T49, T43, T44, T4a, T48; + T47 = KP559016994 * (T40 + T3Z); + T41 = T3Z - T40; + T46 = FMA(KP250000000, T41, T42); + T43 = T13 - TG; + T44 = T1r - T1O; + T45 = FMA(KP587785252, T43, KP951056516 * T44); + T49 = FNMS(KP587785252, T44, KP951056516 * T43); + Im[WS(rs, 9)] = T41 - T42; + T4a = T47 + T46; + Im[WS(rs, 5)] = T49 - T4a; + Ip[WS(rs, 6)] = T49 + T4a; + T48 = T46 - T47; + Im[WS(rs, 1)] = T45 - T48; + Ip[WS(rs, 2)] = T45 + T48; + } + { + E T3d, T1Y, T3e, T3u, T3w, T3m, T3t, T3v, T3f; + T3d = KP559016994 * (T1U - T1X); + T1Y = T1U + T1X; + T3e = FNMS(KP250000000, T1Y, T1R); + T3m = T3i - T3l; + T3t = T3p - T3s; + T3u = FMA(KP951056516, T3m, KP587785252 * T3t); + T3w = FNMS(KP587785252, T3m, KP951056516 * T3t); + Rp[0] = T1R + T1Y; + T3v = T3e - T3d; + Rm[WS(rs, 7)] = T3v - T3w; + Rp[WS(rs, 8)] = T3v + T3w; + T3f = T3d + T3e; + Rp[WS(rs, 4)] = T3f - T3u; + Rm[WS(rs, 3)] = T3f + T3u; + } + { + E T3U, T3L, T3V, T3T, T3X, T3R, T3S, T3Y, T3W; + T3U = KP559016994 * (T3J - T3K); + T3L = T3J + T3K; + T3V = FNMS(KP250000000, T3L, T3Q); + T3R = T1S - T1T; + T3S = T1V - T1W; + T3T = FMA(KP951056516, T3R, KP587785252 * T3S); + T3X = FNMS(KP951056516, T3S, KP587785252 * T3R); + Ip[0] = T3L + T3Q; + T3Y = T3V - T3U; + Im[WS(rs, 7)] = T3X - T3Y; + Ip[WS(rs, 8)] = T3X + T3Y; + T3W = T3U + T3V; + Im[WS(rs, 3)] = T3T - T3W; + Ip[WS(rs, 4)] = T3T + T3W; + } + { + E T2P, T2N, T2O, T2l, T2R, T29, T2k, T2S, T2Q; + T2P = KP559016994 * (T2B - T2M); + T2N = T2B + T2M; + T2O = FNMS(KP250000000, T2N, T2q); + T29 = T23 - T28; + T2k = T2e + T2j; + T2l = FNMS(KP587785252, T2k, KP951056516 * T29); + T2R = FMA(KP951056516, T2k, KP587785252 * T29); + Rm[WS(rs, 4)] = T2q + T2N; + T2S = T2P + T2O; + Rm[WS(rs, 8)] = T2R + T2S; + Rm[0] = T2S - T2R; + T2Q = T2O - T2P; + Rp[WS(rs, 3)] = T2l + T2Q; + Rp[WS(rs, 7)] = T2Q - T2l; + } + { + E T4w, T4r, T4x, T4v, T4A, T4t, T4u, T4z, T4y; + T4w = KP559016994 * (T4p + T4q); + T4r = T4p - T4q; + T4x = FMA(KP250000000, T4r, T4s); + T4t = T2v - T2A; + T4u = T2G - T2L; + T4v = FMA(KP951056516, T4t, KP587785252 * T4u); + T4A = FNMS(KP587785252, T4t, KP951056516 * T4u); + Im[WS(rs, 4)] = T4r - T4s; + T4z = T4w + T4x; + Ip[WS(rs, 3)] = T4z - T4A; + Ip[WS(rs, 7)] = T4A + T4z; + T4y = T4w - T4x; + Im[WS(rs, 8)] = T4v + T4y; + Im[0] = T4y - T4v; + } + { + E T36, T38, T39, T2Z, T3b, T2V, T2Y, T3c, T3a; + T36 = KP559016994 * (T32 - T35); + T38 = T32 + T35; + T39 = FNMS(KP250000000, T38, T37); + T2V = T2T - T2U; + T2Y = T2W - T2X; + T2Z = FMA(KP951056516, T2V, KP587785252 * T2Y); + T3b = FNMS(KP587785252, T2V, KP951056516 * T2Y); + Rp[WS(rs, 5)] = T37 + T38; + T3c = T39 - T36; + Rm[WS(rs, 6)] = T3b + T3c; + Rm[WS(rs, 2)] = T3c - T3b; + T3a = T36 + T39; + Rp[WS(rs, 1)] = T2Z + T3a; + Rp[WS(rs, 9)] = T3a - T2Z; + } + { + E T4g, T4k, T4l, T4d, T4o, T4b, T4c, T4n, T4m; + T4g = KP559016994 * (T4e - T4f); + T4k = T4e + T4f; + T4l = FNMS(KP250000000, T4k, T4j); + T4b = T33 - T34; + T4c = T30 - T31; + T4d = FNMS(KP587785252, T4c, KP951056516 * T4b); + T4o = FMA(KP951056516, T4c, KP587785252 * T4b); + Ip[WS(rs, 5)] = T4k + T4j; + T4n = T4g + T4l; + Ip[WS(rs, 1)] = T4n - T4o; + Ip[WS(rs, 9)] = T4o + T4n; + T4m = T4g - T4l; + Im[WS(rs, 6)] = T4d + T4m; + Im[WS(rs, 2)] = T4m - T4d; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cf_20", twinstr, &GENUS, {184, 62, 62, 0} }; + +void X(codelet_hc2cf_20) (planner *p) { + X(khc2c_register) (p, hc2cf_20, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_32.c new file mode 100644 index 000000000..45e9c3bbd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_32.c @@ -0,0 +1,1809 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:59 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -dit -name hc2cf_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 236 additions, 62 multiplications, 198 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E T8, T8x, T3w, T87, Tl, T8y, T3B, T83, Tz, T6F, T3J, T5T, TM, T6G, T3Q; + E T5U, T11, T1e, T6M, T6J, T6K, T6L, T3Z, T5Y, T46, T5X, T1s, T1F, T6O, T6P; + E T6Q, T6R, T4e, T61, T4l, T60, T32, T7b, T79, T7N, T54, T6c, T5r, T6f, T29; + E T70, T6X, T7I, T4v, T65, T4S, T68, T3t, T76, T7e, T7O, T5b, T5s, T5i, T5t; + E T2A, T6Y, T73, T7J, T4C, T4T, T4J, T4U; + { + E T1, T86, T3, T6, T4, T84, T2, T7, T85, T5; + T1 = Rp[0]; + T86 = Rm[0]; + T3 = Rp[WS(rs, 8)]; + T6 = Rm[WS(rs, 8)]; + T2 = W[30]; + T4 = T2 * T3; + T84 = T2 * T6; + T5 = W[31]; + T7 = FMA(T5, T6, T4); + T85 = FNMS(T5, T3, T84); + T8 = T1 + T7; + T8x = T86 - T85; + T3w = T1 - T7; + T87 = T85 + T86; + } + { + E Ta, Td, Tb, T3x, Tg, Tj, Th, T3z, T9, Tf; + Ta = Rp[WS(rs, 4)]; + Td = Rm[WS(rs, 4)]; + T9 = W[14]; + Tb = T9 * Ta; + T3x = T9 * Td; + Tg = Rp[WS(rs, 12)]; + Tj = Rm[WS(rs, 12)]; + Tf = W[46]; + Th = Tf * Tg; + T3z = Tf * Tj; + { + E Te, T3y, Tk, T3A, Tc, Ti; + Tc = W[15]; + Te = FMA(Tc, Td, Tb); + T3y = FNMS(Tc, Ta, T3x); + Ti = W[47]; + Tk = FMA(Ti, Tj, Th); + T3A = FNMS(Ti, Tg, T3z); + Tl = Te + Tk; + T8y = Te - Tk; + T3B = T3y - T3A; + T83 = T3y + T3A; + } + } + { + E Ts, T3F, Ty, T3H, T3D, T3I; + { + E To, Tr, Tp, T3E, Tn, Tq; + To = Rp[WS(rs, 2)]; + Tr = Rm[WS(rs, 2)]; + Tn = W[6]; + Tp = Tn * To; + T3E = Tn * Tr; + Tq = W[7]; + Ts = FMA(Tq, Tr, Tp); + T3F = FNMS(Tq, To, T3E); + } + { + E Tu, Tx, Tv, T3G, Tt, Tw; + Tu = Rp[WS(rs, 10)]; + Tx = Rm[WS(rs, 10)]; + Tt = W[38]; + Tv = Tt * Tu; + T3G = Tt * Tx; + Tw = W[39]; + Ty = FMA(Tw, Tx, Tv); + T3H = FNMS(Tw, Tu, T3G); + } + Tz = Ts + Ty; + T6F = T3F + T3H; + T3D = Ts - Ty; + T3I = T3F - T3H; + T3J = T3D + T3I; + T5T = T3I - T3D; + } + { + E TF, T3M, TL, T3O, T3K, T3P; + { + E TB, TE, TC, T3L, TA, TD; + TB = Rp[WS(rs, 14)]; + TE = Rm[WS(rs, 14)]; + TA = W[54]; + TC = TA * TB; + T3L = TA * TE; + TD = W[55]; + TF = FMA(TD, TE, TC); + T3M = FNMS(TD, TB, T3L); + } + { + E TH, TK, TI, T3N, TG, TJ; + TH = Rp[WS(rs, 6)]; + TK = Rm[WS(rs, 6)]; + TG = W[22]; + TI = TG * TH; + T3N = TG * TK; + TJ = W[23]; + TL = FMA(TJ, TK, TI); + T3O = FNMS(TJ, TH, T3N); + } + TM = TF + TL; + T6G = T3M + T3O; + T3K = TF - TL; + T3P = T3M - T3O; + T3Q = T3K - T3P; + T5U = T3K + T3P; + } + { + E TU, T41, T1d, T3X, T10, T43, T17, T3V; + { + E TQ, TT, TR, T40, TP, TS; + TQ = Rp[WS(rs, 1)]; + TT = Rm[WS(rs, 1)]; + TP = W[2]; + TR = TP * TQ; + T40 = TP * TT; + TS = W[3]; + TU = FMA(TS, TT, TR); + T41 = FNMS(TS, TQ, T40); + } + { + E T19, T1c, T1a, T3W, T18, T1b; + T19 = Rp[WS(rs, 13)]; + T1c = Rm[WS(rs, 13)]; + T18 = W[50]; + T1a = T18 * T19; + T3W = T18 * T1c; + T1b = W[51]; + T1d = FMA(T1b, T1c, T1a); + T3X = FNMS(T1b, T19, T3W); + } + { + E TW, TZ, TX, T42, TV, TY; + TW = Rp[WS(rs, 9)]; + TZ = Rm[WS(rs, 9)]; + TV = W[34]; + TX = TV * TW; + T42 = TV * TZ; + TY = W[35]; + T10 = FMA(TY, TZ, TX); + T43 = FNMS(TY, TW, T42); + } + { + E T13, T16, T14, T3U, T12, T15; + T13 = Rp[WS(rs, 5)]; + T16 = Rm[WS(rs, 5)]; + T12 = W[18]; + T14 = T12 * T13; + T3U = T12 * T16; + T15 = W[19]; + T17 = FMA(T15, T16, T14); + T3V = FNMS(T15, T13, T3U); + } + T11 = TU + T10; + T1e = T17 + T1d; + T6M = T11 - T1e; + T6J = T41 + T43; + T6K = T3V + T3X; + T6L = T6J - T6K; + { + E T3T, T3Y, T44, T45; + T3T = TU - T10; + T3Y = T3V - T3X; + T3Z = T3T + T3Y; + T5Y = T3T - T3Y; + T44 = T41 - T43; + T45 = T17 - T1d; + T46 = T44 - T45; + T5X = T44 + T45; + } + } + { + E T1l, T4g, T1E, T4c, T1r, T4i, T1y, T4a; + { + E T1h, T1k, T1i, T4f, T1g, T1j; + T1h = Rp[WS(rs, 15)]; + T1k = Rm[WS(rs, 15)]; + T1g = W[58]; + T1i = T1g * T1h; + T4f = T1g * T1k; + T1j = W[59]; + T1l = FMA(T1j, T1k, T1i); + T4g = FNMS(T1j, T1h, T4f); + } + { + E T1A, T1D, T1B, T4b, T1z, T1C; + T1A = Rp[WS(rs, 11)]; + T1D = Rm[WS(rs, 11)]; + T1z = W[42]; + T1B = T1z * T1A; + T4b = T1z * T1D; + T1C = W[43]; + T1E = FMA(T1C, T1D, T1B); + T4c = FNMS(T1C, T1A, T4b); + } + { + E T1n, T1q, T1o, T4h, T1m, T1p; + T1n = Rp[WS(rs, 7)]; + T1q = Rm[WS(rs, 7)]; + T1m = W[26]; + T1o = T1m * T1n; + T4h = T1m * T1q; + T1p = W[27]; + T1r = FMA(T1p, T1q, T1o); + T4i = FNMS(T1p, T1n, T4h); + } + { + E T1u, T1x, T1v, T49, T1t, T1w; + T1u = Rp[WS(rs, 3)]; + T1x = Rm[WS(rs, 3)]; + T1t = W[10]; + T1v = T1t * T1u; + T49 = T1t * T1x; + T1w = W[11]; + T1y = FMA(T1w, T1x, T1v); + T4a = FNMS(T1w, T1u, T49); + } + T1s = T1l + T1r; + T1F = T1y + T1E; + T6O = T1s - T1F; + T6P = T4g + T4i; + T6Q = T4a + T4c; + T6R = T6P - T6Q; + { + E T48, T4d, T4j, T4k; + T48 = T1l - T1r; + T4d = T4a - T4c; + T4e = T48 + T4d; + T61 = T48 - T4d; + T4j = T4g - T4i; + T4k = T1y - T1E; + T4l = T4j - T4k; + T60 = T4j + T4k; + } + } + { + E T2H, T5m, T30, T52, T2N, T5o, T2U, T50; + { + E T2D, T2G, T2E, T5l, T2C, T2F; + T2D = Ip[WS(rs, 15)]; + T2G = Im[WS(rs, 15)]; + T2C = W[60]; + T2E = T2C * T2D; + T5l = T2C * T2G; + T2F = W[61]; + T2H = FMA(T2F, T2G, T2E); + T5m = FNMS(T2F, T2D, T5l); + } + { + E T2W, T2Z, T2X, T51, T2V, T2Y; + T2W = Ip[WS(rs, 11)]; + T2Z = Im[WS(rs, 11)]; + T2V = W[44]; + T2X = T2V * T2W; + T51 = T2V * T2Z; + T2Y = W[45]; + T30 = FMA(T2Y, T2Z, T2X); + T52 = FNMS(T2Y, T2W, T51); + } + { + E T2J, T2M, T2K, T5n, T2I, T2L; + T2J = Ip[WS(rs, 7)]; + T2M = Im[WS(rs, 7)]; + T2I = W[28]; + T2K = T2I * T2J; + T5n = T2I * T2M; + T2L = W[29]; + T2N = FMA(T2L, T2M, T2K); + T5o = FNMS(T2L, T2J, T5n); + } + { + E T2Q, T2T, T2R, T4Z, T2P, T2S; + T2Q = Ip[WS(rs, 3)]; + T2T = Im[WS(rs, 3)]; + T2P = W[12]; + T2R = T2P * T2Q; + T4Z = T2P * T2T; + T2S = W[13]; + T2U = FMA(T2S, T2T, T2R); + T50 = FNMS(T2S, T2Q, T4Z); + } + { + E T2O, T31, T77, T78; + T2O = T2H + T2N; + T31 = T2U + T30; + T32 = T2O + T31; + T7b = T2O - T31; + T77 = T5m + T5o; + T78 = T50 + T52; + T79 = T77 - T78; + T7N = T77 + T78; + } + { + E T4Y, T53, T5p, T5q; + T4Y = T2H - T2N; + T53 = T50 - T52; + T54 = T4Y + T53; + T6c = T4Y - T53; + T5p = T5m - T5o; + T5q = T30 - T2U; + T5r = T5p + T5q; + T6f = T5q - T5p; + } + } + { + E T1O, T4N, T27, T4t, T1U, T4P, T21, T4r; + { + E T1K, T1N, T1L, T4M, T1J, T1M; + T1K = Ip[0]; + T1N = Im[0]; + T1J = W[0]; + T1L = T1J * T1K; + T4M = T1J * T1N; + T1M = W[1]; + T1O = FMA(T1M, T1N, T1L); + T4N = FNMS(T1M, T1K, T4M); + } + { + E T23, T26, T24, T4s, T22, T25; + T23 = Ip[WS(rs, 12)]; + T26 = Im[WS(rs, 12)]; + T22 = W[48]; + T24 = T22 * T23; + T4s = T22 * T26; + T25 = W[49]; + T27 = FMA(T25, T26, T24); + T4t = FNMS(T25, T23, T4s); + } + { + E T1Q, T1T, T1R, T4O, T1P, T1S; + T1Q = Ip[WS(rs, 8)]; + T1T = Im[WS(rs, 8)]; + T1P = W[32]; + T1R = T1P * T1Q; + T4O = T1P * T1T; + T1S = W[33]; + T1U = FMA(T1S, T1T, T1R); + T4P = FNMS(T1S, T1Q, T4O); + } + { + E T1X, T20, T1Y, T4q, T1W, T1Z; + T1X = Ip[WS(rs, 4)]; + T20 = Im[WS(rs, 4)]; + T1W = W[16]; + T1Y = T1W * T1X; + T4q = T1W * T20; + T1Z = W[17]; + T21 = FMA(T1Z, T20, T1Y); + T4r = FNMS(T1Z, T1X, T4q); + } + { + E T1V, T28, T6V, T6W; + T1V = T1O + T1U; + T28 = T21 + T27; + T29 = T1V + T28; + T70 = T1V - T28; + T6V = T4N + T4P; + T6W = T4r + T4t; + T6X = T6V - T6W; + T7I = T6V + T6W; + } + { + E T4p, T4u, T4Q, T4R; + T4p = T1O - T1U; + T4u = T4r - T4t; + T4v = T4p + T4u; + T65 = T4p - T4u; + T4Q = T4N - T4P; + T4R = T21 - T27; + T4S = T4Q - T4R; + T68 = T4Q + T4R; + } + } + { + E T38, T57, T3r, T5g, T3e, T59, T3l, T5e; + { + E T34, T37, T35, T56, T33, T36; + T34 = Ip[WS(rs, 1)]; + T37 = Im[WS(rs, 1)]; + T33 = W[4]; + T35 = T33 * T34; + T56 = T33 * T37; + T36 = W[5]; + T38 = FMA(T36, T37, T35); + T57 = FNMS(T36, T34, T56); + } + { + E T3n, T3q, T3o, T5f, T3m, T3p; + T3n = Ip[WS(rs, 5)]; + T3q = Im[WS(rs, 5)]; + T3m = W[20]; + T3o = T3m * T3n; + T5f = T3m * T3q; + T3p = W[21]; + T3r = FMA(T3p, T3q, T3o); + T5g = FNMS(T3p, T3n, T5f); + } + { + E T3a, T3d, T3b, T58, T39, T3c; + T3a = Ip[WS(rs, 9)]; + T3d = Im[WS(rs, 9)]; + T39 = W[36]; + T3b = T39 * T3a; + T58 = T39 * T3d; + T3c = W[37]; + T3e = FMA(T3c, T3d, T3b); + T59 = FNMS(T3c, T3a, T58); + } + { + E T3h, T3k, T3i, T5d, T3g, T3j; + T3h = Ip[WS(rs, 13)]; + T3k = Im[WS(rs, 13)]; + T3g = W[52]; + T3i = T3g * T3h; + T5d = T3g * T3k; + T3j = W[53]; + T3l = FMA(T3j, T3k, T3i); + T5e = FNMS(T3j, T3h, T5d); + } + { + E T3f, T3s, T7c, T7d; + T3f = T38 + T3e; + T3s = T3l + T3r; + T3t = T3f + T3s; + T76 = T3s - T3f; + T7c = T57 + T59; + T7d = T5e + T5g; + T7e = T7c - T7d; + T7O = T7c + T7d; + } + { + E T55, T5a, T5c, T5h; + T55 = T38 - T3e; + T5a = T57 - T59; + T5b = T55 + T5a; + T5s = T5a - T55; + T5c = T3l - T3r; + T5h = T5e - T5g; + T5i = T5c - T5h; + T5t = T5c + T5h; + } + } + { + E T2f, T4y, T2y, T4H, T2l, T4A, T2s, T4F; + { + E T2b, T2e, T2c, T4x, T2a, T2d; + T2b = Ip[WS(rs, 2)]; + T2e = Im[WS(rs, 2)]; + T2a = W[8]; + T2c = T2a * T2b; + T4x = T2a * T2e; + T2d = W[9]; + T2f = FMA(T2d, T2e, T2c); + T4y = FNMS(T2d, T2b, T4x); + } + { + E T2u, T2x, T2v, T4G, T2t, T2w; + T2u = Ip[WS(rs, 6)]; + T2x = Im[WS(rs, 6)]; + T2t = W[24]; + T2v = T2t * T2u; + T4G = T2t * T2x; + T2w = W[25]; + T2y = FMA(T2w, T2x, T2v); + T4H = FNMS(T2w, T2u, T4G); + } + { + E T2h, T2k, T2i, T4z, T2g, T2j; + T2h = Ip[WS(rs, 10)]; + T2k = Im[WS(rs, 10)]; + T2g = W[40]; + T2i = T2g * T2h; + T4z = T2g * T2k; + T2j = W[41]; + T2l = FMA(T2j, T2k, T2i); + T4A = FNMS(T2j, T2h, T4z); + } + { + E T2o, T2r, T2p, T4E, T2n, T2q; + T2o = Ip[WS(rs, 14)]; + T2r = Im[WS(rs, 14)]; + T2n = W[56]; + T2p = T2n * T2o; + T4E = T2n * T2r; + T2q = W[57]; + T2s = FMA(T2q, T2r, T2p); + T4F = FNMS(T2q, T2o, T4E); + } + { + E T2m, T2z, T71, T72; + T2m = T2f + T2l; + T2z = T2s + T2y; + T2A = T2m + T2z; + T6Y = T2z - T2m; + T71 = T4y + T4A; + T72 = T4F + T4H; + T73 = T71 - T72; + T7J = T71 + T72; + } + { + E T4w, T4B, T4D, T4I; + T4w = T2f - T2l; + T4B = T4y - T4A; + T4C = T4w + T4B; + T4T = T4B - T4w; + T4D = T2s - T2y; + T4I = T4F - T4H; + T4J = T4D - T4I; + T4U = T4D + T4I; + } + } + { + E TO, T7C, T7Z, T80, T89, T8e, T1H, T8d, T3v, T8b, T7L, T7T, T7Q, T7U, T7F; + E T81; + { + E Tm, TN, T7X, T7Y; + Tm = T8 + Tl; + TN = Tz + TM; + TO = Tm + TN; + T7C = Tm - TN; + T7X = T7I + T7J; + T7Y = T7N + T7O; + T7Z = T7X - T7Y; + T80 = T7X + T7Y; + } + { + E T82, T88, T1f, T1G; + T82 = T6F + T6G; + T88 = T83 + T87; + T89 = T82 + T88; + T8e = T88 - T82; + T1f = T11 + T1e; + T1G = T1s + T1F; + T1H = T1f + T1G; + T8d = T1G - T1f; + } + { + E T2B, T3u, T7H, T7K; + T2B = T29 + T2A; + T3u = T32 + T3t; + T3v = T2B + T3u; + T8b = T3u - T2B; + T7H = T29 - T2A; + T7K = T7I - T7J; + T7L = T7H + T7K; + T7T = T7K - T7H; + } + { + E T7M, T7P, T7D, T7E; + T7M = T32 - T3t; + T7P = T7N - T7O; + T7Q = T7M - T7P; + T7U = T7M + T7P; + T7D = T6J + T6K; + T7E = T6P + T6Q; + T7F = T7D - T7E; + T81 = T7D + T7E; + } + { + E T1I, T8a, T7W, T8c; + T1I = TO + T1H; + Rm[WS(rs, 15)] = T1I - T3v; + Rp[0] = T1I + T3v; + T8a = T81 + T89; + Im[WS(rs, 15)] = T80 - T8a; + Ip[0] = T80 + T8a; + T7W = TO - T1H; + Rm[WS(rs, 7)] = T7W - T7Z; + Rp[WS(rs, 8)] = T7W + T7Z; + T8c = T89 - T81; + Im[WS(rs, 7)] = T8b - T8c; + Ip[WS(rs, 8)] = T8b + T8c; + } + { + E T7G, T7R, T8f, T8g; + T7G = T7C + T7F; + T7R = T7L + T7Q; + Rm[WS(rs, 11)] = FNMS(KP707106781, T7R, T7G); + Rp[WS(rs, 4)] = FMA(KP707106781, T7R, T7G); + T8f = T8d + T8e; + T8g = T7T + T7U; + Im[WS(rs, 11)] = FMS(KP707106781, T8g, T8f); + Ip[WS(rs, 4)] = FMA(KP707106781, T8g, T8f); + } + { + E T7S, T7V, T8h, T8i; + T7S = T7C - T7F; + T7V = T7T - T7U; + Rm[WS(rs, 3)] = FNMS(KP707106781, T7V, T7S); + Rp[WS(rs, 12)] = FMA(KP707106781, T7V, T7S); + T8h = T8e - T8d; + T8i = T7Q - T7L; + Im[WS(rs, 3)] = FMS(KP707106781, T8i, T8h); + Ip[WS(rs, 12)] = FMA(KP707106781, T8i, T8h); + } + } + { + E T6I, T7m, T7w, T7A, T8l, T8r, T6T, T8m, T75, T7j, T7p, T8s, T7t, T7z, T7g; + E T7k; + { + E T6E, T6H, T7u, T7v; + T6E = T8 - Tl; + T6H = T6F - T6G; + T6I = T6E - T6H; + T7m = T6E + T6H; + T7u = T7b + T7e; + T7v = T79 + T76; + T7w = FNMS(KP414213562, T7v, T7u); + T7A = FMA(KP414213562, T7u, T7v); + } + { + E T8j, T8k, T6N, T6S; + T8j = TM - Tz; + T8k = T87 - T83; + T8l = T8j + T8k; + T8r = T8k - T8j; + T6N = T6L - T6M; + T6S = T6O + T6R; + T6T = T6N - T6S; + T8m = T6N + T6S; + } + { + E T6Z, T74, T7n, T7o; + T6Z = T6X - T6Y; + T74 = T70 - T73; + T75 = FMA(KP414213562, T74, T6Z); + T7j = FNMS(KP414213562, T6Z, T74); + T7n = T6M + T6L; + T7o = T6O - T6R; + T7p = T7n + T7o; + T8s = T7o - T7n; + } + { + E T7r, T7s, T7a, T7f; + T7r = T70 + T73; + T7s = T6X + T6Y; + T7t = FMA(KP414213562, T7s, T7r); + T7z = FNMS(KP414213562, T7r, T7s); + T7a = T76 - T79; + T7f = T7b - T7e; + T7g = FMA(KP414213562, T7f, T7a); + T7k = FNMS(KP414213562, T7a, T7f); + } + { + E T6U, T7h, T8t, T8u; + T6U = FMA(KP707106781, T6T, T6I); + T7h = T75 + T7g; + Rm[WS(rs, 9)] = FNMS(KP923879532, T7h, T6U); + Rp[WS(rs, 6)] = FMA(KP923879532, T7h, T6U); + T8t = FMA(KP707106781, T8s, T8r); + T8u = T7k - T7j; + Im[WS(rs, 9)] = FMS(KP923879532, T8u, T8t); + Ip[WS(rs, 6)] = FMA(KP923879532, T8u, T8t); + } + { + E T7i, T7l, T8v, T8w; + T7i = FNMS(KP707106781, T6T, T6I); + T7l = T7j + T7k; + Rp[WS(rs, 14)] = FNMS(KP923879532, T7l, T7i); + Rm[WS(rs, 1)] = FMA(KP923879532, T7l, T7i); + T8v = FNMS(KP707106781, T8s, T8r); + T8w = T7g - T75; + Im[WS(rs, 1)] = FMS(KP923879532, T8w, T8v); + Ip[WS(rs, 14)] = FMA(KP923879532, T8w, T8v); + } + { + E T7q, T7x, T8n, T8o; + T7q = FMA(KP707106781, T7p, T7m); + T7x = T7t + T7w; + Rm[WS(rs, 13)] = FNMS(KP923879532, T7x, T7q); + Rp[WS(rs, 2)] = FMA(KP923879532, T7x, T7q); + T8n = FMA(KP707106781, T8m, T8l); + T8o = T7z + T7A; + Im[WS(rs, 13)] = FMS(KP923879532, T8o, T8n); + Ip[WS(rs, 2)] = FMA(KP923879532, T8o, T8n); + } + { + E T7y, T7B, T8p, T8q; + T7y = FNMS(KP707106781, T7p, T7m); + T7B = T7z - T7A; + Rm[WS(rs, 5)] = FNMS(KP923879532, T7B, T7y); + Rp[WS(rs, 10)] = FMA(KP923879532, T7B, T7y); + T8p = FNMS(KP707106781, T8m, T8l); + T8q = T7w - T7t; + Im[WS(rs, 5)] = FMS(KP923879532, T8q, T8p); + Ip[WS(rs, 10)] = FMA(KP923879532, T8q, T8p); + } + } + { + E T3S, T5C, T4n, T8I, T8B, T8H, T5F, T8C, T5w, T5Q, T5A, T5M, T4X, T5P, T5z; + E T5J; + { + E T3C, T3R, T5D, T5E; + T3C = T3w + T3B; + T3R = T3J + T3Q; + T3S = FMA(KP707106781, T3R, T3C); + T5C = FNMS(KP707106781, T3R, T3C); + { + E T47, T4m, T8z, T8A; + T47 = FMA(KP414213562, T46, T3Z); + T4m = FNMS(KP414213562, T4l, T4e); + T4n = T47 + T4m; + T8I = T4m - T47; + T8z = T8x - T8y; + T8A = T5T + T5U; + T8B = FMA(KP707106781, T8A, T8z); + T8H = FNMS(KP707106781, T8A, T8z); + } + T5D = FNMS(KP414213562, T3Z, T46); + T5E = FMA(KP414213562, T4e, T4l); + T5F = T5D - T5E; + T8C = T5D + T5E; + { + E T5k, T5K, T5v, T5L, T5j, T5u; + T5j = T5b + T5i; + T5k = FMA(KP707106781, T5j, T54); + T5K = FNMS(KP707106781, T5j, T54); + T5u = T5s + T5t; + T5v = FMA(KP707106781, T5u, T5r); + T5L = FNMS(KP707106781, T5u, T5r); + T5w = FNMS(KP198912367, T5v, T5k); + T5Q = FNMS(KP668178637, T5K, T5L); + T5A = FMA(KP198912367, T5k, T5v); + T5M = FMA(KP668178637, T5L, T5K); + } + { + E T4L, T5H, T4W, T5I, T4K, T4V; + T4K = T4C + T4J; + T4L = FMA(KP707106781, T4K, T4v); + T5H = FNMS(KP707106781, T4K, T4v); + T4V = T4T + T4U; + T4W = FMA(KP707106781, T4V, T4S); + T5I = FNMS(KP707106781, T4V, T4S); + T4X = FMA(KP198912367, T4W, T4L); + T5P = FMA(KP668178637, T5H, T5I); + T5z = FNMS(KP198912367, T4L, T4W); + T5J = FNMS(KP668178637, T5I, T5H); + } + } + { + E T4o, T5x, T8D, T8E; + T4o = FMA(KP923879532, T4n, T3S); + T5x = T4X + T5w; + Rm[WS(rs, 14)] = FNMS(KP980785280, T5x, T4o); + Rp[WS(rs, 1)] = FMA(KP980785280, T5x, T4o); + T8D = FMA(KP923879532, T8C, T8B); + T8E = T5z + T5A; + Im[WS(rs, 14)] = FMS(KP980785280, T8E, T8D); + Ip[WS(rs, 1)] = FMA(KP980785280, T8E, T8D); + } + { + E T5y, T5B, T8F, T8G; + T5y = FNMS(KP923879532, T4n, T3S); + T5B = T5z - T5A; + Rm[WS(rs, 6)] = FNMS(KP980785280, T5B, T5y); + Rp[WS(rs, 9)] = FMA(KP980785280, T5B, T5y); + T8F = FNMS(KP923879532, T8C, T8B); + T8G = T5w - T4X; + Im[WS(rs, 6)] = FMS(KP980785280, T8G, T8F); + Ip[WS(rs, 9)] = FMA(KP980785280, T8G, T8F); + } + { + E T5G, T5N, T8L, T8M; + T5G = FNMS(KP923879532, T5F, T5C); + T5N = T5J + T5M; + Rp[WS(rs, 13)] = FNMS(KP831469612, T5N, T5G); + Rm[WS(rs, 2)] = FMA(KP831469612, T5N, T5G); + T8L = FNMS(KP923879532, T8I, T8H); + T8M = T5P + T5Q; + Im[WS(rs, 2)] = -(FMA(KP831469612, T8M, T8L)); + Ip[WS(rs, 13)] = FNMS(KP831469612, T8M, T8L); + } + { + E T5O, T5R, T8J, T8K; + T5O = FMA(KP923879532, T5F, T5C); + T5R = T5P - T5Q; + Rm[WS(rs, 10)] = FNMS(KP831469612, T5R, T5O); + Rp[WS(rs, 5)] = FMA(KP831469612, T5R, T5O); + T8J = FMA(KP923879532, T8I, T8H); + T8K = T5M - T5J; + Im[WS(rs, 10)] = FMS(KP831469612, T8K, T8J); + Ip[WS(rs, 5)] = FMA(KP831469612, T8K, T8J); + } + } + { + E T5W, T6o, T63, T8W, T8P, T8V, T6r, T8Q, T6i, T6C, T6m, T6y, T6b, T6B, T6l; + E T6v; + { + E T5S, T5V, T6p, T6q; + T5S = T3w - T3B; + T5V = T5T - T5U; + T5W = FMA(KP707106781, T5V, T5S); + T6o = FNMS(KP707106781, T5V, T5S); + { + E T5Z, T62, T8N, T8O; + T5Z = FMA(KP414213562, T5Y, T5X); + T62 = FNMS(KP414213562, T61, T60); + T63 = T5Z - T62; + T8W = T5Z + T62; + T8N = T8y + T8x; + T8O = T3Q - T3J; + T8P = FMA(KP707106781, T8O, T8N); + T8V = FNMS(KP707106781, T8O, T8N); + } + T6p = FNMS(KP414213562, T5X, T5Y); + T6q = FMA(KP414213562, T60, T61); + T6r = T6p + T6q; + T8Q = T6q - T6p; + { + E T6e, T6x, T6h, T6w, T6d, T6g; + T6d = T5t - T5s; + T6e = FNMS(KP707106781, T6d, T6c); + T6x = FMA(KP707106781, T6d, T6c); + T6g = T5i - T5b; + T6h = FNMS(KP707106781, T6g, T6f); + T6w = FMA(KP707106781, T6g, T6f); + T6i = FMA(KP668178637, T6h, T6e); + T6C = FNMS(KP198912367, T6w, T6x); + T6m = FNMS(KP668178637, T6e, T6h); + T6y = FMA(KP198912367, T6x, T6w); + } + { + E T67, T6u, T6a, T6t, T66, T69; + T66 = T4U - T4T; + T67 = FNMS(KP707106781, T66, T65); + T6u = FMA(KP707106781, T66, T65); + T69 = T4C - T4J; + T6a = FNMS(KP707106781, T69, T68); + T6t = FMA(KP707106781, T69, T68); + T6b = FMA(KP668178637, T6a, T67); + T6B = FNMS(KP198912367, T6t, T6u); + T6l = FNMS(KP668178637, T67, T6a); + T6v = FMA(KP198912367, T6u, T6t); + } + } + { + E T64, T6j, T8R, T8S; + T64 = FMA(KP923879532, T63, T5W); + T6j = T6b + T6i; + Rm[WS(rs, 12)] = FNMS(KP831469612, T6j, T64); + Rp[WS(rs, 3)] = FMA(KP831469612, T6j, T64); + T8R = FMA(KP923879532, T8Q, T8P); + T8S = T6l - T6m; + Im[WS(rs, 12)] = FMS(KP831469612, T8S, T8R); + Ip[WS(rs, 3)] = FMA(KP831469612, T8S, T8R); + } + { + E T6k, T6n, T8T, T8U; + T6k = FNMS(KP923879532, T63, T5W); + T6n = T6l + T6m; + Rm[WS(rs, 4)] = FNMS(KP831469612, T6n, T6k); + Rp[WS(rs, 11)] = FMA(KP831469612, T6n, T6k); + T8T = FNMS(KP923879532, T8Q, T8P); + T8U = T6i - T6b; + Im[WS(rs, 4)] = FMS(KP831469612, T8U, T8T); + Ip[WS(rs, 11)] = FMA(KP831469612, T8U, T8T); + } + { + E T6s, T6z, T8X, T8Y; + T6s = FNMS(KP923879532, T6r, T6o); + T6z = T6v + T6y; + Rm[WS(rs, 8)] = FNMS(KP980785280, T6z, T6s); + Rp[WS(rs, 7)] = FMA(KP980785280, T6z, T6s); + T8X = FNMS(KP923879532, T8W, T8V); + T8Y = T6C - T6B; + Im[WS(rs, 8)] = FMS(KP980785280, T8Y, T8X); + Ip[WS(rs, 7)] = FMA(KP980785280, T8Y, T8X); + } + { + E T6A, T6D, T8Z, T90; + T6A = FMA(KP923879532, T6r, T6o); + T6D = T6B + T6C; + Rp[WS(rs, 15)] = FNMS(KP980785280, T6D, T6A); + Rm[0] = FMA(KP980785280, T6D, T6A); + T8Z = FMA(KP923879532, T8W, T8V); + T90 = T6y - T6v; + Im[0] = FMS(KP980785280, T90, T8Z); + Ip[WS(rs, 15)] = FMA(KP980785280, T90, T8Z); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cf_32", twinstr, &GENUS, {236, 62, 198, 0} }; + +void X(codelet_hc2cf_32) (planner *p) { + X(khc2c_register) (p, hc2cf_32, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 32 -dit -name hc2cf_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 340 additions, 114 multiplications, 94 fused multiply/add), + * 96 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tj, T5F, T7C, T7Q, T35, T4T, T78, T7m, T1Q, T61, T5Y, T6J, T3K, T59, T41; + E T56, T2B, T67, T6e, T6O, T4b, T5d, T4s, T5g, TG, T7l, T5I, T73, T3a, T4U; + E T3f, T4V, T14, T5N, T5M, T6E, T3m, T4Y, T3r, T4Z, T1r, T5P, T5S, T6F, T3x; + E T51, T3C, T52, T2d, T5Z, T64, T6K, T3V, T57, T44, T5a, T2Y, T6f, T6a, T6P; + E T4m, T5h, T4v, T5e; + { + E T1, T76, T6, T75, Tc, T32, Th, T33; + T1 = Rp[0]; + T76 = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Rp[WS(rs, 8)]; + T5 = Rm[WS(rs, 8)]; + T2 = W[30]; + T4 = W[31]; + T6 = FMA(T2, T3, T4 * T5); + T75 = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = Rp[WS(rs, 4)]; + Tb = Rm[WS(rs, 4)]; + T8 = W[14]; + Ta = W[15]; + Tc = FMA(T8, T9, Ta * Tb); + T32 = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = Rp[WS(rs, 12)]; + Tg = Rm[WS(rs, 12)]; + Td = W[46]; + Tf = W[47]; + Th = FMA(Td, Te, Tf * Tg); + T33 = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, T7A, T7B; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 + Ti; + T5F = T7 - Ti; + T7A = T76 - T75; + T7B = Tc - Th; + T7C = T7A - T7B; + T7Q = T7B + T7A; + } + { + E T31, T34, T74, T77; + T31 = T1 - T6; + T34 = T32 - T33; + T35 = T31 - T34; + T4T = T31 + T34; + T74 = T32 + T33; + T77 = T75 + T76; + T78 = T74 + T77; + T7m = T77 - T74; + } + } + { + E T1y, T3G, T1O, T3Z, T1D, T3H, T1J, T3Y; + { + E T1v, T1x, T1u, T1w; + T1v = Ip[0]; + T1x = Im[0]; + T1u = W[0]; + T1w = W[1]; + T1y = FMA(T1u, T1v, T1w * T1x); + T3G = FNMS(T1w, T1v, T1u * T1x); + } + { + E T1L, T1N, T1K, T1M; + T1L = Ip[WS(rs, 12)]; + T1N = Im[WS(rs, 12)]; + T1K = W[48]; + T1M = W[49]; + T1O = FMA(T1K, T1L, T1M * T1N); + T3Z = FNMS(T1M, T1L, T1K * T1N); + } + { + E T1A, T1C, T1z, T1B; + T1A = Ip[WS(rs, 8)]; + T1C = Im[WS(rs, 8)]; + T1z = W[32]; + T1B = W[33]; + T1D = FMA(T1z, T1A, T1B * T1C); + T3H = FNMS(T1B, T1A, T1z * T1C); + } + { + E T1G, T1I, T1F, T1H; + T1G = Ip[WS(rs, 4)]; + T1I = Im[WS(rs, 4)]; + T1F = W[16]; + T1H = W[17]; + T1J = FMA(T1F, T1G, T1H * T1I); + T3Y = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1E, T1P, T5W, T5X; + T1E = T1y + T1D; + T1P = T1J + T1O; + T1Q = T1E + T1P; + T61 = T1E - T1P; + T5W = T3G + T3H; + T5X = T3Y + T3Z; + T5Y = T5W - T5X; + T6J = T5W + T5X; + } + { + E T3I, T3J, T3X, T40; + T3I = T3G - T3H; + T3J = T1J - T1O; + T3K = T3I + T3J; + T59 = T3I - T3J; + T3X = T1y - T1D; + T40 = T3Y - T3Z; + T41 = T3X - T40; + T56 = T3X + T40; + } + } + { + E T2j, T4o, T2z, T49, T2o, T4p, T2u, T48; + { + E T2g, T2i, T2f, T2h; + T2g = Ip[WS(rs, 15)]; + T2i = Im[WS(rs, 15)]; + T2f = W[60]; + T2h = W[61]; + T2j = FMA(T2f, T2g, T2h * T2i); + T4o = FNMS(T2h, T2g, T2f * T2i); + } + { + E T2w, T2y, T2v, T2x; + T2w = Ip[WS(rs, 11)]; + T2y = Im[WS(rs, 11)]; + T2v = W[44]; + T2x = W[45]; + T2z = FMA(T2v, T2w, T2x * T2y); + T49 = FNMS(T2x, T2w, T2v * T2y); + } + { + E T2l, T2n, T2k, T2m; + T2l = Ip[WS(rs, 7)]; + T2n = Im[WS(rs, 7)]; + T2k = W[28]; + T2m = W[29]; + T2o = FMA(T2k, T2l, T2m * T2n); + T4p = FNMS(T2m, T2l, T2k * T2n); + } + { + E T2r, T2t, T2q, T2s; + T2r = Ip[WS(rs, 3)]; + T2t = Im[WS(rs, 3)]; + T2q = W[12]; + T2s = W[13]; + T2u = FMA(T2q, T2r, T2s * T2t); + T48 = FNMS(T2s, T2r, T2q * T2t); + } + { + E T2p, T2A, T6c, T6d; + T2p = T2j + T2o; + T2A = T2u + T2z; + T2B = T2p + T2A; + T67 = T2p - T2A; + T6c = T4o + T4p; + T6d = T48 + T49; + T6e = T6c - T6d; + T6O = T6c + T6d; + } + { + E T47, T4a, T4q, T4r; + T47 = T2j - T2o; + T4a = T48 - T49; + T4b = T47 - T4a; + T5d = T47 + T4a; + T4q = T4o - T4p; + T4r = T2u - T2z; + T4s = T4q + T4r; + T5g = T4q - T4r; + } + } + { + E To, T36, TE, T3d, Tt, T37, Tz, T3c; + { + E Tl, Tn, Tk, Tm; + Tl = Rp[WS(rs, 2)]; + Tn = Rm[WS(rs, 2)]; + Tk = W[6]; + Tm = W[7]; + To = FMA(Tk, Tl, Tm * Tn); + T36 = FNMS(Tm, Tl, Tk * Tn); + } + { + E TB, TD, TA, TC; + TB = Rp[WS(rs, 6)]; + TD = Rm[WS(rs, 6)]; + TA = W[22]; + TC = W[23]; + TE = FMA(TA, TB, TC * TD); + T3d = FNMS(TC, TB, TA * TD); + } + { + E Tq, Ts, Tp, Tr; + Tq = Rp[WS(rs, 10)]; + Ts = Rm[WS(rs, 10)]; + Tp = W[38]; + Tr = W[39]; + Tt = FMA(Tp, Tq, Tr * Ts); + T37 = FNMS(Tr, Tq, Tp * Ts); + } + { + E Tw, Ty, Tv, Tx; + Tw = Rp[WS(rs, 14)]; + Ty = Rm[WS(rs, 14)]; + Tv = W[54]; + Tx = W[55]; + Tz = FMA(Tv, Tw, Tx * Ty); + T3c = FNMS(Tx, Tw, Tv * Ty); + } + { + E Tu, TF, T5G, T5H; + Tu = To + Tt; + TF = Tz + TE; + TG = Tu + TF; + T7l = TF - Tu; + T5G = T36 + T37; + T5H = T3c + T3d; + T5I = T5G - T5H; + T73 = T5G + T5H; + } + { + E T38, T39, T3b, T3e; + T38 = T36 - T37; + T39 = To - Tt; + T3a = T38 - T39; + T4U = T39 + T38; + T3b = Tz - TE; + T3e = T3c - T3d; + T3f = T3b + T3e; + T4V = T3b - T3e; + } + } + { + E TM, T3i, T12, T3p, TR, T3j, TX, T3o; + { + E TJ, TL, TI, TK; + TJ = Rp[WS(rs, 1)]; + TL = Rm[WS(rs, 1)]; + TI = W[2]; + TK = W[3]; + TM = FMA(TI, TJ, TK * TL); + T3i = FNMS(TK, TJ, TI * TL); + } + { + E TZ, T11, TY, T10; + TZ = Rp[WS(rs, 13)]; + T11 = Rm[WS(rs, 13)]; + TY = W[50]; + T10 = W[51]; + T12 = FMA(TY, TZ, T10 * T11); + T3p = FNMS(T10, TZ, TY * T11); + } + { + E TO, TQ, TN, TP; + TO = Rp[WS(rs, 9)]; + TQ = Rm[WS(rs, 9)]; + TN = W[34]; + TP = W[35]; + TR = FMA(TN, TO, TP * TQ); + T3j = FNMS(TP, TO, TN * TQ); + } + { + E TU, TW, TT, TV; + TU = Rp[WS(rs, 5)]; + TW = Rm[WS(rs, 5)]; + TT = W[18]; + TV = W[19]; + TX = FMA(TT, TU, TV * TW); + T3o = FNMS(TV, TU, TT * TW); + } + { + E TS, T13, T5K, T5L; + TS = TM + TR; + T13 = TX + T12; + T14 = TS + T13; + T5N = TS - T13; + T5K = T3i + T3j; + T5L = T3o + T3p; + T5M = T5K - T5L; + T6E = T5K + T5L; + } + { + E T3k, T3l, T3n, T3q; + T3k = T3i - T3j; + T3l = TX - T12; + T3m = T3k + T3l; + T4Y = T3k - T3l; + T3n = TM - TR; + T3q = T3o - T3p; + T3r = T3n - T3q; + T4Z = T3n + T3q; + } + } + { + E T19, T3t, T1p, T3A, T1e, T3u, T1k, T3z; + { + E T16, T18, T15, T17; + T16 = Rp[WS(rs, 15)]; + T18 = Rm[WS(rs, 15)]; + T15 = W[58]; + T17 = W[59]; + T19 = FMA(T15, T16, T17 * T18); + T3t = FNMS(T17, T16, T15 * T18); + } + { + E T1m, T1o, T1l, T1n; + T1m = Rp[WS(rs, 11)]; + T1o = Rm[WS(rs, 11)]; + T1l = W[42]; + T1n = W[43]; + T1p = FMA(T1l, T1m, T1n * T1o); + T3A = FNMS(T1n, T1m, T1l * T1o); + } + { + E T1b, T1d, T1a, T1c; + T1b = Rp[WS(rs, 7)]; + T1d = Rm[WS(rs, 7)]; + T1a = W[26]; + T1c = W[27]; + T1e = FMA(T1a, T1b, T1c * T1d); + T3u = FNMS(T1c, T1b, T1a * T1d); + } + { + E T1h, T1j, T1g, T1i; + T1h = Rp[WS(rs, 3)]; + T1j = Rm[WS(rs, 3)]; + T1g = W[10]; + T1i = W[11]; + T1k = FMA(T1g, T1h, T1i * T1j); + T3z = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1f, T1q, T5Q, T5R; + T1f = T19 + T1e; + T1q = T1k + T1p; + T1r = T1f + T1q; + T5P = T1f - T1q; + T5Q = T3t + T3u; + T5R = T3z + T3A; + T5S = T5Q - T5R; + T6F = T5Q + T5R; + } + { + E T3v, T3w, T3y, T3B; + T3v = T3t - T3u; + T3w = T1k - T1p; + T3x = T3v + T3w; + T51 = T3v - T3w; + T3y = T19 - T1e; + T3B = T3z - T3A; + T3C = T3y - T3B; + T52 = T3y + T3B; + } + } + { + E T1V, T3R, T20, T3S, T3Q, T3T, T26, T3M, T2b, T3N, T3L, T3O; + { + E T1S, T1U, T1R, T1T; + T1S = Ip[WS(rs, 2)]; + T1U = Im[WS(rs, 2)]; + T1R = W[8]; + T1T = W[9]; + T1V = FMA(T1R, T1S, T1T * T1U); + T3R = FNMS(T1T, T1S, T1R * T1U); + } + { + E T1X, T1Z, T1W, T1Y; + T1X = Ip[WS(rs, 10)]; + T1Z = Im[WS(rs, 10)]; + T1W = W[40]; + T1Y = W[41]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T3S = FNMS(T1Y, T1X, T1W * T1Z); + } + T3Q = T1V - T20; + T3T = T3R - T3S; + { + E T23, T25, T22, T24; + T23 = Ip[WS(rs, 14)]; + T25 = Im[WS(rs, 14)]; + T22 = W[56]; + T24 = W[57]; + T26 = FMA(T22, T23, T24 * T25); + T3M = FNMS(T24, T23, T22 * T25); + } + { + E T28, T2a, T27, T29; + T28 = Ip[WS(rs, 6)]; + T2a = Im[WS(rs, 6)]; + T27 = W[24]; + T29 = W[25]; + T2b = FMA(T27, T28, T29 * T2a); + T3N = FNMS(T29, T28, T27 * T2a); + } + T3L = T26 - T2b; + T3O = T3M - T3N; + { + E T21, T2c, T62, T63; + T21 = T1V + T20; + T2c = T26 + T2b; + T2d = T21 + T2c; + T5Z = T2c - T21; + T62 = T3R + T3S; + T63 = T3M + T3N; + T64 = T62 - T63; + T6K = T62 + T63; + } + { + E T3P, T3U, T42, T43; + T3P = T3L - T3O; + T3U = T3Q + T3T; + T3V = KP707106781 * (T3P - T3U); + T57 = KP707106781 * (T3U + T3P); + T42 = T3T - T3Q; + T43 = T3L + T3O; + T44 = KP707106781 * (T42 - T43); + T5a = KP707106781 * (T42 + T43); + } + } + { + E T2G, T4c, T2L, T4d, T4e, T4f, T2R, T4i, T2W, T4j, T4h, T4k; + { + E T2D, T2F, T2C, T2E; + T2D = Ip[WS(rs, 1)]; + T2F = Im[WS(rs, 1)]; + T2C = W[4]; + T2E = W[5]; + T2G = FMA(T2C, T2D, T2E * T2F); + T4c = FNMS(T2E, T2D, T2C * T2F); + } + { + E T2I, T2K, T2H, T2J; + T2I = Ip[WS(rs, 9)]; + T2K = Im[WS(rs, 9)]; + T2H = W[36]; + T2J = W[37]; + T2L = FMA(T2H, T2I, T2J * T2K); + T4d = FNMS(T2J, T2I, T2H * T2K); + } + T4e = T4c - T4d; + T4f = T2G - T2L; + { + E T2O, T2Q, T2N, T2P; + T2O = Ip[WS(rs, 13)]; + T2Q = Im[WS(rs, 13)]; + T2N = W[52]; + T2P = W[53]; + T2R = FMA(T2N, T2O, T2P * T2Q); + T4i = FNMS(T2P, T2O, T2N * T2Q); + } + { + E T2T, T2V, T2S, T2U; + T2T = Ip[WS(rs, 5)]; + T2V = Im[WS(rs, 5)]; + T2S = W[20]; + T2U = W[21]; + T2W = FMA(T2S, T2T, T2U * T2V); + T4j = FNMS(T2U, T2T, T2S * T2V); + } + T4h = T2R - T2W; + T4k = T4i - T4j; + { + E T2M, T2X, T68, T69; + T2M = T2G + T2L; + T2X = T2R + T2W; + T2Y = T2M + T2X; + T6f = T2X - T2M; + T68 = T4c + T4d; + T69 = T4i + T4j; + T6a = T68 - T69; + T6P = T68 + T69; + } + { + E T4g, T4l, T4t, T4u; + T4g = T4e - T4f; + T4l = T4h + T4k; + T4m = KP707106781 * (T4g - T4l); + T5h = KP707106781 * (T4g + T4l); + T4t = T4h - T4k; + T4u = T4f + T4e; + T4v = KP707106781 * (T4t - T4u); + T5e = KP707106781 * (T4u + T4t); + } + } + { + E T1t, T6X, T7a, T7c, T30, T7b, T70, T71; + { + E TH, T1s, T72, T79; + TH = Tj + TG; + T1s = T14 + T1r; + T1t = TH + T1s; + T6X = TH - T1s; + T72 = T6E + T6F; + T79 = T73 + T78; + T7a = T72 + T79; + T7c = T79 - T72; + } + { + E T2e, T2Z, T6Y, T6Z; + T2e = T1Q + T2d; + T2Z = T2B + T2Y; + T30 = T2e + T2Z; + T7b = T2Z - T2e; + T6Y = T6J + T6K; + T6Z = T6O + T6P; + T70 = T6Y - T6Z; + T71 = T6Y + T6Z; + } + Rm[WS(rs, 15)] = T1t - T30; + Im[WS(rs, 15)] = T71 - T7a; + Rp[0] = T1t + T30; + Ip[0] = T71 + T7a; + Rm[WS(rs, 7)] = T6X - T70; + Im[WS(rs, 7)] = T7b - T7c; + Rp[WS(rs, 8)] = T6X + T70; + Ip[WS(rs, 8)] = T7b + T7c; + } + { + E T6H, T6T, T7g, T7i, T6M, T6U, T6R, T6V; + { + E T6D, T6G, T7e, T7f; + T6D = Tj - TG; + T6G = T6E - T6F; + T6H = T6D + T6G; + T6T = T6D - T6G; + T7e = T1r - T14; + T7f = T78 - T73; + T7g = T7e + T7f; + T7i = T7f - T7e; + } + { + E T6I, T6L, T6N, T6Q; + T6I = T1Q - T2d; + T6L = T6J - T6K; + T6M = T6I + T6L; + T6U = T6L - T6I; + T6N = T2B - T2Y; + T6Q = T6O - T6P; + T6R = T6N - T6Q; + T6V = T6N + T6Q; + } + { + E T6S, T7d, T6W, T7h; + T6S = KP707106781 * (T6M + T6R); + Rm[WS(rs, 11)] = T6H - T6S; + Rp[WS(rs, 4)] = T6H + T6S; + T7d = KP707106781 * (T6U + T6V); + Im[WS(rs, 11)] = T7d - T7g; + Ip[WS(rs, 4)] = T7d + T7g; + T6W = KP707106781 * (T6U - T6V); + Rm[WS(rs, 3)] = T6T - T6W; + Rp[WS(rs, 12)] = T6T + T6W; + T7h = KP707106781 * (T6R - T6M); + Im[WS(rs, 3)] = T7h - T7i; + Ip[WS(rs, 12)] = T7h + T7i; + } + } + { + E T5J, T7n, T7t, T6n, T5U, T7k, T6x, T6B, T6q, T7s, T66, T6k, T6u, T6A, T6h; + E T6l; + { + E T5O, T5T, T60, T65; + T5J = T5F - T5I; + T7n = T7l + T7m; + T7t = T7m - T7l; + T6n = T5F + T5I; + T5O = T5M - T5N; + T5T = T5P + T5S; + T5U = KP707106781 * (T5O - T5T); + T7k = KP707106781 * (T5O + T5T); + { + E T6v, T6w, T6o, T6p; + T6v = T67 + T6a; + T6w = T6e + T6f; + T6x = FNMS(KP382683432, T6w, KP923879532 * T6v); + T6B = FMA(KP923879532, T6w, KP382683432 * T6v); + T6o = T5N + T5M; + T6p = T5P - T5S; + T6q = KP707106781 * (T6o + T6p); + T7s = KP707106781 * (T6p - T6o); + } + T60 = T5Y - T5Z; + T65 = T61 - T64; + T66 = FMA(KP923879532, T60, KP382683432 * T65); + T6k = FNMS(KP923879532, T65, KP382683432 * T60); + { + E T6s, T6t, T6b, T6g; + T6s = T5Y + T5Z; + T6t = T61 + T64; + T6u = FMA(KP382683432, T6s, KP923879532 * T6t); + T6A = FNMS(KP382683432, T6t, KP923879532 * T6s); + T6b = T67 - T6a; + T6g = T6e - T6f; + T6h = FNMS(KP923879532, T6g, KP382683432 * T6b); + T6l = FMA(KP382683432, T6g, KP923879532 * T6b); + } + } + { + E T5V, T6i, T7r, T7u; + T5V = T5J + T5U; + T6i = T66 + T6h; + Rm[WS(rs, 9)] = T5V - T6i; + Rp[WS(rs, 6)] = T5V + T6i; + T7r = T6k + T6l; + T7u = T7s + T7t; + Im[WS(rs, 9)] = T7r - T7u; + Ip[WS(rs, 6)] = T7r + T7u; + } + { + E T6j, T6m, T7v, T7w; + T6j = T5J - T5U; + T6m = T6k - T6l; + Rm[WS(rs, 1)] = T6j - T6m; + Rp[WS(rs, 14)] = T6j + T6m; + T7v = T6h - T66; + T7w = T7t - T7s; + Im[WS(rs, 1)] = T7v - T7w; + Ip[WS(rs, 14)] = T7v + T7w; + } + { + E T6r, T6y, T7j, T7o; + T6r = T6n + T6q; + T6y = T6u + T6x; + Rm[WS(rs, 13)] = T6r - T6y; + Rp[WS(rs, 2)] = T6r + T6y; + T7j = T6A + T6B; + T7o = T7k + T7n; + Im[WS(rs, 13)] = T7j - T7o; + Ip[WS(rs, 2)] = T7j + T7o; + } + { + E T6z, T6C, T7p, T7q; + T6z = T6n - T6q; + T6C = T6A - T6B; + Rm[WS(rs, 5)] = T6z - T6C; + Rp[WS(rs, 10)] = T6z + T6C; + T7p = T6x - T6u; + T7q = T7n - T7k; + Im[WS(rs, 5)] = T7p - T7q; + Ip[WS(rs, 10)] = T7p + T7q; + } + } + { + E T3h, T4D, T7R, T7X, T3E, T7O, T4N, T4R, T46, T4A, T4G, T7W, T4K, T4Q, T4x; + E T4B, T3g, T7P; + T3g = KP707106781 * (T3a - T3f); + T3h = T35 - T3g; + T4D = T35 + T3g; + T7P = KP707106781 * (T4V - T4U); + T7R = T7P + T7Q; + T7X = T7Q - T7P; + { + E T3s, T3D, T4L, T4M; + T3s = FNMS(KP923879532, T3r, KP382683432 * T3m); + T3D = FMA(KP382683432, T3x, KP923879532 * T3C); + T3E = T3s - T3D; + T7O = T3s + T3D; + T4L = T4b + T4m; + T4M = T4s + T4v; + T4N = FNMS(KP555570233, T4M, KP831469612 * T4L); + T4R = FMA(KP831469612, T4M, KP555570233 * T4L); + } + { + E T3W, T45, T4E, T4F; + T3W = T3K - T3V; + T45 = T41 - T44; + T46 = FMA(KP980785280, T3W, KP195090322 * T45); + T4A = FNMS(KP980785280, T45, KP195090322 * T3W); + T4E = FMA(KP923879532, T3m, KP382683432 * T3r); + T4F = FNMS(KP923879532, T3x, KP382683432 * T3C); + T4G = T4E + T4F; + T7W = T4F - T4E; + } + { + E T4I, T4J, T4n, T4w; + T4I = T3K + T3V; + T4J = T41 + T44; + T4K = FMA(KP555570233, T4I, KP831469612 * T4J); + T4Q = FNMS(KP555570233, T4J, KP831469612 * T4I); + T4n = T4b - T4m; + T4w = T4s - T4v; + T4x = FNMS(KP980785280, T4w, KP195090322 * T4n); + T4B = FMA(KP195090322, T4w, KP980785280 * T4n); + } + { + E T3F, T4y, T7V, T7Y; + T3F = T3h + T3E; + T4y = T46 + T4x; + Rm[WS(rs, 8)] = T3F - T4y; + Rp[WS(rs, 7)] = T3F + T4y; + T7V = T4A + T4B; + T7Y = T7W + T7X; + Im[WS(rs, 8)] = T7V - T7Y; + Ip[WS(rs, 7)] = T7V + T7Y; + } + { + E T4z, T4C, T7Z, T80; + T4z = T3h - T3E; + T4C = T4A - T4B; + Rm[0] = T4z - T4C; + Rp[WS(rs, 15)] = T4z + T4C; + T7Z = T4x - T46; + T80 = T7X - T7W; + Im[0] = T7Z - T80; + Ip[WS(rs, 15)] = T7Z + T80; + } + { + E T4H, T4O, T7N, T7S; + T4H = T4D + T4G; + T4O = T4K + T4N; + Rm[WS(rs, 12)] = T4H - T4O; + Rp[WS(rs, 3)] = T4H + T4O; + T7N = T4Q + T4R; + T7S = T7O + T7R; + Im[WS(rs, 12)] = T7N - T7S; + Ip[WS(rs, 3)] = T7N + T7S; + } + { + E T4P, T4S, T7T, T7U; + T4P = T4D - T4G; + T4S = T4Q - T4R; + Rm[WS(rs, 4)] = T4P - T4S; + Rp[WS(rs, 11)] = T4P + T4S; + T7T = T4N - T4K; + T7U = T7R - T7O; + Im[WS(rs, 4)] = T7T - T7U; + Ip[WS(rs, 11)] = T7T + T7U; + } + } + { + E T4X, T5p, T7D, T7J, T54, T7y, T5z, T5D, T5c, T5m, T5s, T7I, T5w, T5C, T5j; + E T5n, T4W, T7z; + T4W = KP707106781 * (T4U + T4V); + T4X = T4T - T4W; + T5p = T4T + T4W; + T7z = KP707106781 * (T3a + T3f); + T7D = T7z + T7C; + T7J = T7C - T7z; + { + E T50, T53, T5x, T5y; + T50 = FNMS(KP382683432, T4Z, KP923879532 * T4Y); + T53 = FMA(KP923879532, T51, KP382683432 * T52); + T54 = T50 - T53; + T7y = T50 + T53; + T5x = T5d + T5e; + T5y = T5g + T5h; + T5z = FNMS(KP195090322, T5y, KP980785280 * T5x); + T5D = FMA(KP195090322, T5x, KP980785280 * T5y); + } + { + E T58, T5b, T5q, T5r; + T58 = T56 - T57; + T5b = T59 - T5a; + T5c = FMA(KP555570233, T58, KP831469612 * T5b); + T5m = FNMS(KP831469612, T58, KP555570233 * T5b); + T5q = FMA(KP382683432, T4Y, KP923879532 * T4Z); + T5r = FNMS(KP382683432, T51, KP923879532 * T52); + T5s = T5q + T5r; + T7I = T5r - T5q; + } + { + E T5u, T5v, T5f, T5i; + T5u = T56 + T57; + T5v = T59 + T5a; + T5w = FMA(KP980785280, T5u, KP195090322 * T5v); + T5C = FNMS(KP195090322, T5u, KP980785280 * T5v); + T5f = T5d - T5e; + T5i = T5g - T5h; + T5j = FNMS(KP831469612, T5i, KP555570233 * T5f); + T5n = FMA(KP831469612, T5f, KP555570233 * T5i); + } + { + E T55, T5k, T7H, T7K; + T55 = T4X + T54; + T5k = T5c + T5j; + Rm[WS(rs, 10)] = T55 - T5k; + Rp[WS(rs, 5)] = T55 + T5k; + T7H = T5m + T5n; + T7K = T7I + T7J; + Im[WS(rs, 10)] = T7H - T7K; + Ip[WS(rs, 5)] = T7H + T7K; + } + { + E T5l, T5o, T7L, T7M; + T5l = T4X - T54; + T5o = T5m - T5n; + Rm[WS(rs, 2)] = T5l - T5o; + Rp[WS(rs, 13)] = T5l + T5o; + T7L = T5j - T5c; + T7M = T7J - T7I; + Im[WS(rs, 2)] = T7L - T7M; + Ip[WS(rs, 13)] = T7L + T7M; + } + { + E T5t, T5A, T7x, T7E; + T5t = T5p + T5s; + T5A = T5w + T5z; + Rm[WS(rs, 14)] = T5t - T5A; + Rp[WS(rs, 1)] = T5t + T5A; + T7x = T5C + T5D; + T7E = T7y + T7D; + Im[WS(rs, 14)] = T7x - T7E; + Ip[WS(rs, 1)] = T7x + T7E; + } + { + E T5B, T5E, T7F, T7G; + T5B = T5p - T5s; + T5E = T5C - T5D; + Rm[WS(rs, 6)] = T5B - T5E; + Rp[WS(rs, 9)] = T5B + T5E; + T7F = T5z - T5w; + T7G = T7D - T7y; + Im[WS(rs, 6)] = T7F - T7G; + Ip[WS(rs, 9)] = T7F + T7G; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cf_32", twinstr, &GENUS, {340, 114, 94, 0} }; + +void X(codelet_hc2cf_32) (planner *p) { + X(khc2c_register) (p, hc2cf_32, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_4.c new file mode 100644 index 000000000..e5ecaea3c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_4.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:55 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -dit -name hc2cf_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T1, Tv, T7, Tu, Te, To, Tk, Tq; + T1 = Rp[0]; + Tv = Rm[0]; + { + E T3, T6, T4, Tt, T2, T5; + T3 = Rp[WS(rs, 1)]; + T6 = Rm[WS(rs, 1)]; + T2 = W[2]; + T4 = T2 * T3; + Tt = T2 * T6; + T5 = W[3]; + T7 = FMA(T5, T6, T4); + Tu = FNMS(T5, T3, Tt); + } + { + E Ta, Td, Tb, Tn, T9, Tc; + Ta = Ip[0]; + Td = Im[0]; + T9 = W[0]; + Tb = T9 * Ta; + Tn = T9 * Td; + Tc = W[1]; + Te = FMA(Tc, Td, Tb); + To = FNMS(Tc, Ta, Tn); + } + { + E Tg, Tj, Th, Tp, Tf, Ti; + Tg = Ip[WS(rs, 1)]; + Tj = Im[WS(rs, 1)]; + Tf = W[4]; + Th = Tf * Tg; + Tp = Tf * Tj; + Ti = W[5]; + Tk = FMA(Ti, Tj, Th); + Tq = FNMS(Ti, Tg, Tp); + } + { + E T8, Tl, Ts, Tw; + T8 = T1 + T7; + Tl = Te + Tk; + Rm[WS(rs, 1)] = T8 - Tl; + Rp[0] = T8 + Tl; + Ts = To + Tq; + Tw = Tu + Tv; + Im[WS(rs, 1)] = Ts - Tw; + Ip[0] = Ts + Tw; + } + { + E Tm, Tr, Tx, Ty; + Tm = T1 - T7; + Tr = To - Tq; + Rm[0] = Tm - Tr; + Rp[WS(rs, 1)] = Tm + Tr; + Tx = Tk - Te; + Ty = Tv - Tu; + Im[0] = Tx - Ty; + Ip[WS(rs, 1)] = Tx + Ty; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cf_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hc2cf_4) (planner *p) { + X(khc2c_register) (p, hc2cf_4, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 4 -dit -name hc2cf_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T1, Tp, T6, To, Tc, Tk, Th, Tl; + T1 = Rp[0]; + Tp = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Rp[WS(rs, 1)]; + T5 = Rm[WS(rs, 1)]; + T2 = W[2]; + T4 = W[3]; + T6 = FMA(T2, T3, T4 * T5); + To = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = Ip[0]; + Tb = Im[0]; + T8 = W[0]; + Ta = W[1]; + Tc = FMA(T8, T9, Ta * Tb); + Tk = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = Ip[WS(rs, 1)]; + Tg = Im[WS(rs, 1)]; + Td = W[4]; + Tf = W[5]; + Th = FMA(Td, Te, Tf * Tg); + Tl = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, Tn, Tq; + T7 = T1 + T6; + Ti = Tc + Th; + Rm[WS(rs, 1)] = T7 - Ti; + Rp[0] = T7 + Ti; + Tn = Tk + Tl; + Tq = To + Tp; + Im[WS(rs, 1)] = Tn - Tq; + Ip[0] = Tn + Tq; + } + { + E Tj, Tm, Tr, Ts; + Tj = T1 - T6; + Tm = Tk - Tl; + Rm[0] = Tj - Tm; + Rp[WS(rs, 1)] = Tj + Tm; + Tr = Th - Tc; + Ts = Tp - To; + Im[0] = Tr - Ts; + Ip[WS(rs, 1)] = Tr + Ts; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cf_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hc2cf_4) (planner *p) { + X(khc2c_register) (p, hc2cf_4, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_6.c new file mode 100644 index 000000000..679afd78e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_6.c @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:55 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -dit -name hc2cf_6 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 46 FP additions, 32 FP multiplications, + * (or, 24 additions, 10 multiplications, 22 fused multiply/add), + * 31 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E T1, TX, T7, TW, Tl, TS, TB, TJ, Ty, TR, TC, TO; + T1 = Rp[0]; + TX = Rm[0]; + { + E T3, T6, T4, TV, T2, T5; + T3 = Ip[WS(rs, 1)]; + T6 = Im[WS(rs, 1)]; + T2 = W[4]; + T4 = T2 * T3; + TV = T2 * T6; + T5 = W[5]; + T7 = FMA(T5, T6, T4); + TW = FNMS(T5, T3, TV); + } + { + E Ta, Td, Tb, TF, Tg, Tj, Th, TH, T9, Tf; + Ta = Rp[WS(rs, 1)]; + Td = Rm[WS(rs, 1)]; + T9 = W[2]; + Tb = T9 * Ta; + TF = T9 * Td; + Tg = Ip[WS(rs, 2)]; + Tj = Im[WS(rs, 2)]; + Tf = W[8]; + Th = Tf * Tg; + TH = Tf * Tj; + { + E Te, TG, Tk, TI, Tc, Ti; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + TG = FNMS(Tc, Ta, TF); + Ti = W[9]; + Tk = FMA(Ti, Tj, Th); + TI = FNMS(Ti, Tg, TH); + Tl = Te - Tk; + TS = TI - TG; + TB = Te + Tk; + TJ = TG + TI; + } + } + { + E Tn, Tq, To, TK, Tt, Tw, Tu, TM, Tm, Ts; + Tn = Rp[WS(rs, 2)]; + Tq = Rm[WS(rs, 2)]; + Tm = W[6]; + To = Tm * Tn; + TK = Tm * Tq; + Tt = Ip[0]; + Tw = Im[0]; + Ts = W[0]; + Tu = Ts * Tt; + TM = Ts * Tw; + { + E Tr, TL, Tx, TN, Tp, Tv; + Tp = W[7]; + Tr = FMA(Tp, Tq, To); + TL = FNMS(Tp, Tn, TK); + Tv = W[1]; + Tx = FMA(Tv, Tw, Tu); + TN = FNMS(Tv, Tt, TM); + Ty = Tr - Tx; + TR = TN - TL; + TC = Tr + Tx; + TO = TL + TN; + } + } + { + E TT, T8, Tz, TQ; + TT = TR - TS; + T8 = T1 - T7; + Tz = Tl + Ty; + TQ = FNMS(KP500000000, Tz, T8); + Rm[WS(rs, 2)] = T8 + Tz; + Rp[WS(rs, 1)] = FMA(KP866025403, TT, TQ); + Rm[0] = FNMS(KP866025403, TT, TQ); + } + { + E T14, T11, T12, T13; + T14 = Ty - Tl; + T11 = TS + TR; + T12 = TX - TW; + T13 = FMA(KP500000000, T11, T12); + Im[WS(rs, 2)] = T11 - T12; + Ip[WS(rs, 1)] = FMA(KP866025403, T14, T13); + Im[0] = FMS(KP866025403, T14, T13); + } + { + E TP, TA, TD, TE; + TP = TJ - TO; + TA = T1 + T7; + TD = TB + TC; + TE = FNMS(KP500000000, TD, TA); + Rp[0] = TA + TD; + Rm[WS(rs, 1)] = FMA(KP866025403, TP, TE); + Rp[WS(rs, 2)] = FNMS(KP866025403, TP, TE); + } + { + E T10, TU, TY, TZ; + T10 = TB - TC; + TU = TJ + TO; + TY = TW + TX; + TZ = FNMS(KP500000000, TU, TY); + Ip[0] = TU + TY; + Ip[WS(rs, 2)] = FMA(KP866025403, T10, TZ); + Im[WS(rs, 1)] = FMS(KP866025403, T10, TZ); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cf_6", twinstr, &GENUS, {24, 10, 22, 0} }; + +void X(codelet_hc2cf_6) (planner *p) { + X(khc2c_register) (p, hc2cf_6, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 6 -dit -name hc2cf_6 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 46 FP additions, 28 FP multiplications, + * (or, 32 additions, 14 multiplications, 14 fused multiply/add), + * 23 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E T7, TS, Tv, TO, Tt, TJ, Tx, TF, Ti, TI, Tw, TC; + { + E T1, TN, T6, TM; + T1 = Rp[0]; + TN = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Ip[WS(rs, 1)]; + T5 = Im[WS(rs, 1)]; + T2 = W[4]; + T4 = W[5]; + T6 = FMA(T2, T3, T4 * T5); + TM = FNMS(T4, T3, T2 * T5); + } + T7 = T1 - T6; + TS = TN - TM; + Tv = T1 + T6; + TO = TM + TN; + } + { + E Tn, TD, Ts, TE; + { + E Tk, Tm, Tj, Tl; + Tk = Rp[WS(rs, 2)]; + Tm = Rm[WS(rs, 2)]; + Tj = W[6]; + Tl = W[7]; + Tn = FMA(Tj, Tk, Tl * Tm); + TD = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = Ip[0]; + Tr = Im[0]; + To = W[0]; + Tq = W[1]; + Ts = FMA(To, Tp, Tq * Tr); + TE = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn - Ts; + TJ = TE - TD; + Tx = Tn + Ts; + TF = TD + TE; + } + { + E Tc, TA, Th, TB; + { + E T9, Tb, T8, Ta; + T9 = Rp[WS(rs, 1)]; + Tb = Rm[WS(rs, 1)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + TA = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = Ip[WS(rs, 2)]; + Tg = Im[WS(rs, 2)]; + Td = W[8]; + Tf = W[9]; + Th = FMA(Td, Te, Tf * Tg); + TB = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc - Th; + TI = TA - TB; + Tw = Tc + Th; + TC = TA + TB; + } + { + E TK, Tu, TH, TT, TR, TU; + TK = KP866025403 * (TI + TJ); + Tu = Ti + Tt; + TH = FNMS(KP500000000, Tu, T7); + Rm[WS(rs, 2)] = T7 + Tu; + Rp[WS(rs, 1)] = TH + TK; + Rm[0] = TH - TK; + TT = KP866025403 * (Tt - Ti); + TR = TJ - TI; + TU = FMA(KP500000000, TR, TS); + Im[WS(rs, 2)] = TR - TS; + Ip[WS(rs, 1)] = TT + TU; + Im[0] = TT - TU; + } + { + E TG, Ty, Tz, TP, TL, TQ; + TG = KP866025403 * (TC - TF); + Ty = Tw + Tx; + Tz = FNMS(KP500000000, Ty, Tv); + Rp[0] = Tv + Ty; + Rm[WS(rs, 1)] = Tz + TG; + Rp[WS(rs, 2)] = Tz - TG; + TP = KP866025403 * (Tw - Tx); + TL = TC + TF; + TQ = FNMS(KP500000000, TL, TO); + Ip[0] = TL + TO; + Ip[WS(rs, 2)] = TP + TQ; + Im[WS(rs, 1)] = TP - TQ; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cf_6", twinstr, &GENUS, {32, 14, 14, 0} }; + +void X(codelet_hc2cf_6) (planner *p) { + X(khc2c_register) (p, hc2cf_6, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_8.c new file mode 100644 index 000000000..465a4258d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cf_8.c @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:55 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2c.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -dit -name hc2cf_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 44 additions, 14 multiplications, 22 fused multiply/add), + * 34 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E T1, T1m, T7, T1l, Tk, TS, Te, TQ, TF, T14, TL, T16, T12, T17, Ts; + E TX, Ty, TZ, TV, T10; + T1 = Rp[0]; + T1m = Rm[0]; + { + E T3, T6, T4, T1k, T2, T5; + T3 = Rp[WS(rs, 2)]; + T6 = Rm[WS(rs, 2)]; + T2 = W[6]; + T4 = T2 * T3; + T1k = T2 * T6; + T5 = W[7]; + T7 = FMA(T5, T6, T4); + T1l = FNMS(T5, T3, T1k); + } + { + E Tg, Tj, Th, TR, Tf, Ti; + Tg = Rp[WS(rs, 3)]; + Tj = Rm[WS(rs, 3)]; + Tf = W[10]; + Th = Tf * Tg; + TR = Tf * Tj; + Ti = W[11]; + Tk = FMA(Ti, Tj, Th); + TS = FNMS(Ti, Tg, TR); + } + { + E Ta, Td, Tb, TP, T9, Tc; + Ta = Rp[WS(rs, 1)]; + Td = Rm[WS(rs, 1)]; + T9 = W[2]; + Tb = T9 * Ta; + TP = T9 * Td; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + TQ = FNMS(Tc, Ta, TP); + } + { + E TB, TE, TC, T13, TH, TK, TI, T15, TA, TG, TD, TJ; + TB = Ip[WS(rs, 3)]; + TE = Im[WS(rs, 3)]; + TA = W[12]; + TC = TA * TB; + T13 = TA * TE; + TH = Ip[WS(rs, 1)]; + TK = Im[WS(rs, 1)]; + TG = W[4]; + TI = TG * TH; + T15 = TG * TK; + TD = W[13]; + TF = FMA(TD, TE, TC); + T14 = FNMS(TD, TB, T13); + TJ = W[5]; + TL = FMA(TJ, TK, TI); + T16 = FNMS(TJ, TH, T15); + T12 = TF - TL; + T17 = T14 - T16; + } + { + E To, Tr, Tp, TW, Tu, Tx, Tv, TY, Tn, Tt, Tq, Tw; + To = Ip[0]; + Tr = Im[0]; + Tn = W[0]; + Tp = Tn * To; + TW = Tn * Tr; + Tu = Ip[WS(rs, 2)]; + Tx = Im[WS(rs, 2)]; + Tt = W[8]; + Tv = Tt * Tu; + TY = Tt * Tx; + Tq = W[1]; + Ts = FMA(Tq, Tr, Tp); + TX = FNMS(Tq, To, TW); + Tw = W[9]; + Ty = FMA(Tw, Tx, Tv); + TZ = FNMS(Tw, Tu, TY); + TV = Ts - Ty; + T10 = TX - TZ; + } + { + E TU, T1a, T1t, T1v, T19, T1w, T1d, T1u; + { + E TO, TT, T1r, T1s; + TO = T1 - T7; + TT = TQ - TS; + TU = TO + TT; + T1a = TO - TT; + T1r = T1m - T1l; + T1s = Te - Tk; + T1t = T1r - T1s; + T1v = T1s + T1r; + } + { + E T11, T18, T1b, T1c; + T11 = TV + T10; + T18 = T12 - T17; + T19 = T11 + T18; + T1w = T18 - T11; + T1b = T10 - TV; + T1c = T12 + T17; + T1d = T1b - T1c; + T1u = T1b + T1c; + } + Rm[WS(rs, 2)] = FNMS(KP707106781, T19, TU); + Im[WS(rs, 2)] = FMS(KP707106781, T1u, T1t); + Rp[WS(rs, 1)] = FMA(KP707106781, T19, TU); + Ip[WS(rs, 1)] = FMA(KP707106781, T1u, T1t); + Rm[0] = FNMS(KP707106781, T1d, T1a); + Im[0] = FMS(KP707106781, T1w, T1v); + Rp[WS(rs, 3)] = FMA(KP707106781, T1d, T1a); + Ip[WS(rs, 3)] = FMA(KP707106781, T1w, T1v); + } + { + E Tm, T1e, T1o, T1q, TN, T1p, T1h, T1i; + { + E T8, Tl, T1j, T1n; + T8 = T1 + T7; + Tl = Te + Tk; + Tm = T8 + Tl; + T1e = T8 - Tl; + T1j = TQ + TS; + T1n = T1l + T1m; + T1o = T1j + T1n; + T1q = T1n - T1j; + } + { + E Tz, TM, T1f, T1g; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz + TM; + T1p = TM - Tz; + T1f = TX + TZ; + T1g = T14 + T16; + T1h = T1f - T1g; + T1i = T1f + T1g; + } + Rm[WS(rs, 3)] = Tm - TN; + Im[WS(rs, 3)] = T1i - T1o; + Rp[0] = Tm + TN; + Ip[0] = T1i + T1o; + Rm[WS(rs, 1)] = T1e - T1h; + Im[WS(rs, 1)] = T1p - T1q; + Rp[WS(rs, 2)] = T1e + T1h; + Ip[WS(rs, 2)] = T1p + T1q; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cf_8", twinstr, &GENUS, {44, 14, 22, 0} }; + +void X(codelet_hc2cf_8) (planner *p) { + X(khc2c_register) (p, hc2cf_8, &desc, HC2C_VIA_RDFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2c.native -compact -variables 4 -pipeline-latency 4 -n 8 -dit -name hc2cf_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 52 additions, 18 multiplications, 14 fused multiply/add), + * 28 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cf_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T1e, TH, T19, TF, T13, TR, TU, Ti, T1f, TK, T16, Tu, T12, TM; + E TP; + { + E T1, T18, T6, T17; + T1 = Rp[0]; + T18 = Rm[0]; + { + E T3, T5, T2, T4; + T3 = Rp[WS(rs, 2)]; + T5 = Rm[WS(rs, 2)]; + T2 = W[6]; + T4 = W[7]; + T6 = FMA(T2, T3, T4 * T5); + T17 = FNMS(T4, T3, T2 * T5); + } + T7 = T1 + T6; + T1e = T18 - T17; + TH = T1 - T6; + T19 = T17 + T18; + } + { + E Tz, TS, TE, TT; + { + E Tw, Ty, Tv, Tx; + Tw = Ip[WS(rs, 3)]; + Ty = Im[WS(rs, 3)]; + Tv = W[12]; + Tx = W[13]; + Tz = FMA(Tv, Tw, Tx * Ty); + TS = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = Ip[WS(rs, 1)]; + TD = Im[WS(rs, 1)]; + TA = W[4]; + TC = W[5]; + TE = FMA(TA, TB, TC * TD); + TT = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T13 = TS + TT; + TR = Tz - TE; + TU = TS - TT; + } + { + E Tc, TI, Th, TJ; + { + E T9, Tb, T8, Ta; + T9 = Rp[WS(rs, 1)]; + Tb = Rm[WS(rs, 1)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + TI = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = Rp[WS(rs, 3)]; + Tg = Rm[WS(rs, 3)]; + Td = W[10]; + Tf = W[11]; + Th = FMA(Td, Te, Tf * Tg); + TJ = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc + Th; + T1f = Tc - Th; + TK = TI - TJ; + T16 = TI + TJ; + } + { + E To, TN, Tt, TO; + { + E Tl, Tn, Tk, Tm; + Tl = Ip[0]; + Tn = Im[0]; + Tk = W[0]; + Tm = W[1]; + To = FMA(Tk, Tl, Tm * Tn); + TN = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = Ip[WS(rs, 2)]; + Ts = Im[WS(rs, 2)]; + Tp = W[8]; + Tr = W[9]; + Tt = FMA(Tp, Tq, Tr * Ts); + TO = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T12 = TN + TO; + TM = To - Tt; + TP = TN - TO; + } + { + E Tj, TG, T1b, T1c; + Tj = T7 + Ti; + TG = Tu + TF; + Rm[WS(rs, 3)] = Tj - TG; + Rp[0] = Tj + TG; + { + E T15, T1a, T11, T14; + T15 = T12 + T13; + T1a = T16 + T19; + Im[WS(rs, 3)] = T15 - T1a; + Ip[0] = T15 + T1a; + T11 = T7 - Ti; + T14 = T12 - T13; + Rm[WS(rs, 1)] = T11 - T14; + Rp[WS(rs, 2)] = T11 + T14; + } + T1b = TF - Tu; + T1c = T19 - T16; + Im[WS(rs, 1)] = T1b - T1c; + Ip[WS(rs, 2)] = T1b + T1c; + { + E TX, T1g, T10, T1d, TY, TZ; + TX = TH - TK; + T1g = T1e - T1f; + TY = TP - TM; + TZ = TR + TU; + T10 = KP707106781 * (TY - TZ); + T1d = KP707106781 * (TY + TZ); + Rm[0] = TX - T10; + Ip[WS(rs, 1)] = T1d + T1g; + Rp[WS(rs, 3)] = TX + T10; + Im[WS(rs, 2)] = T1d - T1g; + } + { + E TL, T1i, TW, T1h, TQ, TV; + TL = TH + TK; + T1i = T1f + T1e; + TQ = TM + TP; + TV = TR - TU; + TW = KP707106781 * (TQ + TV); + T1h = KP707106781 * (TV - TQ); + Rm[WS(rs, 2)] = TL - TW; + Ip[WS(rs, 3)] = T1h + T1i; + Rp[WS(rs, 1)] = TL + TW; + Im[0] = T1h - T1i; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cf_8", twinstr, &GENUS, {52, 18, 14, 0} }; + +void X(codelet_hc2cf_8) (planner *p) { + X(khc2c_register) (p, hc2cf_8, &desc, HC2C_VIA_RDFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_16.c new file mode 100644 index 000000000..bb1c80b94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_16.c @@ -0,0 +1,937 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:16 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -dit -name hc2cfdft2_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 228 FP additions, 166 FP multiplications, + * (or, 136 additions, 74 multiplications, 92 fused multiply/add), + * 91 stack variables, 4 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T1, T2, Tw, Ty, Th, Tj, T4, T5, TY, T6, Tk, T1o, T1d, Tz, T1j; + E Tq, TF, T18, TR, TL, T13, T1A, T1K, T1E, T1H, Tc, T25, T2k, T29, T2h; + { + E Tx, TE, Ti, TK, Tp, TQ, Tb, T3; + T1 = W[0]; + T2 = W[2]; + T3 = T1 * T2; + Tw = W[6]; + Tx = T1 * Tw; + Ty = W[7]; + TE = T1 * Ty; + Th = W[4]; + Ti = T1 * Th; + TK = T2 * Th; + Tj = W[5]; + Tp = T1 * Tj; + TQ = T2 * Tj; + T4 = W[1]; + T5 = W[3]; + Tb = T1 * T5; + TY = FNMS(T4, T5, T3); + T6 = FMA(T4, T5, T3); + Tk = FNMS(T4, Tj, Ti); + T1o = FNMS(T4, Th, Tp); + T1d = FMA(T5, Th, TQ); + Tz = FMA(T4, Ty, Tx); + T1j = FMA(T4, Tj, Ti); + Tq = FMA(T4, Th, Tp); + TF = FNMS(T4, Tw, TE); + T18 = FNMS(T5, Tj, TK); + TR = FNMS(T5, Th, TQ); + TL = FMA(T5, Tj, TK); + { + E T1z, T1D, T24, T28; + T1z = TY * Th; + T1D = TY * Tj; + T13 = FMA(T4, T2, Tb); + T1A = FMA(T13, Tj, T1z); + T1K = FMA(T13, Th, T1D); + T1E = FNMS(T13, Th, T1D); + T1H = FNMS(T13, Tj, T1z); + T24 = T6 * Th; + T28 = T6 * Tj; + Tc = FNMS(T4, T2, Tb); + T25 = FNMS(Tc, Tj, T24); + T2k = FNMS(Tc, Th, T28); + T29 = FMA(Tc, Th, T28); + T2h = FMA(Tc, Tj, T24); + } + } + { + E T1v, T2q, T1s, T2s, T38, T3T, T1Y, T3P, T17, T1h, T2x, T2v, T33, T3Q, T1N; + E T3S, Tg, Tu, T3A, T2B, T2D, T3B, T2c, T3L, T2S, T3I, TJ, TV, T3E, T2G; + E T2I, T3D, T2n, T3J, T2X, T3M; + { + E T1t, T1u, T1W, T1m, T1Q, T1S, T1T, T1V, T36, T1r, T34, T1P, T1k, T1l, T1n; + E T2r; + T1t = Ip[0]; + T1u = Im[0]; + T1W = T1t + T1u; + T1k = Ip[WS(rs, 4)]; + T1l = Im[WS(rs, 4)]; + T1m = T1k - T1l; + T1Q = T1k + T1l; + { + E T1U, T1p, T1q, T1O; + T1S = Rm[0]; + T1T = Rp[0]; + T1U = T1S - T1T; + T1V = T1 * T1U; + T36 = T4 * T1U; + T1p = Rp[WS(rs, 4)]; + T1q = Rm[WS(rs, 4)]; + T1O = T1q - T1p; + T1r = T1p + T1q; + T34 = Tj * T1O; + T1P = Th * T1O; + } + T1v = T1t - T1u; + T2q = T1T + T1S; + T1n = T1j * T1m; + T1s = FNMS(T1o, T1r, T1n); + T2r = T1j * T1r; + T2s = FMA(T1o, T1m, T2r); + { + E T35, T37, T1R, T1X; + T35 = FMA(Th, T1Q, T34); + T37 = FMA(T1, T1W, T36); + T38 = T35 + T37; + T3T = T37 - T35; + T1R = FNMS(Tj, T1Q, T1P); + T1X = FNMS(T4, T1W, T1V); + T1Y = T1R + T1X; + T3P = T1X - T1R; + } + } + { + E T11, T1F, T16, T2Z, T1C, T1b, T1L, T1g, T31, T1J; + { + E TZ, T10, T14, T15, T1B; + TZ = Ip[WS(rs, 2)]; + T10 = Im[WS(rs, 2)]; + T11 = TZ - T10; + T1F = TZ + T10; + T14 = Rp[WS(rs, 2)]; + T15 = Rm[WS(rs, 2)]; + T1B = T15 - T14; + T16 = T14 + T15; + T2Z = T1E * T1B; + T1C = T1A * T1B; + } + { + E T19, T1a, T1e, T1f, T1I; + T19 = Ip[WS(rs, 6)]; + T1a = Im[WS(rs, 6)]; + T1b = T19 - T1a; + T1L = T19 + T1a; + T1e = Rp[WS(rs, 6)]; + T1f = Rm[WS(rs, 6)]; + T1I = T1f - T1e; + T1g = T1e + T1f; + T31 = T1K * T1I; + T1J = T1H * T1I; + } + { + E T12, T1c, T2w, T2u; + T12 = TY * T11; + T17 = FNMS(T13, T16, T12); + T1c = T18 * T1b; + T1h = FNMS(T1d, T1g, T1c); + T2w = T18 * T1g; + T2x = FMA(T1d, T1b, T2w); + T2u = TY * T16; + T2v = FMA(T13, T11, T2u); + { + E T30, T32, T1G, T1M; + T30 = FMA(T1A, T1F, T2Z); + T32 = FMA(T1H, T1L, T31); + T33 = T30 + T32; + T3Q = T30 - T32; + T1G = FNMS(T1E, T1F, T1C); + T1M = FNMS(T1K, T1L, T1J); + T1N = T1G + T1M; + T3S = T1G - T1M; + } + } + } + { + E T9, T22, Ta, T2O, Tf, T20, T21, T2A, Tn, T2a, To, T2Q, Tt, T26, T27; + E T2C; + { + E T7, T8, Td, Te; + T7 = Ip[WS(rs, 1)]; + T8 = Im[WS(rs, 1)]; + T9 = T7 - T8; + T22 = T7 + T8; + Ta = T6 * T9; + T2O = T2 * T22; + Td = Rp[WS(rs, 1)]; + Te = Rm[WS(rs, 1)]; + Tf = Td + Te; + T20 = Td - Te; + T21 = T2 * T20; + T2A = T6 * Tf; + } + { + E Tl, Tm, Tr, Ts; + Tl = Ip[WS(rs, 5)]; + Tm = Im[WS(rs, 5)]; + Tn = Tl - Tm; + T2a = Tl + Tm; + To = Tk * Tn; + T2Q = T25 * T2a; + Tr = Rp[WS(rs, 5)]; + Ts = Rm[WS(rs, 5)]; + Tt = Tr + Ts; + T26 = Tr - Ts; + T27 = T25 * T26; + T2C = Tk * Tt; + } + Tg = FNMS(Tc, Tf, Ta); + Tu = FNMS(Tq, Tt, To); + T3A = Tg - Tu; + T2B = FMA(Tc, T9, T2A); + T2D = FMA(Tq, Tn, T2C); + T3B = T2B - T2D; + { + E T23, T2b, T2P, T2R; + T23 = FMA(T5, T22, T21); + T2b = FMA(T29, T2a, T27); + T2c = T23 + T2b; + T3L = T2b - T23; + T2P = FNMS(T5, T20, T2O); + T2R = FNMS(T29, T26, T2Q); + T2S = T2P + T2R; + T3I = T2R - T2P; + } + } + { + E TC, T2f, TD, T2T, TI, T2d, T2e, T2F, TO, T2l, TP, T2V, TU, T2i, T2j; + E T2H; + { + E TA, TB, TG, TH; + TA = Ip[WS(rs, 7)]; + TB = Im[WS(rs, 7)]; + TC = TA - TB; + T2f = TA + TB; + TD = Tz * TC; + T2T = Tw * T2f; + TG = Rp[WS(rs, 7)]; + TH = Rm[WS(rs, 7)]; + TI = TG + TH; + T2d = TG - TH; + T2e = Tw * T2d; + T2F = Tz * TI; + } + { + E TM, TN, TS, TT; + TM = Ip[WS(rs, 3)]; + TN = Im[WS(rs, 3)]; + TO = TM - TN; + T2l = TM + TN; + TP = TL * TO; + T2V = T2h * T2l; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 3)]; + TU = TS + TT; + T2i = TS - TT; + T2j = T2h * T2i; + T2H = TL * TU; + } + TJ = FNMS(TF, TI, TD); + TV = FNMS(TR, TU, TP); + T3E = TJ - TV; + T2G = FMA(TF, TC, T2F); + T2I = FMA(TR, TO, T2H); + T3D = T2G - T2I; + { + E T2g, T2m, T2U, T2W; + T2g = FMA(Ty, T2f, T2e); + T2m = FMA(T2k, T2l, T2j); + T2n = T2g + T2m; + T3J = T2m - T2g; + T2U = FNMS(Ty, T2d, T2T); + T2W = FNMS(T2k, T2i, T2V); + T2X = T2U + T2W; + T3M = T2U - T2W; + } + } + { + E TX, T3o, T3i, T3s, T3l, T3t, T1x, T3e, T2p, T2M, T2K, T3d, T3a, T3c, T2z; + E T3n; + { + E Tv, TW, T3g, T3h; + Tv = Tg + Tu; + TW = TJ + TV; + TX = Tv + TW; + T3o = Tv - TW; + T3g = T2X - T2S; + T3h = T2c - T2n; + T3i = T3g + T3h; + T3s = T3g - T3h; + } + { + E T3j, T3k, T1i, T1w; + T3j = T1Y - T1N; + T3k = T38 - T33; + T3l = T3j - T3k; + T3t = T3j + T3k; + T1i = T17 + T1h; + T1w = T1s + T1v; + T1x = T1i + T1w; + T3e = T1w - T1i; + } + { + E T1Z, T2o, T2E, T2J; + T1Z = T1N + T1Y; + T2o = T2c + T2n; + T2p = T1Z - T2o; + T2M = T2o + T1Z; + T2E = T2B + T2D; + T2J = T2G + T2I; + T2K = T2E + T2J; + T3d = T2J - T2E; + } + { + E T2Y, T39, T2t, T2y; + T2Y = T2S + T2X; + T39 = T33 + T38; + T3a = T2Y - T39; + T3c = T2Y + T39; + T2t = T2q + T2s; + T2y = T2v + T2x; + T2z = T2t + T2y; + T3n = T2t - T2y; + } + { + E T1y, T3b, T2L, T2N; + T1y = TX + T1x; + Ip[0] = KP500000000 * (T1y + T2p); + Im[WS(rs, 7)] = KP500000000 * (T2p - T1y); + T3b = T2z + T2K; + Rm[WS(rs, 7)] = KP500000000 * (T3b - T3c); + Rp[0] = KP500000000 * (T3b + T3c); + T2L = T2z - T2K; + Rm[WS(rs, 3)] = KP500000000 * (T2L - T2M); + Rp[WS(rs, 4)] = KP500000000 * (T2L + T2M); + T2N = T1x - TX; + Ip[WS(rs, 4)] = KP500000000 * (T2N + T3a); + Im[WS(rs, 3)] = KP500000000 * (T3a - T2N); + } + { + E T3f, T3m, T3v, T3w; + T3f = T3d + T3e; + T3m = T3i + T3l; + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP707106781, T3m, T3f)); + Im[WS(rs, 5)] = -(KP500000000 * (FNMS(KP707106781, T3m, T3f))); + T3v = T3n + T3o; + T3w = T3s + T3t; + Rm[WS(rs, 5)] = KP500000000 * (FNMS(KP707106781, T3w, T3v)); + Rp[WS(rs, 2)] = KP500000000 * (FMA(KP707106781, T3w, T3v)); + } + { + E T3p, T3q, T3r, T3u; + T3p = T3n - T3o; + T3q = T3l - T3i; + Rm[WS(rs, 1)] = KP500000000 * (FNMS(KP707106781, T3q, T3p)); + Rp[WS(rs, 6)] = KP500000000 * (FMA(KP707106781, T3q, T3p)); + T3r = T3e - T3d; + T3u = T3s - T3t; + Ip[WS(rs, 6)] = KP500000000 * (FMA(KP707106781, T3u, T3r)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP707106781, T3u, T3r))); + } + } + { + E T3z, T4b, T4g, T4q, T4j, T4r, T3G, T4m, T3O, T46, T3Z, T4l, T42, T4c, T3V; + E T47; + { + E T3x, T3y, T4e, T4f; + T3x = T1v - T1s; + T3y = T2v - T2x; + T3z = T3x - T3y; + T4b = T3y + T3x; + T4e = T3I - T3J; + T4f = T3M - T3L; + T4g = FMA(KP414213562, T4f, T4e); + T4q = FNMS(KP414213562, T4e, T4f); + } + { + E T4h, T4i, T3C, T3F; + T4h = T3Q + T3P; + T4i = T3T - T3S; + T4j = FMA(KP414213562, T4i, T4h); + T4r = FNMS(KP414213562, T4h, T4i); + T3C = T3A - T3B; + T3F = T3D + T3E; + T3G = T3C + T3F; + T4m = T3C - T3F; + } + { + E T3K, T3N, T3X, T3Y; + T3K = T3I + T3J; + T3N = T3L + T3M; + T3O = FMA(KP414213562, T3N, T3K); + T46 = FNMS(KP414213562, T3K, T3N); + T3X = T2q - T2s; + T3Y = T17 - T1h; + T3Z = T3X + T3Y; + T4l = T3X - T3Y; + } + { + E T40, T41, T3R, T3U; + T40 = T3B + T3A; + T41 = T3D - T3E; + T42 = T40 + T41; + T4c = T41 - T40; + T3R = T3P - T3Q; + T3U = T3S + T3T; + T3V = FNMS(KP414213562, T3U, T3R); + T47 = FMA(KP414213562, T3R, T3U); + } + { + E T3H, T3W, T49, T4a; + T3H = FMA(KP707106781, T3G, T3z); + T3W = T3O + T3V; + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP923879532, T3W, T3H)); + Im[WS(rs, 6)] = -(KP500000000 * (FNMS(KP923879532, T3W, T3H))); + T49 = FMA(KP707106781, T42, T3Z); + T4a = T46 + T47; + Rm[WS(rs, 6)] = KP500000000 * (FNMS(KP923879532, T4a, T49)); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP923879532, T4a, T49)); + } + { + E T43, T44, T45, T48; + T43 = FNMS(KP707106781, T42, T3Z); + T44 = T3V - T3O; + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP923879532, T44, T43)); + Rp[WS(rs, 5)] = KP500000000 * (FMA(KP923879532, T44, T43)); + T45 = FNMS(KP707106781, T3G, T3z); + T48 = T46 - T47; + Ip[WS(rs, 5)] = KP500000000 * (FMA(KP923879532, T48, T45)); + Im[WS(rs, 2)] = -(KP500000000 * (FNMS(KP923879532, T48, T45))); + } + { + E T4d, T4k, T4t, T4u; + T4d = FNMS(KP707106781, T4c, T4b); + T4k = T4g - T4j; + Ip[WS(rs, 7)] = KP500000000 * (FMA(KP923879532, T4k, T4d)); + Im[0] = -(KP500000000 * (FNMS(KP923879532, T4k, T4d))); + T4t = FNMS(KP707106781, T4m, T4l); + T4u = T4q + T4r; + Rp[WS(rs, 7)] = KP500000000 * (FNMS(KP923879532, T4u, T4t)); + Rm[0] = KP500000000 * (FMA(KP923879532, T4u, T4t)); + } + { + E T4n, T4o, T4p, T4s; + T4n = FMA(KP707106781, T4m, T4l); + T4o = T4g + T4j; + Rm[WS(rs, 4)] = KP500000000 * (FNMS(KP923879532, T4o, T4n)); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP923879532, T4o, T4n)); + T4p = FMA(KP707106781, T4c, T4b); + T4s = T4q - T4r; + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP923879532, T4s, T4p)); + Im[WS(rs, 4)] = -(KP500000000 * (FNMS(KP923879532, T4s, T4p))); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cfdft2_16", twinstr, &GENUS, {136, 74, 92, 0} }; + +void X(codelet_hc2cfdft2_16) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_16, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -dit -name hc2cfdft2_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 228 FP additions, 124 FP multiplications, + * (or, 188 additions, 84 multiplications, 40 fused multiply/add), + * 91 stack variables, 4 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP461939766, +0.461939766255643378064091594698394143411208313); + DK(KP191341716, +0.191341716182544885864229992015199433380672281); + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T1, T4, T2, T5, T7, Td, T12, TY, Tk, Ti, Tm, T1l, T1b, TL, T1h; + E Ts, TR, T17, Ty, Tz, TA, TE, T1L, T1Q, T1H, T1O, T24, T2d, T20, T2b; + { + E Tl, TP, Tq, TK, Tj, TQ, Tr, TJ; + { + E T3, Tc, T6, Tb; + T1 = W[0]; + T4 = W[1]; + T2 = W[2]; + T5 = W[3]; + T3 = T1 * T2; + Tc = T4 * T2; + T6 = T4 * T5; + Tb = T1 * T5; + T7 = T3 + T6; + Td = Tb - Tc; + T12 = Tb + Tc; + TY = T3 - T6; + Tk = W[5]; + Tl = T4 * Tk; + TP = T2 * Tk; + Tq = T1 * Tk; + TK = T5 * Tk; + Ti = W[4]; + Tj = T1 * Ti; + TQ = T5 * Ti; + Tr = T4 * Ti; + TJ = T2 * Ti; + } + Tm = Tj - Tl; + T1l = Tq - Tr; + T1b = TP + TQ; + TL = TJ + TK; + T1h = Tj + Tl; + Ts = Tq + Tr; + TR = TP - TQ; + T17 = TJ - TK; + Ty = W[6]; + Tz = W[7]; + TA = FMA(T1, Ty, T4 * Tz); + TE = FNMS(T4, Ty, T1 * Tz); + { + E T1J, T1K, T1F, T1G; + T1J = TY * Tk; + T1K = T12 * Ti; + T1L = T1J - T1K; + T1Q = T1J + T1K; + T1F = TY * Ti; + T1G = T12 * Tk; + T1H = T1F + T1G; + T1O = T1F - T1G; + } + { + E T22, T23, T1Y, T1Z; + T22 = T7 * Tk; + T23 = Td * Ti; + T24 = T22 + T23; + T2d = T22 - T23; + T1Y = T7 * Ti; + T1Z = Td * Tk; + T20 = T1Y - T1Z; + T2b = T1Y + T1Z; + } + } + { + E T1t, T3i, T2l, T3B, T1E, T3t, T2M, T3x, T1g, T3C, T2J, T3u, T1T, T3w, T2o; + E T3j, Tx, T3b, T2C, T3q, T27, T3m, T2s, T3c, TW, T3f, T2F, T3n, T2g, T3p; + E T2v, T3e; + { + E T1k, T1C, T1o, T1B, T1s, T1z, T1y, T2j, T1p, T2k; + { + E T1i, T1j, T1m, T1n; + T1i = Ip[WS(rs, 4)]; + T1j = Im[WS(rs, 4)]; + T1k = T1i - T1j; + T1C = T1i + T1j; + T1m = Rp[WS(rs, 4)]; + T1n = Rm[WS(rs, 4)]; + T1o = T1m + T1n; + T1B = T1m - T1n; + } + { + E T1q, T1r, T1w, T1x; + T1q = Ip[0]; + T1r = Im[0]; + T1s = T1q - T1r; + T1z = T1q + T1r; + T1w = Rm[0]; + T1x = Rp[0]; + T1y = T1w - T1x; + T2j = T1x + T1w; + } + T1p = FNMS(T1l, T1o, T1h * T1k); + T1t = T1p + T1s; + T3i = T1s - T1p; + T2k = FMA(T1h, T1o, T1l * T1k); + T2l = T2j + T2k; + T3B = T2j - T2k; + { + E T1A, T1D, T2K, T2L; + T1A = FNMS(T4, T1z, T1 * T1y); + T1D = FMA(Ti, T1B, Tk * T1C); + T1E = T1A - T1D; + T3t = T1D + T1A; + T2K = FNMS(Tk, T1B, Ti * T1C); + T2L = FMA(T4, T1y, T1 * T1z); + T2M = T2K + T2L; + T3x = T2L - T2K; + } + } + { + E T11, T1M, T15, T1I, T1a, T1R, T1e, T1P; + { + E TZ, T10, T13, T14; + TZ = Ip[WS(rs, 2)]; + T10 = Im[WS(rs, 2)]; + T11 = TZ - T10; + T1M = TZ + T10; + T13 = Rp[WS(rs, 2)]; + T14 = Rm[WS(rs, 2)]; + T15 = T13 + T14; + T1I = T13 - T14; + } + { + E T18, T19, T1c, T1d; + T18 = Ip[WS(rs, 6)]; + T19 = Im[WS(rs, 6)]; + T1a = T18 - T19; + T1R = T18 + T19; + T1c = Rp[WS(rs, 6)]; + T1d = Rm[WS(rs, 6)]; + T1e = T1c + T1d; + T1P = T1c - T1d; + } + { + E T16, T1f, T2H, T2I; + T16 = FNMS(T12, T15, TY * T11); + T1f = FNMS(T1b, T1e, T17 * T1a); + T1g = T16 + T1f; + T3C = T16 - T1f; + T2H = FNMS(T1L, T1I, T1H * T1M); + T2I = FNMS(T1Q, T1P, T1O * T1R); + T2J = T2H + T2I; + T3u = T2H - T2I; + } + { + E T1N, T1S, T2m, T2n; + T1N = FMA(T1H, T1I, T1L * T1M); + T1S = FMA(T1O, T1P, T1Q * T1R); + T1T = T1N + T1S; + T3w = T1S - T1N; + T2m = FMA(TY, T15, T12 * T11); + T2n = FMA(T17, T1e, T1b * T1a); + T2o = T2m + T2n; + T3j = T2m - T2n; + } + } + { + E Ta, T1W, Tg, T1V, Tp, T25, Tv, T21; + { + E T8, T9, Te, Tf; + T8 = Ip[WS(rs, 1)]; + T9 = Im[WS(rs, 1)]; + Ta = T8 - T9; + T1W = T8 + T9; + Te = Rp[WS(rs, 1)]; + Tf = Rm[WS(rs, 1)]; + Tg = Te + Tf; + T1V = Te - Tf; + } + { + E Tn, To, Tt, Tu; + Tn = Ip[WS(rs, 5)]; + To = Im[WS(rs, 5)]; + Tp = Tn - To; + T25 = Tn + To; + Tt = Rp[WS(rs, 5)]; + Tu = Rm[WS(rs, 5)]; + Tv = Tt + Tu; + T21 = Tt - Tu; + } + { + E Th, Tw, T2A, T2B; + Th = FNMS(Td, Tg, T7 * Ta); + Tw = FNMS(Ts, Tv, Tm * Tp); + Tx = Th + Tw; + T3b = Th - Tw; + T2A = FNMS(T5, T1V, T2 * T1W); + T2B = FNMS(T24, T21, T20 * T25); + T2C = T2A + T2B; + T3q = T2A - T2B; + } + { + E T1X, T26, T2q, T2r; + T1X = FMA(T2, T1V, T5 * T1W); + T26 = FMA(T20, T21, T24 * T25); + T27 = T1X + T26; + T3m = T26 - T1X; + T2q = FMA(T7, Tg, Td * Ta); + T2r = FMA(Tm, Tv, Ts * Tp); + T2s = T2q + T2r; + T3c = T2q - T2r; + } + } + { + E TD, T29, TH, T28, TO, T2e, TU, T2c; + { + E TB, TC, TF, TG; + TB = Ip[WS(rs, 7)]; + TC = Im[WS(rs, 7)]; + TD = TB - TC; + T29 = TB + TC; + TF = Rp[WS(rs, 7)]; + TG = Rm[WS(rs, 7)]; + TH = TF + TG; + T28 = TF - TG; + } + { + E TM, TN, TS, TT; + TM = Ip[WS(rs, 3)]; + TN = Im[WS(rs, 3)]; + TO = TM - TN; + T2e = TM + TN; + TS = Rp[WS(rs, 3)]; + TT = Rm[WS(rs, 3)]; + TU = TS + TT; + T2c = TS - TT; + } + { + E TI, TV, T2D, T2E; + TI = FNMS(TE, TH, TA * TD); + TV = FNMS(TR, TU, TL * TO); + TW = TI + TV; + T3f = TI - TV; + T2D = FNMS(Tz, T28, Ty * T29); + T2E = FNMS(T2d, T2c, T2b * T2e); + T2F = T2D + T2E; + T3n = T2D - T2E; + } + { + E T2a, T2f, T2t, T2u; + T2a = FMA(Ty, T28, Tz * T29); + T2f = FMA(T2b, T2c, T2d * T2e); + T2g = T2a + T2f; + T3p = T2f - T2a; + T2t = FMA(TA, TH, TE * TD); + T2u = FMA(TL, TU, TR * TO); + T2v = T2t + T2u; + T3e = T2t - T2u; + } + } + { + E T1v, T2z, T2O, T2Q, T2i, T2y, T2x, T2P; + { + E TX, T1u, T2G, T2N; + TX = Tx + TW; + T1u = T1g + T1t; + T1v = TX + T1u; + T2z = T1u - TX; + T2G = T2C + T2F; + T2N = T2J + T2M; + T2O = T2G - T2N; + T2Q = T2G + T2N; + } + { + E T1U, T2h, T2p, T2w; + T1U = T1E - T1T; + T2h = T27 + T2g; + T2i = T1U - T2h; + T2y = T2h + T1U; + T2p = T2l + T2o; + T2w = T2s + T2v; + T2x = T2p - T2w; + T2P = T2p + T2w; + } + Ip[0] = KP500000000 * (T1v + T2i); + Rp[0] = KP500000000 * (T2P + T2Q); + Im[WS(rs, 7)] = KP500000000 * (T2i - T1v); + Rm[WS(rs, 7)] = KP500000000 * (T2P - T2Q); + Rm[WS(rs, 3)] = KP500000000 * (T2x - T2y); + Im[WS(rs, 3)] = KP500000000 * (T2O - T2z); + Rp[WS(rs, 4)] = KP500000000 * (T2x + T2y); + Ip[WS(rs, 4)] = KP500000000 * (T2z + T2O); + } + { + E T2T, T35, T33, T39, T2W, T36, T2Z, T37; + { + E T2R, T2S, T31, T32; + T2R = T2v - T2s; + T2S = T1t - T1g; + T2T = KP500000000 * (T2R + T2S); + T35 = KP500000000 * (T2S - T2R); + T31 = T2l - T2o; + T32 = Tx - TW; + T33 = KP500000000 * (T31 - T32); + T39 = KP500000000 * (T31 + T32); + } + { + E T2U, T2V, T2X, T2Y; + T2U = T2F - T2C; + T2V = T27 - T2g; + T2W = T2U + T2V; + T36 = T2U - T2V; + T2X = T1T + T1E; + T2Y = T2M - T2J; + T2Z = T2X - T2Y; + T37 = T2X + T2Y; + } + { + E T30, T3a, T34, T38; + T30 = KP353553390 * (T2W + T2Z); + Ip[WS(rs, 2)] = T2T + T30; + Im[WS(rs, 5)] = T30 - T2T; + T3a = KP353553390 * (T36 + T37); + Rm[WS(rs, 5)] = T39 - T3a; + Rp[WS(rs, 2)] = T39 + T3a; + T34 = KP353553390 * (T2Z - T2W); + Rm[WS(rs, 1)] = T33 - T34; + Rp[WS(rs, 6)] = T33 + T34; + T38 = KP353553390 * (T36 - T37); + Ip[WS(rs, 6)] = T35 + T38; + Im[WS(rs, 1)] = T38 - T35; + } + } + { + E T3k, T3Q, T3Z, T3D, T3h, T40, T3X, T45, T3G, T3P, T3s, T3K, T3U, T44, T3z; + E T3L; + { + E T3d, T3g, T3o, T3r; + T3k = KP500000000 * (T3i - T3j); + T3Q = KP500000000 * (T3j + T3i); + T3Z = KP500000000 * (T3B - T3C); + T3D = KP500000000 * (T3B + T3C); + T3d = T3b - T3c; + T3g = T3e + T3f; + T3h = KP353553390 * (T3d + T3g); + T40 = KP353553390 * (T3d - T3g); + { + E T3V, T3W, T3E, T3F; + T3V = T3u + T3t; + T3W = T3x - T3w; + T3X = FNMS(KP461939766, T3W, KP191341716 * T3V); + T45 = FMA(KP461939766, T3V, KP191341716 * T3W); + T3E = T3c + T3b; + T3F = T3e - T3f; + T3G = KP353553390 * (T3E + T3F); + T3P = KP353553390 * (T3F - T3E); + } + T3o = T3m + T3n; + T3r = T3p - T3q; + T3s = FMA(KP191341716, T3o, KP461939766 * T3r); + T3K = FNMS(KP191341716, T3r, KP461939766 * T3o); + { + E T3S, T3T, T3v, T3y; + T3S = T3n - T3m; + T3T = T3q + T3p; + T3U = FMA(KP461939766, T3S, KP191341716 * T3T); + T44 = FNMS(KP461939766, T3T, KP191341716 * T3S); + T3v = T3t - T3u; + T3y = T3w + T3x; + T3z = FNMS(KP191341716, T3y, KP461939766 * T3v); + T3L = FMA(KP191341716, T3v, KP461939766 * T3y); + } + } + { + E T3l, T3A, T3N, T3O; + T3l = T3h + T3k; + T3A = T3s + T3z; + Ip[WS(rs, 1)] = T3l + T3A; + Im[WS(rs, 6)] = T3A - T3l; + T3N = T3D + T3G; + T3O = T3K + T3L; + Rm[WS(rs, 6)] = T3N - T3O; + Rp[WS(rs, 1)] = T3N + T3O; + } + { + E T3H, T3I, T3J, T3M; + T3H = T3D - T3G; + T3I = T3z - T3s; + Rm[WS(rs, 2)] = T3H - T3I; + Rp[WS(rs, 5)] = T3H + T3I; + T3J = T3k - T3h; + T3M = T3K - T3L; + Ip[WS(rs, 5)] = T3J + T3M; + Im[WS(rs, 2)] = T3M - T3J; + } + { + E T3R, T3Y, T47, T48; + T3R = T3P + T3Q; + T3Y = T3U + T3X; + Ip[WS(rs, 3)] = T3R + T3Y; + Im[WS(rs, 4)] = T3Y - T3R; + T47 = T3Z + T40; + T48 = T44 + T45; + Rm[WS(rs, 4)] = T47 - T48; + Rp[WS(rs, 3)] = T47 + T48; + } + { + E T41, T42, T43, T46; + T41 = T3Z - T40; + T42 = T3X - T3U; + Rm[0] = T41 - T42; + Rp[WS(rs, 7)] = T41 + T42; + T43 = T3Q - T3P; + T46 = T44 - T45; + Ip[WS(rs, 7)] = T43 + T46; + Im[0] = T46 - T43; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cfdft2_16", twinstr, &GENUS, {188, 84, 40, 0} }; + +void X(codelet_hc2cfdft2_16) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_16, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_20.c new file mode 100644 index 000000000..9ce633c5b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_20.c @@ -0,0 +1,1203 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:18 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -dit -name hc2cfdft2_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 316 FP additions, 238 FP multiplications, + * (or, 176 additions, 98 multiplications, 140 fused multiply/add), + * 164 stack variables, 5 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(80, rs)) { + E Tm, Tq, Tn, T1, T6, Tg, Tp, Tr, Tx, TU, Tb, T1i, T1A, T2y, T33; + E T1o, T1u, T2B, T30, T1Q, T2a, T26, T2e, T22, T2V, T2R, TG, TD, TH, T1V; + E TN, TW, TX, T13, T2u, T2q, T2m, T2j; + { + E Tw, T1h, T29, T1n, T2d, T1z, T25, TC, T21, T1t, To, T2U; + Tm = W[0]; + Tq = W[3]; + Tn = W[2]; + To = Tm * Tn; + Tw = Tm * Tq; + T1 = W[6]; + T1h = Tn * T1; + T29 = Tm * T1; + T6 = W[7]; + T1n = Tn * T6; + T2d = Tm * T6; + Tg = W[5]; + T1z = Tn * Tg; + T25 = Tm * Tg; + Tp = W[1]; + Tr = FNMS(Tp, Tq, To); + Tx = FMA(Tp, Tn, Tw); + TU = FMA(Tp, Tq, To); + Tb = W[4]; + TC = Tr * Tb; + T21 = Tm * Tb; + T1t = Tn * Tb; + T1i = FMA(Tq, T6, T1h); + T1A = FNMS(Tq, Tb, T1z); + T2y = FNMS(Tq, Tg, T1t); + T33 = FMA(Tp, Tb, T25); + T1o = FNMS(Tq, T1, T1n); + T1u = FMA(Tq, Tg, T1t); + T2B = FMA(Tq, Tb, T1z); + T30 = FNMS(Tp, Tg, T21); + T1Q = FNMS(Tx, Tg, TC); + T2a = FMA(Tp, T6, T29); + T26 = FNMS(Tp, Tb, T25); + T2e = FNMS(Tp, T1, T2d); + T22 = FMA(Tp, Tg, T21); + T2U = Tr * T6; + T2V = FNMS(Tx, T1, T2U); + { + E T2Q, TF, TE, TM; + T2Q = Tr * T1; + T2R = FMA(Tx, T6, T2Q); + TF = Tr * Tg; + TG = FNMS(Tx, Tb, TF); + TD = FMA(Tx, Tg, TC); + TE = TD * T1; + TM = TD * T6; + TH = FMA(TG, T6, TE); + T1V = FMA(Tx, Tb, TF); + TN = FNMS(TG, T1, TM); + { + E TV, T2t, T12, T2p; + TV = TU * Tb; + T2t = TU * T1; + T12 = TU * Tg; + T2p = TU * T6; + TW = FNMS(Tp, Tn, Tw); + TX = FNMS(TW, Tg, TV); + T13 = FMA(TW, Tb, T12); + T2u = FMA(TW, T6, T2t); + T2q = FNMS(TW, T1, T2p); + T2m = FNMS(TW, Tb, T12); + T2j = FMA(TW, Tg, TV); + } + } + } + { + E T36, T3Q, T4D, T5f, T2Y, T5g, T3P, T4E, TT, T5k, T5R, T39, T3m, T49, T4X; + E T3T, T2i, T5r, T5T, T3c, T3B, T4o, T4U, T3W, T2J, T5u, T5U, T3d, T3I, T4v; + E T4V, T3X, T1G, T5n, T5Q, T3a, T3t, T4g, T4Y, T3U; + { + E T9, T2f, T5, T4k, T2c, T3i, TA, T2O, T1e, T2Z, T1O, T2G, TQ, T2W, T1Y; + E T2C, T3v, Tj, T27, T3g, T1l, T1m, T2v, T1D, T2n, T3E, T4c, T1x, T2k, T1y; + E T2l, T10, T31, T11, T32, T16, T34, T3p, T4B, T1b, T4A, T3n, T1T, T1U, T4q; + E T2A, Te, Tf, T4i, T24, T1r, T2s, T4a, T3C, Tv, T43, T2N, T3L, TL, T45; + E T2T, T3N, T1L, T4s, T2F, T3x, T35, T4C; + { + E Th, Ti, T14, T15; + { + E T7, T8, Ty, Tz; + T7 = Rp[WS(rs, 9)]; + T8 = Rm[WS(rs, 9)]; + T9 = T7 - T8; + T2f = T7 + T8; + { + E T4, T2b, T2, T3; + T2 = Ip[WS(rs, 9)]; + T3 = Im[WS(rs, 9)]; + T4 = T2 + T3; + T2b = T2 - T3; + T5 = T1 * T4; + T4k = T2e * T2b; + T2c = T2a * T2b; + T3i = T6 * T4; + } + Ty = Rp[WS(rs, 2)]; + Tz = Rm[WS(rs, 2)]; + TA = Ty + Tz; + T2O = Ty - Tz; + { + E T1c, T1d, T1M, T1N; + T1c = Ip[0]; + T1d = Im[0]; + T1e = T1c + T1d; + T2Z = T1c - T1d; + T1M = Rp[WS(rs, 1)]; + T1N = Rm[WS(rs, 1)]; + T1O = T1M - T1N; + T2G = T1M + T1N; + } + } + { + E TO, TP, T1W, T1X; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 7)]; + TQ = TO + TP; + T2W = TO - TP; + T1W = Rm[WS(rs, 6)]; + T1X = Rp[WS(rs, 6)]; + T1Y = T1W - T1X; + T2C = T1X + T1W; + T3v = T1Q * T1Y; + } + Th = Rm[WS(rs, 4)]; + Ti = Rp[WS(rs, 4)]; + Tj = Th - Ti; + T27 = Ti + Th; + T3g = Tb * Tj; + { + E T1j, T1k, T1B, T1C; + T1j = Ip[WS(rs, 8)]; + T1k = Im[WS(rs, 8)]; + T1l = T1j - T1k; + T1m = T1i * T1l; + T2v = T1j + T1k; + T1B = Rp[WS(rs, 3)]; + T1C = Rm[WS(rs, 3)]; + T1D = T1B + T1C; + T2n = T1B - T1C; + T3E = T2j * T2n; + T4c = T1u * T1D; + } + { + E T1v, T1w, TY, TZ; + T1v = Ip[WS(rs, 3)]; + T1w = Im[WS(rs, 3)]; + T1x = T1v - T1w; + T2k = T1v + T1w; + T1y = T1u * T1x; + T2l = T2j * T2k; + TY = Ip[WS(rs, 5)]; + TZ = Im[WS(rs, 5)]; + T10 = TY + TZ; + T31 = TY - TZ; + T11 = TX * T10; + T32 = T30 * T31; + } + T14 = Rp[WS(rs, 5)]; + T15 = Rm[WS(rs, 5)]; + T16 = T14 - T15; + T34 = T14 + T15; + T3p = TX * T16; + T4B = T30 * T34; + { + E T18, T19, T1a, T2z, T1R, T1S; + T18 = Rm[0]; + T19 = Rp[0]; + T1a = T18 - T19; + T1b = Tp * T1a; + T4A = T19 + T18; + T3n = Tm * T1a; + T1R = Ip[WS(rs, 6)]; + T1S = Im[WS(rs, 6)]; + T1T = T1R + T1S; + T2z = T1R - T1S; + T1U = T1Q * T1T; + T4q = T2B * T2z; + T2A = T2y * T2z; + } + { + E T23, Tc, Td, T2r, T1p, T1q; + Tc = Ip[WS(rs, 4)]; + Td = Im[WS(rs, 4)]; + Te = Tc + Td; + T23 = Tc - Td; + Tf = Tb * Te; + T4i = T26 * T23; + T24 = T22 * T23; + T1p = Rp[WS(rs, 8)]; + T1q = Rm[WS(rs, 8)]; + T1r = T1p + T1q; + T2r = T1q - T1p; + T2s = T2q * T2r; + T4a = T1i * T1r; + T3C = T2u * T2r; + } + { + E Tu, T2M, Ts, Tt; + Ts = Ip[WS(rs, 2)]; + Tt = Im[WS(rs, 2)]; + Tu = Ts - Tt; + T2M = Ts + Tt; + Tv = Tr * Tu; + T43 = Tx * Tu; + T2N = TD * T2M; + T3L = TG * T2M; + } + { + E TK, T2S, TI, TJ; + TI = Ip[WS(rs, 7)]; + TJ = Im[WS(rs, 7)]; + TK = TI - TJ; + T2S = TI + TJ; + TL = TH * TK; + T45 = TN * TK; + T2T = T2R * T2S; + T3N = T2V * T2S; + } + { + E T1K, T2E, T1I, T1J; + T1I = Ip[WS(rs, 1)]; + T1J = Im[WS(rs, 1)]; + T1K = T1I + T1J; + T2E = T1I - T1J; + T1L = Tn * T1K; + T4s = TW * T2E; + T2F = TU * T2E; + T3x = Tq * T1K; + } + } + T35 = FNMS(T33, T34, T32); + T36 = T2Z - T35; + T3Q = T35 + T2Z; + T4C = FMA(T33, T31, T4B); + T4D = T4A - T4C; + T5f = T4A + T4C; + { + E T2P, T2X, T3M, T3O; + T2P = FNMS(TG, T2O, T2N); + T2X = FNMS(T2V, T2W, T2T); + T2Y = T2P - T2X; + T5g = T2P + T2X; + T3M = FMA(TD, T2O, T3L); + T3O = FMA(T2R, T2W, T3N); + T3P = T3M + T3O; + T4E = T3O - T3M; + } + { + E Tl, T5j, T47, T5i, TS, T3l, T3k, T48; + { + E Ta, Tk, T44, T46; + Ta = FNMS(T6, T9, T5); + Tk = FMA(Tg, Tj, Tf); + Tl = Ta - Tk; + T5j = Tk + Ta; + T44 = FMA(Tr, TA, T43); + T46 = FMA(TH, TQ, T45); + T47 = T44 - T46; + T5i = T44 + T46; + } + { + E TB, TR, T3h, T3j; + TB = FNMS(Tx, TA, Tv); + TR = FNMS(TN, TQ, TL); + TS = TB - TR; + T3l = TB + TR; + T3h = FNMS(Tg, Te, T3g); + T3j = FMA(T1, T9, T3i); + T3k = T3h - T3j; + T48 = T3h + T3j; + } + TT = Tl - TS; + T5k = T5i + T5j; + T5R = T5i - T5j; + T39 = TS + Tl; + T3m = T3k - T3l; + T49 = T47 + T48; + T4X = T47 - T48; + T3T = T3l + T3k; + } + { + E T20, T5q, T4m, T5p, T2h, T3A, T3z, T4n; + { + E T1P, T1Z, T4j, T4l; + T1P = FNMS(Tq, T1O, T1L); + T1Z = FMA(T1V, T1Y, T1U); + T20 = T1P - T1Z; + T5q = T1Z + T1P; + T4j = FMA(T22, T27, T4i); + T4l = FMA(T2a, T2f, T4k); + T4m = T4j - T4l; + T5p = T4j + T4l; + } + { + E T28, T2g, T3w, T3y; + T28 = FNMS(T26, T27, T24); + T2g = FNMS(T2e, T2f, T2c); + T2h = T28 - T2g; + T3A = T28 + T2g; + T3w = FNMS(T1V, T1T, T3v); + T3y = FMA(Tn, T1O, T3x); + T3z = T3w - T3y; + T4n = T3w + T3y; + } + T2i = T20 - T2h; + T5r = T5p + T5q; + T5T = T5p - T5q; + T3c = T2h + T20; + T3B = T3z - T3A; + T4o = T4m + T4n; + T4U = T4m - T4n; + T3W = T3A + T3z; + } + { + E T2x, T5s, T4u, T5t, T2I, T3H, T3G, T4p; + { + E T2o, T2w, T4r, T4t; + T2o = FNMS(T2m, T2n, T2l); + T2w = FMA(T2u, T2v, T2s); + T2x = T2o - T2w; + T5s = T2w + T2o; + T4r = FMA(T2y, T2C, T4q); + T4t = FMA(TU, T2G, T4s); + T4u = T4r - T4t; + T5t = T4r + T4t; + } + { + E T2D, T2H, T3D, T3F; + T2D = FNMS(T2B, T2C, T2A); + T2H = FNMS(TW, T2G, T2F); + T2I = T2D - T2H; + T3H = T2D + T2H; + T3D = FNMS(T2q, T2v, T3C); + T3F = FMA(T2m, T2k, T3E); + T3G = T3D - T3F; + T4p = T3D + T3F; + } + T2J = T2x - T2I; + T5u = T5s + T5t; + T5U = T5t - T5s; + T3d = T2x + T2I; + T3I = T3G - T3H; + T4v = T4p + T4u; + T4V = T4u - T4p; + T3X = T3G + T3H; + } + { + E T1g, T5m, T4e, T5l, T1F, T3s, T3r, T4f; + { + E T17, T1f, T4b, T4d; + T17 = FNMS(T13, T16, T11); + T1f = FMA(Tm, T1e, T1b); + T1g = T17 - T1f; + T5m = T17 + T1f; + T4b = FMA(T1o, T1l, T4a); + T4d = FMA(T1A, T1x, T4c); + T4e = T4b - T4d; + T5l = T4b + T4d; + } + { + E T1s, T1E, T3o, T3q; + T1s = FNMS(T1o, T1r, T1m); + T1E = FNMS(T1A, T1D, T1y); + T1F = T1s - T1E; + T3s = T1s + T1E; + T3o = FNMS(Tp, T1e, T3n); + T3q = FMA(T13, T10, T3p); + T3r = T3o - T3q; + T4f = T3q + T3o; + } + T1G = T1g - T1F; + T5n = T5l + T5m; + T5Q = T5l - T5m; + T3a = T1F + T1g; + T3t = T3r - T3s; + T4g = T4e + T4f; + T4Y = T4e - T4f; + T3U = T3s + T3r; + } + } + { + E T50, T52, T37, T2L, T4R, T4S, T51, T4T; + { + E T4W, T4Z, T1H, T2K; + T4W = T4U - T4V; + T4Z = T4X - T4Y; + T50 = FNMS(KP618033988, T4Z, T4W); + T52 = FMA(KP618033988, T4W, T4Z); + T37 = T2Y + T36; + T1H = TT + T1G; + T2K = T2i + T2J; + T2L = T1H + T2K; + T4R = FMA(KP250000000, T2L, T37); + T4S = T1H - T2K; + } + Im[WS(rs, 4)] = KP500000000 * (T2L - T37); + T51 = FNMS(KP559016994, T4S, T4R); + Im[0] = -(KP500000000 * (FMA(KP951056516, T52, T51))); + Im[WS(rs, 8)] = -(KP500000000 * (FNMS(KP951056516, T52, T51))); + T4T = FMA(KP559016994, T4S, T4R); + Ip[WS(rs, 3)] = KP500000000 * (FNMS(KP951056516, T50, T4T)); + Ip[WS(rs, 7)] = KP500000000 * (FMA(KP951056516, T50, T4T)); + } + { + E T5c, T5e, T53, T56, T57, T58, T5d, T59; + { + E T5a, T5b, T54, T55; + T5a = T2J - T2i; + T5b = T1G - TT; + T5c = FNMS(KP618033988, T5b, T5a); + T5e = FMA(KP618033988, T5a, T5b); + T53 = T4D - T4E; + T54 = T4X + T4Y; + T55 = T4U + T4V; + T56 = T54 + T55; + T57 = FNMS(KP250000000, T56, T53); + T58 = T54 - T55; + } + Rm[WS(rs, 4)] = KP500000000 * (T53 + T56); + T5d = FMA(KP559016994, T58, T57); + Rm[WS(rs, 8)] = KP500000000 * (FMA(KP951056516, T5e, T5d)); + Rm[0] = KP500000000 * (FNMS(KP951056516, T5e, T5d)); + T59 = FNMS(KP559016994, T58, T57); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T5c, T59)); + Rp[WS(rs, 7)] = KP500000000 * (FNMS(KP951056516, T5c, T59)); + } + { + E T4x, T4z, T38, T3f, T40, T41, T4y, T42; + { + E T4h, T4w, T3b, T3e; + T4h = T49 - T4g; + T4w = T4o - T4v; + T4x = FMA(KP618033988, T4w, T4h); + T4z = FNMS(KP618033988, T4h, T4w); + T38 = T36 - T2Y; + T3b = T39 + T3a; + T3e = T3c + T3d; + T3f = T3b + T3e; + T40 = FNMS(KP250000000, T3f, T38); + T41 = T3b - T3e; + } + Ip[WS(rs, 5)] = KP500000000 * (T38 + T3f); + T4y = FNMS(KP559016994, T41, T40); + Im[WS(rs, 2)] = -(KP500000000 * (FMA(KP951056516, T4z, T4y))); + Im[WS(rs, 6)] = -(KP500000000 * (FNMS(KP951056516, T4z, T4y))); + T42 = FMA(KP559016994, T41, T40); + Ip[WS(rs, 1)] = KP500000000 * (FNMS(KP951056516, T4x, T42)); + Ip[WS(rs, 9)] = KP500000000 * (FMA(KP951056516, T4x, T42)); + } + { + E T4O, T4Q, T4F, T4I, T4J, T4K, T4P, T4L; + { + E T4M, T4N, T4G, T4H; + T4M = T39 - T3a; + T4N = T3c - T3d; + T4O = FMA(KP618033988, T4N, T4M); + T4Q = FNMS(KP618033988, T4M, T4N); + T4F = T4D + T4E; + T4G = T49 + T4g; + T4H = T4o + T4v; + T4I = T4G + T4H; + T4J = FNMS(KP250000000, T4I, T4F); + T4K = T4G - T4H; + } + Rp[WS(rs, 5)] = KP500000000 * (T4F + T4I); + T4P = FNMS(KP559016994, T4K, T4J); + Rm[WS(rs, 6)] = KP500000000 * (FMA(KP951056516, T4Q, T4P)); + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP951056516, T4Q, T4P)); + T4L = FMA(KP559016994, T4K, T4J); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T4O, T4L)); + Rp[WS(rs, 9)] = KP500000000 * (FNMS(KP951056516, T4O, T4L)); + } + { + E T5W, T5Y, T3R, T3K, T5N, T5O, T5X, T5P; + { + E T5S, T5V, T3u, T3J; + T5S = T5Q - T5R; + T5V = T5T - T5U; + T5W = FNMS(KP618033988, T5V, T5S); + T5Y = FMA(KP618033988, T5S, T5V); + T3R = T3P + T3Q; + T3u = T3m + T3t; + T3J = T3B + T3I; + T3K = T3u + T3J; + T5N = FMA(KP250000000, T3K, T3R); + T5O = T3J - T3u; + } + Im[WS(rs, 9)] = KP500000000 * (T3K - T3R); + T5X = FNMS(KP559016994, T5O, T5N); + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP951056516, T5Y, T5X)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP951056516, T5Y, T5X))); + T5P = FMA(KP559016994, T5O, T5N); + Ip[WS(rs, 6)] = KP500000000 * (FMA(KP951056516, T5W, T5P)); + Im[WS(rs, 5)] = -(KP500000000 * (FNMS(KP951056516, T5W, T5P))); + } + { + E T68, T6a, T5Z, T62, T63, T64, T69, T65; + { + E T66, T67, T60, T61; + T66 = T3I - T3B; + T67 = T3t - T3m; + T68 = FNMS(KP618033988, T67, T66); + T6a = FMA(KP618033988, T66, T67); + T5Z = T5f - T5g; + T60 = T5R + T5Q; + T61 = T5T + T5U; + T62 = T60 + T61; + T63 = FNMS(KP250000000, T62, T5Z); + T64 = T60 - T61; + } + Rm[WS(rs, 9)] = KP500000000 * (T5Z + T62); + T69 = FMA(KP559016994, T64, T63); + Rp[WS(rs, 6)] = KP500000000 * (FMA(KP951056516, T6a, T69)); + Rm[WS(rs, 5)] = KP500000000 * (FNMS(KP951056516, T6a, T69)); + T65 = FNMS(KP559016994, T64, T63); + Rp[WS(rs, 2)] = KP500000000 * (FNMS(KP951056516, T68, T65)); + Rm[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T68, T65)); + } + { + E T5K, T5M, T3S, T3Z, T5F, T5G, T5L, T5H; + { + E T5I, T5J, T3V, T3Y; + T5I = T5k - T5n; + T5J = T5u - T5r; + T5K = FNMS(KP618033988, T5J, T5I); + T5M = FMA(KP618033988, T5I, T5J); + T3S = T3Q - T3P; + T3V = T3T + T3U; + T3Y = T3W + T3X; + T3Z = T3V + T3Y; + T5F = FNMS(KP250000000, T3Z, T3S); + T5G = T3V - T3Y; + } + Ip[0] = KP500000000 * (T3S + T3Z); + T5L = FNMS(KP559016994, T5G, T5F); + Ip[WS(rs, 8)] = KP500000000 * (FMA(KP951056516, T5M, T5L)); + Im[WS(rs, 7)] = -(KP500000000 * (FNMS(KP951056516, T5M, T5L))); + T5H = FMA(KP559016994, T5G, T5F); + Ip[WS(rs, 4)] = KP500000000 * (FMA(KP951056516, T5K, T5H)); + Im[WS(rs, 3)] = -(KP500000000 * (FNMS(KP951056516, T5K, T5H))); + } + { + E T5C, T5E, T5h, T5w, T5x, T5y, T5D, T5z; + { + E T5A, T5B, T5o, T5v; + T5A = T3T - T3U; + T5B = T3W - T3X; + T5C = FMA(KP618033988, T5B, T5A); + T5E = FNMS(KP618033988, T5A, T5B); + T5h = T5f + T5g; + T5o = T5k + T5n; + T5v = T5r + T5u; + T5w = T5o + T5v; + T5x = FNMS(KP250000000, T5w, T5h); + T5y = T5o - T5v; + } + Rp[0] = KP500000000 * (T5h + T5w); + T5D = FNMS(KP559016994, T5y, T5x); + Rp[WS(rs, 8)] = KP500000000 * (FMA(KP951056516, T5E, T5D)); + Rm[WS(rs, 7)] = KP500000000 * (FNMS(KP951056516, T5E, T5D)); + T5z = FMA(KP559016994, T5y, T5x); + Rp[WS(rs, 4)] = KP500000000 * (FNMS(KP951056516, T5C, T5z)); + Rm[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T5C, T5z)); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cfdft2_20", twinstr, &GENUS, {176, 98, 140, 0} }; + +void X(codelet_hc2cfdft2_20) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_20, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -dit -name hc2cfdft2_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 316 FP additions, 180 FP multiplications, + * (or, 244 additions, 108 multiplications, 72 fused multiply/add), + * 134 stack variables, 5 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP125000000, +0.125000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP279508497, +0.279508497187473712051146708591409529430077295); + DK(KP293892626, +0.293892626146236564584352977319536384298826219); + DK(KP475528258, +0.475528258147576786058219666689691071702849317); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(80, rs)) { + E T4, T7, Tm, To, Tq, Tu, T1I, T1G, T8, T5, Ta, T1u, T2u, Tg, T2s; + E T21, T1A, T1Z, T1O, T2I, T1K, T2G, Tw, TC, T2a, T2e, TH, TI, TJ, TX; + E T2D, TN, T2B, T26, T1n, TZ, T24, T1j; + { + E T9, T1y, Te, T1t, T6, T1z, Tf, T1s; + { + E Tn, Tt, Tp, Ts; + T4 = W[0]; + T7 = W[1]; + Tm = W[2]; + To = W[3]; + Tn = T4 * Tm; + Tt = T7 * Tm; + Tp = T7 * To; + Ts = T4 * To; + Tq = Tn - Tp; + Tu = Ts + Tt; + T1I = Ts - Tt; + T1G = Tn + Tp; + T8 = W[5]; + T9 = T7 * T8; + T1y = Tm * T8; + Te = T4 * T8; + T1t = To * T8; + T5 = W[4]; + T6 = T4 * T5; + T1z = To * T5; + Tf = T7 * T5; + T1s = Tm * T5; + } + Ta = T6 - T9; + T1u = T1s + T1t; + T2u = T1y + T1z; + Tg = Te + Tf; + T2s = T1s - T1t; + T21 = Te - Tf; + T1A = T1y - T1z; + T1Z = T6 + T9; + { + E T1M, T1N, T1H, T1J; + T1M = T1G * T8; + T1N = T1I * T5; + T1O = T1M + T1N; + T2I = T1M - T1N; + T1H = T1G * T5; + T1J = T1I * T8; + T1K = T1H - T1J; + T2G = T1H + T1J; + { + E Tr, Tv, TA, TB; + Tr = Tq * T5; + Tv = Tu * T8; + Tw = Tr + Tv; + TA = Tq * T8; + TB = Tu * T5; + TC = TA - TB; + T2a = Tr - Tv; + T2e = TA + TB; + TH = W[6]; + TI = W[7]; + TJ = FMA(Tq, TH, Tu * TI); + TX = FMA(Tw, TH, TC * TI); + T2D = FMA(T1G, TH, T1I * TI); + TN = FNMS(Tu, TH, Tq * TI); + T2B = FNMS(T1I, TH, T1G * TI); + T26 = FNMS(T7, TH, T4 * TI); + T1n = FNMS(To, TH, Tm * TI); + TZ = FNMS(TC, TH, Tw * TI); + T24 = FMA(T4, TH, T7 * TI); + T1j = FMA(Tm, TH, To * TI); + } + } + } + { + E Tl, T3n, T1i, T2Q, T47, T50, T4S, T5i, T2M, T2T, T4I, T5f, T4L, T5e, T4P; + E T5h, T2r, T2S, T1X, T2P, T31, T3u, T36, T3t, T3E, T4l, T3U, T4j, T3h, T3r; + E T3J, T4m, T3c, T3q, T3P, T4i, TS, T51, T3m, T48; + { + E T3, T45, T1V, T3f, Tz, TF, TW, T3A, TM, TQ, T11, T3B, Td, Tj, T1Q; + E T3e, T19, T3L, T23, T39, T2p, T3S, T2z, T34, T1E, T3G, T2K, T2Y, T1g, T3M; + E T28, T3a, T2i, T3R, T2w, T33, T1r, T3F, T2F, T2X, T4N, T4O; + { + E T1, T2, T1R, T1S, T1T, T1U; + T1 = Ip[0]; + T2 = Im[0]; + T1R = T1 + T2; + T1S = Rp[0]; + T1T = Rm[0]; + T1U = T1S - T1T; + T3 = T1 - T2; + T45 = T1S + T1T; + T1V = FNMS(T7, T1U, T4 * T1R); + T3f = FMA(T4, T1U, T7 * T1R); + } + { + E Tx, Ty, TU, TD, TE, TV; + Tx = Ip[WS(rs, 2)]; + Ty = Im[WS(rs, 2)]; + TU = Tx - Ty; + TD = Rp[WS(rs, 2)]; + TE = Rm[WS(rs, 2)]; + TV = TD + TE; + Tz = Tx + Ty; + TF = TD - TE; + TW = FNMS(Tu, TV, Tq * TU); + T3A = FMA(Tu, TU, Tq * TV); + } + { + E TK, TL, TY, TO, TP, T10; + TK = Ip[WS(rs, 7)]; + TL = Im[WS(rs, 7)]; + TY = TK - TL; + TO = Rp[WS(rs, 7)]; + TP = Rm[WS(rs, 7)]; + T10 = TO + TP; + TM = TK + TL; + TQ = TO - TP; + T11 = FNMS(TZ, T10, TX * TY); + T3B = FMA(TZ, TY, TX * T10); + } + { + E Tb, Tc, T1L, Th, Ti, T1P; + Tb = Ip[WS(rs, 5)]; + Tc = Im[WS(rs, 5)]; + T1L = Tb + Tc; + Th = Rp[WS(rs, 5)]; + Ti = Rm[WS(rs, 5)]; + T1P = Th - Ti; + Td = Tb - Tc; + Tj = Th + Ti; + T1Q = FNMS(T1O, T1P, T1K * T1L); + T3e = FMA(T1K, T1P, T1O * T1L); + } + { + E T15, T20, T18, T22; + { + E T13, T14, T16, T17; + T13 = Ip[WS(rs, 4)]; + T14 = Im[WS(rs, 4)]; + T15 = T13 + T14; + T20 = T13 - T14; + T16 = Rp[WS(rs, 4)]; + T17 = Rm[WS(rs, 4)]; + T18 = T16 - T17; + T22 = T16 + T17; + } + T19 = FNMS(T8, T18, T5 * T15); + T3L = FMA(T21, T20, T1Z * T22); + T23 = FNMS(T21, T22, T1Z * T20); + T39 = FMA(T8, T15, T5 * T18); + } + { + E T2l, T2x, T2o, T2y; + { + E T2j, T2k, T2m, T2n; + T2j = Ip[WS(rs, 1)]; + T2k = Im[WS(rs, 1)]; + T2l = T2j + T2k; + T2x = T2j - T2k; + T2m = Rp[WS(rs, 1)]; + T2n = Rm[WS(rs, 1)]; + T2o = T2m - T2n; + T2y = T2m + T2n; + } + T2p = FNMS(To, T2o, Tm * T2l); + T3S = FMA(T1I, T2x, T1G * T2y); + T2z = FNMS(T1I, T2y, T1G * T2x); + T34 = FMA(To, T2l, Tm * T2o); + } + { + E T1x, T2H, T1D, T2J; + { + E T1v, T1w, T1B, T1C; + T1v = Ip[WS(rs, 3)]; + T1w = Im[WS(rs, 3)]; + T1x = T1v - T1w; + T2H = T1v + T1w; + T1B = Rp[WS(rs, 3)]; + T1C = Rm[WS(rs, 3)]; + T1D = T1B + T1C; + T2J = T1B - T1C; + } + T1E = FNMS(T1A, T1D, T1u * T1x); + T3G = FMA(T1u, T1D, T1A * T1x); + T2K = FNMS(T2I, T2J, T2G * T2H); + T2Y = FMA(T2G, T2J, T2I * T2H); + } + { + E T1c, T25, T1f, T27; + { + E T1a, T1b, T1d, T1e; + T1a = Ip[WS(rs, 9)]; + T1b = Im[WS(rs, 9)]; + T1c = T1a + T1b; + T25 = T1a - T1b; + T1d = Rp[WS(rs, 9)]; + T1e = Rm[WS(rs, 9)]; + T1f = T1d - T1e; + T27 = T1d + T1e; + } + T1g = FNMS(TI, T1f, TH * T1c); + T3M = FMA(T26, T25, T24 * T27); + T28 = FNMS(T26, T27, T24 * T25); + T3a = FMA(TI, T1c, TH * T1f); + } + { + E T2d, T2t, T2h, T2v; + { + E T2b, T2c, T2f, T2g; + T2b = Ip[WS(rs, 6)]; + T2c = Im[WS(rs, 6)]; + T2d = T2b + T2c; + T2t = T2b - T2c; + T2f = Rp[WS(rs, 6)]; + T2g = Rm[WS(rs, 6)]; + T2h = T2f - T2g; + T2v = T2f + T2g; + } + T2i = FNMS(T2e, T2h, T2a * T2d); + T3R = FMA(T2u, T2t, T2s * T2v); + T2w = FNMS(T2u, T2v, T2s * T2t); + T33 = FMA(T2e, T2d, T2a * T2h); + } + { + E T1m, T2E, T1q, T2C; + { + E T1k, T1l, T1o, T1p; + T1k = Ip[WS(rs, 8)]; + T1l = Im[WS(rs, 8)]; + T1m = T1k - T1l; + T2E = T1k + T1l; + T1o = Rp[WS(rs, 8)]; + T1p = Rm[WS(rs, 8)]; + T1q = T1o + T1p; + T2C = T1p - T1o; + } + T1r = FNMS(T1n, T1q, T1j * T1m); + T3F = FMA(T1j, T1q, T1n * T1m); + T2F = FMA(T2B, T2C, T2D * T2E); + T2X = FNMS(T2B, T2E, T2D * T2C); + } + { + E Tk, T12, T1h, T46; + Tk = FNMS(Tg, Tj, Ta * Td); + Tl = T3 - Tk; + T3n = Tk + T3; + T12 = TW - T11; + T1h = T19 - T1g; + T1i = T12 - T1h; + T2Q = T12 + T1h; + T46 = FMA(Ta, Tj, Tg * Td); + T47 = T45 - T46; + T50 = T45 + T46; + { + E T4Q, T4R, T2A, T2L; + T4Q = T2F + T2K; + T4R = T3R + T3S; + T4S = T4Q + T4R; + T5i = T4R - T4Q; + T2A = T2w - T2z; + T2L = T2F - T2K; + T2M = T2A - T2L; + T2T = T2L + T2A; + } + } + { + E T4G, T4H, T4J, T4K; + T4G = T3A + T3B; + T4H = T19 + T1g; + T4I = T4G + T4H; + T5f = T4G - T4H; + T4J = T3F + T3G; + T4K = T1Q + T1V; + T4L = T4J + T4K; + T5e = T4J - T4K; + } + T4N = T3L + T3M; + T4O = T2i + T2p; + T4P = T4N + T4O; + T5h = T4N - T4O; + { + E T29, T2q, T1F, T1W; + T29 = T23 - T28; + T2q = T2i - T2p; + T2r = T29 - T2q; + T2S = T29 + T2q; + T1F = T1r - T1E; + T1W = T1Q - T1V; + T1X = T1F + T1W; + T2P = T1W - T1F; + } + { + E T3C, T3D, T3N, T3O; + { + E T2Z, T30, T32, T35; + T2Z = T2X - T2Y; + T30 = T2w + T2z; + T31 = T2Z - T30; + T3u = T2Z + T30; + T32 = T23 + T28; + T35 = T33 + T34; + T36 = T32 + T35; + T3t = T32 - T35; + } + T3C = T3A - T3B; + T3D = T3a - T39; + T3E = T3C + T3D; + T4l = T3C - T3D; + { + E T3Q, T3T, T3d, T3g; + T3Q = T2X + T2Y; + T3T = T3R - T3S; + T3U = T3Q + T3T; + T4j = T3T - T3Q; + T3d = T1r + T1E; + T3g = T3e + T3f; + T3h = T3d + T3g; + T3r = T3d - T3g; + } + { + E T3H, T3I, T38, T3b; + T3H = T3F - T3G; + T3I = T3e - T3f; + T3J = T3H + T3I; + T4m = T3H - T3I; + T38 = TW + T11; + T3b = T39 + T3a; + T3c = T38 + T3b; + T3q = T38 - T3b; + } + T3N = T3L - T3M; + T3O = T34 - T33; + T3P = T3N + T3O; + T4i = T3N - T3O; + { + E TG, TR, T3k, T3l; + TG = FNMS(TC, TF, Tw * Tz); + TR = FNMS(TN, TQ, TJ * TM); + TS = TG - TR; + T51 = TG + TR; + T3k = FMA(TC, Tz, Tw * TF); + T3l = FMA(TN, TM, TJ * TQ); + T3m = T3k + T3l; + T48 = T3l - T3k; + } + } + } + { + E T3W, T3Y, TT, T2O, T3x, T3y, T3X, T3z; + { + E T3K, T3V, T1Y, T2N; + T3K = T3E - T3J; + T3V = T3P - T3U; + T3W = FMA(KP475528258, T3K, KP293892626 * T3V); + T3Y = FNMS(KP293892626, T3K, KP475528258 * T3V); + TT = Tl - TS; + T1Y = T1i + T1X; + T2N = T2r + T2M; + T2O = T1Y + T2N; + T3x = KP279508497 * (T1Y - T2N); + T3y = FNMS(KP125000000, T2O, KP500000000 * TT); + } + Ip[WS(rs, 5)] = KP500000000 * (TT + T2O); + T3X = T3x - T3y; + Im[WS(rs, 2)] = T3X - T3Y; + Im[WS(rs, 6)] = T3X + T3Y; + T3z = T3x + T3y; + Ip[WS(rs, 1)] = T3z - T3W; + Ip[WS(rs, 9)] = T3z + T3W; + } + { + E T41, T4d, T49, T4a, T44, T4b, T4e, T4c; + { + E T3Z, T40, T42, T43; + T3Z = T1i - T1X; + T40 = T2r - T2M; + T41 = FMA(KP475528258, T3Z, KP293892626 * T40); + T4d = FNMS(KP293892626, T3Z, KP475528258 * T40); + T49 = T47 + T48; + T42 = T3E + T3J; + T43 = T3P + T3U; + T4a = T42 + T43; + T44 = KP279508497 * (T42 - T43); + T4b = FNMS(KP125000000, T4a, KP500000000 * T49); + } + Rp[WS(rs, 5)] = KP500000000 * (T49 + T4a); + T4e = T4b - T44; + Rm[WS(rs, 6)] = T4d + T4e; + Rm[WS(rs, 2)] = T4e - T4d; + T4c = T44 + T4b; + Rp[WS(rs, 1)] = T41 + T4c; + Rp[WS(rs, 9)] = T4c - T41; + } + { + E T4o, T4q, T2W, T2V, T4f, T4g, T4p, T4h; + { + E T4k, T4n, T2R, T2U; + T4k = T4i - T4j; + T4n = T4l - T4m; + T4o = FNMS(KP293892626, T4n, KP475528258 * T4k); + T4q = FMA(KP475528258, T4n, KP293892626 * T4k); + T2W = TS + Tl; + T2R = T2P - T2Q; + T2U = T2S + T2T; + T2V = T2R - T2U; + T4f = FMA(KP500000000, T2W, KP125000000 * T2V); + T4g = KP279508497 * (T2R + T2U); + } + Im[WS(rs, 4)] = KP500000000 * (T2V - T2W); + T4p = T4g - T4f; + Im[0] = T4p - T4q; + Im[WS(rs, 8)] = T4p + T4q; + T4h = T4f + T4g; + Ip[WS(rs, 3)] = T4h - T4o; + Ip[WS(rs, 7)] = T4h + T4o; + } + { + E T4t, T4B, T4u, T4x, T4y, T4z, T4C, T4A; + { + E T4r, T4s, T4v, T4w; + T4r = T2S - T2T; + T4s = T2Q + T2P; + T4t = FNMS(KP293892626, T4s, KP475528258 * T4r); + T4B = FMA(KP475528258, T4s, KP293892626 * T4r); + T4u = T47 - T48; + T4v = T4l + T4m; + T4w = T4i + T4j; + T4x = T4v + T4w; + T4y = FNMS(KP125000000, T4x, KP500000000 * T4u); + T4z = KP279508497 * (T4v - T4w); + } + Rm[WS(rs, 4)] = KP500000000 * (T4u + T4x); + T4C = T4z + T4y; + Rm[WS(rs, 8)] = T4B + T4C; + Rm[0] = T4C - T4B; + T4A = T4y - T4z; + Rp[WS(rs, 3)] = T4t + T4A; + Rp[WS(rs, 7)] = T4A - T4t; + } + { + E T5k, T5m, T3o, T3j, T5b, T5c, T5l, T5d; + { + E T5g, T5j, T37, T3i; + T5g = T5e - T5f; + T5j = T5h - T5i; + T5k = FNMS(KP293892626, T5j, KP475528258 * T5g); + T5m = FMA(KP293892626, T5g, KP475528258 * T5j); + T3o = T3m + T3n; + T37 = T31 - T36; + T3i = T3c + T3h; + T3j = T37 - T3i; + T5b = FMA(KP500000000, T3o, KP125000000 * T3j); + T5c = KP279508497 * (T3i + T37); + } + Im[WS(rs, 9)] = KP500000000 * (T3j - T3o); + T5l = T5b - T5c; + Ip[WS(rs, 2)] = T5l + T5m; + Im[WS(rs, 1)] = T5m - T5l; + T5d = T5b + T5c; + Ip[WS(rs, 6)] = T5d + T5k; + Im[WS(rs, 5)] = T5k - T5d; + } + { + E T5w, T5x, T5n, T5q, T5r, T5s, T5y, T5t; + { + E T5u, T5v, T5o, T5p; + T5u = T36 + T31; + T5v = T3c - T3h; + T5w = FNMS(KP293892626, T5v, KP475528258 * T5u); + T5x = FMA(KP475528258, T5v, KP293892626 * T5u); + T5n = T50 - T51; + T5o = T5f + T5e; + T5p = T5h + T5i; + T5q = T5o + T5p; + T5r = FNMS(KP125000000, T5q, KP500000000 * T5n); + T5s = KP279508497 * (T5o - T5p); + } + Rm[WS(rs, 9)] = KP500000000 * (T5n + T5q); + T5y = T5s + T5r; + Rp[WS(rs, 6)] = T5x + T5y; + Rm[WS(rs, 5)] = T5y - T5x; + T5t = T5r - T5s; + Rp[WS(rs, 2)] = T5t - T5w; + Rm[WS(rs, 1)] = T5w + T5t; + } + { + E T4U, T4W, T3p, T3w, T4D, T4E, T4V, T4F; + { + E T4M, T4T, T3s, T3v; + T4M = T4I - T4L; + T4T = T4P - T4S; + T4U = FNMS(KP475528258, T4T, KP293892626 * T4M); + T4W = FMA(KP475528258, T4M, KP293892626 * T4T); + T3p = T3n - T3m; + T3s = T3q + T3r; + T3v = T3t + T3u; + T3w = T3s + T3v; + T4D = FNMS(KP125000000, T3w, KP500000000 * T3p); + T4E = KP279508497 * (T3s - T3v); + } + Ip[0] = KP500000000 * (T3p + T3w); + T4V = T4E + T4D; + Ip[WS(rs, 4)] = T4V + T4W; + Im[WS(rs, 3)] = T4W - T4V; + T4F = T4D - T4E; + Ip[WS(rs, 8)] = T4F + T4U; + Im[WS(rs, 7)] = T4U - T4F; + } + { + E T58, T59, T52, T53, T4Z, T54, T5a, T55; + { + E T56, T57, T4X, T4Y; + T56 = T3q - T3r; + T57 = T3t - T3u; + T58 = FMA(KP475528258, T56, KP293892626 * T57); + T59 = FNMS(KP293892626, T56, KP475528258 * T57); + T52 = T50 + T51; + T4X = T4I + T4L; + T4Y = T4P + T4S; + T53 = T4X + T4Y; + T4Z = KP279508497 * (T4X - T4Y); + T54 = FNMS(KP125000000, T53, KP500000000 * T52); + } + Rp[0] = KP500000000 * (T52 + T53); + T5a = T54 - T4Z; + Rp[WS(rs, 8)] = T59 + T5a; + Rm[WS(rs, 7)] = T5a - T59; + T55 = T4Z + T54; + Rp[WS(rs, 4)] = T55 - T58; + Rm[WS(rs, 3)] = T58 + T55; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cfdft2_20", twinstr, &GENUS, {244, 108, 72, 0} }; + +void X(codelet_hc2cfdft2_20) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_20, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_32.c new file mode 100644 index 000000000..97a13a4f5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_32.c @@ -0,0 +1,2057 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:17 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -dit -name hc2cfdft2_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 552 FP additions, 414 FP multiplications, + * (or, 300 additions, 162 multiplications, 252 fused multiply/add), + * 175 stack variables, 8 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(128, rs)) { + E T1, Th, T2, T5, Ti, Tl, T4, T6, T1a, Tc, T1c, Tk, Tz, T2H, T2v; + E T1u, Tm, Ts, T15, T2W, TZ, T2l, T2q, T2R, TR, TL, T3B, T3S, T3F, T3V; + E T4E, T4Y, T4I, T51, TF, T40, T44, T2A, T4M, T4Q, T1A, T3s, T3w, T2M, T4l; + E T4p, T1g, T1H, T1F, T1d, T1h, T1O, T1n, T1I, T28, T34, T32, T25, T29, T3b; + E T2f, T35; + { + E Tj, TY, TK, Tr, T14, TQ, T1b, T24, TE, T1z; + { + E T3, T1t, Tb, Ty; + T1 = W[0]; + Th = W[4]; + T2 = W[2]; + T5 = W[3]; + T3 = T1 * T2; + T1t = T2 * Th; + Tb = T1 * T5; + Ty = T1 * Th; + Ti = W[6]; + Tj = Th * Ti; + TY = T2 * Ti; + TK = T1 * Ti; + Tl = W[7]; + Tr = Th * Tl; + T14 = T2 * Tl; + TQ = T1 * Tl; + T4 = W[1]; + T6 = FMA(T4, T5, T3); + T1a = FNMS(T4, T5, T3); + T1b = T1a * Th; + T24 = T6 * Th; + Tc = FNMS(T4, T2, Tb); + T1c = FMA(T4, T2, Tb); + Tk = W[5]; + TE = T1 * Tk; + T1z = T2 * Tk; + Tz = FNMS(T4, Tk, Ty); + T2H = FMA(T4, Tk, Ty); + T2v = FNMS(T5, Tk, T1t); + T1u = FMA(T5, Tk, T1t); + } + Tm = FMA(Tk, Tl, Tj); + Ts = FNMS(Tk, Ti, Tr); + T15 = FMA(T5, Ti, T14); + T2W = FNMS(T5, Ti, T14); + TZ = FNMS(T5, Tl, TY); + T2l = FNMS(T4, Tl, TK); + T2q = FMA(T4, Ti, TQ); + T2R = FMA(T5, Tl, TY); + TR = FNMS(T4, Ti, TQ); + TL = FMA(T4, Tl, TK); + { + E T3A, T3E, T4k, T4o; + T3A = T6 * Ti; + T3B = FNMS(Tc, Tl, T3A); + T3S = FMA(Tc, Tl, T3A); + T3E = T6 * Tl; + T3F = FMA(Tc, Ti, T3E); + T3V = FNMS(Tc, Ti, T3E); + { + E T4D, T4H, T3Z, T43; + T4D = T1a * Ti; + T4E = FNMS(T1c, Tl, T4D); + T4Y = FMA(T1c, Tl, T4D); + T4H = T1a * Tl; + T4I = FMA(T1c, Ti, T4H); + T51 = FNMS(T1c, Ti, T4H); + T3Z = Tz * Ti; + T43 = Tz * Tl; + TF = FMA(T4, Th, TE); + T40 = FMA(TF, Tl, T3Z); + T44 = FNMS(TF, Ti, T43); + } + { + E T4L, T4P, T3r, T3v; + T4L = T2v * Ti; + T4P = T2v * Tl; + T2A = FMA(T5, Th, T1z); + T4M = FMA(T2A, Tl, T4L); + T4Q = FNMS(T2A, Ti, T4P); + T3r = T1u * Ti; + T3v = T1u * Tl; + T1A = FNMS(T5, Th, T1z); + T3s = FMA(T1A, Tl, T3r); + T3w = FNMS(T1A, Ti, T3v); + } + T4k = T2H * Ti; + T4o = T2H * Tl; + T2M = FNMS(T4, Th, TE); + T4l = FMA(T2M, Tl, T4k); + T4p = FNMS(T2M, Ti, T4o); + { + E T1G, T1N, T1e, T1m, T1f; + T1f = T1a * Tk; + T1g = FMA(T1c, Th, T1f); + T1H = FNMS(T1c, Th, T1f); + T1F = FMA(T1c, Tk, T1b); + T1G = T1F * Ti; + T1N = T1F * Tl; + T1d = FNMS(T1c, Tk, T1b); + T1e = T1d * Ti; + T1m = T1d * Tl; + T1h = FMA(T1g, Tl, T1e); + T1O = FNMS(T1H, Ti, T1N); + T1n = FNMS(T1g, Ti, T1m); + T1I = FMA(T1H, Tl, T1G); + } + { + E T33, T3a, T26, T2e, T27; + T27 = T6 * Tk; + T28 = FNMS(Tc, Th, T27); + T34 = FMA(Tc, Th, T27); + T32 = FNMS(Tc, Tk, T24); + T33 = T32 * Ti; + T3a = T32 * Tl; + T25 = FMA(Tc, Tk, T24); + T26 = T25 * Ti; + T2e = T25 * Tl; + T29 = FMA(T28, Tl, T26); + T3b = FNMS(T34, Ti, T3a); + T2f = FNMS(T28, Ti, T2e); + T35 = FMA(T34, Tl, T33); + } + } + } + { + E T3j, T7Z, T5b, T93, T4d, T8J, T6B, T8V, T1T, T8l, T6e, T8r, T54, T8C, T5O; + E T8i, T31, T94, T6w, T8K, T3Y, T8U, T5g, T80, T1s, T8h, T69, T8B, T4T, T8q; + E T5J, T8k, Tx, T8a, T5y, T8d, T4s, T8E, T5Y, T8v, T2k, T82, T5m, T83, T3z; + E T8X, T6l, T8O, T2F, T86, T5r, T85, T3M, T8Y, T6q, T8R, TW, T8e, T5D, T8b; + E T4B, T8F, T63, T8y; + { + E T3i, T4b, T38, T39, T45, T4a, T6z, T58, T3e, T42, T6x, T59, T3f, T5a; + { + E T3g, T3h, T36, T37; + T3g = Ip[0]; + T3h = Im[0]; + T3i = T3g - T3h; + T4b = T3g + T3h; + T36 = Ip[WS(rs, 8)]; + T37 = Im[WS(rs, 8)]; + T38 = T36 - T37; + T39 = T35 * T38; + T45 = T36 + T37; + } + { + E T47, T48, T49, T41, T3c, T3d; + T47 = Rm[0]; + T48 = Rp[0]; + T49 = T47 - T48; + T4a = T1 * T49; + T6z = T4 * T49; + T58 = T48 + T47; + T3c = Rp[WS(rs, 8)]; + T3d = Rm[WS(rs, 8)]; + T3e = T3c + T3d; + T41 = T3d - T3c; + T42 = T40 * T41; + T6x = T44 * T41; + T59 = T35 * T3e; + } + T3f = FNMS(T3b, T3e, T39); + T3j = T3f + T3i; + T7Z = T3i - T3f; + T5a = FMA(T3b, T38, T59); + T5b = T58 + T5a; + T93 = T58 - T5a; + { + E T46, T4c, T6y, T6A; + T46 = FNMS(T44, T45, T42); + T4c = FNMS(T4, T4b, T4a); + T4d = T46 + T4c; + T8J = T4c - T46; + T6y = FMA(T40, T45, T6x); + T6A = FMA(T1, T4b, T6z); + T6B = T6y + T6A; + T8V = T6A - T6y; + } + } + { + E T1x, T4W, T1y, T6a, T1D, T4U, T4V, T5K, T1L, T52, T1M, T6c, T1R, T4Z, T50; + E T5M; + { + E T1v, T1w, T1B, T1C; + T1v = Ip[WS(rs, 3)]; + T1w = Im[WS(rs, 3)]; + T1x = T1v - T1w; + T4W = T1v + T1w; + T1y = T1u * T1x; + T6a = T25 * T4W; + T1B = Rp[WS(rs, 3)]; + T1C = Rm[WS(rs, 3)]; + T1D = T1B + T1C; + T4U = T1B - T1C; + T4V = T25 * T4U; + T5K = T1u * T1D; + } + { + E T1J, T1K, T1P, T1Q; + T1J = Ip[WS(rs, 11)]; + T1K = Im[WS(rs, 11)]; + T1L = T1J - T1K; + T52 = T1J + T1K; + T1M = T1I * T1L; + T6c = T4Y * T52; + T1P = Rp[WS(rs, 11)]; + T1Q = Rm[WS(rs, 11)]; + T1R = T1P + T1Q; + T4Z = T1P - T1Q; + T50 = T4Y * T4Z; + T5M = T1I * T1R; + } + { + E T1E, T1S, T6b, T6d; + T1E = FNMS(T1A, T1D, T1y); + T1S = FNMS(T1O, T1R, T1M); + T1T = T1E + T1S; + T8l = T1E - T1S; + T6b = FNMS(T28, T4U, T6a); + T6d = FNMS(T51, T4Z, T6c); + T6e = T6b + T6d; + T8r = T6d - T6b; + } + { + E T4X, T53, T5L, T5N; + T4X = FMA(T28, T4W, T4V); + T53 = FMA(T51, T52, T50); + T54 = T4X + T53; + T8C = T53 - T4X; + T5L = FMA(T1A, T1x, T5K); + T5N = FMA(T1O, T1L, T5M); + T5O = T5L + T5N; + T8i = T5L - T5N; + } + } + { + E T2K, T2L, T3Q, T2P, T3P, T6s, T5c, T2U, T2V, T3W, T2Z, T3U, T6u, T5e; + { + E T2I, T2J, T3O, T2N, T2O; + T2I = Ip[WS(rs, 4)]; + T2J = Im[WS(rs, 4)]; + T2K = T2I - T2J; + T2L = T2H * T2K; + T3Q = T2I + T2J; + T2N = Rp[WS(rs, 4)]; + T2O = Rm[WS(rs, 4)]; + T2P = T2N + T2O; + T3O = T2O - T2N; + T3P = Th * T3O; + T6s = Tk * T3O; + T5c = T2H * T2P; + } + { + E T2S, T2T, T3T, T2X, T2Y; + T2S = Ip[WS(rs, 12)]; + T2T = Im[WS(rs, 12)]; + T2U = T2S - T2T; + T2V = T2R * T2U; + T3W = T2S + T2T; + T2X = Rp[WS(rs, 12)]; + T2Y = Rm[WS(rs, 12)]; + T2Z = T2X + T2Y; + T3T = T2Y - T2X; + T3U = T3S * T3T; + T6u = T3V * T3T; + T5e = T2R * T2Z; + } + { + E T2Q, T30, T6t, T6v; + T2Q = FNMS(T2M, T2P, T2L); + T30 = FNMS(T2W, T2Z, T2V); + T31 = T2Q + T30; + T94 = T2Q - T30; + T6t = FMA(Th, T3Q, T6s); + T6v = FMA(T3S, T3W, T6u); + T6w = T6t + T6v; + T8K = T6t - T6v; + } + { + E T3R, T3X, T5d, T5f; + T3R = FNMS(Tk, T3Q, T3P); + T3X = FNMS(T3V, T3W, T3U); + T3Y = T3R + T3X; + T8U = T3R - T3X; + T5d = FMA(T2M, T2K, T5c); + T5f = FMA(T2W, T2U, T5e); + T5g = T5d + T5f; + T80 = T5d - T5f; + } + } + { + E T12, T4J, T13, T65, T18, T4F, T4G, T5F, T1k, T4R, T1l, T67, T1q, T4N, T4O; + E T5H; + { + E T10, T11, T16, T17; + T10 = Ip[WS(rs, 15)]; + T11 = Im[WS(rs, 15)]; + T12 = T10 - T11; + T4J = T10 + T11; + T13 = TZ * T12; + T65 = T4E * T4J; + T16 = Rp[WS(rs, 15)]; + T17 = Rm[WS(rs, 15)]; + T18 = T16 + T17; + T4F = T16 - T17; + T4G = T4E * T4F; + T5F = TZ * T18; + } + { + E T1i, T1j, T1o, T1p; + T1i = Ip[WS(rs, 7)]; + T1j = Im[WS(rs, 7)]; + T1k = T1i - T1j; + T4R = T1i + T1j; + T1l = T1h * T1k; + T67 = T4M * T4R; + T1o = Rp[WS(rs, 7)]; + T1p = Rm[WS(rs, 7)]; + T1q = T1o + T1p; + T4N = T1o - T1p; + T4O = T4M * T4N; + T5H = T1h * T1q; + } + { + E T19, T1r, T66, T68; + T19 = FNMS(T15, T18, T13); + T1r = FNMS(T1n, T1q, T1l); + T1s = T19 + T1r; + T8h = T19 - T1r; + T66 = FNMS(T4I, T4F, T65); + T68 = FNMS(T4Q, T4N, T67); + T69 = T66 + T68; + T8B = T66 - T68; + } + { + E T4K, T4S, T5G, T5I; + T4K = FMA(T4I, T4J, T4G); + T4S = FMA(T4Q, T4R, T4O); + T4T = T4K + T4S; + T8q = T4S - T4K; + T5G = FMA(T15, T12, T5F); + T5I = FMA(T1n, T1k, T5H); + T5J = T5G + T5I; + T8k = T5G - T5I; + } + } + { + E T9, T4i, Ta, T5U, Tf, T4g, T4h, T5u, Tp, T4q, Tq, T5W, Tv, T4m, T4n; + E T5w; + { + E T7, T8, Td, Te; + T7 = Ip[WS(rs, 1)]; + T8 = Im[WS(rs, 1)]; + T9 = T7 - T8; + T4i = T7 + T8; + Ta = T6 * T9; + T5U = T2 * T4i; + Td = Rp[WS(rs, 1)]; + Te = Rm[WS(rs, 1)]; + Tf = Td + Te; + T4g = Td - Te; + T4h = T2 * T4g; + T5u = T6 * Tf; + } + { + E Tn, To, Tt, Tu; + Tn = Ip[WS(rs, 9)]; + To = Im[WS(rs, 9)]; + Tp = Tn - To; + T4q = Tn + To; + Tq = Tm * Tp; + T5W = T4l * T4q; + Tt = Rp[WS(rs, 9)]; + Tu = Rm[WS(rs, 9)]; + Tv = Tt + Tu; + T4m = Tt - Tu; + T4n = T4l * T4m; + T5w = Tm * Tv; + } + { + E Tg, Tw, T5v, T5x; + Tg = FNMS(Tc, Tf, Ta); + Tw = FNMS(Ts, Tv, Tq); + Tx = Tg + Tw; + T8a = Tg - Tw; + T5v = FMA(Tc, T9, T5u); + T5x = FMA(Ts, Tp, T5w); + T5y = T5v + T5x; + T8d = T5v - T5x; + { + E T4j, T4r, T8t, T5V, T5X, T8u; + T4j = FMA(T5, T4i, T4h); + T4r = FMA(T4p, T4q, T4n); + T8t = T4r - T4j; + T5V = FNMS(T5, T4g, T5U); + T5X = FNMS(T4p, T4m, T5W); + T8u = T5V - T5X; + T4s = T4j + T4r; + T8E = T8u + T8t; + T5Y = T5V + T5X; + T8v = T8t - T8u; + } + } + } + { + E T1Y, T1Z, T3p, T22, T3o, T6h, T5i, T2c, T2d, T3x, T2i, T3u, T6j, T5k; + { + E T1W, T1X, T3n, T20, T21; + T1W = Ip[WS(rs, 2)]; + T1X = Im[WS(rs, 2)]; + T1Y = T1W - T1X; + T1Z = T1a * T1Y; + T3p = T1W + T1X; + T20 = Rp[WS(rs, 2)]; + T21 = Rm[WS(rs, 2)]; + T22 = T20 + T21; + T3n = T21 - T20; + T3o = T1F * T3n; + T6h = T1H * T3n; + T5i = T1a * T22; + } + { + E T2a, T2b, T3t, T2g, T2h; + T2a = Ip[WS(rs, 10)]; + T2b = Im[WS(rs, 10)]; + T2c = T2a - T2b; + T2d = T29 * T2c; + T3x = T2a + T2b; + T2g = Rp[WS(rs, 10)]; + T2h = Rm[WS(rs, 10)]; + T2i = T2g + T2h; + T3t = T2h - T2g; + T3u = T3s * T3t; + T6j = T3w * T3t; + T5k = T29 * T2i; + } + { + E T23, T2j, T5j, T5l; + T23 = FNMS(T1c, T22, T1Z); + T2j = FNMS(T2f, T2i, T2d); + T2k = T23 + T2j; + T82 = T23 - T2j; + T5j = FMA(T1c, T1Y, T5i); + T5l = FMA(T2f, T2c, T5k); + T5m = T5j + T5l; + T83 = T5j - T5l; + { + E T3q, T3y, T8M, T6i, T6k, T8N; + T3q = FNMS(T1H, T3p, T3o); + T3y = FNMS(T3w, T3x, T3u); + T8M = T3q - T3y; + T6i = FMA(T1F, T3p, T6h); + T6k = FMA(T3s, T3x, T6j); + T8N = T6i - T6k; + T3z = T3q + T3y; + T8X = T8M + T8N; + T6l = T6i + T6k; + T8O = T8M - T8N; + } + } + } + { + E T2o, T2p, T3G, T2t, T3D, T6m, T5n, T2y, T2z, T3K, T2D, T3J, T6o, T5p; + { + E T2m, T2n, T3C, T2r, T2s; + T2m = Ip[WS(rs, 14)]; + T2n = Im[WS(rs, 14)]; + T2o = T2m - T2n; + T2p = T2l * T2o; + T3G = T2m + T2n; + T2r = Rp[WS(rs, 14)]; + T2s = Rm[WS(rs, 14)]; + T2t = T2r + T2s; + T3C = T2s - T2r; + T3D = T3B * T3C; + T6m = T3F * T3C; + T5n = T2l * T2t; + } + { + E T2w, T2x, T3I, T2B, T2C; + T2w = Ip[WS(rs, 6)]; + T2x = Im[WS(rs, 6)]; + T2y = T2w - T2x; + T2z = T2v * T2y; + T3K = T2w + T2x; + T2B = Rp[WS(rs, 6)]; + T2C = Rm[WS(rs, 6)]; + T2D = T2B + T2C; + T3I = T2C - T2B; + T3J = T1d * T3I; + T6o = T1g * T3I; + T5p = T2v * T2D; + } + { + E T2u, T2E, T5o, T5q; + T2u = FNMS(T2q, T2t, T2p); + T2E = FNMS(T2A, T2D, T2z); + T2F = T2u + T2E; + T86 = T2u - T2E; + T5o = FMA(T2q, T2o, T5n); + T5q = FMA(T2A, T2y, T5p); + T5r = T5o + T5q; + T85 = T5o - T5q; + { + E T3H, T3L, T8P, T6n, T6p, T8Q; + T3H = FNMS(T3F, T3G, T3D); + T3L = FNMS(T1g, T3K, T3J); + T8P = T3H - T3L; + T6n = FMA(T3B, T3G, T6m); + T6p = FMA(T1d, T3K, T6o); + T8Q = T6n - T6p; + T3M = T3H + T3L; + T8Y = T8Q - T8P; + T6q = T6n + T6p; + T8R = T8P + T8Q; + } + } + } + { + E TC, T4v, TD, T5Z, TI, T4t, T4u, T5z, TO, T4z, TP, T61, TU, T4x, T4y; + E T5B; + { + E TA, TB, TG, TH; + TA = Ip[WS(rs, 5)]; + TB = Im[WS(rs, 5)]; + TC = TA - TB; + T4v = TA + TB; + TD = Tz * TC; + T5Z = T32 * T4v; + TG = Rp[WS(rs, 5)]; + TH = Rm[WS(rs, 5)]; + TI = TG + TH; + T4t = TG - TH; + T4u = T32 * T4t; + T5z = Tz * TI; + } + { + E TM, TN, TS, TT; + TM = Ip[WS(rs, 13)]; + TN = Im[WS(rs, 13)]; + TO = TM - TN; + T4z = TM + TN; + TP = TL * TO; + T61 = Ti * T4z; + TS = Rp[WS(rs, 13)]; + TT = Rm[WS(rs, 13)]; + TU = TS + TT; + T4x = TS - TT; + T4y = Ti * T4x; + T5B = TL * TU; + } + { + E TJ, TV, T5A, T5C; + TJ = FNMS(TF, TI, TD); + TV = FNMS(TR, TU, TP); + TW = TJ + TV; + T8e = TJ - TV; + T5A = FMA(TF, TC, T5z); + T5C = FMA(TR, TO, T5B); + T5D = T5A + T5C; + T8b = T5A - T5C; + { + E T4w, T4A, T8x, T60, T62, T8w; + T4w = FMA(T34, T4v, T4u); + T4A = FMA(Tl, T4z, T4y); + T8x = T4w - T4A; + T60 = FNMS(T34, T4t, T5Z); + T62 = FNMS(Tl, T4x, T61); + T8w = T62 - T60; + T4B = T4w + T4A; + T8F = T8w - T8x; + T63 = T60 + T62; + T8y = T8w + T8x; + } + } + } + { + E T1V, T6S, T3l, T6I, T5Q, T6H, T5t, T6R, T56, T6W, T6g, T6M, T4f, T6X, T6D; + E T6P; + { + E TX, T1U, T5h, T5s; + TX = Tx + TW; + T1U = T1s + T1T; + T1V = TX + T1U; + T6S = TX - T1U; + { + E T2G, T3k, T5E, T5P; + T2G = T2k + T2F; + T3k = T31 + T3j; + T3l = T2G + T3k; + T6I = T3k - T2G; + T5E = T5y + T5D; + T5P = T5J + T5O; + T5Q = T5E + T5P; + T6H = T5P - T5E; + } + T5h = T5b + T5g; + T5s = T5m + T5r; + T5t = T5h + T5s; + T6R = T5h - T5s; + { + E T4C, T55, T6L, T64, T6f, T6K; + T4C = T4s + T4B; + T55 = T4T + T54; + T6L = T4C - T55; + T64 = T5Y + T63; + T6f = T69 + T6e; + T6K = T6f - T64; + T56 = T4C + T55; + T6W = T6K - T6L; + T6g = T64 + T6f; + T6M = T6K + T6L; + } + { + E T3N, T4e, T6N, T6r, T6C, T6O; + T3N = T3z + T3M; + T4e = T3Y + T4d; + T6N = T4e - T3N; + T6r = T6l + T6q; + T6C = T6w + T6B; + T6O = T6C - T6r; + T4f = T3N + T4e; + T6X = T6N + T6O; + T6D = T6r + T6C; + T6P = T6N - T6O; + } + } + { + E T3m, T57, T6F, T6G; + T3m = T1V + T3l; + T57 = T4f - T56; + Ip[0] = KP500000000 * (T3m + T57); + Im[WS(rs, 15)] = KP500000000 * (T57 - T3m); + T6F = T5t + T5Q; + T6G = T6g + T6D; + Rm[WS(rs, 15)] = KP500000000 * (T6F - T6G); + Rp[0] = KP500000000 * (T6F + T6G); + } + { + E T5R, T5S, T5T, T6E; + T5R = T5t - T5Q; + T5S = T56 + T4f; + Rm[WS(rs, 7)] = KP500000000 * (T5R - T5S); + Rp[WS(rs, 8)] = KP500000000 * (T5R + T5S); + T5T = T3l - T1V; + T6E = T6g - T6D; + Ip[WS(rs, 8)] = KP500000000 * (T5T + T6E); + Im[WS(rs, 7)] = KP500000000 * (T6E - T5T); + } + { + E T6J, T6Q, T6Z, T70; + T6J = T6H + T6I; + T6Q = T6M + T6P; + Ip[WS(rs, 4)] = KP500000000 * (FMA(KP707106781, T6Q, T6J)); + Im[WS(rs, 11)] = -(KP500000000 * (FNMS(KP707106781, T6Q, T6J))); + T6Z = T6R + T6S; + T70 = T6W + T6X; + Rm[WS(rs, 11)] = KP500000000 * (FNMS(KP707106781, T70, T6Z)); + Rp[WS(rs, 4)] = KP500000000 * (FMA(KP707106781, T70, T6Z)); + } + { + E T6T, T6U, T6V, T6Y; + T6T = T6R - T6S; + T6U = T6P - T6M; + Rm[WS(rs, 3)] = KP500000000 * (FNMS(KP707106781, T6U, T6T)); + Rp[WS(rs, 12)] = KP500000000 * (FMA(KP707106781, T6U, T6T)); + T6V = T6I - T6H; + T6Y = T6W - T6X; + Ip[WS(rs, 12)] = KP500000000 * (FMA(KP707106781, T6Y, T6V)); + Im[WS(rs, 3)] = -(KP500000000 * (FNMS(KP707106781, T6Y, T6V))); + } + } + { + E T73, T7F, T7t, T7P, T7a, T7Q, T7w, T7G, T7i, T7U, T7A, T7K, T7p, T7V, T7B; + E T7N; + { + E T71, T72, T7r, T7s; + T71 = T5r - T5m; + T72 = T3j - T31; + T73 = T71 + T72; + T7F = T72 - T71; + T7r = T5b - T5g; + T7s = T2k - T2F; + T7t = T7r + T7s; + T7P = T7r - T7s; + } + { + E T76, T7u, T79, T7v; + { + E T74, T75, T77, T78; + T74 = Tx - TW; + T75 = T5y - T5D; + T76 = T74 - T75; + T7u = T75 + T74; + T77 = T5J - T5O; + T78 = T1s - T1T; + T79 = T77 + T78; + T7v = T77 - T78; + } + T7a = T76 + T79; + T7Q = T76 - T79; + T7w = T7u + T7v; + T7G = T7v - T7u; + } + { + E T7e, T7I, T7h, T7J; + { + E T7c, T7d, T7f, T7g; + T7c = T63 - T5Y; + T7d = T54 - T4T; + T7e = T7c + T7d; + T7I = T7c - T7d; + T7f = T4B - T4s; + T7g = T69 - T6e; + T7h = T7f + T7g; + T7J = T7g - T7f; + } + T7i = FMA(KP414213562, T7h, T7e); + T7U = FNMS(KP414213562, T7I, T7J); + T7A = FNMS(KP414213562, T7e, T7h); + T7K = FMA(KP414213562, T7J, T7I); + } + { + E T7l, T7L, T7o, T7M; + { + E T7j, T7k, T7m, T7n; + T7j = T6q - T6l; + T7k = T4d - T3Y; + T7l = T7j + T7k; + T7L = T7k - T7j; + T7m = T3z - T3M; + T7n = T6B - T6w; + T7o = T7m + T7n; + T7M = T7n - T7m; + } + T7p = FNMS(KP414213562, T7o, T7l); + T7V = FNMS(KP414213562, T7L, T7M); + T7B = FMA(KP414213562, T7l, T7o); + T7N = FMA(KP414213562, T7M, T7L); + } + { + E T7b, T7q, T7D, T7E; + T7b = FMA(KP707106781, T7a, T73); + T7q = T7i + T7p; + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP923879532, T7q, T7b)); + Im[WS(rs, 13)] = -(KP500000000 * (FNMS(KP923879532, T7q, T7b))); + T7D = FMA(KP707106781, T7w, T7t); + T7E = T7A + T7B; + Rm[WS(rs, 13)] = KP500000000 * (FNMS(KP923879532, T7E, T7D)); + Rp[WS(rs, 2)] = KP500000000 * (FMA(KP923879532, T7E, T7D)); + } + { + E T7x, T7y, T7z, T7C; + T7x = FNMS(KP707106781, T7w, T7t); + T7y = T7p - T7i; + Rm[WS(rs, 5)] = KP500000000 * (FNMS(KP923879532, T7y, T7x)); + Rp[WS(rs, 10)] = KP500000000 * (FMA(KP923879532, T7y, T7x)); + T7z = FNMS(KP707106781, T7a, T73); + T7C = T7A - T7B; + Ip[WS(rs, 10)] = KP500000000 * (FMA(KP923879532, T7C, T7z)); + Im[WS(rs, 5)] = -(KP500000000 * (FNMS(KP923879532, T7C, T7z))); + } + { + E T7H, T7O, T7X, T7Y; + T7H = FNMS(KP707106781, T7G, T7F); + T7O = T7K - T7N; + Ip[WS(rs, 14)] = KP500000000 * (FMA(KP923879532, T7O, T7H)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP923879532, T7O, T7H))); + T7X = FNMS(KP707106781, T7Q, T7P); + T7Y = T7U + T7V; + Rp[WS(rs, 14)] = KP500000000 * (FNMS(KP923879532, T7Y, T7X)); + Rm[WS(rs, 1)] = KP500000000 * (FMA(KP923879532, T7Y, T7X)); + } + { + E T7R, T7S, T7T, T7W; + T7R = FMA(KP707106781, T7Q, T7P); + T7S = T7K + T7N; + Rm[WS(rs, 9)] = KP500000000 * (FNMS(KP923879532, T7S, T7R)); + Rp[WS(rs, 6)] = KP500000000 * (FMA(KP923879532, T7S, T7R)); + T7T = FMA(KP707106781, T7G, T7F); + T7W = T7U - T7V; + Ip[WS(rs, 6)] = KP500000000 * (FMA(KP923879532, T7W, T7T)); + Im[WS(rs, 9)] = -(KP500000000 * (FNMS(KP923879532, T7W, T7T))); + } + } + { + E T89, Tat, T9l, Ta7, T99, Taj, T9v, T9H, T8o, T9w, T9c, T9m, Ta3, Tay, Tae; + E Tao, T8I, T9A, T9g, T9q, T9O, Tau, Taa, Tak, T9W, Taz, Taf, Tar, T91, T9B; + E T9h, T9t; + { + E T81, Ta5, T88, Ta6, T84, T87; + T81 = T7Z - T80; + Ta5 = T93 - T94; + T84 = T82 - T83; + T87 = T85 + T86; + T88 = T84 + T87; + Ta6 = T84 - T87; + T89 = FMA(KP707106781, T88, T81); + Tat = FNMS(KP707106781, Ta6, Ta5); + T9l = FNMS(KP707106781, T88, T81); + Ta7 = FMA(KP707106781, Ta6, Ta5); + } + { + E T95, T9F, T98, T9G, T96, T97; + T95 = T93 + T94; + T9F = T80 + T7Z; + T96 = T83 + T82; + T97 = T85 - T86; + T98 = T96 + T97; + T9G = T97 - T96; + T99 = FMA(KP707106781, T98, T95); + Taj = FNMS(KP707106781, T9G, T9F); + T9v = FNMS(KP707106781, T98, T95); + T9H = FMA(KP707106781, T9G, T9F); + } + { + E T8g, T9a, T8n, T9b; + { + E T8c, T8f, T8j, T8m; + T8c = T8a - T8b; + T8f = T8d + T8e; + T8g = FNMS(KP414213562, T8f, T8c); + T9a = FMA(KP414213562, T8c, T8f); + T8j = T8h - T8i; + T8m = T8k + T8l; + T8n = FMA(KP414213562, T8m, T8j); + T9b = FNMS(KP414213562, T8j, T8m); + } + T8o = T8g + T8n; + T9w = T8g - T8n; + T9c = T9a + T9b; + T9m = T9b - T9a; + } + { + E T9Z, Tam, Ta2, Tan; + { + E T9X, T9Y, Ta0, Ta1; + T9X = T8r - T8q; + T9Y = T8F - T8E; + T9Z = FNMS(KP707106781, T9Y, T9X); + Tam = FMA(KP707106781, T9Y, T9X); + Ta0 = T8B - T8C; + Ta1 = T8y - T8v; + Ta2 = FNMS(KP707106781, Ta1, Ta0); + Tan = FMA(KP707106781, Ta1, Ta0); + } + Ta3 = FNMS(KP668178637, Ta2, T9Z); + Tay = FNMS(KP198912367, Tam, Tan); + Tae = FMA(KP668178637, T9Z, Ta2); + Tao = FMA(KP198912367, Tan, Tam); + } + { + E T8A, T9o, T8H, T9p; + { + E T8s, T8z, T8D, T8G; + T8s = T8q + T8r; + T8z = T8v + T8y; + T8A = FMA(KP707106781, T8z, T8s); + T9o = FNMS(KP707106781, T8z, T8s); + T8D = T8B + T8C; + T8G = T8E + T8F; + T8H = FMA(KP707106781, T8G, T8D); + T9p = FNMS(KP707106781, T8G, T8D); + } + T8I = FMA(KP198912367, T8H, T8A); + T9A = FMA(KP668178637, T9o, T9p); + T9g = FNMS(KP198912367, T8A, T8H); + T9q = FNMS(KP668178637, T9p, T9o); + } + { + E T9K, Ta9, T9N, Ta8; + { + E T9I, T9J, T9L, T9M; + T9I = T8k - T8l; + T9J = T8h + T8i; + T9K = FMA(KP414213562, T9J, T9I); + Ta9 = FNMS(KP414213562, T9I, T9J); + T9L = T8d - T8e; + T9M = T8a + T8b; + T9N = FNMS(KP414213562, T9M, T9L); + Ta8 = FMA(KP414213562, T9L, T9M); + } + T9O = T9K - T9N; + Tau = T9N + T9K; + Taa = Ta8 - Ta9; + Tak = Ta8 + Ta9; + } + { + E T9S, Tap, T9V, Taq; + { + E T9Q, T9R, T9T, T9U; + T9Q = T8K + T8J; + T9R = T8X - T8Y; + T9S = FNMS(KP707106781, T9R, T9Q); + Tap = FMA(KP707106781, T9R, T9Q); + T9T = T8V - T8U; + T9U = T8R - T8O; + T9V = FNMS(KP707106781, T9U, T9T); + Taq = FMA(KP707106781, T9U, T9T); + } + T9W = FNMS(KP668178637, T9V, T9S); + Taz = FNMS(KP198912367, Tap, Taq); + Taf = FMA(KP668178637, T9S, T9V); + Tar = FMA(KP198912367, Taq, Tap); + } + { + E T8T, T9r, T90, T9s; + { + E T8L, T8S, T8W, T8Z; + T8L = T8J - T8K; + T8S = T8O + T8R; + T8T = FMA(KP707106781, T8S, T8L); + T9r = FNMS(KP707106781, T8S, T8L); + T8W = T8U + T8V; + T8Z = T8X + T8Y; + T90 = FMA(KP707106781, T8Z, T8W); + T9s = FNMS(KP707106781, T8Z, T8W); + } + T91 = FNMS(KP198912367, T90, T8T); + T9B = FNMS(KP668178637, T9r, T9s); + T9h = FMA(KP198912367, T8T, T90); + T9t = FMA(KP668178637, T9s, T9r); + } + { + E T8p, T92, T9j, T9k; + T8p = FMA(KP923879532, T8o, T89); + T92 = T8I + T91; + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP980785280, T92, T8p)); + Im[WS(rs, 14)] = -(KP500000000 * (FNMS(KP980785280, T92, T8p))); + T9j = FMA(KP923879532, T9c, T99); + T9k = T9g + T9h; + Rm[WS(rs, 14)] = KP500000000 * (FNMS(KP980785280, T9k, T9j)); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP980785280, T9k, T9j)); + } + { + E T9d, T9e, T9f, T9i; + T9d = FNMS(KP923879532, T9c, T99); + T9e = T91 - T8I; + Rm[WS(rs, 6)] = KP500000000 * (FNMS(KP980785280, T9e, T9d)); + Rp[WS(rs, 9)] = KP500000000 * (FMA(KP980785280, T9e, T9d)); + T9f = FNMS(KP923879532, T8o, T89); + T9i = T9g - T9h; + Ip[WS(rs, 9)] = KP500000000 * (FMA(KP980785280, T9i, T9f)); + Im[WS(rs, 6)] = -(KP500000000 * (FNMS(KP980785280, T9i, T9f))); + } + { + E T9n, T9u, T9D, T9E; + T9n = FNMS(KP923879532, T9m, T9l); + T9u = T9q + T9t; + Ip[WS(rs, 13)] = KP500000000 * (FNMS(KP831469612, T9u, T9n)); + Im[WS(rs, 2)] = -(KP500000000 * (FMA(KP831469612, T9u, T9n))); + T9D = FNMS(KP923879532, T9w, T9v); + T9E = T9A + T9B; + Rp[WS(rs, 13)] = KP500000000 * (FNMS(KP831469612, T9E, T9D)); + Rm[WS(rs, 2)] = KP500000000 * (FMA(KP831469612, T9E, T9D)); + } + { + E T9x, T9y, T9z, T9C; + T9x = FMA(KP923879532, T9w, T9v); + T9y = T9t - T9q; + Rm[WS(rs, 10)] = KP500000000 * (FNMS(KP831469612, T9y, T9x)); + Rp[WS(rs, 5)] = KP500000000 * (FMA(KP831469612, T9y, T9x)); + T9z = FMA(KP923879532, T9m, T9l); + T9C = T9A - T9B; + Ip[WS(rs, 5)] = KP500000000 * (FMA(KP831469612, T9C, T9z)); + Im[WS(rs, 10)] = -(KP500000000 * (FNMS(KP831469612, T9C, T9z))); + } + { + E T9P, Ta4, Tah, Tai; + T9P = FMA(KP923879532, T9O, T9H); + Ta4 = T9W - Ta3; + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP831469612, Ta4, T9P)); + Im[WS(rs, 12)] = -(KP500000000 * (FNMS(KP831469612, Ta4, T9P))); + Tah = FMA(KP923879532, Taa, Ta7); + Tai = Tae + Taf; + Rm[WS(rs, 12)] = KP500000000 * (FNMS(KP831469612, Tai, Tah)); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP831469612, Tai, Tah)); + } + { + E Tab, Tac, Tad, Tag; + Tab = FNMS(KP923879532, Taa, Ta7); + Tac = Ta3 + T9W; + Rm[WS(rs, 4)] = KP500000000 * (FNMS(KP831469612, Tac, Tab)); + Rp[WS(rs, 11)] = KP500000000 * (FMA(KP831469612, Tac, Tab)); + Tad = FNMS(KP923879532, T9O, T9H); + Tag = Tae - Taf; + Ip[WS(rs, 11)] = KP500000000 * (FMA(KP831469612, Tag, Tad)); + Im[WS(rs, 4)] = -(KP500000000 * (FNMS(KP831469612, Tag, Tad))); + } + { + E Tal, Tas, TaB, TaC; + Tal = FMA(KP923879532, Tak, Taj); + Tas = Tao - Tar; + Ip[WS(rs, 15)] = KP500000000 * (FMA(KP980785280, Tas, Tal)); + Im[0] = -(KP500000000 * (FNMS(KP980785280, Tas, Tal))); + TaB = FMA(KP923879532, Tau, Tat); + TaC = Tay + Taz; + Rp[WS(rs, 15)] = KP500000000 * (FNMS(KP980785280, TaC, TaB)); + Rm[0] = KP500000000 * (FMA(KP980785280, TaC, TaB)); + } + { + E Tav, Taw, Tax, TaA; + Tav = FNMS(KP923879532, Tau, Tat); + Taw = Tao + Tar; + Rm[WS(rs, 8)] = KP500000000 * (FNMS(KP980785280, Taw, Tav)); + Rp[WS(rs, 7)] = KP500000000 * (FMA(KP980785280, Taw, Tav)); + Tax = FNMS(KP923879532, Tak, Taj); + TaA = Tay - Taz; + Ip[WS(rs, 7)] = KP500000000 * (FMA(KP980785280, TaA, Tax)); + Im[WS(rs, 8)] = -(KP500000000 * (FNMS(KP980785280, TaA, Tax))); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cfdft2_32", twinstr, &GENUS, {300, 162, 252, 0} }; + +void X(codelet_hc2cfdft2_32) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_32, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -dit -name hc2cfdft2_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 552 FP additions, 300 FP multiplications, + * (or, 440 additions, 188 multiplications, 112 fused multiply/add), + * 166 stack variables, 9 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP277785116, +0.277785116509801112371415406974266437187468595); + DK(KP415734806, +0.415734806151272618539394188808952878369280406); + DK(KP097545161, +0.097545161008064133924142434238511120463845809); + DK(KP490392640, +0.490392640201615224563091118067119518486966865); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP191341716, +0.191341716182544885864229992015199433380672281); + DK(KP461939766, +0.461939766255643378064091594698394143411208313); + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 8, MAKE_VOLATILE_STRIDE(128, rs)) { + E T1, T4, T2, T5, T7, T1b, T1d, Td, Ti, Tk, Tj, Tl, TL, TR, T2h; + E T2O, T16, T2l, T10, T2K, Tm, Tq, T3s, T3K, T3w, T3M, T4e, T4u, T4i, T4w; + E Ty, TE, T3h, T3j, T2q, T2u, T4l, T4n, T1v, T1B, T3E, T3G, T2B, T2F, T3Y; + E T40, T1f, T1G, T1i, T1H, T1j, T1M, T1n, T1I, T23, T2U, T26, T2V, T27, T30; + E T2b, T2W; + { + E Tw, T1A, TD, T1t, Tx, T1z, TC, T1u, TJ, T15, TQ, TY, TK, T14, TP; + E TZ; + { + E T3, Tc, T6, Tb; + T1 = W[0]; + T4 = W[1]; + T2 = W[2]; + T5 = W[3]; + T3 = T1 * T2; + Tc = T4 * T2; + T6 = T4 * T5; + Tb = T1 * T5; + T7 = T3 + T6; + T1b = T3 - T6; + T1d = Tb + Tc; + Td = Tb - Tc; + Ti = W[4]; + Tw = T1 * Ti; + T1A = T5 * Ti; + TD = T4 * Ti; + T1t = T2 * Ti; + Tk = W[5]; + Tx = T4 * Tk; + T1z = T2 * Tk; + TC = T1 * Tk; + T1u = T5 * Tk; + Tj = W[6]; + TJ = T1 * Tj; + T15 = T5 * Tj; + TQ = T4 * Tj; + TY = T2 * Tj; + Tl = W[7]; + TK = T4 * Tl; + T14 = T2 * Tl; + TP = T1 * Tl; + TZ = T5 * Tl; + } + TL = TJ + TK; + TR = TP - TQ; + T2h = TJ - TK; + T2O = T14 - T15; + T16 = T14 + T15; + T2l = TP + TQ; + T10 = TY - TZ; + T2K = TY + TZ; + Tm = FMA(Ti, Tj, Tk * Tl); + Tq = FNMS(Tk, Tj, Ti * Tl); + { + E T3q, T3r, T3u, T3v; + T3q = T7 * Tj; + T3r = Td * Tl; + T3s = T3q + T3r; + T3K = T3q - T3r; + T3u = T7 * Tl; + T3v = Td * Tj; + T3w = T3u - T3v; + T3M = T3u + T3v; + } + { + E T4c, T4d, T4g, T4h; + T4c = T1b * Tj; + T4d = T1d * Tl; + T4e = T4c - T4d; + T4u = T4c + T4d; + T4g = T1b * Tl; + T4h = T1d * Tj; + T4i = T4g + T4h; + T4w = T4g - T4h; + Ty = Tw - Tx; + TE = TC + TD; + T3h = FMA(Ty, Tj, TE * Tl); + T3j = FNMS(TE, Tj, Ty * Tl); + } + T2q = T1t - T1u; + T2u = T1z + T1A; + T4l = FMA(T2q, Tj, T2u * Tl); + T4n = FNMS(T2u, Tj, T2q * Tl); + T1v = T1t + T1u; + T1B = T1z - T1A; + T3E = FMA(T1v, Tj, T1B * Tl); + T3G = FNMS(T1B, Tj, T1v * Tl); + T2B = Tw + Tx; + T2F = TC - TD; + T3Y = FMA(T2B, Tj, T2F * Tl); + T40 = FNMS(T2F, Tj, T2B * Tl); + { + E T1c, T1e, T1g, T1h; + T1c = T1b * Ti; + T1e = T1d * Tk; + T1f = T1c - T1e; + T1G = T1c + T1e; + T1g = T1b * Tk; + T1h = T1d * Ti; + T1i = T1g + T1h; + T1H = T1g - T1h; + } + T1j = FMA(T1f, Tj, T1i * Tl); + T1M = FNMS(T1H, Tj, T1G * Tl); + T1n = FNMS(T1i, Tj, T1f * Tl); + T1I = FMA(T1G, Tj, T1H * Tl); + { + E T21, T22, T24, T25; + T21 = T7 * Ti; + T22 = Td * Tk; + T23 = T21 + T22; + T2U = T21 - T22; + T24 = T7 * Tk; + T25 = Td * Ti; + T26 = T24 - T25; + T2V = T24 + T25; + } + T27 = FMA(T23, Tj, T26 * Tl); + T30 = FNMS(T2V, Tj, T2U * Tl); + T2b = FNMS(T26, Tj, T23 * Tl); + T2W = FMA(T2U, Tj, T2V * Tl); + } + { + E T38, T7l, T7S, T8Y, T7Z, T91, T3A, T6k, T4F, T83, T5C, T6n, T2T, T84, T4I; + E T7m, T2g, T4M, T4P, T2z, T3T, T6m, T7O, T7V, T7j, T87, T5v, T6j, T7L, T7U; + E T7g, T86, Tv, TW, T61, T4U, T4X, T62, T4b, T6c, T7v, T7C, T5g, T6f, T74; + E T8G, T7s, T7B, T71, T8F, T1s, T1R, T65, T51, T54, T64, T4A, T6g, T7G, T8U; + E T5n, T6d, T7b, T8J, T7z, T8R, T78, T8I; + { + E T2E, T2I, T3p, T5w, T37, T4D, T3g, T5A, T2N, T2R, T3y, T5x, T2Z, T33, T3l; + E T5z; + { + E T2C, T2D, T3o, T2G, T2H, T3n; + T2C = Ip[WS(rs, 4)]; + T2D = Im[WS(rs, 4)]; + T3o = T2C + T2D; + T2G = Rp[WS(rs, 4)]; + T2H = Rm[WS(rs, 4)]; + T3n = T2G - T2H; + T2E = T2C - T2D; + T2I = T2G + T2H; + T3p = FMA(Ti, T3n, Tk * T3o); + T5w = FNMS(Tk, T3n, Ti * T3o); + } + { + E T35, T36, T3f, T3c, T3d, T3e; + T35 = Ip[0]; + T36 = Im[0]; + T3f = T35 + T36; + T3c = Rm[0]; + T3d = Rp[0]; + T3e = T3c - T3d; + T37 = T35 - T36; + T4D = T3d + T3c; + T3g = FNMS(T4, T3f, T1 * T3e); + T5A = FMA(T4, T3e, T1 * T3f); + } + { + E T2L, T2M, T3x, T2P, T2Q, T3t; + T2L = Ip[WS(rs, 12)]; + T2M = Im[WS(rs, 12)]; + T3x = T2L + T2M; + T2P = Rp[WS(rs, 12)]; + T2Q = Rm[WS(rs, 12)]; + T3t = T2P - T2Q; + T2N = T2L - T2M; + T2R = T2P + T2Q; + T3y = FMA(T3s, T3t, T3w * T3x); + T5x = FNMS(T3w, T3t, T3s * T3x); + } + { + E T2X, T2Y, T3k, T31, T32, T3i; + T2X = Ip[WS(rs, 8)]; + T2Y = Im[WS(rs, 8)]; + T3k = T2X + T2Y; + T31 = Rp[WS(rs, 8)]; + T32 = Rm[WS(rs, 8)]; + T3i = T31 - T32; + T2Z = T2X - T2Y; + T33 = T31 + T32; + T3l = FMA(T3h, T3i, T3j * T3k); + T5z = FNMS(T3j, T3i, T3h * T3k); + } + { + E T34, T7Q, T7R, T4E, T5y, T5B; + T34 = FNMS(T30, T33, T2W * T2Z); + T38 = T34 + T37; + T7l = T37 - T34; + T7Q = T3l + T3g; + T7R = T5w - T5x; + T7S = T7Q - T7R; + T8Y = T7R + T7Q; + { + E T7X, T7Y, T3m, T3z; + T7X = T3y - T3p; + T7Y = T5A - T5z; + T7Z = T7X + T7Y; + T91 = T7Y - T7X; + T3m = T3g - T3l; + T3z = T3p + T3y; + T3A = T3m - T3z; + T6k = T3z + T3m; + } + T4E = FMA(T2W, T33, T30 * T2Z); + T4F = T4D + T4E; + T83 = T4D - T4E; + T5y = T5w + T5x; + T5B = T5z + T5A; + T5C = T5y + T5B; + T6n = T5B - T5y; + { + E T2J, T2S, T4G, T4H; + T2J = FNMS(T2F, T2I, T2B * T2E); + T2S = FNMS(T2O, T2R, T2K * T2N); + T2T = T2J + T2S; + T84 = T2J - T2S; + T4G = FMA(T2B, T2I, T2F * T2E); + T4H = FMA(T2K, T2R, T2O * T2N); + T4I = T4G + T4H; + T7m = T4G - T4H; + } + } + } + { + E T20, T5p, T3D, T4K, T2y, T5t, T3R, T4O, T2f, T5q, T3I, T4L, T2p, T5s, T3O; + E T4N; + { + E T1W, T3C, T1Z, T3B; + { + E T1U, T1V, T1X, T1Y; + T1U = Ip[WS(rs, 2)]; + T1V = Im[WS(rs, 2)]; + T1W = T1U - T1V; + T3C = T1U + T1V; + T1X = Rp[WS(rs, 2)]; + T1Y = Rm[WS(rs, 2)]; + T1Z = T1X + T1Y; + T3B = T1X - T1Y; + } + T20 = FNMS(T1d, T1Z, T1b * T1W); + T5p = FNMS(T1H, T3B, T1G * T3C); + T3D = FMA(T1G, T3B, T1H * T3C); + T4K = FMA(T1b, T1Z, T1d * T1W); + } + { + E T2t, T3Q, T2x, T3P; + { + E T2r, T2s, T2v, T2w; + T2r = Ip[WS(rs, 6)]; + T2s = Im[WS(rs, 6)]; + T2t = T2r - T2s; + T3Q = T2r + T2s; + T2v = Rp[WS(rs, 6)]; + T2w = Rm[WS(rs, 6)]; + T2x = T2v + T2w; + T3P = T2v - T2w; + } + T2y = FNMS(T2u, T2x, T2q * T2t); + T5t = FNMS(T1i, T3P, T1f * T3Q); + T3R = FMA(T1f, T3P, T1i * T3Q); + T4O = FMA(T2q, T2x, T2u * T2t); + } + { + E T2a, T3H, T2e, T3F; + { + E T28, T29, T2c, T2d; + T28 = Ip[WS(rs, 10)]; + T29 = Im[WS(rs, 10)]; + T2a = T28 - T29; + T3H = T28 + T29; + T2c = Rp[WS(rs, 10)]; + T2d = Rm[WS(rs, 10)]; + T2e = T2c + T2d; + T3F = T2c - T2d; + } + T2f = FNMS(T2b, T2e, T27 * T2a); + T5q = FNMS(T3G, T3F, T3E * T3H); + T3I = FMA(T3E, T3F, T3G * T3H); + T4L = FMA(T27, T2e, T2b * T2a); + } + { + E T2k, T3N, T2o, T3L; + { + E T2i, T2j, T2m, T2n; + T2i = Ip[WS(rs, 14)]; + T2j = Im[WS(rs, 14)]; + T2k = T2i - T2j; + T3N = T2i + T2j; + T2m = Rp[WS(rs, 14)]; + T2n = Rm[WS(rs, 14)]; + T2o = T2m + T2n; + T3L = T2m - T2n; + } + T2p = FNMS(T2l, T2o, T2h * T2k); + T5s = FNMS(T3M, T3L, T3K * T3N); + T3O = FMA(T3K, T3L, T3M * T3N); + T4N = FMA(T2h, T2o, T2l * T2k); + } + { + E T3J, T3S, T5r, T5u; + T2g = T20 + T2f; + T4M = T4K + T4L; + T4P = T4N + T4O; + T2z = T2p + T2y; + T3J = T3D + T3I; + T3S = T3O + T3R; + T3T = T3J + T3S; + T6m = T3S - T3J; + { + E T7M, T7N, T7h, T7i; + T7M = T5s - T5t; + T7N = T3R - T3O; + T7O = T7M + T7N; + T7V = T7M - T7N; + T7h = T4N - T4O; + T7i = T2p - T2y; + T7j = T7h + T7i; + T87 = T7h - T7i; + } + T5r = T5p + T5q; + T5u = T5s + T5t; + T5v = T5r + T5u; + T6j = T5u - T5r; + { + E T7J, T7K, T7e, T7f; + T7J = T3I - T3D; + T7K = T5p - T5q; + T7L = T7J - T7K; + T7U = T7K + T7J; + T7e = T20 - T2f; + T7f = T4K - T4L; + T7g = T7e - T7f; + T86 = T7f + T7e; + } + } + } + { + E Th, T5a, T3X, T4S, TV, T5e, T49, T4W, Tu, T5b, T42, T4T, TI, T5d, T46; + E T4V; + { + E Ta, T3W, Tg, T3V; + { + E T8, T9, Te, Tf; + T8 = Ip[WS(rs, 1)]; + T9 = Im[WS(rs, 1)]; + Ta = T8 - T9; + T3W = T8 + T9; + Te = Rp[WS(rs, 1)]; + Tf = Rm[WS(rs, 1)]; + Tg = Te + Tf; + T3V = Te - Tf; + } + Th = FNMS(Td, Tg, T7 * Ta); + T5a = FNMS(T5, T3V, T2 * T3W); + T3X = FMA(T2, T3V, T5 * T3W); + T4S = FMA(T7, Tg, Td * Ta); + } + { + E TO, T48, TU, T47; + { + E TM, TN, TS, TT; + TM = Ip[WS(rs, 13)]; + TN = Im[WS(rs, 13)]; + TO = TM - TN; + T48 = TM + TN; + TS = Rp[WS(rs, 13)]; + TT = Rm[WS(rs, 13)]; + TU = TS + TT; + T47 = TS - TT; + } + TV = FNMS(TR, TU, TL * TO); + T5e = FNMS(Tl, T47, Tj * T48); + T49 = FMA(Tj, T47, Tl * T48); + T4W = FMA(TL, TU, TR * TO); + } + { + E Tp, T41, Tt, T3Z; + { + E Tn, To, Tr, Ts; + Tn = Ip[WS(rs, 9)]; + To = Im[WS(rs, 9)]; + Tp = Tn - To; + T41 = Tn + To; + Tr = Rp[WS(rs, 9)]; + Ts = Rm[WS(rs, 9)]; + Tt = Tr + Ts; + T3Z = Tr - Ts; + } + Tu = FNMS(Tq, Tt, Tm * Tp); + T5b = FNMS(T40, T3Z, T3Y * T41); + T42 = FMA(T3Y, T3Z, T40 * T41); + T4T = FMA(Tm, Tt, Tq * Tp); + } + { + E TB, T45, TH, T44; + { + E Tz, TA, TF, TG; + Tz = Ip[WS(rs, 5)]; + TA = Im[WS(rs, 5)]; + TB = Tz - TA; + T45 = Tz + TA; + TF = Rp[WS(rs, 5)]; + TG = Rm[WS(rs, 5)]; + TH = TF + TG; + T44 = TF - TG; + } + TI = FNMS(TE, TH, Ty * TB); + T5d = FNMS(T2V, T44, T2U * T45); + T46 = FMA(T2U, T44, T2V * T45); + T4V = FMA(Ty, TH, TE * TB); + } + Tv = Th + Tu; + TW = TI + TV; + T61 = Tv - TW; + T4U = T4S + T4T; + T4X = T4V + T4W; + T62 = T4U - T4X; + { + E T43, T4a, T7t, T7u; + T43 = T3X + T42; + T4a = T46 + T49; + T4b = T43 + T4a; + T6c = T4a - T43; + T7t = T5e - T5d; + T7u = T46 - T49; + T7v = T7t + T7u; + T7C = T7t - T7u; + } + { + E T5c, T5f, T72, T73; + T5c = T5a + T5b; + T5f = T5d + T5e; + T5g = T5c + T5f; + T6f = T5f - T5c; + T72 = T4S - T4T; + T73 = TI - TV; + T74 = T72 + T73; + T8G = T72 - T73; + } + { + E T7q, T7r, T6Z, T70; + T7q = T42 - T3X; + T7r = T5a - T5b; + T7s = T7q - T7r; + T7B = T7r + T7q; + T6Z = Th - Tu; + T70 = T4V - T4W; + T71 = T6Z - T70; + T8F = T6Z + T70; + } + } + { + E T1a, T5h, T4k, T4Z, T1Q, T5l, T4y, T53, T1r, T5i, T4p, T50, T1F, T5k, T4t; + E T52; + { + E T13, T4j, T19, T4f; + { + E T11, T12, T17, T18; + T11 = Ip[WS(rs, 15)]; + T12 = Im[WS(rs, 15)]; + T13 = T11 - T12; + T4j = T11 + T12; + T17 = Rp[WS(rs, 15)]; + T18 = Rm[WS(rs, 15)]; + T19 = T17 + T18; + T4f = T17 - T18; + } + T1a = FNMS(T16, T19, T10 * T13); + T5h = FNMS(T4i, T4f, T4e * T4j); + T4k = FMA(T4e, T4f, T4i * T4j); + T4Z = FMA(T10, T19, T16 * T13); + } + { + E T1L, T4x, T1P, T4v; + { + E T1J, T1K, T1N, T1O; + T1J = Ip[WS(rs, 11)]; + T1K = Im[WS(rs, 11)]; + T1L = T1J - T1K; + T4x = T1J + T1K; + T1N = Rp[WS(rs, 11)]; + T1O = Rm[WS(rs, 11)]; + T1P = T1N + T1O; + T4v = T1N - T1O; + } + T1Q = FNMS(T1M, T1P, T1I * T1L); + T5l = FNMS(T4w, T4v, T4u * T4x); + T4y = FMA(T4u, T4v, T4w * T4x); + T53 = FMA(T1I, T1P, T1M * T1L); + } + { + E T1m, T4o, T1q, T4m; + { + E T1k, T1l, T1o, T1p; + T1k = Ip[WS(rs, 7)]; + T1l = Im[WS(rs, 7)]; + T1m = T1k - T1l; + T4o = T1k + T1l; + T1o = Rp[WS(rs, 7)]; + T1p = Rm[WS(rs, 7)]; + T1q = T1o + T1p; + T4m = T1o - T1p; + } + T1r = FNMS(T1n, T1q, T1j * T1m); + T5i = FNMS(T4n, T4m, T4l * T4o); + T4p = FMA(T4l, T4m, T4n * T4o); + T50 = FMA(T1j, T1q, T1n * T1m); + } + { + E T1y, T4s, T1E, T4r; + { + E T1w, T1x, T1C, T1D; + T1w = Ip[WS(rs, 3)]; + T1x = Im[WS(rs, 3)]; + T1y = T1w - T1x; + T4s = T1w + T1x; + T1C = Rp[WS(rs, 3)]; + T1D = Rm[WS(rs, 3)]; + T1E = T1C + T1D; + T4r = T1C - T1D; + } + T1F = FNMS(T1B, T1E, T1v * T1y); + T5k = FNMS(T26, T4r, T23 * T4s); + T4t = FMA(T23, T4r, T26 * T4s); + T52 = FMA(T1v, T1E, T1B * T1y); + } + T1s = T1a + T1r; + T1R = T1F + T1Q; + T65 = T1s - T1R; + T51 = T4Z + T50; + T54 = T52 + T53; + T64 = T51 - T54; + { + E T4q, T4z, T7E, T7F; + T4q = T4k + T4p; + T4z = T4t + T4y; + T4A = T4q + T4z; + T6g = T4z - T4q; + T7E = T5h - T5i; + T7F = T4y - T4t; + T7G = T7E + T7F; + T8U = T7E - T7F; + } + { + E T5j, T5m, T79, T7a; + T5j = T5h + T5i; + T5m = T5k + T5l; + T5n = T5j + T5m; + T6d = T5j - T5m; + T79 = T4Z - T50; + T7a = T1F - T1Q; + T7b = T79 + T7a; + T8J = T79 - T7a; + } + { + E T7x, T7y, T76, T77; + T7x = T4p - T4k; + T7y = T5k - T5l; + T7z = T7x - T7y; + T8R = T7x + T7y; + T76 = T1a - T1r; + T77 = T52 - T53; + T78 = T76 - T77; + T8I = T76 + T77; + } + } + { + E T1T, T5S, T5M, T5W, T5P, T5X, T3a, T5I, T4C, T58, T56, T5H, T5E, T5G, T4R; + E T5R; + { + E TX, T1S, T5K, T5L; + TX = Tv + TW; + T1S = T1s + T1R; + T1T = TX + T1S; + T5S = TX - T1S; + T5K = T5n - T5g; + T5L = T4b - T4A; + T5M = T5K + T5L; + T5W = T5K - T5L; + } + { + E T5N, T5O, T2A, T39; + T5N = T3T + T3A; + T5O = T5C - T5v; + T5P = T5N - T5O; + T5X = T5N + T5O; + T2A = T2g + T2z; + T39 = T2T + T38; + T3a = T2A + T39; + T5I = T39 - T2A; + } + { + E T3U, T4B, T4Y, T55; + T3U = T3A - T3T; + T4B = T4b + T4A; + T4C = T3U - T4B; + T58 = T4B + T3U; + T4Y = T4U + T4X; + T55 = T51 + T54; + T56 = T4Y + T55; + T5H = T55 - T4Y; + } + { + E T5o, T5D, T4J, T4Q; + T5o = T5g + T5n; + T5D = T5v + T5C; + T5E = T5o - T5D; + T5G = T5o + T5D; + T4J = T4F + T4I; + T4Q = T4M + T4P; + T4R = T4J + T4Q; + T5R = T4J - T4Q; + } + { + E T3b, T5F, T57, T59; + T3b = T1T + T3a; + Ip[0] = KP500000000 * (T3b + T4C); + Im[WS(rs, 15)] = KP500000000 * (T4C - T3b); + T5F = T4R + T56; + Rm[WS(rs, 15)] = KP500000000 * (T5F - T5G); + Rp[0] = KP500000000 * (T5F + T5G); + T57 = T4R - T56; + Rm[WS(rs, 7)] = KP500000000 * (T57 - T58); + Rp[WS(rs, 8)] = KP500000000 * (T57 + T58); + T59 = T3a - T1T; + Ip[WS(rs, 8)] = KP500000000 * (T59 + T5E); + Im[WS(rs, 7)] = KP500000000 * (T5E - T59); + } + { + E T5J, T5Q, T5Z, T60; + T5J = KP500000000 * (T5H + T5I); + T5Q = KP353553390 * (T5M + T5P); + Ip[WS(rs, 4)] = T5J + T5Q; + Im[WS(rs, 11)] = T5Q - T5J; + T5Z = KP500000000 * (T5R + T5S); + T60 = KP353553390 * (T5W + T5X); + Rm[WS(rs, 11)] = T5Z - T60; + Rp[WS(rs, 4)] = T5Z + T60; + } + { + E T5T, T5U, T5V, T5Y; + T5T = KP500000000 * (T5R - T5S); + T5U = KP353553390 * (T5P - T5M); + Rm[WS(rs, 3)] = T5T - T5U; + Rp[WS(rs, 12)] = T5T + T5U; + T5V = KP500000000 * (T5I - T5H); + T5Y = KP353553390 * (T5W - T5X); + Ip[WS(rs, 12)] = T5V + T5Y; + Im[WS(rs, 3)] = T5Y - T5V; + } + } + { + E T67, T6Q, T6K, T6U, T6N, T6V, T6a, T6G, T6i, T6A, T6t, T6P, T6w, T6F, T6p; + E T6B; + { + E T63, T66, T6I, T6J; + T63 = T61 - T62; + T66 = T64 + T65; + T67 = KP353553390 * (T63 + T66); + T6Q = KP353553390 * (T63 - T66); + T6I = T6d - T6c; + T6J = T6g - T6f; + T6K = FMA(KP461939766, T6I, KP191341716 * T6J); + T6U = FNMS(KP461939766, T6J, KP191341716 * T6I); + } + { + E T6L, T6M, T68, T69; + T6L = T6k - T6j; + T6M = T6n - T6m; + T6N = FNMS(KP461939766, T6M, KP191341716 * T6L); + T6V = FMA(KP461939766, T6L, KP191341716 * T6M); + T68 = T4P - T4M; + T69 = T38 - T2T; + T6a = KP500000000 * (T68 + T69); + T6G = KP500000000 * (T69 - T68); + } + { + E T6e, T6h, T6r, T6s; + T6e = T6c + T6d; + T6h = T6f + T6g; + T6i = FMA(KP191341716, T6e, KP461939766 * T6h); + T6A = FNMS(KP191341716, T6h, KP461939766 * T6e); + T6r = T4F - T4I; + T6s = T2g - T2z; + T6t = KP500000000 * (T6r + T6s); + T6P = KP500000000 * (T6r - T6s); + } + { + E T6u, T6v, T6l, T6o; + T6u = T62 + T61; + T6v = T64 - T65; + T6w = KP353553390 * (T6u + T6v); + T6F = KP353553390 * (T6v - T6u); + T6l = T6j + T6k; + T6o = T6m + T6n; + T6p = FNMS(KP191341716, T6o, KP461939766 * T6l); + T6B = FMA(KP191341716, T6l, KP461939766 * T6o); + } + { + E T6b, T6q, T6D, T6E; + T6b = T67 + T6a; + T6q = T6i + T6p; + Ip[WS(rs, 2)] = T6b + T6q; + Im[WS(rs, 13)] = T6q - T6b; + T6D = T6t + T6w; + T6E = T6A + T6B; + Rm[WS(rs, 13)] = T6D - T6E; + Rp[WS(rs, 2)] = T6D + T6E; + } + { + E T6x, T6y, T6z, T6C; + T6x = T6t - T6w; + T6y = T6p - T6i; + Rm[WS(rs, 5)] = T6x - T6y; + Rp[WS(rs, 10)] = T6x + T6y; + T6z = T6a - T67; + T6C = T6A - T6B; + Ip[WS(rs, 10)] = T6z + T6C; + Im[WS(rs, 5)] = T6C - T6z; + } + { + E T6H, T6O, T6X, T6Y; + T6H = T6F + T6G; + T6O = T6K + T6N; + Ip[WS(rs, 6)] = T6H + T6O; + Im[WS(rs, 9)] = T6O - T6H; + T6X = T6P + T6Q; + T6Y = T6U + T6V; + Rm[WS(rs, 9)] = T6X - T6Y; + Rp[WS(rs, 6)] = T6X + T6Y; + } + { + E T6R, T6S, T6T, T6W; + T6R = T6P - T6Q; + T6S = T6N - T6K; + Rm[WS(rs, 1)] = T6R - T6S; + Rp[WS(rs, 14)] = T6R + T6S; + T6T = T6G - T6F; + T6W = T6U - T6V; + Ip[WS(rs, 14)] = T6T + T6W; + Im[WS(rs, 1)] = T6W - T6T; + } + } + { + E T7d, T8w, T7o, T8m, T8c, T8l, T89, T8v, T81, T8B, T8h, T8t, T7I, T8A, T8g; + E T8q; + { + E T75, T7c, T85, T88; + T75 = FNMS(KP191341716, T74, KP461939766 * T71); + T7c = FMA(KP461939766, T78, KP191341716 * T7b); + T7d = T75 + T7c; + T8w = T75 - T7c; + { + E T7k, T7n, T8a, T8b; + T7k = KP353553390 * (T7g + T7j); + T7n = KP500000000 * (T7l - T7m); + T7o = T7k + T7n; + T8m = T7n - T7k; + T8a = FMA(KP191341716, T71, KP461939766 * T74); + T8b = FNMS(KP191341716, T78, KP461939766 * T7b); + T8c = T8a + T8b; + T8l = T8b - T8a; + } + T85 = KP500000000 * (T83 + T84); + T88 = KP353553390 * (T86 + T87); + T89 = T85 + T88; + T8v = T85 - T88; + { + E T7T, T8r, T80, T8s, T7P, T7W; + T7P = KP707106781 * (T7L + T7O); + T7T = T7P + T7S; + T8r = T7S - T7P; + T7W = KP707106781 * (T7U + T7V); + T80 = T7W + T7Z; + T8s = T7Z - T7W; + T81 = FNMS(KP097545161, T80, KP490392640 * T7T); + T8B = FMA(KP415734806, T8r, KP277785116 * T8s); + T8h = FMA(KP097545161, T7T, KP490392640 * T80); + T8t = FNMS(KP415734806, T8s, KP277785116 * T8r); + } + { + E T7A, T8o, T7H, T8p, T7w, T7D; + T7w = KP707106781 * (T7s + T7v); + T7A = T7w + T7z; + T8o = T7z - T7w; + T7D = KP707106781 * (T7B + T7C); + T7H = T7D + T7G; + T8p = T7G - T7D; + T7I = FMA(KP490392640, T7A, KP097545161 * T7H); + T8A = FNMS(KP415734806, T8o, KP277785116 * T8p); + T8g = FNMS(KP097545161, T7A, KP490392640 * T7H); + T8q = FMA(KP277785116, T8o, KP415734806 * T8p); + } + } + { + E T7p, T82, T8j, T8k; + T7p = T7d + T7o; + T82 = T7I + T81; + Ip[WS(rs, 1)] = T7p + T82; + Im[WS(rs, 14)] = T82 - T7p; + T8j = T89 + T8c; + T8k = T8g + T8h; + Rm[WS(rs, 14)] = T8j - T8k; + Rp[WS(rs, 1)] = T8j + T8k; + } + { + E T8d, T8e, T8f, T8i; + T8d = T89 - T8c; + T8e = T81 - T7I; + Rm[WS(rs, 6)] = T8d - T8e; + Rp[WS(rs, 9)] = T8d + T8e; + T8f = T7o - T7d; + T8i = T8g - T8h; + Ip[WS(rs, 9)] = T8f + T8i; + Im[WS(rs, 6)] = T8i - T8f; + } + { + E T8n, T8u, T8D, T8E; + T8n = T8l + T8m; + T8u = T8q + T8t; + Ip[WS(rs, 5)] = T8n + T8u; + Im[WS(rs, 10)] = T8u - T8n; + T8D = T8v + T8w; + T8E = T8A + T8B; + Rm[WS(rs, 10)] = T8D - T8E; + Rp[WS(rs, 5)] = T8D + T8E; + } + { + E T8x, T8y, T8z, T8C; + T8x = T8v - T8w; + T8y = T8t - T8q; + Rm[WS(rs, 2)] = T8x - T8y; + Rp[WS(rs, 13)] = T8x + T8y; + T8z = T8m - T8l; + T8C = T8A - T8B; + Ip[WS(rs, 13)] = T8z + T8C; + Im[WS(rs, 2)] = T8C - T8z; + } + } + { + E T8L, T9u, T8O, T9k, T9a, T9j, T97, T9t, T93, T9z, T9f, T9r, T8W, T9y, T9e; + E T9o; + { + E T8H, T8K, T95, T96; + T8H = FNMS(KP461939766, T8G, KP191341716 * T8F); + T8K = FMA(KP191341716, T8I, KP461939766 * T8J); + T8L = T8H + T8K; + T9u = T8H - T8K; + { + E T8M, T8N, T98, T99; + T8M = KP353553390 * (T87 - T86); + T8N = KP500000000 * (T7m + T7l); + T8O = T8M + T8N; + T9k = T8N - T8M; + T98 = FMA(KP461939766, T8F, KP191341716 * T8G); + T99 = FNMS(KP461939766, T8I, KP191341716 * T8J); + T9a = T98 + T99; + T9j = T99 - T98; + } + T95 = KP500000000 * (T83 - T84); + T96 = KP353553390 * (T7g - T7j); + T97 = T95 + T96; + T9t = T95 - T96; + { + E T8Z, T9p, T92, T9q, T8X, T90; + T8X = KP707106781 * (T7V - T7U); + T8Z = T8X + T8Y; + T9p = T8Y - T8X; + T90 = KP707106781 * (T7L - T7O); + T92 = T90 + T91; + T9q = T91 - T90; + T93 = FNMS(KP277785116, T92, KP415734806 * T8Z); + T9z = FMA(KP490392640, T9p, KP097545161 * T9q); + T9f = FMA(KP277785116, T8Z, KP415734806 * T92); + T9r = FNMS(KP490392640, T9q, KP097545161 * T9p); + } + { + E T8S, T9m, T8V, T9n, T8Q, T8T; + T8Q = KP707106781 * (T7C - T7B); + T8S = T8Q + T8R; + T9m = T8R - T8Q; + T8T = KP707106781 * (T7s - T7v); + T8V = T8T + T8U; + T9n = T8U - T8T; + T8W = FMA(KP415734806, T8S, KP277785116 * T8V); + T9y = FNMS(KP490392640, T9m, KP097545161 * T9n); + T9e = FNMS(KP277785116, T8S, KP415734806 * T8V); + T9o = FMA(KP097545161, T9m, KP490392640 * T9n); + } + } + { + E T8P, T94, T9h, T9i; + T8P = T8L + T8O; + T94 = T8W + T93; + Ip[WS(rs, 3)] = T8P + T94; + Im[WS(rs, 12)] = T94 - T8P; + T9h = T97 + T9a; + T9i = T9e + T9f; + Rm[WS(rs, 12)] = T9h - T9i; + Rp[WS(rs, 3)] = T9h + T9i; + } + { + E T9b, T9c, T9d, T9g; + T9b = T97 - T9a; + T9c = T93 - T8W; + Rm[WS(rs, 4)] = T9b - T9c; + Rp[WS(rs, 11)] = T9b + T9c; + T9d = T8O - T8L; + T9g = T9e - T9f; + Ip[WS(rs, 11)] = T9d + T9g; + Im[WS(rs, 4)] = T9g - T9d; + } + { + E T9l, T9s, T9B, T9C; + T9l = T9j + T9k; + T9s = T9o + T9r; + Ip[WS(rs, 7)] = T9l + T9s; + Im[WS(rs, 8)] = T9s - T9l; + T9B = T9t + T9u; + T9C = T9y + T9z; + Rm[WS(rs, 8)] = T9B - T9C; + Rp[WS(rs, 7)] = T9B + T9C; + } + { + E T9v, T9w, T9x, T9A; + T9v = T9t - T9u; + T9w = T9r - T9o; + Rm[0] = T9v - T9w; + Rp[WS(rs, 15)] = T9v + T9w; + T9x = T9k - T9j; + T9A = T9y - T9z; + Ip[WS(rs, 15)] = T9x + T9A; + Im[0] = T9A - T9x; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cfdft2_32", twinstr, &GENUS, {440, 188, 112, 0} }; + +void X(codelet_hc2cfdft2_32) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_32, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_4.c new file mode 100644 index 000000000..c1781a585 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_4.c @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:16 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -dit -name hc2cfdft2_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 32 FP additions, 24 FP multiplications, + * (or, 24 additions, 16 multiplications, 8 fused multiply/add), + * 37 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 4, MAKE_VOLATILE_STRIDE(16, rs)) { + E T1, T5, T2, T4, T6, Tc, T3, Tb; + T1 = W[0]; + T5 = W[3]; + T2 = W[2]; + T3 = T1 * T2; + Tb = T1 * T5; + T4 = W[1]; + T6 = FMA(T4, T5, T3); + Tc = FNMS(T4, T2, Tb); + { + E Tj, Tp, To, TE, Tw, T9, Tt, Ta, TC, Tf, Tr, Ts, Tx; + { + E Th, Ti, Tl, Tm, Tn; + Th = Ip[0]; + Ti = Im[0]; + Tj = Th - Ti; + Tp = Th + Ti; + Tl = Rm[0]; + Tm = Rp[0]; + Tn = Tl - Tm; + To = T1 * Tn; + TE = T4 * Tn; + Tw = Tm + Tl; + } + { + E T7, T8, Td, Te; + T7 = Ip[WS(rs, 1)]; + T8 = Im[WS(rs, 1)]; + T9 = T7 - T8; + Tt = T7 + T8; + Ta = T6 * T9; + TC = T2 * Tt; + Td = Rp[WS(rs, 1)]; + Te = Rm[WS(rs, 1)]; + Tf = Td + Te; + Tr = Td - Te; + Ts = T2 * Tr; + Tx = T6 * Tf; + } + { + E Tk, TB, Tz, TH, Tv, TA, TG, TI, Tg, Ty; + Tg = FNMS(Tc, Tf, Ta); + Tk = Tg + Tj; + TB = Tj - Tg; + Ty = FMA(Tc, T9, Tx); + Tz = Tw - Ty; + TH = Tw + Ty; + { + E Tq, Tu, TD, TF; + Tq = FNMS(T4, Tp, To); + Tu = FMA(T5, Tt, Ts); + Tv = Tq - Tu; + TA = Tu + Tq; + TD = FNMS(T5, Tr, TC); + TF = FMA(T1, Tp, TE); + TG = TD - TF; + TI = TD + TF; + } + Ip[0] = KP500000000 * (Tk + Tv); + Rp[0] = KP500000000 * (TH + TI); + Im[WS(rs, 1)] = KP500000000 * (Tv - Tk); + Rm[WS(rs, 1)] = KP500000000 * (TH - TI); + Rm[0] = KP500000000 * (Tz - TA); + Im[0] = KP500000000 * (TG - TB); + Rp[WS(rs, 1)] = KP500000000 * (Tz + TA); + Ip[WS(rs, 1)] = KP500000000 * (TB + TG); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cfdft2_4", twinstr, &GENUS, {24, 16, 8, 0} }; + +void X(codelet_hc2cfdft2_4) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_4, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -dit -name hc2cfdft2_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 32 FP additions, 24 FP multiplications, + * (or, 24 additions, 16 multiplications, 8 fused multiply/add), + * 24 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 4, MAKE_VOLATILE_STRIDE(16, rs)) { + E T1, T3, T2, T4, T5, T9; + T1 = W[0]; + T3 = W[1]; + T2 = W[2]; + T4 = W[3]; + T5 = FMA(T1, T2, T3 * T4); + T9 = FNMS(T3, T2, T1 * T4); + { + E Tg, Tr, Tm, Tx, Td, Tw, Tp, Ts; + { + E Te, Tf, Tl, Ti, Tj, Tk; + Te = Ip[0]; + Tf = Im[0]; + Tl = Te + Tf; + Ti = Rm[0]; + Tj = Rp[0]; + Tk = Ti - Tj; + Tg = Te - Tf; + Tr = Tj + Ti; + Tm = FNMS(T3, Tl, T1 * Tk); + Tx = FMA(T3, Tk, T1 * Tl); + } + { + E T8, To, Tc, Tn; + { + E T6, T7, Ta, Tb; + T6 = Ip[WS(rs, 1)]; + T7 = Im[WS(rs, 1)]; + T8 = T6 - T7; + To = T6 + T7; + Ta = Rp[WS(rs, 1)]; + Tb = Rm[WS(rs, 1)]; + Tc = Ta + Tb; + Tn = Ta - Tb; + } + Td = FNMS(T9, Tc, T5 * T8); + Tw = FNMS(T4, Tn, T2 * To); + Tp = FMA(T2, Tn, T4 * To); + Ts = FMA(T5, Tc, T9 * T8); + } + { + E Th, Tq, Tz, TA; + Th = Td + Tg; + Tq = Tm - Tp; + Ip[0] = KP500000000 * (Th + Tq); + Im[WS(rs, 1)] = KP500000000 * (Tq - Th); + Tz = Tr + Ts; + TA = Tw + Tx; + Rm[WS(rs, 1)] = KP500000000 * (Tz - TA); + Rp[0] = KP500000000 * (Tz + TA); + } + { + E Tt, Tu, Tv, Ty; + Tt = Tr - Ts; + Tu = Tp + Tm; + Rm[0] = KP500000000 * (Tt - Tu); + Rp[WS(rs, 1)] = KP500000000 * (Tt + Tu); + Tv = Tg - Td; + Ty = Tw - Tx; + Ip[WS(rs, 1)] = KP500000000 * (Tv + Ty); + Im[0] = KP500000000 * (Ty - Tv); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cfdft2_4", twinstr, &GENUS, {24, 16, 8, 0} }; + +void X(codelet_hc2cfdft2_4) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_4, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_8.c new file mode 100644 index 000000000..5c6f03c73 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft2_8.c @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:16 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -dit -name hc2cfdft2_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 90 FP additions, 66 FP multiplications, + * (or, 60 additions, 36 multiplications, 30 fused multiply/add), + * 45 stack variables, 2 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(32, rs)) { + E T1, T2, Th, Tj, T4, T5, T6, Tk, TB, Tq, Tw, Tc, TM, TQ; + { + E T3, Ti, Tp, Tb, TL, TP; + T1 = W[0]; + T2 = W[2]; + T3 = T1 * T2; + Th = W[4]; + Ti = T1 * Th; + Tj = W[5]; + Tp = T1 * Tj; + T4 = W[1]; + T5 = W[3]; + Tb = T1 * T5; + T6 = FMA(T4, T5, T3); + Tk = FMA(T4, Tj, Ti); + TB = FMA(T4, T2, Tb); + Tq = FNMS(T4, Th, Tp); + Tw = FNMS(T4, T5, T3); + TL = T6 * Th; + TP = T6 * Tj; + Tc = FNMS(T4, T2, Tb); + TM = FMA(Tc, Tj, TL); + TQ = FNMS(Tc, Th, TP); + } + { + E TI, T1a, TY, T1u, TF, T1s, TS, T1c, Tg, T1n, T13, T1f, Tu, T1p, T17; + E T1h; + { + E TG, TH, TX, TT, TU, TV, TW, T1t; + TG = Ip[0]; + TH = Im[0]; + TX = TG + TH; + TT = Rm[0]; + TU = Rp[0]; + TV = TT - TU; + TI = TG - TH; + T1a = TU + TT; + TW = T1 * TV; + TY = FNMS(T4, TX, TW); + T1t = T4 * TV; + T1u = FMA(T1, TX, T1t); + } + { + E Tz, TR, TE, TN; + { + E Tx, Ty, TC, TD; + Tx = Ip[WS(rs, 2)]; + Ty = Im[WS(rs, 2)]; + Tz = Tx - Ty; + TR = Tx + Ty; + TC = Rp[WS(rs, 2)]; + TD = Rm[WS(rs, 2)]; + TE = TC + TD; + TN = TD - TC; + } + { + E TA, T1r, TO, T1b; + TA = Tw * Tz; + TF = FNMS(TB, TE, TA); + T1r = TQ * TN; + T1s = FMA(TM, TR, T1r); + TO = TM * TN; + TS = FNMS(TQ, TR, TO); + T1b = Tw * TE; + T1c = FMA(TB, Tz, T1b); + } + } + { + E T9, T12, Tf, T10; + { + E T7, T8, Td, Te; + T7 = Ip[WS(rs, 1)]; + T8 = Im[WS(rs, 1)]; + T9 = T7 - T8; + T12 = T7 + T8; + Td = Rp[WS(rs, 1)]; + Te = Rm[WS(rs, 1)]; + Tf = Td + Te; + T10 = Td - Te; + } + { + E Ta, T1m, T11, T1e; + Ta = T6 * T9; + Tg = FNMS(Tc, Tf, Ta); + T1m = T2 * T12; + T1n = FNMS(T5, T10, T1m); + T11 = T2 * T10; + T13 = FMA(T5, T12, T11); + T1e = T6 * Tf; + T1f = FMA(Tc, T9, T1e); + } + } + { + E Tn, T16, Tt, T14; + { + E Tl, Tm, Tr, Ts; + Tl = Ip[WS(rs, 3)]; + Tm = Im[WS(rs, 3)]; + Tn = Tl - Tm; + T16 = Tl + Tm; + Tr = Rp[WS(rs, 3)]; + Ts = Rm[WS(rs, 3)]; + Tt = Tr + Ts; + T14 = Tr - Ts; + } + { + E To, T1o, T15, T1g; + To = Tk * Tn; + Tu = FNMS(Tq, Tt, To); + T1o = Th * T16; + T1p = FNMS(Tj, T14, T1o); + T15 = Th * T14; + T17 = FMA(Tj, T16, T15); + T1g = Tk * Tt; + T1h = FMA(Tq, Tn, T1g); + } + } + { + E TK, T1l, T1w, T1y, T19, T1k, T1j, T1x; + { + E Tv, TJ, T1q, T1v; + Tv = Tg + Tu; + TJ = TF + TI; + TK = Tv + TJ; + T1l = TJ - Tv; + T1q = T1n + T1p; + T1v = T1s + T1u; + T1w = T1q - T1v; + T1y = T1q + T1v; + } + { + E TZ, T18, T1d, T1i; + TZ = TS + TY; + T18 = T13 + T17; + T19 = TZ - T18; + T1k = T18 + TZ; + T1d = T1a + T1c; + T1i = T1f + T1h; + T1j = T1d - T1i; + T1x = T1d + T1i; + } + Ip[0] = KP500000000 * (TK + T19); + Rp[0] = KP500000000 * (T1x + T1y); + Im[WS(rs, 3)] = KP500000000 * (T19 - TK); + Rm[WS(rs, 3)] = KP500000000 * (T1x - T1y); + Rm[WS(rs, 1)] = KP500000000 * (T1j - T1k); + Im[WS(rs, 1)] = KP500000000 * (T1w - T1l); + Rp[WS(rs, 2)] = KP500000000 * (T1j + T1k); + Ip[WS(rs, 2)] = KP500000000 * (T1l + T1w); + } + { + E T1B, T1N, T1L, T1R, T1E, T1O, T1H, T1P; + { + E T1z, T1A, T1J, T1K; + T1z = TI - TF; + T1A = T1f - T1h; + T1B = T1z - T1A; + T1N = T1A + T1z; + T1J = T1a - T1c; + T1K = Tg - Tu; + T1L = T1J - T1K; + T1R = T1J + T1K; + } + { + E T1C, T1D, T1F, T1G; + T1C = T1p - T1n; + T1D = T13 - T17; + T1E = T1C + T1D; + T1O = T1C - T1D; + T1F = TY - TS; + T1G = T1u - T1s; + T1H = T1F - T1G; + T1P = T1F + T1G; + } + { + E T1I, T1S, T1M, T1Q; + T1I = T1E + T1H; + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP707106781, T1I, T1B)); + Im[WS(rs, 2)] = -(KP500000000 * (FNMS(KP707106781, T1I, T1B))); + T1S = T1O + T1P; + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP707106781, T1S, T1R)); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP707106781, T1S, T1R)); + T1M = T1H - T1E; + Rm[0] = KP500000000 * (FNMS(KP707106781, T1M, T1L)); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP707106781, T1M, T1L)); + T1Q = T1O - T1P; + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP707106781, T1Q, T1N)); + Im[0] = -(KP500000000 * (FNMS(KP707106781, T1Q, T1N))); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cfdft2_8", twinstr, &GENUS, {60, 36, 30, 0} }; + +void X(codelet_hc2cfdft2_8) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_8, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -dit -name hc2cfdft2_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 90 FP additions, 56 FP multiplications, + * (or, 72 additions, 38 multiplications, 18 fused multiply/add), + * 51 stack variables, 2 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft2_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(32, rs)) { + E T1, T4, T2, T5, Tu, Ty, T7, Td, Ti, Tj, Tk, TP, To, TN; + { + E T3, Tc, T6, Tb; + T1 = W[0]; + T4 = W[1]; + T2 = W[2]; + T5 = W[3]; + T3 = T1 * T2; + Tc = T4 * T2; + T6 = T4 * T5; + Tb = T1 * T5; + Tu = T3 - T6; + Ty = Tb + Tc; + T7 = T3 + T6; + Td = Tb - Tc; + Ti = W[4]; + Tj = W[5]; + Tk = FMA(T1, Ti, T4 * Tj); + TP = FNMS(Td, Ti, T7 * Tj); + To = FNMS(T4, Ti, T1 * Tj); + TN = FMA(T7, Ti, Td * Tj); + } + { + E TF, T11, TC, T12, T1d, T1e, T1q, TM, TR, T1p, Th, Ts, T15, T14, T1a; + E T1b, T1m, TV, TY, T1n; + { + E TD, TE, TL, TI, TJ, TK, Tx, TQ, TB, TO; + TD = Ip[0]; + TE = Im[0]; + TL = TD + TE; + TI = Rm[0]; + TJ = Rp[0]; + TK = TI - TJ; + { + E Tv, Tw, Tz, TA; + Tv = Ip[WS(rs, 2)]; + Tw = Im[WS(rs, 2)]; + Tx = Tv - Tw; + TQ = Tv + Tw; + Tz = Rp[WS(rs, 2)]; + TA = Rm[WS(rs, 2)]; + TB = Tz + TA; + TO = Tz - TA; + } + TF = TD - TE; + T11 = TJ + TI; + TC = FNMS(Ty, TB, Tu * Tx); + T12 = FMA(Tu, TB, Ty * Tx); + T1d = FNMS(TP, TO, TN * TQ); + T1e = FMA(T4, TK, T1 * TL); + T1q = T1e - T1d; + TM = FNMS(T4, TL, T1 * TK); + TR = FMA(TN, TO, TP * TQ); + T1p = TR + TM; + } + { + E Ta, TU, Tg, TT, Tn, TX, Tr, TW; + { + E T8, T9, Te, Tf; + T8 = Ip[WS(rs, 1)]; + T9 = Im[WS(rs, 1)]; + Ta = T8 - T9; + TU = T8 + T9; + Te = Rp[WS(rs, 1)]; + Tf = Rm[WS(rs, 1)]; + Tg = Te + Tf; + TT = Te - Tf; + } + { + E Tl, Tm, Tp, Tq; + Tl = Ip[WS(rs, 3)]; + Tm = Im[WS(rs, 3)]; + Tn = Tl - Tm; + TX = Tl + Tm; + Tp = Rp[WS(rs, 3)]; + Tq = Rm[WS(rs, 3)]; + Tr = Tp + Tq; + TW = Tp - Tq; + } + Th = FNMS(Td, Tg, T7 * Ta); + Ts = FNMS(To, Tr, Tk * Tn); + T15 = FMA(Tk, Tr, To * Tn); + T14 = FMA(T7, Tg, Td * Ta); + T1a = FNMS(T5, TT, T2 * TU); + T1b = FNMS(Tj, TW, Ti * TX); + T1m = T1b - T1a; + TV = FMA(T2, TT, T5 * TU); + TY = FMA(Ti, TW, Tj * TX); + T1n = TV - TY; + } + { + E T1l, T1x, T1A, T1C, T1s, T1w, T1v, T1B; + { + E T1j, T1k, T1y, T1z; + T1j = TF - TC; + T1k = T14 - T15; + T1l = KP500000000 * (T1j - T1k); + T1x = KP500000000 * (T1k + T1j); + T1y = T1m - T1n; + T1z = T1p + T1q; + T1A = KP353553390 * (T1y - T1z); + T1C = KP353553390 * (T1y + T1z); + } + { + E T1o, T1r, T1t, T1u; + T1o = T1m + T1n; + T1r = T1p - T1q; + T1s = KP353553390 * (T1o + T1r); + T1w = KP353553390 * (T1r - T1o); + T1t = T11 - T12; + T1u = Th - Ts; + T1v = KP500000000 * (T1t - T1u); + T1B = KP500000000 * (T1t + T1u); + } + Ip[WS(rs, 1)] = T1l + T1s; + Rp[WS(rs, 1)] = T1B + T1C; + Im[WS(rs, 2)] = T1s - T1l; + Rm[WS(rs, 2)] = T1B - T1C; + Rm[0] = T1v - T1w; + Im[0] = T1A - T1x; + Rp[WS(rs, 3)] = T1v + T1w; + Ip[WS(rs, 3)] = T1x + T1A; + } + { + E TH, T19, T1g, T1i, T10, T18, T17, T1h; + { + E Tt, TG, T1c, T1f; + Tt = Th + Ts; + TG = TC + TF; + TH = Tt + TG; + T19 = TG - Tt; + T1c = T1a + T1b; + T1f = T1d + T1e; + T1g = T1c - T1f; + T1i = T1c + T1f; + } + { + E TS, TZ, T13, T16; + TS = TM - TR; + TZ = TV + TY; + T10 = TS - TZ; + T18 = TZ + TS; + T13 = T11 + T12; + T16 = T14 + T15; + T17 = T13 - T16; + T1h = T13 + T16; + } + Ip[0] = KP500000000 * (TH + T10); + Rp[0] = KP500000000 * (T1h + T1i); + Im[WS(rs, 3)] = KP500000000 * (T10 - TH); + Rm[WS(rs, 3)] = KP500000000 * (T1h - T1i); + Rm[WS(rs, 1)] = KP500000000 * (T17 - T18); + Im[WS(rs, 1)] = KP500000000 * (T1g - T19); + Rp[WS(rs, 2)] = KP500000000 * (T17 + T18); + Ip[WS(rs, 2)] = KP500000000 * (T19 + T1g); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cfdft2_8", twinstr, &GENUS, {72, 38, 18, 0} }; + +void X(codelet_hc2cfdft2_8) (planner *p) { + X(khc2c_register) (p, hc2cfdft2_8, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_10.c new file mode 100644 index 000000000..07a242ecc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_10.c @@ -0,0 +1,546 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -dit -name hc2cfdft_10 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 122 FP additions, 92 FP multiplications, + * (or, 68 additions, 38 multiplications, 54 fused multiply/add), + * 81 stack variables, 5 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E T3, T1u, Td, T1w, T1S, T2f, T14, T1p, T1j, T1q, T1N, T2e, TQ, T2i, T1n; + E T1H, Tz, T2h, T1m, T1C; + { + E T1, T2, T1h, Tc, TW, T1c, T1d, T1b, T1f, T1g, T1Q, T7, TV, T1J, TS; + E TU, Ts, Tx, T19, T18, T1O, T15, T17, Tt, T1A, Ti, Tn, TE, TD, T1F; + E TA, TC, Tj, T1y, TJ, TO, T12, T11, T1L, TY, T10, TK, T1D; + { + E Ta, Tb, T1e, T5, T6, TT; + T1 = Ip[0]; + T2 = Im[0]; + T1h = T1 + T2; + Ta = Rp[WS(rs, 2)]; + Tb = Rm[WS(rs, 2)]; + Tc = Ta - Tb; + TW = Ta + Tb; + T1c = Rm[0]; + T1d = Rp[0]; + T1e = T1c - T1d; + T1b = W[0]; + T1f = T1b * T1e; + T1g = W[1]; + T1Q = T1g * T1e; + T5 = Ip[WS(rs, 2)]; + T6 = Im[WS(rs, 2)]; + TT = T5 - T6; + T7 = T5 + T6; + TV = W[7]; + T1J = TV * TT; + TS = W[6]; + TU = TS * TT; + { + E Tq, Tr, T16, Tv, Tw, Tp; + Tq = Rm[WS(rs, 3)]; + Tr = Rp[WS(rs, 3)]; + Ts = Tq - Tr; + Tv = Ip[WS(rs, 3)]; + Tw = Im[WS(rs, 3)]; + Tx = Tv + Tw; + T16 = Tv - Tw; + T19 = Tr + Tq; + T18 = W[11]; + T1O = T18 * T16; + T15 = W[10]; + T17 = T15 * T16; + Tp = W[12]; + Tt = Tp * Ts; + T1A = Tp * Tx; + } + { + E Tg, Th, TB, Tl, Tm, Tf; + Tg = Ip[WS(rs, 1)]; + Th = Im[WS(rs, 1)]; + Ti = Tg - Th; + Tl = Rp[WS(rs, 1)]; + Tm = Rm[WS(rs, 1)]; + Tn = Tl + Tm; + TB = Tm - Tl; + TE = Tg + Th; + TD = W[5]; + T1F = TD * TB; + TA = W[4]; + TC = TA * TB; + Tf = W[2]; + Tj = Tf * Ti; + T1y = Tf * Tn; + } + { + E TH, TI, TZ, TM, TN, TG; + TH = Ip[WS(rs, 4)]; + TI = Im[WS(rs, 4)]; + TJ = TH - TI; + TM = Rp[WS(rs, 4)]; + TN = Rm[WS(rs, 4)]; + TO = TM + TN; + TZ = TN - TM; + T12 = TH + TI; + T11 = W[17]; + T1L = T11 * TZ; + TY = W[16]; + T10 = TY * TZ; + TG = W[14]; + TK = TG * TJ; + T1D = TG * TO; + } + } + { + E T1P, T1R, T1K, T1M; + T3 = T1 - T2; + T1u = T1d + T1c; + { + E T4, T8, T9, T1v; + T4 = W[9]; + T8 = T4 * T7; + T9 = W[8]; + T1v = T9 * T7; + Td = FMA(T9, Tc, T8); + T1w = FNMS(T4, Tc, T1v); + } + T1P = FMA(T15, T19, T1O); + T1R = FMA(T1b, T1h, T1Q); + T1S = T1P - T1R; + T2f = T1P + T1R; + { + E TX, T13, T1a, T1i; + TX = FNMS(TV, TW, TU); + T13 = FNMS(T11, T12, T10); + T14 = TX + T13; + T1p = T13 - TX; + T1a = FNMS(T18, T19, T17); + T1i = FNMS(T1g, T1h, T1f); + T1j = T1a + T1i; + T1q = T1i - T1a; + } + T1K = FMA(TS, TW, T1J); + T1M = FMA(TY, T12, T1L); + T1N = T1K - T1M; + T2e = T1K + T1M; + { + E TF, T1G, TP, T1E, TL; + TF = FNMS(TD, TE, TC); + T1G = FMA(TA, TE, T1F); + TL = W[15]; + TP = FNMS(TL, TO, TK); + T1E = FMA(TL, TJ, T1D); + TQ = TF + TP; + T2i = T1G + T1E; + T1n = TF - TP; + T1H = T1E - T1G; + } + { + E To, T1z, Ty, T1B, Tk, Tu; + Tk = W[3]; + To = FNMS(Tk, Tn, Tj); + T1z = FMA(Tk, Ti, T1y); + Tu = W[13]; + Ty = FNMS(Tu, Tx, Tt); + T1B = FMA(Tu, Ts, T1A); + Tz = To + Ty; + T2h = T1z + T1B; + T1m = Ty - To; + T1C = T1z - T1B; + } + } + } + { + E T2k, T2m, Te, T1l, T2b, T2c, T2l, T2d; + { + E T2g, T2j, TR, T1k; + T2g = T2e - T2f; + T2j = T2h - T2i; + T2k = FNMS(KP618033988, T2j, T2g); + T2m = FMA(KP618033988, T2g, T2j); + Te = T3 - Td; + TR = Tz + TQ; + T1k = T14 + T1j; + T1l = TR + T1k; + T2b = FNMS(KP250000000, T1l, Te); + T2c = TR - T1k; + } + Ip[0] = KP500000000 * (Te + T1l); + T2l = FMA(KP559016994, T2c, T2b); + Ip[WS(rs, 4)] = KP500000000 * (FMA(KP951056516, T2m, T2l)); + Im[WS(rs, 3)] = -(KP500000000 * (FNMS(KP951056516, T2m, T2l))); + T2d = FNMS(KP559016994, T2c, T2b); + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP951056516, T2k, T2d)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP951056516, T2k, T2d))); + } + { + E T2w, T2y, T2n, T2q, T2r, T2s, T2x, T2t; + { + E T2u, T2v, T2o, T2p; + T2u = T14 - T1j; + T2v = Tz - TQ; + T2w = FNMS(KP618033988, T2v, T2u); + T2y = FMA(KP618033988, T2u, T2v); + T2n = T1u + T1w; + T2o = T2h + T2i; + T2p = T2e + T2f; + T2q = T2o + T2p; + T2r = FNMS(KP250000000, T2q, T2n); + T2s = T2o - T2p; + } + Rp[0] = KP500000000 * (T2n + T2q); + T2x = FMA(KP559016994, T2s, T2r); + Rp[WS(rs, 4)] = KP500000000 * (FNMS(KP951056516, T2y, T2x)); + Rm[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T2y, T2x)); + T2t = FNMS(KP559016994, T2s, T2r); + Rp[WS(rs, 2)] = KP500000000 * (FNMS(KP951056516, T2w, T2t)); + Rm[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T2w, T2t)); + } + { + E T28, T2a, T1t, T1s, T23, T24, T29, T25; + { + E T26, T27, T1o, T1r; + T26 = T1H - T1C; + T27 = T1S - T1N; + T28 = FMA(KP618033988, T27, T26); + T2a = FNMS(KP618033988, T26, T27); + T1t = Td + T3; + T1o = T1m + T1n; + T1r = T1p + T1q; + T1s = T1o + T1r; + T23 = FMA(KP250000000, T1s, T1t); + T24 = T1r - T1o; + } + Im[WS(rs, 4)] = KP500000000 * (T1s - T1t); + T29 = FNMS(KP559016994, T24, T23); + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T2a, T29)); + Im[WS(rs, 2)] = -(KP500000000 * (FNMS(KP951056516, T2a, T29))); + T25 = FMA(KP559016994, T24, T23); + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T28, T25)); + Im[0] = -(KP500000000 * (FNMS(KP951056516, T28, T25))); + } + { + E T20, T22, T1x, T1U, T1V, T1W, T21, T1X; + { + E T1Y, T1Z, T1I, T1T; + T1Y = T1n - T1m; + T1Z = T1q - T1p; + T20 = FMA(KP618033988, T1Z, T1Y); + T22 = FNMS(KP618033988, T1Y, T1Z); + T1x = T1u - T1w; + T1I = T1C + T1H; + T1T = T1N + T1S; + T1U = T1I + T1T; + T1V = FNMS(KP250000000, T1U, T1x); + T1W = T1I - T1T; + } + Rm[WS(rs, 4)] = KP500000000 * (T1x + T1U); + T21 = FNMS(KP559016994, T1W, T1V); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T22, T21)); + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP951056516, T22, T21)); + T1X = FMA(KP559016994, T1W, T1V); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T20, T1X)); + Rm[0] = KP500000000 * (FNMS(KP951056516, T20, T1X)); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cfdft_10", twinstr, &GENUS, {68, 38, 54, 0} }; + +void X(codelet_hc2cfdft_10) (planner *p) { + X(khc2c_register) (p, hc2cfdft_10, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 10 -dit -name hc2cfdft_10 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 122 FP additions, 68 FP multiplications, + * (or, 92 additions, 38 multiplications, 30 fused multiply/add), + * 62 stack variables, 5 constants, and 40 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP293892626, +0.293892626146236564584352977319536384298826219); + DK(KP475528258, +0.475528258147576786058219666689691071702849317); + DK(KP125000000, +0.125000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP279508497, +0.279508497187473712051146708591409529430077295); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 18, MAKE_VOLATILE_STRIDE(40, rs)) { + E Tw, TL, TM, T1W, T1X, T27, T1Z, T20, T26, TX, T1a, T1b, T1d, T1e, T1f; + E T1q, T1t, T1u, T1x, T1A, T1B, T1g, T1h, T1i, Td, T25, T1k, T1F; + { + E T3, T1D, T19, T1z, T7, Tb, TR, T1v, Tm, T1o, TK, T1s, Tv, T1p, T12; + E T1y, TF, T1r, TW, T1w; + { + E T1, T2, T18, T14, T15, T16, T13, T17; + T1 = Ip[0]; + T2 = Im[0]; + T18 = T1 + T2; + T14 = Rm[0]; + T15 = Rp[0]; + T16 = T14 - T15; + T3 = T1 - T2; + T1D = T15 + T14; + T13 = W[0]; + T17 = W[1]; + T19 = FNMS(T17, T18, T13 * T16); + T1z = FMA(T17, T16, T13 * T18); + } + { + E T5, T6, TO, T9, Ta, TQ, TN, TP; + T5 = Ip[WS(rs, 2)]; + T6 = Im[WS(rs, 2)]; + TO = T5 - T6; + T9 = Rp[WS(rs, 2)]; + Ta = Rm[WS(rs, 2)]; + TQ = T9 + Ta; + T7 = T5 + T6; + Tb = T9 - Ta; + TN = W[6]; + TP = W[7]; + TR = FNMS(TP, TQ, TN * TO); + T1v = FMA(TP, TO, TN * TQ); + } + { + E Th, TJ, Tl, TH; + { + E Tf, Tg, Tj, Tk; + Tf = Ip[WS(rs, 1)]; + Tg = Im[WS(rs, 1)]; + Th = Tf - Tg; + TJ = Tf + Tg; + Tj = Rp[WS(rs, 1)]; + Tk = Rm[WS(rs, 1)]; + Tl = Tj + Tk; + TH = Tj - Tk; + } + { + E Te, Ti, TG, TI; + Te = W[2]; + Ti = W[3]; + Tm = FNMS(Ti, Tl, Te * Th); + T1o = FMA(Te, Tl, Ti * Th); + TG = W[4]; + TI = W[5]; + TK = FMA(TG, TH, TI * TJ); + T1s = FNMS(TI, TH, TG * TJ); + } + } + { + E Tq, TZ, Tu, T11; + { + E To, Tp, Ts, Tt; + To = Ip[WS(rs, 3)]; + Tp = Im[WS(rs, 3)]; + Tq = To + Tp; + TZ = To - Tp; + Ts = Rp[WS(rs, 3)]; + Tt = Rm[WS(rs, 3)]; + Tu = Ts - Tt; + T11 = Ts + Tt; + } + { + E Tn, Tr, TY, T10; + Tn = W[13]; + Tr = W[12]; + Tv = FMA(Tn, Tq, Tr * Tu); + T1p = FNMS(Tn, Tu, Tr * Tq); + TY = W[10]; + T10 = W[11]; + T12 = FNMS(T10, T11, TY * TZ); + T1y = FMA(T10, TZ, TY * T11); + } + } + { + E TA, TV, TE, TT; + { + E Ty, Tz, TC, TD; + Ty = Ip[WS(rs, 4)]; + Tz = Im[WS(rs, 4)]; + TA = Ty - Tz; + TV = Ty + Tz; + TC = Rp[WS(rs, 4)]; + TD = Rm[WS(rs, 4)]; + TE = TC + TD; + TT = TC - TD; + } + { + E Tx, TB, TS, TU; + Tx = W[14]; + TB = W[15]; + TF = FNMS(TB, TE, Tx * TA); + T1r = FMA(Tx, TE, TB * TA); + TS = W[16]; + TU = W[17]; + TW = FMA(TS, TT, TU * TV); + T1w = FNMS(TU, TT, TS * TV); + } + } + Tw = Tm - Tv; + TL = TF - TK; + TM = Tw + TL; + T1W = T1v + T1w; + T1X = T1y + T1z; + T27 = T1W + T1X; + T1Z = T1o + T1p; + T20 = T1s + T1r; + T26 = T1Z + T20; + TX = TR - TW; + T1a = T12 + T19; + T1b = TX + T1a; + T1d = T19 - T12; + T1e = TR + TW; + T1f = T1d - T1e; + T1q = T1o - T1p; + T1t = T1r - T1s; + T1u = T1q + T1t; + T1x = T1v - T1w; + T1A = T1y - T1z; + T1B = T1x + T1A; + T1g = Tm + Tv; + T1h = TK + TF; + T1i = T1g + T1h; + { + E Tc, T1E, T4, T8; + T4 = W[9]; + T8 = W[8]; + Tc = FMA(T4, T7, T8 * Tb); + T1E = FNMS(T4, Tb, T8 * T7); + Td = T3 - Tc; + T25 = T1D + T1E; + T1k = Tc + T3; + T1F = T1D - T1E; + } + } + { + E T1U, T1c, T1T, T22, T24, T1Y, T21, T23, T1V; + T1U = KP279508497 * (TM - T1b); + T1c = TM + T1b; + T1T = FNMS(KP125000000, T1c, KP500000000 * Td); + T1Y = T1W - T1X; + T21 = T1Z - T20; + T22 = FNMS(KP293892626, T21, KP475528258 * T1Y); + T24 = FMA(KP475528258, T21, KP293892626 * T1Y); + Ip[0] = KP500000000 * (Td + T1c); + T23 = T1U + T1T; + Ip[WS(rs, 4)] = T23 + T24; + Im[WS(rs, 3)] = T24 - T23; + T1V = T1T - T1U; + Ip[WS(rs, 2)] = T1V + T22; + Im[WS(rs, 1)] = T22 - T1V; + } + { + E T2a, T28, T29, T2e, T2g, T2c, T2d, T2f, T2b; + T2a = KP279508497 * (T26 - T27); + T28 = T26 + T27; + T29 = FNMS(KP125000000, T28, KP500000000 * T25); + T2c = TX - T1a; + T2d = Tw - TL; + T2e = FNMS(KP293892626, T2d, KP475528258 * T2c); + T2g = FMA(KP475528258, T2d, KP293892626 * T2c); + Rp[0] = KP500000000 * (T25 + T28); + T2f = T2a + T29; + Rp[WS(rs, 4)] = T2f - T2g; + Rm[WS(rs, 3)] = T2g + T2f; + T2b = T29 - T2a; + Rp[WS(rs, 2)] = T2b - T2e; + Rm[WS(rs, 1)] = T2e + T2b; + } + { + E T1M, T1j, T1L, T1Q, T1S, T1O, T1P, T1R, T1N; + T1M = KP279508497 * (T1i + T1f); + T1j = T1f - T1i; + T1L = FMA(KP500000000, T1k, KP125000000 * T1j); + T1O = T1A - T1x; + T1P = T1q - T1t; + T1Q = FNMS(KP475528258, T1P, KP293892626 * T1O); + T1S = FMA(KP293892626, T1P, KP475528258 * T1O); + Im[WS(rs, 4)] = KP500000000 * (T1j - T1k); + T1R = T1L - T1M; + Ip[WS(rs, 3)] = T1R + T1S; + Im[WS(rs, 2)] = T1S - T1R; + T1N = T1L + T1M; + Ip[WS(rs, 1)] = T1N + T1Q; + Im[0] = T1Q - T1N; + } + { + E T1C, T1G, T1H, T1n, T1J, T1l, T1m, T1K, T1I; + T1C = KP279508497 * (T1u - T1B); + T1G = T1u + T1B; + T1H = FNMS(KP125000000, T1G, KP500000000 * T1F); + T1l = T1g - T1h; + T1m = T1e + T1d; + T1n = FMA(KP475528258, T1l, KP293892626 * T1m); + T1J = FNMS(KP293892626, T1l, KP475528258 * T1m); + Rm[WS(rs, 4)] = KP500000000 * (T1F + T1G); + T1K = T1H - T1C; + Rp[WS(rs, 3)] = T1J + T1K; + Rm[WS(rs, 2)] = T1K - T1J; + T1I = T1C + T1H; + Rp[WS(rs, 1)] = T1n + T1I; + Rm[0] = T1I - T1n; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 10, "hc2cfdft_10", twinstr, &GENUS, {92, 38, 30, 0} }; + +void X(codelet_hc2cfdft_10) (planner *p) { + X(khc2c_register) (p, hc2cfdft_10, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_12.c new file mode 100644 index 000000000..c0b9cd8e2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_12.c @@ -0,0 +1,646 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -dit -name hc2cfdft_12 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 142 FP additions, 92 FP multiplications, + * (or, 96 additions, 46 multiplications, 46 fused multiply/add), + * 65 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E To, T1E, T1m, T2H, Ta, T1G, Tk, T1I, Tl, T1J, T1s, T2b, T1A, T2d, T1B; + E T2I, T12, T18, T19, T24, T26, T2C, Tz, T1M, T1f, T2B, TJ, T1O, TT, T1Q; + E TU, T1R; + { + E Tm, Tn, T1u, T1x, T1y, T1z, T1v, T2c, Te, Tj, T1i, T1l, Tf, T1H, T4; + E T1o, T9, T1r, T5, T1F, T1p, T2a, T1t, T1, T1n; + Tm = Ip[0]; + Tn = Im[0]; + T1u = Tm + Tn; + T1x = Rp[0]; + T1y = Rm[0]; + T1z = T1x - T1y; + T1t = W[0]; + T1v = T1t * T1u; + T2c = T1t * T1z; + { + E Tc, Td, Th, Ti, Tb; + Tc = Ip[WS(rs, 4)]; + Td = Im[WS(rs, 4)]; + Te = Tc - Td; + Th = Rp[WS(rs, 4)]; + Ti = Rm[WS(rs, 4)]; + Tj = Th + Ti; + T1i = Tc + Td; + T1l = Th - Ti; + Tb = W[14]; + Tf = Tb * Te; + T1H = Tb * Tj; + } + { + E T2, T3, T7, T8; + T2 = Ip[WS(rs, 2)]; + T3 = Im[WS(rs, 2)]; + T4 = T2 - T3; + T1o = T2 + T3; + T7 = Rp[WS(rs, 2)]; + T8 = Rm[WS(rs, 2)]; + T9 = T7 + T8; + T1r = T7 - T8; + } + T1 = W[6]; + T5 = T1 * T4; + T1F = T1 * T9; + T1n = W[8]; + T1p = T1n * T1o; + T2a = T1n * T1r; + To = Tm - Tn; + T1E = T1x + T1y; + { + E T1j, T2G, T1h, T1k; + T1h = W[16]; + T1j = T1h * T1i; + T2G = T1h * T1l; + T1k = W[17]; + T1m = FNMS(T1k, T1l, T1j); + T2H = FMA(T1k, T1i, T2G); + } + { + E T6, Tg, T1q, T1w; + T6 = W[7]; + Ta = FNMS(T6, T9, T5); + T1G = FMA(T6, T4, T1F); + Tg = W[15]; + Tk = FNMS(Tg, Tj, Tf); + T1I = FMA(Tg, Te, T1H); + Tl = Ta + Tk; + T1J = T1G + T1I; + T1q = W[9]; + T1s = FNMS(T1q, T1r, T1p); + T2b = FMA(T1q, T1o, T2a); + T1w = W[1]; + T1A = FNMS(T1w, T1z, T1v); + T2d = FMA(T1w, T1u, T2c); + T1B = T1s + T1A; + T2I = T2b + T2d; + } + } + { + E Tt, T11, Ty, T10, T23, TX, TZ, TN, TS, T1b, T1e, TO, T1P, TD, TI; + E T17, T16, T25, T13, T15, TE, T1N, TF, TP; + { + E Tr, Ts, Tw, Tx, TY; + Tr = Ip[WS(rs, 3)]; + Ts = Im[WS(rs, 3)]; + Tt = Tr - Ts; + T11 = Tr + Ts; + Tw = Rp[WS(rs, 3)]; + Tx = Rm[WS(rs, 3)]; + TY = Tx - Tw; + Ty = Tw + Tx; + T10 = W[12]; + T23 = T10 * TY; + TX = W[13]; + TZ = TX * TY; + } + { + E TL, TM, TQ, TR, TK; + TL = Ip[WS(rs, 1)]; + TM = Im[WS(rs, 1)]; + TN = TL - TM; + TQ = Rp[WS(rs, 1)]; + TR = Rm[WS(rs, 1)]; + TS = TQ + TR; + T1b = TL + TM; + T1e = TQ - TR; + TK = W[2]; + TO = TK * TN; + T1P = TK * TS; + } + { + E TB, TC, T14, TG, TH, TA; + TB = Ip[WS(rs, 5)]; + TC = Im[WS(rs, 5)]; + TD = TB - TC; + TG = Rp[WS(rs, 5)]; + TH = Rm[WS(rs, 5)]; + TI = TG + TH; + T14 = TH - TG; + T17 = TB + TC; + T16 = W[20]; + T25 = T16 * T14; + T13 = W[21]; + T15 = T13 * T14; + TA = W[18]; + TE = TA * TD; + T1N = TA * TI; + } + T12 = FMA(T10, T11, TZ); + T18 = FMA(T16, T17, T15); + T19 = T12 + T18; + T24 = FNMS(TX, T11, T23); + T26 = FNMS(T13, T17, T25); + T2C = T24 + T26; + { + E Tu, T1L, Tq, Tv; + Tq = W[10]; + Tu = Tq * Tt; + T1L = Tq * Ty; + Tv = W[11]; + Tz = FNMS(Tv, Ty, Tu); + T1M = FMA(Tv, Tt, T1L); + } + { + E T1c, T2A, T1a, T1d; + T1a = W[4]; + T1c = T1a * T1b; + T2A = T1a * T1e; + T1d = W[5]; + T1f = FNMS(T1d, T1e, T1c); + T2B = FMA(T1d, T1b, T2A); + } + TF = W[19]; + TJ = FNMS(TF, TI, TE); + T1O = FMA(TF, TD, T1N); + TP = W[3]; + TT = FNMS(TP, TS, TO); + T1Q = FMA(TP, TN, T1P); + TU = TJ + TT; + T1R = T1O + T1Q; + } + { + E TW, T2V, T2Y, T30, T1D, T1U, T1T, T2Z; + { + E Tp, TV, T2W, T2X; + Tp = Tl + To; + TV = Tz + TU; + TW = Tp - TV; + T2V = TV + Tp; + T2W = T2C - T2B; + T2X = T2H + T2I; + T2Y = T2W - T2X; + T30 = T2W + T2X; + } + { + E T1g, T1C, T1K, T1S; + T1g = T19 + T1f; + T1C = T1m + T1B; + T1D = T1g - T1C; + T1U = T1g + T1C; + T1K = T1E + T1J; + T1S = T1M + T1R; + T1T = T1K + T1S; + T2Z = T1K - T1S; + } + Ip[WS(rs, 3)] = KP500000000 * (TW + T1D); + Rp[WS(rs, 3)] = KP500000000 * (T2Z - T30); + Im[WS(rs, 2)] = KP500000000 * (T1D - TW); + Rm[WS(rs, 2)] = KP500000000 * (T2Z + T30); + Rm[WS(rs, 5)] = KP500000000 * (T1T - T1U); + Im[WS(rs, 5)] = KP500000000 * (T2Y - T2V); + Rp[0] = KP500000000 * (T1T + T1U); + Ip[0] = KP500000000 * (T2V + T2Y); + } + { + E T1X, T2v, T2F, T2Q, T2L, T2R, T20, T2w, T28, T2t, T2j, T2p, T2m, T2q, T2f; + E T2s; + { + E T1V, T1W, T2D, T2E; + T1V = FNMS(KP500000000, T1J, T1E); + T1W = Ta - Tk; + T1X = FNMS(KP866025403, T1W, T1V); + T2v = FMA(KP866025403, T1W, T1V); + T2D = FMA(KP500000000, T2C, T2B); + T2E = T18 - T12; + T2F = FNMS(KP866025403, T2E, T2D); + T2Q = FMA(KP866025403, T2E, T2D); + } + { + E T2J, T2K, T1Y, T1Z; + T2J = FNMS(KP500000000, T2I, T2H); + T2K = T1s - T1A; + T2L = FNMS(KP866025403, T2K, T2J); + T2R = FMA(KP866025403, T2K, T2J); + T1Y = FNMS(KP500000000, T1R, T1M); + T1Z = TJ - TT; + T20 = FNMS(KP866025403, T1Z, T1Y); + T2w = FMA(KP866025403, T1Z, T1Y); + } + { + E T22, T27, T2h, T2i; + T22 = FNMS(KP500000000, T19, T1f); + T27 = T24 - T26; + T28 = FNMS(KP866025403, T27, T22); + T2t = FMA(KP866025403, T27, T22); + T2h = FNMS(KP500000000, Tl, To); + T2i = T1I - T1G; + T2j = FNMS(KP866025403, T2i, T2h); + T2p = FMA(KP866025403, T2i, T2h); + } + { + E T2k, T2l, T29, T2e; + T2k = FNMS(KP500000000, TU, Tz); + T2l = T1Q - T1O; + T2m = FNMS(KP866025403, T2l, T2k); + T2q = FMA(KP866025403, T2l, T2k); + T29 = FNMS(KP500000000, T1B, T1m); + T2e = T2b - T2d; + T2f = FNMS(KP866025403, T2e, T29); + T2s = FMA(KP866025403, T2e, T29); + } + { + E T21, T2g, T2P, T2S; + T21 = T1X + T20; + T2g = T28 + T2f; + Rp[WS(rs, 2)] = KP500000000 * (T21 - T2g); + Rm[WS(rs, 3)] = KP500000000 * (T21 + T2g); + T2P = T2m + T2j; + T2S = T2Q + T2R; + Ip[WS(rs, 2)] = KP500000000 * (T2P + T2S); + Im[WS(rs, 3)] = KP500000000 * (T2S - T2P); + } + { + E T2n, T2o, T2T, T2U; + T2n = T2j - T2m; + T2o = T2f - T28; + Ip[WS(rs, 5)] = KP500000000 * (T2n + T2o); + Im[0] = KP500000000 * (T2o - T2n); + T2T = T1X - T20; + T2U = T2R - T2Q; + Rm[0] = KP500000000 * (T2T - T2U); + Rp[WS(rs, 5)] = KP500000000 * (T2T + T2U); + } + { + E T2r, T2u, T2N, T2O; + T2r = T2p - T2q; + T2u = T2s - T2t; + Ip[WS(rs, 1)] = KP500000000 * (T2r + T2u); + Im[WS(rs, 4)] = KP500000000 * (T2u - T2r); + T2N = T2v - T2w; + T2O = T2L - T2F; + Rm[WS(rs, 4)] = KP500000000 * (T2N - T2O); + Rp[WS(rs, 1)] = KP500000000 * (T2N + T2O); + } + { + E T2x, T2y, T2z, T2M; + T2x = T2v + T2w; + T2y = T2t + T2s; + Rm[WS(rs, 1)] = KP500000000 * (T2x - T2y); + Rp[WS(rs, 4)] = KP500000000 * (T2x + T2y); + T2z = T2q + T2p; + T2M = T2F + T2L; + Ip[WS(rs, 4)] = KP500000000 * (T2z - T2M); + Im[WS(rs, 1)] = -(KP500000000 * (T2z + T2M)); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cfdft_12", twinstr, &GENUS, {96, 46, 46, 0} }; + +void X(codelet_hc2cfdft_12) (planner *p) { + X(khc2c_register) (p, hc2cfdft_12, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 12 -dit -name hc2cfdft_12 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 142 FP additions, 76 FP multiplications, + * (or, 112 additions, 46 multiplications, 30 fused multiply/add), + * 52 stack variables, 3 constants, and 48 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP433012701, +0.433012701892219323381861585376468091735701313); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 22, MAKE_VOLATILE_STRIDE(48, rs)) { + E Tm, T1t, T1d, T2j, Tj, T1Y, T1w, T1G, T1q, T2q, T1U, T2k, Tw, T1y, T17; + E T2g, TP, T21, T1B, T1J, T12, T2u, T1P, T2h; + { + E Tk, Tl, T1k, T1m, T1n, T1o, T4, T1f, T8, T1h, Th, T1c, Td, T1a, T19; + E T1b; + { + E T2, T3, T6, T7; + Tk = Ip[0]; + Tl = Im[0]; + T1k = Tk + Tl; + T1m = Rp[0]; + T1n = Rm[0]; + T1o = T1m - T1n; + T2 = Ip[WS(rs, 2)]; + T3 = Im[WS(rs, 2)]; + T4 = T2 - T3; + T1f = T2 + T3; + T6 = Rp[WS(rs, 2)]; + T7 = Rm[WS(rs, 2)]; + T8 = T6 + T7; + T1h = T6 - T7; + { + E Tf, Tg, Tb, Tc; + Tf = Rp[WS(rs, 4)]; + Tg = Rm[WS(rs, 4)]; + Th = Tf + Tg; + T1c = Tf - Tg; + Tb = Ip[WS(rs, 4)]; + Tc = Im[WS(rs, 4)]; + Td = Tb - Tc; + T1a = Tb + Tc; + } + } + Tm = Tk - Tl; + T1t = T1m + T1n; + T19 = W[16]; + T1b = W[17]; + T1d = FNMS(T1b, T1c, T19 * T1a); + T2j = FMA(T19, T1c, T1b * T1a); + { + E T9, T1u, Ti, T1v; + { + E T1, T5, Ta, Te; + T1 = W[6]; + T5 = W[7]; + T9 = FNMS(T5, T8, T1 * T4); + T1u = FMA(T1, T8, T5 * T4); + Ta = W[14]; + Te = W[15]; + Ti = FNMS(Te, Th, Ta * Td); + T1v = FMA(Ta, Th, Te * Td); + } + Tj = T9 + Ti; + T1Y = KP433012701 * (T1v - T1u); + T1w = T1u + T1v; + T1G = KP433012701 * (T9 - Ti); + } + { + E T1i, T1S, T1p, T1T; + { + E T1e, T1g, T1j, T1l; + T1e = W[8]; + T1g = W[9]; + T1i = FNMS(T1g, T1h, T1e * T1f); + T1S = FMA(T1e, T1h, T1g * T1f); + T1j = W[0]; + T1l = W[1]; + T1p = FNMS(T1l, T1o, T1j * T1k); + T1T = FMA(T1j, T1o, T1l * T1k); + } + T1q = T1i + T1p; + T2q = KP433012701 * (T1i - T1p); + T1U = KP433012701 * (T1S - T1T); + T2k = T1S + T1T; + } + } + { + E Tr, TT, Tv, TV, TA, TY, TE, T10, TN, T14, TJ, T16; + { + E Tp, Tq, TC, TD; + Tp = Ip[WS(rs, 3)]; + Tq = Im[WS(rs, 3)]; + Tr = Tp - Tq; + TT = Tp + Tq; + { + E Tt, Tu, Ty, Tz; + Tt = Rp[WS(rs, 3)]; + Tu = Rm[WS(rs, 3)]; + Tv = Tt + Tu; + TV = Tt - Tu; + Ty = Ip[WS(rs, 5)]; + Tz = Im[WS(rs, 5)]; + TA = Ty - Tz; + TY = Ty + Tz; + } + TC = Rp[WS(rs, 5)]; + TD = Rm[WS(rs, 5)]; + TE = TC + TD; + T10 = TC - TD; + { + E TL, TM, TH, TI; + TL = Rp[WS(rs, 1)]; + TM = Rm[WS(rs, 1)]; + TN = TL + TM; + T14 = TM - TL; + TH = Ip[WS(rs, 1)]; + TI = Im[WS(rs, 1)]; + TJ = TH - TI; + T16 = TH + TI; + } + } + { + E To, Ts, T13, T15; + To = W[10]; + Ts = W[11]; + Tw = FNMS(Ts, Tv, To * Tr); + T1y = FMA(To, Tv, Ts * Tr); + T13 = W[5]; + T15 = W[4]; + T17 = FMA(T13, T14, T15 * T16); + T2g = FNMS(T13, T16, T15 * T14); + } + { + E TF, T1z, TO, T1A; + { + E Tx, TB, TG, TK; + Tx = W[18]; + TB = W[19]; + TF = FNMS(TB, TE, Tx * TA); + T1z = FMA(Tx, TE, TB * TA); + TG = W[2]; + TK = W[3]; + TO = FNMS(TK, TN, TG * TJ); + T1A = FMA(TG, TN, TK * TJ); + } + TP = TF + TO; + T21 = KP433012701 * (T1A - T1z); + T1B = T1z + T1A; + T1J = KP433012701 * (TF - TO); + } + { + E TW, T1O, T11, T1N; + { + E TS, TU, TX, TZ; + TS = W[12]; + TU = W[13]; + TW = FNMS(TU, TV, TS * TT); + T1O = FMA(TS, TV, TU * TT); + TX = W[20]; + TZ = W[21]; + T11 = FNMS(TZ, T10, TX * TY); + T1N = FMA(TX, T10, TZ * TY); + } + T12 = TW + T11; + T2u = KP433012701 * (T11 - TW); + T1P = KP433012701 * (T1N - T1O); + T2h = T1O + T1N; + } + } + { + E TR, T2f, T2m, T2o, T1s, T1E, T1D, T2n; + { + E Tn, TQ, T2i, T2l; + Tn = Tj + Tm; + TQ = Tw + TP; + TR = Tn - TQ; + T2f = TQ + Tn; + T2i = T2g - T2h; + T2l = T2j + T2k; + T2m = T2i - T2l; + T2o = T2i + T2l; + } + { + E T18, T1r, T1x, T1C; + T18 = T12 + T17; + T1r = T1d + T1q; + T1s = T18 - T1r; + T1E = T18 + T1r; + T1x = T1t + T1w; + T1C = T1y + T1B; + T1D = T1x + T1C; + T2n = T1x - T1C; + } + Ip[WS(rs, 3)] = KP500000000 * (TR + T1s); + Rp[WS(rs, 3)] = KP500000000 * (T2n - T2o); + Im[WS(rs, 2)] = KP500000000 * (T1s - TR); + Rm[WS(rs, 2)] = KP500000000 * (T2n + T2o); + Rm[WS(rs, 5)] = KP500000000 * (T1D - T1E); + Im[WS(rs, 5)] = KP500000000 * (T2m - T2f); + Rp[0] = KP500000000 * (T1D + T1E); + Ip[0] = KP500000000 * (T2f + T2m); + } + { + E T1H, T2b, T2s, T2B, T2v, T2A, T1K, T2c, T1Q, T29, T1Z, T25, T22, T26, T1V; + E T28; + { + E T1F, T2r, T2t, T1I; + T1F = FNMS(KP250000000, T1w, KP500000000 * T1t); + T1H = T1F - T1G; + T2b = T1F + T1G; + T2r = FNMS(KP500000000, T2j, KP250000000 * T2k); + T2s = T2q - T2r; + T2B = T2q + T2r; + T2t = FMA(KP250000000, T2h, KP500000000 * T2g); + T2v = T2t - T2u; + T2A = T2u + T2t; + T1I = FNMS(KP250000000, T1B, KP500000000 * T1y); + T1K = T1I - T1J; + T2c = T1I + T1J; + } + { + E T1M, T1X, T20, T1R; + T1M = FNMS(KP250000000, T12, KP500000000 * T17); + T1Q = T1M - T1P; + T29 = T1P + T1M; + T1X = FNMS(KP250000000, Tj, KP500000000 * Tm); + T1Z = T1X - T1Y; + T25 = T1Y + T1X; + T20 = FNMS(KP250000000, TP, KP500000000 * Tw); + T22 = T20 - T21; + T26 = T21 + T20; + T1R = FNMS(KP250000000, T1q, KP500000000 * T1d); + T1V = T1R - T1U; + T28 = T1R + T1U; + } + { + E T1L, T1W, T2p, T2w; + T1L = T1H + T1K; + T1W = T1Q + T1V; + Rp[WS(rs, 2)] = T1L - T1W; + Rm[WS(rs, 3)] = T1L + T1W; + T2p = T22 + T1Z; + T2w = T2s - T2v; + Ip[WS(rs, 2)] = T2p + T2w; + Im[WS(rs, 3)] = T2w - T2p; + } + { + E T23, T24, T2x, T2y; + T23 = T1Z - T22; + T24 = T1V - T1Q; + Ip[WS(rs, 5)] = T23 + T24; + Im[0] = T24 - T23; + T2x = T1H - T1K; + T2y = T2v + T2s; + Rm[0] = T2x - T2y; + Rp[WS(rs, 5)] = T2x + T2y; + } + { + E T27, T2a, T2z, T2C; + T27 = T25 - T26; + T2a = T28 - T29; + Ip[WS(rs, 1)] = T27 + T2a; + Im[WS(rs, 4)] = T2a - T27; + T2z = T2b - T2c; + T2C = T2A - T2B; + Rm[WS(rs, 4)] = T2z - T2C; + Rp[WS(rs, 1)] = T2z + T2C; + } + { + E T2d, T2e, T2D, T2E; + T2d = T2b + T2c; + T2e = T29 + T28; + Rm[WS(rs, 1)] = T2d - T2e; + Rp[WS(rs, 4)] = T2d + T2e; + T2D = T26 + T25; + T2E = T2A + T2B; + Ip[WS(rs, 4)] = T2D + T2E; + Im[WS(rs, 1)] = T2E - T2D; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 12, "hc2cfdft_12", twinstr, &GENUS, {112, 46, 30, 0} }; + +void X(codelet_hc2cfdft_12) (planner *p) { + X(khc2c_register) (p, hc2cfdft_12, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_16.c new file mode 100644 index 000000000..1053dbca9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_16.c @@ -0,0 +1,909 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:12 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -dit -name hc2cfdft_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 206 FP additions, 132 FP multiplications, + * (or, 136 additions, 62 multiplications, 70 fused multiply/add), + * 67 stack variables, 4 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E T1f, T2e, T1c, T2g, T1K, T3D, T2W, T3H, TR, T2j, T2R, T3E, T11, T2l, T1v; + E T3G, Ta, T2p, Tk, T2r, T3o, T3p, T1Y, T3z, T2G, T3w, Tv, T2u, TF, T2w; + E T3r, T3s, T2b, T3A, T2L, T3x; + { + E T1d, T1e, T1I, T16, T1A, T1D, T1E, T1C, T1G, T1H, T2U, T1b, T1z, T2S, T1w; + E T1y, T14, T15; + T1d = Ip[0]; + T1e = Im[0]; + T1I = T1d + T1e; + T14 = Ip[WS(rs, 4)]; + T15 = Im[WS(rs, 4)]; + T16 = T14 - T15; + T1A = T14 + T15; + { + E T1F, T19, T1a, T1x; + T1D = Rm[0]; + T1E = Rp[0]; + T1F = T1D - T1E; + T1C = W[0]; + T1G = T1C * T1F; + T1H = W[1]; + T2U = T1H * T1F; + T19 = Rp[WS(rs, 4)]; + T1a = Rm[WS(rs, 4)]; + T1x = T1a - T19; + T1b = T19 + T1a; + T1z = W[17]; + T2S = T1z * T1x; + T1w = W[16]; + T1y = T1w * T1x; + } + T1f = T1d - T1e; + T2e = T1E + T1D; + { + E T17, T2f, T13, T18; + T13 = W[14]; + T17 = T13 * T16; + T2f = T13 * T1b; + T18 = W[15]; + T1c = FNMS(T18, T1b, T17); + T2g = FMA(T18, T16, T2f); + } + { + E T1B, T1J, T2T, T2V; + T1B = FNMS(T1z, T1A, T1y); + T1J = FNMS(T1H, T1I, T1G); + T1K = T1B + T1J; + T3D = T1J - T1B; + T2T = FMA(T1w, T1A, T2S); + T2V = FMA(T1C, T1I, T2U); + T2W = T2T + T2V; + T3H = T2V - T2T; + } + } + { + E TL, T1n, TQ, T1m, T2N, T1j, T1l, TV, T1t, T10, T1s, T2P, T1p, T1r; + { + E TJ, TK, TO, TP, T1k; + TJ = Ip[WS(rs, 2)]; + TK = Im[WS(rs, 2)]; + TL = TJ - TK; + T1n = TJ + TK; + TO = Rp[WS(rs, 2)]; + TP = Rm[WS(rs, 2)]; + T1k = TP - TO; + TQ = TO + TP; + T1m = W[9]; + T2N = T1m * T1k; + T1j = W[8]; + T1l = T1j * T1k; + } + { + E TT, TU, TY, TZ, T1q; + TT = Ip[WS(rs, 6)]; + TU = Im[WS(rs, 6)]; + TV = TT - TU; + T1t = TT + TU; + TY = Rp[WS(rs, 6)]; + TZ = Rm[WS(rs, 6)]; + T1q = TZ - TY; + T10 = TY + TZ; + T1s = W[25]; + T2P = T1s * T1q; + T1p = W[24]; + T1r = T1p * T1q; + } + { + E T2O, T2Q, T1o, T1u; + { + E TM, T2i, TI, TN; + TI = W[6]; + TM = TI * TL; + T2i = TI * TQ; + TN = W[7]; + TR = FNMS(TN, TQ, TM); + T2j = FMA(TN, TL, T2i); + } + T2O = FMA(T1j, T1n, T2N); + T2Q = FMA(T1p, T1t, T2P); + T2R = T2O + T2Q; + T3E = T2O - T2Q; + { + E TW, T2k, TS, TX; + TS = W[22]; + TW = TS * TV; + T2k = TS * T10; + TX = W[23]; + T11 = FNMS(TX, T10, TW); + T2l = FMA(TX, TV, T2k); + } + T1o = FNMS(T1m, T1n, T1l); + T1u = FNMS(T1s, T1t, T1r); + T1v = T1o + T1u; + T3G = T1o - T1u; + } + } + { + E T4, T1Q, T9, T1N, T5, T2o, T1O, T2C, Te, T1W, Tj, T1T, Tf, T2q, T1U; + E T2E, T6, Tg; + { + E T1, T1M, Tb, T1S; + { + E T2, T3, T7, T8; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + T1Q = T2 + T3; + T7 = Rp[WS(rs, 1)]; + T8 = Rm[WS(rs, 1)]; + T9 = T7 + T8; + T1N = T7 - T8; + } + T1 = W[2]; + T5 = T1 * T4; + T2o = T1 * T9; + T1M = W[4]; + T1O = T1M * T1N; + T2C = T1M * T1Q; + { + E Tc, Td, Th, Ti; + Tc = Ip[WS(rs, 5)]; + Td = Im[WS(rs, 5)]; + Te = Tc - Td; + T1W = Tc + Td; + Th = Rp[WS(rs, 5)]; + Ti = Rm[WS(rs, 5)]; + Tj = Th + Ti; + T1T = Th - Ti; + } + Tb = W[18]; + Tf = Tb * Te; + T2q = Tb * Tj; + T1S = W[20]; + T1U = T1S * T1T; + T2E = T1S * T1W; + } + T6 = W[3]; + Ta = FNMS(T6, T9, T5); + T2p = FMA(T6, T4, T2o); + Tg = W[19]; + Tk = FNMS(Tg, Tj, Tf); + T2r = FMA(Tg, Te, T2q); + T3o = Ta - Tk; + T3p = T2p - T2r; + { + E T1R, T2D, T1X, T2F, T1P, T1V; + T1P = W[5]; + T1R = FMA(T1P, T1Q, T1O); + T2D = FNMS(T1P, T1N, T2C); + T1V = W[21]; + T1X = FMA(T1V, T1W, T1U); + T2F = FNMS(T1V, T1T, T2E); + T1Y = T1R + T1X; + T3z = T1X - T1R; + T2G = T2D + T2F; + T3w = T2F - T2D; + } + } + { + E Tp, T23, Tu, T20, Tq, T2t, T21, T2H, Tz, T29, TE, T26, TA, T2v, T27; + E T2J, Tr, TB; + { + E Tm, T1Z, Tw, T25; + { + E Tn, To, Ts, Tt; + Tn = Ip[WS(rs, 7)]; + To = Im[WS(rs, 7)]; + Tp = Tn - To; + T23 = Tn + To; + Ts = Rp[WS(rs, 7)]; + Tt = Rm[WS(rs, 7)]; + Tu = Ts + Tt; + T20 = Ts - Tt; + } + Tm = W[26]; + Tq = Tm * Tp; + T2t = Tm * Tu; + T1Z = W[28]; + T21 = T1Z * T20; + T2H = T1Z * T23; + { + E Tx, Ty, TC, TD; + Tx = Ip[WS(rs, 3)]; + Ty = Im[WS(rs, 3)]; + Tz = Tx - Ty; + T29 = Tx + Ty; + TC = Rp[WS(rs, 3)]; + TD = Rm[WS(rs, 3)]; + TE = TC + TD; + T26 = TC - TD; + } + Tw = W[10]; + TA = Tw * Tz; + T2v = Tw * TE; + T25 = W[12]; + T27 = T25 * T26; + T2J = T25 * T29; + } + Tr = W[27]; + Tv = FNMS(Tr, Tu, Tq); + T2u = FMA(Tr, Tp, T2t); + TB = W[11]; + TF = FNMS(TB, TE, TA); + T2w = FMA(TB, Tz, T2v); + T3r = T2u - T2w; + T3s = Tv - TF; + { + E T24, T2I, T2a, T2K, T22, T28; + T22 = W[29]; + T24 = FMA(T22, T23, T21); + T2I = FNMS(T22, T20, T2H); + T28 = W[13]; + T2a = FMA(T28, T29, T27); + T2K = FNMS(T28, T26, T2J); + T2b = T24 + T2a; + T3A = T2I - T2K; + T2L = T2I + T2K; + T3x = T2a - T24; + } + } + { + E TH, T3c, T36, T3g, T39, T3h, T1h, T32, T2d, T2A, T2y, T31, T2Y, T30, T2n; + E T3b; + { + E Tl, TG, T34, T35; + Tl = Ta + Tk; + TG = Tv + TF; + TH = Tl + TG; + T3c = Tl - TG; + T34 = T2L - T2G; + T35 = T1Y - T2b; + T36 = T34 + T35; + T3g = T34 - T35; + } + { + E T37, T38, T12, T1g; + T37 = T1K - T1v; + T38 = T2W - T2R; + T39 = T37 - T38; + T3h = T37 + T38; + T12 = TR + T11; + T1g = T1c + T1f; + T1h = T12 + T1g; + T32 = T1g - T12; + } + { + E T1L, T2c, T2s, T2x; + T1L = T1v + T1K; + T2c = T1Y + T2b; + T2d = T1L - T2c; + T2A = T2c + T1L; + T2s = T2p + T2r; + T2x = T2u + T2w; + T2y = T2s + T2x; + T31 = T2x - T2s; + } + { + E T2M, T2X, T2h, T2m; + T2M = T2G + T2L; + T2X = T2R + T2W; + T2Y = T2M - T2X; + T30 = T2M + T2X; + T2h = T2e + T2g; + T2m = T2j + T2l; + T2n = T2h + T2m; + T3b = T2h - T2m; + } + { + E T1i, T2Z, T2z, T2B; + T1i = TH + T1h; + Ip[0] = KP500000000 * (T1i + T2d); + Im[WS(rs, 7)] = KP500000000 * (T2d - T1i); + T2Z = T2n + T2y; + Rm[WS(rs, 7)] = KP500000000 * (T2Z - T30); + Rp[0] = KP500000000 * (T2Z + T30); + T2z = T2n - T2y; + Rm[WS(rs, 3)] = KP500000000 * (T2z - T2A); + Rp[WS(rs, 4)] = KP500000000 * (T2z + T2A); + T2B = T1h - TH; + Ip[WS(rs, 4)] = KP500000000 * (T2B + T2Y); + Im[WS(rs, 3)] = KP500000000 * (T2Y - T2B); + } + { + E T33, T3a, T3j, T3k; + T33 = T31 + T32; + T3a = T36 + T39; + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP707106781, T3a, T33)); + Im[WS(rs, 5)] = -(KP500000000 * (FNMS(KP707106781, T3a, T33))); + T3j = T3b + T3c; + T3k = T3g + T3h; + Rm[WS(rs, 5)] = KP500000000 * (FNMS(KP707106781, T3k, T3j)); + Rp[WS(rs, 2)] = KP500000000 * (FMA(KP707106781, T3k, T3j)); + } + { + E T3d, T3e, T3f, T3i; + T3d = T3b - T3c; + T3e = T39 - T36; + Rm[WS(rs, 1)] = KP500000000 * (FNMS(KP707106781, T3e, T3d)); + Rp[WS(rs, 6)] = KP500000000 * (FMA(KP707106781, T3e, T3d)); + T3f = T32 - T31; + T3i = T3g - T3h; + Ip[WS(rs, 6)] = KP500000000 * (FMA(KP707106781, T3i, T3f)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP707106781, T3i, T3f))); + } + } + { + E T3n, T3Z, T44, T4e, T47, T4f, T3u, T4a, T3C, T3U, T3N, T49, T3Q, T40, T3J; + E T3V; + { + E T3l, T3m, T42, T43; + T3l = T1f - T1c; + T3m = T2j - T2l; + T3n = T3l - T3m; + T3Z = T3m + T3l; + T42 = T3w - T3x; + T43 = T3A - T3z; + T44 = FMA(KP414213562, T43, T42); + T4e = FNMS(KP414213562, T42, T43); + } + { + E T45, T46, T3q, T3t; + T45 = T3E + T3D; + T46 = T3H - T3G; + T47 = FMA(KP414213562, T46, T45); + T4f = FNMS(KP414213562, T45, T46); + T3q = T3o - T3p; + T3t = T3r + T3s; + T3u = T3q + T3t; + T4a = T3q - T3t; + } + { + E T3y, T3B, T3L, T3M; + T3y = T3w + T3x; + T3B = T3z + T3A; + T3C = FMA(KP414213562, T3B, T3y); + T3U = FNMS(KP414213562, T3y, T3B); + T3L = T2e - T2g; + T3M = TR - T11; + T3N = T3L + T3M; + T49 = T3L - T3M; + } + { + E T3O, T3P, T3F, T3I; + T3O = T3p + T3o; + T3P = T3r - T3s; + T3Q = T3O + T3P; + T40 = T3P - T3O; + T3F = T3D - T3E; + T3I = T3G + T3H; + T3J = FNMS(KP414213562, T3I, T3F); + T3V = FMA(KP414213562, T3F, T3I); + } + { + E T3v, T3K, T3X, T3Y; + T3v = FMA(KP707106781, T3u, T3n); + T3K = T3C + T3J; + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP923879532, T3K, T3v)); + Im[WS(rs, 6)] = -(KP500000000 * (FNMS(KP923879532, T3K, T3v))); + T3X = FMA(KP707106781, T3Q, T3N); + T3Y = T3U + T3V; + Rm[WS(rs, 6)] = KP500000000 * (FNMS(KP923879532, T3Y, T3X)); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP923879532, T3Y, T3X)); + } + { + E T3R, T3S, T3T, T3W; + T3R = FNMS(KP707106781, T3Q, T3N); + T3S = T3J - T3C; + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP923879532, T3S, T3R)); + Rp[WS(rs, 5)] = KP500000000 * (FMA(KP923879532, T3S, T3R)); + T3T = FNMS(KP707106781, T3u, T3n); + T3W = T3U - T3V; + Ip[WS(rs, 5)] = KP500000000 * (FMA(KP923879532, T3W, T3T)); + Im[WS(rs, 2)] = -(KP500000000 * (FNMS(KP923879532, T3W, T3T))); + } + { + E T41, T48, T4h, T4i; + T41 = FNMS(KP707106781, T40, T3Z); + T48 = T44 - T47; + Ip[WS(rs, 7)] = KP500000000 * (FMA(KP923879532, T48, T41)); + Im[0] = -(KP500000000 * (FNMS(KP923879532, T48, T41))); + T4h = FNMS(KP707106781, T4a, T49); + T4i = T4e + T4f; + Rp[WS(rs, 7)] = KP500000000 * (FNMS(KP923879532, T4i, T4h)); + Rm[0] = KP500000000 * (FMA(KP923879532, T4i, T4h)); + } + { + E T4b, T4c, T4d, T4g; + T4b = FMA(KP707106781, T4a, T49); + T4c = T44 + T47; + Rm[WS(rs, 4)] = KP500000000 * (FNMS(KP923879532, T4c, T4b)); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP923879532, T4c, T4b)); + T4d = FMA(KP707106781, T40, T3Z); + T4g = T4e - T4f; + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP923879532, T4g, T4d)); + Im[WS(rs, 4)] = -(KP500000000 * (FNMS(KP923879532, T4g, T4d))); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cfdft_16", twinstr, &GENUS, {136, 62, 70, 0} }; + +void X(codelet_hc2cfdft_16) (planner *p) { + X(khc2c_register) (p, hc2cfdft_16, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 16 -dit -name hc2cfdft_16 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 206 FP additions, 100 FP multiplications, + * (or, 168 additions, 62 multiplications, 38 fused multiply/add), + * 61 stack variables, 4 constants, and 64 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP461939766, +0.461939766255643378064091594698394143411208313); + DK(KP191341716, +0.191341716182544885864229992015199433380672281); + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 30, MAKE_VOLATILE_STRIDE(64, rs)) { + E T19, T3h, T21, T2Y, T1o, T3d, T2s, T39, TW, T3i, T24, T2Z, T1z, T3c, T2p; + E T3a, Tj, T2S, T28, T2R, T1L, T36, T2i, T32, TC, T2V, T2b, T2U, T1W, T35; + E T2l, T33; + { + E T10, T1m, T14, T1k, T18, T1h, T1f, T1Z; + { + E TY, TZ, T12, T13; + TY = Ip[WS(rs, 4)]; + TZ = Im[WS(rs, 4)]; + T10 = TY - TZ; + T1m = TY + TZ; + T12 = Rp[WS(rs, 4)]; + T13 = Rm[WS(rs, 4)]; + T14 = T12 + T13; + T1k = T12 - T13; + } + { + E T16, T17, T1d, T1e; + T16 = Ip[0]; + T17 = Im[0]; + T18 = T16 - T17; + T1h = T16 + T17; + T1d = Rm[0]; + T1e = Rp[0]; + T1f = T1d - T1e; + T1Z = T1e + T1d; + } + { + E T15, T20, TX, T11; + TX = W[14]; + T11 = W[15]; + T15 = FNMS(T11, T14, TX * T10); + T20 = FMA(TX, T14, T11 * T10); + T19 = T15 + T18; + T3h = T1Z - T20; + T21 = T1Z + T20; + T2Y = T18 - T15; + } + { + E T1i, T2r, T1n, T2q; + { + E T1c, T1g, T1j, T1l; + T1c = W[0]; + T1g = W[1]; + T1i = FNMS(T1g, T1h, T1c * T1f); + T2r = FMA(T1g, T1f, T1c * T1h); + T1j = W[16]; + T1l = W[17]; + T1n = FMA(T1j, T1k, T1l * T1m); + T2q = FNMS(T1l, T1k, T1j * T1m); + } + T1o = T1i - T1n; + T3d = T2r - T2q; + T2s = T2q + T2r; + T39 = T1n + T1i; + } + } + { + E TH, T1s, TL, T1q, TQ, T1x, TU, T1v; + { + E TF, TG, TJ, TK; + TF = Ip[WS(rs, 2)]; + TG = Im[WS(rs, 2)]; + TH = TF - TG; + T1s = TF + TG; + TJ = Rp[WS(rs, 2)]; + TK = Rm[WS(rs, 2)]; + TL = TJ + TK; + T1q = TJ - TK; + } + { + E TO, TP, TS, TT; + TO = Ip[WS(rs, 6)]; + TP = Im[WS(rs, 6)]; + TQ = TO - TP; + T1x = TO + TP; + TS = Rp[WS(rs, 6)]; + TT = Rm[WS(rs, 6)]; + TU = TS + TT; + T1v = TS - TT; + } + { + E TM, T22, TV, T23; + { + E TE, TI, TN, TR; + TE = W[6]; + TI = W[7]; + TM = FNMS(TI, TL, TE * TH); + T22 = FMA(TE, TL, TI * TH); + TN = W[22]; + TR = W[23]; + TV = FNMS(TR, TU, TN * TQ); + T23 = FMA(TN, TU, TR * TQ); + } + TW = TM + TV; + T3i = TM - TV; + T24 = T22 + T23; + T2Z = T22 - T23; + } + { + E T1t, T2n, T1y, T2o; + { + E T1p, T1r, T1u, T1w; + T1p = W[8]; + T1r = W[9]; + T1t = FMA(T1p, T1q, T1r * T1s); + T2n = FNMS(T1r, T1q, T1p * T1s); + T1u = W[24]; + T1w = W[25]; + T1y = FMA(T1u, T1v, T1w * T1x); + T2o = FNMS(T1w, T1v, T1u * T1x); + } + T1z = T1t + T1y; + T3c = T1y - T1t; + T2p = T2n + T2o; + T3a = T2n - T2o; + } + } + { + E T4, T1E, T8, T1C, Td, T1J, Th, T1H; + { + E T2, T3, T6, T7; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + T1E = T2 + T3; + T6 = Rp[WS(rs, 1)]; + T7 = Rm[WS(rs, 1)]; + T8 = T6 + T7; + T1C = T6 - T7; + } + { + E Tb, Tc, Tf, Tg; + Tb = Ip[WS(rs, 5)]; + Tc = Im[WS(rs, 5)]; + Td = Tb - Tc; + T1J = Tb + Tc; + Tf = Rp[WS(rs, 5)]; + Tg = Rm[WS(rs, 5)]; + Th = Tf + Tg; + T1H = Tf - Tg; + } + { + E T9, T26, Ti, T27; + { + E T1, T5, Ta, Te; + T1 = W[2]; + T5 = W[3]; + T9 = FNMS(T5, T8, T1 * T4); + T26 = FMA(T1, T8, T5 * T4); + Ta = W[18]; + Te = W[19]; + Ti = FNMS(Te, Th, Ta * Td); + T27 = FMA(Ta, Th, Te * Td); + } + Tj = T9 + Ti; + T2S = T26 - T27; + T28 = T26 + T27; + T2R = T9 - Ti; + } + { + E T1F, T2g, T1K, T2h; + { + E T1B, T1D, T1G, T1I; + T1B = W[4]; + T1D = W[5]; + T1F = FMA(T1B, T1C, T1D * T1E); + T2g = FNMS(T1D, T1C, T1B * T1E); + T1G = W[20]; + T1I = W[21]; + T1K = FMA(T1G, T1H, T1I * T1J); + T2h = FNMS(T1I, T1H, T1G * T1J); + } + T1L = T1F + T1K; + T36 = T2g - T2h; + T2i = T2g + T2h; + T32 = T1K - T1F; + } + } + { + E Tn, T1P, Tr, T1N, Tw, T1U, TA, T1S; + { + E Tl, Tm, Tp, Tq; + Tl = Ip[WS(rs, 7)]; + Tm = Im[WS(rs, 7)]; + Tn = Tl - Tm; + T1P = Tl + Tm; + Tp = Rp[WS(rs, 7)]; + Tq = Rm[WS(rs, 7)]; + Tr = Tp + Tq; + T1N = Tp - Tq; + } + { + E Tu, Tv, Ty, Tz; + Tu = Ip[WS(rs, 3)]; + Tv = Im[WS(rs, 3)]; + Tw = Tu - Tv; + T1U = Tu + Tv; + Ty = Rp[WS(rs, 3)]; + Tz = Rm[WS(rs, 3)]; + TA = Ty + Tz; + T1S = Ty - Tz; + } + { + E Ts, T29, TB, T2a; + { + E Tk, To, Tt, Tx; + Tk = W[26]; + To = W[27]; + Ts = FNMS(To, Tr, Tk * Tn); + T29 = FMA(Tk, Tr, To * Tn); + Tt = W[10]; + Tx = W[11]; + TB = FNMS(Tx, TA, Tt * Tw); + T2a = FMA(Tt, TA, Tx * Tw); + } + TC = Ts + TB; + T2V = Ts - TB; + T2b = T29 + T2a; + T2U = T29 - T2a; + } + { + E T1Q, T2j, T1V, T2k; + { + E T1M, T1O, T1R, T1T; + T1M = W[28]; + T1O = W[29]; + T1Q = FMA(T1M, T1N, T1O * T1P); + T2j = FNMS(T1O, T1N, T1M * T1P); + T1R = W[12]; + T1T = W[13]; + T1V = FMA(T1R, T1S, T1T * T1U); + T2k = FNMS(T1T, T1S, T1R * T1U); + } + T1W = T1Q + T1V; + T35 = T1V - T1Q; + T2l = T2j + T2k; + T33 = T2j - T2k; + } + } + { + E T1b, T2f, T2u, T2w, T1Y, T2e, T2d, T2v; + { + E TD, T1a, T2m, T2t; + TD = Tj + TC; + T1a = TW + T19; + T1b = TD + T1a; + T2f = T1a - TD; + T2m = T2i + T2l; + T2t = T2p + T2s; + T2u = T2m - T2t; + T2w = T2m + T2t; + } + { + E T1A, T1X, T25, T2c; + T1A = T1o - T1z; + T1X = T1L + T1W; + T1Y = T1A - T1X; + T2e = T1X + T1A; + T25 = T21 + T24; + T2c = T28 + T2b; + T2d = T25 - T2c; + T2v = T25 + T2c; + } + Ip[0] = KP500000000 * (T1b + T1Y); + Rp[0] = KP500000000 * (T2v + T2w); + Im[WS(rs, 7)] = KP500000000 * (T1Y - T1b); + Rm[WS(rs, 7)] = KP500000000 * (T2v - T2w); + Rm[WS(rs, 3)] = KP500000000 * (T2d - T2e); + Im[WS(rs, 3)] = KP500000000 * (T2u - T2f); + Rp[WS(rs, 4)] = KP500000000 * (T2d + T2e); + Ip[WS(rs, 4)] = KP500000000 * (T2f + T2u); + } + { + E T2z, T2L, T2J, T2P, T2C, T2M, T2F, T2N; + { + E T2x, T2y, T2H, T2I; + T2x = T2b - T28; + T2y = T19 - TW; + T2z = KP500000000 * (T2x + T2y); + T2L = KP500000000 * (T2y - T2x); + T2H = T21 - T24; + T2I = Tj - TC; + T2J = KP500000000 * (T2H - T2I); + T2P = KP500000000 * (T2H + T2I); + } + { + E T2A, T2B, T2D, T2E; + T2A = T2l - T2i; + T2B = T1L - T1W; + T2C = T2A + T2B; + T2M = T2A - T2B; + T2D = T1z + T1o; + T2E = T2s - T2p; + T2F = T2D - T2E; + T2N = T2D + T2E; + } + { + E T2G, T2Q, T2K, T2O; + T2G = KP353553390 * (T2C + T2F); + Ip[WS(rs, 2)] = T2z + T2G; + Im[WS(rs, 5)] = T2G - T2z; + T2Q = KP353553390 * (T2M + T2N); + Rm[WS(rs, 5)] = T2P - T2Q; + Rp[WS(rs, 2)] = T2P + T2Q; + T2K = KP353553390 * (T2F - T2C); + Rm[WS(rs, 1)] = T2J - T2K; + Rp[WS(rs, 6)] = T2J + T2K; + T2O = KP353553390 * (T2M - T2N); + Ip[WS(rs, 6)] = T2L + T2O; + Im[WS(rs, 1)] = T2O - T2L; + } + } + { + E T30, T3w, T3F, T3j, T2X, T3G, T3D, T3L, T3m, T3v, T38, T3q, T3A, T3K, T3f; + E T3r; + { + E T2T, T2W, T34, T37; + T30 = KP500000000 * (T2Y - T2Z); + T3w = KP500000000 * (T2Z + T2Y); + T3F = KP500000000 * (T3h - T3i); + T3j = KP500000000 * (T3h + T3i); + T2T = T2R - T2S; + T2W = T2U + T2V; + T2X = KP353553390 * (T2T + T2W); + T3G = KP353553390 * (T2T - T2W); + { + E T3B, T3C, T3k, T3l; + T3B = T3a + T39; + T3C = T3d - T3c; + T3D = FNMS(KP461939766, T3C, KP191341716 * T3B); + T3L = FMA(KP461939766, T3B, KP191341716 * T3C); + T3k = T2S + T2R; + T3l = T2U - T2V; + T3m = KP353553390 * (T3k + T3l); + T3v = KP353553390 * (T3l - T3k); + } + T34 = T32 + T33; + T37 = T35 - T36; + T38 = FMA(KP191341716, T34, KP461939766 * T37); + T3q = FNMS(KP191341716, T37, KP461939766 * T34); + { + E T3y, T3z, T3b, T3e; + T3y = T33 - T32; + T3z = T36 + T35; + T3A = FMA(KP461939766, T3y, KP191341716 * T3z); + T3K = FNMS(KP461939766, T3z, KP191341716 * T3y); + T3b = T39 - T3a; + T3e = T3c + T3d; + T3f = FNMS(KP191341716, T3e, KP461939766 * T3b); + T3r = FMA(KP191341716, T3b, KP461939766 * T3e); + } + } + { + E T31, T3g, T3t, T3u; + T31 = T2X + T30; + T3g = T38 + T3f; + Ip[WS(rs, 1)] = T31 + T3g; + Im[WS(rs, 6)] = T3g - T31; + T3t = T3j + T3m; + T3u = T3q + T3r; + Rm[WS(rs, 6)] = T3t - T3u; + Rp[WS(rs, 1)] = T3t + T3u; + } + { + E T3n, T3o, T3p, T3s; + T3n = T3j - T3m; + T3o = T3f - T38; + Rm[WS(rs, 2)] = T3n - T3o; + Rp[WS(rs, 5)] = T3n + T3o; + T3p = T30 - T2X; + T3s = T3q - T3r; + Ip[WS(rs, 5)] = T3p + T3s; + Im[WS(rs, 2)] = T3s - T3p; + } + { + E T3x, T3E, T3N, T3O; + T3x = T3v + T3w; + T3E = T3A + T3D; + Ip[WS(rs, 3)] = T3x + T3E; + Im[WS(rs, 4)] = T3E - T3x; + T3N = T3F + T3G; + T3O = T3K + T3L; + Rm[WS(rs, 4)] = T3N - T3O; + Rp[WS(rs, 3)] = T3N + T3O; + } + { + E T3H, T3I, T3J, T3M; + T3H = T3F - T3G; + T3I = T3D - T3A; + Rm[0] = T3H - T3I; + Rp[WS(rs, 7)] = T3H + T3I; + T3J = T3w - T3v; + T3M = T3K - T3L; + Ip[WS(rs, 7)] = T3J + T3M; + Im[0] = T3M - T3J; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 16, "hc2cfdft_16", twinstr, &GENUS, {168, 62, 38, 0} }; + +void X(codelet_hc2cfdft_16) (planner *p) { + X(khc2c_register) (p, hc2cfdft_16, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_2.c new file mode 100644 index 000000000..6b7261d71 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_2.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -dit -name hc2cfdft_2 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 10 FP additions, 8 FP multiplications, + * (or, 8 additions, 6 multiplications, 2 fused multiply/add), + * 16 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T3, Ta, Tc, T9, Td, T4, T8, Tb, Te; + { + E T1, T2, T5, T6, T7; + T1 = Ip[0]; + T2 = Im[0]; + T3 = T1 - T2; + Ta = T1 + T2; + T5 = Rm[0]; + T6 = Rp[0]; + T7 = T5 - T6; + Tc = T6 + T5; + T9 = W[1]; + Td = T9 * T7; + T4 = W[0]; + T8 = T4 * T7; + } + Tb = FNMS(T9, Ta, T8); + Ip[0] = KP500000000 * (T3 + Tb); + Im[0] = KP500000000 * (Tb - T3); + Te = FMA(T4, Ta, Td); + Rm[0] = KP500000000 * (Tc - Te); + Rp[0] = KP500000000 * (Tc + Te); + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cfdft_2", twinstr, &GENUS, {8, 6, 2, 0} }; + +void X(codelet_hc2cfdft_2) (planner *p) { + X(khc2c_register) (p, hc2cfdft_2, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 2 -dit -name hc2cfdft_2 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 10 FP additions, 8 FP multiplications, + * (or, 8 additions, 6 multiplications, 2 fused multiply/add), + * 10 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 2, MAKE_VOLATILE_STRIDE(8, rs)) { + E T3, T9, T7, Tb; + { + E T1, T2, T5, T6; + T1 = Ip[0]; + T2 = Im[0]; + T3 = T1 - T2; + T9 = T1 + T2; + T5 = Rm[0]; + T6 = Rp[0]; + T7 = T5 - T6; + Tb = T6 + T5; + } + { + E Ta, Tc, T4, T8; + T4 = W[0]; + T8 = W[1]; + Ta = FNMS(T8, T9, T4 * T7); + Tc = FMA(T8, T7, T4 * T9); + Ip[0] = KP500000000 * (T3 + Ta); + Rp[0] = KP500000000 * (Tb + Tc); + Im[0] = KP500000000 * (Ta - T3); + Rm[0] = KP500000000 * (Tb - Tc); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 2, "hc2cfdft_2", twinstr, &GENUS, {8, 6, 2, 0} }; + +void X(codelet_hc2cfdft_2) (planner *p) { + X(khc2c_register) (p, hc2cfdft_2, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_20.c new file mode 100644 index 000000000..1ac6687d5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_20.c @@ -0,0 +1,1155 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:13 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -dit -name hc2cfdft_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 286 FP additions, 188 FP multiplications, + * (or, 176 additions, 78 multiplications, 110 fused multiply/add), + * 153 stack variables, 5 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T2E, T4W, T3v, T4k, T2M, T4V, T3w, T4j, T2p, T2T, T5a, T5A, T3o, T3D, T4b; + E T4B, T1Y, T2S, T57, T5z, T3h, T3C, T44, T4A, TH, T2P, T50, T5x, T32, T3z; + E T3P, T4D, T1o, T2Q, T53, T5w, T39, T3A, T3W, T4E; + { + E T9, T1V, Tu, T2w, T1, T5, T6, T2Y, T1R, T1T, T1U, T40, T10, T2F, TE; + E T2C, T1y, T2m, T4g, TX, T33, TS, TW, Tw, TA, TB, T3L, T2y, T2A, T2B; + E T3t, T1q, T1u, T1v, T3d, T2i, T2k, T2l, T48, Tm, Tq, Tr, T3J, T2s, T2u; + E T2v, T3r, T1g, T20, T1l, T23, T1h, T3S, T21, T3k, TL, T2H, TQ, T2K, TM; + E T35, T2I, T4h, T1I, T1D, T2g, T2f, T46, T2c, T2e, T1E, T3b, T16, T1b, T29; + E T28, T3i, T25, T27, T17, T3Q, Tj, Te, T1P, T1O, T3Y, T1L, T1N, Tf, T2W; + E T2x, T2D; + { + E T7, T8, Ts, Tt; + T7 = Rp[WS(rs, 9)]; + T8 = Rm[WS(rs, 9)]; + T9 = T7 - T8; + T1V = T7 + T8; + Ts = Rp[WS(rs, 2)]; + Tt = Rm[WS(rs, 2)]; + Tu = Ts + Tt; + T2w = Ts - Tt; + { + E T4, T1S, T2, T3; + T2 = Ip[WS(rs, 9)]; + T3 = Im[WS(rs, 9)]; + T4 = T2 + T3; + T1S = T2 - T3; + T1 = W[36]; + T5 = T1 * T4; + T6 = W[37]; + T2Y = T6 * T4; + T1R = W[34]; + T1T = T1R * T1S; + T1U = W[35]; + T40 = T1U * T1S; + } + } + { + E TY, TZ, TC, TD; + TY = Ip[0]; + TZ = Im[0]; + T10 = TY + TZ; + T2F = TY - TZ; + TC = Rp[WS(rs, 7)]; + TD = Rm[WS(rs, 7)]; + TE = TC + TD; + T2C = TC - TD; + } + { + E T1w, T1x, TT, TU, TV; + T1w = Rp[WS(rs, 1)]; + T1x = Rm[WS(rs, 1)]; + T1y = T1w - T1x; + T2m = T1w + T1x; + TT = Rm[0]; + TU = Rp[0]; + TV = TT - TU; + T4g = TU + TT; + TX = W[0]; + T33 = TX * TV; + TS = W[1]; + TW = TS * TV; + } + { + E T1d, T1Z, TI, T2G; + { + E Tz, T2z, Tx, Ty; + Tx = Ip[WS(rs, 7)]; + Ty = Im[WS(rs, 7)]; + Tz = Tx - Ty; + T2z = Tx + Ty; + Tw = W[26]; + TA = Tw * Tz; + TB = W[27]; + T3L = TB * Tz; + T2y = W[28]; + T2A = T2y * T2z; + T2B = W[29]; + T3t = T2B * T2z; + } + { + E T1t, T2j, T1r, T1s; + T1r = Ip[WS(rs, 1)]; + T1s = Im[WS(rs, 1)]; + T1t = T1r + T1s; + T2j = T1r - T1s; + T1q = W[4]; + T1u = T1q * T1t; + T1v = W[5]; + T3d = T1v * T1t; + T2i = W[2]; + T2k = T2i * T2j; + T2l = W[3]; + T48 = T2l * T2j; + } + { + E Tp, T2t, Tn, To; + Tn = Ip[WS(rs, 2)]; + To = Im[WS(rs, 2)]; + Tp = Tn - To; + T2t = Tn + To; + Tm = W[6]; + Tq = Tm * Tp; + Tr = W[7]; + T3J = Tr * Tp; + T2s = W[8]; + T2u = T2s * T2t; + T2v = W[9]; + T3r = T2v * T2t; + } + { + E T1e, T1f, T1j, T1k; + T1e = Ip[WS(rs, 3)]; + T1f = Im[WS(rs, 3)]; + T1g = T1e - T1f; + T20 = T1e + T1f; + T1j = Rp[WS(rs, 3)]; + T1k = Rm[WS(rs, 3)]; + T1l = T1j + T1k; + T23 = T1j - T1k; + } + T1d = W[10]; + T1h = T1d * T1g; + T3S = T1d * T1l; + T1Z = W[12]; + T21 = T1Z * T20; + T3k = T1Z * T23; + { + E TJ, TK, TO, TP; + TJ = Ip[WS(rs, 5)]; + TK = Im[WS(rs, 5)]; + TL = TJ + TK; + T2H = TJ - TK; + TO = Rp[WS(rs, 5)]; + TP = Rm[WS(rs, 5)]; + TQ = TO - TP; + T2K = TO + TP; + } + TI = W[20]; + TM = TI * TL; + T35 = TI * TQ; + T2G = W[18]; + T2I = T2G * T2H; + T4h = T2G * T2K; + { + E T1G, T1H, T2d, T1B, T1C, T1A; + T1G = Rm[WS(rs, 6)]; + T1H = Rp[WS(rs, 6)]; + T1I = T1G - T1H; + T1B = Ip[WS(rs, 6)]; + T1C = Im[WS(rs, 6)]; + T1D = T1B + T1C; + T2d = T1B - T1C; + T2g = T1H + T1G; + T2f = W[23]; + T46 = T2f * T2d; + T2c = W[22]; + T2e = T2c * T2d; + T1A = W[24]; + T1E = T1A * T1D; + T3b = T1A * T1I; + } + { + E T14, T15, T26, T19, T1a, T13; + T14 = Ip[WS(rs, 8)]; + T15 = Im[WS(rs, 8)]; + T16 = T14 - T15; + T19 = Rp[WS(rs, 8)]; + T1a = Rm[WS(rs, 8)]; + T1b = T19 + T1a; + T26 = T1a - T19; + T29 = T14 + T15; + T28 = W[32]; + T3i = T28 * T26; + T25 = W[33]; + T27 = T25 * T26; + T13 = W[30]; + T17 = T13 * T16; + T3Q = T13 * T1b; + } + { + E Th, Ti, T1M, Tc, Td, Tb; + Th = Rm[WS(rs, 4)]; + Ti = Rp[WS(rs, 4)]; + Tj = Th - Ti; + Tc = Ip[WS(rs, 4)]; + Td = Im[WS(rs, 4)]; + Te = Tc + Td; + T1M = Tc - Td; + T1P = Ti + Th; + T1O = W[15]; + T3Y = T1O * T1M; + T1L = W[14]; + T1N = T1L * T1M; + Tb = W[16]; + Tf = Tb * Te; + T2W = Tb * Tj; + } + } + T2x = FNMS(T2v, T2w, T2u); + T2D = FNMS(T2B, T2C, T2A); + T2E = T2x - T2D; + T4W = T2x + T2D; + { + E T3s, T3u, T2L, T4i, T2J; + T3s = FMA(T2s, T2w, T3r); + T3u = FMA(T2y, T2C, T3t); + T3v = T3s + T3u; + T4k = T3u - T3s; + T2J = W[19]; + T2L = FNMS(T2J, T2K, T2I); + T4i = FMA(T2J, T2H, T4h); + T2M = T2F - T2L; + T4V = T4g + T4i; + T3w = T2L + T2F; + T4j = T4g - T4i; + } + { + E T2a, T3j, T24, T3l, T2o, T3n, T4a, T59, T22; + T2a = FMA(T28, T29, T27); + T3j = FNMS(T25, T29, T3i); + T22 = W[13]; + T24 = FNMS(T22, T23, T21); + T3l = FMA(T22, T20, T3k); + { + E T2h, T2n, T47, T49; + T2h = FNMS(T2f, T2g, T2e); + T2n = FNMS(T2l, T2m, T2k); + T2o = T2h - T2n; + T3n = T2h + T2n; + T47 = FMA(T2c, T2g, T46); + T49 = FMA(T2i, T2m, T48); + T4a = T47 - T49; + T59 = T47 + T49; + } + { + E T2b, T58, T3m, T45; + T2b = T24 - T2a; + T2p = T2b - T2o; + T2T = T2b + T2o; + T58 = T2a + T24; + T5a = T58 + T59; + T5A = T59 - T58; + T3m = T3j - T3l; + T3o = T3m - T3n; + T3D = T3m + T3n; + T45 = T3j + T3l; + T4b = T45 + T4a; + T4B = T4a - T45; + } + } + { + E T1z, T3e, T1J, T3c, T1X, T3g, T42, T55, T1F; + T1z = FNMS(T1v, T1y, T1u); + T3e = FMA(T1q, T1y, T3d); + T1F = W[25]; + T1J = FMA(T1F, T1I, T1E); + T3c = FNMS(T1F, T1D, T3b); + { + E T1Q, T1W, T3Z, T41; + T1Q = FNMS(T1O, T1P, T1N); + T1W = FNMS(T1U, T1V, T1T); + T1X = T1Q - T1W; + T3g = T1Q + T1W; + T3Z = FMA(T1L, T1P, T3Y); + T41 = FMA(T1R, T1V, T40); + T42 = T3Z - T41; + T55 = T3Z + T41; + } + { + E T1K, T56, T3f, T43; + T1K = T1z - T1J; + T1Y = T1K - T1X; + T2S = T1X + T1K; + T56 = T1J + T1z; + T57 = T55 + T56; + T5z = T55 - T56; + T3f = T3c - T3e; + T3h = T3f - T3g; + T3C = T3g + T3f; + T43 = T3c + T3e; + T44 = T42 + T43; + T4A = T42 - T43; + } + } + { + E Ta, T2Z, Tk, T2X, TG, T31, T3N, T4Y, Tg; + Ta = FNMS(T6, T9, T5); + T2Z = FMA(T1, T9, T2Y); + Tg = W[17]; + Tk = FMA(Tg, Tj, Tf); + T2X = FNMS(Tg, Te, T2W); + { + E Tv, TF, T3K, T3M; + Tv = FNMS(Tr, Tu, Tq); + TF = FNMS(TB, TE, TA); + TG = Tv - TF; + T31 = Tv + TF; + T3K = FMA(Tm, Tu, T3J); + T3M = FMA(Tw, TE, T3L); + T3N = T3K - T3M; + T4Y = T3K + T3M; + } + { + E Tl, T4Z, T30, T3O; + Tl = Ta - Tk; + TH = Tl - TG; + T2P = TG + Tl; + T4Z = Tk + Ta; + T50 = T4Y + T4Z; + T5x = T4Y - T4Z; + T30 = T2X - T2Z; + T32 = T30 - T31; + T3z = T31 + T30; + T3O = T2X + T2Z; + T3P = T3N + T3O; + T4D = T3N - T3O; + } + } + { + E T11, T34, TR, T36, T1c, T3R, T1m, T3T, TN, T18, T1i; + T11 = FMA(TX, T10, TW); + T34 = FNMS(TS, T10, T33); + TN = W[21]; + TR = FNMS(TN, TQ, TM); + T36 = FMA(TN, TL, T35); + T18 = W[31]; + T1c = FNMS(T18, T1b, T17); + T3R = FMA(T18, T16, T3Q); + T1i = W[11]; + T1m = FNMS(T1i, T1l, T1h); + T3T = FMA(T1i, T1g, T3S); + { + E T12, T1n, T51, T52; + T12 = TR - T11; + T1n = T1c - T1m; + T1o = T12 - T1n; + T2Q = T1n + T12; + T51 = T3R + T3T; + T52 = TR + T11; + T53 = T51 + T52; + T5w = T51 - T52; + } + { + E T37, T38, T3U, T3V; + T37 = T34 - T36; + T38 = T1c + T1m; + T39 = T37 - T38; + T3A = T38 + T37; + T3U = T3R - T3T; + T3V = T36 + T34; + T3W = T3U + T3V; + T4E = T3U - T3V; + } + } + } + { + E T4G, T4I, T2N, T2r, T4x, T4y, T4H, T4z; + { + E T4C, T4F, T1p, T2q; + T4C = T4A - T4B; + T4F = T4D - T4E; + T4G = FNMS(KP618033988, T4F, T4C); + T4I = FMA(KP618033988, T4C, T4F); + T2N = T2E + T2M; + T1p = TH + T1o; + T2q = T1Y + T2p; + T2r = T1p + T2q; + T4x = FMA(KP250000000, T2r, T2N); + T4y = T1p - T2q; + } + Im[WS(rs, 4)] = KP500000000 * (T2r - T2N); + T4H = FNMS(KP559016994, T4y, T4x); + Im[0] = -(KP500000000 * (FMA(KP951056516, T4I, T4H))); + Im[WS(rs, 8)] = -(KP500000000 * (FNMS(KP951056516, T4I, T4H))); + T4z = FMA(KP559016994, T4y, T4x); + Ip[WS(rs, 3)] = KP500000000 * (FNMS(KP951056516, T4G, T4z)); + Ip[WS(rs, 7)] = KP500000000 * (FMA(KP951056516, T4G, T4z)); + } + { + E T4S, T4U, T4J, T4M, T4N, T4O, T4T, T4P; + { + E T4Q, T4R, T4K, T4L; + T4Q = T2p - T1Y; + T4R = T1o - TH; + T4S = FNMS(KP618033988, T4R, T4Q); + T4U = FMA(KP618033988, T4Q, T4R); + T4J = T4j - T4k; + T4K = T4D + T4E; + T4L = T4A + T4B; + T4M = T4K + T4L; + T4N = FNMS(KP250000000, T4M, T4J); + T4O = T4K - T4L; + } + Rm[WS(rs, 4)] = KP500000000 * (T4J + T4M); + T4T = FMA(KP559016994, T4O, T4N); + Rm[WS(rs, 8)] = KP500000000 * (FMA(KP951056516, T4U, T4T)); + Rm[0] = KP500000000 * (FNMS(KP951056516, T4U, T4T)); + T4P = FNMS(KP559016994, T4O, T4N); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T4S, T4P)); + Rp[WS(rs, 7)] = KP500000000 * (FNMS(KP951056516, T4S, T4P)); + } + { + E T4d, T4f, T2O, T2V, T3G, T3H, T4e, T3I; + { + E T3X, T4c, T2R, T2U; + T3X = T3P - T3W; + T4c = T44 - T4b; + T4d = FMA(KP618033988, T4c, T3X); + T4f = FNMS(KP618033988, T3X, T4c); + T2O = T2M - T2E; + T2R = T2P + T2Q; + T2U = T2S + T2T; + T2V = T2R + T2U; + T3G = FNMS(KP250000000, T2V, T2O); + T3H = T2R - T2U; + } + Ip[WS(rs, 5)] = KP500000000 * (T2O + T2V); + T4e = FNMS(KP559016994, T3H, T3G); + Im[WS(rs, 2)] = -(KP500000000 * (FMA(KP951056516, T4f, T4e))); + Im[WS(rs, 6)] = -(KP500000000 * (FNMS(KP951056516, T4f, T4e))); + T3I = FMA(KP559016994, T3H, T3G); + Ip[WS(rs, 1)] = KP500000000 * (FNMS(KP951056516, T4d, T3I)); + Ip[WS(rs, 9)] = KP500000000 * (FMA(KP951056516, T4d, T3I)); + } + { + E T4u, T4w, T4l, T4o, T4p, T4q, T4v, T4r; + { + E T4s, T4t, T4m, T4n; + T4s = T2P - T2Q; + T4t = T2S - T2T; + T4u = FMA(KP618033988, T4t, T4s); + T4w = FNMS(KP618033988, T4s, T4t); + T4l = T4j + T4k; + T4m = T3P + T3W; + T4n = T44 + T4b; + T4o = T4m + T4n; + T4p = FNMS(KP250000000, T4o, T4l); + T4q = T4m - T4n; + } + Rp[WS(rs, 5)] = KP500000000 * (T4l + T4o); + T4v = FNMS(KP559016994, T4q, T4p); + Rm[WS(rs, 6)] = KP500000000 * (FMA(KP951056516, T4w, T4v)); + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP951056516, T4w, T4v)); + T4r = FMA(KP559016994, T4q, T4p); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T4u, T4r)); + Rp[WS(rs, 9)] = KP500000000 * (FNMS(KP951056516, T4u, T4r)); + } + { + E T5C, T5E, T3x, T3q, T5t, T5u, T5D, T5v; + { + E T5y, T5B, T3a, T3p; + T5y = T5w - T5x; + T5B = T5z - T5A; + T5C = FNMS(KP618033988, T5B, T5y); + T5E = FMA(KP618033988, T5y, T5B); + T3x = T3v + T3w; + T3a = T32 + T39; + T3p = T3h + T3o; + T3q = T3a + T3p; + T5t = FMA(KP250000000, T3q, T3x); + T5u = T3p - T3a; + } + Im[WS(rs, 9)] = KP500000000 * (T3q - T3x); + T5D = FNMS(KP559016994, T5u, T5t); + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP951056516, T5E, T5D)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP951056516, T5E, T5D))); + T5v = FMA(KP559016994, T5u, T5t); + Ip[WS(rs, 6)] = KP500000000 * (FMA(KP951056516, T5C, T5v)); + Im[WS(rs, 5)] = -(KP500000000 * (FNMS(KP951056516, T5C, T5v))); + } + { + E T5O, T5Q, T5F, T5I, T5J, T5K, T5P, T5L; + { + E T5M, T5N, T5G, T5H; + T5M = T3o - T3h; + T5N = T39 - T32; + T5O = FNMS(KP618033988, T5N, T5M); + T5Q = FMA(KP618033988, T5M, T5N); + T5F = T4V - T4W; + T5G = T5x + T5w; + T5H = T5z + T5A; + T5I = T5G + T5H; + T5J = FNMS(KP250000000, T5I, T5F); + T5K = T5G - T5H; + } + Rm[WS(rs, 9)] = KP500000000 * (T5F + T5I); + T5P = FMA(KP559016994, T5K, T5J); + Rp[WS(rs, 6)] = KP500000000 * (FMA(KP951056516, T5Q, T5P)); + Rm[WS(rs, 5)] = KP500000000 * (FNMS(KP951056516, T5Q, T5P)); + T5L = FNMS(KP559016994, T5K, T5J); + Rp[WS(rs, 2)] = KP500000000 * (FNMS(KP951056516, T5O, T5L)); + Rm[WS(rs, 1)] = KP500000000 * (FMA(KP951056516, T5O, T5L)); + } + { + E T5q, T5s, T3y, T3F, T5l, T5m, T5r, T5n; + { + E T5o, T5p, T3B, T3E; + T5o = T50 - T53; + T5p = T5a - T57; + T5q = FNMS(KP618033988, T5p, T5o); + T5s = FMA(KP618033988, T5o, T5p); + T3y = T3w - T3v; + T3B = T3z + T3A; + T3E = T3C + T3D; + T3F = T3B + T3E; + T5l = FNMS(KP250000000, T3F, T3y); + T5m = T3B - T3E; + } + Ip[0] = KP500000000 * (T3y + T3F); + T5r = FNMS(KP559016994, T5m, T5l); + Ip[WS(rs, 8)] = KP500000000 * (FMA(KP951056516, T5s, T5r)); + Im[WS(rs, 7)] = -(KP500000000 * (FNMS(KP951056516, T5s, T5r))); + T5n = FMA(KP559016994, T5m, T5l); + Ip[WS(rs, 4)] = KP500000000 * (FMA(KP951056516, T5q, T5n)); + Im[WS(rs, 3)] = -(KP500000000 * (FNMS(KP951056516, T5q, T5n))); + } + { + E T5i, T5k, T4X, T5c, T5d, T5e, T5j, T5f; + { + E T5g, T5h, T54, T5b; + T5g = T3z - T3A; + T5h = T3C - T3D; + T5i = FMA(KP618033988, T5h, T5g); + T5k = FNMS(KP618033988, T5g, T5h); + T4X = T4V + T4W; + T54 = T50 + T53; + T5b = T57 + T5a; + T5c = T54 + T5b; + T5d = FNMS(KP250000000, T5c, T4X); + T5e = T54 - T5b; + } + Rp[0] = KP500000000 * (T4X + T5c); + T5j = FNMS(KP559016994, T5e, T5d); + Rp[WS(rs, 8)] = KP500000000 * (FMA(KP951056516, T5k, T5j)); + Rm[WS(rs, 7)] = KP500000000 * (FNMS(KP951056516, T5k, T5j)); + T5f = FMA(KP559016994, T5e, T5d); + Rp[WS(rs, 4)] = KP500000000 * (FNMS(KP951056516, T5i, T5f)); + Rm[WS(rs, 3)] = KP500000000 * (FMA(KP951056516, T5i, T5f)); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cfdft_20", twinstr, &GENUS, {176, 78, 110, 0} }; + +void X(codelet_hc2cfdft_20) (planner *p) { + X(khc2c_register) (p, hc2cfdft_20, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 20 -dit -name hc2cfdft_20 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 286 FP additions, 140 FP multiplications, + * (or, 224 additions, 78 multiplications, 62 fused multiply/add), + * 98 stack variables, 5 constants, and 80 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP125000000, +0.125000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP279508497, +0.279508497187473712051146708591409529430077295); + DK(KP293892626, +0.293892626146236564584352977319536384298826219); + DK(KP475528258, +0.475528258147576786058219666689691071702849317); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 38, MAKE_VOLATILE_STRIDE(80, rs)) { + E T12, T2w, T4o, T4V, T2H, T3a, T4y, T4Y, T1z, T2v, T25, T2y, T2s, T2z, T4v; + E T4X, T4r, T4U, T3A, T3Z, T2X, T37, T3k, T41, T2M, T39, T3v, T3Y, T2S, T36; + E T3p, T42, Td, T4G, T33, T3N, Tw, T4H, T32, T3O; + { + E T3, T3L, T1x, T2V, Th, Tl, TC, T3g, Tq, Tu, TH, T3h, T7, Tb, T1q; + E T2U, TR, T2P, T1F, T3r, T23, T2K, T2f, T3y, T1k, T3m, T2q, T2E, T10, T2Q; + E T1K, T3s, T1U, T2J, T2a, T3x, T1b, T3l, T2l, T2D; + { + E T1, T2, T1s, T1u, T1v, T1w, T1r, T1t; + T1 = Ip[0]; + T2 = Im[0]; + T1s = T1 + T2; + T1u = Rp[0]; + T1v = Rm[0]; + T1w = T1u - T1v; + T3 = T1 - T2; + T3L = T1u + T1v; + T1r = W[0]; + T1t = W[1]; + T1x = FNMS(T1t, T1w, T1r * T1s); + T2V = FMA(T1r, T1w, T1t * T1s); + } + { + E Tf, Tg, Tz, Tj, Tk, TB, Ty, TA; + Tf = Ip[WS(rs, 2)]; + Tg = Im[WS(rs, 2)]; + Tz = Tf - Tg; + Tj = Rp[WS(rs, 2)]; + Tk = Rm[WS(rs, 2)]; + TB = Tj + Tk; + Th = Tf + Tg; + Tl = Tj - Tk; + Ty = W[6]; + TA = W[7]; + TC = FNMS(TA, TB, Ty * Tz); + T3g = FMA(TA, Tz, Ty * TB); + } + { + E To, Tp, TE, Ts, Tt, TG, TD, TF; + To = Ip[WS(rs, 7)]; + Tp = Im[WS(rs, 7)]; + TE = To - Tp; + Ts = Rp[WS(rs, 7)]; + Tt = Rm[WS(rs, 7)]; + TG = Ts + Tt; + Tq = To + Tp; + Tu = Ts - Tt; + TD = W[26]; + TF = W[27]; + TH = FNMS(TF, TG, TD * TE); + T3h = FMA(TF, TE, TD * TG); + } + { + E T5, T6, T1n, T9, Ta, T1p, T1m, T1o; + T5 = Ip[WS(rs, 5)]; + T6 = Im[WS(rs, 5)]; + T1n = T5 + T6; + T9 = Rp[WS(rs, 5)]; + Ta = Rm[WS(rs, 5)]; + T1p = T9 - Ta; + T7 = T5 - T6; + Tb = T9 + Ta; + T1m = W[20]; + T1o = W[21]; + T1q = FNMS(T1o, T1p, T1m * T1n); + T2U = FMA(T1m, T1p, T1o * T1n); + } + { + E TM, T1C, TQ, T1E; + { + E TK, TL, TO, TP; + TK = Ip[WS(rs, 4)]; + TL = Im[WS(rs, 4)]; + TM = TK + TL; + T1C = TK - TL; + TO = Rp[WS(rs, 4)]; + TP = Rm[WS(rs, 4)]; + TQ = TO - TP; + T1E = TO + TP; + } + { + E TJ, TN, T1B, T1D; + TJ = W[16]; + TN = W[17]; + TR = FNMS(TN, TQ, TJ * TM); + T2P = FMA(TN, TM, TJ * TQ); + T1B = W[14]; + T1D = W[15]; + T1F = FNMS(T1D, T1E, T1B * T1C); + T3r = FMA(T1D, T1C, T1B * T1E); + } + } + { + E T1Y, T2c, T22, T2e; + { + E T1W, T1X, T20, T21; + T1W = Ip[WS(rs, 1)]; + T1X = Im[WS(rs, 1)]; + T1Y = T1W + T1X; + T2c = T1W - T1X; + T20 = Rp[WS(rs, 1)]; + T21 = Rm[WS(rs, 1)]; + T22 = T20 - T21; + T2e = T20 + T21; + } + { + E T1V, T1Z, T2b, T2d; + T1V = W[4]; + T1Z = W[5]; + T23 = FNMS(T1Z, T22, T1V * T1Y); + T2K = FMA(T1Z, T1Y, T1V * T22); + T2b = W[2]; + T2d = W[3]; + T2f = FNMS(T2d, T2e, T2b * T2c); + T3y = FMA(T2d, T2c, T2b * T2e); + } + } + { + E T1f, T2n, T1j, T2p; + { + E T1d, T1e, T1h, T1i; + T1d = Ip[WS(rs, 3)]; + T1e = Im[WS(rs, 3)]; + T1f = T1d - T1e; + T2n = T1d + T1e; + T1h = Rp[WS(rs, 3)]; + T1i = Rm[WS(rs, 3)]; + T1j = T1h + T1i; + T2p = T1h - T1i; + } + { + E T1c, T1g, T2m, T2o; + T1c = W[10]; + T1g = W[11]; + T1k = FNMS(T1g, T1j, T1c * T1f); + T3m = FMA(T1c, T1j, T1g * T1f); + T2m = W[12]; + T2o = W[13]; + T2q = FNMS(T2o, T2p, T2m * T2n); + T2E = FMA(T2m, T2p, T2o * T2n); + } + } + { + E TV, T1H, TZ, T1J; + { + E TT, TU, TX, TY; + TT = Ip[WS(rs, 9)]; + TU = Im[WS(rs, 9)]; + TV = TT + TU; + T1H = TT - TU; + TX = Rp[WS(rs, 9)]; + TY = Rm[WS(rs, 9)]; + TZ = TX - TY; + T1J = TX + TY; + } + { + E TS, TW, T1G, T1I; + TS = W[36]; + TW = W[37]; + T10 = FNMS(TW, TZ, TS * TV); + T2Q = FMA(TW, TV, TS * TZ); + T1G = W[34]; + T1I = W[35]; + T1K = FNMS(T1I, T1J, T1G * T1H); + T3s = FMA(T1I, T1H, T1G * T1J); + } + } + { + E T1P, T27, T1T, T29; + { + E T1N, T1O, T1R, T1S; + T1N = Ip[WS(rs, 6)]; + T1O = Im[WS(rs, 6)]; + T1P = T1N + T1O; + T27 = T1N - T1O; + T1R = Rp[WS(rs, 6)]; + T1S = Rm[WS(rs, 6)]; + T1T = T1R - T1S; + T29 = T1R + T1S; + } + { + E T1M, T1Q, T26, T28; + T1M = W[24]; + T1Q = W[25]; + T1U = FNMS(T1Q, T1T, T1M * T1P); + T2J = FMA(T1Q, T1P, T1M * T1T); + T26 = W[22]; + T28 = W[23]; + T2a = FNMS(T28, T29, T26 * T27); + T3x = FMA(T28, T27, T26 * T29); + } + } + { + E T16, T2k, T1a, T2i; + { + E T14, T15, T18, T19; + T14 = Ip[WS(rs, 8)]; + T15 = Im[WS(rs, 8)]; + T16 = T14 - T15; + T2k = T14 + T15; + T18 = Rp[WS(rs, 8)]; + T19 = Rm[WS(rs, 8)]; + T1a = T18 + T19; + T2i = T19 - T18; + } + { + E T13, T17, T2h, T2j; + T13 = W[30]; + T17 = W[31]; + T1b = FNMS(T17, T1a, T13 * T16); + T3l = FMA(T13, T1a, T17 * T16); + T2h = W[33]; + T2j = W[32]; + T2l = FMA(T2h, T2i, T2j * T2k); + T2D = FNMS(T2h, T2k, T2j * T2i); + } + } + { + E T2g, T2r, T3n, T3o; + { + E TI, T11, T4m, T4n; + TI = TC - TH; + T11 = TR - T10; + T12 = TI - T11; + T2w = TI + T11; + T4m = T3g + T3h; + T4n = TR + T10; + T4o = T4m + T4n; + T4V = T4m - T4n; + } + { + E T2F, T2G, T4w, T4x; + T2F = T2D - T2E; + T2G = T2a + T2f; + T2H = T2F - T2G; + T3a = T2F + T2G; + T4w = T2l + T2q; + T4x = T3x + T3y; + T4y = T4w + T4x; + T4Y = T4x - T4w; + } + { + E T1l, T1y, T1L, T24; + T1l = T1b - T1k; + T1y = T1q - T1x; + T1z = T1l + T1y; + T2v = T1y - T1l; + T1L = T1F - T1K; + T24 = T1U - T23; + T25 = T1L - T24; + T2y = T1L + T24; + } + T2g = T2a - T2f; + T2r = T2l - T2q; + T2s = T2g - T2r; + T2z = T2r + T2g; + { + E T4t, T4u, T4p, T4q; + T4t = T3r + T3s; + T4u = T1U + T23; + T4v = T4t + T4u; + T4X = T4t - T4u; + T4p = T3l + T3m; + T4q = T1q + T1x; + T4r = T4p + T4q; + T4U = T4p - T4q; + } + { + E T3w, T3z, T2T, T2W; + T3w = T2D + T2E; + T3z = T3x - T3y; + T3A = T3w + T3z; + T3Z = T3z - T3w; + T2T = T1b + T1k; + T2W = T2U + T2V; + T2X = T2T + T2W; + T37 = T2T - T2W; + } + { + E T3i, T3j, T2I, T2L; + T3i = T3g - T3h; + T3j = T2Q - T2P; + T3k = T3i + T3j; + T41 = T3i - T3j; + T2I = T1F + T1K; + T2L = T2J + T2K; + T2M = T2I + T2L; + T39 = T2I - T2L; + } + { + E T3t, T3u, T2O, T2R; + T3t = T3r - T3s; + T3u = T2K - T2J; + T3v = T3t + T3u; + T3Y = T3t - T3u; + T2O = TC + TH; + T2R = T2P + T2Q; + T2S = T2O + T2R; + T36 = T2O - T2R; + } + T3n = T3l - T3m; + T3o = T2U - T2V; + T3p = T3n + T3o; + T42 = T3n - T3o; + { + E Tc, T3M, T4, T8; + T4 = W[18]; + T8 = W[19]; + Tc = FNMS(T8, Tb, T4 * T7); + T3M = FMA(T4, Tb, T8 * T7); + Td = T3 - Tc; + T4G = T3L + T3M; + T33 = Tc + T3; + T3N = T3L - T3M; + } + { + E Tm, T30, Tv, T31; + { + E Te, Ti, Tn, Tr; + Te = W[8]; + Ti = W[9]; + Tm = FNMS(Ti, Tl, Te * Th); + T30 = FMA(Ti, Th, Te * Tl); + Tn = W[28]; + Tr = W[29]; + Tv = FNMS(Tr, Tu, Tn * Tq); + T31 = FMA(Tr, Tq, Tn * Tu); + } + Tw = Tm - Tv; + T4H = Tm + Tv; + T32 = T30 + T31; + T3O = T31 - T30; + } + } + } + { + E T3C, T3E, Tx, T2u, T3d, T3e, T3D, T3f; + { + E T3q, T3B, T1A, T2t; + T3q = T3k - T3p; + T3B = T3v - T3A; + T3C = FMA(KP475528258, T3q, KP293892626 * T3B); + T3E = FNMS(KP293892626, T3q, KP475528258 * T3B); + Tx = Td - Tw; + T1A = T12 + T1z; + T2t = T25 + T2s; + T2u = T1A + T2t; + T3d = KP279508497 * (T1A - T2t); + T3e = FNMS(KP125000000, T2u, KP500000000 * Tx); + } + Ip[WS(rs, 5)] = KP500000000 * (Tx + T2u); + T3D = T3d - T3e; + Im[WS(rs, 2)] = T3D - T3E; + Im[WS(rs, 6)] = T3D + T3E; + T3f = T3d + T3e; + Ip[WS(rs, 1)] = T3f - T3C; + Ip[WS(rs, 9)] = T3f + T3C; + } + { + E T3H, T3T, T3P, T3Q, T3K, T3R, T3U, T3S; + { + E T3F, T3G, T3I, T3J; + T3F = T12 - T1z; + T3G = T25 - T2s; + T3H = FMA(KP475528258, T3F, KP293892626 * T3G); + T3T = FNMS(KP293892626, T3F, KP475528258 * T3G); + T3P = T3N + T3O; + T3I = T3k + T3p; + T3J = T3v + T3A; + T3Q = T3I + T3J; + T3K = KP279508497 * (T3I - T3J); + T3R = FNMS(KP125000000, T3Q, KP500000000 * T3P); + } + Rp[WS(rs, 5)] = KP500000000 * (T3P + T3Q); + T3U = T3R - T3K; + Rm[WS(rs, 6)] = T3T + T3U; + Rm[WS(rs, 2)] = T3U - T3T; + T3S = T3K + T3R; + Rp[WS(rs, 1)] = T3H + T3S; + Rp[WS(rs, 9)] = T3S - T3H; + } + { + E T44, T46, T2C, T2B, T3V, T3W, T45, T3X; + { + E T40, T43, T2x, T2A; + T40 = T3Y - T3Z; + T43 = T41 - T42; + T44 = FNMS(KP293892626, T43, KP475528258 * T40); + T46 = FMA(KP475528258, T43, KP293892626 * T40); + T2C = Tw + Td; + T2x = T2v - T2w; + T2A = T2y + T2z; + T2B = T2x - T2A; + T3V = FMA(KP500000000, T2C, KP125000000 * T2B); + T3W = KP279508497 * (T2x + T2A); + } + Im[WS(rs, 4)] = KP500000000 * (T2B - T2C); + T45 = T3W - T3V; + Im[0] = T45 - T46; + Im[WS(rs, 8)] = T45 + T46; + T3X = T3V + T3W; + Ip[WS(rs, 3)] = T3X - T44; + Ip[WS(rs, 7)] = T3X + T44; + } + { + E T49, T4h, T4a, T4d, T4e, T4f, T4i, T4g; + { + E T47, T48, T4b, T4c; + T47 = T2y - T2z; + T48 = T2w + T2v; + T49 = FNMS(KP293892626, T48, KP475528258 * T47); + T4h = FMA(KP475528258, T48, KP293892626 * T47); + T4a = T3N - T3O; + T4b = T41 + T42; + T4c = T3Y + T3Z; + T4d = T4b + T4c; + T4e = FNMS(KP125000000, T4d, KP500000000 * T4a); + T4f = KP279508497 * (T4b - T4c); + } + Rm[WS(rs, 4)] = KP500000000 * (T4a + T4d); + T4i = T4f + T4e; + Rm[WS(rs, 8)] = T4h + T4i; + Rm[0] = T4i - T4h; + T4g = T4e - T4f; + Rp[WS(rs, 3)] = T49 + T4g; + Rp[WS(rs, 7)] = T4g - T49; + } + { + E T50, T52, T34, T2Z, T4R, T4S, T51, T4T; + { + E T4W, T4Z, T2N, T2Y; + T4W = T4U - T4V; + T4Z = T4X - T4Y; + T50 = FNMS(KP293892626, T4Z, KP475528258 * T4W); + T52 = FMA(KP293892626, T4W, KP475528258 * T4Z); + T34 = T32 + T33; + T2N = T2H - T2M; + T2Y = T2S + T2X; + T2Z = T2N - T2Y; + T4R = FMA(KP500000000, T34, KP125000000 * T2Z); + T4S = KP279508497 * (T2Y + T2N); + } + Im[WS(rs, 9)] = KP500000000 * (T2Z - T34); + T51 = T4R - T4S; + Ip[WS(rs, 2)] = T51 + T52; + Im[WS(rs, 1)] = T52 - T51; + T4T = T4R + T4S; + Ip[WS(rs, 6)] = T4T + T50; + Im[WS(rs, 5)] = T50 - T4T; + } + { + E T5c, T5d, T53, T56, T57, T58, T5e, T59; + { + E T5a, T5b, T54, T55; + T5a = T2M + T2H; + T5b = T2S - T2X; + T5c = FNMS(KP293892626, T5b, KP475528258 * T5a); + T5d = FMA(KP475528258, T5b, KP293892626 * T5a); + T53 = T4G - T4H; + T54 = T4V + T4U; + T55 = T4X + T4Y; + T56 = T54 + T55; + T57 = FNMS(KP125000000, T56, KP500000000 * T53); + T58 = KP279508497 * (T54 - T55); + } + Rm[WS(rs, 9)] = KP500000000 * (T53 + T56); + T5e = T58 + T57; + Rp[WS(rs, 6)] = T5d + T5e; + Rm[WS(rs, 5)] = T5e - T5d; + T59 = T57 - T58; + Rp[WS(rs, 2)] = T59 - T5c; + Rm[WS(rs, 1)] = T5c + T59; + } + { + E T4A, T4C, T35, T3c, T4j, T4k, T4B, T4l; + { + E T4s, T4z, T38, T3b; + T4s = T4o - T4r; + T4z = T4v - T4y; + T4A = FNMS(KP475528258, T4z, KP293892626 * T4s); + T4C = FMA(KP475528258, T4s, KP293892626 * T4z); + T35 = T33 - T32; + T38 = T36 + T37; + T3b = T39 + T3a; + T3c = T38 + T3b; + T4j = FNMS(KP125000000, T3c, KP500000000 * T35); + T4k = KP279508497 * (T38 - T3b); + } + Ip[0] = KP500000000 * (T35 + T3c); + T4B = T4k + T4j; + Ip[WS(rs, 4)] = T4B + T4C; + Im[WS(rs, 3)] = T4C - T4B; + T4l = T4j - T4k; + Ip[WS(rs, 8)] = T4l + T4A; + Im[WS(rs, 7)] = T4A - T4l; + } + { + E T4O, T4P, T4I, T4J, T4F, T4K, T4Q, T4L; + { + E T4M, T4N, T4D, T4E; + T4M = T36 - T37; + T4N = T39 - T3a; + T4O = FMA(KP475528258, T4M, KP293892626 * T4N); + T4P = FNMS(KP293892626, T4M, KP475528258 * T4N); + T4I = T4G + T4H; + T4D = T4o + T4r; + T4E = T4v + T4y; + T4J = T4D + T4E; + T4F = KP279508497 * (T4D - T4E); + T4K = FNMS(KP125000000, T4J, KP500000000 * T4I); + } + Rp[0] = KP500000000 * (T4I + T4J); + T4Q = T4K - T4F; + Rp[WS(rs, 8)] = T4P + T4Q; + Rm[WS(rs, 7)] = T4Q - T4P; + T4L = T4F + T4K; + Rp[WS(rs, 4)] = T4L - T4O; + Rm[WS(rs, 3)] = T4O + T4L; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 20, "hc2cfdft_20", twinstr, &GENUS, {224, 78, 62, 0} }; + +void X(codelet_hc2cfdft_20) (planner *p) { + X(khc2c_register) (p, hc2cfdft_20, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_32.c new file mode 100644 index 000000000..784666723 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_32.c @@ -0,0 +1,1983 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:12 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -dit -name hc2cfdft_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 498 FP additions, 324 FP multiplications, + * (or, 300 additions, 126 multiplications, 198 fused multiply/add), + * 113 stack variables, 8 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E T3B, T89, T61, T8l, T2F, T8t, T4B, T7p, T1n, T7L, T5e, T7I, T4u, T82, T5E; + E T7R, T3m, T8k, T5W, T8a, T2r, T8u, T4G, T7q, T12, T7K, T59, T7H, T4h, T81; + E T5z, T7Q, Tl, T7D, T4Y, T7A, T3Q, T5o, T7V, T84, T1K, T7t, T4M, T7s, T2V; + E T8n, T5L, T8e, T25, T7w, T4R, T7v, T38, T8o, T5Q, T8h, TG, T7E, T53, T7B; + E T43, T5t, T7Y, T85; + { + E T2E, T3z, T4y, T3y, T5Z, T3t, T3x, T2v, T2A, T3r, T3q, T5X, T3n, T3p, T2w; + E T4z, T3s, T3A; + { + E T2C, T2D, T3u, T3v, T3w; + T2C = Ip[0]; + T2D = Im[0]; + T2E = T2C - T2D; + T3z = T2C + T2D; + T3u = Rm[0]; + T3v = Rp[0]; + T3w = T3u - T3v; + T4y = T3v + T3u; + T3y = W[1]; + T5Z = T3y * T3w; + T3t = W[0]; + T3x = T3t * T3w; + { + E T2t, T2u, T3o, T2y, T2z, T2s; + T2t = Ip[WS(rs, 8)]; + T2u = Im[WS(rs, 8)]; + T2v = T2t - T2u; + T2y = Rp[WS(rs, 8)]; + T2z = Rm[WS(rs, 8)]; + T2A = T2y + T2z; + T3o = T2z - T2y; + T3r = T2t + T2u; + T3q = W[33]; + T5X = T3q * T3o; + T3n = W[32]; + T3p = T3n * T3o; + T2s = W[30]; + T2w = T2s * T2v; + T4z = T2s * T2A; + } + } + T3s = FNMS(T3q, T3r, T3p); + T3A = FNMS(T3y, T3z, T3x); + T3B = T3s + T3A; + T89 = T3A - T3s; + { + E T5Y, T60, T2B, T4A, T2x; + T5Y = FMA(T3n, T3r, T5X); + T60 = FMA(T3t, T3z, T5Z); + T61 = T5Y + T60; + T8l = T60 - T5Y; + T2x = W[31]; + T2B = FNMS(T2x, T2A, T2w); + T4A = FMA(T2x, T2v, T4z); + T2F = T2B + T2E; + T8t = T4y - T4A; + T4B = T4y + T4A; + T7p = T2E - T2B; + } + } + { + E T16, T4m, T1b, T4j, T17, T5a, T4k, T5A, T1g, T4s, T1l, T4p, T1h, T5c, T4q; + E T5C; + { + E T13, T4i, T1d, T4o; + { + E T14, T15, T19, T1a; + T14 = Ip[WS(rs, 3)]; + T15 = Im[WS(rs, 3)]; + T16 = T14 - T15; + T4m = T14 + T15; + T19 = Rp[WS(rs, 3)]; + T1a = Rm[WS(rs, 3)]; + T1b = T19 + T1a; + T4j = T19 - T1a; + } + T13 = W[10]; + T17 = T13 * T16; + T5a = T13 * T1b; + T4i = W[12]; + T4k = T4i * T4j; + T5A = T4i * T4m; + { + E T1e, T1f, T1j, T1k; + T1e = Ip[WS(rs, 11)]; + T1f = Im[WS(rs, 11)]; + T1g = T1e - T1f; + T4s = T1e + T1f; + T1j = Rp[WS(rs, 11)]; + T1k = Rm[WS(rs, 11)]; + T1l = T1j + T1k; + T4p = T1j - T1k; + } + T1d = W[42]; + T1h = T1d * T1g; + T5c = T1d * T1l; + T4o = W[44]; + T4q = T4o * T4p; + T5C = T4o * T4s; + } + { + E T1c, T5b, T1m, T5d, T18, T1i; + T18 = W[11]; + T1c = FNMS(T18, T1b, T17); + T5b = FMA(T18, T16, T5a); + T1i = W[43]; + T1m = FNMS(T1i, T1l, T1h); + T5d = FMA(T1i, T1g, T5c); + T1n = T1c + T1m; + T7L = T1c - T1m; + T5e = T5b + T5d; + T7I = T5b - T5d; + } + { + E T4n, T5B, T4t, T5D, T4l, T4r; + T4l = W[13]; + T4n = FMA(T4l, T4m, T4k); + T5B = FNMS(T4l, T4j, T5A); + T4r = W[45]; + T4t = FMA(T4r, T4s, T4q); + T5D = FNMS(T4r, T4p, T5C); + T4u = T4n + T4t; + T82 = T4t - T4n; + T5E = T5B + T5D; + T7R = T5D - T5B; + } + } + { + E T2a, T2f, T3e, T3d, T5S, T3a, T3c, T2b, T4C, T2k, T2p, T3k, T3j, T5U, T3g; + E T3i, T2l, T4E; + { + E T28, T29, T3b, T2d, T2e, T27; + T28 = Ip[WS(rs, 4)]; + T29 = Im[WS(rs, 4)]; + T2a = T28 - T29; + T2d = Rp[WS(rs, 4)]; + T2e = Rm[WS(rs, 4)]; + T2f = T2d + T2e; + T3b = T2e - T2d; + T3e = T28 + T29; + T3d = W[17]; + T5S = T3d * T3b; + T3a = W[16]; + T3c = T3a * T3b; + T27 = W[14]; + T2b = T27 * T2a; + T4C = T27 * T2f; + } + { + E T2i, T2j, T3h, T2n, T2o, T2h; + T2i = Ip[WS(rs, 12)]; + T2j = Im[WS(rs, 12)]; + T2k = T2i - T2j; + T2n = Rp[WS(rs, 12)]; + T2o = Rm[WS(rs, 12)]; + T2p = T2n + T2o; + T3h = T2o - T2n; + T3k = T2i + T2j; + T3j = W[49]; + T5U = T3j * T3h; + T3g = W[48]; + T3i = T3g * T3h; + T2h = W[46]; + T2l = T2h * T2k; + T4E = T2h * T2p; + } + { + E T3f, T3l, T5T, T5V; + T3f = FNMS(T3d, T3e, T3c); + T3l = FNMS(T3j, T3k, T3i); + T3m = T3f + T3l; + T8k = T3f - T3l; + T5T = FMA(T3a, T3e, T5S); + T5V = FMA(T3g, T3k, T5U); + T5W = T5T + T5V; + T8a = T5T - T5V; + { + E T2g, T4D, T2q, T4F, T2c, T2m; + T2c = W[15]; + T2g = FNMS(T2c, T2f, T2b); + T4D = FMA(T2c, T2a, T4C); + T2m = W[47]; + T2q = FNMS(T2m, T2p, T2l); + T4F = FMA(T2m, T2k, T4E); + T2r = T2g + T2q; + T8u = T2g - T2q; + T4G = T4D + T4F; + T7q = T4D - T4F; + } + } + } + { + E TL, T49, TQ, T46, TM, T55, T47, T5v, TV, T4f, T10, T4c, TW, T57, T4d; + E T5x; + { + E TI, T45, TS, T4b; + { + E TJ, TK, TO, TP; + TJ = Ip[WS(rs, 15)]; + TK = Im[WS(rs, 15)]; + TL = TJ - TK; + T49 = TJ + TK; + TO = Rp[WS(rs, 15)]; + TP = Rm[WS(rs, 15)]; + TQ = TO + TP; + T46 = TO - TP; + } + TI = W[58]; + TM = TI * TL; + T55 = TI * TQ; + T45 = W[60]; + T47 = T45 * T46; + T5v = T45 * T49; + { + E TT, TU, TY, TZ; + TT = Ip[WS(rs, 7)]; + TU = Im[WS(rs, 7)]; + TV = TT - TU; + T4f = TT + TU; + TY = Rp[WS(rs, 7)]; + TZ = Rm[WS(rs, 7)]; + T10 = TY + TZ; + T4c = TY - TZ; + } + TS = W[26]; + TW = TS * TV; + T57 = TS * T10; + T4b = W[28]; + T4d = T4b * T4c; + T5x = T4b * T4f; + } + { + E TR, T56, T11, T58, TN, TX; + TN = W[59]; + TR = FNMS(TN, TQ, TM); + T56 = FMA(TN, TL, T55); + TX = W[27]; + T11 = FNMS(TX, T10, TW); + T58 = FMA(TX, TV, T57); + T12 = TR + T11; + T7K = T56 - T58; + T59 = T56 + T58; + T7H = TR - T11; + } + { + E T4a, T5w, T4g, T5y, T48, T4e; + T48 = W[61]; + T4a = FMA(T48, T49, T47); + T5w = FNMS(T48, T46, T5v); + T4e = W[29]; + T4g = FMA(T4e, T4f, T4d); + T5y = FNMS(T4e, T4c, T5x); + T4h = T4a + T4g; + T81 = T5w - T5y; + T5z = T5w + T5y; + T7Q = T4g - T4a; + } + } + { + E T4, T3I, T9, T3F, T5, T4U, T3G, T5k, Te, T3O, Tj, T3L, Tf, T4W, T3M; + E T5m; + { + E T1, T3E, Tb, T3K; + { + E T2, T3, T7, T8; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + T3I = T2 + T3; + T7 = Rp[WS(rs, 1)]; + T8 = Rm[WS(rs, 1)]; + T9 = T7 + T8; + T3F = T7 - T8; + } + T1 = W[2]; + T5 = T1 * T4; + T4U = T1 * T9; + T3E = W[4]; + T3G = T3E * T3F; + T5k = T3E * T3I; + { + E Tc, Td, Th, Ti; + Tc = Ip[WS(rs, 9)]; + Td = Im[WS(rs, 9)]; + Te = Tc - Td; + T3O = Tc + Td; + Th = Rp[WS(rs, 9)]; + Ti = Rm[WS(rs, 9)]; + Tj = Th + Ti; + T3L = Th - Ti; + } + Tb = W[34]; + Tf = Tb * Te; + T4W = Tb * Tj; + T3K = W[36]; + T3M = T3K * T3L; + T5m = T3K * T3O; + } + { + E Ta, T4V, Tk, T4X, T6, Tg; + T6 = W[3]; + Ta = FNMS(T6, T9, T5); + T4V = FMA(T6, T4, T4U); + Tg = W[35]; + Tk = FNMS(Tg, Tj, Tf); + T4X = FMA(Tg, Te, T4W); + Tl = Ta + Tk; + T7D = T4V - T4X; + T4Y = T4V + T4X; + T7A = Ta - Tk; + } + { + E T3J, T5l, T3P, T5n, T3H, T3N, T7T, T7U; + T3H = W[5]; + T3J = FMA(T3H, T3I, T3G); + T5l = FNMS(T3H, T3F, T5k); + T3N = W[37]; + T3P = FMA(T3N, T3O, T3M); + T5n = FNMS(T3N, T3L, T5m); + T3Q = T3J + T3P; + T5o = T5l + T5n; + T7T = T3P - T3J; + T7U = T5l - T5n; + T7V = T7T - T7U; + T84 = T7U + T7T; + } + } + { + E T1t, T1y, T2N, T2M, T5H, T2J, T2L, T1u, T4I, T1D, T1I, T2T, T2S, T5J, T2P; + E T2R, T1E, T4K; + { + E T1r, T1s, T2K, T1w, T1x, T1q; + T1r = Ip[WS(rs, 2)]; + T1s = Im[WS(rs, 2)]; + T1t = T1r - T1s; + T1w = Rp[WS(rs, 2)]; + T1x = Rm[WS(rs, 2)]; + T1y = T1w + T1x; + T2K = T1x - T1w; + T2N = T1r + T1s; + T2M = W[9]; + T5H = T2M * T2K; + T2J = W[8]; + T2L = T2J * T2K; + T1q = W[6]; + T1u = T1q * T1t; + T4I = T1q * T1y; + } + { + E T1B, T1C, T2Q, T1G, T1H, T1A; + T1B = Ip[WS(rs, 10)]; + T1C = Im[WS(rs, 10)]; + T1D = T1B - T1C; + T1G = Rp[WS(rs, 10)]; + T1H = Rm[WS(rs, 10)]; + T1I = T1G + T1H; + T2Q = T1H - T1G; + T2T = T1B + T1C; + T2S = W[41]; + T5J = T2S * T2Q; + T2P = W[40]; + T2R = T2P * T2Q; + T1A = W[38]; + T1E = T1A * T1D; + T4K = T1A * T1I; + } + { + E T1z, T4J, T1J, T4L, T1v, T1F; + T1v = W[7]; + T1z = FNMS(T1v, T1y, T1u); + T4J = FMA(T1v, T1t, T4I); + T1F = W[39]; + T1J = FNMS(T1F, T1I, T1E); + T4L = FMA(T1F, T1D, T4K); + T1K = T1z + T1J; + T7t = T4J - T4L; + T4M = T4J + T4L; + T7s = T1z - T1J; + } + { + E T2O, T2U, T8c, T5I, T5K, T8d; + T2O = FNMS(T2M, T2N, T2L); + T2U = FNMS(T2S, T2T, T2R); + T8c = T2O - T2U; + T5I = FMA(T2J, T2N, T5H); + T5K = FMA(T2P, T2T, T5J); + T8d = T5I - T5K; + T2V = T2O + T2U; + T8n = T8c + T8d; + T5L = T5I + T5K; + T8e = T8c - T8d; + } + } + { + E T1O, T1T, T30, T2Z, T5M, T2W, T2Y, T1P, T4N, T1Y, T23, T36, T35, T5O, T32; + E T34, T1Z, T4P; + { + E T1M, T1N, T2X, T1R, T1S, T1L; + T1M = Ip[WS(rs, 14)]; + T1N = Im[WS(rs, 14)]; + T1O = T1M - T1N; + T1R = Rp[WS(rs, 14)]; + T1S = Rm[WS(rs, 14)]; + T1T = T1R + T1S; + T2X = T1S - T1R; + T30 = T1M + T1N; + T2Z = W[57]; + T5M = T2Z * T2X; + T2W = W[56]; + T2Y = T2W * T2X; + T1L = W[54]; + T1P = T1L * T1O; + T4N = T1L * T1T; + } + { + E T1W, T1X, T33, T21, T22, T1V; + T1W = Ip[WS(rs, 6)]; + T1X = Im[WS(rs, 6)]; + T1Y = T1W - T1X; + T21 = Rp[WS(rs, 6)]; + T22 = Rm[WS(rs, 6)]; + T23 = T21 + T22; + T33 = T22 - T21; + T36 = T1W + T1X; + T35 = W[25]; + T5O = T35 * T33; + T32 = W[24]; + T34 = T32 * T33; + T1V = W[22]; + T1Z = T1V * T1Y; + T4P = T1V * T23; + } + { + E T1U, T4O, T24, T4Q, T1Q, T20; + T1Q = W[55]; + T1U = FNMS(T1Q, T1T, T1P); + T4O = FMA(T1Q, T1O, T4N); + T20 = W[23]; + T24 = FNMS(T20, T23, T1Z); + T4Q = FMA(T20, T1Y, T4P); + T25 = T1U + T24; + T7w = T1U - T24; + T4R = T4O + T4Q; + T7v = T4O - T4Q; + } + { + E T31, T37, T8f, T5N, T5P, T8g; + T31 = FNMS(T2Z, T30, T2Y); + T37 = FNMS(T35, T36, T34); + T8f = T31 - T37; + T5N = FMA(T2W, T30, T5M); + T5P = FMA(T32, T36, T5O); + T8g = T5N - T5P; + T38 = T31 + T37; + T8o = T8g - T8f; + T5Q = T5N + T5P; + T8h = T8f + T8g; + } + } + { + E Tp, T3V, Tu, T3S, Tq, T4Z, T3T, T5p, Tz, T41, TE, T3Y, TA, T51, T3Z; + E T5r; + { + E Tm, T3R, Tw, T3X; + { + E Tn, To, Ts, Tt; + Tn = Ip[WS(rs, 5)]; + To = Im[WS(rs, 5)]; + Tp = Tn - To; + T3V = Tn + To; + Ts = Rp[WS(rs, 5)]; + Tt = Rm[WS(rs, 5)]; + Tu = Ts + Tt; + T3S = Ts - Tt; + } + Tm = W[18]; + Tq = Tm * Tp; + T4Z = Tm * Tu; + T3R = W[20]; + T3T = T3R * T3S; + T5p = T3R * T3V; + { + E Tx, Ty, TC, TD; + Tx = Ip[WS(rs, 13)]; + Ty = Im[WS(rs, 13)]; + Tz = Tx - Ty; + T41 = Tx + Ty; + TC = Rp[WS(rs, 13)]; + TD = Rm[WS(rs, 13)]; + TE = TC + TD; + T3Y = TC - TD; + } + Tw = W[50]; + TA = Tw * Tz; + T51 = Tw * TE; + T3X = W[52]; + T3Z = T3X * T3Y; + T5r = T3X * T41; + } + { + E Tv, T50, TF, T52, Tr, TB; + Tr = W[19]; + Tv = FNMS(Tr, Tu, Tq); + T50 = FMA(Tr, Tp, T4Z); + TB = W[51]; + TF = FNMS(TB, TE, TA); + T52 = FMA(TB, Tz, T51); + TG = Tv + TF; + T7E = Tv - TF; + T53 = T50 + T52; + T7B = T50 - T52; + } + { + E T3W, T5q, T42, T5s, T3U, T40, T7W, T7X; + T3U = W[21]; + T3W = FMA(T3U, T3V, T3T); + T5q = FNMS(T3U, T3S, T5p); + T40 = W[53]; + T42 = FMA(T40, T41, T3Z); + T5s = FNMS(T40, T3Y, T5r); + T43 = T3W + T42; + T5t = T5q + T5s; + T7W = T5s - T5q; + T7X = T3W - T42; + T7Y = T7W + T7X; + T85 = T7W - T7X; + } + } + { + E T1p, T6i, T2H, T68, T5g, T67, T4T, T6h, T4w, T6m, T5G, T6c, T3D, T6n, T63; + E T6f; + { + E TH, T1o, T4H, T4S; + TH = Tl + TG; + T1o = T12 + T1n; + T1p = TH + T1o; + T6i = TH - T1o; + { + E T26, T2G, T54, T5f; + T26 = T1K + T25; + T2G = T2r + T2F; + T2H = T26 + T2G; + T68 = T2G - T26; + T54 = T4Y + T53; + T5f = T59 + T5e; + T5g = T54 + T5f; + T67 = T5f - T54; + } + T4H = T4B + T4G; + T4S = T4M + T4R; + T4T = T4H + T4S; + T6h = T4H - T4S; + { + E T44, T4v, T6b, T5u, T5F, T6a; + T44 = T3Q + T43; + T4v = T4h + T4u; + T6b = T44 - T4v; + T5u = T5o + T5t; + T5F = T5z + T5E; + T6a = T5F - T5u; + T4w = T44 + T4v; + T6m = T6a - T6b; + T5G = T5u + T5F; + T6c = T6a + T6b; + } + { + E T39, T3C, T6d, T5R, T62, T6e; + T39 = T2V + T38; + T3C = T3m + T3B; + T6d = T3C - T39; + T5R = T5L + T5Q; + T62 = T5W + T61; + T6e = T62 - T5R; + T3D = T39 + T3C; + T6n = T6d + T6e; + T63 = T5R + T62; + T6f = T6d - T6e; + } + } + { + E T2I, T4x, T65, T66; + T2I = T1p + T2H; + T4x = T3D - T4w; + Ip[0] = KP500000000 * (T2I + T4x); + Im[WS(rs, 15)] = KP500000000 * (T4x - T2I); + T65 = T4T + T5g; + T66 = T5G + T63; + Rm[WS(rs, 15)] = KP500000000 * (T65 - T66); + Rp[0] = KP500000000 * (T65 + T66); + } + { + E T5h, T5i, T5j, T64; + T5h = T4T - T5g; + T5i = T4w + T3D; + Rm[WS(rs, 7)] = KP500000000 * (T5h - T5i); + Rp[WS(rs, 8)] = KP500000000 * (T5h + T5i); + T5j = T2H - T1p; + T64 = T5G - T63; + Ip[WS(rs, 8)] = KP500000000 * (T5j + T64); + Im[WS(rs, 7)] = KP500000000 * (T64 - T5j); + } + { + E T69, T6g, T6p, T6q; + T69 = T67 + T68; + T6g = T6c + T6f; + Ip[WS(rs, 4)] = KP500000000 * (FMA(KP707106781, T6g, T69)); + Im[WS(rs, 11)] = -(KP500000000 * (FNMS(KP707106781, T6g, T69))); + T6p = T6h + T6i; + T6q = T6m + T6n; + Rm[WS(rs, 11)] = KP500000000 * (FNMS(KP707106781, T6q, T6p)); + Rp[WS(rs, 4)] = KP500000000 * (FMA(KP707106781, T6q, T6p)); + } + { + E T6j, T6k, T6l, T6o; + T6j = T6h - T6i; + T6k = T6f - T6c; + Rm[WS(rs, 3)] = KP500000000 * (FNMS(KP707106781, T6k, T6j)); + Rp[WS(rs, 12)] = KP500000000 * (FMA(KP707106781, T6k, T6j)); + T6l = T68 - T67; + T6o = T6m - T6n; + Ip[WS(rs, 12)] = KP500000000 * (FMA(KP707106781, T6o, T6l)); + Im[WS(rs, 3)] = -(KP500000000 * (FNMS(KP707106781, T6o, T6l))); + } + } + { + E T6t, T75, T6T, T7f, T6A, T7g, T6W, T76, T6I, T7k, T70, T7a, T6P, T7l, T71; + E T7d; + { + E T6r, T6s, T6R, T6S; + T6r = T4R - T4M; + T6s = T2F - T2r; + T6t = T6r + T6s; + T75 = T6s - T6r; + T6R = T4B - T4G; + T6S = T1K - T25; + T6T = T6R + T6S; + T7f = T6R - T6S; + } + { + E T6w, T6U, T6z, T6V; + { + E T6u, T6v, T6x, T6y; + T6u = Tl - TG; + T6v = T4Y - T53; + T6w = T6u - T6v; + T6U = T6v + T6u; + T6x = T59 - T5e; + T6y = T12 - T1n; + T6z = T6x + T6y; + T6V = T6x - T6y; + } + T6A = T6w + T6z; + T7g = T6w - T6z; + T6W = T6U + T6V; + T76 = T6V - T6U; + } + { + E T6E, T78, T6H, T79; + { + E T6C, T6D, T6F, T6G; + T6C = T5t - T5o; + T6D = T4u - T4h; + T6E = T6C + T6D; + T78 = T6C - T6D; + T6F = T43 - T3Q; + T6G = T5z - T5E; + T6H = T6F + T6G; + T79 = T6G - T6F; + } + T6I = FMA(KP414213562, T6H, T6E); + T7k = FNMS(KP414213562, T78, T79); + T70 = FNMS(KP414213562, T6E, T6H); + T7a = FMA(KP414213562, T79, T78); + } + { + E T6L, T7b, T6O, T7c; + { + E T6J, T6K, T6M, T6N; + T6J = T5Q - T5L; + T6K = T3B - T3m; + T6L = T6J + T6K; + T7b = T6K - T6J; + T6M = T2V - T38; + T6N = T61 - T5W; + T6O = T6M + T6N; + T7c = T6N - T6M; + } + T6P = FNMS(KP414213562, T6O, T6L); + T7l = FNMS(KP414213562, T7b, T7c); + T71 = FMA(KP414213562, T6L, T6O); + T7d = FMA(KP414213562, T7c, T7b); + } + { + E T6B, T6Q, T73, T74; + T6B = FMA(KP707106781, T6A, T6t); + T6Q = T6I + T6P; + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP923879532, T6Q, T6B)); + Im[WS(rs, 13)] = -(KP500000000 * (FNMS(KP923879532, T6Q, T6B))); + T73 = FMA(KP707106781, T6W, T6T); + T74 = T70 + T71; + Rm[WS(rs, 13)] = KP500000000 * (FNMS(KP923879532, T74, T73)); + Rp[WS(rs, 2)] = KP500000000 * (FMA(KP923879532, T74, T73)); + } + { + E T6X, T6Y, T6Z, T72; + T6X = FNMS(KP707106781, T6W, T6T); + T6Y = T6P - T6I; + Rm[WS(rs, 5)] = KP500000000 * (FNMS(KP923879532, T6Y, T6X)); + Rp[WS(rs, 10)] = KP500000000 * (FMA(KP923879532, T6Y, T6X)); + T6Z = FNMS(KP707106781, T6A, T6t); + T72 = T70 - T71; + Ip[WS(rs, 10)] = KP500000000 * (FMA(KP923879532, T72, T6Z)); + Im[WS(rs, 5)] = -(KP500000000 * (FNMS(KP923879532, T72, T6Z))); + } + { + E T77, T7e, T7n, T7o; + T77 = FNMS(KP707106781, T76, T75); + T7e = T7a - T7d; + Ip[WS(rs, 14)] = KP500000000 * (FMA(KP923879532, T7e, T77)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP923879532, T7e, T77))); + T7n = FNMS(KP707106781, T7g, T7f); + T7o = T7k + T7l; + Rp[WS(rs, 14)] = KP500000000 * (FNMS(KP923879532, T7o, T7n)); + Rm[WS(rs, 1)] = KP500000000 * (FMA(KP923879532, T7o, T7n)); + } + { + E T7h, T7i, T7j, T7m; + T7h = FMA(KP707106781, T7g, T7f); + T7i = T7a + T7d; + Rm[WS(rs, 9)] = KP500000000 * (FNMS(KP923879532, T7i, T7h)); + Rp[WS(rs, 6)] = KP500000000 * (FMA(KP923879532, T7i, T7h)); + T7j = FMA(KP707106781, T76, T75); + T7m = T7k - T7l; + Ip[WS(rs, 6)] = KP500000000 * (FMA(KP923879532, T7m, T7j)); + Im[WS(rs, 9)] = -(KP500000000 * (FNMS(KP923879532, T7m, T7j))); + } + } + { + E T7z, T9T, T8L, T9x, T8z, T9J, T8V, T97, T7O, T8W, T8C, T8M, T9t, T9Y, T9E; + E T9O, T88, T90, T8G, T8Q, T9e, T9U, T9A, T9K, T9m, T9Z, T9F, T9R, T8r, T91; + E T8H, T8T; + { + E T7r, T9v, T7y, T9w, T7u, T7x; + T7r = T7p - T7q; + T9v = T8t - T8u; + T7u = T7s - T7t; + T7x = T7v + T7w; + T7y = T7u + T7x; + T9w = T7u - T7x; + T7z = FMA(KP707106781, T7y, T7r); + T9T = FNMS(KP707106781, T9w, T9v); + T8L = FNMS(KP707106781, T7y, T7r); + T9x = FMA(KP707106781, T9w, T9v); + } + { + E T8v, T95, T8y, T96, T8w, T8x; + T8v = T8t + T8u; + T95 = T7q + T7p; + T8w = T7t + T7s; + T8x = T7v - T7w; + T8y = T8w + T8x; + T96 = T8x - T8w; + T8z = FMA(KP707106781, T8y, T8v); + T9J = FNMS(KP707106781, T96, T95); + T8V = FNMS(KP707106781, T8y, T8v); + T97 = FMA(KP707106781, T96, T95); + } + { + E T7G, T8A, T7N, T8B; + { + E T7C, T7F, T7J, T7M; + T7C = T7A - T7B; + T7F = T7D + T7E; + T7G = FNMS(KP414213562, T7F, T7C); + T8A = FMA(KP414213562, T7C, T7F); + T7J = T7H - T7I; + T7M = T7K + T7L; + T7N = FMA(KP414213562, T7M, T7J); + T8B = FNMS(KP414213562, T7J, T7M); + } + T7O = T7G + T7N; + T8W = T7G - T7N; + T8C = T8A + T8B; + T8M = T8B - T8A; + } + { + E T9p, T9M, T9s, T9N; + { + E T9n, T9o, T9q, T9r; + T9n = T7R - T7Q; + T9o = T85 - T84; + T9p = FNMS(KP707106781, T9o, T9n); + T9M = FMA(KP707106781, T9o, T9n); + T9q = T81 - T82; + T9r = T7Y - T7V; + T9s = FNMS(KP707106781, T9r, T9q); + T9N = FMA(KP707106781, T9r, T9q); + } + T9t = FNMS(KP668178637, T9s, T9p); + T9Y = FNMS(KP198912367, T9M, T9N); + T9E = FMA(KP668178637, T9p, T9s); + T9O = FMA(KP198912367, T9N, T9M); + } + { + E T80, T8O, T87, T8P; + { + E T7S, T7Z, T83, T86; + T7S = T7Q + T7R; + T7Z = T7V + T7Y; + T80 = FMA(KP707106781, T7Z, T7S); + T8O = FNMS(KP707106781, T7Z, T7S); + T83 = T81 + T82; + T86 = T84 + T85; + T87 = FMA(KP707106781, T86, T83); + T8P = FNMS(KP707106781, T86, T83); + } + T88 = FMA(KP198912367, T87, T80); + T90 = FMA(KP668178637, T8O, T8P); + T8G = FNMS(KP198912367, T80, T87); + T8Q = FNMS(KP668178637, T8P, T8O); + } + { + E T9a, T9z, T9d, T9y; + { + E T98, T99, T9b, T9c; + T98 = T7K - T7L; + T99 = T7H + T7I; + T9a = FMA(KP414213562, T99, T98); + T9z = FNMS(KP414213562, T98, T99); + T9b = T7D - T7E; + T9c = T7A + T7B; + T9d = FNMS(KP414213562, T9c, T9b); + T9y = FMA(KP414213562, T9b, T9c); + } + T9e = T9a - T9d; + T9U = T9d + T9a; + T9A = T9y - T9z; + T9K = T9y + T9z; + } + { + E T9i, T9P, T9l, T9Q; + { + E T9g, T9h, T9j, T9k; + T9g = T8a + T89; + T9h = T8n - T8o; + T9i = FNMS(KP707106781, T9h, T9g); + T9P = FMA(KP707106781, T9h, T9g); + T9j = T8l - T8k; + T9k = T8h - T8e; + T9l = FNMS(KP707106781, T9k, T9j); + T9Q = FMA(KP707106781, T9k, T9j); + } + T9m = FNMS(KP668178637, T9l, T9i); + T9Z = FNMS(KP198912367, T9P, T9Q); + T9F = FMA(KP668178637, T9i, T9l); + T9R = FMA(KP198912367, T9Q, T9P); + } + { + E T8j, T8R, T8q, T8S; + { + E T8b, T8i, T8m, T8p; + T8b = T89 - T8a; + T8i = T8e + T8h; + T8j = FMA(KP707106781, T8i, T8b); + T8R = FNMS(KP707106781, T8i, T8b); + T8m = T8k + T8l; + T8p = T8n + T8o; + T8q = FMA(KP707106781, T8p, T8m); + T8S = FNMS(KP707106781, T8p, T8m); + } + T8r = FNMS(KP198912367, T8q, T8j); + T91 = FNMS(KP668178637, T8R, T8S); + T8H = FMA(KP198912367, T8j, T8q); + T8T = FMA(KP668178637, T8S, T8R); + } + { + E T7P, T8s, T8J, T8K; + T7P = FMA(KP923879532, T7O, T7z); + T8s = T88 + T8r; + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP980785280, T8s, T7P)); + Im[WS(rs, 14)] = -(KP500000000 * (FNMS(KP980785280, T8s, T7P))); + T8J = FMA(KP923879532, T8C, T8z); + T8K = T8G + T8H; + Rm[WS(rs, 14)] = KP500000000 * (FNMS(KP980785280, T8K, T8J)); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP980785280, T8K, T8J)); + } + { + E T8D, T8E, T8F, T8I; + T8D = FNMS(KP923879532, T8C, T8z); + T8E = T8r - T88; + Rm[WS(rs, 6)] = KP500000000 * (FNMS(KP980785280, T8E, T8D)); + Rp[WS(rs, 9)] = KP500000000 * (FMA(KP980785280, T8E, T8D)); + T8F = FNMS(KP923879532, T7O, T7z); + T8I = T8G - T8H; + Ip[WS(rs, 9)] = KP500000000 * (FMA(KP980785280, T8I, T8F)); + Im[WS(rs, 6)] = -(KP500000000 * (FNMS(KP980785280, T8I, T8F))); + } + { + E T8N, T8U, T93, T94; + T8N = FNMS(KP923879532, T8M, T8L); + T8U = T8Q + T8T; + Ip[WS(rs, 13)] = KP500000000 * (FNMS(KP831469612, T8U, T8N)); + Im[WS(rs, 2)] = -(KP500000000 * (FMA(KP831469612, T8U, T8N))); + T93 = FNMS(KP923879532, T8W, T8V); + T94 = T90 + T91; + Rp[WS(rs, 13)] = KP500000000 * (FNMS(KP831469612, T94, T93)); + Rm[WS(rs, 2)] = KP500000000 * (FMA(KP831469612, T94, T93)); + } + { + E T8X, T8Y, T8Z, T92; + T8X = FMA(KP923879532, T8W, T8V); + T8Y = T8T - T8Q; + Rm[WS(rs, 10)] = KP500000000 * (FNMS(KP831469612, T8Y, T8X)); + Rp[WS(rs, 5)] = KP500000000 * (FMA(KP831469612, T8Y, T8X)); + T8Z = FMA(KP923879532, T8M, T8L); + T92 = T90 - T91; + Ip[WS(rs, 5)] = KP500000000 * (FMA(KP831469612, T92, T8Z)); + Im[WS(rs, 10)] = -(KP500000000 * (FNMS(KP831469612, T92, T8Z))); + } + { + E T9f, T9u, T9H, T9I; + T9f = FMA(KP923879532, T9e, T97); + T9u = T9m - T9t; + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP831469612, T9u, T9f)); + Im[WS(rs, 12)] = -(KP500000000 * (FNMS(KP831469612, T9u, T9f))); + T9H = FMA(KP923879532, T9A, T9x); + T9I = T9E + T9F; + Rm[WS(rs, 12)] = KP500000000 * (FNMS(KP831469612, T9I, T9H)); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP831469612, T9I, T9H)); + } + { + E T9B, T9C, T9D, T9G; + T9B = FNMS(KP923879532, T9A, T9x); + T9C = T9t + T9m; + Rm[WS(rs, 4)] = KP500000000 * (FNMS(KP831469612, T9C, T9B)); + Rp[WS(rs, 11)] = KP500000000 * (FMA(KP831469612, T9C, T9B)); + T9D = FNMS(KP923879532, T9e, T97); + T9G = T9E - T9F; + Ip[WS(rs, 11)] = KP500000000 * (FMA(KP831469612, T9G, T9D)); + Im[WS(rs, 4)] = -(KP500000000 * (FNMS(KP831469612, T9G, T9D))); + } + { + E T9L, T9S, Ta1, Ta2; + T9L = FMA(KP923879532, T9K, T9J); + T9S = T9O - T9R; + Ip[WS(rs, 15)] = KP500000000 * (FMA(KP980785280, T9S, T9L)); + Im[0] = -(KP500000000 * (FNMS(KP980785280, T9S, T9L))); + Ta1 = FMA(KP923879532, T9U, T9T); + Ta2 = T9Y + T9Z; + Rp[WS(rs, 15)] = KP500000000 * (FNMS(KP980785280, Ta2, Ta1)); + Rm[0] = KP500000000 * (FMA(KP980785280, Ta2, Ta1)); + } + { + E T9V, T9W, T9X, Ta0; + T9V = FNMS(KP923879532, T9U, T9T); + T9W = T9O + T9R; + Rm[WS(rs, 8)] = KP500000000 * (FNMS(KP980785280, T9W, T9V)); + Rp[WS(rs, 7)] = KP500000000 * (FMA(KP980785280, T9W, T9V)); + T9X = FNMS(KP923879532, T9K, T9J); + Ta0 = T9Y - T9Z; + Ip[WS(rs, 7)] = KP500000000 * (FMA(KP980785280, Ta0, T9X)); + Im[WS(rs, 8)] = -(KP500000000 * (FNMS(KP980785280, Ta0, T9X))); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cfdft_32", twinstr, &GENUS, {300, 126, 198, 0} }; + +void X(codelet_hc2cfdft_32) (planner *p) { + X(khc2c_register) (p, hc2cfdft_32, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 32 -dit -name hc2cfdft_32 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 498 FP additions, 228 FP multiplications, + * (or, 404 additions, 134 multiplications, 94 fused multiply/add), + * 106 stack variables, 9 constants, and 128 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP277785116, +0.277785116509801112371415406974266437187468595); + DK(KP415734806, +0.415734806151272618539394188808952878369280406); + DK(KP097545161, +0.097545161008064133924142434238511120463845809); + DK(KP490392640, +0.490392640201615224563091118067119518486966865); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP191341716, +0.191341716182544885864229992015199433380672281); + DK(KP461939766, +0.461939766255643378064091594698394143411208313); + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 62, MAKE_VOLATILE_STRIDE(128, rs)) { + E T2S, T5K, T52, T5N, T7p, T8r, T7i, T8o, T2q, T7t, T45, T6L, T2d, T7u, T48; + E T6M, T1A, T4c, T4f, T1T, T3f, T5M, T7e, T7l, T6J, T7x, T4V, T5J, T7b, T7k; + E T6G, T7w, Tj, TC, T5r, T4k, T4n, T5s, T3D, T5C, T6V, T72, T4G, T5F, T6u; + E T86, T6S, T71, T6r, T85, TW, T1f, T5v, T4r, T4u, T5u, T40, T5G, T76, T8k; + E T4N, T5D, T6B, T89, T6Z, T8h, T6y, T88; + { + E T1Y, T22, T2L, T4W, T2p, T43, T2A, T50, T27, T2b, T2Q, T4X, T2h, T2l, T2F; + E T4Z; + { + E T1W, T1X, T2K, T20, T21, T2I, T2H, T2J; + T1W = Ip[WS(rs, 4)]; + T1X = Im[WS(rs, 4)]; + T2K = T1W + T1X; + T20 = Rp[WS(rs, 4)]; + T21 = Rm[WS(rs, 4)]; + T2I = T20 - T21; + T1Y = T1W - T1X; + T22 = T20 + T21; + T2H = W[16]; + T2J = W[17]; + T2L = FMA(T2H, T2I, T2J * T2K); + T4W = FNMS(T2J, T2I, T2H * T2K); + } + { + E T2n, T2o, T2z, T2v, T2w, T2x, T2u, T2y; + T2n = Ip[0]; + T2o = Im[0]; + T2z = T2n + T2o; + T2v = Rm[0]; + T2w = Rp[0]; + T2x = T2v - T2w; + T2p = T2n - T2o; + T43 = T2w + T2v; + T2u = W[0]; + T2y = W[1]; + T2A = FNMS(T2y, T2z, T2u * T2x); + T50 = FMA(T2y, T2x, T2u * T2z); + } + { + E T25, T26, T2P, T29, T2a, T2N, T2M, T2O; + T25 = Ip[WS(rs, 12)]; + T26 = Im[WS(rs, 12)]; + T2P = T25 + T26; + T29 = Rp[WS(rs, 12)]; + T2a = Rm[WS(rs, 12)]; + T2N = T29 - T2a; + T27 = T25 - T26; + T2b = T29 + T2a; + T2M = W[48]; + T2O = W[49]; + T2Q = FMA(T2M, T2N, T2O * T2P); + T4X = FNMS(T2O, T2N, T2M * T2P); + } + { + E T2f, T2g, T2E, T2j, T2k, T2C, T2B, T2D; + T2f = Ip[WS(rs, 8)]; + T2g = Im[WS(rs, 8)]; + T2E = T2f + T2g; + T2j = Rp[WS(rs, 8)]; + T2k = Rm[WS(rs, 8)]; + T2C = T2j - T2k; + T2h = T2f - T2g; + T2l = T2j + T2k; + T2B = W[32]; + T2D = W[33]; + T2F = FMA(T2B, T2C, T2D * T2E); + T4Z = FNMS(T2D, T2C, T2B * T2E); + } + { + E T2G, T2R, T7g, T7h; + T2G = T2A - T2F; + T2R = T2L + T2Q; + T2S = T2G - T2R; + T5K = T2R + T2G; + { + E T4Y, T51, T7n, T7o; + T4Y = T4W + T4X; + T51 = T4Z + T50; + T52 = T4Y + T51; + T5N = T51 - T4Y; + T7n = T2Q - T2L; + T7o = T50 - T4Z; + T7p = T7n + T7o; + T8r = T7o - T7n; + } + T7g = T2F + T2A; + T7h = T4W - T4X; + T7i = T7g - T7h; + T8o = T7h + T7g; + { + E T2m, T44, T2e, T2i; + T2e = W[30]; + T2i = W[31]; + T2m = FNMS(T2i, T2l, T2e * T2h); + T44 = FMA(T2e, T2l, T2i * T2h); + T2q = T2m + T2p; + T7t = T43 - T44; + T45 = T43 + T44; + T6L = T2p - T2m; + } + { + E T23, T46, T2c, T47; + { + E T1V, T1Z, T24, T28; + T1V = W[14]; + T1Z = W[15]; + T23 = FNMS(T1Z, T22, T1V * T1Y); + T46 = FMA(T1V, T22, T1Z * T1Y); + T24 = W[46]; + T28 = W[47]; + T2c = FNMS(T28, T2b, T24 * T27); + T47 = FMA(T24, T2b, T28 * T27); + } + T2d = T23 + T2c; + T7u = T23 - T2c; + T48 = T46 + T47; + T6M = T46 - T47; + } + } + } + { + E T1q, T4a, T2X, T4P, T1S, T4e, T3d, T4T, T1z, T4b, T32, T4Q, T1J, T4d, T38; + E T4S; + { + E T1l, T2W, T1p, T2U; + { + E T1j, T1k, T1n, T1o; + T1j = Ip[WS(rs, 2)]; + T1k = Im[WS(rs, 2)]; + T1l = T1j - T1k; + T2W = T1j + T1k; + T1n = Rp[WS(rs, 2)]; + T1o = Rm[WS(rs, 2)]; + T1p = T1n + T1o; + T2U = T1n - T1o; + } + { + E T1i, T1m, T2T, T2V; + T1i = W[6]; + T1m = W[7]; + T1q = FNMS(T1m, T1p, T1i * T1l); + T4a = FMA(T1i, T1p, T1m * T1l); + T2T = W[8]; + T2V = W[9]; + T2X = FMA(T2T, T2U, T2V * T2W); + T4P = FNMS(T2V, T2U, T2T * T2W); + } + } + { + E T1N, T3c, T1R, T3a; + { + E T1L, T1M, T1P, T1Q; + T1L = Ip[WS(rs, 6)]; + T1M = Im[WS(rs, 6)]; + T1N = T1L - T1M; + T3c = T1L + T1M; + T1P = Rp[WS(rs, 6)]; + T1Q = Rm[WS(rs, 6)]; + T1R = T1P + T1Q; + T3a = T1P - T1Q; + } + { + E T1K, T1O, T39, T3b; + T1K = W[22]; + T1O = W[23]; + T1S = FNMS(T1O, T1R, T1K * T1N); + T4e = FMA(T1K, T1R, T1O * T1N); + T39 = W[24]; + T3b = W[25]; + T3d = FMA(T39, T3a, T3b * T3c); + T4T = FNMS(T3b, T3a, T39 * T3c); + } + } + { + E T1u, T31, T1y, T2Z; + { + E T1s, T1t, T1w, T1x; + T1s = Ip[WS(rs, 10)]; + T1t = Im[WS(rs, 10)]; + T1u = T1s - T1t; + T31 = T1s + T1t; + T1w = Rp[WS(rs, 10)]; + T1x = Rm[WS(rs, 10)]; + T1y = T1w + T1x; + T2Z = T1w - T1x; + } + { + E T1r, T1v, T2Y, T30; + T1r = W[38]; + T1v = W[39]; + T1z = FNMS(T1v, T1y, T1r * T1u); + T4b = FMA(T1r, T1y, T1v * T1u); + T2Y = W[40]; + T30 = W[41]; + T32 = FMA(T2Y, T2Z, T30 * T31); + T4Q = FNMS(T30, T2Z, T2Y * T31); + } + } + { + E T1E, T37, T1I, T35; + { + E T1C, T1D, T1G, T1H; + T1C = Ip[WS(rs, 14)]; + T1D = Im[WS(rs, 14)]; + T1E = T1C - T1D; + T37 = T1C + T1D; + T1G = Rp[WS(rs, 14)]; + T1H = Rm[WS(rs, 14)]; + T1I = T1G + T1H; + T35 = T1G - T1H; + } + { + E T1B, T1F, T34, T36; + T1B = W[54]; + T1F = W[55]; + T1J = FNMS(T1F, T1I, T1B * T1E); + T4d = FMA(T1B, T1I, T1F * T1E); + T34 = W[56]; + T36 = W[57]; + T38 = FMA(T34, T35, T36 * T37); + T4S = FNMS(T36, T35, T34 * T37); + } + } + { + E T33, T3e, T4R, T4U; + T1A = T1q + T1z; + T4c = T4a + T4b; + T4f = T4d + T4e; + T1T = T1J + T1S; + T33 = T2X + T32; + T3e = T38 + T3d; + T3f = T33 + T3e; + T5M = T3e - T33; + { + E T7c, T7d, T6H, T6I; + T7c = T4S - T4T; + T7d = T3d - T38; + T7e = T7c + T7d; + T7l = T7c - T7d; + T6H = T4d - T4e; + T6I = T1J - T1S; + T6J = T6H + T6I; + T7x = T6H - T6I; + } + T4R = T4P + T4Q; + T4U = T4S + T4T; + T4V = T4R + T4U; + T5J = T4U - T4R; + { + E T79, T7a, T6E, T6F; + T79 = T32 - T2X; + T7a = T4P - T4Q; + T7b = T79 - T7a; + T7k = T7a + T79; + T6E = T1q - T1z; + T6F = T4a - T4b; + T6G = T6E - T6F; + T7w = T6F + T6E; + } + } + } + { + E T9, T4i, T3l, T4A, TB, T4m, T3B, T4E, Ti, T4j, T3q, T4B, Ts, T4l, T3w; + E T4D; + { + E T4, T3k, T8, T3i; + { + E T2, T3, T6, T7; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + T3k = T2 + T3; + T6 = Rp[WS(rs, 1)]; + T7 = Rm[WS(rs, 1)]; + T8 = T6 + T7; + T3i = T6 - T7; + } + { + E T1, T5, T3h, T3j; + T1 = W[2]; + T5 = W[3]; + T9 = FNMS(T5, T8, T1 * T4); + T4i = FMA(T1, T8, T5 * T4); + T3h = W[4]; + T3j = W[5]; + T3l = FMA(T3h, T3i, T3j * T3k); + T4A = FNMS(T3j, T3i, T3h * T3k); + } + } + { + E Tw, T3A, TA, T3y; + { + E Tu, Tv, Ty, Tz; + Tu = Ip[WS(rs, 13)]; + Tv = Im[WS(rs, 13)]; + Tw = Tu - Tv; + T3A = Tu + Tv; + Ty = Rp[WS(rs, 13)]; + Tz = Rm[WS(rs, 13)]; + TA = Ty + Tz; + T3y = Ty - Tz; + } + { + E Tt, Tx, T3x, T3z; + Tt = W[50]; + Tx = W[51]; + TB = FNMS(Tx, TA, Tt * Tw); + T4m = FMA(Tt, TA, Tx * Tw); + T3x = W[52]; + T3z = W[53]; + T3B = FMA(T3x, T3y, T3z * T3A); + T4E = FNMS(T3z, T3y, T3x * T3A); + } + } + { + E Td, T3p, Th, T3n; + { + E Tb, Tc, Tf, Tg; + Tb = Ip[WS(rs, 9)]; + Tc = Im[WS(rs, 9)]; + Td = Tb - Tc; + T3p = Tb + Tc; + Tf = Rp[WS(rs, 9)]; + Tg = Rm[WS(rs, 9)]; + Th = Tf + Tg; + T3n = Tf - Tg; + } + { + E Ta, Te, T3m, T3o; + Ta = W[34]; + Te = W[35]; + Ti = FNMS(Te, Th, Ta * Td); + T4j = FMA(Ta, Th, Te * Td); + T3m = W[36]; + T3o = W[37]; + T3q = FMA(T3m, T3n, T3o * T3p); + T4B = FNMS(T3o, T3n, T3m * T3p); + } + } + { + E Tn, T3v, Tr, T3t; + { + E Tl, Tm, Tp, Tq; + Tl = Ip[WS(rs, 5)]; + Tm = Im[WS(rs, 5)]; + Tn = Tl - Tm; + T3v = Tl + Tm; + Tp = Rp[WS(rs, 5)]; + Tq = Rm[WS(rs, 5)]; + Tr = Tp + Tq; + T3t = Tp - Tq; + } + { + E Tk, To, T3s, T3u; + Tk = W[18]; + To = W[19]; + Ts = FNMS(To, Tr, Tk * Tn); + T4l = FMA(Tk, Tr, To * Tn); + T3s = W[20]; + T3u = W[21]; + T3w = FMA(T3s, T3t, T3u * T3v); + T4D = FNMS(T3u, T3t, T3s * T3v); + } + } + Tj = T9 + Ti; + TC = Ts + TB; + T5r = Tj - TC; + T4k = T4i + T4j; + T4n = T4l + T4m; + T5s = T4k - T4n; + { + E T3r, T3C, T6T, T6U; + T3r = T3l + T3q; + T3C = T3w + T3B; + T3D = T3r + T3C; + T5C = T3C - T3r; + T6T = T4E - T4D; + T6U = T3w - T3B; + T6V = T6T + T6U; + T72 = T6T - T6U; + } + { + E T4C, T4F, T6s, T6t; + T4C = T4A + T4B; + T4F = T4D + T4E; + T4G = T4C + T4F; + T5F = T4F - T4C; + T6s = T4i - T4j; + T6t = Ts - TB; + T6u = T6s + T6t; + T86 = T6s - T6t; + } + { + E T6Q, T6R, T6p, T6q; + T6Q = T3q - T3l; + T6R = T4A - T4B; + T6S = T6Q - T6R; + T71 = T6R + T6Q; + T6p = T9 - Ti; + T6q = T4l - T4m; + T6r = T6p - T6q; + T85 = T6p + T6q; + } + } + { + E TM, T4p, T3I, T4H, T1e, T4t, T3Y, T4L, TV, T4q, T3N, T4I, T15, T4s, T3T; + E T4K; + { + E TH, T3H, TL, T3F; + { + E TF, TG, TJ, TK; + TF = Ip[WS(rs, 15)]; + TG = Im[WS(rs, 15)]; + TH = TF - TG; + T3H = TF + TG; + TJ = Rp[WS(rs, 15)]; + TK = Rm[WS(rs, 15)]; + TL = TJ + TK; + T3F = TJ - TK; + } + { + E TE, TI, T3E, T3G; + TE = W[58]; + TI = W[59]; + TM = FNMS(TI, TL, TE * TH); + T4p = FMA(TE, TL, TI * TH); + T3E = W[60]; + T3G = W[61]; + T3I = FMA(T3E, T3F, T3G * T3H); + T4H = FNMS(T3G, T3F, T3E * T3H); + } + } + { + E T19, T3X, T1d, T3V; + { + E T17, T18, T1b, T1c; + T17 = Ip[WS(rs, 11)]; + T18 = Im[WS(rs, 11)]; + T19 = T17 - T18; + T3X = T17 + T18; + T1b = Rp[WS(rs, 11)]; + T1c = Rm[WS(rs, 11)]; + T1d = T1b + T1c; + T3V = T1b - T1c; + } + { + E T16, T1a, T3U, T3W; + T16 = W[42]; + T1a = W[43]; + T1e = FNMS(T1a, T1d, T16 * T19); + T4t = FMA(T16, T1d, T1a * T19); + T3U = W[44]; + T3W = W[45]; + T3Y = FMA(T3U, T3V, T3W * T3X); + T4L = FNMS(T3W, T3V, T3U * T3X); + } + } + { + E TQ, T3M, TU, T3K; + { + E TO, TP, TS, TT; + TO = Ip[WS(rs, 7)]; + TP = Im[WS(rs, 7)]; + TQ = TO - TP; + T3M = TO + TP; + TS = Rp[WS(rs, 7)]; + TT = Rm[WS(rs, 7)]; + TU = TS + TT; + T3K = TS - TT; + } + { + E TN, TR, T3J, T3L; + TN = W[26]; + TR = W[27]; + TV = FNMS(TR, TU, TN * TQ); + T4q = FMA(TN, TU, TR * TQ); + T3J = W[28]; + T3L = W[29]; + T3N = FMA(T3J, T3K, T3L * T3M); + T4I = FNMS(T3L, T3K, T3J * T3M); + } + } + { + E T10, T3S, T14, T3Q; + { + E TY, TZ, T12, T13; + TY = Ip[WS(rs, 3)]; + TZ = Im[WS(rs, 3)]; + T10 = TY - TZ; + T3S = TY + TZ; + T12 = Rp[WS(rs, 3)]; + T13 = Rm[WS(rs, 3)]; + T14 = T12 + T13; + T3Q = T12 - T13; + } + { + E TX, T11, T3P, T3R; + TX = W[10]; + T11 = W[11]; + T15 = FNMS(T11, T14, TX * T10); + T4s = FMA(TX, T14, T11 * T10); + T3P = W[12]; + T3R = W[13]; + T3T = FMA(T3P, T3Q, T3R * T3S); + T4K = FNMS(T3R, T3Q, T3P * T3S); + } + } + TW = TM + TV; + T1f = T15 + T1e; + T5v = TW - T1f; + T4r = T4p + T4q; + T4u = T4s + T4t; + T5u = T4r - T4u; + { + E T3O, T3Z, T74, T75; + T3O = T3I + T3N; + T3Z = T3T + T3Y; + T40 = T3O + T3Z; + T5G = T3Z - T3O; + T74 = T4H - T4I; + T75 = T3Y - T3T; + T76 = T74 + T75; + T8k = T74 - T75; + } + { + E T4J, T4M, T6z, T6A; + T4J = T4H + T4I; + T4M = T4K + T4L; + T4N = T4J + T4M; + T5D = T4J - T4M; + T6z = T4p - T4q; + T6A = T15 - T1e; + T6B = T6z + T6A; + T89 = T6z - T6A; + } + { + E T6X, T6Y, T6w, T6x; + T6X = T3N - T3I; + T6Y = T4K - T4L; + T6Z = T6X - T6Y; + T8h = T6X + T6Y; + T6w = TM - TV; + T6x = T4s - T4t; + T6y = T6w - T6x; + T88 = T6w + T6x; + } + } + { + E T1h, T5i, T5c, T5m, T5f, T5n, T2s, T58, T42, T4y, T4w, T57, T54, T56, T4h; + E T5h; + { + E TD, T1g, T5a, T5b; + TD = Tj + TC; + T1g = TW + T1f; + T1h = TD + T1g; + T5i = TD - T1g; + T5a = T4N - T4G; + T5b = T3D - T40; + T5c = T5a + T5b; + T5m = T5a - T5b; + } + { + E T5d, T5e, T1U, T2r; + T5d = T3f + T2S; + T5e = T52 - T4V; + T5f = T5d - T5e; + T5n = T5d + T5e; + T1U = T1A + T1T; + T2r = T2d + T2q; + T2s = T1U + T2r; + T58 = T2r - T1U; + } + { + E T3g, T41, T4o, T4v; + T3g = T2S - T3f; + T41 = T3D + T40; + T42 = T3g - T41; + T4y = T41 + T3g; + T4o = T4k + T4n; + T4v = T4r + T4u; + T4w = T4o + T4v; + T57 = T4v - T4o; + } + { + E T4O, T53, T49, T4g; + T4O = T4G + T4N; + T53 = T4V + T52; + T54 = T4O - T53; + T56 = T4O + T53; + T49 = T45 + T48; + T4g = T4c + T4f; + T4h = T49 + T4g; + T5h = T49 - T4g; + } + { + E T2t, T55, T4x, T4z; + T2t = T1h + T2s; + Ip[0] = KP500000000 * (T2t + T42); + Im[WS(rs, 15)] = KP500000000 * (T42 - T2t); + T55 = T4h + T4w; + Rm[WS(rs, 15)] = KP500000000 * (T55 - T56); + Rp[0] = KP500000000 * (T55 + T56); + T4x = T4h - T4w; + Rm[WS(rs, 7)] = KP500000000 * (T4x - T4y); + Rp[WS(rs, 8)] = KP500000000 * (T4x + T4y); + T4z = T2s - T1h; + Ip[WS(rs, 8)] = KP500000000 * (T4z + T54); + Im[WS(rs, 7)] = KP500000000 * (T54 - T4z); + } + { + E T59, T5g, T5p, T5q; + T59 = KP500000000 * (T57 + T58); + T5g = KP353553390 * (T5c + T5f); + Ip[WS(rs, 4)] = T59 + T5g; + Im[WS(rs, 11)] = T5g - T59; + T5p = KP500000000 * (T5h + T5i); + T5q = KP353553390 * (T5m + T5n); + Rm[WS(rs, 11)] = T5p - T5q; + Rp[WS(rs, 4)] = T5p + T5q; + } + { + E T5j, T5k, T5l, T5o; + T5j = KP500000000 * (T5h - T5i); + T5k = KP353553390 * (T5f - T5c); + Rm[WS(rs, 3)] = T5j - T5k; + Rp[WS(rs, 12)] = T5j + T5k; + T5l = KP500000000 * (T58 - T57); + T5o = KP353553390 * (T5m - T5n); + Ip[WS(rs, 12)] = T5l + T5o; + Im[WS(rs, 3)] = T5o - T5l; + } + } + { + E T5x, T6g, T6a, T6k, T6d, T6l, T5A, T66, T5I, T60, T5T, T6f, T5W, T65, T5P; + E T61; + { + E T5t, T5w, T68, T69; + T5t = T5r - T5s; + T5w = T5u + T5v; + T5x = KP353553390 * (T5t + T5w); + T6g = KP353553390 * (T5t - T5w); + T68 = T5D - T5C; + T69 = T5G - T5F; + T6a = FMA(KP461939766, T68, KP191341716 * T69); + T6k = FNMS(KP461939766, T69, KP191341716 * T68); + } + { + E T6b, T6c, T5y, T5z; + T6b = T5K - T5J; + T6c = T5N - T5M; + T6d = FNMS(KP461939766, T6c, KP191341716 * T6b); + T6l = FMA(KP461939766, T6b, KP191341716 * T6c); + T5y = T4f - T4c; + T5z = T2q - T2d; + T5A = KP500000000 * (T5y + T5z); + T66 = KP500000000 * (T5z - T5y); + } + { + E T5E, T5H, T5R, T5S; + T5E = T5C + T5D; + T5H = T5F + T5G; + T5I = FMA(KP191341716, T5E, KP461939766 * T5H); + T60 = FNMS(KP191341716, T5H, KP461939766 * T5E); + T5R = T45 - T48; + T5S = T1A - T1T; + T5T = KP500000000 * (T5R + T5S); + T6f = KP500000000 * (T5R - T5S); + } + { + E T5U, T5V, T5L, T5O; + T5U = T5s + T5r; + T5V = T5u - T5v; + T5W = KP353553390 * (T5U + T5V); + T65 = KP353553390 * (T5V - T5U); + T5L = T5J + T5K; + T5O = T5M + T5N; + T5P = FNMS(KP191341716, T5O, KP461939766 * T5L); + T61 = FMA(KP191341716, T5L, KP461939766 * T5O); + } + { + E T5B, T5Q, T63, T64; + T5B = T5x + T5A; + T5Q = T5I + T5P; + Ip[WS(rs, 2)] = T5B + T5Q; + Im[WS(rs, 13)] = T5Q - T5B; + T63 = T5T + T5W; + T64 = T60 + T61; + Rm[WS(rs, 13)] = T63 - T64; + Rp[WS(rs, 2)] = T63 + T64; + } + { + E T5X, T5Y, T5Z, T62; + T5X = T5T - T5W; + T5Y = T5P - T5I; + Rm[WS(rs, 5)] = T5X - T5Y; + Rp[WS(rs, 10)] = T5X + T5Y; + T5Z = T5A - T5x; + T62 = T60 - T61; + Ip[WS(rs, 10)] = T5Z + T62; + Im[WS(rs, 5)] = T62 - T5Z; + } + { + E T67, T6e, T6n, T6o; + T67 = T65 + T66; + T6e = T6a + T6d; + Ip[WS(rs, 6)] = T67 + T6e; + Im[WS(rs, 9)] = T6e - T67; + T6n = T6f + T6g; + T6o = T6k + T6l; + Rm[WS(rs, 9)] = T6n - T6o; + Rp[WS(rs, 6)] = T6n + T6o; + } + { + E T6h, T6i, T6j, T6m; + T6h = T6f - T6g; + T6i = T6d - T6a; + Rm[WS(rs, 1)] = T6h - T6i; + Rp[WS(rs, 14)] = T6h + T6i; + T6j = T66 - T65; + T6m = T6k - T6l; + Ip[WS(rs, 14)] = T6j + T6m; + Im[WS(rs, 1)] = T6m - T6j; + } + } + { + E T6D, T7W, T6O, T7M, T7C, T7L, T7z, T7V, T7r, T81, T7H, T7T, T78, T80, T7G; + E T7Q; + { + E T6v, T6C, T7v, T7y; + T6v = FNMS(KP191341716, T6u, KP461939766 * T6r); + T6C = FMA(KP461939766, T6y, KP191341716 * T6B); + T6D = T6v + T6C; + T7W = T6v - T6C; + { + E T6K, T6N, T7A, T7B; + T6K = KP353553390 * (T6G + T6J); + T6N = KP500000000 * (T6L - T6M); + T6O = T6K + T6N; + T7M = T6N - T6K; + T7A = FMA(KP191341716, T6r, KP461939766 * T6u); + T7B = FNMS(KP191341716, T6y, KP461939766 * T6B); + T7C = T7A + T7B; + T7L = T7B - T7A; + } + T7v = KP500000000 * (T7t + T7u); + T7y = KP353553390 * (T7w + T7x); + T7z = T7v + T7y; + T7V = T7v - T7y; + { + E T7j, T7R, T7q, T7S, T7f, T7m; + T7f = KP707106781 * (T7b + T7e); + T7j = T7f + T7i; + T7R = T7i - T7f; + T7m = KP707106781 * (T7k + T7l); + T7q = T7m + T7p; + T7S = T7p - T7m; + T7r = FNMS(KP097545161, T7q, KP490392640 * T7j); + T81 = FMA(KP415734806, T7R, KP277785116 * T7S); + T7H = FMA(KP097545161, T7j, KP490392640 * T7q); + T7T = FNMS(KP415734806, T7S, KP277785116 * T7R); + } + { + E T70, T7O, T77, T7P, T6W, T73; + T6W = KP707106781 * (T6S + T6V); + T70 = T6W + T6Z; + T7O = T6Z - T6W; + T73 = KP707106781 * (T71 + T72); + T77 = T73 + T76; + T7P = T76 - T73; + T78 = FMA(KP490392640, T70, KP097545161 * T77); + T80 = FNMS(KP415734806, T7O, KP277785116 * T7P); + T7G = FNMS(KP097545161, T70, KP490392640 * T77); + T7Q = FMA(KP277785116, T7O, KP415734806 * T7P); + } + } + { + E T6P, T7s, T7J, T7K; + T6P = T6D + T6O; + T7s = T78 + T7r; + Ip[WS(rs, 1)] = T6P + T7s; + Im[WS(rs, 14)] = T7s - T6P; + T7J = T7z + T7C; + T7K = T7G + T7H; + Rm[WS(rs, 14)] = T7J - T7K; + Rp[WS(rs, 1)] = T7J + T7K; + } + { + E T7D, T7E, T7F, T7I; + T7D = T7z - T7C; + T7E = T7r - T78; + Rm[WS(rs, 6)] = T7D - T7E; + Rp[WS(rs, 9)] = T7D + T7E; + T7F = T6O - T6D; + T7I = T7G - T7H; + Ip[WS(rs, 9)] = T7F + T7I; + Im[WS(rs, 6)] = T7I - T7F; + } + { + E T7N, T7U, T83, T84; + T7N = T7L + T7M; + T7U = T7Q + T7T; + Ip[WS(rs, 5)] = T7N + T7U; + Im[WS(rs, 10)] = T7U - T7N; + T83 = T7V + T7W; + T84 = T80 + T81; + Rm[WS(rs, 10)] = T83 - T84; + Rp[WS(rs, 5)] = T83 + T84; + } + { + E T7X, T7Y, T7Z, T82; + T7X = T7V - T7W; + T7Y = T7T - T7Q; + Rm[WS(rs, 2)] = T7X - T7Y; + Rp[WS(rs, 13)] = T7X + T7Y; + T7Z = T7M - T7L; + T82 = T80 - T81; + Ip[WS(rs, 13)] = T7Z + T82; + Im[WS(rs, 2)] = T82 - T7Z; + } + } + { + E T8b, T8U, T8e, T8K, T8A, T8J, T8x, T8T, T8t, T8Z, T8F, T8R, T8m, T8Y, T8E; + E T8O; + { + E T87, T8a, T8v, T8w; + T87 = FNMS(KP461939766, T86, KP191341716 * T85); + T8a = FMA(KP191341716, T88, KP461939766 * T89); + T8b = T87 + T8a; + T8U = T87 - T8a; + { + E T8c, T8d, T8y, T8z; + T8c = KP353553390 * (T7x - T7w); + T8d = KP500000000 * (T6M + T6L); + T8e = T8c + T8d; + T8K = T8d - T8c; + T8y = FMA(KP461939766, T85, KP191341716 * T86); + T8z = FNMS(KP461939766, T88, KP191341716 * T89); + T8A = T8y + T8z; + T8J = T8z - T8y; + } + T8v = KP500000000 * (T7t - T7u); + T8w = KP353553390 * (T6G - T6J); + T8x = T8v + T8w; + T8T = T8v - T8w; + { + E T8p, T8P, T8s, T8Q, T8n, T8q; + T8n = KP707106781 * (T7l - T7k); + T8p = T8n + T8o; + T8P = T8o - T8n; + T8q = KP707106781 * (T7b - T7e); + T8s = T8q + T8r; + T8Q = T8r - T8q; + T8t = FNMS(KP277785116, T8s, KP415734806 * T8p); + T8Z = FMA(KP490392640, T8P, KP097545161 * T8Q); + T8F = FMA(KP277785116, T8p, KP415734806 * T8s); + T8R = FNMS(KP490392640, T8Q, KP097545161 * T8P); + } + { + E T8i, T8M, T8l, T8N, T8g, T8j; + T8g = KP707106781 * (T72 - T71); + T8i = T8g + T8h; + T8M = T8h - T8g; + T8j = KP707106781 * (T6S - T6V); + T8l = T8j + T8k; + T8N = T8k - T8j; + T8m = FMA(KP415734806, T8i, KP277785116 * T8l); + T8Y = FNMS(KP490392640, T8M, KP097545161 * T8N); + T8E = FNMS(KP277785116, T8i, KP415734806 * T8l); + T8O = FMA(KP097545161, T8M, KP490392640 * T8N); + } + } + { + E T8f, T8u, T8H, T8I; + T8f = T8b + T8e; + T8u = T8m + T8t; + Ip[WS(rs, 3)] = T8f + T8u; + Im[WS(rs, 12)] = T8u - T8f; + T8H = T8x + T8A; + T8I = T8E + T8F; + Rm[WS(rs, 12)] = T8H - T8I; + Rp[WS(rs, 3)] = T8H + T8I; + } + { + E T8B, T8C, T8D, T8G; + T8B = T8x - T8A; + T8C = T8t - T8m; + Rm[WS(rs, 4)] = T8B - T8C; + Rp[WS(rs, 11)] = T8B + T8C; + T8D = T8e - T8b; + T8G = T8E - T8F; + Ip[WS(rs, 11)] = T8D + T8G; + Im[WS(rs, 4)] = T8G - T8D; + } + { + E T8L, T8S, T91, T92; + T8L = T8J + T8K; + T8S = T8O + T8R; + Ip[WS(rs, 7)] = T8L + T8S; + Im[WS(rs, 8)] = T8S - T8L; + T91 = T8T + T8U; + T92 = T8Y + T8Z; + Rm[WS(rs, 8)] = T91 - T92; + Rp[WS(rs, 7)] = T91 + T92; + } + { + E T8V, T8W, T8X, T90; + T8V = T8T - T8U; + T8W = T8R - T8O; + Rm[0] = T8V - T8W; + Rp[WS(rs, 15)] = T8V + T8W; + T8X = T8K - T8J; + T90 = T8Y - T8Z; + Ip[WS(rs, 15)] = T8X + T90; + Im[0] = T90 - T8X; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 32, "hc2cfdft_32", twinstr, &GENUS, {404, 134, 94, 0} }; + +void X(codelet_hc2cfdft_32) (planner *p) { + X(khc2c_register) (p, hc2cfdft_32, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_4.c new file mode 100644 index 000000000..e696c669f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_4.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -dit -name hc2cfdft_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 30 FP additions, 20 FP multiplications, + * (or, 24 additions, 14 multiplications, 6 fused multiply/add), + * 31 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E Td, Tl, Tu, Tk, TC, Tf, Tj, T4, Tr, T9, To, T5, Tv, Tp, TA; + E Tb, Tc; + Tb = Ip[0]; + Tc = Im[0]; + Td = Tb - Tc; + Tl = Tb + Tc; + { + E Tg, Th, Ti, T1, Tn; + Tg = Rm[0]; + Th = Rp[0]; + Ti = Tg - Th; + Tu = Th + Tg; + Tk = W[1]; + TC = Tk * Ti; + Tf = W[0]; + Tj = Tf * Ti; + { + E T2, T3, T7, T8; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + Tr = T2 + T3; + T7 = Rp[WS(rs, 1)]; + T8 = Rm[WS(rs, 1)]; + T9 = T7 + T8; + To = T7 - T8; + } + T1 = W[2]; + T5 = T1 * T4; + Tv = T1 * T9; + Tn = W[4]; + Tp = Tn * To; + TA = Tn * Tr; + } + { + E Tm, TD, Ta, Tw, Ts, TB, T6, Tq; + Tm = FNMS(Tk, Tl, Tj); + TD = FMA(Tf, Tl, TC); + T6 = W[3]; + Ta = FNMS(T6, T9, T5); + Tw = FMA(T6, T4, Tv); + Tq = W[5]; + Ts = FMA(Tq, Tr, Tp); + TB = FNMS(Tq, To, TA); + { + E Te, Tt, TF, TG; + Te = Ta + Td; + Tt = Tm - Ts; + Ip[0] = KP500000000 * (Te + Tt); + Im[WS(rs, 1)] = KP500000000 * (Tt - Te); + TF = Tu + Tw; + TG = TB + TD; + Rm[WS(rs, 1)] = KP500000000 * (TF - TG); + Rp[0] = KP500000000 * (TF + TG); + } + { + E Tx, Ty, Tz, TE; + Tx = Tu - Tw; + Ty = Ts + Tm; + Rm[0] = KP500000000 * (Tx - Ty); + Rp[WS(rs, 1)] = KP500000000 * (Tx + Ty); + Tz = Td - Ta; + TE = TB - TD; + Ip[WS(rs, 1)] = KP500000000 * (Tz + TE); + Im[0] = KP500000000 * (TE - Tz); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cfdft_4", twinstr, &GENUS, {24, 14, 6, 0} }; + +void X(codelet_hc2cfdft_4) (planner *p) { + X(khc2c_register) (p, hc2cfdft_4, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 4 -dit -name hc2cfdft_4 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 30 FP additions, 20 FP multiplications, + * (or, 24 additions, 14 multiplications, 6 fused multiply/add), + * 18 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E Tc, Tr, Tk, Tx, T9, Ts, Tp, Tw; + { + E Ta, Tb, Tj, Tf, Tg, Th, Te, Ti; + Ta = Ip[0]; + Tb = Im[0]; + Tj = Ta + Tb; + Tf = Rm[0]; + Tg = Rp[0]; + Th = Tf - Tg; + Tc = Ta - Tb; + Tr = Tg + Tf; + Te = W[0]; + Ti = W[1]; + Tk = FNMS(Ti, Tj, Te * Th); + Tx = FMA(Ti, Th, Te * Tj); + } + { + E T4, To, T8, Tm; + { + E T2, T3, T6, T7; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + To = T2 + T3; + T6 = Rp[WS(rs, 1)]; + T7 = Rm[WS(rs, 1)]; + T8 = T6 + T7; + Tm = T6 - T7; + } + { + E T1, T5, Tl, Tn; + T1 = W[2]; + T5 = W[3]; + T9 = FNMS(T5, T8, T1 * T4); + Ts = FMA(T1, T8, T5 * T4); + Tl = W[4]; + Tn = W[5]; + Tp = FMA(Tl, Tm, Tn * To); + Tw = FNMS(Tn, Tm, Tl * To); + } + } + { + E Td, Tq, Tz, TA; + Td = T9 + Tc; + Tq = Tk - Tp; + Ip[0] = KP500000000 * (Td + Tq); + Im[WS(rs, 1)] = KP500000000 * (Tq - Td); + Tz = Tr + Ts; + TA = Tw + Tx; + Rm[WS(rs, 1)] = KP500000000 * (Tz - TA); + Rp[0] = KP500000000 * (Tz + TA); + } + { + E Tt, Tu, Tv, Ty; + Tt = Tr - Ts; + Tu = Tp + Tk; + Rm[0] = KP500000000 * (Tt - Tu); + Rp[WS(rs, 1)] = KP500000000 * (Tt + Tu); + Tv = Tc - T9; + Ty = Tw - Tx; + Ip[WS(rs, 1)] = KP500000000 * (Tv + Ty); + Im[0] = KP500000000 * (Ty - Tv); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 4, "hc2cfdft_4", twinstr, &GENUS, {24, 14, 6, 0} }; + +void X(codelet_hc2cfdft_4) (planner *p) { + X(khc2c_register) (p, hc2cfdft_4, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_6.c new file mode 100644 index 000000000..b372cfc7c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_6.c @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -dit -name hc2cfdft_6 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 58 FP additions, 44 FP multiplications, + * (or, 36 additions, 22 multiplications, 22 fused multiply/add), + * 27 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E T3, TQ, TJ, T12, Tu, TX, TB, T10, Td, TS, Tk, TV; + { + E T1, T2, TI, TD, TE, TF; + T1 = Ip[0]; + T2 = Im[0]; + TI = T1 + T2; + TD = Rm[0]; + TE = Rp[0]; + TF = TD - TE; + T3 = T1 - T2; + TQ = TE + TD; + { + E TC, TG, TH, T11; + TC = W[0]; + TG = TC * TF; + TH = W[1]; + T11 = TH * TF; + TJ = FNMS(TH, TI, TG); + T12 = FMA(TC, TI, T11); + } + } + { + E To, TA, Tt, Tx; + { + E Tm, Tn, Tr, Ts; + Tm = Rm[WS(rs, 2)]; + Tn = Rp[WS(rs, 2)]; + To = Tm - Tn; + TA = Tn + Tm; + Tr = Ip[WS(rs, 2)]; + Ts = Im[WS(rs, 2)]; + Tt = Tr + Ts; + Tx = Tr - Ts; + } + { + E Tp, TW, Tl, Tq; + Tl = W[8]; + Tp = Tl * To; + TW = Tl * Tt; + Tq = W[9]; + Tu = FNMS(Tq, Tt, Tp); + TX = FMA(Tq, To, TW); + } + { + E Tw, Ty, Tz, TZ; + Tw = W[6]; + Ty = Tw * Tx; + Tz = W[7]; + TZ = Tz * Tx; + TB = FNMS(Tz, TA, Ty); + T10 = FMA(Tw, TA, TZ); + } + } + { + E T7, Tg, Tc, Tj; + { + E T5, T6, Ta, Tb; + T5 = Ip[WS(rs, 1)]; + T6 = Im[WS(rs, 1)]; + T7 = T5 + T6; + Tg = T5 - T6; + Ta = Rp[WS(rs, 1)]; + Tb = Rm[WS(rs, 1)]; + Tc = Ta - Tb; + Tj = Ta + Tb; + } + { + E T4, T8, T9, TR; + T4 = W[5]; + T8 = T4 * T7; + T9 = W[4]; + TR = T9 * T7; + Td = FMA(T9, Tc, T8); + TS = FNMS(T4, Tc, TR); + } + { + E Tf, Th, Ti, TU; + Tf = W[2]; + Th = Tf * Tg; + Ti = W[3]; + TU = Ti * Tg; + Tk = FNMS(Ti, Tj, Th); + TV = FMA(Tf, Tj, TU); + } + } + { + E Te, T1d, TL, T1g, T1c, T1e, T19, T1f; + Te = T3 - Td; + T1d = TQ + TS; + { + E Tv, TK, T1a, T1b; + Tv = Tk + Tu; + TK = TB + TJ; + TL = Tv + TK; + T1g = Tv - TK; + T1a = TV + TX; + T1b = T10 + T12; + T1c = T1a - T1b; + T1e = T1a + T1b; + } + Ip[0] = KP500000000 * (Te + TL); + Rp[0] = KP500000000 * (T1d + T1e); + T19 = FNMS(KP500000000, TL, Te); + Ip[WS(rs, 2)] = KP500000000 * (FMA(KP866025403, T1c, T19)); + Im[WS(rs, 1)] = -(KP500000000 * (FNMS(KP866025403, T1c, T19))); + T1f = FNMS(KP500000000, T1e, T1d); + Rp[WS(rs, 2)] = KP500000000 * (FNMS(KP866025403, T1g, T1f)); + Rm[WS(rs, 1)] = KP500000000 * (FMA(KP866025403, T1g, T1f)); + } + { + E TP, TT, TO, T16, T14, T18, T15, T17; + TP = Td + T3; + TT = TQ - TS; + { + E TM, TN, TY, T13; + TM = Tu - Tk; + TN = TJ - TB; + TO = TM + TN; + T16 = TN - TM; + TY = TV - TX; + T13 = T10 - T12; + T14 = TY + T13; + T18 = T13 - TY; + } + Im[WS(rs, 2)] = KP500000000 * (TO - TP); + Rm[WS(rs, 2)] = KP500000000 * (TT + T14); + T15 = FNMS(KP500000000, T14, TT); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP866025403, T16, T15)); + Rm[0] = KP500000000 * (FNMS(KP866025403, T16, T15)); + T17 = FMA(KP500000000, TO, TP); + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP866025403, T18, T17)); + Im[0] = -(KP500000000 * (FNMS(KP866025403, T18, T17))); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cfdft_6", twinstr, &GENUS, {36, 22, 22, 0} }; + +void X(codelet_hc2cfdft_6) (planner *p) { + X(khc2c_register) (p, hc2cfdft_6, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 6 -dit -name hc2cfdft_6 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 58 FP additions, 36 FP multiplications, + * (or, 44 additions, 22 multiplications, 14 fused multiply/add), + * 40 stack variables, 3 constants, and 24 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP433012701, +0.433012701892219323381861585376468091735701313); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 10, MAKE_VOLATILE_STRIDE(24, rs)) { + E T3, TM, Tc, TN, Ts, T10, TI, TR, TF, T11, TH, TU; + { + E T1, T2, TD, Tz, TA, TB, T7, Tf, Tb, Th, Tq, Tw, Tm, Tu, T4; + E T8; + { + E T5, T6, T9, Ta; + T1 = Ip[0]; + T2 = Im[0]; + TD = T1 + T2; + Tz = Rm[0]; + TA = Rp[0]; + TB = Tz - TA; + T5 = Ip[WS(rs, 1)]; + T6 = Im[WS(rs, 1)]; + T7 = T5 + T6; + Tf = T5 - T6; + T9 = Rp[WS(rs, 1)]; + Ta = Rm[WS(rs, 1)]; + Tb = T9 - Ta; + Th = T9 + Ta; + { + E To, Tp, Tk, Tl; + To = Rp[WS(rs, 2)]; + Tp = Rm[WS(rs, 2)]; + Tq = To - Tp; + Tw = To + Tp; + Tk = Ip[WS(rs, 2)]; + Tl = Im[WS(rs, 2)]; + Tm = Tk + Tl; + Tu = Tk - Tl; + } + } + T3 = T1 - T2; + TM = TA + Tz; + T4 = W[5]; + T8 = W[4]; + Tc = FMA(T4, T7, T8 * Tb); + TN = FNMS(T4, Tb, T8 * T7); + { + E Ti, TP, Tr, TQ; + { + E Te, Tg, Tj, Tn; + Te = W[2]; + Tg = W[3]; + Ti = FNMS(Tg, Th, Te * Tf); + TP = FMA(Tg, Tf, Te * Th); + Tj = W[9]; + Tn = W[8]; + Tr = FMA(Tj, Tm, Tn * Tq); + TQ = FNMS(Tj, Tq, Tn * Tm); + } + Ts = Ti - Tr; + T10 = TP + TQ; + TI = Ti + Tr; + TR = TP - TQ; + } + { + E Tx, TS, TE, TT; + { + E Tt, Tv, Ty, TC; + Tt = W[6]; + Tv = W[7]; + Tx = FNMS(Tv, Tw, Tt * Tu); + TS = FMA(Tv, Tu, Tt * Tw); + Ty = W[0]; + TC = W[1]; + TE = FNMS(TC, TD, Ty * TB); + TT = FMA(TC, TB, Ty * TD); + } + TF = Tx + TE; + T11 = TS + TT; + TH = TE - Tx; + TU = TS - TT; + } + } + { + E T12, Td, TG, TZ; + T12 = KP433012701 * (T10 - T11); + Td = T3 - Tc; + TG = Ts + TF; + TZ = FNMS(KP250000000, TG, KP500000000 * Td); + Ip[0] = KP500000000 * (Td + TG); + Im[WS(rs, 1)] = T12 - TZ; + Ip[WS(rs, 2)] = TZ + T12; + } + { + E T16, T13, T14, T15; + T16 = KP433012701 * (Ts - TF); + T13 = TM + TN; + T14 = T10 + T11; + T15 = FNMS(KP250000000, T14, KP500000000 * T13); + Rp[WS(rs, 2)] = T15 - T16; + Rp[0] = KP500000000 * (T13 + T14); + Rm[WS(rs, 1)] = T16 + T15; + } + { + E TY, TJ, TK, TX; + TY = KP433012701 * (TU - TR); + TJ = TH - TI; + TK = Tc + T3; + TX = FMA(KP500000000, TK, KP250000000 * TJ); + Im[WS(rs, 2)] = KP500000000 * (TJ - TK); + Im[0] = TY - TX; + Ip[WS(rs, 1)] = TX + TY; + } + { + E TL, TO, TV, TW; + TL = KP433012701 * (TI + TH); + TO = TM - TN; + TV = TR + TU; + TW = FNMS(KP250000000, TV, KP500000000 * TO); + Rp[WS(rs, 1)] = TL + TW; + Rm[WS(rs, 2)] = KP500000000 * (TO + TV); + Rm[0] = TW - TL; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 6, "hc2cfdft_6", twinstr, &GENUS, {44, 22, 14, 0} }; + +void X(codelet_hc2cfdft_6) (planner *p) { + X(khc2c_register) (p, hc2cfdft_6, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_8.c new file mode 100644 index 000000000..5fcc13573 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hc2cfdft_8.c @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:07:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -dit -name hc2cfdft_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 82 FP additions, 52 FP multiplications, + * (or, 60 additions, 30 multiplications, 22 fused multiply/add), + * 31 stack variables, 2 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E Ty, T14, TO, T1o, Tv, T16, TG, T1m, Ta, T19, TV, T1h, Tk, T1b, T11; + E T1j; + { + E Tw, Tx, TN, TI, TJ, TK; + Tw = Ip[0]; + Tx = Im[0]; + TN = Tw + Tx; + TI = Rm[0]; + TJ = Rp[0]; + TK = TI - TJ; + Ty = Tw - Tx; + T14 = TJ + TI; + { + E TH, TL, TM, T1n; + TH = W[0]; + TL = TH * TK; + TM = W[1]; + T1n = TM * TK; + TO = FNMS(TM, TN, TL); + T1o = FMA(TH, TN, T1n); + } + } + { + E Tp, TF, Tu, TC; + { + E Tn, To, Ts, Tt; + Tn = Ip[WS(rs, 2)]; + To = Im[WS(rs, 2)]; + Tp = Tn - To; + TF = Tn + To; + Ts = Rp[WS(rs, 2)]; + Tt = Rm[WS(rs, 2)]; + Tu = Ts + Tt; + TC = Tt - Ts; + } + { + E Tq, T15, Tm, Tr; + Tm = W[6]; + Tq = Tm * Tp; + T15 = Tm * Tu; + Tr = W[7]; + Tv = FNMS(Tr, Tu, Tq); + T16 = FMA(Tr, Tp, T15); + } + { + E TB, TD, TE, T1l; + TB = W[8]; + TD = TB * TC; + TE = W[9]; + T1l = TE * TC; + TG = FNMS(TE, TF, TD); + T1m = FMA(TB, TF, T1l); + } + } + { + E T4, TU, T9, TR; + { + E T2, T3, T7, T8; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + TU = T2 + T3; + T7 = Rp[WS(rs, 1)]; + T8 = Rm[WS(rs, 1)]; + T9 = T7 + T8; + TR = T7 - T8; + } + { + E T5, T18, T1, T6; + T1 = W[2]; + T5 = T1 * T4; + T18 = T1 * T9; + T6 = W[3]; + Ta = FNMS(T6, T9, T5); + T19 = FMA(T6, T4, T18); + } + { + E TS, T1g, TQ, TT; + TQ = W[4]; + TS = TQ * TR; + T1g = TQ * TU; + TT = W[5]; + TV = FMA(TT, TU, TS); + T1h = FNMS(TT, TR, T1g); + } + } + { + E Te, T10, Tj, TX; + { + E Tc, Td, Th, Ti; + Tc = Ip[WS(rs, 3)]; + Td = Im[WS(rs, 3)]; + Te = Tc - Td; + T10 = Tc + Td; + Th = Rp[WS(rs, 3)]; + Ti = Rm[WS(rs, 3)]; + Tj = Th + Ti; + TX = Th - Ti; + } + { + E Tf, T1a, Tb, Tg; + Tb = W[10]; + Tf = Tb * Te; + T1a = Tb * Tj; + Tg = W[11]; + Tk = FNMS(Tg, Tj, Tf); + T1b = FMA(Tg, Te, T1a); + } + { + E TY, T1i, TW, TZ; + TW = W[12]; + TY = TW * TX; + T1i = TW * T10; + TZ = W[13]; + T11 = FMA(TZ, T10, TY); + T1j = FNMS(TZ, TX, T1i); + } + } + { + E TA, T1f, T1q, T1s, T13, T1e, T1d, T1r; + { + E Tl, Tz, T1k, T1p; + Tl = Ta + Tk; + Tz = Tv + Ty; + TA = Tl + Tz; + T1f = Tz - Tl; + T1k = T1h + T1j; + T1p = T1m + T1o; + T1q = T1k - T1p; + T1s = T1k + T1p; + } + { + E TP, T12, T17, T1c; + TP = TG + TO; + T12 = TV + T11; + T13 = TP - T12; + T1e = T12 + TP; + T17 = T14 + T16; + T1c = T19 + T1b; + T1d = T17 - T1c; + T1r = T17 + T1c; + } + Ip[0] = KP500000000 * (TA + T13); + Rp[0] = KP500000000 * (T1r + T1s); + Im[WS(rs, 3)] = KP500000000 * (T13 - TA); + Rm[WS(rs, 3)] = KP500000000 * (T1r - T1s); + Rm[WS(rs, 1)] = KP500000000 * (T1d - T1e); + Im[WS(rs, 1)] = KP500000000 * (T1q - T1f); + Rp[WS(rs, 2)] = KP500000000 * (T1d + T1e); + Ip[WS(rs, 2)] = KP500000000 * (T1f + T1q); + } + { + E T1v, T1H, T1F, T1L, T1y, T1I, T1B, T1J; + { + E T1t, T1u, T1D, T1E; + T1t = Ty - Tv; + T1u = T19 - T1b; + T1v = T1t - T1u; + T1H = T1u + T1t; + T1D = T14 - T16; + T1E = Ta - Tk; + T1F = T1D - T1E; + T1L = T1D + T1E; + } + { + E T1w, T1x, T1z, T1A; + T1w = T1j - T1h; + T1x = TV - T11; + T1y = T1w + T1x; + T1I = T1w - T1x; + T1z = TO - TG; + T1A = T1o - T1m; + T1B = T1z - T1A; + T1J = T1z + T1A; + } + { + E T1C, T1M, T1G, T1K; + T1C = T1y + T1B; + Ip[WS(rs, 1)] = KP500000000 * (FMA(KP707106781, T1C, T1v)); + Im[WS(rs, 2)] = -(KP500000000 * (FNMS(KP707106781, T1C, T1v))); + T1M = T1I + T1J; + Rm[WS(rs, 2)] = KP500000000 * (FNMS(KP707106781, T1M, T1L)); + Rp[WS(rs, 1)] = KP500000000 * (FMA(KP707106781, T1M, T1L)); + T1G = T1B - T1y; + Rm[0] = KP500000000 * (FNMS(KP707106781, T1G, T1F)); + Rp[WS(rs, 3)] = KP500000000 * (FMA(KP707106781, T1G, T1F)); + T1K = T1I - T1J; + Ip[WS(rs, 3)] = KP500000000 * (FMA(KP707106781, T1K, T1H)); + Im[0] = -(KP500000000 * (FNMS(KP707106781, T1K, T1H))); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cfdft_8", twinstr, &GENUS, {60, 30, 22, 0} }; + +void X(codelet_hc2cfdft_8) (planner *p) { + X(khc2c_register) (p, hc2cfdft_8, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft.native -compact -variables 4 -pipeline-latency 4 -n 8 -dit -name hc2cfdft_8 -include rdft/scalar/hc2cf.h */ + +/* + * This function contains 82 FP additions, 44 FP multiplications, + * (or, 68 additions, 30 multiplications, 14 fused multiply/add), + * 39 stack variables, 2 constants, and 32 memory accesses + */ +#include "rdft/scalar/hc2cf.h" + +static void hc2cfdft_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, Rp = Rp + ms, Ip = Ip + ms, Rm = Rm - ms, Im = Im - ms, W = W + 14, MAKE_VOLATILE_STRIDE(32, rs)) { + E Tv, TX, Ts, TY, TE, T1a, TJ, T19, T1l, T1m, T9, T10, Ti, T11, TP; + E T16, TU, T17, T1i, T1j; + { + E Tt, Tu, TD, Tz, TA, TB, Tn, TI, Tr, TG, Tk, To; + Tt = Ip[0]; + Tu = Im[0]; + TD = Tt + Tu; + Tz = Rm[0]; + TA = Rp[0]; + TB = Tz - TA; + { + E Tl, Tm, Tp, Tq; + Tl = Ip[WS(rs, 2)]; + Tm = Im[WS(rs, 2)]; + Tn = Tl - Tm; + TI = Tl + Tm; + Tp = Rp[WS(rs, 2)]; + Tq = Rm[WS(rs, 2)]; + Tr = Tp + Tq; + TG = Tp - Tq; + } + Tv = Tt - Tu; + TX = TA + Tz; + Tk = W[6]; + To = W[7]; + Ts = FNMS(To, Tr, Tk * Tn); + TY = FMA(Tk, Tr, To * Tn); + { + E Ty, TC, TF, TH; + Ty = W[0]; + TC = W[1]; + TE = FNMS(TC, TD, Ty * TB); + T1a = FMA(TC, TB, Ty * TD); + TF = W[8]; + TH = W[9]; + TJ = FMA(TF, TG, TH * TI); + T19 = FNMS(TH, TG, TF * TI); + } + T1l = TJ + TE; + T1m = T1a - T19; + } + { + E T4, TO, T8, TM, Td, TT, Th, TR; + { + E T2, T3, T6, T7; + T2 = Ip[WS(rs, 1)]; + T3 = Im[WS(rs, 1)]; + T4 = T2 - T3; + TO = T2 + T3; + T6 = Rp[WS(rs, 1)]; + T7 = Rm[WS(rs, 1)]; + T8 = T6 + T7; + TM = T6 - T7; + } + { + E Tb, Tc, Tf, Tg; + Tb = Ip[WS(rs, 3)]; + Tc = Im[WS(rs, 3)]; + Td = Tb - Tc; + TT = Tb + Tc; + Tf = Rp[WS(rs, 3)]; + Tg = Rm[WS(rs, 3)]; + Th = Tf + Tg; + TR = Tf - Tg; + } + { + E T1, T5, Ta, Te; + T1 = W[2]; + T5 = W[3]; + T9 = FNMS(T5, T8, T1 * T4); + T10 = FMA(T1, T8, T5 * T4); + Ta = W[10]; + Te = W[11]; + Ti = FNMS(Te, Th, Ta * Td); + T11 = FMA(Ta, Th, Te * Td); + { + E TL, TN, TQ, TS; + TL = W[4]; + TN = W[5]; + TP = FMA(TL, TM, TN * TO); + T16 = FNMS(TN, TM, TL * TO); + TQ = W[12]; + TS = W[13]; + TU = FMA(TQ, TR, TS * TT); + T17 = FNMS(TS, TR, TQ * TT); + } + T1i = T17 - T16; + T1j = TP - TU; + } + } + { + E T1h, T1t, T1w, T1y, T1o, T1s, T1r, T1x; + { + E T1f, T1g, T1u, T1v; + T1f = Tv - Ts; + T1g = T10 - T11; + T1h = KP500000000 * (T1f - T1g); + T1t = KP500000000 * (T1g + T1f); + T1u = T1i - T1j; + T1v = T1l + T1m; + T1w = KP353553390 * (T1u - T1v); + T1y = KP353553390 * (T1u + T1v); + } + { + E T1k, T1n, T1p, T1q; + T1k = T1i + T1j; + T1n = T1l - T1m; + T1o = KP353553390 * (T1k + T1n); + T1s = KP353553390 * (T1n - T1k); + T1p = TX - TY; + T1q = T9 - Ti; + T1r = KP500000000 * (T1p - T1q); + T1x = KP500000000 * (T1p + T1q); + } + Ip[WS(rs, 1)] = T1h + T1o; + Rp[WS(rs, 1)] = T1x + T1y; + Im[WS(rs, 2)] = T1o - T1h; + Rm[WS(rs, 2)] = T1x - T1y; + Rm[0] = T1r - T1s; + Im[0] = T1w - T1t; + Rp[WS(rs, 3)] = T1r + T1s; + Ip[WS(rs, 3)] = T1t + T1w; + } + { + E Tx, T15, T1c, T1e, TW, T14, T13, T1d; + { + E Tj, Tw, T18, T1b; + Tj = T9 + Ti; + Tw = Ts + Tv; + Tx = Tj + Tw; + T15 = Tw - Tj; + T18 = T16 + T17; + T1b = T19 + T1a; + T1c = T18 - T1b; + T1e = T18 + T1b; + } + { + E TK, TV, TZ, T12; + TK = TE - TJ; + TV = TP + TU; + TW = TK - TV; + T14 = TV + TK; + TZ = TX + TY; + T12 = T10 + T11; + T13 = TZ - T12; + T1d = TZ + T12; + } + Ip[0] = KP500000000 * (Tx + TW); + Rp[0] = KP500000000 * (T1d + T1e); + Im[WS(rs, 3)] = KP500000000 * (TW - Tx); + Rm[WS(rs, 3)] = KP500000000 * (T1d - T1e); + Rm[WS(rs, 1)] = KP500000000 * (T13 - T14); + Im[WS(rs, 1)] = KP500000000 * (T1c - T15); + Rp[WS(rs, 2)] = KP500000000 * (T13 + T14); + Ip[WS(rs, 2)] = KP500000000 * (T15 + T1c); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2c_desc desc = { 8, "hc2cfdft_8", twinstr, &GENUS, {68, 30, 14, 0} }; + +void X(codelet_hc2cfdft_8) (planner *p) { + X(khc2c_register) (p, hc2cfdft_8, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_16.c new file mode 100644 index 000000000..21b82b390 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_16.c @@ -0,0 +1,836 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:35 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -dit -name hf2_16 -include rdft/scalar/hf.h */ + +/* + * This function contains 196 FP additions, 134 FP multiplications, + * (or, 104 additions, 42 multiplications, 92 fused multiply/add), + * 90 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(32, rs)) { + E T2, Tf, TM, TO, T3, T6, T5, Th, Tz, Ti, T7, TZ, TT, Tq, TW; + E Tb, Tu, TP, TI, TF, TC, T1z, T1O, T1D, T1L, Tm, T1f, T1p, T1j, T1m; + { + E TN, TS, T4, Tp, Ta, Tt, Tl, Tg; + T2 = W[0]; + Tf = W[2]; + Tg = T2 * Tf; + TM = W[6]; + TN = T2 * TM; + TO = W[7]; + TS = T2 * TO; + T3 = W[4]; + T4 = T2 * T3; + Tp = Tf * T3; + T6 = W[5]; + Ta = T2 * T6; + Tt = Tf * T6; + T5 = W[1]; + Th = W[3]; + Tl = T2 * Th; + Tz = FMA(T5, Th, Tg); + Ti = FNMS(T5, Th, Tg); + T7 = FMA(T5, T6, T4); + TZ = FNMS(Th, T3, Tt); + TT = FNMS(T5, TM, TS); + Tq = FNMS(Th, T6, Tp); + TW = FMA(Th, T6, Tp); + Tb = FNMS(T5, T3, Ta); + Tu = FMA(Th, T3, Tt); + TP = FMA(T5, TO, TN); + TI = FMA(T5, T3, Ta); + TF = FNMS(T5, T6, T4); + { + E T1y, T1C, T1e, T1i; + T1y = Tz * T3; + T1C = Tz * T6; + TC = FNMS(T5, Tf, Tl); + T1z = FMA(TC, T6, T1y); + T1O = FMA(TC, T3, T1C); + T1D = FNMS(TC, T3, T1C); + T1L = FNMS(TC, T6, T1y); + T1e = Ti * T3; + T1i = Ti * T6; + Tm = FMA(T5, Tf, Tl); + T1f = FMA(Tm, T6, T1e); + T1p = FMA(Tm, T3, T1i); + T1j = FNMS(Tm, T3, T1i); + T1m = FNMS(Tm, T6, T1e); + } + } + { + E Te, T1U, T3A, T3M, T1G, T2w, T2I, T3h, T1R, T2D, T2B, T3i, Tx, T3L, T1Z; + E T3w, TL, T21, T26, T38, T1d, T2h, T2s, T3c, T1s, T2t, T2m, T3d, T12, T28; + E T2d, T37; + { + E T1, T3z, T8, T9, Tc, T3x, Td, T3y; + T1 = cr[0]; + T3z = ci[0]; + T8 = cr[WS(rs, 8)]; + T9 = T7 * T8; + Tc = ci[WS(rs, 8)]; + T3x = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Te = T1 + Td; + T1U = T1 - Td; + T3y = FNMS(Tb, T8, T3x); + T3A = T3y + T3z; + T3M = T3z - T3y; + } + { + E T1u, T1v, T1w, T2E, T1A, T1B, T1E, T2G; + T1u = cr[WS(rs, 15)]; + T1v = TM * T1u; + T1w = ci[WS(rs, 15)]; + T2E = TM * T1w; + T1A = cr[WS(rs, 7)]; + T1B = T1z * T1A; + T1E = ci[WS(rs, 7)]; + T2G = T1z * T1E; + { + E T1x, T1F, T2F, T2H; + T1x = FMA(TO, T1w, T1v); + T1F = FMA(T1D, T1E, T1B); + T1G = T1x + T1F; + T2w = T1x - T1F; + T2F = FNMS(TO, T1u, T2E); + T2H = FNMS(T1D, T1A, T2G); + T2I = T2F - T2H; + T3h = T2F + T2H; + } + } + { + E T1H, T1I, T1J, T2x, T1M, T1N, T1P, T2z; + T1H = cr[WS(rs, 3)]; + T1I = Tf * T1H; + T1J = ci[WS(rs, 3)]; + T2x = Tf * T1J; + T1M = cr[WS(rs, 11)]; + T1N = T1L * T1M; + T1P = ci[WS(rs, 11)]; + T2z = T1L * T1P; + { + E T1K, T1Q, T2y, T2A; + T1K = FMA(Th, T1J, T1I); + T1Q = FMA(T1O, T1P, T1N); + T1R = T1K + T1Q; + T2D = T1Q - T1K; + T2y = FNMS(Th, T1H, T2x); + T2A = FNMS(T1O, T1M, T2z); + T2B = T2y - T2A; + T3i = T2y + T2A; + } + } + { + E Tj, Tk, Tn, T1V, Tr, Ts, Tv, T1X; + Tj = cr[WS(rs, 4)]; + Tk = Ti * Tj; + Tn = ci[WS(rs, 4)]; + T1V = Ti * Tn; + Tr = cr[WS(rs, 12)]; + Ts = Tq * Tr; + Tv = ci[WS(rs, 12)]; + T1X = Tq * Tv; + { + E To, Tw, T1W, T1Y; + To = FMA(Tm, Tn, Tk); + Tw = FMA(Tu, Tv, Ts); + Tx = To + Tw; + T3L = To - Tw; + T1W = FNMS(Tm, Tj, T1V); + T1Y = FNMS(Tu, Tr, T1X); + T1Z = T1W - T1Y; + T3w = T1W + T1Y; + } + } + { + E TA, TB, TD, T22, TG, TH, TJ, T24; + TA = cr[WS(rs, 2)]; + TB = Tz * TA; + TD = ci[WS(rs, 2)]; + T22 = Tz * TD; + TG = cr[WS(rs, 10)]; + TH = TF * TG; + TJ = ci[WS(rs, 10)]; + T24 = TF * TJ; + { + E TE, TK, T23, T25; + TE = FMA(TC, TD, TB); + TK = FMA(TI, TJ, TH); + TL = TE + TK; + T21 = TE - TK; + T23 = FNMS(TC, TA, T22); + T25 = FNMS(TI, TG, T24); + T26 = T23 - T25; + T38 = T23 + T25; + } + } + { + E T15, T16, T17, T2o, T19, T1a, T1b, T2q; + T15 = cr[WS(rs, 1)]; + T16 = T2 * T15; + T17 = ci[WS(rs, 1)]; + T2o = T2 * T17; + T19 = cr[WS(rs, 9)]; + T1a = T3 * T19; + T1b = ci[WS(rs, 9)]; + T2q = T3 * T1b; + { + E T18, T1c, T2p, T2r; + T18 = FMA(T5, T17, T16); + T1c = FMA(T6, T1b, T1a); + T1d = T18 + T1c; + T2h = T18 - T1c; + T2p = FNMS(T5, T15, T2o); + T2r = FNMS(T6, T19, T2q); + T2s = T2p - T2r; + T3c = T2p + T2r; + } + } + { + E T1g, T1h, T1k, T2i, T1n, T1o, T1q, T2k; + T1g = cr[WS(rs, 5)]; + T1h = T1f * T1g; + T1k = ci[WS(rs, 5)]; + T2i = T1f * T1k; + T1n = cr[WS(rs, 13)]; + T1o = T1m * T1n; + T1q = ci[WS(rs, 13)]; + T2k = T1m * T1q; + { + E T1l, T1r, T2j, T2l; + T1l = FMA(T1j, T1k, T1h); + T1r = FMA(T1p, T1q, T1o); + T1s = T1l + T1r; + T2t = T1l - T1r; + T2j = FNMS(T1j, T1g, T2i); + T2l = FNMS(T1p, T1n, T2k); + T2m = T2j - T2l; + T3d = T2j + T2l; + } + } + { + E TQ, TR, TU, T29, TX, TY, T10, T2b; + TQ = cr[WS(rs, 14)]; + TR = TP * TQ; + TU = ci[WS(rs, 14)]; + T29 = TP * TU; + TX = cr[WS(rs, 6)]; + TY = TW * TX; + T10 = ci[WS(rs, 6)]; + T2b = TW * T10; + { + E TV, T11, T2a, T2c; + TV = FMA(TT, TU, TR); + T11 = FMA(TZ, T10, TY); + T12 = TV + T11; + T28 = TV - T11; + T2a = FNMS(TT, TQ, T29); + T2c = FNMS(TZ, TX, T2b); + T2d = T2a - T2c; + T37 = T2a + T2c; + } + } + { + E T14, T3q, T3C, T3E, T1T, T3D, T3t, T3u; + { + E Ty, T13, T3v, T3B; + Ty = Te + Tx; + T13 = TL + T12; + T14 = Ty + T13; + T3q = Ty - T13; + T3v = T38 + T37; + T3B = T3w + T3A; + T3C = T3v + T3B; + T3E = T3B - T3v; + } + { + E T1t, T1S, T3r, T3s; + T1t = T1d + T1s; + T1S = T1G + T1R; + T1T = T1t + T1S; + T3D = T1S - T1t; + T3r = T3h + T3i; + T3s = T3c + T3d; + T3t = T3r - T3s; + T3u = T3s + T3r; + } + ci[WS(rs, 7)] = T14 - T1T; + cr[WS(rs, 12)] = T3D - T3E; + ci[WS(rs, 11)] = T3D + T3E; + cr[0] = T14 + T1T; + cr[WS(rs, 4)] = T3q - T3t; + cr[WS(rs, 8)] = T3u - T3C; + ci[WS(rs, 15)] = T3u + T3C; + ci[WS(rs, 3)] = T3q + T3t; + } + { + E T3a, T3m, T3H, T3J, T3f, T3n, T3k, T3o; + { + E T36, T39, T3F, T3G; + T36 = Te - Tx; + T39 = T37 - T38; + T3a = T36 - T39; + T3m = T36 + T39; + T3F = TL - T12; + T3G = T3A - T3w; + T3H = T3F + T3G; + T3J = T3G - T3F; + } + { + E T3b, T3e, T3g, T3j; + T3b = T1d - T1s; + T3e = T3c - T3d; + T3f = T3b + T3e; + T3n = T3b - T3e; + T3g = T1G - T1R; + T3j = T3h - T3i; + T3k = T3g - T3j; + T3o = T3g + T3j; + } + { + E T3l, T3K, T3p, T3I; + T3l = T3f + T3k; + ci[WS(rs, 5)] = FNMS(KP707106781, T3l, T3a); + cr[WS(rs, 2)] = FMA(KP707106781, T3l, T3a); + T3K = T3o - T3n; + cr[WS(rs, 10)] = FMS(KP707106781, T3K, T3J); + ci[WS(rs, 13)] = FMA(KP707106781, T3K, T3J); + T3p = T3n + T3o; + cr[WS(rs, 6)] = FNMS(KP707106781, T3p, T3m); + ci[WS(rs, 1)] = FMA(KP707106781, T3p, T3m); + T3I = T3k - T3f; + cr[WS(rs, 14)] = FMS(KP707106781, T3I, T3H); + ci[WS(rs, 9)] = FMA(KP707106781, T3I, T3H); + } + } + { + E T20, T3N, T3T, T2Q, T2f, T3U, T30, T33, T2T, T3O, T2v, T2N, T2X, T34, T2K; + E T2O; + { + E T27, T2e, T2n, T2u; + T20 = T1U - T1Z; + T3N = T3L + T3M; + T3T = T3M - T3L; + T2Q = T1U + T1Z; + T27 = T21 - T26; + T2e = T28 + T2d; + T2f = T27 + T2e; + T3U = T2e - T27; + { + E T2Y, T2Z, T2R, T2S; + T2Y = T2w + T2B; + T2Z = T2I + T2D; + T30 = FNMS(KP414213562, T2Z, T2Y); + T33 = FMA(KP414213562, T2Y, T2Z); + T2R = T21 + T26; + T2S = T28 - T2d; + T2T = T2R + T2S; + T3O = T2R - T2S; + } + T2n = T2h - T2m; + T2u = T2s + T2t; + T2v = FNMS(KP414213562, T2u, T2n); + T2N = FMA(KP414213562, T2n, T2u); + { + E T2V, T2W, T2C, T2J; + T2V = T2h + T2m; + T2W = T2s - T2t; + T2X = FMA(KP414213562, T2W, T2V); + T34 = FNMS(KP414213562, T2V, T2W); + T2C = T2w - T2B; + T2J = T2D - T2I; + T2K = FNMS(KP414213562, T2J, T2C); + T2O = FMA(KP414213562, T2C, T2J); + } + } + { + E T2g, T2L, T3V, T3W; + T2g = FMA(KP707106781, T2f, T20); + T2L = T2v + T2K; + cr[WS(rs, 7)] = FNMS(KP923879532, T2L, T2g); + ci[0] = FMA(KP923879532, T2L, T2g); + T3V = FMA(KP707106781, T3U, T3T); + T3W = T34 + T33; + cr[WS(rs, 9)] = FMS(KP923879532, T3W, T3V); + ci[WS(rs, 14)] = FMA(KP923879532, T3W, T3V); + } + { + E T3X, T3Y, T2M, T2P; + T3X = FNMS(KP707106781, T3U, T3T); + T3Y = T30 - T2X; + cr[WS(rs, 13)] = FMS(KP923879532, T3Y, T3X); + ci[WS(rs, 10)] = FMA(KP923879532, T3Y, T3X); + T2M = FNMS(KP707106781, T2f, T20); + T2P = T2N + T2O; + ci[WS(rs, 4)] = FNMS(KP923879532, T2P, T2M); + cr[WS(rs, 3)] = FMA(KP923879532, T2P, T2M); + } + { + E T2U, T31, T3P, T3Q; + T2U = FMA(KP707106781, T2T, T2Q); + T31 = T2X + T30; + ci[WS(rs, 6)] = FNMS(KP923879532, T31, T2U); + cr[WS(rs, 1)] = FMA(KP923879532, T31, T2U); + T3P = FMA(KP707106781, T3O, T3N); + T3Q = T2O - T2N; + cr[WS(rs, 15)] = FMS(KP923879532, T3Q, T3P); + ci[WS(rs, 8)] = FMA(KP923879532, T3Q, T3P); + } + { + E T3R, T3S, T32, T35; + T3R = FNMS(KP707106781, T3O, T3N); + T3S = T2K - T2v; + cr[WS(rs, 11)] = FMS(KP923879532, T3S, T3R); + ci[WS(rs, 12)] = FMA(KP923879532, T3S, T3R); + T32 = FNMS(KP707106781, T2T, T2Q); + T35 = T33 - T34; + cr[WS(rs, 5)] = FNMS(KP923879532, T35, T32); + ci[WS(rs, 2)] = FMA(KP923879532, T35, T32); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hf2_16", twinstr, &GENUS, {104, 42, 92, 0} }; + +void X(codelet_hf2_16) (planner *p) { + X(khc2hc_register) (p, hf2_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 16 -dit -name hf2_16 -include rdft/scalar/hf.h */ + +/* + * This function contains 196 FP additions, 108 FP multiplications, + * (or, 156 additions, 68 multiplications, 40 fused multiply/add), + * 82 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(32, rs)) { + E T2, T5, Tg, Ti, Tk, To, TE, TC, T6, T3, T8, TW, TJ, Tt, TU; + E Tc, Tx, TH, TN, TO, TP, TR, T1f, T1k, T1b, T1i, T1y, T1H, T1u, T1F; + { + E T7, Tv, Ta, Ts, T4, Tw, Tb, Tr; + { + E Th, Tn, Tj, Tm; + T2 = W[0]; + T5 = W[1]; + Tg = W[2]; + Ti = W[3]; + Th = T2 * Tg; + Tn = T5 * Tg; + Tj = T5 * Ti; + Tm = T2 * Ti; + Tk = Th - Tj; + To = Tm + Tn; + TE = Tm - Tn; + TC = Th + Tj; + T6 = W[5]; + T7 = T5 * T6; + Tv = Tg * T6; + Ta = T2 * T6; + Ts = Ti * T6; + T3 = W[4]; + T4 = T2 * T3; + Tw = Ti * T3; + Tb = T5 * T3; + Tr = Tg * T3; + } + T8 = T4 + T7; + TW = Tv - Tw; + TJ = Ta + Tb; + Tt = Tr - Ts; + TU = Tr + Ts; + Tc = Ta - Tb; + Tx = Tv + Tw; + TH = T4 - T7; + TN = W[6]; + TO = W[7]; + TP = FMA(T2, TN, T5 * TO); + TR = FNMS(T5, TN, T2 * TO); + { + E T1d, T1e, T19, T1a; + T1d = Tk * T6; + T1e = To * T3; + T1f = T1d - T1e; + T1k = T1d + T1e; + T19 = Tk * T3; + T1a = To * T6; + T1b = T19 + T1a; + T1i = T19 - T1a; + } + { + E T1w, T1x, T1s, T1t; + T1w = TC * T6; + T1x = TE * T3; + T1y = T1w - T1x; + T1H = T1w + T1x; + T1s = TC * T3; + T1t = TE * T6; + T1u = T1s + T1t; + T1F = T1s - T1t; + } + } + { + E Tf, T3s, T1N, T3e, TA, T3r, T1Q, T3b, TM, T2N, T1W, T2w, TZ, T2M, T21; + E T2x, T1B, T1K, T2V, T2W, T2X, T2Y, T2j, T2E, T2o, T2D, T18, T1n, T2Q, T2R; + E T2S, T2T, T28, T2B, T2d, T2A; + { + E T1, T3d, Te, T3c, T9, Td; + T1 = cr[0]; + T3d = ci[0]; + T9 = cr[WS(rs, 8)]; + Td = ci[WS(rs, 8)]; + Te = FMA(T8, T9, Tc * Td); + T3c = FNMS(Tc, T9, T8 * Td); + Tf = T1 + Te; + T3s = T3d - T3c; + T1N = T1 - Te; + T3e = T3c + T3d; + } + { + E Tq, T1O, Tz, T1P; + { + E Tl, Tp, Tu, Ty; + Tl = cr[WS(rs, 4)]; + Tp = ci[WS(rs, 4)]; + Tq = FMA(Tk, Tl, To * Tp); + T1O = FNMS(To, Tl, Tk * Tp); + Tu = cr[WS(rs, 12)]; + Ty = ci[WS(rs, 12)]; + Tz = FMA(Tt, Tu, Tx * Ty); + T1P = FNMS(Tx, Tu, Tt * Ty); + } + TA = Tq + Tz; + T3r = Tq - Tz; + T1Q = T1O - T1P; + T3b = T1O + T1P; + } + { + E TG, T1T, TL, T1U, T1S, T1V; + { + E TD, TF, TI, TK; + TD = cr[WS(rs, 2)]; + TF = ci[WS(rs, 2)]; + TG = FMA(TC, TD, TE * TF); + T1T = FNMS(TE, TD, TC * TF); + TI = cr[WS(rs, 10)]; + TK = ci[WS(rs, 10)]; + TL = FMA(TH, TI, TJ * TK); + T1U = FNMS(TJ, TI, TH * TK); + } + TM = TG + TL; + T2N = T1T + T1U; + T1S = TG - TL; + T1V = T1T - T1U; + T1W = T1S - T1V; + T2w = T1S + T1V; + } + { + E TT, T1Y, TY, T1Z, T1X, T20; + { + E TQ, TS, TV, TX; + TQ = cr[WS(rs, 14)]; + TS = ci[WS(rs, 14)]; + TT = FMA(TP, TQ, TR * TS); + T1Y = FNMS(TR, TQ, TP * TS); + TV = cr[WS(rs, 6)]; + TX = ci[WS(rs, 6)]; + TY = FMA(TU, TV, TW * TX); + T1Z = FNMS(TW, TV, TU * TX); + } + TZ = TT + TY; + T2M = T1Y + T1Z; + T1X = TT - TY; + T20 = T1Y - T1Z; + T21 = T1X + T20; + T2x = T1X - T20; + } + { + E T1r, T2f, T1J, T2m, T1A, T2g, T1E, T2l; + { + E T1p, T1q, T1G, T1I; + T1p = cr[WS(rs, 15)]; + T1q = ci[WS(rs, 15)]; + T1r = FMA(TN, T1p, TO * T1q); + T2f = FNMS(TO, T1p, TN * T1q); + T1G = cr[WS(rs, 11)]; + T1I = ci[WS(rs, 11)]; + T1J = FMA(T1F, T1G, T1H * T1I); + T2m = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1v, T1z, T1C, T1D; + T1v = cr[WS(rs, 7)]; + T1z = ci[WS(rs, 7)]; + T1A = FMA(T1u, T1v, T1y * T1z); + T2g = FNMS(T1y, T1v, T1u * T1z); + T1C = cr[WS(rs, 3)]; + T1D = ci[WS(rs, 3)]; + T1E = FMA(Tg, T1C, Ti * T1D); + T2l = FNMS(Ti, T1C, Tg * T1D); + } + T1B = T1r + T1A; + T1K = T1E + T1J; + T2V = T1B - T1K; + T2W = T2f + T2g; + T2X = T2l + T2m; + T2Y = T2W - T2X; + { + E T2h, T2i, T2k, T2n; + T2h = T2f - T2g; + T2i = T1E - T1J; + T2j = T2h + T2i; + T2E = T2h - T2i; + T2k = T1r - T1A; + T2n = T2l - T2m; + T2o = T2k - T2n; + T2D = T2k + T2n; + } + } + { + E T14, T29, T1m, T26, T17, T2a, T1h, T25; + { + E T12, T13, T1j, T1l; + T12 = cr[WS(rs, 1)]; + T13 = ci[WS(rs, 1)]; + T14 = FMA(T2, T12, T5 * T13); + T29 = FNMS(T5, T12, T2 * T13); + T1j = cr[WS(rs, 13)]; + T1l = ci[WS(rs, 13)]; + T1m = FMA(T1i, T1j, T1k * T1l); + T26 = FNMS(T1k, T1j, T1i * T1l); + } + { + E T15, T16, T1c, T1g; + T15 = cr[WS(rs, 9)]; + T16 = ci[WS(rs, 9)]; + T17 = FMA(T3, T15, T6 * T16); + T2a = FNMS(T6, T15, T3 * T16); + T1c = cr[WS(rs, 5)]; + T1g = ci[WS(rs, 5)]; + T1h = FMA(T1b, T1c, T1f * T1g); + T25 = FNMS(T1f, T1c, T1b * T1g); + } + T18 = T14 + T17; + T1n = T1h + T1m; + T2Q = T18 - T1n; + T2R = T29 + T2a; + T2S = T25 + T26; + T2T = T2R - T2S; + { + E T24, T27, T2b, T2c; + T24 = T14 - T17; + T27 = T25 - T26; + T28 = T24 - T27; + T2B = T24 + T27; + T2b = T29 - T2a; + T2c = T1h - T1m; + T2d = T2b + T2c; + T2A = T2b - T2c; + } + } + { + E T23, T2r, T3u, T3w, T2q, T3v, T2u, T3p; + { + E T1R, T22, T3q, T3t; + T1R = T1N - T1Q; + T22 = KP707106781 * (T1W + T21); + T23 = T1R + T22; + T2r = T1R - T22; + T3q = KP707106781 * (T2w - T2x); + T3t = T3r + T3s; + T3u = T3q + T3t; + T3w = T3t - T3q; + } + { + E T2e, T2p, T2s, T2t; + T2e = FNMS(KP382683432, T2d, KP923879532 * T28); + T2p = FMA(KP382683432, T2j, KP923879532 * T2o); + T2q = T2e + T2p; + T3v = T2p - T2e; + T2s = FMA(KP923879532, T2d, KP382683432 * T28); + T2t = FNMS(KP923879532, T2j, KP382683432 * T2o); + T2u = T2s + T2t; + T3p = T2t - T2s; + } + cr[WS(rs, 7)] = T23 - T2q; + cr[WS(rs, 11)] = T3v - T3w; + ci[WS(rs, 12)] = T3v + T3w; + ci[0] = T23 + T2q; + ci[WS(rs, 4)] = T2r - T2u; + cr[WS(rs, 15)] = T3p - T3u; + ci[WS(rs, 8)] = T3p + T3u; + cr[WS(rs, 3)] = T2r + T2u; + } + { + E T11, T35, T3g, T3i, T1M, T3h, T38, T39; + { + E TB, T10, T3a, T3f; + TB = Tf + TA; + T10 = TM + TZ; + T11 = TB + T10; + T35 = TB - T10; + T3a = T2N + T2M; + T3f = T3b + T3e; + T3g = T3a + T3f; + T3i = T3f - T3a; + } + { + E T1o, T1L, T36, T37; + T1o = T18 + T1n; + T1L = T1B + T1K; + T1M = T1o + T1L; + T3h = T1L - T1o; + T36 = T2W + T2X; + T37 = T2R + T2S; + T38 = T36 - T37; + T39 = T37 + T36; + } + ci[WS(rs, 7)] = T11 - T1M; + cr[WS(rs, 12)] = T3h - T3i; + ci[WS(rs, 11)] = T3h + T3i; + cr[0] = T11 + T1M; + cr[WS(rs, 4)] = T35 - T38; + cr[WS(rs, 8)] = T39 - T3g; + ci[WS(rs, 15)] = T39 + T3g; + ci[WS(rs, 3)] = T35 + T38; + } + { + E T2z, T2H, T3A, T3C, T2G, T3B, T2K, T3x; + { + E T2v, T2y, T3y, T3z; + T2v = T1N + T1Q; + T2y = KP707106781 * (T2w + T2x); + T2z = T2v + T2y; + T2H = T2v - T2y; + T3y = KP707106781 * (T21 - T1W); + T3z = T3s - T3r; + T3A = T3y + T3z; + T3C = T3z - T3y; + } + { + E T2C, T2F, T2I, T2J; + T2C = FMA(KP382683432, T2A, KP923879532 * T2B); + T2F = FNMS(KP382683432, T2E, KP923879532 * T2D); + T2G = T2C + T2F; + T3B = T2F - T2C; + T2I = FNMS(KP923879532, T2A, KP382683432 * T2B); + T2J = FMA(KP923879532, T2E, KP382683432 * T2D); + T2K = T2I + T2J; + T3x = T2J - T2I; + } + ci[WS(rs, 6)] = T2z - T2G; + cr[WS(rs, 13)] = T3B - T3C; + ci[WS(rs, 10)] = T3B + T3C; + cr[WS(rs, 1)] = T2z + T2G; + cr[WS(rs, 5)] = T2H - T2K; + cr[WS(rs, 9)] = T3x - T3A; + ci[WS(rs, 14)] = T3x + T3A; + ci[WS(rs, 2)] = T2H + T2K; + } + { + E T2P, T31, T3m, T3o, T30, T3j, T34, T3n; + { + E T2L, T2O, T3k, T3l; + T2L = Tf - TA; + T2O = T2M - T2N; + T2P = T2L - T2O; + T31 = T2L + T2O; + T3k = TM - TZ; + T3l = T3e - T3b; + T3m = T3k + T3l; + T3o = T3l - T3k; + } + { + E T2U, T2Z, T32, T33; + T2U = T2Q + T2T; + T2Z = T2V - T2Y; + T30 = KP707106781 * (T2U + T2Z); + T3j = KP707106781 * (T2Z - T2U); + T32 = T2Q - T2T; + T33 = T2V + T2Y; + T34 = KP707106781 * (T32 + T33); + T3n = KP707106781 * (T33 - T32); + } + ci[WS(rs, 5)] = T2P - T30; + cr[WS(rs, 10)] = T3n - T3o; + ci[WS(rs, 13)] = T3n + T3o; + cr[WS(rs, 2)] = T2P + T30; + cr[WS(rs, 6)] = T31 - T34; + cr[WS(rs, 14)] = T3j - T3m; + ci[WS(rs, 9)] = T3j + T3m; + ci[WS(rs, 1)] = T31 + T34; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hf2_16", twinstr, &GENUS, {156, 68, 40, 0} }; + +void X(codelet_hf2_16) (planner *p) { + X(khc2hc_register) (p, hf2_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_20.c new file mode 100644 index 000000000..09bee2ec8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_20.c @@ -0,0 +1,1097 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:37 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -dit -name hf2_20 -include rdft/scalar/hf.h */ + +/* + * This function contains 276 FP additions, 198 FP multiplications, + * (or, 136 additions, 58 multiplications, 140 fused multiply/add), + * 95 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(40, rs)) { + E T2, Th, Tf, T6, T5, Ti, Tl, T1n, T3, Tt, Tv, T7, T17, T1L, T24; + E Tb, T13, T1P, T21, T1b, T1D, T1A, T1H, T1f, TA, Tw, Tq, Tm, TK, T1S; + E TO, T1p, T1q, T1u, T2n, T2k, T2h, T2d; + { + E Tk, Ta, T1e, T4, T1a, Tj, T12, T1G, T16, T1K, Tg, Tz; + T2 = W[0]; + Th = W[3]; + Tf = W[2]; + Tg = T2 * Tf; + Tk = T2 * Th; + T6 = W[5]; + Ta = T2 * T6; + T1e = Tf * T6; + T5 = W[1]; + Ti = FNMS(T5, Th, Tg); + Tl = FMA(T5, Tf, Tk); + T1n = FMA(T5, Th, Tg); + T3 = W[4]; + T4 = T2 * T3; + T1a = Tf * T3; + Tj = Ti * T3; + Tt = W[6]; + T12 = Tf * Tt; + T1G = T2 * Tt; + Tv = W[7]; + T16 = Tf * Tv; + T1K = T2 * Tv; + T7 = FNMS(T5, T6, T4); + T17 = FNMS(Th, Tt, T16); + T1L = FNMS(T5, Tt, T1K); + T24 = FMA(Th, T3, T1e); + Tb = FMA(T5, T3, Ta); + T13 = FMA(Th, Tv, T12); + T1P = FNMS(Tl, T6, Tj); + T21 = FNMS(Th, T6, T1a); + T1b = FMA(Th, T6, T1a); + T1D = FNMS(T5, T3, Ta); + T1A = FMA(T5, T6, T4); + T1H = FMA(T5, Tv, T1G); + T1f = FNMS(Th, T3, T1e); + Tz = Ti * Tv; + TA = FNMS(Tl, Tt, Tz); + { + E Tu, Tp, TJ, TN; + Tu = Ti * Tt; + Tw = FMA(Tl, Tv, Tu); + Tp = Ti * T6; + Tq = FNMS(Tl, T3, Tp); + Tm = FMA(Tl, T6, Tj); + TJ = Tm * Tt; + TN = Tm * Tv; + TK = FMA(Tq, Tv, TJ); + T1S = FMA(Tl, T3, Tp); + TO = FNMS(Tq, Tt, TN); + { + E T1o, T2g, T1t, T2c; + T1o = T1n * T3; + T2g = T1n * Tv; + T1t = T1n * T6; + T2c = T1n * Tt; + T1p = FNMS(T5, Tf, Tk); + T1q = FNMS(T1p, T6, T1o); + T1u = FMA(T1p, T3, T1t); + T2n = FNMS(T1p, T3, T1t); + T2k = FMA(T1p, T6, T1o); + T2h = FNMS(T1p, Tt, T2g); + T2d = FMA(T1p, Tv, T2c); + } + } + } + { + E Te, T2C, T4K, T57, TD, T58, T2H, T4L, T11, T2v, T4n, T4v, T2P, T3P, T3u; + E T3Z, T2r, T2z, T4d, T4z, T3b, T3T, T3C, T43, T20, T2y, T4g, T4y, T34, T3S; + E T3J, T42, T1y, T2w, T4k, T4w, T2W, T3Q, T3n, T40; + { + E T1, T4J, T8, T9, Tc, T4H, Td, T4I; + T1 = cr[0]; + T4J = ci[0]; + T8 = cr[WS(rs, 10)]; + T9 = T7 * T8; + Tc = ci[WS(rs, 10)]; + T4H = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Te = T1 + Td; + T2C = T1 - Td; + T4I = FNMS(Tb, T8, T4H); + T4K = T4I + T4J; + T57 = T4J - T4I; + } + { + E Tn, To, Tr, T2D, Tx, Ty, TB, T2F; + Tn = cr[WS(rs, 5)]; + To = Tm * Tn; + Tr = ci[WS(rs, 5)]; + T2D = Tm * Tr; + Tx = cr[WS(rs, 15)]; + Ty = Tw * Tx; + TB = ci[WS(rs, 15)]; + T2F = Tw * TB; + { + E Ts, TC, T2E, T2G; + Ts = FMA(Tq, Tr, To); + TC = FMA(TA, TB, Ty); + TD = Ts + TC; + T58 = Ts - TC; + T2E = FNMS(Tq, Tn, T2D); + T2G = FNMS(TA, Tx, T2F); + T2H = T2E - T2G; + T4L = T2E + T2G; + } + } + { + E TI, T3q, TZ, T2N, TQ, T3s, TV, T2L; + { + E TF, TG, TH, T3p; + TF = cr[WS(rs, 4)]; + TG = Ti * TF; + TH = ci[WS(rs, 4)]; + T3p = Ti * TH; + TI = FMA(Tl, TH, TG); + T3q = FNMS(Tl, TF, T3p); + } + { + E TW, TX, TY, T2M; + TW = cr[WS(rs, 19)]; + TX = Tt * TW; + TY = ci[WS(rs, 19)]; + T2M = Tt * TY; + TZ = FMA(Tv, TY, TX); + T2N = FNMS(Tv, TW, T2M); + } + { + E TL, TM, TP, T3r; + TL = cr[WS(rs, 14)]; + TM = TK * TL; + TP = ci[WS(rs, 14)]; + T3r = TK * TP; + TQ = FMA(TO, TP, TM); + T3s = FNMS(TO, TL, T3r); + } + { + E TS, TT, TU, T2K; + TS = cr[WS(rs, 9)]; + TT = T3 * TS; + TU = ci[WS(rs, 9)]; + T2K = T3 * TU; + TV = FMA(T6, TU, TT); + T2L = FNMS(T6, TS, T2K); + } + { + E TR, T10, T4l, T4m; + TR = TI + TQ; + T10 = TV + TZ; + T11 = TR - T10; + T2v = TR + T10; + T4l = T2L + T2N; + T4m = T3q + T3s; + T4n = T4l - T4m; + T4v = T4m + T4l; + } + { + E T2J, T2O, T3o, T3t; + T2J = TI - TQ; + T2O = T2L - T2N; + T2P = T2J - T2O; + T3P = T2J + T2O; + T3o = TZ - TV; + T3t = T3q - T3s; + T3u = T3o - T3t; + T3Z = T3t + T3o; + } + } + { + E T26, T3y, T2p, T39, T2a, T3A, T2j, T37; + { + E T22, T23, T25, T3x; + T22 = cr[WS(rs, 12)]; + T23 = T21 * T22; + T25 = ci[WS(rs, 12)]; + T3x = T21 * T25; + T26 = FMA(T24, T25, T23); + T3y = FNMS(T24, T22, T3x); + } + { + E T2l, T2m, T2o, T38; + T2l = cr[WS(rs, 7)]; + T2m = T2k * T2l; + T2o = ci[WS(rs, 7)]; + T38 = T2k * T2o; + T2p = FMA(T2n, T2o, T2m); + T39 = FNMS(T2n, T2l, T38); + } + { + E T27, T28, T29, T3z; + T27 = cr[WS(rs, 2)]; + T28 = T1n * T27; + T29 = ci[WS(rs, 2)]; + T3z = T1n * T29; + T2a = FMA(T1p, T29, T28); + T3A = FNMS(T1p, T27, T3z); + } + { + E T2e, T2f, T2i, T36; + T2e = cr[WS(rs, 17)]; + T2f = T2d * T2e; + T2i = ci[WS(rs, 17)]; + T36 = T2d * T2i; + T2j = FMA(T2h, T2i, T2f); + T37 = FNMS(T2h, T2e, T36); + } + { + E T2b, T2q, T4b, T4c; + T2b = T26 + T2a; + T2q = T2j + T2p; + T2r = T2b - T2q; + T2z = T2b + T2q; + T4b = T37 + T39; + T4c = T3y + T3A; + T4d = T4b - T4c; + T4z = T4c + T4b; + } + { + E T35, T3a, T3w, T3B; + T35 = T26 - T2a; + T3a = T37 - T39; + T3b = T35 - T3a; + T3T = T35 + T3a; + T3w = T2p - T2j; + T3B = T3y - T3A; + T3C = T3w - T3B; + T43 = T3B + T3w; + } + } + { + E T1F, T3F, T1Y, T32, T1N, T3H, T1U, T30; + { + E T1B, T1C, T1E, T3E; + T1B = cr[WS(rs, 8)]; + T1C = T1A * T1B; + T1E = ci[WS(rs, 8)]; + T3E = T1A * T1E; + T1F = FMA(T1D, T1E, T1C); + T3F = FNMS(T1D, T1B, T3E); + } + { + E T1V, T1W, T1X, T31; + T1V = cr[WS(rs, 3)]; + T1W = Tf * T1V; + T1X = ci[WS(rs, 3)]; + T31 = Tf * T1X; + T1Y = FMA(Th, T1X, T1W); + T32 = FNMS(Th, T1V, T31); + } + { + E T1I, T1J, T1M, T3G; + T1I = cr[WS(rs, 18)]; + T1J = T1H * T1I; + T1M = ci[WS(rs, 18)]; + T3G = T1H * T1M; + T1N = FMA(T1L, T1M, T1J); + T3H = FNMS(T1L, T1I, T3G); + } + { + E T1Q, T1R, T1T, T2Z; + T1Q = cr[WS(rs, 13)]; + T1R = T1P * T1Q; + T1T = ci[WS(rs, 13)]; + T2Z = T1P * T1T; + T1U = FMA(T1S, T1T, T1R); + T30 = FNMS(T1S, T1Q, T2Z); + } + { + E T1O, T1Z, T4e, T4f; + T1O = T1F + T1N; + T1Z = T1U + T1Y; + T20 = T1O - T1Z; + T2y = T1O + T1Z; + T4e = T30 + T32; + T4f = T3F + T3H; + T4g = T4e - T4f; + T4y = T4f + T4e; + } + { + E T2Y, T33, T3D, T3I; + T2Y = T1F - T1N; + T33 = T30 - T32; + T34 = T2Y - T33; + T3S = T2Y + T33; + T3D = T1Y - T1U; + T3I = T3F - T3H; + T3J = T3D - T3I; + T42 = T3I + T3D; + } + } + { + E T19, T3j, T1w, T2U, T1h, T3l, T1m, T2S; + { + E T14, T15, T18, T3i; + T14 = cr[WS(rs, 16)]; + T15 = T13 * T14; + T18 = ci[WS(rs, 16)]; + T3i = T13 * T18; + T19 = FMA(T17, T18, T15); + T3j = FNMS(T17, T14, T3i); + } + { + E T1r, T1s, T1v, T2T; + T1r = cr[WS(rs, 11)]; + T1s = T1q * T1r; + T1v = ci[WS(rs, 11)]; + T2T = T1q * T1v; + T1w = FMA(T1u, T1v, T1s); + T2U = FNMS(T1u, T1r, T2T); + } + { + E T1c, T1d, T1g, T3k; + T1c = cr[WS(rs, 6)]; + T1d = T1b * T1c; + T1g = ci[WS(rs, 6)]; + T3k = T1b * T1g; + T1h = FMA(T1f, T1g, T1d); + T3l = FNMS(T1f, T1c, T3k); + } + { + E T1j, T1k, T1l, T2R; + T1j = cr[WS(rs, 1)]; + T1k = T2 * T1j; + T1l = ci[WS(rs, 1)]; + T2R = T2 * T1l; + T1m = FMA(T5, T1l, T1k); + T2S = FNMS(T5, T1j, T2R); + } + { + E T1i, T1x, T4i, T4j; + T1i = T19 + T1h; + T1x = T1m + T1w; + T1y = T1i - T1x; + T2w = T1i + T1x; + T4i = T2S + T2U; + T4j = T3j + T3l; + T4k = T4i - T4j; + T4w = T4j + T4i; + } + { + E T2Q, T2V, T3h, T3m; + T2Q = T19 - T1h; + T2V = T2S - T2U; + T2W = T2Q - T2V; + T3Q = T2Q + T2V; + T3h = T1w - T1m; + T3m = T3j - T3l; + T3n = T3h - T3m; + T40 = T3m + T3h; + } + } + { + E T4p, T4r, TE, T2t, T48, T49, T4q, T4a; + { + E T4h, T4o, T1z, T2s; + T4h = T4d - T4g; + T4o = T4k - T4n; + T4p = FNMS(KP618033988, T4o, T4h); + T4r = FMA(KP618033988, T4h, T4o); + TE = Te - TD; + T1z = T11 + T1y; + T2s = T20 + T2r; + T2t = T1z + T2s; + T48 = FNMS(KP250000000, T2t, TE); + T49 = T1z - T2s; + } + ci[WS(rs, 9)] = TE + T2t; + T4q = FMA(KP559016994, T49, T48); + ci[WS(rs, 5)] = FNMS(KP951056516, T4r, T4q); + cr[WS(rs, 6)] = FMA(KP951056516, T4r, T4q); + T4a = FNMS(KP559016994, T49, T48); + cr[WS(rs, 2)] = FNMS(KP951056516, T4p, T4a); + ci[WS(rs, 1)] = FMA(KP951056516, T4p, T4a); + } + { + E T45, T47, T3O, T3V, T3W, T3X, T46, T3Y; + { + E T41, T44, T3R, T3U; + T41 = T3Z - T40; + T44 = T42 - T43; + T45 = FMA(KP618033988, T44, T41); + T47 = FNMS(KP618033988, T41, T44); + T3O = T2C + T2H; + T3R = T3P + T3Q; + T3U = T3S + T3T; + T3V = T3R + T3U; + T3W = FNMS(KP250000000, T3V, T3O); + T3X = T3R - T3U; + } + cr[WS(rs, 5)] = T3O + T3V; + T46 = FNMS(KP559016994, T3X, T3W); + ci[WS(rs, 2)] = FNMS(KP951056516, T47, T46); + ci[WS(rs, 6)] = FMA(KP951056516, T47, T46); + T3Y = FMA(KP559016994, T3X, T3W); + cr[WS(rs, 1)] = FMA(KP951056516, T45, T3Y); + cr[WS(rs, 9)] = FNMS(KP951056516, T45, T3Y); + } + { + E T4B, T4D, T2u, T2B, T4s, T4t, T4C, T4u; + { + E T4x, T4A, T2x, T2A; + T4x = T4v - T4w; + T4A = T4y - T4z; + T4B = FMA(KP618033988, T4A, T4x); + T4D = FNMS(KP618033988, T4x, T4A); + T2u = Te + TD; + T2x = T2v + T2w; + T2A = T2y + T2z; + T2B = T2x + T2A; + T4s = FNMS(KP250000000, T2B, T2u); + T4t = T2x - T2A; + } + cr[0] = T2u + T2B; + T4C = FNMS(KP559016994, T4t, T4s); + ci[WS(rs, 7)] = FNMS(KP951056516, T4D, T4C); + cr[WS(rs, 8)] = FMA(KP951056516, T4D, T4C); + T4u = FMA(KP559016994, T4t, T4s); + cr[WS(rs, 4)] = FNMS(KP951056516, T4B, T4u); + ci[WS(rs, 3)] = FMA(KP951056516, T4B, T4u); + } + { + E T3L, T3N, T2I, T3d, T3e, T3f, T3M, T3g; + { + E T3v, T3K, T2X, T3c; + T3v = T3n - T3u; + T3K = T3C - T3J; + T3L = FMA(KP618033988, T3K, T3v); + T3N = FNMS(KP618033988, T3v, T3K); + T2I = T2C - T2H; + T2X = T2P + T2W; + T3c = T34 + T3b; + T3d = T2X + T3c; + T3e = FNMS(KP250000000, T3d, T2I); + T3f = T2X - T3c; + } + ci[WS(rs, 4)] = T2I + T3d; + T3M = FNMS(KP559016994, T3f, T3e); + cr[WS(rs, 3)] = FMA(KP951056516, T3N, T3M); + cr[WS(rs, 7)] = FNMS(KP951056516, T3N, T3M); + T3g = FMA(KP559016994, T3f, T3e); + ci[0] = FNMS(KP951056516, T3L, T3g); + ci[WS(rs, 8)] = FMA(KP951056516, T3L, T3g); + } + { + E T4S, T4U, T4M, T4G, T4N, T4O, T4T, T4P; + { + E T4Q, T4R, T4E, T4F; + T4Q = T1y - T11; + T4R = T20 - T2r; + T4S = FNMS(KP618033988, T4R, T4Q); + T4U = FMA(KP618033988, T4Q, T4R); + T4M = T4K - T4L; + T4E = T4n + T4k; + T4F = T4g + T4d; + T4G = T4E + T4F; + T4N = FMA(KP250000000, T4G, T4M); + T4O = T4F - T4E; + } + cr[WS(rs, 10)] = T4G - T4M; + T4T = FNMS(KP559016994, T4O, T4N); + cr[WS(rs, 18)] = FMS(KP951056516, T4U, T4T); + ci[WS(rs, 17)] = FMA(KP951056516, T4U, T4T); + T4P = FMA(KP559016994, T4O, T4N); + cr[WS(rs, 14)] = FMS(KP951056516, T4S, T4P); + ci[WS(rs, 13)] = FMA(KP951056516, T4S, T4P); + } + { + E T5i, T5k, T59, T5c, T5d, T5e, T5j, T5f; + { + E T5g, T5h, T5a, T5b; + T5g = T3S - T3T; + T5h = T3P - T3Q; + T5i = FNMS(KP618033988, T5h, T5g); + T5k = FMA(KP618033988, T5g, T5h); + T59 = T57 - T58; + T5a = T3Z + T40; + T5b = T42 + T43; + T5c = T5a + T5b; + T5d = FNMS(KP250000000, T5c, T59); + T5e = T5a - T5b; + } + ci[WS(rs, 14)] = T5c + T59; + T5j = FMA(KP559016994, T5e, T5d); + ci[WS(rs, 10)] = FMA(KP951056516, T5k, T5j); + ci[WS(rs, 18)] = FNMS(KP951056516, T5k, T5j); + T5f = FNMS(KP559016994, T5e, T5d); + cr[WS(rs, 13)] = FMS(KP951056516, T5i, T5f); + cr[WS(rs, 17)] = -(FMA(KP951056516, T5i, T5f)); + } + { + E T54, T56, T4V, T4Y, T4Z, T50, T55, T51; + { + E T52, T53, T4W, T4X; + T52 = T2z - T2y; + T53 = T2v - T2w; + T54 = FMA(KP618033988, T53, T52); + T56 = FNMS(KP618033988, T52, T53); + T4V = T4L + T4K; + T4W = T4v + T4w; + T4X = T4y + T4z; + T4Y = T4W + T4X; + T4Z = FNMS(KP250000000, T4Y, T4V); + T50 = T4W - T4X; + } + ci[WS(rs, 19)] = T4Y + T4V; + T55 = FMA(KP559016994, T50, T4Z); + cr[WS(rs, 16)] = FMS(KP951056516, T56, T55); + ci[WS(rs, 15)] = FMA(KP951056516, T56, T55); + T51 = FNMS(KP559016994, T50, T4Z); + cr[WS(rs, 12)] = FMS(KP951056516, T54, T51); + ci[WS(rs, 11)] = FMA(KP951056516, T54, T51); + } + { + E T5u, T5w, T5o, T5n, T5p, T5q, T5v, T5r; + { + E T5s, T5t, T5l, T5m; + T5s = T2P - T2W; + T5t = T34 - T3b; + T5u = FMA(KP618033988, T5t, T5s); + T5w = FNMS(KP618033988, T5s, T5t); + T5o = T58 + T57; + T5l = T3u + T3n; + T5m = T3J + T3C; + T5n = T5l + T5m; + T5p = FMA(KP250000000, T5n, T5o); + T5q = T5l - T5m; + } + cr[WS(rs, 15)] = T5n - T5o; + T5v = FMA(KP559016994, T5q, T5p); + ci[WS(rs, 12)] = FMA(KP951056516, T5w, T5v); + ci[WS(rs, 16)] = FNMS(KP951056516, T5w, T5v); + T5r = FNMS(KP559016994, T5q, T5p); + cr[WS(rs, 11)] = FMS(KP951056516, T5u, T5r); + cr[WS(rs, 19)] = -(FMA(KP951056516, T5u, T5r)); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hf2_20", twinstr, &GENUS, {136, 58, 140, 0} }; + +void X(codelet_hf2_20) (planner *p) { + X(khc2hc_register) (p, hf2_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 20 -dit -name hf2_20 -include rdft/scalar/hf.h */ + +/* + * This function contains 276 FP additions, 164 FP multiplications, + * (or, 204 additions, 92 multiplications, 72 fused multiply/add), + * 123 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(40, rs)) { + E T2, T5, Tg, Ti, Tk, To, T1h, T1f, T6, T3, T8, T14, T1Q, Tc, T1O; + E T1v, T18, T1t, T1n, T24, T1j, T22, Tq, Tu, T1E, T1G, Tx, Ty, Tz, TJ; + E T1Z, TB, T1X, T1A, TZ, TL, T1y, TX; + { + E T7, T16, Ta, T13, T4, T17, Tb, T12; + { + E Th, Tn, Tj, Tm; + T2 = W[0]; + T5 = W[1]; + Tg = W[2]; + Ti = W[3]; + Th = T2 * Tg; + Tn = T5 * Tg; + Tj = T5 * Ti; + Tm = T2 * Ti; + Tk = Th - Tj; + To = Tm + Tn; + T1h = Tm - Tn; + T1f = Th + Tj; + T6 = W[5]; + T7 = T5 * T6; + T16 = Tg * T6; + Ta = T2 * T6; + T13 = Ti * T6; + T3 = W[4]; + T4 = T2 * T3; + T17 = Ti * T3; + Tb = T5 * T3; + T12 = Tg * T3; + } + T8 = T4 - T7; + T14 = T12 + T13; + T1Q = T16 + T17; + Tc = Ta + Tb; + T1O = T12 - T13; + T1v = Ta - Tb; + T18 = T16 - T17; + T1t = T4 + T7; + { + E T1l, T1m, T1g, T1i; + T1l = T1f * T6; + T1m = T1h * T3; + T1n = T1l + T1m; + T24 = T1l - T1m; + T1g = T1f * T3; + T1i = T1h * T6; + T1j = T1g - T1i; + T22 = T1g + T1i; + { + E Tl, Tp, Ts, Tt; + Tl = Tk * T3; + Tp = To * T6; + Tq = Tl + Tp; + Ts = Tk * T6; + Tt = To * T3; + Tu = Ts - Tt; + T1E = Tl - Tp; + T1G = Ts + Tt; + Tx = W[6]; + Ty = W[7]; + Tz = FMA(Tk, Tx, To * Ty); + TJ = FMA(Tq, Tx, Tu * Ty); + T1Z = FNMS(T1h, Tx, T1f * Ty); + TB = FNMS(To, Tx, Tk * Ty); + T1X = FMA(T1f, Tx, T1h * Ty); + T1A = FNMS(T5, Tx, T2 * Ty); + TZ = FNMS(Ti, Tx, Tg * Ty); + TL = FNMS(Tu, Tx, Tq * Ty); + T1y = FMA(T2, Tx, T5 * Ty); + TX = FMA(Tg, Tx, Ti * Ty); + } + } + } + { + E TF, T2b, T4D, T4M, T2K, T3r, T4a, T4m, T1N, T28, T29, T3C, T3F, T43, T3X; + E T3Y, T4o, T2f, T2g, T2h, T2y, T2D, T2E, T3g, T3h, T4z, T3n, T3o, T3p, T33; + E T38, T4K, TW, T1r, T1s, T3J, T3M, T44, T3U, T3V, T4n, T2c, T2d, T2e, T2n; + E T2s, T2t, T3d, T3e, T4y, T3k, T3l, T3m, T2S, T2X, T4J; + { + E T1, T47, Te, T46, Tw, T2H, TD, T2I, T9, Td; + T1 = cr[0]; + T47 = ci[0]; + T9 = cr[WS(rs, 10)]; + Td = ci[WS(rs, 10)]; + Te = FMA(T8, T9, Tc * Td); + T46 = FNMS(Tc, T9, T8 * Td); + { + E Tr, Tv, TA, TC; + Tr = cr[WS(rs, 5)]; + Tv = ci[WS(rs, 5)]; + Tw = FMA(Tq, Tr, Tu * Tv); + T2H = FNMS(Tu, Tr, Tq * Tv); + TA = cr[WS(rs, 15)]; + TC = ci[WS(rs, 15)]; + TD = FMA(Tz, TA, TB * TC); + T2I = FNMS(TB, TA, Tz * TC); + } + { + E Tf, TE, T4B, T4C; + Tf = T1 + Te; + TE = Tw + TD; + TF = Tf - TE; + T2b = Tf + TE; + T4B = T47 - T46; + T4C = Tw - TD; + T4D = T4B - T4C; + T4M = T4C + T4B; + } + { + E T2G, T2J, T48, T49; + T2G = T1 - Te; + T2J = T2H - T2I; + T2K = T2G - T2J; + T3r = T2G + T2J; + T48 = T46 + T47; + T49 = T2H + T2I; + T4a = T48 - T49; + T4m = T49 + T48; + } + } + { + E T1D, T3A, T2u, T31, T27, T3D, T2C, T37, T1M, T3B, T2x, T32, T1W, T3E, T2z; + E T36; + { + E T1x, T2Z, T1C, T30; + { + E T1u, T1w, T1z, T1B; + T1u = cr[WS(rs, 8)]; + T1w = ci[WS(rs, 8)]; + T1x = FMA(T1t, T1u, T1v * T1w); + T2Z = FNMS(T1v, T1u, T1t * T1w); + T1z = cr[WS(rs, 18)]; + T1B = ci[WS(rs, 18)]; + T1C = FMA(T1y, T1z, T1A * T1B); + T30 = FNMS(T1A, T1z, T1y * T1B); + } + T1D = T1x + T1C; + T3A = T2Z + T30; + T2u = T1x - T1C; + T31 = T2Z - T30; + } + { + E T21, T2A, T26, T2B; + { + E T1Y, T20, T23, T25; + T1Y = cr[WS(rs, 17)]; + T20 = ci[WS(rs, 17)]; + T21 = FMA(T1X, T1Y, T1Z * T20); + T2A = FNMS(T1Z, T1Y, T1X * T20); + T23 = cr[WS(rs, 7)]; + T25 = ci[WS(rs, 7)]; + T26 = FMA(T22, T23, T24 * T25); + T2B = FNMS(T24, T23, T22 * T25); + } + T27 = T21 + T26; + T3D = T2A + T2B; + T2C = T2A - T2B; + T37 = T21 - T26; + } + { + E T1I, T2v, T1L, T2w; + { + E T1F, T1H, T1J, T1K; + T1F = cr[WS(rs, 13)]; + T1H = ci[WS(rs, 13)]; + T1I = FMA(T1E, T1F, T1G * T1H); + T2v = FNMS(T1G, T1F, T1E * T1H); + T1J = cr[WS(rs, 3)]; + T1K = ci[WS(rs, 3)]; + T1L = FMA(Tg, T1J, Ti * T1K); + T2w = FNMS(Ti, T1J, Tg * T1K); + } + T1M = T1I + T1L; + T3B = T2v + T2w; + T2x = T2v - T2w; + T32 = T1I - T1L; + } + { + E T1S, T34, T1V, T35; + { + E T1P, T1R, T1T, T1U; + T1P = cr[WS(rs, 12)]; + T1R = ci[WS(rs, 12)]; + T1S = FMA(T1O, T1P, T1Q * T1R); + T34 = FNMS(T1Q, T1P, T1O * T1R); + T1T = cr[WS(rs, 2)]; + T1U = ci[WS(rs, 2)]; + T1V = FMA(T1f, T1T, T1h * T1U); + T35 = FNMS(T1h, T1T, T1f * T1U); + } + T1W = T1S + T1V; + T3E = T34 + T35; + T2z = T1S - T1V; + T36 = T34 - T35; + } + T1N = T1D - T1M; + T28 = T1W - T27; + T29 = T1N + T28; + T3C = T3A - T3B; + T3F = T3D - T3E; + T43 = T3F - T3C; + T3X = T3A + T3B; + T3Y = T3E + T3D; + T4o = T3X + T3Y; + T2f = T1D + T1M; + T2g = T1W + T27; + T2h = T2f + T2g; + T2y = T2u - T2x; + T2D = T2z - T2C; + T2E = T2y + T2D; + T3g = T31 - T32; + T3h = T36 - T37; + T4z = T3g + T3h; + T3n = T2u + T2x; + T3o = T2z + T2C; + T3p = T3n + T3o; + T33 = T31 + T32; + T38 = T36 + T37; + T4K = T33 + T38; + } + { + E TO, T3H, T2j, T2Q, T1q, T3L, T2r, T2T, TV, T3I, T2m, T2R, T1b, T3K, T2o; + E T2W; + { + E TI, T2O, TN, T2P; + { + E TG, TH, TK, TM; + TG = cr[WS(rs, 4)]; + TH = ci[WS(rs, 4)]; + TI = FMA(Tk, TG, To * TH); + T2O = FNMS(To, TG, Tk * TH); + TK = cr[WS(rs, 14)]; + TM = ci[WS(rs, 14)]; + TN = FMA(TJ, TK, TL * TM); + T2P = FNMS(TL, TK, TJ * TM); + } + TO = TI + TN; + T3H = T2O + T2P; + T2j = TI - TN; + T2Q = T2O - T2P; + } + { + E T1e, T2p, T1p, T2q; + { + E T1c, T1d, T1k, T1o; + T1c = cr[WS(rs, 1)]; + T1d = ci[WS(rs, 1)]; + T1e = FMA(T2, T1c, T5 * T1d); + T2p = FNMS(T5, T1c, T2 * T1d); + T1k = cr[WS(rs, 11)]; + T1o = ci[WS(rs, 11)]; + T1p = FMA(T1j, T1k, T1n * T1o); + T2q = FNMS(T1n, T1k, T1j * T1o); + } + T1q = T1e + T1p; + T3L = T2p + T2q; + T2r = T2p - T2q; + T2T = T1p - T1e; + } + { + E TR, T2k, TU, T2l; + { + E TP, TQ, TS, TT; + TP = cr[WS(rs, 9)]; + TQ = ci[WS(rs, 9)]; + TR = FMA(T3, TP, T6 * TQ); + T2k = FNMS(T6, TP, T3 * TQ); + TS = cr[WS(rs, 19)]; + TT = ci[WS(rs, 19)]; + TU = FMA(Tx, TS, Ty * TT); + T2l = FNMS(Ty, TS, Tx * TT); + } + TV = TR + TU; + T3I = T2k + T2l; + T2m = T2k - T2l; + T2R = TR - TU; + } + { + E T11, T2U, T1a, T2V; + { + E TY, T10, T15, T19; + TY = cr[WS(rs, 16)]; + T10 = ci[WS(rs, 16)]; + T11 = FMA(TX, TY, TZ * T10); + T2U = FNMS(TZ, TY, TX * T10); + T15 = cr[WS(rs, 6)]; + T19 = ci[WS(rs, 6)]; + T1a = FMA(T14, T15, T18 * T19); + T2V = FNMS(T18, T15, T14 * T19); + } + T1b = T11 + T1a; + T3K = T2U + T2V; + T2o = T11 - T1a; + T2W = T2U - T2V; + } + TW = TO - TV; + T1r = T1b - T1q; + T1s = TW + T1r; + T3J = T3H - T3I; + T3M = T3K - T3L; + T44 = T3J + T3M; + T3U = T3H + T3I; + T3V = T3K + T3L; + T4n = T3U + T3V; + T2c = TO + TV; + T2d = T1b + T1q; + T2e = T2c + T2d; + T2n = T2j - T2m; + T2s = T2o - T2r; + T2t = T2n + T2s; + T3d = T2Q - T2R; + T3e = T2W + T2T; + T4y = T3d + T3e; + T3k = T2j + T2m; + T3l = T2o + T2r; + T3m = T3k + T3l; + T2S = T2Q + T2R; + T2X = T2T - T2W; + T4J = T2X - T2S; + } + { + E T3y, T2a, T3x, T3O, T3Q, T3G, T3N, T3P, T3z; + T3y = KP559016994 * (T1s - T29); + T2a = T1s + T29; + T3x = FNMS(KP250000000, T2a, TF); + T3G = T3C + T3F; + T3N = T3J - T3M; + T3O = FNMS(KP587785252, T3N, KP951056516 * T3G); + T3Q = FMA(KP951056516, T3N, KP587785252 * T3G); + ci[WS(rs, 9)] = TF + T2a; + T3P = T3y + T3x; + ci[WS(rs, 5)] = T3P - T3Q; + cr[WS(rs, 6)] = T3P + T3Q; + T3z = T3x - T3y; + cr[WS(rs, 2)] = T3z - T3O; + ci[WS(rs, 1)] = T3z + T3O; + } + { + E T3q, T3s, T3t, T3j, T3w, T3f, T3i, T3v, T3u; + T3q = KP559016994 * (T3m - T3p); + T3s = T3m + T3p; + T3t = FNMS(KP250000000, T3s, T3r); + T3f = T3d - T3e; + T3i = T3g - T3h; + T3j = FMA(KP951056516, T3f, KP587785252 * T3i); + T3w = FNMS(KP587785252, T3f, KP951056516 * T3i); + cr[WS(rs, 5)] = T3r + T3s; + T3v = T3t - T3q; + ci[WS(rs, 2)] = T3v - T3w; + ci[WS(rs, 6)] = T3w + T3v; + T3u = T3q + T3t; + cr[WS(rs, 1)] = T3j + T3u; + cr[WS(rs, 9)] = T3u - T3j; + } + { + E T3R, T2i, T3S, T40, T42, T3W, T3Z, T41, T3T; + T3R = KP559016994 * (T2e - T2h); + T2i = T2e + T2h; + T3S = FNMS(KP250000000, T2i, T2b); + T3W = T3U - T3V; + T3Z = T3X - T3Y; + T40 = FMA(KP951056516, T3W, KP587785252 * T3Z); + T42 = FNMS(KP587785252, T3W, KP951056516 * T3Z); + cr[0] = T2b + T2i; + T41 = T3S - T3R; + ci[WS(rs, 7)] = T41 - T42; + cr[WS(rs, 8)] = T41 + T42; + T3T = T3R + T3S; + cr[WS(rs, 4)] = T3T - T40; + ci[WS(rs, 3)] = T3T + T40; + } + { + E T2F, T2L, T2M, T3a, T3b, T2Y, T39, T3c, T2N; + T2F = KP559016994 * (T2t - T2E); + T2L = T2t + T2E; + T2M = FNMS(KP250000000, T2L, T2K); + T2Y = T2S + T2X; + T39 = T33 - T38; + T3a = FMA(KP951056516, T2Y, KP587785252 * T39); + T3b = FNMS(KP587785252, T2Y, KP951056516 * T39); + ci[WS(rs, 4)] = T2K + T2L; + T3c = T2M - T2F; + cr[WS(rs, 3)] = T3b + T3c; + cr[WS(rs, 7)] = T3c - T3b; + T2N = T2F + T2M; + ci[0] = T2N - T3a; + ci[WS(rs, 8)] = T3a + T2N; + } + { + E T4e, T45, T4f, T4d, T4h, T4b, T4c, T4i, T4g; + T4e = KP559016994 * (T44 + T43); + T45 = T43 - T44; + T4f = FMA(KP250000000, T45, T4a); + T4b = T1r - TW; + T4c = T1N - T28; + T4d = FNMS(KP587785252, T4c, KP951056516 * T4b); + T4h = FMA(KP587785252, T4b, KP951056516 * T4c); + cr[WS(rs, 10)] = T45 - T4a; + T4i = T4f - T4e; + cr[WS(rs, 18)] = T4h - T4i; + ci[WS(rs, 17)] = T4h + T4i; + T4g = T4e + T4f; + cr[WS(rs, 14)] = T4d - T4g; + ci[WS(rs, 13)] = T4d + T4g; + } + { + E T4A, T4E, T4F, T4x, T4H, T4v, T4w, T4I, T4G; + T4A = KP559016994 * (T4y - T4z); + T4E = T4y + T4z; + T4F = FNMS(KP250000000, T4E, T4D); + T4v = T3n - T3o; + T4w = T3k - T3l; + T4x = FNMS(KP587785252, T4w, KP951056516 * T4v); + T4H = FMA(KP951056516, T4w, KP587785252 * T4v); + ci[WS(rs, 14)] = T4E + T4D; + T4I = T4A + T4F; + ci[WS(rs, 10)] = T4H + T4I; + ci[WS(rs, 18)] = T4I - T4H; + T4G = T4A - T4F; + cr[WS(rs, 13)] = T4x + T4G; + cr[WS(rs, 17)] = T4G - T4x; + } + { + E T4r, T4p, T4q, T4l, T4t, T4j, T4k, T4u, T4s; + T4r = KP559016994 * (T4n - T4o); + T4p = T4n + T4o; + T4q = FNMS(KP250000000, T4p, T4m); + T4j = T2c - T2d; + T4k = T2f - T2g; + T4l = FNMS(KP951056516, T4k, KP587785252 * T4j); + T4t = FMA(KP951056516, T4j, KP587785252 * T4k); + ci[WS(rs, 19)] = T4p + T4m; + T4u = T4r + T4q; + cr[WS(rs, 16)] = T4t - T4u; + ci[WS(rs, 15)] = T4t + T4u; + T4s = T4q - T4r; + cr[WS(rs, 12)] = T4l - T4s; + ci[WS(rs, 11)] = T4l + T4s; + } + { + E T4Q, T4L, T4R, T4P, T4T, T4N, T4O, T4U, T4S; + T4Q = KP559016994 * (T4J + T4K); + T4L = T4J - T4K; + T4R = FMA(KP250000000, T4L, T4M); + T4N = T2n - T2s; + T4O = T2y - T2D; + T4P = FMA(KP951056516, T4N, KP587785252 * T4O); + T4T = FNMS(KP587785252, T4N, KP951056516 * T4O); + cr[WS(rs, 15)] = T4L - T4M; + T4U = T4Q + T4R; + ci[WS(rs, 12)] = T4T + T4U; + ci[WS(rs, 16)] = T4U - T4T; + T4S = T4Q - T4R; + cr[WS(rs, 11)] = T4P + T4S; + cr[WS(rs, 19)] = T4S - T4P; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 19}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hf2_20", twinstr, &GENUS, {204, 92, 72, 0} }; + +void X(codelet_hf2_20) (planner *p) { + X(khc2hc_register) (p, hf2_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_25.c new file mode 100644 index 000000000..3df708634 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_25.c @@ -0,0 +1,1620 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:38 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 25 -dit -name hf2_25 -include rdft/scalar/hf.h */ + +/* + * This function contains 440 FP additions, 434 FP multiplications, + * (or, 84 additions, 78 multiplications, 356 fused multiply/add), + * 186 stack variables, 47 constants, and 100 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(50, rs)) { + E T2, T8, T3, T6, Tk, Tm, T5, T7, T19, Tb, T1b, Tc, Tw, TT, T1j; + E TE, T2p, T1c, T2U, TI, T11, T15, T2Q, T2M, T2m, T2i, T2e, Tn, Tr, TX; + E T31, T35, T1l, T1m, T1q, TA, T1K, T1O, T2a, T27, T1g, T2x, T2t, Th, Td; + E T1S, T2X, T1W; + { + E TS, TD, T2L, T10, TH, T2P, T14, T9, T1a, Tz, TW, T4, Ta, Tv, T1J; + E T1N; + T2 = W[0]; + T8 = W[4]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + TS = T3 * T8; + Ta = T2 * T6; + Tv = T2 * T8; + Tk = W[6]; + TD = T8 * Tk; + T2L = T2 * Tk; + T10 = T3 * Tk; + Tm = W[7]; + TH = T8 * Tm; + T2P = T2 * Tm; + T14 = T3 * Tm; + T5 = W[1]; + T7 = FNMS(T5, T6, T4); + T19 = FMA(T5, T6, T4); + T9 = T7 * T8; + T1a = T19 * T8; + Tb = FMA(T5, T3, Ta); + T1b = FNMS(T5, T3, Ta); + Tc = W[5]; + Tz = T2 * Tc; + TW = T3 * Tc; + Tw = FNMS(T5, Tc, Tv); + TT = FMA(T6, Tc, TS); + T1j = FMA(T5, Tc, Tv); + TE = FMA(Tc, Tm, TD); + T2p = FMA(T6, T8, TW); + T1c = FNMS(T1b, Tc, T1a); + T2U = FNMS(Tb, Tc, T9); + TI = FNMS(Tc, Tk, TH); + T11 = FMA(T6, Tm, T10); + T15 = FNMS(T6, Tk, T14); + T2Q = FNMS(T5, Tk, T2P); + T2M = FMA(T5, Tm, T2L); + { + E T2h, T2d, Tl, Tq; + T2m = FNMS(T6, Tc, TS); + T2h = T19 * Tm; + T2i = FNMS(T1b, Tk, T2h); + T2d = T19 * Tk; + T2e = FMA(T1b, Tm, T2d); + Tl = T7 * Tk; + Tn = FMA(Tb, Tm, Tl); + Tq = T7 * Tm; + Tr = FNMS(Tb, Tk, Tq); + } + { + E T30, T34, T1k, T1p; + T30 = TT * Tk; + T34 = TT * Tm; + TX = FNMS(T6, T8, TW); + T31 = FMA(TX, Tm, T30); + T35 = FNMS(TX, Tk, T34); + T1k = T1j * Tk; + T1p = T1j * Tm; + T1l = FNMS(T5, T8, Tz); + T1m = FMA(T1l, Tm, T1k); + T1q = FNMS(T1l, Tk, T1p); + } + T1J = Tw * Tk; + T1N = Tw * Tm; + TA = FMA(T5, T8, Tz); + T1K = FMA(TA, Tm, T1J); + T1O = FNMS(TA, Tk, T1N); + { + E T1f, T2s, T2w, Tg, T1R, T1V; + T1f = T19 * Tc; + T2a = FNMS(T1b, T8, T1f); + T27 = FMA(T1b, Tc, T1a); + T2s = T27 * Tk; + T2w = T27 * Tm; + T1g = FMA(T1b, T8, T1f); + T2x = FNMS(T2a, Tk, T2w); + T2t = FMA(T2a, Tm, T2s); + Tg = T7 * Tc; + Th = FNMS(Tb, T8, Tg); + Td = FMA(Tb, Tc, T9); + T1R = Td * Tk; + T1V = Td * Tm; + T1S = FMA(Th, Tm, T1R); + T2X = FMA(Tb, T8, Tg); + T1W = FNMS(Th, Tk, T1V); + } + } + { + E T1, T7l, T4s, T6a, T7u, T7U, TM, T4f, T4g, T7o, T7p, T7q, T4z, T6n, T4G; + E T6k, T3a, T6m, T4w, T4a, T6j, T4D, T54, T6C, T5b, T6z, T1v, T6y, T58, T3t; + E T6B, T51, T5j, T6v, T5q, T6s, T21, T6r, T5n, T3H, T6u, T5g, T4O, T6d, T4V; + E T6g, T2C, T6f, T4S, T3W, T6c, T4L; + { + E Tj, T4j, TK, T4q, TC, T4o, Tt, T4l; + T1 = cr[0]; + T7l = ci[0]; + { + E Te, Tf, Ti, T4i; + Te = cr[WS(rs, 5)]; + Tf = Td * Te; + Ti = ci[WS(rs, 5)]; + T4i = Td * Ti; + Tj = FMA(Th, Ti, Tf); + T4j = FNMS(Th, Te, T4i); + } + { + E TF, TG, TJ, T4p; + TF = cr[WS(rs, 15)]; + TG = TE * TF; + TJ = ci[WS(rs, 15)]; + T4p = TE * TJ; + TK = FMA(TI, TJ, TG); + T4q = FNMS(TI, TF, T4p); + } + { + E Tx, Ty, TB, T4n; + Tx = cr[WS(rs, 10)]; + Ty = Tw * Tx; + TB = ci[WS(rs, 10)]; + T4n = Tw * TB; + TC = FMA(TA, TB, Ty); + T4o = FNMS(TA, Tx, T4n); + } + { + E To, Tp, Ts, T4k; + To = cr[WS(rs, 20)]; + Tp = Tn * To; + Ts = ci[WS(rs, 20)]; + T4k = Tn * Ts; + Tt = FMA(Tr, Ts, Tp); + T4l = FNMS(Tr, To, T4k); + } + { + E T4m, T4r, T7s, T7t; + T4m = T4j - T4l; + T4r = T4o - T4q; + T4s = FMA(KP618033988, T4r, T4m); + T6a = FNMS(KP618033988, T4m, T4r); + T7s = TC - TK; + T7t = Tj - Tt; + T7u = FNMS(KP618033988, T7t, T7s); + T7U = FMA(KP618033988, T7s, T7t); + } + { + E Tu, TL, T7m, T7n; + Tu = Tj + Tt; + TL = TC + TK; + TM = Tu + TL; + T4f = FNMS(KP250000000, TM, T1); + T4g = Tu - TL; + T7m = T4j + T4l; + T7n = T4o + T4q; + T7o = T7m + T7n; + T7p = FNMS(KP250000000, T7o, T7l); + T7q = T7m - T7n; + } + } + { + E T2G, T3Y, T2Z, T37, T38, T45, T47, T48, T2K, T2S, T2T, T40, T42, T43; + { + E T2D, T2E, T2F, T3X; + T2D = cr[WS(rs, 3)]; + T2E = T3 * T2D; + T2F = ci[WS(rs, 3)]; + T3X = T3 * T2F; + T2G = FMA(T6, T2F, T2E); + T3Y = FNMS(T6, T2D, T3X); + } + { + E T2V, T2W, T2Y, T44, T32, T33, T36, T46; + T2V = cr[WS(rs, 13)]; + T2W = T2U * T2V; + T2Y = ci[WS(rs, 13)]; + T44 = T2U * T2Y; + T32 = cr[WS(rs, 18)]; + T33 = T31 * T32; + T36 = ci[WS(rs, 18)]; + T46 = T31 * T36; + T2Z = FMA(T2X, T2Y, T2W); + T37 = FMA(T35, T36, T33); + T38 = T2Z + T37; + T45 = FNMS(T2X, T2V, T44); + T47 = FNMS(T35, T32, T46); + T48 = T45 + T47; + } + { + E T2H, T2I, T2J, T3Z, T2N, T2O, T2R, T41; + T2H = cr[WS(rs, 8)]; + T2I = T1j * T2H; + T2J = ci[WS(rs, 8)]; + T3Z = T1j * T2J; + T2N = cr[WS(rs, 23)]; + T2O = T2M * T2N; + T2R = ci[WS(rs, 23)]; + T41 = T2M * T2R; + T2K = FMA(T1l, T2J, T2I); + T2S = FMA(T2Q, T2R, T2O); + T2T = T2K + T2S; + T40 = FNMS(T1l, T2H, T3Z); + T42 = FNMS(T2Q, T2N, T41); + T43 = T40 + T42; + } + { + E T4x, T4y, T4E, T4F; + T4x = T42 - T40; + T4y = T47 - T45; + T4z = FMA(KP618033988, T4y, T4x); + T6n = FNMS(KP618033988, T4x, T4y); + T4E = T2K - T2S; + T4F = T2Z - T37; + T4G = FMA(KP618033988, T4F, T4E); + T6k = FNMS(KP618033988, T4E, T4F); + } + { + E T4v, T39, T4u, T4C, T49, T4B; + T4v = T38 - T2T; + T39 = T2T + T38; + T4u = FNMS(KP250000000, T39, T2G); + T3a = T2G + T39; + T6m = FMA(KP559016994, T4v, T4u); + T4w = FNMS(KP559016994, T4v, T4u); + T4C = T48 - T43; + T49 = T43 + T48; + T4B = FNMS(KP250000000, T49, T3Y); + T4a = T3Y + T49; + T6j = FMA(KP559016994, T4C, T4B); + T4D = FNMS(KP559016994, T4C, T4B); + } + } + { + E TR, T3h, T1i, T1s, T1t, T3o, T3q, T3r, TZ, T17, T18, T3j, T3l, T3m; + { + E TO, TP, TQ, T3g; + TO = cr[WS(rs, 1)]; + TP = T2 * TO; + TQ = ci[WS(rs, 1)]; + T3g = T2 * TQ; + TR = FMA(T5, TQ, TP); + T3h = FNMS(T5, TO, T3g); + } + { + E T1d, T1e, T1h, T3n, T1n, T1o, T1r, T3p; + T1d = cr[WS(rs, 11)]; + T1e = T1c * T1d; + T1h = ci[WS(rs, 11)]; + T3n = T1c * T1h; + T1n = cr[WS(rs, 16)]; + T1o = T1m * T1n; + T1r = ci[WS(rs, 16)]; + T3p = T1m * T1r; + T1i = FMA(T1g, T1h, T1e); + T1s = FMA(T1q, T1r, T1o); + T1t = T1i + T1s; + T3o = FNMS(T1g, T1d, T3n); + T3q = FNMS(T1q, T1n, T3p); + T3r = T3o + T3q; + } + { + E TU, TV, TY, T3i, T12, T13, T16, T3k; + TU = cr[WS(rs, 6)]; + TV = TT * TU; + TY = ci[WS(rs, 6)]; + T3i = TT * TY; + T12 = cr[WS(rs, 21)]; + T13 = T11 * T12; + T16 = ci[WS(rs, 21)]; + T3k = T11 * T16; + TZ = FMA(TX, TY, TV); + T17 = FMA(T15, T16, T13); + T18 = TZ + T17; + T3j = FNMS(TX, TU, T3i); + T3l = FNMS(T15, T12, T3k); + T3m = T3j + T3l; + } + { + E T52, T53, T59, T5a; + T52 = T17 - TZ; + T53 = T1s - T1i; + T54 = FMA(KP618033988, T53, T52); + T6C = FNMS(KP618033988, T52, T53); + T59 = T3j - T3l; + T5a = T3q - T3o; + T5b = FNMS(KP618033988, T5a, T59); + T6z = FMA(KP618033988, T59, T5a); + } + { + E T57, T1u, T56, T50, T3s, T4Z; + T57 = T18 - T1t; + T1u = T18 + T1t; + T56 = FNMS(KP250000000, T1u, TR); + T1v = TR + T1u; + T6y = FNMS(KP559016994, T57, T56); + T58 = FMA(KP559016994, T57, T56); + T50 = T3m - T3r; + T3s = T3m + T3r; + T4Z = FNMS(KP250000000, T3s, T3h); + T3t = T3h + T3s; + T6B = FNMS(KP559016994, T50, T4Z); + T51 = FMA(KP559016994, T50, T4Z); + } + } + { + E T1z, T3v, T1Q, T1Y, T1Z, T3C, T3E, T3F, T1D, T1H, T1I, T3x, T3z, T3A; + { + E T1w, T1x, T1y, T3u; + T1w = cr[WS(rs, 4)]; + T1x = T7 * T1w; + T1y = ci[WS(rs, 4)]; + T3u = T7 * T1y; + T1z = FMA(Tb, T1y, T1x); + T3v = FNMS(Tb, T1w, T3u); + } + { + E T1L, T1M, T1P, T3B, T1T, T1U, T1X, T3D; + T1L = cr[WS(rs, 14)]; + T1M = T1K * T1L; + T1P = ci[WS(rs, 14)]; + T3B = T1K * T1P; + T1T = cr[WS(rs, 19)]; + T1U = T1S * T1T; + T1X = ci[WS(rs, 19)]; + T3D = T1S * T1X; + T1Q = FMA(T1O, T1P, T1M); + T1Y = FMA(T1W, T1X, T1U); + T1Z = T1Q + T1Y; + T3C = FNMS(T1O, T1L, T3B); + T3E = FNMS(T1W, T1T, T3D); + T3F = T3C + T3E; + } + { + E T1A, T1B, T1C, T3w, T1E, T1F, T1G, T3y; + T1A = cr[WS(rs, 9)]; + T1B = T8 * T1A; + T1C = ci[WS(rs, 9)]; + T3w = T8 * T1C; + T1E = cr[WS(rs, 24)]; + T1F = Tk * T1E; + T1G = ci[WS(rs, 24)]; + T3y = Tk * T1G; + T1D = FMA(Tc, T1C, T1B); + T1H = FMA(Tm, T1G, T1F); + T1I = T1D + T1H; + T3x = FNMS(Tc, T1A, T3w); + T3z = FNMS(Tm, T1E, T3y); + T3A = T3x + T3z; + } + { + E T5h, T5i, T5o, T5p; + T5h = T1H - T1D; + T5i = T1Y - T1Q; + T5j = FMA(KP618033988, T5i, T5h); + T6v = FNMS(KP618033988, T5h, T5i); + T5o = T3z - T3x; + T5p = T3E - T3C; + T5q = FMA(KP618033988, T5p, T5o); + T6s = FNMS(KP618033988, T5o, T5p); + } + { + E T5m, T20, T5l, T5f, T3G, T5e; + T5m = T1I - T1Z; + T20 = T1I + T1Z; + T5l = FNMS(KP250000000, T20, T1z); + T21 = T1z + T20; + T6r = FNMS(KP559016994, T5m, T5l); + T5n = FMA(KP559016994, T5m, T5l); + T5f = T3F - T3A; + T3G = T3A + T3F; + T5e = FNMS(KP250000000, T3G, T3v); + T3H = T3v + T3G; + T6u = FMA(KP559016994, T5f, T5e); + T5g = FNMS(KP559016994, T5f, T5e); + } + } + { + E T26, T3K, T2r, T2z, T2A, T3R, T3T, T3U, T2c, T2k, T2l, T3M, T3O, T3P; + { + E T23, T24, T25, T3J; + T23 = cr[WS(rs, 2)]; + T24 = T19 * T23; + T25 = ci[WS(rs, 2)]; + T3J = T19 * T25; + T26 = FMA(T1b, T25, T24); + T3K = FNMS(T1b, T23, T3J); + } + { + E T2n, T2o, T2q, T3Q, T2u, T2v, T2y, T3S; + T2n = cr[WS(rs, 12)]; + T2o = T2m * T2n; + T2q = ci[WS(rs, 12)]; + T3Q = T2m * T2q; + T2u = cr[WS(rs, 17)]; + T2v = T2t * T2u; + T2y = ci[WS(rs, 17)]; + T3S = T2t * T2y; + T2r = FMA(T2p, T2q, T2o); + T2z = FMA(T2x, T2y, T2v); + T2A = T2r + T2z; + T3R = FNMS(T2p, T2n, T3Q); + T3T = FNMS(T2x, T2u, T3S); + T3U = T3R + T3T; + } + { + E T28, T29, T2b, T3L, T2f, T2g, T2j, T3N; + T28 = cr[WS(rs, 7)]; + T29 = T27 * T28; + T2b = ci[WS(rs, 7)]; + T3L = T27 * T2b; + T2f = cr[WS(rs, 22)]; + T2g = T2e * T2f; + T2j = ci[WS(rs, 22)]; + T3N = T2e * T2j; + T2c = FMA(T2a, T2b, T29); + T2k = FMA(T2i, T2j, T2g); + T2l = T2c + T2k; + T3M = FNMS(T2a, T28, T3L); + T3O = FNMS(T2i, T2f, T3N); + T3P = T3M + T3O; + } + { + E T4M, T4N, T4T, T4U; + T4M = T2k - T2c; + T4N = T2z - T2r; + T4O = FMA(KP618033988, T4N, T4M); + T6d = FNMS(KP618033988, T4M, T4N); + T4T = T3O - T3M; + T4U = T3R - T3T; + T4V = FNMS(KP618033988, T4U, T4T); + T6g = FMA(KP618033988, T4T, T4U); + } + { + E T4R, T2B, T4Q, T4K, T3V, T4J; + T4R = T2A - T2l; + T2B = T2l + T2A; + T4Q = FNMS(KP250000000, T2B, T26); + T2C = T26 + T2B; + T6f = FMA(KP559016994, T4R, T4Q); + T4S = FNMS(KP559016994, T4R, T4Q); + T4K = T3U - T3P; + T3V = T3P + T3U; + T4J = FNMS(KP250000000, T3V, T3K); + T3W = T3K + T3V; + T6c = FMA(KP559016994, T4K, T4J); + T4L = FNMS(KP559016994, T4K, T4J); + } + } + { + E T4c, T4e, TN, T3c, T3d, T3e, T4d, T3f; + { + E T3I, T4b, T22, T3b; + T3I = T3t - T3H; + T4b = T3W - T4a; + T4c = FMA(KP618033988, T4b, T3I); + T4e = FNMS(KP618033988, T3I, T4b); + TN = T1 + TM; + T22 = T1v + T21; + T3b = T2C + T3a; + T3c = T22 + T3b; + T3d = FNMS(KP250000000, T3c, TN); + T3e = T22 - T3b; + } + cr[0] = TN + T3c; + T4d = FNMS(KP559016994, T3e, T3d); + cr[WS(rs, 10)] = FNMS(KP951056516, T4e, T4d); + ci[WS(rs, 9)] = FMA(KP951056516, T4e, T4d); + T3f = FMA(KP559016994, T3e, T3d); + ci[WS(rs, 4)] = FNMS(KP951056516, T4c, T3f); + cr[WS(rs, 5)] = FMA(KP951056516, T4c, T3f); + } + { + E T4t, T5H, T7V, T87, T5A, T5D, T8f, T8e, T88, T89, T8a, T4Y, T5t, T5u, T62; + E T65, T83, T82, T7W, T7X, T7Y, T5O, T5V, T5W, T4h, T7T; + T4h = FMA(KP559016994, T4g, T4f); + T4t = FNMS(KP951056516, T4s, T4h); + T5H = FMA(KP951056516, T4s, T4h); + T7T = FMA(KP559016994, T7q, T7p); + T7V = FNMS(KP951056516, T7U, T7T); + T87 = FMA(KP951056516, T7U, T7T); + { + E T4I, T5B, T5s, T5z, T4X, T5C, T5d, T5y; + { + E T4A, T4H, T5k, T5r; + T4A = FMA(KP951056516, T4z, T4w); + T4H = FMA(KP951056516, T4G, T4D); + T4I = FNMS(KP126329378, T4H, T4A); + T5B = FMA(KP126329378, T4A, T4H); + T5k = FNMS(KP951056516, T5j, T5g); + T5r = FMA(KP951056516, T5q, T5n); + T5s = FMA(KP827271945, T5r, T5k); + T5z = FNMS(KP827271945, T5k, T5r); + } + { + E T4P, T4W, T55, T5c; + T4P = FNMS(KP951056516, T4O, T4L); + T4W = FMA(KP951056516, T4V, T4S); + T4X = FNMS(KP470564281, T4W, T4P); + T5C = FMA(KP470564281, T4P, T4W); + T55 = FNMS(KP951056516, T54, T51); + T5c = FNMS(KP951056516, T5b, T58); + T5d = FMA(KP634619297, T5c, T55); + T5y = FNMS(KP634619297, T55, T5c); + } + T5A = FMA(KP912575812, T5z, T5y); + T5D = FNMS(KP912018591, T5C, T5B); + T8f = FMA(KP912575812, T5s, T5d); + T8e = FMA(KP912018591, T4X, T4I); + T88 = FMA(KP912018591, T5C, T5B); + T89 = FNMS(KP912575812, T5z, T5y); + T8a = FMA(KP851038619, T89, T88); + T4Y = FNMS(KP912018591, T4X, T4I); + T5t = FNMS(KP912575812, T5s, T5d); + T5u = FNMS(KP851038619, T5t, T4Y); + } + { + E T5K, T60, T5U, T64, T5N, T61, T5R, T63; + { + E T5I, T5J, T5S, T5T; + T5I = FMA(KP951056516, T5b, T58); + T5J = FMA(KP951056516, T54, T51); + T5K = FMA(KP256756360, T5J, T5I); + T60 = FNMS(KP256756360, T5I, T5J); + T5S = FNMS(KP951056516, T4z, T4w); + T5T = FNMS(KP951056516, T4G, T4D); + T5U = FMA(KP939062505, T5T, T5S); + T64 = FNMS(KP939062505, T5S, T5T); + } + { + E T5L, T5M, T5P, T5Q; + T5L = FMA(KP951056516, T5j, T5g); + T5M = FNMS(KP951056516, T5q, T5n); + T5N = FMA(KP634619297, T5M, T5L); + T61 = FNMS(KP634619297, T5L, T5M); + T5P = FNMS(KP951056516, T4V, T4S); + T5Q = FMA(KP951056516, T4O, T4L); + T5R = FMA(KP549754652, T5Q, T5P); + T63 = FNMS(KP549754652, T5P, T5Q); + } + T62 = FMA(KP871714437, T61, T60); + T65 = FNMS(KP831864738, T64, T63); + T83 = FNMS(KP871714437, T5N, T5K); + T82 = FNMS(KP831864738, T5U, T5R); + T7W = FNMS(KP871714437, T61, T60); + T7X = FMA(KP831864738, T64, T63); + T7Y = FMA(KP904730450, T7X, T7W); + T5O = FMA(KP871714437, T5N, T5K); + T5V = FMA(KP831864738, T5U, T5R); + T5W = FMA(KP904730450, T5V, T5O); + } + cr[WS(rs, 4)] = FNMS(KP992114701, T5u, T4t); + ci[WS(rs, 23)] = FMA(KP968583161, T7Y, T7V); + ci[WS(rs, 20)] = FNMS(KP992114701, T8a, T87); + cr[WS(rs, 1)] = FMA(KP968583161, T5W, T5H); + { + E T5E, T5G, T5x, T5F, T5v, T5w; + T5E = FNMS(KP726211448, T5D, T5A); + T5G = FMA(KP525970792, T5A, T5D); + T5v = FMA(KP248028675, T5u, T4t); + T5w = FMA(KP851038619, T5t, T4Y); + T5x = FMA(KP554608978, T5w, T5v); + T5F = FNMS(KP554608978, T5w, T5v); + cr[WS(rs, 9)] = FNMS(KP803003575, T5E, T5x); + ci[WS(rs, 5)] = FMA(KP943557151, T5G, T5F); + ci[0] = FMA(KP803003575, T5E, T5x); + ci[WS(rs, 10)] = FNMS(KP943557151, T5G, T5F); + } + { + E T84, T86, T81, T85, T7Z, T80; + T84 = FNMS(KP683113946, T83, T82); + T86 = FMA(KP559154169, T82, T83); + T7Z = FNMS(KP242145790, T7Y, T7V); + T80 = FNMS(KP904730450, T7X, T7W); + T81 = FNMS(KP541454447, T80, T7Z); + T85 = FMA(KP541454447, T80, T7Z); + cr[WS(rs, 16)] = FMS(KP833417178, T84, T81); + ci[WS(rs, 18)] = FNMS(KP921177326, T86, T85); + ci[WS(rs, 13)] = FMA(KP833417178, T84, T81); + cr[WS(rs, 21)] = -(FMA(KP921177326, T86, T85)); + } + { + E T8g, T8i, T8d, T8h, T8b, T8c; + T8g = FNMS(KP525970792, T8f, T8e); + T8i = FMA(KP726211448, T8e, T8f); + T8b = FMA(KP248028675, T8a, T87); + T8c = FNMS(KP851038619, T89, T88); + T8d = FNMS(KP554608978, T8c, T8b); + T8h = FMA(KP554608978, T8c, T8b); + cr[WS(rs, 14)] = -(FMA(KP943557151, T8g, T8d)); + ci[WS(rs, 15)] = FNMS(KP803003575, T8i, T8h); + cr[WS(rs, 19)] = FMS(KP943557151, T8g, T8d); + cr[WS(rs, 24)] = -(FMA(KP803003575, T8i, T8h)); + } + { + E T66, T68, T5Z, T67, T5X, T5Y; + T66 = FMA(KP559154169, T65, T62); + T68 = FNMS(KP683113946, T62, T65); + T5X = FNMS(KP242145790, T5W, T5H); + T5Y = FNMS(KP904730450, T5V, T5O); + T5Z = FMA(KP541454447, T5Y, T5X); + T67 = FNMS(KP541454447, T5Y, T5X); + ci[WS(rs, 3)] = FNMS(KP921177326, T66, T5Z); + ci[WS(rs, 8)] = FMA(KP833417178, T68, T67); + cr[WS(rs, 6)] = FMA(KP921177326, T66, T5Z); + cr[WS(rs, 11)] = FNMS(KP833417178, T68, T67); + } + } + { + E T8s, T8u, T8j, T8m, T8n, T8o, T8t, T8p; + { + E T8q, T8r, T8k, T8l; + T8q = T2C - T3a; + T8r = T21 - T1v; + T8s = FMA(KP618033988, T8r, T8q); + T8u = FNMS(KP618033988, T8q, T8r); + T8j = T7o + T7l; + T8k = T3t + T3H; + T8l = T3W + T4a; + T8m = T8k + T8l; + T8n = FNMS(KP250000000, T8m, T8j); + T8o = T8k - T8l; + } + ci[WS(rs, 24)] = T8m + T8j; + T8t = FMA(KP559016994, T8o, T8n); + cr[WS(rs, 20)] = FMS(KP951056516, T8u, T8t); + ci[WS(rs, 19)] = FMA(KP951056516, T8u, T8t); + T8p = FNMS(KP559016994, T8o, T8n); + cr[WS(rs, 15)] = FMS(KP951056516, T8s, T8p); + ci[WS(rs, 14)] = FMA(KP951056516, T8s, T8p); + } + { + E T6b, T6T, T7v, T7H, T6M, T6P, T7P, T7O, T7I, T7J, T7K, T6q, T6F, T6G, T7e; + E T7h, T7D, T7C, T7w, T7x, T7y, T70, T77, T78, T69, T7r; + T69 = FNMS(KP559016994, T4g, T4f); + T6b = FMA(KP951056516, T6a, T69); + T6T = FNMS(KP951056516, T6a, T69); + T7r = FNMS(KP559016994, T7q, T7p); + T7v = FMA(KP951056516, T7u, T7r); + T7H = FNMS(KP951056516, T7u, T7r); + { + E T6i, T6N, T6E, T6L, T6p, T6O, T6x, T6K; + { + E T6e, T6h, T6A, T6D; + T6e = FMA(KP951056516, T6d, T6c); + T6h = FMA(KP951056516, T6g, T6f); + T6i = FMA(KP062914667, T6h, T6e); + T6N = FNMS(KP062914667, T6e, T6h); + T6A = FNMS(KP951056516, T6z, T6y); + T6D = FMA(KP951056516, T6C, T6B); + T6E = FMA(KP939062505, T6D, T6A); + T6L = FNMS(KP939062505, T6A, T6D); + } + { + E T6l, T6o, T6t, T6w; + T6l = FNMS(KP951056516, T6k, T6j); + T6o = FNMS(KP951056516, T6n, T6m); + T6p = FNMS(KP827271945, T6o, T6l); + T6O = FMA(KP827271945, T6l, T6o); + T6t = FNMS(KP951056516, T6s, T6r); + T6w = FMA(KP951056516, T6v, T6u); + T6x = FNMS(KP126329378, T6w, T6t); + T6K = FMA(KP126329378, T6t, T6w); + } + T6M = FMA(KP734762448, T6L, T6K); + T6P = FNMS(KP772036680, T6O, T6N); + T7P = FMA(KP734762448, T6E, T6x); + T7O = FNMS(KP772036680, T6p, T6i); + T7I = FMA(KP772036680, T6O, T6N); + T7J = FNMS(KP734762448, T6L, T6K); + T7K = FMA(KP994076283, T7J, T7I); + T6q = FMA(KP772036680, T6p, T6i); + T6F = FNMS(KP734762448, T6E, T6x); + T6G = FNMS(KP994076283, T6F, T6q); + } + { + E T6W, T7f, T76, T7d, T6Z, T7g, T73, T7c; + { + E T6U, T6V, T74, T75; + T6U = FMA(KP951056516, T6k, T6j); + T6V = FMA(KP951056516, T6n, T6m); + T6W = FMA(KP062914667, T6V, T6U); + T7f = FNMS(KP062914667, T6U, T6V); + T74 = FMA(KP951056516, T6z, T6y); + T75 = FNMS(KP951056516, T6C, T6B); + T76 = FMA(KP549754652, T75, T74); + T7d = FNMS(KP549754652, T74, T75); + } + { + E T6X, T6Y, T71, T72; + T6X = FNMS(KP951056516, T6d, T6c); + T6Y = FNMS(KP951056516, T6g, T6f); + T6Z = FMA(KP634619297, T6Y, T6X); + T7g = FNMS(KP634619297, T6X, T6Y); + T71 = FNMS(KP951056516, T6v, T6u); + T72 = FMA(KP951056516, T6s, T6r); + T73 = FNMS(KP470564281, T72, T71); + T7c = FMA(KP470564281, T71, T72); + } + T7e = FMA(KP968479752, T7d, T7c); + T7h = FNMS(KP845997307, T7g, T7f); + T7D = FNMS(KP968479752, T76, T73); + T7C = FNMS(KP845997307, T6Z, T6W); + T7w = FMA(KP845997307, T7g, T7f); + T7x = FNMS(KP968479752, T7d, T7c); + T7y = FMA(KP906616052, T7x, T7w); + T70 = FMA(KP845997307, T6Z, T6W); + T77 = FMA(KP968479752, T76, T73); + T78 = FMA(KP906616052, T77, T70); + } + cr[WS(rs, 3)] = FMA(KP998026728, T6G, T6b); + ci[WS(rs, 22)] = FNMS(KP998026728, T7y, T7v); + ci[WS(rs, 21)] = FNMS(KP998026728, T7K, T7H); + cr[WS(rs, 2)] = FMA(KP998026728, T78, T6T); + { + E T7E, T7G, T7B, T7F, T7z, T7A; + T7E = FNMS(KP560319534, T7D, T7C); + T7G = FMA(KP681693190, T7C, T7D); + T7z = FMA(KP249506682, T7y, T7v); + T7A = FNMS(KP906616052, T7x, T7w); + T7B = FNMS(KP557913902, T7A, T7z); + T7F = FMA(KP557913902, T7A, T7z); + cr[WS(rs, 17)] = -(FMA(KP949179823, T7E, T7B)); + ci[WS(rs, 17)] = FMA(KP860541664, T7G, T7F); + ci[WS(rs, 12)] = FNMS(KP949179823, T7E, T7B); + cr[WS(rs, 22)] = FMS(KP860541664, T7G, T7F); + } + { + E T7i, T7k, T7b, T7j, T79, T7a; + T7i = FMA(KP681693190, T7h, T7e); + T7k = FNMS(KP560319534, T7e, T7h); + T79 = FNMS(KP249506682, T78, T6T); + T7a = FNMS(KP906616052, T77, T70); + T7b = FNMS(KP557913902, T7a, T79); + T7j = FMA(KP557913902, T7a, T79); + ci[WS(rs, 2)] = FNMS(KP860541664, T7i, T7b); + cr[WS(rs, 12)] = FNMS(KP949179823, T7k, T7j); + cr[WS(rs, 7)] = FMA(KP860541664, T7i, T7b); + ci[WS(rs, 7)] = FMA(KP949179823, T7k, T7j); + } + { + E T6Q, T6S, T6J, T6R, T6H, T6I; + T6Q = FNMS(KP621716863, T6P, T6M); + T6S = FMA(KP614372930, T6M, T6P); + T6H = FNMS(KP249506682, T6G, T6b); + T6I = FMA(KP994076283, T6F, T6q); + T6J = FNMS(KP557913902, T6I, T6H); + T6R = FMA(KP557913902, T6I, T6H); + ci[WS(rs, 1)] = FNMS(KP943557151, T6Q, T6J); + ci[WS(rs, 11)] = FMA(KP949179823, T6S, T6R); + cr[WS(rs, 8)] = FMA(KP943557151, T6Q, T6J); + ci[WS(rs, 6)] = FNMS(KP949179823, T6S, T6R); + } + { + E T7Q, T7S, T7N, T7R, T7L, T7M; + T7Q = FNMS(KP614372930, T7P, T7O); + T7S = FMA(KP621716863, T7O, T7P); + T7L = FMA(KP249506682, T7K, T7H); + T7M = FNMS(KP994076283, T7J, T7I); + T7N = FNMS(KP557913902, T7M, T7L); + T7R = FMA(KP557913902, T7M, T7L); + cr[WS(rs, 13)] = -(FMA(KP949179823, T7Q, T7N)); + ci[WS(rs, 16)] = FNMS(KP943557151, T7S, T7R); + cr[WS(rs, 18)] = FMS(KP949179823, T7Q, T7N); + cr[WS(rs, 23)] = -(FMA(KP943557151, T7S, T7R)); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 24}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hf2_25", twinstr, &GENUS, {84, 78, 356, 0} }; + +void X(codelet_hf2_25) (planner *p) { + X(khc2hc_register) (p, hf2_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 25 -dit -name hf2_25 -include rdft/scalar/hf.h */ + +/* + * This function contains 440 FP additions, 340 FP multiplications, + * (or, 280 additions, 180 multiplications, 160 fused multiply/add), + * 149 stack variables, 20 constants, and 100 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(50, rs)) { + E T2, T5, T3, T6, T8, Td, T16, T14, Te, T9, T21, T23, Tx, TR, T1g; + E TB, T1f, TV, T1Q, Tg, T1S, Tk, T18, T2s, T1c, T2q, Tn, To, Tp, Tr; + E T28, T2x, TY, T2k, T2m, T2v, TG, TE, T10, T1h, T1E, T26, T1B, T1G, T1V; + E T1X, T1z, T1j; + { + E Tw, TT, Tz, TQ, Tv, TU, TA, TP; + { + E T4, Tc, T7, Tb; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tc = T5 * T3; + T7 = T5 * T6; + Tb = T2 * T6; + T8 = T4 - T7; + Td = Tb + Tc; + T16 = Tb - Tc; + T14 = T4 + T7; + Te = W[5]; + Tw = T5 * Te; + TT = T3 * Te; + Tz = T2 * Te; + TQ = T6 * Te; + T9 = W[4]; + Tv = T2 * T9; + TU = T6 * T9; + TA = T5 * T9; + TP = T3 * T9; + } + T21 = TP - TQ; + T23 = TT + TU; + { + E T15, T17, Ta, Tf, T1a, T1b, Ti, Tj; + Tx = Tv - Tw; + TR = TP + TQ; + T1g = Tz - TA; + TB = Tz + TA; + T1f = Tv + Tw; + TV = TT - TU; + T15 = T14 * T9; + T17 = T16 * Te; + T1Q = T15 + T17; + Ta = T8 * T9; + Tf = Td * Te; + Tg = Ta + Tf; + T1a = T14 * Te; + T1b = T16 * T9; + T1S = T1a - T1b; + Ti = T8 * Te; + Tj = Td * T9; + Tk = Ti - Tj; + T18 = T15 - T17; + T2s = Ti + Tj; + T1c = T1a + T1b; + T2q = Ta - Tf; + Tn = W[6]; + To = W[7]; + Tp = FMA(T8, Tn, Td * To); + Tr = FNMS(Td, Tn, T8 * To); + T28 = FNMS(T1S, Tn, T1Q * To); + T2x = FNMS(TV, Tn, TR * To); + TY = FMA(T3, Tn, T6 * To); + T2k = FMA(T2, Tn, T5 * To); + T2m = FNMS(T5, Tn, T2 * To); + T2v = FMA(TR, Tn, TV * To); + TG = FNMS(Te, Tn, T9 * To); + TE = FMA(T9, Tn, Te * To); + T10 = FNMS(T6, Tn, T3 * To); + T1h = FMA(T1f, Tn, T1g * To); + T1E = FMA(Tg, Tn, Tk * To); + T26 = FMA(T1Q, Tn, T1S * To); + T1B = FNMS(TB, Tn, Tx * To); + T1G = FNMS(Tk, Tn, Tg * To); + T1V = FMA(T14, Tn, T16 * To); + T1X = FNMS(T16, Tn, T14 * To); + T1z = FMA(Tx, Tn, TB * To); + T1j = FNMS(T1g, Tn, T1f * To); + } + } + { + E T1, T6v, T2F, T6A, TK, T2G, T6y, T6z, T6u, T71, T2O, T52, T2C, T6k, T4c; + E T5X, T4L, T5s, T4j, T5W, T4K, T5v, T1o, T6g, T30, T5M, T4A, T56, T3b, T5N; + E T4B, T59, T1L, T6h, T3r, T5P, T4E, T5d, T3y, T5Q, T4D, T5g, T2d, T6j, T3P; + E T5U, T4I, T5o, T3W, T5T, T4H, T5l; + { + E Tm, T2I, Tt, T2J, Tu, T6w, TD, T2L, TI, T2M, TJ, T6x; + T1 = cr[0]; + T6v = ci[0]; + { + E Th, Tl, Tq, Ts; + Th = cr[WS(rs, 5)]; + Tl = ci[WS(rs, 5)]; + Tm = FMA(Tg, Th, Tk * Tl); + T2I = FNMS(Tk, Th, Tg * Tl); + Tq = cr[WS(rs, 20)]; + Ts = ci[WS(rs, 20)]; + Tt = FMA(Tp, Tq, Tr * Ts); + T2J = FNMS(Tr, Tq, Tp * Ts); + } + Tu = Tm + Tt; + T6w = T2I + T2J; + { + E Ty, TC, TF, TH; + Ty = cr[WS(rs, 10)]; + TC = ci[WS(rs, 10)]; + TD = FMA(Tx, Ty, TB * TC); + T2L = FNMS(TB, Ty, Tx * TC); + TF = cr[WS(rs, 15)]; + TH = ci[WS(rs, 15)]; + TI = FMA(TE, TF, TG * TH); + T2M = FNMS(TG, TF, TE * TH); + } + TJ = TD + TI; + T6x = T2L + T2M; + T2F = KP559016994 * (Tu - TJ); + T6A = KP559016994 * (T6w - T6x); + TK = Tu + TJ; + T2G = FNMS(KP250000000, TK, T1); + T6y = T6w + T6x; + T6z = FNMS(KP250000000, T6y, T6v); + { + E T6s, T6t, T2K, T2N; + T6s = TD - TI; + T6t = Tm - Tt; + T6u = FNMS(KP587785252, T6t, KP951056516 * T6s); + T71 = FMA(KP951056516, T6t, KP587785252 * T6s); + T2K = T2I - T2J; + T2N = T2L - T2M; + T2O = FMA(KP951056516, T2K, KP587785252 * T2N); + T52 = FNMS(KP587785252, T2K, KP951056516 * T2N); + } + } + { + E T2g, T48, T3Y, T3Z, T4h, T4g, T43, T46, T49, T2p, T2A, T2B, T2e, T2f; + T2e = cr[WS(rs, 3)]; + T2f = ci[WS(rs, 3)]; + T2g = FMA(T3, T2e, T6 * T2f); + T48 = FNMS(T6, T2e, T3 * T2f); + { + E T2j, T41, T2z, T45, T2o, T42, T2u, T44; + { + E T2h, T2i, T2w, T2y; + T2h = cr[WS(rs, 8)]; + T2i = ci[WS(rs, 8)]; + T2j = FMA(T1f, T2h, T1g * T2i); + T41 = FNMS(T1g, T2h, T1f * T2i); + T2w = cr[WS(rs, 18)]; + T2y = ci[WS(rs, 18)]; + T2z = FMA(T2v, T2w, T2x * T2y); + T45 = FNMS(T2x, T2w, T2v * T2y); + } + { + E T2l, T2n, T2r, T2t; + T2l = cr[WS(rs, 23)]; + T2n = ci[WS(rs, 23)]; + T2o = FMA(T2k, T2l, T2m * T2n); + T42 = FNMS(T2m, T2l, T2k * T2n); + T2r = cr[WS(rs, 13)]; + T2t = ci[WS(rs, 13)]; + T2u = FMA(T2q, T2r, T2s * T2t); + T44 = FNMS(T2s, T2r, T2q * T2t); + } + T3Y = T2j - T2o; + T3Z = T2u - T2z; + T4h = T44 - T45; + T4g = T41 - T42; + T43 = T41 + T42; + T46 = T44 + T45; + T49 = T43 + T46; + T2p = T2j + T2o; + T2A = T2u + T2z; + T2B = T2p + T2A; + } + T2C = T2g + T2B; + T6k = T48 + T49; + { + E T40, T5r, T4b, T5q, T47, T4a; + T40 = FMA(KP951056516, T3Y, KP587785252 * T3Z); + T5r = FNMS(KP587785252, T3Y, KP951056516 * T3Z); + T47 = KP559016994 * (T43 - T46); + T4a = FNMS(KP250000000, T49, T48); + T4b = T47 + T4a; + T5q = T4a - T47; + T4c = T40 + T4b; + T5X = T5r + T5q; + T4L = T4b - T40; + T5s = T5q - T5r; + } + { + E T4i, T5u, T4f, T5t, T4d, T4e; + T4i = FMA(KP951056516, T4g, KP587785252 * T4h); + T5u = FNMS(KP587785252, T4g, KP951056516 * T4h); + T4d = KP559016994 * (T2p - T2A); + T4e = FNMS(KP250000000, T2B, T2g); + T4f = T4d + T4e; + T5t = T4e - T4d; + T4j = T4f - T4i; + T5W = T5t - T5u; + T4K = T4f + T4i; + T5v = T5t + T5u; + } + } + { + E TO, T37, T2V, T2Y, T32, T31, T34, T35, T38, T13, T1m, T1n, TM, TN; + TM = cr[WS(rs, 1)]; + TN = ci[WS(rs, 1)]; + TO = FMA(T2, TM, T5 * TN); + T37 = FNMS(T5, TM, T2 * TN); + { + E TX, T2T, T1l, T2X, T12, T2U, T1e, T2W; + { + E TS, TW, T1i, T1k; + TS = cr[WS(rs, 6)]; + TW = ci[WS(rs, 6)]; + TX = FMA(TR, TS, TV * TW); + T2T = FNMS(TV, TS, TR * TW); + T1i = cr[WS(rs, 16)]; + T1k = ci[WS(rs, 16)]; + T1l = FMA(T1h, T1i, T1j * T1k); + T2X = FNMS(T1j, T1i, T1h * T1k); + } + { + E TZ, T11, T19, T1d; + TZ = cr[WS(rs, 21)]; + T11 = ci[WS(rs, 21)]; + T12 = FMA(TY, TZ, T10 * T11); + T2U = FNMS(T10, TZ, TY * T11); + T19 = cr[WS(rs, 11)]; + T1d = ci[WS(rs, 11)]; + T1e = FMA(T18, T19, T1c * T1d); + T2W = FNMS(T1c, T19, T18 * T1d); + } + T2V = T2T - T2U; + T2Y = T2W - T2X; + T32 = T1e - T1l; + T31 = TX - T12; + T34 = T2T + T2U; + T35 = T2W + T2X; + T38 = T34 + T35; + T13 = TX + T12; + T1m = T1e + T1l; + T1n = T13 + T1m; + } + T1o = TO + T1n; + T6g = T37 + T38; + { + E T2Z, T55, T2S, T54, T2Q, T2R; + T2Z = FMA(KP951056516, T2V, KP587785252 * T2Y); + T55 = FNMS(KP587785252, T2V, KP951056516 * T2Y); + T2Q = KP559016994 * (T13 - T1m); + T2R = FNMS(KP250000000, T1n, TO); + T2S = T2Q + T2R; + T54 = T2R - T2Q; + T30 = T2S - T2Z; + T5M = T54 - T55; + T4A = T2S + T2Z; + T56 = T54 + T55; + } + { + E T33, T58, T3a, T57, T36, T39; + T33 = FMA(KP951056516, T31, KP587785252 * T32); + T58 = FNMS(KP587785252, T31, KP951056516 * T32); + T36 = KP559016994 * (T34 - T35); + T39 = FNMS(KP250000000, T38, T37); + T3a = T36 + T39; + T57 = T39 - T36; + T3b = T33 + T3a; + T5N = T58 + T57; + T4B = T3a - T33; + T59 = T57 - T58; + } + } + { + E T1r, T3n, T3d, T3e, T3w, T3v, T3i, T3l, T3o, T1y, T1J, T1K, T1p, T1q; + T1p = cr[WS(rs, 4)]; + T1q = ci[WS(rs, 4)]; + T1r = FMA(T8, T1p, Td * T1q); + T3n = FNMS(Td, T1p, T8 * T1q); + { + E T1u, T3g, T1I, T3k, T1x, T3h, T1D, T3j; + { + E T1s, T1t, T1F, T1H; + T1s = cr[WS(rs, 9)]; + T1t = ci[WS(rs, 9)]; + T1u = FMA(T9, T1s, Te * T1t); + T3g = FNMS(Te, T1s, T9 * T1t); + T1F = cr[WS(rs, 19)]; + T1H = ci[WS(rs, 19)]; + T1I = FMA(T1E, T1F, T1G * T1H); + T3k = FNMS(T1G, T1F, T1E * T1H); + } + { + E T1v, T1w, T1A, T1C; + T1v = cr[WS(rs, 24)]; + T1w = ci[WS(rs, 24)]; + T1x = FMA(Tn, T1v, To * T1w); + T3h = FNMS(To, T1v, Tn * T1w); + T1A = cr[WS(rs, 14)]; + T1C = ci[WS(rs, 14)]; + T1D = FMA(T1z, T1A, T1B * T1C); + T3j = FNMS(T1B, T1A, T1z * T1C); + } + T3d = T1x - T1u; + T3e = T1D - T1I; + T3w = T3j - T3k; + T3v = T3g - T3h; + T3i = T3g + T3h; + T3l = T3j + T3k; + T3o = T3i + T3l; + T1y = T1u + T1x; + T1J = T1D + T1I; + T1K = T1y + T1J; + } + T1L = T1r + T1K; + T6h = T3n + T3o; + { + E T3f, T5c, T3q, T5b, T3m, T3p; + T3f = FNMS(KP587785252, T3e, KP951056516 * T3d); + T5c = FMA(KP587785252, T3d, KP951056516 * T3e); + T3m = KP559016994 * (T3i - T3l); + T3p = FNMS(KP250000000, T3o, T3n); + T3q = T3m + T3p; + T5b = T3p - T3m; + T3r = T3f - T3q; + T5P = T5c + T5b; + T4E = T3f + T3q; + T5d = T5b - T5c; + } + { + E T3x, T5f, T3u, T5e, T3s, T3t; + T3x = FMA(KP951056516, T3v, KP587785252 * T3w); + T5f = FNMS(KP587785252, T3v, KP951056516 * T3w); + T3s = KP559016994 * (T1y - T1J); + T3t = FNMS(KP250000000, T1K, T1r); + T3u = T3s + T3t; + T5e = T3t - T3s; + T3y = T3u - T3x; + T5Q = T5e - T5f; + T4D = T3u + T3x; + T5g = T5e + T5f; + } + } + { + E T1P, T3L, T3B, T3C, T3U, T3T, T3G, T3J, T3M, T20, T2b, T2c, T1N, T1O; + T1N = cr[WS(rs, 2)]; + T1O = ci[WS(rs, 2)]; + T1P = FMA(T14, T1N, T16 * T1O); + T3L = FNMS(T16, T1N, T14 * T1O); + { + E T1U, T3E, T2a, T3I, T1Z, T3F, T25, T3H; + { + E T1R, T1T, T27, T29; + T1R = cr[WS(rs, 7)]; + T1T = ci[WS(rs, 7)]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T3E = FNMS(T1S, T1R, T1Q * T1T); + T27 = cr[WS(rs, 17)]; + T29 = ci[WS(rs, 17)]; + T2a = FMA(T26, T27, T28 * T29); + T3I = FNMS(T28, T27, T26 * T29); + } + { + E T1W, T1Y, T22, T24; + T1W = cr[WS(rs, 22)]; + T1Y = ci[WS(rs, 22)]; + T1Z = FMA(T1V, T1W, T1X * T1Y); + T3F = FNMS(T1X, T1W, T1V * T1Y); + T22 = cr[WS(rs, 12)]; + T24 = ci[WS(rs, 12)]; + T25 = FMA(T21, T22, T23 * T24); + T3H = FNMS(T23, T22, T21 * T24); + } + T3B = T1U - T1Z; + T3C = T25 - T2a; + T3U = T3H - T3I; + T3T = T3E - T3F; + T3G = T3E + T3F; + T3J = T3H + T3I; + T3M = T3G + T3J; + T20 = T1U + T1Z; + T2b = T25 + T2a; + T2c = T20 + T2b; + } + T2d = T1P + T2c; + T6j = T3L + T3M; + { + E T3D, T5n, T3O, T5m, T3K, T3N; + T3D = FMA(KP951056516, T3B, KP587785252 * T3C); + T5n = FNMS(KP587785252, T3B, KP951056516 * T3C); + T3K = KP559016994 * (T3G - T3J); + T3N = FNMS(KP250000000, T3M, T3L); + T3O = T3K + T3N; + T5m = T3N - T3K; + T3P = T3D + T3O; + T5U = T5n + T5m; + T4I = T3O - T3D; + T5o = T5m - T5n; + } + { + E T3V, T5k, T3S, T5j, T3Q, T3R; + T3V = FMA(KP951056516, T3T, KP587785252 * T3U); + T5k = FNMS(KP587785252, T3T, KP951056516 * T3U); + T3Q = KP559016994 * (T20 - T2b); + T3R = FNMS(KP250000000, T2c, T1P); + T3S = T3Q + T3R; + T5j = T3R - T3Q; + T3W = T3S - T3V; + T5T = T5j - T5k; + T4H = T3S + T3V; + T5l = T5j + T5k; + } + } + { + E T6m, T6o, TL, T2E, T6d, T6e, T6n, T6f; + { + E T6i, T6l, T1M, T2D; + T6i = T6g - T6h; + T6l = T6j - T6k; + T6m = FMA(KP951056516, T6i, KP587785252 * T6l); + T6o = FNMS(KP587785252, T6i, KP951056516 * T6l); + TL = T1 + TK; + T1M = T1o + T1L; + T2D = T2d + T2C; + T2E = T1M + T2D; + T6d = KP559016994 * (T1M - T2D); + T6e = FNMS(KP250000000, T2E, TL); + } + cr[0] = TL + T2E; + T6n = T6e - T6d; + cr[WS(rs, 10)] = T6n - T6o; + ci[WS(rs, 9)] = T6n + T6o; + T6f = T6d + T6e; + ci[WS(rs, 4)] = T6f - T6m; + cr[WS(rs, 5)] = T6f + T6m; + } + { + E T2P, T4z, T72, T7e, T4m, T7j, T4n, T7i, T4U, T77, T4X, T75, T4O, T6Y, T4P; + E T6X, T4s, T7f, T4v, T7d, T2H, T70; + T2H = T2F + T2G; + T2P = T2H - T2O; + T4z = T2H + T2O; + T70 = T6A + T6z; + T72 = T70 - T71; + T7e = T71 + T70; + { + E T3c, T3z, T3A, T3X, T4k, T4l; + T3c = FMA(KP535826794, T30, KP844327925 * T3b); + T3z = FNMS(KP637423989, T3y, KP770513242 * T3r); + T3A = T3c + T3z; + T3X = FNMS(KP425779291, T3W, KP904827052 * T3P); + T4k = FNMS(KP992114701, T4j, KP125333233 * T4c); + T4l = T3X + T4k; + T4m = T3A + T4l; + T7j = T3X - T4k; + T4n = KP559016994 * (T3A - T4l); + T7i = T3z - T3c; + } + { + E T4S, T4T, T73, T4V, T4W, T74; + T4S = FNMS(KP248689887, T4A, KP968583161 * T4B); + T4T = FNMS(KP844327925, T4D, KP535826794 * T4E); + T73 = T4S + T4T; + T4V = FNMS(KP481753674, T4H, KP876306680 * T4I); + T4W = FNMS(KP684547105, T4K, KP728968627 * T4L); + T74 = T4V + T4W; + T4U = T4S - T4T; + T77 = KP559016994 * (T73 - T74); + T4X = T4V - T4W; + T75 = T73 + T74; + } + { + E T4C, T4F, T4G, T4J, T4M, T4N; + T4C = FMA(KP968583161, T4A, KP248689887 * T4B); + T4F = FMA(KP535826794, T4D, KP844327925 * T4E); + T4G = T4C + T4F; + T4J = FMA(KP876306680, T4H, KP481753674 * T4I); + T4M = FMA(KP728968627, T4K, KP684547105 * T4L); + T4N = T4J + T4M; + T4O = T4G + T4N; + T6Y = T4J - T4M; + T4P = KP559016994 * (T4G - T4N); + T6X = T4F - T4C; + } + { + E T4q, T4r, T7b, T4t, T4u, T7c; + T4q = FNMS(KP844327925, T30, KP535826794 * T3b); + T4r = FMA(KP770513242, T3y, KP637423989 * T3r); + T7b = T4q + T4r; + T4t = FMA(KP125333233, T4j, KP992114701 * T4c); + T4u = FMA(KP904827052, T3W, KP425779291 * T3P); + T7c = T4u + T4t; + T4s = T4q - T4r; + T7f = T7b - T7c; + T4v = T4t - T4u; + T7d = KP559016994 * (T7b + T7c); + } + cr[WS(rs, 4)] = T2P + T4m; + ci[WS(rs, 23)] = T75 + T72; + ci[WS(rs, 20)] = T7f + T7e; + cr[WS(rs, 1)] = T4z + T4O; + { + E T4w, T4y, T4p, T4x, T4o; + T4w = FMA(KP951056516, T4s, KP587785252 * T4v); + T4y = FNMS(KP587785252, T4s, KP951056516 * T4v); + T4o = FNMS(KP250000000, T4m, T2P); + T4p = T4n + T4o; + T4x = T4o - T4n; + ci[0] = T4p - T4w; + ci[WS(rs, 5)] = T4x + T4y; + cr[WS(rs, 9)] = T4p + T4w; + ci[WS(rs, 10)] = T4x - T4y; + } + { + E T6Z, T79, T78, T7a, T76; + T6Z = FMA(KP587785252, T6X, KP951056516 * T6Y); + T79 = FNMS(KP587785252, T6Y, KP951056516 * T6X); + T76 = FNMS(KP250000000, T75, T72); + T78 = T76 - T77; + T7a = T77 + T76; + cr[WS(rs, 16)] = T6Z - T78; + ci[WS(rs, 18)] = T79 + T7a; + ci[WS(rs, 13)] = T6Z + T78; + cr[WS(rs, 21)] = T79 - T7a; + } + { + E T7k, T7l, T7h, T7m, T7g; + T7k = FMA(KP587785252, T7i, KP951056516 * T7j); + T7l = FNMS(KP587785252, T7j, KP951056516 * T7i); + T7g = FNMS(KP250000000, T7f, T7e); + T7h = T7d - T7g; + T7m = T7d + T7g; + cr[WS(rs, 14)] = T7h - T7k; + ci[WS(rs, 15)] = T7l + T7m; + cr[WS(rs, 19)] = T7k + T7h; + cr[WS(rs, 24)] = T7l - T7m; + } + { + E T4Y, T50, T4R, T4Z, T4Q; + T4Y = FMA(KP951056516, T4U, KP587785252 * T4X); + T50 = FNMS(KP587785252, T4U, KP951056516 * T4X); + T4Q = FNMS(KP250000000, T4O, T4z); + T4R = T4P + T4Q; + T4Z = T4Q - T4P; + ci[WS(rs, 3)] = T4R - T4Y; + ci[WS(rs, 8)] = T4Z + T50; + cr[WS(rs, 6)] = T4R + T4Y; + cr[WS(rs, 11)] = T4Z - T50; + } + } + { + E T7p, T7x, T7q, T7t, T7u, T7v, T7y, T7w; + { + E T7n, T7o, T7r, T7s; + T7n = T1L - T1o; + T7o = T2d - T2C; + T7p = FMA(KP587785252, T7n, KP951056516 * T7o); + T7x = FNMS(KP587785252, T7o, KP951056516 * T7n); + T7q = T6y + T6v; + T7r = T6g + T6h; + T7s = T6j + T6k; + T7t = T7r + T7s; + T7u = FNMS(KP250000000, T7t, T7q); + T7v = KP559016994 * (T7r - T7s); + } + ci[WS(rs, 24)] = T7t + T7q; + T7y = T7v + T7u; + cr[WS(rs, 20)] = T7x - T7y; + ci[WS(rs, 19)] = T7x + T7y; + T7w = T7u - T7v; + cr[WS(rs, 15)] = T7p - T7w; + ci[WS(rs, 14)] = T7p + T7w; + } + { + E T53, T5L, T6C, T6O, T5y, T6T, T5z, T6S, T66, T6H, T69, T6F, T60, T6q, T61; + E T6p, T5E, T6P, T5H, T6N, T51, T6B; + T51 = T2G - T2F; + T53 = T51 + T52; + T5L = T51 - T52; + T6B = T6z - T6A; + T6C = T6u + T6B; + T6O = T6B - T6u; + { + E T5a, T5h, T5i, T5p, T5w, T5x; + T5a = FMA(KP728968627, T56, KP684547105 * T59); + T5h = FNMS(KP992114701, T5g, KP125333233 * T5d); + T5i = T5a + T5h; + T5p = FMA(KP062790519, T5l, KP998026728 * T5o); + T5w = FNMS(KP637423989, T5v, KP770513242 * T5s); + T5x = T5p + T5w; + T5y = T5i + T5x; + T6T = T5p - T5w; + T5z = KP559016994 * (T5i - T5x); + T6S = T5h - T5a; + } + { + E T64, T65, T6D, T67, T68, T6E; + T64 = FNMS(KP481753674, T5M, KP876306680 * T5N); + T65 = FMA(KP904827052, T5Q, KP425779291 * T5P); + T6D = T64 - T65; + T67 = FNMS(KP844327925, T5T, KP535826794 * T5U); + T68 = FNMS(KP998026728, T5W, KP062790519 * T5X); + T6E = T67 + T68; + T66 = T64 + T65; + T6H = KP559016994 * (T6D - T6E); + T69 = T67 - T68; + T6F = T6D + T6E; + } + { + E T5O, T5R, T5S, T5V, T5Y, T5Z; + T5O = FMA(KP876306680, T5M, KP481753674 * T5N); + T5R = FNMS(KP425779291, T5Q, KP904827052 * T5P); + T5S = T5O + T5R; + T5V = FMA(KP535826794, T5T, KP844327925 * T5U); + T5Y = FMA(KP062790519, T5W, KP998026728 * T5X); + T5Z = T5V + T5Y; + T60 = T5S + T5Z; + T6q = T5V - T5Y; + T61 = KP559016994 * (T5S - T5Z); + T6p = T5R - T5O; + } + { + E T5C, T5D, T6L, T5F, T5G, T6M; + T5C = FNMS(KP684547105, T56, KP728968627 * T59); + T5D = FMA(KP125333233, T5g, KP992114701 * T5d); + T6L = T5C - T5D; + T5F = FNMS(KP998026728, T5l, KP062790519 * T5o); + T5G = FMA(KP770513242, T5v, KP637423989 * T5s); + T6M = T5F - T5G; + T5E = T5C + T5D; + T6P = T6L + T6M; + T5H = T5F + T5G; + T6N = KP559016994 * (T6L - T6M); + } + cr[WS(rs, 3)] = T53 + T5y; + ci[WS(rs, 22)] = T6F + T6C; + ci[WS(rs, 21)] = T6P + T6O; + cr[WS(rs, 2)] = T5L + T60; + { + E T6r, T6J, T6I, T6K, T6G; + T6r = FMA(KP587785252, T6p, KP951056516 * T6q); + T6J = FNMS(KP587785252, T6q, KP951056516 * T6p); + T6G = FNMS(KP250000000, T6F, T6C); + T6I = T6G - T6H; + T6K = T6H + T6G; + cr[WS(rs, 17)] = T6r - T6I; + ci[WS(rs, 17)] = T6J + T6K; + ci[WS(rs, 12)] = T6r + T6I; + cr[WS(rs, 22)] = T6J - T6K; + } + { + E T6a, T6c, T63, T6b, T62; + T6a = FMA(KP951056516, T66, KP587785252 * T69); + T6c = FNMS(KP587785252, T66, KP951056516 * T69); + T62 = FNMS(KP250000000, T60, T5L); + T63 = T61 + T62; + T6b = T62 - T61; + ci[WS(rs, 2)] = T63 - T6a; + ci[WS(rs, 7)] = T6b + T6c; + cr[WS(rs, 7)] = T63 + T6a; + cr[WS(rs, 12)] = T6b - T6c; + } + { + E T5I, T5K, T5B, T5J, T5A; + T5I = FMA(KP951056516, T5E, KP587785252 * T5H); + T5K = FNMS(KP587785252, T5E, KP951056516 * T5H); + T5A = FNMS(KP250000000, T5y, T53); + T5B = T5z + T5A; + T5J = T5A - T5z; + ci[WS(rs, 1)] = T5B - T5I; + ci[WS(rs, 6)] = T5J + T5K; + cr[WS(rs, 8)] = T5B + T5I; + ci[WS(rs, 11)] = T5J - T5K; + } + { + E T6U, T6V, T6R, T6W, T6Q; + T6U = FMA(KP587785252, T6S, KP951056516 * T6T); + T6V = FNMS(KP587785252, T6T, KP951056516 * T6S); + T6Q = FNMS(KP250000000, T6P, T6O); + T6R = T6N - T6Q; + T6W = T6N + T6Q; + cr[WS(rs, 13)] = T6R - T6U; + ci[WS(rs, 16)] = T6V + T6W; + cr[WS(rs, 18)] = T6U + T6R; + cr[WS(rs, 23)] = T6V - T6W; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 24}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hf2_25", twinstr, &GENUS, {280, 180, 160, 0} }; + +void X(codelet_hf2_25) (planner *p) { + X(khc2hc_register) (p, hf2_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_32.c new file mode 100644 index 000000000..72376eeba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_32.c @@ -0,0 +1,1893 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:36 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -dit -name hf2_32 -include rdft/scalar/hf.h */ + +/* + * This function contains 488 FP additions, 350 FP multiplications, + * (or, 236 additions, 98 multiplications, 252 fused multiply/add), + * 164 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T2, T8, T3, T6, Te, Ti, T5, T7, TJ, Tb, TM, Tc, Ts, T23, T1w; + E T19, TA, TE, T1s, T1N, T1o, T1C, T1F, T1K, T15, T11, T2F, T31, T2J, T34; + E T3f, T3z, T3j, T3C, Tw, T3M, T3Q, T1z, T2s, T2w, T1d, T3n, T3r, T26, T2T; + E T2X, Th, TR, TP, Td, Tj, TW, Tn, TS, T1U, T2b, T29, T1R, T1V, T2g; + E T1Z, T2c; + { + E Tz, T1n, T10, TD, T1r, T14, T9, T1Q, Tv, T1c; + { + E T4, T18, Ta, Tr; + T2 = W[0]; + T8 = W[4]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + T18 = T3 * T8; + Ta = T2 * T6; + Tr = T2 * T8; + Te = W[6]; + Tz = T3 * Te; + T1n = T8 * Te; + T10 = T2 * Te; + Ti = W[7]; + TD = T3 * Ti; + T1r = T8 * Ti; + T14 = T2 * Ti; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + TJ = FNMS(T5, T6, T4); + T9 = T7 * T8; + T1Q = TJ * T8; + Tb = FNMS(T5, T3, Ta); + TM = FMA(T5, T3, Ta); + Tc = W[5]; + Tv = T2 * Tc; + T1c = T3 * Tc; + Ts = FMA(T5, Tc, Tr); + T23 = FMA(T6, Tc, T18); + T1w = FNMS(T5, Tc, Tr); + T19 = FNMS(T6, Tc, T18); + } + TA = FMA(T6, Ti, Tz); + TE = FNMS(T6, Te, TD); + T1s = FNMS(Tc, Te, T1r); + T1N = FMA(T6, Te, TD); + T1o = FMA(Tc, Ti, T1n); + T1C = FMA(T5, Ti, T10); + T1F = FNMS(T5, Te, T14); + T1K = FNMS(T6, Ti, Tz); + T15 = FMA(T5, Te, T14); + T11 = FNMS(T5, Ti, T10); + { + E T2E, T2I, T2S, T2W; + T2E = T7 * Te; + T2F = FMA(Tb, Ti, T2E); + T31 = FNMS(Tb, Ti, T2E); + T2I = T7 * Ti; + T2J = FNMS(Tb, Te, T2I); + T34 = FMA(Tb, Te, T2I); + { + E T3e, T3i, T3L, T3P; + T3e = TJ * Te; + T3f = FNMS(TM, Ti, T3e); + T3z = FMA(TM, Ti, T3e); + T3i = TJ * Ti; + T3j = FMA(TM, Te, T3i); + T3C = FNMS(TM, Te, T3i); + T3L = Ts * Te; + T3P = Ts * Ti; + Tw = FNMS(T5, T8, Tv); + T3M = FMA(Tw, Ti, T3L); + T3Q = FNMS(Tw, Te, T3P); + } + { + E T2r, T2v, T3m, T3q; + T2r = T1w * Te; + T2v = T1w * Ti; + T1z = FMA(T5, T8, Tv); + T2s = FMA(T1z, Ti, T2r); + T2w = FNMS(T1z, Te, T2v); + T3m = T19 * Te; + T3q = T19 * Ti; + T1d = FMA(T6, T8, T1c); + T3n = FMA(T1d, Ti, T3m); + T3r = FNMS(T1d, Te, T3q); + } + T2S = T23 * Te; + T2W = T23 * Ti; + T26 = FNMS(T6, T8, T1c); + T2T = FMA(T26, Ti, T2S); + T2X = FNMS(T26, Te, T2W); + { + E TQ, TV, Tf, Tm, Tg; + Tg = T7 * Tc; + Th = FMA(Tb, T8, Tg); + TR = FNMS(Tb, T8, Tg); + TP = FMA(Tb, Tc, T9); + TQ = TP * Te; + TV = TP * Ti; + Td = FNMS(Tb, Tc, T9); + Tf = Td * Te; + Tm = Td * Ti; + Tj = FMA(Th, Ti, Tf); + TW = FNMS(TR, Te, TV); + Tn = FNMS(Th, Te, Tm); + TS = FMA(TR, Ti, TQ); + } + { + E T2a, T2f, T1S, T1Y, T1T; + T1T = TJ * Tc; + T1U = FMA(TM, T8, T1T); + T2b = FNMS(TM, T8, T1T); + T29 = FMA(TM, Tc, T1Q); + T2a = T29 * Te; + T2f = T29 * Ti; + T1R = FNMS(TM, Tc, T1Q); + T1S = T1R * Te; + T1Y = T1R * Ti; + T1V = FMA(T1U, Ti, T1S); + T2g = FNMS(T2b, Te, T2f); + T1Z = FNMS(T1U, Te, T1Y); + T2c = FMA(T2b, Ti, T2a); + } + } + } + { + E Tq, T46, T8H, T98, TH, T97, T4b, T8D, TZ, T7g, T4j, T6t, T1g, T7f, T4q; + E T6u, T1v, T1I, T7j, T7k, T7l, T7m, T4z, T6y, T4G, T6x, T22, T2j, T7o, T7p; + E T7q, T7r, T4O, T6B, T4V, T6A, T3G, T7G, T7N, T8n, T5E, T6M, T61, T6P, T2N; + E T7v, T7C, T8i, T55, T6F, T5s, T6I, T43, T7O, T7J, T8o, T5L, T63, T5S, T62; + E T3c, T7D, T7y, T8j, T5c, T5t, T5j, T5u; + { + E T1, T8G, Tk, Tl, To, T8E, Tp, T8F; + T1 = cr[0]; + T8G = ci[0]; + Tk = cr[WS(rs, 16)]; + Tl = Tj * Tk; + To = ci[WS(rs, 16)]; + T8E = Tj * To; + Tp = FMA(Tn, To, Tl); + Tq = T1 + Tp; + T46 = T1 - Tp; + T8F = FNMS(Tn, Tk, T8E); + T8H = T8F + T8G; + T98 = T8G - T8F; + } + { + E Tt, Tu, Tx, T47, TB, TC, TF, T49; + Tt = cr[WS(rs, 8)]; + Tu = Ts * Tt; + Tx = ci[WS(rs, 8)]; + T47 = Ts * Tx; + TB = cr[WS(rs, 24)]; + TC = TA * TB; + TF = ci[WS(rs, 24)]; + T49 = TA * TF; + { + E Ty, TG, T48, T4a; + Ty = FMA(Tw, Tx, Tu); + TG = FMA(TE, TF, TC); + TH = Ty + TG; + T97 = Ty - TG; + T48 = FNMS(Tw, Tt, T47); + T4a = FNMS(TE, TB, T49); + T4b = T48 - T4a; + T8D = T48 + T4a; + } + } + { + E TO, T4f, TY, T4h, T4d, T4i; + { + E TK, TL, TN, T4e; + TK = cr[WS(rs, 4)]; + TL = TJ * TK; + TN = ci[WS(rs, 4)]; + T4e = TJ * TN; + TO = FMA(TM, TN, TL); + T4f = FNMS(TM, TK, T4e); + } + { + E TT, TU, TX, T4g; + TT = cr[WS(rs, 20)]; + TU = TS * TT; + TX = ci[WS(rs, 20)]; + T4g = TS * TX; + TY = FMA(TW, TX, TU); + T4h = FNMS(TW, TT, T4g); + } + TZ = TO + TY; + T7g = T4f + T4h; + T4d = TO - TY; + T4i = T4f - T4h; + T4j = T4d - T4i; + T6t = T4d + T4i; + } + { + E T17, T4m, T1f, T4o, T4k, T4p; + { + E T12, T13, T16, T4l; + T12 = cr[WS(rs, 28)]; + T13 = T11 * T12; + T16 = ci[WS(rs, 28)]; + T4l = T11 * T16; + T17 = FMA(T15, T16, T13); + T4m = FNMS(T15, T12, T4l); + } + { + E T1a, T1b, T1e, T4n; + T1a = cr[WS(rs, 12)]; + T1b = T19 * T1a; + T1e = ci[WS(rs, 12)]; + T4n = T19 * T1e; + T1f = FMA(T1d, T1e, T1b); + T4o = FNMS(T1d, T1a, T4n); + } + T1g = T17 + T1f; + T7f = T4m + T4o; + T4k = T17 - T1f; + T4p = T4m - T4o; + T4q = T4k + T4p; + T6u = T4k - T4p; + } + { + E T1m, T4u, T1H, T4E, T1u, T4w, T1B, T4C; + { + E T1j, T1k, T1l, T4t; + T1j = cr[WS(rs, 2)]; + T1k = T7 * T1j; + T1l = ci[WS(rs, 2)]; + T4t = T7 * T1l; + T1m = FMA(Tb, T1l, T1k); + T4u = FNMS(Tb, T1j, T4t); + } + { + E T1D, T1E, T1G, T4D; + T1D = cr[WS(rs, 26)]; + T1E = T1C * T1D; + T1G = ci[WS(rs, 26)]; + T4D = T1C * T1G; + T1H = FMA(T1F, T1G, T1E); + T4E = FNMS(T1F, T1D, T4D); + } + { + E T1p, T1q, T1t, T4v; + T1p = cr[WS(rs, 18)]; + T1q = T1o * T1p; + T1t = ci[WS(rs, 18)]; + T4v = T1o * T1t; + T1u = FMA(T1s, T1t, T1q); + T4w = FNMS(T1s, T1p, T4v); + } + { + E T1x, T1y, T1A, T4B; + T1x = cr[WS(rs, 10)]; + T1y = T1w * T1x; + T1A = ci[WS(rs, 10)]; + T4B = T1w * T1A; + T1B = FMA(T1z, T1A, T1y); + T4C = FNMS(T1z, T1x, T4B); + } + T1v = T1m + T1u; + T1I = T1B + T1H; + T7j = T1v - T1I; + T7k = T4u + T4w; + T7l = T4C + T4E; + T7m = T7k - T7l; + { + E T4x, T4y, T4A, T4F; + T4x = T4u - T4w; + T4y = T1B - T1H; + T4z = T4x + T4y; + T6y = T4x - T4y; + T4A = T1m - T1u; + T4F = T4C - T4E; + T4G = T4A - T4F; + T6x = T4A + T4F; + } + } + { + E T1P, T4J, T2i, T4T, T21, T4L, T28, T4R; + { + E T1L, T1M, T1O, T4I; + T1L = cr[WS(rs, 30)]; + T1M = T1K * T1L; + T1O = ci[WS(rs, 30)]; + T4I = T1K * T1O; + T1P = FMA(T1N, T1O, T1M); + T4J = FNMS(T1N, T1L, T4I); + } + { + E T2d, T2e, T2h, T4S; + T2d = cr[WS(rs, 22)]; + T2e = T2c * T2d; + T2h = ci[WS(rs, 22)]; + T4S = T2c * T2h; + T2i = FMA(T2g, T2h, T2e); + T4T = FNMS(T2g, T2d, T4S); + } + { + E T1W, T1X, T20, T4K; + T1W = cr[WS(rs, 14)]; + T1X = T1V * T1W; + T20 = ci[WS(rs, 14)]; + T4K = T1V * T20; + T21 = FMA(T1Z, T20, T1X); + T4L = FNMS(T1Z, T1W, T4K); + } + { + E T24, T25, T27, T4Q; + T24 = cr[WS(rs, 6)]; + T25 = T23 * T24; + T27 = ci[WS(rs, 6)]; + T4Q = T23 * T27; + T28 = FMA(T26, T27, T25); + T4R = FNMS(T26, T24, T4Q); + } + T22 = T1P + T21; + T2j = T28 + T2i; + T7o = T22 - T2j; + T7p = T4J + T4L; + T7q = T4R + T4T; + T7r = T7p - T7q; + { + E T4M, T4N, T4P, T4U; + T4M = T4J - T4L; + T4N = T28 - T2i; + T4O = T4M + T4N; + T6B = T4M - T4N; + T4P = T1P - T21; + T4U = T4R - T4T; + T4V = T4P - T4U; + T6A = T4P + T4U; + } + } + { + E T3l, T5X, T3E, T5C, T3t, T5Z, T3y, T5A; + { + E T3g, T3h, T3k, T5W; + T3g = cr[WS(rs, 31)]; + T3h = T3f * T3g; + T3k = ci[WS(rs, 31)]; + T5W = T3f * T3k; + T3l = FMA(T3j, T3k, T3h); + T5X = FNMS(T3j, T3g, T5W); + } + { + E T3A, T3B, T3D, T5B; + T3A = cr[WS(rs, 23)]; + T3B = T3z * T3A; + T3D = ci[WS(rs, 23)]; + T5B = T3z * T3D; + T3E = FMA(T3C, T3D, T3B); + T5C = FNMS(T3C, T3A, T5B); + } + { + E T3o, T3p, T3s, T5Y; + T3o = cr[WS(rs, 15)]; + T3p = T3n * T3o; + T3s = ci[WS(rs, 15)]; + T5Y = T3n * T3s; + T3t = FMA(T3r, T3s, T3p); + T5Z = FNMS(T3r, T3o, T5Y); + } + { + E T3v, T3w, T3x, T5z; + T3v = cr[WS(rs, 7)]; + T3w = TP * T3v; + T3x = ci[WS(rs, 7)]; + T5z = TP * T3x; + T3y = FMA(TR, T3x, T3w); + T5A = FNMS(TR, T3v, T5z); + } + { + E T3u, T3F, T7L, T7M; + T3u = T3l + T3t; + T3F = T3y + T3E; + T3G = T3u + T3F; + T7G = T3u - T3F; + T7L = T5X + T5Z; + T7M = T5A + T5C; + T7N = T7L - T7M; + T8n = T7L + T7M; + } + { + E T5y, T5D, T5V, T60; + T5y = T3l - T3t; + T5D = T5A - T5C; + T5E = T5y - T5D; + T6M = T5y + T5D; + T5V = T3E - T3y; + T60 = T5X - T5Z; + T61 = T5V - T60; + T6P = T60 + T5V; + } + } + { + E T2q, T5n, T2L, T53, T2y, T5p, T2D, T51; + { + E T2n, T2o, T2p, T5m; + T2n = cr[WS(rs, 1)]; + T2o = T2 * T2n; + T2p = ci[WS(rs, 1)]; + T5m = T2 * T2p; + T2q = FMA(T5, T2p, T2o); + T5n = FNMS(T5, T2n, T5m); + } + { + E T2G, T2H, T2K, T52; + T2G = cr[WS(rs, 25)]; + T2H = T2F * T2G; + T2K = ci[WS(rs, 25)]; + T52 = T2F * T2K; + T2L = FMA(T2J, T2K, T2H); + T53 = FNMS(T2J, T2G, T52); + } + { + E T2t, T2u, T2x, T5o; + T2t = cr[WS(rs, 17)]; + T2u = T2s * T2t; + T2x = ci[WS(rs, 17)]; + T5o = T2s * T2x; + T2y = FMA(T2w, T2x, T2u); + T5p = FNMS(T2w, T2t, T5o); + } + { + E T2A, T2B, T2C, T50; + T2A = cr[WS(rs, 9)]; + T2B = T8 * T2A; + T2C = ci[WS(rs, 9)]; + T50 = T8 * T2C; + T2D = FMA(Tc, T2C, T2B); + T51 = FNMS(Tc, T2A, T50); + } + { + E T2z, T2M, T7A, T7B; + T2z = T2q + T2y; + T2M = T2D + T2L; + T2N = T2z + T2M; + T7v = T2z - T2M; + T7A = T5n + T5p; + T7B = T51 + T53; + T7C = T7A - T7B; + T8i = T7A + T7B; + } + { + E T4Z, T54, T5q, T5r; + T4Z = T2q - T2y; + T54 = T51 - T53; + T55 = T4Z - T54; + T6F = T4Z + T54; + T5q = T5n - T5p; + T5r = T2D - T2L; + T5s = T5q + T5r; + T6I = T5q - T5r; + } + } + { + E T3K, T5H, T41, T5Q, T3S, T5J, T3X, T5O; + { + E T3H, T3I, T3J, T5G; + T3H = cr[WS(rs, 3)]; + T3I = T3 * T3H; + T3J = ci[WS(rs, 3)]; + T5G = T3 * T3J; + T3K = FMA(T6, T3J, T3I); + T5H = FNMS(T6, T3H, T5G); + } + { + E T3Y, T3Z, T40, T5P; + T3Y = cr[WS(rs, 11)]; + T3Z = Td * T3Y; + T40 = ci[WS(rs, 11)]; + T5P = Td * T40; + T41 = FMA(Th, T40, T3Z); + T5Q = FNMS(Th, T3Y, T5P); + } + { + E T3N, T3O, T3R, T5I; + T3N = cr[WS(rs, 19)]; + T3O = T3M * T3N; + T3R = ci[WS(rs, 19)]; + T5I = T3M * T3R; + T3S = FMA(T3Q, T3R, T3O); + T5J = FNMS(T3Q, T3N, T5I); + } + { + E T3U, T3V, T3W, T5N; + T3U = cr[WS(rs, 27)]; + T3V = Te * T3U; + T3W = ci[WS(rs, 27)]; + T5N = Te * T3W; + T3X = FMA(Ti, T3W, T3V); + T5O = FNMS(Ti, T3U, T5N); + } + { + E T3T, T42, T7H, T7I; + T3T = T3K + T3S; + T42 = T3X + T41; + T43 = T3T + T42; + T7O = T42 - T3T; + T7H = T5O + T5Q; + T7I = T5H + T5J; + T7J = T7H - T7I; + T8o = T7I + T7H; + } + { + E T5F, T5K, T5M, T5R; + T5F = T3K - T3S; + T5K = T5H - T5J; + T5L = T5F - T5K; + T63 = T5F + T5K; + T5M = T3X - T41; + T5R = T5O - T5Q; + T5S = T5M + T5R; + T62 = T5M - T5R; + } + } + { + E T2R, T58, T3a, T5h, T2Z, T5a, T36, T5f; + { + E T2O, T2P, T2Q, T57; + T2O = cr[WS(rs, 5)]; + T2P = T29 * T2O; + T2Q = ci[WS(rs, 5)]; + T57 = T29 * T2Q; + T2R = FMA(T2b, T2Q, T2P); + T58 = FNMS(T2b, T2O, T57); + } + { + E T37, T38, T39, T5g; + T37 = cr[WS(rs, 13)]; + T38 = T1R * T37; + T39 = ci[WS(rs, 13)]; + T5g = T1R * T39; + T3a = FMA(T1U, T39, T38); + T5h = FNMS(T1U, T37, T5g); + } + { + E T2U, T2V, T2Y, T59; + T2U = cr[WS(rs, 21)]; + T2V = T2T * T2U; + T2Y = ci[WS(rs, 21)]; + T59 = T2T * T2Y; + T2Z = FMA(T2X, T2Y, T2V); + T5a = FNMS(T2X, T2U, T59); + } + { + E T32, T33, T35, T5e; + T32 = cr[WS(rs, 29)]; + T33 = T31 * T32; + T35 = ci[WS(rs, 29)]; + T5e = T31 * T35; + T36 = FMA(T34, T35, T33); + T5f = FNMS(T34, T32, T5e); + } + { + E T30, T3b, T7w, T7x; + T30 = T2R + T2Z; + T3b = T36 + T3a; + T3c = T30 + T3b; + T7D = T30 - T3b; + T7w = T5f + T5h; + T7x = T58 + T5a; + T7y = T7w - T7x; + T8j = T7x + T7w; + } + { + E T56, T5b, T5d, T5i; + T56 = T2R - T2Z; + T5b = T58 - T5a; + T5c = T56 - T5b; + T5t = T56 + T5b; + T5d = T36 - T3a; + T5i = T5f - T5h; + T5j = T5d + T5i; + T5u = T5i - T5d; + } + } + { + E T1i, T8c, T8z, T8A, T8J, T8O, T2l, T8N, T45, T8L, T8l, T8t, T8q, T8u, T8f; + E T8B; + { + E TI, T1h, T8x, T8y; + TI = Tq + TH; + T1h = TZ + T1g; + T1i = TI + T1h; + T8c = TI - T1h; + T8x = T8n + T8o; + T8y = T8i + T8j; + T8z = T8x - T8y; + T8A = T8y + T8x; + } + { + E T8C, T8I, T1J, T2k; + T8C = T7g + T7f; + T8I = T8D + T8H; + T8J = T8C + T8I; + T8O = T8I - T8C; + T1J = T1v + T1I; + T2k = T22 + T2j; + T2l = T1J + T2k; + T8N = T1J - T2k; + } + { + E T3d, T44, T8h, T8k; + T3d = T2N + T3c; + T44 = T3G + T43; + T45 = T3d + T44; + T8L = T44 - T3d; + T8h = T2N - T3c; + T8k = T8i - T8j; + T8l = T8h + T8k; + T8t = T8h - T8k; + } + { + E T8m, T8p, T8d, T8e; + T8m = T3G - T43; + T8p = T8n - T8o; + T8q = T8m - T8p; + T8u = T8m + T8p; + T8d = T7p + T7q; + T8e = T7k + T7l; + T8f = T8d - T8e; + T8B = T8e + T8d; + } + { + E T2m, T8K, T8M, T8w; + T2m = T1i + T2l; + ci[WS(rs, 15)] = T2m - T45; + cr[0] = T2m + T45; + T8K = T8B + T8J; + cr[WS(rs, 16)] = T8A - T8K; + ci[WS(rs, 31)] = T8A + T8K; + T8M = T8J - T8B; + cr[WS(rs, 24)] = T8L - T8M; + ci[WS(rs, 23)] = T8L + T8M; + T8w = T1i - T2l; + cr[WS(rs, 8)] = T8w - T8z; + ci[WS(rs, 7)] = T8w + T8z; + } + { + E T8g, T8r, T8P, T8Q; + T8g = T8c - T8f; + T8r = T8l + T8q; + ci[WS(rs, 11)] = FNMS(KP707106781, T8r, T8g); + cr[WS(rs, 4)] = FMA(KP707106781, T8r, T8g); + T8P = T8N + T8O; + T8Q = T8q - T8l; + cr[WS(rs, 28)] = FMS(KP707106781, T8Q, T8P); + ci[WS(rs, 19)] = FMA(KP707106781, T8Q, T8P); + } + { + E T8R, T8S, T8s, T8v; + T8R = T8O - T8N; + T8S = T8u - T8t; + cr[WS(rs, 20)] = FMS(KP707106781, T8S, T8R); + ci[WS(rs, 27)] = FMA(KP707106781, T8S, T8R); + T8s = T8c + T8f; + T8v = T8t + T8u; + cr[WS(rs, 12)] = FNMS(KP707106781, T8v, T8s); + ci[WS(rs, 3)] = FMA(KP707106781, T8v, T8s); + } + } + { + E T4s, T6c, T4X, T9c, T9b, T9h, T6f, T9i, T66, T6q, T6a, T6m, T5x, T6p, T69; + E T6j; + { + E T4c, T4r, T6d, T6e; + T4c = T46 - T4b; + T4r = T4j + T4q; + T4s = FNMS(KP707106781, T4r, T4c); + T6c = FMA(KP707106781, T4r, T4c); + { + E T4H, T4W, T99, T9a; + T4H = FMA(KP414213562, T4G, T4z); + T4W = FNMS(KP414213562, T4V, T4O); + T4X = T4H - T4W; + T9c = T4H + T4W; + T99 = T97 + T98; + T9a = T6t - T6u; + T9b = FMA(KP707106781, T9a, T99); + T9h = FNMS(KP707106781, T9a, T99); + } + T6d = FNMS(KP414213562, T4z, T4G); + T6e = FMA(KP414213562, T4O, T4V); + T6f = T6d + T6e; + T9i = T6e - T6d; + { + E T5U, T6k, T65, T6l, T5T, T64; + T5T = T5L + T5S; + T5U = FNMS(KP707106781, T5T, T5E); + T6k = FMA(KP707106781, T5T, T5E); + T64 = T62 - T63; + T65 = FNMS(KP707106781, T64, T61); + T6l = FMA(KP707106781, T64, T61); + T66 = FMA(KP668178637, T65, T5U); + T6q = FMA(KP198912367, T6k, T6l); + T6a = FNMS(KP668178637, T5U, T65); + T6m = FNMS(KP198912367, T6l, T6k); + } + { + E T5l, T6h, T5w, T6i, T5k, T5v; + T5k = T5c + T5j; + T5l = FNMS(KP707106781, T5k, T55); + T6h = FMA(KP707106781, T5k, T55); + T5v = T5t + T5u; + T5w = FNMS(KP707106781, T5v, T5s); + T6i = FMA(KP707106781, T5v, T5s); + T5x = FMA(KP668178637, T5w, T5l); + T6p = FMA(KP198912367, T6h, T6i); + T69 = FNMS(KP668178637, T5l, T5w); + T6j = FNMS(KP198912367, T6i, T6h); + } + } + { + E T4Y, T67, T9j, T9k; + T4Y = FMA(KP923879532, T4X, T4s); + T67 = T5x + T66; + ci[WS(rs, 12)] = FNMS(KP831469612, T67, T4Y); + cr[WS(rs, 3)] = FMA(KP831469612, T67, T4Y); + T9j = FMA(KP923879532, T9i, T9h); + T9k = T69 - T6a; + cr[WS(rs, 19)] = FMS(KP831469612, T9k, T9j); + ci[WS(rs, 28)] = FMA(KP831469612, T9k, T9j); + } + { + E T9l, T9m, T68, T6b; + T9l = FNMS(KP923879532, T9i, T9h); + T9m = T66 - T5x; + cr[WS(rs, 27)] = FMS(KP831469612, T9m, T9l); + ci[WS(rs, 20)] = FMA(KP831469612, T9m, T9l); + T68 = FNMS(KP923879532, T4X, T4s); + T6b = T69 + T6a; + cr[WS(rs, 11)] = FMA(KP831469612, T6b, T68); + ci[WS(rs, 4)] = FNMS(KP831469612, T6b, T68); + } + { + E T6g, T6n, T9d, T9e; + T6g = FMA(KP923879532, T6f, T6c); + T6n = T6j + T6m; + cr[WS(rs, 15)] = FNMS(KP980785280, T6n, T6g); + ci[0] = FMA(KP980785280, T6n, T6g); + T9d = FMA(KP923879532, T9c, T9b); + T9e = T6q - T6p; + cr[WS(rs, 31)] = FMS(KP980785280, T9e, T9d); + ci[WS(rs, 16)] = FMA(KP980785280, T9e, T9d); + } + { + E T9f, T9g, T6o, T6r; + T9f = FNMS(KP923879532, T9c, T9b); + T9g = T6m - T6j; + cr[WS(rs, 23)] = FMS(KP980785280, T9g, T9f); + ci[WS(rs, 24)] = FMA(KP980785280, T9g, T9f); + T6o = FNMS(KP923879532, T6f, T6c); + T6r = T6p + T6q; + ci[WS(rs, 8)] = FNMS(KP980785280, T6r, T6o); + cr[WS(rs, 7)] = FMA(KP980785280, T6r, T6o); + } + } + { + E T7i, T7W, T86, T8a, T8V, T91, T7t, T8W, T7F, T7U, T7Z, T92, T83, T89, T7Q; + E T7T; + { + E T7e, T7h, T84, T85; + T7e = Tq - TH; + T7h = T7f - T7g; + T7i = T7e - T7h; + T7W = T7e + T7h; + T84 = T7G + T7J; + T85 = T7O - T7N; + T86 = FNMS(KP414213562, T85, T84); + T8a = FMA(KP414213562, T84, T85); + } + { + E T8T, T8U, T7n, T7s; + T8T = TZ - T1g; + T8U = T8H - T8D; + T8V = T8T + T8U; + T91 = T8U - T8T; + T7n = T7j + T7m; + T7s = T7o - T7r; + T7t = T7n + T7s; + T8W = T7n - T7s; + } + { + E T7z, T7E, T7X, T7Y; + T7z = T7v - T7y; + T7E = T7C - T7D; + T7F = FMA(KP414213562, T7E, T7z); + T7U = FNMS(KP414213562, T7z, T7E); + T7X = T7j - T7m; + T7Y = T7o + T7r; + T7Z = T7X + T7Y; + T92 = T7Y - T7X; + } + { + E T81, T82, T7K, T7P; + T81 = T7v + T7y; + T82 = T7C + T7D; + T83 = FNMS(KP414213562, T82, T81); + T89 = FMA(KP414213562, T81, T82); + T7K = T7G - T7J; + T7P = T7N + T7O; + T7Q = FNMS(KP414213562, T7P, T7K); + T7T = FMA(KP414213562, T7K, T7P); + } + { + E T7u, T7R, T93, T94; + T7u = FMA(KP707106781, T7t, T7i); + T7R = T7F + T7Q; + ci[WS(rs, 13)] = FNMS(KP923879532, T7R, T7u); + cr[WS(rs, 2)] = FMA(KP923879532, T7R, T7u); + T93 = FMA(KP707106781, T92, T91); + T94 = T7U + T7T; + cr[WS(rs, 18)] = FMS(KP923879532, T94, T93); + ci[WS(rs, 29)] = FMA(KP923879532, T94, T93); + } + { + E T95, T96, T7S, T7V; + T95 = FNMS(KP707106781, T92, T91); + T96 = T7Q - T7F; + cr[WS(rs, 26)] = FMS(KP923879532, T96, T95); + ci[WS(rs, 21)] = FMA(KP923879532, T96, T95); + T7S = FNMS(KP707106781, T7t, T7i); + T7V = T7T - T7U; + cr[WS(rs, 10)] = FNMS(KP923879532, T7V, T7S); + ci[WS(rs, 5)] = FMA(KP923879532, T7V, T7S); + } + { + E T80, T87, T8X, T8Y; + T80 = FMA(KP707106781, T7Z, T7W); + T87 = T83 + T86; + cr[WS(rs, 14)] = FNMS(KP923879532, T87, T80); + ci[WS(rs, 1)] = FMA(KP923879532, T87, T80); + T8X = FMA(KP707106781, T8W, T8V); + T8Y = T8a - T89; + cr[WS(rs, 30)] = FMS(KP923879532, T8Y, T8X); + ci[WS(rs, 17)] = FMA(KP923879532, T8Y, T8X); + } + { + E T8Z, T90, T88, T8b; + T8Z = FNMS(KP707106781, T8W, T8V); + T90 = T86 - T83; + cr[WS(rs, 22)] = FMS(KP923879532, T90, T8Z); + ci[WS(rs, 25)] = FMA(KP923879532, T90, T8Z); + T88 = FNMS(KP707106781, T7Z, T7W); + T8b = T89 + T8a; + ci[WS(rs, 9)] = FNMS(KP923879532, T8b, T88); + cr[WS(rs, 6)] = FMA(KP923879532, T8b, T88); + } + } + { + E T6w, T6Y, T6D, T9w, T9p, T9v, T71, T9q, T6S, T7c, T6V, T78, T6L, T7b, T6W; + E T75; + { + E T6s, T6v, T6Z, T70; + T6s = T46 + T4b; + T6v = T6t + T6u; + T6w = FMA(KP707106781, T6v, T6s); + T6Y = FNMS(KP707106781, T6v, T6s); + { + E T6z, T6C, T9n, T9o; + T6z = FMA(KP414213562, T6y, T6x); + T6C = FNMS(KP414213562, T6B, T6A); + T6D = T6z + T6C; + T9w = T6z - T6C; + T9n = T98 - T97; + T9o = T4q - T4j; + T9p = FMA(KP707106781, T9o, T9n); + T9v = FNMS(KP707106781, T9o, T9n); + } + T6Z = FMA(KP414213562, T6A, T6B); + T70 = FNMS(KP414213562, T6x, T6y); + T71 = T6Z - T70; + T9q = T70 + T6Z; + { + E T6O, T76, T6R, T77, T6N, T6Q; + T6N = T63 + T62; + T6O = FMA(KP707106781, T6N, T6M); + T76 = FNMS(KP707106781, T6N, T6M); + T6Q = T5S - T5L; + T6R = FMA(KP707106781, T6Q, T6P); + T77 = FNMS(KP707106781, T6Q, T6P); + T6S = FNMS(KP198912367, T6R, T6O); + T7c = FNMS(KP668178637, T76, T77); + T6V = FMA(KP198912367, T6O, T6R); + T78 = FMA(KP668178637, T77, T76); + } + { + E T6H, T73, T6K, T74, T6G, T6J; + T6G = T5t - T5u; + T6H = FMA(KP707106781, T6G, T6F); + T73 = FNMS(KP707106781, T6G, T6F); + T6J = T5j - T5c; + T6K = FMA(KP707106781, T6J, T6I); + T74 = FNMS(KP707106781, T6J, T6I); + T6L = FMA(KP198912367, T6K, T6H); + T7b = FMA(KP668178637, T73, T74); + T6W = FNMS(KP198912367, T6H, T6K); + T75 = FNMS(KP668178637, T74, T73); + } + } + { + E T6E, T6T, T9x, T9y; + T6E = FMA(KP923879532, T6D, T6w); + T6T = T6L + T6S; + ci[WS(rs, 14)] = FNMS(KP980785280, T6T, T6E); + cr[WS(rs, 1)] = FMA(KP980785280, T6T, T6E); + T9x = FMA(KP923879532, T9w, T9v); + T9y = T7b + T7c; + cr[WS(rs, 29)] = -(FMA(KP831469612, T9y, T9x)); + ci[WS(rs, 18)] = FNMS(KP831469612, T9y, T9x); + } + { + E T9z, T9A, T6U, T6X; + T9z = FNMS(KP923879532, T9w, T9v); + T9A = T78 - T75; + cr[WS(rs, 21)] = FMS(KP831469612, T9A, T9z); + ci[WS(rs, 26)] = FMA(KP831469612, T9A, T9z); + T6U = FNMS(KP923879532, T6D, T6w); + T6X = T6V - T6W; + cr[WS(rs, 9)] = FNMS(KP980785280, T6X, T6U); + ci[WS(rs, 6)] = FMA(KP980785280, T6X, T6U); + } + { + E T72, T79, T9r, T9s; + T72 = FMA(KP923879532, T71, T6Y); + T79 = T75 + T78; + cr[WS(rs, 13)] = FNMS(KP831469612, T79, T72); + ci[WS(rs, 2)] = FMA(KP831469612, T79, T72); + T9r = FMA(KP923879532, T9q, T9p); + T9s = T6W + T6V; + cr[WS(rs, 17)] = FMS(KP980785280, T9s, T9r); + ci[WS(rs, 30)] = FMA(KP980785280, T9s, T9r); + } + { + E T9t, T9u, T7a, T7d; + T9t = FNMS(KP923879532, T9q, T9p); + T9u = T6S - T6L; + cr[WS(rs, 25)] = FMS(KP980785280, T9u, T9t); + ci[WS(rs, 22)] = FMA(KP980785280, T9u, T9t); + T7a = FNMS(KP923879532, T71, T6Y); + T7d = T7b - T7c; + ci[WS(rs, 10)] = FNMS(KP831469612, T7d, T7a); + cr[WS(rs, 5)] = FMA(KP831469612, T7d, T7a); + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hf2_32", twinstr, &GENUS, {236, 98, 252, 0} }; + +void X(codelet_hf2_32) (planner *p) { + X(khc2hc_register) (p, hf2_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 32 -dit -name hf2_32 -include rdft/scalar/hf.h */ + +/* + * This function contains 488 FP additions, 280 FP multiplications, + * (or, 376 additions, 168 multiplications, 112 fused multiply/add), + * 158 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(64, rs)) { + E T2, T5, T3, T6, T8, TM, TO, Td, T9, Te, Th, Tl, TD, TH, T1y; + E T1H, T15, T1A, T11, T1F, T1n, T1p, T2q, T2I, T2u, T2K, T2V, T3b, T2Z, T3d; + E Tu, Ty, T3l, T3n, T1t, T1v, T2f, T2h, T1a, T1e, T32, T34, T1W, T1Y, T2C; + E T2E, Tg, TR, Tk, TS, Tm, TV, To, TT, T1M, T21, T1P, T22, T1Q, T25; + E T1S, T23; + { + E Ts, T1d, Tx, T18, Tt, T1c, Tw, T19, TB, T14, TG, TZ, TC, T13, TF; + E T10; + { + E T4, Tc, T7, Tb; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tc = T5 * T3; + T7 = T5 * T6; + Tb = T2 * T6; + T8 = T4 + T7; + TM = T4 - T7; + TO = Tb + Tc; + Td = Tb - Tc; + T9 = W[4]; + Ts = T2 * T9; + T1d = T6 * T9; + Tx = T5 * T9; + T18 = T3 * T9; + Te = W[5]; + Tt = T5 * Te; + T1c = T3 * Te; + Tw = T2 * Te; + T19 = T6 * Te; + Th = W[6]; + TB = T3 * Th; + T14 = T5 * Th; + TG = T6 * Th; + TZ = T2 * Th; + Tl = W[7]; + TC = T6 * Tl; + T13 = T2 * Tl; + TF = T3 * Tl; + T10 = T5 * Tl; + } + TD = TB + TC; + TH = TF - TG; + T1y = TZ + T10; + T1H = TF + TG; + T15 = T13 + T14; + T1A = T13 - T14; + T11 = TZ - T10; + T1F = TB - TC; + T1n = FMA(T9, Th, Te * Tl); + T1p = FNMS(Te, Th, T9 * Tl); + { + E T2o, T2p, T2s, T2t; + T2o = T8 * Th; + T2p = Td * Tl; + T2q = T2o + T2p; + T2I = T2o - T2p; + T2s = T8 * Tl; + T2t = Td * Th; + T2u = T2s - T2t; + T2K = T2s + T2t; + } + { + E T2T, T2U, T2X, T2Y; + T2T = TM * Th; + T2U = TO * Tl; + T2V = T2T - T2U; + T3b = T2T + T2U; + T2X = TM * Tl; + T2Y = TO * Th; + T2Z = T2X + T2Y; + T3d = T2X - T2Y; + Tu = Ts + Tt; + Ty = Tw - Tx; + T3l = FMA(Tu, Th, Ty * Tl); + T3n = FNMS(Ty, Th, Tu * Tl); + } + T1t = Ts - Tt; + T1v = Tw + Tx; + T2f = FMA(T1t, Th, T1v * Tl); + T2h = FNMS(T1v, Th, T1t * Tl); + T1a = T18 - T19; + T1e = T1c + T1d; + T32 = FMA(T1a, Th, T1e * Tl); + T34 = FNMS(T1e, Th, T1a * Tl); + T1W = T18 + T19; + T1Y = T1c - T1d; + T2C = FMA(T1W, Th, T1Y * Tl); + T2E = FNMS(T1Y, Th, T1W * Tl); + { + E Ta, Tf, Ti, Tj; + Ta = T8 * T9; + Tf = Td * Te; + Tg = Ta - Tf; + TR = Ta + Tf; + Ti = T8 * Te; + Tj = Td * T9; + Tk = Ti + Tj; + TS = Ti - Tj; + } + Tm = FMA(Tg, Th, Tk * Tl); + TV = FNMS(TS, Th, TR * Tl); + To = FNMS(Tk, Th, Tg * Tl); + TT = FMA(TR, Th, TS * Tl); + { + E T1K, T1L, T1N, T1O; + T1K = TM * T9; + T1L = TO * Te; + T1M = T1K - T1L; + T21 = T1K + T1L; + T1N = TM * Te; + T1O = TO * T9; + T1P = T1N + T1O; + T22 = T1N - T1O; + } + T1Q = FMA(T1M, Th, T1P * Tl); + T25 = FNMS(T22, Th, T21 * Tl); + T1S = FNMS(T1P, Th, T1M * Tl); + T23 = FMA(T21, Th, T22 * Tl); + } + { + E TL, T6f, T8c, T8q, T3F, T5t, T7I, T7W, T2y, T6B, T6y, T7j, T4k, T5G, T4B; + E T5J, T3h, T6H, T6O, T7o, T4L, T5Q, T52, T5N, T1i, T7V, T6i, T7D, T3K, T5u; + E T3P, T5v, T1E, T6k, T6n, T7f, T3W, T5z, T41, T5y, T29, T6p, T6s, T7e, T47; + E T5C, T4c, T5B, T2R, T6z, T6E, T7k, T4v, T5K, T4E, T5H, T3y, T6P, T6K, T7p; + E T4W, T5O, T55, T5R; + { + E T1, T7G, Tq, T7F, TA, T3C, TJ, T3D, Tn, Tp; + T1 = cr[0]; + T7G = ci[0]; + Tn = cr[WS(rs, 16)]; + Tp = ci[WS(rs, 16)]; + Tq = FMA(Tm, Tn, To * Tp); + T7F = FNMS(To, Tn, Tm * Tp); + { + E Tv, Tz, TE, TI; + Tv = cr[WS(rs, 8)]; + Tz = ci[WS(rs, 8)]; + TA = FMA(Tu, Tv, Ty * Tz); + T3C = FNMS(Ty, Tv, Tu * Tz); + TE = cr[WS(rs, 24)]; + TI = ci[WS(rs, 24)]; + TJ = FMA(TD, TE, TH * TI); + T3D = FNMS(TH, TE, TD * TI); + } + { + E Tr, TK, T8a, T8b; + Tr = T1 + Tq; + TK = TA + TJ; + TL = Tr + TK; + T6f = Tr - TK; + T8a = TA - TJ; + T8b = T7G - T7F; + T8c = T8a + T8b; + T8q = T8b - T8a; + } + { + E T3B, T3E, T7E, T7H; + T3B = T1 - Tq; + T3E = T3C - T3D; + T3F = T3B + T3E; + T5t = T3B - T3E; + T7E = T3C + T3D; + T7H = T7F + T7G; + T7I = T7E + T7H; + T7W = T7H - T7E; + } + } + { + E T2e, T4x, T2w, T4i, T2j, T4y, T2n, T4h; + { + E T2c, T2d, T2r, T2v; + T2c = cr[WS(rs, 1)]; + T2d = ci[WS(rs, 1)]; + T2e = FMA(T2, T2c, T5 * T2d); + T4x = FNMS(T5, T2c, T2 * T2d); + T2r = cr[WS(rs, 25)]; + T2v = ci[WS(rs, 25)]; + T2w = FMA(T2q, T2r, T2u * T2v); + T4i = FNMS(T2u, T2r, T2q * T2v); + } + { + E T2g, T2i, T2l, T2m; + T2g = cr[WS(rs, 17)]; + T2i = ci[WS(rs, 17)]; + T2j = FMA(T2f, T2g, T2h * T2i); + T4y = FNMS(T2h, T2g, T2f * T2i); + T2l = cr[WS(rs, 9)]; + T2m = ci[WS(rs, 9)]; + T2n = FMA(T9, T2l, Te * T2m); + T4h = FNMS(Te, T2l, T9 * T2m); + } + { + E T2k, T2x, T6w, T6x; + T2k = T2e + T2j; + T2x = T2n + T2w; + T2y = T2k + T2x; + T6B = T2k - T2x; + T6w = T4x + T4y; + T6x = T4h + T4i; + T6y = T6w - T6x; + T7j = T6w + T6x; + } + { + E T4g, T4j, T4z, T4A; + T4g = T2e - T2j; + T4j = T4h - T4i; + T4k = T4g + T4j; + T5G = T4g - T4j; + T4z = T4x - T4y; + T4A = T2n - T2w; + T4B = T4z - T4A; + T5J = T4z + T4A; + } + } + { + E T31, T4H, T3f, T50, T36, T4I, T3a, T4Z; + { + E T2W, T30, T3c, T3e; + T2W = cr[WS(rs, 31)]; + T30 = ci[WS(rs, 31)]; + T31 = FMA(T2V, T2W, T2Z * T30); + T4H = FNMS(T2Z, T2W, T2V * T30); + T3c = cr[WS(rs, 23)]; + T3e = ci[WS(rs, 23)]; + T3f = FMA(T3b, T3c, T3d * T3e); + T50 = FNMS(T3d, T3c, T3b * T3e); + } + { + E T33, T35, T38, T39; + T33 = cr[WS(rs, 15)]; + T35 = ci[WS(rs, 15)]; + T36 = FMA(T32, T33, T34 * T35); + T4I = FNMS(T34, T33, T32 * T35); + T38 = cr[WS(rs, 7)]; + T39 = ci[WS(rs, 7)]; + T3a = FMA(TR, T38, TS * T39); + T4Z = FNMS(TS, T38, TR * T39); + } + { + E T37, T3g, T6M, T6N; + T37 = T31 + T36; + T3g = T3a + T3f; + T3h = T37 + T3g; + T6H = T37 - T3g; + T6M = T4H + T4I; + T6N = T4Z + T50; + T6O = T6M - T6N; + T7o = T6M + T6N; + } + { + E T4J, T4K, T4Y, T51; + T4J = T4H - T4I; + T4K = T3a - T3f; + T4L = T4J - T4K; + T5Q = T4J + T4K; + T4Y = T31 - T36; + T51 = T4Z - T50; + T52 = T4Y + T51; + T5N = T4Y - T51; + } + } + { + E TQ, T3H, T1g, T3N, TX, T3I, T17, T3M; + { + E TN, TP, T1b, T1f; + TN = cr[WS(rs, 4)]; + TP = ci[WS(rs, 4)]; + TQ = FMA(TM, TN, TO * TP); + T3H = FNMS(TO, TN, TM * TP); + T1b = cr[WS(rs, 12)]; + T1f = ci[WS(rs, 12)]; + T1g = FMA(T1a, T1b, T1e * T1f); + T3N = FNMS(T1e, T1b, T1a * T1f); + } + { + E TU, TW, T12, T16; + TU = cr[WS(rs, 20)]; + TW = ci[WS(rs, 20)]; + TX = FMA(TT, TU, TV * TW); + T3I = FNMS(TV, TU, TT * TW); + T12 = cr[WS(rs, 28)]; + T16 = ci[WS(rs, 28)]; + T17 = FMA(T11, T12, T15 * T16); + T3M = FNMS(T15, T12, T11 * T16); + } + { + E TY, T1h, T6g, T6h; + TY = TQ + TX; + T1h = T17 + T1g; + T1i = TY + T1h; + T7V = TY - T1h; + T6g = T3M + T3N; + T6h = T3H + T3I; + T6i = T6g - T6h; + T7D = T6h + T6g; + } + { + E T3G, T3J, T3L, T3O; + T3G = TQ - TX; + T3J = T3H - T3I; + T3K = T3G + T3J; + T5u = T3G - T3J; + T3L = T17 - T1g; + T3O = T3M - T3N; + T3P = T3L - T3O; + T5v = T3L + T3O; + } + } + { + E T1m, T3X, T1C, T3U, T1r, T3Y, T1x, T3T; + { + E T1k, T1l, T1z, T1B; + T1k = cr[WS(rs, 2)]; + T1l = ci[WS(rs, 2)]; + T1m = FMA(T8, T1k, Td * T1l); + T3X = FNMS(Td, T1k, T8 * T1l); + T1z = cr[WS(rs, 26)]; + T1B = ci[WS(rs, 26)]; + T1C = FMA(T1y, T1z, T1A * T1B); + T3U = FNMS(T1A, T1z, T1y * T1B); + } + { + E T1o, T1q, T1u, T1w; + T1o = cr[WS(rs, 18)]; + T1q = ci[WS(rs, 18)]; + T1r = FMA(T1n, T1o, T1p * T1q); + T3Y = FNMS(T1p, T1o, T1n * T1q); + T1u = cr[WS(rs, 10)]; + T1w = ci[WS(rs, 10)]; + T1x = FMA(T1t, T1u, T1v * T1w); + T3T = FNMS(T1v, T1u, T1t * T1w); + } + { + E T1s, T1D, T6l, T6m; + T1s = T1m + T1r; + T1D = T1x + T1C; + T1E = T1s + T1D; + T6k = T1s - T1D; + T6l = T3X + T3Y; + T6m = T3T + T3U; + T6n = T6l - T6m; + T7f = T6l + T6m; + } + { + E T3S, T3V, T3Z, T40; + T3S = T1m - T1r; + T3V = T3T - T3U; + T3W = T3S + T3V; + T5z = T3S - T3V; + T3Z = T3X - T3Y; + T40 = T1x - T1C; + T41 = T3Z - T40; + T5y = T3Z + T40; + } + } + { + E T1J, T43, T27, T4a, T1U, T44, T20, T49; + { + E T1G, T1I, T24, T26; + T1G = cr[WS(rs, 30)]; + T1I = ci[WS(rs, 30)]; + T1J = FMA(T1F, T1G, T1H * T1I); + T43 = FNMS(T1H, T1G, T1F * T1I); + T24 = cr[WS(rs, 22)]; + T26 = ci[WS(rs, 22)]; + T27 = FMA(T23, T24, T25 * T26); + T4a = FNMS(T25, T24, T23 * T26); + } + { + E T1R, T1T, T1X, T1Z; + T1R = cr[WS(rs, 14)]; + T1T = ci[WS(rs, 14)]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T44 = FNMS(T1S, T1R, T1Q * T1T); + T1X = cr[WS(rs, 6)]; + T1Z = ci[WS(rs, 6)]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T49 = FNMS(T1Y, T1X, T1W * T1Z); + } + { + E T1V, T28, T6q, T6r; + T1V = T1J + T1U; + T28 = T20 + T27; + T29 = T1V + T28; + T6p = T1V - T28; + T6q = T43 + T44; + T6r = T49 + T4a; + T6s = T6q - T6r; + T7e = T6q + T6r; + } + { + E T45, T46, T48, T4b; + T45 = T43 - T44; + T46 = T20 - T27; + T47 = T45 - T46; + T5C = T45 + T46; + T48 = T1J - T1U; + T4b = T49 - T4a; + T4c = T48 + T4b; + T5B = T48 - T4b; + } + } + { + E T2B, T4m, T2G, T4n, T4l, T4o, T2M, T4q, T2P, T4r, T4s, T4t; + { + E T2z, T2A, T2D, T2F; + T2z = cr[WS(rs, 5)]; + T2A = ci[WS(rs, 5)]; + T2B = FMA(T21, T2z, T22 * T2A); + T4m = FNMS(T22, T2z, T21 * T2A); + T2D = cr[WS(rs, 21)]; + T2F = ci[WS(rs, 21)]; + T2G = FMA(T2C, T2D, T2E * T2F); + T4n = FNMS(T2E, T2D, T2C * T2F); + } + T4l = T2B - T2G; + T4o = T4m - T4n; + { + E T2J, T2L, T2N, T2O; + T2J = cr[WS(rs, 29)]; + T2L = ci[WS(rs, 29)]; + T2M = FMA(T2I, T2J, T2K * T2L); + T4q = FNMS(T2K, T2J, T2I * T2L); + T2N = cr[WS(rs, 13)]; + T2O = ci[WS(rs, 13)]; + T2P = FMA(T1M, T2N, T1P * T2O); + T4r = FNMS(T1P, T2N, T1M * T2O); + } + T4s = T4q - T4r; + T4t = T2M - T2P; + { + E T2H, T2Q, T6C, T6D; + T2H = T2B + T2G; + T2Q = T2M + T2P; + T2R = T2H + T2Q; + T6z = T2H - T2Q; + T6C = T4q + T4r; + T6D = T4m + T4n; + T6E = T6C - T6D; + T7k = T6D + T6C; + } + { + E T4p, T4u, T4C, T4D; + T4p = T4l + T4o; + T4u = T4s - T4t; + T4v = KP707106781 * (T4p - T4u); + T5K = KP707106781 * (T4p + T4u); + T4C = T4t + T4s; + T4D = T4l - T4o; + T4E = KP707106781 * (T4C - T4D); + T5H = KP707106781 * (T4D + T4C); + } + } + { + E T3k, T4S, T3p, T4T, T4R, T4U, T3t, T4N, T3w, T4O, T4M, T4P; + { + E T3i, T3j, T3m, T3o; + T3i = cr[WS(rs, 3)]; + T3j = ci[WS(rs, 3)]; + T3k = FMA(T3, T3i, T6 * T3j); + T4S = FNMS(T6, T3i, T3 * T3j); + T3m = cr[WS(rs, 19)]; + T3o = ci[WS(rs, 19)]; + T3p = FMA(T3l, T3m, T3n * T3o); + T4T = FNMS(T3n, T3m, T3l * T3o); + } + T4R = T3k - T3p; + T4U = T4S - T4T; + { + E T3r, T3s, T3u, T3v; + T3r = cr[WS(rs, 27)]; + T3s = ci[WS(rs, 27)]; + T3t = FMA(Th, T3r, Tl * T3s); + T4N = FNMS(Tl, T3r, Th * T3s); + T3u = cr[WS(rs, 11)]; + T3v = ci[WS(rs, 11)]; + T3w = FMA(Tg, T3u, Tk * T3v); + T4O = FNMS(Tk, T3u, Tg * T3v); + } + T4M = T3t - T3w; + T4P = T4N - T4O; + { + E T3q, T3x, T6I, T6J; + T3q = T3k + T3p; + T3x = T3t + T3w; + T3y = T3q + T3x; + T6P = T3q - T3x; + T6I = T4N + T4O; + T6J = T4S + T4T; + T6K = T6I - T6J; + T7p = T6J + T6I; + } + { + E T4Q, T4V, T53, T54; + T4Q = T4M + T4P; + T4V = T4R - T4U; + T4W = KP707106781 * (T4Q - T4V); + T5O = KP707106781 * (T4V + T4Q); + T53 = T4R + T4U; + T54 = T4P - T4M; + T55 = KP707106781 * (T53 - T54); + T5R = KP707106781 * (T53 + T54); + } + } + { + E T2b, T7x, T7K, T7M, T3A, T7L, T7A, T7B; + { + E T1j, T2a, T7C, T7J; + T1j = TL + T1i; + T2a = T1E + T29; + T2b = T1j + T2a; + T7x = T1j - T2a; + T7C = T7f + T7e; + T7J = T7D + T7I; + T7K = T7C + T7J; + T7M = T7J - T7C; + } + { + E T2S, T3z, T7y, T7z; + T2S = T2y + T2R; + T3z = T3h + T3y; + T3A = T2S + T3z; + T7L = T3z - T2S; + T7y = T7o + T7p; + T7z = T7j + T7k; + T7A = T7y - T7z; + T7B = T7z + T7y; + } + ci[WS(rs, 15)] = T2b - T3A; + cr[WS(rs, 24)] = T7L - T7M; + ci[WS(rs, 23)] = T7L + T7M; + cr[0] = T2b + T3A; + cr[WS(rs, 8)] = T7x - T7A; + cr[WS(rs, 16)] = T7B - T7K; + ci[WS(rs, 31)] = T7B + T7K; + ci[WS(rs, 7)] = T7x + T7A; + } + { + E T5x, T5Z, T8d, T8j, T5E, T88, T69, T6d, T5M, T5W, T62, T8i, T66, T6c, T5T; + E T5X, T5w, T89; + T5w = KP707106781 * (T5u + T5v); + T5x = T5t - T5w; + T5Z = T5t + T5w; + T89 = KP707106781 * (T3K - T3P); + T8d = T89 + T8c; + T8j = T8c - T89; + { + E T5A, T5D, T67, T68; + T5A = FMA(KP923879532, T5y, KP382683432 * T5z); + T5D = FNMS(KP923879532, T5C, KP382683432 * T5B); + T5E = T5A + T5D; + T88 = T5A - T5D; + T67 = T5N + T5O; + T68 = T5Q + T5R; + T69 = FNMS(KP980785280, T68, KP195090322 * T67); + T6d = FMA(KP980785280, T67, KP195090322 * T68); + } + { + E T5I, T5L, T60, T61; + T5I = T5G - T5H; + T5L = T5J - T5K; + T5M = FMA(KP831469612, T5I, KP555570233 * T5L); + T5W = FNMS(KP831469612, T5L, KP555570233 * T5I); + T60 = FNMS(KP382683432, T5y, KP923879532 * T5z); + T61 = FMA(KP382683432, T5C, KP923879532 * T5B); + T62 = T60 + T61; + T8i = T61 - T60; + } + { + E T64, T65, T5P, T5S; + T64 = T5G + T5H; + T65 = T5J + T5K; + T66 = FMA(KP195090322, T64, KP980785280 * T65); + T6c = FNMS(KP195090322, T65, KP980785280 * T64); + T5P = T5N - T5O; + T5S = T5Q - T5R; + T5T = FNMS(KP555570233, T5S, KP831469612 * T5P); + T5X = FMA(KP555570233, T5P, KP831469612 * T5S); + } + { + E T5F, T5U, T8h, T8k; + T5F = T5x + T5E; + T5U = T5M + T5T; + ci[WS(rs, 12)] = T5F - T5U; + cr[WS(rs, 3)] = T5F + T5U; + T8h = T5X - T5W; + T8k = T8i + T8j; + cr[WS(rs, 19)] = T8h - T8k; + ci[WS(rs, 28)] = T8h + T8k; + } + { + E T8l, T8m, T5V, T5Y; + T8l = T5T - T5M; + T8m = T8j - T8i; + cr[WS(rs, 27)] = T8l - T8m; + ci[WS(rs, 20)] = T8l + T8m; + T5V = T5x - T5E; + T5Y = T5W + T5X; + cr[WS(rs, 11)] = T5V - T5Y; + ci[WS(rs, 4)] = T5V + T5Y; + } + { + E T63, T6a, T87, T8e; + T63 = T5Z - T62; + T6a = T66 + T69; + ci[WS(rs, 8)] = T63 - T6a; + cr[WS(rs, 7)] = T63 + T6a; + T87 = T69 - T66; + T8e = T88 + T8d; + cr[WS(rs, 31)] = T87 - T8e; + ci[WS(rs, 16)] = T87 + T8e; + } + { + E T8f, T8g, T6b, T6e; + T8f = T6d - T6c; + T8g = T8d - T88; + cr[WS(rs, 23)] = T8f - T8g; + ci[WS(rs, 24)] = T8f + T8g; + T6b = T5Z + T62; + T6e = T6c + T6d; + cr[WS(rs, 15)] = T6b - T6e; + ci[0] = T6b + T6e; + } + } + { + E T7h, T7t, T7Q, T7S, T7m, T7u, T7r, T7v; + { + E T7d, T7g, T7O, T7P; + T7d = TL - T1i; + T7g = T7e - T7f; + T7h = T7d - T7g; + T7t = T7d + T7g; + T7O = T1E - T29; + T7P = T7I - T7D; + T7Q = T7O + T7P; + T7S = T7P - T7O; + } + { + E T7i, T7l, T7n, T7q; + T7i = T2y - T2R; + T7l = T7j - T7k; + T7m = T7i + T7l; + T7u = T7i - T7l; + T7n = T3h - T3y; + T7q = T7o - T7p; + T7r = T7n - T7q; + T7v = T7n + T7q; + } + { + E T7s, T7R, T7w, T7N; + T7s = KP707106781 * (T7m + T7r); + ci[WS(rs, 11)] = T7h - T7s; + cr[WS(rs, 4)] = T7h + T7s; + T7R = KP707106781 * (T7v - T7u); + cr[WS(rs, 20)] = T7R - T7S; + ci[WS(rs, 27)] = T7R + T7S; + T7w = KP707106781 * (T7u + T7v); + cr[WS(rs, 12)] = T7t - T7w; + ci[WS(rs, 3)] = T7t + T7w; + T7N = KP707106781 * (T7r - T7m); + cr[WS(rs, 28)] = T7N - T7Q; + ci[WS(rs, 19)] = T7N + T7Q; + } + } + { + E T6j, T7X, T83, T6X, T6u, T7U, T77, T7b, T70, T82, T6G, T6U, T74, T7a, T6R; + E T6V; + { + E T6o, T6t, T6A, T6F; + T6j = T6f - T6i; + T7X = T7V + T7W; + T83 = T7W - T7V; + T6X = T6f + T6i; + T6o = T6k + T6n; + T6t = T6p - T6s; + T6u = KP707106781 * (T6o + T6t); + T7U = KP707106781 * (T6o - T6t); + { + E T75, T76, T6Y, T6Z; + T75 = T6O + T6P; + T76 = T6H + T6K; + T77 = FMA(KP382683432, T75, KP923879532 * T76); + T7b = FNMS(KP923879532, T75, KP382683432 * T76); + T6Y = T6k - T6n; + T6Z = T6p + T6s; + T70 = KP707106781 * (T6Y + T6Z); + T82 = KP707106781 * (T6Z - T6Y); + } + T6A = T6y - T6z; + T6F = T6B - T6E; + T6G = FMA(KP382683432, T6A, KP923879532 * T6F); + T6U = FNMS(KP923879532, T6A, KP382683432 * T6F); + { + E T72, T73, T6L, T6Q; + T72 = T6B + T6E; + T73 = T6y + T6z; + T74 = FNMS(KP382683432, T73, KP923879532 * T72); + T7a = FMA(KP923879532, T73, KP382683432 * T72); + T6L = T6H - T6K; + T6Q = T6O - T6P; + T6R = FNMS(KP382683432, T6Q, KP923879532 * T6L); + T6V = FMA(KP923879532, T6Q, KP382683432 * T6L); + } + } + { + E T6v, T6S, T81, T84; + T6v = T6j + T6u; + T6S = T6G + T6R; + ci[WS(rs, 13)] = T6v - T6S; + cr[WS(rs, 2)] = T6v + T6S; + T81 = T6V - T6U; + T84 = T82 + T83; + cr[WS(rs, 18)] = T81 - T84; + ci[WS(rs, 29)] = T81 + T84; + } + { + E T85, T86, T6T, T6W; + T85 = T6R - T6G; + T86 = T83 - T82; + cr[WS(rs, 26)] = T85 - T86; + ci[WS(rs, 21)] = T85 + T86; + T6T = T6j - T6u; + T6W = T6U + T6V; + cr[WS(rs, 10)] = T6T - T6W; + ci[WS(rs, 5)] = T6T + T6W; + } + { + E T71, T78, T7T, T7Y; + T71 = T6X + T70; + T78 = T74 + T77; + cr[WS(rs, 14)] = T71 - T78; + ci[WS(rs, 1)] = T71 + T78; + T7T = T7b - T7a; + T7Y = T7U + T7X; + cr[WS(rs, 30)] = T7T - T7Y; + ci[WS(rs, 17)] = T7T + T7Y; + } + { + E T7Z, T80, T79, T7c; + T7Z = T77 - T74; + T80 = T7X - T7U; + cr[WS(rs, 22)] = T7Z - T80; + ci[WS(rs, 25)] = T7Z + T80; + T79 = T6X - T70; + T7c = T7a + T7b; + ci[WS(rs, 9)] = T79 - T7c; + cr[WS(rs, 6)] = T79 + T7c; + } + } + { + E T3R, T5d, T8r, T8x, T4e, T8o, T5n, T5r, T4G, T5a, T5g, T8w, T5k, T5q, T57; + E T5b, T3Q, T8p; + T3Q = KP707106781 * (T3K + T3P); + T3R = T3F - T3Q; + T5d = T3F + T3Q; + T8p = KP707106781 * (T5v - T5u); + T8r = T8p + T8q; + T8x = T8q - T8p; + { + E T42, T4d, T5l, T5m; + T42 = FNMS(KP923879532, T41, KP382683432 * T3W); + T4d = FMA(KP923879532, T47, KP382683432 * T4c); + T4e = T42 + T4d; + T8o = T4d - T42; + T5l = T52 + T55; + T5m = T4L + T4W; + T5n = FNMS(KP195090322, T5m, KP980785280 * T5l); + T5r = FMA(KP980785280, T5m, KP195090322 * T5l); + } + { + E T4w, T4F, T5e, T5f; + T4w = T4k - T4v; + T4F = T4B - T4E; + T4G = FNMS(KP555570233, T4F, KP831469612 * T4w); + T5a = FMA(KP831469612, T4F, KP555570233 * T4w); + T5e = FMA(KP382683432, T41, KP923879532 * T3W); + T5f = FNMS(KP382683432, T47, KP923879532 * T4c); + T5g = T5e + T5f; + T8w = T5e - T5f; + } + { + E T5i, T5j, T4X, T56; + T5i = T4B + T4E; + T5j = T4k + T4v; + T5k = FMA(KP195090322, T5i, KP980785280 * T5j); + T5q = FNMS(KP980785280, T5i, KP195090322 * T5j); + T4X = T4L - T4W; + T56 = T52 - T55; + T57 = FMA(KP555570233, T4X, KP831469612 * T56); + T5b = FNMS(KP831469612, T4X, KP555570233 * T56); + } + { + E T4f, T58, T8v, T8y; + T4f = T3R + T4e; + T58 = T4G + T57; + cr[WS(rs, 13)] = T4f - T58; + ci[WS(rs, 2)] = T4f + T58; + T8v = T5b - T5a; + T8y = T8w + T8x; + cr[WS(rs, 29)] = T8v - T8y; + ci[WS(rs, 18)] = T8v + T8y; + } + { + E T8z, T8A, T59, T5c; + T8z = T57 - T4G; + T8A = T8x - T8w; + cr[WS(rs, 21)] = T8z - T8A; + ci[WS(rs, 26)] = T8z + T8A; + T59 = T3R - T4e; + T5c = T5a + T5b; + ci[WS(rs, 10)] = T59 - T5c; + cr[WS(rs, 5)] = T59 + T5c; + } + { + E T5h, T5o, T8n, T8s; + T5h = T5d + T5g; + T5o = T5k + T5n; + ci[WS(rs, 14)] = T5h - T5o; + cr[WS(rs, 1)] = T5h + T5o; + T8n = T5r - T5q; + T8s = T8o + T8r; + cr[WS(rs, 17)] = T8n - T8s; + ci[WS(rs, 30)] = T8n + T8s; + } + { + E T8t, T8u, T5p, T5s; + T8t = T5n - T5k; + T8u = T8r - T8o; + cr[WS(rs, 25)] = T8t - T8u; + ci[WS(rs, 22)] = T8t + T8u; + T5p = T5d - T5g; + T5s = T5q + T5r; + cr[WS(rs, 9)] = T5p - T5s; + ci[WS(rs, 6)] = T5p + T5s; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 9}, + {TW_CEXP, 1, 27}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hf2_32", twinstr, &GENUS, {376, 168, 112, 0} }; + +void X(codelet_hf2_32) (planner *p) { + X(khc2hc_register) (p, hf2_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_4.c new file mode 100644 index 000000000..1ca75933e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_4.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:35 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -dit -name hf2_4 -include rdft/scalar/hf.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(8, rs)) { + E T2, T6, T3, T5, T7, Tb, T4, Ta; + T2 = W[0]; + T6 = W[3]; + T3 = W[2]; + T4 = T2 * T3; + Ta = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Tb = FNMS(T5, T3, Ta); + { + E T1, Tx, Td, Tw, Ti, Tq, Tm, Ts; + T1 = cr[0]; + Tx = ci[0]; + { + E T8, T9, Tc, Tv; + T8 = cr[WS(rs, 2)]; + T9 = T7 * T8; + Tc = ci[WS(rs, 2)]; + Tv = T7 * Tc; + Td = FMA(Tb, Tc, T9); + Tw = FNMS(Tb, T8, Tv); + } + { + E Tf, Tg, Th, Tp; + Tf = cr[WS(rs, 1)]; + Tg = T2 * Tf; + Th = ci[WS(rs, 1)]; + Tp = T2 * Th; + Ti = FMA(T5, Th, Tg); + Tq = FNMS(T5, Tf, Tp); + } + { + E Tj, Tk, Tl, Tr; + Tj = cr[WS(rs, 3)]; + Tk = T3 * Tj; + Tl = ci[WS(rs, 3)]; + Tr = T3 * Tl; + Tm = FMA(T6, Tl, Tk); + Ts = FNMS(T6, Tj, Tr); + } + { + E Te, Tn, To, Tt; + Te = T1 + Td; + Tn = Ti + Tm; + ci[WS(rs, 1)] = Te - Tn; + cr[0] = Te + Tn; + To = T1 - Td; + Tt = Tq - Ts; + ci[0] = To - Tt; + cr[WS(rs, 1)] = To + Tt; + } + { + E Tu, Ty, Tz, TA; + Tu = Tq + Ts; + Ty = Tw + Tx; + cr[WS(rs, 2)] = Tu - Ty; + ci[WS(rs, 3)] = Tu + Ty; + Tz = Tm - Ti; + TA = Tx - Tw; + cr[WS(rs, 3)] = Tz - TA; + ci[WS(rs, 2)] = Tz + TA; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hf2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hf2_4) (planner *p) { + X(khc2hc_register) (p, hf2_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 4 -dit -name hf2_4 -include rdft/scalar/hf.h */ + +/* + * This function contains 24 FP additions, 16 FP multiplications, + * (or, 16 additions, 8 multiplications, 8 fused multiply/add), + * 21 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(8, rs)) { + E T2, T4, T3, T5, T6, T8; + T2 = W[0]; + T4 = W[1]; + T3 = W[2]; + T5 = W[3]; + T6 = FMA(T2, T3, T4 * T5); + T8 = FNMS(T4, T3, T2 * T5); + { + E T1, Tp, Ta, To, Te, Tk, Th, Tl, T7, T9; + T1 = cr[0]; + Tp = ci[0]; + T7 = cr[WS(rs, 2)]; + T9 = ci[WS(rs, 2)]; + Ta = FMA(T6, T7, T8 * T9); + To = FNMS(T8, T7, T6 * T9); + { + E Tc, Td, Tf, Tg; + Tc = cr[WS(rs, 1)]; + Td = ci[WS(rs, 1)]; + Te = FMA(T2, Tc, T4 * Td); + Tk = FNMS(T4, Tc, T2 * Td); + Tf = cr[WS(rs, 3)]; + Tg = ci[WS(rs, 3)]; + Th = FMA(T3, Tf, T5 * Tg); + Tl = FNMS(T5, Tf, T3 * Tg); + } + { + E Tb, Ti, Tj, Tm; + Tb = T1 + Ta; + Ti = Te + Th; + ci[WS(rs, 1)] = Tb - Ti; + cr[0] = Tb + Ti; + Tj = T1 - Ta; + Tm = Tk - Tl; + ci[0] = Tj - Tm; + cr[WS(rs, 1)] = Tj + Tm; + } + { + E Tn, Tq, Tr, Ts; + Tn = Tk + Tl; + Tq = To + Tp; + cr[WS(rs, 2)] = Tn - Tq; + ci[WS(rs, 3)] = Tn + Tq; + Tr = Th - Te; + Ts = Tp - To; + cr[WS(rs, 3)] = Tr - Ts; + ci[WS(rs, 2)] = Tr + Ts; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hf2_4", twinstr, &GENUS, {16, 8, 8, 0} }; + +void X(codelet_hf2_4) (planner *p) { + X(khc2hc_register) (p, hf2_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_5.c new file mode 100644 index 000000000..4abedd9fa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_5.c @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:37 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 5 -dit -name hf2_5 -include rdft/scalar/hf.h */ + +/* + * This function contains 44 FP additions, 40 FP multiplications, + * (or, 14 additions, 10 multiplications, 30 fused multiply/add), + * 38 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(10, rs)) { + E T2, Ta, T8, T5, Tb, Tm, Tf, Tj, T9, Te; + T2 = W[0]; + Ta = W[3]; + T8 = W[2]; + T9 = T2 * T8; + Te = T2 * Ta; + T5 = W[1]; + Tb = FNMS(T5, Ta, T9); + Tm = FNMS(T5, T8, Te); + Tf = FMA(T5, T8, Te); + Tj = FMA(T5, Ta, T9); + { + E T1, TL, T7, Th, Ti, Tz, TB, TM, To, Ts, Tt, TE, TG, TN; + T1 = cr[0]; + TL = ci[0]; + { + E T3, T4, T6, Ty, Tc, Td, Tg, TA; + T3 = cr[WS(rs, 1)]; + T4 = T2 * T3; + T6 = ci[WS(rs, 1)]; + Ty = T2 * T6; + Tc = cr[WS(rs, 4)]; + Td = Tb * Tc; + Tg = ci[WS(rs, 4)]; + TA = Tb * Tg; + T7 = FMA(T5, T6, T4); + Th = FMA(Tf, Tg, Td); + Ti = T7 + Th; + Tz = FNMS(T5, T3, Ty); + TB = FNMS(Tf, Tc, TA); + TM = Tz + TB; + } + { + E Tk, Tl, Tn, TD, Tp, Tq, Tr, TF; + Tk = cr[WS(rs, 2)]; + Tl = Tj * Tk; + Tn = ci[WS(rs, 2)]; + TD = Tj * Tn; + Tp = cr[WS(rs, 3)]; + Tq = T8 * Tp; + Tr = ci[WS(rs, 3)]; + TF = T8 * Tr; + To = FMA(Tm, Tn, Tl); + Ts = FMA(Ta, Tr, Tq); + Tt = To + Ts; + TE = FNMS(Tm, Tk, TD); + TG = FNMS(Ta, Tp, TF); + TN = TE + TG; + } + { + E Tw, Tu, Tv, TI, TK, TC, TH, Tx, TJ; + Tw = Ti - Tt; + Tu = Ti + Tt; + Tv = FNMS(KP250000000, Tu, T1); + TC = Tz - TB; + TH = TE - TG; + TI = FMA(KP618033988, TH, TC); + TK = FNMS(KP618033988, TC, TH); + cr[0] = T1 + Tu; + Tx = FMA(KP559016994, Tw, Tv); + ci[0] = FNMS(KP951056516, TI, Tx); + cr[WS(rs, 1)] = FMA(KP951056516, TI, Tx); + TJ = FNMS(KP559016994, Tw, Tv); + cr[WS(rs, 2)] = FNMS(KP951056516, TK, TJ); + ci[WS(rs, 1)] = FMA(KP951056516, TK, TJ); + } + { + E TQ, TO, TP, TU, TW, TS, TT, TV, TR; + TQ = TM - TN; + TO = TM + TN; + TP = FNMS(KP250000000, TO, TL); + TS = To - Ts; + TT = Th - T7; + TU = FMA(KP618033988, TT, TS); + TW = FNMS(KP618033988, TS, TT); + ci[WS(rs, 4)] = TO + TL; + TV = FMA(KP559016994, TQ, TP); + cr[WS(rs, 4)] = FMS(KP951056516, TW, TV); + ci[WS(rs, 3)] = FMA(KP951056516, TW, TV); + TR = FNMS(KP559016994, TQ, TP); + cr[WS(rs, 3)] = FMS(KP951056516, TU, TR); + ci[WS(rs, 2)] = FMA(KP951056516, TU, TR); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hf2_5", twinstr, &GENUS, {14, 10, 30, 0} }; + +void X(codelet_hf2_5) (planner *p) { + X(khc2hc_register) (p, hf2_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 5 -dit -name hf2_5 -include rdft/scalar/hf.h */ + +/* + * This function contains 44 FP additions, 32 FP multiplications, + * (or, 30 additions, 18 multiplications, 14 fused multiply/add), + * 37 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(10, rs)) { + E T2, T4, T7, T9, Tb, Tl, Tf, Tj; + { + E T8, Te, Ta, Td; + T2 = W[0]; + T4 = W[1]; + T7 = W[2]; + T9 = W[3]; + T8 = T2 * T7; + Te = T4 * T7; + Ta = T4 * T9; + Td = T2 * T9; + Tb = T8 - Ta; + Tl = Td - Te; + Tf = Td + Te; + Tj = T8 + Ta; + } + { + E T1, TI, Ty, TB, TG, TF, TJ, TK, TL, Ti, Tr, Ts; + T1 = cr[0]; + TI = ci[0]; + { + E T6, Tw, Tq, TA, Th, Tx, Tn, Tz; + { + E T3, T5, To, Tp; + T3 = cr[WS(rs, 1)]; + T5 = ci[WS(rs, 1)]; + T6 = FMA(T2, T3, T4 * T5); + Tw = FNMS(T4, T3, T2 * T5); + To = cr[WS(rs, 3)]; + Tp = ci[WS(rs, 3)]; + Tq = FMA(T7, To, T9 * Tp); + TA = FNMS(T9, To, T7 * Tp); + } + { + E Tc, Tg, Tk, Tm; + Tc = cr[WS(rs, 4)]; + Tg = ci[WS(rs, 4)]; + Th = FMA(Tb, Tc, Tf * Tg); + Tx = FNMS(Tf, Tc, Tb * Tg); + Tk = cr[WS(rs, 2)]; + Tm = ci[WS(rs, 2)]; + Tn = FMA(Tj, Tk, Tl * Tm); + Tz = FNMS(Tl, Tk, Tj * Tm); + } + Ty = Tw - Tx; + TB = Tz - TA; + TG = Tn - Tq; + TF = Th - T6; + TJ = Tw + Tx; + TK = Tz + TA; + TL = TJ + TK; + Ti = T6 + Th; + Tr = Tn + Tq; + Ts = Ti + Tr; + } + cr[0] = T1 + Ts; + { + E TC, TE, Tv, TD, Tt, Tu; + TC = FMA(KP951056516, Ty, KP587785252 * TB); + TE = FNMS(KP587785252, Ty, KP951056516 * TB); + Tt = KP559016994 * (Ti - Tr); + Tu = FNMS(KP250000000, Ts, T1); + Tv = Tt + Tu; + TD = Tu - Tt; + ci[0] = Tv - TC; + ci[WS(rs, 1)] = TD + TE; + cr[WS(rs, 1)] = Tv + TC; + cr[WS(rs, 2)] = TD - TE; + } + ci[WS(rs, 4)] = TL + TI; + { + E TH, TP, TO, TQ, TM, TN; + TH = FMA(KP587785252, TF, KP951056516 * TG); + TP = FNMS(KP587785252, TG, KP951056516 * TF); + TM = FNMS(KP250000000, TL, TI); + TN = KP559016994 * (TJ - TK); + TO = TM - TN; + TQ = TN + TM; + cr[WS(rs, 3)] = TH - TO; + ci[WS(rs, 3)] = TP + TQ; + ci[WS(rs, 2)] = TH + TO; + cr[WS(rs, 4)] = TP - TQ; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hf2_5", twinstr, &GENUS, {30, 18, 14, 0} }; + +void X(codelet_hf2_5) (planner *p) { + X(khc2hc_register) (p, hf2_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_8.c new file mode 100644 index 000000000..26dbc8c6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf2_8.c @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:35 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -dit -name hf2_8 -include rdft/scalar/hf.h */ + +/* + * This function contains 74 FP additions, 50 FP multiplications, + * (or, 44 additions, 20 multiplications, 30 fused multiply/add), + * 48 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T2, T3, Tl, Tn, T5, T6, Tf, T7, Ts, Tb, To, Ti, TC, TG; + { + E T4, Tm, Tr, Ta, TB, TF; + T2 = W[0]; + T3 = W[2]; + T4 = T2 * T3; + Tl = W[4]; + Tm = T2 * Tl; + Tn = W[5]; + Tr = T2 * Tn; + T5 = W[1]; + T6 = W[3]; + Ta = T2 * T6; + Tf = FMA(T5, T6, T4); + T7 = FNMS(T5, T6, T4); + Ts = FNMS(T5, Tl, Tr); + Tb = FMA(T5, T3, Ta); + To = FMA(T5, Tn, Tm); + TB = Tf * Tl; + TF = Tf * Tn; + Ti = FNMS(T5, T3, Ta); + TC = FMA(Ti, Tn, TB); + TG = FNMS(Ti, Tl, TF); + } + { + E T1, T1s, Td, T1r, Tu, TY, Tk, TW, TN, TR, T18, T1a, T1c, T1d, TA; + E TI, T11, T13, T15, T16; + T1 = cr[0]; + T1s = ci[0]; + { + E T8, T9, Tc, T1q; + T8 = cr[WS(rs, 4)]; + T9 = T7 * T8; + Tc = ci[WS(rs, 4)]; + T1q = T7 * Tc; + Td = FMA(Tb, Tc, T9); + T1r = FNMS(Tb, T8, T1q); + } + { + E Tp, Tq, Tt, TX; + Tp = cr[WS(rs, 6)]; + Tq = To * Tp; + Tt = ci[WS(rs, 6)]; + TX = To * Tt; + Tu = FMA(Ts, Tt, Tq); + TY = FNMS(Ts, Tp, TX); + } + { + E Tg, Th, Tj, TV; + Tg = cr[WS(rs, 2)]; + Th = Tf * Tg; + Tj = ci[WS(rs, 2)]; + TV = Tf * Tj; + Tk = FMA(Ti, Tj, Th); + TW = FNMS(Ti, Tg, TV); + } + { + E TK, TL, TM, T19, TO, TP, TQ, T1b; + TK = cr[WS(rs, 7)]; + TL = Tl * TK; + TM = ci[WS(rs, 7)]; + T19 = Tl * TM; + TO = cr[WS(rs, 3)]; + TP = T3 * TO; + TQ = ci[WS(rs, 3)]; + T1b = T3 * TQ; + TN = FMA(Tn, TM, TL); + TR = FMA(T6, TQ, TP); + T18 = TN - TR; + T1a = FNMS(Tn, TK, T19); + T1c = FNMS(T6, TO, T1b); + T1d = T1a - T1c; + } + { + E Tx, Ty, Tz, T12, TD, TE, TH, T14; + Tx = cr[WS(rs, 1)]; + Ty = T2 * Tx; + Tz = ci[WS(rs, 1)]; + T12 = T2 * Tz; + TD = cr[WS(rs, 5)]; + TE = TC * TD; + TH = ci[WS(rs, 5)]; + T14 = TC * TH; + TA = FMA(T5, Tz, Ty); + TI = FMA(TG, TH, TE); + T11 = TA - TI; + T13 = FNMS(T5, Tx, T12); + T15 = FNMS(TG, TD, T14); + T16 = T13 - T15; + } + { + E T10, T1g, T1z, T1B, T1f, T1A, T1j, T1C; + { + E TU, TZ, T1x, T1y; + TU = T1 - Td; + TZ = TW - TY; + T10 = TU + TZ; + T1g = TU - TZ; + T1x = Tk - Tu; + T1y = T1s - T1r; + T1z = T1x + T1y; + T1B = T1y - T1x; + } + { + E T17, T1e, T1h, T1i; + T17 = T11 + T16; + T1e = T18 - T1d; + T1f = T17 + T1e; + T1A = T1e - T17; + T1h = T11 - T16; + T1i = T18 + T1d; + T1j = T1h + T1i; + T1C = T1i - T1h; + } + ci[WS(rs, 2)] = FNMS(KP707106781, T1f, T10); + cr[WS(rs, 5)] = FMS(KP707106781, T1C, T1B); + ci[WS(rs, 6)] = FMA(KP707106781, T1C, T1B); + cr[WS(rs, 1)] = FMA(KP707106781, T1f, T10); + cr[WS(rs, 3)] = FNMS(KP707106781, T1j, T1g); + cr[WS(rs, 7)] = FMS(KP707106781, T1A, T1z); + ci[WS(rs, 4)] = FMA(KP707106781, T1A, T1z); + ci[0] = FMA(KP707106781, T1j, T1g); + } + { + E Tw, T1k, T1u, T1w, TT, T1v, T1n, T1o; + { + E Te, Tv, T1p, T1t; + Te = T1 + Td; + Tv = Tk + Tu; + Tw = Te + Tv; + T1k = Te - Tv; + T1p = TW + TY; + T1t = T1r + T1s; + T1u = T1p + T1t; + T1w = T1t - T1p; + } + { + E TJ, TS, T1l, T1m; + TJ = TA + TI; + TS = TN + TR; + TT = TJ + TS; + T1v = TS - TJ; + T1l = T1a + T1c; + T1m = T13 + T15; + T1n = T1l - T1m; + T1o = T1m + T1l; + } + ci[WS(rs, 3)] = Tw - TT; + cr[WS(rs, 6)] = T1v - T1w; + ci[WS(rs, 5)] = T1v + T1w; + cr[0] = Tw + TT; + cr[WS(rs, 2)] = T1k - T1n; + cr[WS(rs, 4)] = T1o - T1u; + ci[WS(rs, 7)] = T1o + T1u; + ci[WS(rs, 1)] = T1k + T1n; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hf2_8", twinstr, &GENUS, {44, 20, 30, 0} }; + +void X(codelet_hf2_8) (planner *p) { + X(khc2hc_register) (p, hf2_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -twiddle-log3 -precompute-twiddles -n 8 -dit -name hf2_8 -include rdft/scalar/hf.h */ + +/* + * This function contains 74 FP additions, 44 FP multiplications, + * (or, 56 additions, 26 multiplications, 18 fused multiply/add), + * 42 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf2_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(16, rs)) { + E T2, T5, T3, T6, T8, Tc, Tg, Ti, Tl, Tm, Tn, Tz, Tp, Tx; + { + E T4, Tb, T7, Ta; + T2 = W[0]; + T5 = W[1]; + T3 = W[2]; + T6 = W[3]; + T4 = T2 * T3; + Tb = T5 * T3; + T7 = T5 * T6; + Ta = T2 * T6; + T8 = T4 - T7; + Tc = Ta + Tb; + Tg = T4 + T7; + Ti = Ta - Tb; + Tl = W[4]; + Tm = W[5]; + Tn = FMA(T2, Tl, T5 * Tm); + Tz = FNMS(Ti, Tl, Tg * Tm); + Tp = FNMS(T5, Tl, T2 * Tm); + Tx = FMA(Tg, Tl, Ti * Tm); + } + { + E Tf, T1j, TL, T1d, TJ, T16, TV, TY, Ts, T1i, TO, T1a, TC, T17, TQ; + E TT; + { + E T1, T1c, Te, T1b, T9, Td; + T1 = cr[0]; + T1c = ci[0]; + T9 = cr[WS(rs, 4)]; + Td = ci[WS(rs, 4)]; + Te = FMA(T8, T9, Tc * Td); + T1b = FNMS(Tc, T9, T8 * Td); + Tf = T1 + Te; + T1j = T1c - T1b; + TL = T1 - Te; + T1d = T1b + T1c; + } + { + E TF, TW, TI, TX; + { + E TD, TE, TG, TH; + TD = cr[WS(rs, 7)]; + TE = ci[WS(rs, 7)]; + TF = FMA(Tl, TD, Tm * TE); + TW = FNMS(Tm, TD, Tl * TE); + TG = cr[WS(rs, 3)]; + TH = ci[WS(rs, 3)]; + TI = FMA(T3, TG, T6 * TH); + TX = FNMS(T6, TG, T3 * TH); + } + TJ = TF + TI; + T16 = TW + TX; + TV = TF - TI; + TY = TW - TX; + } + { + E Tk, TM, Tr, TN; + { + E Th, Tj, To, Tq; + Th = cr[WS(rs, 2)]; + Tj = ci[WS(rs, 2)]; + Tk = FMA(Tg, Th, Ti * Tj); + TM = FNMS(Ti, Th, Tg * Tj); + To = cr[WS(rs, 6)]; + Tq = ci[WS(rs, 6)]; + Tr = FMA(Tn, To, Tp * Tq); + TN = FNMS(Tp, To, Tn * Tq); + } + Ts = Tk + Tr; + T1i = Tk - Tr; + TO = TM - TN; + T1a = TM + TN; + } + { + E Tw, TR, TB, TS; + { + E Tu, Tv, Ty, TA; + Tu = cr[WS(rs, 1)]; + Tv = ci[WS(rs, 1)]; + Tw = FMA(T2, Tu, T5 * Tv); + TR = FNMS(T5, Tu, T2 * Tv); + Ty = cr[WS(rs, 5)]; + TA = ci[WS(rs, 5)]; + TB = FMA(Tx, Ty, Tz * TA); + TS = FNMS(Tz, Ty, Tx * TA); + } + TC = Tw + TB; + T17 = TR + TS; + TQ = Tw - TB; + TT = TR - TS; + } + { + E Tt, TK, T1f, T1g; + Tt = Tf + Ts; + TK = TC + TJ; + ci[WS(rs, 3)] = Tt - TK; + cr[0] = Tt + TK; + T1f = TJ - TC; + T1g = T1d - T1a; + cr[WS(rs, 6)] = T1f - T1g; + ci[WS(rs, 5)] = T1f + T1g; + { + E T11, T1m, T14, T1l, T12, T13; + T11 = TL - TO; + T1m = T1j - T1i; + T12 = TQ - TT; + T13 = TV + TY; + T14 = KP707106781 * (T12 + T13); + T1l = KP707106781 * (T13 - T12); + cr[WS(rs, 3)] = T11 - T14; + ci[WS(rs, 6)] = T1l + T1m; + ci[0] = T11 + T14; + cr[WS(rs, 5)] = T1l - T1m; + } + } + { + E T19, T1e, T15, T18; + T19 = T17 + T16; + T1e = T1a + T1d; + cr[WS(rs, 4)] = T19 - T1e; + ci[WS(rs, 7)] = T19 + T1e; + T15 = Tf - Ts; + T18 = T16 - T17; + cr[WS(rs, 2)] = T15 - T18; + ci[WS(rs, 1)] = T15 + T18; + { + E TP, T1k, T10, T1h, TU, TZ; + TP = TL + TO; + T1k = T1i + T1j; + TU = TQ + TT; + TZ = TV - TY; + T10 = KP707106781 * (TU + TZ); + T1h = KP707106781 * (TZ - TU); + ci[WS(rs, 2)] = TP - T10; + ci[WS(rs, 4)] = T1h + T1k; + cr[WS(rs, 1)] = TP + T10; + cr[WS(rs, 7)] = T1h - T1k; + } + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_CEXP, 1, 1}, + {TW_CEXP, 1, 3}, + {TW_CEXP, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hf2_8", twinstr, &GENUS, {56, 26, 18, 0} }; + +void X(codelet_hf2_8) (planner *p) { + X(khc2hc_register) (p, hf2_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_10.c new file mode 100644 index 000000000..b9b3778fb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_10.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -dit -name hf_10 -include rdft/scalar/hf.h */ + +/* + * This function contains 102 FP additions, 72 FP multiplications, + * (or, 48 additions, 18 multiplications, 54 fused multiply/add), + * 47 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_10(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 18, MAKE_VOLATILE_STRIDE(20, rs)) { + E T8, T23, T12, T1U, TM, TZ, T10, T1F, T1G, T25, T16, T17, T18, T1s, T1x; + E T1P, Tl, Ty, Tz, T1I, T1J, T24, T13, T14, T15, T1h, T1m, T1O; + { + E T1, T1R, T3, T6, T4, T1S, T2, T7, T1T, T5; + T1 = cr[0]; + T1R = ci[0]; + T3 = cr[WS(rs, 5)]; + T6 = ci[WS(rs, 5)]; + T2 = W[8]; + T4 = T2 * T3; + T1S = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T1T = FNMS(T5, T3, T1S); + T8 = T1 - T7; + T23 = T1T + T1R; + T12 = T1 + T7; + T1U = T1R - T1T; + } + { + E TF, T1w, TY, T1p, TL, T1u, TS, T1r; + { + E TB, TE, TC, T1v, TA, TD; + TB = cr[WS(rs, 4)]; + TE = ci[WS(rs, 4)]; + TA = W[6]; + TC = TA * TB; + T1v = TA * TE; + TD = W[7]; + TF = FMA(TD, TE, TC); + T1w = FNMS(TD, TB, T1v); + } + { + E TU, TX, TV, T1o, TT, TW; + TU = cr[WS(rs, 1)]; + TX = ci[WS(rs, 1)]; + TT = W[0]; + TV = TT * TU; + T1o = TT * TX; + TW = W[1]; + TY = FMA(TW, TX, TV); + T1p = FNMS(TW, TU, T1o); + } + { + E TH, TK, TI, T1t, TG, TJ; + TH = cr[WS(rs, 9)]; + TK = ci[WS(rs, 9)]; + TG = W[16]; + TI = TG * TH; + T1t = TG * TK; + TJ = W[17]; + TL = FMA(TJ, TK, TI); + T1u = FNMS(TJ, TH, T1t); + } + { + E TO, TR, TP, T1q, TN, TQ; + TO = cr[WS(rs, 6)]; + TR = ci[WS(rs, 6)]; + TN = W[10]; + TP = TN * TO; + T1q = TN * TR; + TQ = W[11]; + TS = FMA(TQ, TR, TP); + T1r = FNMS(TQ, TO, T1q); + } + TM = TF - TL; + TZ = TS - TY; + T10 = TM + TZ; + T1F = T1w + T1u; + T1G = T1r + T1p; + T25 = T1F + T1G; + T16 = TF + TL; + T17 = TS + TY; + T18 = T16 + T17; + T1s = T1p - T1r; + T1x = T1u - T1w; + T1P = T1x + T1s; + } + { + E Te, T1l, Tx, T1e, Tk, T1j, Tr, T1g; + { + E Ta, Td, Tb, T1k, T9, Tc; + Ta = cr[WS(rs, 2)]; + Td = ci[WS(rs, 2)]; + T9 = W[2]; + Tb = T9 * Ta; + T1k = T9 * Td; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + T1l = FNMS(Tc, Ta, T1k); + } + { + E Tt, Tw, Tu, T1d, Ts, Tv; + Tt = cr[WS(rs, 3)]; + Tw = ci[WS(rs, 3)]; + Ts = W[4]; + Tu = Ts * Tt; + T1d = Ts * Tw; + Tv = W[5]; + Tx = FMA(Tv, Tw, Tu); + T1e = FNMS(Tv, Tt, T1d); + } + { + E Tg, Tj, Th, T1i, Tf, Ti; + Tg = cr[WS(rs, 7)]; + Tj = ci[WS(rs, 7)]; + Tf = W[12]; + Th = Tf * Tg; + T1i = Tf * Tj; + Ti = W[13]; + Tk = FMA(Ti, Tj, Th); + T1j = FNMS(Ti, Tg, T1i); + } + { + E Tn, Tq, To, T1f, Tm, Tp; + Tn = cr[WS(rs, 8)]; + Tq = ci[WS(rs, 8)]; + Tm = W[14]; + To = Tm * Tn; + T1f = Tm * Tq; + Tp = W[15]; + Tr = FMA(Tp, Tq, To); + T1g = FNMS(Tp, Tn, T1f); + } + Tl = Te - Tk; + Ty = Tr - Tx; + Tz = Tl + Ty; + T1I = T1l + T1j; + T1J = T1g + T1e; + T24 = T1I + T1J; + T13 = Te + Tk; + T14 = Tr + Tx; + T15 = T13 + T14; + T1h = T1e - T1g; + T1m = T1j - T1l; + T1O = T1m + T1h; + } + { + E T1b, T11, T1a, T1z, T1B, T1n, T1y, T1A, T1c; + T1b = Tz - T10; + T11 = Tz + T10; + T1a = FNMS(KP250000000, T11, T8); + T1n = T1h - T1m; + T1y = T1s - T1x; + T1z = FMA(KP618033988, T1y, T1n); + T1B = FNMS(KP618033988, T1n, T1y); + ci[WS(rs, 4)] = T8 + T11; + T1A = FNMS(KP559016994, T1b, T1a); + ci[WS(rs, 2)] = FNMS(KP951056516, T1B, T1A); + cr[WS(rs, 3)] = FMA(KP951056516, T1B, T1A); + T1c = FMA(KP559016994, T1b, T1a); + ci[0] = FNMS(KP951056516, T1z, T1c); + cr[WS(rs, 1)] = FMA(KP951056516, T1z, T1c); + } + { + E T1D, T19, T1C, T1L, T1N, T1H, T1K, T1M, T1E; + T1D = T15 - T18; + T19 = T15 + T18; + T1C = FNMS(KP250000000, T19, T12); + T1H = T1F - T1G; + T1K = T1I - T1J; + T1L = FNMS(KP618033988, T1K, T1H); + T1N = FMA(KP618033988, T1H, T1K); + cr[0] = T12 + T19; + T1M = FMA(KP559016994, T1D, T1C); + cr[WS(rs, 4)] = FNMS(KP951056516, T1N, T1M); + ci[WS(rs, 3)] = FMA(KP951056516, T1N, T1M); + T1E = FNMS(KP559016994, T1D, T1C); + cr[WS(rs, 2)] = FNMS(KP951056516, T1L, T1E); + ci[WS(rs, 1)] = FMA(KP951056516, T1L, T1E); + } + { + E T1W, T1Q, T1V, T20, T22, T1Y, T1Z, T21, T1X; + T1W = T1P - T1O; + T1Q = T1O + T1P; + T1V = FMA(KP250000000, T1Q, T1U); + T1Y = TZ - TM; + T1Z = Ty - Tl; + T20 = FNMS(KP618033988, T1Z, T1Y); + T22 = FMA(KP618033988, T1Y, T1Z); + cr[WS(rs, 5)] = T1Q - T1U; + T21 = FMA(KP559016994, T1W, T1V); + cr[WS(rs, 9)] = FMS(KP951056516, T22, T21); + ci[WS(rs, 8)] = FMA(KP951056516, T22, T21); + T1X = FNMS(KP559016994, T1W, T1V); + cr[WS(rs, 7)] = FMS(KP951056516, T20, T1X); + ci[WS(rs, 6)] = FMA(KP951056516, T20, T1X); + } + { + E T28, T26, T27, T2c, T2e, T2a, T2b, T2d, T29; + T28 = T24 - T25; + T26 = T24 + T25; + T27 = FNMS(KP250000000, T26, T23); + T2a = T13 - T14; + T2b = T16 - T17; + T2c = FMA(KP618033988, T2b, T2a); + T2e = FNMS(KP618033988, T2a, T2b); + ci[WS(rs, 9)] = T26 + T23; + T2d = FNMS(KP559016994, T28, T27); + cr[WS(rs, 8)] = FMS(KP951056516, T2e, T2d); + ci[WS(rs, 7)] = FMA(KP951056516, T2e, T2d); + T29 = FMA(KP559016994, T28, T27); + cr[WS(rs, 6)] = FMS(KP951056516, T2c, T29); + ci[WS(rs, 5)] = FMA(KP951056516, T2c, T29); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 10, "hf_10", twinstr, &GENUS, {48, 18, 54, 0} }; + +void X(codelet_hf_10) (planner *p) { + X(khc2hc_register) (p, hf_10, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 10 -dit -name hf_10 -include rdft/scalar/hf.h */ + +/* + * This function contains 102 FP additions, 60 FP multiplications, + * (or, 72 additions, 30 multiplications, 30 fused multiply/add), + * 45 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_10(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 18); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 18, MAKE_VOLATILE_STRIDE(20, rs)) { + E T7, T1R, TT, T1C, TF, TQ, TR, T1o, T1p, T1P, TX, TY, TZ, T1d, T1g; + E T1x, Ti, Tt, Tu, T1r, T1s, T1O, TU, TV, TW, T16, T19, T1y; + { + E T1, T1A, T6, T1B; + T1 = cr[0]; + T1A = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 5)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T1B = FNMS(T4, T3, T2 * T5); + } + T7 = T1 - T6; + T1R = T1B + T1A; + TT = T1 + T6; + T1C = T1A - T1B; + } + { + E Tz, T1b, TP, T1e, TE, T1c, TK, T1f; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 4)]; + Ty = ci[WS(rs, 4)]; + Tv = W[6]; + Tx = W[7]; + Tz = FMA(Tv, Tw, Tx * Ty); + T1b = FNMS(Tx, Tw, Tv * Ty); + } + { + E TM, TO, TL, TN; + TM = cr[WS(rs, 1)]; + TO = ci[WS(rs, 1)]; + TL = W[0]; + TN = W[1]; + TP = FMA(TL, TM, TN * TO); + T1e = FNMS(TN, TM, TL * TO); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 9)]; + TD = ci[WS(rs, 9)]; + TA = W[16]; + TC = W[17]; + TE = FMA(TA, TB, TC * TD); + T1c = FNMS(TC, TB, TA * TD); + } + { + E TH, TJ, TG, TI; + TH = cr[WS(rs, 6)]; + TJ = ci[WS(rs, 6)]; + TG = W[10]; + TI = W[11]; + TK = FMA(TG, TH, TI * TJ); + T1f = FNMS(TI, TH, TG * TJ); + } + TF = Tz - TE; + TQ = TK - TP; + TR = TF + TQ; + T1o = T1b + T1c; + T1p = T1f + T1e; + T1P = T1o + T1p; + TX = Tz + TE; + TY = TK + TP; + TZ = TX + TY; + T1d = T1b - T1c; + T1g = T1e - T1f; + T1x = T1g - T1d; + } + { + E Tc, T14, Ts, T18, Th, T15, Tn, T17; + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 2)]; + Tb = ci[WS(rs, 2)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + T14 = FNMS(Ta, T9, T8 * Tb); + } + { + E Tp, Tr, To, Tq; + Tp = cr[WS(rs, 3)]; + Tr = ci[WS(rs, 3)]; + To = W[4]; + Tq = W[5]; + Ts = FMA(To, Tp, Tq * Tr); + T18 = FNMS(Tq, Tp, To * Tr); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 7)]; + Tg = ci[WS(rs, 7)]; + Td = W[12]; + Tf = W[13]; + Th = FMA(Td, Te, Tf * Tg); + T15 = FNMS(Tf, Te, Td * Tg); + } + { + E Tk, Tm, Tj, Tl; + Tk = cr[WS(rs, 8)]; + Tm = ci[WS(rs, 8)]; + Tj = W[14]; + Tl = W[15]; + Tn = FMA(Tj, Tk, Tl * Tm); + T17 = FNMS(Tl, Tk, Tj * Tm); + } + Ti = Tc - Th; + Tt = Tn - Ts; + Tu = Ti + Tt; + T1r = T14 + T15; + T1s = T17 + T18; + T1O = T1r + T1s; + TU = Tc + Th; + TV = Tn + Ts; + TW = TU + TV; + T16 = T14 - T15; + T19 = T17 - T18; + T1y = T16 + T19; + } + { + E T11, TS, T12, T1i, T1k, T1a, T1h, T1j, T13; + T11 = KP559016994 * (Tu - TR); + TS = Tu + TR; + T12 = FNMS(KP250000000, TS, T7); + T1a = T16 - T19; + T1h = T1d + T1g; + T1i = FMA(KP951056516, T1a, KP587785252 * T1h); + T1k = FNMS(KP587785252, T1a, KP951056516 * T1h); + ci[WS(rs, 4)] = T7 + TS; + T1j = T12 - T11; + ci[WS(rs, 2)] = T1j - T1k; + cr[WS(rs, 3)] = T1j + T1k; + T13 = T11 + T12; + ci[0] = T13 - T1i; + cr[WS(rs, 1)] = T13 + T1i; + } + { + E T1m, T10, T1l, T1u, T1w, T1q, T1t, T1v, T1n; + T1m = KP559016994 * (TW - TZ); + T10 = TW + TZ; + T1l = FNMS(KP250000000, T10, TT); + T1q = T1o - T1p; + T1t = T1r - T1s; + T1u = FNMS(KP587785252, T1t, KP951056516 * T1q); + T1w = FMA(KP951056516, T1t, KP587785252 * T1q); + cr[0] = TT + T10; + T1v = T1m + T1l; + cr[WS(rs, 4)] = T1v - T1w; + ci[WS(rs, 3)] = T1v + T1w; + T1n = T1l - T1m; + cr[WS(rs, 2)] = T1n - T1u; + ci[WS(rs, 1)] = T1n + T1u; + } + { + E T1H, T1z, T1G, T1F, T1J, T1D, T1E, T1K, T1I; + T1H = KP559016994 * (T1y + T1x); + T1z = T1x - T1y; + T1G = FMA(KP250000000, T1z, T1C); + T1D = Ti - Tt; + T1E = TQ - TF; + T1F = FMA(KP587785252, T1D, KP951056516 * T1E); + T1J = FNMS(KP951056516, T1D, KP587785252 * T1E); + cr[WS(rs, 5)] = T1z - T1C; + T1K = T1H + T1G; + cr[WS(rs, 9)] = T1J - T1K; + ci[WS(rs, 8)] = T1J + T1K; + T1I = T1G - T1H; + cr[WS(rs, 7)] = T1F - T1I; + ci[WS(rs, 6)] = T1F + T1I; + } + { + E T1Q, T1S, T1T, T1N, T1V, T1L, T1M, T1W, T1U; + T1Q = KP559016994 * (T1O - T1P); + T1S = T1O + T1P; + T1T = FNMS(KP250000000, T1S, T1R); + T1L = TU - TV; + T1M = TX - TY; + T1N = FMA(KP951056516, T1L, KP587785252 * T1M); + T1V = FNMS(KP587785252, T1L, KP951056516 * T1M); + ci[WS(rs, 9)] = T1S + T1R; + T1W = T1T - T1Q; + cr[WS(rs, 8)] = T1V - T1W; + ci[WS(rs, 7)] = T1V + T1W; + T1U = T1Q + T1T; + cr[WS(rs, 6)] = T1N - T1U; + ci[WS(rs, 5)] = T1N + T1U; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 10}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 10, "hf_10", twinstr, &GENUS, {72, 30, 30, 0} }; + +void X(codelet_hf_10) (planner *p) { + X(khc2hc_register) (p, hf_10, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_12.c new file mode 100644 index 000000000..748936fdb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_12.c @@ -0,0 +1,581 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:30 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -dit -name hf_12 -include rdft/scalar/hf.h */ + +/* + * This function contains 118 FP additions, 68 FP multiplications, + * (or, 72 additions, 22 multiplications, 46 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_12(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 22, MAKE_VOLATILE_STRIDE(24, rs)) { + E T1, T2i, Tl, T2e, T10, T1Y, TG, T1S, Ty, T2s, T1s, T2f, T1d, T21, T1H; + E T1Z, Te, T2p, T1l, T2h, TT, T1V, T1A, T1T; + T1 = cr[0]; + T2i = ci[0]; + { + E Th, Tk, Ti, T2d, Tg, Tj; + Th = cr[WS(rs, 6)]; + Tk = ci[WS(rs, 6)]; + Tg = W[10]; + Ti = Tg * Th; + T2d = Tg * Tk; + Tj = W[11]; + Tl = FMA(Tj, Tk, Ti); + T2e = FNMS(Tj, Th, T2d); + } + { + E TW, TZ, TX, T1X, TV, TY; + TW = cr[WS(rs, 9)]; + TZ = ci[WS(rs, 9)]; + TV = W[16]; + TX = TV * TW; + T1X = TV * TZ; + TY = W[17]; + T10 = FMA(TY, TZ, TX); + T1Y = FNMS(TY, TW, T1X); + } + { + E TC, TF, TD, T1R, TB, TE; + TC = cr[WS(rs, 3)]; + TF = ci[WS(rs, 3)]; + TB = W[4]; + TD = TB * TC; + T1R = TB * TF; + TE = W[5]; + TG = FMA(TE, TF, TD); + T1S = FNMS(TE, TC, T1R); + } + { + E Tn, Tq, To, T1o, Tt, Tw, Tu, T1q, Tm, Ts; + Tn = cr[WS(rs, 10)]; + Tq = ci[WS(rs, 10)]; + Tm = W[18]; + To = Tm * Tn; + T1o = Tm * Tq; + Tt = cr[WS(rs, 2)]; + Tw = ci[WS(rs, 2)]; + Ts = W[2]; + Tu = Ts * Tt; + T1q = Ts * Tw; + { + E Tr, T1p, Tx, T1r, Tp, Tv; + Tp = W[19]; + Tr = FMA(Tp, Tq, To); + T1p = FNMS(Tp, Tn, T1o); + Tv = W[3]; + Tx = FMA(Tv, Tw, Tu); + T1r = FNMS(Tv, Tt, T1q); + Ty = Tr + Tx; + T2s = Tx - Tr; + T1s = T1p - T1r; + T2f = T1p + T1r; + } + } + { + E T12, T15, T13, T1D, T18, T1b, T19, T1F, T11, T17; + T12 = cr[WS(rs, 1)]; + T15 = ci[WS(rs, 1)]; + T11 = W[0]; + T13 = T11 * T12; + T1D = T11 * T15; + T18 = cr[WS(rs, 5)]; + T1b = ci[WS(rs, 5)]; + T17 = W[8]; + T19 = T17 * T18; + T1F = T17 * T1b; + { + E T16, T1E, T1c, T1G, T14, T1a; + T14 = W[1]; + T16 = FMA(T14, T15, T13); + T1E = FNMS(T14, T12, T1D); + T1a = W[9]; + T1c = FMA(T1a, T1b, T19); + T1G = FNMS(T1a, T18, T1F); + T1d = T16 + T1c; + T21 = T1c - T16; + T1H = T1E - T1G; + T1Z = T1E + T1G; + } + } + { + E T3, T6, T4, T1h, T9, Tc, Ta, T1j, T2, T8; + T3 = cr[WS(rs, 4)]; + T6 = ci[WS(rs, 4)]; + T2 = W[6]; + T4 = T2 * T3; + T1h = T2 * T6; + T9 = cr[WS(rs, 8)]; + Tc = ci[WS(rs, 8)]; + T8 = W[14]; + Ta = T8 * T9; + T1j = T8 * Tc; + { + E T7, T1i, Td, T1k, T5, Tb; + T5 = W[7]; + T7 = FMA(T5, T6, T4); + T1i = FNMS(T5, T3, T1h); + Tb = W[15]; + Td = FMA(Tb, Tc, Ta); + T1k = FNMS(Tb, T9, T1j); + Te = T7 + Td; + T2p = Td - T7; + T1l = T1i - T1k; + T2h = T1i + T1k; + } + } + { + E TI, TL, TJ, T1w, TO, TR, TP, T1y, TH, TN; + TI = cr[WS(rs, 7)]; + TL = ci[WS(rs, 7)]; + TH = W[12]; + TJ = TH * TI; + T1w = TH * TL; + TO = cr[WS(rs, 11)]; + TR = ci[WS(rs, 11)]; + TN = W[20]; + TP = TN * TO; + T1y = TN * TR; + { + E TM, T1x, TS, T1z, TK, TQ; + TK = W[13]; + TM = FMA(TK, TL, TJ); + T1x = FNMS(TK, TI, T1w); + TQ = W[21]; + TS = FMA(TQ, TR, TP); + T1z = FNMS(TQ, TO, T1y); + TT = TM + TS; + T1V = TS - TM; + T1A = T1x - T1z; + T1T = T1x + T1z; + } + } + { + E TA, T28, T2k, T2m, T1f, T2l, T2b, T2c; + { + E Tf, Tz, T2g, T2j; + Tf = T1 + Te; + Tz = Tl + Ty; + TA = Tf + Tz; + T28 = Tf - Tz; + T2g = T2e + T2f; + T2j = T2h + T2i; + T2k = T2g + T2j; + T2m = T2j - T2g; + } + { + E TU, T1e, T29, T2a; + TU = TG + TT; + T1e = T10 + T1d; + T1f = TU + T1e; + T2l = TU - T1e; + T29 = T1S + T1T; + T2a = T1Y + T1Z; + T2b = T29 - T2a; + T2c = T29 + T2a; + } + ci[WS(rs, 5)] = TA - T1f; + cr[WS(rs, 9)] = T2l - T2m; + ci[WS(rs, 8)] = T2l + T2m; + cr[0] = TA + T1f; + cr[WS(rs, 3)] = T28 - T2b; + cr[WS(rs, 6)] = T2c - T2k; + ci[WS(rs, 11)] = T2c + T2k; + ci[WS(rs, 2)] = T28 + T2b; + } + { + E T1m, T1K, T2q, T2y, T2t, T2z, T1t, T1L, T1B, T1N, T1W, T25, T22, T26, T1I; + E T1O; + { + E T1g, T2o, T2r, T1n; + T1g = FNMS(KP500000000, Te, T1); + T1m = FNMS(KP866025403, T1l, T1g); + T1K = FMA(KP866025403, T1l, T1g); + T2o = FNMS(KP500000000, T2h, T2i); + T2q = FNMS(KP866025403, T2p, T2o); + T2y = FMA(KP866025403, T2p, T2o); + T2r = FNMS(KP500000000, T2f, T2e); + T2t = FNMS(KP866025403, T2s, T2r); + T2z = FMA(KP866025403, T2s, T2r); + T1n = FNMS(KP500000000, Ty, Tl); + T1t = FNMS(KP866025403, T1s, T1n); + T1L = FMA(KP866025403, T1s, T1n); + } + { + E T1v, T1U, T20, T1C; + T1v = FNMS(KP500000000, TT, TG); + T1B = FNMS(KP866025403, T1A, T1v); + T1N = FMA(KP866025403, T1A, T1v); + T1U = FNMS(KP500000000, T1T, T1S); + T1W = FNMS(KP866025403, T1V, T1U); + T25 = FMA(KP866025403, T1V, T1U); + T20 = FNMS(KP500000000, T1Z, T1Y); + T22 = FNMS(KP866025403, T21, T20); + T26 = FMA(KP866025403, T21, T20); + T1C = FNMS(KP500000000, T1d, T10); + T1I = FNMS(KP866025403, T1H, T1C); + T1O = FMA(KP866025403, T1H, T1C); + } + { + E T1u, T1J, T2v, T2w; + T1u = T1m + T1t; + T1J = T1B + T1I; + cr[WS(rs, 2)] = T1u - T1J; + ci[WS(rs, 3)] = T1u + T1J; + T2v = T1W + T22; + T2w = T2t + T2q; + cr[WS(rs, 8)] = -(T2v + T2w); + ci[WS(rs, 9)] = T2w - T2v; + } + { + E T2B, T2C, T2x, T2A; + T2B = T25 + T26; + T2C = T2z + T2y; + cr[WS(rs, 10)] = T2B - T2C; + ci[WS(rs, 7)] = T2B + T2C; + T2x = T1O - T1N; + T2A = T2y - T2z; + cr[WS(rs, 7)] = T2x - T2A; + ci[WS(rs, 10)] = T2x + T2A; + } + { + E T1M, T1P, T24, T27; + T1M = T1K + T1L; + T1P = T1N + T1O; + ci[WS(rs, 1)] = T1M - T1P; + cr[WS(rs, 4)] = T1M + T1P; + T24 = T1K - T1L; + T27 = T25 - T26; + ci[WS(rs, 4)] = T24 - T27; + cr[WS(rs, 1)] = T24 + T27; + } + { + E T1Q, T23, T2n, T2u; + T1Q = T1m - T1t; + T23 = T1W - T22; + ci[0] = T1Q - T23; + cr[WS(rs, 5)] = T1Q + T23; + T2n = T1I - T1B; + T2u = T2q - T2t; + cr[WS(rs, 11)] = T2n - T2u; + ci[WS(rs, 6)] = T2n + T2u; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 12, "hf_12", twinstr, &GENUS, {72, 22, 46, 0} }; + +void X(codelet_hf_12) (planner *p) { + X(khc2hc_register) (p, hf_12, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 12 -dit -name hf_12 -include rdft/scalar/hf.h */ + +/* + * This function contains 118 FP additions, 60 FP multiplications, + * (or, 88 additions, 30 multiplications, 30 fused multiply/add), + * 47 stack variables, 2 constants, and 48 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_12(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 22); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 22, MAKE_VOLATILE_STRIDE(24, rs)) { + E T1, T1W, T18, T23, Tc, T15, T1V, T22, TR, T1E, T1o, T1D, T12, T1l, T1F; + E T1G, Ti, T1S, T1d, T26, Tt, T1a, T1T, T25, TA, T1y, T1j, T1B, TL, T1g; + E T1z, T1A; + { + E T6, T16, Tb, T17; + T1 = cr[0]; + T1W = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 4)]; + T5 = ci[WS(rs, 4)]; + T2 = W[6]; + T4 = W[7]; + T6 = FMA(T2, T3, T4 * T5); + T16 = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 8)]; + Ta = ci[WS(rs, 8)]; + T7 = W[14]; + T9 = W[15]; + Tb = FMA(T7, T8, T9 * Ta); + T17 = FNMS(T9, T8, T7 * Ta); + } + T18 = KP866025403 * (T16 - T17); + T23 = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + T15 = FNMS(KP500000000, Tc, T1); + T1V = T16 + T17; + T22 = FNMS(KP500000000, T1V, T1W); + } + { + E T11, T1n, TW, T1m; + { + E TO, TQ, TN, TP; + TO = cr[WS(rs, 9)]; + TQ = ci[WS(rs, 9)]; + TN = W[16]; + TP = W[17]; + TR = FMA(TN, TO, TP * TQ); + T1E = FNMS(TP, TO, TN * TQ); + } + { + E TY, T10, TX, TZ; + TY = cr[WS(rs, 5)]; + T10 = ci[WS(rs, 5)]; + TX = W[8]; + TZ = W[9]; + T11 = FMA(TX, TY, TZ * T10); + T1n = FNMS(TZ, TY, TX * T10); + } + { + E TT, TV, TS, TU; + TT = cr[WS(rs, 1)]; + TV = ci[WS(rs, 1)]; + TS = W[0]; + TU = W[1]; + TW = FMA(TS, TT, TU * TV); + T1m = FNMS(TU, TT, TS * TV); + } + T1o = KP866025403 * (T1m - T1n); + T1D = KP866025403 * (T11 - TW); + T12 = TW + T11; + T1l = FNMS(KP500000000, T12, TR); + T1F = T1m + T1n; + T1G = FNMS(KP500000000, T1F, T1E); + } + { + E Ts, T1c, Tn, T1b; + { + E Tf, Th, Te, Tg; + Tf = cr[WS(rs, 6)]; + Th = ci[WS(rs, 6)]; + Te = W[10]; + Tg = W[11]; + Ti = FMA(Te, Tf, Tg * Th); + T1S = FNMS(Tg, Tf, Te * Th); + } + { + E Tp, Tr, To, Tq; + Tp = cr[WS(rs, 2)]; + Tr = ci[WS(rs, 2)]; + To = W[2]; + Tq = W[3]; + Ts = FMA(To, Tp, Tq * Tr); + T1c = FNMS(Tq, Tp, To * Tr); + } + { + E Tk, Tm, Tj, Tl; + Tk = cr[WS(rs, 10)]; + Tm = ci[WS(rs, 10)]; + Tj = W[18]; + Tl = W[19]; + Tn = FMA(Tj, Tk, Tl * Tm); + T1b = FNMS(Tl, Tk, Tj * Tm); + } + T1d = KP866025403 * (T1b - T1c); + T26 = KP866025403 * (Ts - Tn); + Tt = Tn + Ts; + T1a = FNMS(KP500000000, Tt, Ti); + T1T = T1b + T1c; + T25 = FNMS(KP500000000, T1T, T1S); + } + { + E TK, T1i, TF, T1h; + { + E Tx, Tz, Tw, Ty; + Tx = cr[WS(rs, 3)]; + Tz = ci[WS(rs, 3)]; + Tw = W[4]; + Ty = W[5]; + TA = FMA(Tw, Tx, Ty * Tz); + T1y = FNMS(Ty, Tx, Tw * Tz); + } + { + E TH, TJ, TG, TI; + TH = cr[WS(rs, 11)]; + TJ = ci[WS(rs, 11)]; + TG = W[20]; + TI = W[21]; + TK = FMA(TG, TH, TI * TJ); + T1i = FNMS(TI, TH, TG * TJ); + } + { + E TC, TE, TB, TD; + TC = cr[WS(rs, 7)]; + TE = ci[WS(rs, 7)]; + TB = W[12]; + TD = W[13]; + TF = FMA(TB, TC, TD * TE); + T1h = FNMS(TD, TC, TB * TE); + } + T1j = KP866025403 * (T1h - T1i); + T1B = KP866025403 * (TK - TF); + TL = TF + TK; + T1g = FNMS(KP500000000, TL, TA); + T1z = T1h + T1i; + T1A = FNMS(KP500000000, T1z, T1y); + } + { + E Tv, T1N, T1Y, T20, T14, T1Z, T1Q, T1R; + { + E Td, Tu, T1U, T1X; + Td = T1 + Tc; + Tu = Ti + Tt; + Tv = Td + Tu; + T1N = Td - Tu; + T1U = T1S + T1T; + T1X = T1V + T1W; + T1Y = T1U + T1X; + T20 = T1X - T1U; + } + { + E TM, T13, T1O, T1P; + TM = TA + TL; + T13 = TR + T12; + T14 = TM + T13; + T1Z = TM - T13; + T1O = T1y + T1z; + T1P = T1E + T1F; + T1Q = T1O - T1P; + T1R = T1O + T1P; + } + ci[WS(rs, 5)] = Tv - T14; + cr[WS(rs, 9)] = T1Z - T20; + ci[WS(rs, 8)] = T1Z + T20; + cr[0] = Tv + T14; + cr[WS(rs, 3)] = T1N - T1Q; + cr[WS(rs, 6)] = T1R - T1Y; + ci[WS(rs, 11)] = T1R + T1Y; + ci[WS(rs, 2)] = T1N + T1Q; + } + { + E T1f, T1x, T28, T2a, T1q, T21, T1I, T29; + { + E T19, T1e, T24, T27; + T19 = T15 - T18; + T1e = T1a - T1d; + T1f = T19 + T1e; + T1x = T19 - T1e; + T24 = T22 - T23; + T27 = T25 - T26; + T28 = T24 - T27; + T2a = T27 + T24; + } + { + E T1k, T1p, T1C, T1H; + T1k = T1g - T1j; + T1p = T1l - T1o; + T1q = T1k + T1p; + T21 = T1p - T1k; + T1C = T1A - T1B; + T1H = T1D - T1G; + T1I = T1C + T1H; + T29 = T1H - T1C; + } + cr[WS(rs, 2)] = T1f - T1q; + cr[WS(rs, 8)] = T29 - T2a; + ci[WS(rs, 9)] = T29 + T2a; + ci[WS(rs, 3)] = T1f + T1q; + ci[0] = T1x - T1I; + cr[WS(rs, 11)] = T21 - T28; + ci[WS(rs, 6)] = T21 + T28; + cr[WS(rs, 5)] = T1x + T1I; + } + { + E T1t, T1J, T2e, T2g, T1w, T2b, T1M, T2f; + { + E T1r, T1s, T2c, T2d; + T1r = T15 + T18; + T1s = T1a + T1d; + T1t = T1r + T1s; + T1J = T1r - T1s; + T2c = T23 + T22; + T2d = T26 + T25; + T2e = T2c - T2d; + T2g = T2d + T2c; + } + { + E T1u, T1v, T1K, T1L; + T1u = T1g + T1j; + T1v = T1l + T1o; + T1w = T1u + T1v; + T2b = T1v - T1u; + T1K = T1B + T1A; + T1L = T1D + T1G; + T1M = T1K - T1L; + T2f = T1K + T1L; + } + ci[WS(rs, 1)] = T1t - T1w; + cr[WS(rs, 1)] = T1J + T1M; + cr[WS(rs, 4)] = T1t + T1w; + ci[WS(rs, 4)] = T1J - T1M; + cr[WS(rs, 7)] = T2b - T2e; + ci[WS(rs, 7)] = T2f + T2g; + ci[WS(rs, 10)] = T2b + T2e; + cr[WS(rs, 10)] = T2f - T2g; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 12}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 12, "hf_12", twinstr, &GENUS, {88, 30, 30, 0} }; + +void X(codelet_hf_12) (planner *p) { + X(khc2hc_register) (p, hf_12, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_15.c new file mode 100644 index 000000000..cdd095ae7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_15.c @@ -0,0 +1,816 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:30 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 15 -dit -name hf_15 -include rdft/scalar/hf.h */ + +/* + * This function contains 184 FP additions, 140 FP multiplications, + * (or, 72 additions, 28 multiplications, 112 fused multiply/add), + * 51 stack variables, 6 constants, and 60 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_15(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 28); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 28, MAKE_VOLATILE_STRIDE(30, rs)) { + E T1, T3i, T1G, T3l, Te, T1B, T3j, T3k, T1y, T2i, T2a, T2M, T37, T2Y, Tz; + E T2e, T1O, T2t, T39, T2U, TT, T2f, T1V, T2z, T3a, T2V, T1e, T2h, T23, T2G; + E T36, T2X; + { + E T7, T1D, Td, T1F; + T1 = cr[0]; + T3i = ci[0]; + { + E T3, T6, T4, T1C, T2, T5; + T3 = cr[WS(rs, 5)]; + T6 = ci[WS(rs, 5)]; + T2 = W[8]; + T4 = T2 * T3; + T1C = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T1D = FNMS(T5, T3, T1C); + } + { + E T9, Tc, Ta, T1E, T8, Tb; + T9 = cr[WS(rs, 10)]; + Tc = ci[WS(rs, 10)]; + T8 = W[18]; + Ta = T8 * T9; + T1E = T8 * Tc; + Tb = W[19]; + Td = FMA(Tb, Tc, Ta); + T1F = FNMS(Tb, T9, T1E); + } + T1G = T1D - T1F; + T3l = Td - T7; + Te = T7 + Td; + T1B = FNMS(KP500000000, Te, T1); + T3j = T1D + T1F; + T3k = FNMS(KP500000000, T3j, T3i); + } + { + E T1k, T2I, T1w, T28, T1q, T26; + { + E T1g, T1j, T1h, T2H, T1f, T1i; + T1g = cr[WS(rs, 9)]; + T1j = ci[WS(rs, 9)]; + T1f = W[16]; + T1h = T1f * T1g; + T2H = T1f * T1j; + T1i = W[17]; + T1k = FMA(T1i, T1j, T1h); + T2I = FNMS(T1i, T1g, T2H); + } + { + E T1s, T1v, T1t, T27, T1r, T1u; + T1s = cr[WS(rs, 4)]; + T1v = ci[WS(rs, 4)]; + T1r = W[6]; + T1t = T1r * T1s; + T27 = T1r * T1v; + T1u = W[7]; + T1w = FMA(T1u, T1v, T1t); + T28 = FNMS(T1u, T1s, T27); + } + { + E T1m, T1p, T1n, T25, T1l, T1o; + T1m = cr[WS(rs, 14)]; + T1p = ci[WS(rs, 14)]; + T1l = W[26]; + T1n = T1l * T1m; + T25 = T1l * T1p; + T1o = W[27]; + T1q = FMA(T1o, T1p, T1n); + T26 = FNMS(T1o, T1m, T25); + } + { + E T29, T1x, T24, T2L, T2J, T2K; + T29 = T26 - T28; + T1x = T1q + T1w; + T24 = FNMS(KP500000000, T1x, T1k); + T1y = T1k + T1x; + T2i = FMA(KP866025403, T29, T24); + T2a = FNMS(KP866025403, T29, T24); + T2L = T1q - T1w; + T2J = T26 + T28; + T2K = FNMS(KP500000000, T2J, T2I); + T2M = FNMS(KP866025403, T2L, T2K); + T37 = T2I + T2J; + T2Y = FMA(KP866025403, T2L, T2K); + } + } + { + E Tl, T2p, Tx, T1M, Tr, T1K; + { + E Th, Tk, Ti, T2o, Tg, Tj; + Th = cr[WS(rs, 3)]; + Tk = ci[WS(rs, 3)]; + Tg = W[4]; + Ti = Tg * Th; + T2o = Tg * Tk; + Tj = W[5]; + Tl = FMA(Tj, Tk, Ti); + T2p = FNMS(Tj, Th, T2o); + } + { + E Tt, Tw, Tu, T1L, Ts, Tv; + Tt = cr[WS(rs, 13)]; + Tw = ci[WS(rs, 13)]; + Ts = W[24]; + Tu = Ts * Tt; + T1L = Ts * Tw; + Tv = W[25]; + Tx = FMA(Tv, Tw, Tu); + T1M = FNMS(Tv, Tt, T1L); + } + { + E Tn, Tq, To, T1J, Tm, Tp; + Tn = cr[WS(rs, 8)]; + Tq = ci[WS(rs, 8)]; + Tm = W[14]; + To = Tm * Tn; + T1J = Tm * Tq; + Tp = W[15]; + Tr = FMA(Tp, Tq, To); + T1K = FNMS(Tp, Tn, T1J); + } + { + E T1N, Ty, T1I, T2s, T2q, T2r; + T1N = T1K - T1M; + Ty = Tr + Tx; + T1I = FNMS(KP500000000, Ty, Tl); + Tz = Tl + Ty; + T2e = FMA(KP866025403, T1N, T1I); + T1O = FNMS(KP866025403, T1N, T1I); + T2s = Tr - Tx; + T2q = T1K + T1M; + T2r = FNMS(KP500000000, T2q, T2p); + T2t = FNMS(KP866025403, T2s, T2r); + T39 = T2p + T2q; + T2U = FMA(KP866025403, T2s, T2r); + } + } + { + E TF, T2v, TR, T1T, TL, T1R; + { + E TB, TE, TC, T2u, TA, TD; + TB = cr[WS(rs, 12)]; + TE = ci[WS(rs, 12)]; + TA = W[22]; + TC = TA * TB; + T2u = TA * TE; + TD = W[23]; + TF = FMA(TD, TE, TC); + T2v = FNMS(TD, TB, T2u); + } + { + E TN, TQ, TO, T1S, TM, TP; + TN = cr[WS(rs, 7)]; + TQ = ci[WS(rs, 7)]; + TM = W[12]; + TO = TM * TN; + T1S = TM * TQ; + TP = W[13]; + TR = FMA(TP, TQ, TO); + T1T = FNMS(TP, TN, T1S); + } + { + E TH, TK, TI, T1Q, TG, TJ; + TH = cr[WS(rs, 2)]; + TK = ci[WS(rs, 2)]; + TG = W[2]; + TI = TG * TH; + T1Q = TG * TK; + TJ = W[3]; + TL = FMA(TJ, TK, TI); + T1R = FNMS(TJ, TH, T1Q); + } + { + E T1U, TS, T1P, T2y, T2w, T2x; + T1U = T1R - T1T; + TS = TL + TR; + T1P = FNMS(KP500000000, TS, TF); + TT = TF + TS; + T2f = FMA(KP866025403, T1U, T1P); + T1V = FNMS(KP866025403, T1U, T1P); + T2y = TL - TR; + T2w = T1R + T1T; + T2x = FNMS(KP500000000, T2w, T2v); + T2z = FNMS(KP866025403, T2y, T2x); + T3a = T2v + T2w; + T2V = FMA(KP866025403, T2y, T2x); + } + } + { + E T10, T2C, T1c, T21, T16, T1Z; + { + E TW, TZ, TX, T2B, TV, TY; + TW = cr[WS(rs, 6)]; + TZ = ci[WS(rs, 6)]; + TV = W[10]; + TX = TV * TW; + T2B = TV * TZ; + TY = W[11]; + T10 = FMA(TY, TZ, TX); + T2C = FNMS(TY, TW, T2B); + } + { + E T18, T1b, T19, T20, T17, T1a; + T18 = cr[WS(rs, 1)]; + T1b = ci[WS(rs, 1)]; + T17 = W[0]; + T19 = T17 * T18; + T20 = T17 * T1b; + T1a = W[1]; + T1c = FMA(T1a, T1b, T19); + T21 = FNMS(T1a, T18, T20); + } + { + E T12, T15, T13, T1Y, T11, T14; + T12 = cr[WS(rs, 11)]; + T15 = ci[WS(rs, 11)]; + T11 = W[20]; + T13 = T11 * T12; + T1Y = T11 * T15; + T14 = W[21]; + T16 = FMA(T14, T15, T13); + T1Z = FNMS(T14, T12, T1Y); + } + { + E T22, T1d, T1X, T2F, T2D, T2E; + T22 = T1Z - T21; + T1d = T16 + T1c; + T1X = FNMS(KP500000000, T1d, T10); + T1e = T10 + T1d; + T2h = FMA(KP866025403, T22, T1X); + T23 = FNMS(KP866025403, T22, T1X); + T2F = T16 - T1c; + T2D = T1Z + T21; + T2E = FNMS(KP500000000, T2D, T2C); + T2G = FNMS(KP866025403, T2F, T2E); + T36 = T2C + T2D; + T2X = FMA(KP866025403, T2F, T2E); + } + } + { + E T3c, T3e, Tf, T1A, T33, T34, T3d, T35; + { + E T38, T3b, TU, T1z; + T38 = T36 - T37; + T3b = T39 - T3a; + T3c = FNMS(KP618033988, T3b, T38); + T3e = FMA(KP618033988, T38, T3b); + Tf = T1 + Te; + TU = Tz + TT; + T1z = T1e + T1y; + T1A = TU + T1z; + T33 = FNMS(KP250000000, T1A, Tf); + T34 = TU - T1z; + } + cr[0] = Tf + T1A; + T3d = FMA(KP559016994, T34, T33); + ci[WS(rs, 5)] = FNMS(KP951056516, T3e, T3d); + cr[WS(rs, 6)] = FMA(KP951056516, T3e, T3d); + T35 = FNMS(KP559016994, T34, T33); + ci[WS(rs, 2)] = FNMS(KP951056516, T3c, T35); + cr[WS(rs, 3)] = FMA(KP951056516, T3c, T35); + } + { + E T30, T32, T1H, T2c, T2R, T2S, T31, T2T; + { + E T2W, T2Z, T1W, T2b; + T2W = T2U - T2V; + T2Z = T2X - T2Y; + T30 = FMA(KP618033988, T2Z, T2W); + T32 = FNMS(KP618033988, T2W, T2Z); + T1H = FNMS(KP866025403, T1G, T1B); + T1W = T1O + T1V; + T2b = T23 + T2a; + T2c = T1W + T2b; + T2R = FNMS(KP250000000, T2c, T1H); + T2S = T1W - T2b; + } + cr[WS(rs, 5)] = T1H + T2c; + T31 = FNMS(KP559016994, T2S, T2R); + cr[WS(rs, 2)] = FNMS(KP951056516, T32, T31); + ci[WS(rs, 6)] = FMA(KP951056516, T32, T31); + T2T = FMA(KP559016994, T2S, T2R); + ci[0] = FNMS(KP951056516, T30, T2T); + ci[WS(rs, 3)] = FMA(KP951056516, T30, T2T); + } + { + E T2O, T2Q, T2d, T2k, T2l, T2m, T2n, T2P; + { + E T2A, T2N, T2g, T2j; + T2A = T2t - T2z; + T2N = T2G - T2M; + T2O = FMA(KP618033988, T2N, T2A); + T2Q = FNMS(KP618033988, T2A, T2N); + T2d = FMA(KP866025403, T1G, T1B); + T2g = T2e + T2f; + T2j = T2h + T2i; + T2k = T2g + T2j; + T2l = FNMS(KP250000000, T2k, T2d); + T2m = T2g - T2j; + } + ci[WS(rs, 4)] = T2d + T2k; + T2n = FMA(KP559016994, T2m, T2l); + cr[WS(rs, 4)] = FNMS(KP951056516, T2O, T2n); + cr[WS(rs, 1)] = FMA(KP951056516, T2O, T2n); + T2P = FNMS(KP559016994, T2m, T2l); + cr[WS(rs, 7)] = FNMS(KP951056516, T2Q, T2P); + ci[WS(rs, 1)] = FMA(KP951056516, T2Q, T2P); + } + { + E T3s, T3u, T3m, T3h, T3n, T3o, T3t, T3p; + { + E T3q, T3r, T3f, T3g; + T3q = T2h - T2i; + T3r = T2e - T2f; + T3s = FNMS(KP618033988, T3r, T3q); + T3u = FMA(KP618033988, T3q, T3r); + T3m = FMA(KP866025403, T3l, T3k); + T3f = T2t + T2z; + T3g = T2G + T2M; + T3h = T3f + T3g; + T3n = FNMS(KP250000000, T3h, T3m); + T3o = T3f - T3g; + } + cr[WS(rs, 10)] = -(T3h + T3m); + T3t = FMA(KP559016994, T3o, T3n); + ci[WS(rs, 10)] = FMA(KP951056516, T3u, T3t); + ci[WS(rs, 13)] = FNMS(KP951056516, T3u, T3t); + T3p = FNMS(KP559016994, T3o, T3n); + cr[WS(rs, 13)] = FMS(KP951056516, T3s, T3p); + ci[WS(rs, 7)] = FMA(KP951056516, T3s, T3p); + } + { + E T3Q, T3S, T3H, T3K, T3L, T3M, T3R, T3N; + { + E T3O, T3P, T3I, T3J; + T3O = TT - Tz; + T3P = T1y - T1e; + T3Q = FMA(KP618033988, T3P, T3O); + T3S = FNMS(KP618033988, T3O, T3P); + T3H = T3j + T3i; + T3I = T39 + T3a; + T3J = T36 + T37; + T3K = T3I + T3J; + T3L = FNMS(KP250000000, T3K, T3H); + T3M = T3I - T3J; + } + ci[WS(rs, 14)] = T3K + T3H; + T3R = FNMS(KP559016994, T3M, T3L); + cr[WS(rs, 12)] = FMS(KP951056516, T3S, T3R); + ci[WS(rs, 11)] = FMA(KP951056516, T3S, T3R); + T3N = FMA(KP559016994, T3M, T3L); + cr[WS(rs, 9)] = FMS(KP951056516, T3Q, T3N); + ci[WS(rs, 8)] = FMA(KP951056516, T3Q, T3N); + } + { + E T3E, T3G, T3v, T3y, T3z, T3A, T3F, T3B; + { + E T3C, T3D, T3w, T3x; + T3C = T1O - T1V; + T3D = T23 - T2a; + T3E = FMA(KP618033988, T3D, T3C); + T3G = FNMS(KP618033988, T3C, T3D); + T3v = FNMS(KP866025403, T3l, T3k); + T3w = T2U + T2V; + T3x = T2X + T2Y; + T3y = T3w + T3x; + T3z = FNMS(KP250000000, T3y, T3v); + T3A = T3x - T3w; + } + ci[WS(rs, 9)] = T3y + T3v; + T3F = FMA(KP559016994, T3A, T3z); + cr[WS(rs, 8)] = FMS(KP951056516, T3G, T3F); + ci[WS(rs, 12)] = FMA(KP951056516, T3G, T3F); + T3B = FNMS(KP559016994, T3A, T3z); + cr[WS(rs, 11)] = FMS(KP951056516, T3E, T3B); + cr[WS(rs, 14)] = -(FMA(KP951056516, T3E, T3B)); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 15, "hf_15", twinstr, &GENUS, {72, 28, 112, 0} }; + +void X(codelet_hf_15) (planner *p) { + X(khc2hc_register) (p, hf_15, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 15 -dit -name hf_15 -include rdft/scalar/hf.h */ + +/* + * This function contains 184 FP additions, 112 FP multiplications, + * (or, 128 additions, 56 multiplications, 56 fused multiply/add), + * 65 stack variables, 6 constants, and 60 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_15(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 28); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 28, MAKE_VOLATILE_STRIDE(30, rs)) { + E T1q, T2Q, Td, T1n, T2T, T3l, T13, T1k, T1l, T2E, T2F, T3j, T1H, T1T, T2k; + E T2w, T2f, T2v, T1M, T1U, Tu, TL, TM, T2H, T2I, T3i, T1w, T1Q, T29, T2t; + E T24, T2s, T1B, T1R; + { + E T1, T2R, T6, T1o, Tb, T1p, Tc, T2S; + T1 = cr[0]; + T2R = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 5)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T1o = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 10)]; + Ta = ci[WS(rs, 10)]; + T7 = W[18]; + T9 = W[19]; + Tb = FMA(T7, T8, T9 * Ta); + T1p = FNMS(T9, T8, T7 * Ta); + } + T1q = KP866025403 * (T1o - T1p); + T2Q = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + Td = T1 + Tc; + T1n = FNMS(KP500000000, Tc, T1); + T2S = T1o + T1p; + T2T = FNMS(KP500000000, T2S, T2R); + T3l = T2S + T2R; + } + { + E TR, T2c, T18, T2h, TW, T1E, T11, T1F, T12, T2d, T1d, T1J, T1i, T1K, T1j; + E T2i; + { + E TO, TQ, TN, TP; + TO = cr[WS(rs, 6)]; + TQ = ci[WS(rs, 6)]; + TN = W[10]; + TP = W[11]; + TR = FMA(TN, TO, TP * TQ); + T2c = FNMS(TP, TO, TN * TQ); + } + { + E T15, T17, T14, T16; + T15 = cr[WS(rs, 9)]; + T17 = ci[WS(rs, 9)]; + T14 = W[16]; + T16 = W[17]; + T18 = FMA(T14, T15, T16 * T17); + T2h = FNMS(T16, T15, T14 * T17); + } + { + E TT, TV, TS, TU; + TT = cr[WS(rs, 11)]; + TV = ci[WS(rs, 11)]; + TS = W[20]; + TU = W[21]; + TW = FMA(TS, TT, TU * TV); + T1E = FNMS(TU, TT, TS * TV); + } + { + E TY, T10, TX, TZ; + TY = cr[WS(rs, 1)]; + T10 = ci[WS(rs, 1)]; + TX = W[0]; + TZ = W[1]; + T11 = FMA(TX, TY, TZ * T10); + T1F = FNMS(TZ, TY, TX * T10); + } + T12 = TW + T11; + T2d = T1E + T1F; + { + E T1a, T1c, T19, T1b; + T1a = cr[WS(rs, 14)]; + T1c = ci[WS(rs, 14)]; + T19 = W[26]; + T1b = W[27]; + T1d = FMA(T19, T1a, T1b * T1c); + T1J = FNMS(T1b, T1a, T19 * T1c); + } + { + E T1f, T1h, T1e, T1g; + T1f = cr[WS(rs, 4)]; + T1h = ci[WS(rs, 4)]; + T1e = W[6]; + T1g = W[7]; + T1i = FMA(T1e, T1f, T1g * T1h); + T1K = FNMS(T1g, T1f, T1e * T1h); + } + T1j = T1d + T1i; + T2i = T1J + T1K; + { + E T1D, T1G, T2g, T2j; + T13 = TR + T12; + T1k = T18 + T1j; + T1l = T13 + T1k; + T2E = T2c + T2d; + T2F = T2h + T2i; + T3j = T2E + T2F; + T1D = FNMS(KP500000000, T12, TR); + T1G = KP866025403 * (T1E - T1F); + T1H = T1D - T1G; + T1T = T1D + T1G; + T2g = KP866025403 * (T1d - T1i); + T2j = FNMS(KP500000000, T2i, T2h); + T2k = T2g - T2j; + T2w = T2g + T2j; + { + E T2b, T2e, T1I, T1L; + T2b = KP866025403 * (T11 - TW); + T2e = FNMS(KP500000000, T2d, T2c); + T2f = T2b + T2e; + T2v = T2e - T2b; + T1I = FNMS(KP500000000, T1j, T18); + T1L = KP866025403 * (T1J - T1K); + T1M = T1I - T1L; + T1U = T1I + T1L; + } + } + } + { + E Ti, T21, Tz, T26, Tn, T1t, Ts, T1u, Tt, T22, TE, T1y, TJ, T1z, TK; + E T27; + { + E Tf, Th, Te, Tg; + Tf = cr[WS(rs, 3)]; + Th = ci[WS(rs, 3)]; + Te = W[4]; + Tg = W[5]; + Ti = FMA(Te, Tf, Tg * Th); + T21 = FNMS(Tg, Tf, Te * Th); + } + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 12)]; + Ty = ci[WS(rs, 12)]; + Tv = W[22]; + Tx = W[23]; + Tz = FMA(Tv, Tw, Tx * Ty); + T26 = FNMS(Tx, Tw, Tv * Ty); + } + { + E Tk, Tm, Tj, Tl; + Tk = cr[WS(rs, 8)]; + Tm = ci[WS(rs, 8)]; + Tj = W[14]; + Tl = W[15]; + Tn = FMA(Tj, Tk, Tl * Tm); + T1t = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = cr[WS(rs, 13)]; + Tr = ci[WS(rs, 13)]; + To = W[24]; + Tq = W[25]; + Ts = FMA(To, Tp, Tq * Tr); + T1u = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn + Ts; + T22 = T1t + T1u; + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 2)]; + TD = ci[WS(rs, 2)]; + TA = W[2]; + TC = W[3]; + TE = FMA(TA, TB, TC * TD); + T1y = FNMS(TC, TB, TA * TD); + } + { + E TG, TI, TF, TH; + TG = cr[WS(rs, 7)]; + TI = ci[WS(rs, 7)]; + TF = W[12]; + TH = W[13]; + TJ = FMA(TF, TG, TH * TI); + T1z = FNMS(TH, TG, TF * TI); + } + TK = TE + TJ; + T27 = T1y + T1z; + { + E T1s, T1v, T25, T28; + Tu = Ti + Tt; + TL = Tz + TK; + TM = Tu + TL; + T2H = T21 + T22; + T2I = T26 + T27; + T3i = T2H + T2I; + T1s = FNMS(KP500000000, Tt, Ti); + T1v = KP866025403 * (T1t - T1u); + T1w = T1s - T1v; + T1Q = T1s + T1v; + T25 = KP866025403 * (TJ - TE); + T28 = FNMS(KP500000000, T27, T26); + T29 = T25 + T28; + T2t = T28 - T25; + { + E T20, T23, T1x, T1A; + T20 = KP866025403 * (Ts - Tn); + T23 = FNMS(KP500000000, T22, T21); + T24 = T20 + T23; + T2s = T23 - T20; + T1x = FNMS(KP500000000, TK, Tz); + T1A = KP866025403 * (T1y - T1z); + T1B = T1x - T1A; + T1R = T1x + T1A; + } + } + } + { + E T2C, T1m, T2B, T2K, T2M, T2G, T2J, T2L, T2D; + T2C = KP559016994 * (TM - T1l); + T1m = TM + T1l; + T2B = FNMS(KP250000000, T1m, Td); + T2G = T2E - T2F; + T2J = T2H - T2I; + T2K = FNMS(KP587785252, T2J, KP951056516 * T2G); + T2M = FMA(KP951056516, T2J, KP587785252 * T2G); + cr[0] = Td + T1m; + T2L = T2C + T2B; + ci[WS(rs, 5)] = T2L - T2M; + cr[WS(rs, 6)] = T2L + T2M; + T2D = T2B - T2C; + ci[WS(rs, 2)] = T2D - T2K; + cr[WS(rs, 3)] = T2D + T2K; + } + { + E T3k, T3m, T3n, T3h, T3p, T3f, T3g, T3q, T3o; + T3k = KP559016994 * (T3i - T3j); + T3m = T3i + T3j; + T3n = FNMS(KP250000000, T3m, T3l); + T3f = T1k - T13; + T3g = Tu - TL; + T3h = FNMS(KP951056516, T3g, KP587785252 * T3f); + T3p = FMA(KP587785252, T3g, KP951056516 * T3f); + ci[WS(rs, 14)] = T3m + T3l; + T3q = T3n - T3k; + cr[WS(rs, 12)] = T3p - T3q; + ci[WS(rs, 11)] = T3p + T3q; + T3o = T3k + T3n; + cr[WS(rs, 9)] = T3h - T3o; + ci[WS(rs, 8)] = T3h + T3o; + } + { + E T2y, T2A, T1r, T1O, T2p, T2q, T2z, T2r; + { + E T2u, T2x, T1C, T1N; + T2u = T2s - T2t; + T2x = T2v - T2w; + T2y = FMA(KP951056516, T2u, KP587785252 * T2x); + T2A = FNMS(KP587785252, T2u, KP951056516 * T2x); + T1r = T1n - T1q; + T1C = T1w + T1B; + T1N = T1H + T1M; + T1O = T1C + T1N; + T2p = KP559016994 * (T1C - T1N); + T2q = FNMS(KP250000000, T1O, T1r); + } + cr[WS(rs, 5)] = T1r + T1O; + T2z = T2q - T2p; + cr[WS(rs, 2)] = T2z - T2A; + ci[WS(rs, 6)] = T2z + T2A; + T2r = T2p + T2q; + ci[0] = T2r - T2y; + ci[WS(rs, 3)] = T2r + T2y; + } + { + E T35, T3d, T39, T3a, T38, T3b, T3e, T3c; + { + E T33, T34, T36, T37; + T33 = T1w - T1B; + T34 = T1H - T1M; + T35 = FMA(KP951056516, T33, KP587785252 * T34); + T3d = FNMS(KP587785252, T33, KP951056516 * T34); + T39 = T2T - T2Q; + T36 = T2v + T2w; + T37 = T2s + T2t; + T3a = T37 + T36; + T38 = KP559016994 * (T36 - T37); + T3b = FNMS(KP250000000, T3a, T39); + } + ci[WS(rs, 9)] = T3a + T39; + T3e = T38 + T3b; + cr[WS(rs, 8)] = T3d - T3e; + ci[WS(rs, 12)] = T3d + T3e; + T3c = T38 - T3b; + cr[WS(rs, 11)] = T35 + T3c; + cr[WS(rs, 14)] = T3c - T35; + } + { + E T2X, T31, T2U, T2P, T2Y, T2Z, T32, T30; + { + E T2V, T2W, T2N, T2O; + T2V = T1T - T1U; + T2W = T1Q - T1R; + T2X = FNMS(KP587785252, T2W, KP951056516 * T2V); + T31 = FMA(KP951056516, T2W, KP587785252 * T2V); + T2U = T2Q + T2T; + T2N = T2k - T2f; + T2O = T24 + T29; + T2P = T2N - T2O; + T2Y = FMA(KP250000000, T2P, T2U); + T2Z = KP559016994 * (T2O + T2N); + } + cr[WS(rs, 10)] = T2P - T2U; + T32 = T2Z + T2Y; + ci[WS(rs, 10)] = T31 + T32; + ci[WS(rs, 13)] = T32 - T31; + T30 = T2Y - T2Z; + cr[WS(rs, 13)] = T2X - T30; + ci[WS(rs, 7)] = T2X + T30; + } + { + E T2m, T2o, T1P, T1W, T1X, T1Y, T1Z, T2n; + { + E T2a, T2l, T1S, T1V; + T2a = T24 - T29; + T2l = T2f + T2k; + T2m = FMA(KP951056516, T2a, KP587785252 * T2l); + T2o = FNMS(KP587785252, T2a, KP951056516 * T2l); + T1P = T1n + T1q; + T1S = T1Q + T1R; + T1V = T1T + T1U; + T1W = T1S + T1V; + T1X = KP559016994 * (T1S - T1V); + T1Y = FNMS(KP250000000, T1W, T1P); + } + ci[WS(rs, 4)] = T1P + T1W; + T1Z = T1X + T1Y; + cr[WS(rs, 4)] = T1Z - T2m; + cr[WS(rs, 1)] = T1Z + T2m; + T2n = T1Y - T1X; + cr[WS(rs, 7)] = T2n - T2o; + ci[WS(rs, 1)] = T2n + T2o; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 15}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 15, "hf_15", twinstr, &GENUS, {128, 56, 56, 0} }; + +void X(codelet_hf_15) (planner *p) { + X(khc2hc_register) (p, hf_15, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_16.c new file mode 100644 index 000000000..49bd2cd6d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_16.c @@ -0,0 +1,796 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:30 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -dit -name hf_16 -include rdft/scalar/hf.h */ + +/* + * This function contains 174 FP additions, 100 FP multiplications, + * (or, 104 additions, 30 multiplications, 70 fused multiply/add), + * 60 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 30, MAKE_VOLATILE_STRIDE(32, rs)) { + E T8, T3A, T1I, T3o, T1s, T35, T2k, T2w, T1F, T36, T2p, T2r, Tl, T3z, T1N; + E T3k, Tz, T2W, T1P, T1U, T11, T30, T25, T2g, T1e, T31, T2a, T2h, TM, T2V; + E T1W, T21; + { + E T1, T3n, T3, T6, T4, T3l, T2, T7, T3m, T5; + T1 = cr[0]; + T3n = ci[0]; + T3 = cr[WS(rs, 8)]; + T6 = ci[WS(rs, 8)]; + T2 = W[14]; + T4 = T2 * T3; + T3l = T2 * T6; + T5 = W[15]; + T7 = FMA(T5, T6, T4); + T3m = FNMS(T5, T3, T3l); + T8 = T1 + T7; + T3A = T3n - T3m; + T1I = T1 - T7; + T3o = T3m + T3n; + } + { + E T1h, T1k, T1i, T2s, T1n, T1q, T1o, T2u, T1g, T1m; + T1h = cr[WS(rs, 15)]; + T1k = ci[WS(rs, 15)]; + T1g = W[28]; + T1i = T1g * T1h; + T2s = T1g * T1k; + T1n = cr[WS(rs, 7)]; + T1q = ci[WS(rs, 7)]; + T1m = W[12]; + T1o = T1m * T1n; + T2u = T1m * T1q; + { + E T1l, T2t, T1r, T2v, T1j, T1p; + T1j = W[29]; + T1l = FMA(T1j, T1k, T1i); + T2t = FNMS(T1j, T1h, T2s); + T1p = W[13]; + T1r = FMA(T1p, T1q, T1o); + T2v = FNMS(T1p, T1n, T2u); + T1s = T1l + T1r; + T35 = T2t + T2v; + T2k = T1l - T1r; + T2w = T2t - T2v; + } + } + { + E T1u, T1x, T1v, T2l, T1A, T1D, T1B, T2n, T1t, T1z; + T1u = cr[WS(rs, 3)]; + T1x = ci[WS(rs, 3)]; + T1t = W[4]; + T1v = T1t * T1u; + T2l = T1t * T1x; + T1A = cr[WS(rs, 11)]; + T1D = ci[WS(rs, 11)]; + T1z = W[20]; + T1B = T1z * T1A; + T2n = T1z * T1D; + { + E T1y, T2m, T1E, T2o, T1w, T1C; + T1w = W[5]; + T1y = FMA(T1w, T1x, T1v); + T2m = FNMS(T1w, T1u, T2l); + T1C = W[21]; + T1E = FMA(T1C, T1D, T1B); + T2o = FNMS(T1C, T1A, T2n); + T1F = T1y + T1E; + T36 = T2m + T2o; + T2p = T2m - T2o; + T2r = T1E - T1y; + } + } + { + E Ta, Td, Tb, T1J, Tg, Tj, Th, T1L, T9, Tf; + Ta = cr[WS(rs, 4)]; + Td = ci[WS(rs, 4)]; + T9 = W[6]; + Tb = T9 * Ta; + T1J = T9 * Td; + Tg = cr[WS(rs, 12)]; + Tj = ci[WS(rs, 12)]; + Tf = W[22]; + Th = Tf * Tg; + T1L = Tf * Tj; + { + E Te, T1K, Tk, T1M, Tc, Ti; + Tc = W[7]; + Te = FMA(Tc, Td, Tb); + T1K = FNMS(Tc, Ta, T1J); + Ti = W[23]; + Tk = FMA(Ti, Tj, Th); + T1M = FNMS(Ti, Tg, T1L); + Tl = Te + Tk; + T3z = Te - Tk; + T1N = T1K - T1M; + T3k = T1K + T1M; + } + } + { + E To, Tr, Tp, T1Q, Tu, Tx, Tv, T1S, Tn, Tt; + To = cr[WS(rs, 2)]; + Tr = ci[WS(rs, 2)]; + Tn = W[2]; + Tp = Tn * To; + T1Q = Tn * Tr; + Tu = cr[WS(rs, 10)]; + Tx = ci[WS(rs, 10)]; + Tt = W[18]; + Tv = Tt * Tu; + T1S = Tt * Tx; + { + E Ts, T1R, Ty, T1T, Tq, Tw; + Tq = W[3]; + Ts = FMA(Tq, Tr, Tp); + T1R = FNMS(Tq, To, T1Q); + Tw = W[19]; + Ty = FMA(Tw, Tx, Tv); + T1T = FNMS(Tw, Tu, T1S); + Tz = Ts + Ty; + T2W = T1R + T1T; + T1P = Ts - Ty; + T1U = T1R - T1T; + } + } + { + E TQ, TT, TR, T2c, TW, TZ, TX, T2e, TP, TV; + TQ = cr[WS(rs, 1)]; + TT = ci[WS(rs, 1)]; + TP = W[0]; + TR = TP * TQ; + T2c = TP * TT; + TW = cr[WS(rs, 9)]; + TZ = ci[WS(rs, 9)]; + TV = W[16]; + TX = TV * TW; + T2e = TV * TZ; + { + E TU, T2d, T10, T2f, TS, TY; + TS = W[1]; + TU = FMA(TS, TT, TR); + T2d = FNMS(TS, TQ, T2c); + TY = W[17]; + T10 = FMA(TY, TZ, TX); + T2f = FNMS(TY, TW, T2e); + T11 = TU + T10; + T30 = T2d + T2f; + T25 = TU - T10; + T2g = T2d - T2f; + } + } + { + E T13, T16, T14, T26, T19, T1c, T1a, T28, T12, T18; + T13 = cr[WS(rs, 5)]; + T16 = ci[WS(rs, 5)]; + T12 = W[8]; + T14 = T12 * T13; + T26 = T12 * T16; + T19 = cr[WS(rs, 13)]; + T1c = ci[WS(rs, 13)]; + T18 = W[24]; + T1a = T18 * T19; + T28 = T18 * T1c; + { + E T17, T27, T1d, T29, T15, T1b; + T15 = W[9]; + T17 = FMA(T15, T16, T14); + T27 = FNMS(T15, T13, T26); + T1b = W[25]; + T1d = FMA(T1b, T1c, T1a); + T29 = FNMS(T1b, T19, T28); + T1e = T17 + T1d; + T31 = T27 + T29; + T2a = T27 - T29; + T2h = T17 - T1d; + } + } + { + E TB, TE, TC, T1X, TH, TK, TI, T1Z, TA, TG; + TB = cr[WS(rs, 14)]; + TE = ci[WS(rs, 14)]; + TA = W[26]; + TC = TA * TB; + T1X = TA * TE; + TH = cr[WS(rs, 6)]; + TK = ci[WS(rs, 6)]; + TG = W[10]; + TI = TG * TH; + T1Z = TG * TK; + { + E TF, T1Y, TL, T20, TD, TJ; + TD = W[27]; + TF = FMA(TD, TE, TC); + T1Y = FNMS(TD, TB, T1X); + TJ = W[11]; + TL = FMA(TJ, TK, TI); + T20 = FNMS(TJ, TH, T1Z); + TM = TF + TL; + T2V = T1Y + T20; + T1W = TF - TL; + T21 = T1Y - T20; + } + } + { + E TO, T3e, T3q, T3s, T1H, T3r, T3h, T3i; + { + E Tm, TN, T3j, T3p; + Tm = T8 + Tl; + TN = Tz + TM; + TO = Tm + TN; + T3e = Tm - TN; + T3j = T2W + T2V; + T3p = T3k + T3o; + T3q = T3j + T3p; + T3s = T3p - T3j; + } + { + E T1f, T1G, T3f, T3g; + T1f = T11 + T1e; + T1G = T1s + T1F; + T1H = T1f + T1G; + T3r = T1G - T1f; + T3f = T35 + T36; + T3g = T30 + T31; + T3h = T3f - T3g; + T3i = T3g + T3f; + } + ci[WS(rs, 7)] = TO - T1H; + cr[WS(rs, 12)] = T3r - T3s; + ci[WS(rs, 11)] = T3r + T3s; + cr[0] = TO + T1H; + cr[WS(rs, 4)] = T3e - T3h; + cr[WS(rs, 8)] = T3i - T3q; + ci[WS(rs, 15)] = T3i + T3q; + ci[WS(rs, 3)] = T3e + T3h; + } + { + E T2Y, T3a, T3v, T3x, T33, T3b, T38, T3c; + { + E T2U, T2X, T3t, T3u; + T2U = T8 - Tl; + T2X = T2V - T2W; + T2Y = T2U - T2X; + T3a = T2U + T2X; + T3t = Tz - TM; + T3u = T3o - T3k; + T3v = T3t + T3u; + T3x = T3u - T3t; + } + { + E T2Z, T32, T34, T37; + T2Z = T11 - T1e; + T32 = T30 - T31; + T33 = T2Z + T32; + T3b = T2Z - T32; + T34 = T1s - T1F; + T37 = T35 - T36; + T38 = T34 - T37; + T3c = T34 + T37; + } + { + E T39, T3y, T3d, T3w; + T39 = T33 + T38; + ci[WS(rs, 5)] = FNMS(KP707106781, T39, T2Y); + cr[WS(rs, 2)] = FMA(KP707106781, T39, T2Y); + T3y = T3c - T3b; + cr[WS(rs, 10)] = FMS(KP707106781, T3y, T3x); + ci[WS(rs, 13)] = FMA(KP707106781, T3y, T3x); + T3d = T3b + T3c; + cr[WS(rs, 6)] = FNMS(KP707106781, T3d, T3a); + ci[WS(rs, 1)] = FMA(KP707106781, T3d, T3a); + T3w = T38 - T33; + cr[WS(rs, 14)] = FMS(KP707106781, T3w, T3v); + ci[WS(rs, 9)] = FMA(KP707106781, T3w, T3v); + } + } + { + E T1O, T3B, T3H, T2E, T23, T3I, T2O, T2R, T2H, T3C, T2j, T2B, T2L, T2S, T2y; + E T2C; + { + E T1V, T22, T2b, T2i; + T1O = T1I - T1N; + T3B = T3z + T3A; + T3H = T3A - T3z; + T2E = T1I + T1N; + T1V = T1P - T1U; + T22 = T1W + T21; + T23 = T1V + T22; + T3I = T22 - T1V; + { + E T2M, T2N, T2F, T2G; + T2M = T2k + T2p; + T2N = T2w + T2r; + T2O = FNMS(KP414213562, T2N, T2M); + T2R = FMA(KP414213562, T2M, T2N); + T2F = T1P + T1U; + T2G = T1W - T21; + T2H = T2F + T2G; + T3C = T2F - T2G; + } + T2b = T25 - T2a; + T2i = T2g + T2h; + T2j = FNMS(KP414213562, T2i, T2b); + T2B = FMA(KP414213562, T2b, T2i); + { + E T2J, T2K, T2q, T2x; + T2J = T25 + T2a; + T2K = T2g - T2h; + T2L = FMA(KP414213562, T2K, T2J); + T2S = FNMS(KP414213562, T2J, T2K); + T2q = T2k - T2p; + T2x = T2r - T2w; + T2y = FNMS(KP414213562, T2x, T2q); + T2C = FMA(KP414213562, T2q, T2x); + } + } + { + E T24, T2z, T3J, T3K; + T24 = FMA(KP707106781, T23, T1O); + T2z = T2j + T2y; + cr[WS(rs, 7)] = FNMS(KP923879532, T2z, T24); + ci[0] = FMA(KP923879532, T2z, T24); + T3J = FMA(KP707106781, T3I, T3H); + T3K = T2S + T2R; + cr[WS(rs, 9)] = FMS(KP923879532, T3K, T3J); + ci[WS(rs, 14)] = FMA(KP923879532, T3K, T3J); + } + { + E T3L, T3M, T2A, T2D; + T3L = FNMS(KP707106781, T3I, T3H); + T3M = T2O - T2L; + cr[WS(rs, 13)] = FMS(KP923879532, T3M, T3L); + ci[WS(rs, 10)] = FMA(KP923879532, T3M, T3L); + T2A = FNMS(KP707106781, T23, T1O); + T2D = T2B + T2C; + ci[WS(rs, 4)] = FNMS(KP923879532, T2D, T2A); + cr[WS(rs, 3)] = FMA(KP923879532, T2D, T2A); + } + { + E T2I, T2P, T3D, T3E; + T2I = FMA(KP707106781, T2H, T2E); + T2P = T2L + T2O; + ci[WS(rs, 6)] = FNMS(KP923879532, T2P, T2I); + cr[WS(rs, 1)] = FMA(KP923879532, T2P, T2I); + T3D = FMA(KP707106781, T3C, T3B); + T3E = T2C - T2B; + cr[WS(rs, 15)] = FMS(KP923879532, T3E, T3D); + ci[WS(rs, 8)] = FMA(KP923879532, T3E, T3D); + } + { + E T3F, T3G, T2Q, T2T; + T3F = FNMS(KP707106781, T3C, T3B); + T3G = T2y - T2j; + cr[WS(rs, 11)] = FMS(KP923879532, T3G, T3F); + ci[WS(rs, 12)] = FMA(KP923879532, T3G, T3F); + T2Q = FNMS(KP707106781, T2H, T2E); + T2T = T2R - T2S; + cr[WS(rs, 5)] = FNMS(KP923879532, T2T, T2Q); + ci[WS(rs, 2)] = FMA(KP923879532, T2T, T2Q); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hf_16", twinstr, &GENUS, {104, 30, 70, 0} }; + +void X(codelet_hf_16) (planner *p) { + X(khc2hc_register) (p, hf_16, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 16 -dit -name hf_16 -include rdft/scalar/hf.h */ + +/* + * This function contains 174 FP additions, 84 FP multiplications, + * (or, 136 additions, 46 multiplications, 38 fused multiply/add), + * 52 stack variables, 3 constants, and 64 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_16(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 30); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 30, MAKE_VOLATILE_STRIDE(32, rs)) { + E T7, T38, T1t, T2U, Ti, T37, T1w, T2R, Tu, T2t, T1C, T2c, TF, T2s, T1H; + E T2d, T1f, T1q, T2B, T2C, T2D, T2E, T1Z, T2k, T24, T2j, TS, T13, T2w, T2x; + E T2y, T2z, T1O, T2h, T1T, T2g; + { + E T1, T2T, T6, T2S; + T1 = cr[0]; + T2T = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 8)]; + T5 = ci[WS(rs, 8)]; + T2 = W[14]; + T4 = W[15]; + T6 = FMA(T2, T3, T4 * T5); + T2S = FNMS(T4, T3, T2 * T5); + } + T7 = T1 + T6; + T38 = T2T - T2S; + T1t = T1 - T6; + T2U = T2S + T2T; + } + { + E Tc, T1u, Th, T1v; + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 4)]; + Tb = ci[WS(rs, 4)]; + T8 = W[6]; + Ta = W[7]; + Tc = FMA(T8, T9, Ta * Tb); + T1u = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 12)]; + Tg = ci[WS(rs, 12)]; + Td = W[22]; + Tf = W[23]; + Th = FMA(Td, Te, Tf * Tg); + T1v = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc + Th; + T37 = Tc - Th; + T1w = T1u - T1v; + T2R = T1u + T1v; + } + { + E To, T1z, Tt, T1A, T1y, T1B; + { + E Tl, Tn, Tk, Tm; + Tl = cr[WS(rs, 2)]; + Tn = ci[WS(rs, 2)]; + Tk = W[2]; + Tm = W[3]; + To = FMA(Tk, Tl, Tm * Tn); + T1z = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = cr[WS(rs, 10)]; + Ts = ci[WS(rs, 10)]; + Tp = W[18]; + Tr = W[19]; + Tt = FMA(Tp, Tq, Tr * Ts); + T1A = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T2t = T1z + T1A; + T1y = To - Tt; + T1B = T1z - T1A; + T1C = T1y - T1B; + T2c = T1y + T1B; + } + { + E Tz, T1E, TE, T1F, T1D, T1G; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 14)]; + Ty = ci[WS(rs, 14)]; + Tv = W[26]; + Tx = W[27]; + Tz = FMA(Tv, Tw, Tx * Ty); + T1E = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 6)]; + TD = ci[WS(rs, 6)]; + TA = W[10]; + TC = W[11]; + TE = FMA(TA, TB, TC * TD); + T1F = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T2s = T1E + T1F; + T1D = Tz - TE; + T1G = T1E - T1F; + T1H = T1D + T1G; + T2d = T1D - T1G; + } + { + E T19, T1V, T1p, T22, T1e, T1W, T1k, T21; + { + E T16, T18, T15, T17; + T16 = cr[WS(rs, 15)]; + T18 = ci[WS(rs, 15)]; + T15 = W[28]; + T17 = W[29]; + T19 = FMA(T15, T16, T17 * T18); + T1V = FNMS(T17, T16, T15 * T18); + } + { + E T1m, T1o, T1l, T1n; + T1m = cr[WS(rs, 11)]; + T1o = ci[WS(rs, 11)]; + T1l = W[20]; + T1n = W[21]; + T1p = FMA(T1l, T1m, T1n * T1o); + T22 = FNMS(T1n, T1m, T1l * T1o); + } + { + E T1b, T1d, T1a, T1c; + T1b = cr[WS(rs, 7)]; + T1d = ci[WS(rs, 7)]; + T1a = W[12]; + T1c = W[13]; + T1e = FMA(T1a, T1b, T1c * T1d); + T1W = FNMS(T1c, T1b, T1a * T1d); + } + { + E T1h, T1j, T1g, T1i; + T1h = cr[WS(rs, 3)]; + T1j = ci[WS(rs, 3)]; + T1g = W[4]; + T1i = W[5]; + T1k = FMA(T1g, T1h, T1i * T1j); + T21 = FNMS(T1i, T1h, T1g * T1j); + } + T1f = T19 + T1e; + T1q = T1k + T1p; + T2B = T1f - T1q; + T2C = T1V + T1W; + T2D = T21 + T22; + T2E = T2C - T2D; + { + E T1X, T1Y, T20, T23; + T1X = T1V - T1W; + T1Y = T1k - T1p; + T1Z = T1X + T1Y; + T2k = T1X - T1Y; + T20 = T19 - T1e; + T23 = T21 - T22; + T24 = T20 - T23; + T2j = T20 + T23; + } + } + { + E TM, T1P, T12, T1M, TR, T1Q, TX, T1L; + { + E TJ, TL, TI, TK; + TJ = cr[WS(rs, 1)]; + TL = ci[WS(rs, 1)]; + TI = W[0]; + TK = W[1]; + TM = FMA(TI, TJ, TK * TL); + T1P = FNMS(TK, TJ, TI * TL); + } + { + E TZ, T11, TY, T10; + TZ = cr[WS(rs, 13)]; + T11 = ci[WS(rs, 13)]; + TY = W[24]; + T10 = W[25]; + T12 = FMA(TY, TZ, T10 * T11); + T1M = FNMS(T10, TZ, TY * T11); + } + { + E TO, TQ, TN, TP; + TO = cr[WS(rs, 9)]; + TQ = ci[WS(rs, 9)]; + TN = W[16]; + TP = W[17]; + TR = FMA(TN, TO, TP * TQ); + T1Q = FNMS(TP, TO, TN * TQ); + } + { + E TU, TW, TT, TV; + TU = cr[WS(rs, 5)]; + TW = ci[WS(rs, 5)]; + TT = W[8]; + TV = W[9]; + TX = FMA(TT, TU, TV * TW); + T1L = FNMS(TV, TU, TT * TW); + } + TS = TM + TR; + T13 = TX + T12; + T2w = TS - T13; + T2x = T1P + T1Q; + T2y = T1L + T1M; + T2z = T2x - T2y; + { + E T1K, T1N, T1R, T1S; + T1K = TM - TR; + T1N = T1L - T1M; + T1O = T1K - T1N; + T2h = T1K + T1N; + T1R = T1P - T1Q; + T1S = TX - T12; + T1T = T1R + T1S; + T2g = T1R - T1S; + } + } + { + E T1J, T27, T3a, T3c, T26, T3b, T2a, T35; + { + E T1x, T1I, T36, T39; + T1x = T1t - T1w; + T1I = KP707106781 * (T1C + T1H); + T1J = T1x + T1I; + T27 = T1x - T1I; + T36 = KP707106781 * (T2c - T2d); + T39 = T37 + T38; + T3a = T36 + T39; + T3c = T39 - T36; + } + { + E T1U, T25, T28, T29; + T1U = FNMS(KP382683432, T1T, KP923879532 * T1O); + T25 = FMA(KP382683432, T1Z, KP923879532 * T24); + T26 = T1U + T25; + T3b = T25 - T1U; + T28 = FMA(KP923879532, T1T, KP382683432 * T1O); + T29 = FNMS(KP923879532, T1Z, KP382683432 * T24); + T2a = T28 + T29; + T35 = T29 - T28; + } + cr[WS(rs, 7)] = T1J - T26; + cr[WS(rs, 11)] = T3b - T3c; + ci[WS(rs, 12)] = T3b + T3c; + ci[0] = T1J + T26; + ci[WS(rs, 4)] = T27 - T2a; + cr[WS(rs, 15)] = T35 - T3a; + ci[WS(rs, 8)] = T35 + T3a; + cr[WS(rs, 3)] = T27 + T2a; + } + { + E TH, T2L, T2W, T2Y, T1s, T2X, T2O, T2P; + { + E Tj, TG, T2Q, T2V; + Tj = T7 + Ti; + TG = Tu + TF; + TH = Tj + TG; + T2L = Tj - TG; + T2Q = T2t + T2s; + T2V = T2R + T2U; + T2W = T2Q + T2V; + T2Y = T2V - T2Q; + } + { + E T14, T1r, T2M, T2N; + T14 = TS + T13; + T1r = T1f + T1q; + T1s = T14 + T1r; + T2X = T1r - T14; + T2M = T2C + T2D; + T2N = T2x + T2y; + T2O = T2M - T2N; + T2P = T2N + T2M; + } + ci[WS(rs, 7)] = TH - T1s; + cr[WS(rs, 12)] = T2X - T2Y; + ci[WS(rs, 11)] = T2X + T2Y; + cr[0] = TH + T1s; + cr[WS(rs, 4)] = T2L - T2O; + cr[WS(rs, 8)] = T2P - T2W; + ci[WS(rs, 15)] = T2P + T2W; + ci[WS(rs, 3)] = T2L + T2O; + } + { + E T2f, T2n, T3g, T3i, T2m, T3h, T2q, T3d; + { + E T2b, T2e, T3e, T3f; + T2b = T1t + T1w; + T2e = KP707106781 * (T2c + T2d); + T2f = T2b + T2e; + T2n = T2b - T2e; + T3e = KP707106781 * (T1H - T1C); + T3f = T38 - T37; + T3g = T3e + T3f; + T3i = T3f - T3e; + } + { + E T2i, T2l, T2o, T2p; + T2i = FMA(KP382683432, T2g, KP923879532 * T2h); + T2l = FNMS(KP382683432, T2k, KP923879532 * T2j); + T2m = T2i + T2l; + T3h = T2l - T2i; + T2o = FNMS(KP923879532, T2g, KP382683432 * T2h); + T2p = FMA(KP923879532, T2k, KP382683432 * T2j); + T2q = T2o + T2p; + T3d = T2p - T2o; + } + ci[WS(rs, 6)] = T2f - T2m; + cr[WS(rs, 13)] = T3h - T3i; + ci[WS(rs, 10)] = T3h + T3i; + cr[WS(rs, 1)] = T2f + T2m; + cr[WS(rs, 5)] = T2n - T2q; + cr[WS(rs, 9)] = T3d - T3g; + ci[WS(rs, 14)] = T3d + T3g; + ci[WS(rs, 2)] = T2n + T2q; + } + { + E T2v, T2H, T32, T34, T2G, T2Z, T2K, T33; + { + E T2r, T2u, T30, T31; + T2r = T7 - Ti; + T2u = T2s - T2t; + T2v = T2r - T2u; + T2H = T2r + T2u; + T30 = Tu - TF; + T31 = T2U - T2R; + T32 = T30 + T31; + T34 = T31 - T30; + } + { + E T2A, T2F, T2I, T2J; + T2A = T2w + T2z; + T2F = T2B - T2E; + T2G = KP707106781 * (T2A + T2F); + T2Z = KP707106781 * (T2F - T2A); + T2I = T2w - T2z; + T2J = T2B + T2E; + T2K = KP707106781 * (T2I + T2J); + T33 = KP707106781 * (T2J - T2I); + } + ci[WS(rs, 5)] = T2v - T2G; + cr[WS(rs, 10)] = T33 - T34; + ci[WS(rs, 13)] = T33 + T34; + cr[WS(rs, 2)] = T2v + T2G; + cr[WS(rs, 6)] = T2H - T2K; + cr[WS(rs, 14)] = T2Z - T32; + ci[WS(rs, 9)] = T2Z + T32; + ci[WS(rs, 1)] = T2H + T2K; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 16}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 16, "hf_16", twinstr, &GENUS, {136, 46, 38, 0} }; + +void X(codelet_hf_16) (planner *p) { + X(khc2hc_register) (p, hf_16, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_2.c new file mode 100644 index 000000000..382d7d54e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_2.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -dit -name hf_2 -include rdft/scalar/hf.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 11 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_2(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs)) { + E T1, Ta, T3, T6, T4, T8, T2, T7, T9, T5; + T1 = cr[0]; + Ta = ci[0]; + T3 = cr[WS(rs, 1)]; + T6 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + T8 = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + T9 = FNMS(T5, T3, T8); + ci[0] = T1 - T7; + cr[0] = T1 + T7; + cr[WS(rs, 1)] = T9 - Ta; + ci[WS(rs, 1)] = T9 + Ta; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 2, "hf_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hf_2) (planner *p) { + X(khc2hc_register) (p, hf_2, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 2 -dit -name hf_2 -include rdft/scalar/hf.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 4 additions, 2 multiplications, 2 fused multiply/add), + * 9 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_2(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 2); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 2, MAKE_VOLATILE_STRIDE(4, rs)) { + E T1, T8, T6, T7; + T1 = cr[0]; + T8 = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 1)]; + T5 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + T7 = FNMS(T4, T3, T2 * T5); + } + ci[0] = T1 - T6; + cr[0] = T1 + T6; + cr[WS(rs, 1)] = T7 - T8; + ci[WS(rs, 1)] = T7 + T8; + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 2}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 2, "hf_2", twinstr, &GENUS, {4, 2, 2, 0} }; + +void X(codelet_hf_2) (planner *p) { + X(khc2hc_register) (p, hf_2, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_20.c new file mode 100644 index 000000000..a71bc6a0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_20.c @@ -0,0 +1,1050 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:33 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -dit -name hf_20 -include rdft/scalar/hf.h */ + +/* + * This function contains 246 FP additions, 148 FP multiplications, + * (or, 136 additions, 38 multiplications, 110 fused multiply/add), + * 61 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 38, MAKE_VOLATILE_STRIDE(40, rs)) { + E T8, T4N, T2i, T4q, Tl, T4O, T2n, T4r, TN, T2b, T43, T4b, T2v, T3v, T3a; + E T3F, T27, T2f, T3T, T4f, T2R, T3z, T3i, T3J, T1G, T2e, T3W, T4e, T2K, T3y; + E T3p, T3I, T1e, T2c, T40, T4c, T2C, T3w, T33, T3G; + { + E T1, T4p, T3, T6, T4, T4n, T2, T7, T4o, T5; + T1 = cr[0]; + T4p = ci[0]; + T3 = cr[WS(rs, 10)]; + T6 = ci[WS(rs, 10)]; + T2 = W[18]; + T4 = T2 * T3; + T4n = T2 * T6; + T5 = W[19]; + T7 = FMA(T5, T6, T4); + T4o = FNMS(T5, T3, T4n); + T8 = T1 + T7; + T4N = T4p - T4o; + T2i = T1 - T7; + T4q = T4o + T4p; + } + { + E Ta, Td, Tb, T2j, Tg, Tj, Th, T2l, T9, Tf; + Ta = cr[WS(rs, 5)]; + Td = ci[WS(rs, 5)]; + T9 = W[8]; + Tb = T9 * Ta; + T2j = T9 * Td; + Tg = cr[WS(rs, 15)]; + Tj = ci[WS(rs, 15)]; + Tf = W[28]; + Th = Tf * Tg; + T2l = Tf * Tj; + { + E Te, T2k, Tk, T2m, Tc, Ti; + Tc = W[9]; + Te = FMA(Tc, Td, Tb); + T2k = FNMS(Tc, Ta, T2j); + Ti = W[29]; + Tk = FMA(Ti, Tj, Th); + T2m = FNMS(Ti, Tg, T2l); + Tl = Te + Tk; + T4O = Te - Tk; + T2n = T2k - T2m; + T4r = T2k + T2m; + } + } + { + E Ts, T36, TL, T2t, Ty, T38, TF, T2r; + { + E To, Tr, Tp, T35, Tn, Tq; + To = cr[WS(rs, 4)]; + Tr = ci[WS(rs, 4)]; + Tn = W[6]; + Tp = Tn * To; + T35 = Tn * Tr; + Tq = W[7]; + Ts = FMA(Tq, Tr, Tp); + T36 = FNMS(Tq, To, T35); + } + { + E TH, TK, TI, T2s, TG, TJ; + TH = cr[WS(rs, 19)]; + TK = ci[WS(rs, 19)]; + TG = W[36]; + TI = TG * TH; + T2s = TG * TK; + TJ = W[37]; + TL = FMA(TJ, TK, TI); + T2t = FNMS(TJ, TH, T2s); + } + { + E Tu, Tx, Tv, T37, Tt, Tw; + Tu = cr[WS(rs, 14)]; + Tx = ci[WS(rs, 14)]; + Tt = W[26]; + Tv = Tt * Tu; + T37 = Tt * Tx; + Tw = W[27]; + Ty = FMA(Tw, Tx, Tv); + T38 = FNMS(Tw, Tu, T37); + } + { + E TB, TE, TC, T2q, TA, TD; + TB = cr[WS(rs, 9)]; + TE = ci[WS(rs, 9)]; + TA = W[16]; + TC = TA * TB; + T2q = TA * TE; + TD = W[17]; + TF = FMA(TD, TE, TC); + T2r = FNMS(TD, TB, T2q); + } + { + E Tz, TM, T41, T42; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz - TM; + T2b = Tz + TM; + T41 = T2r + T2t; + T42 = T36 + T38; + T43 = T41 - T42; + T4b = T42 + T41; + } + { + E T2p, T2u, T34, T39; + T2p = Ts - Ty; + T2u = T2r - T2t; + T2v = T2p - T2u; + T3v = T2p + T2u; + T34 = TL - TF; + T39 = T36 - T38; + T3a = T34 - T39; + T3F = T39 + T34; + } + } + { + E T1M, T3e, T25, T2P, T1S, T3g, T1Z, T2N; + { + E T1I, T1L, T1J, T3d, T1H, T1K; + T1I = cr[WS(rs, 12)]; + T1L = ci[WS(rs, 12)]; + T1H = W[22]; + T1J = T1H * T1I; + T3d = T1H * T1L; + T1K = W[23]; + T1M = FMA(T1K, T1L, T1J); + T3e = FNMS(T1K, T1I, T3d); + } + { + E T21, T24, T22, T2O, T20, T23; + T21 = cr[WS(rs, 7)]; + T24 = ci[WS(rs, 7)]; + T20 = W[12]; + T22 = T20 * T21; + T2O = T20 * T24; + T23 = W[13]; + T25 = FMA(T23, T24, T22); + T2P = FNMS(T23, T21, T2O); + } + { + E T1O, T1R, T1P, T3f, T1N, T1Q; + T1O = cr[WS(rs, 2)]; + T1R = ci[WS(rs, 2)]; + T1N = W[2]; + T1P = T1N * T1O; + T3f = T1N * T1R; + T1Q = W[3]; + T1S = FMA(T1Q, T1R, T1P); + T3g = FNMS(T1Q, T1O, T3f); + } + { + E T1V, T1Y, T1W, T2M, T1U, T1X; + T1V = cr[WS(rs, 17)]; + T1Y = ci[WS(rs, 17)]; + T1U = W[32]; + T1W = T1U * T1V; + T2M = T1U * T1Y; + T1X = W[33]; + T1Z = FMA(T1X, T1Y, T1W); + T2N = FNMS(T1X, T1V, T2M); + } + { + E T1T, T26, T3R, T3S; + T1T = T1M + T1S; + T26 = T1Z + T25; + T27 = T1T - T26; + T2f = T1T + T26; + T3R = T2N + T2P; + T3S = T3e + T3g; + T3T = T3R - T3S; + T4f = T3S + T3R; + } + { + E T2L, T2Q, T3c, T3h; + T2L = T1M - T1S; + T2Q = T2N - T2P; + T2R = T2L - T2Q; + T3z = T2L + T2Q; + T3c = T25 - T1Z; + T3h = T3e - T3g; + T3i = T3c - T3h; + T3J = T3h + T3c; + } + } + { + E T1l, T3l, T1E, T2I, T1r, T3n, T1y, T2G; + { + E T1h, T1k, T1i, T3k, T1g, T1j; + T1h = cr[WS(rs, 8)]; + T1k = ci[WS(rs, 8)]; + T1g = W[14]; + T1i = T1g * T1h; + T3k = T1g * T1k; + T1j = W[15]; + T1l = FMA(T1j, T1k, T1i); + T3l = FNMS(T1j, T1h, T3k); + } + { + E T1A, T1D, T1B, T2H, T1z, T1C; + T1A = cr[WS(rs, 3)]; + T1D = ci[WS(rs, 3)]; + T1z = W[4]; + T1B = T1z * T1A; + T2H = T1z * T1D; + T1C = W[5]; + T1E = FMA(T1C, T1D, T1B); + T2I = FNMS(T1C, T1A, T2H); + } + { + E T1n, T1q, T1o, T3m, T1m, T1p; + T1n = cr[WS(rs, 18)]; + T1q = ci[WS(rs, 18)]; + T1m = W[34]; + T1o = T1m * T1n; + T3m = T1m * T1q; + T1p = W[35]; + T1r = FMA(T1p, T1q, T1o); + T3n = FNMS(T1p, T1n, T3m); + } + { + E T1u, T1x, T1v, T2F, T1t, T1w; + T1u = cr[WS(rs, 13)]; + T1x = ci[WS(rs, 13)]; + T1t = W[24]; + T1v = T1t * T1u; + T2F = T1t * T1x; + T1w = W[25]; + T1y = FMA(T1w, T1x, T1v); + T2G = FNMS(T1w, T1u, T2F); + } + { + E T1s, T1F, T3U, T3V; + T1s = T1l + T1r; + T1F = T1y + T1E; + T1G = T1s - T1F; + T2e = T1s + T1F; + T3U = T2G + T2I; + T3V = T3l + T3n; + T3W = T3U - T3V; + T4e = T3V + T3U; + } + { + E T2E, T2J, T3j, T3o; + T2E = T1l - T1r; + T2J = T2G - T2I; + T2K = T2E - T2J; + T3y = T2E + T2J; + T3j = T1E - T1y; + T3o = T3l - T3n; + T3p = T3j - T3o; + T3I = T3o + T3j; + } + } + { + E TT, T2Z, T1c, T2A, TZ, T31, T16, T2y; + { + E TP, TS, TQ, T2Y, TO, TR; + TP = cr[WS(rs, 16)]; + TS = ci[WS(rs, 16)]; + TO = W[30]; + TQ = TO * TP; + T2Y = TO * TS; + TR = W[31]; + TT = FMA(TR, TS, TQ); + T2Z = FNMS(TR, TP, T2Y); + } + { + E T18, T1b, T19, T2z, T17, T1a; + T18 = cr[WS(rs, 11)]; + T1b = ci[WS(rs, 11)]; + T17 = W[20]; + T19 = T17 * T18; + T2z = T17 * T1b; + T1a = W[21]; + T1c = FMA(T1a, T1b, T19); + T2A = FNMS(T1a, T18, T2z); + } + { + E TV, TY, TW, T30, TU, TX; + TV = cr[WS(rs, 6)]; + TY = ci[WS(rs, 6)]; + TU = W[10]; + TW = TU * TV; + T30 = TU * TY; + TX = W[11]; + TZ = FMA(TX, TY, TW); + T31 = FNMS(TX, TV, T30); + } + { + E T12, T15, T13, T2x, T11, T14; + T12 = cr[WS(rs, 1)]; + T15 = ci[WS(rs, 1)]; + T11 = W[0]; + T13 = T11 * T12; + T2x = T11 * T15; + T14 = W[1]; + T16 = FMA(T14, T15, T13); + T2y = FNMS(T14, T12, T2x); + } + { + E T10, T1d, T3Y, T3Z; + T10 = TT + TZ; + T1d = T16 + T1c; + T1e = T10 - T1d; + T2c = T10 + T1d; + T3Y = T2y + T2A; + T3Z = T2Z + T31; + T40 = T3Y - T3Z; + T4c = T3Z + T3Y; + } + { + E T2w, T2B, T2X, T32; + T2w = TT - TZ; + T2B = T2y - T2A; + T2C = T2w - T2B; + T3w = T2w + T2B; + T2X = T1c - T16; + T32 = T2Z - T31; + T33 = T2X - T32; + T3G = T32 + T2X; + } + } + { + E T45, T47, Tm, T29, T3O, T3P, T46, T3Q; + { + E T3X, T44, T1f, T28; + T3X = T3T - T3W; + T44 = T40 - T43; + T45 = FNMS(KP618033988, T44, T3X); + T47 = FMA(KP618033988, T3X, T44); + Tm = T8 - Tl; + T1f = TN + T1e; + T28 = T1G + T27; + T29 = T1f + T28; + T3O = FNMS(KP250000000, T29, Tm); + T3P = T1f - T28; + } + ci[WS(rs, 9)] = Tm + T29; + T46 = FMA(KP559016994, T3P, T3O); + ci[WS(rs, 5)] = FNMS(KP951056516, T47, T46); + cr[WS(rs, 6)] = FMA(KP951056516, T47, T46); + T3Q = FNMS(KP559016994, T3P, T3O); + cr[WS(rs, 2)] = FNMS(KP951056516, T45, T3Q); + ci[WS(rs, 1)] = FMA(KP951056516, T45, T3Q); + } + { + E T3L, T3N, T3u, T3B, T3C, T3D, T3M, T3E; + { + E T3H, T3K, T3x, T3A; + T3H = T3F - T3G; + T3K = T3I - T3J; + T3L = FMA(KP618033988, T3K, T3H); + T3N = FNMS(KP618033988, T3H, T3K); + T3u = T2i + T2n; + T3x = T3v + T3w; + T3A = T3y + T3z; + T3B = T3x + T3A; + T3C = FNMS(KP250000000, T3B, T3u); + T3D = T3x - T3A; + } + cr[WS(rs, 5)] = T3u + T3B; + T3M = FNMS(KP559016994, T3D, T3C); + ci[WS(rs, 2)] = FNMS(KP951056516, T3N, T3M); + ci[WS(rs, 6)] = FMA(KP951056516, T3N, T3M); + T3E = FMA(KP559016994, T3D, T3C); + cr[WS(rs, 1)] = FMA(KP951056516, T3L, T3E); + cr[WS(rs, 9)] = FNMS(KP951056516, T3L, T3E); + } + { + E T4h, T4j, T2a, T2h, T48, T49, T4i, T4a; + { + E T4d, T4g, T2d, T2g; + T4d = T4b - T4c; + T4g = T4e - T4f; + T4h = FMA(KP618033988, T4g, T4d); + T4j = FNMS(KP618033988, T4d, T4g); + T2a = T8 + Tl; + T2d = T2b + T2c; + T2g = T2e + T2f; + T2h = T2d + T2g; + T48 = FNMS(KP250000000, T2h, T2a); + T49 = T2d - T2g; + } + cr[0] = T2a + T2h; + T4i = FNMS(KP559016994, T49, T48); + ci[WS(rs, 7)] = FNMS(KP951056516, T4j, T4i); + cr[WS(rs, 8)] = FMA(KP951056516, T4j, T4i); + T4a = FMA(KP559016994, T49, T48); + cr[WS(rs, 4)] = FNMS(KP951056516, T4h, T4a); + ci[WS(rs, 3)] = FMA(KP951056516, T4h, T4a); + } + { + E T3r, T3t, T2o, T2T, T2U, T2V, T3s, T2W; + { + E T3b, T3q, T2D, T2S; + T3b = T33 - T3a; + T3q = T3i - T3p; + T3r = FMA(KP618033988, T3q, T3b); + T3t = FNMS(KP618033988, T3b, T3q); + T2o = T2i - T2n; + T2D = T2v + T2C; + T2S = T2K + T2R; + T2T = T2D + T2S; + T2U = FNMS(KP250000000, T2T, T2o); + T2V = T2D - T2S; + } + ci[WS(rs, 4)] = T2o + T2T; + T3s = FNMS(KP559016994, T2V, T2U); + cr[WS(rs, 3)] = FMA(KP951056516, T3t, T3s); + cr[WS(rs, 7)] = FNMS(KP951056516, T3t, T3s); + T2W = FMA(KP559016994, T2V, T2U); + ci[0] = FNMS(KP951056516, T3r, T2W); + ci[WS(rs, 8)] = FMA(KP951056516, T3r, T2W); + } + { + E T4y, T4A, T4s, T4m, T4t, T4u, T4z, T4v; + { + E T4w, T4x, T4k, T4l; + T4w = T1e - TN; + T4x = T1G - T27; + T4y = FNMS(KP618033988, T4x, T4w); + T4A = FMA(KP618033988, T4w, T4x); + T4s = T4q - T4r; + T4k = T43 + T40; + T4l = T3W + T3T; + T4m = T4k + T4l; + T4t = FMA(KP250000000, T4m, T4s); + T4u = T4l - T4k; + } + cr[WS(rs, 10)] = T4m - T4s; + T4z = FNMS(KP559016994, T4u, T4t); + cr[WS(rs, 18)] = FMS(KP951056516, T4A, T4z); + ci[WS(rs, 17)] = FMA(KP951056516, T4A, T4z); + T4v = FMA(KP559016994, T4u, T4t); + cr[WS(rs, 14)] = FMS(KP951056516, T4y, T4v); + ci[WS(rs, 13)] = FMA(KP951056516, T4y, T4v); + } + { + E T4Y, T50, T4P, T4S, T4T, T4U, T4Z, T4V; + { + E T4W, T4X, T4Q, T4R; + T4W = T3y - T3z; + T4X = T3v - T3w; + T4Y = FNMS(KP618033988, T4X, T4W); + T50 = FMA(KP618033988, T4W, T4X); + T4P = T4N - T4O; + T4Q = T3F + T3G; + T4R = T3I + T3J; + T4S = T4Q + T4R; + T4T = FNMS(KP250000000, T4S, T4P); + T4U = T4Q - T4R; + } + ci[WS(rs, 14)] = T4S + T4P; + T4Z = FMA(KP559016994, T4U, T4T); + ci[WS(rs, 10)] = FMA(KP951056516, T50, T4Z); + ci[WS(rs, 18)] = FNMS(KP951056516, T50, T4Z); + T4V = FNMS(KP559016994, T4U, T4T); + cr[WS(rs, 13)] = FMS(KP951056516, T4Y, T4V); + cr[WS(rs, 17)] = -(FMA(KP951056516, T4Y, T4V)); + } + { + E T4K, T4M, T4B, T4E, T4F, T4G, T4L, T4H; + { + E T4I, T4J, T4C, T4D; + T4I = T2f - T2e; + T4J = T2b - T2c; + T4K = FMA(KP618033988, T4J, T4I); + T4M = FNMS(KP618033988, T4I, T4J); + T4B = T4r + T4q; + T4C = T4b + T4c; + T4D = T4e + T4f; + T4E = T4C + T4D; + T4F = FNMS(KP250000000, T4E, T4B); + T4G = T4C - T4D; + } + ci[WS(rs, 19)] = T4E + T4B; + T4L = FMA(KP559016994, T4G, T4F); + cr[WS(rs, 16)] = FMS(KP951056516, T4M, T4L); + ci[WS(rs, 15)] = FMA(KP951056516, T4M, T4L); + T4H = FNMS(KP559016994, T4G, T4F); + cr[WS(rs, 12)] = FMS(KP951056516, T4K, T4H); + ci[WS(rs, 11)] = FMA(KP951056516, T4K, T4H); + } + { + E T5a, T5c, T54, T53, T55, T56, T5b, T57; + { + E T58, T59, T51, T52; + T58 = T2v - T2C; + T59 = T2K - T2R; + T5a = FMA(KP618033988, T59, T58); + T5c = FNMS(KP618033988, T58, T59); + T54 = T4O + T4N; + T51 = T3a + T33; + T52 = T3p + T3i; + T53 = T51 + T52; + T55 = FMA(KP250000000, T53, T54); + T56 = T51 - T52; + } + cr[WS(rs, 15)] = T53 - T54; + T5b = FMA(KP559016994, T56, T55); + ci[WS(rs, 12)] = FMA(KP951056516, T5c, T5b); + ci[WS(rs, 16)] = FNMS(KP951056516, T5c, T5b); + T57 = FNMS(KP559016994, T56, T55); + cr[WS(rs, 11)] = FMS(KP951056516, T5a, T57); + cr[WS(rs, 19)] = -(FMA(KP951056516, T5a, T57)); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hf_20", twinstr, &GENUS, {136, 38, 110, 0} }; + +void X(codelet_hf_20) (planner *p) { + X(khc2hc_register) (p, hf_20, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 20 -dit -name hf_20 -include rdft/scalar/hf.h */ + +/* + * This function contains 246 FP additions, 124 FP multiplications, + * (or, 184 additions, 62 multiplications, 62 fused multiply/add), + * 85 stack variables, 4 constants, and 80 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_20(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 38); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 38, MAKE_VOLATILE_STRIDE(40, rs)) { + E Tj, T1R, T4j, T4s, T2q, T37, T3Q, T42, T1r, T1O, T1P, T3i, T3l, T3J, T3D; + E T3E, T44, T1V, T1W, T1X, T2e, T2j, T2k, T2W, T2X, T4f, T33, T34, T35, T2J; + E T2O, T4q, TG, T13, T14, T3p, T3s, T3K, T3A, T3B, T43, T1S, T1T, T1U, T23; + E T28, T29, T2T, T2U, T4e, T30, T31, T32, T2y, T2D, T4p; + { + E T1, T3N, T6, T3M, Tc, T2n, Th, T2o; + T1 = cr[0]; + T3N = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 10)]; + T5 = ci[WS(rs, 10)]; + T2 = W[18]; + T4 = W[19]; + T6 = FMA(T2, T3, T4 * T5); + T3M = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 5)]; + Tb = ci[WS(rs, 5)]; + T8 = W[8]; + Ta = W[9]; + Tc = FMA(T8, T9, Ta * Tb); + T2n = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 15)]; + Tg = ci[WS(rs, 15)]; + Td = W[28]; + Tf = W[29]; + Th = FMA(Td, Te, Tf * Tg); + T2o = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, T4h, T4i; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 - Ti; + T1R = T7 + Ti; + T4h = T3N - T3M; + T4i = Tc - Th; + T4j = T4h - T4i; + T4s = T4i + T4h; + } + { + E T2m, T2p, T3O, T3P; + T2m = T1 - T6; + T2p = T2n - T2o; + T2q = T2m - T2p; + T37 = T2m + T2p; + T3O = T3M + T3N; + T3P = T2n + T2o; + T3Q = T3O - T3P; + T42 = T3P + T3O; + } + } + { + E T1f, T3g, T2a, T2H, T1N, T3j, T2i, T2N, T1q, T3h, T2d, T2I, T1C, T3k, T2f; + E T2M; + { + E T19, T2F, T1e, T2G; + { + E T16, T18, T15, T17; + T16 = cr[WS(rs, 8)]; + T18 = ci[WS(rs, 8)]; + T15 = W[14]; + T17 = W[15]; + T19 = FMA(T15, T16, T17 * T18); + T2F = FNMS(T17, T16, T15 * T18); + } + { + E T1b, T1d, T1a, T1c; + T1b = cr[WS(rs, 18)]; + T1d = ci[WS(rs, 18)]; + T1a = W[34]; + T1c = W[35]; + T1e = FMA(T1a, T1b, T1c * T1d); + T2G = FNMS(T1c, T1b, T1a * T1d); + } + T1f = T19 + T1e; + T3g = T2F + T2G; + T2a = T19 - T1e; + T2H = T2F - T2G; + } + { + E T1H, T2g, T1M, T2h; + { + E T1E, T1G, T1D, T1F; + T1E = cr[WS(rs, 17)]; + T1G = ci[WS(rs, 17)]; + T1D = W[32]; + T1F = W[33]; + T1H = FMA(T1D, T1E, T1F * T1G); + T2g = FNMS(T1F, T1E, T1D * T1G); + } + { + E T1J, T1L, T1I, T1K; + T1J = cr[WS(rs, 7)]; + T1L = ci[WS(rs, 7)]; + T1I = W[12]; + T1K = W[13]; + T1M = FMA(T1I, T1J, T1K * T1L); + T2h = FNMS(T1K, T1J, T1I * T1L); + } + T1N = T1H + T1M; + T3j = T2g + T2h; + T2i = T2g - T2h; + T2N = T1H - T1M; + } + { + E T1k, T2b, T1p, T2c; + { + E T1h, T1j, T1g, T1i; + T1h = cr[WS(rs, 13)]; + T1j = ci[WS(rs, 13)]; + T1g = W[24]; + T1i = W[25]; + T1k = FMA(T1g, T1h, T1i * T1j); + T2b = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1m, T1o, T1l, T1n; + T1m = cr[WS(rs, 3)]; + T1o = ci[WS(rs, 3)]; + T1l = W[4]; + T1n = W[5]; + T1p = FMA(T1l, T1m, T1n * T1o); + T2c = FNMS(T1n, T1m, T1l * T1o); + } + T1q = T1k + T1p; + T3h = T2b + T2c; + T2d = T2b - T2c; + T2I = T1k - T1p; + } + { + E T1w, T2K, T1B, T2L; + { + E T1t, T1v, T1s, T1u; + T1t = cr[WS(rs, 12)]; + T1v = ci[WS(rs, 12)]; + T1s = W[22]; + T1u = W[23]; + T1w = FMA(T1s, T1t, T1u * T1v); + T2K = FNMS(T1u, T1t, T1s * T1v); + } + { + E T1y, T1A, T1x, T1z; + T1y = cr[WS(rs, 2)]; + T1A = ci[WS(rs, 2)]; + T1x = W[2]; + T1z = W[3]; + T1B = FMA(T1x, T1y, T1z * T1A); + T2L = FNMS(T1z, T1y, T1x * T1A); + } + T1C = T1w + T1B; + T3k = T2K + T2L; + T2f = T1w - T1B; + T2M = T2K - T2L; + } + T1r = T1f - T1q; + T1O = T1C - T1N; + T1P = T1r + T1O; + T3i = T3g - T3h; + T3l = T3j - T3k; + T3J = T3l - T3i; + T3D = T3g + T3h; + T3E = T3k + T3j; + T44 = T3D + T3E; + T1V = T1f + T1q; + T1W = T1C + T1N; + T1X = T1V + T1W; + T2e = T2a - T2d; + T2j = T2f - T2i; + T2k = T2e + T2j; + T2W = T2H - T2I; + T2X = T2M - T2N; + T4f = T2W + T2X; + T33 = T2a + T2d; + T34 = T2f + T2i; + T35 = T33 + T34; + T2J = T2H + T2I; + T2O = T2M + T2N; + T4q = T2J + T2O; + } + { + E Tu, T3n, T1Z, T2w, T12, T3r, T27, T2z, TF, T3o, T22, T2x, TR, T3q, T24; + E T2C; + { + E To, T2u, Tt, T2v; + { + E Tl, Tn, Tk, Tm; + Tl = cr[WS(rs, 4)]; + Tn = ci[WS(rs, 4)]; + Tk = W[6]; + Tm = W[7]; + To = FMA(Tk, Tl, Tm * Tn); + T2u = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = cr[WS(rs, 14)]; + Ts = ci[WS(rs, 14)]; + Tp = W[26]; + Tr = W[27]; + Tt = FMA(Tp, Tq, Tr * Ts); + T2v = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T3n = T2u + T2v; + T1Z = To - Tt; + T2w = T2u - T2v; + } + { + E TW, T25, T11, T26; + { + E TT, TV, TS, TU; + TT = cr[WS(rs, 1)]; + TV = ci[WS(rs, 1)]; + TS = W[0]; + TU = W[1]; + TW = FMA(TS, TT, TU * TV); + T25 = FNMS(TU, TT, TS * TV); + } + { + E TY, T10, TX, TZ; + TY = cr[WS(rs, 11)]; + T10 = ci[WS(rs, 11)]; + TX = W[20]; + TZ = W[21]; + T11 = FMA(TX, TY, TZ * T10); + T26 = FNMS(TZ, TY, TX * T10); + } + T12 = TW + T11; + T3r = T25 + T26; + T27 = T25 - T26; + T2z = T11 - TW; + } + { + E Tz, T20, TE, T21; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 9)]; + Ty = ci[WS(rs, 9)]; + Tv = W[16]; + Tx = W[17]; + Tz = FMA(Tv, Tw, Tx * Ty); + T20 = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 19)]; + TD = ci[WS(rs, 19)]; + TA = W[36]; + TC = W[37]; + TE = FMA(TA, TB, TC * TD); + T21 = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T3o = T20 + T21; + T22 = T20 - T21; + T2x = Tz - TE; + } + { + E TL, T2A, TQ, T2B; + { + E TI, TK, TH, TJ; + TI = cr[WS(rs, 16)]; + TK = ci[WS(rs, 16)]; + TH = W[30]; + TJ = W[31]; + TL = FMA(TH, TI, TJ * TK); + T2A = FNMS(TJ, TI, TH * TK); + } + { + E TN, TP, TM, TO; + TN = cr[WS(rs, 6)]; + TP = ci[WS(rs, 6)]; + TM = W[10]; + TO = W[11]; + TQ = FMA(TM, TN, TO * TP); + T2B = FNMS(TO, TN, TM * TP); + } + TR = TL + TQ; + T3q = T2A + T2B; + T24 = TL - TQ; + T2C = T2A - T2B; + } + TG = Tu - TF; + T13 = TR - T12; + T14 = TG + T13; + T3p = T3n - T3o; + T3s = T3q - T3r; + T3K = T3p + T3s; + T3A = T3n + T3o; + T3B = T3q + T3r; + T43 = T3A + T3B; + T1S = Tu + TF; + T1T = TR + T12; + T1U = T1S + T1T; + T23 = T1Z - T22; + T28 = T24 - T27; + T29 = T23 + T28; + T2T = T2w - T2x; + T2U = T2C + T2z; + T4e = T2T + T2U; + T30 = T1Z + T22; + T31 = T24 + T27; + T32 = T30 + T31; + T2y = T2w + T2x; + T2D = T2z - T2C; + T4p = T2D - T2y; + } + { + E T3e, T1Q, T3d, T3u, T3w, T3m, T3t, T3v, T3f; + T3e = KP559016994 * (T14 - T1P); + T1Q = T14 + T1P; + T3d = FNMS(KP250000000, T1Q, Tj); + T3m = T3i + T3l; + T3t = T3p - T3s; + T3u = FNMS(KP587785252, T3t, KP951056516 * T3m); + T3w = FMA(KP951056516, T3t, KP587785252 * T3m); + ci[WS(rs, 9)] = Tj + T1Q; + T3v = T3e + T3d; + ci[WS(rs, 5)] = T3v - T3w; + cr[WS(rs, 6)] = T3v + T3w; + T3f = T3d - T3e; + cr[WS(rs, 2)] = T3f - T3u; + ci[WS(rs, 1)] = T3f + T3u; + } + { + E T36, T38, T39, T2Z, T3c, T2V, T2Y, T3b, T3a; + T36 = KP559016994 * (T32 - T35); + T38 = T32 + T35; + T39 = FNMS(KP250000000, T38, T37); + T2V = T2T - T2U; + T2Y = T2W - T2X; + T2Z = FMA(KP951056516, T2V, KP587785252 * T2Y); + T3c = FNMS(KP587785252, T2V, KP951056516 * T2Y); + cr[WS(rs, 5)] = T37 + T38; + T3b = T39 - T36; + ci[WS(rs, 2)] = T3b - T3c; + ci[WS(rs, 6)] = T3c + T3b; + T3a = T36 + T39; + cr[WS(rs, 1)] = T2Z + T3a; + cr[WS(rs, 9)] = T3a - T2Z; + } + { + E T3x, T1Y, T3y, T3G, T3I, T3C, T3F, T3H, T3z; + T3x = KP559016994 * (T1U - T1X); + T1Y = T1U + T1X; + T3y = FNMS(KP250000000, T1Y, T1R); + T3C = T3A - T3B; + T3F = T3D - T3E; + T3G = FMA(KP951056516, T3C, KP587785252 * T3F); + T3I = FNMS(KP587785252, T3C, KP951056516 * T3F); + cr[0] = T1R + T1Y; + T3H = T3y - T3x; + ci[WS(rs, 7)] = T3H - T3I; + cr[WS(rs, 8)] = T3H + T3I; + T3z = T3x + T3y; + cr[WS(rs, 4)] = T3z - T3G; + ci[WS(rs, 3)] = T3z + T3G; + } + { + E T2l, T2r, T2s, T2Q, T2R, T2E, T2P, T2S, T2t; + T2l = KP559016994 * (T29 - T2k); + T2r = T29 + T2k; + T2s = FNMS(KP250000000, T2r, T2q); + T2E = T2y + T2D; + T2P = T2J - T2O; + T2Q = FMA(KP951056516, T2E, KP587785252 * T2P); + T2R = FNMS(KP587785252, T2E, KP951056516 * T2P); + ci[WS(rs, 4)] = T2q + T2r; + T2S = T2s - T2l; + cr[WS(rs, 3)] = T2R + T2S; + cr[WS(rs, 7)] = T2S - T2R; + T2t = T2l + T2s; + ci[0] = T2t - T2Q; + ci[WS(rs, 8)] = T2Q + T2t; + } + { + E T3U, T3L, T3V, T3T, T3X, T3R, T3S, T3Y, T3W; + T3U = KP559016994 * (T3K + T3J); + T3L = T3J - T3K; + T3V = FMA(KP250000000, T3L, T3Q); + T3R = T13 - TG; + T3S = T1r - T1O; + T3T = FNMS(KP587785252, T3S, KP951056516 * T3R); + T3X = FMA(KP587785252, T3R, KP951056516 * T3S); + cr[WS(rs, 10)] = T3L - T3Q; + T3Y = T3V - T3U; + cr[WS(rs, 18)] = T3X - T3Y; + ci[WS(rs, 17)] = T3X + T3Y; + T3W = T3U + T3V; + cr[WS(rs, 14)] = T3T - T3W; + ci[WS(rs, 13)] = T3T + T3W; + } + { + E T4g, T4k, T4l, T4d, T4n, T4b, T4c, T4o, T4m; + T4g = KP559016994 * (T4e - T4f); + T4k = T4e + T4f; + T4l = FNMS(KP250000000, T4k, T4j); + T4b = T33 - T34; + T4c = T30 - T31; + T4d = FNMS(KP587785252, T4c, KP951056516 * T4b); + T4n = FMA(KP951056516, T4c, KP587785252 * T4b); + ci[WS(rs, 14)] = T4k + T4j; + T4o = T4g + T4l; + ci[WS(rs, 10)] = T4n + T4o; + ci[WS(rs, 18)] = T4o - T4n; + T4m = T4g - T4l; + cr[WS(rs, 13)] = T4d + T4m; + cr[WS(rs, 17)] = T4m - T4d; + } + { + E T47, T45, T46, T41, T49, T3Z, T40, T4a, T48; + T47 = KP559016994 * (T43 - T44); + T45 = T43 + T44; + T46 = FNMS(KP250000000, T45, T42); + T3Z = T1S - T1T; + T40 = T1V - T1W; + T41 = FNMS(KP951056516, T40, KP587785252 * T3Z); + T49 = FMA(KP951056516, T3Z, KP587785252 * T40); + ci[WS(rs, 19)] = T45 + T42; + T4a = T47 + T46; + cr[WS(rs, 16)] = T49 - T4a; + ci[WS(rs, 15)] = T49 + T4a; + T48 = T46 - T47; + cr[WS(rs, 12)] = T41 - T48; + ci[WS(rs, 11)] = T41 + T48; + } + { + E T4w, T4r, T4x, T4v, T4z, T4t, T4u, T4A, T4y; + T4w = KP559016994 * (T4p + T4q); + T4r = T4p - T4q; + T4x = FMA(KP250000000, T4r, T4s); + T4t = T23 - T28; + T4u = T2e - T2j; + T4v = FMA(KP951056516, T4t, KP587785252 * T4u); + T4z = FNMS(KP587785252, T4t, KP951056516 * T4u); + cr[WS(rs, 15)] = T4r - T4s; + T4A = T4w + T4x; + ci[WS(rs, 12)] = T4z + T4A; + ci[WS(rs, 16)] = T4A - T4z; + T4y = T4w - T4x; + cr[WS(rs, 11)] = T4v + T4y; + cr[WS(rs, 19)] = T4y - T4v; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 20}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 20, "hf_20", twinstr, &GENUS, {184, 62, 62, 0} }; + +void X(codelet_hf_20) (planner *p) { + X(khc2hc_register) (p, hf_20, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_25.c new file mode 100644 index 000000000..7d8e08670 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_25.c @@ -0,0 +1,1572 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:34 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 25 -dit -name hf_25 -include rdft/scalar/hf.h */ + +/* + * This function contains 400 FP additions, 364 FP multiplications, + * (or, 84 additions, 48 multiplications, 316 fused multiply/add), + * 138 stack variables, 47 constants, and 100 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP614372930, +0.614372930789563808870829930444362096004872855); + DK(KP621716863, +0.621716863012209892444754556304102309693593202); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP557913902, +0.557913902031834264187699648465567037992437152); + DK(KP249506682, +0.249506682107067890488084201715862638334226305); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP968479752, +0.968479752739016373193524836781420152702090879); + DK(KP994076283, +0.994076283785401014123185814696322018529298887); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP062914667, +0.062914667253649757225485955897349402364686947); + DK(KP921177326, +0.921177326965143320250447435415066029359282231); + DK(KP833417178, +0.833417178328688677408962550243238843138996060); + DK(KP541454447, +0.541454447536312777046285590082819509052033189); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP943557151, +0.943557151597354104399655195398983005179443399); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP554608978, +0.554608978404018097464974850792216217022558774); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP525970792, +0.525970792408939708442463226536226366643874659); + DK(KP726211448, +0.726211448929902658173535992263577167607493062); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP871714437, +0.871714437527667770979999223229522602943903653); + DK(KP549754652, +0.549754652192770074288023275540779861653779767); + DK(KP939062505, +0.939062505817492352556001843133229685779824606); + DK(KP256756360, +0.256756360367726783319498520922669048172391148); + DK(KP851038619, +0.851038619207379630836264138867114231259902550); + DK(KP912018591, +0.912018591466481957908415381764119056233607330); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP634619297, +0.634619297544148100711287640319130485732531031); + DK(KP470564281, +0.470564281212251493087595091036643380879947982); + DK(KP827271945, +0.827271945972475634034355757144307982555673741); + DK(KP126329378, +0.126329378446108174786050455341811215027378105); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 48); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 48, MAKE_VOLATILE_STRIDE(50, rs)) { + E T1, T6R, T3Y, T5G, T70, T7q, Ts, T3L, T3M, T6U, T6V, T6W, T45, T5T, T4c; + E T5Q, T2G, T5S, T42, T3G, T5P, T49, T4A, T68, T4H, T65, T11, T64, T4E, T2Z; + E T67, T4x, T4P, T61, T4W, T5Y, T1z, T5X, T4T, T3d, T60, T4M, T4k, T5J, T4r; + E T5M, T28, T5L, T4o, T3s, T5I, T4h; + { + E T7, T3P, Tq, T3W, Tk, T3U, Td, T3R; + T1 = cr[0]; + T6R = ci[0]; + { + E T3, T6, T4, T3O, T2, T5; + T3 = cr[WS(rs, 5)]; + T6 = ci[WS(rs, 5)]; + T2 = W[8]; + T4 = T2 * T3; + T3O = T2 * T6; + T5 = W[9]; + T7 = FMA(T5, T6, T4); + T3P = FNMS(T5, T3, T3O); + } + { + E Tm, Tp, Tn, T3V, Tl, To; + Tm = cr[WS(rs, 15)]; + Tp = ci[WS(rs, 15)]; + Tl = W[28]; + Tn = Tl * Tm; + T3V = Tl * Tp; + To = W[29]; + Tq = FMA(To, Tp, Tn); + T3W = FNMS(To, Tm, T3V); + } + { + E Tg, Tj, Th, T3T, Tf, Ti; + Tg = cr[WS(rs, 10)]; + Tj = ci[WS(rs, 10)]; + Tf = W[18]; + Th = Tf * Tg; + T3T = Tf * Tj; + Ti = W[19]; + Tk = FMA(Ti, Tj, Th); + T3U = FNMS(Ti, Tg, T3T); + } + { + E T9, Tc, Ta, T3Q, T8, Tb; + T9 = cr[WS(rs, 20)]; + Tc = ci[WS(rs, 20)]; + T8 = W[38]; + Ta = T8 * T9; + T3Q = T8 * Tc; + Tb = W[39]; + Td = FMA(Tb, Tc, Ta); + T3R = FNMS(Tb, T9, T3Q); + } + { + E T3S, T3X, T6Y, T6Z; + T3S = T3P - T3R; + T3X = T3U - T3W; + T3Y = FMA(KP618033988, T3X, T3S); + T5G = FNMS(KP618033988, T3S, T3X); + T6Y = Tk - Tq; + T6Z = T7 - Td; + T70 = FNMS(KP618033988, T6Z, T6Y); + T7q = FMA(KP618033988, T6Y, T6Z); + } + { + E Te, Tr, T6S, T6T; + Te = T7 + Td; + Tr = Tk + Tq; + Ts = Te + Tr; + T3L = FNMS(KP250000000, Ts, T1); + T3M = Te - Tr; + T6S = T3P + T3R; + T6T = T3U + T3W; + T6U = T6S + T6T; + T6V = FNMS(KP250000000, T6U, T6R); + T6W = T6S - T6T; + } + } + { + E T2e, T3u, T2x, T3B, T2D, T3D, T2E, T3E, T2k, T3w, T2q, T3y, T2r, T3z; + { + E T2a, T2d, T2b, T3t, T29, T2c; + T2a = cr[WS(rs, 3)]; + T2d = ci[WS(rs, 3)]; + T29 = W[4]; + T2b = T29 * T2a; + T3t = T29 * T2d; + T2c = W[5]; + T2e = FMA(T2c, T2d, T2b); + T3u = FNMS(T2c, T2a, T3t); + } + { + E T2t, T2w, T2u, T3A, T2z, T2C, T2A, T3C, T2s, T2y, T2v, T2B; + T2t = cr[WS(rs, 13)]; + T2w = ci[WS(rs, 13)]; + T2s = W[24]; + T2u = T2s * T2t; + T3A = T2s * T2w; + T2z = cr[WS(rs, 18)]; + T2C = ci[WS(rs, 18)]; + T2y = W[34]; + T2A = T2y * T2z; + T3C = T2y * T2C; + T2v = W[25]; + T2x = FMA(T2v, T2w, T2u); + T3B = FNMS(T2v, T2t, T3A); + T2B = W[35]; + T2D = FMA(T2B, T2C, T2A); + T3D = FNMS(T2B, T2z, T3C); + T2E = T2x + T2D; + T3E = T3B + T3D; + } + { + E T2g, T2j, T2h, T3v, T2m, T2p, T2n, T3x, T2f, T2l, T2i, T2o; + T2g = cr[WS(rs, 8)]; + T2j = ci[WS(rs, 8)]; + T2f = W[14]; + T2h = T2f * T2g; + T3v = T2f * T2j; + T2m = cr[WS(rs, 23)]; + T2p = ci[WS(rs, 23)]; + T2l = W[44]; + T2n = T2l * T2m; + T3x = T2l * T2p; + T2i = W[15]; + T2k = FMA(T2i, T2j, T2h); + T3w = FNMS(T2i, T2g, T3v); + T2o = W[45]; + T2q = FMA(T2o, T2p, T2n); + T3y = FNMS(T2o, T2m, T3x); + T2r = T2k + T2q; + T3z = T3w + T3y; + } + { + E T43, T44, T4a, T4b; + T43 = T3y - T3w; + T44 = T3D - T3B; + T45 = FMA(KP618033988, T44, T43); + T5T = FNMS(KP618033988, T43, T44); + T4a = T2k - T2q; + T4b = T2x - T2D; + T4c = FMA(KP618033988, T4b, T4a); + T5Q = FNMS(KP618033988, T4a, T4b); + } + { + E T41, T2F, T40, T48, T3F, T47; + T41 = T2E - T2r; + T2F = T2r + T2E; + T40 = FNMS(KP250000000, T2F, T2e); + T2G = T2e + T2F; + T5S = FMA(KP559016994, T41, T40); + T42 = FNMS(KP559016994, T41, T40); + T48 = T3E - T3z; + T3F = T3z + T3E; + T47 = FNMS(KP250000000, T3F, T3u); + T3G = T3u + T3F; + T5P = FMA(KP559016994, T48, T47); + T49 = FNMS(KP559016994, T48, T47); + } + } + { + E Tz, T2N, TS, T2U, TY, T2W, TZ, T2X, TF, T2P, TL, T2R, TM, T2S; + { + E Tv, Ty, Tw, T2M, Tu, Tx; + Tv = cr[WS(rs, 1)]; + Ty = ci[WS(rs, 1)]; + Tu = W[0]; + Tw = Tu * Tv; + T2M = Tu * Ty; + Tx = W[1]; + Tz = FMA(Tx, Ty, Tw); + T2N = FNMS(Tx, Tv, T2M); + } + { + E TO, TR, TP, T2T, TU, TX, TV, T2V, TN, TT, TQ, TW; + TO = cr[WS(rs, 11)]; + TR = ci[WS(rs, 11)]; + TN = W[20]; + TP = TN * TO; + T2T = TN * TR; + TU = cr[WS(rs, 16)]; + TX = ci[WS(rs, 16)]; + TT = W[30]; + TV = TT * TU; + T2V = TT * TX; + TQ = W[21]; + TS = FMA(TQ, TR, TP); + T2U = FNMS(TQ, TO, T2T); + TW = W[31]; + TY = FMA(TW, TX, TV); + T2W = FNMS(TW, TU, T2V); + TZ = TS + TY; + T2X = T2U + T2W; + } + { + E TB, TE, TC, T2O, TH, TK, TI, T2Q, TA, TG, TD, TJ; + TB = cr[WS(rs, 6)]; + TE = ci[WS(rs, 6)]; + TA = W[10]; + TC = TA * TB; + T2O = TA * TE; + TH = cr[WS(rs, 21)]; + TK = ci[WS(rs, 21)]; + TG = W[40]; + TI = TG * TH; + T2Q = TG * TK; + TD = W[11]; + TF = FMA(TD, TE, TC); + T2P = FNMS(TD, TB, T2O); + TJ = W[41]; + TL = FMA(TJ, TK, TI); + T2R = FNMS(TJ, TH, T2Q); + TM = TF + TL; + T2S = T2P + T2R; + } + { + E T4y, T4z, T4F, T4G; + T4y = TL - TF; + T4z = TY - TS; + T4A = FMA(KP618033988, T4z, T4y); + T68 = FNMS(KP618033988, T4y, T4z); + T4F = T2P - T2R; + T4G = T2W - T2U; + T4H = FNMS(KP618033988, T4G, T4F); + T65 = FMA(KP618033988, T4F, T4G); + } + { + E T4D, T10, T4C, T4w, T2Y, T4v; + T4D = TM - TZ; + T10 = TM + TZ; + T4C = FNMS(KP250000000, T10, Tz); + T11 = Tz + T10; + T64 = FNMS(KP559016994, T4D, T4C); + T4E = FMA(KP559016994, T4D, T4C); + T4w = T2S - T2X; + T2Y = T2S + T2X; + T4v = FNMS(KP250000000, T2Y, T2N); + T2Z = T2N + T2Y; + T67 = FNMS(KP559016994, T4w, T4v); + T4x = FMA(KP559016994, T4w, T4v); + } + } + { + E T17, T31, T1q, T38, T1w, T3a, T1x, T3b, T1d, T33, T1j, T35, T1k, T36; + { + E T13, T16, T14, T30, T12, T15; + T13 = cr[WS(rs, 4)]; + T16 = ci[WS(rs, 4)]; + T12 = W[6]; + T14 = T12 * T13; + T30 = T12 * T16; + T15 = W[7]; + T17 = FMA(T15, T16, T14); + T31 = FNMS(T15, T13, T30); + } + { + E T1m, T1p, T1n, T37, T1s, T1v, T1t, T39, T1l, T1r, T1o, T1u; + T1m = cr[WS(rs, 14)]; + T1p = ci[WS(rs, 14)]; + T1l = W[26]; + T1n = T1l * T1m; + T37 = T1l * T1p; + T1s = cr[WS(rs, 19)]; + T1v = ci[WS(rs, 19)]; + T1r = W[36]; + T1t = T1r * T1s; + T39 = T1r * T1v; + T1o = W[27]; + T1q = FMA(T1o, T1p, T1n); + T38 = FNMS(T1o, T1m, T37); + T1u = W[37]; + T1w = FMA(T1u, T1v, T1t); + T3a = FNMS(T1u, T1s, T39); + T1x = T1q + T1w; + T3b = T38 + T3a; + } + { + E T19, T1c, T1a, T32, T1f, T1i, T1g, T34, T18, T1e, T1b, T1h; + T19 = cr[WS(rs, 9)]; + T1c = ci[WS(rs, 9)]; + T18 = W[16]; + T1a = T18 * T19; + T32 = T18 * T1c; + T1f = cr[WS(rs, 24)]; + T1i = ci[WS(rs, 24)]; + T1e = W[46]; + T1g = T1e * T1f; + T34 = T1e * T1i; + T1b = W[17]; + T1d = FMA(T1b, T1c, T1a); + T33 = FNMS(T1b, T19, T32); + T1h = W[47]; + T1j = FMA(T1h, T1i, T1g); + T35 = FNMS(T1h, T1f, T34); + T1k = T1d + T1j; + T36 = T33 + T35; + } + { + E T4N, T4O, T4U, T4V; + T4N = T1j - T1d; + T4O = T1w - T1q; + T4P = FMA(KP618033988, T4O, T4N); + T61 = FNMS(KP618033988, T4N, T4O); + T4U = T35 - T33; + T4V = T3a - T38; + T4W = FMA(KP618033988, T4V, T4U); + T5Y = FNMS(KP618033988, T4U, T4V); + } + { + E T4S, T1y, T4R, T4L, T3c, T4K; + T4S = T1k - T1x; + T1y = T1k + T1x; + T4R = FNMS(KP250000000, T1y, T17); + T1z = T17 + T1y; + T5X = FNMS(KP559016994, T4S, T4R); + T4T = FMA(KP559016994, T4S, T4R); + T4L = T3b - T36; + T3c = T36 + T3b; + T4K = FNMS(KP250000000, T3c, T31); + T3d = T31 + T3c; + T60 = FMA(KP559016994, T4L, T4K); + T4M = FNMS(KP559016994, T4L, T4K); + } + } + { + E T1G, T3g, T1Z, T3n, T25, T3p, T26, T3q, T1M, T3i, T1S, T3k, T1T, T3l; + { + E T1C, T1F, T1D, T3f, T1B, T1E; + T1C = cr[WS(rs, 2)]; + T1F = ci[WS(rs, 2)]; + T1B = W[2]; + T1D = T1B * T1C; + T3f = T1B * T1F; + T1E = W[3]; + T1G = FMA(T1E, T1F, T1D); + T3g = FNMS(T1E, T1C, T3f); + } + { + E T1V, T1Y, T1W, T3m, T21, T24, T22, T3o, T1U, T20, T1X, T23; + T1V = cr[WS(rs, 12)]; + T1Y = ci[WS(rs, 12)]; + T1U = W[22]; + T1W = T1U * T1V; + T3m = T1U * T1Y; + T21 = cr[WS(rs, 17)]; + T24 = ci[WS(rs, 17)]; + T20 = W[32]; + T22 = T20 * T21; + T3o = T20 * T24; + T1X = W[23]; + T1Z = FMA(T1X, T1Y, T1W); + T3n = FNMS(T1X, T1V, T3m); + T23 = W[33]; + T25 = FMA(T23, T24, T22); + T3p = FNMS(T23, T21, T3o); + T26 = T1Z + T25; + T3q = T3n + T3p; + } + { + E T1I, T1L, T1J, T3h, T1O, T1R, T1P, T3j, T1H, T1N, T1K, T1Q; + T1I = cr[WS(rs, 7)]; + T1L = ci[WS(rs, 7)]; + T1H = W[12]; + T1J = T1H * T1I; + T3h = T1H * T1L; + T1O = cr[WS(rs, 22)]; + T1R = ci[WS(rs, 22)]; + T1N = W[42]; + T1P = T1N * T1O; + T3j = T1N * T1R; + T1K = W[13]; + T1M = FMA(T1K, T1L, T1J); + T3i = FNMS(T1K, T1I, T3h); + T1Q = W[43]; + T1S = FMA(T1Q, T1R, T1P); + T3k = FNMS(T1Q, T1O, T3j); + T1T = T1M + T1S; + T3l = T3i + T3k; + } + { + E T4i, T4j, T4p, T4q; + T4i = T1S - T1M; + T4j = T25 - T1Z; + T4k = FMA(KP618033988, T4j, T4i); + T5J = FNMS(KP618033988, T4i, T4j); + T4p = T3k - T3i; + T4q = T3n - T3p; + T4r = FNMS(KP618033988, T4q, T4p); + T5M = FMA(KP618033988, T4p, T4q); + } + { + E T4n, T27, T4m, T4g, T3r, T4f; + T4n = T26 - T1T; + T27 = T1T + T26; + T4m = FNMS(KP250000000, T27, T1G); + T28 = T1G + T27; + T5L = FMA(KP559016994, T4n, T4m); + T4o = FNMS(KP559016994, T4n, T4m); + T4g = T3q - T3l; + T3r = T3l + T3q; + T4f = FNMS(KP250000000, T3r, T3g); + T3s = T3g + T3r; + T5I = FMA(KP559016994, T4g, T4f); + T4h = FNMS(KP559016994, T4g, T4f); + } + } + { + E T3I, T3K, Tt, T2I, T2J, T2K, T3J, T2L; + { + E T3e, T3H, T1A, T2H; + T3e = T2Z - T3d; + T3H = T3s - T3G; + T3I = FMA(KP618033988, T3H, T3e); + T3K = FNMS(KP618033988, T3e, T3H); + Tt = T1 + Ts; + T1A = T11 + T1z; + T2H = T28 + T2G; + T2I = T1A + T2H; + T2J = FNMS(KP250000000, T2I, Tt); + T2K = T1A - T2H; + } + cr[0] = Tt + T2I; + T3J = FNMS(KP559016994, T2K, T2J); + cr[WS(rs, 10)] = FNMS(KP951056516, T3K, T3J); + ci[WS(rs, 9)] = FMA(KP951056516, T3K, T3J); + T2L = FMA(KP559016994, T2K, T2J); + ci[WS(rs, 4)] = FNMS(KP951056516, T3I, T2L); + cr[WS(rs, 5)] = FMA(KP951056516, T3I, T2L); + } + { + E T3Z, T5d, T7r, T7D, T56, T59, T7L, T7K, T7E, T7F, T7G, T4u, T4Z, T50, T5y; + E T5B, T7z, T7y, T7s, T7t, T7u, T5k, T5r, T5s, T3N, T7p; + T3N = FMA(KP559016994, T3M, T3L); + T3Z = FNMS(KP951056516, T3Y, T3N); + T5d = FMA(KP951056516, T3Y, T3N); + T7p = FMA(KP559016994, T6W, T6V); + T7r = FNMS(KP951056516, T7q, T7p); + T7D = FMA(KP951056516, T7q, T7p); + { + E T4e, T57, T4Y, T55, T4t, T58, T4J, T54; + { + E T46, T4d, T4Q, T4X; + T46 = FMA(KP951056516, T45, T42); + T4d = FMA(KP951056516, T4c, T49); + T4e = FNMS(KP126329378, T4d, T46); + T57 = FMA(KP126329378, T46, T4d); + T4Q = FNMS(KP951056516, T4P, T4M); + T4X = FMA(KP951056516, T4W, T4T); + T4Y = FMA(KP827271945, T4X, T4Q); + T55 = FNMS(KP827271945, T4Q, T4X); + } + { + E T4l, T4s, T4B, T4I; + T4l = FNMS(KP951056516, T4k, T4h); + T4s = FMA(KP951056516, T4r, T4o); + T4t = FNMS(KP470564281, T4s, T4l); + T58 = FMA(KP470564281, T4l, T4s); + T4B = FNMS(KP951056516, T4A, T4x); + T4I = FNMS(KP951056516, T4H, T4E); + T4J = FMA(KP634619297, T4I, T4B); + T54 = FNMS(KP634619297, T4B, T4I); + } + T56 = FMA(KP912575812, T55, T54); + T59 = FNMS(KP912018591, T58, T57); + T7L = FMA(KP912575812, T4Y, T4J); + T7K = FMA(KP912018591, T4t, T4e); + T7E = FMA(KP912018591, T58, T57); + T7F = FNMS(KP912575812, T55, T54); + T7G = FMA(KP851038619, T7F, T7E); + T4u = FNMS(KP912018591, T4t, T4e); + T4Z = FNMS(KP912575812, T4Y, T4J); + T50 = FNMS(KP851038619, T4Z, T4u); + } + { + E T5g, T5w, T5q, T5A, T5j, T5x, T5n, T5z; + { + E T5e, T5f, T5o, T5p; + T5e = FMA(KP951056516, T4H, T4E); + T5f = FMA(KP951056516, T4A, T4x); + T5g = FMA(KP256756360, T5f, T5e); + T5w = FNMS(KP256756360, T5e, T5f); + T5o = FNMS(KP951056516, T45, T42); + T5p = FNMS(KP951056516, T4c, T49); + T5q = FMA(KP939062505, T5p, T5o); + T5A = FNMS(KP939062505, T5o, T5p); + } + { + E T5h, T5i, T5l, T5m; + T5h = FMA(KP951056516, T4P, T4M); + T5i = FNMS(KP951056516, T4W, T4T); + T5j = FMA(KP634619297, T5i, T5h); + T5x = FNMS(KP634619297, T5h, T5i); + T5l = FNMS(KP951056516, T4r, T4o); + T5m = FMA(KP951056516, T4k, T4h); + T5n = FMA(KP549754652, T5m, T5l); + T5z = FNMS(KP549754652, T5l, T5m); + } + T5y = FMA(KP871714437, T5x, T5w); + T5B = FNMS(KP831864738, T5A, T5z); + T7z = FNMS(KP871714437, T5j, T5g); + T7y = FNMS(KP831864738, T5q, T5n); + T7s = FNMS(KP871714437, T5x, T5w); + T7t = FMA(KP831864738, T5A, T5z); + T7u = FMA(KP904730450, T7t, T7s); + T5k = FMA(KP871714437, T5j, T5g); + T5r = FMA(KP831864738, T5q, T5n); + T5s = FMA(KP904730450, T5r, T5k); + } + cr[WS(rs, 4)] = FNMS(KP992114701, T50, T3Z); + ci[WS(rs, 23)] = FMA(KP968583161, T7u, T7r); + ci[WS(rs, 20)] = FNMS(KP992114701, T7G, T7D); + cr[WS(rs, 1)] = FMA(KP968583161, T5s, T5d); + { + E T5a, T5c, T53, T5b, T51, T52; + T5a = FNMS(KP726211448, T59, T56); + T5c = FMA(KP525970792, T56, T59); + T51 = FMA(KP248028675, T50, T3Z); + T52 = FMA(KP851038619, T4Z, T4u); + T53 = FMA(KP554608978, T52, T51); + T5b = FNMS(KP554608978, T52, T51); + cr[WS(rs, 9)] = FNMS(KP803003575, T5a, T53); + ci[WS(rs, 5)] = FMA(KP943557151, T5c, T5b); + ci[0] = FMA(KP803003575, T5a, T53); + ci[WS(rs, 10)] = FNMS(KP943557151, T5c, T5b); + } + { + E T7A, T7C, T7x, T7B, T7v, T7w; + T7A = FNMS(KP683113946, T7z, T7y); + T7C = FMA(KP559154169, T7y, T7z); + T7v = FNMS(KP242145790, T7u, T7r); + T7w = FNMS(KP904730450, T7t, T7s); + T7x = FNMS(KP541454447, T7w, T7v); + T7B = FMA(KP541454447, T7w, T7v); + cr[WS(rs, 16)] = FMS(KP833417178, T7A, T7x); + ci[WS(rs, 18)] = FNMS(KP921177326, T7C, T7B); + ci[WS(rs, 13)] = FMA(KP833417178, T7A, T7x); + cr[WS(rs, 21)] = -(FMA(KP921177326, T7C, T7B)); + } + { + E T7M, T7O, T7J, T7N, T7H, T7I; + T7M = FNMS(KP525970792, T7L, T7K); + T7O = FMA(KP726211448, T7K, T7L); + T7H = FMA(KP248028675, T7G, T7D); + T7I = FNMS(KP851038619, T7F, T7E); + T7J = FNMS(KP554608978, T7I, T7H); + T7N = FMA(KP554608978, T7I, T7H); + cr[WS(rs, 14)] = -(FMA(KP943557151, T7M, T7J)); + ci[WS(rs, 15)] = FNMS(KP803003575, T7O, T7N); + cr[WS(rs, 19)] = FMS(KP943557151, T7M, T7J); + cr[WS(rs, 24)] = -(FMA(KP803003575, T7O, T7N)); + } + { + E T5C, T5E, T5v, T5D, T5t, T5u; + T5C = FMA(KP559154169, T5B, T5y); + T5E = FNMS(KP683113946, T5y, T5B); + T5t = FNMS(KP242145790, T5s, T5d); + T5u = FNMS(KP904730450, T5r, T5k); + T5v = FMA(KP541454447, T5u, T5t); + T5D = FNMS(KP541454447, T5u, T5t); + ci[WS(rs, 3)] = FNMS(KP921177326, T5C, T5v); + ci[WS(rs, 8)] = FMA(KP833417178, T5E, T5D); + cr[WS(rs, 6)] = FMA(KP921177326, T5C, T5v); + cr[WS(rs, 11)] = FNMS(KP833417178, T5E, T5D); + } + } + { + E T7Y, T80, T7P, T7S, T7T, T7U, T7Z, T7V; + { + E T7W, T7X, T7Q, T7R; + T7W = T28 - T2G; + T7X = T1z - T11; + T7Y = FMA(KP618033988, T7X, T7W); + T80 = FNMS(KP618033988, T7W, T7X); + T7P = T6U + T6R; + T7Q = T2Z + T3d; + T7R = T3s + T3G; + T7S = T7Q + T7R; + T7T = FNMS(KP250000000, T7S, T7P); + T7U = T7Q - T7R; + } + ci[WS(rs, 24)] = T7S + T7P; + T7Z = FMA(KP559016994, T7U, T7T); + cr[WS(rs, 20)] = FMS(KP951056516, T80, T7Z); + ci[WS(rs, 19)] = FMA(KP951056516, T80, T7Z); + T7V = FNMS(KP559016994, T7U, T7T); + cr[WS(rs, 15)] = FMS(KP951056516, T7Y, T7V); + ci[WS(rs, 14)] = FMA(KP951056516, T7Y, T7V); + } + { + E T5H, T6p, T71, T7d, T6i, T6l, T7l, T7k, T7e, T7f, T7g, T5W, T6b, T6c, T6K; + E T6N, T79, T78, T72, T73, T74, T6w, T6D, T6E, T5F, T6X; + T5F = FNMS(KP559016994, T3M, T3L); + T5H = FMA(KP951056516, T5G, T5F); + T6p = FNMS(KP951056516, T5G, T5F); + T6X = FNMS(KP559016994, T6W, T6V); + T71 = FMA(KP951056516, T70, T6X); + T7d = FNMS(KP951056516, T70, T6X); + { + E T5O, T6j, T6a, T6h, T5V, T6k, T63, T6g; + { + E T5K, T5N, T66, T69; + T5K = FMA(KP951056516, T5J, T5I); + T5N = FMA(KP951056516, T5M, T5L); + T5O = FMA(KP062914667, T5N, T5K); + T6j = FNMS(KP062914667, T5K, T5N); + T66 = FNMS(KP951056516, T65, T64); + T69 = FMA(KP951056516, T68, T67); + T6a = FMA(KP939062505, T69, T66); + T6h = FNMS(KP939062505, T66, T69); + } + { + E T5R, T5U, T5Z, T62; + T5R = FNMS(KP951056516, T5Q, T5P); + T5U = FNMS(KP951056516, T5T, T5S); + T5V = FNMS(KP827271945, T5U, T5R); + T6k = FMA(KP827271945, T5R, T5U); + T5Z = FNMS(KP951056516, T5Y, T5X); + T62 = FMA(KP951056516, T61, T60); + T63 = FNMS(KP126329378, T62, T5Z); + T6g = FMA(KP126329378, T5Z, T62); + } + T6i = FMA(KP734762448, T6h, T6g); + T6l = FNMS(KP772036680, T6k, T6j); + T7l = FMA(KP734762448, T6a, T63); + T7k = FNMS(KP772036680, T5V, T5O); + T7e = FMA(KP772036680, T6k, T6j); + T7f = FNMS(KP734762448, T6h, T6g); + T7g = FMA(KP994076283, T7f, T7e); + T5W = FMA(KP772036680, T5V, T5O); + T6b = FNMS(KP734762448, T6a, T63); + T6c = FNMS(KP994076283, T6b, T5W); + } + { + E T6s, T6L, T6C, T6J, T6v, T6M, T6z, T6I; + { + E T6q, T6r, T6A, T6B; + T6q = FMA(KP951056516, T5Q, T5P); + T6r = FMA(KP951056516, T5T, T5S); + T6s = FMA(KP062914667, T6r, T6q); + T6L = FNMS(KP062914667, T6q, T6r); + T6A = FMA(KP951056516, T65, T64); + T6B = FNMS(KP951056516, T68, T67); + T6C = FMA(KP549754652, T6B, T6A); + T6J = FNMS(KP549754652, T6A, T6B); + } + { + E T6t, T6u, T6x, T6y; + T6t = FNMS(KP951056516, T5J, T5I); + T6u = FNMS(KP951056516, T5M, T5L); + T6v = FMA(KP634619297, T6u, T6t); + T6M = FNMS(KP634619297, T6t, T6u); + T6x = FNMS(KP951056516, T61, T60); + T6y = FMA(KP951056516, T5Y, T5X); + T6z = FNMS(KP470564281, T6y, T6x); + T6I = FMA(KP470564281, T6x, T6y); + } + T6K = FMA(KP968479752, T6J, T6I); + T6N = FNMS(KP845997307, T6M, T6L); + T79 = FNMS(KP968479752, T6C, T6z); + T78 = FNMS(KP845997307, T6v, T6s); + T72 = FMA(KP845997307, T6M, T6L); + T73 = FNMS(KP968479752, T6J, T6I); + T74 = FMA(KP906616052, T73, T72); + T6w = FMA(KP845997307, T6v, T6s); + T6D = FMA(KP968479752, T6C, T6z); + T6E = FMA(KP906616052, T6D, T6w); + } + cr[WS(rs, 3)] = FMA(KP998026728, T6c, T5H); + ci[WS(rs, 22)] = FNMS(KP998026728, T74, T71); + ci[WS(rs, 21)] = FNMS(KP998026728, T7g, T7d); + cr[WS(rs, 2)] = FMA(KP998026728, T6E, T6p); + { + E T7a, T7c, T77, T7b, T75, T76; + T7a = FNMS(KP560319534, T79, T78); + T7c = FMA(KP681693190, T78, T79); + T75 = FMA(KP249506682, T74, T71); + T76 = FNMS(KP906616052, T73, T72); + T77 = FNMS(KP557913902, T76, T75); + T7b = FMA(KP557913902, T76, T75); + cr[WS(rs, 17)] = -(FMA(KP949179823, T7a, T77)); + ci[WS(rs, 17)] = FMA(KP860541664, T7c, T7b); + ci[WS(rs, 12)] = FNMS(KP949179823, T7a, T77); + cr[WS(rs, 22)] = FMS(KP860541664, T7c, T7b); + } + { + E T6O, T6Q, T6H, T6P, T6F, T6G; + T6O = FMA(KP681693190, T6N, T6K); + T6Q = FNMS(KP560319534, T6K, T6N); + T6F = FNMS(KP249506682, T6E, T6p); + T6G = FNMS(KP906616052, T6D, T6w); + T6H = FNMS(KP557913902, T6G, T6F); + T6P = FMA(KP557913902, T6G, T6F); + ci[WS(rs, 2)] = FNMS(KP860541664, T6O, T6H); + cr[WS(rs, 12)] = FNMS(KP949179823, T6Q, T6P); + cr[WS(rs, 7)] = FMA(KP860541664, T6O, T6H); + ci[WS(rs, 7)] = FMA(KP949179823, T6Q, T6P); + } + { + E T6m, T6o, T6f, T6n, T6d, T6e; + T6m = FNMS(KP621716863, T6l, T6i); + T6o = FMA(KP614372930, T6i, T6l); + T6d = FNMS(KP249506682, T6c, T5H); + T6e = FMA(KP994076283, T6b, T5W); + T6f = FNMS(KP557913902, T6e, T6d); + T6n = FMA(KP557913902, T6e, T6d); + ci[WS(rs, 1)] = FNMS(KP943557151, T6m, T6f); + ci[WS(rs, 11)] = FMA(KP949179823, T6o, T6n); + cr[WS(rs, 8)] = FMA(KP943557151, T6m, T6f); + ci[WS(rs, 6)] = FNMS(KP949179823, T6o, T6n); + } + { + E T7m, T7o, T7j, T7n, T7h, T7i; + T7m = FNMS(KP614372930, T7l, T7k); + T7o = FMA(KP621716863, T7k, T7l); + T7h = FMA(KP249506682, T7g, T7d); + T7i = FNMS(KP994076283, T7f, T7e); + T7j = FNMS(KP557913902, T7i, T7h); + T7n = FMA(KP557913902, T7i, T7h); + cr[WS(rs, 13)] = -(FMA(KP949179823, T7m, T7j)); + ci[WS(rs, 16)] = FNMS(KP943557151, T7o, T7n); + cr[WS(rs, 18)] = FMS(KP949179823, T7m, T7j); + cr[WS(rs, 23)] = -(FMA(KP943557151, T7o, T7n)); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 25}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hf_25", twinstr, &GENUS, {84, 48, 316, 0} }; + +void X(codelet_hf_25) (planner *p) { + X(khc2hc_register) (p, hf_25, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 25 -dit -name hf_25 -include rdft/scalar/hf.h */ + +/* + * This function contains 400 FP additions, 280 FP multiplications, + * (or, 260 additions, 140 multiplications, 140 fused multiply/add), + * 101 stack variables, 20 constants, and 100 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_25(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 48); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 48, MAKE_VOLATILE_STRIDE(50, rs)) { + E T1, T6b, T2l, T6g, To, T2m, T6e, T6f, T6a, T6H, T2u, T4I, T2i, T60, T3S; + E T5D, T4r, T58, T3Z, T5C, T4q, T5b, TS, T5W, T2G, T5s, T4g, T4M, T2R, T5t; + E T4h, T4P, T1l, T5X, T37, T5v, T4k, T4T, T3e, T5w, T4j, T4W, T1P, T5Z, T3v; + E T5A, T4o, T54, T3C, T5z, T4n, T51; + { + E T6, T2o, Tb, T2p, Tc, T6c, Th, T2r, Tm, T2s, Tn, T6d; + T1 = cr[0]; + T6b = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 5)]; + T5 = ci[WS(rs, 5)]; + T2 = W[8]; + T4 = W[9]; + T6 = FMA(T2, T3, T4 * T5); + T2o = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 20)]; + Ta = ci[WS(rs, 20)]; + T7 = W[38]; + T9 = W[39]; + Tb = FMA(T7, T8, T9 * Ta); + T2p = FNMS(T9, T8, T7 * Ta); + } + Tc = T6 + Tb; + T6c = T2o + T2p; + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 10)]; + Tg = ci[WS(rs, 10)]; + Td = W[18]; + Tf = W[19]; + Th = FMA(Td, Te, Tf * Tg); + T2r = FNMS(Tf, Te, Td * Tg); + } + { + E Tj, Tl, Ti, Tk; + Tj = cr[WS(rs, 15)]; + Tl = ci[WS(rs, 15)]; + Ti = W[28]; + Tk = W[29]; + Tm = FMA(Ti, Tj, Tk * Tl); + T2s = FNMS(Tk, Tj, Ti * Tl); + } + Tn = Th + Tm; + T6d = T2r + T2s; + T2l = KP559016994 * (Tc - Tn); + T6g = KP559016994 * (T6c - T6d); + To = Tc + Tn; + T2m = FNMS(KP250000000, To, T1); + T6e = T6c + T6d; + T6f = FNMS(KP250000000, T6e, T6b); + { + E T68, T69, T2q, T2t; + T68 = Th - Tm; + T69 = T6 - Tb; + T6a = FNMS(KP587785252, T69, KP951056516 * T68); + T6H = FMA(KP951056516, T69, KP587785252 * T68); + T2q = T2o - T2p; + T2t = T2r - T2s; + T2u = FMA(KP951056516, T2q, KP587785252 * T2t); + T4I = FNMS(KP587785252, T2q, KP951056516 * T2t); + } + } + { + E T1U, T3O, T3E, T3F, T3X, T3W, T3J, T3M, T3P, T25, T2g, T2h; + { + E T1R, T1T, T1Q, T1S; + T1R = cr[WS(rs, 3)]; + T1T = ci[WS(rs, 3)]; + T1Q = W[4]; + T1S = W[5]; + T1U = FMA(T1Q, T1R, T1S * T1T); + T3O = FNMS(T1S, T1R, T1Q * T1T); + } + { + E T1Z, T3H, T2f, T3L, T24, T3I, T2a, T3K; + { + E T1W, T1Y, T1V, T1X; + T1W = cr[WS(rs, 8)]; + T1Y = ci[WS(rs, 8)]; + T1V = W[14]; + T1X = W[15]; + T1Z = FMA(T1V, T1W, T1X * T1Y); + T3H = FNMS(T1X, T1W, T1V * T1Y); + } + { + E T2c, T2e, T2b, T2d; + T2c = cr[WS(rs, 18)]; + T2e = ci[WS(rs, 18)]; + T2b = W[34]; + T2d = W[35]; + T2f = FMA(T2b, T2c, T2d * T2e); + T3L = FNMS(T2d, T2c, T2b * T2e); + } + { + E T21, T23, T20, T22; + T21 = cr[WS(rs, 23)]; + T23 = ci[WS(rs, 23)]; + T20 = W[44]; + T22 = W[45]; + T24 = FMA(T20, T21, T22 * T23); + T3I = FNMS(T22, T21, T20 * T23); + } + { + E T27, T29, T26, T28; + T27 = cr[WS(rs, 13)]; + T29 = ci[WS(rs, 13)]; + T26 = W[24]; + T28 = W[25]; + T2a = FMA(T26, T27, T28 * T29); + T3K = FNMS(T28, T27, T26 * T29); + } + T3E = T1Z - T24; + T3F = T2a - T2f; + T3X = T3K - T3L; + T3W = T3H - T3I; + T3J = T3H + T3I; + T3M = T3K + T3L; + T3P = T3J + T3M; + T25 = T1Z + T24; + T2g = T2a + T2f; + T2h = T25 + T2g; + } + T2i = T1U + T2h; + T60 = T3O + T3P; + { + E T3G, T57, T3R, T56, T3N, T3Q; + T3G = FMA(KP951056516, T3E, KP587785252 * T3F); + T57 = FNMS(KP587785252, T3E, KP951056516 * T3F); + T3N = KP559016994 * (T3J - T3M); + T3Q = FNMS(KP250000000, T3P, T3O); + T3R = T3N + T3Q; + T56 = T3Q - T3N; + T3S = T3G + T3R; + T5D = T57 + T56; + T4r = T3R - T3G; + T58 = T56 - T57; + } + { + E T3Y, T5a, T3V, T59, T3T, T3U; + T3Y = FMA(KP951056516, T3W, KP587785252 * T3X); + T5a = FNMS(KP587785252, T3W, KP951056516 * T3X); + T3T = KP559016994 * (T25 - T2g); + T3U = FNMS(KP250000000, T2h, T1U); + T3V = T3T + T3U; + T59 = T3U - T3T; + T3Z = T3V - T3Y; + T5C = T59 - T5a; + T4q = T3V + T3Y; + T5b = T59 + T5a; + } + } + { + E Tu, T2N, T2B, T2E, T2I, T2H, T2K, T2L, T2O, TF, TQ, TR; + { + E Tr, Tt, Tq, Ts; + Tr = cr[WS(rs, 1)]; + Tt = ci[WS(rs, 1)]; + Tq = W[0]; + Ts = W[1]; + Tu = FMA(Tq, Tr, Ts * Tt); + T2N = FNMS(Ts, Tr, Tq * Tt); + } + { + E Tz, T2z, TP, T2D, TE, T2A, TK, T2C; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 6)]; + Ty = ci[WS(rs, 6)]; + Tv = W[10]; + Tx = W[11]; + Tz = FMA(Tv, Tw, Tx * Ty); + T2z = FNMS(Tx, Tw, Tv * Ty); + } + { + E TM, TO, TL, TN; + TM = cr[WS(rs, 16)]; + TO = ci[WS(rs, 16)]; + TL = W[30]; + TN = W[31]; + TP = FMA(TL, TM, TN * TO); + T2D = FNMS(TN, TM, TL * TO); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 21)]; + TD = ci[WS(rs, 21)]; + TA = W[40]; + TC = W[41]; + TE = FMA(TA, TB, TC * TD); + T2A = FNMS(TC, TB, TA * TD); + } + { + E TH, TJ, TG, TI; + TH = cr[WS(rs, 11)]; + TJ = ci[WS(rs, 11)]; + TG = W[20]; + TI = W[21]; + TK = FMA(TG, TH, TI * TJ); + T2C = FNMS(TI, TH, TG * TJ); + } + T2B = T2z - T2A; + T2E = T2C - T2D; + T2I = TK - TP; + T2H = Tz - TE; + T2K = T2z + T2A; + T2L = T2C + T2D; + T2O = T2K + T2L; + TF = Tz + TE; + TQ = TK + TP; + TR = TF + TQ; + } + TS = Tu + TR; + T5W = T2N + T2O; + { + E T2F, T4L, T2y, T4K, T2w, T2x; + T2F = FMA(KP951056516, T2B, KP587785252 * T2E); + T4L = FNMS(KP587785252, T2B, KP951056516 * T2E); + T2w = KP559016994 * (TF - TQ); + T2x = FNMS(KP250000000, TR, Tu); + T2y = T2w + T2x; + T4K = T2x - T2w; + T2G = T2y - T2F; + T5s = T4K - T4L; + T4g = T2y + T2F; + T4M = T4K + T4L; + } + { + E T2J, T4O, T2Q, T4N, T2M, T2P; + T2J = FMA(KP951056516, T2H, KP587785252 * T2I); + T4O = FNMS(KP587785252, T2H, KP951056516 * T2I); + T2M = KP559016994 * (T2K - T2L); + T2P = FNMS(KP250000000, T2O, T2N); + T2Q = T2M + T2P; + T4N = T2P - T2M; + T2R = T2J + T2Q; + T5t = T4O + T4N; + T4h = T2Q - T2J; + T4P = T4N - T4O; + } + } + { + E TX, T33, T2T, T2U, T3c, T3b, T2Y, T31, T34, T18, T1j, T1k; + { + E TU, TW, TT, TV; + TU = cr[WS(rs, 4)]; + TW = ci[WS(rs, 4)]; + TT = W[6]; + TV = W[7]; + TX = FMA(TT, TU, TV * TW); + T33 = FNMS(TV, TU, TT * TW); + } + { + E T12, T2W, T1i, T30, T17, T2X, T1d, T2Z; + { + E TZ, T11, TY, T10; + TZ = cr[WS(rs, 9)]; + T11 = ci[WS(rs, 9)]; + TY = W[16]; + T10 = W[17]; + T12 = FMA(TY, TZ, T10 * T11); + T2W = FNMS(T10, TZ, TY * T11); + } + { + E T1f, T1h, T1e, T1g; + T1f = cr[WS(rs, 19)]; + T1h = ci[WS(rs, 19)]; + T1e = W[36]; + T1g = W[37]; + T1i = FMA(T1e, T1f, T1g * T1h); + T30 = FNMS(T1g, T1f, T1e * T1h); + } + { + E T14, T16, T13, T15; + T14 = cr[WS(rs, 24)]; + T16 = ci[WS(rs, 24)]; + T13 = W[46]; + T15 = W[47]; + T17 = FMA(T13, T14, T15 * T16); + T2X = FNMS(T15, T14, T13 * T16); + } + { + E T1a, T1c, T19, T1b; + T1a = cr[WS(rs, 14)]; + T1c = ci[WS(rs, 14)]; + T19 = W[26]; + T1b = W[27]; + T1d = FMA(T19, T1a, T1b * T1c); + T2Z = FNMS(T1b, T1a, T19 * T1c); + } + T2T = T17 - T12; + T2U = T1d - T1i; + T3c = T2Z - T30; + T3b = T2W - T2X; + T2Y = T2W + T2X; + T31 = T2Z + T30; + T34 = T2Y + T31; + T18 = T12 + T17; + T1j = T1d + T1i; + T1k = T18 + T1j; + } + T1l = TX + T1k; + T5X = T33 + T34; + { + E T2V, T4S, T36, T4R, T32, T35; + T2V = FNMS(KP587785252, T2U, KP951056516 * T2T); + T4S = FMA(KP587785252, T2T, KP951056516 * T2U); + T32 = KP559016994 * (T2Y - T31); + T35 = FNMS(KP250000000, T34, T33); + T36 = T32 + T35; + T4R = T35 - T32; + T37 = T2V - T36; + T5v = T4S + T4R; + T4k = T2V + T36; + T4T = T4R - T4S; + } + { + E T3d, T4V, T3a, T4U, T38, T39; + T3d = FMA(KP951056516, T3b, KP587785252 * T3c); + T4V = FNMS(KP587785252, T3b, KP951056516 * T3c); + T38 = KP559016994 * (T18 - T1j); + T39 = FNMS(KP250000000, T1k, TX); + T3a = T38 + T39; + T4U = T39 - T38; + T3e = T3a - T3d; + T5w = T4U - T4V; + T4j = T3a + T3d; + T4W = T4U + T4V; + } + } + { + E T1r, T3r, T3h, T3i, T3A, T3z, T3m, T3p, T3s, T1C, T1N, T1O; + { + E T1o, T1q, T1n, T1p; + T1o = cr[WS(rs, 2)]; + T1q = ci[WS(rs, 2)]; + T1n = W[2]; + T1p = W[3]; + T1r = FMA(T1n, T1o, T1p * T1q); + T3r = FNMS(T1p, T1o, T1n * T1q); + } + { + E T1w, T3k, T1M, T3o, T1B, T3l, T1H, T3n; + { + E T1t, T1v, T1s, T1u; + T1t = cr[WS(rs, 7)]; + T1v = ci[WS(rs, 7)]; + T1s = W[12]; + T1u = W[13]; + T1w = FMA(T1s, T1t, T1u * T1v); + T3k = FNMS(T1u, T1t, T1s * T1v); + } + { + E T1J, T1L, T1I, T1K; + T1J = cr[WS(rs, 17)]; + T1L = ci[WS(rs, 17)]; + T1I = W[32]; + T1K = W[33]; + T1M = FMA(T1I, T1J, T1K * T1L); + T3o = FNMS(T1K, T1J, T1I * T1L); + } + { + E T1y, T1A, T1x, T1z; + T1y = cr[WS(rs, 22)]; + T1A = ci[WS(rs, 22)]; + T1x = W[42]; + T1z = W[43]; + T1B = FMA(T1x, T1y, T1z * T1A); + T3l = FNMS(T1z, T1y, T1x * T1A); + } + { + E T1E, T1G, T1D, T1F; + T1E = cr[WS(rs, 12)]; + T1G = ci[WS(rs, 12)]; + T1D = W[22]; + T1F = W[23]; + T1H = FMA(T1D, T1E, T1F * T1G); + T3n = FNMS(T1F, T1E, T1D * T1G); + } + T3h = T1w - T1B; + T3i = T1H - T1M; + T3A = T3n - T3o; + T3z = T3k - T3l; + T3m = T3k + T3l; + T3p = T3n + T3o; + T3s = T3m + T3p; + T1C = T1w + T1B; + T1N = T1H + T1M; + T1O = T1C + T1N; + } + T1P = T1r + T1O; + T5Z = T3r + T3s; + { + E T3j, T53, T3u, T52, T3q, T3t; + T3j = FMA(KP951056516, T3h, KP587785252 * T3i); + T53 = FNMS(KP587785252, T3h, KP951056516 * T3i); + T3q = KP559016994 * (T3m - T3p); + T3t = FNMS(KP250000000, T3s, T3r); + T3u = T3q + T3t; + T52 = T3t - T3q; + T3v = T3j + T3u; + T5A = T53 + T52; + T4o = T3u - T3j; + T54 = T52 - T53; + } + { + E T3B, T50, T3y, T4Z, T3w, T3x; + T3B = FMA(KP951056516, T3z, KP587785252 * T3A); + T50 = FNMS(KP587785252, T3z, KP951056516 * T3A); + T3w = KP559016994 * (T1C - T1N); + T3x = FNMS(KP250000000, T1O, T1r); + T3y = T3w + T3x; + T4Z = T3x - T3w; + T3C = T3y - T3B; + T5z = T4Z - T50; + T4n = T3y + T3B; + T51 = T4Z + T50; + } + } + { + E T62, T64, Tp, T2k, T5T, T5U, T63, T5V; + { + E T5Y, T61, T1m, T2j; + T5Y = T5W - T5X; + T61 = T5Z - T60; + T62 = FMA(KP951056516, T5Y, KP587785252 * T61); + T64 = FNMS(KP587785252, T5Y, KP951056516 * T61); + Tp = T1 + To; + T1m = TS + T1l; + T2j = T1P + T2i; + T2k = T1m + T2j; + T5T = KP559016994 * (T1m - T2j); + T5U = FNMS(KP250000000, T2k, Tp); + } + cr[0] = Tp + T2k; + T63 = T5U - T5T; + cr[WS(rs, 10)] = T63 - T64; + ci[WS(rs, 9)] = T63 + T64; + T5V = T5T + T5U; + ci[WS(rs, 4)] = T5V - T62; + cr[WS(rs, 5)] = T5V + T62; + } + { + E T2v, T4f, T6I, T6U, T42, T6Z, T43, T6Y, T4A, T6N, T4D, T6L, T4u, T6E, T4v; + E T6D, T48, T6V, T4b, T6T, T2n, T6G; + T2n = T2l + T2m; + T2v = T2n - T2u; + T4f = T2n + T2u; + T6G = T6g + T6f; + T6I = T6G - T6H; + T6U = T6H + T6G; + { + E T2S, T3f, T3g, T3D, T40, T41; + T2S = FMA(KP535826794, T2G, KP844327925 * T2R); + T3f = FNMS(KP637423989, T3e, KP770513242 * T37); + T3g = T2S + T3f; + T3D = FNMS(KP425779291, T3C, KP904827052 * T3v); + T40 = FNMS(KP992114701, T3Z, KP125333233 * T3S); + T41 = T3D + T40; + T42 = T3g + T41; + T6Z = T3D - T40; + T43 = KP559016994 * (T3g - T41); + T6Y = T3f - T2S; + } + { + E T4y, T4z, T6J, T4B, T4C, T6K; + T4y = FNMS(KP248689887, T4g, KP968583161 * T4h); + T4z = FNMS(KP844327925, T4j, KP535826794 * T4k); + T6J = T4y + T4z; + T4B = FNMS(KP481753674, T4n, KP876306680 * T4o); + T4C = FNMS(KP684547105, T4q, KP728968627 * T4r); + T6K = T4B + T4C; + T4A = T4y - T4z; + T6N = KP559016994 * (T6J - T6K); + T4D = T4B - T4C; + T6L = T6J + T6K; + } + { + E T4i, T4l, T4m, T4p, T4s, T4t; + T4i = FMA(KP968583161, T4g, KP248689887 * T4h); + T4l = FMA(KP535826794, T4j, KP844327925 * T4k); + T4m = T4i + T4l; + T4p = FMA(KP876306680, T4n, KP481753674 * T4o); + T4s = FMA(KP728968627, T4q, KP684547105 * T4r); + T4t = T4p + T4s; + T4u = T4m + T4t; + T6E = T4p - T4s; + T4v = KP559016994 * (T4m - T4t); + T6D = T4l - T4i; + } + { + E T46, T47, T6R, T49, T4a, T6S; + T46 = FNMS(KP844327925, T2G, KP535826794 * T2R); + T47 = FMA(KP770513242, T3e, KP637423989 * T37); + T6R = T46 + T47; + T49 = FMA(KP125333233, T3Z, KP992114701 * T3S); + T4a = FMA(KP904827052, T3C, KP425779291 * T3v); + T6S = T4a + T49; + T48 = T46 - T47; + T6V = T6R - T6S; + T4b = T49 - T4a; + T6T = KP559016994 * (T6R + T6S); + } + cr[WS(rs, 4)] = T2v + T42; + ci[WS(rs, 23)] = T6L + T6I; + ci[WS(rs, 20)] = T6V + T6U; + cr[WS(rs, 1)] = T4f + T4u; + { + E T4c, T4e, T45, T4d, T44; + T4c = FMA(KP951056516, T48, KP587785252 * T4b); + T4e = FNMS(KP587785252, T48, KP951056516 * T4b); + T44 = FNMS(KP250000000, T42, T2v); + T45 = T43 + T44; + T4d = T44 - T43; + ci[0] = T45 - T4c; + ci[WS(rs, 5)] = T4d + T4e; + cr[WS(rs, 9)] = T45 + T4c; + ci[WS(rs, 10)] = T4d - T4e; + } + { + E T6F, T6P, T6O, T6Q, T6M; + T6F = FMA(KP587785252, T6D, KP951056516 * T6E); + T6P = FNMS(KP587785252, T6E, KP951056516 * T6D); + T6M = FNMS(KP250000000, T6L, T6I); + T6O = T6M - T6N; + T6Q = T6N + T6M; + cr[WS(rs, 16)] = T6F - T6O; + ci[WS(rs, 18)] = T6P + T6Q; + ci[WS(rs, 13)] = T6F + T6O; + cr[WS(rs, 21)] = T6P - T6Q; + } + { + E T70, T71, T6X, T72, T6W; + T70 = FMA(KP587785252, T6Y, KP951056516 * T6Z); + T71 = FNMS(KP587785252, T6Z, KP951056516 * T6Y); + T6W = FNMS(KP250000000, T6V, T6U); + T6X = T6T - T6W; + T72 = T6T + T6W; + cr[WS(rs, 14)] = T6X - T70; + ci[WS(rs, 15)] = T71 + T72; + cr[WS(rs, 19)] = T70 + T6X; + cr[WS(rs, 24)] = T71 - T72; + } + { + E T4E, T4G, T4x, T4F, T4w; + T4E = FMA(KP951056516, T4A, KP587785252 * T4D); + T4G = FNMS(KP587785252, T4A, KP951056516 * T4D); + T4w = FNMS(KP250000000, T4u, T4f); + T4x = T4v + T4w; + T4F = T4w - T4v; + ci[WS(rs, 3)] = T4x - T4E; + ci[WS(rs, 8)] = T4F + T4G; + cr[WS(rs, 6)] = T4x + T4E; + cr[WS(rs, 11)] = T4F - T4G; + } + } + { + E T75, T7d, T76, T79, T7a, T7b, T7e, T7c; + { + E T73, T74, T77, T78; + T73 = T1l - TS; + T74 = T1P - T2i; + T75 = FMA(KP587785252, T73, KP951056516 * T74); + T7d = FNMS(KP587785252, T74, KP951056516 * T73); + T76 = T6e + T6b; + T77 = T5W + T5X; + T78 = T5Z + T60; + T79 = T77 + T78; + T7a = FNMS(KP250000000, T79, T76); + T7b = KP559016994 * (T77 - T78); + } + ci[WS(rs, 24)] = T79 + T76; + T7e = T7b + T7a; + cr[WS(rs, 20)] = T7d - T7e; + ci[WS(rs, 19)] = T7d + T7e; + T7c = T7a - T7b; + cr[WS(rs, 15)] = T75 - T7c; + ci[WS(rs, 14)] = T75 + T7c; + } + { + E T4J, T5r, T6i, T6u, T5e, T6z, T5f, T6y, T5M, T6n, T5P, T6l, T5G, T66, T5H; + E T65, T5k, T6v, T5n, T6t, T4H, T6h; + T4H = T2m - T2l; + T4J = T4H + T4I; + T5r = T4H - T4I; + T6h = T6f - T6g; + T6i = T6a + T6h; + T6u = T6h - T6a; + { + E T4Q, T4X, T4Y, T55, T5c, T5d; + T4Q = FMA(KP728968627, T4M, KP684547105 * T4P); + T4X = FNMS(KP992114701, T4W, KP125333233 * T4T); + T4Y = T4Q + T4X; + T55 = FMA(KP062790519, T51, KP998026728 * T54); + T5c = FNMS(KP637423989, T5b, KP770513242 * T58); + T5d = T55 + T5c; + T5e = T4Y + T5d; + T6z = T55 - T5c; + T5f = KP559016994 * (T4Y - T5d); + T6y = T4X - T4Q; + } + { + E T5K, T5L, T6j, T5N, T5O, T6k; + T5K = FNMS(KP481753674, T5s, KP876306680 * T5t); + T5L = FMA(KP904827052, T5w, KP425779291 * T5v); + T6j = T5K - T5L; + T5N = FNMS(KP844327925, T5z, KP535826794 * T5A); + T5O = FNMS(KP998026728, T5C, KP062790519 * T5D); + T6k = T5N + T5O; + T5M = T5K + T5L; + T6n = KP559016994 * (T6j - T6k); + T5P = T5N - T5O; + T6l = T6j + T6k; + } + { + E T5u, T5x, T5y, T5B, T5E, T5F; + T5u = FMA(KP876306680, T5s, KP481753674 * T5t); + T5x = FNMS(KP425779291, T5w, KP904827052 * T5v); + T5y = T5u + T5x; + T5B = FMA(KP535826794, T5z, KP844327925 * T5A); + T5E = FMA(KP062790519, T5C, KP998026728 * T5D); + T5F = T5B + T5E; + T5G = T5y + T5F; + T66 = T5B - T5E; + T5H = KP559016994 * (T5y - T5F); + T65 = T5x - T5u; + } + { + E T5i, T5j, T6r, T5l, T5m, T6s; + T5i = FNMS(KP684547105, T4M, KP728968627 * T4P); + T5j = FMA(KP125333233, T4W, KP992114701 * T4T); + T6r = T5i - T5j; + T5l = FNMS(KP998026728, T51, KP062790519 * T54); + T5m = FMA(KP770513242, T5b, KP637423989 * T58); + T6s = T5l - T5m; + T5k = T5i + T5j; + T6v = T6r + T6s; + T5n = T5l + T5m; + T6t = KP559016994 * (T6r - T6s); + } + cr[WS(rs, 3)] = T4J + T5e; + ci[WS(rs, 22)] = T6l + T6i; + ci[WS(rs, 21)] = T6v + T6u; + cr[WS(rs, 2)] = T5r + T5G; + { + E T67, T6p, T6o, T6q, T6m; + T67 = FMA(KP587785252, T65, KP951056516 * T66); + T6p = FNMS(KP587785252, T66, KP951056516 * T65); + T6m = FNMS(KP250000000, T6l, T6i); + T6o = T6m - T6n; + T6q = T6n + T6m; + cr[WS(rs, 17)] = T67 - T6o; + ci[WS(rs, 17)] = T6p + T6q; + ci[WS(rs, 12)] = T67 + T6o; + cr[WS(rs, 22)] = T6p - T6q; + } + { + E T5Q, T5S, T5J, T5R, T5I; + T5Q = FMA(KP951056516, T5M, KP587785252 * T5P); + T5S = FNMS(KP587785252, T5M, KP951056516 * T5P); + T5I = FNMS(KP250000000, T5G, T5r); + T5J = T5H + T5I; + T5R = T5I - T5H; + ci[WS(rs, 2)] = T5J - T5Q; + ci[WS(rs, 7)] = T5R + T5S; + cr[WS(rs, 7)] = T5J + T5Q; + cr[WS(rs, 12)] = T5R - T5S; + } + { + E T5o, T5q, T5h, T5p, T5g; + T5o = FMA(KP951056516, T5k, KP587785252 * T5n); + T5q = FNMS(KP587785252, T5k, KP951056516 * T5n); + T5g = FNMS(KP250000000, T5e, T4J); + T5h = T5f + T5g; + T5p = T5g - T5f; + ci[WS(rs, 1)] = T5h - T5o; + ci[WS(rs, 6)] = T5p + T5q; + cr[WS(rs, 8)] = T5h + T5o; + ci[WS(rs, 11)] = T5p - T5q; + } + { + E T6A, T6B, T6x, T6C, T6w; + T6A = FMA(KP587785252, T6y, KP951056516 * T6z); + T6B = FNMS(KP587785252, T6z, KP951056516 * T6y); + T6w = FNMS(KP250000000, T6v, T6u); + T6x = T6t - T6w; + T6C = T6t + T6w; + cr[WS(rs, 13)] = T6x - T6A; + ci[WS(rs, 16)] = T6B + T6C; + cr[WS(rs, 18)] = T6A + T6x; + cr[WS(rs, 23)] = T6B - T6C; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 25}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 25, "hf_25", twinstr, &GENUS, {260, 140, 140, 0} }; + +void X(codelet_hf_25) (planner *p) { + X(khc2hc_register) (p, hf_25, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_3.c new file mode 100644 index 000000000..08ff2c05f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_3.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 3 -dit -name hf_3 -include rdft/scalar/hf.h */ + +/* + * This function contains 16 FP additions, 14 FP multiplications, + * (or, 6 additions, 4 multiplications, 10 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_3(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs)) { + E T1, Tl, T7, Th, Td, Tj; + T1 = cr[0]; + Tl = ci[0]; + { + E T3, T6, T4, Tg, T2, T5; + T3 = cr[WS(rs, 1)]; + T6 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + Tg = T2 * T6; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Th = FNMS(T5, T3, Tg); + } + { + E T9, Tc, Ta, Ti, T8, Tb; + T9 = cr[WS(rs, 2)]; + Tc = ci[WS(rs, 2)]; + T8 = W[2]; + Ta = T8 * T9; + Ti = T8 * Tc; + Tb = W[3]; + Td = FMA(Tb, Tc, Ta); + Tj = FNMS(Tb, T9, Ti); + } + { + E Tk, Te, Tf, To, Tm, Tn; + Tk = Th - Tj; + Te = T7 + Td; + Tf = FNMS(KP500000000, Te, T1); + cr[0] = T1 + Te; + ci[0] = FNMS(KP866025403, Tk, Tf); + cr[WS(rs, 1)] = FMA(KP866025403, Tk, Tf); + To = Td - T7; + Tm = Th + Tj; + Tn = FNMS(KP500000000, Tm, Tl); + cr[WS(rs, 2)] = FMS(KP866025403, To, Tn); + ci[WS(rs, 2)] = Tm + Tl; + ci[WS(rs, 1)] = FMA(KP866025403, To, Tn); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 3, "hf_3", twinstr, &GENUS, {6, 4, 10, 0} }; + +void X(codelet_hf_3) (planner *p) { + X(khc2hc_register) (p, hf_3, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 3 -dit -name hf_3 -include rdft/scalar/hf.h */ + +/* + * This function contains 16 FP additions, 12 FP multiplications, + * (or, 10 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_3(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 4); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 4, MAKE_VOLATILE_STRIDE(6, rs)) { + E T1, Ti, T6, Te, Tb, Tf, Tc, Tj; + T1 = cr[0]; + Ti = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 1)]; + T5 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + Te = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 2)]; + Ta = ci[WS(rs, 2)]; + T7 = W[2]; + T9 = W[3]; + Tb = FMA(T7, T8, T9 * Ta); + Tf = FNMS(T9, T8, T7 * Ta); + } + Tc = T6 + Tb; + Tj = Te + Tf; + { + E Td, Tg, Th, Tk; + cr[0] = T1 + Tc; + Td = FNMS(KP500000000, Tc, T1); + Tg = KP866025403 * (Te - Tf); + ci[0] = Td - Tg; + cr[WS(rs, 1)] = Td + Tg; + ci[WS(rs, 2)] = Tj + Ti; + Th = KP866025403 * (Tb - T6); + Tk = FNMS(KP500000000, Tj, Ti); + cr[WS(rs, 2)] = Th - Tk; + ci[WS(rs, 1)] = Th + Tk; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 3}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 3, "hf_3", twinstr, &GENUS, {10, 6, 6, 0} }; + +void X(codelet_hf_3) (planner *p) { + X(khc2hc_register) (p, hf_3, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_32.c new file mode 100644 index 000000000..51549d0e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_32.c @@ -0,0 +1,1809 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:30 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -dit -name hf_32 -include rdft/scalar/hf.h */ + +/* + * This function contains 434 FP additions, 260 FP multiplications, + * (or, 236 additions, 62 multiplications, 198 fused multiply/add), + * 102 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 62, MAKE_VOLATILE_STRIDE(64, rs)) { + E T8, T8y, T3w, T87, Tl, T8x, T3B, T83, Tz, T6G, T3J, T5T, TM, T6F, T3Q; + E T5U, T11, T1e, T6J, T6K, T6L, T6M, T3Z, T5Y, T46, T5X, T1s, T1F, T6O, T6P; + E T6Q, T6R, T4e, T61, T4l, T60, T32, T76, T7d, T7N, T54, T6c, T5r, T6f, T29; + E T6V, T72, T7I, T4v, T65, T4S, T68, T3t, T7e, T79, T7O, T5b, T5t, T5i, T5s; + E T2A, T73, T6Y, T7J, T4C, T4T, T4J, T4U; + { + E T1, T86, T3, T6, T4, T84, T2, T7, T85, T5; + T1 = cr[0]; + T86 = ci[0]; + T3 = cr[WS(rs, 16)]; + T6 = ci[WS(rs, 16)]; + T2 = W[30]; + T4 = T2 * T3; + T84 = T2 * T6; + T5 = W[31]; + T7 = FMA(T5, T6, T4); + T85 = FNMS(T5, T3, T84); + T8 = T1 + T7; + T8y = T86 - T85; + T3w = T1 - T7; + T87 = T85 + T86; + } + { + E Ta, Td, Tb, T3x, Tg, Tj, Th, T3z, T9, Tf; + Ta = cr[WS(rs, 8)]; + Td = ci[WS(rs, 8)]; + T9 = W[14]; + Tb = T9 * Ta; + T3x = T9 * Td; + Tg = cr[WS(rs, 24)]; + Tj = ci[WS(rs, 24)]; + Tf = W[46]; + Th = Tf * Tg; + T3z = Tf * Tj; + { + E Te, T3y, Tk, T3A, Tc, Ti; + Tc = W[15]; + Te = FMA(Tc, Td, Tb); + T3y = FNMS(Tc, Ta, T3x); + Ti = W[47]; + Tk = FMA(Ti, Tj, Th); + T3A = FNMS(Ti, Tg, T3z); + Tl = Te + Tk; + T8x = Te - Tk; + T3B = T3y - T3A; + T83 = T3y + T3A; + } + } + { + E Ts, T3F, Ty, T3H, T3D, T3I; + { + E To, Tr, Tp, T3E, Tn, Tq; + To = cr[WS(rs, 4)]; + Tr = ci[WS(rs, 4)]; + Tn = W[6]; + Tp = Tn * To; + T3E = Tn * Tr; + Tq = W[7]; + Ts = FMA(Tq, Tr, Tp); + T3F = FNMS(Tq, To, T3E); + } + { + E Tu, Tx, Tv, T3G, Tt, Tw; + Tu = cr[WS(rs, 20)]; + Tx = ci[WS(rs, 20)]; + Tt = W[38]; + Tv = Tt * Tu; + T3G = Tt * Tx; + Tw = W[39]; + Ty = FMA(Tw, Tx, Tv); + T3H = FNMS(Tw, Tu, T3G); + } + Tz = Ts + Ty; + T6G = T3F + T3H; + T3D = Ts - Ty; + T3I = T3F - T3H; + T3J = T3D - T3I; + T5T = T3D + T3I; + } + { + E TF, T3M, TL, T3O, T3K, T3P; + { + E TB, TE, TC, T3L, TA, TD; + TB = cr[WS(rs, 28)]; + TE = ci[WS(rs, 28)]; + TA = W[54]; + TC = TA * TB; + T3L = TA * TE; + TD = W[55]; + TF = FMA(TD, TE, TC); + T3M = FNMS(TD, TB, T3L); + } + { + E TH, TK, TI, T3N, TG, TJ; + TH = cr[WS(rs, 12)]; + TK = ci[WS(rs, 12)]; + TG = W[22]; + TI = TG * TH; + T3N = TG * TK; + TJ = W[23]; + TL = FMA(TJ, TK, TI); + T3O = FNMS(TJ, TH, T3N); + } + TM = TF + TL; + T6F = T3M + T3O; + T3K = TF - TL; + T3P = T3M - T3O; + T3Q = T3K + T3P; + T5U = T3K - T3P; + } + { + E TU, T3U, T1d, T44, T10, T3W, T17, T42; + { + E TQ, TT, TR, T3T, TP, TS; + TQ = cr[WS(rs, 2)]; + TT = ci[WS(rs, 2)]; + TP = W[2]; + TR = TP * TQ; + T3T = TP * TT; + TS = W[3]; + TU = FMA(TS, TT, TR); + T3U = FNMS(TS, TQ, T3T); + } + { + E T19, T1c, T1a, T43, T18, T1b; + T19 = cr[WS(rs, 26)]; + T1c = ci[WS(rs, 26)]; + T18 = W[50]; + T1a = T18 * T19; + T43 = T18 * T1c; + T1b = W[51]; + T1d = FMA(T1b, T1c, T1a); + T44 = FNMS(T1b, T19, T43); + } + { + E TW, TZ, TX, T3V, TV, TY; + TW = cr[WS(rs, 18)]; + TZ = ci[WS(rs, 18)]; + TV = W[34]; + TX = TV * TW; + T3V = TV * TZ; + TY = W[35]; + T10 = FMA(TY, TZ, TX); + T3W = FNMS(TY, TW, T3V); + } + { + E T13, T16, T14, T41, T12, T15; + T13 = cr[WS(rs, 10)]; + T16 = ci[WS(rs, 10)]; + T12 = W[18]; + T14 = T12 * T13; + T41 = T12 * T16; + T15 = W[19]; + T17 = FMA(T15, T16, T14); + T42 = FNMS(T15, T13, T41); + } + T11 = TU + T10; + T1e = T17 + T1d; + T6J = T11 - T1e; + T6K = T3U + T3W; + T6L = T42 + T44; + T6M = T6K - T6L; + { + E T3X, T3Y, T40, T45; + T3X = T3U - T3W; + T3Y = T17 - T1d; + T3Z = T3X + T3Y; + T5Y = T3X - T3Y; + T40 = TU - T10; + T45 = T42 - T44; + T46 = T40 - T45; + T5X = T40 + T45; + } + } + { + E T1l, T49, T1E, T4j, T1r, T4b, T1y, T4h; + { + E T1h, T1k, T1i, T48, T1g, T1j; + T1h = cr[WS(rs, 30)]; + T1k = ci[WS(rs, 30)]; + T1g = W[58]; + T1i = T1g * T1h; + T48 = T1g * T1k; + T1j = W[59]; + T1l = FMA(T1j, T1k, T1i); + T49 = FNMS(T1j, T1h, T48); + } + { + E T1A, T1D, T1B, T4i, T1z, T1C; + T1A = cr[WS(rs, 22)]; + T1D = ci[WS(rs, 22)]; + T1z = W[42]; + T1B = T1z * T1A; + T4i = T1z * T1D; + T1C = W[43]; + T1E = FMA(T1C, T1D, T1B); + T4j = FNMS(T1C, T1A, T4i); + } + { + E T1n, T1q, T1o, T4a, T1m, T1p; + T1n = cr[WS(rs, 14)]; + T1q = ci[WS(rs, 14)]; + T1m = W[26]; + T1o = T1m * T1n; + T4a = T1m * T1q; + T1p = W[27]; + T1r = FMA(T1p, T1q, T1o); + T4b = FNMS(T1p, T1n, T4a); + } + { + E T1u, T1x, T1v, T4g, T1t, T1w; + T1u = cr[WS(rs, 6)]; + T1x = ci[WS(rs, 6)]; + T1t = W[10]; + T1v = T1t * T1u; + T4g = T1t * T1x; + T1w = W[11]; + T1y = FMA(T1w, T1x, T1v); + T4h = FNMS(T1w, T1u, T4g); + } + T1s = T1l + T1r; + T1F = T1y + T1E; + T6O = T1s - T1F; + T6P = T49 + T4b; + T6Q = T4h + T4j; + T6R = T6P - T6Q; + { + E T4c, T4d, T4f, T4k; + T4c = T49 - T4b; + T4d = T1y - T1E; + T4e = T4c + T4d; + T61 = T4c - T4d; + T4f = T1l - T1r; + T4k = T4h - T4j; + T4l = T4f - T4k; + T60 = T4f + T4k; + } + } + { + E T2H, T5n, T30, T52, T2N, T5p, T2U, T50; + { + E T2D, T2G, T2E, T5m, T2C, T2F; + T2D = cr[WS(rs, 31)]; + T2G = ci[WS(rs, 31)]; + T2C = W[60]; + T2E = T2C * T2D; + T5m = T2C * T2G; + T2F = W[61]; + T2H = FMA(T2F, T2G, T2E); + T5n = FNMS(T2F, T2D, T5m); + } + { + E T2W, T2Z, T2X, T51, T2V, T2Y; + T2W = cr[WS(rs, 23)]; + T2Z = ci[WS(rs, 23)]; + T2V = W[44]; + T2X = T2V * T2W; + T51 = T2V * T2Z; + T2Y = W[45]; + T30 = FMA(T2Y, T2Z, T2X); + T52 = FNMS(T2Y, T2W, T51); + } + { + E T2J, T2M, T2K, T5o, T2I, T2L; + T2J = cr[WS(rs, 15)]; + T2M = ci[WS(rs, 15)]; + T2I = W[28]; + T2K = T2I * T2J; + T5o = T2I * T2M; + T2L = W[29]; + T2N = FMA(T2L, T2M, T2K); + T5p = FNMS(T2L, T2J, T5o); + } + { + E T2Q, T2T, T2R, T4Z, T2P, T2S; + T2Q = cr[WS(rs, 7)]; + T2T = ci[WS(rs, 7)]; + T2P = W[12]; + T2R = T2P * T2Q; + T4Z = T2P * T2T; + T2S = W[13]; + T2U = FMA(T2S, T2T, T2R); + T50 = FNMS(T2S, T2Q, T4Z); + } + { + E T2O, T31, T7b, T7c; + T2O = T2H + T2N; + T31 = T2U + T30; + T32 = T2O + T31; + T76 = T2O - T31; + T7b = T5n + T5p; + T7c = T50 + T52; + T7d = T7b - T7c; + T7N = T7b + T7c; + } + { + E T4Y, T53, T5l, T5q; + T4Y = T2H - T2N; + T53 = T50 - T52; + T54 = T4Y - T53; + T6c = T4Y + T53; + T5l = T30 - T2U; + T5q = T5n - T5p; + T5r = T5l - T5q; + T6f = T5q + T5l; + } + } + { + E T1O, T4N, T27, T4t, T1U, T4P, T21, T4r; + { + E T1K, T1N, T1L, T4M, T1J, T1M; + T1K = cr[WS(rs, 1)]; + T1N = ci[WS(rs, 1)]; + T1J = W[0]; + T1L = T1J * T1K; + T4M = T1J * T1N; + T1M = W[1]; + T1O = FMA(T1M, T1N, T1L); + T4N = FNMS(T1M, T1K, T4M); + } + { + E T23, T26, T24, T4s, T22, T25; + T23 = cr[WS(rs, 25)]; + T26 = ci[WS(rs, 25)]; + T22 = W[48]; + T24 = T22 * T23; + T4s = T22 * T26; + T25 = W[49]; + T27 = FMA(T25, T26, T24); + T4t = FNMS(T25, T23, T4s); + } + { + E T1Q, T1T, T1R, T4O, T1P, T1S; + T1Q = cr[WS(rs, 17)]; + T1T = ci[WS(rs, 17)]; + T1P = W[32]; + T1R = T1P * T1Q; + T4O = T1P * T1T; + T1S = W[33]; + T1U = FMA(T1S, T1T, T1R); + T4P = FNMS(T1S, T1Q, T4O); + } + { + E T1X, T20, T1Y, T4q, T1W, T1Z; + T1X = cr[WS(rs, 9)]; + T20 = ci[WS(rs, 9)]; + T1W = W[16]; + T1Y = T1W * T1X; + T4q = T1W * T20; + T1Z = W[17]; + T21 = FMA(T1Z, T20, T1Y); + T4r = FNMS(T1Z, T1X, T4q); + } + { + E T1V, T28, T70, T71; + T1V = T1O + T1U; + T28 = T21 + T27; + T29 = T1V + T28; + T6V = T1V - T28; + T70 = T4N + T4P; + T71 = T4r + T4t; + T72 = T70 - T71; + T7I = T70 + T71; + } + { + E T4p, T4u, T4Q, T4R; + T4p = T1O - T1U; + T4u = T4r - T4t; + T4v = T4p - T4u; + T65 = T4p + T4u; + T4Q = T4N - T4P; + T4R = T21 - T27; + T4S = T4Q + T4R; + T68 = T4Q - T4R; + } + } + { + E T38, T57, T3r, T5g, T3e, T59, T3l, T5e; + { + E T34, T37, T35, T56, T33, T36; + T34 = cr[WS(rs, 3)]; + T37 = ci[WS(rs, 3)]; + T33 = W[4]; + T35 = T33 * T34; + T56 = T33 * T37; + T36 = W[5]; + T38 = FMA(T36, T37, T35); + T57 = FNMS(T36, T34, T56); + } + { + E T3n, T3q, T3o, T5f, T3m, T3p; + T3n = cr[WS(rs, 11)]; + T3q = ci[WS(rs, 11)]; + T3m = W[20]; + T3o = T3m * T3n; + T5f = T3m * T3q; + T3p = W[21]; + T3r = FMA(T3p, T3q, T3o); + T5g = FNMS(T3p, T3n, T5f); + } + { + E T3a, T3d, T3b, T58, T39, T3c; + T3a = cr[WS(rs, 19)]; + T3d = ci[WS(rs, 19)]; + T39 = W[36]; + T3b = T39 * T3a; + T58 = T39 * T3d; + T3c = W[37]; + T3e = FMA(T3c, T3d, T3b); + T59 = FNMS(T3c, T3a, T58); + } + { + E T3h, T3k, T3i, T5d, T3g, T3j; + T3h = cr[WS(rs, 27)]; + T3k = ci[WS(rs, 27)]; + T3g = W[52]; + T3i = T3g * T3h; + T5d = T3g * T3k; + T3j = W[53]; + T3l = FMA(T3j, T3k, T3i); + T5e = FNMS(T3j, T3h, T5d); + } + { + E T3f, T3s, T77, T78; + T3f = T38 + T3e; + T3s = T3l + T3r; + T3t = T3f + T3s; + T7e = T3s - T3f; + T77 = T5e + T5g; + T78 = T57 + T59; + T79 = T77 - T78; + T7O = T78 + T77; + } + { + E T55, T5a, T5c, T5h; + T55 = T38 - T3e; + T5a = T57 - T59; + T5b = T55 - T5a; + T5t = T55 + T5a; + T5c = T3l - T3r; + T5h = T5e - T5g; + T5i = T5c + T5h; + T5s = T5c - T5h; + } + } + { + E T2f, T4y, T2y, T4H, T2l, T4A, T2s, T4F; + { + E T2b, T2e, T2c, T4x, T2a, T2d; + T2b = cr[WS(rs, 5)]; + T2e = ci[WS(rs, 5)]; + T2a = W[8]; + T2c = T2a * T2b; + T4x = T2a * T2e; + T2d = W[9]; + T2f = FMA(T2d, T2e, T2c); + T4y = FNMS(T2d, T2b, T4x); + } + { + E T2u, T2x, T2v, T4G, T2t, T2w; + T2u = cr[WS(rs, 13)]; + T2x = ci[WS(rs, 13)]; + T2t = W[24]; + T2v = T2t * T2u; + T4G = T2t * T2x; + T2w = W[25]; + T2y = FMA(T2w, T2x, T2v); + T4H = FNMS(T2w, T2u, T4G); + } + { + E T2h, T2k, T2i, T4z, T2g, T2j; + T2h = cr[WS(rs, 21)]; + T2k = ci[WS(rs, 21)]; + T2g = W[40]; + T2i = T2g * T2h; + T4z = T2g * T2k; + T2j = W[41]; + T2l = FMA(T2j, T2k, T2i); + T4A = FNMS(T2j, T2h, T4z); + } + { + E T2o, T2r, T2p, T4E, T2n, T2q; + T2o = cr[WS(rs, 29)]; + T2r = ci[WS(rs, 29)]; + T2n = W[56]; + T2p = T2n * T2o; + T4E = T2n * T2r; + T2q = W[57]; + T2s = FMA(T2q, T2r, T2p); + T4F = FNMS(T2q, T2o, T4E); + } + { + E T2m, T2z, T6W, T6X; + T2m = T2f + T2l; + T2z = T2s + T2y; + T2A = T2m + T2z; + T73 = T2m - T2z; + T6W = T4F + T4H; + T6X = T4y + T4A; + T6Y = T6W - T6X; + T7J = T6X + T6W; + } + { + E T4w, T4B, T4D, T4I; + T4w = T2f - T2l; + T4B = T4y - T4A; + T4C = T4w - T4B; + T4T = T4w + T4B; + T4D = T2s - T2y; + T4I = T4F - T4H; + T4J = T4D + T4I; + T4U = T4I - T4D; + } + } + { + E TO, T7C, T7Z, T80, T89, T8e, T1H, T8d, T3v, T8b, T7L, T7T, T7Q, T7U, T7F; + E T81; + { + E Tm, TN, T7X, T7Y; + Tm = T8 + Tl; + TN = Tz + TM; + TO = Tm + TN; + T7C = Tm - TN; + T7X = T7N + T7O; + T7Y = T7I + T7J; + T7Z = T7X - T7Y; + T80 = T7Y + T7X; + } + { + E T82, T88, T1f, T1G; + T82 = T6G + T6F; + T88 = T83 + T87; + T89 = T82 + T88; + T8e = T88 - T82; + T1f = T11 + T1e; + T1G = T1s + T1F; + T1H = T1f + T1G; + T8d = T1f - T1G; + } + { + E T2B, T3u, T7H, T7K; + T2B = T29 + T2A; + T3u = T32 + T3t; + T3v = T2B + T3u; + T8b = T3u - T2B; + T7H = T29 - T2A; + T7K = T7I - T7J; + T7L = T7H + T7K; + T7T = T7H - T7K; + } + { + E T7M, T7P, T7D, T7E; + T7M = T32 - T3t; + T7P = T7N - T7O; + T7Q = T7M - T7P; + T7U = T7M + T7P; + T7D = T6P + T6Q; + T7E = T6K + T6L; + T7F = T7D - T7E; + T81 = T7E + T7D; + } + { + E T1I, T8a, T8c, T7W; + T1I = TO + T1H; + ci[WS(rs, 15)] = T1I - T3v; + cr[0] = T1I + T3v; + T8a = T81 + T89; + cr[WS(rs, 16)] = T80 - T8a; + ci[WS(rs, 31)] = T80 + T8a; + T8c = T89 - T81; + cr[WS(rs, 24)] = T8b - T8c; + ci[WS(rs, 23)] = T8b + T8c; + T7W = TO - T1H; + cr[WS(rs, 8)] = T7W - T7Z; + ci[WS(rs, 7)] = T7W + T7Z; + } + { + E T7G, T7R, T8f, T8g; + T7G = T7C - T7F; + T7R = T7L + T7Q; + ci[WS(rs, 11)] = FNMS(KP707106781, T7R, T7G); + cr[WS(rs, 4)] = FMA(KP707106781, T7R, T7G); + T8f = T8d + T8e; + T8g = T7Q - T7L; + cr[WS(rs, 28)] = FMS(KP707106781, T8g, T8f); + ci[WS(rs, 19)] = FMA(KP707106781, T8g, T8f); + } + { + E T8h, T8i, T7S, T7V; + T8h = T8e - T8d; + T8i = T7U - T7T; + cr[WS(rs, 20)] = FMS(KP707106781, T8i, T8h); + ci[WS(rs, 27)] = FMA(KP707106781, T8i, T8h); + T7S = T7C + T7F; + T7V = T7T + T7U; + cr[WS(rs, 12)] = FNMS(KP707106781, T7V, T7S); + ci[WS(rs, 3)] = FMA(KP707106781, T7V, T7S); + } + } + { + E T3S, T5C, T4n, T8C, T8B, T8H, T5F, T8I, T5w, T5Q, T5A, T5M, T4X, T5P, T5z; + E T5J; + { + E T3C, T3R, T5D, T5E; + T3C = T3w - T3B; + T3R = T3J + T3Q; + T3S = FNMS(KP707106781, T3R, T3C); + T5C = FMA(KP707106781, T3R, T3C); + { + E T47, T4m, T8z, T8A; + T47 = FMA(KP414213562, T46, T3Z); + T4m = FNMS(KP414213562, T4l, T4e); + T4n = T47 - T4m; + T8C = T47 + T4m; + T8z = T8x + T8y; + T8A = T5T - T5U; + T8B = FMA(KP707106781, T8A, T8z); + T8H = FNMS(KP707106781, T8A, T8z); + } + T5D = FNMS(KP414213562, T3Z, T46); + T5E = FMA(KP414213562, T4e, T4l); + T5F = T5D + T5E; + T8I = T5E - T5D; + { + E T5k, T5K, T5v, T5L, T5j, T5u; + T5j = T5b + T5i; + T5k = FNMS(KP707106781, T5j, T54); + T5K = FMA(KP707106781, T5j, T54); + T5u = T5s - T5t; + T5v = FNMS(KP707106781, T5u, T5r); + T5L = FMA(KP707106781, T5u, T5r); + T5w = FMA(KP668178637, T5v, T5k); + T5Q = FMA(KP198912367, T5K, T5L); + T5A = FNMS(KP668178637, T5k, T5v); + T5M = FNMS(KP198912367, T5L, T5K); + } + { + E T4L, T5H, T4W, T5I, T4K, T4V; + T4K = T4C + T4J; + T4L = FNMS(KP707106781, T4K, T4v); + T5H = FMA(KP707106781, T4K, T4v); + T4V = T4T + T4U; + T4W = FNMS(KP707106781, T4V, T4S); + T5I = FMA(KP707106781, T4V, T4S); + T4X = FMA(KP668178637, T4W, T4L); + T5P = FMA(KP198912367, T5H, T5I); + T5z = FNMS(KP668178637, T4L, T4W); + T5J = FNMS(KP198912367, T5I, T5H); + } + } + { + E T4o, T5x, T8J, T8K; + T4o = FMA(KP923879532, T4n, T3S); + T5x = T4X + T5w; + ci[WS(rs, 12)] = FNMS(KP831469612, T5x, T4o); + cr[WS(rs, 3)] = FMA(KP831469612, T5x, T4o); + T8J = FMA(KP923879532, T8I, T8H); + T8K = T5z - T5A; + cr[WS(rs, 19)] = FMS(KP831469612, T8K, T8J); + ci[WS(rs, 28)] = FMA(KP831469612, T8K, T8J); + } + { + E T8L, T8M, T5y, T5B; + T8L = FNMS(KP923879532, T8I, T8H); + T8M = T5w - T4X; + cr[WS(rs, 27)] = FMS(KP831469612, T8M, T8L); + ci[WS(rs, 20)] = FMA(KP831469612, T8M, T8L); + T5y = FNMS(KP923879532, T4n, T3S); + T5B = T5z + T5A; + cr[WS(rs, 11)] = FMA(KP831469612, T5B, T5y); + ci[WS(rs, 4)] = FNMS(KP831469612, T5B, T5y); + } + { + E T5G, T5N, T8D, T8E; + T5G = FMA(KP923879532, T5F, T5C); + T5N = T5J + T5M; + cr[WS(rs, 15)] = FNMS(KP980785280, T5N, T5G); + ci[0] = FMA(KP980785280, T5N, T5G); + T8D = FMA(KP923879532, T8C, T8B); + T8E = T5Q - T5P; + cr[WS(rs, 31)] = FMS(KP980785280, T8E, T8D); + ci[WS(rs, 16)] = FMA(KP980785280, T8E, T8D); + } + { + E T8F, T8G, T5O, T5R; + T8F = FNMS(KP923879532, T8C, T8B); + T8G = T5M - T5J; + cr[WS(rs, 23)] = FMS(KP980785280, T8G, T8F); + ci[WS(rs, 24)] = FMA(KP980785280, T8G, T8F); + T5O = FNMS(KP923879532, T5F, T5C); + T5R = T5P + T5Q; + ci[WS(rs, 8)] = FNMS(KP980785280, T5R, T5O); + cr[WS(rs, 7)] = FMA(KP980785280, T5R, T5O); + } + } + { + E T6I, T7m, T7w, T7A, T8l, T8r, T6T, T8m, T75, T7k, T7p, T8s, T7t, T7z, T7g; + E T7j; + { + E T6E, T6H, T7u, T7v; + T6E = T8 - Tl; + T6H = T6F - T6G; + T6I = T6E - T6H; + T7m = T6E + T6H; + T7u = T76 + T79; + T7v = T7e - T7d; + T7w = FNMS(KP414213562, T7v, T7u); + T7A = FMA(KP414213562, T7u, T7v); + } + { + E T8j, T8k, T6N, T6S; + T8j = Tz - TM; + T8k = T87 - T83; + T8l = T8j + T8k; + T8r = T8k - T8j; + T6N = T6J + T6M; + T6S = T6O - T6R; + T6T = T6N + T6S; + T8m = T6N - T6S; + } + { + E T6Z, T74, T7n, T7o; + T6Z = T6V - T6Y; + T74 = T72 - T73; + T75 = FMA(KP414213562, T74, T6Z); + T7k = FNMS(KP414213562, T6Z, T74); + T7n = T6J - T6M; + T7o = T6O + T6R; + T7p = T7n + T7o; + T8s = T7o - T7n; + } + { + E T7r, T7s, T7a, T7f; + T7r = T6V + T6Y; + T7s = T72 + T73; + T7t = FNMS(KP414213562, T7s, T7r); + T7z = FMA(KP414213562, T7r, T7s); + T7a = T76 - T79; + T7f = T7d + T7e; + T7g = FNMS(KP414213562, T7f, T7a); + T7j = FMA(KP414213562, T7a, T7f); + } + { + E T6U, T7h, T8t, T8u; + T6U = FMA(KP707106781, T6T, T6I); + T7h = T75 + T7g; + ci[WS(rs, 13)] = FNMS(KP923879532, T7h, T6U); + cr[WS(rs, 2)] = FMA(KP923879532, T7h, T6U); + T8t = FMA(KP707106781, T8s, T8r); + T8u = T7k + T7j; + cr[WS(rs, 18)] = FMS(KP923879532, T8u, T8t); + ci[WS(rs, 29)] = FMA(KP923879532, T8u, T8t); + } + { + E T8v, T8w, T7i, T7l; + T8v = FNMS(KP707106781, T8s, T8r); + T8w = T7g - T75; + cr[WS(rs, 26)] = FMS(KP923879532, T8w, T8v); + ci[WS(rs, 21)] = FMA(KP923879532, T8w, T8v); + T7i = FNMS(KP707106781, T6T, T6I); + T7l = T7j - T7k; + cr[WS(rs, 10)] = FNMS(KP923879532, T7l, T7i); + ci[WS(rs, 5)] = FMA(KP923879532, T7l, T7i); + } + { + E T7q, T7x, T8n, T8o; + T7q = FMA(KP707106781, T7p, T7m); + T7x = T7t + T7w; + cr[WS(rs, 14)] = FNMS(KP923879532, T7x, T7q); + ci[WS(rs, 1)] = FMA(KP923879532, T7x, T7q); + T8n = FMA(KP707106781, T8m, T8l); + T8o = T7A - T7z; + cr[WS(rs, 30)] = FMS(KP923879532, T8o, T8n); + ci[WS(rs, 17)] = FMA(KP923879532, T8o, T8n); + } + { + E T8p, T8q, T7y, T7B; + T8p = FNMS(KP707106781, T8m, T8l); + T8q = T7w - T7t; + cr[WS(rs, 22)] = FMS(KP923879532, T8q, T8p); + ci[WS(rs, 25)] = FMA(KP923879532, T8q, T8p); + T7y = FNMS(KP707106781, T7p, T7m); + T7B = T7z + T7A; + ci[WS(rs, 9)] = FNMS(KP923879532, T7B, T7y); + cr[WS(rs, 6)] = FMA(KP923879532, T7B, T7y); + } + } + { + E T5W, T6o, T63, T8W, T8P, T8V, T6r, T8Q, T6i, T6C, T6l, T6y, T6b, T6B, T6m; + E T6v; + { + E T5S, T5V, T6p, T6q; + T5S = T3w + T3B; + T5V = T5T + T5U; + T5W = FMA(KP707106781, T5V, T5S); + T6o = FNMS(KP707106781, T5V, T5S); + { + E T5Z, T62, T8N, T8O; + T5Z = FMA(KP414213562, T5Y, T5X); + T62 = FNMS(KP414213562, T61, T60); + T63 = T5Z + T62; + T8W = T5Z - T62; + T8N = T8y - T8x; + T8O = T3Q - T3J; + T8P = FMA(KP707106781, T8O, T8N); + T8V = FNMS(KP707106781, T8O, T8N); + } + T6p = FMA(KP414213562, T60, T61); + T6q = FNMS(KP414213562, T5X, T5Y); + T6r = T6p - T6q; + T8Q = T6q + T6p; + { + E T6e, T6w, T6h, T6x, T6d, T6g; + T6d = T5t + T5s; + T6e = FMA(KP707106781, T6d, T6c); + T6w = FNMS(KP707106781, T6d, T6c); + T6g = T5i - T5b; + T6h = FMA(KP707106781, T6g, T6f); + T6x = FNMS(KP707106781, T6g, T6f); + T6i = FNMS(KP198912367, T6h, T6e); + T6C = FNMS(KP668178637, T6w, T6x); + T6l = FMA(KP198912367, T6e, T6h); + T6y = FMA(KP668178637, T6x, T6w); + } + { + E T67, T6t, T6a, T6u, T66, T69; + T66 = T4T - T4U; + T67 = FMA(KP707106781, T66, T65); + T6t = FNMS(KP707106781, T66, T65); + T69 = T4J - T4C; + T6a = FMA(KP707106781, T69, T68); + T6u = FNMS(KP707106781, T69, T68); + T6b = FMA(KP198912367, T6a, T67); + T6B = FMA(KP668178637, T6t, T6u); + T6m = FNMS(KP198912367, T67, T6a); + T6v = FNMS(KP668178637, T6u, T6t); + } + } + { + E T64, T6j, T8X, T8Y; + T64 = FMA(KP923879532, T63, T5W); + T6j = T6b + T6i; + ci[WS(rs, 14)] = FNMS(KP980785280, T6j, T64); + cr[WS(rs, 1)] = FMA(KP980785280, T6j, T64); + T8X = FMA(KP923879532, T8W, T8V); + T8Y = T6B + T6C; + cr[WS(rs, 29)] = -(FMA(KP831469612, T8Y, T8X)); + ci[WS(rs, 18)] = FNMS(KP831469612, T8Y, T8X); + } + { + E T8Z, T90, T6k, T6n; + T8Z = FNMS(KP923879532, T8W, T8V); + T90 = T6y - T6v; + cr[WS(rs, 21)] = FMS(KP831469612, T90, T8Z); + ci[WS(rs, 26)] = FMA(KP831469612, T90, T8Z); + T6k = FNMS(KP923879532, T63, T5W); + T6n = T6l - T6m; + cr[WS(rs, 9)] = FNMS(KP980785280, T6n, T6k); + ci[WS(rs, 6)] = FMA(KP980785280, T6n, T6k); + } + { + E T6s, T6z, T8R, T8S; + T6s = FMA(KP923879532, T6r, T6o); + T6z = T6v + T6y; + cr[WS(rs, 13)] = FNMS(KP831469612, T6z, T6s); + ci[WS(rs, 2)] = FMA(KP831469612, T6z, T6s); + T8R = FMA(KP923879532, T8Q, T8P); + T8S = T6m + T6l; + cr[WS(rs, 17)] = FMS(KP980785280, T8S, T8R); + ci[WS(rs, 30)] = FMA(KP980785280, T8S, T8R); + } + { + E T8T, T8U, T6A, T6D; + T8T = FNMS(KP923879532, T8Q, T8P); + T8U = T6i - T6b; + cr[WS(rs, 25)] = FMS(KP980785280, T8U, T8T); + ci[WS(rs, 22)] = FMA(KP980785280, T8U, T8T); + T6A = FNMS(KP923879532, T6r, T6o); + T6D = T6B - T6C; + ci[WS(rs, 10)] = FNMS(KP831469612, T6D, T6A); + cr[WS(rs, 5)] = FMA(KP831469612, T6D, T6A); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hf_32", twinstr, &GENUS, {236, 62, 198, 0} }; + +void X(codelet_hf_32) (planner *p) { + X(khc2hc_register) (p, hf_32, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 32 -dit -name hf_32 -include rdft/scalar/hf.h */ + +/* + * This function contains 434 FP additions, 208 FP multiplications, + * (or, 340 additions, 114 multiplications, 94 fused multiply/add), + * 96 stack variables, 7 constants, and 128 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_32(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 62); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 62, MAKE_VOLATILE_STRIDE(64, rs)) { + E Tj, T5F, T7C, T7Q, T35, T4T, T78, T7m, T1Q, T61, T5Y, T6J, T3K, T56, T41; + E T59, T2B, T67, T6e, T6O, T4b, T5g, T4s, T5d, TG, T7l, T5I, T73, T3a, T4U; + E T3f, T4V, T14, T5K, T5N, T6F, T3m, T4Z, T3r, T4Y, T1r, T5P, T5S, T6E, T3x; + E T52, T3C, T51, T2d, T5Z, T64, T6K, T3V, T5a, T44, T57, T2Y, T6f, T6a, T6P; + E T4m, T5e, T4v, T5h; + { + E T1, T76, T6, T75, Tc, T32, Th, T33; + T1 = cr[0]; + T76 = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 16)]; + T5 = ci[WS(rs, 16)]; + T2 = W[30]; + T4 = W[31]; + T6 = FMA(T2, T3, T4 * T5); + T75 = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 8)]; + Tb = ci[WS(rs, 8)]; + T8 = W[14]; + Ta = W[15]; + Tc = FMA(T8, T9, Ta * Tb); + T32 = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 24)]; + Tg = ci[WS(rs, 24)]; + Td = W[46]; + Tf = W[47]; + Th = FMA(Td, Te, Tf * Tg); + T33 = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, T7A, T7B; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 + Ti; + T5F = T7 - Ti; + T7A = Tc - Th; + T7B = T76 - T75; + T7C = T7A + T7B; + T7Q = T7B - T7A; + } + { + E T31, T34, T74, T77; + T31 = T1 - T6; + T34 = T32 - T33; + T35 = T31 + T34; + T4T = T31 - T34; + T74 = T32 + T33; + T77 = T75 + T76; + T78 = T74 + T77; + T7m = T77 - T74; + } + } + { + E T1y, T3X, T1O, T3I, T1D, T3Y, T1J, T3H; + { + E T1v, T1x, T1u, T1w; + T1v = cr[WS(rs, 1)]; + T1x = ci[WS(rs, 1)]; + T1u = W[0]; + T1w = W[1]; + T1y = FMA(T1u, T1v, T1w * T1x); + T3X = FNMS(T1w, T1v, T1u * T1x); + } + { + E T1L, T1N, T1K, T1M; + T1L = cr[WS(rs, 25)]; + T1N = ci[WS(rs, 25)]; + T1K = W[48]; + T1M = W[49]; + T1O = FMA(T1K, T1L, T1M * T1N); + T3I = FNMS(T1M, T1L, T1K * T1N); + } + { + E T1A, T1C, T1z, T1B; + T1A = cr[WS(rs, 17)]; + T1C = ci[WS(rs, 17)]; + T1z = W[32]; + T1B = W[33]; + T1D = FMA(T1z, T1A, T1B * T1C); + T3Y = FNMS(T1B, T1A, T1z * T1C); + } + { + E T1G, T1I, T1F, T1H; + T1G = cr[WS(rs, 9)]; + T1I = ci[WS(rs, 9)]; + T1F = W[16]; + T1H = W[17]; + T1J = FMA(T1F, T1G, T1H * T1I); + T3H = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1E, T1P, T5W, T5X; + T1E = T1y + T1D; + T1P = T1J + T1O; + T1Q = T1E + T1P; + T61 = T1E - T1P; + T5W = T3X + T3Y; + T5X = T3H + T3I; + T5Y = T5W - T5X; + T6J = T5W + T5X; + } + { + E T3G, T3J, T3Z, T40; + T3G = T1y - T1D; + T3J = T3H - T3I; + T3K = T3G + T3J; + T56 = T3G - T3J; + T3Z = T3X - T3Y; + T40 = T1J - T1O; + T41 = T3Z - T40; + T59 = T3Z + T40; + } + } + { + E T2j, T47, T2z, T4q, T2o, T48, T2u, T4p; + { + E T2g, T2i, T2f, T2h; + T2g = cr[WS(rs, 31)]; + T2i = ci[WS(rs, 31)]; + T2f = W[60]; + T2h = W[61]; + T2j = FMA(T2f, T2g, T2h * T2i); + T47 = FNMS(T2h, T2g, T2f * T2i); + } + { + E T2w, T2y, T2v, T2x; + T2w = cr[WS(rs, 23)]; + T2y = ci[WS(rs, 23)]; + T2v = W[44]; + T2x = W[45]; + T2z = FMA(T2v, T2w, T2x * T2y); + T4q = FNMS(T2x, T2w, T2v * T2y); + } + { + E T2l, T2n, T2k, T2m; + T2l = cr[WS(rs, 15)]; + T2n = ci[WS(rs, 15)]; + T2k = W[28]; + T2m = W[29]; + T2o = FMA(T2k, T2l, T2m * T2n); + T48 = FNMS(T2m, T2l, T2k * T2n); + } + { + E T2r, T2t, T2q, T2s; + T2r = cr[WS(rs, 7)]; + T2t = ci[WS(rs, 7)]; + T2q = W[12]; + T2s = W[13]; + T2u = FMA(T2q, T2r, T2s * T2t); + T4p = FNMS(T2s, T2r, T2q * T2t); + } + { + E T2p, T2A, T6c, T6d; + T2p = T2j + T2o; + T2A = T2u + T2z; + T2B = T2p + T2A; + T67 = T2p - T2A; + T6c = T47 + T48; + T6d = T4p + T4q; + T6e = T6c - T6d; + T6O = T6c + T6d; + } + { + E T49, T4a, T4o, T4r; + T49 = T47 - T48; + T4a = T2u - T2z; + T4b = T49 - T4a; + T5g = T49 + T4a; + T4o = T2j - T2o; + T4r = T4p - T4q; + T4s = T4o + T4r; + T5d = T4o - T4r; + } + } + { + E To, T37, TE, T3d, Tt, T38, Tz, T3c; + { + E Tl, Tn, Tk, Tm; + Tl = cr[WS(rs, 4)]; + Tn = ci[WS(rs, 4)]; + Tk = W[6]; + Tm = W[7]; + To = FMA(Tk, Tl, Tm * Tn); + T37 = FNMS(Tm, Tl, Tk * Tn); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 12)]; + TD = ci[WS(rs, 12)]; + TA = W[22]; + TC = W[23]; + TE = FMA(TA, TB, TC * TD); + T3d = FNMS(TC, TB, TA * TD); + } + { + E Tq, Ts, Tp, Tr; + Tq = cr[WS(rs, 20)]; + Ts = ci[WS(rs, 20)]; + Tp = W[38]; + Tr = W[39]; + Tt = FMA(Tp, Tq, Tr * Ts); + T38 = FNMS(Tr, Tq, Tp * Ts); + } + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 28)]; + Ty = ci[WS(rs, 28)]; + Tv = W[54]; + Tx = W[55]; + Tz = FMA(Tv, Tw, Tx * Ty); + T3c = FNMS(Tx, Tw, Tv * Ty); + } + { + E Tu, TF, T5G, T5H; + Tu = To + Tt; + TF = Tz + TE; + TG = Tu + TF; + T7l = Tu - TF; + T5G = T3c + T3d; + T5H = T37 + T38; + T5I = T5G - T5H; + T73 = T5H + T5G; + } + { + E T36, T39, T3b, T3e; + T36 = To - Tt; + T39 = T37 - T38; + T3a = T36 + T39; + T4U = T36 - T39; + T3b = Tz - TE; + T3e = T3c - T3d; + T3f = T3b - T3e; + T4V = T3b + T3e; + } + } + { + E TM, T3n, T12, T3k, TR, T3o, TX, T3j; + { + E TJ, TL, TI, TK; + TJ = cr[WS(rs, 2)]; + TL = ci[WS(rs, 2)]; + TI = W[2]; + TK = W[3]; + TM = FMA(TI, TJ, TK * TL); + T3n = FNMS(TK, TJ, TI * TL); + } + { + E TZ, T11, TY, T10; + TZ = cr[WS(rs, 26)]; + T11 = ci[WS(rs, 26)]; + TY = W[50]; + T10 = W[51]; + T12 = FMA(TY, TZ, T10 * T11); + T3k = FNMS(T10, TZ, TY * T11); + } + { + E TO, TQ, TN, TP; + TO = cr[WS(rs, 18)]; + TQ = ci[WS(rs, 18)]; + TN = W[34]; + TP = W[35]; + TR = FMA(TN, TO, TP * TQ); + T3o = FNMS(TP, TO, TN * TQ); + } + { + E TU, TW, TT, TV; + TU = cr[WS(rs, 10)]; + TW = ci[WS(rs, 10)]; + TT = W[18]; + TV = W[19]; + TX = FMA(TT, TU, TV * TW); + T3j = FNMS(TV, TU, TT * TW); + } + { + E TS, T13, T5L, T5M; + TS = TM + TR; + T13 = TX + T12; + T14 = TS + T13; + T5K = TS - T13; + T5L = T3n + T3o; + T5M = T3j + T3k; + T5N = T5L - T5M; + T6F = T5L + T5M; + } + { + E T3i, T3l, T3p, T3q; + T3i = TM - TR; + T3l = T3j - T3k; + T3m = T3i + T3l; + T4Z = T3i - T3l; + T3p = T3n - T3o; + T3q = TX - T12; + T3r = T3p - T3q; + T4Y = T3p + T3q; + } + } + { + E T19, T3t, T1p, T3A, T1e, T3u, T1k, T3z; + { + E T16, T18, T15, T17; + T16 = cr[WS(rs, 30)]; + T18 = ci[WS(rs, 30)]; + T15 = W[58]; + T17 = W[59]; + T19 = FMA(T15, T16, T17 * T18); + T3t = FNMS(T17, T16, T15 * T18); + } + { + E T1m, T1o, T1l, T1n; + T1m = cr[WS(rs, 22)]; + T1o = ci[WS(rs, 22)]; + T1l = W[42]; + T1n = W[43]; + T1p = FMA(T1l, T1m, T1n * T1o); + T3A = FNMS(T1n, T1m, T1l * T1o); + } + { + E T1b, T1d, T1a, T1c; + T1b = cr[WS(rs, 14)]; + T1d = ci[WS(rs, 14)]; + T1a = W[26]; + T1c = W[27]; + T1e = FMA(T1a, T1b, T1c * T1d); + T3u = FNMS(T1c, T1b, T1a * T1d); + } + { + E T1h, T1j, T1g, T1i; + T1h = cr[WS(rs, 6)]; + T1j = ci[WS(rs, 6)]; + T1g = W[10]; + T1i = W[11]; + T1k = FMA(T1g, T1h, T1i * T1j); + T3z = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1f, T1q, T5Q, T5R; + T1f = T19 + T1e; + T1q = T1k + T1p; + T1r = T1f + T1q; + T5P = T1f - T1q; + T5Q = T3t + T3u; + T5R = T3z + T3A; + T5S = T5Q - T5R; + T6E = T5Q + T5R; + } + { + E T3v, T3w, T3y, T3B; + T3v = T3t - T3u; + T3w = T1k - T1p; + T3x = T3v - T3w; + T52 = T3v + T3w; + T3y = T19 - T1e; + T3B = T3z - T3A; + T3C = T3y + T3B; + T51 = T3y - T3B; + } + } + { + E T1V, T3M, T20, T3N, T3L, T3O, T26, T3Q, T2b, T3R, T3S, T3T; + { + E T1S, T1U, T1R, T1T; + T1S = cr[WS(rs, 5)]; + T1U = ci[WS(rs, 5)]; + T1R = W[8]; + T1T = W[9]; + T1V = FMA(T1R, T1S, T1T * T1U); + T3M = FNMS(T1T, T1S, T1R * T1U); + } + { + E T1X, T1Z, T1W, T1Y; + T1X = cr[WS(rs, 21)]; + T1Z = ci[WS(rs, 21)]; + T1W = W[40]; + T1Y = W[41]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T3N = FNMS(T1Y, T1X, T1W * T1Z); + } + T3L = T1V - T20; + T3O = T3M - T3N; + { + E T23, T25, T22, T24; + T23 = cr[WS(rs, 29)]; + T25 = ci[WS(rs, 29)]; + T22 = W[56]; + T24 = W[57]; + T26 = FMA(T22, T23, T24 * T25); + T3Q = FNMS(T24, T23, T22 * T25); + } + { + E T28, T2a, T27, T29; + T28 = cr[WS(rs, 13)]; + T2a = ci[WS(rs, 13)]; + T27 = W[24]; + T29 = W[25]; + T2b = FMA(T27, T28, T29 * T2a); + T3R = FNMS(T29, T28, T27 * T2a); + } + T3S = T3Q - T3R; + T3T = T26 - T2b; + { + E T21, T2c, T62, T63; + T21 = T1V + T20; + T2c = T26 + T2b; + T2d = T21 + T2c; + T5Z = T21 - T2c; + T62 = T3Q + T3R; + T63 = T3M + T3N; + T64 = T62 - T63; + T6K = T63 + T62; + } + { + E T3P, T3U, T42, T43; + T3P = T3L + T3O; + T3U = T3S - T3T; + T3V = KP707106781 * (T3P - T3U); + T5a = KP707106781 * (T3P + T3U); + T42 = T3T + T3S; + T43 = T3L - T3O; + T44 = KP707106781 * (T42 - T43); + T57 = KP707106781 * (T43 + T42); + } + } + { + E T2G, T4i, T2L, T4j, T4h, T4k, T2R, T4d, T2W, T4e, T4c, T4f; + { + E T2D, T2F, T2C, T2E; + T2D = cr[WS(rs, 3)]; + T2F = ci[WS(rs, 3)]; + T2C = W[4]; + T2E = W[5]; + T2G = FMA(T2C, T2D, T2E * T2F); + T4i = FNMS(T2E, T2D, T2C * T2F); + } + { + E T2I, T2K, T2H, T2J; + T2I = cr[WS(rs, 19)]; + T2K = ci[WS(rs, 19)]; + T2H = W[36]; + T2J = W[37]; + T2L = FMA(T2H, T2I, T2J * T2K); + T4j = FNMS(T2J, T2I, T2H * T2K); + } + T4h = T2G - T2L; + T4k = T4i - T4j; + { + E T2O, T2Q, T2N, T2P; + T2O = cr[WS(rs, 27)]; + T2Q = ci[WS(rs, 27)]; + T2N = W[52]; + T2P = W[53]; + T2R = FMA(T2N, T2O, T2P * T2Q); + T4d = FNMS(T2P, T2O, T2N * T2Q); + } + { + E T2T, T2V, T2S, T2U; + T2T = cr[WS(rs, 11)]; + T2V = ci[WS(rs, 11)]; + T2S = W[20]; + T2U = W[21]; + T2W = FMA(T2S, T2T, T2U * T2V); + T4e = FNMS(T2U, T2T, T2S * T2V); + } + T4c = T2R - T2W; + T4f = T4d - T4e; + { + E T2M, T2X, T68, T69; + T2M = T2G + T2L; + T2X = T2R + T2W; + T2Y = T2M + T2X; + T6f = T2M - T2X; + T68 = T4d + T4e; + T69 = T4i + T4j; + T6a = T68 - T69; + T6P = T69 + T68; + } + { + E T4g, T4l, T4t, T4u; + T4g = T4c + T4f; + T4l = T4h - T4k; + T4m = KP707106781 * (T4g - T4l); + T5e = KP707106781 * (T4l + T4g); + T4t = T4h + T4k; + T4u = T4f - T4c; + T4v = KP707106781 * (T4t - T4u); + T5h = KP707106781 * (T4t + T4u); + } + } + { + E T1t, T6X, T7a, T7c, T30, T7b, T70, T71; + { + E TH, T1s, T72, T79; + TH = Tj + TG; + T1s = T14 + T1r; + T1t = TH + T1s; + T6X = TH - T1s; + T72 = T6F + T6E; + T79 = T73 + T78; + T7a = T72 + T79; + T7c = T79 - T72; + } + { + E T2e, T2Z, T6Y, T6Z; + T2e = T1Q + T2d; + T2Z = T2B + T2Y; + T30 = T2e + T2Z; + T7b = T2Z - T2e; + T6Y = T6O + T6P; + T6Z = T6J + T6K; + T70 = T6Y - T6Z; + T71 = T6Z + T6Y; + } + ci[WS(rs, 15)] = T1t - T30; + cr[WS(rs, 24)] = T7b - T7c; + ci[WS(rs, 23)] = T7b + T7c; + cr[0] = T1t + T30; + cr[WS(rs, 8)] = T6X - T70; + cr[WS(rs, 16)] = T71 - T7a; + ci[WS(rs, 31)] = T71 + T7a; + ci[WS(rs, 7)] = T6X + T70; + } + { + E T4X, T5p, T7D, T7J, T54, T7y, T5z, T5D, T5c, T5m, T5s, T7I, T5w, T5C, T5j; + E T5n, T4W, T7z; + T4W = KP707106781 * (T4U + T4V); + T4X = T4T - T4W; + T5p = T4T + T4W; + T7z = KP707106781 * (T3a - T3f); + T7D = T7z + T7C; + T7J = T7C - T7z; + { + E T50, T53, T5x, T5y; + T50 = FMA(KP923879532, T4Y, KP382683432 * T4Z); + T53 = FNMS(KP923879532, T52, KP382683432 * T51); + T54 = T50 + T53; + T7y = T50 - T53; + T5x = T5d + T5e; + T5y = T5g + T5h; + T5z = FNMS(KP980785280, T5y, KP195090322 * T5x); + T5D = FMA(KP980785280, T5x, KP195090322 * T5y); + } + { + E T58, T5b, T5q, T5r; + T58 = T56 - T57; + T5b = T59 - T5a; + T5c = FMA(KP831469612, T58, KP555570233 * T5b); + T5m = FNMS(KP831469612, T5b, KP555570233 * T58); + T5q = FNMS(KP382683432, T4Y, KP923879532 * T4Z); + T5r = FMA(KP382683432, T52, KP923879532 * T51); + T5s = T5q + T5r; + T7I = T5r - T5q; + } + { + E T5u, T5v, T5f, T5i; + T5u = T56 + T57; + T5v = T59 + T5a; + T5w = FMA(KP195090322, T5u, KP980785280 * T5v); + T5C = FNMS(KP195090322, T5v, KP980785280 * T5u); + T5f = T5d - T5e; + T5i = T5g - T5h; + T5j = FNMS(KP555570233, T5i, KP831469612 * T5f); + T5n = FMA(KP555570233, T5f, KP831469612 * T5i); + } + { + E T55, T5k, T7H, T7K; + T55 = T4X + T54; + T5k = T5c + T5j; + ci[WS(rs, 12)] = T55 - T5k; + cr[WS(rs, 3)] = T55 + T5k; + T7H = T5n - T5m; + T7K = T7I + T7J; + cr[WS(rs, 19)] = T7H - T7K; + ci[WS(rs, 28)] = T7H + T7K; + } + { + E T7L, T7M, T5l, T5o; + T7L = T5j - T5c; + T7M = T7J - T7I; + cr[WS(rs, 27)] = T7L - T7M; + ci[WS(rs, 20)] = T7L + T7M; + T5l = T4X - T54; + T5o = T5m + T5n; + cr[WS(rs, 11)] = T5l - T5o; + ci[WS(rs, 4)] = T5l + T5o; + } + { + E T5t, T5A, T7x, T7E; + T5t = T5p - T5s; + T5A = T5w + T5z; + ci[WS(rs, 8)] = T5t - T5A; + cr[WS(rs, 7)] = T5t + T5A; + T7x = T5z - T5w; + T7E = T7y + T7D; + cr[WS(rs, 31)] = T7x - T7E; + ci[WS(rs, 16)] = T7x + T7E; + } + { + E T7F, T7G, T5B, T5E; + T7F = T5D - T5C; + T7G = T7D - T7y; + cr[WS(rs, 23)] = T7F - T7G; + ci[WS(rs, 24)] = T7F + T7G; + T5B = T5p + T5s; + T5E = T5C + T5D; + cr[WS(rs, 15)] = T5B - T5E; + ci[0] = T5B + T5E; + } + } + { + E T6H, T6T, T7g, T7i, T6M, T6U, T6R, T6V; + { + E T6D, T6G, T7e, T7f; + T6D = Tj - TG; + T6G = T6E - T6F; + T6H = T6D - T6G; + T6T = T6D + T6G; + T7e = T14 - T1r; + T7f = T78 - T73; + T7g = T7e + T7f; + T7i = T7f - T7e; + } + { + E T6I, T6L, T6N, T6Q; + T6I = T1Q - T2d; + T6L = T6J - T6K; + T6M = T6I + T6L; + T6U = T6I - T6L; + T6N = T2B - T2Y; + T6Q = T6O - T6P; + T6R = T6N - T6Q; + T6V = T6N + T6Q; + } + { + E T6S, T7h, T6W, T7d; + T6S = KP707106781 * (T6M + T6R); + ci[WS(rs, 11)] = T6H - T6S; + cr[WS(rs, 4)] = T6H + T6S; + T7h = KP707106781 * (T6V - T6U); + cr[WS(rs, 20)] = T7h - T7i; + ci[WS(rs, 27)] = T7h + T7i; + T6W = KP707106781 * (T6U + T6V); + cr[WS(rs, 12)] = T6T - T6W; + ci[WS(rs, 3)] = T6T + T6W; + T7d = KP707106781 * (T6R - T6M); + cr[WS(rs, 28)] = T7d - T7g; + ci[WS(rs, 19)] = T7d + T7g; + } + } + { + E T5J, T7n, T7t, T6n, T5U, T7k, T6x, T6B, T6q, T7s, T66, T6k, T6u, T6A, T6h; + E T6l; + { + E T5O, T5T, T60, T65; + T5J = T5F - T5I; + T7n = T7l + T7m; + T7t = T7m - T7l; + T6n = T5F + T5I; + T5O = T5K + T5N; + T5T = T5P - T5S; + T5U = KP707106781 * (T5O + T5T); + T7k = KP707106781 * (T5O - T5T); + { + E T6v, T6w, T6o, T6p; + T6v = T6e + T6f; + T6w = T67 + T6a; + T6x = FMA(KP382683432, T6v, KP923879532 * T6w); + T6B = FNMS(KP923879532, T6v, KP382683432 * T6w); + T6o = T5K - T5N; + T6p = T5P + T5S; + T6q = KP707106781 * (T6o + T6p); + T7s = KP707106781 * (T6p - T6o); + } + T60 = T5Y - T5Z; + T65 = T61 - T64; + T66 = FMA(KP382683432, T60, KP923879532 * T65); + T6k = FNMS(KP923879532, T60, KP382683432 * T65); + { + E T6s, T6t, T6b, T6g; + T6s = T61 + T64; + T6t = T5Y + T5Z; + T6u = FNMS(KP382683432, T6t, KP923879532 * T6s); + T6A = FMA(KP923879532, T6t, KP382683432 * T6s); + T6b = T67 - T6a; + T6g = T6e - T6f; + T6h = FNMS(KP382683432, T6g, KP923879532 * T6b); + T6l = FMA(KP923879532, T6g, KP382683432 * T6b); + } + } + { + E T5V, T6i, T7r, T7u; + T5V = T5J + T5U; + T6i = T66 + T6h; + ci[WS(rs, 13)] = T5V - T6i; + cr[WS(rs, 2)] = T5V + T6i; + T7r = T6l - T6k; + T7u = T7s + T7t; + cr[WS(rs, 18)] = T7r - T7u; + ci[WS(rs, 29)] = T7r + T7u; + } + { + E T7v, T7w, T6j, T6m; + T7v = T6h - T66; + T7w = T7t - T7s; + cr[WS(rs, 26)] = T7v - T7w; + ci[WS(rs, 21)] = T7v + T7w; + T6j = T5J - T5U; + T6m = T6k + T6l; + cr[WS(rs, 10)] = T6j - T6m; + ci[WS(rs, 5)] = T6j + T6m; + } + { + E T6r, T6y, T7j, T7o; + T6r = T6n + T6q; + T6y = T6u + T6x; + cr[WS(rs, 14)] = T6r - T6y; + ci[WS(rs, 1)] = T6r + T6y; + T7j = T6B - T6A; + T7o = T7k + T7n; + cr[WS(rs, 30)] = T7j - T7o; + ci[WS(rs, 17)] = T7j + T7o; + } + { + E T7p, T7q, T6z, T6C; + T7p = T6x - T6u; + T7q = T7n - T7k; + cr[WS(rs, 22)] = T7p - T7q; + ci[WS(rs, 25)] = T7p + T7q; + T6z = T6n - T6q; + T6C = T6A + T6B; + ci[WS(rs, 9)] = T6z - T6C; + cr[WS(rs, 6)] = T6z + T6C; + } + } + { + E T3h, T4D, T7R, T7X, T3E, T7O, T4N, T4R, T46, T4A, T4G, T7W, T4K, T4Q, T4x; + E T4B, T3g, T7P; + T3g = KP707106781 * (T3a + T3f); + T3h = T35 - T3g; + T4D = T35 + T3g; + T7P = KP707106781 * (T4V - T4U); + T7R = T7P + T7Q; + T7X = T7Q - T7P; + { + E T3s, T3D, T4L, T4M; + T3s = FNMS(KP923879532, T3r, KP382683432 * T3m); + T3D = FMA(KP923879532, T3x, KP382683432 * T3C); + T3E = T3s + T3D; + T7O = T3D - T3s; + T4L = T4s + T4v; + T4M = T4b + T4m; + T4N = FNMS(KP195090322, T4M, KP980785280 * T4L); + T4R = FMA(KP980785280, T4M, KP195090322 * T4L); + } + { + E T3W, T45, T4E, T4F; + T3W = T3K - T3V; + T45 = T41 - T44; + T46 = FNMS(KP555570233, T45, KP831469612 * T3W); + T4A = FMA(KP831469612, T45, KP555570233 * T3W); + T4E = FMA(KP382683432, T3r, KP923879532 * T3m); + T4F = FNMS(KP382683432, T3x, KP923879532 * T3C); + T4G = T4E + T4F; + T7W = T4E - T4F; + } + { + E T4I, T4J, T4n, T4w; + T4I = T41 + T44; + T4J = T3K + T3V; + T4K = FMA(KP195090322, T4I, KP980785280 * T4J); + T4Q = FNMS(KP980785280, T4I, KP195090322 * T4J); + T4n = T4b - T4m; + T4w = T4s - T4v; + T4x = FMA(KP555570233, T4n, KP831469612 * T4w); + T4B = FNMS(KP831469612, T4n, KP555570233 * T4w); + } + { + E T3F, T4y, T7V, T7Y; + T3F = T3h + T3E; + T4y = T46 + T4x; + cr[WS(rs, 13)] = T3F - T4y; + ci[WS(rs, 2)] = T3F + T4y; + T7V = T4B - T4A; + T7Y = T7W + T7X; + cr[WS(rs, 29)] = T7V - T7Y; + ci[WS(rs, 18)] = T7V + T7Y; + } + { + E T7Z, T80, T4z, T4C; + T7Z = T4x - T46; + T80 = T7X - T7W; + cr[WS(rs, 21)] = T7Z - T80; + ci[WS(rs, 26)] = T7Z + T80; + T4z = T3h - T3E; + T4C = T4A + T4B; + ci[WS(rs, 10)] = T4z - T4C; + cr[WS(rs, 5)] = T4z + T4C; + } + { + E T4H, T4O, T7N, T7S; + T4H = T4D + T4G; + T4O = T4K + T4N; + ci[WS(rs, 14)] = T4H - T4O; + cr[WS(rs, 1)] = T4H + T4O; + T7N = T4R - T4Q; + T7S = T7O + T7R; + cr[WS(rs, 17)] = T7N - T7S; + ci[WS(rs, 30)] = T7N + T7S; + } + { + E T7T, T7U, T4P, T4S; + T7T = T4N - T4K; + T7U = T7R - T7O; + cr[WS(rs, 25)] = T7T - T7U; + ci[WS(rs, 22)] = T7T + T7U; + T4P = T4D - T4G; + T4S = T4Q + T4R; + cr[WS(rs, 9)] = T4P - T4S; + ci[WS(rs, 6)] = T4P + T4S; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 32}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 32, "hf_32", twinstr, &GENUS, {340, 114, 94, 0} }; + +void X(codelet_hf_32) (planner *p) { + X(khc2hc_register) (p, hf_32, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_4.c new file mode 100644 index 000000000..0f27f296b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_4.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -dit -name hf_4 -include rdft/scalar/hf.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 15 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, Tv, T7, Tu, Te, To, Tk, Tq; + T1 = cr[0]; + Tv = ci[0]; + { + E T3, T6, T4, Tt, T2, T5; + T3 = cr[WS(rs, 2)]; + T6 = ci[WS(rs, 2)]; + T2 = W[2]; + T4 = T2 * T3; + Tt = T2 * T6; + T5 = W[3]; + T7 = FMA(T5, T6, T4); + Tu = FNMS(T5, T3, Tt); + } + { + E Ta, Td, Tb, Tn, T9, Tc; + Ta = cr[WS(rs, 1)]; + Td = ci[WS(rs, 1)]; + T9 = W[0]; + Tb = T9 * Ta; + Tn = T9 * Td; + Tc = W[1]; + Te = FMA(Tc, Td, Tb); + To = FNMS(Tc, Ta, Tn); + } + { + E Tg, Tj, Th, Tp, Tf, Ti; + Tg = cr[WS(rs, 3)]; + Tj = ci[WS(rs, 3)]; + Tf = W[4]; + Th = Tf * Tg; + Tp = Tf * Tj; + Ti = W[5]; + Tk = FMA(Ti, Tj, Th); + Tq = FNMS(Ti, Tg, Tp); + } + { + E T8, Tl, Tm, Tr; + T8 = T1 + T7; + Tl = Te + Tk; + ci[WS(rs, 1)] = T8 - Tl; + cr[0] = T8 + Tl; + Tm = T1 - T7; + Tr = To - Tq; + ci[0] = Tm - Tr; + cr[WS(rs, 1)] = Tm + Tr; + } + { + E Ts, Tw, Tx, Ty; + Ts = To + Tq; + Tw = Tu + Tv; + cr[WS(rs, 2)] = Ts - Tw; + ci[WS(rs, 3)] = Ts + Tw; + Tx = Tk - Te; + Ty = Tv - Tu; + cr[WS(rs, 3)] = Tx - Ty; + ci[WS(rs, 2)] = Tx + Ty; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hf_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hf_4) (planner *p) { + X(khc2hc_register) (p, hf_4, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 4 -dit -name hf_4 -include rdft/scalar/hf.h */ + +/* + * This function contains 22 FP additions, 12 FP multiplications, + * (or, 16 additions, 6 multiplications, 6 fused multiply/add), + * 13 stack variables, 0 constants, and 16 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_4(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * 6); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 6, MAKE_VOLATILE_STRIDE(8, rs)) { + E T1, Tp, T6, To, Tc, Tk, Th, Tl; + T1 = cr[0]; + Tp = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 2)]; + T5 = ci[WS(rs, 2)]; + T2 = W[2]; + T4 = W[3]; + T6 = FMA(T2, T3, T4 * T5); + To = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 1)]; + Tb = ci[WS(rs, 1)]; + T8 = W[0]; + Ta = W[1]; + Tc = FMA(T8, T9, Ta * Tb); + Tk = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 3)]; + Tg = ci[WS(rs, 3)]; + Td = W[4]; + Tf = W[5]; + Th = FMA(Td, Te, Tf * Tg); + Tl = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, Tj, Tm; + T7 = T1 + T6; + Ti = Tc + Th; + ci[WS(rs, 1)] = T7 - Ti; + cr[0] = T7 + Ti; + Tj = T1 - T6; + Tm = Tk - Tl; + ci[0] = Tj - Tm; + cr[WS(rs, 1)] = Tj + Tm; + } + { + E Tn, Tq, Tr, Ts; + Tn = Tk + Tl; + Tq = To + Tp; + cr[WS(rs, 2)] = Tn - Tq; + ci[WS(rs, 3)] = Tn + Tq; + Tr = Th - Tc; + Ts = Tp - To; + cr[WS(rs, 3)] = Tr - Ts; + ci[WS(rs, 2)] = Tr + Ts; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 4}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 4, "hf_4", twinstr, &GENUS, {16, 6, 6, 0} }; + +void X(codelet_hf_4) (planner *p) { + X(khc2hc_register) (p, hf_4, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_5.c new file mode 100644 index 000000000..e8b0ceda4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_5.c @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 5 -dit -name hf_5 -include rdft/scalar/hf.h */ + +/* + * This function contains 40 FP additions, 34 FP multiplications, + * (or, 14 additions, 8 multiplications, 26 fused multiply/add), + * 31 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs)) { + E T1, TJ, T7, Tx, Td, Tz, Te, TK, Tk, TC, Tq, TE, Tr, TL; + T1 = cr[0]; + TJ = ci[0]; + { + E T3, T6, T4, Tw, T9, Tc, Ta, Ty, T2, T8, T5, Tb; + T3 = cr[WS(rs, 1)]; + T6 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + Tw = T2 * T6; + T9 = cr[WS(rs, 4)]; + Tc = ci[WS(rs, 4)]; + T8 = W[6]; + Ta = T8 * T9; + Ty = T8 * Tc; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + Tx = FNMS(T5, T3, Tw); + Tb = W[7]; + Td = FMA(Tb, Tc, Ta); + Tz = FNMS(Tb, T9, Ty); + Te = T7 + Td; + TK = Tx + Tz; + } + { + E Tg, Tj, Th, TB, Tm, Tp, Tn, TD, Tf, Tl, Ti, To; + Tg = cr[WS(rs, 2)]; + Tj = ci[WS(rs, 2)]; + Tf = W[2]; + Th = Tf * Tg; + TB = Tf * Tj; + Tm = cr[WS(rs, 3)]; + Tp = ci[WS(rs, 3)]; + Tl = W[4]; + Tn = Tl * Tm; + TD = Tl * Tp; + Ti = W[3]; + Tk = FMA(Ti, Tj, Th); + TC = FNMS(Ti, Tg, TB); + To = W[5]; + Tq = FMA(To, Tp, Tn); + TE = FNMS(To, Tm, TD); + Tr = Tk + Tq; + TL = TC + TE; + } + { + E Tu, Ts, Tt, TG, TI, TA, TF, Tv, TH; + Tu = Te - Tr; + Ts = Te + Tr; + Tt = FNMS(KP250000000, Ts, T1); + TA = Tx - Tz; + TF = TC - TE; + TG = FMA(KP618033988, TF, TA); + TI = FNMS(KP618033988, TA, TF); + cr[0] = T1 + Ts; + Tv = FMA(KP559016994, Tu, Tt); + ci[0] = FNMS(KP951056516, TG, Tv); + cr[WS(rs, 1)] = FMA(KP951056516, TG, Tv); + TH = FNMS(KP559016994, Tu, Tt); + cr[WS(rs, 2)] = FNMS(KP951056516, TI, TH); + ci[WS(rs, 1)] = FMA(KP951056516, TI, TH); + } + { + E TO, TM, TN, TS, TU, TQ, TR, TT, TP; + TO = TK - TL; + TM = TK + TL; + TN = FNMS(KP250000000, TM, TJ); + TQ = Tk - Tq; + TR = Td - T7; + TS = FMA(KP618033988, TR, TQ); + TU = FNMS(KP618033988, TQ, TR); + ci[WS(rs, 4)] = TM + TJ; + TT = FMA(KP559016994, TO, TN); + cr[WS(rs, 4)] = FMS(KP951056516, TU, TT); + ci[WS(rs, 3)] = FMA(KP951056516, TU, TT); + TP = FNMS(KP559016994, TO, TN); + cr[WS(rs, 3)] = FMS(KP951056516, TS, TP); + ci[WS(rs, 2)] = FMA(KP951056516, TS, TP); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 5}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hf_5", twinstr, &GENUS, {14, 8, 26, 0} }; + +void X(codelet_hf_5) (planner *p) { + X(khc2hc_register) (p, hf_5, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 5 -dit -name hf_5 -include rdft/scalar/hf.h */ + +/* + * This function contains 40 FP additions, 28 FP multiplications, + * (or, 26 additions, 14 multiplications, 14 fused multiply/add), + * 29 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_5(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 8); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 8, MAKE_VOLATILE_STRIDE(10, rs)) { + E T1, TE, Tu, Tx, TC, TB, TF, TG, TH, Tc, Tn, To; + T1 = cr[0]; + TE = ci[0]; + { + E T6, Ts, Tm, Tw, Tb, Tt, Th, Tv; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 1)]; + T5 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + Ts = FNMS(T4, T3, T2 * T5); + } + { + E Tj, Tl, Ti, Tk; + Tj = cr[WS(rs, 3)]; + Tl = ci[WS(rs, 3)]; + Ti = W[4]; + Tk = W[5]; + Tm = FMA(Ti, Tj, Tk * Tl); + Tw = FNMS(Tk, Tj, Ti * Tl); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 4)]; + Ta = ci[WS(rs, 4)]; + T7 = W[6]; + T9 = W[7]; + Tb = FMA(T7, T8, T9 * Ta); + Tt = FNMS(T9, T8, T7 * Ta); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 2)]; + Tg = ci[WS(rs, 2)]; + Td = W[2]; + Tf = W[3]; + Th = FMA(Td, Te, Tf * Tg); + Tv = FNMS(Tf, Te, Td * Tg); + } + Tu = Ts - Tt; + Tx = Tv - Tw; + TC = Th - Tm; + TB = Tb - T6; + TF = Ts + Tt; + TG = Tv + Tw; + TH = TF + TG; + Tc = T6 + Tb; + Tn = Th + Tm; + To = Tc + Tn; + } + cr[0] = T1 + To; + { + E Ty, TA, Tr, Tz, Tp, Tq; + Ty = FMA(KP951056516, Tu, KP587785252 * Tx); + TA = FNMS(KP587785252, Tu, KP951056516 * Tx); + Tp = KP559016994 * (Tc - Tn); + Tq = FNMS(KP250000000, To, T1); + Tr = Tp + Tq; + Tz = Tq - Tp; + ci[0] = Tr - Ty; + ci[WS(rs, 1)] = Tz + TA; + cr[WS(rs, 1)] = Tr + Ty; + cr[WS(rs, 2)] = Tz - TA; + } + ci[WS(rs, 4)] = TH + TE; + { + E TD, TL, TK, TM, TI, TJ; + TD = FMA(KP587785252, TB, KP951056516 * TC); + TL = FNMS(KP587785252, TC, KP951056516 * TB); + TI = FNMS(KP250000000, TH, TE); + TJ = KP559016994 * (TF - TG); + TK = TI - TJ; + TM = TJ + TI; + cr[WS(rs, 3)] = TD - TK; + ci[WS(rs, 3)] = TL + TM; + ci[WS(rs, 2)] = TD + TK; + cr[WS(rs, 4)] = TL - TM; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 5}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 5, "hf_5", twinstr, &GENUS, {26, 14, 14, 0} }; + +void X(codelet_hf_5) (planner *p) { + X(khc2hc_register) (p, hf_5, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_6.c new file mode 100644 index 000000000..369bc47a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_6.c @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -dit -name hf_6 -include rdft/scalar/hf.h */ + +/* + * This function contains 46 FP additions, 32 FP multiplications, + * (or, 24 additions, 10 multiplications, 22 fused multiply/add), + * 31 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_6(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs)) { + E T1, TV, T7, TX, Tl, TR, TB, TO, Ty, TS, TC, TJ; + T1 = cr[0]; + TV = ci[0]; + { + E T3, T6, T4, TW, T2, T5; + T3 = cr[WS(rs, 3)]; + T6 = ci[WS(rs, 3)]; + T2 = W[4]; + T4 = T2 * T3; + TW = T2 * T6; + T5 = W[5]; + T7 = FMA(T5, T6, T4); + TX = FNMS(T5, T3, TW); + } + { + E Ta, Td, Tb, TM, Tg, Tj, Th, TK, T9, Tf; + Ta = cr[WS(rs, 2)]; + Td = ci[WS(rs, 2)]; + T9 = W[2]; + Tb = T9 * Ta; + TM = T9 * Td; + Tg = cr[WS(rs, 5)]; + Tj = ci[WS(rs, 5)]; + Tf = W[8]; + Th = Tf * Tg; + TK = Tf * Tj; + { + E Te, TN, Tk, TL, Tc, Ti; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + TN = FNMS(Tc, Ta, TM); + Ti = W[9]; + Tk = FMA(Ti, Tj, Th); + TL = FNMS(Ti, Tg, TK); + Tl = Te - Tk; + TR = TN + TL; + TB = Te + Tk; + TO = TL - TN; + } + } + { + E Tn, Tq, To, TH, Tt, Tw, Tu, TF, Tm, Ts; + Tn = cr[WS(rs, 4)]; + Tq = ci[WS(rs, 4)]; + Tm = W[6]; + To = Tm * Tn; + TH = Tm * Tq; + Tt = cr[WS(rs, 1)]; + Tw = ci[WS(rs, 1)]; + Ts = W[0]; + Tu = Ts * Tt; + TF = Ts * Tw; + { + E Tr, TI, Tx, TG, Tp, Tv; + Tp = W[7]; + Tr = FMA(Tp, Tq, To); + TI = FNMS(Tp, Tn, TH); + Tv = W[1]; + Tx = FMA(Tv, Tw, Tu); + TG = FNMS(Tv, Tt, TF); + Ty = Tr - Tx; + TS = TI + TG; + TC = Tr + Tx; + TJ = TG - TI; + } + } + { + E TP, T8, Tz, TE; + TP = TJ - TO; + T8 = T1 - T7; + Tz = Tl + Ty; + TE = FNMS(KP500000000, Tz, T8); + ci[WS(rs, 2)] = T8 + Tz; + cr[WS(rs, 1)] = FMA(KP866025403, TP, TE); + ci[0] = FNMS(KP866025403, TP, TE); + } + { + E TT, TA, TD, TQ; + TT = TR - TS; + TA = T1 + T7; + TD = TB + TC; + TQ = FNMS(KP500000000, TD, TA); + cr[0] = TA + TD; + ci[WS(rs, 1)] = FMA(KP866025403, TT, TQ); + cr[WS(rs, 2)] = FNMS(KP866025403, TT, TQ); + } + { + E T10, TU, TY, TZ; + T10 = Ty - Tl; + TU = TO + TJ; + TY = TV - TX; + TZ = FMA(KP500000000, TU, TY); + cr[WS(rs, 3)] = TU - TY; + ci[WS(rs, 4)] = FMA(KP866025403, T10, TZ); + cr[WS(rs, 5)] = FMS(KP866025403, T10, TZ); + } + { + E T14, T11, T12, T13; + T14 = TB - TC; + T11 = TX + TV; + T12 = TR + TS; + T13 = FNMS(KP500000000, T12, T11); + cr[WS(rs, 4)] = FMS(KP866025403, T14, T13); + ci[WS(rs, 5)] = T12 + T11; + ci[WS(rs, 3)] = FMA(KP866025403, T14, T13); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 6, "hf_6", twinstr, &GENUS, {24, 10, 22, 0} }; + +void X(codelet_hf_6) (planner *p) { + X(khc2hc_register) (p, hf_6, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 6 -dit -name hf_6 -include rdft/scalar/hf.h */ + +/* + * This function contains 46 FP additions, 28 FP multiplications, + * (or, 32 additions, 14 multiplications, 14 fused multiply/add), + * 23 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_6(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 10); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 10, MAKE_VOLATILE_STRIDE(12, rs)) { + E T7, TS, Tv, TO, Tt, TJ, Tx, TF, Ti, TI, Tw, TC; + { + E T1, TM, T6, TN; + T1 = cr[0]; + TM = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 3)]; + T5 = ci[WS(rs, 3)]; + T2 = W[4]; + T4 = W[5]; + T6 = FMA(T2, T3, T4 * T5); + TN = FNMS(T4, T3, T2 * T5); + } + T7 = T1 - T6; + TS = TN + TM; + Tv = T1 + T6; + TO = TM - TN; + } + { + E Tn, TE, Ts, TD; + { + E Tk, Tm, Tj, Tl; + Tk = cr[WS(rs, 4)]; + Tm = ci[WS(rs, 4)]; + Tj = W[6]; + Tl = W[7]; + Tn = FMA(Tj, Tk, Tl * Tm); + TE = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = cr[WS(rs, 1)]; + Tr = ci[WS(rs, 1)]; + To = W[0]; + Tq = W[1]; + Ts = FMA(To, Tp, Tq * Tr); + TD = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn - Ts; + TJ = TE + TD; + Tx = Tn + Ts; + TF = TD - TE; + } + { + E Tc, TA, Th, TB; + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 2)]; + Tb = ci[WS(rs, 2)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + TA = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 5)]; + Tg = ci[WS(rs, 5)]; + Td = W[8]; + Tf = W[9]; + Th = FMA(Td, Te, Tf * Tg); + TB = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc - Th; + TI = TA + TB; + Tw = Tc + Th; + TC = TA - TB; + } + { + E TG, Tu, Tz, TK, Ty, TH; + TG = KP866025403 * (TC + TF); + Tu = Ti + Tt; + Tz = FNMS(KP500000000, Tu, T7); + ci[WS(rs, 2)] = T7 + Tu; + cr[WS(rs, 1)] = Tz + TG; + ci[0] = Tz - TG; + TK = KP866025403 * (TI - TJ); + Ty = Tw + Tx; + TH = FNMS(KP500000000, Ty, Tv); + cr[0] = Tv + Ty; + ci[WS(rs, 1)] = TH + TK; + cr[WS(rs, 2)] = TH - TK; + } + { + E TP, TL, TQ, TR, TT, TU; + TP = KP866025403 * (Tt - Ti); + TL = TF - TC; + TQ = FMA(KP500000000, TL, TO); + cr[WS(rs, 3)] = TL - TO; + ci[WS(rs, 4)] = TP + TQ; + cr[WS(rs, 5)] = TP - TQ; + TR = KP866025403 * (Tw - Tx); + TT = TI + TJ; + TU = FNMS(KP500000000, TT, TS); + cr[WS(rs, 4)] = TR - TU; + ci[WS(rs, 5)] = TT + TS; + ci[WS(rs, 3)] = TR + TU; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 6}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 6, "hf_6", twinstr, &GENUS, {32, 14, 14, 0} }; + +void X(codelet_hf_6) (planner *p) { + X(khc2hc_register) (p, hf_6, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_64.c new file mode 100644 index 000000000..ca16c069c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_64.c @@ -0,0 +1,4105 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:31 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 64 -dit -name hf_64 -include rdft/scalar/hf.h */ + +/* + * This function contains 1038 FP additions, 644 FP multiplications, + * (or, 520 additions, 126 multiplications, 518 fused multiply/add), + * 190 stack variables, 15 constants, and 256 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_64(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 126); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 126, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tm, TeM, TjR, Tkl, T7e, TcA, TiV, Tjm, T1G, TeW, TeZ, Thr, T7Q, TcI, T7X; + E TcJ, T29, Tf8, Tf5, Thw, T87, TcN, T8u, TcQ, T5K, TfS, Tgc, ThX, Taq, Tdm; + E Tbj, Tdx, TN, Tjl, TeP, TiP, T7l, TcB, T7s, TcC, T1f, TeR, TeU, Ths, T7B; + E TcF, T7I, TcG, T32, Tfj, Tfg, ThB, T8G, TcU, T93, TcX, T3X, Tfr, TfK, ThM; + E T9h, Td3, Taa, Tde, T2A, Tf6, Tfb, Thx, T8m, TcR, T8x, TcO, T3t, Tfh, Tfm; + E ThC, T8V, TcY, T96, TcV, T4o, TfL, Tfu, ThN, T9w, Tdf, Tad, Td4, T6b, Tg9; + E TfV, ThY, TaF, Tdy, Tbm, Tdn, T4Q, ThJ, TfA, TfN, T9M, Tdh, Taf, Td8, T5h; + E ThI, TfF, TfO, Ta1, Tdi, Tag, Tdb, T6D, ThU, Tg1, Tgf, TaV, TdA, Tbo, Tdr; + E T74, ThT, Tg6, Tge, Tba, TdB, Tbp, Tdu; + { + E T1, TiT, T7, TiS, Te, T7a, Tk, T7c; + T1 = cr[0]; + TiT = ci[0]; + { + E T3, T6, T4, TiR, T2, T5; + T3 = cr[WS(rs, 32)]; + T6 = ci[WS(rs, 32)]; + T2 = W[62]; + T4 = T2 * T3; + TiR = T2 * T6; + T5 = W[63]; + T7 = FMA(T5, T6, T4); + TiS = FNMS(T5, T3, TiR); + } + { + E Ta, Td, Tb, T79, T9, Tc; + Ta = cr[WS(rs, 16)]; + Td = ci[WS(rs, 16)]; + T9 = W[30]; + Tb = T9 * Ta; + T79 = T9 * Td; + Tc = W[31]; + Te = FMA(Tc, Td, Tb); + T7a = FNMS(Tc, Ta, T79); + } + { + E Tg, Tj, Th, T7b, Tf, Ti; + Tg = cr[WS(rs, 48)]; + Tj = ci[WS(rs, 48)]; + Tf = W[94]; + Th = Tf * Tg; + T7b = Tf * Tj; + Ti = W[95]; + Tk = FMA(Ti, Tj, Th); + T7c = FNMS(Ti, Tg, T7b); + } + { + E T8, Tl, TjP, TjQ; + T8 = T1 + T7; + Tl = Te + Tk; + Tm = T8 + Tl; + TeM = T8 - Tl; + TjP = Te - Tk; + TjQ = TiT - TiS; + TjR = TjP + TjQ; + Tkl = TjQ - TjP; + } + { + E T78, T7d, TiQ, TiU; + T78 = T1 - T7; + T7d = T7a - T7c; + T7e = T78 - T7d; + TcA = T78 + T7d; + TiQ = T7a + T7c; + TiU = TiS + TiT; + TiV = TiQ + TiU; + Tjm = TiU - TiQ; + } + } + { + E T1l, T7S, T1E, T7O, T1r, T7U, T1y, T7M; + { + E T1h, T1k, T1i, T7R, T1g, T1j; + T1h = cr[WS(rs, 60)]; + T1k = ci[WS(rs, 60)]; + T1g = W[118]; + T1i = T1g * T1h; + T7R = T1g * T1k; + T1j = W[119]; + T1l = FMA(T1j, T1k, T1i); + T7S = FNMS(T1j, T1h, T7R); + } + { + E T1A, T1D, T1B, T7N, T1z, T1C; + T1A = cr[WS(rs, 44)]; + T1D = ci[WS(rs, 44)]; + T1z = W[86]; + T1B = T1z * T1A; + T7N = T1z * T1D; + T1C = W[87]; + T1E = FMA(T1C, T1D, T1B); + T7O = FNMS(T1C, T1A, T7N); + } + { + E T1n, T1q, T1o, T7T, T1m, T1p; + T1n = cr[WS(rs, 28)]; + T1q = ci[WS(rs, 28)]; + T1m = W[54]; + T1o = T1m * T1n; + T7T = T1m * T1q; + T1p = W[55]; + T1r = FMA(T1p, T1q, T1o); + T7U = FNMS(T1p, T1n, T7T); + } + { + E T1u, T1x, T1v, T7L, T1t, T1w; + T1u = cr[WS(rs, 12)]; + T1x = ci[WS(rs, 12)]; + T1t = W[22]; + T1v = T1t * T1u; + T7L = T1t * T1x; + T1w = W[23]; + T1y = FMA(T1w, T1x, T1v); + T7M = FNMS(T1w, T1u, T7L); + } + { + E T1s, T1F, TeX, TeY; + T1s = T1l + T1r; + T1F = T1y + T1E; + T1G = T1s + T1F; + TeW = T1s - T1F; + TeX = T7S + T7U; + TeY = T7M + T7O; + TeZ = TeX - TeY; + Thr = TeX + TeY; + } + { + E T7K, T7P, T7V, T7W; + T7K = T1l - T1r; + T7P = T7M - T7O; + T7Q = T7K - T7P; + TcI = T7K + T7P; + T7V = T7S - T7U; + T7W = T1y - T1E; + T7X = T7V + T7W; + TcJ = T7V - T7W; + } + } + { + E T1O, T8p, T27, T85, T1U, T8r, T21, T83; + { + E T1K, T1N, T1L, T8o, T1J, T1M; + T1K = cr[WS(rs, 2)]; + T1N = ci[WS(rs, 2)]; + T1J = W[2]; + T1L = T1J * T1K; + T8o = T1J * T1N; + T1M = W[3]; + T1O = FMA(T1M, T1N, T1L); + T8p = FNMS(T1M, T1K, T8o); + } + { + E T23, T26, T24, T84, T22, T25; + T23 = cr[WS(rs, 50)]; + T26 = ci[WS(rs, 50)]; + T22 = W[98]; + T24 = T22 * T23; + T84 = T22 * T26; + T25 = W[99]; + T27 = FMA(T25, T26, T24); + T85 = FNMS(T25, T23, T84); + } + { + E T1Q, T1T, T1R, T8q, T1P, T1S; + T1Q = cr[WS(rs, 34)]; + T1T = ci[WS(rs, 34)]; + T1P = W[66]; + T1R = T1P * T1Q; + T8q = T1P * T1T; + T1S = W[67]; + T1U = FMA(T1S, T1T, T1R); + T8r = FNMS(T1S, T1Q, T8q); + } + { + E T1X, T20, T1Y, T82, T1W, T1Z; + T1X = cr[WS(rs, 18)]; + T20 = ci[WS(rs, 18)]; + T1W = W[34]; + T1Y = T1W * T1X; + T82 = T1W * T20; + T1Z = W[35]; + T21 = FMA(T1Z, T20, T1Y); + T83 = FNMS(T1Z, T1X, T82); + } + { + E T1V, T28, Tf3, Tf4; + T1V = T1O + T1U; + T28 = T21 + T27; + T29 = T1V + T28; + Tf8 = T1V - T28; + Tf3 = T8p + T8r; + Tf4 = T83 + T85; + Tf5 = Tf3 - Tf4; + Thw = Tf3 + Tf4; + } + { + E T81, T86, T8s, T8t; + T81 = T1O - T1U; + T86 = T83 - T85; + T87 = T81 - T86; + TcN = T81 + T86; + T8s = T8p - T8r; + T8t = T21 - T27; + T8u = T8s + T8t; + TcQ = T8s - T8t; + } + } + { + E T5p, Tbf, T5I, Tao, T5v, Tbh, T5C, Tam; + { + E T5l, T5o, T5m, Tbe, T5k, T5n; + T5l = cr[WS(rs, 63)]; + T5o = ci[WS(rs, 63)]; + T5k = W[124]; + T5m = T5k * T5l; + Tbe = T5k * T5o; + T5n = W[125]; + T5p = FMA(T5n, T5o, T5m); + Tbf = FNMS(T5n, T5l, Tbe); + } + { + E T5E, T5H, T5F, Tan, T5D, T5G; + T5E = cr[WS(rs, 47)]; + T5H = ci[WS(rs, 47)]; + T5D = W[92]; + T5F = T5D * T5E; + Tan = T5D * T5H; + T5G = W[93]; + T5I = FMA(T5G, T5H, T5F); + Tao = FNMS(T5G, T5E, Tan); + } + { + E T5r, T5u, T5s, Tbg, T5q, T5t; + T5r = cr[WS(rs, 31)]; + T5u = ci[WS(rs, 31)]; + T5q = W[60]; + T5s = T5q * T5r; + Tbg = T5q * T5u; + T5t = W[61]; + T5v = FMA(T5t, T5u, T5s); + Tbh = FNMS(T5t, T5r, Tbg); + } + { + E T5y, T5B, T5z, Tal, T5x, T5A; + T5y = cr[WS(rs, 15)]; + T5B = ci[WS(rs, 15)]; + T5x = W[28]; + T5z = T5x * T5y; + Tal = T5x * T5B; + T5A = W[29]; + T5C = FMA(T5A, T5B, T5z); + Tam = FNMS(T5A, T5y, Tal); + } + { + E T5w, T5J, Tga, Tgb; + T5w = T5p + T5v; + T5J = T5C + T5I; + T5K = T5w + T5J; + TfS = T5w - T5J; + Tga = Tbf + Tbh; + Tgb = Tam + Tao; + Tgc = Tga - Tgb; + ThX = Tga + Tgb; + } + { + E Tak, Tap, Tbd, Tbi; + Tak = T5p - T5v; + Tap = Tam - Tao; + Taq = Tak - Tap; + Tdm = Tak + Tap; + Tbd = T5I - T5C; + Tbi = Tbf - Tbh; + Tbj = Tbd - Tbi; + Tdx = Tbi + Tbd; + } + } + { + E Ts, T7h, TL, T7q, Ty, T7j, TF, T7o; + { + E To, Tr, Tp, T7g, Tn, Tq; + To = cr[WS(rs, 8)]; + Tr = ci[WS(rs, 8)]; + Tn = W[14]; + Tp = Tn * To; + T7g = Tn * Tr; + Tq = W[15]; + Ts = FMA(Tq, Tr, Tp); + T7h = FNMS(Tq, To, T7g); + } + { + E TH, TK, TI, T7p, TG, TJ; + TH = cr[WS(rs, 24)]; + TK = ci[WS(rs, 24)]; + TG = W[46]; + TI = TG * TH; + T7p = TG * TK; + TJ = W[47]; + TL = FMA(TJ, TK, TI); + T7q = FNMS(TJ, TH, T7p); + } + { + E Tu, Tx, Tv, T7i, Tt, Tw; + Tu = cr[WS(rs, 40)]; + Tx = ci[WS(rs, 40)]; + Tt = W[78]; + Tv = Tt * Tu; + T7i = Tt * Tx; + Tw = W[79]; + Ty = FMA(Tw, Tx, Tv); + T7j = FNMS(Tw, Tu, T7i); + } + { + E TB, TE, TC, T7n, TA, TD; + TB = cr[WS(rs, 56)]; + TE = ci[WS(rs, 56)]; + TA = W[110]; + TC = TA * TB; + T7n = TA * TE; + TD = W[111]; + TF = FMA(TD, TE, TC); + T7o = FNMS(TD, TB, T7n); + } + { + E Tz, TM, TeN, TeO; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz + TM; + Tjl = Tz - TM; + TeN = T7o + T7q; + TeO = T7h + T7j; + TeP = TeN - TeO; + TiP = TeO + TeN; + } + { + E T7f, T7k, T7m, T7r; + T7f = Ts - Ty; + T7k = T7h - T7j; + T7l = T7f - T7k; + TcB = T7f + T7k; + T7m = TF - TL; + T7r = T7o - T7q; + T7s = T7m + T7r; + TcC = T7m - T7r; + } + } + { + E TU, T7D, T1d, T7z, T10, T7F, T17, T7x; + { + E TQ, TT, TR, T7C, TP, TS; + TQ = cr[WS(rs, 4)]; + TT = ci[WS(rs, 4)]; + TP = W[6]; + TR = TP * TQ; + T7C = TP * TT; + TS = W[7]; + TU = FMA(TS, TT, TR); + T7D = FNMS(TS, TQ, T7C); + } + { + E T19, T1c, T1a, T7y, T18, T1b; + T19 = cr[WS(rs, 52)]; + T1c = ci[WS(rs, 52)]; + T18 = W[102]; + T1a = T18 * T19; + T7y = T18 * T1c; + T1b = W[103]; + T1d = FMA(T1b, T1c, T1a); + T7z = FNMS(T1b, T19, T7y); + } + { + E TW, TZ, TX, T7E, TV, TY; + TW = cr[WS(rs, 36)]; + TZ = ci[WS(rs, 36)]; + TV = W[70]; + TX = TV * TW; + T7E = TV * TZ; + TY = W[71]; + T10 = FMA(TY, TZ, TX); + T7F = FNMS(TY, TW, T7E); + } + { + E T13, T16, T14, T7w, T12, T15; + T13 = cr[WS(rs, 20)]; + T16 = ci[WS(rs, 20)]; + T12 = W[38]; + T14 = T12 * T13; + T7w = T12 * T16; + T15 = W[39]; + T17 = FMA(T15, T16, T14); + T7x = FNMS(T15, T13, T7w); + } + { + E T11, T1e, TeS, TeT; + T11 = TU + T10; + T1e = T17 + T1d; + T1f = T11 + T1e; + TeR = T11 - T1e; + TeS = T7D + T7F; + TeT = T7x + T7z; + TeU = TeS - TeT; + Ths = TeS + TeT; + } + { + E T7v, T7A, T7G, T7H; + T7v = TU - T10; + T7A = T7x - T7z; + T7B = T7v - T7A; + TcF = T7v + T7A; + T7G = T7D - T7F; + T7H = T17 - T1d; + T7I = T7G + T7H; + TcG = T7G - T7H; + } + } + { + E T2H, T8Y, T30, T8E, T2N, T90, T2U, T8C; + { + E T2D, T2G, T2E, T8X, T2C, T2F; + T2D = cr[WS(rs, 62)]; + T2G = ci[WS(rs, 62)]; + T2C = W[122]; + T2E = T2C * T2D; + T8X = T2C * T2G; + T2F = W[123]; + T2H = FMA(T2F, T2G, T2E); + T8Y = FNMS(T2F, T2D, T8X); + } + { + E T2W, T2Z, T2X, T8D, T2V, T2Y; + T2W = cr[WS(rs, 46)]; + T2Z = ci[WS(rs, 46)]; + T2V = W[90]; + T2X = T2V * T2W; + T8D = T2V * T2Z; + T2Y = W[91]; + T30 = FMA(T2Y, T2Z, T2X); + T8E = FNMS(T2Y, T2W, T8D); + } + { + E T2J, T2M, T2K, T8Z, T2I, T2L; + T2J = cr[WS(rs, 30)]; + T2M = ci[WS(rs, 30)]; + T2I = W[58]; + T2K = T2I * T2J; + T8Z = T2I * T2M; + T2L = W[59]; + T2N = FMA(T2L, T2M, T2K); + T90 = FNMS(T2L, T2J, T8Z); + } + { + E T2Q, T2T, T2R, T8B, T2P, T2S; + T2Q = cr[WS(rs, 14)]; + T2T = ci[WS(rs, 14)]; + T2P = W[26]; + T2R = T2P * T2Q; + T8B = T2P * T2T; + T2S = W[27]; + T2U = FMA(T2S, T2T, T2R); + T8C = FNMS(T2S, T2Q, T8B); + } + { + E T2O, T31, Tfe, Tff; + T2O = T2H + T2N; + T31 = T2U + T30; + T32 = T2O + T31; + Tfj = T2O - T31; + Tfe = T8Y + T90; + Tff = T8C + T8E; + Tfg = Tfe - Tff; + ThB = Tfe + Tff; + } + { + E T8A, T8F, T91, T92; + T8A = T2H - T2N; + T8F = T8C - T8E; + T8G = T8A - T8F; + TcU = T8A + T8F; + T91 = T8Y - T90; + T92 = T2U - T30; + T93 = T91 + T92; + TcX = T91 - T92; + } + } + { + E T3C, Ta5, T3V, T9f, T3I, Ta7, T3P, T9d; + { + E T3y, T3B, T3z, Ta4, T3x, T3A; + T3y = cr[WS(rs, 1)]; + T3B = ci[WS(rs, 1)]; + T3x = W[0]; + T3z = T3x * T3y; + Ta4 = T3x * T3B; + T3A = W[1]; + T3C = FMA(T3A, T3B, T3z); + Ta5 = FNMS(T3A, T3y, Ta4); + } + { + E T3R, T3U, T3S, T9e, T3Q, T3T; + T3R = cr[WS(rs, 49)]; + T3U = ci[WS(rs, 49)]; + T3Q = W[96]; + T3S = T3Q * T3R; + T9e = T3Q * T3U; + T3T = W[97]; + T3V = FMA(T3T, T3U, T3S); + T9f = FNMS(T3T, T3R, T9e); + } + { + E T3E, T3H, T3F, Ta6, T3D, T3G; + T3E = cr[WS(rs, 33)]; + T3H = ci[WS(rs, 33)]; + T3D = W[64]; + T3F = T3D * T3E; + Ta6 = T3D * T3H; + T3G = W[65]; + T3I = FMA(T3G, T3H, T3F); + Ta7 = FNMS(T3G, T3E, Ta6); + } + { + E T3L, T3O, T3M, T9c, T3K, T3N; + T3L = cr[WS(rs, 17)]; + T3O = ci[WS(rs, 17)]; + T3K = W[32]; + T3M = T3K * T3L; + T9c = T3K * T3O; + T3N = W[33]; + T3P = FMA(T3N, T3O, T3M); + T9d = FNMS(T3N, T3L, T9c); + } + { + E T3J, T3W, TfI, TfJ; + T3J = T3C + T3I; + T3W = T3P + T3V; + T3X = T3J + T3W; + Tfr = T3J - T3W; + TfI = Ta5 + Ta7; + TfJ = T9d + T9f; + TfK = TfI - TfJ; + ThM = TfI + TfJ; + } + { + E T9b, T9g, Ta8, Ta9; + T9b = T3C - T3I; + T9g = T9d - T9f; + T9h = T9b - T9g; + Td3 = T9b + T9g; + Ta8 = Ta5 - Ta7; + Ta9 = T3P - T3V; + Taa = Ta8 + Ta9; + Tde = Ta8 - Ta9; + } + } + { + E T2f, T8a, T2y, T8j, T2l, T8c, T2s, T8h; + { + E T2b, T2e, T2c, T89, T2a, T2d; + T2b = cr[WS(rs, 10)]; + T2e = ci[WS(rs, 10)]; + T2a = W[18]; + T2c = T2a * T2b; + T89 = T2a * T2e; + T2d = W[19]; + T2f = FMA(T2d, T2e, T2c); + T8a = FNMS(T2d, T2b, T89); + } + { + E T2u, T2x, T2v, T8i, T2t, T2w; + T2u = cr[WS(rs, 26)]; + T2x = ci[WS(rs, 26)]; + T2t = W[50]; + T2v = T2t * T2u; + T8i = T2t * T2x; + T2w = W[51]; + T2y = FMA(T2w, T2x, T2v); + T8j = FNMS(T2w, T2u, T8i); + } + { + E T2h, T2k, T2i, T8b, T2g, T2j; + T2h = cr[WS(rs, 42)]; + T2k = ci[WS(rs, 42)]; + T2g = W[82]; + T2i = T2g * T2h; + T8b = T2g * T2k; + T2j = W[83]; + T2l = FMA(T2j, T2k, T2i); + T8c = FNMS(T2j, T2h, T8b); + } + { + E T2o, T2r, T2p, T8g, T2n, T2q; + T2o = cr[WS(rs, 58)]; + T2r = ci[WS(rs, 58)]; + T2n = W[114]; + T2p = T2n * T2o; + T8g = T2n * T2r; + T2q = W[115]; + T2s = FMA(T2q, T2r, T2p); + T8h = FNMS(T2q, T2o, T8g); + } + { + E T2m, T2z, Tf9, Tfa; + T2m = T2f + T2l; + T2z = T2s + T2y; + T2A = T2m + T2z; + Tf6 = T2m - T2z; + Tf9 = T8h + T8j; + Tfa = T8a + T8c; + Tfb = Tf9 - Tfa; + Thx = Tfa + Tf9; + { + E T8e, T8v, T8l, T8w; + { + E T88, T8d, T8f, T8k; + T88 = T2f - T2l; + T8d = T8a - T8c; + T8e = T88 - T8d; + T8v = T88 + T8d; + T8f = T2s - T2y; + T8k = T8h - T8j; + T8l = T8f + T8k; + T8w = T8k - T8f; + } + T8m = T8e + T8l; + TcR = T8l - T8e; + T8x = T8v + T8w; + TcO = T8v - T8w; + } + } + } + { + E T38, T8J, T3r, T8S, T3e, T8L, T3l, T8Q; + { + E T34, T37, T35, T8I, T33, T36; + T34 = cr[WS(rs, 6)]; + T37 = ci[WS(rs, 6)]; + T33 = W[10]; + T35 = T33 * T34; + T8I = T33 * T37; + T36 = W[11]; + T38 = FMA(T36, T37, T35); + T8J = FNMS(T36, T34, T8I); + } + { + E T3n, T3q, T3o, T8R, T3m, T3p; + T3n = cr[WS(rs, 22)]; + T3q = ci[WS(rs, 22)]; + T3m = W[42]; + T3o = T3m * T3n; + T8R = T3m * T3q; + T3p = W[43]; + T3r = FMA(T3p, T3q, T3o); + T8S = FNMS(T3p, T3n, T8R); + } + { + E T3a, T3d, T3b, T8K, T39, T3c; + T3a = cr[WS(rs, 38)]; + T3d = ci[WS(rs, 38)]; + T39 = W[74]; + T3b = T39 * T3a; + T8K = T39 * T3d; + T3c = W[75]; + T3e = FMA(T3c, T3d, T3b); + T8L = FNMS(T3c, T3a, T8K); + } + { + E T3h, T3k, T3i, T8P, T3g, T3j; + T3h = cr[WS(rs, 54)]; + T3k = ci[WS(rs, 54)]; + T3g = W[106]; + T3i = T3g * T3h; + T8P = T3g * T3k; + T3j = W[107]; + T3l = FMA(T3j, T3k, T3i); + T8Q = FNMS(T3j, T3h, T8P); + } + { + E T3f, T3s, Tfk, Tfl; + T3f = T38 + T3e; + T3s = T3l + T3r; + T3t = T3f + T3s; + Tfh = T3f - T3s; + Tfk = T8Q + T8S; + Tfl = T8J + T8L; + Tfm = Tfk - Tfl; + ThC = Tfl + Tfk; + { + E T8N, T94, T8U, T95; + { + E T8H, T8M, T8O, T8T; + T8H = T38 - T3e; + T8M = T8J - T8L; + T8N = T8H - T8M; + T94 = T8H + T8M; + T8O = T3l - T3r; + T8T = T8Q - T8S; + T8U = T8O + T8T; + T95 = T8T - T8O; + } + T8V = T8N + T8U; + TcY = T8U - T8N; + T96 = T94 + T95; + TcV = T94 - T95; + } + } + } + { + E T43, T9k, T4m, T9t, T49, T9m, T4g, T9r; + { + E T3Z, T42, T40, T9j, T3Y, T41; + T3Z = cr[WS(rs, 9)]; + T42 = ci[WS(rs, 9)]; + T3Y = W[16]; + T40 = T3Y * T3Z; + T9j = T3Y * T42; + T41 = W[17]; + T43 = FMA(T41, T42, T40); + T9k = FNMS(T41, T3Z, T9j); + } + { + E T4i, T4l, T4j, T9s, T4h, T4k; + T4i = cr[WS(rs, 25)]; + T4l = ci[WS(rs, 25)]; + T4h = W[48]; + T4j = T4h * T4i; + T9s = T4h * T4l; + T4k = W[49]; + T4m = FMA(T4k, T4l, T4j); + T9t = FNMS(T4k, T4i, T9s); + } + { + E T45, T48, T46, T9l, T44, T47; + T45 = cr[WS(rs, 41)]; + T48 = ci[WS(rs, 41)]; + T44 = W[80]; + T46 = T44 * T45; + T9l = T44 * T48; + T47 = W[81]; + T49 = FMA(T47, T48, T46); + T9m = FNMS(T47, T45, T9l); + } + { + E T4c, T4f, T4d, T9q, T4b, T4e; + T4c = cr[WS(rs, 57)]; + T4f = ci[WS(rs, 57)]; + T4b = W[112]; + T4d = T4b * T4c; + T9q = T4b * T4f; + T4e = W[113]; + T4g = FMA(T4e, T4f, T4d); + T9r = FNMS(T4e, T4c, T9q); + } + { + E T4a, T4n, Tfs, Tft; + T4a = T43 + T49; + T4n = T4g + T4m; + T4o = T4a + T4n; + TfL = T4a - T4n; + Tfs = T9r + T9t; + Tft = T9k + T9m; + Tfu = Tfs - Tft; + ThN = Tft + Tfs; + { + E T9o, Tab, T9v, Tac; + { + E T9i, T9n, T9p, T9u; + T9i = T43 - T49; + T9n = T9k - T9m; + T9o = T9i - T9n; + Tab = T9i + T9n; + T9p = T4g - T4m; + T9u = T9r - T9t; + T9v = T9p + T9u; + Tac = T9u - T9p; + } + T9w = T9o + T9v; + Tdf = T9v - T9o; + Tad = Tab + Tac; + Td4 = Tab - Tac; + } + } + } + { + E T5Q, Tat, T69, TaC, T5W, Tav, T63, TaA; + { + E T5M, T5P, T5N, Tas, T5L, T5O; + T5M = cr[WS(rs, 7)]; + T5P = ci[WS(rs, 7)]; + T5L = W[12]; + T5N = T5L * T5M; + Tas = T5L * T5P; + T5O = W[13]; + T5Q = FMA(T5O, T5P, T5N); + Tat = FNMS(T5O, T5M, Tas); + } + { + E T65, T68, T66, TaB, T64, T67; + T65 = cr[WS(rs, 23)]; + T68 = ci[WS(rs, 23)]; + T64 = W[44]; + T66 = T64 * T65; + TaB = T64 * T68; + T67 = W[45]; + T69 = FMA(T67, T68, T66); + TaC = FNMS(T67, T65, TaB); + } + { + E T5S, T5V, T5T, Tau, T5R, T5U; + T5S = cr[WS(rs, 39)]; + T5V = ci[WS(rs, 39)]; + T5R = W[76]; + T5T = T5R * T5S; + Tau = T5R * T5V; + T5U = W[77]; + T5W = FMA(T5U, T5V, T5T); + Tav = FNMS(T5U, T5S, Tau); + } + { + E T5Z, T62, T60, Taz, T5Y, T61; + T5Z = cr[WS(rs, 55)]; + T62 = ci[WS(rs, 55)]; + T5Y = W[108]; + T60 = T5Y * T5Z; + Taz = T5Y * T62; + T61 = W[109]; + T63 = FMA(T61, T62, T60); + TaA = FNMS(T61, T5Z, Taz); + } + { + E T5X, T6a, TfT, TfU; + T5X = T5Q + T5W; + T6a = T63 + T69; + T6b = T5X + T6a; + Tg9 = T6a - T5X; + TfT = TaA + TaC; + TfU = Tat + Tav; + TfV = TfT - TfU; + ThY = TfU + TfT; + { + E Tax, Tbl, TaE, Tbk; + { + E Tar, Taw, Tay, TaD; + Tar = T5Q - T5W; + Taw = Tat - Tav; + Tax = Tar - Taw; + Tbl = Tar + Taw; + Tay = T63 - T69; + TaD = TaA - TaC; + TaE = Tay + TaD; + Tbk = Tay - TaD; + } + TaF = Tax + TaE; + Tdy = TaE - Tax; + Tbm = Tbk - Tbl; + Tdn = Tbl + Tbk; + } + } + } + { + E T4v, T9G, T4O, T9C, T4B, T9I, T4I, T9A; + { + E T4r, T4u, T4s, T9F, T4q, T4t; + T4r = cr[WS(rs, 5)]; + T4u = ci[WS(rs, 5)]; + T4q = W[8]; + T4s = T4q * T4r; + T9F = T4q * T4u; + T4t = W[9]; + T4v = FMA(T4t, T4u, T4s); + T9G = FNMS(T4t, T4r, T9F); + } + { + E T4K, T4N, T4L, T9B, T4J, T4M; + T4K = cr[WS(rs, 53)]; + T4N = ci[WS(rs, 53)]; + T4J = W[104]; + T4L = T4J * T4K; + T9B = T4J * T4N; + T4M = W[105]; + T4O = FMA(T4M, T4N, T4L); + T9C = FNMS(T4M, T4K, T9B); + } + { + E T4x, T4A, T4y, T9H, T4w, T4z; + T4x = cr[WS(rs, 37)]; + T4A = ci[WS(rs, 37)]; + T4w = W[72]; + T4y = T4w * T4x; + T9H = T4w * T4A; + T4z = W[73]; + T4B = FMA(T4z, T4A, T4y); + T9I = FNMS(T4z, T4x, T9H); + } + { + E T4E, T4H, T4F, T9z, T4D, T4G; + T4E = cr[WS(rs, 21)]; + T4H = ci[WS(rs, 21)]; + T4D = W[40]; + T4F = T4D * T4E; + T9z = T4D * T4H; + T4G = W[41]; + T4I = FMA(T4G, T4H, T4F); + T9A = FNMS(T4G, T4E, T9z); + } + { + E T4C, T4P, Tfw, Tfx, Tfy, Tfz; + T4C = T4v + T4B; + T4P = T4I + T4O; + Tfw = T4C - T4P; + Tfx = T9G + T9I; + Tfy = T9A + T9C; + Tfz = Tfx - Tfy; + T4Q = T4C + T4P; + ThJ = Tfx + Tfy; + TfA = Tfw - Tfz; + TfN = Tfw + Tfz; + } + { + E T9E, Td6, T9L, Td7; + { + E T9y, T9D, T9J, T9K; + T9y = T4v - T4B; + T9D = T9A - T9C; + T9E = T9y - T9D; + Td6 = T9y + T9D; + T9J = T9G - T9I; + T9K = T4I - T4O; + T9L = T9J + T9K; + Td7 = T9J - T9K; + } + T9M = FNMS(KP414213562, T9L, T9E); + Tdh = FNMS(KP414213562, Td6, Td7); + Taf = FMA(KP414213562, T9E, T9L); + Td8 = FMA(KP414213562, Td7, Td6); + } + } + { + E T4W, T9V, T5f, T9R, T52, T9X, T59, T9P; + { + E T4S, T4V, T4T, T9U, T4R, T4U; + T4S = cr[WS(rs, 61)]; + T4V = ci[WS(rs, 61)]; + T4R = W[120]; + T4T = T4R * T4S; + T9U = T4R * T4V; + T4U = W[121]; + T4W = FMA(T4U, T4V, T4T); + T9V = FNMS(T4U, T4S, T9U); + } + { + E T5b, T5e, T5c, T9Q, T5a, T5d; + T5b = cr[WS(rs, 45)]; + T5e = ci[WS(rs, 45)]; + T5a = W[88]; + T5c = T5a * T5b; + T9Q = T5a * T5e; + T5d = W[89]; + T5f = FMA(T5d, T5e, T5c); + T9R = FNMS(T5d, T5b, T9Q); + } + { + E T4Y, T51, T4Z, T9W, T4X, T50; + T4Y = cr[WS(rs, 29)]; + T51 = ci[WS(rs, 29)]; + T4X = W[56]; + T4Z = T4X * T4Y; + T9W = T4X * T51; + T50 = W[57]; + T52 = FMA(T50, T51, T4Z); + T9X = FNMS(T50, T4Y, T9W); + } + { + E T55, T58, T56, T9O, T54, T57; + T55 = cr[WS(rs, 13)]; + T58 = ci[WS(rs, 13)]; + T54 = W[24]; + T56 = T54 * T55; + T9O = T54 * T58; + T57 = W[25]; + T59 = FMA(T57, T58, T56); + T9P = FNMS(T57, T55, T9O); + } + { + E T53, T5g, TfB, TfC, TfD, TfE; + T53 = T4W + T52; + T5g = T59 + T5f; + TfB = T53 - T5g; + TfC = T9V + T9X; + TfD = T9P + T9R; + TfE = TfC - TfD; + T5h = T53 + T5g; + ThI = TfC + TfD; + TfF = TfB + TfE; + TfO = TfE - TfB; + } + { + E T9T, Td9, Ta0, Tda; + { + E T9N, T9S, T9Y, T9Z; + T9N = T4W - T52; + T9S = T9P - T9R; + T9T = T9N - T9S; + Td9 = T9N + T9S; + T9Y = T9V - T9X; + T9Z = T59 - T5f; + Ta0 = T9Y + T9Z; + Tda = T9Y - T9Z; + } + Ta1 = FMA(KP414213562, Ta0, T9T); + Tdi = FMA(KP414213562, Td9, Tda); + Tag = FNMS(KP414213562, T9T, Ta0); + Tdb = FNMS(KP414213562, Tda, Td9); + } + } + { + E T6i, TaQ, T6B, TaL, T6o, TaS, T6v, TaJ; + { + E T6e, T6h, T6f, TaP, T6d, T6g; + T6e = cr[WS(rs, 3)]; + T6h = ci[WS(rs, 3)]; + T6d = W[4]; + T6f = T6d * T6e; + TaP = T6d * T6h; + T6g = W[5]; + T6i = FMA(T6g, T6h, T6f); + TaQ = FNMS(T6g, T6e, TaP); + } + { + E T6x, T6A, T6y, TaK, T6w, T6z; + T6x = cr[WS(rs, 51)]; + T6A = ci[WS(rs, 51)]; + T6w = W[100]; + T6y = T6w * T6x; + TaK = T6w * T6A; + T6z = W[101]; + T6B = FMA(T6z, T6A, T6y); + TaL = FNMS(T6z, T6x, TaK); + } + { + E T6k, T6n, T6l, TaR, T6j, T6m; + T6k = cr[WS(rs, 35)]; + T6n = ci[WS(rs, 35)]; + T6j = W[68]; + T6l = T6j * T6k; + TaR = T6j * T6n; + T6m = W[69]; + T6o = FMA(T6m, T6n, T6l); + TaS = FNMS(T6m, T6k, TaR); + } + { + E T6r, T6u, T6s, TaI, T6q, T6t; + T6r = cr[WS(rs, 19)]; + T6u = ci[WS(rs, 19)]; + T6q = W[36]; + T6s = T6q * T6r; + TaI = T6q * T6u; + T6t = W[37]; + T6v = FMA(T6t, T6u, T6s); + TaJ = FNMS(T6t, T6r, TaI); + } + { + E T6p, T6C, TfX, TfY, TfZ, Tg0; + T6p = T6i + T6o; + T6C = T6v + T6B; + TfX = T6p - T6C; + TfY = TaQ + TaS; + TfZ = TaJ + TaL; + Tg0 = TfY - TfZ; + T6D = T6p + T6C; + ThU = TfY + TfZ; + Tg1 = TfX - Tg0; + Tgf = TfX + Tg0; + } + { + E TaN, Tdp, TaU, Tdq; + { + E TaH, TaM, TaO, TaT; + TaH = T6i - T6o; + TaM = TaJ - TaL; + TaN = TaH - TaM; + Tdp = TaH + TaM; + TaO = T6B - T6v; + TaT = TaQ - TaS; + TaU = TaO - TaT; + Tdq = TaT + TaO; + } + TaV = FMA(KP414213562, TaU, TaN); + TdA = FNMS(KP414213562, Tdp, Tdq); + Tbo = FNMS(KP414213562, TaN, TaU); + Tdr = FMA(KP414213562, Tdq, Tdp); + } + } + { + E T6J, Tb5, T72, Tb0, T6P, Tb7, T6W, TaY; + { + E T6F, T6I, T6G, Tb4, T6E, T6H; + T6F = cr[WS(rs, 59)]; + T6I = ci[WS(rs, 59)]; + T6E = W[116]; + T6G = T6E * T6F; + Tb4 = T6E * T6I; + T6H = W[117]; + T6J = FMA(T6H, T6I, T6G); + Tb5 = FNMS(T6H, T6F, Tb4); + } + { + E T6Y, T71, T6Z, TaZ, T6X, T70; + T6Y = cr[WS(rs, 43)]; + T71 = ci[WS(rs, 43)]; + T6X = W[84]; + T6Z = T6X * T6Y; + TaZ = T6X * T71; + T70 = W[85]; + T72 = FMA(T70, T71, T6Z); + Tb0 = FNMS(T70, T6Y, TaZ); + } + { + E T6L, T6O, T6M, Tb6, T6K, T6N; + T6L = cr[WS(rs, 27)]; + T6O = ci[WS(rs, 27)]; + T6K = W[52]; + T6M = T6K * T6L; + Tb6 = T6K * T6O; + T6N = W[53]; + T6P = FMA(T6N, T6O, T6M); + Tb7 = FNMS(T6N, T6L, Tb6); + } + { + E T6S, T6V, T6T, TaX, T6R, T6U; + T6S = cr[WS(rs, 11)]; + T6V = ci[WS(rs, 11)]; + T6R = W[20]; + T6T = T6R * T6S; + TaX = T6R * T6V; + T6U = W[21]; + T6W = FMA(T6U, T6V, T6T); + TaY = FNMS(T6U, T6S, TaX); + } + { + E T6Q, T73, Tg2, Tg3, Tg4, Tg5; + T6Q = T6J + T6P; + T73 = T6W + T72; + Tg2 = T6Q - T73; + Tg3 = Tb5 + Tb7; + Tg4 = TaY + Tb0; + Tg5 = Tg3 - Tg4; + T74 = T6Q + T73; + ThT = Tg3 + Tg4; + Tg6 = Tg2 + Tg5; + Tge = Tg2 - Tg5; + } + { + E Tb2, Tds, Tb9, Tdt; + { + E TaW, Tb1, Tb3, Tb8; + TaW = T6J - T6P; + Tb1 = TaY - Tb0; + Tb2 = TaW - Tb1; + Tds = TaW + Tb1; + Tb3 = T72 - T6W; + Tb8 = Tb5 - Tb7; + Tb9 = Tb3 - Tb8; + Tdt = Tb8 + Tb3; + } + Tba = FNMS(KP414213562, Tb9, Tb2); + TdB = FMA(KP414213562, Tds, Tdt); + Tbp = FMA(KP414213562, Tb2, Tb9); + Tdu = FNMS(KP414213562, Tdt, Tds); + } + } + { + E T1I, Tio, T3v, Tj1, TiX, Tj2, Tir, TiN, T76, TiJ, TiC, TiG, T5j, TiK, Tix; + E TiF; + { + E TO, T1H, Tip, Tiq; + TO = Tm + TN; + T1H = T1f + T1G; + T1I = TO + T1H; + Tio = TO - T1H; + { + E T2B, T3u, TiO, TiW; + T2B = T29 + T2A; + T3u = T32 + T3t; + T3v = T2B + T3u; + Tj1 = T2B - T3u; + TiO = Ths + Thr; + TiW = TiP + TiV; + TiX = TiO + TiW; + Tj2 = TiW - TiO; + } + Tip = ThB + ThC; + Tiq = Thw + Thx; + Tir = Tip - Tiq; + TiN = Tiq + Tip; + { + E T6c, T75, Tiy, Tiz, TiA, TiB; + T6c = T5K + T6b; + T75 = T6D + T74; + Tiy = T6c - T75; + Tiz = ThX + ThY; + TiA = ThU + ThT; + TiB = Tiz - TiA; + T76 = T6c + T75; + TiJ = Tiz + TiA; + TiC = Tiy - TiB; + TiG = Tiy + TiB; + } + { + E T4p, T5i, Tit, Tiu, Tiv, Tiw; + T4p = T3X + T4o; + T5i = T4Q + T5h; + Tit = T4p - T5i; + Tiu = ThM + ThN; + Tiv = ThJ + ThI; + Tiw = Tiu - Tiv; + T5j = T4p + T5i; + TiK = Tiu + Tiv; + Tix = Tit + Tiw; + TiF = Tit - Tiw; + } + } + { + E T3w, T77, Tj3, Tj4; + T3w = T1I + T3v; + T77 = T5j + T76; + ci[WS(rs, 31)] = T3w - T77; + cr[0] = T3w + T77; + Tj3 = Tj1 + Tj2; + Tj4 = TiC - Tix; + cr[WS(rs, 56)] = FMS(KP707106781, Tj4, Tj3); + ci[WS(rs, 39)] = FMA(KP707106781, Tj4, Tj3); + } + { + E Tj5, Tj6, Tis, TiD; + Tj5 = Tj2 - Tj1; + Tj6 = TiG - TiF; + cr[WS(rs, 40)] = FMS(KP707106781, Tj6, Tj5); + ci[WS(rs, 55)] = FMA(KP707106781, Tj6, Tj5); + Tis = Tio - Tir; + TiD = Tix + TiC; + ci[WS(rs, 23)] = FNMS(KP707106781, TiD, Tis); + cr[WS(rs, 8)] = FMA(KP707106781, TiD, Tis); + } + { + E TiE, TiH, TiM, TiY; + TiE = Tio + Tir; + TiH = TiF + TiG; + cr[WS(rs, 24)] = FNMS(KP707106781, TiH, TiE); + ci[WS(rs, 7)] = FMA(KP707106781, TiH, TiE); + TiM = TiK + TiJ; + TiY = TiN + TiX; + cr[WS(rs, 32)] = TiM - TiY; + ci[WS(rs, 63)] = TiM + TiY; + } + { + E TiZ, Tj0, TiI, TiL; + TiZ = T76 - T5j; + Tj0 = TiX - TiN; + cr[WS(rs, 48)] = TiZ - Tj0; + ci[WS(rs, 47)] = TiZ + Tj0; + TiI = T1I - T3v; + TiL = TiJ - TiK; + cr[WS(rs, 16)] = TiI - TiL; + ci[WS(rs, 15)] = TiI + TiL; + } + } + { + E T99, Tk2, TbB, TjW, Taj, TbL, Tbv, TbF, Tce, Tcy, Tci, Tcu, Tc7, Tcx, Tch; + E Tcr, TbZ, Tkg, Tcn, Tka, Tbs, TbM, Tbw, TbI, T80, Tk9, Tkf, Tby, TbS, TjV; + E Tk1, Tck; + { + E T8z, Tbz, T98, TbA; + { + E T8n, T8y, T8W, T97; + T8n = FMA(KP707106781, T8m, T87); + T8y = FMA(KP707106781, T8x, T8u); + T8z = FNMS(KP198912367, T8y, T8n); + Tbz = FMA(KP198912367, T8n, T8y); + T8W = FMA(KP707106781, T8V, T8G); + T97 = FMA(KP707106781, T96, T93); + T98 = FMA(KP198912367, T97, T8W); + TbA = FNMS(KP198912367, T8W, T97); + } + T99 = T8z + T98; + Tk2 = T98 - T8z; + TbB = Tbz - TbA; + TjW = Tbz + TbA; + } + { + E Ta3, TbD, Tai, TbE; + { + E T9x, Ta2, Tae, Tah; + T9x = FMA(KP707106781, T9w, T9h); + Ta2 = T9M + Ta1; + Ta3 = FMA(KP923879532, Ta2, T9x); + TbD = FNMS(KP923879532, Ta2, T9x); + Tae = FMA(KP707106781, Tad, Taa); + Tah = Taf + Tag; + Tai = FMA(KP923879532, Tah, Tae); + TbE = FNMS(KP923879532, Tah, Tae); + } + Taj = FNMS(KP098491403, Tai, Ta3); + TbL = FNMS(KP820678790, TbD, TbE); + Tbv = FMA(KP098491403, Ta3, Tai); + TbF = FMA(KP820678790, TbE, TbD); + } + { + E Tca, Tcs, Tcd, Tct; + { + E Tc8, Tc9, Tcb, Tcc; + Tc8 = FNMS(KP707106781, TaF, Taq); + Tc9 = Tbp - Tbo; + Tca = FNMS(KP923879532, Tc9, Tc8); + Tcs = FMA(KP923879532, Tc9, Tc8); + Tcb = FNMS(KP707106781, Tbm, Tbj); + Tcc = Tba - TaV; + Tcd = FMA(KP923879532, Tcc, Tcb); + Tct = FNMS(KP923879532, Tcc, Tcb); + } + Tce = FNMS(KP534511135, Tcd, Tca); + Tcy = FNMS(KP303346683, Tcs, Tct); + Tci = FMA(KP534511135, Tca, Tcd); + Tcu = FMA(KP303346683, Tct, Tcs); + } + { + E Tc3, Tcp, Tc6, Tcq; + { + E Tc1, Tc2, Tc4, Tc5; + Tc1 = FNMS(KP707106781, T9w, T9h); + Tc2 = Taf - Tag; + Tc3 = FNMS(KP923879532, Tc2, Tc1); + Tcp = FMA(KP923879532, Tc2, Tc1); + Tc4 = FNMS(KP707106781, Tad, Taa); + Tc5 = Ta1 - T9M; + Tc6 = FNMS(KP923879532, Tc5, Tc4); + Tcq = FMA(KP923879532, Tc5, Tc4); + } + Tc7 = FNMS(KP534511135, Tc6, Tc3); + Tcx = FNMS(KP303346683, Tcp, Tcq); + Tch = FMA(KP534511135, Tc3, Tc6); + Tcr = FMA(KP303346683, Tcq, Tcp); + } + { + E TbV, Tcm, TbY, Tcl; + { + E TbT, TbU, TbW, TbX; + TbT = FNMS(KP707106781, T96, T93); + TbU = FNMS(KP707106781, T8V, T8G); + TbV = FMA(KP668178637, TbU, TbT); + Tcm = FNMS(KP668178637, TbT, TbU); + TbW = FNMS(KP707106781, T8x, T8u); + TbX = FNMS(KP707106781, T8m, T87); + TbY = FNMS(KP668178637, TbX, TbW); + Tcl = FMA(KP668178637, TbW, TbX); + } + TbZ = TbV - TbY; + Tkg = Tcl - Tcm; + Tcn = Tcl + Tcm; + Tka = TbY + TbV; + } + { + E Tbc, TbG, Tbr, TbH; + { + E TaG, Tbb, Tbn, Tbq; + TaG = FMA(KP707106781, TaF, Taq); + Tbb = TaV + Tba; + Tbc = FMA(KP923879532, Tbb, TaG); + TbG = FNMS(KP923879532, Tbb, TaG); + Tbn = FMA(KP707106781, Tbm, Tbj); + Tbq = Tbo + Tbp; + Tbr = FMA(KP923879532, Tbq, Tbn); + TbH = FNMS(KP923879532, Tbq, Tbn); + } + Tbs = FNMS(KP098491403, Tbr, Tbc); + TbM = FNMS(KP820678790, TbG, TbH); + Tbw = FMA(KP098491403, Tbc, Tbr); + TbI = FMA(KP820678790, TbH, TbG); + } + { + E T7u, TbO, TjT, Tk7, T7Z, Tk8, TbR, TjU, T7t, TjS; + T7t = T7l + T7s; + T7u = FMA(KP707106781, T7t, T7e); + TbO = FNMS(KP707106781, T7t, T7e); + TjS = TcB - TcC; + TjT = FMA(KP707106781, TjS, TjR); + Tk7 = FNMS(KP707106781, TjS, TjR); + { + E T7J, T7Y, TbP, TbQ; + T7J = FNMS(KP414213562, T7I, T7B); + T7Y = FMA(KP414213562, T7X, T7Q); + T7Z = T7J + T7Y; + Tk8 = T7Y - T7J; + TbP = FMA(KP414213562, T7B, T7I); + TbQ = FNMS(KP414213562, T7Q, T7X); + TbR = TbP - TbQ; + TjU = TbP + TbQ; + } + T80 = FMA(KP923879532, T7Z, T7u); + Tk9 = FMA(KP923879532, Tk8, Tk7); + Tkf = FNMS(KP923879532, Tk8, Tk7); + Tby = FNMS(KP923879532, T7Z, T7u); + TbS = FNMS(KP923879532, TbR, TbO); + TjV = FMA(KP923879532, TjU, TjT); + Tk1 = FNMS(KP923879532, TjU, TjT); + Tck = FMA(KP923879532, TbR, TbO); + } + { + E T9a, Tbt, TbK, TbN; + T9a = FMA(KP980785280, T99, T80); + Tbt = Taj + Tbs; + cr[WS(rs, 31)] = FNMS(KP995184726, Tbt, T9a); + ci[0] = FMA(KP995184726, Tbt, T9a); + TbK = FNMS(KP980785280, TbB, Tby); + TbN = TbL + TbM; + cr[WS(rs, 23)] = FMA(KP773010453, TbN, TbK); + ci[WS(rs, 8)] = FNMS(KP773010453, TbN, TbK); + } + { + E Tkb, Tkc, Tkj, Tkk; + Tkb = FMA(KP831469612, Tka, Tk9); + Tkc = Tcx - Tcy; + cr[WS(rs, 35)] = FMS(KP956940335, Tkc, Tkb); + ci[WS(rs, 60)] = FMA(KP956940335, Tkc, Tkb); + Tkj = FNMS(KP831469612, Tkg, Tkf); + Tkk = Tce - Tc7; + cr[WS(rs, 43)] = FMS(KP881921264, Tkk, Tkj); + ci[WS(rs, 52)] = FMA(KP881921264, Tkk, Tkj); + } + { + E Tbu, Tbx, TbC, TbJ; + Tbu = FNMS(KP980785280, T99, T80); + Tbx = Tbv + Tbw; + ci[WS(rs, 16)] = FNMS(KP995184726, Tbx, Tbu); + cr[WS(rs, 15)] = FMA(KP995184726, Tbx, Tbu); + TbC = FMA(KP980785280, TbB, Tby); + TbJ = TbF + TbI; + ci[WS(rs, 24)] = FNMS(KP773010453, TbJ, TbC); + cr[WS(rs, 7)] = FMA(KP773010453, TbJ, TbC); + } + { + E Tkd, Tke, Tkh, Tki; + Tkd = FNMS(KP831469612, Tka, Tk9); + Tke = Tcu - Tcr; + cr[WS(rs, 51)] = FMS(KP956940335, Tke, Tkd); + ci[WS(rs, 44)] = FMA(KP956940335, Tke, Tkd); + Tkh = FMA(KP831469612, Tkg, Tkf); + Tki = Tci - Tch; + cr[WS(rs, 59)] = FMS(KP881921264, Tki, Tkh); + ci[WS(rs, 36)] = FMA(KP881921264, Tki, Tkh); + } + { + E Tc0, Tcf, Tcw, Tcz; + Tc0 = FMA(KP831469612, TbZ, TbS); + Tcf = Tc7 + Tce; + cr[WS(rs, 27)] = FNMS(KP881921264, Tcf, Tc0); + ci[WS(rs, 4)] = FMA(KP881921264, Tcf, Tc0); + Tcw = FNMS(KP831469612, Tcn, Tck); + Tcz = Tcx + Tcy; + cr[WS(rs, 19)] = FMA(KP956940335, Tcz, Tcw); + ci[WS(rs, 12)] = FNMS(KP956940335, Tcz, Tcw); + } + { + E TjX, TjY, Tk5, Tk6; + TjX = FMA(KP980785280, TjW, TjV); + TjY = Tbw - Tbv; + cr[WS(rs, 63)] = FMS(KP995184726, TjY, TjX); + ci[WS(rs, 32)] = FMA(KP995184726, TjY, TjX); + Tk5 = FNMS(KP980785280, Tk2, Tk1); + Tk6 = TbI - TbF; + cr[WS(rs, 55)] = FMS(KP773010453, Tk6, Tk5); + ci[WS(rs, 40)] = FMA(KP773010453, Tk6, Tk5); + } + { + E Tcg, Tcj, Tco, Tcv; + Tcg = FNMS(KP831469612, TbZ, TbS); + Tcj = Tch + Tci; + ci[WS(rs, 20)] = FNMS(KP881921264, Tcj, Tcg); + cr[WS(rs, 11)] = FMA(KP881921264, Tcj, Tcg); + Tco = FMA(KP831469612, Tcn, Tck); + Tcv = Tcr + Tcu; + ci[WS(rs, 28)] = FNMS(KP956940335, Tcv, Tco); + cr[WS(rs, 3)] = FMA(KP956940335, Tcv, Tco); + } + { + E TjZ, Tk0, Tk3, Tk4; + TjZ = FNMS(KP980785280, TjW, TjV); + Tk0 = Tbs - Taj; + cr[WS(rs, 47)] = FMS(KP995184726, Tk0, TjZ); + ci[WS(rs, 48)] = FMA(KP995184726, Tk0, TjZ); + Tk3 = FMA(KP980785280, Tk2, Tk1); + Tk4 = TbL - TbM; + cr[WS(rs, 39)] = FMS(KP773010453, Tk4, Tk3); + ci[WS(rs, 56)] = FMA(KP773010453, Tk4, Tk3); + } + } + { + E Thu, Ti8, Tj9, Tjf, ThF, Tjg, Tib, Tja, ThR, Til, Ti6, Tif, Ti2, Tim, Ti5; + E Tii; + { + E Thq, Tht, Tj7, Tj8; + Thq = Tm - TN; + Tht = Thr - Ths; + Thu = Thq - Tht; + Ti8 = Thq + Tht; + Tj7 = T1f - T1G; + Tj8 = TiV - TiP; + Tj9 = Tj7 + Tj8; + Tjf = Tj8 - Tj7; + } + { + E Thz, Ti9, ThE, Tia; + { + E Thv, Thy, ThA, ThD; + Thv = T29 - T2A; + Thy = Thw - Thx; + Thz = Thv + Thy; + Ti9 = Thv - Thy; + ThA = T32 - T3t; + ThD = ThB - ThC; + ThE = ThA - ThD; + Tia = ThA + ThD; + } + ThF = Thz + ThE; + Tjg = Tia - Ti9; + Tib = Ti9 + Tia; + Tja = Thz - ThE; + } + { + E ThL, Tid, ThQ, Tie; + { + E ThH, ThK, ThO, ThP; + ThH = T3X - T4o; + ThK = ThI - ThJ; + ThL = ThH - ThK; + Tid = ThH + ThK; + ThO = ThM - ThN; + ThP = T4Q - T5h; + ThQ = ThO - ThP; + Tie = ThO + ThP; + } + ThR = FMA(KP414213562, ThQ, ThL); + Til = FMA(KP414213562, Tid, Tie); + Ti6 = FNMS(KP414213562, ThL, ThQ); + Tif = FNMS(KP414213562, Tie, Tid); + } + { + E ThW, Tig, Ti1, Tih; + { + E ThS, ThV, ThZ, Ti0; + ThS = T5K - T6b; + ThV = ThT - ThU; + ThW = ThS - ThV; + Tig = ThS + ThV; + ThZ = ThX - ThY; + Ti0 = T74 - T6D; + Ti1 = ThZ + Ti0; + Tih = Ti0 - ThZ; + } + Ti2 = FNMS(KP414213562, Ti1, ThW); + Tim = FMA(KP414213562, Tig, Tih); + Ti5 = FMA(KP414213562, ThW, Ti1); + Tii = FNMS(KP414213562, Tih, Tig); + } + { + E ThG, Ti3, Tjh, Tji; + ThG = FMA(KP707106781, ThF, Thu); + Ti3 = ThR + Ti2; + ci[WS(rs, 27)] = FNMS(KP923879532, Ti3, ThG); + cr[WS(rs, 4)] = FMA(KP923879532, Ti3, ThG); + Tjh = FMA(KP707106781, Tjg, Tjf); + Tji = Ti6 + Ti5; + cr[WS(rs, 36)] = FMS(KP923879532, Tji, Tjh); + ci[WS(rs, 59)] = FMA(KP923879532, Tji, Tjh); + } + { + E Tjj, Tjk, Ti4, Ti7; + Tjj = FNMS(KP707106781, Tjg, Tjf); + Tjk = Ti2 - ThR; + cr[WS(rs, 52)] = FMS(KP923879532, Tjk, Tjj); + ci[WS(rs, 43)] = FMA(KP923879532, Tjk, Tjj); + Ti4 = FNMS(KP707106781, ThF, Thu); + Ti7 = Ti5 - Ti6; + cr[WS(rs, 20)] = FNMS(KP923879532, Ti7, Ti4); + ci[WS(rs, 11)] = FMA(KP923879532, Ti7, Ti4); + } + { + E Tic, Tij, Tjb, Tjc; + Tic = FMA(KP707106781, Tib, Ti8); + Tij = Tif + Tii; + cr[WS(rs, 28)] = FNMS(KP923879532, Tij, Tic); + ci[WS(rs, 3)] = FMA(KP923879532, Tij, Tic); + Tjb = FMA(KP707106781, Tja, Tj9); + Tjc = Tim - Til; + cr[WS(rs, 60)] = FMS(KP923879532, Tjc, Tjb); + ci[WS(rs, 35)] = FMA(KP923879532, Tjc, Tjb); + } + { + E Tjd, Tje, Tik, Tin; + Tjd = FNMS(KP707106781, Tja, Tj9); + Tje = Tii - Tif; + cr[WS(rs, 44)] = FMS(KP923879532, Tje, Tjd); + ci[WS(rs, 51)] = FMA(KP923879532, Tje, Tjd); + Tik = FNMS(KP707106781, Tib, Ti8); + Tin = Til + Tim; + ci[WS(rs, 19)] = FNMS(KP923879532, Tin, Tik); + cr[WS(rs, 12)] = FMA(KP923879532, Tin, Tik); + } + } + { + E Tf2, TjJ, Tgo, TjD, TgI, Tjv, Tha, Tjp, Tfp, Tjw, Tgr, Tjq, Th4, Tho, Th7; + E Thk, TfR, TgB, Tgl, Tgv, TgP, TjK, Thd, TjE, TgX, Thn, Th8, Thh, Tgi, TgC; + E Tgm, Tgy; + { + E TeQ, TjB, Tf1, TjC, TeV, Tf0; + TeQ = TeM + TeP; + TjB = Tjm - Tjl; + TeV = TeR - TeU; + Tf0 = TeW + TeZ; + Tf1 = TeV + Tf0; + TjC = Tf0 - TeV; + Tf2 = FNMS(KP707106781, Tf1, TeQ); + TjJ = FNMS(KP707106781, TjC, TjB); + Tgo = FMA(KP707106781, Tf1, TeQ); + TjD = FMA(KP707106781, TjC, TjB); + } + { + E TgE, Tjn, TgH, Tjo, TgF, TgG; + TgE = TeM - TeP; + Tjn = Tjl + Tjm; + TgF = TeR + TeU; + TgG = TeW - TeZ; + TgH = TgF + TgG; + Tjo = TgF - TgG; + TgI = FMA(KP707106781, TgH, TgE); + Tjv = FNMS(KP707106781, Tjo, Tjn); + Tha = FNMS(KP707106781, TgH, TgE); + Tjp = FMA(KP707106781, Tjo, Tjn); + } + { + E Tfd, Tgp, Tfo, Tgq; + { + E Tf7, Tfc, Tfi, Tfn; + Tf7 = Tf5 + Tf6; + Tfc = Tf8 + Tfb; + Tfd = FMA(KP414213562, Tfc, Tf7); + Tgp = FNMS(KP414213562, Tf7, Tfc); + Tfi = Tfg + Tfh; + Tfn = Tfj + Tfm; + Tfo = FNMS(KP414213562, Tfn, Tfi); + Tgq = FMA(KP414213562, Tfi, Tfn); + } + Tfp = Tfd - Tfo; + Tjw = Tgq - Tgp; + Tgr = Tgp + Tgq; + Tjq = Tfd + Tfo; + } + { + E Th0, Thi, Th3, Thj; + { + E TgY, TgZ, Th1, Th2; + TgY = TfS - TfV; + TgZ = Tgf + Tge; + Th0 = FMA(KP707106781, TgZ, TgY); + Thi = FNMS(KP707106781, TgZ, TgY); + Th1 = Tgc + Tg9; + Th2 = Tg6 - Tg1; + Th3 = FMA(KP707106781, Th2, Th1); + Thj = FNMS(KP707106781, Th2, Th1); + } + Th4 = FNMS(KP198912367, Th3, Th0); + Tho = FNMS(KP668178637, Thi, Thj); + Th7 = FMA(KP198912367, Th0, Th3); + Thk = FMA(KP668178637, Thj, Thi); + } + { + E TfH, Tgt, TfQ, Tgu; + { + E Tfv, TfG, TfM, TfP; + Tfv = Tfr + Tfu; + TfG = TfA + TfF; + TfH = FNMS(KP707106781, TfG, Tfv); + Tgt = FMA(KP707106781, TfG, Tfv); + TfM = TfK + TfL; + TfP = TfN + TfO; + TfQ = FNMS(KP707106781, TfP, TfM); + Tgu = FMA(KP707106781, TfP, TfM); + } + TfR = FMA(KP668178637, TfQ, TfH); + TgB = FMA(KP198912367, Tgt, Tgu); + Tgl = FNMS(KP668178637, TfH, TfQ); + Tgv = FNMS(KP198912367, Tgu, Tgt); + } + { + E TgL, Thc, TgO, Thb; + { + E TgJ, TgK, TgM, TgN; + TgJ = Tf8 - Tfb; + TgK = Tf5 - Tf6; + TgL = FMA(KP414213562, TgK, TgJ); + Thc = FNMS(KP414213562, TgJ, TgK); + TgM = Tfj - Tfm; + TgN = Tfg - Tfh; + TgO = FNMS(KP414213562, TgN, TgM); + Thb = FMA(KP414213562, TgM, TgN); + } + TgP = TgL + TgO; + TjK = TgL - TgO; + Thd = Thb - Thc; + TjE = Thc + Thb; + } + { + E TgT, Thf, TgW, Thg; + { + E TgR, TgS, TgU, TgV; + TgR = Tfr - Tfu; + TgS = TfN - TfO; + TgT = FMA(KP707106781, TgS, TgR); + Thf = FNMS(KP707106781, TgS, TgR); + TgU = TfK - TfL; + TgV = TfF - TfA; + TgW = FMA(KP707106781, TgV, TgU); + Thg = FNMS(KP707106781, TgV, TgU); + } + TgX = FMA(KP198912367, TgW, TgT); + Thn = FMA(KP668178637, Thf, Thg); + Th8 = FNMS(KP198912367, TgT, TgW); + Thh = FNMS(KP668178637, Thg, Thf); + } + { + E Tg8, Tgw, Tgh, Tgx; + { + E TfW, Tg7, Tgd, Tgg; + TfW = TfS + TfV; + Tg7 = Tg1 + Tg6; + Tg8 = FNMS(KP707106781, Tg7, TfW); + Tgw = FMA(KP707106781, Tg7, TfW); + Tgd = Tg9 - Tgc; + Tgg = Tge - Tgf; + Tgh = FNMS(KP707106781, Tgg, Tgd); + Tgx = FMA(KP707106781, Tgg, Tgd); + } + Tgi = FMA(KP668178637, Tgh, Tg8); + TgC = FMA(KP198912367, Tgw, Tgx); + Tgm = FNMS(KP668178637, Tg8, Tgh); + Tgy = FNMS(KP198912367, Tgx, Tgw); + } + { + E Tfq, Tgj, TgA, TgD; + Tfq = FMA(KP923879532, Tfp, Tf2); + Tgj = TfR + Tgi; + ci[WS(rs, 25)] = FNMS(KP831469612, Tgj, Tfq); + cr[WS(rs, 6)] = FMA(KP831469612, Tgj, Tfq); + TgA = FNMS(KP923879532, Tgr, Tgo); + TgD = TgB + TgC; + ci[WS(rs, 17)] = FNMS(KP980785280, TgD, TgA); + cr[WS(rs, 14)] = FMA(KP980785280, TgD, TgA); + } + { + E TjF, TjG, TjN, TjO; + TjF = FMA(KP923879532, TjE, TjD); + TjG = Th8 + Th7; + cr[WS(rs, 34)] = FMS(KP980785280, TjG, TjF); + ci[WS(rs, 61)] = FMA(KP980785280, TjG, TjF); + TjN = FNMS(KP923879532, TjK, TjJ); + TjO = Thk - Thh; + cr[WS(rs, 42)] = FMS(KP831469612, TjO, TjN); + ci[WS(rs, 53)] = FMA(KP831469612, TjO, TjN); + } + { + E Tgk, Tgn, Tgs, Tgz; + Tgk = FNMS(KP923879532, Tfp, Tf2); + Tgn = Tgl + Tgm; + cr[WS(rs, 22)] = FMA(KP831469612, Tgn, Tgk); + ci[WS(rs, 9)] = FNMS(KP831469612, Tgn, Tgk); + Tgs = FMA(KP923879532, Tgr, Tgo); + Tgz = Tgv + Tgy; + cr[WS(rs, 30)] = FNMS(KP980785280, Tgz, Tgs); + ci[WS(rs, 1)] = FMA(KP980785280, Tgz, Tgs); + } + { + E TjH, TjI, TjL, TjM; + TjH = FNMS(KP923879532, TjE, TjD); + TjI = Th4 - TgX; + cr[WS(rs, 50)] = FMS(KP980785280, TjI, TjH); + ci[WS(rs, 45)] = FMA(KP980785280, TjI, TjH); + TjL = FMA(KP923879532, TjK, TjJ); + TjM = Thn + Tho; + cr[WS(rs, 58)] = -(FMA(KP831469612, TjM, TjL)); + ci[WS(rs, 37)] = FNMS(KP831469612, TjM, TjL); + } + { + E TgQ, Th5, Thm, Thp; + TgQ = FMA(KP923879532, TgP, TgI); + Th5 = TgX + Th4; + ci[WS(rs, 29)] = FNMS(KP980785280, Th5, TgQ); + cr[WS(rs, 2)] = FMA(KP980785280, Th5, TgQ); + Thm = FNMS(KP923879532, Thd, Tha); + Thp = Thn - Tho; + ci[WS(rs, 21)] = FNMS(KP831469612, Thp, Thm); + cr[WS(rs, 10)] = FMA(KP831469612, Thp, Thm); + } + { + E Tjr, Tjs, Tjz, TjA; + Tjr = FMA(KP923879532, Tjq, Tjp); + Tjs = TgC - TgB; + cr[WS(rs, 62)] = FMS(KP980785280, Tjs, Tjr); + ci[WS(rs, 33)] = FMA(KP980785280, Tjs, Tjr); + Tjz = FNMS(KP923879532, Tjw, Tjv); + TjA = Tgi - TfR; + cr[WS(rs, 54)] = FMS(KP831469612, TjA, Tjz); + ci[WS(rs, 41)] = FMA(KP831469612, TjA, Tjz); + } + { + E Th6, Th9, The, Thl; + Th6 = FNMS(KP923879532, TgP, TgI); + Th9 = Th7 - Th8; + cr[WS(rs, 18)] = FNMS(KP980785280, Th9, Th6); + ci[WS(rs, 13)] = FMA(KP980785280, Th9, Th6); + The = FMA(KP923879532, Thd, Tha); + Thl = Thh + Thk; + cr[WS(rs, 26)] = FNMS(KP831469612, Thl, The); + ci[WS(rs, 5)] = FMA(KP831469612, Thl, The); + } + { + E Tjt, Tju, Tjx, Tjy; + Tjt = FNMS(KP923879532, Tjq, Tjp); + Tju = Tgy - Tgv; + cr[WS(rs, 46)] = FMS(KP980785280, Tju, Tjt); + ci[WS(rs, 49)] = FMA(KP980785280, Tju, Tjt); + Tjx = FMA(KP923879532, Tjw, Tjv); + Tjy = Tgl - Tgm; + cr[WS(rs, 38)] = FMS(KP831469612, Tjy, Tjx); + ci[WS(rs, 57)] = FMA(KP831469612, Tjy, Tjx); + } + } + { + E Td1, Tkw, TdN, Tkq, Tdl, TdX, TdI, TdR, Teq, TeK, Tet, TeG, Tej, TeJ, Teu; + E TeD, Teb, TkK, Tez, TkE, TdE, TdY, TdH, TdU, TcM, TkD, TkJ, TdK, Te4, Tkp; + E Tkv, Tew; + { + E TcT, TdM, Td0, TdL; + { + E TcP, TcS, TcW, TcZ; + TcP = FMA(KP707106781, TcO, TcN); + TcS = FMA(KP707106781, TcR, TcQ); + TcT = FMA(KP198912367, TcS, TcP); + TdM = FNMS(KP198912367, TcP, TcS); + TcW = FMA(KP707106781, TcV, TcU); + TcZ = FMA(KP707106781, TcY, TcX); + Td0 = FNMS(KP198912367, TcZ, TcW); + TdL = FMA(KP198912367, TcW, TcZ); + } + Td1 = TcT + Td0; + Tkw = TcT - Td0; + TdN = TdL - TdM; + Tkq = TdM + TdL; + } + { + E Tdd, TdP, Tdk, TdQ; + { + E Td5, Tdc, Tdg, Tdj; + Td5 = FMA(KP707106781, Td4, Td3); + Tdc = Td8 + Tdb; + Tdd = FMA(KP923879532, Tdc, Td5); + TdP = FNMS(KP923879532, Tdc, Td5); + Tdg = FMA(KP707106781, Tdf, Tde); + Tdj = Tdh + Tdi; + Tdk = FMA(KP923879532, Tdj, Tdg); + TdQ = FNMS(KP923879532, Tdj, Tdg); + } + Tdl = FMA(KP098491403, Tdk, Tdd); + TdX = FMA(KP820678790, TdP, TdQ); + TdI = FNMS(KP098491403, Tdd, Tdk); + TdR = FNMS(KP820678790, TdQ, TdP); + } + { + E Tem, TeE, Tep, TeF; + { + E Tek, Tel, Ten, Teo; + Tek = FNMS(KP707106781, Tdn, Tdm); + Tel = TdB - TdA; + Tem = FNMS(KP923879532, Tel, Tek); + TeE = FMA(KP923879532, Tel, Tek); + Ten = FNMS(KP707106781, Tdy, Tdx); + Teo = Tdu - Tdr; + Tep = FMA(KP923879532, Teo, Ten); + TeF = FNMS(KP923879532, Teo, Ten); + } + Teq = FNMS(KP534511135, Tep, Tem); + TeK = FNMS(KP303346683, TeE, TeF); + Tet = FMA(KP534511135, Tem, Tep); + TeG = FMA(KP303346683, TeF, TeE); + } + { + E Tef, TeB, Tei, TeC; + { + E Ted, Tee, Teg, Teh; + Ted = FNMS(KP707106781, Td4, Td3); + Tee = Tdi - Tdh; + Tef = FNMS(KP923879532, Tee, Ted); + TeB = FMA(KP923879532, Tee, Ted); + Teg = FNMS(KP707106781, Tdf, Tde); + Teh = Td8 - Tdb; + Tei = FNMS(KP923879532, Teh, Teg); + TeC = FMA(KP923879532, Teh, Teg); + } + Tej = FMA(KP534511135, Tei, Tef); + TeJ = FMA(KP303346683, TeB, TeC); + Teu = FNMS(KP534511135, Tef, Tei); + TeD = FNMS(KP303346683, TeC, TeB); + } + { + E Te7, Tex, Tea, Tey; + { + E Te5, Te6, Te8, Te9; + Te5 = FNMS(KP707106781, TcR, TcQ); + Te6 = FNMS(KP707106781, TcO, TcN); + Te7 = FMA(KP668178637, Te6, Te5); + Tex = FNMS(KP668178637, Te5, Te6); + Te8 = FNMS(KP707106781, TcY, TcX); + Te9 = FNMS(KP707106781, TcV, TcU); + Tea = FNMS(KP668178637, Te9, Te8); + Tey = FMA(KP668178637, Te8, Te9); + } + Teb = Te7 - Tea; + TkK = Tey - Tex; + Tez = Tex + Tey; + TkE = Te7 + Tea; + } + { + E Tdw, TdS, TdD, TdT; + { + E Tdo, Tdv, Tdz, TdC; + Tdo = FMA(KP707106781, Tdn, Tdm); + Tdv = Tdr + Tdu; + Tdw = FMA(KP923879532, Tdv, Tdo); + TdS = FNMS(KP923879532, Tdv, Tdo); + Tdz = FMA(KP707106781, Tdy, Tdx); + TdC = TdA + TdB; + TdD = FMA(KP923879532, TdC, Tdz); + TdT = FNMS(KP923879532, TdC, Tdz); + } + TdE = FNMS(KP098491403, TdD, Tdw); + TdY = FNMS(KP820678790, TdS, TdT); + TdH = FMA(KP098491403, Tdw, TdD); + TdU = FMA(KP820678790, TdT, TdS); + } + { + E TcE, Te0, Tkn, TkB, TcL, TkC, Te3, Tko, TcD, Tkm; + TcD = TcB + TcC; + TcE = FMA(KP707106781, TcD, TcA); + Te0 = FNMS(KP707106781, TcD, TcA); + Tkm = T7s - T7l; + Tkn = FMA(KP707106781, Tkm, Tkl); + TkB = FNMS(KP707106781, Tkm, Tkl); + { + E TcH, TcK, Te1, Te2; + TcH = FMA(KP414213562, TcG, TcF); + TcK = FNMS(KP414213562, TcJ, TcI); + TcL = TcH + TcK; + TkC = TcH - TcK; + Te1 = FMA(KP414213562, TcI, TcJ); + Te2 = FNMS(KP414213562, TcF, TcG); + Te3 = Te1 - Te2; + Tko = Te2 + Te1; + } + TcM = FMA(KP923879532, TcL, TcE); + TkD = FMA(KP923879532, TkC, TkB); + TkJ = FNMS(KP923879532, TkC, TkB); + TdK = FNMS(KP923879532, TcL, TcE); + Te4 = FNMS(KP923879532, Te3, Te0); + Tkp = FMA(KP923879532, Tko, Tkn); + Tkv = FNMS(KP923879532, Tko, Tkn); + Tew = FMA(KP923879532, Te3, Te0); + } + { + E Td2, TdF, TdW, TdZ; + Td2 = FMA(KP980785280, Td1, TcM); + TdF = Tdl + TdE; + ci[WS(rs, 30)] = FNMS(KP995184726, TdF, Td2); + cr[WS(rs, 1)] = FMA(KP995184726, TdF, Td2); + TdW = FNMS(KP980785280, TdN, TdK); + TdZ = TdX - TdY; + ci[WS(rs, 22)] = FNMS(KP773010453, TdZ, TdW); + cr[WS(rs, 9)] = FMA(KP773010453, TdZ, TdW); + } + { + E TkF, TkG, TkN, TkO; + TkF = FMA(KP831469612, TkE, TkD); + TkG = TeJ + TeK; + cr[WS(rs, 61)] = -(FMA(KP956940335, TkG, TkF)); + ci[WS(rs, 34)] = FNMS(KP956940335, TkG, TkF); + TkN = FNMS(KP831469612, TkK, TkJ); + TkO = Teq - Tej; + cr[WS(rs, 53)] = FMS(KP881921264, TkO, TkN); + ci[WS(rs, 42)] = FMA(KP881921264, TkO, TkN); + } + { + E TdG, TdJ, TdO, TdV; + TdG = FNMS(KP980785280, Td1, TcM); + TdJ = TdH - TdI; + cr[WS(rs, 17)] = FNMS(KP995184726, TdJ, TdG); + ci[WS(rs, 14)] = FMA(KP995184726, TdJ, TdG); + TdO = FMA(KP980785280, TdN, TdK); + TdV = TdR + TdU; + cr[WS(rs, 25)] = FNMS(KP773010453, TdV, TdO); + ci[WS(rs, 6)] = FMA(KP773010453, TdV, TdO); + } + { + E TkH, TkI, TkL, TkM; + TkH = FNMS(KP831469612, TkE, TkD); + TkI = TeG - TeD; + cr[WS(rs, 45)] = FMS(KP956940335, TkI, TkH); + ci[WS(rs, 50)] = FMA(KP956940335, TkI, TkH); + TkL = FMA(KP831469612, TkK, TkJ); + TkM = Teu + Tet; + cr[WS(rs, 37)] = FMS(KP881921264, TkM, TkL); + ci[WS(rs, 58)] = FMA(KP881921264, TkM, TkL); + } + { + E Tec, Ter, TeI, TeL; + Tec = FMA(KP831469612, Teb, Te4); + Ter = Tej + Teq; + ci[WS(rs, 26)] = FNMS(KP881921264, Ter, Tec); + cr[WS(rs, 5)] = FMA(KP881921264, Ter, Tec); + TeI = FNMS(KP831469612, Tez, Tew); + TeL = TeJ - TeK; + ci[WS(rs, 18)] = FNMS(KP956940335, TeL, TeI); + cr[WS(rs, 13)] = FMA(KP956940335, TeL, TeI); + } + { + E Tkr, Tks, Tkz, TkA; + Tkr = FMA(KP980785280, Tkq, Tkp); + Tks = TdI + TdH; + cr[WS(rs, 33)] = FMS(KP995184726, Tks, Tkr); + ci[WS(rs, 62)] = FMA(KP995184726, Tks, Tkr); + Tkz = FNMS(KP980785280, Tkw, Tkv); + TkA = TdU - TdR; + cr[WS(rs, 41)] = FMS(KP773010453, TkA, Tkz); + ci[WS(rs, 54)] = FMA(KP773010453, TkA, Tkz); + } + { + E Tes, Tev, TeA, TeH; + Tes = FNMS(KP831469612, Teb, Te4); + Tev = Tet - Teu; + cr[WS(rs, 21)] = FNMS(KP881921264, Tev, Tes); + ci[WS(rs, 10)] = FMA(KP881921264, Tev, Tes); + TeA = FMA(KP831469612, Tez, Tew); + TeH = TeD + TeG; + cr[WS(rs, 29)] = FNMS(KP956940335, TeH, TeA); + ci[WS(rs, 2)] = FMA(KP956940335, TeH, TeA); + } + { + E Tkt, Tku, Tkx, Tky; + Tkt = FNMS(KP980785280, Tkq, Tkp); + Tku = TdE - Tdl; + cr[WS(rs, 49)] = FMS(KP995184726, Tku, Tkt); + ci[WS(rs, 46)] = FMA(KP995184726, Tku, Tkt); + Tkx = FMA(KP980785280, Tkw, Tkv); + Tky = TdX + TdY; + cr[WS(rs, 57)] = -(FMA(KP773010453, Tky, Tkx)); + ci[WS(rs, 38)] = FNMS(KP773010453, Tky, Tkx); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 64}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 64, "hf_64", twinstr, &GENUS, {520, 126, 518, 0} }; + +void X(codelet_hf_64) (planner *p) { + X(khc2hc_register) (p, hf_64, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 64 -dit -name hf_64 -include rdft/scalar/hf.h */ + +/* + * This function contains 1038 FP additions, 500 FP multiplications, + * (or, 808 additions, 270 multiplications, 230 fused multiply/add), + * 176 stack variables, 15 constants, and 256 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_64(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 126); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 126, MAKE_VOLATILE_STRIDE(128, rs)) { + E Tj, TcL, ThT, Tin, T6b, Taz, TgT, Thn, TG, Thm, TcO, TgO, T6m, Tim, TaC; + E ThQ, T14, Tfr, T6y, T9O, TaG, Tc0, TcU, TeE, T1r, Tfq, T6J, T9P, TaJ, Tc1; + E TcZ, TeF, T1Q, T2d, Tfu, Tfv, Tfw, Tfx, T6Q, TaM, Tdb, TeI, T71, TaQ, T7a; + E TaN, Td6, TeJ, T77, TaP, T2B, T2Y, Tfz, TfA, TfB, TfC, T7h, TaW, Tdm, TeL; + E T7s, TaU, T7B, TaX, Tdh, TeM, T7y, TaT, T5j, TfR, Tec, TeX, TfY, Tgy, T8D; + E Tbl, T8O, Tbx, T9l, Tbm, TdV, Tf0, T9i, Tbw, T3M, TfL, TdL, TeT, TfI, Tgt; + E T7K, Tbd, T7V, Tb3, T8s, Tbe, Tdu, TeQ, T8p, Tb2, T4x, TfJ, TdE, TdM, TfO; + E Tgu, T87, T8u, T8i, T8v, Tba, Tbh, Tdz, TdN, Tb7, Tbg, T64, TfZ, Te5, Ted; + E TfU, Tgz, T90, T9n, T9b, T9o, Tbt, TbA, Te0, Tee, Tbq, Tbz; + { + E T1, TgR, T6, TgQ, Tc, T68, Th, T69; + T1 = cr[0]; + TgR = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 32)]; + T5 = ci[WS(rs, 32)]; + T2 = W[62]; + T4 = W[63]; + T6 = FMA(T2, T3, T4 * T5); + TgQ = FNMS(T4, T3, T2 * T5); + } + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 16)]; + Tb = ci[WS(rs, 16)]; + T8 = W[30]; + Ta = W[31]; + Tc = FMA(T8, T9, Ta * Tb); + T68 = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 48)]; + Tg = ci[WS(rs, 48)]; + Td = W[94]; + Tf = W[95]; + Th = FMA(Td, Te, Tf * Tg); + T69 = FNMS(Tf, Te, Td * Tg); + } + { + E T7, Ti, ThR, ThS; + T7 = T1 + T6; + Ti = Tc + Th; + Tj = T7 + Ti; + TcL = T7 - Ti; + ThR = Tc - Th; + ThS = TgR - TgQ; + ThT = ThR + ThS; + Tin = ThS - ThR; + } + { + E T67, T6a, TgP, TgS; + T67 = T1 - T6; + T6a = T68 - T69; + T6b = T67 - T6a; + Taz = T67 + T6a; + TgP = T68 + T69; + TgS = TgQ + TgR; + TgT = TgP + TgS; + Thn = TgS - TgP; + } + } + { + E To, T6d, Tt, T6e, T6c, T6f, Tz, T6i, TE, T6j, T6h, T6k; + { + E Tl, Tn, Tk, Tm; + Tl = cr[WS(rs, 8)]; + Tn = ci[WS(rs, 8)]; + Tk = W[14]; + Tm = W[15]; + To = FMA(Tk, Tl, Tm * Tn); + T6d = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = cr[WS(rs, 40)]; + Ts = ci[WS(rs, 40)]; + Tp = W[78]; + Tr = W[79]; + Tt = FMA(Tp, Tq, Tr * Ts); + T6e = FNMS(Tr, Tq, Tp * Ts); + } + T6c = To - Tt; + T6f = T6d - T6e; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 56)]; + Ty = ci[WS(rs, 56)]; + Tv = W[110]; + Tx = W[111]; + Tz = FMA(Tv, Tw, Tx * Ty); + T6i = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 24)]; + TD = ci[WS(rs, 24)]; + TA = W[46]; + TC = W[47]; + TE = FMA(TA, TB, TC * TD); + T6j = FNMS(TC, TB, TA * TD); + } + T6h = Tz - TE; + T6k = T6i - T6j; + { + E Tu, TF, TcM, TcN; + Tu = To + Tt; + TF = Tz + TE; + TG = Tu + TF; + Thm = Tu - TF; + TcM = T6i + T6j; + TcN = T6d + T6e; + TcO = TcM - TcN; + TgO = TcN + TcM; + } + { + E T6g, T6l, TaA, TaB; + T6g = T6c - T6f; + T6l = T6h + T6k; + T6m = KP707106781 * (T6g + T6l); + Tim = KP707106781 * (T6l - T6g); + TaA = T6c + T6f; + TaB = T6h - T6k; + TaC = KP707106781 * (TaA + TaB); + ThQ = KP707106781 * (TaA - TaB); + } + } + { + E TS, TcR, T6o, T6v, T13, TcS, T6r, T6w, T6s, T6x; + { + E TM, T6t, TR, T6u; + { + E TJ, TL, TI, TK; + TJ = cr[WS(rs, 4)]; + TL = ci[WS(rs, 4)]; + TI = W[6]; + TK = W[7]; + TM = FMA(TI, TJ, TK * TL); + T6t = FNMS(TK, TJ, TI * TL); + } + { + E TO, TQ, TN, TP; + TO = cr[WS(rs, 36)]; + TQ = ci[WS(rs, 36)]; + TN = W[70]; + TP = W[71]; + TR = FMA(TN, TO, TP * TQ); + T6u = FNMS(TP, TO, TN * TQ); + } + TS = TM + TR; + TcR = T6t + T6u; + T6o = TM - TR; + T6v = T6t - T6u; + } + { + E TX, T6p, T12, T6q; + { + E TU, TW, TT, TV; + TU = cr[WS(rs, 20)]; + TW = ci[WS(rs, 20)]; + TT = W[38]; + TV = W[39]; + TX = FMA(TT, TU, TV * TW); + T6p = FNMS(TV, TU, TT * TW); + } + { + E TZ, T11, TY, T10; + TZ = cr[WS(rs, 52)]; + T11 = ci[WS(rs, 52)]; + TY = W[102]; + T10 = W[103]; + T12 = FMA(TY, TZ, T10 * T11); + T6q = FNMS(T10, TZ, TY * T11); + } + T13 = TX + T12; + TcS = T6p + T6q; + T6r = T6p - T6q; + T6w = TX - T12; + } + T14 = TS + T13; + Tfr = TcR + TcS; + T6s = T6o - T6r; + T6x = T6v + T6w; + T6y = FNMS(KP382683432, T6x, KP923879532 * T6s); + T9O = FMA(KP923879532, T6x, KP382683432 * T6s); + { + E TaE, TaF, TcQ, TcT; + TaE = T6v - T6w; + TaF = T6o + T6r; + TaG = FMA(KP382683432, TaE, KP923879532 * TaF); + Tc0 = FNMS(KP923879532, TaE, KP382683432 * TaF); + TcQ = TS - T13; + TcT = TcR - TcS; + TcU = TcQ + TcT; + TeE = TcQ - TcT; + } + } + { + E T1f, TcW, T6B, T6E, T1q, TcX, T6C, T6H, T6D, T6I; + { + E T19, T6z, T1e, T6A; + { + E T16, T18, T15, T17; + T16 = cr[WS(rs, 60)]; + T18 = ci[WS(rs, 60)]; + T15 = W[118]; + T17 = W[119]; + T19 = FMA(T15, T16, T17 * T18); + T6z = FNMS(T17, T16, T15 * T18); + } + { + E T1b, T1d, T1a, T1c; + T1b = cr[WS(rs, 28)]; + T1d = ci[WS(rs, 28)]; + T1a = W[54]; + T1c = W[55]; + T1e = FMA(T1a, T1b, T1c * T1d); + T6A = FNMS(T1c, T1b, T1a * T1d); + } + T1f = T19 + T1e; + TcW = T6z + T6A; + T6B = T6z - T6A; + T6E = T19 - T1e; + } + { + E T1k, T6F, T1p, T6G; + { + E T1h, T1j, T1g, T1i; + T1h = cr[WS(rs, 12)]; + T1j = ci[WS(rs, 12)]; + T1g = W[22]; + T1i = W[23]; + T1k = FMA(T1g, T1h, T1i * T1j); + T6F = FNMS(T1i, T1h, T1g * T1j); + } + { + E T1m, T1o, T1l, T1n; + T1m = cr[WS(rs, 44)]; + T1o = ci[WS(rs, 44)]; + T1l = W[86]; + T1n = W[87]; + T1p = FMA(T1l, T1m, T1n * T1o); + T6G = FNMS(T1n, T1m, T1l * T1o); + } + T1q = T1k + T1p; + TcX = T6F + T6G; + T6C = T1k - T1p; + T6H = T6F - T6G; + } + T1r = T1f + T1q; + Tfq = TcW + TcX; + T6D = T6B + T6C; + T6I = T6E - T6H; + T6J = FMA(KP382683432, T6D, KP923879532 * T6I); + T9P = FNMS(KP923879532, T6D, KP382683432 * T6I); + { + E TaH, TaI, TcV, TcY; + TaH = T6E + T6H; + TaI = T6B - T6C; + TaJ = FNMS(KP382683432, TaI, KP923879532 * TaH); + Tc1 = FMA(KP923879532, TaI, KP382683432 * TaH); + TcV = T1f - T1q; + TcY = TcW - TcX; + TcZ = TcV - TcY; + TeF = TcV + TcY; + } + } + { + E T1y, T73, T1D, T74, T1E, Td7, T1J, T6N, T1O, T6O, T1P, Td8, T21, Td4, T6R; + E T6U, T2c, Td3, T6W, T6Z; + { + E T1v, T1x, T1u, T1w; + T1v = cr[WS(rs, 2)]; + T1x = ci[WS(rs, 2)]; + T1u = W[2]; + T1w = W[3]; + T1y = FMA(T1u, T1v, T1w * T1x); + T73 = FNMS(T1w, T1v, T1u * T1x); + } + { + E T1A, T1C, T1z, T1B; + T1A = cr[WS(rs, 34)]; + T1C = ci[WS(rs, 34)]; + T1z = W[66]; + T1B = W[67]; + T1D = FMA(T1z, T1A, T1B * T1C); + T74 = FNMS(T1B, T1A, T1z * T1C); + } + T1E = T1y + T1D; + Td7 = T73 + T74; + { + E T1G, T1I, T1F, T1H; + T1G = cr[WS(rs, 18)]; + T1I = ci[WS(rs, 18)]; + T1F = W[34]; + T1H = W[35]; + T1J = FMA(T1F, T1G, T1H * T1I); + T6N = FNMS(T1H, T1G, T1F * T1I); + } + { + E T1L, T1N, T1K, T1M; + T1L = cr[WS(rs, 50)]; + T1N = ci[WS(rs, 50)]; + T1K = W[98]; + T1M = W[99]; + T1O = FMA(T1K, T1L, T1M * T1N); + T6O = FNMS(T1M, T1L, T1K * T1N); + } + T1P = T1J + T1O; + Td8 = T6N + T6O; + { + E T1V, T6S, T20, T6T; + { + E T1S, T1U, T1R, T1T; + T1S = cr[WS(rs, 10)]; + T1U = ci[WS(rs, 10)]; + T1R = W[18]; + T1T = W[19]; + T1V = FMA(T1R, T1S, T1T * T1U); + T6S = FNMS(T1T, T1S, T1R * T1U); + } + { + E T1X, T1Z, T1W, T1Y; + T1X = cr[WS(rs, 42)]; + T1Z = ci[WS(rs, 42)]; + T1W = W[82]; + T1Y = W[83]; + T20 = FMA(T1W, T1X, T1Y * T1Z); + T6T = FNMS(T1Y, T1X, T1W * T1Z); + } + T21 = T1V + T20; + Td4 = T6S + T6T; + T6R = T1V - T20; + T6U = T6S - T6T; + } + { + E T26, T6X, T2b, T6Y; + { + E T23, T25, T22, T24; + T23 = cr[WS(rs, 58)]; + T25 = ci[WS(rs, 58)]; + T22 = W[114]; + T24 = W[115]; + T26 = FMA(T22, T23, T24 * T25); + T6X = FNMS(T24, T23, T22 * T25); + } + { + E T28, T2a, T27, T29; + T28 = cr[WS(rs, 26)]; + T2a = ci[WS(rs, 26)]; + T27 = W[50]; + T29 = W[51]; + T2b = FMA(T27, T28, T29 * T2a); + T6Y = FNMS(T29, T28, T27 * T2a); + } + T2c = T26 + T2b; + Td3 = T6X + T6Y; + T6W = T26 - T2b; + T6Z = T6X - T6Y; + } + T1Q = T1E + T1P; + T2d = T21 + T2c; + Tfu = T1Q - T2d; + Tfv = Td7 + Td8; + Tfw = Td4 + Td3; + Tfx = Tfv - Tfw; + { + E T6M, T6P, Td9, Tda; + T6M = T1y - T1D; + T6P = T6N - T6O; + T6Q = T6M - T6P; + TaM = T6M + T6P; + Td9 = Td7 - Td8; + Tda = T21 - T2c; + Tdb = Td9 - Tda; + TeI = Td9 + Tda; + } + { + E T6V, T70, T78, T79; + T6V = T6R - T6U; + T70 = T6W + T6Z; + T71 = KP707106781 * (T6V + T70); + TaQ = KP707106781 * (T70 - T6V); + T78 = T6R + T6U; + T79 = T6Z - T6W; + T7a = KP707106781 * (T78 + T79); + TaN = KP707106781 * (T78 - T79); + } + { + E Td2, Td5, T75, T76; + Td2 = T1E - T1P; + Td5 = Td3 - Td4; + Td6 = Td2 - Td5; + TeJ = Td2 + Td5; + T75 = T73 - T74; + T76 = T1J - T1O; + T77 = T75 + T76; + TaP = T75 - T76; + } + } + { + E T2j, T7u, T2o, T7v, T2p, Tdd, T2u, T7e, T2z, T7f, T2A, Tde, T2M, Tdk, T7i; + E T7l, T2X, Tdj, T7n, T7q; + { + E T2g, T2i, T2f, T2h; + T2g = cr[WS(rs, 62)]; + T2i = ci[WS(rs, 62)]; + T2f = W[122]; + T2h = W[123]; + T2j = FMA(T2f, T2g, T2h * T2i); + T7u = FNMS(T2h, T2g, T2f * T2i); + } + { + E T2l, T2n, T2k, T2m; + T2l = cr[WS(rs, 30)]; + T2n = ci[WS(rs, 30)]; + T2k = W[58]; + T2m = W[59]; + T2o = FMA(T2k, T2l, T2m * T2n); + T7v = FNMS(T2m, T2l, T2k * T2n); + } + T2p = T2j + T2o; + Tdd = T7u + T7v; + { + E T2r, T2t, T2q, T2s; + T2r = cr[WS(rs, 14)]; + T2t = ci[WS(rs, 14)]; + T2q = W[26]; + T2s = W[27]; + T2u = FMA(T2q, T2r, T2s * T2t); + T7e = FNMS(T2s, T2r, T2q * T2t); + } + { + E T2w, T2y, T2v, T2x; + T2w = cr[WS(rs, 46)]; + T2y = ci[WS(rs, 46)]; + T2v = W[90]; + T2x = W[91]; + T2z = FMA(T2v, T2w, T2x * T2y); + T7f = FNMS(T2x, T2w, T2v * T2y); + } + T2A = T2u + T2z; + Tde = T7e + T7f; + { + E T2G, T7j, T2L, T7k; + { + E T2D, T2F, T2C, T2E; + T2D = cr[WS(rs, 6)]; + T2F = ci[WS(rs, 6)]; + T2C = W[10]; + T2E = W[11]; + T2G = FMA(T2C, T2D, T2E * T2F); + T7j = FNMS(T2E, T2D, T2C * T2F); + } + { + E T2I, T2K, T2H, T2J; + T2I = cr[WS(rs, 38)]; + T2K = ci[WS(rs, 38)]; + T2H = W[74]; + T2J = W[75]; + T2L = FMA(T2H, T2I, T2J * T2K); + T7k = FNMS(T2J, T2I, T2H * T2K); + } + T2M = T2G + T2L; + Tdk = T7j + T7k; + T7i = T2G - T2L; + T7l = T7j - T7k; + } + { + E T2R, T7o, T2W, T7p; + { + E T2O, T2Q, T2N, T2P; + T2O = cr[WS(rs, 54)]; + T2Q = ci[WS(rs, 54)]; + T2N = W[106]; + T2P = W[107]; + T2R = FMA(T2N, T2O, T2P * T2Q); + T7o = FNMS(T2P, T2O, T2N * T2Q); + } + { + E T2T, T2V, T2S, T2U; + T2T = cr[WS(rs, 22)]; + T2V = ci[WS(rs, 22)]; + T2S = W[42]; + T2U = W[43]; + T2W = FMA(T2S, T2T, T2U * T2V); + T7p = FNMS(T2U, T2T, T2S * T2V); + } + T2X = T2R + T2W; + Tdj = T7o + T7p; + T7n = T2R - T2W; + T7q = T7o - T7p; + } + T2B = T2p + T2A; + T2Y = T2M + T2X; + Tfz = T2B - T2Y; + TfA = Tdd + Tde; + TfB = Tdk + Tdj; + TfC = TfA - TfB; + { + E T7d, T7g, Tdi, Tdl; + T7d = T2j - T2o; + T7g = T7e - T7f; + T7h = T7d - T7g; + TaW = T7d + T7g; + Tdi = T2p - T2A; + Tdl = Tdj - Tdk; + Tdm = Tdi - Tdl; + TeL = Tdi + Tdl; + } + { + E T7m, T7r, T7z, T7A; + T7m = T7i - T7l; + T7r = T7n + T7q; + T7s = KP707106781 * (T7m + T7r); + TaU = KP707106781 * (T7r - T7m); + T7z = T7i + T7l; + T7A = T7q - T7n; + T7B = KP707106781 * (T7z + T7A); + TaX = KP707106781 * (T7z - T7A); + } + { + E Tdf, Tdg, T7w, T7x; + Tdf = Tdd - Tde; + Tdg = T2M - T2X; + Tdh = Tdf - Tdg; + TeM = Tdf + Tdg; + T7w = T7u - T7v; + T7x = T2u - T2z; + T7y = T7w + T7x; + TaT = T7w - T7x; + } + } + { + E T4D, T9e, T4I, T9f, T4J, TdR, T4O, T8A, T4T, T8B, T4U, TdS, T56, Tea, T8E; + E T8H, T5h, Te9, T8J, T8M; + { + E T4A, T4C, T4z, T4B; + T4A = cr[WS(rs, 63)]; + T4C = ci[WS(rs, 63)]; + T4z = W[124]; + T4B = W[125]; + T4D = FMA(T4z, T4A, T4B * T4C); + T9e = FNMS(T4B, T4A, T4z * T4C); + } + { + E T4F, T4H, T4E, T4G; + T4F = cr[WS(rs, 31)]; + T4H = ci[WS(rs, 31)]; + T4E = W[60]; + T4G = W[61]; + T4I = FMA(T4E, T4F, T4G * T4H); + T9f = FNMS(T4G, T4F, T4E * T4H); + } + T4J = T4D + T4I; + TdR = T9e + T9f; + { + E T4L, T4N, T4K, T4M; + T4L = cr[WS(rs, 15)]; + T4N = ci[WS(rs, 15)]; + T4K = W[28]; + T4M = W[29]; + T4O = FMA(T4K, T4L, T4M * T4N); + T8A = FNMS(T4M, T4L, T4K * T4N); + } + { + E T4Q, T4S, T4P, T4R; + T4Q = cr[WS(rs, 47)]; + T4S = ci[WS(rs, 47)]; + T4P = W[92]; + T4R = W[93]; + T4T = FMA(T4P, T4Q, T4R * T4S); + T8B = FNMS(T4R, T4Q, T4P * T4S); + } + T4U = T4O + T4T; + TdS = T8A + T8B; + { + E T50, T8F, T55, T8G; + { + E T4X, T4Z, T4W, T4Y; + T4X = cr[WS(rs, 7)]; + T4Z = ci[WS(rs, 7)]; + T4W = W[12]; + T4Y = W[13]; + T50 = FMA(T4W, T4X, T4Y * T4Z); + T8F = FNMS(T4Y, T4X, T4W * T4Z); + } + { + E T52, T54, T51, T53; + T52 = cr[WS(rs, 39)]; + T54 = ci[WS(rs, 39)]; + T51 = W[76]; + T53 = W[77]; + T55 = FMA(T51, T52, T53 * T54); + T8G = FNMS(T53, T52, T51 * T54); + } + T56 = T50 + T55; + Tea = T8F + T8G; + T8E = T50 - T55; + T8H = T8F - T8G; + } + { + E T5b, T8K, T5g, T8L; + { + E T58, T5a, T57, T59; + T58 = cr[WS(rs, 55)]; + T5a = ci[WS(rs, 55)]; + T57 = W[108]; + T59 = W[109]; + T5b = FMA(T57, T58, T59 * T5a); + T8K = FNMS(T59, T58, T57 * T5a); + } + { + E T5d, T5f, T5c, T5e; + T5d = cr[WS(rs, 23)]; + T5f = ci[WS(rs, 23)]; + T5c = W[44]; + T5e = W[45]; + T5g = FMA(T5c, T5d, T5e * T5f); + T8L = FNMS(T5e, T5d, T5c * T5f); + } + T5h = T5b + T5g; + Te9 = T8K + T8L; + T8J = T5b - T5g; + T8M = T8K - T8L; + } + { + E T4V, T5i, Te8, Teb; + T4V = T4J + T4U; + T5i = T56 + T5h; + T5j = T4V + T5i; + TfR = T4V - T5i; + Te8 = T4J - T4U; + Teb = Te9 - Tea; + Tec = Te8 - Teb; + TeX = Te8 + Teb; + } + { + E TfW, TfX, T8z, T8C; + TfW = TdR + TdS; + TfX = Tea + Te9; + TfY = TfW - TfX; + Tgy = TfW + TfX; + T8z = T4D - T4I; + T8C = T8A - T8B; + T8D = T8z - T8C; + Tbl = T8z + T8C; + } + { + E T8I, T8N, T9j, T9k; + T8I = T8E - T8H; + T8N = T8J + T8M; + T8O = KP707106781 * (T8I + T8N); + Tbx = KP707106781 * (T8N - T8I); + T9j = T8E + T8H; + T9k = T8M - T8J; + T9l = KP707106781 * (T9j + T9k); + Tbm = KP707106781 * (T9j - T9k); + } + { + E TdT, TdU, T9g, T9h; + TdT = TdR - TdS; + TdU = T56 - T5h; + TdV = TdT - TdU; + Tf0 = TdT + TdU; + T9g = T9e - T9f; + T9h = T4O - T4T; + T9i = T9g + T9h; + Tbw = T9g - T9h; + } + } + { + E T36, T7G, T3b, T7H, T3c, TdH, T3h, T8m, T3m, T8n, T3n, TdI, T3z, Tds, T7L; + E T7O, T3K, Tdr, T7S, T7T; + { + E T33, T35, T32, T34; + T33 = cr[WS(rs, 1)]; + T35 = ci[WS(rs, 1)]; + T32 = W[0]; + T34 = W[1]; + T36 = FMA(T32, T33, T34 * T35); + T7G = FNMS(T34, T33, T32 * T35); + } + { + E T38, T3a, T37, T39; + T38 = cr[WS(rs, 33)]; + T3a = ci[WS(rs, 33)]; + T37 = W[64]; + T39 = W[65]; + T3b = FMA(T37, T38, T39 * T3a); + T7H = FNMS(T39, T38, T37 * T3a); + } + T3c = T36 + T3b; + TdH = T7G + T7H; + { + E T3e, T3g, T3d, T3f; + T3e = cr[WS(rs, 17)]; + T3g = ci[WS(rs, 17)]; + T3d = W[32]; + T3f = W[33]; + T3h = FMA(T3d, T3e, T3f * T3g); + T8m = FNMS(T3f, T3e, T3d * T3g); + } + { + E T3j, T3l, T3i, T3k; + T3j = cr[WS(rs, 49)]; + T3l = ci[WS(rs, 49)]; + T3i = W[96]; + T3k = W[97]; + T3m = FMA(T3i, T3j, T3k * T3l); + T8n = FNMS(T3k, T3j, T3i * T3l); + } + T3n = T3h + T3m; + TdI = T8m + T8n; + { + E T3t, T7M, T3y, T7N; + { + E T3q, T3s, T3p, T3r; + T3q = cr[WS(rs, 9)]; + T3s = ci[WS(rs, 9)]; + T3p = W[16]; + T3r = W[17]; + T3t = FMA(T3p, T3q, T3r * T3s); + T7M = FNMS(T3r, T3q, T3p * T3s); + } + { + E T3v, T3x, T3u, T3w; + T3v = cr[WS(rs, 41)]; + T3x = ci[WS(rs, 41)]; + T3u = W[80]; + T3w = W[81]; + T3y = FMA(T3u, T3v, T3w * T3x); + T7N = FNMS(T3w, T3v, T3u * T3x); + } + T3z = T3t + T3y; + Tds = T7M + T7N; + T7L = T3t - T3y; + T7O = T7M - T7N; + } + { + E T3E, T7Q, T3J, T7R; + { + E T3B, T3D, T3A, T3C; + T3B = cr[WS(rs, 57)]; + T3D = ci[WS(rs, 57)]; + T3A = W[112]; + T3C = W[113]; + T3E = FMA(T3A, T3B, T3C * T3D); + T7Q = FNMS(T3C, T3B, T3A * T3D); + } + { + E T3G, T3I, T3F, T3H; + T3G = cr[WS(rs, 25)]; + T3I = ci[WS(rs, 25)]; + T3F = W[48]; + T3H = W[49]; + T3J = FMA(T3F, T3G, T3H * T3I); + T7R = FNMS(T3H, T3G, T3F * T3I); + } + T3K = T3E + T3J; + Tdr = T7Q + T7R; + T7S = T7Q - T7R; + T7T = T3E - T3J; + } + { + E T3o, T3L, TdJ, TdK; + T3o = T3c + T3n; + T3L = T3z + T3K; + T3M = T3o + T3L; + TfL = T3o - T3L; + TdJ = TdH - TdI; + TdK = T3z - T3K; + TdL = TdJ - TdK; + TeT = TdJ + TdK; + } + { + E TfG, TfH, T7I, T7J; + TfG = TdH + TdI; + TfH = Tds + Tdr; + TfI = TfG - TfH; + Tgt = TfG + TfH; + T7I = T7G - T7H; + T7J = T3h - T3m; + T7K = T7I + T7J; + Tbd = T7I - T7J; + } + { + E T7P, T7U, T8q, T8r; + T7P = T7L + T7O; + T7U = T7S - T7T; + T7V = KP707106781 * (T7P + T7U); + Tb3 = KP707106781 * (T7P - T7U); + T8q = T7L - T7O; + T8r = T7T + T7S; + T8s = KP707106781 * (T8q + T8r); + Tbe = KP707106781 * (T8r - T8q); + } + { + E Tdq, Tdt, T8l, T8o; + Tdq = T3c - T3n; + Tdt = Tdr - Tds; + Tdu = Tdq - Tdt; + TeQ = Tdq + Tdt; + T8l = T36 - T3b; + T8o = T8m - T8n; + T8p = T8l - T8o; + Tb2 = T8l + T8o; + } + } + { + E T3X, Tdw, T7Z, T82, T4v, TdB, T8b, T8g, T48, Tdx, T80, T85, T4k, TdA, T8a; + E T8d; + { + E T3R, T7X, T3W, T7Y; + { + E T3O, T3Q, T3N, T3P; + T3O = cr[WS(rs, 5)]; + T3Q = ci[WS(rs, 5)]; + T3N = W[8]; + T3P = W[9]; + T3R = FMA(T3N, T3O, T3P * T3Q); + T7X = FNMS(T3P, T3O, T3N * T3Q); + } + { + E T3T, T3V, T3S, T3U; + T3T = cr[WS(rs, 37)]; + T3V = ci[WS(rs, 37)]; + T3S = W[72]; + T3U = W[73]; + T3W = FMA(T3S, T3T, T3U * T3V); + T7Y = FNMS(T3U, T3T, T3S * T3V); + } + T3X = T3R + T3W; + Tdw = T7X + T7Y; + T7Z = T7X - T7Y; + T82 = T3R - T3W; + } + { + E T4p, T8e, T4u, T8f; + { + E T4m, T4o, T4l, T4n; + T4m = cr[WS(rs, 13)]; + T4o = ci[WS(rs, 13)]; + T4l = W[24]; + T4n = W[25]; + T4p = FMA(T4l, T4m, T4n * T4o); + T8e = FNMS(T4n, T4m, T4l * T4o); + } + { + E T4r, T4t, T4q, T4s; + T4r = cr[WS(rs, 45)]; + T4t = ci[WS(rs, 45)]; + T4q = W[88]; + T4s = W[89]; + T4u = FMA(T4q, T4r, T4s * T4t); + T8f = FNMS(T4s, T4r, T4q * T4t); + } + T4v = T4p + T4u; + TdB = T8e + T8f; + T8b = T4p - T4u; + T8g = T8e - T8f; + } + { + E T42, T83, T47, T84; + { + E T3Z, T41, T3Y, T40; + T3Z = cr[WS(rs, 21)]; + T41 = ci[WS(rs, 21)]; + T3Y = W[40]; + T40 = W[41]; + T42 = FMA(T3Y, T3Z, T40 * T41); + T83 = FNMS(T40, T3Z, T3Y * T41); + } + { + E T44, T46, T43, T45; + T44 = cr[WS(rs, 53)]; + T46 = ci[WS(rs, 53)]; + T43 = W[104]; + T45 = W[105]; + T47 = FMA(T43, T44, T45 * T46); + T84 = FNMS(T45, T44, T43 * T46); + } + T48 = T42 + T47; + Tdx = T83 + T84; + T80 = T42 - T47; + T85 = T83 - T84; + } + { + E T4e, T88, T4j, T89; + { + E T4b, T4d, T4a, T4c; + T4b = cr[WS(rs, 61)]; + T4d = ci[WS(rs, 61)]; + T4a = W[120]; + T4c = W[121]; + T4e = FMA(T4a, T4b, T4c * T4d); + T88 = FNMS(T4c, T4b, T4a * T4d); + } + { + E T4g, T4i, T4f, T4h; + T4g = cr[WS(rs, 29)]; + T4i = ci[WS(rs, 29)]; + T4f = W[56]; + T4h = W[57]; + T4j = FMA(T4f, T4g, T4h * T4i); + T89 = FNMS(T4h, T4g, T4f * T4i); + } + T4k = T4e + T4j; + TdA = T88 + T89; + T8a = T88 - T89; + T8d = T4e - T4j; + } + { + E T49, T4w, TdC, TdD; + T49 = T3X + T48; + T4w = T4k + T4v; + T4x = T49 + T4w; + TfJ = T49 - T4w; + TdC = TdA - TdB; + TdD = T4k - T4v; + TdE = TdC - TdD; + TdM = TdD + TdC; + } + { + E TfM, TfN, T81, T86; + TfM = TdA + TdB; + TfN = Tdw + Tdx; + TfO = TfM - TfN; + Tgu = TfN + TfM; + T81 = T7Z + T80; + T86 = T82 - T85; + T87 = FMA(KP923879532, T81, KP382683432 * T86); + T8u = FNMS(KP382683432, T81, KP923879532 * T86); + } + { + E T8c, T8h, Tb8, Tb9; + T8c = T8a + T8b; + T8h = T8d - T8g; + T8i = FNMS(KP382683432, T8h, KP923879532 * T8c); + T8v = FMA(KP382683432, T8c, KP923879532 * T8h); + Tb8 = T8d + T8g; + Tb9 = T8a - T8b; + Tba = FNMS(KP382683432, Tb9, KP923879532 * Tb8); + Tbh = FMA(KP923879532, Tb9, KP382683432 * Tb8); + } + { + E Tdv, Tdy, Tb5, Tb6; + Tdv = T3X - T48; + Tdy = Tdw - Tdx; + Tdz = Tdv + Tdy; + TdN = Tdv - Tdy; + Tb5 = T7Z - T80; + Tb6 = T82 + T85; + Tb7 = FMA(KP382683432, Tb5, KP923879532 * Tb6); + Tbg = FNMS(KP382683432, Tb6, KP923879532 * Tb5); + } + } + { + E T5u, Te2, T8Q, T8X, T62, TdY, T94, T99, T5F, Te3, T8T, T8Y, T5R, TdX, T93; + E T96; + { + E T5o, T8V, T5t, T8W; + { + E T5l, T5n, T5k, T5m; + T5l = cr[WS(rs, 3)]; + T5n = ci[WS(rs, 3)]; + T5k = W[4]; + T5m = W[5]; + T5o = FMA(T5k, T5l, T5m * T5n); + T8V = FNMS(T5m, T5l, T5k * T5n); + } + { + E T5q, T5s, T5p, T5r; + T5q = cr[WS(rs, 35)]; + T5s = ci[WS(rs, 35)]; + T5p = W[68]; + T5r = W[69]; + T5t = FMA(T5p, T5q, T5r * T5s); + T8W = FNMS(T5r, T5q, T5p * T5s); + } + T5u = T5o + T5t; + Te2 = T8V + T8W; + T8Q = T5o - T5t; + T8X = T8V - T8W; + } + { + E T5W, T97, T61, T98; + { + E T5T, T5V, T5S, T5U; + T5T = cr[WS(rs, 11)]; + T5V = ci[WS(rs, 11)]; + T5S = W[20]; + T5U = W[21]; + T5W = FMA(T5S, T5T, T5U * T5V); + T97 = FNMS(T5U, T5T, T5S * T5V); + } + { + E T5Y, T60, T5X, T5Z; + T5Y = cr[WS(rs, 43)]; + T60 = ci[WS(rs, 43)]; + T5X = W[84]; + T5Z = W[85]; + T61 = FMA(T5X, T5Y, T5Z * T60); + T98 = FNMS(T5Z, T5Y, T5X * T60); + } + T62 = T5W + T61; + TdY = T97 + T98; + T94 = T5W - T61; + T99 = T97 - T98; + } + { + E T5z, T8R, T5E, T8S; + { + E T5w, T5y, T5v, T5x; + T5w = cr[WS(rs, 19)]; + T5y = ci[WS(rs, 19)]; + T5v = W[36]; + T5x = W[37]; + T5z = FMA(T5v, T5w, T5x * T5y); + T8R = FNMS(T5x, T5w, T5v * T5y); + } + { + E T5B, T5D, T5A, T5C; + T5B = cr[WS(rs, 51)]; + T5D = ci[WS(rs, 51)]; + T5A = W[100]; + T5C = W[101]; + T5E = FMA(T5A, T5B, T5C * T5D); + T8S = FNMS(T5C, T5B, T5A * T5D); + } + T5F = T5z + T5E; + Te3 = T8R + T8S; + T8T = T8R - T8S; + T8Y = T5z - T5E; + } + { + E T5L, T91, T5Q, T92; + { + E T5I, T5K, T5H, T5J; + T5I = cr[WS(rs, 59)]; + T5K = ci[WS(rs, 59)]; + T5H = W[116]; + T5J = W[117]; + T5L = FMA(T5H, T5I, T5J * T5K); + T91 = FNMS(T5J, T5I, T5H * T5K); + } + { + E T5N, T5P, T5M, T5O; + T5N = cr[WS(rs, 27)]; + T5P = ci[WS(rs, 27)]; + T5M = W[52]; + T5O = W[53]; + T5Q = FMA(T5M, T5N, T5O * T5P); + T92 = FNMS(T5O, T5N, T5M * T5P); + } + T5R = T5L + T5Q; + TdX = T91 + T92; + T93 = T91 - T92; + T96 = T5L - T5Q; + } + { + E T5G, T63, Te1, Te4; + T5G = T5u + T5F; + T63 = T5R + T62; + T64 = T5G + T63; + TfZ = T5G - T63; + Te1 = T5u - T5F; + Te4 = Te2 - Te3; + Te5 = Te1 - Te4; + Ted = Te1 + Te4; + } + { + E TfS, TfT, T8U, T8Z; + TfS = TdX + TdY; + TfT = Te2 + Te3; + TfU = TfS - TfT; + Tgz = TfT + TfS; + T8U = T8Q - T8T; + T8Z = T8X + T8Y; + T90 = FNMS(KP382683432, T8Z, KP923879532 * T8U); + T9n = FMA(KP923879532, T8Z, KP382683432 * T8U); + } + { + E T95, T9a, Tbr, Tbs; + T95 = T93 + T94; + T9a = T96 - T99; + T9b = FMA(KP382683432, T95, KP923879532 * T9a); + T9o = FNMS(KP382683432, T9a, KP923879532 * T95); + Tbr = T96 + T99; + Tbs = T93 - T94; + Tbt = FNMS(KP382683432, Tbs, KP923879532 * Tbr); + TbA = FMA(KP923879532, Tbs, KP382683432 * Tbr); + } + { + E TdW, TdZ, Tbo, Tbp; + TdW = T5R - T62; + TdZ = TdX - TdY; + Te0 = TdW + TdZ; + Tee = TdZ - TdW; + Tbo = T8X - T8Y; + Tbp = T8Q + T8T; + Tbq = FMA(KP382683432, Tbo, KP923879532 * Tbp); + Tbz = FNMS(KP382683432, Tbp, KP923879532 * Tbo); + } + } + { + E T1t, Tgn, TgK, TgL, TgV, Th1, T30, Th0, T66, TgX, Tgw, TgE, TgB, TgF, Tgq; + E TgM; + { + E TH, T1s, TgI, TgJ; + TH = Tj + TG; + T1s = T14 + T1r; + T1t = TH + T1s; + Tgn = TH - T1s; + TgI = Tgy + Tgz; + TgJ = Tgt + Tgu; + TgK = TgI - TgJ; + TgL = TgJ + TgI; + } + { + E TgN, TgU, T2e, T2Z; + TgN = Tfr + Tfq; + TgU = TgO + TgT; + TgV = TgN + TgU; + Th1 = TgU - TgN; + T2e = T1Q + T2d; + T2Z = T2B + T2Y; + T30 = T2e + T2Z; + Th0 = T2e - T2Z; + } + { + E T4y, T65, Tgs, Tgv; + T4y = T3M + T4x; + T65 = T5j + T64; + T66 = T4y + T65; + TgX = T65 - T4y; + Tgs = T3M - T4x; + Tgv = Tgt - Tgu; + Tgw = Tgs + Tgv; + TgE = Tgs - Tgv; + } + { + E Tgx, TgA, Tgo, Tgp; + Tgx = T5j - T64; + TgA = Tgy - Tgz; + TgB = Tgx - TgA; + TgF = Tgx + TgA; + Tgo = TfA + TfB; + Tgp = Tfv + Tfw; + Tgq = Tgo - Tgp; + TgM = Tgp + Tgo; + } + { + E T31, TgW, TgY, TgH; + T31 = T1t + T30; + ci[WS(rs, 31)] = T31 - T66; + cr[0] = T31 + T66; + TgW = TgM + TgV; + cr[WS(rs, 32)] = TgL - TgW; + ci[WS(rs, 63)] = TgL + TgW; + TgY = TgV - TgM; + cr[WS(rs, 48)] = TgX - TgY; + ci[WS(rs, 47)] = TgX + TgY; + TgH = T1t - T30; + cr[WS(rs, 16)] = TgH - TgK; + ci[WS(rs, 15)] = TgH + TgK; + } + { + E Tgr, TgC, TgZ, Th2; + Tgr = Tgn - Tgq; + TgC = KP707106781 * (Tgw + TgB); + ci[WS(rs, 23)] = Tgr - TgC; + cr[WS(rs, 8)] = Tgr + TgC; + TgZ = KP707106781 * (TgB - Tgw); + Th2 = Th0 + Th1; + cr[WS(rs, 56)] = TgZ - Th2; + ci[WS(rs, 39)] = TgZ + Th2; + } + { + E Th3, Th4, TgD, TgG; + Th3 = KP707106781 * (TgF - TgE); + Th4 = Th1 - Th0; + cr[WS(rs, 40)] = Th3 - Th4; + ci[WS(rs, 55)] = Th3 + Th4; + TgD = Tgn + Tgq; + TgG = KP707106781 * (TgE + TgF); + cr[WS(rs, 24)] = TgD - TgG; + ci[WS(rs, 7)] = TgD + TgG; + } + } + { + E T6L, T9x, ThV, Ti1, T7E, Ti0, T9A, ThO, T8y, T9K, T9u, T9E, T9r, T9L, T9v; + E T9H; + { + E T6n, T6K, ThP, ThU; + T6n = T6b + T6m; + T6K = T6y + T6J; + T6L = T6n - T6K; + T9x = T6n + T6K; + ThP = T9O - T9P; + ThU = ThQ + ThT; + ThV = ThP + ThU; + Ti1 = ThU - ThP; + } + { + E T7c, T9y, T7D, T9z; + { + E T72, T7b, T7t, T7C; + T72 = T6Q + T71; + T7b = T77 + T7a; + T7c = FMA(KP195090322, T72, KP980785280 * T7b); + T9y = FNMS(KP195090322, T7b, KP980785280 * T72); + T7t = T7h + T7s; + T7C = T7y + T7B; + T7D = FNMS(KP980785280, T7C, KP195090322 * T7t); + T9z = FMA(KP980785280, T7t, KP195090322 * T7C); + } + T7E = T7c + T7D; + Ti0 = T9z - T9y; + T9A = T9y + T9z; + ThO = T7c - T7D; + } + { + E T8k, T9D, T8x, T9C; + { + E T7W, T8j, T8t, T8w; + T7W = T7K + T7V; + T8j = T87 + T8i; + T8k = T7W - T8j; + T9D = T7W + T8j; + T8t = T8p + T8s; + T8w = T8u + T8v; + T8x = T8t - T8w; + T9C = T8t + T8w; + } + T8y = FMA(KP634393284, T8k, KP773010453 * T8x); + T9K = FMA(KP995184726, T9D, KP098017140 * T9C); + T9u = FNMS(KP773010453, T8k, KP634393284 * T8x); + T9E = FNMS(KP098017140, T9D, KP995184726 * T9C); + } + { + E T9d, T9G, T9q, T9F; + { + E T8P, T9c, T9m, T9p; + T8P = T8D + T8O; + T9c = T90 + T9b; + T9d = T8P - T9c; + T9G = T8P + T9c; + T9m = T9i + T9l; + T9p = T9n + T9o; + T9q = T9m - T9p; + T9F = T9m + T9p; + } + T9r = FNMS(KP634393284, T9q, KP773010453 * T9d); + T9L = FNMS(KP995184726, T9F, KP098017140 * T9G); + T9v = FMA(KP773010453, T9q, KP634393284 * T9d); + T9H = FMA(KP098017140, T9F, KP995184726 * T9G); + } + { + E T7F, T9s, ThZ, Ti2; + T7F = T6L + T7E; + T9s = T8y + T9r; + ci[WS(rs, 24)] = T7F - T9s; + cr[WS(rs, 7)] = T7F + T9s; + ThZ = T9v - T9u; + Ti2 = Ti0 + Ti1; + cr[WS(rs, 39)] = ThZ - Ti2; + ci[WS(rs, 56)] = ThZ + Ti2; + } + { + E Ti3, Ti4, T9t, T9w; + Ti3 = T9r - T8y; + Ti4 = Ti1 - Ti0; + cr[WS(rs, 55)] = Ti3 - Ti4; + ci[WS(rs, 40)] = Ti3 + Ti4; + T9t = T6L - T7E; + T9w = T9u + T9v; + cr[WS(rs, 23)] = T9t - T9w; + ci[WS(rs, 8)] = T9t + T9w; + } + { + E T9B, T9I, ThN, ThW; + T9B = T9x + T9A; + T9I = T9E + T9H; + cr[WS(rs, 31)] = T9B - T9I; + ci[0] = T9B + T9I; + ThN = T9L - T9K; + ThW = ThO + ThV; + cr[WS(rs, 63)] = ThN - ThW; + ci[WS(rs, 32)] = ThN + ThW; + } + { + E ThX, ThY, T9J, T9M; + ThX = T9H - T9E; + ThY = ThV - ThO; + cr[WS(rs, 47)] = ThX - ThY; + ci[WS(rs, 48)] = ThX + ThY; + T9J = T9x - T9A; + T9M = T9K + T9L; + ci[WS(rs, 16)] = T9J - T9M; + cr[WS(rs, 15)] = T9J + T9M; + } + } + { + E Tft, Tg7, Tgh, Tgl, Th9, Thf, TfE, Th6, TfQ, Tg4, Tga, The, Tge, Tgk, Tg1; + E Tg5; + { + E Tfp, Tfs, Tgf, Tgg; + Tfp = Tj - TG; + Tfs = Tfq - Tfr; + Tft = Tfp - Tfs; + Tg7 = Tfp + Tfs; + Tgf = TfY + TfZ; + Tgg = TfR + TfU; + Tgh = FMA(KP382683432, Tgf, KP923879532 * Tgg); + Tgl = FNMS(KP923879532, Tgf, KP382683432 * Tgg); + } + { + E Th7, Th8, Tfy, TfD; + Th7 = T14 - T1r; + Th8 = TgT - TgO; + Th9 = Th7 + Th8; + Thf = Th8 - Th7; + Tfy = Tfu + Tfx; + TfD = Tfz - TfC; + TfE = KP707106781 * (Tfy + TfD); + Th6 = KP707106781 * (Tfy - TfD); + } + { + E TfK, TfP, Tg8, Tg9; + TfK = TfI - TfJ; + TfP = TfL - TfO; + TfQ = FMA(KP382683432, TfK, KP923879532 * TfP); + Tg4 = FNMS(KP923879532, TfK, KP382683432 * TfP); + Tg8 = Tfu - Tfx; + Tg9 = Tfz + TfC; + Tga = KP707106781 * (Tg8 + Tg9); + The = KP707106781 * (Tg9 - Tg8); + } + { + E Tgc, Tgd, TfV, Tg0; + Tgc = TfL + TfO; + Tgd = TfI + TfJ; + Tge = FNMS(KP382683432, Tgd, KP923879532 * Tgc); + Tgk = FMA(KP923879532, Tgd, KP382683432 * Tgc); + TfV = TfR - TfU; + Tg0 = TfY - TfZ; + Tg1 = FNMS(KP382683432, Tg0, KP923879532 * TfV); + Tg5 = FMA(KP923879532, Tg0, KP382683432 * TfV); + } + { + E TfF, Tg2, Thd, Thg; + TfF = Tft + TfE; + Tg2 = TfQ + Tg1; + ci[WS(rs, 27)] = TfF - Tg2; + cr[WS(rs, 4)] = TfF + Tg2; + Thd = Tg5 - Tg4; + Thg = The + Thf; + cr[WS(rs, 36)] = Thd - Thg; + ci[WS(rs, 59)] = Thd + Thg; + } + { + E Thh, Thi, Tg3, Tg6; + Thh = Tg1 - TfQ; + Thi = Thf - The; + cr[WS(rs, 52)] = Thh - Thi; + ci[WS(rs, 43)] = Thh + Thi; + Tg3 = Tft - TfE; + Tg6 = Tg4 + Tg5; + cr[WS(rs, 20)] = Tg3 - Tg6; + ci[WS(rs, 11)] = Tg3 + Tg6; + } + { + E Tgb, Tgi, Th5, Tha; + Tgb = Tg7 + Tga; + Tgi = Tge + Tgh; + cr[WS(rs, 28)] = Tgb - Tgi; + ci[WS(rs, 3)] = Tgb + Tgi; + Th5 = Tgl - Tgk; + Tha = Th6 + Th9; + cr[WS(rs, 60)] = Th5 - Tha; + ci[WS(rs, 35)] = Th5 + Tha; + } + { + E Thb, Thc, Tgj, Tgm; + Thb = Tgh - Tge; + Thc = Th9 - Th6; + cr[WS(rs, 44)] = Thb - Thc; + ci[WS(rs, 51)] = Thb + Thc; + Tgj = Tg7 - Tga; + Tgm = Tgk + Tgl; + ci[WS(rs, 19)] = Tgj - Tgm; + cr[WS(rs, 12)] = Tgj + Tgm; + } + } + { + E TeH, Tf9, TeO, Thk, Thp, Thv, Tfc, Thu, Tf3, Tfn, Tf7, Tfj, TeW, Tfm, Tf6; + E Tfg; + { + E TeD, TeG, Tfa, Tfb; + TeD = TcL + TcO; + TeG = KP707106781 * (TeE + TeF); + TeH = TeD - TeG; + Tf9 = TeD + TeG; + { + E TeK, TeN, Thl, Tho; + TeK = FMA(KP923879532, TeI, KP382683432 * TeJ); + TeN = FNMS(KP923879532, TeM, KP382683432 * TeL); + TeO = TeK + TeN; + Thk = TeK - TeN; + Thl = KP707106781 * (TcU - TcZ); + Tho = Thm + Thn; + Thp = Thl + Tho; + Thv = Tho - Thl; + } + Tfa = FNMS(KP382683432, TeI, KP923879532 * TeJ); + Tfb = FMA(KP382683432, TeM, KP923879532 * TeL); + Tfc = Tfa + Tfb; + Thu = Tfb - Tfa; + { + E TeZ, Tfh, Tf2, Tfi, TeY, Tf1; + TeY = KP707106781 * (Te5 + Te0); + TeZ = TeX - TeY; + Tfh = TeX + TeY; + Tf1 = KP707106781 * (Ted + Tee); + Tf2 = Tf0 - Tf1; + Tfi = Tf0 + Tf1; + Tf3 = FNMS(KP555570233, Tf2, KP831469612 * TeZ); + Tfn = FMA(KP980785280, Tfh, KP195090322 * Tfi); + Tf7 = FMA(KP555570233, TeZ, KP831469612 * Tf2); + Tfj = FNMS(KP980785280, Tfi, KP195090322 * Tfh); + } + { + E TeS, Tfe, TeV, Tff, TeR, TeU; + TeR = KP707106781 * (TdN + TdM); + TeS = TeQ - TeR; + Tfe = TeQ + TeR; + TeU = KP707106781 * (Tdz + TdE); + TeV = TeT - TeU; + Tff = TeT + TeU; + TeW = FMA(KP831469612, TeS, KP555570233 * TeV); + Tfm = FNMS(KP195090322, Tff, KP980785280 * Tfe); + Tf6 = FNMS(KP831469612, TeV, KP555570233 * TeS); + Tfg = FMA(KP195090322, Tfe, KP980785280 * Tff); + } + } + { + E TeP, Tf4, Tht, Thw; + TeP = TeH + TeO; + Tf4 = TeW + Tf3; + ci[WS(rs, 25)] = TeP - Tf4; + cr[WS(rs, 6)] = TeP + Tf4; + Tht = Tf7 - Tf6; + Thw = Thu + Thv; + cr[WS(rs, 38)] = Tht - Thw; + ci[WS(rs, 57)] = Tht + Thw; + } + { + E Thx, Thy, Tf5, Tf8; + Thx = Tf3 - TeW; + Thy = Thv - Thu; + cr[WS(rs, 54)] = Thx - Thy; + ci[WS(rs, 41)] = Thx + Thy; + Tf5 = TeH - TeO; + Tf8 = Tf6 + Tf7; + cr[WS(rs, 22)] = Tf5 - Tf8; + ci[WS(rs, 9)] = Tf5 + Tf8; + } + { + E Tfd, Tfk, Thj, Thq; + Tfd = Tf9 - Tfc; + Tfk = Tfg + Tfj; + ci[WS(rs, 17)] = Tfd - Tfk; + cr[WS(rs, 14)] = Tfd + Tfk; + Thj = Tfj - Tfg; + Thq = Thk + Thp; + cr[WS(rs, 62)] = Thj - Thq; + ci[WS(rs, 33)] = Thj + Thq; + } + { + E Thr, Ths, Tfl, Tfo; + Thr = Tfn - Tfm; + Ths = Thp - Thk; + cr[WS(rs, 46)] = Thr - Ths; + ci[WS(rs, 49)] = Thr + Ths; + Tfl = Tf9 + Tfc; + Tfo = Tfm + Tfn; + cr[WS(rs, 30)] = Tfl - Tfo; + ci[WS(rs, 1)] = Tfl + Tfo; + } + } + { + E Td1, Ten, Tdo, ThA, ThD, ThJ, Teq, ThI, Teh, TeB, Tel, Tex, TdQ, TeA, Tek; + E Teu; + { + E TcP, Td0, Teo, Tep; + TcP = TcL - TcO; + Td0 = KP707106781 * (TcU + TcZ); + Td1 = TcP - Td0; + Ten = TcP + Td0; + { + E Tdc, Tdn, ThB, ThC; + Tdc = FNMS(KP923879532, Tdb, KP382683432 * Td6); + Tdn = FMA(KP923879532, Tdh, KP382683432 * Tdm); + Tdo = Tdc + Tdn; + ThA = Tdn - Tdc; + ThB = KP707106781 * (TeF - TeE); + ThC = Thn - Thm; + ThD = ThB + ThC; + ThJ = ThC - ThB; + } + Teo = FMA(KP382683432, Tdb, KP923879532 * Td6); + Tep = FNMS(KP382683432, Tdh, KP923879532 * Tdm); + Teq = Teo + Tep; + ThI = Teo - Tep; + { + E Te7, Tew, Teg, Tev, Te6, Tef; + Te6 = KP707106781 * (Te0 - Te5); + Te7 = TdV - Te6; + Tew = TdV + Te6; + Tef = KP707106781 * (Ted - Tee); + Teg = Tec - Tef; + Tev = Tec + Tef; + Teh = FMA(KP555570233, Te7, KP831469612 * Teg); + TeB = FMA(KP980785280, Tew, KP195090322 * Tev); + Tel = FNMS(KP831469612, Te7, KP555570233 * Teg); + Tex = FNMS(KP195090322, Tew, KP980785280 * Tev); + } + { + E TdG, Tet, TdP, Tes, TdF, TdO; + TdF = KP707106781 * (Tdz - TdE); + TdG = Tdu - TdF; + Tet = Tdu + TdF; + TdO = KP707106781 * (TdM - TdN); + TdP = TdL - TdO; + Tes = TdL + TdO; + TdQ = FNMS(KP555570233, TdP, KP831469612 * TdG); + TeA = FNMS(KP980785280, Tes, KP195090322 * Tet); + Tek = FMA(KP831469612, TdP, KP555570233 * TdG); + Teu = FMA(KP195090322, Tes, KP980785280 * Tet); + } + } + { + E Tdp, Tei, ThH, ThK; + Tdp = Td1 + Tdo; + Tei = TdQ + Teh; + cr[WS(rs, 26)] = Tdp - Tei; + ci[WS(rs, 5)] = Tdp + Tei; + ThH = Tel - Tek; + ThK = ThI + ThJ; + cr[WS(rs, 58)] = ThH - ThK; + ci[WS(rs, 37)] = ThH + ThK; + } + { + E ThL, ThM, Tej, Tem; + ThL = Teh - TdQ; + ThM = ThJ - ThI; + cr[WS(rs, 42)] = ThL - ThM; + ci[WS(rs, 53)] = ThL + ThM; + Tej = Td1 - Tdo; + Tem = Tek + Tel; + ci[WS(rs, 21)] = Tej - Tem; + cr[WS(rs, 10)] = Tej + Tem; + } + { + E Ter, Tey, Thz, ThE; + Ter = Ten + Teq; + Tey = Teu + Tex; + ci[WS(rs, 29)] = Ter - Tey; + cr[WS(rs, 2)] = Ter + Tey; + Thz = TeB - TeA; + ThE = ThA + ThD; + cr[WS(rs, 34)] = Thz - ThE; + ci[WS(rs, 61)] = Thz + ThE; + } + { + E ThF, ThG, Tez, TeC; + ThF = Tex - Teu; + ThG = ThD - ThA; + cr[WS(rs, 50)] = ThF - ThG; + ci[WS(rs, 45)] = ThF + ThG; + Tez = Ten - Teq; + TeC = TeA + TeB; + cr[WS(rs, 18)] = Tez - TeC; + ci[WS(rs, 13)] = Tez + TeC; + } + } + { + E Tc3, Tcv, TiD, TiJ, Tca, TiI, Tcy, TiA, Tci, TcI, Tcs, TcC, Tcp, TcJ, Tct; + E TcF; + { + E TbZ, Tc2, TiB, TiC; + TbZ = Taz - TaC; + Tc2 = Tc0 + Tc1; + Tc3 = TbZ - Tc2; + Tcv = TbZ + Tc2; + TiB = TaG - TaJ; + TiC = Tin - Tim; + TiD = TiB + TiC; + TiJ = TiC - TiB; + } + { + E Tc6, Tcw, Tc9, Tcx; + { + E Tc4, Tc5, Tc7, Tc8; + Tc4 = TaP - TaQ; + Tc5 = TaM - TaN; + Tc6 = FMA(KP831469612, Tc4, KP555570233 * Tc5); + Tcw = FNMS(KP555570233, Tc4, KP831469612 * Tc5); + Tc7 = TaW - TaX; + Tc8 = TaT - TaU; + Tc9 = FNMS(KP831469612, Tc8, KP555570233 * Tc7); + Tcx = FMA(KP555570233, Tc8, KP831469612 * Tc7); + } + Tca = Tc6 + Tc9; + TiI = Tcx - Tcw; + Tcy = Tcw + Tcx; + TiA = Tc6 - Tc9; + } + { + E Tce, TcB, Tch, TcA; + { + E Tcc, Tcd, Tcf, Tcg; + Tcc = Tbd - Tbe; + Tcd = Tb7 - Tba; + Tce = Tcc - Tcd; + TcB = Tcc + Tcd; + Tcf = Tb2 - Tb3; + Tcg = Tbh - Tbg; + Tch = Tcf - Tcg; + TcA = Tcf + Tcg; + } + Tci = FMA(KP471396736, Tce, KP881921264 * Tch); + TcI = FMA(KP956940335, TcB, KP290284677 * TcA); + Tcs = FNMS(KP881921264, Tce, KP471396736 * Tch); + TcC = FNMS(KP290284677, TcB, KP956940335 * TcA); + } + { + E Tcl, TcE, Tco, TcD; + { + E Tcj, Tck, Tcm, Tcn; + Tcj = Tbl - Tbm; + Tck = TbA - Tbz; + Tcl = Tcj - Tck; + TcE = Tcj + Tck; + Tcm = Tbw - Tbx; + Tcn = Tbq - Tbt; + Tco = Tcm - Tcn; + TcD = Tcm + Tcn; + } + Tcp = FNMS(KP471396736, Tco, KP881921264 * Tcl); + TcJ = FNMS(KP956940335, TcD, KP290284677 * TcE); + Tct = FMA(KP881921264, Tco, KP471396736 * Tcl); + TcF = FMA(KP290284677, TcD, KP956940335 * TcE); + } + { + E Tcb, Tcq, TiH, TiK; + Tcb = Tc3 + Tca; + Tcq = Tci + Tcp; + ci[WS(rs, 26)] = Tcb - Tcq; + cr[WS(rs, 5)] = Tcb + Tcq; + TiH = Tct - Tcs; + TiK = TiI + TiJ; + cr[WS(rs, 37)] = TiH - TiK; + ci[WS(rs, 58)] = TiH + TiK; + } + { + E TiL, TiM, Tcr, Tcu; + TiL = Tcp - Tci; + TiM = TiJ - TiI; + cr[WS(rs, 53)] = TiL - TiM; + ci[WS(rs, 42)] = TiL + TiM; + Tcr = Tc3 - Tca; + Tcu = Tcs + Tct; + cr[WS(rs, 21)] = Tcr - Tcu; + ci[WS(rs, 10)] = Tcr + Tcu; + } + { + E Tcz, TcG, Tiz, TiE; + Tcz = Tcv + Tcy; + TcG = TcC + TcF; + cr[WS(rs, 29)] = Tcz - TcG; + ci[WS(rs, 2)] = Tcz + TcG; + Tiz = TcJ - TcI; + TiE = TiA + TiD; + cr[WS(rs, 61)] = Tiz - TiE; + ci[WS(rs, 34)] = Tiz + TiE; + } + { + E TiF, TiG, TcH, TcK; + TiF = TcF - TcC; + TiG = TiD - TiA; + cr[WS(rs, 45)] = TiF - TiG; + ci[WS(rs, 50)] = TiF + TiG; + TcH = Tcv - Tcy; + TcK = TcI + TcJ; + ci[WS(rs, 18)] = TcH - TcK; + cr[WS(rs, 13)] = TcH + TcK; + } + } + { + E TaL, TbJ, Tip, Tiv, Tb0, Tiu, TbM, Tik, Tbk, TbW, TbG, TbQ, TbD, TbX, TbH; + E TbT; + { + E TaD, TaK, Til, Tio; + TaD = Taz + TaC; + TaK = TaG + TaJ; + TaL = TaD - TaK; + TbJ = TaD + TaK; + Til = Tc1 - Tc0; + Tio = Tim + Tin; + Tip = Til + Tio; + Tiv = Tio - Til; + } + { + E TaS, TbK, TaZ, TbL; + { + E TaO, TaR, TaV, TaY; + TaO = TaM + TaN; + TaR = TaP + TaQ; + TaS = FNMS(KP980785280, TaR, KP195090322 * TaO); + TbK = FMA(KP195090322, TaR, KP980785280 * TaO); + TaV = TaT + TaU; + TaY = TaW + TaX; + TaZ = FMA(KP980785280, TaV, KP195090322 * TaY); + TbL = FNMS(KP195090322, TaV, KP980785280 * TaY); + } + Tb0 = TaS + TaZ; + Tiu = TbK - TbL; + TbM = TbK + TbL; + Tik = TaZ - TaS; + } + { + E Tbc, TbO, Tbj, TbP; + { + E Tb4, Tbb, Tbf, Tbi; + Tb4 = Tb2 + Tb3; + Tbb = Tb7 + Tba; + Tbc = Tb4 - Tbb; + TbO = Tb4 + Tbb; + Tbf = Tbd + Tbe; + Tbi = Tbg + Tbh; + Tbj = Tbf - Tbi; + TbP = Tbf + Tbi; + } + Tbk = FMA(KP634393284, Tbc, KP773010453 * Tbj); + TbW = FNMS(KP995184726, TbP, KP098017140 * TbO); + TbG = FNMS(KP634393284, Tbj, KP773010453 * Tbc); + TbQ = FMA(KP995184726, TbO, KP098017140 * TbP); + } + { + E Tbv, TbR, TbC, TbS; + { + E Tbn, Tbu, Tby, TbB; + Tbn = Tbl + Tbm; + Tbu = Tbq + Tbt; + Tbv = Tbn - Tbu; + TbR = Tbn + Tbu; + Tby = Tbw + Tbx; + TbB = Tbz + TbA; + TbC = Tby - TbB; + TbS = Tby + TbB; + } + TbD = FNMS(KP773010453, TbC, KP634393284 * Tbv); + TbX = FMA(KP098017140, TbR, KP995184726 * TbS); + TbH = FMA(KP773010453, Tbv, KP634393284 * TbC); + TbT = FNMS(KP098017140, TbS, KP995184726 * TbR); + } + { + E Tb1, TbE, Tit, Tiw; + Tb1 = TaL - Tb0; + TbE = Tbk + TbD; + ci[WS(rs, 22)] = Tb1 - TbE; + cr[WS(rs, 9)] = Tb1 + TbE; + Tit = TbD - Tbk; + Tiw = Tiu + Tiv; + cr[WS(rs, 57)] = Tit - Tiw; + ci[WS(rs, 38)] = Tit + Tiw; + } + { + E Tix, Tiy, TbF, TbI; + Tix = TbH - TbG; + Tiy = Tiv - Tiu; + cr[WS(rs, 41)] = Tix - Tiy; + ci[WS(rs, 54)] = Tix + Tiy; + TbF = TaL + Tb0; + TbI = TbG + TbH; + cr[WS(rs, 25)] = TbF - TbI; + ci[WS(rs, 6)] = TbF + TbI; + } + { + E TbN, TbU, Tij, Tiq; + TbN = TbJ + TbM; + TbU = TbQ + TbT; + ci[WS(rs, 30)] = TbN - TbU; + cr[WS(rs, 1)] = TbN + TbU; + Tij = TbX - TbW; + Tiq = Tik + Tip; + cr[WS(rs, 33)] = Tij - Tiq; + ci[WS(rs, 62)] = Tij + Tiq; + } + { + E Tir, Tis, TbV, TbY; + Tir = TbT - TbQ; + Tis = Tip - Tik; + cr[WS(rs, 49)] = Tir - Tis; + ci[WS(rs, 46)] = Tir + Tis; + TbV = TbJ - TbM; + TbY = TbW + TbX; + cr[WS(rs, 17)] = TbV - TbY; + ci[WS(rs, 14)] = TbV + TbY; + } + } + { + E T9R, Taj, Ti9, Tif, T9Y, Tie, Tam, Ti6, Ta6, Taw, Tag, Taq, Tad, Tax, Tah; + E Tat; + { + E T9N, T9Q, Ti7, Ti8; + T9N = T6b - T6m; + T9Q = T9O + T9P; + T9R = T9N - T9Q; + Taj = T9N + T9Q; + Ti7 = T6J - T6y; + Ti8 = ThT - ThQ; + Ti9 = Ti7 + Ti8; + Tif = Ti8 - Ti7; + } + { + E T9U, Tak, T9X, Tal; + { + E T9S, T9T, T9V, T9W; + T9S = T6Q - T71; + T9T = T77 - T7a; + T9U = FNMS(KP831469612, T9T, KP555570233 * T9S); + Tak = FMA(KP831469612, T9S, KP555570233 * T9T); + T9V = T7h - T7s; + T9W = T7y - T7B; + T9X = FMA(KP555570233, T9V, KP831469612 * T9W); + Tal = FNMS(KP555570233, T9W, KP831469612 * T9V); + } + T9Y = T9U + T9X; + Tie = Tak - Tal; + Tam = Tak + Tal; + Ti6 = T9X - T9U; + } + { + E Ta2, Tao, Ta5, Tap; + { + E Ta0, Ta1, Ta3, Ta4; + Ta0 = T8p - T8s; + Ta1 = T87 - T8i; + Ta2 = Ta0 - Ta1; + Tao = Ta0 + Ta1; + Ta3 = T7K - T7V; + Ta4 = T8v - T8u; + Ta5 = Ta3 - Ta4; + Tap = Ta3 + Ta4; + } + Ta6 = FMA(KP471396736, Ta2, KP881921264 * Ta5); + Taw = FNMS(KP956940335, Tap, KP290284677 * Tao); + Tag = FNMS(KP471396736, Ta5, KP881921264 * Ta2); + Taq = FMA(KP956940335, Tao, KP290284677 * Tap); + } + { + E Ta9, Tar, Tac, Tas; + { + E Ta7, Ta8, Taa, Tab; + Ta7 = T8D - T8O; + Ta8 = T9n - T9o; + Ta9 = Ta7 - Ta8; + Tar = Ta7 + Ta8; + Taa = T9i - T9l; + Tab = T9b - T90; + Tac = Taa - Tab; + Tas = Taa + Tab; + } + Tad = FNMS(KP881921264, Tac, KP471396736 * Ta9); + Tax = FMA(KP290284677, Tar, KP956940335 * Tas); + Tah = FMA(KP881921264, Ta9, KP471396736 * Tac); + Tat = FNMS(KP290284677, Tas, KP956940335 * Tar); + } + { + E T9Z, Tae, Tid, Tig; + T9Z = T9R - T9Y; + Tae = Ta6 + Tad; + ci[WS(rs, 20)] = T9Z - Tae; + cr[WS(rs, 11)] = T9Z + Tae; + Tid = Tad - Ta6; + Tig = Tie + Tif; + cr[WS(rs, 59)] = Tid - Tig; + ci[WS(rs, 36)] = Tid + Tig; + } + { + E Tih, Tii, Taf, Tai; + Tih = Tah - Tag; + Tii = Tif - Tie; + cr[WS(rs, 43)] = Tih - Tii; + ci[WS(rs, 52)] = Tih + Tii; + Taf = T9R + T9Y; + Tai = Tag + Tah; + cr[WS(rs, 27)] = Taf - Tai; + ci[WS(rs, 4)] = Taf + Tai; + } + { + E Tan, Tau, Ti5, Tia; + Tan = Taj + Tam; + Tau = Taq + Tat; + ci[WS(rs, 28)] = Tan - Tau; + cr[WS(rs, 3)] = Tan + Tau; + Ti5 = Tax - Taw; + Tia = Ti6 + Ti9; + cr[WS(rs, 35)] = Ti5 - Tia; + ci[WS(rs, 60)] = Ti5 + Tia; + } + { + E Tib, Tic, Tav, Tay; + Tib = Tat - Taq; + Tic = Ti9 - Ti6; + cr[WS(rs, 51)] = Tib - Tic; + ci[WS(rs, 44)] = Tib + Tic; + Tav = Taj - Tam; + Tay = Taw + Tax; + cr[WS(rs, 19)] = Tav - Tay; + ci[WS(rs, 12)] = Tav + Tay; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 64}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 64, "hf_64", twinstr, &GENUS, {808, 270, 230, 0} }; + +void X(codelet_hf_64) (planner *p) { + X(khc2hc_register) (p, hf_64, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_7.c new file mode 100644 index 000000000..59d05d640 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_7.c @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:28 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 7 -dit -name hf_7 -include rdft/scalar/hf.h */ + +/* + * This function contains 72 FP additions, 66 FP multiplications, + * (or, 18 additions, 12 multiplications, 54 fused multiply/add), + * 37 stack variables, 6 constants, and 28 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_7(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 12); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 12, MAKE_VOLATILE_STRIDE(14, rs)) { + E T1, T19, Te, T1i, TR, T1a, Tr, T1h, TM, T1b, TE, T1g, TW, T1c; + T1 = cr[0]; + T19 = ci[0]; + { + E T3, T6, T4, TN, T9, Tc, Ta, TP, T2, T8; + T3 = cr[WS(rs, 1)]; + T6 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = T2 * T3; + TN = T2 * T6; + T9 = cr[WS(rs, 6)]; + Tc = ci[WS(rs, 6)]; + T8 = W[10]; + Ta = T8 * T9; + TP = T8 * Tc; + { + E T7, TO, Td, TQ, T5, Tb; + T5 = W[1]; + T7 = FMA(T5, T6, T4); + TO = FNMS(T5, T3, TN); + Tb = W[11]; + Td = FMA(Tb, Tc, Ta); + TQ = FNMS(Tb, T9, TP); + Te = T7 + Td; + T1i = Td - T7; + TR = TO - TQ; + T1a = TO + TQ; + } + } + { + E Tg, Tj, Th, TI, Tm, Tp, Tn, TK, Tf, Tl; + Tg = cr[WS(rs, 2)]; + Tj = ci[WS(rs, 2)]; + Tf = W[2]; + Th = Tf * Tg; + TI = Tf * Tj; + Tm = cr[WS(rs, 5)]; + Tp = ci[WS(rs, 5)]; + Tl = W[8]; + Tn = Tl * Tm; + TK = Tl * Tp; + { + E Tk, TJ, Tq, TL, Ti, To; + Ti = W[3]; + Tk = FMA(Ti, Tj, Th); + TJ = FNMS(Ti, Tg, TI); + To = W[9]; + Tq = FMA(To, Tp, Tn); + TL = FNMS(To, Tm, TK); + Tr = Tk + Tq; + T1h = Tq - Tk; + TM = TJ - TL; + T1b = TJ + TL; + } + } + { + E Tt, Tw, Tu, TS, Tz, TC, TA, TU, Ts, Ty; + Tt = cr[WS(rs, 3)]; + Tw = ci[WS(rs, 3)]; + Ts = W[4]; + Tu = Ts * Tt; + TS = Ts * Tw; + Tz = cr[WS(rs, 4)]; + TC = ci[WS(rs, 4)]; + Ty = W[6]; + TA = Ty * Tz; + TU = Ty * TC; + { + E Tx, TT, TD, TV, Tv, TB; + Tv = W[5]; + Tx = FMA(Tv, Tw, Tu); + TT = FNMS(Tv, Tt, TS); + TB = W[7]; + TD = FMA(TB, TC, TA); + TV = FNMS(TB, Tz, TU); + TE = Tx + TD; + T1g = TD - Tx; + TW = TT - TV; + T1c = TT + TV; + } + } + cr[0] = T1 + Te + Tr + TE; + { + E TG, TY, TF, TX, TH; + TF = FNMS(KP356895867, Tr, Te); + TG = FNMS(KP692021471, TF, TE); + TX = FMA(KP554958132, TW, TR); + TY = FMA(KP801937735, TX, TM); + TH = FNMS(KP900968867, TG, T1); + ci[0] = FNMS(KP974927912, TY, TH); + cr[WS(rs, 1)] = FMA(KP974927912, TY, TH); + } + ci[WS(rs, 6)] = T1a + T1b + T1c + T19; + { + E T1r, T1u, T1q, T1t, T1s; + T1q = FNMS(KP356895867, T1b, T1a); + T1r = FNMS(KP692021471, T1q, T1c); + T1t = FMA(KP554958132, T1g, T1i); + T1u = FMA(KP801937735, T1t, T1h); + T1s = FNMS(KP900968867, T1r, T19); + cr[WS(rs, 6)] = FMS(KP974927912, T1u, T1s); + ci[WS(rs, 5)] = FMA(KP974927912, T1u, T1s); + } + { + E T1m, T1p, T1l, T1o, T1n; + T1l = FNMS(KP356895867, T1a, T1c); + T1m = FNMS(KP692021471, T1l, T1b); + T1o = FMA(KP554958132, T1h, T1g); + T1p = FNMS(KP801937735, T1o, T1i); + T1n = FNMS(KP900968867, T1m, T19); + cr[WS(rs, 5)] = FMS(KP974927912, T1p, T1n); + ci[WS(rs, 4)] = FMA(KP974927912, T1p, T1n); + } + { + E T1e, T1k, T1d, T1j, T1f; + T1d = FNMS(KP356895867, T1c, T1b); + T1e = FNMS(KP692021471, T1d, T1a); + T1j = FNMS(KP554958132, T1i, T1h); + T1k = FNMS(KP801937735, T1j, T1g); + T1f = FNMS(KP900968867, T1e, T19); + cr[WS(rs, 4)] = FMS(KP974927912, T1k, T1f); + ci[WS(rs, 3)] = FMA(KP974927912, T1k, T1f); + } + { + E T15, T18, T14, T17, T16; + T14 = FNMS(KP356895867, TE, Tr); + T15 = FNMS(KP692021471, T14, Te); + T17 = FNMS(KP554958132, TR, TM); + T18 = FNMS(KP801937735, T17, TW); + T16 = FNMS(KP900968867, T15, T1); + ci[WS(rs, 2)] = FNMS(KP974927912, T18, T16); + cr[WS(rs, 3)] = FMA(KP974927912, T18, T16); + } + { + E T10, T13, TZ, T12, T11; + TZ = FNMS(KP356895867, Te, TE); + T10 = FNMS(KP692021471, TZ, Tr); + T12 = FMA(KP554958132, TM, TW); + T13 = FNMS(KP801937735, T12, TR); + T11 = FNMS(KP900968867, T10, T1); + ci[WS(rs, 1)] = FNMS(KP974927912, T13, T11); + cr[WS(rs, 2)] = FMA(KP974927912, T13, T11); + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 7, "hf_7", twinstr, &GENUS, {18, 12, 54, 0} }; + +void X(codelet_hf_7) (planner *p) { + X(khc2hc_register) (p, hf_7, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 7 -dit -name hf_7 -include rdft/scalar/hf.h */ + +/* + * This function contains 72 FP additions, 60 FP multiplications, + * (or, 36 additions, 24 multiplications, 36 fused multiply/add), + * 29 stack variables, 6 constants, and 28 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_7(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 12); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 12, MAKE_VOLATILE_STRIDE(14, rs)) { + E T1, TT, Tc, TV, TC, TO, Tn, TS, TI, TP, Ty, TU, TF, TQ; + T1 = cr[0]; + TT = ci[0]; + { + E T6, TA, Tb, TB; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 1)]; + T5 = ci[WS(rs, 1)]; + T2 = W[0]; + T4 = W[1]; + T6 = FMA(T2, T3, T4 * T5); + TA = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 6)]; + Ta = ci[WS(rs, 6)]; + T7 = W[10]; + T9 = W[11]; + Tb = FMA(T7, T8, T9 * Ta); + TB = FNMS(T9, T8, T7 * Ta); + } + Tc = T6 + Tb; + TV = TA + TB; + TC = TA - TB; + TO = Tb - T6; + } + { + E Th, TG, Tm, TH; + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 2)]; + Tg = ci[WS(rs, 2)]; + Td = W[2]; + Tf = W[3]; + Th = FMA(Td, Te, Tf * Tg); + TG = FNMS(Tf, Te, Td * Tg); + } + { + E Tj, Tl, Ti, Tk; + Tj = cr[WS(rs, 5)]; + Tl = ci[WS(rs, 5)]; + Ti = W[8]; + Tk = W[9]; + Tm = FMA(Ti, Tj, Tk * Tl); + TH = FNMS(Tk, Tj, Ti * Tl); + } + Tn = Th + Tm; + TS = TG + TH; + TI = TG - TH; + TP = Th - Tm; + } + { + E Ts, TD, Tx, TE; + { + E Tp, Tr, To, Tq; + Tp = cr[WS(rs, 3)]; + Tr = ci[WS(rs, 3)]; + To = W[4]; + Tq = W[5]; + Ts = FMA(To, Tp, Tq * Tr); + TD = FNMS(Tq, Tp, To * Tr); + } + { + E Tu, Tw, Tt, Tv; + Tu = cr[WS(rs, 4)]; + Tw = ci[WS(rs, 4)]; + Tt = W[6]; + Tv = W[7]; + Tx = FMA(Tt, Tu, Tv * Tw); + TE = FNMS(Tv, Tu, Tt * Tw); + } + Ty = Ts + Tx; + TU = TD + TE; + TF = TD - TE; + TQ = Tx - Ts; + } + { + E TL, TK, TZ, T10; + cr[0] = T1 + Tc + Tn + Ty; + TL = FMA(KP781831482, TC, KP974927912 * TI) + (KP433883739 * TF); + TK = FMA(KP623489801, Tc, T1) + FNMA(KP900968867, Ty, KP222520933 * Tn); + ci[0] = TK - TL; + cr[WS(rs, 1)] = TK + TL; + ci[WS(rs, 6)] = TV + TS + TU + TT; + TZ = FMA(KP781831482, TO, KP433883739 * TQ) - (KP974927912 * TP); + T10 = FMA(KP623489801, TV, TT) + FNMA(KP900968867, TU, KP222520933 * TS); + cr[WS(rs, 6)] = TZ - T10; + ci[WS(rs, 5)] = TZ + T10; + } + { + E TX, TY, TR, TW; + TX = FMA(KP974927912, TO, KP433883739 * TP) - (KP781831482 * TQ); + TY = FMA(KP623489801, TU, TT) + FNMA(KP900968867, TS, KP222520933 * TV); + cr[WS(rs, 5)] = TX - TY; + ci[WS(rs, 4)] = TX + TY; + TR = FMA(KP433883739, TO, KP781831482 * TP) + (KP974927912 * TQ); + TW = FMA(KP623489801, TS, TT) + FNMA(KP222520933, TU, KP900968867 * TV); + cr[WS(rs, 4)] = TR - TW; + ci[WS(rs, 3)] = TR + TW; + } + { + E TN, TM, TJ, Tz; + TN = FMA(KP433883739, TC, KP974927912 * TF) - (KP781831482 * TI); + TM = FMA(KP623489801, Tn, T1) + FNMA(KP222520933, Ty, KP900968867 * Tc); + ci[WS(rs, 2)] = TM - TN; + cr[WS(rs, 3)] = TM + TN; + TJ = FNMS(KP781831482, TF, KP974927912 * TC) - (KP433883739 * TI); + Tz = FMA(KP623489801, Ty, T1) + FNMA(KP900968867, Tn, KP222520933 * Tc); + ci[WS(rs, 1)] = Tz - TJ; + cr[WS(rs, 2)] = Tz + TJ; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 7}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 7, "hf_7", twinstr, &GENUS, {36, 24, 36, 0} }; + +void X(codelet_hf_7) (planner *p) { + X(khc2hc_register) (p, hf_7, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_8.c new file mode 100644 index 000000000..1a2412c0b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_8.c @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -dit -name hf_8 -include rdft/scalar/hf.h */ + +/* + * This function contains 66 FP additions, 36 FP multiplications, + * (or, 44 additions, 14 multiplications, 22 fused multiply/add), + * 34 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs)) { + E T1, T1m, T7, T1l, Tk, TS, Te, TQ, TF, T14, TL, T16, T12, T17, Ts; + E TX, Ty, TZ, TV, T10; + T1 = cr[0]; + T1m = ci[0]; + { + E T3, T6, T4, T1k, T2, T5; + T3 = cr[WS(rs, 4)]; + T6 = ci[WS(rs, 4)]; + T2 = W[6]; + T4 = T2 * T3; + T1k = T2 * T6; + T5 = W[7]; + T7 = FMA(T5, T6, T4); + T1l = FNMS(T5, T3, T1k); + } + { + E Tg, Tj, Th, TR, Tf, Ti; + Tg = cr[WS(rs, 6)]; + Tj = ci[WS(rs, 6)]; + Tf = W[10]; + Th = Tf * Tg; + TR = Tf * Tj; + Ti = W[11]; + Tk = FMA(Ti, Tj, Th); + TS = FNMS(Ti, Tg, TR); + } + { + E Ta, Td, Tb, TP, T9, Tc; + Ta = cr[WS(rs, 2)]; + Td = ci[WS(rs, 2)]; + T9 = W[2]; + Tb = T9 * Ta; + TP = T9 * Td; + Tc = W[3]; + Te = FMA(Tc, Td, Tb); + TQ = FNMS(Tc, Ta, TP); + } + { + E TB, TE, TC, T13, TH, TK, TI, T15, TA, TG, TD, TJ; + TB = cr[WS(rs, 7)]; + TE = ci[WS(rs, 7)]; + TA = W[12]; + TC = TA * TB; + T13 = TA * TE; + TH = cr[WS(rs, 3)]; + TK = ci[WS(rs, 3)]; + TG = W[4]; + TI = TG * TH; + T15 = TG * TK; + TD = W[13]; + TF = FMA(TD, TE, TC); + T14 = FNMS(TD, TB, T13); + TJ = W[5]; + TL = FMA(TJ, TK, TI); + T16 = FNMS(TJ, TH, T15); + T12 = TF - TL; + T17 = T14 - T16; + } + { + E To, Tr, Tp, TW, Tu, Tx, Tv, TY, Tn, Tt, Tq, Tw; + To = cr[WS(rs, 1)]; + Tr = ci[WS(rs, 1)]; + Tn = W[0]; + Tp = Tn * To; + TW = Tn * Tr; + Tu = cr[WS(rs, 5)]; + Tx = ci[WS(rs, 5)]; + Tt = W[8]; + Tv = Tt * Tu; + TY = Tt * Tx; + Tq = W[1]; + Ts = FMA(Tq, Tr, Tp); + TX = FNMS(Tq, To, TW); + Tw = W[9]; + Ty = FMA(Tw, Tx, Tv); + TZ = FNMS(Tw, Tu, TY); + TV = Ts - Ty; + T10 = TX - TZ; + } + { + E TU, T1a, T1t, T1v, T19, T1u, T1d, T1w; + { + E TO, TT, T1r, T1s; + TO = T1 - T7; + TT = TQ - TS; + TU = TO + TT; + T1a = TO - TT; + T1r = Te - Tk; + T1s = T1m - T1l; + T1t = T1r + T1s; + T1v = T1s - T1r; + } + { + E T11, T18, T1b, T1c; + T11 = TV + T10; + T18 = T12 - T17; + T19 = T11 + T18; + T1u = T18 - T11; + T1b = TV - T10; + T1c = T12 + T17; + T1d = T1b + T1c; + T1w = T1c - T1b; + } + ci[WS(rs, 2)] = FNMS(KP707106781, T19, TU); + cr[WS(rs, 5)] = FMS(KP707106781, T1w, T1v); + ci[WS(rs, 6)] = FMA(KP707106781, T1w, T1v); + cr[WS(rs, 1)] = FMA(KP707106781, T19, TU); + cr[WS(rs, 3)] = FNMS(KP707106781, T1d, T1a); + cr[WS(rs, 7)] = FMS(KP707106781, T1u, T1t); + ci[WS(rs, 4)] = FMA(KP707106781, T1u, T1t); + ci[0] = FMA(KP707106781, T1d, T1a); + } + { + E Tm, T1e, T1o, T1q, TN, T1p, T1h, T1i; + { + E T8, Tl, T1j, T1n; + T8 = T1 + T7; + Tl = Te + Tk; + Tm = T8 + Tl; + T1e = T8 - Tl; + T1j = TQ + TS; + T1n = T1l + T1m; + T1o = T1j + T1n; + T1q = T1n - T1j; + } + { + E Tz, TM, T1f, T1g; + Tz = Ts + Ty; + TM = TF + TL; + TN = Tz + TM; + T1p = TM - Tz; + T1f = T14 + T16; + T1g = TX + TZ; + T1h = T1f - T1g; + T1i = T1g + T1f; + } + ci[WS(rs, 3)] = Tm - TN; + cr[WS(rs, 6)] = T1p - T1q; + ci[WS(rs, 5)] = T1p + T1q; + cr[0] = Tm + TN; + cr[WS(rs, 2)] = T1e - T1h; + cr[WS(rs, 4)] = T1i - T1o; + ci[WS(rs, 7)] = T1i + T1o; + ci[WS(rs, 1)] = T1e + T1h; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hf_8", twinstr, &GENUS, {44, 14, 22, 0} }; + +void X(codelet_hf_8) (planner *p) { + X(khc2hc_register) (p, hf_8, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 8 -dit -name hf_8 -include rdft/scalar/hf.h */ + +/* + * This function contains 66 FP additions, 32 FP multiplications, + * (or, 52 additions, 18 multiplications, 14 fused multiply/add), + * 28 stack variables, 1 constants, and 32 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_8(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 14); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 14, MAKE_VOLATILE_STRIDE(16, rs)) { + E T7, T1f, TH, T19, TF, T12, TR, TU, Ti, T1e, TK, T16, Tu, T13, TM; + E TP; + { + E T1, T18, T6, T17; + T1 = cr[0]; + T18 = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 4)]; + T5 = ci[WS(rs, 4)]; + T2 = W[6]; + T4 = W[7]; + T6 = FMA(T2, T3, T4 * T5); + T17 = FNMS(T4, T3, T2 * T5); + } + T7 = T1 + T6; + T1f = T18 - T17; + TH = T1 - T6; + T19 = T17 + T18; + } + { + E Tz, TS, TE, TT; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 7)]; + Ty = ci[WS(rs, 7)]; + Tv = W[12]; + Tx = W[13]; + Tz = FMA(Tv, Tw, Tx * Ty); + TS = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 3)]; + TD = ci[WS(rs, 3)]; + TA = W[4]; + TC = W[5]; + TE = FMA(TA, TB, TC * TD); + TT = FNMS(TC, TB, TA * TD); + } + TF = Tz + TE; + T12 = TS + TT; + TR = Tz - TE; + TU = TS - TT; + } + { + E Tc, TI, Th, TJ; + { + E T9, Tb, T8, Ta; + T9 = cr[WS(rs, 2)]; + Tb = ci[WS(rs, 2)]; + T8 = W[2]; + Ta = W[3]; + Tc = FMA(T8, T9, Ta * Tb); + TI = FNMS(Ta, T9, T8 * Tb); + } + { + E Te, Tg, Td, Tf; + Te = cr[WS(rs, 6)]; + Tg = ci[WS(rs, 6)]; + Td = W[10]; + Tf = W[11]; + Th = FMA(Td, Te, Tf * Tg); + TJ = FNMS(Tf, Te, Td * Tg); + } + Ti = Tc + Th; + T1e = Tc - Th; + TK = TI - TJ; + T16 = TI + TJ; + } + { + E To, TN, Tt, TO; + { + E Tl, Tn, Tk, Tm; + Tl = cr[WS(rs, 1)]; + Tn = ci[WS(rs, 1)]; + Tk = W[0]; + Tm = W[1]; + To = FMA(Tk, Tl, Tm * Tn); + TN = FNMS(Tm, Tl, Tk * Tn); + } + { + E Tq, Ts, Tp, Tr; + Tq = cr[WS(rs, 5)]; + Ts = ci[WS(rs, 5)]; + Tp = W[8]; + Tr = W[9]; + Tt = FMA(Tp, Tq, Tr * Ts); + TO = FNMS(Tr, Tq, Tp * Ts); + } + Tu = To + Tt; + T13 = TN + TO; + TM = To - Tt; + TP = TN - TO; + } + { + E Tj, TG, T1b, T1c; + Tj = T7 + Ti; + TG = Tu + TF; + ci[WS(rs, 3)] = Tj - TG; + cr[0] = Tj + TG; + T1b = TF - Tu; + T1c = T19 - T16; + cr[WS(rs, 6)] = T1b - T1c; + ci[WS(rs, 5)] = T1b + T1c; + { + E TX, T1i, T10, T1h, TY, TZ; + TX = TH - TK; + T1i = T1f - T1e; + TY = TM - TP; + TZ = TR + TU; + T10 = KP707106781 * (TY + TZ); + T1h = KP707106781 * (TZ - TY); + cr[WS(rs, 3)] = TX - T10; + ci[WS(rs, 6)] = T1h + T1i; + ci[0] = TX + T10; + cr[WS(rs, 5)] = T1h - T1i; + } + } + { + E T15, T1a, T11, T14; + T15 = T13 + T12; + T1a = T16 + T19; + cr[WS(rs, 4)] = T15 - T1a; + ci[WS(rs, 7)] = T15 + T1a; + T11 = T7 - Ti; + T14 = T12 - T13; + cr[WS(rs, 2)] = T11 - T14; + ci[WS(rs, 1)] = T11 + T14; + { + E TL, T1g, TW, T1d, TQ, TV; + TL = TH + TK; + T1g = T1e + T1f; + TQ = TM + TP; + TV = TR - TU; + TW = KP707106781 * (TQ + TV); + T1d = KP707106781 * (TV - TQ); + ci[WS(rs, 2)] = TL - TW; + ci[WS(rs, 4)] = T1d + T1g; + cr[WS(rs, 1)] = TL + TW; + cr[WS(rs, 7)] = T1d - T1g; + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 8}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 8, "hf_8", twinstr, &GENUS, {52, 18, 14, 0} }; + +void X(codelet_hf_8) (planner *p) { + X(khc2hc_register) (p, hf_8, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_9.c new file mode 100644 index 000000000..81e81ec62 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/hf_9.c @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:29 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2hc.native -fma -compact -variables 4 -pipeline-latency 4 -n 9 -dit -name hf_9 -include rdft/scalar/hf.h */ + +/* + * This function contains 96 FP additions, 88 FP multiplications, + * (or, 24 additions, 16 multiplications, 72 fused multiply/add), + * 55 stack variables, 10 constants, and 36 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_9(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP492403876, +0.492403876506104029683371512294761506835321626); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP777861913, +0.777861913430206160028177977318626690410586096); + DK(KP839099631, +0.839099631177280011763127298123181364687434283); + DK(KP954188894, +0.954188894138671133499268364187245676532219158); + DK(KP363970234, +0.363970234266202361351047882776834043890471784); + DK(KP176326980, +0.176326980708464973471090386868618986121633062); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 16); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 16, MAKE_VOLATILE_STRIDE(18, rs)) { + E T1, T1P, Te, T1S, T10, T1Q, T1a, T1d, Ty, T18, Tl, T13, T19, T1c, T1l; + E T1r, TS, T1p, TF, T1o, T1g, T1q; + T1 = cr[0]; + T1P = ci[0]; + { + E T3, T6, T4, TW, T9, Tc, Ta, TY, T2, T8; + T3 = cr[WS(rs, 3)]; + T6 = ci[WS(rs, 3)]; + T2 = W[4]; + T4 = T2 * T3; + TW = T2 * T6; + T9 = cr[WS(rs, 6)]; + Tc = ci[WS(rs, 6)]; + T8 = W[10]; + Ta = T8 * T9; + TY = T8 * Tc; + { + E T7, TX, Td, TZ, T5, Tb; + T5 = W[5]; + T7 = FMA(T5, T6, T4); + TX = FNMS(T5, T3, TW); + Tb = W[11]; + Td = FMA(Tb, Tc, Ta); + TZ = FNMS(Tb, T9, TY); + Te = T7 + Td; + T1S = Td - T7; + T10 = TX - TZ; + T1Q = TX + TZ; + } + } + { + E Th, Tk, Ti, T12, Tx, T17, Tr, T15, Tg, Tj; + Th = cr[WS(rs, 1)]; + Tk = ci[WS(rs, 1)]; + Tg = W[0]; + Ti = Tg * Th; + T12 = Tg * Tk; + { + E Tt, Tw, Tu, T16, Ts, Tv; + Tt = cr[WS(rs, 7)]; + Tw = ci[WS(rs, 7)]; + Ts = W[12]; + Tu = Ts * Tt; + T16 = Ts * Tw; + Tv = W[13]; + Tx = FMA(Tv, Tw, Tu); + T17 = FNMS(Tv, Tt, T16); + } + { + E Tn, Tq, To, T14, Tm, Tp; + Tn = cr[WS(rs, 4)]; + Tq = ci[WS(rs, 4)]; + Tm = W[6]; + To = Tm * Tn; + T14 = Tm * Tq; + Tp = W[7]; + Tr = FMA(Tp, Tq, To); + T15 = FNMS(Tp, Tn, T14); + } + T1a = Tr - Tx; + T1d = T15 - T17; + Ty = Tr + Tx; + T18 = T15 + T17; + Tj = W[1]; + Tl = FMA(Tj, Tk, Ti); + T13 = FNMS(Tj, Th, T12); + T19 = FNMS(KP500000000, T18, T13); + T1c = FNMS(KP500000000, Ty, Tl); + } + { + E TB, TE, TC, T1n, TR, T1k, TL, T1i, TA, TD; + TB = cr[WS(rs, 2)]; + TE = ci[WS(rs, 2)]; + TA = W[2]; + TC = TA * TB; + T1n = TA * TE; + { + E TN, TQ, TO, T1j, TM, TP; + TN = cr[WS(rs, 8)]; + TQ = ci[WS(rs, 8)]; + TM = W[14]; + TO = TM * TN; + T1j = TM * TQ; + TP = W[15]; + TR = FMA(TP, TQ, TO); + T1k = FNMS(TP, TN, T1j); + } + { + E TH, TK, TI, T1h, TG, TJ; + TH = cr[WS(rs, 5)]; + TK = ci[WS(rs, 5)]; + TG = W[8]; + TI = TG * TH; + T1h = TG * TK; + TJ = W[9]; + TL = FMA(TJ, TK, TI); + T1i = FNMS(TJ, TH, T1h); + } + T1l = T1i - T1k; + T1r = TR - TL; + TS = TL + TR; + T1p = T1i + T1k; + TD = W[3]; + TF = FMA(TD, TE, TC); + T1o = FNMS(TD, TB, T1n); + T1g = FNMS(KP500000000, TS, TF); + T1q = FNMS(KP500000000, T1p, T1o); + } + { + E Tf, T21, TU, T24, T1O, T22, T1L, T23; + Tf = T1 + Te; + T21 = T1Q + T1P; + { + E Tz, TT, T1M, T1N; + Tz = Tl + Ty; + TT = TF + TS; + TU = Tz + TT; + T24 = TT - Tz; + T1M = T13 + T18; + T1N = T1o + T1p; + T1O = T1M - T1N; + T22 = T1M + T1N; + } + cr[0] = Tf + TU; + ci[WS(rs, 8)] = T22 + T21; + T1L = FNMS(KP500000000, TU, Tf); + ci[WS(rs, 2)] = FNMS(KP866025403, T1O, T1L); + cr[WS(rs, 3)] = FMA(KP866025403, T1O, T1L); + T23 = FNMS(KP500000000, T22, T21); + cr[WS(rs, 6)] = FMS(KP866025403, T24, T23); + ci[WS(rs, 5)] = FMA(KP866025403, T24, T23); + } + { + E T11, T1z, T1T, T1X, T1f, T1w, T1t, T1x, T1u, T1Y, T1C, T1I, T1F, T1J, T1G; + E T1U, TV, T1R; + TV = FNMS(KP500000000, Te, T1); + T11 = FNMS(KP866025403, T10, TV); + T1z = FMA(KP866025403, T10, TV); + T1R = FNMS(KP500000000, T1Q, T1P); + T1T = FMA(KP866025403, T1S, T1R); + T1X = FNMS(KP866025403, T1S, T1R); + { + E T1b, T1e, T1m, T1s; + T1b = FMA(KP866025403, T1a, T19); + T1e = FNMS(KP866025403, T1d, T1c); + T1f = FMA(KP176326980, T1e, T1b); + T1w = FNMS(KP176326980, T1b, T1e); + T1m = FNMS(KP866025403, T1l, T1g); + T1s = FNMS(KP866025403, T1r, T1q); + T1t = FNMS(KP363970234, T1s, T1m); + T1x = FMA(KP363970234, T1m, T1s); + } + T1u = FNMS(KP954188894, T1t, T1f); + T1Y = FMA(KP954188894, T1x, T1w); + { + E T1A, T1B, T1D, T1E; + T1A = FMA(KP866025403, T1r, T1q); + T1B = FMA(KP866025403, T1l, T1g); + T1C = FMA(KP176326980, T1B, T1A); + T1I = FNMS(KP176326980, T1A, T1B); + T1D = FMA(KP866025403, T1d, T1c); + T1E = FNMS(KP866025403, T1a, T19); + T1F = FMA(KP839099631, T1E, T1D); + T1J = FNMS(KP839099631, T1D, T1E); + } + T1G = FMA(KP777861913, T1F, T1C); + T1U = FNMS(KP777861913, T1J, T1I); + cr[WS(rs, 2)] = FMA(KP984807753, T1u, T11); + ci[WS(rs, 7)] = FNMS(KP984807753, T1U, T1T); + ci[WS(rs, 6)] = FNMS(KP984807753, T1Y, T1X); + cr[WS(rs, 1)] = FMA(KP984807753, T1G, T1z); + { + E T1V, T1W, T1H, T1K; + T1V = FMA(KP492403876, T1U, T1T); + T1W = FNMS(KP777861913, T1F, T1C); + cr[WS(rs, 7)] = FMS(KP852868531, T1W, T1V); + ci[WS(rs, 4)] = FMA(KP852868531, T1W, T1V); + T1H = FNMS(KP492403876, T1G, T1z); + T1K = FMA(KP777861913, T1J, T1I); + ci[WS(rs, 1)] = FNMS(KP852868531, T1K, T1H); + cr[WS(rs, 4)] = FMA(KP852868531, T1K, T1H); + } + { + E T1v, T1y, T1Z, T20; + T1v = FNMS(KP492403876, T1u, T11); + T1y = FNMS(KP954188894, T1x, T1w); + ci[WS(rs, 3)] = FNMS(KP852868531, T1y, T1v); + ci[0] = FMA(KP852868531, T1y, T1v); + T1Z = FMA(KP492403876, T1Y, T1X); + T20 = FMA(KP954188894, T1t, T1f); + cr[WS(rs, 5)] = FMS(KP852868531, T20, T1Z); + cr[WS(rs, 8)] = -(FMA(KP852868531, T20, T1Z)); + } + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 9}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 9, "hf_9", twinstr, &GENUS, {24, 16, 72, 0} }; + +void X(codelet_hf_9) (planner *p) { + X(khc2hc_register) (p, hf_9, &desc); +} +#else + +/* Generated by: ../../../genfft/gen_hc2hc.native -compact -variables 4 -pipeline-latency 4 -n 9 -dit -name hf_9 -include rdft/scalar/hf.h */ + +/* + * This function contains 96 FP additions, 72 FP multiplications, + * (or, 60 additions, 36 multiplications, 36 fused multiply/add), + * 41 stack variables, 8 constants, and 36 memory accesses + */ +#include "rdft/scalar/hf.h" + +static void hf_9(R *cr, R *ci, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP342020143, +0.342020143325668733044099614682259580763083368); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * 16); m < me; m = m + 1, cr = cr + ms, ci = ci - ms, W = W + 16, MAKE_VOLATILE_STRIDE(18, rs)) { + E T1, T1B, TQ, T1A, Tc, TN, T1C, T1D, TL, T1x, T19, T1o, T1c, T1n, Tu; + E T1w, TW, T1k, T11, T1l; + { + E T6, TO, Tb, TP; + T1 = cr[0]; + T1B = ci[0]; + { + E T3, T5, T2, T4; + T3 = cr[WS(rs, 3)]; + T5 = ci[WS(rs, 3)]; + T2 = W[4]; + T4 = W[5]; + T6 = FMA(T2, T3, T4 * T5); + TO = FNMS(T4, T3, T2 * T5); + } + { + E T8, Ta, T7, T9; + T8 = cr[WS(rs, 6)]; + Ta = ci[WS(rs, 6)]; + T7 = W[10]; + T9 = W[11]; + Tb = FMA(T7, T8, T9 * Ta); + TP = FNMS(T9, T8, T7 * Ta); + } + TQ = KP866025403 * (TO - TP); + T1A = KP866025403 * (Tb - T6); + Tc = T6 + Tb; + TN = FNMS(KP500000000, Tc, T1); + T1C = TO + TP; + T1D = FNMS(KP500000000, T1C, T1B); + } + { + E Tz, T13, TE, T14, TJ, T15, TK, T16; + { + E Tw, Ty, Tv, Tx; + Tw = cr[WS(rs, 2)]; + Ty = ci[WS(rs, 2)]; + Tv = W[2]; + Tx = W[3]; + Tz = FMA(Tv, Tw, Tx * Ty); + T13 = FNMS(Tx, Tw, Tv * Ty); + } + { + E TB, TD, TA, TC; + TB = cr[WS(rs, 5)]; + TD = ci[WS(rs, 5)]; + TA = W[8]; + TC = W[9]; + TE = FMA(TA, TB, TC * TD); + T14 = FNMS(TC, TB, TA * TD); + } + { + E TG, TI, TF, TH; + TG = cr[WS(rs, 8)]; + TI = ci[WS(rs, 8)]; + TF = W[14]; + TH = W[15]; + TJ = FMA(TF, TG, TH * TI); + T15 = FNMS(TH, TG, TF * TI); + } + TK = TE + TJ; + T16 = T14 + T15; + TL = Tz + TK; + T1x = T13 + T16; + { + E T17, T18, T1a, T1b; + T17 = FNMS(KP500000000, T16, T13); + T18 = KP866025403 * (TJ - TE); + T19 = T17 - T18; + T1o = T18 + T17; + T1a = FNMS(KP500000000, TK, Tz); + T1b = KP866025403 * (T14 - T15); + T1c = T1a - T1b; + T1n = T1a + T1b; + } + } + { + E Ti, TX, Tn, TT, Ts, TU, Tt, TY; + { + E Tf, Th, Te, Tg; + Tf = cr[WS(rs, 1)]; + Th = ci[WS(rs, 1)]; + Te = W[0]; + Tg = W[1]; + Ti = FMA(Te, Tf, Tg * Th); + TX = FNMS(Tg, Tf, Te * Th); + } + { + E Tk, Tm, Tj, Tl; + Tk = cr[WS(rs, 4)]; + Tm = ci[WS(rs, 4)]; + Tj = W[6]; + Tl = W[7]; + Tn = FMA(Tj, Tk, Tl * Tm); + TT = FNMS(Tl, Tk, Tj * Tm); + } + { + E Tp, Tr, To, Tq; + Tp = cr[WS(rs, 7)]; + Tr = ci[WS(rs, 7)]; + To = W[12]; + Tq = W[13]; + Ts = FMA(To, Tp, Tq * Tr); + TU = FNMS(Tq, Tp, To * Tr); + } + Tt = Tn + Ts; + TY = TT + TU; + Tu = Ti + Tt; + T1w = TX + TY; + { + E TS, TV, TZ, T10; + TS = FNMS(KP500000000, Tt, Ti); + TV = KP866025403 * (TT - TU); + TW = TS - TV; + T1k = TS + TV; + TZ = FNMS(KP500000000, TY, TX); + T10 = KP866025403 * (Ts - Tn); + T11 = TZ - T10; + T1l = T10 + TZ; + } + } + { + E T1y, Td, TM, T1v; + T1y = KP866025403 * (T1w - T1x); + Td = T1 + Tc; + TM = Tu + TL; + T1v = FNMS(KP500000000, TM, Td); + cr[0] = Td + TM; + cr[WS(rs, 3)] = T1v + T1y; + ci[WS(rs, 2)] = T1v - T1y; + } + { + E TR, T1I, T1e, T1K, T1i, T1H, T1f, T1J; + TR = TN - TQ; + T1I = T1D - T1A; + { + E T12, T1d, T1g, T1h; + T12 = FMA(KP173648177, TW, KP984807753 * T11); + T1d = FNMS(KP939692620, T1c, KP342020143 * T19); + T1e = T12 + T1d; + T1K = KP866025403 * (T1d - T12); + T1g = FNMS(KP984807753, TW, KP173648177 * T11); + T1h = FMA(KP342020143, T1c, KP939692620 * T19); + T1i = KP866025403 * (T1g + T1h); + T1H = T1g - T1h; + } + cr[WS(rs, 2)] = TR + T1e; + ci[WS(rs, 6)] = T1H + T1I; + T1f = FNMS(KP500000000, T1e, TR); + ci[0] = T1f - T1i; + ci[WS(rs, 3)] = T1f + T1i; + T1J = FMS(KP500000000, T1H, T1I); + cr[WS(rs, 5)] = T1J - T1K; + cr[WS(rs, 8)] = T1K + T1J; + } + { + E T1L, T1M, T1N, T1O; + T1L = KP866025403 * (TL - Tu); + T1M = T1C + T1B; + T1N = T1w + T1x; + T1O = FNMS(KP500000000, T1N, T1M); + cr[WS(rs, 6)] = T1L - T1O; + ci[WS(rs, 8)] = T1N + T1M; + ci[WS(rs, 5)] = T1L + T1O; + } + { + E T1j, T1E, T1q, T1z, T1u, T1F, T1r, T1G; + T1j = TN + TQ; + T1E = T1A + T1D; + { + E T1m, T1p, T1s, T1t; + T1m = FMA(KP766044443, T1k, KP642787609 * T1l); + T1p = FMA(KP173648177, T1n, KP984807753 * T1o); + T1q = T1m + T1p; + T1z = KP866025403 * (T1p - T1m); + T1s = FNMS(KP642787609, T1k, KP766044443 * T1l); + T1t = FNMS(KP984807753, T1n, KP173648177 * T1o); + T1u = KP866025403 * (T1s - T1t); + T1F = T1s + T1t; + } + cr[WS(rs, 1)] = T1j + T1q; + T1r = FNMS(KP500000000, T1q, T1j); + ci[WS(rs, 1)] = T1r - T1u; + cr[WS(rs, 4)] = T1r + T1u; + ci[WS(rs, 7)] = T1F + T1E; + T1G = FNMS(KP500000000, T1F, T1E); + cr[WS(rs, 7)] = T1z - T1G; + ci[WS(rs, 4)] = T1z + T1G; + } + } + } +} + +static const tw_instr twinstr[] = { + {TW_FULL, 1, 9}, + {TW_NEXT, 1, 0} +}; + +static const hc2hc_desc desc = { 9, "hf_9", twinstr, &GENUS, {60, 36, 36, 0} }; + +void X(codelet_hf_9) (planner *p) { + X(khc2hc_register) (p, hf_9, &desc); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_10.c new file mode 100644 index 000000000..3164ccd7f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_10.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -name r2cfII_10 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 32 FP additions, 18 FP multiplications, + * (or, 14 additions, 0 multiplications, 18 fused multiply/add), + * 21 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T1, To, T8, Tt, Ta, Ts, Te, Tq, Th, Tn; + T1 = R0[0]; + To = R1[WS(rs, 2)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 3)]; + T4 = T2 - T3; + T5 = R0[WS(rs, 4)]; + T6 = R0[WS(rs, 1)]; + T7 = T5 - T6; + T8 = T4 + T7; + Tt = T5 + T6; + Ta = T4 - T7; + Ts = T2 + T3; + } + { + E Tc, Td, Tm, Tf, Tg, Tl; + Tc = R1[0]; + Td = R1[WS(rs, 4)]; + Tm = Tc + Td; + Tf = R1[WS(rs, 1)]; + Tg = R1[WS(rs, 3)]; + Tl = Tf + Tg; + Te = Tc - Td; + Tq = Tm + Tl; + Th = Tf - Tg; + Tn = Tl - Tm; + } + Cr[WS(csr, 2)] = T1 + T8; + Ci[WS(csi, 2)] = Tn - To; + { + E Ti, Tk, Tb, Tj, T9; + Ti = FMA(KP618033988, Th, Te); + Tk = FNMS(KP618033988, Te, Th); + T9 = FNMS(KP250000000, T8, T1); + Tb = FMA(KP559016994, Ta, T9); + Tj = FNMS(KP559016994, Ta, T9); + Cr[WS(csr, 4)] = FNMS(KP951056516, Ti, Tb); + Cr[WS(csr, 3)] = FMA(KP951056516, Tk, Tj); + Cr[0] = FMA(KP951056516, Ti, Tb); + Cr[WS(csr, 1)] = FNMS(KP951056516, Tk, Tj); + } + { + E Tu, Tw, Tr, Tv, Tp; + Tu = FMA(KP618033988, Tt, Ts); + Tw = FNMS(KP618033988, Ts, Tt); + Tp = FMA(KP250000000, Tn, To); + Tr = FMA(KP559016994, Tq, Tp); + Tv = FNMS(KP559016994, Tq, Tp); + Ci[0] = -(FMA(KP951056516, Tu, Tr)); + Ci[WS(csi, 3)] = FMA(KP951056516, Tw, Tv); + Ci[WS(csi, 4)] = FMS(KP951056516, Tu, Tr); + Ci[WS(csi, 1)] = FNMS(KP951056516, Tw, Tv); + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cfII_10", {14, 0, 18, 0}, &GENUS }; + +void X(codelet_r2cfII_10) (planner *p) { + X(kr2c_register) (p, r2cfII_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 10 -name r2cfII_10 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 32 FP additions, 12 FP multiplications, + * (or, 26 additions, 6 multiplications, 6 fused multiply/add), + * 21 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T1, To, T8, Tq, T9, Tp, Te, Ts, Th, Tn; + T1 = R0[0]; + To = R1[WS(rs, 2)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 3)]; + T4 = T2 - T3; + T5 = R0[WS(rs, 4)]; + T6 = R0[WS(rs, 1)]; + T7 = T5 - T6; + T8 = T4 + T7; + Tq = T5 + T6; + T9 = KP559016994 * (T4 - T7); + Tp = T2 + T3; + } + { + E Tc, Td, Tm, Tf, Tg, Tl; + Tc = R1[0]; + Td = R1[WS(rs, 4)]; + Tm = Tc + Td; + Tf = R1[WS(rs, 1)]; + Tg = R1[WS(rs, 3)]; + Tl = Tf + Tg; + Te = Tc - Td; + Ts = KP559016994 * (Tm + Tl); + Th = Tf - Tg; + Tn = Tl - Tm; + } + Cr[WS(csr, 2)] = T1 + T8; + Ci[WS(csi, 2)] = Tn - To; + { + E Ti, Tk, Tb, Tj, Ta; + Ti = FMA(KP951056516, Te, KP587785252 * Th); + Tk = FNMS(KP587785252, Te, KP951056516 * Th); + Ta = FNMS(KP250000000, T8, T1); + Tb = T9 + Ta; + Tj = Ta - T9; + Cr[WS(csr, 4)] = Tb - Ti; + Cr[WS(csr, 3)] = Tj + Tk; + Cr[0] = Tb + Ti; + Cr[WS(csr, 1)] = Tj - Tk; + } + { + E Tr, Tw, Tu, Tv, Tt; + Tr = FMA(KP951056516, Tp, KP587785252 * Tq); + Tw = FNMS(KP587785252, Tp, KP951056516 * Tq); + Tt = FMA(KP250000000, Tn, To); + Tu = Ts + Tt; + Tv = Tt - Ts; + Ci[0] = -(Tr + Tu); + Ci[WS(csi, 3)] = Tw + Tv; + Ci[WS(csi, 4)] = Tr - Tu; + Ci[WS(csi, 1)] = Tv - Tw; + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cfII_10", {26, 6, 6, 0}, &GENUS }; + +void X(codelet_r2cfII_10) (planner *p) { + X(kr2c_register) (p, r2cfII_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_12.c new file mode 100644 index 000000000..ac0c15653 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_12.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -name r2cfII_12 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 45 FP additions, 24 FP multiplications, + * (or, 21 additions, 0 multiplications, 24 fused multiply/add), + * 28 stack variables, 3 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E Tx, Ty, T8, Tz, Tl, Tm, Tv, T5, TA, Tt, Te, Tf, Tu, T6, T7; + E Tw, TF, TG; + Tx = R0[WS(rs, 3)]; + T6 = R0[WS(rs, 5)]; + T7 = R0[WS(rs, 1)]; + Ty = T6 + T7; + T8 = T6 - T7; + Tz = FMA(KP500000000, Ty, Tx); + { + E Th, Ti, Tj, Tk; + Th = R1[WS(rs, 4)]; + Ti = R1[WS(rs, 2)]; + Tj = R1[0]; + Tk = Ti - Tj; + Tl = FMA(KP500000000, Tk, Th); + Tm = Ti + Tj; + Tv = Ti - Tj - Th; + } + { + E T1, T2, T3, T4; + T1 = R0[0]; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 4)]; + T4 = T2 - T3; + T5 = FMA(KP500000000, T4, T1); + TA = T3 + T2; + Tt = T1 + T3 - T2; + } + { + E Ta, Tb, Tc, Td; + Ta = R1[WS(rs, 1)]; + Tb = R1[WS(rs, 3)]; + Tc = R1[WS(rs, 5)]; + Td = Tb - Tc; + Te = FMA(KP500000000, Td, Ta); + Tf = Tc + Tb; + Tu = Ta + Tc - Tb; + } + Tw = Tu + Tv; + Cr[WS(csr, 1)] = FNMS(KP707106781, Tw, Tt); + Cr[WS(csr, 4)] = FMA(KP707106781, Tw, Tt); + TF = Tx - Ty; + TG = Tv - Tu; + Ci[WS(csi, 4)] = FMS(KP707106781, TG, TF); + Ci[WS(csi, 1)] = FMA(KP707106781, TG, TF); + { + E T9, TD, To, TE, Tg, Tn; + T9 = FNMS(KP866025403, T8, T5); + TD = FNMS(KP866025403, TA, Tz); + Tg = FNMS(KP866025403, Tf, Te); + Tn = FNMS(KP866025403, Tm, Tl); + To = Tg - Tn; + TE = Tg + Tn; + Cr[WS(csr, 5)] = FNMS(KP707106781, To, T9); + Ci[WS(csi, 3)] = FMA(KP707106781, TE, TD); + Cr[0] = FMA(KP707106781, To, T9); + Ci[WS(csi, 2)] = FMS(KP707106781, TE, TD); + } + { + E Tp, TB, Ts, TC, Tq, Tr; + Tp = FMA(KP866025403, T8, T5); + TB = FMA(KP866025403, TA, Tz); + Tq = FMA(KP866025403, Tm, Tl); + Tr = FMA(KP866025403, Tf, Te); + Ts = Tq - Tr; + TC = Tr + Tq; + Cr[WS(csr, 3)] = FNMS(KP707106781, Ts, Tp); + Ci[WS(csi, 5)] = FNMS(KP707106781, TC, TB); + Cr[WS(csr, 2)] = FMA(KP707106781, Ts, Tp); + Ci[0] = -(FMA(KP707106781, TC, TB)); + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cfII_12", {21, 0, 24, 0}, &GENUS }; + +void X(codelet_r2cfII_12) (planner *p) { + X(kr2c_register) (p, r2cfII_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 12 -name r2cfII_12 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 43 FP additions, 12 FP multiplications, + * (or, 39 additions, 8 multiplications, 4 fused multiply/add), + * 28 stack variables, 5 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP353553390, +0.353553390593273762200422181052424519642417969); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP612372435, +0.612372435695794524549321018676472847991486870); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E Tx, Tg, T4, Tz, Ty, Tj, TA, T9, Tm, Tl, Te, Tp, To, Tf, TE; + E TF; + { + E T1, T3, T2, Th, Ti; + T1 = R0[0]; + T3 = R0[WS(rs, 2)]; + T2 = R0[WS(rs, 4)]; + Tx = KP866025403 * (T2 + T3); + Tg = FMA(KP500000000, T3 - T2, T1); + T4 = T1 + T2 - T3; + Tz = R0[WS(rs, 3)]; + Th = R0[WS(rs, 5)]; + Ti = R0[WS(rs, 1)]; + Ty = Th + Ti; + Tj = KP866025403 * (Th - Ti); + TA = FMA(KP500000000, Ty, Tz); + } + { + E T5, T6, T7, T8; + T5 = R1[WS(rs, 1)]; + T6 = R1[WS(rs, 5)]; + T7 = R1[WS(rs, 3)]; + T8 = T6 - T7; + T9 = T5 + T8; + Tm = KP612372435 * (T6 + T7); + Tl = FNMS(KP353553390, T8, KP707106781 * T5); + } + { + E Td, Ta, Tb, Tc; + Td = R1[WS(rs, 4)]; + Ta = R1[WS(rs, 2)]; + Tb = R1[0]; + Tc = Ta - Tb; + Te = Tc - Td; + Tp = FMA(KP353553390, Tc, KP707106781 * Td); + To = KP612372435 * (Ta + Tb); + } + Tf = KP707106781 * (T9 + Te); + Cr[WS(csr, 1)] = T4 - Tf; + Cr[WS(csr, 4)] = T4 + Tf; + TE = KP707106781 * (Te - T9); + TF = Tz - Ty; + Ci[WS(csi, 4)] = TE - TF; + Ci[WS(csi, 1)] = TE + TF; + { + E Tk, TB, Tr, Tw, Tn, Tq; + Tk = Tg - Tj; + TB = Tx - TA; + Tn = Tl - Tm; + Tq = To - Tp; + Tr = Tn + Tq; + Tw = Tn - Tq; + Cr[WS(csr, 5)] = Tk - Tr; + Ci[WS(csi, 2)] = Tw + TB; + Cr[0] = Tk + Tr; + Ci[WS(csi, 3)] = Tw - TB; + } + { + E Ts, TD, Tv, TC, Tt, Tu; + Ts = Tg + Tj; + TD = Tx + TA; + Tt = To + Tp; + Tu = Tm + Tl; + Tv = Tt - Tu; + TC = Tu + Tt; + Cr[WS(csr, 3)] = Ts - Tv; + Ci[WS(csi, 5)] = TD - TC; + Cr[WS(csr, 2)] = Ts + Tv; + Ci[0] = -(TC + TD); + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cfII_12", {39, 8, 4, 0}, &GENUS }; + +void X(codelet_r2cfII_12) (planner *p) { + X(kr2c_register) (p, r2cfII_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_15.c new file mode 100644 index 000000000..b2215b311 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_15.c @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 15 -name r2cfII_15 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 72 FP additions, 41 FP multiplications, + * (or, 38 additions, 7 multiplications, 34 fused multiply/add), + * 42 stack variables, 12 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP823639103, +0.823639103546331925877420039278190003029660514); + DK(KP910592997, +0.910592997310029334643087372129977886038870291); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP690983005, +0.690983005625052575897706582817180941139845410); + DK(KP447213595, +0.447213595499957939281834733746255247088123672); + DK(KP552786404, +0.552786404500042060718165266253744752911876328); + DK(KP809016994, +0.809016994374947424102293417182819058860154590); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E Ta, Tl, T1, T6, T7, TX, TT, T8, Tg, Th, TM, TZ, Tj, Tz, Tr; + E Ts, TP, TY, Tu, TC; + Ta = R0[WS(rs, 5)]; + Tl = R1[WS(rs, 2)]; + { + E T2, T5, T3, T4, TR, TS; + T1 = R0[0]; + T2 = R0[WS(rs, 3)]; + T5 = R1[WS(rs, 4)]; + T3 = R0[WS(rs, 6)]; + T4 = R1[WS(rs, 1)]; + TR = T2 + T5; + TS = T3 + T4; + T6 = T2 + T3 - T4 - T5; + T7 = FNMS(KP250000000, T6, T1); + TX = FNMS(KP618033988, TR, TS); + TT = FMA(KP618033988, TS, TR); + T8 = (T3 + T5 - T2) - T4; + } + { + E Tf, TL, TK, Ti, Ty; + { + E Tb, Tc, Td, Te; + Tb = R1[0]; + Tg = R0[WS(rs, 2)]; + Tc = R1[WS(rs, 3)]; + Td = R1[WS(rs, 6)]; + Te = Tc + Td; + Tf = Tb - Te; + TL = Tc - Td; + Th = Tb + Te; + TK = Tg + Tb; + } + TM = FMA(KP618033988, TL, TK); + TZ = FNMS(KP618033988, TK, TL); + Ti = FMA(KP809016994, Th, Tg); + Tj = FNMS(KP552786404, Ti, Tf); + Ty = FMA(KP447213595, Th, Tf); + Tz = FNMS(KP690983005, Ty, Tg); + } + { + E Tq, TO, TN, Tt, TB; + { + E Tm, Tn, To, Tp; + Tm = R0[WS(rs, 7)]; + Tr = R1[WS(rs, 5)]; + Tn = R0[WS(rs, 1)]; + To = R0[WS(rs, 4)]; + Tp = Tn + To; + Tq = Tm - Tp; + TO = To - Tn; + Ts = Tm + Tp; + TN = Tr + Tm; + } + TP = FMA(KP618033988, TO, TN); + TY = FNMS(KP618033988, TN, TO); + Tt = FMA(KP809016994, Ts, Tr); + Tu = FNMS(KP552786404, Tt, Tq); + TB = FMA(KP447213595, Ts, Tq); + TC = FNMS(KP690983005, TB, Tr); + } + { + E TF, TG, TH, TI; + TF = T1 + T6; + TG = Ts - Tr - Tl; + TH = Ta + Tg - Th; + TI = TG + TH; + Cr[WS(csr, 2)] = FNMS(KP500000000, TI, TF); + Ci[WS(csi, 2)] = KP866025403 * (TH - TG); + Cr[WS(csr, 7)] = TF + TI; + } + { + E Tx, T14, T10, T11, TE, T12, TA, TD, T13; + Tx = FMA(KP559016994, T8, T7); + T14 = TZ - TY; + T10 = TY + TZ; + T11 = FMA(KP500000000, T10, TX); + TA = FNMS(KP809016994, Tz, Ta); + TD = FNMS(KP809016994, TC, Tl); + TE = TA - TD; + T12 = TD + TA; + Cr[WS(csr, 1)] = Tx + TE; + Ci[WS(csi, 1)] = KP951056516 * (T10 - TX); + Ci[WS(csi, 3)] = KP951056516 * (FNMS(KP910592997, T12, T11)); + Ci[WS(csi, 6)] = -(KP951056516 * (FMA(KP910592997, T12, T11))); + T13 = FNMS(KP500000000, TE, Tx); + Cr[WS(csr, 3)] = FNMS(KP823639103, T14, T13); + Cr[WS(csr, 6)] = FMA(KP823639103, T14, T13); + } + { + E T9, TQ, TU, TV, Tw, TW, Tk, Tv, TJ; + T9 = FNMS(KP559016994, T8, T7); + TQ = TM - TP; + TU = TP + TM; + TV = FMA(KP500000000, TU, TT); + Tk = FNMS(KP559016994, Tj, Ta); + Tv = FNMS(KP559016994, Tu, Tl); + Tw = Tk - Tv; + TW = Tv + Tk; + Cr[WS(csr, 4)] = T9 + Tw; + Ci[WS(csi, 4)] = KP951056516 * (TT - TU); + Ci[0] = -(KP951056516 * (FMA(KP910592997, TW, TV))); + Ci[WS(csi, 5)] = -(KP951056516 * (FNMS(KP910592997, TW, TV))); + TJ = FNMS(KP500000000, Tw, T9); + Cr[WS(csr, 5)] = FNMS(KP823639103, TQ, TJ); + Cr[0] = FMA(KP823639103, TQ, TJ); + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cfII_15", {38, 7, 34, 0}, &GENUS }; + +void X(codelet_r2cfII_15) (planner *p) { + X(kr2c_register) (p, r2cfII_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 15 -name r2cfII_15 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 72 FP additions, 33 FP multiplications, + * (or, 54 additions, 15 multiplications, 18 fused multiply/add), + * 37 stack variables, 8 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP809016994, +0.809016994374947424102293417182819058860154590); + DK(KP309016994, +0.309016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E T1, T2, Tx, TR, TE, T7, TD, Th, Tm, Tr, TQ, TA, TB, Tf, Te; + E Tu, TS, Td, TH, TO; + T1 = R0[WS(rs, 5)]; + { + E T3, Tv, T6, Tw, T4, T5; + T2 = R0[WS(rs, 2)]; + T3 = R1[0]; + Tv = T2 + T3; + T4 = R1[WS(rs, 3)]; + T5 = R1[WS(rs, 6)]; + T6 = T4 + T5; + Tw = T4 - T5; + Tx = FMA(KP951056516, Tv, KP587785252 * Tw); + TR = FNMS(KP587785252, Tv, KP951056516 * Tw); + TE = KP559016994 * (T3 - T6); + T7 = T3 + T6; + TD = KP250000000 * T7; + } + { + E Ti, Tl, Tj, Tk, Tp, Tq; + Th = R0[0]; + Ti = R1[WS(rs, 4)]; + Tl = R0[WS(rs, 6)]; + Tj = R1[WS(rs, 1)]; + Tk = R0[WS(rs, 3)]; + Tp = Tk + Ti; + Tq = Tl + Tj; + Tm = Ti + Tj - (Tk + Tl); + Tr = FMA(KP951056516, Tp, KP587785252 * Tq); + TQ = FNMS(KP951056516, Tq, KP587785252 * Tp); + TA = FMA(KP250000000, Tm, Th); + TB = KP559016994 * (Tl + Ti - (Tk + Tj)); + } + { + E T9, Tt, Tc, Ts, Ta, Tb, TG; + Tf = R1[WS(rs, 2)]; + T9 = R0[WS(rs, 7)]; + Te = R1[WS(rs, 5)]; + Tt = T9 + Te; + Ta = R0[WS(rs, 1)]; + Tb = R0[WS(rs, 4)]; + Tc = Ta + Tb; + Ts = Ta - Tb; + Tu = FNMS(KP951056516, Tt, KP587785252 * Ts); + TS = FMA(KP951056516, Ts, KP587785252 * Tt); + Td = T9 + Tc; + TG = KP559016994 * (T9 - Tc); + TH = FNMS(KP309016994, Te, TG) + FNMA(KP250000000, Td, Tf); + TO = FMS(KP809016994, Te, Tf) + FNMA(KP250000000, Td, TG); + } + { + E Tn, T8, Tg, To; + Tn = Th - Tm; + T8 = T1 + T2 - T7; + Tg = Td - Te - Tf; + To = T8 + Tg; + Ci[WS(csi, 2)] = KP866025403 * (T8 - Tg); + Cr[WS(csr, 2)] = FNMS(KP500000000, To, Tn); + Cr[WS(csr, 7)] = Tn + To; + } + { + E TM, TX, TT, TV, TP, TU, TN, TW; + TM = TB + TA; + TX = KP866025403 * (TR + TS); + TT = TR - TS; + TV = FMS(KP500000000, TT, TQ); + TN = T1 + TE + FNMS(KP809016994, T2, TD); + TP = TN + TO; + TU = KP866025403 * (TO - TN); + Cr[WS(csr, 1)] = TM + TP; + Ci[WS(csi, 1)] = TQ + TT; + Ci[WS(csi, 6)] = TU - TV; + Ci[WS(csi, 3)] = TU + TV; + TW = FNMS(KP500000000, TP, TM); + Cr[WS(csr, 3)] = TW - TX; + Cr[WS(csr, 6)] = TW + TX; + } + { + E Tz, TC, Ty, TK, TI, TL, TF, TJ; + Tz = KP866025403 * (Tx + Tu); + TC = TA - TB; + Ty = Tu - Tx; + TK = FMS(KP500000000, Ty, Tr); + TF = FMA(KP309016994, T2, T1) + TD - TE; + TI = TF + TH; + TL = KP866025403 * (TH - TF); + Ci[WS(csi, 4)] = Tr + Ty; + Cr[WS(csr, 4)] = TC + TI; + Ci[WS(csi, 5)] = TK - TL; + Ci[0] = TK + TL; + TJ = FNMS(KP500000000, TI, TC); + Cr[0] = Tz + TJ; + Cr[WS(csr, 5)] = TJ - Tz; + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cfII_15", {54, 15, 18, 0}, &GENUS }; + +void X(codelet_r2cfII_15) (planner *p) { + X(kr2c_register) (p, r2cfII_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_16.c new file mode 100644 index 000000000..f216a0774 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_16.c @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -name r2cfII_16 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 66 FP additions, 48 FP multiplications, + * (or, 18 additions, 0 multiplications, 48 fused multiply/add), + * 32 stack variables, 7 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T5, TZ, TB, TT, Tr, TK, Tu, TJ, Ti, TH, Tl, TG, Tc, T10, TE; + E TU; + { + E T1, TR, T4, TS, T2, T3; + T1 = R0[0]; + TR = R0[WS(rs, 4)]; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 6)]; + T4 = T2 - T3; + TS = T2 + T3; + T5 = FNMS(KP707106781, T4, T1); + TZ = FNMS(KP707106781, TS, TR); + TB = FMA(KP707106781, T4, T1); + TT = FMA(KP707106781, TS, TR); + } + { + E Tn, Ts, Tq, Tt, To, Tp; + Tn = R1[WS(rs, 7)]; + Ts = R1[WS(rs, 3)]; + To = R1[WS(rs, 1)]; + Tp = R1[WS(rs, 5)]; + Tq = To - Tp; + Tt = To + Tp; + Tr = FMA(KP707106781, Tq, Tn); + TK = FMA(KP707106781, Tt, Ts); + Tu = FNMS(KP707106781, Tt, Ts); + TJ = FMS(KP707106781, Tq, Tn); + } + { + E Te, Tj, Th, Tk, Tf, Tg; + Te = R1[0]; + Tj = R1[WS(rs, 4)]; + Tf = R1[WS(rs, 2)]; + Tg = R1[WS(rs, 6)]; + Th = Tf - Tg; + Tk = Tf + Tg; + Ti = FNMS(KP707106781, Th, Te); + TH = FMA(KP707106781, Tk, Tj); + Tl = FNMS(KP707106781, Tk, Tj); + TG = FMA(KP707106781, Th, Te); + } + { + E T8, TC, Tb, TD; + { + E T6, T7, T9, Ta; + T6 = R0[WS(rs, 5)]; + T7 = R0[WS(rs, 1)]; + T8 = FMA(KP414213562, T7, T6); + TC = FNMS(KP414213562, T6, T7); + T9 = R0[WS(rs, 3)]; + Ta = R0[WS(rs, 7)]; + Tb = FMA(KP414213562, Ta, T9); + TD = FMS(KP414213562, T9, Ta); + } + Tc = T8 - Tb; + T10 = TD - TC; + TE = TC + TD; + TU = T8 + Tb; + } + { + E Td, T13, Tw, T14, Tm, Tv; + Td = FMA(KP923879532, Tc, T5); + T13 = FNMS(KP923879532, T10, TZ); + Tm = FMA(KP668178637, Tl, Ti); + Tv = FMA(KP668178637, Tu, Tr); + Tw = Tm - Tv; + T14 = Tm + Tv; + Cr[WS(csr, 6)] = FNMS(KP831469612, Tw, Td); + Ci[WS(csi, 5)] = FNMS(KP831469612, T14, T13); + Cr[WS(csr, 1)] = FMA(KP831469612, Tw, Td); + Ci[WS(csi, 2)] = -(FMA(KP831469612, T14, T13)); + } + { + E Tx, T11, TA, T12, Ty, Tz; + Tx = FNMS(KP923879532, Tc, T5); + T11 = FMA(KP923879532, T10, TZ); + Ty = FNMS(KP668178637, Tr, Tu); + Tz = FNMS(KP668178637, Ti, Tl); + TA = Ty - Tz; + T12 = Tz + Ty; + Cr[WS(csr, 5)] = FNMS(KP831469612, TA, Tx); + Ci[WS(csi, 1)] = FMA(KP831469612, T12, T11); + Cr[WS(csr, 2)] = FMA(KP831469612, TA, Tx); + Ci[WS(csi, 6)] = FMS(KP831469612, T12, T11); + } + { + E TF, TX, TM, TY, TI, TL; + TF = FMA(KP923879532, TE, TB); + TX = FNMS(KP923879532, TU, TT); + TI = FNMS(KP198912367, TH, TG); + TL = FMA(KP198912367, TK, TJ); + TM = TI + TL; + TY = TL - TI; + Cr[WS(csr, 7)] = FNMS(KP980785280, TM, TF); + Ci[WS(csi, 3)] = FMA(KP980785280, TY, TX); + Cr[0] = FMA(KP980785280, TM, TF); + Ci[WS(csi, 4)] = FMS(KP980785280, TY, TX); + } + { + E TN, TV, TQ, TW, TO, TP; + TN = FNMS(KP923879532, TE, TB); + TV = FMA(KP923879532, TU, TT); + TO = FMA(KP198912367, TG, TH); + TP = FNMS(KP198912367, TJ, TK); + TQ = TO - TP; + TW = TO + TP; + Cr[WS(csr, 4)] = FNMS(KP980785280, TQ, TN); + Ci[WS(csi, 7)] = FNMS(KP980785280, TW, TV); + Cr[WS(csr, 3)] = FMA(KP980785280, TQ, TN); + Ci[0] = -(FMA(KP980785280, TW, TV)); + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cfII_16", {18, 0, 48, 0}, &GENUS }; + +void X(codelet_r2cfII_16) (planner *p) { + X(kr2c_register) (p, r2cfII_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 16 -name r2cfII_16 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 66 FP additions, 30 FP multiplications, + * (or, 54 additions, 18 multiplications, 12 fused multiply/add), + * 32 stack variables, 7 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T5, T11, TB, TV, Tr, TK, Tu, TJ, Ti, TH, Tl, TG, Tc, T10, TE; + E TS; + { + E T1, TU, T4, TT, T2, T3; + T1 = R0[0]; + TU = R0[WS(rs, 4)]; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 6)]; + T4 = KP707106781 * (T2 - T3); + TT = KP707106781 * (T2 + T3); + T5 = T1 + T4; + T11 = TU - TT; + TB = T1 - T4; + TV = TT + TU; + } + { + E Tq, Tt, Tp, Ts, Tn, To; + Tq = R1[WS(rs, 7)]; + Tt = R1[WS(rs, 3)]; + Tn = R1[WS(rs, 1)]; + To = R1[WS(rs, 5)]; + Tp = KP707106781 * (Tn - To); + Ts = KP707106781 * (Tn + To); + Tr = Tp - Tq; + TK = Tt - Ts; + Tu = Ts + Tt; + TJ = Tp + Tq; + } + { + E Te, Tk, Th, Tj, Tf, Tg; + Te = R1[0]; + Tk = R1[WS(rs, 4)]; + Tf = R1[WS(rs, 2)]; + Tg = R1[WS(rs, 6)]; + Th = KP707106781 * (Tf - Tg); + Tj = KP707106781 * (Tf + Tg); + Ti = Te + Th; + TH = Tk - Tj; + Tl = Tj + Tk; + TG = Te - Th; + } + { + E T8, TC, Tb, TD; + { + E T6, T7, T9, Ta; + T6 = R0[WS(rs, 1)]; + T7 = R0[WS(rs, 5)]; + T8 = FNMS(KP382683432, T7, KP923879532 * T6); + TC = FMA(KP382683432, T6, KP923879532 * T7); + T9 = R0[WS(rs, 3)]; + Ta = R0[WS(rs, 7)]; + Tb = FNMS(KP923879532, Ta, KP382683432 * T9); + TD = FMA(KP923879532, T9, KP382683432 * Ta); + } + Tc = T8 + Tb; + T10 = Tb - T8; + TE = TC - TD; + TS = TC + TD; + } + { + E Td, TW, Tw, TR, Tm, Tv; + Td = T5 - Tc; + TW = TS + TV; + Tm = FMA(KP195090322, Ti, KP980785280 * Tl); + Tv = FNMS(KP980785280, Tu, KP195090322 * Tr); + Tw = Tm + Tv; + TR = Tv - Tm; + Cr[WS(csr, 4)] = Td - Tw; + Ci[WS(csi, 7)] = TR + TW; + Cr[WS(csr, 3)] = Td + Tw; + Ci[0] = TR - TW; + } + { + E Tx, TY, TA, TX, Ty, Tz; + Tx = T5 + Tc; + TY = TV - TS; + Ty = FNMS(KP195090322, Tl, KP980785280 * Ti); + Tz = FMA(KP980785280, Tr, KP195090322 * Tu); + TA = Ty + Tz; + TX = Tz - Ty; + Cr[WS(csr, 7)] = Tx - TA; + Ci[WS(csi, 3)] = TX + TY; + Cr[0] = Tx + TA; + Ci[WS(csi, 4)] = TX - TY; + } + { + E TF, T12, TM, TZ, TI, TL; + TF = TB + TE; + T12 = T10 - T11; + TI = FMA(KP831469612, TG, KP555570233 * TH); + TL = FMA(KP831469612, TJ, KP555570233 * TK); + TM = TI - TL; + TZ = TI + TL; + Cr[WS(csr, 6)] = TF - TM; + Ci[WS(csi, 2)] = T12 - TZ; + Cr[WS(csr, 1)] = TF + TM; + Ci[WS(csi, 5)] = -(TZ + T12); + } + { + E TN, T14, TQ, T13, TO, TP; + TN = TB - TE; + T14 = T10 + T11; + TO = FNMS(KP555570233, TJ, KP831469612 * TK); + TP = FNMS(KP555570233, TG, KP831469612 * TH); + TQ = TO - TP; + T13 = TP + TO; + Cr[WS(csr, 5)] = TN - TQ; + Ci[WS(csi, 1)] = T13 + T14; + Cr[WS(csr, 2)] = TN + TQ; + Ci[WS(csi, 6)] = T13 - T14; + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cfII_16", {54, 18, 12, 0}, &GENUS }; + +void X(codelet_r2cfII_16) (planner *p) { + X(kr2c_register) (p, r2cfII_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_2.c new file mode 100644 index 000000000..2121c4b53 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_2.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -name r2cfII_2 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 0 FP additions, 0 FP multiplications, + * (or, 0 additions, 0 multiplications, 0 fused multiply/add), + * 3 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = R0[0]; + T2 = R1[0]; + Cr[0] = T1; + Ci[0] = -T2; + } + } +} + +static const kr2c_desc desc = { 2, "r2cfII_2", {0, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cfII_2) (planner *p) { + X(kr2c_register) (p, r2cfII_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 2 -name r2cfII_2 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 0 FP additions, 0 FP multiplications, + * (or, 0 additions, 0 multiplications, 0 fused multiply/add), + * 3 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = R0[0]; + T2 = R1[0]; + Cr[0] = T1; + Ci[0] = -T2; + } + } +} + +static const kr2c_desc desc = { 2, "r2cfII_2", {0, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cfII_2) (planner *p) { + X(kr2c_register) (p, r2cfII_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_20.c new file mode 100644 index 000000000..4207869a0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_20.c @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:48 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -name r2cfII_20 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 102 FP additions, 63 FP multiplications, + * (or, 39 additions, 0 multiplications, 63 fused multiply/add), + * 53 stack variables, 10 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP690983005, +0.690983005625052575897706582817180941139845410); + DK(KP447213595, +0.447213595499957939281834733746255247088123672); + DK(KP552786404, +0.552786404500042060718165266253744752911876328); + DK(KP809016994, +0.809016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP381966011, +0.381966011250105151795413165634361882279690820); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E Ti, T1d, T1f, T1e, Tg, T1p, TS, T1g, T1, T6, T7, T1r, T1k, T8, To; + E Tp, Tv, TX, Tr, TV, Tx, TF, TC, TD, T12, TG, TK, T10, Tc, Tf; + Ti = R1[WS(rs, 2)]; + T1d = R0[WS(rs, 5)]; + { + E Ta, Tb, Td, Te; + Ta = R0[WS(rs, 9)]; + Tb = R0[WS(rs, 1)]; + Tc = Ta - Tb; + T1f = Ta + Tb; + Td = R0[WS(rs, 3)]; + Te = R0[WS(rs, 7)]; + Tf = Td - Te; + T1e = Td + Te; + } + Tg = FNMS(KP618033988, Tf, Tc); + T1p = FMA(KP381966011, T1e, T1f); + TS = FMA(KP618033988, Tc, Tf); + T1g = FMA(KP381966011, T1f, T1e); + { + E T2, T5, T3, T4, T1i, T1j; + T1 = R0[0]; + T2 = R0[WS(rs, 4)]; + T5 = R0[WS(rs, 6)]; + T3 = R0[WS(rs, 8)]; + T4 = R0[WS(rs, 2)]; + T1i = T2 + T5; + T1j = T3 + T4; + T6 = T2 + T3 - T4 - T5; + T7 = FNMS(KP250000000, T6, T1); + T1r = FNMS(KP618033988, T1i, T1j); + T1k = FMA(KP618033988, T1j, T1i); + T8 = (T3 + T5 - T2) - T4; + } + { + E Tn, Tu, Tt, Tq, TU; + { + E Tj, Tk, Tl, Tm; + Tj = R1[WS(rs, 8)]; + To = R1[WS(rs, 6)]; + Tk = R1[0]; + Tl = R1[WS(rs, 4)]; + Tm = Tk + Tl; + Tn = Tj - Tm; + Tu = Tk - Tl; + Tp = Tj + Tm; + Tt = To + Tj; + } + Tv = FNMS(KP618033988, Tu, Tt); + TX = FMA(KP618033988, Tt, Tu); + Tq = FMA(KP809016994, Tp, To); + Tr = FNMS(KP552786404, Tq, Tn); + TU = FMA(KP447213595, Tp, Tn); + TV = FNMS(KP690983005, TU, To); + } + { + E TJ, TE, TI, TZ; + Tx = R1[WS(rs, 7)]; + { + E Ty, Tz, TA, TB; + Ty = R1[WS(rs, 1)]; + TF = R1[WS(rs, 3)]; + Tz = R1[WS(rs, 5)]; + TA = R1[WS(rs, 9)]; + TB = Tz + TA; + TC = Ty + TB; + TJ = Tz - TA; + TE = Ty - TB; + TI = TF + Ty; + } + TD = FMA(KP250000000, TC, Tx); + T12 = FNMS(KP618033988, TI, TJ); + TG = FNMS(KP552786404, TF, TE); + TK = FMA(KP618033988, TJ, TI); + TZ = FMA(KP447213595, TC, TE); + T10 = FNMS(KP690983005, TZ, TF); + } + { + E T19, T1w, T1c, T1x, T1a, T1b; + T19 = T1 + T6; + T1w = T1f + T1d - T1e; + T1a = Ti + To - Tp; + T1b = TC - TF - Tx; + T1c = T1a + T1b; + T1x = T1a - T1b; + Cr[WS(csr, 2)] = FNMS(KP707106781, T1c, T19); + Ci[WS(csi, 2)] = FMS(KP707106781, T1x, T1w); + Cr[WS(csr, 7)] = FMA(KP707106781, T1c, T19); + Ci[WS(csi, 7)] = FMA(KP707106781, T1x, T1w); + } + { + E TT, T15, T1s, T1u, TY, T17, T13, T16; + { + E TR, T1q, TW, T11; + TR = FMA(KP559016994, T8, T7); + TT = FMA(KP951056516, TS, TR); + T15 = FNMS(KP951056516, TS, TR); + T1q = FNMS(KP809016994, T1p, T1d); + T1s = FNMS(KP951056516, T1r, T1q); + T1u = FMA(KP951056516, T1r, T1q); + TW = FNMS(KP809016994, TV, Ti); + TY = FMA(KP951056516, TX, TW); + T17 = FNMS(KP951056516, TX, TW); + T11 = FNMS(KP809016994, T10, Tx); + T13 = FNMS(KP951056516, T12, T11); + T16 = FMA(KP951056516, T12, T11); + } + { + E T14, T1v, T18, T1t; + T14 = TY - T13; + Cr[WS(csr, 6)] = FNMS(KP707106781, T14, TT); + Cr[WS(csr, 3)] = FMA(KP707106781, T14, TT); + T1v = T17 + T16; + Ci[WS(csi, 6)] = FMS(KP707106781, T1v, T1u); + Ci[WS(csi, 3)] = FMA(KP707106781, T1v, T1u); + T18 = T16 - T17; + Cr[WS(csr, 8)] = FNMS(KP707106781, T18, T15); + Cr[WS(csr, 1)] = FMA(KP707106781, T18, T15); + T1t = TY + T13; + Ci[WS(csi, 8)] = -(FMA(KP707106781, T1t, T1s)); + Ci[WS(csi, 1)] = FNMS(KP707106781, T1t, T1s); + } + } + { + E Th, TN, T1l, T1n, Tw, TO, TL, TP; + { + E T9, T1h, Ts, TH; + T9 = FNMS(KP559016994, T8, T7); + Th = FNMS(KP951056516, Tg, T9); + TN = FMA(KP951056516, Tg, T9); + T1h = FMA(KP809016994, T1g, T1d); + T1l = FMA(KP951056516, T1k, T1h); + T1n = FNMS(KP951056516, T1k, T1h); + Ts = FNMS(KP559016994, Tr, Ti); + Tw = FNMS(KP951056516, Tv, Ts); + TO = FMA(KP951056516, Tv, Ts); + TH = FNMS(KP559016994, TG, TD); + TL = FNMS(KP951056516, TK, TH); + TP = FMA(KP951056516, TK, TH); + } + { + E TM, T1m, TQ, T1o; + TM = Tw - TL; + Cr[WS(csr, 9)] = FNMS(KP707106781, TM, Th); + Cr[0] = FMA(KP707106781, TM, Th); + T1m = TO + TP; + Ci[0] = -(FMA(KP707106781, T1m, T1l)); + Ci[WS(csi, 9)] = FNMS(KP707106781, T1m, T1l); + TQ = TO - TP; + Cr[WS(csr, 5)] = FNMS(KP707106781, TQ, TN); + Cr[WS(csr, 4)] = FMA(KP707106781, TQ, TN); + T1o = Tw + TL; + Ci[WS(csi, 4)] = -(FMA(KP707106781, T1o, T1n)); + Ci[WS(csi, 5)] = FNMS(KP707106781, T1o, T1n); + } + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cfII_20", {39, 0, 63, 0}, &GENUS }; + +void X(codelet_r2cfII_20) (planner *p) { + X(kr2c_register) (p, r2cfII_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 20 -name r2cfII_20 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 102 FP additions, 34 FP multiplications, + * (or, 86 additions, 18 multiplications, 16 fused multiply/add), + * 60 stack variables, 13 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP572061402, +0.572061402817684297600072783580302076536153377); + DK(KP218508012, +0.218508012224410535399650602527877556893735408); + DK(KP309016994, +0.309016994374947424102293417182819058860154590); + DK(KP809016994, +0.809016994374947424102293417182819058860154590); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP176776695, +0.176776695296636881100211090526212259821208984); + DK(KP395284707, +0.395284707521047416499861693054089816714944392); + DK(KP672498511, +0.672498511963957326960058968885748755876783111); + DK(KP415626937, +0.415626937777453428589967464113135184222253485); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T8, TD, Tm, TN, T9, TC, TY, TE, Te, TF, Tl, TK, T12, TL, Tk; + E TM, T1, T6, Tq, T1l, T1c, Tp, T1f, T1e, T1d, Ty, TW, T1g, T1m, Tx; + E Tu; + T8 = R1[WS(rs, 2)]; + TD = KP707106781 * T8; + Tm = R1[WS(rs, 7)]; + TN = KP707106781 * Tm; + { + E Ta, TA, Td, TB, Tb, Tc; + T9 = R1[WS(rs, 6)]; + Ta = R1[WS(rs, 8)]; + TA = T9 + Ta; + Tb = R1[0]; + Tc = R1[WS(rs, 4)]; + Td = Tb + Tc; + TB = Tb - Tc; + TC = FMA(KP415626937, TA, KP672498511 * TB); + TY = FNMS(KP415626937, TB, KP672498511 * TA); + TE = KP395284707 * (Ta - Td); + Te = Ta + Td; + TF = KP176776695 * Te; + } + { + E Tg, TJ, Tj, TI, Th, Ti; + Tg = R1[WS(rs, 1)]; + Tl = R1[WS(rs, 3)]; + TJ = Tg + Tl; + Th = R1[WS(rs, 5)]; + Ti = R1[WS(rs, 9)]; + Tj = Th + Ti; + TI = Th - Ti; + TK = FNMS(KP415626937, TJ, KP672498511 * TI); + T12 = FMA(KP415626937, TI, KP672498511 * TJ); + TL = KP395284707 * (Tg - Tj); + Tk = Tg + Tj; + TM = KP176776695 * Tk; + } + { + E T2, T5, T3, T4, T1a, T1b; + T1 = R0[0]; + T2 = R0[WS(rs, 6)]; + T5 = R0[WS(rs, 8)]; + T3 = R0[WS(rs, 2)]; + T4 = R0[WS(rs, 4)]; + T1a = T4 + T2; + T1b = T5 + T3; + T6 = T2 + T3 - (T4 + T5); + Tq = FMA(KP250000000, T6, T1); + T1l = FNMS(KP951056516, T1b, KP587785252 * T1a); + T1c = FMA(KP951056516, T1a, KP587785252 * T1b); + Tp = KP559016994 * (T5 + T2 - (T4 + T3)); + } + T1f = R0[WS(rs, 5)]; + { + E Tv, Tw, Ts, Tt; + Tv = R0[WS(rs, 9)]; + Tw = R0[WS(rs, 1)]; + Tx = Tv - Tw; + T1e = Tv + Tw; + Ts = R0[WS(rs, 3)]; + Tt = R0[WS(rs, 7)]; + Tu = Ts - Tt; + T1d = Ts + Tt; + } + Ty = FMA(KP951056516, Tu, KP587785252 * Tx); + TW = FNMS(KP951056516, Tx, KP587785252 * Tu); + T1g = FMA(KP809016994, T1d, KP309016994 * T1e) + T1f; + T1m = FNMS(KP809016994, T1e, T1f) - (KP309016994 * T1d); + { + E T7, T1r, To, T1q, Tf, Tn; + T7 = T1 - T6; + T1r = T1e + T1f - T1d; + Tf = T8 + (T9 - Te); + Tn = (Tk - Tl) - Tm; + To = KP707106781 * (Tf + Tn); + T1q = KP707106781 * (Tf - Tn); + Cr[WS(csr, 2)] = T7 - To; + Ci[WS(csi, 2)] = T1q - T1r; + Cr[WS(csr, 7)] = T7 + To; + Ci[WS(csi, 7)] = T1q + T1r; + } + { + E T1h, T1j, TX, T15, T10, T16, T13, T17, TV, TZ, T11; + T1h = T1c - T1g; + T1j = T1c + T1g; + TV = Tq - Tp; + TX = TV - TW; + T15 = TV + TW; + TZ = FMA(KP218508012, T9, TD) + TF - TE; + T10 = TY + TZ; + T16 = TZ - TY; + T11 = FNMS(KP218508012, Tl, TL) - (TM + TN); + T13 = T11 - T12; + T17 = T11 + T12; + { + E T14, T19, T18, T1i; + T14 = T10 + T13; + Cr[WS(csr, 5)] = TX - T14; + Cr[WS(csr, 4)] = TX + T14; + T19 = T17 - T16; + Ci[WS(csi, 5)] = T19 - T1h; + Ci[WS(csi, 4)] = T19 + T1h; + T18 = T16 + T17; + Cr[WS(csr, 9)] = T15 - T18; + Cr[0] = T15 + T18; + T1i = T13 - T10; + Ci[0] = T1i - T1j; + Ci[WS(csi, 9)] = T1i + T1j; + } + } + { + E T1n, T1p, Tz, TR, TH, TS, TP, TT, Tr, TG, TO; + T1n = T1l + T1m; + T1p = T1m - T1l; + Tr = Tp + Tq; + Tz = Tr + Ty; + TR = Tr - Ty; + TG = TD + TE + FNMS(KP572061402, T9, TF); + TH = TC + TG; + TS = TC - TG; + TO = TL + TM + FNMS(KP572061402, Tl, TN); + TP = TK - TO; + TT = TK + TO; + { + E TQ, T1o, TU, T1k; + TQ = TH + TP; + Cr[WS(csr, 6)] = Tz - TQ; + Cr[WS(csr, 3)] = Tz + TQ; + T1o = TT - TS; + Ci[WS(csi, 6)] = T1o - T1p; + Ci[WS(csi, 3)] = T1o + T1p; + TU = TS + TT; + Cr[WS(csr, 8)] = TR - TU; + Cr[WS(csr, 1)] = TR + TU; + T1k = TP - TH; + Ci[WS(csi, 8)] = T1k - T1n; + Ci[WS(csi, 1)] = T1k + T1n; + } + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cfII_20", {86, 18, 16, 0}, &GENUS }; + +void X(codelet_r2cfII_20) (planner *p) { + X(kr2c_register) (p, r2cfII_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_25.c new file mode 100644 index 000000000..d9fe4a52c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_25.c @@ -0,0 +1,778 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:49 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 25 -name r2cfII_25 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 212 FP additions, 177 FP multiplications, + * (or, 47 additions, 12 multiplications, 165 fused multiply/add), + * 131 stack variables, 67 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP876091699, +0.876091699473550838204498029706869638173524346); + DK(KP792626838, +0.792626838241819413632131824093538848057784557); + DK(KP690668130, +0.690668130712929053565177988380887884042527623); + DK(KP809385824, +0.809385824416008241660603814668679683846476688); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP237294955, +0.237294955877110315393888866460840817927895961); + DK(KP897376177, +0.897376177523557693138608077137219684419427330); + DK(KP584303379, +0.584303379262766050358567120694562180043261496); + DK(KP653711795, +0.653711795629256296299985401753308353544378892); + DK(KP997675361, +0.997675361079556513670859573984492383596555031); + DK(KP645989928, +0.645989928319777763844272876603899665178054552); + DK(KP591287873, +0.591287873858343558732323717242372865934480959); + DK(KP952936919, +0.952936919628306576880750665357914584765951388); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP956723877, +0.956723877038460305821989399535483155872969262); + DK(KP945422727, +0.945422727388575946270360266328811958657216298); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP999754674, +0.999754674276473633366203429228112409535557487); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP916574801, +0.916574801383451584742370439148878693530976769); + DK(KP829049696, +0.829049696159252993975487806364305442437946767); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP669429328, +0.669429328479476605641803240971985825917022098); + DK(KP262346850, +0.262346850930607871785420028382979691334784273); + DK(KP923225144, +0.923225144846402650453449441572664695995209956); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP921078979, +0.921078979742360627699756128143719920817673854); + DK(KP982009705, +0.982009705009746369461829878184175962711969869); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP763583905, +0.763583905359130246362948588764067237776594106); + DK(KP248028675, +0.248028675328619457762448260696444630363259177); + DK(KP904508497, +0.904508497187473712051146708591409529430077295); + DK(KP894834959, +0.894834959464455102997960030820114611498661386); + DK(KP958953096, +0.958953096729998668045963838399037225970891871); + DK(KP867381224, +0.867381224396525206773171885031575671309956167); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP869845200, +0.869845200362138853122720822420327157933056305); + DK(KP120146378, +0.120146378570687701782758537356596213647956445); + DK(KP132830569, +0.132830569247582714407653942074819768844536507); + DK(KP786782374, +0.786782374965295178365099601674911834788448471); + DK(KP893101515, +0.893101515366181661711202267938416198338079437); + DK(KP987388751, +0.987388751065621252324603216482382109400433949); + DK(KP244189809, +0.244189809627953270309879511234821255780225091); + DK(KP269969613, +0.269969613759572083574752974412347470060951301); + DK(KP494780565, +0.494780565770515410344588413655324772219443730); + DK(KP066152395, +0.066152395967733048213034281011006031460903353); + DK(KP059835404, +0.059835404262124915169548397419498386427871950); + DK(KP447533225, +0.447533225982656890041886979663652563063114397); + DK(KP522847744, +0.522847744331509716623755382187077770911012542); + DK(KP667278218, +0.667278218140296670899089292254759909713898805); + DK(KP603558818, +0.603558818296015001454675132653458027918768137); + DK(KP578046249, +0.578046249379945007321754579646815604023525655); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E T2v, TJ, T2A, T1K, T2y, T2z, TB, T15, T2d, T2l, T1g, T1s, T1N, T21, T1D; + E T9, TQ, T2g, T2o, T1j, T1u, T1X, T25, T1z, Ti, TX, T2f, T2p, T1k, T1v; + E T1U, T24, T1A, Ts, T1c, T2c, T2k, T1h, T1r, T1Q, T22, T1C, Tj, TC; + { + E TI, T2x, TF, T2w; + T2v = R0[0]; + { + E TG, TH, TD, TE; + TG = R0[WS(rs, 10)]; + TH = R1[WS(rs, 2)]; + TI = TG + TH; + T2x = TG - TH; + TD = R0[WS(rs, 5)]; + TE = R1[WS(rs, 7)]; + TF = TD + TE; + T2w = TD - TE; + } + TJ = FMA(KP618033988, TI, TF); + T2A = T2w - T2x; + T1K = FNMS(KP618033988, TF, TI); + T2y = T2w + T2x; + T2z = FNMS(KP250000000, T2y, T2v); + } + { + E Tt, TA, T13, TZ, T10; + Tt = R0[WS(rs, 2)]; + { + E Tu, Tv, Tw, Tx, Ty, Tz; + Tu = R0[WS(rs, 7)]; + Tv = R1[WS(rs, 9)]; + Tw = Tu - Tv; + Tx = R0[WS(rs, 12)]; + Ty = R1[WS(rs, 4)]; + Tz = Tx - Ty; + TA = Tw + Tz; + T13 = Tz - Tw; + TZ = Tu + Tv; + T10 = Tx + Ty; + } + TB = Tt + TA; + { + E T11, T1M, T14, T1L, T12; + T11 = FMA(KP618033988, T10, TZ); + T1M = FNMS(KP618033988, TZ, T10); + T12 = FNMS(KP250000000, TA, Tt); + T14 = FNMS(KP559016994, T13, T12); + T1L = FMA(KP559016994, T13, T12); + T15 = FMA(KP578046249, T14, T11); + T2d = FNMS(KP603558818, T1M, T1L); + T2l = FMA(KP667278218, T1L, T1M); + T1g = FNMS(KP522847744, T11, T14); + T1s = FMA(KP447533225, T11, T14); + T1N = FMA(KP059835404, T1M, T1L); + T21 = FNMS(KP066152395, T1L, T1M); + T1D = FNMS(KP494780565, T14, T11); + } + } + { + E T1, T8, TO, TK, TL; + T1 = R0[WS(rs, 1)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = R0[WS(rs, 6)]; + T3 = R1[WS(rs, 8)]; + T4 = T2 - T3; + T5 = R0[WS(rs, 11)]; + T6 = R1[WS(rs, 3)]; + T7 = T5 - T6; + T8 = T4 + T7; + TO = T4 - T7; + TK = T2 + T3; + TL = T5 + T6; + } + T9 = T1 + T8; + { + E TM, T1V, TP, T1W, TN; + TM = FMA(KP618033988, TL, TK); + T1V = FNMS(KP618033988, TK, TL); + TN = FNMS(KP250000000, T8, T1); + TP = FMA(KP559016994, TO, TN); + T1W = FNMS(KP559016994, TO, TN); + TQ = FMA(KP269969613, TP, TM); + T2g = FNMS(KP578046249, T1W, T1V); + T2o = FMA(KP522847744, T1V, T1W); + T1j = FNMS(KP244189809, TM, TP); + T1u = FNMS(KP603558818, TM, TP); + T1X = FMA(KP987388751, T1W, T1V); + T25 = FNMS(KP893101515, T1V, T1W); + T1z = FMA(KP667278218, TP, TM); + } + } + { + E Th, Tg, TV, TS, TU; + Th = R0[WS(rs, 4)]; + { + E Ta, Tb, Tc, Td, Te, Tf; + Ta = R0[WS(rs, 9)]; + Tb = R1[WS(rs, 11)]; + Tc = Ta - Tb; + Td = R1[WS(rs, 6)]; + Te = R1[WS(rs, 1)]; + Tf = Td + Te; + Tg = Tc - Tf; + TV = Te - Td; + TS = Tc + Tf; + TU = Ta + Tb; + } + Ti = Tg + Th; + { + E TW, T1S, TT, T1T, TR; + TW = FNMS(KP618033988, TV, TU); + T1S = FMA(KP618033988, TU, TV); + TR = FNMS(KP250000000, Tg, Th); + TT = FMA(KP559016994, TS, TR); + T1T = FNMS(KP559016994, TS, TR); + TX = FMA(KP603558818, TW, TT); + T2f = FNMS(KP447533225, T1S, T1T); + T2p = FMA(KP494780565, T1T, T1S); + T1k = FNMS(KP667278218, TT, TW); + T1v = FNMS(KP786782374, TW, TT); + T1U = FMA(KP132830569, T1T, T1S); + T24 = FNMS(KP120146378, T1S, T1T); + T1A = FMA(KP869845200, TT, TW); + } + } + { + E Tk, Tr, T1a, T16, T17; + Tk = R0[WS(rs, 3)]; + { + E Tl, Tm, Tn, To, Tp, Tq; + Tl = R0[WS(rs, 8)]; + Tm = R1[WS(rs, 10)]; + Tn = Tl - Tm; + To = R1[0]; + Tp = R1[WS(rs, 5)]; + Tq = To + Tp; + Tr = Tn - Tq; + T1a = Tn + Tq; + T16 = Tl + Tm; + T17 = Tp - To; + } + Ts = Tk + Tr; + { + E T18, T1P, T1b, T1O, T19; + T18 = FMA(KP618033988, T17, T16); + T1P = FNMS(KP618033988, T16, T17); + T19 = FNMS(KP250000000, Tr, Tk); + T1b = FMA(KP559016994, T1a, T19); + T1O = FNMS(KP559016994, T1a, T19); + T1c = FMA(KP987388751, T1b, T18); + T2c = FNMS(KP059835404, T1P, T1O); + T2k = FMA(KP066152395, T1O, T1P); + T1h = FNMS(KP893101515, T18, T1b); + T1r = FMA(KP132830569, T1b, T18); + T1Q = FNMS(KP786782374, T1P, T1O); + T22 = FMA(KP869845200, T1O, T1P); + T1C = FNMS(KP120146378, T18, T1b); + } + } + Tj = T9 - Ti; + TC = Ts - TB; + Ci[WS(csi, 2)] = -(KP951056516 * (FNMS(KP618033988, TC, Tj))); + Ci[WS(csi, 7)] = KP951056516 * (FMA(KP618033988, Tj, TC)); + { + E T3l, T3o, T3q, T3m, T3n, T3p; + T3l = T2v + T2y; + T3m = T9 + Ti; + T3n = TB + Ts; + T3o = T3m + T3n; + T3q = T3m - T3n; + Cr[WS(csr, 12)] = T3o + T3l; + T3p = FNMS(KP250000000, T3o, T3l); + Cr[WS(csr, 2)] = FMA(KP559016994, T3q, T3p); + Cr[WS(csr, 7)] = FNMS(KP559016994, T3q, T3p); + } + { + E T1B, T1E, T1x, T1I, T1G, T1t, T1w, T1F, T1y, T1J, T1H; + T1B = FMA(KP912575812, T1A, T1z); + T1E = FMA(KP867381224, T1D, T1C); + T1t = FMA(KP958953096, T1s, T1r); + T1w = FNMS(KP912575812, T1v, T1u); + T1F = FNMS(KP894834959, T1w, T1t); + T1x = FMA(KP894834959, T1w, T1t); + T1I = FNMS(KP894834959, T1B, T1F); + T1G = FNMS(KP904508497, T1F, T1E); + T1y = FMA(KP248028675, T1x, TJ); + T1J = FMA(KP559016994, T1I, T1E); + T1H = FMA(KP763583905, T1G, T1B); + Ci[WS(csi, 4)] = KP951056516 * (FNMS(KP803003575, T1H, T1y)); + Ci[WS(csi, 9)] = KP951056516 * (FNMS(KP992114701, T1J, T1y)); + } + { + E T2m, T2q, T2i, T2t, T2r, T2e, T2h, T2n, T2j, T2u, T2s; + T2m = FNMS(KP845997307, T2l, T2k); + T2q = FMA(KP982009705, T2p, T2o); + T2e = FMA(KP845997307, T2d, T2c); + T2h = FNMS(KP921078979, T2g, T2f); + T2n = FNMS(KP906616052, T2h, T2e); + T2i = FMA(KP906616052, T2h, T2e); + T2t = T2m + T2n; + T2r = FNMS(KP923225144, T2q, T2n); + T2j = FMA(KP262346850, T2i, T1K); + T2u = FNMS(KP669429328, T2t, T2q); + T2s = FNMS(KP618033988, T2r, T2m); + Ci[WS(csi, 8)] = KP951056516 * (FMA(KP949179823, T2s, T2j)); + Ci[WS(csi, 3)] = KP951056516 * (FNMS(KP876306680, T2u, T2j)); + } + { + E T1i, T1l, T1e, T1p, T1n, TY, T1d, T1m, T1f, T1q, T1o; + T1i = FNMS(KP831864738, T1h, T1g); + T1l = FMA(KP829049696, T1k, T1j); + TY = FMA(KP916574801, TX, TQ); + T1d = FMA(KP831864738, T1c, T15); + T1m = FNMS(KP904730450, T1d, TY); + T1e = FMA(KP904730450, T1d, TY); + T1p = FNMS(KP999754674, T1m, T1i); + T1n = FNMS(KP904508497, T1m, T1l); + Ci[0] = -(KP951056516 * (FMA(KP968583161, T1e, TJ))); + T1f = FNMS(KP242145790, T1e, TJ); + T1q = FMA(KP559154169, T1p, T1l); + T1o = FNMS(KP683113946, T1n, T1i); + Ci[WS(csi, 5)] = -(KP951056516 * (FNMS(KP876306680, T1o, T1f))); + Ci[WS(csi, 10)] = -(KP951056516 * (FNMS(KP968583161, T1q, T1f))); + } + { + E T23, T26, T1Z, T2a, T28, T1R, T1Y, T27, T20, T2b, T29; + T23 = FNMS(KP772036680, T22, T21); + T26 = FMA(KP734762448, T25, T24); + T1R = FMA(KP772036680, T1Q, T1N); + T1Y = FMA(KP734762448, T1X, T1U); + T27 = FNMS(KP945422727, T1Y, T1R); + T1Z = FMA(KP945422727, T1Y, T1R); + T2a = T27 - T23; + T28 = FMA(KP956723877, T27, T26); + Ci[WS(csi, 1)] = -(KP998026728 * (FMA(KP952936919, T1K, T1Z))); + T20 = FNMS(KP262346850, T1Z, T1K); + T2b = FMA(KP591287873, T2a, T26); + T29 = FMA(KP645989928, T28, T23); + Ci[WS(csi, 6)] = -(KP951056516 * (FMA(KP949179823, T29, T20))); + Ci[WS(csi, 11)] = -(KP951056516 * (FNMS(KP992114701, T2b, T20))); + } + { + E T2Y, T33, T31, T38, T36, T3e, T3f, T3c, T3j, T3h, T3a, T3b, T3g; + T2Y = FNMS(KP559016994, T2A, T2z); + T33 = FNMS(KP772036680, T1Q, T1N); + { + E T34, T2Z, T30, T35; + T34 = FNMS(KP734762448, T1X, T1U); + T2Z = FNMS(KP734762448, T25, T24); + T30 = FMA(KP772036680, T22, T21); + T35 = FNMS(KP956723877, T30, T2Z); + T31 = FMA(KP956723877, T30, T2Z); + T38 = FMA(KP618033988, T35, T34); + T36 = T34 + T35; + } + T3e = FMA(KP921078979, T2g, T2f); + T3f = FNMS(KP845997307, T2d, T2c); + T3a = FMA(KP845997307, T2l, T2k); + T3b = FNMS(KP982009705, T2p, T2o); + T3g = FNMS(KP923225144, T3b, T3a); + T3c = FMA(KP923225144, T3b, T3a); + T3j = FNMS(KP997675361, T3g, T3e); + T3h = FNMS(KP904508497, T3g, T3f); + Cr[WS(csr, 1)] = FNMS(KP992114701, T31, T2Y); + { + E T32, T39, T37, T3d, T3k, T3i; + T32 = FMA(KP248028675, T31, T2Y); + T39 = FNMS(KP653711795, T33, T38); + T37 = FMA(KP584303379, T36, T33); + Cr[WS(csr, 6)] = FMA(KP949179823, T37, T32); + Cr[WS(csr, 11)] = FNMS(KP897376177, T39, T32); + T3d = FNMS(KP237294955, T3c, T2Y); + T3k = FNMS(KP560319534, T3j, T3f); + T3i = FMA(KP681693190, T3h, T3e); + Cr[WS(csr, 3)] = FMA(KP860541664, T3i, T3d); + Cr[WS(csr, 8)] = FMA(KP949179823, T3k, T3d); + } + } + { + E T2B, T2R, T2T, T2P, T2W, T2U, T2G, T2H, T2E, T2L, T2J; + T2B = FMA(KP559016994, T2A, T2z); + { + E T2N, T2O, T2S, T2C, T2D, T2I; + T2R = FNMS(KP958953096, T1s, T1r); + T2T = FMA(KP912575812, T1v, T1u); + T2N = FNMS(KP867381224, T1D, T1C); + T2O = FNMS(KP912575812, T1A, T1z); + T2S = FMA(KP809385824, T2O, T2N); + T2P = FNMS(KP809385824, T2O, T2N); + T2W = T2R + T2S; + T2U = FNMS(KP894834959, T2T, T2S); + T2G = FNMS(KP831864738, T1c, T15); + T2H = FNMS(KP916574801, TX, TQ); + T2C = FNMS(KP829049696, T1k, T1j); + T2D = FMA(KP831864738, T1h, T1g); + T2I = FNMS(KP904730450, T2D, T2C); + T2E = FMA(KP904730450, T2D, T2C); + T2L = FMA(KP904730450, T2G, T2I); + T2J = T2H + T2I; + } + Cr[0] = FMA(KP968583161, T2E, T2B); + { + E T2Q, T2X, T2V, T2F, T2M, T2K; + T2Q = FMA(KP248028675, T2P, T2B); + T2X = FNMS(KP690668130, T2W, T2T); + T2V = FNMS(KP618033988, T2U, T2R); + Cr[WS(csr, 9)] = FMA(KP897376177, T2V, T2Q); + Cr[WS(csr, 4)] = FNMS(KP803003575, T2X, T2Q); + T2F = FNMS(KP242145790, T2E, T2B); + T2M = FMA(KP618033988, T2L, T2H); + T2K = FNMS(KP683113946, T2J, T2G); + Cr[WS(csr, 5)] = FMA(KP792626838, T2K, T2F); + Cr[WS(csr, 10)] = FMA(KP876091699, T2M, T2F); + } + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cfII_25", {47, 12, 165, 0}, &GENUS }; + +void X(codelet_r2cfII_25) (planner *p) { + X(kr2c_register) (p, r2cfII_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 25 -name r2cfII_25 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 213 FP additions, 148 FP multiplications, + * (or, 126 additions, 61 multiplications, 87 fused multiply/add), + * 94 stack variables, 38 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP125581039, +0.125581039058626752152356449131262266244969664); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP963507348, +0.963507348203430549974383005744259307057084020); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP497379774, +0.497379774329709576484567492012895936835134813); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP250666467, +0.250666467128608490746237519633017587885836494); + DK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP851558583, +0.851558583130145297725004891488503407959946084); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DK(KP293892626, +0.293892626146236564584352977319536384298826219); + DK(KP475528258, +0.475528258147576786058219666689691071702849317); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E TE, TR, T2i, T1z, TL, TS, TB, T2d, T1l, T1i, T2c, T9, T23, TZ, TW; + E T22, Ti, T26, T16, T13, T25, Ts, T2a, T1e, T1b, T29, TP, TQ; + { + E TK, T1y, TH, T1x; + TE = R0[0]; + { + E TI, TJ, TF, TG; + TI = R0[WS(rs, 10)]; + TJ = R1[WS(rs, 2)]; + TK = TI - TJ; + T1y = TI + TJ; + TF = R0[WS(rs, 5)]; + TG = R1[WS(rs, 7)]; + TH = TF - TG; + T1x = TF + TG; + } + TR = KP559016994 * (TH - TK); + T2i = FNMS(KP587785252, T1x, KP951056516 * T1y); + T1z = FMA(KP951056516, T1x, KP587785252 * T1y); + TL = TH + TK; + TS = FNMS(KP250000000, TL, TE); + } + { + E Tt, Tw, Tz, TA, T1k, T1j, T1g, T1h; + Tt = R0[WS(rs, 3)]; + { + E Tu, Tv, Tx, Ty; + Tu = R0[WS(rs, 8)]; + Tv = R1[WS(rs, 10)]; + Tw = Tu - Tv; + Tx = R1[0]; + Ty = R1[WS(rs, 5)]; + Tz = Tx + Ty; + TA = Tw - Tz; + T1k = Ty - Tx; + T1j = Tu + Tv; + } + TB = Tt + TA; + T2d = FNMS(KP293892626, T1j, KP475528258 * T1k); + T1l = FMA(KP475528258, T1j, KP293892626 * T1k); + T1g = FNMS(KP250000000, TA, Tt); + T1h = KP559016994 * (Tw + Tz); + T1i = T1g + T1h; + T2c = T1g - T1h; + } + { + E T1, T4, T7, T8, TY, TX, TU, TV; + T1 = R0[WS(rs, 1)]; + { + E T2, T3, T5, T6; + T2 = R0[WS(rs, 6)]; + T3 = R1[WS(rs, 8)]; + T4 = T2 - T3; + T5 = R0[WS(rs, 11)]; + T6 = R1[WS(rs, 3)]; + T7 = T5 - T6; + T8 = T4 + T7; + TY = T5 + T6; + TX = T2 + T3; + } + T9 = T1 + T8; + T23 = FNMS(KP293892626, TX, KP475528258 * TY); + TZ = FMA(KP475528258, TX, KP293892626 * TY); + TU = KP559016994 * (T4 - T7); + TV = FNMS(KP250000000, T8, T1); + TW = TU + TV; + T22 = TV - TU; + } + { + E Ta, Td, Tg, Th, T15, T14, T11, T12; + Ta = R0[WS(rs, 4)]; + { + E Tb, Tc, Te, Tf; + Tb = R0[WS(rs, 9)]; + Tc = R1[WS(rs, 11)]; + Td = Tb - Tc; + Te = R1[WS(rs, 1)]; + Tf = R1[WS(rs, 6)]; + Tg = Te + Tf; + Th = Td - Tg; + T15 = Tf - Te; + T14 = Tb + Tc; + } + Ti = Ta + Th; + T26 = FNMS(KP293892626, T14, KP475528258 * T15); + T16 = FMA(KP475528258, T14, KP293892626 * T15); + T11 = FNMS(KP250000000, Th, Ta); + T12 = KP559016994 * (Td + Tg); + T13 = T11 + T12; + T25 = T11 - T12; + } + { + E Tk, Tn, Tq, Tr, T1d, T1c, T19, T1a; + Tk = R0[WS(rs, 2)]; + { + E Tl, Tm, To, Tp; + Tl = R0[WS(rs, 7)]; + Tm = R1[WS(rs, 9)]; + Tn = Tl - Tm; + To = R0[WS(rs, 12)]; + Tp = R1[WS(rs, 4)]; + Tq = To - Tp; + Tr = Tn + Tq; + T1d = To + Tp; + T1c = Tl + Tm; + } + Ts = Tk + Tr; + T2a = FNMS(KP293892626, T1c, KP475528258 * T1d); + T1e = FMA(KP475528258, T1c, KP293892626 * T1d); + T19 = KP559016994 * (Tn - Tq); + T1a = FNMS(KP250000000, Tr, Tk); + T1b = T19 + T1a; + T29 = T1a - T19; + } + TP = TB - Ts; + TQ = T9 - Ti; + Ci[WS(csi, 2)] = FNMS(KP951056516, TQ, KP587785252 * TP); + Ci[WS(csi, 7)] = FMA(KP587785252, TQ, KP951056516 * TP); + { + E TM, TD, TN, Tj, TC, TO; + TM = TE + TL; + Tj = T9 + Ti; + TC = Ts + TB; + TD = KP559016994 * (Tj - TC); + TN = Tj + TC; + Cr[WS(csr, 12)] = TM + TN; + TO = FNMS(KP250000000, TN, TM); + Cr[WS(csr, 2)] = TD + TO; + Cr[WS(csr, 7)] = TO - TD; + } + { + E TT, T1J, T1Y, T1U, T1X, T1P, T1V, T1M, T1W, T1A, T1B, T1r, T1C, T1v, T18; + E T1n, T1o, T1G, T1D; + TT = TR + TS; + { + E T1H, T1I, T1S, T1T; + T1H = FNMS(KP844327925, TW, KP1_071653589 * TZ); + T1I = FNMS(KP1_274847979, T16, KP770513242 * T13); + T1J = T1H - T1I; + T1Y = T1H + T1I; + T1S = FMA(KP125333233, T1i, KP1_984229402 * T1l); + T1T = FMA(KP904827052, T1b, KP851558583 * T1e); + T1U = T1S - T1T; + T1X = T1T + T1S; + } + { + E T1N, T1O, T1K, T1L; + T1N = FMA(KP535826794, TW, KP1_688655851 * TZ); + T1O = FMA(KP637423989, T13, KP1_541026485 * T16); + T1P = T1N - T1O; + T1V = T1N + T1O; + T1K = FNMS(KP1_809654104, T1e, KP425779291 * T1b); + T1L = FNMS(KP992114701, T1i, KP250666467 * T1l); + T1M = T1K - T1L; + T1W = T1K + T1L; + } + { + E T1p, T1q, T1t, T1u; + T1p = FMA(KP844327925, T13, KP1_071653589 * T16); + T1q = FMA(KP248689887, TW, KP1_937166322 * TZ); + T1A = T1q + T1p; + T1t = FMA(KP481753674, T1b, KP1_752613360 * T1e); + T1u = FMA(KP684547105, T1i, KP1_457937254 * T1l); + T1B = T1t + T1u; + T1r = T1p - T1q; + T1C = T1A + T1B; + T1v = T1t - T1u; + } + { + E T10, T17, T1f, T1m; + T10 = FNMS(KP497379774, TZ, KP968583161 * TW); + T17 = FNMS(KP1_688655851, T16, KP535826794 * T13); + T18 = T10 + T17; + T1f = FNMS(KP963507348, T1e, KP876306680 * T1b); + T1m = FNMS(KP1_369094211, T1l, KP728968627 * T1i); + T1n = T1f + T1m; + T1o = T18 + T1n; + T1G = T10 - T17; + T1D = T1f - T1m; + } + { + E T1R, T1Q, T20, T1Z; + Cr[0] = TT + T1o; + Ci[0] = -(T1z + T1C); + T1R = KP559016994 * (T1P + T1M); + T1Q = FMA(KP250000000, T1M - T1P, TT); + Cr[WS(csr, 4)] = FMA(KP951056516, T1J, T1Q) + FMA(KP587785252, T1U, T1R); + Cr[WS(csr, 9)] = FMA(KP951056516, T1U, T1Q) + FNMA(KP587785252, T1J, T1R); + T20 = KP559016994 * (T1Y + T1X); + T1Z = FMA(KP250000000, T1X - T1Y, T1z); + Ci[WS(csi, 9)] = FMA(KP587785252, T1V, KP951056516 * T1W) + T1Z - T20; + Ci[WS(csi, 4)] = FMA(KP587785252, T1W, T1Z) + FNMS(KP951056516, T1V, T20); + { + E T1E, T1F, T1s, T1w; + T1E = FMS(KP250000000, T1C, T1z); + T1F = KP559016994 * (T1B - T1A); + Ci[WS(csi, 5)] = FMA(KP951056516, T1D, T1E) + FNMA(KP587785252, T1G, T1F); + Ci[WS(csi, 10)] = FMA(KP951056516, T1G, KP587785252 * T1D) + T1E + T1F; + T1s = FNMS(KP250000000, T1o, TT); + T1w = KP559016994 * (T18 - T1n); + Cr[WS(csr, 5)] = FMA(KP587785252, T1r, T1s) + FMS(KP951056516, T1v, T1w); + Cr[WS(csr, 10)] = T1w + FMA(KP587785252, T1v, T1s) - (KP951056516 * T1r); + } + } + } + { + E T21, T2z, T2L, T2K, T2M, T2F, T2P, T2C, T2Q, T2l, T2o, T2p, T2w, T2u, T28; + E T2f, T2g, T2s, T2h; + T21 = TS - TR; + { + E T2x, T2y, T2I, T2J; + T2x = FNMS(KP844327925, T29, KP1_071653589 * T2a); + T2y = FNMS(KP125581039, T2d, KP998026728 * T2c); + T2z = T2x + T2y; + T2L = T2y - T2x; + T2I = FNMS(KP481753674, T22, KP1_752613360 * T23); + T2J = FMA(KP904827052, T25, KP851558583 * T26); + T2K = T2I + T2J; + T2M = T2I - T2J; + } + { + E T2D, T2E, T2A, T2B; + T2D = FMA(KP535826794, T29, KP1_688655851 * T2a); + T2E = FMA(KP062790519, T2c, KP1_996053456 * T2d); + T2F = T2D + T2E; + T2P = T2E - T2D; + T2A = FMA(KP876306680, T22, KP963507348 * T23); + T2B = FNMS(KP425779291, T25, KP1_809654104 * T26); + T2C = T2A + T2B; + T2Q = T2A - T2B; + } + { + E T2j, T2k, T2m, T2n; + T2j = FNMS(KP125333233, T25, KP1_984229402 * T26); + T2k = FMA(KP684547105, T22, KP1_457937254 * T23); + T2l = T2j - T2k; + T2m = FNMS(KP770513242, T2c, KP1_274847979 * T2d); + T2n = FMA(KP998026728, T29, KP125581039 * T2a); + T2o = T2m - T2n; + T2p = T2l + T2o; + T2w = T2k + T2j; + T2u = T2n + T2m; + } + { + E T24, T27, T2b, T2e; + T24 = FNMS(KP1_369094211, T23, KP728968627 * T22); + T27 = FMA(KP992114701, T25, KP250666467 * T26); + T28 = T24 - T27; + T2b = FNMS(KP1_996053456, T2a, KP062790519 * T29); + T2e = FMA(KP637423989, T2c, KP1_541026485 * T2d); + T2f = T2b - T2e; + T2g = T28 + T2f; + T2s = T24 + T27; + T2h = T2b + T2e; + } + { + E T2H, T2G, T2O, T2N; + Cr[WS(csr, 1)] = T21 + T2g; + Ci[WS(csi, 1)] = T2p - T2i; + T2H = KP559016994 * (T2C - T2F); + T2G = FNMS(KP250000000, T2C + T2F, T21); + Cr[WS(csr, 8)] = FMA(KP951056516, T2z, T2G) + FNMA(KP587785252, T2K, T2H); + Cr[WS(csr, 3)] = FMA(KP951056516, T2K, KP587785252 * T2z) + T2G + T2H; + T2O = KP559016994 * (T2M + T2L); + T2N = FMA(KP250000000, T2L - T2M, T2i); + Ci[WS(csi, 3)] = T2N + FMA(KP587785252, T2P, T2O) - (KP951056516 * T2Q); + Ci[WS(csi, 8)] = FMA(KP587785252, T2Q, T2N) + FMS(KP951056516, T2P, T2O); + { + E T2t, T2v, T2q, T2r; + T2t = FNMS(KP250000000, T2g, T21); + T2v = KP559016994 * (T28 - T2f); + Cr[WS(csr, 6)] = FMA(KP951056516, T2u, T2t) + FNMA(KP587785252, T2w, T2v); + Cr[WS(csr, 11)] = FMA(KP951056516, T2w, T2v) + FMA(KP587785252, T2u, T2t); + T2q = KP250000000 * T2p; + T2r = KP559016994 * (T2l - T2o); + Ci[WS(csi, 6)] = FMS(KP951056516, T2h, T2i + T2q) + FNMA(KP587785252, T2s, T2r); + Ci[WS(csi, 11)] = FMA(KP951056516, T2s, KP587785252 * T2h) + T2r - (T2i + T2q); + } + } + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cfII_25", {126, 61, 87, 0}, &GENUS }; + +void X(codelet_r2cfII_25) (planner *p) { + X(kr2c_register) (p, r2cfII_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_3.c new file mode 100644 index 000000000..2d43b1ad4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_3.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 3 -name r2cfII_3 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 4 FP additions, 2 FP multiplications, + * (or, 3 additions, 1 multiplications, 1 fused multiply/add), + * 7 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T3, T1, T2, T4; + T3 = R0[0]; + T1 = R1[0]; + T2 = R0[WS(rs, 1)]; + T4 = T2 - T1; + Ci[0] = -(KP866025403 * (T1 + T2)); + Cr[0] = FNMS(KP500000000, T4, T3); + Cr[WS(csr, 1)] = T3 + T4; + } + } +} + +static const kr2c_desc desc = { 3, "r2cfII_3", {3, 1, 1, 0}, &GENUS }; + +void X(codelet_r2cfII_3) (planner *p) { + X(kr2c_register) (p, r2cfII_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 3 -name r2cfII_3 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 4 FP additions, 2 FP multiplications, + * (or, 3 additions, 1 multiplications, 1 fused multiply/add), + * 7 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T1, T2, T3, T4; + T1 = R0[0]; + T2 = R1[0]; + T3 = R0[WS(rs, 1)]; + T4 = T2 - T3; + Cr[WS(csr, 1)] = T1 - T4; + Ci[0] = -(KP866025403 * (T2 + T3)); + Cr[0] = FMA(KP500000000, T4, T1); + } + } +} + +static const kr2c_desc desc = { 3, "r2cfII_3", {3, 1, 1, 0}, &GENUS }; + +void X(codelet_r2cfII_3) (planner *p) { + X(kr2c_register) (p, r2cfII_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_32.c new file mode 100644 index 000000000..c07112b96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_32.c @@ -0,0 +1,688 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:44 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -name r2cfII_32 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 174 FP additions, 128 FP multiplications, + * (or, 46 additions, 0 multiplications, 128 fused multiply/add), + * 62 stack variables, 15 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T5, T2B, T1z, T2n, Tc, T2C, T1C, T2o, Tm, T1l, T1J, T27, Tv, T1k, T1G; + E T26, T15, T1r, T1Y, T2e, T1c, T1s, T1V, T2d, TK, T1o, T1R, T2b, TR, T1p; + E T1O, T2a; + { + E T1, T2l, T4, T2m, T2, T3; + T1 = R0[0]; + T2l = R0[WS(rs, 8)]; + T2 = R0[WS(rs, 4)]; + T3 = R0[WS(rs, 12)]; + T4 = T2 - T3; + T2m = T2 + T3; + T5 = FNMS(KP707106781, T4, T1); + T2B = FNMS(KP707106781, T2m, T2l); + T1z = FMA(KP707106781, T4, T1); + T2n = FMA(KP707106781, T2m, T2l); + } + { + E T8, T1A, Tb, T1B; + { + E T6, T7, T9, Ta; + T6 = R0[WS(rs, 10)]; + T7 = R0[WS(rs, 2)]; + T8 = FMA(KP414213562, T7, T6); + T1A = FNMS(KP414213562, T6, T7); + T9 = R0[WS(rs, 6)]; + Ta = R0[WS(rs, 14)]; + Tb = FMA(KP414213562, Ta, T9); + T1B = FMS(KP414213562, T9, Ta); + } + Tc = T8 - Tb; + T2C = T1B - T1A; + T1C = T1A + T1B; + T2o = T8 + Tb; + } + { + E Te, Tj, Th, Tk, Tf, Tg; + Te = R0[WS(rs, 7)]; + Tj = R0[WS(rs, 15)]; + Tf = R0[WS(rs, 3)]; + Tg = R0[WS(rs, 11)]; + Th = Tf + Tg; + Tk = Tg - Tf; + { + E Ti, Tl, T1H, T1I; + Ti = FNMS(KP707106781, Th, Te); + Tl = FNMS(KP707106781, Tk, Tj); + Tm = FNMS(KP668178637, Tl, Ti); + T1l = FMA(KP668178637, Ti, Tl); + T1H = FMA(KP707106781, Th, Te); + T1I = FMA(KP707106781, Tk, Tj); + T1J = FMA(KP198912367, T1I, T1H); + T27 = FNMS(KP198912367, T1H, T1I); + } + } + { + E Tn, Ts, Tq, Tt, To, Tp; + Tn = R0[WS(rs, 9)]; + Ts = R0[WS(rs, 1)]; + To = R0[WS(rs, 5)]; + Tp = R0[WS(rs, 13)]; + Tq = To + Tp; + Tt = To - Tp; + { + E Tr, Tu, T1E, T1F; + Tr = FNMS(KP707106781, Tq, Tn); + Tu = FNMS(KP707106781, Tt, Ts); + Tv = FNMS(KP668178637, Tu, Tr); + T1k = FMA(KP668178637, Tr, Tu); + T1E = FMA(KP707106781, Tq, Tn); + T1F = FMA(KP707106781, Tt, Ts); + T1G = FMA(KP198912367, T1F, T1E); + T26 = FNMS(KP198912367, T1E, T1F); + } + } + { + E TT, T16, TW, T17, T10, T1a, T13, T19, TU, TV; + TT = R1[WS(rs, 15)]; + T16 = R1[WS(rs, 7)]; + TU = R1[WS(rs, 3)]; + TV = R1[WS(rs, 11)]; + TW = TU - TV; + T17 = TU + TV; + { + E TY, TZ, T11, T12; + TY = R1[WS(rs, 9)]; + TZ = R1[WS(rs, 1)]; + T10 = FMA(KP414213562, TZ, TY); + T1a = FNMS(KP414213562, TY, TZ); + T11 = R1[WS(rs, 5)]; + T12 = R1[WS(rs, 13)]; + T13 = FMA(KP414213562, T12, T11); + T19 = FMS(KP414213562, T11, T12); + } + { + E TX, T14, T1W, T1X; + TX = FMA(KP707106781, TW, TT); + T14 = T10 - T13; + T15 = FMA(KP923879532, T14, TX); + T1r = FNMS(KP923879532, T14, TX); + T1W = FMA(KP707106781, T17, T16); + T1X = T10 + T13; + T1Y = FNMS(KP923879532, T1X, T1W); + T2e = FMA(KP923879532, T1X, T1W); + } + { + E T18, T1b, T1T, T1U; + T18 = FNMS(KP707106781, T17, T16); + T1b = T19 - T1a; + T1c = FNMS(KP923879532, T1b, T18); + T1s = FMA(KP923879532, T1b, T18); + T1T = FMS(KP707106781, TW, TT); + T1U = T1a + T19; + T1V = FNMS(KP923879532, T1U, T1T); + T2d = FMA(KP923879532, T1U, T1T); + } + } + { + E Ty, TL, TB, TM, TF, TP, TI, TO, Tz, TA; + Ty = R1[0]; + TL = R1[WS(rs, 8)]; + Tz = R1[WS(rs, 4)]; + TA = R1[WS(rs, 12)]; + TB = Tz - TA; + TM = Tz + TA; + { + E TD, TE, TG, TH; + TD = R1[WS(rs, 10)]; + TE = R1[WS(rs, 2)]; + TF = FMA(KP414213562, TE, TD); + TP = FNMS(KP414213562, TD, TE); + TG = R1[WS(rs, 6)]; + TH = R1[WS(rs, 14)]; + TI = FMA(KP414213562, TH, TG); + TO = FMS(KP414213562, TG, TH); + } + { + E TC, TJ, T1P, T1Q; + TC = FNMS(KP707106781, TB, Ty); + TJ = TF - TI; + TK = FNMS(KP923879532, TJ, TC); + T1o = FMA(KP923879532, TJ, TC); + T1P = FMA(KP707106781, TM, TL); + T1Q = TF + TI; + T1R = FNMS(KP923879532, T1Q, T1P); + T2b = FMA(KP923879532, T1Q, T1P); + } + { + E TN, TQ, T1M, T1N; + TN = FNMS(KP707106781, TM, TL); + TQ = TO - TP; + TR = FNMS(KP923879532, TQ, TN); + T1p = FMA(KP923879532, TQ, TN); + T1M = FMA(KP707106781, TB, Ty); + T1N = TP + TO; + T1O = FNMS(KP923879532, T1N, T1M); + T2a = FMA(KP923879532, T1N, T1M); + } + } + { + E Tx, T1f, T2L, T2N, T1e, T2O, T1i, T2M; + { + E Td, Tw, T2J, T2K; + Td = FNMS(KP923879532, Tc, T5); + Tw = Tm - Tv; + Tx = FMA(KP831469612, Tw, Td); + T1f = FNMS(KP831469612, Tw, Td); + T2J = FNMS(KP923879532, T2C, T2B); + T2K = T1k + T1l; + T2L = FMA(KP831469612, T2K, T2J); + T2N = FNMS(KP831469612, T2K, T2J); + } + { + E TS, T1d, T1g, T1h; + TS = FNMS(KP534511135, TR, TK); + T1d = FNMS(KP534511135, T1c, T15); + T1e = TS - T1d; + T2O = TS + T1d; + T1g = FMA(KP534511135, TK, TR); + T1h = FMA(KP534511135, T15, T1c); + T1i = T1g - T1h; + T2M = T1g + T1h; + } + Cr[WS(csr, 13)] = FNMS(KP881921264, T1e, Tx); + Ci[WS(csi, 13)] = FNMS(KP881921264, T2M, T2L); + Cr[WS(csr, 2)] = FMA(KP881921264, T1e, Tx); + Ci[WS(csi, 2)] = -(FMA(KP881921264, T2M, T2L)); + Cr[WS(csr, 10)] = FNMS(KP881921264, T1i, T1f); + Ci[WS(csi, 10)] = -(FMA(KP881921264, T2O, T2N)); + Cr[WS(csr, 5)] = FMA(KP881921264, T1i, T1f); + Ci[WS(csi, 5)] = FNMS(KP881921264, T2O, T2N); + } + { + E T29, T2h, T2r, T2t, T2g, T2u, T2k, T2s; + { + E T25, T28, T2p, T2q; + T25 = FMA(KP923879532, T1C, T1z); + T28 = T26 - T27; + T29 = FMA(KP980785280, T28, T25); + T2h = FNMS(KP980785280, T28, T25); + T2p = FMA(KP923879532, T2o, T2n); + T2q = T1G + T1J; + T2r = FMA(KP980785280, T2q, T2p); + T2t = FNMS(KP980785280, T2q, T2p); + } + { + E T2c, T2f, T2i, T2j; + T2c = FNMS(KP098491403, T2b, T2a); + T2f = FMA(KP098491403, T2e, T2d); + T2g = T2c + T2f; + T2u = T2f - T2c; + T2i = FMA(KP098491403, T2a, T2b); + T2j = FNMS(KP098491403, T2d, T2e); + T2k = T2i - T2j; + T2s = T2i + T2j; + } + Cr[WS(csr, 15)] = FNMS(KP995184726, T2g, T29); + Ci[WS(csi, 15)] = FNMS(KP995184726, T2s, T2r); + Cr[0] = FMA(KP995184726, T2g, T29); + Ci[0] = -(FMA(KP995184726, T2s, T2r)); + Cr[WS(csr, 8)] = FNMS(KP995184726, T2k, T2h); + Ci[WS(csi, 8)] = FMS(KP995184726, T2u, T2t); + Cr[WS(csr, 7)] = FMA(KP995184726, T2k, T2h); + Ci[WS(csi, 7)] = FMA(KP995184726, T2u, T2t); + } + { + E T1n, T1v, T2F, T2H, T1u, T2I, T1y, T2G; + { + E T1j, T1m, T2D, T2E; + T1j = FMA(KP923879532, Tc, T5); + T1m = T1k - T1l; + T1n = FMA(KP831469612, T1m, T1j); + T1v = FNMS(KP831469612, T1m, T1j); + T2D = FMA(KP923879532, T2C, T2B); + T2E = Tv + Tm; + T2F = FMA(KP831469612, T2E, T2D); + T2H = FNMS(KP831469612, T2E, T2D); + } + { + E T1q, T1t, T1w, T1x; + T1q = FMA(KP303346683, T1p, T1o); + T1t = FMA(KP303346683, T1s, T1r); + T1u = T1q - T1t; + T2I = T1q + T1t; + T1w = FNMS(KP303346683, T1r, T1s); + T1x = FNMS(KP303346683, T1o, T1p); + T1y = T1w - T1x; + T2G = T1x + T1w; + } + Cr[WS(csr, 14)] = FNMS(KP956940335, T1u, T1n); + Ci[WS(csi, 14)] = FMS(KP956940335, T2G, T2F); + Cr[WS(csr, 1)] = FMA(KP956940335, T1u, T1n); + Ci[WS(csi, 1)] = FMA(KP956940335, T2G, T2F); + Cr[WS(csr, 9)] = FNMS(KP956940335, T1y, T1v); + Ci[WS(csi, 9)] = FNMS(KP956940335, T2I, T2H); + Cr[WS(csr, 6)] = FMA(KP956940335, T1y, T1v); + Ci[WS(csi, 6)] = -(FMA(KP956940335, T2I, T2H)); + } + { + E T1L, T21, T2x, T2z, T20, T2A, T24, T2y; + { + E T1D, T1K, T2v, T2w; + T1D = FNMS(KP923879532, T1C, T1z); + T1K = T1G - T1J; + T1L = FMA(KP980785280, T1K, T1D); + T21 = FNMS(KP980785280, T1K, T1D); + T2v = FNMS(KP923879532, T2o, T2n); + T2w = T26 + T27; + T2x = FNMS(KP980785280, T2w, T2v); + T2z = FMA(KP980785280, T2w, T2v); + } + { + E T1S, T1Z, T22, T23; + T1S = FMA(KP820678790, T1R, T1O); + T1Z = FNMS(KP820678790, T1Y, T1V); + T20 = T1S + T1Z; + T2A = T1Z - T1S; + T22 = FMA(KP820678790, T1V, T1Y); + T23 = FNMS(KP820678790, T1O, T1R); + T24 = T22 - T23; + T2y = T23 + T22; + } + Cr[WS(csr, 12)] = FNMS(KP773010453, T20, T1L); + Ci[WS(csi, 12)] = FMS(KP773010453, T2y, T2x); + Cr[WS(csr, 3)] = FMA(KP773010453, T20, T1L); + Ci[WS(csi, 3)] = FMA(KP773010453, T2y, T2x); + Cr[WS(csr, 11)] = FNMS(KP773010453, T24, T21); + Ci[WS(csi, 11)] = FMA(KP773010453, T2A, T2z); + Cr[WS(csr, 4)] = FMA(KP773010453, T24, T21); + Ci[WS(csi, 4)] = FMS(KP773010453, T2A, T2z); + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cfII_32", {46, 0, 128, 0}, &GENUS }; + +void X(codelet_r2cfII_32) (planner *p) { + X(kr2c_register) (p, r2cfII_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 32 -name r2cfII_32 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 174 FP additions, 82 FP multiplications, + * (or, 138 additions, 46 multiplications, 36 fused multiply/add), + * 62 stack variables, 15 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T5, T2D, T1z, T2q, Tc, T2C, T1C, T2n, Tm, T1k, T1J, T26, Tv, T1l, T1G; + E T27, T15, T1r, T1Y, T2e, T1c, T1s, T1V, T2d, TK, T1o, T1R, T2b, TR, T1p; + E T1O, T2a; + { + E T1, T2p, T4, T2o, T2, T3; + T1 = R0[0]; + T2p = R0[WS(rs, 8)]; + T2 = R0[WS(rs, 4)]; + T3 = R0[WS(rs, 12)]; + T4 = KP707106781 * (T2 - T3); + T2o = KP707106781 * (T2 + T3); + T5 = T1 + T4; + T2D = T2p - T2o; + T1z = T1 - T4; + T2q = T2o + T2p; + } + { + E T8, T1A, Tb, T1B; + { + E T6, T7, T9, Ta; + T6 = R0[WS(rs, 2)]; + T7 = R0[WS(rs, 10)]; + T8 = FNMS(KP382683432, T7, KP923879532 * T6); + T1A = FMA(KP382683432, T6, KP923879532 * T7); + T9 = R0[WS(rs, 6)]; + Ta = R0[WS(rs, 14)]; + Tb = FNMS(KP923879532, Ta, KP382683432 * T9); + T1B = FMA(KP923879532, T9, KP382683432 * Ta); + } + Tc = T8 + Tb; + T2C = Tb - T8; + T1C = T1A - T1B; + T2n = T1A + T1B; + } + { + E Te, Tk, Th, Tj, Tf, Tg; + Te = R0[WS(rs, 1)]; + Tk = R0[WS(rs, 9)]; + Tf = R0[WS(rs, 5)]; + Tg = R0[WS(rs, 13)]; + Th = KP707106781 * (Tf - Tg); + Tj = KP707106781 * (Tf + Tg); + { + E Ti, Tl, T1H, T1I; + Ti = Te + Th; + Tl = Tj + Tk; + Tm = FNMS(KP195090322, Tl, KP980785280 * Ti); + T1k = FMA(KP195090322, Ti, KP980785280 * Tl); + T1H = Tk - Tj; + T1I = Te - Th; + T1J = FNMS(KP555570233, T1I, KP831469612 * T1H); + T26 = FMA(KP831469612, T1I, KP555570233 * T1H); + } + } + { + E Tq, Tt, Tp, Ts, Tn, To; + Tq = R0[WS(rs, 15)]; + Tt = R0[WS(rs, 7)]; + Tn = R0[WS(rs, 3)]; + To = R0[WS(rs, 11)]; + Tp = KP707106781 * (Tn - To); + Ts = KP707106781 * (Tn + To); + { + E Tr, Tu, T1E, T1F; + Tr = Tp - Tq; + Tu = Ts + Tt; + Tv = FMA(KP980785280, Tr, KP195090322 * Tu); + T1l = FNMS(KP980785280, Tu, KP195090322 * Tr); + T1E = Tt - Ts; + T1F = Tp + Tq; + T1G = FNMS(KP555570233, T1F, KP831469612 * T1E); + T27 = FMA(KP831469612, T1F, KP555570233 * T1E); + } + } + { + E TW, T1a, TV, T19, T10, T16, T13, T17, TT, TU; + TW = R1[WS(rs, 15)]; + T1a = R1[WS(rs, 7)]; + TT = R1[WS(rs, 3)]; + TU = R1[WS(rs, 11)]; + TV = KP707106781 * (TT - TU); + T19 = KP707106781 * (TT + TU); + { + E TY, TZ, T11, T12; + TY = R1[WS(rs, 1)]; + TZ = R1[WS(rs, 9)]; + T10 = FNMS(KP382683432, TZ, KP923879532 * TY); + T16 = FMA(KP382683432, TY, KP923879532 * TZ); + T11 = R1[WS(rs, 5)]; + T12 = R1[WS(rs, 13)]; + T13 = FNMS(KP923879532, T12, KP382683432 * T11); + T17 = FMA(KP923879532, T11, KP382683432 * T12); + } + { + E TX, T14, T1W, T1X; + TX = TV - TW; + T14 = T10 + T13; + T15 = TX + T14; + T1r = TX - T14; + T1W = T13 - T10; + T1X = T1a - T19; + T1Y = T1W - T1X; + T2e = T1W + T1X; + } + { + E T18, T1b, T1T, T1U; + T18 = T16 + T17; + T1b = T19 + T1a; + T1c = T18 + T1b; + T1s = T1b - T18; + T1T = TV + TW; + T1U = T16 - T17; + T1V = T1T + T1U; + T2d = T1U - T1T; + } + } + { + E Ty, TP, TB, TO, TF, TL, TI, TM, Tz, TA; + Ty = R1[0]; + TP = R1[WS(rs, 8)]; + Tz = R1[WS(rs, 4)]; + TA = R1[WS(rs, 12)]; + TB = KP707106781 * (Tz - TA); + TO = KP707106781 * (Tz + TA); + { + E TD, TE, TG, TH; + TD = R1[WS(rs, 2)]; + TE = R1[WS(rs, 10)]; + TF = FNMS(KP382683432, TE, KP923879532 * TD); + TL = FMA(KP382683432, TD, KP923879532 * TE); + TG = R1[WS(rs, 6)]; + TH = R1[WS(rs, 14)]; + TI = FNMS(KP923879532, TH, KP382683432 * TG); + TM = FMA(KP923879532, TG, KP382683432 * TH); + } + { + E TC, TJ, T1P, T1Q; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T1o = TC - TJ; + T1P = TI - TF; + T1Q = TP - TO; + T1R = T1P - T1Q; + T2b = T1P + T1Q; + } + { + E TN, TQ, T1M, T1N; + TN = TL + TM; + TQ = TO + TP; + TR = TN + TQ; + T1p = TQ - TN; + T1M = Ty - TB; + T1N = TL - TM; + T1O = T1M - T1N; + T2a = T1M + T1N; + } + } + { + E Tx, T1f, T2s, T2u, T1e, T2l, T1i, T2t; + { + E Td, Tw, T2m, T2r; + Td = T5 + Tc; + Tw = Tm + Tv; + Tx = Td - Tw; + T1f = Td + Tw; + T2m = T1l - T1k; + T2r = T2n + T2q; + T2s = T2m - T2r; + T2u = T2m + T2r; + } + { + E TS, T1d, T1g, T1h; + TS = FMA(KP098017140, TK, KP995184726 * TR); + T1d = FNMS(KP995184726, T1c, KP098017140 * T15); + T1e = TS + T1d; + T2l = T1d - TS; + T1g = FNMS(KP098017140, TR, KP995184726 * TK); + T1h = FMA(KP995184726, T15, KP098017140 * T1c); + T1i = T1g + T1h; + T2t = T1h - T1g; + } + Cr[WS(csr, 8)] = Tx - T1e; + Ci[WS(csi, 8)] = T2t - T2u; + Cr[WS(csr, 7)] = Tx + T1e; + Ci[WS(csi, 7)] = T2t + T2u; + Cr[WS(csr, 15)] = T1f - T1i; + Ci[WS(csi, 15)] = T2l - T2s; + Cr[0] = T1f + T1i; + Ci[0] = T2l + T2s; + } + { + E T29, T2h, T2M, T2O, T2g, T2J, T2k, T2N; + { + E T25, T28, T2K, T2L; + T25 = T1z + T1C; + T28 = T26 - T27; + T29 = T25 + T28; + T2h = T25 - T28; + T2K = T1J + T1G; + T2L = T2C + T2D; + T2M = T2K - T2L; + T2O = T2K + T2L; + } + { + E T2c, T2f, T2i, T2j; + T2c = FMA(KP956940335, T2a, KP290284677 * T2b); + T2f = FNMS(KP290284677, T2e, KP956940335 * T2d); + T2g = T2c + T2f; + T2J = T2f - T2c; + T2i = FMA(KP290284677, T2d, KP956940335 * T2e); + T2j = FNMS(KP290284677, T2a, KP956940335 * T2b); + T2k = T2i - T2j; + T2N = T2j + T2i; + } + Cr[WS(csr, 14)] = T29 - T2g; + Ci[WS(csi, 14)] = T2N - T2O; + Cr[WS(csr, 1)] = T29 + T2g; + Ci[WS(csi, 1)] = T2N + T2O; + Cr[WS(csr, 9)] = T2h - T2k; + Ci[WS(csi, 9)] = T2J - T2M; + Cr[WS(csr, 6)] = T2h + T2k; + Ci[WS(csi, 6)] = T2J + T2M; + } + { + E T1n, T1v, T2y, T2A, T1u, T2v, T1y, T2z; + { + E T1j, T1m, T2w, T2x; + T1j = T5 - Tc; + T1m = T1k + T1l; + T1n = T1j + T1m; + T1v = T1j - T1m; + T2w = Tv - Tm; + T2x = T2q - T2n; + T2y = T2w - T2x; + T2A = T2w + T2x; + } + { + E T1q, T1t, T1w, T1x; + T1q = FMA(KP773010453, T1o, KP634393284 * T1p); + T1t = FNMS(KP634393284, T1s, KP773010453 * T1r); + T1u = T1q + T1t; + T2v = T1t - T1q; + T1w = FMA(KP634393284, T1r, KP773010453 * T1s); + T1x = FNMS(KP634393284, T1o, KP773010453 * T1p); + T1y = T1w - T1x; + T2z = T1x + T1w; + } + Cr[WS(csr, 12)] = T1n - T1u; + Ci[WS(csi, 12)] = T2z - T2A; + Cr[WS(csr, 3)] = T1n + T1u; + Ci[WS(csi, 3)] = T2z + T2A; + Cr[WS(csr, 11)] = T1v - T1y; + Ci[WS(csi, 11)] = T2v - T2y; + Cr[WS(csr, 4)] = T1v + T1y; + Ci[WS(csi, 4)] = T2v + T2y; + } + { + E T1L, T21, T2G, T2I, T20, T2H, T24, T2B; + { + E T1D, T1K, T2E, T2F; + T1D = T1z - T1C; + T1K = T1G - T1J; + T1L = T1D + T1K; + T21 = T1D - T1K; + T2E = T2C - T2D; + T2F = T26 + T27; + T2G = T2E - T2F; + T2I = T2F + T2E; + } + { + E T1S, T1Z, T22, T23; + T1S = FMA(KP881921264, T1O, KP471396736 * T1R); + T1Z = FMA(KP881921264, T1V, KP471396736 * T1Y); + T20 = T1S - T1Z; + T2H = T1S + T1Z; + T22 = FNMS(KP471396736, T1V, KP881921264 * T1Y); + T23 = FNMS(KP471396736, T1O, KP881921264 * T1R); + T24 = T22 - T23; + T2B = T23 + T22; + } + Cr[WS(csr, 13)] = T1L - T20; + Ci[WS(csi, 13)] = T2B - T2G; + Cr[WS(csr, 2)] = T1L + T20; + Ci[WS(csi, 2)] = T2B + T2G; + Cr[WS(csr, 10)] = T21 - T24; + Ci[WS(csi, 10)] = T2I - T2H; + Cr[WS(csr, 5)] = T21 + T24; + Ci[WS(csi, 5)] = -(T2H + T2I); + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cfII_32", {138, 46, 36, 0}, &GENUS }; + +void X(codelet_r2cfII_32) (planner *p) { + X(kr2c_register) (p, r2cfII_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_4.c new file mode 100644 index 000000000..7171688ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_4.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -name r2cfII_4 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 6 FP additions, 4 FP multiplications, + * (or, 2 additions, 0 multiplications, 4 fused multiply/add), + * 8 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T1, T5, T4, T6, T2, T3; + T1 = R0[0]; + T5 = R0[WS(rs, 1)]; + T2 = R1[0]; + T3 = R1[WS(rs, 1)]; + T4 = T2 - T3; + T6 = T2 + T3; + Cr[WS(csr, 1)] = FNMS(KP707106781, T4, T1); + Ci[WS(csi, 1)] = FNMS(KP707106781, T6, T5); + Cr[0] = FMA(KP707106781, T4, T1); + Ci[0] = -(FMA(KP707106781, T6, T5)); + } + } +} + +static const kr2c_desc desc = { 4, "r2cfII_4", {2, 0, 4, 0}, &GENUS }; + +void X(codelet_r2cfII_4) (planner *p) { + X(kr2c_register) (p, r2cfII_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 4 -name r2cfII_4 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 6 FP additions, 2 FP multiplications, + * (or, 6 additions, 2 multiplications, 0 fused multiply/add), + * 8 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T1, T6, T4, T5, T2, T3; + T1 = R0[0]; + T6 = R0[WS(rs, 1)]; + T2 = R1[0]; + T3 = R1[WS(rs, 1)]; + T4 = KP707106781 * (T2 - T3); + T5 = KP707106781 * (T2 + T3); + Cr[WS(csr, 1)] = T1 - T4; + Ci[WS(csi, 1)] = T6 - T5; + Cr[0] = T1 + T4; + Ci[0] = -(T5 + T6); + } + } +} + +static const kr2c_desc desc = { 4, "r2cfII_4", {6, 2, 0, 0}, &GENUS }; + +void X(codelet_r2cfII_4) (planner *p) { + X(kr2c_register) (p, r2cfII_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_5.c new file mode 100644 index 000000000..6f7bfa3b9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_5.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 5 -name r2cfII_5 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 12 FP additions, 7 FP multiplications, + * (or, 7 additions, 2 multiplications, 5 fused multiply/add), + * 17 stack variables, 4 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E T1, T4, T7, T8, Tc, Tb, T9, Ta; + T1 = R0[0]; + { + E T2, T3, T5, T6; + T2 = R0[WS(rs, 1)]; + T3 = R1[WS(rs, 1)]; + T4 = T2 - T3; + T5 = R0[WS(rs, 2)]; + T6 = R1[0]; + T7 = T5 - T6; + T8 = T4 + T7; + Tc = T5 + T6; + Tb = T2 + T3; + } + Cr[WS(csr, 2)] = T1 + T8; + Ci[WS(csi, 1)] = -(KP951056516 * (FNMS(KP618033988, Tb, Tc))); + Ci[0] = -(KP951056516 * (FMA(KP618033988, Tc, Tb))); + T9 = FNMS(KP250000000, T8, T1); + Ta = T4 - T7; + Cr[0] = FMA(KP559016994, Ta, T9); + Cr[WS(csr, 1)] = FNMS(KP559016994, Ta, T9); + } + } +} + +static const kr2c_desc desc = { 5, "r2cfII_5", {7, 2, 5, 0}, &GENUS }; + +void X(codelet_r2cfII_5) (planner *p) { + X(kr2c_register) (p, r2cfII_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 5 -name r2cfII_5 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 12 FP additions, 6 FP multiplications, + * (or, 9 additions, 3 multiplications, 3 fused multiply/add), + * 17 stack variables, 4 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E T8, T3, T6, T9, Tc, Tb, T7, Ta; + T8 = R0[0]; + { + E T1, T2, T4, T5; + T1 = R0[WS(rs, 1)]; + T2 = R1[WS(rs, 1)]; + T3 = T1 - T2; + T4 = R0[WS(rs, 2)]; + T5 = R1[0]; + T6 = T4 - T5; + T9 = T3 + T6; + Tc = T4 + T5; + Tb = T1 + T2; + } + Cr[WS(csr, 2)] = T8 + T9; + Ci[WS(csi, 1)] = FNMS(KP951056516, Tc, KP587785252 * Tb); + Ci[0] = -(FMA(KP951056516, Tb, KP587785252 * Tc)); + T7 = KP559016994 * (T3 - T6); + Ta = FNMS(KP250000000, T9, T8); + Cr[0] = T7 + Ta; + Cr[WS(csr, 1)] = Ta - T7; + } + } +} + +static const kr2c_desc desc = { 5, "r2cfII_5", {9, 3, 3, 0}, &GENUS }; + +void X(codelet_r2cfII_5) (planner *p) { + X(kr2c_register) (p, r2cfII_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_6.c new file mode 100644 index 000000000..cc3f76a7f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_6.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -name r2cfII_6 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 13 FP additions, 6 FP multiplications, + * (or, 7 additions, 0 multiplications, 6 fused multiply/add), + * 15 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T1, T9, T2, T3, T4, Tc, T8, Ta, T6, T7, T5, Tb; + T1 = R0[0]; + T9 = R1[WS(rs, 1)]; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 1)]; + T4 = T3 - T2; + Tc = T2 + T3; + T6 = R1[WS(rs, 2)]; + T7 = R1[0]; + T8 = T6 - T7; + Ta = T6 + T7; + Ci[WS(csi, 1)] = T9 - Ta; + Cr[WS(csr, 1)] = T1 + T2 - T3; + T5 = FMA(KP500000000, T4, T1); + Cr[0] = FNMS(KP866025403, T8, T5); + Cr[WS(csr, 2)] = FMA(KP866025403, T8, T5); + Tb = FMA(KP500000000, Ta, T9); + Ci[0] = -(FMA(KP866025403, Tc, Tb)); + Ci[WS(csi, 2)] = FMS(KP866025403, Tc, Tb); + } + } +} + +static const kr2c_desc desc = { 6, "r2cfII_6", {7, 0, 6, 0}, &GENUS }; + +void X(codelet_r2cfII_6) (planner *p) { + X(kr2c_register) (p, r2cfII_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 6 -name r2cfII_6 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 13 FP additions, 4 FP multiplications, + * (or, 11 additions, 2 multiplications, 2 fused multiply/add), + * 14 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E Ta, T7, T9, T1, T3, T2, T8, T4, T5, T6, Tb; + Ta = R1[WS(rs, 1)]; + T5 = R1[WS(rs, 2)]; + T6 = R1[0]; + T7 = KP866025403 * (T5 - T6); + T9 = T5 + T6; + T1 = R0[0]; + T3 = R0[WS(rs, 1)]; + T2 = R0[WS(rs, 2)]; + T8 = KP866025403 * (T2 + T3); + T4 = FMA(KP500000000, T3 - T2, T1); + Cr[0] = T4 - T7; + Cr[WS(csr, 2)] = T4 + T7; + Ci[WS(csi, 1)] = Ta - T9; + Cr[WS(csr, 1)] = T1 + T2 - T3; + Tb = FMA(KP500000000, T9, Ta); + Ci[0] = -(T8 + Tb); + Ci[WS(csi, 2)] = T8 - Tb; + } + } +} + +static const kr2c_desc desc = { 6, "r2cfII_6", {11, 2, 2, 0}, &GENUS }; + +void X(codelet_r2cfII_6) (planner *p) { + X(kr2c_register) (p, r2cfII_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_64.c new file mode 100644 index 000000000..f496ca5e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_64.c @@ -0,0 +1,1550 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:44 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 64 -name r2cfII_64 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 434 FP additions, 320 FP multiplications, + * (or, 114 additions, 0 multiplications, 320 fused multiply/add), + * 118 stack variables, 31 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP941544065, +0.941544065183020778412509402599502357185589796); + DK(KP903989293, +0.903989293123443331586200297230537048710132025); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP472964775, +0.472964775891319928124438237972992463904131113); + DK(KP357805721, +0.357805721314524104672487743774474392487532769); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP989176509, +0.989176509964780973451673738016243063983689533); + DK(KP803207531, +0.803207531480644909806676512963141923879569427); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP741650546, +0.741650546272035369581266691172079863842265220); + DK(KP148335987, +0.148335987538347428753676511486911367000625355); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP998795456, +0.998795456205172392714771604759100694443203615); + DK(KP740951125, +0.740951125354959091175616897495162729728955309); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP906347169, +0.906347169019147157946142717268914412664134293); + DK(KP049126849, +0.049126849769467254105343321271313617079695752); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP970031253, +0.970031253194543992603984207286100251456865962); + DK(KP857728610, +0.857728610000272069902269984284770137042490799); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP599376933, +0.599376933681923766271389869014404232837890546); + DK(KP250486960, +0.250486960191305461595702160124721208578685568); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E Tm, T35, T3Z, T5h, Tv, T34, T3W, T5g, Td, T33, T6z, T6N, T3T, T5f, T65; + E T6j, T2b, T3n, T4O, T5C, T2C, T3q, T4D, T5z, TK, T3b, T4e, T5l, TR, T3c; + E T4b, T5k, T15, T38, T47, T5o, T1c, T39, T44, T5n, T1s, T3g, T4v, T5v, T1T; + E T3j, T4k, T5s, T2u, T3r, T4R, T5A, T2F, T3o, T4K, T5D, T1L, T3k, T4y, T5t; + E T1W, T3h, T4r, T5w; + { + E Te, Tj, Th, Tk, Tf, Tg; + Te = R0[WS(rs, 14)]; + Tj = R0[WS(rs, 30)]; + Tf = R0[WS(rs, 6)]; + Tg = R0[WS(rs, 22)]; + Th = Tf + Tg; + Tk = Tg - Tf; + { + E Ti, Tl, T3X, T3Y; + Ti = FNMS(KP707106781, Th, Te); + Tl = FNMS(KP707106781, Tk, Tj); + Tm = FNMS(KP668178637, Tl, Ti); + T35 = FMA(KP668178637, Ti, Tl); + T3X = FMA(KP707106781, Th, Te); + T3Y = FMA(KP707106781, Tk, Tj); + T3Z = FMA(KP198912367, T3Y, T3X); + T5h = FNMS(KP198912367, T3X, T3Y); + } + } + { + E Tn, Ts, Tq, Tt, To, Tp; + Tn = R0[WS(rs, 18)]; + Ts = R0[WS(rs, 2)]; + To = R0[WS(rs, 10)]; + Tp = R0[WS(rs, 26)]; + Tq = To + Tp; + Tt = To - Tp; + { + E Tr, Tu, T3U, T3V; + Tr = FNMS(KP707106781, Tq, Tn); + Tu = FNMS(KP707106781, Tt, Ts); + Tv = FNMS(KP668178637, Tu, Tr); + T34 = FMA(KP668178637, Tr, Tu); + T3U = FMA(KP707106781, Tq, Tn); + T3V = FMA(KP707106781, Tt, Ts); + T3W = FMA(KP198912367, T3V, T3U); + T5g = FNMS(KP198912367, T3U, T3V); + } + } + { + E T1, T61, T4, T62, T8, T3Q, Tb, T3R, T2, T3; + T1 = R0[0]; + T61 = R0[WS(rs, 16)]; + T2 = R0[WS(rs, 8)]; + T3 = R0[WS(rs, 24)]; + T4 = T2 - T3; + T62 = T2 + T3; + { + E T6, T7, T9, Ta; + T6 = R0[WS(rs, 20)]; + T7 = R0[WS(rs, 4)]; + T8 = FMA(KP414213562, T7, T6); + T3Q = FNMS(KP414213562, T6, T7); + T9 = R0[WS(rs, 12)]; + Ta = R0[WS(rs, 28)]; + Tb = FMA(KP414213562, Ta, T9); + T3R = FMS(KP414213562, T9, Ta); + } + { + E T5, Tc, T6x, T6y; + T5 = FNMS(KP707106781, T4, T1); + Tc = T8 - Tb; + Td = FNMS(KP923879532, Tc, T5); + T33 = FMA(KP923879532, Tc, T5); + T6x = FNMS(KP707106781, T62, T61); + T6y = T3R - T3Q; + T6z = FMA(KP923879532, T6y, T6x); + T6N = FNMS(KP923879532, T6y, T6x); + } + { + E T3P, T3S, T63, T64; + T3P = FMA(KP707106781, T4, T1); + T3S = T3Q + T3R; + T3T = FNMS(KP923879532, T3S, T3P); + T5f = FMA(KP923879532, T3S, T3P); + T63 = FMA(KP707106781, T62, T61); + T64 = T8 + Tb; + T65 = FMA(KP923879532, T64, T63); + T6j = FNMS(KP923879532, T64, T63); + } + } + { + E T1Z, T2w, T22, T2x, T26, T2A, T29, T2z, T20, T21; + T1Z = R1[WS(rs, 31)]; + T2w = R1[WS(rs, 15)]; + T20 = R1[WS(rs, 7)]; + T21 = R1[WS(rs, 23)]; + T22 = T20 - T21; + T2x = T20 + T21; + { + E T24, T25, T27, T28; + T24 = R1[WS(rs, 19)]; + T25 = R1[WS(rs, 3)]; + T26 = FMA(KP414213562, T25, T24); + T2A = FNMS(KP414213562, T24, T25); + T27 = R1[WS(rs, 11)]; + T28 = R1[WS(rs, 27)]; + T29 = FMA(KP414213562, T28, T27); + T2z = FMS(KP414213562, T27, T28); + } + { + E T23, T2a, T4M, T4N; + T23 = FMA(KP707106781, T22, T1Z); + T2a = T26 - T29; + T2b = FMA(KP923879532, T2a, T23); + T3n = FNMS(KP923879532, T2a, T23); + T4M = FMA(KP707106781, T2x, T2w); + T4N = T26 + T29; + T4O = FNMS(KP923879532, T4N, T4M); + T5C = FMA(KP923879532, T4N, T4M); + } + { + E T2y, T2B, T4B, T4C; + T2y = FNMS(KP707106781, T2x, T2w); + T2B = T2z - T2A; + T2C = FNMS(KP923879532, T2B, T2y); + T3q = FMA(KP923879532, T2B, T2y); + T4B = FMS(KP707106781, T22, T1Z); + T4C = T2A + T2z; + T4D = FNMS(KP923879532, T4C, T4B); + T5z = FMA(KP923879532, T4C, T4B); + } + } + { + E Ty, TL, TB, TM, TF, TP, TI, TO, Tz, TA; + Ty = R0[WS(rs, 17)]; + TL = R0[WS(rs, 1)]; + Tz = R0[WS(rs, 9)]; + TA = R0[WS(rs, 25)]; + TB = Tz + TA; + TM = Tz - TA; + { + E TD, TE, TG, TH; + TD = R0[WS(rs, 29)]; + TE = R0[WS(rs, 13)]; + TF = FMS(KP414213562, TE, TD); + TP = FMA(KP414213562, TD, TE); + TG = R0[WS(rs, 5)]; + TH = R0[WS(rs, 21)]; + TI = FNMS(KP414213562, TH, TG); + TO = FMA(KP414213562, TG, TH); + } + { + E TC, TJ, T4c, T4d; + TC = FNMS(KP707106781, TB, Ty); + TJ = TF - TI; + TK = FNMS(KP923879532, TJ, TC); + T3b = FMA(KP923879532, TJ, TC); + T4c = FMA(KP707106781, TM, TL); + T4d = TI + TF; + T4e = FNMS(KP923879532, T4d, T4c); + T5l = FMA(KP923879532, T4d, T4c); + } + { + E TN, TQ, T49, T4a; + TN = FNMS(KP707106781, TM, TL); + TQ = TO - TP; + TR = FNMS(KP923879532, TQ, TN); + T3c = FMA(KP923879532, TQ, TN); + T49 = FMA(KP707106781, TB, Ty); + T4a = TO + TP; + T4b = FNMS(KP923879532, T4a, T49); + T5k = FMA(KP923879532, T4a, T49); + } + } + { + E TT, T16, TW, T17, T10, T1a, T13, T19, TU, TV; + TT = R0[WS(rs, 15)]; + T16 = R0[WS(rs, 31)]; + TU = R0[WS(rs, 7)]; + TV = R0[WS(rs, 23)]; + TW = TU + TV; + T17 = TV - TU; + { + E TY, TZ, T11, T12; + TY = R0[WS(rs, 3)]; + TZ = R0[WS(rs, 19)]; + T10 = FMS(KP414213562, TZ, TY); + T1a = FMA(KP414213562, TY, TZ); + T11 = R0[WS(rs, 27)]; + T12 = R0[WS(rs, 11)]; + T13 = FNMS(KP414213562, T12, T11); + T19 = FMA(KP414213562, T11, T12); + } + { + E TX, T14, T45, T46; + TX = FNMS(KP707106781, TW, TT); + T14 = T10 - T13; + T15 = FNMS(KP923879532, T14, TX); + T38 = FMA(KP923879532, T14, TX); + T45 = FMA(KP707106781, T17, T16); + T46 = T10 + T13; + T47 = FNMS(KP923879532, T46, T45); + T5o = FMA(KP923879532, T46, T45); + } + { + E T18, T1b, T42, T43; + T18 = FNMS(KP707106781, T17, T16); + T1b = T19 - T1a; + T1c = FNMS(KP923879532, T1b, T18); + T39 = FMA(KP923879532, T1b, T18); + T42 = FMA(KP707106781, TW, TT); + T43 = T1a + T19; + T44 = FNMS(KP923879532, T43, T42); + T5n = FMA(KP923879532, T43, T42); + } + } + { + E T1g, T1N, T1j, T1O, T1n, T1R, T1q, T1Q, T1h, T1i; + T1g = R1[0]; + T1N = R1[WS(rs, 16)]; + T1h = R1[WS(rs, 8)]; + T1i = R1[WS(rs, 24)]; + T1j = T1h - T1i; + T1O = T1h + T1i; + { + E T1l, T1m, T1o, T1p; + T1l = R1[WS(rs, 20)]; + T1m = R1[WS(rs, 4)]; + T1n = FMA(KP414213562, T1m, T1l); + T1R = FNMS(KP414213562, T1l, T1m); + T1o = R1[WS(rs, 12)]; + T1p = R1[WS(rs, 28)]; + T1q = FMA(KP414213562, T1p, T1o); + T1Q = FMS(KP414213562, T1o, T1p); + } + { + E T1k, T1r, T4t, T4u; + T1k = FNMS(KP707106781, T1j, T1g); + T1r = T1n - T1q; + T1s = FNMS(KP923879532, T1r, T1k); + T3g = FMA(KP923879532, T1r, T1k); + T4t = FMA(KP707106781, T1O, T1N); + T4u = T1n + T1q; + T4v = FNMS(KP923879532, T4u, T4t); + T5v = FMA(KP923879532, T4u, T4t); + } + { + E T1P, T1S, T4i, T4j; + T1P = FNMS(KP707106781, T1O, T1N); + T1S = T1Q - T1R; + T1T = FNMS(KP923879532, T1S, T1P); + T3j = FMA(KP923879532, T1S, T1P); + T4i = FMA(KP707106781, T1j, T1g); + T4j = T1R + T1Q; + T4k = FNMS(KP923879532, T4j, T4i); + T5s = FMA(KP923879532, T4j, T4i); + } + } + { + E T2g, T4I, T2j, T4H, T2p, T4F, T2s, T4E; + { + E T2c, T2h, T2f, T2i, T2d, T2e; + T2c = R1[WS(rs, 13)]; + T2h = R1[WS(rs, 29)]; + T2d = R1[WS(rs, 5)]; + T2e = R1[WS(rs, 21)]; + T2f = T2d + T2e; + T2i = T2d - T2e; + T2g = FNMS(KP707106781, T2f, T2c); + T4I = FMS(KP707106781, T2i, T2h); + T2j = FMA(KP707106781, T2i, T2h); + T4H = FMA(KP707106781, T2f, T2c); + } + { + E T2l, T2q, T2o, T2r, T2m, T2n; + T2l = R1[WS(rs, 17)]; + T2q = R1[WS(rs, 1)]; + T2m = R1[WS(rs, 9)]; + T2n = R1[WS(rs, 25)]; + T2o = T2m + T2n; + T2r = T2m - T2n; + T2p = FNMS(KP707106781, T2o, T2l); + T4F = FMA(KP707106781, T2r, T2q); + T2s = FNMS(KP707106781, T2r, T2q); + T4E = FMA(KP707106781, T2o, T2l); + } + { + E T2k, T2t, T4P, T4Q; + T2k = FNMS(KP668178637, T2j, T2g); + T2t = FNMS(KP668178637, T2s, T2p); + T2u = T2k - T2t; + T3r = T2t + T2k; + T4P = FMA(KP198912367, T4H, T4I); + T4Q = FNMS(KP198912367, T4E, T4F); + T4R = T4P - T4Q; + T5A = T4Q + T4P; + } + { + E T2D, T2E, T4G, T4J; + T2D = FMA(KP668178637, T2p, T2s); + T2E = FMA(KP668178637, T2g, T2j); + T2F = T2D + T2E; + T3o = T2D - T2E; + T4G = FMA(KP198912367, T4F, T4E); + T4J = FNMS(KP198912367, T4I, T4H); + T4K = T4G - T4J; + T5D = T4G + T4J; + } + } + { + E T1x, T4p, T1A, T4o, T1G, T4m, T1J, T4l; + { + E T1t, T1y, T1w, T1z, T1u, T1v; + T1t = R1[WS(rs, 14)]; + T1y = R1[WS(rs, 30)]; + T1u = R1[WS(rs, 6)]; + T1v = R1[WS(rs, 22)]; + T1w = T1u + T1v; + T1z = T1u - T1v; + T1x = FNMS(KP707106781, T1w, T1t); + T4p = FMS(KP707106781, T1z, T1y); + T1A = FMA(KP707106781, T1z, T1y); + T4o = FMA(KP707106781, T1w, T1t); + } + { + E T1C, T1H, T1F, T1I, T1D, T1E; + T1C = R1[WS(rs, 18)]; + T1H = R1[WS(rs, 2)]; + T1D = R1[WS(rs, 10)]; + T1E = R1[WS(rs, 26)]; + T1F = T1D + T1E; + T1I = T1D - T1E; + T1G = FNMS(KP707106781, T1F, T1C); + T4m = FMA(KP707106781, T1I, T1H); + T1J = FNMS(KP707106781, T1I, T1H); + T4l = FMA(KP707106781, T1F, T1C); + } + { + E T1B, T1K, T4w, T4x; + T1B = FNMS(KP668178637, T1A, T1x); + T1K = FNMS(KP668178637, T1J, T1G); + T1L = T1B - T1K; + T3k = T1K + T1B; + T4w = FMA(KP198912367, T4o, T4p); + T4x = FNMS(KP198912367, T4l, T4m); + T4y = T4w - T4x; + T5t = T4x + T4w; + } + { + E T1U, T1V, T4n, T4q; + T1U = FMA(KP668178637, T1G, T1J); + T1V = FMA(KP668178637, T1x, T1A); + T1W = T1U + T1V; + T3h = T1U - T1V; + T4n = FMA(KP198912367, T4m, T4l); + T4q = FNMS(KP198912367, T4p, T4o); + T4r = T4n - T4q; + T5w = T4n + T4q; + } + } + { + E Tx, T2N, T6P, T6V, T1e, T6Q, T2X, T31, T1Y, T2L, T2Q, T6W, T2U, T30, T2H; + E T2K, Tw, T6O; + Tw = Tm - Tv; + Tx = FNMS(KP831469612, Tw, Td); + T2N = FMA(KP831469612, Tw, Td); + T6O = T34 + T35; + T6P = FMA(KP831469612, T6O, T6N); + T6V = FNMS(KP831469612, T6O, T6N); + { + E TS, T1d, T2V, T2W; + TS = FMA(KP534511135, TR, TK); + T1d = FMA(KP534511135, T1c, T15); + T1e = TS - T1d; + T6Q = TS + T1d; + T2V = FNMS(KP831469612, T2u, T2b); + T2W = FMA(KP831469612, T2F, T2C); + T2X = FNMS(KP250486960, T2W, T2V); + T31 = FMA(KP250486960, T2V, T2W); + } + { + E T1M, T1X, T2O, T2P; + T1M = FNMS(KP831469612, T1L, T1s); + T1X = FNMS(KP831469612, T1W, T1T); + T1Y = FMA(KP599376933, T1X, T1M); + T2L = FNMS(KP599376933, T1M, T1X); + T2O = FNMS(KP534511135, TK, TR); + T2P = FNMS(KP534511135, T15, T1c); + T2Q = T2O - T2P; + T6W = T2O + T2P; + } + { + E T2S, T2T, T2v, T2G; + T2S = FMA(KP831469612, T1L, T1s); + T2T = FMA(KP831469612, T1W, T1T); + T2U = FNMS(KP250486960, T2T, T2S); + T30 = FMA(KP250486960, T2S, T2T); + T2v = FMA(KP831469612, T2u, T2b); + T2G = FNMS(KP831469612, T2F, T2C); + T2H = FMA(KP599376933, T2G, T2v); + T2K = FNMS(KP599376933, T2v, T2G); + } + { + E T1f, T2I, T6X, T6Y; + T1f = FMA(KP881921264, T1e, Tx); + T2I = T1Y - T2H; + Cr[WS(csr, 26)] = FNMS(KP857728610, T2I, T1f); + Cr[WS(csr, 5)] = FMA(KP857728610, T2I, T1f); + T6X = FNMS(KP881921264, T6W, T6V); + T6Y = T2L + T2K; + Ci[WS(csi, 26)] = FMS(KP857728610, T6Y, T6X); + Ci[WS(csi, 5)] = FMA(KP857728610, T6Y, T6X); + } + { + E T2J, T2M, T6Z, T70; + T2J = FNMS(KP881921264, T1e, Tx); + T2M = T2K - T2L; + Cr[WS(csr, 21)] = FNMS(KP857728610, T2M, T2J); + Cr[WS(csr, 10)] = FMA(KP857728610, T2M, T2J); + T6Z = FMA(KP881921264, T6W, T6V); + T70 = T1Y + T2H; + Ci[WS(csi, 10)] = -(FMA(KP857728610, T70, T6Z)); + Ci[WS(csi, 21)] = FNMS(KP857728610, T70, T6Z); + } + { + E T2R, T2Y, T6R, T6S; + T2R = FMA(KP881921264, T2Q, T2N); + T2Y = T2U - T2X; + Cr[WS(csr, 29)] = FNMS(KP970031253, T2Y, T2R); + Cr[WS(csr, 2)] = FMA(KP970031253, T2Y, T2R); + T6R = FMA(KP881921264, T6Q, T6P); + T6S = T30 + T31; + Ci[WS(csi, 2)] = -(FMA(KP970031253, T6S, T6R)); + Ci[WS(csi, 29)] = FNMS(KP970031253, T6S, T6R); + } + { + E T2Z, T32, T6T, T6U; + T2Z = FNMS(KP881921264, T2Q, T2N); + T32 = T30 - T31; + Cr[WS(csr, 18)] = FNMS(KP970031253, T32, T2Z); + Cr[WS(csr, 13)] = FMA(KP970031253, T32, T2Z); + T6T = FNMS(KP881921264, T6Q, T6P); + T6U = T2U + T2X; + Ci[WS(csi, 18)] = -(FMA(KP970031253, T6U, T6T)); + Ci[WS(csi, 13)] = FNMS(KP970031253, T6U, T6T); + } + } + { + E T5j, T5L, T67, T6d, T5q, T68, T5V, T5Z, T5y, T5J, T5O, T6e, T5S, T5Y, T5F; + E T5I, T5i, T66; + T5i = T5g - T5h; + T5j = FNMS(KP980785280, T5i, T5f); + T5L = FMA(KP980785280, T5i, T5f); + T66 = T3W + T3Z; + T67 = FMA(KP980785280, T66, T65); + T6d = FNMS(KP980785280, T66, T65); + { + E T5m, T5p, T5T, T5U; + T5m = FMA(KP098491403, T5l, T5k); + T5p = FMA(KP098491403, T5o, T5n); + T5q = T5m - T5p; + T68 = T5m + T5p; + T5T = FMA(KP980785280, T5A, T5z); + T5U = FMA(KP980785280, T5D, T5C); + T5V = FMA(KP049126849, T5U, T5T); + T5Z = FNMS(KP049126849, T5T, T5U); + } + { + E T5u, T5x, T5M, T5N; + T5u = FNMS(KP980785280, T5t, T5s); + T5x = FNMS(KP980785280, T5w, T5v); + T5y = FMA(KP906347169, T5x, T5u); + T5J = FNMS(KP906347169, T5u, T5x); + T5M = FNMS(KP098491403, T5k, T5l); + T5N = FNMS(KP098491403, T5n, T5o); + T5O = T5M - T5N; + T6e = T5M + T5N; + } + { + E T5Q, T5R, T5B, T5E; + T5Q = FMA(KP980785280, T5t, T5s); + T5R = FMA(KP980785280, T5w, T5v); + T5S = FNMS(KP049126849, T5R, T5Q); + T5Y = FMA(KP049126849, T5Q, T5R); + T5B = FNMS(KP980785280, T5A, T5z); + T5E = FNMS(KP980785280, T5D, T5C); + T5F = FNMS(KP906347169, T5E, T5B); + T5I = FMA(KP906347169, T5B, T5E); + } + { + E T5r, T5G, T6f, T6g; + T5r = FMA(KP995184726, T5q, T5j); + T5G = T5y + T5F; + Cr[WS(csr, 24)] = FNMS(KP740951125, T5G, T5r); + Cr[WS(csr, 7)] = FMA(KP740951125, T5G, T5r); + T6f = FNMS(KP995184726, T6e, T6d); + T6g = T5J + T5I; + Ci[WS(csi, 24)] = FMS(KP740951125, T6g, T6f); + Ci[WS(csi, 7)] = FMA(KP740951125, T6g, T6f); + } + { + E T5H, T5K, T6h, T6i; + T5H = FNMS(KP995184726, T5q, T5j); + T5K = T5I - T5J; + Cr[WS(csr, 23)] = FNMS(KP740951125, T5K, T5H); + Cr[WS(csr, 8)] = FMA(KP740951125, T5K, T5H); + T6h = FMA(KP995184726, T6e, T6d); + T6i = T5F - T5y; + Ci[WS(csi, 8)] = FMS(KP740951125, T6i, T6h); + Ci[WS(csi, 23)] = FMA(KP740951125, T6i, T6h); + } + { + E T5P, T5W, T69, T6a; + T5P = FMA(KP995184726, T5O, T5L); + T5W = T5S + T5V; + Cr[WS(csr, 31)] = FNMS(KP998795456, T5W, T5P); + Cr[0] = FMA(KP998795456, T5W, T5P); + T69 = FMA(KP995184726, T68, T67); + T6a = T5Y + T5Z; + Ci[0] = -(FMA(KP998795456, T6a, T69)); + Ci[WS(csi, 31)] = FNMS(KP998795456, T6a, T69); + } + { + E T5X, T60, T6b, T6c; + T5X = FNMS(KP995184726, T5O, T5L); + T60 = T5Y - T5Z; + Cr[WS(csr, 16)] = FNMS(KP998795456, T60, T5X); + Cr[WS(csr, 15)] = FMA(KP998795456, T60, T5X); + T6b = FNMS(KP995184726, T68, T67); + T6c = T5V - T5S; + Ci[WS(csi, 16)] = FMS(KP998795456, T6c, T6b); + Ci[WS(csi, 15)] = FMA(KP998795456, T6c, T6b); + } + } + { + E T37, T3z, T6B, T6H, T3e, T6C, T3J, T3M, T3m, T3w, T3C, T6I, T3G, T3N, T3t; + E T3x, T36, T6A; + T36 = T34 - T35; + T37 = FNMS(KP831469612, T36, T33); + T3z = FMA(KP831469612, T36, T33); + T6A = Tv + Tm; + T6B = FMA(KP831469612, T6A, T6z); + T6H = FNMS(KP831469612, T6A, T6z); + { + E T3a, T3d, T3H, T3I; + T3a = FNMS(KP303346683, T39, T38); + T3d = FNMS(KP303346683, T3c, T3b); + T3e = T3a - T3d; + T6C = T3d + T3a; + T3H = FNMS(KP831469612, T3o, T3n); + T3I = FMA(KP831469612, T3r, T3q); + T3J = FMA(KP148335987, T3I, T3H); + T3M = FNMS(KP148335987, T3H, T3I); + } + { + E T3i, T3l, T3A, T3B; + T3i = FNMS(KP831469612, T3h, T3g); + T3l = FNMS(KP831469612, T3k, T3j); + T3m = FNMS(KP741650546, T3l, T3i); + T3w = FMA(KP741650546, T3i, T3l); + T3A = FMA(KP303346683, T3b, T3c); + T3B = FMA(KP303346683, T38, T39); + T3C = T3A - T3B; + T6I = T3A + T3B; + } + { + E T3E, T3F, T3p, T3s; + T3E = FMA(KP831469612, T3h, T3g); + T3F = FMA(KP831469612, T3k, T3j); + T3G = FMA(KP148335987, T3F, T3E); + T3N = FNMS(KP148335987, T3E, T3F); + T3p = FMA(KP831469612, T3o, T3n); + T3s = FNMS(KP831469612, T3r, T3q); + T3t = FNMS(KP741650546, T3s, T3p); + T3x = FMA(KP741650546, T3p, T3s); + } + { + E T3f, T3u, T6J, T6K; + T3f = FMA(KP956940335, T3e, T37); + T3u = T3m - T3t; + Cr[WS(csr, 25)] = FNMS(KP803207531, T3u, T3f); + Cr[WS(csr, 6)] = FMA(KP803207531, T3u, T3f); + T6J = FMA(KP956940335, T6I, T6H); + T6K = T3w + T3x; + Ci[WS(csi, 6)] = -(FMA(KP803207531, T6K, T6J)); + Ci[WS(csi, 25)] = FNMS(KP803207531, T6K, T6J); + } + { + E T3v, T3y, T6L, T6M; + T3v = FNMS(KP956940335, T3e, T37); + T3y = T3w - T3x; + Cr[WS(csr, 22)] = FNMS(KP803207531, T3y, T3v); + Cr[WS(csr, 9)] = FMA(KP803207531, T3y, T3v); + T6L = FNMS(KP956940335, T6I, T6H); + T6M = T3m + T3t; + Ci[WS(csi, 22)] = -(FMA(KP803207531, T6M, T6L)); + Ci[WS(csi, 9)] = FNMS(KP803207531, T6M, T6L); + } + { + E T3D, T3K, T6D, T6E; + T3D = FMA(KP956940335, T3C, T3z); + T3K = T3G - T3J; + Cr[WS(csr, 30)] = FNMS(KP989176509, T3K, T3D); + Cr[WS(csr, 1)] = FMA(KP989176509, T3K, T3D); + T6D = FMA(KP956940335, T6C, T6B); + T6E = T3N + T3M; + Ci[WS(csi, 30)] = FMS(KP989176509, T6E, T6D); + Ci[WS(csi, 1)] = FMA(KP989176509, T6E, T6D); + } + { + E T3L, T3O, T6F, T6G; + T3L = FNMS(KP956940335, T3C, T3z); + T3O = T3M - T3N; + Cr[WS(csr, 17)] = FNMS(KP989176509, T3O, T3L); + Cr[WS(csr, 14)] = FMA(KP989176509, T3O, T3L); + T6F = FNMS(KP956940335, T6C, T6B); + T6G = T3G + T3J; + Ci[WS(csi, 14)] = -(FMA(KP989176509, T6G, T6F)); + Ci[WS(csi, 17)] = FNMS(KP989176509, T6G, T6F); + } + } + { + E T41, T4Z, T6l, T6r, T4g, T6m, T59, T5c, T4A, T4W, T52, T6s, T56, T5d, T4T; + E T4X, T40, T6k; + T40 = T3W - T3Z; + T41 = FNMS(KP980785280, T40, T3T); + T4Z = FMA(KP980785280, T40, T3T); + T6k = T5g + T5h; + T6l = FNMS(KP980785280, T6k, T6j); + T6r = FMA(KP980785280, T6k, T6j); + { + E T48, T4f, T57, T58; + T48 = FNMS(KP820678790, T47, T44); + T4f = FNMS(KP820678790, T4e, T4b); + T4g = T48 - T4f; + T6m = T4f + T48; + T57 = FMA(KP980785280, T4K, T4D); + T58 = FMA(KP980785280, T4R, T4O); + T59 = FNMS(KP357805721, T58, T57); + T5c = FMA(KP357805721, T57, T58); + } + { + E T4s, T4z, T50, T51; + T4s = FNMS(KP980785280, T4r, T4k); + T4z = FNMS(KP980785280, T4y, T4v); + T4A = FNMS(KP472964775, T4z, T4s); + T4W = FMA(KP472964775, T4s, T4z); + T50 = FMA(KP820678790, T4b, T4e); + T51 = FMA(KP820678790, T44, T47); + T52 = T50 - T51; + T6s = T50 + T51; + } + { + E T54, T55, T4L, T4S; + T54 = FMA(KP980785280, T4r, T4k); + T55 = FMA(KP980785280, T4y, T4v); + T56 = FMA(KP357805721, T55, T54); + T5d = FNMS(KP357805721, T54, T55); + T4L = FNMS(KP980785280, T4K, T4D); + T4S = FNMS(KP980785280, T4R, T4O); + T4T = FMA(KP472964775, T4S, T4L); + T4X = FNMS(KP472964775, T4L, T4S); + } + { + E T4h, T4U, T6t, T6u; + T4h = FMA(KP773010453, T4g, T41); + T4U = T4A + T4T; + Cr[WS(csr, 27)] = FNMS(KP903989293, T4U, T4h); + Cr[WS(csr, 4)] = FMA(KP903989293, T4U, T4h); + T6t = FMA(KP773010453, T6s, T6r); + T6u = T4W + T4X; + Ci[WS(csi, 4)] = -(FMA(KP903989293, T6u, T6t)); + Ci[WS(csi, 27)] = FNMS(KP903989293, T6u, T6t); + } + { + E T4V, T4Y, T6v, T6w; + T4V = FNMS(KP773010453, T4g, T41); + T4Y = T4W - T4X; + Cr[WS(csr, 20)] = FNMS(KP903989293, T4Y, T4V); + Cr[WS(csr, 11)] = FMA(KP903989293, T4Y, T4V); + T6v = FNMS(KP773010453, T6s, T6r); + T6w = T4T - T4A; + Ci[WS(csi, 20)] = FMS(KP903989293, T6w, T6v); + Ci[WS(csi, 11)] = FMA(KP903989293, T6w, T6v); + } + { + E T53, T5a, T6n, T6o; + T53 = FMA(KP773010453, T52, T4Z); + T5a = T56 + T59; + Cr[WS(csr, 28)] = FNMS(KP941544065, T5a, T53); + Cr[WS(csr, 3)] = FMA(KP941544065, T5a, T53); + T6n = FMA(KP773010453, T6m, T6l); + T6o = T5d + T5c; + Ci[WS(csi, 28)] = FMS(KP941544065, T6o, T6n); + Ci[WS(csi, 3)] = FMA(KP941544065, T6o, T6n); + } + { + E T5b, T5e, T6p, T6q; + T5b = FNMS(KP773010453, T52, T4Z); + T5e = T5c - T5d; + Cr[WS(csr, 19)] = FNMS(KP941544065, T5e, T5b); + Cr[WS(csr, 12)] = FMA(KP941544065, T5e, T5b); + T6p = FNMS(KP773010453, T6m, T6l); + T6q = T59 - T56; + Ci[WS(csi, 12)] = FMS(KP941544065, T6q, T6p); + Ci[WS(csi, 19)] = FMA(KP941544065, T6q, T6p); + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cfII_64", {114, 0, 320, 0}, &GENUS }; + +void X(codelet_r2cfII_64) (planner *p) { + X(kr2c_register) (p, r2cfII_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 64 -name r2cfII_64 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 434 FP additions, 206 FP multiplications, + * (or, 342 additions, 114 multiplications, 92 fused multiply/add), + * 118 stack variables, 31 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP242980179, +0.242980179903263889948274162077471118320990783); + DK(KP970031253, +0.970031253194543992603984207286100251456865962); + DK(KP857728610, +0.857728610000272069902269984284770137042490799); + DK(KP514102744, +0.514102744193221726593693838968815772608049120); + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP427555093, +0.427555093430282094320966856888798534304578629); + DK(KP903989293, +0.903989293123443331586200297230537048710132025); + DK(KP336889853, +0.336889853392220050689253212619147570477766780); + DK(KP941544065, +0.941544065183020778412509402599502357185589796); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP595699304, +0.595699304492433343467036528829969889511926338); + DK(KP803207531, +0.803207531480644909806676512963141923879569427); + DK(KP146730474, +0.146730474455361751658850129646717819706215317); + DK(KP989176509, +0.989176509964780973451673738016243063983689533); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP049067674, +0.049067674327418014254954976942682658314745363); + DK(KP998795456, +0.998795456205172392714771604759100694443203615); + DK(KP671558954, +0.671558954847018400625376850427421803228750632); + DK(KP740951125, +0.740951125354959091175616897495162729728955309); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E Tm, T34, T3Z, T5g, Tv, T35, T3W, T5h, Td, T33, T6B, T6Q, T3T, T5f, T68; + E T6m, T2b, T3n, T4O, T5D, T2F, T3r, T4K, T5z, TK, T3c, T47, T5n, TR, T3b; + E T44, T5o, T15, T38, T4e, T5l, T1c, T39, T4b, T5k, T1s, T3g, T4v, T5w, T1W; + E T3k, T4k, T5s, T2u, T3q, T4R, T5A, T2y, T3o, T4H, T5C, T1L, T3j, T4y, T5t; + E T1P, T3h, T4r, T5v; + { + E Te, Tk, Th, Tj, Tf, Tg; + Te = R0[WS(rs, 2)]; + Tk = R0[WS(rs, 18)]; + Tf = R0[WS(rs, 10)]; + Tg = R0[WS(rs, 26)]; + Th = KP707106781 * (Tf - Tg); + Tj = KP707106781 * (Tf + Tg); + { + E Ti, Tl, T3X, T3Y; + Ti = Te + Th; + Tl = Tj + Tk; + Tm = FNMS(KP195090322, Tl, KP980785280 * Ti); + T34 = FMA(KP195090322, Ti, KP980785280 * Tl); + T3X = Tk - Tj; + T3Y = Te - Th; + T3Z = FNMS(KP555570233, T3Y, KP831469612 * T3X); + T5g = FMA(KP831469612, T3Y, KP555570233 * T3X); + } + } + { + E Tq, Tt, Tp, Ts, Tn, To; + Tq = R0[WS(rs, 30)]; + Tt = R0[WS(rs, 14)]; + Tn = R0[WS(rs, 6)]; + To = R0[WS(rs, 22)]; + Tp = KP707106781 * (Tn - To); + Ts = KP707106781 * (Tn + To); + { + E Tr, Tu, T3U, T3V; + Tr = Tp - Tq; + Tu = Ts + Tt; + Tv = FMA(KP980785280, Tr, KP195090322 * Tu); + T35 = FNMS(KP980785280, Tu, KP195090322 * Tr); + T3U = Tt - Ts; + T3V = Tp + Tq; + T3W = FNMS(KP555570233, T3V, KP831469612 * T3U); + T5h = FMA(KP831469612, T3V, KP555570233 * T3U); + } + } + { + E T1, T66, T4, T65, T8, T3Q, Tb, T3R, T2, T3; + T1 = R0[0]; + T66 = R0[WS(rs, 16)]; + T2 = R0[WS(rs, 8)]; + T3 = R0[WS(rs, 24)]; + T4 = KP707106781 * (T2 - T3); + T65 = KP707106781 * (T2 + T3); + { + E T6, T7, T9, Ta; + T6 = R0[WS(rs, 4)]; + T7 = R0[WS(rs, 20)]; + T8 = FNMS(KP382683432, T7, KP923879532 * T6); + T3Q = FMA(KP382683432, T6, KP923879532 * T7); + T9 = R0[WS(rs, 12)]; + Ta = R0[WS(rs, 28)]; + Tb = FNMS(KP923879532, Ta, KP382683432 * T9); + T3R = FMA(KP923879532, T9, KP382683432 * Ta); + } + { + E T5, Tc, T6z, T6A; + T5 = T1 + T4; + Tc = T8 + Tb; + Td = T5 + Tc; + T33 = T5 - Tc; + T6z = Tb - T8; + T6A = T66 - T65; + T6B = T6z - T6A; + T6Q = T6z + T6A; + } + { + E T3P, T3S, T64, T67; + T3P = T1 - T4; + T3S = T3Q - T3R; + T3T = T3P - T3S; + T5f = T3P + T3S; + T64 = T3Q + T3R; + T67 = T65 + T66; + T68 = T64 + T67; + T6m = T67 - T64; + } + } + { + E T22, T2D, T21, T2C, T26, T2z, T29, T2A, T1Z, T20; + T22 = R1[WS(rs, 31)]; + T2D = R1[WS(rs, 15)]; + T1Z = R1[WS(rs, 7)]; + T20 = R1[WS(rs, 23)]; + T21 = KP707106781 * (T1Z - T20); + T2C = KP707106781 * (T1Z + T20); + { + E T24, T25, T27, T28; + T24 = R1[WS(rs, 3)]; + T25 = R1[WS(rs, 19)]; + T26 = FNMS(KP382683432, T25, KP923879532 * T24); + T2z = FMA(KP382683432, T24, KP923879532 * T25); + T27 = R1[WS(rs, 11)]; + T28 = R1[WS(rs, 27)]; + T29 = FNMS(KP923879532, T28, KP382683432 * T27); + T2A = FMA(KP923879532, T27, KP382683432 * T28); + } + { + E T23, T2a, T4M, T4N; + T23 = T21 - T22; + T2a = T26 + T29; + T2b = T23 + T2a; + T3n = T23 - T2a; + T4M = T29 - T26; + T4N = T2D - T2C; + T4O = T4M - T4N; + T5D = T4M + T4N; + } + { + E T2B, T2E, T4I, T4J; + T2B = T2z + T2A; + T2E = T2C + T2D; + T2F = T2B + T2E; + T3r = T2E - T2B; + T4I = T21 + T22; + T4J = T2z - T2A; + T4K = T4I + T4J; + T5z = T4J - T4I; + } + } + { + E Ty, TP, TB, TO, TF, TL, TI, TM, Tz, TA; + Ty = R0[WS(rs, 1)]; + TP = R0[WS(rs, 17)]; + Tz = R0[WS(rs, 9)]; + TA = R0[WS(rs, 25)]; + TB = KP707106781 * (Tz - TA); + TO = KP707106781 * (Tz + TA); + { + E TD, TE, TG, TH; + TD = R0[WS(rs, 5)]; + TE = R0[WS(rs, 21)]; + TF = FNMS(KP382683432, TE, KP923879532 * TD); + TL = FMA(KP382683432, TD, KP923879532 * TE); + TG = R0[WS(rs, 13)]; + TH = R0[WS(rs, 29)]; + TI = FNMS(KP923879532, TH, KP382683432 * TG); + TM = FMA(KP923879532, TG, KP382683432 * TH); + } + { + E TC, TJ, T45, T46; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T3c = TC - TJ; + T45 = TI - TF; + T46 = TP - TO; + T47 = T45 - T46; + T5n = T45 + T46; + } + { + E TN, TQ, T42, T43; + TN = TL + TM; + TQ = TO + TP; + TR = TN + TQ; + T3b = TQ - TN; + T42 = Ty - TB; + T43 = TL - TM; + T44 = T42 - T43; + T5o = T42 + T43; + } + } + { + E TW, T1a, TV, T19, T10, T16, T13, T17, TT, TU; + TW = R0[WS(rs, 31)]; + T1a = R0[WS(rs, 15)]; + TT = R0[WS(rs, 7)]; + TU = R0[WS(rs, 23)]; + TV = KP707106781 * (TT - TU); + T19 = KP707106781 * (TT + TU); + { + E TY, TZ, T11, T12; + TY = R0[WS(rs, 3)]; + TZ = R0[WS(rs, 19)]; + T10 = FNMS(KP382683432, TZ, KP923879532 * TY); + T16 = FMA(KP382683432, TY, KP923879532 * TZ); + T11 = R0[WS(rs, 11)]; + T12 = R0[WS(rs, 27)]; + T13 = FNMS(KP923879532, T12, KP382683432 * T11); + T17 = FMA(KP923879532, T11, KP382683432 * T12); + } + { + E TX, T14, T4c, T4d; + TX = TV - TW; + T14 = T10 + T13; + T15 = TX + T14; + T38 = TX - T14; + T4c = T13 - T10; + T4d = T1a - T19; + T4e = T4c - T4d; + T5l = T4c + T4d; + } + { + E T18, T1b, T49, T4a; + T18 = T16 + T17; + T1b = T19 + T1a; + T1c = T18 + T1b; + T39 = T1b - T18; + T49 = TV + TW; + T4a = T16 - T17; + T4b = T49 + T4a; + T5k = T4a - T49; + } + } + { + E T1g, T1U, T1j, T1T, T1n, T1Q, T1q, T1R, T1h, T1i; + T1g = R1[0]; + T1U = R1[WS(rs, 16)]; + T1h = R1[WS(rs, 8)]; + T1i = R1[WS(rs, 24)]; + T1j = KP707106781 * (T1h - T1i); + T1T = KP707106781 * (T1h + T1i); + { + E T1l, T1m, T1o, T1p; + T1l = R1[WS(rs, 4)]; + T1m = R1[WS(rs, 20)]; + T1n = FNMS(KP382683432, T1m, KP923879532 * T1l); + T1Q = FMA(KP382683432, T1l, KP923879532 * T1m); + T1o = R1[WS(rs, 12)]; + T1p = R1[WS(rs, 28)]; + T1q = FNMS(KP923879532, T1p, KP382683432 * T1o); + T1R = FMA(KP923879532, T1o, KP382683432 * T1p); + } + { + E T1k, T1r, T4t, T4u; + T1k = T1g + T1j; + T1r = T1n + T1q; + T1s = T1k + T1r; + T3g = T1k - T1r; + T4t = T1q - T1n; + T4u = T1U - T1T; + T4v = T4t - T4u; + T5w = T4t + T4u; + } + { + E T1S, T1V, T4i, T4j; + T1S = T1Q + T1R; + T1V = T1T + T1U; + T1W = T1S + T1V; + T3k = T1V - T1S; + T4i = T1g - T1j; + T4j = T1Q - T1R; + T4k = T4i - T4j; + T5s = T4i + T4j; + } + } + { + E T2g, T4F, T2j, T4E, T2p, T4C, T2s, T4B; + { + E T2c, T2i, T2f, T2h, T2d, T2e; + T2c = R1[WS(rs, 1)]; + T2i = R1[WS(rs, 17)]; + T2d = R1[WS(rs, 9)]; + T2e = R1[WS(rs, 25)]; + T2f = KP707106781 * (T2d - T2e); + T2h = KP707106781 * (T2d + T2e); + T2g = T2c + T2f; + T4F = T2c - T2f; + T2j = T2h + T2i; + T4E = T2i - T2h; + } + { + E T2o, T2r, T2n, T2q, T2l, T2m; + T2o = R1[WS(rs, 29)]; + T2r = R1[WS(rs, 13)]; + T2l = R1[WS(rs, 5)]; + T2m = R1[WS(rs, 21)]; + T2n = KP707106781 * (T2l - T2m); + T2q = KP707106781 * (T2l + T2m); + T2p = T2n - T2o; + T4C = T2n + T2o; + T2s = T2q + T2r; + T4B = T2r - T2q; + } + { + E T2k, T2t, T4P, T4Q; + T2k = FNMS(KP195090322, T2j, KP980785280 * T2g); + T2t = FMA(KP980785280, T2p, KP195090322 * T2s); + T2u = T2k + T2t; + T3q = T2t - T2k; + T4P = FMA(KP831469612, T4F, KP555570233 * T4E); + T4Q = FMA(KP831469612, T4C, KP555570233 * T4B); + T4R = T4P + T4Q; + T5A = T4P - T4Q; + } + { + E T2w, T2x, T4D, T4G; + T2w = FNMS(KP980785280, T2s, KP195090322 * T2p); + T2x = FMA(KP195090322, T2g, KP980785280 * T2j); + T2y = T2w - T2x; + T3o = T2x + T2w; + T4D = FNMS(KP555570233, T4C, KP831469612 * T4B); + T4G = FNMS(KP555570233, T4F, KP831469612 * T4E); + T4H = T4D - T4G; + T5C = T4G + T4D; + } + } + { + E T1x, T4p, T1A, T4o, T1G, T4m, T1J, T4l; + { + E T1t, T1z, T1w, T1y, T1u, T1v; + T1t = R1[WS(rs, 2)]; + T1z = R1[WS(rs, 18)]; + T1u = R1[WS(rs, 10)]; + T1v = R1[WS(rs, 26)]; + T1w = KP707106781 * (T1u - T1v); + T1y = KP707106781 * (T1u + T1v); + T1x = T1t + T1w; + T4p = T1t - T1w; + T1A = T1y + T1z; + T4o = T1z - T1y; + } + { + E T1F, T1I, T1E, T1H, T1C, T1D; + T1F = R1[WS(rs, 30)]; + T1I = R1[WS(rs, 14)]; + T1C = R1[WS(rs, 6)]; + T1D = R1[WS(rs, 22)]; + T1E = KP707106781 * (T1C - T1D); + T1H = KP707106781 * (T1C + T1D); + T1G = T1E - T1F; + T4m = T1E + T1F; + T1J = T1H + T1I; + T4l = T1I - T1H; + } + { + E T1B, T1K, T4w, T4x; + T1B = FNMS(KP195090322, T1A, KP980785280 * T1x); + T1K = FMA(KP980785280, T1G, KP195090322 * T1J); + T1L = T1B + T1K; + T3j = T1K - T1B; + T4w = FMA(KP831469612, T4p, KP555570233 * T4o); + T4x = FMA(KP831469612, T4m, KP555570233 * T4l); + T4y = T4w + T4x; + T5t = T4w - T4x; + } + { + E T1N, T1O, T4n, T4q; + T1N = FNMS(KP980785280, T1J, KP195090322 * T1G); + T1O = FMA(KP195090322, T1x, KP980785280 * T1A); + T1P = T1N - T1O; + T3h = T1O + T1N; + T4n = FNMS(KP555570233, T4m, KP831469612 * T4l); + T4q = FNMS(KP555570233, T4p, KP831469612 * T4o); + T4r = T4n - T4q; + T5v = T4q + T4n; + } + } + { + E Tx, T2N, T69, T6f, T1e, T6e, T2X, T30, T1Y, T2L, T2Q, T62, T2U, T31, T2H; + E T2K, Tw, T63; + Tw = Tm + Tv; + Tx = Td + Tw; + T2N = Td - Tw; + T63 = T35 - T34; + T69 = T63 - T68; + T6f = T63 + T68; + { + E TS, T1d, T2V, T2W; + TS = FNMS(KP098017140, TR, KP995184726 * TK); + T1d = FMA(KP995184726, T15, KP098017140 * T1c); + T1e = TS + T1d; + T6e = T1d - TS; + T2V = T2b - T2u; + T2W = T2y + T2F; + T2X = FNMS(KP671558954, T2W, KP740951125 * T2V); + T30 = FMA(KP671558954, T2V, KP740951125 * T2W); + } + { + E T1M, T1X, T2O, T2P; + T1M = T1s + T1L; + T1X = T1P - T1W; + T1Y = FMA(KP998795456, T1M, KP049067674 * T1X); + T2L = FNMS(KP049067674, T1M, KP998795456 * T1X); + T2O = FMA(KP098017140, TK, KP995184726 * TR); + T2P = FNMS(KP995184726, T1c, KP098017140 * T15); + T2Q = T2O + T2P; + T62 = T2P - T2O; + } + { + E T2S, T2T, T2v, T2G; + T2S = T1s - T1L; + T2T = T1P + T1W; + T2U = FMA(KP740951125, T2S, KP671558954 * T2T); + T31 = FNMS(KP671558954, T2S, KP740951125 * T2T); + T2v = T2b + T2u; + T2G = T2y - T2F; + T2H = FNMS(KP049067674, T2G, KP998795456 * T2v); + T2K = FMA(KP049067674, T2v, KP998795456 * T2G); + } + { + E T1f, T2I, T6b, T6c; + T1f = Tx + T1e; + T2I = T1Y + T2H; + Cr[WS(csr, 31)] = T1f - T2I; + Cr[0] = T1f + T2I; + T6b = T2L + T2K; + T6c = T62 + T69; + Ci[WS(csi, 31)] = T6b - T6c; + Ci[0] = T6b + T6c; + } + { + E T2J, T2M, T61, T6a; + T2J = Tx - T1e; + T2M = T2K - T2L; + Cr[WS(csr, 16)] = T2J - T2M; + Cr[WS(csr, 15)] = T2J + T2M; + T61 = T2H - T1Y; + T6a = T62 - T69; + Ci[WS(csi, 16)] = T61 - T6a; + Ci[WS(csi, 15)] = T61 + T6a; + } + { + E T2R, T2Y, T6h, T6i; + T2R = T2N + T2Q; + T2Y = T2U + T2X; + Cr[WS(csr, 24)] = T2R - T2Y; + Cr[WS(csr, 7)] = T2R + T2Y; + T6h = T31 + T30; + T6i = T6e + T6f; + Ci[WS(csi, 24)] = T6h - T6i; + Ci[WS(csi, 7)] = T6h + T6i; + } + { + E T2Z, T32, T6d, T6g; + T2Z = T2N - T2Q; + T32 = T30 - T31; + Cr[WS(csr, 23)] = T2Z - T32; + Cr[WS(csr, 8)] = T2Z + T32; + T6d = T2X - T2U; + T6g = T6e - T6f; + Ci[WS(csi, 23)] = T6d - T6g; + Ci[WS(csi, 8)] = T6d + T6g; + } + } + { + E T5j, T5L, T6R, T6X, T5q, T6W, T5V, T5Y, T5y, T5J, T5O, T6O, T5S, T5Z, T5F; + E T5I, T5i, T6P; + T5i = T5g - T5h; + T5j = T5f - T5i; + T5L = T5f + T5i; + T6P = T3Z + T3W; + T6R = T6P - T6Q; + T6X = T6P + T6Q; + { + E T5m, T5p, T5T, T5U; + T5m = FMA(KP290284677, T5k, KP956940335 * T5l); + T5p = FNMS(KP290284677, T5o, KP956940335 * T5n); + T5q = T5m - T5p; + T6W = T5p + T5m; + T5T = T5z + T5A; + T5U = T5C + T5D; + T5V = FNMS(KP146730474, T5U, KP989176509 * T5T); + T5Y = FMA(KP146730474, T5T, KP989176509 * T5U); + } + { + E T5u, T5x, T5M, T5N; + T5u = T5s - T5t; + T5x = T5v - T5w; + T5y = FMA(KP803207531, T5u, KP595699304 * T5x); + T5J = FNMS(KP595699304, T5u, KP803207531 * T5x); + T5M = FMA(KP956940335, T5o, KP290284677 * T5n); + T5N = FNMS(KP290284677, T5l, KP956940335 * T5k); + T5O = T5M + T5N; + T6O = T5N - T5M; + } + { + E T5Q, T5R, T5B, T5E; + T5Q = T5s + T5t; + T5R = T5v + T5w; + T5S = FMA(KP989176509, T5Q, KP146730474 * T5R); + T5Z = FNMS(KP146730474, T5Q, KP989176509 * T5R); + T5B = T5z - T5A; + T5E = T5C - T5D; + T5F = FNMS(KP595699304, T5E, KP803207531 * T5B); + T5I = FMA(KP595699304, T5B, KP803207531 * T5E); + } + { + E T5r, T5G, T6T, T6U; + T5r = T5j + T5q; + T5G = T5y + T5F; + Cr[WS(csr, 25)] = T5r - T5G; + Cr[WS(csr, 6)] = T5r + T5G; + T6T = T5J + T5I; + T6U = T6O + T6R; + Ci[WS(csi, 25)] = T6T - T6U; + Ci[WS(csi, 6)] = T6T + T6U; + } + { + E T5H, T5K, T6N, T6S; + T5H = T5j - T5q; + T5K = T5I - T5J; + Cr[WS(csr, 22)] = T5H - T5K; + Cr[WS(csr, 9)] = T5H + T5K; + T6N = T5F - T5y; + T6S = T6O - T6R; + Ci[WS(csi, 22)] = T6N - T6S; + Ci[WS(csi, 9)] = T6N + T6S; + } + { + E T5P, T5W, T6Z, T70; + T5P = T5L + T5O; + T5W = T5S + T5V; + Cr[WS(csr, 30)] = T5P - T5W; + Cr[WS(csr, 1)] = T5P + T5W; + T6Z = T5Z + T5Y; + T70 = T6W + T6X; + Ci[WS(csi, 30)] = T6Z - T70; + Ci[WS(csi, 1)] = T6Z + T70; + } + { + E T5X, T60, T6V, T6Y; + T5X = T5L - T5O; + T60 = T5Y - T5Z; + Cr[WS(csr, 17)] = T5X - T60; + Cr[WS(csr, 14)] = T5X + T60; + T6V = T5V - T5S; + T6Y = T6W - T6X; + Ci[WS(csi, 17)] = T6V - T6Y; + Ci[WS(csi, 14)] = T6V + T6Y; + } + } + { + E T37, T3z, T6n, T6t, T3e, T6s, T3J, T3M, T3m, T3x, T3C, T6k, T3G, T3N, T3t; + E T3w, T36, T6l; + T36 = T34 + T35; + T37 = T33 - T36; + T3z = T33 + T36; + T6l = Tv - Tm; + T6n = T6l - T6m; + T6t = T6l + T6m; + { + E T3a, T3d, T3H, T3I; + T3a = FMA(KP634393284, T38, KP773010453 * T39); + T3d = FNMS(KP634393284, T3c, KP773010453 * T3b); + T3e = T3a - T3d; + T6s = T3d + T3a; + T3H = T3n + T3o; + T3I = T3q + T3r; + T3J = FNMS(KP336889853, T3I, KP941544065 * T3H); + T3M = FMA(KP336889853, T3H, KP941544065 * T3I); + } + { + E T3i, T3l, T3A, T3B; + T3i = T3g - T3h; + T3l = T3j - T3k; + T3m = FMA(KP903989293, T3i, KP427555093 * T3l); + T3x = FNMS(KP427555093, T3i, KP903989293 * T3l); + T3A = FMA(KP773010453, T3c, KP634393284 * T3b); + T3B = FNMS(KP634393284, T39, KP773010453 * T38); + T3C = T3A + T3B; + T6k = T3B - T3A; + } + { + E T3E, T3F, T3p, T3s; + T3E = T3g + T3h; + T3F = T3j + T3k; + T3G = FMA(KP941544065, T3E, KP336889853 * T3F); + T3N = FNMS(KP336889853, T3E, KP941544065 * T3F); + T3p = T3n - T3o; + T3s = T3q - T3r; + T3t = FNMS(KP427555093, T3s, KP903989293 * T3p); + T3w = FMA(KP427555093, T3p, KP903989293 * T3s); + } + { + E T3f, T3u, T6p, T6q; + T3f = T37 + T3e; + T3u = T3m + T3t; + Cr[WS(csr, 27)] = T3f - T3u; + Cr[WS(csr, 4)] = T3f + T3u; + T6p = T3x + T3w; + T6q = T6k + T6n; + Ci[WS(csi, 27)] = T6p - T6q; + Ci[WS(csi, 4)] = T6p + T6q; + } + { + E T3v, T3y, T6j, T6o; + T3v = T37 - T3e; + T3y = T3w - T3x; + Cr[WS(csr, 20)] = T3v - T3y; + Cr[WS(csr, 11)] = T3v + T3y; + T6j = T3t - T3m; + T6o = T6k - T6n; + Ci[WS(csi, 20)] = T6j - T6o; + Ci[WS(csi, 11)] = T6j + T6o; + } + { + E T3D, T3K, T6v, T6w; + T3D = T3z + T3C; + T3K = T3G + T3J; + Cr[WS(csr, 28)] = T3D - T3K; + Cr[WS(csr, 3)] = T3D + T3K; + T6v = T3N + T3M; + T6w = T6s + T6t; + Ci[WS(csi, 28)] = T6v - T6w; + Ci[WS(csi, 3)] = T6v + T6w; + } + { + E T3L, T3O, T6r, T6u; + T3L = T3z - T3C; + T3O = T3M - T3N; + Cr[WS(csr, 19)] = T3L - T3O; + Cr[WS(csr, 12)] = T3L + T3O; + T6r = T3J - T3G; + T6u = T6s - T6t; + Ci[WS(csi, 19)] = T6r - T6u; + Ci[WS(csi, 12)] = T6r + T6u; + } + } + { + E T41, T4Z, T6D, T6J, T4g, T6I, T59, T5d, T4A, T4X, T52, T6y, T56, T5c, T4T; + E T4W, T40, T6C; + T40 = T3W - T3Z; + T41 = T3T + T40; + T4Z = T3T - T40; + T6C = T5g + T5h; + T6D = T6B - T6C; + T6J = T6C + T6B; + { + E T48, T4f, T57, T58; + T48 = FMA(KP881921264, T44, KP471396736 * T47); + T4f = FMA(KP881921264, T4b, KP471396736 * T4e); + T4g = T48 - T4f; + T6I = T48 + T4f; + T57 = T4K + T4H; + T58 = T4R + T4O; + T59 = FMA(KP514102744, T57, KP857728610 * T58); + T5d = FNMS(KP857728610, T57, KP514102744 * T58); + } + { + E T4s, T4z, T50, T51; + T4s = T4k + T4r; + T4z = T4v - T4y; + T4A = FMA(KP970031253, T4s, KP242980179 * T4z); + T4X = FNMS(KP242980179, T4s, KP970031253 * T4z); + T50 = FNMS(KP471396736, T4b, KP881921264 * T4e); + T51 = FNMS(KP471396736, T44, KP881921264 * T47); + T52 = T50 - T51; + T6y = T51 + T50; + } + { + E T54, T55, T4L, T4S; + T54 = T4k - T4r; + T55 = T4y + T4v; + T56 = FMA(KP514102744, T54, KP857728610 * T55); + T5c = FNMS(KP514102744, T55, KP857728610 * T54); + T4L = T4H - T4K; + T4S = T4O - T4R; + T4T = FNMS(KP242980179, T4S, KP970031253 * T4L); + T4W = FMA(KP242980179, T4L, KP970031253 * T4S); + } + { + E T4h, T4U, T6F, T6G; + T4h = T41 + T4g; + T4U = T4A + T4T; + Cr[WS(csr, 29)] = T4h - T4U; + Cr[WS(csr, 2)] = T4h + T4U; + T6F = T4X + T4W; + T6G = T6y + T6D; + Ci[WS(csi, 29)] = T6F - T6G; + Ci[WS(csi, 2)] = T6F + T6G; + } + { + E T4V, T4Y, T6x, T6E; + T4V = T41 - T4g; + T4Y = T4W - T4X; + Cr[WS(csr, 18)] = T4V - T4Y; + Cr[WS(csr, 13)] = T4V + T4Y; + T6x = T4T - T4A; + T6E = T6y - T6D; + Ci[WS(csi, 18)] = T6x - T6E; + Ci[WS(csi, 13)] = T6x + T6E; + } + { + E T53, T5a, T6L, T6M; + T53 = T4Z - T52; + T5a = T56 - T59; + Cr[WS(csr, 21)] = T53 - T5a; + Cr[WS(csr, 10)] = T53 + T5a; + T6L = T5d - T5c; + T6M = T6J - T6I; + Ci[WS(csi, 21)] = T6L - T6M; + Ci[WS(csi, 10)] = T6L + T6M; + } + { + E T5b, T5e, T6H, T6K; + T5b = T4Z + T52; + T5e = T5c + T5d; + Cr[WS(csr, 26)] = T5b - T5e; + Cr[WS(csr, 5)] = T5b + T5e; + T6H = T56 + T59; + T6K = T6I + T6J; + Ci[WS(csi, 5)] = -(T6H + T6K); + Ci[WS(csi, 26)] = T6K - T6H; + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cfII_64", {342, 114, 92, 0}, &GENUS }; + +void X(codelet_r2cfII_64) (planner *p) { + X(kr2c_register) (p, r2cfII_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_7.c new file mode 100644 index 000000000..eed336575 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_7.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 7 -name r2cfII_7 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 24 FP additions, 18 FP multiplications, + * (or, 9 additions, 3 multiplications, 15 fused multiply/add), + * 23 stack variables, 6 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E Td, Te, Tf, Tg, T3, T6, Tl, Tj, Th, T9; + Td = R0[0]; + { + E T1, T2, T7, T8, T4, T5; + T1 = R0[WS(rs, 1)]; + T2 = R1[WS(rs, 2)]; + Te = T1 - T2; + T7 = R1[WS(rs, 1)]; + T8 = R0[WS(rs, 2)]; + Tf = T8 - T7; + T4 = R1[0]; + T5 = R0[WS(rs, 3)]; + Tg = T5 - T4; + T3 = T1 + T2; + T6 = T4 + T5; + Tl = FNMS(KP356895867, Te, Tg); + Tj = FNMS(KP356895867, Tf, Te); + Th = FNMS(KP356895867, Tg, Tf); + T9 = T7 + T8; + } + { + E Ta, Tm, Tb, Ti, Tc, Tk; + Ta = FMA(KP554958132, T9, T6); + Ci[WS(csi, 2)] = KP974927912 * (FNMS(KP801937735, Ta, T3)); + Tm = FNMS(KP692021471, Tl, Tf); + Cr[WS(csr, 2)] = FNMS(KP900968867, Tm, Td); + Tb = FNMS(KP554958132, T3, T9); + Ci[WS(csi, 1)] = -(KP974927912 * (FNMS(KP801937735, Tb, T6))); + Ti = FNMS(KP692021471, Th, Te); + Cr[WS(csr, 1)] = FNMS(KP900968867, Ti, Td); + Cr[WS(csr, 3)] = Te + Tg + Tf + Td; + Tc = FMA(KP554958132, T6, T3); + Ci[0] = -(KP974927912 * (FMA(KP801937735, Tc, T9))); + Tk = FNMS(KP692021471, Tj, Tg); + Cr[0] = FNMS(KP900968867, Tk, Td); + } + } + } +} + +static const kr2c_desc desc = { 7, "r2cfII_7", {9, 3, 15, 0}, &GENUS }; + +void X(codelet_r2cfII_7) (planner *p) { + X(kr2c_register) (p, r2cfII_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 7 -name r2cfII_7 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 24 FP additions, 18 FP multiplications, + * (or, 12 additions, 6 multiplications, 12 fused multiply/add), + * 20 stack variables, 6 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T1, Ta, Td, T4, Tb, T7, Tc, T8, T9; + T1 = R0[0]; + T8 = R1[0]; + T9 = R0[WS(rs, 3)]; + Ta = T8 - T9; + Td = T8 + T9; + { + E T2, T3, T5, T6; + T2 = R0[WS(rs, 1)]; + T3 = R1[WS(rs, 2)]; + T4 = T2 - T3; + Tb = T2 + T3; + T5 = R1[WS(rs, 1)]; + T6 = R0[WS(rs, 2)]; + T7 = T5 - T6; + Tc = T5 + T6; + } + Ci[0] = -(FMA(KP781831482, Tb, KP974927912 * Tc) + (KP433883739 * Td)); + Ci[WS(csi, 1)] = FNMS(KP974927912, Td, KP781831482 * Tc) - (KP433883739 * Tb); + Cr[0] = FMA(KP623489801, T4, T1) + FMA(KP222520933, T7, KP900968867 * Ta); + Ci[WS(csi, 2)] = FNMS(KP781831482, Td, KP974927912 * Tb) - (KP433883739 * Tc); + Cr[WS(csr, 2)] = FMA(KP900968867, T7, T1) + FNMA(KP623489801, Ta, KP222520933 * T4); + Cr[WS(csr, 1)] = FMA(KP222520933, Ta, T1) + FNMA(KP623489801, T7, KP900968867 * T4); + Cr[WS(csr, 3)] = T1 + T4 - (T7 + Ta); + } + } +} + +static const kr2c_desc desc = { 7, "r2cfII_7", {12, 6, 12, 0}, &GENUS }; + +void X(codelet_r2cfII_7) (planner *p) { + X(kr2c_register) (p, r2cfII_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_8.c new file mode 100644 index 000000000..b7b7fac53 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_8.c @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:42 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -name r2cfII_8 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 22 FP additions, 16 FP multiplications, + * (or, 6 additions, 0 multiplications, 16 fused multiply/add), + * 18 stack variables, 3 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T1, Th, T4, Ti, T8, Te, Tb, Tf, T2, T3; + T1 = R0[0]; + Th = R0[WS(rs, 2)]; + T2 = R0[WS(rs, 1)]; + T3 = R0[WS(rs, 3)]; + T4 = T2 - T3; + Ti = T2 + T3; + { + E T6, T7, T9, Ta; + T6 = R1[0]; + T7 = R1[WS(rs, 2)]; + T8 = FNMS(KP414213562, T7, T6); + Te = FMA(KP414213562, T6, T7); + T9 = R1[WS(rs, 3)]; + Ta = R1[WS(rs, 1)]; + Tb = FMS(KP414213562, Ta, T9); + Tf = FMA(KP414213562, T9, Ta); + } + { + E T5, Tc, Tj, Tk; + T5 = FMA(KP707106781, T4, T1); + Tc = T8 + Tb; + Cr[WS(csr, 3)] = FNMS(KP923879532, Tc, T5); + Cr[0] = FMA(KP923879532, Tc, T5); + Tj = FMA(KP707106781, Ti, Th); + Tk = Te + Tf; + Ci[0] = -(FMA(KP923879532, Tk, Tj)); + Ci[WS(csi, 3)] = FNMS(KP923879532, Tk, Tj); + } + { + E Td, Tg, Tl, Tm; + Td = FNMS(KP707106781, T4, T1); + Tg = Te - Tf; + Cr[WS(csr, 2)] = FNMS(KP923879532, Tg, Td); + Cr[WS(csr, 1)] = FMA(KP923879532, Tg, Td); + Tl = FNMS(KP707106781, Ti, Th); + Tm = Tb - T8; + Ci[WS(csi, 2)] = FMS(KP923879532, Tm, Tl); + Ci[WS(csi, 1)] = FMA(KP923879532, Tm, Tl); + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cfII_8", {6, 0, 16, 0}, &GENUS }; + +void X(codelet_r2cfII_8) (planner *p) { + X(kr2c_register) (p, r2cfII_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 8 -name r2cfII_8 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 22 FP additions, 10 FP multiplications, + * (or, 18 additions, 6 multiplications, 4 fused multiply/add), + * 18 stack variables, 3 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T1, Tj, T4, Ti, T8, Te, Tb, Tf, T2, T3; + T1 = R0[0]; + Tj = R0[WS(rs, 2)]; + T2 = R0[WS(rs, 1)]; + T3 = R0[WS(rs, 3)]; + T4 = KP707106781 * (T2 - T3); + Ti = KP707106781 * (T2 + T3); + { + E T6, T7, T9, Ta; + T6 = R1[0]; + T7 = R1[WS(rs, 2)]; + T8 = FNMS(KP382683432, T7, KP923879532 * T6); + Te = FMA(KP382683432, T6, KP923879532 * T7); + T9 = R1[WS(rs, 1)]; + Ta = R1[WS(rs, 3)]; + Tb = FNMS(KP923879532, Ta, KP382683432 * T9); + Tf = FMA(KP923879532, T9, KP382683432 * Ta); + } + { + E T5, Tc, Th, Tk; + T5 = T1 + T4; + Tc = T8 + Tb; + Cr[WS(csr, 3)] = T5 - Tc; + Cr[0] = T5 + Tc; + Th = Te + Tf; + Tk = Ti + Tj; + Ci[0] = -(Th + Tk); + Ci[WS(csi, 3)] = Tk - Th; + } + { + E Td, Tg, Tl, Tm; + Td = T1 - T4; + Tg = Te - Tf; + Cr[WS(csr, 2)] = Td - Tg; + Cr[WS(csr, 1)] = Td + Tg; + Tl = Tb - T8; + Tm = Tj - Ti; + Ci[WS(csi, 2)] = Tl - Tm; + Ci[WS(csi, 1)] = Tl + Tm; + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cfII_8", {18, 6, 4, 0}, &GENUS }; + +void X(codelet_r2cfII_8) (planner *p) { + X(kr2c_register) (p, r2cfII_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_9.c new file mode 100644 index 000000000..cf4b5bb75 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cfII_9.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:43 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 9 -name r2cfII_9 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 42 FP additions, 34 FP multiplications, + * (or, 12 additions, 4 multiplications, 30 fused multiply/add), + * 48 stack variables, 17 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP879385241, +0.879385241571816768108218554649462939872416269); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP898197570, +0.898197570222573798468955502359086394667167570); + DK(KP673648177, +0.673648177666930348851716626769314796000375677); + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP907603734, +0.907603734547952313649323976213898122064543220); + DK(KP666666666, +0.666666666666666666666666666666666666666666667); + DK(KP826351822, +0.826351822333069651148283373230685203999624323); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP315207469, +0.315207469095904627298647952427796244129086440); + DK(KP420276625, +0.420276625461206169731530603237061658838781920); + DK(KP203604859, +0.203604859554852403062088995281827210665664861); + DK(KP152703644, +0.152703644666139302296566746461370407999248646); + DK(KP726681596, +0.726681596905677465811651808188092531873167623); + DK(KP968908795, +0.968908795874236621082202410917456709164223497); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T1, T4, To, Ta, Tm, TB, Tq, Tt, Tf, Tj, TA, Tr, Ts, T2, T3; + E T5, Tg; + T1 = R0[0]; + T2 = R0[WS(rs, 3)]; + T3 = R1[WS(rs, 1)]; + T4 = T2 - T3; + To = T2 + T3; + { + E T6, T9, Tk, T7, T8, Tl; + T6 = R0[WS(rs, 1)]; + T7 = R0[WS(rs, 4)]; + T8 = R1[WS(rs, 2)]; + T9 = T7 - T8; + Tk = T7 + T8; + Ta = T6 + T9; + Tl = FNMS(KP500000000, T9, T6); + Tm = FMA(KP968908795, Tl, Tk); + TB = FNMS(KP726681596, Tk, Tl); + Tq = FNMS(KP152703644, Tk, Tl); + Tt = FMA(KP203604859, Tl, Tk); + } + { + E Tb, Te, Ti, Tc, Td, Th; + Tb = R0[WS(rs, 2)]; + Tc = R1[0]; + Td = R1[WS(rs, 3)]; + Te = Tc + Td; + Ti = Tc - Td; + Tf = Tb - Te; + Th = FMA(KP500000000, Te, Tb); + Tj = FNMS(KP152703644, Ti, Th); + TA = FMA(KP203604859, Th, Ti); + Tr = FNMS(KP420276625, Th, Ti); + Ts = FMA(KP315207469, Ti, Th); + } + Ci[WS(csi, 1)] = KP866025403 * (Tf - Ta); + T5 = T1 + T4; + Tg = Ta + Tf; + Cr[WS(csr, 1)] = FNMS(KP500000000, Tg, T5); + Cr[WS(csr, 4)] = T5 + Tg; + { + E Ty, Tx, Tz, Tn, TD, TC; + Tx = FNMS(KP826351822, Tr, Tq); + Ty = FNMS(KP666666666, Tx, Tt); + Tz = FMA(KP907603734, Ty, Ts); + Ci[WS(csi, 2)] = KP866025403 * (FNMS(KP939692620, Tz, To)); + Tn = FMA(KP673648177, Tm, Tj); + TC = FNMS(KP898197570, TB, TA); + TD = FNMS(KP666666666, Tn, TC); + Ci[0] = -(KP984807753 * (FMA(KP879385241, To, Tn))); + Ci[WS(csi, 3)] = -(KP866025403 * (FMA(KP852868531, TD, To))); + { + E Tp, Tv, TF, TG, Tu, TE, Tw; + Tp = FNMS(KP500000000, T4, T1); + Tu = FNMS(KP907603734, Tt, Ts); + Tv = FNMS(KP666666666, Tu, Tr); + TE = FNMS(KP673648177, Tm, Tj); + TF = FMA(KP898197570, TB, TA); + TG = FMA(KP500000000, TF, TE); + Cr[WS(csr, 3)] = FNMS(KP852868531, TG, Tp); + Cr[0] = FMA(KP852868531, TF, Tp); + Tw = FMA(KP826351822, Tv, Tq); + Cr[WS(csr, 2)] = FNMS(KP852868531, Tw, Tp); + } + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cfII_9", {12, 4, 30, 0}, &GENUS }; + +void X(codelet_r2cfII_9) (planner *p) { + X(kr2c_register) (p, r2cfII_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 9 -name r2cfII_9 -dft-II -include rdft/scalar/r2cfII.h */ + +/* + * This function contains 42 FP additions, 30 FP multiplications, + * (or, 25 additions, 13 multiplications, 17 fused multiply/add), + * 39 stack variables, 14 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cfII.h" + +static void r2cfII_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP663413948, +0.663413948168938396205421319635891297216863310); + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP556670399, +0.556670399226419366452912952047023132968291906); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP150383733, +0.150383733180435296639271897612501926072238258); + DK(KP813797681, +0.813797681349373692844693217248393223289101568); + DK(KP342020143, +0.342020143325668733044099614682259580763083368); + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP296198132, +0.296198132726023843175338011893050938967728390); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T1, T4, To, Ta, Tl, Tk, Tf, Ti, Th, T2, T3, T5, Tg; + T1 = R0[0]; + T2 = R1[WS(rs, 1)]; + T3 = R0[WS(rs, 3)]; + T4 = T2 - T3; + To = T2 + T3; + { + E T6, T7, T8, T9; + T6 = R0[WS(rs, 1)]; + T7 = R1[WS(rs, 2)]; + T8 = R0[WS(rs, 4)]; + T9 = T7 - T8; + Ta = T6 - T9; + Tl = T7 + T8; + Tk = FMA(KP500000000, T9, T6); + } + { + E Tb, Tc, Td, Te; + Tb = R0[WS(rs, 2)]; + Tc = R1[0]; + Td = R1[WS(rs, 3)]; + Te = Tc + Td; + Tf = Tb - Te; + Ti = FMA(KP500000000, Te, Tb); + Th = Tc - Td; + } + Ci[WS(csi, 1)] = KP866025403 * (Tf - Ta); + T5 = T1 - T4; + Tg = Ta + Tf; + Cr[WS(csr, 1)] = FNMS(KP500000000, Tg, T5); + Cr[WS(csr, 4)] = T5 + Tg; + { + E Tr, Tt, Tw, Tv, Tu, Tp, Tq, Ts, Tj, Tm, Tn; + Tr = FMA(KP500000000, T4, T1); + Tt = FMA(KP296198132, Th, KP939692620 * Ti); + Tw = FNMS(KP813797681, Th, KP342020143 * Ti); + Tv = FNMS(KP984807753, Tk, KP150383733 * Tl); + Tu = FMA(KP173648177, Tk, KP852868531 * Tl); + Tp = FNMS(KP556670399, Tl, KP766044443 * Tk); + Tq = FMA(KP852868531, Th, KP173648177 * Ti); + Ts = Tp + Tq; + Tj = FNMS(KP984807753, Ti, KP150383733 * Th); + Tm = FMA(KP642787609, Tk, KP663413948 * Tl); + Tn = Tj - Tm; + Ci[0] = FNMS(KP866025403, To, Tn); + Cr[0] = Tr + Ts; + Ci[WS(csi, 3)] = FNMS(KP500000000, Tn, KP866025403 * ((Tp - Tq) - To)); + Cr[WS(csr, 3)] = FMA(KP866025403, Tm + Tj, Tr) - (KP500000000 * Ts); + Ci[WS(csi, 2)] = FMA(KP866025403, To - (Tu + Tt), KP500000000 * (Tw - Tv)); + Cr[WS(csr, 2)] = FMA(KP500000000, Tt - Tu, Tr) + (KP866025403 * (Tv + Tw)); + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cfII_9", {25, 13, 17, 0}, &GENUS }; + +void X(codelet_r2cfII_9) (planner *p) { + X(kr2c_register) (p, r2cfII_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_10.c new file mode 100644 index 000000000..e2c1f1fce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_10.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 10 -name r2cf_10 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 34 FP additions, 14 FP multiplications, + * (or, 24 additions, 4 multiplications, 10 fused multiply/add), + * 26 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E T3, Tt, Td, Tn, Tg, To, Th, Tv, T6, Tq, T9, Tr, Ta, Tu, T1; + E T2; + T1 = R0[0]; + T2 = R1[WS(rs, 2)]; + T3 = T1 - T2; + Tt = T1 + T2; + { + E Tb, Tc, Te, Tf; + Tb = R0[WS(rs, 2)]; + Tc = R1[WS(rs, 4)]; + Td = Tb - Tc; + Tn = Tb + Tc; + Te = R0[WS(rs, 3)]; + Tf = R1[0]; + Tg = Te - Tf; + To = Te + Tf; + } + Th = Td + Tg; + Tv = Tn + To; + { + E T4, T5, T7, T8; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 3)]; + T6 = T4 - T5; + Tq = T4 + T5; + T7 = R0[WS(rs, 4)]; + T8 = R1[WS(rs, 1)]; + T9 = T7 - T8; + Tr = T7 + T8; + } + Ta = T6 + T9; + Tu = Tq + Tr; + { + E Tl, Tm, Tk, Ti, Tj; + Tl = T6 - T9; + Tm = Tg - Td; + Ci[WS(csi, 1)] = -(KP951056516 * (FNMS(KP618033988, Tm, Tl))); + Ci[WS(csi, 3)] = KP951056516 * (FMA(KP618033988, Tl, Tm)); + Tk = Ta - Th; + Ti = Ta + Th; + Tj = FNMS(KP250000000, Ti, T3); + Cr[WS(csr, 1)] = FMA(KP559016994, Tk, Tj); + Cr[WS(csr, 5)] = T3 + Ti; + Cr[WS(csr, 3)] = FNMS(KP559016994, Tk, Tj); + } + { + E Tp, Ts, Ty, Tw, Tx; + Tp = Tn - To; + Ts = Tq - Tr; + Ci[WS(csi, 2)] = KP951056516 * (FNMS(KP618033988, Ts, Tp)); + Ci[WS(csi, 4)] = KP951056516 * (FMA(KP618033988, Tp, Ts)); + Ty = Tu - Tv; + Tw = Tu + Tv; + Tx = FNMS(KP250000000, Tw, Tt); + Cr[WS(csr, 2)] = FNMS(KP559016994, Ty, Tx); + Cr[0] = Tt + Tw; + Cr[WS(csr, 4)] = FMA(KP559016994, Ty, Tx); + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cf_10", {24, 4, 10, 0}, &GENUS }; + +void X(codelet_r2cf_10) (planner *p) { + X(kr2c_register) (p, r2cf_10, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 10 -name r2cf_10 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 34 FP additions, 12 FP multiplications, + * (or, 28 additions, 6 multiplications, 6 fused multiply/add), + * 26 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_10(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(40, rs), MAKE_VOLATILE_STRIDE(40, csr), MAKE_VOLATILE_STRIDE(40, csi)) { + E Ti, Tt, Ta, Tn, Td, To, Te, Tv, T3, Tq, T6, Tr, T7, Tu, Tg; + E Th; + Tg = R0[0]; + Th = R1[WS(rs, 2)]; + Ti = Tg - Th; + Tt = Tg + Th; + { + E T8, T9, Tb, Tc; + T8 = R0[WS(rs, 2)]; + T9 = R1[WS(rs, 4)]; + Ta = T8 - T9; + Tn = T8 + T9; + Tb = R0[WS(rs, 3)]; + Tc = R1[0]; + Td = Tb - Tc; + To = Tb + Tc; + } + Te = Ta + Td; + Tv = Tn + To; + { + E T1, T2, T4, T5; + T1 = R0[WS(rs, 1)]; + T2 = R1[WS(rs, 3)]; + T3 = T1 - T2; + Tq = T1 + T2; + T4 = R0[WS(rs, 4)]; + T5 = R1[WS(rs, 1)]; + T6 = T4 - T5; + Tr = T4 + T5; + } + T7 = T3 + T6; + Tu = Tq + Tr; + { + E Tl, Tm, Tf, Tj, Tk; + Tl = Td - Ta; + Tm = T3 - T6; + Ci[WS(csi, 1)] = FNMS(KP951056516, Tm, KP587785252 * Tl); + Ci[WS(csi, 3)] = FMA(KP587785252, Tm, KP951056516 * Tl); + Tf = KP559016994 * (T7 - Te); + Tj = T7 + Te; + Tk = FNMS(KP250000000, Tj, Ti); + Cr[WS(csr, 1)] = Tf + Tk; + Cr[WS(csr, 5)] = Ti + Tj; + Cr[WS(csr, 3)] = Tk - Tf; + } + { + E Tp, Ts, Ty, Tw, Tx; + Tp = Tn - To; + Ts = Tq - Tr; + Ci[WS(csi, 2)] = FNMS(KP587785252, Ts, KP951056516 * Tp); + Ci[WS(csi, 4)] = FMA(KP951056516, Ts, KP587785252 * Tp); + Ty = KP559016994 * (Tu - Tv); + Tw = Tu + Tv; + Tx = FNMS(KP250000000, Tw, Tt); + Cr[WS(csr, 2)] = Tx - Ty; + Cr[0] = Tt + Tw; + Cr[WS(csr, 4)] = Ty + Tx; + } + } + } +} + +static const kr2c_desc desc = { 10, "r2cf_10", {28, 6, 6, 0}, &GENUS }; + +void X(codelet_r2cf_10) (planner *p) { + X(kr2c_register) (p, r2cf_10, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_11.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_11.c new file mode 100644 index 000000000..1ad55c937 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_11.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 11 -name r2cf_11 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 60 FP additions, 50 FP multiplications, + * (or, 15 additions, 5 multiplications, 45 fused multiply/add), + * 42 stack variables, 10 constants, and 22 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_11(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP918985947, +0.918985947228994779780736114132655398124909697); + DK(KP989821441, +0.989821441880932732376092037776718787376519372); + DK(KP830830026, +0.830830026003772851058548298459246407048009821); + DK(KP715370323, +0.715370323453429719112414662767260662417897278); + DK(KP959492973, +0.959492973614497389890368057066327699062454848); + DK(KP876768831, +0.876768831002589333891339807079336796764054852); + DK(KP778434453, +0.778434453334651800608337670740821884709317477); + DK(KP634356270, +0.634356270682424498893150776899916060542806975); + DK(KP342584725, +0.342584725681637509502641509861112333758894680); + DK(KP521108558, +0.521108558113202722944698153526659300680427422); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(44, rs), MAKE_VOLATILE_STRIDE(44, csr), MAKE_VOLATILE_STRIDE(44, csi)) { + E T1, T4, TC, Tg, TE, T7, TD, Ta, TF, Td, TB, TG, TM, TS, TJ; + E TP, Ty, Tq, Ti, Tu, Tm, T5, T6; + T1 = R0[0]; + { + E T2, T3, Te, Tf; + T2 = R1[0]; + T3 = R0[WS(rs, 5)]; + T4 = T2 + T3; + TC = T3 - T2; + Te = R1[WS(rs, 2)]; + Tf = R0[WS(rs, 3)]; + Tg = Te + Tf; + TE = Tf - Te; + } + T5 = R0[WS(rs, 1)]; + T6 = R1[WS(rs, 4)]; + T7 = T5 + T6; + TD = T5 - T6; + { + E T8, T9, Tb, Tc; + T8 = R1[WS(rs, 1)]; + T9 = R0[WS(rs, 4)]; + Ta = T8 + T9; + TF = T9 - T8; + Tb = R0[WS(rs, 2)]; + Tc = R1[WS(rs, 3)]; + Td = Tb + Tc; + TB = Tb - Tc; + } + TG = FMA(KP521108558, TF, TE); + TM = FNMS(KP521108558, TD, TB); + TS = FMA(KP521108558, TC, TD); + TJ = FMA(KP521108558, TE, TC); + TP = FNMS(KP521108558, TB, TF); + { + E Tx, Tp, Th, Tt, Tl; + Tx = FNMS(KP342584725, Ta, T7); + Ty = FNMS(KP634356270, Tx, Td); + Tp = FNMS(KP342584725, T4, Ta); + Tq = FNMS(KP634356270, Tp, Tg); + Th = FNMS(KP342584725, Tg, Td); + Ti = FNMS(KP634356270, Th, Ta); + Tt = FNMS(KP342584725, Td, T4); + Tu = FNMS(KP634356270, Tt, T7); + Tl = FNMS(KP342584725, T7, Tg); + Tm = FNMS(KP634356270, Tl, T4); + } + { + E To, Tn, TI, TH; + { + E Tk, Tj, TU, TT; + Tj = FNMS(KP778434453, Ti, T7); + Tk = FNMS(KP876768831, Tj, T4); + Cr[WS(csr, 5)] = FNMS(KP959492973, Tk, T1); + TT = FMA(KP715370323, TS, TF); + TU = FMA(KP830830026, TT, TB); + Ci[WS(csi, 5)] = KP989821441 * (FMA(KP918985947, TU, TE)); + } + Tn = FNMS(KP778434453, Tm, Ta); + To = FNMS(KP876768831, Tn, Td); + Cr[WS(csr, 4)] = FNMS(KP959492973, To, T1); + { + E TR, TQ, Ts, Tr; + TQ = FMA(KP715370323, TP, TC); + TR = FNMS(KP830830026, TQ, TE); + Ci[WS(csi, 4)] = KP989821441 * (FNMS(KP918985947, TR, TD)); + Tr = FNMS(KP778434453, Tq, Td); + Ts = FNMS(KP876768831, Tr, T7); + Cr[WS(csr, 3)] = FNMS(KP959492973, Ts, T1); + } + { + E TO, TN, Tw, Tv; + TN = FNMS(KP715370323, TM, TE); + TO = FNMS(KP830830026, TN, TF); + Ci[WS(csi, 3)] = KP989821441 * (FNMS(KP918985947, TO, TC)); + Tv = FNMS(KP778434453, Tu, Tg); + Tw = FNMS(KP876768831, Tv, Ta); + Cr[WS(csr, 2)] = FNMS(KP959492973, Tw, T1); + Cr[0] = T1 + T4 + T7 + Ta + Td + Tg; + } + TH = FMA(KP715370323, TG, TD); + TI = FNMS(KP830830026, TH, TC); + Ci[WS(csi, 2)] = KP989821441 * (FMA(KP918985947, TI, TB)); + { + E TL, TK, TA, Tz; + TK = FNMS(KP715370323, TJ, TB); + TL = FMA(KP830830026, TK, TD); + Ci[WS(csi, 1)] = KP989821441 * (FNMS(KP918985947, TL, TF)); + Tz = FNMS(KP778434453, Ty, T4); + TA = FNMS(KP876768831, Tz, Tg); + Cr[WS(csr, 1)] = FNMS(KP959492973, TA, T1); + } + } + } + } +} + +static const kr2c_desc desc = { 11, "r2cf_11", {15, 5, 45, 0}, &GENUS }; + +void X(codelet_r2cf_11) (planner *p) { + X(kr2c_register) (p, r2cf_11, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 11 -name r2cf_11 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 60 FP additions, 50 FP multiplications, + * (or, 20 additions, 10 multiplications, 40 fused multiply/add), + * 28 stack variables, 10 constants, and 22 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_11(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP654860733, +0.654860733945285064056925072466293553183791199); + DK(KP142314838, +0.142314838273285140443792668616369668791051361); + DK(KP959492973, +0.959492973614497389890368057066327699062454848); + DK(KP415415013, +0.415415013001886425529274149229623203524004910); + DK(KP841253532, +0.841253532831181168861811648919367717513292498); + DK(KP989821441, +0.989821441880932732376092037776718787376519372); + DK(KP909631995, +0.909631995354518371411715383079028460060241051); + DK(KP281732556, +0.281732556841429697711417915346616899035777899); + DK(KP540640817, +0.540640817455597582107635954318691695431770608); + DK(KP755749574, +0.755749574354258283774035843972344420179717445); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(44, rs), MAKE_VOLATILE_STRIDE(44, csr), MAKE_VOLATILE_STRIDE(44, csi)) { + E T1, T4, Tl, Tg, Th, Td, Ti, Ta, Tk, T7, Tj, Tb, Tc; + T1 = R0[0]; + { + E T2, T3, Te, Tf; + T2 = R0[WS(rs, 1)]; + T3 = R1[WS(rs, 4)]; + T4 = T2 + T3; + Tl = T3 - T2; + Te = R1[0]; + Tf = R0[WS(rs, 5)]; + Tg = Te + Tf; + Th = Tf - Te; + } + Tb = R1[WS(rs, 1)]; + Tc = R0[WS(rs, 4)]; + Td = Tb + Tc; + Ti = Tc - Tb; + { + E T8, T9, T5, T6; + T8 = R1[WS(rs, 2)]; + T9 = R0[WS(rs, 3)]; + Ta = T8 + T9; + Tk = T9 - T8; + T5 = R0[WS(rs, 2)]; + T6 = R1[WS(rs, 3)]; + T7 = T5 + T6; + Tj = T6 - T5; + } + Ci[WS(csi, 4)] = FMA(KP755749574, Th, KP540640817 * Ti) + FNMS(KP909631995, Tk, KP281732556 * Tj) - (KP989821441 * Tl); + Cr[WS(csr, 4)] = FMA(KP841253532, Td, T1) + FNMS(KP959492973, T7, KP415415013 * Ta) + FNMA(KP142314838, T4, KP654860733 * Tg); + Ci[WS(csi, 2)] = FMA(KP909631995, Th, KP755749574 * Tl) + FNMA(KP540640817, Tk, KP989821441 * Tj) - (KP281732556 * Ti); + Ci[WS(csi, 5)] = FMA(KP281732556, Th, KP755749574 * Ti) + FNMS(KP909631995, Tj, KP989821441 * Tk) - (KP540640817 * Tl); + Ci[WS(csi, 1)] = FMA(KP540640817, Th, KP909631995 * Tl) + FMA(KP989821441, Ti, KP755749574 * Tj) + (KP281732556 * Tk); + Ci[WS(csi, 3)] = FMA(KP989821441, Th, KP540640817 * Tj) + FNMS(KP909631995, Ti, KP755749574 * Tk) - (KP281732556 * Tl); + Cr[WS(csr, 3)] = FMA(KP415415013, Td, T1) + FNMS(KP654860733, Ta, KP841253532 * T7) + FNMA(KP959492973, T4, KP142314838 * Tg); + Cr[WS(csr, 1)] = FMA(KP841253532, Tg, T1) + FNMS(KP959492973, Ta, KP415415013 * T4) + FNMA(KP654860733, T7, KP142314838 * Td); + Cr[0] = T1 + Tg + T4 + Td + T7 + Ta; + Cr[WS(csr, 2)] = FMA(KP415415013, Tg, T1) + FNMS(KP142314838, T7, KP841253532 * Ta) + FNMA(KP959492973, Td, KP654860733 * T4); + Cr[WS(csr, 5)] = FMA(KP841253532, T4, T1) + FNMS(KP142314838, Ta, KP415415013 * T7) + FNMA(KP654860733, Td, KP959492973 * Tg); + } + } +} + +static const kr2c_desc desc = { 11, "r2cf_11", {20, 10, 40, 0}, &GENUS }; + +void X(codelet_r2cf_11) (planner *p) { + X(kr2c_register) (p, r2cf_11, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_12.c new file mode 100644 index 000000000..453d0670d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_12.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 12 -name r2cf_12 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 38 FP additions, 10 FP multiplications, + * (or, 30 additions, 2 multiplications, 8 fused multiply/add), + * 21 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E T5, Tp, Tm, Tk, Ty, Tt, Ta, Tq, Tn, Tf, Tz, Tu, Tl, To; + { + E T1, T2, T3, T4; + T1 = R0[0]; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 4)]; + T4 = T2 + T3; + T5 = T1 + T4; + Tp = FNMS(KP500000000, T4, T1); + Tm = T3 - T2; + } + { + E Tg, Th, Ti, Tj; + Tg = R1[WS(rs, 1)]; + Th = R1[WS(rs, 3)]; + Ti = R1[WS(rs, 5)]; + Tj = Th + Ti; + Tk = FNMS(KP500000000, Tj, Tg); + Ty = Ti - Th; + Tt = Tg + Tj; + } + { + E T6, T7, T8, T9; + T6 = R0[WS(rs, 3)]; + T7 = R0[WS(rs, 5)]; + T8 = R0[WS(rs, 1)]; + T9 = T7 + T8; + Ta = T6 + T9; + Tq = FNMS(KP500000000, T9, T6); + Tn = T8 - T7; + } + { + E Tb, Tc, Td, Te; + Tb = R1[WS(rs, 4)]; + Tc = R1[0]; + Td = R1[WS(rs, 2)]; + Te = Tc + Td; + Tf = FNMS(KP500000000, Te, Tb); + Tz = Td - Tc; + Tu = Tb + Te; + } + Cr[WS(csr, 3)] = T5 - Ta; + Ci[WS(csi, 3)] = Tt - Tu; + Tl = Tf - Tk; + To = Tm - Tn; + Ci[WS(csi, 1)] = FMA(KP866025403, To, Tl); + Ci[WS(csi, 5)] = FNMS(KP866025403, To, Tl); + { + E Tx, TA, Tv, Tw; + Tx = Tp - Tq; + TA = Ty - Tz; + Cr[WS(csr, 5)] = FNMS(KP866025403, TA, Tx); + Cr[WS(csr, 1)] = FMA(KP866025403, TA, Tx); + Tv = T5 + Ta; + Tw = Tt + Tu; + Cr[WS(csr, 6)] = Tv - Tw; + Cr[0] = Tv + Tw; + } + { + E Tr, Ts, TB, TC; + Tr = Tp + Tq; + Ts = Tk + Tf; + Cr[WS(csr, 2)] = Tr - Ts; + Cr[WS(csr, 4)] = Tr + Ts; + TB = Ty + Tz; + TC = Tm + Tn; + Ci[WS(csi, 2)] = KP866025403 * (TB - TC); + Ci[WS(csi, 4)] = KP866025403 * (TC + TB); + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cf_12", {30, 2, 8, 0}, &GENUS }; + +void X(codelet_r2cf_12) (planner *p) { + X(kr2c_register) (p, r2cf_12, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 12 -name r2cf_12 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 38 FP additions, 8 FP multiplications, + * (or, 34 additions, 4 multiplications, 4 fused multiply/add), + * 21 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_12(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(48, rs), MAKE_VOLATILE_STRIDE(48, csr), MAKE_VOLATILE_STRIDE(48, csi)) { + E T5, Tp, Tb, Tn, Ty, Tt, Ta, Tq, Tc, Ti, Tz, Tu, Td, To; + { + E T1, T2, T3, T4; + T1 = R0[0]; + T2 = R0[WS(rs, 2)]; + T3 = R0[WS(rs, 4)]; + T4 = T2 + T3; + T5 = T1 + T4; + Tp = FNMS(KP500000000, T4, T1); + Tb = T3 - T2; + } + { + E Tj, Tk, Tl, Tm; + Tj = R1[WS(rs, 1)]; + Tk = R1[WS(rs, 3)]; + Tl = R1[WS(rs, 5)]; + Tm = Tk + Tl; + Tn = FNMS(KP500000000, Tm, Tj); + Ty = Tl - Tk; + Tt = Tj + Tm; + } + { + E T6, T7, T8, T9; + T6 = R0[WS(rs, 3)]; + T7 = R0[WS(rs, 5)]; + T8 = R0[WS(rs, 1)]; + T9 = T7 + T8; + Ta = T6 + T9; + Tq = FNMS(KP500000000, T9, T6); + Tc = T8 - T7; + } + { + E Te, Tf, Tg, Th; + Te = R1[WS(rs, 4)]; + Tf = R1[0]; + Tg = R1[WS(rs, 2)]; + Th = Tf + Tg; + Ti = FNMS(KP500000000, Th, Te); + Tz = Tg - Tf; + Tu = Te + Th; + } + Cr[WS(csr, 3)] = T5 - Ta; + Ci[WS(csi, 3)] = Tt - Tu; + Td = KP866025403 * (Tb - Tc); + To = Ti - Tn; + Ci[WS(csi, 1)] = Td + To; + Ci[WS(csi, 5)] = To - Td; + { + E Tx, TA, Tv, Tw; + Tx = Tp - Tq; + TA = KP866025403 * (Ty - Tz); + Cr[WS(csr, 5)] = Tx - TA; + Cr[WS(csr, 1)] = Tx + TA; + Tv = T5 + Ta; + Tw = Tt + Tu; + Cr[WS(csr, 6)] = Tv - Tw; + Cr[0] = Tv + Tw; + } + { + E Tr, Ts, TB, TC; + Tr = Tp + Tq; + Ts = Tn + Ti; + Cr[WS(csr, 2)] = Tr - Ts; + Cr[WS(csr, 4)] = Tr + Ts; + TB = Ty + Tz; + TC = Tb + Tc; + Ci[WS(csi, 2)] = KP866025403 * (TB - TC); + Ci[WS(csi, 4)] = KP866025403 * (TC + TB); + } + } + } +} + +static const kr2c_desc desc = { 12, "r2cf_12", {34, 4, 4, 0}, &GENUS }; + +void X(codelet_r2cf_12) (planner *p) { + X(kr2c_register) (p, r2cf_12, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_128.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_128.c new file mode 100644 index 000000000..e72f7133a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_128.c @@ -0,0 +1,3246 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:27 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 128 -name r2cf_128 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 956 FP additions, 516 FP multiplications, + * (or, 440 additions, 0 multiplications, 516 fused multiply/add), + * 186 stack variables, 31 constants, and 256 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_128(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP803207531, +0.803207531480644909806676512963141923879569427); + DK(KP989176509, +0.989176509964780973451673738016243063983689533); + DK(KP741650546, +0.741650546272035369581266691172079863842265220); + DK(KP148335987, +0.148335987538347428753676511486911367000625355); + DK(KP740951125, +0.740951125354959091175616897495162729728955309); + DK(KP998795456, +0.998795456205172392714771604759100694443203615); + DK(KP906347169, +0.906347169019147157946142717268914412664134293); + DK(KP049126849, +0.049126849769467254105343321271313617079695752); + DK(KP970031253, +0.970031253194543992603984207286100251456865962); + DK(KP857728610, +0.857728610000272069902269984284770137042490799); + DK(KP250486960, +0.250486960191305461595702160124721208578685568); + DK(KP599376933, +0.599376933681923766271389869014404232837890546); + DK(KP941544065, +0.941544065183020778412509402599502357185589796); + DK(KP903989293, +0.903989293123443331586200297230537048710132025); + DK(KP357805721, +0.357805721314524104672487743774474392487532769); + DK(KP472964775, +0.472964775891319928124438237972992463904131113); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(512, rs), MAKE_VOLATILE_STRIDE(512, csr), MAKE_VOLATILE_STRIDE(512, csi)) { + E TcD, TdR, T27, T7r, T5P, T8v, Tf, Ta5, Tu, Tbn, TcG, TdS, T2e, T8w, T5S; + E T7s, TK, Ta6, TcK, TdU, T2o, T5U, T7w, T8y, TZ, Ta7, TcN, TdV, T2x, T5V; + E T7z, T8z, T1g, Taa, TcU, Tex, TcX, Tew, T1v, Tab, T2M, T6A, T7E, T9b, T7H; + E T9a, T2T, T6z, T4X, T6L, Tdz, TeL, TdK, TeO, T5G, T6O, T8d, T9p, TaV, Tc3; + E Tbi, Tc4, T8o, T9s, T3I, T6E, Tde, TeE, Tdp, TeH, T4r, T6H, T7U, T9i, Tao; + E TbW, TaL, TbX, T85, T9l, T1L, Tad, Td3, TeA, Td6, Tez, T20, Tae, T37, T6x; + E T7L, T9e, T7O, T9d, T3e, T6w, TbZ, Tc0, T3Z, T4s, Tds, TeF, T4g, T4t, T80; + E T87, Tdl, TeI, T7X, T86, TaD, TaM, Tc6, Tc7, T5e, T5H, TdN, TeM, T5v, T5I; + E T8j, T8q, TdG, TeP, T8g, T8p, Tba, Tbj; + { + E T3, T23, Td, T25, T6, T5N, Ta, T24; + { + E T1, T2, Tb, Tc; + T1 = R0[0]; + T2 = R0[WS(rs, 32)]; + T3 = T1 + T2; + T23 = T1 - T2; + Tb = R0[WS(rs, 56)]; + Tc = R0[WS(rs, 24)]; + Td = Tb + Tc; + T25 = Tb - Tc; + } + { + E T4, T5, T8, T9; + T4 = R0[WS(rs, 16)]; + T5 = R0[WS(rs, 48)]; + T6 = T4 + T5; + T5N = T4 - T5; + T8 = R0[WS(rs, 8)]; + T9 = R0[WS(rs, 40)]; + Ta = T8 + T9; + T24 = T8 - T9; + } + TcD = T3 - T6; + TdR = Td - Ta; + { + E T26, T5O, T7, Te; + T26 = T24 + T25; + T27 = FMA(KP707106781, T26, T23); + T7r = FNMS(KP707106781, T26, T23); + T5O = T25 - T24; + T5P = FNMS(KP707106781, T5O, T5N); + T8v = FMA(KP707106781, T5O, T5N); + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + Ta5 = T7 - Te; + } + } + { + E Ti, T28, Ts, T2c, Tl, T29, Tp, T2b; + { + E Tg, Th, Tq, Tr; + Tg = R0[WS(rs, 4)]; + Th = R0[WS(rs, 36)]; + Ti = Tg + Th; + T28 = Tg - Th; + Tq = R0[WS(rs, 12)]; + Tr = R0[WS(rs, 44)]; + Ts = Tq + Tr; + T2c = Tq - Tr; + } + { + E Tj, Tk, Tn, To; + Tj = R0[WS(rs, 20)]; + Tk = R0[WS(rs, 52)]; + Tl = Tj + Tk; + T29 = Tj - Tk; + Tn = R0[WS(rs, 60)]; + To = R0[WS(rs, 28)]; + Tp = Tn + To; + T2b = Tn - To; + } + { + E Tm, Tt, TcE, TcF; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + Tbn = Tt - Tm; + TcE = Ti - Tl; + TcF = Tp - Ts; + TcG = TcE + TcF; + TdS = TcF - TcE; + } + { + E T2a, T2d, T5Q, T5R; + T2a = FNMS(KP414213562, T29, T28); + T2d = FMA(KP414213562, T2c, T2b); + T2e = T2a + T2d; + T8w = T2d - T2a; + T5Q = FMA(KP414213562, T28, T29); + T5R = FNMS(KP414213562, T2b, T2c); + T5S = T5Q + T5R; + T7s = T5Q - T5R; + } + } + { + E Ty, T2g, TB, T2l, TF, T2m, TI, T2j; + { + E Tw, Tx, Tz, TA; + Tw = R0[WS(rs, 2)]; + Tx = R0[WS(rs, 34)]; + Ty = Tw + Tx; + T2g = Tw - Tx; + Tz = R0[WS(rs, 18)]; + TA = R0[WS(rs, 50)]; + TB = Tz + TA; + T2l = Tz - TA; + { + E TD, TE, T2h, TG, TH, T2i; + TD = R0[WS(rs, 10)]; + TE = R0[WS(rs, 42)]; + T2h = TD - TE; + TG = R0[WS(rs, 58)]; + TH = R0[WS(rs, 26)]; + T2i = TG - TH; + TF = TD + TE; + T2m = T2h - T2i; + TI = TG + TH; + T2j = T2h + T2i; + } + } + { + E TC, TJ, TcI, TcJ; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + Ta6 = TC - TJ; + TcI = Ty - TB; + TcJ = TI - TF; + TcK = FMA(KP414213562, TcJ, TcI); + TdU = FNMS(KP414213562, TcI, TcJ); + } + { + E T2k, T2n, T7u, T7v; + T2k = FMA(KP707106781, T2j, T2g); + T2n = FMA(KP707106781, T2m, T2l); + T2o = FNMS(KP198912367, T2n, T2k); + T5U = FMA(KP198912367, T2k, T2n); + T7u = FNMS(KP707106781, T2j, T2g); + T7v = FNMS(KP707106781, T2m, T2l); + T7w = FMA(KP668178637, T7v, T7u); + T8y = FNMS(KP668178637, T7u, T7v); + } + } + { + E TN, T2p, TQ, T2u, TU, T2v, TX, T2s; + { + E TL, TM, TO, TP; + TL = R0[WS(rs, 62)]; + TM = R0[WS(rs, 30)]; + TN = TL + TM; + T2p = TL - TM; + TO = R0[WS(rs, 14)]; + TP = R0[WS(rs, 46)]; + TQ = TO + TP; + T2u = TO - TP; + { + E TS, TT, T2q, TV, TW, T2r; + TS = R0[WS(rs, 6)]; + TT = R0[WS(rs, 38)]; + T2q = TS - TT; + TV = R0[WS(rs, 54)]; + TW = R0[WS(rs, 22)]; + T2r = TV - TW; + TU = TS + TT; + T2v = T2q - T2r; + TX = TV + TW; + T2s = T2q + T2r; + } + } + { + E TR, TY, TcL, TcM; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + Ta7 = TR - TY; + TcL = TN - TQ; + TcM = TX - TU; + TcN = FNMS(KP414213562, TcM, TcL); + TdV = FMA(KP414213562, TcL, TcM); + } + { + E T2t, T2w, T7x, T7y; + T2t = FMA(KP707106781, T2s, T2p); + T2w = FMA(KP707106781, T2v, T2u); + T2x = FMA(KP198912367, T2w, T2t); + T5V = FNMS(KP198912367, T2t, T2w); + T7x = FNMS(KP707106781, T2s, T2p); + T7y = FNMS(KP707106781, T2v, T2u); + T7z = FNMS(KP668178637, T7y, T7x); + T8z = FMA(KP668178637, T7x, T7y); + } + } + { + E T14, T2A, T17, T2N, T1b, T2O, T1e, T2D, T1j, T1m, T2H, TcR, T2Q, T1q, T1t; + E T2K, TcS, T2R; + { + E T12, T13, T15, T16; + T12 = R0[WS(rs, 1)]; + T13 = R0[WS(rs, 33)]; + T14 = T12 + T13; + T2A = T12 - T13; + T15 = R0[WS(rs, 17)]; + T16 = R0[WS(rs, 49)]; + T17 = T15 + T16; + T2N = T15 - T16; + } + { + E T19, T1a, T2B, T1c, T1d, T2C; + T19 = R0[WS(rs, 9)]; + T1a = R0[WS(rs, 41)]; + T2B = T19 - T1a; + T1c = R0[WS(rs, 57)]; + T1d = R0[WS(rs, 25)]; + T2C = T1c - T1d; + T1b = T19 + T1a; + T2O = T2B - T2C; + T1e = T1c + T1d; + T2D = T2B + T2C; + } + { + E T2F, T2G, T2I, T2J; + { + E T1h, T1i, T1k, T1l; + T1h = R0[WS(rs, 5)]; + T1i = R0[WS(rs, 37)]; + T1j = T1h + T1i; + T2F = T1h - T1i; + T1k = R0[WS(rs, 21)]; + T1l = R0[WS(rs, 53)]; + T1m = T1k + T1l; + T2G = T1k - T1l; + } + T2H = FNMS(KP414213562, T2G, T2F); + TcR = T1j - T1m; + T2Q = FMA(KP414213562, T2F, T2G); + { + E T1o, T1p, T1r, T1s; + T1o = R0[WS(rs, 61)]; + T1p = R0[WS(rs, 29)]; + T1q = T1o + T1p; + T2I = T1o - T1p; + T1r = R0[WS(rs, 13)]; + T1s = R0[WS(rs, 45)]; + T1t = T1r + T1s; + T2J = T1r - T1s; + } + T2K = FMA(KP414213562, T2J, T2I); + TcS = T1q - T1t; + T2R = FNMS(KP414213562, T2I, T2J); + } + { + E T18, T1f, TcQ, TcT; + T18 = T14 + T17; + T1f = T1b + T1e; + T1g = T18 + T1f; + Taa = T18 - T1f; + TcQ = T14 - T17; + TcT = TcR + TcS; + TcU = FMA(KP707106781, TcT, TcQ); + Tex = FNMS(KP707106781, TcT, TcQ); + } + { + E TcV, TcW, T1n, T1u; + TcV = T1e - T1b; + TcW = TcS - TcR; + TcX = FMA(KP707106781, TcW, TcV); + Tew = FNMS(KP707106781, TcW, TcV); + T1n = T1j + T1m; + T1u = T1q + T1t; + T1v = T1n + T1u; + Tab = T1u - T1n; + } + { + E T2E, T2L, T7C, T7D; + T2E = FMA(KP707106781, T2D, T2A); + T2L = T2H + T2K; + T2M = FMA(KP923879532, T2L, T2E); + T6A = FNMS(KP923879532, T2L, T2E); + T7C = FNMS(KP707106781, T2D, T2A); + T7D = T2Q - T2R; + T7E = FMA(KP923879532, T7D, T7C); + T9b = FNMS(KP923879532, T7D, T7C); + } + { + E T7F, T7G, T2P, T2S; + T7F = FNMS(KP707106781, T2O, T2N); + T7G = T2K - T2H; + T7H = FMA(KP923879532, T7G, T7F); + T9a = FNMS(KP923879532, T7G, T7F); + T2P = FMA(KP707106781, T2O, T2N); + T2S = T2Q + T2R; + T2T = FMA(KP923879532, T2S, T2P); + T6z = FNMS(KP923879532, T2S, T2P); + } + } + { + E T4z, TaP, T5A, TaQ, T4G, TaT, T5B, TaS, Tbf, Tbg, T4O, Tdw, T5D, Tbc, Tbd; + E T4V, Tdx, T5E; + { + E T4x, T4y, T5y, T5z; + T4x = R1[WS(rs, 63)]; + T4y = R1[WS(rs, 31)]; + T4z = T4x - T4y; + TaP = T4x + T4y; + T5y = R1[WS(rs, 47)]; + T5z = R1[WS(rs, 15)]; + T5A = T5y - T5z; + TaQ = T5z + T5y; + } + { + E T4A, T4B, T4C, T4D, T4E, T4F; + T4A = R1[WS(rs, 7)]; + T4B = R1[WS(rs, 39)]; + T4C = T4A - T4B; + T4D = R1[WS(rs, 55)]; + T4E = R1[WS(rs, 23)]; + T4F = T4D - T4E; + T4G = T4C + T4F; + TaT = T4D + T4E; + T5B = T4F - T4C; + TaS = T4A + T4B; + } + { + E T4K, T4N, T4R, T4U; + { + E T4I, T4J, T4L, T4M; + T4I = R1[WS(rs, 3)]; + T4J = R1[WS(rs, 35)]; + T4K = T4I - T4J; + Tbf = T4I + T4J; + T4L = R1[WS(rs, 51)]; + T4M = R1[WS(rs, 19)]; + T4N = T4L - T4M; + Tbg = T4M + T4L; + } + T4O = FMA(KP414213562, T4N, T4K); + Tdw = Tbf - Tbg; + T5D = FNMS(KP414213562, T4K, T4N); + { + E T4P, T4Q, T4S, T4T; + T4P = R1[WS(rs, 59)]; + T4Q = R1[WS(rs, 27)]; + T4R = T4P - T4Q; + Tbc = T4P + T4Q; + T4S = R1[WS(rs, 43)]; + T4T = R1[WS(rs, 11)]; + T4U = T4S - T4T; + Tbd = T4T + T4S; + } + T4V = FNMS(KP414213562, T4U, T4R); + Tdx = Tbc - Tbd; + T5E = FMA(KP414213562, T4R, T4U); + } + { + E T4H, T4W, Tdv, Tdy; + T4H = FMA(KP707106781, T4G, T4z); + T4W = T4O + T4V; + T4X = FMA(KP923879532, T4W, T4H); + T6L = FNMS(KP923879532, T4W, T4H); + Tdv = TaP - TaQ; + Tdy = Tdw + Tdx; + Tdz = FMA(KP707106781, Tdy, Tdv); + TeL = FNMS(KP707106781, Tdy, Tdv); + } + { + E TdI, TdJ, T5C, T5F; + TdI = TaT - TaS; + TdJ = Tdx - Tdw; + TdK = FMA(KP707106781, TdJ, TdI); + TeO = FNMS(KP707106781, TdJ, TdI); + T5C = FMA(KP707106781, T5B, T5A); + T5F = T5D + T5E; + T5G = FMA(KP923879532, T5F, T5C); + T6O = FNMS(KP923879532, T5F, T5C); + } + { + E T8b, T8c, TaR, TaU; + T8b = FNMS(KP707106781, T4G, T4z); + T8c = T5E - T5D; + T8d = FMA(KP923879532, T8c, T8b); + T9p = FNMS(KP923879532, T8c, T8b); + TaR = TaP + TaQ; + TaU = TaS + TaT; + TaV = TaR - TaU; + Tc3 = TaR + TaU; + } + { + E Tbe, Tbh, T8m, T8n; + Tbe = Tbc + Tbd; + Tbh = Tbf + Tbg; + Tbi = Tbe - Tbh; + Tc4 = Tbh + Tbe; + T8m = FNMS(KP707106781, T5B, T5A); + T8n = T4V - T4O; + T8o = FNMS(KP923879532, T8n, T8m); + T9s = FMA(KP923879532, T8n, T8m); + } + } + { + E T3k, Tai, T4l, Taj, T3r, Tam, T4m, Tal, TaI, TaJ, T3z, Tdb, T4o, TaF, TaG; + E T3G, Tdc, T4p; + { + E T3i, T3j, T4j, T4k; + T3i = R1[0]; + T3j = R1[WS(rs, 32)]; + T3k = T3i - T3j; + Tai = T3i + T3j; + T4j = R1[WS(rs, 16)]; + T4k = R1[WS(rs, 48)]; + T4l = T4j - T4k; + Taj = T4j + T4k; + } + { + E T3l, T3m, T3n, T3o, T3p, T3q; + T3l = R1[WS(rs, 8)]; + T3m = R1[WS(rs, 40)]; + T3n = T3l - T3m; + T3o = R1[WS(rs, 56)]; + T3p = R1[WS(rs, 24)]; + T3q = T3o - T3p; + T3r = T3n + T3q; + Tam = T3o + T3p; + T4m = T3n - T3q; + Tal = T3l + T3m; + } + { + E T3v, T3y, T3C, T3F; + { + E T3t, T3u, T3w, T3x; + T3t = R1[WS(rs, 4)]; + T3u = R1[WS(rs, 36)]; + T3v = T3t - T3u; + TaI = T3t + T3u; + T3w = R1[WS(rs, 20)]; + T3x = R1[WS(rs, 52)]; + T3y = T3w - T3x; + TaJ = T3w + T3x; + } + T3z = FNMS(KP414213562, T3y, T3v); + Tdb = TaI - TaJ; + T4o = FMA(KP414213562, T3v, T3y); + { + E T3A, T3B, T3D, T3E; + T3A = R1[WS(rs, 60)]; + T3B = R1[WS(rs, 28)]; + T3C = T3A - T3B; + TaF = T3A + T3B; + T3D = R1[WS(rs, 12)]; + T3E = R1[WS(rs, 44)]; + T3F = T3D - T3E; + TaG = T3D + T3E; + } + T3G = FMA(KP414213562, T3F, T3C); + Tdc = TaF - TaG; + T4p = FNMS(KP414213562, T3C, T3F); + } + { + E T3s, T3H, Tda, Tdd; + T3s = FMA(KP707106781, T3r, T3k); + T3H = T3z + T3G; + T3I = FMA(KP923879532, T3H, T3s); + T6E = FNMS(KP923879532, T3H, T3s); + Tda = Tai - Taj; + Tdd = Tdb + Tdc; + Tde = FMA(KP707106781, Tdd, Tda); + TeE = FNMS(KP707106781, Tdd, Tda); + } + { + E Tdn, Tdo, T4n, T4q; + Tdn = Tam - Tal; + Tdo = Tdc - Tdb; + Tdp = FMA(KP707106781, Tdo, Tdn); + TeH = FNMS(KP707106781, Tdo, Tdn); + T4n = FMA(KP707106781, T4m, T4l); + T4q = T4o + T4p; + T4r = FMA(KP923879532, T4q, T4n); + T6H = FNMS(KP923879532, T4q, T4n); + } + { + E T7S, T7T, Tak, Tan; + T7S = FNMS(KP707106781, T3r, T3k); + T7T = T4o - T4p; + T7U = FMA(KP923879532, T7T, T7S); + T9i = FNMS(KP923879532, T7T, T7S); + Tak = Tai + Taj; + Tan = Tal + Tam; + Tao = Tak - Tan; + TbW = Tak + Tan; + } + { + E TaH, TaK, T83, T84; + TaH = TaF + TaG; + TaK = TaI + TaJ; + TaL = TaH - TaK; + TbX = TaK + TaH; + T83 = FNMS(KP707106781, T4m, T4l); + T84 = T3G - T3z; + T85 = FMA(KP923879532, T84, T83); + T9l = FNMS(KP923879532, T84, T83); + } + } + { + E T1z, T2V, T1C, T38, T1G, T39, T1J, T2Y, T1O, T1R, T32, Td0, T3b, T1V, T1Y; + E T35, Td1, T3c; + { + E T1x, T1y, T1A, T1B; + T1x = R0[WS(rs, 63)]; + T1y = R0[WS(rs, 31)]; + T1z = T1x + T1y; + T2V = T1x - T1y; + T1A = R0[WS(rs, 15)]; + T1B = R0[WS(rs, 47)]; + T1C = T1A + T1B; + T38 = T1A - T1B; + } + { + E T1E, T1F, T2W, T1H, T1I, T2X; + T1E = R0[WS(rs, 7)]; + T1F = R0[WS(rs, 39)]; + T2W = T1E - T1F; + T1H = R0[WS(rs, 55)]; + T1I = R0[WS(rs, 23)]; + T2X = T1H - T1I; + T1G = T1E + T1F; + T39 = T2W - T2X; + T1J = T1H + T1I; + T2Y = T2W + T2X; + } + { + E T30, T31, T33, T34; + { + E T1M, T1N, T1P, T1Q; + T1M = R0[WS(rs, 3)]; + T1N = R0[WS(rs, 35)]; + T1O = T1M + T1N; + T30 = T1M - T1N; + T1P = R0[WS(rs, 19)]; + T1Q = R0[WS(rs, 51)]; + T1R = T1P + T1Q; + T31 = T1P - T1Q; + } + T32 = FNMS(KP414213562, T31, T30); + Td0 = T1O - T1R; + T3b = FMA(KP414213562, T30, T31); + { + E T1T, T1U, T1W, T1X; + T1T = R0[WS(rs, 59)]; + T1U = R0[WS(rs, 27)]; + T1V = T1T + T1U; + T33 = T1T - T1U; + T1W = R0[WS(rs, 11)]; + T1X = R0[WS(rs, 43)]; + T1Y = T1W + T1X; + T34 = T1W - T1X; + } + T35 = FMA(KP414213562, T34, T33); + Td1 = T1V - T1Y; + T3c = FNMS(KP414213562, T33, T34); + } + { + E T1D, T1K, TcZ, Td2; + T1D = T1z + T1C; + T1K = T1G + T1J; + T1L = T1D + T1K; + Tad = T1D - T1K; + TcZ = T1z - T1C; + Td2 = Td0 + Td1; + Td3 = FMA(KP707106781, Td2, TcZ); + TeA = FNMS(KP707106781, Td2, TcZ); + } + { + E Td4, Td5, T1S, T1Z; + Td4 = T1J - T1G; + Td5 = Td1 - Td0; + Td6 = FMA(KP707106781, Td5, Td4); + Tez = FNMS(KP707106781, Td5, Td4); + T1S = T1O + T1R; + T1Z = T1V + T1Y; + T20 = T1S + T1Z; + Tae = T1Z - T1S; + } + { + E T2Z, T36, T7J, T7K; + T2Z = FMA(KP707106781, T2Y, T2V); + T36 = T32 + T35; + T37 = FMA(KP923879532, T36, T2Z); + T6x = FNMS(KP923879532, T36, T2Z); + T7J = FNMS(KP707106781, T2Y, T2V); + T7K = T3b - T3c; + T7L = FMA(KP923879532, T7K, T7J); + T9e = FNMS(KP923879532, T7K, T7J); + } + { + E T7M, T7N, T3a, T3d; + T7M = FNMS(KP707106781, T39, T38); + T7N = T35 - T32; + T7O = FMA(KP923879532, T7N, T7M); + T9d = FNMS(KP923879532, T7N, T7M); + T3a = FMA(KP707106781, T39, T38); + T3d = T3b + T3c; + T3e = FMA(KP923879532, T3d, T3a); + T6w = FNMS(KP923879532, T3d, T3a); + } + } + { + E T3L, Tdf, T3W, Tar, T42, Tdi, T4d, Tay, T3S, Tdg, T3X, Tau, T49, Tdj, T4e; + E TaB, Tdh, Tdk; + { + E T3J, T3K, Tap, T3U, T3V, Taq; + T3J = R1[WS(rs, 2)]; + T3K = R1[WS(rs, 34)]; + Tap = T3J + T3K; + T3U = R1[WS(rs, 18)]; + T3V = R1[WS(rs, 50)]; + Taq = T3U + T3V; + T3L = T3J - T3K; + Tdf = Tap - Taq; + T3W = T3U - T3V; + Tar = Tap + Taq; + } + { + E T40, T41, Taw, T4b, T4c, Tax; + T40 = R1[WS(rs, 62)]; + T41 = R1[WS(rs, 30)]; + Taw = T40 + T41; + T4b = R1[WS(rs, 14)]; + T4c = R1[WS(rs, 46)]; + Tax = T4b + T4c; + T42 = T40 - T41; + Tdi = Taw - Tax; + T4d = T4b - T4c; + Tay = Taw + Tax; + } + { + E T3O, Tas, T3R, Tat; + { + E T3M, T3N, T3P, T3Q; + T3M = R1[WS(rs, 10)]; + T3N = R1[WS(rs, 42)]; + T3O = T3M - T3N; + Tas = T3M + T3N; + T3P = R1[WS(rs, 58)]; + T3Q = R1[WS(rs, 26)]; + T3R = T3P - T3Q; + Tat = T3P + T3Q; + } + T3S = T3O + T3R; + Tdg = Tat - Tas; + T3X = T3O - T3R; + Tau = Tas + Tat; + } + { + E T45, Taz, T48, TaA; + { + E T43, T44, T46, T47; + T43 = R1[WS(rs, 6)]; + T44 = R1[WS(rs, 38)]; + T45 = T43 - T44; + Taz = T43 + T44; + T46 = R1[WS(rs, 54)]; + T47 = R1[WS(rs, 22)]; + T48 = T46 - T47; + TaA = T46 + T47; + } + T49 = T45 + T48; + Tdj = TaA - Taz; + T4e = T45 - T48; + TaB = Taz + TaA; + } + TbZ = Tar + Tau; + Tc0 = Tay + TaB; + { + E T3T, T3Y, Tdq, Tdr; + T3T = FMA(KP707106781, T3S, T3L); + T3Y = FMA(KP707106781, T3X, T3W); + T3Z = FNMS(KP198912367, T3Y, T3T); + T4s = FMA(KP198912367, T3T, T3Y); + Tdq = FNMS(KP414213562, Tdf, Tdg); + Tdr = FMA(KP414213562, Tdi, Tdj); + Tds = Tdq + Tdr; + TeF = Tdr - Tdq; + } + { + E T4a, T4f, T7Y, T7Z; + T4a = FMA(KP707106781, T49, T42); + T4f = FMA(KP707106781, T4e, T4d); + T4g = FMA(KP198912367, T4f, T4a); + T4t = FNMS(KP198912367, T4a, T4f); + T7Y = FNMS(KP707106781, T49, T42); + T7Z = FNMS(KP707106781, T4e, T4d); + T80 = FNMS(KP668178637, T7Z, T7Y); + T87 = FMA(KP668178637, T7Y, T7Z); + } + Tdh = FMA(KP414213562, Tdg, Tdf); + Tdk = FNMS(KP414213562, Tdj, Tdi); + Tdl = Tdh + Tdk; + TeI = Tdh - Tdk; + { + E T7V, T7W, Tav, TaC; + T7V = FNMS(KP707106781, T3S, T3L); + T7W = FNMS(KP707106781, T3X, T3W); + T7X = FMA(KP668178637, T7W, T7V); + T86 = FNMS(KP668178637, T7V, T7W); + Tav = Tar - Tau; + TaC = Tay - TaB; + TaD = Tav + TaC; + TaM = TaC - Tav; + } + } + { + E T50, TdA, T5b, TaY, T5h, TdD, T5s, Tb5, T57, TdB, T5c, Tb1, T5o, TdE, T5t; + E Tb8, TdC, TdF; + { + E T4Y, T4Z, TaW, T59, T5a, TaX; + T4Y = R1[WS(rs, 1)]; + T4Z = R1[WS(rs, 33)]; + TaW = T4Y + T4Z; + T59 = R1[WS(rs, 49)]; + T5a = R1[WS(rs, 17)]; + TaX = T5a + T59; + T50 = T4Y - T4Z; + TdA = TaW - TaX; + T5b = T59 - T5a; + TaY = TaW + TaX; + } + { + E T5f, T5g, Tb3, T5q, T5r, Tb4; + T5f = R1[WS(rs, 61)]; + T5g = R1[WS(rs, 29)]; + Tb3 = T5f + T5g; + T5q = R1[WS(rs, 45)]; + T5r = R1[WS(rs, 13)]; + Tb4 = T5r + T5q; + T5h = T5f - T5g; + TdD = Tb3 - Tb4; + T5s = T5q - T5r; + Tb5 = Tb3 + Tb4; + } + { + E T53, TaZ, T56, Tb0; + { + E T51, T52, T54, T55; + T51 = R1[WS(rs, 9)]; + T52 = R1[WS(rs, 41)]; + T53 = T51 - T52; + TaZ = T51 + T52; + T54 = R1[WS(rs, 57)]; + T55 = R1[WS(rs, 25)]; + T56 = T54 - T55; + Tb0 = T54 + T55; + } + T57 = T53 + T56; + TdB = Tb0 - TaZ; + T5c = T56 - T53; + Tb1 = TaZ + Tb0; + } + { + E T5k, Tb6, T5n, Tb7; + { + E T5i, T5j, T5l, T5m; + T5i = R1[WS(rs, 5)]; + T5j = R1[WS(rs, 37)]; + T5k = T5i - T5j; + Tb6 = T5i + T5j; + T5l = R1[WS(rs, 53)]; + T5m = R1[WS(rs, 21)]; + T5n = T5l - T5m; + Tb7 = T5l + T5m; + } + T5o = T5k + T5n; + TdE = Tb7 - Tb6; + T5t = T5n - T5k; + Tb8 = Tb6 + Tb7; + } + Tc6 = TaY + Tb1; + Tc7 = Tb5 + Tb8; + { + E T58, T5d, TdL, TdM; + T58 = FMA(KP707106781, T57, T50); + T5d = FMA(KP707106781, T5c, T5b); + T5e = FMA(KP198912367, T5d, T58); + T5H = FNMS(KP198912367, T58, T5d); + TdL = FNMS(KP414213562, TdA, TdB); + TdM = FMA(KP414213562, TdD, TdE); + TdN = TdL + TdM; + TeM = TdM - TdL; + } + { + E T5p, T5u, T8h, T8i; + T5p = FMA(KP707106781, T5o, T5h); + T5u = FMA(KP707106781, T5t, T5s); + T5v = FNMS(KP198912367, T5u, T5p); + T5I = FMA(KP198912367, T5p, T5u); + T8h = FNMS(KP707106781, T5o, T5h); + T8i = FNMS(KP707106781, T5t, T5s); + T8j = FMA(KP668178637, T8i, T8h); + T8q = FNMS(KP668178637, T8h, T8i); + } + TdC = FMA(KP414213562, TdB, TdA); + TdF = FNMS(KP414213562, TdE, TdD); + TdG = TdC + TdF; + TeP = TdF - TdC; + { + E T8e, T8f, Tb2, Tb9; + T8e = FNMS(KP707106781, T57, T50); + T8f = FNMS(KP707106781, T5c, T5b); + T8g = FNMS(KP668178637, T8f, T8e); + T8p = FMA(KP668178637, T8e, T8f); + Tb2 = TaY - Tb1; + Tb9 = Tb5 - Tb8; + Tba = Tb2 + Tb9; + Tbj = Tb9 - Tb2; + } + } + { + E T11, TbV, Tc9, Tcf, T22, Tcb, Tc2, Tce; + { + E Tv, T10, Tc5, Tc8; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + TbV = Tv - T10; + Tc5 = Tc3 + Tc4; + Tc8 = Tc6 + Tc7; + Tc9 = Tc5 - Tc8; + Tcf = Tc5 + Tc8; + } + { + E T1w, T21, TbY, Tc1; + T1w = T1g + T1v; + T21 = T1L + T20; + T22 = T1w + T21; + Tcb = T21 - T1w; + TbY = TbW + TbX; + Tc1 = TbZ + Tc0; + Tc2 = TbY - Tc1; + Tce = TbY + Tc1; + } + Cr[WS(csr, 32)] = T11 - T22; + Ci[WS(csi, 32)] = Tcf - Tce; + { + E Tca, Tcc, Tcd, Tcg; + Tca = Tc2 + Tc9; + Cr[WS(csr, 48)] = FNMS(KP707106781, Tca, TbV); + Cr[WS(csr, 16)] = FMA(KP707106781, Tca, TbV); + Tcc = Tc9 - Tc2; + Ci[WS(csi, 16)] = FMA(KP707106781, Tcc, Tcb); + Ci[WS(csi, 48)] = FMS(KP707106781, Tcc, Tcb); + Tcd = T11 + T22; + Tcg = Tce + Tcf; + Cr[WS(csr, 64)] = Tcd - Tcg; + Cr[0] = Tcd + Tcg; + } + } + { + E Tch, Tct, Tck, Tcu, Tco, Tcy, Tcr, Tcz, Tci, Tcj; + Tch = Tf - Tu; + Tct = TZ - TK; + Tci = T1g - T1v; + Tcj = T1L - T20; + Tck = Tci + Tcj; + Tcu = Tcj - Tci; + { + E Tcm, Tcn, Tcp, Tcq; + Tcm = TbW - TbX; + Tcn = Tc0 - TbZ; + Tco = FMA(KP414213562, Tcn, Tcm); + Tcy = FNMS(KP414213562, Tcm, Tcn); + Tcp = Tc3 - Tc4; + Tcq = Tc7 - Tc6; + Tcr = FNMS(KP414213562, Tcq, Tcp); + Tcz = FMA(KP414213562, Tcp, Tcq); + } + { + E Tcl, Tcs, Tcx, TcA; + Tcl = FMA(KP707106781, Tck, Tch); + Tcs = Tco + Tcr; + Cr[WS(csr, 56)] = FNMS(KP923879532, Tcs, Tcl); + Cr[WS(csr, 8)] = FMA(KP923879532, Tcs, Tcl); + Tcx = FMA(KP707106781, Tcu, Tct); + TcA = Tcy + Tcz; + Ci[WS(csi, 8)] = FMA(KP923879532, TcA, Tcx); + Ci[WS(csi, 56)] = FMS(KP923879532, TcA, Tcx); + } + { + E Tcv, Tcw, TcB, TcC; + Tcv = FNMS(KP707106781, Tcu, Tct); + Tcw = Tcr - Tco; + Ci[WS(csi, 24)] = FMS(KP923879532, Tcw, Tcv); + Ci[WS(csi, 40)] = FMA(KP923879532, Tcw, Tcv); + TcB = FNMS(KP707106781, Tck, Tch); + TcC = Tcz - Tcy; + Cr[WS(csr, 40)] = FNMS(KP923879532, TcC, TcB); + Cr[WS(csr, 24)] = FMA(KP923879532, TcC, TcB); + } + } + { + E Ta9, TbB, Tbp, TbL, Tag, TbM, TbJ, TbR, TaO, Tbw, Tbs, TbC, TbG, TbQ, Tbl; + E Tbx, Ta8, Tbo; + Ta8 = Ta6 + Ta7; + Ta9 = FMA(KP707106781, Ta8, Ta5); + TbB = FNMS(KP707106781, Ta8, Ta5); + Tbo = Ta7 - Ta6; + Tbp = FMA(KP707106781, Tbo, Tbn); + TbL = FNMS(KP707106781, Tbo, Tbn); + { + E Tac, Taf, TbH, TbI; + Tac = FMA(KP414213562, Tab, Taa); + Taf = FNMS(KP414213562, Tae, Tad); + Tag = Tac + Taf; + TbM = Taf - Tac; + TbH = FNMS(KP707106781, Tba, TaV); + TbI = FNMS(KP707106781, Tbj, Tbi); + TbJ = FMA(KP668178637, TbI, TbH); + TbR = FNMS(KP668178637, TbH, TbI); + } + { + E TaE, TaN, Tbq, Tbr; + TaE = FMA(KP707106781, TaD, Tao); + TaN = FMA(KP707106781, TaM, TaL); + TaO = FMA(KP198912367, TaN, TaE); + Tbw = FNMS(KP198912367, TaE, TaN); + Tbq = FNMS(KP414213562, Taa, Tab); + Tbr = FMA(KP414213562, Tad, Tae); + Tbs = Tbq + Tbr; + TbC = Tbr - Tbq; + } + { + E TbE, TbF, Tbb, Tbk; + TbE = FNMS(KP707106781, TaD, Tao); + TbF = FNMS(KP707106781, TaM, TaL); + TbG = FNMS(KP668178637, TbF, TbE); + TbQ = FMA(KP668178637, TbE, TbF); + Tbb = FMA(KP707106781, Tba, TaV); + Tbk = FMA(KP707106781, Tbj, Tbi); + Tbl = FNMS(KP198912367, Tbk, Tbb); + Tbx = FMA(KP198912367, Tbb, Tbk); + } + { + E Tah, Tbm, Tbv, Tby; + Tah = FMA(KP923879532, Tag, Ta9); + Tbm = TaO + Tbl; + Cr[WS(csr, 60)] = FNMS(KP980785280, Tbm, Tah); + Cr[WS(csr, 4)] = FMA(KP980785280, Tbm, Tah); + Tbv = FMA(KP923879532, Tbs, Tbp); + Tby = Tbw + Tbx; + Ci[WS(csi, 4)] = FMA(KP980785280, Tby, Tbv); + Ci[WS(csi, 60)] = FMS(KP980785280, Tby, Tbv); + } + { + E Tbt, Tbu, Tbz, TbA; + Tbt = FNMS(KP923879532, Tbs, Tbp); + Tbu = Tbl - TaO; + Ci[WS(csi, 28)] = FMS(KP980785280, Tbu, Tbt); + Ci[WS(csi, 36)] = FMA(KP980785280, Tbu, Tbt); + Tbz = FNMS(KP923879532, Tag, Ta9); + TbA = Tbx - Tbw; + Cr[WS(csr, 36)] = FNMS(KP980785280, TbA, Tbz); + Cr[WS(csr, 28)] = FMA(KP980785280, TbA, Tbz); + } + { + E TbD, TbK, TbP, TbS; + TbD = FMA(KP923879532, TbC, TbB); + TbK = TbG + TbJ; + Cr[WS(csr, 52)] = FNMS(KP831469612, TbK, TbD); + Cr[WS(csr, 12)] = FMA(KP831469612, TbK, TbD); + TbP = FNMS(KP923879532, TbM, TbL); + TbS = TbQ + TbR; + Ci[WS(csi, 12)] = -(FMA(KP831469612, TbS, TbP)); + Ci[WS(csi, 52)] = FNMS(KP831469612, TbS, TbP); + } + { + E TbN, TbO, TbT, TbU; + TbN = FMA(KP923879532, TbM, TbL); + TbO = TbJ - TbG; + Ci[WS(csi, 20)] = FMA(KP831469612, TbO, TbN); + Ci[WS(csi, 44)] = FMS(KP831469612, TbO, TbN); + TbT = FNMS(KP923879532, TbC, TbB); + TbU = TbQ - TbR; + Cr[WS(csr, 44)] = FNMS(KP831469612, TbU, TbT); + Cr[WS(csr, 20)] = FMA(KP831469612, TbU, TbT); + } + } + { + E Tev, Tf7, Tfc, Tfm, Tff, Tfn, TeC, Tfi, TeK, Tf2, TeV, Tfh, TeY, Tf8, TeR; + E Tf3; + { + E Tet, Teu, Tfa, Tfb; + Tet = FNMS(KP707106781, TcG, TcD); + Teu = TdV - TdU; + Tev = FNMS(KP923879532, Teu, Tet); + Tf7 = FMA(KP923879532, Teu, Tet); + Tfa = FMA(KP923879532, TeF, TeE); + Tfb = FMA(KP923879532, TeI, TeH); + Tfc = FNMS(KP303346683, Tfb, Tfa); + Tfm = FMA(KP303346683, Tfa, Tfb); + } + { + E Tfd, Tfe, Tey, TeB; + Tfd = FMA(KP923879532, TeM, TeL); + Tfe = FNMS(KP923879532, TeP, TeO); + Tff = FMA(KP303346683, Tfe, Tfd); + Tfn = FNMS(KP303346683, Tfd, Tfe); + Tey = FMA(KP668178637, Tex, Tew); + TeB = FNMS(KP668178637, TeA, Tez); + TeC = Tey - TeB; + Tfi = Tey + TeB; + } + { + E TeG, TeJ, TeT, TeU; + TeG = FNMS(KP923879532, TeF, TeE); + TeJ = FNMS(KP923879532, TeI, TeH); + TeK = FMA(KP534511135, TeJ, TeG); + Tf2 = FNMS(KP534511135, TeG, TeJ); + TeT = FNMS(KP707106781, TdS, TdR); + TeU = TcN - TcK; + TeV = FMA(KP923879532, TeU, TeT); + Tfh = FNMS(KP923879532, TeU, TeT); + } + { + E TeW, TeX, TeN, TeQ; + TeW = FMA(KP668178637, Tez, TeA); + TeX = FNMS(KP668178637, Tew, Tex); + TeY = TeW - TeX; + Tf8 = TeX + TeW; + TeN = FNMS(KP923879532, TeM, TeL); + TeQ = FMA(KP923879532, TeP, TeO); + TeR = FNMS(KP534511135, TeQ, TeN); + Tf3 = FMA(KP534511135, TeN, TeQ); + } + { + E TeD, TeS, Tf1, Tf4; + TeD = FMA(KP831469612, TeC, Tev); + TeS = TeK + TeR; + Cr[WS(csr, 54)] = FNMS(KP881921264, TeS, TeD); + Cr[WS(csr, 10)] = FMA(KP881921264, TeS, TeD); + Tf1 = FMA(KP831469612, TeY, TeV); + Tf4 = Tf2 + Tf3; + Ci[WS(csi, 10)] = FMA(KP881921264, Tf4, Tf1); + Ci[WS(csi, 54)] = FMS(KP881921264, Tf4, Tf1); + } + { + E TeZ, Tf0, Tf5, Tf6; + TeZ = FNMS(KP831469612, TeY, TeV); + Tf0 = TeR - TeK; + Ci[WS(csi, 22)] = FMS(KP881921264, Tf0, TeZ); + Ci[WS(csi, 42)] = FMA(KP881921264, Tf0, TeZ); + Tf5 = FNMS(KP831469612, TeC, Tev); + Tf6 = Tf3 - Tf2; + Cr[WS(csr, 42)] = FNMS(KP881921264, Tf6, Tf5); + Cr[WS(csr, 22)] = FMA(KP881921264, Tf6, Tf5); + } + { + E Tf9, Tfg, Tfl, Tfo; + Tf9 = FMA(KP831469612, Tf8, Tf7); + Tfg = Tfc + Tff; + Cr[WS(csr, 58)] = FNMS(KP956940335, Tfg, Tf9); + Cr[WS(csr, 6)] = FMA(KP956940335, Tfg, Tf9); + Tfl = FMA(KP831469612, Tfi, Tfh); + Tfo = Tfm + Tfn; + Ci[WS(csi, 6)] = -(FMA(KP956940335, Tfo, Tfl)); + Ci[WS(csi, 58)] = FNMS(KP956940335, Tfo, Tfl); + } + { + E Tfj, Tfk, Tfp, Tfq; + Tfj = FNMS(KP831469612, Tfi, Tfh); + Tfk = Tff - Tfc; + Ci[WS(csi, 26)] = FMA(KP956940335, Tfk, Tfj); + Ci[WS(csi, 38)] = FMS(KP956940335, Tfk, Tfj); + Tfp = FNMS(KP831469612, Tf8, Tf7); + Tfq = Tfm - Tfn; + Cr[WS(csr, 38)] = FNMS(KP956940335, Tfq, Tfp); + Cr[WS(csr, 26)] = FMA(KP956940335, Tfq, Tfp); + } + } + { + E TcP, Te9, Tee, Teo, Teh, Tep, Td8, Tek, Tdu, Te4, TdX, Tej, Te0, Tea, TdP; + E Te5; + { + E TcH, TcO, Tec, Ted; + TcH = FMA(KP707106781, TcG, TcD); + TcO = TcK + TcN; + TcP = FMA(KP923879532, TcO, TcH); + Te9 = FNMS(KP923879532, TcO, TcH); + Tec = FNMS(KP923879532, Tdl, Tde); + Ted = FNMS(KP923879532, Tds, Tdp); + Tee = FNMS(KP820678790, Ted, Tec); + Teo = FMA(KP820678790, Tec, Ted); + } + { + E Tef, Teg, TcY, Td7; + Tef = FNMS(KP923879532, TdG, Tdz); + Teg = FNMS(KP923879532, TdN, TdK); + Teh = FMA(KP820678790, Teg, Tef); + Tep = FNMS(KP820678790, Tef, Teg); + TcY = FMA(KP198912367, TcX, TcU); + Td7 = FNMS(KP198912367, Td6, Td3); + Td8 = TcY + Td7; + Tek = Td7 - TcY; + } + { + E Tdm, Tdt, TdT, TdW; + Tdm = FMA(KP923879532, Tdl, Tde); + Tdt = FMA(KP923879532, Tds, Tdp); + Tdu = FMA(KP098491403, Tdt, Tdm); + Te4 = FNMS(KP098491403, Tdm, Tdt); + TdT = FMA(KP707106781, TdS, TdR); + TdW = TdU + TdV; + TdX = FMA(KP923879532, TdW, TdT); + Tej = FNMS(KP923879532, TdW, TdT); + } + { + E TdY, TdZ, TdH, TdO; + TdY = FNMS(KP198912367, TcU, TcX); + TdZ = FMA(KP198912367, Td3, Td6); + Te0 = TdY + TdZ; + Tea = TdZ - TdY; + TdH = FMA(KP923879532, TdG, Tdz); + TdO = FMA(KP923879532, TdN, TdK); + TdP = FNMS(KP098491403, TdO, TdH); + Te5 = FMA(KP098491403, TdH, TdO); + } + { + E Td9, TdQ, Te3, Te6; + Td9 = FMA(KP980785280, Td8, TcP); + TdQ = Tdu + TdP; + Cr[WS(csr, 62)] = FNMS(KP995184726, TdQ, Td9); + Cr[WS(csr, 2)] = FMA(KP995184726, TdQ, Td9); + Te3 = FMA(KP980785280, Te0, TdX); + Te6 = Te4 + Te5; + Ci[WS(csi, 2)] = FMA(KP995184726, Te6, Te3); + Ci[WS(csi, 62)] = FMS(KP995184726, Te6, Te3); + } + { + E Te1, Te2, Te7, Te8; + Te1 = FNMS(KP980785280, Te0, TdX); + Te2 = TdP - Tdu; + Ci[WS(csi, 30)] = FMS(KP995184726, Te2, Te1); + Ci[WS(csi, 34)] = FMA(KP995184726, Te2, Te1); + Te7 = FNMS(KP980785280, Td8, TcP); + Te8 = Te5 - Te4; + Cr[WS(csr, 34)] = FNMS(KP995184726, Te8, Te7); + Cr[WS(csr, 30)] = FMA(KP995184726, Te8, Te7); + } + { + E Teb, Tei, Ten, Teq; + Teb = FMA(KP980785280, Tea, Te9); + Tei = Tee + Teh; + Cr[WS(csr, 50)] = FNMS(KP773010453, Tei, Teb); + Cr[WS(csr, 14)] = FMA(KP773010453, Tei, Teb); + Ten = FNMS(KP980785280, Tek, Tej); + Teq = Teo + Tep; + Ci[WS(csi, 14)] = -(FMA(KP773010453, Teq, Ten)); + Ci[WS(csi, 50)] = FNMS(KP773010453, Teq, Ten); + } + { + E Tel, Tem, Ter, Tes; + Tel = FMA(KP980785280, Tek, Tej); + Tem = Teh - Tee; + Ci[WS(csi, 18)] = FMA(KP773010453, Tem, Tel); + Ci[WS(csi, 46)] = FMS(KP773010453, Tem, Tel); + Ter = FNMS(KP980785280, Tea, Te9); + Tes = Teo - Tep; + Cr[WS(csr, 46)] = FNMS(KP773010453, Tes, Ter); + Cr[WS(csr, 18)] = FMA(KP773010453, Tes, Ter); + } + } + { + E T6v, T77, T6C, T7i, T6Y, T78, T6V, T7h, T6R, T7n, T72, T7f, T6K, T7m, T73; + E T7c; + { + E T6t, T6u, T6T, T6U; + T6t = FNMS(KP923879532, T2e, T27); + T6u = T5U - T5V; + T6v = FNMS(KP980785280, T6u, T6t); + T77 = FMA(KP980785280, T6u, T6t); + { + E T6y, T6B, T6W, T6X; + T6y = FMA(KP820678790, T6x, T6w); + T6B = FNMS(KP820678790, T6A, T6z); + T6C = T6y - T6B; + T7i = T6B + T6y; + T6W = FNMS(KP820678790, T6w, T6x); + T6X = FMA(KP820678790, T6z, T6A); + T6Y = T6W - T6X; + T78 = T6X + T6W; + } + T6T = FNMS(KP923879532, T5S, T5P); + T6U = T2x - T2o; + T6V = FNMS(KP980785280, T6U, T6T); + T7h = FMA(KP980785280, T6U, T6T); + { + E T6N, T7d, T6Q, T7e, T6M, T6P; + T6M = T5I - T5H; + T6N = FNMS(KP980785280, T6M, T6L); + T7d = FMA(KP980785280, T6M, T6L); + T6P = T5v - T5e; + T6Q = FMA(KP980785280, T6P, T6O); + T7e = FNMS(KP980785280, T6P, T6O); + T6R = FNMS(KP472964775, T6Q, T6N); + T7n = FNMS(KP357805721, T7d, T7e); + T72 = FMA(KP472964775, T6N, T6Q); + T7f = FMA(KP357805721, T7e, T7d); + } + { + E T6G, T7a, T6J, T7b, T6F, T6I; + T6F = T4s - T4t; + T6G = FNMS(KP980785280, T6F, T6E); + T7a = FMA(KP980785280, T6F, T6E); + T6I = T4g - T3Z; + T6J = FNMS(KP980785280, T6I, T6H); + T7b = FMA(KP980785280, T6I, T6H); + T6K = FNMS(KP472964775, T6J, T6G); + T7m = FNMS(KP357805721, T7a, T7b); + T73 = FMA(KP472964775, T6G, T6J); + T7c = FMA(KP357805721, T7b, T7a); + } + } + { + E T6D, T6S, T71, T74; + T6D = FMA(KP773010453, T6C, T6v); + T6S = T6K + T6R; + Cr[WS(csr, 55)] = FNMS(KP903989293, T6S, T6D); + Cr[WS(csr, 9)] = FMA(KP903989293, T6S, T6D); + T71 = FNMS(KP773010453, T6Y, T6V); + T74 = T72 - T73; + Ci[WS(csi, 9)] = FMS(KP903989293, T74, T71); + Ci[WS(csi, 55)] = FMA(KP903989293, T74, T71); + } + { + E T6Z, T70, T75, T76; + T6Z = FMA(KP773010453, T6Y, T6V); + T70 = T6R - T6K; + Ci[WS(csi, 23)] = FMA(KP903989293, T70, T6Z); + Ci[WS(csi, 41)] = FMS(KP903989293, T70, T6Z); + T75 = FNMS(KP773010453, T6C, T6v); + T76 = T73 + T72; + Cr[WS(csr, 41)] = FNMS(KP903989293, T76, T75); + Cr[WS(csr, 23)] = FMA(KP903989293, T76, T75); + } + { + E T79, T7g, T7l, T7o; + T79 = FMA(KP773010453, T78, T77); + T7g = T7c + T7f; + Cr[WS(csr, 57)] = FNMS(KP941544065, T7g, T79); + Cr[WS(csr, 7)] = FMA(KP941544065, T7g, T79); + T7l = FMA(KP773010453, T7i, T7h); + T7o = T7m - T7n; + Ci[WS(csi, 7)] = FMA(KP941544065, T7o, T7l); + Ci[WS(csi, 57)] = FMS(KP941544065, T7o, T7l); + } + { + E T7j, T7k, T7p, T7q; + T7j = FNMS(KP773010453, T7i, T7h); + T7k = T7f - T7c; + Ci[WS(csi, 25)] = FMS(KP941544065, T7k, T7j); + Ci[WS(csi, 39)] = FMA(KP941544065, T7k, T7j); + T7p = FNMS(KP773010453, T78, T77); + T7q = T7m + T7n; + Cr[WS(csr, 39)] = FMA(KP941544065, T7q, T7p); + Cr[WS(csr, 25)] = FNMS(KP941544065, T7q, T7p); + } + } + { + E T99, T9L, T9g, T9W, T9C, T9M, T9z, T9V, T9v, Ta0, T9H, T9T, T9o, Ta1, T9G; + E T9Q; + { + E T97, T98, T9x, T9y; + T97 = FNMS(KP923879532, T7s, T7r); + T98 = T8z - T8y; + T99 = FNMS(KP831469612, T98, T97); + T9L = FMA(KP831469612, T98, T97); + { + E T9c, T9f, T9A, T9B; + T9c = FMA(KP534511135, T9b, T9a); + T9f = FNMS(KP534511135, T9e, T9d); + T9g = T9c - T9f; + T9W = T9c + T9f; + T9A = FMA(KP534511135, T9d, T9e); + T9B = FNMS(KP534511135, T9a, T9b); + T9C = T9A - T9B; + T9M = T9B + T9A; + } + T9x = FNMS(KP923879532, T8w, T8v); + T9y = T7z - T7w; + T9z = FMA(KP831469612, T9y, T9x); + T9V = FNMS(KP831469612, T9y, T9x); + { + E T9r, T9R, T9u, T9S, T9q, T9t; + T9q = T8p - T8q; + T9r = FNMS(KP831469612, T9q, T9p); + T9R = FMA(KP831469612, T9q, T9p); + T9t = T8j - T8g; + T9u = FNMS(KP831469612, T9t, T9s); + T9S = FMA(KP831469612, T9t, T9s); + T9v = FMA(KP599376933, T9u, T9r); + Ta0 = FMA(KP250486960, T9R, T9S); + T9H = FNMS(KP599376933, T9r, T9u); + T9T = FNMS(KP250486960, T9S, T9R); + } + { + E T9k, T9O, T9n, T9P, T9j, T9m; + T9j = T87 - T86; + T9k = FNMS(KP831469612, T9j, T9i); + T9O = FMA(KP831469612, T9j, T9i); + T9m = T7X - T80; + T9n = FNMS(KP831469612, T9m, T9l); + T9P = FMA(KP831469612, T9m, T9l); + T9o = FMA(KP599376933, T9n, T9k); + Ta1 = FMA(KP250486960, T9O, T9P); + T9G = FNMS(KP599376933, T9k, T9n); + T9Q = FNMS(KP250486960, T9P, T9O); + } + } + { + E T9h, T9w, T9F, T9I; + T9h = FMA(KP881921264, T9g, T99); + T9w = T9o + T9v; + Cr[WS(csr, 53)] = FNMS(KP857728610, T9w, T9h); + Cr[WS(csr, 11)] = FMA(KP857728610, T9w, T9h); + T9F = FMA(KP881921264, T9C, T9z); + T9I = T9G - T9H; + Ci[WS(csi, 11)] = FMA(KP857728610, T9I, T9F); + Ci[WS(csi, 53)] = FMS(KP857728610, T9I, T9F); + } + { + E T9D, T9E, T9J, T9K; + T9D = FNMS(KP881921264, T9C, T9z); + T9E = T9v - T9o; + Ci[WS(csi, 21)] = FMS(KP857728610, T9E, T9D); + Ci[WS(csi, 43)] = FMA(KP857728610, T9E, T9D); + T9J = FNMS(KP881921264, T9g, T99); + T9K = T9G + T9H; + Cr[WS(csr, 43)] = FMA(KP857728610, T9K, T9J); + Cr[WS(csr, 21)] = FNMS(KP857728610, T9K, T9J); + } + { + E T9N, T9U, T9Z, Ta2; + T9N = FMA(KP881921264, T9M, T9L); + T9U = T9Q + T9T; + Cr[WS(csr, 59)] = FNMS(KP970031253, T9U, T9N); + Cr[WS(csr, 5)] = FMA(KP970031253, T9U, T9N); + T9Z = FMA(KP881921264, T9W, T9V); + Ta2 = Ta0 - Ta1; + Ci[WS(csi, 5)] = FMS(KP970031253, Ta2, T9Z); + Ci[WS(csi, 59)] = FMA(KP970031253, Ta2, T9Z); + } + { + E T9X, T9Y, Ta3, Ta4; + T9X = FNMS(KP881921264, T9W, T9V); + T9Y = T9T - T9Q; + Ci[WS(csi, 27)] = FMA(KP970031253, T9Y, T9X); + Ci[WS(csi, 37)] = FMS(KP970031253, T9Y, T9X); + Ta3 = FNMS(KP881921264, T9M, T9L); + Ta4 = Ta1 + Ta0; + Cr[WS(csr, 37)] = FNMS(KP970031253, Ta4, Ta3); + Cr[WS(csr, 27)] = FMA(KP970031253, Ta4, Ta3); + } + } + { + E T2z, T69, T3g, T6k, T60, T6a, T5X, T6j, T5L, T6p, T64, T6h, T4w, T6o, T65; + E T6e; + { + E T2f, T2y, T5T, T5W; + T2f = FMA(KP923879532, T2e, T27); + T2y = T2o + T2x; + T2z = FMA(KP980785280, T2y, T2f); + T69 = FNMS(KP980785280, T2y, T2f); + { + E T2U, T3f, T5Y, T5Z; + T2U = FNMS(KP098491403, T2T, T2M); + T3f = FMA(KP098491403, T3e, T37); + T3g = T2U + T3f; + T6k = T3f - T2U; + T5Y = FMA(KP098491403, T2M, T2T); + T5Z = FNMS(KP098491403, T37, T3e); + T60 = T5Y + T5Z; + T6a = T5Y - T5Z; + } + T5T = FMA(KP923879532, T5S, T5P); + T5W = T5U + T5V; + T5X = FMA(KP980785280, T5W, T5T); + T6j = FNMS(KP980785280, T5W, T5T); + { + E T5x, T6f, T5K, T6g, T5w, T5J; + T5w = T5e + T5v; + T5x = FMA(KP980785280, T5w, T4X); + T6f = FNMS(KP980785280, T5w, T4X); + T5J = T5H + T5I; + T5K = FMA(KP980785280, T5J, T5G); + T6g = FNMS(KP980785280, T5J, T5G); + T5L = FNMS(KP049126849, T5K, T5x); + T6p = FNMS(KP906347169, T6f, T6g); + T64 = FMA(KP049126849, T5x, T5K); + T6h = FMA(KP906347169, T6g, T6f); + } + { + E T4i, T6c, T4v, T6d, T4h, T4u; + T4h = T3Z + T4g; + T4i = FMA(KP980785280, T4h, T3I); + T6c = FNMS(KP980785280, T4h, T3I); + T4u = T4s + T4t; + T4v = FMA(KP980785280, T4u, T4r); + T6d = FNMS(KP980785280, T4u, T4r); + T4w = FNMS(KP049126849, T4v, T4i); + T6o = FNMS(KP906347169, T6c, T6d); + T65 = FMA(KP049126849, T4i, T4v); + T6e = FMA(KP906347169, T6d, T6c); + } + } + { + E T3h, T5M, T63, T66; + T3h = FMA(KP995184726, T3g, T2z); + T5M = T4w + T5L; + Cr[WS(csr, 63)] = FNMS(KP998795456, T5M, T3h); + Cr[WS(csr, 1)] = FMA(KP998795456, T5M, T3h); + T63 = FMA(KP995184726, T60, T5X); + T66 = T64 - T65; + Ci[WS(csi, 1)] = FMS(KP998795456, T66, T63); + Ci[WS(csi, 63)] = FMA(KP998795456, T66, T63); + } + { + E T61, T62, T67, T68; + T61 = FNMS(KP995184726, T60, T5X); + T62 = T5L - T4w; + Ci[WS(csi, 31)] = FMA(KP998795456, T62, T61); + Ci[WS(csi, 33)] = FMS(KP998795456, T62, T61); + T67 = FNMS(KP995184726, T3g, T2z); + T68 = T65 + T64; + Cr[WS(csr, 33)] = FNMS(KP998795456, T68, T67); + Cr[WS(csr, 31)] = FMA(KP998795456, T68, T67); + } + { + E T6b, T6i, T6n, T6q; + T6b = FMA(KP995184726, T6a, T69); + T6i = T6e + T6h; + Cr[WS(csr, 49)] = FNMS(KP740951125, T6i, T6b); + Cr[WS(csr, 15)] = FMA(KP740951125, T6i, T6b); + T6n = FMA(KP995184726, T6k, T6j); + T6q = T6o - T6p; + Ci[WS(csi, 15)] = FMA(KP740951125, T6q, T6n); + Ci[WS(csi, 49)] = FMS(KP740951125, T6q, T6n); + } + { + E T6l, T6m, T6r, T6s; + T6l = FNMS(KP995184726, T6k, T6j); + T6m = T6h - T6e; + Ci[WS(csi, 17)] = FMS(KP740951125, T6m, T6l); + Ci[WS(csi, 47)] = FMA(KP740951125, T6m, T6l); + T6r = FNMS(KP995184726, T6a, T69); + T6s = T6o + T6p; + Cr[WS(csr, 47)] = FMA(KP740951125, T6s, T6r); + Cr[WS(csr, 17)] = FNMS(KP740951125, T6s, T6r); + } + } + { + E T7B, T8N, T7Q, T8Y, T8E, T8O, T8B, T8X, T8t, T92, T8J, T8V, T8a, T93, T8I; + E T8S; + { + E T7t, T7A, T8x, T8A; + T7t = FMA(KP923879532, T7s, T7r); + T7A = T7w + T7z; + T7B = FMA(KP831469612, T7A, T7t); + T8N = FNMS(KP831469612, T7A, T7t); + { + E T7I, T7P, T8C, T8D; + T7I = FMA(KP303346683, T7H, T7E); + T7P = FNMS(KP303346683, T7O, T7L); + T7Q = T7I + T7P; + T8Y = T7P - T7I; + T8C = FNMS(KP303346683, T7E, T7H); + T8D = FMA(KP303346683, T7L, T7O); + T8E = T8C + T8D; + T8O = T8D - T8C; + } + T8x = FMA(KP923879532, T8w, T8v); + T8A = T8y + T8z; + T8B = FMA(KP831469612, T8A, T8x); + T8X = FNMS(KP831469612, T8A, T8x); + { + E T8l, T8T, T8s, T8U, T8k, T8r; + T8k = T8g + T8j; + T8l = FMA(KP831469612, T8k, T8d); + T8T = FNMS(KP831469612, T8k, T8d); + T8r = T8p + T8q; + T8s = FMA(KP831469612, T8r, T8o); + T8U = FNMS(KP831469612, T8r, T8o); + T8t = FMA(KP148335987, T8s, T8l); + T92 = FMA(KP741650546, T8T, T8U); + T8J = FNMS(KP148335987, T8l, T8s); + T8V = FNMS(KP741650546, T8U, T8T); + } + { + E T82, T8Q, T89, T8R, T81, T88; + T81 = T7X + T80; + T82 = FMA(KP831469612, T81, T7U); + T8Q = FNMS(KP831469612, T81, T7U); + T88 = T86 + T87; + T89 = FMA(KP831469612, T88, T85); + T8R = FNMS(KP831469612, T88, T85); + T8a = FMA(KP148335987, T89, T82); + T93 = FMA(KP741650546, T8Q, T8R); + T8I = FNMS(KP148335987, T82, T89); + T8S = FNMS(KP741650546, T8R, T8Q); + } + } + { + E T7R, T8u, T8H, T8K; + T7R = FMA(KP956940335, T7Q, T7B); + T8u = T8a + T8t; + Cr[WS(csr, 61)] = FNMS(KP989176509, T8u, T7R); + Cr[WS(csr, 3)] = FMA(KP989176509, T8u, T7R); + T8H = FMA(KP956940335, T8E, T8B); + T8K = T8I - T8J; + Ci[WS(csi, 3)] = FMA(KP989176509, T8K, T8H); + Ci[WS(csi, 61)] = FMS(KP989176509, T8K, T8H); + } + { + E T8F, T8G, T8L, T8M; + T8F = FNMS(KP956940335, T8E, T8B); + T8G = T8t - T8a; + Ci[WS(csi, 29)] = FMS(KP989176509, T8G, T8F); + Ci[WS(csi, 35)] = FMA(KP989176509, T8G, T8F); + T8L = FNMS(KP956940335, T7Q, T7B); + T8M = T8I + T8J; + Cr[WS(csr, 35)] = FMA(KP989176509, T8M, T8L); + Cr[WS(csr, 29)] = FNMS(KP989176509, T8M, T8L); + } + { + E T8P, T8W, T91, T94; + T8P = FMA(KP956940335, T8O, T8N); + T8W = T8S + T8V; + Cr[WS(csr, 51)] = FNMS(KP803207531, T8W, T8P); + Cr[WS(csr, 13)] = FMA(KP803207531, T8W, T8P); + T91 = FNMS(KP956940335, T8Y, T8X); + T94 = T92 - T93; + Ci[WS(csi, 13)] = FMS(KP803207531, T94, T91); + Ci[WS(csi, 51)] = FMA(KP803207531, T94, T91); + } + { + E T8Z, T90, T95, T96; + T8Z = FMA(KP956940335, T8Y, T8X); + T90 = T8V - T8S; + Ci[WS(csi, 19)] = FMA(KP803207531, T90, T8Z); + Ci[WS(csi, 45)] = FMS(KP803207531, T90, T8Z); + T95 = FNMS(KP956940335, T8O, T8N); + T96 = T93 + T92; + Cr[WS(csr, 45)] = FNMS(KP803207531, T96, T95); + Cr[WS(csr, 19)] = FMA(KP803207531, T96, T95); + } + } + } + } +} + +static const kr2c_desc desc = { 128, "r2cf_128", {440, 0, 516, 0}, &GENUS }; + +void X(codelet_r2cf_128) (planner *p) { + X(kr2c_register) (p, r2cf_128, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 128 -name r2cf_128 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 956 FP additions, 330 FP multiplications, + * (or, 812 additions, 186 multiplications, 144 fused multiply/add), + * 186 stack variables, 31 constants, and 256 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_128(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP803207531, +0.803207531480644909806676512963141923879569427); + DK(KP595699304, +0.595699304492433343467036528829969889511926338); + DK(KP146730474, +0.146730474455361751658850129646717819706215317); + DK(KP989176509, +0.989176509964780973451673738016243063983689533); + DK(KP740951125, +0.740951125354959091175616897495162729728955309); + DK(KP671558954, +0.671558954847018400625376850427421803228750632); + DK(KP049067674, +0.049067674327418014254954976942682658314745363); + DK(KP998795456, +0.998795456205172392714771604759100694443203615); + DK(KP242980179, +0.242980179903263889948274162077471118320990783); + DK(KP970031253, +0.970031253194543992603984207286100251456865962); + DK(KP514102744, +0.514102744193221726593693838968815772608049120); + DK(KP857728610, +0.857728610000272069902269984284770137042490799); + DK(KP336889853, +0.336889853392220050689253212619147570477766780); + DK(KP941544065, +0.941544065183020778412509402599502357185589796); + DK(KP427555093, +0.427555093430282094320966856888798534304578629); + DK(KP903989293, +0.903989293123443331586200297230537048710132025); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(512, rs), MAKE_VOLATILE_STRIDE(512, csr), MAKE_VOLATILE_STRIDE(512, csi)) { + E TcD, TdU, T27, T7r, T5S, T8y, Tf, Ta5, Tu, Tbq, TcG, TdV, T2e, T8z, T5V; + E T7s, TK, Ta6, TcK, TdX, T2o, T5X, T7w, T8B, TZ, Ta7, TcN, TdY, T2x, T5Y; + E T7z, T8C, T1g, Taa, TcU, TeA, TcX, Tez, T1v, Tab, T2M, T6z, T7E, T9e, T7H; + E T9d, T2T, T6A, T4X, T6L, Tdz, TeL, TdK, TeP, T5G, T6P, T8d, T9p, TaV, Tc3; + E Tbi, Tc4, T8o, T9t, T3I, T6H, Tde, TeH, Tdp, TeF, T4r, T6F, T7U, T9l, Tao; + E TbW, TaL, TbX, T85, T9j, T1L, Tad, Td3, Tew, Td6, Tex, T20, Tae, T37, T6x; + E T7L, T9a, T7O, T9b, T3e, T6w, TbZ, Tc0, T3Z, T4s, Tds, TeI, T4g, T4t, T80; + E T87, Tdl, TeE, T7X, T86, TaD, TaM, Tc6, Tc7, T5e, T5H, TdN, TeM, T5v, T5I; + E T8j, T8q, TdG, TeO, T8g, T8p, Tba, Tbj; + { + E T3, T23, Td, T25, T6, T5R, Ta, T24; + { + E T1, T2, Tb, Tc; + T1 = R0[0]; + T2 = R0[WS(rs, 32)]; + T3 = T1 + T2; + T23 = T1 - T2; + Tb = R0[WS(rs, 56)]; + Tc = R0[WS(rs, 24)]; + Td = Tb + Tc; + T25 = Tb - Tc; + } + { + E T4, T5, T8, T9; + T4 = R0[WS(rs, 16)]; + T5 = R0[WS(rs, 48)]; + T6 = T4 + T5; + T5R = T4 - T5; + T8 = R0[WS(rs, 8)]; + T9 = R0[WS(rs, 40)]; + Ta = T8 + T9; + T24 = T8 - T9; + } + TcD = T3 - T6; + TdU = Td - Ta; + { + E T26, T5Q, T7, Te; + T26 = KP707106781 * (T24 + T25); + T27 = T23 + T26; + T7r = T23 - T26; + T5Q = KP707106781 * (T25 - T24); + T5S = T5Q - T5R; + T8y = T5R + T5Q; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + Ta5 = T7 - Te; + } + } + { + E Ti, T28, Ts, T2c, Tl, T29, Tp, T2b; + { + E Tg, Th, Tq, Tr; + Tg = R0[WS(rs, 4)]; + Th = R0[WS(rs, 36)]; + Ti = Tg + Th; + T28 = Tg - Th; + Tq = R0[WS(rs, 12)]; + Tr = R0[WS(rs, 44)]; + Ts = Tq + Tr; + T2c = Tq - Tr; + } + { + E Tj, Tk, Tn, To; + Tj = R0[WS(rs, 20)]; + Tk = R0[WS(rs, 52)]; + Tl = Tj + Tk; + T29 = Tj - Tk; + Tn = R0[WS(rs, 60)]; + To = R0[WS(rs, 28)]; + Tp = Tn + To; + T2b = Tn - To; + } + { + E Tm, Tt, TcE, TcF; + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + Tbq = Tt - Tm; + TcE = Ti - Tl; + TcF = Tp - Ts; + TcG = KP707106781 * (TcE + TcF); + TdV = KP707106781 * (TcF - TcE); + } + { + E T2a, T2d, T5T, T5U; + T2a = FNMS(KP382683432, T29, KP923879532 * T28); + T2d = FMA(KP923879532, T2b, KP382683432 * T2c); + T2e = T2a + T2d; + T8z = T2d - T2a; + T5T = FNMS(KP923879532, T2c, KP382683432 * T2b); + T5U = FMA(KP382683432, T28, KP923879532 * T29); + T5V = T5T - T5U; + T7s = T5U + T5T; + } + } + { + E Ty, T2g, TB, T2m, TF, T2l, TI, T2j; + { + E Tw, Tx, Tz, TA; + Tw = R0[WS(rs, 2)]; + Tx = R0[WS(rs, 34)]; + Ty = Tw + Tx; + T2g = Tw - Tx; + Tz = R0[WS(rs, 18)]; + TA = R0[WS(rs, 50)]; + TB = Tz + TA; + T2m = Tz - TA; + { + E TD, TE, T2h, TG, TH, T2i; + TD = R0[WS(rs, 10)]; + TE = R0[WS(rs, 42)]; + T2h = TD - TE; + TG = R0[WS(rs, 58)]; + TH = R0[WS(rs, 26)]; + T2i = TG - TH; + TF = TD + TE; + T2l = KP707106781 * (T2i - T2h); + TI = TG + TH; + T2j = KP707106781 * (T2h + T2i); + } + } + { + E TC, TJ, TcI, TcJ; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + Ta6 = TC - TJ; + TcI = Ty - TB; + TcJ = TI - TF; + TcK = FMA(KP923879532, TcI, KP382683432 * TcJ); + TdX = FNMS(KP382683432, TcI, KP923879532 * TcJ); + } + { + E T2k, T2n, T7u, T7v; + T2k = T2g + T2j; + T2n = T2l - T2m; + T2o = FMA(KP980785280, T2k, KP195090322 * T2n); + T5X = FNMS(KP195090322, T2k, KP980785280 * T2n); + T7u = T2g - T2j; + T7v = T2m + T2l; + T7w = FMA(KP831469612, T7u, KP555570233 * T7v); + T8B = FNMS(KP555570233, T7u, KP831469612 * T7v); + } + } + { + E TN, T2p, TQ, T2v, TU, T2u, TX, T2s; + { + E TL, TM, TO, TP; + TL = R0[WS(rs, 62)]; + TM = R0[WS(rs, 30)]; + TN = TL + TM; + T2p = TL - TM; + TO = R0[WS(rs, 14)]; + TP = R0[WS(rs, 46)]; + TQ = TO + TP; + T2v = TO - TP; + { + E TS, TT, T2q, TV, TW, T2r; + TS = R0[WS(rs, 6)]; + TT = R0[WS(rs, 38)]; + T2q = TS - TT; + TV = R0[WS(rs, 54)]; + TW = R0[WS(rs, 22)]; + T2r = TV - TW; + TU = TS + TT; + T2u = KP707106781 * (T2r - T2q); + TX = TV + TW; + T2s = KP707106781 * (T2q + T2r); + } + } + { + E TR, TY, TcL, TcM; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + Ta7 = TR - TY; + TcL = TN - TQ; + TcM = TX - TU; + TcN = FNMS(KP382683432, TcM, KP923879532 * TcL); + TdY = FMA(KP382683432, TcL, KP923879532 * TcM); + } + { + E T2t, T2w, T7x, T7y; + T2t = T2p + T2s; + T2w = T2u - T2v; + T2x = FNMS(KP195090322, T2w, KP980785280 * T2t); + T5Y = FMA(KP195090322, T2t, KP980785280 * T2w); + T7x = T2p - T2s; + T7y = T2v + T2u; + T7z = FNMS(KP555570233, T7y, KP831469612 * T7x); + T8C = FMA(KP555570233, T7x, KP831469612 * T7y); + } + } + { + E T14, T2N, T17, T2D, T1b, T2O, T1e, T2C, T1j, T1m, T2K, TcR, T2Q, T1q, T1t; + E T2H, TcS, T2R; + { + E T12, T13, T15, T16; + T12 = R0[WS(rs, 1)]; + T13 = R0[WS(rs, 33)]; + T14 = T12 + T13; + T2N = T12 - T13; + T15 = R0[WS(rs, 17)]; + T16 = R0[WS(rs, 49)]; + T17 = T15 + T16; + T2D = T15 - T16; + } + { + E T19, T1a, T2B, T1c, T1d, T2A; + T19 = R0[WS(rs, 9)]; + T1a = R0[WS(rs, 41)]; + T2B = T19 - T1a; + T1c = R0[WS(rs, 57)]; + T1d = R0[WS(rs, 25)]; + T2A = T1c - T1d; + T1b = T19 + T1a; + T2O = KP707106781 * (T2B + T2A); + T1e = T1c + T1d; + T2C = KP707106781 * (T2A - T2B); + } + { + E T2I, T2J, T2F, T2G; + { + E T1h, T1i, T1k, T1l; + T1h = R0[WS(rs, 5)]; + T1i = R0[WS(rs, 37)]; + T1j = T1h + T1i; + T2I = T1h - T1i; + T1k = R0[WS(rs, 21)]; + T1l = R0[WS(rs, 53)]; + T1m = T1k + T1l; + T2J = T1k - T1l; + } + T2K = FMA(KP382683432, T2I, KP923879532 * T2J); + TcR = T1j - T1m; + T2Q = FNMS(KP382683432, T2J, KP923879532 * T2I); + { + E T1o, T1p, T1r, T1s; + T1o = R0[WS(rs, 61)]; + T1p = R0[WS(rs, 29)]; + T1q = T1o + T1p; + T2F = T1o - T1p; + T1r = R0[WS(rs, 13)]; + T1s = R0[WS(rs, 45)]; + T1t = T1r + T1s; + T2G = T1r - T1s; + } + T2H = FNMS(KP923879532, T2G, KP382683432 * T2F); + TcS = T1q - T1t; + T2R = FMA(KP923879532, T2F, KP382683432 * T2G); + } + { + E T18, T1f, TcQ, TcT; + T18 = T14 + T17; + T1f = T1b + T1e; + T1g = T18 + T1f; + Taa = T18 - T1f; + TcQ = T14 - T17; + TcT = KP707106781 * (TcR + TcS); + TcU = TcQ + TcT; + TeA = TcQ - TcT; + } + { + E TcV, TcW, T1n, T1u; + TcV = T1e - T1b; + TcW = KP707106781 * (TcS - TcR); + TcX = TcV + TcW; + Tez = TcW - TcV; + T1n = T1j + T1m; + T1u = T1q + T1t; + T1v = T1n + T1u; + Tab = T1u - T1n; + } + { + E T2E, T2L, T7C, T7D; + T2E = T2C - T2D; + T2L = T2H - T2K; + T2M = T2E + T2L; + T6z = T2L - T2E; + T7C = T2N - T2O; + T7D = T2K + T2H; + T7E = T7C + T7D; + T9e = T7C - T7D; + } + { + E T7F, T7G, T2P, T2S; + T7F = T2D + T2C; + T7G = T2R - T2Q; + T7H = T7F + T7G; + T9d = T7G - T7F; + T2P = T2N + T2O; + T2S = T2Q + T2R; + T2T = T2P + T2S; + T6A = T2P - T2S; + } + } + { + E T4z, TaP, T5B, TaQ, T4G, TaT, T5y, TaS, Tbf, Tbg, T4O, Tdw, T5E, Tbc, Tbd; + E T4V, Tdx, T5D; + { + E T4x, T4y, T5z, T5A; + T4x = R1[WS(rs, 63)]; + T4y = R1[WS(rs, 31)]; + T4z = T4x - T4y; + TaP = T4x + T4y; + T5z = R1[WS(rs, 15)]; + T5A = R1[WS(rs, 47)]; + T5B = T5z - T5A; + TaQ = T5z + T5A; + } + { + E T4A, T4B, T4C, T4D, T4E, T4F; + T4A = R1[WS(rs, 7)]; + T4B = R1[WS(rs, 39)]; + T4C = T4A - T4B; + T4D = R1[WS(rs, 55)]; + T4E = R1[WS(rs, 23)]; + T4F = T4D - T4E; + T4G = KP707106781 * (T4C + T4F); + TaT = T4D + T4E; + T5y = KP707106781 * (T4F - T4C); + TaS = T4A + T4B; + } + { + E T4K, T4N, T4R, T4U; + { + E T4I, T4J, T4L, T4M; + T4I = R1[WS(rs, 3)]; + T4J = R1[WS(rs, 35)]; + T4K = T4I - T4J; + Tbf = T4I + T4J; + T4L = R1[WS(rs, 19)]; + T4M = R1[WS(rs, 51)]; + T4N = T4L - T4M; + Tbg = T4L + T4M; + } + T4O = FNMS(KP382683432, T4N, KP923879532 * T4K); + Tdw = Tbf - Tbg; + T5E = FMA(KP382683432, T4K, KP923879532 * T4N); + { + E T4P, T4Q, T4S, T4T; + T4P = R1[WS(rs, 59)]; + T4Q = R1[WS(rs, 27)]; + T4R = T4P - T4Q; + Tbc = T4P + T4Q; + T4S = R1[WS(rs, 11)]; + T4T = R1[WS(rs, 43)]; + T4U = T4S - T4T; + Tbd = T4S + T4T; + } + T4V = FMA(KP923879532, T4R, KP382683432 * T4U); + Tdx = Tbc - Tbd; + T5D = FNMS(KP923879532, T4U, KP382683432 * T4R); + } + { + E T4H, T4W, Tdv, Tdy; + T4H = T4z + T4G; + T4W = T4O + T4V; + T4X = T4H + T4W; + T6L = T4H - T4W; + Tdv = TaP - TaQ; + Tdy = KP707106781 * (Tdw + Tdx); + Tdz = Tdv + Tdy; + TeL = Tdv - Tdy; + } + { + E TdI, TdJ, T5C, T5F; + TdI = TaT - TaS; + TdJ = KP707106781 * (Tdx - Tdw); + TdK = TdI + TdJ; + TeP = TdJ - TdI; + T5C = T5y - T5B; + T5F = T5D - T5E; + T5G = T5C + T5F; + T6P = T5F - T5C; + } + { + E T8b, T8c, TaR, TaU; + T8b = T4z - T4G; + T8c = T5E + T5D; + T8d = T8b + T8c; + T9p = T8b - T8c; + TaR = TaP + TaQ; + TaU = TaS + TaT; + TaV = TaR - TaU; + Tc3 = TaR + TaU; + } + { + E Tbe, Tbh, T8m, T8n; + Tbe = Tbc + Tbd; + Tbh = Tbf + Tbg; + Tbi = Tbe - Tbh; + Tc4 = Tbh + Tbe; + T8m = T5B + T5y; + T8n = T4V - T4O; + T8o = T8m + T8n; + T9t = T8n - T8m; + } + } + { + E T3k, Tai, T4m, Taj, T3r, Tam, T4j, Tal, TaI, TaJ, T3z, Tdb, T4p, TaF, TaG; + E T3G, Tdc, T4o; + { + E T3i, T3j, T4k, T4l; + T3i = R1[0]; + T3j = R1[WS(rs, 32)]; + T3k = T3i - T3j; + Tai = T3i + T3j; + T4k = R1[WS(rs, 16)]; + T4l = R1[WS(rs, 48)]; + T4m = T4k - T4l; + Taj = T4k + T4l; + } + { + E T3l, T3m, T3n, T3o, T3p, T3q; + T3l = R1[WS(rs, 8)]; + T3m = R1[WS(rs, 40)]; + T3n = T3l - T3m; + T3o = R1[WS(rs, 56)]; + T3p = R1[WS(rs, 24)]; + T3q = T3o - T3p; + T3r = KP707106781 * (T3n + T3q); + Tam = T3o + T3p; + T4j = KP707106781 * (T3q - T3n); + Tal = T3l + T3m; + } + { + E T3v, T3y, T3C, T3F; + { + E T3t, T3u, T3w, T3x; + T3t = R1[WS(rs, 4)]; + T3u = R1[WS(rs, 36)]; + T3v = T3t - T3u; + TaI = T3t + T3u; + T3w = R1[WS(rs, 20)]; + T3x = R1[WS(rs, 52)]; + T3y = T3w - T3x; + TaJ = T3w + T3x; + } + T3z = FNMS(KP382683432, T3y, KP923879532 * T3v); + Tdb = TaI - TaJ; + T4p = FMA(KP382683432, T3v, KP923879532 * T3y); + { + E T3A, T3B, T3D, T3E; + T3A = R1[WS(rs, 60)]; + T3B = R1[WS(rs, 28)]; + T3C = T3A - T3B; + TaF = T3A + T3B; + T3D = R1[WS(rs, 12)]; + T3E = R1[WS(rs, 44)]; + T3F = T3D - T3E; + TaG = T3D + T3E; + } + T3G = FMA(KP923879532, T3C, KP382683432 * T3F); + Tdc = TaF - TaG; + T4o = FNMS(KP923879532, T3F, KP382683432 * T3C); + } + { + E T3s, T3H, Tda, Tdd; + T3s = T3k + T3r; + T3H = T3z + T3G; + T3I = T3s + T3H; + T6H = T3s - T3H; + Tda = Tai - Taj; + Tdd = KP707106781 * (Tdb + Tdc); + Tde = Tda + Tdd; + TeH = Tda - Tdd; + } + { + E Tdn, Tdo, T4n, T4q; + Tdn = Tam - Tal; + Tdo = KP707106781 * (Tdc - Tdb); + Tdp = Tdn + Tdo; + TeF = Tdo - Tdn; + T4n = T4j - T4m; + T4q = T4o - T4p; + T4r = T4n + T4q; + T6F = T4q - T4n; + } + { + E T7S, T7T, Tak, Tan; + T7S = T3k - T3r; + T7T = T4p + T4o; + T7U = T7S + T7T; + T9l = T7S - T7T; + Tak = Tai + Taj; + Tan = Tal + Tam; + Tao = Tak - Tan; + TbW = Tak + Tan; + } + { + E TaH, TaK, T83, T84; + TaH = TaF + TaG; + TaK = TaI + TaJ; + TaL = TaH - TaK; + TbX = TaK + TaH; + T83 = T4m + T4j; + T84 = T3G - T3z; + T85 = T83 + T84; + T9j = T84 - T83; + } + } + { + E T1z, T2V, T1C, T39, T1G, T38, T1J, T2Y, T1O, T1R, T32, Td0, T3c, T1V, T1Y; + E T35, Td1, T3b; + { + E T1x, T1y, T1A, T1B; + T1x = R0[WS(rs, 63)]; + T1y = R0[WS(rs, 31)]; + T1z = T1x + T1y; + T2V = T1x - T1y; + T1A = R0[WS(rs, 15)]; + T1B = R0[WS(rs, 47)]; + T1C = T1A + T1B; + T39 = T1A - T1B; + } + { + E T1E, T1F, T2W, T1H, T1I, T2X; + T1E = R0[WS(rs, 7)]; + T1F = R0[WS(rs, 39)]; + T2W = T1E - T1F; + T1H = R0[WS(rs, 55)]; + T1I = R0[WS(rs, 23)]; + T2X = T1H - T1I; + T1G = T1E + T1F; + T38 = KP707106781 * (T2X - T2W); + T1J = T1H + T1I; + T2Y = KP707106781 * (T2W + T2X); + } + { + E T30, T31, T33, T34; + { + E T1M, T1N, T1P, T1Q; + T1M = R0[WS(rs, 3)]; + T1N = R0[WS(rs, 35)]; + T1O = T1M + T1N; + T30 = T1M - T1N; + T1P = R0[WS(rs, 19)]; + T1Q = R0[WS(rs, 51)]; + T1R = T1P + T1Q; + T31 = T1P - T1Q; + } + T32 = FNMS(KP382683432, T31, KP923879532 * T30); + Td0 = T1O - T1R; + T3c = FMA(KP382683432, T30, KP923879532 * T31); + { + E T1T, T1U, T1W, T1X; + T1T = R0[WS(rs, 59)]; + T1U = R0[WS(rs, 27)]; + T1V = T1T + T1U; + T33 = T1T - T1U; + T1W = R0[WS(rs, 11)]; + T1X = R0[WS(rs, 43)]; + T1Y = T1W + T1X; + T34 = T1W - T1X; + } + T35 = FMA(KP923879532, T33, KP382683432 * T34); + Td1 = T1V - T1Y; + T3b = FNMS(KP923879532, T34, KP382683432 * T33); + } + { + E T1D, T1K, TcZ, Td2; + T1D = T1z + T1C; + T1K = T1G + T1J; + T1L = T1D + T1K; + Tad = T1D - T1K; + TcZ = T1z - T1C; + Td2 = KP707106781 * (Td0 + Td1); + Td3 = TcZ + Td2; + Tew = TcZ - Td2; + } + { + E Td4, Td5, T1S, T1Z; + Td4 = T1J - T1G; + Td5 = KP707106781 * (Td1 - Td0); + Td6 = Td4 + Td5; + Tex = Td5 - Td4; + T1S = T1O + T1R; + T1Z = T1V + T1Y; + T20 = T1S + T1Z; + Tae = T1Z - T1S; + } + { + E T2Z, T36, T7J, T7K; + T2Z = T2V + T2Y; + T36 = T32 + T35; + T37 = T2Z + T36; + T6x = T2Z - T36; + T7J = T2V - T2Y; + T7K = T3c + T3b; + T7L = T7J + T7K; + T9a = T7J - T7K; + } + { + E T7M, T7N, T3a, T3d; + T7M = T39 + T38; + T7N = T35 - T32; + T7O = T7M + T7N; + T9b = T7N - T7M; + T3a = T38 - T39; + T3d = T3b - T3c; + T3e = T3a + T3d; + T6w = T3d - T3a; + } + } + { + E T3L, Tdf, T3X, Tar, T42, Tdi, T4e, Tay, T3S, Tdg, T3U, Tau, T49, Tdj, T4b; + E TaB, Tdh, Tdk; + { + E T3J, T3K, Tap, T3V, T3W, Taq; + T3J = R1[WS(rs, 2)]; + T3K = R1[WS(rs, 34)]; + Tap = T3J + T3K; + T3V = R1[WS(rs, 18)]; + T3W = R1[WS(rs, 50)]; + Taq = T3V + T3W; + T3L = T3J - T3K; + Tdf = Tap - Taq; + T3X = T3V - T3W; + Tar = Tap + Taq; + } + { + E T40, T41, Taw, T4c, T4d, Tax; + T40 = R1[WS(rs, 62)]; + T41 = R1[WS(rs, 30)]; + Taw = T40 + T41; + T4c = R1[WS(rs, 14)]; + T4d = R1[WS(rs, 46)]; + Tax = T4c + T4d; + T42 = T40 - T41; + Tdi = Taw - Tax; + T4e = T4c - T4d; + Tay = Taw + Tax; + } + { + E T3O, Tas, T3R, Tat; + { + E T3M, T3N, T3P, T3Q; + T3M = R1[WS(rs, 10)]; + T3N = R1[WS(rs, 42)]; + T3O = T3M - T3N; + Tas = T3M + T3N; + T3P = R1[WS(rs, 58)]; + T3Q = R1[WS(rs, 26)]; + T3R = T3P - T3Q; + Tat = T3P + T3Q; + } + T3S = KP707106781 * (T3O + T3R); + Tdg = Tat - Tas; + T3U = KP707106781 * (T3R - T3O); + Tau = Tas + Tat; + } + { + E T45, Taz, T48, TaA; + { + E T43, T44, T46, T47; + T43 = R1[WS(rs, 6)]; + T44 = R1[WS(rs, 38)]; + T45 = T43 - T44; + Taz = T43 + T44; + T46 = R1[WS(rs, 54)]; + T47 = R1[WS(rs, 22)]; + T48 = T46 - T47; + TaA = T46 + T47; + } + T49 = KP707106781 * (T45 + T48); + Tdj = TaA - Taz; + T4b = KP707106781 * (T48 - T45); + TaB = Taz + TaA; + } + TbZ = Tar + Tau; + Tc0 = Tay + TaB; + { + E T3T, T3Y, Tdq, Tdr; + T3T = T3L + T3S; + T3Y = T3U - T3X; + T3Z = FMA(KP980785280, T3T, KP195090322 * T3Y); + T4s = FNMS(KP195090322, T3T, KP980785280 * T3Y); + Tdq = FNMS(KP382683432, Tdf, KP923879532 * Tdg); + Tdr = FMA(KP382683432, Tdi, KP923879532 * Tdj); + Tds = Tdq + Tdr; + TeI = Tdr - Tdq; + } + { + E T4a, T4f, T7Y, T7Z; + T4a = T42 + T49; + T4f = T4b - T4e; + T4g = FNMS(KP195090322, T4f, KP980785280 * T4a); + T4t = FMA(KP195090322, T4a, KP980785280 * T4f); + T7Y = T42 - T49; + T7Z = T4e + T4b; + T80 = FNMS(KP555570233, T7Z, KP831469612 * T7Y); + T87 = FMA(KP555570233, T7Y, KP831469612 * T7Z); + } + Tdh = FMA(KP923879532, Tdf, KP382683432 * Tdg); + Tdk = FNMS(KP382683432, Tdj, KP923879532 * Tdi); + Tdl = Tdh + Tdk; + TeE = Tdk - Tdh; + { + E T7V, T7W, Tav, TaC; + T7V = T3L - T3S; + T7W = T3X + T3U; + T7X = FMA(KP831469612, T7V, KP555570233 * T7W); + T86 = FNMS(KP555570233, T7V, KP831469612 * T7W); + Tav = Tar - Tau; + TaC = Tay - TaB; + TaD = KP707106781 * (Tav + TaC); + TaM = KP707106781 * (TaC - Tav); + } + } + { + E T50, TdA, T5c, TaY, T5h, TdD, T5t, Tb5, T57, TdB, T59, Tb1, T5o, TdE, T5q; + E Tb8, TdC, TdF; + { + E T4Y, T4Z, TaW, T5a, T5b, TaX; + T4Y = R1[WS(rs, 1)]; + T4Z = R1[WS(rs, 33)]; + TaW = T4Y + T4Z; + T5a = R1[WS(rs, 17)]; + T5b = R1[WS(rs, 49)]; + TaX = T5a + T5b; + T50 = T4Y - T4Z; + TdA = TaW - TaX; + T5c = T5a - T5b; + TaY = TaW + TaX; + } + { + E T5f, T5g, Tb3, T5r, T5s, Tb4; + T5f = R1[WS(rs, 61)]; + T5g = R1[WS(rs, 29)]; + Tb3 = T5f + T5g; + T5r = R1[WS(rs, 13)]; + T5s = R1[WS(rs, 45)]; + Tb4 = T5r + T5s; + T5h = T5f - T5g; + TdD = Tb3 - Tb4; + T5t = T5r - T5s; + Tb5 = Tb3 + Tb4; + } + { + E T53, TaZ, T56, Tb0; + { + E T51, T52, T54, T55; + T51 = R1[WS(rs, 9)]; + T52 = R1[WS(rs, 41)]; + T53 = T51 - T52; + TaZ = T51 + T52; + T54 = R1[WS(rs, 57)]; + T55 = R1[WS(rs, 25)]; + T56 = T54 - T55; + Tb0 = T54 + T55; + } + T57 = KP707106781 * (T53 + T56); + TdB = Tb0 - TaZ; + T59 = KP707106781 * (T56 - T53); + Tb1 = TaZ + Tb0; + } + { + E T5k, Tb6, T5n, Tb7; + { + E T5i, T5j, T5l, T5m; + T5i = R1[WS(rs, 5)]; + T5j = R1[WS(rs, 37)]; + T5k = T5i - T5j; + Tb6 = T5i + T5j; + T5l = R1[WS(rs, 53)]; + T5m = R1[WS(rs, 21)]; + T5n = T5l - T5m; + Tb7 = T5l + T5m; + } + T5o = KP707106781 * (T5k + T5n); + TdE = Tb7 - Tb6; + T5q = KP707106781 * (T5n - T5k); + Tb8 = Tb6 + Tb7; + } + Tc6 = TaY + Tb1; + Tc7 = Tb5 + Tb8; + { + E T58, T5d, TdL, TdM; + T58 = T50 + T57; + T5d = T59 - T5c; + T5e = FMA(KP980785280, T58, KP195090322 * T5d); + T5H = FNMS(KP195090322, T58, KP980785280 * T5d); + TdL = FNMS(KP382683432, TdA, KP923879532 * TdB); + TdM = FMA(KP382683432, TdD, KP923879532 * TdE); + TdN = TdL + TdM; + TeM = TdM - TdL; + } + { + E T5p, T5u, T8h, T8i; + T5p = T5h + T5o; + T5u = T5q - T5t; + T5v = FNMS(KP195090322, T5u, KP980785280 * T5p); + T5I = FMA(KP195090322, T5p, KP980785280 * T5u); + T8h = T5h - T5o; + T8i = T5t + T5q; + T8j = FNMS(KP555570233, T8i, KP831469612 * T8h); + T8q = FMA(KP555570233, T8h, KP831469612 * T8i); + } + TdC = FMA(KP923879532, TdA, KP382683432 * TdB); + TdF = FNMS(KP382683432, TdE, KP923879532 * TdD); + TdG = TdC + TdF; + TeO = TdF - TdC; + { + E T8e, T8f, Tb2, Tb9; + T8e = T50 - T57; + T8f = T5c + T59; + T8g = FMA(KP831469612, T8e, KP555570233 * T8f); + T8p = FNMS(KP555570233, T8e, KP831469612 * T8f); + Tb2 = TaY - Tb1; + Tb9 = Tb5 - Tb8; + Tba = KP707106781 * (Tb2 + Tb9); + Tbj = KP707106781 * (Tb9 - Tb2); + } + } + { + E T11, TbV, Tc9, Tcf, T22, Tcb, Tc2, Tce; + { + E Tv, T10, Tc5, Tc8; + Tv = Tf + Tu; + T10 = TK + TZ; + T11 = Tv + T10; + TbV = Tv - T10; + Tc5 = Tc3 + Tc4; + Tc8 = Tc6 + Tc7; + Tc9 = Tc5 - Tc8; + Tcf = Tc5 + Tc8; + } + { + E T1w, T21, TbY, Tc1; + T1w = T1g + T1v; + T21 = T1L + T20; + T22 = T1w + T21; + Tcb = T21 - T1w; + TbY = TbW + TbX; + Tc1 = TbZ + Tc0; + Tc2 = TbY - Tc1; + Tce = TbY + Tc1; + } + Cr[WS(csr, 32)] = T11 - T22; + Ci[WS(csi, 32)] = Tcf - Tce; + { + E Tca, Tcc, Tcd, Tcg; + Tca = KP707106781 * (Tc2 + Tc9); + Cr[WS(csr, 48)] = TbV - Tca; + Cr[WS(csr, 16)] = TbV + Tca; + Tcc = KP707106781 * (Tc9 - Tc2); + Ci[WS(csi, 16)] = Tcb + Tcc; + Ci[WS(csi, 48)] = Tcc - Tcb; + Tcd = T11 + T22; + Tcg = Tce + Tcf; + Cr[WS(csr, 64)] = Tcd - Tcg; + Cr[0] = Tcd + Tcg; + } + } + { + E Tch, Tcu, Tck, Tct, Tco, Tcy, Tcr, Tcz, Tci, Tcj; + Tch = Tf - Tu; + Tcu = TZ - TK; + Tci = T1g - T1v; + Tcj = T1L - T20; + Tck = KP707106781 * (Tci + Tcj); + Tct = KP707106781 * (Tcj - Tci); + { + E Tcm, Tcn, Tcp, Tcq; + Tcm = TbW - TbX; + Tcn = Tc0 - TbZ; + Tco = FMA(KP923879532, Tcm, KP382683432 * Tcn); + Tcy = FNMS(KP382683432, Tcm, KP923879532 * Tcn); + Tcp = Tc3 - Tc4; + Tcq = Tc7 - Tc6; + Tcr = FNMS(KP382683432, Tcq, KP923879532 * Tcp); + Tcz = FMA(KP382683432, Tcp, KP923879532 * Tcq); + } + { + E Tcl, Tcs, Tcx, TcA; + Tcl = Tch + Tck; + Tcs = Tco + Tcr; + Cr[WS(csr, 56)] = Tcl - Tcs; + Cr[WS(csr, 8)] = Tcl + Tcs; + Tcx = Tcu + Tct; + TcA = Tcy + Tcz; + Ci[WS(csi, 8)] = Tcx + TcA; + Ci[WS(csi, 56)] = TcA - Tcx; + } + { + E Tcv, Tcw, TcB, TcC; + Tcv = Tct - Tcu; + Tcw = Tcr - Tco; + Ci[WS(csi, 24)] = Tcv + Tcw; + Ci[WS(csi, 40)] = Tcw - Tcv; + TcB = Tch - Tck; + TcC = Tcz - Tcy; + Cr[WS(csr, 40)] = TcB - TcC; + Cr[WS(csr, 24)] = TcB + TcC; + } + } + { + E Ta9, TbB, Tbs, TbM, Tag, TbL, TbJ, TbR, TaO, Tbw, Tbp, TbC, TbG, TbQ, Tbl; + E Tbx, Ta8, Tbr; + Ta8 = KP707106781 * (Ta6 + Ta7); + Ta9 = Ta5 + Ta8; + TbB = Ta5 - Ta8; + Tbr = KP707106781 * (Ta7 - Ta6); + Tbs = Tbq + Tbr; + TbM = Tbr - Tbq; + { + E Tac, Taf, TbH, TbI; + Tac = FMA(KP923879532, Taa, KP382683432 * Tab); + Taf = FNMS(KP382683432, Tae, KP923879532 * Tad); + Tag = Tac + Taf; + TbL = Taf - Tac; + TbH = TaV - Tba; + TbI = Tbj - Tbi; + TbJ = FNMS(KP555570233, TbI, KP831469612 * TbH); + TbR = FMA(KP555570233, TbH, KP831469612 * TbI); + } + { + E TaE, TaN, Tbn, Tbo; + TaE = Tao + TaD; + TaN = TaL + TaM; + TaO = FMA(KP980785280, TaE, KP195090322 * TaN); + Tbw = FNMS(KP195090322, TaE, KP980785280 * TaN); + Tbn = FNMS(KP382683432, Taa, KP923879532 * Tab); + Tbo = FMA(KP382683432, Tad, KP923879532 * Tae); + Tbp = Tbn + Tbo; + TbC = Tbo - Tbn; + } + { + E TbE, TbF, Tbb, Tbk; + TbE = Tao - TaD; + TbF = TaM - TaL; + TbG = FMA(KP831469612, TbE, KP555570233 * TbF); + TbQ = FNMS(KP555570233, TbE, KP831469612 * TbF); + Tbb = TaV + Tba; + Tbk = Tbi + Tbj; + Tbl = FNMS(KP195090322, Tbk, KP980785280 * Tbb); + Tbx = FMA(KP195090322, Tbb, KP980785280 * Tbk); + } + { + E Tah, Tbm, Tbv, Tby; + Tah = Ta9 + Tag; + Tbm = TaO + Tbl; + Cr[WS(csr, 60)] = Tah - Tbm; + Cr[WS(csr, 4)] = Tah + Tbm; + Tbv = Tbs + Tbp; + Tby = Tbw + Tbx; + Ci[WS(csi, 4)] = Tbv + Tby; + Ci[WS(csi, 60)] = Tby - Tbv; + } + { + E Tbt, Tbu, Tbz, TbA; + Tbt = Tbp - Tbs; + Tbu = Tbl - TaO; + Ci[WS(csi, 28)] = Tbt + Tbu; + Ci[WS(csi, 36)] = Tbu - Tbt; + Tbz = Ta9 - Tag; + TbA = Tbx - Tbw; + Cr[WS(csr, 36)] = Tbz - TbA; + Cr[WS(csr, 28)] = Tbz + TbA; + } + { + E TbD, TbK, TbP, TbS; + TbD = TbB + TbC; + TbK = TbG + TbJ; + Cr[WS(csr, 52)] = TbD - TbK; + Cr[WS(csr, 12)] = TbD + TbK; + TbP = TbM + TbL; + TbS = TbQ + TbR; + Ci[WS(csi, 12)] = TbP + TbS; + Ci[WS(csi, 52)] = TbS - TbP; + } + { + E TbN, TbO, TbT, TbU; + TbN = TbL - TbM; + TbO = TbJ - TbG; + Ci[WS(csi, 20)] = TbN + TbO; + Ci[WS(csi, 44)] = TbO - TbN; + TbT = TbB - TbC; + TbU = TbR - TbQ; + Cr[WS(csr, 44)] = TbT - TbU; + Cr[WS(csr, 20)] = TbT + TbU; + } + } + { + E Tev, Tf7, Tfc, Tfm, Tff, Tfn, TeC, Tfh, TeK, Tf2, TeV, Tf8, TeY, Tfi, TeR; + E Tf3; + { + E Tet, Teu, Tfa, Tfb; + Tet = TcD - TcG; + Teu = TdY - TdX; + Tev = Tet - Teu; + Tf7 = Tet + Teu; + Tfa = TeF + TeE; + Tfb = TeH + TeI; + Tfc = FMA(KP290284677, Tfa, KP956940335 * Tfb); + Tfm = FNMS(KP290284677, Tfb, KP956940335 * Tfa); + } + { + E Tfd, Tfe, Tey, TeB; + Tfd = TeL + TeM; + Tfe = TeP + TeO; + Tff = FNMS(KP290284677, Tfe, KP956940335 * Tfd); + Tfn = FMA(KP956940335, Tfe, KP290284677 * Tfd); + Tey = FMA(KP555570233, Tew, KP831469612 * Tex); + TeB = FNMS(KP555570233, TeA, KP831469612 * Tez); + TeC = Tey - TeB; + Tfh = TeB + Tey; + } + { + E TeG, TeJ, TeT, TeU; + TeG = TeE - TeF; + TeJ = TeH - TeI; + TeK = FMA(KP471396736, TeG, KP881921264 * TeJ); + Tf2 = FNMS(KP471396736, TeJ, KP881921264 * TeG); + TeT = FNMS(KP555570233, Tex, KP831469612 * Tew); + TeU = FMA(KP831469612, TeA, KP555570233 * Tez); + TeV = TeT - TeU; + Tf8 = TeU + TeT; + } + { + E TeW, TeX, TeN, TeQ; + TeW = TcN - TcK; + TeX = TdV - TdU; + TeY = TeW - TeX; + Tfi = TeX + TeW; + TeN = TeL - TeM; + TeQ = TeO - TeP; + TeR = FNMS(KP471396736, TeQ, KP881921264 * TeN); + Tf3 = FMA(KP881921264, TeQ, KP471396736 * TeN); + } + { + E TeD, TeS, Tf1, Tf4; + TeD = Tev + TeC; + TeS = TeK + TeR; + Cr[WS(csr, 54)] = TeD - TeS; + Cr[WS(csr, 10)] = TeD + TeS; + Tf1 = TeY + TeV; + Tf4 = Tf2 + Tf3; + Ci[WS(csi, 10)] = Tf1 + Tf4; + Ci[WS(csi, 54)] = Tf4 - Tf1; + } + { + E TeZ, Tf0, Tf5, Tf6; + TeZ = TeV - TeY; + Tf0 = TeR - TeK; + Ci[WS(csi, 22)] = TeZ + Tf0; + Ci[WS(csi, 42)] = Tf0 - TeZ; + Tf5 = Tev - TeC; + Tf6 = Tf3 - Tf2; + Cr[WS(csr, 42)] = Tf5 - Tf6; + Cr[WS(csr, 22)] = Tf5 + Tf6; + } + { + E Tf9, Tfg, Tfl, Tfo; + Tf9 = Tf7 + Tf8; + Tfg = Tfc + Tff; + Cr[WS(csr, 58)] = Tf9 - Tfg; + Cr[WS(csr, 6)] = Tf9 + Tfg; + Tfl = Tfi + Tfh; + Tfo = Tfm + Tfn; + Ci[WS(csi, 6)] = Tfl + Tfo; + Ci[WS(csi, 58)] = Tfo - Tfl; + } + { + E Tfj, Tfk, Tfp, Tfq; + Tfj = Tfh - Tfi; + Tfk = Tff - Tfc; + Ci[WS(csi, 26)] = Tfj + Tfk; + Ci[WS(csi, 38)] = Tfk - Tfj; + Tfp = Tf7 - Tf8; + Tfq = Tfn - Tfm; + Cr[WS(csr, 38)] = Tfp - Tfq; + Cr[WS(csr, 26)] = Tfp + Tfq; + } + } + { + E TcP, Te9, Tee, Teo, Teh, Tep, Td8, Tej, Tdu, Te4, TdT, Tea, Te0, Tek, TdP; + E Te5; + { + E TcH, TcO, Tec, Ted; + TcH = TcD + TcG; + TcO = TcK + TcN; + TcP = TcH + TcO; + Te9 = TcH - TcO; + Tec = Tde - Tdl; + Ted = Tds - Tdp; + Tee = FMA(KP773010453, Tec, KP634393284 * Ted); + Teo = FNMS(KP634393284, Tec, KP773010453 * Ted); + } + { + E Tef, Teg, TcY, Td7; + Tef = Tdz - TdG; + Teg = TdN - TdK; + Teh = FNMS(KP634393284, Teg, KP773010453 * Tef); + Tep = FMA(KP634393284, Tef, KP773010453 * Teg); + TcY = FMA(KP980785280, TcU, KP195090322 * TcX); + Td7 = FNMS(KP195090322, Td6, KP980785280 * Td3); + Td8 = TcY + Td7; + Tej = Td7 - TcY; + } + { + E Tdm, Tdt, TdR, TdS; + Tdm = Tde + Tdl; + Tdt = Tdp + Tds; + Tdu = FMA(KP995184726, Tdm, KP098017140 * Tdt); + Te4 = FNMS(KP098017140, Tdm, KP995184726 * Tdt); + TdR = FNMS(KP195090322, TcU, KP980785280 * TcX); + TdS = FMA(KP195090322, Td3, KP980785280 * Td6); + TdT = TdR + TdS; + Tea = TdS - TdR; + } + { + E TdW, TdZ, TdH, TdO; + TdW = TdU + TdV; + TdZ = TdX + TdY; + Te0 = TdW + TdZ; + Tek = TdZ - TdW; + TdH = Tdz + TdG; + TdO = TdK + TdN; + TdP = FNMS(KP098017140, TdO, KP995184726 * TdH); + Te5 = FMA(KP098017140, TdH, KP995184726 * TdO); + } + { + E Td9, TdQ, Te3, Te6; + Td9 = TcP + Td8; + TdQ = Tdu + TdP; + Cr[WS(csr, 62)] = Td9 - TdQ; + Cr[WS(csr, 2)] = Td9 + TdQ; + Te3 = Te0 + TdT; + Te6 = Te4 + Te5; + Ci[WS(csi, 2)] = Te3 + Te6; + Ci[WS(csi, 62)] = Te6 - Te3; + } + { + E Te1, Te2, Te7, Te8; + Te1 = TdT - Te0; + Te2 = TdP - Tdu; + Ci[WS(csi, 30)] = Te1 + Te2; + Ci[WS(csi, 34)] = Te2 - Te1; + Te7 = TcP - Td8; + Te8 = Te5 - Te4; + Cr[WS(csr, 34)] = Te7 - Te8; + Cr[WS(csr, 30)] = Te7 + Te8; + } + { + E Teb, Tei, Ten, Teq; + Teb = Te9 + Tea; + Tei = Tee + Teh; + Cr[WS(csr, 50)] = Teb - Tei; + Cr[WS(csr, 14)] = Teb + Tei; + Ten = Tek + Tej; + Teq = Teo + Tep; + Ci[WS(csi, 14)] = Ten + Teq; + Ci[WS(csi, 50)] = Teq - Ten; + } + { + E Tel, Tem, Ter, Tes; + Tel = Tej - Tek; + Tem = Teh - Tee; + Ci[WS(csi, 18)] = Tel + Tem; + Ci[WS(csi, 46)] = Tem - Tel; + Ter = Te9 - Tea; + Tes = Tep - Teo; + Cr[WS(csr, 46)] = Ter - Tes; + Cr[WS(csr, 18)] = Ter + Tes; + } + } + { + E T6v, T77, T6C, T7h, T6Y, T7i, T6V, T78, T6R, T7n, T73, T7f, T6K, T7m, T72; + E T7c; + { + E T6t, T6u, T6T, T6U; + T6t = T27 - T2e; + T6u = T5Y - T5X; + T6v = T6t - T6u; + T77 = T6t + T6u; + { + E T6y, T6B, T6W, T6X; + T6y = FMA(KP773010453, T6w, KP634393284 * T6x); + T6B = FNMS(KP634393284, T6A, KP773010453 * T6z); + T6C = T6y - T6B; + T7h = T6B + T6y; + T6W = T2x - T2o; + T6X = T5V - T5S; + T6Y = T6W - T6X; + T7i = T6X + T6W; + } + T6T = FNMS(KP634393284, T6w, KP773010453 * T6x); + T6U = FMA(KP634393284, T6z, KP773010453 * T6A); + T6V = T6T - T6U; + T78 = T6U + T6T; + { + E T6N, T7d, T6Q, T7e, T6M, T6O; + T6M = T5I - T5H; + T6N = T6L - T6M; + T7d = T6L + T6M; + T6O = T5v - T5e; + T6Q = T6O - T6P; + T7e = T6P + T6O; + T6R = FNMS(KP427555093, T6Q, KP903989293 * T6N); + T7n = FMA(KP941544065, T7e, KP336889853 * T7d); + T73 = FMA(KP903989293, T6Q, KP427555093 * T6N); + T7f = FNMS(KP336889853, T7e, KP941544065 * T7d); + } + { + E T6G, T7a, T6J, T7b, T6E, T6I; + T6E = T4g - T3Z; + T6G = T6E - T6F; + T7a = T6F + T6E; + T6I = T4t - T4s; + T6J = T6H - T6I; + T7b = T6H + T6I; + T6K = FMA(KP427555093, T6G, KP903989293 * T6J); + T7m = FNMS(KP336889853, T7b, KP941544065 * T7a); + T72 = FNMS(KP427555093, T6J, KP903989293 * T6G); + T7c = FMA(KP336889853, T7a, KP941544065 * T7b); + } + } + { + E T6D, T6S, T71, T74; + T6D = T6v + T6C; + T6S = T6K + T6R; + Cr[WS(csr, 55)] = T6D - T6S; + Cr[WS(csr, 9)] = T6D + T6S; + T71 = T6Y + T6V; + T74 = T72 + T73; + Ci[WS(csi, 9)] = T71 + T74; + Ci[WS(csi, 55)] = T74 - T71; + } + { + E T6Z, T70, T75, T76; + T6Z = T6V - T6Y; + T70 = T6R - T6K; + Ci[WS(csi, 23)] = T6Z + T70; + Ci[WS(csi, 41)] = T70 - T6Z; + T75 = T6v - T6C; + T76 = T73 - T72; + Cr[WS(csr, 41)] = T75 - T76; + Cr[WS(csr, 23)] = T75 + T76; + } + { + E T79, T7g, T7l, T7o; + T79 = T77 + T78; + T7g = T7c + T7f; + Cr[WS(csr, 57)] = T79 - T7g; + Cr[WS(csr, 7)] = T79 + T7g; + T7l = T7i + T7h; + T7o = T7m + T7n; + Ci[WS(csi, 7)] = T7l + T7o; + Ci[WS(csi, 57)] = T7o - T7l; + } + { + E T7j, T7k, T7p, T7q; + T7j = T7h - T7i; + T7k = T7f - T7c; + Ci[WS(csi, 25)] = T7j + T7k; + Ci[WS(csi, 39)] = T7k - T7j; + T7p = T77 - T78; + T7q = T7n - T7m; + Cr[WS(csr, 39)] = T7p - T7q; + Cr[WS(csr, 25)] = T7p + T7q; + } + } + { + E T99, T9L, T9g, T9V, T9C, T9W, T9z, T9M, T9v, Ta1, T9H, T9T, T9o, Ta0, T9G; + E T9Q; + { + E T97, T98, T9x, T9y; + T97 = T7r - T7s; + T98 = T8C - T8B; + T99 = T97 - T98; + T9L = T97 + T98; + { + E T9c, T9f, T9A, T9B; + T9c = FMA(KP471396736, T9a, KP881921264 * T9b); + T9f = FNMS(KP471396736, T9e, KP881921264 * T9d); + T9g = T9c - T9f; + T9V = T9f + T9c; + T9A = T7z - T7w; + T9B = T8z - T8y; + T9C = T9A - T9B; + T9W = T9B + T9A; + } + T9x = FNMS(KP471396736, T9b, KP881921264 * T9a); + T9y = FMA(KP881921264, T9e, KP471396736 * T9d); + T9z = T9x - T9y; + T9M = T9y + T9x; + { + E T9r, T9R, T9u, T9S, T9q, T9s; + T9q = T8q - T8p; + T9r = T9p - T9q; + T9R = T9p + T9q; + T9s = T8j - T8g; + T9u = T9s - T9t; + T9S = T9t + T9s; + T9v = FNMS(KP514102744, T9u, KP857728610 * T9r); + Ta1 = FMA(KP970031253, T9S, KP242980179 * T9R); + T9H = FMA(KP857728610, T9u, KP514102744 * T9r); + T9T = FNMS(KP242980179, T9S, KP970031253 * T9R); + } + { + E T9k, T9O, T9n, T9P, T9i, T9m; + T9i = T80 - T7X; + T9k = T9i - T9j; + T9O = T9j + T9i; + T9m = T87 - T86; + T9n = T9l - T9m; + T9P = T9l + T9m; + T9o = FMA(KP514102744, T9k, KP857728610 * T9n); + Ta0 = FNMS(KP242980179, T9P, KP970031253 * T9O); + T9G = FNMS(KP514102744, T9n, KP857728610 * T9k); + T9Q = FMA(KP242980179, T9O, KP970031253 * T9P); + } + } + { + E T9h, T9w, T9F, T9I; + T9h = T99 + T9g; + T9w = T9o + T9v; + Cr[WS(csr, 53)] = T9h - T9w; + Cr[WS(csr, 11)] = T9h + T9w; + T9F = T9C + T9z; + T9I = T9G + T9H; + Ci[WS(csi, 11)] = T9F + T9I; + Ci[WS(csi, 53)] = T9I - T9F; + } + { + E T9D, T9E, T9J, T9K; + T9D = T9z - T9C; + T9E = T9v - T9o; + Ci[WS(csi, 21)] = T9D + T9E; + Ci[WS(csi, 43)] = T9E - T9D; + T9J = T99 - T9g; + T9K = T9H - T9G; + Cr[WS(csr, 43)] = T9J - T9K; + Cr[WS(csr, 21)] = T9J + T9K; + } + { + E T9N, T9U, T9Z, Ta2; + T9N = T9L + T9M; + T9U = T9Q + T9T; + Cr[WS(csr, 59)] = T9N - T9U; + Cr[WS(csr, 5)] = T9N + T9U; + T9Z = T9W + T9V; + Ta2 = Ta0 + Ta1; + Ci[WS(csi, 5)] = T9Z + Ta2; + Ci[WS(csi, 59)] = Ta2 - T9Z; + } + { + E T9X, T9Y, Ta3, Ta4; + T9X = T9V - T9W; + T9Y = T9T - T9Q; + Ci[WS(csi, 27)] = T9X + T9Y; + Ci[WS(csi, 37)] = T9Y - T9X; + Ta3 = T9L - T9M; + Ta4 = Ta1 - Ta0; + Cr[WS(csr, 37)] = Ta3 - Ta4; + Cr[WS(csr, 27)] = Ta3 + Ta4; + } + } + { + E T2z, T69, T3g, T6j, T60, T6k, T5P, T6a, T5L, T6p, T65, T6h, T4w, T6o, T64; + E T6e; + { + E T2f, T2y, T5N, T5O; + T2f = T27 + T2e; + T2y = T2o + T2x; + T2z = T2f + T2y; + T69 = T2f - T2y; + { + E T2U, T3f, T5W, T5Z; + T2U = FMA(KP098017140, T2M, KP995184726 * T2T); + T3f = FNMS(KP098017140, T3e, KP995184726 * T37); + T3g = T2U + T3f; + T6j = T3f - T2U; + T5W = T5S + T5V; + T5Z = T5X + T5Y; + T60 = T5W + T5Z; + T6k = T5Z - T5W; + } + T5N = FNMS(KP098017140, T2T, KP995184726 * T2M); + T5O = FMA(KP995184726, T3e, KP098017140 * T37); + T5P = T5N + T5O; + T6a = T5O - T5N; + { + E T5x, T6f, T5K, T6g, T5w, T5J; + T5w = T5e + T5v; + T5x = T4X + T5w; + T6f = T4X - T5w; + T5J = T5H + T5I; + T5K = T5G + T5J; + T6g = T5J - T5G; + T5L = FNMS(KP049067674, T5K, KP998795456 * T5x); + T6p = FMA(KP671558954, T6f, KP740951125 * T6g); + T65 = FMA(KP049067674, T5x, KP998795456 * T5K); + T6h = FNMS(KP671558954, T6g, KP740951125 * T6f); + } + { + E T4i, T6c, T4v, T6d, T4h, T4u; + T4h = T3Z + T4g; + T4i = T3I + T4h; + T6c = T3I - T4h; + T4u = T4s + T4t; + T4v = T4r + T4u; + T6d = T4u - T4r; + T4w = FMA(KP998795456, T4i, KP049067674 * T4v); + T6o = FNMS(KP671558954, T6c, KP740951125 * T6d); + T64 = FNMS(KP049067674, T4i, KP998795456 * T4v); + T6e = FMA(KP740951125, T6c, KP671558954 * T6d); + } + } + { + E T3h, T5M, T63, T66; + T3h = T2z + T3g; + T5M = T4w + T5L; + Cr[WS(csr, 63)] = T3h - T5M; + Cr[WS(csr, 1)] = T3h + T5M; + T63 = T60 + T5P; + T66 = T64 + T65; + Ci[WS(csi, 1)] = T63 + T66; + Ci[WS(csi, 63)] = T66 - T63; + } + { + E T61, T62, T67, T68; + T61 = T5P - T60; + T62 = T5L - T4w; + Ci[WS(csi, 31)] = T61 + T62; + Ci[WS(csi, 33)] = T62 - T61; + T67 = T2z - T3g; + T68 = T65 - T64; + Cr[WS(csr, 33)] = T67 - T68; + Cr[WS(csr, 31)] = T67 + T68; + } + { + E T6b, T6i, T6n, T6q; + T6b = T69 + T6a; + T6i = T6e + T6h; + Cr[WS(csr, 49)] = T6b - T6i; + Cr[WS(csr, 15)] = T6b + T6i; + T6n = T6k + T6j; + T6q = T6o + T6p; + Ci[WS(csi, 15)] = T6n + T6q; + Ci[WS(csi, 49)] = T6q - T6n; + } + { + E T6l, T6m, T6r, T6s; + T6l = T6j - T6k; + T6m = T6h - T6e; + Ci[WS(csi, 17)] = T6l + T6m; + Ci[WS(csi, 47)] = T6m - T6l; + T6r = T69 - T6a; + T6s = T6p - T6o; + Cr[WS(csr, 47)] = T6r - T6s; + Cr[WS(csr, 17)] = T6r + T6s; + } + } + { + E T7B, T8N, T7Q, T8X, T8E, T8Y, T8x, T8O, T8t, T93, T8J, T8V, T8a, T92, T8I; + E T8S; + { + E T7t, T7A, T8v, T8w; + T7t = T7r + T7s; + T7A = T7w + T7z; + T7B = T7t + T7A; + T8N = T7t - T7A; + { + E T7I, T7P, T8A, T8D; + T7I = FMA(KP956940335, T7E, KP290284677 * T7H); + T7P = FNMS(KP290284677, T7O, KP956940335 * T7L); + T7Q = T7I + T7P; + T8X = T7P - T7I; + T8A = T8y + T8z; + T8D = T8B + T8C; + T8E = T8A + T8D; + T8Y = T8D - T8A; + } + T8v = FNMS(KP290284677, T7E, KP956940335 * T7H); + T8w = FMA(KP290284677, T7L, KP956940335 * T7O); + T8x = T8v + T8w; + T8O = T8w - T8v; + { + E T8l, T8T, T8s, T8U, T8k, T8r; + T8k = T8g + T8j; + T8l = T8d + T8k; + T8T = T8d - T8k; + T8r = T8p + T8q; + T8s = T8o + T8r; + T8U = T8r - T8o; + T8t = FNMS(KP146730474, T8s, KP989176509 * T8l); + T93 = FMA(KP595699304, T8T, KP803207531 * T8U); + T8J = FMA(KP146730474, T8l, KP989176509 * T8s); + T8V = FNMS(KP595699304, T8U, KP803207531 * T8T); + } + { + E T82, T8Q, T89, T8R, T81, T88; + T81 = T7X + T80; + T82 = T7U + T81; + T8Q = T7U - T81; + T88 = T86 + T87; + T89 = T85 + T88; + T8R = T88 - T85; + T8a = FMA(KP989176509, T82, KP146730474 * T89); + T92 = FNMS(KP595699304, T8Q, KP803207531 * T8R); + T8I = FNMS(KP146730474, T82, KP989176509 * T89); + T8S = FMA(KP803207531, T8Q, KP595699304 * T8R); + } + } + { + E T7R, T8u, T8H, T8K; + T7R = T7B + T7Q; + T8u = T8a + T8t; + Cr[WS(csr, 61)] = T7R - T8u; + Cr[WS(csr, 3)] = T7R + T8u; + T8H = T8E + T8x; + T8K = T8I + T8J; + Ci[WS(csi, 3)] = T8H + T8K; + Ci[WS(csi, 61)] = T8K - T8H; + } + { + E T8F, T8G, T8L, T8M; + T8F = T8x - T8E; + T8G = T8t - T8a; + Ci[WS(csi, 29)] = T8F + T8G; + Ci[WS(csi, 35)] = T8G - T8F; + T8L = T7B - T7Q; + T8M = T8J - T8I; + Cr[WS(csr, 35)] = T8L - T8M; + Cr[WS(csr, 29)] = T8L + T8M; + } + { + E T8P, T8W, T91, T94; + T8P = T8N + T8O; + T8W = T8S + T8V; + Cr[WS(csr, 51)] = T8P - T8W; + Cr[WS(csr, 13)] = T8P + T8W; + T91 = T8Y + T8X; + T94 = T92 + T93; + Ci[WS(csi, 13)] = T91 + T94; + Ci[WS(csi, 51)] = T94 - T91; + } + { + E T8Z, T90, T95, T96; + T8Z = T8X - T8Y; + T90 = T8V - T8S; + Ci[WS(csi, 19)] = T8Z + T90; + Ci[WS(csi, 45)] = T90 - T8Z; + T95 = T8N - T8O; + T96 = T93 - T92; + Cr[WS(csr, 45)] = T95 - T96; + Cr[WS(csr, 19)] = T95 + T96; + } + } + } + } +} + +static const kr2c_desc desc = { 128, "r2cf_128", {812, 186, 144, 0}, &GENUS }; + +void X(codelet_r2cf_128) (planner *p) { + X(kr2c_register) (p, r2cf_128, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_13.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_13.c new file mode 100644 index 000000000..d260f3214 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_13.c @@ -0,0 +1,363 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 13 -name r2cf_13 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 76 FP additions, 51 FP multiplications, + * (or, 31 additions, 6 multiplications, 45 fused multiply/add), + * 58 stack variables, 23 constants, and 26 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_13(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP300462606, +0.300462606288665774426601772289207995520941381); + DK(KP516520780, +0.516520780623489722840901288569017135705033622); + DK(KP859542535, +0.859542535098774820163672132761689612766401925); + DK(KP581704778, +0.581704778510515730456870384989698884939833902); + DK(KP514918778, +0.514918778086315755491789696138117261566051239); + DK(KP769338817, +0.769338817572980603471413688209101117038278899); + DK(KP686558370, +0.686558370781754340655719594850823015421401653); + DK(KP226109445, +0.226109445035782405468510155372505010481906348); + DK(KP251768516, +0.251768516431883313623436926934233488546674281); + DK(KP503537032, +0.503537032863766627246873853868466977093348562); + DK(KP301479260, +0.301479260047709873958013540496673347309208464); + DK(KP083333333, +0.083333333333333333333333333333333333333333333); + DK(KP904176221, +0.904176221990848204433795481776887926501523162); + DK(KP575140729, +0.575140729474003121368385547455453388461001608); + DK(KP522026385, +0.522026385161275033714027226654165028300441940); + DK(KP957805992, +0.957805992594665126462521754605754580515587217); + DK(KP600477271, +0.600477271932665282925769253334763009352012849); + DK(KP853480001, +0.853480001859823990758994934970528322872359049); + DK(KP612264650, +0.612264650376756543746494474777125408779395514); + DK(KP038632954, +0.038632954644348171955506895830342264440241080); + DK(KP302775637, +0.302775637731994646559610633735247973125648287); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(52, rs), MAKE_VOLATILE_STRIDE(52, csr), MAKE_VOLATILE_STRIDE(52, csi)) { + E TN, TA, TD, TO, TR, TS, TZ, T12, Tu, Tx, Tj, Tw, TW, T13; + TN = R0[0]; + { + E T3, TP, Th, TB, Tp, Te, TC, Tm, T6, Tr, T9, Ts, Ta, TQ, T1; + E T2; + T1 = R0[WS(rs, 4)]; + T2 = R1[WS(rs, 2)]; + T3 = T1 - T2; + TP = T1 + T2; + { + E Tn, Tf, Tg, To; + Tn = R0[WS(rs, 6)]; + Tf = R0[WS(rs, 5)]; + Tg = R0[WS(rs, 2)]; + To = Tf + Tg; + Th = Tf - Tg; + TB = Tn + To; + Tp = FMS(KP500000000, To, Tn); + } + { + E Tk, Tc, Td, Tl; + Tk = R1[0]; + Tc = R1[WS(rs, 4)]; + Td = R1[WS(rs, 1)]; + Tl = Td + Tc; + Te = Tc - Td; + TC = Tk + Tl; + Tm = FNMS(KP500000000, Tl, Tk); + } + { + E T4, T5, T7, T8; + T4 = R1[WS(rs, 5)]; + T5 = R0[WS(rs, 3)]; + T6 = T4 - T5; + Tr = T4 + T5; + T7 = R1[WS(rs, 3)]; + T8 = R0[WS(rs, 1)]; + T9 = T7 - T8; + Ts = T7 + T8; + } + Ta = T6 + T9; + TQ = Tr + Ts; + TA = T3 + Ta; + TD = TB - TC; + TO = TC + TB; + TR = TP + TQ; + TS = TO + TR; + { + E TX, TY, Tq, Tt; + TX = Tm - Tp; + TY = FNMS(KP500000000, TQ, TP); + TZ = TX + TY; + T12 = TX - TY; + Tq = Tm + Tp; + Tt = Tr - Ts; + Tu = FMA(KP866025403, Tt, Tq); + Tx = FNMS(KP866025403, Tt, Tq); + } + { + E Tb, Ti, TU, TV; + Tb = FNMS(KP500000000, Ta, T3); + Ti = Te + Th; + Tj = FMA(KP866025403, Ti, Tb); + Tw = FNMS(KP866025403, Ti, Tb); + TU = Th - Te; + TV = T6 - T9; + TW = TU + TV; + T13 = TU - TV; + } + } + Cr[0] = TN + TS; + { + E TE, TI, Tz, TK, TH, TM, TJ, TL; + TE = FMA(KP302775637, TD, TA); + TI = FNMS(KP302775637, TA, TD); + { + E Tv, Ty, TF, TG; + Tv = FMA(KP038632954, Tu, Tj); + Ty = FMA(KP612264650, Tx, Tw); + Tz = FNMS(KP853480001, Ty, Tv); + TK = FMA(KP853480001, Ty, Tv); + TF = FNMS(KP038632954, Tj, Tu); + TG = FNMS(KP612264650, Tw, Tx); + TH = FNMS(KP853480001, TG, TF); + TM = FMA(KP853480001, TG, TF); + } + Ci[WS(csi, 1)] = KP600477271 * (FMA(KP957805992, TE, Tz)); + Ci[WS(csi, 5)] = -(KP600477271 * (FNMS(KP957805992, TI, TH))); + TJ = FMA(KP522026385, TH, TI); + Ci[WS(csi, 2)] = KP575140729 * (FNMS(KP904176221, TK, TJ)); + Ci[WS(csi, 6)] = KP575140729 * (FMA(KP904176221, TK, TJ)); + TL = FNMS(KP522026385, Tz, TE); + Ci[WS(csi, 3)] = KP575140729 * (FNMS(KP904176221, TM, TL)); + Ci[WS(csi, 4)] = -(KP575140729 * (FMA(KP904176221, TM, TL))); + } + { + E T11, T17, T1c, T1e, T16, T18, TT, T10, T19, T1d; + TT = FNMS(KP083333333, TS, TN); + T10 = FMA(KP301479260, TZ, TW); + T11 = FMA(KP503537032, T10, TT); + T17 = FNMS(KP251768516, T10, TT); + { + E T1a, T1b, T14, T15; + T1a = FNMS(KP226109445, TW, TZ); + T1b = FMA(KP686558370, T12, T13); + T1c = FNMS(KP769338817, T1b, T1a); + T1e = FMA(KP769338817, T1b, T1a); + T14 = FNMS(KP514918778, T13, T12); + T15 = TO - TR; + T16 = FMA(KP581704778, T15, T14); + T18 = FNMS(KP859542535, T14, T15); + } + Cr[WS(csr, 5)] = FNMS(KP516520780, T16, T11); + Cr[WS(csr, 1)] = FMA(KP516520780, T16, T11); + T19 = FMA(KP300462606, T18, T17); + Cr[WS(csr, 4)] = FNMS(KP503537032, T1c, T19); + Cr[WS(csr, 3)] = FMA(KP503537032, T1c, T19); + T1d = FNMS(KP300462606, T18, T17); + Cr[WS(csr, 6)] = FNMS(KP503537032, T1e, T1d); + Cr[WS(csr, 2)] = FMA(KP503537032, T1e, T1d); + } + } + } +} + +static const kr2c_desc desc = { 13, "r2cf_13", {31, 6, 45, 0}, &GENUS }; + +void X(codelet_r2cf_13) (planner *p) { + X(kr2c_register) (p, r2cf_13, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 13 -name r2cf_13 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 76 FP additions, 34 FP multiplications, + * (or, 57 additions, 15 multiplications, 19 fused multiply/add), + * 55 stack variables, 20 constants, and 26 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_13(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP083333333, +0.083333333333333333333333333333333333333333333); + DK(KP075902986, +0.075902986037193865983102897245103540356428373); + DK(KP251768516, +0.251768516431883313623436926934233488546674281); + DK(KP503537032, +0.503537032863766627246873853868466977093348562); + DK(KP113854479, +0.113854479055790798974654345867655310534642560); + DK(KP265966249, +0.265966249214837287587521063842185948798330267); + DK(KP387390585, +0.387390585467617292130675966426762851778775217); + DK(KP300462606, +0.300462606288665774426601772289207995520941381); + DK(KP132983124, +0.132983124607418643793760531921092974399165133); + DK(KP258260390, +0.258260390311744861420450644284508567852516811); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_732050807, +1.732050807568877293527446341505872366942805254); + DK(KP300238635, +0.300238635966332641462884626667381504676006424); + DK(KP011599105, +0.011599105605768290721655456654083252189827041); + DK(KP156891391, +0.156891391051584611046832726756003269660212636); + DK(KP256247671, +0.256247671582936600958684654061725059144125175); + DK(KP174138601, +0.174138601152135905005660794929264742616964676); + DK(KP575140729, +0.575140729474003121368385547455453388461001608); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(52, rs), MAKE_VOLATILE_STRIDE(52, csr), MAKE_VOLATILE_STRIDE(52, csi)) { + E T13, Tb, Tm, TW, TX, T14, TU, T10, Tz, TB, Tu, TC, TR, T11; + T13 = R0[0]; + { + E Te, TO, Ta, Tv, To, T5, Tw, Tp, Th, Tr, Tk, Ts, Tl, TP, Tc; + E Td; + Tc = R0[WS(rs, 4)]; + Td = R1[WS(rs, 2)]; + Te = Tc - Td; + TO = Tc + Td; + { + E T6, T7, T8, T9; + T6 = R1[0]; + T7 = R1[WS(rs, 1)]; + T8 = R1[WS(rs, 4)]; + T9 = T7 + T8; + Ta = T6 + T9; + Tv = T7 - T8; + To = FNMS(KP500000000, T9, T6); + } + { + E T1, T2, T3, T4; + T1 = R0[WS(rs, 6)]; + T2 = R0[WS(rs, 5)]; + T3 = R0[WS(rs, 2)]; + T4 = T2 + T3; + T5 = T1 + T4; + Tw = T2 - T3; + Tp = FNMS(KP500000000, T4, T1); + } + { + E Tf, Tg, Ti, Tj; + Tf = R1[WS(rs, 5)]; + Tg = R0[WS(rs, 3)]; + Th = Tf - Tg; + Tr = Tf + Tg; + Ti = R1[WS(rs, 3)]; + Tj = R0[WS(rs, 1)]; + Tk = Ti - Tj; + Ts = Ti + Tj; + } + Tl = Th + Tk; + TP = Tr + Ts; + Tb = T5 - Ta; + Tm = Te + Tl; + TW = Ta + T5; + TX = TO + TP; + T14 = TW + TX; + { + E TS, TT, Tx, Ty; + TS = Tv + Tw; + TT = Th - Tk; + TU = TS - TT; + T10 = TS + TT; + Tx = KP866025403 * (Tv - Tw); + Ty = FNMS(KP500000000, Tl, Te); + Tz = Tx + Ty; + TB = Ty - Tx; + } + { + E Tq, Tt, TN, TQ; + Tq = To - Tp; + Tt = KP866025403 * (Tr - Ts); + Tu = Tq - Tt; + TC = Tq + Tt; + TN = To + Tp; + TQ = FNMS(KP500000000, TP, TO); + TR = TN - TQ; + T11 = TN + TQ; + } + } + Cr[0] = T13 + T14; + { + E Tn, TG, TE, TF, TJ, TM, TK, TL; + Tn = FNMS(KP174138601, Tm, KP575140729 * Tb); + TG = FMA(KP174138601, Tb, KP575140729 * Tm); + { + E TA, TD, TH, TI; + TA = FNMS(KP156891391, Tz, KP256247671 * Tu); + TD = FNMS(KP300238635, TC, KP011599105 * TB); + TE = TA + TD; + TF = KP1_732050807 * (TD - TA); + TH = FMA(KP300238635, TB, KP011599105 * TC); + TI = FMA(KP256247671, Tz, KP156891391 * Tu); + TJ = TH - TI; + TM = KP1_732050807 * (TI + TH); + } + Ci[WS(csi, 5)] = FMA(KP2_000000000, TE, Tn); + Ci[WS(csi, 1)] = FMA(KP2_000000000, TJ, TG); + TK = TG - TJ; + Ci[WS(csi, 4)] = TF - TK; + Ci[WS(csi, 3)] = TF + TK; + TL = Tn - TE; + Ci[WS(csi, 2)] = TL - TM; + Ci[WS(csi, 6)] = TL + TM; + } + { + E TZ, T1b, T19, T1e, T16, T1a, TV, TY, T1c, T1d; + TV = FNMS(KP132983124, TU, KP258260390 * TR); + TY = KP300462606 * (TW - TX); + TZ = FMA(KP2_000000000, TV, TY); + T1b = TY - TV; + { + E T17, T18, T12, T15; + T17 = FMA(KP387390585, TU, KP265966249 * TR); + T18 = FNMS(KP503537032, T11, KP113854479 * T10); + T19 = T17 - T18; + T1e = T17 + T18; + T12 = FMA(KP251768516, T10, KP075902986 * T11); + T15 = FNMS(KP083333333, T14, T13); + T16 = FMA(KP2_000000000, T12, T15); + T1a = T15 - T12; + } + Cr[WS(csr, 1)] = TZ + T16; + Cr[WS(csr, 5)] = T16 - TZ; + T1c = T1a - T1b; + Cr[WS(csr, 2)] = T19 + T1c; + Cr[WS(csr, 6)] = T1c - T19; + T1d = T1b + T1a; + Cr[WS(csr, 3)] = T1d - T1e; + Cr[WS(csr, 4)] = T1e + T1d; + } + } + } +} + +static const kr2c_desc desc = { 13, "r2cf_13", {57, 15, 19, 0}, &GENUS }; + +void X(codelet_r2cf_13) (planner *p) { + X(kr2c_register) (p, r2cf_13, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_14.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_14.c new file mode 100644 index 000000000..57798c9f7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_14.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 14 -name r2cf_14 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 62 FP additions, 36 FP multiplications, + * (or, 32 additions, 6 multiplications, 30 fused multiply/add), + * 33 stack variables, 6 constants, and 28 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_14(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(56, rs), MAKE_VOLATILE_STRIDE(56, csr), MAKE_VOLATILE_STRIDE(56, csi)) { + E T3, TN, To, TQ, Tx, TG, Ta, TO, Tw, TD, Th, TP, Tv, TJ, T1; + E T2, TA, TK; + T1 = R0[0]; + T2 = R1[WS(rs, 3)]; + T3 = T1 - T2; + TN = T1 + T2; + { + E Tk, TE, Tn, TF; + { + E Ti, Tj, Tl, Tm; + Ti = R0[WS(rs, 3)]; + Tj = R1[WS(rs, 6)]; + Tk = Ti - Tj; + TE = Ti + Tj; + Tl = R0[WS(rs, 4)]; + Tm = R1[0]; + Tn = Tl - Tm; + TF = Tl + Tm; + } + To = Tk + Tn; + TQ = TE + TF; + Tx = Tn - Tk; + TG = TE - TF; + } + { + E T6, TC, T9, TB; + { + E T4, T5, T7, T8; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 4)]; + T6 = T4 - T5; + TC = T4 + T5; + T7 = R0[WS(rs, 6)]; + T8 = R1[WS(rs, 2)]; + T9 = T7 - T8; + TB = T7 + T8; + } + Ta = T6 + T9; + TO = TC + TB; + Tw = T6 - T9; + TD = TB - TC; + } + { + E Td, TH, Tg, TI; + { + E Tb, Tc, Te, Tf; + Tb = R0[WS(rs, 2)]; + Tc = R1[WS(rs, 5)]; + Td = Tb - Tc; + TH = Tb + Tc; + Te = R0[WS(rs, 5)]; + Tf = R1[WS(rs, 1)]; + Tg = Te - Tf; + TI = Te + Tf; + } + Th = Td + Tg; + TP = TH + TI; + Tv = Tg - Td; + TJ = TH - TI; + } + Cr[WS(csr, 7)] = T3 + Ta + Th + To; + Cr[0] = TN + TO + TP + TQ; + TA = FMA(KP554958132, Tw, Tv); + Ci[WS(csi, 3)] = KP974927912 * (FNMS(KP801937735, TA, Tx)); + { + E TL, TM, Ty, Tz; + TL = FNMS(KP554958132, TG, TD); + Ci[WS(csi, 6)] = KP974927912 * (FNMS(KP801937735, TL, TJ)); + TM = FMA(KP554958132, TD, TJ); + Ci[WS(csi, 4)] = KP974927912 * (FNMS(KP801937735, TM, TG)); + Ty = FNMS(KP554958132, Tx, Tw); + Ci[WS(csi, 1)] = KP974927912 * (FNMS(KP801937735, Ty, Tv)); + Tz = FMA(KP554958132, Tv, Tx); + Ci[WS(csi, 5)] = KP974927912 * (FMA(KP801937735, Tz, Tw)); + } + TK = FMA(KP554958132, TJ, TG); + Ci[WS(csi, 2)] = KP974927912 * (FMA(KP801937735, TK, TD)); + { + E TU, TT, Tq, Tp; + TT = FNMS(KP356895867, TO, TQ); + TU = FNMS(KP692021471, TT, TP); + Cr[WS(csr, 2)] = FNMS(KP900968867, TU, TN); + Tp = FNMS(KP356895867, To, Th); + Tq = FNMS(KP692021471, Tp, Ta); + Cr[WS(csr, 3)] = FNMS(KP900968867, Tq, T3); + } + { + E Tu, Tt, Ts, Tr; + Tt = FNMS(KP356895867, Th, Ta); + Tu = FNMS(KP692021471, Tt, To); + Cr[WS(csr, 1)] = FNMS(KP900968867, Tu, T3); + Tr = FNMS(KP356895867, Ta, To); + Ts = FNMS(KP692021471, Tr, Th); + Cr[WS(csr, 5)] = FNMS(KP900968867, Ts, T3); + } + { + E TW, TV, TS, TR; + TV = FNMS(KP356895867, TP, TO); + TW = FNMS(KP692021471, TV, TQ); + Cr[WS(csr, 6)] = FNMS(KP900968867, TW, TN); + TR = FNMS(KP356895867, TQ, TP); + TS = FNMS(KP692021471, TR, TO); + Cr[WS(csr, 4)] = FNMS(KP900968867, TS, TN); + } + } + } +} + +static const kr2c_desc desc = { 14, "r2cf_14", {32, 6, 30, 0}, &GENUS }; + +void X(codelet_r2cf_14) (planner *p) { + X(kr2c_register) (p, r2cf_14, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 14 -name r2cf_14 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 62 FP additions, 36 FP multiplications, + * (or, 38 additions, 12 multiplications, 24 fused multiply/add), + * 29 stack variables, 6 constants, and 28 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_14(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(56, rs), MAKE_VOLATILE_STRIDE(56, csr), MAKE_VOLATILE_STRIDE(56, csi)) { + E T3, TB, T6, Tv, Tn, Ts, Tk, Tt, Td, Ty, T9, Tw, Tg, Tz, T1; + E T2; + T1 = R0[0]; + T2 = R1[WS(rs, 3)]; + T3 = T1 - T2; + TB = T1 + T2; + { + E T4, T5, Tl, Tm; + T4 = R0[WS(rs, 2)]; + T5 = R1[WS(rs, 5)]; + T6 = T4 - T5; + Tv = T4 + T5; + Tl = R0[WS(rs, 6)]; + Tm = R1[WS(rs, 2)]; + Tn = Tl - Tm; + Ts = Tl + Tm; + } + { + E Ti, Tj, Tb, Tc; + Ti = R0[WS(rs, 1)]; + Tj = R1[WS(rs, 4)]; + Tk = Ti - Tj; + Tt = Ti + Tj; + Tb = R0[WS(rs, 3)]; + Tc = R1[WS(rs, 6)]; + Td = Tb - Tc; + Ty = Tb + Tc; + } + { + E T7, T8, Te, Tf; + T7 = R0[WS(rs, 5)]; + T8 = R1[WS(rs, 1)]; + T9 = T7 - T8; + Tw = T7 + T8; + Te = R0[WS(rs, 4)]; + Tf = R1[0]; + Tg = Te - Tf; + Tz = Te + Tf; + } + { + E Tp, Tr, Tq, Ta, To, Th; + Tp = Tn - Tk; + Tr = Tg - Td; + Tq = T9 - T6; + Ci[WS(csi, 1)] = FMA(KP781831482, Tp, KP974927912 * Tq) + (KP433883739 * Tr); + Ci[WS(csi, 5)] = FMA(KP433883739, Tq, KP781831482 * Tr) - (KP974927912 * Tp); + Ci[WS(csi, 3)] = FMA(KP433883739, Tp, KP974927912 * Tr) - (KP781831482 * Tq); + Ta = T6 + T9; + To = Tk + Tn; + Th = Td + Tg; + Cr[WS(csr, 3)] = FMA(KP623489801, Ta, T3) + FNMA(KP222520933, Th, KP900968867 * To); + Cr[WS(csr, 7)] = T3 + To + Ta + Th; + Cr[WS(csr, 1)] = FMA(KP623489801, To, T3) + FNMA(KP900968867, Th, KP222520933 * Ta); + Cr[WS(csr, 5)] = FMA(KP623489801, Th, T3) + FNMA(KP900968867, Ta, KP222520933 * To); + } + { + E Tu, TA, Tx, TC, TE, TD; + Tu = Ts - Tt; + TA = Ty - Tz; + Tx = Tv - Tw; + Ci[WS(csi, 2)] = FMA(KP974927912, Tu, KP433883739 * Tx) + (KP781831482 * TA); + Ci[WS(csi, 6)] = FMA(KP974927912, Tx, KP433883739 * TA) - (KP781831482 * Tu); + Ci[WS(csi, 4)] = FNMS(KP781831482, Tx, KP974927912 * TA) - (KP433883739 * Tu); + TC = Tt + Ts; + TE = Tv + Tw; + TD = Ty + Tz; + Cr[WS(csr, 6)] = FMA(KP623489801, TC, TB) + FNMA(KP900968867, TD, KP222520933 * TE); + Cr[WS(csr, 2)] = FMA(KP623489801, TD, TB) + FNMA(KP900968867, TE, KP222520933 * TC); + Cr[WS(csr, 4)] = FMA(KP623489801, TE, TB) + FNMA(KP222520933, TD, KP900968867 * TC); + Cr[0] = TB + TC + TE + TD; + } + } + } +} + +static const kr2c_desc desc = { 14, "r2cf_14", {38, 12, 24, 0}, &GENUS }; + +void X(codelet_r2cf_14) (planner *p) { + X(kr2c_register) (p, r2cf_14, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_15.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_15.c new file mode 100644 index 000000000..357306abf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_15.c @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 15 -name r2cf_15 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 64 FP additions, 35 FP multiplications, + * (or, 36 additions, 7 multiplications, 28 fused multiply/add), + * 45 stack variables, 8 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP910592997, +0.910592997310029334643087372129977886038870291); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP823639103, +0.823639103546331925877420039278190003029660514); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E Ti, TR, TF, TM, TN, T7, Te, Tf, TV, TW, TX, Ts, Tv, TH, Tl; + E To, TG, TS, TT, TU; + { + E TD, Tg, Th, TE; + TD = R0[0]; + Tg = R0[WS(rs, 5)]; + Th = R1[WS(rs, 2)]; + TE = Th + Tg; + Ti = Tg - Th; + TR = TD + TE; + TF = FNMS(KP500000000, TE, TD); + } + { + E Tj, Tq, Tt, Tm, T3, Tk, Ta, Tr, Td, Tu, T6, Tn; + Tj = R1[WS(rs, 1)]; + Tq = R0[WS(rs, 3)]; + Tt = R1[WS(rs, 4)]; + Tm = R0[WS(rs, 6)]; + { + E T1, T2, T8, T9; + T1 = R0[WS(rs, 4)]; + T2 = R1[WS(rs, 6)]; + T3 = T1 - T2; + Tk = T1 + T2; + T8 = R1[WS(rs, 5)]; + T9 = R1[0]; + Ta = T8 - T9; + Tr = T8 + T9; + } + { + E Tb, Tc, T4, T5; + Tb = R0[WS(rs, 7)]; + Tc = R0[WS(rs, 2)]; + Td = Tb - Tc; + Tu = Tb + Tc; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 3)]; + T6 = T4 - T5; + Tn = T4 + T5; + } + TM = T6 - T3; + TN = Td - Ta; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + TV = Tq + Tr; + TW = Tt + Tu; + TX = TV + TW; + Ts = FNMS(KP500000000, Tr, Tq); + Tv = FNMS(KP500000000, Tu, Tt); + TH = Ts + Tv; + Tl = FNMS(KP500000000, Tk, Tj); + To = FNMS(KP500000000, Tn, Tm); + TG = Tl + To; + TS = Tj + Tk; + TT = Tm + Tn; + TU = TS + TT; + } + Ci[WS(csi, 5)] = KP866025403 * (Tf - Ti); + { + E TK, TQ, TO, TI, TJ, TP, TL; + TK = TG - TH; + TQ = FNMS(KP618033988, TM, TN); + TO = FMA(KP618033988, TN, TM); + TI = TG + TH; + TJ = FNMS(KP250000000, TI, TF); + Cr[WS(csr, 5)] = TF + TI; + TP = FNMS(KP559016994, TK, TJ); + Cr[WS(csr, 2)] = FMA(KP823639103, TQ, TP); + Cr[WS(csr, 7)] = FNMS(KP823639103, TQ, TP); + TL = FMA(KP559016994, TK, TJ); + Cr[WS(csr, 1)] = FMA(KP823639103, TO, TL); + Cr[WS(csr, 4)] = FNMS(KP823639103, TO, TL); + } + { + E T11, T12, T10, TY, TZ; + T11 = TW - TV; + T12 = TS - TT; + Ci[WS(csi, 3)] = KP951056516 * (FMA(KP618033988, T12, T11)); + Ci[WS(csi, 6)] = -(KP951056516 * (FNMS(KP618033988, T11, T12))); + T10 = TU - TX; + TY = TU + TX; + TZ = FNMS(KP250000000, TY, TR); + Cr[WS(csr, 3)] = FNMS(KP559016994, T10, TZ); + Cr[0] = TR + TY; + Cr[WS(csr, 6)] = FMA(KP559016994, T10, TZ); + { + E Tx, TB, TA, TC; + { + E Tp, Tw, Ty, Tz; + Tp = Tl - To; + Tw = Ts - Tv; + Tx = FMA(KP618033988, Tw, Tp); + TB = FNMS(KP618033988, Tp, Tw); + Ty = FMA(KP250000000, Tf, Ti); + Tz = Te - T7; + TA = FMA(KP559016994, Tz, Ty); + TC = FNMS(KP559016994, Tz, Ty); + } + Ci[WS(csi, 1)] = -(KP951056516 * (FNMS(KP910592997, TA, Tx))); + Ci[WS(csi, 7)] = KP951056516 * (FMA(KP910592997, TC, TB)); + Ci[WS(csi, 4)] = KP951056516 * (FMA(KP910592997, TA, Tx)); + Ci[WS(csi, 2)] = KP951056516 * (FNMS(KP910592997, TC, TB)); + } + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cf_15", {36, 7, 28, 0}, &GENUS }; + +void X(codelet_r2cf_15) (planner *p) { + X(kr2c_register) (p, r2cf_15, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 15 -name r2cf_15 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 64 FP additions, 25 FP multiplications, + * (or, 50 additions, 11 multiplications, 14 fused multiply/add), + * 47 stack variables, 10 constants, and 30 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_15(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP484122918, +0.484122918275927110647408174972799951354115213); + DK(KP216506350, +0.216506350946109661690930792688234045867850657); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP509036960, +0.509036960455127183450980863393907648510733164); + DK(KP823639103, +0.823639103546331925877420039278190003029660514); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(60, rs), MAKE_VOLATILE_STRIDE(60, csr), MAKE_VOLATILE_STRIDE(60, csi)) { + E Ti, TR, TL, TD, TE, T7, Te, Tf, TV, TW, TX, Tv, Ty, TH, To; + E Tr, TG, TS, TT, TU; + { + E TJ, Tg, Th, TK; + TJ = R0[0]; + Tg = R0[WS(rs, 5)]; + Th = R1[WS(rs, 2)]; + TK = Th + Tg; + Ti = Tg - Th; + TR = TJ + TK; + TL = FNMS(KP500000000, TK, TJ); + } + { + E Tm, Tt, Tw, Tp, T3, Tx, Ta, Tn, Td, Tq, T6, Tu; + Tm = R1[WS(rs, 1)]; + Tt = R0[WS(rs, 3)]; + Tw = R1[WS(rs, 4)]; + Tp = R0[WS(rs, 6)]; + { + E T1, T2, T8, T9; + T1 = R0[WS(rs, 7)]; + T2 = R0[WS(rs, 2)]; + T3 = T1 - T2; + Tx = T1 + T2; + T8 = R1[WS(rs, 6)]; + T9 = R0[WS(rs, 4)]; + Ta = T8 - T9; + Tn = T9 + T8; + } + { + E Tb, Tc, T4, T5; + Tb = R1[WS(rs, 3)]; + Tc = R0[WS(rs, 1)]; + Td = Tb - Tc; + Tq = Tc + Tb; + T4 = R1[0]; + T5 = R1[WS(rs, 5)]; + T6 = T4 - T5; + Tu = T5 + T4; + } + TD = Ta - Td; + TE = T6 + T3; + T7 = T3 - T6; + Te = Ta + Td; + Tf = T7 - Te; + TV = Tt + Tu; + TW = Tw + Tx; + TX = TV + TW; + Tv = FNMS(KP500000000, Tu, Tt); + Ty = FNMS(KP500000000, Tx, Tw); + TH = Tv + Ty; + To = FNMS(KP500000000, Tn, Tm); + Tr = FNMS(KP500000000, Tq, Tp); + TG = To + Tr; + TS = Tm + Tn; + TT = Tp + Tq; + TU = TS + TT; + } + Ci[WS(csi, 5)] = KP866025403 * (Tf - Ti); + { + E TF, TP, TI, TM, TN, TQ, TO; + TF = FMA(KP823639103, TD, KP509036960 * TE); + TP = FNMS(KP509036960, TD, KP823639103 * TE); + TI = KP559016994 * (TG - TH); + TM = TG + TH; + TN = FNMS(KP250000000, TM, TL); + Cr[WS(csr, 5)] = TL + TM; + TQ = TN - TI; + Cr[WS(csr, 2)] = TP + TQ; + Cr[WS(csr, 7)] = TQ - TP; + TO = TI + TN; + Cr[WS(csr, 1)] = TF + TO; + Cr[WS(csr, 4)] = TO - TF; + } + { + E T11, T12, T10, TY, TZ; + T11 = TS - TT; + T12 = TW - TV; + Ci[WS(csi, 3)] = FMA(KP587785252, T11, KP951056516 * T12); + Ci[WS(csi, 6)] = FNMS(KP951056516, T11, KP587785252 * T12); + T10 = KP559016994 * (TU - TX); + TY = TU + TX; + TZ = FNMS(KP250000000, TY, TR); + Cr[WS(csr, 3)] = TZ - T10; + Cr[0] = TR + TY; + Cr[WS(csr, 6)] = T10 + TZ; + { + E Tl, TB, TA, TC; + { + E Tj, Tk, Ts, Tz; + Tj = FMA(KP866025403, Ti, KP216506350 * Tf); + Tk = KP484122918 * (Te + T7); + Tl = Tj + Tk; + TB = Tk - Tj; + Ts = To - Tr; + Tz = Tv - Ty; + TA = FMA(KP951056516, Ts, KP587785252 * Tz); + TC = FNMS(KP587785252, Ts, KP951056516 * Tz); + } + Ci[WS(csi, 1)] = Tl - TA; + Ci[WS(csi, 7)] = TC - TB; + Ci[WS(csi, 4)] = Tl + TA; + Ci[WS(csi, 2)] = TB + TC; + } + } + } + } +} + +static const kr2c_desc desc = { 15, "r2cf_15", {50, 11, 14, 0}, &GENUS }; + +void X(codelet_r2cf_15) (planner *p) { + X(kr2c_register) (p, r2cf_15, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_16.c new file mode 100644 index 000000000..92402a90c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_16.c @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 16 -name r2cf_16 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 58 FP additions, 20 FP multiplications, + * (or, 38 additions, 0 multiplications, 20 fused multiply/add), + * 34 stack variables, 3 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T3, T6, T7, TN, TB, Ta, Td, Te, TO, TE, Tm, TT, Ty, TI, Tt; + E TS, Tz, TL, TC, TD, TR, TU; + { + E T1, T2, T4, T5; + T1 = R0[0]; + T2 = R0[WS(rs, 4)]; + T3 = T1 + T2; + T4 = R0[WS(rs, 2)]; + T5 = R0[WS(rs, 6)]; + T6 = T4 + T5; + T7 = T3 + T6; + TN = T4 - T5; + TB = T1 - T2; + } + { + E T8, T9, Tb, Tc; + T8 = R0[WS(rs, 1)]; + T9 = R0[WS(rs, 5)]; + Ta = T8 + T9; + TC = T8 - T9; + Tb = R0[WS(rs, 7)]; + Tc = R0[WS(rs, 3)]; + Td = Tb + Tc; + TD = Tb - Tc; + } + Te = Ta + Td; + TO = TD - TC; + TE = TC + TD; + { + E Ti, TG, Tl, TH; + { + E Tg, Th, Tj, Tk; + Tg = R1[0]; + Th = R1[WS(rs, 4)]; + Ti = Tg + Th; + TG = Tg - Th; + Tj = R1[WS(rs, 2)]; + Tk = R1[WS(rs, 6)]; + Tl = Tj + Tk; + TH = Tj - Tk; + } + Tm = Ti - Tl; + TT = FMA(KP414213562, TG, TH); + Ty = Ti + Tl; + TI = FNMS(KP414213562, TH, TG); + } + { + E Tp, TJ, Ts, TK; + { + E Tn, To, Tq, Tr; + Tn = R1[WS(rs, 7)]; + To = R1[WS(rs, 3)]; + Tp = Tn + To; + TJ = Tn - To; + Tq = R1[WS(rs, 1)]; + Tr = R1[WS(rs, 5)]; + Ts = Tq + Tr; + TK = Tr - Tq; + } + Tt = Tp - Ts; + TS = FMA(KP414213562, TJ, TK); + Tz = Tp + Ts; + TL = FNMS(KP414213562, TK, TJ); + } + Cr[WS(csr, 4)] = T7 - Te; + Ci[WS(csi, 4)] = Tz - Ty; + { + E Tf, Tu, Tv, Tw; + Tf = T3 - T6; + Tu = Tm + Tt; + Cr[WS(csr, 6)] = FNMS(KP707106781, Tu, Tf); + Cr[WS(csr, 2)] = FMA(KP707106781, Tu, Tf); + Tv = Td - Ta; + Tw = Tt - Tm; + Ci[WS(csi, 2)] = FMA(KP707106781, Tw, Tv); + Ci[WS(csi, 6)] = FMS(KP707106781, Tw, Tv); + } + { + E Tx, TA, TF, TM; + Tx = T7 + Te; + TA = Ty + Tz; + Cr[WS(csr, 8)] = Tx - TA; + Cr[0] = Tx + TA; + TF = FMA(KP707106781, TE, TB); + TM = TI + TL; + Cr[WS(csr, 7)] = FNMS(KP923879532, TM, TF); + Cr[WS(csr, 1)] = FMA(KP923879532, TM, TF); + } + TR = FNMS(KP707106781, TO, TN); + TU = TS - TT; + Ci[WS(csi, 1)] = FMS(KP923879532, TU, TR); + Ci[WS(csi, 7)] = FMA(KP923879532, TU, TR); + { + E TV, TW, TP, TQ; + TV = FNMS(KP707106781, TE, TB); + TW = TT + TS; + Cr[WS(csr, 5)] = FNMS(KP923879532, TW, TV); + Cr[WS(csr, 3)] = FMA(KP923879532, TW, TV); + TP = FMA(KP707106781, TO, TN); + TQ = TL - TI; + Ci[WS(csi, 3)] = FMA(KP923879532, TQ, TP); + Ci[WS(csi, 5)] = FMS(KP923879532, TQ, TP); + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cf_16", {38, 0, 20, 0}, &GENUS }; + +void X(codelet_r2cf_16) (planner *p) { + X(kr2c_register) (p, r2cf_16, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 16 -name r2cf_16 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 58 FP additions, 12 FP multiplications, + * (or, 54 additions, 8 multiplications, 4 fused multiply/add), + * 34 stack variables, 3 constants, and 32 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_16(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(64, rs), MAKE_VOLATILE_STRIDE(64, csr), MAKE_VOLATILE_STRIDE(64, csi)) { + E T3, T6, T7, Tz, Ti, Ta, Td, Te, TA, Th, Tq, TV, TF, TP, Tx; + E TU, TE, TM, Tg, Tf, TJ, TQ; + { + E T1, T2, T4, T5; + T1 = R0[0]; + T2 = R0[WS(rs, 4)]; + T3 = T1 + T2; + T4 = R0[WS(rs, 2)]; + T5 = R0[WS(rs, 6)]; + T6 = T4 + T5; + T7 = T3 + T6; + Tz = T1 - T2; + Ti = T4 - T5; + } + { + E T8, T9, Tb, Tc; + T8 = R0[WS(rs, 1)]; + T9 = R0[WS(rs, 5)]; + Ta = T8 + T9; + Tg = T8 - T9; + Tb = R0[WS(rs, 7)]; + Tc = R0[WS(rs, 3)]; + Td = Tb + Tc; + Tf = Tb - Tc; + } + Te = Ta + Td; + TA = KP707106781 * (Tg + Tf); + Th = KP707106781 * (Tf - Tg); + { + E Tm, TN, Tp, TO; + { + E Tk, Tl, Tn, To; + Tk = R1[WS(rs, 7)]; + Tl = R1[WS(rs, 3)]; + Tm = Tk - Tl; + TN = Tk + Tl; + Tn = R1[WS(rs, 1)]; + To = R1[WS(rs, 5)]; + Tp = Tn - To; + TO = Tn + To; + } + Tq = FNMS(KP923879532, Tp, KP382683432 * Tm); + TV = TN + TO; + TF = FMA(KP923879532, Tm, KP382683432 * Tp); + TP = TN - TO; + } + { + E Tt, TK, Tw, TL; + { + E Tr, Ts, Tu, Tv; + Tr = R1[0]; + Ts = R1[WS(rs, 4)]; + Tt = Tr - Ts; + TK = Tr + Ts; + Tu = R1[WS(rs, 2)]; + Tv = R1[WS(rs, 6)]; + Tw = Tu - Tv; + TL = Tu + Tv; + } + Tx = FMA(KP382683432, Tt, KP923879532 * Tw); + TU = TK + TL; + TE = FNMS(KP382683432, Tw, KP923879532 * Tt); + TM = TK - TL; + } + Cr[WS(csr, 4)] = T7 - Te; + Ci[WS(csi, 4)] = TV - TU; + { + E Tj, Ty, TD, TG; + Tj = Th - Ti; + Ty = Tq - Tx; + Ci[WS(csi, 1)] = Tj + Ty; + Ci[WS(csi, 7)] = Ty - Tj; + TD = Tz + TA; + TG = TE + TF; + Cr[WS(csr, 7)] = TD - TG; + Cr[WS(csr, 1)] = TD + TG; + } + { + E TB, TC, TH, TI; + TB = Tz - TA; + TC = Tx + Tq; + Cr[WS(csr, 5)] = TB - TC; + Cr[WS(csr, 3)] = TB + TC; + TH = Ti + Th; + TI = TF - TE; + Ci[WS(csi, 3)] = TH + TI; + Ci[WS(csi, 5)] = TI - TH; + } + TJ = T3 - T6; + TQ = KP707106781 * (TM + TP); + Cr[WS(csr, 6)] = TJ - TQ; + Cr[WS(csr, 2)] = TJ + TQ; + { + E TR, TS, TT, TW; + TR = Td - Ta; + TS = KP707106781 * (TP - TM); + Ci[WS(csi, 2)] = TR + TS; + Ci[WS(csi, 6)] = TS - TR; + TT = T7 + Te; + TW = TU + TV; + Cr[WS(csr, 8)] = TT - TW; + Cr[0] = TT + TW; + } + } + } +} + +static const kr2c_desc desc = { 16, "r2cf_16", {54, 8, 4, 0}, &GENUS }; + +void X(codelet_r2cf_16) (planner *p) { + X(kr2c_register) (p, r2cf_16, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_2.c new file mode 100644 index 000000000..ec3169711 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_2.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 2 -name r2cf_2 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 3 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = R0[0]; + T2 = R1[0]; + Cr[WS(csr, 1)] = T1 - T2; + Cr[0] = T1 + T2; + } + } +} + +static const kr2c_desc desc = { 2, "r2cf_2", {2, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cf_2) (planner *p) { + X(kr2c_register) (p, r2cf_2, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 2 -name r2cf_2 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 2 FP additions, 0 FP multiplications, + * (or, 2 additions, 0 multiplications, 0 fused multiply/add), + * 3 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_2(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(8, rs), MAKE_VOLATILE_STRIDE(8, csr), MAKE_VOLATILE_STRIDE(8, csi)) { + E T1, T2; + T1 = R0[0]; + T2 = R1[0]; + Cr[WS(csr, 1)] = T1 - T2; + Cr[0] = T1 + T2; + } + } +} + +static const kr2c_desc desc = { 2, "r2cf_2", {2, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cf_2) (planner *p) { + X(kr2c_register) (p, r2cf_2, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_20.c new file mode 100644 index 000000000..7e2eec01f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_20.c @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:27 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 20 -name r2cf_20 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 86 FP additions, 32 FP multiplications, + * (or, 58 additions, 4 multiplications, 28 fused multiply/add), + * 51 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T3, T1d, TJ, TV, T16, T1k, T1l, T19, Ta, Th, Ti, T1e, T1f, T1g, TP; + E TQ, TX, Tn, Ts, TK, TS, TT, TW, Ty, TD, TL; + { + E T1, T2, TF, TG, TH, TI; + T1 = R0[0]; + T2 = R0[WS(rs, 5)]; + TF = T1 + T2; + TG = R1[WS(rs, 2)]; + TH = R1[WS(rs, 7)]; + TI = TG + TH; + T3 = T1 - T2; + T1d = TG - TH; + TJ = TF - TI; + TV = TF + TI; + } + { + E T6, To, Tx, T17, TC, T18, T9, Tj, Td, Tu, Tm, T15, Tr, T14, Tg; + E Tz; + { + E T4, T5, Tv, Tw; + T4 = R0[WS(rs, 2)]; + T5 = R0[WS(rs, 7)]; + T6 = T4 - T5; + To = T4 + T5; + Tv = R1[WS(rs, 6)]; + Tw = R1[WS(rs, 1)]; + Tx = Tv + Tw; + T17 = Tw - Tv; + } + { + E TA, TB, T7, T8; + TA = R1[WS(rs, 8)]; + TB = R1[WS(rs, 3)]; + TC = TA + TB; + T18 = TB - TA; + T7 = R0[WS(rs, 8)]; + T8 = R0[WS(rs, 3)]; + T9 = T7 - T8; + Tj = T7 + T8; + } + { + E Tb, Tc, Tk, Tl; + Tb = R0[WS(rs, 4)]; + Tc = R0[WS(rs, 9)]; + Td = Tb - Tc; + Tu = Tb + Tc; + Tk = R1[0]; + Tl = R1[WS(rs, 5)]; + Tm = Tk + Tl; + T15 = Tl - Tk; + } + { + E Tp, Tq, Te, Tf; + Tp = R1[WS(rs, 4)]; + Tq = R1[WS(rs, 9)]; + Tr = Tp + Tq; + T14 = Tq - Tp; + Te = R0[WS(rs, 6)]; + Tf = R0[WS(rs, 1)]; + Tg = Te - Tf; + Tz = Te + Tf; + } + T16 = T14 - T15; + T1k = T6 - T9; + T1l = Td - Tg; + T19 = T17 - T18; + Ta = T6 + T9; + Th = Td + Tg; + Ti = Ta + Th; + T1e = T14 + T15; + T1f = T17 + T18; + T1g = T1e + T1f; + TP = Tu + Tx; + TQ = Tz + TC; + TX = TP + TQ; + Tn = Tj - Tm; + Ts = To - Tr; + TK = Ts + Tn; + TS = To + Tr; + TT = Tj + Tm; + TW = TS + TT; + Ty = Tu - Tx; + TD = Tz - TC; + TL = Ty + TD; + } + Cr[WS(csr, 5)] = T3 + Ti; + Ci[WS(csi, 5)] = T1g - T1d; + { + E Tt, TE, TR, TU; + Tt = Tn - Ts; + TE = Ty - TD; + Ci[WS(csi, 6)] = KP951056516 * (FNMS(KP618033988, TE, Tt)); + Ci[WS(csi, 2)] = KP951056516 * (FMA(KP618033988, Tt, TE)); + TR = TP - TQ; + TU = TS - TT; + Ci[WS(csi, 8)] = -(KP951056516 * (FNMS(KP618033988, TU, TR))); + Ci[WS(csi, 4)] = KP951056516 * (FMA(KP618033988, TR, TU)); + } + { + E T10, TY, TZ, TO, TM, TN; + T10 = TW - TX; + TY = TW + TX; + TZ = FNMS(KP250000000, TY, TV); + Cr[WS(csr, 4)] = FMA(KP559016994, T10, TZ); + Cr[0] = TV + TY; + Cr[WS(csr, 8)] = FNMS(KP559016994, T10, TZ); + TO = TK - TL; + TM = TK + TL; + TN = FNMS(KP250000000, TM, TJ); + Cr[WS(csr, 2)] = FNMS(KP559016994, TO, TN); + Cr[WS(csr, 10)] = TJ + TM; + Cr[WS(csr, 6)] = FMA(KP559016994, TO, TN); + } + { + E T1a, T1c, T13, T1b, T11, T12; + T1a = FMA(KP618033988, T19, T16); + T1c = FNMS(KP618033988, T16, T19); + T11 = FNMS(KP250000000, Ti, T3); + T12 = Ta - Th; + T13 = FMA(KP559016994, T12, T11); + T1b = FNMS(KP559016994, T12, T11); + Cr[WS(csr, 9)] = FNMS(KP951056516, T1a, T13); + Cr[WS(csr, 7)] = FMA(KP951056516, T1c, T1b); + Cr[WS(csr, 1)] = FMA(KP951056516, T1a, T13); + Cr[WS(csr, 3)] = FNMS(KP951056516, T1c, T1b); + } + { + E T1m, T1o, T1j, T1n, T1h, T1i; + T1m = FMA(KP618033988, T1l, T1k); + T1o = FNMS(KP618033988, T1k, T1l); + T1h = FMA(KP250000000, T1g, T1d); + T1i = T1e - T1f; + T1j = FNMS(KP559016994, T1i, T1h); + T1n = FMA(KP559016994, T1i, T1h); + Ci[WS(csi, 1)] = -(FMA(KP951056516, T1m, T1j)); + Ci[WS(csi, 7)] = FMA(KP951056516, T1o, T1n); + Ci[WS(csi, 9)] = FMS(KP951056516, T1m, T1j); + Ci[WS(csi, 3)] = FNMS(KP951056516, T1o, T1n); + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cf_20", {58, 4, 28, 0}, &GENUS }; + +void X(codelet_r2cf_20) (planner *p) { + X(kr2c_register) (p, r2cf_20, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 20 -name r2cf_20 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 86 FP additions, 24 FP multiplications, + * (or, 74 additions, 12 multiplications, 12 fused multiply/add), + * 51 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_20(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(80, rs), MAKE_VOLATILE_STRIDE(80, csr), MAKE_VOLATILE_STRIDE(80, csi)) { + E T3, T1m, TF, T17, Ts, TM, TN, Tz, Ta, Th, Ti, T1g, T1h, T1k, T10; + E T13, T19, TG, TH, TI, T1d, T1e, T1j, TT, TW, T18; + { + E T1, T2, T15, TD, TE, T16; + T1 = R0[0]; + T2 = R0[WS(rs, 5)]; + T15 = T1 + T2; + TD = R1[WS(rs, 7)]; + TE = R1[WS(rs, 2)]; + T16 = TE + TD; + T3 = T1 - T2; + T1m = T15 + T16; + TF = TD - TE; + T17 = T15 - T16; + } + { + E T6, TU, Tv, T12, Ty, TZ, T9, TR, Td, TY, To, TS, Tr, TV, Tg; + E T11; + { + E T4, T5, Tt, Tu; + T4 = R0[WS(rs, 2)]; + T5 = R0[WS(rs, 7)]; + T6 = T4 - T5; + TU = T4 + T5; + Tt = R1[WS(rs, 8)]; + Tu = R1[WS(rs, 3)]; + Tv = Tt - Tu; + T12 = Tt + Tu; + } + { + E Tw, Tx, T7, T8; + Tw = R1[WS(rs, 6)]; + Tx = R1[WS(rs, 1)]; + Ty = Tw - Tx; + TZ = Tw + Tx; + T7 = R0[WS(rs, 8)]; + T8 = R0[WS(rs, 3)]; + T9 = T7 - T8; + TR = T7 + T8; + } + { + E Tb, Tc, Tm, Tn; + Tb = R0[WS(rs, 4)]; + Tc = R0[WS(rs, 9)]; + Td = Tb - Tc; + TY = Tb + Tc; + Tm = R1[0]; + Tn = R1[WS(rs, 5)]; + To = Tm - Tn; + TS = Tm + Tn; + } + { + E Tp, Tq, Te, Tf; + Tp = R1[WS(rs, 4)]; + Tq = R1[WS(rs, 9)]; + Tr = Tp - Tq; + TV = Tp + Tq; + Te = R0[WS(rs, 6)]; + Tf = R0[WS(rs, 1)]; + Tg = Te - Tf; + T11 = Te + Tf; + } + Ts = To - Tr; + TM = T6 - T9; + TN = Td - Tg; + Tz = Tv - Ty; + Ta = T6 + T9; + Th = Td + Tg; + Ti = Ta + Th; + T1g = TY + TZ; + T1h = T11 + T12; + T1k = T1g + T1h; + T10 = TY - TZ; + T13 = T11 - T12; + T19 = T10 + T13; + TG = Tr + To; + TH = Ty + Tv; + TI = TG + TH; + T1d = TU + TV; + T1e = TR + TS; + T1j = T1d + T1e; + TT = TR - TS; + TW = TU - TV; + T18 = TW + TT; + } + Cr[WS(csr, 5)] = T3 + Ti; + Ci[WS(csi, 5)] = TF - TI; + { + E TX, T14, T1f, T1i; + TX = TT - TW; + T14 = T10 - T13; + Ci[WS(csi, 6)] = FNMS(KP587785252, T14, KP951056516 * TX); + Ci[WS(csi, 2)] = FMA(KP587785252, TX, KP951056516 * T14); + T1f = T1d - T1e; + T1i = T1g - T1h; + Ci[WS(csi, 8)] = FNMS(KP951056516, T1i, KP587785252 * T1f); + Ci[WS(csi, 4)] = FMA(KP951056516, T1f, KP587785252 * T1i); + } + { + E T1l, T1n, T1o, T1c, T1a, T1b; + T1l = KP559016994 * (T1j - T1k); + T1n = T1j + T1k; + T1o = FNMS(KP250000000, T1n, T1m); + Cr[WS(csr, 4)] = T1l + T1o; + Cr[0] = T1m + T1n; + Cr[WS(csr, 8)] = T1o - T1l; + T1c = KP559016994 * (T18 - T19); + T1a = T18 + T19; + T1b = FNMS(KP250000000, T1a, T17); + Cr[WS(csr, 2)] = T1b - T1c; + Cr[WS(csr, 10)] = T17 + T1a; + Cr[WS(csr, 6)] = T1c + T1b; + } + { + E TA, TC, Tl, TB, Tj, Tk; + TA = FMA(KP951056516, Ts, KP587785252 * Tz); + TC = FNMS(KP587785252, Ts, KP951056516 * Tz); + Tj = KP559016994 * (Ta - Th); + Tk = FNMS(KP250000000, Ti, T3); + Tl = Tj + Tk; + TB = Tk - Tj; + Cr[WS(csr, 9)] = Tl - TA; + Cr[WS(csr, 7)] = TB + TC; + Cr[WS(csr, 1)] = Tl + TA; + Cr[WS(csr, 3)] = TB - TC; + } + { + E TO, TQ, TL, TP, TJ, TK; + TO = FMA(KP951056516, TM, KP587785252 * TN); + TQ = FNMS(KP587785252, TM, KP951056516 * TN); + TJ = FMA(KP250000000, TI, TF); + TK = KP559016994 * (TH - TG); + TL = TJ + TK; + TP = TK - TJ; + Ci[WS(csi, 1)] = TL - TO; + Ci[WS(csi, 7)] = TQ + TP; + Ci[WS(csi, 9)] = TO + TL; + Ci[WS(csi, 3)] = TP - TQ; + } + } + } +} + +static const kr2c_desc desc = { 20, "r2cf_20", {74, 12, 12, 0}, &GENUS }; + +void X(codelet_r2cf_20) (planner *p) { + X(kr2c_register) (p, r2cf_20, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_25.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_25.c new file mode 100644 index 000000000..4bf56e497 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_25.c @@ -0,0 +1,738 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:27 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 25 -name r2cf_25 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 200 FP additions, 168 FP multiplications, + * (or, 44 additions, 12 multiplications, 156 fused multiply/add), + * 127 stack variables, 66 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP792626838, +0.792626838241819413632131824093538848057784557); + DK(KP876091699, +0.876091699473550838204498029706869638173524346); + DK(KP809385824, +0.809385824416008241660603814668679683846476688); + DK(KP860541664, +0.860541664367944677098261680920518816412804187); + DK(KP560319534, +0.560319534973832390111614715371676131169633784); + DK(KP681693190, +0.681693190061530575150324149145440022633095390); + DK(KP237294955, +0.237294955877110315393888866460840817927895961); + DK(KP897376177, +0.897376177523557693138608077137219684419427330); + DK(KP997675361, +0.997675361079556513670859573984492383596555031); + DK(KP923225144, +0.923225144846402650453449441572664695995209956); + DK(KP956723877, +0.956723877038460305821989399535483155872969262); + DK(KP949179823, +0.949179823508441261575555465843363271711583843); + DK(KP570584518, +0.570584518783621657366766175430996792655723863); + DK(KP669429328, +0.669429328479476605641803240971985825917022098); + DK(KP262346850, +0.262346850930607871785420028382979691334784273); + DK(KP906616052, +0.906616052148196230441134447086066874408359177); + DK(KP921078979, +0.921078979742360627699756128143719920817673854); + DK(KP845997307, +0.845997307939530944175097360758058292389769300); + DK(KP982009705, +0.982009705009746369461829878184175962711969869); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP559154169, +0.559154169276087864842202529084232643714075927); + DK(KP683113946, +0.683113946453479238701949862233725244439656928); + DK(KP242145790, +0.242145790282157779872542093866183953459003101); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP999754674, +0.999754674276473633366203429228112409535557487); + DK(KP904508497, +0.904508497187473712051146708591409529430077295); + DK(KP904730450, +0.904730450839922351881287709692877908104763647); + DK(KP916574801, +0.916574801383451584742370439148878693530976769); + DK(KP831864738, +0.831864738706457140726048799369896829771167132); + DK(KP829049696, +0.829049696159252993975487806364305442437946767); + DK(KP855719849, +0.855719849902058969314654733608091555096772472); + DK(KP952936919, +0.952936919628306576880750665357914584765951388); + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP690983005, +0.690983005625052575897706582817180941139845410); + DK(KP522616830, +0.522616830205754336872861364785224694908468440); + DK(KP772036680, +0.772036680810363904029489473607579825330539880); + DK(KP734762448, +0.734762448793050413546343770063151342619912334); + DK(KP803003575, +0.803003575438660414833440593570376004635464850); + DK(KP999544308, +0.999544308746292983948881682379742149196758193); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP763932022, +0.763932022500210303590826331268723764559381640); + DK(KP894834959, +0.894834959464455102997960030820114611498661386); + DK(KP447417479, +0.447417479732227551498980015410057305749330693); + DK(KP867381224, +0.867381224396525206773171885031575671309956167); + DK(KP958953096, +0.958953096729998668045963838399037225970891871); + DK(KP912575812, +0.912575812670962425556968549836277086778922727); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + DK(KP244189809, +0.244189809627953270309879511234821255780225091); + DK(KP522847744, +0.522847744331509716623755382187077770911012542); + DK(KP578046249, +0.578046249379945007321754579646815604023525655); + DK(KP269969613, +0.269969613759572083574752974412347470060951301); + DK(KP667278218, +0.667278218140296670899089292254759909713898805); + DK(KP494780565, +0.494780565770515410344588413655324772219443730); + DK(KP447533225, +0.447533225982656890041886979663652563063114397); + DK(KP603558818, +0.603558818296015001454675132653458027918768137); + DK(KP120146378, +0.120146378570687701782758537356596213647956445); + DK(KP869845200, +0.869845200362138853122720822420327157933056305); + DK(KP786782374, +0.786782374965295178365099601674911834788448471); + DK(KP132830569, +0.132830569247582714407653942074819768844536507); + DK(KP893101515, +0.893101515366181661711202267938416198338079437); + DK(KP066152395, +0.066152395967733048213034281011006031460903353); + DK(KP059835404, +0.059835404262124915169548397419498386427871950); + DK(KP987388751, +0.987388751065621252324603216482382109400433949); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E T2p, TJ, T2u, T1O, T2s, T2t, TB, T1c, T26, T2e, T1k, T1r, T1M, T21, T1B; + E T9, TX, T29, T2k, T1h, T1v, T1R, T1X, T1z, Ti, TQ, T2a, T2j, T1g, T1u; + E T1U, T1Y, T1y, Ts, T15, T27, T2f, T1j, T1s, T1J, T20, T1C, Tj, TC; + { + E TI, T2r, TF, T2q; + T2p = R0[0]; + { + E TG, TH, TD, TE; + TG = R0[WS(rs, 5)]; + TH = R1[WS(rs, 7)]; + TI = TG - TH; + T2r = TG + TH; + TD = R1[WS(rs, 2)]; + TE = R0[WS(rs, 10)]; + TF = TD - TE; + T2q = TD + TE; + } + TJ = FMA(KP618033988, TI, TF); + T2u = T2q - T2r; + T1O = FNMS(KP618033988, TF, TI); + T2s = T2q + T2r; + T2t = FNMS(KP250000000, T2s, T2p); + } + { + E Tt, TA, T1a, T16, T17; + Tt = R1[WS(rs, 1)]; + { + E Tu, Tv, Tw, Tx, Ty, Tz; + Tu = R0[WS(rs, 4)]; + Tv = R1[WS(rs, 11)]; + Tw = Tu + Tv; + Tx = R1[WS(rs, 6)]; + Ty = R0[WS(rs, 9)]; + Tz = Tx + Ty; + TA = Tw + Tz; + T1a = Tz - Tw; + T16 = Tv - Tu; + T17 = Tx - Ty; + } + TB = Tt + TA; + { + E T18, T1L, T1b, T1K, T19; + T18 = FNMS(KP618033988, T17, T16); + T1L = FMA(KP618033988, T16, T17); + T19 = FNMS(KP250000000, TA, Tt); + T1b = FNMS(KP559016994, T1a, T19); + T1K = FMA(KP559016994, T1a, T19); + T1c = FNMS(KP987388751, T1b, T18); + T26 = FNMS(KP059835404, T1L, T1K); + T2e = FMA(KP066152395, T1K, T1L); + T1k = FMA(KP893101515, T18, T1b); + T1r = FNMS(KP132830569, T1b, T18); + T1M = FNMS(KP786782374, T1L, T1K); + T21 = FMA(KP869845200, T1K, T1L); + T1B = FMA(KP120146378, T18, T1b); + } + } + { + E T1, T8, TV, TS, TU; + T1 = R0[WS(rs, 2)]; + { + E T2, T3, T4, T5, T6, T7; + T2 = R1[WS(rs, 4)]; + T3 = R0[WS(rs, 12)]; + T4 = T2 + T3; + T5 = R0[WS(rs, 7)]; + T6 = R1[WS(rs, 9)]; + T7 = T5 + T6; + T8 = T4 + T7; + TV = T5 - T6; + TS = T4 - T7; + TU = T3 - T2; + } + T9 = T1 + T8; + { + E TW, T1P, TT, T1Q, TR; + TW = FNMS(KP618033988, TV, TU); + T1P = FMA(KP618033988, TU, TV); + TR = FMS(KP250000000, T8, T1); + TT = FNMS(KP559016994, TS, TR); + T1Q = FMA(KP559016994, TS, TR); + TX = FMA(KP603558818, TW, TT); + T29 = FNMS(KP447533225, T1P, T1Q); + T2k = FMA(KP494780565, T1Q, T1P); + T1h = FNMS(KP667278218, TT, TW); + T1v = FNMS(KP786782374, TW, TT); + T1R = FMA(KP132830569, T1Q, T1P); + T1X = FNMS(KP120146378, T1P, T1Q); + T1z = FMA(KP869845200, TT, TW); + } + } + { + E Ta, Th, TO, TK, TL; + Ta = R1[0]; + { + E Tb, Tc, Td, Te, Tf, Tg; + Tb = R0[WS(rs, 3)]; + Tc = R1[WS(rs, 10)]; + Td = Tb + Tc; + Te = R1[WS(rs, 5)]; + Tf = R0[WS(rs, 8)]; + Tg = Te + Tf; + Th = Td + Tg; + TO = Td - Tg; + TK = Tb - Tc; + TL = Tf - Te; + } + Ti = Ta + Th; + { + E TM, T1S, TP, T1T, TN; + TM = FNMS(KP618033988, TL, TK); + T1S = FMA(KP618033988, TK, TL); + TN = FNMS(KP250000000, Th, Ta); + TP = FMA(KP559016994, TO, TN); + T1T = FNMS(KP559016994, TO, TN); + TQ = FMA(KP269969613, TP, TM); + T2a = FMA(KP578046249, T1T, T1S); + T2j = FNMS(KP522847744, T1S, T1T); + T1g = FNMS(KP244189809, TM, TP); + T1u = FNMS(KP603558818, TM, TP); + T1U = FNMS(KP987388751, T1T, T1S); + T1Y = FMA(KP893101515, T1S, T1T); + T1y = FMA(KP667278218, TP, TM); + } + } + { + E Tk, Tr, T13, TZ, T10; + Tk = R0[WS(rs, 1)]; + { + E Tl, Tm, Tn, To, Tp, Tq; + Tl = R1[WS(rs, 3)]; + Tm = R0[WS(rs, 11)]; + Tn = Tl + Tm; + To = R0[WS(rs, 6)]; + Tp = R1[WS(rs, 8)]; + Tq = To + Tp; + Tr = Tn + Tq; + T13 = Tn - Tq; + TZ = Tm - Tl; + T10 = Tp - To; + } + Ts = Tk + Tr; + { + E T11, T1I, T14, T1H, T12; + T11 = FMA(KP618033988, T10, TZ); + T1I = FNMS(KP618033988, TZ, T10); + T12 = FMS(KP250000000, Tr, Tk); + T14 = FNMS(KP559016994, T13, T12); + T1H = FMA(KP559016994, T13, T12); + T15 = FMA(KP578046249, T14, T11); + T27 = FNMS(KP603558818, T1I, T1H); + T2f = FMA(KP667278218, T1H, T1I); + T1j = FNMS(KP522847744, T11, T14); + T1s = FMA(KP447533225, T11, T14); + T1J = FMA(KP059835404, T1I, T1H); + T20 = FNMS(KP066152395, T1H, T1I); + T1C = FNMS(KP494780565, T14, T11); + } + } + Tj = T9 - Ti; + TC = Ts - TB; + Ci[WS(csi, 5)] = KP951056516 * (FNMS(KP618033988, TC, Tj)); + Ci[WS(csi, 10)] = KP951056516 * (FMA(KP618033988, Tj, TC)); + { + E T39, T3c, T3e, T3a, T3b, T3d; + T39 = T2p + T2s; + T3a = T9 + Ti; + T3b = Ts + TB; + T3c = T3a + T3b; + T3e = T3a - T3b; + Cr[0] = T3c + T39; + T3d = FNMS(KP250000000, T3c, T39); + Cr[WS(csr, 5)] = FMA(KP559016994, T3e, T3d); + Cr[WS(csr, 10)] = FNMS(KP559016994, T3e, T3d); + } + { + E T1A, T1x, T1F, T1G; + T1A = FNMS(KP912575812, T1z, T1y); + { + E T1t, T1w, T1E, T1D; + T1t = FMA(KP958953096, T1s, T1r); + T1w = FMA(KP912575812, T1v, T1u); + T1D = FNMS(KP867381224, T1C, T1B); + T1E = FMA(KP447417479, T1w, T1D); + T1x = FNMS(KP894834959, T1w, T1t); + T1F = FMA(KP763932022, T1E, T1t); + } + Ci[WS(csi, 4)] = KP951056516 * (FMA(KP992114701, T1x, TJ)); + T1G = FMA(KP999544308, T1F, T1A); + Ci[WS(csi, 9)] = KP951056516 * (FNMS(KP803003575, T1G, TJ)); + } + { + E T1Z, T1N, T1W, T24, T1V, T23, T22, T25; + T1Z = FNMS(KP734762448, T1Y, T1X); + T1N = FNMS(KP772036680, T1M, T1J); + T1V = FMA(KP734762448, T1U, T1R); + T22 = FMA(KP772036680, T21, T20); + T23 = FNMS(KP522616830, T1V, T22); + T1W = FNMS(KP992114701, T1V, T1O); + T24 = FMA(KP690983005, T23, T1N); + Ci[WS(csi, 3)] = KP998026728 * (FNMS(KP952936919, T1W, T1N)); + T25 = FNMS(KP855719849, T24, T1Z); + Ci[WS(csi, 8)] = -(KP951056516 * (FNMS(KP992114701, T25, T1O))); + } + { + E T1i, T1l, T1e, T1p, T1n, TY, T1d, T1m, T1f, T1q, T1o; + T1i = FNMS(KP829049696, T1h, T1g); + T1l = FMA(KP831864738, T1k, T1j); + TY = FNMS(KP916574801, TX, TQ); + T1d = FMA(KP831864738, T1c, T15); + T1m = FMA(KP904730450, T1d, TY); + T1e = FNMS(KP904730450, T1d, TY); + T1p = FNMS(KP904508497, T1m, T1i); + T1n = FNMS(KP999754674, T1m, T1l); + Ci[WS(csi, 1)] = -(KP951056516 * (FMA(KP968583161, T1e, TJ))); + T1f = FNMS(KP242145790, T1e, TJ); + T1q = FMA(KP683113946, T1p, T1l); + T1o = FNMS(KP559154169, T1n, T1i); + Ci[WS(csi, 6)] = -(KP951056516 * (FMA(KP968583161, T1o, T1f))); + Ci[WS(csi, 11)] = -(KP951056516 * (FMA(KP876306680, T1q, T1f))); + } + { + E T2l, T2c, T2n, T2i, T2d, T2o, T2m; + T2l = FNMS(KP982009705, T2k, T2j); + { + E T2g, T28, T2b, T2h; + T2g = FMA(KP845997307, T2f, T2e); + T28 = FNMS(KP845997307, T27, T26); + T2b = FNMS(KP921078979, T2a, T29); + T2h = FMA(KP906616052, T2b, T28); + T2c = FNMS(KP906616052, T2b, T28); + T2n = T2g + T2h; + T2i = FMA(KP618033988, T2h, T2g); + } + Ci[WS(csi, 2)] = -(KP998026728 * (FNMS(KP952936919, T1O, T2c))); + T2d = FMA(KP262346850, T2c, T1O); + T2o = FNMS(KP669429328, T2n, T2l); + T2m = FMA(KP570584518, T2l, T2i); + Ci[WS(csi, 12)] = KP951056516 * (FNMS(KP949179823, T2m, T2d)); + Ci[WS(csi, 7)] = KP951056516 * (FNMS(KP876306680, T2o, T2d)); + } + { + E T2P, T2W, T2V, T2Z, T32, T33, T2S, T37, T35, T2Q, T2R, T34; + T2P = FNMS(KP559016994, T2u, T2t); + T2W = FNMS(KP734762448, T1U, T1R); + { + E T2U, T2T, T2Y, T2X; + T2U = FNMS(KP772036680, T21, T20); + T2T = FMA(KP734762448, T1Y, T1X); + T2X = FMA(KP772036680, T1M, T1J); + T2Y = FMA(KP522616830, T2T, T2X); + T2V = FMA(KP956723877, T2U, T2T); + T2Z = FNMS(KP763932022, T2Y, T2U); + } + T32 = FMA(KP845997307, T27, T26); + T33 = FMA(KP921078979, T2a, T29); + T2Q = FNMS(KP845997307, T2f, T2e); + T2R = FMA(KP982009705, T2k, T2j); + T34 = FNMS(KP923225144, T2R, T2Q); + T2S = FMA(KP923225144, T2R, T2Q); + T37 = FNMS(KP904508497, T34, T32); + T35 = FNMS(KP997675361, T34, T33); + Cr[WS(csr, 2)] = FMA(KP949179823, T2S, T2P); + Cr[WS(csr, 3)] = FMA(KP992114701, T2V, T2P); + { + E T30, T31, T38, T36; + T30 = FMA(KP855719849, T2Z, T2W); + Cr[WS(csr, 8)] = FNMS(KP897376177, T30, T2P); + T31 = FNMS(KP237294955, T2S, T2P); + T38 = FNMS(KP681693190, T37, T33); + T36 = FMA(KP560319534, T35, T32); + Cr[WS(csr, 12)] = FNMS(KP949179823, T36, T31); + Cr[WS(csr, 7)] = FNMS(KP860541664, T38, T31); + } + } + { + E T2v, T2H, T2M, T2O, T2A, T2C, T2y, T2F, T2D, T2w, T2x, T2B; + T2v = FMA(KP559016994, T2u, T2t); + T2H = FNMS(KP912575812, T1v, T1u); + { + E T2I, T2K, T2L, T2J; + T2I = FMA(KP867381224, T1C, T1B); + T2J = FNMS(KP958953096, T1s, T1r); + T2K = FMA(KP912575812, T1z, T1y); + T2L = FNMS(KP447417479, T2K, T2J); + T2M = FNMS(KP690983005, T2L, T2I); + T2O = FNMS(KP809385824, T2K, T2I); + } + T2A = FMA(KP916574801, TX, TQ); + T2C = FNMS(KP831864738, T1c, T15); + T2w = FMA(KP829049696, T1h, T1g); + T2x = FNMS(KP831864738, T1k, T1j); + T2B = FMA(KP904730450, T2x, T2w); + T2y = FNMS(KP904730450, T2x, T2w); + T2F = T2A + T2B; + T2D = FMA(KP904730450, T2C, T2B); + Cr[WS(csr, 1)] = FMA(KP968583161, T2y, T2v); + Cr[WS(csr, 4)] = FNMS(KP992114701, T2O, T2v); + { + E T2N, T2z, T2G, T2E; + T2N = FNMS(KP999544308, T2M, T2H); + Cr[WS(csr, 9)] = FNMS(KP803003575, T2N, T2v); + T2z = FNMS(KP242145790, T2y, T2v); + T2G = FMA(KP683113946, T2F, T2C); + T2E = FNMS(KP618033988, T2D, T2A); + Cr[WS(csr, 6)] = FNMS(KP876091699, T2E, T2z); + Cr[WS(csr, 11)] = FNMS(KP792626838, T2G, T2z); + } + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cf_25", {44, 12, 156, 0}, &GENUS }; + +void X(codelet_r2cf_25) (planner *p) { + X(kr2c_register) (p, r2cf_25, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 25 -name r2cf_25 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 200 FP additions, 140 FP multiplications, + * (or, 117 additions, 57 multiplications, 83 fused multiply/add), + * 101 stack variables, 40 constants, and 50 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_25(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP998026728, +0.998026728428271561952336806863450553336905220); + DK(KP125581039, +0.125581039058626752152356449131262266244969664); + DK(KP1_996053456, +1.996053456856543123904673613726901106673810439); + DK(KP062790519, +0.062790519529313376076178224565631133122484832); + DK(KP809016994, +0.809016994374947424102293417182819058860154590); + DK(KP309016994, +0.309016994374947424102293417182819058860154590); + DK(KP1_369094211, +1.369094211857377347464566715242418539779038465); + DK(KP728968627, +0.728968627421411523146730319055259111372571664); + DK(KP963507348, +0.963507348203430549974383005744259307057084020); + DK(KP876306680, +0.876306680043863587308115903922062583399064238); + DK(KP497379774, +0.497379774329709576484567492012895936835134813); + DK(KP968583161, +0.968583161128631119490168375464735813836012403); + DK(KP684547105, +0.684547105928688673732283357621209269889519233); + DK(KP1_457937254, +1.457937254842823046293460638110518222745143328); + DK(KP481753674, +0.481753674101715274987191502872129653528542010); + DK(KP1_752613360, +1.752613360087727174616231807844125166798128477); + DK(KP248689887, +0.248689887164854788242283746006447968417567406); + DK(KP1_937166322, +1.937166322257262238980336750929471627672024806); + DK(KP992114701, +0.992114701314477831049793042785778521453036709); + DK(KP250666467, +0.250666467128608490746237519633017587885836494); + DK(KP425779291, +0.425779291565072648862502445744251703979973042); + DK(KP1_809654104, +1.809654104932039055427337295865395187940827822); + DK(KP1_274847979, +1.274847979497379420353425623352032390869834596); + DK(KP770513242, +0.770513242775789230803009636396177847271667672); + DK(KP844327925, +0.844327925502015078548558063966681505381659241); + DK(KP1_071653589, +1.071653589957993236542617535735279956127150691); + DK(KP125333233, +0.125333233564304245373118759816508793942918247); + DK(KP1_984229402, +1.984229402628955662099586085571557042906073418); + DK(KP904827052, +0.904827052466019527713668647932697593970413911); + DK(KP851558583, +0.851558583130145297725004891488503407959946084); + DK(KP637423989, +0.637423989748689710176712811676016195434917298); + DK(KP1_541026485, +1.541026485551578461606019272792355694543335344); + DK(KP535826794, +0.535826794978996618271308767867639978063575346); + DK(KP1_688655851, +1.688655851004030157097116127933363010763318483); + DK(KP293892626, +0.293892626146236564584352977319536384298826219); + DK(KP475528258, +0.475528258147576786058219666689691071702849317); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(100, rs), MAKE_VOLATILE_STRIDE(100, csr), MAKE_VOLATILE_STRIDE(100, csi)) { + E T8, T1j, T1V, T1l, T7, T9, Ta, T12, T2u, T1O, T19, T1P, Ti, T2r, T1K; + E Tp, T1L, Tx, T2q, T1H, TE, T1I, TN, T2t, T1R, TU, T1S, T6, T1k, T3; + E T2s, T2v; + T8 = R0[0]; + { + E T4, T5, T1, T2; + T4 = R0[WS(rs, 5)]; + T5 = R1[WS(rs, 7)]; + T6 = T4 + T5; + T1k = T4 - T5; + T1 = R1[WS(rs, 2)]; + T2 = R0[WS(rs, 10)]; + T3 = T1 + T2; + T1j = T1 - T2; + } + T1V = KP951056516 * T1k; + T1l = FMA(KP951056516, T1j, KP587785252 * T1k); + T7 = KP559016994 * (T3 - T6); + T9 = T3 + T6; + Ta = FNMS(KP250000000, T9, T8); + { + E T16, T13, T14, TY, T17, T11, T15, T18; + T16 = R1[WS(rs, 1)]; + { + E TW, TX, TZ, T10; + TW = R0[WS(rs, 4)]; + TX = R1[WS(rs, 11)]; + T13 = TW + TX; + TZ = R1[WS(rs, 6)]; + T10 = R0[WS(rs, 9)]; + T14 = TZ + T10; + TY = TW - TX; + T17 = T13 + T14; + T11 = TZ - T10; + } + T12 = FMA(KP475528258, TY, KP293892626 * T11); + T2u = T16 + T17; + T1O = FNMS(KP293892626, TY, KP475528258 * T11); + T15 = KP559016994 * (T13 - T14); + T18 = FNMS(KP250000000, T17, T16); + T19 = T15 + T18; + T1P = T18 - T15; + } + { + E Tm, Tj, Tk, Te, Tn, Th, Tl, To; + Tm = R1[0]; + { + E Tc, Td, Tf, Tg; + Tc = R0[WS(rs, 3)]; + Td = R1[WS(rs, 10)]; + Tj = Tc + Td; + Tf = R1[WS(rs, 5)]; + Tg = R0[WS(rs, 8)]; + Tk = Tf + Tg; + Te = Tc - Td; + Tn = Tj + Tk; + Th = Tf - Tg; + } + Ti = FMA(KP475528258, Te, KP293892626 * Th); + T2r = Tm + Tn; + T1K = FNMS(KP293892626, Te, KP475528258 * Th); + Tl = KP559016994 * (Tj - Tk); + To = FNMS(KP250000000, Tn, Tm); + Tp = Tl + To; + T1L = To - Tl; + } + { + E TB, Ty, Tz, Tt, TC, Tw, TA, TD; + TB = R0[WS(rs, 2)]; + { + E Tr, Ts, Tu, Tv; + Tr = R1[WS(rs, 4)]; + Ts = R0[WS(rs, 12)]; + Ty = Tr + Ts; + Tu = R0[WS(rs, 7)]; + Tv = R1[WS(rs, 9)]; + Tz = Tu + Tv; + Tt = Tr - Ts; + TC = Ty + Tz; + Tw = Tu - Tv; + } + Tx = FMA(KP475528258, Tt, KP293892626 * Tw); + T2q = TB + TC; + T1H = FNMS(KP293892626, Tt, KP475528258 * Tw); + TA = KP559016994 * (Ty - Tz); + TD = FNMS(KP250000000, TC, TB); + TE = TA + TD; + T1I = TD - TA; + } + { + E TR, TO, TP, TJ, TS, TM, TQ, TT; + TR = R0[WS(rs, 1)]; + { + E TH, TI, TK, TL; + TH = R1[WS(rs, 3)]; + TI = R0[WS(rs, 11)]; + TO = TH + TI; + TK = R0[WS(rs, 6)]; + TL = R1[WS(rs, 8)]; + TP = TK + TL; + TJ = TH - TI; + TS = TO + TP; + TM = TK - TL; + } + TN = FMA(KP475528258, TJ, KP293892626 * TM); + T2t = TR + TS; + T1R = FNMS(KP293892626, TJ, KP475528258 * TM); + TQ = KP559016994 * (TO - TP); + TT = FNMS(KP250000000, TS, TR); + TU = TQ + TT; + T1S = TT - TQ; + } + T2s = T2q - T2r; + T2v = T2t - T2u; + Ci[WS(csi, 5)] = FNMS(KP587785252, T2v, KP951056516 * T2s); + Ci[WS(csi, 10)] = FMA(KP587785252, T2s, KP951056516 * T2v); + { + E T2z, T2y, T2A, T2w, T2x, T2B; + T2z = T8 + T9; + T2w = T2r + T2q; + T2x = T2t + T2u; + T2y = KP559016994 * (T2w - T2x); + T2A = T2w + T2x; + Cr[0] = T2z + T2A; + T2B = FNMS(KP250000000, T2A, T2z); + Cr[WS(csr, 5)] = T2y + T2B; + Cr[WS(csr, 10)] = T2B - T2y; + } + { + E Tb, Tq, TF, TG, T1E, T1F, T1G, T1B, T1C, T1D, TV, T1a, T1b, T1o, T1r; + E T1s, T1z, T1x, T1e, T1h, T1i, T1u, T1t; + Tb = T7 + Ta; + Tq = FMA(KP1_688655851, Ti, KP535826794 * Tp); + TF = FMA(KP1_541026485, Tx, KP637423989 * TE); + TG = Tq - TF; + T1E = FMA(KP851558583, TN, KP904827052 * TU); + T1F = FMA(KP1_984229402, T12, KP125333233 * T19); + T1G = T1E + T1F; + T1B = FNMS(KP844327925, Tp, KP1_071653589 * Ti); + T1C = FNMS(KP1_274847979, Tx, KP770513242 * TE); + T1D = T1B + T1C; + TV = FNMS(KP425779291, TU, KP1_809654104 * TN); + T1a = FNMS(KP992114701, T19, KP250666467 * T12); + T1b = TV + T1a; + { + E T1m, T1n, T1p, T1q; + T1m = FMA(KP1_937166322, Ti, KP248689887 * Tp); + T1n = FMA(KP1_071653589, Tx, KP844327925 * TE); + T1o = T1m + T1n; + T1p = FMA(KP1_752613360, TN, KP481753674 * TU); + T1q = FMA(KP1_457937254, T12, KP684547105 * T19); + T1r = T1p + T1q; + T1s = T1o + T1r; + T1z = T1q - T1p; + T1x = T1n - T1m; + } + { + E T1c, T1d, T1f, T1g; + T1c = FNMS(KP497379774, Ti, KP968583161 * Tp); + T1d = FNMS(KP1_688655851, Tx, KP535826794 * TE); + T1e = T1c + T1d; + T1f = FNMS(KP963507348, TN, KP876306680 * TU); + T1g = FNMS(KP1_369094211, T12, KP728968627 * T19); + T1h = T1f + T1g; + T1i = T1e + T1h; + T1u = T1f - T1g; + T1t = T1d - T1c; + } + Cr[WS(csr, 1)] = Tb + T1i; + Ci[WS(csi, 1)] = -(T1l + T1s); + Cr[WS(csr, 4)] = Tb + TG + T1b; + Ci[WS(csi, 4)] = T1l + T1D - T1G; + Ci[WS(csi, 9)] = FMA(KP309016994, T1D, T1l) + FMA(KP587785252, T1a - TV, KP809016994 * T1G) - (KP951056516 * (Tq + TF)); + Cr[WS(csr, 9)] = FMA(KP309016994, TG, Tb) + FMA(KP951056516, T1B - T1C, KP587785252 * (T1F - T1E)) - (KP809016994 * T1b); + { + E T1v, T1w, T1y, T1A; + T1v = FMS(KP250000000, T1s, T1l); + T1w = KP559016994 * (T1r - T1o); + Ci[WS(csi, 11)] = FMA(KP587785252, T1t, KP951056516 * T1u) + T1v - T1w; + Ci[WS(csi, 6)] = FMA(KP951056516, T1t, T1v) + FNMS(KP587785252, T1u, T1w); + T1y = FNMS(KP250000000, T1i, Tb); + T1A = KP559016994 * (T1e - T1h); + Cr[WS(csr, 11)] = FMA(KP587785252, T1x, T1y) + FNMA(KP951056516, T1z, T1A); + Cr[WS(csr, 6)] = FMA(KP951056516, T1x, T1A) + FMA(KP587785252, T1z, T1y); + } + } + { + E T1W, T1X, T1J, T1M, T1N, T21, T22, T23, T1Q, T1T, T1U, T1Y, T1Z, T20, T26; + E T29, T2a, T2k, T2j, T2l, T2m, T2d, T2o, T2i; + T1W = FNMS(KP587785252, T1j, T1V); + T1X = Ta - T7; + T1J = FNMS(KP125333233, T1I, KP1_984229402 * T1H); + T1M = FMA(KP1_457937254, T1K, KP684547105 * T1L); + T1N = T1J - T1M; + T21 = FNMS(KP1_996053456, T1R, KP062790519 * T1S); + T22 = FMA(KP1_541026485, T1O, KP637423989 * T1P); + T23 = T21 - T22; + T1Q = FNMS(KP770513242, T1P, KP1_274847979 * T1O); + T1T = FMA(KP125581039, T1R, KP998026728 * T1S); + T1U = T1Q - T1T; + T1Y = FNMS(KP1_369094211, T1K, KP728968627 * T1L); + T1Z = FMA(KP250666467, T1H, KP992114701 * T1I); + T20 = T1Y - T1Z; + { + E T24, T25, T27, T28; + T24 = FNMS(KP481753674, T1L, KP1_752613360 * T1K); + T25 = FMA(KP851558583, T1H, KP904827052 * T1I); + T26 = T24 - T25; + T27 = FNMS(KP844327925, T1S, KP1_071653589 * T1R); + T28 = FNMS(KP998026728, T1P, KP125581039 * T1O); + T29 = T27 + T28; + T2a = T26 + T29; + T2k = T27 - T28; + T2j = T24 + T25; + } + { + E T2b, T2c, T2g, T2h; + T2b = FNMS(KP425779291, T1I, KP1_809654104 * T1H); + T2c = FMA(KP963507348, T1K, KP876306680 * T1L); + T2l = T2c + T2b; + T2g = FMA(KP1_688655851, T1R, KP535826794 * T1S); + T2h = FMA(KP1_996053456, T1O, KP062790519 * T1P); + T2m = T2g + T2h; + T2d = T2b - T2c; + T2o = T2l + T2m; + T2i = T2g - T2h; + } + Ci[WS(csi, 2)] = T1W + T2a; + Cr[WS(csr, 2)] = T1X + T2o; + Ci[WS(csi, 3)] = T1N + T1U - T1W; + Cr[WS(csr, 3)] = T1X + T20 + T23; + Cr[WS(csr, 8)] = FMA(KP309016994, T20, T1X) + FNMA(KP809016994, T23, KP587785252 * (T1T + T1Q)) - (KP951056516 * (T1M + T1J)); + Ci[WS(csi, 8)] = FNMS(KP587785252, T21 + T22, KP309016994 * T1N) + FNMA(KP809016994, T1U, KP951056516 * (T1Y + T1Z)) - T1W; + { + E T2e, T2f, T2n, T2p; + T2e = KP559016994 * (T26 - T29); + T2f = FNMS(KP250000000, T2a, T1W); + Ci[WS(csi, 7)] = FMA(KP951056516, T2d, T2e) + FNMS(KP587785252, T2i, T2f); + Ci[WS(csi, 12)] = FMA(KP587785252, T2d, T2f) + FMS(KP951056516, T2i, T2e); + T2n = KP559016994 * (T2l - T2m); + T2p = FNMS(KP250000000, T2o, T1X); + Cr[WS(csr, 7)] = FMA(KP951056516, T2j, KP587785252 * T2k) + T2n + T2p; + Cr[WS(csr, 12)] = FMA(KP587785252, T2j, T2p) + FNMA(KP951056516, T2k, T2n); + } + } + } + } +} + +static const kr2c_desc desc = { 25, "r2cf_25", {117, 57, 83, 0}, &GENUS }; + +void X(codelet_r2cf_25) (planner *p) { + X(kr2c_register) (p, r2cf_25, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_3.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_3.c new file mode 100644 index 000000000..3aaccde50 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_3.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 3 -name r2cf_3 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 4 FP additions, 2 FP multiplications, + * (or, 3 additions, 1 multiplications, 1 fused multiply/add), + * 7 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T1, T2, T3, T4; + T1 = R0[0]; + T2 = R1[0]; + T3 = R0[WS(rs, 1)]; + T4 = T2 + T3; + Cr[WS(csr, 1)] = FNMS(KP500000000, T4, T1); + Ci[WS(csi, 1)] = KP866025403 * (T3 - T2); + Cr[0] = T1 + T4; + } + } +} + +static const kr2c_desc desc = { 3, "r2cf_3", {3, 1, 1, 0}, &GENUS }; + +void X(codelet_r2cf_3) (planner *p) { + X(kr2c_register) (p, r2cf_3, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 3 -name r2cf_3 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 4 FP additions, 2 FP multiplications, + * (or, 3 additions, 1 multiplications, 1 fused multiply/add), + * 7 stack variables, 2 constants, and 6 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_3(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(12, rs), MAKE_VOLATILE_STRIDE(12, csr), MAKE_VOLATILE_STRIDE(12, csi)) { + E T1, T2, T3, T4; + T1 = R0[0]; + T2 = R1[0]; + T3 = R0[WS(rs, 1)]; + T4 = T2 + T3; + Cr[WS(csr, 1)] = FNMS(KP500000000, T4, T1); + Ci[WS(csi, 1)] = KP866025403 * (T3 - T2); + Cr[0] = T1 + T4; + } + } +} + +static const kr2c_desc desc = { 3, "r2cf_3", {3, 1, 1, 0}, &GENUS }; + +void X(codelet_r2cf_3) (planner *p) { + X(kr2c_register) (p, r2cf_3, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_32.c new file mode 100644 index 000000000..2ca66811d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_32.c @@ -0,0 +1,612 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:27 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 32 -name r2cf_32 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 156 FP additions, 68 FP multiplications, + * (or, 88 additions, 0 multiplications, 68 fused multiply/add), + * 54 stack variables, 7 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T7, T2b, Tv, T1h, Te, T2n, Ty, T1i, Tt, T2d, TF, T1l, Tm, T2c, TC; + E T1k, T1Z, T22, T2k, T2j, T1e, T1C, T19, T1B, T1S, T1V, T2h, T2g, TX, T1z; + E TS, T1y; + { + E T1, T2, T3, T4, T5, T6; + T1 = R0[0]; + T2 = R0[WS(rs, 8)]; + T3 = T1 + T2; + T4 = R0[WS(rs, 4)]; + T5 = R0[WS(rs, 12)]; + T6 = T4 + T5; + T7 = T3 + T6; + T2b = T3 - T6; + Tv = T1 - T2; + T1h = T4 - T5; + } + { + E Ta, Tw, Td, Tx; + { + E T8, T9, Tb, Tc; + T8 = R0[WS(rs, 2)]; + T9 = R0[WS(rs, 10)]; + Ta = T8 + T9; + Tw = T8 - T9; + Tb = R0[WS(rs, 14)]; + Tc = R0[WS(rs, 6)]; + Td = Tb + Tc; + Tx = Tb - Tc; + } + Te = Ta + Td; + T2n = Td - Ta; + Ty = Tw + Tx; + T1i = Tx - Tw; + } + { + E Tp, TD, Ts, TE; + { + E Tn, To, Tq, Tr; + Tn = R0[WS(rs, 15)]; + To = R0[WS(rs, 7)]; + Tp = Tn + To; + TD = Tn - To; + Tq = R0[WS(rs, 3)]; + Tr = R0[WS(rs, 11)]; + Ts = Tq + Tr; + TE = Tq - Tr; + } + Tt = Tp + Ts; + T2d = Tp - Ts; + TF = FMA(KP414213562, TE, TD); + T1l = FNMS(KP414213562, TD, TE); + } + { + E Ti, TA, Tl, TB; + { + E Tg, Th, Tj, Tk; + Tg = R0[WS(rs, 1)]; + Th = R0[WS(rs, 9)]; + Ti = Tg + Th; + TA = Tg - Th; + Tj = R0[WS(rs, 5)]; + Tk = R0[WS(rs, 13)]; + Tl = Tj + Tk; + TB = Tj - Tk; + } + Tm = Ti + Tl; + T2c = Ti - Tl; + TC = FNMS(KP414213562, TB, TA); + T1k = FMA(KP414213562, TA, TB); + } + { + E T11, T1X, T1c, T1Y, T14, T20, T17, T21, T1d, T18; + { + E TZ, T10, T1a, T1b; + TZ = R1[WS(rs, 15)]; + T10 = R1[WS(rs, 7)]; + T11 = TZ - T10; + T1X = TZ + T10; + T1a = R1[WS(rs, 11)]; + T1b = R1[WS(rs, 3)]; + T1c = T1a - T1b; + T1Y = T1b + T1a; + } + { + E T12, T13, T15, T16; + T12 = R1[WS(rs, 1)]; + T13 = R1[WS(rs, 9)]; + T14 = T12 - T13; + T20 = T12 + T13; + T15 = R1[WS(rs, 13)]; + T16 = R1[WS(rs, 5)]; + T17 = T15 - T16; + T21 = T15 + T16; + } + T1Z = T1X + T1Y; + T22 = T20 + T21; + T2k = T21 - T20; + T2j = T1X - T1Y; + T1d = T17 - T14; + T1e = FMA(KP707106781, T1d, T1c); + T1C = FNMS(KP707106781, T1d, T1c); + T18 = T14 + T17; + T19 = FMA(KP707106781, T18, T11); + T1B = FNMS(KP707106781, T18, T11); + } + { + E TK, T1Q, TV, T1R, TN, T1T, TQ, T1U, TW, TR; + { + E TI, TJ, TT, TU; + TI = R1[0]; + TJ = R1[WS(rs, 8)]; + TK = TI - TJ; + T1Q = TI + TJ; + TT = R1[WS(rs, 4)]; + TU = R1[WS(rs, 12)]; + TV = TT - TU; + T1R = TT + TU; + } + { + E TL, TM, TO, TP; + TL = R1[WS(rs, 2)]; + TM = R1[WS(rs, 10)]; + TN = TL - TM; + T1T = TL + TM; + TO = R1[WS(rs, 14)]; + TP = R1[WS(rs, 6)]; + TQ = TO - TP; + T1U = TO + TP; + } + T1S = T1Q + T1R; + T1V = T1T + T1U; + T2h = T1U - T1T; + T2g = T1Q - T1R; + TW = TN - TQ; + TX = FMA(KP707106781, TW, TV); + T1z = FNMS(KP707106781, TW, TV); + TR = TN + TQ; + TS = FMA(KP707106781, TR, TK); + T1y = FNMS(KP707106781, TR, TK); + } + { + E Tf, Tu, T27, T28, T29, T2a; + Tf = T7 + Te; + Tu = Tm + Tt; + T27 = Tf + Tu; + T28 = T1S + T1V; + T29 = T1Z + T22; + T2a = T28 + T29; + Cr[WS(csr, 8)] = Tf - Tu; + Ci[WS(csi, 8)] = T29 - T28; + Cr[WS(csr, 16)] = T27 - T2a; + Cr[0] = T27 + T2a; + } + { + E T1P, T25, T24, T26, T1W, T23; + T1P = T7 - Te; + T25 = Tt - Tm; + T1W = T1S - T1V; + T23 = T1Z - T22; + T24 = T1W + T23; + T26 = T23 - T1W; + Cr[WS(csr, 12)] = FNMS(KP707106781, T24, T1P); + Ci[WS(csi, 12)] = FMS(KP707106781, T26, T25); + Cr[WS(csr, 4)] = FMA(KP707106781, T24, T1P); + Ci[WS(csi, 4)] = FMA(KP707106781, T26, T25); + } + { + E T2f, T2v, T2p, T2r, T2m, T2q, T2u, T2w, T2e, T2o; + T2e = T2c + T2d; + T2f = FMA(KP707106781, T2e, T2b); + T2v = FNMS(KP707106781, T2e, T2b); + T2o = T2d - T2c; + T2p = FNMS(KP707106781, T2o, T2n); + T2r = FMA(KP707106781, T2o, T2n); + { + E T2i, T2l, T2s, T2t; + T2i = FMA(KP414213562, T2h, T2g); + T2l = FNMS(KP414213562, T2k, T2j); + T2m = T2i + T2l; + T2q = T2l - T2i; + T2s = FNMS(KP414213562, T2g, T2h); + T2t = FMA(KP414213562, T2j, T2k); + T2u = T2s + T2t; + T2w = T2t - T2s; + } + Cr[WS(csr, 14)] = FNMS(KP923879532, T2m, T2f); + Ci[WS(csi, 14)] = FMS(KP923879532, T2u, T2r); + Cr[WS(csr, 2)] = FMA(KP923879532, T2m, T2f); + Ci[WS(csi, 2)] = FMA(KP923879532, T2u, T2r); + Ci[WS(csi, 6)] = FMS(KP923879532, T2q, T2p); + Cr[WS(csr, 6)] = FMA(KP923879532, T2w, T2v); + Ci[WS(csi, 10)] = FMA(KP923879532, T2q, T2p); + Cr[WS(csr, 10)] = FNMS(KP923879532, T2w, T2v); + } + { + E TH, T1t, T1s, T1u, T1g, T1o, T1n, T1p; + { + E Tz, TG, T1q, T1r; + Tz = FMA(KP707106781, Ty, Tv); + TG = TC + TF; + TH = FMA(KP923879532, TG, Tz); + T1t = FNMS(KP923879532, TG, Tz); + T1q = FMA(KP198912367, T19, T1e); + T1r = FMA(KP198912367, TS, TX); + T1s = T1q - T1r; + T1u = T1r + T1q; + } + { + E TY, T1f, T1j, T1m; + TY = FNMS(KP198912367, TX, TS); + T1f = FNMS(KP198912367, T1e, T19); + T1g = TY + T1f; + T1o = T1f - TY; + T1j = FNMS(KP707106781, T1i, T1h); + T1m = T1k + T1l; + T1n = FNMS(KP923879532, T1m, T1j); + T1p = FMA(KP923879532, T1m, T1j); + } + Cr[WS(csr, 15)] = FNMS(KP980785280, T1g, TH); + Ci[WS(csi, 15)] = FMA(KP980785280, T1s, T1p); + Cr[WS(csr, 1)] = FMA(KP980785280, T1g, TH); + Ci[WS(csi, 1)] = FMS(KP980785280, T1s, T1p); + Ci[WS(csi, 7)] = FMA(KP980785280, T1o, T1n); + Cr[WS(csr, 7)] = FMA(KP980785280, T1u, T1t); + Ci[WS(csi, 9)] = FMS(KP980785280, T1o, T1n); + Cr[WS(csr, 9)] = FNMS(KP980785280, T1u, T1t); + } + { + E T1x, T1N, T1M, T1O, T1E, T1I, T1H, T1J; + { + E T1v, T1w, T1K, T1L; + T1v = FNMS(KP707106781, Ty, Tv); + T1w = T1k - T1l; + T1x = FMA(KP923879532, T1w, T1v); + T1N = FNMS(KP923879532, T1w, T1v); + T1K = FNMS(KP668178637, T1y, T1z); + T1L = FNMS(KP668178637, T1B, T1C); + T1M = T1K - T1L; + T1O = T1K + T1L; + } + { + E T1A, T1D, T1F, T1G; + T1A = FMA(KP668178637, T1z, T1y); + T1D = FMA(KP668178637, T1C, T1B); + T1E = T1A + T1D; + T1I = T1D - T1A; + T1F = FMA(KP707106781, T1i, T1h); + T1G = TF - TC; + T1H = FNMS(KP923879532, T1G, T1F); + T1J = FMA(KP923879532, T1G, T1F); + } + Cr[WS(csr, 13)] = FNMS(KP831469612, T1E, T1x); + Ci[WS(csi, 13)] = FMS(KP831469612, T1M, T1J); + Cr[WS(csr, 3)] = FMA(KP831469612, T1E, T1x); + Ci[WS(csi, 3)] = FMA(KP831469612, T1M, T1J); + Ci[WS(csi, 5)] = FMS(KP831469612, T1I, T1H); + Cr[WS(csr, 5)] = FNMS(KP831469612, T1O, T1N); + Ci[WS(csi, 11)] = FMA(KP831469612, T1I, T1H); + Cr[WS(csr, 11)] = FMA(KP831469612, T1O, T1N); + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cf_32", {88, 0, 68, 0}, &GENUS }; + +void X(codelet_r2cf_32) (planner *p) { + X(kr2c_register) (p, r2cf_32, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 32 -name r2cf_32 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 156 FP additions, 42 FP multiplications, + * (or, 140 additions, 26 multiplications, 16 fused multiply/add), + * 54 stack variables, 7 constants, and 64 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_32(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(128, rs), MAKE_VOLATILE_STRIDE(128, csr), MAKE_VOLATILE_STRIDE(128, csi)) { + E T7, T2b, Tv, T1l, Te, T2o, Ty, T1k, Tt, T2d, TF, T1h, Tm, T2c, TC; + E T1i, T1Z, T22, T2k, T2j, T1e, T1C, T19, T1B, T1S, T1V, T2h, T2g, TX, T1z; + E TS, T1y; + { + E T1, T2, T3, T4, T5, T6; + T1 = R0[0]; + T2 = R0[WS(rs, 8)]; + T3 = T1 + T2; + T4 = R0[WS(rs, 4)]; + T5 = R0[WS(rs, 12)]; + T6 = T4 + T5; + T7 = T3 + T6; + T2b = T3 - T6; + Tv = T1 - T2; + T1l = T4 - T5; + } + { + E Ta, Tw, Td, Tx; + { + E T8, T9, Tb, Tc; + T8 = R0[WS(rs, 2)]; + T9 = R0[WS(rs, 10)]; + Ta = T8 + T9; + Tw = T8 - T9; + Tb = R0[WS(rs, 14)]; + Tc = R0[WS(rs, 6)]; + Td = Tb + Tc; + Tx = Tb - Tc; + } + Te = Ta + Td; + T2o = Td - Ta; + Ty = KP707106781 * (Tw + Tx); + T1k = KP707106781 * (Tx - Tw); + } + { + E Tp, TD, Ts, TE; + { + E Tn, To, Tq, Tr; + Tn = R0[WS(rs, 15)]; + To = R0[WS(rs, 7)]; + Tp = Tn + To; + TD = Tn - To; + Tq = R0[WS(rs, 3)]; + Tr = R0[WS(rs, 11)]; + Ts = Tq + Tr; + TE = Tq - Tr; + } + Tt = Tp + Ts; + T2d = Tp - Ts; + TF = FMA(KP923879532, TD, KP382683432 * TE); + T1h = FNMS(KP923879532, TE, KP382683432 * TD); + } + { + E Ti, TA, Tl, TB; + { + E Tg, Th, Tj, Tk; + Tg = R0[WS(rs, 1)]; + Th = R0[WS(rs, 9)]; + Ti = Tg + Th; + TA = Tg - Th; + Tj = R0[WS(rs, 5)]; + Tk = R0[WS(rs, 13)]; + Tl = Tj + Tk; + TB = Tj - Tk; + } + Tm = Ti + Tl; + T2c = Ti - Tl; + TC = FNMS(KP382683432, TB, KP923879532 * TA); + T1i = FMA(KP382683432, TA, KP923879532 * TB); + } + { + E T11, T1X, T1d, T1Y, T14, T20, T17, T21, T1a, T18; + { + E TZ, T10, T1b, T1c; + TZ = R1[WS(rs, 15)]; + T10 = R1[WS(rs, 7)]; + T11 = TZ - T10; + T1X = TZ + T10; + T1b = R1[WS(rs, 3)]; + T1c = R1[WS(rs, 11)]; + T1d = T1b - T1c; + T1Y = T1b + T1c; + } + { + E T12, T13, T15, T16; + T12 = R1[WS(rs, 1)]; + T13 = R1[WS(rs, 9)]; + T14 = T12 - T13; + T20 = T12 + T13; + T15 = R1[WS(rs, 13)]; + T16 = R1[WS(rs, 5)]; + T17 = T15 - T16; + T21 = T15 + T16; + } + T1Z = T1X + T1Y; + T22 = T20 + T21; + T2k = T21 - T20; + T2j = T1X - T1Y; + T1a = KP707106781 * (T17 - T14); + T1e = T1a - T1d; + T1C = T1d + T1a; + T18 = KP707106781 * (T14 + T17); + T19 = T11 + T18; + T1B = T11 - T18; + } + { + E TK, T1Q, TW, T1R, TN, T1T, TQ, T1U, TT, TR; + { + E TI, TJ, TU, TV; + TI = R1[0]; + TJ = R1[WS(rs, 8)]; + TK = TI - TJ; + T1Q = TI + TJ; + TU = R1[WS(rs, 4)]; + TV = R1[WS(rs, 12)]; + TW = TU - TV; + T1R = TU + TV; + } + { + E TL, TM, TO, TP; + TL = R1[WS(rs, 2)]; + TM = R1[WS(rs, 10)]; + TN = TL - TM; + T1T = TL + TM; + TO = R1[WS(rs, 14)]; + TP = R1[WS(rs, 6)]; + TQ = TO - TP; + T1U = TO + TP; + } + T1S = T1Q + T1R; + T1V = T1T + T1U; + T2h = T1U - T1T; + T2g = T1Q - T1R; + TT = KP707106781 * (TQ - TN); + TX = TT - TW; + T1z = TW + TT; + TR = KP707106781 * (TN + TQ); + TS = TK + TR; + T1y = TK - TR; + } + { + E Tf, Tu, T27, T28, T29, T2a; + Tf = T7 + Te; + Tu = Tm + Tt; + T27 = Tf + Tu; + T28 = T1S + T1V; + T29 = T1Z + T22; + T2a = T28 + T29; + Cr[WS(csr, 8)] = Tf - Tu; + Ci[WS(csi, 8)] = T29 - T28; + Cr[WS(csr, 16)] = T27 - T2a; + Cr[0] = T27 + T2a; + } + { + E T1P, T25, T24, T26, T1W, T23; + T1P = T7 - Te; + T25 = Tt - Tm; + T1W = T1S - T1V; + T23 = T1Z - T22; + T24 = KP707106781 * (T1W + T23); + T26 = KP707106781 * (T23 - T1W); + Cr[WS(csr, 12)] = T1P - T24; + Ci[WS(csi, 12)] = T26 - T25; + Cr[WS(csr, 4)] = T1P + T24; + Ci[WS(csi, 4)] = T25 + T26; + } + { + E T2f, T2v, T2p, T2r, T2m, T2q, T2u, T2w, T2e, T2n; + T2e = KP707106781 * (T2c + T2d); + T2f = T2b + T2e; + T2v = T2b - T2e; + T2n = KP707106781 * (T2d - T2c); + T2p = T2n - T2o; + T2r = T2o + T2n; + { + E T2i, T2l, T2s, T2t; + T2i = FMA(KP923879532, T2g, KP382683432 * T2h); + T2l = FNMS(KP382683432, T2k, KP923879532 * T2j); + T2m = T2i + T2l; + T2q = T2l - T2i; + T2s = FNMS(KP382683432, T2g, KP923879532 * T2h); + T2t = FMA(KP382683432, T2j, KP923879532 * T2k); + T2u = T2s + T2t; + T2w = T2t - T2s; + } + Cr[WS(csr, 14)] = T2f - T2m; + Ci[WS(csi, 14)] = T2u - T2r; + Cr[WS(csr, 2)] = T2f + T2m; + Ci[WS(csi, 2)] = T2r + T2u; + Ci[WS(csi, 6)] = T2p + T2q; + Cr[WS(csr, 6)] = T2v + T2w; + Ci[WS(csi, 10)] = T2q - T2p; + Cr[WS(csr, 10)] = T2v - T2w; + } + { + E TH, T1t, T1s, T1u, T1g, T1o, T1n, T1p; + { + E Tz, TG, T1q, T1r; + Tz = Tv + Ty; + TG = TC + TF; + TH = Tz + TG; + T1t = Tz - TG; + T1q = FNMS(KP195090322, TS, KP980785280 * TX); + T1r = FMA(KP195090322, T19, KP980785280 * T1e); + T1s = T1q + T1r; + T1u = T1r - T1q; + } + { + E TY, T1f, T1j, T1m; + TY = FMA(KP980785280, TS, KP195090322 * TX); + T1f = FNMS(KP195090322, T1e, KP980785280 * T19); + T1g = TY + T1f; + T1o = T1f - TY; + T1j = T1h - T1i; + T1m = T1k - T1l; + T1n = T1j - T1m; + T1p = T1m + T1j; + } + Cr[WS(csr, 15)] = TH - T1g; + Ci[WS(csi, 15)] = T1s - T1p; + Cr[WS(csr, 1)] = TH + T1g; + Ci[WS(csi, 1)] = T1p + T1s; + Ci[WS(csi, 7)] = T1n + T1o; + Cr[WS(csr, 7)] = T1t + T1u; + Ci[WS(csi, 9)] = T1o - T1n; + Cr[WS(csr, 9)] = T1t - T1u; + } + { + E T1x, T1N, T1M, T1O, T1E, T1I, T1H, T1J; + { + E T1v, T1w, T1K, T1L; + T1v = Tv - Ty; + T1w = T1i + T1h; + T1x = T1v + T1w; + T1N = T1v - T1w; + T1K = FNMS(KP555570233, T1y, KP831469612 * T1z); + T1L = FMA(KP555570233, T1B, KP831469612 * T1C); + T1M = T1K + T1L; + T1O = T1L - T1K; + } + { + E T1A, T1D, T1F, T1G; + T1A = FMA(KP831469612, T1y, KP555570233 * T1z); + T1D = FNMS(KP555570233, T1C, KP831469612 * T1B); + T1E = T1A + T1D; + T1I = T1D - T1A; + T1F = TF - TC; + T1G = T1l + T1k; + T1H = T1F - T1G; + T1J = T1G + T1F; + } + Cr[WS(csr, 13)] = T1x - T1E; + Ci[WS(csi, 13)] = T1M - T1J; + Cr[WS(csr, 3)] = T1x + T1E; + Ci[WS(csi, 3)] = T1J + T1M; + Ci[WS(csi, 5)] = T1H + T1I; + Cr[WS(csr, 5)] = T1N + T1O; + Ci[WS(csi, 11)] = T1I - T1H; + Cr[WS(csr, 11)] = T1N - T1O; + } + } + } +} + +static const kr2c_desc desc = { 32, "r2cf_32", {140, 26, 16, 0}, &GENUS }; + +void X(codelet_r2cf_32) (planner *p) { + X(kr2c_register) (p, r2cf_32, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_4.c new file mode 100644 index 000000000..67dccba35 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_4.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 4 -name r2cf_4 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 6 FP additions, 0 FP multiplications, + * (or, 6 additions, 0 multiplications, 0 fused multiply/add), + * 7 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T1, T2, T3, T4, T5, T6; + T1 = R0[0]; + T2 = R0[WS(rs, 1)]; + T3 = T1 + T2; + T4 = R1[0]; + T5 = R1[WS(rs, 1)]; + T6 = T4 + T5; + Cr[WS(csr, 1)] = T1 - T2; + Ci[WS(csi, 1)] = T5 - T4; + Cr[WS(csr, 2)] = T3 - T6; + Cr[0] = T3 + T6; + } + } +} + +static const kr2c_desc desc = { 4, "r2cf_4", {6, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cf_4) (planner *p) { + X(kr2c_register) (p, r2cf_4, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 4 -name r2cf_4 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 6 FP additions, 0 FP multiplications, + * (or, 6 additions, 0 multiplications, 0 fused multiply/add), + * 7 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_4(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(16, rs), MAKE_VOLATILE_STRIDE(16, csr), MAKE_VOLATILE_STRIDE(16, csi)) { + E T1, T2, T3, T4, T5, T6; + T1 = R0[0]; + T2 = R0[WS(rs, 1)]; + T3 = T1 + T2; + T4 = R1[0]; + T5 = R1[WS(rs, 1)]; + T6 = T4 + T5; + Cr[WS(csr, 1)] = T1 - T2; + Ci[WS(csi, 1)] = T5 - T4; + Cr[WS(csr, 2)] = T3 - T6; + Cr[0] = T3 + T6; + } + } +} + +static const kr2c_desc desc = { 4, "r2cf_4", {6, 0, 0, 0}, &GENUS }; + +void X(codelet_r2cf_4) (planner *p) { + X(kr2c_register) (p, r2cf_4, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_5.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_5.c new file mode 100644 index 000000000..269176eea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_5.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 5 -name r2cf_5 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 12 FP additions, 7 FP multiplications, + * (or, 7 additions, 2 multiplications, 5 fused multiply/add), + * 17 stack variables, 4 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP618033988, +0.618033988749894848204586834365638117720309180); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E T7, T8, T9, T3, Ta, T6, Tb, Tc; + T7 = R0[0]; + { + E T1, T2, T4, T5; + T1 = R0[WS(rs, 2)]; + T2 = R1[0]; + T8 = T2 + T1; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 1)]; + T9 = T4 + T5; + T3 = T1 - T2; + Ta = T8 + T9; + T6 = T4 - T5; + } + Ci[WS(csi, 1)] = KP951056516 * (FNMS(KP618033988, T6, T3)); + Cr[0] = T7 + Ta; + Ci[WS(csi, 2)] = KP951056516 * (FMA(KP618033988, T3, T6)); + Tb = FNMS(KP250000000, Ta, T7); + Tc = T8 - T9; + Cr[WS(csr, 1)] = FMA(KP559016994, Tc, Tb); + Cr[WS(csr, 2)] = FNMS(KP559016994, Tc, Tb); + } + } +} + +static const kr2c_desc desc = { 5, "r2cf_5", {7, 2, 5, 0}, &GENUS }; + +void X(codelet_r2cf_5) (planner *p) { + X(kr2c_register) (p, r2cf_5, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 5 -name r2cf_5 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 12 FP additions, 6 FP multiplications, + * (or, 9 additions, 3 multiplications, 3 fused multiply/add), + * 17 stack variables, 4 constants, and 10 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_5(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP250000000, +0.250000000000000000000000000000000000000000000); + DK(KP559016994, +0.559016994374947424102293417182819058860154590); + DK(KP587785252, +0.587785252292473129168705954639072768597652438); + DK(KP951056516, +0.951056516295153572116439333379382143405698634); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(20, rs), MAKE_VOLATILE_STRIDE(20, csr), MAKE_VOLATILE_STRIDE(20, csi)) { + E Ta, T7, T8, T3, Tb, T6, T9, Tc; + Ta = R0[0]; + { + E T1, T2, T4, T5; + T1 = R0[WS(rs, 2)]; + T2 = R1[0]; + T7 = T2 + T1; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 1)]; + T8 = T4 + T5; + T3 = T1 - T2; + Tb = T7 + T8; + T6 = T4 - T5; + } + Ci[WS(csi, 1)] = FNMS(KP587785252, T6, KP951056516 * T3); + Cr[0] = Ta + Tb; + Ci[WS(csi, 2)] = FMA(KP587785252, T3, KP951056516 * T6); + T9 = KP559016994 * (T7 - T8); + Tc = FNMS(KP250000000, Tb, Ta); + Cr[WS(csr, 1)] = T9 + Tc; + Cr[WS(csr, 2)] = Tc - T9; + } + } +} + +static const kr2c_desc desc = { 5, "r2cf_5", {9, 3, 3, 0}, &GENUS }; + +void X(codelet_r2cf_5) (planner *p) { + X(kr2c_register) (p, r2cf_5, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_6.c new file mode 100644 index 000000000..a6b2b60c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_6.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 6 -name r2cf_6 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 14 FP additions, 4 FP multiplications, + * (or, 12 additions, 2 multiplications, 2 fused multiply/add), + * 17 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T3, Td, T9, Tc, T6, Tb, T1, T2, Ta, Te; + T1 = R0[0]; + T2 = R1[WS(rs, 1)]; + T3 = T1 - T2; + Td = T1 + T2; + { + E T7, T8, T4, T5; + T7 = R0[WS(rs, 2)]; + T8 = R1[0]; + T9 = T7 - T8; + Tc = T7 + T8; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 2)]; + T6 = T4 - T5; + Tb = T4 + T5; + } + Ci[WS(csi, 1)] = KP866025403 * (T9 - T6); + Ta = T6 + T9; + Cr[WS(csr, 1)] = FNMS(KP500000000, Ta, T3); + Cr[WS(csr, 3)] = T3 + Ta; + Ci[WS(csi, 2)] = KP866025403 * (Tb - Tc); + Te = Tb + Tc; + Cr[WS(csr, 2)] = FNMS(KP500000000, Te, Td); + Cr[0] = Td + Te; + } + } +} + +static const kr2c_desc desc = { 6, "r2cf_6", {12, 2, 2, 0}, &GENUS }; + +void X(codelet_r2cf_6) (planner *p) { + X(kr2c_register) (p, r2cf_6, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 6 -name r2cf_6 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 14 FP additions, 4 FP multiplications, + * (or, 12 additions, 2 multiplications, 2 fused multiply/add), + * 17 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_6(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(24, rs), MAKE_VOLATILE_STRIDE(24, csr), MAKE_VOLATILE_STRIDE(24, csi)) { + E T3, Td, T9, Tc, T6, Tb, T1, T2, Ta, Te; + T1 = R0[0]; + T2 = R1[WS(rs, 1)]; + T3 = T1 - T2; + Td = T1 + T2; + { + E T7, T8, T4, T5; + T7 = R0[WS(rs, 2)]; + T8 = R1[0]; + T9 = T7 - T8; + Tc = T7 + T8; + T4 = R0[WS(rs, 1)]; + T5 = R1[WS(rs, 2)]; + T6 = T4 - T5; + Tb = T4 + T5; + } + Ci[WS(csi, 1)] = KP866025403 * (T9 - T6); + Ta = T6 + T9; + Cr[WS(csr, 1)] = FNMS(KP500000000, Ta, T3); + Cr[WS(csr, 3)] = T3 + Ta; + Ci[WS(csi, 2)] = KP866025403 * (Tb - Tc); + Te = Tb + Tc; + Cr[WS(csr, 2)] = FNMS(KP500000000, Te, Td); + Cr[0] = Td + Te; + } + } +} + +static const kr2c_desc desc = { 6, "r2cf_6", {12, 2, 2, 0}, &GENUS }; + +void X(codelet_r2cf_6) (planner *p) { + X(kr2c_register) (p, r2cf_6, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_64.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_64.c new file mode 100644 index 000000000..67ee07917 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_64.c @@ -0,0 +1,1410 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:27 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 64 -name r2cf_64 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 394 FP additions, 196 FP multiplications, + * (or, 198 additions, 0 multiplications, 196 fused multiply/add), + * 106 stack variables, 15 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP098491403, +0.098491403357164253077197521291327432293052451); + DK(KP820678790, +0.820678790828660330972281985331011598767386482); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP534511135, +0.534511135950791641089685961295362908582039528); + DK(KP303346683, +0.303346683607342391675883946941299872384187453); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E T11, T2j, T3D, T5p, T4P, T5P, T7, Te, Tf, T1k, T1H, T4a, T5A, T4l, T5D; + E T2U, T3i, T1R, T2e, T4v, T5H, T4G, T5K, T31, T3l, T3Z, T5t, T42, T5s, TZ; + E T3f, T1b, T2n, T3Q, T5w, T3T, T5v, TK, T3e, T18, T2m, Tm, Tt, Tu, T4S; + E T5q, T14, T2k, T3K, T5Q, T1z, T1I, T4o, T5B, T2X, T3j, T4h, T5E, T26, T2f; + E T4J, T5I, T34, T3m, T4C, T5L; + { + E T3, T3z, Td, T3B, T6, T4N, Ta, T3A, T3C, T4O; + { + E T1, T2, Tb, Tc; + T1 = R0[0]; + T2 = R0[WS(rs, 16)]; + T3 = T1 + T2; + T3z = T1 - T2; + Tb = R0[WS(rs, 28)]; + Tc = R0[WS(rs, 12)]; + Td = Tb + Tc; + T3B = Tb - Tc; + } + { + E T4, T5, T8, T9; + T4 = R0[WS(rs, 8)]; + T5 = R0[WS(rs, 24)]; + T6 = T4 + T5; + T4N = T4 - T5; + T8 = R0[WS(rs, 4)]; + T9 = R0[WS(rs, 20)]; + Ta = T8 + T9; + T3A = T8 - T9; + } + T11 = T3 - T6; + T2j = Td - Ta; + T3C = T3A + T3B; + T3D = FMA(KP707106781, T3C, T3z); + T5p = FNMS(KP707106781, T3C, T3z); + T4O = T3B - T3A; + T4P = FNMS(KP707106781, T4O, T4N); + T5P = FMA(KP707106781, T4O, T4N); + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + } + { + E T1g, T46, T1G, T47, T1j, T4j, T1D, T48; + { + E T1e, T1f, T1E, T1F; + T1e = R1[0]; + T1f = R1[WS(rs, 16)]; + T1g = T1e + T1f; + T46 = T1e - T1f; + T1E = R1[WS(rs, 4)]; + T1F = R1[WS(rs, 20)]; + T1G = T1E + T1F; + T47 = T1E - T1F; + } + { + E T1h, T1i, T1B, T1C; + T1h = R1[WS(rs, 8)]; + T1i = R1[WS(rs, 24)]; + T1j = T1h + T1i; + T4j = T1h - T1i; + T1B = R1[WS(rs, 28)]; + T1C = R1[WS(rs, 12)]; + T1D = T1B + T1C; + T48 = T1B - T1C; + } + T1k = T1g - T1j; + T1H = T1D - T1G; + { + E T49, T4k, T2S, T2T; + T49 = T47 + T48; + T4a = FMA(KP707106781, T49, T46); + T5A = FNMS(KP707106781, T49, T46); + T4k = T47 - T48; + T4l = FMA(KP707106781, T4k, T4j); + T5D = FNMS(KP707106781, T4k, T4j); + T2S = T1g + T1j; + T2T = T1G + T1D; + T2U = T2S + T2T; + T3i = T2S - T2T; + } + } + { + E T1N, T4r, T2d, T4s, T1Q, T4E, T2a, T4t; + { + E T1L, T1M, T2b, T2c; + T1L = R1[WS(rs, 31)]; + T1M = R1[WS(rs, 15)]; + T1N = T1L + T1M; + T4r = T1L - T1M; + T2b = R1[WS(rs, 3)]; + T2c = R1[WS(rs, 19)]; + T2d = T2b + T2c; + T4s = T2b - T2c; + } + { + E T1O, T1P, T28, T29; + T1O = R1[WS(rs, 7)]; + T1P = R1[WS(rs, 23)]; + T1Q = T1O + T1P; + T4E = T1P - T1O; + T28 = R1[WS(rs, 27)]; + T29 = R1[WS(rs, 11)]; + T2a = T28 + T29; + T4t = T28 - T29; + } + T1R = T1N - T1Q; + T2e = T2a - T2d; + { + E T4u, T4F, T2Z, T30; + T4u = T4s + T4t; + T4v = FMA(KP707106781, T4u, T4r); + T5H = FNMS(KP707106781, T4u, T4r); + T4F = T4t - T4s; + T4G = FMA(KP707106781, T4F, T4E); + T5K = FNMS(KP707106781, T4F, T4E); + T2Z = T1N + T1Q; + T30 = T2d + T2a; + T31 = T2Z + T30; + T3l = T2Z - T30; + } + } + { + E TN, T3V, TX, T3X, TQ, T40, TU, T3W, T3Y, T41; + { + E TL, TM, TV, TW; + TL = R0[WS(rs, 31)]; + TM = R0[WS(rs, 15)]; + TN = TL + TM; + T3V = TL - TM; + TV = R0[WS(rs, 27)]; + TW = R0[WS(rs, 11)]; + TX = TV + TW; + T3X = TV - TW; + } + { + E TO, TP, TS, TT; + TO = R0[WS(rs, 7)]; + TP = R0[WS(rs, 23)]; + TQ = TO + TP; + T40 = TO - TP; + TS = R0[WS(rs, 3)]; + TT = R0[WS(rs, 19)]; + TU = TS + TT; + T3W = TS - TT; + } + T3Y = T3W + T3X; + T3Z = FMA(KP707106781, T3Y, T3V); + T5t = FNMS(KP707106781, T3Y, T3V); + T41 = T3W - T3X; + T42 = FMA(KP707106781, T41, T40); + T5s = FNMS(KP707106781, T41, T40); + { + E TR, TY, T19, T1a; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T3f = TR - TY; + T19 = TN - TQ; + T1a = TX - TU; + T1b = FNMS(KP414213562, T1a, T19); + T2n = FMA(KP414213562, T19, T1a); + } + } + { + E Ty, T3M, TI, T3O, TB, T3R, TF, T3N, T3P, T3S; + { + E Tw, Tx, TG, TH; + Tw = R0[WS(rs, 1)]; + Tx = R0[WS(rs, 17)]; + Ty = Tw + Tx; + T3M = Tw - Tx; + TG = R0[WS(rs, 29)]; + TH = R0[WS(rs, 13)]; + TI = TG + TH; + T3O = TG - TH; + } + { + E Tz, TA, TD, TE; + Tz = R0[WS(rs, 9)]; + TA = R0[WS(rs, 25)]; + TB = Tz + TA; + T3R = Tz - TA; + TD = R0[WS(rs, 5)]; + TE = R0[WS(rs, 21)]; + TF = TD + TE; + T3N = TD - TE; + } + T3P = T3N + T3O; + T3Q = FMA(KP707106781, T3P, T3M); + T5w = FNMS(KP707106781, T3P, T3M); + T3S = T3N - T3O; + T3T = FMA(KP707106781, T3S, T3R); + T5v = FNMS(KP707106781, T3S, T3R); + { + E TC, TJ, T16, T17; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T3e = TC - TJ; + T16 = Ty - TB; + T17 = TI - TF; + T18 = FMA(KP414213562, T17, T16); + T2m = FNMS(KP414213562, T16, T17); + } + } + { + E Ti, T3E, Ts, T3I, Tl, T3F, Tp, T3H, T4Q, T4R; + { + E Tg, Th, Tq, Tr; + Tg = R0[WS(rs, 2)]; + Th = R0[WS(rs, 18)]; + Ti = Tg + Th; + T3E = Tg - Th; + Tq = R0[WS(rs, 6)]; + Tr = R0[WS(rs, 22)]; + Ts = Tq + Tr; + T3I = Tq - Tr; + } + { + E Tj, Tk, Tn, To; + Tj = R0[WS(rs, 10)]; + Tk = R0[WS(rs, 26)]; + Tl = Tj + Tk; + T3F = Tj - Tk; + Tn = R0[WS(rs, 30)]; + To = R0[WS(rs, 14)]; + Tp = Tn + To; + T3H = Tn - To; + } + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T4Q = FMA(KP414213562, T3E, T3F); + T4R = FNMS(KP414213562, T3H, T3I); + T4S = T4Q + T4R; + T5q = T4Q - T4R; + { + E T12, T13, T3G, T3J; + T12 = Ti - Tl; + T13 = Tp - Ts; + T14 = T12 + T13; + T2k = T13 - T12; + T3G = FNMS(KP414213562, T3F, T3E); + T3J = FMA(KP414213562, T3I, T3H); + T3K = T3G + T3J; + T5Q = T3J - T3G; + } + } + { + E T1n, T4b, T1x, T4f, T1q, T4c, T1u, T4e; + { + E T1l, T1m, T1v, T1w; + T1l = R1[WS(rs, 2)]; + T1m = R1[WS(rs, 18)]; + T1n = T1l + T1m; + T4b = T1l - T1m; + T1v = R1[WS(rs, 6)]; + T1w = R1[WS(rs, 22)]; + T1x = T1v + T1w; + T4f = T1v - T1w; + } + { + E T1o, T1p, T1s, T1t; + T1o = R1[WS(rs, 10)]; + T1p = R1[WS(rs, 26)]; + T1q = T1o + T1p; + T4c = T1o - T1p; + T1s = R1[WS(rs, 30)]; + T1t = R1[WS(rs, 14)]; + T1u = T1s + T1t; + T4e = T1s - T1t; + } + { + E T1r, T1y, T4m, T4n; + T1r = T1n - T1q; + T1y = T1u - T1x; + T1z = T1r + T1y; + T1I = T1y - T1r; + T4m = FMA(KP414213562, T4b, T4c); + T4n = FNMS(KP414213562, T4e, T4f); + T4o = T4m + T4n; + T5B = T4m - T4n; + } + { + E T2V, T2W, T4d, T4g; + T2V = T1n + T1q; + T2W = T1u + T1x; + T2X = T2V + T2W; + T3j = T2W - T2V; + T4d = FNMS(KP414213562, T4c, T4b); + T4g = FMA(KP414213562, T4f, T4e); + T4h = T4d + T4g; + T5E = T4g - T4d; + } + } + { + E T1U, T4w, T24, T4A, T1X, T4x, T21, T4z; + { + E T1S, T1T, T22, T23; + T1S = R1[WS(rs, 1)]; + T1T = R1[WS(rs, 17)]; + T1U = T1S + T1T; + T4w = T1S - T1T; + T22 = R1[WS(rs, 5)]; + T23 = R1[WS(rs, 21)]; + T24 = T22 + T23; + T4A = T23 - T22; + } + { + E T1V, T1W, T1Z, T20; + T1V = R1[WS(rs, 9)]; + T1W = R1[WS(rs, 25)]; + T1X = T1V + T1W; + T4x = T1W - T1V; + T1Z = R1[WS(rs, 29)]; + T20 = R1[WS(rs, 13)]; + T21 = T1Z + T20; + T4z = T1Z - T20; + } + { + E T1Y, T25, T4H, T4I; + T1Y = T1U - T1X; + T25 = T21 - T24; + T26 = T1Y + T25; + T2f = T25 - T1Y; + T4H = FNMS(KP414213562, T4w, T4x); + T4I = FMA(KP414213562, T4z, T4A); + T4J = T4H + T4I; + T5I = T4I - T4H; + } + { + E T32, T33, T4y, T4B; + T32 = T1U + T1X; + T33 = T21 + T24; + T34 = T32 + T33; + T3m = T33 - T32; + T4y = FMA(KP414213562, T4x, T4w); + T4B = FNMS(KP414213562, T4A, T4z); + T4C = T4y + T4B; + T5L = T4B - T4y; + } + } + { + E Tv, T10, T39, T3a, T3b, T3c; + Tv = Tf + Tu; + T10 = TK + TZ; + T39 = Tv + T10; + T3a = T2U + T2X; + T3b = T31 + T34; + T3c = T3a + T3b; + Cr[WS(csr, 16)] = Tv - T10; + Ci[WS(csi, 16)] = T3b - T3a; + Cr[WS(csr, 32)] = T39 - T3c; + Cr[0] = T39 + T3c; + } + { + E T2R, T37, T36, T38, T2Y, T35; + T2R = Tf - Tu; + T37 = TZ - TK; + T2Y = T2U - T2X; + T35 = T31 - T34; + T36 = T2Y + T35; + T38 = T35 - T2Y; + Cr[WS(csr, 24)] = FNMS(KP707106781, T36, T2R); + Ci[WS(csi, 24)] = FMS(KP707106781, T38, T37); + Cr[WS(csr, 8)] = FMA(KP707106781, T36, T2R); + Ci[WS(csi, 8)] = FMA(KP707106781, T38, T37); + } + { + E T3h, T3x, T3w, T3y, T3o, T3s, T3r, T3t; + { + E T3d, T3g, T3u, T3v; + T3d = T7 - Te; + T3g = T3e + T3f; + T3h = FMA(KP707106781, T3g, T3d); + T3x = FNMS(KP707106781, T3g, T3d); + T3u = FNMS(KP414213562, T3i, T3j); + T3v = FMA(KP414213562, T3l, T3m); + T3w = T3u + T3v; + T3y = T3v - T3u; + } + { + E T3k, T3n, T3p, T3q; + T3k = FMA(KP414213562, T3j, T3i); + T3n = FNMS(KP414213562, T3m, T3l); + T3o = T3k + T3n; + T3s = T3n - T3k; + T3p = Tt - Tm; + T3q = T3f - T3e; + T3r = FNMS(KP707106781, T3q, T3p); + T3t = FMA(KP707106781, T3q, T3p); + } + Cr[WS(csr, 28)] = FNMS(KP923879532, T3o, T3h); + Ci[WS(csi, 28)] = FMS(KP923879532, T3w, T3t); + Cr[WS(csr, 4)] = FMA(KP923879532, T3o, T3h); + Ci[WS(csi, 4)] = FMA(KP923879532, T3w, T3t); + Ci[WS(csi, 12)] = FMS(KP923879532, T3s, T3r); + Cr[WS(csr, 12)] = FMA(KP923879532, T3y, T3x); + Ci[WS(csi, 20)] = FMA(KP923879532, T3s, T3r); + Cr[WS(csr, 20)] = FNMS(KP923879532, T3y, T3x); + } + { + E T2z, T2P, T2J, T2L, T2C, T2M, T2F, T2N; + { + E T2x, T2y, T2H, T2I; + T2x = FNMS(KP707106781, T14, T11); + T2y = T2n - T2m; + T2z = FMA(KP923879532, T2y, T2x); + T2P = FNMS(KP923879532, T2y, T2x); + T2H = FNMS(KP707106781, T2k, T2j); + T2I = T1b - T18; + T2J = FMA(KP923879532, T2I, T2H); + T2L = FNMS(KP923879532, T2I, T2H); + } + { + E T2A, T2B, T2D, T2E; + T2A = FNMS(KP707106781, T1z, T1k); + T2B = FNMS(KP707106781, T1I, T1H); + T2C = FNMS(KP668178637, T2B, T2A); + T2M = FMA(KP668178637, T2A, T2B); + T2D = FNMS(KP707106781, T26, T1R); + T2E = FNMS(KP707106781, T2f, T2e); + T2F = FMA(KP668178637, T2E, T2D); + T2N = FNMS(KP668178637, T2D, T2E); + } + { + E T2G, T2O, T2K, T2Q; + T2G = T2C + T2F; + Cr[WS(csr, 26)] = FNMS(KP831469612, T2G, T2z); + Cr[WS(csr, 6)] = FMA(KP831469612, T2G, T2z); + T2O = T2M + T2N; + Ci[WS(csi, 6)] = -(FMA(KP831469612, T2O, T2L)); + Ci[WS(csi, 26)] = FNMS(KP831469612, T2O, T2L); + T2K = T2F - T2C; + Ci[WS(csi, 10)] = FMA(KP831469612, T2K, T2J); + Ci[WS(csi, 22)] = FMS(KP831469612, T2K, T2J); + T2Q = T2M - T2N; + Cr[WS(csr, 22)] = FNMS(KP831469612, T2Q, T2P); + Cr[WS(csr, 10)] = FMA(KP831469612, T2Q, T2P); + } + } + { + E T1d, T2v, T2p, T2r, T1K, T2s, T2h, T2t; + { + E T15, T1c, T2l, T2o; + T15 = FMA(KP707106781, T14, T11); + T1c = T18 + T1b; + T1d = FMA(KP923879532, T1c, T15); + T2v = FNMS(KP923879532, T1c, T15); + T2l = FMA(KP707106781, T2k, T2j); + T2o = T2m + T2n; + T2p = FNMS(KP923879532, T2o, T2l); + T2r = FMA(KP923879532, T2o, T2l); + } + { + E T1A, T1J, T27, T2g; + T1A = FMA(KP707106781, T1z, T1k); + T1J = FMA(KP707106781, T1I, T1H); + T1K = FMA(KP198912367, T1J, T1A); + T2s = FNMS(KP198912367, T1A, T1J); + T27 = FMA(KP707106781, T26, T1R); + T2g = FMA(KP707106781, T2f, T2e); + T2h = FNMS(KP198912367, T2g, T27); + T2t = FMA(KP198912367, T27, T2g); + } + { + E T2i, T2u, T2q, T2w; + T2i = T1K + T2h; + Cr[WS(csr, 30)] = FNMS(KP980785280, T2i, T1d); + Cr[WS(csr, 2)] = FMA(KP980785280, T2i, T1d); + T2u = T2s + T2t; + Ci[WS(csi, 2)] = FMA(KP980785280, T2u, T2r); + Ci[WS(csi, 30)] = FMS(KP980785280, T2u, T2r); + T2q = T2h - T1K; + Ci[WS(csi, 14)] = FMS(KP980785280, T2q, T2p); + Ci[WS(csi, 18)] = FMA(KP980785280, T2q, T2p); + T2w = T2t - T2s; + Cr[WS(csr, 18)] = FNMS(KP980785280, T2w, T2v); + Cr[WS(csr, 14)] = FMA(KP980785280, T2w, T2v); + } + } + { + E T5r, T63, T6d, T5R, T5y, T6e, T6b, T6j, T5U, T64, T5G, T5Z, T68, T6i, T5N; + E T5Y; + { + E T5u, T5x, T5C, T5F; + T5r = FNMS(KP923879532, T5q, T5p); + T63 = FMA(KP923879532, T5q, T5p); + T6d = FMA(KP923879532, T5Q, T5P); + T5R = FNMS(KP923879532, T5Q, T5P); + T5u = FMA(KP668178637, T5t, T5s); + T5x = FNMS(KP668178637, T5w, T5v); + T5y = T5u - T5x; + T6e = T5x + T5u; + { + E T69, T6a, T5S, T5T; + T69 = FMA(KP923879532, T5I, T5H); + T6a = FNMS(KP923879532, T5L, T5K); + T6b = FMA(KP303346683, T6a, T69); + T6j = FNMS(KP303346683, T69, T6a); + T5S = FNMS(KP668178637, T5s, T5t); + T5T = FMA(KP668178637, T5v, T5w); + T5U = T5S - T5T; + T64 = T5T + T5S; + } + T5C = FNMS(KP923879532, T5B, T5A); + T5F = FNMS(KP923879532, T5E, T5D); + T5G = FNMS(KP534511135, T5F, T5C); + T5Z = FMA(KP534511135, T5C, T5F); + { + E T66, T67, T5J, T5M; + T66 = FMA(KP923879532, T5B, T5A); + T67 = FMA(KP923879532, T5E, T5D); + T68 = FMA(KP303346683, T67, T66); + T6i = FNMS(KP303346683, T66, T67); + T5J = FNMS(KP923879532, T5I, T5H); + T5M = FMA(KP923879532, T5L, T5K); + T5N = FNMS(KP534511135, T5M, T5J); + T5Y = FMA(KP534511135, T5J, T5M); + } + } + { + E T5z, T5O, T5X, T60; + T5z = FMA(KP831469612, T5y, T5r); + T5O = T5G + T5N; + Cr[WS(csr, 27)] = FNMS(KP881921264, T5O, T5z); + Cr[WS(csr, 5)] = FMA(KP881921264, T5O, T5z); + T5X = FNMS(KP831469612, T5U, T5R); + T60 = T5Y - T5Z; + Ci[WS(csi, 5)] = FMS(KP881921264, T60, T5X); + Ci[WS(csi, 27)] = FMA(KP881921264, T60, T5X); + } + { + E T5V, T5W, T61, T62; + T5V = FMA(KP831469612, T5U, T5R); + T5W = T5N - T5G; + Ci[WS(csi, 11)] = FMA(KP881921264, T5W, T5V); + Ci[WS(csi, 21)] = FMS(KP881921264, T5W, T5V); + T61 = FNMS(KP831469612, T5y, T5r); + T62 = T5Z + T5Y; + Cr[WS(csr, 21)] = FNMS(KP881921264, T62, T61); + Cr[WS(csr, 11)] = FMA(KP881921264, T62, T61); + } + { + E T65, T6c, T6h, T6k; + T65 = FMA(KP831469612, T64, T63); + T6c = T68 + T6b; + Cr[WS(csr, 29)] = FNMS(KP956940335, T6c, T65); + Cr[WS(csr, 3)] = FMA(KP956940335, T6c, T65); + T6h = FMA(KP831469612, T6e, T6d); + T6k = T6i - T6j; + Ci[WS(csi, 3)] = FMA(KP956940335, T6k, T6h); + Ci[WS(csi, 29)] = FMS(KP956940335, T6k, T6h); + } + { + E T6f, T6g, T6l, T6m; + T6f = FNMS(KP831469612, T6e, T6d); + T6g = T6b - T68; + Ci[WS(csi, 13)] = FMS(KP956940335, T6g, T6f); + Ci[WS(csi, 19)] = FMA(KP956940335, T6g, T6f); + T6l = FNMS(KP831469612, T64, T63); + T6m = T6i + T6j; + Cr[WS(csr, 19)] = FMA(KP956940335, T6m, T6l); + Cr[WS(csr, 13)] = FNMS(KP956940335, T6m, T6l); + } + } + { + E T3L, T55, T5f, T4T, T44, T5g, T5d, T5l, T4W, T56, T4q, T51, T5a, T5k, T4L; + E T50; + { + E T3U, T43, T4i, T4p; + T3L = FMA(KP923879532, T3K, T3D); + T55 = FNMS(KP923879532, T3K, T3D); + T5f = FNMS(KP923879532, T4S, T4P); + T4T = FMA(KP923879532, T4S, T4P); + T3U = FNMS(KP198912367, T3T, T3Q); + T43 = FMA(KP198912367, T42, T3Z); + T44 = T3U + T43; + T5g = T43 - T3U; + { + E T5b, T5c, T4U, T4V; + T5b = FNMS(KP923879532, T4C, T4v); + T5c = FNMS(KP923879532, T4J, T4G); + T5d = FMA(KP820678790, T5c, T5b); + T5l = FNMS(KP820678790, T5b, T5c); + T4U = FMA(KP198912367, T3Q, T3T); + T4V = FNMS(KP198912367, T3Z, T42); + T4W = T4U + T4V; + T56 = T4U - T4V; + } + T4i = FMA(KP923879532, T4h, T4a); + T4p = FMA(KP923879532, T4o, T4l); + T4q = FNMS(KP098491403, T4p, T4i); + T51 = FMA(KP098491403, T4i, T4p); + { + E T58, T59, T4D, T4K; + T58 = FNMS(KP923879532, T4h, T4a); + T59 = FNMS(KP923879532, T4o, T4l); + T5a = FMA(KP820678790, T59, T58); + T5k = FNMS(KP820678790, T58, T59); + T4D = FMA(KP923879532, T4C, T4v); + T4K = FMA(KP923879532, T4J, T4G); + T4L = FNMS(KP098491403, T4K, T4D); + T50 = FMA(KP098491403, T4D, T4K); + } + } + { + E T45, T4M, T4Z, T52; + T45 = FMA(KP980785280, T44, T3L); + T4M = T4q + T4L; + Cr[WS(csr, 31)] = FNMS(KP995184726, T4M, T45); + Cr[WS(csr, 1)] = FMA(KP995184726, T4M, T45); + T4Z = FMA(KP980785280, T4W, T4T); + T52 = T50 - T51; + Ci[WS(csi, 1)] = FMS(KP995184726, T52, T4Z); + Ci[WS(csi, 31)] = FMA(KP995184726, T52, T4Z); + } + { + E T4X, T4Y, T53, T54; + T4X = FNMS(KP980785280, T4W, T4T); + T4Y = T4L - T4q; + Ci[WS(csi, 15)] = FMA(KP995184726, T4Y, T4X); + Ci[WS(csi, 17)] = FMS(KP995184726, T4Y, T4X); + T53 = FNMS(KP980785280, T44, T3L); + T54 = T51 + T50; + Cr[WS(csr, 17)] = FNMS(KP995184726, T54, T53); + Cr[WS(csr, 15)] = FMA(KP995184726, T54, T53); + } + { + E T57, T5e, T5j, T5m; + T57 = FMA(KP980785280, T56, T55); + T5e = T5a + T5d; + Cr[WS(csr, 25)] = FNMS(KP773010453, T5e, T57); + Cr[WS(csr, 7)] = FMA(KP773010453, T5e, T57); + T5j = FMA(KP980785280, T5g, T5f); + T5m = T5k - T5l; + Ci[WS(csi, 7)] = FMA(KP773010453, T5m, T5j); + Ci[WS(csi, 25)] = FMS(KP773010453, T5m, T5j); + } + { + E T5h, T5i, T5n, T5o; + T5h = FNMS(KP980785280, T5g, T5f); + T5i = T5d - T5a; + Ci[WS(csi, 9)] = FMS(KP773010453, T5i, T5h); + Ci[WS(csi, 23)] = FMA(KP773010453, T5i, T5h); + T5n = FNMS(KP980785280, T56, T55); + T5o = T5k + T5l; + Cr[WS(csr, 23)] = FMA(KP773010453, T5o, T5n); + Cr[WS(csr, 9)] = FNMS(KP773010453, T5o, T5n); + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cf_64", {198, 0, 196, 0}, &GENUS }; + +void X(codelet_r2cf_64) (planner *p) { + X(kr2c_register) (p, r2cf_64, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 64 -name r2cf_64 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 394 FP additions, 124 FP multiplications, + * (or, 342 additions, 72 multiplications, 52 fused multiply/add), + * 106 stack variables, 15 constants, and 128 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_64(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP773010453, +0.773010453362736960810906609758469800971041293); + DK(KP634393284, +0.634393284163645498215171613225493370675687095); + DK(KP098017140, +0.098017140329560601994195563888641845861136673); + DK(KP995184726, +0.995184726672196886244836953109479921575474869); + DK(KP290284677, +0.290284677254462367636192375817395274691476278); + DK(KP956940335, +0.956940335732208864935797886980269969482849206); + DK(KP471396736, +0.471396736825997648556387625905254377657460319); + DK(KP881921264, +0.881921264348355029712756863660388349508442621); + DK(KP195090322, +0.195090322016128267848284868477022240927691618); + DK(KP980785280, +0.980785280403230449126182236134239036973933731); + DK(KP555570233, +0.555570233019602224742830813948532874374937191); + DK(KP831469612, +0.831469612302545237078788377617905756738560812); + DK(KP382683432, +0.382683432365089771728459984030398866761344562); + DK(KP923879532, +0.923879532511286756128183189396788286822416626); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(256, rs), MAKE_VOLATILE_STRIDE(256, csr), MAKE_VOLATILE_STRIDE(256, csi)) { + E T4l, T5a, T15, T3n, T2T, T3Q, T7, Te, Tf, T4A, T4L, T1X, T3B, T23, T3y; + E T5I, T66, T4R, T52, T2j, T3F, T2H, T3I, T5P, T69, T1i, T3t, T1l, T3u, TZ; + E T63, T4v, T58, T1r, T3r, T1u, T3q, TK, T62, T4s, T57, Tm, Tt, Tu, T4o; + E T5b, T1c, T3R, T2Q, T3o, T1M, T3z, T5L, T67, T26, T3C, T4H, T4M, T2y, T3J; + E T5S, T6a, T2C, T3G, T4Y, T53; + { + E T3, T11, Td, T13, T6, T2S, Ta, T12, T14, T2R; + { + E T1, T2, Tb, Tc; + T1 = R0[0]; + T2 = R0[WS(rs, 16)]; + T3 = T1 + T2; + T11 = T1 - T2; + Tb = R0[WS(rs, 28)]; + Tc = R0[WS(rs, 12)]; + Td = Tb + Tc; + T13 = Tb - Tc; + } + { + E T4, T5, T8, T9; + T4 = R0[WS(rs, 8)]; + T5 = R0[WS(rs, 24)]; + T6 = T4 + T5; + T2S = T4 - T5; + T8 = R0[WS(rs, 4)]; + T9 = R0[WS(rs, 20)]; + Ta = T8 + T9; + T12 = T8 - T9; + } + T4l = T3 - T6; + T5a = Td - Ta; + T14 = KP707106781 * (T12 + T13); + T15 = T11 + T14; + T3n = T11 - T14; + T2R = KP707106781 * (T13 - T12); + T2T = T2R - T2S; + T3Q = T2S + T2R; + T7 = T3 + T6; + Te = Ta + Td; + Tf = T7 + Te; + } + { + E T1P, T4J, T21, T4y, T1S, T4K, T1W, T4z; + { + E T1N, T1O, T1Z, T20; + T1N = R1[WS(rs, 28)]; + T1O = R1[WS(rs, 12)]; + T1P = T1N - T1O; + T4J = T1N + T1O; + T1Z = R1[0]; + T20 = R1[WS(rs, 16)]; + T21 = T1Z - T20; + T4y = T1Z + T20; + } + { + E T1Q, T1R, T1U, T1V; + T1Q = R1[WS(rs, 4)]; + T1R = R1[WS(rs, 20)]; + T1S = T1Q - T1R; + T4K = T1Q + T1R; + T1U = R1[WS(rs, 8)]; + T1V = R1[WS(rs, 24)]; + T1W = T1U - T1V; + T4z = T1U + T1V; + } + T4A = T4y - T4z; + T4L = T4J - T4K; + { + E T1T, T22, T5G, T5H; + T1T = KP707106781 * (T1P - T1S); + T1X = T1T - T1W; + T3B = T1W + T1T; + T22 = KP707106781 * (T1S + T1P); + T23 = T21 + T22; + T3y = T21 - T22; + T5G = T4y + T4z; + T5H = T4K + T4J; + T5I = T5G + T5H; + T66 = T5G - T5H; + } + } + { + E T2b, T4P, T2G, T4Q, T2e, T51, T2h, T50; + { + E T29, T2a, T2E, T2F; + T29 = R1[WS(rs, 31)]; + T2a = R1[WS(rs, 15)]; + T2b = T29 - T2a; + T4P = T29 + T2a; + T2E = R1[WS(rs, 7)]; + T2F = R1[WS(rs, 23)]; + T2G = T2E - T2F; + T4Q = T2E + T2F; + } + { + E T2c, T2d, T2f, T2g; + T2c = R1[WS(rs, 3)]; + T2d = R1[WS(rs, 19)]; + T2e = T2c - T2d; + T51 = T2c + T2d; + T2f = R1[WS(rs, 27)]; + T2g = R1[WS(rs, 11)]; + T2h = T2f - T2g; + T50 = T2f + T2g; + } + T4R = T4P - T4Q; + T52 = T50 - T51; + { + E T2i, T2D, T5N, T5O; + T2i = KP707106781 * (T2e + T2h); + T2j = T2b + T2i; + T3F = T2b - T2i; + T2D = KP707106781 * (T2h - T2e); + T2H = T2D - T2G; + T3I = T2G + T2D; + T5N = T4P + T4Q; + T5O = T51 + T50; + T5P = T5N + T5O; + T69 = T5N - T5O; + } + } + { + E TN, T1e, TX, T1g, TQ, T1k, TU, T1f, T1h, T1j; + { + E TL, TM, TV, TW; + TL = R0[WS(rs, 31)]; + TM = R0[WS(rs, 15)]; + TN = TL + TM; + T1e = TL - TM; + TV = R0[WS(rs, 27)]; + TW = R0[WS(rs, 11)]; + TX = TV + TW; + T1g = TV - TW; + } + { + E TO, TP, TS, TT; + TO = R0[WS(rs, 7)]; + TP = R0[WS(rs, 23)]; + TQ = TO + TP; + T1k = TO - TP; + TS = R0[WS(rs, 3)]; + TT = R0[WS(rs, 19)]; + TU = TS + TT; + T1f = TS - TT; + } + T1h = KP707106781 * (T1f + T1g); + T1i = T1e + T1h; + T3t = T1e - T1h; + T1j = KP707106781 * (T1g - T1f); + T1l = T1j - T1k; + T3u = T1k + T1j; + { + E TR, TY, T4t, T4u; + TR = TN + TQ; + TY = TU + TX; + TZ = TR + TY; + T63 = TR - TY; + T4t = TN - TQ; + T4u = TX - TU; + T4v = FNMS(KP382683432, T4u, KP923879532 * T4t); + T58 = FMA(KP382683432, T4t, KP923879532 * T4u); + } + } + { + E Ty, T1s, TI, T1n, TB, T1q, TF, T1o, T1p, T1t; + { + E Tw, Tx, TG, TH; + Tw = R0[WS(rs, 1)]; + Tx = R0[WS(rs, 17)]; + Ty = Tw + Tx; + T1s = Tw - Tx; + TG = R0[WS(rs, 29)]; + TH = R0[WS(rs, 13)]; + TI = TG + TH; + T1n = TG - TH; + } + { + E Tz, TA, TD, TE; + Tz = R0[WS(rs, 9)]; + TA = R0[WS(rs, 25)]; + TB = Tz + TA; + T1q = Tz - TA; + TD = R0[WS(rs, 5)]; + TE = R0[WS(rs, 21)]; + TF = TD + TE; + T1o = TD - TE; + } + T1p = KP707106781 * (T1n - T1o); + T1r = T1p - T1q; + T3r = T1q + T1p; + T1t = KP707106781 * (T1o + T1n); + T1u = T1s + T1t; + T3q = T1s - T1t; + { + E TC, TJ, T4q, T4r; + TC = Ty + TB; + TJ = TF + TI; + TK = TC + TJ; + T62 = TC - TJ; + T4q = Ty - TB; + T4r = TI - TF; + T4s = FMA(KP923879532, T4q, KP382683432 * T4r); + T57 = FNMS(KP382683432, T4q, KP923879532 * T4r); + } + } + { + E Ti, T16, Ts, T1a, Tl, T17, Tp, T19, T4m, T4n; + { + E Tg, Th, Tq, Tr; + Tg = R0[WS(rs, 2)]; + Th = R0[WS(rs, 18)]; + Ti = Tg + Th; + T16 = Tg - Th; + Tq = R0[WS(rs, 6)]; + Tr = R0[WS(rs, 22)]; + Ts = Tq + Tr; + T1a = Tq - Tr; + } + { + E Tj, Tk, Tn, To; + Tj = R0[WS(rs, 10)]; + Tk = R0[WS(rs, 26)]; + Tl = Tj + Tk; + T17 = Tj - Tk; + Tn = R0[WS(rs, 30)]; + To = R0[WS(rs, 14)]; + Tp = Tn + To; + T19 = Tn - To; + } + Tm = Ti + Tl; + Tt = Tp + Ts; + Tu = Tm + Tt; + T4m = Ti - Tl; + T4n = Tp - Ts; + T4o = KP707106781 * (T4m + T4n); + T5b = KP707106781 * (T4n - T4m); + { + E T18, T1b, T2O, T2P; + T18 = FNMS(KP382683432, T17, KP923879532 * T16); + T1b = FMA(KP923879532, T19, KP382683432 * T1a); + T1c = T18 + T1b; + T3R = T1b - T18; + T2O = FNMS(KP923879532, T1a, KP382683432 * T19); + T2P = FMA(KP382683432, T16, KP923879532 * T17); + T2Q = T2O - T2P; + T3o = T2P + T2O; + } + } + { + E T1A, T4E, T1K, T4C, T1D, T4F, T1H, T4B; + { + E T1y, T1z, T1I, T1J; + T1y = R1[WS(rs, 30)]; + T1z = R1[WS(rs, 14)]; + T1A = T1y - T1z; + T4E = T1y + T1z; + T1I = R1[WS(rs, 10)]; + T1J = R1[WS(rs, 26)]; + T1K = T1I - T1J; + T4C = T1I + T1J; + } + { + E T1B, T1C, T1F, T1G; + T1B = R1[WS(rs, 6)]; + T1C = R1[WS(rs, 22)]; + T1D = T1B - T1C; + T4F = T1B + T1C; + T1F = R1[WS(rs, 2)]; + T1G = R1[WS(rs, 18)]; + T1H = T1F - T1G; + T4B = T1F + T1G; + } + { + E T1E, T1L, T5J, T5K; + T1E = FNMS(KP923879532, T1D, KP382683432 * T1A); + T1L = FMA(KP382683432, T1H, KP923879532 * T1K); + T1M = T1E - T1L; + T3z = T1L + T1E; + T5J = T4B + T4C; + T5K = T4E + T4F; + T5L = T5J + T5K; + T67 = T5K - T5J; + } + { + E T24, T25, T4D, T4G; + T24 = FNMS(KP382683432, T1K, KP923879532 * T1H); + T25 = FMA(KP923879532, T1A, KP382683432 * T1D); + T26 = T24 + T25; + T3C = T25 - T24; + T4D = T4B - T4C; + T4G = T4E - T4F; + T4H = KP707106781 * (T4D + T4G); + T4M = KP707106781 * (T4G - T4D); + } + } + { + E T2m, T4S, T2w, T4W, T2p, T4T, T2t, T4V; + { + E T2k, T2l, T2u, T2v; + T2k = R1[WS(rs, 1)]; + T2l = R1[WS(rs, 17)]; + T2m = T2k - T2l; + T4S = T2k + T2l; + T2u = R1[WS(rs, 5)]; + T2v = R1[WS(rs, 21)]; + T2w = T2u - T2v; + T4W = T2u + T2v; + } + { + E T2n, T2o, T2r, T2s; + T2n = R1[WS(rs, 9)]; + T2o = R1[WS(rs, 25)]; + T2p = T2n - T2o; + T4T = T2n + T2o; + T2r = R1[WS(rs, 29)]; + T2s = R1[WS(rs, 13)]; + T2t = T2r - T2s; + T4V = T2r + T2s; + } + { + E T2q, T2x, T5Q, T5R; + T2q = FNMS(KP382683432, T2p, KP923879532 * T2m); + T2x = FMA(KP923879532, T2t, KP382683432 * T2w); + T2y = T2q + T2x; + T3J = T2x - T2q; + T5Q = T4S + T4T; + T5R = T4V + T4W; + T5S = T5Q + T5R; + T6a = T5R - T5Q; + } + { + E T2A, T2B, T4U, T4X; + T2A = FNMS(KP923879532, T2w, KP382683432 * T2t); + T2B = FMA(KP382683432, T2m, KP923879532 * T2p); + T2C = T2A - T2B; + T3G = T2B + T2A; + T4U = T4S - T4T; + T4X = T4V - T4W; + T4Y = KP707106781 * (T4U + T4X); + T53 = KP707106781 * (T4X - T4U); + } + } + { + E Tv, T10, T5X, T5Y, T5Z, T60; + Tv = Tf + Tu; + T10 = TK + TZ; + T5X = Tv + T10; + T5Y = T5I + T5L; + T5Z = T5P + T5S; + T60 = T5Y + T5Z; + Cr[WS(csr, 16)] = Tv - T10; + Ci[WS(csi, 16)] = T5Z - T5Y; + Cr[WS(csr, 32)] = T5X - T60; + Cr[0] = T5X + T60; + } + { + E T5F, T5V, T5U, T5W, T5M, T5T; + T5F = Tf - Tu; + T5V = TZ - TK; + T5M = T5I - T5L; + T5T = T5P - T5S; + T5U = KP707106781 * (T5M + T5T); + T5W = KP707106781 * (T5T - T5M); + Cr[WS(csr, 24)] = T5F - T5U; + Ci[WS(csi, 24)] = T5W - T5V; + Cr[WS(csr, 8)] = T5F + T5U; + Ci[WS(csi, 8)] = T5V + T5W; + } + { + E T65, T6l, T6k, T6m, T6c, T6g, T6f, T6h; + { + E T61, T64, T6i, T6j; + T61 = T7 - Te; + T64 = KP707106781 * (T62 + T63); + T65 = T61 + T64; + T6l = T61 - T64; + T6i = FNMS(KP382683432, T66, KP923879532 * T67); + T6j = FMA(KP382683432, T69, KP923879532 * T6a); + T6k = T6i + T6j; + T6m = T6j - T6i; + } + { + E T68, T6b, T6d, T6e; + T68 = FMA(KP923879532, T66, KP382683432 * T67); + T6b = FNMS(KP382683432, T6a, KP923879532 * T69); + T6c = T68 + T6b; + T6g = T6b - T68; + T6d = KP707106781 * (T63 - T62); + T6e = Tt - Tm; + T6f = T6d - T6e; + T6h = T6e + T6d; + } + Cr[WS(csr, 28)] = T65 - T6c; + Ci[WS(csi, 28)] = T6k - T6h; + Cr[WS(csr, 4)] = T65 + T6c; + Ci[WS(csi, 4)] = T6h + T6k; + Ci[WS(csi, 12)] = T6f + T6g; + Cr[WS(csr, 12)] = T6l + T6m; + Ci[WS(csi, 20)] = T6g - T6f; + Cr[WS(csr, 20)] = T6l - T6m; + } + { + E T5n, T5D, T5x, T5z, T5q, T5A, T5t, T5B; + { + E T5l, T5m, T5v, T5w; + T5l = T4l - T4o; + T5m = T58 - T57; + T5n = T5l + T5m; + T5D = T5l - T5m; + T5v = T4v - T4s; + T5w = T5b - T5a; + T5x = T5v - T5w; + T5z = T5w + T5v; + } + { + E T5o, T5p, T5r, T5s; + T5o = T4A - T4H; + T5p = T4M - T4L; + T5q = FMA(KP831469612, T5o, KP555570233 * T5p); + T5A = FNMS(KP555570233, T5o, KP831469612 * T5p); + T5r = T4R - T4Y; + T5s = T53 - T52; + T5t = FNMS(KP555570233, T5s, KP831469612 * T5r); + T5B = FMA(KP555570233, T5r, KP831469612 * T5s); + } + { + E T5u, T5C, T5y, T5E; + T5u = T5q + T5t; + Cr[WS(csr, 26)] = T5n - T5u; + Cr[WS(csr, 6)] = T5n + T5u; + T5C = T5A + T5B; + Ci[WS(csi, 6)] = T5z + T5C; + Ci[WS(csi, 26)] = T5C - T5z; + T5y = T5t - T5q; + Ci[WS(csi, 10)] = T5x + T5y; + Ci[WS(csi, 22)] = T5y - T5x; + T5E = T5B - T5A; + Cr[WS(csr, 22)] = T5D - T5E; + Cr[WS(csr, 10)] = T5D + T5E; + } + } + { + E T4x, T5j, T5d, T5f, T4O, T5g, T55, T5h; + { + E T4p, T4w, T59, T5c; + T4p = T4l + T4o; + T4w = T4s + T4v; + T4x = T4p + T4w; + T5j = T4p - T4w; + T59 = T57 + T58; + T5c = T5a + T5b; + T5d = T59 - T5c; + T5f = T5c + T59; + } + { + E T4I, T4N, T4Z, T54; + T4I = T4A + T4H; + T4N = T4L + T4M; + T4O = FMA(KP980785280, T4I, KP195090322 * T4N); + T5g = FNMS(KP195090322, T4I, KP980785280 * T4N); + T4Z = T4R + T4Y; + T54 = T52 + T53; + T55 = FNMS(KP195090322, T54, KP980785280 * T4Z); + T5h = FMA(KP195090322, T4Z, KP980785280 * T54); + } + { + E T56, T5i, T5e, T5k; + T56 = T4O + T55; + Cr[WS(csr, 30)] = T4x - T56; + Cr[WS(csr, 2)] = T4x + T56; + T5i = T5g + T5h; + Ci[WS(csi, 2)] = T5f + T5i; + Ci[WS(csi, 30)] = T5i - T5f; + T5e = T55 - T4O; + Ci[WS(csi, 14)] = T5d + T5e; + Ci[WS(csi, 18)] = T5e - T5d; + T5k = T5h - T5g; + Cr[WS(csr, 18)] = T5j - T5k; + Cr[WS(csr, 14)] = T5j + T5k; + } + } + { + E T3p, T41, T4c, T3S, T3w, T4b, T49, T4h, T3P, T42, T3E, T3W, T46, T4g, T3L; + E T3X; + { + E T3s, T3v, T3A, T3D; + T3p = T3n + T3o; + T41 = T3n - T3o; + T4c = T3R - T3Q; + T3S = T3Q + T3R; + T3s = FMA(KP831469612, T3q, KP555570233 * T3r); + T3v = FNMS(KP555570233, T3u, KP831469612 * T3t); + T3w = T3s + T3v; + T4b = T3v - T3s; + { + E T47, T48, T3N, T3O; + T47 = T3F - T3G; + T48 = T3J - T3I; + T49 = FNMS(KP471396736, T48, KP881921264 * T47); + T4h = FMA(KP471396736, T47, KP881921264 * T48); + T3N = FNMS(KP555570233, T3q, KP831469612 * T3r); + T3O = FMA(KP555570233, T3t, KP831469612 * T3u); + T3P = T3N + T3O; + T42 = T3O - T3N; + } + T3A = T3y + T3z; + T3D = T3B + T3C; + T3E = FMA(KP956940335, T3A, KP290284677 * T3D); + T3W = FNMS(KP290284677, T3A, KP956940335 * T3D); + { + E T44, T45, T3H, T3K; + T44 = T3y - T3z; + T45 = T3C - T3B; + T46 = FMA(KP881921264, T44, KP471396736 * T45); + T4g = FNMS(KP471396736, T44, KP881921264 * T45); + T3H = T3F + T3G; + T3K = T3I + T3J; + T3L = FNMS(KP290284677, T3K, KP956940335 * T3H); + T3X = FMA(KP290284677, T3H, KP956940335 * T3K); + } + } + { + E T3x, T3M, T3V, T3Y; + T3x = T3p + T3w; + T3M = T3E + T3L; + Cr[WS(csr, 29)] = T3x - T3M; + Cr[WS(csr, 3)] = T3x + T3M; + T3V = T3S + T3P; + T3Y = T3W + T3X; + Ci[WS(csi, 3)] = T3V + T3Y; + Ci[WS(csi, 29)] = T3Y - T3V; + } + { + E T3T, T3U, T3Z, T40; + T3T = T3P - T3S; + T3U = T3L - T3E; + Ci[WS(csi, 13)] = T3T + T3U; + Ci[WS(csi, 19)] = T3U - T3T; + T3Z = T3p - T3w; + T40 = T3X - T3W; + Cr[WS(csr, 19)] = T3Z - T40; + Cr[WS(csr, 13)] = T3Z + T40; + } + { + E T43, T4a, T4f, T4i; + T43 = T41 + T42; + T4a = T46 + T49; + Cr[WS(csr, 27)] = T43 - T4a; + Cr[WS(csr, 5)] = T43 + T4a; + T4f = T4c + T4b; + T4i = T4g + T4h; + Ci[WS(csi, 5)] = T4f + T4i; + Ci[WS(csi, 27)] = T4i - T4f; + } + { + E T4d, T4e, T4j, T4k; + T4d = T4b - T4c; + T4e = T49 - T46; + Ci[WS(csi, 11)] = T4d + T4e; + Ci[WS(csi, 21)] = T4e - T4d; + T4j = T41 - T42; + T4k = T4h - T4g; + Cr[WS(csr, 21)] = T4j - T4k; + Cr[WS(csr, 11)] = T4j + T4k; + } + } + { + E T1d, T33, T3e, T2U, T1w, T3d, T3b, T3j, T2N, T34, T28, T2Y, T38, T3i, T2J; + E T2Z; + { + E T1m, T1v, T1Y, T27; + T1d = T15 - T1c; + T33 = T15 + T1c; + T3e = T2T + T2Q; + T2U = T2Q - T2T; + T1m = FMA(KP195090322, T1i, KP980785280 * T1l); + T1v = FNMS(KP195090322, T1u, KP980785280 * T1r); + T1w = T1m - T1v; + T3d = T1v + T1m; + { + E T39, T3a, T2L, T2M; + T39 = T2j + T2y; + T3a = T2H + T2C; + T3b = FNMS(KP098017140, T3a, KP995184726 * T39); + T3j = FMA(KP995184726, T3a, KP098017140 * T39); + T2L = FNMS(KP195090322, T1l, KP980785280 * T1i); + T2M = FMA(KP980785280, T1u, KP195090322 * T1r); + T2N = T2L - T2M; + T34 = T2M + T2L; + } + T1Y = T1M - T1X; + T27 = T23 - T26; + T28 = FMA(KP634393284, T1Y, KP773010453 * T27); + T2Y = FNMS(KP634393284, T27, KP773010453 * T1Y); + { + E T36, T37, T2z, T2I; + T36 = T1X + T1M; + T37 = T23 + T26; + T38 = FMA(KP098017140, T36, KP995184726 * T37); + T3i = FNMS(KP098017140, T37, KP995184726 * T36); + T2z = T2j - T2y; + T2I = T2C - T2H; + T2J = FNMS(KP634393284, T2I, KP773010453 * T2z); + T2Z = FMA(KP773010453, T2I, KP634393284 * T2z); + } + } + { + E T1x, T2K, T2X, T30; + T1x = T1d + T1w; + T2K = T28 + T2J; + Cr[WS(csr, 25)] = T1x - T2K; + Cr[WS(csr, 7)] = T1x + T2K; + T2X = T2U + T2N; + T30 = T2Y + T2Z; + Ci[WS(csi, 7)] = T2X + T30; + Ci[WS(csi, 25)] = T30 - T2X; + } + { + E T2V, T2W, T31, T32; + T2V = T2N - T2U; + T2W = T2J - T28; + Ci[WS(csi, 9)] = T2V + T2W; + Ci[WS(csi, 23)] = T2W - T2V; + T31 = T1d - T1w; + T32 = T2Z - T2Y; + Cr[WS(csr, 23)] = T31 - T32; + Cr[WS(csr, 9)] = T31 + T32; + } + { + E T35, T3c, T3h, T3k; + T35 = T33 + T34; + T3c = T38 + T3b; + Cr[WS(csr, 31)] = T35 - T3c; + Cr[WS(csr, 1)] = T35 + T3c; + T3h = T3e + T3d; + T3k = T3i + T3j; + Ci[WS(csi, 1)] = T3h + T3k; + Ci[WS(csi, 31)] = T3k - T3h; + } + { + E T3f, T3g, T3l, T3m; + T3f = T3d - T3e; + T3g = T3b - T38; + Ci[WS(csi, 15)] = T3f + T3g; + Ci[WS(csi, 17)] = T3g - T3f; + T3l = T33 - T34; + T3m = T3j - T3i; + Cr[WS(csr, 17)] = T3l - T3m; + Cr[WS(csr, 15)] = T3l + T3m; + } + } + } + } +} + +static const kr2c_desc desc = { 64, "r2cf_64", {342, 72, 52, 0}, &GENUS }; + +void X(codelet_r2cf_64) (planner *p) { + X(kr2c_register) (p, r2cf_64, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_7.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_7.c new file mode 100644 index 000000000..57fe76e86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_7.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 7 -name r2cf_7 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 24 FP additions, 18 FP multiplications, + * (or, 9 additions, 3 multiplications, 15 fused multiply/add), + * 23 stack variables, 6 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP801937735, +0.801937735804838252472204639014890102331838324); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + DK(KP554958132, +0.554958132087371191422194871006410481067288862); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP692021471, +0.692021471630095869627814897002069140197260599); + DK(KP356895867, +0.356895867892209443894399510021300583399127187); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T1, T4, Ta, T7, Tb, Td, Tj, Ti, Th, Tf; + T1 = R0[0]; + { + E T2, T3, T8, T9, T5, T6; + T2 = R1[0]; + T3 = R0[WS(rs, 3)]; + T4 = T2 + T3; + T8 = R1[WS(rs, 1)]; + T9 = R0[WS(rs, 2)]; + Ta = T8 + T9; + T5 = R0[WS(rs, 1)]; + T6 = R1[WS(rs, 2)]; + T7 = T5 + T6; + Tb = FNMS(KP356895867, Ta, T7); + Td = FNMS(KP356895867, T4, Ta); + Tj = T6 - T5; + Ti = T9 - T8; + Th = T3 - T2; + Tf = FNMS(KP356895867, T7, T4); + } + { + E Tc, Tm, Te, Tk, Tg, Tl; + Tc = FNMS(KP692021471, Tb, T4); + Cr[WS(csr, 3)] = FNMS(KP900968867, Tc, T1); + Tm = FNMS(KP554958132, Th, Tj); + Ci[WS(csi, 3)] = KP974927912 * (FNMS(KP801937735, Tm, Ti)); + Te = FNMS(KP692021471, Td, T7); + Cr[WS(csr, 2)] = FNMS(KP900968867, Te, T1); + Tk = FMA(KP554958132, Tj, Ti); + Ci[WS(csi, 2)] = KP974927912 * (FNMS(KP801937735, Tk, Th)); + Cr[0] = T1 + T4 + T7 + Ta; + Tg = FNMS(KP692021471, Tf, Ta); + Cr[WS(csr, 1)] = FNMS(KP900968867, Tg, T1); + Tl = FMA(KP554958132, Ti, Th); + Ci[WS(csi, 1)] = KP974927912 * (FMA(KP801937735, Tl, Tj)); + } + } + } +} + +static const kr2c_desc desc = { 7, "r2cf_7", {9, 3, 15, 0}, &GENUS }; + +void X(codelet_r2cf_7) (planner *p) { + X(kr2c_register) (p, r2cf_7, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 7 -name r2cf_7 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 24 FP additions, 18 FP multiplications, + * (or, 12 additions, 6 multiplications, 12 fused multiply/add), + * 20 stack variables, 6 constants, and 14 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_7(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP222520933, +0.222520933956314404288902564496794759466355569); + DK(KP900968867, +0.900968867902419126236102319507445051165919162); + DK(KP623489801, +0.623489801858733530525004884004239810632274731); + DK(KP433883739, +0.433883739117558120475768332848358754609990728); + DK(KP781831482, +0.781831482468029808708444526674057750232334519); + DK(KP974927912, +0.974927912181823607018131682993931217232785801); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(28, rs), MAKE_VOLATILE_STRIDE(28, csr), MAKE_VOLATILE_STRIDE(28, csi)) { + E T1, Ta, Tb, T4, Td, T7, Tc, T8, T9; + T1 = R0[0]; + T8 = R1[0]; + T9 = R0[WS(rs, 3)]; + Ta = T8 + T9; + Tb = T9 - T8; + { + E T2, T3, T5, T6; + T2 = R0[WS(rs, 1)]; + T3 = R1[WS(rs, 2)]; + T4 = T2 + T3; + Td = T3 - T2; + T5 = R1[WS(rs, 1)]; + T6 = R0[WS(rs, 2)]; + T7 = T5 + T6; + Tc = T6 - T5; + } + Ci[WS(csi, 2)] = FNMS(KP781831482, Tc, KP974927912 * Tb) - (KP433883739 * Td); + Ci[WS(csi, 1)] = FMA(KP781831482, Tb, KP974927912 * Td) + (KP433883739 * Tc); + Cr[WS(csr, 2)] = FMA(KP623489801, T7, T1) + FNMA(KP900968867, T4, KP222520933 * Ta); + Ci[WS(csi, 3)] = FMA(KP433883739, Tb, KP974927912 * Tc) - (KP781831482 * Td); + Cr[WS(csr, 3)] = FMA(KP623489801, T4, T1) + FNMA(KP222520933, T7, KP900968867 * Ta); + Cr[WS(csr, 1)] = FMA(KP623489801, Ta, T1) + FNMA(KP900968867, T7, KP222520933 * T4); + Cr[0] = T1 + Ta + T4 + T7; + } + } +} + +static const kr2c_desc desc = { 7, "r2cf_7", {12, 6, 12, 0}, &GENUS }; + +void X(codelet_r2cf_7) (planner *p) { + X(kr2c_register) (p, r2cf_7, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_8.c new file mode 100644 index 000000000..a195cc229 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_8.c @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 8 -name r2cf_8 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 20 FP additions, 4 FP multiplications, + * (or, 16 additions, 0 multiplications, 4 fused multiply/add), + * 14 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T3, T7, Td, Tj, T6, Tf, Ta, Ti; + { + E T1, T2, Tb, Tc; + T1 = R0[0]; + T2 = R0[WS(rs, 2)]; + T3 = T1 + T2; + T7 = T1 - T2; + Tb = R1[WS(rs, 3)]; + Tc = R1[WS(rs, 1)]; + Td = Tb - Tc; + Tj = Tb + Tc; + } + { + E T4, T5, T8, T9; + T4 = R0[WS(rs, 1)]; + T5 = R0[WS(rs, 3)]; + T6 = T4 + T5; + Tf = T4 - T5; + T8 = R1[0]; + T9 = R1[WS(rs, 2)]; + Ta = T8 - T9; + Ti = T8 + T9; + } + Cr[WS(csr, 2)] = T3 - T6; + Ci[WS(csi, 2)] = Tj - Ti; + { + E Te, Tg, Th, Tk; + Te = Ta + Td; + Cr[WS(csr, 3)] = FNMS(KP707106781, Te, T7); + Cr[WS(csr, 1)] = FMA(KP707106781, Te, T7); + Tg = Td - Ta; + Ci[WS(csi, 1)] = FMS(KP707106781, Tg, Tf); + Ci[WS(csi, 3)] = FMA(KP707106781, Tg, Tf); + Th = T3 + T6; + Tk = Ti + Tj; + Cr[WS(csr, 4)] = Th - Tk; + Cr[0] = Th + Tk; + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cf_8", {16, 0, 4, 0}, &GENUS }; + +void X(codelet_r2cf_8) (planner *p) { + X(kr2c_register) (p, r2cf_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 8 -name r2cf_8 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 20 FP additions, 2 FP multiplications, + * (or, 20 additions, 2 multiplications, 0 fused multiply/add), + * 14 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_8(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(32, rs), MAKE_VOLATILE_STRIDE(32, csr), MAKE_VOLATILE_STRIDE(32, csi)) { + E T3, T7, Td, Tj, T6, Tg, Ta, Ti; + { + E T1, T2, Tb, Tc; + T1 = R0[0]; + T2 = R0[WS(rs, 2)]; + T3 = T1 + T2; + T7 = T1 - T2; + Tb = R1[WS(rs, 3)]; + Tc = R1[WS(rs, 1)]; + Td = Tb - Tc; + Tj = Tb + Tc; + } + { + E T4, T5, T8, T9; + T4 = R0[WS(rs, 1)]; + T5 = R0[WS(rs, 3)]; + T6 = T4 + T5; + Tg = T4 - T5; + T8 = R1[0]; + T9 = R1[WS(rs, 2)]; + Ta = T8 - T9; + Ti = T8 + T9; + } + Cr[WS(csr, 2)] = T3 - T6; + Ci[WS(csi, 2)] = Tj - Ti; + { + E Te, Tf, Th, Tk; + Te = KP707106781 * (Ta + Td); + Cr[WS(csr, 3)] = T7 - Te; + Cr[WS(csr, 1)] = T7 + Te; + Tf = KP707106781 * (Td - Ta); + Ci[WS(csi, 1)] = Tf - Tg; + Ci[WS(csi, 3)] = Tg + Tf; + Th = T3 + T6; + Tk = Ti + Tj; + Cr[WS(csr, 4)] = Th - Tk; + Cr[0] = Th + Tk; + } + } + } +} + +static const kr2c_desc desc = { 8, "r2cf_8", {20, 2, 0, 0}, &GENUS }; + +void X(codelet_r2cf_8) (planner *p) { + X(kr2c_register) (p, r2cf_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_9.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_9.c new file mode 100644 index 000000000..d16b5040a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cf/r2cf_9.c @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:06:26 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2cf.native -fma -compact -variables 4 -pipeline-latency 4 -n 9 -name r2cf_9 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 38 FP additions, 30 FP multiplications, + * (or, 12 additions, 4 multiplications, 26 fused multiply/add), + * 48 stack variables, 18 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP907603734, +0.907603734547952313649323976213898122064543220); + DK(KP347296355, +0.347296355333860697703433253538629592000751354); + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP666666666, +0.666666666666666666666666666666666666666666667); + DK(KP898197570, +0.898197570222573798468955502359086394667167570); + DK(KP673648177, +0.673648177666930348851716626769314796000375677); + DK(KP879385241, +0.879385241571816768108218554649462939872416269); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP394930843, +0.394930843634698457567117349190734585290304520); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP586256827, +0.586256827714544512072145703099641959914944179); + DK(KP726681596, +0.726681596905677465811651808188092531873167623); + DK(KP968908795, +0.968908795874236621082202410917456709164223497); + DK(KP203604859, +0.203604859554852403062088995281827210665664861); + DK(KP152703644, +0.152703644666139302296566746461370407999248646); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + DK(KP184792530, +0.184792530904095372701352047572203755870913560); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T1, T4, To, Tk, Ta, Tu, Tf, Th, Tj, Tx, Tl, Tm, Ty, Tq, T2; + E T3, T5, Tg; + T1 = R0[0]; + T2 = R1[WS(rs, 1)]; + T3 = R0[WS(rs, 3)]; + T4 = T2 + T3; + To = T3 - T2; + { + E T6, Tb, T9, Te, Ti; + T6 = R1[0]; + Tb = R0[WS(rs, 1)]; + { + E T7, T8, Tc, Td; + T7 = R0[WS(rs, 2)]; + T8 = R1[WS(rs, 3)]; + T9 = T7 + T8; + Tk = T7 - T8; + Tc = R1[WS(rs, 2)]; + Td = R0[WS(rs, 4)]; + Te = Tc + Td; + Ti = Td - Tc; + } + Ta = T6 + T9; + Tu = FMA(KP184792530, Tk, Ti); + Tf = Tb + Te; + Th = FNMS(KP500000000, Te, Tb); + Tj = FNMS(KP152703644, Ti, Th); + Tx = FMA(KP203604859, Th, Ti); + Tl = FMS(KP500000000, T9, T6); + Tm = FNMS(KP968908795, Tl, Tk); + Ty = FMA(KP726681596, Tk, Tl); + Tq = FMA(KP586256827, Tl, Ti); + } + Ci[WS(csi, 3)] = KP866025403 * (Tf - Ta); + T5 = T1 + T4; + Tg = Ta + Tf; + Cr[WS(csr, 3)] = FNMS(KP500000000, Tg, T5); + Cr[0] = T5 + Tg; + { + E Tv, Tt, Tn, TC, TB; + Tt = FMA(KP394930843, Th, To); + Tv = FNMS(KP939692620, Tu, Tt); + Ci[WS(csi, 2)] = KP984807753 * (FNMS(KP879385241, Tv, Tl)); + Tn = FMA(KP673648177, Tm, Tj); + TB = FMA(KP898197570, Ty, Tx); + TC = FMA(KP666666666, Tn, TB); + Ci[WS(csi, 1)] = -(KP984807753 * (FNMS(KP879385241, To, Tn))); + Ci[WS(csi, 4)] = KP866025403 * (FMA(KP852868531, TC, To)); + { + E Tp, Ts, Tz, TA, Tr, Tw; + Tp = FNMS(KP500000000, T4, T1); + Tr = FNMS(KP347296355, Tq, Tk); + Ts = FNMS(KP907603734, Tr, Th); + Tw = FNMS(KP673648177, Tm, Tj); + Tz = FNMS(KP898197570, Ty, Tx); + TA = FNMS(KP500000000, Tz, Tw); + Cr[WS(csr, 2)] = FNMS(KP939692620, Ts, Tp); + Cr[WS(csr, 1)] = FMA(KP852868531, Tz, Tp); + Cr[WS(csr, 4)] = FMA(KP852868531, TA, Tp); + } + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cf_9", {12, 4, 26, 0}, &GENUS }; + +void X(codelet_r2cf_9) (planner *p) { + X(kr2c_register) (p, r2cf_9, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2cf.native -compact -variables 4 -pipeline-latency 4 -n 9 -name r2cf_9 -include rdft/scalar/r2cf.h */ + +/* + * This function contains 38 FP additions, 26 FP multiplications, + * (or, 21 additions, 9 multiplications, 17 fused multiply/add), + * 36 stack variables, 14 constants, and 18 memory accesses + */ +#include "rdft/scalar/r2cf.h" + +static void r2cf_9(R *R0, R *R1, R *Cr, R *Ci, stride rs, stride csr, stride csi, INT v, INT ivs, INT ovs) +{ + DK(KP939692620, +0.939692620785908384054109277324731469936208134); + DK(KP296198132, +0.296198132726023843175338011893050938967728390); + DK(KP342020143, +0.342020143325668733044099614682259580763083368); + DK(KP813797681, +0.813797681349373692844693217248393223289101568); + DK(KP984807753, +0.984807753012208059366743024589523013670643252); + DK(KP150383733, +0.150383733180435296639271897612501926072238258); + DK(KP642787609, +0.642787609686539326322643409907263432907559884); + DK(KP663413948, +0.663413948168938396205421319635891297216863310); + DK(KP852868531, +0.852868531952443209628250963940074071936020296); + DK(KP173648177, +0.173648177666930348851716626769314796000375677); + DK(KP556670399, +0.556670399226419366452912952047023132968291906); + DK(KP766044443, +0.766044443118978035202392650555416673935832457); + DK(KP866025403, +0.866025403784438646763723170752936183471402627); + DK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT i; + for (i = v; i > 0; i = i - 1, R0 = R0 + ivs, R1 = R1 + ivs, Cr = Cr + ovs, Ci = Ci + ovs, MAKE_VOLATILE_STRIDE(36, rs), MAKE_VOLATILE_STRIDE(36, csr), MAKE_VOLATILE_STRIDE(36, csi)) { + E T1, T4, Tr, Ta, Tl, Ti, Tf, Tk, Tj, T2, T3, T5, Tg; + T1 = R0[0]; + T2 = R1[WS(rs, 1)]; + T3 = R0[WS(rs, 3)]; + T4 = T2 + T3; + Tr = T3 - T2; + { + E T6, T7, T8, T9; + T6 = R1[0]; + T7 = R0[WS(rs, 2)]; + T8 = R1[WS(rs, 3)]; + T9 = T7 + T8; + Ta = T6 + T9; + Tl = T8 - T7; + Ti = FNMS(KP500000000, T9, T6); + } + { + E Tb, Tc, Td, Te; + Tb = R0[WS(rs, 1)]; + Tc = R1[WS(rs, 2)]; + Td = R0[WS(rs, 4)]; + Te = Tc + Td; + Tf = Tb + Te; + Tk = FNMS(KP500000000, Te, Tb); + Tj = Td - Tc; + } + Ci[WS(csi, 3)] = KP866025403 * (Tf - Ta); + T5 = T1 + T4; + Tg = Ta + Tf; + Cr[WS(csr, 3)] = FNMS(KP500000000, Tg, T5); + Cr[0] = T5 + Tg; + { + E Tt, Th, Tm, Tn, To, Tp, Tq, Ts; + Tt = KP866025403 * Tr; + Th = FNMS(KP500000000, T4, T1); + Tm = FMA(KP766044443, Ti, KP556670399 * Tl); + Tn = FMA(KP173648177, Tk, KP852868531 * Tj); + To = Tm + Tn; + Tp = FNMS(KP642787609, Ti, KP663413948 * Tl); + Tq = FNMS(KP984807753, Tk, KP150383733 * Tj); + Ts = Tp + Tq; + Cr[WS(csr, 1)] = Th + To; + Ci[WS(csi, 1)] = Tt + Ts; + Cr[WS(csr, 4)] = FMA(KP866025403, Tp - Tq, Th) - (KP500000000 * To); + Ci[WS(csi, 4)] = FNMS(KP500000000, Ts, KP866025403 * (Tr + (Tn - Tm))); + Ci[WS(csi, 2)] = FNMS(KP342020143, Tk, KP813797681 * Tj) + FNMA(KP150383733, Tl, KP984807753 * Ti) - Tt; + Cr[WS(csr, 2)] = FMA(KP173648177, Ti, Th) + FNMA(KP296198132, Tj, KP939692620 * Tk) - (KP852868531 * Tl); + } + } + } +} + +static const kr2c_desc desc = { 9, "r2cf_9", {21, 9, 17, 0}, &GENUS }; + +void X(codelet_r2cf_9) (planner *p) { + X(kr2c_register) (p, r2cf_9, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cfII.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cfII.h new file mode 100644 index 000000000..e13392d52 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2cfII.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_r2cfII_genus) +extern const kr2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r.c new file mode 100644 index 000000000..517f79196 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/codelet-rdft.h" +#include "rdft/scalar/r2r.h" + +const kr2r_genus GENUS = { 1 }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r.h new file mode 100644 index 000000000..0c822eb96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#define GENUS X(rdft_r2r_genus) +extern const kr2r_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/Makefile.am new file mode 100644 index 000000000..98ca4d2ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/Makefile.am @@ -0,0 +1,89 @@ +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = librdft_scalar_r2r.la + +########################################################################### +# The following lines specify the REDFT/RODFT/DHT sizes for which to generate +# specialized codelets. Currently, only REDFT01/10 of size 8 (used in JPEG). + +# e_ is a hard-coded REDFT FFT (DCT) of size +E00 = # e00_2.c e00_3.c e00_4.c e00_5.c e00_6.c e00_7.c e00_8.c +E01 = e01_8.c # e01_2.c e01_3.c e01_4.c e01_5.c e01_6.c e01_7.c +E10 = e10_8.c # e10_2.c e10_3.c e10_4.c e10_5.c e10_6.c e10_7.c +E11 = # e11_2.c e11_3.c e11_4.c e11_5.c e11_6.c e11_7.c e11_8.c + +# o_ is a hard-coded RODFT FFT (DST) of size +O00 = # o00_2.c o00_3.c o00_4.c o00_5.c o00_6.c o00_7.c o00_8.c +O01 = # o01_2.c o01_3.c o01_4.c o01_5.c o01_6.c o01_7.c o01_8.c +O10 = # o10_2.c o10_3.c o10_4.c o10_5.c o10_6.c o10_7.c o10_8.c +O11 = # o11_2.c o11_3.c o11_4.c o11_5.c o11_6.c o11_7.c o11_8.c + +# dht_ is a hard-coded DHT of size +DHT = # dht_2.c dht_3.c dht_4.c dht_5.c dht_6.c dht_7.c dht_8.c + +########################################################################### +ALL_CODELETS = $(E00) $(E01) $(E10) $(E11) $(O00) $(O01) $(O10) $(O11) $(DHT) + +BUILT_SOURCES= $(ALL_CODELETS) $(CODLIST) + +librdft_scalar_r2r_la_SOURCES = $(BUILT_SOURCES) + +SOLVTAB_NAME = X(solvtab_rdft_r2r) +XRENAME=X + +# special rules for regenerating codelets. +include $(top_srcdir)/support/Makefile.codelets + +if MAINTAINER_MODE +FLAGS_E00=$(RDFT_FLAGS_COMMON) +FLAGS_E01=$(RDFT_FLAGS_COMMON) +FLAGS_E10=$(RDFT_FLAGS_COMMON) +FLAGS_E11=$(RDFT_FLAGS_COMMON) +FLAGS_O00=$(RDFT_FLAGS_COMMON) +FLAGS_O01=$(RDFT_FLAGS_COMMON) +FLAGS_O10=$(RDFT_FLAGS_COMMON) +FLAGS_O11=$(RDFT_FLAGS_COMMON) +FLAGS_DHT=$(RDFT_FLAGS_COMMON) + +e00_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E00) -redft00 -n $* -name e00_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +e01_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E01) -redft01 -n $* -name e01_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +e10_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E10) -redft10 -n $* -name e10_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +e11_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E11) -redft11 -n $* -name e11_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + + +o00_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O00) -rodft00 -n $* -name o00_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +o01_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O01) -rodft01 -n $* -name o01_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +o10_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O10) -rodft10 -n $* -name o10_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +o11_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O11) -rodft11 -n $* -name o11_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + + +dht_%.c: $(CODELET_DEPS) $(GEN_R2R) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_DHT) -dht -sign 1 -n $* -name dht_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/Makefile.in new file mode 100644 index 000000000..65820cbef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/Makefile.in @@ -0,0 +1,791 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This Makefile.am specifies a set of codelets, efficient transforms +# of small sizes, that are used as building blocks (kernels) by FFTW +# to build up large transforms, as well as the options for generating +# and compiling them. + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/scalar/r2r +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_scalar_r2r_la_LIBADD = +am__objects_1 = +am__objects_2 = e01_8.lo +am__objects_3 = e10_8.lo +am__objects_4 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) \ + $(am__objects_1) $(am__objects_1) $(am__objects_1) +am__objects_5 = codlist.lo +am__objects_6 = $(am__objects_4) $(am__objects_5) +am_librdft_scalar_r2r_la_OBJECTS = $(am__objects_6) +librdft_scalar_r2r_la_OBJECTS = $(am_librdft_scalar_r2r_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_scalar_r2r_la_SOURCES) +DIST_SOURCES = $(librdft_scalar_r2r_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/support/Makefile.codelets +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +########################################################################### +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = librdft_scalar_r2r.la + +########################################################################### +# The following lines specify the REDFT/RODFT/DHT sizes for which to generate +# specialized codelets. Currently, only REDFT01/10 of size 8 (used in JPEG). + +# e_ is a hard-coded REDFT FFT (DCT) of size +E00 = # e00_2.c e00_3.c e00_4.c e00_5.c e00_6.c e00_7.c e00_8.c +E01 = e01_8.c # e01_2.c e01_3.c e01_4.c e01_5.c e01_6.c e01_7.c +E10 = e10_8.c # e10_2.c e10_3.c e10_4.c e10_5.c e10_6.c e10_7.c +E11 = # e11_2.c e11_3.c e11_4.c e11_5.c e11_6.c e11_7.c e11_8.c + +# o_ is a hard-coded RODFT FFT (DST) of size +O00 = # o00_2.c o00_3.c o00_4.c o00_5.c o00_6.c o00_7.c o00_8.c +O01 = # o01_2.c o01_3.c o01_4.c o01_5.c o01_6.c o01_7.c o01_8.c +O10 = # o10_2.c o10_3.c o10_4.c o10_5.c o10_6.c o10_7.c o10_8.c +O11 = # o11_2.c o11_3.c o11_4.c o11_5.c o11_6.c o11_7.c o11_8.c + +# dht_ is a hard-coded DHT of size +DHT = # dht_2.c dht_3.c dht_4.c dht_5.c dht_6.c dht_7.c dht_8.c + +########################################################################### +ALL_CODELETS = $(E00) $(E01) $(E10) $(E11) $(O00) $(O01) $(O10) $(O11) $(DHT) +BUILT_SOURCES = $(ALL_CODELETS) $(CODLIST) +librdft_scalar_r2r_la_SOURCES = $(BUILT_SOURCES) +SOLVTAB_NAME = X(solvtab_rdft_r2r) +XRENAME = X +CODLIST = codlist.c +CODELET_NAME = codelet_ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +@MAINTAINER_MODE_TRUE@TWOVERS = sh ${top_srcdir}/support/twovers.sh +@MAINTAINER_MODE_TRUE@GENFFTDIR = ${top_builddir}/genfft +@MAINTAINER_MODE_TRUE@GEN_NOTW = ${GENFFTDIR}/gen_notw.native +@MAINTAINER_MODE_TRUE@GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +@MAINTAINER_MODE_TRUE@GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +@MAINTAINER_MODE_TRUE@GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +@MAINTAINER_MODE_TRUE@GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +@MAINTAINER_MODE_TRUE@GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +@MAINTAINER_MODE_TRUE@GEN_R2R = ${GENFFTDIR}/gen_r2r.native +@MAINTAINER_MODE_TRUE@PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +@MAINTAINER_MODE_TRUE@PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +@MAINTAINER_MODE_TRUE@ADD_DATE = sed -e s/@DATE@/"`date`"/ +@MAINTAINER_MODE_TRUE@COPYRIGHT = ${top_srcdir}/COPYRIGHT +@MAINTAINER_MODE_TRUE@CODELET_DEPS = $(COPYRIGHT) $(PRELUDE) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_DFT = cat $(COPYRIGHT) $(PRELUDE_DFT) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_RDFT = cat $(COPYRIGHT) $(PRELUDE_RDFT) +@MAINTAINER_MODE_TRUE@FLAGS_COMMON = -compact -variables 4 +@MAINTAINER_MODE_TRUE@DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +@MAINTAINER_MODE_TRUE@RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# special rules for regenerating codelets. +@MAINTAINER_MODE_TRUE@FLAGS_E00 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_E01 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_E10 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_E11 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_O00 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_O01 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_O10 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_O11 = $(RDFT_FLAGS_COMMON) +@MAINTAINER_MODE_TRUE@FLAGS_DHT = $(RDFT_FLAGS_COMMON) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/support/Makefile.codelets $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/scalar/r2r/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/scalar/r2r/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/support/Makefile.codelets $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_scalar_r2r.la: $(librdft_scalar_r2r_la_OBJECTS) $(librdft_scalar_r2r_la_DEPENDENCIES) $(EXTRA_librdft_scalar_r2r_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(librdft_scalar_r2r_la_OBJECTS) $(librdft_scalar_r2r_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e01_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e10_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic maintainer-clean-local mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +# rule to build codlist +@MAINTAINER_MODE_TRUE@$(CODLIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "#include \"kernel/ifftw.h\""; \ +@MAINTAINER_MODE_TRUE@ echo $(INCLUDE_SIMD_HEADER); \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo "extern const solvtab $(SOLVTAB_NAME);"; \ +@MAINTAINER_MODE_TRUE@ echo "const solvtab $(SOLVTAB_NAME) = {"; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB_END"; \ +@MAINTAINER_MODE_TRUE@ echo "};"; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# cancel the hideous builtin rules that cause an infinite loop +@MAINTAINER_MODE_TRUE@%: %.o +@MAINTAINER_MODE_TRUE@%: %.s +@MAINTAINER_MODE_TRUE@%: %.c +@MAINTAINER_MODE_TRUE@%: %.S + +@MAINTAINER_MODE_TRUE@e00_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E00) -redft00 -n $* -name e00_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@e01_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E01) -redft01 -n $* -name e01_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@e10_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E10) -redft10 -n $* -name e10_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@e11_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_E11) -redft11 -n $* -name e11_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@o00_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O00) -rodft00 -n $* -name o00_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@o01_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O01) -rodft01 -n $* -name o01_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@o10_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O10) -rodft10 -n $* -name o10_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@o11_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_O11) -rodft11 -n $* -name o11_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@dht_%.c: $(CODELET_DEPS) $(GEN_R2R) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_R2R) $(FLAGS_DHT) -dht -sign 1 -n $* -name dht_$* -include "rdft/scalar/r2r.h") | $(ADD_DATE) | $(INDENT) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/codlist.c new file mode 100644 index 000000000..02a3b6600 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/codlist.c @@ -0,0 +1,13 @@ +#include "kernel/ifftw.h" + + +extern void X(codelet_e01_8)(planner *); +extern void X(codelet_e10_8)(planner *); + + +extern const solvtab X(solvtab_rdft_r2r); +const solvtab X(solvtab_rdft_r2r) = { + SOLVTAB(X(codelet_e01_8)), + SOLVTAB(X(codelet_e10_8)), + SOLVTAB_END +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/e01_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/e01_8.c new file mode 100644 index 000000000..331ba2d12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/e01_8.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2r.native -fma -compact -variables 4 -pipeline-latency 4 -redft01 -n 8 -name e01_8 -include rdft/scalar/r2r.h */ + +/* + * This function contains 26 FP additions, 24 FP multiplications, + * (or, 2 additions, 0 multiplications, 24 fused multiply/add), + * 27 stack variables, 8 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2r.h" + +static void e01_8(const R *I, R *O, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + { + INT i; + for (i = v; i > 0; i = i - 1, I = I + ivs, O = O + ovs, MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + E T3, Tj, T6, Tk, Tc, Tn, Tf, Tm; + { + E T1, T2, T4, T5; + T1 = I[0]; + T2 = I[WS(is, 4)]; + T3 = FMA(KP1_414213562, T2, T1); + Tj = FNMS(KP1_414213562, T2, T1); + T4 = I[WS(is, 2)]; + T5 = I[WS(is, 6)]; + T6 = FMA(KP414213562, T5, T4); + Tk = FMS(KP414213562, T4, T5); + { + E T8, Td, Tb, Te, T9, Ta; + T8 = I[WS(is, 1)]; + Td = I[WS(is, 7)]; + T9 = I[WS(is, 5)]; + Ta = I[WS(is, 3)]; + Tb = T9 + Ta; + Te = Ta - T9; + Tc = FMA(KP707106781, Tb, T8); + Tn = FNMS(KP707106781, Te, Td); + Tf = FMA(KP707106781, Te, Td); + Tm = FNMS(KP707106781, Tb, T8); + } + } + { + E T7, Tg, Tp, Tq; + T7 = FMA(KP1_847759065, T6, T3); + Tg = FMA(KP198912367, Tf, Tc); + O[WS(os, 7)] = FNMS(KP1_961570560, Tg, T7); + O[0] = FMA(KP1_961570560, Tg, T7); + Tp = FNMS(KP1_847759065, Tk, Tj); + Tq = FMA(KP668178637, Tm, Tn); + O[WS(os, 5)] = FNMS(KP1_662939224, Tq, Tp); + O[WS(os, 2)] = FMA(KP1_662939224, Tq, Tp); + } + { + E Th, Ti, Tl, To; + Th = FNMS(KP1_847759065, T6, T3); + Ti = FNMS(KP198912367, Tc, Tf); + O[WS(os, 3)] = FNMS(KP1_961570560, Ti, Th); + O[WS(os, 4)] = FMA(KP1_961570560, Ti, Th); + Tl = FMA(KP1_847759065, Tk, Tj); + To = FNMS(KP668178637, Tn, Tm); + O[WS(os, 6)] = FNMS(KP1_662939224, To, Tl); + O[WS(os, 1)] = FMA(KP1_662939224, To, Tl); + } + } + } +} + +static const kr2r_desc desc = { 8, "e01_8", {2, 0, 24, 0}, &GENUS, REDFT01 }; + +void X(codelet_e01_8) (planner *p) { + X(kr2r_register) (p, e01_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2r.native -compact -variables 4 -pipeline-latency 4 -redft01 -n 8 -name e01_8 -include rdft/scalar/r2r.h */ + +/* + * This function contains 26 FP additions, 15 FP multiplications, + * (or, 20 additions, 9 multiplications, 6 fused multiply/add), + * 28 stack variables, 8 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2r.h" + +static void e01_8(const R *I, R *O, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + { + INT i; + for (i = v; i > 0; i = i - 1, I = I + ivs, O = O + ovs, MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + E T7, Tl, T4, Tk, Td, To, Tg, Tn; + { + E T5, T6, T1, T3, T2; + T5 = I[WS(is, 2)]; + T6 = I[WS(is, 6)]; + T7 = FMA(KP1_847759065, T5, KP765366864 * T6); + Tl = FNMS(KP1_847759065, T6, KP765366864 * T5); + T1 = I[0]; + T2 = I[WS(is, 4)]; + T3 = KP1_414213562 * T2; + T4 = T1 + T3; + Tk = T1 - T3; + { + E T9, Tf, Tc, Te, Ta, Tb; + T9 = I[WS(is, 1)]; + Tf = I[WS(is, 7)]; + Ta = I[WS(is, 5)]; + Tb = I[WS(is, 3)]; + Tc = KP707106781 * (Ta + Tb); + Te = KP707106781 * (Ta - Tb); + Td = T9 + Tc; + To = Te + Tf; + Tg = Te - Tf; + Tn = T9 - Tc; + } + } + { + E T8, Th, Tq, Tr; + T8 = T4 + T7; + Th = FNMS(KP390180644, Tg, KP1_961570560 * Td); + O[WS(os, 7)] = T8 - Th; + O[0] = T8 + Th; + Tq = Tk - Tl; + Tr = FMA(KP1_111140466, Tn, KP1_662939224 * To); + O[WS(os, 5)] = Tq - Tr; + O[WS(os, 2)] = Tq + Tr; + } + { + E Ti, Tj, Tm, Tp; + Ti = T4 - T7; + Tj = FMA(KP390180644, Td, KP1_961570560 * Tg); + O[WS(os, 4)] = Ti - Tj; + O[WS(os, 3)] = Ti + Tj; + Tm = Tk + Tl; + Tp = FNMS(KP1_111140466, To, KP1_662939224 * Tn); + O[WS(os, 6)] = Tm - Tp; + O[WS(os, 1)] = Tm + Tp; + } + } + } +} + +static const kr2r_desc desc = { 8, "e01_8", {20, 9, 6, 0}, &GENUS, REDFT01 }; + +void X(codelet_e01_8) (planner *p) { + X(kr2r_register) (p, e01_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/e10_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/e10_8.c new file mode 100644 index 000000000..ca4bc525b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/scalar/r2r/e10_8.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:10 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_r2r.native -fma -compact -variables 4 -pipeline-latency 4 -redft10 -n 8 -name e10_8 -include rdft/scalar/r2r.h */ + +/* + * This function contains 26 FP additions, 18 FP multiplications, + * (or, 16 additions, 8 multiplications, 10 fused multiply/add), + * 28 stack variables, 9 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2r.h" + +static void e10_8(const R *I, R *O, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP414213562, +0.414213562373095048801688724209698078569671875); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP198912367, +0.198912367379658006911597622644676228597850501); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP668178637, +0.668178637919298919997757686523080761552472251); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, I = I + ivs, O = O + ovs, MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + E T3, Tj, Te, Tk, Ta, Tn, Tf, Tm; + { + E T1, T2, Tc, Td; + T1 = I[0]; + T2 = I[WS(is, 7)]; + T3 = T1 - T2; + Tj = T1 + T2; + Tc = I[WS(is, 4)]; + Td = I[WS(is, 3)]; + Te = Tc - Td; + Tk = Tc + Td; + { + E T4, T5, T6, T7, T8, T9; + T4 = I[WS(is, 2)]; + T5 = I[WS(is, 5)]; + T6 = T4 - T5; + T7 = I[WS(is, 1)]; + T8 = I[WS(is, 6)]; + T9 = T7 - T8; + Ta = T6 + T9; + Tn = T7 + T8; + Tf = T6 - T9; + Tm = T4 + T5; + } + } + { + E Tb, Tg, Tp, Tq; + Tb = FNMS(KP707106781, Ta, T3); + Tg = FNMS(KP707106781, Tf, Te); + O[WS(os, 3)] = KP1_662939224 * (FMA(KP668178637, Tg, Tb)); + O[WS(os, 5)] = -(KP1_662939224 * (FNMS(KP668178637, Tb, Tg))); + Tp = Tj + Tk; + Tq = Tm + Tn; + O[WS(os, 4)] = KP1_414213562 * (Tp - Tq); + O[0] = KP2_000000000 * (Tp + Tq); + } + { + E Th, Ti, Tl, To; + Th = FMA(KP707106781, Ta, T3); + Ti = FMA(KP707106781, Tf, Te); + O[WS(os, 1)] = KP1_961570560 * (FNMS(KP198912367, Ti, Th)); + O[WS(os, 7)] = KP1_961570560 * (FMA(KP198912367, Th, Ti)); + Tl = Tj - Tk; + To = Tm - Tn; + O[WS(os, 2)] = KP1_847759065 * (FNMS(KP414213562, To, Tl)); + O[WS(os, 6)] = KP1_847759065 * (FMA(KP414213562, Tl, To)); + } + } + } +} + +static const kr2r_desc desc = { 8, "e10_8", {16, 8, 10, 0}, &GENUS, REDFT10 }; + +void X(codelet_e10_8) (planner *p) { + X(kr2r_register) (p, e10_8, &desc); +} + +#else + +/* Generated by: ../../../genfft/gen_r2r.native -compact -variables 4 -pipeline-latency 4 -redft10 -n 8 -name e10_8 -include rdft/scalar/r2r.h */ + +/* + * This function contains 26 FP additions, 16 FP multiplications, + * (or, 20 additions, 10 multiplications, 6 fused multiply/add), + * 28 stack variables, 9 constants, and 16 memory accesses + */ +#include "rdft/scalar/r2r.h" + +static void e10_8(const R *I, R *O, stride is, stride os, INT v, INT ivs, INT ovs) +{ + DK(KP765366864, +0.765366864730179543456919968060797733522689125); + DK(KP1_847759065, +1.847759065022573512256366378793576573644833252); + DK(KP390180644, +0.390180644032256535696569736954044481855383236); + DK(KP1_961570560, +1.961570560806460898252364472268478073947867462); + DK(KP2_000000000, +2.000000000000000000000000000000000000000000000); + DK(KP1_414213562, +1.414213562373095048801688724209698078569671875); + DK(KP1_111140466, +1.111140466039204449485661627897065748749874382); + DK(KP1_662939224, +1.662939224605090474157576755235811513477121624); + DK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT i; + for (i = v; i > 0; i = i - 1, I = I + ivs, O = O + ovs, MAKE_VOLATILE_STRIDE(16, is), MAKE_VOLATILE_STRIDE(16, os)) { + E T3, Tj, Tf, Tk, Ta, Tn, Tc, Tm; + { + E T1, T2, Td, Te; + T1 = I[0]; + T2 = I[WS(is, 7)]; + T3 = T1 - T2; + Tj = T1 + T2; + Td = I[WS(is, 4)]; + Te = I[WS(is, 3)]; + Tf = Td - Te; + Tk = Td + Te; + { + E T4, T5, T6, T7, T8, T9; + T4 = I[WS(is, 2)]; + T5 = I[WS(is, 5)]; + T6 = T4 - T5; + T7 = I[WS(is, 1)]; + T8 = I[WS(is, 6)]; + T9 = T7 - T8; + Ta = KP707106781 * (T6 + T9); + Tn = T7 + T8; + Tc = KP707106781 * (T6 - T9); + Tm = T4 + T5; + } + } + { + E Tb, Tg, Tp, Tq; + Tb = T3 - Ta; + Tg = Tc - Tf; + O[WS(os, 3)] = FNMS(KP1_111140466, Tg, KP1_662939224 * Tb); + O[WS(os, 5)] = FMA(KP1_662939224, Tg, KP1_111140466 * Tb); + Tp = Tj + Tk; + Tq = Tm + Tn; + O[WS(os, 4)] = KP1_414213562 * (Tp - Tq); + O[0] = KP2_000000000 * (Tp + Tq); + } + { + E Th, Ti, Tl, To; + Th = T3 + Ta; + Ti = Tf + Tc; + O[WS(os, 1)] = FNMS(KP390180644, Ti, KP1_961570560 * Th); + O[WS(os, 7)] = FMA(KP1_961570560, Ti, KP390180644 * Th); + Tl = Tj - Tk; + To = Tm - Tn; + O[WS(os, 2)] = FNMS(KP765366864, To, KP1_847759065 * Tl); + O[WS(os, 6)] = FMA(KP765366864, Tl, KP1_847759065 * To); + } + } + } +} + +static const kr2r_desc desc = { 8, "e10_8", {20, 10, 6, 0}, &GENUS, REDFT10 }; + +void X(codelet_e10_8) (planner *p) { + X(kr2r_register) (p, e10_8, &desc); +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/Makefile.am new file mode 100644 index 000000000..53de164f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/Makefile.am @@ -0,0 +1,4 @@ + +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = common sse2 avx avx-128-fma avx2 avx2-128 avx512 kcvi altivec vsx neon generic-simd128 generic-simd256 +EXTRA_DIST = hc2cbv.h hc2cfv.h codlist.mk simd.mk diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/Makefile.in new file mode 100644 index 000000000..863f26049 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/Makefile.in @@ -0,0 +1,661 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = common sse2 avx avx-128-fma avx2 avx2-128 avx512 kcvi altivec vsx neon generic-simd128 generic-simd256 +EXTRA_DIST = hc2cbv.h hc2cfv.h codlist.mk simd.mk +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool cscopelist-am ctags \ + ctags-am distclean distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/Makefile.am new file mode 100644 index 000000000..833158882 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(ALTIVEC_CFLAGS) +SIMD_HEADER=simd-support/simd-altivec.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_ALTIVEC + +noinst_LTLIBRARIES = librdft_altivec_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_altivec_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/Makefile.in new file mode 100644 index 000000000..ae4bcaf97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/altivec +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_altivec_codelets_la_LIBADD = +am__librdft_altivec_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_ALTIVEC_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_ALTIVEC_TRUE@am_librdft_altivec_codelets_la_OBJECTS = \ +@HAVE_ALTIVEC_TRUE@ $(am__objects_5) +librdft_altivec_codelets_la_OBJECTS = \ + $(am_librdft_altivec_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_ALTIVEC_TRUE@am_librdft_altivec_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_altivec_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_altivec_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(ALTIVEC_CFLAGS) +SIMD_HEADER = simd-support/simd-altivec.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_ALTIVEC_TRUE@noinst_LTLIBRARIES = librdft_altivec_codelets.la +@HAVE_ALTIVEC_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_ALTIVEC_TRUE@librdft_altivec_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/altivec/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/altivec/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_altivec_codelets.la: $(librdft_altivec_codelets_la_OBJECTS) $(librdft_altivec_codelets_la_DEPENDENCIES) $(EXTRA_librdft_altivec_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_altivec_codelets_la_rpath) $(librdft_altivec_codelets_la_OBJECTS) $(librdft_altivec_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/codlist.c new file mode 100644 index 000000000..6a6a6d689 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/genus.c new file mode 100644 index 000000000..5a6600d90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_10.c new file mode 100644 index 000000000..b1c38b849 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_12.c new file mode 100644 index 000000000..f897491da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_16.c new file mode 100644 index 000000000..b63e0a9d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_2.c new file mode 100644 index 000000000..9b99edc5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_20.c new file mode 100644 index 000000000..d8a263038 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_32.c new file mode 100644 index 000000000..a97caad92 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_4.c new file mode 100644 index 000000000..6833dd095 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_6.c new file mode 100644 index 000000000..953aece87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_8.c new file mode 100644 index 000000000..54ed34a21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_10.c new file mode 100644 index 000000000..0e997ef16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_12.c new file mode 100644 index 000000000..90a360819 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_16.c new file mode 100644 index 000000000..d58f7442c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_2.c new file mode 100644 index 000000000..99a13638e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_20.c new file mode 100644 index 000000000..f3ed8cb19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_32.c new file mode 100644 index 000000000..9e4a46fa1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_4.c new file mode 100644 index 000000000..f58b88b14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_6.c new file mode 100644 index 000000000..e7dcc5028 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_8.c new file mode 100644 index 000000000..d8de5d389 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/altivec/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-altivec.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/Makefile.am new file mode 100644 index 000000000..c1c989b87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(AVX_128_FMA_CFLAGS) +SIMD_HEADER=simd-support/simd-avx-128-fma.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_AVX_128_FMA + +noinst_LTLIBRARIES = librdft_avx_128_fma_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_avx_128_fma_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/Makefile.in new file mode 100644 index 000000000..cb91df426 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/avx-128-fma +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_avx_128_fma_codelets_la_LIBADD = +am__librdft_avx_128_fma_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_AVX_128_FMA_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_AVX_128_FMA_TRUE@am_librdft_avx_128_fma_codelets_la_OBJECTS = \ +@HAVE_AVX_128_FMA_TRUE@ $(am__objects_5) +librdft_avx_128_fma_codelets_la_OBJECTS = \ + $(am_librdft_avx_128_fma_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX_128_FMA_TRUE@am_librdft_avx_128_fma_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_avx_128_fma_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_avx_128_fma_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX_128_FMA_CFLAGS) +SIMD_HEADER = simd-support/simd-avx-128-fma.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX_128_FMA_TRUE@noinst_LTLIBRARIES = librdft_avx_128_fma_codelets.la +@HAVE_AVX_128_FMA_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX_128_FMA_TRUE@librdft_avx_128_fma_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/avx-128-fma/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/avx-128-fma/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_avx_128_fma_codelets.la: $(librdft_avx_128_fma_codelets_la_OBJECTS) $(librdft_avx_128_fma_codelets_la_DEPENDENCIES) $(EXTRA_librdft_avx_128_fma_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_avx_128_fma_codelets_la_rpath) $(librdft_avx_128_fma_codelets_la_OBJECTS) $(librdft_avx_128_fma_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/codlist.c new file mode 100644 index 000000000..98f09a717 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/genus.c new file mode 100644 index 000000000..bdca18e83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_10.c new file mode 100644 index 000000000..c0d6e8b5a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_12.c new file mode 100644 index 000000000..a2747e20c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_16.c new file mode 100644 index 000000000..c5a5fd41d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_2.c new file mode 100644 index 000000000..e7590d4a7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_20.c new file mode 100644 index 000000000..46ad6944d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_32.c new file mode 100644 index 000000000..fa2bb41eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_4.c new file mode 100644 index 000000000..78a1005c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_6.c new file mode 100644 index 000000000..b011f8eeb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_8.c new file mode 100644 index 000000000..a77a5a581 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_10.c new file mode 100644 index 000000000..bc5cf85ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_12.c new file mode 100644 index 000000000..b42397d8f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_16.c new file mode 100644 index 000000000..37688e159 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_2.c new file mode 100644 index 000000000..de84f055e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_20.c new file mode 100644 index 000000000..ac8f646df --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_32.c new file mode 100644 index 000000000..b95820005 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_4.c new file mode 100644 index 000000000..dbcd1e204 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_6.c new file mode 100644 index 000000000..59ab2288b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_8.c new file mode 100644 index 000000000..2bb438dd4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx-128-fma/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx-128-fma.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/Makefile.am new file mode 100644 index 000000000..f2b01a9df --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(AVX_CFLAGS) +SIMD_HEADER=simd-support/simd-avx.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_AVX + +noinst_LTLIBRARIES = librdft_avx_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_avx_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/Makefile.in new file mode 100644 index 000000000..9def25909 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/avx +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_avx_codelets_la_LIBADD = +am__librdft_avx_codelets_la_SOURCES_DIST = hc2cfdftv_2.c hc2cfdftv_4.c \ + hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c hc2cfdftv_12.c \ + hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c hc2cbdftv_2.c \ + hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c hc2cbdftv_10.c \ + hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c hc2cbdftv_20.c \ + genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_AVX_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_AVX_TRUE@am_librdft_avx_codelets_la_OBJECTS = $(am__objects_5) +librdft_avx_codelets_la_OBJECTS = \ + $(am_librdft_avx_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX_TRUE@am_librdft_avx_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_avx_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_avx_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX_CFLAGS) +SIMD_HEADER = simd-support/simd-avx.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX_TRUE@noinst_LTLIBRARIES = librdft_avx_codelets.la +@HAVE_AVX_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX_TRUE@librdft_avx_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/avx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/avx/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_avx_codelets.la: $(librdft_avx_codelets_la_OBJECTS) $(librdft_avx_codelets_la_DEPENDENCIES) $(EXTRA_librdft_avx_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_avx_codelets_la_rpath) $(librdft_avx_codelets_la_OBJECTS) $(librdft_avx_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/codlist.c new file mode 100644 index 000000000..0f86e6984 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/genus.c new file mode 100644 index 000000000..08165fb90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_10.c new file mode 100644 index 000000000..e47a74732 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_12.c new file mode 100644 index 000000000..f274ee861 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_16.c new file mode 100644 index 000000000..1bee61ab0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_2.c new file mode 100644 index 000000000..86e37d7d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_20.c new file mode 100644 index 000000000..7a8aa4576 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_32.c new file mode 100644 index 000000000..6da935e10 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_4.c new file mode 100644 index 000000000..2775335ae --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_6.c new file mode 100644 index 000000000..6cce5cc0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_8.c new file mode 100644 index 000000000..f2c37f567 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_10.c new file mode 100644 index 000000000..469d44fbe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_12.c new file mode 100644 index 000000000..7eb050e88 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_16.c new file mode 100644 index 000000000..ac2dc07c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_2.c new file mode 100644 index 000000000..476654727 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_20.c new file mode 100644 index 000000000..bac17355d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_32.c new file mode 100644 index 000000000..b12e4d5c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_4.c new file mode 100644 index 000000000..f0692b0e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_6.c new file mode 100644 index 000000000..7352cb4ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_8.c new file mode 100644 index 000000000..09d100097 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/Makefile.am new file mode 100644 index 000000000..adfd345c4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER=simd-support/simd-avx2-128.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_AVX2 + +noinst_LTLIBRARIES = librdft_avx2_128_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_avx2_128_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/Makefile.in new file mode 100644 index 000000000..d477c232c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/avx2-128 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_avx2_128_codelets_la_LIBADD = +am__librdft_avx2_128_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_AVX2_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_AVX2_TRUE@am_librdft_avx2_128_codelets_la_OBJECTS = \ +@HAVE_AVX2_TRUE@ $(am__objects_5) +librdft_avx2_128_codelets_la_OBJECTS = \ + $(am_librdft_avx2_128_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX2_TRUE@am_librdft_avx2_128_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_avx2_128_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_avx2_128_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER = simd-support/simd-avx2-128.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX2_TRUE@noinst_LTLIBRARIES = librdft_avx2_128_codelets.la +@HAVE_AVX2_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX2_TRUE@librdft_avx2_128_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/avx2-128/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/avx2-128/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_avx2_128_codelets.la: $(librdft_avx2_128_codelets_la_OBJECTS) $(librdft_avx2_128_codelets_la_DEPENDENCIES) $(EXTRA_librdft_avx2_128_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_avx2_128_codelets_la_rpath) $(librdft_avx2_128_codelets_la_OBJECTS) $(librdft_avx2_128_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/codlist.c new file mode 100644 index 000000000..43c4ee445 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/genus.c new file mode 100644 index 000000000..a012fa48f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_10.c new file mode 100644 index 000000000..6c4bf6e41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_12.c new file mode 100644 index 000000000..d97005626 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_16.c new file mode 100644 index 000000000..5e6d85426 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_2.c new file mode 100644 index 000000000..c875c3806 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_20.c new file mode 100644 index 000000000..146911a13 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_32.c new file mode 100644 index 000000000..6e07e7b5f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_4.c new file mode 100644 index 000000000..c33176296 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_6.c new file mode 100644 index 000000000..9576c901b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_8.c new file mode 100644 index 000000000..4bd06be08 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_10.c new file mode 100644 index 000000000..164d8512d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_12.c new file mode 100644 index 000000000..755d98281 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_16.c new file mode 100644 index 000000000..a60a3645d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_2.c new file mode 100644 index 000000000..531971e67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_20.c new file mode 100644 index 000000000..efb65b0a4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_32.c new file mode 100644 index 000000000..d6a8a3b69 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_4.c new file mode 100644 index 000000000..405901e8e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_6.c new file mode 100644 index 000000000..f6e6a5523 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_8.c new file mode 100644 index 000000000..eab5282e1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2-128/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2-128.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/Makefile.am new file mode 100644 index 000000000..fd598a0db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER=simd-support/simd-avx2.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_AVX2 + +noinst_LTLIBRARIES = librdft_avx2_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_avx2_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/Makefile.in new file mode 100644 index 000000000..fe5116cf2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/avx2 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_avx2_codelets_la_LIBADD = +am__librdft_avx2_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_AVX2_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_AVX2_TRUE@am_librdft_avx2_codelets_la_OBJECTS = \ +@HAVE_AVX2_TRUE@ $(am__objects_5) +librdft_avx2_codelets_la_OBJECTS = \ + $(am_librdft_avx2_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX2_TRUE@am_librdft_avx2_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_avx2_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_avx2_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX2_CFLAGS) +SIMD_HEADER = simd-support/simd-avx2.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX2_TRUE@noinst_LTLIBRARIES = librdft_avx2_codelets.la +@HAVE_AVX2_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX2_TRUE@librdft_avx2_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/avx2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/avx2/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_avx2_codelets.la: $(librdft_avx2_codelets_la_OBJECTS) $(librdft_avx2_codelets_la_DEPENDENCIES) $(EXTRA_librdft_avx2_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_avx2_codelets_la_rpath) $(librdft_avx2_codelets_la_OBJECTS) $(librdft_avx2_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/codlist.c new file mode 100644 index 000000000..887efa3af --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/genus.c new file mode 100644 index 000000000..3f31c3733 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_10.c new file mode 100644 index 000000000..2d912f2d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_12.c new file mode 100644 index 000000000..da42e5745 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_16.c new file mode 100644 index 000000000..672ffd6d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_2.c new file mode 100644 index 000000000..252617168 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_20.c new file mode 100644 index 000000000..7c0a322e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_32.c new file mode 100644 index 000000000..3100b68eb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_4.c new file mode 100644 index 000000000..caeff06f7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_6.c new file mode 100644 index 000000000..e48317b84 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_8.c new file mode 100644 index 000000000..dd2f2c688 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_10.c new file mode 100644 index 000000000..e14f7511c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_12.c new file mode 100644 index 000000000..131b2f885 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_16.c new file mode 100644 index 000000000..cbd2059ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_2.c new file mode 100644 index 000000000..a8a9735d5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_20.c new file mode 100644 index 000000000..596f54e52 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_32.c new file mode 100644 index 000000000..80ec5215d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_4.c new file mode 100644 index 000000000..5012c3106 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_6.c new file mode 100644 index 000000000..78eec2349 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_8.c new file mode 100644 index 000000000..c850bc489 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx2/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx2.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/Makefile.am new file mode 100644 index 000000000..15b30241a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(AVX512_CFLAGS) +SIMD_HEADER=simd-support/simd-avx512.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_AVX512 + +noinst_LTLIBRARIES = librdft_avx512_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_avx512_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/Makefile.in new file mode 100644 index 000000000..9a2865d1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/avx512 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_avx512_codelets_la_LIBADD = +am__librdft_avx512_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_AVX512_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_AVX512_TRUE@am_librdft_avx512_codelets_la_OBJECTS = \ +@HAVE_AVX512_TRUE@ $(am__objects_5) +librdft_avx512_codelets_la_OBJECTS = \ + $(am_librdft_avx512_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_AVX512_TRUE@am_librdft_avx512_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_avx512_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_avx512_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(AVX512_CFLAGS) +SIMD_HEADER = simd-support/simd-avx512.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_AVX512_TRUE@noinst_LTLIBRARIES = librdft_avx512_codelets.la +@HAVE_AVX512_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_AVX512_TRUE@librdft_avx512_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/avx512/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/avx512/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_avx512_codelets.la: $(librdft_avx512_codelets_la_OBJECTS) $(librdft_avx512_codelets_la_DEPENDENCIES) $(EXTRA_librdft_avx512_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_avx512_codelets_la_rpath) $(librdft_avx512_codelets_la_OBJECTS) $(librdft_avx512_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/codlist.c new file mode 100644 index 000000000..30adb1241 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/genus.c new file mode 100644 index 000000000..c44b372d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_10.c new file mode 100644 index 000000000..fa8c676ee --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_12.c new file mode 100644 index 000000000..5c5139afa --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_16.c new file mode 100644 index 000000000..032b9101e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_2.c new file mode 100644 index 000000000..d7d03b638 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_20.c new file mode 100644 index 000000000..4a39f2287 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_32.c new file mode 100644 index 000000000..628436b90 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_4.c new file mode 100644 index 000000000..b8e8cd17b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_6.c new file mode 100644 index 000000000..70f19e2a8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_8.c new file mode 100644 index 000000000..75ee0c017 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_10.c new file mode 100644 index 000000000..6a67a0733 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_12.c new file mode 100644 index 000000000..d45a15f07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_16.c new file mode 100644 index 000000000..3b89e75cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_2.c new file mode 100644 index 000000000..bd73ca7c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_20.c new file mode 100644 index 000000000..481a82434 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_32.c new file mode 100644 index 000000000..3264c7da9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_4.c new file mode 100644 index 000000000..42acc1d94 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_6.c new file mode 100644 index 000000000..f68304fad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_8.c new file mode 100644 index 000000000..0447e4b0f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/avx512/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-avx512.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/codlist.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/codlist.mk new file mode 100644 index 000000000..d9e693281 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/codlist.mk @@ -0,0 +1,22 @@ +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/Makefile.am new file mode 100644 index 000000000..7557f33f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/Makefile.am @@ -0,0 +1,24 @@ +# include the list of codelets + +include $(top_srcdir)/rdft/simd/codlist.mk + +ALL_CODELETS = $(SIMD_CODELETS) +BUILT_SOURCES= $(SIMD_CODELETS) $(CODLIST) +EXTRA_DIST = $(BUILT_SOURCES) genus.c +INCLUDE_SIMD_HEADER="\#include SIMD_HEADER" +XRENAME=XSIMD +SOLVTAB_NAME = XSIMD(solvtab_rdft) + +# include special rules for regenerating codelets. +include $(top_srcdir)/support/Makefile.codelets + +if MAINTAINER_MODE +FLAGS_HC2C=-simd $(FLAGS_COMMON) -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw + +hc2cfdftv_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT_C) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT_C) $(FLAGS_HC2C) -n $* -dit -name hc2cfdftv_$* -include "rdft/simd/hc2cfv.h") | $(ADD_DATE) | $(INDENT) >$@ + +hc2cbdftv_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT_C) + ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT_C) $(FLAGS_HC2C) -n $* -dif -sign 1 -name hc2cbdftv_$* -include "rdft/simd/hc2cbv.h") | $(ADD_DATE) | $(INDENT) >$@ + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/Makefile.in new file mode 100644 index 000000000..a3b84124d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/Makefile.in @@ -0,0 +1,597 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# include the list of codelets + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/common +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/support/Makefile.codelets +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +ALL_CODELETS = $(SIMD_CODELETS) +BUILT_SOURCES = $(SIMD_CODELETS) $(CODLIST) +EXTRA_DIST = $(BUILT_SOURCES) genus.c +INCLUDE_SIMD_HEADER = "\#include SIMD_HEADER" +XRENAME = XSIMD +SOLVTAB_NAME = XSIMD(solvtab_rdft) +CODLIST = codlist.c +CODELET_NAME = codelet_ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +@MAINTAINER_MODE_TRUE@TWOVERS = sh ${top_srcdir}/support/twovers.sh +@MAINTAINER_MODE_TRUE@GENFFTDIR = ${top_builddir}/genfft +@MAINTAINER_MODE_TRUE@GEN_NOTW = ${GENFFTDIR}/gen_notw.native +@MAINTAINER_MODE_TRUE@GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +@MAINTAINER_MODE_TRUE@GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +@MAINTAINER_MODE_TRUE@GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +@MAINTAINER_MODE_TRUE@GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +@MAINTAINER_MODE_TRUE@GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +@MAINTAINER_MODE_TRUE@GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +@MAINTAINER_MODE_TRUE@GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +@MAINTAINER_MODE_TRUE@GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +@MAINTAINER_MODE_TRUE@GEN_R2R = ${GENFFTDIR}/gen_r2r.native +@MAINTAINER_MODE_TRUE@PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +@MAINTAINER_MODE_TRUE@PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +@MAINTAINER_MODE_TRUE@ADD_DATE = sed -e s/@DATE@/"`date`"/ +@MAINTAINER_MODE_TRUE@COPYRIGHT = ${top_srcdir}/COPYRIGHT +@MAINTAINER_MODE_TRUE@CODELET_DEPS = $(COPYRIGHT) $(PRELUDE) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_DFT = cat $(COPYRIGHT) $(PRELUDE_DFT) +@MAINTAINER_MODE_TRUE@PRELUDE_COMMANDS_RDFT = cat $(COPYRIGHT) $(PRELUDE_RDFT) +@MAINTAINER_MODE_TRUE@FLAGS_COMMON = -compact -variables 4 +@MAINTAINER_MODE_TRUE@DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +@MAINTAINER_MODE_TRUE@RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# include special rules for regenerating codelets. +@MAINTAINER_MODE_TRUE@FLAGS_HC2C = -simd $(FLAGS_COMMON) -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/support/Makefile.codelets $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/common/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/common/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/support/Makefile.codelets $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +# rule to build codlist +@MAINTAINER_MODE_TRUE@$(CODLIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "#include \"kernel/ifftw.h\""; \ +@MAINTAINER_MODE_TRUE@ echo $(INCLUDE_SIMD_HEADER); \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo; \ +@MAINTAINER_MODE_TRUE@ echo "extern const solvtab $(SOLVTAB_NAME);"; \ +@MAINTAINER_MODE_TRUE@ echo "const solvtab $(SOLVTAB_NAME) = {"; \ +@MAINTAINER_MODE_TRUE@ for i in $(ALL_CODELETS) NIL; do \ +@MAINTAINER_MODE_TRUE@ if test "$$i" != NIL; then \ +@MAINTAINER_MODE_TRUE@ j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ +@MAINTAINER_MODE_TRUE@ fi \ +@MAINTAINER_MODE_TRUE@ done; \ +@MAINTAINER_MODE_TRUE@ echo " SOLVTAB_END"; \ +@MAINTAINER_MODE_TRUE@ echo "};"; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# cancel the hideous builtin rules that cause an infinite loop +@MAINTAINER_MODE_TRUE@%: %.o +@MAINTAINER_MODE_TRUE@%: %.s +@MAINTAINER_MODE_TRUE@%: %.c +@MAINTAINER_MODE_TRUE@%: %.S + +@MAINTAINER_MODE_TRUE@hc2cfdftv_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT_C) $(FLAGS_HC2C) -n $* -dit -name hc2cfdftv_$* -include "rdft/simd/hc2cfv.h") | $(ADD_DATE) | $(INDENT) >$@ + +@MAINTAINER_MODE_TRUE@hc2cbdftv_%.c: $(CODELET_DEPS) $(GEN_HC2CDFT_C) +@MAINTAINER_MODE_TRUE@ ($(PRELUDE_COMMANDS_RDFT); $(TWOVERS) $(GEN_HC2CDFT_C) $(FLAGS_HC2C) -n $* -dif -sign 1 -name hc2cbdftv_$* -include "rdft/simd/hc2cbv.h") | $(ADD_DATE) | $(INDENT) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/codlist.c new file mode 100644 index 000000000..8c64394cc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/codlist.c @@ -0,0 +1,45 @@ +#include "kernel/ifftw.h" +#include SIMD_HEADER + +extern void XSIMD(codelet_hc2cfdftv_2)(planner *); +extern void XSIMD(codelet_hc2cfdftv_4)(planner *); +extern void XSIMD(codelet_hc2cfdftv_6)(planner *); +extern void XSIMD(codelet_hc2cfdftv_8)(planner *); +extern void XSIMD(codelet_hc2cfdftv_10)(planner *); +extern void XSIMD(codelet_hc2cfdftv_12)(planner *); +extern void XSIMD(codelet_hc2cfdftv_16)(planner *); +extern void XSIMD(codelet_hc2cfdftv_32)(planner *); +extern void XSIMD(codelet_hc2cfdftv_20)(planner *); +extern void XSIMD(codelet_hc2cbdftv_2)(planner *); +extern void XSIMD(codelet_hc2cbdftv_4)(planner *); +extern void XSIMD(codelet_hc2cbdftv_6)(planner *); +extern void XSIMD(codelet_hc2cbdftv_8)(planner *); +extern void XSIMD(codelet_hc2cbdftv_10)(planner *); +extern void XSIMD(codelet_hc2cbdftv_12)(planner *); +extern void XSIMD(codelet_hc2cbdftv_16)(planner *); +extern void XSIMD(codelet_hc2cbdftv_32)(planner *); +extern void XSIMD(codelet_hc2cbdftv_20)(planner *); + + +extern const solvtab XSIMD(solvtab_rdft); +const solvtab XSIMD(solvtab_rdft) = { + SOLVTAB(XSIMD(codelet_hc2cfdftv_2)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_4)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_6)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_8)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_10)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_12)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_16)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_32)), + SOLVTAB(XSIMD(codelet_hc2cfdftv_20)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_2)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_4)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_6)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_8)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_10)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_12)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_16)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_32)), + SOLVTAB(XSIMD(codelet_hc2cbdftv_20)), + SOLVTAB_END +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/genus.c new file mode 100644 index 000000000..8d7920f85 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/genus.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "rdft/codelet-rdft.h" +#include SIMD_HEADER + +#define EXTERN_CONST(t, x) extern const t x; const t x + +static int hc2cbv_okp(const R *Rp, const R *Ip, const R *Rm, const R *Im, + INT rs, INT mb, INT me, INT ms, + const planner *plnr) +{ + return (1 + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(rs) + && SIMD_VSTRIDE_OK(ms) + && ((me - mb) % VL) == 0 + && ((mb - 1) % VL) == 0 /* twiddle factors alignment */ + && ALIGNED(Rp) + && ALIGNED(Rm) + && Ip == Rp + 1 + && Im == Rm + 1); +} + +EXTERN_CONST(hc2c_genus, XSIMD(rdft_hc2cbv_genus)) = { hc2cbv_okp, HC2R, VL }; + +static int hc2cfv_okp(const R *Rp, const R *Ip, const R *Rm, const R *Im, + INT rs, INT mb, INT me, INT ms, + const planner *plnr) +{ + return (1 + && !NO_SIMDP(plnr) + && SIMD_STRIDE_OK(rs) + && SIMD_VSTRIDE_OK(ms) + && ((me - mb) % VL) == 0 + && ((mb - 1) % VL) == 0 /* twiddle factors alignment */ + && ALIGNED(Rp) + && ALIGNED(Rm) + && Ip == Rp + 1 + && Im == Rm + 1); +} + +EXTERN_CONST(hc2c_genus, XSIMD(rdft_hc2cfv_genus)) = { hc2cfv_okp, R2HC, VL }; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_10.c new file mode 100644 index 000000000..5d2e1335d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_10.c @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 10 -dif -sign 1 -name hc2cbdftv_10 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 61 FP additions, 50 FP multiplications, + * (or, 33 additions, 22 multiplications, 28 fused multiply/add), + * 76 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 18)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(40, rs)) { + V T4, Ts, Tl, TB, Tj, Tk, Tz, TA, TF, TV, Tp, TL, Te, Tw, Th; + V Tx, Ti, Ty, T7, Tt, Ta, Tu, Tb, Tv, T2, T3, Tc, Td, Tf, Tg; + V T5, T6, T8, T9, TD, TE, Tn, To; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T4 = VFNMSCONJ(T3, T2); + Ts = VFMACONJ(T3, T2); + Tc = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Td = LD(&(Rm[0]), -ms, &(Rm[0])); + Te = VFNMSCONJ(Td, Tc); + Tw = VFMACONJ(Td, Tc); + Tf = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tg = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Th = VFMSCONJ(Tg, Tf); + Tx = VFMACONJ(Tg, Tf); + Ti = VADD(Te, Th); + Ty = VADD(Tw, Tx); + T5 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T7 = VFNMSCONJ(T6, T5); + Tt = VFMACONJ(T6, T5); + T8 = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + T9 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Ta = VFMSCONJ(T9, T8); + Tu = VFMACONJ(T9, T8); + Tb = VADD(T7, Ta); + Tv = VADD(Tt, Tu); + Tl = VSUB(Tb, Ti); + TB = VSUB(Tv, Ty); + Tj = VADD(Tb, Ti); + Tk = VFNMS(LDK(KP250000000), Tj, T4); + Tz = VADD(Tv, Ty); + TA = VFNMS(LDK(KP250000000), Tz, Ts); + TD = VSUB(Tw, Tx); + TE = VSUB(Tt, Tu); + TF = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TE, TD)); + TV = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TD, TE)); + Tn = VSUB(Te, Th); + To = VSUB(T7, Ta); + Tp = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), To, Tn)); + TL = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), Tn, To)); + { + V T17, TS, Tq, T10, TW, T12, TM, T16, TG, TO, TR, Tm, T1, TZ, TU; + V TT, T11, TK, TJ, T15, TC, Tr, TN, TH, TP, T19, TI, T18, T14, TY; + V TQ, T13, TX; + T17 = VADD(Ts, Tz); + TR = LDW(&(W[TWVL * 8])); + TS = VZMULI(TR, VADD(T4, Tj)); + Tm = VFNMS(LDK(KP559016994), Tl, Tk); + T1 = LDW(&(W[TWVL * 4])); + Tq = VZMULI(T1, VFMAI(Tp, Tm)); + TZ = LDW(&(W[TWVL * 12])); + T10 = VZMULI(TZ, VFNMSI(Tp, Tm)); + TU = VFMA(LDK(KP559016994), TB, TA); + TT = LDW(&(W[TWVL * 6])); + TW = VZMUL(TT, VFNMSI(TV, TU)); + T11 = LDW(&(W[TWVL * 10])); + T12 = VZMUL(T11, VFMAI(TV, TU)); + TK = VFMA(LDK(KP559016994), Tl, Tk); + TJ = LDW(&(W[TWVL * 16])); + TM = VZMULI(TJ, VFNMSI(TL, TK)); + T15 = LDW(&(W[0])); + T16 = VZMULI(T15, VFMAI(TL, TK)); + TC = VFNMS(LDK(KP559016994), TB, TA); + Tr = LDW(&(W[TWVL * 2])); + TG = VZMUL(Tr, VFNMSI(TF, TC)); + TN = LDW(&(W[TWVL * 14])); + TO = VZMUL(TN, VFMAI(TF, TC)); + TH = VADD(Tq, TG); + ST(&(Rp[WS(rs, 1)]), TH, ms, &(Rp[WS(rs, 1)])); + TP = VADD(TM, TO); + ST(&(Rp[WS(rs, 4)]), TP, ms, &(Rp[0])); + T19 = VCONJ(VSUB(T17, T16)); + ST(&(Rm[0]), T19, -ms, &(Rm[0])); + TI = VCONJ(VSUB(TG, Tq)); + ST(&(Rm[WS(rs, 1)]), TI, -ms, &(Rm[WS(rs, 1)])); + T18 = VADD(T16, T17); + ST(&(Rp[0]), T18, ms, &(Rp[0])); + T14 = VCONJ(VSUB(T12, T10)); + ST(&(Rm[WS(rs, 3)]), T14, -ms, &(Rm[WS(rs, 1)])); + TY = VCONJ(VSUB(TW, TS)); + ST(&(Rm[WS(rs, 2)]), TY, -ms, &(Rm[0])); + TQ = VCONJ(VSUB(TO, TM)); + ST(&(Rm[WS(rs, 4)]), TQ, -ms, &(Rm[0])); + T13 = VADD(T10, T12); + ST(&(Rp[WS(rs, 3)]), T13, ms, &(Rp[WS(rs, 1)])); + TX = VADD(TS, TW); + ST(&(Rp[WS(rs, 2)]), TX, ms, &(Rp[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 10, XSIMD_STRING("hc2cbdftv_10"), twinstr, &GENUS, {33, 22, 28, 0} }; + +void XSIMD(codelet_hc2cbdftv_10) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_10, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 10 -dif -sign 1 -name hc2cbdftv_10 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 61 FP additions, 30 FP multiplications, + * (or, 55 additions, 24 multiplications, 6 fused multiply/add), + * 81 stack variables, 4 constants, and 20 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 18)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(40, rs)) { + V T5, TE, Ts, Tt, TC, Tz, TH, TJ, To, Tq, T2, T4, T3, T9, Tx; + V Tm, TB, Td, Ty, Ti, TA, T6, T8, T7, Tl, Tk, Tj, Tc, Tb, Ta; + V Tf, Th, Tg, TF, TG, Te, Tn; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T4 = VCONJ(T3); + T5 = VSUB(T2, T4); + TE = VADD(T2, T4); + T6 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + T9 = VSUB(T6, T8); + Tx = VADD(T6, T8); + Tl = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tj = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tk = VCONJ(Tj); + Tm = VSUB(Tk, Tl); + TB = VADD(Tk, Tl); + Tc = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Ta = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VCONJ(Ta); + Td = VSUB(Tb, Tc); + Ty = VADD(Tb, Tc); + Tf = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Tg = LD(&(Rm[0]), -ms, &(Rm[0])); + Th = VCONJ(Tg); + Ti = VSUB(Tf, Th); + TA = VADD(Tf, Th); + Ts = VSUB(T9, Td); + Tt = VSUB(Ti, Tm); + TC = VSUB(TA, TB); + Tz = VSUB(Tx, Ty); + TF = VADD(Tx, Ty); + TG = VADD(TA, TB); + TH = VADD(TF, TG); + TJ = VMUL(LDK(KP559016994), VSUB(TF, TG)); + Te = VADD(T9, Td); + Tn = VADD(Ti, Tm); + To = VADD(Te, Tn); + Tq = VMUL(LDK(KP559016994), VSUB(Te, Tn)); + { + V T1c, TX, Tv, T1b, TR, T15, TL, T17, TT, T11, TW, Tu, TQ, Tr, TP; + V Tp, T1, T1a, TO, T14, TD, T10, TK, TZ, TI, Tw, T16, TS, TY, TM; + V TU, T1e, TN, T1d, T19, T13, TV, T18, T12; + T1c = VADD(TE, TH); + TW = LDW(&(W[TWVL * 8])); + TX = VZMULI(TW, VADD(T5, To)); + Tu = VBYI(VFNMS(LDK(KP951056516), Tt, VMUL(LDK(KP587785252), Ts))); + TQ = VBYI(VFMA(LDK(KP951056516), Ts, VMUL(LDK(KP587785252), Tt))); + Tp = VFNMS(LDK(KP250000000), To, T5); + Tr = VSUB(Tp, Tq); + TP = VADD(Tq, Tp); + T1 = LDW(&(W[TWVL * 4])); + Tv = VZMULI(T1, VSUB(Tr, Tu)); + T1a = LDW(&(W[0])); + T1b = VZMULI(T1a, VADD(TQ, TP)); + TO = LDW(&(W[TWVL * 16])); + TR = VZMULI(TO, VSUB(TP, TQ)); + T14 = LDW(&(W[TWVL * 12])); + T15 = VZMULI(T14, VADD(Tu, Tr)); + TD = VBYI(VFNMS(LDK(KP951056516), TC, VMUL(LDK(KP587785252), Tz))); + T10 = VBYI(VFMA(LDK(KP951056516), Tz, VMUL(LDK(KP587785252), TC))); + TI = VFNMS(LDK(KP250000000), TH, TE); + TK = VSUB(TI, TJ); + TZ = VADD(TJ, TI); + Tw = LDW(&(W[TWVL * 2])); + TL = VZMUL(Tw, VADD(TD, TK)); + T16 = LDW(&(W[TWVL * 10])); + T17 = VZMUL(T16, VADD(T10, TZ)); + TS = LDW(&(W[TWVL * 14])); + TT = VZMUL(TS, VSUB(TK, TD)); + TY = LDW(&(W[TWVL * 6])); + T11 = VZMUL(TY, VSUB(TZ, T10)); + TM = VADD(Tv, TL); + ST(&(Rp[WS(rs, 1)]), TM, ms, &(Rp[WS(rs, 1)])); + TU = VADD(TR, TT); + ST(&(Rp[WS(rs, 4)]), TU, ms, &(Rp[0])); + T1e = VCONJ(VSUB(T1c, T1b)); + ST(&(Rm[0]), T1e, -ms, &(Rm[0])); + TN = VCONJ(VSUB(TL, Tv)); + ST(&(Rm[WS(rs, 1)]), TN, -ms, &(Rm[WS(rs, 1)])); + T1d = VADD(T1b, T1c); + ST(&(Rp[0]), T1d, ms, &(Rp[0])); + T19 = VCONJ(VSUB(T17, T15)); + ST(&(Rm[WS(rs, 3)]), T19, -ms, &(Rm[WS(rs, 1)])); + T13 = VCONJ(VSUB(T11, TX)); + ST(&(Rm[WS(rs, 2)]), T13, -ms, &(Rm[0])); + TV = VCONJ(VSUB(TT, TR)); + ST(&(Rm[WS(rs, 4)]), TV, -ms, &(Rm[0])); + T18 = VADD(T15, T17); + ST(&(Rp[WS(rs, 3)]), T18, ms, &(Rp[WS(rs, 1)])); + T12 = VADD(TX, T11); + ST(&(Rp[WS(rs, 2)]), T12, ms, &(Rp[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 10, XSIMD_STRING("hc2cbdftv_10"), twinstr, &GENUS, {55, 24, 6, 0} }; + +void XSIMD(codelet_hc2cbdftv_10) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_10, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_12.c new file mode 100644 index 000000000..0de7fbc0d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_12.c @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 12 -dif -sign 1 -name hc2cbdftv_12 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 71 FP additions, 51 FP multiplications, + * (or, 45 additions, 25 multiplications, 26 fused multiply/add), + * 56 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 22)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(48, rs)) { + V Tk, Tw, Td, TA, T11, T1f, TF, TP, Tt, TB, TY, T1e; + { + V T2, Tm, T7, T8, Tp, Tq, T5, Tu, Tg, Tr, Tj, Tn, Tb, Tv, T3; + V T4, Te, Tf, Th, Ti, T9, Ta, T6, Tc, TZ, T10, TD, TE, To, Ts; + V TW, TX; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + Tm = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + T7 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + T8 = VCONJ(T7); + Tp = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tq = VCONJ(Tp); + T3 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T4 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + T5 = VFMACONJ(T4, T3); + Tu = VFNMSCONJ(T4, T3); + Te = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tf = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tg = VSUB(Te, Tf); + Tr = VADD(Te, Tf); + Th = LD(&(Rm[0]), -ms, &(Rm[0])); + Ti = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Tj = VSUB(Th, Ti); + Tn = VADD(Ti, Th); + T9 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Ta = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VFMACONJ(Ta, T9); + Tv = VFMSCONJ(Ta, T9); + Tk = VFMACONJ(Tj, Tg); + Tw = VSUB(Tu, Tv); + T6 = VFNMS(LDK(KP500000000), T5, T2); + Tc = VFNMS(LDK(KP500000000), Tb, T8); + Td = VSUB(T6, Tc); + TA = VADD(T6, Tc); + TZ = VFMACONJ(Tn, Tm); + T10 = VFMACONJ(Tp, Tr); + T11 = VSUB(TZ, T10); + T1f = VADD(TZ, T10); + TD = VFNMSCONJ(Tj, Tg); + TE = VADD(Tu, Tv); + TF = VMUL(LDK(KP866025403), VSUB(TD, TE)); + TP = VMUL(LDK(KP866025403), VADD(TE, TD)); + To = VFNMS(LDK(KP500000000), VCONJ(Tn), Tm); + Ts = VFNMS(LDK(KP500000000), Tr, Tq); + Tt = VSUB(To, Ts); + TB = VADD(To, Ts); + TW = VADD(T2, T5); + TX = VFMACONJ(T7, Tb); + TY = VSUB(TW, TX); + T1e = VADD(TW, TX); + } + { + V T1l, T12, TG, TU, Ty, T1k, TV, TC, Tz, TT, Tl, Tx, T1, T1j, TH; + V TI, T1n, T1m, T14, T13, T18, T1g, TQ, T16, TM, T1c, T17, T1d, TO, TN; + V T15, TK, TL, TJ, T1b, TR, TS, T1i, T1h, T1a, T19; + T1l = VADD(T1e, T1f); + TV = LDW(&(W[TWVL * 4])); + T12 = VZMULI(TV, VFNMSI(T11, TY)); + TC = VSUB(TA, TB); + Tz = LDW(&(W[TWVL * 18])); + TG = VZMUL(Tz, VFNMSI(TF, TC)); + TT = LDW(&(W[TWVL * 2])); + TU = VZMUL(TT, VFMAI(TF, TC)); + Tl = VFMA(LDK(KP866025403), Tk, Td); + Tx = VFMA(LDK(KP866025403), Tw, Tt); + T1 = LDW(&(W[TWVL * 20])); + Ty = VZMULI(T1, VFNMSI(Tx, Tl)); + T1j = LDW(&(W[0])); + T1k = VZMULI(T1j, VFMAI(Tx, Tl)); + TH = VADD(Ty, TG); + ST(&(Rp[WS(rs, 5)]), TH, ms, &(Rp[WS(rs, 1)])); + TI = VCONJ(VSUB(TG, Ty)); + ST(&(Rm[WS(rs, 5)]), TI, -ms, &(Rm[WS(rs, 1)])); + T1n = VCONJ(VSUB(T1l, T1k)); + ST(&(Rm[0]), T1n, -ms, &(Rm[0])); + T1m = VADD(T1k, T1l); + ST(&(Rp[0]), T1m, ms, &(Rp[0])); + T14 = VADD(TU, T12); + ST(&(Rp[WS(rs, 1)]), T14, ms, &(Rp[WS(rs, 1)])); + T13 = VCONJ(VSUB(TU, T12)); + ST(&(Rm[WS(rs, 1)]), T13, -ms, &(Rm[WS(rs, 1)])); + T17 = LDW(&(W[TWVL * 16])); + T18 = VZMULI(T17, VFMAI(T11, TY)); + T1d = LDW(&(W[TWVL * 10])); + T1g = VZMUL(T1d, VSUB(T1e, T1f)); + TO = VADD(TA, TB); + TN = LDW(&(W[TWVL * 6])); + TQ = VZMUL(TN, VFMAI(TP, TO)); + T15 = LDW(&(W[TWVL * 14])); + T16 = VZMUL(T15, VFNMSI(TP, TO)); + TK = VFNMS(LDK(KP866025403), Tk, Td); + TL = VFNMS(LDK(KP866025403), Tw, Tt); + TJ = LDW(&(W[TWVL * 8])); + TM = VZMULI(TJ, VFMAI(TL, TK)); + T1b = LDW(&(W[TWVL * 12])); + T1c = VZMULI(T1b, VFNMSI(TL, TK)); + TR = VADD(TM, TQ); + ST(&(Rp[WS(rs, 2)]), TR, ms, &(Rp[0])); + TS = VCONJ(VSUB(TQ, TM)); + ST(&(Rm[WS(rs, 2)]), TS, -ms, &(Rm[0])); + T1i = VCONJ(VSUB(T1g, T1c)); + ST(&(Rm[WS(rs, 3)]), T1i, -ms, &(Rm[WS(rs, 1)])); + T1h = VADD(T1c, T1g); + ST(&(Rp[WS(rs, 3)]), T1h, ms, &(Rp[WS(rs, 1)])); + T1a = VADD(T16, T18); + ST(&(Rp[WS(rs, 4)]), T1a, ms, &(Rp[0])); + T19 = VCONJ(VSUB(T16, T18)); + ST(&(Rm[WS(rs, 4)]), T19, -ms, &(Rm[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 12, XSIMD_STRING("hc2cbdftv_12"), twinstr, &GENUS, {45, 25, 26, 0} }; + +void XSIMD(codelet_hc2cbdftv_12) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_12, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 12 -dif -sign 1 -name hc2cbdftv_12 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 71 FP additions, 30 FP multiplications, + * (or, 67 additions, 26 multiplications, 4 fused multiply/add), + * 90 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 22)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(48, rs)) { + V TY, TZ, Tf, TC, Tq, TG, Tm, TF, Ty, TD, T13, T1h, T2, T9, T3; + V T5, T6, Tc, Tb, Td, T8, T4, Ta, T7, Te, To, Tp, Tr, Tv, Ti; + V Ts, Tl, Tw, Tu, Tg, Th, Tj, Tk, Tt, Tx, T11, T12; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T8 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + T9 = VCONJ(T8); + T3 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T4 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + T5 = VCONJ(T4); + T6 = VADD(T3, T5); + Tc = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Ta = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VCONJ(Ta); + Td = VADD(Tb, Tc); + TY = VADD(T2, T6); + TZ = VADD(T9, Td); + T7 = VFNMS(LDK(KP500000000), T6, T2); + Te = VFNMS(LDK(KP500000000), Td, T9); + Tf = VSUB(T7, Te); + TC = VADD(T7, Te); + To = VSUB(T3, T5); + Tp = VSUB(Tb, Tc); + Tq = VMUL(LDK(KP866025403), VSUB(To, Tp)); + TG = VADD(To, Tp); + Tr = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tu = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tv = VCONJ(Tu); + Tg = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Th = LD(&(Rm[0]), -ms, &(Rm[0])); + Ti = VCONJ(VSUB(Tg, Th)); + Ts = VCONJ(VADD(Tg, Th)); + Tj = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tk = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tl = VSUB(Tj, Tk); + Tw = VADD(Tj, Tk); + Tm = VMUL(LDK(KP866025403), VSUB(Ti, Tl)); + TF = VADD(Ti, Tl); + Tt = VFNMS(LDK(KP500000000), Ts, Tr); + Tx = VFNMS(LDK(KP500000000), Tw, Tv); + Ty = VSUB(Tt, Tx); + TD = VADD(Tt, Tx); + T11 = VADD(Tr, Ts); + T12 = VADD(Tv, Tw); + T13 = VBYI(VSUB(T11, T12)); + T1h = VADD(T11, T12); + { + V T1n, T1i, T14, T1a, TA, T1m, TS, T18, TO, T1e, TI, TW, T1g, T1f, T10; + V TX, T19, Tn, Tz, T1, T1l, TQ, TR, TP, T17, TM, TN, TL, T1d, TE; + V TH, TB, TV, TJ, T1p, T1k, TT, T1o, TK, TU, T1j, T1b, T16, T1c, T15; + T1g = VADD(TY, TZ); + T1n = VADD(T1g, T1h); + T1f = LDW(&(W[TWVL * 10])); + T1i = VZMUL(T1f, VSUB(T1g, T1h)); + T10 = VSUB(TY, TZ); + TX = LDW(&(W[TWVL * 4])); + T14 = VZMULI(TX, VSUB(T10, T13)); + T19 = LDW(&(W[TWVL * 16])); + T1a = VZMULI(T19, VADD(T10, T13)); + Tn = VSUB(Tf, Tm); + Tz = VBYI(VADD(Tq, Ty)); + T1 = LDW(&(W[TWVL * 20])); + TA = VZMULI(T1, VSUB(Tn, Tz)); + T1l = LDW(&(W[0])); + T1m = VZMULI(T1l, VADD(Tn, Tz)); + TQ = VBYI(VMUL(LDK(KP866025403), VADD(TG, TF))); + TR = VADD(TC, TD); + TP = LDW(&(W[TWVL * 6])); + TS = VZMUL(TP, VADD(TQ, TR)); + T17 = LDW(&(W[TWVL * 14])); + T18 = VZMUL(T17, VSUB(TR, TQ)); + TM = VADD(Tf, Tm); + TN = VBYI(VSUB(Ty, Tq)); + TL = LDW(&(W[TWVL * 8])); + TO = VZMULI(TL, VADD(TM, TN)); + T1d = LDW(&(W[TWVL * 12])); + T1e = VZMULI(T1d, VSUB(TM, TN)); + TE = VSUB(TC, TD); + TH = VBYI(VMUL(LDK(KP866025403), VSUB(TF, TG))); + TB = LDW(&(W[TWVL * 18])); + TI = VZMUL(TB, VSUB(TE, TH)); + TV = LDW(&(W[TWVL * 2])); + TW = VZMUL(TV, VADD(TH, TE)); + TJ = VADD(TA, TI); + ST(&(Rp[WS(rs, 5)]), TJ, ms, &(Rp[WS(rs, 1)])); + T1p = VCONJ(VSUB(T1n, T1m)); + ST(&(Rm[0]), T1p, -ms, &(Rm[0])); + T1k = VCONJ(VSUB(T1i, T1e)); + ST(&(Rm[WS(rs, 3)]), T1k, -ms, &(Rm[WS(rs, 1)])); + TT = VADD(TO, TS); + ST(&(Rp[WS(rs, 2)]), TT, ms, &(Rp[0])); + T1o = VADD(T1m, T1n); + ST(&(Rp[0]), T1o, ms, &(Rp[0])); + TK = VCONJ(VSUB(TI, TA)); + ST(&(Rm[WS(rs, 5)]), TK, -ms, &(Rm[WS(rs, 1)])); + TU = VCONJ(VSUB(TS, TO)); + ST(&(Rm[WS(rs, 2)]), TU, -ms, &(Rm[0])); + T1j = VADD(T1e, T1i); + ST(&(Rp[WS(rs, 3)]), T1j, ms, &(Rp[WS(rs, 1)])); + T1b = VCONJ(VSUB(T18, T1a)); + ST(&(Rm[WS(rs, 4)]), T1b, -ms, &(Rm[0])); + T16 = VADD(TW, T14); + ST(&(Rp[WS(rs, 1)]), T16, ms, &(Rp[WS(rs, 1)])); + T1c = VADD(T18, T1a); + ST(&(Rp[WS(rs, 4)]), T1c, ms, &(Rp[0])); + T15 = VCONJ(VSUB(TW, T14)); + ST(&(Rm[WS(rs, 1)]), T15, -ms, &(Rm[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 12, XSIMD_STRING("hc2cbdftv_12"), twinstr, &GENUS, {67, 26, 4, 0} }; + +void XSIMD(codelet_hc2cbdftv_12) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_12, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_16.c new file mode 100644 index 000000000..9aeee560f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_16.c @@ -0,0 +1,428 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:12 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 16 -dif -sign 1 -name hc2cbdftv_16 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 103 FP additions, 80 FP multiplications, + * (or, 53 additions, 30 multiplications, 50 fused multiply/add), + * 79 stack variables, 3 constants, and 32 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 30)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(64, rs)) { + V T8, Tv, TE, T1t, TP, T1w, T10, T1p, Tn, Tw, T13, T1q, TL, T1x, TS; + V T1u; + { + V T4, TA, Tu, TC, T7, TN, Tr, TB, T2, T3, Ts, Tt, T5, T6, Tp; + V Tq, TD, TO, TY, TZ, Tb, TF, Tl, TJ, Te, TG, Ti, TI, T9, Ta; + V Tj, Tk, Tc, Td, Tg, Th, Tf, Tm, T11, T12, TH, TK, TQ, TR; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VFMACONJ(T3, T2); + TA = VFNMSCONJ(T3, T2); + Ts = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + Tt = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tu = VFMACONJ(Tt, Ts); + TC = VFMSCONJ(Tt, Ts); + T5 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + T7 = VFMACONJ(T6, T5); + TN = VFNMSCONJ(T6, T5); + Tp = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Tq = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Tr = VFMACONJ(Tq, Tp); + TB = VFNMSCONJ(Tq, Tp); + T8 = VSUB(T4, T7); + Tv = VSUB(Tr, Tu); + TD = VADD(TB, TC); + TE = VFMA(LDK(KP707106781), TD, TA); + T1t = VFNMS(LDK(KP707106781), TD, TA); + TO = VSUB(TB, TC); + TP = VFMA(LDK(KP707106781), TO, TN); + T1w = VFNMS(LDK(KP707106781), TO, TN); + TY = VADD(T4, T7); + TZ = VADD(Tr, Tu); + T10 = VADD(TY, TZ); + T1p = VSUB(TY, TZ); + T9 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Ta = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + Tb = VFMACONJ(Ta, T9); + TF = VFNMSCONJ(Ta, T9); + Tj = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tk = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Tl = VFMACONJ(Tk, Tj); + TJ = VFNMSCONJ(Tk, Tj); + Tc = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Td = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Te = VFMACONJ(Td, Tc); + TG = VFNMSCONJ(Td, Tc); + Tg = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + Th = LD(&(Rm[0]), -ms, &(Rm[0])); + Ti = VFMACONJ(Th, Tg); + TI = VFMSCONJ(Th, Tg); + Tf = VSUB(Tb, Te); + Tm = VSUB(Ti, Tl); + Tn = VADD(Tf, Tm); + Tw = VSUB(Tf, Tm); + T11 = VADD(Tb, Te); + T12 = VADD(Ti, Tl); + T13 = VADD(T11, T12); + T1q = VSUB(T11, T12); + TH = VFNMS(LDK(KP414213562), TG, TF); + TK = VFMA(LDK(KP414213562), TJ, TI); + TL = VADD(TH, TK); + T1x = VSUB(TH, TK); + TQ = VFMA(LDK(KP414213562), TF, TG); + TR = VFNMS(LDK(KP414213562), TI, TJ); + TS = VADD(TQ, TR); + T1u = VSUB(TQ, TR); + } + { + V T1j, T1R, T1c, T1J, T1g, T1l, T1N, T1T, T1Q, T1a, T1b, T19, T1I, T1e, T1f; + V T1d, T1k, T1L, T1M, T1K, T1S, T1h, T1U, T1V, T1i, T1m, T1O, T1P, T1n, T14; + V T1r, Ty, T1D, TU, T16, T1z, T1F, TX, T1o, To, Tx, T1, T1C, TM, TT; + V Tz, T15, T1v, T1y, T1s, T1E, TV, T1G, T1H, TW, T17, T1A, T1B, T18; + T1j = VADD(T10, T13); + T1Q = LDW(&(W[TWVL * 22])); + T1R = VZMUL(T1Q, VFNMSI(T1q, T1p)); + T1a = VFMA(LDK(KP707106781), Tn, T8); + T1b = VFMA(LDK(KP707106781), Tw, Tv); + T19 = LDW(&(W[TWVL * 26])); + T1c = VZMUL(T19, VFNMSI(T1b, T1a)); + T1I = LDW(&(W[TWVL * 2])); + T1J = VZMUL(T1I, VFMAI(T1b, T1a)); + T1e = VFMA(LDK(KP923879532), TL, TE); + T1f = VFMA(LDK(KP923879532), TS, TP); + T1d = LDW(&(W[TWVL * 28])); + T1g = VZMULI(T1d, VFNMSI(T1f, T1e)); + T1k = LDW(&(W[0])); + T1l = VZMULI(T1k, VFMAI(T1f, T1e)); + T1L = VFMA(LDK(KP923879532), T1u, T1t); + T1M = VFNMS(LDK(KP923879532), T1x, T1w); + T1K = LDW(&(W[TWVL * 4])); + T1N = VZMULI(T1K, VFNMSI(T1M, T1L)); + T1S = LDW(&(W[TWVL * 24])); + T1T = VZMULI(T1S, VFMAI(T1M, T1L)); + T1h = VCONJ(VSUB(T1c, T1g)); + ST(&(Rm[WS(rs, 7)]), T1h, -ms, &(Rm[WS(rs, 1)])); + T1U = VCONJ(VSUB(T1R, T1T)); + ST(&(Rm[WS(rs, 6)]), T1U, -ms, &(Rm[0])); + T1V = VADD(T1R, T1T); + ST(&(Rp[WS(rs, 6)]), T1V, ms, &(Rp[0])); + T1i = VADD(T1c, T1g); + ST(&(Rp[WS(rs, 7)]), T1i, ms, &(Rp[WS(rs, 1)])); + T1m = VCONJ(VSUB(T1j, T1l)); + ST(&(Rm[0]), T1m, -ms, &(Rm[0])); + T1O = VCONJ(VSUB(T1J, T1N)); + ST(&(Rm[WS(rs, 1)]), T1O, -ms, &(Rm[WS(rs, 1)])); + T1P = VADD(T1J, T1N); + ST(&(Rp[WS(rs, 1)]), T1P, ms, &(Rp[WS(rs, 1)])); + T1n = VADD(T1j, T1l); + ST(&(Rp[0]), T1n, ms, &(Rp[0])); + TX = LDW(&(W[TWVL * 14])); + T14 = VZMUL(TX, VSUB(T10, T13)); + T1o = LDW(&(W[TWVL * 6])); + T1r = VZMUL(T1o, VFMAI(T1q, T1p)); + To = VFNMS(LDK(KP707106781), Tn, T8); + Tx = VFNMS(LDK(KP707106781), Tw, Tv); + T1 = LDW(&(W[TWVL * 10])); + Ty = VZMUL(T1, VFNMSI(Tx, To)); + T1C = LDW(&(W[TWVL * 18])); + T1D = VZMUL(T1C, VFMAI(Tx, To)); + TM = VFNMS(LDK(KP923879532), TL, TE); + TT = VFNMS(LDK(KP923879532), TS, TP); + Tz = LDW(&(W[TWVL * 12])); + TU = VZMULI(Tz, VFNMSI(TT, TM)); + T15 = LDW(&(W[TWVL * 16])); + T16 = VZMULI(T15, VFMAI(TT, TM)); + T1v = VFNMS(LDK(KP923879532), T1u, T1t); + T1y = VFMA(LDK(KP923879532), T1x, T1w); + T1s = LDW(&(W[TWVL * 8])); + T1z = VZMULI(T1s, VFMAI(T1y, T1v)); + T1E = LDW(&(W[TWVL * 20])); + T1F = VZMULI(T1E, VFNMSI(T1y, T1v)); + TV = VCONJ(VSUB(Ty, TU)); + ST(&(Rm[WS(rs, 3)]), TV, -ms, &(Rm[WS(rs, 1)])); + T1G = VCONJ(VSUB(T1D, T1F)); + ST(&(Rm[WS(rs, 5)]), T1G, -ms, &(Rm[WS(rs, 1)])); + T1H = VADD(T1D, T1F); + ST(&(Rp[WS(rs, 5)]), T1H, ms, &(Rp[WS(rs, 1)])); + TW = VADD(Ty, TU); + ST(&(Rp[WS(rs, 3)]), TW, ms, &(Rp[WS(rs, 1)])); + T17 = VCONJ(VSUB(T14, T16)); + ST(&(Rm[WS(rs, 4)]), T17, -ms, &(Rm[0])); + T1A = VCONJ(VSUB(T1r, T1z)); + ST(&(Rm[WS(rs, 2)]), T1A, -ms, &(Rm[0])); + T1B = VADD(T1r, T1z); + ST(&(Rp[WS(rs, 2)]), T1B, ms, &(Rp[0])); + T18 = VADD(T14, T16); + ST(&(Rp[WS(rs, 4)]), T18, ms, &(Rp[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 16, XSIMD_STRING("hc2cbdftv_16"), twinstr, &GENUS, {53, 30, 50, 0} }; + +void XSIMD(codelet_hc2cbdftv_16) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_16, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 16 -dif -sign 1 -name hc2cbdftv_16 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 103 FP additions, 42 FP multiplications, + * (or, 99 additions, 38 multiplications, 4 fused multiply/add), + * 83 stack variables, 3 constants, and 32 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 30)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(64, rs)) { + V Tf, T16, TZ, T1C, TI, T1a, TV, T1D, T1F, T1G, Ty, T19, TC, T17, TS; + V T10; + { + V T2, TD, T4, TF, Tc, Tb, Td, T6, T8, T9, T3, TE, Ta, T7, T5; + V Te, TX, TY, TG, TH, TT, TU, Tj, TM, Tw, TQ, Tn, TN, Ts, TP; + V Tg, Ti, Th, Tt, Tv, Tu, Tk, Tm, Tl, Tr, Tq, Tp, To, Tx, TA; + V TB, TO, TR; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + TD = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VCONJ(T3); + TE = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + TF = VCONJ(TE); + Tc = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + Ta = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VCONJ(Ta); + Td = VSUB(Tb, Tc); + T6 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + T8 = VCONJ(T7); + T9 = VSUB(T6, T8); + T5 = VSUB(T2, T4); + Te = VMUL(LDK(KP707106781), VADD(T9, Td)); + Tf = VADD(T5, Te); + T16 = VSUB(T5, Te); + TX = VADD(T2, T4); + TY = VADD(TD, TF); + TZ = VSUB(TX, TY); + T1C = VADD(TX, TY); + TG = VSUB(TD, TF); + TH = VMUL(LDK(KP707106781), VSUB(T9, Td)); + TI = VADD(TG, TH); + T1a = VSUB(TH, TG); + TT = VADD(T6, T8); + TU = VADD(Tb, Tc); + TV = VSUB(TT, TU); + T1D = VADD(TT, TU); + Tg = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Th = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + Ti = VCONJ(Th); + Tj = VSUB(Tg, Ti); + TM = VADD(Tg, Ti); + Tt = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tu = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Tv = VCONJ(Tu); + Tw = VSUB(Tt, Tv); + TQ = VADD(Tt, Tv); + Tk = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tl = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tm = VCONJ(Tl); + Tn = VSUB(Tk, Tm); + TN = VADD(Tk, Tm); + Tr = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + Tp = LD(&(Rm[0]), -ms, &(Rm[0])); + Tq = VCONJ(Tp); + Ts = VSUB(Tq, Tr); + TP = VADD(Tq, Tr); + T1F = VADD(TM, TN); + T1G = VADD(TP, TQ); + To = VFNMS(LDK(KP382683432), Tn, VMUL(LDK(KP923879532), Tj)); + Tx = VFMA(LDK(KP923879532), Ts, VMUL(LDK(KP382683432), Tw)); + Ty = VADD(To, Tx); + T19 = VSUB(To, Tx); + TA = VFMA(LDK(KP382683432), Tj, VMUL(LDK(KP923879532), Tn)); + TB = VFNMS(LDK(KP382683432), Ts, VMUL(LDK(KP923879532), Tw)); + TC = VADD(TA, TB); + T17 = VSUB(TA, TB); + TO = VSUB(TM, TN); + TR = VSUB(TP, TQ); + TS = VMUL(LDK(KP707106781), VSUB(TO, TR)); + T10 = VMUL(LDK(KP707106781), VADD(TO, TR)); + } + { + V T21, T1W, T1u, T20, T1I, T1O, TK, T1S, T12, T1e, T1k, T1A, T1o, T1w, T1c; + V T1M, T1U, T1V, T1T, T1s, T1t, T1r, T1Z, T1E, T1H, T1B, T1N, Tz, TJ, T1; + V T1R, TW, T11, TL, T1d, T1i, T1j, T1h, T1z, T1m, T1n, T1l, T1v, T18, T1b; + V T15, T1L, T13, T1g, T1X, T23, T14, T1f, T1Y, T22, T1p, T1y, T1J, T1Q, T1q; + V T1x, T1K, T1P; + T1U = VADD(T1C, T1D); + T1V = VADD(T1F, T1G); + T21 = VADD(T1U, T1V); + T1T = LDW(&(W[TWVL * 14])); + T1W = VZMUL(T1T, VSUB(T1U, T1V)); + T1s = VADD(Tf, Ty); + T1t = VBYI(VADD(TI, TC)); + T1r = LDW(&(W[TWVL * 28])); + T1u = VZMULI(T1r, VSUB(T1s, T1t)); + T1Z = LDW(&(W[0])); + T20 = VZMULI(T1Z, VADD(T1s, T1t)); + T1E = VSUB(T1C, T1D); + T1H = VBYI(VSUB(T1F, T1G)); + T1B = LDW(&(W[TWVL * 22])); + T1I = VZMUL(T1B, VSUB(T1E, T1H)); + T1N = LDW(&(W[TWVL * 6])); + T1O = VZMUL(T1N, VADD(T1E, T1H)); + Tz = VSUB(Tf, Ty); + TJ = VBYI(VSUB(TC, TI)); + T1 = LDW(&(W[TWVL * 12])); + TK = VZMULI(T1, VADD(Tz, TJ)); + T1R = LDW(&(W[TWVL * 16])); + T1S = VZMULI(T1R, VSUB(Tz, TJ)); + TW = VBYI(VSUB(TS, TV)); + T11 = VSUB(TZ, T10); + TL = LDW(&(W[TWVL * 10])); + T12 = VZMUL(TL, VADD(TW, T11)); + T1d = LDW(&(W[TWVL * 18])); + T1e = VZMUL(T1d, VSUB(T11, TW)); + T1i = VBYI(VADD(T1a, T19)); + T1j = VADD(T16, T17); + T1h = LDW(&(W[TWVL * 4])); + T1k = VZMULI(T1h, VADD(T1i, T1j)); + T1z = LDW(&(W[TWVL * 24])); + T1A = VZMULI(T1z, VSUB(T1j, T1i)); + T1m = VBYI(VADD(TV, TS)); + T1n = VADD(TZ, T10); + T1l = LDW(&(W[TWVL * 2])); + T1o = VZMUL(T1l, VADD(T1m, T1n)); + T1v = LDW(&(W[TWVL * 26])); + T1w = VZMUL(T1v, VSUB(T1n, T1m)); + T18 = VSUB(T16, T17); + T1b = VBYI(VSUB(T19, T1a)); + T15 = LDW(&(W[TWVL * 20])); + T1c = VZMULI(T15, VSUB(T18, T1b)); + T1L = LDW(&(W[TWVL * 8])); + T1M = VZMULI(T1L, VADD(T1b, T18)); + T13 = VADD(TK, T12); + ST(&(Rp[WS(rs, 3)]), T13, ms, &(Rp[WS(rs, 1)])); + T1g = VCONJ(VSUB(T1e, T1c)); + ST(&(Rm[WS(rs, 5)]), T1g, -ms, &(Rm[WS(rs, 1)])); + T1X = VADD(T1S, T1W); + ST(&(Rp[WS(rs, 4)]), T1X, ms, &(Rp[0])); + T23 = VCONJ(VSUB(T21, T20)); + ST(&(Rm[0]), T23, -ms, &(Rm[0])); + T14 = VCONJ(VSUB(T12, TK)); + ST(&(Rm[WS(rs, 3)]), T14, -ms, &(Rm[WS(rs, 1)])); + T1f = VADD(T1c, T1e); + ST(&(Rp[WS(rs, 5)]), T1f, ms, &(Rp[WS(rs, 1)])); + T1Y = VCONJ(VSUB(T1W, T1S)); + ST(&(Rm[WS(rs, 4)]), T1Y, -ms, &(Rm[0])); + T22 = VADD(T20, T21); + ST(&(Rp[0]), T22, ms, &(Rp[0])); + T1p = VADD(T1k, T1o); + ST(&(Rp[WS(rs, 1)]), T1p, ms, &(Rp[WS(rs, 1)])); + T1y = VCONJ(VSUB(T1w, T1u)); + ST(&(Rm[WS(rs, 7)]), T1y, -ms, &(Rm[WS(rs, 1)])); + T1J = VADD(T1A, T1I); + ST(&(Rp[WS(rs, 6)]), T1J, ms, &(Rp[0])); + T1Q = VCONJ(VSUB(T1O, T1M)); + ST(&(Rm[WS(rs, 2)]), T1Q, -ms, &(Rm[0])); + T1q = VCONJ(VSUB(T1o, T1k)); + ST(&(Rm[WS(rs, 1)]), T1q, -ms, &(Rm[WS(rs, 1)])); + T1x = VADD(T1u, T1w); + ST(&(Rp[WS(rs, 7)]), T1x, ms, &(Rp[WS(rs, 1)])); + T1K = VCONJ(VSUB(T1I, T1A)); + ST(&(Rm[WS(rs, 6)]), T1K, -ms, &(Rm[0])); + T1P = VADD(T1M, T1O); + ST(&(Rp[WS(rs, 2)]), T1P, ms, &(Rp[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 16, XSIMD_STRING("hc2cbdftv_16"), twinstr, &GENUS, {99, 38, 4, 0} }; + +void XSIMD(codelet_hc2cbdftv_16) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_16, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_2.c new file mode 100644 index 000000000..16f6e5fe2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_2.c @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 2 -dif -sign 1 -name hc2cbdftv_2 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 5 FP additions, 4 FP multiplications, + * (or, 3 additions, 2 multiplications, 2 fused multiply/add), + * 8 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 2)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(8, rs)) { + V T5, T4, T2, T3, T1, T6, T7; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[0]), -ms, &(Rm[0])); + T5 = VFMACONJ(T3, T2); + T1 = LDW(&(W[0])); + T4 = VZMULI(T1, VFNMSCONJ(T3, T2)); + T6 = VADD(T4, T5); + ST(&(Rp[0]), T6, ms, &(Rp[0])); + T7 = VCONJ(VSUB(T5, T4)); + ST(&(Rm[0]), T7, -ms, &(Rm[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 2, XSIMD_STRING("hc2cbdftv_2"), twinstr, &GENUS, {3, 2, 2, 0} }; + +void XSIMD(codelet_hc2cbdftv_2) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_2, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 2 -dif -sign 1 -name hc2cbdftv_2 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 5 FP additions, 2 FP multiplications, + * (or, 5 additions, 2 multiplications, 0 fused multiply/add), + * 9 stack variables, 0 constants, and 4 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 2)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(8, rs)) { + V T6, T5, T2, T4, T3, T1, T7, T8; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[0]), -ms, &(Rm[0])); + T4 = VCONJ(T3); + T6 = VADD(T2, T4); + T1 = LDW(&(W[0])); + T5 = VZMULI(T1, VSUB(T2, T4)); + T7 = VADD(T5, T6); + ST(&(Rp[0]), T7, ms, &(Rp[0])); + T8 = VCONJ(VSUB(T6, T5)); + ST(&(Rm[0]), T8, -ms, &(Rm[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 2, XSIMD_STRING("hc2cbdftv_2"), twinstr, &GENUS, {5, 2, 0, 0} }; + +void XSIMD(codelet_hc2cbdftv_2) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_2, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_20.c new file mode 100644 index 000000000..44090680b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_20.c @@ -0,0 +1,545 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:12 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 20 -dif -sign 1 -name hc2cbdftv_20 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 143 FP additions, 108 FP multiplications, + * (or, 77 additions, 42 multiplications, 66 fused multiply/add), + * 110 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 38)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(80, rs)) { + V T4, TF, Tl, T2a, T1d, T1Y, T29, TK, TU, T1e, Tj, Tk, TI, TJ, T19; + V T1b, T25, T27, TB, T1l, TO, T1o; + { + V TS, TT, T7, Tz, Ta, Tw, Tb, TG, T20, T1Z, T10, TX, Te, Ts, Th; + V Tp, Ti, TH, T23, T22, T17, T14, T2, T3, TD, TE, TV, TZ, TY, TW; + V T5, T6, Tx, Ty, T8, T9, Tu, Tv, T12, T16, T15, T13, Tc, Td, Tq; + V Tr, Tf, Tg, Tn, To, T11, T18, T21, T24, Tt, TA, TM, TN; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VFNMSCONJ(T3, T2); + TS = VFMACONJ(T3, T2); + TD = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + TE = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + TF = VFNMSCONJ(TE, TD); + TT = VFMACONJ(TE, TD); + T5 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + T7 = VFNMSCONJ(T6, T5); + TV = VFMACONJ(T6, T5); + Tx = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Ty = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + Tz = VFNMSCONJ(Ty, Tx); + TZ = VFMACONJ(Ty, Tx); + T8 = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + T9 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Ta = VFMSCONJ(T9, T8); + TY = VFMACONJ(T9, T8); + Tu = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + Tv = LD(&(Rm[0]), -ms, &(Rm[0])); + Tw = VFNMSCONJ(Tv, Tu); + TW = VFMACONJ(Tv, Tu); + Tb = VADD(T7, Ta); + TG = VADD(Tw, Tz); + T20 = VADD(TY, TZ); + T1Z = VADD(TV, TW); + T10 = VSUB(TY, TZ); + TX = VSUB(TV, TW); + Tc = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + Td = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Te = VFNMSCONJ(Td, Tc); + T12 = VFMACONJ(Td, Tc); + Tq = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + Tr = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Ts = VFMSCONJ(Tr, Tq); + T16 = VFMACONJ(Tr, Tq); + Tf = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Tg = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + Th = VFMSCONJ(Tg, Tf); + T15 = VFMACONJ(Tg, Tf); + Tn = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + To = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + Tp = VFMSCONJ(To, Tn); + T13 = VFMACONJ(To, Tn); + Ti = VADD(Te, Th); + TH = VADD(Tp, Ts); + T23 = VADD(T15, T16); + T22 = VADD(T12, T13); + T17 = VSUB(T15, T16); + T14 = VSUB(T12, T13); + Tl = VSUB(Tb, Ti); + T2a = VSUB(T22, T23); + T1d = VSUB(T14, T17); + T1Y = VADD(TS, TT); + T29 = VSUB(T1Z, T20); + TK = VSUB(TG, TH); + TU = VSUB(TS, TT); + T1e = VSUB(TX, T10); + Tj = VADD(Tb, Ti); + Tk = VFNMS(LDK(KP250000000), Tj, T4); + TI = VADD(TG, TH); + TJ = VFNMS(LDK(KP250000000), TI, TF); + T11 = VADD(TX, T10); + T18 = VADD(T14, T17); + T19 = VADD(T11, T18); + T1b = VSUB(T11, T18); + T21 = VADD(T1Z, T20); + T24 = VADD(T22, T23); + T25 = VADD(T21, T24); + T27 = VSUB(T21, T24); + Tt = VSUB(Tp, Ts); + TA = VSUB(Tw, Tz); + TB = VFNMS(LDK(KP618033988), TA, Tt); + T1l = VFMA(LDK(KP618033988), Tt, TA); + TM = VSUB(Te, Th); + TN = VSUB(T7, Ta); + TO = VFNMS(LDK(KP618033988), TN, TM); + T1o = VFMA(LDK(KP618033988), TM, TN); + } + { + V T2B, T1S, T1I, T1W, T2c, T2w, T2i, T2q, T1g, T1K, T1s, T1C, T1q, T2A, T1Q; + V T2m, TQ, T2u, T1y, T2g, T1R, T1G, T1H, T1F, T1V, T1h, T1i, T2s, T2D, T1D; + V T2x, T2y, T2C, T1u, T1t, T1E, T1L, T2d, T2r, T1U, T2e, T2j, T2k, T1T, T1M; + T2B = VADD(T1Y, T25); + T1R = LDW(&(W[TWVL * 18])); + T1S = VZMUL(T1R, VADD(TU, T19)); + T1G = VADD(T4, Tj); + T1H = VADD(TF, TI); + T1F = LDW(&(W[TWVL * 28])); + T1I = VZMULI(T1F, VFNMSI(T1H, T1G)); + T1V = LDW(&(W[TWVL * 8])); + T1W = VZMULI(T1V, VFMAI(T1H, T1G)); + { + V T2b, T2p, T28, T2o, T26, T1X, T2v, T2h, T2n, T1f, T1B, T1c, T1A, T1a, TR; + V T1J, T1r, T1z, T1m, T1O, T1p, T1P, T1k, T1n, T1j, T2z, T1N, T2l, TC, T1w; + V TP, T1x, Tm, TL, T1, T2t, T1v, T2f; + T2b = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T2a, T29)); + T2p = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T29, T2a)); + T26 = VFNMS(LDK(KP250000000), T25, T1Y); + T28 = VFMA(LDK(KP559016994), T27, T26); + T2o = VFNMS(LDK(KP559016994), T27, T26); + T1X = LDW(&(W[TWVL * 6])); + T2c = VZMUL(T1X, VFNMSI(T2b, T28)); + T2v = LDW(&(W[TWVL * 22])); + T2w = VZMUL(T2v, VFNMSI(T2p, T2o)); + T2h = LDW(&(W[TWVL * 30])); + T2i = VZMUL(T2h, VFMAI(T2b, T28)); + T2n = LDW(&(W[TWVL * 14])); + T2q = VZMUL(T2n, VFMAI(T2p, T2o)); + T1f = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1e, T1d)); + T1B = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1d, T1e)); + T1a = VFNMS(LDK(KP250000000), T19, TU); + T1c = VFNMS(LDK(KP559016994), T1b, T1a); + T1A = VFMA(LDK(KP559016994), T1b, T1a); + TR = LDW(&(W[TWVL * 2])); + T1g = VZMUL(TR, VFNMSI(T1f, T1c)); + T1J = LDW(&(W[TWVL * 26])); + T1K = VZMUL(T1J, VFNMSI(T1B, T1A)); + T1r = LDW(&(W[TWVL * 34])); + T1s = VZMUL(T1r, VFMAI(T1f, T1c)); + T1z = LDW(&(W[TWVL * 10])); + T1C = VZMUL(T1z, VFMAI(T1B, T1A)); + T1k = VFMA(LDK(KP559016994), Tl, Tk); + T1m = VFNMS(LDK(KP951056516), T1l, T1k); + T1O = VFMA(LDK(KP951056516), T1l, T1k); + T1n = VFMA(LDK(KP559016994), TK, TJ); + T1p = VFMA(LDK(KP951056516), T1o, T1n); + T1P = VFNMS(LDK(KP951056516), T1o, T1n); + T1j = LDW(&(W[TWVL * 36])); + T1q = VZMULI(T1j, VFNMSI(T1p, T1m)); + T2z = LDW(&(W[0])); + T2A = VZMULI(T2z, VFMAI(T1p, T1m)); + T1N = LDW(&(W[TWVL * 20])); + T1Q = VZMULI(T1N, VFNMSI(T1P, T1O)); + T2l = LDW(&(W[TWVL * 16])); + T2m = VZMULI(T2l, VFMAI(T1P, T1O)); + Tm = VFNMS(LDK(KP559016994), Tl, Tk); + TC = VFMA(LDK(KP951056516), TB, Tm); + T1w = VFNMS(LDK(KP951056516), TB, Tm); + TL = VFNMS(LDK(KP559016994), TK, TJ); + TP = VFNMS(LDK(KP951056516), TO, TL); + T1x = VFMA(LDK(KP951056516), TO, TL); + T1 = LDW(&(W[TWVL * 4])); + TQ = VZMULI(T1, VFNMSI(TP, TC)); + T2t = LDW(&(W[TWVL * 24])); + T2u = VZMULI(T2t, VFMAI(T1x, T1w)); + T1v = LDW(&(W[TWVL * 12])); + T1y = VZMULI(T1v, VFNMSI(T1x, T1w)); + T2f = LDW(&(W[TWVL * 32])); + T2g = VZMULI(T2f, VFMAI(TP, TC)); + } + T1h = VADD(TQ, T1g); + ST(&(Rp[WS(rs, 1)]), T1h, ms, &(Rp[WS(rs, 1)])); + T1i = VCONJ(VSUB(T1g, TQ)); + ST(&(Rm[WS(rs, 1)]), T1i, -ms, &(Rm[WS(rs, 1)])); + T2s = VCONJ(VSUB(T2q, T2m)); + ST(&(Rm[WS(rs, 4)]), T2s, -ms, &(Rm[0])); + T2D = VCONJ(VSUB(T2B, T2A)); + ST(&(Rm[0]), T2D, -ms, &(Rm[0])); + T1D = VADD(T1y, T1C); + ST(&(Rp[WS(rs, 3)]), T1D, ms, &(Rp[WS(rs, 1)])); + T2x = VADD(T2u, T2w); + ST(&(Rp[WS(rs, 6)]), T2x, ms, &(Rp[0])); + T2y = VCONJ(VSUB(T2w, T2u)); + ST(&(Rm[WS(rs, 6)]), T2y, -ms, &(Rm[0])); + T2C = VADD(T2A, T2B); + ST(&(Rp[0]), T2C, ms, &(Rp[0])); + T1u = VCONJ(VSUB(T1s, T1q)); + ST(&(Rm[WS(rs, 9)]), T1u, -ms, &(Rm[WS(rs, 1)])); + T1t = VADD(T1q, T1s); + ST(&(Rp[WS(rs, 9)]), T1t, ms, &(Rp[WS(rs, 1)])); + T1E = VCONJ(VSUB(T1C, T1y)); + ST(&(Rm[WS(rs, 3)]), T1E, -ms, &(Rm[WS(rs, 1)])); + T1L = VADD(T1I, T1K); + ST(&(Rp[WS(rs, 7)]), T1L, ms, &(Rp[WS(rs, 1)])); + T2d = VADD(T1W, T2c); + ST(&(Rp[WS(rs, 2)]), T2d, ms, &(Rp[0])); + T2r = VADD(T2m, T2q); + ST(&(Rp[WS(rs, 4)]), T2r, ms, &(Rp[0])); + T1U = VCONJ(VSUB(T1S, T1Q)); + ST(&(Rm[WS(rs, 5)]), T1U, -ms, &(Rm[WS(rs, 1)])); + T2e = VCONJ(VSUB(T2c, T1W)); + ST(&(Rm[WS(rs, 2)]), T2e, -ms, &(Rm[0])); + T2j = VADD(T2g, T2i); + ST(&(Rp[WS(rs, 8)]), T2j, ms, &(Rp[0])); + T2k = VCONJ(VSUB(T2i, T2g)); + ST(&(Rm[WS(rs, 8)]), T2k, -ms, &(Rm[0])); + T1T = VADD(T1Q, T1S); + ST(&(Rp[WS(rs, 5)]), T1T, ms, &(Rp[WS(rs, 1)])); + T1M = VCONJ(VSUB(T1K, T1I)); + ST(&(Rm[WS(rs, 7)]), T1M, -ms, &(Rm[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 20, XSIMD_STRING("hc2cbdftv_20"), twinstr, &GENUS, {77, 42, 66, 0} }; + +void XSIMD(codelet_hc2cbdftv_20) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_20, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 20 -dif -sign 1 -name hc2cbdftv_20 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 143 FP additions, 62 FP multiplications, + * (or, 131 additions, 50 multiplications, 12 fused multiply/add), + * 114 stack variables, 4 constants, and 40 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 38)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(80, rs)) { + V TK, T1v, TY, T1x, T1j, T2f, TS, TT, TO, TU, T5, To, Tp, Tq, T2a; + V T2d, T2g, T2k, T2j, T1k, T1l, T18, T1m, T1f; + { + V T2, TP, T4, TR, TI, T1d, T9, T12, Td, T15, TE, T1a, Tv, T13, Tm; + V T1c, Tz, T16, Ti, T19, T3, TQ, TH, TG, TF, T6, T8, T7, Tc, Tb; + V Ta, TD, TC, TB, Ts, Tu, Tt, Tl, Tk, Tj, Tw, Ty, Tx, Tf, Th; + V Tg, TA, TJ, TW, TX, T1h, T1i, TM, TN, Te, Tn, T28, T29, T2b, T2c; + V T14, T17, T1b, T1e; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + TP = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + T3 = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VCONJ(T3); + TQ = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + TR = VCONJ(TQ); + TH = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + TF = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + TG = VCONJ(TF); + TI = VSUB(TG, TH); + T1d = VADD(TG, TH); + T6 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + T8 = VCONJ(T7); + T9 = VSUB(T6, T8); + T12 = VADD(T6, T8); + Tc = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + Ta = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VCONJ(Ta); + Td = VSUB(Tb, Tc); + T15 = VADD(Tb, Tc); + TD = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + TB = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + TC = VCONJ(TB); + TE = VSUB(TC, TD); + T1a = VADD(TC, TD); + Ts = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + Tt = LD(&(Rm[0]), -ms, &(Rm[0])); + Tu = VCONJ(Tt); + Tv = VSUB(Ts, Tu); + T13 = VADD(Ts, Tu); + Tl = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Tj = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + Tk = VCONJ(Tj); + Tm = VSUB(Tk, Tl); + T1c = VADD(Tk, Tl); + Tw = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tx = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + Ty = VCONJ(Tx); + Tz = VSUB(Tw, Ty); + T16 = VADD(Tw, Ty); + Tf = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + Tg = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Th = VCONJ(Tg); + Ti = VSUB(Tf, Th); + T19 = VADD(Tf, Th); + TA = VSUB(Tv, Tz); + TJ = VSUB(TE, TI); + TK = VFNMS(LDK(KP951056516), TJ, VMUL(LDK(KP587785252), TA)); + T1v = VFMA(LDK(KP951056516), TA, VMUL(LDK(KP587785252), TJ)); + TW = VSUB(T9, Td); + TX = VSUB(Ti, Tm); + TY = VFNMS(LDK(KP951056516), TX, VMUL(LDK(KP587785252), TW)); + T1x = VFMA(LDK(KP951056516), TW, VMUL(LDK(KP587785252), TX)); + T1h = VADD(T2, T4); + T1i = VADD(TP, TR); + T1j = VSUB(T1h, T1i); + T2f = VADD(T1h, T1i); + TS = VSUB(TP, TR); + TM = VADD(Tv, Tz); + TN = VADD(TE, TI); + TT = VADD(TM, TN); + TO = VMUL(LDK(KP559016994), VSUB(TM, TN)); + TU = VFNMS(LDK(KP250000000), TT, TS); + T5 = VSUB(T2, T4); + Te = VADD(T9, Td); + Tn = VADD(Ti, Tm); + To = VADD(Te, Tn); + Tp = VFNMS(LDK(KP250000000), To, T5); + Tq = VMUL(LDK(KP559016994), VSUB(Te, Tn)); + T28 = VADD(T12, T13); + T29 = VADD(T15, T16); + T2a = VADD(T28, T29); + T2b = VADD(T19, T1a); + T2c = VADD(T1c, T1d); + T2d = VADD(T2b, T2c); + T2g = VADD(T2a, T2d); + T2k = VSUB(T2b, T2c); + T2j = VSUB(T28, T29); + T14 = VSUB(T12, T13); + T17 = VSUB(T15, T16); + T1k = VADD(T14, T17); + T1b = VSUB(T19, T1a); + T1e = VSUB(T1c, T1d); + T1l = VADD(T1b, T1e); + T18 = VSUB(T14, T17); + T1m = VADD(T1k, T1l); + T1f = VSUB(T1b, T1e); + } + { + V T2L, T22, T1S, T26, T2m, T2G, T2s, T2A, T1q, T1U, T1C, T1M, T10, T2E, T1I; + V T2q, T1A, T2K, T20, T2w, T21, T1Q, T1R, T1P, T25, T1r, T1s, T2C, T2N, T1N; + V T2H, T2I, T2M, T1E, T1D, T1O, T1V, T2n, T2B, T24, T2o, T2t, T2u, T23, T1W; + T2L = VADD(T2f, T2g); + T21 = LDW(&(W[TWVL * 18])); + T22 = VZMUL(T21, VADD(T1j, T1m)); + T1Q = VADD(T5, To); + T1R = VBYI(VADD(TS, TT)); + T1P = LDW(&(W[TWVL * 28])); + T1S = VZMULI(T1P, VSUB(T1Q, T1R)); + T25 = LDW(&(W[TWVL * 8])); + T26 = VZMULI(T25, VADD(T1Q, T1R)); + { + V T2l, T2z, T2i, T2y, T2e, T2h, T27, T2F, T2r, T2x, T1g, T1K, T1p, T1L, T1n; + V T1o, T11, T1T, T1B, T1J, TL, T1G, TZ, T1H, Tr, TV, T1, T2D, T1F, T2p; + V T1w, T1Y, T1z, T1Z, T1u, T1y, T1t, T2J, T1X, T2v; + T2l = VBYI(VFMA(LDK(KP951056516), T2j, VMUL(LDK(KP587785252), T2k))); + T2z = VBYI(VFNMS(LDK(KP951056516), T2k, VMUL(LDK(KP587785252), T2j))); + T2e = VMUL(LDK(KP559016994), VSUB(T2a, T2d)); + T2h = VFNMS(LDK(KP250000000), T2g, T2f); + T2i = VADD(T2e, T2h); + T2y = VSUB(T2h, T2e); + T27 = LDW(&(W[TWVL * 6])); + T2m = VZMUL(T27, VSUB(T2i, T2l)); + T2F = LDW(&(W[TWVL * 22])); + T2G = VZMUL(T2F, VADD(T2z, T2y)); + T2r = LDW(&(W[TWVL * 30])); + T2s = VZMUL(T2r, VADD(T2l, T2i)); + T2x = LDW(&(W[TWVL * 14])); + T2A = VZMUL(T2x, VSUB(T2y, T2z)); + T1g = VBYI(VFNMS(LDK(KP951056516), T1f, VMUL(LDK(KP587785252), T18))); + T1K = VBYI(VFMA(LDK(KP951056516), T18, VMUL(LDK(KP587785252), T1f))); + T1n = VFNMS(LDK(KP250000000), T1m, T1j); + T1o = VMUL(LDK(KP559016994), VSUB(T1k, T1l)); + T1p = VSUB(T1n, T1o); + T1L = VADD(T1o, T1n); + T11 = LDW(&(W[TWVL * 2])); + T1q = VZMUL(T11, VADD(T1g, T1p)); + T1T = LDW(&(W[TWVL * 26])); + T1U = VZMUL(T1T, VSUB(T1L, T1K)); + T1B = LDW(&(W[TWVL * 34])); + T1C = VZMUL(T1B, VSUB(T1p, T1g)); + T1J = LDW(&(W[TWVL * 10])); + T1M = VZMUL(T1J, VADD(T1K, T1L)); + Tr = VSUB(Tp, Tq); + TL = VSUB(Tr, TK); + T1G = VADD(Tr, TK); + TV = VSUB(TO, TU); + TZ = VBYI(VSUB(TV, TY)); + T1H = VBYI(VADD(TY, TV)); + T1 = LDW(&(W[TWVL * 4])); + T10 = VZMULI(T1, VADD(TL, TZ)); + T2D = LDW(&(W[TWVL * 24])); + T2E = VZMULI(T2D, VSUB(T1G, T1H)); + T1F = LDW(&(W[TWVL * 12])); + T1I = VZMULI(T1F, VADD(T1G, T1H)); + T2p = LDW(&(W[TWVL * 32])); + T2q = VZMULI(T2p, VSUB(TL, TZ)); + T1u = VADD(Tq, Tp); + T1w = VSUB(T1u, T1v); + T1Y = VADD(T1u, T1v); + T1y = VADD(TO, TU); + T1z = VBYI(VADD(T1x, T1y)); + T1Z = VBYI(VSUB(T1y, T1x)); + T1t = LDW(&(W[TWVL * 36])); + T1A = VZMULI(T1t, VSUB(T1w, T1z)); + T2J = LDW(&(W[0])); + T2K = VZMULI(T2J, VADD(T1w, T1z)); + T1X = LDW(&(W[TWVL * 20])); + T20 = VZMULI(T1X, VSUB(T1Y, T1Z)); + T2v = LDW(&(W[TWVL * 16])); + T2w = VZMULI(T2v, VADD(T1Y, T1Z)); + } + T1r = VADD(T10, T1q); + ST(&(Rp[WS(rs, 1)]), T1r, ms, &(Rp[WS(rs, 1)])); + T1s = VCONJ(VSUB(T1q, T10)); + ST(&(Rm[WS(rs, 1)]), T1s, -ms, &(Rm[WS(rs, 1)])); + T2C = VCONJ(VSUB(T2A, T2w)); + ST(&(Rm[WS(rs, 4)]), T2C, -ms, &(Rm[0])); + T2N = VCONJ(VSUB(T2L, T2K)); + ST(&(Rm[0]), T2N, -ms, &(Rm[0])); + T1N = VADD(T1I, T1M); + ST(&(Rp[WS(rs, 3)]), T1N, ms, &(Rp[WS(rs, 1)])); + T2H = VADD(T2E, T2G); + ST(&(Rp[WS(rs, 6)]), T2H, ms, &(Rp[0])); + T2I = VCONJ(VSUB(T2G, T2E)); + ST(&(Rm[WS(rs, 6)]), T2I, -ms, &(Rm[0])); + T2M = VADD(T2K, T2L); + ST(&(Rp[0]), T2M, ms, &(Rp[0])); + T1E = VCONJ(VSUB(T1C, T1A)); + ST(&(Rm[WS(rs, 9)]), T1E, -ms, &(Rm[WS(rs, 1)])); + T1D = VADD(T1A, T1C); + ST(&(Rp[WS(rs, 9)]), T1D, ms, &(Rp[WS(rs, 1)])); + T1O = VCONJ(VSUB(T1M, T1I)); + ST(&(Rm[WS(rs, 3)]), T1O, -ms, &(Rm[WS(rs, 1)])); + T1V = VADD(T1S, T1U); + ST(&(Rp[WS(rs, 7)]), T1V, ms, &(Rp[WS(rs, 1)])); + T2n = VADD(T26, T2m); + ST(&(Rp[WS(rs, 2)]), T2n, ms, &(Rp[0])); + T2B = VADD(T2w, T2A); + ST(&(Rp[WS(rs, 4)]), T2B, ms, &(Rp[0])); + T24 = VCONJ(VSUB(T22, T20)); + ST(&(Rm[WS(rs, 5)]), T24, -ms, &(Rm[WS(rs, 1)])); + T2o = VCONJ(VSUB(T2m, T26)); + ST(&(Rm[WS(rs, 2)]), T2o, -ms, &(Rm[0])); + T2t = VADD(T2q, T2s); + ST(&(Rp[WS(rs, 8)]), T2t, ms, &(Rp[0])); + T2u = VCONJ(VSUB(T2s, T2q)); + ST(&(Rm[WS(rs, 8)]), T2u, -ms, &(Rm[0])); + T23 = VADD(T20, T22); + ST(&(Rp[WS(rs, 5)]), T23, ms, &(Rp[WS(rs, 1)])); + T1W = VCONJ(VSUB(T1U, T1S)); + ST(&(Rm[WS(rs, 7)]), T1W, -ms, &(Rm[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 20, XSIMD_STRING("hc2cbdftv_20"), twinstr, &GENUS, {131, 50, 12, 0} }; + +void XSIMD(codelet_hc2cbdftv_20) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_20, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_32.c new file mode 100644 index 000000000..4a5905adb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_32.c @@ -0,0 +1,872 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:12 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 32 -dif -sign 1 -name hc2cbdftv_32 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 249 FP additions, 192 FP multiplications, + * (or, 119 additions, 62 multiplications, 130 fused multiply/add), + * 143 stack variables, 7 constants, and 64 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 62)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(128, rs)) { + V Ts, T1S, T3p, T45, T3A, T48, T1b, T1V, T1o, T2G, T2o, T2Y, T2z, T31, T1L; + V T2H, T2J, T2K, TJ, T1c, T3D, T46, T10, T1d, T2r, T2A, T3w, T49, T1D, T1M; + V T2u, T2B; + { + V T4, T1i, T15, T1j, Tb, T1m, T16, T1l, T1G, T1F, Tj, T3m, T18, T1J, T1I; + V Tq, T3n, T19, T2, T3, T13, T14, T5, T6, T7, T8, T9, Ta, Tf, Ti; + V Td, Te, Tg, Th, Tm, Tp, Tk, Tl, Tn, To, Tc, Tr, T3l, T3o, T3y; + V T3z, T17, T1a, T1k, T1n, T2m, T2n, T2x, T2y, T1H, T1K; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 15)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VFNMSCONJ(T3, T2); + T1i = VFMACONJ(T3, T2); + T13 = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + T14 = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + T15 = VFNMSCONJ(T14, T13); + T1j = VFMACONJ(T14, T13); + T5 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 11)]), -ms, &(Rm[WS(rs, 1)])); + T7 = VFNMSCONJ(T6, T5); + T8 = LD(&(Rp[WS(rs, 12)]), ms, &(Rp[0])); + T9 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Ta = VFMSCONJ(T9, T8); + Tb = VADD(T7, Ta); + T1m = VFMACONJ(T9, T8); + T16 = VSUB(T7, Ta); + T1l = VFMACONJ(T6, T5); + Td = LD(&(Rp[WS(rs, 10)]), ms, &(Rp[0])); + Te = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Tf = VFNMSCONJ(Te, Td); + T1G = VFMACONJ(Te, Td); + Tg = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Th = LD(&(Rm[WS(rs, 13)]), -ms, &(Rm[WS(rs, 1)])); + Ti = VFNMSCONJ(Th, Tg); + T1F = VFMACONJ(Th, Tg); + Tj = VFMA(LDK(KP414213562), Ti, Tf); + T3m = VSUB(T1F, T1G); + T18 = VFNMS(LDK(KP414213562), Tf, Ti); + Tk = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + Tl = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + Tm = VFNMSCONJ(Tl, Tk); + T1J = VFMACONJ(Tl, Tk); + Tn = LD(&(Rp[WS(rs, 14)]), ms, &(Rp[0])); + To = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tp = VFMSCONJ(To, Tn); + T1I = VFMACONJ(To, Tn); + Tq = VFNMS(LDK(KP414213562), Tp, Tm); + T3n = VSUB(T1I, T1J); + T19 = VFMA(LDK(KP414213562), Tm, Tp); + Tc = VFNMS(LDK(KP707106781), Tb, T4); + Tr = VSUB(Tj, Tq); + Ts = VFMA(LDK(KP923879532), Tr, Tc); + T1S = VFNMS(LDK(KP923879532), Tr, Tc); + T3l = VSUB(T1i, T1j); + T3o = VADD(T3m, T3n); + T3p = VFMA(LDK(KP707106781), T3o, T3l); + T45 = VFNMS(LDK(KP707106781), T3o, T3l); + T3y = VSUB(T1l, T1m); + T3z = VSUB(T3m, T3n); + T3A = VFMA(LDK(KP707106781), T3z, T3y); + T48 = VFNMS(LDK(KP707106781), T3z, T3y); + T17 = VFNMS(LDK(KP707106781), T16, T15); + T1a = VSUB(T18, T19); + T1b = VFNMS(LDK(KP923879532), T1a, T17); + T1V = VFMA(LDK(KP923879532), T1a, T17); + T1k = VADD(T1i, T1j); + T1n = VADD(T1l, T1m); + T1o = VSUB(T1k, T1n); + T2G = VADD(T1k, T1n); + T2m = VFMA(LDK(KP707106781), Tb, T4); + T2n = VADD(T18, T19); + T2o = VFNMS(LDK(KP923879532), T2n, T2m); + T2Y = VFMA(LDK(KP923879532), T2n, T2m); + T2x = VFMA(LDK(KP707106781), T16, T15); + T2y = VADD(Tj, Tq); + T2z = VFNMS(LDK(KP923879532), T2y, T2x); + T31 = VFMA(LDK(KP923879532), T2y, T2x); + T1H = VADD(T1F, T1G); + T1K = VADD(T1I, T1J); + T1L = VSUB(T1H, T1K); + T2H = VADD(T1H, T1K); + } + { + V Tv, T3q, TG, T1r, TM, T3t, TX, T1y, TC, T3r, TH, T1u, TT, T3u, TY; + V T1B, Tt, Tu, T1p, TE, TF, T1q, TK, TL, T1w, TV, TW, T1x, Ty, T1s; + V TB, T1t, Tw, Tx, Tz, TA, TP, T1z, TS, T1A, TN, TO, TQ, TR, TD; + V TI, T3B, T3C, TU, TZ, T2p, T2q, T3s, T3v, T1v, T1C, T2s, T2t; + Tt = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tu = LD(&(Rm[WS(rs, 14)]), -ms, &(Rm[0])); + T1p = VFMACONJ(Tu, Tt); + TE = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + TF = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + T1q = VFMACONJ(TF, TE); + Tv = VFNMSCONJ(Tu, Tt); + T3q = VSUB(T1p, T1q); + TG = VFNMSCONJ(TF, TE); + T1r = VADD(T1p, T1q); + TK = LD(&(Rp[WS(rs, 15)]), ms, &(Rp[WS(rs, 1)])); + TL = LD(&(Rm[0]), -ms, &(Rm[0])); + T1w = VFMACONJ(TL, TK); + TV = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + TW = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + T1x = VFMACONJ(TW, TV); + TM = VFMSCONJ(TL, TK); + T3t = VSUB(T1w, T1x); + TX = VFNMSCONJ(TW, TV); + T1y = VADD(T1w, T1x); + Tw = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tx = LD(&(Rm[WS(rs, 10)]), -ms, &(Rm[0])); + Ty = VFNMSCONJ(Tx, Tw); + T1s = VFMACONJ(Tx, Tw); + Tz = LD(&(Rp[WS(rs, 13)]), ms, &(Rp[WS(rs, 1)])); + TA = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + TB = VFMSCONJ(TA, Tz); + T1t = VFMACONJ(TA, Tz); + TC = VADD(Ty, TB); + T3r = VSUB(T1s, T1t); + TH = VSUB(Ty, TB); + T1u = VADD(T1s, T1t); + TN = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + TO = LD(&(Rm[WS(rs, 12)]), -ms, &(Rm[0])); + TP = VFNMSCONJ(TO, TN); + T1z = VFMACONJ(TO, TN); + TQ = LD(&(Rp[WS(rs, 11)]), ms, &(Rp[WS(rs, 1)])); + TR = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + TS = VFMSCONJ(TR, TQ); + T1A = VFMACONJ(TR, TQ); + TT = VADD(TP, TS); + T3u = VSUB(T1A, T1z); + TY = VSUB(TS, TP); + T1B = VADD(T1z, T1A); + T2J = VADD(T1r, T1u); + T2K = VADD(T1y, T1B); + TD = VFNMS(LDK(KP707106781), TC, Tv); + TI = VFNMS(LDK(KP707106781), TH, TG); + TJ = VFMA(LDK(KP668178637), TI, TD); + T1c = VFNMS(LDK(KP668178637), TD, TI); + T3B = VFMA(LDK(KP414213562), T3q, T3r); + T3C = VFMA(LDK(KP414213562), T3t, T3u); + T3D = VSUB(T3B, T3C); + T46 = VADD(T3B, T3C); + TU = VFNMS(LDK(KP707106781), TT, TM); + TZ = VFMA(LDK(KP707106781), TY, TX); + T10 = VFNMS(LDK(KP668178637), TZ, TU); + T1d = VFMA(LDK(KP668178637), TU, TZ); + T2p = VFMA(LDK(KP707106781), TH, TG); + T2q = VFMA(LDK(KP707106781), TC, Tv); + T2r = VFMA(LDK(KP198912367), T2q, T2p); + T2A = VFNMS(LDK(KP198912367), T2p, T2q); + T3s = VFNMS(LDK(KP414213562), T3r, T3q); + T3v = VFNMS(LDK(KP414213562), T3u, T3t); + T3w = VADD(T3s, T3v); + T49 = VSUB(T3s, T3v); + T1v = VSUB(T1r, T1u); + T1C = VSUB(T1y, T1B); + T1D = VADD(T1v, T1C); + T1M = VSUB(T1v, T1C); + T2s = VFNMS(LDK(KP707106781), TY, TX); + T2t = VFMA(LDK(KP707106781), TT, TM); + T2u = VFNMS(LDK(KP198912367), T2t, T2s); + T2B = VFMA(LDK(KP198912367), T2s, T2t); + } + { + V T3f, T38, T4p, T4v, T3T, T3Z, T2a, T2i, T4b, T4h, T1O, T20, T2M, T2U, T3F; + V T3L, T1g, T3X, T2g, T3J, T2E, T4l, T2S, T4f, T1Y, T4t, T26, T43, T34, T3P; + V T3e, T3j, T36, T37, T35, T4n, T4o, T4m, T4u, T3R, T3S, T3Q, T3Y, T28, T29; + V T27, T2h, T47, T4a, T44, T4g, T1E, T1N, T1h, T1Z; + T36 = VADD(T2G, T2H); + T37 = VADD(T2J, T2K); + T3f = VADD(T36, T37); + T35 = LDW(&(W[TWVL * 30])); + T38 = VZMUL(T35, VSUB(T36, T37)); + T4n = VFMA(LDK(KP923879532), T46, T45); + T4o = VFNMS(LDK(KP923879532), T49, T48); + T4m = LDW(&(W[TWVL * 10])); + T4p = VZMUL(T4m, VFNMSI(T4o, T4n)); + T4u = LDW(&(W[TWVL * 50])); + T4v = VZMUL(T4u, VFMAI(T4o, T4n)); + T3R = VFMA(LDK(KP923879532), T3w, T3p); + T3S = VFMA(LDK(KP923879532), T3D, T3A); + T3Q = LDW(&(W[TWVL * 58])); + T3T = VZMUL(T3Q, VFNMSI(T3S, T3R)); + T3Y = LDW(&(W[TWVL * 2])); + T3Z = VZMUL(T3Y, VFMAI(T3S, T3R)); + T28 = VFMA(LDK(KP707106781), T1D, T1o); + T29 = VFMA(LDK(KP707106781), T1M, T1L); + T27 = LDW(&(W[TWVL * 6])); + T2a = VZMUL(T27, VFMAI(T29, T28)); + T2h = LDW(&(W[TWVL * 54])); + T2i = VZMUL(T2h, VFNMSI(T29, T28)); + T47 = VFNMS(LDK(KP923879532), T46, T45); + T4a = VFMA(LDK(KP923879532), T49, T48); + T44 = LDW(&(W[TWVL * 18])); + T4b = VZMUL(T44, VFMAI(T4a, T47)); + T4g = LDW(&(W[TWVL * 42])); + T4h = VZMUL(T4g, VFNMSI(T4a, T47)); + T1E = VFNMS(LDK(KP707106781), T1D, T1o); + T1N = VFNMS(LDK(KP707106781), T1M, T1L); + T1h = LDW(&(W[TWVL * 22])); + T1O = VZMUL(T1h, VFNMSI(T1N, T1E)); + T1Z = LDW(&(W[TWVL * 38])); + T20 = VZMUL(T1Z, VFMAI(T1N, T1E)); + { + V T2I, T2L, T2F, T2T, T3x, T3E, T3k, T3K, T12, T2e, T1f, T2f, T11, T1e, T1; + V T3W, T2d, T3I, T2w, T2Q, T2D, T2R, T2v, T2C, T2l, T4k, T2P, T4e, T1U, T24; + V T1X, T25, T1T, T1W, T1R, T4s, T23, T42, T30, T3c, T33, T3d, T2Z, T32, T2X; + V T3O, T3b, T3i; + T2I = VSUB(T2G, T2H); + T2L = VSUB(T2J, T2K); + T2F = LDW(&(W[TWVL * 46])); + T2M = VZMUL(T2F, VFNMSI(T2L, T2I)); + T2T = LDW(&(W[TWVL * 14])); + T2U = VZMUL(T2T, VFMAI(T2L, T2I)); + T3x = VFNMS(LDK(KP923879532), T3w, T3p); + T3E = VFNMS(LDK(KP923879532), T3D, T3A); + T3k = LDW(&(W[TWVL * 26])); + T3F = VZMUL(T3k, VFNMSI(T3E, T3x)); + T3K = LDW(&(W[TWVL * 34])); + T3L = VZMUL(T3K, VFMAI(T3E, T3x)); + T11 = VADD(TJ, T10); + T12 = VFNMS(LDK(KP831469612), T11, Ts); + T2e = VFMA(LDK(KP831469612), T11, Ts); + T1e = VADD(T1c, T1d); + T1f = VFNMS(LDK(KP831469612), T1e, T1b); + T2f = VFMA(LDK(KP831469612), T1e, T1b); + T1 = LDW(&(W[TWVL * 24])); + T1g = VZMULI(T1, VFMAI(T1f, T12)); + T3W = LDW(&(W[TWVL * 4])); + T3X = VZMULI(T3W, VFNMSI(T2f, T2e)); + T2d = LDW(&(W[TWVL * 56])); + T2g = VZMULI(T2d, VFMAI(T2f, T2e)); + T3I = LDW(&(W[TWVL * 36])); + T3J = VZMULI(T3I, VFNMSI(T1f, T12)); + T2v = VSUB(T2r, T2u); + T2w = VFMA(LDK(KP980785280), T2v, T2o); + T2Q = VFNMS(LDK(KP980785280), T2v, T2o); + T2C = VSUB(T2A, T2B); + T2D = VFNMS(LDK(KP980785280), T2C, T2z); + T2R = VFMA(LDK(KP980785280), T2C, T2z); + T2l = LDW(&(W[TWVL * 48])); + T2E = VZMULI(T2l, VFMAI(T2D, T2w)); + T4k = LDW(&(W[TWVL * 12])); + T4l = VZMULI(T4k, VFNMSI(T2D, T2w)); + T2P = LDW(&(W[TWVL * 16])); + T2S = VZMULI(T2P, VFMAI(T2R, T2Q)); + T4e = LDW(&(W[TWVL * 44])); + T4f = VZMULI(T4e, VFNMSI(T2R, T2Q)); + T1T = VSUB(T1d, T1c); + T1U = VFNMS(LDK(KP831469612), T1T, T1S); + T24 = VFMA(LDK(KP831469612), T1T, T1S); + T1W = VSUB(TJ, T10); + T1X = VFNMS(LDK(KP831469612), T1W, T1V); + T25 = VFMA(LDK(KP831469612), T1W, T1V); + T1R = LDW(&(W[TWVL * 40])); + T1Y = VZMULI(T1R, VFMAI(T1X, T1U)); + T4s = LDW(&(W[TWVL * 52])); + T4t = VZMULI(T4s, VFNMSI(T25, T24)); + T23 = LDW(&(W[TWVL * 8])); + T26 = VZMULI(T23, VFMAI(T25, T24)); + T42 = LDW(&(W[TWVL * 20])); + T43 = VZMULI(T42, VFNMSI(T1X, T1U)); + T2Z = VADD(T2A, T2B); + T30 = VFNMS(LDK(KP980785280), T2Z, T2Y); + T3c = VFMA(LDK(KP980785280), T2Z, T2Y); + T32 = VADD(T2r, T2u); + T33 = VFNMS(LDK(KP980785280), T32, T31); + T3d = VFMA(LDK(KP980785280), T32, T31); + T2X = LDW(&(W[TWVL * 32])); + T34 = VZMULI(T2X, VFMAI(T33, T30)); + T3O = LDW(&(W[TWVL * 60])); + T3P = VZMULI(T3O, VFNMSI(T3d, T3c)); + T3b = LDW(&(W[0])); + T3e = VZMULI(T3b, VFMAI(T3d, T3c)); + T3i = LDW(&(W[TWVL * 28])); + T3j = VZMULI(T3i, VFNMSI(T33, T30)); + } + { + V T1P, T4w, T2j, T4c, T4x, T1Q, T4d, T2k, T21, T4q, T2b, T4i, T4r, T22, T4j; + V T2c, T2N, T40, T3g, T3G, T41, T2O, T3H, T3h, T2V, T3U, T39, T3M, T3V, T2W; + V T3N, T3a; + T1P = VADD(T1g, T1O); + ST(&(Rp[WS(rs, 6)]), T1P, ms, &(Rp[0])); + T4w = VADD(T4t, T4v); + ST(&(Rp[WS(rs, 13)]), T4w, ms, &(Rp[WS(rs, 1)])); + T2j = VADD(T2g, T2i); + ST(&(Rp[WS(rs, 14)]), T2j, ms, &(Rp[0])); + T4c = VADD(T43, T4b); + ST(&(Rp[WS(rs, 5)]), T4c, ms, &(Rp[WS(rs, 1)])); + T4x = VCONJ(VSUB(T4v, T4t)); + ST(&(Rm[WS(rs, 13)]), T4x, -ms, &(Rm[WS(rs, 1)])); + T1Q = VCONJ(VSUB(T1O, T1g)); + ST(&(Rm[WS(rs, 6)]), T1Q, -ms, &(Rm[0])); + T4d = VCONJ(VSUB(T4b, T43)); + ST(&(Rm[WS(rs, 5)]), T4d, -ms, &(Rm[WS(rs, 1)])); + T2k = VCONJ(VSUB(T2i, T2g)); + ST(&(Rm[WS(rs, 14)]), T2k, -ms, &(Rm[0])); + T21 = VADD(T1Y, T20); + ST(&(Rp[WS(rs, 10)]), T21, ms, &(Rp[0])); + T4q = VADD(T4l, T4p); + ST(&(Rp[WS(rs, 3)]), T4q, ms, &(Rp[WS(rs, 1)])); + T2b = VADD(T26, T2a); + ST(&(Rp[WS(rs, 2)]), T2b, ms, &(Rp[0])); + T4i = VADD(T4f, T4h); + ST(&(Rp[WS(rs, 11)]), T4i, ms, &(Rp[WS(rs, 1)])); + T4r = VCONJ(VSUB(T4p, T4l)); + ST(&(Rm[WS(rs, 3)]), T4r, -ms, &(Rm[WS(rs, 1)])); + T22 = VCONJ(VSUB(T20, T1Y)); + ST(&(Rm[WS(rs, 10)]), T22, -ms, &(Rm[0])); + T4j = VCONJ(VSUB(T4h, T4f)); + ST(&(Rm[WS(rs, 11)]), T4j, -ms, &(Rm[WS(rs, 1)])); + T2c = VCONJ(VSUB(T2a, T26)); + ST(&(Rm[WS(rs, 2)]), T2c, -ms, &(Rm[0])); + T2N = VADD(T2E, T2M); + ST(&(Rp[WS(rs, 12)]), T2N, ms, &(Rp[0])); + T40 = VADD(T3X, T3Z); + ST(&(Rp[WS(rs, 1)]), T40, ms, &(Rp[WS(rs, 1)])); + T3g = VADD(T3e, T3f); + ST(&(Rp[0]), T3g, ms, &(Rp[0])); + T3G = VADD(T3j, T3F); + ST(&(Rp[WS(rs, 7)]), T3G, ms, &(Rp[WS(rs, 1)])); + T41 = VCONJ(VSUB(T3Z, T3X)); + ST(&(Rm[WS(rs, 1)]), T41, -ms, &(Rm[WS(rs, 1)])); + T2O = VCONJ(VSUB(T2M, T2E)); + ST(&(Rm[WS(rs, 12)]), T2O, -ms, &(Rm[0])); + T3H = VCONJ(VSUB(T3F, T3j)); + ST(&(Rm[WS(rs, 7)]), T3H, -ms, &(Rm[WS(rs, 1)])); + T3h = VCONJ(VSUB(T3f, T3e)); + ST(&(Rm[0]), T3h, -ms, &(Rm[0])); + T2V = VADD(T2S, T2U); + ST(&(Rp[WS(rs, 4)]), T2V, ms, &(Rp[0])); + T3U = VADD(T3P, T3T); + ST(&(Rp[WS(rs, 15)]), T3U, ms, &(Rp[WS(rs, 1)])); + T39 = VADD(T34, T38); + ST(&(Rp[WS(rs, 8)]), T39, ms, &(Rp[0])); + T3M = VADD(T3J, T3L); + ST(&(Rp[WS(rs, 9)]), T3M, ms, &(Rp[WS(rs, 1)])); + T3V = VCONJ(VSUB(T3T, T3P)); + ST(&(Rm[WS(rs, 15)]), T3V, -ms, &(Rm[WS(rs, 1)])); + T2W = VCONJ(VSUB(T2U, T2S)); + ST(&(Rm[WS(rs, 4)]), T2W, -ms, &(Rm[0])); + T3N = VCONJ(VSUB(T3L, T3J)); + ST(&(Rm[WS(rs, 9)]), T3N, -ms, &(Rm[WS(rs, 1)])); + T3a = VCONJ(VSUB(T38, T34)); + ST(&(Rm[WS(rs, 8)]), T3a, -ms, &(Rm[0])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + VTW(1, 20), + VTW(1, 21), + VTW(1, 22), + VTW(1, 23), + VTW(1, 24), + VTW(1, 25), + VTW(1, 26), + VTW(1, 27), + VTW(1, 28), + VTW(1, 29), + VTW(1, 30), + VTW(1, 31), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 32, XSIMD_STRING("hc2cbdftv_32"), twinstr, &GENUS, {119, 62, 130, 0} }; + +void XSIMD(codelet_hc2cbdftv_32) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_32, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 32 -dif -sign 1 -name hc2cbdftv_32 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 249 FP additions, 104 FP multiplications, + * (or, 233 additions, 88 multiplications, 16 fused multiply/add), + * 161 stack variables, 7 constants, and 64 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 62)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(128, rs)) { + V T1W, T21, Tf, T2c, T1t, T2r, T3T, T4m, Ty, T2q, T3P, T4n, T1n, T2d, T1T; + V T22, T1E, T24, T3I, T4p, TU, T2n, T1i, T2h, T1L, T25, T3L, T4q, T1f, T2o; + V T1j, T2k; + { + V T2, T4, T1Z, T1p, T1r, T20, T9, T1U, Td, T1V, T3, T1q, T6, T8, T7; + V Tc, Tb, Ta, T5, Te, T1o, T1s, T3R, T3S, Tj, T1N, Tw, T1Q, Tn, T1O; + V Ts, T1R, Tg, Ti, Th, Tv, Tu, Tt, Tk, Tm, Tl, Tp, Tr, Tq, To; + V Tx, T3N, T3O, T1l, T1m, T1P, T1S; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 15)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VCONJ(T3); + T1Z = VADD(T2, T4); + T1p = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + T1q = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + T1r = VCONJ(T1q); + T20 = VADD(T1p, T1r); + T6 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 11)]), -ms, &(Rm[WS(rs, 1)])); + T8 = VCONJ(T7); + T9 = VSUB(T6, T8); + T1U = VADD(T6, T8); + Tc = LD(&(Rp[WS(rs, 12)]), ms, &(Rp[0])); + Ta = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VCONJ(Ta); + Td = VSUB(Tb, Tc); + T1V = VADD(Tb, Tc); + T1W = VSUB(T1U, T1V); + T21 = VSUB(T1Z, T20); + T5 = VSUB(T2, T4); + Te = VMUL(LDK(KP707106781), VADD(T9, Td)); + Tf = VSUB(T5, Te); + T2c = VADD(T5, Te); + T1o = VMUL(LDK(KP707106781), VSUB(T9, Td)); + T1s = VSUB(T1p, T1r); + T1t = VSUB(T1o, T1s); + T2r = VADD(T1s, T1o); + T3R = VADD(T1Z, T20); + T3S = VADD(T1U, T1V); + T3T = VSUB(T3R, T3S); + T4m = VADD(T3R, T3S); + Tg = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Th = LD(&(Rm[WS(rs, 13)]), -ms, &(Rm[WS(rs, 1)])); + Ti = VCONJ(Th); + Tj = VSUB(Tg, Ti); + T1N = VADD(Tg, Ti); + Tv = LD(&(Rp[WS(rs, 14)]), ms, &(Rp[0])); + Tt = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tu = VCONJ(Tt); + Tw = VSUB(Tu, Tv); + T1Q = VADD(Tu, Tv); + Tk = LD(&(Rp[WS(rs, 10)]), ms, &(Rp[0])); + Tl = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Tm = VCONJ(Tl); + Tn = VSUB(Tk, Tm); + T1O = VADD(Tk, Tm); + Tp = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + Tq = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + Tr = VCONJ(Tq); + Ts = VSUB(Tp, Tr); + T1R = VADD(Tp, Tr); + To = VFMA(LDK(KP382683432), Tj, VMUL(LDK(KP923879532), Tn)); + Tx = VFNMS(LDK(KP382683432), Tw, VMUL(LDK(KP923879532), Ts)); + Ty = VSUB(To, Tx); + T2q = VADD(To, Tx); + T3N = VADD(T1N, T1O); + T3O = VADD(T1Q, T1R); + T3P = VSUB(T3N, T3O); + T4n = VADD(T3N, T3O); + T1l = VFNMS(LDK(KP382683432), Tn, VMUL(LDK(KP923879532), Tj)); + T1m = VFMA(LDK(KP923879532), Tw, VMUL(LDK(KP382683432), Ts)); + T1n = VSUB(T1l, T1m); + T2d = VADD(T1l, T1m); + T1P = VSUB(T1N, T1O); + T1S = VSUB(T1Q, T1R); + T1T = VMUL(LDK(KP707106781), VSUB(T1P, T1S)); + T22 = VMUL(LDK(KP707106781), VADD(T1P, T1S)); + } + { + V TD, T1B, TR, T1y, TH, T1C, TM, T1z, TA, TC, TB, TO, TQ, TP, TG; + V TF, TE, TJ, TL, TK, T1A, T1D, T3G, T3H, TN, T2f, TT, T2g, TI, TS; + V TY, T1I, T1c, T1F, T12, T1J, T17, T1G, TV, TX, TW, T1b, T1a, T19, T11; + V T10, TZ, T14, T16, T15, T1H, T1K, T3J, T3K, T18, T2i, T1e, T2j, T13, T1d; + TA = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + TB = LD(&(Rm[WS(rs, 10)]), -ms, &(Rm[0])); + TC = VCONJ(TB); + TD = VSUB(TA, TC); + T1B = VADD(TA, TC); + TO = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + TP = LD(&(Rm[WS(rs, 14)]), -ms, &(Rm[0])); + TQ = VCONJ(TP); + TR = VSUB(TO, TQ); + T1y = VADD(TO, TQ); + TG = LD(&(Rp[WS(rs, 13)]), ms, &(Rp[WS(rs, 1)])); + TE = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + TF = VCONJ(TE); + TH = VSUB(TF, TG); + T1C = VADD(TF, TG); + TJ = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + TK = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + TL = VCONJ(TK); + TM = VSUB(TJ, TL); + T1z = VADD(TJ, TL); + T1A = VSUB(T1y, T1z); + T1D = VSUB(T1B, T1C); + T1E = VFNMS(LDK(KP382683432), T1D, VMUL(LDK(KP923879532), T1A)); + T24 = VFMA(LDK(KP382683432), T1A, VMUL(LDK(KP923879532), T1D)); + T3G = VADD(T1y, T1z); + T3H = VADD(T1B, T1C); + T3I = VSUB(T3G, T3H); + T4p = VADD(T3G, T3H); + TI = VMUL(LDK(KP707106781), VSUB(TD, TH)); + TN = VSUB(TI, TM); + T2f = VADD(TM, TI); + TS = VMUL(LDK(KP707106781), VADD(TD, TH)); + TT = VSUB(TR, TS); + T2g = VADD(TR, TS); + TU = VFMA(LDK(KP831469612), TN, VMUL(LDK(KP555570233), TT)); + T2n = VFNMS(LDK(KP195090322), T2f, VMUL(LDK(KP980785280), T2g)); + T1i = VFNMS(LDK(KP555570233), TN, VMUL(LDK(KP831469612), TT)); + T2h = VFMA(LDK(KP980785280), T2f, VMUL(LDK(KP195090322), T2g)); + TV = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + TW = LD(&(Rm[WS(rs, 12)]), -ms, &(Rm[0])); + TX = VCONJ(TW); + TY = VSUB(TV, TX); + T1I = VADD(TV, TX); + T1b = LD(&(Rp[WS(rs, 15)]), ms, &(Rp[WS(rs, 1)])); + T19 = LD(&(Rm[0]), -ms, &(Rm[0])); + T1a = VCONJ(T19); + T1c = VSUB(T1a, T1b); + T1F = VADD(T1a, T1b); + T11 = LD(&(Rp[WS(rs, 11)]), ms, &(Rp[WS(rs, 1)])); + TZ = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T10 = VCONJ(TZ); + T12 = VSUB(T10, T11); + T1J = VADD(T10, T11); + T14 = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + T15 = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + T16 = VCONJ(T15); + T17 = VSUB(T14, T16); + T1G = VADD(T14, T16); + T1H = VSUB(T1F, T1G); + T1K = VSUB(T1I, T1J); + T1L = VFMA(LDK(KP923879532), T1H, VMUL(LDK(KP382683432), T1K)); + T25 = VFNMS(LDK(KP382683432), T1H, VMUL(LDK(KP923879532), T1K)); + T3J = VADD(T1F, T1G); + T3K = VADD(T1I, T1J); + T3L = VSUB(T3J, T3K); + T4q = VADD(T3J, T3K); + T13 = VMUL(LDK(KP707106781), VSUB(TY, T12)); + T18 = VSUB(T13, T17); + T2i = VADD(T17, T13); + T1d = VMUL(LDK(KP707106781), VADD(TY, T12)); + T1e = VSUB(T1c, T1d); + T2j = VADD(T1c, T1d); + T1f = VFNMS(LDK(KP555570233), T1e, VMUL(LDK(KP831469612), T18)); + T2o = VFMA(LDK(KP195090322), T2i, VMUL(LDK(KP980785280), T2j)); + T1j = VFMA(LDK(KP555570233), T18, VMUL(LDK(KP831469612), T1e)); + T2k = VFNMS(LDK(KP195090322), T2j, VMUL(LDK(KP980785280), T2i)); + } + { + V T4L, T4G, T4s, T4y, T3W, T4g, T42, T4a, T3g, T4e, T3o, T3E, T1w, T46, T2M; + V T40, T2u, T4w, T2C, T4k, T36, T3A, T3i, T3s, T28, T2O, T2w, T2G, T2Y, T4K; + V T3y, T4C; + { + V T4E, T4F, T4D, T4o, T4r, T4l, T4x, T3Q, T48, T3V, T49, T3M, T3U, T3F, T4f; + V T41, T47, T3c, T3n, T3f, T3m, T3a, T3b, T3d, T3e, T39, T4d, T3l, T3D, T1h; + V T2K, T1v, T2L, Tz, T1g, T1k, T1u, T1, T45, T2J, T3Z, T2m, T2A, T2t, T2B; + V T2e, T2l, T2p, T2s, T2b, T4v, T2z, T4j; + T4E = VADD(T4m, T4n); + T4F = VADD(T4p, T4q); + T4L = VADD(T4E, T4F); + T4D = LDW(&(W[TWVL * 30])); + T4G = VZMUL(T4D, VSUB(T4E, T4F)); + T4o = VSUB(T4m, T4n); + T4r = VBYI(VSUB(T4p, T4q)); + T4l = LDW(&(W[TWVL * 46])); + T4s = VZMUL(T4l, VSUB(T4o, T4r)); + T4x = LDW(&(W[TWVL * 14])); + T4y = VZMUL(T4x, VADD(T4o, T4r)); + T3M = VMUL(LDK(KP707106781), VSUB(T3I, T3L)); + T3Q = VBYI(VSUB(T3M, T3P)); + T48 = VBYI(VADD(T3P, T3M)); + T3U = VMUL(LDK(KP707106781), VADD(T3I, T3L)); + T3V = VSUB(T3T, T3U); + T49 = VADD(T3T, T3U); + T3F = LDW(&(W[TWVL * 22])); + T3W = VZMUL(T3F, VADD(T3Q, T3V)); + T4f = LDW(&(W[TWVL * 54])); + T4g = VZMUL(T4f, VSUB(T49, T48)); + T41 = LDW(&(W[TWVL * 38])); + T42 = VZMUL(T41, VSUB(T3V, T3Q)); + T47 = LDW(&(W[TWVL * 6])); + T4a = VZMUL(T47, VADD(T48, T49)); + T3a = VADD(T1t, T1n); + T3b = VADD(TU, T1f); + T3c = VBYI(VADD(T3a, T3b)); + T3n = VBYI(VSUB(T3b, T3a)); + T3d = VADD(Tf, Ty); + T3e = VADD(T1i, T1j); + T3f = VADD(T3d, T3e); + T3m = VSUB(T3d, T3e); + T39 = LDW(&(W[TWVL * 4])); + T3g = VZMULI(T39, VADD(T3c, T3f)); + T4d = LDW(&(W[TWVL * 56])); + T4e = VZMULI(T4d, VSUB(T3f, T3c)); + T3l = LDW(&(W[TWVL * 36])); + T3o = VZMULI(T3l, VSUB(T3m, T3n)); + T3D = LDW(&(W[TWVL * 24])); + T3E = VZMULI(T3D, VADD(T3n, T3m)); + Tz = VSUB(Tf, Ty); + T1g = VSUB(TU, T1f); + T1h = VSUB(Tz, T1g); + T2K = VADD(Tz, T1g); + T1k = VSUB(T1i, T1j); + T1u = VSUB(T1n, T1t); + T1v = VBYI(VSUB(T1k, T1u)); + T2L = VBYI(VADD(T1u, T1k)); + T1 = LDW(&(W[TWVL * 20])); + T1w = VZMULI(T1, VADD(T1h, T1v)); + T45 = LDW(&(W[TWVL * 8])); + T46 = VZMULI(T45, VADD(T2K, T2L)); + T2J = LDW(&(W[TWVL * 52])); + T2M = VZMULI(T2J, VSUB(T2K, T2L)); + T3Z = LDW(&(W[TWVL * 40])); + T40 = VZMULI(T3Z, VSUB(T1h, T1v)); + T2e = VSUB(T2c, T2d); + T2l = VSUB(T2h, T2k); + T2m = VSUB(T2e, T2l); + T2A = VADD(T2e, T2l); + T2p = VSUB(T2n, T2o); + T2s = VSUB(T2q, T2r); + T2t = VBYI(VSUB(T2p, T2s)); + T2B = VBYI(VADD(T2s, T2p)); + T2b = LDW(&(W[TWVL * 44])); + T2u = VZMULI(T2b, VSUB(T2m, T2t)); + T4v = LDW(&(W[TWVL * 16])); + T4w = VZMULI(T4v, VADD(T2m, T2t)); + T2z = LDW(&(W[TWVL * 12])); + T2C = VZMULI(T2z, VADD(T2A, T2B)); + T4j = LDW(&(W[TWVL * 48])); + T4k = VZMULI(T4j, VSUB(T2A, T2B)); + { + V T32, T3q, T35, T3r, T30, T31, T33, T34, T2Z, T3z, T3h, T3p, T1Y, T2E, T27; + V T2F, T1M, T1X, T23, T26, T1x, T2N, T2v, T2D, T2U, T3x, T2X, T3w, T2S, T2T; + V T2V, T2W, T2R, T4J, T3v, T4B; + T30 = VADD(T21, T22); + T31 = VADD(T1E, T1L); + T32 = VADD(T30, T31); + T3q = VSUB(T30, T31); + T33 = VADD(T1W, T1T); + T34 = VADD(T24, T25); + T35 = VBYI(VADD(T33, T34)); + T3r = VBYI(VSUB(T34, T33)); + T2Z = LDW(&(W[TWVL * 58])); + T36 = VZMUL(T2Z, VSUB(T32, T35)); + T3z = LDW(&(W[TWVL * 26])); + T3A = VZMUL(T3z, VADD(T3q, T3r)); + T3h = LDW(&(W[TWVL * 2])); + T3i = VZMUL(T3h, VADD(T32, T35)); + T3p = LDW(&(W[TWVL * 34])); + T3s = VZMUL(T3p, VSUB(T3q, T3r)); + T1M = VSUB(T1E, T1L); + T1X = VSUB(T1T, T1W); + T1Y = VBYI(VSUB(T1M, T1X)); + T2E = VBYI(VADD(T1X, T1M)); + T23 = VSUB(T21, T22); + T26 = VSUB(T24, T25); + T27 = VSUB(T23, T26); + T2F = VADD(T23, T26); + T1x = LDW(&(W[TWVL * 18])); + T28 = VZMUL(T1x, VADD(T1Y, T27)); + T2N = LDW(&(W[TWVL * 50])); + T2O = VZMUL(T2N, VSUB(T2F, T2E)); + T2v = LDW(&(W[TWVL * 42])); + T2w = VZMUL(T2v, VSUB(T27, T1Y)); + T2D = LDW(&(W[TWVL * 10])); + T2G = VZMUL(T2D, VADD(T2E, T2F)); + T2S = VADD(T2c, T2d); + T2T = VADD(T2n, T2o); + T2U = VADD(T2S, T2T); + T3x = VSUB(T2S, T2T); + T2V = VADD(T2r, T2q); + T2W = VADD(T2h, T2k); + T2X = VBYI(VADD(T2V, T2W)); + T3w = VBYI(VSUB(T2W, T2V)); + T2R = LDW(&(W[TWVL * 60])); + T2Y = VZMULI(T2R, VSUB(T2U, T2X)); + T4J = LDW(&(W[0])); + T4K = VZMULI(T4J, VADD(T2X, T2U)); + T3v = LDW(&(W[TWVL * 28])); + T3y = VZMULI(T3v, VADD(T3w, T3x)); + T4B = LDW(&(W[TWVL * 32])); + T4C = VZMULI(T4B, VSUB(T3x, T3w)); + } + } + { + V T29, T4M, T2P, T4t, T4N, T2a, T4u, T2Q, T2x, T4H, T2H, T4z, T4I, T2y, T4A; + V T2I, T37, T4h, T3B, T3X, T4i, T38, T3Y, T3C, T3j, T4b, T3t, T43, T4c, T3k; + V T44, T3u; + T29 = VADD(T1w, T28); + ST(&(Rp[WS(rs, 5)]), T29, ms, &(Rp[WS(rs, 1)])); + T4M = VADD(T4K, T4L); + ST(&(Rp[0]), T4M, ms, &(Rp[0])); + T2P = VADD(T2M, T2O); + ST(&(Rp[WS(rs, 13)]), T2P, ms, &(Rp[WS(rs, 1)])); + T4t = VADD(T4k, T4s); + ST(&(Rp[WS(rs, 12)]), T4t, ms, &(Rp[0])); + T4N = VCONJ(VSUB(T4L, T4K)); + ST(&(Rm[0]), T4N, -ms, &(Rm[0])); + T2a = VCONJ(VSUB(T28, T1w)); + ST(&(Rm[WS(rs, 5)]), T2a, -ms, &(Rm[WS(rs, 1)])); + T4u = VCONJ(VSUB(T4s, T4k)); + ST(&(Rm[WS(rs, 12)]), T4u, -ms, &(Rm[0])); + T2Q = VCONJ(VSUB(T2O, T2M)); + ST(&(Rm[WS(rs, 13)]), T2Q, -ms, &(Rm[WS(rs, 1)])); + T2x = VADD(T2u, T2w); + ST(&(Rp[WS(rs, 11)]), T2x, ms, &(Rp[WS(rs, 1)])); + T4H = VADD(T4C, T4G); + ST(&(Rp[WS(rs, 8)]), T4H, ms, &(Rp[0])); + T2H = VADD(T2C, T2G); + ST(&(Rp[WS(rs, 3)]), T2H, ms, &(Rp[WS(rs, 1)])); + T4z = VADD(T4w, T4y); + ST(&(Rp[WS(rs, 4)]), T4z, ms, &(Rp[0])); + T4I = VCONJ(VSUB(T4G, T4C)); + ST(&(Rm[WS(rs, 8)]), T4I, -ms, &(Rm[0])); + T2y = VCONJ(VSUB(T2w, T2u)); + ST(&(Rm[WS(rs, 11)]), T2y, -ms, &(Rm[WS(rs, 1)])); + T4A = VCONJ(VSUB(T4y, T4w)); + ST(&(Rm[WS(rs, 4)]), T4A, -ms, &(Rm[0])); + T2I = VCONJ(VSUB(T2G, T2C)); + ST(&(Rm[WS(rs, 3)]), T2I, -ms, &(Rm[WS(rs, 1)])); + T37 = VADD(T2Y, T36); + ST(&(Rp[WS(rs, 15)]), T37, ms, &(Rp[WS(rs, 1)])); + T4h = VADD(T4e, T4g); + ST(&(Rp[WS(rs, 14)]), T4h, ms, &(Rp[0])); + T3B = VADD(T3y, T3A); + ST(&(Rp[WS(rs, 7)]), T3B, ms, &(Rp[WS(rs, 1)])); + T3X = VADD(T3E, T3W); + ST(&(Rp[WS(rs, 6)]), T3X, ms, &(Rp[0])); + T4i = VCONJ(VSUB(T4g, T4e)); + ST(&(Rm[WS(rs, 14)]), T4i, -ms, &(Rm[0])); + T38 = VCONJ(VSUB(T36, T2Y)); + ST(&(Rm[WS(rs, 15)]), T38, -ms, &(Rm[WS(rs, 1)])); + T3Y = VCONJ(VSUB(T3W, T3E)); + ST(&(Rm[WS(rs, 6)]), T3Y, -ms, &(Rm[0])); + T3C = VCONJ(VSUB(T3A, T3y)); + ST(&(Rm[WS(rs, 7)]), T3C, -ms, &(Rm[WS(rs, 1)])); + T3j = VADD(T3g, T3i); + ST(&(Rp[WS(rs, 1)]), T3j, ms, &(Rp[WS(rs, 1)])); + T4b = VADD(T46, T4a); + ST(&(Rp[WS(rs, 2)]), T4b, ms, &(Rp[0])); + T3t = VADD(T3o, T3s); + ST(&(Rp[WS(rs, 9)]), T3t, ms, &(Rp[WS(rs, 1)])); + T43 = VADD(T40, T42); + ST(&(Rp[WS(rs, 10)]), T43, ms, &(Rp[0])); + T4c = VCONJ(VSUB(T4a, T46)); + ST(&(Rm[WS(rs, 2)]), T4c, -ms, &(Rm[0])); + T3k = VCONJ(VSUB(T3i, T3g)); + ST(&(Rm[WS(rs, 1)]), T3k, -ms, &(Rm[WS(rs, 1)])); + T44 = VCONJ(VSUB(T42, T40)); + ST(&(Rm[WS(rs, 10)]), T44, -ms, &(Rm[0])); + T3u = VCONJ(VSUB(T3s, T3o)); + ST(&(Rm[WS(rs, 9)]), T3u, -ms, &(Rm[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + VTW(1, 20), + VTW(1, 21), + VTW(1, 22), + VTW(1, 23), + VTW(1, 24), + VTW(1, 25), + VTW(1, 26), + VTW(1, 27), + VTW(1, 28), + VTW(1, 29), + VTW(1, 30), + VTW(1, 31), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 32, XSIMD_STRING("hc2cbdftv_32"), twinstr, &GENUS, {233, 88, 16, 0} }; + +void XSIMD(codelet_hc2cbdftv_32) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_32, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_4.c new file mode 100644 index 000000000..1e6d7917f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_4.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 4 -dif -sign 1 -name hc2cbdftv_4 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 15 FP additions, 12 FP multiplications, + * (or, 9 additions, 6 multiplications, 6 fused multiply/add), + * 20 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 6)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(16, rs)) { + V Th, Tg, T8, Tc, T4, Ta, T7, Tb, T2, T3, T5, T6, Tf, T1, T9; + V Td, Tj, Te, Ti; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VFNMSCONJ(T3, T2); + Ta = VFMACONJ(T3, T2); + T5 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T6 = LD(&(Rm[0]), -ms, &(Rm[0])); + T7 = VFNMSCONJ(T6, T5); + Tb = VFMACONJ(T6, T5); + Th = VADD(Ta, Tb); + Tf = LDW(&(W[0])); + Tg = VZMULI(Tf, VFMAI(T7, T4)); + T1 = LDW(&(W[TWVL * 4])); + T8 = VZMULI(T1, VFNMSI(T7, T4)); + T9 = LDW(&(W[TWVL * 2])); + Tc = VZMUL(T9, VSUB(Ta, Tb)); + Td = VADD(T8, Tc); + ST(&(Rp[WS(rs, 1)]), Td, ms, &(Rp[WS(rs, 1)])); + Tj = VCONJ(VSUB(Th, Tg)); + ST(&(Rm[0]), Tj, -ms, &(Rm[0])); + Te = VCONJ(VSUB(Tc, T8)); + ST(&(Rm[WS(rs, 1)]), Te, -ms, &(Rm[WS(rs, 1)])); + Ti = VADD(Tg, Th); + ST(&(Rp[0]), Ti, ms, &(Rp[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 4, XSIMD_STRING("hc2cbdftv_4"), twinstr, &GENUS, {9, 6, 6, 0} }; + +void XSIMD(codelet_hc2cbdftv_4) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_4, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 4 -dif -sign 1 -name hc2cbdftv_4 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 15 FP additions, 6 FP multiplications, + * (or, 15 additions, 6 multiplications, 0 fused multiply/add), + * 22 stack variables, 0 constants, and 8 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 6)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(16, rs)) { + V T5, Tc, T9, Td, T2, T4, T3, T6, T8, T7, Tj, Ti, Th, Tk, Tl; + V Ta, Te, T1, Tb, Tf, Tg; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VCONJ(T3); + T5 = VSUB(T2, T4); + Tc = VADD(T2, T4); + T6 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T7 = LD(&(Rm[0]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + T9 = VBYI(VSUB(T6, T8)); + Td = VADD(T6, T8); + Tj = VADD(Tc, Td); + Th = LDW(&(W[0])); + Ti = VZMULI(Th, VADD(T5, T9)); + Tk = VADD(Ti, Tj); + ST(&(Rp[0]), Tk, ms, &(Rp[0])); + Tl = VCONJ(VSUB(Tj, Ti)); + ST(&(Rm[0]), Tl, -ms, &(Rm[0])); + T1 = LDW(&(W[TWVL * 4])); + Ta = VZMULI(T1, VSUB(T5, T9)); + Tb = LDW(&(W[TWVL * 2])); + Te = VZMUL(Tb, VSUB(Tc, Td)); + Tf = VADD(Ta, Te); + ST(&(Rp[WS(rs, 1)]), Tf, ms, &(Rp[WS(rs, 1)])); + Tg = VCONJ(VSUB(Te, Ta)); + ST(&(Rm[WS(rs, 1)]), Tg, -ms, &(Rm[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 4, XSIMD_STRING("hc2cbdftv_4"), twinstr, &GENUS, {15, 6, 0, 0} }; + +void XSIMD(codelet_hc2cbdftv_4) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_4, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_6.c new file mode 100644 index 000000000..fd67b38b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_6.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 6 -dif -sign 1 -name hc2cbdftv_6 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 29 FP additions, 24 FP multiplications, + * (or, 17 additions, 12 multiplications, 12 fused multiply/add), + * 38 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 10)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(24, rs)) { + V T4, Te, Tj, Tp, Tb, To, Th, Ti, Ta, Tg, T7, Tf, T2, T3, T8; + V T9, T5, T6, Tx, Tw, Tv, Ty, Tz, Tq, Ts, Tn, Tr, Tt, Tu, Tc; + V Tk, T1, Td, Tl, Tm; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T4 = VFNMSCONJ(T3, T2); + Te = VFMACONJ(T3, T2); + T8 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T9 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Ta = VFMSCONJ(T9, T8); + Tg = VFMACONJ(T9, T8); + T5 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T6 = LD(&(Rm[0]), -ms, &(Rm[0])); + T7 = VFNMSCONJ(T6, T5); + Tf = VFMACONJ(T6, T5); + Tj = VMUL(LDK(KP866025403), VSUB(Tf, Tg)); + Tp = VMUL(LDK(KP866025403), VSUB(T7, Ta)); + Tb = VADD(T7, Ta); + To = VFNMS(LDK(KP500000000), Tb, T4); + Th = VADD(Tf, Tg); + Ti = VFNMS(LDK(KP500000000), Th, Te); + Tx = VADD(Te, Th); + Tv = LDW(&(W[0])); + Tw = VZMULI(Tv, VFMAI(Tp, To)); + Ty = VADD(Tw, Tx); + ST(&(Rp[0]), Ty, ms, &(Rp[0])); + Tz = VCONJ(VSUB(Tx, Tw)); + ST(&(Rm[0]), Tz, -ms, &(Rm[0])); + Tn = LDW(&(W[TWVL * 8])); + Tq = VZMULI(Tn, VFNMSI(Tp, To)); + Tr = LDW(&(W[TWVL * 6])); + Ts = VZMUL(Tr, VFMAI(Tj, Ti)); + Tt = VADD(Tq, Ts); + ST(&(Rp[WS(rs, 2)]), Tt, ms, &(Rp[0])); + Tu = VCONJ(VSUB(Ts, Tq)); + ST(&(Rm[WS(rs, 2)]), Tu, -ms, &(Rm[0])); + T1 = LDW(&(W[TWVL * 4])); + Tc = VZMULI(T1, VADD(T4, Tb)); + Td = LDW(&(W[TWVL * 2])); + Tk = VZMUL(Td, VFNMSI(Tj, Ti)); + Tl = VADD(Tc, Tk); + ST(&(Rp[WS(rs, 1)]), Tl, ms, &(Rp[WS(rs, 1)])); + Tm = VCONJ(VSUB(Tk, Tc)); + ST(&(Rm[WS(rs, 1)]), Tm, -ms, &(Rm[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 6, XSIMD_STRING("hc2cbdftv_6"), twinstr, &GENUS, {17, 12, 12, 0} }; + +void XSIMD(codelet_hc2cbdftv_6) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_6, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 6 -dif -sign 1 -name hc2cbdftv_6 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 29 FP additions, 14 FP multiplications, + * (or, 27 additions, 12 multiplications, 2 fused multiply/add), + * 41 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 10)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(24, rs)) { + V T5, Th, Te, Ts, Tk, Tm, T2, T4, T3, T6, Tc, T8, Tb, T7, Ta; + V T9, Td, Ti, Tj, TA, Tf, Tn, Tv, Tt, Tz, T1, Tl, Tg, Tu, Tr; + V Tq, Ty, To, Tp, TC, TB, Tx, Tw; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T4 = VCONJ(T3); + T5 = VSUB(T2, T4); + Th = VADD(T2, T4); + T6 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Tc = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T7 = LD(&(Rm[0]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + Ta = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tb = VCONJ(Ta); + T9 = VSUB(T6, T8); + Td = VSUB(Tb, Tc); + Te = VADD(T9, Td); + Ts = VBYI(VMUL(LDK(KP866025403), VSUB(T9, Td))); + Ti = VADD(T6, T8); + Tj = VADD(Tb, Tc); + Tk = VADD(Ti, Tj); + Tm = VBYI(VMUL(LDK(KP866025403), VSUB(Ti, Tj))); + TA = VADD(Th, Tk); + T1 = LDW(&(W[TWVL * 4])); + Tf = VZMULI(T1, VADD(T5, Te)); + Tl = VFNMS(LDK(KP500000000), Tk, Th); + Tg = LDW(&(W[TWVL * 2])); + Tn = VZMUL(Tg, VSUB(Tl, Tm)); + Tu = LDW(&(W[TWVL * 6])); + Tv = VZMUL(Tu, VADD(Tm, Tl)); + Tr = VFNMS(LDK(KP500000000), Te, T5); + Tq = LDW(&(W[TWVL * 8])); + Tt = VZMULI(Tq, VSUB(Tr, Ts)); + Ty = LDW(&(W[0])); + Tz = VZMULI(Ty, VADD(Ts, Tr)); + To = VADD(Tf, Tn); + ST(&(Rp[WS(rs, 1)]), To, ms, &(Rp[WS(rs, 1)])); + Tp = VCONJ(VSUB(Tn, Tf)); + ST(&(Rm[WS(rs, 1)]), Tp, -ms, &(Rm[WS(rs, 1)])); + TC = VCONJ(VSUB(TA, Tz)); + ST(&(Rm[0]), TC, -ms, &(Rm[0])); + TB = VADD(Tz, TA); + ST(&(Rp[0]), TB, ms, &(Rp[0])); + Tx = VCONJ(VSUB(Tv, Tt)); + ST(&(Rm[WS(rs, 2)]), Tx, -ms, &(Rm[0])); + Tw = VADD(Tt, Tv); + ST(&(Rp[WS(rs, 2)]), Tw, ms, &(Rp[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 6, XSIMD_STRING("hc2cbdftv_6"), twinstr, &GENUS, {27, 12, 2, 0} }; + +void XSIMD(codelet_hc2cbdftv_6) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_6, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_8.c new file mode 100644 index 000000000..56b26fe7b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cbdftv_8.c @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 8 -dif -sign 1 -name hc2cbdftv_8 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 41 FP additions, 32 FP multiplications, + * (or, 23 additions, 14 multiplications, 18 fused multiply/add), + * 51 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 14)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(32, rs)) { + V Tm, Tp, TF, TE, Th, Tv, Tc, Tu, T4, Tk, Tf, Tl, T7, Tn, Ta; + V To, T2, T3, Td, Te, T5, T6, T8, T9, Tg, Tb, TL, TK, TJ, TM; + V TN, TC, TG, TB, TD, TH, TI, Ti, Tq, T1, Tj, Tr, Ts, Tw, Ty; + V Tt, Tx, Tz, TA; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VFNMSCONJ(T3, T2); + Tk = VFMACONJ(T3, T2); + Td = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Te = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tf = VFNMSCONJ(Te, Td); + Tl = VFMACONJ(Te, Td); + T5 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T6 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T7 = VFNMSCONJ(T6, T5); + Tn = VFMACONJ(T6, T5); + T8 = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + T9 = LD(&(Rm[0]), -ms, &(Rm[0])); + Ta = VFMSCONJ(T9, T8); + To = VFMACONJ(T9, T8); + Tm = VSUB(Tk, Tl); + Tp = VSUB(Tn, To); + TF = VADD(Tn, To); + TE = VADD(Tk, Tl); + Tg = VSUB(T7, Ta); + Th = VFMA(LDK(KP707106781), Tg, Tf); + Tv = VFNMS(LDK(KP707106781), Tg, Tf); + Tb = VADD(T7, Ta); + Tc = VFMA(LDK(KP707106781), Tb, T4); + Tu = VFNMS(LDK(KP707106781), Tb, T4); + TL = VADD(TE, TF); + TJ = LDW(&(W[0])); + TK = VZMULI(TJ, VFMAI(Th, Tc)); + TM = VADD(TK, TL); + ST(&(Rp[0]), TM, ms, &(Rp[0])); + TN = VCONJ(VSUB(TL, TK)); + ST(&(Rm[0]), TN, -ms, &(Rm[0])); + TB = LDW(&(W[TWVL * 8])); + TC = VZMULI(TB, VFMAI(Tv, Tu)); + TD = LDW(&(W[TWVL * 6])); + TG = VZMUL(TD, VSUB(TE, TF)); + TH = VADD(TC, TG); + ST(&(Rp[WS(rs, 2)]), TH, ms, &(Rp[0])); + TI = VCONJ(VSUB(TG, TC)); + ST(&(Rm[WS(rs, 2)]), TI, -ms, &(Rm[0])); + T1 = LDW(&(W[TWVL * 12])); + Ti = VZMULI(T1, VFNMSI(Th, Tc)); + Tj = LDW(&(W[TWVL * 10])); + Tq = VZMUL(Tj, VFNMSI(Tp, Tm)); + Tr = VADD(Ti, Tq); + ST(&(Rp[WS(rs, 3)]), Tr, ms, &(Rp[WS(rs, 1)])); + Ts = VCONJ(VSUB(Tq, Ti)); + ST(&(Rm[WS(rs, 3)]), Ts, -ms, &(Rm[WS(rs, 1)])); + Tt = LDW(&(W[TWVL * 4])); + Tw = VZMULI(Tt, VFNMSI(Tv, Tu)); + Tx = LDW(&(W[TWVL * 2])); + Ty = VZMUL(Tx, VFMAI(Tp, Tm)); + Tz = VADD(Tw, Ty); + ST(&(Rp[WS(rs, 1)]), Tz, ms, &(Rp[WS(rs, 1)])); + TA = VCONJ(VSUB(Ty, Tw)); + ST(&(Rm[WS(rs, 1)]), TA, -ms, &(Rm[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 8, XSIMD_STRING("hc2cbdftv_8"), twinstr, &GENUS, {23, 14, 18, 0} }; + +void XSIMD(codelet_hc2cbdftv_8) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_8, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 8 -dif -sign 1 -name hc2cbdftv_8 -include rdft/simd/hc2cbv.h */ + +/* + * This function contains 41 FP additions, 16 FP multiplications, + * (or, 41 additions, 16 multiplications, 0 fused multiply/add), + * 55 stack variables, 1 constants, and 16 memory accesses + */ +#include "rdft/simd/hc2cbv.h" + +static void hc2cbdftv_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 14)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(32, rs)) { + V T5, Tj, Tq, TI, Te, Tk, Tt, TJ, T2, Tg, T4, Ti, T3, Th, To; + V Tp, T6, Tc, T8, Tb, T7, Ta, T9, Td, Tr, Ts, TP, Tu, Tm, TO; + V Tn, Tf, Tl, T1, TN, Tv, TR, Tw, TQ, TC, TK, TA, TG, TB, TH; + V Ty, Tz, Tx, TF, TD, TM, TE, TL; + T2 = LD(&(Rp[0]), ms, &(Rp[0])); + Tg = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T3 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + T4 = VCONJ(T3); + Th = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Ti = VCONJ(Th); + T5 = VSUB(T2, T4); + Tj = VSUB(Tg, Ti); + To = VADD(T2, T4); + Tp = VADD(Tg, Ti); + Tq = VSUB(To, Tp); + TI = VADD(To, Tp); + T6 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tc = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + T7 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + Ta = LD(&(Rm[0]), -ms, &(Rm[0])); + Tb = VCONJ(Ta); + T9 = VSUB(T6, T8); + Td = VSUB(Tb, Tc); + Te = VMUL(LDK(KP707106781), VADD(T9, Td)); + Tk = VMUL(LDK(KP707106781), VSUB(T9, Td)); + Tr = VADD(T6, T8); + Ts = VADD(Tb, Tc); + Tt = VBYI(VSUB(Tr, Ts)); + TJ = VADD(Tr, Ts); + TP = VADD(TI, TJ); + Tn = LDW(&(W[TWVL * 10])); + Tu = VZMUL(Tn, VSUB(Tq, Tt)); + Tf = VADD(T5, Te); + Tl = VBYI(VADD(Tj, Tk)); + T1 = LDW(&(W[TWVL * 12])); + Tm = VZMULI(T1, VSUB(Tf, Tl)); + TN = LDW(&(W[0])); + TO = VZMULI(TN, VADD(Tl, Tf)); + Tv = VADD(Tm, Tu); + ST(&(Rp[WS(rs, 3)]), Tv, ms, &(Rp[WS(rs, 1)])); + TR = VCONJ(VSUB(TP, TO)); + ST(&(Rm[0]), TR, -ms, &(Rm[0])); + Tw = VCONJ(VSUB(Tu, Tm)); + ST(&(Rm[WS(rs, 3)]), Tw, -ms, &(Rm[WS(rs, 1)])); + TQ = VADD(TO, TP); + ST(&(Rp[0]), TQ, ms, &(Rp[0])); + TB = LDW(&(W[TWVL * 2])); + TC = VZMUL(TB, VADD(Tq, Tt)); + TH = LDW(&(W[TWVL * 6])); + TK = VZMUL(TH, VSUB(TI, TJ)); + Ty = VBYI(VSUB(Tk, Tj)); + Tz = VSUB(T5, Te); + Tx = LDW(&(W[TWVL * 4])); + TA = VZMULI(Tx, VADD(Ty, Tz)); + TF = LDW(&(W[TWVL * 8])); + TG = VZMULI(TF, VSUB(Tz, Ty)); + TD = VADD(TA, TC); + ST(&(Rp[WS(rs, 1)]), TD, ms, &(Rp[WS(rs, 1)])); + TM = VCONJ(VSUB(TK, TG)); + ST(&(Rm[WS(rs, 2)]), TM, -ms, &(Rm[0])); + TE = VCONJ(VSUB(TC, TA)); + ST(&(Rm[WS(rs, 1)]), TE, -ms, &(Rm[WS(rs, 1)])); + TL = VADD(TG, TK); + ST(&(Rp[WS(rs, 2)]), TL, ms, &(Rp[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 8, XSIMD_STRING("hc2cbdftv_8"), twinstr, &GENUS, {41, 16, 0, 0} }; + +void XSIMD(codelet_hc2cbdftv_8) (planner *p) { + X(khc2c_register) (p, hc2cbdftv_8, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_10.c new file mode 100644 index 000000000..4edf0a744 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_10.c @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 10 -dit -name hc2cfdftv_10 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 61 FP additions, 60 FP multiplications, + * (or, 33 additions, 32 multiplications, 28 fused multiply/add), + * 77 stack variables, 5 constants, and 20 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 18)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(40, rs)) { + V T8, T11, T12, TG, TH, TP, Tp, TA, TB, TS, TV, TW, TC, TX, TI; + V TM, TF, TL, TD, TE, TJ, TO, TK, TN, T13, T17, T10, T16, TY, TZ; + V T14, T19, T15, T18; + { + V T3, To, TU, Th, TT, TR, Tz, Tu, TQ, T7, T1, T2, Tw, T5, T6; + V Tr, Tc, Tj, Tg, Ty, Tn, Tt, Tv, Tq, Ta, Tb, T9, Ti, Te, Tf; + V Td, Tx, Tl, Tm, Tk, Ts, T4; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + Tv = LDW(&(W[0])); + Tw = VZMULIJ(Tv, VFNMSCONJ(T2, T1)); + T5 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tq = LDW(&(W[TWVL * 6])); + Tr = VZMULJ(Tq, VFMACONJ(T6, T5)); + Ta = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tb = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T9 = LDW(&(W[TWVL * 2])); + Tc = VZMULJ(T9, VFMACONJ(Tb, Ta)); + Ti = LDW(&(W[TWVL * 4])); + Tj = VZMULIJ(Ti, VFNMSCONJ(Tb, Ta)); + Te = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tf = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Td = LDW(&(W[TWVL * 12])); + Tg = VZMULIJ(Td, VFNMSCONJ(Tf, Te)); + Tx = LDW(&(W[TWVL * 10])); + Ty = VZMULJ(Tx, VFMACONJ(Tf, Te)); + Tl = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Tm = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Tk = LDW(&(W[TWVL * 14])); + Tn = VZMULJ(Tk, VFMACONJ(Tm, Tl)); + Ts = LDW(&(W[TWVL * 16])); + Tt = VZMULIJ(Ts, VFNMSCONJ(Tm, Tl)); + T3 = VFMACONJ(T2, T1); + To = VSUB(Tj, Tn); + TU = VADD(Tr, Tt); + Th = VSUB(Tc, Tg); + TT = VADD(Tw, Ty); + TR = VADD(Tj, Tn); + Tz = VSUB(Tw, Ty); + Tu = VSUB(Tr, Tt); + TQ = VADD(Tc, Tg); + T4 = LDW(&(W[TWVL * 8])); + T7 = VZMULIJ(T4, VFNMSCONJ(T6, T5)); + T8 = VSUB(T3, T7); + T11 = VSUB(TQ, TR); + T12 = VSUB(TU, TT); + TG = VADD(Tz, Tu); + TH = VADD(Th, To); + TP = VADD(T3, T7); + Tp = VSUB(Th, To); + TA = VSUB(Tu, Tz); + TB = VADD(Tp, TA); + TS = VADD(TQ, TR); + TV = VADD(TT, TU); + TW = VADD(TS, TV); + } + TC = VMUL(LDK(KP500000000), VADD(T8, TB)); + ST(&(Rp[0]), TC, ms, &(Rp[0])); + TX = VCONJ(VMUL(LDK(KP500000000), VADD(TP, TW))); + ST(&(Rm[WS(rs, 4)]), TX, -ms, &(Rm[0])); + TI = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), TH, TG)); + TM = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), TG, TH)); + TD = VFNMS(LDK(KP250000000), TB, T8); + TE = VSUB(Tp, TA); + TF = VFNMS(LDK(KP559016994), TE, TD); + TL = VFMA(LDK(KP559016994), TE, TD); + TJ = VCONJ(VMUL(LDK(KP500000000), VFNMSI(TI, TF))); + ST(&(Rm[WS(rs, 1)]), TJ, -ms, &(Rm[WS(rs, 1)])); + TO = VMUL(LDK(KP500000000), VFMAI(TM, TL)); + ST(&(Rp[WS(rs, 4)]), TO, ms, &(Rp[0])); + TK = VMUL(LDK(KP500000000), VFMAI(TI, TF)); + ST(&(Rp[WS(rs, 2)]), TK, ms, &(Rp[0])); + TN = VCONJ(VMUL(LDK(KP500000000), VFNMSI(TM, TL))); + ST(&(Rm[WS(rs, 3)]), TN, -ms, &(Rm[WS(rs, 1)])); + T13 = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T12, T11)); + T17 = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T11, T12)); + TY = VFNMS(LDK(KP250000000), TW, TP); + TZ = VSUB(TS, TV); + T10 = VFMA(LDK(KP559016994), TZ, TY); + T16 = VFNMS(LDK(KP559016994), TZ, TY); + T14 = VMUL(LDK(KP500000000), VFNMSI(T13, T10)); + ST(&(Rp[WS(rs, 1)]), T14, ms, &(Rp[WS(rs, 1)])); + T19 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T17, T16))); + ST(&(Rm[WS(rs, 2)]), T19, -ms, &(Rm[0])); + T15 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T13, T10))); + ST(&(Rm[0]), T15, -ms, &(Rm[0])); + T18 = VMUL(LDK(KP500000000), VFNMSI(T17, T16)); + ST(&(Rp[WS(rs, 3)]), T18, ms, &(Rp[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 10, XSIMD_STRING("hc2cfdftv_10"), twinstr, &GENUS, {33, 32, 28, 0} }; + +void XSIMD(codelet_hc2cfdftv_10) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_10, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 10 -dit -name hc2cfdftv_10 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 61 FP additions, 38 FP multiplications, + * (or, 55 additions, 32 multiplications, 6 fused multiply/add), + * 82 stack variables, 5 constants, and 20 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_10(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP125000000, +0.125000000000000000000000000000000000000000000); + DVK(KP279508497, +0.279508497187473712051146708591409529430077295); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 18)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 18), MAKE_VOLATILE_STRIDE(40, rs)) { + V Tl, Tt, Tu, TY, TZ, T10, Tz, TE, TF, TV, TW, TX, Ta, TU, TN; + V TR, TH, TQ, TK, TL, TM, TI, TG, TJ, TT, TO, TP, TS, T18, T1c; + V T12, T1b, T15, T16, T17, T14, T11, T13, T1e, T19, T1a, T1d; + { + V T1, T3, Ty, T8, T7, TB, Tf, Ts, Tk, Tw, Tq, TD, T2, Tx, T6; + V TA, Tc, Te, Td, Tb, Tr, Tj, Ti, Th, Tg, Tv, Tn, Tp, To, Tm; + V TC, T4, T9, T5; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + Tx = LDW(&(W[0])); + Ty = VZMULIJ(Tx, VSUB(T3, T1)); + T8 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T7 = VCONJ(T6); + TA = LDW(&(W[TWVL * 6])); + TB = VZMULJ(TA, VADD(T7, T8)); + Tc = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Td = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Te = VCONJ(Td); + Tb = LDW(&(W[TWVL * 2])); + Tf = VZMULJ(Tb, VADD(Tc, Te)); + Tr = LDW(&(W[TWVL * 4])); + Ts = VZMULIJ(Tr, VSUB(Te, Tc)); + Tj = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Th = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Ti = VCONJ(Th); + Tg = LDW(&(W[TWVL * 12])); + Tk = VZMULIJ(Tg, VSUB(Ti, Tj)); + Tv = LDW(&(W[TWVL * 10])); + Tw = VZMULJ(Tv, VADD(Ti, Tj)); + Tn = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + To = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Tp = VCONJ(To); + Tm = LDW(&(W[TWVL * 14])); + Tq = VZMULJ(Tm, VADD(Tn, Tp)); + TC = LDW(&(W[TWVL * 16])); + TD = VZMULIJ(TC, VSUB(Tp, Tn)); + Tl = VSUB(Tf, Tk); + Tt = VSUB(Tq, Ts); + Tu = VADD(Tl, Tt); + TY = VADD(Ty, Tw); + TZ = VADD(TB, TD); + T10 = VADD(TY, TZ); + Tz = VSUB(Tw, Ty); + TE = VSUB(TB, TD); + TF = VADD(Tz, TE); + TV = VADD(Tf, Tk); + TW = VADD(Ts, Tq); + TX = VADD(TV, TW); + T4 = VADD(T1, T3); + T5 = LDW(&(W[TWVL * 8])); + T9 = VZMULIJ(T5, VSUB(T7, T8)); + Ta = VSUB(T4, T9); + TU = VADD(T4, T9); + } + TL = VSUB(Tl, Tt); + TM = VSUB(TE, Tz); + TN = VMUL(LDK(KP500000000), VBYI(VFMA(LDK(KP951056516), TL, VMUL(LDK(KP587785252), TM)))); + TR = VMUL(LDK(KP500000000), VBYI(VFNMS(LDK(KP587785252), TL, VMUL(LDK(KP951056516), TM)))); + TI = VMUL(LDK(KP279508497), VSUB(Tu, TF)); + TG = VADD(Tu, TF); + TJ = VFNMS(LDK(KP125000000), TG, VMUL(LDK(KP500000000), Ta)); + TH = VCONJ(VMUL(LDK(KP500000000), VADD(Ta, TG))); + TQ = VSUB(TJ, TI); + TK = VADD(TI, TJ); + ST(&(Rm[WS(rs, 4)]), TH, -ms, &(Rm[0])); + TT = VCONJ(VADD(TQ, TR)); + ST(&(Rm[WS(rs, 2)]), TT, -ms, &(Rm[0])); + TO = VSUB(TK, TN); + ST(&(Rp[WS(rs, 1)]), TO, ms, &(Rp[WS(rs, 1)])); + TP = VCONJ(VADD(TK, TN)); + ST(&(Rm[0]), TP, -ms, &(Rm[0])); + TS = VSUB(TQ, TR); + ST(&(Rp[WS(rs, 3)]), TS, ms, &(Rp[WS(rs, 1)])); + T16 = VSUB(TZ, TY); + T17 = VSUB(TV, TW); + T18 = VMUL(LDK(KP500000000), VBYI(VFNMS(LDK(KP587785252), T17, VMUL(LDK(KP951056516), T16)))); + T1c = VMUL(LDK(KP500000000), VBYI(VFMA(LDK(KP951056516), T17, VMUL(LDK(KP587785252), T16)))); + T14 = VMUL(LDK(KP279508497), VSUB(TX, T10)); + T11 = VADD(TX, T10); + T13 = VFNMS(LDK(KP125000000), T11, VMUL(LDK(KP500000000), TU)); + T12 = VMUL(LDK(KP500000000), VADD(TU, T11)); + T1b = VADD(T14, T13); + T15 = VSUB(T13, T14); + ST(&(Rp[0]), T12, ms, &(Rp[0])); + T1e = VADD(T1b, T1c); + ST(&(Rp[WS(rs, 4)]), T1e, ms, &(Rp[0])); + T19 = VCONJ(VSUB(T15, T18)); + ST(&(Rm[WS(rs, 1)]), T19, -ms, &(Rm[WS(rs, 1)])); + T1a = VADD(T15, T18); + ST(&(Rp[WS(rs, 2)]), T1a, ms, &(Rp[0])); + T1d = VCONJ(VSUB(T1b, T1c)); + ST(&(Rm[WS(rs, 3)]), T1d, -ms, &(Rm[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 10, XSIMD_STRING("hc2cfdftv_10"), twinstr, &GENUS, {55, 32, 6, 0} }; + +void XSIMD(codelet_hc2cfdftv_10) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_10, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_12.c new file mode 100644 index 000000000..65aba3366 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_12.c @@ -0,0 +1,330 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 12 -dit -name hc2cfdftv_12 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 71 FP additions, 66 FP multiplications, + * (or, 41 additions, 36 multiplications, 30 fused multiply/add), + * 86 stack variables, 2 constants, and 24 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 22)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(48, rs)) { + V Td, TQ, Tr, TR, TI, TY, TA, TX, T12, T1e, TV, T1d, TK, TL, Ts; + V TJ, TO, TP, TM, TN, TW, T16, T13, T17, TS, TZ, T14, T19, T15, T18; + V T1f, T1j, T1c, T1i, T1a, T1b, T1g, T1l, T1h, T1k; + { + V T3, Tu, T7, Tw, Tp, TH, Tl, TE, Th, TC, Tb, Tz, T1, T2, Tt; + V T5, T6, T4, Tv, Tn, To, Tm, TG, Tj, Tk, Ti, TD, Tf, Tg, Te; + V TB, T9, Ta, T8, Ty, Tc, Tq, TF, Tx, T10, T11, TT, TU; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VFMACONJ(T2, T1); + Tt = LDW(&(W[0])); + Tu = VZMULIJ(Tt, VFNMSCONJ(T2, T1)); + T5 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T4 = LDW(&(W[TWVL * 6])); + T7 = VZMULJ(T4, VFMACONJ(T6, T5)); + Tv = LDW(&(W[TWVL * 8])); + Tw = VZMULIJ(Tv, VFNMSCONJ(T6, T5)); + Tn = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + To = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tm = LDW(&(W[TWVL * 2])); + Tp = VZMULJ(Tm, VFMACONJ(To, Tn)); + TG = LDW(&(W[TWVL * 4])); + TH = VZMULIJ(TG, VFNMSCONJ(To, Tn)); + Tj = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tk = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Ti = LDW(&(W[TWVL * 18])); + Tl = VZMULJ(Ti, VFMACONJ(Tk, Tj)); + TD = LDW(&(W[TWVL * 20])); + TE = VZMULIJ(TD, VFNMSCONJ(Tk, Tj)); + Tf = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tg = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Te = LDW(&(W[TWVL * 10])); + Th = VZMULJ(Te, VFMACONJ(Tg, Tf)); + TB = LDW(&(W[TWVL * 12])); + TC = VZMULIJ(TB, VFNMSCONJ(Tg, Tf)); + T9 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Ta = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T8 = LDW(&(W[TWVL * 14])); + Tb = VZMULJ(T8, VFMACONJ(Ta, T9)); + Ty = LDW(&(W[TWVL * 16])); + Tz = VZMULIJ(Ty, VFNMSCONJ(Ta, T9)); + Tc = VADD(T7, Tb); + Td = VADD(T3, Tc); + TQ = VFNMS(LDK(KP500000000), Tc, T3); + Tq = VADD(Tl, Tp); + Tr = VADD(Th, Tq); + TR = VFNMS(LDK(KP500000000), Tq, Th); + TF = VADD(TC, TE); + TI = VADD(TF, TH); + TY = VFNMS(LDK(KP500000000), TF, TH); + Tx = VADD(Tu, Tw); + TA = VADD(Tx, Tz); + TX = VFNMS(LDK(KP500000000), Tx, Tz); + T10 = VSUB(Tb, T7); + T11 = VSUB(Tp, Tl); + T12 = VSUB(T10, T11); + T1e = VADD(T10, T11); + TT = VSUB(TC, TE); + TU = VSUB(Tu, Tw); + TV = VSUB(TT, TU); + T1d = VADD(TU, TT); + } + Ts = VSUB(Td, Tr); + TJ = VSUB(TA, TI); + TK = VMUL(LDK(KP500000000), VFMAI(TJ, Ts)); + TL = VCONJ(VMUL(LDK(KP500000000), VFNMSI(TJ, Ts))); + ST(&(Rp[WS(rs, 3)]), TK, ms, &(Rp[WS(rs, 1)])); + ST(&(Rm[WS(rs, 2)]), TL, -ms, &(Rm[0])); + TM = VADD(Td, Tr); + TN = VADD(TA, TI); + TO = VMUL(LDK(KP500000000), VSUB(TM, TN)); + TP = VCONJ(VMUL(LDK(KP500000000), VADD(TN, TM))); + ST(&(Rp[0]), TO, ms, &(Rp[0])); + ST(&(Rm[WS(rs, 5)]), TP, -ms, &(Rm[WS(rs, 1)])); + TS = VSUB(TQ, TR); + TW = VFMA(LDK(KP866025403), TV, TS); + T16 = VFNMS(LDK(KP866025403), TV, TS); + TZ = VSUB(TX, TY); + T13 = VFNMS(LDK(KP866025403), T12, TZ); + T17 = VFMA(LDK(KP866025403), T12, TZ); + T14 = VMUL(LDK(KP500000000), VFNMSI(T13, TW)); + ST(&(Rp[WS(rs, 1)]), T14, ms, &(Rp[WS(rs, 1)])); + T19 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T17, T16))); + ST(&(Rm[WS(rs, 4)]), T19, -ms, &(Rm[0])); + T15 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T13, TW))); + ST(&(Rm[0]), T15, -ms, &(Rm[0])); + T18 = VMUL(LDK(KP500000000), VFNMSI(T17, T16)); + ST(&(Rp[WS(rs, 5)]), T18, ms, &(Rp[WS(rs, 1)])); + T1f = VMUL(LDK(KP866025403), VSUB(T1d, T1e)); + T1j = VMUL(LDK(KP866025403), VADD(T1d, T1e)); + T1a = VADD(TX, TY); + T1b = VADD(TQ, TR); + T1c = VADD(T1a, T1b); + T1i = VSUB(T1b, T1a); + T1g = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1f, T1c))); + ST(&(Rm[WS(rs, 1)]), T1g, -ms, &(Rm[WS(rs, 1)])); + T1l = VMUL(LDK(KP500000000), VFMAI(T1j, T1i)); + ST(&(Rp[WS(rs, 4)]), T1l, ms, &(Rp[0])); + T1h = VMUL(LDK(KP500000000), VFMAI(T1f, T1c)); + ST(&(Rp[WS(rs, 2)]), T1h, ms, &(Rp[0])); + T1k = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1j, T1i))); + ST(&(Rm[WS(rs, 3)]), T1k, -ms, &(Rm[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 12, XSIMD_STRING("hc2cfdftv_12"), twinstr, &GENUS, {41, 36, 30, 0} }; + +void XSIMD(codelet_hc2cfdftv_12) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_12, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 12 -dit -name hc2cfdftv_12 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 71 FP additions, 41 FP multiplications, + * (or, 67 additions, 37 multiplications, 4 fused multiply/add), + * 58 stack variables, 4 constants, and 24 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_12(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP433012701, +0.433012701892219323381861585376468091735701313); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 22)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 22), MAKE_VOLATILE_STRIDE(48, rs)) { + V TX, T13, T4, Tf, TZ, TD, TF, T17, TW, T14, Tw, Tl, T10, TL, TN; + V T16; + { + V T1, T3, TA, Tb, Td, Te, T9, TC, T2, Tz, Tc, Ta, T6, T8, T7; + V T5, TB, TE, Ti, Tk, TI, Ts, Tu, Tv, Tq, TK, Tj, TH, Tt, Tr; + V Tn, Tp, To, Tm, TJ, Th, TM; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + Tz = LDW(&(W[0])); + TA = VZMULIJ(Tz, VSUB(T3, T1)); + Tb = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Tc = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Td = VCONJ(Tc); + Ta = LDW(&(W[TWVL * 14])); + Te = VZMULJ(Ta, VADD(Tb, Td)); + T6 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + T5 = LDW(&(W[TWVL * 6])); + T9 = VZMULJ(T5, VADD(T6, T8)); + TB = LDW(&(W[TWVL * 8])); + TC = VZMULIJ(TB, VSUB(T8, T6)); + TX = VSUB(TC, TA); + T13 = VSUB(Te, T9); + T4 = VADD(T1, T3); + Tf = VADD(T9, Te); + TZ = VFNMS(LDK(KP250000000), Tf, VMUL(LDK(KP500000000), T4)); + TD = VADD(TA, TC); + TE = LDW(&(W[TWVL * 16])); + TF = VZMULIJ(TE, VSUB(Td, Tb)); + T17 = VFNMS(LDK(KP500000000), TD, TF); + Ti = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tj = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tk = VCONJ(Tj); + TH = LDW(&(W[TWVL * 12])); + TI = VZMULIJ(TH, VSUB(Tk, Ti)); + Ts = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tt = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Tu = VCONJ(Tt); + Tr = LDW(&(W[TWVL * 2])); + Tv = VZMULJ(Tr, VADD(Ts, Tu)); + Tn = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + To = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Tp = VCONJ(To); + Tm = LDW(&(W[TWVL * 18])); + Tq = VZMULJ(Tm, VADD(Tn, Tp)); + TJ = LDW(&(W[TWVL * 20])); + TK = VZMULIJ(TJ, VSUB(Tp, Tn)); + TW = VSUB(TK, TI); + T14 = VSUB(Tv, Tq); + Tw = VADD(Tq, Tv); + Th = LDW(&(W[TWVL * 10])); + Tl = VZMULJ(Th, VADD(Ti, Tk)); + T10 = VFNMS(LDK(KP250000000), Tw, VMUL(LDK(KP500000000), Tl)); + TL = VADD(TI, TK); + TM = LDW(&(W[TWVL * 4])); + TN = VZMULIJ(TM, VSUB(Tu, Ts)); + T16 = VFNMS(LDK(KP500000000), TL, TN); + } + { + V Ty, TS, TP, TT, Tg, Tx, TG, TO, TQ, TV, TR, TU, T1i, T1o, T1l; + V T1p, T1g, T1h, T1j, T1k, T1m, T1r, T1n, T1q, T12, T1c, T19, T1d, TY, T11; + V T15, T18, T1a, T1f, T1b, T1e; + Tg = VADD(T4, Tf); + Tx = VADD(Tl, Tw); + Ty = VADD(Tg, Tx); + TS = VSUB(Tg, Tx); + TG = VADD(TD, TF); + TO = VADD(TL, TN); + TP = VADD(TG, TO); + TT = VBYI(VSUB(TO, TG)); + TQ = VCONJ(VMUL(LDK(KP500000000), VSUB(Ty, TP))); + ST(&(Rm[WS(rs, 5)]), TQ, -ms, &(Rm[WS(rs, 1)])); + TV = VMUL(LDK(KP500000000), VADD(TS, TT)); + ST(&(Rp[WS(rs, 3)]), TV, ms, &(Rp[WS(rs, 1)])); + TR = VMUL(LDK(KP500000000), VADD(Ty, TP)); + ST(&(Rp[0]), TR, ms, &(Rp[0])); + TU = VCONJ(VMUL(LDK(KP500000000), VSUB(TS, TT))); + ST(&(Rm[WS(rs, 2)]), TU, -ms, &(Rm[0])); + T1g = VADD(TX, TW); + T1h = VADD(T13, T14); + T1i = VMUL(LDK(KP500000000), VBYI(VMUL(LDK(KP866025403), VSUB(T1g, T1h)))); + T1o = VMUL(LDK(KP500000000), VBYI(VMUL(LDK(KP866025403), VADD(T1g, T1h)))); + T1j = VADD(TZ, T10); + T1k = VMUL(LDK(KP500000000), VADD(T17, T16)); + T1l = VSUB(T1j, T1k); + T1p = VADD(T1j, T1k); + T1m = VADD(T1i, T1l); + ST(&(Rp[WS(rs, 2)]), T1m, ms, &(Rp[0])); + T1r = VCONJ(VSUB(T1p, T1o)); + ST(&(Rm[WS(rs, 3)]), T1r, -ms, &(Rm[WS(rs, 1)])); + T1n = VCONJ(VSUB(T1l, T1i)); + ST(&(Rm[WS(rs, 1)]), T1n, -ms, &(Rm[WS(rs, 1)])); + T1q = VADD(T1o, T1p); + ST(&(Rp[WS(rs, 4)]), T1q, ms, &(Rp[0])); + TY = VMUL(LDK(KP433012701), VSUB(TW, TX)); + T11 = VSUB(TZ, T10); + T12 = VADD(TY, T11); + T1c = VSUB(T11, TY); + T15 = VMUL(LDK(KP866025403), VSUB(T13, T14)); + T18 = VSUB(T16, T17); + T19 = VMUL(LDK(KP500000000), VBYI(VSUB(T15, T18))); + T1d = VMUL(LDK(KP500000000), VBYI(VADD(T15, T18))); + T1a = VCONJ(VSUB(T12, T19)); + ST(&(Rm[0]), T1a, -ms, &(Rm[0])); + T1f = VCONJ(VADD(T1c, T1d)); + ST(&(Rm[WS(rs, 4)]), T1f, -ms, &(Rm[0])); + T1b = VADD(T12, T19); + ST(&(Rp[WS(rs, 1)]), T1b, ms, &(Rp[WS(rs, 1)])); + T1e = VSUB(T1c, T1d); + ST(&(Rp[WS(rs, 5)]), T1e, ms, &(Rp[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 12, XSIMD_STRING("hc2cfdftv_12"), twinstr, &GENUS, {67, 37, 4, 0} }; + +void XSIMD(codelet_hc2cfdftv_12) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_12, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_16.c new file mode 100644 index 000000000..afc57a22b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_16.c @@ -0,0 +1,432 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 16 -dit -name hc2cfdftv_16 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 103 FP additions, 96 FP multiplications, + * (or, 53 additions, 46 multiplications, 50 fused multiply/add), + * 92 stack variables, 4 constants, and 32 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 30)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(64, rs)) { + V T8, TZ, TH, T12, T1q, T1I, T1x, T1J, Tr, T10, T1A, T1K, TS, T13, T1t; + V T1N, T3, Tw, TF, TW, T7, Tu, TB, TY, T1, T2, Tv, TD, TE, TC; + V TV, T5, T6, T4, Tt, Tz, TA, Ty, TX, Tx, TG, T1o, T1p, T1v, T1w; + V T1C, T1D, T1u, T1B, T1G, T1H, T1E, T1F; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VFMACONJ(T2, T1); + Tv = LDW(&(W[0])); + Tw = VZMULIJ(Tv, VFNMSCONJ(T2, T1)); + TD = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + TE = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + TC = LDW(&(W[TWVL * 8])); + TF = VZMULIJ(TC, VFNMSCONJ(TE, TD)); + TV = LDW(&(W[TWVL * 6])); + TW = VZMULJ(TV, VFMACONJ(TE, TD)); + T5 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T4 = LDW(&(W[TWVL * 14])); + T7 = VZMULJ(T4, VFMACONJ(T6, T5)); + Tt = LDW(&(W[TWVL * 16])); + Tu = VZMULIJ(Tt, VFNMSCONJ(T6, T5)); + Tz = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + TA = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + Ty = LDW(&(W[TWVL * 24])); + TB = VZMULIJ(Ty, VFNMSCONJ(TA, Tz)); + TX = LDW(&(W[TWVL * 22])); + TY = VZMULJ(TX, VFMACONJ(TA, Tz)); + T8 = VSUB(T3, T7); + TZ = VSUB(TW, TY); + Tx = VSUB(Tu, Tw); + TG = VSUB(TB, TF); + TH = VFNMS(LDK(KP414213562), TG, Tx); + T12 = VFMA(LDK(KP414213562), Tx, TG); + T1o = VADD(T3, T7); + T1p = VADD(TW, TY); + T1q = VADD(T1o, T1p); + T1I = VSUB(T1o, T1p); + T1v = VADD(Tw, Tu); + T1w = VADD(TF, TB); + T1x = VADD(T1v, T1w); + T1J = VSUB(T1w, T1v); + { + V Tc, TQ, Tp, TJ, Tg, TO, Tl, TL, Ta, Tb, T9, TP, Tn, To, Tm; + V TI, Te, Tf, Td, TN, Tj, Tk, Ti, TK, Th, Tq, T1y, T1z, TM, TR; + V T1r, T1s; + Ta = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tb = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T9 = LDW(&(W[TWVL * 2])); + Tc = VZMULJ(T9, VFMACONJ(Tb, Ta)); + TP = LDW(&(W[TWVL * 4])); + TQ = VZMULIJ(TP, VFNMSCONJ(Tb, Ta)); + Tn = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + To = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tm = LDW(&(W[TWVL * 10])); + Tp = VZMULJ(Tm, VFMACONJ(To, Tn)); + TI = LDW(&(W[TWVL * 12])); + TJ = VZMULIJ(TI, VFNMSCONJ(To, Tn)); + Te = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tf = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Td = LDW(&(W[TWVL * 18])); + Tg = VZMULJ(Td, VFMACONJ(Tf, Te)); + TN = LDW(&(W[TWVL * 20])); + TO = VZMULIJ(TN, VFNMSCONJ(Tf, Te)); + Tj = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + Tk = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + Ti = LDW(&(W[TWVL * 26])); + Tl = VZMULJ(Ti, VFMACONJ(Tk, Tj)); + TK = LDW(&(W[TWVL * 28])); + TL = VZMULIJ(TK, VFNMSCONJ(Tk, Tj)); + Th = VSUB(Tc, Tg); + Tq = VSUB(Tl, Tp); + Tr = VADD(Th, Tq); + T10 = VSUB(Tq, Th); + T1y = VADD(TQ, TO); + T1z = VADD(TL, TJ); + T1A = VADD(T1y, T1z); + T1K = VSUB(T1y, T1z); + TM = VSUB(TJ, TL); + TR = VSUB(TO, TQ); + TS = VFMA(LDK(KP414213562), TR, TM); + T13 = VFNMS(LDK(KP414213562), TM, TR); + T1r = VADD(Tc, Tg); + T1s = VADD(Tl, Tp); + T1t = VADD(T1r, T1s); + T1N = VSUB(T1s, T1r); + } + T1u = VSUB(T1q, T1t); + T1B = VSUB(T1x, T1A); + T1C = VMUL(LDK(KP500000000), VFMAI(T1B, T1u)); + T1D = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1B, T1u))); + ST(&(Rp[WS(rs, 4)]), T1C, ms, &(Rp[0])); + ST(&(Rm[WS(rs, 3)]), T1D, -ms, &(Rm[WS(rs, 1)])); + T1E = VADD(T1q, T1t); + T1F = VADD(T1x, T1A); + T1G = VMUL(LDK(KP500000000), VSUB(T1E, T1F)); + T1H = VCONJ(VMUL(LDK(KP500000000), VADD(T1F, T1E))); + ST(&(Rp[0]), T1G, ms, &(Rp[0])); + ST(&(Rm[WS(rs, 7)]), T1H, -ms, &(Rm[WS(rs, 1)])); + { + V T1M, T1S, T1P, T1T, T1L, T1O, T1Q, T1V, T1R, T1U, TU, T18, T15, T19, Ts; + V TT, T11, T14, T16, T1b, T17, T1a, T1e, T1k, T1h, T1l, T1c, T1d, T1f, T1g; + V T1i, T1n, T1j, T1m; + T1L = VADD(T1J, T1K); + T1M = VFMA(LDK(KP707106781), T1L, T1I); + T1S = VFNMS(LDK(KP707106781), T1L, T1I); + T1O = VSUB(T1K, T1J); + T1P = VFMA(LDK(KP707106781), T1O, T1N); + T1T = VFNMS(LDK(KP707106781), T1O, T1N); + T1Q = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1P, T1M))); + ST(&(Rm[WS(rs, 1)]), T1Q, -ms, &(Rm[WS(rs, 1)])); + T1V = VCONJ(VMUL(LDK(KP500000000), VFMAI(T1T, T1S))); + ST(&(Rm[WS(rs, 5)]), T1V, -ms, &(Rm[WS(rs, 1)])); + T1R = VMUL(LDK(KP500000000), VFMAI(T1P, T1M)); + ST(&(Rp[WS(rs, 2)]), T1R, ms, &(Rp[0])); + T1U = VMUL(LDK(KP500000000), VFNMSI(T1T, T1S)); + ST(&(Rp[WS(rs, 6)]), T1U, ms, &(Rp[0])); + Ts = VFMA(LDK(KP707106781), Tr, T8); + TT = VADD(TH, TS); + TU = VFMA(LDK(KP923879532), TT, Ts); + T18 = VFNMS(LDK(KP923879532), TT, Ts); + T11 = VFNMS(LDK(KP707106781), T10, TZ); + T14 = VADD(T12, T13); + T15 = VFMA(LDK(KP923879532), T14, T11); + T19 = VFNMS(LDK(KP923879532), T14, T11); + T16 = VMUL(LDK(KP500000000), VFNMSI(T15, TU)); + ST(&(Rp[WS(rs, 1)]), T16, ms, &(Rp[WS(rs, 1)])); + T1b = VMUL(LDK(KP500000000), VFMAI(T19, T18)); + ST(&(Rp[WS(rs, 7)]), T1b, ms, &(Rp[WS(rs, 1)])); + T17 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T15, TU))); + ST(&(Rm[0]), T17, -ms, &(Rm[0])); + T1a = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T19, T18))); + ST(&(Rm[WS(rs, 6)]), T1a, -ms, &(Rm[0])); + T1c = VFNMS(LDK(KP707106781), Tr, T8); + T1d = VSUB(T12, T13); + T1e = VFMA(LDK(KP923879532), T1d, T1c); + T1k = VFNMS(LDK(KP923879532), T1d, T1c); + T1f = VFMA(LDK(KP707106781), T10, TZ); + T1g = VSUB(TS, TH); + T1h = VFMA(LDK(KP923879532), T1g, T1f); + T1l = VFNMS(LDK(KP923879532), T1g, T1f); + T1i = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1h, T1e))); + ST(&(Rm[WS(rs, 2)]), T1i, -ms, &(Rm[0])); + T1n = VCONJ(VMUL(LDK(KP500000000), VFMAI(T1l, T1k))); + ST(&(Rm[WS(rs, 4)]), T1n, -ms, &(Rm[0])); + T1j = VMUL(LDK(KP500000000), VFMAI(T1h, T1e)); + ST(&(Rp[WS(rs, 3)]), T1j, ms, &(Rp[WS(rs, 1)])); + T1m = VMUL(LDK(KP500000000), VFNMSI(T1l, T1k)); + ST(&(Rp[WS(rs, 5)]), T1m, ms, &(Rp[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 16, XSIMD_STRING("hc2cfdftv_16"), twinstr, &GENUS, {53, 46, 50, 0} }; + +void XSIMD(codelet_hc2cfdftv_16) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_16, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 16 -dit -name hc2cfdftv_16 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 103 FP additions, 56 FP multiplications, + * (or, 99 additions, 52 multiplications, 4 fused multiply/add), + * 101 stack variables, 5 constants, and 32 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_16(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP353553390, +0.353553390593273762200422181052424519642417969); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 30)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 30), MAKE_VOLATILE_STRIDE(64, rs)) { + V T1D, T1E, T1R, TP, T1b, Ta, T1w, T18, T1x, T1z, T1A, T1G, T1H, T1S, Tx; + V T13, T10, T1a, T1, T3, TA, TM, TL, TN, T6, T8, TC, TH, TG, TI; + V T2, Tz, TK, TJ, T7, TB, TF, TE, TD, TO, T4, T9, T5, T15, T17; + V T14, T16; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + Tz = LDW(&(W[0])); + TA = VZMULIJ(Tz, VSUB(T3, T1)); + TM = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + TK = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + TL = VCONJ(TK); + TJ = LDW(&(W[TWVL * 24])); + TN = VZMULIJ(TJ, VSUB(TL, TM)); + T6 = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + TB = LDW(&(W[TWVL * 16])); + TC = VZMULIJ(TB, VSUB(T8, T6)); + TH = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + TF = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + TG = VCONJ(TF); + TE = LDW(&(W[TWVL * 8])); + TI = VZMULIJ(TE, VSUB(TG, TH)); + T1D = VADD(TA, TC); + T1E = VADD(TI, TN); + T1R = VSUB(T1D, T1E); + TD = VSUB(TA, TC); + TO = VSUB(TI, TN); + TP = VFNMS(LDK(KP382683432), TO, VMUL(LDK(KP923879532), TD)); + T1b = VFMA(LDK(KP382683432), TD, VMUL(LDK(KP923879532), TO)); + T4 = VADD(T1, T3); + T5 = LDW(&(W[TWVL * 14])); + T9 = VZMULJ(T5, VADD(T6, T8)); + Ta = VMUL(LDK(KP500000000), VSUB(T4, T9)); + T1w = VADD(T4, T9); + T14 = LDW(&(W[TWVL * 6])); + T15 = VZMULJ(T14, VADD(TH, TG)); + T16 = LDW(&(W[TWVL * 22])); + T17 = VZMULJ(T16, VADD(TM, TL)); + T18 = VSUB(T15, T17); + T1x = VADD(T15, T17); + { + V Tf, TR, Tv, TY, Tk, TT, Tq, TW, Tc, Te, Td, Tb, TQ, Ts, Tu; + V Tt, Tr, TX, Th, Tj, Ti, Tg, TS, Tn, Tp, To, Tm, TV, Tl, Tw; + V TU, TZ; + Tc = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Td = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Te = VCONJ(Td); + Tb = LDW(&(W[TWVL * 2])); + Tf = VZMULJ(Tb, VADD(Tc, Te)); + TQ = LDW(&(W[TWVL * 4])); + TR = VZMULIJ(TQ, VSUB(Te, Tc)); + Ts = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tt = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tu = VCONJ(Tt); + Tr = LDW(&(W[TWVL * 10])); + Tv = VZMULJ(Tr, VADD(Ts, Tu)); + TX = LDW(&(W[TWVL * 12])); + TY = VZMULIJ(TX, VSUB(Tu, Ts)); + Th = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Ti = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Tj = VCONJ(Ti); + Tg = LDW(&(W[TWVL * 18])); + Tk = VZMULJ(Tg, VADD(Th, Tj)); + TS = LDW(&(W[TWVL * 20])); + TT = VZMULIJ(TS, VSUB(Tj, Th)); + Tn = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + To = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + Tp = VCONJ(To); + Tm = LDW(&(W[TWVL * 26])); + Tq = VZMULJ(Tm, VADD(Tn, Tp)); + TV = LDW(&(W[TWVL * 28])); + TW = VZMULIJ(TV, VSUB(Tp, Tn)); + T1z = VADD(Tf, Tk); + T1A = VADD(Tq, Tv); + T1G = VADD(TR, TT); + T1H = VADD(TW, TY); + T1S = VSUB(T1H, T1G); + Tl = VSUB(Tf, Tk); + Tw = VSUB(Tq, Tv); + Tx = VMUL(LDK(KP353553390), VADD(Tl, Tw)); + T13 = VMUL(LDK(KP707106781), VSUB(Tw, Tl)); + TU = VSUB(TR, TT); + TZ = VSUB(TW, TY); + T10 = VFMA(LDK(KP382683432), TU, VMUL(LDK(KP923879532), TZ)); + T1a = VFNMS(LDK(KP923879532), TU, VMUL(LDK(KP382683432), TZ)); + } + { + V T1U, T20, T1X, T21, T1Q, T1T, T1V, T1W, T1Y, T23, T1Z, T22, T1C, T1M, T1J; + V T1N, T1y, T1B, T1F, T1I, T1K, T1P, T1L, T1O, T12, T1g, T1d, T1h, Ty, T11; + V T19, T1c, T1e, T1j, T1f, T1i, T1m, T1s, T1p, T1t, T1k, T1l, T1n, T1o, T1q; + V T1v, T1r, T1u; + T1Q = VMUL(LDK(KP500000000), VSUB(T1w, T1x)); + T1T = VMUL(LDK(KP353553390), VADD(T1R, T1S)); + T1U = VADD(T1Q, T1T); + T20 = VSUB(T1Q, T1T); + T1V = VSUB(T1A, T1z); + T1W = VMUL(LDK(KP707106781), VSUB(T1S, T1R)); + T1X = VMUL(LDK(KP500000000), VBYI(VADD(T1V, T1W))); + T21 = VMUL(LDK(KP500000000), VBYI(VSUB(T1W, T1V))); + T1Y = VCONJ(VSUB(T1U, T1X)); + ST(&(Rm[WS(rs, 1)]), T1Y, -ms, &(Rm[WS(rs, 1)])); + T23 = VADD(T20, T21); + ST(&(Rp[WS(rs, 6)]), T23, ms, &(Rp[0])); + T1Z = VADD(T1U, T1X); + ST(&(Rp[WS(rs, 2)]), T1Z, ms, &(Rp[0])); + T22 = VCONJ(VSUB(T20, T21)); + ST(&(Rm[WS(rs, 5)]), T22, -ms, &(Rm[WS(rs, 1)])); + T1y = VADD(T1w, T1x); + T1B = VADD(T1z, T1A); + T1C = VADD(T1y, T1B); + T1M = VSUB(T1y, T1B); + T1F = VADD(T1D, T1E); + T1I = VADD(T1G, T1H); + T1J = VADD(T1F, T1I); + T1N = VBYI(VSUB(T1I, T1F)); + T1K = VCONJ(VMUL(LDK(KP500000000), VSUB(T1C, T1J))); + ST(&(Rm[WS(rs, 7)]), T1K, -ms, &(Rm[WS(rs, 1)])); + T1P = VMUL(LDK(KP500000000), VADD(T1M, T1N)); + ST(&(Rp[WS(rs, 4)]), T1P, ms, &(Rp[0])); + T1L = VMUL(LDK(KP500000000), VADD(T1C, T1J)); + ST(&(Rp[0]), T1L, ms, &(Rp[0])); + T1O = VCONJ(VMUL(LDK(KP500000000), VSUB(T1M, T1N))); + ST(&(Rm[WS(rs, 3)]), T1O, -ms, &(Rm[WS(rs, 1)])); + Ty = VADD(Ta, Tx); + T11 = VMUL(LDK(KP500000000), VADD(TP, T10)); + T12 = VADD(Ty, T11); + T1g = VSUB(Ty, T11); + T19 = VSUB(T13, T18); + T1c = VSUB(T1a, T1b); + T1d = VMUL(LDK(KP500000000), VBYI(VADD(T19, T1c))); + T1h = VMUL(LDK(KP500000000), VBYI(VSUB(T1c, T19))); + T1e = VCONJ(VSUB(T12, T1d)); + ST(&(Rm[0]), T1e, -ms, &(Rm[0])); + T1j = VADD(T1g, T1h); + ST(&(Rp[WS(rs, 7)]), T1j, ms, &(Rp[WS(rs, 1)])); + T1f = VADD(T12, T1d); + ST(&(Rp[WS(rs, 1)]), T1f, ms, &(Rp[WS(rs, 1)])); + T1i = VCONJ(VSUB(T1g, T1h)); + ST(&(Rm[WS(rs, 6)]), T1i, -ms, &(Rm[0])); + T1k = VSUB(T10, TP); + T1l = VADD(T18, T13); + T1m = VMUL(LDK(KP500000000), VBYI(VSUB(T1k, T1l))); + T1s = VMUL(LDK(KP500000000), VBYI(VADD(T1l, T1k))); + T1n = VSUB(Ta, Tx); + T1o = VMUL(LDK(KP500000000), VADD(T1b, T1a)); + T1p = VSUB(T1n, T1o); + T1t = VADD(T1n, T1o); + T1q = VADD(T1m, T1p); + ST(&(Rp[WS(rs, 5)]), T1q, ms, &(Rp[WS(rs, 1)])); + T1v = VCONJ(VSUB(T1t, T1s)); + ST(&(Rm[WS(rs, 2)]), T1v, -ms, &(Rm[0])); + T1r = VCONJ(VSUB(T1p, T1m)); + ST(&(Rm[WS(rs, 4)]), T1r, -ms, &(Rm[0])); + T1u = VADD(T1s, T1t); + ST(&(Rp[WS(rs, 3)]), T1u, ms, &(Rp[WS(rs, 1)])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 16, XSIMD_STRING("hc2cfdftv_16"), twinstr, &GENUS, {99, 52, 4, 0} }; + +void XSIMD(codelet_hc2cfdftv_16) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_16, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_2.c new file mode 100644 index 000000000..3e8dcf3b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_2.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 2 -dit -name hc2cfdftv_2 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 5 FP additions, 6 FP multiplications, + * (or, 3 additions, 4 multiplications, 2 fused multiply/add), + * 9 stack variables, 1 constants, and 4 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 2)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(8, rs)) { + V T3, T5, T1, T2, T4, T6, T7; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VFMACONJ(T2, T1); + T4 = LDW(&(W[0])); + T5 = VZMULIJ(T4, VFNMSCONJ(T2, T1)); + T6 = VMUL(LDK(KP500000000), VSUB(T3, T5)); + ST(&(Rp[0]), T6, ms, &(Rp[0])); + T7 = VCONJ(VMUL(LDK(KP500000000), VADD(T3, T5))); + ST(&(Rm[0]), T7, -ms, &(Rm[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 2, XSIMD_STRING("hc2cfdftv_2"), twinstr, &GENUS, {3, 4, 2, 0} }; + +void XSIMD(codelet_hc2cfdftv_2) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_2, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 2 -dit -name hc2cfdftv_2 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 5 FP additions, 4 FP multiplications, + * (or, 5 additions, 4 multiplications, 0 fused multiply/add), + * 10 stack variables, 1 constants, and 4 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_2(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 2)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 2), MAKE_VOLATILE_STRIDE(8, rs)) { + V T4, T6, T1, T3, T2, T5, T7, T8; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + T4 = VADD(T1, T3); + T5 = LDW(&(W[0])); + T6 = VZMULIJ(T5, VSUB(T3, T1)); + T7 = VCONJ(VMUL(LDK(KP500000000), VSUB(T4, T6))); + ST(&(Rm[0]), T7, -ms, &(Rm[0])); + T8 = VMUL(LDK(KP500000000), VADD(T4, T6)); + ST(&(Rp[0]), T8, ms, &(Rp[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 2, XSIMD_STRING("hc2cfdftv_2"), twinstr, &GENUS, {5, 4, 0, 0} }; + +void XSIMD(codelet_hc2cfdftv_2) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_2, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_20.c new file mode 100644 index 000000000..32a6c8563 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_20.c @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 20 -dit -name hc2cfdftv_20 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 143 FP additions, 128 FP multiplications, + * (or, 77 additions, 62 multiplications, 66 fused multiply/add), + * 129 stack variables, 5 constants, and 40 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP618033988, +0.618033988749894848204586834365638117720309180); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 38)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(80, rs)) { + V T1O, T2j, T2c, T2b, T2i, T1X, Tx, TM, TN, T1x, T1y, T1z, T1u, T1v, T1w; + V T12, T1d, T1e, T24, T2g, Ti, T1t, T1V, T29, T26, T27, T1W, T25, T1H, T1L; + V T1B, T1K, T1E, T1F, T1G, T1D, T1A, T1C, T1N, T1I, T1J, T1M; + { + V T3, T1Y, TC, T7, Tn, T1P, Tc, Tg, Tw, T1Z, TS, T1S, TL, T21, T17; + V T1Q, T11, T22, T1c, T1T, T1, T2, Tz, T5, T6, TB, Ty, TA, T4, Ta; + V Tb, Tk, Te, Tf, Tm, Tj, Tl, T9, Td, T20, T23, T8, Th, T1R, T1U; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + Ty = LDW(&(W[0])); + Tz = VZMULIJ(Ty, VFNMSCONJ(T2, T1)); + T5 = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + T6 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + TA = LDW(&(W[TWVL * 20])); + TB = VZMULIJ(TA, VFNMSCONJ(T6, T5)); + T3 = VFMACONJ(T2, T1); + T1Y = VSUB(TB, Tz); + TC = VADD(Tz, TB); + T4 = LDW(&(W[TWVL * 18])); + T7 = VZMULJ(T4, VFMACONJ(T6, T5)); + Ta = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Tb = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tj = LDW(&(W[TWVL * 6])); + Tk = VZMULJ(Tj, VFMACONJ(Tb, Ta)); + Te = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + Tf = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + Tl = LDW(&(W[TWVL * 26])); + Tm = VZMULJ(Tl, VFMACONJ(Tf, Te)); + Tn = VADD(Tk, Tm); + T1P = VSUB(Tk, Tm); + T9 = LDW(&(W[TWVL * 8])); + Tc = VZMULIJ(T9, VFNMSCONJ(Tb, Ta)); + Td = LDW(&(W[TWVL * 28])); + Tg = VZMULIJ(Td, VFNMSCONJ(Tf, Te)); + { + V Tr, TP, Tv, TR, Tp, Tq, To, TO, Tt, Tu, Ts, TQ, TG, T14, TK; + V T16, TE, TF, TD, T13, TI, TJ, TH, T15, TW, T19, T10, T1b, TU, TV; + V TT, T18, TY, TZ, TX, T1a; + Tp = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Tq = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + To = LDW(&(W[TWVL * 16])); + Tr = VZMULIJ(To, VFNMSCONJ(Tq, Tp)); + TO = LDW(&(W[TWVL * 14])); + TP = VZMULJ(TO, VFMACONJ(Tq, Tp)); + Tt = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + Tu = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + Ts = LDW(&(W[TWVL * 36])); + Tv = VZMULIJ(Ts, VFNMSCONJ(Tu, Tt)); + TQ = LDW(&(W[TWVL * 34])); + TR = VZMULJ(TQ, VFMACONJ(Tu, Tt)); + Tw = VADD(Tr, Tv); + T1Z = VSUB(Tv, Tr); + TS = VADD(TP, TR); + T1S = VSUB(TP, TR); + TE = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + TF = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + TD = LDW(&(W[TWVL * 30])); + TG = VZMULJ(TD, VFMACONJ(TF, TE)); + T13 = LDW(&(W[TWVL * 32])); + T14 = VZMULIJ(T13, VFNMSCONJ(TF, TE)); + TI = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + TJ = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + TH = LDW(&(W[TWVL * 10])); + TK = VZMULJ(TH, VFMACONJ(TJ, TI)); + T15 = LDW(&(W[TWVL * 12])); + T16 = VZMULIJ(T15, VFNMSCONJ(TJ, TI)); + TL = VADD(TG, TK); + T21 = VSUB(T16, T14); + T17 = VADD(T14, T16); + T1Q = VSUB(TK, TG); + TU = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + TV = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + TT = LDW(&(W[TWVL * 24])); + TW = VZMULIJ(TT, VFNMSCONJ(TV, TU)); + T18 = LDW(&(W[TWVL * 22])); + T19 = VZMULJ(T18, VFMACONJ(TV, TU)); + TY = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + TZ = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + TX = LDW(&(W[TWVL * 4])); + T10 = VZMULIJ(TX, VFNMSCONJ(TZ, TY)); + T1a = LDW(&(W[TWVL * 2])); + T1b = VZMULJ(T1a, VFMACONJ(TZ, TY)); + T11 = VADD(TW, T10); + T22 = VSUB(T10, TW); + T1c = VADD(T19, T1b); + T1T = VSUB(T1b, T19); + } + T1O = VSUB(T3, T7); + T2j = VADD(T1S, T1T); + T2c = VSUB(T21, T22); + T2b = VSUB(T1Y, T1Z); + T2i = VADD(T1P, T1Q); + T1X = VSUB(Tg, Tc); + Tx = VSUB(Tn, Tw); + TM = VSUB(TC, TL); + TN = VSUB(Tx, TM); + T1x = VADD(TS, T11); + T1y = VADD(T17, T1c); + T1z = VADD(T1x, T1y); + T1u = VADD(Tn, Tw); + T1v = VADD(TC, TL); + T1w = VADD(T1u, T1v); + T12 = VSUB(TS, T11); + T1d = VSUB(T17, T1c); + T1e = VSUB(T12, T1d); + T20 = VADD(T1Y, T1Z); + T23 = VADD(T21, T22); + T24 = VADD(T20, T23); + T2g = VSUB(T23, T20); + T8 = VADD(T3, T7); + Th = VADD(Tc, Tg); + Ti = VSUB(T8, Th); + T1t = VADD(T8, Th); + T1R = VSUB(T1P, T1Q); + T1U = VSUB(T1S, T1T); + T1V = VADD(T1R, T1U); + T29 = VSUB(T1R, T1U); + } + T1W = VADD(T1O, T1V); + T25 = VADD(T1X, T24); + T26 = VMUL(LDK(KP500000000), VFNMSI(T25, T1W)); + T27 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T25, T1W))); + ST(&(Rp[WS(rs, 5)]), T26, ms, &(Rp[WS(rs, 1)])); + ST(&(Rm[WS(rs, 4)]), T27, -ms, &(Rm[0])); + T1F = VSUB(T1x, T1y); + T1G = VSUB(T1u, T1v); + T1H = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1G, T1F)); + T1L = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1F, T1G)); + T1D = VSUB(T1w, T1z); + T1A = VADD(T1w, T1z); + T1C = VFNMS(LDK(KP250000000), T1A, T1t); + T1B = VCONJ(VMUL(LDK(KP500000000), VADD(T1t, T1A))); + T1K = VFMA(LDK(KP559016994), T1D, T1C); + T1E = VFNMS(LDK(KP559016994), T1D, T1C); + ST(&(Rm[WS(rs, 9)]), T1B, -ms, &(Rm[WS(rs, 1)])); + T1N = VCONJ(VMUL(LDK(KP500000000), VFMAI(T1L, T1K))); + ST(&(Rm[WS(rs, 5)]), T1N, -ms, &(Rm[WS(rs, 1)])); + T1I = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1H, T1E))); + ST(&(Rm[WS(rs, 1)]), T1I, -ms, &(Rm[WS(rs, 1)])); + T1J = VMUL(LDK(KP500000000), VFMAI(T1H, T1E)); + ST(&(Rp[WS(rs, 2)]), T1J, ms, &(Rp[0])); + T1M = VMUL(LDK(KP500000000), VFNMSI(T1L, T1K)); + ST(&(Rp[WS(rs, 6)]), T1M, ms, &(Rp[0])); + { + V T1m, T1q, T1g, T1p, T1j, T1k, T1l, T1i, T1f, T1h, T1s, T1n, T1o, T1r, T2e; + V T2A, T2o, T2u, T2l, T2B, T2p, T2x, T2d, T2t, T2a, T2s, T28, T2k, T2w, T2h; + V T2v, T2f, T2m, T2C, T2D, T2n, T2q, T2y, T2z, T2r; + T1k = VADD(Tx, TM); + T1l = VADD(T12, T1d); + T1m = VMUL(LDK(KP951056516), VFMA(LDK(KP618033988), T1l, T1k)); + T1q = VMUL(LDK(KP951056516), VFNMS(LDK(KP618033988), T1k, T1l)); + T1i = VSUB(TN, T1e); + T1f = VADD(TN, T1e); + T1h = VFNMS(LDK(KP250000000), T1f, Ti); + T1g = VMUL(LDK(KP500000000), VADD(Ti, T1f)); + T1p = VFNMS(LDK(KP559016994), T1i, T1h); + T1j = VFMA(LDK(KP559016994), T1i, T1h); + ST(&(Rp[0]), T1g, ms, &(Rp[0])); + T1s = VCONJ(VMUL(LDK(KP500000000), VFMAI(T1q, T1p))); + ST(&(Rm[WS(rs, 7)]), T1s, -ms, &(Rm[WS(rs, 1)])); + T1n = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T1m, T1j))); + ST(&(Rm[WS(rs, 3)]), T1n, -ms, &(Rm[WS(rs, 1)])); + T1o = VMUL(LDK(KP500000000), VFMAI(T1m, T1j)); + ST(&(Rp[WS(rs, 4)]), T1o, ms, &(Rp[0])); + T1r = VMUL(LDK(KP500000000), VFNMSI(T1q, T1p)); + ST(&(Rp[WS(rs, 8)]), T1r, ms, &(Rp[0])); + T2d = VFMA(LDK(KP618033988), T2c, T2b); + T2t = VFNMS(LDK(KP618033988), T2b, T2c); + T28 = VFNMS(LDK(KP250000000), T1V, T1O); + T2a = VFMA(LDK(KP559016994), T29, T28); + T2s = VFNMS(LDK(KP559016994), T29, T28); + T2e = VFNMS(LDK(KP951056516), T2d, T2a); + T2A = VFMA(LDK(KP951056516), T2t, T2s); + T2o = VFMA(LDK(KP951056516), T2d, T2a); + T2u = VFNMS(LDK(KP951056516), T2t, T2s); + T2k = VFMA(LDK(KP618033988), T2j, T2i); + T2w = VFNMS(LDK(KP618033988), T2i, T2j); + T2f = VFNMS(LDK(KP250000000), T24, T1X); + T2h = VFNMS(LDK(KP559016994), T2g, T2f); + T2v = VFMA(LDK(KP559016994), T2g, T2f); + T2l = VFNMS(LDK(KP951056516), T2k, T2h); + T2B = VFMA(LDK(KP951056516), T2w, T2v); + T2p = VFMA(LDK(KP951056516), T2k, T2h); + T2x = VFNMS(LDK(KP951056516), T2w, T2v); + T2m = VMUL(LDK(KP500000000), VFNMSI(T2l, T2e)); + ST(&(Rp[WS(rs, 9)]), T2m, ms, &(Rp[WS(rs, 1)])); + T2C = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T2B, T2A))); + ST(&(Rm[WS(rs, 6)]), T2C, -ms, &(Rm[0])); + T2D = VMUL(LDK(KP500000000), VFMAI(T2B, T2A)); + ST(&(Rp[WS(rs, 7)]), T2D, ms, &(Rp[WS(rs, 1)])); + T2n = VCONJ(VMUL(LDK(KP500000000), VFMAI(T2l, T2e))); + ST(&(Rm[WS(rs, 8)]), T2n, -ms, &(Rm[0])); + T2q = VMUL(LDK(KP500000000), VFNMSI(T2p, T2o)); + ST(&(Rp[WS(rs, 1)]), T2q, ms, &(Rp[WS(rs, 1)])); + T2y = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T2x, T2u))); + ST(&(Rm[WS(rs, 2)]), T2y, -ms, &(Rm[0])); + T2z = VMUL(LDK(KP500000000), VFMAI(T2x, T2u)); + ST(&(Rp[WS(rs, 3)]), T2z, ms, &(Rp[WS(rs, 1)])); + T2r = VCONJ(VMUL(LDK(KP500000000), VFMAI(T2p, T2o))); + ST(&(Rm[0]), T2r, -ms, &(Rm[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 20, XSIMD_STRING("hc2cfdftv_20"), twinstr, &GENUS, {77, 62, 66, 0} }; + +void XSIMD(codelet_hc2cfdftv_20) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_20, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 20 -dit -name hc2cfdftv_20 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 143 FP additions, 77 FP multiplications, + * (or, 131 additions, 65 multiplications, 12 fused multiply/add), + * 141 stack variables, 9 constants, and 40 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_20(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP293892626, +0.293892626146236564584352977319536384298826219); + DVK(KP475528258, +0.475528258147576786058219666689691071702849317); + DVK(KP559016994, +0.559016994374947424102293417182819058860154590); + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP125000000, +0.125000000000000000000000000000000000000000000); + DVK(KP279508497, +0.279508497187473712051146708591409529430077295); + DVK(KP587785252, +0.587785252292473129168705954639072768597652438); + DVK(KP951056516, +0.951056516295153572116439333379382143405698634); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 38)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 38), MAKE_VOLATILE_STRIDE(80, rs)) { + V TW, T1x, T2i, T2A, T1r, T1s, T1a, T1y, T1l, Tn, TK, TL, T1p, T1o, T27; + V T2t, T2a, T2u, T2e, T2C, T20, T2w, T23, T2x, T2d, T2B, T1W, T1X, T1U, T1V; + V T2z, T2K, T2G, T2N, T2J, T2v, T2y, T2F, T2D, T2E, T2M, T2H, T2I, T2L; + { + V T1u, T5, Tg, T1c, TV, T13, Ta, T1w, TQ, T11, TI, T1j, Tx, T18, Tl; + V T1e, TD, T1h, Ts, T16, T2g, T2h, T14, T19, T1f, T1k, Tb, Tm, Ty, TJ; + V T25, T26, T28, T29, T1Y, T1Z, T21, T22; + { + V T4, T3, T2, T1, Tf, Te, Td, Tc, T1b, TU, TT, TS, TR, T12, T9; + V T8, T7, T6, T1v, TP, TO, TN, TM, T10, TH, TG, TF, TE, T1i, Tw; + V Tv, Tu, Tt, T17, Tk, Tj, Ti, Th, T1d, TC, TB, TA, Tz, T1g, Tr; + V Tq, Tp, To, T15; + T4 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + T1u = VADD(T4, T3); + T1 = LDW(&(W[0])); + T5 = VZMULIJ(T1, VSUB(T3, T4)); + Tf = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + Td = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + Te = VCONJ(Td); + Tc = LDW(&(W[TWVL * 16])); + Tg = VZMULIJ(Tc, VSUB(Te, Tf)); + T1b = LDW(&(W[TWVL * 14])); + T1c = VZMULJ(T1b, VADD(Te, Tf)); + TU = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + TS = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + TT = VCONJ(TS); + TR = LDW(&(W[TWVL * 28])); + TV = VZMULIJ(TR, VSUB(TT, TU)); + T12 = LDW(&(W[TWVL * 26])); + T13 = VZMULJ(T12, VADD(TT, TU)); + T9 = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + T7 = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + T8 = VCONJ(T7); + T6 = LDW(&(W[TWVL * 20])); + Ta = VZMULIJ(T6, VSUB(T8, T9)); + T1v = LDW(&(W[TWVL * 18])); + T1w = VZMULJ(T1v, VADD(T9, T8)); + TP = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + TN = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + TO = VCONJ(TN); + TM = LDW(&(W[TWVL * 8])); + TQ = VZMULIJ(TM, VSUB(TO, TP)); + T10 = LDW(&(W[TWVL * 6])); + T11 = VZMULJ(T10, VADD(TO, TP)); + TH = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + TF = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + TG = VCONJ(TF); + TE = LDW(&(W[TWVL * 4])); + TI = VZMULIJ(TE, VSUB(TG, TH)); + T1i = LDW(&(W[TWVL * 2])); + T1j = VZMULJ(T1i, VADD(TG, TH)); + Tw = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tu = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tv = VCONJ(Tu); + Tt = LDW(&(W[TWVL * 12])); + Tx = VZMULIJ(Tt, VSUB(Tv, Tw)); + T17 = LDW(&(W[TWVL * 10])); + T18 = VZMULJ(T17, VADD(Tw, Tv)); + Tk = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + Ti = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + Tj = VCONJ(Ti); + Th = LDW(&(W[TWVL * 36])); + Tl = VZMULIJ(Th, VSUB(Tj, Tk)); + T1d = LDW(&(W[TWVL * 34])); + T1e = VZMULJ(T1d, VADD(Tj, Tk)); + TC = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + TA = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + TB = VCONJ(TA); + Tz = LDW(&(W[TWVL * 24])); + TD = VZMULIJ(Tz, VSUB(TB, TC)); + T1g = LDW(&(W[TWVL * 22])); + T1h = VZMULJ(T1g, VADD(TB, TC)); + Tr = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + Tp = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + Tq = VCONJ(Tp); + To = LDW(&(W[TWVL * 32])); + Ts = VZMULIJ(To, VSUB(Tq, Tr)); + T15 = LDW(&(W[TWVL * 30])); + T16 = VZMULJ(T15, VADD(Tr, Tq)); + } + TW = VSUB(TQ, TV); + T1x = VSUB(T1u, T1w); + T2g = VADD(T1u, T1w); + T2h = VADD(TQ, TV); + T2i = VADD(T2g, T2h); + T2A = VSUB(T2g, T2h); + T14 = VSUB(T11, T13); + T19 = VSUB(T16, T18); + T1r = VADD(T14, T19); + T1f = VSUB(T1c, T1e); + T1k = VSUB(T1h, T1j); + T1s = VADD(T1f, T1k); + T1a = VSUB(T14, T19); + T1y = VADD(T1r, T1s); + T1l = VSUB(T1f, T1k); + Tb = VSUB(T5, Ta); + Tm = VSUB(Tg, Tl); + Tn = VADD(Tb, Tm); + Ty = VSUB(Ts, Tx); + TJ = VSUB(TD, TI); + TK = VADD(Ty, TJ); + TL = VADD(Tn, TK); + T1p = VSUB(Ty, TJ); + T1o = VSUB(Tb, Tm); + T25 = VADD(T1c, T1e); + T26 = VADD(TD, TI); + T27 = VADD(T25, T26); + T2t = VSUB(T25, T26); + T28 = VADD(Ts, Tx); + T29 = VADD(T1h, T1j); + T2a = VADD(T28, T29); + T2u = VSUB(T29, T28); + T2e = VADD(T27, T2a); + T2C = VADD(T2t, T2u); + T1Y = VADD(T11, T13); + T1Z = VADD(Tg, Tl); + T20 = VADD(T1Y, T1Z); + T2w = VSUB(T1Y, T1Z); + T21 = VADD(T5, Ta); + T22 = VADD(T16, T18); + T23 = VADD(T21, T22); + T2x = VSUB(T22, T21); + T2d = VADD(T20, T23); + T2B = VADD(T2w, T2x); + } + T1U = VADD(T1x, T1y); + T1V = VBYI(VADD(TW, TL)); + T1W = VMUL(LDK(KP500000000), VSUB(T1U, T1V)); + T1X = VCONJ(VMUL(LDK(KP500000000), VADD(T1V, T1U))); + ST(&(Rp[WS(rs, 5)]), T1W, ms, &(Rp[WS(rs, 1)])); + ST(&(Rm[WS(rs, 4)]), T1X, -ms, &(Rm[0])); + T2v = VSUB(T2t, T2u); + T2y = VSUB(T2w, T2x); + T2z = VMUL(LDK(KP500000000), VBYI(VFNMS(LDK(KP587785252), T2y, VMUL(LDK(KP951056516), T2v)))); + T2K = VMUL(LDK(KP500000000), VBYI(VFMA(LDK(KP951056516), T2y, VMUL(LDK(KP587785252), T2v)))); + T2F = VMUL(LDK(KP279508497), VSUB(T2B, T2C)); + T2D = VADD(T2B, T2C); + T2E = VFNMS(LDK(KP125000000), T2D, VMUL(LDK(KP500000000), T2A)); + T2G = VSUB(T2E, T2F); + T2N = VCONJ(VMUL(LDK(KP500000000), VADD(T2A, T2D))); + T2J = VADD(T2F, T2E); + ST(&(Rm[WS(rs, 9)]), T2N, -ms, &(Rm[WS(rs, 1)])); + T2M = VCONJ(VADD(T2K, T2J)); + ST(&(Rm[WS(rs, 5)]), T2M, -ms, &(Rm[WS(rs, 1)])); + T2H = VADD(T2z, T2G); + ST(&(Rp[WS(rs, 2)]), T2H, ms, &(Rp[0])); + T2I = VCONJ(VSUB(T2G, T2z)); + ST(&(Rm[WS(rs, 1)]), T2I, -ms, &(Rm[WS(rs, 1)])); + T2L = VSUB(T2J, T2K); + ST(&(Rp[WS(rs, 6)]), T2L, ms, &(Rp[0])); + { + V T2c, T2p, T2l, T2s, T2o, T24, T2b, T2f, T2j, T2k, T2r, T2m, T2n, T2q, T1n; + V T1Q, T1E, T1K, T1B, T1R, T1F, T1N, T1m, T1J, TZ, T1I, TX, TY, T1q, T1M; + V T1A, T1L, T1t, T1z, T1C, T1S, T1T, T1D, T1G, T1O, T1P, T1H; + T24 = VSUB(T20, T23); + T2b = VSUB(T27, T2a); + T2c = VMUL(LDK(KP500000000), VBYI(VFMA(LDK(KP951056516), T24, VMUL(LDK(KP587785252), T2b)))); + T2p = VMUL(LDK(KP500000000), VBYI(VFNMS(LDK(KP587785252), T24, VMUL(LDK(KP951056516), T2b)))); + T2f = VMUL(LDK(KP279508497), VSUB(T2d, T2e)); + T2j = VADD(T2d, T2e); + T2k = VFNMS(LDK(KP125000000), T2j, VMUL(LDK(KP500000000), T2i)); + T2l = VADD(T2f, T2k); + T2s = VMUL(LDK(KP500000000), VADD(T2i, T2j)); + T2o = VSUB(T2k, T2f); + ST(&(Rp[0]), T2s, ms, &(Rp[0])); + T2r = VCONJ(VADD(T2p, T2o)); + ST(&(Rm[WS(rs, 7)]), T2r, -ms, &(Rm[WS(rs, 1)])); + T2m = VADD(T2c, T2l); + ST(&(Rp[WS(rs, 4)]), T2m, ms, &(Rp[0])); + T2n = VCONJ(VSUB(T2l, T2c)); + ST(&(Rm[WS(rs, 3)]), T2n, -ms, &(Rm[WS(rs, 1)])); + T2q = VSUB(T2o, T2p); + ST(&(Rp[WS(rs, 8)]), T2q, ms, &(Rp[0])); + T1m = VFMA(LDK(KP951056516), T1a, VMUL(LDK(KP587785252), T1l)); + T1J = VFNMS(LDK(KP587785252), T1a, VMUL(LDK(KP951056516), T1l)); + TX = VFMS(LDK(KP250000000), TL, TW); + TY = VMUL(LDK(KP559016994), VSUB(TK, Tn)); + TZ = VADD(TX, TY); + T1I = VSUB(TY, TX); + T1n = VMUL(LDK(KP500000000), VBYI(VSUB(TZ, T1m))); + T1Q = VMUL(LDK(KP500000000), VBYI(VADD(T1I, T1J))); + T1E = VMUL(LDK(KP500000000), VBYI(VADD(TZ, T1m))); + T1K = VMUL(LDK(KP500000000), VBYI(VSUB(T1I, T1J))); + T1q = VFMA(LDK(KP475528258), T1o, VMUL(LDK(KP293892626), T1p)); + T1M = VFNMS(LDK(KP293892626), T1o, VMUL(LDK(KP475528258), T1p)); + T1t = VMUL(LDK(KP279508497), VSUB(T1r, T1s)); + T1z = VFNMS(LDK(KP125000000), T1y, VMUL(LDK(KP500000000), T1x)); + T1A = VADD(T1t, T1z); + T1L = VSUB(T1z, T1t); + T1B = VADD(T1q, T1A); + T1R = VADD(T1M, T1L); + T1F = VSUB(T1A, T1q); + T1N = VSUB(T1L, T1M); + T1C = VADD(T1n, T1B); + ST(&(Rp[WS(rs, 1)]), T1C, ms, &(Rp[WS(rs, 1)])); + T1S = VADD(T1Q, T1R); + ST(&(Rp[WS(rs, 7)]), T1S, ms, &(Rp[WS(rs, 1)])); + T1T = VCONJ(VSUB(T1R, T1Q)); + ST(&(Rm[WS(rs, 6)]), T1T, -ms, &(Rm[0])); + T1D = VCONJ(VSUB(T1B, T1n)); + ST(&(Rm[0]), T1D, -ms, &(Rm[0])); + T1G = VADD(T1E, T1F); + ST(&(Rp[WS(rs, 9)]), T1G, ms, &(Rp[WS(rs, 1)])); + T1O = VADD(T1K, T1N); + ST(&(Rp[WS(rs, 3)]), T1O, ms, &(Rp[WS(rs, 1)])); + T1P = VCONJ(VSUB(T1N, T1K)); + ST(&(Rm[WS(rs, 2)]), T1P, -ms, &(Rm[0])); + T1H = VCONJ(VSUB(T1F, T1E)); + ST(&(Rm[WS(rs, 8)]), T1H, -ms, &(Rm[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 20, XSIMD_STRING("hc2cfdftv_20"), twinstr, &GENUS, {131, 65, 12, 0} }; + +void XSIMD(codelet_hc2cfdftv_20) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_20, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_32.c new file mode 100644 index 000000000..00685eb96 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_32.c @@ -0,0 +1,878 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 32 -dit -name hc2cfdftv_32 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 249 FP additions, 224 FP multiplications, + * (or, 119 additions, 94 multiplications, 130 fused multiply/add), + * 154 stack variables, 8 constants, and 64 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP668178637, +0.668178637919298919997757686523080761552472251); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP198912367, +0.198912367379658006911597622644676228597850501); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP414213562, +0.414213562373095048801688724209698078569671875); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 62)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(128, rs)) { + V T47, T48, T4l, T3w, T3F, T3B, T41, Ts, T2y, T1Q, T2B, T27, T2J, T3a, T40; + V T1X, T2C, T43, T44, T4a, T4b, T4m, T3p, T3E, T15, T2K, T1u, T2F, T3h, T3C; + V T1n, T2E, T2a, T2z, T1a, T18, TU, T3m, T3f, T1r, T1p, T13, T3n, T3e, TB; + V T3k, T1l, T3c, TK, T3j, T1g, T3b, T3l, T3o, TL, T14, T1s, T1t, T3d, T3g; + V T1b, T1m, T28, T29, T3Q, T3W, T3T, T3X, T3O, T3P, T3R, T3S, T3U, T3Z, T3V; + V T3Y; + { + V T1U, T1S, T3, T3u, T7, T1z, T1D, T3t, T24, T22, Tc, Tg, Th, T3q, T1J; + V Tl, Tp, Tq, T3r, T1O, T3s, T3v, T3z, T3A, T8, Tr, T1E, T1P, T25, T26; + V T38, T39, T1V, T1W; + { + V T1, T2, T5, T6, T1T, T1R, T4, T1x, T1y, T1B, T1C, T1w, T1A, T23, T21; + V T1I, T1G, Ta, Tb, T9, T1H, Te, Tf, Td, T1F, T1N, T1L, Tj, Tk, Ti; + V T1M, Tn, To, Tm, T1K; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T1T = LDW(&(W[0])); + T1U = VZMULIJ(T1T, VFNMSCONJ(T2, T1)); + T5 = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + T1R = LDW(&(W[TWVL * 32])); + T1S = VZMULIJ(T1R, VFNMSCONJ(T6, T5)); + T3 = VFMACONJ(T2, T1); + T3u = VADD(T1U, T1S); + T4 = LDW(&(W[TWVL * 30])); + T7 = VZMULJ(T4, VFMACONJ(T6, T5)); + T1x = LD(&(Rp[WS(rs, 12)]), ms, &(Rp[0])); + T1y = LD(&(Rm[WS(rs, 12)]), -ms, &(Rm[0])); + T1w = LDW(&(W[TWVL * 48])); + T1z = VZMULIJ(T1w, VFNMSCONJ(T1y, T1x)); + T1B = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T1C = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T1A = LDW(&(W[TWVL * 16])); + T1D = VZMULIJ(T1A, VFNMSCONJ(T1C, T1B)); + T3t = VADD(T1D, T1z); + T23 = LDW(&(W[TWVL * 46])); + T24 = VZMULJ(T23, VFMACONJ(T1y, T1x)); + T21 = LDW(&(W[TWVL * 14])); + T22 = VZMULJ(T21, VFMACONJ(T1C, T1B)); + Ta = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Tb = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T9 = LDW(&(W[TWVL * 6])); + Tc = VZMULJ(T9, VFMACONJ(Tb, Ta)); + T1H = LDW(&(W[TWVL * 8])); + T1I = VZMULIJ(T1H, VFNMSCONJ(Tb, Ta)); + Te = LD(&(Rp[WS(rs, 10)]), ms, &(Rp[0])); + Tf = LD(&(Rm[WS(rs, 10)]), -ms, &(Rm[0])); + Td = LDW(&(W[TWVL * 38])); + Tg = VZMULJ(Td, VFMACONJ(Tf, Te)); + T1F = LDW(&(W[TWVL * 40])); + T1G = VZMULIJ(T1F, VFNMSCONJ(Tf, Te)); + Th = VSUB(Tc, Tg); + T3q = VADD(T1I, T1G); + T1J = VSUB(T1G, T1I); + Tj = LD(&(Rp[WS(rs, 14)]), ms, &(Rp[0])); + Tk = LD(&(Rm[WS(rs, 14)]), -ms, &(Rm[0])); + Ti = LDW(&(W[TWVL * 54])); + Tl = VZMULJ(Ti, VFMACONJ(Tk, Tj)); + T1M = LDW(&(W[TWVL * 56])); + T1N = VZMULIJ(T1M, VFNMSCONJ(Tk, Tj)); + Tn = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + To = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + Tm = LDW(&(W[TWVL * 22])); + Tp = VZMULJ(Tm, VFMACONJ(To, Tn)); + T1K = LDW(&(W[TWVL * 24])); + T1L = VZMULIJ(T1K, VFNMSCONJ(To, Tn)); + Tq = VSUB(Tl, Tp); + T3r = VADD(T1N, T1L); + T1O = VSUB(T1L, T1N); + } + T47 = VADD(T3u, T3t); + T48 = VADD(T3q, T3r); + T4l = VSUB(T48, T47); + T3s = VSUB(T3q, T3r); + T3v = VSUB(T3t, T3u); + T3w = VFNMS(LDK(KP414213562), T3v, T3s); + T3F = VFMA(LDK(KP414213562), T3s, T3v); + T3z = VADD(Tl, Tp); + T3A = VADD(Tc, Tg); + T3B = VSUB(T3z, T3A); + T41 = VADD(T3A, T3z); + T8 = VSUB(T3, T7); + Tr = VADD(Th, Tq); + Ts = VFNMS(LDK(KP707106781), Tr, T8); + T2y = VFMA(LDK(KP707106781), Tr, T8); + T1E = VSUB(T1z, T1D); + T1P = VSUB(T1J, T1O); + T1Q = VFNMS(LDK(KP707106781), T1P, T1E); + T2B = VFMA(LDK(KP707106781), T1P, T1E); + T25 = VSUB(T22, T24); + T26 = VSUB(Tq, Th); + T27 = VFMA(LDK(KP707106781), T26, T25); + T2J = VFNMS(LDK(KP707106781), T26, T25); + T38 = VADD(T3, T7); + T39 = VADD(T22, T24); + T3a = VSUB(T38, T39); + T40 = VADD(T38, T39); + T1V = VSUB(T1S, T1U); + T1W = VADD(T1J, T1O); + T1X = VFNMS(LDK(KP707106781), T1W, T1V); + T2C = VFMA(LDK(KP707106781), T1W, T1V); + } + { + V TP, TT, TN, TO, TM, T19, TR, TS, TQ, T17, TY, T12, TW, TX, TV; + V T1q, T10, T11, TZ, T1o, Tw, T1i, TA, T1k, Tu, Tv, Tt, T1h, Ty, Tz; + V Tx, T1j, TF, T1f, TJ, T1d, TD, TE, TC, T1e, TH, TI, TG, T1c; + TN = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + TO = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + TM = LDW(&(W[TWVL * 10])); + TP = VZMULJ(TM, VFMACONJ(TO, TN)); + T19 = LDW(&(W[TWVL * 12])); + T1a = VZMULIJ(T19, VFNMSCONJ(TO, TN)); + TR = LD(&(Rp[WS(rs, 11)]), ms, &(Rp[WS(rs, 1)])); + TS = LD(&(Rm[WS(rs, 11)]), -ms, &(Rm[WS(rs, 1)])); + TQ = LDW(&(W[TWVL * 42])); + TT = VZMULJ(TQ, VFMACONJ(TS, TR)); + T17 = LDW(&(W[TWVL * 44])); + T18 = VZMULIJ(T17, VFNMSCONJ(TS, TR)); + TU = VSUB(TP, TT); + T3m = VADD(T1a, T18); + T3f = VADD(TP, TT); + TW = LD(&(Rp[WS(rs, 15)]), ms, &(Rp[WS(rs, 1)])); + TX = LD(&(Rm[WS(rs, 15)]), -ms, &(Rm[WS(rs, 1)])); + TV = LDW(&(W[TWVL * 58])); + TY = VZMULJ(TV, VFMACONJ(TX, TW)); + T1q = LDW(&(W[TWVL * 60])); + T1r = VZMULIJ(T1q, VFNMSCONJ(TX, TW)); + T10 = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + T11 = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + TZ = LDW(&(W[TWVL * 26])); + T12 = VZMULJ(TZ, VFMACONJ(T11, T10)); + T1o = LDW(&(W[TWVL * 28])); + T1p = VZMULIJ(T1o, VFNMSCONJ(T11, T10)); + T13 = VSUB(TY, T12); + T3n = VADD(T1r, T1p); + T3e = VADD(TY, T12); + Tu = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + Tv = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + Tt = LDW(&(W[TWVL * 18])); + Tw = VZMULJ(Tt, VFMACONJ(Tv, Tu)); + T1h = LDW(&(W[TWVL * 20])); + T1i = VZMULIJ(T1h, VFNMSCONJ(Tv, Tu)); + Ty = LD(&(Rp[WS(rs, 13)]), ms, &(Rp[WS(rs, 1)])); + Tz = LD(&(Rm[WS(rs, 13)]), -ms, &(Rm[WS(rs, 1)])); + Tx = LDW(&(W[TWVL * 50])); + TA = VZMULJ(Tx, VFMACONJ(Tz, Ty)); + T1j = LDW(&(W[TWVL * 52])); + T1k = VZMULIJ(T1j, VFNMSCONJ(Tz, Ty)); + TB = VSUB(Tw, TA); + T3k = VADD(T1i, T1k); + T1l = VSUB(T1i, T1k); + T3c = VADD(Tw, TA); + TD = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + TE = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + TC = LDW(&(W[TWVL * 2])); + TF = VZMULJ(TC, VFMACONJ(TE, TD)); + T1e = LDW(&(W[TWVL * 4])); + T1f = VZMULIJ(T1e, VFNMSCONJ(TE, TD)); + TH = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + TI = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + TG = LDW(&(W[TWVL * 34])); + TJ = VZMULJ(TG, VFMACONJ(TI, TH)); + T1c = LDW(&(W[TWVL * 36])); + T1d = VZMULIJ(T1c, VFNMSCONJ(TI, TH)); + TK = VSUB(TF, TJ); + T3j = VADD(T1f, T1d); + T1g = VSUB(T1d, T1f); + T3b = VADD(TF, TJ); + } + T43 = VADD(T3b, T3c); + T44 = VADD(T3e, T3f); + T4a = VADD(T3j, T3k); + T4b = VADD(T3n, T3m); + T4m = VSUB(T4a, T4b); + T3l = VSUB(T3j, T3k); + T3o = VSUB(T3m, T3n); + T3p = VFMA(LDK(KP414213562), T3o, T3l); + T3E = VFNMS(LDK(KP414213562), T3l, T3o); + TL = VFMA(LDK(KP414213562), TK, TB); + T14 = VFNMS(LDK(KP414213562), T13, TU); + T15 = VSUB(TL, T14); + T2K = VADD(TL, T14); + T1s = VSUB(T1p, T1r); + T1t = VADD(T1g, T1l); + T1u = VFNMS(LDK(KP707106781), T1t, T1s); + T2F = VFMA(LDK(KP707106781), T1t, T1s); + T3d = VSUB(T3b, T3c); + T3g = VSUB(T3e, T3f); + T3h = VADD(T3d, T3g); + T3C = VSUB(T3g, T3d); + T1b = VSUB(T18, T1a); + T1m = VSUB(T1g, T1l); + T1n = VFNMS(LDK(KP707106781), T1m, T1b); + T2E = VFMA(LDK(KP707106781), T1m, T1b); + T28 = VFMA(LDK(KP414213562), TU, T13); + T29 = VFNMS(LDK(KP414213562), TB, TK); + T2a = VSUB(T28, T29); + T2z = VADD(T29, T28); + { + V T4o, T4u, T4r, T4v, T4k, T4n, T4p, T4q, T4s, T4x, T4t, T4w, T3y, T3K, T3H; + V T3L, T3i, T3x, T3D, T3G, T3I, T3N, T3J, T3M, T46, T4g, T4d, T4h, T42, T45; + V T49, T4c, T4e, T4j, T4f, T4i; + T4k = VSUB(T40, T41); + T4n = VADD(T4l, T4m); + T4o = VFMA(LDK(KP707106781), T4n, T4k); + T4u = VFNMS(LDK(KP707106781), T4n, T4k); + T4p = VSUB(T44, T43); + T4q = VSUB(T4m, T4l); + T4r = VFMA(LDK(KP707106781), T4q, T4p); + T4v = VFNMS(LDK(KP707106781), T4q, T4p); + T4s = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T4r, T4o))); + ST(&(Rm[WS(rs, 3)]), T4s, -ms, &(Rm[WS(rs, 1)])); + T4x = VCONJ(VMUL(LDK(KP500000000), VFMAI(T4v, T4u))); + ST(&(Rm[WS(rs, 11)]), T4x, -ms, &(Rm[WS(rs, 1)])); + T4t = VMUL(LDK(KP500000000), VFMAI(T4r, T4o)); + ST(&(Rp[WS(rs, 4)]), T4t, ms, &(Rp[0])); + T4w = VMUL(LDK(KP500000000), VFNMSI(T4v, T4u)); + ST(&(Rp[WS(rs, 12)]), T4w, ms, &(Rp[0])); + T3i = VFNMS(LDK(KP707106781), T3h, T3a); + T3x = VSUB(T3p, T3w); + T3y = VFMA(LDK(KP923879532), T3x, T3i); + T3K = VFNMS(LDK(KP923879532), T3x, T3i); + T3D = VFNMS(LDK(KP707106781), T3C, T3B); + T3G = VSUB(T3E, T3F); + T3H = VFNMS(LDK(KP923879532), T3G, T3D); + T3L = VFMA(LDK(KP923879532), T3G, T3D); + T3I = VMUL(LDK(KP500000000), VFNMSI(T3H, T3y)); + ST(&(Rp[WS(rs, 6)]), T3I, ms, &(Rp[0])); + T3N = VMUL(LDK(KP500000000), VFMAI(T3L, T3K)); + ST(&(Rp[WS(rs, 10)]), T3N, ms, &(Rp[0])); + T3J = VCONJ(VMUL(LDK(KP500000000), VFMAI(T3H, T3y))); + ST(&(Rm[WS(rs, 5)]), T3J, -ms, &(Rm[WS(rs, 1)])); + T3M = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T3L, T3K))); + ST(&(Rm[WS(rs, 9)]), T3M, -ms, &(Rm[WS(rs, 1)])); + T42 = VADD(T40, T41); + T45 = VADD(T43, T44); + T46 = VSUB(T42, T45); + T4g = VADD(T42, T45); + T49 = VADD(T47, T48); + T4c = VADD(T4a, T4b); + T4d = VSUB(T49, T4c); + T4h = VADD(T49, T4c); + T4e = VMUL(LDK(KP500000000), VFMAI(T4d, T46)); + ST(&(Rp[WS(rs, 8)]), T4e, ms, &(Rp[0])); + T4j = VCONJ(VMUL(LDK(KP500000000), VADD(T4h, T4g))); + ST(&(Rm[WS(rs, 15)]), T4j, -ms, &(Rm[WS(rs, 1)])); + T4f = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T4d, T46))); + ST(&(Rm[WS(rs, 7)]), T4f, -ms, &(Rm[WS(rs, 1)])); + T4i = VMUL(LDK(KP500000000), VSUB(T4g, T4h)); + ST(&(Rp[0]), T4i, ms, &(Rp[0])); + } + T3O = VFMA(LDK(KP707106781), T3h, T3a); + T3P = VADD(T3F, T3E); + T3Q = VFMA(LDK(KP923879532), T3P, T3O); + T3W = VFNMS(LDK(KP923879532), T3P, T3O); + T3R = VFMA(LDK(KP707106781), T3C, T3B); + T3S = VADD(T3w, T3p); + T3T = VFMA(LDK(KP923879532), T3S, T3R); + T3X = VFNMS(LDK(KP923879532), T3S, T3R); + T3U = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T3T, T3Q))); + ST(&(Rm[WS(rs, 1)]), T3U, -ms, &(Rm[WS(rs, 1)])); + T3Z = VCONJ(VMUL(LDK(KP500000000), VFMAI(T3X, T3W))); + ST(&(Rm[WS(rs, 13)]), T3Z, -ms, &(Rm[WS(rs, 1)])); + T3V = VMUL(LDK(KP500000000), VFMAI(T3T, T3Q)); + ST(&(Rp[WS(rs, 2)]), T3V, ms, &(Rp[0])); + T3Y = VMUL(LDK(KP500000000), VFNMSI(T3X, T3W)); + ST(&(Rp[WS(rs, 14)]), T3Y, ms, &(Rp[0])); + { + V T2I, T35, T2S, T31, T2P, T34, T2T, T2Y, T2A, T2Z, T2H, T30, T2D, T2G, T2L; + V T2W, T2O, T2X, T2M, T2N, T2Q, T36, T37, T2R, T2U, T32, T33, T2V, T20, T2v; + V T2i, T2r, T2f, T2u, T2j, T2o, T16, T2p, T1Z, T2q, T1v, T1Y, T2b, T2m, T2e; + V T2n, T2c, T2d, T2g, T2w, T2x, T2h, T2k, T2s, T2t, T2l; + T2A = VFNMS(LDK(KP923879532), T2z, T2y); + T2Z = VFMA(LDK(KP923879532), T2K, T2J); + T2D = VFMA(LDK(KP198912367), T2C, T2B); + T2G = VFNMS(LDK(KP198912367), T2F, T2E); + T2H = VSUB(T2D, T2G); + T30 = VADD(T2D, T2G); + T2I = VFMA(LDK(KP980785280), T2H, T2A); + T35 = VFNMS(LDK(KP980785280), T30, T2Z); + T2S = VFNMS(LDK(KP980785280), T2H, T2A); + T31 = VFMA(LDK(KP980785280), T30, T2Z); + T2L = VFNMS(LDK(KP923879532), T2K, T2J); + T2W = VFMA(LDK(KP923879532), T2z, T2y); + T2M = VFMA(LDK(KP198912367), T2E, T2F); + T2N = VFNMS(LDK(KP198912367), T2B, T2C); + T2O = VSUB(T2M, T2N); + T2X = VADD(T2N, T2M); + T2P = VFMA(LDK(KP980785280), T2O, T2L); + T34 = VFNMS(LDK(KP980785280), T2X, T2W); + T2T = VFNMS(LDK(KP980785280), T2O, T2L); + T2Y = VFMA(LDK(KP980785280), T2X, T2W); + T2Q = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T2P, T2I))); + ST(&(Rm[WS(rs, 6)]), T2Q, -ms, &(Rm[0])); + T36 = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T35, T34))); + ST(&(Rm[WS(rs, 14)]), T36, -ms, &(Rm[0])); + T37 = VMUL(LDK(KP500000000), VFMAI(T35, T34)); + ST(&(Rp[WS(rs, 15)]), T37, ms, &(Rp[WS(rs, 1)])); + T2R = VMUL(LDK(KP500000000), VFMAI(T2P, T2I)); + ST(&(Rp[WS(rs, 7)]), T2R, ms, &(Rp[WS(rs, 1)])); + T2U = VMUL(LDK(KP500000000), VFNMSI(T2T, T2S)); + ST(&(Rp[WS(rs, 9)]), T2U, ms, &(Rp[WS(rs, 1)])); + T32 = VMUL(LDK(KP500000000), VFNMSI(T31, T2Y)); + ST(&(Rp[WS(rs, 1)]), T32, ms, &(Rp[WS(rs, 1)])); + T33 = VCONJ(VMUL(LDK(KP500000000), VFMAI(T31, T2Y))); + ST(&(Rm[0]), T33, -ms, &(Rm[0])); + T2V = VCONJ(VMUL(LDK(KP500000000), VFMAI(T2T, T2S))); + ST(&(Rm[WS(rs, 8)]), T2V, -ms, &(Rm[0])); + T16 = VFNMS(LDK(KP923879532), T15, Ts); + T2p = VFMA(LDK(KP923879532), T2a, T27); + T1v = VFMA(LDK(KP668178637), T1u, T1n); + T1Y = VFNMS(LDK(KP668178637), T1X, T1Q); + T1Z = VSUB(T1v, T1Y); + T2q = VADD(T1Y, T1v); + T20 = VFMA(LDK(KP831469612), T1Z, T16); + T2v = VFNMS(LDK(KP831469612), T2q, T2p); + T2i = VFNMS(LDK(KP831469612), T1Z, T16); + T2r = VFMA(LDK(KP831469612), T2q, T2p); + T2b = VFNMS(LDK(KP923879532), T2a, T27); + T2m = VFMA(LDK(KP923879532), T15, Ts); + T2c = VFNMS(LDK(KP668178637), T1n, T1u); + T2d = VFMA(LDK(KP668178637), T1Q, T1X); + T2e = VSUB(T2c, T2d); + T2n = VADD(T2d, T2c); + T2f = VFNMS(LDK(KP831469612), T2e, T2b); + T2u = VFNMS(LDK(KP831469612), T2n, T2m); + T2j = VFMA(LDK(KP831469612), T2e, T2b); + T2o = VFMA(LDK(KP831469612), T2n, T2m); + T2g = VMUL(LDK(KP500000000), VFNMSI(T2f, T20)); + ST(&(Rp[WS(rs, 5)]), T2g, ms, &(Rp[WS(rs, 1)])); + T2w = VMUL(LDK(KP500000000), VFNMSI(T2v, T2u)); + ST(&(Rp[WS(rs, 13)]), T2w, ms, &(Rp[WS(rs, 1)])); + T2x = VCONJ(VMUL(LDK(KP500000000), VFMAI(T2v, T2u))); + ST(&(Rm[WS(rs, 12)]), T2x, -ms, &(Rm[0])); + T2h = VCONJ(VMUL(LDK(KP500000000), VFMAI(T2f, T20))); + ST(&(Rm[WS(rs, 4)]), T2h, -ms, &(Rm[0])); + T2k = VMUL(LDK(KP500000000), VFMAI(T2j, T2i)); + ST(&(Rp[WS(rs, 11)]), T2k, ms, &(Rp[WS(rs, 1)])); + T2s = VMUL(LDK(KP500000000), VFMAI(T2r, T2o)); + ST(&(Rp[WS(rs, 3)]), T2s, ms, &(Rp[WS(rs, 1)])); + T2t = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T2r, T2o))); + ST(&(Rm[WS(rs, 2)]), T2t, -ms, &(Rm[0])); + T2l = VCONJ(VMUL(LDK(KP500000000), VFNMSI(T2j, T2i))); + ST(&(Rm[WS(rs, 10)]), T2l, -ms, &(Rm[0])); + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + VTW(1, 20), + VTW(1, 21), + VTW(1, 22), + VTW(1, 23), + VTW(1, 24), + VTW(1, 25), + VTW(1, 26), + VTW(1, 27), + VTW(1, 28), + VTW(1, 29), + VTW(1, 30), + VTW(1, 31), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 32, XSIMD_STRING("hc2cfdftv_32"), twinstr, &GENUS, {119, 94, 130, 0} }; + +void XSIMD(codelet_hc2cfdftv_32) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_32, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 32 -dit -name hc2cfdftv_32 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 249 FP additions, 133 FP multiplications, + * (or, 233 additions, 117 multiplications, 16 fused multiply/add), + * 130 stack variables, 9 constants, and 64 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_32(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP555570233, +0.555570233019602224742830813948532874374937191); + DVK(KP831469612, +0.831469612302545237078788377617905756738560812); + DVK(KP195090322, +0.195090322016128267848284868477022240927691618); + DVK(KP980785280, +0.980785280403230449126182236134239036973933731); + DVK(KP382683432, +0.382683432365089771728459984030398866761344562); + DVK(KP923879532, +0.923879532511286756128183189396788286822416626); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP353553390, +0.353553390593273762200422181052424519642417969); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 62)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 62), MAKE_VOLATILE_STRIDE(128, rs)) { + V Ta, T2m, Tx, T2h, T3R, T4h, T3q, T4g, T3B, T4n, T3E, T4o, T1B, T2S, T1O; + V T2R, TV, T2p, T1i, T2o, T3L, T4q, T3I, T4r, T3w, T4k, T3t, T4j, T26, T2V; + V T2d, T2U; + { + V T4, T1m, T1H, T2j, T1M, T2l, T9, T1o, Tf, T1r, Tq, T1w, Tv, T1y, Tk; + V T1t, Tl, Tw, T3P, T3Q, T3o, T3p, T3z, T3A, T3C, T3D, T1p, T1N, T1A, T1C; + V T1u, T1z; + { + V T1, T3, T2, T1l, T1G, T1F, T1E, T1D, T2i, T1L, T1K, T1J, T1I, T2k, T6; + V T8, T7, T5, T1n, Tc, Te, Td, Tb, T1q, Tn, Tp, To, Tm, T1v, Ts; + V Tu, Tt, Tr, T1x, Th, Tj, Ti, Tg, T1s; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + T4 = VADD(T1, T3); + T1l = LDW(&(W[0])); + T1m = VZMULIJ(T1l, VSUB(T3, T1)); + T1G = LD(&(Rp[WS(rs, 4)]), ms, &(Rp[0])); + T1E = LD(&(Rm[WS(rs, 4)]), -ms, &(Rm[0])); + T1F = VCONJ(T1E); + T1D = LDW(&(W[TWVL * 16])); + T1H = VZMULIJ(T1D, VSUB(T1F, T1G)); + T2i = LDW(&(W[TWVL * 14])); + T2j = VZMULJ(T2i, VADD(T1G, T1F)); + T1L = LD(&(Rp[WS(rs, 12)]), ms, &(Rp[0])); + T1J = LD(&(Rm[WS(rs, 12)]), -ms, &(Rm[0])); + T1K = VCONJ(T1J); + T1I = LDW(&(W[TWVL * 48])); + T1M = VZMULIJ(T1I, VSUB(T1K, T1L)); + T2k = LDW(&(W[TWVL * 46])); + T2l = VZMULJ(T2k, VADD(T1L, T1K)); + T6 = LD(&(Rp[WS(rs, 8)]), ms, &(Rp[0])); + T7 = LD(&(Rm[WS(rs, 8)]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + T5 = LDW(&(W[TWVL * 30])); + T9 = VZMULJ(T5, VADD(T6, T8)); + T1n = LDW(&(W[TWVL * 32])); + T1o = VZMULIJ(T1n, VSUB(T8, T6)); + Tc = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Td = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Te = VCONJ(Td); + Tb = LDW(&(W[TWVL * 6])); + Tf = VZMULJ(Tb, VADD(Tc, Te)); + T1q = LDW(&(W[TWVL * 8])); + T1r = VZMULIJ(T1q, VSUB(Te, Tc)); + Tn = LD(&(Rp[WS(rs, 14)]), ms, &(Rp[0])); + To = LD(&(Rm[WS(rs, 14)]), -ms, &(Rm[0])); + Tp = VCONJ(To); + Tm = LDW(&(W[TWVL * 54])); + Tq = VZMULJ(Tm, VADD(Tn, Tp)); + T1v = LDW(&(W[TWVL * 56])); + T1w = VZMULIJ(T1v, VSUB(Tp, Tn)); + Ts = LD(&(Rp[WS(rs, 6)]), ms, &(Rp[0])); + Tt = LD(&(Rm[WS(rs, 6)]), -ms, &(Rm[0])); + Tu = VCONJ(Tt); + Tr = LDW(&(W[TWVL * 22])); + Tv = VZMULJ(Tr, VADD(Ts, Tu)); + T1x = LDW(&(W[TWVL * 24])); + T1y = VZMULIJ(T1x, VSUB(Tu, Ts)); + Th = LD(&(Rp[WS(rs, 10)]), ms, &(Rp[0])); + Ti = LD(&(Rm[WS(rs, 10)]), -ms, &(Rm[0])); + Tj = VCONJ(Ti); + Tg = LDW(&(W[TWVL * 38])); + Tk = VZMULJ(Tg, VADD(Th, Tj)); + T1s = LDW(&(W[TWVL * 40])); + T1t = VZMULIJ(T1s, VSUB(Tj, Th)); + } + Ta = VMUL(LDK(KP500000000), VSUB(T4, T9)); + T2m = VSUB(T2j, T2l); + Tl = VSUB(Tf, Tk); + Tw = VSUB(Tq, Tv); + Tx = VMUL(LDK(KP353553390), VADD(Tl, Tw)); + T2h = VMUL(LDK(KP707106781), VSUB(Tw, Tl)); + T3P = VADD(Tq, Tv); + T3Q = VADD(Tf, Tk); + T3R = VSUB(T3P, T3Q); + T4h = VADD(T3Q, T3P); + T3o = VADD(T4, T9); + T3p = VADD(T2j, T2l); + T3q = VMUL(LDK(KP500000000), VSUB(T3o, T3p)); + T4g = VADD(T3o, T3p); + T3z = VADD(T1m, T1o); + T3A = VADD(T1H, T1M); + T3B = VSUB(T3z, T3A); + T4n = VADD(T3z, T3A); + T3C = VADD(T1w, T1y); + T3D = VADD(T1r, T1t); + T3E = VSUB(T3C, T3D); + T4o = VADD(T3D, T3C); + T1p = VSUB(T1m, T1o); + T1N = VSUB(T1H, T1M); + T1u = VSUB(T1r, T1t); + T1z = VSUB(T1w, T1y); + T1A = VMUL(LDK(KP707106781), VADD(T1u, T1z)); + T1C = VMUL(LDK(KP707106781), VSUB(T1z, T1u)); + T1B = VADD(T1p, T1A); + T2S = VADD(T1N, T1C); + T1O = VSUB(T1C, T1N); + T2R = VSUB(T1p, T1A); + } + { + V TD, T1R, T1b, T29, T1g, T2b, TI, T1T, TO, T1Y, T10, T22, T15, T24, TT; + V T1W, TJ, TU, T16, T1h, T3J, T3K, T3G, T3H, T3u, T3v, T3r, T3s, T25, T2c; + V T20, T27, T1U, T1Z; + { + V TA, TC, TB, Tz, T1Q, T18, T1a, T19, T17, T28, T1d, T1f, T1e, T1c, T2a; + V TF, TH, TG, TE, T1S, TL, TN, TM, TK, T1X, TX, TZ, TY, TW, T21; + V T12, T14, T13, T11, T23, TQ, TS, TR, TP, T1V; + TA = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + TB = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + TC = VCONJ(TB); + Tz = LDW(&(W[TWVL * 2])); + TD = VZMULJ(Tz, VADD(TA, TC)); + T1Q = LDW(&(W[TWVL * 4])); + T1R = VZMULIJ(T1Q, VSUB(TC, TA)); + T18 = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + T19 = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + T1a = VCONJ(T19); + T17 = LDW(&(W[TWVL * 10])); + T1b = VZMULJ(T17, VADD(T18, T1a)); + T28 = LDW(&(W[TWVL * 12])); + T29 = VZMULIJ(T28, VSUB(T1a, T18)); + T1d = LD(&(Rp[WS(rs, 11)]), ms, &(Rp[WS(rs, 1)])); + T1e = LD(&(Rm[WS(rs, 11)]), -ms, &(Rm[WS(rs, 1)])); + T1f = VCONJ(T1e); + T1c = LDW(&(W[TWVL * 42])); + T1g = VZMULJ(T1c, VADD(T1d, T1f)); + T2a = LDW(&(W[TWVL * 44])); + T2b = VZMULIJ(T2a, VSUB(T1f, T1d)); + TF = LD(&(Rp[WS(rs, 9)]), ms, &(Rp[WS(rs, 1)])); + TG = LD(&(Rm[WS(rs, 9)]), -ms, &(Rm[WS(rs, 1)])); + TH = VCONJ(TG); + TE = LDW(&(W[TWVL * 34])); + TI = VZMULJ(TE, VADD(TF, TH)); + T1S = LDW(&(W[TWVL * 36])); + T1T = VZMULIJ(T1S, VSUB(TH, TF)); + TL = LD(&(Rp[WS(rs, 5)]), ms, &(Rp[WS(rs, 1)])); + TM = LD(&(Rm[WS(rs, 5)]), -ms, &(Rm[WS(rs, 1)])); + TN = VCONJ(TM); + TK = LDW(&(W[TWVL * 18])); + TO = VZMULJ(TK, VADD(TL, TN)); + T1X = LDW(&(W[TWVL * 20])); + T1Y = VZMULIJ(T1X, VSUB(TN, TL)); + TX = LD(&(Rp[WS(rs, 15)]), ms, &(Rp[WS(rs, 1)])); + TY = LD(&(Rm[WS(rs, 15)]), -ms, &(Rm[WS(rs, 1)])); + TZ = VCONJ(TY); + TW = LDW(&(W[TWVL * 58])); + T10 = VZMULJ(TW, VADD(TX, TZ)); + T21 = LDW(&(W[TWVL * 60])); + T22 = VZMULIJ(T21, VSUB(TZ, TX)); + T12 = LD(&(Rp[WS(rs, 7)]), ms, &(Rp[WS(rs, 1)])); + T13 = LD(&(Rm[WS(rs, 7)]), -ms, &(Rm[WS(rs, 1)])); + T14 = VCONJ(T13); + T11 = LDW(&(W[TWVL * 26])); + T15 = VZMULJ(T11, VADD(T12, T14)); + T23 = LDW(&(W[TWVL * 28])); + T24 = VZMULIJ(T23, VSUB(T14, T12)); + TQ = LD(&(Rp[WS(rs, 13)]), ms, &(Rp[WS(rs, 1)])); + TR = LD(&(Rm[WS(rs, 13)]), -ms, &(Rm[WS(rs, 1)])); + TS = VCONJ(TR); + TP = LDW(&(W[TWVL * 50])); + TT = VZMULJ(TP, VADD(TQ, TS)); + T1V = LDW(&(W[TWVL * 52])); + T1W = VZMULIJ(T1V, VSUB(TS, TQ)); + } + TJ = VSUB(TD, TI); + TU = VSUB(TO, TT); + TV = VFNMS(LDK(KP382683432), TU, VMUL(LDK(KP923879532), TJ)); + T2p = VFMA(LDK(KP382683432), TJ, VMUL(LDK(KP923879532), TU)); + T16 = VSUB(T10, T15); + T1h = VSUB(T1b, T1g); + T1i = VFMA(LDK(KP923879532), T16, VMUL(LDK(KP382683432), T1h)); + T2o = VFNMS(LDK(KP923879532), T1h, VMUL(LDK(KP382683432), T16)); + T3J = VADD(T1Y, T1W); + T3K = VADD(T1R, T1T); + T3L = VSUB(T3J, T3K); + T4q = VADD(T3K, T3J); + T3G = VADD(T22, T24); + T3H = VADD(T29, T2b); + T3I = VSUB(T3G, T3H); + T4r = VADD(T3G, T3H); + T3u = VADD(T10, T15); + T3v = VADD(T1b, T1g); + T3w = VSUB(T3u, T3v); + T4k = VADD(T3u, T3v); + T3r = VADD(TD, TI); + T3s = VADD(TO, TT); + T3t = VSUB(T3r, T3s); + T4j = VADD(T3r, T3s); + T25 = VSUB(T22, T24); + T2c = VSUB(T29, T2b); + T1U = VSUB(T1R, T1T); + T1Z = VSUB(T1W, T1Y); + T20 = VMUL(LDK(KP707106781), VADD(T1U, T1Z)); + T27 = VMUL(LDK(KP707106781), VSUB(T1Z, T1U)); + T26 = VADD(T20, T25); + T2V = VADD(T27, T2c); + T2d = VSUB(T27, T2c); + T2U = VSUB(T25, T20); + } + { + V T4m, T4w, T4t, T4x, T4i, T4l, T4p, T4s, T4u, T4z, T4v, T4y, T4E, T4L, T4H; + V T4K, T4A, T4F, T4D, T4G, T4B, T4C, T4I, T4N, T4J, T4M, T3O, T4c, T4d, T3X; + V T40, T46, T49, T41, T3y, T47, T3T, T45, T3N, T44, T3W, T48, T3x, T3S, T3F; + V T3M, T3U, T3V, T3Y, T4e, T4f, T3Z, T42, T4a, T4b, T43; + T4i = VADD(T4g, T4h); + T4l = VADD(T4j, T4k); + T4m = VADD(T4i, T4l); + T4w = VSUB(T4i, T4l); + T4p = VADD(T4n, T4o); + T4s = VADD(T4q, T4r); + T4t = VADD(T4p, T4s); + T4x = VBYI(VSUB(T4s, T4p)); + T4u = VCONJ(VMUL(LDK(KP500000000), VSUB(T4m, T4t))); + ST(&(Rm[WS(rs, 15)]), T4u, -ms, &(Rm[WS(rs, 1)])); + T4z = VMUL(LDK(KP500000000), VADD(T4w, T4x)); + ST(&(Rp[WS(rs, 8)]), T4z, ms, &(Rp[0])); + T4v = VMUL(LDK(KP500000000), VADD(T4m, T4t)); + ST(&(Rp[0]), T4v, ms, &(Rp[0])); + T4y = VCONJ(VMUL(LDK(KP500000000), VSUB(T4w, T4x))); + ST(&(Rm[WS(rs, 7)]), T4y, -ms, &(Rm[WS(rs, 1)])); + T4A = VMUL(LDK(KP500000000), VSUB(T4g, T4h)); + T4F = VSUB(T4k, T4j); + T4B = VSUB(T4n, T4o); + T4C = VSUB(T4r, T4q); + T4D = VMUL(LDK(KP353553390), VADD(T4B, T4C)); + T4G = VMUL(LDK(KP707106781), VSUB(T4C, T4B)); + T4E = VADD(T4A, T4D); + T4L = VMUL(LDK(KP500000000), VBYI(VSUB(T4G, T4F))); + T4H = VMUL(LDK(KP500000000), VBYI(VADD(T4F, T4G))); + T4K = VSUB(T4A, T4D); + T4I = VCONJ(VSUB(T4E, T4H)); + ST(&(Rm[WS(rs, 3)]), T4I, -ms, &(Rm[WS(rs, 1)])); + T4N = VADD(T4K, T4L); + ST(&(Rp[WS(rs, 12)]), T4N, ms, &(Rp[0])); + T4J = VADD(T4E, T4H); + ST(&(Rp[WS(rs, 4)]), T4J, ms, &(Rp[0])); + T4M = VCONJ(VSUB(T4K, T4L)); + ST(&(Rm[WS(rs, 11)]), T4M, -ms, &(Rm[WS(rs, 1)])); + T3x = VMUL(LDK(KP353553390), VADD(T3t, T3w)); + T3y = VADD(T3q, T3x); + T47 = VSUB(T3q, T3x); + T3S = VMUL(LDK(KP707106781), VSUB(T3w, T3t)); + T3T = VADD(T3R, T3S); + T45 = VSUB(T3S, T3R); + T3F = VFMA(LDK(KP923879532), T3B, VMUL(LDK(KP382683432), T3E)); + T3M = VFNMS(LDK(KP382683432), T3L, VMUL(LDK(KP923879532), T3I)); + T3N = VMUL(LDK(KP500000000), VADD(T3F, T3M)); + T44 = VSUB(T3M, T3F); + T3U = VFNMS(LDK(KP382683432), T3B, VMUL(LDK(KP923879532), T3E)); + T3V = VFMA(LDK(KP923879532), T3L, VMUL(LDK(KP382683432), T3I)); + T3W = VADD(T3U, T3V); + T48 = VMUL(LDK(KP500000000), VSUB(T3V, T3U)); + T3O = VADD(T3y, T3N); + T4c = VMUL(LDK(KP500000000), VBYI(VADD(T45, T44))); + T4d = VADD(T47, T48); + T3X = VMUL(LDK(KP500000000), VBYI(VADD(T3T, T3W))); + T40 = VSUB(T3y, T3N); + T46 = VMUL(LDK(KP500000000), VBYI(VSUB(T44, T45))); + T49 = VSUB(T47, T48); + T41 = VMUL(LDK(KP500000000), VBYI(VSUB(T3W, T3T))); + T3Y = VCONJ(VSUB(T3O, T3X)); + ST(&(Rm[WS(rs, 1)]), T3Y, -ms, &(Rm[WS(rs, 1)])); + T4e = VADD(T4c, T4d); + ST(&(Rp[WS(rs, 6)]), T4e, ms, &(Rp[0])); + T4f = VCONJ(VSUB(T4d, T4c)); + ST(&(Rm[WS(rs, 5)]), T4f, -ms, &(Rm[WS(rs, 1)])); + T3Z = VADD(T3O, T3X); + ST(&(Rp[WS(rs, 2)]), T3Z, ms, &(Rp[0])); + T42 = VCONJ(VSUB(T40, T41)); + ST(&(Rm[WS(rs, 13)]), T42, -ms, &(Rm[WS(rs, 1)])); + T4a = VADD(T46, T49); + ST(&(Rp[WS(rs, 10)]), T4a, ms, &(Rp[0])); + T4b = VCONJ(VSUB(T49, T46)); + ST(&(Rm[WS(rs, 9)]), T4b, -ms, &(Rm[WS(rs, 1)])); + T43 = VADD(T40, T41); + ST(&(Rp[WS(rs, 14)]), T43, ms, &(Rp[0])); + { + V T2g, T2K, T2L, T2v, T2y, T2E, T2H, T2z, T1k, T2F, T2u, T2G, T2f, T2C, T2r; + V T2D, Ty, T1j, T2s, T2t, T1P, T2e, T2n, T2q, T2w, T2M, T2N, T2x, T2A, T2I; + V T2J, T2B; + Ty = VADD(Ta, Tx); + T1j = VMUL(LDK(KP500000000), VADD(TV, T1i)); + T1k = VADD(Ty, T1j); + T2F = VSUB(Ty, T1j); + T2s = VFNMS(LDK(KP195090322), T1B, VMUL(LDK(KP980785280), T1O)); + T2t = VFMA(LDK(KP195090322), T26, VMUL(LDK(KP980785280), T2d)); + T2u = VADD(T2s, T2t); + T2G = VMUL(LDK(KP500000000), VSUB(T2t, T2s)); + T1P = VFMA(LDK(KP980785280), T1B, VMUL(LDK(KP195090322), T1O)); + T2e = VFNMS(LDK(KP195090322), T2d, VMUL(LDK(KP980785280), T26)); + T2f = VMUL(LDK(KP500000000), VADD(T1P, T2e)); + T2C = VSUB(T2e, T1P); + T2n = VSUB(T2h, T2m); + T2q = VSUB(T2o, T2p); + T2r = VADD(T2n, T2q); + T2D = VSUB(T2q, T2n); + T2g = VADD(T1k, T2f); + T2K = VMUL(LDK(KP500000000), VBYI(VADD(T2D, T2C))); + T2L = VADD(T2F, T2G); + T2v = VMUL(LDK(KP500000000), VBYI(VADD(T2r, T2u))); + T2y = VSUB(T1k, T2f); + T2E = VMUL(LDK(KP500000000), VBYI(VSUB(T2C, T2D))); + T2H = VSUB(T2F, T2G); + T2z = VMUL(LDK(KP500000000), VBYI(VSUB(T2u, T2r))); + T2w = VCONJ(VSUB(T2g, T2v)); + ST(&(Rm[0]), T2w, -ms, &(Rm[0])); + T2M = VADD(T2K, T2L); + ST(&(Rp[WS(rs, 7)]), T2M, ms, &(Rp[WS(rs, 1)])); + T2N = VCONJ(VSUB(T2L, T2K)); + ST(&(Rm[WS(rs, 6)]), T2N, -ms, &(Rm[0])); + T2x = VADD(T2g, T2v); + ST(&(Rp[WS(rs, 1)]), T2x, ms, &(Rp[WS(rs, 1)])); + T2A = VCONJ(VSUB(T2y, T2z)); + ST(&(Rm[WS(rs, 14)]), T2A, -ms, &(Rm[0])); + T2I = VADD(T2E, T2H); + ST(&(Rp[WS(rs, 9)]), T2I, ms, &(Rp[WS(rs, 1)])); + T2J = VCONJ(VSUB(T2H, T2E)); + ST(&(Rm[WS(rs, 8)]), T2J, -ms, &(Rm[0])); + T2B = VADD(T2y, T2z); + ST(&(Rp[WS(rs, 15)]), T2B, ms, &(Rp[WS(rs, 1)])); + } + { + V T2Y, T3k, T3l, T35, T38, T3e, T3h, T39, T2Q, T3f, T34, T3g, T2X, T3c, T31; + V T3d, T2O, T2P, T32, T33, T2T, T2W, T2Z, T30, T36, T3m, T3n, T37, T3a, T3i; + V T3j, T3b; + T2O = VSUB(Ta, Tx); + T2P = VMUL(LDK(KP500000000), VADD(T2p, T2o)); + T2Q = VADD(T2O, T2P); + T3f = VSUB(T2O, T2P); + T32 = VFNMS(LDK(KP555570233), T2R, VMUL(LDK(KP831469612), T2S)); + T33 = VFMA(LDK(KP555570233), T2U, VMUL(LDK(KP831469612), T2V)); + T34 = VADD(T32, T33); + T3g = VMUL(LDK(KP500000000), VSUB(T33, T32)); + T2T = VFMA(LDK(KP831469612), T2R, VMUL(LDK(KP555570233), T2S)); + T2W = VFNMS(LDK(KP555570233), T2V, VMUL(LDK(KP831469612), T2U)); + T2X = VMUL(LDK(KP500000000), VADD(T2T, T2W)); + T3c = VSUB(T2W, T2T); + T2Z = VADD(T2m, T2h); + T30 = VSUB(T1i, TV); + T31 = VADD(T2Z, T30); + T3d = VSUB(T30, T2Z); + T2Y = VADD(T2Q, T2X); + T3k = VMUL(LDK(KP500000000), VBYI(VADD(T3d, T3c))); + T3l = VADD(T3f, T3g); + T35 = VMUL(LDK(KP500000000), VBYI(VADD(T31, T34))); + T38 = VSUB(T2Q, T2X); + T3e = VMUL(LDK(KP500000000), VBYI(VSUB(T3c, T3d))); + T3h = VSUB(T3f, T3g); + T39 = VMUL(LDK(KP500000000), VBYI(VSUB(T34, T31))); + T36 = VCONJ(VSUB(T2Y, T35)); + ST(&(Rm[WS(rs, 2)]), T36, -ms, &(Rm[0])); + T3m = VADD(T3k, T3l); + ST(&(Rp[WS(rs, 5)]), T3m, ms, &(Rp[WS(rs, 1)])); + T3n = VCONJ(VSUB(T3l, T3k)); + ST(&(Rm[WS(rs, 4)]), T3n, -ms, &(Rm[0])); + T37 = VADD(T2Y, T35); + ST(&(Rp[WS(rs, 3)]), T37, ms, &(Rp[WS(rs, 1)])); + T3a = VCONJ(VSUB(T38, T39)); + ST(&(Rm[WS(rs, 12)]), T3a, -ms, &(Rm[0])); + T3i = VADD(T3e, T3h); + ST(&(Rp[WS(rs, 11)]), T3i, ms, &(Rp[WS(rs, 1)])); + T3j = VCONJ(VSUB(T3h, T3e)); + ST(&(Rm[WS(rs, 10)]), T3j, -ms, &(Rm[0])); + T3b = VADD(T38, T39); + ST(&(Rp[WS(rs, 13)]), T3b, ms, &(Rp[WS(rs, 1)])); + } + } + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + VTW(1, 8), + VTW(1, 9), + VTW(1, 10), + VTW(1, 11), + VTW(1, 12), + VTW(1, 13), + VTW(1, 14), + VTW(1, 15), + VTW(1, 16), + VTW(1, 17), + VTW(1, 18), + VTW(1, 19), + VTW(1, 20), + VTW(1, 21), + VTW(1, 22), + VTW(1, 23), + VTW(1, 24), + VTW(1, 25), + VTW(1, 26), + VTW(1, 27), + VTW(1, 28), + VTW(1, 29), + VTW(1, 30), + VTW(1, 31), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 32, XSIMD_STRING("hc2cfdftv_32"), twinstr, &GENUS, {233, 117, 16, 0} }; + +void XSIMD(codelet_hc2cfdftv_32) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_32, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_4.c new file mode 100644 index 000000000..d7e1b0991 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_4.c @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 4 -dit -name hc2cfdftv_4 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 15 FP additions, 16 FP multiplications, + * (or, 9 additions, 10 multiplications, 6 fused multiply/add), + * 21 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 6)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(16, rs)) { + V T8, Th, Td, Tg, T3, Tc, T7, Ta, T1, T2, Tb, T5, T6, T4, T9; + V Te, Tj, Tf, Ti; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VFMACONJ(T2, T1); + Tb = LDW(&(W[0])); + Tc = VZMULIJ(Tb, VFNMSCONJ(T2, T1)); + T5 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T6 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T4 = LDW(&(W[TWVL * 2])); + T7 = VZMULJ(T4, VFMACONJ(T6, T5)); + T9 = LDW(&(W[TWVL * 4])); + Ta = VZMULIJ(T9, VFNMSCONJ(T6, T5)); + T8 = VSUB(T3, T7); + Th = VADD(Tc, Ta); + Td = VSUB(Ta, Tc); + Tg = VADD(T3, T7); + Te = VMUL(LDK(KP500000000), VFNMSI(Td, T8)); + ST(&(Rp[WS(rs, 1)]), Te, ms, &(Rp[WS(rs, 1)])); + Tj = VCONJ(VMUL(LDK(KP500000000), VADD(Th, Tg))); + ST(&(Rm[WS(rs, 1)]), Tj, -ms, &(Rm[WS(rs, 1)])); + Tf = VCONJ(VMUL(LDK(KP500000000), VFMAI(Td, T8))); + ST(&(Rm[0]), Tf, -ms, &(Rm[0])); + Ti = VMUL(LDK(KP500000000), VSUB(Tg, Th)); + ST(&(Rp[0]), Ti, ms, &(Rp[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 4, XSIMD_STRING("hc2cfdftv_4"), twinstr, &GENUS, {9, 10, 6, 0} }; + +void XSIMD(codelet_hc2cfdftv_4) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_4, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 4 -dit -name hc2cfdftv_4 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 15 FP additions, 10 FP multiplications, + * (or, 15 additions, 10 multiplications, 0 fused multiply/add), + * 23 stack variables, 1 constants, and 8 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_4(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 6)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 6), MAKE_VOLATILE_STRIDE(16, rs)) { + V T4, Tc, T9, Te, T1, T3, T2, Tb, T6, T8, T7, T5, Td, Tg, Th; + V Ta, Tf, Tk, Tl, Ti, Tj; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + T4 = VADD(T1, T3); + Tb = LDW(&(W[0])); + Tc = VZMULIJ(Tb, VSUB(T3, T1)); + T6 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T7 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T8 = VCONJ(T7); + T5 = LDW(&(W[TWVL * 2])); + T9 = VZMULJ(T5, VADD(T6, T8)); + Td = LDW(&(W[TWVL * 4])); + Te = VZMULIJ(Td, VSUB(T8, T6)); + Ta = VSUB(T4, T9); + Tf = VBYI(VSUB(Tc, Te)); + Tg = VMUL(LDK(KP500000000), VSUB(Ta, Tf)); + Th = VCONJ(VMUL(LDK(KP500000000), VADD(Ta, Tf))); + ST(&(Rp[WS(rs, 1)]), Tg, ms, &(Rp[WS(rs, 1)])); + ST(&(Rm[0]), Th, -ms, &(Rm[0])); + Ti = VADD(T4, T9); + Tj = VADD(Tc, Te); + Tk = VCONJ(VMUL(LDK(KP500000000), VSUB(Ti, Tj))); + Tl = VMUL(LDK(KP500000000), VADD(Ti, Tj)); + ST(&(Rm[WS(rs, 1)]), Tk, -ms, &(Rm[WS(rs, 1)])); + ST(&(Rp[0]), Tl, ms, &(Rp[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 4, XSIMD_STRING("hc2cfdftv_4"), twinstr, &GENUS, {15, 10, 0, 0} }; + +void XSIMD(codelet_hc2cfdftv_4) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_4, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_6.c new file mode 100644 index 000000000..4c3508bb7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_6.c @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 6 -dit -name hc2cfdftv_6 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 29 FP additions, 30 FP multiplications, + * (or, 17 additions, 18 multiplications, 12 fused multiply/add), + * 38 stack variables, 2 constants, and 12 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 10)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(24, rs)) { + V T8, Tr, Tf, Tk, Tl, Ts, Tt, Tu, T3, Tj, Te, Th, T7, Ta, T1; + V T2, Ti, Tc, Td, Tb, Tg, T5, T6, T4, T9, Tm, Tv, Tp, Tq, Tn; + V To, Ty, Tz, Tw, Tx; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VFMACONJ(T2, T1); + Ti = LDW(&(W[0])); + Tj = VZMULIJ(Ti, VFNMSCONJ(T2, T1)); + Tc = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Td = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tb = LDW(&(W[TWVL * 8])); + Te = VZMULIJ(Tb, VFNMSCONJ(Td, Tc)); + Tg = LDW(&(W[TWVL * 6])); + Th = VZMULJ(Tg, VFMACONJ(Td, Tc)); + T5 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + T6 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T4 = LDW(&(W[TWVL * 4])); + T7 = VZMULIJ(T4, VFNMSCONJ(T6, T5)); + T9 = LDW(&(W[TWVL * 2])); + Ta = VZMULJ(T9, VFMACONJ(T6, T5)); + T8 = VSUB(T3, T7); + Tr = VADD(T3, T7); + Tf = VSUB(Ta, Te); + Tk = VSUB(Th, Tj); + Tl = VADD(Tf, Tk); + Ts = VADD(Ta, Te); + Tt = VADD(Tj, Th); + Tu = VADD(Ts, Tt); + Tm = VMUL(LDK(KP500000000), VADD(T8, Tl)); + ST(&(Rp[0]), Tm, ms, &(Rp[0])); + Tv = VCONJ(VMUL(LDK(KP500000000), VADD(Tr, Tu))); + ST(&(Rm[WS(rs, 2)]), Tv, -ms, &(Rm[0])); + Tn = VFNMS(LDK(KP500000000), Tl, T8); + To = VMUL(LDK(KP866025403), VSUB(Tk, Tf)); + Tp = VMUL(LDK(KP500000000), VFNMSI(To, Tn)); + Tq = VCONJ(VMUL(LDK(KP500000000), VFMAI(To, Tn))); + ST(&(Rp[WS(rs, 2)]), Tp, ms, &(Rp[0])); + ST(&(Rm[WS(rs, 1)]), Tq, -ms, &(Rm[WS(rs, 1)])); + Tw = VFNMS(LDK(KP500000000), Tu, Tr); + Tx = VMUL(LDK(KP866025403), VSUB(Tt, Ts)); + Ty = VCONJ(VMUL(LDK(KP500000000), VFNMSI(Tx, Tw))); + Tz = VMUL(LDK(KP500000000), VFMAI(Tx, Tw)); + ST(&(Rm[0]), Ty, -ms, &(Rm[0])); + ST(&(Rp[WS(rs, 1)]), Tz, ms, &(Rp[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 6, XSIMD_STRING("hc2cfdftv_6"), twinstr, &GENUS, {17, 18, 12, 0} }; + +void XSIMD(codelet_hc2cfdftv_6) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_6, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 6 -dit -name hc2cfdftv_6 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 29 FP additions, 20 FP multiplications, + * (or, 27 additions, 18 multiplications, 2 fused multiply/add), + * 42 stack variables, 3 constants, and 12 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_6(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP250000000, +0.250000000000000000000000000000000000000000000); + DVK(KP866025403, +0.866025403784438646763723170752936183471402627); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 10)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 10), MAKE_VOLATILE_STRIDE(24, rs)) { + V Ta, Tu, Tn, Tw, Ti, Tv, T1, T8, Tg, Tf, T7, T3, Te, T6, T2; + V T4, T9, T5, Tk, Tm, Tj, Tl, Tc, Th, Tb, Td, Tr, Tp, Tq, To; + V Tt, Ts, TA, Ty, Tz, Tx, TC, TB; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T8 = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tg = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + Te = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + Tf = VCONJ(Te); + T6 = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + T7 = VCONJ(T6); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + T4 = VADD(T1, T3); + T5 = LDW(&(W[TWVL * 4])); + T9 = VZMULIJ(T5, VSUB(T7, T8)); + Ta = VADD(T4, T9); + Tu = VSUB(T4, T9); + Tj = LDW(&(W[0])); + Tk = VZMULIJ(Tj, VSUB(T3, T1)); + Tl = LDW(&(W[TWVL * 6])); + Tm = VZMULJ(Tl, VADD(Tf, Tg)); + Tn = VADD(Tk, Tm); + Tw = VSUB(Tm, Tk); + Tb = LDW(&(W[TWVL * 2])); + Tc = VZMULJ(Tb, VADD(T7, T8)); + Td = LDW(&(W[TWVL * 8])); + Th = VZMULIJ(Td, VSUB(Tf, Tg)); + Ti = VADD(Tc, Th); + Tv = VSUB(Tc, Th); + Tr = VMUL(LDK(KP500000000), VBYI(VMUL(LDK(KP866025403), VSUB(Tn, Ti)))); + To = VADD(Ti, Tn); + Tp = VMUL(LDK(KP500000000), VADD(Ta, To)); + Tq = VFNMS(LDK(KP250000000), To, VMUL(LDK(KP500000000), Ta)); + ST(&(Rp[0]), Tp, ms, &(Rp[0])); + Tt = VCONJ(VADD(Tq, Tr)); + ST(&(Rm[WS(rs, 1)]), Tt, -ms, &(Rm[WS(rs, 1)])); + Ts = VSUB(Tq, Tr); + ST(&(Rp[WS(rs, 2)]), Ts, ms, &(Rp[0])); + TA = VMUL(LDK(KP500000000), VBYI(VMUL(LDK(KP866025403), VSUB(Tw, Tv)))); + Tx = VADD(Tv, Tw); + Ty = VCONJ(VMUL(LDK(KP500000000), VADD(Tu, Tx))); + Tz = VFNMS(LDK(KP250000000), Tx, VMUL(LDK(KP500000000), Tu)); + ST(&(Rm[WS(rs, 2)]), Ty, -ms, &(Rm[0])); + TC = VADD(Tz, TA); + ST(&(Rp[WS(rs, 1)]), TC, ms, &(Rp[WS(rs, 1)])); + TB = VCONJ(VSUB(Tz, TA)); + ST(&(Rm[0]), TB, -ms, &(Rm[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 6, XSIMD_STRING("hc2cfdftv_6"), twinstr, &GENUS, {27, 18, 2, 0} }; + +void XSIMD(codelet_hc2cfdftv_6) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_6, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_8.c new file mode 100644 index 000000000..e3e0fba9e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/common/hc2cfdftv_8.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on Thu May 24 08:08:11 EDT 2018 */ + +#include "rdft/codelet-rdft.h" + +#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA) + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -fma -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 8 -dit -name hc2cfdftv_8 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 41 FP additions, 40 FP multiplications, + * (or, 23 additions, 22 multiplications, 18 fused multiply/add), + * 52 stack variables, 2 constants, and 16 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 14)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(32, rs)) { + V T8, Tt, TG, TF, TD, TC, Tn, Tu, T3, Tc, Tl, Ts, T7, Ta, Th; + V Tq, T1, T2, Tb, Tj, Tk, Ti, Tr, T5, T6, T4, T9, Tf, Tg, Te; + V Tp, Td, Tm, Tw, Tx, To, Tv, TM, TN, TK, TL, TA, TB, Ty, Tz; + V TI, TJ, TE, TH; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VFMACONJ(T2, T1); + Tb = LDW(&(W[0])); + Tc = VZMULIJ(Tb, VFNMSCONJ(T2, T1)); + Tj = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Tk = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Ti = LDW(&(W[TWVL * 12])); + Tl = VZMULIJ(Ti, VFNMSCONJ(Tk, Tj)); + Tr = LDW(&(W[TWVL * 10])); + Ts = VZMULJ(Tr, VFMACONJ(Tk, Tj)); + T5 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T6 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T4 = LDW(&(W[TWVL * 6])); + T7 = VZMULJ(T4, VFMACONJ(T6, T5)); + T9 = LDW(&(W[TWVL * 8])); + Ta = VZMULIJ(T9, VFNMSCONJ(T6, T5)); + Tf = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Tg = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Te = LDW(&(W[TWVL * 4])); + Th = VZMULIJ(Te, VFNMSCONJ(Tg, Tf)); + Tp = LDW(&(W[TWVL * 2])); + Tq = VZMULJ(Tp, VFMACONJ(Tg, Tf)); + T8 = VSUB(T3, T7); + Tt = VSUB(Tq, Ts); + TG = VADD(Th, Tl); + TF = VADD(Tc, Ta); + TD = VADD(Tq, Ts); + TC = VADD(T3, T7); + Td = VSUB(Ta, Tc); + Tm = VSUB(Th, Tl); + Tn = VADD(Td, Tm); + Tu = VSUB(Tm, Td); + To = VFMA(LDK(KP707106781), Tn, T8); + Tv = VFNMS(LDK(KP707106781), Tu, Tt); + Tw = VMUL(LDK(KP500000000), VFNMSI(Tv, To)); + Tx = VCONJ(VMUL(LDK(KP500000000), VFMAI(Tv, To))); + ST(&(Rp[WS(rs, 1)]), Tw, ms, &(Rp[WS(rs, 1)])); + ST(&(Rm[0]), Tx, -ms, &(Rm[0])); + TK = VADD(TC, TD); + TL = VADD(TF, TG); + TM = VMUL(LDK(KP500000000), VSUB(TK, TL)); + TN = VCONJ(VMUL(LDK(KP500000000), VADD(TL, TK))); + ST(&(Rp[0]), TM, ms, &(Rp[0])); + ST(&(Rm[WS(rs, 3)]), TN, -ms, &(Rm[WS(rs, 1)])); + Ty = VFNMS(LDK(KP707106781), Tn, T8); + Tz = VFMA(LDK(KP707106781), Tu, Tt); + TA = VCONJ(VMUL(LDK(KP500000000), VFNMSI(Tz, Ty))); + TB = VMUL(LDK(KP500000000), VFMAI(Tz, Ty)); + ST(&(Rm[WS(rs, 2)]), TA, -ms, &(Rm[0])); + ST(&(Rp[WS(rs, 3)]), TB, ms, &(Rp[WS(rs, 1)])); + TE = VSUB(TC, TD); + TH = VSUB(TF, TG); + TI = VMUL(LDK(KP500000000), VFMAI(TH, TE)); + TJ = VCONJ(VMUL(LDK(KP500000000), VFNMSI(TH, TE))); + ST(&(Rp[WS(rs, 2)]), TI, ms, &(Rp[0])); + ST(&(Rm[WS(rs, 1)]), TJ, -ms, &(Rm[WS(rs, 1)])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 8, XSIMD_STRING("hc2cfdftv_8"), twinstr, &GENUS, {23, 22, 18, 0} }; + +void XSIMD(codelet_hc2cfdftv_8) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_8, &desc, HC2C_VIA_DFT); +} +#else + +/* Generated by: ../../../genfft/gen_hc2cdft_c.native -simd -compact -variables 4 -pipeline-latency 8 -trivial-stores -variables 32 -no-generate-bytw -n 8 -dit -name hc2cfdftv_8 -include rdft/simd/hc2cfv.h */ + +/* + * This function contains 41 FP additions, 23 FP multiplications, + * (or, 41 additions, 23 multiplications, 0 fused multiply/add), + * 57 stack variables, 3 constants, and 16 memory accesses + */ +#include "rdft/simd/hc2cfv.h" + +static void hc2cfdftv_8(R *Rp, R *Ip, R *Rm, R *Im, const R *W, stride rs, INT mb, INT me, INT ms) +{ + DVK(KP707106781, +0.707106781186547524400844362104849039284835938); + DVK(KP353553390, +0.353553390593273762200422181052424519642417969); + DVK(KP500000000, +0.500000000000000000000000000000000000000000000); + { + INT m; + for (m = mb, W = W + ((mb - 1) * ((TWVL / VL) * 14)); m < me; m = m + VL, Rp = Rp + (VL * ms), Ip = Ip + (VL * ms), Rm = Rm - (VL * ms), Im = Im - (VL * ms), W = W + (TWVL * 14), MAKE_VOLATILE_STRIDE(32, rs)) { + V Ta, TE, Tr, TF, Tl, TK, Tw, TG, T1, T6, T3, T8, T2, T7, T4; + V T9, T5, To, Tq, Tn, Tp, Tc, Th, Te, Tj, Td, Ti, Tf, Tk, Tb; + V Tg, Tt, Tv, Ts, Tu, Ty, Tz, Tm, Tx, TC, TD, TA, TB, TI, TO; + V TL, TP, TH, TJ, TM, TR, TN, TQ; + T1 = LD(&(Rp[0]), ms, &(Rp[0])); + T6 = LD(&(Rp[WS(rs, 2)]), ms, &(Rp[0])); + T2 = LD(&(Rm[0]), -ms, &(Rm[0])); + T3 = VCONJ(T2); + T7 = LD(&(Rm[WS(rs, 2)]), -ms, &(Rm[0])); + T8 = VCONJ(T7); + T4 = VADD(T1, T3); + T5 = LDW(&(W[TWVL * 6])); + T9 = VZMULJ(T5, VADD(T6, T8)); + Ta = VADD(T4, T9); + TE = VMUL(LDK(KP500000000), VSUB(T4, T9)); + Tn = LDW(&(W[0])); + To = VZMULIJ(Tn, VSUB(T3, T1)); + Tp = LDW(&(W[TWVL * 8])); + Tq = VZMULIJ(Tp, VSUB(T8, T6)); + Tr = VADD(To, Tq); + TF = VSUB(To, Tq); + Tc = LD(&(Rp[WS(rs, 1)]), ms, &(Rp[WS(rs, 1)])); + Th = LD(&(Rp[WS(rs, 3)]), ms, &(Rp[WS(rs, 1)])); + Td = LD(&(Rm[WS(rs, 1)]), -ms, &(Rm[WS(rs, 1)])); + Te = VCONJ(Td); + Ti = LD(&(Rm[WS(rs, 3)]), -ms, &(Rm[WS(rs, 1)])); + Tj = VCONJ(Ti); + Tb = LDW(&(W[TWVL * 2])); + Tf = VZMULJ(Tb, VADD(Tc, Te)); + Tg = LDW(&(W[TWVL * 10])); + Tk = VZMULJ(Tg, VADD(Th, Tj)); + Tl = VADD(Tf, Tk); + TK = VSUB(Tf, Tk); + Ts = LDW(&(W[TWVL * 4])); + Tt = VZMULIJ(Ts, VSUB(Te, Tc)); + Tu = LDW(&(W[TWVL * 12])); + Tv = VZMULIJ(Tu, VSUB(Tj, Th)); + Tw = VADD(Tt, Tv); + TG = VSUB(Tv, Tt); + Tm = VADD(Ta, Tl); + Tx = VADD(Tr, Tw); + Ty = VCONJ(VMUL(LDK(KP500000000), VSUB(Tm, Tx))); + Tz = VMUL(LDK(KP500000000), VADD(Tm, Tx)); + ST(&(Rm[WS(rs, 3)]), Ty, -ms, &(Rm[WS(rs, 1)])); + ST(&(Rp[0]), Tz, ms, &(Rp[0])); + TA = VSUB(Ta, Tl); + TB = VBYI(VSUB(Tw, Tr)); + TC = VCONJ(VMUL(LDK(KP500000000), VSUB(TA, TB))); + TD = VMUL(LDK(KP500000000), VADD(TA, TB)); + ST(&(Rm[WS(rs, 1)]), TC, -ms, &(Rm[WS(rs, 1)])); + ST(&(Rp[WS(rs, 2)]), TD, ms, &(Rp[0])); + TH = VMUL(LDK(KP353553390), VADD(TF, TG)); + TI = VADD(TE, TH); + TO = VSUB(TE, TH); + TJ = VMUL(LDK(KP707106781), VSUB(TG, TF)); + TL = VMUL(LDK(KP500000000), VBYI(VSUB(TJ, TK))); + TP = VMUL(LDK(KP500000000), VBYI(VADD(TK, TJ))); + TM = VCONJ(VSUB(TI, TL)); + ST(&(Rm[0]), TM, -ms, &(Rm[0])); + TR = VADD(TO, TP); + ST(&(Rp[WS(rs, 3)]), TR, ms, &(Rp[WS(rs, 1)])); + TN = VADD(TI, TL); + ST(&(Rp[WS(rs, 1)]), TN, ms, &(Rp[WS(rs, 1)])); + TQ = VCONJ(VSUB(TO, TP)); + ST(&(Rm[WS(rs, 2)]), TQ, -ms, &(Rm[0])); + } + } + VLEAVE(); +} + +static const tw_instr twinstr[] = { + VTW(1, 1), + VTW(1, 2), + VTW(1, 3), + VTW(1, 4), + VTW(1, 5), + VTW(1, 6), + VTW(1, 7), + {TW_NEXT, VL, 0} +}; + +static const hc2c_desc desc = { 8, XSIMD_STRING("hc2cfdftv_8"), twinstr, &GENUS, {41, 23, 0, 0} }; + +void XSIMD(codelet_hc2cfdftv_8) (planner *p) { + X(khc2c_register) (p, hc2cfdftv_8, &desc, HC2C_VIA_DFT); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/Makefile.am new file mode 100644 index 000000000..9b449f50e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/Makefile.am @@ -0,0 +1,12 @@ +SIMD_HEADER=simd-support/simd-generic128.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_GENERIC_SIMD128 + +noinst_LTLIBRARIES = librdft_generic_simd128_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_generic_simd128_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/Makefile.in new file mode 100644 index 000000000..1e2e027ba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/generic-simd128 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_generic_simd128_codelets_la_LIBADD = +am__librdft_generic_simd128_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_GENERIC_SIMD128_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_GENERIC_SIMD128_TRUE@am_librdft_generic_simd128_codelets_la_OBJECTS = \ +@HAVE_GENERIC_SIMD128_TRUE@ $(am__objects_5) +librdft_generic_simd128_codelets_la_OBJECTS = \ + $(am_librdft_generic_simd128_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_GENERIC_SIMD128_TRUE@am_librdft_generic_simd128_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_generic_simd128_codelets_la_SOURCES) +DIST_SOURCES = \ + $(am__librdft_generic_simd128_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SIMD_HEADER = simd-support/simd-generic128.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_GENERIC_SIMD128_TRUE@noinst_LTLIBRARIES = librdft_generic_simd128_codelets.la +@HAVE_GENERIC_SIMD128_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_GENERIC_SIMD128_TRUE@librdft_generic_simd128_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/generic-simd128/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/generic-simd128/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_generic_simd128_codelets.la: $(librdft_generic_simd128_codelets_la_OBJECTS) $(librdft_generic_simd128_codelets_la_DEPENDENCIES) $(EXTRA_librdft_generic_simd128_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_generic_simd128_codelets_la_rpath) $(librdft_generic_simd128_codelets_la_OBJECTS) $(librdft_generic_simd128_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/codlist.c new file mode 100644 index 000000000..d9fbb84d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/genus.c new file mode 100644 index 000000000..3fc26987a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_10.c new file mode 100644 index 000000000..9bbb85136 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_12.c new file mode 100644 index 000000000..8a3472df4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_16.c new file mode 100644 index 000000000..f7f4e55bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_2.c new file mode 100644 index 000000000..510cb7472 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_20.c new file mode 100644 index 000000000..f101722d9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_32.c new file mode 100644 index 000000000..eaf84be28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_4.c new file mode 100644 index 000000000..6f681749f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_6.c new file mode 100644 index 000000000..2615bd655 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_8.c new file mode 100644 index 000000000..f562a5efd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_10.c new file mode 100644 index 000000000..48a479fa7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_12.c new file mode 100644 index 000000000..0f6a737db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_16.c new file mode 100644 index 000000000..9d5fec202 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_2.c new file mode 100644 index 000000000..26b286f5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_20.c new file mode 100644 index 000000000..19665835e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_32.c new file mode 100644 index 000000000..bec9b4b8e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_4.c new file mode 100644 index 000000000..0fa616e8b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_6.c new file mode 100644 index 000000000..d46775c2f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_8.c new file mode 100644 index 000000000..8c9ec40b3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd128/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic128.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/Makefile.am new file mode 100644 index 000000000..60f143ebb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/Makefile.am @@ -0,0 +1,12 @@ +SIMD_HEADER=simd-support/simd-generic256.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_GENERIC_SIMD256 + +noinst_LTLIBRARIES = librdft_generic_simd256_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_generic_simd256_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/Makefile.in new file mode 100644 index 000000000..f568f769c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/generic-simd256 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_generic_simd256_codelets_la_LIBADD = +am__librdft_generic_simd256_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_GENERIC_SIMD256_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_GENERIC_SIMD256_TRUE@am_librdft_generic_simd256_codelets_la_OBJECTS = \ +@HAVE_GENERIC_SIMD256_TRUE@ $(am__objects_5) +librdft_generic_simd256_codelets_la_OBJECTS = \ + $(am_librdft_generic_simd256_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_GENERIC_SIMD256_TRUE@am_librdft_generic_simd256_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_generic_simd256_codelets_la_SOURCES) +DIST_SOURCES = \ + $(am__librdft_generic_simd256_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SIMD_HEADER = simd-support/simd-generic256.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_GENERIC_SIMD256_TRUE@noinst_LTLIBRARIES = librdft_generic_simd256_codelets.la +@HAVE_GENERIC_SIMD256_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_GENERIC_SIMD256_TRUE@librdft_generic_simd256_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/generic-simd256/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/generic-simd256/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_generic_simd256_codelets.la: $(librdft_generic_simd256_codelets_la_OBJECTS) $(librdft_generic_simd256_codelets_la_DEPENDENCIES) $(EXTRA_librdft_generic_simd256_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_generic_simd256_codelets_la_rpath) $(librdft_generic_simd256_codelets_la_OBJECTS) $(librdft_generic_simd256_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/codlist.c new file mode 100644 index 000000000..d37edc3f9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/genus.c new file mode 100644 index 000000000..20bcdd4ea --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_10.c new file mode 100644 index 000000000..c1c33a470 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_12.c new file mode 100644 index 000000000..14754bf3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_16.c new file mode 100644 index 000000000..638ce1f1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_2.c new file mode 100644 index 000000000..1a613de07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_20.c new file mode 100644 index 000000000..ce01a27d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_32.c new file mode 100644 index 000000000..aa19cb5e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_4.c new file mode 100644 index 000000000..c6b2fc920 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_6.c new file mode 100644 index 000000000..836abaa87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_8.c new file mode 100644 index 000000000..02f3d98d4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_10.c new file mode 100644 index 000000000..81302d8b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_12.c new file mode 100644 index 000000000..4a4cf099b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_16.c new file mode 100644 index 000000000..42e9e79b1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_2.c new file mode 100644 index 000000000..556064bc6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_20.c new file mode 100644 index 000000000..e18b0aa4f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_32.c new file mode 100644 index 000000000..766e47f2d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_4.c new file mode 100644 index 000000000..e26961eb5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_6.c new file mode 100644 index 000000000..8e218a563 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_8.c new file mode 100644 index 000000000..b49bfbca5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/generic-simd256/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-generic256.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/hc2cbv.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/hc2cbv.h new file mode 100644 index 000000000..61ec62356 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/hc2cbv.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define VTW VTW3 +#define TWVL TWVL3 +#define LDW(x) LDA(x, 0, 0) + +#define GENUS XSIMD(rdft_hc2cbv_genus) +extern const hc2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/hc2cfv.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/hc2cfv.h new file mode 100644 index 000000000..1ad183117 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/hc2cfv.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include SIMD_HEADER + +#define VTW VTW3 +#define TWVL TWVL3 +#define LDW(x) LDA(x, 0, 0) + +#define GENUS XSIMD(rdft_hc2cfv_genus) +extern const hc2c_genus GENUS; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/Makefile.am new file mode 100644 index 000000000..1b75789f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(KCVI_CFLAGS) +SIMD_HEADER=simd-support/simd-kcvi.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_KCVI + +noinst_LTLIBRARIES = librdft_kcvi_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_kcvi_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/Makefile.in new file mode 100644 index 000000000..7cc20d35b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/kcvi +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_kcvi_codelets_la_LIBADD = +am__librdft_kcvi_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_KCVI_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_KCVI_TRUE@am_librdft_kcvi_codelets_la_OBJECTS = \ +@HAVE_KCVI_TRUE@ $(am__objects_5) +librdft_kcvi_codelets_la_OBJECTS = \ + $(am_librdft_kcvi_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_KCVI_TRUE@am_librdft_kcvi_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_kcvi_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_kcvi_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(KCVI_CFLAGS) +SIMD_HEADER = simd-support/simd-kcvi.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_KCVI_TRUE@noinst_LTLIBRARIES = librdft_kcvi_codelets.la +@HAVE_KCVI_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_KCVI_TRUE@librdft_kcvi_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/kcvi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/kcvi/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_kcvi_codelets.la: $(librdft_kcvi_codelets_la_OBJECTS) $(librdft_kcvi_codelets_la_DEPENDENCIES) $(EXTRA_librdft_kcvi_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_kcvi_codelets_la_rpath) $(librdft_kcvi_codelets_la_OBJECTS) $(librdft_kcvi_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/codlist.c new file mode 100644 index 000000000..bbf3f729e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/genus.c new file mode 100644 index 000000000..80d7ef247 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_10.c new file mode 100644 index 000000000..e12d6e62f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_12.c new file mode 100644 index 000000000..ae76089c5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_16.c new file mode 100644 index 000000000..3b1dc9b83 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_2.c new file mode 100644 index 000000000..cb12675b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_20.c new file mode 100644 index 000000000..ed8839928 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_32.c new file mode 100644 index 000000000..6d138040d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_4.c new file mode 100644 index 000000000..a30bd5663 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_6.c new file mode 100644 index 000000000..67503a74f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_8.c new file mode 100644 index 000000000..9de2c7b26 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_10.c new file mode 100644 index 000000000..f2c1f50f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_12.c new file mode 100644 index 000000000..0d2816e02 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_16.c new file mode 100644 index 000000000..e13eb8717 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_2.c new file mode 100644 index 000000000..4a1ec3b17 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_20.c new file mode 100644 index 000000000..9e64ae189 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_32.c new file mode 100644 index 000000000..cd741e47f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_4.c new file mode 100644 index 000000000..ec90faed4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_6.c new file mode 100644 index 000000000..b9be31d52 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_8.c new file mode 100644 index 000000000..0c548a9c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/kcvi/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-kcvi.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/Makefile.am new file mode 100644 index 000000000..d9b7a8e8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/Makefile.am @@ -0,0 +1,13 @@ +AM_CFLAGS = $(NEON_CFLAGS) +SIMD_HEADER=simd-support/simd-neon.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_NEON + +noinst_LTLIBRARIES = librdft_neon_codelets.la +BUILT_SOURCES = $(EXTRA_DIST) +librdft_neon_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/Makefile.in new file mode 100644 index 000000000..7fed8e035 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/neon +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_neon_codelets_la_LIBADD = +am__librdft_neon_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_NEON_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_NEON_TRUE@am_librdft_neon_codelets_la_OBJECTS = \ +@HAVE_NEON_TRUE@ $(am__objects_5) +librdft_neon_codelets_la_OBJECTS = \ + $(am_librdft_neon_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_NEON_TRUE@am_librdft_neon_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_neon_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_neon_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(NEON_CFLAGS) +SIMD_HEADER = simd-support/simd-neon.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_NEON_TRUE@noinst_LTLIBRARIES = librdft_neon_codelets.la +@HAVE_NEON_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_NEON_TRUE@librdft_neon_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/neon/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/neon/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_neon_codelets.la: $(librdft_neon_codelets_la_OBJECTS) $(librdft_neon_codelets_la_DEPENDENCIES) $(EXTRA_librdft_neon_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_neon_codelets_la_rpath) $(librdft_neon_codelets_la_OBJECTS) $(librdft_neon_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/codlist.c new file mode 100644 index 000000000..9c85b6da2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/genus.c new file mode 100644 index 000000000..0017200ab --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_10.c new file mode 100644 index 000000000..cd6a03168 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_12.c new file mode 100644 index 000000000..be8627b2c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_16.c new file mode 100644 index 000000000..56efcae99 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_2.c new file mode 100644 index 000000000..eaf5c1744 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_20.c new file mode 100644 index 000000000..7f370ec7c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_32.c new file mode 100644 index 000000000..f1b89c27f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_4.c new file mode 100644 index 000000000..d6eed64b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_6.c new file mode 100644 index 000000000..b6059fa0e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_8.c new file mode 100644 index 000000000..a35bae1da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_10.c new file mode 100644 index 000000000..d500828f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_12.c new file mode 100644 index 000000000..5c9b36778 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_16.c new file mode 100644 index 000000000..307ae0a57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_2.c new file mode 100644 index 000000000..a200d62a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_20.c new file mode 100644 index 000000000..46fbb3885 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_32.c new file mode 100644 index 000000000..cfd0becb8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_4.c new file mode 100644 index 000000000..3fe8948c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_6.c new file mode 100644 index 000000000..3016631b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_8.c new file mode 100644 index 000000000..d3268a58f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/neon/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-neon.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/simd.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/simd.mk new file mode 100644 index 000000000..9ffcf5c8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/simd.mk @@ -0,0 +1,11 @@ +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c + +if MAINTAINER_MODE +$(EXTRA_DIST): Makefile + ( \ + echo "/* Generated automatically. DO NOT EDIT! */"; \ + echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ + echo "#include \"../common/"$*".c\""; \ + ) >$@ +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/Makefile.am new file mode 100644 index 000000000..86c0c7a80 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(SSE2_CFLAGS) +SIMD_HEADER=simd-support/simd-sse2.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_SSE2 + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = librdft_sse2_codelets.la +librdft_sse2_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/Makefile.in new file mode 100644 index 000000000..19e2b0273 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/Makefile.in @@ -0,0 +1,705 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/sse2 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_sse2_codelets_la_LIBADD = +am__librdft_sse2_codelets_la_SOURCES_DIST = hc2cfdftv_2.c \ + hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c \ + hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c \ + hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ + hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ + hc2cbdftv_20.c genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_SSE2_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_SSE2_TRUE@am_librdft_sse2_codelets_la_OBJECTS = \ +@HAVE_SSE2_TRUE@ $(am__objects_5) +librdft_sse2_codelets_la_OBJECTS = \ + $(am_librdft_sse2_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_SSE2_TRUE@am_librdft_sse2_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_sse2_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_sse2_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(SSE2_CFLAGS) +SIMD_HEADER = simd-support/simd-sse2.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_SSE2_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_SSE2_TRUE@noinst_LTLIBRARIES = librdft_sse2_codelets.la +@HAVE_SSE2_TRUE@librdft_sse2_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/sse2/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/sse2/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_sse2_codelets.la: $(librdft_sse2_codelets_la_OBJECTS) $(librdft_sse2_codelets_la_DEPENDENCIES) $(EXTRA_librdft_sse2_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_sse2_codelets_la_rpath) $(librdft_sse2_codelets_la_OBJECTS) $(librdft_sse2_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/codlist.c new file mode 100644 index 000000000..35eea34d2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/genus.c new file mode 100644 index 000000000..5435152ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_10.c new file mode 100644 index 000000000..78d8e2c66 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_12.c new file mode 100644 index 000000000..dea6bba41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_16.c new file mode 100644 index 000000000..9d71643d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_2.c new file mode 100644 index 000000000..7a1ce68c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_20.c new file mode 100644 index 000000000..35fc1969b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_32.c new file mode 100644 index 000000000..9038061bd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_4.c new file mode 100644 index 000000000..fd9411ace --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_6.c new file mode 100644 index 000000000..0c177f14d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_8.c new file mode 100644 index 000000000..505664382 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_10.c new file mode 100644 index 000000000..f28d38ea3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_12.c new file mode 100644 index 000000000..bdebd9fe7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_16.c new file mode 100644 index 000000000..130a929ce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_2.c new file mode 100644 index 000000000..5ec438c03 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_20.c new file mode 100644 index 000000000..db202f462 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_32.c new file mode 100644 index 000000000..88832b17c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_4.c new file mode 100644 index 000000000..270af8ad1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_6.c new file mode 100644 index 000000000..923cb0d23 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_8.c new file mode 100644 index 000000000..951ede567 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/sse2/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-sse2.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/Makefile.am new file mode 100644 index 000000000..09df3e2f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/Makefile.am @@ -0,0 +1,15 @@ +AM_CFLAGS = $(VSX_CFLAGS) +SIMD_HEADER=simd-support/simd-vsx.h + +include $(top_srcdir)/rdft/simd/codlist.mk +include $(top_srcdir)/rdft/simd/simd.mk + +if HAVE_VSX + +BUILT_SOURCES = $(EXTRA_DIST) +noinst_LTLIBRARIES = librdft_vsx_codelets.la +librdft_vsx_codelets_la_SOURCES = $(BUILT_SOURCES) + +endif + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/Makefile.in new file mode 100644 index 000000000..4673c3d50 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/Makefile.in @@ -0,0 +1,704 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file contains a standard list of RDFT SIMD codelets. It is +# included by common/Makefile to generate the C files with the actual +# codelets in them. It is included by {sse,sse2,...}/Makefile to +# generate and compile stub files that include common/*.c + +# You can customize FFTW for special needs, e.g. to handle certain +# sizes more efficiently, by adding new codelets to the lists of those +# included by default. If you change the list of codelets, any new +# ones you added will be automatically generated when you run the +# bootstrap script (see "Generating your own code" in the FFTW +# manual). + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = rdft/simd/vsx +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +librdft_vsx_codelets_la_LIBADD = +am__librdft_vsx_codelets_la_SOURCES_DIST = hc2cfdftv_2.c hc2cfdftv_4.c \ + hc2cfdftv_6.c hc2cfdftv_8.c hc2cfdftv_10.c hc2cfdftv_12.c \ + hc2cfdftv_16.c hc2cfdftv_32.c hc2cfdftv_20.c hc2cbdftv_2.c \ + hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c hc2cbdftv_10.c \ + hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c hc2cbdftv_20.c \ + genus.c codlist.c +am__objects_1 = hc2cfdftv_2.lo hc2cfdftv_4.lo hc2cfdftv_6.lo \ + hc2cfdftv_8.lo hc2cfdftv_10.lo hc2cfdftv_12.lo hc2cfdftv_16.lo \ + hc2cfdftv_32.lo hc2cfdftv_20.lo +am__objects_2 = hc2cbdftv_2.lo hc2cbdftv_4.lo hc2cbdftv_6.lo \ + hc2cbdftv_8.lo hc2cbdftv_10.lo hc2cbdftv_12.lo hc2cbdftv_16.lo \ + hc2cbdftv_32.lo hc2cbdftv_20.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) +am__objects_4 = $(am__objects_3) genus.lo codlist.lo +@HAVE_VSX_TRUE@am__objects_5 = $(am__objects_4) +@HAVE_VSX_TRUE@am_librdft_vsx_codelets_la_OBJECTS = $(am__objects_5) +librdft_vsx_codelets_la_OBJECTS = \ + $(am_librdft_vsx_codelets_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +@HAVE_VSX_TRUE@am_librdft_vsx_codelets_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(librdft_vsx_codelets_la_SOURCES) +DIST_SOURCES = $(am__librdft_vsx_codelets_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/rdft/simd/codlist.mk \ + $(top_srcdir)/rdft/simd/simd.mk +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = $(VSX_CFLAGS) +SIMD_HEADER = simd-support/simd-vsx.h +HC2CFDFTV = hc2cfdftv_2.c hc2cfdftv_4.c hc2cfdftv_6.c hc2cfdftv_8.c \ +hc2cfdftv_10.c hc2cfdftv_12.c hc2cfdftv_16.c hc2cfdftv_32.c \ +hc2cfdftv_20.c + +HC2CBDFTV = hc2cbdftv_2.c hc2cbdftv_4.c hc2cbdftv_6.c hc2cbdftv_8.c \ +hc2cbdftv_10.c hc2cbdftv_12.c hc2cbdftv_16.c hc2cbdftv_32.c \ +hc2cbdftv_20.c + + +########################################################################### +SIMD_CODELETS = $(HC2CFDFTV) $(HC2CBDFTV) +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = $(SIMD_CODELETS) genus.c codlist.c +@HAVE_VSX_TRUE@BUILT_SOURCES = $(EXTRA_DIST) +@HAVE_VSX_TRUE@noinst_LTLIBRARIES = librdft_vsx_codelets.la +@HAVE_VSX_TRUE@librdft_vsx_codelets_la_SOURCES = $(BUILT_SOURCES) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu rdft/simd/vsx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu rdft/simd/vsx/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/rdft/simd/codlist.mk $(top_srcdir)/rdft/simd/simd.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +librdft_vsx_codelets.la: $(librdft_vsx_codelets_la_OBJECTS) $(librdft_vsx_codelets_la_DEPENDENCIES) $(EXTRA_librdft_vsx_codelets_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(am_librdft_vsx_codelets_la_rpath) $(librdft_vsx_codelets_la_OBJECTS) $(librdft_vsx_codelets_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codlist.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genus.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cbdftv_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_20.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hc2cfdftv_8.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: all check install install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@MAINTAINER_MODE_TRUE@$(EXTRA_DIST): Makefile +@MAINTAINER_MODE_TRUE@ ( \ +@MAINTAINER_MODE_TRUE@ echo "/* Generated automatically. DO NOT EDIT! */"; \ +@MAINTAINER_MODE_TRUE@ echo "#define SIMD_HEADER \"$(SIMD_HEADER)\""; \ +@MAINTAINER_MODE_TRUE@ echo "#include \"../common/"$*".c\""; \ +@MAINTAINER_MODE_TRUE@ ) >$@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/codlist.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/codlist.c new file mode 100644 index 000000000..efa4ec8e6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/codlist.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/codlist.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/genus.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/genus.c new file mode 100644 index 000000000..b195f84f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/genus.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/genus.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_10.c new file mode 100644 index 000000000..49eacf6ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_12.c new file mode 100644 index 000000000..9981824ef --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_16.c new file mode 100644 index 000000000..9fb7dc3b5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_2.c new file mode 100644 index 000000000..0ca5aaaec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_20.c new file mode 100644 index 000000000..6788b4074 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_32.c new file mode 100644 index 000000000..e92e4da19 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_4.c new file mode 100644 index 000000000..7d0e3a507 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_6.c new file mode 100644 index 000000000..d8af5ec37 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_8.c new file mode 100644 index 000000000..0a2854e69 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cbdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cbdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_10.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_10.c new file mode 100644 index 000000000..79b5e8cdd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_10.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_10.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_12.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_12.c new file mode 100644 index 000000000..bf38c33ce --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_12.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_12.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_16.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_16.c new file mode 100644 index 000000000..f16096c35 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_16.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_16.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_2.c new file mode 100644 index 000000000..66f1f12e0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_2.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_2.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_20.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_20.c new file mode 100644 index 000000000..7cb1b00ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_20.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_20.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_32.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_32.c new file mode 100644 index 000000000..7348c5757 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_32.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_32.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_4.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_4.c new file mode 100644 index 000000000..e9e52dff1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_4.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_4.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_6.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_6.c new file mode 100644 index 000000000..ed0fd375f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_6.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_6.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_8.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_8.c new file mode 100644 index 000000000..0482d0e8e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/simd/vsx/hc2cfdftv_8.c @@ -0,0 +1,3 @@ +/* Generated automatically. DO NOT EDIT! */ +#define SIMD_HEADER "simd-support/simd-vsx.h" +#include "../common/hc2cfdftv_8.c" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/solve.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/solve.c new file mode 100644 index 000000000..4ad52fe68 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/solve.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +/* use the apply() operation for RDFT problems */ +void X(rdft_solve)(const plan *ego_, const problem *p_) +{ + const plan_rdft *ego = (const plan_rdft *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + ego->apply(ego_, UNTAINT(p->I), UNTAINT(p->O)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/solve2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/solve2.c new file mode 100644 index 000000000..e1ef840d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/solve2.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "rdft/rdft.h" + +/* use the apply() operation for RDFT2 problems */ +void X(rdft2_solve)(const plan *ego_, const problem *p_) +{ + const plan_rdft2 *ego = (const plan_rdft2 *) ego_; + const problem_rdft2 *p = (const problem_rdft2 *) p_; + ego->apply(ego_, + UNTAINT(p->r0), UNTAINT(p->r1), + UNTAINT(p->cr), UNTAINT(p->ci)); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank-geq1-rdft2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank-geq1-rdft2.c new file mode 100644 index 000000000..4570205d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank-geq1-rdft2.c @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +/* Plans for handling vector transform loops. These are *just* the + loops, and rely on child plans for the actual RDFT2s. + + They form a wrapper around solvers that don't have apply functions + for non-null vectors. + + vrank-geq1-rdft2 plans also recursively handle the case of + multi-dimensional vectors, obviating the need for most solvers to + deal with this. We can also play games here, such as reordering + the vector loops. + + Each vrank-geq1-rdft2 plan reduces the vector rank by 1, picking out a + dimension determined by the vecloop_dim field of the solver. */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + int vecloop_dim; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_rdft2 super; + + plan *cld; + INT vl; + INT rvs, cvs; + const S *solver; +} P; + +static void apply(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + INT i, vl = ego->vl; + INT rvs = ego->rvs, cvs = ego->cvs; + rdft2apply cldapply = ((plan_rdft2 *) ego->cld)->apply; + + for (i = 0; i < vl; ++i) { + cldapply(ego->cld, r0 + i * rvs, r1 + i * rvs, + cr + i * cvs, ci + i * cvs); + } +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + p->print(p, "(rdft2-vrank>=1-x%D/%d%(%p%))", + ego->vl, s->vecloop_dim, ego->cld); +} + +static int pickdim(const S *ego, const tensor *vecsz, int oop, int *dp) +{ + return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies, + vecsz, oop, dp); +} + +static int applicable0(const solver *ego_, const problem *p_, int *dp) +{ + const S *ego = (const S *) ego_; + const problem_rdft2 *p = (const problem_rdft2 *) p_; + if (FINITE_RNK(p->vecsz->rnk) + && p->vecsz->rnk > 0 + && pickdim(ego, p->vecsz, p->r0 != p->cr, dp)) { + if (p->r0 != p->cr) + return 1; /* can always operate out-of-place */ + + return(X(rdft2_inplace_strides)(p, *dp)); + } + + return 0; +} + + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *)ego_; + if (!applicable0(ego_, p_, dp)) return 0; + + /* fftw2 behavior */ + if (NO_VRANK_SPLITSP(plnr) && (ego->vecloop_dim != ego->buddies[0])) + return 0; + + if (NO_UGLYP(plnr)) { + const problem_rdft2 *p = (const problem_rdft2 *) p_; + iodim *d = p->vecsz->dims + *dp; + + /* Heuristic: if the transform is multi-dimensional, and the + vector stride is less than the transform size, then we + probably want to use a rank>=2 plan first in order to combine + this vector with the transform-dimension vectors. */ + if (p->sz->rnk > 1 + && X(imin)(X(iabs)(d->is), X(iabs)(d->os)) + < X(rdft2_tensor_max_index)(p->sz, p->kind) + ) + return 0; + + /* Heuristic: don't use a vrank-geq1 for rank-0 vrank-1 + transforms, since this case is better handled by rank-0 + solvers. */ + if (p->sz->rnk == 0 && p->vecsz->rnk == 1) return 0; + + if (NO_NONTHREADEDP(plnr)) + return 0; /* prefer threaded version */ + } + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft2 *p; + P *pln; + plan *cld; + int vdim; + iodim *d; + INT rvs, cvs; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &vdim)) + return (plan *) 0; + p = (const problem_rdft2 *) p_; + + d = p->vecsz->dims + vdim; + + A(d->n > 1); /* or else, p->ri + d->is etc. are invalid */ + + X(rdft2_strides)(p->kind, d, &rvs, &cvs); + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft2_d)( + X(tensor_copy)(p->sz), + X(tensor_copy_except)(p->vecsz, vdim), + TAINT(p->r0, rvs), TAINT(p->r1, rvs), + TAINT(p->cr, cvs), TAINT(p->ci, cvs), + p->kind)); + if (!cld) return (plan *) 0; + + pln = MKPLAN_RDFT2(P, &padt, apply); + + pln->cld = cld; + pln->vl = d->n; + pln->rvs = rvs; + pln->cvs = cvs; + + pln->solver = ego; + X(ops_zero)(&pln->super.super.ops); + pln->super.super.ops.other = 3.14159; /* magic to prefer codelet loops */ + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + if (p->sz->rnk != 1 || (p->sz->dims[0].n > 128)) + pln->super.super.pcost = pln->vl * cld->pcost; + + return &(pln->super.super); +} + +static solver *mksolver(int vecloop_dim, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->vecloop_dim = vecloop_dim; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(rdft2_vrank_geq1_register)(planner *p) +{ + /* FIXME: Should we try other vecloop_dim values? */ + static const int buddies[] = { 1, -1 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank-geq1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank-geq1.c new file mode 100644 index 000000000..ff4db6f58 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank-geq1.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +/* Plans for handling vector transform loops. These are *just* the + loops, and rely on child plans for the actual RDFTs. + + They form a wrapper around solvers that don't have apply functions + for non-null vectors. + + vrank-geq1 plans also recursively handle the case of multi-dimensional + vectors, obviating the need for most solvers to deal with this. We + can also play games here, such as reordering the vector loops. + + Each vrank-geq1 plan reduces the vector rank by 1, picking out a + dimension determined by the vecloop_dim field of the solver. */ + +#include "rdft/rdft.h" + +typedef struct { + solver super; + int vecloop_dim; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_rdft super; + + plan *cld; + INT vl; + INT ivs, ovs; + const S *solver; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT i, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + rdftapply cldapply = ((plan_rdft *) ego->cld)->apply; + + for (i = 0; i < vl; ++i) { + cldapply(ego->cld, I + i * ivs, O + i * ovs); + } +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + p->print(p, "(rdft-vrank>=1-x%D/%d%(%p%))", + ego->vl, s->vecloop_dim, ego->cld); +} + +static int pickdim(const S *ego, const tensor *vecsz, int oop, int *dp) +{ + return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies, + vecsz, oop, dp); +} + +static int applicable0(const solver *ego_, const problem *p_, int *dp) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + + return (1 + && FINITE_RNK(p->vecsz->rnk) + && p->vecsz->rnk > 0 + + && p->sz->rnk >= 0 + + && pickdim(ego, p->vecsz, p->I != p->O, dp) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *)ego_; + const problem_rdft *p; + + if (!applicable0(ego_, p_, dp)) return 0; + + /* fftw2 behavior */ + if (NO_VRANK_SPLITSP(plnr) && (ego->vecloop_dim != ego->buddies[0])) + return 0; + + p = (const problem_rdft *) p_; + + if (NO_UGLYP(plnr)) { + /* the rank-0 solver deals with the general case most of the + time (an exception is loops of non-square transposes) */ + if (NO_SLOWP(plnr) && p->sz->rnk == 0) + return 0; + + /* Heuristic: if the transform is multi-dimensional, and the + vector stride is less than the transform size, then we + probably want to use a rank>=2 plan first in order to combine + this vector with the transform-dimension vectors. */ + { + iodim *d = p->vecsz->dims + *dp; + if (1 + && p->sz->rnk > 1 + && X(imin)(X(iabs)(d->is), X(iabs)(d->os)) + < X(tensor_max_index)(p->sz) + ) + return 0; + } + + /* prefer threaded version */ + if (NO_NONTHREADEDP(plnr)) return 0; + + /* exploit built-in vecloops of (ugly) r{e,o}dft solvers */ + if (p->vecsz->rnk == 1 && p->sz->rnk == 1 + && REODFT_KINDP(p->kind[0])) + return 0; + } + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p; + P *pln; + plan *cld; + int vdim; + iodim *d; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &vdim)) + return (plan *) 0; + p = (const problem_rdft *) p_; + + d = p->vecsz->dims + vdim; + + A(d->n > 1); + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(tensor_copy)(p->sz), + X(tensor_copy_except)(p->vecsz, vdim), + TAINT(p->I, d->is), TAINT(p->O, d->os), + p->kind)); + if (!cld) return (plan *) 0; + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->cld = cld; + pln->vl = d->n; + pln->ivs = d->is; + pln->ovs = d->os; + + pln->solver = ego; + X(ops_zero)(&pln->super.super.ops); + pln->super.super.ops.other = 3.14159; /* magic to prefer codelet loops */ + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + if (p->sz->rnk != 1 || (p->sz->dims[0].n > 128)) + pln->super.super.pcost = pln->vl * cld->pcost; + + return &(pln->super.super); +} + +static solver *mksolver(int vecloop_dim, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->vecloop_dim = vecloop_dim; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(rdft_vrank_geq1_register)(planner *p) +{ + /* FIXME: Should we try other vecloop_dim values? */ + static const int buddies[] = { 1, -1 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank3-transpose.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank3-transpose.c new file mode 100644 index 000000000..62d7d479c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/rdft/vrank3-transpose.c @@ -0,0 +1,777 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* rank-0, vector-rank-3, non-square in-place transposition + (see rank0.c for square transposition) */ + +#include "rdft/rdft.h" + +#ifdef HAVE_STRING_H +#include /* for memcpy() */ +#endif + +struct P_s; + +typedef struct { + rdftapply apply; + int (*applicable)(const problem_rdft *p, planner *plnr, + int dim0, int dim1, int dim2, INT *nbuf); + int (*mkcldrn)(const problem_rdft *p, planner *plnr, struct P_s *ego); + const char *nam; +} transpose_adt; + +typedef struct { + solver super; + const transpose_adt *adt; +} S; + +typedef struct P_s { + plan_rdft super; + INT n, m, vl; /* transpose n x m matrix of vl-tuples */ + INT nbuf; /* buffer size */ + INT nd, md, d; /* transpose-gcd params */ + INT nc, mc; /* transpose-cut params */ + plan *cld1, *cld2, *cld3; /* children, null if unused */ + const S *slv; +} P; + + +/*************************************************************************/ +/* some utilities for the solvers */ + +static INT gcd(INT a, INT b) +{ + INT r; + do { + r = a % b; + a = b; + b = r; + } while (r != 0); + + return a; +} + +/* whether we can transpose with one of our routines expecting + contiguous Ntuples */ +static int Ntuple_transposable(const iodim *a, const iodim *b, INT vl, INT vs) +{ + return (vs == 1 && b->is == vl && a->os == vl && + ((a->n == b->n && a->is == b->os + && a->is >= b->n && a->is % vl == 0) + || (a->is == b->n * vl && b->os == a->n * vl))); +} + +/* check whether a and b correspond to the first and second dimensions + of a transpose of tuples with vector length = vl, stride = vs. */ +static int transposable(const iodim *a, const iodim *b, INT vl, INT vs) +{ + return ((a->n == b->n && a->os == b->is && a->is == b->os) + || Ntuple_transposable(a, b, vl, vs)); +} + +static int pickdim(const tensor *s, int *pdim0, int *pdim1, int *pdim2) +{ + int dim0, dim1; + + for (dim0 = 0; dim0 < s->rnk; ++dim0) + for (dim1 = 0; dim1 < s->rnk; ++dim1) { + int dim2 = 3 - dim0 - dim1; + if (dim0 == dim1) continue; + if ((s->rnk == 2 || s->dims[dim2].is == s->dims[dim2].os) + && transposable(s->dims + dim0, s->dims + dim1, + s->rnk == 2 ? (INT)1 : s->dims[dim2].n, + s->rnk == 2 ? (INT)1 : s->dims[dim2].is)) { + *pdim0 = dim0; + *pdim1 = dim1; + *pdim2 = dim2; + return 1; + } + } + return 0; +} + +#define MINBUFDIV 9 /* min factor by which buffer is smaller than data */ +#define MAXBUF 65536 /* maximum non-ugly buffer */ + +/* generic applicability function */ +static int applicable(const solver *ego_, const problem *p_, planner *plnr, + int *dim0, int *dim1, int *dim2, INT *nbuf) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + + return (1 + && p->I == p->O + && p->sz->rnk == 0 + && (p->vecsz->rnk == 2 || p->vecsz->rnk == 3) + + && pickdim(p->vecsz, dim0, dim1, dim2) + + /* UGLY if vecloop in wrong order for locality */ + && (!NO_UGLYP(plnr) || + p->vecsz->rnk == 2 || + X(iabs)(p->vecsz->dims[*dim2].is) + < X(imax)(X(iabs)(p->vecsz->dims[*dim0].is), + X(iabs)(p->vecsz->dims[*dim0].os))) + + /* SLOW if non-square */ + && (!NO_SLOWP(plnr) + || p->vecsz->dims[*dim0].n == p->vecsz->dims[*dim1].n) + + && ego->adt->applicable(p, plnr, *dim0,*dim1,*dim2,nbuf) + + /* buffers too big are UGLY */ + && ((!NO_UGLYP(plnr) && !CONSERVE_MEMORYP(plnr)) + || *nbuf <= MAXBUF + || *nbuf * MINBUFDIV <= X(tensor_sz)(p->vecsz)) + ); +} + +static void get_transpose_vec(const problem_rdft *p, int dim2, INT *vl,INT *vs) +{ + if (p->vecsz->rnk == 2) { + *vl = 1; *vs = 1; + } + else { + *vl = p->vecsz->dims[dim2].n; + *vs = p->vecsz->dims[dim2].is; /* == os */ + } +} + +/*************************************************************************/ +/* Cache-oblivious in-place transpose of non-square matrices, based + on transposes of blocks given by the gcd of the dimensions. + + This algorithm is related to algorithm V5 from Murray Dow, + "Transposing a matrix on a vector computer," Parallel Computing 21 + (12), 1997-2005 (1995), with the modification that we use + cache-oblivious recursive transpose subroutines (and we derived + it independently). + + For a p x q matrix, this requires scratch space equal to the size + of the matrix divided by gcd(p,q). Alternatively, see also the + "cut" algorithm below, if |p-q| * gcd(p,q) < max(p,q). */ + +static void apply_gcd(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT n = ego->nd, m = ego->md, d = ego->d; + INT vl = ego->vl; + R *buf = (R *)MALLOC(sizeof(R) * ego->nbuf, BUFFERS); + INT i, num_el = n*m*d*vl; + + A(ego->n == n * d && ego->m == m * d); + UNUSED(O); + + /* Transpose the matrix I in-place, where I is an (n*d) x (m*d) matrix + of vl-tuples and buf contains n*m*d*vl elements. + + In general, to transpose a p x q matrix, you should call this + routine with d = gcd(p, q), n = p/d, and m = q/d. */ + + A(n > 0 && m > 0 && vl > 0); + A(d > 1); + + /* treat as (d x n) x (d' x m) matrix. (d' = d) */ + + /* First, transpose d x (n x d') x m to d x (d' x n) x m, + using the buf matrix. This consists of d transposes + of contiguous n x d' matrices of m-tuples. */ + if (n > 1) { + rdftapply cldapply = ((plan_rdft *) ego->cld1)->apply; + for (i = 0; i < d; ++i) { + cldapply(ego->cld1, I + i*num_el, buf); + memcpy(I + i*num_el, buf, num_el*sizeof(R)); + } + } + + /* Now, transpose (d x d') x (n x m) to (d' x d) x (n x m), which + is a square in-place transpose of n*m-tuples: */ + { + rdftapply cldapply = ((plan_rdft *) ego->cld2)->apply; + cldapply(ego->cld2, I, I); + } + + /* Finally, transpose d' x ((d x n) x m) to d' x (m x (d x n)), + using the buf matrix. This consists of d' transposes + of contiguous d*n x m matrices. */ + if (m > 1) { + rdftapply cldapply = ((plan_rdft *) ego->cld3)->apply; + for (i = 0; i < d; ++i) { + cldapply(ego->cld3, I + i*num_el, buf); + memcpy(I + i*num_el, buf, num_el*sizeof(R)); + } + } + + X(ifree)(buf); +} + +static int applicable_gcd(const problem_rdft *p, planner *plnr, + int dim0, int dim1, int dim2, INT *nbuf) +{ + INT n = p->vecsz->dims[dim0].n; + INT m = p->vecsz->dims[dim1].n; + INT d, vl, vs; + get_transpose_vec(p, dim2, &vl, &vs); + d = gcd(n, m); + *nbuf = n * (m / d) * vl; + return (!NO_SLOWP(plnr) /* FIXME: not really SLOW for large 1d ffts */ + && n != m + && d > 1 + && Ntuple_transposable(p->vecsz->dims + dim0, + p->vecsz->dims + dim1, + vl, vs)); +} + +static int mkcldrn_gcd(const problem_rdft *p, planner *plnr, P *ego) +{ + INT n = ego->nd, m = ego->md, d = ego->d; + INT vl = ego->vl; + R *buf = (R *)MALLOC(sizeof(R) * ego->nbuf, BUFFERS); + INT num_el = n*m*d*vl; + + if (n > 1) { + ego->cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d)(n, d*m*vl, m*vl, + d, m*vl, n*m*vl, + m*vl, 1, 1), + TAINT(p->I, num_el), buf)); + if (!ego->cld1) + goto nada; + X(ops_madd)(d, &ego->cld1->ops, &ego->super.super.ops, + &ego->super.super.ops); + ego->super.super.ops.other += num_el * d * 2; + } + + ego->cld2 = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d)(d, d*n*m*vl, n*m*vl, + d, n*m*vl, d*n*m*vl, + n*m*vl, 1, 1), + p->I, p->I)); + if (!ego->cld2) + goto nada; + X(ops_add2)(&ego->cld2->ops, &ego->super.super.ops); + + if (m > 1) { + ego->cld3 = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d)(d*n, m*vl, vl, + m, vl, d*n*vl, + vl, 1, 1), + TAINT(p->I, num_el), buf)); + if (!ego->cld3) + goto nada; + X(ops_madd2)(d, &ego->cld3->ops, &ego->super.super.ops); + ego->super.super.ops.other += num_el * d * 2; + } + + X(ifree)(buf); + return 1; + + nada: + X(ifree)(buf); + return 0; +} + +static const transpose_adt adt_gcd = +{ + apply_gcd, applicable_gcd, mkcldrn_gcd, + "rdft-transpose-gcd" +}; + +/*************************************************************************/ +/* Cache-oblivious in-place transpose of non-square n x m matrices, + based on transposing a sub-matrix first and then transposing the + remainder(s) with the help of a buffer. See also transpose-gcd, + above, if gcd(n,m) is large. + + This algorithm is related to algorithm V3 from Murray Dow, + "Transposing a matrix on a vector computer," Parallel Computing 21 + (12), 1997-2005 (1995), with the modifications that we use + cache-oblivious recursive transpose subroutines and we have the + generalization for large |n-m| below. + + The best case, and the one described by Dow, is for |n-m| small, in + which case we transpose a square sub-matrix of size min(n,m), + handling the remainder via a buffer. This requires scratch space + equal to the size of the matrix times |n-m| / max(n,m). + + As a generalization when |n-m| is not small, we also support cutting + *both* dimensions to an nc x mc matrix which is *not* necessarily + square, but has a large gcd (and can therefore use transpose-gcd). +*/ + +static void apply_cut(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT n = ego->n, m = ego->m, nc = ego->nc, mc = ego->mc, vl = ego->vl; + INT i; + R *buf1 = (R *)MALLOC(sizeof(R) * ego->nbuf, BUFFERS); + UNUSED(O); + + if (m > mc) { + ((plan_rdft *) ego->cld1)->apply(ego->cld1, I + mc*vl, buf1); + for (i = 0; i < nc; ++i) + memmove(I + (mc*vl) * i, I + (m*vl) * i, sizeof(R) * (mc*vl)); + } + + ((plan_rdft *) ego->cld2)->apply(ego->cld2, I, I); /* nc x mc transpose */ + + if (n > nc) { + R *buf2 = buf1 + (m-mc)*(nc*vl); /* FIXME: force better alignment? */ + memcpy(buf2, I + nc*(m*vl), (n-nc)*(m*vl)*sizeof(R)); + for (i = mc-1; i >= 0; --i) + memmove(I + (n*vl) * i, I + (nc*vl) * i, sizeof(R) * (n*vl)); + ((plan_rdft *) ego->cld3)->apply(ego->cld3, buf2, I + nc*vl); + } + + if (m > mc) { + if (n > nc) + for (i = mc; i < m; ++i) + memcpy(I + i*(n*vl), buf1 + (i-mc)*(nc*vl), + (nc*vl)*sizeof(R)); + else + memcpy(I + mc*(n*vl), buf1, (m-mc)*(n*vl)*sizeof(R)); + } + + X(ifree)(buf1); +} + +/* only cut one dimension if the resulting buffer is small enough */ +static int cut1(INT n, INT m, INT vl) +{ + return (X(imax)(n,m) >= X(iabs)(n-m) * MINBUFDIV + || X(imin)(n,m) * X(iabs)(n-m) * vl <= MAXBUF); +} + +#define CUT_NSRCH 32 /* range of sizes to search for possible cuts */ + +static int applicable_cut(const problem_rdft *p, planner *plnr, + int dim0, int dim1, int dim2, INT *nbuf) +{ + INT n = p->vecsz->dims[dim0].n; + INT m = p->vecsz->dims[dim1].n; + INT vl, vs; + get_transpose_vec(p, dim2, &vl, &vs); + *nbuf = 0; /* always small enough to be non-UGLY (?) */ + A(MINBUFDIV <= CUT_NSRCH); /* assumed to avoid inf. loops below */ + return (!NO_SLOWP(plnr) /* FIXME: not really SLOW for large 1d ffts? */ + && n != m + + /* Don't call transpose-cut recursively (avoid inf. loops): + the non-square sub-transpose produced when !cut1 + should always have gcd(n,m) >= min(CUT_NSRCH,n,m), + for which transpose-gcd is applicable */ + && (cut1(n, m, vl) + || gcd(n, m) < X(imin)(MINBUFDIV, X(imin)(n,m))) + + && Ntuple_transposable(p->vecsz->dims + dim0, + p->vecsz->dims + dim1, + vl, vs)); +} + +static int mkcldrn_cut(const problem_rdft *p, planner *plnr, P *ego) +{ + INT n = ego->n, m = ego->m, nc, mc; + INT vl = ego->vl; + R *buf; + + /* pick the "best" cut */ + if (cut1(n, m, vl)) { + nc = mc = X(imin)(n,m); + } + else { + INT dc, ns, ms; + dc = gcd(m, n); nc = n; mc = m; + /* search for cut with largest gcd + (TODO: different optimality criteria? different search range?) */ + for (ms = m; ms > 0 && ms > m - CUT_NSRCH; --ms) { + for (ns = n; ns > 0 && ns > n - CUT_NSRCH; --ns) { + INT ds = gcd(ms, ns); + if (ds > dc) { + dc = ds; nc = ns; mc = ms; + if (dc == X(imin)(ns, ms)) + break; /* cannot get larger than this */ + } + } + if (dc == X(imin)(n, ms)) + break; /* cannot get larger than this */ + } + A(dc >= X(imin)(CUT_NSRCH, X(imin)(n, m))); + } + ego->nc = nc; + ego->mc = mc; + ego->nbuf = (m-mc)*(nc*vl) + (n-nc)*(m*vl); + + buf = (R *)MALLOC(sizeof(R) * ego->nbuf, BUFFERS); + + if (m > mc) { + ego->cld1 = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d)(nc, m*vl, vl, + m-mc, vl, nc*vl, + vl, 1, 1), + p->I + mc*vl, buf)); + if (!ego->cld1) + goto nada; + X(ops_add2)(&ego->cld1->ops, &ego->super.super.ops); + } + + ego->cld2 = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d)(nc, mc*vl, vl, + mc, vl, nc*vl, + vl, 1, 1), + p->I, p->I)); + if (!ego->cld2) + goto nada; + X(ops_add2)(&ego->cld2->ops, &ego->super.super.ops); + + if (n > nc) { + ego->cld3 = X(mkplan_d)(plnr, + X(mkproblem_rdft_0_d)( + X(mktensor_3d)(n-nc, m*vl, vl, + m, vl, n*vl, + vl, 1, 1), + buf + (m-mc)*(nc*vl), p->I + nc*vl)); + if (!ego->cld3) + goto nada; + X(ops_add2)(&ego->cld3->ops, &ego->super.super.ops); + } + + /* memcpy/memmove operations */ + ego->super.super.ops.other += 2 * vl * (nc*mc * ((m > mc) + (n > nc)) + + (n-nc)*m + (m-mc)*nc); + + X(ifree)(buf); + return 1; + + nada: + X(ifree)(buf); + return 0; +} + +static const transpose_adt adt_cut = +{ + apply_cut, applicable_cut, mkcldrn_cut, + "rdft-transpose-cut" +}; + +/*************************************************************************/ +/* In-place transpose routine from TOMS, which follows the cycles of + the permutation so that it writes to each location only once. + Because of cache-line and other issues, however, this routine is + typically much slower than transpose-gcd or transpose-cut, even + though the latter do some extra writes. On the other hand, if the + vector length is large then the TOMS routine is best. + + The TOMS routine also has the advantage of requiring less buffer + space for the case of gcd(nx,ny) small. However, in this case it + has been superseded by the combination of the generalized + transpose-cut method with the transpose-gcd method, which can + always transpose with buffers a small fraction of the array size + regardless of gcd(nx,ny). */ + +/* + * TOMS Transpose. Algorithm 513 (Revised version of algorithm 380). + * + * These routines do in-place transposes of arrays. + * + * [ Cate, E.G. and Twigg, D.W., ACM Transactions on Mathematical Software, + * vol. 3, no. 1, 104-110 (1977) ] + * + * C version by Steven G. Johnson (February 1997). + */ + +/* + * "a" is a 1D array of length ny*nx*N which constains the nx x ny + * matrix of N-tuples to be transposed. "a" is stored in row-major + * order (last index varies fastest). move is a 1D array of length + * move_size used to store information to speed up the process. The + * value move_size=(ny+nx)/2 is recommended. buf should be an array + * of length 2*N. + * + */ + +static void transpose_toms513(R *a, INT nx, INT ny, INT N, + char *move, INT move_size, R *buf) +{ + INT i, im, mn; + R *b, *c, *d; + INT ncount; + INT k; + + /* check arguments and initialize: */ + A(ny > 0 && nx > 0 && N > 0 && move_size > 0); + + b = buf; + + /* Cate & Twigg have a special case for nx == ny, but we don't + bother, since we already have special code for this case elsewhere. */ + + c = buf + N; + ncount = 2; /* always at least 2 fixed points */ + k = (mn = ny * nx) - 1; + + for (i = 0; i < move_size; ++i) + move[i] = 0; + + if (ny >= 3 && nx >= 3) + ncount += gcd(ny - 1, nx - 1) - 1; /* # fixed points */ + + i = 1; + im = ny; + + while (1) { + INT i1, i2, i1c, i2c; + INT kmi; + + /** Rearrange the elements of a loop + and its companion loop: **/ + + i1 = i; + kmi = k - i; + i1c = kmi; + switch (N) { + case 1: + b[0] = a[i1]; + c[0] = a[i1c]; + break; + case 2: + b[0] = a[2*i1]; + b[1] = a[2*i1+1]; + c[0] = a[2*i1c]; + c[1] = a[2*i1c+1]; + break; + default: + memcpy(b, &a[N * i1], N * sizeof(R)); + memcpy(c, &a[N * i1c], N * sizeof(R)); + } + while (1) { + i2 = ny * i1 - k * (i1 / nx); + i2c = k - i2; + if (i1 < move_size) + move[i1] = 1; + if (i1c < move_size) + move[i1c] = 1; + ncount += 2; + if (i2 == i) + break; + if (i2 == kmi) { + d = b; + b = c; + c = d; + break; + } + switch (N) { + case 1: + a[i1] = a[i2]; + a[i1c] = a[i2c]; + break; + case 2: + a[2*i1] = a[2*i2]; + a[2*i1+1] = a[2*i2+1]; + a[2*i1c] = a[2*i2c]; + a[2*i1c+1] = a[2*i2c+1]; + break; + default: + memcpy(&a[N * i1], &a[N * i2], + N * sizeof(R)); + memcpy(&a[N * i1c], &a[N * i2c], + N * sizeof(R)); + } + i1 = i2; + i1c = i2c; + } + switch (N) { + case 1: + a[i1] = b[0]; + a[i1c] = c[0]; + break; + case 2: + a[2*i1] = b[0]; + a[2*i1+1] = b[1]; + a[2*i1c] = c[0]; + a[2*i1c+1] = c[1]; + break; + default: + memcpy(&a[N * i1], b, N * sizeof(R)); + memcpy(&a[N * i1c], c, N * sizeof(R)); + } + if (ncount >= mn) + break; /* we've moved all elements */ + + /** Search for loops to rearrange: **/ + + while (1) { + INT max = k - i; + ++i; + A(i <= max); + im += ny; + if (im > k) + im -= k; + i2 = im; + if (i == i2) + continue; + if (i >= move_size) { + while (i2 > i && i2 < max) { + i1 = i2; + i2 = ny * i1 - k * (i1 / nx); + } + if (i2 == i) + break; + } else if (!move[i]) + break; + } + } +} + +static void apply_toms513(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT n = ego->n, m = ego->m; + INT vl = ego->vl; + R *buf = (R *)MALLOC(sizeof(R) * ego->nbuf, BUFFERS); + UNUSED(O); + transpose_toms513(I, n, m, vl, (char *) (buf + 2*vl), (n+m)/2, buf); + X(ifree)(buf); +} + +static int applicable_toms513(const problem_rdft *p, planner *plnr, + int dim0, int dim1, int dim2, INT *nbuf) +{ + INT n = p->vecsz->dims[dim0].n; + INT m = p->vecsz->dims[dim1].n; + INT vl, vs; + get_transpose_vec(p, dim2, &vl, &vs); + *nbuf = 2*vl + + ((n + m) / 2 * sizeof(char) + sizeof(R) - 1) / sizeof(R); + return (!NO_SLOWP(plnr) + && (vl > 8 || !NO_UGLYP(plnr)) /* UGLY for small vl */ + && n != m + && Ntuple_transposable(p->vecsz->dims + dim0, + p->vecsz->dims + dim1, + vl, vs)); +} + +static int mkcldrn_toms513(const problem_rdft *p, planner *plnr, P *ego) +{ + UNUSED(p); UNUSED(plnr); + /* heuristic so that TOMS algorithm is last resort for small vl */ + ego->super.super.ops.other += ego->n * ego->m * 2 * (ego->vl + 30); + return 1; +} + +static const transpose_adt adt_toms513 = +{ + apply_toms513, applicable_toms513, mkcldrn_toms513, + "rdft-transpose-toms513" +}; + +/*-----------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------*/ +/* generic stuff: */ + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld1, wakefulness); + X(plan_awake)(ego->cld2, wakefulness); + X(plan_awake)(ego->cld3, wakefulness); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(%s-%Dx%D%v", ego->slv->adt->nam, + ego->n, ego->m, ego->vl); + if (ego->cld1) p->print(p, "%(%p%)", ego->cld1); + if (ego->cld2) p->print(p, "%(%p%)", ego->cld2); + if (ego->cld3) p->print(p, "%(%p%)", ego->cld3); + p->print(p, ")"); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld3); + X(plan_destroy_internal)(ego->cld2); + X(plan_destroy_internal)(ego->cld1); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p; + int dim0, dim1, dim2; + INT nbuf, vs; + P *pln; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &dim0, &dim1, &dim2, &nbuf)) + return (plan *) 0; + + p = (const problem_rdft *) p_; + pln = MKPLAN_RDFT(P, &padt, ego->adt->apply); + + pln->n = p->vecsz->dims[dim0].n; + pln->m = p->vecsz->dims[dim1].n; + get_transpose_vec(p, dim2, &pln->vl, &vs); + pln->nbuf = nbuf; + pln->d = gcd(pln->n, pln->m); + pln->nd = pln->n / pln->d; + pln->md = pln->m / pln->d; + pln->slv = ego; + + X(ops_zero)(&pln->super.super.ops); /* mkcldrn is responsible for ops */ + + pln->cld1 = pln->cld2 = pln->cld3 = 0; + if (!ego->adt->mkcldrn(p, plnr, pln)) { + X(plan_destroy_internal)(&(pln->super.super)); + return 0; + } + + return &(pln->super.super); +} + +static solver *mksolver(const transpose_adt *adt) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->adt = adt; + return &(slv->super); +} + +void X(rdft_vrank3_transpose_register)(planner *p) +{ + unsigned i; + static const transpose_adt *const adts[] = { + &adt_gcd, &adt_cut, + &adt_toms513 + }; + for (i = 0; i < sizeof(adts) / sizeof(adts[0]); ++i) + REGISTER_SOLVER(p, mksolver(adts[i])); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/Makefile.am new file mode 100644 index 000000000..d174a6e6b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/Makefile.am @@ -0,0 +1,12 @@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = + +noinst_LTLIBRARIES = libreodft.la + +# no longer used due to numerical problems +EXTRA_DIST = reodft11e-r2hc.c redft00e-r2hc.c rodft00e-r2hc.c + +libreodft_la_SOURCES = conf.c reodft.h reodft010e-r2hc.c \ +reodft11e-radix2.c reodft11e-r2hc-odd.c redft00e-r2hc-pad.c \ +rodft00e-r2hc-pad.c reodft00e-splitradix.c +# redft00e-r2hc.c rodft00e-r2hc.c reodft11e-r2hc.c diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/Makefile.in new file mode 100644 index 000000000..a1e3c71bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/Makefile.in @@ -0,0 +1,759 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = reodft +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libreodft_la_LIBADD = +am_libreodft_la_OBJECTS = conf.lo reodft010e-r2hc.lo \ + reodft11e-radix2.lo reodft11e-r2hc-odd.lo redft00e-r2hc-pad.lo \ + rodft00e-r2hc-pad.lo reodft00e-splitradix.lo +libreodft_la_OBJECTS = $(am_libreodft_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libreodft_la_SOURCES) +DIST_SOURCES = $(libreodft_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +SUBDIRS = +noinst_LTLIBRARIES = libreodft.la + +# no longer used due to numerical problems +EXTRA_DIST = reodft11e-r2hc.c redft00e-r2hc.c rodft00e-r2hc.c +libreodft_la_SOURCES = conf.c reodft.h reodft010e-r2hc.c \ +reodft11e-radix2.c reodft11e-r2hc-odd.c redft00e-r2hc-pad.c \ +rodft00e-r2hc-pad.c reodft00e-splitradix.c + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu reodft/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu reodft/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libreodft.la: $(libreodft_la_OBJECTS) $(libreodft_la_DEPENDENCIES) $(EXTRA_libreodft_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libreodft_la_OBJECTS) $(libreodft_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redft00e-r2hc-pad.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reodft00e-splitradix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reodft010e-r2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reodft11e-r2hc-odd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reodft11e-radix2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rodft00e-r2hc-pad.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + +# redft00e-r2hc.c rodft00e-r2hc.c reodft11e-r2hc.c + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/conf.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/conf.c new file mode 100644 index 000000000..908218f70 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/conf.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "reodft/reodft.h" + +static const solvtab s = +{ +#if 0 /* 1 to enable "standard" algorithms with substandard accuracy; + you must also add them to Makefile.am to compile these files*/ + SOLVTAB(X(redft00e_r2hc_register)), + SOLVTAB(X(rodft00e_r2hc_register)), + SOLVTAB(X(reodft11e_r2hc_register)), +#endif + SOLVTAB(X(redft00e_r2hc_pad_register)), + SOLVTAB(X(rodft00e_r2hc_pad_register)), + SOLVTAB(X(reodft00e_splitradix_register)), + SOLVTAB(X(reodft010e_r2hc_register)), + SOLVTAB(X(reodft11e_radix2_r2hc_register)), + SOLVTAB(X(reodft11e_r2hc_odd_register)), + + SOLVTAB_END +}; + +void X(reodft_conf_standard)(planner *p) +{ + X(solvtab_exec)(s, p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/redft00e-r2hc-pad.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/redft00e-r2hc-pad.c new file mode 100644 index 000000000..0a14943f2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/redft00e-r2hc-pad.c @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do a REDFT00 problem via an R2HC problem, padded symmetrically to + twice the size. This is asymptotically a factor of ~2 worse than + redft00e-r2hc.c (the algorithm used in e.g. FFTPACK and Numerical + Recipes), but we abandoned the latter after we discovered that it + has intrinsic accuracy problems. */ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld, *cldcpy; + INT is; + INT n; + INT vl; + INT ivs, ovs; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * (2*n), BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = I[0]; + for (i = 1; i < n; ++i) { + R a = I[i * is]; + buf[i] = a; + buf[2*n - i] = a; + } + buf[i] = I[i * is]; /* i == n, Nyquist */ + + /* r2hc transform of size 2*n */ + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + /* copy n+1 real numbers (real parts of hc array) from buf to O */ + { + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + cldcpy->apply((plan *) cldcpy, buf, O); + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldcpy, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldcpy); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(redft00e-r2hc-pad-%D%v%(%p%)%(%p%))", + ego->n + 1, ego->vl, ego->cld, ego->cldcpy); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->kind[0] == REDFT00 + && p->sz->dims[0].n > 1 /* n == 1 is not well-defined */ + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld = (plan *) 0, *cldcpy; + R *buf = (R *) 0; + INT n; + INT vl, ivs, ovs; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + goto nada; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n - 1; + A(n > 0); + buf = (R *) MALLOC(sizeof(R) * (2*n), BUFFERS); + + cld = X(mkplan_d)(plnr,X(mkproblem_rdft_1_d)(X(mktensor_1d)(2*n,1,1), + X(mktensor_0d)(), + buf, buf, R2HC)); + if (!cld) + goto nada; + + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + cldcpy = + X(mkplan_d)(plnr, + X(mkproblem_rdft_1_d)(X(mktensor_0d)(), + X(mktensor_1d)(n+1,1, + p->sz->dims[0].os), + buf, TAINT(p->O, ovs), R2HC)); + if (!cldcpy) + goto nada; + + X(ifree)(buf); + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->vl = vl; + pln->ivs = ivs; + pln->ovs = ovs; + + X(ops_zero)(&ops); + ops.other = n + 2*n; /* loads + stores (input -> buf) */ + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cldcpy->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(ifree0)(buf); + if (cld) + X(plan_destroy_internal)(cld); + return (plan *)0; +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(redft00e_r2hc_pad_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/redft00e-r2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/redft00e-r2hc.c new file mode 100644 index 000000000..4f0c10d08 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/redft00e-r2hc.c @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do a REDFT00 problem via an R2HC problem, with some pre/post-processing. + + This code uses the trick from FFTPACK, also documented in a similar + form by Numerical Recipes. Unfortunately, this algorithm seems to + have intrinsic numerical problems (similar to those in + reodft11e-r2hc.c), possibly due to the fact that it multiplies its + input by a cosine, causing a loss of precision near the zero. For + transforms of 16k points, it has already lost three or four decimal + places of accuracy, which we deem unacceptable. + + So, we have abandoned this algorithm in favor of the one in + redft00-r2hc-pad.c, which unfortunately sacrifices 30-50% in speed. + The only other alternative in the literature that does not have + similar numerical difficulties seems to be the direct adaptation of + the Cooley-Tukey decomposition for symmetric data, but this would + require a whole new set of codelets and it's not clear that it's + worth it at this point. However, we did implement the latter + algorithm for the specific case of odd n (logically adapting the + split-radix algorithm); see reodft00e-splitradix.c. */ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + twid *td; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *buf; + E csum; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = I[0] + I[is * n]; + csum = I[0] - I[is * n]; + for (i = 1; i < n - i; ++i) { + E a, b, apb, amb; + a = I[is * i]; + b = I[is * (n - i)]; + csum += W[2*i] * (amb = K(2.0)*(a - b)); + amb = W[2*i+1] * amb; + apb = (a + b); + buf[i] = apb - amb; + buf[n - i] = apb + amb; + } + if (i == n - i) { + buf[i] = K(2.0) * I[is * i]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + /* FIXME: use recursive/cascade summation for better stability? */ + O[0] = buf[0]; + O[os] = csum; + for (i = 1; i + i < n; ++i) { + INT k = i + i; + O[os * k] = buf[i]; + O[os * (k + 1)] = O[os * (k - 1)] - buf[n - i]; + } + if (i + i == n) { + O[os * n] = buf[i]; + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr redft00e_tw[] = { + { TW_COS, 0, 1 }, + { TW_SIN, 0, 1 }, + { TW_NEXT, 1, 0 } + }; + + X(plan_awake)(ego->cld, wakefulness); + X(twiddle_awake)(wakefulness, + &ego->td, redft00e_tw, 2*ego->n, 1, (ego->n+1)/2); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(redft00e-r2hc-%D%v%(%p%))", ego->n + 1, ego->vl, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->kind[0] == REDFT00 + && p->sz->dims[0].n > 1 /* n == 1 is not well-defined */ + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + R *buf; + INT n; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n - 1; + A(n > 0); + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + cld = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)(X(mktensor_1d)(n, 1, 1), + X(mktensor_0d)(), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cld) + return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + pln->td = 0; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.other = 8 + (n-1)/2 * 11 + (1 - n % 2) * 5; + ops.add = 2 + (n-1)/2 * 5; + ops.mul = (n-1)/2 * 3 + (1 - n % 2) * 1; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(redft00e_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft.h new file mode 100644 index 000000000..cd94a28c0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __REODFT_H__ +#define __REODFT_H__ + +#include "kernel/ifftw.h" +#include "rdft/rdft.h" + +#define REODFT_KINDP(k) ((k) >= REDFT00 && (k) <= RODFT11) + +void X(redft00e_r2hc_register)(planner *p); +void X(redft00e_r2hc_pad_register)(planner *p); +void X(rodft00e_r2hc_register)(planner *p); +void X(rodft00e_r2hc_pad_register)(planner *p); +void X(reodft00e_splitradix_register)(planner *p); +void X(reodft010e_r2hc_register)(planner *p); +void X(reodft11e_r2hc_register)(planner *p); +void X(reodft11e_radix2_r2hc_register)(planner *p); +void X(reodft11e_r2hc_odd_register)(planner *p); + +/* configurations */ +void X(reodft_conf_standard)(planner *p); + +#endif /* __REODFT_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft00e-splitradix.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft00e-splitradix.c new file mode 100644 index 000000000..1708e76db --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft00e-splitradix.c @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2005 Matteo Frigo + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do an R{E,O}DFT00 problem (of an odd length n) recursively via an + R{E,O}DFT00 problem and an RDFT problem of half the length. + + This works by "logically" expanding the array to a real-even/odd DFT of + length 2n-/+2 and then applying the split-radix algorithm. + + In this way, we can avoid having to pad to twice the length + (ala redft00-r2hc-pad), saving a factor of ~2 for n=2^m+/-1, + but don't incur the accuracy loss that the "ordinary" algorithm + sacrifices (ala redft00-r2hc.c). +*/ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *clde, *cldo; + twid *td; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; +} P; + +/* redft00 */ +static void apply_e(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, j, n = ego->n + 1, n2 = (n-1)/2; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W - 2; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n2, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + /* do size (n-1)/2 r2hc transform of odd-indexed elements + with stride 4, "wrapping around" end of array with even + boundary conditions */ + for (j = 0, i = 1; i < n; i += 4) + buf[j++] = I[is * i]; + for (i = 2*n-2-i; i > 0; i -= 4) + buf[j++] = I[is * i]; + { + plan_rdft *cld = (plan_rdft *) ego->cldo; + cld->apply((plan *) cld, buf, buf); + } + + /* do size (n+1)/2 redft00 of the even-indexed elements, + writing to O: */ + { + plan_rdft *cld = (plan_rdft *) ego->clde; + cld->apply((plan *) cld, I, O); + } + + /* combine the results with the twiddle factors to get output */ + { /* DC element */ + E b20 = O[0], b0 = K(2.0) * buf[0]; + O[0] = b20 + b0; + O[2*(n2*os)] = b20 - b0; + /* O[n2*os] = O[n2*os]; */ + } + for (i = 1; i < n2 - i; ++i) { + E ap, am, br, bi, wr, wi, wbr, wbi; + br = buf[i]; + bi = buf[n2 - i]; + wr = W[2*i]; + wi = W[2*i+1]; +#if FFT_SIGN == -1 + wbr = K(2.0) * (wr*br + wi*bi); + wbi = K(2.0) * (wr*bi - wi*br); +#else + wbr = K(2.0) * (wr*br - wi*bi); + wbi = K(2.0) * (wr*bi + wi*br); +#endif + ap = O[i*os]; + O[i*os] = ap + wbr; + O[(2*n2 - i)*os] = ap - wbr; + am = O[(n2 - i)*os]; +#if FFT_SIGN == -1 + O[(n2 - i)*os] = am - wbi; + O[(n2 + i)*os] = am + wbi; +#else + O[(n2 - i)*os] = am + wbi; + O[(n2 + i)*os] = am - wbi; +#endif + } + if (i == n2 - i) { /* Nyquist element */ + E ap, wbr; + wbr = K(2.0) * (W[2*i] * buf[i]); + ap = O[i*os]; + O[i*os] = ap + wbr; + O[(2*n2 - i)*os] = ap - wbr; + } + } + + X(ifree)(buf); +} + +/* rodft00 */ +static void apply_o(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, j, n = ego->n - 1, n2 = (n+1)/2; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W - 2; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n2, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + /* do size (n+1)/2 r2hc transform of even-indexed elements + with stride 4, "wrapping around" end of array with odd + boundary conditions */ + for (j = 0, i = 0; i < n; i += 4) + buf[j++] = I[is * i]; + for (i = 2*n-i; i > 0; i -= 4) + buf[j++] = -I[is * i]; + { + plan_rdft *cld = (plan_rdft *) ego->cldo; + cld->apply((plan *) cld, buf, buf); + } + + /* do size (n-1)/2 rodft00 of the odd-indexed elements, + writing to O: */ + { + plan_rdft *cld = (plan_rdft *) ego->clde; + if (I == O) { + /* can't use I+is and I, subplan would lose in-placeness */ + cld->apply((plan *) cld, I + is, I + is); + /* we could maybe avoid this copy by modifying the + twiddle loop, but currently I can't be bothered. */ + A(is >= os); + for (i = 0; i < n2-1; ++i) + O[os*i] = I[is*(i+1)]; + } + else + cld->apply((plan *) cld, I + is, O); + } + + /* combine the results with the twiddle factors to get output */ + O[(n2-1)*os] = K(2.0) * buf[0]; + for (i = 1; i < n2 - i; ++i) { + E ap, am, br, bi, wr, wi, wbr, wbi; + br = buf[i]; + bi = buf[n2 - i]; + wr = W[2*i]; + wi = W[2*i+1]; +#if FFT_SIGN == -1 + wbr = K(2.0) * (wr*br + wi*bi); + wbi = K(2.0) * (wi*br - wr*bi); +#else + wbr = K(2.0) * (wr*br - wi*bi); + wbi = K(2.0) * (wr*bi + wi*br); +#endif + ap = O[(i-1)*os]; + O[(i-1)*os] = wbi + ap; + O[(2*n2-1 - i)*os] = wbi - ap; + am = O[(n2-1 - i)*os]; +#if FFT_SIGN == -1 + O[(n2-1 - i)*os] = wbr + am; + O[(n2-1 + i)*os] = wbr - am; +#else + O[(n2-1 - i)*os] = wbr + am; + O[(n2-1 + i)*os] = wbr - am; +#endif + } + if (i == n2 - i) { /* Nyquist element */ + E ap, wbi; + wbi = K(2.0) * (W[2*i+1] * buf[i]); + ap = O[(i-1)*os]; + O[(i-1)*os] = wbi + ap; + O[(2*n2-1 - i)*os] = wbi - ap; + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr reodft00e_tw[] = { + { TW_COS, 1, 1 }, + { TW_SIN, 1, 1 }, + { TW_NEXT, 1, 0 } + }; + + X(plan_awake)(ego->clde, wakefulness); + X(plan_awake)(ego->cldo, wakefulness); + X(twiddle_awake)(wakefulness, &ego->td, reodft00e_tw, + 2*ego->n, 1, ego->n/4); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldo); + X(plan_destroy_internal)(ego->clde); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + if (ego->super.apply == apply_e) + p->print(p, "(redft00e-splitradix-%D%v%(%p%)%(%p%))", + ego->n + 1, ego->vl, ego->clde, ego->cldo); + else + p->print(p, "(rodft00e-splitradix-%D%v%(%p%)%(%p%))", + ego->n - 1, ego->vl, ego->clde, ego->cldo); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && (p->kind[0] == REDFT00 || p->kind[0] == RODFT00) + && p->sz->dims[0].n > 1 /* don't create size-0 sub-plans */ + && p->sz->dims[0].n % 2 /* odd: 4 divides "logical" DFT */ + && (p->I != p->O || p->vecsz->rnk == 0 + || p->vecsz->dims[0].is == p->vecsz->dims[0].os) + && (p->kind[0] != RODFT00 || p->I != p->O || + p->sz->dims[0].is >= p->sz->dims[0].os) /* laziness */ + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *clde, *cldo; + R *buf; + INT n, n0; + opcnt ops; + int inplace_odd; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = (n0 = p->sz->dims[0].n) + (p->kind[0] == REDFT00 ? (INT)-1 : (INT)1); + A(n > 0 && n % 2 == 0); + buf = (R *) MALLOC(sizeof(R) * (n/2), BUFFERS); + + inplace_odd = p->kind[0]==RODFT00 && p->I == p->O; + clde = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)( + X(mktensor_1d)(n0-n/2, 2*p->sz->dims[0].is, + inplace_odd ? p->sz->dims[0].is + : p->sz->dims[0].os), + X(mktensor_0d)(), + TAINT(p->I + + p->sz->dims[0].is * (p->kind[0]==RODFT00), + p->vecsz->rnk ? p->vecsz->dims[0].is : 0), + TAINT(p->O + + p->sz->dims[0].is * inplace_odd, + p->vecsz->rnk ? p->vecsz->dims[0].os : 0), + p->kind[0])); + if (!clde) { + X(ifree)(buf); + return (plan *)0; + } + + cldo = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)( + X(mktensor_1d)(n/2, 1, 1), + X(mktensor_0d)(), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cldo) + return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, p->kind[0] == REDFT00 ? apply_e : apply_o); + + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->clde = clde; + pln->cldo = cldo; + pln->td = 0; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.other = n/2; + ops.add = (p->kind[0]==REDFT00 ? (INT)2 : (INT)0) + + (n/2-1)/2 * 6 + ((n/2)%2==0) * 2; + ops.mul = 1 + (n/2-1)/2 * 6 + ((n/2)%2==0) * 2; + + /* tweak ops.other so that r2hc-pad is used for small sizes, which + seems to be a lot faster on my machine: */ + ops.other += 256; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &clde->ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cldo->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(reodft00e_splitradix_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft010e-r2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft010e-r2hc.c new file mode 100644 index 000000000..eb06ba8c1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft010e-r2hc.c @@ -0,0 +1,410 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do an R{E,O}DFT{01,10} problem via an R2HC problem, with some + pre/post-processing ala FFTPACK. */ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + twid *td; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; + rdft_kind kind; +} P; + +/* A real-even-01 DFT operates logically on a size-4N array: + I 0 -r(I*) -I 0 r(I*), + where r denotes reversal and * denotes deletion of the 0th element. + To compute the transform of this, we imagine performing a radix-4 + (real-input) DIF step, which turns the size-4N DFT into 4 size-N + (contiguous) DFTs, two of which are zero and two of which are + conjugates. The non-redundant size-N DFT has halfcomplex input, so + we can do it with a size-N hc2r transform. (In order to share + plans with the re10 (inverse) transform, however, we use the DHT + trick to re-express the hc2r problem as r2hc. This has little cost + since we are already pre- and post-processing the data in {i,n-i} + order.) Finally, we have to write out the data in the correct + order...the two size-N redundant (conjugate) hc2r DFTs correspond + to the even and odd outputs in O (i.e. the usual interleaved output + of DIF transforms); since this data has even symmetry, we only + write the first half of it. + + The real-even-10 DFT is just the reverse of these steps, i.e. a + radix-4 DIT transform. There, however, we just use the r2hc + transform naturally without resorting to the DHT trick. + + A real-odd-01 DFT is very similar, except that the input is + 0 I (rI)* 0 -I -(rI)*. This format, however, can be transformed + into precisely the real-even-01 format above by sending I -> rI + and shifting the array by N. The former swap is just another + transformation on the input during preprocessing; the latter + multiplies the even/odd outputs by i/-i, which combines with + the factor of -i (to take the imaginary part) to simply flip + the sign of the odd outputs. Vice-versa for real-odd-10. + + The FFTPACK source code was very helpful in working this out. + (They do unnecessary passes over the array, though.) The same + algorithm is also described in: + + John Makhoul, "A fast cosine transform in one and two dimensions," + IEEE Trans. on Acoust. Speech and Sig. Proc., ASSP-28 (1), 27--34 (1980). + + Note that Numerical Recipes suggests a different algorithm that + requires more operations and uses trig. functions for both the pre- + and post-processing passes. +*/ + +static void apply_re01(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = I[0]; + for (i = 1; i < n - i; ++i) { + E a, b, apb, amb, wa, wb; + a = I[is * i]; + b = I[is * (n - i)]; + apb = a + b; + amb = a - b; + wa = W[2*i]; + wb = W[2*i + 1]; + buf[i] = wa * amb + wb * apb; + buf[n - i] = wa * apb - wb * amb; + } + if (i == n - i) { + buf[i] = K(2.0) * I[is * i] * W[2*i]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + O[0] = buf[0]; + for (i = 1; i < n - i; ++i) { + E a, b; + INT k; + a = buf[i]; + b = buf[n - i]; + k = i + i; + O[os * (k - 1)] = a - b; + O[os * k] = a + b; + } + if (i == n - i) { + O[os * (n - 1)] = buf[i]; + } + } + + X(ifree)(buf); +} + +/* ro01 is same as re01, but with i <-> n - 1 - i in the input and + the sign of the odd output elements flipped. */ +static void apply_ro01(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = I[is * (n - 1)]; + for (i = 1; i < n - i; ++i) { + E a, b, apb, amb, wa, wb; + a = I[is * (n - 1 - i)]; + b = I[is * (i - 1)]; + apb = a + b; + amb = a - b; + wa = W[2*i]; + wb = W[2*i+1]; + buf[i] = wa * amb + wb * apb; + buf[n - i] = wa * apb - wb * amb; + } + if (i == n - i) { + buf[i] = K(2.0) * I[is * (i - 1)] * W[2*i]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + O[0] = buf[0]; + for (i = 1; i < n - i; ++i) { + E a, b; + INT k; + a = buf[i]; + b = buf[n - i]; + k = i + i; + O[os * (k - 1)] = b - a; + O[os * k] = a + b; + } + if (i == n - i) { + O[os * (n - 1)] = -buf[i]; + } + } + + X(ifree)(buf); +} + +static void apply_re10(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = I[0]; + for (i = 1; i < n - i; ++i) { + E u, v; + INT k = i + i; + u = I[is * (k - 1)]; + v = I[is * k]; + buf[n - i] = u; + buf[i] = v; + } + if (i == n - i) { + buf[i] = I[is * (n - 1)]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + O[0] = K(2.0) * buf[0]; + for (i = 1; i < n - i; ++i) { + E a, b, wa, wb; + a = K(2.0) * buf[i]; + b = K(2.0) * buf[n - i]; + wa = W[2*i]; + wb = W[2*i + 1]; + O[os * i] = wa * a + wb * b; + O[os * (n - i)] = wb * a - wa * b; + } + if (i == n - i) { + O[os * i] = K(2.0) * buf[i] * W[2*i]; + } + } + + X(ifree)(buf); +} + +/* ro10 is same as re10, but with i <-> n - 1 - i in the output and + the sign of the odd input elements flipped. */ +static void apply_ro10(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = I[0]; + for (i = 1; i < n - i; ++i) { + E u, v; + INT k = i + i; + u = -I[is * (k - 1)]; + v = I[is * k]; + buf[n - i] = u; + buf[i] = v; + } + if (i == n - i) { + buf[i] = -I[is * (n - 1)]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + O[os * (n - 1)] = K(2.0) * buf[0]; + for (i = 1; i < n - i; ++i) { + E a, b, wa, wb; + a = K(2.0) * buf[i]; + b = K(2.0) * buf[n - i]; + wa = W[2*i]; + wb = W[2*i + 1]; + O[os * (n - 1 - i)] = wa * a + wb * b; + O[os * (i - 1)] = wb * a - wa * b; + } + if (i == n - i) { + O[os * (i - 1)] = K(2.0) * buf[i] * W[2*i]; + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr reodft010e_tw[] = { + { TW_COS, 0, 1 }, + { TW_SIN, 0, 1 }, + { TW_NEXT, 1, 0 } + }; + + X(plan_awake)(ego->cld, wakefulness); + + X(twiddle_awake)(wakefulness, &ego->td, reodft010e_tw, + 4*ego->n, 1, ego->n/2+1); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(%se-r2hc-%D%v%(%p%))", + X(rdft_kind_str)(ego->kind), ego->n, ego->vl, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && (p->kind[0] == REDFT01 || p->kind[0] == REDFT10 + || p->kind[0] == RODFT01 || p->kind[0] == RODFT10) + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + R *buf; + INT n; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n; + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + cld = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)(X(mktensor_1d)(n, 1, 1), + X(mktensor_0d)(), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cld) + return (plan *)0; + + switch (p->kind[0]) { + case REDFT01: pln = MKPLAN_RDFT(P, &padt, apply_re01); break; + case REDFT10: pln = MKPLAN_RDFT(P, &padt, apply_re10); break; + case RODFT01: pln = MKPLAN_RDFT(P, &padt, apply_ro01); break; + case RODFT10: pln = MKPLAN_RDFT(P, &padt, apply_ro10); break; + default: A(0); return (plan*)0; + } + + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + pln->td = 0; + pln->kind = p->kind[0]; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.other = 4 + (n-1)/2 * 10 + (1 - n % 2) * 5; + if (p->kind[0] == REDFT01 || p->kind[0] == RODFT01) { + ops.add = (n-1)/2 * 6; + ops.mul = (n-1)/2 * 4 + (1 - n % 2) * 2; + } + else { /* 10 transforms */ + ops.add = (n-1)/2 * 2; + ops.mul = 1 + (n-1)/2 * 6 + (1 - n % 2) * 2; + } + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(reodft010e_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-r2hc-odd.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-r2hc-odd.c new file mode 100644 index 000000000..af7568e14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-r2hc-odd.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do an R{E,O}DFT11 problem via an R2HC problem of the same *odd* size, + with some permutations and post-processing, as described in: + + S. C. Chan and K. L. Ho, "Fast algorithms for computing the + discrete cosine transform," IEEE Trans. Circuits Systems II: + Analog & Digital Sig. Proc. 39 (3), 185--190 (1992). + + (For even sizes, see reodft11e-radix2.c.) + + This algorithm is related to the 8 x n prime-factor-algorithm (PFA) + decomposition of the size 8n "logical" DFT corresponding to the + R{EO}DFT11. + + Aside from very confusing notation (several symbols are redefined + from one line to the next), be aware that this paper has some + errors. In particular, the signs are wrong in Eqs. (34-35). Also, + Eqs. (36-37) should be simply C(k) = C(2k + 1 mod N), and similarly + for S (or, equivalently, the second cases should have 2*N - 2*k - 1 + instead of N - k - 1). Note also that in their definition of the + DFT, similarly to FFTW's, the exponent's sign is -1, but they + forgot to correspondingly multiply S (the sine terms) by -1. +*/ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; + rdft_kind kind; +} P; + +static DK(SQRT2, +1.4142135623730950488016887242096980785696718753769); + +#define SGN_SET(x, i) ((i) % 2 ? -(x) : (x)) + +static void apply_re11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n, n2 = n/2; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + { + INT m; + for (i = 0, m = n2; m < n; ++i, m += 4) + buf[i] = I[is * m]; + for (; m < 2 * n; ++i, m += 4) + buf[i] = -I[is * (2*n - m - 1)]; + for (; m < 3 * n; ++i, m += 4) + buf[i] = -I[is * (m - 2*n)]; + for (; m < 4 * n; ++i, m += 4) + buf[i] = I[is * (4*n - m - 1)]; + m -= 4 * n; + for (; i < n; ++i, m += 4) + buf[i] = I[is * m]; + } + + { /* child plan: R2HC of size n */ + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + /* FIXME: strength-reduce loop by 4 to eliminate ugly sgn_set? */ + for (i = 0; i + i + 1 < n2; ++i) { + INT k = i + i + 1; + E c1, s1; + E c2, s2; + c1 = buf[k]; + c2 = buf[k + 1]; + s2 = buf[n - (k + 1)]; + s1 = buf[n - k]; + + O[os * i] = SQRT2 * (SGN_SET(c1, (i+1)/2) + + SGN_SET(s1, i/2)); + O[os * (n - (i+1))] = SQRT2 * (SGN_SET(c1, (n-i)/2) - + SGN_SET(s1, (n-(i+1))/2)); + + O[os * (n2 - (i+1))] = SQRT2 * (SGN_SET(c2, (n2-i)/2) - + SGN_SET(s2, (n2-(i+1))/2)); + O[os * (n2 + (i+1))] = SQRT2 * (SGN_SET(c2, (n2+i+2)/2) + + SGN_SET(s2, (n2+(i+1))/2)); + } + if (i + i + 1 == n2) { + E c, s; + c = buf[n2]; + s = buf[n - n2]; + O[os * i] = SQRT2 * (SGN_SET(c, (i+1)/2) + + SGN_SET(s, i/2)); + O[os * (n - (i+1))] = SQRT2 * (SGN_SET(c, (i+2)/2) + + SGN_SET(s, (i+1)/2)); + } + O[os * n2] = SQRT2 * SGN_SET(buf[0], (n2+1)/2); + } + + X(ifree)(buf); +} + +/* like for rodft01, rodft11 is obtained from redft11 by + reversing the input and flipping the sign of every other output. */ +static void apply_ro11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n, n2 = n/2; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + { + INT m; + for (i = 0, m = n2; m < n; ++i, m += 4) + buf[i] = I[is * (n - 1 - m)]; + for (; m < 2 * n; ++i, m += 4) + buf[i] = -I[is * (m - n)]; + for (; m < 3 * n; ++i, m += 4) + buf[i] = -I[is * (3*n - 1 - m)]; + for (; m < 4 * n; ++i, m += 4) + buf[i] = I[is * (m - 3*n)]; + m -= 4 * n; + for (; i < n; ++i, m += 4) + buf[i] = I[is * (n - 1 - m)]; + } + + { /* child plan: R2HC of size n */ + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + /* FIXME: strength-reduce loop by 4 to eliminate ugly sgn_set? */ + for (i = 0; i + i + 1 < n2; ++i) { + INT k = i + i + 1; + INT j; + E c1, s1; + E c2, s2; + c1 = buf[k]; + c2 = buf[k + 1]; + s2 = buf[n - (k + 1)]; + s1 = buf[n - k]; + + O[os * i] = SQRT2 * (SGN_SET(c1, (i+1)/2 + i) + + SGN_SET(s1, i/2 + i)); + O[os * (n - (i+1))] = SQRT2 * (SGN_SET(c1, (n-i)/2 + i) - + SGN_SET(s1, (n-(i+1))/2 + i)); + + j = n2 - (i+1); + O[os * j] = SQRT2 * (SGN_SET(c2, (n2-i)/2 + j) - + SGN_SET(s2, (n2-(i+1))/2 + j)); + O[os * (n2 + (i+1))] = SQRT2 * (SGN_SET(c2, (n2+i+2)/2 + j) + + SGN_SET(s2, (n2+(i+1))/2 + j)); + } + if (i + i + 1 == n2) { + E c, s; + c = buf[n2]; + s = buf[n - n2]; + O[os * i] = SQRT2 * (SGN_SET(c, (i+1)/2 + i) + + SGN_SET(s, i/2 + i)); + O[os * (n - (i+1))] = SQRT2 * (SGN_SET(c, (i+2)/2 + i) + + SGN_SET(s, (i+1)/2 + i)); + } + O[os * n2] = SQRT2 * SGN_SET(buf[0], (n2+1)/2 + n2); + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(%se-r2hc-odd-%D%v%(%p%))", + X(rdft_kind_str)(ego->kind), ego->n, ego->vl, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n % 2 == 1 + && (p->kind[0] == REDFT11 || p->kind[0] == RODFT11) + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + R *buf; + INT n; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n; + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + cld = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)(X(mktensor_1d)(n, 1, 1), + X(mktensor_0d)(), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cld) + return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, p->kind[0]==REDFT11 ? apply_re11:apply_ro11); + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + pln->kind = p->kind[0]; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.add = n - 1; + ops.mul = n; + ops.other = 4*n; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(reodft11e_r2hc_odd_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-r2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-r2hc.c new file mode 100644 index 000000000..b0362c8c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-r2hc.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do an R{E,O}DFT11 problem via an R2HC problem, with some + pre/post-processing ala FFTPACK. Use a trick from: + + S. C. Chan and K. L. Ho, "Direct methods for computing discrete + sinusoidal transforms," IEE Proceedings F 137 (6), 433--442 (1990). + + to re-express as an REDFT01 (DCT-III) problem. + + NOTE: We no longer use this algorithm, because it turns out to suffer + a catastrophic loss of accuracy for certain inputs, apparently because + its post-processing multiplies the output by a cosine. Near the zero + of the cosine, the REDFT01 must produce a near-singular output. +*/ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + twid *td, *td2; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; + rdft_kind kind; +} P; + +static void apply_re11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W; + R *buf; + E cur; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + /* I wish that this didn't require an extra pass. */ + /* FIXME: use recursive/cascade summation for better stability? */ + buf[n - 1] = cur = K(2.0) * I[is * (n - 1)]; + for (i = n - 1; i > 0; --i) { + E curnew; + buf[(i - 1)] = curnew = K(2.0) * I[is * (i - 1)] - cur; + cur = curnew; + } + + W = ego->td->W; + for (i = 1; i < n - i; ++i) { + E a, b, apb, amb, wa, wb; + a = buf[i]; + b = buf[n - i]; + apb = a + b; + amb = a - b; + wa = W[2*i]; + wb = W[2*i + 1]; + buf[i] = wa * amb + wb * apb; + buf[n - i] = wa * apb - wb * amb; + } + if (i == n - i) { + buf[i] = K(2.0) * buf[i] * W[2*i]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + W = ego->td2->W; + O[0] = W[0] * buf[0]; + for (i = 1; i < n - i; ++i) { + E a, b; + INT k; + a = buf[i]; + b = buf[n - i]; + k = i + i; + O[os * (k - 1)] = W[k - 1] * (a - b); + O[os * k] = W[k] * (a + b); + } + if (i == n - i) { + O[os * (n - 1)] = W[n - 1] * buf[i]; + } + } + + X(ifree)(buf); +} + +/* like for rodft01, rodft11 is obtained from redft11 by + reversing the input and flipping the sign of every other output. */ +static void apply_ro11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W; + R *buf; + E cur; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + /* I wish that this didn't require an extra pass. */ + /* FIXME: use recursive/cascade summation for better stability? */ + buf[n - 1] = cur = K(2.0) * I[0]; + for (i = n - 1; i > 0; --i) { + E curnew; + buf[(i - 1)] = curnew = K(2.0) * I[is * (n - i)] - cur; + cur = curnew; + } + + W = ego->td->W; + for (i = 1; i < n - i; ++i) { + E a, b, apb, amb, wa, wb; + a = buf[i]; + b = buf[n - i]; + apb = a + b; + amb = a - b; + wa = W[2*i]; + wb = W[2*i + 1]; + buf[i] = wa * amb + wb * apb; + buf[n - i] = wa * apb - wb * amb; + } + if (i == n - i) { + buf[i] = K(2.0) * buf[i] * W[2*i]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + W = ego->td2->W; + O[0] = W[0] * buf[0]; + for (i = 1; i < n - i; ++i) { + E a, b; + INT k; + a = buf[i]; + b = buf[n - i]; + k = i + i; + O[os * (k - 1)] = W[k - 1] * (b - a); + O[os * k] = W[k] * (a + b); + } + if (i == n - i) { + O[os * (n - 1)] = -W[n - 1] * buf[i]; + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr reodft010e_tw[] = { + { TW_COS, 0, 1 }, + { TW_SIN, 0, 1 }, + { TW_NEXT, 1, 0 } + }; + static const tw_instr reodft11e_tw[] = { + { TW_COS, 1, 1 }, + { TW_NEXT, 2, 0 } + }; + + X(plan_awake)(ego->cld, wakefulness); + + X(twiddle_awake)(wakefulness, + &ego->td, reodft010e_tw, 4*ego->n, 1, ego->n/2+1); + X(twiddle_awake)(wakefulness, + &ego->td2, reodft11e_tw, 8*ego->n, 1, ego->n * 2); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(%se-r2hc-%D%v%(%p%))", + X(rdft_kind_str)(ego->kind), ego->n, ego->vl, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && (p->kind[0] == REDFT11 || p->kind[0] == RODFT11) + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + R *buf; + INT n; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n; + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + cld = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)(X(mktensor_1d)(n, 1, 1), + X(mktensor_0d)(), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cld) + return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, p->kind[0]==REDFT11 ? apply_re11:apply_ro11); + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + pln->td = pln->td2 = 0; + pln->kind = p->kind[0]; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.other = 5 + (n-1) * 2 + (n-1)/2 * 12 + (1 - n % 2) * 6; + ops.add = (n - 1) * 1 + (n-1)/2 * 6; + ops.mul = 2 + (n-1) * 1 + (n-1)/2 * 6 + (1 - n % 2) * 3; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(reodft11e_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-radix2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-radix2.c new file mode 100644 index 000000000..3f28e6ded --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/reodft11e-radix2.c @@ -0,0 +1,513 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do an R{E,O}DFT11 problem of *even* size by a pair of R2HC problems + of half the size, plus some pre/post-processing. Use a trick from: + + Zhongde Wang, "On computing the discrete Fourier and cosine transforms," + IEEE Trans. Acoust. Speech Sig. Proc. ASSP-33 (4), 1341--1344 (1985). + + to re-express as a pair of half-size REDFT01 (DCT-III) problems. Our + implementation looks quite a bit different from the algorithm described + in the paper because we combined the paper's pre/post-processing with + the pre/post-processing used to turn REDFT01 into R2HC. (Also, the + paper uses a DCT/DST pair, but we turn the DST into a DCT via the + usual reordering/sign-flip trick. We additionally combined a couple + of the matrices/transformations of the paper into a single pass.) + + NOTE: We originally used a simpler method by S. C. Chan and K. L. Ho + that turned out to have numerical problems; see reodft11e-r2hc.c. + + (For odd sizes, see reodft11e-r2hc-odd.c.) +*/ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + twid *td, *td2; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; + rdft_kind kind; +} P; + +static void apply_re11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n, n2 = n/2; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *W2; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = K(2.0) * I[0]; + buf[n2] = K(2.0) * I[is * (n - 1)]; + for (i = 1; i + i < n2; ++i) { + INT k = i + i; + E a, b, a2, b2; + { + E u, v; + u = I[is * (k - 1)]; + v = I[is * k]; + a = u + v; + b2 = u - v; + } + { + E u, v; + u = I[is * (n - k - 1)]; + v = I[is * (n - k)]; + b = u + v; + a2 = u - v; + } + { + E wa, wb; + wa = W[2*i]; + wb = W[2*i + 1]; + { + E apb, amb; + apb = a + b; + amb = a - b; + buf[i] = wa * amb + wb * apb; + buf[n2 - i] = wa * apb - wb * amb; + } + { + E apb, amb; + apb = a2 + b2; + amb = a2 - b2; + buf[n2 + i] = wa * amb + wb * apb; + buf[n - i] = wa * apb - wb * amb; + } + } + } + if (i + i == n2) { + E u, v; + u = I[is * (n2 - 1)]; + v = I[is * n2]; + buf[i] = (u + v) * (W[2*i] * K(2.0)); + buf[n - i] = (u - v) * (W[2*i] * K(2.0)); + } + + + /* child plan: two r2hc's of size n/2 */ + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + W2 = ego->td2->W; + { /* i == 0 case */ + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = buf[0]; + b = buf[n2]; + O[0] = wa * a + wb * b; + O[os * (n - 1)] = wb * a - wa * b; + } + W2 += 2; + for (i = 1; i + i < n2; ++i, W2 += 2) { + INT k; + E u, v, u2, v2; + u = buf[i]; + v = buf[n2 - i]; + u2 = buf[n2 + i]; + v2 = buf[n - i]; + k = (i + i) - 1; + { + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = u - v; + b = v2 - u2; + O[os * k] = wa * a + wb * b; + O[os * (n - 1 - k)] = wb * a - wa * b; + } + ++k; + W2 += 2; + { + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = u + v; + b = u2 + v2; + O[os * k] = wa * a + wb * b; + O[os * (n - 1 - k)] = wb * a - wa * b; + } + } + if (i + i == n2) { + INT k = (i + i) - 1; + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = buf[i]; + b = buf[n2 + i]; + O[os * k] = wa * a - wb * b; + O[os * (n - 1 - k)] = wb * a + wa * b; + } + } + + X(ifree)(buf); +} + +#if 0 + +/* This version of apply_re11 uses REDFT01 child plans, more similar + to the original paper by Z. Wang. We keep it around for reference + (it is simpler) and because it may become more efficient if we + ever implement REDFT01 codelets. */ + +static void apply_re11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = K(2.0) * I[0]; + buf[n/2] = K(2.0) * I[is * (n - 1)]; + for (i = 1; i + i < n; ++i) { + INT k = i + i; + E a, b; + a = I[is * (k - 1)]; + b = I[is * k]; + buf[i] = a + b; + buf[n - i] = a - b; + } + + /* child plan: two redft01's (DCT-III) */ + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + W = ego->td2->W; + for (i = 0; i + 1 < n/2; ++i, W += 2) { + { + E wa, wb; + E a, b; + wa = W[0]; /* cos */ + wb = W[1]; /* sin */ + a = buf[i]; + b = buf[n/2 + i]; + O[os * i] = wa * a + wb * b; + O[os * (n - 1 - i)] = wb * a - wa * b; + } + ++i; + W += 2; + { + E wa, wb; + E a, b; + wa = W[0]; /* cos */ + wb = W[1]; /* sin */ + a = buf[i]; + b = buf[n/2 + i]; + O[os * i] = wa * a - wb * b; + O[os * (n - 1 - i)] = wb * a + wa * b; + } + } + if (i < n/2) { + E wa, wb; + E a, b; + wa = W[0]; /* cos */ + wb = W[1]; /* sin */ + a = buf[i]; + b = buf[n/2 + i]; + O[os * i] = wa * a + wb * b; + O[os * (n - 1 - i)] = wb * a - wa * b; + } + } + + X(ifree)(buf); +} + +#endif /* 0 */ + +/* like for rodft01, rodft11 is obtained from redft11 by + reversing the input and flipping the sign of every other output. */ +static void apply_ro11(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n, n2 = n/2; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *W2; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = K(2.0) * I[is * (n - 1)]; + buf[n2] = K(2.0) * I[0]; + for (i = 1; i + i < n2; ++i) { + INT k = i + i; + E a, b, a2, b2; + { + E u, v; + u = I[is * (n - k)]; + v = I[is * (n - 1 - k)]; + a = u + v; + b2 = u - v; + } + { + E u, v; + u = I[is * (k)]; + v = I[is * (k - 1)]; + b = u + v; + a2 = u - v; + } + { + E wa, wb; + wa = W[2*i]; + wb = W[2*i + 1]; + { + E apb, amb; + apb = a + b; + amb = a - b; + buf[i] = wa * amb + wb * apb; + buf[n2 - i] = wa * apb - wb * amb; + } + { + E apb, amb; + apb = a2 + b2; + amb = a2 - b2; + buf[n2 + i] = wa * amb + wb * apb; + buf[n - i] = wa * apb - wb * amb; + } + } + } + if (i + i == n2) { + E u, v; + u = I[is * n2]; + v = I[is * (n2 - 1)]; + buf[i] = (u + v) * (W[2*i] * K(2.0)); + buf[n - i] = (u - v) * (W[2*i] * K(2.0)); + } + + + /* child plan: two r2hc's of size n/2 */ + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + W2 = ego->td2->W; + { /* i == 0 case */ + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = buf[0]; + b = buf[n2]; + O[0] = wa * a + wb * b; + O[os * (n - 1)] = wa * b - wb * a; + } + W2 += 2; + for (i = 1; i + i < n2; ++i, W2 += 2) { + INT k; + E u, v, u2, v2; + u = buf[i]; + v = buf[n2 - i]; + u2 = buf[n2 + i]; + v2 = buf[n - i]; + k = (i + i) - 1; + { + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = v - u; + b = u2 - v2; + O[os * k] = wa * a + wb * b; + O[os * (n - 1 - k)] = wa * b - wb * a; + } + ++k; + W2 += 2; + { + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = u + v; + b = u2 + v2; + O[os * k] = wa * a + wb * b; + O[os * (n - 1 - k)] = wa * b - wb * a; + } + } + if (i + i == n2) { + INT k = (i + i) - 1; + E wa, wb; + E a, b; + wa = W2[0]; /* cos */ + wb = W2[1]; /* sin */ + a = buf[i]; + b = buf[n2 + i]; + O[os * k] = wb * b - wa * a; + O[os * (n - 1 - k)] = wa * b + wb * a; + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr reodft010e_tw[] = { + { TW_COS, 0, 1 }, + { TW_SIN, 0, 1 }, + { TW_NEXT, 1, 0 } + }; + static const tw_instr reodft11e_tw[] = { + { TW_COS, 1, 1 }, + { TW_SIN, 1, 1 }, + { TW_NEXT, 2, 0 } + }; + + X(plan_awake)(ego->cld, wakefulness); + + X(twiddle_awake)(wakefulness, &ego->td, reodft010e_tw, + 2*ego->n, 1, ego->n/4+1); + X(twiddle_awake)(wakefulness, &ego->td2, reodft11e_tw, + 8*ego->n, 1, ego->n); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(%se-radix2-r2hc-%D%v%(%p%))", + X(rdft_kind_str)(ego->kind), ego->n, ego->vl, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->sz->dims[0].n % 2 == 0 + && (p->kind[0] == REDFT11 || p->kind[0] == RODFT11) + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + R *buf; + INT n; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n; + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + cld = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)(X(mktensor_1d)(n/2, 1, 1), + X(mktensor_1d)(2, n/2, n/2), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cld) + return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, p->kind[0]==REDFT11 ? apply_re11:apply_ro11); + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + pln->td = pln->td2 = 0; + pln->kind = p->kind[0]; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.add = 2 + (n/2 - 1)/2 * 20; + ops.mul = 6 + (n/2 - 1)/2 * 16; + ops.other = 4*n + 2 + (n/2 - 1)/2 * 6; + if ((n/2) % 2 == 0) { + ops.add += 4; + ops.mul += 8; + ops.other += 4; + } + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(reodft11e_radix2_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/rodft00e-r2hc-pad.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/rodft00e-r2hc-pad.c new file mode 100644 index 000000000..5876b58fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/rodft00e-r2hc-pad.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do a RODFT00 problem via an R2HC problem, padded antisymmetrically to + twice the size. This is asymptotically a factor of ~2 worse than + rodft00e-r2hc.c (the algorithm used in e.g. FFTPACK and Numerical + Recipes), but we abandoned the latter after we discovered that it + has intrinsic accuracy problems. */ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld, *cldcpy; + INT is; + INT n; + INT vl; + INT ivs, ovs; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * (2*n), BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = K(0.0); + for (i = 1; i < n; ++i) { + R a = I[(i-1) * is]; + buf[i] = -a; + buf[2*n - i] = a; + } + buf[i] = K(0.0); /* i == n, Nyquist */ + + /* r2hc transform of size 2*n */ + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + /* copy n-1 real numbers (imag. parts of hc array) from buf to O */ + { + plan_rdft *cldcpy = (plan_rdft *) ego->cldcpy; + cldcpy->apply((plan *) cldcpy, buf+2*n-1, O); + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + X(plan_awake)(ego->cld, wakefulness); + X(plan_awake)(ego->cldcpy, wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cldcpy); + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rodft00e-r2hc-pad-%D%v%(%p%)%(%p%))", + ego->n - 1, ego->vl, ego->cld, ego->cldcpy); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->kind[0] == RODFT00 + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld = (plan *) 0, *cldcpy; + R *buf = (R *) 0; + INT n; + INT vl, ivs, ovs; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + goto nada; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n + 1; + A(n > 0); + buf = (R *) MALLOC(sizeof(R) * (2*n), BUFFERS); + + cld = X(mkplan_d)(plnr,X(mkproblem_rdft_1_d)(X(mktensor_1d)(2*n,1,1), + X(mktensor_0d)(), + buf, buf, R2HC)); + if (!cld) + goto nada; + + X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs); + cldcpy = + X(mkplan_d)(plnr, + X(mkproblem_rdft_1_d)(X(mktensor_0d)(), + X(mktensor_1d)(n-1,-1, + p->sz->dims[0].os), + buf+2*n-1,TAINT(p->O, ovs), R2HC)); + if (!cldcpy) + goto nada; + + X(ifree)(buf); + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->cld = cld; + pln->cldcpy = cldcpy; + pln->vl = vl; + pln->ivs = ivs; + pln->ovs = ovs; + + X(ops_zero)(&ops); + ops.other = n-1 + 2*n; /* loads + stores (input -> buf) */ + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cldcpy->ops, &pln->super.super.ops); + + return &(pln->super.super); + + nada: + X(ifree0)(buf); + if (cld) + X(plan_destroy_internal)(cld); + return (plan *)0; +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(rodft00e_r2hc_pad_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/rodft00e-r2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/rodft00e-r2hc.c new file mode 100644 index 000000000..c588a30e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/reodft/rodft00e-r2hc.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* Do a RODFT00 problem via an R2HC problem, with some pre/post-processing. + + This code uses the trick from FFTPACK, also documented in a similar + form by Numerical Recipes. Unfortunately, this algorithm seems to + have intrinsic numerical problems (similar to those in + reodft11e-r2hc.c), possibly due to the fact that it multiplies its + input by a sine, causing a loss of precision near the zero. For + transforms of 16k points, it has already lost three or four decimal + places of accuracy, which we deem unacceptable. + + So, we have abandoned this algorithm in favor of the one in + rodft00-r2hc-pad.c, which unfortunately sacrifices 30-50% in speed. + The only other alternative in the literature that does not have + similar numerical difficulties seems to be the direct adaptation of + the Cooley-Tukey decomposition for antisymmetric data, but this + would require a whole new set of codelets and it's not clear that + it's worth it at this point. However, we did implement the latter + algorithm for the specific case of odd n (logically adapting the + split-radix algorithm); see reodft00e-splitradix.c. */ + +#include "reodft/reodft.h" + +typedef struct { + solver super; +} S; + +typedef struct { + plan_rdft super; + plan *cld; + twid *td; + INT is, os; + INT n; + INT vl; + INT ivs, ovs; +} P; + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + INT is = ego->is, os = ego->os; + INT i, n = ego->n; + INT iv, vl = ego->vl; + INT ivs = ego->ivs, ovs = ego->ovs; + R *W = ego->td->W; + R *buf; + + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + for (iv = 0; iv < vl; ++iv, I += ivs, O += ovs) { + buf[0] = 0; + for (i = 1; i < n - i; ++i) { + E a, b, apb, amb; + a = I[is * (i - 1)]; + b = I[is * ((n - i) - 1)]; + apb = K(2.0) * W[i] * (a + b); + amb = (a - b); + buf[i] = apb + amb; + buf[n - i] = apb - amb; + } + if (i == n - i) { + buf[i] = K(4.0) * I[is * (i - 1)]; + } + + { + plan_rdft *cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, buf, buf); + } + + /* FIXME: use recursive/cascade summation for better stability? */ + O[0] = buf[0] * 0.5; + for (i = 1; i + i < n - 1; ++i) { + INT k = i + i; + O[os * (k - 1)] = -buf[n - i]; + O[os * k] = O[os * (k - 2)] + buf[i]; + } + if (i + i == n - 1) { + O[os * (n - 2)] = -buf[n - i]; + } + } + + X(ifree)(buf); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + static const tw_instr rodft00e_tw[] = { + { TW_SIN, 0, 1 }, + { TW_NEXT, 1, 0 } + }; + + X(plan_awake)(ego->cld, wakefulness); + + X(twiddle_awake)(wakefulness, + &ego->td, rodft00e_tw, 2*ego->n, 1, (ego->n+1)/2); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + X(plan_destroy_internal)(ego->cld); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + p->print(p, "(rodft00e-r2hc-%D%v%(%p%))", ego->n - 1, ego->vl, ego->cld); +} + +static int applicable0(const solver *ego_, const problem *p_) +{ + const problem_rdft *p = (const problem_rdft *) p_; + UNUSED(ego_); + + return (1 + && p->sz->rnk == 1 + && p->vecsz->rnk <= 1 + && p->kind[0] == RODFT00 + ); +} + +static int applicable(const solver *ego, const problem *p, const planner *plnr) +{ + return (!NO_SLOWP(plnr) && applicable0(ego, p)); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + P *pln; + const problem_rdft *p; + plan *cld; + R *buf; + INT n; + opcnt ops; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr)) + return (plan *)0; + + p = (const problem_rdft *) p_; + + n = p->sz->dims[0].n + 1; + buf = (R *) MALLOC(sizeof(R) * n, BUFFERS); + + cld = X(mkplan_d)(plnr, X(mkproblem_rdft_1_d)(X(mktensor_1d)(n, 1, 1), + X(mktensor_0d)(), + buf, buf, R2HC)); + X(ifree)(buf); + if (!cld) + return (plan *)0; + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->n = n; + pln->is = p->sz->dims[0].is; + pln->os = p->sz->dims[0].os; + pln->cld = cld; + pln->td = 0; + + X(tensor_tornk1)(p->vecsz, &pln->vl, &pln->ivs, &pln->ovs); + + X(ops_zero)(&ops); + ops.other = 4 + (n-1)/2 * 5 + (n-2)/2 * 5; + ops.add = (n-1)/2 * 4 + (n-2)/2 * 1; + ops.mul = 1 + (n-1)/2 * 2; + if (n % 2 == 0) + ops.mul += 1; + + X(ops_zero)(&pln->super.super.ops); + X(ops_madd2)(pln->vl, &ops, &pln->super.super.ops); + X(ops_madd2)(pln->vl, &cld->ops, &pln->super.super.ops); + + return &(pln->super.super); +} + +/* constructor */ +static solver *mksolver(void) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + return &(slv->super); +} + +void X(rodft00e_r2hc_register)(planner *p) +{ + REGISTER_SOLVER(p, mksolver()); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/Makefile.am new file mode 100644 index 000000000..26db46e93 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/Makefile.am @@ -0,0 +1,15 @@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = libsimd_support.la + +libsimd_support_la_SOURCES = taint.c simd-common.h \ +x86-cpuid.h amd64-cpuid.h \ +simd-sse2.h sse2.c \ +avx.c simd-avx.h \ +avx-128-fma.c simd-avx-128-fma.h \ +avx2.c simd-avx2.h simd-avx2-128.h \ +avx512.c simd-avx512.h \ +kcvi.c simd-kcvi.h \ +altivec.c simd-altivec.h vsx.c simd-vsx.h \ +neon.c simd-neon.h \ +simd-generic128.h simd-generic256.h + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/Makefile.in new file mode 100644 index 000000000..5e7e6251d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/Makefile.in @@ -0,0 +1,648 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = simd-support +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libsimd_support_la_LIBADD = +am_libsimd_support_la_OBJECTS = taint.lo sse2.lo avx.lo avx-128-fma.lo \ + avx2.lo avx512.lo kcvi.lo altivec.lo vsx.lo neon.lo +libsimd_support_la_OBJECTS = $(am_libsimd_support_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libsimd_support_la_SOURCES) +DIST_SOURCES = $(libsimd_support_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_LTLIBRARIES = libsimd_support.la +libsimd_support_la_SOURCES = taint.c simd-common.h \ +x86-cpuid.h amd64-cpuid.h \ +simd-sse2.h sse2.c \ +avx.c simd-avx.h \ +avx-128-fma.c simd-avx-128-fma.h \ +avx2.c simd-avx2.h simd-avx2-128.h \ +avx512.c simd-avx512.h \ +kcvi.c simd-kcvi.h \ +altivec.c simd-altivec.h vsx.c simd-vsx.h \ +neon.c simd-neon.h \ +simd-generic128.h simd-generic256.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu simd-support/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu simd-support/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libsimd_support.la: $(libsimd_support_la_OBJECTS) $(libsimd_support_la_DEPENDENCIES) $(EXTRA_libsimd_support_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libsimd_support_la_OBJECTS) $(libsimd_support_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/altivec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avx-128-fma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avx.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avx2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avx512.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kcvi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/neon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sse2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taint.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsx.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/altivec.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/altivec.c new file mode 100644 index 000000000..5818f5e22 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/altivec.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_ALTIVEC + +#if HAVE_SYS_SYSCTL_H +# include +#endif + +#if HAVE_SYS_SYSCTL_H && HAVE_SYSCTL && defined(CTL_HW) && defined(HW_VECTORUNIT) +/* code for darwin */ +static int really_have_altivec(void) +{ + int mib[2], altivecp; + size_t len; + mib[0] = CTL_HW; + mib[1] = HW_VECTORUNIT; + len = sizeof(altivecp); + sysctl(mib, 2, &altivecp, &len, NULL, 0); + return altivecp; +} +#else /* GNU/Linux and other non-Darwin systems (!HAVE_SYS_SYSCTL_H etc.) */ + +#include +#include + +static jmp_buf jb; + +static void sighandler(int x) +{ + longjmp(jb, 1); +} + +static int really_have_altivec(void) +{ + void (*oldsig)(int); + oldsig = signal(SIGILL, sighandler); + if (setjmp(jb)) { + signal(SIGILL, oldsig); + return 0; + } else { + __asm__ __volatile__ (".long 0x10000484"); /* vor 0,0,0 */ + signal(SIGILL, oldsig); + return 1; + } + return 0; +} +#endif + +int X(have_simd_altivec)(void) +{ + static int init = 0, res; + if (!init) { + res = really_have_altivec(); + init = 1; + } + return res; +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/amd64-cpuid.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/amd64-cpuid.h new file mode 100644 index 000000000..9b91f4973 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/amd64-cpuid.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +#ifdef _MSC_VER +#include +#if (_MSC_VER >= 1600) && !defined(__INTEL_COMPILER) +#include +#endif +#endif + +/* cpuid version to get all registers. Donated by Erik Lindahl from Gromacs. */ +static inline void +cpuid_all(int level, int ecxval, int *eax, int *ebx, int *ecx, int *edx) +{ +# ifdef _MSC_VER + int CPUInfo[4]; + +#if (_MSC_VER > 1500) || (_MSC_VER == 1500 & _MSC_FULL_VER >= 150030729) + /* MSVC 9.0 SP1 or later */ + __cpuidex(CPUInfo, level, ecxval); +#else + __cpuid(CPUInfo, level); +#endif + *eax = CPUInfo[0]; + *ebx = CPUInfo[1]; + *ecx = CPUInfo[2]; + *edx = CPUInfo[3]; + +# else + /* Not MSVC */ + *eax = level; + *ecx = ecxval; + *ebx = 0; + *edx = 0; + /* No need to save ebx if we are not in pic mode */ + __asm__ ("cpuid \n\t" + : "+a" (*eax), "+b" (*ebx), "+c" (*ecx), "+d" (*edx)); +# endif +} + + +static inline int cpuid_ecx(int op) +{ +# ifdef _MSC_VER +# ifdef __INTEL_COMPILER + int result; + _asm { + push rbx + mov eax,op + cpuid + mov result,ecx + pop rbx + } + return result; +# else + int cpu_info[4]; + __cpuid(cpu_info,op); + return cpu_info[2]; +# endif +# else + int eax, ecx = 0, edx; + + __asm__("pushq %%rbx\n\tcpuid\n\tpopq %%rbx" + : "=a" (eax), "+c" (ecx), "=d" (edx) + : "a" (op)); + return ecx; +# endif +} + +static inline int cpuid_ebx(int op) +{ +# ifdef _MSC_VER +# ifdef __INTEL_COMPILER + int result; + _asm { + push rbx + mov eax,op + cpuid + mov result,ebx + pop rbx + } + return result; +# else + int cpu_info[4]; + __cpuid(cpu_info,op); + return cpu_info[1]; +# endif +# else + int eax, ecx = 0, edx; + + __asm__("pushq %%rbx\n\tcpuid\nmov %%ebx,%%ecx\n\tpopq %%rbx" + : "=a" (eax), "+c" (ecx), "=d" (edx) + : "a" (op)); + return ecx; +# endif +} + +static inline int xgetbv_eax(int op) +{ +# ifdef _MSC_VER +# ifdef __INTEL_COMPILER + int veax, vedx; + _asm { + mov ecx,op + xgetbv + mov veax,eax + mov vedx,edx + } + return veax; +# else +# if defined(_MSC_VER) && (_MSC_VER >= 1600) + unsigned __int64 result; + result = _xgetbv(op); + return (int)result; +# else +# error "Need at least Visual Studio 10 SP1 for AVX support" +# endif +# endif +# else + int eax, edx; + __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (op)); + return eax; +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx-128-fma.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx-128-fma.c new file mode 100644 index 000000000..b8a5892ba --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx-128-fma.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_AVX_128_FMA + +#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) +# include "amd64-cpuid.h" +#else +# include "x86-cpuid.h" +#endif + +int X(have_simd_avx_128_fma)(void) +{ + static int init = 0, res = 0; + int eax,ebx,ecx,edx; + + if (!init) + { + /* Check if this is an AMD CPU */ + cpuid_all(0,0,&eax,&ebx,&ecx,&edx); + + /* 0x68747541: "Auth" , 0x444d4163: "enti" , 0x69746e65: "cAMD" */ + if (ebx==0x68747541 && ecx==0x444d4163 && edx==0x69746e65) + { + /* OK, this is an AMD CPU. Check if we support FMA4 */ + cpuid_all(0x80000001,0,&eax,&ebx,&ecx,&edx); + if(ecx & (1<<16)) + { + res = 1; + } + } + init = 1; + } + return res; +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx.c new file mode 100644 index 000000000..7e19be05b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_AVX + +#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) +# include "amd64-cpuid.h" +#else +# include "x86-cpuid.h" +#endif + +int X(have_simd_avx)(void) +{ + static int init = 0, res = 0; + int max_stdfn, eax, ebx, ecx, edx; + + if (!init) { + cpuid_all(0,0,&eax,&ebx,&ecx,&edx); + max_stdfn = eax; + if (max_stdfn >= 0x1) { + /* have AVX and OSXSAVE? (implies XGETBV exists) */ + cpuid_all(0x1, 0, &eax, &ebx, &ecx, &edx); + if ((ecx & 0x18000000) == 0x18000000) { + /* have OS support for XMM, YMM? */ + res = ((xgetbv_eax(0) & 0x6) == 0x6); + } + } + init = 1; + } + return res; +} + +#endif + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx2.c new file mode 100644 index 000000000..e24064509 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx2.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_AVX2 + +#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) +# include "amd64-cpuid.h" +#else +# include "x86-cpuid.h" +#endif + +int X(have_simd_avx2_128)(void) +{ + static int init = 0, res; + int max_stdfn, eax, ebx, ecx, edx; + + if (!init) { + cpuid_all(0,0,&eax,&ebx,&ecx,&edx); + max_stdfn = eax; + if (max_stdfn >= 0x1) { + /* have AVX and OSXSAVE? (implies XGETBV exists) */ + cpuid_all(0x1, 0, &eax, &ebx, &ecx, &edx); + if ((ecx & 0x18000000) == 0x18000000) { + /* have AVX2? */ + cpuid_all(7,0,&eax,&ebx,&ecx,&edx); + if (ebx & (1 << 5)) { + /* have OS support for XMM, YMM? */ + res = ((xgetbv_eax(0) & 0x6) == 0x6); + } + } + } + init = 1; + } + return res; +} + +int X(have_simd_avx2)(void) +{ + /* + * For now 256-bit AVX2 support is identical to 128-bit. + * This might change in the future if AMD released AVX2-capable + * chips that work better with the 128-bit flavor, but since AMD + * might actually change it to implement 256-bit AVX2 efficiently + * by then we don't want to disable it before we know. + */ + return X(have_simd_avx2_128)(); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx512.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx512.c new file mode 100644 index 000000000..df94316a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/avx512.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * Copyright (c) 2012-2013 Romain Dolbeau + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "kernel/ifftw.h" + +#if HAVE_AVX512 + +#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) + +#include "amd64-cpuid.h" + +int X(have_simd_avx512)(void) +{ + static int init = 0, res; + int max_stdfn, eax, ebx, ecx, edx; + + /* NOTE: this code is a total guess. I don't have an avx512 + machine available. The code contributed by Erik Lindahl would + crash on a machine without XGETBV, so I had to guess a fix. */ + if (!init) { + cpuid_all(0,0,&eax,&ebx,&ecx,&edx); + max_stdfn = eax; + if (max_stdfn >= 0x1) { + /* have OSXSAVE? (implies XGETBV exists) */ + cpuid_all(0x1, 0, &eax, &ebx, &ecx, &edx); + if ((ecx & 0x08000000) == 0x08000000) { + /* have AVX512? */ + cpuid_all(7,0,&eax,&ebx,&ecx,&edx); + if (ebx & (1 << 16)) { + /* have OS support for XMM, YMM, ZMM */ + int zmm_ymm_xmm = (7 << 5) | (1 << 2) | (1 << 1); + res = ((xgetbv_eax(0) & zmm_ymm_xmm) == zmm_ymm_xmm); + } + } + } + init = 1; + } + + return res; +} + +#else /* 32-bit code */ + +#error "Avx512 is 64 bits only" + +#endif + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/kcvi.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/kcvi.c new file mode 100644 index 000000000..c223fc2e9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/kcvi.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * Copyright (c) 2012-2013 Romain Dolbeau + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "kernel/ifftw.h" + +#if HAVE_KCVI + +#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) + +#include "amd64-cpuid.h" + +int X(have_simd_kcvi)(void) +{ + static int init = 0, res; + if (!init) { + res = 1; + init = 1; + } + return res; +} + +#else /* 32-bit code */ + +#error "KCvi is 64 bits only" + +#endif + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/neon.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/neon.c new file mode 100644 index 000000000..196959ca7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/neon.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_NEON + +/* check for an environment where signals are known to work */ +#if defined(unix) || defined(linux) + # include + # include + + static jmp_buf jb; + + static void sighandler(int x) + { + UNUSED(x); + longjmp(jb, 1); + } + + static int really_have_neon(void) + { + void (*oldsig)(int); + oldsig = signal(SIGILL, sighandler); + if (setjmp(jb)) { + signal(SIGILL, oldsig); + return 0; + } else { + /* paranoia: encode the instruction in binary because the + assembler may not recognize it without -mfpu=neon */ + /*asm volatile ("vand q0, q0, q0");*/ + asm volatile (".long 0xf2000150"); + signal(SIGILL, oldsig); + return 1; + } + } + + int X(have_simd_neon)(void) + { + static int init = 0, res; + + if (!init) { + res = really_have_neon(); + init = 1; + } + return res; + } + + +#else +/* don't know how to autodetect NEON; assume it is present */ + int X(have_simd_neon)(void) + { + return 1; + } +#endif + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-altivec.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-altivec.h new file mode 100644 index 000000000..519f64b41 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-altivec.h @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef FFTW_SINGLE +#error "ALTIVEC only works in single precision" +#endif + +/* define these unconditionally, because they are used by + taint.c which is compiled without altivec */ +#define SIMD_SUFFIX _altivec /* for renaming */ +#define VL 2 /* SIMD complex vector length */ +#define SIMD_VSTRIDE_OKA(x) ((x) == 2) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OKA + +#if !defined(__VEC__) && !defined(FAKE__VEC__) +# error "compiling simd-altivec.h requires -maltivec or equivalent" +#endif + +#ifdef HAVE_ALTIVEC_H +# include +#endif + +typedef vector float V; +#define VLIT(x0, x1, x2, x3) {x0, x1, x2, x3} +#define LDK(x) x +#define DVK(var, val) const V var = VLIT(val, val, val, val) + +static inline V VADD(V a, V b) { return vec_add(a, b); } +static inline V VSUB(V a, V b) { return vec_sub(a, b); } +static inline V VFMA(V a, V b, V c) { return vec_madd(a, b, c); } +static inline V VFNMS(V a, V b, V c) { return vec_nmsub(a, b, c); } + +static inline V VMUL(V a, V b) +{ + DVK(zero, -0.0); + return VFMA(a, b, zero); +} + +static inline V VFMS(V a, V b, V c) { return VSUB(VMUL(a, b), c); } + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + UNUSED(ivs); + UNUSED(aligned_like); + return vec_ld(0, x); +} + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + /* common subexpressions */ + const INT fivs = sizeof(R) * ivs; + /* you are not expected to understand this: */ + const vector unsigned int perm = VLIT(0, 0, 0xFFFFFFFF, 0xFFFFFFFF); + vector unsigned char ml = vec_lvsr(fivs + 8, aligned_like); + vector unsigned char mh = vec_lvsl(0, aligned_like); + vector unsigned char msk = + (vector unsigned char)vec_sel((V)mh, (V)ml, perm); + /* end of common subexpressions */ + + return vec_perm(vec_ld(0, x), vec_ld(fivs, x), msk); +} + +/* store lower half */ +static inline void STH(R *x, V v, R *aligned_like) +{ + v = vec_perm(v, v, vec_lvsr(0, aligned_like)); + vec_ste(v, 0, x); + vec_ste(v, sizeof(R), x); +} + +static inline void STL(R *x, V v, INT ovs, R *aligned_like) +{ + const INT fovs = sizeof(R) * ovs; + v = vec_perm(v, v, vec_lvsr(fovs + 8, aligned_like)); + vec_ste(v, fovs, x); + vec_ste(v, sizeof(R) + fovs, x); +} + +static inline void STA(R *x, V v, INT ovs, R *aligned_like) +{ + UNUSED(ovs); + UNUSED(aligned_like); + vec_st(v, 0, x); +} + +static inline void ST(R *x, V v, INT ovs, R *aligned_like) +{ + /* WARNING: the extra_iter hack depends upon STH occurring after + STL */ + STL(x, v, ovs, aligned_like); + STH(x, v, aligned_like); +} + +#define STM2(x, v, ovs, aligned_like) /* no-op */ + +static inline void STN2(R *x, V v0, V v1, INT ovs) +{ + const INT fovs = sizeof(R) * ovs; + const vector unsigned int even = + VLIT(0x00010203, 0x04050607, 0x10111213, 0x14151617); + const vector unsigned int odd = + VLIT(0x08090a0b, 0x0c0d0e0f, 0x18191a1b, 0x1c1d1e1f); + vec_st(vec_perm(v0, v1, (vector unsigned char)even), 0, x); + vec_st(vec_perm(v0, v1, (vector unsigned char)odd), fovs, x); +} + +#define STM4(x, v, ovs, aligned_like) /* no-op */ + +static inline void STN4(R *x, V v0, V v1, V v2, V v3, INT ovs) +{ + const INT fovs = sizeof(R) * ovs; + V x0 = vec_mergeh(v0, v2); + V x1 = vec_mergel(v0, v2); + V x2 = vec_mergeh(v1, v3); + V x3 = vec_mergel(v1, v3); + V y0 = vec_mergeh(x0, x2); + V y1 = vec_mergel(x0, x2); + V y2 = vec_mergeh(x1, x3); + V y3 = vec_mergel(x1, x3); + vec_st(y0, 0, x); + vec_st(y1, fovs, x); + vec_st(y2, 2 * fovs, x); + vec_st(y3, 3 * fovs, x); +} + +static inline V FLIP_RI(V x) +{ + const vector unsigned int perm = + VLIT(0x04050607, 0x00010203, 0x0c0d0e0f, 0x08090a0b); + return vec_perm(x, x, (vector unsigned char)perm); +} + +static inline V VCONJ(V x) +{ + const V pmpm = VLIT(0.0, -0.0, 0.0, -0.0); + return vec_xor(x, pmpm); +} + +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} + +static inline V VFMAI(V b, V c) +{ + const V mpmp = VLIT(-1.0, 1.0, -1.0, 1.0); + return VFMA(FLIP_RI(b), mpmp, c); +} + +static inline V VFNMSI(V b, V c) +{ + const V mpmp = VLIT(-1.0, 1.0, -1.0, 1.0); + return VFNMS(FLIP_RI(b), mpmp, c); +} + +static inline V VFMACONJ(V b, V c) +{ + const V pmpm = VLIT(1.0, -1.0, 1.0, -1.0); + return VFMA(b, pmpm, c); +} + +static inline V VFNMSCONJ(V b, V c) +{ + const V pmpm = VLIT(1.0, -1.0, 1.0, -1.0); + return VFNMS(b, pmpm, c); +} + +static inline V VFMSCONJ(V b, V c) +{ + return VSUB(VCONJ(b), c); +} + +static inline V VZMUL(V tx, V sr) +{ + const vector unsigned int real = + VLIT(0x00010203, 0x00010203, 0x08090a0b, 0x08090a0b); + const vector unsigned int imag = + VLIT(0x04050607, 0x04050607, 0x0c0d0e0f, 0x0c0d0e0f); + V si = VBYI(sr); + V tr = vec_perm(tx, tx, (vector unsigned char)real); + V ti = vec_perm(tx, tx, (vector unsigned char)imag); + return VFMA(ti, si, VMUL(tr, sr)); +} + +static inline V VZMULJ(V tx, V sr) +{ + const vector unsigned int real = + VLIT(0x00010203, 0x00010203, 0x08090a0b, 0x08090a0b); + const vector unsigned int imag = + VLIT(0x04050607, 0x04050607, 0x0c0d0e0f, 0x0c0d0e0f); + V si = VBYI(sr); + V tr = vec_perm(tx, tx, (vector unsigned char)real); + V ti = vec_perm(tx, tx, (vector unsigned char)imag); + return VFNMS(ti, si, VMUL(tr, sr)); +} + +static inline V VZMULI(V tx, V si) +{ + const vector unsigned int real = + VLIT(0x00010203, 0x00010203, 0x08090a0b, 0x08090a0b); + const vector unsigned int imag = + VLIT(0x04050607, 0x04050607, 0x0c0d0e0f, 0x0c0d0e0f); + V sr = VBYI(si); + V tr = vec_perm(tx, tx, (vector unsigned char)real); + V ti = vec_perm(tx, tx, (vector unsigned char)imag); + return VFNMS(ti, si, VMUL(tr, sr)); +} + +static inline V VZMULIJ(V tx, V si) +{ + const vector unsigned int real = + VLIT(0x00010203, 0x00010203, 0x08090a0b, 0x08090a0b); + const vector unsigned int imag = + VLIT(0x04050607, 0x04050607, 0x0c0d0e0f, 0x0c0d0e0f); + V sr = VBYI(si); + V tr = vec_perm(tx, tx, (vector unsigned char)real); + V ti = vec_perm(tx, tx, (vector unsigned char)imag); + return VFMA(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #1: compact, slower */ +#define VTW1(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#define TWVL1 (VL) + +static inline V BYTW1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = VBYI(sr); + V tx = twp[0]; + V tr = vec_mergeh(tx, tx); + V ti = vec_mergel(tx, tx); + return VFMA(ti, si, VMUL(tr, sr)); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = VBYI(sr); + V tx = twp[0]; + V tr = vec_mergeh(tx, tx); + V ti = vec_mergel(tx, tx); + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(ti, si, VMUL(tr, sr)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +#define TWVL3 (VL) + +/* twiddle storage for split arrays */ +#define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx-128-fma.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx-128-fma.h new file mode 100644 index 000000000..5dcd963c6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx-128-fma.h @@ -0,0 +1,332 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * 128-bit AVX support by Erik Lindahl, 2015. + * Erik Lindahl hereby places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "AVX only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## s +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## d +#endif + +#define SIMD_SUFFIX _avx_128_fma /* for renaming */ +#define VL DS(1,2) /* SIMD vector length, in term of complex numbers */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +#include +#ifdef _MSC_VER +# include +#elif defined (__GNUC__) +# include +#endif + +#if !(defined(__AVX__) && defined(__FMA4__)) /* sanity check */ +#error "compiling simd-avx-128-fma.h without -mavx or -mfma4" +#endif + +typedef DS(__m128d,__m128) V; +#define VADD SUFF(_mm_add_p) +#define VSUB SUFF(_mm_sub_p) +#define VMUL SUFF(_mm_mul_p) +#define VXOR SUFF(_mm_xor_p) +#define SHUF SUFF(_mm_shuffle_p) +#define VPERM1 SUFF(_mm_permute_p) +#define UNPCKL SUFF(_mm_unpacklo_p) +#define UNPCKH SUFF(_mm_unpackhi_p) + +#define SHUFVALS(fp0,fp1,fp2,fp3) \ + (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) + +#define VDUPL(x) DS(_mm_permute_pd(x,0), _mm_moveldup_ps(x)) +#define VDUPH(x) DS(_mm_permute_pd(x,3), _mm_movehdup_ps(x)) +#define LOADH(addr, val) _mm_loadh_pi(val, (const __m64 *)(addr)) +#define LOADL(addr, val) _mm_loadl_pi(val, (const __m64 *)(addr)) +#define STOREH(a, v) DS(_mm_storeh_pd(a, v), _mm_storeh_pi((__m64 *)(a), v)) +#define STOREL(a, v) DS(_mm_storel_pd(a, v), _mm_storel_pi((__m64 *)(a), v)) + +#define VLIT(x0, x1) DS(_mm_set_pd(x0, x1), _mm_set_ps(x0, x1, x0, x1)) +#define DVK(var, val) V var = VLIT(val, val) +#define LDK(x) x + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return *(const V *)x; +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + *(V *)x = v; +} + +#ifdef FFTW_SINGLE + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + V var; +#if defined(__ICC) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ > 8) + var = LOADL(x, SUFF(_mm_undefined_p)()); + var = LOADH(x + ivs, var); +#else + var = LOADL(x, var); + var = LOADH(x + ivs, var); +#endif + return var; +} + +# ifdef _MSC_VER +# pragma warning(default : 4700) +# pragma runtime_checks("u", restore) +# endif + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon STOREL occurring + after STOREH */ + STOREH(x + ovs, v); + STOREL(x, v); +} + +#else /* ! FFTW_SINGLE */ +# define LD LDA +# define ST STA +#endif + +#define STM2 DS(STA,ST) +#define STN2(x, v0, v1, ovs) /* nop */ + +#ifdef FFTW_SINGLE +# define STM4(x, v, ovs, aligned_like) /* no-op */ +/* STN4 is a macro, not a function, thanks to Visual C++ developers + deciding "it would be infrequent that people would want to pass more + than 3 [__m128 parameters] by value." 3 parameters ought to be enough + for anybody. */ +# define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + xxx0 = UNPCKL(v0, v2); \ + xxx1 = UNPCKH(v0, v2); \ + xxx2 = UNPCKL(v1, v3); \ + xxx3 = UNPCKH(v1, v3); \ + STA(x, UNPCKL(xxx0, xxx2), 0, 0); \ + STA(x + ovs, UNPCKH(xxx0, xxx2), 0, 0); \ + STA(x + 2 * ovs, UNPCKL(xxx1, xxx3), 0, 0); \ + STA(x + 3 * ovs, UNPCKH(xxx1, xxx3), 0, 0); \ +} +#else /* !FFTW_SINGLE */ +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + STOREL(x, v); + STOREH(x + ovs, v); +} +# define STN4(x, v0, v1, v2, v3, ovs) /* nothing */ +#endif + +static inline V FLIP_RI(V x) +{ + return VPERM1(x, DS(1, SHUFVALS(1, 0, 3, 2))); +} + + +static inline V VCONJ(V x) +{ + /* Produce a SIMD vector[VL] of (0 + -0i). + + We really want to write this: + + V pmpm = VLIT(-0.0, 0.0); + + but historically some compilers have ignored the distiction + between +0 and -0. It looks like 'gcc-8 -fast-math' treats -0 + as 0 too. + */ + union uvec { + unsigned u[4]; + V v; + }; + static const union uvec pmpm = { +#ifdef FFTW_SINGLE + { 0x00000000, 0x80000000, 0x00000000, 0x80000000 } +#else + { 0x00000000, 0x00000000, 0x00000000, 0x80000000 } +#endif + }; + return VXOR(pmpm.v, x); +} + +static inline V VBYI(V x) +{ + x = VCONJ(x); + x = FLIP_RI(x); + return x; +} + +/* FMA support */ +#define VFMA(a, b, c) SUFF(_mm_macc_p)(a,b,c) +#define VFNMS(a, b, c) SUFF(_mm_nmacc_p)(a,b,c) +#define VFMS(a, b, c) SUFF(_mm_msub_p)(a,b,c) +#define VFMAI(b, c) SUFF(_mm_addsub_p)(c,FLIP_RI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) SUFF(_mm_addsub_p)(c,b) + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(tr, sr); + ti = VMUL(ti, FLIP_RI(sr)); + return SUFF(_mm_addsub_p)(tr,ti); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(tr, sr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + tr = VMUL(tr, FLIP_RI(sr)); + return SUFF(_mm_addsub_p)(ti,tr); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +static inline V BYTW1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V tx = twp[0]; + V tr = UNPCKL(tx, tx); + V ti = UNPCKH(tx, tx); + tr = VMUL(tr, sr); + ti = VMUL(ti, FLIP_RI(sr)); + return SUFF(_mm_addsub_p)(tr,ti); +} +static inline V BYTWJ1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V tx = twp[0]; + V tr = UNPCKL(tx, tx); + V ti = UNPCKH(tx, tx); + tr = VMUL(tr, sr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x} +static inline V BYTW1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMUL(tx, sr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMULJ(tx, sr); +} +#endif +#define TWVL1 (VL) + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_SIN, v, -x}, {TW_SIN, v, x} +#endif +#define TWVL2 (2 * VL) +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#ifdef FFTW_SINGLE +# define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +# define TWVL3 (VL) +#else +# define VTW3(v,x) VTW1(v,x) +# define TWVL3 TWVL1 +#endif + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx.h new file mode 100644 index 000000000..7ca63631a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx.h @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "AVX only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## s +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## d +#endif + +#define SIMD_SUFFIX _avx /* for renaming */ +#define VL DS(2, 4) /* SIMD complex vector length */ +#define SIMD_VSTRIDE_OKA(x) ((x) == 2) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#if defined(__GNUC__) && !defined(__AVX__) /* sanity check */ +#error "compiling simd-avx.h without -mavx" +#endif + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +#include + +typedef DS(__m256d, __m256) V; +#define VADD SUFF(_mm256_add_p) +#define VSUB SUFF(_mm256_sub_p) +#define VMUL SUFF(_mm256_mul_p) +#define VXOR SUFF(_mm256_xor_p) +#define VSHUF SUFF(_mm256_shuffle_p) + +#define SHUFVALD(fp0,fp1) \ + (((fp1) << 3) | ((fp0) << 2) | ((fp1) << 1) | ((fp0))) +#define SHUFVALS(fp0,fp1,fp2,fp3) \ + (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) + +#define VDUPL(x) DS(_mm256_unpacklo_pd(x, x), VSHUF(x, x, SHUFVALS(0, 0, 2, 2))) +#define VDUPH(x) DS(_mm256_unpackhi_pd(x, x), VSHUF(x, x, SHUFVALS(1, 1, 3, 3))) + +#define VLIT(x0, x1) DS(_mm256_set_pd(x0, x1, x0, x1), _mm256_set_ps(x0, x1, x0, x1, x0, x1, x0, x1)) +#define DVK(var, val) V var = VLIT(val, val) +#define LDK(x) x + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return SUFF(_mm256_loadu_p)(x); +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + SUFF(_mm256_storeu_p)(x, v); +} + +#if FFTW_SINGLE + +# ifdef _MSC_VER + /* Temporarily disable the warning "uninitialized local variable + 'name' used" and runtime checks for using a variable before it is + defined which is erroneously triggered by the LOADL0 / LOADH macros + as they only modify VAL partly each. */ +# ifndef __INTEL_COMPILER +# pragma warning(disable : 4700) +# pragma runtime_checks("u", off) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(disable : 592) +# endif + +#define LOADH(addr, val) _mm_loadh_pi(val, (const __m64 *)(addr)) +#define LOADL(addr, val) _mm_loadl_pi(val, (const __m64 *)(addr)) +#define STOREH(addr, val) _mm_storeh_pi((__m64 *)(addr), val) +#define STOREL(addr, val) _mm_storel_pi((__m64 *)(addr), val) + +/* it seems like the only AVX way to store 4 complex floats is to + extract two pairs of complex floats into two __m128 registers, and + then use SSE-like half-stores. Similarly, to load 4 complex + floats, we load two pairs of complex floats into two __m128 + registers, and then pack the two __m128 registers into one __m256 + value. */ +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + __m128 l, h; + V v; + (void)aligned_like; /* UNUSED */ + l = LOADL(x, l); + l = LOADH(x + ivs, l); + h = LOADL(x + 2*ivs, h); + h = LOADH(x + 3*ivs, h); + v = _mm256_castps128_ps256(l); + v = _mm256_insertf128_ps(v, h, 1); + return v; +} + +# ifdef _MSC_VER +# ifndef __INTEL_COMPILER +# pragma warning(default : 4700) +# pragma runtime_checks("u", restore) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(default : 592) +# endif + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + __m128 h = _mm256_extractf128_ps(v, 1); + __m128 l = _mm256_castps256_ps128(v); + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon STOREL occurring + after STOREH */ + STOREH(x + 3*ovs, h); + STOREL(x + 2*ovs, h); + STOREH(x + ovs, l); + STOREL(x, l); +} + +#define STM2(x, v, ovs, aligned_like) /* no-op */ +static inline void STN2(R *x, V v0, V v1, INT ovs) +{ + V x0 = VSHUF(v0, v1, SHUFVALS(0, 1, 0, 1)); + V x1 = VSHUF(v0, v1, SHUFVALS(2, 3, 2, 3)); + __m128 h0 = _mm256_extractf128_ps(x0, 1); + __m128 l0 = _mm256_castps256_ps128(x0); + __m128 h1 = _mm256_extractf128_ps(x1, 1); + __m128 l1 = _mm256_castps256_ps128(x1); + + *(__m128 *)(x + 3*ovs) = h1; + *(__m128 *)(x + 2*ovs) = h0; + *(__m128 *)(x + 1*ovs) = l1; + *(__m128 *)(x + 0*ovs) = l0; +} + +#define STM4(x, v, ovs, aligned_like) /* no-op */ +#define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + V yyy0, yyy1, yyy2, yyy3; \ + xxx0 = _mm256_unpacklo_ps(v0, v2); \ + xxx1 = _mm256_unpackhi_ps(v0, v2); \ + xxx2 = _mm256_unpacklo_ps(v1, v3); \ + xxx3 = _mm256_unpackhi_ps(v1, v3); \ + yyy0 = _mm256_unpacklo_ps(xxx0, xxx2); \ + yyy1 = _mm256_unpackhi_ps(xxx0, xxx2); \ + yyy2 = _mm256_unpacklo_ps(xxx1, xxx3); \ + yyy3 = _mm256_unpackhi_ps(xxx1, xxx3); \ + *(__m128 *)(x + 0 * ovs) = _mm256_castps256_ps128(yyy0); \ + *(__m128 *)(x + 4 * ovs) = _mm256_extractf128_ps(yyy0, 1); \ + *(__m128 *)(x + 1 * ovs) = _mm256_castps256_ps128(yyy1); \ + *(__m128 *)(x + 5 * ovs) = _mm256_extractf128_ps(yyy1, 1); \ + *(__m128 *)(x + 2 * ovs) = _mm256_castps256_ps128(yyy2); \ + *(__m128 *)(x + 6 * ovs) = _mm256_extractf128_ps(yyy2, 1); \ + *(__m128 *)(x + 3 * ovs) = _mm256_castps256_ps128(yyy3); \ + *(__m128 *)(x + 7 * ovs) = _mm256_extractf128_ps(yyy3, 1); \ +} + +#else +static inline __m128d VMOVAPD_LD(const R *x) +{ + /* gcc-4.6 miscompiles the combination _mm256_castpd128_pd256(VMOVAPD_LD(x)) + into a 256-bit vmovapd, which requires 32-byte aligment instead of + 16-byte alignment. + + Force the use of vmovapd via asm until compilers stabilize. + */ +#if defined(__GNUC__) + __m128d var; + __asm__("vmovapd %1, %0\n" : "=x"(var) : "m"(x[0])); + return var; +#else + return *(const __m128d *)x; +#endif +} + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + V var; + (void)aligned_like; /* UNUSED */ + var = _mm256_castpd128_pd256(VMOVAPD_LD(x)); + var = _mm256_insertf128_pd(var, *(const __m128d *)(x+ivs), 1); + return var; +} + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon the store of the low + part occurring after the store of the high part */ + *(__m128d *)(x + ovs) = _mm256_extractf128_pd(v, 1); + *(__m128d *)x = _mm256_castpd256_pd128(v); +} + + +#define STM2 ST +#define STN2(x, v0, v1, ovs) /* nop */ +#define STM4(x, v, ovs, aligned_like) /* no-op */ + +/* STN4 is a macro, not a function, thanks to Visual C++ developers + deciding "it would be infrequent that people would want to pass more + than 3 [__m128 parameters] by value." Even though the comment + was made about __m128 parameters, it appears to apply to __m256 + parameters as well. */ +#define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + xxx0 = _mm256_unpacklo_pd(v0, v1); \ + xxx1 = _mm256_unpackhi_pd(v0, v1); \ + xxx2 = _mm256_unpacklo_pd(v2, v3); \ + xxx3 = _mm256_unpackhi_pd(v2, v3); \ + STA(x, _mm256_permute2f128_pd(xxx0, xxx2, 0x20), 0, 0); \ + STA(x + ovs, _mm256_permute2f128_pd(xxx1, xxx3, 0x20), 0, 0); \ + STA(x + 2 * ovs, _mm256_permute2f128_pd(xxx0, xxx2, 0x31), 0, 0); \ + STA(x + 3 * ovs, _mm256_permute2f128_pd(xxx1, xxx3, 0x31), 0, 0); \ +} +#endif + +static inline V FLIP_RI(V x) +{ + return VSHUF(x, x, + DS(SHUFVALD(1, 0), + SHUFVALS(1, 0, 3, 2))); +} + +static inline V VCONJ(V x) +{ + /* Produce a SIMD vector[VL] of (0 + -0i). + + We really want to write this: + + V pmpm = VLIT(-0.0, 0.0); + + but historically some compilers have ignored the distiction + between +0 and -0. It looks like 'gcc-8 -fast-math' treats -0 + as 0 too. + */ + union uvec { + unsigned u[8]; + V v; + }; + static const union uvec pmpm = { +#ifdef FFTW_SINGLE + { 0x00000000, 0x80000000, 0x00000000, 0x80000000, + 0x00000000, 0x80000000, 0x00000000, 0x80000000 } +#else + { 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000 } +#endif + }; + return VXOR(pmpm.v, x); +} + +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} + +/* FMA support */ +#define VFMA(a, b, c) VADD(c, VMUL(a, b)) +#define VFNMS(a, b, c) VSUB(c, VMUL(a, b)) +#define VFMS(a, b, c) VSUB(VMUL(a, b), c) +#define VFMAI(b, c) VADD(c, VBYI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) VSUB(c, VCONJ(b)) + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x} +#else +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +#endif +#define TWVL1 (VL) + +static inline V BYTW1(const R *t, V sr) +{ + return VZMUL(LDA(t, 2, t), sr); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + return VZMULJ(LDA(t, 2, t), sr); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x} +#else +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#endif +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#define VTW3 VTW1 +#define TWVL3 TWVL1 + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, x}, {TW_SIN, v+5, x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#endif +#define TWVLS (2 * VL) + + +/* Use VZEROUPPER to avoid the penalty of switching from AVX to SSE. + See Intel Optimization Manual (April 2011, version 248966), Section + 11.3 */ +#define VLEAVE _mm256_zeroupper + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx2-128.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx2-128.h new file mode 100644 index 000000000..c1ab7ffe8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx2-128.h @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * 128-bit AVX2 support by Erik Lindahl, 2015. + * Erik Lindahl hereby places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "AVX2 only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## s +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## d +#endif + +#define SIMD_SUFFIX _avx2_128 /* for renaming */ +#define VL DS(1,2) /* SIMD vector length, in term of complex numbers */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#if defined(__GNUC__) && !defined(__AVX2__) /* sanity check */ +#error "compiling simd-avx2-128.h without avx2 support" +#endif + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +#include + +typedef DS(__m128d,__m128) V; +#define VADD SUFF(_mm_add_p) +#define VSUB SUFF(_mm_sub_p) +#define VMUL SUFF(_mm_mul_p) +#define VXOR SUFF(_mm_xor_p) +#define SHUF SUFF(_mm_shuffle_p) +#define VPERM1 SUFF(_mm_permute_p) +#define UNPCKL SUFF(_mm_unpacklo_p) +#define UNPCKH SUFF(_mm_unpackhi_p) + +#define SHUFVALS(fp0,fp1,fp2,fp3) \ + (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) + +#define VDUPL(x) DS(_mm_permute_pd(x,0), _mm_moveldup_ps(x)) +#define VDUPH(x) DS(_mm_permute_pd(x,3), _mm_movehdup_ps(x)) +#define LOADH(addr, val) _mm_loadh_pi(val, (const __m64 *)(addr)) +#define LOADL(addr, val) _mm_loadl_pi(val, (const __m64 *)(addr)) +#define STOREH(a, v) DS(_mm_storeh_pd(a, v), _mm_storeh_pi((__m64 *)(a), v)) +#define STOREL(a, v) DS(_mm_storel_pd(a, v), _mm_storel_pi((__m64 *)(a), v)) + +#define VLIT(x0, x1) DS(_mm_set_pd(x0, x1), _mm_set_ps(x0, x1, x0, x1)) +#define DVK(var, val) V var = VLIT(val, val) +#define LDK(x) x + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return *(const V *)x; +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + *(V *)x = v; +} + +#ifdef FFTW_SINGLE + +# ifdef _MSC_VER + /* Temporarily disable the warning "uninitialized local variable + 'name' used" and runtime checks for using a variable before it is + defined which is erroneously triggered by the LOADL0 / LOADH macros + as they only modify VAL partly each. */ +# ifndef __INTEL_COMPILER +# pragma warning(disable : 4700) +# pragma runtime_checks("u", off) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(disable : 592) +# endif + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + __m128 l0, l1; + (void)aligned_like; /* UNUSED */ +#if defined(__ICC) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ > 8) + l0 = LOADL(x, SUFF(_mm_undefined_p)()); + l1 = LOADL(x + ivs, SUFF(_mm_undefined_p)()); +#else + l0 = LOADL(x, l0); + l1 = LOADL(x + ivs, l1); +#endif + return SUFF(_mm_movelh_p)(l0,l1); +} + +# ifdef _MSC_VER +# ifndef __INTEL_COMPILER +# pragma warning(default : 4700) +# pragma runtime_checks("u", restore) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(default : 592) +# endif + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon STOREL occurring + after STOREH */ + STOREH(x + ovs, v); + STOREL(x, v); +} + +#else /* ! FFTW_SINGLE */ +# define LD LDA +# define ST STA +#endif + +#define STM2 DS(STA,ST) +#define STN2(x, v0, v1, ovs) /* nop */ + +#ifdef FFTW_SINGLE +# define STM4(x, v, ovs, aligned_like) /* no-op */ +/* STN4 is a macro, not a function, thanks to Visual C++ developers + deciding "it would be infrequent that people would want to pass more + than 3 [__m128 parameters] by value." 3 parameters ought to be enough + for anybody. */ +# define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + xxx0 = UNPCKL(v0, v2); \ + xxx1 = UNPCKH(v0, v2); \ + xxx2 = UNPCKL(v1, v3); \ + xxx3 = UNPCKH(v1, v3); \ + STA(x, UNPCKL(xxx0, xxx2), 0, 0); \ + STA(x + ovs, UNPCKH(xxx0, xxx2), 0, 0); \ + STA(x + 2 * ovs, UNPCKL(xxx1, xxx3), 0, 0); \ + STA(x + 3 * ovs, UNPCKH(xxx1, xxx3), 0, 0); \ +} +#else /* !FFTW_SINGLE */ +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + STOREL(x, v); + STOREH(x + ovs, v); +} +# define STN4(x, v0, v1, v2, v3, ovs) /* nothing */ +#endif + +static inline V FLIP_RI(V x) +{ + return VPERM1(x, DS(1, SHUFVALS(1, 0, 3, 2))); +} + +static inline V VCONJ(V x) +{ + /* Produce a SIMD vector[VL] of (0 + -0i). + + We really want to write this: + + V pmpm = VLIT(-0.0, 0.0); + + but historically some compilers have ignored the distiction + between +0 and -0. It looks like 'gcc-8 -fast-math' treats -0 + as 0 too. + */ + union uvec { + unsigned u[4]; + V v; + }; + static const union uvec pmpm = { +#ifdef FFTW_SINGLE + { 0x00000000, 0x80000000, 0x00000000, 0x80000000 } +#else + { 0x00000000, 0x00000000, 0x00000000, 0x80000000 } +#endif + }; + return VXOR(pmpm.v, x); +} + +static inline V VBYI(V x) +{ + x = VCONJ(x); + x = FLIP_RI(x); + return x; +} + +/* FMA support */ +#define VFMA(a, b, c) SUFF(_mm_fmadd_p)(a,b,c) +#define VFNMS(a, b, c) SUFF(_mm_fnmadd_p)(a,b,c) +#define VFMS(a, b, c) SUFF(_mm_fmsub_p)(a,b,c) +#define VFMAI(b, c) SUFF(_mm_addsub_p)(c,FLIP_RI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) SUFF(_mm_addsub_p)(c,b) + + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, FLIP_RI(sr)); + return SUFF(_mm_fmaddsub_p)(tr,sr,ti); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, FLIP_RI(sr)); + return SUFF(_mm_fmsubadd_p)(tr,sr,ti); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(tr, FLIP_RI(sr)); + return SUFF(_mm_fmaddsub_p)(ti,sr,tr); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +static inline V BYTW1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V tx = twp[0]; + V tr = UNPCKL(tx, tx); + V ti = UNPCKH(tx, tx); + ti = VMUL(ti, FLIP_RI(sr)); + return SUFF(_mm_fmaddsub_p)(tr,sr,ti); +} +static inline V BYTWJ1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V tx = twp[0]; + V tr = UNPCKL(tx, tx); + V ti = UNPCKH(tx, tx); + ti = VMUL(ti, FLIP_RI(sr)); + return SUFF(_mm_fmsubadd_p)(tr,sr,ti); +} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x} +static inline V BYTW1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMUL(tx, sr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMULJ(tx, sr); +} +#endif +#define TWVL1 (VL) + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_SIN, v, -x}, {TW_SIN, v, x} +#endif +#define TWVL2 (2 * VL) +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#ifdef FFTW_SINGLE +# define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +# define TWVL3 (VL) +#else +# define VTW3(v,x) VTW1(v,x) +# define TWVL3 TWVL1 +#endif + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx2.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx2.h new file mode 100644 index 000000000..5217026a3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx2.h @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * Modifications by Romain Dolbeau & Erik Lindahl, derived from simd-avx.h + * Romain Dolbeau hereby places his modifications in the public domain. + * Erik Lindahl hereby places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "AVX2 only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## s +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## d +#endif + +#define SIMD_SUFFIX _avx2 /* for renaming */ +#define VL DS(2, 4) /* SIMD complex vector length */ +#define SIMD_VSTRIDE_OKA(x) ((x) == 2) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#if defined(__GNUC__) && !defined(__AVX2__) /* sanity check */ +#error "compiling simd-avx2.h without avx2 support" +#endif + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +#include + +typedef DS(__m256d, __m256) V; +#define VADD SUFF(_mm256_add_p) +#define VSUB SUFF(_mm256_sub_p) +#define VMUL SUFF(_mm256_mul_p) +#define VXOR SUFF(_mm256_xor_p) +#define VSHUF SUFF(_mm256_shuffle_p) +#define VPERM1 SUFF(_mm256_permute_p) + +#define SHUFVALD(fp0,fp1) \ + (((fp1) << 3) | ((fp0) << 2) | ((fp1) << 1) | ((fp0))) +#define SHUFVALS(fp0,fp1,fp2,fp3) \ + (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) + +#define VDUPL(x) DS(_mm256_movedup_pd(x), _mm256_moveldup_ps(x)) +#define VDUPH(x) DS(_mm256_permute_pd(x,SHUFVALD(1,1)), _mm256_movehdup_ps(x)) + +#define VLIT(x0, x1) DS(_mm256_set_pd(x0, x1, x0, x1), _mm256_set_ps(x0, x1, x0, x1, x0, x1, x0, x1)) +#define DVK(var, val) V var = VLIT(val, val) +#define LDK(x) x + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return SUFF(_mm256_loadu_p)(x); +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + SUFF(_mm256_storeu_p)(x, v); +} + +#if FFTW_SINGLE + +# ifdef _MSC_VER + /* Temporarily disable the warning "uninitialized local variable + 'name' used" and runtime checks for using a variable before it is + defined which is erroneously triggered by the LOADL0 / LOADH macros + as they only modify VAL partly each. */ +# ifndef __INTEL_COMPILER +# pragma warning(disable : 4700) +# pragma runtime_checks("u", off) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(disable : 592) +# endif + +#define LOADH(addr, val) _mm_loadh_pi(val, (const __m64 *)(addr)) +#define LOADL(addr, val) _mm_loadl_pi(val, (const __m64 *)(addr)) +#define STOREH(addr, val) _mm_storeh_pi((__m64 *)(addr), val) +#define STOREL(addr, val) _mm_storel_pi((__m64 *)(addr), val) + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + __m128 l0, l1, h0, h1; + (void)aligned_like; /* UNUSED */ +#if defined(__ICC) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ > 8) + l0 = LOADL(x, SUFF(_mm_undefined_p)()); + l1 = LOADL(x + ivs, SUFF(_mm_undefined_p)()); + h0 = LOADL(x + 2*ivs, SUFF(_mm_undefined_p)()); + h1 = LOADL(x + 3*ivs, SUFF(_mm_undefined_p)()); +#else + l0 = LOADL(x, l0); + l1 = LOADL(x + ivs, l1); + h0 = LOADL(x + 2*ivs, h0); + h1 = LOADL(x + 3*ivs, h1); +#endif + l0 = SUFF(_mm_movelh_p)(l0,l1); + h0 = SUFF(_mm_movelh_p)(h0,h1); + return _mm256_insertf128_ps(_mm256_castps128_ps256(l0), h0, 1); +} + +# ifdef _MSC_VER +# ifndef __INTEL_COMPILER +# pragma warning(default : 4700) +# pragma runtime_checks("u", restore) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(default : 592) +# endif + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + __m128 h = _mm256_extractf128_ps(v, 1); + __m128 l = _mm256_castps256_ps128(v); + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon STOREL occurring + after STOREH */ + STOREH(x + 3*ovs, h); + STOREL(x + 2*ovs, h); + STOREH(x + ovs, l); + STOREL(x, l); +} + +#define STM2(x, v, ovs, aligned_like) /* no-op */ +static inline void STN2(R *x, V v0, V v1, INT ovs) +{ + V x0 = VSHUF(v0, v1, SHUFVALS(0, 1, 0, 1)); + V x1 = VSHUF(v0, v1, SHUFVALS(2, 3, 2, 3)); + __m128 h0 = _mm256_extractf128_ps(x0, 1); + __m128 l0 = _mm256_castps256_ps128(x0); + __m128 h1 = _mm256_extractf128_ps(x1, 1); + __m128 l1 = _mm256_castps256_ps128(x1); + *(__m128 *)(x + 3*ovs) = h1; + *(__m128 *)(x + 2*ovs) = h0; + *(__m128 *)(x + 1*ovs) = l1; + *(__m128 *)(x + 0*ovs) = l0; +} + +#define STM4(x, v, ovs, aligned_like) /* no-op */ +#define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + V yyy0, yyy1, yyy2, yyy3; \ + xxx0 = _mm256_unpacklo_ps(v0, v2); \ + xxx1 = _mm256_unpackhi_ps(v0, v2); \ + xxx2 = _mm256_unpacklo_ps(v1, v3); \ + xxx3 = _mm256_unpackhi_ps(v1, v3); \ + yyy0 = _mm256_unpacklo_ps(xxx0, xxx2); \ + yyy1 = _mm256_unpackhi_ps(xxx0, xxx2); \ + yyy2 = _mm256_unpacklo_ps(xxx1, xxx3); \ + yyy3 = _mm256_unpackhi_ps(xxx1, xxx3); \ + *(__m128 *)(x + 0 * ovs) = _mm256_castps256_ps128(yyy0); \ + *(__m128 *)(x + 4 * ovs) = _mm256_extractf128_ps(yyy0, 1); \ + *(__m128 *)(x + 1 * ovs) = _mm256_castps256_ps128(yyy1); \ + *(__m128 *)(x + 5 * ovs) = _mm256_extractf128_ps(yyy1, 1); \ + *(__m128 *)(x + 2 * ovs) = _mm256_castps256_ps128(yyy2); \ + *(__m128 *)(x + 6 * ovs) = _mm256_extractf128_ps(yyy2, 1); \ + *(__m128 *)(x + 3 * ovs) = _mm256_castps256_ps128(yyy3); \ + *(__m128 *)(x + 7 * ovs) = _mm256_extractf128_ps(yyy3, 1); \ +} + +#else +static inline __m128d VMOVAPD_LD(const R *x) +{ + /* gcc-4.6 miscompiles the combination _mm256_castpd128_pd256(VMOVAPD_LD(x)) + into a 256-bit vmovapd, which requires 32-byte aligment instead of + 16-byte alignment. + + Force the use of vmovapd via asm until compilers stabilize. + */ +#if defined(__GNUC__) + __m128d var; + __asm__("vmovapd %1, %0\n" : "=x"(var) : "m"(x[0])); + return var; +#else + return *(const __m128d *)x; +#endif +} + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + V var; + (void)aligned_like; /* UNUSED */ + var = _mm256_castpd128_pd256(VMOVAPD_LD(x)); + var = _mm256_insertf128_pd(var, *(const __m128d *)(x+ivs), 1); + return var; +} + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon the store of the low + part occurring after the store of the high part */ + *(__m128d *)(x + ovs) = _mm256_extractf128_pd(v, 1); + *(__m128d *)x = _mm256_castpd256_pd128(v); +} + + +#define STM2 ST +#define STN2(x, v0, v1, ovs) /* nop */ +#define STM4(x, v, ovs, aligned_like) /* no-op */ + +/* STN4 is a macro, not a function, thanks to Visual C++ developers + deciding "it would be infrequent that people would want to pass more + than 3 [__m128 parameters] by value." Even though the comment + was made about __m128 parameters, it appears to apply to __m256 + parameters as well. */ +#define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + xxx0 = _mm256_unpacklo_pd(v0, v1); \ + xxx1 = _mm256_unpackhi_pd(v0, v1); \ + xxx2 = _mm256_unpacklo_pd(v2, v3); \ + xxx3 = _mm256_unpackhi_pd(v2, v3); \ + STA(x, _mm256_permute2f128_pd(xxx0, xxx2, 0x20), 0, 0); \ + STA(x + ovs, _mm256_permute2f128_pd(xxx1, xxx3, 0x20), 0, 0); \ + STA(x + 2 * ovs, _mm256_permute2f128_pd(xxx0, xxx2, 0x31), 0, 0); \ + STA(x + 3 * ovs, _mm256_permute2f128_pd(xxx1, xxx3, 0x31), 0, 0); \ +} +#endif + +static inline V FLIP_RI(V x) +{ + return VPERM1(x, DS(SHUFVALD(1, 0), SHUFVALS(1, 0, 3, 2))); +} + +static inline V VCONJ(V x) +{ + /* Produce a SIMD vector[VL] of (0 + -0i). + + We really want to write this: + + V pmpm = VLIT(-0.0, 0.0); + + but historically some compilers have ignored the distiction + between +0 and -0. It looks like 'gcc-8 -fast-math' treats -0 + as 0 too. + */ + union uvec { + unsigned u[8]; + V v; + }; + static const union uvec pmpm = { +#ifdef FFTW_SINGLE + { 0x00000000, 0x80000000, 0x00000000, 0x80000000, + 0x00000000, 0x80000000, 0x00000000, 0x80000000 } +#else + { 0x00000000, 0x00000000, 0x00000000, 0x80000000, + 0x00000000, 0x00000000, 0x00000000, 0x80000000 } +#endif + }; + return VXOR(pmpm.v, x); +} + +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} + +/* FMA support */ +#define VFMA SUFF(_mm256_fmadd_p) +#define VFNMS SUFF(_mm256_fnmadd_p) +#define VFMS SUFF(_mm256_fmsub_p) +#define VFMAI(b, c) SUFF(_mm256_addsub_p)(c, FLIP_RI(b)) /* VADD(c, VBYI(b)) */ +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) SUFF(_mm256_addsub_p)(c, b) /* VSUB(c, VCONJ(b)) */ + +static inline V VZMUL(V tx, V sr) +{ + /* V tr = VDUPL(tx); */ + /* V ti = VDUPH(tx); */ + /* tr = VMUL(sr, tr); */ + /* sr = VBYI(sr); */ + /* return VFMA(ti, sr, tr); */ + return SUFF(_mm256_fmaddsub_p)(sr, VDUPL(tx), VMUL(FLIP_RI(sr), VDUPH(tx))); +} + +static inline V VZMULJ(V tx, V sr) +{ + /* V tr = VDUPL(tx); */ + /* V ti = VDUPH(tx); */ + /* tr = VMUL(sr, tr); */ + /* sr = VBYI(sr); */ + /* return VFNMS(ti, sr, tr); */ + return SUFF(_mm256_fmsubadd_p)(sr, VDUPL(tx), VMUL(FLIP_RI(sr), VDUPH(tx))); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); + /* + * Keep the old version + * (2 permute, 1 shuffle, 1 constant load (L1), 1 xor, 2 fp), since the below FMA one + * would be 2 permute, 1 shuffle, 1 xor (setzero), 3 fp), but with a longer pipeline. + * + * Alternative new fma version: + * return SUFF(_mm256_addsub_p)(SUFF(_mm256_fnmadd_p)(sr, VDUPH(tx), SUFF(_mm256_setzero_p)()), + * VMUL(FLIP_RI(sr), VDUPL(tx))); + */ +} + +static inline V VZMULIJ(V tx, V sr) +{ + /* V tr = VDUPL(tx); */ + /* V ti = VDUPH(tx); */ + /* ti = VMUL(ti, sr); */ + /* sr = VBYI(sr); */ + /* return VFMA(tr, sr, ti); */ + return SUFF(_mm256_fmaddsub_p)(sr, VDUPH(tx), VMUL(FLIP_RI(sr), VDUPL(tx))); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x} +#else +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +#endif +#define TWVL1 (VL) + +static inline V BYTW1(const R *t, V sr) +{ + return VZMUL(LDA(t, 2, t), sr); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + return VZMULJ(LDA(t, 2, t), sr); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x} +#else +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#endif +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#define VTW3 VTW1 +#define TWVL3 TWVL1 + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, x}, {TW_SIN, v+5, x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE _mm256_zeroupper + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx512.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx512.h new file mode 100644 index 000000000..47b60e942 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-avx512.h @@ -0,0 +1,316 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * + * AVX-512 support implemented by Romain Dolbeau. + * Romain Dolbeau hereby places his modifications in the public domain. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "AVX-512 vector instructions only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## _ps +# define SCAL(x) x ## f +#else /* !FFTW_SINGLE */ +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## _pd +# define SCAL(x) x +#endif /* FFTW_SINGLE */ + +#define SIMD_SUFFIX _avx512 /* for renaming */ +#define VL DS(4, 8) /* SIMD complex vector length */ +#define SIMD_VSTRIDE_OKA(x) ((x) == 2) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#if defined(__GNUC__) && !defined(__AVX512F__) /* sanity check */ +#error "compiling simd-avx512.h without avx-512f support" +#endif + +#if !defined(HAVE_AVX2) +#warning "You should probably enable AVX2 with --enable-avx2 for AVX-512" +#endif + +#include + +typedef DS(__m512d, __m512) V; + +#define VLIT(re, im) DS(SUFF(_mm512_setr)(im, re, im, re, im, re, im, re),SUFF(_mm512_setr)(im, re, im, re, im, re, im, re, im, re, im, re, im, re, im, re)) +#define VLIT1(val) SUFF(_mm512_set1)(val) +#define LDK(x) x +#define DVK(var, val) V var = VLIT1(val) +#define VZERO SUFF(_mm512_setzero)() + +#define VDUPL(x) DS(_mm512_movedup_pd(x),_mm512_moveldup_ps(x)) +#define VDUPH(x) DS(_mm512_unpackhi_pd(x, x),_mm512_movehdup_ps(x)) +#define FLIP_RI(x) SUFF(_mm512_shuffle)(x, x, DS(0x55,0xB1)) +#define VCONJ(x) SUFF(_mm512_fmsubadd)(VZERO, VZERO, x) +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} + +#define VADD(a,b) SUFF(_mm512_add)(a,b) +#define VSUB(a,b) SUFF(_mm512_sub)(a,b) +#define VMUL(a,b) SUFF(_mm512_mul)(a,b) +#define VFMA(a, b, c) SUFF(_mm512_fmadd)(a, b, c) +#define VFMS(a, b, c) SUFF(_mm512_fmsub)(a, b, c) +#define VFNMS(a, b, c) SUFF(_mm512_fnmadd)(a, b, c) +#define VFMAI(b, c) SUFF(_mm512_fmaddsub)(VLIT1(1.), c, FLIP_RI(b)) +#define VFNMSI(b, c) SUFF(_mm512_fmsubadd)(VLIT1(1.), c, FLIP_RI(b)) +#define VFMACONJ(b,c) SUFF(_mm512_fmsubadd)(VLIT1(1.), c, b) +#define VFMSCONJ(b,c) SUFF(_mm512_fmsubadd)(VLIT1(-1.), c, b) +#define VFNMSCONJ(b,c) SUFF(_mm512_fmaddsub)(VLIT1(1.), c, b) + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) { + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return SUFF(_mm512_loadu)(x); +} +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) { + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + SUFF(_mm512_storeu)(x, v); +} + +#if FFTW_SINGLE + +static inline V LDu(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(7 * ivs + 1, 7 * ivs, + 6 * ivs + 1, 6 * ivs, + 5 * ivs + 1, 5 * ivs, + 4 * ivs + 1, 4 * ivs, + 3 * ivs + 1, 3 * ivs, + 2 * ivs + 1, 2 * ivs, + 1 * ivs + 1, 1 * ivs, + 0 * ivs + 1, 0 * ivs); + + return _mm512_i32gather_ps(index, x, 4); +} + +static inline void STu(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(7 * ovs + 1, 7 * ovs, + 6 * ovs + 1, 6 * ovs, + 5 * ovs + 1, 5 * ovs, + 4 * ovs + 1, 4 * ovs, + 3 * ovs + 1, 3 * ovs, + 2 * ovs + 1, 2 * ovs, + 1 * ovs + 1, 1 * ovs, + 0 * ovs + 1, 0 * ovs); + + _mm512_i32scatter_ps(x, index, v, 4); +} + +#else /* !FFTW_SINGLE */ + +static inline V LDu(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m256i index = _mm256_set_epi32(3 * ivs + 1, 3 * ivs, + 2 * ivs + 1, 2 * ivs, + 1 * ivs + 1, 1 * ivs, + 0 * ivs + 1, 0 * ivs); + + return _mm512_i32gather_pd(index, x, 8); +} + +static inline void STu(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m256i index = _mm256_set_epi32(3 * ovs + 1, 3 * ovs, + 2 * ovs + 1, 2 * ovs, + 1 * ovs + 1, 1 * ovs, + 0 * ovs + 1, 0 * ovs); + + _mm512_i32scatter_pd(x, index, v, 8); +} + +#endif /* FFTW_SINGLE */ + +#define LD LDu +#define ST STu + +#ifdef FFTW_SINGLE +#define STM2(x, v, ovs, a) ST(x, v, ovs, a) +#define STN2(x, v0, v1, ovs) /* nop */ + +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(15 * ovs, 14 * ovs, + 13 * ovs, 12 * ovs, + 11 * ovs, 10 * ovs, + 9 * ovs, 8 * ovs, + 7 * ovs, 6 * ovs, + 5 * ovs, 4 * ovs, + 3 * ovs, 2 * ovs, + 1 * ovs, 0 * ovs); + + _mm512_i32scatter_ps(x, index, v, 4); +} +#define STN4(x, v0, v1, v2, v3, ovs) /* no-op */ +#else /* !FFTW_SINGLE */ +#define STM2(x, v, ovs, a) ST(x, v, ovs, a) +#define STN2(x, v0, v1, ovs) /* nop */ + +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m256i index = _mm256_set_epi32(7 * ovs, 6 * ovs, + 5 * ovs, 4 * ovs, + 3 * ovs, 2 * ovs, + 1 * ovs, 0 * ovs); + + _mm512_i32scatter_pd(x, index, v, 8); +} +#define STN4(x, v0, v1, v2, v3, ovs) /* no-op */ +#endif /* FFTW_SINGLE */ + +static inline V VZMUL(V tx, V sr) +{ + /* V tr = VDUPL(tx); */ + /* V ti = VDUPH(tx); */ + /* tr = VMUL(sr, tr); */ + /* sr = VBYI(sr); */ + /* return VFMA(ti, sr, tr); */ + return SUFF(_mm512_fmaddsub)(sr, VDUPL(tx), VMUL(FLIP_RI(sr), VDUPH(tx))); +} + +static inline V VZMULJ(V tx, V sr) +{ + /* V tr = VDUPL(tx); */ + /* V ti = VDUPH(tx); */ + /* tr = VMUL(sr, tr); */ + /* sr = VBYI(sr); */ + /* return VFNMS(ti, sr, tr); */ + return SUFF(_mm512_fmsubadd)(sr, VDUPL(tx), VMUL(FLIP_RI(sr), VDUPH(tx))); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); + /* return SUFF(_mm512_addsub)(SUFF(_mm512_fnmadd)(sr, VDUPH(tx), VZERO), VMUL(FLIP_RI(sr), VDUPL(tx))); */ +} + +static inline V VZMULIJ(V tx, V sr) +{ + /* V tr = VDUPL(tx); */ + /* V ti = VDUPH(tx); */ + /* ti = VMUL(ti, sr); */ + /* sr = VBYI(sr); */ + /* return VFMA(tr, sr, ti); */ + return SUFF(_mm512_fmaddsub)(sr, VDUPH(tx), VMUL(FLIP_RI(sr), VDUPL(tx))); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x}, {TW_CEXP, v+4, x}, {TW_CEXP, v+5, x}, {TW_CEXP, v+6, x}, {TW_CEXP, v+7, x} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x} +#endif /* FFTW_SINGLE */ +#define TWVL1 (VL) + +static inline V BYTW1(const R *t, V sr) +{ + return VZMUL(LDA(t, 2, t), sr); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + return VZMULJ(LDA(t, 2, t), sr); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v , x}, {TW_COS, v , x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+5, x}, \ + {TW_COS, v+6, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v , -x}, {TW_SIN, v , x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, -x}, {TW_SIN, v+4, x}, {TW_SIN, v+5, -x}, {TW_SIN, v+5, x}, \ + {TW_SIN, v+6, -x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, -x}, {TW_SIN, v+7, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v , x}, {TW_COS, v , x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v , -x}, {TW_SIN, v , x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x} +#endif /* FFTW_SINGLE */ +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; +/* V tr = LD(t, 2, t), ti = LD(t + VL, 2, t + VL); */ + return VFMA(tr, sr, VMUL(ti, si)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; +/* V tr = LD(t, 2, t), ti = LD(t + VL, 2, t + VL); */ + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#define VTW3(v,x) VTW1(v,x) +#define TWVL3 TWVL1 + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v , x}, {TW_COS, v+1 , x}, {TW_COS, v+2 , x}, {TW_COS, v+3 , x}, \ + {TW_COS, v+4 , x}, {TW_COS, v+5 , x}, {TW_COS, v+6 , x}, {TW_COS, v+7 , x}, \ + {TW_COS, v+8 , x}, {TW_COS, v+9 , x}, {TW_COS, v+10, x}, {TW_COS, v+11, x}, \ + {TW_COS, v+12, x}, {TW_COS, v+13, x}, {TW_COS, v+14, x}, {TW_COS, v+15, x}, \ + {TW_SIN, v , x}, {TW_SIN, v+1 , x}, {TW_SIN, v+2 , x}, {TW_SIN, v+3 , x}, \ + {TW_SIN, v+4 , x}, {TW_SIN, v+5 , x}, {TW_SIN, v+6 , x}, {TW_SIN, v+7 , x}, \ + {TW_SIN, v+8 , x}, {TW_SIN, v+9 , x}, {TW_SIN, v+10, x}, {TW_SIN, v+11, x}, \ + {TW_SIN, v+12, x}, {TW_SIN, v+13, x}, {TW_SIN, v+14, x}, {TW_SIN, v+15, x} +#else /* !FFTW_SINGLE */ +# define VTWS(v,x) \ + {TW_COS, v , x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v , x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, x}, {TW_SIN, v+5, x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, x} +#endif /* FFTW_SINGLE */ +#define TWVLS (2 * VL) + +#define VLEAVE _mm256_zeroupper + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-common.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-common.h new file mode 100644 index 000000000..90031fd6a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-common.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* detection of alignment. This is complicated because a machine may + support multiple SIMD extensions (e.g. SSE2 and AVX) but only one + set of alignment contraints. So this alignment stuff cannot be + defined in the SIMD header files. Rather than defining a separate + set of "machine" header files, we just do this ugly ifdef here. */ +#if defined(HAVE_AVX512) +# if defined(FFTW_SINGLE) +# define ALIGNMENT 8 /* Alignment for the LD/ST macros */ +# define ALIGNMENTA 64 /* Alignment for the LDA/STA macros */ +# else +# define ALIGNMENT 16 /* Alignment for the LD/ST macros */ +# define ALIGNMENTA 64 /* Alignment for the LDA/STA macros */ +# endif +#elif defined(HAVE_SSE2) || defined(HAVE_AVX) || defined(HAVE_AVX2) || (HAVE_AVX_128_FMA) +# if defined(FFTW_SINGLE) +# define ALIGNMENT 8 /* Alignment for the LD/ST macros */ +# define ALIGNMENTA 16 /* Alignment for the LDA/STA macros */ +# else +# define ALIGNMENT 16 /* Alignment for the LD/ST macros */ +# define ALIGNMENTA 16 /* Alignment for the LDA/STA macros */ +# endif +#elif defined(HAVE_ALTIVEC) +# define ALIGNMENT 8 /* Alignment for the LD/ST macros */ +# define ALIGNMENTA 16 /* Alignment for the LDA/STA macros */ +#elif defined(HAVE_NEON) || defined(HAVE_VSX) +# define ALIGNMENT 8 /* Alignment for the LD/ST macros */ +# define ALIGNMENTA 8 /* Alignment for the LDA/STA macros */ +#elif defined(HAVE_KCVI) +# if defined(FFTW_SINGLE) +# define ALIGNMENT 8 /* Alignment for the LD/ST macros */ +# else +# define ALIGNMENT 16 /* Alignment for the LD/ST macros */ +# endif +# define ALIGNMENTA 64 /* Alignment for the LDA/STA macros */ +#elif defined(HAVE_GENERIC_SIMD256) +# if defined(FFTW_SINGLE) +# define ALIGNMENT 8 +# define ALIGNMENTA 32 +# else +# define ALIGNMENT 16 +# define ALIGNMENTA 32 +# endif +#elif defined(HAVE_GENERIC_SIMD128) +# if defined(FFTW_SINGLE) +# define ALIGNMENT 8 +# define ALIGNMENTA 16 +# else +# define ALIGNMENT 16 +# define ALIGNMENTA 16 +# endif +#endif + +#if HAVE_SIMD +# ifndef ALIGNMENT +# error "ALIGNMENT not defined" +# endif +# ifndef ALIGNMENTA +# error "ALIGNMENTA not defined" +# endif +#endif + +/* rename for precision and for SIMD extensions */ +#define XSIMD0(name, suffix) CONCAT(name, suffix) +#define XSIMD(name) XSIMD0(X(name), SIMD_SUFFIX) +#define XSIMD_STRING(x) x STRINGIZE(SIMD_SUFFIX) + +/* TAINT_BIT is set if pointers are not guaranteed to be multiples of + ALIGNMENT */ +#define TAINT_BIT 1 + +/* TAINT_BITA is set if pointers are not guaranteed to be multiples of + ALIGNMENTA */ +#define TAINT_BITA 2 + +#define PTRINT(p) ((uintptr_t)(p)) + +#define ALIGNED(p) \ + (((PTRINT(UNTAINT(p)) % ALIGNMENT) == 0) && !(PTRINT(p) & TAINT_BIT)) + +#define ALIGNEDA(p) \ + (((PTRINT(UNTAINT(p)) % ALIGNMENTA) == 0) && !(PTRINT(p) & TAINT_BITA)) + +#define SIMD_STRIDE_OK(x) (!(((x) * sizeof(R)) % ALIGNMENT)) +#define SIMD_STRIDE_OKA(x) (!(((x) * sizeof(R)) % ALIGNMENTA)) +#define SIMD_VSTRIDE_OK SIMD_STRIDE_OK + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-generic128.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-generic128.h new file mode 100644 index 000000000..6ac33ea16 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-generic128.h @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * Generic128d added by Romain Dolbeau, and turned into simd-generic128.h + * with single & double precision by Erik Lindahl. + * Romain Dolbeau hereby places his modifications in the public domain. + * Erik Lindahl hereby places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +# error "Generic simd128 only works in single or double precision" +#endif + +#define SIMD_SUFFIX _generic_simd128 /* for renaming */ + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define VDUPL(x) (V){x[0],x[0],x[2],x[2]} +# define VDUPH(x) (V){x[1],x[1],x[3],x[3]} +# define DVK(var, val) V var = {val,val,val,val} +#else +# define DS(d,s) d /* double-precision option */ +# define VDUPL(x) (V){x[0],x[0]} +# define VDUPH(x) (V){x[1],x[1]} +# define DVK(var, val) V var = {val, val} +#endif + +#define VL DS(1,2) /* SIMD vector length, in term of complex numbers */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +typedef DS(double,float) V __attribute__ ((vector_size(16))); + +#define VADD(a,b) ((a)+(b)) +#define VSUB(a,b) ((a)-(b)) +#define VMUL(a,b) ((a)*(b)) + + +#define LDK(x) x + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return *(const V *)x; +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + *(V *)x = v; +} + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + V res; + res[0] = x[0]; + res[1] = x[1]; +#ifdef FFTW_SINGLE + res[2] = x[ivs]; + res[3] = x[ivs+1]; +#endif + return res; +} + +#ifdef FFTW_SINGLE +/* ST has to be separate due to the storage hack requiring reverse order */ +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + *(x + ovs ) = v[2]; + *(x + ovs + 1) = v[3]; + *(x ) = v[0]; + *(x + 1) = v[1]; +} +#else +/* FFTW_DOUBLE */ +# define ST STA +#endif + +#ifdef FFTW_SINGLE +#define STM2 ST +#define STN2(x, v0, v1, ovs) /* nop */ + +static inline void STN4(R *x, V v0, V v1, V v2, V v3, INT ovs) +{ + *(x ) = v0[0]; + *(x + 1) = v1[0]; + *(x + 2) = v2[0]; + *(x + 3) = v3[0]; + *(x + ovs ) = v0[1]; + *(x + ovs + 1) = v1[1]; + *(x + ovs + 2) = v2[1]; + *(x + ovs + 3) = v3[1]; + *(x + 2 * ovs ) = v0[2]; + *(x + 2 * ovs + 1) = v1[2]; + *(x + 2 * ovs + 2) = v2[2]; + *(x + 2 * ovs + 3) = v3[2]; + *(x + 3 * ovs ) = v0[3]; + *(x + 3 * ovs + 1) = v1[3]; + *(x + 3 * ovs + 2) = v2[3]; + *(x + 3 * ovs + 3) = v3[3]; +} +#define STM4(x, v, ovs, aligned_like) /* no-op */ + + +#else +/* FFTW_DOUBLE */ + +#define STM2 STA +#define STN2(x, v0, v1, ovs) /* nop */ + +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + *(x) = v[0]; + *(x+ovs) = v[1]; +} +# define STN4(x, v0, v1, v2, v3, ovs) /* nothing */ +#endif + + +static inline V FLIP_RI(V x) +{ +#ifdef FFTW_SINGLE + return (V){x[1],x[0],x[3],x[2]}; +#else + return (V){x[1],x[0]}; +#endif +} + +static inline V VCONJ(V x) +{ +#ifdef FFTW_SINGLE + return (V){x[0],-x[1],x[2],-x[3]}; +#else + return (V){x[0],-x[1]}; +#endif +} + +static inline V VBYI(V x) +{ + x = VCONJ(x); + x = FLIP_RI(x); + return x; +} + +/* FMA support */ +#define VFMA(a, b, c) VADD(c, VMUL(a, b)) +#define VFNMS(a, b, c) VSUB(c, VMUL(a, b)) +#define VFMS(a, b, c) VSUB(VMUL(a, b), c) +#define VFMAI(b, c) VADD(c, VBYI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) VSUB(c, VCONJ(b)) + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +static inline V BYTW1(const R *t, V sr) +{ + return VZMUL(LDA(t, 2, t), sr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + return VZMULJ(LDA(t, 2, t), sr); +} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x} +static inline V BYTW1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMUL(tx, sr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMULJ(tx, sr); +} +#endif +#define TWVL1 (VL) + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_SIN, v, -x}, {TW_SIN, v, x} +#endif +#define TWVL2 (2 * VL) +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#ifdef FFTW_SINGLE +# define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +# define TWVL3 (VL) +#else +# define VTW3(v,x) VTW1(v,x) +# define TWVL3 TWVL1 +#endif + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-generic256.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-generic256.h new file mode 100644 index 000000000..a439cba67 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-generic256.h @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * + * Generic256d added by Romain Dolbeau, and turned into simd-generic256.h + * with single & double precision by Erik Lindahl. + * Romain Dolbeau hereby places his modifications in the public domain. + * Erik Lindahl hereby places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +# error "Generic simd256 only works in single or double precision" +#endif + +#define SIMD_SUFFIX _generic_simd256 /* for renaming */ + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define VDUPL(x) {x[0],x[0],x[2],x[2],x[4],x[4],x[6],x[6]} +# define VDUPH(x) {x[1],x[1],x[3],x[3],x[5],x[5],x[7],x[7]} +# define DVK(var, val) V var = {val,val,val,val,val,val,val,val} +#else +# define DS(d,s) d /* double-precision option */ +# define VDUPL(x) {x[0],x[0],x[2],x[2]} +# define VDUPH(x) {x[1],x[1],x[3],x[3]} +# define DVK(var, val) V var = {val, val, val, val} +#endif + +#define VL DS(2,4) /* SIMD vector length, in term of complex numbers */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +typedef DS(double,float) V __attribute__ ((vector_size(32))); + +#define VADD(a,b) ((a)+(b)) +#define VSUB(a,b) ((a)-(b)) +#define VMUL(a,b) ((a)*(b)) + +#define LDK(x) x + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + V var; + (void)aligned_like; /* UNUSED */ + return *(const V *)x; +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + *(V *)x = v; +} + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + V var; + (void)aligned_like; /* UNUSED */ + var[0] = x[0]; + var[1] = x[1]; + var[2] = x[ivs]; + var[3] = x[ivs+1]; +#ifdef FFTW_SINGLE + var[4] = x[2*ivs]; + var[5] = x[2*ivs+1]; + var[6] = x[3*ivs]; + var[7] = x[3*ivs+1]; +#endif + return var; +} + + +/* ST has to be separate due to the storage hack requiring reverse order */ + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ +#ifdef FFTW_SINGLE + *(x + 3*ovs ) = v[6]; + *(x + 3*ovs + 1) = v[7]; + *(x + 2*ovs ) = v[4]; + *(x + 2*ovs + 1) = v[5]; + *(x + ovs ) = v[2]; + *(x + ovs + 1) = v[3]; + *(x ) = v[0]; + *(x + 1) = v[1]; +#else + *(x + ovs ) = v[2]; + *(x + ovs + 1) = v[3]; + *(x ) = v[0]; + *(x + 1) = v[1]; +#endif +} + +#ifdef FFTW_SINGLE +#define STM2(x, v, ovs, a) /* no-op */ +static inline void STN2(R *x, V v0, V v1, INT ovs) +{ + x[ 0] = v0[0]; + x[ 1] = v0[1]; + x[ 2] = v1[0]; + x[ 3] = v1[1]; + x[ ovs ] = v0[2]; + x[ ovs + 1] = v0[3]; + x[ ovs + 2] = v1[2]; + x[ ovs + 3] = v1[3]; + x[2*ovs ] = v0[4]; + x[2*ovs + 1] = v0[5]; + x[2*ovs + 2] = v1[4]; + x[2*ovs + 3] = v1[5]; + x[3*ovs ] = v0[6]; + x[3*ovs + 1] = v0[7]; + x[3*ovs + 2] = v1[6]; + x[3*ovs + 3] = v1[7]; +} + +# define STM4(x, v, ovs, aligned_like) /* no-op */ +static inline void STN4(R *x, V v0, V v1, V v2, V v3, INT ovs) +{ + *(x ) = v0[0]; + *(x + 1) = v1[0]; + *(x + 2) = v2[0]; + *(x + 3) = v3[0]; + *(x + ovs ) = v0[1]; + *(x + ovs + 1) = v1[1]; + *(x + ovs + 2) = v2[1]; + *(x + ovs + 3) = v3[1]; + *(x + 2 * ovs ) = v0[2]; + *(x + 2 * ovs + 1) = v1[2]; + *(x + 2 * ovs + 2) = v2[2]; + *(x + 2 * ovs + 3) = v3[2]; + *(x + 3 * ovs ) = v0[3]; + *(x + 3 * ovs + 1) = v1[3]; + *(x + 3 * ovs + 2) = v2[3]; + *(x + 3 * ovs + 3) = v3[3]; + *(x + 4 * ovs ) = v0[4]; + *(x + 4 * ovs + 1) = v1[4]; + *(x + 4 * ovs + 2) = v2[4]; + *(x + 4 * ovs + 3) = v3[4]; + *(x + 5 * ovs ) = v0[5]; + *(x + 5 * ovs + 1) = v1[5]; + *(x + 5 * ovs + 2) = v2[5]; + *(x + 5 * ovs + 3) = v3[5]; + *(x + 6 * ovs ) = v0[6]; + *(x + 6 * ovs + 1) = v1[6]; + *(x + 6 * ovs + 2) = v2[6]; + *(x + 6 * ovs + 3) = v3[6]; + *(x + 7 * ovs ) = v0[7]; + *(x + 7 * ovs + 1) = v1[7]; + *(x + 7 * ovs + 2) = v2[7]; + *(x + 7 * ovs + 3) = v3[7]; +} + +#else +/* FFTW_DOUBLE */ + +#define STM2 ST +#define STN2(x, v0, v1, ovs) /* nop */ +#define STM4(x, v, ovs, aligned_like) /* no-op */ + +static inline void STN4(R *x, V v0, V v1, V v2, V v3, INT ovs) { + *(x ) = v0[0]; + *(x + 1) = v1[0]; + *(x + 2) = v2[0]; + *(x + 3) = v3[0]; + *(x + ovs ) = v0[1]; + *(x + ovs + 1) = v1[1]; + *(x + ovs + 2) = v2[1]; + *(x + ovs + 3) = v3[1]; + *(x + 2 * ovs ) = v0[2]; + *(x + 2 * ovs + 1) = v1[2]; + *(x + 2 * ovs + 2) = v2[2]; + *(x + 2 * ovs + 3) = v3[2]; + *(x + 3 * ovs ) = v0[3]; + *(x + 3 * ovs + 1) = v1[3]; + *(x + 3 * ovs + 2) = v2[3]; + *(x + 3 * ovs + 3) = v3[3]; +} +#endif + +static inline V FLIP_RI(V x) +{ +#ifdef FFTW_SINGLE + return (V){x[1],x[0],x[3],x[2],x[5],x[4],x[7],x[6]}; +#else + return (V){x[1],x[0],x[3],x[2]}; +#endif +} + +static inline V VCONJ(V x) +{ +#ifdef FFTW_SINGLE + return (x * (V){1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0}); +#else + return (x * (V){1.0,-1.0,1.0,-1.0}); +#endif +} + +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} + +/* FMA support */ +#define VFMA(a, b, c) VADD(c, VMUL(a, b)) +#define VFNMS(a, b, c) VSUB(c, VMUL(a, b)) +#define VFMS(a, b, c) VSUB(VMUL(a, b), c) +#define VFMAI(b, c) VADD(c, VBYI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) VSUB(c, VCONJ(b)) + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x} +#else +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +#endif +#define TWVL1 (VL) + +static inline V BYTW1(const R *t, V sr) +{ + return VZMUL(LDA(t, 2, t), sr); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + return VZMULJ(LDA(t, 2, t), sr); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x} +#else +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#endif +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#define VTW3 VTW1 +#define TWVL3 TWVL1 + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, x}, {TW_SIN, v+5, x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-kcvi.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-kcvi.h new file mode 100644 index 000000000..40d525e28 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-kcvi.h @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * + * Knights Corner Vector Instruction support added by Romain Dolbeau. + * Romain Dolbeau hereby places his modifications in the public domain. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "Knights Corner vector instructions only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## _ps +# define SCAL(x) x ## f +#else /* !FFTW_SINGLE */ +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## _pd +# define SCAL(x) x +#endif /* FFTW_SINGLE */ + +#define SIMD_SUFFIX _kcvi /* for renaming */ +#define VL DS(4, 8) /* SIMD complex vector length */ +#define SIMD_VSTRIDE_OKA(x) ((x) == 2) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +/* configuration ; KNF 0 0 0 1 0 1 */ +#define KCVI_VBYI_SINGLE_USE_MUL 0 +#define KCVI_VBYI_DOUBLE_USE_MUL 0 +#define KCVI_LD_DOUBLE_USE_UNPACK 1 +#define KCVI_ST_DOUBLE_USE_PACK 1 +#define KCVI_ST2_DOUBLE_USE_STN2 0 +#define KCVI_MULZ_USE_SWIZZLE 1 + +#include + +typedef DS(__m512d, __m512) V; + +#define VADD(a,b) SUFF(_mm512_add)(a,b) +#define VSUB(a,b) SUFF(_mm512_sub)(a,b) +#define VMUL(a,b) SUFF(_mm512_mul)(a,b) + +#define VFMA(a, b, c) SUFF(_mm512_fmadd)(a, b, c) //VADD(c, VMUL(a, b)) +#define VFMS(a, b, c) SUFF(_mm512_fmsub)(a, b, c) //VSUB(VMUL(a, b), c) +#define VFNMS(a, b, c) SUFF(_mm512_fnmadd)(a, b, c) //VSUB(c, VMUL(a, b)) + +#define LDK(x) x +#define VLIT(re, im) SUFF(_mm512_setr4)(im, re, im, re) +#define DVK(var, val) V var = SUFF(_mm512_set1)(val) + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) { + return SUFF(_mm512_load)(x); +} +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) { + SUFF(_mm512_store)(x, v); +} + +#if FFTW_SINGLE +#define VXOR(a,b) _mm512_xor_epi32(a,b) + +static inline V LDu(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(7 * ivs + 1, 7 * ivs, + 6 * ivs + 1, 6 * ivs, + 5 * ivs + 1, 5 * ivs, + 4 * ivs + 1, 4 * ivs, + 3 * ivs + 1, 3 * ivs, + 2 * ivs + 1, 2 * ivs, + 1 * ivs + 1, 1 * ivs, + 0 * ivs + 1, 0 * ivs); + + return _mm512_i32gather_ps(index, x, _MM_SCALE_4); +} + +static inline void STu(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(7 * ovs + 1, 7 * ovs, + 6 * ovs + 1, 6 * ovs, + 5 * ovs + 1, 5 * ovs, + 4 * ovs + 1, 4 * ovs, + 3 * ovs + 1, 3 * ovs, + 2 * ovs + 1, 2 * ovs, + 1 * ovs + 1, 1 * ovs, + 0 * ovs + 1, 0 * ovs); + + _mm512_i32scatter_ps(x, index, v, _MM_SCALE_4); +} + +static inline V FLIP_RI(V x) +{ + return (V)_mm512_shuffle_epi32((__m512i)x, _MM_PERM_CDAB); +} + +#define VDUPH(a) (V)_mm512_shuffle_epi32((__m512i)a, _MM_PERM_DDBB); +#define VDUPL(a) (V)_mm512_shuffle_epi32((__m512i)a, _MM_PERM_CCAA); + +#else /* !FFTW_SINGLE */ +#define VXOR(a,b) _mm512_xor_epi64(a,b) + +#if defined (KCVI_LD_DOUBLE_USE_UNPACK) && KCVI_LD_DOUBLE_USE_UNPACK +static inline V LDu(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + V temp; + /* no need for hq here */ + temp = _mm512_mask_loadunpacklo_pd(temp, 0x0003, x + (0 * ivs)); + temp = _mm512_mask_loadunpacklo_pd(temp, 0x000c, x + (1 * ivs)); + temp = _mm512_mask_loadunpacklo_pd(temp, 0x0030, x + (2 * ivs)); + temp = _mm512_mask_loadunpacklo_pd(temp, 0x00c0, x + (3 * ivs)); + return temp; +} +#else +static inline V LDu(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __declspec(align(64)) R temp[8]; + int i; + for (i = 0 ; i < 4 ; i++) { + temp[i*2] = x[i * ivs]; + temp[i*2+1] = x[i * ivs + 1]; + } + return _mm512_load_pd(temp); +} +#endif + +#if defined(KCVI_ST_DOUBLE_USE_PACK) && KCVI_ST_DOUBLE_USE_PACK +static inline void STu(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + /* no need for hq here */ + _mm512_mask_packstorelo_pd(x + (0 * ovs), 0x0003, v); + _mm512_mask_packstorelo_pd(x + (1 * ovs), 0x000c, v); + _mm512_mask_packstorelo_pd(x + (2 * ovs), 0x0030, v); + _mm512_mask_packstorelo_pd(x + (3 * ovs), 0x00c0, v); +} +#else +static inline void STu(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __declspec(align(64)) R temp[8]; + int i; + _mm512_store_pd(temp, v); + for (i = 0 ; i < 4 ; i++) { + x[i * ovs] = temp[i*2]; + x[i * ovs + 1] = temp[i*2+1]; + } +} +#endif + +static inline V FLIP_RI(V x) +{ + return (V)_mm512_shuffle_epi32((__m512i)x, _MM_PERM_BADC); +} + +#define VDUPH(a) (V)_mm512_shuffle_epi32((__m512i)a, _MM_PERM_DCDC); +#define VDUPL(a) (V)_mm512_shuffle_epi32((__m512i)a, _MM_PERM_BABA); + +#endif /* FFTW_SINGLE */ + +#define LD LDu +#define ST STu + +#ifdef FFTW_SINGLE +#define STM2(x, v, ovs, a) ST(x, v, ovs, a) +#define STN2(x, v0, v1, ovs) /* nop */ + +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(15 * ovs, 14 * ovs, + 13 * ovs, 12 * ovs, + 11 * ovs, 10 * ovs, + 9 * ovs, 8 * ovs, + 7 * ovs, 6 * ovs, + 5 * ovs, 4 * ovs, + 3 * ovs, 2 * ovs, + 1 * ovs, 0 * ovs); + + _mm512_i32scatter_ps(x, index, v, _MM_SCALE_4); +} +#define STN4(x, v0, v1, v2, v3, ovs) /* no-op */ +#else /* !FFTW_SINGLE */ +#if defined(KCVI_ST2_DOUBLE_USE_STN2) && KCVI_ST2_DOUBLE_USE_STN2 +#define STM2(x, v, ovs, a) /* no-op */ +static inline void STN2(R *x, V v0, V v1, INT ovs) { + /* we start + AB CD EF GH -> *x (2 DBL), ovs between complex + IJ KL MN OP -> *(x+2) (2DBL), ovs between complex + and we want + ABIJ EFMN -> *x (4 DBL), 2 * ovs between complex pairs + CDKL GHOP -> *(x+ovs) (4DBL), 2 * ovs between complex pairs + */ + V x00 = (V)_mm512_mask_permute4f128_epi32((__m512i)v0, 0xF0F0, (__m512i)v1, _MM_PERM_CDAB); + V x01 = (V)_mm512_mask_permute4f128_epi32((__m512i)v1, 0x0F0F, (__m512i)v0, _MM_PERM_CDAB); + _mm512_mask_packstorelo_pd(x + (0 * ovs) + 0, 0x000F, x00); +/* _mm512_mask_packstorehi_pd(x + (0 * ovs) + 8, 0x000F, x00); */ + _mm512_mask_packstorelo_pd(x + (2 * ovs) + 0, 0x00F0, x00); +/* _mm512_mask_packstorehi_pd(x + (2 * ovs) + 8, 0x00F0, x00); */ + _mm512_mask_packstorelo_pd(x + (1 * ovs) + 0, 0x000F, x01); +/* _mm512_mask_packstorehi_pd(x + (1 * ovs) + 8, 0x000F, x01); */ + _mm512_mask_packstorelo_pd(x + (3 * ovs) + 0, 0x00F0, x01); +/* _mm512_mask_packstorehi_pd(x + (3 * ovs) + 8, 0x00F0, x01); */ +} +#else +#define STM2(x, v, ovs, a) ST(x, v, ovs, a) +#define STN2(x, v0, v1, ovs) /* nop */ +#endif + +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + __m512i index = _mm512_set_epi32(0, 0, 0, 0, 0, 0, 0, 0, + 7 * ovs, 6 * ovs, + 5 * ovs, 4 * ovs, + 3 * ovs, 2 * ovs, + 1 * ovs, 0 * ovs); + + _mm512_i32loscatter_pd(x, index, v, _MM_SCALE_8); +} +#define STN4(x, v0, v1, v2, v3, ovs) /* no-op */ +#endif /* FFTW_SINGLE */ + +static inline V VFMAI(V b, V c) { + V mpmp = VLIT(SCAL(1.0), SCAL(-1.0)); + return SUFF(_mm512_fmadd)(mpmp, SUFF(_mm512_swizzle)(b, _MM_SWIZ_REG_CDAB), c); +} + +static inline V VFNMSI(V b, V c) { + V mpmp = VLIT(SCAL(1.0), SCAL(-1.0)); + return SUFF(_mm512_fnmadd)(mpmp, SUFF(_mm512_swizzle)(b, _MM_SWIZ_REG_CDAB), c); +} + +static inline V VFMACONJ(V b, V c) { + V pmpm = VLIT(SCAL(-1.0), SCAL(1.0)); + return SUFF(_mm512_fmadd)(pmpm, b, c); +} + +static inline V VFMSCONJ(V b, V c) { + V pmpm = VLIT(SCAL(-1.0), SCAL(1.0)); + return SUFF(_mm512_fmsub)(pmpm, b, c); +} + +static inline V VFNMSCONJ(V b, V c) { + V pmpm = VLIT(SCAL(-1.0), SCAL(1.0)); + return SUFF(_mm512_fnmadd)(pmpm, b, c); +} + +static inline V VCONJ(V x) +{ + V pmpm = VLIT(SCAL(-0.0), SCAL(0.0)); + return (V)VXOR((__m512i)pmpm, (__m512i)x); +} + +#ifdef FFTW_SINGLE +#if defined(KCVI_VBYI_SINGLE_USE_MUL) && KCVI_VBYI_SINGLE_USE_MUL +/* untested */ +static inline V VBYI(V x) +{ + V mpmp = VLIT(SCAL(1.0), SCAL(-1.0)); + return _mm512_mul_ps(mpmp, _mm512_swizzle_ps(x, _MM_SWIZ_REG_CDAB)); +} +#else +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} +#endif +#else /* !FFTW_SINGLE */ +#if defined(KCVI_VBYI_DOUBLE_USE_MUL) && KCVI_VBYI_DOUBLE_USE_MUL +/* on KNF, using mul_pd is slower than shuf128x32 + xor */ +static inline V VBYI(V x) +{ + V mpmp = VLIT(SCAL(1.0), SCAL(-1.0)); + return _mm512_mul_pd(mpmp, _mm512_swizzle_pd(x, _MM_SWIZ_REG_CDAB)); +} +#else +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} +#endif +#endif /* FFTW_SINGLE */ + +#if defined(KCVI_MULZ_USE_SWIZZLE) && KCVI_MULZ_USE_SWIZZLE +static inline V VZMUL(V tx, V sr) /* (a,b) (c,d) */ +{ + V ac = SUFF(_mm512_mul)(tx, sr); /* (a*c,b*d) */ + V ad = SUFF(_mm512_mul)(tx, SUFF(_mm512_swizzle)(sr, _MM_SWIZ_REG_CDAB)); /* (a*d,b*c) */ + V acmbd = SUFF(_mm512_sub)(ac, SUFF(_mm512_swizzle)(ac, _MM_SWIZ_REG_CDAB)); /* (a*c-b*d, b*d-a*c) */ + V res = SUFF(_mm512_mask_add)(acmbd, DS(0x00aa,0xaaaa), ad, SUFF(_mm512_swizzle)(ad, _MM_SWIZ_REG_CDAB)); /* ([a*c+b*c] a*c-b*d, b*c+a*d) */ + return res; +} +static inline V VZMULJ(V tx, V sr) /* (a,b) (c,d) */ +{ + V ac = SUFF(_mm512_mul)(tx, sr); /* (a*c,b*d) */ + V ad = SUFF(_mm512_mul)(tx, SUFF(_mm512_swizzle)(sr, _MM_SWIZ_REG_CDAB)); /* (a*d,b*c) */ + V acmbd = SUFF(_mm512_add)(ac, SUFF(_mm512_swizzle)(ac, _MM_SWIZ_REG_CDAB)); /* (a*c+b*d, b*d+a*c) */ + V res = SUFF(_mm512_mask_subr)(acmbd, DS(0x00aa,0xaaaa), ad, SUFF(_mm512_swizzle)(ad, _MM_SWIZ_REG_CDAB)); /* ([a*c+b*c] a*c+b*d, a*d-b*c) */ + return res; +} +static inline V VZMULI(V tx, V sr) /* (a,b) (c,d) */ +{ + DVK(zero, SCAL(0.0)); + V ac = SUFF(_mm512_mul)(tx, sr); /* (a*c,b*d) */ + V ad = SUFF(_mm512_fnmadd)(tx, SUFF(_mm512_swizzle)(sr, _MM_SWIZ_REG_CDAB), zero); /* (-a*d,-b*c) */ + V acmbd = SUFF(_mm512_subr)(ac, SUFF(_mm512_swizzle)(ac, _MM_SWIZ_REG_CDAB)); /* (b*d-a*c, a*c-b*d) */ + V res = SUFF(_mm512_mask_add)(acmbd, DS(0x0055,0x5555), ad, SUFF(_mm512_swizzle)(ad, _MM_SWIZ_REG_CDAB)); /* (-a*d-b*c, a*c-b*d) */ + return res; +} +static inline V VZMULIJ(V tx, V sr) /* (a,b) (c,d) */ +{ + DVK(zero, SCAL(0.0)); + V ac = SUFF(_mm512_mul)(tx, sr); /* (a*c,b*d) */ + V ad = SUFF(_mm512_fnmadd)(tx, SUFF(_mm512_swizzle)(sr, _MM_SWIZ_REG_CDAB), zero); /* (-a*d,-b*c) */ + V acmbd = SUFF(_mm512_add)(ac, SUFF(_mm512_swizzle)(ac, _MM_SWIZ_REG_CDAB)); /* (b*d+a*c, a*c+b*d) */ + V res = SUFF(_mm512_mask_sub)(acmbd, DS(0x0055,0x5555), ad, SUFF(_mm512_swizzle)(ad, _MM_SWIZ_REG_CDAB)); /* (-a*d+b*c, a*c-b*d) */ + return res; +} +#else +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} +#endif + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x}, {TW_CEXP, v+4, x}, {TW_CEXP, v+5, x}, {TW_CEXP, v+6, x}, {TW_CEXP, v+7, x} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x}, {TW_CEXP, v+2, x}, {TW_CEXP, v+3, x} +#endif /* FFTW_SINGLE */ +#define TWVL1 (VL) + +static inline V BYTW1(const R *t, V sr) +{ + return VZMUL(LDA(t, 2, t), sr); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + return VZMULJ(LDA(t, 2, t), sr); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v , x}, {TW_COS, v , x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+5, x}, \ + {TW_COS, v+6, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v , -x}, {TW_SIN, v , x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, -x}, {TW_SIN, v+4, x}, {TW_SIN, v+5, -x}, {TW_SIN, v+5, x}, \ + {TW_SIN, v+6, -x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, -x}, {TW_SIN, v+7, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v , x}, {TW_COS, v , x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_COS, v+2, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v , -x}, {TW_SIN, v , x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x}, \ + {TW_SIN, v+2, -x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, -x}, {TW_SIN, v+3, x} +#endif /* FFTW_SINGLE */ +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; +/* V tr = LD(t, 2, t), ti = LD(t + VL, 2, t + VL); */ + return VFMA(tr, sr, VMUL(ti, si)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; +/* V tr = LD(t, 2, t), ti = LD(t + VL, 2, t + VL); */ + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#define VTW3(v,x) VTW1(v,x) +#define TWVL3 TWVL1 + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v , x}, {TW_COS, v+1 , x}, {TW_COS, v+2 , x}, {TW_COS, v+3 , x}, \ + {TW_COS, v+4 , x}, {TW_COS, v+5 , x}, {TW_COS, v+6 , x}, {TW_COS, v+7 , x}, \ + {TW_COS, v+8 , x}, {TW_COS, v+9 , x}, {TW_COS, v+10, x}, {TW_COS, v+11, x}, \ + {TW_COS, v+12, x}, {TW_COS, v+13, x}, {TW_COS, v+14, x}, {TW_COS, v+15, x}, \ + {TW_SIN, v , x}, {TW_SIN, v+1 , x}, {TW_SIN, v+2 , x}, {TW_SIN, v+3 , x}, \ + {TW_SIN, v+4 , x}, {TW_SIN, v+5 , x}, {TW_SIN, v+6 , x}, {TW_SIN, v+7 , x}, \ + {TW_SIN, v+8 , x}, {TW_SIN, v+9 , x}, {TW_SIN, v+10, x}, {TW_SIN, v+11, x}, \ + {TW_SIN, v+12, x}, {TW_SIN, v+13, x}, {TW_SIN, v+14, x}, {TW_SIN, v+15, x} +#else /* !FFTW_SINGLE */ +# define VTWS(v,x) \ + {TW_COS, v , x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_COS, v+4, x}, {TW_COS, v+5, x}, {TW_COS, v+6, x}, {TW_COS, v+7, x}, \ + {TW_SIN, v , x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x}, \ + {TW_SIN, v+4, x}, {TW_SIN, v+5, x}, {TW_SIN, v+6, x}, {TW_SIN, v+7, x} +#endif /* FFTW_SINGLE */ +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-neon.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-neon.h new file mode 100644 index 000000000..144004265 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-neon.h @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * Double-precision support added by Romain Dolbeau. + * Romain Dolbeau hereby places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if !defined(FFTW_SINGLE) && !defined( __aarch64__) +#error "NEON only works in single precision on 32 bits ARM" +#endif +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +#error "NEON only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## _f32 +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## _f64 +#endif + +/* define these unconditionally, because they are used by + taint.c which is compiled without neon */ +#define SIMD_SUFFIX _neon /* for renaming */ +#define VL DS(1,2) /* SIMD complex vector length */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#if defined(__GNUC__) && !defined(__ARM_NEON__) && !defined(__ARM_NEON) +#error "compiling simd-neon.h requires -mfpu=neon or equivalent" +#endif + +#include + +/* FIXME: I am not sure whether this code assumes little-endian + ordering. VLIT may or may not be wrong for big-endian systems. */ +typedef DS(float64x2_t, float32x4_t) V; + +#ifdef FFTW_SINGLE +# define VLIT(x0, x1) {x0, x1, x0, x1} +#else +# define VLIT(x0, x1) {x0, x1} +#endif +#define LDK(x) x +#define DVK(var, val) const V var = VLIT(val, val) + +/* NEON has FMA, but a three-operand FMA is not too useful + for FFT purposes. We normally compute + + t0=a+b*c + t1=a-b*c + + In a three-operand instruction set this translates into + + t0=a + t0+=b*c + t1=a + t1-=b*c + + At least one move must be implemented, negating the advantage of + the FMA in the first place. At least some versions of gcc generate + both moves. So we are better off generating t=b*c;t0=a+t;t1=a-t;*/ +#if ARCH_PREFERS_FMA +#warning "--enable-fma on NEON is probably a bad idea (see source code)" +#endif + +#define VADD(a, b) SUFF(vaddq)(a, b) +#define VSUB(a, b) SUFF(vsubq)(a, b) +#define VMUL(a, b) SUFF(vmulq)(a, b) +#define VFMA(a, b, c) SUFF(vmlaq)(c, a, b) /* a*b+c */ +#define VFNMS(a, b, c) SUFF(vmlsq)(c, a, b) /* FNMS=-(a*b-c) in powerpc terminology; MLS=c-a*b + in ARM terminology */ +#define VFMS(a, b, c) VSUB(VMUL(a, b), c) /* FMS=a*b-c in powerpc terminology; no equivalent + arm instruction (?) */ + +#define STOREH(a, v) SUFF(vst1)((a), SUFF(vget_high)(v)) +#define STOREL(a, v) SUFF(vst1)((a), SUFF(vget_low)(v)) + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void) aligned_like; /* UNUSED */ + return SUFF(vld1q)(x); +} +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void) aligned_like; /* UNUSED */ + SUFF(vst1q)(x, v); +} + + +#ifdef FFTW_SINGLE +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + (void) aligned_like; /* UNUSED */ + return SUFF(vcombine)(SUFF(vld1)(x), SUFF(vld1)((x + ivs))); +} +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void) aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon store-low occurring + after store-high */ + STOREH(x + ovs, v); + STOREL(x,v); +} +#else /* !FFTW_SINGLE */ +# define LD LDA +# define ST STA +#endif + +/* 2x2 complex transpose and store */ +#define STM2 DS(STA,ST) +#define STN2(x, v0, v1, ovs) /* nop */ + +#ifdef FFTW_SINGLE +/* store and 4x4 real transpose */ +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void) aligned_like; /* UNUSED */ + SUFF(vst1_lane)((x) , SUFF(vget_low)(v), 0); + SUFF(vst1_lane)((x + ovs), SUFF(vget_low)(v), 1); + SUFF(vst1_lane)((x + 2 * ovs), SUFF(vget_high)(v), 0); + SUFF(vst1_lane)((x + 3 * ovs), SUFF(vget_high)(v), 1); +} +#define STN4(x, v0, v1, v2, v3, ovs) /* use STM4 */ +#else /* !FFTW_SINGLE */ +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + STOREL(x, v); + STOREH(x + ovs, v); +} +# define STN4(x, v0, v1, v2, v3, ovs) /* nothing */ +#endif + +#ifdef FFTW_SINGLE +#define FLIP_RI(x) SUFF(vrev64q)(x) +#else +/* FIXME */ +#define FLIP_RI(x) SUFF(vcombine)(SUFF(vget_high)(x), SUFF(vget_low)(x)) +#endif + +static inline V VCONJ(V x) +{ +#ifdef FFTW_SINGLE + static const uint32x4_t pm = {0, 0x80000000u, 0, 0x80000000u}; + return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(x), pm)); +#else + static const uint64x2_t pm = {0, 0x8000000000000000ull}; + /* Gcc-4.9.2 still does not include vreinterpretq_f64_u64, but simple + * casts generate the correct assembly. + */ + return (float64x2_t)(veorq_u64((uint64x2_t)(x), (uint64x2_t)(pm))); +#endif +} + +static inline V VBYI(V x) +{ + return FLIP_RI(VCONJ(x)); +} + +static inline V VFMAI(V b, V c) +{ + const V mp = VLIT(-1.0, 1.0); + return VFMA(FLIP_RI(b), mp, c); +} + +static inline V VFNMSI(V b, V c) +{ + const V mp = VLIT(-1.0, 1.0); + return VFNMS(FLIP_RI(b), mp, c); +} + +static inline V VFMACONJ(V b, V c) +{ + const V pm = VLIT(1.0, -1.0); + return VFMA(b, pm, c); +} + +static inline V VFNMSCONJ(V b, V c) +{ + const V pm = VLIT(1.0, -1.0); + return VFNMS(b, pm, c); +} + +static inline V VFMSCONJ(V b, V c) +{ + return VSUB(VCONJ(b), c); +} + +#ifdef FFTW_SINGLE +#if 1 +#define VEXTRACT_REIM(tr, ti, tx) \ +{ \ + tr = SUFF(vcombine)(SUFF(vdup_lane)(SUFF(vget_low)(tx), 0), \ + SUFF(vdup_lane)(SUFF(vget_high)(tx), 0)); \ + ti = SUFF(vcombine)(SUFF(vdup_lane)(SUFF(vget_low)(tx), 1), \ + SUFF(vdup_lane)(SUFF(vget_high)(tx), 1)); \ +} +#else +/* this alternative might be faster in an ideal world, but gcc likes + to spill VVV onto the stack */ +#define VEXTRACT_REIM(tr, ti, tx) \ +{ \ + float32x4x2_t vvv = SUFF(vtrnq)(tx, tx); \ + tr = vvv.val[0]; \ + ti = vvv.val[1]; \ +} +#endif +#else +#define VEXTRACT_REIM(tr, ti, tx) \ +{ \ + tr = SUFF(vtrn1q)(tx, tx); \ + ti = SUFF(vtrn2q)(tx, tx); \ +} +#endif + +static inline V VZMUL(V tx, V sr) +{ + V tr, ti; + VEXTRACT_REIM(tr, ti, tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr, ti; + VEXTRACT_REIM(tr, ti, tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr, ti; + VEXTRACT_REIM(tr, ti, tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr, ti; + VEXTRACT_REIM(tr, ti, tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +#define VTW1(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +#else +#define VTW1(v,x) {TW_CEXP, v, x} +#endif +#define TWVL1 VL +static inline V BYTW1(const R *t, V sr) +{ + V tx = LDA(t, 2, 0); + return VZMUL(tx, sr); +} + +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LDA(t, 2, 0); + return VZMULJ(tx, sr); +} + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#else +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_SIN, v, -x}, {TW_SIN, v, x} +#endif +#define TWVL2 (2 * VL) + +static inline V BYTW2(const R *t, V sr) +{ + V si = FLIP_RI(sr); + V tr = LDA(t, 2, 0), ti = LDA(t+2*VL, 2, 0); + return VFMA(ti, si, VMUL(tr, sr)); +} + +static inline V BYTWJ2(const R *t, V sr) +{ + V si = FLIP_RI(sr); + V tr = LDA(t, 2, 0), ti = LDA(t+2*VL, 2, 0); + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#ifdef FFTW_SINGLE +# define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +#else +# define VTW3(v,x) {TW_CEXP, v, x} +#endif +# define TWVL3 (VL) + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-sse2.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-sse2.h new file mode 100644 index 000000000..44b11b7f3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-sse2.h @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +# error "SSE/SSE2 only works in single/double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## s +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## d +#endif + +#define SIMD_SUFFIX _sse2 /* for renaming */ +#define VL DS(1,2) /* SIMD vector length, in term of complex numbers */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#if defined(__GNUC__) && !defined(FFTW_SINGLE) && !defined(__SSE2__) +# error "compiling simd-sse2.h in double precision without -msse2" +#elif defined(__GNUC__) && defined(FFTW_SINGLE) && !defined(__SSE__) +# error "compiling simd-sse2.h in single precision without -msse" +#endif + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +/* some versions of glibc's sys/cdefs.h define __inline to be empty, + which is wrong because emmintrin.h defines several inline + procedures */ +#ifndef _MSC_VER +#undef __inline +#endif + +#ifdef FFTW_SINGLE +# include +#else +# include +#endif + +typedef DS(__m128d,__m128) V; +#define VADD SUFF(_mm_add_p) +#define VSUB SUFF(_mm_sub_p) +#define VMUL SUFF(_mm_mul_p) +#define VXOR SUFF(_mm_xor_p) +#define SHUF SUFF(_mm_shuffle_p) +#define UNPCKL SUFF(_mm_unpacklo_p) +#define UNPCKH SUFF(_mm_unpackhi_p) + +#define SHUFVALS(fp0,fp1,fp2,fp3) \ + (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) + +#define VDUPL(x) DS(UNPCKL(x, x), SHUF(x, x, SHUFVALS(0, 0, 2, 2))) +#define VDUPH(x) DS(UNPCKH(x, x), SHUF(x, x, SHUFVALS(1, 1, 3, 3))) +#define STOREH(a, v) DS(_mm_storeh_pd(a, v), _mm_storeh_pi((__m64 *)(a), v)) +#define STOREL(a, v) DS(_mm_storel_pd(a, v), _mm_storel_pi((__m64 *)(a), v)) + + +#ifdef __GNUC__ + /* + * gcc-3.3 generates slow code for mm_set_ps (write all elements to + * the stack and load __m128 from the stack). + * + * gcc-3.[34] generates slow code for mm_set_ps1 (load into low element + * and shuffle). + * + * This hack forces gcc to generate a constant __m128 at compile time. + */ + union rvec { + R r[DS(2,4)]; + V v; + }; + +# ifdef FFTW_SINGLE +# define DVK(var, val) V var = __extension__ ({ \ + static const union rvec _var = { {val,val,val,val} }; _var.v; }) +# else +# define DVK(var, val) V var = __extension__ ({ \ + static const union rvec _var = { {val,val} }; _var.v; }) +# endif +# define LDK(x) x +#else +# define DVK(var, val) const R var = K(val) +# define LDK(x) DS(_mm_set1_pd,_mm_set_ps1)(x) +#endif + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ivs; /* UNUSED */ + return *(const V *)x; +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + (void)ovs; /* UNUSED */ + *(V *)x = v; +} + +#ifdef FFTW_SINGLE + +# ifdef _MSC_VER + /* Temporarily disable the warning "uninitialized local variable + 'name' used" and runtime checks for using a variable before it is + defined which is erroneously triggered by the LOADL0 / LOADH macros + as they only modify VAL partly each. */ +# ifndef __INTEL_COMPILER +# pragma warning(disable : 4700) +# pragma runtime_checks("u", off) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(disable : 592) +# endif + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + V var; + (void)aligned_like; /* UNUSED */ +# ifdef __GNUC__ + /* We use inline asm because gcc-3.x generates slow code for + _mm_loadh_pi(). gcc-3.x insists upon having an existing variable for + VAL, which is however never used. Thus, it generates code to move + values in and out the variable. Worse still, gcc-4.0 stores VAL on + the stack, causing valgrind to complain about uninitialized reads. */ + __asm__("movlps %1, %0\n\tmovhps %2, %0" + : "=x"(var) : "m"(x[0]), "m"(x[ivs])); +# else +# define LOADH(addr, val) _mm_loadh_pi(val, (const __m64 *)(addr)) +# define LOADL0(addr, val) _mm_loadl_pi(val, (const __m64 *)(addr)) + var = LOADL0(x, var); + var = LOADH(x + ivs, var); +# endif + return var; +} + +# ifdef _MSC_VER +# ifndef __INTEL_COMPILER +# pragma warning(default : 4700) +# pragma runtime_checks("u", restore) +# endif +# endif +# ifdef __INTEL_COMPILER +# pragma warning(default : 592) +# endif + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + /* WARNING: the extra_iter hack depends upon STOREL occurring + after STOREH */ + STOREH(x + ovs, v); + STOREL(x, v); +} + +#else /* ! FFTW_SINGLE */ +# define LD LDA +# define ST STA +#endif + +#define STM2 DS(STA,ST) +#define STN2(x, v0, v1, ovs) /* nop */ + +#ifdef FFTW_SINGLE +# define STM4(x, v, ovs, aligned_like) /* no-op */ +/* STN4 is a macro, not a function, thanks to Visual C++ developers + deciding "it would be infrequent that people would want to pass more + than 3 [__m128 parameters] by value." 3 parameters ought to be enough + for anybody. */ +# define STN4(x, v0, v1, v2, v3, ovs) \ +{ \ + V xxx0, xxx1, xxx2, xxx3; \ + xxx0 = UNPCKL(v0, v2); \ + xxx1 = UNPCKH(v0, v2); \ + xxx2 = UNPCKL(v1, v3); \ + xxx3 = UNPCKH(v1, v3); \ + STA(x, UNPCKL(xxx0, xxx2), 0, 0); \ + STA(x + ovs, UNPCKH(xxx0, xxx2), 0, 0); \ + STA(x + 2 * ovs, UNPCKL(xxx1, xxx3), 0, 0); \ + STA(x + 3 * ovs, UNPCKH(xxx1, xxx3), 0, 0); \ +} +#else /* !FFTW_SINGLE */ +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + STOREL(x, v); + STOREH(x + ovs, v); +} +# define STN4(x, v0, v1, v2, v3, ovs) /* nothing */ +#endif + +static inline V FLIP_RI(V x) +{ + return SHUF(x, x, DS(1, SHUFVALS(1, 0, 3, 2))); +} + +static inline V VCONJ(V x) +{ + /* This will produce -0.0f (or -0.0d) even on broken + compilers that do not distinguish +0.0 from -0.0. + I bet some are still around. */ + union uvec { + unsigned u[4]; + V v; + }; + /* it looks like gcc-3.3.5 produces slow code unless PM is + declared static. */ + static const union uvec pm = { +#ifdef FFTW_SINGLE + { 0x00000000, 0x80000000, 0x00000000, 0x80000000 } +#else + { 0x00000000, 0x00000000, 0x00000000, 0x80000000 } +#endif + }; + return VXOR(pm.v, x); +} + +static inline V VBYI(V x) +{ + x = VCONJ(x); + x = FLIP_RI(x); + return x; +} + +/* FMA support */ +#define VFMA(a, b, c) VADD(c, VMUL(a, b)) +#define VFNMS(a, b, c) VSUB(c, VMUL(a, b)) +#define VFMS(a, b, c) VSUB(VMUL(a, b), c) +#define VFMAI(b, c) VADD(c, VBYI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) VSUB(c, VCONJ(b)) + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +static inline V BYTW1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V tx = twp[0]; + V tr = UNPCKL(tx, tx); + V ti = UNPCKH(tx, tx); + tr = VMUL(tr, sr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + const V *twp = (const V *)t; + V tx = twp[0]; + V tr = UNPCKL(tx, tx); + V ti = UNPCKH(tx, tx); + tr = VMUL(tr, sr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x} +static inline V BYTW1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMUL(tx, sr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMULJ(tx, sr); +} +#endif +#define TWVL1 (VL) + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_SIN, v, -x}, {TW_SIN, v, x} +#endif +#define TWVL2 (2 * VL) +static inline V BYTW2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFMA(tr, sr, VMUL(ti, si)); +} +static inline V BYTWJ2(const R *t, V sr) +{ + const V *twp = (const V *)t; + V si = FLIP_RI(sr); + V tr = twp[0], ti = twp[1]; + return VFNMS(ti, si, VMUL(tr, sr)); +} + +/* twiddle storage #3 */ +#ifdef FFTW_SINGLE +# define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +# define TWVL3 (VL) +#else +# define VTW3(v,x) VTW1(v,x) +# define TWVL3 TWVL1 +#endif + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-vsx.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-vsx.h new file mode 100644 index 000000000..12b7dad0a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/simd-vsx.h @@ -0,0 +1,299 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * VSX SIMD implementation added 2015 Erik Lindahl. + * Erik Lindahl places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if defined(FFTW_LDOUBLE) || defined(FFTW_QUAD) +# error "VSX only works in single or double precision" +#endif + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +# define SUFF(name) name ## s +#else +# define DS(d,s) d /* double-precision option */ +# define SUFF(name) name ## d +#endif + +#define SIMD_SUFFIX _vsx /* for renaming */ +#define VL DS(1,2) /* SIMD vector length, in term of complex numbers */ +#define SIMD_VSTRIDE_OKA(x) DS(1,((x) == 2)) +#define SIMD_STRIDE_OKPAIR SIMD_STRIDE_OK + +#include +#include + +typedef DS(vector double,vector float) V; + +#define VADD(a,b) vec_add(a,b) +#define VSUB(a,b) vec_sub(a,b) +#define VMUL(a,b) vec_mul(a,b) +#define VXOR(a,b) vec_xor(a,b) +#define UNPCKL(a,b) vec_mergel(a,b) +#define UNPCKH(a,b) vec_mergeh(a,b) +#ifdef FFTW_SINGLE +# define VDUPL(a) ({ const vector unsigned char perm = {0,1,2,3,0,1,2,3,8,9,10,11,8,9,10,11}; vec_perm(a,a,perm); }) +# define VDUPH(a) ({ const vector unsigned char perm = {4,5,6,7,4,5,6,7,12,13,14,15,12,13,14,15}; vec_perm(a,a,perm); }) +#else +# define VDUPL(a) ({ const vector unsigned char perm = {0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7}; vec_perm(a,a,perm); }) +# define VDUPH(a) ({ const vector unsigned char perm = {8,9,10,11,12,13,14,15,8,9,10,11,12,13,14,15}; vec_perm(a,a,perm); }) +#endif + +static inline V LDK(R f) { return vec_splats(f); } + +#define DVK(var, val) const R var = K(val) + +static inline V VCONJ(V x) +{ + const V pmpm = vec_mergel(vec_splats((R)0.0),-(vec_splats((R)0.0))); + return vec_xor(x, pmpm); +} + +static inline V LDA(const R *x, INT ivs, const R *aligned_like) +{ +#ifdef __ibmxl__ + return vec_xl(0,(DS(double,float) *)x); +#else + return (*(const V *)(x)); +#endif +} + +static inline void STA(R *x, V v, INT ovs, const R *aligned_like) +{ +#ifdef __ibmxl__ + vec_xst(v,0,x); +#else + *(V *)x = v; +#endif +} + +static inline V FLIP_RI(V x) +{ +#ifdef FFTW_SINGLE + const vector unsigned char perm = { 4,5,6,7,0,1,2,3,12,13,14,15,8,9,10,11 }; +#else + const vector unsigned char perm = { 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7 }; +#endif + return vec_perm(x,x,perm); +} + +#ifdef FFTW_SINGLE + +static inline V LD(const R *x, INT ivs, const R *aligned_like) +{ + const vector unsigned char perm = {0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23}; + + return vec_perm((vector float)vec_splats(*(double *)(x)), + (vector float)vec_splats(*(double *)(x+ivs)),perm); +} + +static inline void ST(R *x, V v, INT ovs, const R *aligned_like) +{ + *(double *)(x+ovs) = vec_extract( (vector double)v, 1 ); + *(double *)x = vec_extract( (vector double)v, 0 ); +} +#else +/* DOUBLE */ + +# define LD LDA +# define ST STA + +#endif + +#define STM2 DS(STA,ST) +#define STN2(x, v0, v1, ovs) /* nop */ + +#ifdef FFTW_SINGLE + +# define STM4(x, v, ovs, aligned_like) /* no-op */ +static inline void STN4(R *x, V v0, V v1, V v2, V v3, int ovs) +{ + V xxx0, xxx1, xxx2, xxx3; + xxx0 = vec_mergeh(v0,v1); + xxx1 = vec_mergel(v0,v1); + xxx2 = vec_mergeh(v2,v3); + xxx3 = vec_mergel(v2,v3); + *(double *)x = vec_extract( (vector double)xxx0, 0 ); + *(double *)(x+ovs) = vec_extract( (vector double)xxx0, 1 ); + *(double *)(x+2*ovs) = vec_extract( (vector double)xxx1, 0 ); + *(double *)(x+3*ovs) = vec_extract( (vector double)xxx1, 1 ); + *(double *)(x+2) = vec_extract( (vector double)xxx2, 0 ); + *(double *)(x+ovs+2) = vec_extract( (vector double)xxx2, 1 ); + *(double *)(x+2*ovs+2) = vec_extract( (vector double)xxx3, 0 ); + *(double *)(x+3*ovs+2) = vec_extract( (vector double)xxx3, 1 ); +} +#else /* !FFTW_SINGLE */ + +static inline void STM4(R *x, V v, INT ovs, const R *aligned_like) +{ + (void)aligned_like; /* UNUSED */ + x[0] = vec_extract(v,0); + x[ovs] = vec_extract(v,1); +} +# define STN4(x, v0, v1, v2, v3, ovs) /* nothing */ +#endif + +static inline V VBYI(V x) +{ + /* FIXME [matteof 2017-09-21] It is possible to use vpermxor(), + but gcc and xlc treat the permutation bits differently, and + gcc-6 seems to generate incorrect code when using + __builtin_crypto_vpermxor() (i.e., VBYI() works for a small + test case but fails in the large). + + Punt on vpermxor() for now and do the simple thing. + */ + return FLIP_RI(VCONJ(x)); +} + +/* FMA support */ +#define VFMA(a, b, c) vec_madd(a,b,c) +#define VFNMS(a, b, c) vec_nmsub(a,b,c) +#define VFMS(a, b, c) vec_msub(a,b,c) +#define VFMAI(b, c) VADD(c, VBYI(b)) +#define VFNMSI(b, c) VSUB(c, VBYI(b)) +#define VFMACONJ(b,c) VADD(VCONJ(b),c) +#define VFMSCONJ(b,c) VSUB(VCONJ(b),c) +#define VFNMSCONJ(b,c) VSUB(c, VCONJ(b)) + +static inline V VZMUL(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} + +static inline V VZMULJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + tr = VMUL(sr, tr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} + +static inline V VZMULI(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMS(tr, sr, ti); +} + +static inline V VZMULIJ(V tx, V sr) +{ + V tr = VDUPL(tx); + V ti = VDUPH(tx); + ti = VMUL(ti, sr); + sr = VBYI(sr); + return VFMA(tr, sr, ti); +} + +/* twiddle storage #1: compact, slower */ +#ifdef FFTW_SINGLE +# define VTW1(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +static inline V BYTW1(const R *t, V sr) +{ + V tx = LDA(t,0,t); + V tr = UNPCKH(tx, tx); + V ti = UNPCKL(tx, tx); + tr = VMUL(tr, sr); + sr = VBYI(sr); + return VFMA(ti, sr, tr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LDA(t,0,t); + V tr = UNPCKH(tx, tx); + V ti = UNPCKL(tx, tx); + tr = VMUL(tr, sr); + sr = VBYI(sr); + return VFNMS(ti, sr, tr); +} +#else /* !FFTW_SINGLE */ +# define VTW1(v,x) {TW_CEXP, v, x} +static inline V BYTW1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMUL(tx, sr); +} +static inline V BYTWJ1(const R *t, V sr) +{ + V tx = LD(t, 1, t); + return VZMULJ(tx, sr); +} +#endif +#define TWVL1 (VL) + +/* twiddle storage #2: twice the space, faster (when in cache) */ +#ifdef FFTW_SINGLE +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+1, x}, \ + {TW_SIN, v, -x}, {TW_SIN, v, x}, {TW_SIN, v+1, -x}, {TW_SIN, v+1, x} +#else /* !FFTW_SINGLE */ +# define VTW2(v,x) \ + {TW_COS, v, x}, {TW_COS, v, x}, {TW_SIN, v, -x}, {TW_SIN, v, x} +#endif +#define TWVL2 (2 * VL) +static inline V BYTW2(const R *t, V sr) +{ + V si = FLIP_RI(sr); + V ti = LDA(t+2*VL,0,t); + V tt = VMUL(ti, si); + V tr = LDA(t,0,t); + return VFMA(tr, sr, tt); +} +static inline V BYTWJ2(const R *t, V sr) +{ + V si = FLIP_RI(sr); + V tr = LDA(t,0,t); + V tt = VMUL(tr, sr); + V ti = LDA(t+2*VL,0,t); + return VFNMS(ti, si, tt); +} + +/* twiddle storage #3 */ +#ifdef FFTW_SINGLE +# define VTW3(v,x) {TW_CEXP, v, x}, {TW_CEXP, v+1, x} +# define TWVL3 (VL) +#else +# define VTW3(v,x) VTW1(v,x) +# define TWVL3 TWVL1 +#endif + +/* twiddle storage for split arrays */ +#ifdef FFTW_SINGLE +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_COS, v+2, x}, {TW_COS, v+3, x}, \ + {TW_SIN, v, x}, {TW_SIN, v+1, x}, {TW_SIN, v+2, x}, {TW_SIN, v+3, x} +#else +# define VTWS(v,x) \ + {TW_COS, v, x}, {TW_COS, v+1, x}, {TW_SIN, v, x}, {TW_SIN, v+1, x} +#endif +#define TWVLS (2 * VL) + +#define VLEAVE() /* nothing */ + +#include "simd-common.h" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/sse2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/sse2.c new file mode 100644 index 000000000..c52c852e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/sse2.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#ifdef FFTW_SINGLE +# define DS(d,s) s /* single-precision option */ +#else +# define DS(d,s) d /* double-precision option */ +#endif + +#if HAVE_SSE2 + +# if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) + + int X(have_simd_sse2)(void) + { + return 1; + } + +# else /* !x86_64 */ + +# include +# include +# include "x86-cpuid.h" + + static jmp_buf jb; + + static void sighandler(int x) + { + UNUSED(x); + longjmp(jb, 1); + } + + static int sse2_works(void) + { + void (*oldsig)(int); + oldsig = signal(SIGILL, sighandler); + if (setjmp(jb)) { + signal(SIGILL, oldsig); + return 0; + } else { +# ifdef _MSC_VER + _asm { DS(xorpd,xorps) xmm0,xmm0 } +# else + /* asm volatile ("xorpd/s %xmm0, %xmm0"); */ + asm volatile(DS(".byte 0x66; .byte 0x0f; .byte 0x57; .byte 0xc0", + ".byte 0x0f; .byte 0x57; .byte 0xc0")); +# endif + signal(SIGILL, oldsig); + return 1; + } + } + + int X(have_simd_sse2)(void) + { + static int init = 0, res; + + if (!init) { + res = !is_386() + && has_cpuid() + && (cpuid_edx(1) & (1 << DS(26,25))) + && sse2_works(); + init = 1; + } + return res; + } + +# endif + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/taint.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/taint.c new file mode 100644 index 000000000..b5da27f8e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/taint.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" +#include "simd-common.h" + +#if HAVE_SIMD + +R *X(taint)(R *p, INT s) +{ + if (((unsigned)s * sizeof(R)) % ALIGNMENT) + p = (R *) (PTRINT(p) | TAINT_BIT); + if (((unsigned)s * sizeof(R)) % ALIGNMENTA) + p = (R *) (PTRINT(p) | TAINT_BITA); + return p; +} + +/* join the taint of two pointers that are supposed to be + the same modulo the taint */ +R *X(join_taint)(R *p1, R *p2) +{ + A(UNTAINT(p1) == UNTAINT(p2)); + return (R *)(PTRINT(p1) | PTRINT(p2)); +} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/vsx.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/vsx.c new file mode 100644 index 000000000..dfd28d152 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/vsx.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * VSX SIMD implementation added 2015 Erik Lindahl. + * Erik Lindahl places his modifications in the public domain. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "kernel/ifftw.h" + +#if HAVE_VSX + +#if HAVE_SYS_SYSCTL_H +# include +#endif + +#include +#include + +static jmp_buf jb; + +static void sighandler(int x) +{ + longjmp(jb, 1); +} + +static int really_have_vsx(void) +{ + void (*oldsig)(int); + oldsig = signal(SIGILL, sighandler); + if (setjmp(jb)) { + signal(SIGILL, oldsig); + return 0; + } else { + float mem[2]; + __asm__ __volatile__ ("stxsdx 0,0,%0" :: "r" (mem) : "memory" ); + signal(SIGILL, oldsig); + return 1; + } + return 0; +} + +int X(have_simd_vsx)(void) +{ + static int init = 0, res; + if (!init) { + res = really_have_vsx(); + init = 1; + } + return res; +} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/x86-cpuid.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/x86-cpuid.h new file mode 100644 index 000000000..a282f463b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/simd-support/x86-cpuid.h @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +/* this code was kindly donated by Eric J. Korpela */ + +#ifdef _MSC_VER +#ifndef inline +#define inline __inline +#endif +#endif + +static inline int is_386() +{ +#ifdef _MSC_VER + unsigned int result,tst; + _asm { + pushfd + pop eax + mov edx,eax + xor eax,40000h + push eax + popfd + pushfd + pop eax + push edx + popfd + mov tst,edx + mov result,eax + } +#else + register unsigned int result,tst; + __asm__ ( + "pushfl\n\t" + "popl %0\n\t" + "movl %0,%1\n\t" + "xorl $0x40000,%0\n\t" + "pushl %0\n\t" + "popfl\n\t" + "pushfl\n\t" + "popl %0\n\t" + "pushl %1\n\t" + "popfl" + : "=r" (result), "=r" (tst) /* output */ + : /* no inputs */ + ); +#endif + return (result == tst); +} + +static inline int has_cpuid() +{ +#ifdef _MSC_VER + unsigned int result,tst; + _asm { + pushfd + pop eax + mov edx,eax + xor eax,200000h + push eax + popfd + pushfd + pop eax + push edx + popfd + mov tst,edx + mov result,eax + } +#else + register unsigned int result,tst; + __asm__ ( + "pushfl\n\t" + "pop %0\n\t" + "movl %0,%1\n\t" + "xorl $0x200000,%0\n\t" + "pushl %0\n\t" + "popfl\n\t" + "pushfl\n\t" + "popl %0\n\t" + "pushl %1\n\t" + "popfl" + : "=r" (result), "=r" (tst) /* output */ + : /* no inputs */ + ); +#endif + return (result != tst); +} + +/* cpuid version to get all registers. Donated by Erik Lindahl from Gromacs. */ +static inline void +cpuid_all(int level, int ecxval, int *eax, int *ebx, int *ecx, int *edx) +{ +#if (defined _MSC_VER) + int CPUInfo[4]; + +# if (_MSC_VER > 1500) || (_MSC_VER == 1500 & _MSC_FULL_VER >= 150030729) + /* MSVC 9.0 SP1 or later */ + __cpuidex(CPUInfo, level, ecxval); +# else + __cpuid(CPUInfo, level); + /* Set an error code if the user wanted a non-zero ecxval, since we did not have cpuidex */ +# endif + *eax = CPUInfo[0]; + *ebx = CPUInfo[1]; + *ecx = CPUInfo[2]; + *edx = CPUInfo[3]; + +#else + /* Not MSVC */ + *eax = level; + *ecx = ecxval; + *ebx = 0; + *edx = 0; + /* Avoid clobbering global offset table in 32-bit pic code (ebx) */ +# if defined(__PIC__) + __asm__ ("xchgl %%ebx, %1 \n\t" + "cpuid \n\t" + "xchgl %%ebx, %1 \n\t" + : "+a" (*eax), "+r" (*ebx), "+c" (*ecx), "+d" (*edx)); +# else + /* No need to save ebx if we are not in pic mode */ + __asm__ ("cpuid \n\t" + : "+a" (*eax), "+b" (*ebx), "+c" (*ecx), "+d" (*edx)); +# endif +#endif +} + +static inline int cpuid_edx(int op) +{ +# ifdef _MSC_VER + int result; + _asm { + push ebx + mov eax,op + cpuid + mov result,edx + pop ebx + } + return result; +# else + int eax, ecx, edx; + + __asm__("push %%ebx\n\tcpuid\n\tpop %%ebx" + : "=a" (eax), "=c" (ecx), "=d" (edx) + : "a" (op)); + return edx; +# endif +} + +static inline int cpuid_ecx(int op) +{ +# ifdef _MSC_VER + int result; + _asm { + push ebx + mov eax,op + cpuid + mov result,ecx + pop ebx + } + return result; +# else + int eax, ecx, edx; + + __asm__("push %%ebx\n\tcpuid\n\tpop %%ebx" + : "=a" (eax), "=c" (ecx), "=d" (edx) + : "a" (op)); + return ecx; +# endif +} + +static inline int xgetbv_eax(int op) +{ +# ifdef _MSC_VER + int veax, vedx; + _asm { + mov ecx,op +# if defined(__INTEL_COMPILER) || (_MSC_VER >= 1600) + xgetbv +# else + __emit 15 + __emit 1 + __emit 208 +# endif + mov veax,eax + mov vedx,edx + } + return veax; +# else + int eax, edx; + __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (op)); + return eax; +#endif +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.am new file mode 100644 index 000000000..5d617dde4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.am @@ -0,0 +1,2 @@ +EXTRA_DIST = Makefile.codelets codelet_prelude.dft codelet_prelude.rdft \ +addchain.c twovers.sh diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.codelets b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.codelets new file mode 100644 index 000000000..bde0ef2cd --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.codelets @@ -0,0 +1,76 @@ +# -*- makefile -*- +# This file contains special make rules to generate codelets. +# Most of this file requires GNU make . + +CODLIST = codlist.c +CODELET_NAME=codelet_ + +# only delete codlist.c in maintainer-mode, since it is included in the dist +# FIXME: is there a way to delete in 'make clean' only when builddir != srcdir? +maintainer-clean-local: + rm -f $(CODLIST) + +if MAINTAINER_MODE + +# rule to build codlist +$(CODLIST): Makefile + ( \ + echo "#include \"kernel/ifftw.h\""; \ + echo $(INCLUDE_SIMD_HEADER); \ + echo; \ + for i in $(ALL_CODELETS) NIL; do \ + if test "$$i" != NIL; then \ + j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ + echo "extern void $(XRENAME)($(CODELET_NAME)$$j)(planner *);"; \ + fi \ + done; \ + echo; \ + echo; \ + echo "extern const solvtab $(SOLVTAB_NAME);"; \ + echo "const solvtab $(SOLVTAB_NAME) = {"; \ + for i in $(ALL_CODELETS) NIL; do \ + if test "$$i" != NIL; then \ + j=`basename $$i | sed -e 's/[.][cS]$$//g'`; \ + echo " SOLVTAB($(XRENAME)($(CODELET_NAME)$$j)),"; \ + fi \ + done; \ + echo " SOLVTAB_END"; \ + echo "};"; \ + ) >$@ + +#INDENT = indent -kr -cs -i5 -l800 -fca -nfc1 -sc -sob -cli4 -TR -Tplanner -TV +TWOVERS = sh ${top_srcdir}/support/twovers.sh +GENFFTDIR = ${top_builddir}/genfft +GEN_NOTW = ${GENFFTDIR}/gen_notw.native +GEN_NOTW_C = ${GENFFTDIR}/gen_notw_c.native +GEN_TWIDDLE = ${GENFFTDIR}/gen_twiddle.native +GEN_TWIDDLE_C = ${GENFFTDIR}/gen_twiddle_c.native +GEN_TWIDSQ = ${GENFFTDIR}/gen_twidsq.native +GEN_TWIDSQ_C = ${GENFFTDIR}/gen_twidsq_c.native +GEN_R2CF = ${GENFFTDIR}/gen_r2cf.native +GEN_R2CB = ${GENFFTDIR}/gen_r2cb.native +GEN_HC2HC = ${GENFFTDIR}/gen_hc2hc.native +GEN_HC2C = ${GENFFTDIR}/gen_hc2c.native +GEN_HC2CDFT = ${GENFFTDIR}/gen_hc2cdft.native +GEN_HC2CDFT_C = ${GENFFTDIR}/gen_hc2cdft_c.native +GEN_R2R = ${GENFFTDIR}/gen_r2r.native +PRELUDE_DFT = ${top_srcdir}/support/codelet_prelude.dft +PRELUDE_RDFT = ${top_srcdir}/support/codelet_prelude.rdft +ADD_DATE = sed -e s/@DATE@/"`date`"/ + +COPYRIGHT=${top_srcdir}/COPYRIGHT +CODELET_DEPS=$(COPYRIGHT) $(PRELUDE) +PRELUDE_COMMANDS_DFT=cat $(COPYRIGHT) $(PRELUDE_DFT) +PRELUDE_COMMANDS_RDFT=cat $(COPYRIGHT) $(PRELUDE_RDFT) + +FLAGS_COMMON = -compact -variables 4 +DFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 +RDFT_FLAGS_COMMON = $(FLAGS_COMMON) -pipeline-latency 4 + +# cancel the hideous builtin rules that cause an infinite loop +%: %.o +%: %.s +%: %.c +%: %.S + +endif # MAINTAINER_MODE diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.in new file mode 100644 index 000000000..ae4b50806 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/Makefile.in @@ -0,0 +1,481 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = support +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = Makefile.codelets codelet_prelude.dft codelet_prelude.rdft \ +addchain.c twovers.sh + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu support/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu support/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/addchain.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/addchain.c new file mode 100644 index 000000000..66b2583e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/addchain.c @@ -0,0 +1,171 @@ +/* addition-chain optimizer */ +#include +#include +#include + +static int verbose; +static int mulcost = 18; +static int ldcost = 2; +static int sqcost = 10; +static int reflcost = 8; +#define INFTY 100000 + +static int *answer; +static int best_so_far; + +static void print_answer(int n, int t) +{ + int i; + printf("| (%d, %d) -> [", n, t); + for (i = 0; i < t; ++i) + printf("%d;", answer[i]); + printf("] (* %d *)\n", best_so_far); +} + +#define DO(i, j, k, cst) \ +if (k < n) { \ + int c = A[i] + A[j] + cst; \ + if (c < A[k]) { \ + A[k] = c; \ + changed = 1; \ + } \ +} + +#define DO3(i, j, l, k, cst) \ +if (k < n) { \ + int c = A[i] + A[j] + A[l] + cst; \ + if (c < A[k]) { \ + A[k] = c; \ + changed = 1; \ + } \ +} + +static int optimize(int n, int *A) +{ + int i, j, k, changed, cst, cstmax; + + do { + changed = 0; + for (i = 0; i < n; ++i) { + k = i + i; + DO(i, i, k, sqcost); + } + + for (i = 0; i < n; ++i) { + for (j = 0; j <= i; ++j) { + k = i + j; + DO(i, j, k, mulcost); + k = i - j; + DO(i, j, k, mulcost); + + k = i + j; + DO3(i, j, i - j, k, reflcost); + } + } + + } while (changed); + + cst = cstmax = 0; + for (i = 0; i < n; ++i) { + cst += A[i]; + if (A[i] > cstmax) cstmax = A[i]; + } +/* return cstmax; */ + return cst; +} + +static void search(int n, int t, int *A, int *B, int depth) +{ + if (depth == 0) { + int i, tc; + for (i = 0; i < n; ++i) + A[i] = INFTY; + A[0] = 0; /* always free */ + for (i = 1; i <= t; ++i) + A[B[-i]] = ldcost; + + tc = optimize(n, A); + if (tc < best_so_far) { + best_so_far = tc; + for (i = 1; i <= t; ++i) + answer[t - i] = B[-i]; + if (verbose) + print_answer(n, t); + } + } else { + for (B[0] = B[-1] + 1; B[0] < n; ++B[0]) + search(n, t, A, B + 1, depth - 1); + } +} + +static void doit(int n, int t) +{ + int *A; + int *B; + + A = malloc(n * sizeof(int)); + B = malloc((t + 1) * sizeof(int)); + answer = malloc(t * sizeof(int)); + + B[0] = 0; + best_so_far = INFTY; + search(n, t, A, B + 1, t); + + print_answer(n, t); + + free(A); free(B); free(answer); +} + +int main(int argc, char *argv[]) +{ + int n = 32; + int t = 3; + int all; + int ch; + + verbose = 0; + all = 0; + while ((ch = getopt(argc, argv, "n:t:m:l:r:s:va")) != -1) { + switch (ch) { + case 'n': + n = atoi(optarg); + break; + case 't': + t = atoi(optarg); + break; + case 'm': + mulcost = atoi(optarg); + break; + case 'l': + ldcost = atoi(optarg); + break; + case 's': + sqcost = atoi(optarg); + break; + case 'r': + reflcost = atoi(optarg); + break; + case 'v': + ++verbose; + break; + case 'a': + ++all; + break; + case '?': + fprintf(stderr, "use the source\n"); + exit(1); + } + } + + if (all) { + for (n = 4; n <= 64; n *= 2) { + int n1 = n - 1; if (n1 > 7) n1 = 7; + for (t = 1; t <= n1; ++t) + doit(n, t); + } + } else { + doit(n, t); + } + + return 0; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/codelet_prelude.dft b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/codelet_prelude.dft new file mode 100644 index 000000000..d7fb0412a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/codelet_prelude.dft @@ -0,0 +1,8 @@ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on @DATE@ */ + +#include "dft/codelet-dft.h" + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/codelet_prelude.rdft b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/codelet_prelude.rdft new file mode 100644 index 000000000..32fcb070e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/codelet_prelude.rdft @@ -0,0 +1,8 @@ + +/* This file was automatically generated --- DO NOT EDIT */ +/* Generated on @DATE@ */ + +#include "rdft/codelet-rdft.h" + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/twovers.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/twovers.sh new file mode 100755 index 000000000..97a5f0070 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/support/twovers.sh @@ -0,0 +1,17 @@ +#! /bin/sh + +# wrapper to generate two codelet versions, with and without +# fma + +genfft=$1 +shift + +echo "#if defined(ARCH_PREFERS_FMA) || defined(ISA_EXTENSION_PREFERS_FMA)" +echo + $genfft -fma $* +echo +echo "#else" +echo + $genfft $* +echo +echo "#endif" diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/Makefile.am new file mode 100644 index 000000000..9f3b5189e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/Makefile.am @@ -0,0 +1,77 @@ +AM_CPPFLAGS = -I $(top_srcdir) +noinst_PROGRAMS = bench +EXTRA_DIST = check.pl README + +if THREADS +bench_CFLAGS = $(PTHREAD_CFLAGS) +if !COMBINED_THREADS +LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_threads.la +endif +else +if OPENMP +bench_CFLAGS = $(OPENMP_CFLAGS) +LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_omp.la +endif +endif + +bench_SOURCES = bench.c hook.c fftw-bench.c fftw-bench.h +bench_LDADD = $(LIBFFTWTHREADS) \ +$(top_builddir)/libfftw3@PREC_SUFFIX@.la \ +$(top_builddir)/libbench2/libbench2.a $(THREADLIBS) + +check-local: bench$(EXEEXT) + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -r -c=30 -v `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW transforms passed basic tests!" + @echo "--------------------------------------------------------------" +if SMP + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -r -c=30 -v --nthreads=2 `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW threaded transforms passed basic tests!" + @echo "--------------------------------------------------------------" +endif + +bigcheck: bench$(EXEEXT) + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW transforms passed big tests!" + @echo "--------------------------------------------------------------" +if SMP + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v --nthreads=2 `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v --nthreads=3 `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v --nthreads=10 `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW threaded transforms passed big tests!" + @echo "--------------------------------------------------------------" +endif + +smallcheck: bench$(EXEEXT) + perl -w $(srcdir)/check.pl -r -c=1 -v `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -r --estimate -c=5 -v `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW transforms passed a few tests!" + @echo "--------------------------------------------------------------" +if SMP + perl -w $(srcdir)/check.pl -r --estimate -c=2 -v --nthreads=2 `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW threaded transforms passed a few tests!" + @echo "--------------------------------------------------------------" +endif + +paranoid-check: bench$(EXEEXT) +if SMP + perl -w $(srcdir)/check.pl -a --patient --nthreads=10 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --patient --nthreads=7 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --patient --nthreads=3 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --patient --nthreads=2 --paranoid `pwd`/bench$(EXEEXT) +endif + perl -w $(srcdir)/check.pl -a --patient --paranoid `pwd`/bench$(EXEEXT) + +exhaustive-check: bench$(EXEEXT) +if SMP + perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=10 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=7 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=3 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=2 --paranoid `pwd`/bench$(EXEEXT) +endif + perl -w $(srcdir)/check.pl -a --exhaustive --paranoid `pwd`/bench$(EXEEXT) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/Makefile.in new file mode 100644 index 000000000..b66561a02 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/Makefile.in @@ -0,0 +1,734 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = bench$(EXEEXT) +subdir = tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_bench_OBJECTS = bench-bench.$(OBJEXT) bench-hook.$(OBJEXT) \ + bench-fftw-bench.$(OBJEXT) +bench_OBJECTS = $(am_bench_OBJECTS) +am__DEPENDENCIES_1 = +bench_DEPENDENCIES = $(LIBFFTWTHREADS) \ + $(top_builddir)/libfftw3@PREC_SUFFIX@.la \ + $(top_builddir)/libbench2/libbench2.a $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +bench_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(bench_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(bench_SOURCES) +DIST_SOURCES = $(bench_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +EXTRA_DIST = check.pl README +@OPENMP_TRUE@@THREADS_FALSE@bench_CFLAGS = $(OPENMP_CFLAGS) +@THREADS_TRUE@bench_CFLAGS = $(PTHREAD_CFLAGS) +@COMBINED_THREADS_FALSE@@THREADS_TRUE@LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_threads.la +@OPENMP_TRUE@@THREADS_FALSE@LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_omp.la +bench_SOURCES = bench.c hook.c fftw-bench.c fftw-bench.h +bench_LDADD = $(LIBFFTWTHREADS) \ +$(top_builddir)/libfftw3@PREC_SUFFIX@.la \ +$(top_builddir)/libbench2/libbench2.a $(THREADLIBS) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +bench$(EXEEXT): $(bench_OBJECTS) $(bench_DEPENDENCIES) $(EXTRA_bench_DEPENDENCIES) + @rm -f bench$(EXEEXT) + $(AM_V_CCLD)$(bench_LINK) $(bench_OBJECTS) $(bench_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench-bench.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench-fftw-bench.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench-hook.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +bench-bench.o: bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -MT bench-bench.o -MD -MP -MF $(DEPDIR)/bench-bench.Tpo -c -o bench-bench.o `test -f 'bench.c' || echo '$(srcdir)/'`bench.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bench-bench.Tpo $(DEPDIR)/bench-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bench.c' object='bench-bench.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -c -o bench-bench.o `test -f 'bench.c' || echo '$(srcdir)/'`bench.c + +bench-bench.obj: bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -MT bench-bench.obj -MD -MP -MF $(DEPDIR)/bench-bench.Tpo -c -o bench-bench.obj `if test -f 'bench.c'; then $(CYGPATH_W) 'bench.c'; else $(CYGPATH_W) '$(srcdir)/bench.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bench-bench.Tpo $(DEPDIR)/bench-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bench.c' object='bench-bench.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -c -o bench-bench.obj `if test -f 'bench.c'; then $(CYGPATH_W) 'bench.c'; else $(CYGPATH_W) '$(srcdir)/bench.c'; fi` + +bench-hook.o: hook.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -MT bench-hook.o -MD -MP -MF $(DEPDIR)/bench-hook.Tpo -c -o bench-hook.o `test -f 'hook.c' || echo '$(srcdir)/'`hook.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bench-hook.Tpo $(DEPDIR)/bench-hook.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hook.c' object='bench-hook.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -c -o bench-hook.o `test -f 'hook.c' || echo '$(srcdir)/'`hook.c + +bench-hook.obj: hook.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -MT bench-hook.obj -MD -MP -MF $(DEPDIR)/bench-hook.Tpo -c -o bench-hook.obj `if test -f 'hook.c'; then $(CYGPATH_W) 'hook.c'; else $(CYGPATH_W) '$(srcdir)/hook.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bench-hook.Tpo $(DEPDIR)/bench-hook.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hook.c' object='bench-hook.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -c -o bench-hook.obj `if test -f 'hook.c'; then $(CYGPATH_W) 'hook.c'; else $(CYGPATH_W) '$(srcdir)/hook.c'; fi` + +bench-fftw-bench.o: fftw-bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -MT bench-fftw-bench.o -MD -MP -MF $(DEPDIR)/bench-fftw-bench.Tpo -c -o bench-fftw-bench.o `test -f 'fftw-bench.c' || echo '$(srcdir)/'`fftw-bench.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bench-fftw-bench.Tpo $(DEPDIR)/bench-fftw-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fftw-bench.c' object='bench-fftw-bench.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -c -o bench-fftw-bench.o `test -f 'fftw-bench.c' || echo '$(srcdir)/'`fftw-bench.c + +bench-fftw-bench.obj: fftw-bench.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -MT bench-fftw-bench.obj -MD -MP -MF $(DEPDIR)/bench-fftw-bench.Tpo -c -o bench-fftw-bench.obj `if test -f 'fftw-bench.c'; then $(CYGPATH_W) 'fftw-bench.c'; else $(CYGPATH_W) '$(srcdir)/fftw-bench.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bench-fftw-bench.Tpo $(DEPDIR)/bench-fftw-bench.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fftw-bench.c' object='bench-fftw-bench.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bench_CFLAGS) $(CFLAGS) -c -o bench-fftw-bench.obj `if test -f 'fftw-bench.c'; then $(CYGPATH_W) 'fftw-bench.c'; else $(CYGPATH_W) '$(srcdir)/fftw-bench.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am check-local clean \ + clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +check-local: bench$(EXEEXT) + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -r -c=30 -v `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW transforms passed basic tests!" + @echo "--------------------------------------------------------------" +@SMP_TRUE@ perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -r -c=30 -v --nthreads=2 `pwd`/bench$(EXEEXT) +@SMP_TRUE@ @echo "--------------------------------------------------------------" +@SMP_TRUE@ @echo " FFTW threaded transforms passed basic tests!" +@SMP_TRUE@ @echo "--------------------------------------------------------------" + +bigcheck: bench$(EXEEXT) + perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW transforms passed big tests!" + @echo "--------------------------------------------------------------" +@SMP_TRUE@ perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v --nthreads=2 `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v --nthreads=3 `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl $(CHECK_PL_OPTS) -a -v --nthreads=10 `pwd`/bench$(EXEEXT) +@SMP_TRUE@ @echo "--------------------------------------------------------------" +@SMP_TRUE@ @echo " FFTW threaded transforms passed big tests!" +@SMP_TRUE@ @echo "--------------------------------------------------------------" + +smallcheck: bench$(EXEEXT) + perl -w $(srcdir)/check.pl -r -c=1 -v `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -r --estimate -c=5 -v `pwd`/bench$(EXEEXT) + @echo "--------------------------------------------------------------" + @echo " FFTW transforms passed a few tests!" + @echo "--------------------------------------------------------------" +@SMP_TRUE@ perl -w $(srcdir)/check.pl -r --estimate -c=2 -v --nthreads=2 `pwd`/bench$(EXEEXT) +@SMP_TRUE@ @echo "--------------------------------------------------------------" +@SMP_TRUE@ @echo " FFTW threaded transforms passed a few tests!" +@SMP_TRUE@ @echo "--------------------------------------------------------------" + +paranoid-check: bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --patient --nthreads=10 --paranoid `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --patient --nthreads=7 --paranoid `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --patient --nthreads=3 --paranoid `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --patient --nthreads=2 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --patient --paranoid `pwd`/bench$(EXEEXT) + +exhaustive-check: bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=10 --paranoid `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=7 --paranoid `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=3 --paranoid `pwd`/bench$(EXEEXT) +@SMP_TRUE@ perl -w $(srcdir)/check.pl -a --exhaustive --nthreads=2 --paranoid `pwd`/bench$(EXEEXT) + perl -w $(srcdir)/check.pl -a --exhaustive --paranoid `pwd`/bench$(EXEEXT) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/README b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/README new file mode 100644 index 000000000..5a5c6e6f8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/README @@ -0,0 +1,73 @@ +This directory contains a benchmarking and testing program +for fftw3. + +The `bench' program has a zillion options, because we use it for +benchmarking other FFT libraries as well. This file only documents +the basic usage of bench. + +Usage: bench + +where each command is as follows: + +-s +--speed + + Benchmarks the speed of . + + The syntax for problems is [i|o][r|c][f|b], where + + i/o means in-place or out-of-place. Out of place is the default. + r/c means real or complex transform. Complex is the default. + f/b means forward or backward transform. Forward is the default. + is an arbitrary multidimensional sequence of integers + separated by the character 'x'. + + (The syntax for problems is actually richer, but we do not document + it here. See the man page for fftw-wisdom for more information.) + + Example: + + ib256 : in-place backward complex transform of size 256 + 32x64 : out-of-place forward complex 2D transform of 32 rows + and 64 columns. + +-y +--verify + + Verify that FFTW is computing the correct answer. + + The program does not output anything unless an error occurs or + verbosity is at least one. + +-v + + Set verbosity to , or 1 if is omitted. -v2 will output + the created plans with fftw_print_plan. + +-oestimate +-opatient +-oexhaustive + + Plan with FFTW_ESTIMATE, FFTW_PATIENT, or FFTW_EXHAUSTIVE, respectively. + The default is FFTW_MEASURE. + + If you benchmark FFTW, please use -opatient. + +-onthreads=N + + Use N threads, if FFTW was compiled with --enable-threads. N + must be a positive integer; the default is N=1. + +-onosimd + + Disable SIMD instructions (e.g. SSE or SSE2). + +-ounaligned + + Plan with the FFTW_UNALIGNED flag. + +-owisdom + + On startup, read wisdom from a file wis.dat in the current directory + (if it exists). On completion, write accumulated wisdom to wis.dat + (overwriting any existing file of that name). diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/bench.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/bench.c new file mode 100644 index 000000000..9fd5dd358 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/bench.c @@ -0,0 +1,552 @@ +/**************************************************************************/ +/* NOTE to users: this is the FFTW self-test and benchmark program. + It is probably NOT a good place to learn FFTW usage, since it has a + lot of added complexity in order to exercise and test the full API, + etcetera. We suggest reading the manual. + + (Some of the self-test code is split off into fftw-bench.c and + hook.c.) */ +/**************************************************************************/ + +#include +#include +#include +#include "tests/fftw-bench.h" + +static const char *mkversion(void) { return FFTW(version); } +static const char *mkcc(void) { return FFTW(cc); } +static const char *mkcodelet_optim(void) { return FFTW(codelet_optim); } + +BEGIN_BENCH_DOC +BENCH_DOC("name", "fftw3") +BENCH_DOCF("version", mkversion) +BENCH_DOCF("cc", mkcc) +BENCH_DOCF("codelet-optim", mkcodelet_optim) +END_BENCH_DOC + +static FFTW(iodim) *bench_tensor_to_fftw_iodim(bench_tensor *t) +{ + FFTW(iodim) *d; + int i; + + BENCH_ASSERT(t->rnk >= 0); + if (t->rnk == 0) return 0; + + d = (FFTW(iodim) *)bench_malloc(sizeof(FFTW(iodim)) * t->rnk); + for (i = 0; i < t->rnk; ++i) { + d[i].n = t->dims[i].n; + d[i].is = t->dims[i].is; + d[i].os = t->dims[i].os; + } + + return d; +} + +static void extract_reim_split(int sign, int size, bench_real *p, + bench_real **r, bench_real **i) +{ + if (sign == FFTW_FORWARD) { + *r = p + 0; + *i = p + size; + } else { + *r = p + size; + *i = p + 0; + } +} + +static int sizeof_problem(bench_problem *p) +{ + return tensor_sz(p->sz) * tensor_sz(p->vecsz); +} + +/* ouch */ +static int expressible_as_api_many(bench_tensor *t) +{ + int i; + + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); + + i = t->rnk - 1; + while (--i >= 0) { + bench_iodim *d = t->dims + i; + if (d[0].is % d[1].is) return 0; + if (d[0].os % d[1].os) return 0; + } + return 1; +} + +static int *mkn(bench_tensor *t) +{ + int *n = (int *) bench_malloc(sizeof(int *) * t->rnk); + int i; + for (i = 0; i < t->rnk; ++i) + n[i] = t->dims[i].n; + return n; +} + +static void mknembed_many(bench_tensor *t, int **inembedp, int **onembedp) +{ + int i; + bench_iodim *d; + int *inembed = (int *) bench_malloc(sizeof(int *) * t->rnk); + int *onembed = (int *) bench_malloc(sizeof(int *) * t->rnk); + + BENCH_ASSERT(BENCH_FINITE_RNK(t->rnk)); + *inembedp = inembed; *onembedp = onembed; + + i = t->rnk - 1; + while (--i >= 0) { + d = t->dims + i; + inembed[i+1] = d[0].is / d[1].is; + onembed[i+1] = d[0].os / d[1].os; + } +} + +/* try to use the most appropriate API function. Big mess. */ + +static int imax(int a, int b) { return (a > b ? a : b); } + +static int halfish_sizeof_problem(bench_problem *p) +{ + int n2 = sizeof_problem(p); + if (BENCH_FINITE_RNK(p->sz->rnk) && p->sz->rnk > 0) + n2 = (n2 / imax(p->sz->dims[p->sz->rnk - 1].n, 1)) * + (p->sz->dims[p->sz->rnk - 1].n / 2 + 1); + return n2; +} + +static FFTW(plan) mkplan_real_split(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln; + bench_tensor *sz = p->sz, *vecsz = p->vecsz; + FFTW(iodim) *dims, *howmany_dims; + bench_real *ri, *ii, *ro, *io; + int n2 = halfish_sizeof_problem(p); + + extract_reim_split(FFTW_FORWARD, n2, (bench_real *) p->in, &ri, &ii); + extract_reim_split(FFTW_FORWARD, n2, (bench_real *) p->out, &ro, &io); + + dims = bench_tensor_to_fftw_iodim(sz); + howmany_dims = bench_tensor_to_fftw_iodim(vecsz); + if (p->sign < 0) { + if (verbose > 2) printf("using plan_guru_split_dft_r2c\n"); + pln = FFTW(plan_guru_split_dft_r2c)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + ri, ro, io, flags); + } + else { + if (verbose > 2) printf("using plan_guru_split_dft_c2r\n"); + pln = FFTW(plan_guru_split_dft_c2r)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + ri, ii, ro, flags); + } + bench_free(dims); + bench_free(howmany_dims); + return pln; +} + +static FFTW(plan) mkplan_real_interleaved(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln; + bench_tensor *sz = p->sz, *vecsz = p->vecsz; + + if (vecsz->rnk == 0 && tensor_unitstridep(sz) + && tensor_real_rowmajorp(sz, p->sign, p->in_place)) + goto api_simple; + + if (vecsz->rnk == 1 && expressible_as_api_many(sz)) + goto api_many; + + goto api_guru; + + api_simple: + switch (sz->rnk) { + case 1: + if (p->sign < 0) { + if (verbose > 2) printf("using plan_dft_r2c_1d\n"); + return FFTW(plan_dft_r2c_1d)(sz->dims[0].n, + (bench_real *) p->in, + (bench_complex *) p->out, + flags); + } + else { + if (verbose > 2) printf("using plan_dft_c2r_1d\n"); + return FFTW(plan_dft_c2r_1d)(sz->dims[0].n, + (bench_complex *) p->in, + (bench_real *) p->out, + flags); + } + break; + case 2: + if (p->sign < 0) { + if (verbose > 2) printf("using plan_dft_r2c_2d\n"); + return FFTW(plan_dft_r2c_2d)(sz->dims[0].n, sz->dims[1].n, + (bench_real *) p->in, + (bench_complex *) p->out, + flags); + } + else { + if (verbose > 2) printf("using plan_dft_c2r_2d\n"); + return FFTW(plan_dft_c2r_2d)(sz->dims[0].n, sz->dims[1].n, + (bench_complex *) p->in, + (bench_real *) p->out, + flags); + } + break; + case 3: + if (p->sign < 0) { + if (verbose > 2) printf("using plan_dft_r2c_3d\n"); + return FFTW(plan_dft_r2c_3d)( + sz->dims[0].n, sz->dims[1].n, sz->dims[2].n, + (bench_real *) p->in, (bench_complex *) p->out, + flags); + } + else { + if (verbose > 2) printf("using plan_dft_c2r_3d\n"); + return FFTW(plan_dft_c2r_3d)( + sz->dims[0].n, sz->dims[1].n, sz->dims[2].n, + (bench_complex *) p->in, (bench_real *) p->out, + flags); + } + break; + default: { + int *n = mkn(sz); + if (p->sign < 0) { + if (verbose > 2) printf("using plan_dft_r2c\n"); + pln = FFTW(plan_dft_r2c)(sz->rnk, n, + (bench_real *) p->in, + (bench_complex *) p->out, + flags); + } + else { + if (verbose > 2) printf("using plan_dft_c2r\n"); + pln = FFTW(plan_dft_c2r)(sz->rnk, n, + (bench_complex *) p->in, + (bench_real *) p->out, + flags); + } + bench_free(n); + return pln; + } + } + + api_many: + { + int *n, *inembed, *onembed; + BENCH_ASSERT(vecsz->rnk == 1); + n = mkn(sz); + mknembed_many(sz, &inembed, &onembed); + if (p->sign < 0) { + if (verbose > 2) printf("using plan_many_dft_r2c\n"); + pln = FFTW(plan_many_dft_r2c)( + sz->rnk, n, vecsz->dims[0].n, + (bench_real *) p->in, inembed, + sz->dims[sz->rnk - 1].is, vecsz->dims[0].is, + (bench_complex *) p->out, onembed, + sz->dims[sz->rnk - 1].os, vecsz->dims[0].os, + flags); + } + else { + if (verbose > 2) printf("using plan_many_dft_c2r\n"); + pln = FFTW(plan_many_dft_c2r)( + sz->rnk, n, vecsz->dims[0].n, + (bench_complex *) p->in, inembed, + sz->dims[sz->rnk - 1].is, vecsz->dims[0].is, + (bench_real *) p->out, onembed, + sz->dims[sz->rnk - 1].os, vecsz->dims[0].os, + flags); + } + bench_free(n); bench_free(inembed); bench_free(onembed); + return pln; + } + + api_guru: + { + FFTW(iodim) *dims, *howmany_dims; + + if (p->sign < 0) { + dims = bench_tensor_to_fftw_iodim(sz); + howmany_dims = bench_tensor_to_fftw_iodim(vecsz); + if (verbose > 2) printf("using plan_guru_dft_r2c\n"); + pln = FFTW(plan_guru_dft_r2c)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + (bench_real *) p->in, + (bench_complex *) p->out, + flags); + } + else { + dims = bench_tensor_to_fftw_iodim(sz); + howmany_dims = bench_tensor_to_fftw_iodim(vecsz); + if (verbose > 2) printf("using plan_guru_dft_c2r\n"); + pln = FFTW(plan_guru_dft_c2r)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + (bench_complex *) p->in, + (bench_real *) p->out, + flags); + } + bench_free(dims); + bench_free(howmany_dims); + return pln; + } +} + +static FFTW(plan) mkplan_real(bench_problem *p, unsigned flags) +{ + if (p->split) + return mkplan_real_split(p, flags); + else + return mkplan_real_interleaved(p, flags); +} + +static FFTW(plan) mkplan_complex_split(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln; + bench_tensor *sz = p->sz, *vecsz = p->vecsz; + FFTW(iodim) *dims, *howmany_dims; + bench_real *ri, *ii, *ro, *io; + + extract_reim_split(p->sign, p->iphyssz, (bench_real *) p->in, &ri, &ii); + extract_reim_split(p->sign, p->ophyssz, (bench_real *) p->out, &ro, &io); + + dims = bench_tensor_to_fftw_iodim(sz); + howmany_dims = bench_tensor_to_fftw_iodim(vecsz); + if (verbose > 2) printf("using plan_guru_split_dft\n"); + pln = FFTW(plan_guru_split_dft)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + ri, ii, ro, io, flags); + bench_free(dims); + bench_free(howmany_dims); + return pln; +} + +static FFTW(plan) mkplan_complex_interleaved(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln; + bench_tensor *sz = p->sz, *vecsz = p->vecsz; + + if (vecsz->rnk == 0 && tensor_unitstridep(sz) && tensor_rowmajorp(sz)) + goto api_simple; + + if (vecsz->rnk == 1 && expressible_as_api_many(sz)) + goto api_many; + + goto api_guru; + + api_simple: + switch (sz->rnk) { + case 1: + if (verbose > 2) printf("using plan_dft_1d\n"); + return FFTW(plan_dft_1d)(sz->dims[0].n, + (bench_complex *) p->in, + (bench_complex *) p->out, + p->sign, flags); + break; + case 2: + if (verbose > 2) printf("using plan_dft_2d\n"); + return FFTW(plan_dft_2d)(sz->dims[0].n, sz->dims[1].n, + (bench_complex *) p->in, + (bench_complex *) p->out, + p->sign, flags); + break; + case 3: + if (verbose > 2) printf("using plan_dft_3d\n"); + return FFTW(plan_dft_3d)( + sz->dims[0].n, sz->dims[1].n, sz->dims[2].n, + (bench_complex *) p->in, (bench_complex *) p->out, + p->sign, flags); + break; + default: { + int *n = mkn(sz); + if (verbose > 2) printf("using plan_dft\n"); + pln = FFTW(plan_dft)(sz->rnk, n, + (bench_complex *) p->in, + (bench_complex *) p->out, p->sign, flags); + bench_free(n); + return pln; + } + } + + api_many: + { + int *n, *inembed, *onembed; + BENCH_ASSERT(vecsz->rnk == 1); + n = mkn(sz); + mknembed_many(sz, &inembed, &onembed); + if (verbose > 2) printf("using plan_many_dft\n"); + pln = FFTW(plan_many_dft)( + sz->rnk, n, vecsz->dims[0].n, + (bench_complex *) p->in, + inembed, sz->dims[sz->rnk - 1].is, vecsz->dims[0].is, + (bench_complex *) p->out, + onembed, sz->dims[sz->rnk - 1].os, vecsz->dims[0].os, + p->sign, flags); + bench_free(n); bench_free(inembed); bench_free(onembed); + return pln; + } + + api_guru: + { + FFTW(iodim) *dims, *howmany_dims; + + dims = bench_tensor_to_fftw_iodim(sz); + howmany_dims = bench_tensor_to_fftw_iodim(vecsz); + if (verbose > 2) printf("using plan_guru_dft\n"); + pln = FFTW(plan_guru_dft)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + (bench_complex *) p->in, + (bench_complex *) p->out, + p->sign, flags); + bench_free(dims); + bench_free(howmany_dims); + return pln; + } +} + +static FFTW(plan) mkplan_complex(bench_problem *p, unsigned flags) +{ + if (p->split) + return mkplan_complex_split(p, flags); + else + return mkplan_complex_interleaved(p, flags); +} + +static FFTW(plan) mkplan_r2r(bench_problem *p, unsigned flags) +{ + FFTW(plan) pln; + bench_tensor *sz = p->sz, *vecsz = p->vecsz; + FFTW(r2r_kind) *k; + + k = (FFTW(r2r_kind) *) bench_malloc(sizeof(FFTW(r2r_kind)) * sz->rnk); + { + int i; + for (i = 0; i < sz->rnk; ++i) + switch (p->k[i]) { + case R2R_R2HC: k[i] = FFTW_R2HC; break; + case R2R_HC2R: k[i] = FFTW_HC2R; break; + case R2R_DHT: k[i] = FFTW_DHT; break; + case R2R_REDFT00: k[i] = FFTW_REDFT00; break; + case R2R_REDFT01: k[i] = FFTW_REDFT01; break; + case R2R_REDFT10: k[i] = FFTW_REDFT10; break; + case R2R_REDFT11: k[i] = FFTW_REDFT11; break; + case R2R_RODFT00: k[i] = FFTW_RODFT00; break; + case R2R_RODFT01: k[i] = FFTW_RODFT01; break; + case R2R_RODFT10: k[i] = FFTW_RODFT10; break; + case R2R_RODFT11: k[i] = FFTW_RODFT11; break; + default: BENCH_ASSERT(0); + } + } + + if (vecsz->rnk == 0 && tensor_unitstridep(sz) && tensor_rowmajorp(sz)) + goto api_simple; + + if (vecsz->rnk == 1 && expressible_as_api_many(sz)) + goto api_many; + + goto api_guru; + + api_simple: + switch (sz->rnk) { + case 1: + if (verbose > 2) printf("using plan_r2r_1d\n"); + pln = FFTW(plan_r2r_1d)(sz->dims[0].n, + (bench_real *) p->in, + (bench_real *) p->out, + k[0], flags); + goto done; + case 2: + if (verbose > 2) printf("using plan_r2r_2d\n"); + pln = FFTW(plan_r2r_2d)(sz->dims[0].n, sz->dims[1].n, + (bench_real *) p->in, + (bench_real *) p->out, + k[0], k[1], flags); + goto done; + case 3: + if (verbose > 2) printf("using plan_r2r_3d\n"); + pln = FFTW(plan_r2r_3d)( + sz->dims[0].n, sz->dims[1].n, sz->dims[2].n, + (bench_real *) p->in, (bench_real *) p->out, + k[0], k[1], k[2], flags); + goto done; + default: { + int *n = mkn(sz); + if (verbose > 2) printf("using plan_r2r\n"); + pln = FFTW(plan_r2r)(sz->rnk, n, + (bench_real *) p->in, (bench_real *) p->out, + k, flags); + bench_free(n); + goto done; + } + } + + api_many: + { + int *n, *inembed, *onembed; + BENCH_ASSERT(vecsz->rnk == 1); + n = mkn(sz); + mknembed_many(sz, &inembed, &onembed); + if (verbose > 2) printf("using plan_many_r2r\n"); + pln = FFTW(plan_many_r2r)( + sz->rnk, n, vecsz->dims[0].n, + (bench_real *) p->in, + inembed, sz->dims[sz->rnk - 1].is, vecsz->dims[0].is, + (bench_real *) p->out, + onembed, sz->dims[sz->rnk - 1].os, vecsz->dims[0].os, + k, flags); + bench_free(n); bench_free(inembed); bench_free(onembed); + goto done; + } + + api_guru: + { + FFTW(iodim) *dims, *howmany_dims; + + dims = bench_tensor_to_fftw_iodim(sz); + howmany_dims = bench_tensor_to_fftw_iodim(vecsz); + if (verbose > 2) printf("using plan_guru_r2r\n"); + pln = FFTW(plan_guru_r2r)(sz->rnk, dims, + vecsz->rnk, howmany_dims, + (bench_real *) p->in, + (bench_real *) p->out, k, flags); + bench_free(dims); + bench_free(howmany_dims); + goto done; + } + + done: + bench_free(k); + return pln; +} + +FFTW(plan) mkplan(bench_problem *p, unsigned flags) +{ + switch (p->kind) { + case PROBLEM_COMPLEX: return mkplan_complex(p, flags); + case PROBLEM_REAL: return mkplan_real(p, flags); + case PROBLEM_R2R: return mkplan_r2r(p, flags); + default: BENCH_ASSERT(0); return 0; + } +} + +void main_init(int *argc, char ***argv) +{ + UNUSED(argc); + UNUSED(argv); +} + +void initial_cleanup(void) +{ +} + +void final_cleanup(void) +{ +} + +int import_wisdom(FILE *f) +{ + return FFTW(import_wisdom_from_file)(f); +} + +void export_wisdom(FILE *f) +{ + FFTW(export_wisdom_to_file)(f); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/check.pl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/check.pl new file mode 100755 index 000000000..e9381ca04 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/check.pl @@ -0,0 +1,308 @@ +#! /usr/bin/perl -w + +$program = "./bench"; +$default_options = ""; +$verbose = 0; +$paranoid = 0; +$exhaustive = 0; +$patient = 0; +$estimate = 0; +$wisdom = 0; +$nthreads = 1; +$rounds = 0; +$maxsize = 60000; +$maxcount = 100; +$do_0d = 0; +$do_1d = 0; +$do_2d = 0; +$do_random = 0; +$keepgoing = 0; +$flushcount = 42; + +$mpi = 0; +$mpi_transposed_in = 0; +$mpi_transposed_out = 0; + +sub make_options { + my $options = $default_options; + $options = "--verify-rounds=$rounds $options" if $rounds; + $options = "--verbose=$verbose $options" if $verbose; + $options = "-o paranoid $options" if $paranoid; + $options = "-o exhaustive $options" if $exhaustive; + $options = "-o patient $options" if $patient; + $options = "-o estimate $options" if $estimate; + $options = "-o wisdom $options" if $wisdom; + $options = "-o nthreads=$nthreads $options" if ($nthreads > 1); + $options = "-obflag=30 $options" if $mpi_transposed_in; + $options = "-obflag=31 $options" if $mpi_transposed_out; + return $options; +} + +@list_of_problems = (); + +sub flush_problems { + my $options = shift; + my $problist = ""; + + if ($#list_of_problems >= 0) { + for (@list_of_problems) { + $problist = "$problist --verify '$_'"; + } + print "Executing \"$program $options $problist\"\n" + if $verbose; + + system("$program $options $problist"); + $exit_value = $? >> 8; + $signal_num = $? & 127; + $dumped_core = $? & 128; + + if ($signal_num == 1) { + print "hangup\n"; + exit 0; + } + if ($signal_num == 2) { + print "interrupted\n"; + exit 0; + } + if ($signal_num == 9) { + print "killed\n"; + exit 0; + } + + if ($exit_value != 0 || $dumped_core || $signal_num) { + print "FAILED $program: $problist\n"; + if ($signal_num) { print "received signal $signal_num\n"; } + exit 1 unless $keepgoing; + } + @list_of_problems = (); + } +} + +sub do_problem { + my $problem = shift; + my $doablep = shift; + my $options = &make_options; + + if ($problem =~ /\// && $problem =~ /r/ + && ($problem =~ /i.*x/ + || $problem =~ /v/ || $problem =~ /\*/)) { + return; # cannot do real split inplace-multidimensional or vector + } + + # in --mpi mode, restrict to problems supported by MPI code + if ($mpi) { + if ($problem =~ /\//) { return; } # no split + if ($problem =~ /\*/) { return; } # no non-contiguous vectors + if ($problem =~ /r/ && $problem !~ /x/) { return; } # no 1d r2c + if ($problem =~ /k/ && $problem !~ /x/) { return; } # no 1d r2r + if ($mpi_transposed_in || $problem =~ /\[/) { + if ($problem !~ /x/) { return; } # no 1d transposed_in + if ($problem =~ /r/ && $problem !~ /b/) { return; } # only c2r + } + if ($mpi_transposed_out || $problem =~ /\]/) { + if ($problem !~ /x/) { return; } # no 1d transposed_out + if ($problem =~ /r/ && $problem =~ /b/) { return; } # only r2c + } + } + + # size-1 redft00 is not defined/doable + return if ($problem =~ /[^0-9]1e00/); + + if ($doablep) { + @list_of_problems = ($problem, @list_of_problems); + &flush_problems($options) if ($#list_of_problems > $flushcount); + } else { + print "Executing \"$program $options --can-do $problem\"\n" + if $verbose; + $result=`$program $options --can-do $problem`; + if ($result ne "#f\n" && $result ne "#f\r\n") { + print "FAILED $program: $problem is not undoable\n"; + exit 1 unless $keepgoing; + } + } +} + +# given geometry, try both directions and in place/out of place +sub do_geometry { + my $geom = shift; + my $doablep = shift; + do_problem("if$geom", $doablep); + do_problem("of$geom", $doablep); + do_problem("ib$geom", $doablep); + do_problem("ob$geom", $doablep); + do_problem("//if$geom", $doablep); + do_problem("//of$geom", $doablep); + do_problem("//ib$geom", $doablep); + do_problem("//ob$geom", $doablep); +} + +# given size, try all transform kinds (complex, real, etc.) +sub do_size { + my $size = shift; + my $doablep = shift; + do_geometry("c$size", $doablep); + do_geometry("r$size", $doablep); +} + +sub small_0d { + for ($i = 0; $i <= 16; ++$i) { + for ($j = 0; $j <= 16; ++$j) { + for ($vl = 1; $vl <= 5; ++$vl) { + my $ivl = $i * $vl; + my $jvl = $j * $vl; + do_problem("o1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1); + do_problem("i1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1); + do_problem("ok1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1); + do_problem("ik1v${i}:${vl}:${jvl}x${j}:${ivl}:${vl}x${vl}:1:1", 1); + } + } + } +} + +sub small_1d { + do_size (0, 0); + for ($i = 1; $i <= 100; ++$i) { + do_size ($i, 1); + } + do_size (128, 1); + do_size (256, 1); + do_size (512, 1); + do_size (1024, 1); + do_size (2048, 1); + do_size (4096, 1); +} + +sub small_2d { + do_size ("0x0", 0); + for ($i = 1; $i <= 100; ++$i) { + my $ub = 900/$i; + $ub = 100 if $ub > 100; + for ($j = 1; $j <= $ub; ++$j) { + do_size ("${i}x${j}", 1); + } + } +} + +sub rand_small_factors { + my $l = shift; + my $n = 1; + my $maxfactor = 13; + my $f = int(rand($maxfactor) + 1); + while ($n * $f < $l) { + $n *= $f; + $f = int(rand($maxfactor) + 1); + }; + return $n; +} + +# way too complicated... +sub one_random_test { + my $q = int(2 + rand($maxsize)); + my $rnk = int(1 + rand(4)); + my $vtype = int(rand(3)); + my $g = int(2 + exp(log($q) / ($rnk + ($vtype > 0)))); + my $first = 1; + my $sz = ""; + my $is_r2r = shift; + my @r2r_kinds = ("f", "b", "h", + "e00", "e01", "e10", "e11", "o00", "o01", "o10", "o11"); + + while ($q > 1 && $rnk > 0) { + my $r = rand_small_factors(int(rand($g) + 10)); + if ($r > 1) { + $sz = "${sz}x" if (!$first); + $first = 0; + $sz = "${sz}${r}"; + if ($is_r2r) { + my $k = $r2r_kinds[int(1 + rand($#r2r_kinds))]; + $sz = "${sz}${k}"; + } + $q = int($q / $r); + if ($g > $q) { $g = $q; } + --$rnk; + } + } + if ($vtype > 0 && $g > 1) { + my $v = int(1 + rand($g)); + $sz = "${sz}*${v}" if ($vtype == 1); + $sz = "${sz}v${v}" if ($vtype == 2); + } + if ($mpi) { + my $stype = int(rand(3)); + $sz = "]${sz}" if ($stype == 1); + $sz = "[${sz}" if ($stype == 2); + } + $sz = "d$sz" if (int(rand(3)) == 0); + if ($is_r2r) { + do_problem("ik$sz", 1); + do_problem("ok$sz", 1); + } + else { + do_size($sz, 1); + } +} + +sub random_tests { + my $i; + for ($i = 0; $i < $maxcount; ++$i) { + &one_random_test(0); + &one_random_test(1); + } +} + +sub parse_arguments (@) +{ + local (@arglist) = @_; + + while (@arglist) + { + if ($arglist[0] eq '-v') { ++$verbose; } + elsif ($arglist[0] eq '--verbose') { ++$verbose; } + elsif ($arglist[0] eq '-p') { ++$paranoid; } + elsif ($arglist[0] eq '--paranoid') { ++$paranoid; } + elsif ($arglist[0] eq '--exhaustive') { ++$exhaustive; } + elsif ($arglist[0] eq '--patient') { ++$patient; } + elsif ($arglist[0] eq '--estimate') { ++$estimate; } + elsif ($arglist[0] eq '--wisdom') { ++$wisdom; } + elsif ($arglist[0] =~ /^--nthreads=(.+)$/) { $nthreads = $1; } + elsif ($arglist[0] eq '-k') { ++$keepgoing; } + elsif ($arglist[0] eq '--keep-going') { ++$keepgoing; } + elsif ($arglist[0] =~ /^--verify-rounds=(.+)$/) { $rounds = $1; } + elsif ($arglist[0] =~ /^--count=(.+)$/) { $maxcount = $1; } + elsif ($arglist[0] =~ /^-c=(.+)$/) { $maxcount = $1; } + elsif ($arglist[0] =~ /^--flushcount=(.+)$/) { $flushcount = $1; } + elsif ($arglist[0] =~ /^--maxsize=(.+)$/) { $maxsize = $1; } + + elsif ($arglist[0] eq '--mpi') { ++$mpi; } + elsif ($arglist[0] eq '--mpi-transposed-in') { + ++$mpi; ++$mpi_transposed_in; } + elsif ($arglist[0] eq '--mpi-transposed-out') { + ++$mpi; ++$mpi_transposed_out; } + + elsif ($arglist[0] eq '-0d') { ++$do_0d; } + elsif ($arglist[0] eq '-1d') { ++$do_1d; } + elsif ($arglist[0] eq '-2d') { ++$do_2d; } + elsif ($arglist[0] eq '-r') { ++$do_random; } + elsif ($arglist[0] eq '--random') { ++$do_random; } + elsif ($arglist[0] eq '-a') { + ++$do_0d; ++$do_1d; ++$do_2d; ++$do_random; + } + + else { $program=$arglist[0]; } + shift (@arglist); + } +} + +# MAIN PROGRAM: + +&parse_arguments (@ARGV); + +&random_tests if $do_random; +&small_0d if $do_0d; +&small_1d if $do_1d; +&small_2d if $do_2d; + +{ + my $options = &make_options; + &flush_problems($options); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/fftw-bench.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/fftw-bench.c new file mode 100644 index 000000000..6595e2f31 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/fftw-bench.c @@ -0,0 +1,287 @@ +/* See bench.c. We keep a few common subroutines in this file so + that they can be re-used in the MPI test program. */ + +#include +#include +#include +#include "tests/fftw-bench.h" + +/* define to enable code that traps floating-point exceptions. + Disabled by default because I don't want to worry about the + portability of such code. feenableexcept() seems to be a GNU + thing */ +#undef TRAP_FP_EXCEPTIONS + +#ifdef TRAP_FP_EXCEPTIONS +# include +# include +#endif + +#ifdef _OPENMP +# include +#endif + +#ifdef HAVE_SMP +int threads_ok = 1; +#endif + +FFTW(plan) the_plan = 0; + +static const char *wisdat = "wis.dat"; +unsigned the_flags = 0; +int paranoid = 0; +int usewisdom = 0; +int havewisdom = 0; +int nthreads = 1; +int amnesia = 0; + +extern void install_hook(void); /* in hook.c */ +extern void uninstall_hook(void); /* in hook.c */ + +#ifdef FFTW_RANDOM_ESTIMATOR +extern unsigned FFTW(random_estimate_seed); +#endif + +#ifdef TRAP_FP_EXCEPTIONS +static void sigfpe_handler(int sig, siginfo_t *info, void *context) +{ + /* fftw code is not supposed to generate FP exceptions */ + UNUSED(sig); UNUSED(info); UNUSED(context); + fprintf(stderr, "caught FPE, aborting\n"); + abort(); +} + +static void setup_sigfpe_handler(void) +{ + struct sigaction a; + feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW); + memset(&a, 0, sizeof(a)); + a.sa_sigaction = sigfpe_handler; + a.sa_flags = SA_SIGINFO; + if (sigaction(SIGFPE, &a, NULL) == -1) { + fprintf(stderr, "cannot install sigfpe handler\n"); + exit(1); + } +} +#else +static void setup_sigfpe_handler(void) +{ +} +#endif + +void useropt(const char *arg) +{ + int x; + double y; + + if (!strcmp(arg, "patient")) the_flags |= FFTW_PATIENT; + else if (!strcmp(arg, "estimate")) the_flags |= FFTW_ESTIMATE; + else if (!strcmp(arg, "estimatepat")) the_flags |= FFTW_ESTIMATE_PATIENT; + else if (!strcmp(arg, "exhaustive")) the_flags |= FFTW_EXHAUSTIVE; + else if (!strcmp(arg, "unaligned")) the_flags |= FFTW_UNALIGNED; + else if (!strcmp(arg, "nosimd")) the_flags |= FFTW_NO_SIMD; + else if (!strcmp(arg, "noindirectop")) the_flags |= FFTW_NO_INDIRECT_OP; + else if (!strcmp(arg, "wisdom-only")) the_flags |= FFTW_WISDOM_ONLY; + else if (sscanf(arg, "flag=%d", &x) == 1) the_flags |= x; + else if (sscanf(arg, "bflag=%d", &x) == 1) the_flags |= 1U << x; + else if (!strcmp(arg, "paranoid")) paranoid = 1; + else if (!strcmp(arg, "wisdom")) usewisdom = 1; + else if (!strcmp(arg, "amnesia")) amnesia = 1; + else if (sscanf(arg, "nthreads=%d", &x) == 1) nthreads = x; +#ifdef FFTW_RANDOM_ESTIMATOR + else if (sscanf(arg, "eseed=%d", &x) == 1) FFTW(random_estimate_seed) = x; +#endif + else if (sscanf(arg, "timelimit=%lg", &y) == 1) { + FFTW(set_timelimit)(y); + } + + else fprintf(stderr, "unknown user option: %s. Ignoring.\n", arg); +} + +void rdwisdom(void) +{ + FILE *f; + double tim; + int success = 0; + + if (havewisdom) return; + +#ifdef HAVE_SMP + if (threads_ok) { + BENCH_ASSERT(FFTW(init_threads)()); + FFTW(plan_with_nthreads)(nthreads); + FFTW(make_planner_thread_safe)(); +#ifdef _OPENMP + omp_set_num_threads(nthreads); +#endif + } + else if (nthreads > 1 && verbose > 1) { + fprintf(stderr, "bench: WARNING - nthreads = %d, but threads not supported\n", nthreads); + nthreads = 1; + } +#endif + + if (!usewisdom) return; + + timer_start(USER_TIMER); + if ((f = fopen(wisdat, "r"))) { + if (!import_wisdom(f)) + fprintf(stderr, "bench: ERROR reading wisdom\n"); + else + success = 1; + fclose(f); + } + tim = timer_stop(USER_TIMER); + + if (success) { + if (verbose > 1) printf("READ WISDOM (%g seconds): ", tim); + + if (verbose > 3) + export_wisdom(stdout); + if (verbose > 1) + printf("\n"); + } + havewisdom = 1; +} + +void wrwisdom(void) +{ + FILE *f; + double tim; + if (!havewisdom) return; + + timer_start(USER_TIMER); + if ((f = fopen(wisdat, "w"))) { + export_wisdom(f); + fclose(f); + } + tim = timer_stop(USER_TIMER); + if (verbose > 1) printf("write wisdom took %g seconds\n", tim); +} + +static unsigned preserve_input_flags(bench_problem *p) +{ + /* + * fftw3 cannot preserve input for multidimensional c2r transforms. + * Enforce FFTW_DESTROY_INPUT + */ + if (p->kind == PROBLEM_REAL && + p->sign > 0 && + !p->in_place && + p->sz->rnk > 1) + p->destroy_input = 1; + + if (p->destroy_input) + return FFTW_DESTROY_INPUT; + else + return FFTW_PRESERVE_INPUT; +} + +int can_do(bench_problem *p) +{ + double tim; + + if (verbose > 2 && p->pstring) + printf("Planning %s...\n", p->pstring); + rdwisdom(); + + timer_start(USER_TIMER); + the_plan = mkplan(p, preserve_input_flags(p) | the_flags | FFTW_ESTIMATE); + tim = timer_stop(USER_TIMER); + if (verbose > 2) printf("estimate-planner time: %g s\n", tim); + + if (the_plan) { + FFTW(destroy_plan)(the_plan); + return 1; + } + return 0; +} + +void setup(bench_problem *p) +{ + double tim; + + setup_sigfpe_handler(); + + if (amnesia) { + FFTW(forget_wisdom)(); + havewisdom = 0; + } + + /* Regression test: check that fftw_malloc exists and links + * properly */ + { + void *ptr = FFTW(malloc(42)); + BENCH_ASSERT(FFTW(alignment_of)(ptr) == 0); + FFTW(free(ptr)); + } + + rdwisdom(); + install_hook(); + +#ifdef HAVE_SMP + if (verbose > 1 && nthreads > 1) printf("NTHREADS = %d\n", nthreads); +#endif + + timer_start(USER_TIMER); + the_plan = mkplan(p, preserve_input_flags(p) | the_flags); + tim = timer_stop(USER_TIMER); + if (verbose > 1) printf("planner time: %g s\n", tim); + + BENCH_ASSERT(the_plan); + + { + double add, mul, nfma, cost, pcost; + FFTW(flops)(the_plan, &add, &mul, &nfma); + cost = FFTW(estimate_cost)(the_plan); + pcost = FFTW(cost)(the_plan); + if (verbose > 1) { + FFTW(print_plan)(the_plan); + printf("\n"); + printf("flops: %0.0f add, %0.0f mul, %0.0f fma\n", + add, mul, nfma); + printf("estimated cost: %f, pcost = %f\n", cost, pcost); + } + } +} + + +void doit(int iter, bench_problem *p) +{ + int i; + FFTW(plan) q = the_plan; + + UNUSED(p); + for (i = 0; i < iter; ++i) + FFTW(execute)(q); +} + +void done(bench_problem *p) +{ + UNUSED(p); + + FFTW(destroy_plan)(the_plan); + uninstall_hook(); +} + +void cleanup(void) +{ + initial_cleanup(); + + wrwisdom(); +#ifdef HAVE_SMP + FFTW(cleanup_threads)(); +#else + FFTW(cleanup)(); +#endif + +# ifdef FFTW_DEBUG_MALLOC + { + /* undocumented memory checker */ + FFTW_EXTERN void FFTW(malloc_print_minfo)(int v); + FFTW(malloc_print_minfo)(verbose); + } +# endif + + final_cleanup(); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/fftw-bench.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/fftw-bench.h new file mode 100644 index 000000000..73d14d431 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/fftw-bench.h @@ -0,0 +1,37 @@ +/* declarations of common subroutines, etc. for use with FFTW + self-test/benchmark program (see bench.c). */ + +#include "libbench2/bench-user.h" +#include "api/fftw3.h" + +#define CONCAT(prefix, name) prefix ## name +#if defined(BENCHFFT_SINGLE) +#define FFTW(x) CONCAT(fftwf_, x) +#elif defined(BENCHFFT_LDOUBLE) +#define FFTW(x) CONCAT(fftwl_, x) +#elif defined(BENCHFFT_QUAD) +#define FFTW(x) CONCAT(fftwq_, x) +#else +#define FFTW(x) CONCAT(fftw_, x) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +extern FFTW(plan) mkplan(bench_problem *p, unsigned flags); +extern void initial_cleanup(void); +extern void final_cleanup(void); +extern int import_wisdom(FILE *f); +extern void export_wisdom(FILE *f); + +#if defined(HAVE_THREADS) || defined(HAVE_OPENMP) +# define HAVE_SMP + extern int threads_ok; +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/hook.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/hook.c new file mode 100644 index 000000000..ddeb2d0b8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tests/hook.c @@ -0,0 +1,259 @@ +/* fftw hook to be used in the benchmark program. + + We keep it in a separate file because + + 1) bench.c is supposed to test the API---we do not want to #include + "ifftw.h" and accidentally use internal symbols/macros. + 2) this code is a royal mess. The messiness is due to + A) confusion between internal fftw tensors and bench_tensor's + (which we want to keep separate because the benchmark + program tests other routines too) + B) despite A), our desire to recycle the libbench verifier. +*/ + +#include +#include "libbench2/bench-user.h" + +#define CALLING_FFTW /* hack for Windows DLL nonsense */ +#include "api/api.h" +#include "dft/dft.h" +#include "rdft/rdft.h" + +extern int paranoid; /* in bench.c */ +extern X(plan) the_plan; /* in bench.c */ + +/* + transform an fftw tensor into a bench_tensor. +*/ +static bench_tensor *fftw_tensor_to_bench_tensor(tensor *t) +{ + bench_tensor *bt = mktensor(t->rnk); + + if (FINITE_RNK(t->rnk)) { + int i; + for (i = 0; i < t->rnk; ++i) { + /* FIXME: 64-bit unclean because of INT -> int conversion */ + bt->dims[i].n = t->dims[i].n; + bt->dims[i].is = t->dims[i].is; + bt->dims[i].os = t->dims[i].os; + BENCH_ASSERT(bt->dims[i].n == t->dims[i].n); + BENCH_ASSERT(bt->dims[i].is == t->dims[i].is); + BENCH_ASSERT(bt->dims[i].os == t->dims[i].os); + } + } + return bt; +} + +/* + transform an fftw problem into a bench_problem. +*/ +static bench_problem *fftw_problem_to_bench_problem(planner *plnr, + const problem *p_) +{ + bench_problem *bp = 0; + switch (p_->adt->problem_kind) { + case PROBLEM_DFT: + { + const problem_dft *p = (const problem_dft *) p_; + + if (!p->ri || !p->ii) + abort(); + + bp = (bench_problem *) bench_malloc(sizeof(bench_problem)); + + bp->kind = PROBLEM_COMPLEX; + bp->sign = FFT_SIGN; + bp->split = 1; /* tensor strides are in R's, not C's */ + bp->in = UNTAINT(p->ri); + bp->out = UNTAINT(p->ro); + bp->ini = UNTAINT(p->ii); + bp->outi = UNTAINT(p->io); + bp->inphys = bp->outphys = 0; + bp->iphyssz = bp->ophyssz = 0; + bp->in_place = p->ri == p->ro; + bp->sz = fftw_tensor_to_bench_tensor(p->sz); + bp->vecsz = fftw_tensor_to_bench_tensor(p->vecsz); + bp->k = 0; + break; + } + case PROBLEM_RDFT: + { + const problem_rdft *p = (const problem_rdft *) p_; + int i; + + if (!p->I || !p->O) + abort(); + + for (i = 0; i < p->sz->rnk; ++i) + switch (p->kind[i]) { + case R2HC01: + case R2HC10: + case R2HC11: + case HC2R01: + case HC2R10: + case HC2R11: + return bp; + default: + ; + } + + bp = (bench_problem *) bench_malloc(sizeof(bench_problem)); + + bp->kind = PROBLEM_R2R; + bp->sign = FFT_SIGN; + bp->split = 0; + bp->in = UNTAINT(p->I); + bp->out = UNTAINT(p->O); + bp->ini = bp->outi = 0; + bp->inphys = bp->outphys = 0; + bp->iphyssz = bp->ophyssz = 0; + bp->in_place = p->I == p->O; + bp->sz = fftw_tensor_to_bench_tensor(p->sz); + bp->vecsz = fftw_tensor_to_bench_tensor(p->vecsz); + bp->k = (r2r_kind_t *) bench_malloc(sizeof(r2r_kind_t) * p->sz->rnk); + for (i = 0; i < p->sz->rnk; ++i) + switch (p->kind[i]) { + case R2HC: bp->k[i] = R2R_R2HC; break; + case HC2R: bp->k[i] = R2R_HC2R; break; + case DHT: bp->k[i] = R2R_DHT; break; + case REDFT00: bp->k[i] = R2R_REDFT00; break; + case REDFT01: bp->k[i] = R2R_REDFT01; break; + case REDFT10: bp->k[i] = R2R_REDFT10; break; + case REDFT11: bp->k[i] = R2R_REDFT11; break; + case RODFT00: bp->k[i] = R2R_RODFT00; break; + case RODFT01: bp->k[i] = R2R_RODFT01; break; + case RODFT10: bp->k[i] = R2R_RODFT10; break; + case RODFT11: bp->k[i] = R2R_RODFT11; break; + default: CK(0); + } + break; + } + case PROBLEM_RDFT2: + { + const problem_rdft2 *p = (const problem_rdft2 *) p_; + int rnk = p->sz->rnk; + + if (!p->r0 || !p->r1 || !p->cr || !p->ci) + abort(); + + /* give up verifying rdft2 R2HCII */ + if (p->kind != R2HC && p->kind != HC2R) + return bp; + + if (rnk > 0) { + /* can't verify separate even/odd arrays for now */ + if (2 * (p->r1 - p->r0) != + ((p->kind == R2HC) ? + p->sz->dims[rnk-1].is : p->sz->dims[rnk-1].os)) + return bp; + } + + bp = (bench_problem *) bench_malloc(sizeof(bench_problem)); + + bp->kind = PROBLEM_REAL; + bp->sign = p->kind == R2HC ? FFT_SIGN : -FFT_SIGN; + bp->split = 1; /* tensor strides are in R's, not C's */ + if (p->kind == R2HC) { + bp->sign = FFT_SIGN; + bp->in = UNTAINT(p->r0); + bp->out = UNTAINT(p->cr); + bp->ini = 0; + bp->outi = UNTAINT(p->ci); + } + else { + bp->sign = -FFT_SIGN; + bp->out = UNTAINT(p->r0); + bp->in = UNTAINT(p->cr); + bp->outi = 0; + bp->ini = UNTAINT(p->ci); + } + bp->inphys = bp->outphys = 0; + bp->iphyssz = bp->ophyssz = 0; + bp->in_place = p->r0 == p->cr; + bp->sz = fftw_tensor_to_bench_tensor(p->sz); + if (rnk > 0) { + if (p->kind == R2HC) + bp->sz->dims[rnk-1].is /= 2; + else + bp->sz->dims[rnk-1].os /= 2; + } + bp->vecsz = fftw_tensor_to_bench_tensor(p->vecsz); + bp->k = 0; + break; + } + default: + abort(); + } + + bp->userinfo = 0; + bp->pstring = 0; + bp->destroy_input = !NO_DESTROY_INPUTP(plnr); + + return bp; +} + +static void hook(planner *plnr, plan *pln, const problem *p_, int optimalp) +{ + int rounds = 5; + double tol = SINGLE_PRECISION ? 1.0e-3 : 1.0e-10; + UNUSED(optimalp); + + if (verbose > 5) { + printer *pr = X(mkprinter_file)(stdout); + pr->print(pr, "%P:%(%p%)\n", p_, pln); + X(printer_destroy)(pr); + printf("cost %g \n\n", pln->pcost); + } + + if (paranoid) { + bench_problem *bp; + + bp = fftw_problem_to_bench_problem(plnr, p_); + if (bp) { + X(plan) the_plan_save = the_plan; + + the_plan = (apiplan *) MALLOC(sizeof(apiplan), PLANS); + the_plan->pln = pln; + the_plan->prb = (problem *) p_; + + X(plan_awake)(pln, AWAKE_SQRTN_TABLE); + verify_problem(bp, rounds, tol); + X(plan_awake)(pln, SLEEPY); + + X(ifree)(the_plan); + the_plan = the_plan_save; + + problem_destroy(bp); + } + + } +} + +static void paranoid_checks(void) +{ + /* FIXME: assumes char = 8 bits, which is false on at least one + DSP I know of. */ +#if 0 + /* if flags_t is not 64 bits i want to know it. */ + CK(sizeof(flags_t) == 8); + + CK(sizeof(md5uint) >= 4); +#endif + + CK(sizeof(uintptr_t) >= sizeof(R *)); + + CK(sizeof(INT) >= sizeof(R *)); +} + +void install_hook(void) +{ + planner *plnr = X(the_planner)(); + plnr->hook = hook; + paranoid_checks(); +} + +void uninstall_hook(void) +{ + planner *plnr = X(the_planner)(); + plnr->hook = 0; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/Makefile.am new file mode 100644 index 000000000..f5c170a9a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/Makefile.am @@ -0,0 +1,36 @@ +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) + +if OPENMP +FFTWOMPLIB = libfftw3@PREC_SUFFIX@_omp.la +else +FFTWOMPLIB = +endif + +if THREADS +if COMBINED_THREADS +noinst_LTLIBRARIES = libfftw3@PREC_SUFFIX@_threads.la +else +lib_LTLIBRARIES = libfftw3@PREC_SUFFIX@_threads.la $(FFTWOMPLIB) +endif +else +lib_LTLIBRARIES = $(FFTWOMPLIB) +endif + +libfftw3@PREC_SUFFIX@_threads_la_SOURCES = api.c conf.c threads.c \ +threads.h dft-vrank-geq1.c ct.c rdft-vrank-geq1.c hc2hc.c \ +vrank-geq1-rdft2.c f77api.c f77funcs.h +libfftw3@PREC_SUFFIX@_threads_la_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS) +libfftw3@PREC_SUFFIX@_threads_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ +if !COMBINED_THREADS +libfftw3@PREC_SUFFIX@_threads_la_LIBADD = ../libfftw3@PREC_SUFFIX@.la +endif + +libfftw3@PREC_SUFFIX@_omp_la_SOURCES = api.c conf.c openmp.c \ +threads.h dft-vrank-geq1.c ct.c rdft-vrank-geq1.c hc2hc.c \ +vrank-geq1-rdft2.c f77api.c f77funcs.h +libfftw3@PREC_SUFFIX@_omp_la_CFLAGS = $(AM_CFLAGS) $(OPENMP_CFLAGS) +libfftw3@PREC_SUFFIX@_omp_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ +if !COMBINED_THREADS +libfftw3@PREC_SUFFIX@_omp_la_LIBADD = ../libfftw3@PREC_SUFFIX@.la +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/Makefile.in new file mode 100644 index 000000000..a332b44bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/Makefile.in @@ -0,0 +1,835 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = threads +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) +@COMBINED_THREADS_FALSE@libfftw3@PREC_SUFFIX@_omp_la_DEPENDENCIES = \ +@COMBINED_THREADS_FALSE@ ../libfftw3@PREC_SUFFIX@.la +am_libfftw3@PREC_SUFFIX@_omp_la_OBJECTS = \ + libfftw3@PREC_SUFFIX@_omp_la-api.lo \ + libfftw3@PREC_SUFFIX@_omp_la-conf.lo \ + libfftw3@PREC_SUFFIX@_omp_la-openmp.lo \ + libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.lo \ + libfftw3@PREC_SUFFIX@_omp_la-ct.lo \ + libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.lo \ + libfftw3@PREC_SUFFIX@_omp_la-hc2hc.lo \ + libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.lo \ + libfftw3@PREC_SUFFIX@_omp_la-f77api.lo +libfftw3@PREC_SUFFIX@_omp_la_OBJECTS = \ + $(am_libfftw3@PREC_SUFFIX@_omp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libfftw3@PREC_SUFFIX@_omp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) \ + $(libfftw3@PREC_SUFFIX@_omp_la_LDFLAGS) $(LDFLAGS) -o $@ +@COMBINED_THREADS_FALSE@@OPENMP_TRUE@@THREADS_TRUE@am_libfftw3@PREC_SUFFIX@_omp_la_rpath = \ +@COMBINED_THREADS_FALSE@@OPENMP_TRUE@@THREADS_TRUE@ -rpath \ +@COMBINED_THREADS_FALSE@@OPENMP_TRUE@@THREADS_TRUE@ $(libdir) +@OPENMP_TRUE@@THREADS_FALSE@am_libfftw3@PREC_SUFFIX@_omp_la_rpath = \ +@OPENMP_TRUE@@THREADS_FALSE@ -rpath $(libdir) +@COMBINED_THREADS_FALSE@libfftw3@PREC_SUFFIX@_threads_la_DEPENDENCIES = \ +@COMBINED_THREADS_FALSE@ ../libfftw3@PREC_SUFFIX@.la +am_libfftw3@PREC_SUFFIX@_threads_la_OBJECTS = \ + libfftw3@PREC_SUFFIX@_threads_la-api.lo \ + libfftw3@PREC_SUFFIX@_threads_la-conf.lo \ + libfftw3@PREC_SUFFIX@_threads_la-threads.lo \ + libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.lo \ + libfftw3@PREC_SUFFIX@_threads_la-ct.lo \ + libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.lo \ + libfftw3@PREC_SUFFIX@_threads_la-hc2hc.lo \ + libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.lo \ + libfftw3@PREC_SUFFIX@_threads_la-f77api.lo +libfftw3@PREC_SUFFIX@_threads_la_OBJECTS = \ + $(am_libfftw3@PREC_SUFFIX@_threads_la_OBJECTS) +libfftw3@PREC_SUFFIX@_threads_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) \ + $(libfftw3@PREC_SUFFIX@_threads_la_LDFLAGS) $(LDFLAGS) -o $@ +@COMBINED_THREADS_FALSE@@THREADS_TRUE@am_libfftw3@PREC_SUFFIX@_threads_la_rpath = \ +@COMBINED_THREADS_FALSE@@THREADS_TRUE@ -rpath $(libdir) +@COMBINED_THREADS_TRUE@@THREADS_TRUE@am_libfftw3@PREC_SUFFIX@_threads_la_rpath = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libfftw3@PREC_SUFFIX@_omp_la_SOURCES) \ + $(libfftw3@PREC_SUFFIX@_threads_la_SOURCES) +DIST_SOURCES = $(libfftw3@PREC_SUFFIX@_omp_la_SOURCES) \ + $(libfftw3@PREC_SUFFIX@_threads_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +AM_CFLAGS = $(STACK_ALIGN_CFLAGS) +@OPENMP_FALSE@FFTWOMPLIB = +@OPENMP_TRUE@FFTWOMPLIB = libfftw3@PREC_SUFFIX@_omp.la +@COMBINED_THREADS_TRUE@@THREADS_TRUE@noinst_LTLIBRARIES = libfftw3@PREC_SUFFIX@_threads.la +@COMBINED_THREADS_FALSE@@THREADS_TRUE@lib_LTLIBRARIES = libfftw3@PREC_SUFFIX@_threads.la $(FFTWOMPLIB) +@THREADS_FALSE@lib_LTLIBRARIES = $(FFTWOMPLIB) +libfftw3@PREC_SUFFIX@_threads_la_SOURCES = api.c conf.c threads.c \ +threads.h dft-vrank-geq1.c ct.c rdft-vrank-geq1.c hc2hc.c \ +vrank-geq1-rdft2.c f77api.c f77funcs.h + +libfftw3@PREC_SUFFIX@_threads_la_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS) +libfftw3@PREC_SUFFIX@_threads_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ +@COMBINED_THREADS_FALSE@libfftw3@PREC_SUFFIX@_threads_la_LIBADD = ../libfftw3@PREC_SUFFIX@.la +libfftw3@PREC_SUFFIX@_omp_la_SOURCES = api.c conf.c openmp.c \ +threads.h dft-vrank-geq1.c ct.c rdft-vrank-geq1.c hc2hc.c \ +vrank-geq1-rdft2.c f77api.c f77funcs.h + +libfftw3@PREC_SUFFIX@_omp_la_CFLAGS = $(AM_CFLAGS) $(OPENMP_CFLAGS) +libfftw3@PREC_SUFFIX@_omp_la_LDFLAGS = -version-info @SHARED_VERSION_INFO@ +@COMBINED_THREADS_FALSE@libfftw3@PREC_SUFFIX@_omp_la_LIBADD = ../libfftw3@PREC_SUFFIX@.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu threads/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu threads/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libfftw3@PREC_SUFFIX@_omp.la: $(libfftw3@PREC_SUFFIX@_omp_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_omp_la_DEPENDENCIES) $(EXTRA_libfftw3@PREC_SUFFIX@_omp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libfftw3@PREC_SUFFIX@_omp_la_LINK) $(am_libfftw3@PREC_SUFFIX@_omp_la_rpath) $(libfftw3@PREC_SUFFIX@_omp_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_omp_la_LIBADD) $(LIBS) + +libfftw3@PREC_SUFFIX@_threads.la: $(libfftw3@PREC_SUFFIX@_threads_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_threads_la_DEPENDENCIES) $(EXTRA_libfftw3@PREC_SUFFIX@_threads_la_DEPENDENCIES) + $(AM_V_CCLD)$(libfftw3@PREC_SUFFIX@_threads_la_LINK) $(am_libfftw3@PREC_SUFFIX@_threads_la_rpath) $(libfftw3@PREC_SUFFIX@_threads_la_OBJECTS) $(libfftw3@PREC_SUFFIX@_threads_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-ct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-f77api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-hc2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-openmp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-conf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-ct.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-f77api.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-hc2hc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-threads.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libfftw3@PREC_SUFFIX@_omp_la-api.lo: api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-api.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-api.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-api.lo `test -f 'api.c' || echo '$(srcdir)/'`api.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-api.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-api.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api.c' object='libfftw3@PREC_SUFFIX@_omp_la-api.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-api.lo `test -f 'api.c' || echo '$(srcdir)/'`api.c + +libfftw3@PREC_SUFFIX@_omp_la-conf.lo: conf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-conf.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-conf.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-conf.lo `test -f 'conf.c' || echo '$(srcdir)/'`conf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-conf.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-conf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf.c' object='libfftw3@PREC_SUFFIX@_omp_la-conf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-conf.lo `test -f 'conf.c' || echo '$(srcdir)/'`conf.c + +libfftw3@PREC_SUFFIX@_omp_la-openmp.lo: openmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-openmp.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-openmp.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-openmp.lo `test -f 'openmp.c' || echo '$(srcdir)/'`openmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-openmp.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-openmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='openmp.c' object='libfftw3@PREC_SUFFIX@_omp_la-openmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-openmp.lo `test -f 'openmp.c' || echo '$(srcdir)/'`openmp.c + +libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.lo: dft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.lo `test -f 'dft-vrank-geq1.c' || echo '$(srcdir)/'`dft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dft-vrank-geq1.c' object='libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-dft-vrank-geq1.lo `test -f 'dft-vrank-geq1.c' || echo '$(srcdir)/'`dft-vrank-geq1.c + +libfftw3@PREC_SUFFIX@_omp_la-ct.lo: ct.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-ct.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-ct.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-ct.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-ct.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ct.c' object='libfftw3@PREC_SUFFIX@_omp_la-ct.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c + +libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.lo: rdft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.lo `test -f 'rdft-vrank-geq1.c' || echo '$(srcdir)/'`rdft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdft-vrank-geq1.c' object='libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-rdft-vrank-geq1.lo `test -f 'rdft-vrank-geq1.c' || echo '$(srcdir)/'`rdft-vrank-geq1.c + +libfftw3@PREC_SUFFIX@_omp_la-hc2hc.lo: hc2hc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-hc2hc.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-hc2hc.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-hc2hc.lo `test -f 'hc2hc.c' || echo '$(srcdir)/'`hc2hc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-hc2hc.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-hc2hc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hc2hc.c' object='libfftw3@PREC_SUFFIX@_omp_la-hc2hc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-hc2hc.lo `test -f 'hc2hc.c' || echo '$(srcdir)/'`hc2hc.c + +libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.lo: vrank-geq1-rdft2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.lo `test -f 'vrank-geq1-rdft2.c' || echo '$(srcdir)/'`vrank-geq1-rdft2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vrank-geq1-rdft2.c' object='libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-vrank-geq1-rdft2.lo `test -f 'vrank-geq1-rdft2.c' || echo '$(srcdir)/'`vrank-geq1-rdft2.c + +libfftw3@PREC_SUFFIX@_omp_la-f77api.lo: f77api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_omp_la-f77api.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-f77api.Tpo -c -o libfftw3@PREC_SUFFIX@_omp_la-f77api.lo `test -f 'f77api.c' || echo '$(srcdir)/'`f77api.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-f77api.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_omp_la-f77api.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='f77api.c' object='libfftw3@PREC_SUFFIX@_omp_la-f77api.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_omp_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_omp_la-f77api.lo `test -f 'f77api.c' || echo '$(srcdir)/'`f77api.c + +libfftw3@PREC_SUFFIX@_threads_la-api.lo: api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-api.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-api.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-api.lo `test -f 'api.c' || echo '$(srcdir)/'`api.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-api.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-api.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='api.c' object='libfftw3@PREC_SUFFIX@_threads_la-api.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-api.lo `test -f 'api.c' || echo '$(srcdir)/'`api.c + +libfftw3@PREC_SUFFIX@_threads_la-conf.lo: conf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-conf.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-conf.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-conf.lo `test -f 'conf.c' || echo '$(srcdir)/'`conf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-conf.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-conf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='conf.c' object='libfftw3@PREC_SUFFIX@_threads_la-conf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-conf.lo `test -f 'conf.c' || echo '$(srcdir)/'`conf.c + +libfftw3@PREC_SUFFIX@_threads_la-threads.lo: threads.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-threads.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-threads.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-threads.lo `test -f 'threads.c' || echo '$(srcdir)/'`threads.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-threads.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-threads.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='threads.c' object='libfftw3@PREC_SUFFIX@_threads_la-threads.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-threads.lo `test -f 'threads.c' || echo '$(srcdir)/'`threads.c + +libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.lo: dft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.lo `test -f 'dft-vrank-geq1.c' || echo '$(srcdir)/'`dft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dft-vrank-geq1.c' object='libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-dft-vrank-geq1.lo `test -f 'dft-vrank-geq1.c' || echo '$(srcdir)/'`dft-vrank-geq1.c + +libfftw3@PREC_SUFFIX@_threads_la-ct.lo: ct.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-ct.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-ct.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-ct.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-ct.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ct.c' object='libfftw3@PREC_SUFFIX@_threads_la-ct.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c + +libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.lo: rdft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.lo `test -f 'rdft-vrank-geq1.c' || echo '$(srcdir)/'`rdft-vrank-geq1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rdft-vrank-geq1.c' object='libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-rdft-vrank-geq1.lo `test -f 'rdft-vrank-geq1.c' || echo '$(srcdir)/'`rdft-vrank-geq1.c + +libfftw3@PREC_SUFFIX@_threads_la-hc2hc.lo: hc2hc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-hc2hc.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-hc2hc.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-hc2hc.lo `test -f 'hc2hc.c' || echo '$(srcdir)/'`hc2hc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-hc2hc.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-hc2hc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hc2hc.c' object='libfftw3@PREC_SUFFIX@_threads_la-hc2hc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-hc2hc.lo `test -f 'hc2hc.c' || echo '$(srcdir)/'`hc2hc.c + +libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.lo: vrank-geq1-rdft2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.lo `test -f 'vrank-geq1-rdft2.c' || echo '$(srcdir)/'`vrank-geq1-rdft2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vrank-geq1-rdft2.c' object='libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-vrank-geq1-rdft2.lo `test -f 'vrank-geq1-rdft2.c' || echo '$(srcdir)/'`vrank-geq1-rdft2.c + +libfftw3@PREC_SUFFIX@_threads_la-f77api.lo: f77api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -MT libfftw3@PREC_SUFFIX@_threads_la-f77api.lo -MD -MP -MF $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-f77api.Tpo -c -o libfftw3@PREC_SUFFIX@_threads_la-f77api.lo `test -f 'f77api.c' || echo '$(srcdir)/'`f77api.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-f77api.Tpo $(DEPDIR)/libfftw3@PREC_SUFFIX@_threads_la-f77api.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='f77api.c' object='libfftw3@PREC_SUFFIX@_threads_la-f77api.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libfftw3@PREC_SUFFIX@_threads_la_CFLAGS) $(CFLAGS) -c -o libfftw3@PREC_SUFFIX@_threads_la-f77api.lo `test -f 'f77api.c' || echo '$(srcdir)/'`f77api.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ + cscopelist-am ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/api.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/api.c new file mode 100644 index 000000000..eae2cd4b7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/api.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" +#include "threads/threads.h" + +static int threads_inited = 0; + +static void threads_register_hooks(void) +{ + X(mksolver_ct_hook) = X(mksolver_ct_threads); + X(mksolver_hc2hc_hook) = X(mksolver_hc2hc_threads); +} + +static void threads_unregister_hooks(void) +{ + X(mksolver_ct_hook) = 0; + X(mksolver_hc2hc_hook) = 0; +} + +/* should be called before all other FFTW functions! */ +int X(init_threads)(void) +{ + if (!threads_inited) { + planner *plnr; + + if (X(ithreads_init)()) + return 0; + + threads_register_hooks(); + + /* this should be the first time the_planner is called, + and hence the time it is configured */ + plnr = X(the_planner)(); + X(threads_conf_standard)(plnr); + + threads_inited = 1; + } + return 1; +} + + +void X(cleanup_threads)(void) +{ + X(cleanup)(); + if (threads_inited) { + X(threads_cleanup)(); + threads_unregister_hooks(); + threads_inited = 0; + } +} + +void X(plan_with_nthreads)(int nthreads) +{ + planner *plnr; + + if (!threads_inited) { + X(cleanup)(); + X(init_threads)(); + } + A(threads_inited); + plnr = X(the_planner)(); + plnr->nthr = X(imax)(1, nthreads); +} + +void X(make_planner_thread_safe)(void) +{ + X(threads_register_planner_hooks)(); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/conf.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/conf.c new file mode 100644 index 000000000..6449cbc8d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/conf.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "threads/threads.h" + +static const solvtab s = +{ + SOLVTAB(X(dft_thr_vrank_geq1_register)), + SOLVTAB(X(rdft_thr_vrank_geq1_register)), + SOLVTAB(X(rdft2_thr_vrank_geq1_register)), + + SOLVTAB_END +}; + +void X(threads_conf_standard)(planner *p) +{ + X(solvtab_exec)(s, p); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/ct.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/ct.c new file mode 100644 index 000000000..e2d9d084e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/ct.c @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "threads/threads.h" + +typedef struct { + plan_dft super; + plan *cld; + plan **cldws; + int nthr; + INT r; +} P; + +typedef struct { + plan **cldws; + R *r, *i; +} PD; + +static void *spawn_apply(spawn_data *d) +{ + PD *ego = (PD *) d->data; + INT thr_num = d->thr_num; + + plan_dftw *cldw = (plan_dftw *) (ego->cldws[thr_num]); + cldw->apply((plan *) cldw, ego->r, ego->i); + return 0; +} + +static void apply_dit(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ri, ii, ro, io); + + { + PD d; + + d.r = ro; d.i = io; + d.cldws = ego->cldws; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*)&d); + } +} + +static void apply_dif(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + plan_dft *cld; + + { + PD d; + + d.r = ri; d.i = ii; + d.cldws = ego->cldws; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*)&d); + } + + cld = (plan_dft *) ego->cld; + cld->apply(ego->cld, ri, ii, ro, io); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + int i; + X(plan_awake)(ego->cld, wakefulness); + for (i = 0; i < ego->nthr; ++i) + X(plan_awake)(ego->cldws[i], wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + int i; + X(plan_destroy_internal)(ego->cld); + for (i = 0; i < ego->nthr; ++i) + X(plan_destroy_internal)(ego->cldws[i]); + X(ifree)(ego->cldws); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + int i; + p->print(p, "(dft-thr-ct-%s-x%d/%D", + ego->super.apply == apply_dit ? "dit" : "dif", + ego->nthr, ego->r); + for (i = 0; i < ego->nthr; ++i) + if (i == 0 || (ego->cldws[i] != ego->cldws[i-1] && + (i <= 1 || ego->cldws[i] != ego->cldws[i-2]))) + p->print(p, "%(%p%)", ego->cldws[i]); + p->print(p, "%(%p%))", ego->cld); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const ct_solver *ego = (const ct_solver *) ego_; + const problem_dft *p; + P *pln = 0; + plan *cld = 0, **cldws = 0; + INT n, r, m, v, ivs, ovs; + INT block_size; + int i, nthr, plnr_nthr_save; + iodim *d; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (plnr->nthr <= 1 || !X(ct_applicable)(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_dft *) p_; + d = p->sz->dims; + n = d[0].n; + r = X(choose_radix)(ego->r, n); + m = n / r; + + X(tensor_tornk1)(p->vecsz, &v, &ivs, &ovs); + + block_size = (m + plnr->nthr - 1) / plnr->nthr; + nthr = (int)((m + block_size - 1) / block_size); + plnr_nthr_save = plnr->nthr; + plnr->nthr = (plnr->nthr + nthr - 1) / nthr; + + cldws = (plan **) MALLOC(sizeof(plan *) * nthr, PLANS); + for (i = 0; i < nthr; ++i) cldws[i] = (plan *) 0; + + switch (ego->dec) { + case DECDIT: + { + for (i = 0; i < nthr; ++i) { + cldws[i] = ego->mkcldw(ego, + r, m * d[0].os, m * d[0].os, + m, d[0].os, + v, ovs, ovs, + i*block_size, + (i == nthr - 1) ? + (m - i*block_size) : block_size, + p->ro, p->io, plnr); + if (!cldws[i]) goto nada; + } + + plnr->nthr = plnr_nthr_save; + + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(m, r * d[0].is, d[0].os), + X(mktensor_2d)(r, d[0].is, m * d[0].os, + v, ivs, ovs), + p->ri, p->ii, p->ro, p->io) + ); + if (!cld) goto nada; + + pln = MKPLAN_DFT(P, &padt, apply_dit); + break; + } + case DECDIF: + case DECDIF+TRANSPOSE: + { + INT cors, covs; /* cldw ors, ovs */ + if (ego->dec == DECDIF+TRANSPOSE) { + cors = ivs; + covs = m * d[0].is; + /* ensure that we generate well-formed dftw subproblems */ + /* FIXME: too conservative */ + if (!(1 + && r == v + && d[0].is == r * cors)) + goto nada; + + /* FIXME: allow in-place only for now, like in + fftw-3.[01] */ + if (!(1 + && p->ri == p->ro + && d[0].is == r * d[0].os + && cors == d[0].os + && covs == ovs + )) + goto nada; + } else { + cors = m * d[0].is; + covs = ivs; + } + + for (i = 0; i < nthr; ++i) { + cldws[i] = ego->mkcldw(ego, + r, m * d[0].is, cors, + m, d[0].is, + v, ivs, covs, + i*block_size, + (i == nthr - 1) ? + (m - i*block_size) : block_size, + p->ri, p->ii, plnr); + if (!cldws[i]) goto nada; + } + + plnr->nthr = plnr_nthr_save; + + cld = X(mkplan_d)(plnr, + X(mkproblem_dft_d)( + X(mktensor_1d)(m, d[0].is, r * d[0].os), + X(mktensor_2d)(r, cors, d[0].os, + v, covs, ovs), + p->ri, p->ii, p->ro, p->io) + ); + if (!cld) goto nada; + + pln = MKPLAN_DFT(P, &padt, apply_dif); + break; + } + + default: A(0); + + } + + pln->cld = cld; + pln->cldws = cldws; + pln->nthr = nthr; + pln->r = r; + X(ops_zero)(&pln->super.super.ops); + for (i = 0; i < nthr; ++i) { + X(ops_add2)(&cldws[i]->ops, &pln->super.super.ops); + pln->super.super.could_prune_now_p |= cldws[i]->could_prune_now_p; + } + X(ops_add2)(&cld->ops, &pln->super.super.ops); + return &(pln->super.super); + + nada: + if (cldws) { + for (i = 0; i < nthr; ++i) + X(plan_destroy_internal)(cldws[i]); + X(ifree)(cldws); + } + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +ct_solver *X(mksolver_ct_threads)(size_t size, INT r, int dec, + ct_mkinferior mkcldw, + ct_force_vrecursion force_vrecursionp) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + ct_solver *slv = (ct_solver *) X(mksolver)(size, &sadt); + slv->r = r; + slv->dec = dec; + slv->mkcldw = mkcldw; + slv->force_vrecursionp = force_vrecursionp; + return slv; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/dft-vrank-geq1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/dft-vrank-geq1.c new file mode 100644 index 000000000..56415fe14 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/dft-vrank-geq1.c @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "threads/threads.h" + +typedef struct { + solver super; + int vecloop_dim; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_dft super; + plan **cldrn; + INT its, ots; + int nthr; + const S *solver; +} P; + +typedef struct { + INT its, ots; + R *ri, *ii, *ro, *io; + plan **cldrn; +} PD; + +static void *spawn_apply(spawn_data *d) +{ + PD *ego = (PD *) d->data; + INT its = ego->its; + INT ots = ego->ots; + int thr_num = d->thr_num; + plan_dft *cld = (plan_dft *) ego->cldrn[thr_num]; + + cld->apply((plan *) cld, + ego->ri + thr_num * its, ego->ii + thr_num * its, + ego->ro + thr_num * ots, ego->io + thr_num * ots); + return 0; +} + +static void apply(const plan *ego_, R *ri, R *ii, R *ro, R *io) +{ + const P *ego = (const P *) ego_; + PD d; + + d.its = ego->its; + d.ots = ego->ots; + d.cldrn = ego->cldrn; + d.ri = ri; d.ii = ii; d.ro = ro; d.io = io; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*) &d); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + int i; + for (i = 0; i < ego->nthr; ++i) + X(plan_awake)(ego->cldrn[i], wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + int i; + for (i = 0; i < ego->nthr; ++i) + X(plan_destroy_internal)(ego->cldrn[i]); + X(ifree)(ego->cldrn); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + int i; + p->print(p, "(dft-thr-vrank>=1-x%d/%d", ego->nthr, s->vecloop_dim); + for (i = 0; i < ego->nthr; ++i) + if (i == 0 || (ego->cldrn[i] != ego->cldrn[i-1] && + (i <= 1 || ego->cldrn[i] != ego->cldrn[i-2]))) + p->print(p, "%(%p%)", ego->cldrn[i]); + p->putchr(p, ')'); +} + +static int pickdim(const S *ego, const tensor *vecsz, int oop, int *dp) +{ + return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies, + vecsz, oop, dp); +} + +static int applicable0(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *) ego_; + const problem_dft *p = (const problem_dft *) p_; + + return (1 + && plnr->nthr > 1 + && FINITE_RNK(p->vecsz->rnk) + && p->vecsz->rnk > 0 + && pickdim(ego, p->vecsz, p->ri != p->ro, dp) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *)ego_; + + if (!applicable0(ego_, p_, plnr, dp)) return 0; + + /* fftw2 behavior */ + if (NO_VRANK_SPLITSP(plnr) && (ego->vecloop_dim != ego->buddies[0])) + return 0; + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_dft *p; + P *pln; + problem *cldp; + int vdim; + iodim *d; + plan **cldrn = (plan **) 0; + int i, nthr; + INT its, ots, block_size; + tensor *vecsz = 0; + + static const plan_adt padt = { + X(dft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &vdim)) + return (plan *) 0; + p = (const problem_dft *) p_; + d = p->vecsz->dims + vdim; + + block_size = (d->n + plnr->nthr - 1) / plnr->nthr; + nthr = (int)((d->n + block_size - 1) / block_size); + plnr->nthr = (plnr->nthr + nthr - 1) / nthr; + its = d->is * block_size; + ots = d->os * block_size; + + cldrn = (plan **)MALLOC(sizeof(plan *) * nthr, PLANS); + for (i = 0; i < nthr; ++i) cldrn[i] = (plan *) 0; + + vecsz = X(tensor_copy)(p->vecsz); + for (i = 0; i < nthr; ++i) { + vecsz->dims[vdim].n = + (i == nthr - 1) ? (d->n - i*block_size) : block_size; + cldp = X(mkproblem_dft)(p->sz, vecsz, + p->ri + i*its, p->ii + i*its, + p->ro + i*ots, p->io + i*ots); + cldrn[i] = X(mkplan_d)(plnr, cldp); + if (!cldrn[i]) goto nada; + } + X(tensor_destroy)(vecsz); + + pln = MKPLAN_DFT(P, &padt, apply); + + pln->cldrn = cldrn; + pln->its = its; + pln->ots = ots; + pln->nthr = nthr; + + pln->solver = ego; + X(ops_zero)(&pln->super.super.ops); + pln->super.super.pcost = 0; + for (i = 0; i < nthr; ++i) { + X(ops_add2)(&cldrn[i]->ops, &pln->super.super.ops); + pln->super.super.pcost += cldrn[i]->pcost; + } + + return &(pln->super.super); + + nada: + if (cldrn) { + for (i = 0; i < nthr; ++i) + X(plan_destroy_internal)(cldrn[i]); + X(ifree)(cldrn); + } + X(tensor_destroy)(vecsz); + return (plan *) 0; +} + +static solver *mksolver(int vecloop_dim, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_DFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->vecloop_dim = vecloop_dim; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(dft_thr_vrank_geq1_register)(planner *p) +{ + /* FIXME: Should we try other vecloop_dim values? */ + static const int buddies[] = { 1, -1 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/f77api.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/f77api.c new file mode 100644 index 000000000..de5b3411c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/f77api.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "api/api.h" + +/* if F77_FUNC is not defined, then we don't know how to mangle identifiers + for the Fortran linker, and we must omit the f77 API. */ +#if defined(F77_FUNC) || defined(WINDOWS_F77_MANGLING) + +#include "api/x77.h" + +#define F77(a, A) F77x(x77(a), X77(A)) + +#ifndef WINDOWS_F77_MANGLING + +#if defined(F77_FUNC) +# define F77x(a, A) F77_FUNC(a, A) +# include "f77funcs.h" +#endif + +#if defined(F77_FUNC_) && !defined(F77_FUNC_EQUIV) +# undef F77x +# define F77x(a, A) F77_FUNC_(a, A) +# include "f77funcs.h" +#endif + +#else /* WINDOWS_F77_MANGLING */ + +/* Various mangling conventions common (?) under Windows. */ + +/* g77 */ +# define WINDOWS_F77_FUNC(a, A) a ## __ +# define F77x(a, A) WINDOWS_F77_FUNC(a, A) +# include "f77funcs.h" + +/* Intel, etc. */ +# undef WINDOWS_F77_FUNC +# define WINDOWS_F77_FUNC(a, A) a ## _ +# include "f77funcs.h" + +/* Digital/Compaq/HP Visual Fortran, Intel Fortran. stdcall attribute + is apparently required to adjust for calling conventions (callee + pops stack in stdcall). See also: + http://msdn.microsoft.com/library/en-us/vccore98/html/_core_mixed.2d.language_programming.3a_.overview.asp +*/ +# undef WINDOWS_F77_FUNC +# if defined(__GNUC__) +# define WINDOWS_F77_FUNC(a, A) __attribute__((stdcall)) A +# elif defined(_MSC_VER) || defined(_ICC) || defined(_STDCALL_SUPPORTED) +# define WINDOWS_F77_FUNC(a, A) __stdcall A +# else +# define WINDOWS_F77_FUNC(a, A) A /* oh well */ +# endif +# include "f77funcs.h" + +#endif /* WINDOWS_F77_MANGLING */ + +#endif /* F77_FUNC */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/f77funcs.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/f77funcs.h new file mode 100644 index 000000000..8c477b5ed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/f77funcs.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Functions in the FFTW Fortran API, mangled according to the + F77(...) macro. This file is designed to be #included by + f77api.c, possibly multiple times in order to support multiple + compiler manglings (via redefinition of F77). */ + +FFTW_VOIDFUNC F77(plan_with_nthreads, PLAN_WITH_NTHREADS)(int *nthreads) +{ + X(plan_with_nthreads)(*nthreads); +} + +FFTW_VOIDFUNC F77(init_threads, INIT_THREADS)(int *okay) +{ + *okay = X(init_threads)(); +} + +FFTW_VOIDFUNC F77(cleanup_threads, CLEANUP_THREADS)(void) +{ + X(cleanup_threads)(); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/hc2hc.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/hc2hc.c new file mode 100644 index 000000000..f3b41e2e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/hc2hc.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "threads/threads.h" + +typedef struct { + plan_rdft super; + plan *cld; + plan **cldws; + int nthr; + INT r; +} P; + +typedef struct { + plan **cldws; + R *IO; +} PD; + +static void *spawn_apply(spawn_data *d) +{ + PD *ego = (PD *) d->data; + + plan_hc2hc *cldw = (plan_hc2hc *) (ego->cldws[d->thr_num]); + cldw->apply((plan *) cldw, ego->IO); + return 0; +} + +static void apply_dit(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld; + + cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, I, O); + + { + PD d; + + d.IO = O; + d.cldws = ego->cldws; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*)&d); + } +} + +static void apply_dif(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + plan_rdft *cld; + + { + PD d; + + d.IO = I; + d.cldws = ego->cldws; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*)&d); + } + + cld = (plan_rdft *) ego->cld; + cld->apply((plan *) cld, I, O); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + int i; + X(plan_awake)(ego->cld, wakefulness); + for (i = 0; i < ego->nthr; ++i) + X(plan_awake)(ego->cldws[i], wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + int i; + X(plan_destroy_internal)(ego->cld); + for (i = 0; i < ego->nthr; ++i) + X(plan_destroy_internal)(ego->cldws[i]); + X(ifree)(ego->cldws); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + int i; + p->print(p, "(rdft-thr-ct-%s-x%d/%D", + ego->super.apply == apply_dit ? "dit" : "dif", + ego->nthr, ego->r); + for (i = 0; i < ego->nthr; ++i) + if (i == 0 || (ego->cldws[i] != ego->cldws[i-1] && + (i <= 1 || ego->cldws[i] != ego->cldws[i-2]))) + p->print(p, "%(%p%)", ego->cldws[i]); + p->print(p, "%(%p%))", ego->cld); +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const hc2hc_solver *ego = (const hc2hc_solver *) ego_; + const problem_rdft *p; + P *pln = 0; + plan *cld = 0, **cldws = 0; + INT n, r, m, v, ivs, ovs, mcount; + int i, nthr, plnr_nthr_save; + INT block_size; + iodim *d; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (plnr->nthr <= 1 || !X(hc2hc_applicable)(ego, p_, plnr)) + return (plan *) 0; + + p = (const problem_rdft *) p_; + d = p->sz->dims; + n = d[0].n; + r = X(choose_radix)(ego->r, n); + m = n / r; + mcount = (m + 2) / 2; + + X(tensor_tornk1)(p->vecsz, &v, &ivs, &ovs); + + block_size = (mcount + plnr->nthr - 1) / plnr->nthr; + nthr = (int)((mcount + block_size - 1) / block_size); + plnr_nthr_save = plnr->nthr; + plnr->nthr = (plnr->nthr + nthr - 1) / nthr; + + cldws = (plan **) MALLOC(sizeof(plan *) * nthr, PLANS); + for (i = 0; i < nthr; ++i) cldws[i] = (plan *) 0; + + switch (p->kind[0]) { + case R2HC: + for (i = 0; i < nthr; ++i) { + cldws[i] = ego->mkcldw(ego, + R2HC, r, m, d[0].os, v, ovs, + i*block_size, + (i == nthr - 1) ? + (mcount - i*block_size) : block_size, + p->O, plnr); + if (!cldws[i]) goto nada; + } + + plnr->nthr = plnr_nthr_save; + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(m, r * d[0].is, d[0].os), + X(mktensor_2d)(r, d[0].is, m * d[0].os, + v, ivs, ovs), + p->I, p->O, p->kind) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT(P, &padt, apply_dit); + break; + + case HC2R: + for (i = 0; i < nthr; ++i) { + cldws[i] = ego->mkcldw(ego, + HC2R, r, m, d[0].is, v, ivs, + i*block_size, + (i == nthr - 1) ? + (mcount - i*block_size) : block_size, + p->I, plnr); + if (!cldws[i]) goto nada; + } + + plnr->nthr = plnr_nthr_save; + + cld = X(mkplan_d)(plnr, + X(mkproblem_rdft_d)( + X(mktensor_1d)(m, d[0].is, r * d[0].os), + X(mktensor_2d)(r, m * d[0].is, d[0].os, + v, ivs, ovs), + p->I, p->O, p->kind) + ); + if (!cld) goto nada; + + pln = MKPLAN_RDFT(P, &padt, apply_dif); + break; + + default: + A(0); + } + + pln->cld = cld; + pln->cldws = cldws; + pln->nthr = nthr; + pln->r = r; + X(ops_zero)(&pln->super.super.ops); + for (i = 0; i < nthr; ++i) { + X(ops_add2)(&cldws[i]->ops, &pln->super.super.ops); + pln->super.super.could_prune_now_p |= cldws[i]->could_prune_now_p; + } + X(ops_add2)(&cld->ops, &pln->super.super.ops); + return &(pln->super.super); + + nada: + if (cldws) { + for (i = 0; i < nthr; ++i) + X(plan_destroy_internal)(cldws[i]); + X(ifree)(cldws); + } + X(plan_destroy_internal)(cld); + return (plan *) 0; +} + +hc2hc_solver *X(mksolver_hc2hc_threads)(size_t size, INT r, + hc2hc_mkinferior mkcldw) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + hc2hc_solver *slv = (hc2hc_solver *)X(mksolver)(size, &sadt); + slv->r = r; + slv->mkcldw = mkcldw; + return slv; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/openmp.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/openmp.c new file mode 100644 index 000000000..1b384ece5 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/openmp.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* openmp.c: thread spawning via OpenMP */ + +#include "threads/threads.h" + +#if !defined(_OPENMP) +#error OpenMP enabled but not using an OpenMP compiler +#endif + +int X(ithreads_init)(void) +{ + return 0; /* no error */ +} + +/* Distribute a loop from 0 to loopmax-1 over nthreads threads. + proc(d) is called to execute a block of iterations from d->min + to d->max-1. d->thr_num indicate the number of the thread + that is executing proc (from 0 to nthreads-1), and d->data is + the same as the data parameter passed to X(spawn_loop). + + This function returns only after all the threads have completed. */ +void X(spawn_loop)(int loopmax, int nthr, spawn_function proc, void *data) +{ + int block_size; + spawn_data d; + int i; + + A(loopmax >= 0); + A(nthr > 0); + A(proc); + + if (!loopmax) return; + + /* Choose the block size and number of threads in order to (1) + minimize the critical path and (2) use the fewest threads that + achieve the same critical path (to minimize overhead). + e.g. if loopmax is 5 and nthr is 4, we should use only 3 + threads with block sizes of 2, 2, and 1. */ + block_size = (loopmax + nthr - 1) / nthr; + nthr = (loopmax + block_size - 1) / block_size; + +#pragma omp parallel for private(d) + for (i = 0; i < nthr; ++i) { + d.max = (d.min = i * block_size) + block_size; + if (d.max > loopmax) + d.max = loopmax; + d.thr_num = i; + d.data = data; + proc(&d); + } +} + +void X(threads_cleanup)(void) +{ +} + +/* FIXME [Matteo Frigo 2015-05-25] What does "thread-safe" + mean for openmp? */ +void X(threads_register_planner_hooks)(void) +{ +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/rdft-vrank-geq1.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/rdft-vrank-geq1.c new file mode 100644 index 000000000..722f9223c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/rdft-vrank-geq1.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#include "threads/threads.h" + +typedef struct { + solver super; + int vecloop_dim; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_rdft super; + plan **cldrn; + INT its, ots; + int nthr; + const S *solver; +} P; + +typedef struct { + INT its, ots; + R *I, *O; + plan **cldrn; +} PD; + +static void *spawn_apply(spawn_data *d) +{ + PD *ego = (PD *) d->data; + int thr_num = d->thr_num; + plan_rdft *cld = (plan_rdft *) ego->cldrn[d->thr_num]; + + cld->apply((plan *) cld, + ego->I + thr_num * ego->its, ego->O + thr_num * ego->ots); + return 0; +} + +static void apply(const plan *ego_, R *I, R *O) +{ + const P *ego = (const P *) ego_; + PD d; + + d.its = ego->its; + d.ots = ego->ots; + d.cldrn = ego->cldrn; + d.I = I; d.O = O; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*) &d); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + int i; + for (i = 0; i < ego->nthr; ++i) + X(plan_awake)(ego->cldrn[i], wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + int i; + for (i = 0; i < ego->nthr; ++i) + X(plan_destroy_internal)(ego->cldrn[i]); + X(ifree)(ego->cldrn); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + int i; + p->print(p, "(rdft-thr-vrank>=1-x%d/%d", ego->nthr, s->vecloop_dim); + for (i = 0; i < ego->nthr; ++i) + if (i == 0 || (ego->cldrn[i] != ego->cldrn[i-1] && + (i <= 1 || ego->cldrn[i] != ego->cldrn[i-2]))) + p->print(p, "%(%p%)", ego->cldrn[i]); + p->putchr(p, ')'); +} + +static int pickdim(const S *ego, const tensor *vecsz, int oop, int *dp) +{ + return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies, + vecsz, oop, dp); +} + +static int applicable0(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p = (const problem_rdft *) p_; + + return (1 + && plnr->nthr > 1 + && FINITE_RNK(p->vecsz->rnk) + && p->vecsz->rnk > 0 + && pickdim(ego, p->vecsz, p->I != p->O, dp) + ); +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *)ego_; + + if (!applicable0(ego_, p_, plnr, dp)) return 0; + + /* fftw2 behavior */ + if (NO_VRANK_SPLITSP(plnr) && (ego->vecloop_dim != ego->buddies[0])) + return 0; + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft *p; + P *pln; + problem *cldp; + int vdim; + iodim *d; + plan **cldrn = (plan **) 0; + int i, nthr; + INT its, ots, block_size; + tensor *vecsz; + + static const plan_adt padt = { + X(rdft_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &vdim)) + return (plan *) 0; + p = (const problem_rdft *) p_; + + d = p->vecsz->dims + vdim; + + block_size = (d->n + plnr->nthr - 1) / plnr->nthr; + nthr = (int)((d->n + block_size - 1) / block_size); + plnr->nthr = (plnr->nthr + nthr - 1) / nthr; + its = d->is * block_size; + ots = d->os * block_size; + + cldrn = (plan **)MALLOC(sizeof(plan *) * nthr, PLANS); + for (i = 0; i < nthr; ++i) cldrn[i] = (plan *) 0; + + vecsz = X(tensor_copy)(p->vecsz); + for (i = 0; i < nthr; ++i) { + vecsz->dims[vdim].n = + (i == nthr - 1) ? (d->n - i*block_size) : block_size; + cldp = X(mkproblem_rdft)(p->sz, vecsz, + p->I + i*its, p->O + i*ots, p->kind); + cldrn[i] = X(mkplan_d)(plnr, cldp); + if (!cldrn[i]) goto nada; + } + X(tensor_destroy)(vecsz); + + pln = MKPLAN_RDFT(P, &padt, apply); + + pln->cldrn = cldrn; + pln->its = its; + pln->ots = ots; + pln->nthr = nthr; + + pln->solver = ego; + X(ops_zero)(&pln->super.super.ops); + pln->super.super.pcost = 0; + for (i = 0; i < nthr; ++i) { + X(ops_add2)(&cldrn[i]->ops, &pln->super.super.ops); + pln->super.super.pcost += cldrn[i]->pcost; + } + + return &(pln->super.super); + + nada: + if (cldrn) { + for (i = 0; i < nthr; ++i) + X(plan_destroy_internal)(cldrn[i]); + X(ifree)(cldrn); + } + X(tensor_destroy)(vecsz); + return (plan *) 0; +} + +static solver *mksolver(int vecloop_dim, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_RDFT, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->vecloop_dim = vecloop_dim; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(rdft_thr_vrank_geq1_register)(planner *p) +{ + size_t i; + + /* FIXME: Should we try other vecloop_dim values? */ + static const int buddies[] = { 1, -1 }; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/threads.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/threads.c new file mode 100644 index 000000000..9f4036341 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/threads.c @@ -0,0 +1,485 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* threads.c: Portable thread spawning for loops, via the X(spawn_loop) + function. The first portion of this file is a set of macros to + spawn and join threads on various systems. */ + +#include "threads/threads.h" +#include "api/api.h" + +#if defined(USING_POSIX_THREADS) + +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +/* imlementation of semaphores and mutexes: */ +#if (defined(_POSIX_SEMAPHORES) && (_POSIX_SEMAPHORES >= 200112L)) + + /* If optional POSIX semaphores are supported, use them to + implement both semaphores and mutexes. */ +# include +# include + + typedef sem_t os_sem_t; + + static void os_sem_init(os_sem_t *s) { sem_init(s, 0, 0); } + static void os_sem_destroy(os_sem_t *s) { sem_destroy(s); } + + static void os_sem_down(os_sem_t *s) + { + int err; + do { + err = sem_wait(s); + } while (err == -1 && errno == EINTR); + CK(err == 0); + } + + static void os_sem_up(os_sem_t *s) { sem_post(s); } + + /* + The reason why we use sem_t to implement mutexes is that I have + seen mysterious hangs with glibc-2.7 and linux-2.6.22 when using + pthread_mutex_t, but no hangs with sem_t or with linux >= + 2.6.24. For lack of better information, sem_t looks like the + safest choice. + */ + typedef sem_t os_mutex_t; + static void os_mutex_init(os_mutex_t *s) { sem_init(s, 0, 1); } + #define os_mutex_destroy os_sem_destroy + #define os_mutex_lock os_sem_down + #define os_mutex_unlock os_sem_up + +#else + + /* If optional POSIX semaphores are not defined, use pthread + mutexes for mutexes, and simulate semaphores with condition + variables */ + typedef pthread_mutex_t os_mutex_t; + + static void os_mutex_init(os_mutex_t *s) + { + pthread_mutex_init(s, (pthread_mutexattr_t *)0); + } + + static void os_mutex_destroy(os_mutex_t *s) { pthread_mutex_destroy(s); } + static void os_mutex_lock(os_mutex_t *s) { pthread_mutex_lock(s); } + static void os_mutex_unlock(os_mutex_t *s) { pthread_mutex_unlock(s); } + + typedef struct { + pthread_mutex_t m; + pthread_cond_t c; + volatile int x; + } os_sem_t; + + static void os_sem_init(os_sem_t *s) + { + pthread_mutex_init(&s->m, (pthread_mutexattr_t *)0); + pthread_cond_init(&s->c, (pthread_condattr_t *)0); + + /* wrap initialization in lock to exploit the release + semantics of pthread_mutex_unlock() */ + pthread_mutex_lock(&s->m); + s->x = 0; + pthread_mutex_unlock(&s->m); + } + + static void os_sem_destroy(os_sem_t *s) + { + pthread_mutex_destroy(&s->m); + pthread_cond_destroy(&s->c); + } + + static void os_sem_down(os_sem_t *s) + { + pthread_mutex_lock(&s->m); + while (s->x <= 0) + pthread_cond_wait(&s->c, &s->m); + --s->x; + pthread_mutex_unlock(&s->m); + } + + static void os_sem_up(os_sem_t *s) + { + pthread_mutex_lock(&s->m); + ++s->x; + pthread_cond_signal(&s->c); + pthread_mutex_unlock(&s->m); + } + +#endif + +#define FFTW_WORKER void * + +static void os_create_thread(FFTW_WORKER (*worker)(void *arg), + void *arg) +{ + pthread_attr_t attr; + pthread_t tid; + + pthread_attr_init(&attr); + pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + pthread_create(&tid, &attr, worker, (void *)arg); + pthread_attr_destroy(&attr); +} + +static void os_destroy_thread(void) +{ + pthread_exit((void *)0); +} + +/* support for static mutexes */ +typedef pthread_mutex_t os_static_mutex_t; +#define OS_STATIC_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +static void os_static_mutex_lock(os_static_mutex_t *s) { pthread_mutex_lock(s); } +static void os_static_mutex_unlock(os_static_mutex_t *s) { pthread_mutex_unlock(s); } + +#elif defined(__WIN32__) || defined(_WIN32) || defined(_WINDOWS) +/* hack: windef.h defines INT for its own purposes and this causes + a conflict with our own INT in ifftw.h. Divert the windows + definition into another name unlikely to cause a conflict */ +#define INT magnus_ab_INTegro_seclorum_nascitur_ordo +#include +#include +#include +#undef INT + +typedef HANDLE os_mutex_t; + +static void os_mutex_init(os_mutex_t *s) +{ + *s = CreateMutex(NULL, FALSE, NULL); +} + +static void os_mutex_destroy(os_mutex_t *s) +{ + CloseHandle(*s); +} + +static void os_mutex_lock(os_mutex_t *s) +{ + WaitForSingleObject(*s, INFINITE); +} + +static void os_mutex_unlock(os_mutex_t *s) +{ + ReleaseMutex(*s); +} + +typedef HANDLE os_sem_t; + +static void os_sem_init(os_sem_t *s) +{ + *s = CreateSemaphore(NULL, 0, 0x7FFFFFFFL, NULL); +} + +static void os_sem_destroy(os_sem_t *s) +{ + CloseHandle(*s); +} + +static void os_sem_down(os_sem_t *s) +{ + WaitForSingleObject(*s, INFINITE); +} + +static void os_sem_up(os_sem_t *s) +{ + ReleaseSemaphore(*s, 1, NULL); +} + +#define FFTW_WORKER unsigned __stdcall +typedef unsigned (__stdcall *winthread_start) (void *); + +static void os_create_thread(winthread_start worker, + void *arg) +{ + _beginthreadex((void *)NULL, /* security attrib */ + 0, /* stack size */ + worker, /* start address */ + arg, /* parameters */ + 0, /* creation flags */ + (unsigned *)NULL); /* tid */ +} + +static void os_destroy_thread(void) +{ + _endthreadex(0); +} + +/* windows does not have statically-initialized mutexes---fake a + spinlock */ +typedef volatile LONG os_static_mutex_t; +#define OS_STATIC_MUTEX_INITIALIZER 0 +static void os_static_mutex_lock(os_static_mutex_t *s) +{ + while (InterlockedExchange(s, 1) == 1) { + YieldProcessor(); + Sleep(0); + } +} +static void os_static_mutex_unlock(os_static_mutex_t *s) +{ + LONG old = InterlockedExchange(s, 0); + A(old == 1); +} +#else +#error "No threading layer defined" +#endif + +/************************************************************************/ + +/* Main code: */ +struct worker { + os_sem_t ready; + os_sem_t done; + struct work *w; + struct worker *cdr; +}; + +static struct worker *make_worker(void) +{ + struct worker *q = (struct worker *)MALLOC(sizeof(*q), OTHER); + os_sem_init(&q->ready); + os_sem_init(&q->done); + return q; +} + +static void unmake_worker(struct worker *q) +{ + os_sem_destroy(&q->done); + os_sem_destroy(&q->ready); + X(ifree)(q); +} + +struct work { + spawn_function proc; + spawn_data d; + struct worker *q; /* the worker responsible for performing this work */ +}; + +static os_mutex_t queue_lock; +static os_sem_t termination_semaphore; + +static struct worker *worker_queue; +#define WITH_QUEUE_LOCK(what) \ +{ \ + os_mutex_lock(&queue_lock); \ + what; \ + os_mutex_unlock(&queue_lock); \ +} + +static FFTW_WORKER worker(void *arg) +{ + struct worker *ego = (struct worker *)arg; + struct work *w; + + for (;;) { + /* wait until work becomes available */ + os_sem_down(&ego->ready); + + w = ego->w; + + /* !w->proc ==> terminate worker */ + if (!w->proc) break; + + /* do the work */ + w->proc(&w->d); + + /* signal that work is done */ + os_sem_up(&ego->done); + } + + /* termination protocol */ + os_sem_up(&termination_semaphore); + + os_destroy_thread(); + /* UNREACHABLE */ + return 0; +} + +static void enqueue(struct worker *q) +{ + WITH_QUEUE_LOCK({ + q->cdr = worker_queue; + worker_queue = q; + }); +} + +static struct worker *dequeue(void) +{ + struct worker *q; + + WITH_QUEUE_LOCK({ + q = worker_queue; + if (q) + worker_queue = q->cdr; + }); + + if (!q) { + /* no worker is available. Create one */ + q = make_worker(); + os_create_thread(worker, q); + } + + return q; +} + + +static void kill_workforce(void) +{ + struct work w; + + w.proc = 0; + + WITH_QUEUE_LOCK({ + /* tell all workers that they must terminate. + + Because workers enqueue themselves before signaling the + completion of the work, all workers belong to the worker queue + if we get here. Also, all workers are waiting at + os_sem_down(ready), so we can hold the queue lock without + deadlocking */ + while (worker_queue) { + struct worker *q = worker_queue; + worker_queue = q->cdr; + q->w = &w; + os_sem_up(&q->ready); + os_sem_down(&termination_semaphore); + unmake_worker(q); + } + }); +} + +static os_static_mutex_t initialization_mutex = OS_STATIC_MUTEX_INITIALIZER; + +int X(ithreads_init)(void) +{ + os_static_mutex_lock(&initialization_mutex); { + os_mutex_init(&queue_lock); + os_sem_init(&termination_semaphore); + + WITH_QUEUE_LOCK({ + worker_queue = 0; + }); + } os_static_mutex_unlock(&initialization_mutex); + + return 0; /* no error */ +} + +/* Distribute a loop from 0 to loopmax-1 over nthreads threads. + proc(d) is called to execute a block of iterations from d->min + to d->max-1. d->thr_num indicate the number of the thread + that is executing proc (from 0 to nthreads-1), and d->data is + the same as the data parameter passed to X(spawn_loop). + + This function returns only after all the threads have completed. */ +void X(spawn_loop)(int loopmax, int nthr, spawn_function proc, void *data) +{ + int block_size; + struct work *r; + int i; + + A(loopmax >= 0); + A(nthr > 0); + A(proc); + + if (!loopmax) return; + + /* Choose the block size and number of threads in order to (1) + minimize the critical path and (2) use the fewest threads that + achieve the same critical path (to minimize overhead). + e.g. if loopmax is 5 and nthr is 4, we should use only 3 + threads with block sizes of 2, 2, and 1. */ + block_size = (loopmax + nthr - 1) / nthr; + nthr = (loopmax + block_size - 1) / block_size; + + STACK_MALLOC(struct work *, r, sizeof(struct work) * nthr); + + /* distribute work: */ + for (i = 0; i < nthr; ++i) { + struct work *w = &r[i]; + spawn_data *d = &w->d; + + d->max = (d->min = i * block_size) + block_size; + if (d->max > loopmax) + d->max = loopmax; + d->thr_num = i; + d->data = data; + w->proc = proc; + + if (i == nthr - 1) { + /* do the work ourselves */ + proc(d); + } else { + /* assign a worker to W */ + w->q = dequeue(); + + /* tell worker w->q to do it */ + w->q->w = w; /* Dirac could have written this */ + os_sem_up(&w->q->ready); + } + } + + for (i = 0; i < nthr - 1; ++i) { + struct work *w = &r[i]; + os_sem_down(&w->q->done); + enqueue(w->q); + } + + STACK_FREE(r); +} + +void X(threads_cleanup)(void) +{ + kill_workforce(); + os_mutex_destroy(&queue_lock); + os_sem_destroy(&termination_semaphore); +} + +static os_static_mutex_t install_planner_hooks_mutex = OS_STATIC_MUTEX_INITIALIZER; +static os_mutex_t planner_mutex; +static int planner_hooks_installed = 0; + +static void lock_planner_mutex(void) +{ + os_mutex_lock(&planner_mutex); +} + +static void unlock_planner_mutex(void) +{ + os_mutex_unlock(&planner_mutex); +} + +void X(threads_register_planner_hooks)(void) +{ + os_static_mutex_lock(&install_planner_hooks_mutex); { + if (!planner_hooks_installed) { + os_mutex_init(&planner_mutex); + X(set_planner_hooks)(lock_planner_mutex, unlock_planner_mutex); + planner_hooks_installed = 1; + } + } os_static_mutex_unlock(&install_planner_hooks_mutex); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/threads.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/threads.h new file mode 100644 index 000000000..8c5072d0b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/threads.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __THREADS_H__ +#define __THREADS_H__ + +#include "kernel/ifftw.h" +#include "dft/ct.h" +#include "rdft/hc2hc.h" + +typedef struct { + int min, max, thr_num; + void *data; +} spawn_data; + +typedef void *(*spawn_function) (spawn_data *); + +void X(spawn_loop)(int loopmax, int nthreads, + spawn_function proc, void *data); +int X(ithreads_init)(void); +void X(threads_cleanup)(void); + +/* configurations */ + +void X(dft_thr_vrank_geq1_register)(planner *p); +void X(rdft_thr_vrank_geq1_register)(planner *p); +void X(rdft2_thr_vrank_geq1_register)(planner *p); + +ct_solver *X(mksolver_ct_threads)(size_t size, INT r, int dec, + ct_mkinferior mkcldw, + ct_force_vrecursion force_vrecursionp); +hc2hc_solver *X(mksolver_hc2hc_threads)(size_t size, INT r, hc2hc_mkinferior mkcldw); + +void X(threads_conf_standard)(planner *p); +void X(threads_register_hooks)(void); +void X(threads_unregister_hooks)(void); +void X(threads_register_planner_hooks)(void); + +#endif /* __THREADS_H__ */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/vrank-geq1-rdft2.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/vrank-geq1-rdft2.c new file mode 100644 index 000000000..b7a76e14e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/threads/vrank-geq1-rdft2.c @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2003, 2007-14 Matteo Frigo + * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +#include "threads/threads.h" + +typedef struct { + solver super; + int vecloop_dim; + const int *buddies; + size_t nbuddies; +} S; + +typedef struct { + plan_rdft2 super; + + plan **cldrn; + INT its, ots; + int nthr; + const S *solver; +} P; + +typedef struct { + INT its, ots; + R *r0, *r1, *cr, *ci; + plan **cldrn; +} PD; + +static void *spawn_apply(spawn_data *d) +{ + PD *ego = (PD *) d->data; + INT its = ego->its; + INT ots = ego->ots; + int thr_num = d->thr_num; + plan_rdft2 *cld = (plan_rdft2 *) ego->cldrn[d->thr_num]; + + cld->apply((plan *) cld, + ego->r0 + thr_num * its, ego->r1 + thr_num * its, + ego->cr + thr_num * ots, ego->ci + thr_num * ots); + return 0; +} + +static void apply(const plan *ego_, R *r0, R *r1, R *cr, R *ci) +{ + const P *ego = (const P *) ego_; + PD d; + + d.its = ego->its; + d.ots = ego->ots; + d.cldrn = ego->cldrn; + d.r0 = r0; d.r1 = r1; d.cr = cr; d.ci = ci; + + X(spawn_loop)(ego->nthr, ego->nthr, spawn_apply, (void*) &d); +} + +static void awake(plan *ego_, enum wakefulness wakefulness) +{ + P *ego = (P *) ego_; + int i; + for (i = 0; i < ego->nthr; ++i) + X(plan_awake)(ego->cldrn[i], wakefulness); +} + +static void destroy(plan *ego_) +{ + P *ego = (P *) ego_; + int i; + for (i = 0; i < ego->nthr; ++i) + X(plan_destroy_internal)(ego->cldrn[i]); + X(ifree)(ego->cldrn); +} + +static void print(const plan *ego_, printer *p) +{ + const P *ego = (const P *) ego_; + const S *s = ego->solver; + int i; + p->print(p, "(rdft2-thr-vrank>=1-x%d/%d)", ego->nthr, s->vecloop_dim); + for (i = 0; i < ego->nthr; ++i) + if (i == 0 || (ego->cldrn[i] != ego->cldrn[i-1] && + (i <= 1 || ego->cldrn[i] != ego->cldrn[i-2]))) + p->print(p, "%(%p%)", ego->cldrn[i]); + p->putchr(p, ')'); +} + +static int pickdim(const S *ego, const tensor *vecsz, int oop, int *dp) +{ + return X(pickdim)(ego->vecloop_dim, ego->buddies, ego->nbuddies, + vecsz, oop, dp); +} + +static int applicable0(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *) ego_; + const problem_rdft2 *p = (const problem_rdft2 *) p_; + + if (FINITE_RNK(p->vecsz->rnk) + && p->vecsz->rnk > 0 + && plnr->nthr > 1 + && pickdim(ego, p->vecsz, p->r0 != p->cr, dp)) { + if (p->r0 != p->cr) + return 1; /* can always operate out-of-place */ + + return(X(rdft2_inplace_strides)(p, *dp)); + } + + return 0; +} + +static int applicable(const solver *ego_, const problem *p_, + const planner *plnr, int *dp) +{ + const S *ego = (const S *)ego_; + + if (!applicable0(ego_, p_, plnr, dp)) return 0; + + /* fftw2 behavior */ + if (NO_VRANK_SPLITSP(plnr) && (ego->vecloop_dim != ego->buddies[0])) + return 0; + + return 1; +} + +static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr) +{ + const S *ego = (const S *) ego_; + const problem_rdft2 *p; + P *pln; + problem *cldp; + int vdim; + iodim *d; + plan **cldrn = (plan **) 0; + int i, nthr; + INT its, ots, block_size; + tensor *vecsz; + + static const plan_adt padt = { + X(rdft2_solve), awake, print, destroy + }; + + if (!applicable(ego_, p_, plnr, &vdim)) + return (plan *) 0; + p = (const problem_rdft2 *) p_; + + d = p->vecsz->dims + vdim; + + block_size = (d->n + plnr->nthr - 1) / plnr->nthr; + nthr = (int)((d->n + block_size - 1) / block_size); + plnr->nthr = (plnr->nthr + nthr - 1) / nthr; + X(rdft2_strides)(p->kind, d, &its, &ots); + its *= block_size; ots *= block_size; + + cldrn = (plan **)MALLOC(sizeof(plan *) * nthr, PLANS); + for (i = 0; i < nthr; ++i) cldrn[i] = (plan *) 0; + + vecsz = X(tensor_copy)(p->vecsz); + for (i = 0; i < nthr; ++i) { + vecsz->dims[vdim].n = + (i == nthr - 1) ? (d->n - i*block_size) : block_size; + cldp = X(mkproblem_rdft2)(p->sz, vecsz, + p->r0 + i*its, p->r1 + i*its, + p->cr + i*ots, p->ci + i*ots, + p->kind); + cldrn[i] = X(mkplan_d)(plnr, cldp); + if (!cldrn[i]) goto nada; + } + X(tensor_destroy)(vecsz); + + pln = MKPLAN_RDFT2(P, &padt, apply); + + pln->cldrn = cldrn; + pln->its = its; + pln->ots = ots; + pln->nthr = nthr; + + pln->solver = ego; + X(ops_zero)(&pln->super.super.ops); + pln->super.super.pcost = 0; + for (i = 0; i < nthr; ++i) { + X(ops_add2)(&cldrn[i]->ops, &pln->super.super.ops); + pln->super.super.pcost += cldrn[i]->pcost; + } + + return &(pln->super.super); + + nada: + if (cldrn) { + for (i = 0; i < nthr; ++i) + X(plan_destroy_internal)(cldrn[i]); + X(ifree)(cldrn); + } + X(tensor_destroy)(vecsz); + return (plan *) 0; +} + +static solver *mksolver(int vecloop_dim, const int *buddies, size_t nbuddies) +{ + static const solver_adt sadt = { PROBLEM_RDFT2, mkplan, 0 }; + S *slv = MKSOLVER(S, &sadt); + slv->vecloop_dim = vecloop_dim; + slv->buddies = buddies; + slv->nbuddies = nbuddies; + return &(slv->super); +} + +void X(rdft2_thr_vrank_geq1_register)(planner *p) +{ + /* FIXME: Should we try other vecloop_dim values? */ + static const int buddies[] = { 1, -1 }; + size_t i; + + for (i = 0; i < NELEM(buddies); ++i) + REGISTER_SOLVER(p, mksolver(buddies[i], buddies, NELEM(buddies))); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/Makefile.am b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/Makefile.am new file mode 100644 index 000000000..bed8dd810 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/Makefile.am @@ -0,0 +1,30 @@ +AM_CPPFLAGS = -I $(top_srcdir) +bin_SCRIPTS = fftw-wisdom-to-conf +bin_PROGRAMS = fftw@PREC_SUFFIX@-wisdom + +BUILT_SOURCES = fftw-wisdom-to-conf fftw@PREC_SUFFIX@-wisdom.1 +EXTRA_DIST = fftw-wisdom-to-conf.in + +dist_man_MANS = fftw-wisdom-to-conf.1 fftw@PREC_SUFFIX@-wisdom.1 +EXTRA_MANS = fftw_wisdom.1.in +fftw@PREC_SUFFIX@-wisdom.1: fftw_wisdom.1 + rm -f $@ + cp fftw_wisdom.1 $@ + +if THREADS +fftw@PREC_SUFFIX@_wisdom_CFLAGS = $(PTHREAD_CFLAGS) +if !COMBINED_THREADS +LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_threads.la +endif +else +if OPENMP +fftw@PREC_SUFFIX@_wisdom_CFLAGS = $(OPENMP_CFLAGS) +LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_omp.la +endif +endif + +fftw@PREC_SUFFIX@_wisdom_SOURCES = fftw-wisdom.c +fftw@PREC_SUFFIX@_wisdom_LDADD = $(top_builddir)/tests/bench-bench.o \ +$(top_builddir)/tests/bench-fftw-bench.o $(LIBFFTWTHREADS) \ +$(top_builddir)/libfftw3@PREC_SUFFIX@.la \ +$(top_builddir)/libbench2/libbench2.a $(THREADLIBS) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/Makefile.in new file mode 100644 index 000000000..3fc6a6335 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/Makefile.in @@ -0,0 +1,770 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = fftw@PREC_SUFFIX@-wisdom$(EXEEXT) +subdir = tools +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_mpi.m4 \ + $(top_srcdir)/m4/acx_pthread.m4 \ + $(top_srcdir)/m4/ax_cc_maxopt.m4 \ + $(top_srcdir)/m4/ax_check_compiler_flags.m4 \ + $(top_srcdir)/m4/ax_compiler_vendor.m4 \ + $(top_srcdir)/m4/ax_gcc_aligns_stack.m4 \ + $(top_srcdir)/m4/ax_gcc_version.m4 \ + $(top_srcdir)/m4/ax_openmp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = fftw_wisdom.1 fftw-wisdom-to-conf +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_fftw@PREC_SUFFIX@_wisdom_OBJECTS = \ + fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.$(OBJEXT) +fftw@PREC_SUFFIX@_wisdom_OBJECTS = \ + $(am_fftw@PREC_SUFFIX@_wisdom_OBJECTS) +am__DEPENDENCIES_1 = +fftw@PREC_SUFFIX@_wisdom_DEPENDENCIES = \ + $(top_builddir)/tests/bench-bench.o \ + $(top_builddir)/tests/bench-fftw-bench.o $(LIBFFTWTHREADS) \ + $(top_builddir)/libfftw3@PREC_SUFFIX@.la \ + $(top_builddir)/libbench2/libbench2.a $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +fftw@PREC_SUFFIX@_wisdom_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(fftw@PREC_SUFFIX@_wisdom_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(fftw@PREC_SUFFIX@_wisdom_SOURCES) +DIST_SOURCES = $(fftw@PREC_SUFFIX@_wisdom_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(dist_man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \ + $(srcdir)/fftw-wisdom-to-conf.in $(srcdir)/fftw_wisdom.1.in \ + $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALTIVEC_CFLAGS = @ALTIVEC_CFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVX2_CFLAGS = @AVX2_CFLAGS@ +AVX512_CFLAGS = @AVX512_CFLAGS@ +AVX_128_FMA_CFLAGS = @AVX_128_FMA_CFLAGS@ +AVX_CFLAGS = @AVX_CFLAGS@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_PL_OPTS = @CHECK_PL_OPTS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +C_FFTW_R2R_KIND = @C_FFTW_R2R_KIND@ +C_MPI_FINT = @C_MPI_FINT@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLIBS = @FLIBS@ +GREP = @GREP@ +INDENT = @INDENT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCVI_CFLAGS = @KCVI_CFLAGS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBQUADMATH = @LIBQUADMATH@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPICC = @MPICC@ +MPILIBS = @MPILIBS@ +MPIRUN = @MPIRUN@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OCAMLBUILD = @OCAMLBUILD@ +OPENMP_CFLAGS = @OPENMP_CFLAGS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POW_LIB = @POW_LIB@ +PRECISION = @PRECISION@ +PREC_SUFFIX = @PREC_SUFFIX@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHARED_VERSION_INFO = @SHARED_VERSION_INFO@ +SHELL = @SHELL@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +STACK_ALIGN_CFLAGS = @STACK_ALIGN_CFLAGS@ +STRIP = @STRIP@ +THREADLIBS = @THREADLIBS@ +VERSION = @VERSION@ +VSX_CFLAGS = @VSX_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_F77 = @ac_ct_F77@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I $(top_srcdir) +bin_SCRIPTS = fftw-wisdom-to-conf +BUILT_SOURCES = fftw-wisdom-to-conf fftw@PREC_SUFFIX@-wisdom.1 +EXTRA_DIST = fftw-wisdom-to-conf.in +dist_man_MANS = fftw-wisdom-to-conf.1 fftw@PREC_SUFFIX@-wisdom.1 +EXTRA_MANS = fftw_wisdom.1.in +@OPENMP_TRUE@@THREADS_FALSE@fftw@PREC_SUFFIX@_wisdom_CFLAGS = $(OPENMP_CFLAGS) +@THREADS_TRUE@fftw@PREC_SUFFIX@_wisdom_CFLAGS = $(PTHREAD_CFLAGS) +@COMBINED_THREADS_FALSE@@THREADS_TRUE@LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_threads.la +@OPENMP_TRUE@@THREADS_FALSE@LIBFFTWTHREADS = $(top_builddir)/threads/libfftw3@PREC_SUFFIX@_omp.la +fftw@PREC_SUFFIX@_wisdom_SOURCES = fftw-wisdom.c +fftw@PREC_SUFFIX@_wisdom_LDADD = $(top_builddir)/tests/bench-bench.o \ +$(top_builddir)/tests/bench-fftw-bench.o $(LIBFFTWTHREADS) \ +$(top_builddir)/libfftw3@PREC_SUFFIX@.la \ +$(top_builddir)/libbench2/libbench2.a $(THREADLIBS) + +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tools/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu tools/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +fftw_wisdom.1: $(top_builddir)/config.status $(srcdir)/fftw_wisdom.1.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +fftw-wisdom-to-conf: $(top_builddir)/config.status $(srcdir)/fftw-wisdom-to-conf.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +fftw@PREC_SUFFIX@-wisdom$(EXEEXT): $(fftw@PREC_SUFFIX@_wisdom_OBJECTS) $(fftw@PREC_SUFFIX@_wisdom_DEPENDENCIES) $(EXTRA_fftw@PREC_SUFFIX@_wisdom_DEPENDENCIES) + @rm -f fftw@PREC_SUFFIX@-wisdom$(EXEEXT) + $(AM_V_CCLD)$(fftw@PREC_SUFFIX@_wisdom_LINK) $(fftw@PREC_SUFFIX@_wisdom_OBJECTS) $(fftw@PREC_SUFFIX@_wisdom_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.o: fftw-wisdom.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fftw@PREC_SUFFIX@_wisdom_CFLAGS) $(CFLAGS) -MT fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.o -MD -MP -MF $(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Tpo -c -o fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.o `test -f 'fftw-wisdom.c' || echo '$(srcdir)/'`fftw-wisdom.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Tpo $(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fftw-wisdom.c' object='fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fftw@PREC_SUFFIX@_wisdom_CFLAGS) $(CFLAGS) -c -o fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.o `test -f 'fftw-wisdom.c' || echo '$(srcdir)/'`fftw-wisdom.c + +fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.obj: fftw-wisdom.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fftw@PREC_SUFFIX@_wisdom_CFLAGS) $(CFLAGS) -MT fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.obj -MD -MP -MF $(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Tpo -c -o fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.obj `if test -f 'fftw-wisdom.c'; then $(CYGPATH_W) 'fftw-wisdom.c'; else $(CYGPATH_W) '$(srcdir)/fftw-wisdom.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Tpo $(DEPDIR)/fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fftw-wisdom.c' object='fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fftw@PREC_SUFFIX@_wisdom_CFLAGS) $(CFLAGS) -c -o fftw@PREC_SUFFIX@_wisdom-fftw-wisdom.obj `if test -f 'fftw-wisdom.c'; then $(CYGPATH_W) 'fftw-wisdom.c'; else $(CYGPATH_W) '$(srcdir)/fftw-wisdom.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: all check install install-am install-strip + +.PHONY: all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool cscopelist-am ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-binSCRIPTS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-binSCRIPTS uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + +fftw@PREC_SUFFIX@-wisdom.1: fftw_wisdom.1 + rm -f $@ + cp fftw_wisdom.1 $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw-wisdom-to-conf.1 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw-wisdom-to-conf.1 new file mode 100644 index 000000000..d5ecb795b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw-wisdom-to-conf.1 @@ -0,0 +1,91 @@ +.\" +.\" Copyright (c) 2003, 2007-14 Matteo Frigo +.\" Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +.\" +.TH FFTW-WISDOM-TO-CONF 1 "February, 2003" "fftw" "fftw" +.SH NAME +fftw\-wisdom\-to\-conf \- generate FFTW wisdom (pre-planned transforms) +.SH SYNOPSIS +\fBfftw\-wisdom\-to\-conf\fR [< \fIINPUT\fR] [> \fIOUTPUT\fR] +.SH DESCRIPTION +.PP +.\" Add any additional description here +.I fftw\-wisdom\-to\-conf +is a utility to generate C +.B configuration +routines from FFTW +.B wisdom +files, where the latter contain saved information about how to +optimally compute (Fourier) transforms of various sizes. A +configuration routine is a C subroutine that you link into your +program, replacing a routine of the same name in the FFTW library, +that determines which parts of FFTW are callable by your program. + +The reason to do this is that, if you only need transforms of a +limited set of sizes and types, and if you are statically linking your +program, then using a configuration file generated from wisdom for +those types can substantially reduce the size of your executable. +(Otherwise, because of FFTW's dynamic nature, all of FFTW's transform +code must be linked into any program using FFTW.) + +FFTW is a free library to compute discrete Fourier transforms in one +or more dimensions, for arbitrary sizes, and of both real and complex +data, among other related operations. More information on FFTW can be +found at the FFTW home page: +.I http://www.fftw.org + +.I fftw\-wisdom\-to\-conf +reads wisdom from standard input and writes the configuration to +standard output. It can easily be combined with the +.I fftw\-wisdom +tool, for example: + +fftw\-wisdom \-n \-o wisdom cof1024 cob1024 +.br +fftw\-wisdom\-to\-conf < wisdom > conf.c + +will create a configuration "conf.c" containing only those parts of +FFTW needed for the optimized complex forwards and backwards +out-of-place transforms of size 1024 (also saving the wisdom itself in +"wisdom"). + +Alternatively, you can run your actual program, export wisdom for all +plans that were created (ideally in FFTW_PATIENT or FFTW_EXHAUSTIVE +mode), use this as input for \fIfftw\-wisdom\-to\-conf\fR, +and then re-link your program with the resulting configuration routine. + +Note that the configuration routine does not contain the wisdom, only +the routines necessary to implement the wisdom, so your program should +also import the wisdom in order to benefit from the pre-optimized +plans. +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help on the command-line options and usage. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print the version number and copyright information. +.SH BUGS +Send bug reports to fftw@fftw.org. +.SH AUTHORS +Written by Steven G. Johnson and Matteo Frigo. + +Copyright (c) 2003, 2007-14 Matteo Frigo +.br +Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +.SH "SEE ALSO" +fftw-wisdom(1) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw-wisdom-to-conf.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw-wisdom-to-conf.in new file mode 100755 index 000000000..c4ccc6601 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw-wisdom-to-conf.in @@ -0,0 +1,82 @@ +#! /bin/sh + +if test "x$1" = "x--help" || test "x$1" = "x-h"; then + cat < OUTPUT] +Convert wisdom (stdin) to C configuration routine (stdout). + +Options: + -h, --help: print this help + -V, --version: print version/copyright info +EOF + exit 0 +fi + +if test "x$1" = "x--version" || test "x$1" = "x-V"; then + cat <&2 + exit 1 + ;; +esac + +cat < +#include +#include +#include "api/fftw3.h" +#include +#include + +#if defined(HAVE_THREADS) || defined(HAVE_OPENMP) +# define HAVE_SMP + extern int threads_ok; +#endif + +#define CONCAT(prefix, name) prefix ## name +#if defined(BENCHFFT_SINGLE) +#define FFTW(x) CONCAT(fftwf_, x) +#elif defined(BENCHFFT_LDOUBLE) +#define FFTW(x) CONCAT(fftwl_, x) +#elif defined(BENCHFFT_QUAD) +#define FFTW(x) CONCAT(fftwq_, x) +#else +#define FFTW(x) CONCAT(fftw_, x) +#endif + +/* from bench.c: */ +extern unsigned the_flags; +extern int usewisdom; +extern int nthreads; + +/* dummy routines to replace those in hook.c */ +void install_hook(void) {} +void uninstall_hook(void) {} + +int verbose; + +static void do_problem(bench_problem *p) +{ + if (verbose) + printf("Planning transform: %s\n", p->pstring); + /* BENCH_ASSERT(can_do(p)); */ + problem_alloc(p); + setup(p); + done(p); +} + +static void add_problem(const char *pstring, + bench_problem ***p, int *ip, int *np) +{ + if (*ip >= *np) { + *np = *np * 2 + 1; + *p = (bench_problem **) realloc(*p, sizeof(bench_problem *) * *np); + } + (*p)[(*ip)++] = problem_parse(pstring); +} + +static int sz(const bench_problem *p) +{ + return tensor_sz(p->sz) * tensor_sz(p->vecsz); +} + +static int prob_size_cmp(const void *p1_, const void *p2_) +{ + const bench_problem * const *p1 = (const bench_problem * const *) p1_; + const bench_problem * const *p2 = (const bench_problem * const *) p2_; + return (sz(*p1) - sz(*p2)); +} + +static struct my_option options[] = +{ + {"help", NOARG, 'h'}, + {"version", NOARG, 'V'}, + {"verbose", NOARG, 'v'}, + + {"canonical", NOARG, 'c'}, + {"time-limit", REQARG, 't'}, + + {"output-file", REQARG, 'o'}, + + {"impatient", NOARG, 'i'}, + {"measure", NOARG, 'm'}, + {"estimate", NOARG, 'e'}, + {"exhaustive", NOARG, 'x'}, + + {"no-system-wisdom", NOARG, 'n'}, + {"wisdom-file", REQARG, 'w'}, + +#ifdef HAVE_SMP + {"threads", REQARG, 'T'}, +#endif + + /* options to restrict configuration to rdft-only, etcetera? */ + + {0, NOARG, 0} +}; + +static void help(FILE *f, const char *program_name) +{ + fprintf( + f, + "Usage: %s [options] [sizes]\n" +" Create wisdom (pre-planned/optimized transforms) for specified sizes,\n" +" writing wisdom to stdout (or to a file, using -o).\n" + "\nOptions:\n" + " -h, --help: print this help\n" + " -V, --version: print version/copyright info\n" + " -v, --verbose: verbose output\n" + " -c, --canonical: plan/optimize canonical set of sizes\n" + " -t , --time-limit=: time limit in hours (default: 0, no limit)\n" + " -o FILE, --output-file=FILE: output to FILE instead of stdout\n" + " -m, --measure: plan in MEASURE mode (PATIENT is default)\n" + " -e, --estimate: plan in ESTIMATE mode (not recommended)\n" + " -x, --exhaustive: plan in EXHAUSTIVE mode (may be slow)\n" + " -n, --no-system-wisdom: don't read /etc/fftw/ system wisdom file\n" + " -w FILE, --wisdom-file=FILE: read wisdom from FILE (stdin if -)\n" +#ifdef HAVE_SMP + " -T N, --threads=N: plan with N threads\n" +#endif + "\nSize syntax: \n" + " = c/r/k for complex/real(r2c,c2r)/r2r\n" + " = i/o for in/out-of place\n" + " = f/b for forward/backward, omitted for k transforms\n" + " = [x[x...]], e.g. 10x12x14\n" + " -- for k transforms, after each dimension is a :\n" + " = f/b/h/e00/e01/e10/e11/o00/o01/o10/o11\n" + " for R2HC/HC2R/DHT/REDFT00/.../RODFT11\n" + , program_name); +} + +/* powers of two and ten up to 2^20, for now */ +static char canonical_sizes[][32] = { + "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", + "2048", "4096", "8192", "16384", "32768", "65536", "131072", + "262144", "524288", "1048576", + + "10", "100", "1000", "10000", "100000", "1000000", + + "2x2", "4x4", "8x8", "10x10", "16x16", "32x32", "64x64", "100x100", + "128x128", "256x256", "512x512", "1000x1000", "1024x1024", + + "2x2x2", "4x4x4", "8x8x8", "10x10x10", "16x16x16", "32x32x32", + "64x64x64", "100x100x100" +}; + +#define NELEM(array)(sizeof(array) / sizeof((array)[0])) + +int bench_main(int argc, char *argv[]) +{ + int c; + unsigned i; + int impatient = 0; + int system_wisdom = 1; + int canonical = 0; + double hours = 0; + FILE *output_file; + char *output_fname = 0; + bench_problem **problems = 0; + int nproblems = 0, iproblem = 0; + time_t begin; + + verbose = 0; + usewisdom = 0; + + bench_srand(1); +#ifdef HAVE_SMP + /* do not configure FFTW with threads, unless the + user requests -T */ + threads_ok = 0; +#endif + + while ((c = my_getopt(argc, argv, options)) != -1) { + switch (c) { + case 'h': + help(stdout, argv[0]); + exit(EXIT_SUCCESS); + break; + + case 'V': + printf("fftw-wisdom tool for FFTW version " VERSION ".\n"); + printf( +"\n" +"Copyright (c) 2003, 2007-14 Matteo Frigo\n" +"Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology\n" +"\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 2 of the License, or\n" +"(at your option) any later version.\n" +"\n" +"This program is distributed in the hope that it will be useful,\n" +"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +"GNU General Public License for more details.\n" +"\n" +"You should have received a copy of the GNU General Public License\n" +"along with this program; if not, write to the Free Software\n" +"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" + ); + exit(EXIT_SUCCESS); + break; + + case 'v': + verbose = 1; + break; + + case 'c': + canonical = 1; + break; + + case 't': + hours = atof(my_optarg); + break; + + case 'o': + if (output_fname) + bench_free(output_fname); + + if (!strcmp(my_optarg, "-")) + output_fname = 0; + else { + output_fname = (char *) bench_malloc(sizeof(char) * + (strlen(my_optarg) + 1)); + strcpy(output_fname, my_optarg); + } + break; + + case 'm': + case 'i': + impatient = 1; + break; + + case 'e': + the_flags |= FFTW_ESTIMATE; + break; + + case 'x': + the_flags |= FFTW_EXHAUSTIVE; + break; + + case 'n': + system_wisdom = 0; + break; + + case 'w': { + FILE *w = stdin; + if (strcmp(my_optarg, "-") && !(w = fopen(my_optarg, "r"))) { + fprintf(stderr, + "fftw-wisdom: error opening \"%s\": ", my_optarg); + perror(""); + exit(EXIT_FAILURE); + } + if (!FFTW(import_wisdom_from_file)(w)) { + fprintf(stderr, "fftw_wisdom: error reading wisdom " + "from \"%s\"\n", my_optarg); + exit(EXIT_FAILURE); + } + if (w != stdin) + fclose(w); + break; + } + +#ifdef HAVE_SMP + case 'T': + nthreads = atoi(my_optarg); + if (nthreads < 1) nthreads = 1; + threads_ok = 1; + BENCH_ASSERT(FFTW(init_threads)()); + break; +#endif + + case '?': + /* `my_getopt' already printed an error message. */ + cleanup(); + return EXIT_FAILURE; + + default: + abort (); + } + } + + if (!impatient) + the_flags |= FFTW_PATIENT; + + if (system_wisdom) + if (!FFTW(import_system_wisdom)() && verbose) + fprintf(stderr, "fftw-wisdom: system-wisdom import failed\n"); + + if (canonical) { + for (i = 0; i < NELEM(canonical_sizes); ++i) { + unsigned j; + char types[][8] = { + "cof", "cob", "cif", "cib", "rof", "rob", "rif", "rib" + }; + + for (j = 0; j < NELEM(types); ++j) { + char ps[64]; + if (!strchr(canonical_sizes[i],'x') + || !strchr(types[j],'o')) { +#ifdef HAVE_SNPRINTF + snprintf(ps, sizeof(ps), "%s%s", types[j], canonical_sizes[i]); +#else + sprintf(ps, "%s%s", types[j], canonical_sizes[i]); +#endif + add_problem(ps, &problems, &iproblem, &nproblems); + } + } + } + } + + while (my_optind < argc) { + if (!strcmp(argv[my_optind], "-")) { + char s[1025]; + while (1 == fscanf(stdin, "%1024s", s)) + add_problem(s, &problems, &iproblem, &nproblems); + } + else + add_problem(argv[my_optind], &problems, &iproblem, &nproblems); + ++my_optind; + } + + nproblems = iproblem; + qsort(problems, nproblems, sizeof(bench_problem *), prob_size_cmp); + + if (!output_fname) + output_file = stdout; + else + if (!(output_file = fopen(output_fname, "w"))) { + fprintf(stderr, + "fftw-wisdom: error creating \"%s\"", output_fname); + perror(""); + exit(EXIT_FAILURE); + } + + begin = time((time_t*)0); + for (iproblem = 0; iproblem < nproblems; ++iproblem) { + if (hours <= 0 + || hours > (time((time_t*)0) - begin) / 3600.0) + do_problem(problems[iproblem]); + problem_destroy(problems[iproblem]); + + } + free(problems); + + if (verbose && hours > 0 + && hours < (time((time_t*)0) - begin) / 3600.0) + fprintf(stderr, "EXCEEDED TIME LIMIT OF %g HOURS.\n", hours); + + FFTW(export_wisdom_to_file)(output_file); + if (output_file != stdout) + fclose(output_file); + if (output_fname) + bench_free(output_fname); + + cleanup(); + + return EXIT_SUCCESS; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw_wisdom.1.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw_wisdom.1.in new file mode 100644 index 000000000..b59380a5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftw_wisdom.1.in @@ -0,0 +1,196 @@ +.\" +.\" Copyright (c) 2003, 2007-14 Matteo Frigo +.\" Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +.\" +.TH FFTW-WISDOM 1 "February, 2003" "fftw" "fftw" +.SH NAME +fftw@PREC_SUFFIX@\-wisdom \- create wisdom (pre-optimized FFTs) +.SH SYNOPSIS +.B fftw@PREC_SUFFIX@\-wisdom +[\fIOPTION\fR]... [\fISIZE\fR]... +.SH DESCRIPTION +.PP +.\" Add any additional description here +.I fftw@PREC_SUFFIX@\-wisdom +is a utility to generate FFTW +.B wisdom +files, which contain saved information about how to optimally compute +(Fourier) transforms of various sizes. FFTW is a free library to +compute discrete Fourier transforms in one or more dimensions, for +arbitrary sizes, and of both real and complex data, among other +related operations. More information on FFTW can be found at the FFTW +home page: +.I http://www.fftw.org + +Programs using FFTW can be written to load wisdom from an arbitrary file, +string, or other source. Moreover, it is likely that many FFTW-using +programs will load the \fBsystem wisdom\fR file, which is stored in +.I /etc/fftw/wisdom@PREC_SUFFIX@ +by default. +.I fftw@PREC_SUFFIX@\-wisdom +can be used to create or add to such wisdom files. In its most +typical usage, the wisdom file can be created to pre-plan a canonical +set of sizes (see below) via: + +.ce +fftw@PREC_SUFFIX@\-wisdom \-v \-c \-o wisdom@PREC_SUFFIX@ + +(this will take many hours, which can be limited by the +.B \-t +option) and the output +.I wisdom@PREC_SUFFIX@ +file can then be copied (as root) to +.I /etc/fftw/ +or whatever. + +The +.I fftw@PREC_SUFFIX@\-wisdom +program normally writes the wisdom directly to standard output, but this +can be changed via the +.B \-o +option, as in the example above. + +If the system wisdom file +.I /etc/fftw/wisdom@PREC_SUFFIX@ +already exists, then +.I fftw@PREC_SUFFIX@\-wisdom +reads this existing wisdom (unless the +.B \-n +option is specified) and outputs both the old wisdom and any +newly created wisdom. In this way, it can be used to add new transform +sizes to the existing system wisdom (or other wisdom file, with the +.B \-w +option). +.SH SPECIFYING SIZES +Although a canonical set of sizes to optimize is specified by the +.B \-c +option, the user can also specify zero or more non-canonical transform +sizes and types to optimize, via the +.I SIZE +arguments following the option flags. Alternatively, the sizes to +optimize can be read from standard input (whitespace-separated), if a +.I SIZE +argument of "\-" is supplied. + +Sizes are specified by the syntax: + +.ce +<\fItype\fR><\fIinplace\fR><\fIdirection\fR><\fIgeometry\fR> + +<\fItype\fR> is either \'c\' (complex), \'r\' (real, r2c/c2r), or +\'k\' (r2r, per-dimension kinds, specified in the geometry, below). + +<\fIinplace\fR> is either \'i\' (in place) or \'o\' (out of place). + +<\fIdirection\fR> is either \'f\' (forward) or \'b\' (backward). The +<\fIdirection\fR> should be omitted for \'k\' transforms, where it is +specified via the geometry instead. + +<\fIgeometry\fR> is the size and dimensionality of the transform, +where different dimensions are separated by \'x\' (e.g. \'16x32\' for +a two-dimensional 16 by 32 transform). In the case of \'k\' +transforms, the size of each dimension is followed by a "type" string, +which can be one of f/b/h/e00/e01/e10/e11/o00/o01/o10/o11 for +R2HC/HC2R/DHT/REDFT00/.../RODFT11, respectively, as defined in the +FFTW manual. + +For example, \'cif12x13x14\' is a three-dimensional 12 by 13 x 14 +complex DFT operating in-place. \'rob65536\' is a one-dimensional +size-65536 out-of-place complex-to-real (backwards) transform +operating on Hermitian-symmetry input. \'ki10hx20e01\' is a +two-dimensional 10 by 20 r2r transform where the first dimension is a +DHT and the second dimension is an REDFT01 (DCT-III). + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help on the command-line options and usage. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print the version number and copyright information. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Verbose output. (You can specify this multiple times, or supply a numeric +argument greater than 1, to increase the verbosity level.) Note that the +verbose output will be mixed with the wisdom output (making it impossible +to import), unless you write the wisdom to a file via the +.B \-o +option. +.TP +\fB\-c\fR, \fB\-\-canonical\fR +Optimize/pre-plan a canonical set of sizes: all powers of two and ten +up to 2^20 (1048576), including both real and complex, forward and +backwards, in-place and out-of-place transforms. Also includes two- +and three-dimensional transforms of equal-size dimensions +(e.g. 16x16x16). +.TP +\fB\-t\fR \fIhours\fR, \fB\-\-time\-limit\fR=\fIhours\fR +Stop after a time of +.I hours +(hours) has elapsed, outputting accumulated wisdom. (The problems are planned +in increasing order of size.) Defaults to 0, indicating no time limit. +.TP +\fB\-o\fR \fIfile\fR, \fB\-\-output-file\fR=\fIfile\fR +Send wisdom output to +.I file +rather than to standard output (the default). +.TP +\fB\-m\fR, \fB\-\-measure\fR; \fB\-e\fR, \fB\-\-estimate\fR; \fB\-x\fR, \fB\-\-exhaustive\fR +Normally, +.I fftw@PREC_SUFFIX@\-wisdom +creates plans in FFTW_PATIENT mode, but with these options you can instead +use FFTW_MEASURE, FFTW_ESTIMATE, or FFTW_EXHAUSTIVE modes, respectively, +as described in more detail by the FFTW manual. + +Note that wisdom is tagged with the planning patience level, and a +single file can mix different levels of wisdom (e.g. you can mostly +use the patient default, but plan a few sizes that you especially care +about in +.B \-\-exhaustive +mode). +.TP +\fB\-n\fR, \fB\-\-no\-system\-wisdom\fR +Do not import the system wisdom from +.I /etc/fftw/wisdom@PREC_SUFFIX@ +(which is normally read by default). +.TP +\fB\-w\fR \fIfile\fR, \fB\-\-wisdom\-file\fR=\fIfile\fR +Import wisdom from +.I file +(in addition to the system wisdom, unless +.B \-n +is specified). Multiple wisdom files can be read via multiple +.B \-w +options. If +.I file +is "\-", then read wisdom from standard input. +.TP +\fB\-T\fR \fIN\fR, \fB\--threads\fR=\fIN\fR +Plan with +.I N +threads. This option is only present if FFTW was configured with +thread support. +.SH BUGS +Send bug reports to fftw@fftw.org. +.SH AUTHORS +Written by Steven G. Johnson and Matteo Frigo. + +Copyright (c) 2003, 2007-14 Matteo Frigo +.br +Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +.SH "SEE ALSO" +fftw-wisdom-to-conf(1) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftwf-wisdom.1 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftwf-wisdom.1 new file mode 100644 index 000000000..4ef055f3f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fftw/tools/fftwf-wisdom.1 @@ -0,0 +1,196 @@ +.\" +.\" Copyright (c) 2003, 2007-14 Matteo Frigo +.\" Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program; if not, write to the Free Software +.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +.\" +.TH FFTW-WISDOM 1 "February, 2003" "fftw" "fftw" +.SH NAME +fftwf\-wisdom \- create wisdom (pre-optimized FFTs) +.SH SYNOPSIS +.B fftwf\-wisdom +[\fIOPTION\fR]... [\fISIZE\fR]... +.SH DESCRIPTION +.PP +.\" Add any additional description here +.I fftwf\-wisdom +is a utility to generate FFTW +.B wisdom +files, which contain saved information about how to optimally compute +(Fourier) transforms of various sizes. FFTW is a free library to +compute discrete Fourier transforms in one or more dimensions, for +arbitrary sizes, and of both real and complex data, among other +related operations. More information on FFTW can be found at the FFTW +home page: +.I http://www.fftw.org + +Programs using FFTW can be written to load wisdom from an arbitrary file, +string, or other source. Moreover, it is likely that many FFTW-using +programs will load the \fBsystem wisdom\fR file, which is stored in +.I /etc/fftw/wisdomf +by default. +.I fftwf\-wisdom +can be used to create or add to such wisdom files. In its most +typical usage, the wisdom file can be created to pre-plan a canonical +set of sizes (see below) via: + +.ce +fftwf\-wisdom \-v \-c \-o wisdomf + +(this will take many hours, which can be limited by the +.B \-t +option) and the output +.I wisdomf +file can then be copied (as root) to +.I /etc/fftw/ +or whatever. + +The +.I fftwf\-wisdom +program normally writes the wisdom directly to standard output, but this +can be changed via the +.B \-o +option, as in the example above. + +If the system wisdom file +.I /etc/fftw/wisdomf +already exists, then +.I fftwf\-wisdom +reads this existing wisdom (unless the +.B \-n +option is specified) and outputs both the old wisdom and any +newly created wisdom. In this way, it can be used to add new transform +sizes to the existing system wisdom (or other wisdom file, with the +.B \-w +option). +.SH SPECIFYING SIZES +Although a canonical set of sizes to optimize is specified by the +.B \-c +option, the user can also specify zero or more non-canonical transform +sizes and types to optimize, via the +.I SIZE +arguments following the option flags. Alternatively, the sizes to +optimize can be read from standard input (whitespace-separated), if a +.I SIZE +argument of "\-" is supplied. + +Sizes are specified by the syntax: + +.ce +<\fItype\fR><\fIinplace\fR><\fIdirection\fR><\fIgeometry\fR> + +<\fItype\fR> is either \'c\' (complex), \'r\' (real, r2c/c2r), or +\'k\' (r2r, per-dimension kinds, specified in the geometry, below). + +<\fIinplace\fR> is either \'i\' (in place) or \'o\' (out of place). + +<\fIdirection\fR> is either \'f\' (forward) or \'b\' (backward). The +<\fIdirection\fR> should be omitted for \'k\' transforms, where it is +specified via the geometry instead. + +<\fIgeometry\fR> is the size and dimensionality of the transform, +where different dimensions are separated by \'x\' (e.g. \'16x32\' for +a two-dimensional 16 by 32 transform). In the case of \'k\' +transforms, the size of each dimension is followed by a "type" string, +which can be one of f/b/h/e00/e01/e10/e11/o00/o01/o10/o11 for +R2HC/HC2R/DHT/REDFT00/.../RODFT11, respectively, as defined in the +FFTW manual. + +For example, \'cif12x13x14\' is a three-dimensional 12 by 13 x 14 +complex DFT operating in-place. \'rob65536\' is a one-dimensional +size-65536 out-of-place complex-to-real (backwards) transform +operating on Hermitian-symmetry input. \'ki10hx20e01\' is a +two-dimensional 10 by 20 r2r transform where the first dimension is a +DHT and the second dimension is an REDFT01 (DCT-III). + +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +Display help on the command-line options and usage. +.TP +\fB\-V\fR, \fB\-\-version\fR +Print the version number and copyright information. +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Verbose output. (You can specify this multiple times, or supply a numeric +argument greater than 1, to increase the verbosity level.) Note that the +verbose output will be mixed with the wisdom output (making it impossible +to import), unless you write the wisdom to a file via the +.B \-o +option. +.TP +\fB\-c\fR, \fB\-\-canonical\fR +Optimize/pre-plan a canonical set of sizes: all powers of two and ten +up to 2^20 (1048576), including both real and complex, forward and +backwards, in-place and out-of-place transforms. Also includes two- +and three-dimensional transforms of equal-size dimensions +(e.g. 16x16x16). +.TP +\fB\-t\fR \fIhours\fR, \fB\-\-time\-limit\fR=\fIhours\fR +Stop after a time of +.I hours +(hours) has elapsed, outputting accumulated wisdom. (The problems are planned +in increasing order of size.) Defaults to 0, indicating no time limit. +.TP +\fB\-o\fR \fIfile\fR, \fB\-\-output-file\fR=\fIfile\fR +Send wisdom output to +.I file +rather than to standard output (the default). +.TP +\fB\-m\fR, \fB\-\-measure\fR; \fB\-e\fR, \fB\-\-estimate\fR; \fB\-x\fR, \fB\-\-exhaustive\fR +Normally, +.I fftwf\-wisdom +creates plans in FFTW_PATIENT mode, but with these options you can instead +use FFTW_MEASURE, FFTW_ESTIMATE, or FFTW_EXHAUSTIVE modes, respectively, +as described in more detail by the FFTW manual. + +Note that wisdom is tagged with the planning patience level, and a +single file can mix different levels of wisdom (e.g. you can mostly +use the patient default, but plan a few sizes that you especially care +about in +.B \-\-exhaustive +mode). +.TP +\fB\-n\fR, \fB\-\-no\-system\-wisdom\fR +Do not import the system wisdom from +.I /etc/fftw/wisdomf +(which is normally read by default). +.TP +\fB\-w\fR \fIfile\fR, \fB\-\-wisdom\-file\fR=\fIfile\fR +Import wisdom from +.I file +(in addition to the system wisdom, unless +.B \-n +is specified). Multiple wisdom files can be read via multiple +.B \-w +options. If +.I file +is "\-", then read wisdom from standard input. +.TP +\fB\-T\fR \fIN\fR, \fB\--threads\fR=\fIN\fR +Plan with +.I N +threads. This option is only present if FFTW was configured with +thread support. +.SH BUGS +Send bug reports to fftw@fftw.org. +.SH AUTHORS +Written by Steven G. Johnson and Matteo Frigo. + +Copyright (c) 2003, 2007-14 Matteo Frigo +.br +Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +.SH "SEE ALSO" +fftw-wisdom-to-conf(1) diff --git a/sorc/hafs_tools.fd/libsrc/src/fson/.dep.inc b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/.dep.inc similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/fson/.dep.inc rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/.dep.inc diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/Makefile new file mode 100644 index 000000000..c331f491b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/Makefile @@ -0,0 +1,66 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = fson_string_m.f90 \ + fson_value_m.f90 \ + fson_path_m.f90 \ + fson.f90 + +# Object files + +OBJ_FILES = ${FSRC_FILES:.f90=.o} + +# Libraries + +LIB = libfson.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f90 .o +.f90.o: + $(FC) $(FCFLAGS) -g -convert big_endian -mcmodel=large -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/fson/fson.f90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson.f90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/fson/fson.f90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson.f90 diff --git a/sorc/hafs_tools.fd/libsrc/src/fson/fson_path_m.f90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson_path_m.f90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/fson/fson_path_m.f90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson_path_m.f90 diff --git a/sorc/hafs_tools.fd/libsrc/src/fson/fson_string_m.f90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson_string_m.f90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/fson/fson_string_m.f90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson_string_m.f90 diff --git a/sorc/hafs_tools.fd/libsrc/src/fson/fson_value_m.f90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson_value_m.f90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/fson/fson_value_m.f90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/fson/fson_value_m.f90 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/Makefile new file mode 100644 index 000000000..63208259a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/Makefile @@ -0,0 +1,67 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = noaa_routines.f +F90SRC_FILES = gridprojs_interface.F90 + +# Object files + +OBJ_FILES = ${FSRC_FILES:.f=.o} \ + $(F90SRC_FILES:.F90=.o) + +# Libraries + +LIB = libgridprojs.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f .F90 .o +.f.o: + $(FC) $(FCFLAGS) $(DEBUG) -c $< +.F90.o: + $(FC) $(FCFLAGS) $(DEBUG) -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/gridprojs/README b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/README similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/gridprojs/README rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/README diff --git a/sorc/hafs_tools.fd/libsrc/src/gridprojs/gridprojs_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/gridprojs_interface.F90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/gridprojs/gridprojs_interface.F90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/gridprojs_interface.F90 diff --git a/sorc/hafs_tools.fd/libsrc/src/gridprojs/noaa_routines.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/noaa_routines.f similarity index 99% rename from sorc/hafs_tools.fd/libsrc/src/gridprojs/noaa_routines.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/noaa_routines.f index 30049ecc0..824a49df4 100755 --- a/sorc/hafs_tools.fd/libsrc/src/gridprojs/noaa_routines.f +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridprojs/noaa_routines.f @@ -210,7 +210,7 @@ SUBROUTINE MOVECT(FLAT,FLON,TLAT,TLON,CROT,SROT) ! COMPUTE COSINE OF THE RADIAL DISTANCE BETWEEN THE POINTS. CTLAT=COS(TLAT/DPR) STLAT=SIN(TLAT/DPR) -C FLAT=COS(FLAT/DPR) + CFLAT=COS(FLAT/DPR) SFLAT=SIN(FLAT/DPR) CDLON=COS((FLON-TLON)/DPR) SDLON=SIN((FLON-TLON)/DPR) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/Makefile new file mode 100644 index 000000000..554bf53c2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/Makefile @@ -0,0 +1,68 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = +F90SRC_FILES = gridtrans_interface.F90 \ + gridtrans_fv3_interface.F90 + +# Object files + +OBJ_FILES = ${FSRC_FILES:.f=.o} \ + $(F90SRC_FILES:.F90=.o) + +# Libraries + +LIB = libgridtrans.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f .F90 .o +.f.o: + $(FC) $(FCFLAGS) $(DEBUG) -c $< +.F90.o: + $(FC) $(FCFLAGS) $(DEBUG) -c $< diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/README b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/README new file mode 100644 index 000000000..558f05d1b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/README @@ -0,0 +1,26 @@ +::: GRIDTRANS ::: + +The gridprojs library is a FORTRAN library containing various tools to +define and perform coordinate transforms. + +::: COMPILING ::: + +Move to source code directory: + +> cd gridtrans + +To compile, do: + +> make + +To install, do: + +> make install + +::: LICENSE ::: + +GNU GPL + +::: SUPPORT ::: + +Send email to Henry R. Winterbottom (henry.winterbottom@noaa.gov). \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/gridtrans_fv3_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/gridtrans_fv3_interface.F90 new file mode 100644 index 000000000..e945a22ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/gridtrans_fv3_interface.F90 @@ -0,0 +1,808 @@ +module gridtrans_fv3_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! gridtrans :: gridtrans_fv3_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use gridtrans_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: fv3_gridtrans_anlgrid + public :: fv3_gridtrans_cleanup + public :: fv3_gridtrans_rotate + public :: fv3_gridtrans_setup + public :: fv3_windrotate_compute + + ! Define local variables + + real(gridtrans_realkind), parameter :: half = 0.5_gridtrans_realkind + real(gridtrans_realkind), parameter :: one = 1.0_gridtrans_realkind + real(gridtrans_realkind), parameter :: pi = acos(-1.0) + real(gridtrans_realkind), parameter :: quarter = 0.25_gridtrans_realkind + real(gridtrans_realkind), parameter :: deg2rad = pi/180.0 + real(gridtrans_realkind), parameter :: rad2deg = 1.0/deg2rad + real(gridtrans_realkind), parameter :: sq180 = 180._gridtrans_realkind**2 + real(gridtrans_realkind), parameter :: two = 2.0_gridtrans_realkind + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_gridtrans_anlgrid.f90 + + ! DESCRIPTION: + + ! This subroutine computes a rotated latitude- and longitude + ! analysis grid centered on the respective Cubed-Sphere Finite + ! Volume (FV3) tile and completely covering the tile. + + ! INPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable + ! containing (at minimum) the FV3 tile corner latitude and + ! longitude (latt and lont, respectively) values. + + ! OUTPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable now + ! containing the rotated latitude- and longitude analysis grid + ! values (lat_out and lon_out, respectively) centered on the + ! respective FV3 tile. + + !----------------------------------------------------------------------- + + subroutine fv3_gridtrans_anlgrid(fv3_gridtrans) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: fv3_gridtrans + + ! Define variables computed within routine + + real(gridtrans_realkind), dimension(:,:), allocatable :: xc + real(gridtrans_realkind), dimension(:,:), allocatable :: yc + real(gridtrans_realkind), dimension(:,:), allocatable :: zc + real(gridtrans_realkind) :: rnorm + real(gridtrans_realkind) :: xcent + real(gridtrans_realkind) :: ycent + real(gridtrans_realkind) :: zcent + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(xc)) & + & allocate(xc(fv3_gridtrans%nx,fv3_gridtrans%ny)) + if(.not. allocated(yc)) & + & allocate(yc(fv3_gridtrans%nx,fv3_gridtrans%ny)) + if(.not. allocated(zc)) & + & allocate(zc(fv3_gridtrans%nx,fv3_gridtrans%ny)) + + ! Loop through local variable + + do j = 1, fv3_gridtrans%ny + + ! Loop through local variable + + do i = 1, fv3_gridtrans%nx + + ! Compute local variables + + xc(i,j) = cos(fv3_gridtrans%latt(i,j)*deg2rad)* & + & cos(fv3_gridtrans%lont(i,j)*deg2rad) + yc(i,j) = cos(fv3_gridtrans%latt(i,j)*deg2rad)* & + & sin(fv3_gridtrans%lont(i,j)*deg2rad) + zc(i,j) = sin(fv3_gridtrans%latt(i,j)*deg2rad) + + end do ! do i = 1, fv3_gridtrans%nx + + end do ! do j = 1, fv3_gridtrans%ny + + ! Compute local variables + + xcent = quarter*(xc(1,1) + xc(1,fv3_gridtrans%ny) + & + & xc(fv3_gridtrans%nx,1) + xc(fv3_gridtrans%nx, & + & fv3_gridtrans%ny)) + ycent = quarter*(yc(1,1) + yc(1,fv3_gridtrans%ny) + & + & yc(fv3_gridtrans%nx,1) + yc(fv3_gridtrans%nx, & + & fv3_gridtrans%ny)) + zcent = quarter*(zc(1,1) + zc(1,fv3_gridtrans%ny) + & + & zc(fv3_gridtrans%nx,1) + zc(fv3_gridtrans%nx, & + & fv3_gridtrans%ny)) + rnorm = one/sqrt(xcent*xcent + ycent*ycent + & + & zcent*zcent) + xcent = rnorm*xcent + ycent = rnorm*ycent + zcent = rnorm*zcent + fv3_gridtrans%lat_cen = asin(zcent)*rad2deg + fv3_gridtrans%lon_cen = atan2(ycent,xcent)*rad2deg + + ! Define local variables + + fv3_gridtrans%lat_in = reshape(fv3_gridtrans%latt, & + & shape(fv3_gridtrans%lat_in)) + fv3_gridtrans%lon_in = reshape(fv3_gridtrans%lont, & + & shape(fv3_gridtrans%lon_in)) + + ! Compute local variables + + call fv3_gridtrans_rotate(fv3_gridtrans) + call fv3_gridtrans_grid(fv3_gridtrans) + call fv3_gridtrans_unrotate(fv3_gridtrans) + + ! Deallocate memory for local variables + + if(allocated(xc)) deallocate(xc) + if(allocated(yc)) deallocate(yc) + if(allocated(zc)) deallocate(zc) + + !===================================================================== + + end subroutine fv3_gridtrans_anlgrid + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_gridtrans_cleanup.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! fv3_gridtrans_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3_gridtrans_struct variable. + + !----------------------------------------------------------------------- + + subroutine fv3_gridtrans_cleanup(grid) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%latt)) deallocate(grid%latt) + if(allocated(grid%lat_in)) deallocate(grid%lat_in) + if(allocated(grid%lat_out)) deallocate(grid%lat_out) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%lont)) deallocate(grid%lont) + if(allocated(grid%lon_in)) deallocate(grid%lon_in) + if(allocated(grid%lon_out)) deallocate(grid%lon_out) + + !===================================================================== + + end subroutine fv3_gridtrans_cleanup + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_gridtrans_grid.f90 + + ! DESCRIPTION: + + ! This subroutine computes the grid to be used for all coordinate + ! transforms. + + ! INPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable + ! containing (at minimum) the rotated latitude and longitude + ! coordinate values (lat_out and lon_out, respectively). + + ! OUTPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable + ! containing the grid to be applied for all coordinate transforms + ! (see lat_in and lon_in, respectively). + + !----------------------------------------------------------------------- + + subroutine fv3_gridtrans_grid(fv3_gridtrans) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: fv3_gridtrans + + ! Define variables computed within routine + + real(gridtrans_realkind), dimension(:,:), allocatable :: lats + real(gridtrans_realkind), dimension(:,:), allocatable :: lons + real(gridtrans_realkind) :: alat + real(gridtrans_realkind) :: alon + real(gridtrans_realkind) :: adlat + real(gridtrans_realkind) :: adlon + real(gridtrans_realkind) :: clat + real(gridtrans_realkind) :: clon + real(gridtrans_realkind) :: dlat + real(gridtrans_realkind) :: dlon + integer(gridtrans_intkind) :: nlath + integer(gridtrans_intkind) :: nlonh + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + dlat = (maxval(fv3_gridtrans%lat_out) - & + & minval(fv3_gridtrans%lat_out))/(fv3_gridtrans%ny - 1) + dlon = (maxval(fv3_gridtrans%lon_out) - & + & minval(fv3_gridtrans%lon_out))/(fv3_gridtrans%nx - 1) + adlat = dlat*fv3_gridtrans%grid_ratio + adlon = dlon*fv3_gridtrans%grid_ratio + nlath = fv3_gridtrans%ny/2 + nlonh = fv3_gridtrans%nx/2 + + ! Check local variable and proceed accordingly + + if((nlonh*2) .eq. fv3_gridtrans%nx) then + + ! Define local variables + + clon = (adlon/two) + + else ! if((nlonh*2) .eq. fv3_gridtrans%nx) + + ! Define local variables + + clon = adlon + + end if ! if((nlonh*2) .eq. fv3_gridtrans%nx) + + ! Check local variable and proceed accordingly + + if((nlath*2) .eq. fv3_gridtrans%ny) then + + ! Define local variables + + clat = (adlat/two) + + else ! if((nlath*2) .eq. fv3_gridtrans%ny) + + ! Define local variables + + clat = adlat + + end if ! if((nlath*2) .eq. fv3_gridtrans%ny) + + ! Allocate memory for local variables + + if(.not. allocated(lats)) & + & allocate(lats(fv3_gridtrans%nx,fv3_gridtrans%ny)) + if(.not. allocated(lons)) & + & allocate(lons(fv3_gridtrans%nx,fv3_gridtrans%ny)) + + ! Loop through local variable + + do j = 1, fv3_gridtrans%ny + + ! Loop through local variable + + do i = 1, fv3_gridtrans%nx + + ! Compute local variables + + lats(i,j) = (j - nlath)*adlat - clat + lons(i,j) = (i - nlonh)*adlon - clon + + end do ! do i = 1, fv3_gridtrans%nx + + end do ! do j = 1, fv3_gridtrans%ny + + ! Define local variables + + fv3_gridtrans%lat_in = reshape(lats,shape(fv3_gridtrans%lat_in)) + fv3_gridtrans%lon_in = reshape(lons,shape(fv3_gridtrans%lon_in)) + + ! Deallocate memory for local variables + + if(allocated(lats)) deallocate(lats) + if(allocated(lons)) deallocate(lons) + + !===================================================================== + + end subroutine fv3_gridtrans_grid + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_gridtrans_rotate.f90 + + ! DESCRIPTION: + + ! This subroutine rotates a right-handed spherical coordinate grid + ! to a new right-handed spherical coordinate grid as follows: + + ! 1. Define a x-, y-, and z-coordinate system with an origin at the + ! center of the sphere from the input latitude and longitude + ! attributes. + + ! 2. Rotate the (x,y,z) coordinate system about the z-axis by amount + ! cen_lon (see fv3_gridtrans_struct); define a new coordinate + ! system (xt,yt,zt). + + ! 3. Rotate the (xt,yt,zt) coordinate system about the yt-axis by + ! amount cen_lat (see fv3_gridtrans_struct); define a new + ! coordinate system (xtt,ytt,ztt). + + ! 4. Compute the output latitude and longitude coordinates from the + ! (xtt,ytt,ztt) coordinate system. + + ! INPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable + ! containing (at minimum) the input latitude and longitude arrays + ! (lat_in and lon_in, respectively) and the grid central latitude + ! and longitude coordinate pair (lat_cen and lon_cen, + ! respectively). + + ! OUTPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable now + ! containing the rotated coordinate system latitude and longitude + ! values (lat_out and lon_out, respectively.) + + !----------------------------------------------------------------------- + + subroutine fv3_gridtrans_rotate(fv3_gridtrans) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: fv3_gridtrans + + ! Define variables computed within routine + + real(gridtrans_realkind) :: x + real(gridtrans_realkind) :: xt + real(gridtrans_realkind) :: xtt + real(gridtrans_realkind) :: y + real(gridtrans_realkind) :: yt + real(gridtrans_realkind) :: ytt + real(gridtrans_realkind) :: z + real(gridtrans_realkind) :: zt + real(gridtrans_realkind) :: ztt + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, fv3_gridtrans%ncoords + + ! Compute local variables + + x = cos(fv3_gridtrans%lat_in(i)*deg2rad)* & + & cos(fv3_gridtrans%lon_in(i)*deg2rad) + y = cos(fv3_gridtrans%lat_in(i)*deg2rad)* & + & sin(fv3_gridtrans%lon_in(i)*deg2rad) + z = sin(fv3_gridtrans%lat_in(i)*deg2rad) + xt = x*cos(fv3_gridtrans%lon_cen*deg2rad) + & + & y*sin(fv3_gridtrans%lon_cen*deg2rad) + yt = -x*sin(fv3_gridtrans%lon_cen*deg2rad) + & + & y*cos(fv3_gridtrans%lon_cen*deg2rad) + zt = z + xtt = xt*cos(fv3_gridtrans%lat_cen*deg2rad) + & + & zt*sin(fv3_gridtrans%lat_cen*deg2rad) + ytt = yt + ztt = -xt*sin(fv3_gridtrans%lat_cen*deg2rad) + & + & zt*cos(fv3_gridtrans%lat_cen*deg2rad) + + ! Define local variables + + fv3_gridtrans%lat_out(i) = asin(ztt)*rad2deg + fv3_gridtrans%lon_out(i) = atan2(ytt,xtt)*rad2deg + + end do ! do i = 1, fv3_gridtrans%ncoords + + !===================================================================== + + end subroutine fv3_gridtrans_rotate + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_gridtrans_setup.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! fv3_gridtrans_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3_gridtrans_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN fv3_gridtrans_struct variable where all arrays + ! are allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine fv3_gridtrans_setup(grid) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%lat)) & + & allocate(grid%lat((grid%nx+1),(grid%ny+1))) + if(.not. allocated(grid%latt)) & + & allocate(grid%latt(grid%nx,grid%ny)) + if(.not. allocated(grid%lat_in)) & + & allocate(grid%lat_in(grid%ncoords)) + if(.not. allocated(grid%lat_out)) & + & allocate(grid%lat_out(grid%ncoords)) + if(.not. allocated(grid%lon)) & + & allocate(grid%lon((grid%nx+1),(grid%ny+1))) + if(.not. allocated(grid%lont)) & + & allocate(grid%lont(grid%nx,grid%ny)) + if(.not. allocated(grid%lon_in)) & + & allocate(grid%lon_in(grid%ncoords)) + if(.not. allocated(grid%lon_out)) & + & allocate(grid%lon_out(grid%ncoords)) + + !===================================================================== + + end subroutine fv3_gridtrans_setup + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_gridtrans_unrotate.f90 + + ! DESCRIPTION: + + ! This subroutine rotates a right-handed spherical coordinate grid + ! to a new right-handed spherical coordinate grid as follows: + + ! 1. Rotate the (xtt,ytt,ztt) coordinate system about the -axis by + ! amount cen_lat (see fv3_gridtrans_struct); define a new + ! coordinate system (xt,yt,zt). + + ! 2. Rotate the (xtt,ytt,ztt) coordinate system about the ytt-axis + ! by amount cen_lon (see fv3_gridtrans_struct); define a new + ! coordinate system (xt,yt,zt). + + ! 3. Define a x-, y-, and z-coordinate system with an origin at the + ! center of the sphere from the (xt,yt,zt) coordinate system. + + ! INPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable now + ! containing the rotated coordinate system latitude and longitude + ! values (lat_out and lon_out, respectively.) + + ! OUTPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable + ! containing (at minimum) the input latitude and longitude arrays + ! (lat_in and lon_in, respectively) and the grid central latitude + ! and longitude coordinate pair (lat_cen and lon_cen, + ! respectively). + + !----------------------------------------------------------------------- + + subroutine fv3_gridtrans_unrotate(fv3_gridtrans) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: fv3_gridtrans + + ! Define variables computed within routine + + real(gridtrans_realkind) :: x + real(gridtrans_realkind) :: xt + real(gridtrans_realkind) :: xtt + real(gridtrans_realkind) :: y + real(gridtrans_realkind) :: yt + real(gridtrans_realkind) :: ytt + real(gridtrans_realkind) :: z + real(gridtrans_realkind) :: zt + real(gridtrans_realkind) :: ztt + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, fv3_gridtrans%ncoords + + ! Compute local variables + + xtt = cos(fv3_gridtrans%lat_out(i)*deg2rad)* & + & cos(fv3_gridtrans%lon_out(i)*deg2rad) + ytt = cos(fv3_gridtrans%lat_out(i)*deg2rad)* & + & sin(fv3_gridtrans%lon_out(i)*deg2rad) + ztt = sin(fv3_gridtrans%lat_out(i)*deg2rad) + xt = xtt*cos(fv3_gridtrans%lat_cen*deg2rad) - ztt* & + & sin(fv3_gridtrans%lat_cen*deg2rad) + yt = ytt + zt = xtt*sin(fv3_gridtrans%lat_cen*deg2rad) + ztt* & + & cos(fv3_gridtrans%lat_cen*deg2rad) + x = xt*cos(fv3_gridtrans%lon_cen*deg2rad) - & + & yt*sin(fv3_gridtrans%lon_cen*deg2rad) + y = xt*sin(fv3_gridtrans%lon_cen*deg2rad) + & + & yt*cos(fv3_gridtrans%lon_cen*deg2rad) + z = zt + + ! Define local variables + + fv3_gridtrans%lat_in(i) = asin(z)*rad2deg + fv3_gridtrans%lon_in(i) = atan2(y,x)*rad2deg + 360.0 + + end do ! do i = 1, fv3_gridtrans%ncoords + + !===================================================================== + + end subroutine fv3_gridtrans_unrotate + + !======================================================================= + + ! SUBROUTINE: + + ! fv_windrotate_compute.f90 + + ! DESCRIPTION: + + ! This subroutine computes the coordinate transform values required + ! to remap wind vector values from model space to Earth-relative + ! (e.g., observation) space. + + ! INPUT VARIABLES: + + ! * fv3_gridtrans; a FORTRAN fv3_gridtrans_struct variable + ! containing (at minimum) the rotated coordinate system latitude + ! and longitude values. + + ! * windrotate; a FORTRAN windrotate_struct variable. + + ! OUTPUT VARIABLES: + + ! * windrotate; a FORTRAN windrotate_struct variable now containing + ! the coordinate transform variables required to rotate FV3 vector + ! winds from a model space projection to a Earth-relative (e.g., + ! observation) space. + + !----------------------------------------------------------------------- + + subroutine fv3_windrotate_compute(fv3_gridtrans,windrotate) + + ! Define variables passed to routine + + type(fv3_gridtrans_struct) :: fv3_gridtrans + type(windrotate_struct) :: windrotate + + ! Define variables computed within routine + + real(gridtrans_realkind), dimension(:,:), allocatable :: xc + real(gridtrans_realkind), dimension(:,:), allocatable :: yc + real(gridtrans_realkind), dimension(:,:), allocatable :: zc + real(gridtrans_realkind) :: diff + real(gridtrans_realkind) :: ewval + real(gridtrans_realkind) :: nsval + real(gridtrans_realkind) :: rlat + real(gridtrans_realkind) :: rlon + real(gridtrans_realkind) :: uval + real(gridtrans_realkind) :: vval + real(gridtrans_realkind) :: xr + real(gridtrans_realkind) :: yr + real(gridtrans_realkind) :: zr + real(gridtrans_realkind) :: xu + real(gridtrans_realkind) :: yu + real(gridtrans_realkind) :: zu + real(gridtrans_realkind) :: xv + real(gridtrans_realkind) :: yv + real(gridtrans_realkind) :: zv + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(xc)) & + & allocate(xc((fv3_gridtrans%nx + 1),(fv3_gridtrans%ny + 1))) + if(.not. allocated(yc)) & + & allocate(yc((fv3_gridtrans%nx + 1),(fv3_gridtrans%ny + 1))) + if(.not. allocated(zc)) & + & allocate(zc((fv3_gridtrans%nx + 1),(fv3_gridtrans%ny + 1))) + + ! Loop through local variable + + do j = 1, (fv3_gridtrans%ny + 1) + + ! Loop through local variable + + do i = 1, (fv3_gridtrans%nx + 1) + + ! Compute local variables + + xc(i,j) = cos(fv3_gridtrans%lat(i,j)*deg2rad)* & + & cos(fv3_gridtrans%lon(i,j)*deg2rad) + yc(i,j) = cos(fv3_gridtrans%lat(i,j)*deg2rad)* & + & sin(fv3_gridtrans%lon(i,j)*deg2rad) + zc(i,j) = sin(fv3_gridtrans%lat(i,j)*deg2rad) + + end do ! do i = 1, (fv3_gridtrans%nx + 1) + + end do ! do j = 1, (fv3_gridtrans%ny + 1) + + ! Loop through local variable + + do j = 1, (fv3_gridtrans%ny + 1) + + ! Loop through local variable + + do i = 1, fv3_gridtrans%nx + + ! Compute local variables + + rlat = half*(fv3_gridtrans%lat(i,j) + fv3_gridtrans%lat(i+1,j)) + diff = (fv3_gridtrans%lon(i,j) - fv3_gridtrans%lon(i+1,j))**2 + + ! Check local variable and proceed accordingly + + if(diff .lt. sq180) then + + ! Compute local variables + + rlon = half*(fv3_gridtrans%lon(i,j) + & + & fv3_gridtrans%lon(i+1,j)) + + else ! if(diff .lt. sq180) + + ! Compute local variables + + rlon = half*(fv3_gridtrans%lon(i,j) + & + & fv3_gridtrans%lon(i+1,j) - 360._gridtrans_realkind) + + end if ! if(diff .lt. sq180) + + ! Compute local variables + + xr = cos(rlat*deg2rad)*cos(rlon*deg2rad) + yr = cos(rlat*deg2rad)*sin(rlon*deg2rad) + zr = sin(rlat*deg2rad) + xu = xc(i+1,j) - xc(i,j) + yu = yc(i+1,j) - yc(i,j) + zu = zc(i+1,j) - zc(i,j) + uval = sqrt((xu**2 + yu**2 + zu**2)) + ewval = sqrt((xr**2 + yr**2)) + nsval = sqrt((xr*zr)**2 + (zr*yr)**2 + (xr*xr + & + & yr*yr)**2) + windrotate%cangu(i,j) = (-yr*xu + xr*yu)/ewval/uval + windrotate%sangu(i,j) = (-xr*zr*xu - zr*yr*yu + (xr*xr + & + & yr*yr)*zu)/nsval/uval + + end do ! do i = 1, fv3_gridtrans%nx + + end do ! do j = 1, (fv3_gridtrans%ny + 1) + + ! Loop through local variable + + do j = 1, fv3_gridtrans%ny + + ! Loop through local variable + + do i = 1, (fv3_gridtrans%nx + 1) + + ! Compute local variables + + rlat = half*(fv3_gridtrans%lat(i,j) + fv3_gridtrans%lat(i,j+1)) + diff = (fv3_gridtrans%lon(i,j) - fv3_gridtrans%lon(i,j+1))**2 + + ! Check local variable and proceed accordingly + + if(diff .lt. sq180) then + + ! Compute local variables + + rlon = half*(fv3_gridtrans%lon(i,j) + & + & fv3_gridtrans%lon(i,j+1)) + + else ! if(diff .lt. sq180) + + ! Compute local variables + + rlon = half*(fv3_gridtrans%lon(i,j) + & + & fv3_gridtrans%lon(i,j+1) - 360._gridtrans_realkind) + + end if ! if(diff .lt. sq180) + + ! Compute local variables + + xr = cos(rlat*deg2rad)*cos(rlon*deg2rad) + yr = cos(rlat*deg2rad)*sin(rlon*deg2rad) + zr = sin(rlat*deg2rad) + xv = xc(i,j+1) - xc(i,j) + yv = yc(i,j+1) - yc(i,j) + zv = zc(i,j+1) - zc(i,j) + vval = sqrt((xv**2 + yv**2 + zv**2)) + ewval = sqrt((xr**2 + yr**2)) + nsval = sqrt((xr*zr)**2 + (zr*yr)**2 + (xr*xr + & + & yr*yr)**2) + windrotate%cangv(i,j) = (-yr*xv + xr*yv)/ewval/vval + windrotate%sangv(i,j) = (-xr*zr*xv - zr*yr*yv + (xr*xr + & + & yr*yr)*zv)/nsval/vval + + end do ! do i = 1, (fv3_gridtrans%nx + 1) + + end do ! do j = 1, fv3_gridtrans%ny + + ! Deallocate memory for local variables + + if(allocated(xc)) deallocate(xc) + if(allocated(yc)) deallocate(yc) + if(allocated(zc)) deallocate(zc) + + !===================================================================== + + end subroutine fv3_windrotate_compute + + !======================================================================= + +end module gridtrans_fv3_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/gridtrans_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/gridtrans_interface.F90 new file mode 100644 index 000000000..d509e6937 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/gridtrans/gridtrans_interface.F90 @@ -0,0 +1,179 @@ +module gridtrans_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! gridtrans :: gridtrans_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: fv3_gridtrans_struct + public :: gridtrans_intkind + public :: gridtrans_realkind + public :: gridtrans_spval + public :: windrotate_cleanup + public :: windrotate_setup + public :: windrotate_struct + + ! Define local variables + + integer, parameter :: gridtrans_intkind = 4 + integer, parameter :: gridtrans_realkind = 4 + type windrotate_struct + real(gridtrans_realkind), dimension(:,:), allocatable :: cang + real(gridtrans_realkind), dimension(:,:), allocatable :: cangu + real(gridtrans_realkind), dimension(:,:), allocatable :: cangv + real(gridtrans_realkind), dimension(:,:), allocatable :: sang + real(gridtrans_realkind), dimension(:,:), allocatable :: sangu + real(gridtrans_realkind), dimension(:,:), allocatable :: sangv + integer(gridtrans_intkind) :: ncoords + integer(gridtrans_intkind) :: nx + integer(gridtrans_intkind) :: ny + end type windrotate_struct ! type windrotate_struct + type fv3_gridtrans_struct + real(gridtrans_realkind), dimension(:,:), allocatable :: lat + real(gridtrans_realkind), dimension(:,:), allocatable :: latt + real(gridtrans_realkind), dimension(:,:), allocatable :: lon + real(gridtrans_realkind), dimension(:,:), allocatable :: lont + real(gridtrans_realkind), dimension(:), allocatable :: lat_in + real(gridtrans_realkind), dimension(:), allocatable :: lat_out + real(gridtrans_realkind), dimension(:), allocatable :: lon_in + real(gridtrans_realkind), dimension(:), allocatable :: lon_out + real(gridtrans_realkind) :: grid_ratio + real(gridtrans_realkind) :: lat_cen + real(gridtrans_realkind) :: lon_cen + integer(gridtrans_intkind) :: ncoords + integer(gridtrans_intkind) :: nx + integer(gridtrans_intkind) :: ny + end type fv3_gridtrans_struct ! type fv3_gridtrans_struct + real(gridtrans_realkind), parameter :: gridtrans_spval = huge(1.0) + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! windrotate_cleanup.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! windrotate_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN windrotate_struct variable. + + !----------------------------------------------------------------------- + + subroutine windrotate_cleanup(grid) + + ! Define variables passed to routine + + type(windrotate_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%cang)) deallocate(grid%cang) + if(allocated(grid%cangu)) deallocate(grid%cangu) + if(allocated(grid%cangv)) deallocate(grid%cangv) + if(allocated(grid%sang)) deallocate(grid%sang) + if(allocated(grid%sangu)) deallocate(grid%sangu) + if(allocated(grid%sangv)) deallocate(grid%sangv) + + !===================================================================== + + end subroutine windrotate_cleanup + + !======================================================================= + + ! SUBROUTINE: + + ! windrotate_setup.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! windrotate_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN windrotate_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN windrotate_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine windrotate_setup(grid) + + ! Define variables passed to routine + + type(windrotate_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%cang)) & + & allocate(grid%cang(grid%nx,grid%ny)) + if(.not. allocated(grid%cangu)) & + & allocate(grid%cangu(grid%nx,(grid%ny+1))) + if(.not. allocated(grid%cangv)) & + & allocate(grid%cangv((grid%nx+1),grid%ny)) + if(.not. allocated(grid%sang)) & + & allocate(grid%sang(grid%nx,grid%ny)) + if(.not. allocated(grid%sangu)) & + & allocate(grid%sangu(grid%nx,(grid%ny+1))) + if(.not. allocated(grid%sangv)) & + & allocate(grid%sangv((grid%nx+1),grid%ny)) + + ! Define local variables + + grid%cang = gridtrans_spval + grid%cangu = gridtrans_spval + grid%cangv = gridtrans_spval + grid%sang = gridtrans_spval + grid%sangu = gridtrans_spval + grid%sangv = gridtrans_spval + + !===================================================================== + + end subroutine windrotate_setup + + !======================================================================= + +end module gridtrans_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/kdtree/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/kdtree/Makefile new file mode 100644 index 000000000..146379f5c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/kdtree/Makefile @@ -0,0 +1,63 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = kdtree2.F90 + +# Object files + +OBJ_FILES = ${FSRC_FILES:.F90=.o} + +# Libraries + +LIB = libkdtree.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .F90 .o +.F90.o: + $(FC) $(FCFLAGS) -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/kdtree/kdtree2.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/kdtree/kdtree2.F90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/kdtree/kdtree2.F90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/kdtree/kdtree2.F90 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hg_archival.txt b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hg_archival.txt new file mode 100644 index 000000000..69ac875fe --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hg_archival.txt @@ -0,0 +1,6 @@ +repo: 7dc4bcf0e54c474966036f5a799f68907688f5c6 +node: 9bf419592328d05af2f3cf039a8775c68c18a943 +branch: default +latesttag: v3.3 +latesttagdistance: 4 +changessincelatesttag: 4 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hgignore b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hgignore new file mode 100644 index 000000000..8f2127646 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hgignore @@ -0,0 +1,17 @@ +# use glob syntax. +syntax: glob +*.o +*.a +*~ +*.orig +o_* +poltor* +SHT/*spat.c +SHT/*fly.c +SHT/*omp.c +doc/* + +# switch to regexp syntax. +syntax: regexp +SHT/.*SH[eoqst]*.c + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hgtags b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hgtags new file mode 100644 index 000000000..ac20f7585 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/.hgtags @@ -0,0 +1,47 @@ +9bd78da09caa3e6b418d46b241642ec018d109cb ScalarSH +91ed9208ba81a72091aee17d04d2967a5805b502 NSok +409461a5b17200620f2af66bcd2f55375ccda452 SHTns +cd4b5bd7e8c5e07317064126bc62f9f49a016404 DCT-AUTO +90aaf3014549edeff12820a668ab429bb22b2126 STATIC +c408c48bab6675db9df5896518f0869f7e41db96 RUNTIME +c4015723f30c1f812f3369d9ddbc70735a48c043 DCT-ACCURATE +c3a854bba13df1d9fbc4dd66d3d056be312c631f libshtns +af861c6544c3f79eb313f219d416f87c7140a433 SSE +4c8e4fcbebf22bcb3d8d4d7dc313b4e6d48c7962 3Comp +cd333c2415e6735ef58ca6d8f9632775360ca873 CeCILL +724789b57631d8e6e14d8b9ab98e0df8c73bdc9e v1.0 +7423c02fc0d9ca6a62f1cd2ddcb235c1f674fb34 FLY +e850081af084b65814969c7595cfd64c83bffea7 v1.5 +94767b9347ac197933b43673a924dac12c7b3de9 TEST_SUITE_PASS +8acabcf1359680989b5811a5caa2fbef7105acbe AVX +cf8ea30c9cf7754867364c953efe020c24b4e054 v2.0 +996c35d6d9b6a4bb2dd6ea19e33b0dbfca249dc5 v2.1 +4836e858255dab0bce842004380c1c9a9e5c0da5 OpenMP +42de20b5977eefa1daaf8b413f70edd3140ea884 v2.2 +cba2a69fc3d40650654a4db819bf8e0b21e52415 v2.2.1 +4288b2a3f42076eb60544436913bea36edc10a5c v2.2.2 +10a5321dfd591871b60306a01700c6cdca83d767 v2.2.3 +3a9ad8f5d5a38a1faf24b609dc9f150ef0a7cf61 v2.2.4 +f644af3cfd94fb553e1747cfc035b99f4331cbdb v2.3 +7adf1dd4c68b210159cd3d46518d4e77698e402a v2.3.1 +25efece41cc725f00468304c4ff58c85dd06f317 v2.4 +f8eddd9b727c69c737f587e658cec876053cddb1 v2.4.1 +5a82d1b2344f41cbe291331ca60d1aaa8c787d5c v2.5 +69503f2e349f91622a14d2af44da5472733eaa79 v2.6 +b624522fcae86053e79a8a20aaa59faf634ae70b v2.6.1 +dca1cae60ff964ccb0a3f1468d675e72b72b11da v2.6.2 +de911cdff8e3252d105d79847abb356538820833 v2.6.3 +bfb08729da414dd4fe871cf307801a4a4649f557 v2.6.4 +c77a0029fd022a6ba1a7578432a942d81ba8a90b v2.6.5 +cd1c07197df75c4e00808c600e9ba34669643b8d v2.6.6 +67b0f95357e4a9a2b72fdf4b3dc33b1263b40099 v2.7 +a143c4eb09c75af7583a92ef46ec97bda531d6e9 v2.8 +33d15f9e42bb653f441e9939a10d2668999b5a35 v2.8.1 +c6b247877becd1fd87624c6c7ca7c31d2478031d v2.9 +982548ecc262fdce22fcaafeae96ce4cdbf09aa4 v3.0 +2ef1c427f624731b3cc5b19cf1fe2e26c5a4470a v3.0.1 +80894664d451e96c82c431b94fbc9a2902714a3f v3.1 +d0ab4963af46e28b5f3823b4e1c750defd5c0695 v3.2 +99e42361017f301804c29b9c81d6a1c0678cc46b v3.2.1 +f5d8fcd73eeb3bca519e7d59c00cd161ebac6c39 v3.2.2 +c2135b5bdb1c51de73f22976d4556457630d055c v3.3 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/COPYRIGHT b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/COPYRIGHT new file mode 100644 index 000000000..04d0387e3 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/COPYRIGHT @@ -0,0 +1,14 @@ +Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. +written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + +nathanael.schaeffer@univ-grenoble-alpes.fr + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can use, +modify and/or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/LICENSE b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/LICENSE new file mode 100644 index 000000000..e7c9f8993 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/LICENSE @@ -0,0 +1,519 @@ + + CeCILL FREE SOFTWARE LICENSE AGREEMENT + +Version 2.1 dated 2013-06-21 + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to users, + * secondly, the election of a governing law, French law, with which it + is conformant, both as regards the law of torts and intellectual + property law, and the protection that it offers to both authors and + holders of the economic rights over software. + +The authors of the CeCILL (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'énergie atomique et aux énergies alternatives - CEA, a +public scientific, technical and industrial research establishment, +having its principal place of business at 25 rue Leblanc, immeuble Le +Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +Inria, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and redistribute the software governed by this +license within the framework of an open source distribution model. + +The exercising of this right is conditional upon certain obligations for +users so as to preserve this status for all subsequent redistributions. + +In consideration of access to the source code and the rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software as regards their requirements in conditions +enabling the security of their systems and/or data to be ensured and, +more generally, to use and operate it in the same conditions of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + +Frequently asked questions can be found on the official website of the +CeCILL licenses family (http://www.cecill.info/index.en.html) for any +necessary clarification. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Contribution: means any or all modifications, corrections, translations, +adaptations and/or new functions integrated into the Software by any or +all Contributors, as well as any or all Internal Modules. + +Module: means a set of sources files including their documentation that +enables supplementary functions or services in addition to those offered +by the Software. + +External Module: means any or all Modules, not derived from the +Software, so that this Module and the Software run in separate address +spaces, with one calling the other when they are run. + +Internal Module: means any or all Module, connected to the Software so +that they both execute in the same address space. + +GNU GPL: means the GNU General Public License version 2 or any +subsequent version, as published by the Free Software Foundation Inc. + +GNU Affero GPL: means the GNU Affero General Public License version 3 or +any subsequent version, as published by the Free Software Foundation Inc. + +EUPL: means the European Union Public License version 1.1 or any +subsequent version, as published by the European Commission. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 <#scope> hereinafter for the whole +term of the protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical medium; + * (ii) the first time the Licensee exercises any of the rights granted + hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +<#accepting> hereinabove, and the Licensee hereby acknowledges that it +has read and understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1 <#accepting>. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or all + medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission or + storage operation as regards the Software, that it is entitled to + carry out hereunder. + + + 5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. + +The Licensee is authorized to make any or all Contributions to the +Software provided that it includes an explicit notice that it is the +author of said Contribution and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's warranty + and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows effective access to the full Source +Code of the Software for a period of at least three years from the +distribution of the Software, it being understood that the additional +acquisition cost of the Source Code shall not exceed the cost of the +data transfer. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and +conditions for the distribution of the resulting Modified Software +become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's warranty + and liability as set forth in Articles 8 and 9, + +and, in the event that only the object code of the Modified Software is +redistributed, + + 3. a note stating the conditions of effective access to the full source + code of the Modified Software for a period of at least three years + from the distribution of the Modified Software, it being understood + that the additional acquisition cost of the source code shall not + exceed the cost of the data transfer. + + + 5.3.3 DISTRIBUTION OF EXTERNAL MODULES + +When the Licensee has developed an External Module, the terms and +conditions of this Agreement do not apply to said External Module, that +may be distributed under a separate license agreement. + + + 5.3.4 COMPATIBILITY WITH OTHER LICENSES + +The Licensee can include a code that is subject to the provisions of one +of the versions of the GNU GPL, GNU Affero GPL and/or EUPL in the +Modified or unmodified Software, and distribute that entire code under +the terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL. + +The Licensee can include the Modified or unmodified Software in a code +that is subject to the provisions of one of the versions of the GNU GPL, +GNU Affero GPL and/or EUPL and distribute that entire code under the +terms of the same version of the GNU GPL, GNU Affero GPL and/or EUPL. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2 <#term>. + + + 6.2 OVER THE CONTRIBUTIONS + +The Licensee who develops a Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE EXTERNAL MODULES + +The Licensee who develops an External Module is the owner of the +intellectual property rights over this External Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution. + + + 6.4 JOINT PROVISIONS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies of + the Software modified or not. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights on the Software of the Holder and/or +Contributors, and to take, where applicable, vis-à-vis its staff, any +and all measures required to ensure respect of said intellectual +property rights of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5 <#scope>). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 <#good-faith> and, in particular, +without any warranty as to its commercial value, its secured, safe, +innovative or relevant nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +expertise for its defense. Such technical and legal expertise shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version, subject to the provisions of Article 5.3.4 +<#compatibility>. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/Makefile.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/Makefile.in new file mode 100644 index 000000000..5b628b9d6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/Makefile.in @@ -0,0 +1,130 @@ +## path prefix for make install (installs to $(PREFIX)/lib and $(PREFIX)/include) +PREFIX=@prefix@ +SED=@SED@ +CC=@CC@ +CFLAGS=@CFLAGS@ @LDFLAGS@ +LIBS=@LIBS@ +PYTHON=@PYTHON@ + + +## global options for gcc +## there should be -ffast-math or at least -fcx-limited-range to produce fast code. +go= $(CFLAGS) -D_GNU_SOURCE + + +# compiler command with options for the sht codelets +shtcc = $(CC) $(go) @shtcc_flags@ +# compiler command with options for other source (initialization, ...) +cc = $(CC) $(go) -O2 +fc = @FC@ $(go) -O2 + +hfiles = sht_private.h sht_config.h shtns.h +objs = sht_init.o sht_kernels_a.o @objs@ +libname = @libname@ + +default : @target@ + +install : @install@ + +@libname@ : Makefile $(objs) + ar rcs @libname@ $(objs) + @echo " " + @cat COPYRIGHT + @echo " " + @echo "**** link with : @LDFLAGS@ @LIBS@" + +install-lib : $(libname) + @mkdir -p $(PREFIX)/lib/ + @mkdir -p $(PREFIX)/include/ + cp $(libname) $(PREFIX)/lib/$(libname) + cp shtns.h $(PREFIX)/include/ + cp shtns_cuda.h $(PREFIX)/include/ + cp shtns.f shtns.f03 $(PREFIX)/include/ + @echo " " + @cat COPYRIGHT + @echo " " + @echo "**** link with : -L$(PREFIX)/lib @LDFLAGS@ @LIBS@" + +# codelets : +SHT/SH_to_spat.c : SHT/hyb_SH_to_spat.gen.c + $(MAKE) SH_to_spat.c -C SHT SED=$(SED) +SHT/spat_to_SH.c : SHT/hyb_spat_to_SH.gen.c + $(MAKE) spat_to_SH.c -C SHT SED=$(SED) +SHT/SH_to_spat_fly.c : SHT/fly_SH_to_spat.gen.c + $(MAKE) SH_to_spat_fly.c -C SHT SFX=fly SED=$(SED) +SHT/spat_to_SH_fly.c : SHT/fly_spat_to_SH.gen.c + $(MAKE) spat_to_SH_fly.c -C SHT SFX=fly SED=$(SED) +SHT/SH_to_spat_omp.c : SHT/omp_SH_to_spat.gen.c + $(MAKE) SH_to_spat_omp.c -C SHT SFX=omp SED=$(SED) +SHT/spat_to_SH_omp.c : SHT/omp_spat_to_SH.gen.c + $(MAKE) spat_to_SH_omp.c -C SHT SFX=omp SED=$(SED) +SHT/spat_to_SH_kernel.c : SHT/kernel_spat_to_SH.gen.c + $(MAKE) spat_to_SH_kernel.c -C SHT SFX=kernel SED=$(SED) + +# objects : +sht_init.o : sht_init.c Makefile sht_legendre.c sht_func.c sht_com.c $(hfiles) + $(cc) -c $< -o $@ + +sht_mem.o : sht_mem.c Makefile $(hfiles) SHT/SH_to_spat.c SHT/spat_to_SH.c + $(shtcc) -c $< -o $@ +sht_fly.o : sht_fly.c Makefile $(hfiles) SHT/SH_to_spat_fly.c SHT/spat_to_SH_fly.c + $(shtcc) -c $< -o $@ +sht_omp.o : sht_omp.c Makefile $(hfiles) SHT/SH_to_spat_omp.c SHT/spat_to_SH_omp.c + $(shtcc) -c $< -o $@ +sht_kernels_a.o : sht_kernels_a.c Makefile $(hfiles) SHT/spat_to_SH_kernel.c + $(shtcc) -c $< -o $@ +sht_gpu.o : sht_gpu.cu sht_gpu_kernels.cu Makefile $(hfiles) + nvcc -c sht_gpu.cu -lineinfo -Xptxas=-v @nvcc_flags@ + +# programs & Examples +time_SHT : time_SHT.c $(libname) shtns.h + $(cc) time_SHT.c -I. ./$(libname) $(LIBS) -o time_SHT + +test_rot : examples/test_rot.c $(libname) shtns.h + $(cc) examples/test_rot.c -I. ./$(libname) $(LIBS) -o test_rot + +SHT_example : examples/SHT_example.c $(libname) shtns.h + $(cc) examples/SHT_example.c -I. ./$(libname) $(LIBS) -o SHT_example + +SHT_fort_ex : examples/SHT_example.f $(libname) shtns.f + $(fc) -L$(PREFIX)/lib -I$(PREFIX)/include -I. -fdefault-real-8 examples/SHT_example.f ./$(libname) $(LIBS) -lc -o SHT_fort_ex +SHT_f90_ex : examples/SHT_example.f90 $(libname) shtns.f03 + $(fc) -L$(PREFIX)/lib -I$(PREFIX)/include -I. -fdefault-real-8 examples/SHT_example.f90 ./$(libname) $(LIBS) -lc -o SHT_f90_ex + +wigner : examples/wigner.c $(libname) shtns.h + $(cc) examples/wigner.c -I. ./$(libname) $(LIBS) -o wigner + +#documentation : +docs : + ( cat doc/doxygen.conf ; echo "PROJECT_NUMBER=@PACKAGE_VERSION@" ) | doxygen - + +clean : + $(MAKE) clean -C SHT + rm -f *.o *.a + rm -rf doc/html + rm -rf doc/latex + rm -rf build + + +# build a python interface using SWIG. +# use it with "from shtns import *" in a python program/shell +_shtns.so : shtns_numpy_wrap.c Makefile $(hfiles) $(objs) + CC="$(CC)" $(PYTHON) setup.py build + @echo "*****************************************************************************************" + @echo "*** Now, for system wide install, run 'make install' as root. *" + @echo "*** Otherwise run '$(PYTHON) setup.py install --user' to install for current user only. *" + @echo "*****************************************************************************************" + +# generate python and c glue code with SWIG. +shtns_numpy_wrap.c : shtns_numpy.i sht_private.h shtns.h + swig -python shtns_numpy.i + +install-py : _shtns.so + $(PYTHON) setup.py install + +.PHONY : install install-py install-lib clean docs + + +#fftw compiling options : +#-O3 -fomit-frame-pointer -fstrict-aliasing -ffast-math -fno-schedule-insns -fno-web -fno-loop-optimize --param inline-unit-growth=1000 --param large-function-growth=1000 + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/README.md b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/README.md new file mode 100644 index 000000000..3b8127652 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/README.md @@ -0,0 +1,279 @@ +**SHTns is a high performance library for Spherical Harmonic Transform written in C, +aimed at numerical simulation (fluid flows, mhd, ...) in spherical geometries.** + +Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. +written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). +SHTns is distributed under the open source [CeCILL License](http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html) +(GPL compatible) located in the LICENSE file. + +FEATURES: +--------- + +- **blazingly fast**. +- both **scalar and vector transforms**. +- backward and forward (synthesis and analysis) functions. +- flexible truncation (degree, order, azimuthal periodicity). +- spatial data can be stored in latitude-major or longitude-major arrays. +- various conventions (normalization and Condon-Shortley phase). +- can be used from **Fortran, c/c++, Python, and Java** programs. +- highly efficient Gauss algorithm working with Gauss nodes (based on + Gauss-Legendre quadrature). +- support for **regular grids** (but they require twice the number of nodes than Gauss grid) +- support for SSE2, SSE3, **AVX, AVX2, AVX-512** vectorization, as well as + Xeon Phi (KNL) and AltiVec VSX. +- **parallel transforms with OpenMP**. +- *Beta*: automatic **GPU off-loading** with nvidia cuda (Kepler, Pascal & Volta). +- synthesis (inverse transform) at any coordinate (not constrained to a grid). +- **on-the-fly transforms** : saving memory and bandwidth, they are even faster + on modern architectures. +- accurate up to spherical harmonic degree l=16383 (at least). +- **rotation** functions to rotate spherical harmonics. +- special spectral operator functions that do not require a transform + (multiply by cos(theta)...). +- transforms and rotations for complex-valued spatial fields. +- SHT at fixed m (without fft, aka Legendre transform - beta). + + +INSTALL: +-------- + +Briefly, the shell commands `./configure; make; make install` should +configure, build, and install this package. `./configure --help` will +list available options (among which `--enable-openmp` and `--enable-python`). +However, in order to get the best performance, it is highly recommended to +compile and install the FFTW library yourself, because many distributions +include a non-optimized FFTW library. + +DOCUMENTATION: +-------------- + +- On-line doc is available: +- You can build it locally: Run `make docs` to generate documentation + (requires doxygen). + Then browse the html documentation starting with `doc/html/index.html` +- A related research paper has been published: + [Efficient Spherical Harmonic Transforms aimed at pseudo-spectral numerical simulations](http://dx.doi.org/10.1002/ggge.20071), + also [available from arXiv](http://arxiv.org/abs/1202.6522). +- If you use SHTns for research work, please **cite this paper**: + + @article {shtns, + author = {Schaeffer, Nathanael}, + title = {Efficient spherical harmonic transforms aimed at pseudospectral numerical simulations}, + journal = {Geochemistry, Geophysics, Geosystems}, + doi = {10.1002/ggge.20071}, volume = {14}, number = {3}, pages = {751--758}, + year = {2013}, + } + +CHANGE LOG: +----------- + +* v3.3.1 (25 Sep 2019) + - Different name for openmp and non-openmp version of shtns library for KNL. + +* v3.3 (26 Aug 2019) + - Faster (especially for analysis or for small sizes). + - New Fortran 2003 interface (thanks to T. Gastine). + - Small fixes and code cleanup. + +* v3.2.2 (6 Jun 2019) + - Ishioka's reccurence can now be used with all normalizations. Will likely become the default soon. + - Fix: allow single-m Legendre transforms with `--enable-magic-layout`. + +* v3.2.1 (5 Apr 2019) + - Fix important bugs introduced in v3.2. + - Use of Ishioka recurrence is no more the default, but can be activated with `--enable-ishioka`. + - Support for Volta GPU, with better detection of CUDA libraries. + +* v3.2 (8 Mar 2019) + - New rotation functions, including the generation of Wigner-d matrices (thanks to Alex J. Yuffa). + - New recurrence formula of Ishioka (2018) leading to faster transforms, especially for large sizes. + see https://doi.org/10.2151/jmsj.2018-019 + - Easier configuration, with better detection of intel MKL. + +* v3.1 (11 Oct 2018) + - Removed Robert formulation functions. Use `shtns_robert_form()` instead. + - Optimized transforms for complex-valued spatial fields, including efficient parallelization. + - Remove support for IBM Blue Gene/Q (QPX instructions). + - Bug fixes (thanks to Martin Schreiber). + - Buggy legacy 'mem' algorithms are disabled by default. + +* v3.0.1 (25 Jun 2018) + - fix typo preventing compilation of AVX512 code-path. + - improved configure script to avoid some compilation issues. + +* v3.0 (28 Feb 2018) + - support for nvidia Kepler & Pascal GPU with `--enable-cuda` (including automatic offload). + - Java JNI wrapper (beta, see `shtns_jni` folder -- thanks to Julien Pierret). + +* v2.9 (11 Nov 2017) + - New `shtns_malloc()` and `shtns_free()` functions to allocate/free optimally + aligned memory. + - New functions supporting complex-valued vector transforms and Robert formulation. + - Support for AVX-512 (intel KNL). + - Support for VSX (IBM Power7 & Power 8). + - Improved support for MagIC code. + - Remove support for intel MIC (KNC). + +* v2.8.1 (2 Oct 2017) + - Fixed-m Legendre transforms (without fft) support magic-layout. + - Fix bug in `mul_ct_matrix()` introduced in v2.7. + +* v2.8 (10 Jul 2017) + - Regular grids are back and improved (on-the-fly + exact quadrature weights). + - Merge with shtns-magic, providing optional support for the MagIC code + with --enable-magic-layout (thanks to Bertrand Putigny). + +* v2.7 (24 Feb 2017) + - Faster vector transforms: up to 2 times faster. + - Optimized pseudo-spectral rotation functions: 4 to 6 times faster (single thread). + - Improvements in complex spatial data support (flexible truncation + rotations). + - DCT-based transforms on regular grids have been removed. + +* v2.6.6 (6 Jul 2016) + - Improved `SH_to_lat()` function, now also included in the Python interface. + - Regular grid and DCT-based transform are deprecated and disabled by + default (enable with --enable-dct). + - Fortran example: fixes segfault and compilation issues. + - configure script now accepts `FC=` to specify Fortran compiler. + +* v2.6.5 (24 Aug 2015) + - critical bugfix (multiple transforms of different lmax failed sometimes) [issue #20]. + - faster DCT initialization when using multiple threads. + +* v2.6.4 (25 Jul 2015) + - a critical bugfix (segfault of fixed-m tranforms when mmax=0). + - fixed-m Legendre transforms added to Fortran API. + +* v2.6.3 (9 Mar 2015) + - better default compilation flags for icc. + - complex transforms added to Fortran API (thanks to Bertrand Putigny) + +* v2.6.2 (30 Dec 2014) + - fix regression: Schmidt normalized analysis failed since v2.6 in some cases. + +* v2.6.1 (17 Dec 2014) + - new functions in python interface to control console output. + - fix: `spat_cplx_to_SH()` and `SH_to_spat_cplx()` were missing + a (-1)^m for m<0 [issue #16]. + - fix: segfault in `spat_to_SH_ml()` [issue #15]. + - fix a few compilation issues. + +* v2.6 (24 Oct 2014) + - support for IBM Blue Gene/Q (QPX) with [bgclang](http://trac.alcf.anl.gov/projects/llvm-bgq). + Configure with `./configure --enable-many-core CC=bgclang` + - new beta feature: SHT at fixed m (aka Legendre transform). + - faster initialization with OpenMP. + - fix: in python, a rare coredump now correctly raises an exception. + - fix: a few compilation problems. + +* v2.5 (13 Mar 2014) + - new experimental support for Intel Xeon Phi (MIC) in native mode, + with contributions from Vincent Boulos (Bull). For good performance + icc 14 is required. Configure with `./configure --enable-mic CC=icc` + - fftw3.h included for easier compilation. + - fix: obey `OMP_NUM_THREADS` environement variable + - fix: failure of fly analysis with some special (rare) sizes. + - add missing `shtns_print_cfg()` to Fortran interface + - new save/restore plan feature for bit-level reproducibility + +* v2.4.1 (18 Sep 2013) + - performance improvement: analysis with `SHT_PHI_CONTIGUOUS` is now + on par with synthesis (or better), even for large transforms. + +* v2.4 (5 Aug 2013) + - new scalar transforms for complex spatial fields: `SH_to_spat_cplx()` + and `spat_cplx_to_SH()`. + - new `shtns_verbose()` function to control output during initialization. + - better MKL support (including multi-thread). Warning: MKL's FFTW + interface is not thread safe, SHTns can't be called from multiple + threads if compiled with MKL. + - fix compatibility with c++ std::complex. + - new shallow water simulation example in examples/ + +* v2.3.1 (10 Apr 2013) + - OpenMP library is now installed as `libshtns_omp.a`. + - fix detection of OpenMP mutlithreaded FFTW. + - new configure option `--enable-mkl` to use the FFT of the MKL + library instead of FFTW (lower performance expected). + - `time_SHT` can be compiled on MacOSX and uses less memory. + - new `SH_to_lat()` function. + - a few other minor improvements and fixes. + +* v2.3 (3 Oct 2012) + - added `mi` member in `shtns_info` structure (ABI change). + - added function to access the Gauss nodes. + - added support for special operators in spectral space (multiplication + by cos(theta) and sin(theta).d/dtheta for instance). + - shtns.h is now compatible with C++. + - better python interface for rotations. + - performance improvement for OpenMP code without `fftw3_omp`. + - slightly faster `SH_to_point()` [5%] and `SHqst_to_point()` [20%]. + - bugfix: in some rare cases, OpenMP code freed unallocated memory. + - bugfix: fixed python interface compilation with clang. + +* v2.2.4 (25 Jun 2012) + - the previous critical bugfix had not been applied to parallel OpenMP + transforms. + +* v2.2.3 (24 Jun 2012) + - critical bugfix: `SHtor_to_spat()` and `SHsph_to_spat()` gave wrong results + for mmax>0 with on-the-fly transforms. + - minor bugfix in Python interface. + +* v2.2.2 (21 Jun 2012) + - better Python interface: using `synth()` and `analys()` methods. + - bugfix in build system: can now compile python extension without openmp. + +* v2.2.1 (21 May 2012) + - slightly faster parallel transforms. + - better Python interface: decent error handling and keyword argument support. + - changes to Python interface: grid defaults to `SHT_PHI_CONTIGUOUS`, + `set_grid_auto()` removed. + - bugfix: default compilation with FFTW 3.0 to avoid "bad Gauss points" error. + - bugfix: correct alignement of gauss weights in 32 bit systems to avoid + segfaults. + - new ./configure script for easier configuration and compilation. + +* v2.2 (23 Apr 2012) + - parallel transforms with OpenMP (for Gauss grid, significant benefit + for l>=127). + +* v2.1 (8 Mar 2012) + - support for huge spherical harmonic degree (tested up to l>43600). + - speed improvements, especially for large transforms. + - compilation with FFTW v3.0 or more is now possible through a + configuration option (see `sht_config.h`) + +* v2.0 (9 Feb 2012) + - support for AVX instruction set (almost x2 speed-up on Sandy-Bridge + processors). + - allow multiple transforms with different sizes, normalizations and + grids (C interface only). + - changes to C interface : most functions now require a handle to identify + the transform. (Fortran interface unchanged) + - transforms are accurate up to spherical harmonic degree l=2700 (at least). + - lots of small improvements, speed-ups and a few bug fixes. + - requires FFTW v3.3. + - better Python interface using NumPy arrays (beta). + - rotation functions to rotate spherical harmonics (beta). + +* v1.5 (4 May 2011) + - on-the-fly transforms which do not require huge matrices : save memory + and bandwidth, and can be faster on some architecture. + - runtime selection of fastest algorithm, including on-the-fly transforms. + - transforms are accurate up to spherical harmonic degree l=2045 (at least). + - fix a bug that lead to wrong results for `SHtor_to_spat` and `SHsph_to_spat`. + - a bunch of minor improvements, optimizations and fixes. + +* v1.0 (9 June 2010) + - initial release for C/C++ and Fortran under CeCILL licence (GPL compatible). + - scalar and vector, forward and backward transforms. + - support several normalization conventions. + - transforms are accurate up to spherical harmonic degree l=1300 (at least). + - flexible truncation and spatial sizes. + - support spatial data stored in latitude-major or longitude-major arrays. + - regular grid (with DCT acceleration) or Gauss grid (highly optimized). + - SSE2 vectorization. + - synthesis at any coordinate (not constrained to grid). + - can choose the optimal spatial size for a given spectral truncation. + - requires FFTW 3.0. diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/Makefile new file mode 100644 index 000000000..ba7154254 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/Makefile @@ -0,0 +1,97 @@ +# this Makefile generates C code for similar SHT functions, +# from one generic code + tags (reduced code maintenance). + +SFX= + +#default sed program +SED=sed + +#first char : V,Q,S,T +# Spheroidal and Toroidal (V,S,T) +vect=-e "/^[3Q\#]/d" -e "s/^[VST]X*//" +# Spheroidal component only (V,S) +sph=-e "/^[3QT\#]/d" -e "s/^[VS]X*//" +# Toroidal component only (V,T) +tor=-e "/^[3QS\#]/d" -e "s/^[VT]X*//" +# Scalar component (Q) +scal=-e "/^[3VST\#]/d" -e "s/^QX*//" +# 3D Vector component (VQST3) but not exclusive (.X) lines. +v3d=-e "/^[\#]/d" -e "/^.X/d" -e "s/^[QVST3]//" + +# second char : 1BEO +# even (1,E) +ev=-e "s/^\(.\)[1E]/\1/" -e "/^.[BO]/d" +# odd (1,O) +od=-e "s/^\(.\)[1O]/\1/" -e "/^.[BE]/d" +# both (B,E,O) +eo=-e "s/^\(.\)[EOB]/\1/" -e "/^.1/d" + +# second char : 3 components or solo. + + +ifeq ($(strip $(SFX)),) + GSH=hyb_SH_to_spat.gen.c + GSP=hyb_spat_to_SH.gen.c + ST=SHst_to_spat.c + Q=SH_to_spat.c + S=SHs_to_spat.c + T=SHt_to_spat.c + QST=SHqst_to_spat.c + SC=spat_to_SH.c + VE=spat_to_SHst.c + V3=spat_to_SHqst.c + VS0=spat_to_SHs.c + VT0=spat_to_SHt.c +else + GSH=$(SFX)_SH_to_spat.gen.c + GSP=$(SFX)_spat_to_SH.gen.c + ST=SHst_to_spat_$(SFX).c + Q=SH_to_spat_$(SFX).c + S=SHs_to_spat_$(SFX).c + T=SHt_to_spat_$(SFX).c + QST=SHqst_to_spat_$(SFX).c + SC=spat_to_SH_$(SFX).c + VE=spat_to_SHst_$(SFX).c + V3=spat_to_SHqst_$(SFX).c +endif + +all: $(GSH) $(GSP) + $(MAKE) $(SC) + $(MAKE) $(Q) + +# SH_to_spat generation +$(Q) : $(GSH) Makefile + @echo "// This file was automatically generated by 'make' from file '$(GSH)'." > $(ST) + @echo "// To modify it, please consider modifying $(GSH)" >> $(ST) + @cp $(ST) $(S) + @cp $(ST) $(T) + @cp $(ST) $(Q) + @cp $(ST) $(QST) +#EVEN/ODD + @$(SED) $(eo) $(vect) $(GSH) >> $(ST) + @$(SED) $(eo) $(sph) $(GSH) >> $(S) + @$(SED) $(eo) $(tor) $(GSH) >> $(T) + @$(SED) $(eo) $(scal) $(GSH) >> $(Q) + @$(SED) $(eo) $(v3d) $(GSH) >> $(QST) + @echo "SH*_to_spat code generated." + +# spat_to_SH generation +$(SC) : $(GSP) Makefile + @echo "// This file was automatically generated by 'make' from file '$(GSP)'." > $(SC) + @echo "// To modify it, please consider modifying $(GSP)" >> $(SC) + @cp $(SC) $(VE) + @cp $(SC) $(V3) +# @cp $(SC) $(VS0) +# @cp $(SC) $(VT0) +#EVEN/ODD + @$(SED) $(eo) $(scal) $(GSP) >> $(SC) + @$(SED) $(eo) $(vect) $(GSP) >> $(VE) + @$(SED) $(eo) $(v3d) $(GSP) >> $(V3) +# @$(SED) $(eo) $(sph) $(GSP) >> $(VS0) +# @$(SED) $(eo) $(tor) $(GSP) >> $(VT0) + @echo "spat_to_SH* code generated." + +clean: + rm -f spat_to_SH* SH* + +.PHONY: clean diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SH_to_spat_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SH_to_spat_fly.c new file mode 100644 index 000000000..480abda40 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SH_to_spat_fly.c @@ -0,0 +1,527 @@ +// This file was automatically generated by 'make' from file 'fly_SH_to_spat.gen.c'. +// To modify it, please consider modifying fly_SH_to_spat.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + + static void GEN3(SH_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, double *Vr, const long int llim) { + #ifndef SHT_GRAD + #else + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM + v2d *BrF; + #ifndef SHTNS_ISHIOKA + #define qr(l) vall(creal(Ql[l])) + #define qi(l) vall(cimag(Ql[l])) + #else + #define qr(l) vall( ((double*) QQl)[2*(l)] ) + #define qi(l) vall( ((double*) QQl)[2*(l)+1] ) + #endif + unsigned im, imlim; + #else + double* const BrF = Vr; + #endif + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + double Ql0[llim+2]; + #ifdef SHTNS_ISHIOKA + v2d QQl[llim+2]; + #endif + + #ifndef SHT_AXISYM + BrF = (v2d*) Vr; + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; + BrF = (v2d*) VMALLOC( nv * sizeof(double) ); + } + #ifdef SHT_GRAD + #endif + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #else + #ifdef SHT_GRAD + #endif + #endif + + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + { // im=0; + alm = shtns->alm; + l=1; + Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double + Ql0[l] = (double) Qlm[l]; // Ql[l+1] = (double) Qlm[l+1]; + ++l; + } while(l<=llim); + k=0; nk = NLAT_2; + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd re[NWAY], ro[NWAY]; + for (int j=0; j=nk) break; + S2D_STORE_4MAGIC((double*)BrF, j+k, re[j], ro[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #ifndef SHT_AXISYM + BrF += NLAT_2; + for(im=1; im<=imlim; ++im) { + m = im*MRES; + //l = LiM(shtns, 0,im); + l = (im*(2*(LMAX+1)-(m+MRES)))>>1; + //alm = shtns->alm[im]; + //alm = shtns->alm[0] + im*(2*LMAX - (im-1)*MRES); // for m > 0 + alm += 2*(LMAX+1-m+MRES); + + #ifndef SHT_GRAD + #else + #endif + + #ifndef SHTNS_ISHIOKA + cplx* Ql = &Qlm[l]; // virtual pointer for l=0 and im + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; + v2d* Ql = (v2d*) &Qlm[l]; // virtual pointer for l=0 and im + SH_to_ishioka(xlm, Ql+m, llim-m, QQl+m); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #ifdef SHTNS_ISHIOKA + al = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; // for ishioka recurrence + #endif + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE_4MAGIC((double*) BrF, (double*) (BrF + (NPHI-2*im)*NLAT_2), k+j, rer[j], ror[j], rei[j], roi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + BrF += NLAT_2; + } + + for (k=0; k < NLAT_2*(NPHI-1-2*imlim); ++k) { // padding for high m's + BrF[k] = vdup(0.0); + } + BrF -= NLAT_2*(imlim+1); // restore original pointer + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->ifftc, (cplx *) BrF, (cplx *) Vr); + } else { // split dft + fftw_execute_split_dft(shtns->ifftc,((double*)BrF)+1, ((double*)BrF), Vr+NPHI, Vr); + VFREE(BrF); + } + } + #endif + + #undef qr + #undef qi + } + + #ifndef SHT_AXISYM + + static void GEN3(SH_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Qlm, cplx *Vr, const long int llim) { + #ifndef SHT_GRAD + #else + #endif + + v2d *BrF; + #define qr(l) vall(creal(Qlm[l])) + #define qi(l) vall(cimag(Qlm[l])) + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + + BrF = (v2d*) Vr; + + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + + if (im == 0) { + double Ql0[llim+1]; + + #ifdef SHT_GRAD + #endif + + l=1; + alm = shtns->alm; + Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double + Ql0[l] = (double) Qlm[l]; // Ql[l+1] = (double) Qlm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd re[NWAY], ro[NWAY]; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BrF, k+j, re[j], ro[j], vall(0), vall(0)); + } + #endif + k+=NWAY; + } while (k < nk); + + } else { // im > 0 + im = abs(im); // positive im + m = im*MRES; + l = im*(2*(LMAX+1) -m); // to compute position in NLM array. + alm = shtns->alm + l+m; + Qlm -= m; // virtual pointer for l=0 + + + k=0; l=shtns->tm[im]; + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BrF, k+j, rer[j], ror[j], rei[j], roi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #undef qr + #undef qi + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHqst_to_spat_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHqst_to_spat_fly.c new file mode 100644 index 000000000..afd4fe86e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHqst_to_spat_fly.c @@ -0,0 +1,740 @@ +// This file was automatically generated by 'make' from file 'fly_SH_to_spat.gen.c'. +// To modify it, please consider modifying fly_SH_to_spat.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + + static void GEN3(SHqst_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, const long int llim) { + #ifndef SHT_GRAD + #else + static void GEN3(SHsph_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, const long int llim) { + static void GEN3(SHtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM + v2d *BrF; + v2d *BtF, *BpF; + #ifndef SHTNS_ISHIOKA + #define qr(l) vall(creal(Ql[l])) + #define qi(l) vall(cimag(Ql[l])) + #else + #define qr(l) vall( ((double*) QQl)[2*(l)] ) + #define qi(l) vall( ((double*) QQl)[2*(l)+1] ) + #endif + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + unsigned im, imlim; + #else + double* const BrF = Vr; + double* const BtF = Vt; + double* const BpF = Vp; + #endif + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + v2d VWl[llim*2+4]; + #ifdef SHTNS_ISHIOKA + v2d QQl[llim+2]; + #endif + + #ifndef SHT_AXISYM + BrF = (v2d*) Vr; + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; + BrF = (v2d*) VMALLOC( 3*nv * sizeof(double) ); + BtF = BrF + nv/2; BpF = BrF + nv; + } + #ifdef SHT_GRAD + k=0; do { BpF[k]=vdup(0.0); } while(++k (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #else + #ifdef SHT_GRAD + if (Vp != NULL) { k=0; do { ((v2d*)Vp)[k]=vdup(0.0); } while(++krobert_form; + + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + { // im=0; + alm = shtns->alm; + double* const Sl0 = (double*) VWl; + double* const Tl0 = (double*) VWl + llim+2; + double* const Ql0 = (double*) (VWl + llim+2); + l=1; + Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double + Ql0[l] = (double) Qlm[l]; // Ql[l+1] = (double) Qlm[l+1]; + Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; + Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; nk = NLAT_2; + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd re[NWAY], ro[NWAY]; + rnd te[NWAY], to[NWAY]; + rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; + S2D_STORE_4MAGIC((double*)BrF, j+k, re[j], ro[j]); + S2D_STORE_4MAGIC((double*)BtF, j+k, te[j], to[j]); + S2D_STORE_4MAGIC((double*)BpF, j+k, pe[j], po[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #ifndef SHT_AXISYM + BrF += NLAT_2; + BtF += NLAT_2; BpF += NLAT_2; + for(im=1; im<=imlim; ++im) { + m = im*MRES; + //l = LiM(shtns, 0,im); + l = (im*(2*(LMAX+1)-(m+MRES)))>>1; + //alm = shtns->alm[im]; + //alm = shtns->alm[0] + im*(2*LMAX - (im-1)*MRES); // for m > 0 + alm += 2*(LMAX+1-m+MRES); + + #ifndef SHT_GRAD + SH_vect_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], &Tlm[l], (cplx*) VWl); + #else + SHsph_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], (cplx*) VWl); + SHtor_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Tlm[l], (cplx*) VWl); + #endif + + #ifndef SHTNS_ISHIOKA + cplx* Ql = &Qlm[l]; // virtual pointer for l=0 and im + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; + v2d* Ql = (v2d*) &Qlm[l]; // virtual pointer for l=0 and im + SH_to_ishioka(xlm, Ql+m, llim-m, QQl+m); + SH2_to_ishioka(xlm, VWl+2*m, llim-m+1); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #ifdef SHTNS_ISHIOKA + al = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; // for ishioka recurrence + #endif + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE_4MAGIC((double*) BrF, (double*) (BrF + (NPHI-2*im)*NLAT_2), k+j, rer[j], ror[j], rei[j], roi[j]); + S2D_CSTORE_4MAGIC((double*) BtF, (double*) (BtF + (NPHI-2*im)*NLAT_2), k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE_4MAGIC((double*) BpF, (double*) (BpF + (NPHI-2*im)*NLAT_2), k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + BrF += NLAT_2; + BtF += NLAT_2; BpF += NLAT_2; + } + + for (k=0; k < NLAT_2*(NPHI-1-2*imlim); ++k) { // padding for high m's + BrF[k] = vdup(0.0); + BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } + BrF -= NLAT_2*(imlim+1); // restore original pointer + BtF -= NLAT_2*(imlim+1); BpF -= NLAT_2*(imlim+1); + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->ifftc, (cplx *) BrF, (cplx *) Vr); + fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); + fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); + } else { // split dft + fftw_execute_split_dft(shtns->ifftc,((double*)BrF)+1, ((double*)BrF), Vr+NPHI, Vr); + fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); + fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); + VFREE(BrF); + } + } + #endif + + #undef qr + #undef qi + #undef sr + #undef si + #undef tr + #undef ti + } + + #ifndef SHT_AXISYM + + static void GEN3(SHqst_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, const long int llim) { + #ifndef SHT_GRAD + #else + static void GEN3(SHsph_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Vt, cplx *Vp, const long int llim) { + static void GEN3(SHtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #endif + + v2d *BrF; + v2d *BtF, *BpF; + #define qr(l) vall(creal(Qlm[l])) + #define qi(l) vall(cimag(Qlm[l])) + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + + BrF = (v2d*) Vr; + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + robert_form = shtns->robert_form; + + if (im == 0) { + double Ql0[llim+1]; + double Sl0[llim]; + double Tl0[llim]; + + #ifdef SHT_GRAD + k=0; do { BpF[k]=vdup(0.0); } while(++kalm; + Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double + Ql0[l] = (double) Qlm[l]; // Ql[l+1] = (double) Qlm[l+1]; + Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; + Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd re[NWAY], ro[NWAY]; + rnd te[NWAY], to[NWAY]; + rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BrF, k+j, re[j], ro[j], vall(0), vall(0)); + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, te[j], to[j], vall(0), vall(0)); + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, pe[j], po[j], vall(0), vall(0)); + } + #endif + k+=NWAY; + } while (k < nk); + + } else { // im > 0 + const int ms = im*MRES; // signed m. + im = abs(im); // positive im + v2d VWl[llim*2+4]; + m = im*MRES; + l = im*(2*(LMAX+1) -m); // to compute position in NLM array. + alm = shtns->alm + l+m; + Qlm -= m; // virtual pointer for l=0 + Slm -= m; // virtual pointer for l=0 + Tlm -= m; + + { // convert from vector SH to scalar SH + double* mx = shtns->mx_stdt + l-m; + s2d em = vdup(ms); + v2d sl = ((v2d*)Slm)[m]; + v2d tl = ((v2d*)Tlm)[m]; + v2d vs = vdup( 0.0 ); + v2d wt = vdup( 0.0 ); + for (int l=m; l<=llim; l++) { + s2d mxu = vdup( mx[2*l] ); + s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration + vs = addi( vs , em*tl ); + wt = addi( wt , em*sl ); + v2d vs1 = mxl*sl; // vs for next iter + v2d wt1 = -mxl*tl; // wt for next iter + if (ltm[im]; + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BrF, k+j, rer[j], ror[j], rei[j], roi[j]); + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #undef qr + #undef qi + #undef sr + #undef si + #undef tr + #undef ti + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHs_to_spat_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHs_to_spat_fly.c new file mode 100644 index 000000000..fb896e48c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHs_to_spat_fly.c @@ -0,0 +1,619 @@ +// This file was automatically generated by 'make' from file 'fly_SH_to_spat.gen.c'. +// To modify it, please consider modifying fly_SH_to_spat.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + + #ifndef SHT_GRAD + static void GEN3(SHsphtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #else + static void GEN3(SHsph_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, const long int llim) { + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM + v2d *BtF, *BpF; + #ifndef SHTNS_ISHIOKA + #else + #endif + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + unsigned im, imlim; + #else + double* const BtF = Vt; + #endif + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + v2d VWl[llim*2+4]; + #ifdef SHTNS_ISHIOKA + #endif + + #ifndef SHT_AXISYM + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; + BtF = (v2d*) VMALLOC( 2*nv * sizeof(double) ); + BpF = BtF + nv/2; + } + #ifdef SHT_GRAD + k=0; do { BpF[k]=vdup(0.0); } while(++k (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #else + #ifdef SHT_GRAD + if (Vp != NULL) { k=0; do { ((v2d*)Vp)[k]=vdup(0.0); } while(++krobert_form; + + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + { // im=0; + alm = shtns->alm; + double* const Sl0 = (double*) VWl; + l=1; + do { // for m=0, compress the complex Q,S,T to double + Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; + ++l; + } while(l<=llim); + k=0; nk = NLAT_2; + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd te[NWAY], to[NWAY]; + for (int j=0; j=nk) break; + S2D_STORE_4MAGIC((double*)BtF, j+k, te[j], to[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #ifndef SHT_AXISYM + BtF += NLAT_2; BpF += NLAT_2; + for(im=1; im<=imlim; ++im) { + m = im*MRES; + //l = LiM(shtns, 0,im); + l = (im*(2*(LMAX+1)-(m+MRES)))>>1; + //alm = shtns->alm[im]; + //alm = shtns->alm[0] + im*(2*LMAX - (im-1)*MRES); // for m > 0 + alm += 2*(LMAX+1-m+MRES); + + #ifndef SHT_GRAD + SH_vect_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], &Tlm[l], (cplx*) VWl); + #else + SHsph_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], (cplx*) VWl); + #endif + + #ifndef SHTNS_ISHIOKA + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; + SH2_to_ishioka(xlm, VWl+2*m, llim-m+1); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #ifdef SHTNS_ISHIOKA + al = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; // for ishioka recurrence + #endif + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE_4MAGIC((double*) BtF, (double*) (BtF + (NPHI-2*im)*NLAT_2), k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE_4MAGIC((double*) BpF, (double*) (BpF + (NPHI-2*im)*NLAT_2), k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + BtF += NLAT_2; BpF += NLAT_2; + } + + for (k=0; k < NLAT_2*(NPHI-1-2*imlim); ++k) { // padding for high m's + BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } + BtF -= NLAT_2*(imlim+1); BpF -= NLAT_2*(imlim+1); + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); + fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); + } else { // split dft + fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); + fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); + VFREE(BtF); // this frees also BpF. + } + } + #endif + + #undef sr + #undef si + } + + #ifndef SHT_AXISYM + + #ifndef SHT_GRAD + static void GEN3(SHsphtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #else + static void GEN3(SHsph_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Vt, cplx *Vp, const long int llim) { + #endif + + v2d *BtF, *BpF; + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + robert_form = shtns->robert_form; + + if (im == 0) { + double Sl0[llim]; + + #ifdef SHT_GRAD + k=0; do { BpF[k]=vdup(0.0); } while(++kalm; + do { // for m=0, compress the complex Q,S,T to double + Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd te[NWAY], to[NWAY]; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, te[j], to[j], vall(0), vall(0)); + } + #endif + k+=NWAY; + } while (k < nk); + + } else { // im > 0 + const int ms = im*MRES; // signed m. + im = abs(im); // positive im + v2d VWl[llim*2+4]; + m = im*MRES; + l = im*(2*(LMAX+1) -m); // to compute position in NLM array. + alm = shtns->alm + l+m; + Slm -= m; // virtual pointer for l=0 + + { // convert from vector SH to scalar SH + double* mx = shtns->mx_stdt + l-m; + s2d em = vdup(ms); + v2d sl = ((v2d*)Slm)[m]; + v2d vs = vdup( 0.0 ); + v2d wt = vdup( 0.0 ); + for (int l=m; l<=llim; l++) { + s2d mxu = vdup( mx[2*l] ); + s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration + wt = addi( wt , em*sl ); + v2d vs1 = mxl*sl; // vs for next iter + if (ltm[im]; + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #undef sr + #undef si + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHst_to_spat_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHst_to_spat_fly.c new file mode 100644 index 000000000..1df9329ff --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHst_to_spat_fly.c @@ -0,0 +1,657 @@ +// This file was automatically generated by 'make' from file 'fly_SH_to_spat.gen.c'. +// To modify it, please consider modifying fly_SH_to_spat.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + + #ifndef SHT_GRAD + static void GEN3(SHsphtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #else + static void GEN3(SHsph_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, const long int llim) { + static void GEN3(SHtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM + v2d *BtF, *BpF; + #ifndef SHTNS_ISHIOKA + #else + #endif + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + unsigned im, imlim; + #else + double* const BtF = Vt; + double* const BpF = Vp; + #endif + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + v2d VWl[llim*2+4]; + #ifdef SHTNS_ISHIOKA + #endif + + #ifndef SHT_AXISYM + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; + BtF = (v2d*) VMALLOC( 2*nv * sizeof(double) ); + BpF = BtF + nv/2; + } + #ifdef SHT_GRAD + k=0; do { BpF[k]=vdup(0.0); } while(++k (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #else + #ifdef SHT_GRAD + if (Vp != NULL) { k=0; do { ((v2d*)Vp)[k]=vdup(0.0); } while(++krobert_form; + + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + { // im=0; + alm = shtns->alm; + double* const Sl0 = (double*) VWl; + double* const Tl0 = (double*) VWl + llim+2; + l=1; + do { // for m=0, compress the complex Q,S,T to double + Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; + Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; nk = NLAT_2; + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd te[NWAY], to[NWAY]; + rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; + S2D_STORE_4MAGIC((double*)BtF, j+k, te[j], to[j]); + S2D_STORE_4MAGIC((double*)BpF, j+k, pe[j], po[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #ifndef SHT_AXISYM + BtF += NLAT_2; BpF += NLAT_2; + for(im=1; im<=imlim; ++im) { + m = im*MRES; + //l = LiM(shtns, 0,im); + l = (im*(2*(LMAX+1)-(m+MRES)))>>1; + //alm = shtns->alm[im]; + //alm = shtns->alm[0] + im*(2*LMAX - (im-1)*MRES); // for m > 0 + alm += 2*(LMAX+1-m+MRES); + + #ifndef SHT_GRAD + SH_vect_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], &Tlm[l], (cplx*) VWl); + #else + SHsph_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], (cplx*) VWl); + SHtor_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Tlm[l], (cplx*) VWl); + #endif + + #ifndef SHTNS_ISHIOKA + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; + SH2_to_ishioka(xlm, VWl+2*m, llim-m+1); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #ifdef SHTNS_ISHIOKA + al = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; // for ishioka recurrence + #endif + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE_4MAGIC((double*) BtF, (double*) (BtF + (NPHI-2*im)*NLAT_2), k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE_4MAGIC((double*) BpF, (double*) (BpF + (NPHI-2*im)*NLAT_2), k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + BtF += NLAT_2; BpF += NLAT_2; + } + + for (k=0; k < NLAT_2*(NPHI-1-2*imlim); ++k) { // padding for high m's + BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } + BtF -= NLAT_2*(imlim+1); BpF -= NLAT_2*(imlim+1); + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); + fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); + } else { // split dft + fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); + fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); + VFREE(BtF); // this frees also BpF. + } + } + #endif + + #undef sr + #undef si + #undef tr + #undef ti + } + + #ifndef SHT_AXISYM + + #ifndef SHT_GRAD + static void GEN3(SHsphtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #else + static void GEN3(SHsph_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Vt, cplx *Vp, const long int llim) { + static void GEN3(SHtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #endif + + v2d *BtF, *BpF; + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + robert_form = shtns->robert_form; + + if (im == 0) { + double Sl0[llim]; + double Tl0[llim]; + + #ifdef SHT_GRAD + k=0; do { BpF[k]=vdup(0.0); } while(++kalm; + do { // for m=0, compress the complex Q,S,T to double + Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; + Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd te[NWAY], to[NWAY]; + rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, te[j], to[j], vall(0), vall(0)); + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, pe[j], po[j], vall(0), vall(0)); + } + #endif + k+=NWAY; + } while (k < nk); + + } else { // im > 0 + const int ms = im*MRES; // signed m. + im = abs(im); // positive im + v2d VWl[llim*2+4]; + m = im*MRES; + l = im*(2*(LMAX+1) -m); // to compute position in NLM array. + alm = shtns->alm + l+m; + Slm -= m; // virtual pointer for l=0 + Tlm -= m; + + { // convert from vector SH to scalar SH + double* mx = shtns->mx_stdt + l-m; + s2d em = vdup(ms); + v2d sl = ((v2d*)Slm)[m]; + v2d tl = ((v2d*)Tlm)[m]; + v2d vs = vdup( 0.0 ); + v2d wt = vdup( 0.0 ); + for (int l=m; l<=llim; l++) { + s2d mxu = vdup( mx[2*l] ); + s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration + vs = addi( vs , em*tl ); + wt = addi( wt , em*sl ); + v2d vs1 = mxl*sl; // vs for next iter + v2d wt1 = -mxl*tl; // wt for next iter + if (ltm[im]; + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #undef sr + #undef si + #undef tr + #undef ti + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHt_to_spat_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHt_to_spat_fly.c new file mode 100644 index 000000000..4dbff9240 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/SHt_to_spat_fly.c @@ -0,0 +1,619 @@ +// This file was automatically generated by 'make' from file 'fly_SH_to_spat.gen.c'. +// To modify it, please consider modifying fly_SH_to_spat.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + + #ifndef SHT_GRAD + static void GEN3(SHsphtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #else + static void GEN3(SHtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM + v2d *BtF, *BpF; + #ifndef SHTNS_ISHIOKA + #else + #endif + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + unsigned im, imlim; + #else + double* const BpF = Vp; + #endif + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + v2d VWl[llim*2+4]; + #ifdef SHTNS_ISHIOKA + #endif + + #ifndef SHT_AXISYM + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; + BtF = (v2d*) VMALLOC( 2*nv * sizeof(double) ); + BpF = BtF + nv/2; + } + #ifdef SHT_GRAD + k=0; do { BtF[k]=vdup(0.0); } while(++k (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #else + #ifdef SHT_GRAD + if (Vt != NULL) { k=0; do { ((v2d*)Vt)[k]=vdup(0.0); } while(++krobert_form; + + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + { // im=0; + alm = shtns->alm; + double* const Tl0 = (double*) VWl + llim+2; + l=1; + do { // for m=0, compress the complex Q,S,T to double + Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; nk = NLAT_2; + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; + S2D_STORE_4MAGIC((double*)BpF, j+k, pe[j], po[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #ifndef SHT_AXISYM + BtF += NLAT_2; BpF += NLAT_2; + for(im=1; im<=imlim; ++im) { + m = im*MRES; + //l = LiM(shtns, 0,im); + l = (im*(2*(LMAX+1)-(m+MRES)))>>1; + //alm = shtns->alm[im]; + //alm = shtns->alm[0] + im*(2*LMAX - (im-1)*MRES); // for m > 0 + alm += 2*(LMAX+1-m+MRES); + + #ifndef SHT_GRAD + SH_vect_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], &Tlm[l], (cplx*) VWl); + #else + SHtor_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Tlm[l], (cplx*) VWl); + #endif + + #ifndef SHTNS_ISHIOKA + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; + SH2_to_ishioka(xlm, VWl+2*m, llim-m+1); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #ifdef SHTNS_ISHIOKA + al = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; // for ishioka recurrence + #endif + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE_4MAGIC((double*) BtF, (double*) (BtF + (NPHI-2*im)*NLAT_2), k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE_4MAGIC((double*) BpF, (double*) (BpF + (NPHI-2*im)*NLAT_2), k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + BtF += NLAT_2; BpF += NLAT_2; + } + + for (k=0; k < NLAT_2*(NPHI-1-2*imlim); ++k) { // padding for high m's + BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } + BtF -= NLAT_2*(imlim+1); BpF -= NLAT_2*(imlim+1); + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); + fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); + } else { // split dft + fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); + fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); + VFREE(BtF); // this frees also BpF. + } + } + #endif + + #undef tr + #undef ti + } + + #ifndef SHT_AXISYM + + #ifndef SHT_GRAD + static void GEN3(SHsphtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #else + static void GEN3(SHtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #endif + + v2d *BtF, *BpF; + #define vr(l) vall( ((double*) VWl)[4*(l)] ) + #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) + #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) + #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; + int robert_form; + + BtF = (v2d*) Vt; BpF = (v2d*) Vp; + + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + robert_form = shtns->robert_form; + + if (im == 0) { + double Tl0[llim]; + + #ifdef SHT_GRAD + k=0; do { BtF[k]=vdup(0.0); } while(++kalm; + do { // for m=0, compress the complex Q,S,T to double + Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; + rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, pe[j], po[j], vall(0), vall(0)); + } + #endif + k+=NWAY; + } while (k < nk); + + } else { // im > 0 + const int ms = im*MRES; // signed m. + im = abs(im); // positive im + v2d VWl[llim*2+4]; + m = im*MRES; + l = im*(2*(LMAX+1) -m); // to compute position in NLM array. + alm = shtns->alm + l+m; + Tlm -= m; + + { // convert from vector SH to scalar SH + double* mx = shtns->mx_stdt + l-m; + s2d em = vdup(ms); + v2d tl = ((v2d*)Tlm)[m]; + v2d vs = vdup( 0.0 ); + v2d wt = vdup( 0.0 ); + for (int l=m; l<=llim; l++) { + s2d mxu = vdup( mx[2*l] ); + s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration + vs = addi( vs , em*tl ); + v2d wt1 = -mxl*tl; // wt for next iter + if (ltm[im]; + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; + S2D_CSTORE2_4MAGIC((double*)BtF, k+j, ter[j], tor[j], tei[j], toi[j]); + S2D_CSTORE2_4MAGIC((double*)BpF, k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #undef tr + #undef ti + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/fly_SH_to_spat.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/fly_SH_to_spat.gen.c new file mode 100644 index 000000000..dc16f6db6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/fly_SH_to_spat.gen.c @@ -0,0 +1,758 @@ +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for similar SHT functions, +# from one generic function + tags. +# > See Makefile and SHT.c +# Basically, there are tags at the beginning of lines that are information +# to keep or remove the line depending on the function to build. +# tags : +# Q : line for scalar transform +# V : line for vector transform (both spheroidal and toroidal) +# S : line for vector transfrom, spheroidal component +# T : line for vector transform, toroidal component. + +3 static void GEN3(SHqst_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, const long int llim) { +QX static void GEN3(SH_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, double *Vr, const long int llim) { + #ifndef SHT_GRAD +VX static void GEN3(SHsphtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #else +S static void GEN3(SHsph_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, const long int llim) { +T static void GEN3(SHtor_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, const long int llim) { + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM +Q v2d *BrF; +V v2d *BtF, *BpF; + #ifndef SHTNS_ISHIOKA +Q #define qr(l) vall(creal(Ql[l])) +Q #define qi(l) vall(cimag(Ql[l])) + #else +Q #define qr(l) vall( ((double*) QQl)[2*(l)] ) +Q #define qi(l) vall( ((double*) QQl)[2*(l)+1] ) + #endif +V #define vr(l) vall( ((double*) VWl)[4*(l)] ) +V #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) +V #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) +V #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + unsigned im, imlim; + #else +Q double* const BrF = Vr; +S double* const BtF = Vt; +T double* const BpF = Vp; + #endif + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; +V int robert_form; +QX double Ql0[llim+2]; +V v2d VWl[llim*2+4]; + #ifdef SHTNS_ISHIOKA +Q v2d QQl[llim+2]; + #endif + + #ifndef SHT_AXISYM +Q BrF = (v2d*) Vr; +V BtF = (v2d*) Vt; BpF = (v2d*) Vp; + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; +QX BrF = (v2d*) VMALLOC( nv * sizeof(double) ); +VX BtF = (v2d*) VMALLOC( 2*nv * sizeof(double) ); +VX BpF = BtF + nv/2; +3 BrF = (v2d*) VMALLOC( 3*nv * sizeof(double) ); +3 BtF = BrF + nv/2; BpF = BrF + nv; + } + #ifdef SHT_GRAD +S k=0; do { BpF[k]=vdup(0.0); } while(++k (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #else + #ifdef SHT_GRAD +S if (Vp != NULL) { k=0; do { ((v2d*)Vp)[k]=vdup(0.0); } while(++krobert_form; + + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; + { // im=0; + alm = shtns->alm; +S double* const Sl0 = (double*) VWl; +T double* const Tl0 = (double*) VWl + llim+2; +3 double* const Ql0 = (double*) (VWl + llim+2); + l=1; +Q Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double +Q Ql0[l] = (double) Qlm[l]; // Ql[l+1] = (double) Qlm[l+1]; +S Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; +T Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; nk = NLAT_2; + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; +V rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; +Q rnd re[NWAY], ro[NWAY]; +S rnd te[NWAY], to[NWAY]; +T rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; +Q S2D_STORE_4MAGIC((double*)BrF, j+k, re[j], ro[j]); +S S2D_STORE_4MAGIC((double*)BtF, j+k, te[j], to[j]); +T S2D_STORE_4MAGIC((double*)BpF, j+k, pe[j], po[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + + #ifndef SHT_AXISYM +Q BrF += NLAT_2; +V BtF += NLAT_2; BpF += NLAT_2; + for(im=1; im<=imlim; ++im) { + m = im*MRES; + //l = LiM(shtns, 0,im); + l = (im*(2*(LMAX+1)-(m+MRES)))>>1; + //alm = shtns->alm[im]; + //alm = shtns->alm[0] + im*(2*LMAX - (im-1)*MRES); // for m > 0 + alm += 2*(LMAX+1-m+MRES); + + #ifndef SHT_GRAD +V SH_vect_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], &Tlm[l], (cplx*) VWl); + #else +S SHsph_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], (cplx*) VWl); +T SHtor_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Tlm[l], (cplx*) VWl); + #endif + + #ifndef SHTNS_ISHIOKA +Q cplx* Ql = &Qlm[l]; // virtual pointer for l=0 and im + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; +Q v2d* Ql = (v2d*) &Qlm[l]; // virtual pointer for l=0 and im +Q SH_to_ishioka(xlm, Ql+m, llim-m, QQl+m); +V SH2_to_ishioka(xlm, VWl+2*m, llim-m+1); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #ifdef SHTNS_ISHIOKA + al = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; // for ishioka recurrence + #endif + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; +Q S2D_CSTORE_4MAGIC((double*) BrF, (double*) (BrF + (NPHI-2*im)*NLAT_2), k+j, rer[j], ror[j], rei[j], roi[j]); +V S2D_CSTORE_4MAGIC((double*) BtF, (double*) (BtF + (NPHI-2*im)*NLAT_2), k+j, ter[j], tor[j], tei[j], toi[j]); +V S2D_CSTORE_4MAGIC((double*) BpF, (double*) (BpF + (NPHI-2*im)*NLAT_2), k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); +Q BrF += NLAT_2; +V BtF += NLAT_2; BpF += NLAT_2; + } + + for (k=0; k < NLAT_2*(NPHI-1-2*imlim); ++k) { // padding for high m's +Q BrF[k] = vdup(0.0); +V BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } +Q BrF -= NLAT_2*(imlim+1); // restore original pointer +V BtF -= NLAT_2*(imlim+1); BpF -= NLAT_2*(imlim+1); + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { +Q fftw_execute_dft(shtns->ifftc, (cplx *) BrF, (cplx *) Vr); +V fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); +V fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); + } else { // split dft +Q fftw_execute_split_dft(shtns->ifftc,((double*)BrF)+1, ((double*)BrF), Vr+NPHI, Vr); +V fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); +V fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); +Q VFREE(BrF); +VX VFREE(BtF); // this frees also BpF. + } + } + #endif + +Q #undef qr +Q #undef qi +S #undef sr +S #undef si +T #undef tr +T #undef ti + } + + #ifndef SHT_AXISYM + +3 static void GEN3(SHqst_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, const long int llim) { +QX static void GEN3(SH_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Qlm, cplx *Vr, const long int llim) { + #ifndef SHT_GRAD +VX static void GEN3(SHsphtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #else +S static void GEN3(SHsph_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Slm, cplx *Vt, cplx *Vp, const long int llim) { +T static void GEN3(SHtor_m_to_spat_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Tlm, cplx *Vt, cplx *Vp, const long int llim) { + #endif + +Q v2d *BrF; +V v2d *BtF, *BpF; +Q #define qr(l) vall(creal(Qlm[l])) +Q #define qi(l) vall(cimag(Qlm[l])) +V #define vr(l) vall( ((double*) VWl)[4*(l)] ) +V #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) +V #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) +V #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + long int nk, k,l,m; + double *alm, *al; + s2d *ct, *st; +V int robert_form; + +Q BrF = (v2d*) Vr; +V BtF = (v2d*) Vt; BpF = (v2d*) Vp; + + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif + ct = (s2d*) shtns->ct; st = (s2d*) shtns->st; +V robert_form = shtns->robert_form; + + if (im == 0) { +Q double Ql0[llim+1]; +S double Sl0[llim]; +T double Tl0[llim]; + + #ifdef SHT_GRAD +S k=0; do { BpF[k]=vdup(0.0); } while(++kalm; +Q Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double +Q Ql0[l] = (double) Qlm[l]; // Ql[l+1] = (double) Qlm[l+1]; +S Sl0[l-1] = (double) Slm[l]; // Sl[l] = (double) Slm[l+1]; +T Tl0[l-1] = (double) Tlm[l]; // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; +V rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; +Q rnd re[NWAY], ro[NWAY]; +S rnd te[NWAY], to[NWAY]; +T rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; +Q S2D_CSTORE2_4MAGIC((double*)BrF, k+j, re[j], ro[j], vall(0), vall(0)); +S S2D_CSTORE2_4MAGIC((double*)BtF, k+j, te[j], to[j], vall(0), vall(0)); +T S2D_CSTORE2_4MAGIC((double*)BpF, k+j, pe[j], po[j], vall(0), vall(0)); + } + #endif + k+=NWAY; + } while (k < nk); + + } else { // im > 0 +V const int ms = im*MRES; // signed m. + im = abs(im); // positive im +V v2d VWl[llim*2+4]; + m = im*MRES; + l = im*(2*(LMAX+1) -m); // to compute position in NLM array. + alm = shtns->alm + l+m; +Q Qlm -= m; // virtual pointer for l=0 +S Slm -= m; // virtual pointer for l=0 +T Tlm -= m; + +V { // convert from vector SH to scalar SH +V double* mx = shtns->mx_stdt + l-m; +V s2d em = vdup(ms); +S v2d sl = ((v2d*)Slm)[m]; +T v2d tl = ((v2d*)Tlm)[m]; +V v2d vs = vdup( 0.0 ); +V v2d wt = vdup( 0.0 ); +V for (int l=m; l<=llim; l++) { +V s2d mxu = vdup( mx[2*l] ); +V s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration +T vs = addi( vs , em*tl ); +S wt = addi( wt , em*sl ); +S v2d vs1 = mxl*sl; // vs for next iter +T v2d wt1 = -mxl*tl; // wt for next iter +V if (ltm[im]; + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; +Q S2D_CSTORE2_4MAGIC((double*)BrF, k+j, rer[j], ror[j], rei[j], roi[j]); +V S2D_CSTORE2_4MAGIC((double*)BtF, k+j, ter[j], tor[j], tei[j], toi[j]); +V S2D_CSTORE2_4MAGIC((double*)BpF, k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); + } + +Q #undef qr +Q #undef qi +S #undef sr +S #undef si +T #undef tr +T #undef ti + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/fly_spat_to_SH.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/fly_spat_to_SH.gen.c new file mode 100644 index 000000000..994036b87 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/fly_spat_to_SH.gen.c @@ -0,0 +1,441 @@ +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for 3 similar SHT functions, +# (namely spat_to_SH [Q tag]), spat_to_SHsphtor [V tag], spat_to_SH3 [both Q&V tags]) +# from one generic function + tags. +# Basically, there are tags at the beginning of lines (Q,V) that are information +# to keep or remove the line depending on the function to build. (Q for scalar, V for vector, # for comment) +# +////////////////////////////////////////////////// + + +QX void GEN3(_an1,NWAY,_l)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim); +VX void GEN3(_an2,NWAY,_l)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); +3 void GEN3(_an3,NWAY,_l)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); +QX void GEN3(_an1_hi,NWAY,_l)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim); +VX void GEN3(_an2_hi,NWAY,_l)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); +3 void GEN3(_an3_hi,NWAY,_l)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); + + +QX static void GEN3(spat_to_SH_fly,NWAY,SUFFIX)(shtns_cfg shtns, double *Vr, cplx *Qlm, const long int llim) { +VX static void GEN3(spat_to_SHsphtor_fly,NWAY,SUFFIX)(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, const long int llim) { +3 static void GEN3(spat_to_SHqst_fly,NWAY,SUFFIX)(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim) { + + +Q double *BrF; // contains the Fourier transformed data +V double *BtF, *BpF; // contains the Fourier transformed data + unsigned imlim=0; + +Q BrF = Vr; +V BtF = Vt; BpF = Vp; + #ifndef SHT_AXISYM + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode > 0) { // alloc memory for out-of-place FFT + unsigned long nv = shtns->nspat; +QX BrF = (double*) VMALLOC( nv * sizeof(double) ); +VX BtF = (double*) VMALLOC( 2*nv * sizeof(double) ); +VX BpF = BtF + nv; +3 BrF = (double*) VMALLOC( 3*nv * sizeof(double) ); +3 BtF = BrF + nv; BpF = BtF + nv; + } + if (shtns->fftc_mode != 1) { // regular FFT +Q fftw_execute_dft(shtns->fftc,(cplx*)Vr, (cplx*)BrF); +V fftw_execute_dft(shtns->fftc,(cplx*)Vt, (cplx*)BtF); +V fftw_execute_dft(shtns->fftc,(cplx*)Vp, (cplx*)BpF); + } else { // split FFT +Q fftw_execute_split_dft(shtns->fftc, Vr+NPHI, Vr, BrF+1, BrF); +V fftw_execute_split_dft(shtns->fftc, Vt+NPHI, Vt, BtF+1, BtF); +V fftw_execute_split_dft(shtns->fftc, Vp+NPHI, Vp, BpF+1, BpF); + } + } + #else + imlim = 0; + #endif + imlim += 1; + + if (llim < SHT_L_RESCALE_FLY) { +QX GEN3(_an1,NWAY,_l)(shtns, BrF, Qlm, llim, imlim); +VX GEN3(_an2,NWAY,_l)(shtns, BtF, BpF, Slm, Tlm, llim, imlim); +3 GEN3(_an3,NWAY,_l)(shtns, BrF, BtF, BpF, Qlm, Slm, Tlm, llim, imlim); + } else { +QX GEN3(_an1_hi,NWAY,_l)(shtns, BrF, Qlm, llim, imlim); +VX GEN3(_an2_hi,NWAY,_l)(shtns, BtF, BpF, Slm, Tlm, llim, imlim); +3 GEN3(_an3_hi,NWAY,_l)(shtns, BrF, BtF, BpF, Qlm, Slm, Tlm, llim, imlim); + } + + #ifndef SHT_AXISYM + if (shtns->fftc_mode > 0) { // free memory +Q VFREE(BrF); +VX VFREE(BtF); // this frees also BpF. + } + #endif + + } + + + #ifndef SHT_AXISYM + +QX static void GEN3(spat_to_SH_m_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Vr, cplx *Qlm, long int llim) { +VX static void GEN3(spat_to_SHsphtor_m_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm, long int llim) { +3 static void GEN3(spat_to_SHqst_m_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, long int llim) { + + double *alm, *al; + double *wg, *ct, *st; +V double *l_2; + long int nk, k, l,m; + double alm0_rescale; +V int robert_form; +Q rnd qq[2*llim+4]; +V rnd vw[4*llim+8]; + +Q double rer[NLAT_2 + NWAY*VSIZE2] SSE; +Q double ror[NLAT_2 + NWAY*VSIZE2] SSE; +V double ter[NLAT_2 + NWAY*VSIZE2] SSE; +V double tor[NLAT_2 + NWAY*VSIZE2] SSE; +V double per[NLAT_2 + NWAY*VSIZE2] SSE; +V double por[NLAT_2 + NWAY*VSIZE2] SSE; +Q double rei[NLAT_2 + NWAY*VSIZE2] SSE; +Q double roi[NLAT_2 + NWAY*VSIZE2] SSE; +V double tei[NLAT_2 + NWAY*VSIZE2] SSE; +V double toi[NLAT_2 + NWAY*VSIZE2] SSE; +V double pei[NLAT_2 + NWAY*VSIZE2] SSE; +V double poi[NLAT_2 + NWAY*VSIZE2] SSE; + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; +V robert_form = shtns->robert_form; +V l_2 = shtns->l_2; + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { +Q rer[k] = 0.0; ror[k] = 0.0; +V ter[k] = 0.0; tor[k] = 0.0; +V per[k] = 0.0; por[k] = 0.0; + } + + if (im == 0) { // im=0 + alm = shtns->blm; +V k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) +V #ifndef SHTNS4MAGIC +V double n = creal(Vt[k]); double s = creal(Vt[NLAT-1-k]); +V #else +V double n = creal(Vt[2*k]); double s = creal(Vt[2*k+1]); +V #endif +V if (robert_form) { +V double st_1 = shtns->st_1[k]; +V n *= st_1; s *= st_1; +V } +V ter[k] = n+s; tor[k] = n-s; +V } while(++k < nk*VSIZE2); +V k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) +V #ifndef SHTNS4MAGIC +V double n = creal(Vp[k]); double s = creal(Vp[NLAT-1-k]); +V #else +V double n = creal(Vp[2*k]); double s = creal(Vp[2*k+1]); +V #endif +V if (robert_form) { +V double st_1 = shtns->st_1[k]; +V n *= st_1; s *= st_1; +V } +V per[k] = n+s; por[k] = n-s; +V } while(++k < nk*VSIZE2); +Q double r0 = 0.0; +Q k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) +Q #ifndef SHTNS4MAGIC +Q double n = creal(Vr[k]); double s = creal(Vr[NLAT-1-k]); +Q #else +Q double n = creal(Vr[2*k]); double s = creal(Vr[2*k+1]); +Q #endif +Q rer[k] = n+s; ror[k] = n-s; +Q r0 += (n+s)*wg[k]; +Q } while(++k < nk*VSIZE2); + alm0_rescale = alm[0] * shtns->nphi; // alm[0] takes into account the fftw normalization, *nphi cancels it +V Slm[0] = 0.0; Tlm[0] = 0.0; // l=0 is zero for the vector transform. +Q Qlm[0] = r0 * alm0_rescale; // l=0 is done. + k = 0; + for (l=0;l 0 +V const int ms = im*MRES; // signed m. + im = abs(im); // positive im + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { +Q rei[k] = 0.0; roi[k] = 0.0; +V tei[k] = 0.0; toi[k] = 0.0; +V pei[k] = 0.0; poi[k] = 0.0; + } + + m = im*MRES; + l = shtns->tm[im] / VSIZE2; + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); +Q k = ((l*VSIZE2)>>1)*2; // k must be even here. +Q do { // compute symmetric and antisymmetric parts. +3 double sink = st[k]; +Q #ifndef SHTNS4MAGIC +Q cplx n = Vr[k]; cplx s = Vr[NLAT-1-k]; +Q #else +Q cplx n = Vr[2*k]; cplx s = Vr[2*k+1]; +Q #endif +3 n *= sink; s *= sink; +Q rer[k] = creal(n+s); rei[k] = cimag(n+s); +Q ror[k] = creal(n-s); roi[k] = cimag(n-s); +Q } while (++k>1)*2; // k must be even here. +V do { // compute symmetric and antisymmetric parts. +V #ifndef SHTNS4MAGIC +V cplx n = Vt[k]; cplx s = Vt[NLAT-1-k]; +V #else +V cplx n = Vt[2*k]; cplx s = Vt[2*k+1]; +V #endif +V if (robert_form) { +V double st_1 = shtns->st_1[k]; +V n *= st_1; s *= st_1; +V } +V ter[k] = creal(n+s); tei[k] = cimag(n+s); +V tor[k] = creal(n-s); toi[k] = cimag(n-s); +V } while (++k>1)*2; // k must be even here. +V do { // compute symmetric and antisymmetric parts. +V #ifndef SHTNS4MAGIC +V cplx n = Vp[k]; cplx s = Vp[NLAT-1-k]; +V #else +V cplx n = Vp[2*k]; cplx s = Vp[2*k+1]; +V #endif +V if (robert_form) { +V double st_1 = shtns->st_1[k]; +V n *= st_1; s *= st_1; +V } +V per[k] = creal(n+s); pei[k] = cimag(n+s); +V por[k] = creal(n-s); poi[k] = cimag(n-s); +V } while (++k=0; l--) { +Q q[0] = vall(0.0); q[1] = vall(0.0); q+=2; +V v[0] = vall(0.0); v[1] = vall(0.0); +V v[2] = vall(0.0); v[3] = vall(0.0); v+=4; + } + alm0_rescale = alm[0] * shtns->mpos_scale_analys * (shtns->nphi*2); // handles real-norm + do { + #if _GCC_VEC_ +Q rnd* q = qq; +V rnd* v = vw; + #else +Q double* q = (double *) qq; //Qlm; +V double* v = (double *) vw; +V double* t = (double *) vw; + #endif + al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; +Q rnd rerk[NWAY], reik[NWAY], rork[NWAY], roik[NWAY]; // help the compiler to cache into registers. +V rnd terk[NWAY], teik[NWAY], tork[NWAY], toik[NWAY]; +V rnd perk[NWAY], peik[NWAY], pork[NWAY], poik[NWAY]; + for (int j=0; j>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; jmx_van + 2*LM(shtns,m,m), l_2, llim, ms, vw, (v2d*)Slm, (v2d*)Tlm); + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { +Q ((v2d*)Qlm)[l] = vdup(0.0); +V ((v2d*)Slm)[l] = vdup(0.0); ((v2d*)Tlm)[l] = vdup(0.0); + } + #endif + } + + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/hyb_SH_to_spat.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/hyb_SH_to_spat.gen.c new file mode 100644 index 000000000..be63ca8d1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/hyb_SH_to_spat.gen.c @@ -0,0 +1,563 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for similar SHT functions, +# from one generic function + tags. +# > See Makefile and SHT.c +# Basically, there are tags at the beginning of lines that are information +# to keep or remove the line depending on the function to build. +# tags : +# Q : line for scalar transform +# V : line for vector transform (both spheroidal and toroidal) +# S : line for vector transfrom, spheroidal component +# T : line for vector transform, toroidal component. + +///////////////////////////////////////////////////// + #ifdef SHT_AXISYM +/// Only the \b axisymmetric (m=0) component is transformed, and the resulting spatial fields have size NLAT. + #endif + +/// Truncation and spatial discretization are defined by \ref shtns_create and \ref shtns_set_grid_* +/// \param[in] shtns = a configuration created by \ref shtns_create with a grid set by shtns_set_grid_* +Q/// \param[in] Qlm = spherical harmonics coefficients : +Q/// complex double arrays of size shtns->nlm [unmodified]. +S/// \param[in] Slm = spherical harmonics coefficients of \b Spheroidal scalar : +S/// complex double array of size shtns->nlm [unmodified]. +T/// \param[in] Tlm = spherical harmonics coefficients of \b Toroidal scalar : +T/// complex double array of size shtns->nlm [unmodified]. +Q/// \param[out] Vr = spatial scalar field : double array. + #ifndef SHT_AXISYM +V/// \param[out] Vt, Vp = (theta,phi)-components of spatial vector : double arrays. + #else +S/// \param[out] Vt = theta-component of spatial vector : double array. +T/// \param[out] Vp = phi-component of spatial vector : double array. + #endif + #ifdef SHT_VAR_LTR +/// \param[in] llim = specify maximum degree of spherical harmonic. llim must be at most LMAX, and all spherical harmonic degree higher than llim are ignored. + #else +/// \param[in] llim MUST be shtns->lmax. + #endif + +// MTR_DCT : <0 => SHT_NO_DCT must be defined !!! mem only transform +// 0 => dct for m=0 only +// m => dct up to m, (!!! MTR_DCT <= MTR !!!) + +3 static void GEN3(SHqst_to_spat_,ID_NME,SUFFIX)(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, long int llim) { +QX static void GEN3(SH_to_spat_,ID_NME,SUFFIX)(shtns_cfg shtns, cplx *Qlm, double *Vr, long int llim) { + #ifndef SHT_GRAD +VX static void GEN3(SHsphtor_to_spat_,ID_NME,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, long int llim) { + #else +S static void GEN3(SHsph_to_spat_,ID_NME,SUFFIX)(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, long int llim) { +T static void GEN3(SHtor_to_spat_,ID_NME,SUFFIX)(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, long int llim) { + #endif + +Q v2d *BrF; + #ifndef SHT_AXISYM +// with m>0, 3 components not possible with DCT acceleration +3 #define SHT_NO_DCT +V v2d *BtF, *BpF; +V struct DtDp *dyl; +Q cplx re,ro; +V cplx te,to, pe,po; +V cplx dte,dto, dpe,dpo; +Q #define BR0(i) ((double *)BrF)[2*(i)] +V #define BT0(i) ((double *)BtF)[2*(i)] +V #define BP0(i) ((double *)BpF)[2*(i)] + unsigned im, imlim; + int imlim_dct; + #else +S v2d *BtF; +T v2d *BpF; +Q double re,ro; +S double te,to; +T double pe,po; +Q #define BR0(i) ((double *)BrF)[i] +S #define BT0(i) ((double *)BtF)[i] +T #define BP0(i) ((double *)BpF)[i] + #endif + long int k,m,l; + #ifdef _GCC_VEC_ +QX s2d Ql0[(llim+5)>>1]; // we need some zero-padding (icc 14 bug: needs 1 more for SHT_AXISYM only!) +3 s2d Ql0[(llim+4)>>1]; // we need some zero-padding (icc 14 bug: needs 1 more for SHT_AXISYM only!). +S s2d Sl0[(llim+3)>>1]; // we need some zero-padding (icc 14 bug: needs 1 more for SHT_AXISYM only!). +T s2d Tl0[(llim+3)>>1]; // we need some zero-padding (icc 14 bug: needs 1 more for SHT_AXISYM only!). + #endif + + #ifndef SHT_AXISYM +Q BrF = (v2d *) Vr; +V BtF = (v2d *) Vt; BpF = (v2d *) Vp; + if (shtns->ncplx_fft > 0) { // alloc memory for the FFT +QX BrF = VMALLOC( shtns->ncplx_fft * sizeof(cplx) ); +VX BtF = VMALLOC( 2* shtns->ncplx_fft * sizeof(cplx) ); +VX BpF = BtF + shtns->ncplx_fft; +3 BrF = VMALLOC( 3* shtns->ncplx_fft * sizeof(cplx) ); +3 BtF = BrF + shtns->ncplx_fft; BpF = BtF + shtns->ncplx_fft; + } + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #ifndef SHT_NO_DCT + imlim_dct = MTR_DCT; + #ifdef SHT_VAR_LTR + if (imlim_dct > imlim) imlim_dct = imlim; + #endif + #endif + #else + #ifdef SHT_GRAD +S if (Vp != NULL) { k=0; do { ((s2d*)Vp)[k]=vdup(0.0); } while(++kykm_dct[0]; +V s2d* dyl0 = (s2d*) shtns->dykm_dct[0]; // only theta derivative (d/dphi = 0 for m=0) + #ifndef _GCC_VEC_ +Q double* Ql = (double*) Qlm; +S double* Sl = (double*) Slm; +T double* Tl = (double*) Tlm; +Q re = 0.0; ro = 0.0; +QE re = yl[0] * Ql[0]; +QO ro = yl[1] * Ql[2]; +Q yl+=2; + k=0; l = 2; + do { +S te = 0.0; to = 0.0; +T pe = 0.0; po = 0.0; +SO te = dyl0[0] * Sl[2*l-2]; // l-1 +TE pe = -dyl0[0] * Tl[2*l-2]; // l-1 +V ++dyl0; + while(l>1) - (llim>>1))*2; +V dyl0 += (((LMAX+1)>>1) - ((llim+1)>>1))*2; + #endif + k+=2; + l = k; + } while (k<=llim+1); + #else +Q s2d r = yl[0] * Ql0[0]; // first Q [l=0 and 1] + l=0; k=0; + do { + l >>= 1; // l = l/2; +S s2d t = vdup(0.0); +T s2d p = vdup(0.0); +QX s2d r1 = vdup(0.0); + do { +Q r += yl[l+1] * Ql0[l+1]; // { re, ro } +S t += dyl0[l] * Sl0[l]; // { te, to } +T p -= dyl0[l] * Tl0[l]; // { pe, po } +V ++l; +QX r1 += yl[l+2] * Ql0[l+2]; // { re, ro } +QX l+=2; +QX } while(2*l < llim-1); // 2*(l+1) <= llim +V } while(2*l < llim); +QX r += r1; +Q yl += (LMAX -k)>>1; +V dyl0 += (LMAX+1 -k)>>1; + #ifndef SHT_AXISYM +Q BR0(k) = vlo_to_dbl(r); BR0(k+1) = vhi_to_dbl(r); +VX BT0(k) = 0.0; BT0(k+1) = 0.0; +S BT0(k) = vlo_to_dbl(t); BT0(k+1) = vhi_to_dbl(t); +VX BP0(k) = 0.0; BP0(k+1) = 0.0; +T BP0(k) = vlo_to_dbl(p); BP0(k+1) = vhi_to_dbl(p); + #else +Q *((s2d*)(((double*)BrF)+k)) = r; +S *((s2d*)(((double*)BtF)+k)) = t; +T *((s2d*)(((double*)BpF)+k)) = p; + #endif + l = k+1; + k+=2; +Q r = vdup(0.0); +QX } while (lidct,Vr, Vr); // iDCT m=0 +S fftw_execute_r2r(shtns->idct,Vt, Vt); // iDCT m=0 +T fftw_execute_r2r(shtns->idct,Vp, Vp); // iDCT m=0 +V double* st_1 = shtns->st_1; +V k=0; do { +V #ifdef _GCC_VEC_ +V v2d sin_1 = ((v2d *)st_1)[k]; +S ((v2d *)Vt)[k] *= sin_1; +T ((v2d *)Vp)[k] *= sin_1; +V #else +V double sin_1 = st_1[2*k]; double sin_2 = st_1[2*k+1]; +S Vt[2*k] *= sin_1; Vt[2*k+1] *= sin_2; +T Vp[2*k] *= sin_1; Vp[2*k+1] *= sin_2; +V #endif +V } while (++kylm[0]; +V s2d* dyl0 = (s2d*) shtns->dylm[0]; // only theta derivative (d/dphi = 0 for m=0) + do { // ops : NLAT_2 * [ (lmax-m+1) + 4] : almost twice as fast. + #ifndef _GCC_VEC_ + l=1; +Q re = yl[0] * Ql[0]; // re += ylm[im][k*(LMAX-m+1) + (l-m)] * Qlm[LiM(l,im)]; +Q ++yl; +Q ro = 0.0; +S te = 0.0; to = 0.0; +T pe = 0.0; po = 0.0; + while (l>1) - (llim>>1))*2; +V dyl0 += (((LMAX+1)>>1) - ((llim+1)>>1))*2; + #endif +Q BR0(k) = re + ro; +V #ifndef SHT_AXISYM +V BT0(k) = 0.0; BP0(k) = 0.0; // required for partial tor or sph transform +V #endif +S BT0(k) = te + to; // Bt = dS/dt +T BP0(k) = pe + po; // Bp = - dT/dt +QB BR0(NLAT-1-k) = re - ro; +VB #ifndef SHT_AXISYM +VB BT0(NLAT-1-k) = 0.0; BP0(NLAT-1-k) = 0.0; // required for partial tor or sph transform +VB #endif +SB BT0(NLAT-1-k) = te - to; +TB BP0(NLAT-1-k) = pe - po; + #else + l=0; +S s2d t = vdup(0.0); +T s2d p = vdup(0.0); +Q s2d r = vdup(0.0); +QX s2d r1 = vdup(0.0); + do { +S t += dyl0[l] * Sl0[l]; // { te, to } +T p -= dyl0[l] * Tl0[l]; // { pe, po } +Q r += yl[l] * Ql0[l]; // { re, ro } + ++l; +QX r1 += yl[l] * Ql0[l]; // reduce dependency +QX ++l; +Q } while (2*l <= llim); +VX } while (2*l < llim); +QX r += r1; +Q yl += (LMAX+2)>>1; +V dyl0 += (LMAX+1)>>1; + #if __SSE3__ + /* alternate code, which may be faster (slightly) on SSE3. */ +Q r = addi(r,r); // { re-ro , re+ro } +S t = addi(t,t); // { te-to , te+to } +T p = addi(p,p); // { pe-po , pe+po } +Q BR0(k) = vhi_to_dbl(r); +V #ifndef SHT_AXISYM +V BT0(k) = 0.0; BP0(k) = 0.0; // required for partial tor or sph transform +V #endif +S BT0(k) = vhi_to_dbl(t); // Bt = dS/dt +T BP0(k) = vhi_to_dbl(p); // Bp = - dT/dt +QB BR0(NLAT-1-k) = vlo_to_dbl(r); +VB #ifndef SHT_AXISYM +VB BT0(NLAT-1-k) = 0.0; BP0(NLAT-1-k) = 0.0; // required for partial tor or sph transform +VB #endif +SB BT0(NLAT-1-k) = vlo_to_dbl(t); +TB BP0(NLAT-1-k) = vlo_to_dbl(p); + #else +Q BR0(k) = vhi_to_dbl(r) + vlo_to_dbl(r); +V #ifndef SHT_AXISYM +V BT0(k) = 0.0; BP0(k) = 0.0; // required for partial tor or sph transform +V #endif +S BT0(k) = vhi_to_dbl(t) + vlo_to_dbl(t); // Bt = dS/dt +T BP0(k) = vhi_to_dbl(p) + vlo_to_dbl(p); // Bp = - dT/dt +QB BR0(NLAT-1-k) = vlo_to_dbl(r) - vhi_to_dbl(r); +VB #ifndef SHT_AXISYM +VB BT0(NLAT-1-k) = 0.0; BP0(NLAT-1-k) = 0.0; // required for partial tor or sph transform +VB #endif +SB BT0(NLAT-1-k) = vlo_to_dbl(t) - vhi_to_dbl(t); +TB BP0(NLAT-1-k) = vlo_to_dbl(p) - vhi_to_dbl(p); + #endif + #endif + } while (++k < NLAT_2); + } + #endif // ifndef SHT_NO_DCT + + #ifndef SHT_AXISYM + im=1; +Q BrF += NLAT; +V BtF += NLAT; BpF += NLAT; + #ifndef SHT_NO_DCT + while(im<=imlim_dct) { // dct for im <= MTR_DCT + m=im*MRES; + l = LiM(shtns, 0,im); +Q v2d* Ql = (v2d*) &Qlm[l]; // virtual pointer for l=0 and im +S v2d* Sl = (v2d*) &Slm[l]; +T v2d* Tl = (v2d*) &Tlm[l]; +Q double* yl = shtns->ykm_dct[im]; +V dyl = shtns->dykm_dct[im]; + k=0; l=m; + do { +Q v2d re = vdup(0.0); v2d ro = vdup(0.0); +V v2d te = vdup(0.0); v2d to = vdup(0.0); v2d pe = vdup(0.0); v2d po = vdup(0.0); +V v2d dte = vdup(0.0); v2d dto = vdup(0.0); v2d dpe = vdup(0.0); v2d dpo = vdup(0.0); + while(ltm[im]; + while (k BrF[im*NLAT + NLAT-(k+1)] = 0.0; +V BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); +VB BtF[NLAT-l + k] = vdup(0.0); BpF[NLAT-l + k] = vdup(0.0); // south pole zeroes + ++k; + } +Q double* yl = shtns->ylm[im]; +V dyl = shtns->dylm[im]; + do { // ops : NLAT_2 * [ (lmax-m+1)*2 + 4] : almost twice as fast. + l=m; +Q v2d re = vdup(0.0); v2d ro = vdup(0.0); +V v2d dte = vdup(0.0); v2d dto = vdup(0.0); v2d pe = vdup(0.0); v2d po = vdup(0.0); +V v2d dpe = vdup(0.0); v2d dpo = vdup(0.0); v2d te = vdup(0.0); v2d to = vdup(0.0); + while (lst[k]*m_1); +V BtF[k] = addi(dte+dto, te+to); // Bt = dS/dt + I.m/sint *T +VB BtF[NLAT-1-k] = addi(dte-dto, te-to); +3 re *= qv; ro *= qv; +V BpF[k] = addi(dpe+dpo, pe+po); // Bp = I.m/sint * S - dT/dt +VB BpF[NLAT-1-k] = addi(dpe-dpo, pe-po); +Q BrF[k] = re + ro; +QB BrF[NLAT-1-k] = re - ro; + #ifdef SHT_VAR_LTR +Q yl += (LMAX-llim); +V dyl += (LMAX-llim); + #endif + } while (++k < NLAT_2); + ++im; +Q BrF += NLAT; +V BtF += NLAT; BpF += NLAT; + } + for (k=0; k < NLAT*((NPHI>>1) -imlim); ++k) { // padding for high m's +Q BrF[k] = vdup(0.0); +V BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } +Q BrF -= NLAT*(imlim+1); // restore original pointer +V BtF -= NLAT*(imlim+1); BpF -= NLAT*(imlim+1); // restore original pointer + + // NPHI > 1 as SHT_AXISYM is not defined. + #ifndef SHT_NO_DCT +Q fftw_execute_r2r(shtns->idct,(double *) BrF, (double *) BrF); // iDCT +V fftw_execute_r2r(shtns->idct,(double *) BtF, (double *) BtF); // iDCT +V fftw_execute_r2r(shtns->idct,(double *) BpF, (double *) BpF); // iDCT +V double* st_1 = shtns->st_1; +V k=0; do { // m=0 +V double sin_1 = st_1[k]; double sin_2 = st_1[k+1]; +V ((double *)BtF)[2*k] *= sin_1; ((double *)BpF)[2*k] *= sin_1; +V ((double *)BtF)[2*k+2] *= sin_2; ((double *)BpF)[2*k+2] *= sin_2; +V k+=2; +V } while(kst_1; +Q for (im=1; im<=MTR_DCT; im+=2) { // odd m's +Q k=0; do { +Q ((v2d *)BrF)[im*NLAT + k] *= vdup(st_1[k]); ((v2d *)BrF)[im*NLAT + k+1] *= vdup(st_1[k+1]); +Q k+=2; +Q } while(kncplx_fft >= 0) { +Q fftw_execute_dft_c2r(shtns->ifft, (cplx *) BrF, Vr); +V fftw_execute_dft_c2r(shtns->ifft, (cplx *) BtF, Vt); +V fftw_execute_dft_c2r(shtns->ifft, (cplx *) BpF, Vp); + if (shtns->ncplx_fft > 0) { // free memory +Q VFREE(BrF); +VX VFREE(BtF); // this frees also BpF. + } + } + #endif + +Q #undef BR0 +V #undef BT0 +V #undef BP0 + } diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/hyb_spat_to_SH.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/hyb_spat_to_SH.gen.c new file mode 100644 index 000000000..ca193681b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/hyb_spat_to_SH.gen.c @@ -0,0 +1,513 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for 3 similar SHT functions, +# (namely spat_to_SH [Q tag]), spat_to_SHsphtor [V tag], spat_to_SH3 [both Q&V tags]) +# from one generic function + tags. +# Basically, there are tags at the beginning of lines (Q,V) that are information +# to keep or remove the line depending on the function to build. (Q for scalar, V for vector, # for comment) +# +////////////////////////////////////////////////// + #ifdef SHT_AXISYM +/// The spatial field is assumed to be \b axisymmetric (spatial size NLAT), and only the m=0 harmonics are written to output. + #endif + +/// Truncation and spatial discretization are defined by \ref shtns_create and \ref shtns_set_grid_* +/// \param[in] shtns = a configuration created by \ref shtns_create with a grid set by shtns_set_grid_* +Q/// \param[in] Vr = spatial scalar field : double array. +V/// \param[in] Vt, Vp = spatial (theta, phi) vector components : double arrays. +Q/// \param[out] Qlm = spherical harmonics coefficients : +Q/// complex double arrays of size shtns->nlm. +V/// \param[out] Slm,Tlm = spherical harmonics coefficients of \b Spheroidal and \b Toroidal scalars : +V/// complex double arrays of size shtns->nlm. + #ifdef SHT_VAR_LTR +/// \param[in] llim = specify maximum degree of spherical harmonic. llim must be at most shtns->lmax, and all spherical harmonic degree higher than llim are set to zero. + #endif + +QX static void GEN3(spat_to_SH_,ID_NME,SUFFIX)(shtns_cfg shtns, double *Vr, cplx *Qlm, long int llim) { +3 static void GEN3(spat_to_SHqst_,ID_NME,SUFFIX)(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, long int llim) { + #ifndef SHT_GRAD +VX static void GEN3(spat_to_SHsphtor_,ID_NME,SUFFIX)(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, long int llim) { + #else +S static void GEN3(spat_to_SHsph_,ID_NME,SUFFIX)(shtns_cfg shtns, double *Vt, cplx *Slm, long int llim) { +T static void GEN3(spat_to_SHtor_,ID_NME,SUFFIX)(shtns_cfg shtns, double *Vp, cplx *Tlm, long int llim) { + #endif + +Q double *zl; +V double *dzl0; +V struct DtDp *dzl; + long int i,i0, ni,l; + #ifndef SHT_AXISYM + unsigned im, imlim; +Q cplx *BrF; // contains the Fourier transformed data +V cplx *BtF, *BpF; // contains the Fourier transformed data +Q v2d reo[2*NLAT_2]; // symmetric (even) and anti-symmetric (odd) parts, interleaved. +V v2d tpeo[4*NLAT_2]; // theta and phi even and odd parts +Q #define reo0 ((double*)reo) +V #define tpeo0 ((double*)tpeo) +V #define te0(i) tpeo0[4*(i)] +V #define to0(i) tpeo0[4*(i)+1] +V #define pe0(i) tpeo0[4*(i)+2] +V #define po0(i) tpeo0[4*(i)+3] +V #define vteo0(i) tpeo[2*(i)] +V #define vpeo0(i) tpeo[2*(i)+1] + #else +Q double reo0[2*NLAT_2+2] SSE; // symmetric (even) and anti-symmetric (odd) parts, interleaved. +S double teo0[2*NLAT_2+2] SSE; +T double peo0[2*NLAT_2+2] SSE; +S #define te0(i) teo0[2*(i)] +S #define to0(i) teo0[2*(i)+1] +T #define pe0(i) peo0[2*(i)] +T #define po0(i) peo0[2*(i)+1] +S #define vteo0(i) ((s2d*) teo0)[i] +T #define vpeo0(i) ((s2d*) peo0)[i] + #endif + +QX #define ZL(i) vdup(zl[i]) +3 #define ZL(i) vdup(dzl[i].p) + +// defines how to access even and odd parts of data +Q #define re(i) reo[2*(i)] +Q #define ro(i) reo[2*(i)+1] +V #define te(i) tpeo[4*(i)] +V #define to(i) tpeo[4*(i)+1] +V #define pe(i) tpeo[4*(i)+2] +V #define po(i) tpeo[4*(i)+3] +Q #define re0(i) reo0[2*(i)+1] +Q #define ro0(i) reo0[2*(i)] + + #ifndef SHT_AXISYM +Q BrF = (cplx *) Vr; +S BtF = (cplx *) Vt; +T BpF = (cplx *) Vp; + if (shtns->ncplx_fft >= 0) { + if (shtns->ncplx_fft > 0) { // alloc memory for the FFT +QX BrF = VMALLOC( shtns->ncplx_fft * sizeof(cplx) ); +VX BtF = VMALLOC( 2* shtns->ncplx_fft * sizeof(cplx) ); +VX BpF = BtF + shtns->ncplx_fft; +3 BrF = VMALLOC( 3* shtns->ncplx_fft * sizeof(cplx) ); +3 BtF = BrF + shtns->ncplx_fft; BpF = BtF + shtns->ncplx_fft; + } +Q fftw_execute_dft_r2c(shtns->fft,Vr, BrF); +V fftw_execute_dft_r2c(shtns->fft,Vt, BtF); +V fftw_execute_dft_r2c(shtns->fft,Vp, BpF); + } + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + #endif + + ni = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + // im = 0; // dzl.p = 0.0 : and evrything is REAL + #ifndef SHT_NO_DCT +V double* st_1 = shtns->st_1; + #ifndef SHT_AXISYM +Q #define BR0 ((double *)reo) +V #define BT0 ((double *)tpeo) +V #define BP0 ((double *)tpeo + NLAT) +V i=0; do { // we assume NPHI>1 (else SHT_AXISYM should be defined). +V double sin_1 = st_1[i]; +V ((double *)BtF)[i*2] *= sin_1; ((double *)BpF)[i*2] *= sin_1; +V } while (++idct_m0,(double *) BrF, BR0); // DCT out-of-place. +V fftw_execute_r2r(shtns->dct_m0,(double *) BtF, BT0); // DCT out-of-place. +V fftw_execute_r2r(shtns->dct_m0,(double *) BpF, BP0); // DCT out-of-place. + #else +Q #define BR0 reo0 +S #define BT0 teo0 +T #define BP0 peo0 +V i=0; do { +V #ifdef _GCC_VEC_ +V s2d sin_1 = ((s2d *)st_1)[i]; +S ((s2d*) Vt)[i] *= sin_1; +T ((s2d*) Vp)[i] *= sin_1; +V #else +V double sin_1 = st_1[2*i]; double sin_2 = st_1[2*i+1]; +S Vt[2*i] *= sin_1; Vt[2*i+1] *= sin_2; +T Vp[2*i] *= sin_1; Vp[2*i+1] *= sin_2; +V #endif +V } while (++idct_m0,Vr, BR0); // DCT out-of-place. +S fftw_execute_r2r(shtns->dct_m0,Vt, BT0); // DCT out-of-place. +T fftw_execute_r2r(shtns->dct_m0,Vp, BP0); // DCT out-of-place. + #endif + l=0; + long int klim = shtns->klim; + #ifdef SHT_VAR_LTR + i = (llim * SHT_NL_ORDER) + 2; // sum truncation + if (i < klim) klim = i; + #endif +Q v2d* Ql = (v2d*) Qlm; +S v2d* Sl = (v2d*) Slm; +T v2d* Tl = (v2d*) Tlm; +Q zl = shtns->zlm_dct0; +V dzl0 = shtns->dzlm_dct0; +V #ifndef _GCC_VEC_ +S cplx s1 = 0.0; // l=0 : Sl = 0 +T cplx t1 = 0.0; // l=0 : Tl = 0 +V #else +S v2d s = vdup(0.0); // l=0 : Sl = 0 +T v2d t = vdup(0.0); // l=0 : Tl = 0 +V #endif +QX BR0[klim] = 0; BR0[klim+1] = 0; // allow some overflow. + #ifdef SHT_VAR_LTR + while(l < llim) { + #else + do { // l < LMAX + #endif + i=l; // l < klim + #ifndef _GCC_VEC_ +S Sl[l] = s1; +T Tl[l] = t1; +Q cplx q0 = 0.0; cplx q1 = 0.0; +S cplx s0 = 0.0; s1 = 0.0; +T cplx t0 = 0.0; t1 = 0.0; + do { +Q q0 += BR0[i] * zl[i]; +Q q1 += BR0[i+1] * zl[i+1]; +S s0 += BT0[i] * dzl0[i]; +T t0 -= BP0[i] * dzl0[i]; +S s1 += BT0[i+1] * dzl0[i+1]; +T t1 -= BP0[i+1] * dzl0[i+1]; + i+=2; + } while(i>= 1; // i = i/2 + do { +Q q += ((s2d*) zl)[i] * ((s2d*) BR0)[i]; +S s += ((s2d*) dzl0)[i] * ((s2d*) BT0)[i]; +T t -= ((s2d*) dzl0)[i] * ((s2d*) BP0)[i]; + ++i; +QX q1 += ((s2d*) zl)[i] * ((s2d*) BR0)[i]; +QX ++i; + } while(2*i < klim); +QX q += q1; +Q Ql[l] = vlo_to_cplx(q); Ql[l+1] = vhi_to_cplx(q); +S Sl[l+1] = vlo_to_cplx(s); +T Tl[l+1] = vlo_to_cplx(t); + #endif + l+=2; +Q zl += (shtns->klim - l); +V dzl0 += (shtns->klim -l); + #ifndef SHT_VAR_LTR + } while(lzlm[0]; + // stride of source data : we assume NPHI>1 (else SHT_AXISYM should be defined). + #ifndef SHT_AXISYM +Q #define BR0(i) ((double*)BrF)[(i)*2] +S #define BT0(i) ((double*)BtF)[(i)*2] +T #define BP0(i) ((double*)BpF)[(i)*2] + #else +Q #define BR0(i) Vr[i] +S #define BT0(i) Vt[i] +T #define BP0(i) Vp[i] + #endif + #if _GCC_VEC_ && __SSE3__ +Q s2d r0v = vdup(0.0); + do { // compute symmetric and antisymmetric parts. +Q s2d a = vdup(BR0(i)); s2d b = vdup(BR0(NLAT-1-i)); +QX s2d g = vdup(BR0(i+1)); s2d h = vdup(BR0(NLAT-2-i)); +Q a = subadd(a,b); +QX g = subadd(g,h); +Q ((s2d*) reo0)[i] = a; // assume odd is first, then even. +3 r0v += vdup(zl[i]) * a; // even part is used. +QX ((s2d*) reo0)[i+1] = g; // assume odd is first, then even. +QX a = _mm_unpackhi_pd(a, g); +QX r0v += *((s2d*)(zl+i)) * a; // even part is used, reduce data dependency +S s2d c = vdup(BT0(i)); s2d d = vdup(BT0(NLAT-1-i)); +S c = subadd(c,d); vteo0(i) = vxchg(c); +T s2d e = vdup(BP0(i)); s2d f = vdup(BP0(NLAT-1-i)); +T e = subadd(e,f); vpeo0(i) = vxchg(e); +V ++i; +QX i+=2; + } while(idzlm[0]; // only theta derivative (d/dphi = 0 for m=0) +S Sl[0] = vdup(0.0); // l=0 is zero for the vector transform. +T Tl[0] = vdup(0.0); // l=0 is zero for the vector transform. + #ifdef SHT_VAR_LTR + while (ltm[im]; + i=i0; + do { // compute symmetric and antisymmetric parts. +3 s2d sin = vdup(shtns->st[i]); +3 v2d q0 = ((v2d *)BrF)[i]; v2d q1 = ((v2d *)BrF)[NLAT-1-i]; re(i) = (q0+q1)*sin; ro(i) = (q0-q1)*sin; +QX v2d q0 = ((v2d *)BrF)[i]; v2d q1 = ((v2d *)BrF)[NLAT-1-i]; re(i) = q0+q1; ro(i) = q0-q1; +V v2d t0 = ((v2d *)BtF)[i]; v2d t1 = ((v2d *)BtF)[NLAT-1-i]; te(i) = t0+t1; to(i) = t0-t1; +V v2d s0 = ((v2d *)BpF)[i]; v2d s1 = ((v2d *)BpF)[NLAT-1-i]; pe(i) = s0+s1; po(i) = s0-s1; + } while (++izlm[im]; +V dzl = shtns->dzlm[im]; + while (lnlm); + } + #endif + + if (shtns->ncplx_fft > 0) { // free memory +Q VFREE(BrF - NLAT*imlim); +VX VFREE(BtF - NLAT*imlim); // this frees also BpF. + } + #endif + +Q #undef ZL +Q #undef re +Q #undef ro +V #undef te +V #undef to +V #undef pe +V #undef po +Q #undef re0 +Q #undef ro0 +V #undef te0 +V #undef to0 +V #undef pe0 +V #undef po0 +Q #undef reo0 +V #undef teo0 +V #undef peo0 +Q #undef reo0 +V #undef tpeo0 +V #undef vteo0 +V #undef vpeo0 + } diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/kernel_spat_to_SH.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/kernel_spat_to_SH.gen.c new file mode 100644 index 000000000..0be125ee7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/kernel_spat_to_SH.gen.c @@ -0,0 +1,622 @@ +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for 3 similar SHT functions, +# (namely spat_to_SH [Q tag]), spat_to_SHsphtor [V tag], spat_to_SH3 [both Q&V tags]) +# from one generic function + tags. +# Basically, there are tags at the beginning of lines (Q,V) that are information +# to keep or remove the line depending on the function to build. (Q for scalar, V for vector, # for comment) +# +////////////////////////////////////////////////// + + #ifdef HI_LLIM +QX #define BASE _an1_hi +VX #define BASE _an2_hi +3 #define BASE _an3_hi + #else +QX #define BASE _an1 +VX #define BASE _an2 +3 #define BASE _an3 + #endif + +QX void GEN3(BASE,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim) +VX void GEN3(BASE,NWAY,SUFFIX)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim) +3 void GEN3(BASE,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim) + { + // TODO: NW should be larger for SHTNS_ISHIOKA ?, or take a different approach. + #define NW (NWAY*16) + // another blocking level in theta (64 or 128 should be good) + #define NBLK (NWAY*16) //24 //(NWAY*3) //24 //96 // (NWAY*3) //24 + // LSPAN can be 2 or 4 +QX #define LSPAN 4 +V #define LSPAN 2 + + double *alm, *al; + double *wg, *ct, *st; +V double *l_2; + long int nk, k, l,m; + unsigned m0, mstep; + #ifndef SHT_AXISYM + unsigned im; + #endif +V int robert_form; +Q v2d qq[llim+2]; +V v2d vw[2*llim+4]; + + // the SSE macro should align these arrays on vector length. +Q double rer[NLAT_2 + NW*VSIZE2] SSE; +Q double ror[NLAT_2 + NW*VSIZE2] SSE; +V double ter[NLAT_2 + NW*VSIZE2] SSE; +V double tor[NLAT_2 + NW*VSIZE2] SSE; +V double per[NLAT_2 + NW*VSIZE2] SSE; +V double por[NLAT_2 + NW*VSIZE2] SSE; + #ifndef SHT_AXISYM +Q double rei[NLAT_2 + NW*VSIZE2] SSE; +Q double roi[NLAT_2 + NW*VSIZE2] SSE; +V double tei[NLAT_2 + NW*VSIZE2] SSE; +V double toi[NLAT_2 + NW*VSIZE2] SSE; +V double pei[NLAT_2 + NW*VSIZE2] SSE; +V double poi[NLAT_2 + NW*VSIZE2] SSE; + #endif + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; +V robert_form = shtns->robert_form; +V l_2 = shtns->l_2; + for (k=nk*VSIZE2; k<(nk-1+NW)*VSIZE2; ++k) { // never written, so this is now done for all m's +Q rer[k] = 0.0; ror[k] = 0.0; +V ter[k] = 0.0; tor[k] = 0.0; +V per[k] = 0.0; por[k] = 0.0; + #ifndef SHT_AXISYM +Q rei[k] = 0.0; roi[k] = 0.0; +V tei[k] = 0.0; toi[k] = 0.0; +V pei[k] = 0.0; poi[k] = 0.0; + #endif + } + + // ACCESS PATTERN + const int k_inc = shtns->k_stride_a; + const int m_inc = shtns->m_stride_a; + + #ifndef _OPENMP + m0 = 0; mstep = 1; + #else + m0 = omp_get_thread_num(); + mstep = omp_get_num_threads(); + if (m0 == 0) + #endif + { // im=0 : dzl.p = 0.0 and evrything is REAL + alm = shtns->blm; +Q double r0 = 0.0; + // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) +Q SYM_ASYM_M0_Q(BrF, rer, ror, r0) +V SYM_ASYM_M0_V(BtF, ter, tor) +V SYM_ASYM_M0_V(BpF, per, por) +Q Qlm[0] = r0 * alm[0]; // l=0 is done. +V Slm[0] = 0.0; Tlm[0] = 0.0; // l=0 is zero for the vector transform. + k = 0; +Q double* q_ = (double*) qq; +V double* v_ = (double*) vw; + for (l=0;lst_1, k+j); +V terk[j] *= st_1; tork[j] *= st_1; +V perk[j] *= st_1; pork[j] *= st_1; +V } +V } + al+=2; l=1; + while(l= imlim + l = LiM(shtns, imlim*MRES, imlim); + do { +Q ((v2d*)Qlm)[l] = vdup(0.0); +V ((v2d*)Slm)[l] = vdup(0.0); ((v2d*)Tlm)[l] = vdup(0.0); + } while(++l < shtns->nlm); + } + #endif + #endif + m0=mstep; + } + + #ifndef SHT_AXISYM + const double mpos_scale = shtns->mpos_scale_analys; // handles real-norm + for (im=m0; imtm[im] / VSIZE2; + #ifndef SHTNS_ISHIOKA + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + #else + alm = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; + #endif + // compute symmetric and anti-symmetric parts: + #ifndef SHTNS_ISHIOKA +QX SYM_ASYM_Q(BrF, rer, ror, rei, roi, k0) +3 SYM_ASYM_Q3(BrF, rer, ror, rei, roi, k0) +V SYM_ASYM_V(BtF, ter, tor, tei, toi, k0) +V SYM_ASYM_V(BpF, per, por, pei, poi, k0) + #else +QX SYM_ASYM_Q_ISH(BrF, rer, ror, rei, roi, k0) +3 SYM_ASYM_Q3_ISH(BrF, rer, ror, rei, roi, k0) +V SYM_ASYM_V_ISH(BtF, ter, tor, tei, toi, k0) +V SYM_ASYM_V_ISH(BpF, per, por, pei, poi, k0) + #endif + + for (int l=0; l<=llim-m+1; l++) { +Q qq[l] = vdup(0.0); +V vw[2*l] = vdup(0.0); vw[2*l+1] = vdup(0.0); + } + int k = nk; do { + k -= NBLK; +Q v2d* q = qq; +V v2d* v = vw; + rnd y01ct[NBLK][3]; // [0] = y0, [1] = y1, [2] = cos(theta)^2 + #ifdef HI_LLIM + int ny[NBLK/NWAY]; // exponent to extend double precision range. + int lnz = llim; // apriori, we go up to llim. + #endif + int imin = (k=imin; i-=NWAY) { // iterate over blocks, start from the right-most (IMPORTANT!) + rnd y0[NWAY], cost[NWAY]; // should fit in registers + for (int j=0; j>= 1); + #else /* HI_LLIM */ + { int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny0 += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny0--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #endif + rnd y1[NWAY]; + al = alm; + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny0; + for (int j=0; j llim) && (ny0<0)) break; // nothing more to do in this block. +V if ((l > llim+1) && (ny0<0)) break; // nothing more to do in this block. + lnz = l; // record the minimum l for significant values, over this block, do not go above that afterwards + #endif + for (int j=0; j 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; ist_1, k+i); +V x[i].ter *= st_1; x[i].tei *= st_1; x[i].tor *= st_1; x[i].toi *= st_1; +V x[i].per *= st_1; x[i].pei *= st_1; x[i].por *= st_1; x[i].poi *= st_1; +V } +V } + while (l SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int i=0; i 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; ist_1, k+i); +V x[i].ter *= st_1; x[i].tei *= st_1; x[i].tor *= st_1; x[i].toi *= st_1; +V x[i].per *= st_1; x[i].pei *= st_1; x[i].por *= st_1; x[i].poi *= st_1; +V } +V } +QX while (l<=llim) { // compute even and odd parts +V while (l<=llim+1) { // compute even and odd parts + unsigned i = imin; + #ifdef HI_LLIM + unsigned ii = imin/NWAY; + while ((ny[ii] < 0) && (ii SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int j=0; j k0); + + l = LiM(shtns, m, im); +Q v2d *Ql = (v2d*) &Qlm[l]; +V v2d *Sl = (v2d*) &Slm[l]; +V v2d *Tl = (v2d*) &Tlm[l]; + + #ifndef SHTNS_ISHIOKA +Q for (l=0; l<=llim-m; ++l) Ql[l] = qq[l]; + #else + // post-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->x2lm + 3*im*(2*(LMAX+4) -m+MRES)/4; +Q ishioka_to_SH(xlm, qq, llim-m, Ql); +V ishioka_to_SH2(xlm, vw, llim-m+1, vw); + #endif + +V SH_2scal_to_vect(shtns->mx_van + 2*LM(shtns,m,m), l_2, llim, m, vw, Sl, Tl); + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { +Q Ql[l] = vdup(0.0); +V Sl[l] = vdup(0.0); Tl[l] = vdup(0.0); + } + #endif + } + #endif + } + + #undef BASE + #undef LSPAN diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/omp_SH_to_spat.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/omp_SH_to_spat.gen.c new file mode 100644 index 000000000..61c3f9257 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/omp_SH_to_spat.gen.c @@ -0,0 +1,519 @@ +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for similar SHT functions, +# from one generic function + tags. +# > See Makefile and SHT.c +# Basically, there are tags at the beginning of lines that are information +# to keep or remove the line depending on the function to build. +# tags : +# Q : line for scalar transform +# V : line for vector transform (both spheroidal and toroidal) +# S : line for vector transfrom, spheroidal component +# T : line for vector transform, toroidal component. + + static +3 void GEN3(_sy3o,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, v2d *BrF, v2d *BtF, v2d *BpF, const long int llim, const int imlim) { +QX void GEN3(_sy1o,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, v2d *BrF, long int llim, const int imlim) { + #ifndef SHT_GRAD +VX void GEN3(_sy2o,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, v2d *BtF, v2d *BpF, const long int llim, const int imlim) { + #else +S void GEN3(_sy1os,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, v2d *BtF, v2d *BpF, const long int llim, const int imlim) { +T void GEN3(_sy1ot,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Tlm, v2d *BtF, v2d *BpF, const long int llim, const int imlim) { + #endif + + #if !defined( _GCC_VEC_ ) && (NWAY & 1) + #error "NWAY must be even when compiled without explicit vectorization." + #endif + + #ifndef SHT_AXISYM + #ifndef SHTNS_ISHIOKA +Q #define qr(l) vall(creal(Ql[l])) +Q #define qi(l) vall(cimag(Ql[l])) + #else +Q #define qr(l) vall( ((double*) QQl)[2*(l)] ) +Q #define qi(l) vall( ((double*) QQl)[2*(l)+1] ) + #endif +V #define vr(l) vall( ((double*) VWl)[4*(l)] ) +V #define vi(l) vall( ((double*) VWl)[4*(l)+1] ) +V #define wr(l) vall( ((double*) VWl)[4*(l)+2] ) +V #define wi(l) vall( ((double*) VWl)[4*(l)+3] ) + unsigned im; + #endif + unsigned m0, mstep; + long int nk,k,l,m; + double *alm, *al; + double *ct, *st; +V int robert_form; +QX double Ql0[llim+2]; +V v2d VWl[llim*2+4]; + #ifdef SHTNS_ISHIOKA + v2d QQl[llim+2]; + #endif + + ct = shtns->ct; st = shtns->st; + nk = NLAT_2; + #if _GCC_VEC_ + nk = ((unsigned)(nk+VSIZE2-1)) / VSIZE2; + #endif +V robert_form = shtns->robert_form; + + #ifndef _OPENMP + m0 = 0; mstep = 1; + #else + m0 = omp_get_thread_num(); + mstep = omp_get_num_threads(); + if (m0 == 0) + #endif + { // im=0; +S double* const Sl0 = (double*) VWl; +T double* const Tl0 = (double*) VWl + llim+2; +3 double* const Ql0 = (double*) (VWl + llim+2); + #ifdef SHT_GRAD + #ifndef SHT_AXISYM +S k=0; do { BpF[k]=vdup(0.0); } while(++kalm; +Q Ql0[0] = (double) Qlm[0]; // l=0 + do { // for m=0, compress the complex Q,S,T to double +Q Ql0[l] = creal( Qlm[l] ); // Ql[l+1] = (double) Qlm[l+1]; +S Sl0[l-1] = creal( Slm[l] ); // Sl[l] = (double) Slm[l+1]; +T Tl0[l-1] = creal( Tlm[l] ); // Tl[l] = (double) Tlm[l+1]; + ++l; + } while(l<=llim); + k=0; + do { + l=0; al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; +V rnd sint[NWAY], dy0[NWAY], dy1[NWAY]; +Q rnd re[NWAY], ro[NWAY]; +S rnd te[NWAY], to[NWAY]; +T rnd pe[NWAY], po[NWAY]; + for (int j=0; j=nk) break; +Q S2D_STORE_4MAGIC((double*)BrF, j+k, re[j], ro[j]); +S S2D_STORE_4MAGIC((double*)BtF, j+k, te[j], to[j]); +T S2D_STORE_4MAGIC((double*)BpF, j+k, pe[j], po[j]); + } + #endif + k+=NWAY; + } while (k < nk); + m0=mstep; + } + + #ifndef SHT_AXISYM +Q BrF += m0*NLAT_2; +V BtF += m0*NLAT_2; BpF += m0*NLAT_2; + for (im=m0; im>1; //l = LiM(shtns, 0,im); + #ifndef SHTNS_ISHIOKA + alm = shtns->alm + 2*(l+m); // shtns->alm + im*(2*(LMAX+1) -m+MRES); + #else + alm = shtns->clm + (l+m); // shtns->clm + im*(2*(LMAX+1) -m+MRES)/2; + #endif + + #ifndef SHT_GRAD +V SH_vect_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], &Tlm[l], (cplx*) VWl); + #else +S SHsph_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Slm[l], (cplx*) VWl); +T SHtor_to_2scal(shtns->mx_stdt + 2*l, llim, m, &Tlm[l], (cplx*) VWl); + #endif + + #ifndef SHTNS_ISHIOKA +Q cplx* Ql = &Qlm[l]; // virtual pointer for l=0 and im + #else + // pre-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; +Q v2d* Ql = (v2d*) &Qlm[l]; // virtual pointer for l=0 and im +Q SH_to_ishioka(xlm, Ql+m, llim-m, QQl+m); +V SH2_to_ishioka(xlm, VWl+2*m, llim-m+1); + #endif + + k=0; l=shtns->tm[im]; + l>>=1; // stay on a 16 byte boundary + while (k>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + al = alm; + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; j=nk) break; +Q S2D_CSTORE_4MAGIC((double*)BrF, (double*) (BrF + (NPHI-2*im)*NLAT_2), k+j, rer[j], ror[j], rei[j], roi[j]); +V S2D_CSTORE_4MAGIC((double*)BtF, (double*) (BtF + (NPHI-2*im)*NLAT_2), k+j, ter[j], tor[j], tei[j], toi[j]); +V S2D_CSTORE_4MAGIC((double*)BpF, (double*) (BpF + (NPHI-2*im)*NLAT_2), k+j, per[j], por[j], pei[j], poi[j]); + } + #endif + k+=NWAY; + } while (k < nk); +Q BrF += mstep*NLAT_2; +V BtF += mstep*NLAT_2; BpF += mstep*NLAT_2; + } + + while(im <= NPHI-imlim) { // padding for high m's + k=0; + do { +Q BrF[k] = vdup(0.0); +V BtF[k] = vdup(0.0); BpF[k] = vdup(0.0); + } while (++k < NLAT_2); +Q BrF += mstep*NLAT_2; +V BtF += mstep*NLAT_2; BpF += mstep*NLAT_2; + im+=mstep; + } + #endif +} + +Q #undef qr +Q #undef qi +S #undef sr +S #undef si +T #undef tr +T #undef ti + +3 static void GEN3(SHqst_to_spat_omp,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, long int llim) { +QX static void GEN3(SH_to_spat_omp,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Qlm, double *Vr, long int llim) { + #ifndef SHT_GRAD +VX static void GEN3(SHsphtor_to_spat_omp,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, long int llim) { + #else +S static void GEN3(SHsph_to_spat_omp,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, long int llim) { +T static void GEN3(SHtor_to_spat_omp,NWAY,SUFFIX)(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, long int llim) { + #endif + + unsigned imlim = 0; +Q v2d* BrF = (v2d*) Vr; +V v2d* BtF = (v2d*) Vt; v2d* BpF = (v2d*) Vp; + + #ifndef SHT_AXISYM + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + if (shtns->fftc_mode > 0) { // alloc memory for the FFT + unsigned long nv = shtns->nspat; +QX BrF = (v2d*) VMALLOC( nv * sizeof(double) ); +VX BtF = (v2d*) VMALLOC( 2*nv * sizeof(double) ); +VX BpF = BtF + nv/2; +3 BrF = (v2d*) VMALLOC( 3*nv * sizeof(double) ); +3 BtF = BrF + nv/2; BpF = BrF + nv; + } + #endif + imlim += 1; + + #pragma omp parallel num_threads(shtns->nthreads) + { +3 GEN3(_sy3o,NWAY,SUFFIX)(shtns, Qlm, Slm, Tlm, BrF, BtF, BpF, llim, imlim); +QX GEN3(_sy1o,NWAY,SUFFIX)(shtns, Qlm, BrF, llim, imlim); + #ifndef SHT_GRAD +VX GEN3(_sy2o,NWAY,SUFFIX)(shtns, Slm, Tlm, BtF, BpF, llim, imlim); + #else +S GEN3(_sy1os,NWAY,SUFFIX)(shtns, Slm, BtF, BpF, llim, imlim); +T GEN3(_sy1ot,NWAY,SUFFIX)(shtns, Tlm, BtF, BpF, llim, imlim); + #endif + + + #ifndef SHT_AXISYM +V #ifndef HAVE_LIBFFTW3_OMP +V #pragma omp barrier +V if (shtns->fftc_mode >= 0) { +V if (shtns->fftc_mode != 1) { +3 #pragma omp single nowait +3 fftw_execute_dft(shtns->ifftc, (cplx *) BrF, (cplx *) Vr); +V #pragma omp single nowait +V fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); +V #pragma omp single nowait +V fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); +V } else { // split dft +3 #pragma omp single nowait +3 fftw_execute_split_dft(shtns->ifftc,((double*)BrF)+1, ((double*)BrF), Vr+NPHI, Vr); +V #pragma omp single nowait +V fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); +V #pragma omp single nowait +V fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); +V } +V } +V #endif + #endif + + } + + #ifndef SHT_AXISYM + // NPHI > 1 as SHT_AXISYM is not defined. + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { +V #ifdef HAVE_LIBFFTW3_OMP +Q fftw_execute_dft(shtns->ifftc, (cplx *) BrF, (cplx *) Vr); +V fftw_execute_dft(shtns->ifftc, (cplx *) BtF, (cplx *) Vt); +V fftw_execute_dft(shtns->ifftc, (cplx *) BpF, (cplx *) Vp); +V #endif + } else { // split dft +V #ifdef HAVE_LIBFFTW3_OMP +Q fftw_execute_split_dft(shtns->ifftc,((double*)BrF)+1, ((double*)BrF), Vr+NPHI, Vr); +V fftw_execute_split_dft(shtns->ifftc,((double*)BtF)+1, ((double*)BtF), Vt+NPHI, Vt); +V fftw_execute_split_dft(shtns->ifftc,((double*)BpF)+1, ((double*)BpF), Vp+NPHI, Vp); +V #endif +Q VFREE(BrF); +VX VFREE(BtF); // this frees also BpF. + } + } + #endif + + } diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/omp_spat_to_SH.gen.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/omp_spat_to_SH.gen.c new file mode 100644 index 000000000..783eac795 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/omp_spat_to_SH.gen.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +# This file is meta-code for SHT.c (spherical harmonic transform). +# it is intended for "make" to generate C code for 3 similar SHT functions, +# (namely spat_to_SH [Q tag]), spat_to_SHsphtor [V tag], spat_to_SH3 [both Q&V tags]) +# from one generic function + tags. +# Basically, there are tags at the beginning of lines (Q,V) that are information +# to keep or remove the line depending on the function to build. (Q for scalar, V for vector, # for comment) +# +////////////////////////////////////////////////// + +QX void GEN3(_an1,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim); +VX void GEN3(_an2,NWAY,SUFFIX)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); +3 void GEN3(_an3,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); +QX void GEN3(_an1_hi,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim); +VX void GEN3(_an2_hi,NWAY,SUFFIX)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); +3 void GEN3(_an3_hi,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); + + + + static +QX void GEN3(spat_to_SH_omp,NWAY,SUFFIX)(shtns_cfg shtns, double *Vr, cplx *Qlm, long int llim) { +VX void GEN3(spat_to_SHsphtor_omp,NWAY,SUFFIX)(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, long int llim) { +3 void GEN3(spat_to_SHqst_omp,NWAY,SUFFIX)(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, long int llim) { + +Q double *BrF; // contains the Fourier transformed data +V double *BtF, *BpF; // contains the Fourier transformed data + unsigned imlim=0; + +Q BrF = Vr; +V BtF = Vt; BpF = Vp; + #ifndef SHT_AXISYM + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode > 0) { // alloc memory for out-of-place FFT + unsigned long nv = shtns->nspat; +QX BrF = (double*) VMALLOC( nv * sizeof(double) ); +VX BtF = (double*) VMALLOC( 2*nv * sizeof(double) ); +VX BpF = BtF + nv; +3 BrF = (double*) VMALLOC( 3*nv * sizeof(double) ); +3 BtF = BrF + nv; BpF = BtF + nv; + } + if (shtns->fftc_mode != 1) { // regular FFT +Q fftw_execute_dft(shtns->fftc,(cplx*)Vr, (cplx*)BrF); +V fftw_execute_dft(shtns->fftc,(cplx*)Vt, (cplx*)BtF); +V fftw_execute_dft(shtns->fftc,(cplx*)Vp, (cplx*)BpF); + } else { // split FFT +Q fftw_execute_split_dft(shtns->fftc, Vr+NPHI, Vr, BrF+1, BrF); +V fftw_execute_split_dft(shtns->fftc, Vt+NPHI, Vt, BtF+1, BtF); +V fftw_execute_split_dft(shtns->fftc, Vp+NPHI, Vp, BpF+1, BpF); + } + } + #endif + imlim += 1; + + if (llim < SHT_L_RESCALE_FLY) { + #pragma omp parallel num_threads(shtns->nthreads) + { +QX GEN3(_an1,NWAY,SUFFIX)(shtns, BrF, Qlm, llim, imlim); +VX GEN3(_an2,NWAY,SUFFIX)(shtns, BtF, BpF, Slm, Tlm, llim, imlim); +3 GEN3(_an3,NWAY,SUFFIX)(shtns, BrF, BtF, BpF, Qlm, Slm, Tlm, llim, imlim); + } + } else { + #pragma omp parallel num_threads(shtns->nthreads) + { +QX GEN3(_an1_hi,NWAY,SUFFIX)(shtns, BrF, Qlm, llim, imlim); +VX GEN3(_an2_hi,NWAY,SUFFIX)(shtns, BtF, BpF, Slm, Tlm, llim, imlim); +3 GEN3(_an3_hi,NWAY,SUFFIX)(shtns, BrF, BtF, BpF, Qlm, Slm, Tlm, llim, imlim); + } + } + + #ifndef SHT_AXISYM + if (shtns->fftc_mode > 0) { // free memory +Q VFREE(BrF); +VX VFREE(BtF); // this frees also BpF. + } + #endif + + } + + #undef LSPAN diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SH_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SH_fly.c new file mode 100644 index 000000000..07963c233 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SH_fly.c @@ -0,0 +1,295 @@ +// This file was automatically generated by 'make' from file 'fly_spat_to_SH.gen.c'. +// To modify it, please consider modifying fly_spat_to_SH.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +////////////////////////////////////////////////// + + + void GEN3(_an1,NWAY,_l)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim); + void GEN3(_an1_hi,NWAY,_l)(shtns_cfg shtns, double *BrF, cplx *Qlm, const long int llim, const int imlim); + + + static void GEN3(spat_to_SH_fly,NWAY,SUFFIX)(shtns_cfg shtns, double *Vr, cplx *Qlm, const long int llim) { + + + double *BrF; // contains the Fourier transformed data + unsigned imlim=0; + + BrF = Vr; + #ifndef SHT_AXISYM + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode > 0) { // alloc memory for out-of-place FFT + unsigned long nv = shtns->nspat; + BrF = (double*) VMALLOC( nv * sizeof(double) ); + } + if (shtns->fftc_mode != 1) { // regular FFT + fftw_execute_dft(shtns->fftc,(cplx*)Vr, (cplx*)BrF); + } else { // split FFT + fftw_execute_split_dft(shtns->fftc, Vr+NPHI, Vr, BrF+1, BrF); + } + } + #else + imlim = 0; + #endif + imlim += 1; + + if (llim < SHT_L_RESCALE_FLY) { + GEN3(_an1,NWAY,_l)(shtns, BrF, Qlm, llim, imlim); + } else { + GEN3(_an1_hi,NWAY,_l)(shtns, BrF, Qlm, llim, imlim); + } + + #ifndef SHT_AXISYM + if (shtns->fftc_mode > 0) { // free memory + VFREE(BrF); + } + #endif + + } + + + #ifndef SHT_AXISYM + + static void GEN3(spat_to_SH_m_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Vr, cplx *Qlm, long int llim) { + + double *alm, *al; + double *wg, *ct, *st; + long int nk, k, l,m; + double alm0_rescale; + rnd qq[2*llim+4]; + + double rer[NLAT_2 + NWAY*VSIZE2] SSE; + double ror[NLAT_2 + NWAY*VSIZE2] SSE; + double rei[NLAT_2 + NWAY*VSIZE2] SSE; + double roi[NLAT_2 + NWAY*VSIZE2] SSE; + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { + rer[k] = 0.0; ror[k] = 0.0; + } + + if (im == 0) { // im=0 + alm = shtns->blm; + double r0 = 0.0; + k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + #ifndef SHTNS4MAGIC + double n = creal(Vr[k]); double s = creal(Vr[NLAT-1-k]); + #else + double n = creal(Vr[2*k]); double s = creal(Vr[2*k+1]); + #endif + rer[k] = n+s; ror[k] = n-s; + r0 += (n+s)*wg[k]; + } while(++k < nk*VSIZE2); + alm0_rescale = alm[0] * shtns->nphi; // alm[0] takes into account the fftw normalization, *nphi cancels it + Qlm[0] = r0 * alm0_rescale; // l=0 is done. + k = 0; + for (l=0;l 0 + im = abs(im); // positive im + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { + rei[k] = 0.0; roi[k] = 0.0; + } + + m = im*MRES; + l = shtns->tm[im] / VSIZE2; + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + k = ((l*VSIZE2)>>1)*2; // k must be even here. + do { // compute symmetric and antisymmetric parts. + #ifndef SHTNS4MAGIC + cplx n = Vr[k]; cplx s = Vr[NLAT-1-k]; + #else + cplx n = Vr[2*k]; cplx s = Vr[2*k+1]; + #endif + rer[k] = creal(n+s); rei[k] = cimag(n+s); + ror[k] = creal(n-s); roi[k] = cimag(n-s); + } while (++k=0; l--) { + q[0] = vall(0.0); q[1] = vall(0.0); q+=2; + } + alm0_rescale = alm[0] * shtns->mpos_scale_analys * (shtns->nphi*2); // handles real-norm + do { + #if _GCC_VEC_ + rnd* q = qq; + #else + double* q = (double *) qq; //Qlm; + #endif + al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd rerk[NWAY], reik[NWAY], rork[NWAY], roik[NWAY]; // help the compiler to cache into registers. + for (int j=0; j>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; jwg; ct = shtns->ct; st = shtns->st; + for (k=nk*VSIZE2; k<(nk-1+NW)*VSIZE2; ++k) { // never written, so this is now done for all m's + rer[k] = 0.0; ror[k] = 0.0; + #ifndef SHT_AXISYM + rei[k] = 0.0; roi[k] = 0.0; + #endif + } + + // ACCESS PATTERN + const int k_inc = shtns->k_stride_a; + const int m_inc = shtns->m_stride_a; + + #ifndef _OPENMP + m0 = 0; mstep = 1; + #else + m0 = omp_get_thread_num(); + mstep = omp_get_num_threads(); + if (m0 == 0) + #endif + { // im=0 : dzl.p = 0.0 and evrything is REAL + alm = shtns->blm; + double r0 = 0.0; + // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + SYM_ASYM_M0_Q(BrF, rer, ror, r0) + Qlm[0] = r0 * alm[0]; // l=0 is done. + k = 0; + double* q_ = (double*) qq; + for (l=0;l= imlim + l = LiM(shtns, imlim*MRES, imlim); + do { + ((v2d*)Qlm)[l] = vdup(0.0); + } while(++l < shtns->nlm); + } + #endif + #endif + m0=mstep; + } + + #ifndef SHT_AXISYM + const double mpos_scale = shtns->mpos_scale_analys; // handles real-norm + for (im=m0; imtm[im] / VSIZE2; + #ifndef SHTNS_ISHIOKA + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + #else + alm = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; + #endif + // compute symmetric and anti-symmetric parts: + #ifndef SHTNS_ISHIOKA + SYM_ASYM_Q(BrF, rer, ror, rei, roi, k0) + #else + SYM_ASYM_Q_ISH(BrF, rer, ror, rei, roi, k0) + #endif + + for (int l=0; l<=llim-m+1; l++) { + qq[l] = vdup(0.0); + } + int k = nk; do { + k -= NBLK; + v2d* q = qq; + rnd y01ct[NBLK][3]; // [0] = y0, [1] = y1, [2] = cos(theta)^2 + #ifdef HI_LLIM + int ny[NBLK/NWAY]; // exponent to extend double precision range. + int lnz = llim; // apriori, we go up to llim. + #endif + int imin = (k=imin; i-=NWAY) { // iterate over blocks, start from the right-most (IMPORTANT!) + rnd y0[NWAY], cost[NWAY]; // should fit in registers + for (int j=0; j>= 1); + #else /* HI_LLIM */ + { int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny0 += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny0--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #endif + rnd y1[NWAY]; + al = alm; + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny0; + for (int j=0; j llim) && (ny0<0)) break; // nothing more to do in this block. + lnz = l; // record the minimum l for significant values, over this block, do not go above that afterwards + #endif + for (int j=0; j 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; i SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int i=0; i 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; i SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int j=0; j k0); + + l = LiM(shtns, m, im); + v2d *Ql = (v2d*) &Qlm[l]; + + #ifndef SHTNS_ISHIOKA + for (l=0; l<=llim-m; ++l) Ql[l] = qq[l]; + #else + // post-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->x2lm + 3*im*(2*(LMAX+4) -m+MRES)/4; + ishioka_to_SH(xlm, qq, llim-m, Ql); + #endif + + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { + Ql[l] = vdup(0.0); + } + #endif + } + #endif + } + + #undef BASE + #undef LSPAN diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHqst_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHqst_fly.c new file mode 100644 index 000000000..2b6d2359c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHqst_fly.c @@ -0,0 +1,420 @@ +// This file was automatically generated by 'make' from file 'fly_spat_to_SH.gen.c'. +// To modify it, please consider modifying fly_spat_to_SH.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +////////////////////////////////////////////////// + + + void GEN3(_an3,NWAY,_l)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); + void GEN3(_an3_hi,NWAY,_l)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); + + + static void GEN3(spat_to_SHqst_fly,NWAY,SUFFIX)(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim) { + + + double *BrF; // contains the Fourier transformed data + double *BtF, *BpF; // contains the Fourier transformed data + unsigned imlim=0; + + BrF = Vr; + BtF = Vt; BpF = Vp; + #ifndef SHT_AXISYM + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode > 0) { // alloc memory for out-of-place FFT + unsigned long nv = shtns->nspat; + BrF = (double*) VMALLOC( 3*nv * sizeof(double) ); + BtF = BrF + nv; BpF = BtF + nv; + } + if (shtns->fftc_mode != 1) { // regular FFT + fftw_execute_dft(shtns->fftc,(cplx*)Vr, (cplx*)BrF); + fftw_execute_dft(shtns->fftc,(cplx*)Vt, (cplx*)BtF); + fftw_execute_dft(shtns->fftc,(cplx*)Vp, (cplx*)BpF); + } else { // split FFT + fftw_execute_split_dft(shtns->fftc, Vr+NPHI, Vr, BrF+1, BrF); + fftw_execute_split_dft(shtns->fftc, Vt+NPHI, Vt, BtF+1, BtF); + fftw_execute_split_dft(shtns->fftc, Vp+NPHI, Vp, BpF+1, BpF); + } + } + #else + imlim = 0; + #endif + imlim += 1; + + if (llim < SHT_L_RESCALE_FLY) { + GEN3(_an3,NWAY,_l)(shtns, BrF, BtF, BpF, Qlm, Slm, Tlm, llim, imlim); + } else { + GEN3(_an3_hi,NWAY,_l)(shtns, BrF, BtF, BpF, Qlm, Slm, Tlm, llim, imlim); + } + + #ifndef SHT_AXISYM + if (shtns->fftc_mode > 0) { // free memory + VFREE(BrF); + } + #endif + + } + + + #ifndef SHT_AXISYM + + static void GEN3(spat_to_SHqst_m_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, long int llim) { + + double *alm, *al; + double *wg, *ct, *st; + double *l_2; + long int nk, k, l,m; + double alm0_rescale; + int robert_form; + rnd qq[2*llim+4]; + rnd vw[4*llim+8]; + + double rer[NLAT_2 + NWAY*VSIZE2] SSE; + double ror[NLAT_2 + NWAY*VSIZE2] SSE; + double ter[NLAT_2 + NWAY*VSIZE2] SSE; + double tor[NLAT_2 + NWAY*VSIZE2] SSE; + double per[NLAT_2 + NWAY*VSIZE2] SSE; + double por[NLAT_2 + NWAY*VSIZE2] SSE; + double rei[NLAT_2 + NWAY*VSIZE2] SSE; + double roi[NLAT_2 + NWAY*VSIZE2] SSE; + double tei[NLAT_2 + NWAY*VSIZE2] SSE; + double toi[NLAT_2 + NWAY*VSIZE2] SSE; + double pei[NLAT_2 + NWAY*VSIZE2] SSE; + double poi[NLAT_2 + NWAY*VSIZE2] SSE; + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; + robert_form = shtns->robert_form; + l_2 = shtns->l_2; + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { + rer[k] = 0.0; ror[k] = 0.0; + ter[k] = 0.0; tor[k] = 0.0; + per[k] = 0.0; por[k] = 0.0; + } + + if (im == 0) { // im=0 + alm = shtns->blm; + k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + #ifndef SHTNS4MAGIC + double n = creal(Vt[k]); double s = creal(Vt[NLAT-1-k]); + #else + double n = creal(Vt[2*k]); double s = creal(Vt[2*k+1]); + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + ter[k] = n+s; tor[k] = n-s; + } while(++k < nk*VSIZE2); + k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + #ifndef SHTNS4MAGIC + double n = creal(Vp[k]); double s = creal(Vp[NLAT-1-k]); + #else + double n = creal(Vp[2*k]); double s = creal(Vp[2*k+1]); + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + per[k] = n+s; por[k] = n-s; + } while(++k < nk*VSIZE2); + double r0 = 0.0; + k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + #ifndef SHTNS4MAGIC + double n = creal(Vr[k]); double s = creal(Vr[NLAT-1-k]); + #else + double n = creal(Vr[2*k]); double s = creal(Vr[2*k+1]); + #endif + rer[k] = n+s; ror[k] = n-s; + r0 += (n+s)*wg[k]; + } while(++k < nk*VSIZE2); + alm0_rescale = alm[0] * shtns->nphi; // alm[0] takes into account the fftw normalization, *nphi cancels it + Slm[0] = 0.0; Tlm[0] = 0.0; // l=0 is zero for the vector transform. + Qlm[0] = r0 * alm0_rescale; // l=0 is done. + k = 0; + for (l=0;l 0 + const int ms = im*MRES; // signed m. + im = abs(im); // positive im + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { + rei[k] = 0.0; roi[k] = 0.0; + tei[k] = 0.0; toi[k] = 0.0; + pei[k] = 0.0; poi[k] = 0.0; + } + + m = im*MRES; + l = shtns->tm[im] / VSIZE2; + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + k = ((l*VSIZE2)>>1)*2; // k must be even here. + do { // compute symmetric and antisymmetric parts. + double sink = st[k]; + #ifndef SHTNS4MAGIC + cplx n = Vr[k]; cplx s = Vr[NLAT-1-k]; + #else + cplx n = Vr[2*k]; cplx s = Vr[2*k+1]; + #endif + n *= sink; s *= sink; + rer[k] = creal(n+s); rei[k] = cimag(n+s); + ror[k] = creal(n-s); roi[k] = cimag(n-s); + } while (++k>1)*2; // k must be even here. + do { // compute symmetric and antisymmetric parts. + #ifndef SHTNS4MAGIC + cplx n = Vt[k]; cplx s = Vt[NLAT-1-k]; + #else + cplx n = Vt[2*k]; cplx s = Vt[2*k+1]; + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + ter[k] = creal(n+s); tei[k] = cimag(n+s); + tor[k] = creal(n-s); toi[k] = cimag(n-s); + } while (++k>1)*2; // k must be even here. + do { // compute symmetric and antisymmetric parts. + #ifndef SHTNS4MAGIC + cplx n = Vp[k]; cplx s = Vp[NLAT-1-k]; + #else + cplx n = Vp[2*k]; cplx s = Vp[2*k+1]; + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + per[k] = creal(n+s); pei[k] = cimag(n+s); + por[k] = creal(n-s); poi[k] = cimag(n-s); + } while (++k=0; l--) { + q[0] = vall(0.0); q[1] = vall(0.0); q+=2; + v[0] = vall(0.0); v[1] = vall(0.0); + v[2] = vall(0.0); v[3] = vall(0.0); v+=4; + } + alm0_rescale = alm[0] * shtns->mpos_scale_analys * (shtns->nphi*2); // handles real-norm + do { + #if _GCC_VEC_ + rnd* q = qq; + rnd* v = vw; + #else + double* q = (double *) qq; //Qlm; + double* v = (double *) vw; + double* t = (double *) vw; + #endif + al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd rerk[NWAY], reik[NWAY], rork[NWAY], roik[NWAY]; // help the compiler to cache into registers. + rnd terk[NWAY], teik[NWAY], tork[NWAY], toik[NWAY]; + rnd perk[NWAY], peik[NWAY], pork[NWAY], poik[NWAY]; + for (int j=0; j>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; jmx_van + 2*LM(shtns,m,m), l_2, llim, ms, vw, (v2d*)Slm, (v2d*)Tlm); + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { + ((v2d*)Qlm)[l] = vdup(0.0); + ((v2d*)Slm)[l] = vdup(0.0); ((v2d*)Tlm)[l] = vdup(0.0); + } + #endif + } + + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHqst_kernel.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHqst_kernel.c new file mode 100644 index 000000000..c1335f1b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHqst_kernel.c @@ -0,0 +1,606 @@ +// This file was automatically generated by 'make' from file 'kernel_spat_to_SH.gen.c'. +// To modify it, please consider modifying kernel_spat_to_SH.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +////////////////////////////////////////////////// + + #ifdef HI_LLIM + #define BASE _an3_hi + #else + #define BASE _an3 + #endif + + void GEN3(BASE,NWAY,SUFFIX)(shtns_cfg shtns, double *BrF, double *BtF, double *BpF, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim, const int imlim) + { + // TODO: NW should be larger for SHTNS_ISHIOKA ?, or take a different approach. + #define NW (NWAY*16) + // another blocking level in theta (64 or 128 should be good) + #define NBLK (NWAY*16) //24 //(NWAY*3) //24 //96 // (NWAY*3) //24 + // LSPAN can be 2 or 4 + #define LSPAN 2 + + double *alm, *al; + double *wg, *ct, *st; + double *l_2; + long int nk, k, l,m; + unsigned m0, mstep; + #ifndef SHT_AXISYM + unsigned im; + #endif + int robert_form; + v2d qq[llim+2]; + v2d vw[2*llim+4]; + + // the SSE macro should align these arrays on vector length. + double rer[NLAT_2 + NW*VSIZE2] SSE; + double ror[NLAT_2 + NW*VSIZE2] SSE; + double ter[NLAT_2 + NW*VSIZE2] SSE; + double tor[NLAT_2 + NW*VSIZE2] SSE; + double per[NLAT_2 + NW*VSIZE2] SSE; + double por[NLAT_2 + NW*VSIZE2] SSE; + #ifndef SHT_AXISYM + double rei[NLAT_2 + NW*VSIZE2] SSE; + double roi[NLAT_2 + NW*VSIZE2] SSE; + double tei[NLAT_2 + NW*VSIZE2] SSE; + double toi[NLAT_2 + NW*VSIZE2] SSE; + double pei[NLAT_2 + NW*VSIZE2] SSE; + double poi[NLAT_2 + NW*VSIZE2] SSE; + #endif + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; + robert_form = shtns->robert_form; + l_2 = shtns->l_2; + for (k=nk*VSIZE2; k<(nk-1+NW)*VSIZE2; ++k) { // never written, so this is now done for all m's + rer[k] = 0.0; ror[k] = 0.0; + ter[k] = 0.0; tor[k] = 0.0; + per[k] = 0.0; por[k] = 0.0; + #ifndef SHT_AXISYM + rei[k] = 0.0; roi[k] = 0.0; + tei[k] = 0.0; toi[k] = 0.0; + pei[k] = 0.0; poi[k] = 0.0; + #endif + } + + // ACCESS PATTERN + const int k_inc = shtns->k_stride_a; + const int m_inc = shtns->m_stride_a; + + #ifndef _OPENMP + m0 = 0; mstep = 1; + #else + m0 = omp_get_thread_num(); + mstep = omp_get_num_threads(); + if (m0 == 0) + #endif + { // im=0 : dzl.p = 0.0 and evrything is REAL + alm = shtns->blm; + double r0 = 0.0; + // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + SYM_ASYM_M0_Q(BrF, rer, ror, r0) + SYM_ASYM_M0_V(BtF, ter, tor) + SYM_ASYM_M0_V(BpF, per, por) + Qlm[0] = r0 * alm[0]; // l=0 is done. + Slm[0] = 0.0; Tlm[0] = 0.0; // l=0 is zero for the vector transform. + k = 0; + double* q_ = (double*) qq; + double* v_ = (double*) vw; + for (l=0;lst_1, k+j); + terk[j] *= st_1; tork[j] *= st_1; + perk[j] *= st_1; pork[j] *= st_1; + } + } + al+=2; l=1; + while(l= imlim + l = LiM(shtns, imlim*MRES, imlim); + do { + ((v2d*)Qlm)[l] = vdup(0.0); + ((v2d*)Slm)[l] = vdup(0.0); ((v2d*)Tlm)[l] = vdup(0.0); + } while(++l < shtns->nlm); + } + #endif + #endif + m0=mstep; + } + + #ifndef SHT_AXISYM + const double mpos_scale = shtns->mpos_scale_analys; // handles real-norm + for (im=m0; imtm[im] / VSIZE2; + #ifndef SHTNS_ISHIOKA + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + #else + alm = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; + #endif + // compute symmetric and anti-symmetric parts: + #ifndef SHTNS_ISHIOKA + SYM_ASYM_Q3(BrF, rer, ror, rei, roi, k0) + SYM_ASYM_V(BtF, ter, tor, tei, toi, k0) + SYM_ASYM_V(BpF, per, por, pei, poi, k0) + #else + SYM_ASYM_Q3_ISH(BrF, rer, ror, rei, roi, k0) + SYM_ASYM_V_ISH(BtF, ter, tor, tei, toi, k0) + SYM_ASYM_V_ISH(BpF, per, por, pei, poi, k0) + #endif + + for (int l=0; l<=llim-m+1; l++) { + qq[l] = vdup(0.0); + vw[2*l] = vdup(0.0); vw[2*l+1] = vdup(0.0); + } + int k = nk; do { + k -= NBLK; + v2d* q = qq; + v2d* v = vw; + rnd y01ct[NBLK][3]; // [0] = y0, [1] = y1, [2] = cos(theta)^2 + #ifdef HI_LLIM + int ny[NBLK/NWAY]; // exponent to extend double precision range. + int lnz = llim; // apriori, we go up to llim. + #endif + int imin = (k=imin; i-=NWAY) { // iterate over blocks, start from the right-most (IMPORTANT!) + rnd y0[NWAY], cost[NWAY]; // should fit in registers + for (int j=0; j>= 1); + #else /* HI_LLIM */ + { int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny0 += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny0--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #endif + rnd y1[NWAY]; + al = alm; + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny0; + for (int j=0; j llim+1) && (ny0<0)) break; // nothing more to do in this block. + lnz = l; // record the minimum l for significant values, over this block, do not go above that afterwards + #endif + for (int j=0; j 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; ist_1, k+i); + x[i].ter *= st_1; x[i].tei *= st_1; x[i].tor *= st_1; x[i].toi *= st_1; + x[i].per *= st_1; x[i].pei *= st_1; x[i].por *= st_1; x[i].poi *= st_1; + } + } + while (l SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int i=0; i 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; ist_1, k+i); + x[i].ter *= st_1; x[i].tei *= st_1; x[i].tor *= st_1; x[i].toi *= st_1; + x[i].per *= st_1; x[i].pei *= st_1; x[i].por *= st_1; x[i].poi *= st_1; + } + } + while (l<=llim+1) { // compute even and odd parts + unsigned i = imin; + #ifdef HI_LLIM + unsigned ii = imin/NWAY; + while ((ny[ii] < 0) && (ii SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int j=0; j k0); + + l = LiM(shtns, m, im); + v2d *Ql = (v2d*) &Qlm[l]; + v2d *Sl = (v2d*) &Slm[l]; + v2d *Tl = (v2d*) &Tlm[l]; + + #ifndef SHTNS_ISHIOKA + for (l=0; l<=llim-m; ++l) Ql[l] = qq[l]; + #else + // post-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->x2lm + 3*im*(2*(LMAX+4) -m+MRES)/4; + ishioka_to_SH(xlm, qq, llim-m, Ql); + ishioka_to_SH2(xlm, vw, llim-m+1, vw); + #endif + + SH_2scal_to_vect(shtns->mx_van + 2*LM(shtns,m,m), l_2, llim, m, vw, Sl, Tl); + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { + Ql[l] = vdup(0.0); + Sl[l] = vdup(0.0); Tl[l] = vdup(0.0); + } + #endif + } + #endif + } + + #undef BASE + #undef LSPAN diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHst_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHst_fly.c new file mode 100644 index 000000000..bc0d272f6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHst_fly.c @@ -0,0 +1,354 @@ +// This file was automatically generated by 'make' from file 'fly_spat_to_SH.gen.c'. +// To modify it, please consider modifying fly_spat_to_SH.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +////////////////////////////////////////////////// + + + void GEN3(_an2,NWAY,_l)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); + void GEN3(_an2_hi,NWAY,_l)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim); + + + static void GEN3(spat_to_SHsphtor_fly,NWAY,SUFFIX)(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, const long int llim) { + + + double *BtF, *BpF; // contains the Fourier transformed data + unsigned imlim=0; + + BtF = Vt; BpF = Vp; + #ifndef SHT_AXISYM + imlim = MTR; + #ifdef SHT_VAR_LTR + if (imlim*MRES > (unsigned) llim) imlim = ((unsigned) llim)/MRES; // 32bit mul and div should be faster + #endif + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode > 0) { // alloc memory for out-of-place FFT + unsigned long nv = shtns->nspat; + BtF = (double*) VMALLOC( 2*nv * sizeof(double) ); + BpF = BtF + nv; + } + if (shtns->fftc_mode != 1) { // regular FFT + fftw_execute_dft(shtns->fftc,(cplx*)Vt, (cplx*)BtF); + fftw_execute_dft(shtns->fftc,(cplx*)Vp, (cplx*)BpF); + } else { // split FFT + fftw_execute_split_dft(shtns->fftc, Vt+NPHI, Vt, BtF+1, BtF); + fftw_execute_split_dft(shtns->fftc, Vp+NPHI, Vp, BpF+1, BpF); + } + } + #else + imlim = 0; + #endif + imlim += 1; + + if (llim < SHT_L_RESCALE_FLY) { + GEN3(_an2,NWAY,_l)(shtns, BtF, BpF, Slm, Tlm, llim, imlim); + } else { + GEN3(_an2_hi,NWAY,_l)(shtns, BtF, BpF, Slm, Tlm, llim, imlim); + } + + #ifndef SHT_AXISYM + if (shtns->fftc_mode > 0) { // free memory + VFREE(BtF); // this frees also BpF. + } + #endif + + } + + + #ifndef SHT_AXISYM + + static void GEN3(spat_to_SHsphtor_m_fly,NWAY,SUFFIX)(shtns_cfg shtns, int im, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm, long int llim) { + + double *alm, *al; + double *wg, *ct, *st; + double *l_2; + long int nk, k, l,m; + double alm0_rescale; + int robert_form; + rnd vw[4*llim+8]; + + double ter[NLAT_2 + NWAY*VSIZE2] SSE; + double tor[NLAT_2 + NWAY*VSIZE2] SSE; + double per[NLAT_2 + NWAY*VSIZE2] SSE; + double por[NLAT_2 + NWAY*VSIZE2] SSE; + double tei[NLAT_2 + NWAY*VSIZE2] SSE; + double toi[NLAT_2 + NWAY*VSIZE2] SSE; + double pei[NLAT_2 + NWAY*VSIZE2] SSE; + double poi[NLAT_2 + NWAY*VSIZE2] SSE; + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; + robert_form = shtns->robert_form; + l_2 = shtns->l_2; + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { + ter[k] = 0.0; tor[k] = 0.0; + per[k] = 0.0; por[k] = 0.0; + } + + if (im == 0) { // im=0 + alm = shtns->blm; + k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + #ifndef SHTNS4MAGIC + double n = creal(Vt[k]); double s = creal(Vt[NLAT-1-k]); + #else + double n = creal(Vt[2*k]); double s = creal(Vt[2*k+1]); + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + ter[k] = n+s; tor[k] = n-s; + } while(++k < nk*VSIZE2); + k=0; do { // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + #ifndef SHTNS4MAGIC + double n = creal(Vp[k]); double s = creal(Vp[NLAT-1-k]); + #else + double n = creal(Vp[2*k]); double s = creal(Vp[2*k+1]); + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + per[k] = n+s; por[k] = n-s; + } while(++k < nk*VSIZE2); + alm0_rescale = alm[0] * shtns->nphi; // alm[0] takes into account the fftw normalization, *nphi cancels it + Slm[0] = 0.0; Tlm[0] = 0.0; // l=0 is zero for the vector transform. + k = 0; + for (l=0;l 0 + const int ms = im*MRES; // signed m. + im = abs(im); // positive im + + for (k=nk*VSIZE2; k<(nk-1+NWAY)*VSIZE2; ++k) { + tei[k] = 0.0; toi[k] = 0.0; + pei[k] = 0.0; poi[k] = 0.0; + } + + m = im*MRES; + l = shtns->tm[im] / VSIZE2; + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + k = ((l*VSIZE2)>>1)*2; // k must be even here. + do { // compute symmetric and antisymmetric parts. + #ifndef SHTNS4MAGIC + cplx n = Vt[k]; cplx s = Vt[NLAT-1-k]; + #else + cplx n = Vt[2*k]; cplx s = Vt[2*k+1]; + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + ter[k] = creal(n+s); tei[k] = cimag(n+s); + tor[k] = creal(n-s); toi[k] = cimag(n-s); + } while (++k>1)*2; // k must be even here. + do { // compute symmetric and antisymmetric parts. + #ifndef SHTNS4MAGIC + cplx n = Vp[k]; cplx s = Vp[NLAT-1-k]; + #else + cplx n = Vp[2*k]; cplx s = Vp[2*k+1]; + #endif + if (robert_form) { + double st_1 = shtns->st_1[k]; + n *= st_1; s *= st_1; + } + per[k] = creal(n+s); pei[k] = cimag(n+s); + por[k] = creal(n-s); poi[k] = cimag(n-s); + } while (++k=0; l--) { + v[0] = vall(0.0); v[1] = vall(0.0); + v[2] = vall(0.0); v[3] = vall(0.0); v+=4; + } + alm0_rescale = alm[0] * shtns->mpos_scale_analys * (shtns->nphi*2); // handles real-norm + do { + #if _GCC_VEC_ + rnd* v = vw; + #else + double* v = (double *) vw; + double* t = (double *) vw; + #endif + al = alm; + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + rnd terk[NWAY], teik[NWAY], tork[NWAY], toik[NWAY]; + rnd perk[NWAY], peik[NWAY], pork[NWAY], poik[NWAY]; + for (int j=0; j>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; jmx_van + 2*LM(shtns,m,m), l_2, llim, ms, vw, (v2d*)Slm, (v2d*)Tlm); + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { + ((v2d*)Slm)[l] = vdup(0.0); ((v2d*)Tlm)[l] = vdup(0.0); + } + #endif + } + + } + + #endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHst_kernel.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHst_kernel.c new file mode 100644 index 000000000..97c30a947 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/SHT/spat_to_SHst_kernel.c @@ -0,0 +1,541 @@ +// This file was automatically generated by 'make' from file 'kernel_spat_to_SH.gen.c'. +// To modify it, please consider modifying kernel_spat_to_SH.gen.c +/* + * Copyright (c) 2010-2019 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +////////////////////////////////////////////////// + + #ifdef HI_LLIM + #define BASE _an2_hi + #else + #define BASE _an2 + #endif + + void GEN3(BASE,NWAY,SUFFIX)(shtns_cfg shtns, double *BtF, double *BpF, cplx *Slm, cplx *Tlm, const long int llim, const int imlim) + { + // TODO: NW should be larger for SHTNS_ISHIOKA ?, or take a different approach. + #define NW (NWAY*16) + // another blocking level in theta (64 or 128 should be good) + #define NBLK (NWAY*16) //24 //(NWAY*3) //24 //96 // (NWAY*3) //24 + // LSPAN can be 2 or 4 + #define LSPAN 2 + + double *alm, *al; + double *wg, *ct, *st; + double *l_2; + long int nk, k, l,m; + unsigned m0, mstep; + #ifndef SHT_AXISYM + unsigned im; + #endif + int robert_form; + v2d vw[2*llim+4]; + + // the SSE macro should align these arrays on vector length. + double ter[NLAT_2 + NW*VSIZE2] SSE; + double tor[NLAT_2 + NW*VSIZE2] SSE; + double per[NLAT_2 + NW*VSIZE2] SSE; + double por[NLAT_2 + NW*VSIZE2] SSE; + #ifndef SHT_AXISYM + double tei[NLAT_2 + NW*VSIZE2] SSE; + double toi[NLAT_2 + NW*VSIZE2] SSE; + double pei[NLAT_2 + NW*VSIZE2] SSE; + double poi[NLAT_2 + NW*VSIZE2] SSE; + #endif + + nk = NLAT_2; // copy NLAT_2 to a local variable for faster access (inner loop limit) + #if _GCC_VEC_ + nk = ((unsigned) nk+(VSIZE2-1))/VSIZE2; + #endif + wg = shtns->wg; ct = shtns->ct; st = shtns->st; + robert_form = shtns->robert_form; + l_2 = shtns->l_2; + for (k=nk*VSIZE2; k<(nk-1+NW)*VSIZE2; ++k) { // never written, so this is now done for all m's + ter[k] = 0.0; tor[k] = 0.0; + per[k] = 0.0; por[k] = 0.0; + #ifndef SHT_AXISYM + tei[k] = 0.0; toi[k] = 0.0; + pei[k] = 0.0; poi[k] = 0.0; + #endif + } + + // ACCESS PATTERN + const int k_inc = shtns->k_stride_a; + const int m_inc = shtns->m_stride_a; + + #ifndef _OPENMP + m0 = 0; mstep = 1; + #else + m0 = omp_get_thread_num(); + mstep = omp_get_num_threads(); + if (m0 == 0) + #endif + { // im=0 : dzl.p = 0.0 and evrything is REAL + alm = shtns->blm; + // compute symmetric and antisymmetric parts. (do not weight here, it is cheaper to weight y0) + SYM_ASYM_M0_V(BtF, ter, tor) + SYM_ASYM_M0_V(BpF, per, por) + Slm[0] = 0.0; Tlm[0] = 0.0; // l=0 is zero for the vector transform. + k = 0; + double* v_ = (double*) vw; + for (l=0;lst_1, k+j); + terk[j] *= st_1; tork[j] *= st_1; + perk[j] *= st_1; pork[j] *= st_1; + } + } + al+=2; l=1; + while(l= imlim + l = LiM(shtns, imlim*MRES, imlim); + do { + ((v2d*)Slm)[l] = vdup(0.0); ((v2d*)Tlm)[l] = vdup(0.0); + } while(++l < shtns->nlm); + } + #endif + #endif + m0=mstep; + } + + #ifndef SHT_AXISYM + const double mpos_scale = shtns->mpos_scale_analys; // handles real-norm + for (im=m0; imtm[im] / VSIZE2; + #ifndef SHTNS_ISHIOKA + alm = shtns->blm + im*(2*(LMAX+1) -m+MRES); + #else + alm = shtns->clm + im*(2*(LMAX+1) - m+MRES)/2; + #endif + // compute symmetric and anti-symmetric parts: + #ifndef SHTNS_ISHIOKA + SYM_ASYM_V(BtF, ter, tor, tei, toi, k0) + SYM_ASYM_V(BpF, per, por, pei, poi, k0) + #else + SYM_ASYM_V_ISH(BtF, ter, tor, tei, toi, k0) + SYM_ASYM_V_ISH(BpF, per, por, pei, poi, k0) + #endif + + for (int l=0; l<=llim-m+1; l++) { + vw[2*l] = vdup(0.0); vw[2*l+1] = vdup(0.0); + } + int k = nk; do { + k -= NBLK; + v2d* v = vw; + rnd y01ct[NBLK][3]; // [0] = y0, [1] = y1, [2] = cos(theta)^2 + #ifdef HI_LLIM + int ny[NBLK/NWAY]; // exponent to extend double precision range. + int lnz = llim; // apriori, we go up to llim. + #endif + int imin = (k=imin; i-=NWAY) { // iterate over blocks, start from the right-most (IMPORTANT!) + rnd y0[NWAY], cost[NWAY]; // should fit in registers + for (int j=0; j>= 1); + #else /* HI_LLIM */ + { int nsint = 0; + do { // sin(theta)^m (use rescaling to avoid underflow) + if (l&1) { + for (int j=NWAY-1; j>=0; --j) y0[j] *= cost[j]; + ny0 += nsint; + if (vlo(y0[NWAY-1]) < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny0--; + for (int j=NWAY-1; j>=0; --j) y0[j] *= vall(SHT_SCALE_FACTOR); + } + } + for (int j=NWAY-1; j>=0; --j) cost[j] *= cost[j]; + nsint += nsint; + if (vlo(cost[NWAY-1]) < 1.0/SHT_SCALE_FACTOR) { + nsint--; + for (int j=NWAY-1; j>=0; --j) cost[j] *= vall(SHT_SCALE_FACTOR); + } + } while(l >>= 1); + } + #endif + rnd y1[NWAY]; + al = alm; + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny0; + for (int j=0; j llim+1) && (ny0<0)) break; // nothing more to do in this block. + lnz = l; // record the minimum l for significant values, over this block, do not go above that afterwards + #endif + for (int j=0; j 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; ist_1, k+i); + x[i].ter *= st_1; x[i].tei *= st_1; x[i].tor *= st_1; x[i].toi *= st_1; + x[i].per *= st_1; x[i].pei *= st_1; x[i].por *= st_1; x[i].poi *= st_1; + } + } + while (l SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int i=0; i 0) ? k0-k : 0; // 0 <= imin < NBLK + for (int i=imin; ist_1, k+i); + x[i].ter *= st_1; x[i].tei *= st_1; x[i].tor *= st_1; x[i].toi *= st_1; + x[i].per *= st_1; x[i].pei *= st_1; x[i].por *= st_1; x[i].poi *= st_1; + } + } + while (l<=llim+1) { // compute even and odd parts + unsigned i = imin; + #ifdef HI_LLIM + unsigned ii = imin/NWAY; + while ((ny[ii] < 0) && (ii SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny[ii]; + for (int j=0; j k0); + + l = LiM(shtns, m, im); + v2d *Sl = (v2d*) &Slm[l]; + v2d *Tl = (v2d*) &Tlm[l]; + + #ifndef SHTNS_ISHIOKA + #else + // post-processing for recurrence relation of Ishioka + const double* restrict xlm = shtns->x2lm + 3*im*(2*(LMAX+4) -m+MRES)/4; + ishioka_to_SH2(xlm, vw, llim-m+1, vw); + #endif + + SH_2scal_to_vect(shtns->mx_van + 2*LM(shtns,m,m), l_2, llim, m, vw, Sl, Tl); + + #ifdef SHT_VAR_LTR + for (l=llim+1-m; l<=LMAX-m; ++l) { + Sl[l] = vdup(0.0); Tl[l] = vdup(0.0); + } + #endif + } + #endif + } + + #undef BASE + #undef LSPAN diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/configure b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/configure new file mode 100755 index 000000000..86c1ab3fc --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/configure @@ -0,0 +1,6212 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for SHTns 3.3.1. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='SHTns' +PACKAGE_TARNAME='shtns' +PACKAGE_VERSION='3.3.1' +PACKAGE_STRING='SHTns 3.3.1' +PACKAGE_BUGREPORT='' +PACKAGE_URL='https://bitbucket.org/nschaeff/shtns' + +ac_unique_file="sht_init.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +nvcc_flags +shtcc_flags +libname +objs +install +target +ac_ct_FC +FCFLAGS +FC +python_inc +numpy_inc +OPENMP_CFLAGS +EGREP +GREP +CPP +SED +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +PYTHON +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_verbose +enable_openmp +enable_mkl +enable_knl +enable_many_core +enable_cuda +enable_magic_layout +enable_python +enable_long_double +enable_f77 +enable_simd +enable_ishioka +' + ac_precious_vars='build_alias +host_alias +target_alias +PYTHON +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +FC +FCFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures SHTns 3.3.1 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/shtns] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of SHTns 3.3.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-verbose=0-3 define verbosity level for the library: 0=silent, + 1=default, 2=debug, 3=full + --enable-openmp Enable multi-threading with OpenMP + --enable-mkl Try to link with intel MKL instead of FFTW (can be + slightly faster, but NOT THREAD SAFE) + --enable-knl Enable compilation for Xeon Phi (KNL) + --enable-many-core Enable optimizations for many-core systems (Blue + Gene/Q, Xeon Phi,...) and remove single-threaded + transforms + --enable-cuda Enable compilation for Nvidia gpu using cuda + --enable-magic-layout Compile specific version for the MagIC code + --enable-python Build Python interface + --enable-long-double Use long double during initialization for (maybe) + slightly better precision + --disable-f77 Do not include F77 wrapper to call SHTns library + from Fortran + --disable-simd Do not use vector extensions (SSE2, AVX or MIC) + --enable-ishioka Use the new recursion (faster but experimental) + --disable-openmp do not use OpenMP + +Some influential environment variables: + PYTHON the python interpreter (defaults to 'python') + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + FC Fortran compiler command + FCFLAGS Fortran compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +SHTns home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +SHTns configure 3.3.1 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_fc_try_compile LINENO +# --------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_fc_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_fc_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_fc_try_compile +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by SHTns $as_me 3.3.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_config_headers="$ac_config_headers sht_config.h" + +target="libshtns.a" # by default, build the library. +objs="sht_fly.o" +install="install-lib" # by default, install the library. + +# optional variables : + +# optional features with --enable-XXX +# Check whether --enable-verbose was given. +if test "${enable_verbose+set}" = set; then : + enableval=$enable_verbose; +else + enable_verbose=1 +fi + +# Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +else + enable_openmp=default +fi + +# Check whether --enable-mkl was given. +if test "${enable_mkl+set}" = set; then : + enableval=$enable_mkl; +else + enable_mkl=default +fi + +# Check whether --enable-knl was given. +if test "${enable_knl+set}" = set; then : + enableval=$enable_knl; +else + enable_knl=no +fi + +# Check whether --enable-many-core was given. +if test "${enable_many_core+set}" = set; then : + enableval=$enable_many_core; +else + enable_many_core=no +fi + +# Check whether --enable-cuda was given. +if test "${enable_cuda+set}" = set; then : + enableval=$enable_cuda; +else + enable_cuda=no +fi + +# Check whether --enable-magic-layout was given. +if test "${enable_magic_layout+set}" = set; then : + enableval=$enable_magic_layout; +else + enable_magic_layout=no +fi + +# Check whether --enable-python was given. +if test "${enable_python+set}" = set; then : + enableval=$enable_python; +else + enable_python=no +fi + +# Check whether --enable-long-double was given. +if test "${enable_long_double+set}" = set; then : + enableval=$enable_long_double; +fi + +# Check whether --enable-f77 was given. +if test "${enable_f77+set}" = set; then : + enableval=$enable_f77; +fi + +# Check whether --enable-simd was given. +if test "${enable_simd+set}" = set; then : + enableval=$enable_simd; +fi + +# Check whether --enable-ishioka was given. +if test "${enable_ishioka+set}" = set; then : + enableval=$enable_ishioka; +else + enable_ishioka=no +fi + + +if test "$prefix" = "NONE"; then : + prefix=$ac_default_prefix +fi + +# Checks for programs. +if test "x$CFLAGS" = "x"; then + CFLAGS="-O2" +fi +CFLAGS="$CFLAGS -I$prefix/include -L$prefix/lib" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +if test "$SED" = :; then + as_fn_error $? "sed program required." "$LINENO" 5 +fi + +# define macrao AX_CHECK_COMPILE_FLAG + + +if test "x$enable_knl" != "xyes"; then : + + # add gcc compile options if supported. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -march=native" >&5 +$as_echo_n "checking whether C compiler accepts -march=native... " >&6; } +if ${ax_cv_check_cflags___march_native+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -march=native" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___march_native=yes +else + ax_cv_check_cflags___march_native=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___march_native" >&5 +$as_echo "$ax_cv_check_cflags___march_native" >&6; } +if test x"$ax_cv_check_cflags___march_native" = xyes; then : + CC="$CC -march=native" +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mtune=native" >&5 +$as_echo_n "checking whether C compiler accepts -mtune=native... " >&6; } +if ${ax_cv_check_cflags___mtune_native+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -mtune=native" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___mtune_native=yes +else + ax_cv_check_cflags___mtune_native=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mtune_native" >&5 +$as_echo "$ax_cv_check_cflags___mtune_native" >&6; } +if test x"$ax_cv_check_cflags___mtune_native" = xyes; then : + CC="$CC -mtune=native" +else + : +fi + + +fi + + # this is an icc compile option, try if it is supported: + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -qopt-zmm-usage=high" >&5 +$as_echo_n "checking whether C compiler accepts -qopt-zmm-usage=high... " >&6; } +if ${ax_cv_check_cflags___qopt_zmm_usage_high+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -qopt-zmm-usage=high" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___qopt_zmm_usage_high=yes +else + ax_cv_check_cflags___qopt_zmm_usage_high=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___qopt_zmm_usage_high" >&5 +$as_echo "$ax_cv_check_cflags___qopt_zmm_usage_high" >&6; } +if test x"$ax_cv_check_cflags___qopt_zmm_usage_high" = xyes; then : + CC="$CC -qopt-zmm-usage=high" +else + : +fi + + +else + + enable_many_core=yes # optimize for many-core architecture + target="libshtns_mic.a" + # KNL native cross-compiling + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -xMIC-AVX512" >&5 +$as_echo_n "checking whether C compiler accepts -xMIC-AVX512... " >&6; } +if ${ax_cv_check_cflags___xMIC_AVX512+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -xMIC-AVX512" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___xMIC_AVX512=yes +else + ax_cv_check_cflags___xMIC_AVX512=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___xMIC_AVX512" >&5 +$as_echo "$ax_cv_check_cflags___xMIC_AVX512" >&6; } +if test x"$ax_cv_check_cflags___xMIC_AVX512" = xyes; then : + CC="$CC -xMIC-AVX512" +else + as_fn_error $? "\"Xeon Phi (KNL) not supported. Did you use the Intel Compiler?\"" "$LINENO" 5 +fi + + # With KNL, enable mkl by default. + if test "x$enable_mkl" = "xdefault"; then : + enable_mkl=yes +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -ffast-math" >&5 +$as_echo_n "checking whether C compiler accepts -ffast-math... " >&6; } +if ${ax_cv_check_cflags___ffast_math+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -ffast-math" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___ffast_math=yes +else + ax_cv_check_cflags___ffast_math=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___ffast_math" >&5 +$as_echo "$ax_cv_check_cflags___ffast_math" >&6; } +if test x"$ax_cv_check_cflags___ffast_math" = xyes; then : + CFLAGS="$CFLAGS -ffast-math" +else + : +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -std=gnu99" >&5 +$as_echo_n "checking whether C compiler accepts -std=gnu99... " >&6; } +if ${ax_cv_check_cflags___std_gnu99+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -std=gnu99" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___std_gnu99=yes +else + ax_cv_check_cflags___std_gnu99=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___std_gnu99" >&5 +$as_echo "$ax_cv_check_cflags___std_gnu99" >&6; } +if test x"$ax_cv_check_cflags___std_gnu99" = xyes; then : + CFLAGS="$CFLAGS -std=gnu99" +else + : +fi + + +# with intel compiler, we should not use -O3 (bad performance with icc14 and icc15) +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __INTEL_COMPILER + icc + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "icc" >/dev/null 2>&1; then : + shtcc_flags="-O2" +else + shtcc_flags="-O3" +fi +rm -f conftest* + + +# Checks for header files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in stdlib.h stdio.h string.h math.h complex.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for libraries. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else + ac_cv_lib_m_cos=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +else + as_fn_error $? "math library not found." "$LINENO" 5 +fi + + +# With Python, enable openmp by default. +if test "x$enable_python" != "xno"; then : + + if test "x$enable_openmp" = "xdefault"; then : + enable_openmp=yes +fi + +fi + +# On many-core systems, enable openmp by default, and disable precomputed matrix support. +if test "x$enable_many_core" != "xno"; then : + + enable_mem=no + if test "x$enable_openmp" = "xdefault"; then : + enable_openmp=yes +fi + +fi +# for MagIC code, also disable matrix transforms. +if test "x$enable_magic_layout" != "xno"; then : + + enable_mem=no + #enable_ishioka=no # workaround unexplained bug + #enable_many_core=yes # optimize for many-core architecture + +$as_echo "#define SHTNS4MAGIC 1" >>confdefs.h + + +fi + +nvcc_flags="" +# Disable precomputed matrix support with openmp: to avoid bugs arising with icc + openmp. +if test "x$enable_openmp" = "xyes"; then : + + enable_mem=no + nvcc_flags="-Xcompiler -fopenmp" + + OPENMP_CFLAGS= + # Check whether --enable-openmp was given. +if test "${enable_openmp+set}" = set; then : + enableval=$enable_openmp; +fi + + if test "$enable_openmp" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 +$as_echo_n "checking for $CC option to support OpenMP... " >&6; } +if ${ac_cv_prog_c_openmp+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_c_openmp='none needed' +else + ac_cv_prog_c_openmp='unsupported' + for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ + -Popenmp --openmp; do + ac_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $ac_option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifndef _OPENMP + choke me +#endif +#include +int main () { return omp_get_num_threads (); } + +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_prog_c_openmp=$ac_option +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$ac_save_CFLAGS + if test "$ac_cv_prog_c_openmp" != unsupported; then + break + fi + done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 +$as_echo "$ac_cv_prog_c_openmp" >&6; } + case $ac_cv_prog_c_openmp in #( + "none needed" | unsupported) + ;; #( + *) + OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;; + esac + fi + + + CFLAGS="$CFLAGS $OPENMP_CFLAGS" + objs="$objs sht_omp.o" + if test "x$enable_knl" != "xno"; then : + + target="libshtns_mic_omp.a" + +else + + target="libshtns_omp.a" + +fi + +fi + +# Check for CUDA +if test "x$enable_cuda" = "xyes"; then : + + CFLAGS="$CFLAGS -I$CUDA_PATH/include" + # assume 64 bit mode, add default directory to find CUDA + LDFLAGS="$LDFLAGS -L$CUDA_PATH/lib64" + echo $LDFLAGS + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cudaMalloc in -lcudart" >&5 +$as_echo_n "checking for cudaMalloc in -lcudart... " >&6; } +if ${ac_cv_lib_cudart_cudaMalloc+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcudart $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cudaMalloc (); +int +main () +{ +return cudaMalloc (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cudart_cudaMalloc=yes +else + ac_cv_lib_cudart_cudaMalloc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_cudaMalloc" >&5 +$as_echo "$ac_cv_lib_cudart_cudaMalloc" >&6; } +if test "x$ac_cv_lib_cudart_cudaMalloc" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCUDART 1 +_ACEOF + + LIBS="-lcudart $LIBS" + +else + as_fn_error $? "cudart library not found. Try adding LDFLAGS=\"-L/usr/local/cuda/lib64\"" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cufftPlanMany in -lcufft" >&5 +$as_echo_n "checking for cufftPlanMany in -lcufft... " >&6; } +if ${ac_cv_lib_cufft_cufftPlanMany+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcufft $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cufftPlanMany (); +int +main () +{ +return cufftPlanMany (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_cufft_cufftPlanMany=yes +else + ac_cv_lib_cufft_cufftPlanMany=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cufft_cufftPlanMany" >&5 +$as_echo "$ac_cv_lib_cufft_cufftPlanMany" >&6; } +if test "x$ac_cv_lib_cufft_cufftPlanMany" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBCUFFT 1 +_ACEOF + + LIBS="-lcufft $LIBS" + +else + as_fn_error $? "cufft library not found." "$LINENO" 5 +fi + + objs="$objs sht_gpu.o" + target="libshtns_cuda.a" + + cuda_arch='' + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports Kepler gpu" >&5 +$as_echo_n "checking whether nvcc supports Kepler gpu... " >&6; } + if nvcc sht_gpu.cu -c -arch=sm_30 --dryrun > /dev/null 2>&1; then : + + cuda_arch=30 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports Pascal gpu" >&5 +$as_echo_n "checking whether nvcc supports Pascal gpu... " >&6; } + if nvcc sht_gpu.cu -c -arch=sm_60 --dryrun > /dev/null 2>&1; then : + + cuda_arch=60 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether nvcc supports Volta gpu" >&5 +$as_echo_n "checking whether nvcc supports Volta gpu... " >&6; } + if nvcc sht_gpu.cu -c -arch=sm_70 --dryrun > /dev/null 2>&1; then : + + cuda_arch=70 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$cuda_arch" == "x"; then : + + as_fn_error $? "nvcc does not support any compatible gpu. Is nvcc available ?" "$LINENO" 5 + +fi + nvcc_flags="$nvcc_flags -gencode=arch=compute_$cuda_arch,code=sm_$cuda_arch" + LIBS="$LIBS -lstdc++" # cuda uses the c++ standard library. This is needed to link with gcc + +fi +libname=$target # set the libname befor checking for python. + +# Check for FFTW (FFTW preferred, MKL optional) +if test "x$enable_mkl" = "xyes"; then : + + # optionally use MKL instead of fftw3 + +$as_echo "#define HAVE_LIBFFTW3_OMP 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mkl" >&5 +$as_echo_n "checking whether C compiler accepts -mkl... " >&6; } +if ${ax_cv_check_cflags___mkl+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -mkl" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags___mkl=yes +else + ax_cv_check_cflags___mkl=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mkl" >&5 +$as_echo "$ax_cv_check_cflags___mkl" >&6; } +if test x"$ax_cv_check_cflags___mkl" = xyes; then : + + LIBS="-mkl $LIBS" # easy way ! + ac_fn_c_check_func "$LINENO" "fftw_plan_many_dft" "ac_cv_func_fftw_plan_many_dft" +if test "x$ac_cv_func_fftw_plan_many_dft" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: \"FFTW interface found in MKL, link with -mkl\"" >&5 +$as_echo "$as_me: \"FFTW interface found in MKL, link with -mkl\"" >&6;} +else + as_fn_error $? "\"FFTW interface not found in MKL libraries (-mkl).\"" "$LINENO" 5 +fi + + +else + + # assume 64 bit mode, add default directory to find the MKL + LDFLAGS="$LDFLAGS -L$MKLROOT/lib/intel64" + if test "x$enable_openmp" = "xyes"; then : + + # multi-threaded MKL libs + #mkl_libs="-Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -Wl,--end-group -liomp5 -lpthread" + mkl_libs="-Wl,--start-group -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -Wl,--end-group" + +else + + # sequential MKL libs + mkl_libs="-Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group" + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw_plan_many_dft in -lmkl_intel_lp64" >&5 +$as_echo_n "checking for fftw_plan_many_dft in -lmkl_intel_lp64... " >&6; } +if ${ac_cv_lib_mkl_intel_lp64_fftw_plan_many_dft+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmkl_intel_lp64 "$mkl_libs" $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char fftw_plan_many_dft (); +int +main () +{ +return fftw_plan_many_dft (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_mkl_intel_lp64_fftw_plan_many_dft=yes +else + ac_cv_lib_mkl_intel_lp64_fftw_plan_many_dft=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mkl_intel_lp64_fftw_plan_many_dft" >&5 +$as_echo "$ac_cv_lib_mkl_intel_lp64_fftw_plan_many_dft" >&6; } +if test "x$ac_cv_lib_mkl_intel_lp64_fftw_plan_many_dft" = xyes; then : + LIBS="$mkl_libs $LIBS" +else + as_fn_error $? "\"FFTW interface not found in MKL libraries ($mkl_libs). Please add 'LDFLAGS=-L/path/to/mkl' to ./configure command line.\"" "$LINENO" 5 +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: \"FFTW interface found in MKL, link with $mkl_libs\"" >&5 +$as_echo "$as_me: \"FFTW interface found in MKL, link with $mkl_libs\"" >&6;} + +fi + + +else + + # fftw3 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw_plan_many_dft in -lfftw3" >&5 +$as_echo_n "checking for fftw_plan_many_dft in -lfftw3... " >&6; } +if ${ac_cv_lib_fftw3_fftw_plan_many_dft+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfftw3 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char fftw_plan_many_dft (); +int +main () +{ +return fftw_plan_many_dft (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_fftw3_fftw_plan_many_dft=yes +else + ac_cv_lib_fftw3_fftw_plan_many_dft=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fftw3_fftw_plan_many_dft" >&5 +$as_echo "$ac_cv_lib_fftw3_fftw_plan_many_dft" >&6; } +if test "x$ac_cv_lib_fftw3_fftw_plan_many_dft" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBFFTW3 1 +_ACEOF + + LIBS="-lfftw3 $LIBS" + +else + as_fn_error $? "FFTW3 library required. Or try using the intel MKL library with --enable-mkl" "$LINENO" 5 +fi + + if test "x$enable_openmp" = "xyes"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw_init_threads in -lfftw3_omp" >&5 +$as_echo_n "checking for fftw_init_threads in -lfftw3_omp... " >&6; } +if ${ac_cv_lib_fftw3_omp_fftw_init_threads+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfftw3_omp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char fftw_init_threads (); +int +main () +{ +return fftw_init_threads (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_fftw3_omp_fftw_init_threads=yes +else + ac_cv_lib_fftw3_omp_fftw_init_threads=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fftw3_omp_fftw_init_threads" >&5 +$as_echo "$ac_cv_lib_fftw3_omp_fftw_init_threads" >&6; } +if test "x$ac_cv_lib_fftw3_omp_fftw_init_threads" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBFFTW3_OMP 1 +_ACEOF + + LIBS="-lfftw3_omp $LIBS" + +else + as_fn_error $? "FFTW3 does not support OpenMP. Did you compile it with --enable-openmp ?." "$LINENO" 5 +fi + + +fi + +fi + + +# Checks related to Python and NumPy paths: +if test "x$enable_python" != "xno"; then : + + if test "x$PYTHON" = "x"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python with numpy package" >&5 +$as_echo_n "checking for python with numpy package... " >&6; } + py_test="python python2 python3" + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $PYTHON has numpy package" >&5 +$as_echo_n "checking if $PYTHON has numpy package... " >&6; } + py_test="$PYTHON" + +fi + for py in $py_test + do : + numpy_inc=`$py -c "from numpy import get_include; print(get_include())" 2>/dev/null` + if test "x$numpy_inc" != "x"; then : + break +fi + done + if test "x$numpy_inc" = "x"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "NumPy package is required for the python interface." "$LINENO" 5 + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $py" >&5 +$as_echo "$py" >&6; } + PYTHON=$py + +fi + python_inc=`$PYTHON -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())" 2>/dev/null` + echo " python include path = $python_inc" + echo " numpy include path = $numpy_inc" + + + CFLAGS="$CFLAGS -fpic" # required compile flag for python extensions. + target="_shtns.so" # build python extension instead of C library. + install="install-py" # install python extension instead of C library. + +fi + +# Checks related to long double +if test "x$enable_long_double" == "xyes"; then : + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double with more range or precision than double" >&5 +$as_echo_n "checking for long double with more range or precision than double... " >&6; } +if ${ac_cv_type_long_double_wider+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + long double const a[] = + { + 0.0L, DBL_MIN, DBL_MAX, DBL_EPSILON, + LDBL_MIN, LDBL_MAX, LDBL_EPSILON + }; + long double + f (long double x) + { + return ((x + (unsigned long int) 10) * (-1 / x) + a[0] + + (x ? f (x) : 'c')); + } + +int +main () +{ +static int test_array [1 - 2 * !((0 < ((DBL_MAX_EXP < LDBL_MAX_EXP) + + (DBL_MANT_DIG < LDBL_MANT_DIG) + - (LDBL_MAX_EXP < DBL_MAX_EXP) + - (LDBL_MANT_DIG < DBL_MANT_DIG))) + && (int) LDBL_EPSILON == 0 + )]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_type_long_double_wider=yes +else + ac_cv_type_long_double_wider=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_double_wider" >&5 +$as_echo "$ac_cv_type_long_double_wider" >&6; } + if test $ac_cv_type_long_double_wider = yes; then + +$as_echo "#define HAVE_LONG_DOUBLE_WIDER 1" >>confdefs.h + + fi + +fi + +# Disable Fortran interface ? +if test "x$enable_f77" != "xno"; then : + + +$as_echo "#define SHT_F77_API 1" >>confdefs.h + + +fi + +# Disable SIMD ? +if test "x$enable_simd" != "xno"; then : + + +$as_echo "#define _GCC_VEC_ 1" >>confdefs.h + + +fi + + +if test "x$enable_ishioka" == "xyes"; then : + + +$as_echo "#define SHTNS_ISHIOKA 1" >>confdefs.h + + +fi + +# Disable MEM ? +if test "x$enable_mem" == "xyes"; then : + + +$as_echo "#define SHTNS_MEM 1" >>confdefs.h + + objs="$objs sht_mem.o" # compile mem transforms + +fi + +# Verbosity setting +if test "x$enable_verbose" == "xno"; then : + enable_verbose=0 +elif test "x$enable_verbose" == "xyes"; then : + enable_verbose=1 +fi + +cat >>confdefs.h <<_ACEOF +#define SHT_VERBOSE $enable_verbose +_ACEOF + +echo " verbose level = $enable_verbose" + +# Checks for typedefs, structures, and compiler characteristics. +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = xyes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + +# Checks for library functions. +#AC_FUNC_MALLOC +#AC_FUNC_REALLOC +for ac_func in fftw_cost +do : + ac_fn_c_check_func "$LINENO" "fftw_cost" "ac_cv_func_fftw_cost" +if test "x$ac_cv_func_fftw_cost" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FFTW_COST 1 +_ACEOF + +fi +done + + +### for cycle.h ### + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +if ${ac_cv_header_time+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_time=yes +else + ac_cv_header_time=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +$as_echo "$ac_cv_header_time" >&6; } +if test $ac_cv_header_time = yes; then + +$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + +fi + + for ac_header in sys/time.h c_asm.h intrinsics.h mach/mach_time.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + ac_fn_c_check_type "$LINENO" "hrtime_t" "ac_cv_type_hrtime_t" "#if HAVE_SYS_TIME_H +#include +#endif +" +if test "x$ac_cv_type_hrtime_t" = xyes; then : + +$as_echo "#define HAVE_HRTIME_T 1" >>confdefs.h + +fi + + + for ac_func in gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rtc intrinsic" >&5 +$as_echo_n "checking for _rtc intrinsic... " >&6; } + rtc_ok=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_INTRINSICS_H +#include +#endif +int +main () +{ +_rtc() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +$as_echo "#define HAVE__RTC 1" >>confdefs.h + +else + rtc_ok=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rtc_ok" >&5 +$as_echo "$rtc_ok" >&6; } +### end cycle.h ### + +#### for the Fortran example #### +ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$FC"; then + ac_cv_prog_FC="$FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_FC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +FC=$ac_cv_prog_FC +if test -n "$FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 +$as_echo "$FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$FC" && break + done +fi +if test -z "$FC"; then + ac_ct_FC=$FC + for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_FC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_FC"; then + ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_FC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_FC=$ac_cv_prog_ac_ct_FC +if test -n "$ac_ct_FC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 +$as_echo "$ac_ct_FC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_FC" && break +done + + if test "x$ac_ct_FC" = x; then + FC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + FC=$ac_ct_FC + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } +if ${ac_cv_fc_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_fc_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 +$as_echo "$ac_cv_fc_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FCFLAGS=${FCFLAGS+set} +ac_save_FCFLAGS=$FCFLAGS +FCFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 +$as_echo_n "checking whether $FC accepts -g... " >&6; } +if ${ac_cv_prog_fc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FCFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_fc_try_compile "$LINENO"; then : + ac_cv_prog_fc_g=yes +else + ac_cv_prog_fc_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 +$as_echo "$ac_cv_prog_fc_g" >&6; } +if test "$ac_test_FCFLAGS" = set; then + FCFLAGS=$ac_save_FCFLAGS +elif test $ac_cv_prog_fc_g = yes; then + if test "x$ac_cv_fc_compiler_gnu" = xyes; then + FCFLAGS="-g -O2" + else + FCFLAGS="-g" + fi +else + if test "x$ac_cv_fc_compiler_gnu" = xyes; then + FCFLAGS="-O2" + else + FCFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + GFC=yes +else + GFC= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +#### end Fortran ##### + +echo "prefix=$prefix" + + + + + + +ac_config_files="$ac_config_files Makefile setup.py" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by SHTns $as_me 3.3.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider. +SHTns home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +SHTns config.status 3.3.1 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "sht_config.h") CONFIG_HEADERS="$CONFIG_HEADERS sht_config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "setup.py") CONFIG_FILES="$CONFIG_FILES setup.py" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/configure.ac b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/configure.ac new file mode 100644 index 000000000..80d4112a1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/configure.ac @@ -0,0 +1,310 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.62]) +AC_INIT([SHTns],[3.3.1],[],[shtns],[https://bitbucket.org/nschaeff/shtns]) +AC_LANG([C]) +AC_CONFIG_SRCDIR([sht_init.c]) +AC_CONFIG_HEADERS([sht_config.h]) +target="libshtns.a" # by default, build the library. +objs="sht_fly.o" +install="install-lib" # by default, install the library. + +# optional variables : +AC_ARG_VAR(PYTHON, [the python interpreter (defaults to 'python')]) +# optional features with --enable-XXX +AC_ARG_ENABLE([verbose], + AS_HELP_STRING([--enable-verbose=0-3], [define verbosity level for the library: 0=silent, 1=default, 2=debug, 3=full]), + [],[enable_verbose=1]) +AC_ARG_ENABLE([openmp], + AS_HELP_STRING([--enable-openmp], [Enable multi-threading with OpenMP]), [], [enable_openmp=default]) +AC_ARG_ENABLE([mkl], + AS_HELP_STRING([--enable-mkl], [Try to link with intel MKL instead of FFTW (can be slightly faster, but NOT THREAD SAFE)]), [], [enable_mkl=default]) +AC_ARG_ENABLE([knl], + AS_HELP_STRING([--enable-knl], [Enable compilation for Xeon Phi (KNL)]), [], [enable_knl=no]) +AC_ARG_ENABLE([many-core], + AS_HELP_STRING([--enable-many-core], [Enable optimizations for many-core systems (Blue Gene/Q, Xeon Phi,...) and remove single-threaded transforms]), [], [enable_many_core=no]) +AC_ARG_ENABLE([cuda], + AS_HELP_STRING([--enable-cuda], [Enable compilation for Nvidia gpu using cuda]), [], [enable_cuda=no]) +AC_ARG_ENABLE([magic-layout], + AS_HELP_STRING([--enable-magic-layout], [Compile specific version for the MagIC code]), [], [enable_magic_layout=no]) +AC_ARG_ENABLE([python], + AS_HELP_STRING([--enable-python], [Build Python interface]), [], [enable_python=no]) +AC_ARG_ENABLE([long-double], + AS_HELP_STRING([--enable-long-double], [Use long double during initialization for (maybe) slightly better precision])) +AC_ARG_ENABLE([f77], + AS_HELP_STRING([--disable-f77], [Do not include F77 wrapper to call SHTns library from Fortran])) +AC_ARG_ENABLE([simd], + AS_HELP_STRING([--disable-simd], [Do not use vector extensions (SSE2, AVX or MIC)])) +AC_ARG_ENABLE([ishioka], + AS_HELP_STRING([--enable-ishioka], [Use the new recursion (faster but experimental)]), [], [enable_ishioka=no]) + +dnl Sanitize $prefix. Autoconf does this by itself, but so late in the +dnl generated configure script that the expansion does not occur until +dnl after our eval magic below. +AS_IF([test "$prefix" = "NONE"],[prefix=$ac_default_prefix]) + +# Checks for programs. +if test "x$CFLAGS" = "x"; then + CFLAGS="-O2" +fi +CFLAGS="$CFLAGS -I$prefix/include -L$prefix/lib" +AC_PROG_CC +AC_PROG_SED +if test "$SED" = :; then + AC_MSG_ERROR([sed program required.]) +fi + +# define macrao AX_CHECK_COMPILE_FLAG +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS + +AS_IF([test "x$enable_knl" != "xyes"], [ + # add gcc compile options if supported. + AX_CHECK_COMPILE_FLAG([-march=native],[CC="$CC -march=native"], [ + AX_CHECK_COMPILE_FLAG([-mtune=native],[CC="$CC -mtune=native"]) + ]) + # this is an icc compile option, try if it is supported: + AX_CHECK_COMPILE_FLAG([-qopt-zmm-usage=high],[CC="$CC -qopt-zmm-usage=high"]) + ],[ + enable_many_core=yes # optimize for many-core architecture + target="libshtns_mic.a" + # KNL native cross-compiling + AX_CHECK_COMPILE_FLAG([-xMIC-AVX512],[CC="$CC -xMIC-AVX512"], [AC_MSG_ERROR(["Xeon Phi (KNL) not supported. Did you use the Intel Compiler?"])]) + # With KNL, enable mkl by default. + AS_IF([test "x$enable_mkl" = "xdefault"], [enable_mkl=yes]) +]) +AX_CHECK_COMPILE_FLAG([-ffast-math],[CFLAGS="$CFLAGS -ffast-math"]) +AX_CHECK_COMPILE_FLAG([-std=gnu99],[CFLAGS="$CFLAGS -std=gnu99"]) + +# with intel compiler, we should not use -O3 (bad performance with icc14 and icc15) +AC_EGREP_CPP(icc, + [#ifdef __INTEL_COMPILER + icc + #endif + ], [shtcc_flags="-O2"], [shtcc_flags="-O3"]) + +# Checks for header files. +AC_CHECK_HEADERS([stdlib.h stdio.h string.h math.h complex.h]) + +# Checks for libraries. +AC_CHECK_LIB([m],[cos],,AC_MSG_ERROR([math library not found.])) + +# With Python, enable openmp by default. +AS_IF([test "x$enable_python" != "xno"], [ + AS_IF([test "x$enable_openmp" = "xdefault"], [enable_openmp=yes]) +]) + +# On many-core systems, enable openmp by default, and disable precomputed matrix support. +AS_IF([test "x$enable_many_core" != "xno"], [ + enable_mem=no + AS_IF([test "x$enable_openmp" = "xdefault"], [enable_openmp=yes]) +]) +# for MagIC code, also disable matrix transforms. +AS_IF([test "x$enable_magic_layout" != "xno"], [ + enable_mem=no + #enable_ishioka=no # workaround unexplained bug + #enable_many_core=yes # optimize for many-core architecture + AC_DEFINE([SHTNS4MAGIC],[1],[I need the transforms compatible with the MagIC code, to speed it up!]) +]) + +nvcc_flags="" +# Disable precomputed matrix support with openmp: to avoid bugs arising with icc + openmp. +AS_IF([test "x$enable_openmp" = "xyes"], [ + enable_mem=no + nvcc_flags="-Xcompiler -fopenmp" + AC_OPENMP + CFLAGS="$CFLAGS $OPENMP_CFLAGS" + dnl AC_CHECK_HEADERS([omp.h]) + objs="$objs sht_omp.o" + AS_IF([test "x$enable_knl" != "xno"], [ + target="libshtns_mic_omp.a" + ],[ + target="libshtns_omp.a" + ]) +]) + +# Check for CUDA +AS_IF([test "x$enable_cuda" = "xyes"], [ + CFLAGS="$CFLAGS -I$CUDA_PATH/include" + # assume 64 bit mode, add default directory to find CUDA + LDFLAGS="$LDFLAGS -L$CUDA_PATH/lib64" + echo $LDFLAGS + AC_CHECK_LIB([cudart],[cudaMalloc],,AC_MSG_ERROR([cudart library not found. Try adding LDFLAGS="-L/usr/local/cuda/lib64"])) + AC_CHECK_LIB([cufft],[cufftPlanMany],,AC_MSG_ERROR([cufft library not found.])) + objs="$objs sht_gpu.o" + target="libshtns_cuda.a" + + cuda_arch='' + AC_MSG_CHECKING([whether nvcc supports Kepler gpu]) + AS_IF([nvcc sht_gpu.cu -c -arch=sm_30 --dryrun > /dev/null 2>&1], [ + cuda_arch=30 + AC_MSG_RESULT(yes) + ],[ AC_MSG_RESULT(no) ]) + AC_MSG_CHECKING([whether nvcc supports Pascal gpu]) + AS_IF([nvcc sht_gpu.cu -c -arch=sm_60 --dryrun > /dev/null 2>&1], [ + cuda_arch=60 + AC_MSG_RESULT(yes) + ],[ AC_MSG_RESULT(no) ]) + AC_MSG_CHECKING([whether nvcc supports Volta gpu]) + AS_IF([nvcc sht_gpu.cu -c -arch=sm_70 --dryrun > /dev/null 2>&1], [ + cuda_arch=70 + AC_MSG_RESULT(yes) + ],[ AC_MSG_RESULT(no) ]) + + AS_IF([test "x$cuda_arch" == "x"], [ + AC_MSG_ERROR([nvcc does not support any compatible gpu. Is nvcc available ?]) + ]) + nvcc_flags="$nvcc_flags -gencode=arch=compute_$cuda_arch,code=sm_$cuda_arch" + LIBS="$LIBS -lstdc++" # cuda uses the c++ standard library. This is needed to link with gcc +]) +libname=$target # set the libname befor checking for python. + +# Check for FFTW (FFTW preferred, MKL optional) +AS_IF([test "x$enable_mkl" = "xyes"], [ + # optionally use MKL instead of fftw3 + AC_DEFINE(HAVE_LIBFFTW3_OMP, 1, [MKL has the multi-thread fftw interface.]) + AX_CHECK_COMPILE_FLAG([-mkl], [ + LIBS="-mkl $LIBS" # easy way ! + AC_CHECK_FUNC(fftw_plan_many_dft, [AC_MSG_NOTICE(["FFTW interface found in MKL, link with -mkl"])], + [AC_MSG_ERROR(["FFTW interface not found in MKL libraries (-mkl)."])]) + ],[ + # assume 64 bit mode, add default directory to find the MKL + LDFLAGS="$LDFLAGS -L$MKLROOT/lib/intel64" + AS_IF([test "x$enable_openmp" = "xyes"], [ + # multi-threaded MKL libs + #mkl_libs="-Wl,--start-group -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -Wl,--end-group -liomp5 -lpthread" + mkl_libs="-Wl,--start-group -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -Wl,--end-group" + ],[ + # sequential MKL libs + mkl_libs="-Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group" + ]) + AC_CHECK_LIB(mkl_intel_lp64, fftw_plan_many_dft, [LIBS="$mkl_libs $LIBS"], + AC_MSG_ERROR(["FFTW interface not found in MKL libraries ($mkl_libs). Please add 'LDFLAGS=-L/path/to/mkl' to ./configure command line."]), + ["$mkl_libs"]) + AC_MSG_NOTICE(["FFTW interface found in MKL, link with $mkl_libs"]) + ]) +],[ + # fftw3 + AC_CHECK_LIB([fftw3],[fftw_plan_many_dft],,AC_MSG_ERROR([FFTW3 library required. Or try using the intel MKL library with --enable-mkl])) + AS_IF([test "x$enable_openmp" = "xyes"], [ + AC_CHECK_LIB([fftw3_omp], [fftw_init_threads],,AC_MSG_ERROR([FFTW3 does not support OpenMP. Did you compile it with --enable-openmp ?.])) + ]) +]) + + +# Checks related to Python and NumPy paths: +AS_IF([test "x$enable_python" != "xno"], [ + AS_IF([test "x$PYTHON" = "x"], [ + AC_MSG_CHECKING(for python with numpy package) + py_test="python python2 python3" + ],[ + AC_MSG_CHECKING(if $PYTHON has numpy package) + py_test="$PYTHON" + ]) + for py in $py_test + do : + numpy_inc=`$py -c "from numpy import get_include; print(get_include())" 2>/dev/null` + AS_IF([test "x$numpy_inc" != "x"],[break]) + done + AS_IF([test "x$numpy_inc" = "x"], [ + AC_MSG_RESULT(no) + AC_MSG_ERROR([NumPy package is required for the python interface.]) + ],[ + AC_MSG_RESULT($py) + PYTHON=$py + ]) + python_inc=`$PYTHON -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())" 2>/dev/null` + echo " python include path = $python_inc" + echo " numpy include path = $numpy_inc" + AC_SUBST([numpy_inc]) + AC_SUBST([python_inc]) + CFLAGS="$CFLAGS -fpic" # required compile flag for python extensions. + target="_shtns.so" # build python extension instead of C library. + install="install-py" # install python extension instead of C library. +]) + +# Checks related to long double +AS_IF([test "x$enable_long_double" == "xyes"], [ + AC_TYPE_LONG_DOUBLE_WIDER]) + +# Disable Fortran interface ? +AS_IF([test "x$enable_f77" != "xno"], [ + AC_DEFINE([SHT_F77_API],[1],[Compile the Fortran API]) +]) + +# Disable SIMD ? +AS_IF([test "x$enable_simd" != "xno"], [ + AC_DEFINE([_GCC_VEC_],[1],[I compile with GCC 4 or ICC 14 or later, and I would like fast vectorized code (if SSE2, AVX or MIC is supported) !]) +]) + + +AS_IF([test "x$enable_ishioka" == "xyes"], [ + AC_DEFINE([SHTNS_ISHIOKA],[1],[Enable the new recurrence proposed by Ishioka (2018) see https://doi.org/10.2151/jmsj.2018-019 (faster, but experimental)]) +]) + +# Disable MEM ? +AS_IF([test "x$enable_mem" == "xyes"], [ + AC_DEFINE([SHTNS_MEM],[1],[Include algorithms using precomputed matrix stored in memory)]) + objs="$objs sht_mem.o" # compile mem transforms +]) + +# Verbosity setting +AS_IF([test "x$enable_verbose" == "xno"], [enable_verbose=0], + [test "x$enable_verbose" == "xyes"], [enable_verbose=1]) +AC_DEFINE_UNQUOTED([SHT_VERBOSE],$enable_verbose,[0:no output, 1:output info to stdout, 2:more output (debug info), 3:also print fftw plans.]) +echo " verbose level = $enable_verbose" + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_SIZE_T + +# Checks for library functions. +#AC_FUNC_MALLOC +#AC_FUNC_REALLOC +AC_CHECK_FUNCS([fftw_cost]) + +### for cycle.h ### + AC_C_INLINE + AC_HEADER_TIME + AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h]) + + AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in ])],,[#if HAVE_SYS_TIME_H +#include +#endif]) + + AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time]) + + dnl Cray UNICOS _rtc() (real-time clock) intrinsic + AC_MSG_CHECKING([for _rtc intrinsic]) + rtc_ok=yes + AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H +#include +#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no]) + AC_MSG_RESULT($rtc_ok) +### end cycle.h ### + +#### for the Fortran example #### +AC_PROG_FC +#### end Fortran ##### + +echo "prefix=$prefix" +AC_SUBST([target]) +AC_SUBST([install]) +AC_SUBST([objs]) +AC_SUBST([libname]) +AC_SUBST([shtcc_flags]) +AC_SUBST([nvcc_flags]) +AC_CONFIG_FILES([Makefile setup.py]) +AC_OUTPUT diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/accuracy.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/accuracy.png new file mode 100644 index 000000000..dfe6a4c2b Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/accuracy.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/doxygen.conf b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/doxygen.conf new file mode 100644 index 000000000..daf6ce4f4 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/doxygen.conf @@ -0,0 +1,1912 @@ +# Doxyfile 1.8.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed +# in front of the TAG it is preceding . +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = SHTns + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, +# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, +# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields or simple typedef fields will be shown +# inline in the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO (the default), structs, classes, and unions are shown on a separate +# page (for HTML and Man pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can +# be an expensive process and often the same symbol appear multiple times in +# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too +# small doxygen will become slower. If the cache is too large, memory is wasted. +# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid +# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 +# symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if section-label ... \endif +# and \cond section-label ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. Do not use +# file names with spaces, bibtex cannot handle them. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = shtns.h shtns_cuda.h \ + sht_init.c sht_func.c sht_com.c \ + examples \ + doc/main.dox + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = sht_*.c shtns_cuda.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = cycle.h + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = GEN \ + _GEN \ + GENFLY \ + GLUE2 \ + GLUE3 \ + pf2 \ + pfg \ + pf4 \ + pf6 + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = examples + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = doc + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be ignored. +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NONE + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and +# SVG. The default value is HTML-CSS, which is slower, but has the best +# compatibility. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript +# pieces of code that will be used on startup of the MathJax code. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. +# There are two flavours of web server based search depending on the +# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for +# searching and an index file used by the script. When EXTERNAL_SEARCH is +# enabled the indexing and searching needs to be provided by external tools. +# See the manual for details. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain +# the search results. Doxygen ships with an example indexer (doxyindexer) and +# search engine (doxysearch.cgi) which are based on the open source search +# engine library Xapian. See the manual for configuration details. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will returned the search results when EXTERNAL_SEARCH is enabled. +# Doxygen ships with an example search engine (doxysearch) which is based on +# the open source search engine library Xapian. See the manual for configuration +# details. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id +# of to a relative location where the documentation can be found. +# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4 will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images +# or other source files which should be copied to the LaTeX output directory. +# Note that the files will be copied as-is; there are no commands or markers +# available. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files +# that can be used to generate PDF. + +GENERATE_DOCBOOK = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. If left blank docbook will be used as the default path. + +DOCBOOK_OUTPUT = docbook + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = SHT/ + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = SUPARG \ + SUPARG2 \ + SUPARGF \ + SUPARGF2 \ + SUFFIX \ + SHT_VAR_LTR \ + SHT_AXISYM \ + GEN \ + _GEN \ + GENF \ + _GENF \ + SHT_F77_API + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed +# in the related pages index. If set to NO, only the current project's +# pages will be listed. + +EXTERNAL_PAGES = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# manageable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/logo_cnrs_small.png b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/logo_cnrs_small.png new file mode 100644 index 000000000..f9b01986c Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/logo_cnrs_small.png differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/main.dox b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/main.dox new file mode 100644 index 000000000..5c942b596 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/doc/main.dox @@ -0,0 +1,1370 @@ + +/** \mainpage High performance Spherical Harmonic Transform for numerical simulations. + * + * SHTns is a high performance library for Spherical Harmonic Transform written in C, aimed at numerical simulation (fluid flows, mhd, ...) in spherical geometries.\n + * + * Main features : + * - \link bench blazingly fast\endlink. + * - distributed under the open source \link license CeCILL License\endlink (GPL compatible). + * - both scalar and \link vsh vector transforms\endlink. + * - backward and forward (synthesis and analysis) functions. + * - flexible truncation (degree, order, azimuthal periodicity). + * - spatial data can be stored in latitude-major or longitude-major arrays. + * - various conventions (normalization and Condon-Shortley phase). + * - can be used from Fortran, c/c++, Python, and Java programs. + * - a highly efficient Gauss algorithm working with Gauss nodes (based on Gauss-Legendre quadrature). + * - support for regular grids (but they require twice the number of nodes than Gauss grid). + * - support for SSE2, SSE3 and AVX, AVX2, AVX-512 vectorization, as well as Xeon Phi (KNL), Blue Gene/Q and AltiVec VSX. + * - parallel transforms with OpenMP. + * - *Beta*: automatic \link gpu GPU off-loading\endlink with nvidia cuda (Kepler & Pascal). + * - synthesis (inverse transform) at any coordinate (not constrained to a grid) useful for rendering purposes. + * - on-the-fly transforms : saving memory and bandwidth, they are even faster on modern architecture. + * - accurate up to spherical harmonic degree l=16383 (at least). + * - \link rotation rotation functions\endlink to rotate spherical harmonics (beta). + * - \link operators special spectral operator\endlink functions that do not require a transform (multiply by cos(theta)...) . + * - scalar transforms and rotations for complex spatial fields. + * - SHT at fixed m (without fft, aka Legendre transform - beta). + * + * Using several \link opt optimizations\endlink, it is intended to be \link bench very fast\endlink. + * + * It requires the FFTW library for Fast Fourier Transforms. + * + * If you use SHTns for research work, please cite the paper: Efficient Spherical Harmonic Transforms aimed at pseudo-spectral numerical simulations, + * also available from arXiv. + * + * If you accept the open source \link license CeCILL License\endlink (GPL compatible french License), you can download SHTns. + * + * Please report bugs and feature request on the issue tracker. + * + * \see shtns.h for the definitions of variables, macros and functions. + * \see The example programs (in \link SHT_example.f Fortran \endlink, \link SHT_example.c C \endlink and \link SHT_example.py Python \endlink) to get started. + * \see The organisation of data used by SHTns is described in \ref spat. + * \see The description of \ref opt. + * + * \author SHTns is written by Nathanael Schaeffer (CNRS). Email: nathanael.schaeffer@ujf-grenoble.fr + * + * \image html logo_cnrs_small.png + * +*/ + + +/** \page compil Compiling and installing SHTns + +To compile SHTns, you need a C compiler and the FFTW library version 3.0 (or better 3.3) or later, carefully optimized and installed. +On modern x86 processors, we recommend using GCC 4.0 or later as it produces the fastest vectorized code. + +First run \code ./configure --help \endcode to see the available configure options. +Then, for example run \code ./configure --prefix=$HOME --enable-openmp \endcode +if you want to install the multi-threaded transform library to $HOME/lib and the headers to $HOME/include. + +To install the Python extension, see \ref python. + +The configure script will detect your FFTW library capabilities and other system dependant features. +You may optionally adapt the resulting \c Makefile and \c sht_config.h to your architecture and compiler. +Then compile with \c make and install with \c make \c install. + +SHTns requires FFTW, which can be installed as a compiled package on many operating systems. +However, we recommend to compile it and install it yourself, as it can lead to much better performance. +If FFTW has not been compiled and tuned carefully for your machine, you may get bad performance with SHTns (down to 50% slower !). +Furthermore, if FFTW is more recent than 3.3, or has not been configured with \c --enable-openmp (see below), SHTns cannot do the +Fourier transform part in parallel. + +\section fftw Compiling and installing FFTW + +You can download the latest FFTW package from http://www.fftw.org, +compile it and install it. +In order to use the parallel transforms, make sure to pass \c --enable-openmp to the configure script. +We also recommend passing \c --enable-sse2 or \c --enable-avx to the configure script on x86 architectures. +You may also take a look at the FFTW documentation for compilation advice. + +For example: + +\code ./configure --enable-openmp --enable-shared --enable-avx --prefix=$HOME/usr +make +make install \endcode + +That's it, FFTW is now installed and ready for use. + +\subsection mkl Using MKL instead of FFTW + +SHTns can use MKL instead of FFTW. To do this, pass \c --enable-mkl to the configure script. +Performance can be slightly better. + +\note Currently the call of MKL through the fftw wrappers is not thread safe. +The user is responsible for working around this MKL problem as indicated by intel. +If you want to call SHT function from multiple threads, you must tell MKL how many threads you will use BEFORE initializing shtns : +\code +#include "fftw3_mkl.h" +fftw3_mkl.number_of_user_threads = 4; +sht = shtns_create(...); +... +\endcode + +\section makefile Preparing the Makefile + +Run \c ./configure in the SHTns directory. +You can use \c --enable-openmp to enable multi-threaded transforms, +and \c --enable-long-double to (maybe) increase accuracy during initialization (not recommended). +You can then edit the resulting Makefile: + +\li set \c PREFIX= to the desired install path. + +\li further editing is needed if you don't use gcc + +\section config Changing default options + +Simple tunings can be done by passing options to \c ./configure (see \c ./configure \c --help) + +\section comp Compiling + +\li type \code make \endcode to compile SHTns. it will produce the library \c libshtns.a + +\li type \code make PREFIX=/usr/local install \endcode to install the library in your system (set PREFIX to the desired location, default is $HOME). + +\li type \code make docs \endcode to generate this documentation, placed in the doc/html/ subdirectory. + +\li type \code make time_SHT \endcode to build the test and timing program. + +*/ + + + +/** \page spat Spatial data layouts and grids used by SHTns + +The angular coordinates on a spherical shell are the co-latitude \f$ \theta \f$ and the longitude \f$ \phi \f$. + +The spatial discretization is defined by a call to \ref shtns_init; or to \ref shtns_set_grid or \ref shtns_set_grid_auto after \ref shtns_create. + +A field \e A (or one of its component in case of a vector field) is discretized on an ordered grid, which consists of + - NPHI equally spaced nodes in longitude, spanning the range of angle between 0 (included) and \f$2\pi\f$/MRES (excluded), + - NLAT gauss nodes or equally spaced nodes (depending on \ref shtns_type) in latitude, spanning angles from 0 to \f$ \pi \f$. + +There are constraints on the sizes NLAT and NPHI. The sampling theorem requires NPHI > 2*MMAX, with MMAX the highest Fourier mode to be resolved. +Similarly NLAT > LMAX is required for a Gauss-Legendre quadrature, while on a regular grid NLAT > 2*LMAX is needed for the Féjer and Clenshaw-Curtis quadratures. + +When dealing with non-linear equations, or more generally when analysing data that is not band-limited to LMAX and/or MMAX, anti-aliasing constraints +exist. For a given non-linear order of the equation N (typically 2 for a quadratic non-linear term), the anti-aliasing conditions are : + - NPHI > (N+1)*MMAX + - NLAT > (N+1)*LMAX/2 for Gauss-Legendre quadrature (Gauss nodes, non-equispaced). + - NLAT > (N+1)*LMAX for Féjer or Clenshaw-Curtis quadratures (equispaced nodes). + +Furthermore, the FFT is more efficient for certain values of NPHI and/or NLAT. If you do not require specific NLAT or NPHI, you can let SHTns choose them +for you, by using \ref shtns_set_grid_auto with nphi and/or nlat set to zero. + +Identifying a grid point with its indices \c it and \c ip in latitudinal and longitudinal direction respectively (indices start at 0), one has : + - \f$ \theta \f$ = \c acos(ct[it]) where \c ct = \ref shtns_info.ct is initialized by the call to \ref shtns_init + - \f$ \phi \f$ = \c ip * 2\f$\pi\f$/(NPHI*MRES) and \ref PHI_RAD and \ref PHI_DEG can be used to get the phi angle corresponding to \c ip. + - How to access \f$ A(\theta,\phi) \f$ depends on the data layout, but it is always a contiguous array of double precision floating point values (64 bit) + +Currently, three data layouts are supported. \ref phi_fast, \ref theta_fast, and \ref native. + +\section phi_fast Contiguous longitudes + +In this layout, increasing longitudes are stored next to each other for each latitude. +That is \f$ A(\theta,\phi) \f$ = \c A[it*NPHI + ip] in C or \c A(ip,it) in Fortran. +Use \ref SHT_PHI_CONTIGUOUS to instruct \ref shtns_init to use this spatial data layout : + +\code shtns_init ( sht_gauss | SHT_PHI_CONTIGUOUS, ... ) \endcode will tell shtns to +precompute everything for a gauss grid, and spatial data stored with longitude varying +fastest. + +\section theta_fast Contiguous latitudes + +In this layout, increasing latitude are stored next to each other for each longitude. +That is \f$ A(\theta,\phi) \f$ = \c A[ip*NLAT + it] in C or \c A(it,ip) in Fortran. +Use \ref SHT_THETA_CONTIGUOUS to instruct \ref shtns_init to use this spatial data layout. + +\section native Native layout + +The native way of storing spatial field data (which will help you achieve the best performance with SHTns) +is the same as the \ref theta_fast layout, except that it requires you to allocate slightly more +memory for a field than the NLAT*NPHI double values. +Namely NLAT*(NPHI/2+1)*2 doubles are required (instead of NLAT*NPHI) to be able tu use the in-place FFT of FFTW. + +In Fortran this means you will allocate data as if the phi direction had (NPHI/2+1)*2 points instead of NPHI. +The additional space, is located at the end of the useful data, and you don't need to worry about it. + +To instruct \ref shtns_init that your spatial data has been set up using this layout, use \ref SHT_NATIVE_LAYOUT. + +\note One must be careful when allocating spatial data, as the Fourier transform requires some additional space.\n Precisely, the number +of required \c double is \ref NSPAT_ALLOC = NLAT*(NPHI/2+1)*2. The first NLAT*NPHI values are the spatial data. + +\note In addition, spatial data must be allocated using the \c fftw_malloc function, for example using : +\code A = fftw_malloc( NSPAT_ALLOC * sizeof(double) );\endcode + +\note It is not recommended to use the native layout with Fortran or Python. + + +*/ + + +/** \page spec Spherical Harmonics storage and normalization + +\section spec_data Spherical Harmonic coefficients layout + +The field \em A is decomposed on the basis of spherical harmonics Ylm (degree \e l, order \e m) : +\f[ A(\theta,\phi) = \sum_{l,m} A_l^m Y_l^m(\theta,\phi)\f] +The series is truncated at degree LMAX and order MMAX*MRES, +and only order that are multiple of MRES are described. + +\subsection spat_real For real-valued spatial data A + +The collection of Alm (spherical harmonics coefficient of degree \e l and order \e m) is stored in an array of \c complex \c double floating point values. +The spherical harmonic truncation is defined by a call to \ref shtns_init or to \ref shtns_create which returns an \c shtns_cfg object (pointer to \ref shtns_info) +from which the the size of the array, \ref shtns_info.nlm, can be read (see examples). + +The NLM coefficients Alm are stored in a one-dimensional array, grouped by \e m.\n +The details of the storage may depend on the algorithm, and to access a particular coefficient, you should always use the following macros : + +\subsubsection c_real From C + - \ref LM(shtns, l,m) gives the index in the array for coefficient of degree \e l and order \e m. + - \ref LiM(shtns l,im) gives the index in the array for coefficient of degree \e l and order \e im*MRES. + +Hence \c Alm[LM(shtns,l,m)] is the (complex) SH coefficient of degree \e l and order \e m. + + +\subsubsection f_real From Fortran + - call shtns_lmidx(lm, l, m), will return the index \e lm for degree \e l and order \e m + +\note For real spatial data, the Spherical Harmonic coefficients with negative \e m are related to the complex conjugate of the +positive \e m coefficients : \f$ A_l^{-m} = (-1)^{m} (A_l^m)^*\f$. For efficiency purposes, only the coefficients with positive \e m are stored. + +\note There is no test on bounds, so that LM(shtns, l,m) with \e l or \e m that is not described, will give undefined result +(in particular for an \e m that is not a multiple of \c MRES) + +To perform loops on all coefficients, use the macros \ref LM_LOOP and \ref LM_L_LOOP +in combination of the arrays \ref shtns_info.li which give the degree \e l and functions of it for any array index. + +\subsection spat_cplx For complex-valued spatial data + +Complex spatial data can be transformed using \ref spat_cplx_to_SH and \ref SH_to_spat_cplx +The indexing of the spectral coefficients in \e Alm is then different from the real-valued data. +In addition, all \e l and \e m are present. +Indeed to access coefficient of degree \e l and \e m, we use +\code Alm[l*(l+1)+m] \endcode +or +\code Alm(l*(l+1)+m+1) \endcode +from C or Fortran respectively. + +\section Allocation +Allocation for a SH description is simply done with : +\code Alm = fftw_malloc( NLM * sizeof(complex double) );\endcode +The use of fftw_malloc ensures proper alignment of data for SSE vectorization (if fftw has been properly compiled with --enable-sse2 or --enable-avx). + +\section norm Normalization + +Several normalizations for the spherical harmonics exist (details on wikipedia). +SHTns lets you choose one of the following : +
      +
    • Orthonormalized is the default (also used in the GSL) + +\f[ Y_l^m(\theta, \phi) = \sqrt{\frac{2l+1}{4\pi}} \sqrt{\frac{(l-m)!}{(l+m)!}} \, P_l^m(\cos \theta) \, \exp(im\phi) \f] + +
    • Four-pi normalized + +\f[ Y_l^m(\theta, \phi) = \sqrt{2l+1} \sqrt{\frac{(l-m)!}{(l+m)!}} \, P_l^m(\cos \theta) \, \exp(im\phi) \f] + +
    • Schmidt semi-normalized + +\f[ Y_l^m(\theta, \phi) = \sqrt{\frac{(l-m)!}{(l+m)!}} \, P_l^m(\cos \theta) \, \exp(im\phi) \f] + +
    + +\ref shtns_init uses the default (defined by \ref SHT_DEFAULT_NORM) but you can choose another normalization +by calling \ref shtns_create instead. + +The Legendre associated functions are defined by : + +\f[ P_l^m (x) = (-1)^m\ (1-x^2)^{m/2}\ \frac{d^m}{dx^m}P_l(x) \f] + +which includes the Condon-Shortley phase \f$ (-1)^m \f$ by default. + +For reference, function \ref SH_to_point gives a simple explicit implementation of the inverse SH transform (synthesis). + +\subsection norm_opt Normalization variations + +Use \ref shtns_create with \ref SHT_NO_CS_PHASE to disable the Condon-Shortley phase. +For example, to initialize a Schmidt semi-normalized transform of maximum degree 16 without Condon-Shortrley phase, use +\code shtns_create(16, 16, 1, sht_schmidt | SHT_NO_CS_PHASE); \endcode + +By default, SHTns uses "complex" spherical harmonic normalization. However, as it deals only with real functions, +the m<0 coefficients are not stored, since they are complex conjugate of the m>0 ones. +Thus, one must pay attention, that the m>0 coefficient have to be counted twice in a total energy calculation. + +An alternative to this "complex" normalization is the "real" normalization, for which the energy is simply +the sum of the coefficients (m>=0) squared. Use \ref shtns_create with \ref SHT_REAL_NORM to use a "real" spherical harmonic normalization. +This is the usual "real" spherical harmonics, if one takes the complex conjugate of the coefficients. + +A few useful examples, for orthonormal spherical harmonics : + - a constant unit value on the sphere is represented by the coefficient \f$ c_0^0 = \sqrt{4\pi} \f$. + - \f$ \cos \theta \f$ is represented by the coefficient \f$ c_1^0 = \sqrt{4\pi/3} \f$. + - \f$ \sin \theta \, \cos \phi \f$ is represented by \f$ c_1^1 = -\sqrt{2\pi/3} \f$ (with Condon-Shortley phase) + - with a "real" normalization instead, one would have \f$ c_1^1 = -\sqrt{4\pi/3} = -c_1^0 \f$. + +The functions \ref sh00_1(), \ref sh10_ct(), \ref sh11_st() \ref shlm_e1() will help to build simple +spectral fields, no matter what normalization you choose. + +\subsection nrj Energy + +\note The energy of a scalar field can be retrieved from it's spherical harmonic representation as: +\f[ \int ||q||^2 = \sum_{l,m \geq 0} C_m N_l \: |Q_l^m|^2 \f] +where \f$ C_m \f$ and \f$ N_l \f$ are the following normalization factor: +- if \ref SHT_REAL_NORM has been used, \f$ C_m = 1 \f$. Otherwise \f$ C_m = 2 - \delta_{m0} \f$ (ie \f$ C_m=1 \f$ for \f$ m=0 \f$ and \f$ C_m = 2 \f$ for \f$ m>0 \f$). +- for \ref sht_orthonormal : \f$ N_l = 1 \f$ +- for \ref sht_fourpi : \f$ N_l = 4\pi \f$ +- for \ref sht_schmidt : \f$ N_l = 4\pi/(2l+1) \f$ + +\subsection Troubleshooting +If you have problems in getting your spherical harmonic coefficient right, you may check the following : + - Schmidt semi-normalization ? try multiplying or dividing by \f$ \sqrt{2l+1} \f$ + - Condon-Shortley phase ? try multiplying by \f$ (-1)^m \f$ + - Real or Complex ? try multiplying or dividing the m>0 coefficients by \f$ \sqrt{2} \f$ + - Relative sign ? try to take the complex conjugate of the coefficients. + - Does the array include l=0 ? + +*/ + + +/** \page vsh Vector Spherical Harmonics as implemented in SHTns + +SHTns also provides vector transforms. + +\section vsh_def Radial - Spheroidal - Toroidal decomposition + +The components of a vector field on a sphere \f$\mathbf{v}(\theta,\phi) = (v_r, v_\theta, v_\phi)\f$ +in canonical spherical coordinates cannot be transformed as scalars, because they do not behave like scalar fields +under rotation for example (actually only the radial component does). + +To overcome this, we use the following decomposition: +\f[ \mathbf{v} = Q(\theta,\phi) \mathbf{e_r}+ r \nabla S(\theta,\phi) - \mathbf{r} \times \nabla T(\theta,\phi) \f] +where Q, S and T are respectively the radial, spheroidal and toroidal scalar fields. We have explicitely: +\f[ \mathbf{v} = \left( \begin{array}{rcl} +Q & & \\ +\partial_\theta S & + & \frac{1}{\sin\theta} \partial_\phi T \\ +\frac{1}{\sin\theta} \partial_\phi S & - &\partial_\theta T +\end{array} \right) \f] + +Expanding Q, S and T (which are scalar fields) in spherical harmonics gives: +\f[ \mathbf{v} = \sum_{l,m} \left( Q_l^m \, Y_l^m(\theta,\phi) \mathbf{e_r}+ S_l^m \, r \nabla Y_l^m(\theta,\phi) - T_l^m \, \mathbf{r} \times \nabla Y_l^m(\theta,\phi) \right) \f] + +If this only involves a simple scalar transform for the radial component, it does involve derivatives of spherical harmonics for the tangential components. + +The functions \ref SHqst_to_spat and \ref spat_to_SHqst transform vector fields from their +spherical coordinate spatial representation \c Vr, \c Vt, \c Vp to their spectral representation using \c Qlm, \c Slm and \c Tlm. + +The functions \ref SHsphtor_to_spat and \ref spat_to_SHsphtor do the same for a tangential vector on the sphere (without radial component). + +\see A closely related definition of vector spherical harmonics on wikipedia. + +\note The energy of the vector field can be retrieved from it's orthonormal spherical harmonic representation as: +\f[ \int ||\mathbf{v}||^2 = \sum_{l,m \geq 0} C_m N_l \: \left( |Q_l^m|^2 \, + \, l(l+1)\,\left( |S_l^m|^2 + |T_l^m|^2 \right) \right) \f] +where \f$ C_m \f$ and \f$ N_l \f$ are defined in the \ref nrj section. + + +\section vsh_3d Special case of 3D divergence-free fields + +For a divergenceless 3D vector, the radial scalar Q and the spheroidal scalar S can be derived from the same poloidal scalar P : +\f[ Q = \frac{l(l+1)}{r} P \f] +\f[ S = \frac{1}{r} \frac{\partial \, rP}{\partial r} \f] +which corresponds to the poloidal/toroidal decomposition that ensures the vector field to be divergence-free. +\f[ \mathbf{v} = \nabla \times (T \mathbf{r}) + \nabla \times \nabla \times (P \mathbf{r}) \f] + +*/ + + +/** \page opt Optimizations implemented in SHTns + +SHTns is an implementation of the Spherical Harmonic Transform which aims at being accurate and fast, +with direct numerical simulations in mind. As such, the following optimizations are implemented : + +\section opt_fft Use the Fast-Fourier Transform + +Any serious SHT should use the FFT, as it improves accuracy and speed. +SHTns uses the FFTW library for the fast Fourier transform, a portable, +flexible and blazingly fast FFT implementation. + +\section opt_mirror Take advantage of mirror symmetry + +This is also a classical optimization. Due to the defined symmetry of spherical harmonics with respect +to a reflection about the equator, one can reduce by a factor 2 the operation count of both direct and reverse +transforms. + +\section opt_polar Polar optimization + +A less common, but still classic optimization : high m's spherical harmonics have their magnitude decrease exponentially +when approaching the poles. SHTns use a threshold below which the SH is taken to be zero. +The default value for this threshold is defined by \ref SHT_DEFAULT_POLAR_OPT, +but you can also choose it with the \c eps parameter of the \ref shtns_set_grid function, +trading some accuracy for more speed. +Around 5% to 15% speed increase are typical values for a SHT with a large MMAX. + +\section opt_cache Cache optimizations + +Cache optimizations have been carried out throughout the code. +This means ordering coefficients and stripping out systematic zeros. + +\section opt_size Spatial Size optimization + +When using \ref shtns_set_grid_auto, you can let SHTns choose the optimal spatial sizes for +the spherical harmonic truncation you specified with \ref shtns_create. +The spatial sizes are chosen so that no aliasing occurs, and ensuring FFTW will perform as fast +as possible. + +\section opt_vect Explicit Vectorization + +Most x86 CPUs have support for Single-Instruction-Multiple-Data (SIMD) operations in double precision, +allowing to perform the same double precision arithmetic operations on a vector of 2 (SSE2) or 4 (AVX) double precision numbers, +effectively multiplying by 2 or 4 the computing power. Modern compilers attempt to vectorize the code, but they cannot do miracles. +SHTns uses explicit vectorization extensively (thanks to the GCC vector extensions) to use the full computing power of your CPU. + +\section opt_runtime Runtime tuning of algorithm + +The default mode used by SHTns is to measure performance of the different algorithms, and choose +the one that performs best (it will also check that the accuracy is good enough). +However, there are situation where either the Gauss-Legendre algorithm or a regular grid is required, and you +can choose to do so using the adequate \ref shtns_type when calling \ref shtns_init or \ref shtns_set_grid. + +*/ + +/** \page bench Speed and Accuracy + +\section Speed + +SHTns does not implement any "fast" algorithm. However, timings with other Spherical Harmonic Transform tools (including a fast algorithm) +show that SHTns performs much faster than any other. Furthermore, even at large sizes, the fast algorithm we tested does not seem to be willing to take the lead.
    +Since v3.2, SHTns implements the new recurrence relation of Ishioka (2018), leading to faster transforms, especially for large transforms. + +
    + + + + + + + + + + + +
    \f$\ell_{max}\f$ shtools 2.8 (Gauss)libpsht (1 thread)SpharmonicKit2 2.7 (fast)SHTns 2.1 (1 thread, Gauss) SpharmonicKit2/SHTns
    63 1.14 ms 1.05 ms 1.1 ms 0.09 ms 12.2
    127 3.5 ms 4.7 ms 5.5 ms 0.60 ms 9.2
    255 28 ms 27 ms 21 ms 4.2 ms 5.0
    511 200 ms 162 ms 110 ms 28 ms 3.9
    1023 1.8 s 850 ms 600 ms 216 ms 2.8
    2047 13.0 s 4.4 s NA (out of memory) 1.6 s NA
    4095 NA (seg fault) 30.5 s 11.8 s NA
    + +Average times for forward or backward scalar transform on an Intel Xeon X5650 (2.67GHz), with gcc 4.4.5 and "-O3 -march=native -ffast-math" compilation options. + +
    + +\section par_speed Parallel speed + +SHTns has parallel algorithms since version 2.2. +When compared to libpsht (parallelized with OpenMP too), SHTns is faster especially for relatively small sizes. + +
    + + + + + + + + + + +
    \f$\ell_{max}\f$libpsht 20110131SHTns 2.2.1 libpsht/SHTns
    63 5.0 ms 0.05 ms 100
    127 5.4 ms 0.22 ms 24.5
    255 8.5 ms 1.4 ms 6.1
    511 23.5 ms 6.5 ms 3.6
    1023 125 ms 43 ms 2.9
    2047 700 ms 331 ms 2.1
    4095 3.0 s 2.0 s 1.5
    + +Average wall time for forward or backward scalar transform using 12 parallel threads on an Intel Xeon X5650 (2.67GHz), with gcc 4.4.5 and "-O3 -march=native -ffast-math -fopenmp" compilation options. +
    + + +\section Accuracy + +We claim that the accuracy of SHTns is as good as it can be with double precision floating point math. +Rescaling is performed for large transform where the recurrence relation would otherwise underflow the double precision numbers. +SHTns has been tested on x86 architecture with SSE2 double precision floating point math (64 bit) to be accurate up to l=16383 at least. +The measured error for a back and forth scalar transform using a Gauss-Legendre algorithm for various truncation levels \c lmax is plotted below. + +\image html accuracy.png +\image latex accuracy.png "Accuracy of our scalar Gauss-Legendre transform" width=10cm + +Don't trust our word, these results are obtained by running the time_SHT program, shipped with SHTns. For example : +\code +make time_SHT +./time_SHT 511 -iter=1 -quickinit +\endcode + +*/ + +/** \page usage Using SHTns in a C program + +To make SHTns known by your C program, add +\code +#include +#include +\endcode +in the preamble of your source file. + +First of all you need to initialize SHTns. There are two ways to do this : +\li calling \ref shtns_init function, +\li or calling \ref shtns_create followed by \ref shtns_set_grid or \ref shtns_set_grid_auto. This way lets you choose normalization and optimization. + +Multi-threaded transforms can be enabled (if available, see \ref compil) by a call to \ref shtns_use_threads before shtns_init or shtns_create. + +Then you must allocate some memory (with fftw_malloc so that the memory is properly aligned for vectorized code), +and finally you can perform some spherical harmonic transforms. + +\see Look at shtns.h for the function definitions and documentation. +\see See the \link SHT_example.c C example \endlink for a simple usage of SHTns in a C program. + +When your program is ready, compile it adding these options to the compiler (gcc) : +\code +-L/path/to/lib/ -I/path/to/include/ -lshtns -lfftw3 -lm +\endcode + +\example SHT_example.c + \brief A Fortran example program that performs backward and forward Spherical Harmonic Transforms using SHTns. + + Compile using: \code make SHT_example \endcode + +*/ + + +/** \page fortran Using SHTns with Fortran + +SHTns provides two interfaces to Fortran language (compatible with gfortran). + +\section f77 Basic Fortran 77 interface + +First of all you need to initialize SHTns. There are two ways to do this : +\li calling one of the \c shtns_init_* subroutines, +\li or calling \c shtns_set_size followed by \c shtns_precompute or \c shtns_precompute_auto. +This way lets you choose normalization and optimization. + +Multi-threaded transforms can be enabled (if available, see \ref compil) by a call to \ref shtns_use_threads before shtns_init or shtns_create. + +Note that you can call initialization function(s) only once, which means that only one size and grid can be +used with the Fortran interface (C and Python do not have this limitation). +Then you must allocate some memory, and finaly you can perform some spherical harmonic transforms. + +\see See The full reference of the \ref fortapi +\see See the \link SHT_example.f Fortran example \endlink for a simple usage of SHTns from Fortran language. + +When your program is ready, compile it adding these options to the compiler (gfortran) : +\code +-L/path/to/lib/ -I/path/to/include/ -lshtns -lfftw3 -lm -lc +\endcode + +\section f03 Fortran 2003 iso_c_binding + +An iso_c_binding is provided in file \c shtns.f03 for a direct call to the C interface. + +\see See the \link SHT_example.f90 Fortran 2003 example \endlink that uses these bindings. + + +\example SHT_example.f + \brief A Fortran example program that performs backward and forward Spherical Harmonic Transforms using SHTns. + + Compile using : \code make SHT_fort_ex \endcode + \see fortapi + \see \ref f77 + +\example SHT_example.f90 + \brief A Fortran 2003 example using iso_c_binding program that performs backward and forward Spherical Harmonic Transforms using SHTns. + + Compile using : \code make SHT_f90_ex \endcode + \see fortran + \see \ref f03 + + +*/ + +/** \page loadsave Loading and saving config (or plans) + +SHTns provides a simple way to load/save a configuration from/to a file. +It allows: + - to save initialization time if you often use the same transform sizes. + - better reproducibility at bit-level between several runs. + - ensure that all MPI processes use the same config/plan. + +All the calling program has to do is add \ref SHT_LOAD_SAVE_CFG to the flags or layout parameter when calling +\ref shtns_set_grid / \ref shtns_set_grid_auto (C) or shtns_precompute / shtns_precompute_auto (Fortran). +SHTns will first look for the files \c shtns_cfg and \c shtns_cfg_fftw and use the data stored therein. +If no configuration stored in the files correspond to the required one, SHTns will proceed as usual +and then store the configuration (unless \ref sht_quick_init mode is used). + +\section mpi_safe Ensuring same config is used across MPI processes: + +\code +flags |= SHT_LOAD_SAVE_CFG; +if (rank > 0) MPI_Barrier(); // all processes except 0 wait here until process 0 has initialized shtns. +shtns_set_grid_auto(... flags ...); // this will save the config to a file on process 0 and load from file on other processes. +if (rank == 0) MPI_Barrier(); // other processes now resume and load the config from file. +\endcode + +*/ + + +/** \page python Using SHTns with Python + +SHTns provides a Python interface that uses NumPy arrays to perform Spherical Harmonic Transforms. +The Python interface has been generated using SWIG (but you don't need it to compile the the Python package). + +\li Compile using (see also \ref compil) +\code ./configure --enable-python +make +make install \endcode +Optionally you can indicate an alternate pyhton interpreter to \c ./configure using PYTHON= (see ./configure --help).
    +If you cannot install as root, you can alternatively intall the python package as user, replacing \code make install \endcode with +\code python setup.py install --user \endcode + +\li Use within a python script or shell \code import shtns \endcode + +To start using SHTns you must then create an sht object, from which you can call the transform functions and more. +The arrays should be created using NumPy. +\see See the \link SHT_example.py Python example \endlink to get started, +and the full working example \link shallow_water.py \endlink that solves the non-linear shallow water equations. + +In case of segfaults, you may have alignment problems (should not occur on 64 bit systems). +Please file a bugreport or contact the author. + +\example SHT_example.py + \brief A Python example using NumPy and SHTns that performs backward and forward Spherical Harmonic Transforms. + +\example shallow_water.py + \brief Solves the non-linear barotropically unstable shallow water test case in Python. + +*/ + +/** \page java Using SHTns with Java + +SHTns provides a JNI wrapper (courtesy of Julien Pierret) that allows basic usage from Java programs. +See the \c shtns_jni folder. + +*/ + + +/** \page gpu Using SHTns with GPU (CUDA) + +SHTns supports nvidia Kepler and Pascal GPUs, using optimized cuda transforms. +There are two ways to use GPUs with SHTns: automatic off-loading where the GPU is used transparently (not much to change in your code) +and SHTns handles all the data transfers between GPU and CPU memory. +In addition, routines for performing transforms of data residing already on the GPU are provided. + +In all cases, you must first configure SHTns to use cuda: + +\code ./configure --enable-cuda +make +make install \endcode + +\section offload Automatic off-loading + +To enable automatic off-loading (if possible and if faster), simply add \c SHT_ALLOW_GPU to the shtns_type argument of \ref shtns_set_grid_auto. + +\code +sht_mode |= SHT_ALLOW_GPU +shtns_set_grid_auto(shtns, shtmode, polaropt, nlorder, &NLAT, &NPHI); +\endcode + +\warning the transforms are no more guaranteed to be thread-safe, because the GPU ones are not. +Please make sure to use different shtns configs (or plans) if you want to call transform functions from multiple threads. +See also \ref cloning below. + +For best performance, you must also allocate memory for your spatial and spectral arrays using \ref shtns_malloc and subsequently free it with \ref shtns_free. +This way, so-called "pinned" memory is used when cuda is enabled, allowing faster data transfer between host and device. + +If you are not calling transform functions from multiple threads, you have nothing more to do. + +Here is a table giving an idea of the performance, comparing intel broadwell, intel KNL, and nvidia Pascal: + +
    + + + + +
    machine \ref SH_to_spat \ref spat_to_SH
    Broadwell, 20 cores 7.80 ms 8.41 ms
    KNL 7250, 68 cores 3.65 ms 3.61 ms
    Pascal P100 GPU (including transfer) 3.46 ms 4.24 ms
    + +Average wall time for forward or backward scalar transform on various machines. +The transform were performed using \c time_SHT with \c lmax=1023 and \c -nlorder=2 (dealiasing for non-linear terms). +Note that the GPU timings include the time to transfer data (auto-offload mode) from and to the IBM Power8 host through nvlink. +All timings include the FFT. +
    + + +\section cushtns On-device transforms + +On device transforms are declared in \ref shtns_cuda.h. Basically the regular transform functions have been prefixed by \c cu_ to indicate that they +work on device memory. See \ref cuda. +In principle, it is also possible to use cuda *unified memory* allocated by \c cudaMallocManaged(), but this has not been tested. + +As for the automatic off-loading, the \link cuda GPU transforms\endlink are NOT thread-safe +and the same shtns config should never been used from simultaneous threads. +To help the user to create clones of the same shtns config, \link cloning cloning functions\endlink for GPU transforms have been added. + +\section cloning Cloning shtns configs + +The function \ref cushtns_clone creates a new identical configuration, but with new GPU ressources (temporary buffers, streams, ...). +The user can give custom cuda streams or let shtns set his own (by passing 0 for each cuda stream). + +The resulting shtns config can be used concurently with the original one. Repeat the cloning for each concurrent thread. + +*/ + +/** \page license License + \brief CeCILL Free Software License Agreement + +\htmlonly + + + +

    CeCILL FREE SOFTWARE LICENSE AGREEMENT

    + +
    + Version 2.1 dated 2013-06-21 +
    + +
    +

    Notice

    + +

    This Agreement is a Free Software license agreement that is the result of + discussions between its authors in order to ensure compliance with the two main + principles guiding its drafting:

    + +
      +
    • firstly, compliance with the principles governing the distribution of Free + Software: access to source code, broad rights granted to users,
    • + +
    • secondly, the election of a governing law, French law, with which it is + conformant, both as regards the law of torts and intellectual property law, and the + protection that it offers to both authors and holders of the economic rights over + software.
    • +
    + +

    The authors of the CeCILL1 license are:

    + +

    Commissariat à l'énergie atomique et aux énergies + alternatives - CEA, a public scientific, technical and industrial research + establishment, having its principal place of business at 25 rue Leblanc, immeuble Le + Ponant D, 75015 Paris, France.

    + +

    Centre National de la Recherche Scientifique - CNRS, a public scientific and + technological establishment, having its principal place of business at 3 rue + Michel-Ange, 75794 Paris cedex 16, France.

    + +

    Institut National de Recherche en Informatique et en Automatique - Inria, a public + scientific and technological establishment, having its principal place of business at + Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex, France.

    +
    + +
    +

    Preamble

    + +

    The purpose of this Free Software license agreement is to grant users the right to + modify and redistribute the software governed by this license within the framework of + an open source distribution model.

    + +

    The exercising of this right is conditional upon certain obligations for users so + as to preserve this status for all subsequent redistributions.

    + +

    In consideration of access to the source code and the rights to copy, modify and + redistribute granted by the license, users are provided only with a limited warranty + and the software's author, the holder of the economic rights, and the successive + licensors only have limited liability.

    + +

    In this respect, the risks associated with loading, using, modifying and/or + developing or reproducing the software by the user are brought to the user's + attention, given its Free Software status, which may make it complicated to use, with + the result that its use is reserved for developers and experienced professionals + having in-depth computer knowledge. Users are therefore encouraged to load and test + the suitability of the software as regards their requirements in conditions enabling + the security of their systems and/or data to be ensured and, more generally, to use + and operate it in the same conditions of security. This Agreement may be freely + reproduced and published, provided it is not altered, and that no provisions are + either added or removed herefrom.

    + +

    This Agreement may apply to any or all software for which the holder of the + economic rights decides to submit the use thereof to its provisions.

    + +

    Frequently asked questions can be found on the official website of the CeCILL + licenses family (http://www.cecill.info/index.en.html) + for any necessary clarification.

    +
    + +
    +

    Article 1 - DEFINITIONS

    + +

    For the purpose of this Agreement, when the following expressions commence with a + capital letter, they shall have the following meaning:

    + +

    Agreement: means this license + agreement, and its possible subsequent versions and annexes.

    + +

    Software: means the software in + its Object Code and/or Source Code form and, where applicable, its documentation, "as + is" when the Licensee accepts the Agreement.

    + +

    Initial Software: means the + Software in its Source Code and possibly its Object Code form and, where applicable, + its documentation, "as is" when it is first distributed under the terms and + conditions of the Agreement.

    + +

    Modified Software: means the + Software modified by at least one Contribution.

    + +

    Source Code: means all the + Software's instructions and program lines to which access is required so as to modify + the Software.

    + +

    Object Code: means the binary + files originating from the compilation of the Source Code.

    + +

    Holder: means the holder(s) of + the economic rights over the Initial Software.

    + +

    Licensee: means the Software + user(s) having accepted the Agreement.

    + +

    Contributor: means a Licensee + having made at least one Contribution.

    + +

    Licensor: means the Holder, or + any other individual or legal entity, who distributes the Software under the + Agreement.

    + +

    Contribution: means any or all + modifications, corrections, translations, adaptations and/or new functions integrated + into the Software by any or all Contributors, as well as any or all Internal + Modules.

    + +

    Module: means a set of sources + files including their documentation that enables supplementary functions or services + in addition to those offered by the Software.

    + +

    External Module: means any or + all Modules, not derived from the Software, so that this Module and the Software run + in separate address spaces, with one calling the other when they are run.

    + +

    Internal Module: means any or + all Module, connected to the Software so that they both execute in the same address + space.

    + +

    GNU GPL: means the GNU General + Public License version 2 or any subsequent version, as published by the Free Software + Foundation Inc.

    + +

    GNU Affero GPL: means the GNU + Affero General Public License version 3 or any subsequent version, as published by + the Free Software Foundation Inc.

    + +

    EUPL: means the European Union + Public License version 1.1 or any subsequent version, as published by the European + Commission.

    + +

    Parties: mean both the Licensee + and the Licensor.

    + +

    These expressions may be used both in singular and plural form.

    +
    + +
    +

    Article 2 - PURPOSE

    + +

    The purpose of the Agreement is the grant by the Licensor to the Licensee of a + non-exclusive, transferable and worldwide license for the Software as set forth in + Article 5 hereinafter for the + whole term of the protection granted by the rights over said Software.

    +
    + +
    +

    Article 3 - ACCEPTANCE

    + +
    +

    3.1 The + Licensee shall be deemed as having accepted the terms and conditions of this + Agreement upon the occurrence of the first of the following events:

    + +
      +
    • (i) loading the Software by any or all means, notably, by downloading from a + remote server, or by loading from a physical medium;
    • + +
    • (ii) the first time the Licensee exercises any of the rights granted + hereunder.
    • +
    +
    + +
    +

    3.2 One copy of the Agreement, containing a + notice relating to the characteristics of the Software, to the limited warranty, + and to the fact that its use is restricted to experienced users has been provided + to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee + hereby acknowledges that it has read and understood it.

    +
    +
    + +
    +

    Article 4 - EFFECTIVE DATE AND TERM

    + +
    +

    4.1 EFFECTIVE DATE

    + +

    The Agreement shall become effective on the date when it is accepted by the + Licensee as set forth in Article 3.1.

    +
    + +
    +

    4.2 TERM

    + +

    The Agreement shall remain in force for the entire legal term of protection of + the economic rights over the Software.

    +
    +
    + +
    +

    Article 5 - SCOPE + OF RIGHTS GRANTED

    + +

    The Licensor hereby grants to the Licensee, who accepts, the following rights over + the Software for any or all use, and for the term of the Agreement, on the basis of + the terms and conditions set forth hereinafter.

    + +

    Besides, if the Licensor owns or comes to own one or more patents protecting all + or part of the functions of the Software or of its components, the Licensor + undertakes not to enforce the rights granted by these patents against successive + Licensees using, exploiting or modifying the Software. If these patents are + transferred, the Licensor undertakes to have the transferees subscribe to the + obligations set forth in this paragraph.

    + +
    +

    5.1 RIGHT OF USE

    + +

    The Licensee is authorized to use the Software, without any limitation as to its + fields of application, with it being hereinafter specified that this comprises:

    + +
      +
    1. +

      permanent or temporary reproduction of all or part of the Software by any or + all means and in any or all form.

      +
    2. + +
    3. +

      loading, displaying, running, or storing the Software on any or all + medium.

      +
    4. + +
    5. +

      entitlement to observe, study or test its operation so as to determine the + ideas and principles behind any or all constituent elements of said Software. + This shall apply when the Licensee carries out any or all loading, displaying, + running, transmission or storage operation as regards the Software, that it is + entitled to carry out hereunder.

      +
    6. +
    +
    + +
    +

    5.2 ENTITLEMENT TO MAKE CONTRIBUTIONS

    + +

    The right to make Contributions includes the right to translate, adapt, arrange, + or make any or all modifications to the Software, and the right to reproduce the + resulting software.

    + +

    The Licensee is authorized to make any or all Contributions to the Software + provided that it includes an explicit notice that it is the author of said + Contribution and indicates the date of the creation thereof.

    +
    + +
    +

    5.3 RIGHT OF DISTRIBUTION

    + +

    In particular, the right of distribution includes the right to publish, transmit + and communicate the Software to the general public on any or all medium, and by any + or all means, and the right to market, either in consideration of a fee, or free of + charge, one or more copies of the Software by any means.

    + +

    The Licensee is further authorized to distribute copies of the modified or + unmodified Software to third parties according to the terms and conditions set + forth hereinafter.

    + +
    +

    5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT + MODIFICATION

    + +

    The Licensee is authorized to distribute true copies of the Software in Source + Code or Object Code form, provided that said distribution complies with all the + provisions of the Agreement and is accompanied by:

    + +
      +
    1. +

      a copy of the Agreement,

      +
    2. + +
    3. +

      a notice relating to the limitation of both the Licensor's warranty and + liability as set forth in Articles 8 and 9,

      +
    4. +
    + +

    and that, in the event that only the Object Code of the Software is + redistributed, the Licensee allows effective access to the full Source Code of + the Software for a period of at least three years from the distribution of the + Software, it being understood that the additional acquisition cost of the Source + Code shall not exceed the cost of the data transfer.

    +
    + +
    +

    5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE

    + +

    When the Licensee makes a Contribution to the Software, the terms and + conditions for the distribution of the resulting Modified Software become subject + to all the provisions of this Agreement.

    + +

    The Licensee is authorized to distribute the Modified Software, in source code + or object code form, provided that said distribution complies with all the + provisions of the Agreement and is accompanied by:

    + +
      +
    1. +

      a copy of the Agreement,

      +
    2. + +
    3. +

      a notice relating to the limitation of both the Licensor's warranty and + liability as set forth in Articles 8 and 9,

      +
    4. +
    + +

    and, in the event that only the object code of the Modified Software is + redistributed,

    + +
      +
    1. +

      a note stating the conditions of effective access to the full source code + of the Modified Software for a period of at least three years from the + distribution of the Modified Software, it being understood that the + additional acquisition cost of the source code shall not exceed the cost of + the data transfer.

      +
    2. +
    +
    + +
    +

    5.3.3 DISTRIBUTION OF EXTERNAL MODULES

    + +

    When the Licensee has developed an External Module, the terms and conditions + of this Agreement do not apply to said External Module, that may be distributed + under a separate license agreement.

    +
    + +
    +

    5.3.4 COMPATIBILITY WITH OTHER LICENSES

    + +

    The Licensee can include a code that is subject to the provisions of one of + the versions of the GNU GPL, GNU Affero GPL and/or EUPL in the Modified or + unmodified Software, and distribute that entire code under the terms of the same + version of the GNU GPL, GNU Affero GPL and/or EUPL.

    + +

    The Licensee can include the Modified or unmodified Software in a code that is + subject to the provisions of one of the versions of the GNU GPL, GNU Affero GPL + and/or EUPL and distribute that entire code under the terms of the same version + of the GNU GPL, GNU Affero GPL and/or EUPL.

    +
    +
    +
    + +
    +

    Article 6 - INTELLECTUAL PROPERTY

    + +
    +

    6.1 OVER THE INITIAL SOFTWARE

    + +

    The Holder owns the economic rights over the Initial Software. Any or all use of + the Initial Software is subject to compliance with the terms and conditions under + which the Holder has elected to distribute its work and no one shall be entitled to + modify the terms and conditions for the distribution of said Initial Software.

    + +

    The Holder undertakes that the Initial Software will remain ruled at least by + this Agreement, for the duration set forth in Article 4.2.

    +
    + +
    +

    6.2 OVER THE CONTRIBUTIONS

    + +

    The Licensee who develops a Contribution is the owner of the intellectual + property rights over this Contribution as defined by applicable law.

    +
    + +
    +

    6.3 OVER THE EXTERNAL MODULES

    + +

    The Licensee who develops an External Module is the owner of the intellectual + property rights over this External Module as defined by applicable law and is free + to choose the type of agreement that shall govern its distribution.

    +
    + +
    +

    6.4 JOINT + PROVISIONS

    + +
    +

    The Licensee expressly undertakes:

    + +
      +
    1. +

      not to remove, or modify, in any manner, the intellectual property notices + attached to the Software;

      +
    2. + +
    3. +

      to reproduce said notices, in an identical manner, in the copies of the + Software modified or not.

      +
    4. +
    +
    + +
    +

    The Licensee undertakes not to directly or indirectly infringe the + intellectual property rights on the Software of the Holder and/or Contributors, + and to take, where applicable, vis-à-vis its staff, any and all measures + required to ensure respect of said intellectual property rights of the Holder + and/or Contributors.

    +
    +
    +
    + +
    +

    Article 7 - RELATED SERVICES

    + +
    +

    7.1 Under no circumstances shall the Agreement + oblige the Licensor to provide technical assistance or maintenance services for the + Software.

    + +

    However, the Licensor is entitled to offer this type of services. The terms and + conditions of such technical assistance, and/or such maintenance, shall be set + forth in a separate instrument. Only the Licensor offering said maintenance and/or + technical assistance services shall incur liability therefor.

    +
    + +
    +

    7.2 Similarly, any Licensor is entitled to offer + to its licensees, under its sole responsibility, a warranty, that shall only be + binding upon itself, for the redistribution of the Software and/or the Modified + Software, under terms and conditions that it is free to decide. Said warranty, and + the financial terms and conditions of its application, shall be subject of a + separate instrument executed between the Licensor and the Licensee.

    +
    +
    + +
    +

    Article 8 - LIABILITY

    + +
    +

    8.1 Subject to the provisions of Article 8.2, the + Licensee shall be entitled to claim compensation for any direct loss it may have + suffered from the Software as a result of a fault on the part of the relevant + Licensor, subject to providing evidence thereof.

    +
    + +
    +

    8.2 The Licensor's liability is limited to the + commitments made under this Agreement and shall not be incurred as a result of in + particular: (i) loss due the Licensee's total or partial failure to fulfill its + obligations, (ii) direct or consequential loss that is suffered by the Licensee due + to the use or performance of the Software, and (iii) more generally, any + consequential loss. In particular the Parties expressly agree that any or all + pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, + loss of customers or orders, opportunity cost, any disturbance to business + activities) or any or all legal proceedings instituted against the Licensee by a + third party, shall constitute consequential loss and shall not provide entitlement + to any or all compensation from the Licensor.

    +
    +
    + +
    +

    Article 9 - WARRANTY

    + +
    +

    9.1 The Licensee acknowledges that the scientific + and technical state-of-the-art when the Software was distributed did not enable all + possible uses to be tested and verified, nor for the presence of possible defects + to be detected. In this respect, the Licensee's attention has been drawn to the + risks associated with loading, using, modifying and/or developing and reproducing + the Software which are reserved for experienced users.

    + +

    The Licensee shall be responsible for verifying, by any or all means, the + suitability of the product for its requirements, its good working order, and for + ensuring that it shall not cause damage to either persons or properties.

    +
    + +
    +

    9.2 The + Licensor hereby represents, in good faith, that it is entitled to grant all the + rights over the Software (including in particular the rights set forth in Article + 5).

    +
    + +
    +

    9.3 The Licensee acknowledges that the Software + is supplied "as is" by the Licensor without any other express or tacit warranty, + other than that provided for in Article 9.2 and, in particular, without any warranty as to its + commercial value, its secured, safe, innovative or relevant nature.

    + +

    Specifically, the Licensor does not warrant that the Software is free from any + error, that it will operate without interruption, that it will be compatible with + the Licensee's own equipment and software configuration, nor that it will meet the + Licensee's requirements.

    +
    + +
    +

    9.4 The Licensor does not either expressly or + tacitly warrant that the Software does not infringe any third party intellectual + property right relating to a patent, software or any other property right. + Therefore, the Licensor disclaims any and all liability towards the Licensee + arising out of any or all proceedings for infringement that may be instituted in + respect of the use, modification and redistribution of the Software. Nevertheless, + should such proceedings be instituted against the Licensee, the Licensor shall + provide it with technical and legal expertise for its defense. Such technical and + legal expertise shall be decided on a case-by-case basis between the relevant + Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor + disclaims any and all liability as regards the Licensee's use of the name of the + Software. No warranty is given as regards the existence of prior rights over the + name of the Software or as regards the existence of a trademark.

    +
    +
    + +
    +

    Article 10 - TERMINATION

    + +
    +

    10.1 In the event of a breach by the Licensee of + its obligations hereunder, the Licensor may automatically terminate this Agreement + thirty (30) days after notice has been sent to the Licensee and has remained + ineffective.

    +
    + +
    +

    10.2 A Licensee whose Agreement is terminated + shall no longer be authorized to use, modify or distribute the Software. However, + any licenses that it may have granted prior to termination of the Agreement shall + remain valid subject to their having been granted in compliance with the terms and + conditions hereof.

    +
    +
    + +
    +

    Article 11 - MISCELLANEOUS

    + +
    +

    11.1 EXCUSABLE EVENTS

    + +

    Neither Party shall be liable for any or all delay, or failure to perform the + Agreement, that may be attributable to an event of force majeure, an act of God or + an outside cause, such as defective functioning or interruptions of the electricity + or telecommunications networks, network paralysis following a virus attack, + intervention by government authorities, natural disasters, water damage, + earthquakes, fire, explosions, strikes and labor unrest, war, etc.

    +
    + +
    +

    11.2 Any failure by either Party, on one or more + occasions, to invoke one or more of the provisions hereof, shall under no + circumstances be interpreted as being a waiver by the interested Party of its right + to invoke said provision(s) subsequently.

    +
    + +
    +

    11.3 The Agreement cancels and replaces any or + all previous agreements, whether written or oral, between the Parties and having + the same purpose, and constitutes the entirety of the agreement between said + Parties concerning said purpose. No supplement or modification to the terms and + conditions hereof shall be effective as between the Parties unless it is made in + writing and signed by their duly authorized representatives.

    +
    + +
    +

    11.4 In the event that one or more of the + provisions hereof were to conflict with a current or future applicable act or + legislative text, said act or legislative text shall prevail, and the Parties shall + make the necessary amendments so as to comply with said act or legislative text. + All other provisions shall remain effective. Similarly, invalidity of a provision + of the Agreement, for any reason whatsoever, shall not cause the Agreement as a + whole to be invalid.

    +
    + +
    +

    11.5 LANGUAGE

    + +

    The Agreement is drafted in both French and English and both versions are deemed + authentic.

    +
    +
    + +
    +

    Article 12 - NEW VERSIONS OF THE AGREEMENT

    + +
    +

    12.1 Any person is authorized to duplicate and + distribute copies of this Agreement.

    +
    + +
    +

    12.2 So as to ensure coherence, the wording of + this Agreement is protected and may only be modified by the authors of the License, + who reserve the right to periodically publish updates or new versions of the + Agreement, each with a separate number. These subsequent versions may address new + issues encountered by Free Software.

    +
    + +
    +

    12.3 Any Software distributed under a given + version of the Agreement may only be subsequently distributed under the same + version of the Agreement or a subsequent version, subject to the provisions of + Article 5.3.4.

    +
    +
    + +
    +

    Article 13 - GOVERNING LAW AND JURISDICTION

    + +
    +

    13.1 The Agreement is governed by French law. The + Parties agree to endeavor to seek an amicable solution to any disagreements or + disputes that may arise during the performance of the Agreement.

    +
    + +
    +

    13.2 Failing an amicable solution within two (2) + months as from their occurrence, and unless emergency proceedings are necessary, + the disagreements or disputes shall be referred to the Paris Courts having + jurisdiction, by the more diligent Party.

    +
    +
    + + + +\endhtmlonly + +*/ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_example.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_example.c new file mode 100644 index 000000000..a00bcd12e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_example.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + +/** \example SHT_example.c + \brief An example program that performs backward and forward Spherical Harmonic Transforms using SHTns. + + Compile using : \code make SHT_example \endcode + \see \ref usage +**/ + +#include +#include +#include +#include +#include + +#include + +/// a simple function that writes a vector to a file +void write_vect(char *fn, double *vec, int N); + +/// a simple function that writes a matrix to a file. +void write_mx(char *fn, double *mx, int N1, int N2); + + +int main() +{ + shtns_cfg shtns; // handle to a sht transform configuration + long int lmax,mmax,nlat,nphi,mres, NLM; + complex double *Slm, *Tlm; // spherical harmonics coefficients (l,m space): complex numbers. + double *Sh, *Th; // real space : theta,phi + long int i,im,lm; + double t; + + lmax = 5; nlat = 32; + mmax = 3; nphi = 10; + mres = 1; + shtns_verbose(1); // displays informations during initialization. + shtns_use_threads(0); // enable multi-threaded transforms (if supported). + shtns = shtns_init( sht_gauss, lmax, mmax, mres, nlat, nphi ); +// shtns = shtns_create(lmax, mmax, mres, sht_orthonormal | SHT_REAL_NORM); +// shtns_set_grid(shtns, sht_gauss, 0.0, nlat, nphi); + NLM = shtns->nlm; + +// Memory allocation : the use of fftw_malloc is required because we need proper 16-byte alignement. +// allocate spatial fields. + Sh = (double *) fftw_malloc( NSPAT_ALLOC(shtns) * sizeof(double)); + Th = (double *) fftw_malloc( NSPAT_ALLOC(shtns) * sizeof(double)); + +// allocate SH representations. + Slm = (complex double *) fftw_malloc( NLM * sizeof(complex double)); + Tlm = (complex double *) fftw_malloc( NLM * sizeof(complex double)); + +// SH_to_spat + LM_LOOP(shtns, Slm[lm]=0.0; Tlm[lm] = 0.0; ) /* this is the same as : + for (lm=0; lmnlm; lm++) { + Slm[lm] = 0.0; Tlm[lm] = 0.0; + } */ + +// Slm[LM(shtns, 1,1)] = sh11_st(shtns); // access to SH coefficient + Slm[LM(shtns, 2,0)] = 1.0; +// Slm[LiM(shtns, 1,0)] = sh10_ct(shtns); +// Slm[LiM(shtns, 0,0)] = 0.5*sh00_1(shtns); + SH_to_spat(shtns, Slm,Sh); + SHtor_to_spat(shtns, Slm,Th,Sh); + write_vect("ylm",(double *) Slm,NLM*2); + write_mx("spat",Sh,nphi,nlat); + +// compute value of SH expansion at a given physical point. + double t2; + SHqst_to_point(shtns, Tlm, Tlm, Slm, shtns->ct[nlat/3], 2.*M_PI/(mres*nphi),&t2,&t2,&t); + printf("check if SH_to_point coincides with SH_to_spat : %f = %f\n",t,Sh[nlat/3]); + printf("ct*st = %f\n",shtns->ct[nlat/3]*shtns->st[nlat/3]); + +// check non-linear behaviour + for (im=0;imct[i]; // use cos(theta) array + } + } + spat_to_SH(shtns, Sh,Slm); + write_vect("ylm_v",(double *) Slm,NLM*2); +} + + +void write_vect(char *fn, double *vec, int N) +{ + FILE *fp; + int i; + + fp = fopen(fn,"w"); + for (i=0;i Spec + call spat_to_SH(shtns_c, Sh, Slm) + + !-- print S(1,0) to check it 1.0 is recovered. + print*, 'S(1,0)', Slm(lm) + + !-- Legendre only for m=0 + lmStart = shtns_lmidx(shtns_c,0,0) + lmStop = shtns_lmidx(shtns_c,lmax,0) + call SH_to_spat_ml(shtns_c, 0, Slm(lmStart:lmStop), ShT, lmax) + print*, 'Legendre only', ShT + + deallocate(Sh, Slm, ShT) + call shtns_unset_grid(shtns_c) + call shtns_destroy(shtns_c) + +end program diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_example.py b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_example.py new file mode 100644 index 000000000..3d2fe9e84 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_example.py @@ -0,0 +1,76 @@ +# +# Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. +# written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). +# +# nathanael.schaeffer@univ-grenoble-alpes.fr +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. +# + +################################### +# SHTns Python interface example # +################################### + +import numpy # numpy for arrays +import shtns # shtns module + # compiled and installe using ./configure --enable-python && make && make install + +lmax = 7 # maximum degree of spherical harmonic representation. +mmax = 3 # maximum order of spherical harmonic representation. + +sh = shtns.sht(lmax, mmax) # create sht object with given lmax and mmax (orthonormalized) +# sh = shtns.sht(lmax, mmax, mres=2, norm=shtns.sht_schmidt | shtns.SHT_NO_CS_PHASE) # use schmidt semi-normalized harmonics + +nlat, nphi = sh.set_grid() # build default grid (gauss grid, phi-contiguous) +print(sh.nlat, sh.nphi) # displays the latitudinal and longitudinal grid sizes. + +cost = sh.cos_theta # latitudinal coordinates of the grid as cos(theta) +el = sh.l # array of size sh.nlm giving the spherical harmonic degree l for any sh coefficient +l2 = el*(el+1) # array l(l+1) that is useful for computing laplacian + +### use advanced options to create a regular grid, theta-contiguous, and with south-pole comming first. +# nlat = lmax*2 +# nphi = mmax*3 +# grid_typ = shtns.sht_gauss | shtns.SHT_THETA_CONTIGUOUS | shtns.SHT_SOUTH_POLE_FIRST +# polar_opt_threshold = 1.0e-10 +# sh.set_grid(nlat, nphi, flags=grid_typ, polar_opt=polar_opt_threshold) + +ylm = sh.spec_array() # a spherical harmonic spectral array, same as numpy.zeros(sh.nlm, dtype=complex) +vr = sh.spat_array() # a spatial array, same as numpy.zeros(sh.spat_shape) + +ylm[sh.idx(1,0)] = 1.0 # set sh coefficient l=1, m=0 to value 1 + +print(ylm[sh.l == 1]) # print all l=1 coefficients +print(ylm[sh.m == 1]) # print all m=1 coefficients + +ylm = ylm * l2 # multiply by l(l+1) + +y = sh.synth(ylm) # transform sh description ylm into spatial representation y (scalar transform) + +print(y) # display spatial field + +i_theta = sh.nlat/2 +i_phi = 1 +print(y[i_theta, i_phi]) # spatial element of coordinate i_theta, i_phi + + +zlm = sh.analys(y) # transform the spatial field back to spectral +print(zlm) + +### compute gradients : +dy_dt, dy_dp = sh.synth_grad(ylm) # compute gradients of ylm on a spatial grid. + +### vector transforms : +#slm, tlm = sh.analys(v_theta,v_phi) # with two arguments, sh.analys() performs a 2D vector transform (spherical coordinates without radial) +#qlm, slm, tlm = sh.analys(v_r,v_theta,v_phi) # with three arguments, sh.alanys() performs a 3D vector tansform (spherical coordinates) +# +#v_theta, v_phi = sh.synth(slm, tlm) # same hold for synthesis, using spheroidal/toroidal vector spherical harmonics. +#v_r = sh.synth(qlm) + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_fixed_m.py b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_fixed_m.py new file mode 100644 index 000000000..53877e15f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/SHT_fixed_m.py @@ -0,0 +1,46 @@ +# +# Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. +# written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). +# +# nathanael.schaeffer@univ-grenoble-alpes.fr +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. +# + +################################################################### +# SHTns Python interface example using fixed m (no fft) functions # +################################################################### + +import numpy # numpy for arrays +import shtns # shtns module + # compiled and installe using ./configure --enable-python && make && make install + +lmax = 31 # maximum degree of spherical harmonic representation. +m = 10 # we work with m=10 only here + +sh = shtns.sht(lmax) # create sht object with given lmax and mmax (orthonormalized) +# sh = shtns.sht(lmax, mmax, mres=2, norm=shtns.sht_schmidt | shtns.SHT_NO_CS_PHASE) # use schmidt semi-normalized harmonics + +nlat, nphi = sh.set_grid() # build default grid (gauss grid, phi-contiguous) +print(sh.nlat, sh.nphi) # displays the latitudinal and longitudinal grid sizes. + +cost = sh.cos_theta # latitudinal coordinates of the grid as cos(theta) + +ylm10 = sh.spec_array(m) # a spherical harmonic spectral array for m=10, same as numpy.zeros(sh.lmax +1 - sh.mres*10, dtype=complex) +zlm = sh.spec_array() # a spectral array for all m, same as numpy.zeros(sh.nlm, dtype=complex) +ym = numpy.zeros(sh.nlat, dtype=complex) # a spatial array at fixed m + +ylm10[1] = 1.0 # set sh coefficient l=11, m=10 to value 1 + +sh.SH_to_spat_m(ylm10, ym, m) # Legendre transform at given m + +sh.spat_to_SH_m(ym, zlm[sh.idx(m,m):sh.idx(m+1,m+1)], m) # slicing works as long as it is contiguous + +print(zlm[sh.idx(m+1,m)]) # should be one diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/shallow_water.py b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/shallow_water.py new file mode 100755 index 000000000..c8bfc30d8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/shallow_water.py @@ -0,0 +1,204 @@ +#!/usr/bin/python + +## "non-linear barotropically unstable shallow water test case" +## example provided by Jeffrey Whitaker +## https://gist.github.com/jswhit/3845307 +## +## Running the script should pop up a window with this image: +## http://i.imgur.com/ZlxR1.png + + +import numpy as np +import shtns + +class Spharmt(object): + """ + wrapper class for commonly used spectral transform operations in + atmospheric models. Provides an interface to shtns compatible + with pyspharm (pyspharm.googlecode.com). + """ + def __init__(self,nlons,nlats,ntrunc,rsphere,gridtype='gaussian'): + """initialize + nlons: number of longitudes + nlats: number of latitudes""" + self._shtns = shtns.sht(ntrunc, ntrunc, 1, \ + shtns.sht_orthonormal+shtns.SHT_NO_CS_PHASE) + if gridtype == 'gaussian': + #self._shtns.set_grid(nlats,nlons,shtns.sht_gauss_fly|shtns.SHT_PHI_CONTIGUOUS,1.e-10) + self._shtns.set_grid(nlats,nlons,shtns.sht_quick_init|shtns.SHT_PHI_CONTIGUOUS,1.e-10) + elif gridtype == 'regular': + self._shtns.set_grid(nlats,nlons,shtns.sht_reg_dct|shtns.SHT_PHI_CONTIGUOUS,1.e-10) + self.lats = np.arcsin(self._shtns.cos_theta) + self.lons = (2.*np.pi/nlons)*np.arange(nlons) + self.nlons = nlons + self.nlats = nlats + self.ntrunc = ntrunc + self.nlm = self._shtns.nlm + self.degree = self._shtns.l + self.lap = -self.degree*(self.degree+1.0).astype(np.complex) + self.invlap = np.zeros(self.lap.shape, self.lap.dtype) + self.invlap[1:] = 1./self.lap[1:] + self.rsphere = rsphere + self.lap = self.lap/rsphere**2 + self.invlap = self.invlap*rsphere**2 + def grdtospec(self,data): + """compute spectral coefficients from gridded data""" + return self._shtns.analys(data) + def spectogrd(self,dataspec): + """compute gridded data from spectral coefficients""" + return self._shtns.synth(dataspec) + def getuv(self,vrtspec,divspec): + """compute wind vector from spectral coeffs of vorticity and divergence""" + return self._shtns.synth((self.invlap/self.rsphere)*vrtspec, (self.invlap/self.rsphere)*divspec) + def getvrtdivspec(self,u,v): + """compute spectral coeffs of vorticity and divergence from wind vector""" + vrtspec, divspec = self._shtns.analys(u, v) + return self.lap*self.rsphere*vrtspec, self.lap*rsphere*divspec + def getgrad(self,divspec): + """compute gradient vector from spectral coeffs""" + vrtspec = np.zeros(divspec.shape, dtype=np.complex) + u,v = self._shtns.synth(vrtspec,divspec) + return u/rsphere, v/rsphere + +if __name__ == "__main__": + import matplotlib.pyplot as plt + import time + + # non-linear barotropically unstable shallow water test case + # of Galewsky et al (2004, Tellus, 56A, 429-440). + # "An initial-value problem for testing numerical models of the global + # shallow-water equations" DOI: 10.1111/j.1600-0870.2004.00071.x + # http://www-vortex.mcs.st-and.ac.uk/~rks/reprints/galewsky_etal_tellus_2004.pdf + + # requires matplotlib for plotting. + + # grid, time step info + nlons = 256 # number of longitudes + ntrunc = int(nlons/3) # spectral truncation (for alias-free computations) + nlats = int(nlons/2) # for gaussian grid. + dt = 150 # time step in seconds + itmax = 6*int(86400/dt) # integration length in days + + # parameters for test + rsphere = 6.37122e6 # earth radius + omega = 7.292e-5 # rotation rate + grav = 9.80616 # gravity + hbar = 10.e3 # resting depth + umax = 80. # jet speed + phi0 = np.pi/7.; phi1 = 0.5*np.pi - phi0; phi2 = 0.25*np.pi + en = np.exp(-4.0/(phi1-phi0)**2) + alpha = 1./3.; beta = 1./15. + hamp = 120. # amplitude of height perturbation to zonal jet + efold = 3.*3600. # efolding timescale at ntrunc for hyperdiffusion + ndiss = 8 # order for hyperdiffusion + + # setup up spherical harmonic instance, set lats/lons of grid + x = Spharmt(nlons,nlats,ntrunc,rsphere,gridtype='gaussian') + lons,lats = np.meshgrid(x.lons, x.lats) + f = 2.*omega*np.sin(lats) # coriolis + + # zonal jet. + vg = np.zeros((nlats,nlons),np.float) + u1 = (umax/en)*np.exp(1./((x.lats-phi0)*(x.lats-phi1))) + ug = np.zeros((nlats),np.float) + ug = np.where(np.logical_and(x.lats < phi1, x.lats > phi0), u1, ug) + ug.shape = (nlats,1) + ug = ug*np.ones((nlats,nlons),dtype=np.float) # broadcast to shape (nlats,nlonss) + # height perturbation. + hbump = hamp*np.cos(lats)*np.exp(-(lons/alpha)**2)*np.exp(-(phi2-lats)**2/beta) + + # initial vorticity, divergence in spectral space + vrtspec, divspec = x.getvrtdivspec(ug,vg) + vrtg = x.spectogrd(vrtspec) + divg = x.spectogrd(divspec) + + # create hyperdiffusion factor + hyperdiff_fact = np.exp((-dt/efold)*(x.lap/x.lap[-1])**(ndiss/2)) + + # solve nonlinear balance eqn to get initial zonal geopotential, + # add localized bump (not balanced). + vrtg = x.spectogrd(vrtspec) + tmpg1 = ug*(vrtg+f); tmpg2 = vg*(vrtg+f) + tmpspec1, tmpspec2 = x.getvrtdivspec(tmpg1,tmpg2) + tmpspec2 = x.grdtospec(0.5*(ug**2+vg**2)) + phispec = x.invlap*tmpspec1 - tmpspec2 + phig = grav*(hbar + hbump) + x.spectogrd(phispec) + phispec = x.grdtospec(phig) + + # initialize spectral tendency arrays + ddivdtspec = np.zeros(vrtspec.shape+(3,), np.complex) + dvrtdtspec = np.zeros(vrtspec.shape+(3,), np.complex) + dphidtspec = np.zeros(vrtspec.shape+(3,), np.complex) + nnew = 0; nnow = 1; nold = 2 + + # time loop. + time1 = time.clock() + for ncycle in range(itmax+1): + t = ncycle*dt + # get vort,u,v,phi on grid + vrtg = x.spectogrd(vrtspec) + ug,vg = x.getuv(vrtspec,divspec) + phig = x.spectogrd(phispec) + print('t=%6.2f hours: min/max %6.2f, %6.2f' % (t/3600.,vg.min(), vg.max())) + # compute tendencies. + tmpg1 = ug*(vrtg+f); tmpg2 = vg*(vrtg+f) + ddivdtspec[:,nnew], dvrtdtspec[:,nnew] = x.getvrtdivspec(tmpg1,tmpg2) + dvrtdtspec[:,nnew] *= -1 + tmpg = x.spectogrd(ddivdtspec[:,nnew]) + tmpg1 = ug*phig; tmpg2 = vg*phig + tmpspec, dphidtspec[:,nnew] = x.getvrtdivspec(tmpg1,tmpg2) + dphidtspec[:,nnew] *= -1 + tmpspec = x.grdtospec(phig+0.5*(ug**2+vg**2)) + ddivdtspec[:,nnew] += -x.lap*tmpspec + # update vort,div,phiv with third-order adams-bashforth. + # forward euler, then 2nd-order adams-bashforth time steps to start. + if ncycle == 0: + dvrtdtspec[:,nnow] = dvrtdtspec[:,nnew] + dvrtdtspec[:,nold] = dvrtdtspec[:,nnew] + ddivdtspec[:,nnow] = ddivdtspec[:,nnew] + ddivdtspec[:,nold] = ddivdtspec[:,nnew] + dphidtspec[:,nnow] = dphidtspec[:,nnew] + dphidtspec[:,nold] = dphidtspec[:,nnew] + elif ncycle == 1: + dvrtdtspec[:,nold] = dvrtdtspec[:,nnew] + ddivdtspec[:,nold] = ddivdtspec[:,nnew] + dphidtspec[:,nold] = dphidtspec[:,nnew] + vrtspec += dt*( \ + (23./12.)*dvrtdtspec[:,nnew] - (16./12.)*dvrtdtspec[:,nnow]+ \ + (5./12.)*dvrtdtspec[:,nold] ) + divspec += dt*( \ + (23./12.)*ddivdtspec[:,nnew] - (16./12.)*ddivdtspec[:,nnow]+ \ + (5./12.)*ddivdtspec[:,nold] ) + phispec += dt*( \ + (23./12.)*dphidtspec[:,nnew] - (16./12.)*dphidtspec[:,nnow]+ \ + (5./12.)*dphidtspec[:,nold] ) + # implicit hyperdiffusion for vort and div. + vrtspec *= hyperdiff_fact + divspec *= hyperdiff_fact + # switch indices, do next time step. + nsav1 = nnew; nsav2 = nnow + nnew = nold; nnow = nsav1; nold = nsav2 + + time2 = time.clock() + print('CPU time = ',time2-time1) + + # make a contour plot of potential vorticity in the Northern Hem. + fig = plt.figure(figsize=(12,4)) + # dimensionless PV + pvg = (0.5*hbar*grav/omega)*(vrtg+f)/phig + print('max/min PV',pvg.min(), pvg.max()) + lons1d = (180./np.pi)*x.lons-180.; lats1d = (180./np.pi)*x.lats + levs = np.arange(-0.2,1.801,0.1) + cs=plt.contourf(lons1d,lats1d,pvg,levs,cmap=plt.cm.spectral,extend='both') + cb=plt.colorbar(cs,orientation='horizontal') # add colorbar + cb.set_label('potential vorticity') + plt.grid() + plt.xlabel('degrees longitude') + plt.ylabel('degrees latitude') + plt.xticks(np.arange(-180,181,60)) + plt.yticks(np.arange(-5,81,20)) + plt.axis('equal') + plt.axis('tight') + plt.ylim(0,lats1d[0]) + plt.title('PV (T%s with hyperdiffusion, hour %6.2f)' % (ntrunc,t/3600.)) + plt.show() diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/test_rot.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/test_rot.c new file mode 100644 index 000000000..6ae33e15b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/test_rot.c @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + + +/// \example test_rot.c +/// This program test the rotation of spherical harmonics (beta) + +#include +#include +#include +#include +#include +#include +#include + +#include + +shtns_cfg shtns; + +complex double *Slm, *Slm0, *Tlm, *Tlm0, *Qlm; // spherical harmonics l,m space +complex double *ShF, *ThF, *NLF; // Fourier space : theta,m +double *Sh, *Th, *NL; // real space : theta,phi (alias of ShF) + +int LMAX,MMAX,MRES,NLM; +int NLAT = 0; +int NPHI = 0; + +void write_shell(char *fn, double *V) +{ + FILE *fp; + int i,j,k; //phi, theta + + fp = fopen(fn,"w"); + fprintf(fp,"0 "); + for(j=0;jct[j])); // first line = theta (radians) + } + for (i=0; i +#ifndef CLOCK_MONOTONIC + #define CLOCK_MONOTONIC 0 +#endif +#ifndef CLOCK_REALTIME + #define CLOCK_REALTIME 0 +#endif +int clock_gettime(int ignored, struct timespec* t) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) return rv; + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; +} +#endif + +double tdiff(struct timespec *start, struct timespec *end) +{ + double ns = 1.e9 * ((long) end->tv_sec - (long) start->tv_sec); + ns += ((long) end->tv_nsec - (long) start->tv_nsec); + return ns * (1.e-6); // time in ms. +} + + +int main(int argc, char *argv[]) +{ + complex double t1, t2; + double t,tmax,n2; + int i,im,m,l,jj; + double e0,e1; + double polaropt = 1.e-8; // default for polar optimization. + enum shtns_type shtmode = sht_auto; // default to "auto" (fastest) mode. + enum shtns_norm shtnorm = sht_orthonormal; // default to "orthonormal" SH. + int layout = SHT_NATIVE_LAYOUT; + int nlorder = 0; + int vector = 1; + char name[20]; + + srand( time(NULL) ); // initialise les nombres. + + MMAX=LMAX=300; + MRES=1; + NLAT=360; + NPHI=720; + if (argc > 1) { + MMAX=LMAX = atoi(argv[1]); + NLAT = 0; NPHI = 0; // auto + } + + shtns_use_threads(0); + shtns = shtns_create(LMAX, MMAX, MRES, shtnorm); + NLM = shtns->nlm; + shtns_set_grid_auto(shtns, sht_quick_init, 0.0, 1e-10, &NLAT, &NPHI); + + shtns_print_cfg(shtns); + + ShF = (complex double *) fftw_malloc( 4*(NPHI/2+1) * NLAT * sizeof(complex double)); + Sh = (double *) ShF; + ThF = (complex double *) fftw_malloc( 4*(NPHI/2+1) * NLAT * sizeof(complex double)); + Th = (double *) ThF; + NLF = (complex double *) fftw_malloc( 4*(NPHI/2+1) * NLAT * sizeof(complex double)); + NL = (double *) NLF; + + Tlm0 = (complex double *) fftw_malloc(sizeof(complex double)* NLM); + Slm0 = (complex double *) fftw_malloc(sizeof(complex double)* NLM); + Slm = (complex double *) fftw_malloc(sizeof(complex double)* NLM); + Tlm = (complex double *) fftw_malloc(sizeof(complex double)* NLM); + Qlm = (complex double *) fftw_malloc(sizeof(complex double)* NLM); + + + struct timespec ti1, ti2; + double mx[3][3]; + + // first we time-it and evaluate accuracy: + for (l=0; l emax) { emax = e; imax=i; } + esum += e; + } + printf("after 4 90° rotations along X: rms error = %.3g, max error = %.3g (lm=%d)\n", sqrt(esum/NLM), sqrt(emax), imax); + +// restart with 0 + for (l=0; l0) { + e0 *=2; eR *= 2; + } + norm0 += e0; + normR += eR; + } + if (LMAX < 32) printf("norm0 = %f, norm1 = %f\n", sqrt(norm0), sqrt(normR)); + } + + +// SH_Yrotate90(shtns, Slm, Tlm0); +// SH_Yrotate90(shtns, Tlm0, Slm); + SH_Yrotate90(shtns, Slm, Tlm); + + printf("\n*** rotation along Y by 90 deg.\n"); + for (l=0; l<=LMAX; l++) { + double norm0=0; double normR=0; + for (m=0; m<=l; m++) { + if (LMAX < 32) + printf("l=%d, m=%d, Q=%f,%f, \t S=%f,%f\n",l,m, creal(Qlm[LiM(shtns,l,m)]), cimag(Qlm[LiM(shtns,l,m)]), + creal(Tlm[LiM(shtns,l,m)]), cimag(Tlm[LiM(shtns,l,m)])); + double e0 = creal(Qlm[LiM(shtns,l,m)])*creal(Qlm[LiM(shtns,l,m)]) + cimag(Qlm[LiM(shtns,l,m)])*cimag(Qlm[LiM(shtns,l,m)]); + double eR = creal(Tlm[LiM(shtns,l,m)])*creal(Tlm[LiM(shtns,l,m)]) + cimag(Tlm[LiM(shtns,l,m)])*cimag(Tlm[LiM(shtns,l,m)]); + if (m>0) { + e0 *=2; eR *= 2; + } + norm0 += e0; + normR += eR; + } + if (LMAX < 32) printf("norm0 = %f, norm1 = %f\n", sqrt(norm0), sqrt(normR)); + } + +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/wigner.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/wigner.c new file mode 100644 index 000000000..9b1fb3989 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/examples/wigner.c @@ -0,0 +1,217 @@ + +#include +#include +#include +#include +#include "shtns.h" + +#include + +void SH_2real_to_cplx(shtns_cfg shtns, cplx* Rlm, cplx* Ilm, cplx* Zlm); +void SH_cplx_to_2real(shtns_cfg shtns, cplx* Zlm, cplx* Rlm, cplx* Ilm); + +void write_vect(char *fn, double *vec, int N) +{ + FILE *fp; + int i; + + fp = fopen(fn,"w"); + for (i=0;itv_sec - (long) start->tv_sec); + sec += 1.e-6*((long) end->tv_usec - (long) start->tv_usec); + return sec * (1.e3); // time in ms. +} + +double SHnorm(shtns_cfg shtns, cplx* zlm) +{ + double x=0; + int lmax = shtns->lmax; + for (int j=0;j<(lmax+1)*(lmax+1); j++) { + double r = creal(zlm[j]); + double i = cimag(zlm[j]); + x += r*r + i*i; + } + return sqrt(x); +} + +double SHnorm_real(shtns_cfg shtns, cplx* zlm) +{ + double x=0; + int lmax = shtns->lmax; + for (int l=0; l<=lmax; l++) { + double r = creal(zlm[l]); + x += r*r; + } + x *= 0.5; + for (int lm=lmax+1; lmnlm; lm++) { + double r = creal(zlm[lm]); + double i = cimag(zlm[lm]); + x += r*r + i*i; + } + return sqrt(x+x); +} + +int main() +{ + struct timeval t1, t2, t3; + const int lmax = 300; + const double beta = M_PI/2; + shtns_rot rot; + shtns_cfg sht; + + printf("Rotation using Wigner-d matrices, at lmax=%d\n",lmax); + srand( time(NULL) ); // initialize random numbers. + + gettimeofday(&t1, NULL); + rot = shtns_rotation_create(lmax,lmax); + gettimeofday(&t2, NULL); + shtns_rotation_set_angles_ZYZ(rot, 0.0, beta, 0.0); + gettimeofday(&t3, NULL); + printf("rotation: creation time=%.3g ms set_angle time=%.3g ms\n", tdiff(&t1,&t2), tdiff(&t2,&t3)); + + if (lmax>=2) { + const int l = 2; + double* mx = (double*) malloc( sizeof(double) * (2*l+1)*(2*l+1) ); + memset(mx, 0, sizeof(double)*(2*l+1)*(2*l+1)); + shtns_rotation_wigner_d_matrix(rot, l, mx); + write_mx("Wigner-d_l2", mx, 2*l+1, 2*l+1); + + printf("# rotation matrix for l=%d:\n# ", l); + for (int j=0; j<2*l+1; j++) printf("%10d ", j-l); + for (int i=0; i<2*l+1; i++) { + printf("\n%3d ", i-l); + for (int j=0; j<2*l+1; j++) { + double x = mx[i*(2*l+1) + j]; + printf("%10.5g ", (fabs(x) < 1e-14) ? 0.0 : x); + } + } + printf("\n"); + free(mx); + } + + if (lmax >=9) { + const int l = 9; + double* mx = (double*) malloc( sizeof(double) * (2*l+1)*(2*l+1) ); + memset(mx, 0, sizeof(double)*(2*l+1)*(2*l+1)); + shtns_rotation_wigner_d_matrix(rot, l, mx); + write_mx("Wigner-d_l9", mx, 2*l+1, 2*l+1); + free(mx); + } + + + //// TEST //// + + sht = shtns_create(lmax,lmax,1,sht_orthonormal); + + long nlm = nlm_calc(lmax, lmax, 1); + cplx* Qlm = malloc(sizeof(cplx) * nlm); + memset(Qlm, 0, sizeof(cplx)*nlm); + cplx* Slm = malloc(sizeof(cplx) * nlm); + memset(Slm, 0, sizeof(cplx)*nlm); + cplx* Tlm = malloc(sizeof(cplx) * nlm); + memset(Tlm, 0, sizeof(cplx)*nlm); + cplx* Zlm = malloc(sizeof(cplx) * (lmax+1)*(lmax+1)); + memset(Zlm, 0, sizeof(cplx)*(lmax+1)*(lmax+1)); + cplx* Rlm = malloc(sizeof(cplx) * (lmax+1)*(lmax+1)); + memset(Rlm, 0, sizeof(cplx)*(lmax+1)*(lmax+1)); + + Qlm[0] = 1; +// Qlm[LiM(sht,5,2)] = 1; +// Qlm[LiM(sht,7,3)] = I; +// write_vect("qlm",(double *)Qlm,nlm*2); + +// test case... + printf("generating random test case...\n"); + double t = 1.0 / (RAND_MAX/2); + for (int i=0;i emax) { emax = e; imax=i; } + esum += e; + } + printf("after 4 90° rotations along Y: rms error = %.3g, max error = %.3g (lm=%d)\n", sqrt(esum/nlm), sqrt(emax), imax); + } + + { + printf("\n*** complex field ***\n"); + SH_2real_to_cplx(sht,Qlm,Slm,Zlm); + printf("norm=%g\n", SHnorm(sht,Zlm)); + + gettimeofday(&t1, NULL); + shtns_rotation_apply_cplx(rot,Zlm,Rlm); + gettimeofday(&t2, NULL); + printf("norm=%g time=%.3g ms\n", SHnorm(sht,Rlm), tdiff(&t1,&t2)); + + shtns_rotation_apply_cplx(rot,Rlm,Zlm); printf("norm=%g\n", SHnorm(sht,Zlm)); + shtns_rotation_apply_cplx(rot,Zlm,Rlm); printf("norm=%g\n", SHnorm(sht,Rlm)); + gettimeofday(&t1, NULL); + shtns_rotation_apply_cplx(rot,Rlm,Zlm); + gettimeofday(&t2, NULL); + printf("norm=%g time=%.3g ms\n", SHnorm(sht,Zlm), tdiff(&t1,&t2)); + SH_cplx_to_2real(sht,Zlm, Tlm,Slm); + + // evaluate error: + double emax = 0.0; int imax = 0; + double esum = 0.0; + for (int i=0;i emax) { emax = e; imax=i; } + esum += e; + } + printf("after 4 90° rotations along Y: rms error = %.3g, max error = %.3g (lm=%d)\n", sqrt(esum/nlm), sqrt(emax), imax); + } + + +// write_vect("rlm",(double *)Tlm,nlm*2); +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/fftw3/cycle.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/fftw3/cycle.h new file mode 100644 index 000000000..2652a04ad --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/fftw3/cycle.h @@ -0,0 +1,514 @@ +/* + * Copyright (c) 2003, 2007-8 Matteo Frigo + * Copyright (c) 2003, 2007-8 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + + +/* machine-dependent cycle counters code. Needs to be inlined. */ + +/***************************************************************************/ +/* To use the cycle counters in your code, simply #include "cycle.h" (this + file), and then use the functions/macros: + + ticks getticks(void); + + ticks is an opaque typedef defined below, representing the current time. + You extract the elapsed time between two calls to gettick() via: + + double elapsed(ticks t1, ticks t0); + + which returns a double-precision variable in arbitrary units. You + are not expected to convert this into human units like seconds; it + is intended only for *comparisons* of time intervals. + + (In order to use some of the OS-dependent timer routines like + Solaris' gethrtime, you need to paste the autoconf snippet below + into your configure.ac file and #include "config.h" before cycle.h, + or define the relevant macros manually if you are not using autoconf.) +*/ + +/***************************************************************************/ +/* This file uses macros like HAVE_GETHRTIME that are assumed to be + defined according to whether the corresponding function/type/header + is available on your system. The necessary macros are most + conveniently defined if you are using GNU autoconf, via the tests: + + dnl --------------------------------------------------------------------- + + AC_C_INLINE + AC_HEADER_TIME + AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h]) + + AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in ])],,[#if HAVE_SYS_TIME_H +#include +#endif]) + + AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time]) + + dnl Cray UNICOS _rtc() (real-time clock) intrinsic + AC_MSG_CHECKING([for _rtc intrinsic]) + rtc_ok=yes + AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H +#include +#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no]) + AC_MSG_RESULT($rtc_ok) + + dnl --------------------------------------------------------------------- +*/ + +/***************************************************************************/ + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \ +{ \ + return (double)t1 - (double)t0; \ +} + +/*----------------------------------------------------------------*/ +/* Solaris */ +#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER) +typedef hrtime_t ticks; + +#define getticks gethrtime + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* AIX v. 4+ routines to read the real-time clock or time-base register */ +#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER) +typedef timebasestruct_t ticks; + +static __inline ticks getticks(void) +{ + ticks t; + read_real_time(&t, TIMEBASE_SZ); + return t; +} + +static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */ +{ + time_base_to_time(&t1, TIMEBASE_SZ); + time_base_to_time(&t0, TIMEBASE_SZ); + return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 + + ((double)t1.tb_low - (double)t0.tb_low)); +} + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PowerPC ``cycle'' counter using the time base register. + */ +#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__)))) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned int tbl, tbu0, tbu1; + + do { + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu0)); + __asm__ __volatile__ ("mftb %0" : "=r"(tbl)); + __asm__ __volatile__ ("mftbu %0" : "=r"(tbu1)); + } while (tbu0 != tbu1); + + return (((unsigned long long)tbu0) << 32) | tbl; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime, + from Carbon, requires no additional libraries to be linked). */ +#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER) +#include +typedef uint64_t ticks; +#define getticks mach_absolute_time +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * Pentium cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("rdtsc": "=A" (ret)); + /* no input, nothing else clobbered */ + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/* Visual C++ -- thanks to Morten Nissov for his help with this */ +#if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER) +#include +typedef LARGE_INTEGER ticks; +#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */ + +static __inline ticks getticks(void) +{ + ticks retval; + + __asm { + RDTSC + mov retval.HighPart, edx + mov retval.LowPart, eax + } + return retval; +} + +static __inline double elapsed(ticks t1, ticks t0) +{ + return (double)t1.QuadPart - (double)t0.QuadPart; +} + +#define HAVE_TICK_COUNTER +#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */ +#endif + +/*----------------------------------------------------------------*/ +/* + * X86-64 cycle counter + */ +#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + unsigned a, d; + asm volatile("rdtsc" : "=a" (a), "=d" (d)); + return ((ticks)a) | (((ticks)d) << 32); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori. + NOTE: this code will fail to link unless you use the -Masmkeyword compiler + option (grrr). */ +#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; +static ticks getticks(void) +{ + asm(" rdtsc; shl $0x20,%rdx; mov %eax,%eax; or %rdx,%rax; "); +} +INLINE_ELAPSED(__inline__) +#define HAVE_TICK_COUNTER +#endif + +/* Visual C++, courtesy of Dirk Michaelis */ +#if _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER) + +#include +#pragma intrinsic(__rdtsc) +typedef unsigned __int64 ticks; +#define getticks __rdtsc +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * IA64 cycle counter + */ + +/* intel's icc/ecc compiler */ +#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; +#include + +static __inline__ ticks getticks(void) +{ + return __getReg(_IA64_REG_AR_ITC); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* gcc */ +#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */ +#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER) +#include +typedef unsigned long ticks; + +static inline ticks getticks(void) +{ + ticks ret; + + ret = _Asm_mov_from_ar (_AREG_ITC); + return ret; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/* Microsoft Visual C++ */ +#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER) +typedef unsigned __int64 ticks; + +# ifdef __cplusplus +extern "C" +# endif +ticks __getReg(int whichReg); +#pragma intrinsic(__getReg) + +static __inline ticks getticks(void) +{ + volatile ticks temp; + temp = __getReg(3116); + return temp; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* + * PA-RISC cycle counter + */ +#if defined(__hppa__) || defined(__hppa) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +# ifdef __GNUC__ +static __inline__ ticks getticks(void) +{ + ticks ret; + + __asm__ __volatile__("mfctl 16, %0": "=r" (ret)); + /* no input, nothing else clobbered */ + return ret; +} +# else +# include +static inline unsigned long getticks(void) +{ + register ticks ret; + _MFCTL(16, ret); + return ret; +} +# endif + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* S390, courtesy of James Treacy */ +#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long long ticks; + +static __inline__ ticks getticks(void) +{ + ticks cycles; + __asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc"); + return cycles; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER) +/* + * The 32-bit cycle counter on alpha overflows pretty quickly, + * unfortunately. A 1GHz machine overflows in 4 seconds. + */ +typedef unsigned int ticks; + +static __inline__ ticks getticks(void) +{ + unsigned long cc; + __asm__ __volatile__ ("rpcc %0" : "=r"(cc)); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER) +typedef unsigned long ticks; + +static __inline__ ticks getticks(void) +{ + ticks ret; + __asm__ __volatile__("rd %%tick, %0" : "=r" (ret)); + return ret; +} + +INLINE_ELAPSED(__inline__) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER) +# include +typedef unsigned int ticks; + +static __inline ticks getticks(void) +{ + unsigned long cc; + cc = asm("rpcc %v0"); + return (cc & 0xFFFFFFFF); +} + +INLINE_ELAPSED(__inline) + +#define HAVE_TICK_COUNTER +#endif +/*----------------------------------------------------------------*/ +/* SGI/Irix */ +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER) +typedef struct timespec ticks; + +static inline ticks getticks(void) +{ + struct timespec t; + clock_gettime(CLOCK_SGI_CYCLE, &t); + return t; +} + +static inline double elapsed(ticks t1, ticks t0) +{ + return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 + + ((double)t1.tv_nsec - (double)t0.tv_nsec); +} +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* Cray UNICOS _rtc() intrinsic function */ +#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER) +#ifdef HAVE_INTRINSICS_H +# include +#endif + +typedef long long ticks; + +#define getticks _rtc + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif + +/*----------------------------------------------------------------*/ +/* MIPS ZBus */ +#if HAVE_MIPS_ZBUS_TIMER +#if defined(__mips__) && !defined(HAVE_TICK_COUNTER) +#include +#include +#include + +typedef uint64_t ticks; + +static inline ticks getticks(void) +{ + static uint64_t* addr = 0; + + if (addr == 0) + { + uint32_t rq_addr = 0x10030000; + int fd; + int pgsize; + + pgsize = getpagesize(); + fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0); + if (fd < 0) { + perror("open"); + return NULL; + } + addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr); + close(fd); + if (addr == (uint64_t *)-1) { + perror("mmap"); + return NULL; + } + } + + return *addr; +} + +INLINE_ELAPSED(inline) + +#define HAVE_TICK_COUNTER +#endif +#endif /* HAVE_MIPS_ZBUS_TIMER */ + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/fftw3/fftw3.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/fftw3/fftw3.h new file mode 100644 index 000000000..6a01d2e4a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/fftw3/fftw3.h @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2003, 2007-11 Matteo Frigo + * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology + * + * The following statement of license applies *only* to this header file, + * and *not* to the other files distributed with FFTW or derived therefrom: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/***************************** NOTE TO USERS ********************************* + * + * THIS IS A HEADER FILE, NOT A MANUAL + * + * If you want to know how to use FFTW, please read the manual, + * online at http://www.fftw.org/doc/ and also included with FFTW. + * For a quick start, see the manual's tutorial section. + * + * (Reading header files to learn how to use a library is a habit + * stemming from code lacking a proper manual. Arguably, it's a + * *bad* habit in most cases, because header files can contain + * interfaces that are not part of the public, stable API.) + * + ****************************************************************************/ + +#ifndef FFTW3_H +#define FFTW3_H + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/* If is included, use the C99 complex type. Otherwise + define a type bit-compatible with C99 complex */ +#if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I) +# define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C +#else +# define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2] +#endif + +#define FFTW_CONCAT(prefix, name) prefix ## name +#define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name) +#define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name) +#define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name) +#define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name) + +/* IMPORTANT: for Windows compilers, you should add a line + #define FFTW_DLL + here and in kernel/ifftw.h if you are compiling/using FFTW as a + DLL, in order to do the proper importing/exporting, or + alternatively compile with -DFFTW_DLL or the equivalent + command-line flag. This is not necessary under MinGW/Cygwin, where + libtool does the imports/exports automatically. */ +#if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__)) + /* annoying Windows syntax for shared-library declarations */ +# if defined(COMPILING_FFTW) /* defined in api.h when compiling FFTW */ +# define FFTW_EXTERN extern __declspec(dllexport) +# else /* user is calling FFTW; import symbol */ +# define FFTW_EXTERN extern __declspec(dllimport) +# endif +#else +# define FFTW_EXTERN extern +#endif + +enum fftw_r2r_kind_do_not_use_me { + FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2, + FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6, + FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10 +}; + +struct fftw_iodim_do_not_use_me { + int n; /* dimension size */ + int is; /* input stride */ + int os; /* output stride */ +}; + +#include /* for ptrdiff_t */ +struct fftw_iodim64_do_not_use_me { + ptrdiff_t n; /* dimension size */ + ptrdiff_t is; /* input stride */ + ptrdiff_t os; /* output stride */ +}; + +typedef void (*fftw_write_char_func_do_not_use_me)(char c, void *); +typedef int (*fftw_read_char_func_do_not_use_me)(void *); + +/* + huge second-order macro that defines prototypes for all API + functions. We expand this macro for each supported precision + + X: name-mangling macro + R: real data type + C: complex data type +*/ + +#define FFTW_DEFINE_API(X, R, C) \ + \ +FFTW_DEFINE_COMPLEX(R, C); \ + \ +typedef struct X(plan_s) *X(plan); \ + \ +typedef struct fftw_iodim_do_not_use_me X(iodim); \ +typedef struct fftw_iodim64_do_not_use_me X(iodim64); \ + \ +typedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind); \ + \ +typedef fftw_write_char_func_do_not_use_me X(write_char_func); \ +typedef fftw_read_char_func_do_not_use_me X(read_char_func); \ + \ +FFTW_EXTERN void X(execute)(const X(plan) p); \ + \ +FFTW_EXTERN X(plan) X(plan_dft)(int rank, const int *n, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_1d)(int n, C *in, C *out, int sign, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_2d)(int n0, int n1, \ + C *in, C *out, int sign, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_3d)(int n0, int n1, int n2, \ + C *in, C *out, int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_many_dft)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + int sign, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, C *out, \ + int sign, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru64_split_dft)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *ro, R *io, \ + unsigned flags); \ + \ +FFTW_EXTERN void X(execute_dft)(const X(plan) p, C *in, C *out); \ +FFTW_EXTERN void X(execute_split_dft)(const X(plan) p, R *ri, R *ii, \ + R *ro, R *io); \ + \ +FFTW_EXTERN X(plan) X(plan_many_dft_r2c)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + C *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_r2c)(int rank, const int *n, \ + R *in, C *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_r2c_2d)(int n0, int n1, \ + R *in, C *out, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_r2c_3d)(int n0, int n1, \ + int n2, \ + R *in, C *out, unsigned flags); \ + \ + \ +FFTW_EXTERN X(plan) X(plan_many_dft_c2r)(int rank, const int *n, \ + int howmany, \ + C *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_c2r)(int rank, const int *n, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_c2r_2d)(int n0, int n1, \ + C *in, R *out, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_dft_c2r_3d)(int n0, int n1, \ + int n2, \ + C *in, R *out, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_split_dft_r2c)( \ + int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru_split_dft_c2r)( \ + int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_dft_r2c)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, C *out, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru64_dft_c2r)(int rank, \ + const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + C *in, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_split_dft_r2c)( \ + int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *ro, R *io, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_guru64_split_dft_c2r)( \ + int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *ri, R *ii, R *out, \ + unsigned flags); \ + \ +FFTW_EXTERN void X(execute_dft_r2c)(const X(plan) p, R *in, C *out); \ +FFTW_EXTERN void X(execute_dft_c2r)(const X(plan) p, C *in, R *out); \ + \ +FFTW_EXTERN void X(execute_split_dft_r2c)(const X(plan) p, \ + R *in, R *ro, R *io); \ +FFTW_EXTERN void X(execute_split_dft_c2r)(const X(plan) p, \ + R *ri, R *ii, R *out); \ + \ +FFTW_EXTERN X(plan) X(plan_many_r2r)(int rank, const int *n, \ + int howmany, \ + R *in, const int *inembed, \ + int istride, int idist, \ + R *out, const int *onembed, \ + int ostride, int odist, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_r2r)(int rank, const int *n, R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_r2r_1d)(int n, R *in, R *out, \ + X(r2r_kind) kind, unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_r2r_2d)(int n0, int n1, R *in, R *out, \ + X(r2r_kind) kind0, X(r2r_kind) kind1, \ + unsigned flags); \ +FFTW_EXTERN X(plan) X(plan_r2r_3d)(int n0, int n1, int n2, \ + R *in, R *out, X(r2r_kind) kind0, \ + X(r2r_kind) kind1, X(r2r_kind) kind2, \ + unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru_r2r)(int rank, const X(iodim) *dims, \ + int howmany_rank, \ + const X(iodim) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN X(plan) X(plan_guru64_r2r)(int rank, const X(iodim64) *dims, \ + int howmany_rank, \ + const X(iodim64) *howmany_dims, \ + R *in, R *out, \ + const X(r2r_kind) *kind, unsigned flags); \ + \ +FFTW_EXTERN void X(execute_r2r)(const X(plan) p, R *in, R *out); \ + \ +FFTW_EXTERN void X(destroy_plan)(X(plan) p); \ +FFTW_EXTERN void X(forget_wisdom)(void); \ +FFTW_EXTERN void X(cleanup)(void); \ + \ +FFTW_EXTERN void X(set_timelimit)(double t); \ + \ +FFTW_EXTERN void X(plan_with_nthreads)(int nthreads); \ +FFTW_EXTERN int X(init_threads)(void); \ +FFTW_EXTERN void X(cleanup_threads)(void); \ + \ +FFTW_EXTERN int X(export_wisdom_to_filename)(const char *filename); \ +FFTW_EXTERN void X(export_wisdom_to_file)(FILE *output_file); \ +FFTW_EXTERN char *X(export_wisdom_to_string)(void); \ +FFTW_EXTERN void X(export_wisdom)(X(write_char_func) write_char, \ + void *data); \ +FFTW_EXTERN int X(import_system_wisdom)(void); \ +FFTW_EXTERN int X(import_wisdom_from_filename)(const char *filename); \ +FFTW_EXTERN int X(import_wisdom_from_file)(FILE *input_file); \ +FFTW_EXTERN int X(import_wisdom_from_string)(const char *input_string); \ +FFTW_EXTERN int X(import_wisdom)(X(read_char_func) read_char, void *data); \ + \ +FFTW_EXTERN void X(fprint_plan)(const X(plan) p, FILE *output_file); \ +FFTW_EXTERN void X(print_plan)(const X(plan) p); \ + \ +FFTW_EXTERN void *X(malloc)(size_t n); \ +FFTW_EXTERN R *X(alloc_real)(size_t n); \ +FFTW_EXTERN C *X(alloc_complex)(size_t n); \ +FFTW_EXTERN void X(free)(void *p); \ + \ +FFTW_EXTERN void X(flops)(const X(plan) p, \ + double *add, double *mul, double *fmas); \ +FFTW_EXTERN double X(estimate_cost)(const X(plan) p); \ +FFTW_EXTERN double X(cost)(const X(plan) p); \ + \ +FFTW_EXTERN const char X(version)[]; \ +FFTW_EXTERN const char X(cc)[]; \ +FFTW_EXTERN const char X(codelet_optim)[]; + + +/* end of FFTW_DEFINE_API macro */ + +FFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex) +FFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex) + +#define FFTW_FORWARD (-1) +#define FFTW_BACKWARD (+1) + +#define FFTW_NO_TIMELIMIT (-1.0) + +/* documented flags */ +#define FFTW_MEASURE (0U) +#define FFTW_DESTROY_INPUT (1U << 0) +#define FFTW_UNALIGNED (1U << 1) +#define FFTW_CONSERVE_MEMORY (1U << 2) +#define FFTW_EXHAUSTIVE (1U << 3) /* NO_EXHAUSTIVE is default */ +#define FFTW_PRESERVE_INPUT (1U << 4) /* cancels FFTW_DESTROY_INPUT */ +#define FFTW_PATIENT (1U << 5) /* IMPATIENT is default */ +#define FFTW_ESTIMATE (1U << 6) +#define FFTW_WISDOM_ONLY (1U << 21) + +/* undocumented beyond-guru flags */ +#define FFTW_ESTIMATE_PATIENT (1U << 7) +#define FFTW_BELIEVE_PCOST (1U << 8) +#define FFTW_NO_DFT_R2HC (1U << 9) +#define FFTW_NO_NONTHREADED (1U << 10) +#define FFTW_NO_BUFFERING (1U << 11) +#define FFTW_NO_INDIRECT_OP (1U << 12) +#define FFTW_ALLOW_LARGE_GENERIC (1U << 13) /* NO_LARGE_GENERIC is default */ +#define FFTW_NO_RANK_SPLITS (1U << 14) +#define FFTW_NO_VRANK_SPLITS (1U << 15) +#define FFTW_NO_VRECURSE (1U << 16) +#define FFTW_NO_SIMD (1U << 17) +#define FFTW_NO_SLOW (1U << 18) +#define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19) +#define FFTW_ALLOW_PRUNING (1U << 20) + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* FFTW3_H */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/setup.py.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/setup.py.in new file mode 100644 index 000000000..989e24152 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/setup.py.in @@ -0,0 +1,37 @@ +# Python setup + +from distutils.core import setup, Extension +from numpy import get_include + +numpy_inc = get_include() # NumPy include path. +objs = "sht_init.o sht_kernels_a.o @objs@" +shtns_o = objs.split() # transform to list of objects +libdir = "@prefix@" +if len(libdir) == 0: + libdir = [] +else: + libdir = [libdir+"/lib"] +cargs = "@OPENMP_CFLAGS@" +largs = "@LDFLAGS@" +libs = "@LIBS@" +libslist = libs.replace('-l','').split() # transform to list of libraries + +shtns_module = Extension('_shtns', sources=['shtns_numpy_wrap.c'], + extra_objects=shtns_o, depends=shtns_o, + extra_compile_args=cargs.split(), + extra_link_args=largs.split(), + library_dirs=libdir, + libraries=libslist, + include_dirs=[numpy_inc]) + +setup(name='@PACKAGE_NAME@', + version='@PACKAGE_VERSION@', + description='High performance Spherical Harmonic Transform', + license='CeCILL', + author='Nathanael Schaeffer', + author_email='nschaeff@ujf-grenoble.fr', + url='https://bitbucket.org/nschaeff/shtns', + ext_modules=[shtns_module], + py_modules=["shtns"], + requires=["numpy"], + ) diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_com.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_com.c new file mode 100644 index 000000000..e608687f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_com.c @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/** \file sht_com.c + * \brief Common spherical harmonic tranforms + */ + +/// common sht functions and api calls + +/* regular transforms */ + +void SH_to_spat(shtns_cfg shtns, cplx *Qlm, double *Vr) { + ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SSY])(shtns, Qlm, Vr, shtns->lmax); +} + +void spat_to_SH(shtns_cfg shtns, double *Vr, cplx *Qlm) { + ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SAN])(shtns, Vr, Qlm, shtns->lmax); +} + +void SHsphtor_to_spat(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp) { + ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, shtns->lmax); +} + +void spat_to_SHsphtor(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm) { + ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, shtns->lmax); +} + +void SHqst_to_spat(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp) { + ((pf6l)shtns->ftable[SHT_STD][SHT_TYP_3SY])(shtns, Qlm, Slm, Tlm, Vr, Vt, Vp, shtns->lmax); +} + +void spat_to_SHqst(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm) { + ((pf6l)shtns->ftable[SHT_STD][SHT_TYP_3AN])(shtns, Vr, Vt, Vp, Qlm, Slm, Tlm, shtns->lmax); +} + +void SHtor_to_spat(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp) { + ((pf3l)shtns->ftable[SHT_STD][SHT_TYP_GTO])(shtns, Tlm, Vt, Vp, shtns->lmax); +} + +void SHsph_to_spat(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp) { + ((pf3l)shtns->ftable[SHT_STD][SHT_TYP_GSP])(shtns, Slm, Vt, Vp, shtns->lmax); +} + + +/* variable l-truncated transforms */ + +void SH_to_spat_l(shtns_cfg shtns, cplx *Qlm, double *Vr, int ltr) { + ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SSY])(shtns, Qlm, Vr, ltr); +} + +void spat_to_SH_l(shtns_cfg shtns, double *Vr, cplx *Qlm, int ltr) { + ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SAN])(shtns, Vr, Qlm, ltr); +} + +void SHsphtor_to_spat_l(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, int ltr) { + ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, ltr); +} + +void spat_to_SHsphtor_l(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int ltr) { + ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, ltr); +} + +void SHqst_to_spat_l(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int ltr) { + ((pf6l)shtns->ftable[SHT_LTR][SHT_TYP_3SY])(shtns, Qlm, Slm, Tlm, Vr, Vt, Vp, ltr); +} + +void spat_to_SHqst_l(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) { + ((pf6l)shtns->ftable[SHT_LTR][SHT_TYP_3AN])(shtns, Vr, Vt, Vp, Qlm, Slm, Tlm, ltr); +} + +void SHtor_to_spat_l(shtns_cfg shtns, cplx *Tlm, double *Vt, double *Vp, int ltr) { + ((pf3l)shtns->ftable[SHT_LTR][SHT_TYP_GTO])(shtns, Tlm, Vt, Vp, ltr); +} + +void SHsph_to_spat_l(shtns_cfg shtns, cplx *Slm, double *Vt, double *Vp, int ltr) { + ((pf3l)shtns->ftable[SHT_LTR][SHT_TYP_GSP])(shtns, Slm, Vt, Vp, ltr); +} + + +/* fixed m, variable l-truncated legendre transforms (no fft) */ + +void SH_to_spat_ml(shtns_cfg shtns, int im, cplx *Qlm, cplx *Vr, int ltr) { + ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SSY])(shtns, im, Qlm, Vr, ltr); +} + +void spat_to_SH_ml(shtns_cfg shtns, int im, cplx *Vr, cplx *Qlm, int ltr) { + ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SAN])(shtns, im, Vr, Qlm, ltr); +} + +void SHsphtor_to_spat_ml(shtns_cfg shtns, int im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, int ltr) { + ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VSY])(shtns, im, Slm, Tlm, Vt, Vp, ltr); +} + +void spat_to_SHsphtor_ml(shtns_cfg shtns, int im, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm, int ltr) { + ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VAN])(shtns, im, Vt, Vp, Slm, Tlm, ltr); +} + +void SHqst_to_spat_ml(shtns_cfg shtns, int im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, int ltr) { + ((pf6ml)shtns->ftable[SHT_M][SHT_TYP_3SY])(shtns, im, Qlm, Slm, Tlm, Vr, Vt, Vp, ltr); +} + +void spat_to_SHqst_ml(shtns_cfg shtns, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) { + ((pf6ml)shtns->ftable[SHT_M][SHT_TYP_3AN])(shtns, im, Vr, Vt, Vp, Qlm, Slm, Tlm, ltr); +} + +void SHtor_to_spat_ml(shtns_cfg shtns, int im, cplx *Tlm, cplx *Vt, cplx *Vp, int ltr) { + ((pf3ml)shtns->ftable[SHT_M][SHT_TYP_GTO])(shtns, im, Tlm, Vt, Vp, ltr); +} + +void SHsph_to_spat_ml(shtns_cfg shtns, int im, cplx *Slm, cplx *Vt, cplx *Vp, int ltr) { + ((pf3ml)shtns->ftable[SHT_M][SHT_TYP_GSP])(shtns, im, Slm, Vt, Vp, ltr); +} + + +/* successive scalar + vector for 3D transform (can be faster than simultaneous transform) */ +static +void SHqst_to_spat_2(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp) { + const int ltr = shtns->lmax; + ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SSY])(shtns, Qlm, Vr, ltr); + ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, ltr); +} + +static +void SHqst_to_spat_2l(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int ltr) { + ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SSY])(shtns, Qlm, Vr, ltr); + ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VSY])(shtns, Slm, Tlm, Vt, Vp, ltr); +} + +static +void spat_to_SHqst_2(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm) { + const int ltr = shtns->lmax; + ((pf2l)shtns->ftable[SHT_STD][SHT_TYP_SAN])(shtns, Vr, Qlm, ltr); + ((pf4l)shtns->ftable[SHT_STD][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, ltr); +} + +static +void spat_to_SHqst_2l(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) { + ((pf2l)shtns->ftable[SHT_LTR][SHT_TYP_SAN])(shtns, Vr, Qlm, ltr); + ((pf4l)shtns->ftable[SHT_LTR][SHT_TYP_VAN])(shtns, Vt, Vp, Slm, Tlm, ltr); +} + +static +void SHqst_to_spat_2ml(shtns_cfg shtns, int im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, int ltr) { + ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SSY])(shtns, im, Qlm, Vr, ltr); + ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VSY])(shtns, im, Slm, Tlm, Vt, Vp, ltr); +} + +static +void spat_to_SHqst_2ml(shtns_cfg shtns, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr) { + ((pf2ml)shtns->ftable[SHT_M][SHT_TYP_SAN])(shtns, im, Vr, Qlm, ltr); + ((pf4ml)shtns->ftable[SHT_M][SHT_TYP_VAN])(shtns, im, Vt, Vp, Slm, Tlm, ltr); +} + + +#if defined(SHT_F77_API) + +/* Fortran 77 api */ + +extern shtns_cfg sht_data; + +// Fortran API : Call from fortran without the trailing '_' +//@{ + + // regular +/// \ingroup fortapi +void shtns_sh_to_spat_(cplx *Qlm, double *Vr) { + ((pf2l)sht_data->ftable[SHT_STD][SHT_TYP_SSY])(sht_data, Qlm, Vr, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_spat_to_sh_(double *Vr, cplx *Qlm) { + ((pf2l)sht_data->ftable[SHT_STD][SHT_TYP_SAN])(sht_data, Vr, Qlm, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_sh_to_spat_cplx_(cplx *alm, cplx *z) { + SH_to_spat_cplx(sht_data, alm, z); +} + +/// \ingroup fortapi +void shtns_spat_cplx_to_sh_(cplx *z, cplx *alm) { + spat_cplx_to_SH(sht_data, z, alm); +} + +/// \ingroup fortapi +void shtns_sphtor_to_spat_(cplx *Slm, cplx *Tlm, double *Vt, double *Vp) { + ((pf4l)sht_data->ftable[SHT_STD][SHT_TYP_VSY])(sht_data, Slm, Tlm, Vt, Vp, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_spat_to_sphtor_(double *Vt, double *Vp, cplx *Slm, cplx *Tlm) { + ((pf4l)sht_data->ftable[SHT_STD][SHT_TYP_VAN])(sht_data, Vt, Vp, Slm, Tlm, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_qst_to_spat_(cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp) { + ((pf6l)sht_data->ftable[SHT_STD][SHT_TYP_3SY])(sht_data, Qlm, Slm, Tlm, Vr, Vt, Vp, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_spat_to_qst_(double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm) { + ((pf6l)sht_data->ftable[SHT_STD][SHT_TYP_3AN])(sht_data, Vr, Vt, Vp, Qlm, Slm, Tlm, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_sph_to_spat_(cplx *Slm, double *Vt, double *Vp) { + ((pf3l)sht_data->ftable[SHT_STD][SHT_TYP_GSP])(sht_data, Slm, Vt, Vp, sht_data->lmax); +} + +/// \ingroup fortapi +void shtns_tor_to_spat_(cplx *Tlm, double *Vt, double *Vp) { + ((pf3l)sht_data->ftable[SHT_STD][SHT_TYP_GTO])(sht_data, Tlm, Vt, Vp, sht_data->lmax); +} + + + // variable l-truncation +/// \ingroup fortapi +void shtns_sh_to_spat_l_(cplx *Qlm, double *Vr, int* ltr) { + ((pf2l)sht_data->ftable[SHT_LTR][SHT_TYP_SSY])(sht_data, Qlm, Vr, *ltr); +} + +/// \ingroup fortapi +void shtns_spat_to_sh_l_(double *Vr, cplx *Qlm, int* ltr) { + ((pf2l)sht_data->ftable[SHT_LTR][SHT_TYP_SAN])(sht_data, Vr, Qlm, *ltr); +} + +/// \ingroup fortapi +void shtns_sphtor_to_spat_l_(cplx *Slm, cplx *Tlm, double *Vt, double *Vp, int* ltr) { + ((pf4l)sht_data->ftable[SHT_LTR][SHT_TYP_VSY])(sht_data, Slm, Tlm, Vt, Vp, *ltr); +} + +/// \ingroup fortapi +void shtns_spat_to_sphtor_l_(double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int* ltr) { + ((pf4l)sht_data->ftable[SHT_LTR][SHT_TYP_VAN])(sht_data, Vt, Vp, Slm, Tlm, *ltr); +} + +/// \ingroup fortapi +void shtns_qst_to_spat_l_(cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int* ltr) { + ((pf6l)sht_data->ftable[SHT_LTR][SHT_TYP_3SY])(sht_data, Qlm, Slm, Tlm, Vr, Vt, Vp, *ltr); +} + +/// \ingroup fortapi +void shtns_spat_to_qst_l_(double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int* ltr) { + ((pf6l)sht_data->ftable[SHT_LTR][SHT_TYP_3AN])(sht_data, Vr, Vt, Vp, Qlm, Slm, Tlm, *ltr); +} + +/// \ingroup fortapi +void shtns_sph_to_spat_l_(cplx *Slm, double *Vt, double *Vp, int* ltr) { + ((pf3l)sht_data->ftable[SHT_LTR][SHT_TYP_GSP])(sht_data, Slm, Vt, Vp, *ltr); +} + +/// \ingroup fortapi +void shtns_tor_to_spat_l_(cplx *Tlm, double *Vt, double *Vp, int* ltr) { + ((pf3l)sht_data->ftable[SHT_LTR][SHT_TYP_GTO])(sht_data, Tlm, Vt, Vp, *ltr); +} + + + // fixed m, variable l-truncation (no fft, aka Legendre transform) +/// \ingroup fortapi +void shtns_sh_to_spat_ml_(int *im, cplx *Qlm, cplx *Vr, int *ltr) { + ((pf2ml)sht_data->ftable[SHT_M][SHT_TYP_SSY])(sht_data, *im, Qlm, Vr, *ltr); +} + +/// \ingroup fortapi +void shtns_spat_to_sh_ml_(int *im, cplx *Vr, cplx *Qlm, int *ltr) { + ((pf2ml)sht_data->ftable[SHT_M][SHT_TYP_SAN])(sht_data, *im, Vr, Qlm, *ltr); +} + +/// \ingroup fortapi +void shtns_sphtor_to_spat_ml_(int *im, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp, int *ltr) { + ((pf4ml)sht_data->ftable[SHT_M][SHT_TYP_VSY])(sht_data, *im, Slm, Tlm, Vt, Vp, *ltr); +} + +/// \ingroup fortapi +void shtns_spat_to_sphtor_ml_(int *im, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm, int *ltr) { + ((pf4ml)sht_data->ftable[SHT_M][SHT_TYP_VAN])(sht_data, *im, Vt, Vp, Slm, Tlm, *ltr); +} + +/// \ingroup fortapi +void shtns_qst_to_spat_ml_(int *im, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp, int *ltr) { + ((pf6ml)sht_data->ftable[SHT_M][SHT_TYP_3SY])(sht_data, *im, Qlm, Slm, Tlm, Vr, Vt, Vp, *ltr); +} + +/// \ingroup fortapi +void shtns_spat_to_qst_ml_(int *im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int *ltr) { + ((pf6ml)sht_data->ftable[SHT_M][SHT_TYP_3AN])(sht_data, *im, Vr, Vt, Vp, Qlm, Slm, Tlm, *ltr); +} + +/// \ingroup fortapi +void shtns_tor_to_spat_ml_(int *im, cplx *Tlm, cplx *Vt, cplx *Vp, int *ltr) { + ((pf3ml)sht_data->ftable[SHT_M][SHT_TYP_GTO])(sht_data, *im, Tlm, Vt, Vp, *ltr); +} + +/// \ingroup fortapi +void shtns_sph_to_spat_ml_(int *im, cplx *Slm, cplx *Vt, cplx *Vp, int *ltr) { + ((pf3ml)sht_data->ftable[SHT_M][SHT_TYP_GSP])(sht_data, *im, Slm, Vt, Vp, *ltr); +} + + +//@} +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_config.h.in b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_config.h.in new file mode 100644 index 000000000..b115150f1 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_config.h.in @@ -0,0 +1,146 @@ +/* sht_config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_COMPLEX_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_C_ASM_H + +/* Define to 1 if you have the `fftw_cost' function. */ +#undef HAVE_FFTW_COST + +/* Define to 1 if you have the `gethrtime' function. */ +#undef HAVE_GETHRTIME + +/* Define to 1 if hrtime_t is defined in */ +#undef HAVE_HRTIME_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTRINSICS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `cudart' library (-lcudart). */ +#undef HAVE_LIBCUDART + +/* Define to 1 if you have the `cufft' library (-lcufft). */ +#undef HAVE_LIBCUFFT + +/* Define to 1 if you have the `fftw3' library (-lfftw3). */ +#undef HAVE_LIBFFTW3 + +/* Define to 1 if you have the `fftw3_omp' library (-lfftw3_omp). */ +#undef HAVE_LIBFFTW3_OMP + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if the type `long double' works and has more range or precision + than `double'. */ +#undef HAVE_LONG_DOUBLE_WIDER + +/* Define to 1 if you have the `mach_absolute_time' function. */ +#undef HAVE_MACH_ABSOLUTE_TIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_MACH_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MATH_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `read_real_time' function. */ +#undef HAVE_READ_REAL_TIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the `time_base_to_time' function. */ +#undef HAVE_TIME_BASE_TO_TIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the UNICOS _rtc() intrinsic. */ +#undef HAVE__RTC + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* I need the transforms compatible with the MagIC code, to speed it up! */ +#undef SHTNS4MAGIC + +/* Enable the new recurrence proposed by Ishioka (2018) see + https://doi.org/10.2151/jmsj.2018-019 (faster, but experimental) */ +#undef SHTNS_ISHIOKA + +/* Include algorithms using precomputed matrix stored in memory) */ +#undef SHTNS_MEM + +/* Compile the Fortran API */ +#undef SHT_F77_API + +/* 0:no output, 1:output info to stdout, 2:more output (debug info), 3:also + print fftw plans. */ +#undef SHT_VERBOSE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* I compile with GCC 4 or ICC 14 or later, and I would like fast vectorized + code (if SSE2, AVX or MIC is supported) ! */ +#undef _GCC_VEC_ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_fly.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_fly.c new file mode 100644 index 000000000..4913c9595 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_fly.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +#include "sht_private.h" + +#define MTR MMAX +#define SHT_VAR_LTR + +#define GEN(name,sfx) GLUE2(name,sfx) +#define GEN3(name,nw,sfx) GLUE3(name,nw,sfx) + +// genaral case +#undef SUFFIX +#define SUFFIX _l + + #define NWAY 1 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SH_to_spat_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SH_to_spat_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #undef NWAY + +#define SHT_GRAD + #define NWAY 2 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY + #ifdef _GCC_VEC_ + #define NWAY 1 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY + #define NWAY 3 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY + #endif + #define NWAY 4 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY +#undef SHT_GRAD + +#define SHT_3COMP + #define NWAY 1 + #include "SHT/spat_to_SHqst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SHqst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SHqst_fly.c" + #include "SHT/SHqst_to_spat_fly.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SHqst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SHqst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SHqst_fly.c" + #include "SHT/SHqst_to_spat_fly.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SHqst_fly.c" + #include "SHT/SHqst_to_spat_fly.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SHqst_fly.c" + #include "SHT/SHqst_to_spat_fly.c" + #undef NWAY +#undef SHT_3COMP + +// axisymmetric +#define SHT_AXISYM +#undef SUFFIX +#define SUFFIX _m0l + + #define NWAY 1 + #include "SHT/spat_to_SHst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SHst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/spat_to_SHst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SH_to_spat_fly.c" + #include "SHT/SHst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SH_fly.c" + #include "SHT/SH_to_spat_fly.c" + #undef NWAY + +#define SHT_GRAD + #define NWAY 2 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY + #ifdef _GCC_VEC_ + #define NWAY 1 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY + #define NWAY 3 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY + #endif + #define NWAY 4 + #include "SHT/SHs_to_spat_fly.c" + #include "SHT/SHt_to_spat_fly.c" + #undef NWAY +#undef SHT_GRAD + +#define SHT_3COMP + #define NWAY 1 + #include "SHT/spat_to_SHqst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SHqst_to_spat_fly.c" + #endif + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SHqst_fly.c" + #include "SHT/SHqst_to_spat_fly.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SHqst_fly.c" + #ifdef _GCC_VEC_ + #include "SHT/SHqst_to_spat_fly.c" + #endif + #undef NWAY +#undef SHT_3COMP + +#ifndef _GCC_VEC_ + #define SH_to_spat_fly1_l NULL + #define SHsphtor_to_spat_fly1_l NULL + #define SHsph_to_spat_fly1_l NULL + #define SHtor_to_spat_fly1_l NULL + #define SHqst_to_spat_fly1_l NULL + #define SH_to_spat_fly3_l NULL + #define SHsphtor_to_spat_fly3_l NULL + #define SHsph_to_spat_fly3_l NULL + #define SHtor_to_spat_fly3_l NULL + #define SHqst_to_spat_fly3_l NULL + + #define SHsphtor_to_spat_fly1_m0l NULL + #define SHsph_to_spat_fly1_m0l NULL + #define SHtor_to_spat_fly1_m0l NULL + #define SHqst_to_spat_fly1_m0l NULL + #define SH_to_spat_fly3_m0l NULL + #define SHsphtor_to_spat_fly3_m0l NULL + #define SHsph_to_spat_fly3_m0l NULL + #define SHtor_to_spat_fly3_m0l NULL + #define SHqst_to_spat_fly3_m0l NULL + + #define SHsphtor_to_spat_fly1_m0l NULL + #define SHsph_to_spat_fly1_m0l NULL + #define SHtor_to_spat_fly1_m0l NULL + #define SHqst_to_spat_fly1_m0l NULL + #define SH_to_spat_fly3_m0l NULL + #define SHsphtor_to_spat_fly3_m0l NULL + #define SHsph_to_spat_fly3_m0l NULL + #define SHtor_to_spat_fly3_m0l NULL + #define SHqst_to_spat_fly3_m0l NULL + + #define SHsphtor_m_to_spat_fly1_l NULL + #define SHsph_m_to_spat_fly1_l NULL + #define SHtor_m_to_spat_fly1_l NULL + #define SHqst_m_to_spat_fly1_l NULL + #define SH_m_to_spat_fly3_l NULL + #define SHsphtor_m_to_spat_fly3_l NULL + #define SHsph_m_to_spat_fly3_l NULL + #define SHtor_m_to_spat_fly3_l NULL + #define SHqst_m_to_spat_fly3_l NULL +#endif + +void* ffly[6][SHT_NTYP] = { + { SH_to_spat_fly1_l, spat_to_SH_fly1_l, SHsphtor_to_spat_fly1_l, spat_to_SHsphtor_fly1_l, + SHsph_to_spat_fly1_l, SHtor_to_spat_fly1_l, SHqst_to_spat_fly1_l, spat_to_SHqst_fly1_l }, + { SH_to_spat_fly2_l, spat_to_SH_fly2_l, SHsphtor_to_spat_fly2_l, spat_to_SHsphtor_fly2_l, + SHsph_to_spat_fly2_l, SHtor_to_spat_fly2_l, SHqst_to_spat_fly2_l, spat_to_SHqst_fly2_l }, + { SH_to_spat_fly3_l, spat_to_SH_fly3_l, SHsphtor_to_spat_fly3_l, spat_to_SHsphtor_fly3_l, + SHsph_to_spat_fly3_l, SHtor_to_spat_fly3_l, SHqst_to_spat_fly3_l, spat_to_SHqst_fly3_l }, + { SH_to_spat_fly4_l, spat_to_SH_fly4_l, SHsphtor_to_spat_fly4_l, spat_to_SHsphtor_fly4_l, + SHsph_to_spat_fly4_l, SHtor_to_spat_fly4_l, SHqst_to_spat_fly4_l, spat_to_SHqst_fly4_l }, + { SH_to_spat_fly6_l, spat_to_SH_fly6_l, SHsphtor_to_spat_fly6_l, spat_to_SHsphtor_fly6_l, + NULL, NULL, SHqst_to_spat_fly6_l, spat_to_SHqst_fly6_l }, + { SH_to_spat_fly8_l, spat_to_SH_fly8_l, SHsphtor_to_spat_fly8_l, spat_to_SHsphtor_fly8_l, + NULL, NULL, SHqst_to_spat_fly8_l, spat_to_SHqst_fly8_l }, +}; + +void* ffly_m0[6][SHT_NTYP] = { + { NULL, NULL, SHsphtor_to_spat_fly1_m0l, spat_to_SHsphtor_fly1_m0l, + SHsph_to_spat_fly1_m0l, SHtor_to_spat_fly1_m0l, SHqst_to_spat_fly1_m0l, spat_to_SHqst_fly1_m0l }, + { SH_to_spat_fly2_m0l, spat_to_SH_fly2_m0l, SHsphtor_to_spat_fly2_m0l, spat_to_SHsphtor_fly2_m0l, + SHsph_to_spat_fly2_m0l, SHtor_to_spat_fly2_m0l, SHqst_to_spat_fly2_m0l, spat_to_SHqst_fly2_m0l }, + { SH_to_spat_fly3_m0l, spat_to_SH_fly3_m0l, SHsphtor_to_spat_fly3_m0l, spat_to_SHsphtor_fly3_m0l, + SHsph_to_spat_fly3_m0l, SHtor_to_spat_fly3_m0l, SHqst_to_spat_fly3_m0l, spat_to_SHqst_fly3_m0l }, + { SH_to_spat_fly4_m0l, spat_to_SH_fly4_m0l, NULL, NULL, + SHsph_to_spat_fly4_m0l, SHtor_to_spat_fly4_m0l, NULL, NULL }, + { SH_to_spat_fly6_m0l, spat_to_SH_fly6_m0l, NULL, NULL, + NULL, NULL, NULL, NULL }, + { SH_to_spat_fly8_m0l, spat_to_SH_fly8_m0l, NULL, NULL, + NULL, NULL, NULL, NULL } +}; + +void* ffly_m[6][SHT_NTYP] = { + { NULL, NULL, SHsphtor_m_to_spat_fly1_l, spat_to_SHsphtor_m_fly1_l, + SHsph_m_to_spat_fly1_l, SHtor_m_to_spat_fly1_l, SHqst_m_to_spat_fly1_l, spat_to_SHqst_m_fly1_l }, + { SH_m_to_spat_fly2_l, spat_to_SH_m_fly2_l, SHsphtor_m_to_spat_fly2_l, spat_to_SHsphtor_m_fly2_l, + SHsph_m_to_spat_fly2_l, SHtor_m_to_spat_fly2_l, SHqst_m_to_spat_fly2_l, spat_to_SHqst_m_fly2_l }, + { SH_m_to_spat_fly3_l, spat_to_SH_m_fly3_l, SHsphtor_m_to_spat_fly3_l, spat_to_SHsphtor_m_fly3_l, + SHsph_m_to_spat_fly3_l, SHtor_m_to_spat_fly3_l, SHqst_m_to_spat_fly3_l, spat_to_SHqst_m_fly3_l }, + { SH_m_to_spat_fly4_l, spat_to_SH_m_fly4_l, NULL, NULL, + SHsph_m_to_spat_fly4_l, SHtor_m_to_spat_fly4_l, NULL, NULL }, + { SH_m_to_spat_fly6_l, spat_to_SH_m_fly6_l, NULL, NULL, + NULL, NULL, NULL, NULL }, + { SH_m_to_spat_fly8_l, spat_to_SH_m_fly8_l, NULL, NULL, + NULL, NULL, NULL, NULL } +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_func.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_func.c new file mode 100644 index 000000000..12b6a4962 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_func.c @@ -0,0 +1,2154 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/** \internal \file sht_func.c + * \brief Rotation of Spherical Harmonics. + */ + + +/** \addtogroup rotation Rotation of SH fields. +Rotation around axis other than Z should be considered of beta quality (they have been tested but may still contain bugs). +They also require \c mmax = \c lmax. They use an Algorithm inspired by the pseudospectral rotation described in +Gimbutas Z. and Greengard L. 2009 "A fast and stable method for rotating spherical harmonic expansions" Journal of Computational Physics. +doi:10.1016/j.jcp.2009.05.014 + +These functions do only require a call to \ref shtns_create, but not to \ref shtns_set_grid. +*/ +//@{ + +/// Rotate a SH representation Qlm around the z-axis by angle alpha (in radians), +/// which is the same as rotating the reference frame by angle -alpha. +/// Result is stored in Rlm (which can be the same array as Qlm). +void SH_Zrotate(shtns_cfg shtns, cplx *Qlm, double alpha, cplx *Rlm) +{ + int im, l, lmax, mmax, mres; + + lmax = shtns->lmax; mmax = shtns->mmax; mres = shtns->mres; + + if (Rlm != Qlm) { // copy m=0 which does not change. + l=0; do { Rlm[l] = Qlm[l]; } while(++l <= lmax); + } + for (int im=1; im<=mmax; im++) { + cplx eima = cos(im*mres*alpha) - I*sin(im*mres*alpha); // rotate reference frame by angle -alpha + for (l=im*mres; l<=lmax; ++l) Rlm[LiM(shtns, l, im)] = Qlm[LiM(shtns, l, im)] * eima; + } +} + +//@} + +/// \internal initialize pseudo-spectral rotations +static void SH_rotK90_init(shtns_cfg shtns) +{ + cplx *q; + double *q0; + int nfft, nrembed, ncembed; + +// if ((shtns->mres != 1) || (shtns->mmax != shtns->lmax)) runerr("Arbitrary rotations require lmax=mmax and mres=1"); + +#define NWAY 4 + + const int lmax = shtns->lmax; + const int fac = 2*VSIZE2*NWAY; // we need a multiple of 2*VSIZE2*NWAY ... + const int ntheta = fft_int( ((lmax+fac)/fac) , 7) * fac; // ... and also an fft-friendly value + + // generate the equispaced grid for synthesis + shtns->ct_rot = malloc( sizeof(double)*ntheta ); + shtns->st_rot = shtns->ct_rot + (ntheta/2); + for (int k=0; kct_rot[k] = cost; + shtns->st_rot[k] = sint; + } + + // plan FFT + size_t sze = sizeof(double)*(2*ntheta+2)*lmax; + q0 = VMALLOC(sze); // alloc. + #ifdef OMP_FFTW + int k = (lmax < 63) ? 1 : shtns->nthreads; + fftw_plan_with_nthreads(k); + #endif + q = (cplx*) q0; // in-place FFT + nfft = 2*ntheta; nrembed = nfft+2; ncembed = nrembed/2; + shtns->fft_rot = fftw_plan_many_dft_r2c(1, &nfft, lmax, q0, &nrembed, lmax, 1, q, &ncembed, lmax, 1, FFTW_MEASURE); + + VFREE(q0); + shtns->npts_rot = ntheta; // save ntheta, and mark as initialized. +} + +/** \internal rotation kernel used by SH_Yrotate90(), SH_Xrotate90() and SH_rotate(). + Algorithm based on the pseudospectral rotation[1] : + - rotate around Z by angle dphi0. + - synthetize for each l the spatial description for phi=0 and phi=pi on an equispaced latitudinal grid. + - Fourier ananlyze as data on the equator to recover the m in the 90 degrees rotated frame. + - rotate around new Z by angle dphi1. + [1] Gimbutas Z. and Greengard L. 2009 "A fast and stable method for rotating spherical harmonic expansions" Journal of Computational Physics. **/ +static void SH_rotK90(shtns_cfg shtns, cplx *Qlm, cplx *Rlm, double dphi0, double dphi1) +{ +// if (shtns->npts_rot == 0) SH_rotK90_init(shtns); + +// ticks tik0, tik1, tik2, tik3; + + const int lmax = shtns->lmax; + const int ntheta = shtns->npts_rot; + size_t sze = sizeof(double)*(2*ntheta+2)*lmax; + double* const q0 = VMALLOC(sze); // alloc. + + // rotate around Z by dphi0, and also pre-multiply imaginary parts by m + if (Rlm != Qlm) { // copy m=0 which does not change. + long l=0; do { Rlm[l] = Qlm[l]; } while(++l <= lmax); + } + for (int m=1; m<=lmax; m++) { + cplx eima = cos(m*dphi0) - I*sin(m*dphi0); // rotate reference frame by angle -dphi0 + long lm = LiM(shtns,m,m); + double em = m; + for (long l=m; l<=lmax; ++l) { + cplx qrot = Qlm[lm] * eima; + ((double*)Rlm)[2*lm] = creal(qrot); + ((double*)Rlm)[2*lm+1] = cimag(qrot) * em; // multiply every imaginary part by m (part of im/sin(theta)*Ylm) + lm++; + } + } + Qlm = Rlm; + +// tik0 = getticks(); + + rnd* const qve = (rnd*) VMALLOC( sizeof(rnd)*NWAY*4*lmax ); // vector buffer + rnd* const qvo = qve + NWAY*2*lmax; // for odd m + double* const ct = shtns->ct_rot; + double* const st = shtns->st_rot; + double* const alm = shtns->alm; + const long nk = ntheta/(2*VSIZE2); // ntheta is a multiple of (2*VSIZE2) + long k = 0; + do { + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + long l=0; + // m=0 + double* al = alm; + for (int j=0; j0] + cost[j] = vread(ct, j+k); + } + for (int j=0; j 0 + for (long m=1; m<=lmax; ++m) { + rnd* qv = qve; + if (m&1) qv = qvo; // store even and odd m separately. + double* al = shtns->alm + m*(2*(lmax+1) -m+1); + cplx* Ql = &Qlm[LiM(shtns, 0,m)]; // virtual pointer for l=0 and m + rnd cost[NWAY], y0[NWAY], y1[NWAY]; + for (int j=0; j0 + } + long l=m-1; + long int ny = 0; + if ((int)lmax <= SHT_L_RESCALE_FLY) { + do { // sin(theta)^(m-1) + if (l&1) for (int j=0; j>= 1); + } else { + long int nsint = 0; + do { // sin(theta)^(m-1) (use rescaling to avoid underflow) + if (l&1) { + for (int j=0; j>= 1); + } + for (int j=0; j SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) { // rescale when value is significant + ++ny; + for (int j=0; jfft_rot, q0, q); + +// tik2 = getticks(); + + const int nphi = 2*ntheta; + double ydyl[lmax+1]; + long m=0; long lm=1; // start at l=1,m=0 + long l; + legendre_sphPlm_deriv_array_equ(shtns, lmax, m, ydyl+m); + for (l=1; lmres MUST be 1, and lmax=mmax. +void SH_Xrotate90(shtns_cfg shtns, cplx *Qlm, cplx *Rlm) +{ + int lmax= shtns->lmax; + if ((shtns->mres != 1) || (shtns->mmax < lmax)) shtns_runerr("truncature makes rotation not closed."); + + if (lmax == 1) { + Rlm[0] = Qlm[0]; // l=0 is invariant. + int l=1; // rotation matrix for rotX(90), l=1 : m=[0, 1r, 1i] + double q0 = creal(Qlm[LiM(shtns, l, 0)]); + Rlm[LiM(shtns, l, 0)] = sqrt(2.0) * cimag(Qlm[LiM(shtns, l, 1)]); //[m=0] 0 0 sqrt(2) + Rlm[LiM(shtns, l ,1)] = creal(Qlm[LiM(shtns, l, 1)]) - I*(sqrt(0.5)*q0); //[m=1r] 0 1 0 + return; //[m=1i] -sqrt(2)/2 0 0 + } + + SH_rotK90(shtns, Qlm, Rlm, 0.0, -M_PI/2); +} + +/// rotate Qlm by 90 degrees around Y axis and store the result in Rlm. +/// shtns->mres MUST be 1, and lmax=mmax. +void SH_Yrotate90(shtns_cfg shtns, cplx *Qlm, cplx *Rlm) +{ + int lmax= shtns->lmax; + if ((shtns->mres != 1) || (shtns->mmax < lmax)) shtns_runerr("truncature makes rotation not closed."); + + if (lmax == 1) { + Rlm[0] = Qlm[0]; // l=0 is invariant. + int l=1; // rotation matrix for rotY(90), l=1 : m=[0, 1r, 1i] + double q0 = creal(Qlm[LiM(shtns, l, 0)]); //[m=0] 0 sqrt(2) 0 + Rlm[LiM(shtns, l, 0)] = sqrt(2.0) * creal(Qlm[LiM(shtns, l, 1)]); //[m=1r] -sqrt(2)/2 0 0 + Rlm[LiM(shtns, l ,1)] = I*cimag(Qlm[LiM(shtns, l, 1)]) - sqrt(0.5) * q0; //[m=1i] 0 0 1 + return; + } + + SH_rotK90(shtns, Qlm, Rlm, -M_PI/2, 0.0); +} + +/// rotate Qlm around Y axis by arbitrary angle, using composition of rotations. Store the result in Rlm. +void SH_Yrotate(shtns_cfg shtns, cplx *Qlm, double alpha, cplx *Rlm) +{ + if ((shtns->mres != 1) || (shtns->mmax < shtns->lmax)) shtns_runerr("truncature makes rotation not closed."); + + SH_rotK90(shtns, Qlm, Rlm, 0.0, M_PI/2 + alpha); // Zrotate(pi/2) + Yrotate90 + Zrotate(pi+alpha) + SH_rotK90(shtns, Rlm, Rlm, 0.0, M_PI/2); // Yrotate90 + Zrotate(pi/2) +} + +//@} + + + +/** \addtogroup operators Special operators + * Apply special operators in spectral space: multiplication by cos(theta), sin(theta).d/dtheta. +*/ +//@{ + + +/// \internal generates the cos(theta) matrix up to lmax+1 +/// \param mx : an array of 2*NLM double that will be filled with the matrix coefficients. +/// xq[lm] = mx[2*lm-1] * q[lm-1] + mx[2*lm] * q[lm+1]; [note the shift in indices compared to the public functions] +static void mul_ct_matrix_shifted(shtns_cfg shtns, double* mx) +{ + long int im,l,lm; + double a_1; + + if (SHT_NORM == sht_schmidt) { + lm=0; + for (im=0; im<=MMAX; im++) { + double* al = alm_im(shtns,im); + long int m=im*MRES; + a_1 = 1.0 / al[1]; + l=m; + while(++l <= LMAX) { + al+=2; + mx[2*lm+1] = a_1; + a_1 = 1.0 / al[1]; + mx[2*lm] = -a_1*al[0]; // = -al[2*(lm+1)] / al[2*(lm+1)+1]; + lm++; + } + if (l == LMAX+1) { // the last one needs to be computed (used in vector to scalar transform) + mx[2*lm+1] = a_1; + mx[2*lm] = sqrt((l+m)*(l-m))/(2*l+1); // LMAX+1 + lm++; + } + } + } else { + lm=0; + for (im=0; im<=MMAX; im++) { + double* al = alm_im(shtns, im); + l=im*MRES; + while(++l <= LMAX+1) { // compute coeff up to LMAX+1, it fits into the 2*NLM bloc, and is needed for vector <> scalar conversions. + a_1 = 1.0 / al[1]; + mx[2*lm] = a_1; // specific to orthonormal. + mx[2*lm+1] = a_1; + lm++; al+=2; + } + } + } +} + +static void st_dt_matrix_shifted(shtns_cfg shtns, double* mx) +{ + mul_ct_matrix_shifted(shtns, mx); + for (int lm=0; lmli[lm] + 2); // coeff (l+1) + mx[2*lm+1] *= shtns->li[lm]; // coeff (l-1) + } +} + + +/// fill mx with the coefficients for multiplication by cos(theta) +/// \param mx : an array of 2*NLM double that will be filled with the matrix coefficients. +/// xq[lm] = mx[2*lm] * q[lm-1] + mx[2*lm+1] * q[lm+1]; +void mul_ct_matrix(shtns_cfg shtns, double* mx) +{ + long int im,l,lm; + double a_1; + + mul_ct_matrix_shifted(shtns, mx); + for (int lm=2*NLM-1; lm>0; lm--) mx[lm] = mx[lm-1]; // shift back indices (copy, slow) + mx[0] = 0.0; + for (int im=1; im<=MMAX; im++) { // remove the coeff for lmax+1 (for backward compatibility) + int lm = LiM(shtns, im*MRES, im); + mx[2*lm-1] = 0.0; mx[2*lm] = 0.0; + } + mx[2*NLM-1] = 0.0; +} + +/// fill mx with the coefficients of operator sin(theta).d/dtheta +/// \param mx : an array of 2*NLM double that will be filled with the matrix coefficients. +/// stdq[lm] = mx[2*lm] * q[lm-1] + mx[2*lm+1] * q[lm+1]; +void st_dt_matrix(shtns_cfg shtns, double* mx) +{ + mul_ct_matrix(shtns, mx); + for (int lm=0; lmli[lm] - 1; // coeff (l-1) + mx[2*lm+1] *= -(shtns->li[lm] + 2); // coeff (l+1) + } +} + +/// Multiplication of Qlm by a matrix involving l+1 and l-1 only. +/// The result is stored in Rlm, which MUST be different from Qlm. +/// mx is an array of 2*NLM values as returned by \ref mul_ct_matrix or \ref st_dt_matrix +/// compute: Rlm[lm] = mx[2*lm] * Qlm[lm-1] + mx[2*lm+1] * Qlm[lm+1]; +void SH_mul_mx(shtns_cfg shtns, double* mx, cplx *Qlm, cplx *Rlm) +{ + long int nlmlim, lm; + v2d* vq = (v2d*) Qlm; + v2d* vr = (v2d*) Rlm; + nlmlim = NLM-1; + lm = 0; + s2d mxu = vdup(mx[1]); + vr[0] = mxu*vq[1]; + for (lm=1; lm0) { + im = 1; do { + m = im*MRES; + legendre_sphPlm_array(shtns, LTR, im, cost, &yl[m]); + v2d* Ql = (v2d*) &Qlm[LiM(shtns, 0,im)]; // virtual pointer for l=0 and im + v2d vrm0 = vdup(0.0); v2d vrm1 = vdup(0.0); + for (l=m; l0) { + im=1; do { + m = im*MRES; + legendre_sphPlm_deriv_array(shtns, LTR, im, cost, sint, &yl[m], &dtyl[m]); + cplx eimp = 2.*(cos(m*phi) + I*sin(m*phi)); + cplx imeimp = eimp*m*I; + l = LiM(shtns, 0,im); + v2d* Ql = (v2d*) &DrSlm[l]; v2d* Sl = (v2d*) &Slm[l]; + v2d qm = vdup(0.0); + v2d dsdt = vdup(0.0); v2d dsdp = vdup(0.0); + for (l=m; l<=LTR; ++l) { + qm += vdup(yl[l]) * Ql[l]; + dsdt += vdup(dtyl[l]) * Sl[l]; + dsdp += vdup(yl[l]) * Sl[l]; + } + vrm += vcplx_real(qm)*creal(eimp) - vcplx_imag(qm)*cimag(eimp); // dS/dr + vtt += vcplx_real(dsdt)*creal(eimp) - vcplx_imag(dsdt)*cimag(eimp); // dS/dt + vpp += vcplx_real(dsdp)*creal(imeimp) - vcplx_imag(dsdp)*cimag(imeimp); // + I.m/sint *S + } while (++im <= MTR); + vr0 += vrm*sint; + } + *gr = vr0; // Gr = dS/dr + *gt = vtt; // Gt = dS/dt + *gp = vpp; // Gp = I.m/sint *S +} + +/// Evaluate vector SH representation \b Qlm at physical point defined by \b cost = cos(theta) and \b phi +void SHqst_to_point(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double cost, double phi, + double *vr, double *vt, double *vp) +{ + double yl[LMAX+1]; + double dtyl[LMAX+1]; + double vtt, vpp, vr0, vrm; + long int l,m,im; + + const double sint = sqrt((1.-cost)*(1.+cost)); + vtt = 0.; vpp = 0.; vr0 = 0.; vrm = 0.; + m=0; im=0; + legendre_sphPlm_deriv_array(shtns, LTR, im, cost, sint, &yl[m], &dtyl[m]); + for (l=m; l<=LTR; ++l) { + vr0 += yl[l] * creal( Qlm[l] ); + vtt += dtyl[l] * creal( Slm[l] ); + vpp -= dtyl[l] * creal( Tlm[l] ); + } + if (MTR>0) { + im=1; do { + m = im*MRES; + legendre_sphPlm_deriv_array(shtns, LTR, im, cost, sint, &yl[m], &dtyl[m]); + cplx eimp = 2.*(cos(m*phi) + I*sin(m*phi)); + cplx imeimp = eimp*m*I; + l = LiM(shtns, 0,im); + v2d* Ql = (v2d*) &Qlm[l]; v2d* Sl = (v2d*) &Slm[l]; v2d* Tl = (v2d*) &Tlm[l]; + v2d qm = vdup(0.0); + v2d dsdt = vdup(0.0); v2d dtdt = vdup(0.0); + v2d dsdp = vdup(0.0); v2d dtdp = vdup(0.0); + for (l=m; l<=LTR; ++l) { + qm += vdup(yl[l]) * Ql[l]; + dsdt += vdup(dtyl[l]) * Sl[l]; + dtdt += vdup(dtyl[l]) * Tl[l]; + dsdp += vdup(yl[l]) * Sl[l]; + dtdp += vdup(yl[l]) * Tl[l]; + } + vrm += vcplx_real(qm)*creal(eimp) - vcplx_imag(qm)*cimag(eimp); + vtt += (vcplx_real(dtdp)*creal(imeimp) - vcplx_imag(dtdp)*cimag(imeimp)) // + I.m/sint *T + + (vcplx_real(dsdt)*creal(eimp) - vcplx_imag(dsdt)*cimag(eimp)); // + dS/dt + vpp += (vcplx_real(dsdp)*creal(imeimp) - vcplx_imag(dsdp)*cimag(imeimp)) // + I.m/sint *S + - (vcplx_real(dtdt)*creal(eimp) - vcplx_imag(dtdt)*cimag(eimp)); // - dT/dt + } while (++im <= MTR); + vr0 += vrm*sint; + } + *vr = vr0; + *vt = vtt; // Bt = I.m/sint *T + dS/dt + *vp = vpp; // Bp = I.m/sint *S - dT/dt +} +//@} + +#undef LTR +#undef MTR + + +/* + SYNTHESIS AT A GIVEN LATITUDE + (does not require a previous call to shtns_set_grid) +*/ + +/// synthesis at a given latitude, on nphi equispaced longitude points. +/// vr, vt, and vp arrays must have nphi doubles allocated. +/// It does not require a previous call to shtns_set_grid, but it is NOT thread-safe, +/// unless called with a different shtns_cfg +/// \ingroup local +void SHqst_to_lat(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double cost, + double *vr, double *vt, double *vp, int nphi, int ltr, int mtr) +{ + cplx vst, vtt, vsp, vtp, vrr; + cplx *vrc, *vtc, *vpc; + double* ylm_lat; + double* dylm_lat; + double st_lat; + + if (ltr > LMAX) ltr=LMAX; + if (mtr > MMAX) mtr=MMAX; + if (mtr*MRES > ltr) mtr=ltr/MRES; + if (mtr*2*MRES >= nphi) mtr = (nphi-1)/(2*MRES); + + ylm_lat = shtns->ylm_lat; + if (ylm_lat == NULL) { // alloc memory for Legendre functions ? + ylm_lat = (double *) malloc(sizeof(double)* 2*NLM); + shtns->ylm_lat = ylm_lat; + } + dylm_lat = ylm_lat + NLM; + + st_lat = sqrt((1.-cost)*(1.+cost)); // sin(theta) + if (cost != shtns->ct_lat) { // compute Legendre functions ? + shtns->ct_lat = cost; + for (int m=0,j=0; m<=mtr; ++m) { + legendre_sphPlm_deriv_array(shtns, ltr, m, cost, st_lat, &ylm_lat[j], &dylm_lat[j]); + j += LMAX -m*MRES +1; + } + } + + vrc = (cplx*) fftw_malloc(sizeof(double) * 3*(nphi+2)); + vtc = vrc + (nphi/2+1); + vpc = vtc + (nphi/2+1); + + if (nphi != shtns->nphi_lat) { // compute FFTW plan ? + if (shtns->ifft_lat) fftw_destroy_plan(shtns->ifft_lat); + #ifdef OMP_FFTW + fftw_plan_with_nthreads(1); + #endif + shtns->ifft_lat = fftw_plan_dft_c2r_1d(nphi, vrc, vr, FFTW_ESTIMATE); + shtns->nphi_lat = nphi; + } + + for (int m = 0; mifft_lat,vrc,vr); + fftw_execute_dft_c2r(shtns->ifft_lat,vtc,vt); + fftw_execute_dft_c2r(shtns->ifft_lat,vpc,vp); + fftw_free(vrc); +} + +/// synthesis at a given latitude, on nphi equispaced longitude points. +/// vr arrays must have nphi doubles allocated. +/// It does not require a previous call to shtns_set_grid, but it is NOT thread-safe, +/// unless called with a different shtns_cfg +/// \ingroup local +void SH_to_lat(shtns_cfg shtns, cplx *Qlm, double cost, + double *vr, int nphi, int ltr, int mtr) +{ + cplx vrr; + cplx *vrc; + double* ylm_lat; + double* dylm_lat; + double st_lat; + + if (ltr > LMAX) ltr=LMAX; + if (mtr > MMAX) mtr=MMAX; + if (mtr*MRES > ltr) mtr=ltr/MRES; + if (mtr*2*MRES >= nphi) mtr = (nphi-1)/(2*MRES); + + ylm_lat = shtns->ylm_lat; + if (ylm_lat == NULL) { + ylm_lat = (double *) malloc(sizeof(double)* 2*NLM); + shtns->ylm_lat = ylm_lat; + } + dylm_lat = ylm_lat + NLM; + + st_lat = sqrt((1.-cost)*(1.+cost)); // sin(theta) + if (cost != shtns->ct_lat) { + shtns->ct_lat = cost; + for (int m=0,j=0; m<=mtr; ++m) { + legendre_sphPlm_deriv_array(shtns, ltr, m, cost, st_lat, &ylm_lat[j], &dylm_lat[j]); + j += LMAX -m*MRES +1; + } + } + + vrc = (cplx*) fftw_malloc(sizeof(double) * (nphi+2)); + + if (nphi != shtns->nphi_lat) { + if (shtns->ifft_lat) fftw_destroy_plan(shtns->ifft_lat); + #ifdef OMP_FFTW + fftw_plan_with_nthreads(1); + #endif + shtns->ifft_lat = fftw_plan_dft_c2r_1d(nphi, vrc, vr, FFTW_ESTIMATE); + shtns->nphi_lat = nphi; + } + + for (int m = 0; mifft_lat,vrc,vr); + fftw_free(vrc); +} + + + + +// SPAT_CPLX transform indexing scheme: +// if (l<=MMAX) : l*(l+1) + m +// if (l>=MMAX) : l*(2*mmax+1) - mmax*mmax + m = mmax*(2*l-mmax) + l+m +///\internal +void SH_2real_to_cplx(shtns_cfg shtns, cplx* Rlm, cplx* Ilm, cplx* Zlm) +{ + // combine into complex coefficients + unsigned ll = 0; + unsigned lm = 0; + for (unsigned l=0; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + Zlm[ll] = creal(Rlm[lm]) + I*creal(Ilm[lm]); // m=0 + lm++; + } + for (unsigned m=1; m<=MMAX; m++) { + ll = (m-1)*m; + for (unsigned l=m; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + cplx rr = Rlm[lm]; + cplx ii = Ilm[lm]; + Zlm[ll+m] = rr + I*ii; // m>0 + rr = conj(rr) + I*conj(ii); // m<0, m even + if (m&1) rr = -rr; // m<0, m odd + Zlm[ll-m] = rr; + lm++; + } + } +} + +///\internal +void SH_cplx_to_2real(shtns_cfg shtns, cplx* Zlm, cplx* Rlm, cplx* Ilm) +{ + // extract complex coefficients corresponding to real and imag + unsigned ll = 0; + unsigned lm = 0; + for (unsigned l=0; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + Rlm[lm] = creal(Zlm[ll]); // m=0 + Ilm[lm] = cimag(Zlm[ll]); + lm++; + } + double half_parity = 0.5; + for (unsigned m=1; m<=MMAX; m++) { + ll = (m-1)*m; + half_parity = -half_parity; // (-1)^m * 0.5 + for (unsigned l=m; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + cplx b = Zlm[ll-m] * half_parity; // (-1)^m for m negative. + cplx a = Zlm[ll+m] * 0.5; + Rlm[lm] = (conj(b) + a); // real part + Ilm[lm] = (conj(b) - a)*I; // imag part + lm++; + } + } +} + + +/// complex scalar transform. +/// in: complex spatial field z. +/// out: alm[LM(shtns,l,m)] is the SH coefficients of order l and degree m (with -l <= m <= l) +/// for a total of nlm_cplx_calc(lmax,mmax,mres) coefficients. +void spat_cplx_to_SH(shtns_cfg shtns, cplx *z, cplx *alm) +{ + const long int nspat = shtns->nspat; + cplx *rlm, *ilm, *Q, *mem; + + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + mem = (cplx*) VMALLOC( (nspat+2*NLM)*sizeof(cplx) ); + rlm = mem + nspat; + ilm = rlm + NLM; + + Q = z; + if (NPHI>1) { + if (shtns->fftc_mode != 0) Q = mem; // out-of-place transform + fftw_execute_dft(shtns->fft_cplx, z, Q); + } + + const double norm = 1.0/NPHI; + #pragma omp parallel for schedule(static,1) num_threads(shtns->nthreads) + for (int m=0; m<=MMAX; m++) { + if (m==0) { // m=0 + spat_to_SH_ml(shtns, 0, Q, rlm, LMAX); // real + spat_to_SH_ml(shtns, 0, (cplx*)(((double*)Q)+1), ilm, LMAX); // imag + int lm = 0; + int ll = 0; + for (int l=0; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + alm[ll] = (creal(rlm[lm]) + I*creal(ilm[lm]))*norm; // m=0 + lm++; + } + } else { + long lm = LM(shtns,m,m); + spat_to_SH_ml(shtns, m, Q + (NPHI-m)*NLAT, rlm + lm, LMAX); // m>0 + spat_to_SH_ml(shtns, m, Q + m*NLAT, ilm + lm, LMAX); // m<0 + int ll = (m-1)*m; + for (int l=m; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + cplx rr = rlm[lm]; // +m + cplx ii = ilm[lm]; // -m + alm[ll+m] = rr*norm; + if (m&1) ii = -ii; // m<0, m odd + alm[ll-m] = ii*norm; + lm++; + } + } + } + + VFREE(mem); +} + +/// complex scalar transform. +/// in: alm[LM_cplx(shtns,l,m)] is the SH coefficients of order l and degree m (with -l <= m <= l) +/// for a total of nlm_cplx_calc(lmax,mmax,mres) coefficients. +/// out: complex spatial field z. +void SH_to_spat_cplx(shtns_cfg shtns, cplx *alm, cplx *z) +{ + const long int nspat = shtns->nspat; + cplx *rlm, *ilm, *Q, *mem; + + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + mem = (cplx*) VMALLOC( 2*(nspat + NLM*2)*sizeof(double) ); + rlm = mem + nspat; + ilm = rlm + NLM; + + Q = z; + if ((NPHI>1) && (shtns->fftc_mode != 0)) Q = mem; // out-of-place transform + + #pragma omp parallel for schedule(static,1) num_threads(shtns->nthreads) + for (int m=0; m<=MMAX; m++) { + if (m==0) { // m=0 + int lm = 0; + int ll = 0; + for (int l=0; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + rlm[lm] = creal(alm[ll]); + ilm[lm] = cimag(alm[ll]); + lm++; + } + cplx tmp[NLAT] SSE; + SH_to_spat_ml(shtns, 0, rlm, Q, LMAX); + SH_to_spat_ml(shtns, 0, ilm, tmp, LMAX); + for (int it=0; itMMAX with zeros! + for (long i=(MMAX+1)*NLAT; i<(NPHI-MMAX)*NLAT; i++) Q[i] = 0.0; + } else { + long lm = LM(shtns,m,m); + int ll = (m-1)*m; + for (int l=m; l<=LMAX; l++) { // gather from cplx rep + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + cplx rr = alm[ll+m]; // +m + cplx ii = alm[ll-m]; // -m + if (m&1) ii = -ii; // m<0, m odd + rlm[lm] = rr; + ilm[lm] = ii; + lm++; + } + lm = LM(shtns,m,m); + SH_to_spat_ml(shtns, m, rlm + lm, Q + m*NLAT, LMAX); // m>0 + SH_to_spat_ml(shtns, m, ilm + lm, Q + (NPHI-m)*NLAT, LMAX); // m<0 + } + } + + if (NPHI>1) fftw_execute_dft(shtns->ifft_cplx, Q, z); + VFREE(mem); +} + + + +/// complex vector transform (2D). +/// in: slm, tlm are the spheroidal/toroidal SH coefficients of order l and degree m (with -l <= m <= l) +/// out: zt, zp are respectively the theta and phi components of the complex spatial vector field. +void SHsphtor_to_spat_cplx(shtns_cfg shtns, cplx *slm, cplx *tlm, cplx *zt, cplx *zp) +{ + const long int nspat = shtns->nspat; + cplx *zzt, *zzp, *mem, *stlm; + + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + mem = (cplx*) VMALLOC( 4*(nspat + NLM*2)*sizeof(double) ); + stlm = mem + 2*nspat; + + zzt = zt; zzp = zp; + if ((NPHI>1) && (shtns->fftc_mode != 0)) { zzt = mem; zzp = mem + nspat; } // out-of-place transform + + #pragma omp parallel for schedule(static,1) num_threads(shtns->nthreads) + for (int m=0; m<=MMAX; m++) { + const long stride = LMAX+1-m; + if (m==0) { // m=0 + int lm = 0; + int ll = 0; + for (int l=0; l<=LMAX; l++) { // gather from cplx rep + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + stlm[lm] = creal(slm[ll]); + stlm[lm+2*stride] = cimag(slm[ll]); + stlm[lm+stride] = creal(tlm[ll]); + stlm[lm+3*stride] = cimag(tlm[ll]); + lm++; + } + cplx tt[NLAT] SSE; + cplx pp[NLAT] SSE; + SHsphtor_to_spat_ml(shtns, 0, stlm, stlm+stride, zzt, zzp, LMAX); + SHsphtor_to_spat_ml(shtns, 0, stlm+2*stride, stlm+3*stride, tt, pp, LMAX); + for (int it=0; itMMAX with zeros! + for (long i=(MMAX+1)*NLAT; i<(NPHI-MMAX)*NLAT; i++) { + zzt[i] = 0.0; zzp[i] = 0.0; + } + } else { + long lm = 4 * LM(shtns,m,m); + int ll = (m-1)*m; + for (int l=m; l<=LMAX; l++) { // gather from cplx rep + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + cplx sr = slm[ll+m]; // +m + cplx si = slm[ll-m]; // -m + cplx tr = tlm[ll+m]; // +m + cplx ti = tlm[ll-m]; // -m + if (m&1) { // m<0, m odd + si = -si; + ti = -ti; + } + stlm[lm] = sr; stlm[lm+2*stride] = si; + stlm[lm+stride] = tr; stlm[lm+3*stride] = ti; + lm++; + } + lm = 4 * LM(shtns,m,m); + SHsphtor_to_spat_ml(shtns, m, stlm+lm, stlm+stride+lm, zzt + m*NLAT, zzp + m*NLAT, LMAX); // m>0 + SHsphtor_to_spat_ml(shtns, -m, stlm+2*stride+lm, stlm+3*stride+lm, zzt + (NPHI-m)*NLAT, zzp + (NPHI-m)*NLAT, LMAX); // m<0 + } + } + + if (NPHI>1) { + fftw_execute_dft(shtns->ifft_cplx, zzt, zt); + fftw_execute_dft(shtns->ifft_cplx, zzp, zp); + } + VFREE(mem); +} + + +/// complex vector transform (2D). +/// zt,zp: theta,phi components of the complex spatial vector field. +/// out: slm[LM_cplx(l,m)] and tlm[LM_cplx(l,m)] are the SH coefficients of order l and degree m (with -l <= m <= l) +/// for a total of shtns->nlm_cplx = nlm_cplx_calc(lmax, mmax, mres) coefficients. +void spat_cplx_to_SHsphtor(shtns_cfg shtns, cplx *zt, cplx *zp, cplx *slm, cplx *tlm) +{ + const long int nspat = shtns->nspat; + cplx *zzt, *zzp, *mem, *stlm; + + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + mem = (cplx*) VMALLOC( (2*nspat + NLM*4)*sizeof(cplx) ); + stlm = mem + 2*nspat; + + zzt = zt; zzp = zp; + if (NPHI>1) { + if (shtns->fftc_mode != 0) { + zzt = mem; zzp = mem + nspat; // out-of-place transform + } + fftw_execute_dft(shtns->fft_cplx, zt, zzt); + fftw_execute_dft(shtns->fft_cplx, zp, zzp); + } + + const double norm = 1.0/NPHI; + #pragma omp parallel for schedule(static,1) num_threads(shtns->nthreads) + for (int m=0; m<=MMAX; m++) { + const long stride = LMAX+1-m; + if (m==0) { // m=0 + spat_to_SHsphtor_ml(shtns, 0, zzt, zzp, stlm, stlm+stride, LMAX); // real + spat_to_SHsphtor_ml(shtns, 0, (cplx*)(((double*)zzt)+1), (cplx*)(((double*)zzp)+1), stlm+2*stride, stlm+3*stride, LMAX); // imag + int lm = 0; + int ll = 0; + for (int l=0; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + slm[ll] = (creal(stlm[lm]) + I*creal(stlm[lm+2*stride]))*norm; // m=0 + tlm[ll] = (creal(stlm[lm+stride]) + I*creal(stlm[lm+3*stride]))*norm; // m=0 + lm++; + } + } else { + long lm = 4 * LM(shtns,m,m); + spat_to_SHsphtor_ml(shtns, m, zzt + (NPHI-m)*NLAT, zzp + (NPHI-m)*NLAT, stlm+lm, stlm+lm+stride, LMAX); // m>0 + spat_to_SHsphtor_ml(shtns, -m, zzt + m*NLAT, zzp + m*NLAT, stlm+lm+2*stride, stlm+lm+3*stride, LMAX); // m<0 + int ll = (m-1)*m; + for (int l=m; l<=LMAX; l++) { + ll += (l<=MMAX) ? 2*l : 2*MMAX+1; + cplx sr = stlm[lm]; // +m + cplx tr = stlm[lm+stride]; // +m + cplx si = stlm[lm+2*stride]; // -m + cplx ti = stlm[lm+3*stride]; // -m + slm[ll+m] = sr*norm; + tlm[ll+m] = tr*norm; + if (m&1) { si = -si; ti = -ti; } // m<0, m odd + slm[ll-m] = si*norm; + tlm[ll-m] = ti*norm; + lm++; + } + } + } + + VFREE(mem); +} + +/// complex vector transform (3D). +/// in: zr,zt,zp are the r,theta,phi components of the complex spatial vector field. +/// out: {qlm,slm,tlm}[LM_cplx(l,m)] are the SH coefficients of order l and degree m (with -l <= m <= l) +void spat_cplx_to_SHqst(shtns_cfg shtns, cplx *zr, cplx *zt, cplx *zp, cplx *qlm, cplx *slm, cplx *tlm) +{ + spat_cplx_to_SH(shtns, zr, qlm); + spat_cplx_to_SHsphtor(shtns, zt,zp, slm,tlm); +} + +/// complex vector transform (3D). +/// in: {qlm,slm,tlm}[LM_cplx(l,m)] are the SH coefficients of order l and degree m (with -l <= m <= l) +/// out: zr,zt,zp: r,theta,phi components of the complex spatial vector field. +void SHqst_to_spat_cplx(shtns_cfg shtns, cplx *qlm, cplx *slm, cplx *tlm, cplx *zr, cplx *zt, cplx *zp) +{ + SH_to_spat_cplx(shtns, qlm, zr); + SHsphtor_to_spat_cplx(shtns, slm,tlm, zt,zp); +} + + + +void SH_cplx_Xrotate90(shtns_cfg shtns, cplx *Qlm, cplx *Rlm) +{ + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + cplx* rlm = (cplx*) VMALLOC( NLM*2*sizeof(cplx) ); + cplx* ilm = rlm + NLM; + + // extract complex coefficients corresponding to real and imag + SH_cplx_to_2real(shtns, Qlm, rlm, ilm); + + // perform two real rotations: + SH_Xrotate90(shtns, rlm, rlm); + SH_Xrotate90(shtns, ilm, ilm); + + // combine back into complex coefficients + SH_2real_to_cplx(shtns, rlm, ilm, Rlm); + + VFREE(rlm); +} + +void SH_cplx_Yrotate90(shtns_cfg shtns, cplx *Qlm, cplx *Rlm) +{ + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + cplx* rlm = (cplx*) VMALLOC( NLM*2*sizeof(cplx) ); + cplx* ilm = rlm + NLM; + + // extract complex coefficients corresponding to real and imag + SH_cplx_to_2real(shtns, Qlm, rlm, ilm); + + // perform two real rotations: + SH_Yrotate90(shtns, rlm, rlm); + SH_Yrotate90(shtns, ilm, ilm); + + // combine back into complex coefficients + SH_2real_to_cplx(shtns, rlm, ilm, Rlm); + + VFREE(rlm); +} + +/// complex scalar rotation around Y +/// in: Qlm[l*(l+1)+m] is the SH coefficients of order l and degree m (with -l <= m <= l) +/// out: Qlm[l*(l+1)+m] is the rotated SH coefficients of order l and degree m (with -l <= m <= l) +void SH_cplx_Yrotate(shtns_cfg shtns, cplx *Qlm, double alpha, cplx *Rlm) +{ + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + cplx* rlm = (cplx*) VMALLOC( NLM*2*sizeof(cplx) ); + cplx* ilm = rlm + NLM; + + // extract complex coefficients corresponding to real and imag + SH_cplx_to_2real(shtns, Qlm, rlm, ilm); + + // perform two real rotations: + SH_Yrotate(shtns, rlm, alpha, rlm); + SH_Yrotate(shtns, ilm, alpha, ilm); + + // combine back into complex coefficients + SH_2real_to_cplx(shtns, rlm, ilm, Rlm); + + VFREE(rlm); +} + +/// complex scalar rotation around Z +/// in: Qlm[l*(l+1)+m] is the SH coefficients of order l and degree m (with -l <= m <= l) +/// out: Qlm[l*(l+1)+m] is the rotated SH coefficients of order l and degree m (with -l <= m <= l) +void SH_cplx_Zrotate(shtns_cfg shtns, cplx *Qlm, double alpha, cplx *Rlm) +{ + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + // alloc temporary fields + cplx* rlm = (cplx*) VMALLOC( NLM*2*sizeof(cplx) ); + cplx* ilm = rlm + NLM; + + // extract complex coefficients corresponding to real and imag + SH_cplx_to_2real(shtns, Qlm, rlm, ilm); + + // perform two real rotations: + SH_Zrotate(shtns, rlm, alpha, rlm); + SH_Zrotate(shtns, ilm, alpha, ilm); + + // combine back into complex coefficients + SH_2real_to_cplx(shtns, rlm, ilm, Rlm); + + VFREE(rlm); +} + +/* +/// Rotate a SH representation of complex field Qlm around the z-axis by angle alpha (in radians), +/// which is the same as rotating the reference frame by angle -alpha. +/// Result is stored in Rlm (which can be the same array as Qlm). +void SH_cplx_Zrotate(shtns_cfg shtns, cplx *Qlm, double alpha, cplx *Rlm) +{ + if (MRES != 1) shtns_runerr("complex SH requires mres=1."); + + cplx* eima = (cplx*) VMALLOC( (2*MMAX+1)*sizeof(cplx) ); + eima += MMAX; + eima[0] = 1.0; + for (int m=1; m<=MMAX; m++) { // precompute the complex numbers + double cma = cos(m*alpha); + double sma = sin(m*alpha); + eima[m] = cma - I*sma; + eima[-m] = cma + I*sma; + } + + unsigned ll=0; + for (unsigned l=0; l<=MMAX; l++) { + for (int m=-l; m<=l; m++) { + Rlm[ll] = Qlm[ll] * eima[m]; + ll++; + } + } + for (unsigned l=MMAX+1; l<=LMAX; l++) { + for (int m=-MMAX; m<=MMAX; m++) { + Rlm[ll] = Qlm[ll] * eima[m]; + ll++; + } + } + + VFREE(eima); +} +*/ + +/* +void SH_to_spat_grad(shtns_cfg shtns, cplx *alm, double *gt, double *gp) +{ + double *mx; + cplx *blm, *clm; + + blm = (cplx*) VMALLOC( 3*NLM*sizeof(cplx) ); + clm = blm + NLM; + mx = (double*)(clm + NLM); + + st_dt_matrix(shtns, mx); + SH_mul_mx(shtns, mx, alm, blm); + int lm=0; + for (int im=0; im<=MMAX; im++) { + int m = im*MRES; + for (int l=m; l<=LMAX; l++) { + clm[lm] = alm[lm] * I*m; + lm++; + } + } + SH_to_spat(shtns, blm, gt); + SH_to_spat(shtns, clm, gp); + for (int ip=0; ipst[it]; + gp[ip*NLAT+it] /= shtns->st[it]; + } + } + VFREE(blm); +} +*/ + + + + +//* GUMEROV's algorithm to generate the Wigner-d matrices describing rotation of Spherical Harmonics +//* see https://arxiv.org/abs/1403.7698 or https://doi.org/10.1007/978-3-319-13230-3_5 +//* Thanks to Alex J. Yuffa, ayuffa@gmail.com for his suggestions and help. + +struct shtns_rot_ { // describe a rotation matrix + shtns_cfg sht; + int lmax, mmax; + int flag_alpha_gamma; + double cos_beta, sin_beta; + double alpha, beta, gamma; // Euler angles, in ZYZ convention + double* plm_beta; + cplx eia; + cplx eig; +}; + +/// Allocate memory and precompute some recurrence coefficients for rotation (independent of angle). +/// Setting mmax < lmax will result in approximate rotations if not aligned with the z-axis, while mmax=lmax leads to exact rotations. +shtns_rot shtns_rotation_create(const int lmax, const int mmax) +{ + shtns_rot r = (shtns_rot) malloc(sizeof(struct shtns_rot_)); + r->lmax = lmax; + r->mmax = mmax; + r->plm_beta = (double*) malloc( sizeof(double) * nlm_calc(lmax+1, lmax+1, 1) ); + r->sht = shtns_create(lmax+1, lmax+1, 1, sht_for_rotations | SHT_NO_CS_PHASE); // need SH up to lmax+1, with Schmidt semi-normalization. + r->alpha = 0.0; + r->beta = 0.0; + r->gamma = 0.0; + r->eia = 0; r->eig = 0; + r->flag_alpha_gamma = 0; // mark alpha and gamma as zero + return r; +} + +void shtns_rotation_destroy(shtns_rot r) +{ + if (r) { + shtns_destroy(r->sht); + if (r->plm_beta) free(r->plm_beta); + free(r); + } +} + +static cplx special_eiphi(const double phi) +{ + cplx eip; + if (phi == 0.0) { + eip = 1.0; + } else if (phi == M_PI) { + eip = -1.0; + } else if ((phi == M_PI/2) || (phi == M_PI_2)) { + eip = I; + } else if ((phi == 3*M_PI/2) || (phi == -M_PI/2) || (phi == -M_PI_2)) { + eip = -I; + } else if ((phi == M_PI/4) || (phi == M_PI_4)) { + eip = sqrt(0.5) + I*sqrt(0.5); + } else if (phi == M_PI/3) { + eip = 0.5 + I*sqrt(3)*0.5; + } else { + eip = cos(phi) + I*sin(phi); + } + return eip; +} + +/// Set the rotation angle, and compute associated Legendre functions. +void shtns_rotation_set_angles_ZYZ(shtns_rot r, double alpha, double beta, double gamma) +{ + if ((beta < 0) || (beta > M_PI)) { + printf("ERROR: angle must be between 0 and pi\n"); + exit(1); + } + + if (beta == 0.0) { + alpha += gamma; + gamma = 0.0; + } + + // step 0 : compute plm(beta) + const double cos_beta = cos(beta); //((beta == M_PI_2)||(beta == M_PI/2)) ? 0.0 : cos(beta); + r->cos_beta = cos_beta; + r->sin_beta = sqrt((1.-cos_beta)*(1.+cos_beta)); + r->eia = special_eiphi(alpha); + r->eig = special_eiphi(gamma); + r->alpha = alpha; + r->beta = beta; + r->gamma = gamma; + r->flag_alpha_gamma = (alpha != 0) + 2*(gamma != 0); + const int lmax = r->lmax + 1; // need SH up to lmax+1. + #pragma omp parallel + { + if (beta != 0.0) { + #pragma omp for schedule(dynamic) nowait + for (int m=0; m<=lmax; m++) { + const long ofs = m*(lmax+2) - (m*(m+1))/2; + legendre_sphPlm_array(r->sht, lmax, m, cos_beta, r->plm_beta + ofs); + } + } + } + +} + +void shtns_rotation_set_angles_ZXZ(shtns_rot r, double alpha, double beta, double gamma) +{ + shtns_rotation_set_angles_ZYZ(r, alpha-M_PI/2, beta, gamma+M_PI/2); +} + +void shtns_rotation_set_angle_axis(shtns_rot r, double theta, double Vx, double Vy, double Vz) +{ + if ((Vx==0) && (Vy==0)) { // rotation along Z-axis + if (Vz<0) theta = -theta; + shtns_rotation_set_angles_ZYZ(r, theta, 0, 0); + } else { + // 1) convert to normalized quaternion representation (c, Vx, Vy, Vz). See https://en.wikipedia.org/wiki/Versor + double s = sin(0.5*theta); + double c = cos(0.5*theta); + double n = s / sqrt(Vx*Vx + Vy*Vy + Vz*Vz); + Vx *= n; Vy *= n; Vz *= n; + + // 2) convert from quaternion to euler angle ZXZ: + double beta = acos( 1.0 - 2.0*(Vx*Vx + Vy*Vy) ); // = acos( c*c + Vz*Vz - (Vx*Vx + Vy*Vy) ); + double Vxz = Vx*Vz; + double Vyz = Vy*Vz; + double cVx = c*Vx; + double cVy = c*Vy; + double alpha = atan2( Vxz + cVy, cVx - Vyz ); + double gamma = atan2( Vxz - cVy, cVx + Vyz ); + + shtns_rotation_set_angles_ZXZ(r, alpha, beta, gamma); + } +} + +/// lw is the line-width. Use lw=2*l+1 for the full matrix, or l+1 for a compressed matrix. +/// It always has 2*l+1 lines. +void quarter_wigner_d_matrix(shtns_rot r, const int l, double* mx, const int compressed) +{ + if (l > r->lmax) { + printf("ERROR: l <= lmax not satified.\n"); + exit(1); + } + + const int lmax = r->lmax + 1; + const double cos_beta = r->cos_beta; + const double sin_beta = r->sin_beta; + const double* const plm_beta = r->plm_beta; + + const int lw = (compressed) ? l+1 : 2*l+1; + // shift mx to index by negative values: + mx += l*lw + l*(compressed==0); + + mx[0] = plm_beta[l]; // d(m'=0, m=0) + // step 2+3: d(m'=0,m) and d(m'=1,m) + double cb_p1 = (1. + cos_beta)*0.5; + double cb_m1 = (1. - cos_beta)*0.5; + const double d_1 = 1.0/((l)*(l+1.)); + for (int m=1; m<=l; m++) { + const long ofs_m = m*(lmax+2) - (m*(m+1))/2; + const long ofs_mm1 = (m-1)*(lmax+2) - ((m-1)*m)/2; + const long ofs_mp1 = (m+1)*(lmax+2) - ((m+1)*(m+2))/2; + mx[m] = plm_beta[ofs_m + (l-m)]; // m'=0 : copy plm values (eq 32) + + double a = sqrt( ((l+1+m)*(l+1-m)) * d_1 ) * sin_beta; + double b1 = sqrt( ((l-m+1)*(l-m+2)) * d_1 ) * cb_p1; + double b2 = sqrt( ((l+m+1)*(l+m+2)) * d_1 ) * cb_m1; + mx[lw + m] = b2*plm_beta[ofs_mp1 + (l+1)-(m+1)] + b1*plm_beta[ofs_mm1 + (l+1)-(m-1)] + a*plm_beta[ofs_m + (l+1)-m]; // m'=1 (eq 105) + } + + double clm[l+1]; // temporary array holding clm + for (int m=0; m r->lmax) { + printf("ERROR: l <= lmax not satisfied.\n"); + exit(1); + } + + quarter_wigner_d_matrix(r, l, mx, 0); // generate quarter of wigner-d matrix (but full storage) + + // shift mx to index by negative values: + mx += l*(2*l+1) + l; + + // step 6: fill matrix using symmetries + for (int m=1; m<=l; m++) { // diagonals + mx[(2*l+1)*m + -m] = mx[(2*l+1)*(-m) + m]; + mx[(2*l+1)*(-m) - m] = mx[(2*l+1)*m + m]; + } + for (int mp=-l+1; mplmax; + + Rlm[0] = Zlm[0]; // copy l=0 + + #pragma omp for schedule(dynamic) + for (int l=1; l<=lmax; l++) { + const int lw = l+1; // line width of compressed matrix. + double* mx0 = (double*) malloc( sizeof(double) * (2*l+1)*lw ); + memset(mx0, 0, sizeof(double)*(2*l+1)*lw); + + quarter_wigner_d_matrix(r, l, mx0, 1); // 1 : compressed matrix (saves memory and time) + const double* mx = mx0 + l*lw; // allow indexing by negative m and m' + + const cplx* zl = Zlm + l*(l+1); + cplx* rl = Rlm + l*(l+1); + // apply the matrix + for (int m=-l; m<=l; m++) { + cplx rm = 0.0; + // only 1/4 of the matrix is read (4 times). + for (int mp=l; mp>=abs(m); mp--) { // third domain (right) : populated. + rm += zl[mp] * mx[m*lw + mp]; + } + if (m<0) { + for (int mp=-m-1; mp>=m; mp--) { // second domain (top) + rm += zl[mp] * mx[-mp*lw - m]; // exchange m and m' and change signs => no parity factor + } + } else { + for (int mp=m-1; mp>=-m; mp-=2) { // second domain (bottom) => always even number of elements + rm -= zl[mp] * mx[mp*lw + m]; // exchange m and m' (negative parity) + rm += zl[mp-1] * mx[(mp-1)*lw + m]; // exchange m and m' (positive parity) + } + } + for (int mp=-abs(m)-1; mp >-l; mp-=2) { // first domain (left) + rm -= zl[mp] * mx[-m*lw - mp]; // change sign of m and m' + rm += zl[mp-1] * mx[-m*lw - (mp-1)]; // change sign of m and m' + } + if ((l+m)&1) { int mp = -l; // boundary condition. + rm -= zl[mp] * mx[-m*lw - mp]; // change sign of m and m' + } + rl[m] = rm; + } + + free(mx0); + } +} +*/ + + +#ifdef _GCC_VEC_ +typedef double rndu __attribute__ ((vector_size (VSIZE2*8), aligned (8))); // UNALIGNED vector that contains a complex number +typedef double v2du __attribute__ ((vector_size (16), aligned (8))); // UNALIGNED vector that contains a complex number +#else +typedef rnd rndu; +typedef v2d v2du; +#endif + +void shtns_rotation_apply_real(shtns_rot r, cplx* Qlm, cplx* Rlm) +{ + const int lmax = r->lmax+1; + const int mmax = r->mmax; + + if (r->beta == 0.0) { // only rotation along Z-axis. + if (Rlm != Qlm) for (int l=0; leia; + cplx eim_alpha = ei_alpha; + for (int m=1; m<=mmax; m++) { + for (int l=m; lcos_beta; + const double sin_beta = r->sin_beta; + const double* const plm_beta = r->plm_beta; + const int flag_ag = r->flag_alpha_gamma; + + const double cb_p1 = (1. + cos_beta)*0.5; + const double cb_m1 = (1. - cos_beta)*0.5; + + const cplx eia = r->eia; + const cplx eig = r->eig; + +// cplx* const rl = (cplx*) malloc(sizeof(double) * (4*(l+1) + 5*lw +2)); // 2 real temp array 2*(l+1), + 5 lines of storage (lw) + a bit + cplx* const rl = (cplx*) malloc(sizeof(double) * (9*lmax +2)); // 2 real temp array 2*(l+1), + 5 lines of storage (lw) + a bit + + #pragma omp for schedule(dynamic,1) + for (int l=lmax-1; l>0; l--) { + const int lw = l+1; // line width of matrix. + const int mlim = (l <= mmax) ? l : mmax; + cplx* const ql = rl + (l+1); + double* const m0 = (double*) (rl + 2*(l+1)); + memset(rl, 0, sizeof(cplx)*(2*l+1)); // zero the temp destination array. + + // gather all m's for given l of source array: + long lm = l; + ql[0] = creal(Qlm[lm]); // m=0 + if (flag_ag & 1) { // pre-rotate along Z-axis + cplx eima = eia; + for (int m=1; m<=mlim; m++) { + lm += lmax-m; + ql[m] = Qlm[lm] * eima; + eima *= eia; + } + } else { // copy + for (int m=1; m<=mlim; m++) { + lm += lmax-m; + ((v2d*)ql)[m] = ((v2d*)Qlm)[lm]; + } + } + for (int m=mlim+1; m<=l; m++) ql[m] = 0; // zero out m that are absent. + + m0[0] = plm_beta[l]; // d(m'=0, m=0) + m0[lw] = 0.0; // required, as a boundary condition + double r0 = 0.5*creal(ql[0])*m0[0]; // accumulator for rl[0] + + // step 2+3: d(m'=0,m) and d(m'=1,m) + const double d_1 = 1.0/((l)*(l+1.)); + cplx r1 = 0.0; // accumulator for rl[1] + double parity = -1; + long ofs_m = (lmax+2) - 1; // m*(lmax+2) - (m*(m+1))/2 for m=1 + long ofs_mm1 = 0; // m*(lmax+2) - (m*(m+1))/2 for m=0 + for (int m=1; m<=l; m++) { + double H = plm_beta[ofs_m + (l-m)]; // m'=0 : copy plm values (eq 32) + m0[m] = H; + r0 += creal(ql[m]) * H; // right quadrant (m>0) + const double a = sqrt( ((l+1+m)*(l+1-m)) * d_1 ) * sin_beta; + rl[m] += creal(ql[0]) * H*parity; // bottom quadrant (m>0) : exchange m and m' => parity factor + const double b1 = sqrt( ((l-m+1)*(l-m+2)) * d_1 ) * cb_p1; + long ofs_mp1 = (m+1)*(lmax+2) - ((m+1)*(m+2))/2; + const double b2 = sqrt( ((l+m+1)*(l+m+2)) * d_1 ) * cb_m1; + parity = -parity; + H = b2*plm_beta[ofs_mp1 + (l+1)-(m+1)] + b1*plm_beta[ofs_mm1 + (l+1)-(m-1)] + a*plm_beta[ofs_m + (l+1)-m]; // m'=1 (eq 105) + m0[lw+m] = H; // m'=1 + r1 += ql[m] * H; // right quadrant (m>0) + ofs_mm1 = ofs_m; + ofs_m = ofs_mp1; + if (m>1) { // avoid duplicates + rl[m] += ql[1] * H*parity; // bottom quadrant (m>0) : exchange m and m' => parity factor + } + } + rl[0] = r0+r0; + rl[1] += r1; + + double* clm = m0 + 4*lw +1; // array holding clm (size l+2, adressing by m=-1 to l) + clm[-1] = 0.0; + for (int m=0; m overwrite d(m'+2,m) + mx0_[m+1] = H1; // d(m',m) -> overwrite d(m'+2,m) + rmp += ((v2d*)ql)[m] * vdup(H0) + ((v2d*)ql)[m+1] * vdup(H1); // left quadrant, change signs => parity factor + if (m>-mp) { // avoid duplicates + ((v2d*)rl)[m] += zlmp * vdup(H0); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + ((v2d*)rl)[m+1] -= zlmp * vdup(H1); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + if (m==l) { + double H0 = mx0_[m] - c_1 * clm_1 * mx1_1; // eq 108 + mx0_[m] = H0; // d(m',m) -> overwrite d(m'+2,m) + rmp += ((v2d*)ql)[m] * vdup(H0); // left quadrant, change signs => parity factor + if (m>-mp) { // avoid duplicates + ((v2d*)rl)[m] += zlmp * vdup(H0); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + } + #if _GCC_VEC_ + ((v2d*)rl)[-mp] += rmp * conj_parity; + conj_parity = - conj_parity; // switch parity + #else + rl[-mp] += conj(rmp)*(1-2*(mp&1)); // -mp > 0 + #endif + double* t = mx0_; mx0_ = mx1_; mx1_ = t; // cycle the buffers for lines. + } + + // step 4 + 5 merged: recursively compute and apply d(m',m), m'=2..l; m=m'..l AND m'=-2..-l; m=-m'..l + double* mx0 = m0; + double* mx1 = m0 + lw; + for (int mp=2; mp<=l; mp++) { + const double cmp2 = clm[mp-2]; + double clm_1 = clm[mp-1]; + const double c_1 = 1.0/clm_1; + + v2d rmp = vdup(0.0); + v2d zlmp = ((v2d*)ql)[mp]; + v2d rmp_ = vdup(0.0); + #if _GCC_VEC_ + v2d zlmp_ = zlmp * conj_parity; + #else + cplx zlmp_ = conj(zlmp) * (1-2*(mp&1)); + #endif + + int m = mp; + for (; m<=l-(VSIZE2-1); m+=VSIZE2) { + rnd clm_1 = *((rndu*)(clm+m-1)); + rnd clm0 = *((rndu*)(clm+m)); + + rnd mx1_1 = *((rndu*)(mx1+m-1)); + rnd mx11 = *((rndu*)(mx1+m+1)); + + rnd mx1__1 = *((rndu*)(mx1_+m-1)); + rnd mx11_ = *((rndu*)(mx1_+m+1)); + + rnd mx00 = *((rndu*)(mx0+m)); + rnd mx00_ = *((rndu*)(mx0_+m)); + + rnd H = (vall(cmp2) * mx00 + clm_1 * mx1_1 - clm0 * mx11) * vall(c_1); // eq 106 + rnd H_ = (vall(cmp2) * mx00_ - clm_1 * mx1__1 + clm0 * mx11_) * vall(c_1); // eq 108 + *((rndu*)(mx0+m)) = H; + *((rndu*)(mx0_+m)) = H_; + } + /* v2d mx1_1 = *((v2d*)(mx1+mp-1)); + v2d mx1__1 = *((v2d*)(mx1_+mp-1)); + for (; m overwrite d(m'-2,m) + mx0_[m] = H0_; // d(m',m) -> overwrite d(m'+2,m) + } + + m = mp; + for (; m0, mp>0) + rmp_ += ((v2d*)ql)[m] * vdup(H0_) + ((v2d*)ql)[m+1] * vdup(H1_); // left quadrant, change signs => parity factor + if (m>mp) { // avoid duplicates + ((v2d*)rl)[m] += zlmp * vdup(H0) + zlmp_ * vdup(H0_); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + ((v2d*)rl)[m+1] -= zlmp * vdup(H1) + zlmp_ * vdup(H1_); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + if (m==l) { + double H0 = mx0[m]; // d(m',m) -> overwrite d(m'-2,m) + double H0_ = mx0_[m]; // d(m',m) -> overwrite d(m'+2,m) + rmp += ((v2d*)ql)[m] * vdup(H0); //mx[mp*lw + m]; // right quadrant (m>0, mp>0) + rmp_ += ((v2d*)ql)[m] * vdup(H0_); // left quadrant, change signs => parity factor + if (m>mp) { // avoid duplicates + ((v2d*)rl)[m] += zlmp * vdup(H0) + zlmp_ * vdup(H0_); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + } + #if _GCC_VEC_ + ((v2d*)rl)[mp] += rmp + rmp_ * conj_parity; + conj_parity = - conj_parity; // switch parity + #else + rl[mp] += rmp + conj(rmp_)*(1-2*(mp&1)); // -mp > 0 + #endif + double* t = mx0; mx0 = mx1; mx1 = t; // cycle the buffers for lines. + double* t_ = mx0_; mx0_ = mx1_; mx1_ = t_; // cycle the buffers for lines. + } + + // scatter all m's for current l into dest array: + lm = l; + Rlm[lm] = creal(rl[0]); // m=0 + if (flag_ag & 2) { // post-rotate along Z-axis + cplx eimg = eig; + for (int m=1; m<=mlim; m++) { + lm += lmax-m; + Rlm[lm] = rl[m] * eimg; + eimg *= eig; + } + } else { // copy values to dest + for (int m=1; m<=mlim; m++) { + lm += lmax-m; + ((v2d*)Rlm)[lm] = ((v2d*)rl)[m]; + } + } + } + + free(rl); + } +} + +/// rotate Zlm, store the result in Rlm, without ever storing the wigner-d matrices (on-the-fly operation) +void shtns_rotation_apply_cplx(shtns_rot r, cplx* Zlm, cplx* Rlm) +{ + const int lmax = r->lmax+1; + const int mmax = r->mmax; + +// indexing scheme: +// if (l<=MMAX) : l*(l+1) + m +// if (l>=MMAX) : l*(2*mmax+1) - mmax*mmax + m = mmax*(2*l-mmax) + l+m + + if (r->beta == 0.0) { // only rotation along Z-axis. + long lm = 0; + cplx eia = r->eia; + for (int l=0; lcos_beta; + const double sin_beta = r->sin_beta; + const double* const plm_beta = r->plm_beta; + + const double cb_p1 = (1. + cos_beta)*0.5; + const double cb_m1 = (1. - cos_beta)*0.5; + + const int flag_ag = r->flag_alpha_gamma; + const cplx eia = r->eia; + const cplx eig = r->eig; + const int ntmp = 1 + (flag_ag & 1); + +// v2d* rl = (v2d*) malloc(sizeof(double) * (2*ntmp*(2*l+1) + 5*lw +2)); // 1 cplx temp array (2l+1), + 5 lines of storage (lw) + a bit + v2d* const buf = (v2d*) malloc(sizeof(double) * (2*ntmp*(2*lmax-1) + 5*lmax +2)); // 1 cplx temp array (2l+1), + 5 lines of storage (lw) + a bit + + #pragma omp for schedule(dynamic,1) + for (int l=lmax-1; l>0; l--) { + const int lw = l+1; // line width of matrix. + const int mlim = (l <= mmax) ? l : mmax; + const long ll = (l <= mmax) ? l*(l+1) : mmax*(2*l-mmax) + l; + v2d* rl = buf; + double* const m0 = (double*) (buf + ntmp*(2*l+1)); + memset(rl, 0, sizeof(cplx)*(2*l+1)); // zero the temp dest array. + rl += l; // shift pointer to allow indexing by m = -l to l + v2d* zl = (v2d*)Zlm + l*(l+1); // source array, index by mp = -l to l, assumed aligned for sse2 + if (flag_ag & 1) { // pre-rotate arount Z-axis + zl = rl + 2*l+1; + ((cplx*)zl)[0] = Zlm[l*(l+1) + 0]; + cplx eim_alpha = eia; + for (int m=1; m<=mlim; m++) { + ((cplx*)zl)[-m] = Zlm[ll - m] * conj(eim_alpha); + ((cplx*)zl)[m] = Zlm[ll + m] * eim_alpha; + eim_alpha *= eia; + } + } else if (mmax < l) { // we must copy the source to pad it with zeros + zl = rl + 2*l+1; + for (int m=-mmax; m<=mmax; m++) ((cplx*)zl)[m] = Zlm[ll+m]; + } + for (int m=mlim+1; m<=l; m++) { // pad source with zeros + ((cplx*)zl)[-m] = 0; + ((cplx*)zl)[m] = 0; + } + + m0[0] = plm_beta[l]; // d(m'=0, m=0) + m0[lw] = 0.0; // required, as a boundary condition + v2d r0 = zl[0]*vdup(m0[0]); // accumulator for rl[0] + + // step 2+3: d(m'=0,m) and d(m'=1,m) + const double d_1 = 1.0/((l)*(l+1.)); + v2d r1 = vdup(0.0); // accumulator for rl[1] + v2d rm1 = vdup(0.0); // accumulator for rl[-1] + double parity = -1; + long ofs_m = (lmax+2) - 1; // m*(lmax+2) - (m*(m+1))/2 for m=1 + long ofs_mm1 = 0; // m*(lmax+2) - (m*(m+1))/2 for m=0 + for (int m=1; m<=l; m++) { + double H = plm_beta[ofs_m + (l-m)]; // m'=0 : copy plm values (eq 32) + m0[m] = H; + r0 += zl[m] * vdup(H); // right quadrant (m>0) + r0 += zl[-m] * vdup(H*parity); // left quadrant (m<0) : change signs => parity factor + const double a = sqrt( ((l+1+m)*(l+1-m)) * d_1 ) * sin_beta; + rl[-m] += zl[0] * vdup(H); // top quadrant (m<0) : exchange m and m' and change signs => no parity factor + rl[m] += zl[0] * vdup(H*parity); // bottom quadrant (m>0) : exchange m and m' => parity factor + const double b1 = sqrt( ((l-m+1)*(l-m+2)) * d_1 ) * cb_p1; + long ofs_mp1 = (m+1)*(lmax+2) - ((m+1)*(m+2))/2; + const double b2 = sqrt( ((l+m+1)*(l+m+2)) * d_1 ) * cb_m1; + parity = -parity; + H = b2*plm_beta[ofs_mp1 + (l+1)-(m+1)] + b1*plm_beta[ofs_mm1 + (l+1)-(m-1)] + a*plm_beta[ofs_m + (l+1)-m]; // m'=1 (eq 105) + m0[lw+m] = H; + r1 += zl[m] * vdup(H); // right quadrant (m>0) + ofs_mm1 = ofs_m; + rm1 += zl[-m] * vdup(H*parity); // left quadrant: change signs => parity factor + ofs_m = ofs_mp1; + if (m>1) { // avoid duplicates + rl[-m] += zl[-1] * vdup(H); // top quadrant (m<0) : exchange m and m' and change signs => no parity factor + rl[m] += zl[1] * vdup(H*parity); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + } + rl[-1] += rm1; + rl[0] = r0; + rl[1] += r1; + + double* clm = m0 + 4*lw +1; // array holding clm (size l+2, adressing by m=-1 to l) + clm[-1] = 0.0; // also for BC. + for (int m=0; m overwrite d(m'+2,m) + mx0_[m+1] = H1; // d(m',m) -> overwrite d(m'+2,m) + rmp += zl[m] * vdup(H0) + zl[m+1] * vdup(H1); //mx[mp*lw + m]; // right quadrant (m>0, mp<0) + rmmp += zl[-m] * vdup(H0) - zl[-m-1] * vdup(H1); // left quadrant, change signs => parity factor + rl[-m-1] += zlmmp * vdup(H1); // top quadrant (-m<0) : exchange m and m' and change signs => no parity factor + if (m>-mp) { // avoid duplicates + rl[-m] += zlmmp * vdup(H0); // top quadrant (-m<0) : exchange m and m' and change signs => no parity factor + rl[m] += zlmp * vdup(H0); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + rl[m+1] -= zlmp * vdup(H1); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + if(m==l) { + double H0 = mx0_[m] - c_1 * clm_1 * mx1_1; // eq 108 + mx0_[m] = H0; // d(m',m) -> overwrite d(m'+2,m) + rmp += zl[m] * vdup(H0); //mx[mp*lw + m]; // right quadrant (m>0, mp<0) + rmmp += zl[-m] * vdup(H0); // left quadrant, change signs => parity factor + if (m>-mp) { // avoid duplicates + rl[-m] += zlmmp * vdup(H0); // top quadrant (-m<0) : exchange m and m' and change signs => no parity factor + rl[m] += zlmp * vdup(H0); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + } + rl[-mp] += rmmp; + rl[mp] += rmp; + double* t = mx0_; mx0_ = mx1_; mx1_ = t; // cycle the buffers for lines. + } + + // step 4 + 5 merged: recursively compute and apply d(m',m), m'=2..l; m=m'..l AND m'=-2..-l; m=-m'..l + double* mx0 = m0; + double* mx1 = m0 + lw; + for (int mp=2; mp<=l; mp++) { + const double cmp2 = clm[mp-2]; + double clm_1 = clm[mp-1]; + const double c_1 = 1.0/clm_1; + //v2d mx1_1 = *((v2d*)(mx1+mp-1)); + //v2d mx1__1 = *((v2d*)(mx1_+mp-1)); + v2d rmp = vdup(0.0); + v2d rmmp = vdup(0.0); + v2d zlmmp = zl[-mp]; + v2d zlmp = zl[mp]; + int m = mp; + for (; m<=l-(VSIZE2-1); m+=VSIZE2) { + rnd clm_1 = *((rndu*)(clm+m-1)); + rnd clm0 = *((rndu*)(clm+m)); + + rnd mx1_1 = *((rndu*)(mx1+m-1)); + rnd mx11 = *((rndu*)(mx1+m+1)); + + rnd mx1__1 = *((rndu*)(mx1_+m-1)); + rnd mx11_ = *((rndu*)(mx1_+m+1)); + + rnd mx00 = *((rndu*)(mx0+m)); + rnd mx00_ = *((rndu*)(mx0_+m)); + + rnd H = (vall(cmp2) * mx00 + clm_1 * mx1_1 - clm0 * mx11) * vall(c_1); // eq 106 + rnd H_ = (vall(cmp2) * mx00_ - clm_1 * mx1__1 + clm0 * mx11_) * vall(c_1); // eq 108 + //mx1__1 = mx11_; mx1_1 = mx11; + *((rndu*)(mx0+m)) = H; // d(m',m) -> overwrite d(m'-2,m) + *((rndu*)(mx0_+m)) = H_; // d(-m',m) -> overwrite d(-m'+2,m) + } + /* v2d mx1_1 = *((v2du*)(mx1+m-1)); + v2d mx1__1 = *((v2du*)(mx1_+m-1)); + for (; m overwrite d(m'-2,m) + mx0_[m] = H0_; // d(-m',m) -> overwrite d(-m'+2,m) + } + + m = mp; + for (; m0, mp>0) + rmmp += zl[m] * vdup(H0_) + zl[m+1] * vdup(H1_); //mx[mp*lw + m]; // right quadrant (m>0, mp<0) + rmmp += zl[-m] * vdup(H0) - zl[-m-1] * vdup(H1); // left quadrant, change signs => parity factor + rmp += zl[-m] * vdup(H0_) - zl[-m-1] * vdup(H1_); // left quadrant, change signs => parity factor + rl[-m-1] += zlmmp * vdup(H1) + zlmp * vdup(H1_); // top quadrant (m<0) : exchange m and m' and change signs => no parity factor + if (m>mp) { // avoid duplicates + rl[-m] += zlmmp * vdup(H0) + zlmp * vdup(H0_); // top quadrant (m<0) : exchange m and m' and change signs => no parity factor + rl[m] += zlmp * vdup(H0) + zlmmp * vdup(H0_); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + rl[m+1] -= zlmp * vdup(H1) + zlmmp * vdup(H1_); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + if (m==l) { + double H0 = mx0[m]; + double H0_ = mx0_[m]; + rmp += zl[m] * vdup(H0); //mx[mp*lw + m]; // right quadrant (m>0, mp>0) + rmmp += zl[m] * vdup(H0_); //mx[mp*lw + m]; // right quadrant (m>0, mp<0) + rmmp += zl[-m] * vdup(H0); // left quadrant, change signs => parity factor + rmp += zl[-m] * vdup(H0_); // left quadrant, change signs => parity factor + if (m>mp) { // avoid duplicates + rl[-m] += zlmmp * vdup(H0) + zlmp * vdup(H0_); // top quadrant (m<0) : exchange m and m' and change signs => no parity factor + rl[m] += zlmp * vdup(H0) + zlmmp * vdup(H0_); // bottom quadrant (m>0) : exchange m and m' => parity factor + } + } + rl[-mp] += rmmp; + rl[mp] += rmp; + double* t = mx0; mx0 = mx1; mx1 = t; // cycle the buffers for lines. + double* t_ = mx0_; mx0_ = mx1_; mx1_ = t_; // cycle the buffers for lines. + } + + if (flag_ag & 2) { // apply post-rotation along Z-axis. + Rlm[ll + 0] = ((cplx*)rl)[0]; + cplx eim_gamma = eig; + for (int m=1; m<=mlim; m++) { + Rlm[ll - m] = ((cplx*)rl)[-m] * conj(eim_gamma); + Rlm[ll + m] = ((cplx*)rl)[m] * eim_gamma; + eim_gamma *= eig; + } + } else { + memcpy(Rlm + ll-mlim, rl-mlim, sizeof(cplx)*(2*mlim+1)); // copy to destination (avoid false sharing when doing openmp). + } + } + + free(buf); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_gpu.cu b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_gpu.cu new file mode 100644 index 000000000..8e58b9e5e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_gpu.cu @@ -0,0 +1,1429 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/* NOTES: + * - the cuda transforms are NOT thread-safe. Use cushtns_clone() to clone transforms for each thread. +*/ + +/* TODO + * 0) DYNAMIC THREADS/BLOCK, computed on init. + * 1) use static polar optimization (from constant memory ?) + * 2) use a for loop in m-direction to re-use threads at larger m's ? + * 3) implement FFT on host versions. otpimize data transfer (don't transfer zeros): store as complex2real fft ? + * 4) allow several variants, which may change occupancy for large sizes ? + * 5) generalize NFIELDS to all kernels + * 6) find optimal threads/block for minor kernels too (e.g. sphtor2scal) + * 7) try to use transposed fft, to see if it is faster than my own FFT + transpose... => No, it's not. + */ + +/* Session with S. Chauveau from nvidia: + * useful metrics = achieved_occupancy, cache_hit + * for leg_m_lowllim, the "while(l DONE + * 1) reduce pointer update by moving ql and al updates into the "if" statement. => DONE + * 2a) try to use a double-buffer (indexed by b, switched by b=1-b) => only 1 __syncthread() instead of 2. + * OR: 2b) preload al, ql into registers => may reduce the waiting at __syncthreads() + * 3) unroll by hand the while loop (with an inner-loop of fixed size) => DONE + * 4) introduce NWAY (1 to 4) to avoid the need of several blocks in theta => one block for all means al, ql are read only once! => DONE + * => increases register pressure, but may be OK ! + */ + +// NOTE variables gridDim.x, blockIdx.x, blockDim.x, threadIdx.x, and warpSize are defined in device functions +/* NOTE: + * KEPLER PASCAL + * cache-line: 128 bytes (16 doubles) + * + * fetching 1 double/thread: 2 requests/warp + */ + +#include "sht_private.h" + +/// Maximum number of threads per block that should be used. +#define MAX_THREADS_PER_BLOCK 512 +/// The warp size is always 32 on cuda devices (up to Pascal at least) +#define WARPSZE 32 + +#include "sht_gpu_kernels.cu" + +enum cushtns_flags { CUSHT_OFF=0, CUSHT_ON=1, CUSHT_OWN_COMP_STREAM=2, CUSHT_OWN_XFER_STREAM=4}; +enum cushtns_fft_mode { CUSHT_NOFFT, CUSHT_FFT_THETA_CONTIGUOUS, CUSHT_FFT_TRANSPOSE }; + +/* TOOL FUNCTIONS */ + +extern "C" +void* shtns_malloc(size_t size) { + void* ptr = NULL; + cudaError_t err = cudaSuccess; + err = cudaMallocHost(&ptr, size); // try to allocate pinned memory (for faster transfers !) + if (err != cudaSuccess) { + ptr = VMALLOC(size); // return regular memory instead... + } + return ptr; +} + +extern "C" +void shtns_free(void* p) { + cudaFreeHost(p); +} + +void memzero_omp(double* mem, const size_t sze) +{ + #ifdef _OPENMP + #pragma omp parallel + { + int i = omp_get_thread_num(); + int n = omp_get_num_threads(); + int ofs = (i*sze)/n; + memset(mem + ofs, 0, ((i+1)*sze/n - ofs)*sizeof(double)); + } + #else + memset(mem, 0, sze*sizeof(double)); + #endif +} + +void memzero_omp(double* mem, double* mem2, const size_t sze) +{ + #ifdef _OPENMP + #pragma omp parallel + { + int i = omp_get_thread_num(); + int n = omp_get_num_threads(); + int ofs = (i*sze)/n; + memset(mem + ofs, 0, ((i+1)*sze/n - ofs)*sizeof(double)); + memset(mem2 + ofs, 0, ((i+1)*sze/n - ofs)*sizeof(double)); + } + #else + memset(mem, 0, sze*sizeof(double)); + memset(mem2, 0, sze*sizeof(double)); + #endif +} + +void memzero_omp(double* mem, double* mem2, double* mem3, const size_t sze) +{ + #ifdef _OPENMP + #pragma omp parallel + { + int i = omp_get_thread_num(); + int n = omp_get_num_threads(); + int ofs = (i*sze)/n; + memset(mem + ofs, 0, ((i+1)*sze/n - ofs)*sizeof(double)); + memset(mem2 + ofs, 0, ((i+1)*sze/n - ofs)*sizeof(double)); + memset(mem3 + ofs, 0, ((i+1)*sze/n - ofs)*sizeof(double)); + } + #else + memset(mem, 0, sze*sizeof(double)); + memset(mem2, 0, sze*sizeof(double)); + memset(mem3, 0, sze*sizeof(double)); + #endif +} + + + +extern "C" +void cushtns_release_gpu(shtns_cfg shtns) +{ + // TODO: arrays possibly shared between different shtns_cfg should be deallocated ONLY if not used by other shtns_cfg. + if (shtns->nphi > 1) cufftDestroy(shtns->cufft_plan); + if (shtns->cu_flags & CUSHT_OWN_COMP_STREAM) cudaStreamDestroy(shtns->comp_stream); + if (shtns->cu_flags & CUSHT_OWN_XFER_STREAM) cudaStreamDestroy(shtns->xfer_stream); + if (shtns->d_ct) cudaFree(shtns->d_ct); + if (shtns->d_alm) cudaFree(shtns->d_alm); + if (shtns->d_mx_stdt) cudaFree(shtns->d_mx_stdt); + if (shtns->d_mx_van) cudaFree(shtns->d_mx_van); + if (shtns->gpu_mem) cudaFree(shtns->gpu_mem); + if (shtns->xfft) cudaFree(shtns->xfft); + if (shtns->xfft_cpu) shtns_free(shtns->xfft_cpu); + shtns->d_alm = 0; // disable gpu. + shtns->cu_flags = 0; +} + +static int init_cuda_buffer_fft(shtns_cfg shtns) +{ + cudaError_t err = cudaSuccess; + int err_count = 0; + const unsigned layout = shtns->layout & (256*7); // isolate layout + + shtns->comp_stream = 0; // use default stream for computations. + shtns->cu_flags &= ~((int)CUSHT_OWN_COMP_STREAM); // mark the compute stream (=default stream) as NOT managed by shtns. + err = cudaStreamCreateWithFlags(&shtns->xfer_stream, cudaStreamNonBlocking); // stream for async data transfer. + shtns->cu_flags |= CUSHT_OWN_XFER_STREAM; // mark the transfer stream as managed by shtns. + if (err != cudaSuccess) err_count ++; + + /* cuFFT init */ + int nfft = shtns->nphi; + //int nreal = 2*(nfft/2+1); + shtns->cu_fft_mode = CUSHT_NOFFT; + if (nfft > 1) { + // cufftPlanMany(cufftHandle *plan, int rank, int *n, int *inembed, int istride, int idist, int *onembed, int ostride, int odist, cufftType type, int batch); + cufftResult res; + if (layout == SHT_PHI_CONTIGUOUS) { + printf("WARNING: phi-contiguous transform not available on GPU.\n"); + err_count ++; + return 1; + } else if ((layout == SHT_NATIVE_LAYOUT) && (nfft % 16 == 0) && (shtns->nlat_2 % 16 == 0)) { // use the fastest data-layout. + printf("!!! Use phi-contiguous FFT +transpose: WARNING, the spatial data is neither phi-contiguous nor theta-contiguous !!!\n"); + res = cufftPlanMany(&shtns->cufft_plan, 1, &nfft, &nfft, 1, shtns->nphi, &nfft, 1, shtns->nphi, CUFFT_Z2Z, shtns->nlat_2); + shtns->cu_fft_mode = CUSHT_FFT_TRANSPOSE; + //cufftPlanMany(&shtns->cufft_plan, 1, &nfft, &nfft, 1, shtns->nphi, &nreal, 1, shtns->nphi, CUFFT_D2Z, shtns->nlat); + } else { // if (layout & SHT_THETA_CONTIGUOUS) + res = cufftPlanMany(&shtns->cufft_plan, 1, &nfft, &nfft, shtns->nlat_2, 1, &nfft, shtns->nlat_2, 1, CUFFT_Z2Z, shtns->nlat_2); + shtns->cu_fft_mode = CUSHT_FFT_THETA_CONTIGUOUS; + } + if (res != CUFFT_SUCCESS) { + printf("cufft init FAILED!\n"); + err_count ++; + } + size_t worksize; + cufftGetSize(shtns->cufft_plan, &worksize); + printf("work-area size: %ld \t nlat*nphi = %ld\n", worksize/8, shtns->spat_stride); + } + + // Allocate working arrays for SHT on GPU: + double* gpu_mem = NULL; + const int nlm2 = shtns->nlm + (shtns->mmax+1); // one more data per m + const size_t nlm_stride = ((2*nlm2+WARPSZE-1)/WARPSZE) * WARPSZE; + const size_t spat_stride = ((shtns->nlat*shtns->nphi+WARPSZE-1)/WARPSZE) * WARPSZE; + const size_t dual_stride = (spat_stride < nlm_stride) ? nlm_stride : spat_stride; // we need two spatial buffers to also hold spectral data. + if (shtns->cu_fft_mode == CUSHT_FFT_TRANSPOSE) { + cudaMalloc( (void **)&shtns->xfft, spat_stride * sizeof(double)); + } + err = cudaMalloc( (void **)&gpu_mem, (2*nlm_stride + 2*dual_stride + spat_stride)*sizeof(double) ); // maximum GPU memory required for SHT + if (err != cudaSuccess) err_count++; + + if (shtns->fftc_mode > 0) { + // we also need a buffer on the CPU when the FFT is out-of-place: + shtns->xfft_cpu = (double*) shtns_malloc(spat_stride * sizeof(double)); + } + + shtns->nlm_stride = nlm_stride; + shtns->spat_stride = dual_stride; + shtns->gpu_mem = gpu_mem; + + return err_count; +} + +extern "C" +int cushtns_init_gpu(shtns_cfg shtns) +{ + cudaError_t err = cudaSuccess; + const long nlm = shtns->nlm; + const long nlat_2 = shtns->nlat_2; + + double *d_alm = NULL; + double *d_ct = NULL; + double *d_mx_stdt = NULL; + double *d_mx_van = NULL; + int err_count = 0; + int device_id = -1; + + cudaDeviceProp prop; + cudaGetDevice(&device_id); + err = cudaGetDeviceProperties(&prop, device_id); + if (err != cudaSuccess) return -1; + #if SHT_VERBOSE > 0 + printf(" cuda GPU #%d \"%s\" found (warp size = %d, compute capabilities = %d.%d).\n", device_id, prop.name, prop.warpSize, prop.major, prop.minor); + #endif + if (prop.warpSize != WARPSZE) return -1; // failure, SHTns requires a warpSize of 32. + if (prop.major < 3) return -1; // failure, SHTns requires compute cap. >= 3 (warp shuffle instructions) + + // Allocate the device input vector alm + err = cudaMalloc((void **)&d_alm, (2*nlm+MAX_THREADS_PER_BLOCK-1)*sizeof(double)); // allow some overflow. + if (err != cudaSuccess) err_count ++; + if (shtns->mx_stdt) { + // Allocate the device matrix for d(sin(t))/dt + err = cudaMalloc((void **)&d_mx_stdt, (2*nlm+MAX_THREADS_PER_BLOCK-1)*sizeof(double)); + if (err != cudaSuccess) err_count ++; + // Same thing for analysis + err = cudaMalloc((void **)&d_mx_van, (2*nlm+MAX_THREADS_PER_BLOCK-1)*sizeof(double)); + if (err != cudaSuccess) err_count ++; + } + // Allocate the device input vector cos(theta) and gauss weights + err = cudaMalloc((void **)&d_ct, 2*nlat_2*sizeof(double)); + if (err != cudaSuccess) err_count ++; + + if (err_count == 0) { + err = cudaMemcpy(d_alm, shtns->alm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) err_count ++; + if (shtns->mx_stdt) { + err = cudaMemcpy(d_mx_stdt, shtns->mx_stdt, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) err_count ++; + err = cudaMemcpy(d_mx_van, shtns->mx_van, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) err_count ++; + } + err = cudaMemcpy(d_ct, shtns->ct, nlat_2*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) err_count ++; + err = cudaMemcpy(d_ct + nlat_2, shtns->wg, nlat_2*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) err_count ++; + } + + shtns->d_alm = d_alm; + shtns->d_ct = d_ct; + shtns->d_mx_stdt = d_mx_stdt; + shtns->d_mx_van = d_mx_van; + + err_count += init_cuda_buffer_fft(shtns); + + if (err_count != 0) { + cushtns_release_gpu(shtns); + return -1; // fail + } + + return device_id; // success, return device_id +} + +/// \internal Enables parallel transforms on selected GPU device, if available. \see shtns_use_gpu +extern "C" +int cushtns_use_gpu(int device_id) +{ + int count = 0; + if (device_id >= 0) { + cudaGetDeviceCount(&count); + if (count > 0) { + device_id = device_id % count; + cudaSetDevice(device_id); + return device_id; + } + } + return -1; // disable gpu. +} + +extern "C" +void cushtns_set_streams(shtns_cfg shtns, cudaStream_t compute_stream, cudaStream_t transfer_stream) +{ + if (compute_stream != 0) { + if (shtns->cu_flags & CUSHT_OWN_COMP_STREAM) cudaStreamDestroy(shtns->comp_stream); + shtns->comp_stream = compute_stream; + if (shtns->nphi > 1) cufftSetStream(shtns->cufft_plan, compute_stream); + shtns->cu_flags &= ~((int)CUSHT_OWN_COMP_STREAM); // we don't manage this stream + } + if (transfer_stream != 0) { + if (shtns->cu_flags & CUSHT_OWN_XFER_STREAM) cudaStreamDestroy(shtns->xfer_stream); + shtns->xfer_stream = transfer_stream; + shtns->cu_flags &= ~((int)CUSHT_OWN_XFER_STREAM); // we don't manage this stream + } +} + +/* +extern "C" +shtns_cfg cushtns_clone(shtns_cfg shtns, cudaStream_t compute_stream, cudaStream_t transfer_stream) +{ + if (shtns->d_alm == 0) return 0; // do not clone if there is no GPU associated... + + shtns_cfg sht_clone; + sht_clone = shtns_create_with_grid(shtns, shtns->mmax, 0); // copy the shtns_cfg, sharing all data. + + // set new buffer and cufft plan (should be unique for each shtns_cfg). + int err_count = init_cuda_buffer_fft(sht_clone); + if (err_count > 0) return 0; // TODO: memory should be properly deallocated here... + // set new streams (should also be unique). + cushtns_set_streams(sht_clone, compute_stream, transfer_stream); + return sht_clone; +} +*/ + +extern "C" +shtns_cfg cushtns_clone(shtns_cfg shtns, cudaStream_t compute_stream, cudaStream_t transfer_stream) +{ + shtns_cfg sht_clone; + sht_clone = shtns_create_with_grid(shtns, shtns->mmax, 0); // copy the shtns_cfg, sharing all data. + + int dev_id = cushtns_init_gpu(sht_clone); + if (dev_id >= 0) { + cushtns_set_streams(sht_clone, compute_stream, transfer_stream); + return sht_clone; + } else { + shtns_destroy(sht_clone); + return 0; // fail + } +} + +void fourier_to_spat_gpu(shtns_cfg shtns, double* q, const int mmax) +{ + const int nphi = shtns->nphi; + cufftResult res; + if (nphi > 1) { + cufftDoubleComplex* x = (cufftDoubleComplex*) q; + if (shtns->cu_fft_mode == CUSHT_FFT_TRANSPOSE) { + double* xfft = shtns->xfft; + transpose_cplx_zero(shtns->comp_stream, (double*) x, xfft, shtns->nlat_2, nphi, mmax); // zero out m>mmax during transpose + res = cufftExecZ2Z(shtns->cufft_plan, (cufftDoubleComplex*) xfft, x, CUFFT_INVERSE); + } else { // THETA_CONTIGUOUS: + if (2*(mmax+1) <= nphi) { + const int nlat = shtns->nlat; + cudaMemsetAsync( q + (mmax+1)*nlat, 0, sizeof(double)*(nphi-2*mmax-1)*nlat, shtns->comp_stream ); // zero out m>mmax before fft + } + res = cufftExecZ2Z(shtns->cufft_plan, x, x, CUFFT_INVERSE); + } + if (res != CUFFT_SUCCESS) printf("cufft error %d\n", res); + } +} + +void spat_to_fourier_gpu(shtns_cfg shtns, double* q, const int mmax) +{ + const int nphi = shtns->nphi; + cufftResult res; + if (nphi > 1) { + cufftDoubleComplex *x = (cufftDoubleComplex*) q; + if (shtns->cu_fft_mode == CUSHT_FFT_TRANSPOSE) { + double* xfft = shtns->xfft; + res = cufftExecZ2Z(shtns->cufft_plan, x, (cufftDoubleComplex*) xfft, CUFFT_INVERSE); + transpose_cplx_skip(shtns->comp_stream, xfft, (double*) x, nphi, shtns->nlat_2, mmax); // ignore m > mmax during transpose + } else { // THETA_CONTIGUOUS: + res = cufftExecZ2Z(shtns->cufft_plan, x, x, CUFFT_INVERSE); + } + if (res != CUFFT_SUCCESS) printf("cufft error %d\n", res); + } +} + +void spat_to_fourier_host(shtns_cfg shtns, double* q, double* qf) +{ + // FFT on host + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->fftc, (cplx *) q, (cplx *) qf); + } else { // split dft + printf("ERROR fft not supported\n"); + } + } +} + +void fourier_to_spat_host(shtns_cfg shtns, double* qf, double* q) +{ + if (shtns->fftc_mode >= 0) { + if (shtns->fftc_mode != 1) { + fftw_execute_dft(shtns->ifftc, (cplx *) qf, (cplx *) q); + } else { // split dft + printf("ERROR fft not supported\n"); + } + } +} + +/************************ + * TRANSFORMS ON DEVICE * + ************************/ + + +/// Perform SH transform on data that is already on the GPU. d_Qlm and d_Vr are pointers to GPU memory (obtained by cudaMalloc() for instance) +template +void cuda_SH_to_spat(shtns_cfg shtns, cplx* d_Qlm, double *d_Vr, const long int llim, const int mmax, int spat_dist = 0) +{ + if (spat_dist == 0) spat_dist = shtns->spat_stride; + legendre(shtns, (double*) d_Qlm, d_Vr, llim, mmax, spat_dist); + for (int f=0; f +void cuda_spat_to_SH(shtns_cfg shtns, double *d_Vr, cplx* d_Qlm, const long int llim, int spat_dist = 0) +{ + int mmax = shtns->mmax; + const int mres = shtns->mres; + if (spat_dist == 0) spat_dist = shtns->spat_stride; + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + for (int f=0; f(shtns, d_Vr, (double*) d_Qlm, llim, spat_dist); +} + + +extern "C" +void cu_SH_to_spat(shtns_cfg shtns, cplx* d_Qlm, double *d_Vr, int llim) +{ + int mmax = shtns->mmax; + const int mres = shtns->mres; + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + cuda_SH_to_spat<0,1>(shtns, d_Qlm, d_Vr, llim, mmax); +} + + +extern "C" +void cu_SHsphtor_to_spat(shtns_cfg shtns, cplx* d_Slm, cplx* d_Tlm, double* d_Vt, double* d_Vp, int llim) +{ + int mmax = shtns->mmax; + const int mres = shtns->mres; + const long nlm_stride = shtns->nlm_stride; + double* d_vwlm = shtns->gpu_mem; + + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + + sphtor2scal_gpu(shtns, d_Slm, d_Tlm, (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), llim, mmax); + // SHT on the GPU +// cuda_SH_to_spat<1,1>(shtns, (cplx*) d_vwlm, d_Vt, llim+1); +// cuda_SH_to_spat<1,1>(shtns, (cplx*) (d_vwlm + nlm_stride), d_Vp, llim+1); + cuda_SH_to_spat<1,2>(shtns, (cplx*) d_vwlm, d_Vt, llim+1, d_Vp-d_Vt, mmax); +} + +extern "C" +void cu_SHqst_to_spat(shtns_cfg shtns, cplx* d_Qlm, cplx* d_Slm, cplx* d_Tlm, double* d_Vr, double* d_Vt, double* d_Vp, int llim) +{ + int mmax = shtns->mmax; + const int mres = shtns->mres; + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + + cuda_SH_to_spat<0,1>(shtns, d_Qlm, d_Vr, llim, mmax); + cu_SHsphtor_to_spat(shtns, d_Slm, d_Tlm, d_Vt, d_Vp, llim); +} + + +extern "C" +void cu_spat_to_SH(shtns_cfg shtns, double *d_Vr, cplx* d_Qlm, int llim) +{ + cuda_spat_to_SH<0,1>(shtns, d_Vr, d_Qlm, llim); +} + +extern "C" +void cu_spat_to_SHsphtor(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int llim) +{ + cudaError_t err = cudaSuccess; + const long nlm_stride = shtns->nlm_stride; + double* d_vwlm = shtns->gpu_mem; + + // SHT on the GPU +// cuda_spat_to_SH<1,1>(shtns, Vt, (cplx*) d_vwlm, llim+1); +// cuda_spat_to_SH<1,1>(shtns, Vp, (cplx*) (d_vwlm + nlm_stride), llim+1); + cuda_spat_to_SH<1,2>(shtns, Vt, (cplx*) d_vwlm, llim+1, Vp-Vt); + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("spat_to_SHsphtor CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + scal2sphtor_gpu(shtns, (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), Slm, Tlm, llim); +} + + +extern "C" +void cu_spat_to_SHqst(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int llim) +{ + cuda_spat_to_SH<0,1>(shtns, Vr, Qlm, llim); + cu_spat_to_SHsphtor(shtns, Vt,Vp, Slm,Tlm, llim); +} + + +/******************************************************* + * TRANSFORMS OF HOST DATA, INCLUDING TRANSFERS TO GPU * + *******************************************************/ + +extern "C" +void SH_to_spat_gpu(shtns_cfg shtns, cplx *Qlm, double *Vr, const long int llim) +{ + cudaError_t err = cudaSuccess; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const int mres = shtns->mres; + long nlm = shtns->nlm; + int mmax = shtns->mmax; + + double *d_qlm; + double *d_q; + // get pointers to gpu buffers. + d_qlm = shtns->gpu_mem; + d_q = d_qlm + shtns->nlm_stride; + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + // copy spectral data to GPU + err = cudaMemcpy(d_qlm, Qlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("SH_to_spat_gpu failed copy qlm\n"); return; } + + // SHT on the GPU + cuda_SH_to_spat<0,1>(shtns, (cplx*) d_qlm, d_q, llim, mmax); + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat_gpu CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + // copy back spatial data + err = cudaMemcpy(Vr, d_q, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); + if (err != cudaSuccess) { printf("SH_to_spat_gpu failed copy back: %s\n", cudaGetErrorString(err)); return; } +} + +extern "C" +void SH_to_spat_gpu_hostfft(shtns_cfg shtns, cplx *Qlm, double *Vr, const long int llim) +{ + cudaError_t err = cudaSuccess; + double *d_qlm; + double *d_q; + const long nlat = shtns->nlat; + const long nphi = shtns->nphi; + long nlm = shtns->nlm; + + // get pointers to gpu buffers. + d_qlm = shtns->gpu_mem; + d_q = d_qlm + shtns->nlm_stride; + + double* VrF = Vr; + if (shtns->fftc_mode > 0) VrF = shtns->xfft_cpu; + + int mmax = shtns->mmax; + const int mres = shtns->mres; + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + + // copy spectral data to GPU + err = cudaMemcpy(d_qlm, Qlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("SH_to_spat_gpu_hostfft failed copy H2D; %s\n", cudaGetErrorString(err)); return; } + + // Legendre transform on gpu + legendre<0,1>(shtns, d_qlm, d_q, llim, mmax); + + // copy back spatial data (before FFT) + if (12*(mmax+1) < 5*nphi) { + // copy in two parts, to avoid copying zeros: + memzero_omp(VrF + nlat*(mmax+1), nlat*(nphi-(2*mmax+1))); + err = cudaMemcpy(VrF, d_q, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost); + err = cudaMemcpy(VrF + nlat*(nphi-mmax), d_q + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost); + } else { + err = cudaMemcpy(VrF, d_q, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); + } + if (err != cudaSuccess) { printf("SH_to_spat_gpu_hostfft failed copy D2H: %s\n", cudaGetErrorString(err)); return; } + + fourier_to_spat_host(shtns, VrF, Vr); +} + +extern "C" +void spat_to_SH_gpu_hostfft(shtns_cfg shtns, double *Vr, cplx *Qlm, const long int llim) +{ + cudaError_t err = cudaSuccess; + long nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const long nlat = shtns->nlat; + const long nphi = shtns->nphi; + + // get pointers to gpu buffers. + double* d_qlm = shtns->gpu_mem; + double* d_q = d_qlm + shtns->nlm_stride; + + double *VrF = Vr; + if (shtns->fftc_mode > 0) VrF = shtns->xfft_cpu; + spat_to_fourier_host(shtns, Vr, VrF); + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + // copy FFT data to GPU + if (12*(mmax+1) < 5*nphi) { + // copy in two parts, to avoid copying useless data: + err = cudaMemcpy(d_q, VrF, nlat*(mmax+1)*sizeof(double), cudaMemcpyHostToDevice); + err = cudaMemcpy(d_q + nlat*(nphi-mmax), VrF + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyHostToDevice); + } else { + err = cudaMemcpy(d_q, VrF, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + } + if (err != cudaSuccess) { printf("spat_to_SH_gpu_hostfft failed copy H2D: %s\n", cudaGetErrorString(err)); return; } + + // Legendre transform on gpu + ilegendre<0,1>(shtns, d_q, d_qlm, llim); + + if (nlm < shtns->nlm) memset(Qlm + nlm, 0, (shtns->nlm - nlm)*2*sizeof(double)); + // copy back spectral data from GPU + err = cudaMemcpy(Qlm, d_qlm, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + if (err != cudaSuccess) { printf("spat_to_SH_gpu_hostfft failed copy D2H: %s\n", cudaGetErrorString(err)); return; } +} + + +/** \internal convert from vector SH to scalar SH + Vlm = st*d(Slm)/dtheta + I*m*Tlm + Wlm = -st*d(Tlm)/dtheta + I*m*Slm +**/ +/*void sphtor2scal(shtns_cfg shtns, cplx* Slm, cplx* Tlm, cplx* Vlm, cplx* Wlm, const int llim) +{ + const int mmax = shtns->mmax; + const int lmax = shtns->lmax; + const int mres = shtns->mres; + for (int im=0; im<=mmax; im++) { + const int m = im*mres; + long l = (im*(2*(lmax+1)-(m+mres)))>>1; + double* mx = shtns->mx_stdt + 2*l; + cplx* Sl = (cplx*) &Slm[l]; // virtual pointer for l=0 and im + cplx* Tl = (cplx*) &Tlm[l]; + cplx* Vl = (cplx*) &Vlm[l+im]; + cplx* Wl = (cplx*) &Wlm[l+im]; + const double em = m; + + cplx sl = Sl[m]; + cplx tl = Tl[m]; + cplx vs = 0.0; + cplx wt = 0.0; + for (int l=m; l<=llim; l++) { + double mxu = mx[2*l]; + double mxl = mx[2*l+1]; // mxl for next l + vs += I*em*tl; + wt += I*em*sl; + cplx vs1 = mxl*sl; // vs for next l + cplx wt1 = -mxl*tl; // wt for next l + if (lnlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + + double* d_vwlm = shtns->gpu_mem; + double* d_vtp = d_vwlm + 2*nlm_stride; + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + // transfer and convert on gpu + err = cudaMemcpy(d_vtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpy(d_vtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + sphtor2scal_gpu(shtns, (cplx*) d_vtp, (cplx*) (d_vtp+nlm_stride), (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + cuda_SH_to_spat<1,1>(shtns, (cplx*) d_vwlm, d_vtp, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht, cudaEventDisableTiming ); + cudaEventRecord(ev_sht, shtns->comp_stream); // record the end of scalar SH (theta). + + cuda_SH_to_spat<1,1>(shtns, (cplx*) (d_vwlm + nlm_stride), d_vtp + spat_stride, llim+1, mmax); + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(Vt, d_vtp, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaEventDestroy(ev_sht); + + // copy back spatial data (phi) + err = cudaMemcpy(Vp, d_vtp + spat_stride, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); +} + +extern "C" +void SHsphtor_to_spat_gpu_hostfft(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_sht, ev_sht2; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + + double* d_vwlm = shtns->gpu_mem; + double* d_vtp = d_vwlm + 2*nlm_stride; + double* VtF = Vt; + double* VpF = Vp; + if (shtns->fftc_mode > 0) { + VtF = Vp; + VpF = shtns->xfft_cpu; + } + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + // transfer and convert on gpu + err = cudaMemcpy(d_vtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpy(d_vtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + sphtor2scal_gpu(shtns, (cplx*) d_vtp, (cplx*) (d_vtp+nlm_stride), (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + legendre<1,1>(shtns, d_vwlm, d_vtp, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht, cudaEventDisableTiming ); + cudaEventRecord(ev_sht, shtns->comp_stream); // record the end of scalar SH (theta). + + legendre<1,1>(shtns, (d_vwlm + nlm_stride), d_vtp + spat_stride, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht2, cudaEventDisableTiming ); + cudaEventRecord(ev_sht2, shtns->comp_stream); // record the end of scalar SH (phi). + + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(VtF, d_vtp, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaMemcpyAsync(VtF + nlat*(nphi-mmax), d_vtp + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaEventRecord(ev_sht, shtns->xfer_stream); + + cudaStreamWaitEvent(xfer_stream, ev_sht2, 0); // xfer stream waits for end of scalar SH (phi). + cudaMemcpyAsync(VpF, d_vtp + spat_stride, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaMemcpyAsync(VpF + nlat*(nphi-mmax), d_vtp + spat_stride + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaEventRecord(ev_sht2, shtns->xfer_stream); + + memzero_omp(Vt + nlat*(mmax+1), Vp + nlat*(mmax+1), nlat*(nphi-(2*mmax+1))); + + cudaEventSynchronize(ev_sht); + fourier_to_spat_host(shtns, VtF, Vt); + cudaEventSynchronize(ev_sht2); + fourier_to_spat_host(shtns, VpF, Vp); + + cudaEventDestroy(ev_sht2); + cudaEventDestroy(ev_sht); +} + +extern "C" +void SHsphtor_to_spat_gpu2_hostfft(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_sht, ev_sht2; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + + double* d_vwlm = shtns->gpu_mem; + double* d_vtp = d_vwlm + 2*nlm_stride; + double* VtF = Vt; + double* VpF = Vp; + if (shtns->fftc_mode > 0) { + VtF = Vp; + VpF = shtns->xfft_cpu; + } + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + // transfer and convert on gpu + err = cudaMemcpy(d_vtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpy(d_vtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + sphtor2scal_gpu(shtns, (cplx*) d_vtp, (cplx*) (d_vtp+nlm_stride), (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + legendre<1,2>(shtns, d_vwlm, d_vtp, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht, cudaEventDisableTiming ); + cudaEventRecord(ev_sht, shtns->comp_stream); // record the end of scalar SH (theta+phi). + + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(VtF, d_vtp, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaMemcpyAsync(VtF + nlat*(nphi-mmax), d_vtp + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaEventRecord(ev_sht, shtns->xfer_stream); + + cudaMemcpyAsync(VpF, d_vtp + spat_stride, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaMemcpyAsync(VpF + nlat*(nphi-mmax), d_vtp + spat_stride + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, shtns->xfer_stream); + cudaEventCreateWithFlags(&ev_sht2, cudaEventDisableTiming ); + cudaEventRecord(ev_sht2, shtns->xfer_stream); + + memzero_omp(Vt + nlat*(mmax+1), Vp + nlat*(mmax+1), nlat*(nphi-(2*mmax+1))); + + cudaEventSynchronize(ev_sht); + fourier_to_spat_host(shtns, VtF, Vt); + cudaEventSynchronize(ev_sht2); + fourier_to_spat_host(shtns, VpF, Vp); + + cudaEventDestroy(ev_sht2); + cudaEventDestroy(ev_sht); +} + +extern "C" +void SHsphtor_to_spat_gpu2(shtns_cfg shtns, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + + double* d_vwlm; + double* d_vtp; + + d_vwlm = shtns->gpu_mem; + d_vtp = d_vwlm + 2*nlm_stride; + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + // transfer and convert on gpu + err = cudaMemcpy(d_vtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpy(d_vtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + sphtor2scal_gpu(shtns, (cplx*) d_vtp, (cplx*) (d_vtp+nlm_stride), (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + cuda_SH_to_spat<1,2>(shtns, (cplx*) d_vwlm, d_vtp, llim+1, mmax); // Vt and Vp together (merge with sphtor2scal_gpu) + cudaMemcpy(Vt, d_vtp, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); + cudaMemcpy(Vp, d_vtp + spat_stride, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); +} + + +extern "C" +void SHqst_to_spat_gpu(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_sht0, ev_sht1, ev_up; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + cudaStream_t comp_stream = shtns->comp_stream; + + double* d_qvwlm = shtns->gpu_mem; + double* d_vrtp = d_qvwlm + 2*nlm_stride; + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + /// 1) start scalar SH for radial component. + err = cudaMemcpy(d_qvwlm, Qlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 0 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + cuda_SH_to_spat<0,1>(shtns, (cplx*) d_qvwlm, d_vrtp + 2*spat_stride, llim, mmax); + + // OR transfer and convert on gpu + err = cudaMemcpyAsync(d_vrtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpyAsync(d_vrtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + cudaEventCreateWithFlags(&ev_sht0, cudaEventDisableTiming ); + cudaEventRecord(ev_sht0, comp_stream); // record the end of scalar SH (radial). + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of upload + cudaStreamWaitEvent(comp_stream, ev_up, 0); // compute stream waits for end of transfer. + + sphtor2scal_gpu(shtns, (cplx*) d_vrtp, (cplx*) (d_vrtp+nlm_stride), (cplx*) d_qvwlm, (cplx*) (d_qvwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + cuda_SH_to_spat<1,1>(shtns, (cplx*) d_qvwlm, d_vrtp, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht1, cudaEventDisableTiming ); + cudaEventRecord(ev_sht1, comp_stream); // record the end of scalar SH (theta). + + cuda_SH_to_spat<1,1>(shtns, (cplx*) (d_qvwlm + nlm_stride), d_vrtp + spat_stride, llim+1, mmax); + + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht0, 0); // xfer stream waits for end of scalar SH (radial). + cudaMemcpyAsync(Vr, d_vrtp + 2*spat_stride, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventDestroy(ev_sht0); + + cudaStreamWaitEvent(xfer_stream, ev_sht1, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(Vt, d_vrtp, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventDestroy(ev_sht1); + + // copy back the last transform (compute stream). + err = cudaMemcpy(Vp, d_vrtp + spat_stride, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); + + cudaEventDestroy(ev_up); +} + +extern "C" +void SHqst_to_spat_gpu_hostfft(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_sht0, ev_sht1, ev_sht2, ev_up; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + cudaStream_t comp_stream = shtns->comp_stream; + + double* d_qvwlm = shtns->gpu_mem; + double* d_vrtp = d_qvwlm + 2*nlm_stride; + + double* VrF = Vr; + double* VtF = Vt; + double* VpF = Vp; + if (shtns->fftc_mode > 0) { + VrF = Vt; + VtF = Vp; + VpF = shtns->xfft_cpu; + } + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + /// 1) start scalar SH for radial component. + err = cudaMemcpy(d_qvwlm, Qlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 0 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + legendre<0,1>(shtns, d_qvwlm, d_vrtp + 2*spat_stride, llim, mmax); + + // OR transfer and convert on gpu + err = cudaMemcpyAsync(d_vrtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpyAsync(d_vrtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + cudaEventCreateWithFlags(&ev_sht0, cudaEventDisableTiming ); + cudaEventRecord(ev_sht0, comp_stream); // record the end of scalar SH (radial). + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of upload + cudaStreamWaitEvent(comp_stream, ev_up, 0); // compute stream waits for end of transfer. + + sphtor2scal_gpu(shtns, (cplx*) d_vrtp, (cplx*) (d_vrtp+nlm_stride), (cplx*) d_qvwlm, (cplx*) (d_qvwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + legendre<1,1>(shtns, d_qvwlm, d_vrtp, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht1, cudaEventDisableTiming ); + cudaEventRecord(ev_sht1, comp_stream); // record the end of scalar SH (theta). + + legendre<1,1>(shtns, (d_qvwlm + nlm_stride), d_vrtp + spat_stride, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht2, cudaEventDisableTiming ); + cudaEventRecord(ev_sht2, comp_stream); // record the end of scalar SH (phi). + + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht0, 0); // xfer stream waits for end of scalar SH (radial). + cudaMemcpyAsync(VrF, d_vrtp + 2*spat_stride, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaMemcpyAsync(VrF + nlat*(nphi-mmax), d_vrtp + 2*spat_stride + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventRecord(ev_sht0, xfer_stream); + + cudaStreamWaitEvent(xfer_stream, ev_sht1, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(VtF, d_vrtp, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaMemcpyAsync(VtF + nlat*(nphi-mmax), d_vrtp + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventRecord(ev_sht1, xfer_stream); + + cudaStreamWaitEvent(xfer_stream, ev_sht2, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(VpF, d_vrtp + spat_stride, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaMemcpyAsync(VpF + nlat*(nphi-mmax), d_vrtp + spat_stride + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventRecord(ev_sht2, xfer_stream); + + memzero_omp(Vr + nlat*(mmax+1), Vt + nlat*(mmax+1), Vp + nlat*(mmax+1), nlat*(nphi-(2*mmax+1))); + + cudaEventSynchronize(ev_sht0); + fourier_to_spat_host(shtns, VrF, Vr); + cudaEventSynchronize(ev_sht1); + fourier_to_spat_host(shtns, VtF, Vt); + cudaEventSynchronize(ev_sht2); + fourier_to_spat_host(shtns, VpF, Vp); + + cudaEventDestroy(ev_sht0); + cudaEventDestroy(ev_sht1); + cudaEventDestroy(ev_up); +} + +extern "C" +void SHqst_to_spat_gpu2_hostfft(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_sht0, ev_sht1, ev_sht2, ev_up; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + cudaStream_t comp_stream = shtns->comp_stream; + + double* d_qvwlm = shtns->gpu_mem; + double* d_vrtp = d_qvwlm + 2*nlm_stride; + + double* VrF = Vr; + double* VtF = Vt; + double* VpF = Vp; + if (shtns->fftc_mode > 0) { + VrF = Vt; + VtF = Vp; + VpF = shtns->xfft_cpu; + } + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + /// 1) start scalar SH for radial component. + err = cudaMemcpy(d_qvwlm, Qlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 0 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + legendre<0,1>(shtns, d_qvwlm, d_vrtp + 2*spat_stride, llim, mmax); + + // OR transfer and convert on gpu + err = cudaMemcpyAsync(d_vrtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpyAsync(d_vrtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + cudaEventCreateWithFlags(&ev_sht0, cudaEventDisableTiming ); + cudaEventRecord(ev_sht0, comp_stream); // record the end of scalar SH (radial). + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of upload + cudaStreamWaitEvent(comp_stream, ev_up, 0); // compute stream waits for end of transfer. + + sphtor2scal_gpu(shtns, (cplx*) d_vrtp, (cplx*) (d_vrtp+nlm_stride), (cplx*) d_qvwlm, (cplx*) (d_qvwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + legendre<1,2>(shtns, d_qvwlm, d_vrtp, llim+1, mmax); + cudaEventCreateWithFlags(&ev_sht1, cudaEventDisableTiming ); + cudaEventRecord(ev_sht1, comp_stream); // record the end of scalar SH (theta+phi). + + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht0, 0); // xfer stream waits for end of scalar SH (radial). + cudaMemcpyAsync(VrF, d_vrtp + 2*spat_stride, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaMemcpyAsync(VrF + nlat*(nphi-mmax), d_vrtp + 2*spat_stride + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventRecord(ev_sht0, xfer_stream); + + cudaStreamWaitEvent(xfer_stream, ev_sht1, 0); // xfer stream waits for end of scalar SH (theta). + cudaMemcpyAsync(VtF, d_vrtp, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaMemcpyAsync(VtF + nlat*(nphi-mmax), d_vrtp + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventRecord(ev_sht1, xfer_stream); + + cudaMemcpyAsync(VpF, d_vrtp + spat_stride, nlat*(mmax+1)*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaMemcpyAsync(VpF + nlat*(nphi-mmax), d_vrtp + spat_stride + nlat*(nphi-mmax), nlat*mmax*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventCreateWithFlags(&ev_sht2, cudaEventDisableTiming ); + cudaEventRecord(ev_sht2, xfer_stream); + + memzero_omp(Vr + nlat*(mmax+1), Vt + nlat*(mmax+1), Vp + nlat*(mmax+1), nlat*(nphi-(2*mmax+1))); + + cudaEventSynchronize(ev_sht0); + fourier_to_spat_host(shtns, VrF, Vr); + cudaEventSynchronize(ev_sht1); + fourier_to_spat_host(shtns, VtF, Vt); + cudaEventSynchronize(ev_sht2); + fourier_to_spat_host(shtns, VpF, Vp); + + cudaEventDestroy(ev_sht2); + cudaEventDestroy(ev_sht1); + cudaEventDestroy(ev_sht0); + cudaEventDestroy(ev_up); +} + + +extern "C" +void SHqst_to_spat_gpu2(shtns_cfg shtns, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_sht0, ev_up; + int nlm = shtns->nlm; + int mmax = shtns->mmax; + const int mres = shtns->mres; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + cudaStream_t comp_stream = shtns->comp_stream; + + double* d_qvwlm = shtns->gpu_mem; + double* d_vrtp = d_qvwlm + 2*nlm_stride; + + if (llim < mmax*mres) { + mmax = llim / mres; // truncate mmax too ! + nlm = nlm_calc( shtns->lmax, mmax, mres); // transfer less data + } + /// 1) start scalar SH for radial component. + err = cudaMemcpy(d_qvwlm, Qlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 0 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + cuda_SH_to_spat<0,1>(shtns, (cplx*) d_qvwlm, d_vrtp + 2*spat_stride, llim, mmax); + + // OR transfer and convert on gpu + err = cudaMemcpyAsync(d_vrtp, Slm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 1 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpyAsync(d_vrtp + nlm_stride, Tlm, 2*nlm*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 2 error : %s!\n", cudaGetErrorString(err)); return; } + + cudaEventCreateWithFlags(&ev_sht0, cudaEventDisableTiming ); + cudaEventRecord(ev_sht0, comp_stream); // record the end of scalar SH (radial). + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of upload + cudaStreamWaitEvent(comp_stream, ev_up, 0); // compute stream waits for end of transfer. + + sphtor2scal_gpu(shtns, (cplx*) d_vrtp, (cplx*) (d_vrtp+nlm_stride), (cplx*) d_qvwlm, (cplx*) (d_qvwlm+nlm_stride), llim, mmax); + + // SHT on the GPU + cuda_SH_to_spat<1,2>(shtns, (cplx*) d_qvwlm, d_vrtp, llim+1, mmax); + + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("SH_to_spat CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + cudaStreamWaitEvent(xfer_stream, ev_sht0, 0); // xfer stream waits for end of scalar SH (radial). + cudaMemcpyAsync(Vr, d_vrtp + 2*spat_stride, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + cudaEventDestroy(ev_sht0); + + cudaMemcpy(Vt, d_vrtp, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); + + // copy back the last transform (compute stream). + err = cudaMemcpy(Vp, d_vrtp + spat_stride, nlat*nphi*sizeof(double), cudaMemcpyDeviceToHost); + + cudaEventDestroy(ev_up); +} + + +extern "C" +void spat_to_SH_gpu(shtns_cfg shtns, double *Vr, cplx *Qlm, const long int llim) +{ + cudaError_t err = cudaSuccess; + const int nlm = shtns->nlm; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + + double *d_qlm; + double *d_q; + + // Allocate the device work vectors qlm and q + //err = cudaMalloc((void **)&d_qlm, ((2*nlm +31 + nlat*nphi+31)/32)*32*sizeof(double)); + d_qlm = shtns->gpu_mem; + d_q = d_qlm + shtns->nlm_stride; + + // copy spatial data to GPU + err = cudaMemcpy(d_q, Vr, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("spat_to_SH_gpu failed copy q\n"); return; } + + // SHT on the GPU + cu_spat_to_SH(shtns, d_q, (cplx*) d_qlm, llim); + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("spat_to_SH_gpu CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + // copy back spectral data + err = cudaMemcpy(Qlm, d_qlm, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + if (err != cudaSuccess) { printf("spat_to_SH_gpu failed copy back\n"); return; } + + //cudaFree(d_qlm); +} + + +extern "C" +void spat_to_SHsphtor_gpu(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_up; + const int nlm = shtns->nlm; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + + double* d_vwlm; + double* d_vtp; + + //err = cudaMalloc( (void **)&d_vwlm, (4*nlm_stride + 2*spat_stride)*sizeof(double) ); + d_vtp = shtns->gpu_mem; + d_vwlm = d_vtp + 2*spat_stride; + + // copy spatial data to gpu + err = cudaMemcpy(d_vtp, Vt, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 3 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + cuda_spat_to_SH<1,1>(shtns, d_vtp, (cplx*) d_vwlm, llim+1); + + err = cudaMemcpyAsync(d_vtp + spat_stride, Vp, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 4 error : %s!\n", cudaGetErrorString(err)); return; } + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of scalar SH (theta). + cudaStreamWaitEvent(shtns->comp_stream, ev_up, 0); // compute stream waits for end of data transfer (phi). + cuda_spat_to_SH<1,1>(shtns, d_vtp + spat_stride, (cplx*) (d_vwlm + nlm_stride), llim+1); + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("spat_to_SHsphtor CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + scal2sphtor_gpu(shtns, (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), (cplx*) d_vtp, (cplx*) (d_vtp+nlm_stride), llim); + + err = cudaMemcpy(Slm, d_vtp, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + err = cudaMemcpy(Tlm, d_vtp+nlm_stride, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + + cudaEventDestroy(ev_up); +// cudaFree(d_vwlm); +// cudaFreeHost(vw); +} + +extern "C" +void spat_to_SHsphtor_gpu2(shtns_cfg shtns, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, const long int llim) +{ + cudaError_t err = cudaSuccess; + const int nlm = shtns->nlm; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + + double* d_vwlm; + double* d_vtp; + + //err = cudaMalloc( (void **)&d_vwlm, (4*nlm_stride + 2*spat_stride)*sizeof(double) ); + d_vtp = shtns->gpu_mem; + d_vwlm = d_vtp + 2*spat_stride; + + // copy spatial data to gpu + err = cudaMemcpy(d_vtp, Vt, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + err = cudaMemcpy(d_vtp + spat_stride, Vp, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 3 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + cuda_spat_to_SH<1,2>(shtns, d_vtp, (cplx*) d_vwlm, llim+1); + + scal2sphtor_gpu(shtns, (cplx*) d_vwlm, (cplx*) (d_vwlm+nlm_stride), (cplx*) d_vtp, (cplx*) (d_vtp+nlm_stride), llim); + + err = cudaMemcpy(Slm, d_vtp, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + err = cudaMemcpy(Tlm, d_vtp+nlm_stride, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); +} + + +extern "C" +void spat_to_SHqst_gpu(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_up, ev_up2, ev_sh2; + const int nlm = shtns->nlm; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + cudaStream_t comp_stream = shtns->comp_stream; + + double* d_qvwlm; + double* d_vrtp; + + // Allocate the device work vectors +// err = cudaMalloc( (void **)&d_qvwlm, (5*nlm_stride + 3*spat_stride)*sizeof(double) ); + d_qvwlm = shtns->gpu_mem; + d_vrtp = d_qvwlm + 2*nlm_stride; + + // copy spatial data to gpu + err = cudaMemcpy(d_vrtp, Vt, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 3 error : %s!\n", cudaGetErrorString(err)); return; } + // SHT on the GPU + cuda_spat_to_SH<1,1>(shtns, d_vrtp, (cplx*) d_qvwlm, llim+1); + + err = cudaMemcpyAsync(d_vrtp + spat_stride, Vp, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 4 error : %s!\n", cudaGetErrorString(err)); return; } + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of scalar SH (theta). + cudaStreamWaitEvent(comp_stream, ev_up, 0); // compute stream waits for end of data transfer (phi). + cuda_spat_to_SH<1,1>(shtns, d_vrtp + spat_stride, (cplx*) (d_qvwlm + nlm_stride), llim+1); + err = cudaGetLastError(); + if (err != cudaSuccess) { printf("spat_to_SHsphtor CUDA error : %s!\n", cudaGetErrorString(err)); return; } + + scal2sphtor_gpu(shtns, (cplx*) d_qvwlm, (cplx*) (d_qvwlm+nlm_stride), (cplx*) d_vrtp, (cplx*) (d_vrtp+nlm_stride), llim); + cudaEventCreateWithFlags(&ev_sh2, cudaEventDisableTiming ); + cudaEventRecord(ev_sh2, comp_stream); // record the end of vector transform. + + err = cudaMemcpyAsync(d_vrtp + 2*spat_stride, Vr, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 5 error : %s!\n", cudaGetErrorString(err)); return; } + cudaEventCreateWithFlags(&ev_up2, cudaEventDisableTiming ); + cudaEventRecord(ev_up2, xfer_stream); // record the end of scalar SH (theta). + cudaStreamWaitEvent(comp_stream, ev_up2, 0); // compute stream waits for end of data transfer (phi). + // scalar SHT on the GPU + cuda_spat_to_SH<0,1>(shtns, d_vrtp + 2*spat_stride, (cplx*) d_qvwlm, llim); + + cudaStreamWaitEvent(xfer_stream, ev_sh2, 0); // xfer stream waits for end of vector sht. + err = cudaMemcpyAsync(Slm, d_vrtp, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + err = cudaMemcpyAsync(Tlm, d_vrtp+nlm_stride, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + + err = cudaMemcpy(Qlm, d_qvwlm, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + + cudaEventDestroy(ev_up); cudaEventDestroy(ev_up2); cudaEventDestroy(ev_sh2); +// cudaFree(d_qvwlm); +// cudaFreeHost(vw); +} + + +extern "C" +void spat_to_SHqst_gpu2(shtns_cfg shtns, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, const long int llim) +{ + cudaError_t err = cudaSuccess; + cudaEvent_t ev_up, ev_sh2; + const int nlm = shtns->nlm; + const int nlat = shtns->nlat; + const int nphi = shtns->nphi; + const long nlm_stride = shtns->nlm_stride; + const long spat_stride = shtns->spat_stride; + cudaStream_t xfer_stream = shtns->xfer_stream; + cudaStream_t comp_stream = shtns->comp_stream; + + double* d_qvwlm; + double* d_vrtp; + + d_qvwlm = shtns->gpu_mem; + d_vrtp = d_qvwlm + 2*nlm_stride; + + // copy Vt and Vp to gpu (async) + err = cudaMemcpy(d_vrtp, Vt, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 4 error : %s!\n", cudaGetErrorString(err)); return; } + err = cudaMemcpy(d_vrtp + spat_stride, Vp, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice); + if (err != cudaSuccess) { printf("memcpy 3 error : %s!\n", cudaGetErrorString(err)); return; } + cuda_spat_to_SH<1,2>(shtns, d_vrtp, (cplx*) d_qvwlm, llim+1); + scal2sphtor_gpu(shtns, (cplx*) d_qvwlm, (cplx*) (d_qvwlm+nlm_stride), (cplx*) d_vrtp, (cplx*) (d_vrtp+nlm_stride), llim); + cudaEventCreateWithFlags(&ev_sh2, cudaEventDisableTiming ); + cudaEventRecord(ev_sh2, comp_stream); // record the end of vector transform. + + // copy Vr to gpu + err = cudaMemcpyAsync(d_vrtp + 2*spat_stride, Vr, nlat*nphi*sizeof(double), cudaMemcpyHostToDevice, xfer_stream); + if (err != cudaSuccess) { printf("memcpy 5 error : %s!\n", cudaGetErrorString(err)); return; } + cudaEventCreateWithFlags(&ev_up, cudaEventDisableTiming ); + cudaEventRecord(ev_up, xfer_stream); // record the end of data transfer. + cudaStreamWaitEvent(comp_stream, ev_up, 0); // compute stream waits for end of data transfer. + // scalar SHT on the GPU + cuda_spat_to_SH<0,1>(shtns, d_vrtp + 2*spat_stride, (cplx*) d_qvwlm, llim); + + // copy back + cudaStreamWaitEvent(xfer_stream, ev_sh2, 0); // xfer stream waits for end of vector sht. + err = cudaMemcpyAsync(Slm, d_vrtp, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + err = cudaMemcpyAsync(Tlm, d_vrtp+nlm_stride, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost, xfer_stream); + + err = cudaMemcpy(Qlm, d_qvwlm, 2*nlm*sizeof(double), cudaMemcpyDeviceToHost); + + cudaEventDestroy(ev_up); cudaEventDestroy(ev_sh2); +} + +void* fgpu[4][SHT_NTYP] = { + { (void*) SH_to_spat_gpu, (void*) spat_to_SH_gpu, (void*) SHsphtor_to_spat_gpu, (void*) spat_to_SHsphtor_gpu, 0, 0, (void*) SHqst_to_spat_gpu, (void*) spat_to_SHqst_gpu }, + { 0, 0, (void*) SHsphtor_to_spat_gpu2, (void*) spat_to_SHsphtor_gpu2, 0, 0, (void*) SHqst_to_spat_gpu2, (void*) spat_to_SHqst_gpu2 }, + { (void*) SH_to_spat_gpu_hostfft, (void*) spat_to_SH_gpu_hostfft, (void*) SHsphtor_to_spat_gpu_hostfft, 0, 0, 0, (void*) SHqst_to_spat_gpu2_hostfft, 0 }, + { 0, 0, (void*) SHsphtor_to_spat_gpu2_hostfft, 0, 0, 0, (void*) SHqst_to_spat_gpu2_hostfft, 0} +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_gpu_kernels.cu b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_gpu_kernels.cu new file mode 100644 index 000000000..3c59857bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_gpu_kernels.cu @@ -0,0 +1,1573 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +// Various CUDA kernels for SHTns + +// adjustment for cuda +#undef SHT_L_RESCALE_FLY +#undef SHT_ACCURACY +#define SHT_L_RESCALE_FLY 1800 +#define SHT_ACCURACY 1.0e-40 + + +#if (__CUDACC_VER_MAJOR__ < 8) || ( defined(__CUDA_ARCH__) && __CUDA_ARCH__ < 600 ) +__device__ double atomicAdd(double* address, double val) +{ + unsigned long long int* address_as_ull = + (unsigned long long int*)address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, + __double_as_longlong(val + + __longlong_as_double(assumed))); + } while (assumed != old); + return __longlong_as_double(old); +} +#endif + +// define our own suffle macros, to accomodate cuda<9 and cuda>=9 +#if __CUDACC_VER_MAJOR__ < 9 + #define shfl_xor(...) __shfl_xor(__VA_ARGS__) + #define shfl_down(...) __shfl_down(__VA_ARGS__) + #define shfl(...) __shfl(__VA_ARGS__) + #define _any(p) __any(p) + #define _all(p) __all(p) +#else + #define shfl_xor(...) __shfl_xor_sync(0xFFFFFFFF, __VA_ARGS__) + #define shfl_down(...) __shfl_down_sync(0xFFFFFFFF, __VA_ARGS__) + #define shfl(...) __shfl_sync(0xFFFFFFFF, __VA_ARGS__) + #define _any(p) __any_sync(0xFFFFFFFF, p) + #define _all(p) __all_sync(0xFFFFFFFF, p) +#endif + +/* +__device__ __forceinline__ int getLaneId() { + int laneId; + asm("mov.s32 %0, %laneid;" : "=r"(laneId) ); + return laneId; +} + +__device__ __forceinline__ void namedBarrierWait(int name, int numThreads) { + asm volatile("bar.sync %0, %1;" : : "r"(name), "r"(numThreads) : "memory"); +} + +__device__ __forceinline__ void namedBarrierArrived(int name, int numThreads) { + asm volatile("bar.arrive %0, %1;" : : "r"(name), "r"(numThreads) : "memory"); +} +*/ + +/// dim0, dim1 : size in complex numbers ! +/// BLOCK_DIM_Y must be between 1 and 16 +template __global__ void +transpose_cplx_kernel(const double* in, double* out, const int dim0, const int dim1) +{ + const int TILE_DIM = WARPSZE/2; // 16 double2 per warp, read as 32 doubles. + __shared__ double shrdMem[TILE_DIM][TILE_DIM+1][2]; // avoid shared mem conflicts + + const int lx = threadIdx.x >> 1; + const int ly = threadIdx.y; + const int ri = threadIdx.x & 1; // real/imag index + + const int bx = TILE_DIM * blockIdx.x; + const int by = TILE_DIM * blockIdx.y; + + int gx = lx + bx; + int gy = ly + by; + #pragma unroll + for (int repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + shrdMem[ly + repeat][lx][ri] = in[2*(gy_ * dim0 + gx) + ri]; + } + + // transpose tiles: + gx = lx + by; + gy = ly + bx; + + __syncthreads(); + // transpose within tile: + #pragma unroll + for (unsigned repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + out[2*(gy_ * dim1 + gx) + ri] = shrdMem[lx][ly + repeat][ri]; + } +} + +/// dim0, dim1 : size in complex numbers ! +/// BLOCK_DIM_Y must be a power of 2 between 1 and 16 +template __global__ void +transpose_cplx_zero_kernel(const double* in, double* out, const int dim0, const int dim1, const int mmax) +{ + const int TILE_DIM = WARPSZE/2; // 16 double2 per warp, read as 32 doubles. + __shared__ double shrdMem[TILE_DIM][TILE_DIM+1][2]; // avoid shared mem conflicts + + const int ly = threadIdx.y; + const int lx = threadIdx.x >> 1; + const int ri = threadIdx.x & 1; // real/imag index + + const int by = TILE_DIM * blockIdx.y; + const int bx = TILE_DIM * blockIdx.x; + + int gy = ly + by; + int gx = lx + bx; + + if ((gy+(TILE_DIM-BLOCK_DIM_Y) <= mmax) || (gy >= dim1 - mmax)) { // SAFE, no zero to insert + #pragma unroll + for (int repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + shrdMem[ly + repeat][lx][ri] = in[2*(gy_ * dim0 + gx) + ri]; + } + } else { + for (int repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + if ((gy_ <= mmax) || (gy_ >= dim1 - mmax)) { + shrdMem[ly + repeat][lx][ri] = in[2*(gy_ * dim0 + gx) + ri]; + } else { + shrdMem[ly + repeat][lx][ri] = 0.0; + } + } + } + + // transpose tiles: + gy = ly + bx; + gx = lx + by; + + __syncthreads(); + // transpose within tile: + #pragma unroll + for (unsigned repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + out[2*(gy_ * dim1 + gx) + ri] = shrdMem[lx][ly + repeat][ri]; + } +} + +/// dim0, dim1 : size in complex numbers ! +/// BLOCK_DIM_Y must be a power of 2 between 1 and 16 +template __global__ void +transpose_cplx_skip_kernel(const double* in, double* out, const int dim0, const int dim1, const int mmax) +{ + const int TILE_DIM = WARPSZE/2; // 16 double2 per warp, read as 32 doubles. + __shared__ double shrdMem[TILE_DIM][TILE_DIM+1][2]; // avoid shared mem conflicts + + const int lx = threadIdx.x >> 1; + const int ly = threadIdx.y; + const int ri = threadIdx.x & 1; // real/imag index + + const int bx = TILE_DIM * blockIdx.x; + const int by = TILE_DIM * blockIdx.y; + + int gx = lx + bx; + int gy = ly + by; + + if ((gx <= mmax) || (gx >= dim0 - mmax)) { // read only data if m<=mmax + #pragma unroll + for (int repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + shrdMem[ly + repeat][lx][ri] = in[2*(gy_ * dim0 + gx) + ri]; + } + } + + // transpose tiles: + gy = ly + bx; + gx = lx + by; + + __syncthreads(); + // transpose within tile: + if ((gy <= mmax) || (gy+(TILE_DIM-BLOCK_DIM_Y) >= dim0 - mmax)) { // write all useful data (+a bit more), the rest is ignored anyway + #pragma unroll + for (unsigned repeat = 0; repeat < TILE_DIM; repeat += BLOCK_DIM_Y) { + int gy_ = gy+repeat; + out[2*(gy_ * dim1 + gx) + ri] = shrdMem[lx][ly + repeat][ri]; + } + } +} + +/// dim0, dim1 must be multiple of 16. +static void +transpose_cplx(cudaStream_t stream, const double* in, double* out, const int dim0, const int dim1) +{ + const int block_dim_y = 4; // good performance with 4 (MUST be power of 2 between 1 and 16) + dim3 blocks(dim0/16, dim1/16); + dim3 threads(32, block_dim_y); + transpose_cplx_kernel <<>>(in, out, dim0, dim1); +} + +/// dim0, dim1 must be multiple of 16. +static void +transpose_cplx_zero(cudaStream_t stream, const double* in, double* out, const int dim0, const int dim1, const int mmax) +{ + const int block_dim_y = 4; // good performance with 4 (MUST be power of 2 between 1 and 16) + dim3 blocks(dim0/16, dim1/16); + dim3 threads(32, block_dim_y); + transpose_cplx_zero_kernel <<>>(in, out, dim0, dim1, mmax); +} + +/// dim0, dim1 must be multiple of 16. +static void +transpose_cplx_skip(cudaStream_t stream, const double* in, double* out, const int dim0, const int dim1, const int mmax) +{ + const int block_dim_y = 4; // good performance with 4 (MUST be power of 2 between 1 and 16) + dim3 blocks(dim0/16, dim1/16); + dim3 threads(32, block_dim_y); + transpose_cplx_skip_kernel <<>>(in, out, dim0, dim1, mmax); +} + + + +/// On KEPLER, This kernel is fastest with THREADS_PER_BLOCK=256 and NW=1 +template __global__ void +leg_m0_kernel(const double *al, const double *ct, const double *ql, double *q, const int llim, const int nlat_2) +{ + // im = 0 + const int it = blockDim.x * blockIdx.x + threadIdx.x; + const int j = threadIdx.x; + + //__shared__ double ak[THREADS_PER_BLOCK]; // size blockDim.x + //__shared__ double qk[THREADS_PER_BLOCK/2]; // size blockDim.x / 2 + + extern __shared__ double ak[]; // size blockDim.x + double* const qk = ak + blockDim.x; // size blockDim.x / 2 + + ak[j] = al[j]; + if ((j <= llim)&&(j= blockDim.x) { + __syncthreads(); + ak[j] = al[j]; + if ((j <= llim)&&(j +static void leg_m0(shtns_cfg shtns, const double *ql, double *q, const int llim, int spat_dist = 0) +{ + const int nlat_2 = shtns->nlat_2; + double *d_alm = shtns->d_alm; + double *d_ct = shtns->d_ct; + cudaStream_t stream = shtns->comp_stream; + + const int BLOCKSIZE = 256; // good value + const int NW = 1; + + // Launch the Legendre CUDA Kernel + const int threadsPerBlock = BLOCKSIZE; // can be from 32 to 1024, we should try to measure the fastest ! + const int blocksPerGrid = (nlat_2 + BLOCKSIZE*NW - 1) / (BLOCKSIZE*NW); + if (spat_dist == 0) spat_dist = shtns->spat_stride; + for (int f=0; f <<>>(d_alm, d_ct, ql + f*shtns->nlm_stride, q + f*spat_dist, llim, nlat_2); + } +} + + +/* +__inline__ __device__ +void warp_reduce_add_4(double& re, double& ro, double& ie, double& io) { + for (int offset = warpSize/2; offset > 0; offset >>= 1) { + re += shfl_down(re, offset); + ro += shfl_down(ro, offset); + ie += shfl_down(ie, offset); + io += shfl_down(io, offset); + } +} + +__inline__ __device__ +void warp_reduce_add_2(double& ev, double& od) { + for (int offset = warpSize/2; offset > 0; offset >>= 1) { + ev += shfl_down(ev, offset); + od += shfl_down(od, offset); + } +} + +__inline__ __device__ +void warp_reduce_add(double& ev) { + for (int offset = warpSize/2; offset > 0; offset >>= 1) { + ev += shfl_down(ev, offset); + } +} +*/ + +template __global__ void +ileg_m0_kernel(const double* __restrict__ al, const double* __restrict__ ct, const double* __restrict__ q, double *ql, const int llim, const int nlat_2, const int lmax, const int q_dist=0, const int ql_dist=0) +{ + const int it = BLOCKSIZE * blockIdx.x + threadIdx.x; + const int j = threadIdx.x; + + // re-assign each thread an l (transpose) + const int ll = j / (BLOCKSIZE/LSPAN); + + __shared__ double ak[2*LSPAN+2]; // cache + __shared__ double yl[LSPAN*BLOCKSIZE]; // yl is also used for even/odd computation. Ensure LSPAN >= 4. + const int l_inc = BLOCKSIZE; + const double cost = (it < nlat_2) ? ct[it] : 0.0; + double y0, y1; + + if (LSPAN < 4) printf("ERROR: LSPAN<4\n"); + + double my_reo[NFIELDS][LSPAN]; // in registers + if (j < 2*LSPAN+2) ak[j] = al[j]; + + #pragma unroll + for (int f=0; f0) && (BLOCKSIZE > WARPSZE)) __syncthreads(); + yl[j] = y0+y1; // even + yl[BLOCKSIZE +j] = y0-y1; // odd + if (BLOCKSIZE > WARPSZE) __syncthreads(); + + // transpose reo to my_reo + #pragma unroll + for (int i=0, k=0; i WARPSZE) __syncthreads(); + + yl[j] = y0; + yl[l_inc +j] = y1; + al+=2; + while (l <= llim) { + for (int k=0; k WARPSZE) __syncthreads(); + + double qll[NFIELDS]; // accumulator + // now re-assign each thread an l (transpose) + const int itl = ll*l_inc + j % (BLOCKSIZE/LSPAN); + #pragma unroll + for (int f=0; f 0; ofs>>=1) { + #pragma unroll + for (int f=0; f 0; ofs>>=1) { + #pragma unroll + for (int f=0; f WARPSZE) __syncthreads(); + l+=LSPAN; + } +} + +template +static void ileg_m0(shtns_cfg shtns, const double* q, double *ql, const int llim, int q_dist=0, int ql_dist=0) +{ + const int nlat_2 = shtns->nlat_2; + double *d_alm = shtns->d_alm; + double *d_ct = shtns->d_ct; + cudaStream_t stream = shtns->comp_stream; + + const int BLOCKSIZE = 256/NFIELDS; + const int LSPAN_ = 8/NFIELDS; + const int NW = 1; + + const int threadsPerBlock = BLOCKSIZE; // can be from 32 to 1024, we should try to measure the fastest ! + const int blocksPerGrid = (nlat_2 + BLOCKSIZE*NW - 1) / (BLOCKSIZE*NW); + if (q_dist == 0) q_dist = shtns->spat_stride; + if (ql_dist == 0) ql_dist = shtns->nlm_stride; + ileg_m0_kernel<<>>(d_alm, d_ct, q, ql, llim, nlat_2, q_dist, ql_dist); +} + + +/** \internal convert from vector SH to scalar SH + Vlm = st*d(Slm)/dtheta + I*m*Tlm + Wlm = -st*d(Tlm)/dtheta + I*m*Slm +*/ +template __global__ void +sphtor2scal_kernel(const double* __restrict__ mx, const double* __restrict__ slm, const double* __restrict__ tlm, double *vlm, double *wlm, const int llim, const int lmax, const int mres) +{ + // indices for overlapping blocks: + const int ll = (blockDim.x-4) * blockIdx.x + threadIdx.x - 2; // = 2*l + ((imag) ? 1 : 0) + const int j = threadIdx.x; + const int im = blockIdx.y; + + __shared__ double sl[BLOCKSIZE]; + __shared__ double tl[BLOCKSIZE]; + __shared__ double M[BLOCKSIZE]; + + const int m = im*mres; + //int ofs = im*(2*(lmax+1) -m + mres); +// const int xchg = 1 - 2*(ll&1); // +1 for real and -1 for imag +// const int xchg = ll - (ll^1); // -1 for real and +1 for imag + const int ofs = im*(((lmax+1)<<1) -m + mres) + ll; + + if ( (ll >= 0) && (ll < 2*(llim+1-m)) ) { + M[j] = mx[ofs]; + sl[j] = slm[ofs]; + tl[j] = tlm[ofs]; + } else { + M[j] = 0.0; + sl[j] = 0.0; + tl[j] = 0.0; + } + const double mimag = im * mres * (ll - (ll^1)); + + __syncthreads(); + +// if ((j>=2) && (j>1)+1]; + double mu = M[2*(j>>1)+2]; + double v = mimag*tl[(j+2)^1] + (ml*sl[j] + mu*sl[j+4]); + double w = mimag*sl[(j+2)^1] - (ml*tl[j] + mu*tl[j+4]); + vlm[ofs+2*im+2] = v; + wlm[ofs+2*im+2] = w; + } +} + +/** \internal convert from 2 scalar SH to vector SH + Slm = - (I*m*Wlm + MX*Vlm) / (l*(l+1)) + Tlm = - (I*m*Vlm - MX*Wlm) / (l*(l+1)) +**/ +template __global__ void +scal2sphtor_kernel(const double* __restrict__ mx, const double* __restrict__ vlm, const double* __restrict__ wlm, double *slm, double *tlm, const int llim, const int lmax, const int mres) +{ + // indices for overlapping blocks: + const int ll = (blockDim.x-4) * blockIdx.x + threadIdx.x - 2; // = 2*l + ((imag) ? 1 : 0) + const int j = threadIdx.x; + const int im = blockIdx.y; + + __shared__ double vl[BLOCKSIZE]; + __shared__ double wl[BLOCKSIZE]; + __shared__ double M[BLOCKSIZE]; + + const int m = im * mres; + //const int xchg = 1 - 2*(j&1); // +1 for real and -1 for imag + //const int xchg = (j^1) - j; // +1 for real and -1 for imag + int ofs = im*(2*(lmax+1) -m + mres) + ll; + + if ( (ll >= 0) && (ll < 2*(llim+1-m)) ) { + M[j] = mx[ofs]; + } else M[j] = 0.0; + + if ( (ll >= 0) && (ll < 2*(llim+2-m)) ) { + vl[j] = vlm[ofs+2*im]; + wl[j] = wlm[ofs+2*im]; + } else { + vl[j] = 0.0; + wl[j] = 0.0; + } + + int ell = (ll>>1) + m + 1; // +1 because we shift below + + __syncthreads(); + +// if ((j>=2) && (j0)) { + const double mimag = im * mres * ((j^1) -j); + double ll_1 = 1.0 / (ell*(ell+1)); + double ml = M[2*(j>>1)+1]; + double mu = M[2*(j>>1)+2]; + double s = mimag*wl[(j+2)^1] - (ml*vl[j] + mu*vl[j+4]); + double t = mimag*vl[(j+2)^1] + (ml*wl[j] + mu*wl[j+4]); + slm[ofs+2] = s * ll_1; + tlm[ofs+2] = t * ll_1; + } else if (ell <= lmax) { // fill with zeros up to lmax (and l=0 too). + slm[ofs+2] = 0.0; + tlm[ofs+2] = 0.0; + } + } +} + +void sphtor2scal_gpu(shtns_cfg shtns, cplx* d_Slm, cplx* d_Tlm, cplx* d_Vlm, cplx* d_Wlm, int llim, int mmax) +{ + dim3 blocks((2*(shtns->lmax+2)+MAX_THREADS_PER_BLOCK-5)/(MAX_THREADS_PER_BLOCK-4), mmax+1); + dim3 threads(MAX_THREADS_PER_BLOCK, 1); + sphtor2scal_kernel <<< blocks, threads,0, shtns->comp_stream >>> + (shtns->d_mx_stdt, (double*) d_Slm, (double*) d_Tlm, (double*) d_Vlm, (double*) d_Wlm, llim, shtns->lmax, shtns->mres); + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { printf("sphtor2scal_gpu error : %s!\n", cudaGetErrorString(err)); return; } +} + +void scal2sphtor_gpu(shtns_cfg shtns, cplx* d_Vlm, cplx* d_Wlm, cplx* d_Slm, cplx* d_Tlm, int llim) +{ + dim3 blocks((2*(shtns->lmax+2)+MAX_THREADS_PER_BLOCK-5)/(MAX_THREADS_PER_BLOCK-4), shtns->mmax+1); + dim3 threads(MAX_THREADS_PER_BLOCK, 1); + scal2sphtor_kernel <<comp_stream>>> + (shtns->d_mx_van, (double*) d_Vlm, (double*) d_Wlm, (double*)d_Slm, (double*)d_Tlm, llim, shtns->lmax, shtns->mres); + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { printf("scal2sphtor_gpu error : %s!\n", cudaGetErrorString(err)); return; } +} + + + +/// requirements : blockSize must be 1 in the y-direction and THREADS_PER_BLOCK in the x-direction. +/// llim MUST BE <= 1800 +/// S can only be 0 (for scalar) or 1 (for spin 1 / vector) +template +static __global__ void leg_m_lowllim_kernel( + const double* __restrict__ al, const double* __restrict__ ct, const double* __restrict__ ql, double *q, + const int llim, const int nlat_2, const int lmax, const int mres, const int nphi, const int ql_dist=0, const int q_dist=0) +{ + const int it = BLOCKSIZE*NW * blockIdx.x + threadIdx.x; + const int im = blockIdx.y; + const int j = threadIdx.x; + const int m_inc = 2*nlat_2; + const int k_inc = 1; + + __shared__ double ak[BLOCKSIZE]; // size blockDim.x + __shared__ double qk[NFIELDS][BLOCKSIZE]; // size blockDim.x * NFIELDS + + double cost[NW]; + double y0[NW]; + double y1[NW]; + #pragma unroll + for (int i=0; i0 + double rer[NFIELDS][NW], ror[NFIELDS][NW], rei[NFIELDS][NW], roi[NFIELDS][NW]; + int m = im*mres; + int l = (im*(2*(lmax+1)-(m+mres)))>>1; + al += 2*(l+m); + ql += 2*(l + S*im); // allow vector transforms where llim = lmax+1 + + #pragma unroll + for (int i=0; i>= 1); + + #pragma unroll + for (int i=0; i +static void leg_m_lowllim(shtns_cfg shtns, const double *ql, double *q, const int llim, const int mmax, int spat_dist=0) +{ + const int lmax = shtns->lmax; + const int mres = shtns->mres; + const int nlat_2 = shtns->nlat_2; + const int nphi = shtns->nphi; + double *d_alm = shtns->d_alm; + double *d_ct = shtns->d_ct; + cudaStream_t stream = shtns->comp_stream; + + const int BLOCKSIZE = 256; // good value + const int NW = 2; + + // Launch the Legendre CUDA Kernel + const int threadsPerBlock = BLOCKSIZE; // can be from 32 to 1024, we should try to measure the fastest ! + const int blocksPerGrid = (nlat_2 + BLOCKSIZE*NW - 1) / (BLOCKSIZE*NW); + if (spat_dist == 0) spat_dist = shtns->spat_stride; + dim3 blocks(blocksPerGrid, mmax+1); + dim3 threads(threadsPerBlock, 1); + leg_m_lowllim_kernel <<>>(d_alm, d_ct, (double*) ql, (double*) q, llim, nlat_2, lmax,mres, nphi, shtns->nlm_stride, spat_dist); +} + +/// requirements : blockSize must be 1 in the y-direction and THREADS_PER_BLOCK in the x-direction. +/// llim can be arbitrarily large (> 1800) +template __global__ void +leg_m_highllim_kernel(const double *al, const double *ct, const double *ql, double *q, const int llim, const int nlat_2, const int lmax, const int mres, const int nphi) +{ + const int it = blockDim.x * blockIdx.x + threadIdx.x; + const int im = blockIdx.y; + const int j = threadIdx.x; + const int m_inc = 2*nlat_2; + const int k_inc = 1; + + //__shared__ double ak[THREADS_PER_BLOCK]; // cache + //__shared__ double qk[THREADS_PER_BLOCK]; + // two arrays in shared memory of size blockDim.x : + extern __shared__ double ak[]; + double* const qk = ak + blockDim.x; + + const double cost = (it < nlat_2) ? ct[it] : 0.0; + + if (im==0) { + int l = 0; + double y0 = al[0]; + if (S==1) y0 *= rsqrt(1.0 - cost*cost); + double re = y0 * ql[0]; + double y1 = y0 * al[1] * cost; + double ro = y1 * ql[2]; + al+=2; l+=2; + while(l0 + int m = im*mres; + int l = (im*(2*(lmax+1)-(m+mres)))>>1; + al += 2*(l+m); + ql += 2*(l + S*im); + double rer,ror, rei,roi, y0, y1; + ror = 0.0; roi = 0.0; + rer = 0.0; rei = 0.0; + y1 = sqrt(1.0 - cost*cost); // sin(theta) + if (_any(m - llim*y1 <= max(50,llim/200))) { // polar optimization (see Reinecke 2013), avoiding warp divergence + y0 = 1.0; // y0 + l = m - S; + int ny = 0; + int nsint = 0; + do { // sin(theta)^(m-S) (use rescaling to avoid underflow) + if (l&1) { + y0 *= y1; + ny += nsint; + if (_any(y0 < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR))) { // avoid warp divergence + ny--; + y0 *= SHT_SCALE_FACTOR; + } + } + y1 *= y1; + nsint += nsint; + if (_any(y1 < 1.0/SHT_SCALE_FACTOR)) { // avoid warp divergence + nsint--; + y1 *= SHT_SCALE_FACTOR; + } + } while(l >>= 1); + y0 *= al[0]; + y1 = 0.0; +// y1 = al[1]*y0*cost; + + l=m; int ka = WARPSZE; + const int ofs = j & 0xFFE0; + + while ( _all(ny<0) && (l= WARPSZE) { + ak[j] = al[(j&31)]; + ka=0; + } + y1 = ak[ka+1+ofs]*cost*y0 + ak[ka+ofs]*y1; + y0 = ak[ka+3+ofs]*cost*y1 + ak[ka+2+ofs]*y0; + l+=2; al+=4; ka+=4; + if (fabs(y1) > SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) + { // rescale when value is significant + ++ny; + y0 *= 1.0/SHT_SCALE_FACTOR; + y1 *= 1.0/SHT_SCALE_FACTOR; + } + } + + ka = WARPSZE; + while (l= WARPSZE) { // cache coefficients + ak[j] = al[(j&31)]; + qk[j] = ql[2*l+(j&31)]; + ka = 0; + } + y1 = ak[ka+1+ofs]*cost*y0 + ak[ka+ofs]*y1; + if (ny==0) { + rer += y0 * qk[ka+ofs]; // real + rei += y0 * qk[ka+1+ofs]; // imag + ror += y1 * qk[ka+2+ofs]; // real + roi += y1 * qk[ka+3+ofs]; // imag + } + else if (fabs(y0) > SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) + { // rescale when value is significant + ++ny; + y0 *= 1.0/SHT_SCALE_FACTOR; + y1 *= 1.0/SHT_SCALE_FACTOR; + } + l+=2; al+=4; + y0 = ak[ka+3+ofs]*cost*y1 + ak[ka+2+ofs]*y0; + ka+=4; + } + if ((l==llim) && (ny==0)) { + rer += y0 * ql[2*l]; + rei += y0 * ql[2*l+1]; + } + } + + /// store mangled for complex fft + double nr = rer+ror; + double sr = rer-ror; + const double sgn = 1 - 2*(j&1); + rei = shfl_xor(rei, 1); + roi = shfl_xor(roi, 1); + double nix = sgn*(rei+roi); + double six = sgn*(rei-roi); + if (it < nlat_2) { + q[im*m_inc + it*k_inc] = nr - nix; + q[(nphi-im)*m_inc + it*k_inc] = nr + nix; + q[im*m_inc + (nlat_2*2-1-it)*k_inc] = sr + six; + q[(nphi-im)*m_inc + (nlat_2*2-1-it)*k_inc] = sr - six; + } + } +} + +template +static void leg_m_highllim(shtns_cfg shtns, const double *ql, double *q, const int llim, const int mmax, int spat_dist = 0) +{ + const int lmax = shtns->lmax; + const int mres = shtns->mres; + const int nlat_2 = shtns->nlat_2; + const int nphi = shtns->nphi; + double *d_alm = shtns->d_alm; + double *d_ct = shtns->d_ct; + cudaStream_t stream = shtns->comp_stream; + + const int BLOCKSIZE = 256; // good value + const int NW = 1; + + // Launch the Legendre CUDA Kernel + const int threadsPerBlock = BLOCKSIZE; // can be from 32 to 1024, we should try to measure the fastest ! + const int blocksPerGrid = (nlat_2 + BLOCKSIZE*NW - 1) / (BLOCKSIZE*NW); + if (spat_dist == 0) spat_dist = shtns->spat_stride; + dim3 blocks(blocksPerGrid, mmax+1); + dim3 threads(threadsPerBlock, 1); + for (int f=0; f <<>>(d_alm, d_ct, ql + f*shtns->nlm_stride, q + f*spat_dist, llim, nlat_2, lmax,mres, nphi); + } +} + + +template __global__ void +ileg_m_lowllim_kernel(const double* __restrict__ al, const double* __restrict__ ct, const double* __restrict__ q, double *ql, const int llim, const int nlat_2, const int lmax, const int mres, const int nphi, const int q_dist=0, const int ql_dist=0) +{ + const int it = BLOCKSIZE * blockIdx.x + threadIdx.x; + const int j = threadIdx.x; + const int im = blockIdx.y; + const int m_inc = 2*nlat_2; +// const int k_inc = 1; + + // re-assign each thread an l (transpose) + const int ll = j / (BLOCKSIZE/LSPAN); + const int ri = j / (BLOCKSIZE/(2*LSPAN)) % 2; // real (0) or imag (1) + + __shared__ double ak[2*LSPAN+2]; // cache + __shared__ double yl[LSPAN*BLOCKSIZE]; // yl is also used for even/odd computation. Ensure LSPAN >= 4. + const int l_inc = BLOCKSIZE; + const double cost = (it < nlat_2) ? ct[it] : 0.0; + double y0, y1; + + if (LSPAN < 4) printf("ERROR: LSPAN<4\n"); + + if (im == 0) { + double my_reo[NFIELDS][LSPAN]; // in registers + if (j < 2*LSPAN+2) ak[j] = al[j]; + + #pragma unroll + for (int f=0; f0) && (BLOCKSIZE > WARPSZE)) __syncthreads(); + yl[j] = y0+y1; // even + yl[BLOCKSIZE +j] = y0-y1; // odd + if (BLOCKSIZE > WARPSZE) __syncthreads(); + + // transpose reo to my_reo + #pragma unroll + for (int i=0, k=0; i WARPSZE) __syncthreads(); + + yl[j] = y0; + yl[l_inc +j] = y1; + al+=2; + while (l <= llim) { + for (int k=0; k WARPSZE) __syncthreads(); + + double qll[NFIELDS]; // accumulator + // now re-assign each thread an l (transpose) + const int itl = ll*l_inc + j % (BLOCKSIZE/LSPAN); + #pragma unroll + for (int f=0; f 0; ofs>>=1) { + #pragma unroll + for (int f=0; f 0; ofs>>=1) { + #pragma unroll + for (int f=0; f WARPSZE) __syncthreads(); + l+=LSPAN; + } + } else { // im > 0 + double my_reo[NFIELDS][2*LSPAN]; // in registers + int m = im*mres; + int l = (im*(2*(lmax+1)-(m+mres)))>>1; + al += 2*(l+m); + ql += 2*(l + S*im); // allow vector transforms where llim = lmax+1 + + if (j < 2*LSPAN+2) ak[j] = al[j]; + const double sgn = 2*(j&1) - 1; // -/+ + + #pragma unroll + for (int f=0; f0) && (BLOCKSIZE > WARPSZE)) __syncthreads(); + + yl[j] = qer + qor; // rer + yl[BLOCKSIZE +j] = qer - qor; // ror + yl[2*BLOCKSIZE +j] = sgn*(y0 - y1); // rei + yl[3*BLOCKSIZE +j] = sgn*(y0 + y1); // roi + + if (BLOCKSIZE > WARPSZE) __syncthreads(); + // transpose yl to my_reo + #pragma unroll + for (int i=0, k=0; i>= 1); + if (it < nlat_2) y0 *= ct[it + nlat_2]; // include quadrature weights. + y1 = ak[1]*y0*cost; + + l=m; al+=2; + while (l <= llim) { + if (BLOCKSIZE > WARPSZE) __syncthreads(); + for (int k=0; k WARPSZE) __syncthreads(); + double qlri[NFIELDS]; // accumulator + const int itl = ll*l_inc + j % (BLOCKSIZE/(2*LSPAN)); + #pragma unroll + for (int f=0; f 0; ofs>>=1) { + #pragma unroll + for (int f=0; f 0; ofs>>=1) { + #pragma unroll + for (int f=0; f +static void ileg_m_lowllim(shtns_cfg shtns, const double* q, double *ql, const int llim, int q_dist=0, int ql_dist=0) +{ + const int lmax = shtns->lmax; + const int mres = shtns->mres; + const int nlat_2 = shtns->nlat_2; + const int nphi = shtns->nphi; + int mmax = shtns->mmax; + double *d_alm = shtns->d_alm; + double *d_ct = shtns->d_ct; + cudaStream_t stream = shtns->comp_stream; + + const int BLOCKSIZE = 256/NFIELDS; + const int LSPAN_ = 8/NFIELDS; + const int NW = 1; + + const int threadsPerBlock = BLOCKSIZE; // can be from 32 to 1024, we should try to measure the fastest ! + const int blocksPerGrid = (nlat_2 + BLOCKSIZE*NW - 1) / (BLOCKSIZE*NW); + if (q_dist == 0) q_dist = shtns->spat_stride; + if (ql_dist == 0) ql_dist = shtns->nlm_stride; + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + dim3 blocks(blocksPerGrid, mmax+1); + dim3 threads(threadsPerBlock, 1); + ileg_m_lowllim_kernel<<>>(d_alm, d_ct, (double*) q, (double*) ql, llim, nlat_2, lmax,mres, nphi, q_dist, ql_dist); +} + + +template __global__ void +ileg_m_highllim_kernel(const double *al, const double *ct, const double *q, double *ql, const int llim, const int nlat_2, const int lmax, const int mres, const int nphi) +{ + const int it = BLOCKSIZE * blockIdx.x + threadIdx.x; + const int j = threadIdx.x; + const int im = blockIdx.y; + const int m_inc = 2*nlat_2; +// const int k_inc = 1; + + __shared__ double ak[2*LSPAN+2]; // cache + __shared__ double yl[LSPAN*BLOCKSIZE]; + __shared__ double reo[4*BLOCKSIZE]; + const int l_inc = BLOCKSIZE; + const double cost = (it < nlat_2) ? ct[it] : 0.0; + double y0, y1; + + + if (im == 0) { + if (j < 2*LSPAN+2) ak[j] = al[j]; + if (BLOCKSIZE > WARPSZE) __syncthreads(); + y0 = (it < nlat_2) ? q[it] : 0.0; // north + y1 = (it < nlat_2) ? q[nlat_2*2-1 - it] : 0.0; // south + reo[j] = y0+y1; // even + reo[BLOCKSIZE +j] = y0-y1; // odd + + int l = 0; + y0 = (it < nlat_2) ? ct[it + nlat_2] : 0.0; // weights are stored just after ct. + if (S==1) y0 *= rsqrt(1.0 - cost*cost); + y0 *= ak[0]; + y1 = y0 * ak[1] * cost; + yl[j] = y0; + yl[l_inc +j] = y1; + al+=2; + while (l <= llim) { + for (int k=0; k WARPSZE) __syncthreads(); + double qll = 0.0; // accumulator + // now re-assign each thread an l (transpose) + const int ll = j / (BLOCKSIZE/LSPAN); + for (int i=0; i WARPSZE) printf("ERROR\n"); + + for (int ofs = BLOCKSIZE/(LSPAN*2); ofs > 0; ofs>>=1) { + qll += shfl_down(qll, ofs, BLOCKSIZE/LSPAN); + } + if ( ((j % (BLOCKSIZE/LSPAN)) == 0) && ((l+ll)<=llim) ) { // write result + if (nlat_2 <= BLOCKSIZE) { // do we need atomic add or not ? + ql[2*(l+ll)] = qll; + } else { + atomicAdd(ql+2*(l+ll), qll); // VERY slow atomic add on Kepler. + } + } + if (j<2*LSPAN) ak[j+2] = al[j]; + if (BLOCKSIZE > WARPSZE) __syncthreads(); + l+=LSPAN; + } + } else { // im > 0 + int m = im*mres; + int l = (im*(2*(lmax+1)-(m+mres)))>>1; + al += 2*(l+m); + ql += 2*(l + S*im); // allow vector transforms where llim = lmax+1 + + if (j < 2*LSPAN+2) ak[j] = al[j]; + if (BLOCKSIZE > WARPSZE) __syncthreads(); + const double sgn = 2*(j&1) - 1; // -/+ + y0 = (it < nlat_2) ? q[im*m_inc + it] : 0.0; // north imag (ani) + double qer = (it < nlat_2) ? q[(nphi-im)*m_inc + it] : 0.0; // north real (an) + y1 = (it < nlat_2) ? q[im*m_inc + nlat_2*2-1-it] : 0.0; // south imag (asi) + double qor = (it < nlat_2) ? q[(nphi-im)*m_inc + nlat_2*2-1-it] : 0.0; // south real (as) + double qei = y0-qer; qer += y0; // ani = -qei[lane+1], bni = qei[lane-1] + double qoi = y1-qor; qor += y1; // bsi = -qoi[lane-1], asi = qoi[lane+1]; + y0 = shfl_xor(qei, 1); // exchange between adjacent lanes. + y1 = shfl_xor(qoi, 1); + reo[j] = qer + qor; // rer + reo[BLOCKSIZE +j] = qer - qor; // ror + reo[2*BLOCKSIZE +j] = sgn*(y0 - y1); // rei + reo[3*BLOCKSIZE +j] = sgn*(y0 + y1); // roi + + y1 = sqrt(1.0 - cost*cost); // sin(theta) + + y0 = 0.5; // y0 + l = m - S; + int ny = 0; + int nsint = 0; + do { // sin(theta)^(m-S) (use rescaling to avoid underflow) + if (l&1) { + y0 *= y1; + ny += nsint; + // the use of _any leads to wrong results. On KEPLER it is also slower. + // if (_any(y0 < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR))) { // avoid warp divergence + if (y0 < (SHT_ACCURACY+1.0/SHT_SCALE_FACTOR)) { + ny--; + y0 *= SHT_SCALE_FACTOR; + } + } + y1 *= y1; + nsint += nsint; + // if (_any(y1 < 1.0/SHT_SCALE_FACTOR)) { // avoid warp divergence + if (y1 < 1.0/SHT_SCALE_FACTOR) { + nsint--; + y1 *= SHT_SCALE_FACTOR; + } + } while(l >>= 1); + y0 *= ak[0]; + if (it < nlat_2) y0 *= ct[it + nlat_2]; // include quadrature weights. + y1 = ak[1]*y0*cost; + + + l=m; al+=2; + while (l <= llim) { + for (int k=0; k SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0)) + if (fabs(y0) > SHT_ACCURACY*SHT_SCALE_FACTOR + 1.0) + { // rescale when value is significant + ++ny; + y0 *= 1.0/SHT_SCALE_FACTOR; + y1 *= 1.0/SHT_SCALE_FACTOR; + } + } + al += 4; + } + + if (BLOCKSIZE > WARPSZE) __syncthreads(); + double qlri = 0.0; // accumulator + // now re-assign each thread an l (transpose) + const int ll = j / (BLOCKSIZE/LSPAN); + const int ri = j / (BLOCKSIZE/(2*LSPAN)) % 2; // real (0) or imag (1) + if (ll+l <= llim) { + for (int i=0; i WARPSZE) printf("ERROR\n"); + + for (int ofs = BLOCKSIZE/(LSPAN*4); ofs > 0; ofs>>=1) { + qlri += shfl_down(qlri, ofs, BLOCKSIZE/(LSPAN*2)); + } + if ( ((j % (BLOCKSIZE/(2*LSPAN))) == 0) && ((l+ll)<=llim) ) { // write result + if (nlat_2 <= BLOCKSIZE) { // do we need atomic add or not ? + ql[2*(l+ll)+ri] = qlri; + } else { + atomicAdd(ql+2*(l+ll)+ri, qlri); // VERY slow atomic add on Kepler. + } + } + if (j<2*LSPAN) ak[j+2] = al[j]; + if (BLOCKSIZE > WARPSZE) __syncthreads(); + l+=LSPAN; + } + } +} + +template +static void ileg_m_highllim(shtns_cfg shtns, const double* q, double *ql, const int llim, int q_dist=0, int ql_dist=0) +{ + const int lmax = shtns->lmax; + const int mres = shtns->mres; + const int nlat_2 = shtns->nlat_2; + const int nphi = shtns->nphi; + int mmax = shtns->mmax; + double *d_alm = shtns->d_alm; + double *d_ct = shtns->d_ct; + cudaStream_t stream = shtns->comp_stream; + + const int BLOCKSIZE = 256/NFIELDS; + const int LSPAN_ = 8/NFIELDS; + const int NW = 1; + + const int threadsPerBlock = BLOCKSIZE; // can be from 32 to 1024, we should try to measure the fastest ! + const int blocksPerGrid = (nlat_2 + BLOCKSIZE*NW - 1) / (BLOCKSIZE*NW); + if (q_dist == 0) q_dist = shtns->spat_stride; + if (ql_dist == 0) ql_dist = shtns->nlm_stride; + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + dim3 blocks(blocksPerGrid, mmax+1); + dim3 threads(threadsPerBlock, 1); + for (int f=0; f<<>>(d_alm, d_ct, q + f*q_dist, ql + f*ql_dist, llim, nlat_2, lmax,mres, nphi); + } +} + + +template +static void legendre(shtns_cfg shtns, const double *ql, double *q, const int llim, const int mmax, int spat_dist = 0) +{ + if (spat_dist == 0) spat_dist = shtns->spat_stride; + if (mmax==0) { + leg_m0(shtns, ql, q, llim); + } else { + if (llim <= SHT_L_RESCALE_FLY) { + leg_m_lowllim(shtns, ql, q, llim, mmax, spat_dist); + } else { + leg_m_highllim(shtns, ql, q, llim, mmax); + } + } +} + +/// Perform SH transform on data that is already on the GPU. d_Qlm and d_Vr are pointers to GPU memory (obtained by cudaMalloc() for instance) +template +static void ilegendre(shtns_cfg shtns, const double *q, double* ql, const int llim, int spat_dist = 0) +{ + int mmax = shtns->mmax; + const int mres = shtns->mres; + + if (spat_dist == 0) spat_dist = shtns->spat_stride; + cudaMemsetAsync(ql, 0, sizeof(double) * NFIELDS * shtns->nlm_stride, shtns->comp_stream); // set to zero before we start. + if (llim < mmax*mres) mmax = llim / mres; // truncate mmax too ! + if (mmax==0) { + ileg_m0(shtns, q, ql, llim, spat_dist, shtns->nlm_stride); + } else + if (llim <= SHT_L_RESCALE_FLY) { + ileg_m_lowllim(shtns, q, ql, llim, spat_dist, shtns->nlm_stride); + } else { + ileg_m_highllim(shtns, q, ql, llim, spat_dist, shtns->nlm_stride); + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_init.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_init.c new file mode 100644 index 000000000..3acf56981 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_init.c @@ -0,0 +1,2152 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/******************************************************************** + * SHTns : Spherical Harmonic Transform for numerical simulations. * + * written by Nathanael Schaeffer / CNRS * + ********************************************************************/ + +/** \internal \file SHT.c + * \brief main source file for SHTns. + * This files contains initialization code and also some partial transforms (point or latitudinal evaluations) + */ + +#include +#include +// global variables definitions +#include "sht_private.h" + +// cycle counter from FFTW +#include "fftw3/cycle.h" + +// chained list of sht_setup : start with NULL +shtns_cfg sht_data = NULL; +#ifdef _OPENMP + int omp_threads = 1; // multi-thread disabled by default. + #if HAVE_LIBFFTW3_OMP + #define OMP_FFTW + #endif +#else + #define omp_threads 1 +#endif + +#ifdef HAVE_LIBCUFFT + int cuda_gpu_id = 0; // by default, use gpu device 0 +#endif + +static int verbose = 0; // runtime verbosity control: 0 no output, 1 output, 2 debug (if compiled in) +void shtns_verbose(int v) { + verbose = v; +} + +#ifdef SHTNS_ISHIOKA +#define _SHTNS_ID_ _SIMD_NAME_ ",ishioka" +#else +#define _SHTNS_ID_ _SIMD_NAME_ +#endif + +/// \internal Abort program with error message. +static void shtns_runerr(const char * error_text) +{ + printf("*** [" PACKAGE_NAME "] Run-time error : %s\n",error_text); + exit(1); +} + +/* PUBLIC useful functions */ + +/// returns the l=0, m=0 SH coefficient corresponding to a uniform value of 1. +double sh00_1(shtns_cfg shtns) { + return shtns->Y00_1; +} +/// returns the l=1, m=0 SH coefficient corresponding to cos(theta). +double sh10_ct(shtns_cfg shtns) { + return shtns->Y10_ct; +} +/// returns the l=1, m=1 SH coefficient corresponding to sin(theta).cos(phi). +double sh11_st(shtns_cfg shtns) { + return shtns->Y11_st; +} +/// returns the l,m SH coefficient corresponding to unit energy. +double shlm_e1(shtns_cfg shtns, int l, int m) { + double x = shtns->Y00_1/sqrt(4.*M_PI); + if (SHT_NORM == sht_schmidt) x *= sqrt(2*l+1); + if ((m!=0)&&((shtns->norm & SHT_REAL_NORM)==0)) x *= sqrt(0.5); + return(x); +} + +/// \code return (mmax+1)*(lmax+1) - mres*(mmax*(mmax+1))/2; \endcode */ +/// \ingroup init +long nlm_calc(long lmax, long mmax, long mres) +{ + if (mmax*mres > lmax) mmax = lmax/mres; + return (mmax+1)*(lmax+1) - ((mmax*mres)*(mmax+1))/2; // this is wrong if lmax < mmax*mres +} + +/// \code return mmax*mmax*mres + (2*mmax+1)*(lmax-mmax*mres+1); \endcode */ +/// \ingroup init +long nlm_cplx_calc(long lmax, long mmax, long mres) +{ +// return 2*nlm_calc(lmax,mmax,mres) - (lmax+1); + if (mmax*mres > lmax) mmax = lmax/mres; + return (2*mmax+1)*(lmax+1) - (mmax*mres)*(mmax+1); // this is wrong if lmax < mmax*mres +} + + +/* LEGENDRE FUNCTIONS */ +#include "sht_legendre.c" + + +/// \internal return the smallest power of 2 larger than n. +static int next_power_of_2(int n) +{ + int f = 1; + if ( (n<=0) || (n>(1<<(sizeof(int)*8-2))) ) return 0; + while (ffmax. +static int fft_int(int n, int fmax) +{ + int k,f; + + if (n<=fmax) return n; + if (fmax<2) return 0; + if (fmax==2) return next_power_of_2(n); + + n -= 2-(n&1); // only even n + do { + n+=2; f=2; + while ((2*f <= n) && ((n&f)==0)) f *= 2; // no divisions for factor 2. + k=3; + while ((k<=fmax) && (k*f <= n)) { + while ((k*f <= n) && (n%(k*f)==0)) f *= k; + k+=2; + } + } while (f != n); + + k = next_power_of_2(n); // what is the closest power of 2 ? + if ((k-n)*33 < n) return k; // rather choose power of 2 if not too far (3%) + + return n; +} + +/* SHT FUNCTIONS */ +#include "sht_func.c" + +#include "sht_com.c" + +/* + INTERNAL INITIALIZATION FUNCTIONS +*/ + +// sht algorithms (hyb, fly1, ...) +enum sht_algos { SHT_MEM, SHT_SV, + SHT_FLY1, SHT_FLY2, SHT_FLY3, SHT_FLY4, SHT_FLY6, SHT_FLY8, + SHT_GPU1, SHT_GPU2, SHT_GPU3, SHT_GPU4, + SHT_OMP1, SHT_OMP2, SHT_OMP3, SHT_OMP4, SHT_OMP6, SHT_OMP8, + SHT_NALG }; + +char* sht_name[SHT_NALG] = {"mem", "s+v", "fly1", "fly2", "fly3", "fly4", "fly6", "fly8", "gpu1", "gpu2", "gpu3", "gpu4", "omp1", "omp2", "omp3", "omp4", "omp6", "omp8" }; +char* sht_type[SHT_NTYP] = {"syn", "ana", "vsy", "van", "gsp", "gto", "v3s", "v3a" }; +char* sht_var[SHT_NVAR] = {"std", "ltr", "m" }; +int sht_npar[SHT_NTYP] = {2, 2, 4, 4, 3, 3, 6, 6}; + +#ifdef SHTNS_MEM +extern void* fmem[SHT_NTYP]; +extern void* fmem_l[SHT_NTYP]; +extern void* fmem_m0[SHT_NTYP]; +extern void* fmem_m0l[SHT_NTYP]; +#endif +extern void* ffly[6][SHT_NTYP]; +extern void* ffly_m[6][SHT_NTYP]; +extern void* ffly_m0[6][SHT_NTYP]; +#ifdef _OPENMP +extern void* fomp[6][SHT_NTYP]; +#endif +#ifdef HAVE_LIBCUFFT +extern void* fgpu[4][SHT_NTYP]; +#endif + +// big array holding all sht functions, variants and algorithms +void* sht_func[SHT_NVAR][SHT_NALG][SHT_NTYP]; + +/// \internal use on-the-fly alogorithm (guess without measuring) +static void set_sht_fly(shtns_cfg shtns, int typ_start) +{ + int algo = SHT_FLY2; + if ((shtns->nthreads > 1) && (sht_func[0][SHT_OMP2][typ_start])) algo = SHT_OMP2; + for (int it=typ_start; itftable[v][it] = sht_func[v][algo][it]; + } +} + +/// \internal use gpu alogorithm where possible +static void set_sht_gpu(shtns_cfg shtns, int typ_start) +{ + int algo = SHT_GPU1; + for (int it=typ_start; itftable[v][it] = sht_func[v][algo][it]; + } +} + +#ifdef SHTNS_MEM +/// \internal choose memory algorithm everywhere. +static void set_sht_mem(shtns_cfg shtns) { + for (int it=0; itftable[v][it] = sht_func[v][SHT_MEM][it]; + shtns->ftable[SHT_M][it] = sht_func[SHT_M][SHT_FLY2][it]; // there is no "mem" algo for SHT_M + } +} +#endif + +/// \internal copy all algos to sht_func array (should be called by set_grid before choosing variants). +/// if nphi is 1, axisymmetric algorithms are used. +static void init_sht_array_func(shtns_cfg shtns) +{ + int it, j; + int alg_lim = SHT_FLY8; + + if (shtns->nlat_2 < 8*VSIZE2) { // limit available on-the-fly algorithm to avoid overflow (and segfaults). + it = shtns->nlat_2 / VSIZE2; + switch(it) { + case 0 : alg_lim = SHT_FLY1-1; break; + case 1 : alg_lim = SHT_FLY1; break; + case 2 : alg_lim = SHT_FLY2; break; + case 3 : alg_lim = SHT_FLY3; break; + case 4 : ; + case 5 : alg_lim = SHT_FLY4; break; + default : alg_lim = SHT_FLY6; + } + } + alg_lim -= SHT_FLY1; + + memset(sht_func, 0, SHT_NVAR*SHT_NTYP*SHT_NALG*sizeof(void*) ); // zero out. + sht_func[SHT_STD][SHT_SV][SHT_TYP_3SY] = SHqst_to_spat_2; + sht_func[SHT_LTR][SHT_SV][SHT_TYP_3SY] = SHqst_to_spat_2l; + sht_func[SHT_STD][SHT_SV][SHT_TYP_3AN] = spat_to_SHqst_2; + sht_func[SHT_LTR][SHT_SV][SHT_TYP_3AN] = spat_to_SHqst_2l; + sht_func[SHT_M][SHT_SV][SHT_TYP_3SY] = SHqst_to_spat_2ml; + sht_func[SHT_M][SHT_SV][SHT_TYP_3AN] = spat_to_SHqst_2ml; + + if (shtns->nphi==1) { // axisymmetric transform requested. + for (int j=0; j<=alg_lim; j++) { + memcpy(sht_func[SHT_STD][SHT_FLY1 + j], &ffly_m0[j], sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_LTR][SHT_FLY1 + j], &ffly_m0[j], sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_M][SHT_FLY1 + j], &ffly_m[j], sizeof(void*)*SHT_NTYP); + } + #ifdef SHTNS_MEM + memcpy(sht_func[SHT_STD][SHT_MEM], &fmem_m0, sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_LTR][SHT_MEM], &fmem_m0l, sizeof(void*)*SHT_NTYP); + #endif + } else { + for (int j=0; j<=alg_lim; j++) { + if (shtns->nthreads <= 2) { // don't consider non-parallel algos for large number of threads. + memcpy(sht_func[SHT_STD][SHT_FLY1 + j], &ffly[j], sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_LTR][SHT_FLY1 + j], &ffly[j], sizeof(void*)*SHT_NTYP); + } + memcpy(sht_func[SHT_M][SHT_FLY1 + j], &ffly_m[j], sizeof(void*)*SHT_NTYP); + #ifdef _OPENMP + memcpy(sht_func[SHT_STD][SHT_OMP1 + j], &fomp[j], sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_LTR][SHT_OMP1 + j], &fomp[j], sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_M][SHT_OMP1 + j], &ffly_m[j], sizeof(void*)*SHT_NTYP); // no omp algo for SHT_M, use fly instead + #endif + } + #ifdef SHTNS_MEM + memcpy(sht_func[SHT_STD][SHT_MEM], &fmem, sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_LTR][SHT_MEM], &fmem_l, sizeof(void*)*SHT_NTYP); + #endif + #ifdef HAVE_LIBCUFFT + for (int j=0; j<4; j++) { + memcpy(sht_func[SHT_STD][SHT_GPU1+j], &fgpu[j], sizeof(void*)*SHT_NTYP); + memcpy(sht_func[SHT_LTR][SHT_GPU1+j], &fgpu[j], sizeof(void*)*SHT_NTYP); + } + #endif + } + + #ifdef SHTNS_MEM + set_sht_mem(shtns); // default transform is MEM + #else + set_sht_fly(shtns, 0); + #endif +} + + +/// \internal returns an aproximation of the memory usage in mega bytes for the scalar matrices. +/// \ingroup init +static double sht_mem_size(int lmax, int mmax, int mres, int nlat) +{ + double s = 1./(1024*1024); + s *= ((nlat+1)/2) * sizeof(double) * nlm_calc(lmax, mmax, mres); + return s; +} + +/// \internal return the number of shtns config that contain a reference to the memory location *pp. +static int ref_count(shtns_cfg shtns, void* pp) +{ + shtns_cfg s2 = sht_data; + void* p; + long int nref, offset; + + if ((pp==NULL) || (shtns==NULL)) return -1; // error. + + p = *(void**)pp; // the pointer to memory location that we want to free + if (p == NULL) return 0; // nothing to do. + + offset = (char*)pp - (char*)shtns; // relative location in shtns_info structure. + nref = 0; // reference count. + while (s2 != NULL) { // scan all configs. + if ( *(void**)(((char*)s2) + offset) == p ) nref++; + s2 = s2->next; + } + return nref; // will be >= 1 (as shtns is included in search) +} + +/// \internal check if the memory location *pp is referenced by another sht config before freeing it. +/// returns the number of other references, or -1 on error. If >=1, the memory location could not be freed. +/// If the return value is 0, the ressource has been freed. +static int free_unused(shtns_cfg shtns, void* pp) +{ + int n = ref_count(shtns, pp); // howmany shtns config do reference this memory location ? + if (n <= 0) return n; // nothing to free. + if (n == 1) { // no other reference found... + void** ap = (void**) pp; + free(*ap); // ...so we can free it... + *ap = NULL; // ...and mark as unaloccated. + } + return (n-1); +} + +#ifdef SHTNS_MEM +/// \internal Free matrices if on-the-fly has been selected. +static void free_unused_matrices(shtns_cfg shtns) +{ + long int marray_size = (MMAX+1)*sizeof(double) + (MIN_ALIGNMENT-1); + int count[SHT_NTYP]; + int it, iv, ia, iv2; + + for (it=0; itftable[iv][it]; + if (fptr != NULL) { + for (ia=0; ia<=SHT_MEM; ia++) // count occurences to mem algo + for (iv2=0; iv2 1 + if (verbose>1) printf(" %d ",count[it]); + #endif + } + + if (shtns->dylm == NULL) { // no vector transform : do not try to free + count[SHT_TYP_VAN] = -1; count[SHT_TYP_VSY] = -1; + } + + if (count[SHT_TYP_3AN] == 0) { // analysis may be freed. + if (count[SHT_TYP_VAN] == 0) { + PRINT_VERB("freeing vector analysis matrix\n"); + free_unused(shtns, &shtns->dzlm); + } + if (count[SHT_TYP_SAN] == 0) { + PRINT_VERB("freeing scalar analysis matrix\n"); + free_unused(shtns, &shtns->zlm); + } + } else if (shtns->mmax > 0) { // scalar may be reduced to m=0 + if ((count[SHT_TYP_SAN] == 0) && (ref_count(shtns, &shtns->zlm) == 1)) { + PRINT_VERB("keeping scalar analysis matrix up to m=0\n"); + shtns->zlm = realloc(shtns->zlm, ((LMAX+1)*NLAT_2 +3)*sizeof(double) + marray_size ); + } + } + if (count[SHT_TYP_3SY] == 0) { // synthesis may be freed. + if (count[SHT_TYP_VSY] + count[SHT_TYP_GSP] + count[SHT_TYP_GTO] == 0) { + PRINT_VERB("freeing vector synthesis matrix\n"); + free_unused(shtns, &shtns->dylm); + } + if (count[SHT_TYP_SSY] == 0) { + PRINT_VERB("freeing scalar synthesis matrix\n"); + free_unused(shtns, &shtns->ylm); + } + } else if (shtns->mmax > 0) { // scalar may be reduced to m=0 + if ((count[SHT_TYP_SSY] == 0) && (ref_count(shtns, &shtns->ylm) == 1)) { + PRINT_VERB("keeping scalar synthesis matrix up to m=0\n"); + shtns->ylm = realloc(shtns->ylm, (LMAX+2)*NLAT_2*sizeof(double) + marray_size ); + } + } +} +#endif + +/// \internal allocate arrays for SHT related to a given grid. +static void alloc_SHTarrays(shtns_cfg shtns, int on_the_fly, int vect, int analys) +{ + long int im, l0; + long int size, marray_size, lstride; + + im = (VSIZE2 > 2) ? VSIZE2 : 2; + l0 = ((NLAT+im-1)/im)*im; // align on vector + shtns->ct = (double *) VMALLOC( sizeof(double) * l0*3 ); /// ct[] (including st and st_1) + shtns->st = shtns->ct + l0; shtns->st_1 = shtns->ct + 2*l0; + + #ifdef SHTNS_MEM + shtns->ylm = NULL; shtns->dylm = NULL; // synthesis + shtns->zlm = NULL; shtns->dzlm = NULL; // analysis + + if (on_the_fly == 0) { // Allocate legendre functions lookup tables. + marray_size = (MMAX+1)*sizeof(double*) + (MIN_ALIGNMENT-1); // for sse2 alignement + + /* ylm */ + lstride = (LMAX+1); lstride += (lstride&1); // even stride. + size = sizeof(double) * ((NLM-(LMAX+1)+lstride)*NLAT_2); + if (MMAX == 0) size += 3*sizeof(double); // some overflow needed. + shtns->ylm = (double **) malloc( marray_size + size ); + shtns->ylm[0] = (double *) PTR_ALIGN( shtns->ylm + (MMAX+1) ); + if (MMAX>0) shtns->ylm[1] = shtns->ylm[0] + NLAT_2*lstride; + for (im=1; imylm[im+1] = shtns->ylm[im] + NLAT_2*(LMAX+1-im*MRES); + /* dylm */ + if (vect) { + lstride = LMAX; lstride += (lstride&1); // even stride. + size = sizeof(struct DtDp) * ((NLM-(LMAX+1) +lstride/2)*NLAT_2); + if (MMAX == 0) size += 2*sizeof(double); // some overflow needed. + shtns->dylm = (struct DtDp **) malloc( marray_size + size ); + shtns->dylm[0] = (struct DtDp *) PTR_ALIGN( shtns->dylm + (MMAX+1) ); + if (MMAX>0) shtns->dylm[1] = shtns->dylm[0] + (lstride/2)*NLAT_2; // phi-derivative is zero for m=0 + for (im=1; imdylm[im+1] = shtns->dylm[im] + NLAT_2*(LMAX+1-im*MRES); + } + if (analys) { + /* zlm */ + size = sizeof(double) * (NLM*NLAT_2 + (NLAT_2 & 1)); + if (MMAX == 0) size += 2*(NLAT_2 & 1)*((LMAX+1) & 1) * sizeof(double); + shtns->zlm = (double **) malloc( marray_size + size ); + shtns->zlm[0] = (double *) PTR_ALIGN( shtns->zlm + (MMAX+1) ); + if (MMAX>0) shtns->zlm[1] = shtns->zlm[0] + NLAT_2*(LMAX+1) + (NLAT_2&1); + for (im=1; imzlm[im+1] = shtns->zlm[im] + NLAT_2*(LMAX+1-im*MRES); + /* dzlm */ + if (vect) { + size = sizeof(struct DtDp)* (NLM-1)*NLAT_2; // remove l=0 + shtns->dzlm = (struct DtDp **) malloc( marray_size + size ); + shtns->dzlm[0] = (struct DtDp *) PTR_ALIGN( shtns->dzlm + (MMAX+1) ); + if (MMAX>0) shtns->dzlm[1] = shtns->dzlm[0] + NLAT_2*(LMAX); + for (im=1; imdzlm[im+1] = shtns->dzlm[im] + NLAT_2*(LMAX+1-im*MRES); + } + } + } + #endif + #if SHT_VERBOSE > 1 + if (verbose>1) printf(" Memory used for Ylm and Zlm matrices = %.3f Mb x2\n",3.0*sizeof(double)*NLM*NLAT_2/(1024.*1024.)); + #endif +} + + +/// \internal free arrays allocated by alloc_SHTarrays. +static void free_SHTarrays(shtns_cfg shtns) +{ + #ifdef SHTNS_MEM + free_unused(shtns, &shtns->ylm); + free_unused(shtns, &shtns->dylm); + free_unused(shtns, &shtns->zlm); + free_unused(shtns, &shtns->dzlm); + #endif + + if (ref_count(shtns, &shtns->ct) == 1) VFREE(shtns->ct); + shtns->ct = NULL; shtns->st = NULL; +} + +#ifndef HAVE_FFTW_COST + // substitute undefined symbol in mkl and fftw older than 3.3 + #define fftw_cost(a) 0.0 +#endif + +/// \internal initialize FFTs using FFTW. +/// \param[in] layout defines the spatial layout (see \ref spat). +/// \param[in] on_the_fly is one, if only on-the-fly transform are considered. +/// returns the number of double to be allocated for a spatial field. +static void planFFT(shtns_cfg shtns, int layout, int on_the_fly) +{ + double cost_fft_ip, cost_fft_oop, cost_ifft_ip, cost_ifft_oop; + cplx *ShF; + double *Sh; + int nfft, ncplx, nreal; + int theta_inc, phi_inc, phi_embed; + #ifdef HAVE_FFTW_COST + int in_place = 1; // try to use in-place real fft. + #else + int in_place = 0; // do not try to use in-place real fft if no timing data available. + #endif + + if (NPHI <= 2*MMAX) shtns_runerr("the sampling condition Nphi > 2*Mmax is not met."); + + #ifdef OMP_FFTW + if ((shtns->fftw_plan_mode & (FFTW_EXHAUSTIVE | FFTW_PATIENT)) && (omp_threads > 1)) { + shtns->fftw_plan_mode = FFTW_PATIENT; + fftw_plan_with_nthreads(omp_threads); + } else fftw_plan_with_nthreads(shtns->nthreads); + #endif + + shtns->k_stride_a = 1; shtns->m_stride_a = NLAT; // default strides + + shtns->nspat = NPHI * NLAT; // default spatial size + + if (NPHI==1) // no FFT needed. + { + shtns->fftc_mode = -1; // no FFT + #if SHT_VERBOSE > 0 + if (verbose) printf(" => no fft : Mmax=0, Nphi=1, Nlat=%d\n",NLAT); + #endif + return; + } + + shtns->layout = layout; // store the data-layout for future reference (by CUDA init). + /* NPHI > 1 */ + theta_inc=1; phi_inc=NLAT; phi_embed=2*(NPHI/2+1); // SHT_NATIVE_LAYOUT is the default. + if (layout & SHT_THETA_CONTIGUOUS) { theta_inc=1; phi_inc=NLAT; phi_embed=NPHI; } + if (layout & SHT_PHI_CONTIGUOUS) { phi_inc=1; theta_inc=NPHI; phi_embed=NPHI; } + nfft = NPHI; + ncplx = NPHI/2 +1; + nreal = phi_embed; + if ((theta_inc != 1)||(phi_inc != NLAT)||(nreal < 2*ncplx)) in_place = 0; // we need to do the fft out-of-place. + + #if SHT_VERBOSE > 0 + if (verbose) { + printf(" => using FFTW : Mmax=%d, Nphi=%d, Nlat=%d (data layout : phi_inc=%d, theta_inc=%d, phi_embed=%d)\n",MMAX,NPHI,NLAT,phi_inc,theta_inc,phi_embed); + if (NPHI <= (SHT_NL_ORDER+1)*MMAX) printf(" !! Warning : anti-aliasing condition Nphi > %d*Mmax is not met !\n", SHT_NL_ORDER+1); + if (NPHI != fft_int(NPHI,7)) printf(" !! Warning : Nphi is not optimal for FFTW !\n"); + } + #endif + +// Allocate dummy Spatial Fields. + ShF = (cplx *) VMALLOC(ncplx * NLAT*2 * sizeof(cplx)); // *2 for complex-valued fields + Sh = (double *) VMALLOC(ncplx * NLAT*2 * sizeof(cplx)); + +// complex fft for fly transform is a bit different. + if (layout & SHT_PHI_CONTIGUOUS) { // out-of-place split dft + fftw_iodim dim, many; + shtns->fftc_mode = 1; + //default internal + dim.n = NPHI; dim.os = 1; dim.is = NLAT; // complex transpose + many.n = NLAT/2; many.os = 2*NPHI; many.is = 2; + shtns->ifftc = fftw_plan_guru_split_dft(1, &dim, 1, &many, ((double*)ShF)+1, (double*)ShF, Sh+NPHI, Sh, shtns->fftw_plan_mode); + + // legacy analysis fft + //dim.n = NPHI; dim.is = 1; dim.os = NLAT; + //many.n = NLAT/2; many.is = 2*NPHI; many.os = 2; + // new internal + dim.n = NPHI; dim.is = 1; dim.os = 2; // split complex, but without global transpose (faster). + many.n = NLAT/2; many.is = 2*NPHI; many.os = 2*NPHI; + shtns->fftc = fftw_plan_guru_split_dft(1, &dim, 1, &many, Sh+NPHI, Sh, ((double*)ShF)+1, (double*)ShF, shtns->fftw_plan_mode); + shtns->k_stride_a = NPHI; shtns->m_stride_a = 2; + + // for complex transform it is much simpler (out-of-place): + shtns->ifft_cplx = fftw_plan_many_dft(1, &nfft, NLAT, ShF, &nfft, NLAT, 1, (cplx*)Sh, &nfft, 1, NPHI, FFTW_BACKWARD, shtns->fftw_plan_mode); + shtns->fft_cplx = fftw_plan_many_dft(1, &nfft, NLAT, ShF, &nfft, 1, NPHI, (cplx*)Sh, &nfft, NLAT, 1, FFTW_BACKWARD, shtns->fftw_plan_mode); + + #if SHT_VERBOSE > 1 + if (verbose>1) { + printf(" [phi-contiguous] fftw cost ifftc=%lg, fftc=%lg ",fftw_cost(shtns->ifftc), fftw_cost(shtns->fftc)); fflush(stdout); + } + #endif + #ifdef HAVE_LIBCUFFT + } else if (!(layout & SHT_THETA_CONTIGUOUS)) { // use the fastest layout compatible with cuFFT + shtns->fftc_mode = 2; // out-of-place + // Fourier -> spatial + shtns->ifftc = fftw_plan_many_dft(1, &nfft, NLAT/2, ShF, &nfft, NLAT/2, 1, (cplx*) Sh, &nfft, 1, nfft, FFTW_BACKWARD, shtns->fftw_plan_mode); + // spatial -> Fourier + shtns->fftc = fftw_plan_many_dft(1, &nfft, NLAT/2, (cplx*) Sh, &nfft, 1, nfft, ShF, &nfft, NLAT/2, 1, FFTW_BACKWARD, shtns->fftw_plan_mode); + #if SHT_VERBOSE > 1 + if (verbose>1) { + printf(" [native cuFFT] fftw cost ifftc=%lg, fftc=%lg ",fftw_cost(shtns->ifftc), fftw_cost(shtns->fftc)); fflush(stdout); + } + #endif + #endif + } else { //if (layout & SHT_THETA_CONTIGUOUS) { // use only in-place here, supposed to be faster. + shtns->fftc_mode = 0; + shtns->ifftc = fftw_plan_many_dft(1, &nfft, NLAT/2, ShF, &nfft, NLAT/2, 1, ShF, &nfft, NLAT/2, 1, FFTW_BACKWARD, shtns->fftw_plan_mode); + shtns->fftc = shtns->ifftc; // same thing, with m>0 and m<0 exchanged. + + // complex-values spatial fields (in-place): + shtns->ifft_cplx = fftw_plan_many_dft(1, &nfft, NLAT, ShF, &nfft, NLAT, 1, ShF, &nfft, NLAT, 1, FFTW_BACKWARD, shtns->fftw_plan_mode); + shtns->fft_cplx = shtns->ifft_cplx; // same thing, with m>0 and m<0 exchanged. + #if SHT_VERBOSE > 1 + if (verbose>1) { + printf(" [theta-contiguous] fftw cost ifftc=%lg ",fftw_cost(shtns->ifftc)); fflush(stdout); + } + #endif + } + VFREE(Sh); VFREE(ShF); + + #if SHT_VERBOSE > 2 + if (verbose>2) { + printf("\n *** fftc plan : \n"); + if (shtns->fftc) fftw_print_plan(shtns->fftc); + printf("\n *** ifftc plan :\n"); + if (shtns->ifftc) fftw_print_plan(shtns->ifftc); + printf("\n"); + } + #endif +} + + +/// \internal Sets the value tm[im] used for polar optimiation on-the-fly. +static void PolarOptimize(shtns_cfg shtns, double eps) +{ + int im, m, l, it; + double v; + double y[LMAX+1]; + + for (im=0;im<=MMAX;im++) shtns->tm[im] = 0; + + if (eps > 0.0) { + for (im=1;im<=MMAX;im++) { + m = im*MRES; + it = shtns->tm[im-1] -1; // tm[im] is monotonic. + do { + it++; + legendre_sphPlm_array(shtns, LMAX, im, shtns->ct[it], y+m); + v = 0.0; + for (l=m; l<=LMAX; l++) { + double ya = fabs(y[l]); + if ( v < ya ) v = ya; + } + } while (v < eps); + shtns->tm[im] = it; + } + #if SHT_VERBOSE > 0 + if (verbose) printf(" + polar optimization threshold = %.1e\n",eps); + #endif + #if SHT_VERBOSE > 1 + if (verbose>1) { + printf(" tm[im]="); + for (im=0;im<=MMAX;im++) + printf(" %d",shtns->tm[im]); + printf("\n"); + } + #endif + } +} + +#ifdef SHTNS_MEM + +/// \internal Perform some optimization on the SHT matrices. +static void OptimizeMatrices(shtns_cfg shtns, double eps) +{ + unsigned short *tm; + double **ylm, **zlm; + struct DtDp** dylm; + struct DtDp** dzlm; + int im,m,l,it; + int vector = (shtns->dylm != NULL); + + tm = shtns->tm; + ylm = shtns->ylm; dylm = shtns->dylm; + zlm = shtns->zlm; dzlm = shtns->dzlm; + + for (im=0;im<=MMAX;im++) tm[im] = 0; +/// POLAR OPTIMIZATION : analyzing coefficients, some can be safely neglected. + if (eps > 0.0) { + for (im=1;im<=MMAX;im++) { + m = im*MRES; + tm[im] = NLAT_2; + for (l=m;l<=LMAX;l++) { + it = tm[im-1]; // tm[im] is monotonic. + while( fabs(ylm[im][it*(LMAX-m+1) + (l-m)]) < eps ) { it++; } + if (tm[im] > it) tm[im] = it; + } + } +#if SHT_VERBOSE > 0 + if (verbose) printf(" + polar optimization threshold = %.1e\n",eps); +#endif +#if SHT_VERBOSE > 1 + if (verbose>1) { + printf(" tm[im]="); + for (im=0;im<=MMAX;im++) + printf(" %d",tm[im]); + printf("\n"); + } +#endif + + for (im=1; im<=MMAX; im++) { // im >= 1 + if (tm[im] > 0) { // we can remove the data corresponding to polar values. + m = im*MRES; + ylm[im] += tm[im]*(LMAX-m+1); // shift pointers (still one block for each m) + if (vector) dylm[im] += tm[im]*(LMAX-m+1); + if (zlm[0] != NULL) { + for (l=m; lylm[0][ (it)*(((LMAX+2)>>1)*2) + (l) ] ) +#define DYL0(it, l) ( ((double*)(shtns->dylm[0]))[ (it)*(((LMAX+1)>>1)*2) + (l-1) ] ) + +#define YLM(it, l, im) ( (im==0) ? YL0(it,l) : shtns->ylm[im][(it)*(LMAX-(im)*MRES+1) + ((l)-(im)*MRES)] ) +#define DTYLM(it, l, im) ( (im==0) ? ( (l==0) ? 0.0 : DYL0(it,l) ) : shtns->dylm[im][(it)*(LMAX-(im)*MRES+1) + ((l)-(im)*MRES)].t ) +#define DPYLM(it, l, im) ( (im==0) ? 0.0 : shtns->dylm[im][(it)*(LMAX-(im)*MRES+1) + ((l)-(im)*MRES)].p ) + +/// \internal Precompute the matrix for SH synthesis. +static void init_SH_synth(shtns_cfg shtns) +{ + double *yl, *dyl; // temp storage for derivative for legendre function values. + long int it,im,m,l; + double *ct = shtns->ct; + double *st = shtns->st; + int vector = (shtns->dylm != NULL); + + yl = (double*) malloc( 2*sizeof(double) *(LMAX+1) ); + dyl = yl + (LMAX+1); + + { im=0; m=0; + for (it=0; itylm[im]; + struct DtDp* dylm = vector ? shtns->dylm[im] : NULL; + m = im*MRES; + for (it=0; itdylm != NULL); + + init_SH_synth(shtns); + +// for analysis (decomposition, direct transform) : transpose and multiply by gauss weight and other normalizations. +// interleave l and l+1 : this stores data in the way it will be read. + double **zlm = shtns->zlm; + struct DtDp** dzlm = shtns->dzlm; + for (im=0; im<=MMAX; im++) { + m = im*MRES; + long int talign = 0; + + for (it=0;itwg[it]; + if ( (m>0) && (shtns->norm & SHT_REAL_NORM) ) norm *= 2; // "Real" norm : zlm must be doubled for m>0 + long int l0 = m; + if (m==0) { + zlm[im][it] = YL0(it, 0) * norm; + // les derivees sont nulles pour l=0 + l0++; + talign = (NLAT_2&1); + } + for (l=l0; ll_2[l]; nz1 *= shtns->l_2[l+1]; + dzlm[im][(l-l0)*NLAT_2 + it*2].t = DTYLM(it, l, im) * nz0; + dzlm[im][(l-l0)*NLAT_2 + it*2].p = DPYLM(it, l, im) * nz0; + dzlm[im][(l-l0)*NLAT_2 + it*2+1].t = DTYLM(it, l+1, im) * nz1; + dzlm[im][(l-l0)*NLAT_2 + it*2+1].p = DPYLM(it, l+1, im) * nz1; + } + } + if (l==LMAX) { // last l is stored right away, without interleaving. + double nz0 = norm; + if (SHT_NORM == sht_schmidt) nz0 *= (2*l+1); + zlm[im][(l-m)*NLAT_2 + it +talign] = YLM(it, l, im) * nz0; + if (vector) { + nz0 *= shtns->l_2[l]; + dzlm[im][(l-l0)*NLAT_2 + it].t = DTYLM(it, l, im) * nz0; + dzlm[im][(l-l0)*NLAT_2 + it].p = DPYLM(it, l, im) * nz0; + } + } + } + } +} + +#endif + +/// \internal Generate a grid (including weights) +static void grid_weights(shtns_cfg shtns, double latdir) +{ + long int it; + real iylm_fft_norm; + real xg[NLAT], wgl[NLAT]; // gauss points and weights. + const int overflow = 8*VSIZE2-1; + const unsigned char grid = shtns->grid; + + shtns->wg = VMALLOC((NLAT_2 +overflow) * sizeof(double)); // quadrature weights, double precision. + + iylm_fft_norm = 1.0; // FFT/SHT normalization for zlm (4pi normalized) + if ((SHT_NORM != sht_fourpi)&&(SHT_NORM != sht_schmidt)) iylm_fft_norm = 4*M_PIl; // FFT/SHT normalization for zlm (orthonormalized) + iylm_fft_norm /= (2*NPHI); + if (grid == GRID_GAUSS) { + #if SHT_VERBOSE > 0 + if (verbose) { + printf(" => using Gauss nodes\n"); + if (2*NLAT <= (SHT_NL_ORDER +1)*LMAX) printf(" !! Warning : Gauss-Legendre anti-aliasing condition 2*Nlat > %d*Lmax is not met.\n",SHT_NL_ORDER+1); + } + #endif + gauss_nodes(xg,wgl,NLAT); // generate gauss nodes and weights : ct = ]1,-1[ = cos(theta) + } else if (grid == GRID_REGULAR) { + #if SHT_VERBOSE > 0 + if (verbose) { + printf(" => using Regular nodes (Chebychev) with Fejer quadrature\n"); + if (NLAT <= (SHT_NL_ORDER +1)*LMAX) printf(" !! Warning : Regular-Fejer anti-aliasing condition Nlat > %d*Lmax is not met.\n",SHT_NL_ORDER+1); + } + #endif + fejer1_nodes(xg,wgl,NLAT); + } else if (grid == GRID_POLES) { + #if SHT_VERBOSE > 0 + if (verbose) { + printf(" => using Regular nodes including poles, with Clenshaw-Curtis quadrature\n"); + if (NLAT <= (SHT_NL_ORDER +1)*LMAX) printf(" !! Warning : Regular-Clenshaw-Curtis anti-aliasing condition Nlat > %d*Lmax is not met.\n",SHT_NL_ORDER+1); + } + #endif + clenshaw_curtis_nodes(xg,wgl,NLAT); + } else shtns_runerr("unknown grid."); + for (it=0; itct[it] = latdir * xg[it]; + shtns->st[it] = SQRT((1.-xg[it])*(1.+xg[it])); + shtns->st_1[it] = 1.0/SQRT((1.-xg[it])*(1.+xg[it])); + } + double s=0; + for (it=0; it 1e-12) printf(" !! Warning: sum of weigths = 2 + %g (should be 2)", s-2.0); + for (it=0; itwg[it] = wgl[it]*iylm_fft_norm; // faster double-precision computations. + if (NLAT & 1) { // odd NLAT : adjust weigth of middle point. (required for Gauss, untested for regular grids... TODO CHECK) + shtns->wg[NLAT_2-1] *= 0.5; + } + for (it=NLAT_2; it < NLAT_2 +overflow; it++) shtns->wg[it] = 0.0; // padding for multi-way algorithm. + +#if SHT_VERBOSE > 1 + if ((verbose>1) && (grid == GRID_GAUSS)) { + printf(" NLAT=%d, NLAT_2=%d\n",NLAT,NLAT_2); + // TEST if gauss points are ok. + double tmax = 0.0; + for (it = 0; itct[it]); + if (t>tmax) tmax = t; + // printf("i=%d, x=%12.12g, p=%12.12g\n",it,ct[it],t); + } + printf(" max zero at Gauss nodes for Pl[l=NLAT] : %g\n",tmax); + if (NLAT_2 < 100) { + printf(" Gauss nodes :"); + for (it=0;itct[it]); + printf("\n"); + } + } +#endif +} + + +/* TEST AND TIMING FUNCTIONS */ + +/// check if an IEEE754 double precision number is finite (works also when compiled with -ffinite-math). +static int isNotFinite(double x) { + union { double d; unsigned long long i; } mem = { x }; + return (mem.i & 0x7FF0000000000000ULL) == 0x7FF0000000000000ULL; // nan or inf +} + +/// \internal return the max error for a back-and-forth SHT transform. +/// this function is used to internally measure the accuracy. +double SHT_error(shtns_cfg shtns, int vector) +{ + cplx *Tlm0=0, *Slm0=0, *Tlm=0, *Slm=0; + double *Sh=0, *Th=0; + double t, tmax, n2, err; + long int i, jj, nlm_cplx; + + srand( time(NULL) ); // init random numbers. + + Slm0 = (cplx *) VMALLOC(sizeof(cplx)* NLM); + Slm = (cplx *) VMALLOC(sizeof(cplx)* NLM); + Sh = (double *) VMALLOC( NSPAT_ALLOC(shtns) * sizeof(double) ); + if ((Sh==0) || (Slm==0) || (Slm0==0)) shtns_runerr("not enough memory."); + if (vector) { + Tlm0 = (cplx *) VMALLOC(sizeof(cplx)* NLM); + Tlm = (cplx *) VMALLOC(sizeof(cplx)* NLM); + Th = (double *) VMALLOC( NSPAT_ALLOC(shtns) * sizeof(double) ); + if ((Th==0) || (Tlm==0) || (Tlm0==0)) shtns_runerr("not enough memory."); + } + +// m = nphi/2 is also real if nphi is even. + nlm_cplx = ( MMAX*2 == NPHI ) ? LiM(shtns, MRES*MMAX,MMAX) : NLM; + t = 1.0 / (RAND_MAX/2); + for (i=0; i=nlm_cplx)) { // m=0 or m*2=nphi : real random data + Slm0[i] = t*((double) (rand() - RAND_MAX/2)); + if (vector) Tlm0[i] = t*((double) (rand() - RAND_MAX/2)); + } else { // m>0 : complex random data + Slm0[i] = t*((double) (rand() - RAND_MAX/2)) + I*t*((double) (rand() - RAND_MAX/2)); + if (vector) Tlm0[i] = t*((double) (rand() - RAND_MAX/2)) + I*t*((double) (rand() - RAND_MAX/2)); + } + } + + SH_to_spat(shtns, Slm0,Sh); // scalar SHT + spat_to_SH(shtns, Sh, Slm); + for (i=0, tmax=0., n2=0., jj=0; itmax) { tmax = t; jj = i; } + } + err = tmax; +#if SHT_VERBOSE > 1 + if (verbose>1) printf(" scalar SH - poloidal rms error = %.3g max error = %.3g for l=%hu,lm=%ld\n",sqrt(n2/NLM),tmax,shtns->li[jj],jj); +#endif + + if (vector) { + Slm0[0] = 0.0; Tlm0[0] = 0.0; // l=0, m=0 n'a pas de signification sph/tor + SHsphtor_to_spat(shtns, Slm0, Tlm0, Sh, Th); // vector SHT + spat_to_SHsphtor(shtns, Sh, Th, Slm, Tlm); + for (i=0, tmax=0., n2=0., jj=0; itmax) { tmax = t; jj = i; } + } + if (tmax > err) err = tmax; + #if SHT_VERBOSE > 1 + if (verbose>1) printf(" vector SH - spheroidal rms error = %.3g max error = %.3g for l=%hu,lm=%ld\n",sqrt(n2/NLM),tmax,shtns->li[jj],jj); + #endif + for (i=0, tmax=0., n2=0., jj=0; itmax) { tmax = t; jj = i; } + } + if (tmax > err) err = tmax; + #if SHT_VERBOSE > 1 + if (verbose>1) printf(" - toroidal rms error = %.3g max error = %.3g for l=%hu,lm=%ld\n",sqrt(n2/NLM),tmax,shtns->li[jj],jj); + #endif + + //for (int i=0; ili[i], cabs(Slm[i] - Slm0[i]), cabs(Tlm[i] - Tlm0[i]), creal(Slm[i]),cimag(Slm[i]), creal(Slm0[i]),cimag(Slm0[i]), creal(Tlm[i]),cimag(Tlm[i]), creal(Tlm0[i]),cimag(Tlm0[i])); + //} + } + + if (Th) VFREE(Th); if (Tlm) VFREE(Tlm); if (Tlm0) VFREE(Tlm0); + VFREE(Sh); VFREE(Slm); VFREE(Slm0); + return(err); // return max error. +} + + +#if SHT_VERBOSE == 1 + #define PRINT_DOT if (verbose>=1) { printf("."); fflush(stdout); } +#else + #define PRINT_DOT (0); +#endif + +/// \internal measure time used for a transform function +static double get_time(shtns_cfg shtns, int nloop, int npar, char* name, void *fptr, void *i1, void *i2, void *i3, void *o1, void *o2, void *o3, int l) +{ + double t; + int i; + ticks tik0, tik1; + + if (fptr == NULL) return(0.0); + + tik1 = getticks(); + for (i=0; i 1 + if (verbose>1) { printf(" t(%s) = %.3g",name,t); fflush(stdout); } + #endif + return t; +} + + +/// \internal choose fastest between on-the-fly and gauss algorithms. +/// *nlp is the number of loops. If zero, it is set to a good value. +/// on_the_fly : 1 = skip all memory algorithm. 0 = include memory and on-the-fly. -1 = test only DCT. +/// returns time without dct / best time with dct (or 0 if no dct available). +static void choose_best_sht(shtns_cfg shtns, int* nlp, int vector) +{ + cplx *Qlm=0, *Slm=0, *Tlm=0; + double *Qh=0, *Sh=0, *Th=0; + int m, i, i0, minc, nloop, alg_end; + int typ_lim = SHT_NTYP; // time every type. + double t0, t, tt, r; + double tdct, tnodct; + clock_t tcpu; + #ifdef SHTNS_MEM + const int on_the_fly_only = (shtns->ylm == NULL); // only on-the-fly. + #else + const int on_the_fly_only = 1; // only on-the-fly. + #endif + int otf_analys = (shtns->wg != NULL); // on-the-fly analysis supported. + + if (NLAT < VSIZE2*4) return; // on-the-fly not possible for NLAT_2 < 2*NWAY (overflow). + + size_t nspat = sizeof(double) * NSPAT_ALLOC(shtns); + size_t nspec = sizeof(cplx)* NLM; + if (nspec>nspat) nspat=nspec; + Sh = (double *) VMALLOC(nspat); Slm = (cplx *) VMALLOC(nspec); + if ((Sh==0) || (Slm==0)) shtns_runerr("not enough memory."); + if (vector) { + Th = (double *) VMALLOC(nspat); Qh = (double *) VMALLOC(nspat); + Tlm = (cplx *) VMALLOC(nspec); Qlm = (cplx *) VMALLOC(nspec); + if ( (Th==0) || (Qh==0) || (Tlm==0) || (Qlm==0) ) vector = 0; + } + + for (i=0;ili[i]; + Slm[i] = shtns->l_2[l] + 0.5*I*shtns->l_2[l]; + if (vector) { + Tlm[i] = 0.5*shtns->l_2[l] + I*shtns->l_2[l]; + Qlm[i] = 3*shtns->l_2[l] + 2*I*shtns->l_2[l]; + } + } + + #if SHT_VERBOSE > 0 + if (verbose) { + printf(" finding optimal algorithm"); fflush(stdout); + } + #endif + + const int ref_alg = (shtns->nthreads == 1) ? SHT_FLY2 : SHT_OMP2; + if (*nlp <= 0) { + // find good nloop by requiring less than 3% difference between 2 consecutive timings. + m=0; nloop = 1; // number of loops to get timings. + r = 0.0; tt = 1.0; + do { + if ((r > 0.03)||(tt<0.1)) { + m = 0; nloop *= 3; + } else m++; + tcpu = clock(); + t0 = get_time(shtns, nloop, 2, "", sht_func[SHT_STD][ref_alg][SHT_TYP_SSY], Slm, Tlm, Qlm, Sh, Th, Qh, LMAX); + tcpu = clock() - tcpu; tt = 1.e-6 * tcpu; + if (tt >= SHT_TIME_LIMIT) break; // we should not exceed 1 second + t = get_time(shtns, nloop, 2, "", sht_func[SHT_STD][ref_alg][SHT_TYP_SSY], Slm, Tlm, Qlm, Sh, Th, Qh, LMAX); + r = fabs(2.0*(t-t0)/(t+t0)); + #if SHT_VERBOSE > 1 + if (verbose>1) printf(", nloop=%d, r=%g, m=%d (real time = %g s)\n",nloop,r,m,tt); + if (tt >= 0.01) break; // faster timing in debug mode. + #endif + PRINT_DOT + } while((nloop<10000)&&(m < 3)); + *nlp = nloop; + } else { + nloop = *nlp; + } + #if SHT_VERBOSE > 1 + if (verbose>1) printf(" => nloop=%d (takes %g s)\n",nloop, tt); + #endif + if (vector == 0) typ_lim = SHT_TYP_VSY; // time only scalar transforms. +// if (tt > 3.0) typ_lim = SHT_TYP_VSY; // time only scalar transforms. +// if (tt > 10.0) goto done; // timing this will be too slow... + + int ityp = 0; do { + if (ityp == 2) nloop = (nloop+1)/2; // scalar ar done. + t0 = 1e100; + i0 = SHT_MEM; + if (on_the_fly_only) i0 = SHT_SV; // only on-the-fly (SV is then also on-the-fly) + alg_end = SHT_NALG; + if (shtns->nthreads <= 1) alg_end = SHT_OMP1; // no OpenMP with 1 thread. + if ((ityp&1) && (otf_analys == 0)) alg_end = SHT_FLY1; // no on-the-fly analysis for regular grid. + for (i=i0, m=0; i= 2) { // don't time if there is only 1 algo ! + #if SHT_VERBOSE > 1 + if (verbose>1) { printf("finding best %s ...",sht_type[ityp]); fflush(stdout); } + #endif + i = i0-1; i0 = -1; + while (++i < alg_end) { + void *pf = sht_func[0][i][ityp]; + if (pf != NULL) { + if (ityp&1) { // analysis + t = get_time(shtns, nloop, sht_npar[ityp], sht_name[i], pf, Sh, Th, Qh, Slm, Tlm, Qlm, LMAX); + } else { + t = get_time(shtns, nloop, sht_npar[ityp], sht_name[i], pf, Slm, Tlm, Qlm, Sh, Th, Qh, LMAX); + } + if (i < SHT_FLY1) t *= 1.03; // 3% penality for memory based transforms. + #ifdef _OPENMP + if ((shtns->nthreads > 1) && ((i >= SHT_OMP1)||(i == SHT_SV))) t *= 1.3; // 30% penality for openmp transforms. + #endif + if (t < t0) { i0 = i; t0 = t; PRINT_VERB("*"); } + } + } + if (i0 >= 0) { + for (int iv=0; ivftable[iv][ityp] = sht_func[iv][i0][ityp]; + if (ityp == 4) { // only one timing for both gradients variants. + if (sht_func[iv][i0][ityp+1]) shtns->ftable[iv][ityp+1] = sht_func[iv][i0][ityp+1]; + } + } + PRINT_DOT + #if SHT_VERBOSE > 1 + if (verbose>1) printf(" => %s\n",sht_name[i0]); + #endif + } + } + if (ityp == 4) ityp++; // skip second gradient + } while(++ityp < typ_lim); + +done: + #if SHT_VERBOSE > 0 + if (verbose) printf("\n"); + #endif + if (Qlm) VFREE(Qlm); if (Tlm) VFREE(Tlm); + if (Qh) VFREE(Qh); if (Th) VFREE(Th); + if (Slm) VFREE(Slm); if (Sh) VFREE(Sh); +} + +void shtns_print_version() { + #ifndef SHTNS4MAGIC + printf("[" PACKAGE_STRING "] built " __DATE__ ", " __TIME__ ", id: " _SHTNS_ID_ "\n"); + #else + printf("[" PACKAGE_STRING "] built for MagIC " __DATE__ ", " __TIME__ ", id: " _SHTNS_ID_ "\n"); + #endif +} + + + +void fprint_ftable(FILE* fp, void* ftable[SHT_NVAR][SHT_NTYP]) +{ + for (int iv=0; ivnthreads); + if (shtns->norm & SHT_REAL_NORM) printf("'real' norm, "); + if (shtns->norm & SHT_NO_CS_PHASE) printf("no Condon-Shortley phase, "); + if (shtns->robert_form) printf("Robert form, "); + if (SHT_NORM == sht_fourpi) printf("4.pi normalized]\n"); + else if (SHT_NORM == sht_schmidt) printf("Schmidt semi-normalized]\n"); + else printf("orthonormalized]\n"); + if (shtns->ct == NULL) return; // no grid is set + + switch(shtns->grid) { + case GRID_GAUSS : printf("Gauss grid"); break; + case GRID_REGULAR : printf("Regular grid"); break; + case GRID_POLES : printf("Regular grid including poles"); break; + default : printf("Unknown grid"); + } + printf(" : Nlat=%d, Nphi=%d\n", NLAT, NPHI); + printf(" "); + for (int it=0; itftable); + printf("\n"); +} + + +/// \internal saves config to a file for later restart. +int config_save(shtns_cfg shtns, int req_flags) +{ + int err = 0; + + if (shtns->ct == NULL) return -1; // no grid set + + if (shtns->nphi > 1) { + FILE* f = fopen("shtns_cfg_fftw","w"); + if (f) { + fftw_export_wisdom_to_file(f); + fclose(f); + } else err -= 2; + } + + FILE *fcfg = fopen("shtns_cfg","a"); + if (fcfg != NULL) { + fprintf(fcfg, "%s %s %d %d %d %d %d %d %d %d %d %d",PACKAGE_VERSION, _SHTNS_ID_, shtns->lmax, shtns->mmax, shtns->mres, shtns->nphi, shtns->nlat, shtns->grid, shtns->nthreads, req_flags, shtns->nlorder, -1); + fprint_ftable(fcfg, shtns->ftable); + fprintf(fcfg,"\n"); + fclose(fcfg); + } else err -= 4; + + #if SHT_VERBOSE > 0 + if (err < 0) fprintf(stderr,"! Warning ! SHTns could not save config\n"); + #endif + return err; +} + +/// \internal try to load config from a file +int config_load(shtns_cfg shtns, int req_flags) +{ + void* ft2[SHT_NVAR][SHT_NTYP]; // pointers to transform functions. + int lmax2, mmax2, mres2, nphi2, nlat2, grid2, nthreads2, req_flags2, nlorder2, mtr_dct2; + int found = 0; + char version[32], simd[32], alg[8]; + + if (shtns->ct == NULL) return -1; // no grid set + + if ((req_flags & 255) == sht_quick_init) req_flags += sht_gauss - sht_quick_init; // quick_init uses gauss. + + FILE *fcfg = fopen("shtns_cfg","r"); + if (fcfg != NULL) { + int i=0; + while(1) { + fscanf(fcfg, "%30s %30s %d %d %d %d %d %d %d %d %d %d",version, simd, &lmax2, &mmax2, &mres2, &nphi2, &nlat2, &grid2, &nthreads2, &req_flags2, &nlorder2, &mtr_dct2); + for (int iv=0; ivlmax == lmax2) && (shtns->mmax == mmax2) && (shtns->mres == mres2) && (shtns->nthreads == nthreads2) && + (shtns->nphi == nphi2) && (shtns->nlat == nlat2) && (shtns->grid == grid2) && (req_flags == req_flags2) && + (shtns->nlorder == nlorder2) && (strcmp(simd, _SHTNS_ID_)==0)) { + #if SHT_VERBOSE > 0 + if (verbose > 0) printf(" + using saved config\n"); + #endif + #if SHT_VERBOSE > 1 + if (verbose > 1) { + fprint_ftable(stdout, ft2); + printf("\n"); + } + #endif + for (int iv=0; ivftable[iv][it] = ft2[iv][it]; // accept only non-null pointer + found = 1; + break; + } + } + fclose(fcfg); + return found; + } else { + #if SHT_VERBOSE > 0 + if (verbose) fprintf(stderr,"! Warning ! SHTns could not load config\n"); + #endif + return -2; // file not found + } +} + +/// \internal returns 1 if val cannot fit in dest (unsigned) +#define IS_TOO_LARGE(val, dest) (sizeof(dest) >= sizeof(val)) ? 0 : ( ( val >= (1<<(8*sizeof(dest))) ) ? 1 : 0 ) + +/// \internal returns the size that must be allocated for an shtns_info. +#define SIZEOF_SHTNS_INFO(mmax) ( sizeof(struct shtns_info) + (mmax+1)*( sizeof(int)+sizeof(unsigned short) ) ) + +/* PUBLIC INITIALIZATION & DESTRUCTION */ + +/** \addtogroup init Initialization functions. +*/ +//@{ + +/*! This sets the description of spherical harmonic coefficients. + * It tells SHTns how to interpret spherical harmonic coefficient arrays, and it sets usefull arrays. + * Returns the configuration to be passed to subsequent transform functions, which is basicaly a pointer to a \ref shtns_info struct. + * \param lmax : maximum SH degree that we want to describe. + * \param mmax : number of azimutal wave numbers. + * \param mres : \c 2.pi/mres is the azimutal periodicity. \c mmax*mres is the maximum SH order. + * \param norm : define the normalization of the spherical harmonics (\ref shtns_norm) + * + optionaly disable Condon-Shortley phase (ex: \ref sht_schmidt | \ref SHT_NO_CS_PHASE) + * + optionaly use a 'real' normalization (ex: \ref sht_fourpi | \ref SHT_REAL_NORM) +*/ +shtns_cfg shtns_create(int lmax, int mmax, int mres, enum shtns_norm norm) +{ + shtns_cfg shtns, s2; + int im, m, l, lm; + int with_cs_phase = 1; /// Condon-Shortley phase (-1)^m is used by default. + double mpos_renorm = 1.0; /// renormalization of m>0. + int larrays_ok = 0; + int legendre_ok = 0; + int l_2_ok = 0; + +// if (lmax < 1) shtns_runerr("lmax must be larger than 1"); + if (lmax < 2) shtns_runerr("lmax must be at least 2"); + if (IS_TOO_LARGE(lmax, shtns->lmax)) shtns_runerr("lmax too large"); + if (mmax*mres > lmax) shtns_runerr("MMAX*MRES should not exceed LMAX"); + if (mres <= 0) shtns_runerr("MRES must be > 0"); + + // allocate new setup and initialize some variables (used as flags) : + shtns = malloc( SIZEOF_SHTNS_INFO(mmax) ); + if (shtns == NULL) return shtns; // FAIL + { + void **p0 = (void**) &shtns->tm; // first pointer in struct. + void **p1 = (void**) &shtns->Y00_1; // first non-pointer. + while(p0 < p1) *p0++ = NULL; // write NULL to every pointer. + shtns->lmidx = (int*) (shtns + 1); // lmidx is stored at the end of the struct... + shtns->tm = (unsigned short*) (shtns->lmidx + (mmax+1)); // and tm just after. + shtns->ct = NULL; shtns->st = NULL; + shtns->nphi = 0; shtns->nlat = 0; shtns->nlat_2 = 0; shtns->nspat = 0; // public data + shtns->ylm_lat = NULL; shtns->ct_lat = 2.0; shtns->ifft_lat = NULL; shtns->nphi_lat = 0; // _to_lat data + #ifdef HAVE_LIBCUFFT + shtns->d_alm = NULL; // this marks the gpu as disabled. + #endif + #ifdef SHTNS4MAGIC + shtns->robert_form = 1; // Robert form by default for MagIC (multiply spatial vector fields by sin(theta)) + #else + shtns->robert_form = 0; // no Robert form by default. + #endif + } + + // copy sizes. + shtns->norm = norm; + if (norm & SHT_NO_CS_PHASE) + with_cs_phase = 0; + if (norm & SHT_REAL_NORM) + mpos_renorm = 0.5; // normalization for 'real' spherical harmonics. + + shtns->mmax = mmax; shtns->mres = mres; shtns->lmax = lmax; + shtns->nlm = nlm_calc(lmax, mmax, mres); + shtns->nlm_cplx = 2*shtns->nlm - (lmax+1); // = nlm_cplx_calc(lmax, mmax, mres); + shtns->nthreads = omp_threads; + if (omp_threads > mmax+1) shtns->nthreads = mmax+1; // limit the number of threads to mmax+1 + #if SHT_VERBOSE > 0 + if (verbose) { + shtns_print_version(); + printf(" "); shtns_print_cfg(shtns); + } + #endif + + s2 = sht_data; // check if some data can be shared ... + while(s2 != NULL) { + if ((s2->mmax >= mmax) && (s2->mres == mres)) { + if (s2->lmax == lmax) { // we can reuse the l-related arrays (li + copy lmidx) + shtns->li = s2->li; shtns->mi = s2->mi; + for (im=0; im<=mmax; im++) shtns->lmidx[im] = s2->lmidx[im]; + larrays_ok = 1; + if (s2->norm == norm) { // we can reuse the legendre tables. + shtns->alm = s2->alm; shtns->blm = s2->blm; + #ifdef SHTNS_ISHIOKA + shtns->xlm = s2->xlm; shtns->x2lm = s2->x2lm; + #endif + legendre_ok = 1; + } + } + } + if (s2->lmax >= lmax) { // we can reuse l_2 + shtns->l_2 = s2->l_2; + l_2_ok = 1; + } + s2 = s2->next; + } + if (larrays_ok == 0) { + // alloc spectral arrays + shtns->li = (unsigned short *) malloc( 2*NLM*sizeof(unsigned short) ); // NLM defined at runtime. + shtns->mi = shtns->li + NLM; + for (im=0, lm=0; im<=MMAX; im++) { // init l-related arrays. + m = im*MRES; + shtns->lmidx[im] = lm -m; // virtual pointer for l=0 + for (l=im*MRES;l<=LMAX;l++) { + shtns->li[lm] = l; shtns->mi[lm] = m; + lm++; + } + } + if (lm != NLM) shtns_runerr("unexpected error"); + } + if (legendre_ok == 0) { // this quickly precomputes some values for the legendre recursion. + legendre_precomp(shtns, SHT_NORM, with_cs_phase, mpos_renorm); + } + if (l_2_ok == 0) { + shtns->l_2 = (double *) malloc( (LMAX+1)*sizeof(double) ); + shtns->l_2[0] = 0.0; // undefined for l=0 => replace with 0. + real one = 1.0; + for (l=1; l<=LMAX; l++) shtns->l_2[l] = one/(l*(l+1)); + } + + switch(SHT_NORM) { + case sht_for_rotations: + case sht_schmidt: + shtns->Y00_1 = 1.0; shtns->Y10_ct = 1.0; + break; + case sht_fourpi: + shtns->Y00_1 = 1.0; shtns->Y10_ct = sqrt(1./3.); + break; + case sht_orthonormal: + default: + shtns->Y00_1 = sqrt(4.*M_PI); shtns->Y10_ct = sqrt(4.*M_PI/3.); +// Y11_st = sqrt(2.*M_PI/3.); // orthonormal : \f$ \sin\theta\cos\phi/(Y_1^1 + Y_1^{-1}) = -\sqrt{2 \pi /3} \f$ + } + shtns->Y11_st = shtns->Y10_ct * sqrt(0.5/mpos_renorm); + if (with_cs_phase) shtns->Y11_st *= -1.0; // correct Condon-Shortley phase + +// initialize rotations along arbitrary axes (if applicable). + if ((lmax == mmax) && (mres == 1)) SH_rotK90_init(shtns); + +// save a pointer to this setup and return. + shtns->next = sht_data; // reference of previous setup (may be NULL). + sht_data = shtns; // keep track of new setup. + return(shtns); +} + +/// Copy a given config but allow a different (smaller) mmax and the possibility to enable/disable fft (beta). +shtns_cfg shtns_create_with_grid(shtns_cfg base, int mmax, int nofft) +{ + shtns_cfg shtns; + + if (mmax > base->mmax) return (NULL); // fail if mmax larger than source config. + + shtns = malloc( SIZEOF_SHTNS_INFO(mmax) ); + memcpy(shtns, base, SIZEOF_SHTNS_INFO(mmax) ); // copy all + shtns->lmidx = (int*) shtns+1; // lmidx is stored at the end of the struct... + shtns->tm = (unsigned short*) (shtns->lmidx + (mmax+1)); // ...and tm just after. + + if (mmax != shtns->mmax) { + shtns->mmax = mmax; + for (int im=0; im<=mmax; im++) { + shtns->lmidx[im] = base->lmidx[im]; + shtns->tm[im] = base->tm[im]; + } + if (mmax == 0) { + // TODO we may disable fft and replace with a phi-averaging function ... + // ... then switch to axisymmetric functions : + // init_sht_array_func(shtns); + // choose_best_sht(shtns, &nloop, 0); + } + } + if (nofft != 0) { + shtns->fftc_mode = -1; // fft disabled. + } + +// save a pointer to this setup and return. + shtns->next = sht_data; // reference of previous setup (may be NULL). + sht_data = shtns; // keep track of new setup. + return(shtns); +} + +/// release all resources allocated by a grid. +void shtns_unset_grid(shtns_cfg shtns) +{ + if (ref_count(shtns, &shtns->wg) == 1) VFREE(shtns->wg); + shtns->wg = NULL; + free_SHTarrays(shtns); + shtns->nlat = 0; shtns->nlat_2 = 0; + shtns->nphi = 0; shtns->nspat = 0; +} + +/// release all resources allocated by a given shtns_cfg. +void shtns_destroy(shtns_cfg shtns) +{ + #ifdef HAVE_LIBCUFFT + if (shtns->d_alm) cushtns_release_gpu(shtns); + #endif + free_unused(shtns, &shtns->l_2); + if (shtns->blm != shtns->alm) + free_unused(shtns, &shtns->blm); + free_unused(shtns, &shtns->alm); + free_unused(shtns, &shtns->li); + free_unused(shtns, &shtns->ct_rot); + #ifdef SHTNS_ISHIOKA + free_unused(shtns, &shtns->clm); + #endif + if (shtns->fft_rot) fftw_destroy_plan(shtns->fft_rot); + free_unused(shtns, &shtns->mx_stdt); + free_unused(shtns, &shtns->mx_van); + + shtns_unset_grid(shtns); + + if (sht_data == shtns) { + sht_data = shtns->next; // forget shtns + } else { + shtns_cfg s2 = sht_data; + while (s2 != NULL) { + if (s2->next == shtns) { + s2->next = shtns->next; // forget shtns + break; + } + s2 = s2->next; + } + } + free(shtns); +} + +/// clear all allocated memory (hopefully) and go back to 0 state. +void shtns_reset() +{ + while (sht_data != NULL) { + shtns_destroy(sht_data); + } +} + +#ifndef HAVE_LIBCUFFT +// allocation for vector-aligned data. If gpu is enabled, these are replace by pinned memory allocation. +void* shtns_malloc(size_t size) { + return VMALLOC(size); +} + +void shtns_free(void* p) { + VFREE(p); +} +#endif + + +static int choose_nlat(int n) +{ + #if HAVE_LIBCUFFT + n = ((n+63)/64) * 64; // multiple of 64 for GPUs + return n; + #endif + + n += (n&1); // even is better. + #ifndef SHTNS4MAGIC + n = ((n+(VSIZE2-1))/VSIZE2) * VSIZE2; // multiple of vector size + #else + n = ((n+(2*VSIZE2-1))/(2*VSIZE2)) * (2*VSIZE2); // multiple of twice the vector size + #endif + if (n < VSIZE2*4) n=VSIZE2*4; // avoid overflow with NLAT_2 < VSIZE2*2 + return n; +} + +/*! Initialization of Spherical Harmonic transforms (backward and forward, vector and scalar, ...) of given size. + * This function must be called after \ref shtns_create and before any SH transform. and sets all global variables and internal data. + * returns the required number of doubles to be allocated for a spatial field. + * \param shtns is the config created by \ref shtns_create for which the grid will be set. + * \param nlat,nphi pointers to the number of latitudinal and longitudinal grid points respectively. If 0, they are set to optimal values. + * \param nl_order defines the maximum SH degree to be resolved by analysis : lmax_analysis = lmax*nl_order. It is used to set an optimal and anti-aliasing nlat. If 0, the default SHT_DEFAULT_NL_ORDER is used. + * \param flags allows to choose the type of transform (see \ref shtns_type) and the spatial data layout (see \ref spat) + * \param eps polar optimization threshold : polar values of Legendre Polynomials below that threshold are neglected (for high m), leading to increased performance (a few percents) + * 0 = no polar optimization; 1.e-14 = VERY safe; 1.e-10 = safe; 1.e-6 = aggresive, but still good accuracy. +*/ +int shtns_set_grid_auto(shtns_cfg shtns, enum shtns_type flags, double eps, int nl_order, int *nlat, int *nphi) +{ + double t, mem; + int im,m; + int layout; + int nloop = 0; + int n_gauss = 0; + int on_the_fly = 0; + int quick_init = 0; + int vector = !(flags & SHT_SCALAR_ONLY); + int latdir = (flags & SHT_SOUTH_POLE_FIRST) ? -1 : 1; // choose latitudinal direction (change sign of ct) + int cfg_loaded = 0; + int analys = 1; + const int req_flags = flags; // requested flags. + + #if HAVE_LIBCUFFT + if (*nlat % 64) shtns_runerr("Nlat must be a multiple of 64 for GPUs\n"); + #endif + if (*nlat & 1) shtns_runerr("Nlat must be even\n"); + #if _GCC_VEC_ + #ifdef SHTNS4MAGIC + if (*nlat % (VSIZE2*2)) shtns_runerr("Nlat must be an even multiple of vector size\n"); + #endif + #endif + shtns_unset_grid(shtns); // release grid if previously allocated. + if (nl_order <= 0) nl_order = SHT_DEFAULT_NL_ORDER; +/* shtns.lshift = 0; + if (nl_order == 0) nl_order = SHT_DEFAULT_NL_ORDER; + if (nl_order < 0) { shtns.lshift = -nl_order; nl_order = 1; } // linear with a shift in l. +*/ + shtns->nspat = 0; + shtns->nlorder = nl_order; + layout = flags & 0xFFFF00; + flags = flags & 255; // clear higher bits. + + switch (flags) { + case sht_auto : flags = sht_gauss; break; // only gauss available. + case sht_reg_fast: quick_init = 1; + case sht_reg_dct: flags = sht_reg_fast; on_the_fly = 1; break; + case sht_gauss_fly : flags = sht_gauss; on_the_fly = 1; break; + case sht_quick_init : flags = sht_gauss; quick_init = 1; break; + case sht_reg_poles : on_the_fly = 1; quick_init = 1; break; // WARNING: quick_init mandatory here, as reg_poles needs NWAY>1 to work (quick_init sets NWAY=2) + default : break; + } + #ifndef SHTNS_MEM + on_the_fly = 1; + #endif + #ifdef SHTNS4MAGIC + if (flags == sht_reg_poles) shtns_runerr("Grid cannot include poles with MagIC layout."); + #endif + + if (vector) { + // initialize sin(theta).d/dtheta matrix (for vector transforms) + shtns->mx_stdt = (double*) malloc( 2*NLM*sizeof(double) ); // for vector synthesis + st_dt_matrix_shifted(shtns, shtns->mx_stdt); + shtns->mx_van = (double*) malloc( 2*NLM*sizeof(double) ); // for vector analysis + mul_ct_matrix_shifted(shtns, shtns->mx_van); + for (long lm=0; lm<2*NLM; lm++) { // 2*cos(theta) + sin(theta) d./dtheta = 1/sin(theta). d/dtheta(sin^2(theta) .) + shtns->mx_van[lm] = 2.*shtns->mx_van[lm] + shtns->mx_stdt[lm]; + } + } + + if (*nphi == 0) { + *nphi = fft_int((nl_order+1)*MMAX+1, 7); // required fft nodes + } + if (*nlat == 0) { + n_gauss = ((nl_order+1)*LMAX)/2 +1; // required gauss nodes + n_gauss = choose_nlat( n_gauss ); + if (flags != sht_gauss) { + m = ((nl_order+1)*(LMAX+1)); // required regular nodes + m = choose_nlat( m ); + *nlat = m; + } else *nlat = n_gauss; + } + + mem = sht_mem_size(shtns->lmax, shtns->mmax, shtns->mres, *nlat); + t=mem; if (analys) t*=2; if (vector) t*=3; + #if SHT_VERBOSE > 1 + if (verbose>1) printf("Memory required for precomputed matrices (estimate) : %.3f Mb\n",t); + #endif + if ( t > SHTNS_MAX_MEMORY ) { // huge transform has been requested + on_the_fly = 1; +// if (t > 10*SHTNS_MAX_MEMORY) quick_init =1; // do not time such large transforms. + } + + if (quick_init == 0) { // do not waste too much time finding optimal fftw. + //shtns->fftw_plan_mode = FFTW_EXHAUSTIVE; // defines the default FFTW planner mode. + shtns->fftw_plan_mode = FFTW_PATIENT; // defines the default FFTW planner mode. + //fftw_set_timelimit(60.0); // do not search plans for more than 1 minute (does it work well ???) + if (*nphi > 512) shtns->fftw_plan_mode = FFTW_PATIENT; + if (*nphi > 1024) shtns->fftw_plan_mode = FFTW_MEASURE; + } else { + shtns->fftw_plan_mode = FFTW_ESTIMATE; + if ((mem < 1.0) && (SHT_VERBOSE < 2)) shtns->nthreads = 1; // disable threads for small transforms (in quickinit mode). + if ((VSIZE2 >= 4) && (*nlat >= VSIZE2*4)) on_the_fly = 1; // with AVX, on-the-fly should be the default (faster). + if ((shtns->nthreads > 1) && (*nlat >= VSIZE2*16)) on_the_fly = 1; // force multi-thread transforms + } + + if (flags == sht_auto) { + if ( ((nl_order>=2)&&(MMAX*MRES > LMAX/2)) || (*nlat < SHT_MIN_NLAT_DCT) || (*nlat & 1) || (*nlat <= LMAX+1) ) { + flags = sht_gauss; // avoid computing DCT stuff when it is not expected to be faster. + if (n_gauss > 0) *nlat = n_gauss; + } + } + + if ((flags == sht_gauss)&&(*nlat <= shtns->lmax)) shtns_runerr("Nlat must be larger than Lmax"); + if ((flags != sht_gauss)&&(*nlat <= 2*shtns->lmax)) shtns_runerr("Nlat must be larger than 2*Lmax"); + if (IS_TOO_LARGE(*nlat, shtns->nlat)) shtns_runerr("Nlat too large"); + if (IS_TOO_LARGE(*nphi, shtns->nphi)) shtns_runerr("Nphi too large"); + + // copy to global variables. + shtns->nphi = *nphi; + shtns->nlat_2 = (*nlat+1)/2; shtns->nlat = *nlat; + + if (layout & SHT_LOAD_SAVE_CFG) { + FILE* f = fopen("shtns_cfg_fftw","r"); + if (f) { + fftw_import_wisdom_from_file(f); // load fftw wisdom. + fclose(f); + } + } + planFFT(shtns, layout, on_the_fly); // initialize fftw + init_sht_array_func(shtns); // array of SHT functions is now set. + + alloc_SHTarrays(shtns, on_the_fly, vector, analys); // allocate dynamic arrays + shtns->grid = GRID_NONE; + switch(flags) { + case sht_gauss : shtns->grid = GRID_GAUSS; break; + case sht_reg_poles : shtns->grid = GRID_POLES; break; + case sht_reg_fast : shtns->grid = GRID_REGULAR; + } + grid_weights(shtns, latdir); + #ifdef SHTNS_MEM + if ((on_the_fly == 0) && (flags == sht_gauss)) { + init_SH_gauss(shtns); // precompute matrices + OptimizeMatrices(shtns, eps); + } + if (flags == sht_reg_poles) { + for (im=0; im<=MMAX; im++) shtns->tm[im] = 0; // avoid problems with tm[im] modified ???? + } + #endif + + if (on_the_fly == 1) { + #if SHT_VERBOSE > 0 + if (verbose) printf(" + using on-the-fly transforms.\n"); + #endif + if (NLAT < VSIZE2*4) shtns_runerr("on-the-fly only available for nlat>=32"); // avoid overflow with NLAT_2 < VSIZE2*2 + PolarOptimize(shtns, eps); + set_sht_fly(shtns, 0); // switch function pointers to "on-the-fly" functions. + } + + #ifdef HAVE_LIBCUFFT + int gpu_ok = -1; + if (layout & SHT_ALLOW_GPU) { + gpu_ok = cushtns_init_gpu(shtns); // try to initialize cuda gpu + #if SHT_VERBOSE > 0 + if ((verbose)&&(gpu_ok>=0)) printf(" + GPU #%d successfully initialized.\n", gpu_ok); + #endif + } + if (gpu_ok < 0) { // disable the GPU functions + for (int j=SHT_GPU1; j<=SHT_GPU4; j++) { + memset(sht_func[SHT_STD][j], 0, sizeof(void*)*SHT_NTYP); + memset(sht_func[SHT_LTR][j], 0, sizeof(void*)*SHT_NTYP); + } + } + #endif + + if ((layout & SHT_LOAD_SAVE_CFG) && (!cfg_loaded)) cfg_loaded = (config_load(shtns, req_flags) > 0); + if (quick_init == 0) { + if (!cfg_loaded) { + choose_best_sht(shtns, &nloop, vector); + if (layout & SHT_LOAD_SAVE_CFG) config_save(shtns, req_flags); + } + #ifdef SHTNS_MEM + if (on_the_fly == 0) free_unused_matrices(shtns); + #endif + t = SHT_error(shtns, vector); // compute SHT accuracy. + #if SHT_VERBOSE > 0 + if (verbose) printf(" + SHT accuracy = %.3g\n",t); + #endif + #if SHT_VERBOSE < 2 + if ((t > 1.e-3) || isNotFinite(t)) { + shtns_print_cfg(shtns); + shtns_runerr("bad SHT accuracy"); // stop if something went wrong (but not in debug mode) + } + #endif + } + +// set_sht_fly(shtns, SHT_TYP_VAN); +// set_sht_gpu(shtns, 0); + + #if SHT_VERBOSE > 1 + if ((omp_threads > 1)&&(verbose>1)) printf(" nthreads = %d\n",shtns->nthreads); + #endif + #if SHT_VERBOSE > 0 + if (verbose) printf(" => " PACKAGE_NAME " is ready.\n"); + #endif + return(shtns->nspat); // returns the number of doubles to be allocated for a spatial field. +} + + +/*! Initialization of Spherical Harmonic transforms (backward and forward, vector and scalar, ...) of given size. + * This function must be called after \ref shtns_create and before any SH transform. and sets all global variables. + * returns the required number of doubles to be allocated for a spatial field. + * \param shtns is the config created by shtns_create for which the grid will be set. + * \param flags allows to choose the type of transform (see \ref shtns_type) and the spatial data layout (see \ref spat) + * \param eps polar optimization threshold : polar values of Legendre Polynomials below that threshold are neglected (for high m), leading to increased performance (a few percents) + * 0 = no polar optimization; 1.e-14 = VERY safe; 1.e-10 = safe; 1.e-6 = aggresive, but still good accuracy. + * \param nlat,nphi respectively the number of latitudinal and longitudinal grid points. +*/ +int shtns_set_grid(shtns_cfg shtns, enum shtns_type flags, double eps, int nlat, int nphi) +{ + if ((nlat == 0)||(nphi == 0)) shtns_runerr("nlat or nphi is zero !"); + return( shtns_set_grid_auto(shtns, flags, eps, 0, &nlat, &nphi) ); +} + +/*! Simple initialization of Spherical Harmonic transforms (backward and forward, vector and scalar, ...) of given size. + * This function sets all global variables by calling \ref shtns_create followed by \ref shtns_set_grid, with the + * default normalization and the default polar optimization (see \ref sht_config.h). + * Returns the configuration to be passed to subsequent transform functions, which is basicaly a pointer to a \ref shtns_info struct. + * \param lmax : maximum SH degree that we want to describe. + * \param mmax : number of azimutal wave numbers. + * \param mres : \c 2.pi/mres is the azimutal periodicity. \c mmax*mres is the maximum SH order. + * \param nlat,nphi : respectively the number of latitudinal and longitudinal grid points. + * \param flags allows to choose the type of transform (see \ref shtns_type) and the spatial data layout (see \ref spat) +*/ +shtns_cfg shtns_init(enum shtns_type flags, int lmax, int mmax, int mres, int nlat, int nphi) +{ + shtns_cfg shtns = shtns_create(lmax, mmax, mres, SHT_DEFAULT_NORM); + if (shtns != NULL) + shtns_set_grid(shtns, flags, SHT_DEFAULT_POLAR_OPT, nlat, nphi); + return shtns; +} + +/// set the use of Robert form. If robert != 0, the vector synthesis returns a field multiplied by sin(theta), while the analysis divides by sin(theta) before the transform. +void shtns_robert_form(shtns_cfg shtns, int robert) +{ + shtns->robert_form = robert; +} + +/** Enables OpenMP parallel transforms, if available (see \ref compil). + Call before any initialization of shtns to use multiple threads. Returns the actual number of threads. + \li If num_threads > 0, specifies the maximum number of threads that should be used. + \li If num_threads <= 0, maximum number of threads is automatically set to the number of processors. + \li If num_threads == 1, openmp will be disabled. */ +int shtns_use_threads(int num_threads) +{ +#ifdef _OPENMP + int procs = omp_get_num_procs(); + if (num_threads <= 0) num_threads = omp_get_max_threads(); + else if (num_threads > 4*procs) num_threads = 4*procs; // limit the number of threads + omp_threads = num_threads; +#endif +#ifdef OMP_FFTW + fftw_init_threads(); // enable threads for FFTW. +#endif + return omp_threads; +} + +/** Enables parallel transforms on selected GPU device, if available (see \ref compil). + Call BEFORE any initialization of shtns to select a GPU device. Returns the actual device id used, or -1 if no device found. + \li If device_id >= 0, try to use device with number device_id % device_count. + \li If device_d < 0, do not try to use GPU. + WARNING: Calls cudaSetDevice() internally, so it changes the current device for the entire host thread. + */ +int shtns_use_gpu(int device_id) +{ +#ifdef HAVE_LIBCUFFT + cuda_gpu_id = cushtns_use_gpu(device_id); + return cuda_gpu_id; +#else + return -1; +#endif +} + +/// fill the given array with Gauss weights. returns the number of weights written, which +/// may be zero if the grid is not a Gauss grid. +int shtns_gauss_wts(shtns_cfg shtns, double *wts) +{ + int i = 0; + if (shtns->wg) { + double rescale = 2*NPHI; // weights are stored with a rescaling that depends on SHT_NORM. + if ((SHT_NORM != sht_fourpi)&&(SHT_NORM != sht_schmidt)) rescale *= 0.25/M_PI; + + do { + wts[i] = shtns->wg[i] * rescale; + } while(++i < shtns->nlat_2); + } + return i; +} + +//@} + + +#ifdef SHT_F77_API + +/* FORTRAN API */ + +/** \addtogroup fortapi Fortran API. +* Call from fortran without the trailing '_'. +* see the \link SHT_example.f Fortran example \endlink for a simple usage of SHTns from Fortran language. +*/ +//@{ + +/// Set verbosity level +void shtns_verbose_(int *v) +{ + shtns_verbose(*v); +} + +/// Enable threads +void shtns_use_threads_(int *num_threads) +{ + shtns_use_threads(*num_threads); +} + +void shtns_use_gpu_(int *device_id) +{ + shtns_use_gpu(*device_id); +} + +/// Print info +void shtns_print_cfg_() +{ + shtns_print_version(); + if (sht_data) shtns_print_cfg(sht_data); +} + +/// Initializes spherical harmonic transforms of given size using Gauss algorithm with default polar optimization. +void shtns_init_sh_gauss_(int *layout, int *lmax, int *mmax, int *mres, int *nlat, int *nphi) +{ + shtns_cfg shtns = shtns_create(*lmax, *mmax, *mres, SHT_DEFAULT_NORM); + shtns_set_grid(shtns, sht_gauss | *layout, SHT_DEFAULT_POLAR_OPT, *nlat, *nphi); +} + +/// Initializes spherical harmonic transforms of given size using Fastest available algorithm and polar optimization. +void shtns_init_sh_auto_(int *layout, int *lmax, int *mmax, int *mres, int *nlat, int *nphi) +{ + shtns_cfg shtns = shtns_create(*lmax, *mmax, *mres, SHT_DEFAULT_NORM); + shtns_set_grid(shtns, sht_auto | *layout, SHT_DEFAULT_POLAR_OPT, *nlat, *nphi); +} + +/// Initializes spherical harmonic transforms of given size using a regular grid and agressive optimizations. +void shtns_init_sh_reg_fast_(int *layout, int *lmax, int *mmax, int *mres, int *nlat, int *nphi) +{ + shtns_cfg shtns = shtns_create(*lmax, *mmax, *mres, SHT_DEFAULT_NORM); + shtns_set_grid(shtns, sht_reg_fast | *layout, 1.e-6, *nlat, *nphi); +} + +/// Initializes spherical harmonic transform SYNTHESIS ONLY of given size using a regular grid including poles. +void shtns_init_sh_poles_(int *layout, int *lmax, int *mmax, int *mres, int *nlat, int *nphi) +{ + shtns_cfg shtns = shtns_create(*lmax, *mmax, *mres, SHT_DEFAULT_NORM); + shtns_set_grid(shtns, sht_reg_poles | *layout, 0, *nlat, *nphi); +} + +/// Defines the size and convention of the transform. +/// Allow to choose the normalization and whether or not to include the Condon-Shortley phase. +/// \see shtns_create +void shtns_set_size_(int *lmax, int *mmax, int *mres, int *norm) +{ + shtns_create(*lmax, *mmax, *mres, *norm); +} + +/// Precompute matrices for synthesis and analysis. +/// Allow to choose polar optimization threshold and algorithm type. +/// \see shtns_set_grid +void shtns_precompute_(int *type, int *layout, double *eps, int *nlat, int *nphi) +{ + shtns_set_grid(sht_data, *type | *layout, *eps, *nlat, *nphi); +} + +/// Same as shtns_precompute_ but choose optimal nlat and/or nphi. +/// \see shtns_set_grid_auto +void shtns_precompute_auto_(int *type, int *layout, double *eps, int *nl_order, int *nlat, int *nphi) +{ + shtns_set_grid_auto(sht_data, *type | *layout, *eps, *nl_order, nlat, nphi); +} + +/// Clear everything +void shtns_reset_() { + shtns_reset(); +} + +#define MAX_CONFIGS (4) +shtns_cfg shtns_configs[MAX_CONFIGS]; + +/// Saves the current shtns configuration with tag n +void shtns_save_cfg_(unsigned *n) { + if (*n < MAX_CONFIGS) + shtns_configs[*n] = sht_data; + else + fprintf(stderr, "error saving shtns_cfg, tag %u too big\n", *n); +} + +/// Loads the previously saved configuration tagged n +void shtns_load_cfg_(unsigned *n) { + shtns_cfg s0 = sht_data; // beginning of list + shtns_cfg s2 = NULL; + if (*n < MAX_CONFIGS) s2 = shtns_configs[*n]; + if (s2 != NULL) { + if (s0 == s2) return; // nothing to do, config already active. + while (s0 != NULL) { + shtns_cfg s1 = s0->next; + if (s1 == s2) { + s0->next = s1->next; // remove from list + s1->next = sht_data; // place in front of list + sht_data = s1; + return; // done! + } + s0 = s1; + } + } + fprintf(stderr, "error loading shtns_cfg, invalid tag (%u)\n", *n); +} + +/// returns nlm, the number of complex*16 elements in an SH array. +/// call from fortran using \code call shtns_calc_nlm(nlm, lmax, mmax, mres) \endcode +void shtns_calc_nlm_(int *nlm, const int *const lmax, const int *const mmax, const int *const mres) +{ + *nlm = nlm_calc(*lmax, *mmax, *mres); +} + + +int shtns_lmidx_fortran(shtns_cfg shtns, const int *const l, const int *const m) +{ + unsigned im = *m; + unsigned mres = shtns->mres; + if (mres > 1) { + unsigned k = im % mres; + im = im / mres; + if (k) printf("wrong m"); + } + return LiM(shtns, *l, im) + 1; // convert to fortran convention index. +} + +/// returns lm, the index in an SH array of mode (l,m). +/// call from fortran using \code call shtns_lmidx(lm, l, m) \endcode +void shtns_lmidx_(int *lm, const int *const l, const int *const m) +{ + *lm = shtns_lmidx_fortran(sht_data, l, m); +} + +int shtns_lm2l_fortran(shtns_cfg shtns, const int *lm) +{ + return shtns->li[*lm -1]; // convert from fortran convention index. +} + +int shtns_lm2m_fortran(shtns_cfg shtns, const int *lm) +{ + return shtns->mi[*lm -1]; // convert from fortran convention index. +} + +/// returns l and m, degree and order of an index in SH array lm. +/// call from fortran using \code call shtns_l_m(l, m, lm) \endcode +void shtns_l_m_(int *l, int *m, const int *const lm) +{ + *l = sht_data->li[*lm -1]; // convert from fortran convention index. + *m = sht_data->mi[*lm -1]; +} + +/// fills the given array with the cosine of the co-latitude angle (NLAT real*8) +/// if no grid has been set, the first element will be set to zero. +void shtns_cos_array_(double *costh) +{ + if (sht_data->ct) { + for (int i=0; inlat; i++) + costh[i] = sht_data->ct[i]; + } else costh[0] = 0.0; // mark as invalid. +} + +/// fills the given array with the gaussian quadrature weights ((NLAT+1)/2 real*8). +/// when there is no gaussian grid, the first element is set to zero. +void shtns_gauss_wts_(double *wts) +{ + int i = shtns_gauss_wts(sht_data, wts); + if (i==0) wts[0] = 0; // mark as invalid. +} + + +/** \name Point evaluation of Spherical Harmonics +Evaluate at a given point (\f$cos(\theta)\f$ and \f$\phi\f$) a spherical harmonic representation. +*/ +//@{ +/// \see SH_to_point for argument description +void shtns_sh_to_point_(double *spat, cplx *Qlm, double *cost, double *phi) +{ + *spat = SH_to_point(sht_data, Qlm, *cost, *phi); +} + +/// \see SHqst_to_point for argument description +void shtns_qst_to_point_(double *vr, double *vt, double *vp, + cplx *Qlm, cplx *Slm, cplx *Tlm, double *cost, double *phi) +{ + SHqst_to_point(sht_data, Qlm, Slm, Tlm, *cost, *phi, vr, vt, vp); +} +//@} + +void shtns_sh_zrotate_(cplx* Qlm, double* alpha, cplx* Rlm) +{ + SH_Zrotate(sht_data, Qlm, *alpha, Rlm); +} + +void shtns_sh_yrotate_(cplx* Qlm, double* alpha, cplx* Rlm) +{ + SH_Yrotate(sht_data, Qlm, *alpha, Rlm); +} + +void shtns_sh_xrotate90_(cplx *Qlm, cplx *Rlm) +{ + SH_Xrotate90(sht_data, Qlm, Rlm); +} + +void shtns_sh_yrotate90_(cplx *Qlm, cplx *Rlm) +{ + SH_Yrotate90(sht_data, Qlm, Rlm); +} + +void shtns_sh_cplx_zrotate_(cplx* Qlm, double* alpha, cplx* Rlm) +{ + SH_cplx_Zrotate(sht_data, Qlm, *alpha, Rlm); +} + +void shtns_sh_cplx_yrotate_(cplx* Qlm, double* alpha, cplx* Rlm) +{ + SH_cplx_Yrotate(sht_data, Qlm, *alpha, Rlm); +} + +void shtns_sh_cplx_xrotate90_(cplx *Qlm, cplx *Rlm) +{ + SH_cplx_Xrotate90(sht_data, Qlm, Rlm); +} + +void shtns_sh_cplx_yrotate90_(cplx *Qlm, cplx *Rlm) +{ + SH_cplx_Yrotate90(sht_data, Qlm, Rlm); +} + + + + +//@} + +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_kernels_a.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_kernels_a.c new file mode 100644 index 000000000..c8d5170b2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_kernels_a.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +#include "sht_private.h" + +#define MTR MMAX +#define SHT_VAR_LTR + +#define GEN(name,sfx) GLUE2(name,sfx) +#define GEN3(name,nw,sfx) GLUE3(name,nw,sfx) + +// genaral case, hi lmax +#undef SUFFIX +#define SUFFIX _l +#define HI_LLIM + + #define NWAY 1 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + +#define SHT_3COMP + #define NWAY 1 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY +#undef SHT_3COMP + +// genaral case, low lmax +#undef SUFFIX +#define SUFFIX _l +#undef HI_LLIM + + #define NWAY 1 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SH_kernel.c" + #include "SHT/spat_to_SHst_kernel.c" + #undef NWAY + +#define SHT_3COMP + #define NWAY 1 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 2 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 3 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 4 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 6 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY + #define NWAY 8 + #include "SHT/spat_to_SHqst_kernel.c" + #undef NWAY +#undef SHT_3COMP + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_legendre.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_legendre.c new file mode 100644 index 000000000..edaca8704 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/sht_legendre.c @@ -0,0 +1,940 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/** \internal \file sht_legendre.c + \brief Compute legendre polynomials and associated functions. + + - Normalization of the associated functions for various spherical harmonics conventions are possible, with or without Condon-Shortley phase. + - When computing the derivatives (with respect to colatitude theta), there are no singularities. + - written by Nathanael Schaeffer / CNRS, with some ideas and code from the GSL 1.13 and Numerical Recipies. + + The associated legendre functions are computed using the following recurrence formula : + \f[ Y_l^m(x) = a_l^m \, x \ Y_{l-1}^m(x) + b_l^m \ Y_{l-2}^m(x) \f] + with starting values : + \f[ Y_m^m(x) = a_m^m \ (1-x^2)^{m/2} \f] + and + \f[ Y_{m+1}^m(x) = a_{m+1}^m \ Y_m^m(x) \f] + where \f$ a_l^m \f$ and \f$ b_l^m \f$ are coefficients that depend on the normalization, and which are + precomputed once for all by \ref legendre_precomp. +*/ + +// index in alm array for given im. +#define alm_im(shtns, im) (shtns->alm + (im)*(2*(shtns->lmax+1) - ((im)-1)*shtns->mres)) + +#if SHT_VERBOSE > 1 + #define LEG_RANGE_CHECK +#endif + +#ifndef HAVE_LONG_DOUBLE_WIDER + #define long_double_caps 0 + typedef double real; + #define SQRT sqrt + #define COS cos + #define SIN sin + #define FABS fabs + #define legendre_sphPlm_hp legendre_sphPlm + #define legendre_sphPlm_array_hp legendre_sphPlm_array + #define legendre_sphPlm_deriv_array_hp legendre_sphPlm_deriv_array +#else + int long_double_caps = 0; + typedef long double real; + #define SQRT sqrtl + #define COS cosl + #define SIN sinl + #define FABS fabsl + +// scale factor applied for LMAX larger than SHT_L_RESCALE. Allows accurate transforms up to l=2700 with 64 bit double precision. +#define SHT_LEG_SCALEF 1.1018032079253110206e-280 +#define SHT_L_RESCALE 1536 + +// returns 1 for large exponent only => useless. +// returns 2 for extended precision only => ok to improve gauss points. +// returns 3 for extended precision and large exponent => ok to improve legendre recurrence. +static int test_long_double() +{ + volatile real tt; // volatile avoids optimizations. + int p = 0; + + tt = 1.0e-1000L; tt *= tt; + if (tt > 0) p |= 1; // bit 0 set for large exponent + tt = 1.0; tt += 1.e-18; + if (tt > 1.0) p |= 2; // bit 1 set for extended precision + long_double_caps = p; + return p; +} + +/// \internal high precision version of \ref a_sint_pow_n +static real a_sint_pow_n_hp(real val, real cost, long int n) +{ + real s2 = (1.-cost)*(1.+cost); // sin(t)^2 = 1 - cos(t)^2 + long int k = n >> 7; + if (sizeof(s2) > 8) k = 0; // enough accuracy, we do not bother. + +#ifdef LEG_RANGE_CHECK + if (s2 < 0) shtns_runerr("sin(t)^2 < 0 !!!"); +#endif + + if (n&1) val *= SQRT(s2); // = sin(t) + do { + if (n&2) val *= s2; + n >>= 1; + s2 *= s2; + } while(n > k); + n >>= 1; + while(n > 0) { // take care of very large power n + n--; + val *= s2; + } + return val; // = sint(t)^n +} +#endif + + +/// \internal computes val.sin(t)^n from cos(t). ie returns val.(1-x^2)^(n/2), with x = cos(t) +/// assumes: -1 <= cost <= 1, n>=0, and nval<=0 is the extended exponent associated to val. +/// updates nval, and returns val such as the result is val.SHT_SCALE_FACTOR^(nval) +static double a_sint_pow_n_ext(double val, double cost, int n, int *nval) +{ + double s2 = (1.-cost)*(1.+cost); // sin(t)^2 = 1 - cos(t)^2 >= 0 + double val0 = val; // store sign + int ns2 = 0; + int nv = *nval; + +#ifdef LEG_RANGE_CHECK + if (s2 < 0) shtns_runerr("sin(t)^2 < 0 !!!"); +#endif + + val = fabs(val); // val >= 0 + if (n&1) val *= sqrt(s2); // = sin(t) + while (n >>= 1) { + if (n&1) { + if (val < 1.0/SHT_SCALE_FACTOR) { // val >= 0 + nv--; val *= SHT_SCALE_FACTOR; + } + val *= s2; nv += ns2; // 1/S^2 < val < 1 + } + s2 *= s2; ns2 += ns2; + if (s2 < 1.0/SHT_SCALE_FACTOR) { // s2 >= 0 + ns2--; s2 *= SHT_SCALE_FACTOR; // 1/S < s2 < 1 + } + } + while ((nv < 0) && (val > 1.0/SHT_SCALE_FACTOR)) { // try to minimize |nv| + ++nv; val *= 1.0/SHT_SCALE_FACTOR; + } + if (val0 < 0) val *= -1.0; // restore sign. + *nval = nv; + return val; // 1/S^2 < val < 1 +} + + +/// \internal Returns the value of a legendre polynomial of degree l and order im*MRES, noramalized for spherical harmonics, using recurrence. +/// Requires a previous call to \ref legendre_precomp(). +/// Output compatible with the GSL function gsl_sf_legendre_sphPlm(l, m, x) +static double legendre_sphPlm(shtns_cfg shtns, const int l, const int im, const double x) +{ + double *al; + int m, ny; + double ymm, ymmp1; + + m = im*MRES; +#ifdef LEG_RANGE_CHECK + if ( (l>LMAX+1) || (lMMAX) ) shtns_runerr("argument out of range in legendre_sphPlm"); +#endif + + ny = 0; + al = alm_im(shtns, im); + ymm = al[0]; + if (m>0) ymm = a_sint_pow_n_ext(ymm, x, m, &ny); // ny <= 0 + + ymmp1 = ymm; // l=m + if (l == m) goto done; + + ymmp1 = al[1] * (x*ymmp1); // l=m+1 + if (l == m+1) goto done; + + m+=2; al+=2; + while ((ny < 0) && (m < l)) { // take care of scaled values + ymm = al[1]*(x*ymmp1) + al[0]*ymm; + ymmp1 = al[3]*(x*ymm) + al[2]*ymmp1; + m+=2; al+=4; + if (fabs(ymm) > 1.0/SHT_SCALE_FACTOR) { // rescale when value is significant + ++ny; ymm *= 1.0/SHT_SCALE_FACTOR; ymmp1 *= 1.0/SHT_SCALE_FACTOR; + } + } + while (m < l) { // values are unscaled. + ymm = al[1]*(x*ymmp1) + al[0]*ymm; + ymmp1 = al[3]*(x*ymm) + al[2]*ymmp1; + m+=2; al+=4; + } + if (m == l) { + ymmp1 = al[1]*(x*ymmp1) + al[0]*ymm; + } +done: + if (ny < 0) { + if (ny+3 < 0) return 0.0; + do { ymmp1 *= 1.0/SHT_SCALE_FACTOR; } while (++ny < 0); // return unscaled values. + } + return ymmp1; +} + +#if HAVE_LONG_DOUBLE_WIDER +static double legendre_sphPlm_hp(shtns_cfg shtns, const int l, const int im, double x) +{ + double *al; + int i,m; + real ymm, ymmp1; + + if (long_double_caps < 3) legendre_sphPlm(shtns, l, im, x); // not worth it. + + m = im*MRES; +#ifdef LEG_RANGE_CHECK + if ( (l>LMAX+1) || (lMMAX) ) shtns_runerr("argument out of range in legendre_sphPlm"); +#endif + + al = alm_im(shtns, im); + ymm = al[0]; // l=m + if (m>0) ymm *= SHT_LEG_SCALEF; + ymmp1 = ymm; + if (l==m) goto done; + + ymmp1 = al[1] * (x*ymmp1); // l=m+1 + al+=2; + if (l == m+1) goto done; + + for (i=m+2; i0) ymmp1 *= a_sint_pow_n_hp(1.0/SHT_LEG_SCALEF, x, m); + return ((double) ymmp1); +} +#endif + + +/// \internal Compute values of legendre polynomials noramalized for spherical harmonics, +/// for a range of l=m..lmax, at given m and x, using recurrence. +/// Requires a previous call to \ref legendre_precomp(). +/// Output compatible with the GSL function gsl_sf_legendre_sphPlm_array(lmax, m, x, yl) +/// \param lmax maximum degree computed, \param im = m/MRES with m the SH order, \param x argument, x=cos(theta). +/// \param[out] yl is a double array of size (lmax-m+1) filled with the values. +void legendre_sphPlm_array(shtns_cfg shtns, const int lmax, const int im, const double x, double *yl) +{ + double *al; + int l, m, ny; + double ymm, ymmp1; + + m = im*MRES; +#ifdef LEG_RANGE_CHECK + if ( (lmax>LMAX+1) || (lmaxMMAX) ) shtns_runerr("argument out of range in legendre_sphPlm"); +#endif + + al = alm_im(shtns, im); + yl -= m; // shift pointer + for (l=m; l<=lmax; ++l) yl[l] = 0.0; // zero out array. + + ny = 0; + ymm = al[0]; + if (m>0) ymm = a_sint_pow_n_ext(ymm, x, m, &ny); // l=m, ny <= 0 + if (ny==0) yl[m] = ymm; + if (lmax==m) return; + + ymmp1 = ymm * al[1] * x; // l=m+1 + if (ny==0) yl[m+1] = ymmp1; + if (lmax==m+1) return; + + l=m+2; al+=2; + while ((ny < 0) && (l < lmax)) { // values are negligible => discard. + ymm = al[1]*(x*ymmp1) + al[0]*ymm; + ymmp1 = al[3]*(x*ymm) + al[2]*ymmp1; + l+=2; al+=4; + if (fabs(ymm) > 1.0/SHT_SCALE_FACTOR) { // rescale when value is significant + ++ny; ymm *= 1.0/SHT_SCALE_FACTOR; ymmp1 *= 1.0/SHT_SCALE_FACTOR; + } + } + while (l < lmax) { // values are unscaled => store + ymm = al[1]*(x*ymmp1) + al[0]*ymm; + ymmp1 = al[3]*(x*ymm) + al[2]*ymmp1; + yl[l] = ymm; yl[l+1] = ymmp1; + l+=2; al+=4; + } + if ((l == lmax) && (ny == 0)) { + yl[l] = al[1]*(x*ymmp1) + al[0]*ymm; + } +} + +#if HAVE_LONG_DOUBLE_WIDER +/// \internal high precision version of \ref legendre_sphPlm_array +static void legendre_sphPlm_array_hp(shtns_cfg shtns, const int lmax, const int im, const double cost, double *yl) +{ + double *al; + long int l,m; + int rescale = 0; // flag for rescale. + real ymm, ymmp1, x; + + if (long_double_caps < 3) { // not worth it. + legendre_sphPlm_array(shtns, lmax, im, cost, yl); return; + } + + m = im*MRES; +#ifdef LEG_RANGE_CHECK + if ((lmax > LMAX+1)||(lmax < m)||(im>MMAX)) shtns_runerr("argument out of range in legendre_sphPlm_array"); +#endif + + x = cost; + al = alm_im(shtns, im); + yl -= m; // shift pointer + ymm = al[0]; // l=m + if (m>0) { + if ((lmax <= SHT_L_RESCALE) || (sizeof(ymm) > 8)) { + ymm = a_sint_pow_n_hp(ymm, x, m); + } else { + rescale = 1; + ymm *= SHT_LEG_SCALEF; + } + } + yl[m] = ymm; + if (lmax==m) goto done; // done. + + ymmp1 = ymm * al[1] * x; // l=m+1 + yl[m+1] = ymmp1; + al+=2; + if (lmax==m+1) goto done; // done. + + for (l=m+2; l0 : returns ylm(x)/sin(theta) and d(ylm)/d(theta). +/// This way, there are no singularities, everything is well defined for x=[-1,1], for any m. +/// \param lmax maximum degree computed, \param im = m/MRES with m the SH order, \param x argument, x=cos(theta). +/// \param sint = sqrt(1-x^2) to avoid recomputation of sqrt. +/// \param[out] yl is a double array of size (lmax-m+1) filled with the values (divided by sin(theta) if m>0) +/// \param[out] dyl is a double array of size (lmax-m+1) filled with the theta-derivatives. +void legendre_sphPlm_deriv_array(shtns_cfg shtns, const int lmax, const int im, const double x, const double sint, double *yl, double *dyl) +{ + double *al; + int l,m, ny; + double st, y0, y1, dy0, dy1; + + m = im*MRES; +#ifdef LEG_RANGE_CHECK + if ((lmax > LMAX+1)||(lmax < m)||(im>MMAX)) shtns_runerr("argument out of range in legendre_sphPlm_deriv_array"); +#endif + + al = alm_im(shtns, im); + yl -= m; dyl -= m; // shift pointers + for (l=m; l<=lmax; ++l) { + yl[l] = 0.0; dyl[l] = 0.0; // zero out arrays. + } + + ny = 0; + st = sint; + y0 = al[0]; + dy0 = 0.0; + if (m>0) { + y0 = a_sint_pow_n_ext(y0, x, m-1, &ny); + dy0 = x*m*y0; + st *= st; // st = sin(theta)^2 is used in the recurrence for m>0 + } + if (ny==0) { + yl[m] = y0; dyl[m] = dy0; // l=m + } + if (lmax==m) return; // done. + + y1 = al[1] * (x * y0); + dy1 = al[1]*( x*dy0 - st*y0 ); + if (ny == 0) { + yl[m+1] = y1; dyl[m+1] = dy1; // l=m+1 + } + if (lmax==m+1) return; // done. + + l=m+2; al+=2; + while ((ny < 0) && (l < lmax)) { // values are negligible => discard. + y0 = al[1]*(x*y1) + al[0]*y0; + dy0 = al[1]*(x*dy1 - y1*st) + al[0]*dy0; + y1 = al[3]*(x*y0) + al[2]*y1; + dy1 = al[3]*(x*dy0 - y0*st) + al[2]*dy1; + l+=2; al+=4; + if (fabs(y0) > 1.0/SHT_SCALE_FACTOR) { // rescale when value is significant + ++ny; y0 *= 1.0/SHT_SCALE_FACTOR; dy0 *= 1.0/SHT_SCALE_FACTOR; + y1 *= 1.0/SHT_SCALE_FACTOR; dy1 *= 1.0/SHT_SCALE_FACTOR; + } + } + while (l < lmax) { // values are unscaled => store. + y0 = al[1]*(x*y1) + al[0]*y0; + dy0 = al[1]*(x*dy1 - y1*st) + al[0]*dy0; + y1 = al[3]*(x*y0) + al[2]*y1; + dy1 = al[3]*(x*dy0 - y0*st) + al[2]*dy1; + yl[l] = y0; dyl[l] = dy0; + yl[l+1] = y1; dyl[l+1] = dy1; + l+=2; al+=4; + } + if ((l==lmax) && (ny == 0)) { + yl[l] = al[1]*(x*y1) + al[0]*y0; + dyl[l] = al[1]*(x*dy1 - y1*st) + al[0]*dy0; + } +} + +#if HAVE_LONG_DOUBLE_WIDER +/// \internal high precision version of \ref legendre_sphPlm_deriv_array +static void legendre_sphPlm_deriv_array_hp(shtns_cfg shtns, const int lmax, const int im, const double cost, const double sint, double *yl, double *dyl) +{ + double *al; + long int l,m; + int rescale = 0; // flag for rescale. + real x, st, y0, y1, dy0, dy1; + + if (long_double_caps < 3) { // not worth it. + legendre_sphPlm_deriv_array(shtns, lmax, im, cost, sint, yl, dyl); return; + } + + x = cost; + m = im*MRES; +#ifdef LEG_RANGE_CHECK + if ((lmax > LMAX+1)||(lmax < m)||(im>MMAX)) shtns_runerr("argument out of range in legendre_sphPlm_deriv_array"); +#endif + al = alm_im(shtns, im); + yl -= m; dyl -= m; // shift pointers + + st = sint; + y0 = al[0]; + dy0 = 0.0; + if (m>0) { // m > 0 + l = m-1; + if ((lmax <= SHT_L_RESCALE) || (sizeof(y0) > 8)) { + if (l&1) { + y0 = a_sint_pow_n_hp(y0, x, l-1) * sint; // avoid computation of sqrt + } else y0 = a_sint_pow_n_hp(y0, x, l); + } else { + rescale = 1; + y0 *= SHT_LEG_SCALEF; + } + dy0 = x*m*y0; + st *= st; // st = sin(theta)^2 is used in the recurrence for m>0 + } + yl[m] = y0; // l=m + dyl[m] = dy0; + if (lmax==m) goto done; // done. + + y1 = al[1] * (x * y0); + dy1 = al[1]*( x*dy0 - st*y0 ); + yl[m+1] = y1; // l=m+1 + dyl[m+1] = dy1; + if (lmax==m+1) goto done; // done. + al+=2; + + for (l=m+2; l LMAX+1)||(lmax < m)||(im>MMAX)) shtns_runerr("argument out of range in legendre_sphPlm_deriv_array"); +#endif + + al = alm_im(shtns, im); + ydyl -= m; // shift pointer + + y0 = al[0]; + ydyl[m] = y0; // l=m + if (lmax==m) return; // done. + + dy1 = -al[1]*y0; + ydyl[m+1] = dy1; // l=m+1 + if (lmax==m+1) return; // done. + + l=m+2; al+=2; + while (l < lmax) { + y0 = al[0]*y0; + dy1 = al[2]*dy1 - al[3]*y0; + ydyl[l] = y0; + ydyl[l+1] = dy1; + l+=2; al+=4; + } + if (l==lmax) { + ydyl[l] = al[0]*y0; + } +} + + +/// \internal Precompute constants for the recursive generation of Legendre associated functions, with given normalization. +/// this function is called by \ref shtns_set_size, and assumes up-to-date values in \ref shtns. +/// For the same conventions as GSL, use \c legendre_precomp(sht_orthonormal,1); +/// \param[in] norm : normalization of the associated legendre functions (\ref shtns_norm). +/// \param[in] with_cs_phase : Condon-Shortley phase (-1)^m is included (1) or not (0) +/// \param[in] mpos_renorm : Optional renormalization for m>0. +/// 1.0 (no renormalization) is the "complex" convention, while 0.5 leads to the "real" convention (with FFTW). +void legendre_precomp(shtns_cfg shtns, enum shtns_norm norm, int with_cs_phase, double mpos_renorm) +{ + double *alm, *blm; + real t1, t2; + const long int lmax = LMAX+1; // we go to one order beyond LMAX to resolve vector transforms through scalar ones. + +#if HAVE_LONG_DOUBLE_WIDER + test_long_double(); +#endif +#if SHT_VERBOSE > 1 + if (verbose) { + printf(" > Condon-Shortley phase = %d, normalization = %d\n", with_cs_phase, norm); + if (long_double_caps == 3) printf(" > long double has extended precision and large exponent\n"); + } +#endif + + if (with_cs_phase != 0) with_cs_phase = 1; // force to 1 if !=0 + + alm = (double *) malloc( (2*NLM + 2)*sizeof(double) ); // fits exactly into an array of 2*NLM doubles, + 2 values to allow overflow read. + blm = alm; + if (norm == sht_schmidt) { + blm = (double *) malloc( (2*NLM + 2)*sizeof(double) ); + } + if ((alm==0) || (blm==0)) shtns_runerr("not enough memory."); + shtns->alm = alm; shtns->blm = blm; + + shtns->mpos_scale_analys = 0.5/mpos_renorm; // (shtns->norm & SHT_REAL_NORM) ? 1.0 : 0.5; // handles real-norm + +/// - Compute and store the prefactor (independant of x) of the starting value for the recurrence : +/// \f[ Y_m^m(x) = Y_0^0 \ \sqrt{ \prod_{k=1}^{m} \frac{2k+1}{2k} } \ \ (-1)^m \ (1-x^2)^{m/2} \f] + if (norm != sht_orthonormal) { + t1 = 1.0; + alm[0] = t1; /// \f$ Y_0^0 = 1 \f$ for Schmidt or 4pi-normalized + } else { + t1 = 0.25L/M_PIl; + alm[0] = SQRT(t1); /// \f$ Y_0^0 = 1/\sqrt{4\pi} \f$ for orthonormal + } + t1 *= mpos_renorm; // renormalization for m>0 + for (int im=1, m=0; im<=MMAX; ++im) { + while(mclm = clm; + shtns->xlm = xlm; + ylm = xlm; + if (n_alloc > 5) ylm = xlm + 3*nlm0/2; + shtns->x2lm = ylm; + #endif + +/// - Precompute the factors alm and blm of the recurrence relation : + #pragma omp parallel for private(t1, t2) schedule(dynamic) + for (int im=0; im<=MMAX; ++im) { + const long m = im*MRES; + long lm = im*(2*lmax - (im-1)*MRES); + if ((norm == sht_schmidt)||(norm == sht_for_rotations)) { /// For Schmidt semi-normalized + t2 = SQRT(2*m+1); + alm[lm] /= t2; /// starting value divided by \f$ \sqrt{2m+1} \f$ + alm[lm+1] = t2; // l=m+1 + lm+=2; + for (long l=m+2; l<=lmax; ++l) { + t1 = SQRT((l+m)*(l-m)); + alm[lm+1] = (2*l-1)/t1; /// \f[ a_l^m = \frac{2l-1}{\sqrt{(l+m)(l-m)}} \f] + alm[lm] = - t2/t1; /// \f[ b_l^m = -\sqrt{\frac{(l-1+m)(l-1-m)}{(l+m)(l-m)}} \f] + t2 = t1; lm+=2; + } + } else { /// For orthonormal or 4pi-normalized + t2 = 2*m+1; + // starting value unchanged. + alm[lm+1] = SQRT(2*m+3); // l=m+1 + lm+=2; + for (long l=m+2; l<=lmax; ++l) { + t1 = (l+m)*(l-m); + alm[lm+1] = SQRT(((2*l+1)*(2*l-1))/t1); /// \f[ a_l^m = \sqrt{\frac{(2l+1)(2l-1)}{(l+m)(l-m)}} \f] + alm[lm] = - SQRT(((2*l+1)*t2)/((2*l-3)*t1)); /// \f[ b_l^m = -\sqrt{\frac{2l+1}{2l-3}\,\frac{(l-1+m)(l-1-m)}{(l+m)(l-m)}} \f] + t2 = t1; lm+=2; + } + } +/// - Compute analysis recurrence coefficients if necessary + if (norm == sht_schmidt) { + lm = im*(2*lmax - (im-1)*MRES); + real t1 = 2*m+1; + blm[lm] = alm[lm] * t1; + blm[lm+1] = alm[lm+1] * (2*m+3)/t1; + lm+=2; + for (long l=m+2; l<=lmax; ++l) { + real t3 = 2*l+1; + blm[lm] = alm[lm] * t3/(2*l-3); + blm[lm+1] = alm[lm+1] * t3/(2*l-1); + lm+=2; + } + } + + #ifdef SHTNS_ISHIOKA + /// PRE-COMPUTE VALUES FOR NEW RECURRENCE OF ISHIOKA (2018) + /// see https://doi.org/10.2151/jmsj.2018-019 + const long lm0 = im*(2*lmax - (im-1)*MRES); + real* elm = (real*) malloc( 3*(LMAX+4-m)/2 * sizeof(real) ); + real* dlm = elm + LMAX+4-m; + for (long l=m+1; l<=LMAX+4; l++) { // start at m+1, as for l=m, elm=0 + real num = (l-m)*(l+m); + real den = (2*l+1)*(2*l-1); + elm[l-(m+1)] = SQRT( num/den ); + } + + real alpha = 1.0L/elm[0]; // alpha_0 + for (long i=0; i<=(LMAX-m+1)/2; i++) { + dlm[i] = alpha; + alpha = (1.0L*(1-2*(i&1)))/(alpha*elm[2*i+2]*elm[2*i+1]); + } + + //clm[lm0] = alm[lm0]; + real a0m = alm[lm0]; // initial value is the same, but should be cast into alpha_lm (multiply all alpha_lm by alm[lm0]) + long lm1 = (im+1)*(2*lmax - (im)*MRES); + for (long i=0; i<(LMAX-m+1)/2; i++) { + real a = dlm[i]*dlm[i] * (1-2*(i&1)); + clm[lm0/2+2*i] = -a*(elm[2*i]*elm[2*i] + elm[2*i+1]*elm[2*i+1]); + clm[lm0/2+2*i+1] = a; + //if (lm0/2 + 2*i+1 >= lm1/2) printf("error at m=%d, i=%d (%ld >= %ld)\n",m,i, lm0/2 + 2*i+1, lm1/2); + // dlm[i] *= a0m; + } + + if (norm == sht_schmidt) a0m *= SQRT(2*m+1); + + const long lm3 = 3*im*(2*(LMAX+4) - (im-1)*MRES)/4; + long lm2 = 3*(im+1)*(2*(LMAX+4) - (im)*MRES)/4; + // change e(l,m), to be e(l,m) * alpha(l/2,m) + for (long i=0; i<=(LMAX-m+1)/2; i++) { + real a = dlm[i] * a0m; // multiply by coefficient of ymm + xlm[lm3 + 3*i] = elm[2*i] * a; + xlm[lm3 + 3*i+1] = a; + xlm[lm3 + 3*i+2] = elm[2*i+1] * a; + //if (lm3 + 3*i+2 >= lm2) printf("error at m=%d, i=%d (%ld >= %ld)\n",m,i, lm3 + 3*i+2, lm2); + } + + if (norm == sht_schmidt) { // correct for schmidt semi-normalized: + const long lm3 = 3*im*(2*(LMAX+4) - (im-1)*MRES)/4; + int l = m; + real sq = SQRT(2*l+1); + for (long i=0; i<=(LMAX-m+1)/2; i++) { + real sq1 = SQRT(2*(l+1)+1); + real sq2 = SQRT(2*(l+2)+1); + ylm[lm3 + 3*i] = xlm[lm3 + 3*i] * sq; + ylm[lm3 + 3*i+1] = xlm[lm3 + 3*i+1] * sq1; + ylm[lm3 + 3*i+2] = xlm[lm3 + 3*i+2] * sq2; + + xlm[lm3 + 3*i] /= sq; + xlm[lm3 + 3*i+1] /= sq1; + xlm[lm3 + 3*i+2] /= sq2; + sq = sq2; + l+=2; + } + } + free(elm); + #endif + } +} + +/// \internal returns the value of the Legendre Polynomial of degree l. +/// l is arbitrary, a direct recurrence relation is used, and a previous call to legendre_precomp() is not required. +static double legendre_Pl(const int l, double x) +{ + long int i; + real p, p0, p1; + + if ((l==0)||(x==1.0)) return ( 1. ); + if (x==-1.0) return ( (l&1) ? -1. : 1. ); + + p0 = 1.0; /// \f$ P_0 = 1 \f$ + p1 = x; /// \f$ P_1 = x \f$ + for (i=2; i<=l; ++i) { /// recurrence : \f[ l P_l = (2l-1) x P_{l-1} - (l-1) P_{l-2} \f] (works ok up to l=100000) + p = ((x*p1)*(2*i-1) - (i-1)*p0)/i; + p0 = p1; + p1 = p; + } + return ((double) p1); +} + + +/// \internal Generates the abscissa and weights for a Gauss-Legendre quadrature. +/// Newton method from initial Guess to find the zeros of the Legendre Polynome +/// \param x = abscissa, \param w = weights, \param n points. +/// \note Reference: Numerical Recipes, Cornell press. +static void gauss_nodes(real *x, real *w, const int n) +{ + long int i,l,m, k; + real z, z1, p1, p2, p3, pp; + real eps; + + eps = 2.3e-16; // desired precision, minimum = 2.2204e-16 (double) + if ((sizeof(eps) > 8) && (long_double_caps > 1)) eps = 1.1e-19; // desired precision, minimum = 1.0842e-19 (long double i387) + + m = (n+1)/2; + for (i=1;i<=m;++i) { + k=10; // maximum Newton iteration count to prevent infinite loop. + p1 = M_PIl; p2 = 2*n; + z = (1.0 - (n-1)/(p2*p2*p2)) * COS((p1*(4*i-1))/(4*n+2)); // initial guess + do { + p1 = z; // P_1 + p2 = 1.0; // P_0 + for(l=2;l<=n;++l) { // recurrence : l P_l = (2l-1) z P_{l-1} - (l-1) P_{l-2} (works ok up to l=100000) + p3 = p2; + p2 = p1; + p1 = ((2*l-1)*z*p2 - (l-1)*p3)/l; // The Legendre polynomial... + } + pp = ((1.-z)*(1.+z))/(n*(p2-z*p1)); // ... and its inverse derivative. + z1 = z; + z -= p1*pp; // Newton's method + } while (( FABS(z-z1) > (z1+z)*0.5*eps ) && (--k > 0)); + x[i-1] = z; // Build up the abscissas. + w[i-1] = 2.0*pp*pp/((1.-z)*(1.+z)); // Build up the weights. + x[n-i] = -z; + w[n-i] = w[i-1]; + } + if (n&1) x[n/2] = 0.0; // exactly zero. + +#if SHT_VERBOSE > 1 +// test integral to compute : + if (verbose) { + z = 0; + for (i=0;i0; i--) { + if (((double) x[i]) == ((double) x[i-1])) shtns_runerr("bad gauss points"); + } +} + +/// \internal Generates the abscissa and weights for a Féjer quadrature (#1). +/// Compute weights via FFT +/// \param x = abscissa, \param w = weights, \param n points. +/// \note Reference: Waldvogel (2006) "Fast Construction of the FejeÌr and Clenshaw-Curtis Quadrature Rules" +/// requires n > 2*lmax +static void fejer1_nodes(real *x, real *w, const int n) +{ + fftw_plan ifft; + double* wf = (double*) malloc( (2*n+2) * sizeof(double) ); + cplx* v1 = (cplx*) (wf + n); + + // the nodes + for (int i=0; i 2*lmax +static void fejer2_nodes(real *x, real *w, const int n) +{ + const double norm = 1.0/(n+1); + + // the nodes + for (int i=0; i "); + + // the weights, explicit formula + for (int k=0; k 2*lmax+2 +static void fejer2_nodes_poles(real *x, real *w, const int n) +{ + const double norm = 1.0/(n-1); + + // the nodes (including poles) + for (int i=0; i "); + + // the weights, explicit formula + for (int k=1; k 2*lmax +static void clenshaw_curtis_nodes_explicit(real *x, real *w, const int n) +{ + const double norm = 1.0/(n-1); + + // the nodes + for (int i=0; i "); + + // the weights, explicit formula + double* a = (double*) malloc((n+1)/2 * sizeof(double)); + for (int j=1; j<=(n-1)/2; j++) a[j] = 1./(0.25-j*j); // precompute these coefficients + + for (int k=0; k +#include +#include +// FFTW la derivee d/dx = ik (pas de moins !) +#include "fftw3/fftw3.h" + +// config file generated by ./configure +#include "sht_config.h" + +#define SHTNS_PRIVATE +#include "shtns.h" + +#ifdef _OPENMP + #include +#endif + +#ifdef HAVE_LIBCUFFT +#include +#include "shtns_cuda.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/// private gpu functions: +int cushtns_init_gpu(shtns_cfg); +void cushtns_release_gpu(shtns_cfg); +int cushtns_use_gpu(int); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif + +/* BEGIN COMPILE-TIME SETTINGS */ + +/// defines the maximum amount of memory in megabytes that SHTns should use. +#define SHTNS_MAX_MEMORY 2048 + +/// Minimum performance improve for DCT in \ref sht_auto mode. If not atained, we may switch back to gauss. +#define MIN_PERF_IMPROVE_DCT 1.05 + +/// Try to enforce at least this accuracy for DCT in sht_auto mode. +#define MIN_ACCURACY_DCT 1.e-8 + +/// The default \ref opt_polar threshold (0 disabled, 1.e-6 is aggressive, 1.e-10 is safe, 1.e-14 is VERY safe) +#define SHT_DEFAULT_POLAR_OPT 1.e-10 + +/// The default \ref norm used by shtns_init +#define SHT_DEFAULT_NORM ( sht_orthonormal ) +//#define SHT_DEFAULT_NORM ( sht_schmidt | SHT_NO_CS_PHASE ) + +/// The maximum order of non-linear terms to be resolved by SH transform by default. +/// 1 : no non-linear terms. 2 : quadratic non-linear terms (default), 3 : triadic, ... +/// must be larger or equal to 1. +#define SHT_DEFAULT_NL_ORDER 1 + +/// minimum NLAT to consider the use of DCT acceleration. +#define SHT_MIN_NLAT_DCT 64 + +/// time-limit for timing individual transforms (in seconds) +#define SHT_TIME_LIMIT 0.2 + +/* END COMPILE-TIME SETTINGS */ + +// sht variants (std, ltr) +enum sht_variants { SHT_STD, SHT_LTR, SHT_M, SHT_NVAR }; +// sht types (scal synth, scal analys, vect synth, ...) +enum sht_types { SHT_TYP_SSY, SHT_TYP_SAN, SHT_TYP_VSY, SHT_TYP_VAN, + SHT_TYP_GSP, SHT_TYP_GTO, SHT_TYP_3SY, SHT_TYP_3AN, SHT_NTYP }; + +// sht grids +enum sht_grids { GRID_NONE, GRID_GAUSS, GRID_REGULAR, GRID_POLES }; + +// pointer to various function types +typedef void (*pf2l)(shtns_cfg, void*, void*, long int); +typedef void (*pf3l)(shtns_cfg, void*, void*, void*, long int); +typedef void (*pf4l)(shtns_cfg, void*, void*, void*, void*, long int); +typedef void (*pf6l)(shtns_cfg, void*, void*, void*, void*, void*, void*, long int); +typedef void (*pf2ml)(shtns_cfg, int, void*, void*, long int); +typedef void (*pf3ml)(shtns_cfg, int, void*, void*, void*, long int); +typedef void (*pf4ml)(shtns_cfg, int, void*, void*, void*, void*, long int); +typedef void (*pf6ml)(shtns_cfg, int, void*, void*, void*, void*, void*, void*, long int); + +/// structure containing useful information about the SHT. +struct shtns_info { // MUST start with "int nlm;" +/* PUBLIC PART (if modified, shtns.h should be modified acordingly) */ + unsigned int nlm; ///< total number of (l,m) spherical harmonics components. + unsigned short lmax; ///< maximum degree (lmax) of spherical harmonics. + unsigned short mmax; ///< maximum order (mmax*mres) of spherical harmonics. + unsigned short mres; ///< the periodicity along the phi axis. + unsigned short nphi; ///< number of spatial points in Phi direction (longitude) + unsigned short nlat; ///< number of spatial points in Theta direction (latitude) ... + unsigned short nlat_2; ///< ...and half of it (using (shtns.nlat+1)/2 allows odd shtns.nlat.) + int *lmidx; ///< (virtual) index in SH array of given im (size mmax+1) : LiM(l,im) = lmidx[im] + l + unsigned short *li; ///< degree l for given mode index (size nlm) : li[lm] + unsigned short *mi; ///< order m for given mode index (size nlm) : mi[lm] + double *ct, *st; ///< cos(theta) and sin(theta) arrays (size nlat) + unsigned int nspat; ///< number of real numbers that must be allocated in a spatial field. + unsigned int nlm_cplx; ///< number of complex coefficients to represent a complex-valued spatial field. +/* END OF PUBLIC PART */ + + short fftc_mode; ///< how to perform the complex fft : -1 = no fft; 0 = interleaved/native; 1 = split/transpose. + unsigned short nthreads; ///< number of threads (openmp). + unsigned short *tm; ///< start theta value for SH (polar optimization : near the poles the legendre polynomials go to zero for high m's) + short robert_form; ///< flag for Robert formulation: if true, the vector synthesis are multiplied by sin(theta) and the analysis are divided by sin(theta). + int k_stride_a; ///< stride in theta direction + int m_stride_a; ///< stride in phi direction (m) + double *wg; ///< Gauss weights for Gauss-Legendre quadrature. + double *st_1; ///< 1/sin(theta); + double mpos_scale_analys; ///< scale factor for analysis, handles real-norm (0.5 or 1.0); + + fftw_plan ifftc, fftc; + fftw_plan ifft_cplx, fft_cplx; // for complex-valued spatial fields. + + /* Legendre function generation arrays */ + double *alm; // coefficient list for Legendre function recurrence (size 2*NLM) + double *blm; // coefficient list for modified Legendre function recurrence for analysis (size 2*NLM) + double *l_2; // array of size (LMAX+1) containing 1./l(l+1) for increasing integer l. + /* matrices for vector transform (to convert to scalar transforms) */ + double *mx_stdt; // sparse matrix for sin(theta).d/dtheta, couples l-1 and l+1 + double *mx_van; // sparse matrix for sin(theta).d/dtheta + 2*cos(theta), couples l-1 and l+1 + #ifdef SHTNS_ISHIOKA + /* for the new recurrence of Ishioka */ + double *clm; // a_lm, b_lm + double *xlm; // epsilon_lm * alpha_lm + double *x2lm; // epsilon_lm * alpha_lm, scaled for analysis (different from xlm only with Schmidt semi-normalization) + #endif + + void* ftable[SHT_NVAR][SHT_NTYP]; // pointers to transform functions. + + /* MEM matrices */ + #ifdef SHTNS_MEM + double **ylm; // matrix for inverse transform (synthesis) + struct DtDp** dylm; // theta and phi derivative of Ylm matrix + double **zlm; // matrix for direct transform (analysis) + struct DtDp** dzlm; + #endif + + /* rotation stuff (pseudo-spectral) */ + unsigned npts_rot; // number of physical points needed + fftw_plan fft_rot; // Fourier transform for rotations + double* ct_rot; // cos(theta) array + double* st_rot; // sin(theta) array + + /* _to_lat stuff */ + double* ylm_lat; + double ct_lat; + fftw_plan ifft_lat; ///< fftw plan for SHqst_to_lat + int nphi_lat; ///< nphi of previous SHqst_to_lat + + #ifdef HAVE_LIBCUFFT + /* cuda stuff */ + short cu_flags; + short cu_fft_mode; + double* d_alm; + double* d_ct; + double* d_mx_stdt; + double* d_mx_van; + double* gpu_mem; + double* xfft; + double* xfft_cpu; + size_t nlm_stride, spat_stride; + cudaStream_t xfer_stream, comp_stream; // the cuda streams + cufftHandle cufft_plan; // the cufft Handle + #endif + + /* other misc informations */ + unsigned char nlorder; // order of non-linear terms to be resolved by SH transform. + unsigned char grid; // store grid type. + short norm; // store the normalization of the Spherical Harmonics (enum \ref shtns_norm + \ref SHT_NO_CS_PHASE flag) + unsigned fftw_plan_mode; + unsigned layout; // requested data layout + double Y00_1, Y10_ct, Y11_st; + shtns_cfg next; // pointer to next sht_setup or NULL (records a chained list of SHT setup). + // the end should be aligned on the size of int, to allow the storage of small arrays. +}; + +// define shortcuts to sizes. +#define NLM shtns->nlm +#define LMAX shtns->lmax +#define NLAT shtns->nlat +#define NLAT_2 shtns->nlat_2 +#define NPHI shtns->nphi +#define MMAX shtns->mmax +#define MRES shtns->mres +#define SHT_NL_ORDER shtns->nlorder + +// define index in alm/blm matrices +#define ALM_IDX(shtns, im) ( (im)*(2*(shtns->lmax+1) - ((im)-1)*shtns->mres) ) + +// SHT_NORM without CS_PHASE +#define SHT_NORM (shtns->norm & 0x0FF) + +#ifndef M_PI +# define M_PI 3.1415926535897932384626433832795 +#endif +#ifndef M_PIl +# define M_PIl 3.1415926535897932384626433832795L +#endif + +// value for on-the-fly transforms is lower because it allows to optimize some more (don't compute l which are not significant). +#define SHT_L_RESCALE_FLY 1000 +// set to a value close to the machine accuracy, it allows to speed-up on-the-fly SHTs with very large l (lmax > SHT_L_RESCALE_FLY). +#define SHT_ACCURACY 1.0e-20 +// scale factor for extended range numbers (used in on-the-fly transforms to compute recurrence) +#define SHT_SCALE_FACTOR 2.9073548971824275622e+135 +//#define SHT_SCALE_FACTOR 2.0370359763344860863e+90 + + +#if _GCC_VEC_ == 0 + #undef _GCC_VEC_ +#endif + +#ifdef __NVCC__ + // disable vector extensions when compiling cuda code. + #undef _GCC_VEC_ +#endif + +/* are there vector extensions available ? */ +#if !(defined __SSE2__ || defined __VSX__ ) + #undef _GCC_VEC_ +#endif +#ifdef __INTEL_COMPILER + #if __INTEL_COMPILER < 1400 + #undef _GCC_VEC_ + #warning "no vector extensions available ! use gcc 4+ or icc 14+ for best performance." + #endif +#endif +#ifdef __GNUC__ + #if __GNUC__ < 4 + #undef _GCC_VEC_ + #warning "no vector extensions available ! use gcc 4+ or icc 14+ for best performance." + #endif +#endif + +#if _GCC_VEC_ && __VSX__ + // support VSX (IBM Power) + #include + #define MIN_ALIGNMENT 16 + #define VSIZE 2 + //typedef double s2d __attribute__ ((vector_size (8*VSIZE))); // vector that should behave like a real scalar for complex number multiplication. + //typedef double v2d __attribute__ ((vector_size (8*VSIZE))); // vector that contains a complex number + typedef __vector double s2d; + typedef __vector double v2d; + typedef __vector double rnd; + #define VSIZE2 2 + #define _SIMD_NAME_ "vsx" + //typedef double rnd __attribute__ ((vector_size (VSIZE2*8))); // vector of 2 doubles. + #define vall(x) vec_splats((double)x) + inline static s2d vreverse(s2d a) { + const vector unsigned char perm = { 8,9,10,11,12,13,14,15, 0,1,2,3,4,5,6,7 }; + return vec_perm(a,a,perm); + } + #define vxchg(a) vreverse(a) + #define vread(mem, idx) vec_ld((int)(idx)*16, ((const vector double*)mem)) + #define vstor(mem, idx, v) vec_st((v2d)v, (int)(idx)*16, ((vector double*)mem)) + inline static double reduce_add(rnd a) { + rnd b = a + vec_mergel(a, a); + return( vec_extract(b,0) ); + } + inline static v2d v2d_reduce(rnd a, rnd b) { + v2d c = vec_mergel(a, b); b = vec_mergeh(a, b); + return b + c; + } + inline static v2d addi(v2d a, v2d b) { + const s2d mp = {-1.0, 1.0}; + return a + vxchg(b)*mp; + } + inline static s2d subadd(s2d a, s2d b) { + const s2d mp = {-1.0, 1.0}; + return a + b*mp; + } + + #define vdup(x) vec_splats((double)x) + #define vlo(a) vec_extract(a, 0) + #define vhi(a) vec_extract(a, 1) + #define vcplx_real(a) vec_extract(a, 0) + #define vcplx_imag(a) vec_extract(a, 1) + inline static s2d vec_mix_lohi(s2d a, s2d b) { // same as _mm_shuffle_pd(a,b,2) + const vector unsigned char perm = {0,1,2,3,4,5,6,7, 24,25,26,27,28,29,30,31}; + return vec_perm(a,b,perm); + } + + #define S2D_STORE(mem, idx, ev, od) ((s2d*)mem)[idx] = ev+od; ((s2d*)mem)[NLAT_2-1 - (idx)] = vxchg(ev-od); + #define S2D_CSTORE(mem, idx, er, od, ei, oi) { \ + rnd aa = vxchg(ei + oi) + (er + od); rnd bb = (er + od) - vxchg(ei + oi); \ + ((s2d*)mem)[idx] = vec_mix_lohi(bb, aa); \ + ((s2d*)mem)[(NPHI-2*im)*NLAT_2 + (idx)] = vec_mix_lohi(aa, bb); \ + aa = vxchg(er - od) + (ei - oi); bb = vxchg(er - od) - (ei - oi); \ + ((s2d*)mem)[NLAT_2-1 -(idx)] = vec_mix_lohi(bb, aa); \ + ((s2d*)mem)[(NPHI+1-2*im)*NLAT_2 -1 -(idx)] = vec_mix_lohi(aa, bb); } + #define S2D_CSTORE2(mem, idx, er, od, ei, oi) { \ + ((s2d*)mem)[(idx)*2] = vec_mergeh(er+od, ei+oi); \ + ((s2d*)mem)[(idx)*2+1] = vec_mergel(er+od, ei+oi); \ + ((s2d*)mem)[NLAT-1-(idx)*2] = vec_mergeh(er-od, ei-oi); \ + ((s2d*)mem)[NLAT-2-(idx)*2] = vec_mergel(er-od, ei-oi); } + inline static void S2D_STORE_4MAGIC(double* mem, long idx, rnd ev, rnd od) { + s2d n = ev+od; s2d s = ev-od; + ((s2d*)mem)[(idx)*2] = vec_mergeh(n, s); + ((s2d*)mem)[(idx)*2+1] = vec_mergel(n, s); + } + inline static void S2D_CSTORE_4MAGIC(double* mem, double* mem_m, long idx, rnd er, rnd od, rnd ei, rnd oi) { + rnd nr = er + od; rnd ni = ei + oi; + rnd sr = er - od; rnd si = ei - oi; + ((s2d*)mem)[idx*2] = vec_mergeh(nr-si, sr+ni); + ((s2d*)mem_m)[idx*2] = vec_mergeh(nr+si, sr-ni); + ((s2d*)mem)[idx*2+1] = vec_mergel(nr-si, sr+ni); + ((s2d*)mem_m)[idx*2+1] = vec_mergel(nr+si, sr-ni); + } + inline static void S2D_CSTORE2_4MAGIC(double* mem, long idx, rnd er, rnd od, rnd ei, rnd oi) { + ((s2d*)mem)[idx*4] = vec_mergeh(er+od, ei+oi); + ((s2d*)mem)[idx*4+1] = vec_mergeh(er-od, ei-oi); + ((s2d*)mem)[idx*4+2] = vec_mergel(er+od, ei+oi); + ((s2d*)mem)[idx*4+3] = vec_mergel(er-od, ei-oi); + } + + /*inline static void* VMALLOC(size_t s) { + void* ptr; + posix_memalign(&ptr, MIN_ALIGNMENT, s); + return ptr; + }*/ + #define VMALLOC(s) malloc(s) + #define VFREE(s) free(s) +#endif + + + +#if _GCC_VEC_ && __SSE2__ + #define VSIZE 2 + typedef double s2d __attribute__ ((vector_size (8*VSIZE))); // vector that should behave like a real scalar for complex number multiplication. + typedef double v2d __attribute__ ((vector_size (8*VSIZE))); // vector that contains a complex number + #ifdef __AVX512F__ + #define MIN_ALIGNMENT 64 + #define VSIZE2 8 + #include + // these values must be adjusted for the larger vectors of the MIC + #undef SHT_L_RESCALE_FLY + #undef SHT_ACCURACY + #define SHT_L_RESCALE_FLY 1800 + #define SHT_ACCURACY 1.0e-40 + // Allocate memory aligned on 64 bytes for AVX-512 + #define VMALLOC(s) _mm_malloc(s, MIN_ALIGNMENT) + #define VFREE(s) _mm_free(s) + #define _SIMD_NAME_ "avx512" + typedef double rnd __attribute__ ((vector_size (VSIZE2*8))); // vector of 8 doubles. + typedef double s4d __attribute__ ((vector_size (4*8))); // vector of 4 doubles. + #define vall(x) ((rnd) _mm512_set1_pd(x)) + #define vread(mem, idx) ((rnd)_mm512_loadu_pd( ((double*)mem) + (idx)*8 )) + #define vstor(mem, idx, v) _mm512_storeu_pd( ((double*)mem) + (idx)*8 , v) + inline static rnd vreverse(rnd a) { // reverse vector: [0,1,2,3,4,5,6,7] => [7,6,5,4,3,2,1,0] + a = _mm512_permute_pd(a,0x55); // [1,0,3,2,5,4,7,6] + return _mm512_shuffle_f64x2(a,a,0x1B); // [7,6,5,4,3,2,1,0] + //return (rnd) _mm512_permutexvar_pd(_mm512_set_epi64(0,1,2,3,4,5,6,7), a); // same speed on KNL, but requires a constant to be loaded... + } + inline static double reduce_add(rnd a) { + return _mm512_reduce_add_pd(a); + } + inline static v2d v2d_reduce(rnd a, rnd b) { + rnd x = (rnd)_mm512_unpackhi_pd(a, b) + (rnd)_mm512_unpacklo_pd(a, b); + s4d y = (s4d)_mm512_castpd512_pd256(x) + (s4d)_mm512_extractf64x4_pd(x,1); + return (v2d)_mm256_castpd256_pd128(y) + (v2d)_mm256_extractf128_pd(y,1); + } + /* Some AVX512 vector tricks: + * pair-wise exchange: _mm512_permute_pd(a, 0x55) => [1,0,3,2,5,4,7,6] + * exchange middle elements of quartets: _mm512_permutex_pd(a, 0xD8) => [0,2,1,3,4,6,5,7] + * exchange middle elements of quartets + swap pairs: _mm512_permutex_pd(a, 0x8D) => [1,3,0,2,5,7,4,6] + * reverse vector of pairs: _mm512_shuffle_f64x2(a,a, 0x1B) => [6,7,4,5,2,3,0,1] + */ + #define S2D_STORE(mem, idx, ev, od) \ + _mm512_storeu_pd(((double*)mem) + (idx)*8, ev+od); \ + _mm512_storeu_pd(((double*)mem) + NLAT-8 -(idx)*8, vreverse(ev-od)); + #define S2D_CSTORE(mem, idx, er, od, ei, oi) { \ + rnd ni = ei+oi; rnd sr = er-od; rnd nr = er+od; rnd si = ei-oi; \ + ni = (rnd)_mm512_permute_pd(ni, 0x55); sr = (rnd)_mm512_permute_pd(sr, 0x55); /* pair-wise exchange: [1,0,3,2,5,4,7,6] */ \ + rnd aa = ni + nr; rnd bb = nr - ni; rnd cc = sr + si; rnd dd = sr - si; \ + nr = _mm512_mask_blend_pd((__mmask8) 0xAA, bb, aa ); ni = _mm512_mask_blend_pd((__mmask8) 0xAA, aa, bb ); \ + sr = _mm512_mask_blend_pd((__mmask8) 0xAA, dd, cc ); si = _mm512_mask_blend_pd((__mmask8) 0xAA, cc, dd ); \ + _mm512_storeu_pd(((double*)mem) + (idx)*8, nr); \ + _mm512_storeu_pd(((double*)mem) + (NPHI-2*im)*NLAT + (idx)*8, ni); \ + sr = _mm512_shuffle_f64x2(sr,sr, 0x1B); si = _mm512_shuffle_f64x2(si,si, 0x1B); \ + _mm512_storeu_pd(((double*)mem) + NLAT-8 -(idx)*8, sr); \ + _mm512_storeu_pd(((double*)mem) + (NPHI+1-2*im)*NLAT-8 -(idx)*8, si); } + +// This may replace the first half of the following macro: +// rnd c = _mm512_permutex2var_pd(a, _mm512_set_epi64(11,3,10,2,9,1,8,0), b); +// rnd d = _mm512_permutex2var_pd(a, _mm512_set_epi64(15,7,14,6,13,5,12,4), b); + #define S2D_CSTORE2(mem, idx, er, od, ei, oi) { \ + rnd nr = er+od; rnd ni = ei+oi; \ + rnd sr = er-od; rnd si = ei-oi; \ + nr = (rnd)_mm512_permutex_pd(nr, 0xD8); ni = (rnd)_mm512_permutex_pd(ni, 0xD8); \ + sr = (rnd)_mm512_permutex_pd(sr, 0x8D); si = (rnd)_mm512_permutex_pd(si, 0x8D); \ + rnd aa = (rnd)_mm512_unpacklo_pd(nr, ni); rnd bb = (rnd)_mm512_unpackhi_pd(nr, ni); \ + nr = _mm512_shuffle_f64x2(aa,bb, 0x44); ni = _mm512_shuffle_f64x2(aa,bb, 0xEE); \ + rnd cc = (rnd)_mm512_unpacklo_pd(sr, si); rnd dd = (rnd)_mm512_unpackhi_pd(sr, si); \ + sr = _mm512_shuffle_f64x2(dd,cc, 0xEE); si = _mm512_shuffle_f64x2(dd,cc, 0x44); \ + _mm512_storeu_pd(((double*)mem) + (idx)*16, nr); \ + _mm512_storeu_pd(((double*)mem) + (idx)*16+8, ni); \ + _mm512_storeu_pd(((double*)mem) + NLAT*2-16 - (idx)*16, sr); \ + _mm512_storeu_pd(((double*)mem) + NLAT*2-8 - (idx)*16, si); } + + inline static void S2D_STORE_4MAGIC(double* mem, long idx, rnd ev, rnd od) { + rnd n = ev+od; rnd s = ev-od; + n = _mm512_permutex_pd(n,0xD8); s = _mm512_permutex_pd(s,0xD8); // [0,2,1,3, 4,6,5,7] + rnd a = _mm512_unpacklo_pd(n, s); rnd b = _mm512_unpackhi_pd(n, s); // [00,11, 44,55] and [22,33, 66,77] + _mm512_storeu_pd(mem + idx*16, _mm512_shuffle_f64x2(a,b, 0x44) ); // [00,11, 22,33] + _mm512_storeu_pd(mem + idx*16 +8, _mm512_shuffle_f64x2(a,b, 0xEE) ); // [44,55, 66,77] + } + + inline static void S2D_CSTORE_4MAGIC(double* mem, double* mem_m, long idx, rnd er, rnd od, rnd ei, rnd oi) { + rnd nr = er + od; rnd ni = ei + oi; + rnd sr = er - od; rnd si = ei - oi; + er = nr - si; ei = sr + ni; + od = nr + si; oi = sr - ni; + er = _mm512_permutex_pd(er,0xD8); ei = _mm512_permutex_pd(ei,0xD8); // [0,2,1,3, 4,6,5,7] + od = _mm512_permutex_pd(od,0xD8); oi = _mm512_permutex_pd(oi,0xD8); + nr = _mm512_unpacklo_pd(er, ei); // [00,11, 44,55] + ni = _mm512_unpackhi_pd(er, ei); // [22,33, 66,77] + sr = _mm512_unpacklo_pd(od, oi); // [00,11, 44,55] + si = _mm512_unpackhi_pd(od, oi); // [22,33, 66,77] + _mm512_storeu_pd(mem + idx*16, _mm512_shuffle_f64x2(nr,ni, 0x44) ); // [00,11,22,33] + _mm512_storeu_pd(mem + idx*16 +8, _mm512_shuffle_f64x2(nr,ni, 0xEE) ); // [44,55,66,77] + _mm512_storeu_pd(mem_m + idx*16, _mm512_shuffle_f64x2(sr,si, 0x44) ); + _mm512_storeu_pd(mem_m + idx*16 +8, _mm512_shuffle_f64x2(sr,si, 0xEE) ); + } + + inline static void S2D_CSTORE2_4MAGIC(double* mem, long idx, rnd er, rnd od, rnd ei, rnd oi) { + rnd nr = er + od; rnd ni = ei + oi; + rnd sr = er - od; rnd si = ei - oi; + rnd aa = (rnd)_mm512_unpacklo_pd(nr, sr); rnd bb = (rnd)_mm512_unpackhi_pd(nr, sr); // [n0,s0,n2,s2,n4,s4,n6,s6] and [n1,s1,n3,s3,n5,s5,n7,s7] + rnd cc = (rnd)_mm512_unpacklo_pd(ni, si); rnd dd = (rnd)_mm512_unpackhi_pd(ni, si); // same with imaginary part + aa = _mm512_permutex_pd(aa, 0xD8); bb = _mm512_permutex_pd(bb, 0xD8); // [n0,n2,s0,s2,n4,n6,s4,s6] and [n1,n3,s1,s3,n5,n7,s5,s7] + cc = _mm512_permutex_pd(cc, 0xD8); dd = _mm512_permutex_pd(dd, 0xD8); // same with imaginary part + nr = (rnd)_mm512_unpacklo_pd(aa, cc); // [n0,s0,n4,s4] packed real/imag + sr = (rnd)_mm512_unpackhi_pd(aa, cc); // [n2,s2,n6,s6] packed real/imag + ni = (rnd)_mm512_unpacklo_pd(bb, dd); // [n1,s1,n5,s5] packed real/imag + si = (rnd)_mm512_unpackhi_pd(bb, dd); // [n3,s3,n7,s7] packed real/imag + _mm512_storeu_pd(mem + idx*32, _mm512_shuffle_f64x2(nr,ni, 0x44) ); //[n0,s0,n1,s1] + _mm512_storeu_pd(mem + idx*32 +8, _mm512_shuffle_f64x2(sr,si, 0x44) ); //[n2,s2,n3,s3] + _mm512_storeu_pd(mem + idx*32 +16, _mm512_shuffle_f64x2(nr,ni, 0xEE) ); //[n4,s4,n5,s5] + _mm512_storeu_pd(mem + idx*32 +24, _mm512_shuffle_f64x2(sr,si, 0xEE) ); //[n6,s6,n7,s7] + } + + #elif defined __AVX__ + #define MIN_ALIGNMENT 32 + #define VSIZE2 4 + #include + // Allocate memory aligned on 32 bytes for AVX + #define VMALLOC(s) _mm_malloc(s, MIN_ALIGNMENT) + #define VFREE(s) _mm_free(s) + typedef double rnd __attribute__ ((vector_size (VSIZE2*8))); // vector of 4 doubles. + #define vall(x) ((rnd) _mm256_set1_pd(x)) + #define vread(mem, idx) ((rnd)_mm256_loadu_pd( ((double*)mem) + (idx)*4 )) + #define vstor(mem, idx, v) _mm256_storeu_pd( ((double*)mem) + (idx)*4 , v) + #ifdef __AVX2__ + #define _SIMD_NAME_ "avx2" + inline static rnd vreverse(rnd a) { // reverse vector: [0,1,2,3] => [3,2,1,0] + return (rnd) _mm256_permute4x64_pd(a, 0x1B); + } + #else + #define _SIMD_NAME_ "avx" + inline static rnd vreverse(rnd a) { // reverse vector: [0,1,2,3] => [3,2,1,0] + a = (rnd)_mm256_shuffle_pd(a, a, 5); // [0,1,2,3] => [1,0,3,2] + return (rnd)_mm256_permute2f128_pd(a,a, 1); // => [3,2,1,0] + } + #endif + inline static double reduce_add(rnd a) { + v2d t = (v2d)_mm256_castpd256_pd128(a) + (v2d)_mm256_extractf128_pd(a,1); + return _mm_cvtsd_f64(t) + _mm_cvtsd_f64(_mm_unpackhi_pd(t,t)); + } + inline static v2d v2d_reduce(rnd a, rnd b) { + a = _mm256_hadd_pd(a, b); + return (v2d)_mm256_castpd256_pd128(a) + (v2d)_mm256_extractf128_pd(a,1); + } + #define S2D_STORE(mem, idx, ev, od) \ + _mm256_storeu_pd(((double*)mem) + (idx)*4, ev+od); \ + _mm256_storeu_pd(((double*)mem) + NLAT-4-(idx)*4, vreverse(ev-od)); + #define S2D_CSTORE(mem, idx, er, od, ei, oi) { \ + rnd ni = ei+oi; rnd sr = er-od; rnd nr = er+od; rnd si = ei-oi; \ + ni = (rnd)_mm256_shuffle_pd(ni,ni,5); sr = (rnd)_mm256_shuffle_pd(sr,sr,5); \ + rnd aa = ni + nr; rnd bb = nr - ni; \ + rnd cc = sr + si; rnd dd = sr - si; \ + nr = _mm256_blend_pd (bb, aa, 10 ); ni = _mm256_blend_pd (aa, bb, 10 ); \ + sr = _mm256_blend_pd (dd, cc, 10 ); si = _mm256_blend_pd (cc, dd, 10 ); \ + _mm256_storeu_pd(((double*)mem) + (idx)*4, nr); \ + _mm256_storeu_pd(((double*)mem) + (NPHI-2*im)*NLAT + (idx)*4, ni); \ + sr = _mm256_permute2f128_pd(sr,sr,1); si = _mm256_permute2f128_pd(si,si,1); \ + _mm256_storeu_pd(((double*)mem) + NLAT-4 - (idx)*4, sr ); \ + _mm256_storeu_pd(((double*)mem) + (NPHI+1-2*im)*NLAT-4 - (idx)*4, si ); } + + #define S2D_CSTORE2(mem, idx, er, od, ei, oi) { \ + rnd nr = er+od; rnd ni = ei+oi; rnd sr = er-od; rnd si = ei-oi; \ + rnd aa = (rnd)_mm256_unpacklo_pd(nr, ni); rnd bb = (rnd)_mm256_unpackhi_pd(nr, ni); \ + nr = _mm256_permute2f128_pd(aa, bb, 0x20); ni = _mm256_permute2f128_pd(aa, bb, 0x31); \ + rnd cc = (rnd)_mm256_unpacklo_pd(sr, si); rnd dd = (rnd)_mm256_unpackhi_pd(sr, si); \ + _mm256_storeu_pd(((double*)mem) + (idx)*8, nr); \ + _mm256_storeu_pd(((double*)mem) + (idx)*8 +4, ni); \ + sr = _mm256_permute2f128_pd(dd, cc, 0x20); si = _mm256_permute2f128_pd(dd, cc, 0x31); \ + _mm256_storeu_pd(((double*)mem) + NLAT*2 -4 -(idx)*8, sr); \ + _mm256_storeu_pd(((double*)mem) + NLAT*2 -8 -(idx)*8, si); } + + inline static void S2D_STORE_4MAGIC(double* mem, long idx, rnd ev, rnd od) { + rnd n = ev+od; rnd s = ev-od; + rnd a = _mm256_unpacklo_pd(n, s); rnd b = _mm256_unpackhi_pd(n, s); + _mm256_storeu_pd(((double*)mem) + (idx)*8, _mm256_permute2f128_pd(a,b,0x20) ); + _mm256_storeu_pd(((double*)mem) + (idx)*8 +4, _mm256_permute2f128_pd(a,b,0x31) ); + } + + inline static void S2D_CSTORE_4MAGIC(double* mem, double* mem_m, long idx, rnd er, rnd od, rnd ei, rnd oi) { + rnd nr = er + od; rnd ni = ei + oi; + rnd sr = er - od; rnd si = ei - oi; + rnd a0 = _mm256_unpacklo_pd(nr-si, sr+ni); + rnd b0 = _mm256_unpacklo_pd(nr+si, sr-ni); + rnd a1 = _mm256_unpackhi_pd(nr-si, sr+ni); + rnd b1 = _mm256_unpackhi_pd(nr+si, sr-ni); + _mm256_storeu_pd(mem + idx*8, _mm256_permute2f128_pd(a0,a1,0x20) ); + _mm256_storeu_pd(mem + idx*8 +4, _mm256_permute2f128_pd(a0,a1,0x31) ); + _mm256_storeu_pd(mem_m + idx*8, _mm256_permute2f128_pd(b0,b1,0x20) ); + _mm256_storeu_pd(mem_m + idx*8 +4, _mm256_permute2f128_pd(b0,b1,0x31) ); + } + + inline static void S2D_CSTORE2_4MAGIC(double* mem, long idx, rnd er, rnd od, rnd ei, rnd oi) { + rnd aa = (rnd)_mm256_unpacklo_pd(er+od, ei+oi); rnd bb = (rnd)_mm256_unpackhi_pd(er+od, ei+oi); + rnd cc = (rnd)_mm256_unpacklo_pd(er-od, ei-oi); rnd dd = (rnd)_mm256_unpackhi_pd(er-od, ei-oi); + _mm256_storeu_pd(mem + idx*16, _mm256_permute2f128_pd(aa,cc,0x20) ); + _mm256_storeu_pd(mem + idx*16 +4, _mm256_permute2f128_pd(bb,dd,0x20) ); + _mm256_storeu_pd(mem + idx*16 +8, _mm256_permute2f128_pd(aa,cc,0x31) ); + _mm256_storeu_pd(mem + idx*16 +12, _mm256_permute2f128_pd(bb,dd,0x31) ); + } + #else + #define MIN_ALIGNMENT 16 + #define VSIZE2 2 + typedef double rnd __attribute__ ((vector_size (VSIZE2*8))); // vector of 2 doubles. + // Allocate memory aligned on 16 bytes for SSE2 (fftw_malloc works only if fftw was compiled with --enable-sse2) + // in 64 bit systems, malloc should be 16 bytes aligned anyway. + #define VMALLOC(s) ( (sizeof(void*) >= 8) ? malloc(s) : _mm_malloc(s, MIN_ALIGNMENT) ) + #define VFREE(s) ( (sizeof(void*) >= 8) ? free(s) : _mm_free(s) ) + #ifdef __SSE3__ + #include + #define _SIMD_NAME_ "sse3" + inline static v2d v2d_reduce(v2d a, v2d b) { + return _mm_hadd_pd(a,b); + } + #else + #include + #define _SIMD_NAME_ "sse2" + inline static v2d v2d_reduce(v2d a, v2d b) { + v2d c = _mm_unpacklo_pd(a, b); b = _mm_unpackhi_pd(a, b); + return b + c; + } + #endif + inline static rnd vreverse(rnd a) { return (rnd)_mm_shuffle_pd(a,a,1); } + #define reduce_add(a) ( _mm_cvtsd_f64(a) + _mm_cvtsd_f64(_mm_unpackhi_pd(a,a)) ) + #define vall(x) ((rnd) _mm_set1_pd(x)) + #define vread(mem, idx) ((s2d*)mem)[idx] + #define vstor(mem, idx, v) ((s2d*)mem)[idx] = v + #define vxchg(a) ((v2d)_mm_shuffle_pd(a,a,1)) + #define S2D_STORE(mem, idx, ev, od) ((s2d*)mem)[idx] = ev+od; ((s2d*)mem)[NLAT_2-1 - (idx)] = vxchg(ev-od); + #define S2D_CSTORE(mem, idx, er, od, ei, oi) { \ + rnd aa = vxchg(ei + oi) + (er + od); rnd bb = (er + od) - vxchg(ei + oi); \ + ((s2d*)mem)[idx] = _mm_shuffle_pd(bb, aa, 2 ); \ + ((s2d*)mem)[(NPHI-2*im)*NLAT_2 + (idx)] = _mm_shuffle_pd(aa, bb, 2 ); \ + aa = vxchg(er - od) + (ei - oi); bb = vxchg(er - od) - (ei - oi); \ + ((s2d*)mem)[NLAT_2-1 -(idx)] = _mm_shuffle_pd(bb, aa, 2 ); \ + ((s2d*)mem)[(NPHI+1-2*im)*NLAT_2 -1 -(idx)] = _mm_shuffle_pd(aa, bb, 2 ); } + #define S2D_CSTORE2(mem, idx, er, od, ei, oi) { \ + ((s2d*)mem)[(idx)*2] = _mm_unpacklo_pd(er+od, ei+oi); \ + ((s2d*)mem)[(idx)*2+1] = _mm_unpackhi_pd(er+od, ei+oi); \ + ((s2d*)mem)[NLAT-1-(idx)*2] = _mm_unpacklo_pd(er-od, ei-oi); \ + ((s2d*)mem)[NLAT-2-(idx)*2] = _mm_unpackhi_pd(er-od, ei-oi); } + + inline static void S2D_STORE_4MAGIC(double* mem, long idx, rnd ev, rnd od) { + rnd n = ev+od; rnd s = ev-od; + ((s2d*)mem)[idx*2] = _mm_unpacklo_pd(n, s); // [n0,s0] + ((s2d*)mem)[idx*2+1] = _mm_unpackhi_pd(n, s); // [n1,s1] + } + + inline static void S2D_CSTORE_4MAGIC(double* mem, double* mem_m, long idx, rnd er, rnd od, rnd ei, rnd oi) { + rnd nr = er + od; rnd ni = ei + oi; + rnd sr = er - od; rnd si = ei - oi; + er = nr - si; od = sr+ni; + ei = nr + si; oi = sr-ni; + nr = _mm_unpacklo_pd(er, od); + sr = _mm_unpackhi_pd(er, od); + ni = _mm_unpacklo_pd(ei, oi); + si = _mm_unpackhi_pd(ei, oi); + ((s2d*)mem)[idx*2] = nr; + ((s2d*)mem)[idx*2+1] = sr; + ((s2d*)mem_m)[idx*2] = ni; + ((s2d*)mem_m)[idx*2+1] = si; + } + + inline static void S2D_CSTORE2_4MAGIC(double* mem, long idx, rnd er, rnd od, rnd ei, rnd oi) { + ((s2d*)mem)[idx*4] = _mm_unpacklo_pd(er+od, ei+oi); // aa = north_ri[0] + ((s2d*)mem)[idx*4+1] = _mm_unpacklo_pd(er-od, ei-oi); // cc = south_ri[0] + ((s2d*)mem)[idx*4+2] = _mm_unpackhi_pd(er+od, ei+oi); // bb = north_ri[1] + ((s2d*)mem)[idx*4+3] = _mm_unpackhi_pd(er-od, ei-oi); // dd = south_ri[1] + } + #endif + #ifdef __SSE3__ + #define addi(a,b) _mm_addsub_pd(a, _mm_shuffle_pd((b),(b),1)) // a + I*b + #define subadd(a,b) _mm_addsub_pd(a, b) // [al-bl, ah+bh] + //#define CMUL(a,b) _mm_addsub_pd(_mm_shuffle_pd(a,a,0)*b, _mm_shuffle_pd(a,a,3)*_mm_shuffle_pd(b,b,1)) + #else + #define addi(a,b) ( (a) + (_mm_shuffle_pd((b),(b),1) * _mm_set_pd(1.0, -1.0)) ) // a + I*b [note: _mm_set_pd(imag, real)) ] + #define subadd(a,b) ( (a) + (b) * _mm_set_pd(1.0, -1.0) ) // [al-bl, ah+bh] + #endif + + // build mask (-0, -0) to change sign of both hi and lo values using xorpd + #define SIGN_MASK_2 _mm_castsi128_pd(_mm_slli_epi64(_mm_cmpeq_epi16(_mm_set1_epi64x(0), _mm_set1_epi64x(0)), 63)) + // build mask (0, -0) to change sign of hi value using xorpd (used in CFFT_TO_2REAL) + #define SIGN_MASK_HI _mm_unpackhi_pd(vdup(0.0), SIGN_MASK_2 ) + // build mask (-0, 0) to change sign of lo value using xorpd + #define SIGN_MASK_LO _mm_unpackhi_pd(SIGN_MASK_2, vdup(0.0) ) + + // vset(lo, hi) takes two doubles and pack them in a vector + #define vset(lo, hi) _mm_set_pd(hi, lo) + // vdup(x) takes a double and duplicate it to a vector of 2 doubles. + #define vdup(x) ((s2d)_mm_set1_pd(x)) + // vxchg(a) exchange hi and lo component of vector a + #define vlo_to_cplx(a) _mm_unpacklo_pd(a, vdup(0.0)) + #define vhi_to_cplx(a) _mm_unpackhi_pd(a, vdup(0.0)) + #define vcplx_real(a) vlo_to_dbl(a) + #define vcplx_imag(a) vhi_to_dbl(a) + #ifdef __clang__ + // allow to compile with clang (llvm) + #define vlo(a) (a)[0] + #define vlo_to_dbl(a) (a)[0] + #define vhi_to_dbl(a) (a)[1] + #else + // gcc extensions + #ifdef __AVX512F__ + #define vlo(a) _mm_cvtsd_f64(_mm512_castpd512_pd128(a)) + #elif defined __AVX__ + #define vlo(a) _mm_cvtsd_f64(_mm256_castpd256_pd128(a)) + #else + #define vlo(a) _mm_cvtsd_f64(a) + #endif + #define vlo_to_dbl(a) _mm_cvtsd_f64(a) + #define vhi_to_dbl(a) _mm_cvtsd_f64(_mm_unpackhi_pd(a,a)) + #endif +#endif + + + +#ifndef _GCC_VEC_ + #define MIN_ALIGNMENT 16 + #define VSIZE 1 + #define VSIZE2 1 + #define _SIMD_NAME_ "scalar" + typedef double s2d; + typedef complex double v2d; + typedef double rnd; + #define vread(mem, idx) ((double*)mem)[idx] + #define vstor(mem, idx, v) ((double*)mem)[idx] = v; + #define reduce_add(a) (a) + #define v2d_reduce(a,b) ((a) +I*(b)) + #define vlo(a) (a) + #define vall(x) (x) + #define vdup(x) (x) + #define vxchg(x) (x) + #define addi(a,b) ((a) + I*(b)) + #define vlo_to_dbl(a) (a) + #define vhi_to_dbl(a) (a) + #define vcplx_real(a) creal(a) + #define vcplx_imag(a) cimag(a) + + // allocate memory aligned for FFTW. In 64 bit systems, malloc should be 16 bytes aligned. + #define VMALLOC(s) ( (sizeof(void*) >= 8) ? malloc(s) : fftw_malloc(s) ) + #define VFREE(s) ( (sizeof(void*) >= 8) ? free(s) : fftw_free(s) ) + + #define S2D_STORE(mem, idx, ev, od) ((double*)mem)[idx] = ev+od; ((double*)mem)[NLAT-1 - (idx)] = ev-od; + #define S2D_CSTORE(mem, idx, er, od, ei, oi) mem[idx] = (er+od) + I*(ei+oi); mem[NLAT-1-(idx)] = (er-od) + I*(ei-oi); + #define S2D_CSTORE2(mem, idx, er, od, ei, oi) mem[idx] = (er+od) + I*(ei+oi); mem[NLAT-1-(idx)] = (er-od) + I*(ei-oi); + #define S2D_CSTOREX(mem, idx, v, er, od, ei, oi) { \ + double a0 = (er[(v)] +od[(v)]) + (ei[(v)+1]+oi[(v)+1]); \ + double b0 = (er[(v)] +od[(v)]) - (ei[(v)+1]+oi[(v)+1]); \ + double a1 = (er[(v)+1]+od[(v)+1]) + (ei[(v)] +oi[(v)]); \ + double b1 = (er[(v)+1]+od[(v)+1]) - (ei[(v)] +oi[(v)]); \ + ((cplx*)mem)[(idx)] = b0 + I*a1; \ + ((cplx*)mem)[(NPHI-2*im)*NLAT_2 + (idx)] = a0 + I*b1; \ + a1 = (er[(v)] -od[(v)]) + (ei[(v)+1]-oi[(v)+1]); \ + b1 = (er[(v)] -od[(v)]) - (ei[(v)+1]-oi[(v)+1]); \ + a0 = (er[(v)+1]-od[(v)+1]) + (ei[(v)] -oi[(v)]); \ + b0 = (er[(v)+1]-od[(v)+1]) - (ei[(v)] -oi[(v)]); \ + ((cplx*)mem)[NLAT_2-1 -(idx)] = b0 + I*a1; \ + ((cplx*)mem)[(NPHI+1-2*im)*NLAT_2 -1 -(idx)] = a0 + I*b1; } + + inline static void S2D_STORE_4MAGIC(double* mem, long idx, double ev, double od) { + ((cplx*)mem)[idx] = (ev+od) + I*(ev-od); + } + + inline static void S2D_CSTORE_4MAGIC(double* mem, double* mem_m, long idx, double er, double od, double ei, double oi) { + double nr = er + od; double ni = ei + oi; + double sr = er - od; double si = ei - oi; + er = nr - si; od = sr+ni; + ei = nr + si; oi = sr-ni; + ((cplx*)mem)[idx] = er + I*od; + ((cplx*)mem_m)[idx] = ei + I*oi; + } + + inline static void S2D_CSTORE2_4MAGIC(double* mem, long idx, double er, double od, double ei, double oi) { + ((cplx*)mem)[2*idx] = (er+od) + I*(ei+oi); + ((cplx*)mem)[2*idx+1] = (er-od) + I*(ei-oi); + } +#endif + + +#define SSE __attribute__((aligned (MIN_ALIGNMENT))) + +/// align pointer on MIN_ALIGNMENT (must be a power of 2) +#define PTR_ALIGN(p) ((((size_t)(p)) + (MIN_ALIGNMENT-1)) & (~((size_t)(MIN_ALIGNMENT-1)))) + +struct DtDp { // theta and phi derivatives stored together. + double t, p; +}; + +#define GLUE2(a,b) a##b +#define GLUE3(a,b,c) a##b##c + +// verbose printing +#if SHT_VERBOSE > 1 + #define PRINT_VERB(msg) printf(msg) +#else + #define PRINT_VERB(msg) (0) +#endif + +// compute symmetric and antisymmetric parts, and reorganize data. +#ifndef SHTNS4MAGIC + #define SYM_ASYM_M0_V(F, er, od) { \ + long int k=0; do { \ + double an = F[k*k_inc]; double bn = F[k*k_inc +1]; \ + double bs = F[(NLAT-2-k)*k_inc]; double as = F[(NLAT-2-k)*k_inc +1]; \ + er[k] = an+as; od[k] = an-as; \ + er[k+1] = bn+bs; od[k+1] = bn-bs; \ + k+=2; \ + } while(k < nk*VSIZE2); } + #define SYM_ASYM_M0_Q(F, er, od, acc0) { \ + double r0a = 0.0; double r0b = 0.0; \ + long int k=0; do { \ + double an = F[k*k_inc]; double bn = F[k*k_inc +1]; \ + double bs = F[(NLAT-2-k)*k_inc]; double as = F[(NLAT-2-k)*k_inc +1]; \ + er[k] = an+as; od[k] = an-as; \ + er[k+1] = bn+bs; od[k+1] = bn-bs; \ + r0a += (an+as)*wg[k]; r0b += (bn+bs)*wg[k+1]; \ + k+=2; \ + } while(k < nk*VSIZE2); acc0 = r0a+r0b; } + #define SYM_ASYM_Q(F, er, od, ei, oi, k0v) { \ + long int k = ((k0v*VSIZE2)>>1)*2; \ + do { \ + double an, bn, ani, bni, bs, as, bsi, asi, t; \ + ani = F[im*m_inc + k*k_inc]; bni = F[im*m_inc + k*k_inc +1]; \ + an = F[(NPHI-im)*m_inc + k*k_inc]; bn = F[(NPHI-im)*m_inc + k*k_inc +1]; \ + t = ani-an; an += ani; ani = bn-bni; bn += bni; bni = t; \ + bsi = F[im*m_inc + (NLAT-2 -k)*k_inc]; asi = F[im*m_inc + (NLAT-2-k)*k_inc + 1]; \ + bs = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc]; as = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc +1]; \ + t = bsi-bs; bs += bsi; bsi = as-asi; as += asi; asi = t; \ + er[k] = an+as; ei[k] = ani+asi; er[k+1] = bn+bs; ei[k+1] = bni+bsi; \ + od[k] = an-as; oi[k] = ani-asi; od[k+1] = bn-bs; oi[k+1] = bni-bsi; \ + k+=2; \ + } while (k>1)*2; \ + do { \ + double an, bn, ani, bni, bs, as, bsi, asi, t; \ + double sina = st[k]; double sinb = st[k+1]; \ + ani = F[im*m_inc + k*k_inc]; bni = F[im*m_inc + k*k_inc +1]; \ + an = F[(NPHI-im)*m_inc + k*k_inc]; bn = F[(NPHI-im)*m_inc + k*k_inc +1]; \ + t = ani-an; an += ani; ani = bn-bni; bn += bni; bni = t; \ + bsi = F[im*m_inc + (NLAT-2 -k)*k_inc]; asi = F[im*m_inc + (NLAT-2-k)*k_inc + 1]; \ + bs = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc]; as = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc +1]; \ + t = bsi-bs; bs += bsi; bsi = as-asi; as += asi; asi = t; \ + er[k] = (an+as)*sina; ei[k] = (ani+asi)*sina; er[k+1] = (bn+bs)*sinb; ei[k+1] = (bni+bsi)*sinb; \ + od[k] = (an-as)*sina; oi[k] = (ani-asi)*sina; od[k+1] = (bn-bs)*sinb; oi[k+1] = (bni-bsi)*sinb; \ + k+=2; \ + } while (k>1)*2; \ + do { \ + double an, bn, ani, bni, bs, as, bsi, asi, t; \ + double wa = wg[k]; double wb = wg[k+1]; \ + ani = F[im*m_inc + k*k_inc]; bni = F[im*m_inc + k*k_inc +1]; \ + an = F[(NPHI-im)*m_inc + k*k_inc]; bn = F[(NPHI-im)*m_inc + k*k_inc +1]; \ + t = ani-an; an += ani; ani = bn-bni; bn += bni; bni = t; \ + bsi = F[im*m_inc + (NLAT-2 -k)*k_inc]; asi = F[im*m_inc + (NLAT-2-k)*k_inc + 1]; \ + bs = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc]; as = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc +1]; \ + t = bsi-bs; bs += bsi; bsi = as-asi; as += asi; asi = t; \ + er[k] = (an+as)*wa; ei[k] = (ani+asi)*wa; er[k+1] = (bn+bs)*wb; ei[k+1] = (bni+bsi)*wb; \ + wa *= ct[k]; wb *= ct[k+1]; \ + od[k] = (an-as)*wa; oi[k] = (ani-asi)*wa; od[k+1] = (bn-bs)*wb; oi[k+1] = (bni-bsi)*wb; \ + k+=2; \ + } while (k>1)*2; \ + do { \ + double an, bn, ani, bni, bs, as, bsi, asi, t; \ + double sina = st[k]*wg[k]; double sinb = st[k+1]*wg[k+1]; \ + ani = F[im*m_inc + k*k_inc]; bni = F[im*m_inc + k*k_inc +1]; \ + an = F[(NPHI-im)*m_inc + k*k_inc]; bn = F[(NPHI-im)*m_inc + k*k_inc +1]; \ + t = ani-an; an += ani; ani = bn-bni; bn += bni; bni = t; \ + bsi = F[im*m_inc + (NLAT-2 -k)*k_inc]; asi = F[im*m_inc + (NLAT-2-k)*k_inc + 1]; \ + bs = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc]; as = F[(NPHI-im)*m_inc +(NLAT-2-k)*k_inc +1]; \ + t = bsi-bs; bs += bsi; bsi = as-asi; as += asi; asi = t; \ + er[k] = (an+as)*sina; ei[k] = (ani+asi)*sina; er[k+1] = (bn+bs)*sinb; ei[k+1] = (bni+bsi)*sinb; \ + sina *= ct[k]; sinb *= ct[k+1]; \ + od[k] = (an-as)*sina; oi[k] = (ani-asi)*sina; od[k+1] = (bn-bs)*sinb; oi[k+1] = (bni-bsi)*sinb; \ + k+=2; \ + } while (k>1)*2; \ + do { \ + double ar,ai,br,bi, sr,si,nr,ni; \ + br = F[im*m_inc + 2*k*k_inc]; bi = F[im*m_inc + 2*k*k_inc +1]; \ + ar = F[(NPHI-im)*m_inc + 2*k*k_inc]; ai = F[(NPHI-im)*m_inc + 2*k*k_inc +1]; \ + nr = ar + br; ni = ai - bi; \ + sr = ai + bi; si = br - ar; \ + er[k] = nr+sr; ei[k] = ni+si; \ + od[k] = nr-sr; oi[k] = ni-si; \ + k+=1; \ + } while(k < nk*VSIZE2); } + #define SYM_ASYM_Q3(F, er, od, ei, oi, k0v) { \ + k = ((k0v*VSIZE2)>>1)*2; \ + do { \ + double ar,ai,br,bi, sr,si,nr,ni; \ + double sina = st[k]; \ + br = F[im*m_inc + 2*k*k_inc]; bi = F[im*m_inc + 2*k*k_inc +1]; \ + ar = F[(NPHI-im)*m_inc + 2*k*k_inc]; ai = F[(NPHI-im)*m_inc + 2*k*k_inc +1]; \ + nr = (ar + br)*sina; ni = (ai - bi)*sina; \ + sr = (ai + bi)*sina; si = (br - ar)*sina; \ + er[k] = nr+sr; ei[k] = ni+si; \ + od[k] = nr-sr; oi[k] = ni-si; \ + k+=1; \ + } while(k < nk*VSIZE2); } + #define SYM_ASYM_V SYM_ASYM_Q + #define SYM_ASYM_Q_ISH(F, er, od, ei, oi, k0v) { \ + k = ((k0v*VSIZE2)>>1)*2; \ + do { \ + double ar,ai,br,bi, sr,si,nr,ni; \ + double w = wg[k]; \ + br = F[im*m_inc + 2*k*k_inc]; bi = F[im*m_inc + 2*k*k_inc +1]; \ + ar = F[(NPHI-im)*m_inc + 2*k*k_inc]; ai = F[(NPHI-im)*m_inc + 2*k*k_inc +1]; \ + nr = ar + br; ni = ai - bi; \ + sr = ai + bi; si = br - ar; \ + er[k] = (nr+sr)*w; ei[k] = (ni+si)*w; \ + w *= ct[k]; \ + od[k] = (nr-sr)*w; oi[k] = (ni-si)*w; \ + k+=1; \ + } while(k < nk*VSIZE2); } + #define SYM_ASYM_Q3_ISH(F, er, od, ei, oi, k0v) { \ + k = ((k0v*VSIZE2)>>1)*2; \ + do { \ + double ar,ai,br,bi, sr,si,nr,ni; \ + double sina = st[k]*wg[k]; \ + br = F[im*m_inc + 2*k*k_inc]; bi = F[im*m_inc + 2*k*k_inc +1]; \ + ar = F[(NPHI-im)*m_inc + 2*k*k_inc]; ai = F[(NPHI-im)*m_inc + 2*k*k_inc +1]; \ + nr = ar + br; ni = ai - bi; \ + sr = ai + bi; si = br - ar; \ + er[k] = (nr+sr)*sina; ei[k] = (ni+si)*sina; \ + sina *= ct[k]; \ + od[k] = (nr-sr)*sina; oi[k] = (ni-si)*sina; \ + k+=1; \ + } while(k < nk*VSIZE2); } + #define SYM_ASYM_V_ISH SYM_ASYM_Q_ISH +#endif + + +static void SH_2scal_to_vect_reduce(const double *mx, const double* l_2, int llim, int m, rnd* vw, v2d* Sl, v2d* Tl) +{ // convert from the two scalar SH to vector SH + // Slm = - (I*m*Wlm + MX*Vlm) / (l*(l+1)) => why does this work ??? (aliasing of 1/sin(theta) ???) + // Tlm = - (I*m*Vlm - MX*Wlm) / (l*(l+1)) + // double* mx = shtns->mx_van + 2*LM(shtns,m,m); //(im*(2*(LMAX+1)-(m+MRES))) + 2*m; + s2d em = vdup(m); + m = abs(m); + v2d vl = v2d_reduce(vw[0], vw[1]); + v2d wl = v2d_reduce(vw[2], vw[3]); + v2d sl1 = vdup( 0.0 ); + v2d tl1 = vdup( 0.0 ); + for (int l=0; l<=llim-m; l++) { + s2d mxu = vdup( mx[2*l] ); + s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration + v2d sl = addi( sl1 , em*wl ); + v2d tl = addi( tl1 , em*vl ); + sl1 = mxl*vl; // vs for next iter + tl1 = -mxl*wl; // wt for next iter + vl = v2d_reduce(vw[4*l+4], vw[4*l+5]); // kept for next iteration + wl = v2d_reduce(vw[4*l+6], vw[4*l+7]); + sl += mxu*vl; + tl -= mxu*wl; + Sl[l] = -sl * vdup(l_2[l+m]); + Tl[l] = -tl * vdup(l_2[l+m]); + } +} + +static void SH_2scal_to_vect(const double *mx, const double* l_2, int llim, int m, v2d* vw, v2d* Sl, v2d* Tl) +{ // convert from the two scalar SH to vector SH + // Slm = - (I*m*Wlm + MX*Vlm) / (l*(l+1)) => why does this work ??? (aliasing of 1/sin(theta) ???) + // Tlm = - (I*m*Vlm - MX*Wlm) / (l*(l+1)) + s2d em = vdup(m); + m = abs(m); + v2d vl = vw[0]; + v2d wl = vw[1]; + v2d sl1 = vdup( 0.0 ); + v2d tl1 = vdup( 0.0 ); + for (int l=0; l<=llim-m; l++) { + s2d mxu = vdup( mx[2*l] ); + s2d mxl = vdup( mx[2*l+1] ); // mxl for next iteration + v2d sl = addi( sl1 , em*wl ); + v2d tl = addi( tl1 , em*vl ); + sl1 = mxl*vl; // vs for next iter + tl1 = -mxl*wl; // wt for next iter + vl = vw[2*l+2]; // kept for next iteration + wl = vw[2*l+3]; + sl += mxu*vl; + tl -= mxu*wl; + Sl[l] = -sl * vdup(l_2[l+m]); + Tl[l] = -tl * vdup(l_2[l+m]); + } +} + +/// post-processing for recurrence relation of Ishioka +/// xlm = shtns->xlm + 3*im*(2*(LMAX+4) -m+MRES)/4; +/// llim_m = llim-m +/// qq[l-m]: input data obtained with ishioka's relation +/// Ql[l-m]: output data, spherical harmonic coefficients of degree l (for fixed m). +/// can operate in-place (Ql = qq) +static void ishioka_to_SH(const double* xlm, const v2d* qq, const int llim_m, v2d* Ql) +{ + int l=0; int ll=0; + v2d u0 = vdup(0.0); + while (lxlm + 3*im*(2*(LMAX+4) -m+MRES)/4; +/// llim_m = llim-m +/// qq[l-m]: input data obtained with ishioka's relation +/// Ql[l-m]: output data, spherical harmonic coefficients of degree l (for fixed m). +/// can operate in-place (Ql = qq) +static void ishioka_to_SH_reduce(const double* xlm, const rnd* qq, const int llim_m, v2d* Ql) +{ + int l=0; int ll=0; + v2d u0 = vdup(0.0); + while (lxlm + 3*im*(2*(LMAX+4) -m+MRES)/4; +/// llim_m = llim-m +/// Ql[l-m]: intput data, spherical harmonic coefficients of degree l (for fixed m). +/// ql[l-m]: output data, ready for ishioka's recurrence +/// can operate in-place (Ql = qq) +static void SH_to_ishioka(const double* xlm, const v2d* Ql, const int llim_m, v2d* ql) +{ + int l=0; int ll=0; + v2d qq = Ql[l] * vdup(xlm[0]); + while (l + typedef std::complex cplx; + #else + #include + typedef complex double cplx; + #endif +#endif + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/// pointer to data structure describing an SHT, returned by shtns_init() or shtns_create(). +typedef struct shtns_info* shtns_cfg; + +/// pointer to data structure describing a rotation, returned by shtns_rotation_create(). +typedef struct shtns_rot_* shtns_rot; + +/// different Spherical Harmonic normalizations. +/// see also section \ref norm for details. +enum shtns_norm { + sht_orthonormal, ///< orthonormalized spherical harmonics (default). + sht_fourpi, ///< Geodesy and spectral analysis : 4.pi normalization. + sht_schmidt, ///< Schmidt semi-normalized : 4.pi/(2l+1) + sht_for_rotations ///< \internal normalization to generate wigner-d matrices internally, with otherwise limited functionality. +}; +#define SHT_NO_CS_PHASE (256*4) ///< don't include Condon-Shortley phase (add to last argument of \ref shtns_create) +#define SHT_REAL_NORM (256*8) ///< use a "real" normalization. (add to last argument of \ref shtns_create) + +/// different SHT types and algorithms +enum shtns_type { + sht_gauss, ///< use gaussian grid and quadrature. Allows on-the-fly or matrix-based algorithms. + sht_auto, ///< use fastest algorithm and grid. This currently implies using the Gauss grid and is thus the same as sht_gauss. + sht_reg_fast, ///< quick initialization of a regular grid. The grid is the same as with sht_reg_dct + sht_reg_dct, ///< slow initialization of a regular grid (self-tuning). The grid is equispaced and avoids the poles (Féjer quadrature). + sht_quick_init, ///< gauss grid, with minimum initialization time (useful for pre/post-processing) + sht_reg_poles, ///< quick initialization of a regular grid including poles (Clenshaw-Curtis quadrature). Useful for vizualisation. + sht_gauss_fly ///< legendre polynomials are recomputed on-the-fly for each transform (may be faster on some machines, saves memory and bandwidth). +}; +#define SHT_NATIVE_LAYOUT 0 ///< Tells shtns_init to use \ref native +#define SHT_THETA_CONTIGUOUS 256 ///< use \ref theta_fast +#define SHT_PHI_CONTIGUOUS (256*2) ///< use \ref phi_fast +#define SHT_SOUTH_POLE_FIRST (256*32) ///< latitudinal data are stored starting from south pole. + +#define SHT_SCALAR_ONLY (256*16) ///< don't compute vector matrices. (add to flags in shtns_set_grid) +#define SHT_LOAD_SAVE_CFG (256*64) ///< try to load and save the config. (add to flags in shtns_set_grid) +#define SHT_ALLOW_GPU (256*128) ///< allows to use a GPU. This needs special care because the same plan cannot be used simultaneously by different threads anymore. + + +#ifndef SHTNS_PRIVATE +struct shtns_info { // allow read-only access to some data (useful for optimization and helper macros) + const unsigned int nlm; ///< total number of (l,m) spherical harmonics components. + const unsigned short lmax; ///< maximum degree (lmax) of spherical harmonics. + const unsigned short mmax; ///< maximum order (mmax*mres) of spherical harmonics. + const unsigned short mres; ///< the periodicity along the phi axis. + const unsigned short nphi; ///< number of spatial points in Phi direction (longitude) + const unsigned short nlat; ///< number of spatial points in Theta direction (latitude) ... + const unsigned short nlat_2; ///< ...and half of it (using (shtns.nlat+1)/2 allows odd shtns.nlat.) + const int *const lmidx; ///< (virtual) index in SH array of given im (size mmax+1) : LiM(l,im) = lmidx[im] + l + const unsigned short *const li; ///< degree l for given mode index (size nlm) : li[lm] + const unsigned short *const mi; ///< order m for given mode index (size nlm) : mi[lm] + const double *const ct; ///< cos(theta) array (size nlat) + const double *const st; ///< sin(theta) array (size nlat) + const unsigned int nspat; ///< number of real numbers that must be allocated in a spatial field. + const unsigned int nlm_cplx; ///< number of complex coefficients to represent a complex-valued spatial field. +}; +#endif + +// MACROS // + +/*! \name Access to spherical harmonic components + * The following macros give access to single spherical harmonic coefficient or perform loops spanning all of them. +**///@{ +///LiM(shtns, l,im) : macro returning array index for given l and im, corresponding to config shtns. +#define LiM(shtns, l,im) ( shtns->lmidx[im] + (l) ) +//#define LiM(shtns, l,im) ( ((im)*(2*shtns->lmax + 2 - ((im)+1)*shtns->mres))>>1 + (l) ) +/// LM(shtns, l,m) : macro returning array index for given l and m, corresponding to config shtns. +#define LM(shtns, l,m) ( shtns->lmidx[((unsigned)(m))/shtns->mres] + (l) ) +//#define LM(shtns, l,m) ( ((((unsigned)(m))/shtns->mres)*(2*shtns->lmax + 2 - ((m)+shtns->mres)))>>1 + (l) ) +/// LM_LOOP( shtns, action ) : macro that performs "action" for every (l,m), with lm set, but neither l, m nor im. +/// \c lm must be a declared int and is the loop counter and the SH array index. more info : \ref spec_data +#define LM_LOOP( shtns, action ) { int lm=0; do { action } while(++lm < shtns->nlm); } +/// LM_L_LOOP : loop over all (l,im) and perform "action" : l and lm are defined (but NOT m and im). +/// \c lm and \c m must be declared int's. \c lm is the loop counter and SH array index, while \c l is the SH degree. more info : \ref spec_data +#define LM_L_LOOP( shtns, action ) { int lm=0; do { int l=shtns->li[lm]; action } while(++lm < shtns->nlm); } +/// LM_cplx(shtns, l,m) : macro returning array index for SH representation of complex-valued fields for given l and m. (mres=1 only!) +#define LM_cplx(shtns, l, m) ( ((l) <= shtns->mmax) ? (l)*((l)+1)+(m) : shtns->mmax*(2*(l) - shtns->mmax) + (l)+(m) ) +//@} + + +/// total number of 'doubles' required for a spatial field (includes FFTW reserved space). +/// only the first shtns.nlat*shtns.nphi are real spatial data, the remaining is used by the Fourier Transform. more info : \ref spat +#define NSPAT_ALLOC(shtns) (shtns->nspat) + +// HELPER MACROS // + +/// phi angle value in degrees for given index ip. +#define PHI_DEG(shtns, ip) (360./(shtns->nphi*shtns->mres))*(ip) +/// phi angle value in radians for given index ip. +#define PHI_RAD(shtns, ip) (M_PI/(shtns->nphi*shtns->mres))*(2*ip) + + +// FUNCTIONS // + +/// compute number of spherical harmonics modes (l,m) to represent a real-valued spatial field for given size parameters. Does not require any previous setup. +long nlm_calc(long lmax, long mmax, long mres); + +/// compute number of spherical harmonics modes (l,m) to represent a complex-valued spatial field, for given size parameters. Does not require any previous setup. +long nlm_cplx_calc(long lmax, long mmax, long mres); + +void shtns_verbose(int); ///< controls output during initialization: 0=no output (default), 1=some output, 2=degug (if compiled in) +void shtns_print_version(void); ///< print version information to stdout. + +#ifndef SWIG + +void shtns_print_cfg(shtns_cfg); ///< print information about given config to stdout. + +/// \name initialization +//@{ +/// Simple initialization of the spherical harmonic transforms of given size. Calls \ref shtns_create and \ref shtns_set_grid_auto. +shtns_cfg shtns_init(enum shtns_type flags, int lmax, int mmax, int mres, int nlat, int nphi); +/// Defines the sizes of the spectral description. Use for advanced initialization. +shtns_cfg shtns_create(int lmax, int mmax, int mres, enum shtns_norm norm); +/// Precompute everything for a given spatial grid. Use for advanced initialization, after \ref shtns_create. +int shtns_set_grid(shtns_cfg, enum shtns_type flags, double eps, int nlat, int nphi); +/// Precompute everything and choose the optimal nlat and nphi for a given non-linear order. +int shtns_set_grid_auto(shtns_cfg, enum shtns_type flags, double eps, int nl_order, int *nlat, int *nphi); +/// Copy a given config but allow a different (smaller) mmax and the possibility to enable/disable fft. +shtns_cfg shtns_create_with_grid(shtns_cfg, int mmax, int nofft); +/// Enables multi-thread transform using OpenMP with num_threads (if available). Returns number of threads that will be used. +int shtns_use_threads(int num_threads); +/// Selects the gpu device (device_id % Num_devices). Must be called BEFORE any initialization. Internally calls cudaSetDevice(). Returns the actual device or -1 when no device found. +int shtns_use_gpu(int device_id); + +void shtns_reset(void); ///< destroy all configs, free memory, and go back to initial state. +void shtns_destroy(shtns_cfg); ///< free memory of given config, which cannot be used afterwards. +void shtns_unset_grid(shtns_cfg); ///< unset the grid. + +/// set the use of Robert form. If robert != 0, the vector synthesis returns a field multiplied by sin(theta), while the analysis divides by sin(theta) before the transform. +void shtns_robert_form(shtns_cfg, int robert); + +void* shtns_malloc(size_t bytes); ///< alloc appropriate memory (pinned for gpu, aligned for avx, ...). Use \ref shtns_free to free it. +void shtns_free(void* p); ///< free memory allocated with \ref shtns_malloc + + +//@} + +/// \name special values +//@{ +double sh00_1(shtns_cfg); ///< return the spherical harmonic representation of 1 (l=0,m=0) +double sh10_ct(shtns_cfg); ///< return the spherical harmonic representation of cos(theta) (l=1,m=0) +double sh11_st(shtns_cfg); ///< return the spherical harmonic representation of sin(theta)*cos(phi) (l=1,m=1) +double shlm_e1(shtns_cfg, int l, int m); ///< return the l,m SH coefficient corresponding to unit energy. +/// fill the given array with Gauss weights. returns the number of weights written (0 if not a Gauss grid). +int shtns_gauss_wts(shtns_cfg, double *wts); + +//@} + +/// \name Rotation functions +//@{ +/// Rotate a SH representation Qlm around the z-axis by angle alpha (in radians), +/// which is the same as rotating the reference frame by angle -alpha. +/// Result is stored in Rlm (which can be the same array as Qlm). +void SH_Zrotate(shtns_cfg, cplx *Qlm, double alpha, cplx *Rlm); +/// Rotate SH representation around Y axis by alpha (in radians). +void SH_Yrotate(shtns_cfg, cplx *Qlm, double alpha, cplx *Rlm); +/// Rotate SH representation around Y axis by 90 degrees. +void SH_Yrotate90(shtns_cfg, cplx *Qlm, cplx *Rlm); +/// Rotate SH representation around X axis by 90 degrees. +void SH_Xrotate90(shtns_cfg, cplx *Qlm, cplx *Rlm); + + +shtns_rot shtns_rotation_create(const int lmax, const int mmax); +void shtns_rotation_destroy(shtns_rot r); +void shtns_rotation_set_angles_ZYZ(shtns_rot r, double alpha, double beta, double gamma); +void shtns_rotation_set_angles_ZXZ(shtns_rot r, double alpha, double beta, double gamma); +void shtns_rotation_set_angle_axis(shtns_rot r, double theta, double Vx, double Vy, double Vz); +void shtns_rotation_wigner_d_matrix(shtns_rot r, const int l, double* mx); +void shtns_rotation_apply_cplx(shtns_rot r, cplx* Zlm, cplx* Rlm); +void shtns_rotation_apply_real(shtns_rot r, cplx* Qlm, cplx* Rlm); + +//@} + +/// \name Generation of Legendre associated functions +//@{ +/// Compute values of legendre polynomials noramalized for spherical harmonics, +/// for a range of l=m..lmax, at given m and x, using stable recurrence. +/// Requires a previous call to \ref shtns_create(). +/// Output compatible with the GSL function gsl_sf_legendre_sphPlm_array(lmax, m, x, yl) +/// \param[in] lmax maximum degree computed +/// \param[in] im = m/MRES with m the SH order +/// \param[in] x argument, x=cos(theta). +/// \param[out] yl is a double array of size (lmax-m+1) filled with the values (of increasing degree l). +void legendre_sphPlm_array(shtns_cfg shtns, const int lmax, const int im, const double x, double *yl); +void legendre_sphPlm_deriv_array(shtns_cfg shtns, const int lmax, const int im, const double x, const double sint, double *yl, double *dyl); +//@} + +/// \name Special operator functions +//@{ +/// compute the matrix (stored in mx, a double array of size 2*NLM) required +/// to multiply an SH representation by cos(theta) using \ref SH_mul_mx. +void mul_ct_matrix(shtns_cfg, double* mx); +/// compute the matrix (stored in mx, a double array of size 2*NLM) required +/// to apply sin(theta)*d/dtheta to an SH representation using \ref SH_mul_mx. +void st_dt_matrix(shtns_cfg, double* mx); +/// Apply a matrix involving l+1 and l-1 to an SH representation Qlm. Result stored in Rlm (must be different from Qlm). +void SH_mul_mx(shtns_cfg, double* mx, cplx *Qlm, cplx *Rlm); +//@} + +/** \addtogroup sht Spherical Harmonic transform functions. + * All these function perform a global spherical harmonic transform. + * Their first argument is a shtns_cfg variable (which is a pointer to a \ref shtns_info struct) + * obtained by a previous call to \ref shtns_create or \ref shtns_init. + * \see \ref spat \see \ref spec \see \ref vsh + */ +//@{ + +/// \name Scalar transforms +//@{ +/// transform the scalar field Vr into its spherical harmonic representation Qlm. +/// \param[in] shtns = a configuration created by \ref shtns_create with a grid set by \ref shtns_set_grid or \ref shtns_set_grid_auto +/// \param[in] Vr = spatial scalar field : double array of size shtns->nspat. +/// \param[out] Qlm = spherical harmonics coefficients : cplx array of size shtns->nlm. +void spat_to_SH(shtns_cfg shtns, double *Vr, cplx *Qlm); +/// transform the spherical harmonic coefficients Qlm into its spatial representation Vr. +/// \param[in] shtns = a configuration created by \ref shtns_create with a grid set by \ref shtns_set_grid or \ref shtns_set_grid_auto +/// \param[in] Qlm = spherical harmonics coefficients : cplx array of size shtns->nlm. +/// \param[out] Vr = spatial scalar field : double array of size shtns->nspat. +void SH_to_spat(shtns_cfg shtns, cplx *Qlm, double *Vr); +/// complex scalar synthesis. +/// \param[in] shtns = a configuration created by \ref shtns_create with a grid set by \ref shtns_set_grid or \ref shtns_set_grid_auto +/// \param[in] alm[l*(l+1)+m] is the SH coefficient of order l and degree m (with -l <= m <= l) [total of (LMAX+1)^2 coefficients] +/// \param[out] z = complex spatial field +void SH_to_spat_cplx(shtns_cfg shtns, cplx *alm, cplx *z); +/// complex scalar analysis. +/// \param[in] shtns = a configuration created by \ref shtns_create with a grid set by \ref shtns_set_grid or \ref shtns_set_grid_auto +/// \param[in] z = complex spatial field +/// \param[out] alm[l*(l+1)+m] is the SH coefficient of order l and degree m (with -l <= m <= l) [total of (LMAX+1)^2 coefficients] +void spat_cplx_to_SH(shtns_cfg shtns, cplx *z, cplx *alm); +//@} + +/// \name 2D vector transforms +//@{ +/// transform the theta and phi components (Vt,Vp) of a vector into its spheroidal-toroidal spherical harmonic representation (Slm,Tlm). \see \ref vsh +void spat_to_SHsphtor(shtns_cfg, double *Vt, double *Vp, cplx *Slm, cplx *Tlm); +/// transform spheroidal-toroidal spherical harmonic coefficients (Slm,Tlm) to the spatial theta and phi components (Vt,Vp). \see \ref vsh +void SHsphtor_to_spat(shtns_cfg, cplx *Slm, cplx *Tlm, double *Vt, double *Vp); +/// transform spheroidal spherical harmonic coefficients Slm to the spatial theta and phi components (Vt,Vp), effectively computing the gradient of S. \see \ref vsh +void SHsph_to_spat(shtns_cfg, cplx *Slm, double *Vt, double *Vp); +/// transform toroidal spherical harmonic coefficients Tlm to the spatial theta and phi components (Vt,Vp). \see \ref vsh +void SHtor_to_spat(shtns_cfg, cplx *Tlm, double *Vt, double *Vp); + +/// transform the theta and phi components (Vt,Vp) of a complex valued vector into its spheroidal-toroidal spherical harmonic representation (Slm,Tlm). \see \ref vsh +void spat_cplx_to_SHsphtor(shtns_cfg, cplx *Vt, cplx *Vp, cplx *Slm, cplx *Tlm); +/// transform spheroidal-toroidal spherical harmonic coefficients (Slm,Tlm) to the spatial theta and phi complex-valued components (Vt,Vp). \see \ref vsh +void SHsphtor_to_spat_cplx(shtns_cfg, cplx *Slm, cplx *Tlm, cplx *Vt, cplx *Vp); +//@} +/// Compute the spatial representation of the gradient of a scalar SH field. Alias for \ref SHsph_to_spat +#define SH_to_grad_spat(shtns, S,Gt,Gp) SHsph_to_spat(shtns, S, Gt, Gp) + +/// \name 3D transforms (combine scalar and vector) +//@{ +/// 3D vector transform from spherical coordinates to radial-spheroidal-toroidal spectral components (see \ref vsh_def). +/// They should be prefered over separate calls to scalar and 2D vector transforms as they can be significantly faster. +void spat_to_SHqst(shtns_cfg, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm); +/// 3D vector transform from radial-spheroidal-toroidal spectral components (see \ref vsh_def) to spherical coordinates. +/// They should be prefered over separate calls to scalar and 2D vector transforms as they can be significantly faster. +void SHqst_to_spat(shtns_cfg, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp); + +void spat_cplx_to_SHqst(shtns_cfg, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm); +void SHqst_to_spat_cplx(shtns_cfg, cplx *Qlm, cplx *Slm, cplx *Tlm, cplx *Vr, cplx *Vt, cplx *Vp); +//@} + +/// \name Truncated transforms at given degree l +/// wiht l <= lmax used for setup. +//@{ +void spat_to_SH_l(shtns_cfg, double *Vr, cplx *Qlm, int ltr); +void SH_to_spat_l(shtns_cfg, cplx *Qlm, double *Vr, int ltr); + +void SHsphtor_to_spat_l(shtns_cfg, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, int ltr); +void SHsph_to_spat_l(shtns_cfg, cplx *Slm, double *Vt, double *Vp, int ltr); +void SHtor_to_spat_l(shtns_cfg, cplx *Tlm, double *Vt, double *Vp, int ltr); +void spat_to_SHsphtor_l(shtns_cfg, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int ltr); + +void spat_to_SHqst_l(shtns_cfg, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr); +void SHqst_to_spat_l(shtns_cfg, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int ltr); +//@} +/// Compute the spatial representation of the gradient of a scalar SH field. Alias for \ref SHsph_to_spat_l +#define SH_to_grad_spat_l(shtns, S,Gt,Gp,ltr) SHsph_to_spat_l(shtns, S, Gt, Gp, ltr) + +/// \name Legendre transform at given m (no fft) and truncated at given degree l <= lmax +//@{ +void spat_to_SH_ml(shtns_cfg, int im, cplx *Vr, cplx *Ql, int ltr); +void SH_to_spat_ml(shtns_cfg, int im, cplx *Ql, cplx *Vr, int ltr); + +void spat_to_SHsphtor_ml(shtns_cfg, int im, cplx *Vt, cplx *Vp, cplx *Sl, cplx *Tl, int ltr); +void SHsphtor_to_spat_ml(shtns_cfg, int im, cplx *Sl, cplx *Tl, cplx *Vt, cplx *Vp, int ltr); +void SHsph_to_spat_ml(shtns_cfg, int im, cplx *Sl, cplx *Vt, cplx *Vp, int ltr); +void SHtor_to_spat_ml(shtns_cfg, int im, cplx *Tl, cplx *Vt, cplx *Vp, int ltr); + +void spat_to_SHqst_ml(shtns_cfg, int im, cplx *Vr, cplx *Vt, cplx *Vp, cplx *Ql, cplx *Sl, cplx *Tl, int ltr); +void SHqst_to_spat_ml(shtns_cfg, int im, cplx *Ql, cplx *Sl, cplx *Tl, cplx *Vr, cplx *Vt, cplx *Vp, int ltr); +//@} +/// Compute the spatial representation of the gradient of a scalar SH field. Alias for \ref SHsph_to_spat_l +#define SH_to_grad_spat_ml(shtns, im, S,Gt,Gp,ltr) SHsph_to_spat_ml(shtns, im, S, Gt, Gp, ltr) + +//@} + +/// \name Local and partial evalutions of a SH representation : +/// Does not require a call to \ref shtns_set_grid_auto +//@{ +double SH_to_point(shtns_cfg, cplx *Qlm, double cost, double phi); +void SH_to_grad_point(shtns_cfg, cplx *DrSlm, cplx *Slm, + double cost, double phi, double *vr, double *vt, double *vp); +void SHqst_to_point(shtns_cfg, cplx *Qlm, cplx *Slm, cplx *Tlm, + double cost, double phi, double *vr, double *vt, double *vp); + +void SH_to_lat(shtns_cfg shtns, cplx *Qlm, double cost, + double *vr, int nphi, int ltr, int mtr); +void SHqst_to_lat(shtns_cfg, cplx *Qlm, cplx *Slm, cplx *Tlm, double cost, + double *vr, double *vt, double *vp, int nphi, int ltr, int mtr); +//@} + + +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns.py b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns.py new file mode 100644 index 000000000..77d00ca3d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns.py @@ -0,0 +1,621 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 3.0.12 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +"""Python/NumPy interface to the SHTns spherical harmonic transform library""" + + +from sys import version_info as _swig_python_version_info +if _swig_python_version_info >= (2, 7, 0): + def swig_import_helper(): + import importlib + pkg = __name__.rpartition('.')[0] + mname = '.'.join((pkg, '_shtns')).lstrip('.') + try: + return importlib.import_module(mname) + except ImportError: + return importlib.import_module('_shtns') + _shtns = swig_import_helper() + del swig_import_helper +elif _swig_python_version_info >= (2, 6, 0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_shtns', [dirname(__file__)]) + except ImportError: + import _shtns + return _shtns + try: + _mod = imp.load_module('_shtns', fp, pathname, description) + finally: + if fp is not None: + fp.close() + return _mod + _shtns = swig_import_helper() + del swig_import_helper +else: + import _shtns +del _swig_python_version_info + +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_setattr_nondynamic(self, class_type, name, value, static=1): + if (name == "thisown"): + return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name, None) + if method: + return method(self, value) + if (not static): + if _newclass: + object.__setattr__(self, name, value) + else: + self.__dict__[name] = value + else: + raise AttributeError("You cannot add attributes to %s" % self) + + +def _swig_setattr(self, class_type, name, value): + return _swig_setattr_nondynamic(self, class_type, name, value, 0) + + +def _swig_getattr(self, class_type, name): + if (name == "thisown"): + return self.this.own() + method = class_type.__swig_getmethods__.get(name, None) + if method: + return method(self) + raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name)) + + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + +try: + _object = object + _newclass = 1 +except __builtin__.Exception: + class _object: + pass + _newclass = 0 + + +import numpy as np + +sht_orthonormal = _shtns.sht_orthonormal +sht_fourpi = _shtns.sht_fourpi +sht_schmidt = _shtns.sht_schmidt +SHT_NO_CS_PHASE = _shtns.SHT_NO_CS_PHASE +SHT_REAL_NORM = _shtns.SHT_REAL_NORM +sht_gauss = _shtns.sht_gauss +sht_auto = _shtns.sht_auto +sht_reg_fast = _shtns.sht_reg_fast +sht_reg_dct = _shtns.sht_reg_dct +sht_quick_init = _shtns.sht_quick_init +sht_reg_poles = _shtns.sht_reg_poles +sht_gauss_fly = _shtns.sht_gauss_fly +SHT_THETA_CONTIGUOUS = _shtns.SHT_THETA_CONTIGUOUS +SHT_PHI_CONTIGUOUS = _shtns.SHT_PHI_CONTIGUOUS +SHT_SOUTH_POLE_FIRST = _shtns.SHT_SOUTH_POLE_FIRST +SHT_SCALAR_ONLY = _shtns.SHT_SCALAR_ONLY +SHT_LOAD_SAVE_CFG = _shtns.SHT_LOAD_SAVE_CFG +SHT_ALLOW_GPU = _shtns.SHT_ALLOW_GPU +class sht(_object): + """Proxy of C shtns_info struct.""" + + __swig_setmethods__ = {} + __setattr__ = lambda self, name, value: _swig_setattr(self, sht, name, value) + __swig_getmethods__ = {} + __getattr__ = lambda self, name: _swig_getattr(self, sht, name) + __repr__ = _swig_repr + __swig_getmethods__["nlm"] = _shtns.sht_nlm_get + if _newclass: + nlm = _swig_property(_shtns.sht_nlm_get) + __swig_getmethods__["lmax"] = _shtns.sht_lmax_get + if _newclass: + lmax = _swig_property(_shtns.sht_lmax_get) + __swig_getmethods__["mmax"] = _shtns.sht_mmax_get + if _newclass: + mmax = _swig_property(_shtns.sht_mmax_get) + __swig_getmethods__["mres"] = _shtns.sht_mres_get + if _newclass: + mres = _swig_property(_shtns.sht_mres_get) + __swig_getmethods__["nphi"] = _shtns.sht_nphi_get + if _newclass: + nphi = _swig_property(_shtns.sht_nphi_get) + __swig_getmethods__["nlat"] = _shtns.sht_nlat_get + if _newclass: + nlat = _swig_property(_shtns.sht_nlat_get) + __swig_getmethods__["nspat"] = _shtns.sht_nspat_get + if _newclass: + nspat = _swig_property(_shtns.sht_nspat_get) + __swig_getmethods__["nlm_cplx"] = _shtns.sht_nlm_cplx_get + if _newclass: + nlm_cplx = _swig_property(_shtns.sht_nlm_cplx_get) + + def __init__(self, lmax, mmax=-1, mres=1, norm=sht_orthonormal, nthreads=0): + """__init__(shtns_info self, int lmax, int mmax=-1, int mres=1, int norm=sht_orthonormal, int nthreads=0) -> sht""" + this = _shtns.new_sht(lmax, mmax, mres, norm, nthreads) + try: + self.this.append(this) + except __builtin__.Exception: + self.this = this + + ## array giving the degree of spherical harmonic coefficients. + self.l = np.zeros(self.nlm, dtype=np.int32) + ## array giving the order of spherical harmonic coefficients. + self.m = np.zeros(self.nlm, dtype=np.int32) + for mloop in range(0, self.mmax*self.mres+1, self.mres): + for lloop in range(mloop, self.lmax+1): + ii = self.idx(lloop,mloop) + self.m[ii] = mloop + self.l[ii] = lloop + self.m.flags.writeable = False # prevent writing in m and l arrays + self.l.flags.writeable = False + + + + __swig_destroy__ = _shtns.delete_sht + __del__ = lambda self: None + + def set_grid(self, nlat=0, nphi=0, flags=sht_quick_init, polar_opt=1.0e-8, nl_order=1): + """set_grid(sht self, int nlat=0, int nphi=0, int flags=sht_quick_init, double polar_opt=1.0e-8, int nl_order=1)""" + val = _shtns.sht_set_grid(self, nlat, nphi, flags, polar_opt, nl_order) + + ## array giving the cosine of the colatitude for the grid. + self.cos_theta = self.__ct() + self.cos_theta.flags.writeable = False + ## shape of a spatial array for the grid (tuple of 2 values). + self.spat_shape = tuple(self.__spat_shape()) + if self.nphi == 1: # override spatial shape when nphi==1 + self.spat_shape = (self.nlat, 1) + if flags & SHT_THETA_CONTIGUOUS: self.spat_shape = (1, self.nlat) + + + return val + + + def print_info(self): + """print_info(sht self)""" + return _shtns.sht_print_info(self) + + + def sh00_1(self): + """sh00_1(sht self) -> double""" + return _shtns.sht_sh00_1(self) + + + def sh10_ct(self): + """sh10_ct(sht self) -> double""" + return _shtns.sht_sh10_ct(self) + + + def sh11_st(self): + """sh11_st(sht self) -> double""" + return _shtns.sht_sh11_st(self) + + + def shlm_e1(self, l, m): + """shlm_e1(sht self, unsigned int l, unsigned int m) -> double""" + return _shtns.sht_shlm_e1(self, l, m) + + + def robert_form(self, v=1): + """for v>0, use Robert form, ie spatial VECTOR fields are multiplied by sin(colatitude). The scalar transforms are unaffected.""" + return _shtns.sht_robert_form(self, v) + + + def __ct(self): + """__ct(sht self) -> PyObject *""" + return _shtns.sht___ct(self) + + + def gauss_wts(self): + """gauss_wts(sht self) -> PyObject *""" + return _shtns.sht_gauss_wts(self) + + + def mul_ct_matrix(self): + """mul_ct_matrix(sht self) -> PyObject *""" + return _shtns.sht_mul_ct_matrix(self) + + + def st_dt_matrix(self): + """st_dt_matrix(sht self) -> PyObject *""" + return _shtns.sht_st_dt_matrix(self) + + + def __spat_shape(self): + """__spat_shape(sht self)""" + return _shtns.sht___spat_shape(self) + + + def spec_array(self, im=-1): + """return a numpy array of spherical harmonic coefficients (complex). Adress coefficients with index sh.idx(l,m) + if optional argument im is given, the spectral array is restricted to order im*mres.""" + if im<0: + return np.zeros(self.nlm, dtype=complex) + else: + return np.zeros(self.lmax + 1 - im*self.mres, dtype=complex) + + def spat_array(self): + """return a numpy array of 2D spatial field.""" + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + return np.zeros(self.spat_shape) + + + def idx(self, l, m): + """idx(sht self, unsigned int l, unsigned int m) -> int""" + return _shtns.sht_idx(self, l, m) + + + def spat_to_SH(self, Vr, Qlm): + """spat_to_SH(sht self, PyObject * Vr, PyObject * Qlm)""" + return _shtns.sht_spat_to_SH(self, Vr, Qlm) + + + def SH_to_spat(self, Qlm, Vr): + """SH_to_spat(sht self, PyObject * Qlm, PyObject * Vr)""" + return _shtns.sht_SH_to_spat(self, Qlm, Vr) + + + def spat_cplx_to_SH(self, z, alm): + """spat_cplx_to_SH(sht self, PyObject * z, PyObject * alm)""" + return _shtns.sht_spat_cplx_to_SH(self, z, alm) + + + def SH_to_spat_cplx(self, alm, z): + """SH_to_spat_cplx(sht self, PyObject * alm, PyObject * z)""" + return _shtns.sht_SH_to_spat_cplx(self, alm, z) + + + def spat_to_SHsphtor(self, Vt, Vp, Slm, Tlm): + """spat_to_SHsphtor(sht self, PyObject * Vt, PyObject * Vp, PyObject * Slm, PyObject * Tlm)""" + return _shtns.sht_spat_to_SHsphtor(self, Vt, Vp, Slm, Tlm) + + + def SHsphtor_to_spat(self, Slm, Tlm, Vt, Vp): + """SHsphtor_to_spat(sht self, PyObject * Slm, PyObject * Tlm, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHsphtor_to_spat(self, Slm, Tlm, Vt, Vp) + + + def SHsph_to_spat(self, Slm, Vt, Vp): + """SHsph_to_spat(sht self, PyObject * Slm, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHsph_to_spat(self, Slm, Vt, Vp) + + + def SHtor_to_spat(self, Tlm, Vt, Vp): + """SHtor_to_spat(sht self, PyObject * Tlm, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHtor_to_spat(self, Tlm, Vt, Vp) + + + def spat_cplx_to_SHsphtor(self, Vt, Vp, Slm, Tlm): + """spat_cplx_to_SHsphtor(sht self, PyObject * Vt, PyObject * Vp, PyObject * Slm, PyObject * Tlm)""" + return _shtns.sht_spat_cplx_to_SHsphtor(self, Vt, Vp, Slm, Tlm) + + + def SHsphtor_to_spat_cplx(self, Slm, Tlm, Vt, Vp): + """SHsphtor_to_spat_cplx(sht self, PyObject * Slm, PyObject * Tlm, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHsphtor_to_spat_cplx(self, Slm, Tlm, Vt, Vp) + + + def spat_to_SHqst(self, Vr, Vt, Vp, Qlm, Slm, Tlm): + """spat_to_SHqst(sht self, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * Qlm, PyObject * Slm, PyObject * Tlm)""" + return _shtns.sht_spat_to_SHqst(self, Vr, Vt, Vp, Qlm, Slm, Tlm) + + + def SHqst_to_spat(self, Qlm, Slm, Tlm, Vr, Vt, Vp): + """SHqst_to_spat(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * Vr, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHqst_to_spat(self, Qlm, Slm, Tlm, Vr, Vt, Vp) + + + def spat_cplx_to_SHqst(self, Vr, Vt, Vp, Qlm, Slm, Tlm): + """spat_cplx_to_SHqst(sht self, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * Qlm, PyObject * Slm, PyObject * Tlm)""" + return _shtns.sht_spat_cplx_to_SHqst(self, Vr, Vt, Vp, Qlm, Slm, Tlm) + + + def SHqst_to_spat_cplx(self, Qlm, Slm, Tlm, Vr, Vt, Vp): + """SHqst_to_spat_cplx(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * Vr, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHqst_to_spat_cplx(self, Qlm, Slm, Tlm, Vr, Vt, Vp) + + + def synth(self,*arg): + """ + spectral to spatial transform, for scalar or vector data. + v = synth(qlm) : compute the spatial representation of the scalar qlm + vtheta,vphi = synth(slm,tlm) : compute the 2D spatial vector from its spectral spheroidal/toroidal scalars (slm,tlm) + vr,vtheta,vphi = synth(qlm,slm,tlm) : compute the 3D spatial vector from its spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + q = list(arg) + for i in range(0,n): + if q[i].size != self.nlm: raise RuntimeError("spectral array has wrong size.") + if q[i].dtype.num != np.dtype('complex128').num: raise RuntimeError("spectral array should be dtype=complex.") + if q[i].flags.contiguous == False: q[i] = q[i].copy() # contiguous array required. + if n==1: #scalar transform + vr = np.empty(self.spat_shape) + self.SH_to_spat(q[0],vr) + return vr + elif n==2: # 2D vector transform + vt = np.empty(self.spat_shape) # v_theta + vp = np.empty(self.spat_shape) # v_phi + self.SHsphtor_to_spat(q[0],q[1],vt,vp) + return vt,vp + else: # 3D vector transform + vr = np.empty(self.spat_shape) # v_r + vt = np.empty(self.spat_shape) # v_theta + vp = np.empty(self.spat_shape) # v_phi + self.SHqst_to_spat(q[0],q[1],q[2],vr,vt,vp) + return vr,vt,vp + + def analys(self,*arg): + """ + spatial to spectral transform, for scalar or vector data. + qlm = analys(q) : compute the spherical harmonic representation of the scalar q + slm,tlm = analys(vtheta,vphi) : compute the spectral spheroidal/toroidal scalars (slm,tlm) from 2D vector components (vtheta, vphi) + qlm,slm,tlm = synth(vr,vtheta,vphi) : compute the spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) from 3D vector components (vr,vtheta,vphi) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if abs(self.cos_theta[0]) == 1: raise RuntimeError("Analysis not allowed with sht_reg_poles grid.") + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + v = list(arg) + for i in range(0,n): + if v[i].shape != self.spat_shape: raise RuntimeError("spatial array has wrong shape.") + if v[i].dtype.num != np.dtype('float64').num: raise RuntimeError("spatial array should be dtype=float64.") + if v[i].flags.contiguous == False: v[i] = v[i].copy() # contiguous array required. + if n==1: + q = np.empty(self.nlm, dtype=complex) + self.spat_to_SH(v[0],q) + return q + elif n==2: + s = np.empty(self.nlm, dtype=complex) + t = np.empty(self.nlm, dtype=complex) + self.spat_to_SHsphtor(v[0],v[1],s,t) + return s,t + else: + q = np.empty(self.nlm, dtype=complex) + s = np.empty(self.nlm, dtype=complex) + t = np.empty(self.nlm, dtype=complex) + self.spat_to_SHqst(v[0],v[1],v[2],q,s,t) + return q,s,t + + def synth_grad(self,slm): + """(vtheta,vphi) = synth_grad(sht self, slm) : compute the spatial representation of the gradient of slm""" + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if slm.size != self.nlm: raise RuntimeError("spectral array has wrong size.") + if slm.dtype.num != np.dtype('complex128').num: raise RuntimeError("spectral array should be dtype=complex.") + if slm.flags.contiguous == False: slm = slm.copy() # contiguous array required. + vt = np.empty(self.spat_shape) + vp = np.empty(self.spat_shape) + self.SHsph_to_spat(slm,vt,vp) + return vt,vp + + def synth_cplx(self,*arg): + """ + spectral to spatial transform, for complex-valued scalar or vector data. + z = synth(zlm) : compute the complex-valued spatial representation of the scalar zlm + vtheta,vphi = synth(slm,tlm) : compute the complex-valued 2D spatial vector from its spectral spheroidal/toroidal scalars (slm,tlm) + vr,vtheta,vphi = synth(qlm,slm,tlm) : compute the complex-valued 3D spatial vector from its spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if self.lmax != self.mmax: raise RuntimeError("complex SH requires lmax=mmax and mres=1.") + + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + q = list(arg) + for i in range(0,n): + if q[i].size != (self.lmax+1)**2: raise RuntimeError("spectral array has wrong size.") + if q[i].dtype.num != np.dtype('complex128').num: raise RuntimeError("spectral array should be dtype=complex.") + if q[i].flags.contiguous == False: q[i] = q[i].copy() # contiguous array required. + if n==1: #scalar transform + z = np.empty(self.spat_shape, dtype=complex) + self.SH_to_spat_cplx(q[0],z) + return z + elif n==2: # 2D vector transform + zt = np.empty(self.spat_shape, dtype=complex) # v_theta + zp = np.empty(self.spat_shape, dtype=complex) # v_phi + self.SHsphtor_to_spat_cplx(q[0],q[1],zt,zp) + return zt,zp + else: # 3D vector transform + zr = np.empty(self.spat_shape, dtype=complex) # v_r + zt = np.empty(self.spat_shape, dtype=complex) # v_theta + zp = np.empty(self.spat_shape, dtype=complex) # v_phi + self.SHqst_to_spat(q[0],q[1],q[2],zr,zt,zp) + return vr,vt,vp + + def analys_cplx(self,*arg): + """ + spatial to spectral transform, for complex-valued scalar or vector data. + zlm = analys(z) : compute the spherical harmonic representation of the complex scalar z + slm,tlm = analys(vtheta,vphi) : compute the spectral spheroidal/toroidal scalars (slm,tlm) from complex-valued 2D vector components (vtheta, vphi) + qlm,slm,tlm = synth(vr,vtheta,vphi) : compute the spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) from complex-valued 3D vector components (vr,vtheta,vphi) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if self.lmax != self.mmax: raise RuntimeError("complex SH requires lmax=mmax and mres=1.") + + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + v = list(arg) + for i in range(0,n): + if v[i].shape != self.spat_shape: raise RuntimeError("spatial array has wrong shape.") + if v[i].dtype.num != np.dtype('complex128').num: raise RuntimeError("spatial array should be dtype=complex128.") + if v[i].flags.contiguous == False: v[i] = v[i].copy() # contiguous array required. + if n==1: + q = np.empty((self.lmax+1)**2, dtype=complex) + self.spat_cplx_to_SH(v[0],q) + return q + elif n==2: + s = np.empty((self.lmax+1)**2, dtype=complex) + t = np.empty((self.lmax+1)**2, dtype=complex) + self.spat_cplx_to_SHsphtor(v[0],v[1],s,t) + return s,t + else: + q = np.empty((self.lmax+1)**2, dtype=complex) + s = np.empty((self.lmax+1)**2, dtype=complex) + t = np.empty((self.lmax+1)**2, dtype=complex) + self.spat_cplx_to_SHqst(v[0],v[1],v[2],q,s,t) + return q,s,t + + + def zidx(self, l,m): + """ + zidx(sht self, int l, int m) -> int : compute the index l*(l+1)+m in a complex spherical harmonic expansion + """ + l = np.asarray(l) + m = np.asarray(m) + if (l>self.lmax).any() or (abs(m)>l).any() : raise RuntimeError("invalid range for l,m") + return l*(l+1)+m + + def zlm(self, idx): + """ + zlm(sht self, int idx) -> (int,int) : returns the l and m corresponding to the given index in complex spherical harmonic expansion + """ + idx = np.asarray(idx) + if (idx >= (self.lmax+1)**2).any() or (idx < 0).any() : raise RuntimeError("invalid range for l,m") + l = np.sqrt(idx).astype(int) + m = idx - l*(l+1) + return l,m + + def spec_array_cplx(self): + """return a numpy array that can hold the spectral representation of a complex scalar spatial field.""" + return np.zeros((self.lmax+1)**2, dtype=complex) + + def spat_array_cplx(self): + """return a numpy array of 2D complex spatial field.""" + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + return np.zeros(self.spat_shape, dtype='complex128') + + + def SH_to_point(self, Qlm, cost, phi): + """SH_to_point(sht self, PyObject * Qlm, double cost, double phi) -> double""" + return _shtns.sht_SH_to_point(self, Qlm, cost, phi) + + + def SH_to_grad_point(self, DrSlm, Slm, cost, phi): + """SH_to_grad_point(sht self, PyObject * DrSlm, PyObject * Slm, double cost, double phi)""" + return _shtns.sht_SH_to_grad_point(self, DrSlm, Slm, cost, phi) + + + def SHqst_to_point(self, Qlm, Slm, Tlm, cost, phi): + """SHqst_to_point(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, double cost, double phi)""" + return _shtns.sht_SHqst_to_point(self, Qlm, Slm, Tlm, cost, phi) + + + def SH_to_lat(self, Qlm, cost, Vr): + """SH_to_lat(sht self, PyObject * Qlm, double cost, PyObject * Vr)""" + return _shtns.sht_SH_to_lat(self, Qlm, cost, Vr) + + + def SHqst_to_lat(self, Qlm, Slm, Tlm, cost, Vr, Vt, Vp): + """SHqst_to_lat(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, double cost, PyObject * Vr, PyObject * Vt, PyObject * Vp)""" + return _shtns.sht_SHqst_to_lat(self, Qlm, Slm, Tlm, cost, Vr, Vt, Vp) + + + def Zrotate(self, Qlm, alpha): + """Zrotate(sht self, PyObject * Qlm, double alpha) -> PyObject *""" + return _shtns.sht_Zrotate(self, Qlm, alpha) + + + def Yrotate(self, Qlm, alpha): + """Yrotate(sht self, PyObject * Qlm, double alpha) -> PyObject *""" + return _shtns.sht_Yrotate(self, Qlm, alpha) + + + def Yrotate90(self, Qlm): + """Yrotate90(sht self, PyObject * Qlm) -> PyObject *""" + return _shtns.sht_Yrotate90(self, Qlm) + + + def Xrotate90(self, Qlm): + """Xrotate90(sht self, PyObject * Qlm) -> PyObject *""" + return _shtns.sht_Xrotate90(self, Qlm) + + + def SH_mul_mx(self, mx, Qlm): + """SH_mul_mx(sht self, PyObject * mx, PyObject * Qlm) -> PyObject *""" + return _shtns.sht_SH_mul_mx(self, mx, Qlm) + + + def spat_to_SH_m(self, Vr, Qlm, im): + """spat_to_SH_m(sht self, PyObject * Vr, PyObject * Qlm, PyObject * im)""" + return _shtns.sht_spat_to_SH_m(self, Vr, Qlm, im) + + + def SH_to_spat_m(self, Qlm, Vr, im): + """SH_to_spat_m(sht self, PyObject * Qlm, PyObject * Vr, PyObject * im)""" + return _shtns.sht_SH_to_spat_m(self, Qlm, Vr, im) + + + def spat_to_SHsphtor_m(self, Vt, Vp, Slm, Tlm, im): + """spat_to_SHsphtor_m(sht self, PyObject * Vt, PyObject * Vp, PyObject * Slm, PyObject * Tlm, PyObject * im)""" + return _shtns.sht_spat_to_SHsphtor_m(self, Vt, Vp, Slm, Tlm, im) + + + def SHsphtor_to_spat_m(self, Slm, Tlm, Vt, Vp, im): + """SHsphtor_to_spat_m(sht self, PyObject * Slm, PyObject * Tlm, PyObject * Vt, PyObject * Vp, PyObject * im)""" + return _shtns.sht_SHsphtor_to_spat_m(self, Slm, Tlm, Vt, Vp, im) + + + def SHsph_to_spat_m(self, Slm, Vt, Vp, im): + """SHsph_to_spat_m(sht self, PyObject * Slm, PyObject * Vt, PyObject * Vp, PyObject * im)""" + return _shtns.sht_SHsph_to_spat_m(self, Slm, Vt, Vp, im) + + + def SHtor_to_spat_m(self, Tlm, Vt, Vp, im): + """SHtor_to_spat_m(sht self, PyObject * Tlm, PyObject * Vt, PyObject * Vp, PyObject * im)""" + return _shtns.sht_SHtor_to_spat_m(self, Tlm, Vt, Vp, im) + + + def spat_to_SHqst_m(self, Vr, Vt, Vp, Qlm, Slm, Tlm, im): + """spat_to_SHqst_m(sht self, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * im)""" + return _shtns.sht_spat_to_SHqst_m(self, Vr, Vt, Vp, Qlm, Slm, Tlm, im) + + + def SHqst_to_spat_m(self, Qlm, Slm, Tlm, Vr, Vt, Vp, im): + """SHqst_to_spat_m(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * im)""" + return _shtns.sht_SHqst_to_spat_m(self, Qlm, Slm, Tlm, Vr, Vt, Vp, im) + +sht_swigregister = _shtns.sht_swigregister +sht_swigregister(sht) + + +def nlm_calc(lmax, mmax, mres): + """nlm_calc(long lmax, long mmax, long mres) -> long""" + return _shtns.nlm_calc(lmax, mmax, mres) + +def nlm_cplx_calc(lmax, mmax, mres): + """nlm_cplx_calc(long lmax, long mmax, long mres) -> long""" + return _shtns.nlm_cplx_calc(lmax, mmax, mres) + +def set_verbosity(arg1): + """set_verbosity(int arg1)""" + return _shtns.set_verbosity(arg1) + +def print_version(): + """print_version()""" + return _shtns.print_version() +# This file is compatible with both classic and new-style classes. + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_cuda.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_cuda.h new file mode 100644 index 000000000..de27be0da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_cuda.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/** \file shtns_cuda.h + \brief shtns_cuda.h declares transforms and initialization functions for cuda-enabled GPU. +**/ + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/**\addtogroup cuda GPU transforms. + * CUDA transforms working on GPU memory, without transfers, but **NOT thread-safe**. + * \warning These transforms are **NOT thread-safe**. Use one distinct shtns_cfg per thread. Use \ref cushtns_clone to clone them. + * The transforms are **Non-blocking**, working with their own streams. Each clone has distinct streams. \see \ref gpu +**/ +//@{ + +///\name Transforms +//@{ +/// Same as \ref spat_to_SH, but working on data residing on the GPU. +void cu_spat_to_SH(shtns_cfg shtns, double *Vr, cplx *Qlm, int ltr); +/// Same as \ref SH_to_spat, but working on data residing on the GPU. +void cu_SH_to_spat(shtns_cfg shtns, cplx *Qlm, double *Vr, int ltr); +/// Same as \ref spat_to_SHsphtor, but working on data residing on the GPU. +void cu_spat_to_SHsphtor(shtns_cfg, double *Vt, double *Vp, cplx *Slm, cplx *Tlm, int ltr); +/// Same as \ref SHsphtor_to_spat, but working on data residing on the GPU. +void cu_SHsphtor_to_spat(shtns_cfg, cplx *Slm, cplx *Tlm, double *Vt, double *Vp, int ltr); +/// Same as \ref spat_to_SHqst, but working on data residing on the GPU. +void cu_spat_to_SHqst(shtns_cfg, double *Vr, double *Vt, double *Vp, cplx *Qlm, cplx *Slm, cplx *Tlm, int ltr); +/// Same as \ref SHqst_to_spat, but working on data residing on the GPU. +void cu_SHqst_to_spat(shtns_cfg, cplx *Qlm, cplx *Slm, cplx *Tlm, double *Vr, double *Vt, double *Vp, int ltr); +//@} + +///\name Initialization +//@{ +/// Clone a gpu-enabled shtns config, and assign it to different streams (to allow compute overlap and/or usage from multiple threads). +/// This implies allocation of memory on the GPU and other limited resources, and thus may fail. +/// \param[in] shtns is a valid shtns configuration created with \ref shtns_create and with an associated grid (see \ref shtns_set_grid_auto ) +/// \param[in] compute_stream is a cuda Stream that will be used for transforms. If 0, the default (0) stream will be used. +/// \param[in] transfer_stream is a cuda Stream that will be used for data transfers between host and device. If 0, a new stream will be created and used. +/// \returns a new \ref shtns_cfg that can safely be used concurrently with the original one. +shtns_cfg cushtns_clone(shtns_cfg shtns, cudaStream_t compute_stream, cudaStream_t transfer_stream); +//@} + +//@} + +/// Perform initialization of config for GPU, and use GPU for transform where possible. +int cushtns_init_gpu(shtns_cfg shtns); + +/// Set user-specified streams for compute (including fft) and transfer. +void cushtns_set_streams(shtns_cfg shtns, cudaStream_t compute_stream, cudaStream_t transfer_stream); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/.dep.inc b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/.dep.inc new file mode 100755 index 000000000..38ba445ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES} ${TESTOBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/pom.xml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/pom.xml new file mode 100755 index 000000000..7fc241f2b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + com.mrsharky + Shtns + 1.0-SNAPSHOT + jar + + + org.apache.commons + commons-math3 + 3.6.1 + + + + UTF-8 + 1.8 + 1.8 + + \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/ComplexArray.java b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/ComplexArray.java new file mode 100755 index 000000000..ff4615f9b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/ComplexArray.java @@ -0,0 +1,255 @@ +package com.mrsharky.helpers; + +import org.apache.commons.math3.complex.Complex; + +/** + * + * @author Julien Pierret (julien.pierret@gmail.com) + */ +public class ComplexArray { + + public static Complex[] Log (Complex[] comp1) throws Exception { + Complex[] comp = new Complex[comp1.length]; + for (int i = 0; i < comp1.length; i++) { + comp[i] = comp1[i].log(); + } + return comp; + } + + public static Complex[][] Log (Complex[][] comp1) throws Exception { + Complex[][] comp = new Complex[comp1.length][comp1[0].length]; + for (int i = 0; i < comp1.length; i++) { + for (int j = 0; j < comp1[0].length; j++) { + comp[i][j] = comp1[i][j].log(); + } + } + return comp; + } + + public static Complex[] Log (double[] comp1) throws Exception { + Complex[] comp = new Complex[comp1.length]; + for (int i = 0; i < comp1.length; i++) { + Complex currValue = new Complex(comp1[i]); + comp[i] = currValue.log(); + } + return comp; + } + + public static Complex[][] Log (double[][] comp1) throws Exception { + Complex[][] comp = new Complex[comp1.length][comp1[0].length]; + for (int i = 0; i < comp1.length; i++) { + for (int j = 0; j < comp1[0].length; j++) { + Complex currValue = new Complex(comp1[i][j]); + comp[i][j] = currValue.log(); + } + } + return comp; + } + + public static Complex[] Multiply (Complex[] comp1, double comp2) throws Exception { + Complex[] comp = new Complex[comp1.length]; + for (int i = 0; i < comp1.length; i++) { + comp[i] = comp1[i].multiply(comp2); + } + return comp; + } + + public static Complex[][] Multiply (Complex[][] comp1, double comp2) throws Exception { + Complex[][] comp = new Complex[comp1.length][comp1[0].length]; + for (int i = 0; i < comp1.length; i++) { + for (int j = 0; j < comp1[0].length; j++) { + comp[i][j] = comp1[i][j].multiply(comp2); + } + } + return comp; + } + + public static Complex[][] Multiply (Complex[][] comp1, Complex comp2) throws Exception { + Complex[][] comp = new Complex[comp1.length][comp1[0].length]; + for (int i = 0; i < comp1.length; i++) { + for (int j = 0; j < comp1[0].length; j++) { + comp[i][j] = comp1[i][j].multiply(comp2); + } + } + return comp; + } + + public static Complex[][] Conjugate (Complex[][] comp1) throws Exception { + Complex[][] comp = new Complex[comp1.length][comp1[0].length]; + for (int i = 0; i < comp1.length; i++) { + for (int j = 0; j < comp1[0].length; j++) { + comp[i][j] = comp1[i][j].conjugate(); + } + } + return comp; + } + + public static double[][] Real (Complex[][] comp1) throws Exception { + double[][] comp = new double[comp1.length][comp1[0].length]; + for (int i = 0; i < comp1.length; i++) { + for (int j = 0; j < comp1[0].length; j++) { + comp[i][j] = comp1[i][j].getReal(); + } + } + return comp; + } + + public static void Print(Complex[][][] values) { + System.out.println(); + for (int set = 0; set < values[0][0].length; set++) { + System.out.println("Set=" + set); + for (int col = 0; col maxValue) { + maxValue = currDouble; + } + } + return maxValue; + } + + public static double[][] SetColumn(double[][] mat, int column, double value) { + double[][] ret = new double[mat.length][mat[0].length]; + for (int row = 0; row < mat.length; row++) { + for (int col = 0; col < mat[row].length; col++) { + if (col == column) { + ret[row][col] = value; + } else { + ret[row][col] = mat[row][col]; + } + } + } + return ret; + } + + public static double[][] SetColumn(double[][] mat, int column, double[] value) { + double[][] ret = new double[mat.length][mat[0].length]; + for (int row = 0; row < mat.length; row++) { + for (int col = 0; col < mat[row].length; col++) { + if (col == column) { + ret[row][col] = value[row]; + } else { + ret[row][col] = mat[row][col]; + } + } + } + return ret; + } + + public static double[] ArcSin (double[] mat) { + double[] output = new double[mat.length]; + for (int i = 0; i < mat.length; i++) { + output[i] = Math.asin(mat[i]); + } + return output; + } + + public static void Print(double[][] values) { + System.out.println(); + for (int col = 0; col < values[0].length; col++) { + System.out.print("\t" + (col + 1)); + } + System.out.println(); + for (int row = 0; row < values.length; row++) { + System.out.print((row + 1) + ":\t"); + for (int col = 0; col < values[0].length; col++) { + System.out.print(values[row][col] + "\t"); + } + System.out.println(); + } + } + + public static void Print(double[] values) { + System.out.println(); + System.out.println("\t" + 1); + for (int row = 0; row < values.length; row++) { + System.out.print((row + 1) + ":\t"); + System.out.println(values[row] + "\t"); + } + } + + public static double[] Sin(double[] mat) { + double[] ret = new double[mat.length]; + for (int row = 0; row < mat.length; row++) { + ret[row] = Math.sin(mat[row]); + } + return ret; + } + + public static double[] Power(double[] mat, double exponent) { + double[] ret = new double[mat.length]; + for (int row = 0; row < mat.length; row++) { + double val = mat[row]; + ret[row] = Math.pow(val, exponent); + } + return ret; + } + + public static double[] GetColumn(double[][] mat1, int column) { + double[] ret = new double[mat1.length]; + for (int row = 0; row < mat1.length; row++) { + ret[row] = mat1[row][column]; + } + return ret; + } + + public static double[] Add(double[] mat, double scaler) { + double[] ret = new double[mat.length]; + for (int row = 0; row < mat.length; row++) { + ret[row] = mat[row] + scaler; + } + return ret; + } + + public static double[] Add(double[] mat1, double[] mat2) throws Exception { + if (mat1.length != mat2.length) { + throw new Exception("Array dimensions do not agree"); + } + double[] ret = new double[mat1.length]; + for (int i = 0; i < mat1.length; i++) { + ret[i] = mat1[i] + mat2[i]; + } + return ret; + } + + public static double[] Abs(double[] mat) { + double[] ret = new double[mat.length]; + for (int row = 0; row < mat.length; row++) { + ret[row] = Math.abs(mat[row]); + } + return ret; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/LegendreGausWeights.java b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/LegendreGausWeights.java new file mode 100755 index 000000000..8877ff927 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/LegendreGausWeights.java @@ -0,0 +1,119 @@ +package com.mrsharky.helpers; + +import static com.mrsharky.helpers.Utilities.arange; +import static com.mrsharky.helpers.Utilities.linspace; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.Arrays; + +/** + * + * @author Julien Pierret (julien.pierret@gmail.com) based on Matlab code by Greg von Winckel. + */ +public class LegendreGausWeights { + private int _N; + private int _N1; + private int _N2; + private double _a; + private double _b; + private double[] _x; + private double[] _w; + + public double[] GetWeights() { + return _w; + } + + public double[] GetValues() { + return _x; + } + + public LegendreGausWeights(int n, double a, double b) throws Exception { + if (n < 0) { + throw new Exception ("Input argument n must be greater than 1: " + n); + } + this._N = n-1; + this._N1 = _N + 1; + this._N2 = _N + 2; + this._a = a; + this._b = b; + + double[] xu = linspace(a,b,_N1); + double[] zeroToN1 = arange(0,_N1,1); + + // Calculate inital guess + double[] left = DoubleArray.Multiply(DoubleArray.Add(DoubleArray.Multiply(zeroToN1, 2.0) + , (1.0)) + ,(Math.PI)/(2.0*_N+2.0)); + left = DoubleArray.Cos(left); + + double[] right = DoubleArray.Multiply(xu, Math.PI*_N/_N2); + right = DoubleArray.Multiply(DoubleArray.Sin(right),0.27/_N1); + + double[] y = DoubleArray.Add(left, right); + + // Legendre-Gauss CosineOfMatrixValuesandermonde Matrix + double[][] L = new double[_N1][_N2]; + double[] Lp = new double[_N2]; + + double epsilonCompare = DoubleArray.Max(DoubleArray.Abs(DoubleArray.Add(y,2))); + while (epsilonCompare > Math.ulp(1.0)) { + L = DoubleArray.SetColumn(L, 0, 1.0); + L = DoubleArray.SetColumn(L,1,y); + + double[] l_loop = arange(2,_N1+1.0,1); + + for (double k : l_loop) { + int k_ = (int) Math.round(k); + + double[] loopLeft = DoubleArray.Multiply(DoubleArray.Multiply(y,DoubleArray.GetColumn(L, (k_-1))),(2.0*k-1.0)); + double[] loopRight = DoubleArray.Multiply(DoubleArray.GetColumn(L,(((int)Math.round(k))-2)), (k-1.0)); + + double[] columnValueToSet = DoubleArray.Multiply(DoubleArray.Add(loopLeft, DoubleArray.Multiply(loopRight,-1.0)),(1.0/k)); + L = DoubleArray.SetColumn(L,k_,columnValueToSet); + } + + // Derivative of LGVM + double[] lgvm_numerator = DoubleArray.Multiply(DoubleArray.Add(DoubleArray.GetColumn(L,_N1-1), + DoubleArray.Multiply( + DoubleArray.Multiply(y, DoubleArray.GetColumn(L,_N2-1)), -1.0)) + , _N2); + double[] lgvm_denominator = DoubleArray.Power(DoubleArray.Add(DoubleArray.Multiply(DoubleArray.Power(y,2.0),-1.0),1.0), -1.0); + Lp = DoubleArray.Multiply (lgvm_numerator,lgvm_denominator); + + double[] y0 = Arrays.copyOf(y, y.length); + + y = DoubleArray.Add(y0, DoubleArray.Multiply(DoubleArray.Multiply(DoubleArray.GetColumn(L,_N2-1),-1.0), + DoubleArray.Power(Lp,-1.0))); + + epsilonCompare = DoubleArray.Max(DoubleArray.Abs(DoubleArray.Add(y, DoubleArray.Multiply(y0, -1.0)))); + } + + // Linear map from [-1,1] to [a,b] + double[] x_left = DoubleArray.Multiply(DoubleArray.Add(DoubleArray.Multiply(y, -1.0), 1.0), a); + double[] x_right = DoubleArray.Multiply(DoubleArray.Add(y,1.0), b); + + _x = DoubleArray.Multiply(DoubleArray.Add(x_left, x_right), 1.0/2.0); + + // Compute the weights + double[] w_left = DoubleArray.Add(DoubleArray.Multiply(DoubleArray.Power(y, 2.0), -1.0), 1.0); + double[] w_right = DoubleArray.Power(Lp, 2.0); + double w_scalar = (b-a)*Math.pow(((double)_N2)/((double)_N1),2.0); + + _w = DoubleArray.Multiply(DoubleArray.Power(DoubleArray.Multiply(w_left, w_right), -1.0), w_scalar); + } + + public static void main(String args[]) { + try { + LegendreGausWeights lgwt = new LegendreGausWeights(100, -1.0, 1.0); + + double[] x = lgwt.GetValues(); + double[] w = lgwt.GetWeights(); + + DoubleArray.Print(x); + DoubleArray.Print(w); + + } catch (Exception ex) { + Logger.getLogger(LegendreGausWeights.class.getName()).log(Level.SEVERE, null, ex); + } + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/Utilities.java b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/Utilities.java new file mode 100755 index 000000000..ddfdbf304 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/helpers/Utilities.java @@ -0,0 +1,125 @@ +package com.mrsharky.helpers; + +import org.apache.commons.math3.complex.Complex; +import org.apache.commons.math3.linear.Array2DRowFieldMatrix; +import org.apache.commons.math3.linear.ArrayFieldVector; +import org.apache.commons.math3.linear.FieldMatrix; +import org.apache.commons.math3.linear.FieldVector; +import org.apache.commons.math3.linear.RealVector; + +/** + * + * @author Julien Pierret (julien.pierret@gmail.com) + */ +public class Utilities { + + public static double[] ArrayOnes(int size) { + double[] ret = new double[size]; + for (int counter = 0; counter < ret.length; counter++) { + ret[counter] = 1; + } + return ret; + } + + + public static int[] minToMaxByOne(int min, int max) { + int[] ret = new int[max-min+1]; + for (int i = 0; i < ret.length; i++) { + ret[i] = min + i; + } + return ret; + } + + public static double[] minToMaxByOne(double min, double max) { + double[] ret = new double[(int) max - (int) min+1]; + for (int i = 0; i < ret.length; i++) { + ret[i] = min + i; + } + return ret; + } + + public static double[] linspace(double min, double max, int points) { + double[] d = new double[points]; + if (points == 1) { + d[0] = min; + } else { + for (int i = 0; i < points; i++){ + d[i] = min + i * (max - min) / (points - 1); + } + } + return d; + } + + public static int[] linspace(int min, int max, int points) { + int[] d = new int[points]; + if (points == 1) { + d[0] = min; + } else { + for (int i = 0; i < points; i++){ + d[i] = min + i * (max - min) / (points - 1); + } + } + return d; + } + + public static double[] arange(double start, double end, double step) { + int points = (int) Math.floor((end-start)/step); + double[] d = new double[points]; + for (int i = 0; i < points; i++) { + d[i] = start + step*i; + } + return d; + } + + public static RealVector CosineOfVectorValues (RealVector vec) { + RealVector ret = vec.copy(); + for (int counter = 0; counter < ret.getDimension(); counter++) { + ret.setEntry(counter, Math.cos(ret.getEntry(counter))); + } + return ret; + } + + public static RealVector SineOfVectorValues (RealVector vec) { + RealVector ret = vec.copy(); + for (int counter = 0; counter < ret.getDimension(); counter++) { + ret.setEntry(counter, Math.sin(ret.getEntry(counter))); + } + return ret; + } + + + public static int ComplexExample() { + // create a 2x2 complex matrix + Complex[][] matrixData = new Complex[][] { + { new Complex(1.0, 0.0), new Complex( 0.0, 1.0) }, + { new Complex(0.0, -1.0), new Complex(-1.0, 0.0) } + }; + FieldMatrix m = new Array2DRowFieldMatrix(matrixData); + + + // create a vector + Complex[] vectorData = new Complex[] { + new Complex(1.0, 2.0), + new Complex(3.0, 4.0), + }; + FieldVector u = new ArrayFieldVector(vectorData); + + // perform matrix-vector multiplication + FieldVector v = m.operate(u); + + + // print the initial vector + for (int i = 0; i < u.getDimension(); ++i) { + //System.out.println(ComplexFormat.formatComplex(u.getEntry(i))); + } + + System.out.println(); + + // print the result + for (int i = 0; i < v.getDimension(); ++i) { + //System.out.println(ComplexFormat.formatComplex(v.getEntry(i))); + } + + return 1; + } +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/shtns/Shtns.java b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/shtns/Shtns.java new file mode 100755 index 000000000..65474fd97 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/src/main/java/com/mrsharky/shtns/Shtns.java @@ -0,0 +1,236 @@ +package com.mrsharky.shtns; + +import com.mrsharky.helpers.LegendreGausWeights; +import org.apache.commons.math3.complex.Complex; +import com.mrsharky.helpers.DoubleArray; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author Julien Pierret (julien.pierret@gmail.com) + */ +public class Shtns { + + // Native Methods + private native long initializeGaussian(int Q, int Ql, int periodicity, int jnlat, int jnlong, int numThreads); + private native double[] spatialToSpectral(long cfg, double[] data); + private native double[] spectralToSpatial(long cfg, double[] real, double[] imag); + private native long getNlm(long cfg); + + /** + * Adds the specified path to the java library path + * From: http://fahdshariff.blogspot.be/2011/08/changing-java-library-path-at-runtime.html + * @param pathToAdd the path to add + * @throws Exception + */ + public static void addLibraryPath(String pathToAdd) throws Exception{ + final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths"); + usrPathsField.setAccessible(true); + + //get array of paths + final String[] paths = (String[])usrPathsField.get(null); + + //check if the path to add is already present + for(String path : paths) { + if(path.equals(pathToAdd)) { + return; + } + } + + //add the new path + final String[] newPaths = Arrays.copyOf(paths, paths.length + 1); + newPaths[newPaths.length-1] = pathToAdd; + usrPathsField.set(null, newPaths); + } + + // Load the necessary native library + static { + try { + addLibraryPath("/usr/local/lib"); + addLibraryPath("/media/dropbox/PhD/Reboot/Projects/Ncep20thCenturyReanalysisV2c/C/shtns_jni/C/dist/Debug/GNU-Linux"); + System.loadLibrary("shtns_jni"); // Load native library at runtime + //System.load("/media/dropbox/PhD/Reboot/Projects/Ncep20thCenturyReanalysisV2c/C/shtns_jni/dist/Debug/GNU-Linux/libshtns_jni.so"); + } catch (Exception ex) { + Logger.getLogger(Shtns.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private final long _cfg; + private final int _lmax; + private final int _mmax; + private final int _mres; + private final int _nlat; + private final int _nphi; + private final long _nlm; + private Complex[] _spectral; + private double[] _spatial; + + public Shtns(int lmax, int mmax, int mres, int nlat, int nphi, int numThreads) throws Exception { + _lmax = lmax; + _mmax = mmax; + _mres = mres; + _nlat = nlat; + _nphi = nphi; + _cfg = initializeGaussian(_lmax, _mmax, _mres, _nlat, _nphi, numThreads); + _nlm = getNlm(_cfg); + } + + /** + * + * @param data Complex Array expected to be in the "compressed" format + * @return + */ + public void SpectralToSpatial(Complex[] data) { + _spectral = data; + // Split the real and imag apart + double[] real = new double[data.length]; + double[] imag = new double[data.length]; + + for (int i = 0; i < data.length; i++) { + real[i] = data[i].getReal(); + imag[i] = data[i].getImaginary(); + } + + double[] jniData = spectralToSpatial(_cfg, real, imag); + _spatial = jniData; + } + + public double[][] GetSpatial() { + double[][] results = new double[_nlat][_nphi]; + for (int ip = 0; ip < _nphi; ip++) { // loop on longitude + for (int it = 0; it < _nlat; it++) { // loop on latitude + results[it][ip] = _spatial[ip*_nlat + it]; + } + } + return results; + } + + public Complex[] GetSpectralCompressed() throws Exception { + if (this._spectral != null) { + return this._spectral; + } else { + throw new Exception("Spectral has not been processed!"); + } + } + + public double[] GetSpatialCompressed() throws Exception { + if (this._spatial != null) { + return this._spatial; + } else { + throw new Exception("Spatial has not been processed!"); + } + } + + /** + * + * @param data Array must be organized by long (- to +) & lat (- to +) + */ + public void SpatialToSpectral(double[] data) throws Exception { + _spatial = data; + double[] jniData = spatialToSpectral(_cfg, data); + if (jniData.length != (this._nlm*2)) { + throw new Exception("Returned spectral length from SHtns doesn't match expected length"); + } + Complex[] results = new Complex[(int) this._nlm]; + + int counter = 0; + for (int m = 0; m <= _mmax; m++) { + for (int l = m; l <= _lmax; l++) { + int index = counter; + double real = jniData[2*index]; + double imag = jniData[2*index+1]; + results[index] = new Complex(real, imag); + counter++; + } + } + this._spectral = results; + } + + /** + * + * @param data Double array must be organized double[south to north][east to west] + * @return + * @throws Exception + */ + public void SpatialToSpectral(double[][] data) throws Exception { + + // double check the dimensions of the new data are correct + if (data.length != _nlat) { + throw new Exception("Input data number of latitude points don't match what was configured"); + } + if (data[0].length != _nphi) { + throw new Exception("Input data number of longitude points don't match what was configured"); + } + + // first re-organize the data into a single double array + double[] dataToShtns = new double[_nphi*_nlat]; + + for (int ip = 0; ip < _nphi; ip++) { // loop on longitude + for (int it = 0; it < _nlat; it++) { // loop on latitude + dataToShtns[ip*_nlat + it] = data[it][ip]; + } + } + SpatialToSpectral(dataToShtns); + } + + // Test Driver + public static void main(String[] args) throws Exception { + + int lmax = 5; // maximum degree of spherical harmonics + int mmax = 3; // maximum order of spherical harmonics + int mres = 1; // periodicity in phi (1 for full-sphere, 2 for half the sphere, 3 for 1/3, etc...) + int nlat = 32; // number of points in the latitude direction (constraint: nlat >= lmax+1) + int nphi = 10; + + LegendreGausWeights lgw = new LegendreGausWeights(nlat,-1,1); + + double[] legZerosM = lgw.GetValues(); + double[] legZerosRad = DoubleArray.Add(DoubleArray.ArcSin(legZerosM), (Math.PI/2.0)); + double[] phi2 = DoubleArray.Cos(legZerosRad); + + double[][] data = new double[nlat][nphi]; + double[] data2 = new double[nlat*nphi]; + + // generate some gridded data: + for (int ip = 0; ip < nphi; ip++) { // loop on longitude + double phi = (2.*Math.PI/(mres*nphi)) * ip; + double cos_phi = Math.cos(phi); + for (int it = 0; it < nlat; it++) { // loop on latitude + double cos_theta = phi2[it]; + double sin_theta = Math.sqrt(1.0 - cos_theta*cos_theta); + double currValue = cos_phi*cos_theta*sin_theta; // this is an m=1, l=2 harmonic + data[it][ip] = currValue; + data2[ip*nlat + it] = currValue; + } + } + + // Setup shtns + System.out.println("Setting up SHTns"); + Shtns shtns = new Shtns(lmax, mmax, mres, nlat, nphi, 0); + + // spatial to spectral + System.out.println("Spatial to Spectral"); + shtns.SpatialToSpectral(data2); + Complex [] spectral = shtns.GetSpectralCompressed(); + + // spectral back to spatial + System.out.println("Spectral to Spatial"); + shtns.SpectralToSpatial(spectral); + double[][] dataRebuilt = shtns.GetSpatial(); + + DoubleArray.Print(data); + DoubleArray.Print(dataRebuilt); + + // Compare the two + double error = 0; + for (int i = 0; i < data.length; i++) { + for (int j = 0; j < data[0].length; j++) { + error = error + Math.pow(data[i][j] - dataRebuilt[i][j], 2.0); + } + } + System.out.println("SumSqError: " + error); + } +} \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/Shtns-1.0-SNAPSHOT.jar b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/Shtns-1.0-SNAPSHOT.jar new file mode 100755 index 000000000..5f502636e Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/Shtns-1.0-SNAPSHOT.jar differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/.netbeans_automatic_build b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/.netbeans_automatic_build new file mode 100755 index 000000000..e69de29bb diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/ComplexArray.class b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/ComplexArray.class new file mode 100755 index 000000000..05fef739d Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/ComplexArray.class differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/DoubleArray.class b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/DoubleArray.class new file mode 100755 index 000000000..56e69f32d Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/DoubleArray.class differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/LegendreGausWeights.class b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/LegendreGausWeights.class new file mode 100755 index 000000000..19ce8ab61 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/LegendreGausWeights.class differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/Utilities.class b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/Utilities.class new file mode 100755 index 000000000..89901b68a Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/helpers/Utilities.class differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/shtns/Shtns.class b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/shtns/Shtns.class new file mode 100755 index 000000000..54382acb9 Binary files /dev/null and b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/classes/com/mrsharky/shtns/Shtns.class differ diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/maven-archiver/pom.properties b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/maven-archiver/pom.properties new file mode 100755 index 000000000..868e51055 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Sun Nov 26 12:54:31 PST 2017 +version=1.0-SNAPSHOT +groupId=com.mrsharky +artifactId=Shtns diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/test-classes/.netbeans_automatic_build b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/Java/Shtns/target/test-classes/.netbeans_automatic_build new file mode 100755 index 000000000..e69de29bb diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/.dep.inc b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/.dep.inc new file mode 100755 index 000000000..38ba445ca --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/.dep.inc @@ -0,0 +1,5 @@ +# This code depends on make tool being used +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES} ${TESTOBJECTFILES})) +ifneq (${DEPFILES},) +include ${DEPFILES} +endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/Makefile new file mode 100755 index 000000000..05de621e8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/Makefile @@ -0,0 +1,128 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_PLATFORM_${CONF} platform name (current configuration) +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# build tests +build-tests: .build-tests-post + +.build-tests-pre: +# Add your pre 'build-tests' code here... + +.build-tests-post: .build-tests-impl +# Add your post 'build-tests' code here... + + +# run tests +test: .test-post + +.test-pre: build-tests +# Add your pre 'test' code here... + +.test-post: .test-impl +# Add your post 'test' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ShtnsJni.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ShtnsJni.c new file mode 100755 index 000000000..4a2e8440e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ShtnsJni.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2017 Julien Pierret + * + * julien.pierret@gmail.com + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/** + A JNI Wrapper to use SHTns from JAVA. +**/ + +#include +#include +#include +#include +#include + +#include +#include +#include "ShtnsJni.h" + +JNIEXPORT jlong JNICALL Java_com_mrsharky_shtns_Shtns_initializeGaussian(JNIEnv *env, jobject thisObj +, jint jlmax, jint jmmax, jint periodicity, jint jnlat, jint jnlong, jint numThreads) { + shtns_cfg shtns; + + const int lmax = jlmax; // maximum degree of spherical harmonics + const int mmax = jmmax; // maximum order of spherical harmonics + const int mres = periodicity; // periodicity in phi (1 for full-sphere, 2 for half the sphere, 3 for 1/3, etc...) + const int nlat = jnlat; // number of points in the latitude direction (constraint: nlat >= lmax+1) + const int nphi = jnlong; // number of points in the longitude direction (constraint: nphi >= 2*mmax+1) + + shtns_verbose(0); // displays informations during initialization. + shtns_use_threads(numThreads); // enable multi-threaded transforms (if supported). + shtns = shtns_init( sht_gauss, lmax, mmax, mres, nlat, nphi ); + return (long) shtns; +} + +JNIEXPORT jlong JNICALL Java_com_mrsharky_shtns_Shtns_getNlm(JNIEnv *env, jobject thisObj, jlong cfg) { + shtns_cfg shtns = (shtns_cfg) cfg; + return shtns->nlm; +} + +JNIEXPORT jdoubleArray JNICALL Java_com_mrsharky_shtns_Shtns_spatialToSpectral(JNIEnv *env, jobject thisObj, jlong cfg, jdoubleArray data) { + shtns_cfg shtns = (shtns_cfg) cfg; + jdouble *Sh = (*env)->GetDoubleArrayElements(env, data, NULL); + + //printf("lmax= %i, mmax=%i, mres=%i, nlat=%i, nphi=%i\n", shtns->lmax, shtns->mmax, shtns->mres, shtns->nlat, shtns->nphi); + + complex double *Slm; // spherical harmonics coefficients (l,m space): complex numbers. + double *Th; + // shtns_set_grid(shtns, sht_gauss, 0.0, nlat, nphi); + long int NLM = shtns->nlm; + + // Memory allocation : the use of shtns_malloc is highly recommended because we need proper alignement. + // allocate spatial fields. + Th = (double *) shtns_malloc( NSPAT_ALLOC(shtns) * sizeof(double)); + + // allocate SH representations. + Slm = (complex double *) shtns_malloc( NLM * sizeof(complex double)); + + // go to spectral space: Sh -> Slm + spat_to_SH(shtns, Sh, Slm); // note that this destroys the spatial data in Sh. + + int arraySize = shtns->nlm; + jdouble spectral[2*arraySize]; // Double the size of the return array. We need to store both real & imaginary values in it + + for (int j = 0; j < arraySize; j++) { + spectral[2*j] = creal(Slm[j]); // Real + spectral[2*j+1] = cimag(Slm[j]); // Imaginary + } + + jdoubleArray spectralArray = (*env)->NewDoubleArray(env, 2*arraySize); // allocate + (*env)->SetDoubleArrayRegion(env, spectralArray, 0 , 2*arraySize, spectral); // copy + + // Cleanup + (*env)->ReleaseDoubleArrayElements(env, data, Sh, 0); + return spectralArray; +} + +JNIEXPORT jdoubleArray JNICALL Java_com_mrsharky_shtns_Shtns_spectralToSpatial(JNIEnv *env, jobject thisObj, jlong cfg, jdoubleArray real, jdoubleArray imag) { + shtns_cfg shtns = (shtns_cfg) cfg; + jdouble *Slm_real = (*env)->GetDoubleArrayElements(env, real, NULL); + jdouble *Slm_imag = (*env)->GetDoubleArrayElements(env, imag, NULL); + + // Set the memory + complex double *Slm = (complex double *) shtns_malloc( shtns->nlm * sizeof(complex double)); + double *Th = (double *) shtns_malloc( NSPAT_ALLOC(shtns) * sizeof(double)); + + // Set the values of Slm + int index = 0; + for (int m = 0; m <= shtns->mmax; m++) { + for (int l = m; l <= shtns->lmax; l++) { + Slm[index] = (double) Slm_real[index] + _Complex_I*((double) Slm_imag[index]); + index++; + } + } + + // come back to spatial space: Slm -> Th + SH_to_spat(shtns, Slm, Th); // this does not destroy the spectral data in Slm. + + // Setup the return + int arraySize = shtns->nphi * shtns->nlat; + jdoubleArray spatialArray = (*env)->NewDoubleArray(env, arraySize); // allocate + (*env)->SetDoubleArrayRegion(env, spatialArray, 0 , arraySize, Th); // copy + + // Cleanup + (*env)->ReleaseDoubleArrayElements(env, real, Slm_real, 0); + (*env)->ReleaseDoubleArrayElements(env, imag, Slm_imag, 0); + return spatialArray; +} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ShtnsJni.h b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ShtnsJni.h new file mode 100755 index 000000000..d3d3c6b70 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ShtnsJni.h @@ -0,0 +1,28 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include + +/* Header for class com_mrsharky_shtns_Shtns*/ + +#ifndef _Included_com_mrsharky_shtns_Shtns +#define _Included_com_mrsharky_shtns_Shtns +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_mrsharky_shtns_Shtns + * Method: test + * Signature: () + */ +JNIEXPORT jlong JNICALL Java_com_mrsharky_shtns_Shtns_initializeGaussian(JNIEnv *, jobject, jint, jint, jint, jint, jint, jint); + +JNIEXPORT jlong JNICALL Java_com_mrsharky_shtns_Shtns_getNlm(JNIEnv *, jobject, jlong); + +JNIEXPORT jdoubleArray JNICALL Java_com_mrsharky_shtns_Shtns_spatialToSpectral(JNIEnv *, jobject, jlong, jdoubleArray); + +JNIEXPORT jdoubleArray JNICALL Java_com_mrsharky_shtns_Shtns_spectralToSpatial(JNIEnv *, jobject, jlong, jdoubleArray, jdoubleArray); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-Debug.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-Debug.mk new file mode 100755 index 000000000..52f0f8e12 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-Debug.mk @@ -0,0 +1,83 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +GREP=grep +NM=nm +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc +CCC=g++ +CXX=g++ +FC=gfortran +AS=as + +# Macros +CND_PLATFORM=GNU-Linux +CND_DLIB_EXT=so +CND_CONF=Debug +CND_DISTDIR=dist +CND_BUILDDIR=build + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/ShtnsJni.o + + +# C Compiler Flags +CFLAGS= + +# CC Compiler Flags +CCFLAGS= +CXXFLAGS= + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS=-lshtns -lfftw3 -lm + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libshtns_jni.${CND_DLIB_EXT} + +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libshtns_jni.${CND_DLIB_EXT}: ${OBJECTFILES} + ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} + ${LINK.c} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libshtns_jni.${CND_DLIB_EXT} ${OBJECTFILES} ${LDLIBSOPTIONS} -shared -fPIC + +${OBJECTDIR}/ShtnsJni.o: ShtnsJni.c + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.c) -g -I/usr/lib/jvm/java-8-oracle/include/ -I/usr/lib/jvm/java-8-oracle/include/linux -I/usr/local/include -fPIC -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/ShtnsJni.o ShtnsJni.c + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${CND_BUILDDIR}/${CND_CONF} + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-Release.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-Release.mk new file mode 100755 index 000000000..2bcb0258f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-Release.mk @@ -0,0 +1,83 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a -pre and a -post target defined where you can add customized code. +# +# This makefile implements configuration specific macros and targets. + + +# Environment +MKDIR=mkdir +CP=cp +GREP=grep +NM=nm +CCADMIN=CCadmin +RANLIB=ranlib +CC=gcc +CCC=g++ +CXX=g++ +FC=gfortran +AS=as + +# Macros +CND_PLATFORM=GNU-Linux +CND_DLIB_EXT=so +CND_CONF=Release +CND_DISTDIR=dist +CND_BUILDDIR=build + +# Include project Makefile +include Makefile + +# Object Directory +OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM} + +# Object Files +OBJECTFILES= \ + ${OBJECTDIR}/ShtnsJni.o + + +# C Compiler Flags +CFLAGS= + +# CC Compiler Flags +CCFLAGS= +CXXFLAGS= + +# Fortran Compiler Flags +FFLAGS= + +# Assembler Flags +ASFLAGS= + +# Link Libraries and Options +LDLIBSOPTIONS= + +# Build Targets +.build-conf: ${BUILD_SUBPROJECTS} + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/shtns_jni + +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/shtns_jni: ${OBJECTFILES} + ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM} + ${LINK.c} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/shtns_jni ${OBJECTFILES} ${LDLIBSOPTIONS} + +${OBJECTDIR}/ShtnsJni.o: ShtnsJni.c + ${MKDIR} -p ${OBJECTDIR} + ${RM} "$@.d" + $(COMPILE.c) -O2 -std=c11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/ShtnsJni.o ShtnsJni.c + +# Subprojects +.build-subprojects: + +# Clean Targets +.clean-conf: ${CLEAN_SUBPROJECTS} + ${RM} -r ${CND_BUILDDIR}/${CND_CONF} + +# Subprojects +.clean-subprojects: + +# Enable dependency checking +.dep.inc: .depcheck-impl + +include .dep.inc diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-impl.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-impl.mk new file mode 100755 index 000000000..5d994f5bf --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-impl.mk @@ -0,0 +1,133 @@ +# +# Generated Makefile - do not edit! +# +# Edit the Makefile in the project folder instead (../Makefile). Each target +# has a pre- and a post- target defined where you can add customization code. +# +# This makefile implements macros and targets common to all configurations. +# +# NOCDDL + + +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf +# and .clean-reqprojects-conf unless SUB has the value 'no' +SUB_no=NO +SUBPROJECTS=${SUB_${SUB}} +BUILD_SUBPROJECTS_=.build-subprojects +BUILD_SUBPROJECTS_NO= +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}} +CLEAN_SUBPROJECTS_=.clean-subprojects +CLEAN_SUBPROJECTS_NO= +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}} + + +# Project Name +PROJECTNAME=shtns_jni + +# Active Configuration +DEFAULTCONF=Debug +CONF=${DEFAULTCONF} + +# All Configurations +ALLCONFS=Debug Release + + +# build +.build-impl: .build-pre .validate-impl .depcheck-impl + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf + + +# clean +.clean-impl: .clean-pre .validate-impl .depcheck-impl + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf + + +# clobber +.clobber-impl: .clobber-pre .depcheck-impl + @#echo "=> Running $@..." + for CONF in ${ALLCONFS}; \ + do \ + "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \ + done + +# all +.all-impl: .all-pre .depcheck-impl + @#echo "=> Running $@..." + for CONF in ${ALLCONFS}; \ + do \ + "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \ + done + +# build tests +.build-tests-impl: .build-impl .build-tests-pre + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf + +# run tests +.test-impl: .build-tests-impl .test-pre + @#echo "=> Running $@... Configuration=$(CONF)" + "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf + +# dependency checking support +.depcheck-impl: + @echo "# This code depends on make tool being used" >.dep.inc + @if [ -n "${MAKE_VERSION}" ]; then \ + echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \ + echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \ + echo "include \$${DEPFILES}" >>.dep.inc; \ + echo "endif" >>.dep.inc; \ + else \ + echo ".KEEP_STATE:" >>.dep.inc; \ + echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \ + fi + +# configuration validation +.validate-impl: + @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ + then \ + echo ""; \ + echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \ + echo "See 'make help' for details."; \ + echo "Current directory: " `pwd`; \ + echo ""; \ + fi + @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \ + then \ + exit 1; \ + fi + + +# help +.help-impl: .help-pre + @echo "This makefile supports the following configurations:" + @echo " ${ALLCONFS}" + @echo "" + @echo "and the following targets:" + @echo " build (default target)" + @echo " clean" + @echo " clobber" + @echo " all" + @echo " help" + @echo "" + @echo "Makefile Usage:" + @echo " make [CONF=] [SUB=no] build" + @echo " make [CONF=] [SUB=no] clean" + @echo " make [SUB=no] clobber" + @echo " make [SUB=no] all" + @echo " make help" + @echo "" + @echo "Target 'build' will build a specific configuration and, unless 'SUB=no'," + @echo " also build subprojects." + @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no'," + @echo " also clean subprojects." + @echo "Target 'clobber' will remove all built files from all configurations and," + @echo " unless 'SUB=no', also from subprojects." + @echo "Target 'all' will will build all configurations and, unless 'SUB=no'," + @echo " also build subprojects." + @echo "Target 'help' prints this message." + @echo "" + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-variables.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-variables.mk new file mode 100755 index 000000000..98ed17d09 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Makefile-variables.mk @@ -0,0 +1,35 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +CND_BASEDIR=`pwd` +CND_BUILDDIR=build +CND_DISTDIR=dist +# Debug configuration +CND_PLATFORM_Debug=GNU-Linux +CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux +CND_ARTIFACT_NAME_Debug=libshtns_jni.so +CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux/libshtns_jni.so +CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux/package +CND_PACKAGE_NAME_Debug=libshtnsjni.so.tar +CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux/package/libshtnsjni.so.tar +# Release configuration +CND_PLATFORM_Release=GNU-Linux +CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux +CND_ARTIFACT_NAME_Release=shtns_jni +CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux/shtns_jni +CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux/package +CND_PACKAGE_NAME_Release=shtnsjni.tar +CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux/package/shtnsjni.tar +# +# include compiler specific variables +# +# dmake command +ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \ + (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk) +# +# gmake command +.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)) +# +include nbproject/private/Makefile-variables.mk diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Package-Debug.bash b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Package-Debug.bash new file mode 100755 index 000000000..a7eaf775e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Package-Debug.bash @@ -0,0 +1,76 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_PLATFORM=GNU-Linux +CND_CONF=Debug +CND_DISTDIR=dist +CND_BUILDDIR=build +CND_DLIB_EXT=so +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/libshtns_jni.${CND_DLIB_EXT} +OUTPUT_BASENAME=libshtns_jni.${CND_DLIB_EXT} +PACKAGE_TOP_DIR=libshtnsjni.so/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package +rm -rf ${NBTMPDIR} +mkdir -p ${NBTMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory "${NBTMPDIR}/libshtnsjni.so/lib" +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}lib/${OUTPUT_BASENAME}" 0644 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/libshtnsjni.so.tar +cd ${NBTMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/libshtnsjni.so.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${NBTMPDIR} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Package-Release.bash b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Package-Release.bash new file mode 100755 index 000000000..ca1eecbd0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/Package-Release.bash @@ -0,0 +1,76 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_PLATFORM=GNU-Linux +CND_CONF=Release +CND_DISTDIR=dist +CND_BUILDDIR=build +CND_DLIB_EXT=so +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/shtns_jni +OUTPUT_BASENAME=shtns_jni +PACKAGE_TOP_DIR=shtnsjni/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package +rm -rf ${NBTMPDIR} +mkdir -p ${NBTMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory "${NBTMPDIR}/shtnsjni/bin" +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/shtnsjni.tar +cd ${NBTMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/shtnsjni.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${NBTMPDIR} diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/configurations.xml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/configurations.xml new file mode 100755 index 000000000..7caa80320 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/configurations.xml @@ -0,0 +1,86 @@ + + + + + ShtnsJni.h + + + + + ShtnsJni.c + + + + + Makefile + + + Makefile + + + + default + true + false + + + + + /usr/lib/jvm/java-8-oracle/include/ + /usr/lib/jvm/java-8-oracle/include/linux + /usr/local/include + + + + + shtns + fftw3 + m + + + + + + + + + + + default + true + false + + + + 5 + 10 + + + 5 + + + 5 + + + 5 + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/Makefile-variables.mk b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/Makefile-variables.mk new file mode 100755 index 000000000..a64183e10 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/Makefile-variables.mk @@ -0,0 +1,7 @@ +# +# Generated - do not edit! +# +# NOCDDL +# +# Debug configuration +# Release configuration diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/c_standard_headers_indexer.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/c_standard_headers_indexer.c new file mode 100755 index 000000000..c2548d20c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/c_standard_headers_indexer.c @@ -0,0 +1,75 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + */ + +// List of standard headers was taken in http://en.cppreference.com/w/c/header + +#include // Conditionally compiled macro that compares its argument to zero +#include // Functions to determine the type contained in character data +#include // Macros reporting error conditions +#include // Limits of float types +#include // Sizes of basic types +#include // Localization utilities +#include // Common mathematics functions +#include // Nonlocal jumps +#include // Signal handling +#include // Variable arguments +#include // Common macro definitions +#include // Input/output +#include // String handling +#include // General utilities: memory management, program utilities, string conversions, random numbers +#include // Time/date utilities +#include // (since C95) Alternative operator spellings +#include // (since C95) Extended multibyte and wide character utilities +#include // (since C95) Wide character classification and mapping utilities +#ifdef _STDC_C99 +#include // (since C99) Complex number arithmetic +#include // (since C99) Floating-point environment +#include // (since C99) Format conversion of integer types +#include // (since C99) Boolean type +#include // (since C99) Fixed-width integer types +#include // (since C99) Type-generic math (macros wrapping math.h and complex.h) +#endif +#ifdef _STDC_C11 +#include // (since C11) alignas and alignof convenience macros +#include // (since C11) Atomic types +#include // (since C11) noreturn convenience macros +#include // (since C11) Thread library +#include // (since C11) UTF-16 and UTF-32 character utilities +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/configurations.xml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/configurations.xml new file mode 100755 index 000000000..7e2bdaa15 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/configurations.xml @@ -0,0 +1,74 @@ + + + Makefile + + + + localhost + 2 + + + + + + + + + + + + + + + + + gdb + + + + "${OUTPUT_PATH}" + + "${OUTPUT_PATH}" + + true + 0 + 0 + + + + + + + localhost + 2 + + + + + + + + + + + + + + + gdb + + + + "${OUTPUT_PATH}" + + "${OUTPUT_PATH}" + + true + 0 + 0 + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/cpp_standard_headers_indexer.cpp b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/cpp_standard_headers_indexer.cpp new file mode 100755 index 000000000..04f6fa660 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/cpp_standard_headers_indexer.cpp @@ -0,0 +1,135 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + */ + +// List of standard headers was taken in http://en.cppreference.com/w/cpp/header + +#include // General purpose utilities: program control, dynamic memory allocation, random numbers, sort and search +#include // Functions and macro constants for signal management +#include // Macro (and function) that saves (and jumps) to an execution context +#include // Handling of variable length argument lists +#include // Runtime type information utilities +#include // std::bitset class template +#include // Function objects, designed for use with the standard algorithms +#include // Various utility components +#include // C-style time/date utilites +#include // typedefs for types such as size_t, NULL and others +#include // Low-level memory management utilities +#include // Higher level memory management utilities +#include // limits of integral types +#include // limits of float types +#include // standardized way to query properties of arithmetic types +#include // Exception handling utilities +#include // Standard exception objects +#include // Conditionally compiled macro that compares its argument to zero +#include // Macro containing the last error number +#include // functions to determine the type contained in character data +#include // functions for determining the type of wide character data +#include // various narrow character string handling functions +#include // various wide and multibyte string handling functions +#include // std::basic_string class template +#include // std::vector container +#include // std::deque container +#include // std::list container +#include // std::set and std::multiset associative containers +#include // std::map and std::multimap associative containers +#include // std::stack container adaptor +#include // std::queue and std::priority_queue container adaptors +#include // Algorithms that operate on containers +#include // Container iterators +#include // Common mathematics functions +#include // Complex number type +#include // Class for representing and manipulating arrays of values +#include // Numeric operations on values in containers +#include // forward declarations of all classes in the input/output library +#include // std::ios_base class, std::basic_ios class template and several typedefs +#include // std::basic_istream class template and several typedefs +#include // std::basic_ostream, std::basic_iostream class templates and several typedefs +#include // several standard stream objects +#include // std::basic_fstream, std::basic_ifstream, std::basic_ofstream class templates and several typedefs +#include // std::basic_stringstream, std::basic_istringstream, std::basic_ostringstream class templates and several typedefs +#include // std::strstream, std::istrstream, std::ostrstream(deprecated) +#include // Helper functions to control the format or input and output +#include // std::basic_streambuf class template +#include // C-style input-output functions +#include // Localization utilities +#include // C localization utilities +#include // empty header. The macros that appear in iso646.h in C are keywords in C++ +#if __cplusplus >= 201103L +#include // (since C++11) std::type_index +#include // (since C++11) Compile-time type information +#include // (since C++11) C++ time utilites +#include // (since C++11) std::initializer_list class template +#include // (since C++11) std::tuple class template +#include // (since C++11) Nested allocator class +#include // (since C++11) fixed-size types and limits of other types +#include // (since C++11) formatting macros , intmax_t and uintmax_t math and conversions +#include // (since C++11) defines std::error_code, a platform-dependent error code +#include // (since C++11) C-style Unicode character conversion functions +#include // (since C++11) std::array container +#include // (since C++11) std::forward_list container +#include // (since C++11) std::unordered_set and std::unordered_multiset unordered associative containers +#include // (since C++11) std::unordered_map and std::unordered_multimap unordered associative containers +#include // (since C++11) Random number generators and distributions +#include // (since C++11) Compile-time rational arithmetic +#include // (since C++11) Floating-point environment access functions +#include // (since C++11) Unicode conversion facilities +#include // (since C++11) Classes, algorithms and iterators to support regular expression processing +#include // (since C++11) Atomic operations library +#include // (since C++11)(deprecated in C++17) simply includes the header +#include // (since C++11)(deprecated in C++17) simply includes the headers (until C++17) (since C++17) and : the overloads equivalent to the contents of the C header tgmath.h are already provided by those headers +#include // (since C++11)(deprecated in C++17) defines one compatibility macro constant +#include // (since C++11)(deprecated in C++17) defines one compatibility macro constant +#include // (since C++11) std::thread class and supporting functions +#include // (since C++11) mutual exclusion primitives +#include // (since C++11) primitives for asynchronous computations +#include // (since C++11) thread waiting conditions +#endif +#if __cplusplus >= 201300L +#include // (since C++14) shared mutual exclusion primitives +#endif +#if __cplusplus >= 201500L +#include // (since C++17) std::any class template +#include // (since C++17) std::optional class template +#include // (since C++17) std::variant class template +#include // (since C++17) Polymorphic allocators and memory resources +#include // (since C++17) std::basic_string_view class template +#include // (since C++17) Predefined execution policies for parallel versions of the algorithms +#include // (since C++17) std::path class and supporting functions +#endif diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/launcher.properties b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/launcher.properties new file mode 100755 index 000000000..3edc2d897 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/launcher.properties @@ -0,0 +1,42 @@ +# Launchers File syntax: +# +# [Must-have property line] +# launcher1.runCommand= +# [Optional extra properties] +# launcher1.displayName= +# launcher1.hide= +# launcher1.buildCommand= +# launcher1.runDir= +# launcher1.runInOwnTab= +# launcher1.symbolFiles= +# launcher1.env.= +# (If this value is quoted with ` it is handled as a native command which execution result will become the value) +# [Common launcher properties] +# common.runDir= +# (This value is overwritten by a launcher specific runDir value if the latter exists) +# common.env.= +# (Environment variables from common launcher are merged with launcher specific variables) +# common.symbolFiles= +# (This value is overwritten by a launcher specific symbolFiles value if the latter exists) +# +# In runDir, symbolFiles and env fields you can use these macroses: +# ${PROJECT_DIR} - project directory absolute path +# ${OUTPUT_PATH} - linker output path (relative to project directory path) +# ${OUTPUT_BASENAME}- linker output filename +# ${TESTDIR} - test files directory (relative to project directory path) +# ${OBJECTDIR} - object files directory (relative to project directory path) +# ${CND_DISTDIR} - distribution directory (relative to project directory path) +# ${CND_BUILDDIR} - build directory (relative to project directory path) +# ${CND_PLATFORM} - platform name +# ${CND_CONF} - configuration name +# ${CND_DLIB_EXT} - dynamic library extension +# +# All the project launchers must be listed in the file! +# +# launcher1.runCommand=... +# launcher2.runCommand=... +# ... +# common.runDir=... +# common.env.KEY=VALUE + +# launcher1.runCommand= \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/private.xml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/private.xml new file mode 100755 index 000000000..e8b29db21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/private/private.xml @@ -0,0 +1,15 @@ + + + + 2 + 0 + + + + + file:/media/dropbox/PhD/Reboot/Projects/Ncep20thCenturyReanalysisV2c/C/shtns_jni/ShtnsJni.h + file:/media/dropbox/PhD/Reboot/Projects/Ncep20thCenturyReanalysisV2c/C/shtns_jni/ShtnsJni.c + file:/media/dropbox/PhD/Reboot/Projects/Ncep20thCenturyReanalysisV2c/C/shtns_jni/Makefile + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/project.xml b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/project.xml new file mode 100755 index 000000000..533e1992f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/nbproject/project.xml @@ -0,0 +1,28 @@ + + + org.netbeans.modules.cnd.makeproject + + + shtns_jni + c + + h + UTF-8 + + + + + Debug + 2 + + + Release + 1 + + + + false + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat new file mode 100755 index 000000000..d40af6d4c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat @@ -0,0 +1,10 @@ +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 +0.139508 0.315255 0.480375 0.62787 0.752083 0.848336 0.913018 0.943707 0.939252 0.899815 0.826862 0.723109 0.592419 0.43966 0.270523 0.0913083 -0.0913083 -0.270523 -0.43966 -0.592419 -0.723109 -0.826862 -0.899815 -0.939252 -0.943707 -0.913018 -0.848336 -0.752083 -0.62787 -0.480375 -0.315255 -0.139508 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat_after b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat_after new file mode 100755 index 000000000..e7bdaac86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat_after @@ -0,0 +1,10 @@ +0.073722 0.166594 0.253851 0.331794 0.397434 0.448298 0.482478 0.498696 0.496342 0.475502 0.43695 0.382122 0.31306 0.232336 0.142956 0.0482513 -0.0482513 -0.142956 -0.232336 -0.31306 -0.382122 -0.43695 -0.475502 -0.496342 -0.498696 -0.482478 -0.448298 -0.397434 -0.331794 -0.253851 -0.166594 -0.073722 +0.0596423 0.134778 0.20537 0.268427 0.321531 0.36268 0.390333 0.403453 0.401549 0.384689 0.3535 0.309144 0.253271 0.187964 0.115654 0.0390361 -0.0390361 -0.115654 -0.187964 -0.253271 -0.309144 -0.3535 -0.384689 -0.401549 -0.403453 -0.390333 -0.36268 -0.321531 -0.268427 -0.20537 -0.134778 -0.0596423 +0.0227813 0.0514805 0.0784444 0.10253 0.122814 0.138532 0.149094 0.154105 0.153378 0.146938 0.135025 0.118082 0.0967409 0.0717957 0.0441759 0.0149105 -0.0149105 -0.0441759 -0.0717957 -0.0967409 -0.118082 -0.135025 -0.146938 -0.153378 -0.154105 -0.149094 -0.138532 -0.122814 -0.10253 -0.0784444 -0.0514805 -0.0227813 +-0.0227813 -0.0514805 -0.0784444 -0.10253 -0.122814 -0.138532 -0.149094 -0.154105 -0.153378 -0.146938 -0.135025 -0.118082 -0.0967409 -0.0717957 -0.0441759 -0.0149105 0.0149105 0.0441759 0.0717957 0.0967409 0.118082 0.135025 0.146938 0.153378 0.154105 0.149094 0.138532 0.122814 0.10253 0.0784444 0.0514805 0.0227813 +-0.0596423 -0.134778 -0.20537 -0.268427 -0.321531 -0.36268 -0.390333 -0.403453 -0.401549 -0.384689 -0.3535 -0.309144 -0.253271 -0.187964 -0.115654 -0.0390361 0.0390361 0.115654 0.187964 0.253271 0.309144 0.3535 0.384689 0.401549 0.403453 0.390333 0.36268 0.321531 0.268427 0.20537 0.134778 0.0596423 +-0.073722 -0.166594 -0.253851 -0.331794 -0.397434 -0.448298 -0.482478 -0.498696 -0.496342 -0.475502 -0.43695 -0.382122 -0.31306 -0.232336 -0.142956 -0.0482513 0.0482513 0.142956 0.232336 0.31306 0.382122 0.43695 0.475502 0.496342 0.498696 0.482478 0.448298 0.397434 0.331794 0.253851 0.166594 0.073722 +-0.0596423 -0.134778 -0.20537 -0.268427 -0.321531 -0.36268 -0.390333 -0.403453 -0.401549 -0.384689 -0.3535 -0.309144 -0.253271 -0.187964 -0.115654 -0.0390361 0.0390361 0.115654 0.187964 0.253271 0.309144 0.3535 0.384689 0.401549 0.403453 0.390333 0.36268 0.321531 0.268427 0.20537 0.134778 0.0596423 +-0.0227813 -0.0514805 -0.0784444 -0.10253 -0.122814 -0.138532 -0.149094 -0.154105 -0.153378 -0.146938 -0.135025 -0.118082 -0.0967409 -0.0717957 -0.0441759 -0.0149105 0.0149105 0.0441759 0.0717957 0.0967409 0.118082 0.135025 0.146938 0.153378 0.154105 0.149094 0.138532 0.122814 0.10253 0.0784444 0.0514805 0.0227813 +0.0227813 0.0514805 0.0784444 0.10253 0.122814 0.138532 0.149094 0.154105 0.153378 0.146938 0.135025 0.118082 0.0967409 0.0717957 0.0441759 0.0149105 -0.0149105 -0.0441759 -0.0717957 -0.0967409 -0.118082 -0.135025 -0.146938 -0.153378 -0.154105 -0.149094 -0.138532 -0.122814 -0.10253 -0.0784444 -0.0514805 -0.0227813 +0.0596423 0.134778 0.20537 0.268427 0.321531 0.36268 0.390333 0.403453 0.401549 0.384689 0.3535 0.309144 0.253271 0.187964 0.115654 0.0390361 -0.0390361 -0.115654 -0.187964 -0.253271 -0.309144 -0.3535 -0.384689 -0.401549 -0.403453 -0.390333 -0.36268 -0.321531 -0.268427 -0.20537 -0.134778 -0.0596423 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat_before b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat_before new file mode 100755 index 000000000..e7bdaac86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spat_before @@ -0,0 +1,10 @@ +0.073722 0.166594 0.253851 0.331794 0.397434 0.448298 0.482478 0.498696 0.496342 0.475502 0.43695 0.382122 0.31306 0.232336 0.142956 0.0482513 -0.0482513 -0.142956 -0.232336 -0.31306 -0.382122 -0.43695 -0.475502 -0.496342 -0.498696 -0.482478 -0.448298 -0.397434 -0.331794 -0.253851 -0.166594 -0.073722 +0.0596423 0.134778 0.20537 0.268427 0.321531 0.36268 0.390333 0.403453 0.401549 0.384689 0.3535 0.309144 0.253271 0.187964 0.115654 0.0390361 -0.0390361 -0.115654 -0.187964 -0.253271 -0.309144 -0.3535 -0.384689 -0.401549 -0.403453 -0.390333 -0.36268 -0.321531 -0.268427 -0.20537 -0.134778 -0.0596423 +0.0227813 0.0514805 0.0784444 0.10253 0.122814 0.138532 0.149094 0.154105 0.153378 0.146938 0.135025 0.118082 0.0967409 0.0717957 0.0441759 0.0149105 -0.0149105 -0.0441759 -0.0717957 -0.0967409 -0.118082 -0.135025 -0.146938 -0.153378 -0.154105 -0.149094 -0.138532 -0.122814 -0.10253 -0.0784444 -0.0514805 -0.0227813 +-0.0227813 -0.0514805 -0.0784444 -0.10253 -0.122814 -0.138532 -0.149094 -0.154105 -0.153378 -0.146938 -0.135025 -0.118082 -0.0967409 -0.0717957 -0.0441759 -0.0149105 0.0149105 0.0441759 0.0717957 0.0967409 0.118082 0.135025 0.146938 0.153378 0.154105 0.149094 0.138532 0.122814 0.10253 0.0784444 0.0514805 0.0227813 +-0.0596423 -0.134778 -0.20537 -0.268427 -0.321531 -0.36268 -0.390333 -0.403453 -0.401549 -0.384689 -0.3535 -0.309144 -0.253271 -0.187964 -0.115654 -0.0390361 0.0390361 0.115654 0.187964 0.253271 0.309144 0.3535 0.384689 0.401549 0.403453 0.390333 0.36268 0.321531 0.268427 0.20537 0.134778 0.0596423 +-0.073722 -0.166594 -0.253851 -0.331794 -0.397434 -0.448298 -0.482478 -0.498696 -0.496342 -0.475502 -0.43695 -0.382122 -0.31306 -0.232336 -0.142956 -0.0482513 0.0482513 0.142956 0.232336 0.31306 0.382122 0.43695 0.475502 0.496342 0.498696 0.482478 0.448298 0.397434 0.331794 0.253851 0.166594 0.073722 +-0.0596423 -0.134778 -0.20537 -0.268427 -0.321531 -0.36268 -0.390333 -0.403453 -0.401549 -0.384689 -0.3535 -0.309144 -0.253271 -0.187964 -0.115654 -0.0390361 0.0390361 0.115654 0.187964 0.253271 0.309144 0.3535 0.384689 0.401549 0.403453 0.390333 0.36268 0.321531 0.268427 0.20537 0.134778 0.0596423 +-0.0227813 -0.0514805 -0.0784444 -0.10253 -0.122814 -0.138532 -0.149094 -0.154105 -0.153378 -0.146938 -0.135025 -0.118082 -0.0967409 -0.0717957 -0.0441759 -0.0149105 0.0149105 0.0441759 0.0717957 0.0967409 0.118082 0.135025 0.146938 0.153378 0.154105 0.149094 0.138532 0.122814 0.10253 0.0784444 0.0514805 0.0227813 +0.0227813 0.0514805 0.0784444 0.10253 0.122814 0.138532 0.149094 0.154105 0.153378 0.146938 0.135025 0.118082 0.0967409 0.0717957 0.0441759 0.0149105 -0.0149105 -0.0441759 -0.0717957 -0.0967409 -0.118082 -0.135025 -0.146938 -0.153378 -0.154105 -0.149094 -0.138532 -0.122814 -0.10253 -0.0784444 -0.0514805 -0.0227813 +0.0596423 0.134778 0.20537 0.268427 0.321531 0.36268 0.390333 0.403453 0.401549 0.384689 0.3535 0.309144 0.253271 0.187964 0.115654 0.0390361 -0.0390361 -0.115654 -0.187964 -0.253271 -0.309144 -0.3535 -0.384689 -0.401549 -0.403453 -0.390333 -0.36268 -0.321531 -0.268427 -0.20537 -0.134778 -0.0596423 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spatp b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spatp new file mode 100755 index 000000000..fc4d31566 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spatp @@ -0,0 +1,10 @@ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spatt b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spatt new file mode 100755 index 000000000..b91eec871 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/spatt @@ -0,0 +1,10 @@ +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 -0 0 -0 0 -0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 -0 0 -0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm new file mode 100755 index 000000000..6c619dbdb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm @@ -0,0 +1 @@ +0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm_nl b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm_nl new file mode 100755 index 000000000..80abab7a2 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm_nl @@ -0,0 +1 @@ +1.69257 0 0 0 0.540671 0 0 0 -0.967182 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm_v b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm_v new file mode 100755 index 000000000..acdaae7da --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_jni/shtns_jni/ylm_v @@ -0,0 +1 @@ +0 0 2.04665 0 0 0 -1.91513e-15 0 0 0 -2.05391e-15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ No newline at end of file diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_numpy.i b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_numpy.i new file mode 100644 index 000000000..42a86386a --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_numpy.i @@ -0,0 +1,673 @@ +/* + * Copyright (c) 2010-2013 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@ujf-grenoble.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/* shtns_numpy.i : SWIG interface to Python using NumPy */ + +/* TODO and known problems : + * - alignement on 16 bytes of NumPy arrays is not guaranteed. It should however work on 64bit systems or on modern 32bit systems. + * - you may have to adjust the path below to include the header file "arrayobject.h" from the NumPy package. + */ + +%module (docstring="Python/NumPy interface to the SHTns spherical harmonic transform library") shtns + +%init{ + import_array(); // required by NumPy +} + +%pythoncode{ + import numpy as np +} + +%{ + +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include "sht_private.h" + +// variables used for exception handling. +static int shtns_error = 0; +static char* shtns_err_msg; +static char msg_buffer[128]; +static char msg_grid_err[] = "Grid not set. Call .set_grid() mehtod."; +static char msg_numpy_arr[] = "Numpy array expected."; +static char msg_rot_err[] = "truncation must be triangular (lmax=mmax, mres=1)"; + +static void throw_exception(int error, int iarg, char* msg) +{ + shtns_error = error; + shtns_err_msg = msg; + if (iarg > 0) { + sprintf(msg_buffer, "arg #%d : %.100s", iarg, msg); + shtns_err_msg = msg_buffer; + } +} + +static int check_spatial(int i, PyObject *a, int size) { + if (size == 0) { + throw_exception(SWIG_RuntimeError,0,msg_grid_err); return 0; + } + if (!PyArray_Check(a)) { + throw_exception(SWIG_TypeError,i,msg_numpy_arr); return 0; + } + if (PyArray_TYPE((PyArrayObject *) a) != NPY_DOUBLE) { + throw_exception(SWIG_TypeError,i,"spatial array must consist of float."); return 0; + } + if (!PyArray_ISCONTIGUOUS((PyArrayObject *) a)) { + throw_exception(SWIG_RuntimeError,i,"spatial array not contiguous. Use 'b=a.copy()' to copy a to a contiguous array b."); return 0; + } + if (PyArray_SIZE((PyArrayObject *) a) != size) { + throw_exception(SWIG_RuntimeError,i,"spatial array has wrong size"); return 0; + } + return 1; +} + +static int check_spectral(int i, PyObject *a, int size) { + if (!PyArray_Check(a)) { + throw_exception(SWIG_RuntimeError,i,msg_numpy_arr); return 0; + } + if (PyArray_TYPE((PyArrayObject *) a) != NPY_CDOUBLE) { + throw_exception(SWIG_RuntimeError,i,"spectral array must consist of complex float. Create with: 'sh.spec_array()'"); return 0; + } + if (!PyArray_ISCONTIGUOUS((PyArrayObject *) a)) { + throw_exception(SWIG_RuntimeError,i,"spactral array not contiguous. Use .copy() to copy to a contiguous array."); return 0; + } + if (PyArray_SIZE((PyArrayObject *) a) != size) { + throw_exception(SWIG_RuntimeError,i,"spectral array has wrong size"); return 0; + } + return 1; +} + +inline static void* PyArray_Data(PyObject *a) { + return PyArray_DATA((PyArrayObject*) a); +} + +inline static PyObject* SpecArray_New(int size) { + npy_intp dims = size; + npy_intp strides = sizeof(cplx); + return PyArray_New(&PyArray_Type, 1, &dims, NPY_CDOUBLE, &strides, NULL, strides, 0, NULL); +} + +inline static PyObject* SpatArray_New(int size) { + npy_intp dims = size; + npy_intp strides = sizeof(double); + return PyArray_New(&PyArray_Type, 1, &dims, NPY_DOUBLE, &strides, NULL, strides, 0, NULL); +} + +%} + +// main object is renamed to sht. +%rename("sht") shtns_info; +%ignore SHT_NATIVE_LAYOUT; +%ignore nlat_2; +%ignore lmidx; +%ignore li; +%ignore mi; +%ignore ct; +%ignore st; + +%rename(print_version) shtns_print_version; +%rename(set_verbosity) shtns_verbose; + +%feature("autodoc"); +%include "shtns.h" +%include "exception.i" + + +%extend shtns_info { + %exception { + shtns_error = 0; // clear exception + $function + if (shtns_error) { // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + + %pythonappend shtns_info %{ + ## array giving the degree of spherical harmonic coefficients. + self.l = np.zeros(self.nlm, dtype=np.int32) + ## array giving the order of spherical harmonic coefficients. + self.m = np.zeros(self.nlm, dtype=np.int32) + for mloop in range(0, self.mmax*self.mres+1, self.mres): + for lloop in range(mloop, self.lmax+1): + ii = self.idx(lloop,mloop) + self.m[ii] = mloop + self.l[ii] = lloop + self.m.flags.writeable = False # prevent writing in m and l arrays + self.l.flags.writeable = False + %} + %feature("kwargs") shtns_info; + shtns_info(int lmax, int mmax=-1, int mres=1, int norm=sht_orthonormal, int nthreads=0) { // default arguments : mmax, mres and norm + if (lmax < 2) { + throw_exception(SWIG_ValueError,1,"lmax < 2 not allowed"); return NULL; + } + if (mres <= 0) { + throw_exception(SWIG_ValueError,3,"mres <= 0 invalid"); return NULL; + } + if (mmax < 0) mmax = lmax/mres; // default mmax + if (mmax*mres > lmax) { + throw_exception(SWIG_ValueError,1,"lmax < mmax*mres invalid"); return NULL; + } + shtns_use_threads(nthreads); // use nthreads openmp threads if available (0 means auto) + return shtns_create(lmax, mmax, mres, norm); + } + + ~shtns_info() { + shtns_destroy($self); // free memory. + } + + %pythonappend set_grid %{ + ## array giving the cosine of the colatitude for the grid. + self.cos_theta = self.__ct() + self.cos_theta.flags.writeable = False + ## shape of a spatial array for the grid (tuple of 2 values). + self.spat_shape = tuple(self.__spat_shape()) + if self.nphi == 1: # override spatial shape when nphi==1 + self.spat_shape = (self.nlat, 1) + if flags & SHT_THETA_CONTIGUOUS: self.spat_shape = (1, self.nlat) + %} + %apply int *OUTPUT { int *nlat_out }; + %apply int *OUTPUT { int *nphi_out }; + %feature("kwargs") set_grid; + void set_grid(int nlat=0, int nphi=0, int flags=sht_quick_init, double polar_opt=1.0e-8, int nl_order=1, int *nlat_out, int *nphi_out) { // default arguments + if (nlat != 0) { + if (nlat <= $self->lmax) { // nlat too small + throw_exception(SWIG_ValueError,1,"nlat <= lmax"); return; + } + if (nlat & 1) { // nlat must be even + throw_exception(SWIG_ValueError,1,"nlat must be even"); return; + } + } + if ((nphi != 0) && (nphi <= $self->mmax *2)) { // nphi too small + throw_exception(SWIG_ValueError,2,"nphi <= 2*mmax"); return; + } + if (!(flags & SHT_THETA_CONTIGUOUS)) flags |= SHT_PHI_CONTIGUOUS; // default to SHT_PHI_CONTIGUOUS. + *nlat_out = nlat; *nphi_out = nphi; + shtns_set_grid_auto($self, flags, polar_opt, nl_order, nlat_out, nphi_out); + } + + void print_info() { + shtns_print_cfg($self); + } + double sh00_1() { + return sh00_1($self); + } + double sh10_ct() { + return sh10_ct($self); + } + double sh11_st() { + return sh11_st($self); + } + double shlm_e1(unsigned l, unsigned m) { + return shlm_e1($self, l, m); + } + + %feature("autodoc", "for v>0, use Robert form, ie spatial VECTOR fields are multiplied by sin(colatitude). The scalar transforms are unaffected.") robert_form; + void robert_form(int v=1) { shtns_robert_form($self, v); } + + /* returns useful data */ + PyObject* __ct() { // grid must have been initialized. + PyObject *obj; + double *ct; + int i; + if ($self->nlat == 0) { // no grid + throw_exception(SWIG_RuntimeError,0,msg_grid_err); + return NULL; + } + obj = SpatArray_New($self->nlat); + ct = (double*) PyArray_Data(obj); + for (i=0; i<$self->nlat; i++) ct[i] = $self->ct[i]; // copy + return obj; + } + PyObject* gauss_wts() { // gauss grid must have been initialized. + PyObject *obj; + if ($self->nlat == 0) { // no grid + throw_exception(SWIG_RuntimeError,0,msg_grid_err); + return NULL; + } + if ($self->wg == NULL) { + throw_exception(SWIG_RuntimeError,0,"not a gauss grid"); + return NULL; + } + obj = SpatArray_New($self->nlat_2); + shtns_gauss_wts($self, PyArray_Data(obj)); + return obj; + } + PyObject* mul_ct_matrix() { + PyObject *mx = SpatArray_New(2*$self->nlm); + mul_ct_matrix($self, PyArray_Data(mx)); + return mx; + } + PyObject* st_dt_matrix() { + PyObject *mx = SpatArray_New(2*$self->nlm); + st_dt_matrix($self, PyArray_Data(mx)); + return mx; + } + + %apply int *OUTPUT { int *dim0 }; + %apply int *OUTPUT { int *dim1 }; + void __spat_shape(int *dim0, int *dim1) { + *dim0 = $self->nphi; *dim1 = $self->nlat; + if ($self->fftc_mode == 1) { // phi-contiguous + *dim0 = $self->nlat; *dim1 = $self->nphi; + } + } + + %pythoncode %{ + def spec_array(self, im=-1): + """return a numpy array of spherical harmonic coefficients (complex). Adress coefficients with index sh.idx(l,m) + if optional argument im is given, the spectral array is restricted to order im*mres.""" + if im<0: + return np.zeros(self.nlm, dtype=complex) + else: + return np.zeros(self.lmax + 1 - im*self.mres, dtype=complex) + + def spat_array(self): + """return a numpy array of 2D spatial field.""" + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + return np.zeros(self.spat_shape) + %} + + // returns the index in a spectral array of (l,m) coefficient. + int idx(unsigned l, unsigned m) { + if (l > $self->lmax) { + throw_exception(SWIG_ValueError,1,"l invalid"); return 0; + } + if ( (m > l) || (m > $self->mmax * $self->mres) || (m % $self->mres != 0) ) { + throw_exception(SWIG_ValueError,2,"m invalid"); return 0; + } + return LM($self, l, m); + } + + /* scalar transforms */ + void spat_to_SH(PyObject *Vr, PyObject *Qlm) { + if (check_spatial(1,Vr, $self->nspat) && check_spectral(2,Qlm, $self->nlm)) + spat_to_SH($self, PyArray_Data(Vr), PyArray_Data(Qlm)); + } + void SH_to_spat(PyObject *Qlm, PyObject *Vr) { + if (check_spatial(2,Vr, $self->nspat) && check_spectral(1,Qlm, $self->nlm)) + SH_to_spat($self, PyArray_Data(Qlm), PyArray_Data(Vr)); + } + /* complex transforms */ + void spat_cplx_to_SH(PyObject *z, PyObject *alm) { + int n = $self->lmax + 1; + if (check_spectral(1,z, $self->nspat) && check_spectral(2,alm, n*n)) + spat_cplx_to_SH($self, PyArray_Data(z), PyArray_Data(alm)); + } + void SH_to_spat_cplx(PyObject *alm, PyObject *z) { + int n = $self->lmax + 1; + if (check_spectral(2,z, $self->nspat) && check_spectral(1,alm, n*n)) + SH_to_spat_cplx($self, PyArray_Data(alm), PyArray_Data(z)); + } + /*void SH_to_spat_grad(PyObject *alm, PyObject *gt, PyObject *gp) { + if (check_spatial(3,gp, $self->nspat) && check_spatial(2,gt, $self->nspat) && check_spectral(1,alm, $self->nlm)) + SH_to_spat_grad($self, PyArray_Data(alm), PyArray_Data(gt), PyArray_Data(gp)); + }*/ + /* 2D vectors */ + void spat_to_SHsphtor(PyObject *Vt, PyObject *Vp, PyObject *Slm, PyObject *Tlm) { + if (check_spatial(1,Vt, $self->nspat) && check_spatial(2,Vp, $self->nspat) && check_spectral(3,Slm, $self->nlm) && check_spectral(4,Tlm, $self->nlm)) + spat_to_SHsphtor($self, PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Slm), PyArray_Data(Tlm)); + } + void SHsphtor_to_spat(PyObject *Slm, PyObject *Tlm, PyObject *Vt, PyObject *Vp) { + if (check_spatial(3,Vt, $self->nspat) && check_spatial(4,Vp, $self->nspat) && check_spectral(1,Slm, $self->nlm) && check_spectral(2,Tlm, $self->nlm)) + SHsphtor_to_spat($self, PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp)); + } + void SHsph_to_spat(PyObject *Slm, PyObject *Vt, PyObject *Vp) { + if (check_spatial(2,Vt, $self->nspat) && check_spatial(3,Vp, $self->nspat) && check_spectral(1,Slm, $self->nlm)) + SHsph_to_spat($self, PyArray_Data(Slm), PyArray_Data(Vt), PyArray_Data(Vp)); + } + void SHtor_to_spat(PyObject *Tlm, PyObject *Vt, PyObject *Vp) { + if (check_spatial(2,Vt, $self->nspat) && check_spatial(3,Vp, $self->nspat) && check_spectral(1,Tlm, $self->nlm)) + SHtor_to_spat($self, PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp)); + } + /* complex-valued spatial 2D vectors */ + void spat_cplx_to_SHsphtor(PyObject *Vt, PyObject *Vp, PyObject *Slm, PyObject *Tlm) { + int n = $self->lmax + 1; + if (check_spectral(1,Vt, $self->nspat) && check_spectral(2,Vp, $self->nspat) && check_spectral(3,Slm, n*n) && check_spectral(4,Tlm, n*n)) + spat_cplx_to_SHsphtor($self, PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Slm), PyArray_Data(Tlm)); + } + void SHsphtor_to_spat_cplx(PyObject *Slm, PyObject *Tlm, PyObject *Vt, PyObject *Vp) { + int n = $self->lmax + 1; + if (check_spectral(3,Vt, $self->nspat) && check_spectral(4,Vp, $self->nspat) && check_spectral(1,Slm, n*n) && check_spectral(2,Tlm, n*n)) + SHsphtor_to_spat_cplx($self, PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp)); + } + /* 3D vectors */ + void spat_to_SHqst(PyObject *Vr, PyObject *Vt, PyObject *Vp, PyObject *Qlm, PyObject *Slm, PyObject *Tlm) { + if (check_spatial(1,Vr, $self->nspat) && check_spatial(2,Vt, $self->nspat) && check_spatial(3,Vp, $self->nspat) + && check_spectral(4,Qlm, $self->nlm) && check_spectral(5,Slm, $self->nlm) && check_spectral(6,Tlm, $self->nlm)) + spat_to_SHqst($self, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm)); + } + void SHqst_to_spat(PyObject *Qlm, PyObject *Slm, PyObject *Tlm, PyObject *Vr, PyObject *Vt, PyObject *Vp) { + if (check_spatial(4,Vr, $self->nspat) && check_spatial(5,Vt, $self->nspat) && check_spatial(6,Vp, $self->nspat) + && check_spectral(1,Qlm, $self->nlm) && check_spectral(2,Slm, $self->nlm) && check_spectral(3,Tlm, $self->nlm)) + SHqst_to_spat($self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp)); + } + /* complex-valued spatial 3D vectors */ + void spat_cplx_to_SHqst(PyObject *Vr, PyObject *Vt, PyObject *Vp, PyObject *Qlm, PyObject *Slm, PyObject *Tlm) { + int n = $self->lmax + 1; + if (check_spectral(1,Vr, $self->nspat) && check_spectral(2,Vt, $self->nspat) && check_spectral(3,Vp, $self->nspat) + && check_spectral(4,Qlm, n*n) && check_spectral(5,Slm, n*n) && check_spectral(6,Tlm, n*n)) + spat_cplx_to_SHqst($self, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm)); + } + void SHqst_to_spat_cplx(PyObject *Qlm, PyObject *Slm, PyObject *Tlm, PyObject *Vr, PyObject *Vt, PyObject *Vp) { + int n = $self->lmax + 1; + if (check_spatial(4,Vr, $self->nspat) && check_spatial(5,Vt, $self->nspat) && check_spatial(6,Vp, $self->nspat) + && check_spectral(1,Qlm, n*n) && check_spectral(2,Slm, n*n) && check_spectral(3,Tlm, n*n)) + SHqst_to_spat_cplx($self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp)); + } + + %pythoncode %{ + def synth(self,*arg): + """ + spectral to spatial transform, for scalar or vector data. + v = synth(qlm) : compute the spatial representation of the scalar qlm + vtheta,vphi = synth(slm,tlm) : compute the 2D spatial vector from its spectral spheroidal/toroidal scalars (slm,tlm) + vr,vtheta,vphi = synth(qlm,slm,tlm) : compute the 3D spatial vector from its spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + q = list(arg) + for i in range(0,n): + if q[i].size != self.nlm: raise RuntimeError("spectral array has wrong size.") + if q[i].dtype.num != np.dtype('complex128').num: raise RuntimeError("spectral array should be dtype=complex.") + if q[i].flags.contiguous == False: q[i] = q[i].copy() # contiguous array required. + if n==1: #scalar transform + vr = np.empty(self.spat_shape) + self.SH_to_spat(q[0],vr) + return vr + elif n==2: # 2D vector transform + vt = np.empty(self.spat_shape) # v_theta + vp = np.empty(self.spat_shape) # v_phi + self.SHsphtor_to_spat(q[0],q[1],vt,vp) + return vt,vp + else: # 3D vector transform + vr = np.empty(self.spat_shape) # v_r + vt = np.empty(self.spat_shape) # v_theta + vp = np.empty(self.spat_shape) # v_phi + self.SHqst_to_spat(q[0],q[1],q[2],vr,vt,vp) + return vr,vt,vp + + def analys(self,*arg): + """ + spatial to spectral transform, for scalar or vector data. + qlm = analys(q) : compute the spherical harmonic representation of the scalar q + slm,tlm = analys(vtheta,vphi) : compute the spectral spheroidal/toroidal scalars (slm,tlm) from 2D vector components (vtheta, vphi) + qlm,slm,tlm = synth(vr,vtheta,vphi) : compute the spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) from 3D vector components (vr,vtheta,vphi) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if abs(self.cos_theta[0]) == 1: raise RuntimeError("Analysis not allowed with sht_reg_poles grid.") + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + v = list(arg) + for i in range(0,n): + if v[i].shape != self.spat_shape: raise RuntimeError("spatial array has wrong shape.") + if v[i].dtype.num != np.dtype('float64').num: raise RuntimeError("spatial array should be dtype=float64.") + if v[i].flags.contiguous == False: v[i] = v[i].copy() # contiguous array required. + if n==1: + q = np.empty(self.nlm, dtype=complex) + self.spat_to_SH(v[0],q) + return q + elif n==2: + s = np.empty(self.nlm, dtype=complex) + t = np.empty(self.nlm, dtype=complex) + self.spat_to_SHsphtor(v[0],v[1],s,t) + return s,t + else: + q = np.empty(self.nlm, dtype=complex) + s = np.empty(self.nlm, dtype=complex) + t = np.empty(self.nlm, dtype=complex) + self.spat_to_SHqst(v[0],v[1],v[2],q,s,t) + return q,s,t + + def synth_grad(self,slm): + """(vtheta,vphi) = synth_grad(sht self, slm) : compute the spatial representation of the gradient of slm""" + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if slm.size != self.nlm: raise RuntimeError("spectral array has wrong size.") + if slm.dtype.num != np.dtype('complex128').num: raise RuntimeError("spectral array should be dtype=complex.") + if slm.flags.contiguous == False: slm = slm.copy() # contiguous array required. + vt = np.empty(self.spat_shape) + vp = np.empty(self.spat_shape) + self.SHsph_to_spat(slm,vt,vp) + return vt,vp + + def synth_cplx(self,*arg): + """ + spectral to spatial transform, for complex-valued scalar or vector data. + z = synth(zlm) : compute the complex-valued spatial representation of the scalar zlm + vtheta,vphi = synth(slm,tlm) : compute the complex-valued 2D spatial vector from its spectral spheroidal/toroidal scalars (slm,tlm) + vr,vtheta,vphi = synth(qlm,slm,tlm) : compute the complex-valued 3D spatial vector from its spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if self.lmax != self.mmax: raise RuntimeError("complex SH requires lmax=mmax and mres=1.") + + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + q = list(arg) + for i in range(0,n): + if q[i].size != (self.lmax+1)**2: raise RuntimeError("spectral array has wrong size.") + if q[i].dtype.num != np.dtype('complex128').num: raise RuntimeError("spectral array should be dtype=complex.") + if q[i].flags.contiguous == False: q[i] = q[i].copy() # contiguous array required. + if n==1: #scalar transform + z = np.empty(self.spat_shape, dtype=complex) + self.SH_to_spat_cplx(q[0],z) + return z + elif n==2: # 2D vector transform + zt = np.empty(self.spat_shape, dtype=complex) # v_theta + zp = np.empty(self.spat_shape, dtype=complex) # v_phi + self.SHsphtor_to_spat_cplx(q[0],q[1],zt,zp) + return zt,zp + else: # 3D vector transform + zr = np.empty(self.spat_shape, dtype=complex) # v_r + zt = np.empty(self.spat_shape, dtype=complex) # v_theta + zp = np.empty(self.spat_shape, dtype=complex) # v_phi + self.SHqst_to_spat(q[0],q[1],q[2],zr,zt,zp) + return vr,vt,vp + + def analys_cplx(self,*arg): + """ + spatial to spectral transform, for complex-valued scalar or vector data. + zlm = analys(z) : compute the spherical harmonic representation of the complex scalar z + slm,tlm = analys(vtheta,vphi) : compute the spectral spheroidal/toroidal scalars (slm,tlm) from complex-valued 2D vector components (vtheta, vphi) + qlm,slm,tlm = synth(vr,vtheta,vphi) : compute the spectral radial/spheroidal/toroidal scalars (qlm,slm,tlm) from complex-valued 3D vector components (vr,vtheta,vphi) + """ + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + if self.lmax != self.mmax: raise RuntimeError("complex SH requires lmax=mmax and mres=1.") + + n = len(arg) + if (n>3) or (n<1): raise RuntimeError("1,2 or 3 arguments required.") + v = list(arg) + for i in range(0,n): + if v[i].shape != self.spat_shape: raise RuntimeError("spatial array has wrong shape.") + if v[i].dtype.num != np.dtype('complex128').num: raise RuntimeError("spatial array should be dtype=complex128.") + if v[i].flags.contiguous == False: v[i] = v[i].copy() # contiguous array required. + if n==1: + q = np.empty((self.lmax+1)**2, dtype=complex) + self.spat_cplx_to_SH(v[0],q) + return q + elif n==2: + s = np.empty((self.lmax+1)**2, dtype=complex) + t = np.empty((self.lmax+1)**2, dtype=complex) + self.spat_cplx_to_SHsphtor(v[0],v[1],s,t) + return s,t + else: + q = np.empty((self.lmax+1)**2, dtype=complex) + s = np.empty((self.lmax+1)**2, dtype=complex) + t = np.empty((self.lmax+1)**2, dtype=complex) + self.spat_cplx_to_SHqst(v[0],v[1],v[2],q,s,t) + return q,s,t + + + def zidx(self, l,m): + """ + zidx(sht self, int l, int m) -> int : compute the index l*(l+1)+m in a complex spherical harmonic expansion + """ + l = np.asarray(l) + m = np.asarray(m) + if (l>self.lmax).any() or (abs(m)>l).any() : raise RuntimeError("invalid range for l,m") + return l*(l+1)+m + + def zlm(self, idx): + """ + zlm(sht self, int idx) -> (int,int) : returns the l and m corresponding to the given index in complex spherical harmonic expansion + """ + idx = np.asarray(idx) + if (idx >= (self.lmax+1)**2).any() or (idx < 0).any() : raise RuntimeError("invalid range for l,m") + l = np.sqrt(idx).astype(int) + m = idx - l*(l+1) + return l,m + + def spec_array_cplx(self): + """return a numpy array that can hold the spectral representation of a complex scalar spatial field.""" + return np.zeros((self.lmax+1)**2, dtype=complex) + + def spat_array_cplx(self): + """return a numpy array of 2D complex spatial field.""" + if self.nlat == 0: raise RuntimeError("Grid not set. Call .set_grid() mehtod.") + return np.zeros(self.spat_shape, dtype='complex128') + %} + + /* local evaluations */ + double SH_to_point(PyObject *Qlm, double cost, double phi) { + if (check_spectral(1,Qlm, $self->nlm)) return SH_to_point($self, PyArray_Data(Qlm), cost, phi); + return 0.0; + } + %apply double *OUTPUT { double *vr }; + %apply double *OUTPUT { double *vt }; + %apply double *OUTPUT { double *vp }; + void SH_to_grad_point(PyObject *DrSlm, PyObject *Slm, double cost, double phi, double *vr, double *vt, double *vp) { + if (check_spectral(1,DrSlm, $self->nlm) && check_spectral(2,Slm, $self->nlm)) + SH_to_grad_point($self, PyArray_Data(DrSlm), PyArray_Data(Slm), cost, phi, vr, vt, vp); + } + void SHqst_to_point(PyObject *Qlm, PyObject *Slm, PyObject *Tlm, + double cost, double phi, double *vr, double *vt, double *vp) { + if (check_spectral(1,Qlm, $self->nlm) && check_spectral(2,Slm, $self->nlm) && check_spectral(3,Tlm, $self->nlm)) + SHqst_to_point($self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), cost, phi, vr, vt, vp); + } + %clear double *vr; + %clear double *vt; + %clear double *vp; + + /* _to_lat */ + void SH_to_lat(PyObject *Qlm, double cost, PyObject *Vr) { + if (check_spatial(3,Vr, PyArray_SIZE((PyArrayObject *) Vr)) && check_spectral(1,Qlm, $self->nlm)) + SH_to_lat($self, PyArray_Data(Qlm), cost, PyArray_Data(Vr), PyArray_SIZE((PyArrayObject *) Vr), $self->lmax, $self->mmax); + } + void SHqst_to_lat(PyObject *Qlm, PyObject *Slm, PyObject *Tlm, double cost, PyObject *Vr, PyObject *Vt, PyObject *Vp) { + int nphi = PyArray_SIZE((PyArrayObject *) Vr); + if (check_spatial(5,Vr, nphi) && check_spatial(6,Vt, nphi) && check_spatial(7,Vp, nphi) + && check_spectral(1,Qlm, $self->nlm) && check_spectral(2,Slm, $self->nlm) && check_spectral(3,Tlm, $self->nlm)) + SHqst_to_lat($self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), cost, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), nphi, $self->lmax, $self->mmax); + } + + /* rotation of SH representations (experimental) */ + PyObject* Zrotate(PyObject *Qlm, double alpha) { + if (check_spectral(1,Qlm, $self->nlm)) { + PyObject *Rlm = SpecArray_New($self->nlm); + SH_Zrotate($self, PyArray_Data(Qlm), alpha, PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } + PyObject* Yrotate(PyObject *Qlm, double alpha) { + if (($self->mres != 1)||($self->mmax != $self->lmax)) { + throw_exception(SWIG_RuntimeError,0,msg_rot_err); return NULL; + } + if (check_spectral(1,Qlm, $self->nlm)) { + PyObject *Rlm = SpecArray_New($self->nlm); + SH_Yrotate($self, PyArray_Data(Qlm), alpha, PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } + PyObject* Yrotate90(PyObject *Qlm) { + if (($self->mres != 1)||($self->mmax != $self->lmax)) { + throw_exception(SWIG_RuntimeError,0,msg_rot_err); return NULL; + } + if (check_spectral(1,Qlm, $self->nlm)) { + PyObject *Rlm = SpecArray_New($self->nlm); + SH_Yrotate90($self, PyArray_Data(Qlm), PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } + PyObject* Xrotate90(PyObject *Qlm) { + if (($self->mres != 1)||($self->mmax != $self->lmax)) { + throw_exception(SWIG_RuntimeError,0,msg_rot_err); return NULL; + } + if (check_spectral(1,Qlm, $self->nlm)) { + PyObject *Rlm = SpecArray_New($self->nlm); + SH_Xrotate90($self, PyArray_Data(Qlm), PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } + + /* multiplication by l+1 l-1 matrix (mul_ct_matrix or st_dt_matrix) */ + PyObject* SH_mul_mx(PyObject *mx, PyObject *Qlm) { + if (check_spectral(2,Qlm, $self->nlm) && check_spatial(1, mx, 2* $self->nlm)) { + PyObject *Rlm = SpecArray_New($self->nlm); + SH_mul_mx($self, PyArray_Data(mx), PyArray_Data(Qlm), PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } + + /* Legendre transforms (no fft) at given order m */ + void spat_to_SH_m(PyObject *Vr, PyObject *Qlm, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; + if (check_spectral(1,Vr, $self->nlat) && check_spectral(2,Qlm, ltr+1 - abs(im_)*$self->mres)) + spat_to_SH_ml($self, im_, PyArray_Data(Vr), PyArray_Data(Qlm), ltr); + } + void SH_to_spat_m(PyObject *Qlm, PyObject *Vr, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; + if (check_spectral(2,Vr, $self->nlat) && check_spectral(1,Qlm, ltr+1 - abs(im_)*$self->mres)) + SH_to_spat_ml($self, im_, PyArray_Data(Qlm), PyArray_Data(Vr), ltr); + } + void spat_to_SHsphtor_m(PyObject *Vt, PyObject *Vp, PyObject *Slm, PyObject *Tlm, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; int nelem = ltr+1 - abs(im_)*$self->mres; + if (check_spectral(1,Vt, $self->nlat) && check_spectral(2,Vp, $self->nlat) && check_spectral(3,Slm, nelem) && check_spectral(4,Tlm, nelem)) + spat_to_SHsphtor_ml($self, im_, PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Slm), PyArray_Data(Tlm), ltr); + } + void SHsphtor_to_spat_m(PyObject *Slm, PyObject *Tlm, PyObject *Vt, PyObject *Vp, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; int nelem = ltr+1 - abs(im_)*$self->mres; + if (check_spectral(3,Vt, $self->nlat) && check_spectral(4,Vp, $self->nlat) && check_spectral(1,Slm, nelem) && check_spectral(2,Tlm, nelem)) + SHsphtor_to_spat_ml($self, im_, PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } + void SHsph_to_spat_m(PyObject *Slm, PyObject *Vt, PyObject *Vp, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; int nelem = ltr+1 - abs(im_)*$self->mres; + if (check_spectral(2,Vt, $self->nlat) && check_spectral(3,Vp, $self->nlat) && check_spectral(1,Slm, nelem)) + SHsph_to_spat_ml($self, im_, PyArray_Data(Slm), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } + void SHtor_to_spat_m(PyObject *Tlm, PyObject *Vt, PyObject *Vp, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; int nelem = ltr+1 - abs(im_)*$self->mres; + if (check_spectral(2,Vt, $self->nlat) && check_spectral(3,Vp, $self->nlat) && check_spectral(1,Tlm, nelem)) + SHtor_to_spat_ml($self, im_, PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } + void spat_to_SHqst_m(PyObject *Vr, PyObject *Vt, PyObject *Vp, PyObject *Qlm, PyObject *Slm, PyObject *Tlm, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; int nelem = ltr+1 - abs(im_)*$self->mres; + if (check_spectral(1,Vr, $self->nlat) && check_spectral(2,Vt, $self->nlat) && check_spectral(3,Vp, $self->nlat) + && check_spectral(4,Qlm, nelem) && check_spectral(5,Slm, nelem) && check_spectral(6,Tlm, nelem)) + spat_to_SHqst_ml($self, im_, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), ltr); + } + void SHqst_to_spat_m(PyObject *Qlm, PyObject *Slm, PyObject *Tlm, PyObject *Vr, PyObject *Vt, PyObject *Vp, PyObject *im) { + int im_ = PyLong_AsLong(im); int ltr = $self->lmax; int nelem = ltr+1 - abs(im_)*$self->mres; + if (check_spectral(4,Vr, $self->nlat) && check_spectral(5,Vt, $self->nlat) && check_spectral(6,Vp, $self->nlat) + && check_spectral(1,Qlm, nelem) && check_spectral(2,Slm, nelem) && check_spectral(3,Tlm, nelem)) + SHqst_to_spat_ml($self, im_, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } + +}; diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_numpy_wrap.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_numpy_wrap.c new file mode 100644 index 000000000..2acbfceed --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/shtns_numpy_wrap.c @@ -0,0 +1,6748 @@ +/* ---------------------------------------------------------------------------- + * This file was automatically generated by SWIG (http://www.swig.org). + * Version 3.0.12 + * + * This file is not intended to be easily readable and contains a number of + * coding conventions designed to improve portability and efficiency. Do not make + * changes to this file unless you know what you are doing--modify the SWIG + * interface file instead. + * ----------------------------------------------------------------------------- */ + + +#ifndef SWIGPYTHON +#define SWIGPYTHON +#endif + +#define SWIG_PYTHON_DIRECTOR_NO_VTABLE + +/* ----------------------------------------------------------------------------- + * This section contains generic SWIG labels for method/variable + * declarations/attributes, and other compiler dependent labels. + * ----------------------------------------------------------------------------- */ + +/* template workaround for compilers that cannot correctly implement the C++ standard */ +#ifndef SWIGTEMPLATEDISAMBIGUATOR +# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) +# define SWIGTEMPLATEDISAMBIGUATOR template +# elif defined(__HP_aCC) +/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ +/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ +# define SWIGTEMPLATEDISAMBIGUATOR template +# else +# define SWIGTEMPLATEDISAMBIGUATOR +# endif +#endif + +/* inline attribute */ +#ifndef SWIGINLINE +# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) +# define SWIGINLINE inline +# else +# define SWIGINLINE +# endif +#endif + +/* attribute recognised by some compilers to avoid 'unused' warnings */ +#ifndef SWIGUNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +# elif defined(__ICC) +# define SWIGUNUSED __attribute__ ((__unused__)) +# else +# define SWIGUNUSED +# endif +#endif + +#ifndef SWIG_MSC_UNSUPPRESS_4505 +# if defined(_MSC_VER) +# pragma warning(disable : 4505) /* unreferenced local function has been removed */ +# endif +#endif + +#ifndef SWIGUNUSEDPARM +# ifdef __cplusplus +# define SWIGUNUSEDPARM(p) +# else +# define SWIGUNUSEDPARM(p) p SWIGUNUSED +# endif +#endif + +/* internal SWIG method */ +#ifndef SWIGINTERN +# define SWIGINTERN static SWIGUNUSED +#endif + +/* internal inline SWIG method */ +#ifndef SWIGINTERNINLINE +# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE +#endif + +/* exporting methods */ +#if defined(__GNUC__) +# if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# ifndef GCC_HASCLASSVISIBILITY +# define GCC_HASCLASSVISIBILITY +# endif +# endif +#endif + +#ifndef SWIGEXPORT +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# if defined(STATIC_LINKED) +# define SWIGEXPORT +# else +# define SWIGEXPORT __declspec(dllexport) +# endif +# else +# if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) +# define SWIGEXPORT __attribute__ ((visibility("default"))) +# else +# define SWIGEXPORT +# endif +# endif +#endif + +/* calling conventions for Windows */ +#ifndef SWIGSTDCALL +# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# define SWIGSTDCALL __stdcall +# else +# define SWIGSTDCALL +# endif +#endif + +/* Deal with Microsoft's attempt at deprecating C standard runtime functions */ +#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ +#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) +# define _SCL_SECURE_NO_DEPRECATE +#endif + +/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ +#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) +# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 +#endif + +/* Intel's compiler complains if a variable which was never initialised is + * cast to void, which is a common idiom which we use to indicate that we + * are aware a variable isn't used. So we just silence that warning. + * See: https://github.com/swig/swig/issues/192 for more discussion. + */ +#ifdef __INTEL_COMPILER +# pragma warning disable 592 +#endif + + +#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) +/* Use debug wrappers with the Python release dll */ +# undef _DEBUG +# include +# define _DEBUG +#else +# include +#endif + +/* ----------------------------------------------------------------------------- + * swigrun.swg + * + * This file contains generic C API SWIG runtime support for pointer + * type checking. + * ----------------------------------------------------------------------------- */ + +/* This should only be incremented when either the layout of swig_type_info changes, + or for whatever reason, the runtime changes incompatibly */ +#define SWIG_RUNTIME_VERSION "4" + +/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ +#ifdef SWIG_TYPE_TABLE +# define SWIG_QUOTE_STRING(x) #x +# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) +# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) +#else +# define SWIG_TYPE_TABLE_NAME +#endif + +/* + You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for + creating a static or dynamic library from the SWIG runtime code. + In 99.9% of the cases, SWIG just needs to declare them as 'static'. + + But only do this if strictly necessary, ie, if you have problems + with your compiler or suchlike. +*/ + +#ifndef SWIGRUNTIME +# define SWIGRUNTIME SWIGINTERN +#endif + +#ifndef SWIGRUNTIMEINLINE +# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE +#endif + +/* Generic buffer size */ +#ifndef SWIG_BUFFER_SIZE +# define SWIG_BUFFER_SIZE 1024 +#endif + +/* Flags for pointer conversions */ +#define SWIG_POINTER_DISOWN 0x1 +#define SWIG_CAST_NEW_MEMORY 0x2 + +/* Flags for new pointer objects */ +#define SWIG_POINTER_OWN 0x1 + + +/* + Flags/methods for returning states. + + The SWIG conversion methods, as ConvertPtr, return an integer + that tells if the conversion was successful or not. And if not, + an error code can be returned (see swigerrors.swg for the codes). + + Use the following macros/flags to set or process the returning + states. + + In old versions of SWIG, code such as the following was usually written: + + if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { + // success code + } else { + //fail code + } + + Now you can be more explicit: + + int res = SWIG_ConvertPtr(obj,vptr,ty.flags); + if (SWIG_IsOK(res)) { + // success code + } else { + // fail code + } + + which is the same really, but now you can also do + + Type *ptr; + int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); + if (SWIG_IsOK(res)) { + // success code + if (SWIG_IsNewObj(res) { + ... + delete *ptr; + } else { + ... + } + } else { + // fail code + } + + I.e., now SWIG_ConvertPtr can return new objects and you can + identify the case and take care of the deallocation. Of course that + also requires SWIG_ConvertPtr to return new result values, such as + + int SWIG_ConvertPtr(obj, ptr,...) { + if () { + if () { + *ptr = ; + return SWIG_NEWOBJ; + } else { + *ptr = ; + return SWIG_OLDOBJ; + } + } else { + return SWIG_BADOBJ; + } + } + + Of course, returning the plain '0(success)/-1(fail)' still works, but you can be + more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the + SWIG errors code. + + Finally, if the SWIG_CASTRANK_MODE is enabled, the result code + allows to return the 'cast rank', for example, if you have this + + int food(double) + int fooi(int); + + and you call + + food(1) // cast rank '1' (1 -> 1.0) + fooi(1) // cast rank '0' + + just use the SWIG_AddCast()/SWIG_CheckState() +*/ + +#define SWIG_OK (0) +#define SWIG_ERROR (-1) +#define SWIG_IsOK(r) (r >= 0) +#define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) + +/* The CastRankLimit says how many bits are used for the cast rank */ +#define SWIG_CASTRANKLIMIT (1 << 8) +/* The NewMask denotes the object was created (using new/malloc) */ +#define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) +/* The TmpMask is for in/out typemaps that use temporal objects */ +#define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) +/* Simple returning values */ +#define SWIG_BADOBJ (SWIG_ERROR) +#define SWIG_OLDOBJ (SWIG_OK) +#define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) +#define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) +/* Check, add and del mask methods */ +#define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) +#define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) +#define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) +#define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) +#define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) +#define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) + +/* Cast-Rank Mode */ +#if defined(SWIG_CASTRANK_MODE) +# ifndef SWIG_TypeRank +# define SWIG_TypeRank unsigned long +# endif +# ifndef SWIG_MAXCASTRANK /* Default cast allowed */ +# define SWIG_MAXCASTRANK (2) +# endif +# define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) +# define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) +SWIGINTERNINLINE int SWIG_AddCast(int r) { + return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; +} +SWIGINTERNINLINE int SWIG_CheckState(int r) { + return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; +} +#else /* no cast-rank mode */ +# define SWIG_AddCast(r) (r) +# define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) +#endif + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void *(*swig_converter_func)(void *, int *); +typedef struct swig_type_info *(*swig_dycast_func)(void **); + +/* Structure to store information on one type */ +typedef struct swig_type_info { + const char *name; /* mangled name of this type */ + const char *str; /* human readable name of this type */ + swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ + struct swig_cast_info *cast; /* linked list of types that can cast into this type */ + void *clientdata; /* language specific type data */ + int owndata; /* flag if the structure owns the clientdata */ +} swig_type_info; + +/* Structure to store a type and conversion function used for casting */ +typedef struct swig_cast_info { + swig_type_info *type; /* pointer to type that is equivalent to this type */ + swig_converter_func converter; /* function to cast the void pointers */ + struct swig_cast_info *next; /* pointer to next cast in linked list */ + struct swig_cast_info *prev; /* pointer to the previous cast */ +} swig_cast_info; + +/* Structure used to store module information + * Each module generates one structure like this, and the runtime collects + * all of these structures and stores them in a circularly linked list.*/ +typedef struct swig_module_info { + swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ + size_t size; /* Number of types in this module */ + struct swig_module_info *next; /* Pointer to next element in circularly linked list */ + swig_type_info **type_initial; /* Array of initially generated type structures */ + swig_cast_info **cast_initial; /* Array of initially generated casting structures */ + void *clientdata; /* Language specific module data */ +} swig_module_info; + +/* + Compare two type names skipping the space characters, therefore + "char*" == "char *" and "Class" == "Class", etc. + + Return 0 when the two name types are equivalent, as in + strncmp, but skipping ' '. +*/ +SWIGRUNTIME int +SWIG_TypeNameComp(const char *f1, const char *l1, + const char *f2, const char *l2) { + for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { + while ((*f1 == ' ') && (f1 != l1)) ++f1; + while ((*f2 == ' ') && (f2 != l2)) ++f2; + if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; + } + return (int)((l1 - f1) - (l2 - f2)); +} + +/* + Check type equivalence in a name list like ||... + Return 0 if equal, -1 if nb < tb, 1 if nb > tb +*/ +SWIGRUNTIME int +SWIG_TypeCmp(const char *nb, const char *tb) { + int equiv = 1; + const char* te = tb + strlen(tb); + const char* ne = nb; + while (equiv != 0 && *ne) { + for (nb = ne; *ne; ++ne) { + if (*ne == '|') break; + } + equiv = SWIG_TypeNameComp(nb, ne, tb, te); + if (*ne) ++ne; + } + return equiv; +} + +/* + Check type equivalence in a name list like ||... + Return 0 if not equal, 1 if equal +*/ +SWIGRUNTIME int +SWIG_TypeEquiv(const char *nb, const char *tb) { + return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; +} + +/* + Check the typename +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheck(const char *c, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (strcmp(iter->type->name, c) == 0) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison +*/ +SWIGRUNTIME swig_cast_info * +SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { + if (ty) { + swig_cast_info *iter = ty->cast; + while (iter) { + if (iter->type == from) { + if (iter == ty->cast) + return iter; + /* Move iter to the top of the linked list */ + iter->prev->next = iter->next; + if (iter->next) + iter->next->prev = iter->prev; + iter->next = ty->cast; + iter->prev = 0; + if (ty->cast) ty->cast->prev = iter; + ty->cast = iter; + return iter; + } + iter = iter->next; + } + } + return 0; +} + +/* + Cast a pointer up an inheritance hierarchy +*/ +SWIGRUNTIMEINLINE void * +SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { + return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); +} + +/* + Dynamic pointer casting. Down an inheritance hierarchy +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { + swig_type_info *lastty = ty; + if (!ty || !ty->dcast) return ty; + while (ty && (ty->dcast)) { + ty = (*ty->dcast)(ptr); + if (ty) lastty = ty; + } + return lastty; +} + +/* + Return the name associated with this type +*/ +SWIGRUNTIMEINLINE const char * +SWIG_TypeName(const swig_type_info *ty) { + return ty->name; +} + +/* + Return the pretty name associated with this type, + that is an unmangled type name in a form presentable to the user. +*/ +SWIGRUNTIME const char * +SWIG_TypePrettyName(const swig_type_info *type) { + /* The "str" field contains the equivalent pretty names of the + type, separated by vertical-bar characters. We choose + to print the last name, as it is often (?) the most + specific. */ + if (!type) return NULL; + if (type->str != NULL) { + const char *last_name = type->str; + const char *s; + for (s = type->str; *s; s++) + if (*s == '|') last_name = s+1; + return last_name; + } + else + return type->name; +} + +/* + Set the clientdata field for a type +*/ +SWIGRUNTIME void +SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { + swig_cast_info *cast = ti->cast; + /* if (ti->clientdata == clientdata) return; */ + ti->clientdata = clientdata; + + while (cast) { + if (!cast->converter) { + swig_type_info *tc = cast->type; + if (!tc->clientdata) { + SWIG_TypeClientData(tc, clientdata); + } + } + cast = cast->next; + } +} +SWIGRUNTIME void +SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { + SWIG_TypeClientData(ti, clientdata); + ti->owndata = 1; +} + +/* + Search for a swig_type_info structure only by mangled name + Search is a O(log #types) + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_MangledTypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + swig_module_info *iter = start; + do { + if (iter->size) { + size_t l = 0; + size_t r = iter->size - 1; + do { + /* since l+r >= 0, we can (>> 1) instead (/ 2) */ + size_t i = (l + r) >> 1; + const char *iname = iter->types[i]->name; + if (iname) { + int compare = strcmp(name, iname); + if (compare == 0) { + return iter->types[i]; + } else if (compare < 0) { + if (i) { + r = i - 1; + } else { + break; + } + } else if (compare > 0) { + l = i + 1; + } + } else { + break; /* should never happen */ + } + } while (l <= r); + } + iter = iter->next; + } while (iter != end); + return 0; +} + +/* + Search for a swig_type_info structure for either a mangled name or a human readable name. + It first searches the mangled names of the types, which is a O(log #types) + If a type is not found it then searches the human readable names, which is O(#types). + + We start searching at module start, and finish searching when start == end. + Note: if start == end at the beginning of the function, we go all the way around + the circular list. +*/ +SWIGRUNTIME swig_type_info * +SWIG_TypeQueryModule(swig_module_info *start, + swig_module_info *end, + const char *name) { + /* STEP 1: Search the name field using binary search */ + swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); + if (ret) { + return ret; + } else { + /* STEP 2: If the type hasn't been found, do a complete search + of the str field (the human readable name) */ + swig_module_info *iter = start; + do { + size_t i = 0; + for (; i < iter->size; ++i) { + if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) + return iter->types[i]; + } + iter = iter->next; + } while (iter != end); + } + + /* neither found a match */ + return 0; +} + +/* + Pack binary data into a string +*/ +SWIGRUNTIME char * +SWIG_PackData(char *c, void *ptr, size_t sz) { + static const char hex[17] = "0123456789abcdef"; + const unsigned char *u = (unsigned char *) ptr; + const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + unsigned char uu = *u; + *(c++) = hex[(uu & 0xf0) >> 4]; + *(c++) = hex[uu & 0xf]; + } + return c; +} + +/* + Unpack binary data from a string +*/ +SWIGRUNTIME const char * +SWIG_UnpackData(const char *c, void *ptr, size_t sz) { + unsigned char *u = (unsigned char *) ptr; + const unsigned char *eu = u + sz; + for (; u != eu; ++u) { + char d = *(c++); + unsigned char uu; + if ((d >= '0') && (d <= '9')) + uu = (unsigned char)((d - '0') << 4); + else if ((d >= 'a') && (d <= 'f')) + uu = (unsigned char)((d - ('a'-10)) << 4); + else + return (char *) 0; + d = *(c++); + if ((d >= '0') && (d <= '9')) + uu |= (unsigned char)(d - '0'); + else if ((d >= 'a') && (d <= 'f')) + uu |= (unsigned char)(d - ('a'-10)); + else + return (char *) 0; + *u = uu; + } + return c; +} + +/* + Pack 'void *' into a string buffer. +*/ +SWIGRUNTIME char * +SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { + char *r = buff; + if ((2*sizeof(void *) + 2) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,&ptr,sizeof(void *)); + if (strlen(name) + 1 > (bsz - (r - buff))) return 0; + strcpy(r,name); + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + *ptr = (void *) 0; + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sizeof(void *)); +} + +SWIGRUNTIME char * +SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { + char *r = buff; + size_t lname = (name ? strlen(name) : 0); + if ((2*sz + 2 + lname) > bsz) return 0; + *(r++) = '_'; + r = SWIG_PackData(r,ptr,sz); + if (lname) { + strncpy(r,name,lname+1); + } else { + *r = 0; + } + return buff; +} + +SWIGRUNTIME const char * +SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { + if (*c != '_') { + if (strcmp(c,"NULL") == 0) { + memset(ptr,0,sz); + return name; + } else { + return 0; + } + } + return SWIG_UnpackData(++c,ptr,sz); +} + +#ifdef __cplusplus +} +#endif + +/* Errors in SWIG */ +#define SWIG_UnknownError -1 +#define SWIG_IOError -2 +#define SWIG_RuntimeError -3 +#define SWIG_IndexError -4 +#define SWIG_TypeError -5 +#define SWIG_DivisionByZero -6 +#define SWIG_OverflowError -7 +#define SWIG_SyntaxError -8 +#define SWIG_ValueError -9 +#define SWIG_SystemError -10 +#define SWIG_AttributeError -11 +#define SWIG_MemoryError -12 +#define SWIG_NullReferenceError -13 + + + +/* Compatibility macros for Python 3 */ +#if PY_VERSION_HEX >= 0x03000000 + +#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) +#define PyInt_Check(x) PyLong_Check(x) +#define PyInt_AsLong(x) PyLong_AsLong(x) +#define PyInt_FromLong(x) PyLong_FromLong(x) +#define PyInt_FromSize_t(x) PyLong_FromSize_t(x) +#define PyString_Check(name) PyBytes_Check(name) +#define PyString_FromString(x) PyUnicode_FromString(x) +#define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) +#define PyString_AsString(str) PyBytes_AsString(str) +#define PyString_Size(str) PyBytes_Size(str) +#define PyString_InternFromString(key) PyUnicode_InternFromString(key) +#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE +#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) +#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) + +#endif + +#ifndef Py_TYPE +# define Py_TYPE(op) ((op)->ob_type) +#endif + +/* SWIG APIs for compatibility of both Python 2 & 3 */ + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_FromFormat PyUnicode_FromFormat +#else +# define SWIG_Python_str_FromFormat PyString_FromFormat +#endif + + +/* Warning: This function will allocate a new string in Python 3, + * so please call SWIG_Python_str_DelForPy3(x) to free the space. + */ +SWIGINTERN char* +SWIG_Python_str_AsChar(PyObject *str) +{ +#if PY_VERSION_HEX >= 0x03000000 + char *cstr; + char *newstr; + Py_ssize_t len; + str = PyUnicode_AsUTF8String(str); + PyBytes_AsStringAndSize(str, &cstr, &len); + newstr = (char *) malloc(len+1); + memcpy(newstr, cstr, len+1); + Py_XDECREF(str); + return newstr; +#else + return PyString_AsString(str); +#endif +} + +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) +#else +# define SWIG_Python_str_DelForPy3(x) +#endif + + +SWIGINTERN PyObject* +SWIG_Python_str_FromChar(const char *c) +{ +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_FromString(c); +#else + return PyString_FromString(c); +#endif +} + +/* Add PyOS_snprintf for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# define PyOS_snprintf _snprintf +# else +# define PyOS_snprintf snprintf +# endif +#endif + +/* A crude PyString_FromFormat implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 + +#ifndef SWIG_PYBUFFER_SIZE +# define SWIG_PYBUFFER_SIZE 1024 +#endif + +static PyObject * +PyString_FromFormat(const char *fmt, ...) { + va_list ap; + char buf[SWIG_PYBUFFER_SIZE * 2]; + int res; + va_start(ap, fmt); + res = vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); +} +#endif + +#ifndef PyObject_DEL +# define PyObject_DEL PyObject_Del +#endif + +/* A crude PyExc_StopIteration exception for old Pythons */ +#if PY_VERSION_HEX < 0x02020000 +# ifndef PyExc_StopIteration +# define PyExc_StopIteration PyExc_RuntimeError +# endif +# ifndef PyObject_GenericGetAttr +# define PyObject_GenericGetAttr 0 +# endif +#endif + +/* Py_NotImplemented is defined in 2.1 and up. */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef Py_NotImplemented +# define Py_NotImplemented PyExc_RuntimeError +# endif +#endif + +/* A crude PyString_AsStringAndSize implementation for old Pythons */ +#if PY_VERSION_HEX < 0x02010000 +# ifndef PyString_AsStringAndSize +# define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} +# endif +#endif + +/* PySequence_Size for old Pythons */ +#if PY_VERSION_HEX < 0x02000000 +# ifndef PySequence_Size +# define PySequence_Size PySequence_Length +# endif +#endif + +/* PyBool_FromLong for old Pythons */ +#if PY_VERSION_HEX < 0x02030000 +static +PyObject *PyBool_FromLong(long ok) +{ + PyObject *result = ok ? Py_True : Py_False; + Py_INCREF(result); + return result; +} +#endif + +/* Py_ssize_t for old Pythons */ +/* This code is as recommended by: */ +/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +# define PY_SSIZE_T_MAX INT_MAX +# define PY_SSIZE_T_MIN INT_MIN +typedef inquiry lenfunc; +typedef intargfunc ssizeargfunc; +typedef intintargfunc ssizessizeargfunc; +typedef intobjargproc ssizeobjargproc; +typedef intintobjargproc ssizessizeobjargproc; +typedef getreadbufferproc readbufferproc; +typedef getwritebufferproc writebufferproc; +typedef getsegcountproc segcountproc; +typedef getcharbufferproc charbufferproc; +static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) +{ + long result = 0; + PyObject *i = PyNumber_Int(x); + if (i) { + result = PyInt_AsLong(i); + Py_DECREF(i); + } + return result; +} +#endif + +#if PY_VERSION_HEX < 0x02050000 +#define PyInt_FromSize_t(x) PyInt_FromLong((long)x) +#endif + +#if PY_VERSION_HEX < 0x02040000 +#define Py_VISIT(op) \ + do { \ + if (op) { \ + int vret = visit((op), arg); \ + if (vret) \ + return vret; \ + } \ + } while (0) +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef struct { + PyTypeObject type; + PyNumberMethods as_number; + PyMappingMethods as_mapping; + PySequenceMethods as_sequence; + PyBufferProcs as_buffer; + PyObject *name, *slots; +} PyHeapTypeObject; +#endif + +#if PY_VERSION_HEX < 0x02030000 +typedef destructor freefunc; +#endif + +#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ + (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ + (PY_MAJOR_VERSION > 3)) +# define SWIGPY_USE_CAPSULE +# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) +#endif + +#if PY_VERSION_HEX < 0x03020000 +#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) +#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) +#define Py_hash_t long +#endif + +/* ----------------------------------------------------------------------------- + * error manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIME PyObject* +SWIG_Python_ErrorType(int code) { + PyObject* type = 0; + switch(code) { + case SWIG_MemoryError: + type = PyExc_MemoryError; + break; + case SWIG_IOError: + type = PyExc_IOError; + break; + case SWIG_RuntimeError: + type = PyExc_RuntimeError; + break; + case SWIG_IndexError: + type = PyExc_IndexError; + break; + case SWIG_TypeError: + type = PyExc_TypeError; + break; + case SWIG_DivisionByZero: + type = PyExc_ZeroDivisionError; + break; + case SWIG_OverflowError: + type = PyExc_OverflowError; + break; + case SWIG_SyntaxError: + type = PyExc_SyntaxError; + break; + case SWIG_ValueError: + type = PyExc_ValueError; + break; + case SWIG_SystemError: + type = PyExc_SystemError; + break; + case SWIG_AttributeError: + type = PyExc_AttributeError; + break; + default: + type = PyExc_RuntimeError; + } + return type; +} + + +SWIGRUNTIME void +SWIG_Python_AddErrorMsg(const char* mesg) +{ + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + + if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + PyErr_Clear(); + Py_XINCREF(type); + + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + Py_DECREF(value); + } else { + PyErr_SetString(PyExc_RuntimeError, mesg); + } +} + +#if defined(SWIG_PYTHON_NO_THREADS) +# if defined(SWIG_PYTHON_THREADS) +# undef SWIG_PYTHON_THREADS +# endif +#endif +#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ +# if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) +# if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ +# define SWIG_PYTHON_USE_GIL +# endif +# endif +# if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ +# ifndef SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() +# endif +# ifdef __cplusplus /* C++ code */ + class SWIG_Python_Thread_Block { + bool status; + PyGILState_STATE state; + public: + void end() { if (status) { PyGILState_Release(state); status = false;} } + SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} + ~SWIG_Python_Thread_Block() { end(); } + }; + class SWIG_Python_Thread_Allow { + bool status; + PyThreadState *save; + public: + void end() { if (status) { PyEval_RestoreThread(save); status = false; }} + SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} + ~SWIG_Python_Thread_Allow() { end(); } + }; +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block +# define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow +# define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() +# else /* C code */ +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() +# define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() +# define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) +# endif +# else /* Old thread way, not implemented, user must provide it */ +# if !defined(SWIG_PYTHON_INITIALIZE_THREADS) +# define SWIG_PYTHON_INITIALIZE_THREADS +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_END_BLOCK) +# define SWIG_PYTHON_THREAD_END_BLOCK +# endif +# if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# endif +# if !defined(SWIG_PYTHON_THREAD_END_ALLOW) +# define SWIG_PYTHON_THREAD_END_ALLOW +# endif +# endif +#else /* No thread support */ +# define SWIG_PYTHON_INITIALIZE_THREADS +# define SWIG_PYTHON_THREAD_BEGIN_BLOCK +# define SWIG_PYTHON_THREAD_END_BLOCK +# define SWIG_PYTHON_THREAD_BEGIN_ALLOW +# define SWIG_PYTHON_THREAD_END_ALLOW +#endif + +/* ----------------------------------------------------------------------------- + * Python API portion that goes into the runtime + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------------------------------------------------------- + * Constant declarations + * ----------------------------------------------------------------------------- */ + +/* Constant Types */ +#define SWIG_PY_POINTER 4 +#define SWIG_PY_BINARY 5 + +/* Constant information structure */ +typedef struct swig_const_info { + int type; + char *name; + long lvalue; + double dvalue; + void *pvalue; + swig_type_info **ptype; +} swig_const_info; + + +/* ----------------------------------------------------------------------------- + * Wrapper of PyInstanceMethod_New() used in Python 3 + * It is exported to the generated module, used for -fastproxy + * ----------------------------------------------------------------------------- */ +#if PY_VERSION_HEX >= 0x03000000 +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) +{ + return PyInstanceMethod_New(func); +} +#else +SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) +{ + return NULL; +} +#endif + +#ifdef __cplusplus +} +#endif + + +/* ----------------------------------------------------------------------------- + * pyrun.swg + * + * This file contains the runtime support for Python modules + * and includes code for managing global variables and pointer + * type checking. + * + * ----------------------------------------------------------------------------- */ + +/* Common SWIG API */ + +/* for raw pointers */ +#define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) +#define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) +#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) + +#ifdef SWIGPYTHON_BUILTIN +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) +#else +#define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) +#endif + +#define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) + +#define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) +#define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) +#define swig_owntype int + +/* for raw packed data */ +#define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + +/* for class or struct pointers */ +#define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) +#define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) + +/* for C or C++ function pointers */ +#define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) +#define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) + +/* for C++ member pointers, ie, member methods */ +#define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) +#define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) + + +/* Runtime API */ + +#define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) +#define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) +#define SWIG_NewClientData(obj) SwigPyClientData_New(obj) + +#define SWIG_SetErrorObj SWIG_Python_SetErrorObj +#define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg +#define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) +#define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) +#define SWIG_fail goto fail + + +/* Runtime API implementation */ + +/* Error manipulation */ + +SWIGINTERN void +SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetObject(errtype, obj); + Py_DECREF(obj); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +SWIGINTERN void +SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { + SWIG_PYTHON_THREAD_BEGIN_BLOCK; + PyErr_SetString(errtype, msg); + SWIG_PYTHON_THREAD_END_BLOCK; +} + +#define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) + +/* Set a constant value */ + +#if defined(SWIGPYTHON_BUILTIN) + +SWIGINTERN void +SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { + PyObject *s = PyString_InternFromString(key); + PyList_Append(seq, s); + Py_DECREF(s); +} + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { +#if PY_VERSION_HEX < 0x02030000 + PyDict_SetItemString(d, (char *)name, obj); +#else + PyDict_SetItemString(d, name, obj); +#endif + Py_DECREF(obj); + if (public_interface) + SwigPyBuiltin_AddPublicSymbol(public_interface, name); +} + +#else + +SWIGINTERN void +SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { +#if PY_VERSION_HEX < 0x02030000 + PyDict_SetItemString(d, (char *)name, obj); +#else + PyDict_SetItemString(d, name, obj); +#endif + Py_DECREF(obj); +} + +#endif + +/* Append a value to the result obj */ + +SWIGINTERN PyObject* +SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { +#if !defined(SWIG_PYTHON_OUTPUT_TUPLE) + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyList_Check(result)) { + PyObject *o2 = result; + result = PyList_New(1); + PyList_SetItem(result, 0, o2); + } + PyList_Append(result,obj); + Py_DECREF(obj); + } + return result; +#else + PyObject* o2; + PyObject* o3; + if (!result) { + result = obj; + } else if (result == Py_None) { + Py_DECREF(result); + result = obj; + } else { + if (!PyTuple_Check(result)) { + o2 = result; + result = PyTuple_New(1); + PyTuple_SET_ITEM(result, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SET_ITEM(o3, 0, obj); + o2 = result; + result = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return result; +#endif +} + +/* Unpack the argument tuple */ + +SWIGINTERN Py_ssize_t +SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) +{ + if (!args) { + if (!min && !max) { + return 1; + } else { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", + name, (min == max ? "" : "at least "), (int)min); + return 0; + } + } + if (!PyTuple_Check(args)) { + if (min <= 1 && max >= 1) { + Py_ssize_t i; + objs[0] = args; + for (i = 1; i < max; ++i) { + objs[i] = 0; + } + return 2; + } + PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); + return 0; + } else { + Py_ssize_t l = PyTuple_GET_SIZE(args); + if (l < min) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at least "), (int)min, (int)l); + return 0; + } else if (l > max) { + PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", + name, (min == max ? "" : "at most "), (int)max, (int)l); + return 0; + } else { + Py_ssize_t i; + for (i = 0; i < l; ++i) { + objs[i] = PyTuple_GET_ITEM(args, i); + } + for (; l < max; ++l) { + objs[l] = 0; + } + return i + 1; + } + } +} + +/* A functor is a function object with one single object argument */ +#if PY_VERSION_HEX >= 0x02020000 +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); +#else +#define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); +#endif + +/* + Helper for static pointer initialization for both C and C++ code, for example + static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); +*/ +#ifdef __cplusplus +#define SWIG_STATIC_POINTER(var) var +#else +#define SWIG_STATIC_POINTER(var) var = 0; if (!var) var +#endif + +/* ----------------------------------------------------------------------------- + * Pointer declarations + * ----------------------------------------------------------------------------- */ + +/* Flags for new pointer objects */ +#define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) +#define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) + +#define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) + +#define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) +#define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) + +#ifdef __cplusplus +extern "C" { +#endif + +/* How to access Py_None */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +# ifndef SWIG_PYTHON_NO_BUILD_NONE +# ifndef SWIG_PYTHON_BUILD_NONE +# define SWIG_PYTHON_BUILD_NONE +# endif +# endif +#endif + +#ifdef SWIG_PYTHON_BUILD_NONE +# ifdef Py_None +# undef Py_None +# define Py_None SWIG_Py_None() +# endif +SWIGRUNTIMEINLINE PyObject * +_SWIG_Py_None(void) +{ + PyObject *none = Py_BuildValue((char*)""); + Py_DECREF(none); + return none; +} +SWIGRUNTIME PyObject * +SWIG_Py_None(void) +{ + static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); + return none; +} +#endif + +/* The python void return value */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Py_Void(void) +{ + PyObject *none = Py_None; + Py_INCREF(none); + return none; +} + +/* SwigPyClientData */ + +typedef struct { + PyObject *klass; + PyObject *newraw; + PyObject *newargs; + PyObject *destroy; + int delargs; + int implicitconv; + PyTypeObject *pytype; +} SwigPyClientData; + +SWIGRUNTIMEINLINE int +SWIG_Python_CheckImplicit(swig_type_info *ty) +{ + SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; + return data ? data->implicitconv : 0; +} + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_ExceptionType(swig_type_info *desc) { + SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; + PyObject *klass = data ? data->klass : 0; + return (klass ? klass : PyExc_RuntimeError); +} + + +SWIGRUNTIME SwigPyClientData * +SwigPyClientData_New(PyObject* obj) +{ + if (!obj) { + return 0; + } else { + SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); + /* the klass element */ + data->klass = obj; + Py_INCREF(data->klass); + /* the newraw method and newargs arguments used to create a new raw instance */ + if (PyClass_Check(obj)) { + data->newraw = 0; + data->newargs = obj; + Py_INCREF(obj); + } else { +#if (PY_VERSION_HEX < 0x02020000) + data->newraw = 0; +#else + data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); +#endif + if (data->newraw) { + Py_INCREF(data->newraw); + data->newargs = PyTuple_New(1); + PyTuple_SetItem(data->newargs, 0, obj); + } else { + data->newargs = obj; + } + Py_INCREF(data->newargs); + } + /* the destroy method, aka as the C++ delete method */ + data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); + if (PyErr_Occurred()) { + PyErr_Clear(); + data->destroy = 0; + } + if (data->destroy) { + int flags; + Py_INCREF(data->destroy); + flags = PyCFunction_GET_FLAGS(data->destroy); +#ifdef METH_O + data->delargs = !(flags & (METH_O)); +#else + data->delargs = 0; +#endif + } else { + data->delargs = 0; + } + data->implicitconv = 0; + data->pytype = 0; + return data; + } +} + +SWIGRUNTIME void +SwigPyClientData_Del(SwigPyClientData *data) { + Py_XDECREF(data->newraw); + Py_XDECREF(data->newargs); + Py_XDECREF(data->destroy); +} + +/* =============== SwigPyObject =====================*/ + +typedef struct { + PyObject_HEAD + void *ptr; + swig_type_info *ty; + int own; + PyObject *next; +#ifdef SWIGPYTHON_BUILTIN + PyObject *dict; +#endif +} SwigPyObject; + + +#ifdef SWIGPYTHON_BUILTIN + +SWIGRUNTIME PyObject * +SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) +{ + SwigPyObject *sobj = (SwigPyObject *)v; + + if (!sobj->dict) + sobj->dict = PyDict_New(); + + Py_INCREF(sobj->dict); + return sobj->dict; +} + +#endif + +SWIGRUNTIME PyObject * +SwigPyObject_long(SwigPyObject *v) +{ + return PyLong_FromVoidPtr(v->ptr); +} + +SWIGRUNTIME PyObject * +SwigPyObject_format(const char* fmt, SwigPyObject *v) +{ + PyObject *res = NULL; + PyObject *args = PyTuple_New(1); + if (args) { + if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { + PyObject *ofmt = SWIG_Python_str_FromChar(fmt); + if (ofmt) { +#if PY_VERSION_HEX >= 0x03000000 + res = PyUnicode_Format(ofmt,args); +#else + res = PyString_Format(ofmt,args); +#endif + Py_DECREF(ofmt); + } + Py_DECREF(args); + } + } + return res; +} + +SWIGRUNTIME PyObject * +SwigPyObject_oct(SwigPyObject *v) +{ + return SwigPyObject_format("%o",v); +} + +SWIGRUNTIME PyObject * +SwigPyObject_hex(SwigPyObject *v) +{ + return SwigPyObject_format("%x",v); +} + +SWIGRUNTIME PyObject * +#ifdef METH_NOARGS +SwigPyObject_repr(SwigPyObject *v) +#else +SwigPyObject_repr(SwigPyObject *v, PyObject *args) +#endif +{ + const char *name = SWIG_TypePrettyName(v->ty); + PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); + if (v->next) { +# ifdef METH_NOARGS + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); +# else + PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); +# endif +# if PY_VERSION_HEX >= 0x03000000 + PyObject *joined = PyUnicode_Concat(repr, nrep); + Py_DecRef(repr); + Py_DecRef(nrep); + repr = joined; +# else + PyString_ConcatAndDel(&repr,nrep); +# endif + } + return repr; +} + +SWIGRUNTIME int +SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) +{ + void *i = v->ptr; + void *j = w->ptr; + return (i < j) ? -1 : ((i > j) ? 1 : 0); +} + +/* Added for Python 3.x, would it also be useful for Python 2.x? */ +SWIGRUNTIME PyObject* +SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) +{ + PyObject* res; + if( op != Py_EQ && op != Py_NE ) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); + return res; +} + + +SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); + +#ifdef SWIGPYTHON_BUILTIN +static swig_type_info *SwigPyObject_stype = 0; +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + SwigPyClientData *cd; + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + assert(cd); + assert(cd->pytype); + return cd->pytype; +} +#else +SWIGRUNTIME PyTypeObject* +SwigPyObject_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); + return type; +} +#endif + +SWIGRUNTIMEINLINE int +SwigPyObject_Check(PyObject *op) { +#ifdef SWIGPYTHON_BUILTIN + PyTypeObject *target_tp = SwigPyObject_type(); + if (PyType_IsSubtype(op->ob_type, target_tp)) + return 1; + return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); +#else + return (Py_TYPE(op) == SwigPyObject_type()) + || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); +#endif +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own); + +SWIGRUNTIME void +SwigPyObject_dealloc(PyObject *v) +{ + SwigPyObject *sobj = (SwigPyObject *) v; + PyObject *next = sobj->next; + if (sobj->own == SWIG_POINTER_OWN) { + swig_type_info *ty = sobj->ty; + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + PyObject *destroy = data ? data->destroy : 0; + if (destroy) { + /* destroy is always a VARARGS method */ + PyObject *res; + + /* PyObject_CallFunction() has the potential to silently drop + the active active exception. In cases of unnamed temporary + variable or where we just finished iterating over a generator + StopIteration will be active right now, and this needs to + remain true upon return from SwigPyObject_dealloc. So save + and restore. */ + + PyObject *val = NULL, *type = NULL, *tb = NULL; + PyErr_Fetch(&val, &type, &tb); + + if (data->delargs) { + /* we need to create a temporary object to carry the destroy operation */ + PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); + res = SWIG_Python_CallFunctor(destroy, tmp); + Py_DECREF(tmp); + } else { + PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); + PyObject *mself = PyCFunction_GET_SELF(destroy); + res = ((*meth)(mself, v)); + } + if (!res) + PyErr_WriteUnraisable(destroy); + + PyErr_Restore(val, type, tb); + + Py_XDECREF(res); + } +#if !defined(SWIG_PYTHON_SILENT_MEMLEAK) + else { + const char *name = SWIG_TypePrettyName(ty); + printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); + } +#endif + } + Py_XDECREF(next); + PyObject_DEL(v); +} + +SWIGRUNTIME PyObject* +SwigPyObject_append(PyObject* v, PyObject* next) +{ + SwigPyObject *sobj = (SwigPyObject *) v; +#ifndef METH_O + PyObject *tmp = 0; + if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; + next = tmp; +#endif + if (!SwigPyObject_Check(next)) { + PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); + return NULL; + } + sobj->next = next; + Py_INCREF(next); + return SWIG_Py_Void(); +} + +SWIGRUNTIME PyObject* +#ifdef METH_NOARGS +SwigPyObject_next(PyObject* v) +#else +SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *) v; + if (sobj->next) { + Py_INCREF(sobj->next); + return sobj->next; + } else { + return SWIG_Py_Void(); + } +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_disown(PyObject *v) +#else +SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = 0; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +#ifdef METH_NOARGS +SwigPyObject_acquire(PyObject *v) +#else +SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) +#endif +{ + SwigPyObject *sobj = (SwigPyObject *)v; + sobj->own = SWIG_POINTER_OWN; + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject* +SwigPyObject_own(PyObject *v, PyObject *args) +{ + PyObject *val = 0; +#if (PY_VERSION_HEX < 0x02020000) + if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) +#elif (PY_VERSION_HEX < 0x02050000) + if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) +#else + if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) +#endif + { + return NULL; + } + else + { + SwigPyObject *sobj = (SwigPyObject *)v; + PyObject *obj = PyBool_FromLong(sobj->own); + if (val) { +#ifdef METH_NOARGS + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v); + } else { + SwigPyObject_disown(v); + } +#else + if (PyObject_IsTrue(val)) { + SwigPyObject_acquire(v,args); + } else { + SwigPyObject_disown(v,args); + } +#endif + } + return obj; + } +} + +#ifdef METH_O +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#else +static PyMethodDef +swigobject_methods[] = { + {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, + {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, + {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, + {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, + {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, + {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, + {0, 0, 0, 0} +}; +#endif + +#if PY_VERSION_HEX < 0x02020000 +SWIGINTERN PyObject * +SwigPyObject_getattr(SwigPyObject *sobj,char *name) +{ + return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); +} +#endif + +SWIGRUNTIME PyTypeObject* +SwigPyObject_TypeOnce(void) { + static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; + + static PyNumberMethods SwigPyObject_as_number = { + (binaryfunc)0, /*nb_add*/ + (binaryfunc)0, /*nb_subtract*/ + (binaryfunc)0, /*nb_multiply*/ + /* nb_divide removed in Python 3 */ +#if PY_VERSION_HEX < 0x03000000 + (binaryfunc)0, /*nb_divide*/ +#endif + (binaryfunc)0, /*nb_remainder*/ + (binaryfunc)0, /*nb_divmod*/ + (ternaryfunc)0,/*nb_power*/ + (unaryfunc)0, /*nb_negative*/ + (unaryfunc)0, /*nb_positive*/ + (unaryfunc)0, /*nb_absolute*/ + (inquiry)0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ +#if PY_VERSION_HEX < 0x03000000 + 0, /*nb_coerce*/ +#endif + (unaryfunc)SwigPyObject_long, /*nb_int*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_long, /*nb_long*/ +#else + 0, /*nb_reserved*/ +#endif + (unaryfunc)0, /*nb_float*/ +#if PY_VERSION_HEX < 0x03000000 + (unaryfunc)SwigPyObject_oct, /*nb_oct*/ + (unaryfunc)SwigPyObject_hex, /*nb_hex*/ +#endif +#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ +#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ +#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ +#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ +#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ + 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ +#endif + }; + + static PyTypeObject swigpyobject_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyObject", /* tp_name */ + sizeof(SwigPyObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyObject_dealloc, /* tp_dealloc */ + 0, /* tp_print */ +#if PY_VERSION_HEX < 0x02020000 + (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ +#else + (getattrfunc)0, /* tp_getattr */ +#endif + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX >= 0x03000000 + 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ +#else + (cmpfunc)SwigPyObject_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyObject_repr, /* tp_repr */ + &SwigPyObject_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigobject_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + swigobject_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version_tag */ +#endif +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ +#if PY_VERSION_HEX >= 0x02050000 + 0, /* tp_prev */ +#endif + 0 /* tp_next */ +#endif + }; + swigpyobject_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpyobject_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpyobject_type) < 0) + return NULL; +#endif + } + return &swigpyobject_type; +} + +SWIGRUNTIME PyObject * +SwigPyObject_New(void *ptr, swig_type_info *ty, int own) +{ + SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); + if (sobj) { + sobj->ptr = ptr; + sobj->ty = ty; + sobj->own = own; + sobj->next = 0; + } + return (PyObject *)sobj; +} + +/* ----------------------------------------------------------------------------- + * Implements a simple Swig Packed type, and use it instead of string + * ----------------------------------------------------------------------------- */ + +typedef struct { + PyObject_HEAD + void *pack; + swig_type_info *ty; + size_t size; +} SwigPyPacked; + +SWIGRUNTIME int +SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) +{ + char result[SWIG_BUFFER_SIZE]; + fputs("pack, v->size, 0, sizeof(result))) { + fputs("at ", fp); + fputs(result, fp); + } + fputs(v->ty->name,fp); + fputs(">", fp); + return 0; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_repr(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { + return SWIG_Python_str_FromFormat("", result, v->ty->name); + } else { + return SWIG_Python_str_FromFormat("", v->ty->name); + } +} + +SWIGRUNTIME PyObject * +SwigPyPacked_str(SwigPyPacked *v) +{ + char result[SWIG_BUFFER_SIZE]; + if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ + return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); + } else { + return SWIG_Python_str_FromChar(v->ty->name); + } +} + +SWIGRUNTIME int +SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) +{ + size_t i = v->size; + size_t j = w->size; + int s = (i < j) ? -1 : ((i > j) ? 1 : 0); + return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); +} + +SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_type(void) { + static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); + return type; +} + +SWIGRUNTIMEINLINE int +SwigPyPacked_Check(PyObject *op) { + return ((op)->ob_type == SwigPyPacked_TypeOnce()) + || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); +} + +SWIGRUNTIME void +SwigPyPacked_dealloc(PyObject *v) +{ + if (SwigPyPacked_Check(v)) { + SwigPyPacked *sobj = (SwigPyPacked *) v; + free(sobj->pack); + } + PyObject_DEL(v); +} + +SWIGRUNTIME PyTypeObject* +SwigPyPacked_TypeOnce(void) { + static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; + static PyTypeObject swigpypacked_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX>=0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"SwigPyPacked", /* tp_name */ + sizeof(SwigPyPacked), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ + (printfunc)SwigPyPacked_print, /* tp_print */ + (getattrfunc)0, /* tp_getattr */ + (setattrfunc)0, /* tp_setattr */ +#if PY_VERSION_HEX>=0x03000000 + 0, /* tp_reserved in 3.0.1 */ +#else + (cmpfunc)SwigPyPacked_compare, /* tp_compare */ +#endif + (reprfunc)SwigPyPacked_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)0, /* tp_hash */ + (ternaryfunc)0, /* tp_call */ + (reprfunc)SwigPyPacked_str, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + swigpacked_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc */ + 0, /* tp_bases */ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version_tag */ +#endif +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ +#if PY_VERSION_HEX >= 0x02050000 + 0, /* tp_prev */ +#endif + 0 /* tp_next */ +#endif + }; + swigpypacked_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + swigpypacked_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&swigpypacked_type) < 0) + return NULL; +#endif + } + return &swigpypacked_type; +} + +SWIGRUNTIME PyObject * +SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) +{ + SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); + if (sobj) { + void *pack = malloc(size); + if (pack) { + memcpy(pack, ptr, size); + sobj->pack = pack; + sobj->ty = ty; + sobj->size = size; + } else { + PyObject_DEL((PyObject *) sobj); + sobj = 0; + } + } + return (PyObject *) sobj; +} + +SWIGRUNTIME swig_type_info * +SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) +{ + if (SwigPyPacked_Check(obj)) { + SwigPyPacked *sobj = (SwigPyPacked *)obj; + if (sobj->size != size) return 0; + memcpy(ptr, sobj->pack, size); + return sobj->ty; + } else { + return 0; + } +} + +/* ----------------------------------------------------------------------------- + * pointers/data manipulation + * ----------------------------------------------------------------------------- */ + +SWIGRUNTIMEINLINE PyObject * +_SWIG_This(void) +{ + return SWIG_Python_str_FromChar("this"); +} + +static PyObject *swig_this = NULL; + +SWIGRUNTIME PyObject * +SWIG_This(void) +{ + if (swig_this == NULL) + swig_this = _SWIG_This(); + return swig_this; +} + +/* #define SWIG_PYTHON_SLOW_GETSET_THIS */ + +/* TODO: I don't know how to implement the fast getset in Python 3 right now */ +#if PY_VERSION_HEX>=0x03000000 +#define SWIG_PYTHON_SLOW_GETSET_THIS +#endif + +SWIGRUNTIME SwigPyObject * +SWIG_Python_GetSwigThis(PyObject *pyobj) +{ + PyObject *obj; + + if (SwigPyObject_Check(pyobj)) + return (SwigPyObject *) pyobj; + +#ifdef SWIGPYTHON_BUILTIN + (void)obj; +# ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + pyobj = PyWeakref_GET_OBJECT(pyobj); + if (pyobj && SwigPyObject_Check(pyobj)) + return (SwigPyObject*) pyobj; + } +# endif + return NULL; +#else + + obj = 0; + +#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) + if (PyInstance_Check(pyobj)) { + obj = _PyInstance_Lookup(pyobj, SWIG_This()); + } else { + PyObject **dictptr = _PyObject_GetDictPtr(pyobj); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; + } else { +#ifdef PyWeakref_CheckProxy + if (PyWeakref_CheckProxy(pyobj)) { + PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); + return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; + } +#endif + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } + } + } +#else + obj = PyObject_GetAttr(pyobj,SWIG_This()); + if (obj) { + Py_DECREF(obj); + } else { + if (PyErr_Occurred()) PyErr_Clear(); + return 0; + } +#endif + if (obj && !SwigPyObject_Check(obj)) { + /* a PyObject is called 'this', try to get the 'real this' + SwigPyObject from it */ + return SWIG_Python_GetSwigThis(obj); + } + return (SwigPyObject *)obj; +#endif +} + +/* Acquire a pointer value */ + +SWIGRUNTIME int +SWIG_Python_AcquirePtr(PyObject *obj, int own) { + if (own == SWIG_POINTER_OWN) { + SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); + if (sobj) { + int oldown = sobj->own; + sobj->own = own; + return oldown; + } + } + return 0; +} + +/* Convert a pointer value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { + int res; + SwigPyObject *sobj; + int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; + + if (!obj) + return SWIG_ERROR; + if (obj == Py_None && !implicit_conv) { + if (ptr) + *ptr = 0; + return SWIG_OK; + } + + res = SWIG_ERROR; + + sobj = SWIG_Python_GetSwigThis(obj); + if (own) + *own = 0; + while (sobj) { + void *vptr = sobj->ptr; + if (ty) { + swig_type_info *to = sobj->ty; + if (to == ty) { + /* no type cast needed */ + if (ptr) *ptr = vptr; + break; + } else { + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) { + sobj = (SwigPyObject *)sobj->next; + } else { + if (ptr) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + if (newmemory == SWIG_CAST_NEW_MEMORY) { + assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ + if (own) + *own = *own | SWIG_CAST_NEW_MEMORY; + } + } + break; + } + } + } else { + if (ptr) *ptr = vptr; + break; + } + } + if (sobj) { + if (own) + *own = *own | sobj->own; + if (flags & SWIG_POINTER_DISOWN) { + sobj->own = 0; + } + res = SWIG_OK; + } else { + if (implicit_conv) { + SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; + if (data && !data->implicitconv) { + PyObject *klass = data->klass; + if (klass) { + PyObject *impconv; + data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ + impconv = SWIG_Python_CallFunctor(klass, obj); + data->implicitconv = 0; + if (PyErr_Occurred()) { + PyErr_Clear(); + impconv = 0; + } + if (impconv) { + SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); + if (iobj) { + void *vptr; + res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); + if (SWIG_IsOK(res)) { + if (ptr) { + *ptr = vptr; + /* transfer the ownership to 'ptr' */ + iobj->own = 0; + res = SWIG_AddCast(res); + res = SWIG_AddNewMask(res); + } else { + res = SWIG_AddCast(res); + } + } + } + Py_DECREF(impconv); + } + } + } + } + if (!SWIG_IsOK(res) && obj == Py_None) { + if (ptr) + *ptr = 0; + if (PyErr_Occurred()) + PyErr_Clear(); + res = SWIG_OK; + } + } + return res; +} + +/* Convert a function ptr value */ + +SWIGRUNTIME int +SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { + if (!PyCFunction_Check(obj)) { + return SWIG_ConvertPtr(obj, ptr, ty, 0); + } else { + void *vptr = 0; + + /* here we get the method pointer for callbacks */ + const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); + const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; + if (desc) + desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; + if (!desc) + return SWIG_ERROR; + if (ty) { + swig_cast_info *tc = SWIG_TypeCheck(desc,ty); + if (tc) { + int newmemory = 0; + *ptr = SWIG_TypeCast(tc,vptr,&newmemory); + assert(!newmemory); /* newmemory handling not yet implemented */ + } else { + return SWIG_ERROR; + } + } else { + *ptr = vptr; + } + return SWIG_OK; + } +} + +/* Convert a packed value value */ + +SWIGRUNTIME int +SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { + swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); + if (!to) return SWIG_ERROR; + if (ty) { + if (to != ty) { + /* check type cast? */ + swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); + if (!tc) return SWIG_ERROR; + } + } + return SWIG_OK; +} + +/* ----------------------------------------------------------------------------- + * Create a new pointer object + * ----------------------------------------------------------------------------- */ + +/* + Create a new instance object, without calling __init__, and set the + 'this' attribute. +*/ + +SWIGRUNTIME PyObject* +SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) +{ +#if (PY_VERSION_HEX >= 0x02020000) + PyObject *inst = 0; + PyObject *newraw = data->newraw; + if (newraw) { + inst = PyObject_Call(newraw, data->newargs, NULL); + if (inst) { +#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + PyObject *dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + PyDict_SetItem(dict, SWIG_This(), swig_this); + } + } +#else + PyObject *key = SWIG_This(); + PyObject_SetAttr(inst, key, swig_this); +#endif + } + } else { +#if PY_VERSION_HEX >= 0x03000000 + inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); + if (inst) { + PyObject_SetAttr(inst, SWIG_This(), swig_this); + Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; + } +#else + PyObject *dict = PyDict_New(); + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + } +#endif + } + return inst; +#else +#if (PY_VERSION_HEX >= 0x02010000) + PyObject *inst = 0; + PyObject *dict = PyDict_New(); + if (dict) { + PyDict_SetItem(dict, SWIG_This(), swig_this); + inst = PyInstance_NewRaw(data->newargs, dict); + Py_DECREF(dict); + } + return (PyObject *) inst; +#else + PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); + if (inst == NULL) { + return NULL; + } + inst->in_class = (PyClassObject *)data->newargs; + Py_INCREF(inst->in_class); + inst->in_dict = PyDict_New(); + if (inst->in_dict == NULL) { + Py_DECREF(inst); + return NULL; + } +#ifdef Py_TPFLAGS_HAVE_WEAKREFS + inst->in_weakreflist = NULL; +#endif +#ifdef Py_TPFLAGS_GC + PyObject_GC_Init(inst); +#endif + PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); + return (PyObject *) inst; +#endif +#endif +} + +SWIGRUNTIME void +SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) +{ + PyObject *dict; +#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) + PyObject **dictptr = _PyObject_GetDictPtr(inst); + if (dictptr != NULL) { + dict = *dictptr; + if (dict == NULL) { + dict = PyDict_New(); + *dictptr = dict; + } + PyDict_SetItem(dict, SWIG_This(), swig_this); + return; + } +#endif + dict = PyObject_GetAttrString(inst, (char*)"__dict__"); + PyDict_SetItem(dict, SWIG_This(), swig_this); + Py_DECREF(dict); +} + + +SWIGINTERN PyObject * +SWIG_Python_InitShadowInstance(PyObject *args) { + PyObject *obj[2]; + if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { + return NULL; + } else { + SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); + if (sthis) { + SwigPyObject_append((PyObject*) sthis, obj[1]); + } else { + SWIG_Python_SetSwigThis(obj[0], obj[1]); + } + return SWIG_Py_Void(); + } +} + +/* Create a new pointer object */ + +SWIGRUNTIME PyObject * +SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { + SwigPyClientData *clientdata; + PyObject * robj; + int own; + + if (!ptr) + return SWIG_Py_Void(); + + clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; + own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; + if (clientdata && clientdata->pytype) { + SwigPyObject *newobj; + if (flags & SWIG_BUILTIN_TP_INIT) { + newobj = (SwigPyObject*) self; + if (newobj->ptr) { + PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); + while (newobj->next) + newobj = (SwigPyObject *) newobj->next; + newobj->next = next_self; + newobj = (SwigPyObject *)next_self; +#ifdef SWIGPYTHON_BUILTIN + newobj->dict = 0; +#endif + } + } else { + newobj = PyObject_New(SwigPyObject, clientdata->pytype); +#ifdef SWIGPYTHON_BUILTIN + newobj->dict = 0; +#endif + } + if (newobj) { + newobj->ptr = ptr; + newobj->ty = type; + newobj->own = own; + newobj->next = 0; + return (PyObject*) newobj; + } + return SWIG_Py_Void(); + } + + assert(!(flags & SWIG_BUILTIN_TP_INIT)); + + robj = SwigPyObject_New(ptr, type, own); + if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { + PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); + Py_DECREF(robj); + robj = inst; + } + return robj; +} + +/* Create a new packed object */ + +SWIGRUNTIMEINLINE PyObject * +SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { + return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); +} + +/* -----------------------------------------------------------------------------* + * Get type list + * -----------------------------------------------------------------------------*/ + +#ifdef SWIG_LINK_RUNTIME +void *SWIG_ReturnGlobalTypeList(void *); +#endif + +SWIGRUNTIME swig_module_info * +SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { + static void *type_pointer = (void *)0; + /* first check if module already created */ + if (!type_pointer) { +#ifdef SWIG_LINK_RUNTIME + type_pointer = SWIG_ReturnGlobalTypeList((void *)0); +#else +# ifdef SWIGPY_USE_CAPSULE + type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); +# else + type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, + (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); +# endif + if (PyErr_Occurred()) { + PyErr_Clear(); + type_pointer = (void *)0; + } +#endif + } + return (swig_module_info *) type_pointer; +} + +#if PY_MAJOR_VERSION < 2 +/* PyModule_AddObject function was introduced in Python 2.0. The following function + is copied out of Python/modsupport.c in python version 2.3.4 */ +SWIGINTERN int +PyModule_AddObject(PyObject *m, char *name, PyObject *o) +{ + PyObject *dict; + if (!PyModule_Check(m)) { + PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); + return SWIG_ERROR; + } + if (!o) { + PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); + return SWIG_ERROR; + } + + dict = PyModule_GetDict(m); + if (dict == NULL) { + /* Internal error -- modules must have a dict! */ + PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", + PyModule_GetName(m)); + return SWIG_ERROR; + } + if (PyDict_SetItemString(dict, name, o)) + return SWIG_ERROR; + Py_DECREF(o); + return SWIG_OK; +} +#endif + +SWIGRUNTIME void +#ifdef SWIGPY_USE_CAPSULE +SWIG_Python_DestroyModule(PyObject *obj) +#else +SWIG_Python_DestroyModule(void *vptr) +#endif +{ +#ifdef SWIGPY_USE_CAPSULE + swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); +#else + swig_module_info *swig_module = (swig_module_info *) vptr; +#endif + swig_type_info **types = swig_module->types; + size_t i; + for (i =0; i < swig_module->size; ++i) { + swig_type_info *ty = types[i]; + if (ty->owndata) { + SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; + if (data) SwigPyClientData_Del(data); + } + } + Py_DECREF(SWIG_This()); + swig_this = NULL; +} + +SWIGRUNTIME void +SWIG_Python_SetModule(swig_module_info *swig_module) { +#if PY_VERSION_HEX >= 0x03000000 + /* Add a dummy module object into sys.modules */ + PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); +#else + static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ + PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); +#endif +#ifdef SWIGPY_USE_CAPSULE + PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#else + PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); + if (pointer && module) { + PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); + } else { + Py_XDECREF(pointer); + } +#endif +} + +/* The python cached type query */ +SWIGRUNTIME PyObject * +SWIG_Python_TypeCache(void) { + static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); + return cache; +} + +SWIGRUNTIME swig_type_info * +SWIG_Python_TypeQuery(const char *type) +{ + PyObject *cache = SWIG_Python_TypeCache(); + PyObject *key = SWIG_Python_str_FromChar(type); + PyObject *obj = PyDict_GetItem(cache, key); + swig_type_info *descriptor; + if (obj) { +#ifdef SWIGPY_USE_CAPSULE + descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); +#else + descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); +#endif + } else { + swig_module_info *swig_module = SWIG_GetModule(0); + descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); + if (descriptor) { +#ifdef SWIGPY_USE_CAPSULE + obj = PyCapsule_New((void*) descriptor, NULL, NULL); +#else + obj = PyCObject_FromVoidPtr(descriptor, NULL); +#endif + PyDict_SetItem(cache, key, obj); + Py_DECREF(obj); + } + } + Py_DECREF(key); + return descriptor; +} + +/* + For backward compatibility only +*/ +#define SWIG_POINTER_EXCEPTION 0 +#define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) +#define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) + +SWIGRUNTIME int +SWIG_Python_AddErrMesg(const char* mesg, int infront) +{ + if (PyErr_Occurred()) { + PyObject *type = 0; + PyObject *value = 0; + PyObject *traceback = 0; + PyErr_Fetch(&type, &value, &traceback); + if (value) { + char *tmp; + PyObject *old_str = PyObject_Str(value); + Py_XINCREF(type); + PyErr_Clear(); + if (infront) { + PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); + } else { + PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); + } + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(old_str); + } + return 1; + } else { + return 0; + } +} + +SWIGRUNTIME int +SWIG_Python_ArgFail(int argnum) +{ + if (PyErr_Occurred()) { + /* add information about failing argument */ + char mesg[256]; + PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); + return SWIG_Python_AddErrMesg(mesg, 1); + } else { + return 0; + } +} + +SWIGRUNTIMEINLINE const char * +SwigPyObject_GetDesc(PyObject *self) +{ + SwigPyObject *v = (SwigPyObject *)self; + swig_type_info *ty = v ? v->ty : 0; + return ty ? ty->str : ""; +} + +SWIGRUNTIME void +SWIG_Python_TypeError(const char *type, PyObject *obj) +{ + if (type) { +#if defined(SWIG_COBJECT_TYPES) + if (obj && SwigPyObject_Check(obj)) { + const char *otype = (const char *) SwigPyObject_GetDesc(obj); + if (otype) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", + type, otype); + return; + } + } else +#endif + { + const char *otype = (obj ? obj->ob_type->tp_name : 0); + if (otype) { + PyObject *str = PyObject_Str(obj); + const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; + if (cstr) { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", + type, otype, cstr); + SWIG_Python_str_DelForPy3(cstr); + } else { + PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", + type, otype); + } + Py_XDECREF(str); + return; + } + } + PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); + } else { + PyErr_Format(PyExc_TypeError, "unexpected type is received"); + } +} + + +/* Convert a pointer value, signal an exception on a type mismatch */ +SWIGRUNTIME void * +SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { + void *result; + if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { + PyErr_Clear(); +#if SWIG_POINTER_EXCEPTION + if (flags) { + SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); + SWIG_Python_ArgFail(argnum); + } +#endif + } + return result; +} + +#ifdef SWIGPYTHON_BUILTIN +SWIGRUNTIME int +SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { + PyTypeObject *tp = obj->ob_type; + PyObject *descr; + PyObject *encoded_name; + descrsetfunc f; + int res = -1; + +# ifdef Py_USING_UNICODE + if (PyString_Check(name)) { + name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); + if (!name) + return -1; + } else if (!PyUnicode_Check(name)) +# else + if (!PyString_Check(name)) +# endif + { + PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); + return -1; + } else { + Py_INCREF(name); + } + + if (!tp->tp_dict) { + if (PyType_Ready(tp) < 0) + goto done; + } + + descr = _PyType_Lookup(tp, name); + f = NULL; + if (descr != NULL) + f = descr->ob_type->tp_descr_set; + if (!f) { + if (PyString_Check(name)) { + encoded_name = name; + Py_INCREF(name); + } else { + encoded_name = PyUnicode_AsUTF8String(name); + } + PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); + Py_DECREF(encoded_name); + } else { + res = f(descr, obj, value); + } + + done: + Py_DECREF(name); + return res; +} +#endif + + +#ifdef __cplusplus +} +#endif + + + +#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) + +#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else + + + + #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) + + +/* -------- TYPES TABLE (BEGIN) -------- */ + +#define SWIGTYPE_p_char swig_types[0] +#define SWIGTYPE_p_double swig_types[1] +#define SWIGTYPE_p_double_complex swig_types[2] +#define SWIGTYPE_p_int swig_types[3] +#define SWIGTYPE_p_shtns_info swig_types[4] +static swig_type_info *swig_types[6]; +static swig_module_info swig_module = {swig_types, 5, 0, 0, 0, 0}; +#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) +#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) + +/* -------- TYPES TABLE (END) -------- */ + +#if (PY_VERSION_HEX <= 0x02000000) +# if !defined(SWIG_PYTHON_CLASSIC) +# error "This python version requires swig to be run with the '-classic' option" +# endif +#endif + +/*----------------------------------------------- + @(target):= _shtns.so + ------------------------------------------------*/ +#if PY_VERSION_HEX >= 0x03000000 +# define SWIG_init PyInit__shtns + +#else +# define SWIG_init init_shtns + +#endif +#define SWIG_name "_shtns" + +#define SWIGVERSION 0x030012 +#define SWIG_VERSION SWIGVERSION + + +#define SWIG_as_voidptr(a) (void *)((const void *)(a)) +#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a)) + + + +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include +#include "sht_private.h" + +// variables used for exception handling. +static int shtns_error = 0; +static char* shtns_err_msg; +static char msg_buffer[128]; +static char msg_grid_err[] = "Grid not set. Call .set_grid() mehtod."; +static char msg_numpy_arr[] = "Numpy array expected."; +static char msg_rot_err[] = "truncation must be triangular (lmax=mmax, mres=1)"; + +static void throw_exception(int error, int iarg, char* msg) +{ + shtns_error = error; + shtns_err_msg = msg; + if (iarg > 0) { + sprintf(msg_buffer, "arg #%d : %.100s", iarg, msg); + shtns_err_msg = msg_buffer; + } +} + +static int check_spatial(int i, PyObject *a, int size) { + if (size == 0) { + throw_exception(SWIG_RuntimeError,0,msg_grid_err); return 0; + } + if (!PyArray_Check(a)) { + throw_exception(SWIG_TypeError,i,msg_numpy_arr); return 0; + } + if (PyArray_TYPE((PyArrayObject *) a) != NPY_DOUBLE) { + throw_exception(SWIG_TypeError,i,"spatial array must consist of float."); return 0; + } + if (!PyArray_ISCONTIGUOUS((PyArrayObject *) a)) { + throw_exception(SWIG_RuntimeError,i,"spatial array not contiguous. Use 'b=a.copy()' to copy a to a contiguous array b."); return 0; + } + if (PyArray_SIZE((PyArrayObject *) a) != size) { + throw_exception(SWIG_RuntimeError,i,"spatial array has wrong size"); return 0; + } + return 1; +} + +static int check_spectral(int i, PyObject *a, int size) { + if (!PyArray_Check(a)) { + throw_exception(SWIG_RuntimeError,i,msg_numpy_arr); return 0; + } + if (PyArray_TYPE((PyArrayObject *) a) != NPY_CDOUBLE) { + throw_exception(SWIG_RuntimeError,i,"spectral array must consist of complex float. Create with: 'sh.spec_array()'"); return 0; + } + if (!PyArray_ISCONTIGUOUS((PyArrayObject *) a)) { + throw_exception(SWIG_RuntimeError,i,"spactral array not contiguous. Use .copy() to copy to a contiguous array."); return 0; + } + if (PyArray_SIZE((PyArrayObject *) a) != size) { + throw_exception(SWIG_RuntimeError,i,"spectral array has wrong size"); return 0; + } + return 1; +} + +inline static void* PyArray_Data(PyObject *a) { + return PyArray_DATA((PyArrayObject*) a); +} + +inline static PyObject* SpecArray_New(int size) { + npy_intp dims = size; + npy_intp strides = sizeof(cplx); + return PyArray_New(&PyArray_Type, 1, &dims, NPY_CDOUBLE, &strides, NULL, strides, 0, NULL); +} + +inline static PyObject* SpatArray_New(int size) { + npy_intp dims = size; + npy_intp strides = sizeof(double); + return PyArray_New(&PyArray_Type, 1, &dims, NPY_DOUBLE, &strides, NULL, strides, 0, NULL); +} + + + +SWIGINTERNINLINE PyObject* + SWIG_From_int (int value) +{ + return PyInt_FromLong((long) value); +} + + +SWIGINTERNINLINE PyObject* + SWIG_From_unsigned_SS_int (unsigned int value) +{ + return PyInt_FromSize_t((size_t) value); +} + + + #define SWIG_From_long PyInt_FromLong + + +SWIGINTERNINLINE PyObject* +SWIG_From_unsigned_SS_long (unsigned long value) +{ + return (value > LONG_MAX) ? + PyLong_FromUnsignedLong(value) : PyInt_FromLong((long)(value)); +} + + +SWIGINTERNINLINE PyObject * +SWIG_From_unsigned_SS_short (unsigned short value) +{ + return SWIG_From_unsigned_SS_long (value); +} + + +#include +#if !defined(SWIG_NO_LLONG_MAX) +# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) +# define LLONG_MAX __LONG_LONG_MAX__ +# define LLONG_MIN (-LLONG_MAX - 1LL) +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) +# endif +#endif + + +SWIGINTERN int +SWIG_AsVal_double (PyObject *obj, double *val) +{ + int res = SWIG_TypeError; + if (PyFloat_Check(obj)) { + if (val) *val = PyFloat_AsDouble(obj); + return SWIG_OK; +#if PY_VERSION_HEX < 0x03000000 + } else if (PyInt_Check(obj)) { + if (val) *val = (double) PyInt_AsLong(obj); + return SWIG_OK; +#endif + } else if (PyLong_Check(obj)) { + double v = PyLong_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + double d = PyFloat_AsDouble(obj); + if (!PyErr_Occurred()) { + if (val) *val = d; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); + } else { + PyErr_Clear(); + } + } + } +#endif + return res; +} + + +#include + + +#include + + +SWIGINTERNINLINE int +SWIG_CanCastAsInteger(double *d, double min, double max) { + double x = *d; + if ((min <= x && x <= max)) { + double fx = floor(x); + double cx = ceil(x); + double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ + if ((errno == EDOM) || (errno == ERANGE)) { + errno = 0; + } else { + double summ, reps, diff; + if (rd < x) { + diff = x - rd; + } else if (rd > x) { + diff = rd - x; + } else { + return 1; + } + summ = rd + x; + reps = diff/summ; + if (reps < 8*DBL_EPSILON) { + *d = rd; + return 1; + } + } + } + return 0; +} + + +SWIGINTERN int +SWIG_AsVal_long (PyObject *obj, long* val) +{ +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else +#endif + if (PyLong_Check(obj)) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + return SWIG_OverflowError; + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + long v = PyInt_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_int (PyObject * obj, int *val) +{ + long v; + int res = SWIG_AsVal_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v < INT_MIN || v > INT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = (int)(v); + } + } + return res; +} + +SWIGINTERN struct shtns_info *new_shtns_info(int lmax,int mmax,int mres,int norm,int nthreads){ // default arguments : mmax, mres and norm + if (lmax < 2) { + throw_exception(SWIG_ValueError,1,"lmax < 2 not allowed"); return NULL; + } + if (mres <= 0) { + throw_exception(SWIG_ValueError,3,"mres <= 0 invalid"); return NULL; + } + if (mmax < 0) mmax = lmax/mres; // default mmax + if (mmax*mres > lmax) { + throw_exception(SWIG_ValueError,1,"lmax < mmax*mres invalid"); return NULL; + } + shtns_use_threads(nthreads); // use nthreads openmp threads if available (0 means auto) + return shtns_create(lmax, mmax, mres, norm); + } +SWIGINTERN void delete_shtns_info(struct shtns_info *self){ + shtns_destroy(self); // free memory. + } +SWIGINTERN void shtns_info_set_grid(struct shtns_info *self,int nlat,int nphi,int flags,double polar_opt,int nl_order,int *nlat_out,int *nphi_out){ // default arguments + if (nlat != 0) { + if (nlat <= self->lmax) { // nlat too small + throw_exception(SWIG_ValueError,1,"nlat <= lmax"); return; + } + if (nlat & 1) { // nlat must be even + throw_exception(SWIG_ValueError,1,"nlat must be even"); return; + } + } + if ((nphi != 0) && (nphi <= self->mmax *2)) { // nphi too small + throw_exception(SWIG_ValueError,2,"nphi <= 2*mmax"); return; + } + if (!(flags & 256)) flags |= (256*2); // default to SHT_PHI_CONTIGUOUS. + *nlat_out = nlat; *nphi_out = nphi; + shtns_set_grid_auto(self, flags, polar_opt, nl_order, nlat_out, nphi_out); + } +SWIGINTERN void shtns_info_print_info(struct shtns_info *self){ + shtns_print_cfg(self); + } +SWIGINTERN double shtns_info_sh00_1(struct shtns_info *self){ + return sh00_1(self); + } + + #define SWIG_From_double PyFloat_FromDouble + +SWIGINTERN double shtns_info_sh10_ct(struct shtns_info *self){ + return sh10_ct(self); + } +SWIGINTERN double shtns_info_sh11_st(struct shtns_info *self){ + return sh11_st(self); + } + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) +{ +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(obj)) { + long v = PyInt_AsLong(obj); + if (v >= 0) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else +#endif + if (PyLong_Check(obj)) { + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + return SWIG_OverflowError; + } + } +#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { + if (val) *val = (unsigned long)(d); + return res; + } + } + } +#endif + return SWIG_TypeError; +} + + +SWIGINTERN int +SWIG_AsVal_unsigned_SS_int (PyObject * obj, unsigned int *val) +{ + unsigned long v; + int res = SWIG_AsVal_unsigned_SS_long (obj, &v); + if (SWIG_IsOK(res)) { + if ((v > UINT_MAX)) { + return SWIG_OverflowError; + } else { + if (val) *val = (unsigned int)(v); + } + } + return res; +} + +SWIGINTERN double shtns_info_shlm_e1(struct shtns_info *self,unsigned int l,unsigned int m){ + return shlm_e1(self, l, m); + } +SWIGINTERN void shtns_info_robert_form(struct shtns_info *self,int v){ shtns_robert_form(self, v); } +SWIGINTERN PyObject *shtns_info___ct(struct shtns_info *self){ // grid must have been initialized. + PyObject *obj; + double *ct; + int i; + if (self->nlat == 0) { // no grid + throw_exception(SWIG_RuntimeError,0,msg_grid_err); + return NULL; + } + obj = SpatArray_New(self->nlat); + ct = (double*) PyArray_Data(obj); + for (i=0; inlat; i++) ct[i] = self->ct[i]; // copy + return obj; + } +SWIGINTERN PyObject *shtns_info_gauss_wts(struct shtns_info *self){ // gauss grid must have been initialized. + PyObject *obj; + if (self->nlat == 0) { // no grid + throw_exception(SWIG_RuntimeError,0,msg_grid_err); + return NULL; + } + if (self->wg == NULL) { + throw_exception(SWIG_RuntimeError,0,"not a gauss grid"); + return NULL; + } + obj = SpatArray_New(self->nlat_2); + shtns_gauss_wts(self, PyArray_Data(obj)); + return obj; + } +SWIGINTERN PyObject *shtns_info_mul_ct_matrix(struct shtns_info *self){ + PyObject *mx = SpatArray_New(2*self->nlm); + mul_ct_matrix(self, PyArray_Data(mx)); + return mx; + } +SWIGINTERN PyObject *shtns_info_st_dt_matrix(struct shtns_info *self){ + PyObject *mx = SpatArray_New(2*self->nlm); + st_dt_matrix(self, PyArray_Data(mx)); + return mx; + } +SWIGINTERN void shtns_info___spat_shape(struct shtns_info *self,int *dim0,int *dim1){ + *dim0 = self->nphi; *dim1 = self->nlat; + if (self->fftc_mode == 1) { // phi-contiguous + *dim0 = self->nlat; *dim1 = self->nphi; + } + } +SWIGINTERN int shtns_info_idx(struct shtns_info *self,unsigned int l,unsigned int m){ + if (l > self->lmax) { + throw_exception(SWIG_ValueError,1,"l invalid"); return 0; + } + if ( (m > l) || (m > self->mmax * self->mres) || (m % self->mres != 0) ) { + throw_exception(SWIG_ValueError,2,"m invalid"); return 0; + } + return ( self->lmidx[((unsigned)(m))/self->mres] + (l) ); + } +SWIGINTERN void shtns_info_spat_to_SH(struct shtns_info *self,PyObject *Vr,PyObject *Qlm){ + if (check_spatial(1,Vr, self->nspat) && check_spectral(2,Qlm, self->nlm)) + spat_to_SH(self, PyArray_Data(Vr), PyArray_Data(Qlm)); + } +SWIGINTERN void shtns_info_SH_to_spat(struct shtns_info *self,PyObject *Qlm,PyObject *Vr){ + if (check_spatial(2,Vr, self->nspat) && check_spectral(1,Qlm, self->nlm)) + SH_to_spat(self, PyArray_Data(Qlm), PyArray_Data(Vr)); + } +SWIGINTERN void shtns_info_spat_cplx_to_SH(struct shtns_info *self,PyObject *z,PyObject *alm){ + int n = self->lmax + 1; + if (check_spectral(1,z, self->nspat) && check_spectral(2,alm, n*n)) + spat_cplx_to_SH(self, PyArray_Data(z), PyArray_Data(alm)); + } +SWIGINTERN void shtns_info_SH_to_spat_cplx(struct shtns_info *self,PyObject *alm,PyObject *z){ + int n = self->lmax + 1; + if (check_spectral(2,z, self->nspat) && check_spectral(1,alm, n*n)) + SH_to_spat_cplx(self, PyArray_Data(alm), PyArray_Data(z)); + } +SWIGINTERN void shtns_info_spat_to_SHsphtor(struct shtns_info *self,PyObject *Vt,PyObject *Vp,PyObject *Slm,PyObject *Tlm){ + if (check_spatial(1,Vt, self->nspat) && check_spatial(2,Vp, self->nspat) && check_spectral(3,Slm, self->nlm) && check_spectral(4,Tlm, self->nlm)) + spat_to_SHsphtor(self, PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Slm), PyArray_Data(Tlm)); + } +SWIGINTERN void shtns_info_SHsphtor_to_spat(struct shtns_info *self,PyObject *Slm,PyObject *Tlm,PyObject *Vt,PyObject *Vp){ + if (check_spatial(3,Vt, self->nspat) && check_spatial(4,Vp, self->nspat) && check_spectral(1,Slm, self->nlm) && check_spectral(2,Tlm, self->nlm)) + SHsphtor_to_spat(self, PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp)); + } +SWIGINTERN void shtns_info_SHsph_to_spat(struct shtns_info *self,PyObject *Slm,PyObject *Vt,PyObject *Vp){ + if (check_spatial(2,Vt, self->nspat) && check_spatial(3,Vp, self->nspat) && check_spectral(1,Slm, self->nlm)) + SHsph_to_spat(self, PyArray_Data(Slm), PyArray_Data(Vt), PyArray_Data(Vp)); + } +SWIGINTERN void shtns_info_SHtor_to_spat(struct shtns_info *self,PyObject *Tlm,PyObject *Vt,PyObject *Vp){ + if (check_spatial(2,Vt, self->nspat) && check_spatial(3,Vp, self->nspat) && check_spectral(1,Tlm, self->nlm)) + SHtor_to_spat(self, PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp)); + } +SWIGINTERN void shtns_info_spat_cplx_to_SHsphtor(struct shtns_info *self,PyObject *Vt,PyObject *Vp,PyObject *Slm,PyObject *Tlm){ + int n = self->lmax + 1; + if (check_spectral(1,Vt, self->nspat) && check_spectral(2,Vp, self->nspat) && check_spectral(3,Slm, n*n) && check_spectral(4,Tlm, n*n)) + spat_cplx_to_SHsphtor(self, PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Slm), PyArray_Data(Tlm)); + } +SWIGINTERN void shtns_info_SHsphtor_to_spat_cplx(struct shtns_info *self,PyObject *Slm,PyObject *Tlm,PyObject *Vt,PyObject *Vp){ + int n = self->lmax + 1; + if (check_spectral(3,Vt, self->nspat) && check_spectral(4,Vp, self->nspat) && check_spectral(1,Slm, n*n) && check_spectral(2,Tlm, n*n)) + SHsphtor_to_spat_cplx(self, PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp)); + } +SWIGINTERN void shtns_info_spat_to_SHqst(struct shtns_info *self,PyObject *Vr,PyObject *Vt,PyObject *Vp,PyObject *Qlm,PyObject *Slm,PyObject *Tlm){ + if (check_spatial(1,Vr, self->nspat) && check_spatial(2,Vt, self->nspat) && check_spatial(3,Vp, self->nspat) + && check_spectral(4,Qlm, self->nlm) && check_spectral(5,Slm, self->nlm) && check_spectral(6,Tlm, self->nlm)) + spat_to_SHqst(self, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm)); + } +SWIGINTERN void shtns_info_SHqst_to_spat(struct shtns_info *self,PyObject *Qlm,PyObject *Slm,PyObject *Tlm,PyObject *Vr,PyObject *Vt,PyObject *Vp){ + if (check_spatial(4,Vr, self->nspat) && check_spatial(5,Vt, self->nspat) && check_spatial(6,Vp, self->nspat) + && check_spectral(1,Qlm, self->nlm) && check_spectral(2,Slm, self->nlm) && check_spectral(3,Tlm, self->nlm)) + SHqst_to_spat(self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp)); + } +SWIGINTERN void shtns_info_spat_cplx_to_SHqst(struct shtns_info *self,PyObject *Vr,PyObject *Vt,PyObject *Vp,PyObject *Qlm,PyObject *Slm,PyObject *Tlm){ + int n = self->lmax + 1; + if (check_spectral(1,Vr, self->nspat) && check_spectral(2,Vt, self->nspat) && check_spectral(3,Vp, self->nspat) + && check_spectral(4,Qlm, n*n) && check_spectral(5,Slm, n*n) && check_spectral(6,Tlm, n*n)) + spat_cplx_to_SHqst(self, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm)); + } +SWIGINTERN void shtns_info_SHqst_to_spat_cplx(struct shtns_info *self,PyObject *Qlm,PyObject *Slm,PyObject *Tlm,PyObject *Vr,PyObject *Vt,PyObject *Vp){ + int n = self->lmax + 1; + if (check_spatial(4,Vr, self->nspat) && check_spatial(5,Vt, self->nspat) && check_spatial(6,Vp, self->nspat) + && check_spectral(1,Qlm, n*n) && check_spectral(2,Slm, n*n) && check_spectral(3,Tlm, n*n)) + SHqst_to_spat_cplx(self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp)); + } +SWIGINTERN double shtns_info_SH_to_point(struct shtns_info *self,PyObject *Qlm,double cost,double phi){ + if (check_spectral(1,Qlm, self->nlm)) return SH_to_point(self, PyArray_Data(Qlm), cost, phi); + return 0.0; + } +SWIGINTERN void shtns_info_SH_to_grad_point(struct shtns_info *self,PyObject *DrSlm,PyObject *Slm,double cost,double phi,double *vr,double *vt,double *vp){ + if (check_spectral(1,DrSlm, self->nlm) && check_spectral(2,Slm, self->nlm)) + SH_to_grad_point(self, PyArray_Data(DrSlm), PyArray_Data(Slm), cost, phi, vr, vt, vp); + } +SWIGINTERN void shtns_info_SHqst_to_point(struct shtns_info *self,PyObject *Qlm,PyObject *Slm,PyObject *Tlm,double cost,double phi,double *vr,double *vt,double *vp){ + if (check_spectral(1,Qlm, self->nlm) && check_spectral(2,Slm, self->nlm) && check_spectral(3,Tlm, self->nlm)) + SHqst_to_point(self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), cost, phi, vr, vt, vp); + } +SWIGINTERN void shtns_info_SH_to_lat(struct shtns_info *self,PyObject *Qlm,double cost,PyObject *Vr){ + if (check_spatial(3,Vr, PyArray_SIZE((PyArrayObject *) Vr)) && check_spectral(1,Qlm, self->nlm)) + SH_to_lat(self, PyArray_Data(Qlm), cost, PyArray_Data(Vr), PyArray_SIZE((PyArrayObject *) Vr), self->lmax, self->mmax); + } +SWIGINTERN void shtns_info_SHqst_to_lat(struct shtns_info *self,PyObject *Qlm,PyObject *Slm,PyObject *Tlm,double cost,PyObject *Vr,PyObject *Vt,PyObject *Vp){ + int nphi = PyArray_SIZE((PyArrayObject *) Vr); + if (check_spatial(5,Vr, nphi) && check_spatial(6,Vt, nphi) && check_spatial(7,Vp, nphi) + && check_spectral(1,Qlm, self->nlm) && check_spectral(2,Slm, self->nlm) && check_spectral(3,Tlm, self->nlm)) + SHqst_to_lat(self, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), cost, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), nphi, self->lmax, self->mmax); + } +SWIGINTERN PyObject *shtns_info_Zrotate(struct shtns_info *self,PyObject *Qlm,double alpha){ + if (check_spectral(1,Qlm, self->nlm)) { + PyObject *Rlm = SpecArray_New(self->nlm); + SH_Zrotate(self, PyArray_Data(Qlm), alpha, PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } +SWIGINTERN PyObject *shtns_info_Yrotate(struct shtns_info *self,PyObject *Qlm,double alpha){ + if ((self->mres != 1)||(self->mmax != self->lmax)) { + throw_exception(SWIG_RuntimeError,0,msg_rot_err); return NULL; + } + if (check_spectral(1,Qlm, self->nlm)) { + PyObject *Rlm = SpecArray_New(self->nlm); + SH_Yrotate(self, PyArray_Data(Qlm), alpha, PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } +SWIGINTERN PyObject *shtns_info_Yrotate90(struct shtns_info *self,PyObject *Qlm){ + if ((self->mres != 1)||(self->mmax != self->lmax)) { + throw_exception(SWIG_RuntimeError,0,msg_rot_err); return NULL; + } + if (check_spectral(1,Qlm, self->nlm)) { + PyObject *Rlm = SpecArray_New(self->nlm); + SH_Yrotate90(self, PyArray_Data(Qlm), PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } +SWIGINTERN PyObject *shtns_info_Xrotate90(struct shtns_info *self,PyObject *Qlm){ + if ((self->mres != 1)||(self->mmax != self->lmax)) { + throw_exception(SWIG_RuntimeError,0,msg_rot_err); return NULL; + } + if (check_spectral(1,Qlm, self->nlm)) { + PyObject *Rlm = SpecArray_New(self->nlm); + SH_Xrotate90(self, PyArray_Data(Qlm), PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } +SWIGINTERN PyObject *shtns_info_SH_mul_mx(struct shtns_info *self,PyObject *mx,PyObject *Qlm){ + if (check_spectral(2,Qlm, self->nlm) && check_spatial(1, mx, 2* self->nlm)) { + PyObject *Rlm = SpecArray_New(self->nlm); + SH_mul_mx(self, PyArray_Data(mx), PyArray_Data(Qlm), PyArray_Data(Rlm)); + return Rlm; + } + return NULL; + } +SWIGINTERN void shtns_info_spat_to_SH_m(struct shtns_info *self,PyObject *Vr,PyObject *Qlm,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; + if (check_spectral(1,Vr, self->nlat) && check_spectral(2,Qlm, ltr+1 - abs(im_)*self->mres)) + spat_to_SH_ml(self, im_, PyArray_Data(Vr), PyArray_Data(Qlm), ltr); + } +SWIGINTERN void shtns_info_SH_to_spat_m(struct shtns_info *self,PyObject *Qlm,PyObject *Vr,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; + if (check_spectral(2,Vr, self->nlat) && check_spectral(1,Qlm, ltr+1 - abs(im_)*self->mres)) + SH_to_spat_ml(self, im_, PyArray_Data(Qlm), PyArray_Data(Vr), ltr); + } +SWIGINTERN void shtns_info_spat_to_SHsphtor_m(struct shtns_info *self,PyObject *Vt,PyObject *Vp,PyObject *Slm,PyObject *Tlm,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; int nelem = ltr+1 - abs(im_)*self->mres; + if (check_spectral(1,Vt, self->nlat) && check_spectral(2,Vp, self->nlat) && check_spectral(3,Slm, nelem) && check_spectral(4,Tlm, nelem)) + spat_to_SHsphtor_ml(self, im_, PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Slm), PyArray_Data(Tlm), ltr); + } +SWIGINTERN void shtns_info_SHsphtor_to_spat_m(struct shtns_info *self,PyObject *Slm,PyObject *Tlm,PyObject *Vt,PyObject *Vp,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; int nelem = ltr+1 - abs(im_)*self->mres; + if (check_spectral(3,Vt, self->nlat) && check_spectral(4,Vp, self->nlat) && check_spectral(1,Slm, nelem) && check_spectral(2,Tlm, nelem)) + SHsphtor_to_spat_ml(self, im_, PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } +SWIGINTERN void shtns_info_SHsph_to_spat_m(struct shtns_info *self,PyObject *Slm,PyObject *Vt,PyObject *Vp,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; int nelem = ltr+1 - abs(im_)*self->mres; + if (check_spectral(2,Vt, self->nlat) && check_spectral(3,Vp, self->nlat) && check_spectral(1,Slm, nelem)) + SHsph_to_spat_ml(self, im_, PyArray_Data(Slm), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } +SWIGINTERN void shtns_info_SHtor_to_spat_m(struct shtns_info *self,PyObject *Tlm,PyObject *Vt,PyObject *Vp,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; int nelem = ltr+1 - abs(im_)*self->mres; + if (check_spectral(2,Vt, self->nlat) && check_spectral(3,Vp, self->nlat) && check_spectral(1,Tlm, nelem)) + SHtor_to_spat_ml(self, im_, PyArray_Data(Tlm), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } +SWIGINTERN void shtns_info_spat_to_SHqst_m(struct shtns_info *self,PyObject *Vr,PyObject *Vt,PyObject *Vp,PyObject *Qlm,PyObject *Slm,PyObject *Tlm,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; int nelem = ltr+1 - abs(im_)*self->mres; + if (check_spectral(1,Vr, self->nlat) && check_spectral(2,Vt, self->nlat) && check_spectral(3,Vp, self->nlat) + && check_spectral(4,Qlm, nelem) && check_spectral(5,Slm, nelem) && check_spectral(6,Tlm, nelem)) + spat_to_SHqst_ml(self, im_, PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), ltr); + } +SWIGINTERN void shtns_info_SHqst_to_spat_m(struct shtns_info *self,PyObject *Qlm,PyObject *Slm,PyObject *Tlm,PyObject *Vr,PyObject *Vt,PyObject *Vp,PyObject *im){ + int im_ = PyLong_AsLong(im); int ltr = self->lmax; int nelem = ltr+1 - abs(im_)*self->mres; + if (check_spectral(4,Vr, self->nlat) && check_spectral(5,Vt, self->nlat) && check_spectral(6,Vp, self->nlat) + && check_spectral(1,Qlm, nelem) && check_spectral(2,Slm, nelem) && check_spectral(3,Tlm, nelem)) + SHqst_to_spat_ml(self, im_, PyArray_Data(Qlm), PyArray_Data(Slm), PyArray_Data(Tlm), PyArray_Data(Vr), PyArray_Data(Vt), PyArray_Data(Vp), ltr); + } +#ifdef __cplusplus +extern "C" { +#endif +SWIGINTERN PyObject *_wrap_sht_nlm_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned int result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_nlm_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_nlm_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned int)(unsigned int) ((arg1)->nlm); + resultobj = SWIG_From_unsigned_SS_int((unsigned int)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_lmax_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned short result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_lmax_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_lmax_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned short)(unsigned short) ((arg1)->lmax); + resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_mmax_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned short result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_mmax_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_mmax_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned short)(unsigned short) ((arg1)->mmax); + resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_mres_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned short result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_mres_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_mres_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned short)(unsigned short) ((arg1)->mres); + resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_nphi_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned short result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_nphi_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_nphi_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned short)(unsigned short) ((arg1)->nphi); + resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_nlat_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned short result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_nlat_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_nlat_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned short)(unsigned short) ((arg1)->nlat); + resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_nspat_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned int result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_nspat_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_nspat_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned int)(unsigned int) ((arg1)->nspat); + resultobj = SWIG_From_unsigned_SS_int((unsigned int)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_nlm_cplx_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + unsigned int result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_nlm_cplx_get",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_nlm_cplx_get" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + result = (unsigned int)(unsigned int) ((arg1)->nlm_cplx); + resultobj = SWIG_From_unsigned_SS_int((unsigned int)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_new_sht(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + int arg1 ; + int arg2 = (int) -1 ; + int arg3 = (int) 1 ; + int arg4 = (int) sht_orthonormal ; + int arg5 = (int) 0 ; + int val1 ; + int ecode1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int val3 ; + int ecode3 = 0 ; + int val4 ; + int ecode4 = 0 ; + int val5 ; + int ecode5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + char * kwnames[] = { + (char *) "lmax",(char *) "mmax",(char *) "mres",(char *) "norm",(char *) "nthreads", NULL + }; + struct shtns_info *result = 0 ; + + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O|OOOO:new_sht",kwnames,&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_sht" "', argument " "1"" of type '" "int""'"); + } + arg1 = (int)(val1); + if (obj1) { + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_sht" "', argument " "2"" of type '" "int""'"); + } + arg2 = (int)(val2); + } + if (obj2) { + ecode3 = SWIG_AsVal_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_sht" "', argument " "3"" of type '" "int""'"); + } + arg3 = (int)(val3); + } + if (obj3) { + ecode4 = SWIG_AsVal_int(obj3, &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "new_sht" "', argument " "4"" of type '" "int""'"); + } + arg4 = (int)(val4); + } + if (obj4) { + ecode5 = SWIG_AsVal_int(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "new_sht" "', argument " "5"" of type '" "int""'"); + } + arg5 = (int)(val5); + } + { + shtns_error = 0; // clear exception + result = (struct shtns_info *)new_shtns_info(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_shtns_info, SWIG_POINTER_NEW | 0 ); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_delete_sht(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:delete_sht",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, SWIG_POINTER_DISOWN | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_sht" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + delete_shtns_info(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_set_grid(PyObject *SWIGUNUSEDPARM(self), PyObject *args, PyObject *kwargs) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + int arg2 = (int) 0 ; + int arg3 = (int) 0 ; + int arg4 = (int) sht_quick_init ; + double arg5 = (double) 1.0e-8 ; + int arg6 = (int) 1 ; + int *arg7 = (int *) 0 ; + int *arg8 = (int *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int val3 ; + int ecode3 = 0 ; + int val4 ; + int ecode4 = 0 ; + double val5 ; + int ecode5 = 0 ; + int val6 ; + int ecode6 = 0 ; + int temp7 ; + int res7 = SWIG_TMPOBJ ; + int temp8 ; + int res8 = SWIG_TMPOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + char * kwnames[] = { + (char *) "self",(char *) "nlat",(char *) "nphi",(char *) "flags",(char *) "polar_opt",(char *) "nl_order", NULL + }; + + arg7 = &temp7; + arg8 = &temp8; + if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O|OOOOO:sht_set_grid",kwnames,&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_set_grid" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + if (obj1) { + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sht_set_grid" "', argument " "2"" of type '" "int""'"); + } + arg2 = (int)(val2); + } + if (obj2) { + ecode3 = SWIG_AsVal_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_set_grid" "', argument " "3"" of type '" "int""'"); + } + arg3 = (int)(val3); + } + if (obj3) { + ecode4 = SWIG_AsVal_int(obj3, &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sht_set_grid" "', argument " "4"" of type '" "int""'"); + } + arg4 = (int)(val4); + } + if (obj4) { + ecode5 = SWIG_AsVal_double(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sht_set_grid" "', argument " "5"" of type '" "double""'"); + } + arg5 = (double)(val5); + } + if (obj5) { + ecode6 = SWIG_AsVal_int(obj5, &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "sht_set_grid" "', argument " "6"" of type '" "int""'"); + } + arg6 = (int)(val6); + } + { + shtns_error = 0; // clear exception + shtns_info_set_grid(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + if (SWIG_IsTmpObj(res7)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg7))); + } else { + int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_int, new_flags)); + } + if (SWIG_IsTmpObj(res8)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg8))); + } else { + int new_flags = SWIG_IsNewObj(res8) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg8), SWIGTYPE_p_int, new_flags)); + } + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_print_info(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_print_info",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_print_info" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + shtns_info_print_info(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_sh00_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + double result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_sh00_1",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_sh00_1" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (double)shtns_info_sh00_1(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_From_double((double)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_sh10_ct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + double result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_sh10_ct",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_sh10_ct" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (double)shtns_info_sh10_ct(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_From_double((double)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_sh11_st(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + double result; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_sh11_st",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_sh11_st" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (double)shtns_info_sh11_st(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_From_double((double)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_shlm_e1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + unsigned int arg2 ; + unsigned int arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + unsigned int val2 ; + int ecode2 = 0 ; + unsigned int val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + double result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_shlm_e1",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_shlm_e1" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sht_shlm_e1" "', argument " "2"" of type '" "unsigned int""'"); + } + arg2 = (unsigned int)(val2); + ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_shlm_e1" "', argument " "3"" of type '" "unsigned int""'"); + } + arg3 = (unsigned int)(val3); + { + shtns_error = 0; // clear exception + result = (double)shtns_info_shlm_e1(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_From_double((double)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_robert_form(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + int arg2 = (int) 1 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O|O:sht_robert_form",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_robert_form" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + if (obj1) { + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sht_robert_form" "', argument " "2"" of type '" "int""'"); + } + arg2 = (int)(val2); + } + { + shtns_error = 0; // clear exception + shtns_info_robert_form(arg1,arg2); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht___ct(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:sht___ct",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht___ct" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info___ct(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_gauss_wts(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_gauss_wts",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_gauss_wts" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_gauss_wts(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_mul_ct_matrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_mul_ct_matrix",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_mul_ct_matrix" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_mul_ct_matrix(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_st_dt_matrix(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:sht_st_dt_matrix",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_st_dt_matrix" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_st_dt_matrix(arg1); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht___spat_shape(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + int *arg2 = (int *) 0 ; + int *arg3 = (int *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + int temp2 ; + int res2 = SWIG_TMPOBJ ; + int temp3 ; + int res3 = SWIG_TMPOBJ ; + PyObject * obj0 = 0 ; + + arg2 = &temp2; + arg3 = &temp3; + if (!PyArg_ParseTuple(args,(char *)"O:sht___spat_shape",&obj0)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht___spat_shape" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + { + shtns_error = 0; // clear exception + shtns_info___spat_shape(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + if (SWIG_IsTmpObj(res2)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg2))); + } else { + int new_flags = SWIG_IsNewObj(res2) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg2), SWIGTYPE_p_int, new_flags)); + } + if (SWIG_IsTmpObj(res3)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_int((*arg3))); + } else { + int new_flags = SWIG_IsNewObj(res3) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg3), SWIGTYPE_p_int, new_flags)); + } + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_idx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + unsigned int arg2 ; + unsigned int arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + unsigned int val2 ; + int ecode2 = 0 ; + unsigned int val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + int result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_idx",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_idx" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + ecode2 = SWIG_AsVal_unsigned_SS_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "sht_idx" "', argument " "2"" of type '" "unsigned int""'"); + } + arg2 = (unsigned int)(val2); + ecode3 = SWIG_AsVal_unsigned_SS_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_idx" "', argument " "3"" of type '" "unsigned int""'"); + } + arg3 = (unsigned int)(val3); + { + shtns_error = 0; // clear exception + result = (int)shtns_info_idx(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_From_int((int)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_to_SH(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_spat_to_SH",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_to_SH" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + { + shtns_error = 0; // clear exception + shtns_info_spat_to_SH(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_to_spat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_SH_to_spat",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_to_spat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + { + shtns_error = 0; // clear exception + shtns_info_SH_to_spat(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_cplx_to_SH(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_spat_cplx_to_SH",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_cplx_to_SH" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + { + shtns_error = 0; // clear exception + shtns_info_spat_cplx_to_SH(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_to_spat_cplx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_SH_to_spat_cplx",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_to_spat_cplx" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + { + shtns_error = 0; // clear exception + shtns_info_SH_to_spat_cplx(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_to_SHsphtor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_spat_to_SHsphtor",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_to_SHsphtor" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + { + shtns_error = 0; // clear exception + shtns_info_spat_to_SHsphtor(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHsphtor_to_spat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_SHsphtor_to_spat",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHsphtor_to_spat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + { + shtns_error = 0; // clear exception + shtns_info_SHsphtor_to_spat(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHsph_to_spat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:sht_SHsph_to_spat",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHsph_to_spat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + { + shtns_error = 0; // clear exception + shtns_info_SHsph_to_spat(arg1,arg2,arg3,arg4); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHtor_to_spat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:sht_SHtor_to_spat",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHtor_to_spat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + { + shtns_error = 0; // clear exception + shtns_info_SHtor_to_spat(arg1,arg2,arg3,arg4); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_cplx_to_SHsphtor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_spat_cplx_to_SHsphtor",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_cplx_to_SHsphtor" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + { + shtns_error = 0; // clear exception + shtns_info_spat_cplx_to_SHsphtor(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHsphtor_to_spat_cplx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_SHsphtor_to_spat_cplx",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHsphtor_to_spat_cplx" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + { + shtns_error = 0; // clear exception + shtns_info_SHsphtor_to_spat_cplx(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_to_SHqst(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:sht_spat_to_SHqst",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_to_SHqst" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + arg7 = obj6; + { + shtns_error = 0; // clear exception + shtns_info_spat_to_SHqst(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHqst_to_spat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:sht_SHqst_to_spat",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHqst_to_spat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + arg7 = obj6; + { + shtns_error = 0; // clear exception + shtns_info_SHqst_to_spat(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_cplx_to_SHqst(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:sht_spat_cplx_to_SHqst",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_cplx_to_SHqst" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + arg7 = obj6; + { + shtns_error = 0; // clear exception + shtns_info_spat_cplx_to_SHqst(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHqst_to_spat_cplx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOO:sht_SHqst_to_spat_cplx",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHqst_to_spat_cplx" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + arg7 = obj6; + { + shtns_error = 0; // clear exception + shtns_info_SHqst_to_spat_cplx(arg1,arg2,arg3,arg4,arg5,arg6,arg7); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_to_point(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + double arg3 ; + double arg4 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val3 ; + int ecode3 = 0 ; + double val4 ; + int ecode4 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + double result; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:sht_SH_to_point",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_to_point" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + ecode3 = SWIG_AsVal_double(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_SH_to_point" "', argument " "3"" of type '" "double""'"); + } + arg3 = (double)(val3); + ecode4 = SWIG_AsVal_double(obj3, &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sht_SH_to_point" "', argument " "4"" of type '" "double""'"); + } + arg4 = (double)(val4); + { + shtns_error = 0; // clear exception + result = (double)shtns_info_SH_to_point(arg1,arg2,arg3,arg4); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_From_double((double)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_to_grad_point(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + double arg4 ; + double arg5 ; + double *arg6 = (double *) 0 ; + double *arg7 = (double *) 0 ; + double *arg8 = (double *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val4 ; + int ecode4 = 0 ; + double val5 ; + int ecode5 = 0 ; + double temp6 ; + int res6 = SWIG_TMPOBJ ; + double temp7 ; + int res7 = SWIG_TMPOBJ ; + double temp8 ; + int res8 = SWIG_TMPOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + arg6 = &temp6; + arg7 = &temp7; + arg8 = &temp8; + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_SH_to_grad_point",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_to_grad_point" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + ecode4 = SWIG_AsVal_double(obj3, &val4); + if (!SWIG_IsOK(ecode4)) { + SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "sht_SH_to_grad_point" "', argument " "4"" of type '" "double""'"); + } + arg4 = (double)(val4); + ecode5 = SWIG_AsVal_double(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sht_SH_to_grad_point" "', argument " "5"" of type '" "double""'"); + } + arg5 = (double)(val5); + { + shtns_error = 0; // clear exception + shtns_info_SH_to_grad_point(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + if (SWIG_IsTmpObj(res6)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg6))); + } else { + int new_flags = SWIG_IsNewObj(res6) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg6), SWIGTYPE_p_double, new_flags)); + } + if (SWIG_IsTmpObj(res7)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg7))); + } else { + int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_double, new_flags)); + } + if (SWIG_IsTmpObj(res8)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg8))); + } else { + int new_flags = SWIG_IsNewObj(res8) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg8), SWIGTYPE_p_double, new_flags)); + } + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHqst_to_point(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + double arg5 ; + double arg6 ; + double *arg7 = (double *) 0 ; + double *arg8 = (double *) 0 ; + double *arg9 = (double *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val5 ; + int ecode5 = 0 ; + double val6 ; + int ecode6 = 0 ; + double temp7 ; + int res7 = SWIG_TMPOBJ ; + double temp8 ; + int res8 = SWIG_TMPOBJ ; + double temp9 ; + int res9 = SWIG_TMPOBJ ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + + arg7 = &temp7; + arg8 = &temp8; + arg9 = &temp9; + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:sht_SHqst_to_point",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHqst_to_point" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + ecode5 = SWIG_AsVal_double(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sht_SHqst_to_point" "', argument " "5"" of type '" "double""'"); + } + arg5 = (double)(val5); + ecode6 = SWIG_AsVal_double(obj5, &val6); + if (!SWIG_IsOK(ecode6)) { + SWIG_exception_fail(SWIG_ArgError(ecode6), "in method '" "sht_SHqst_to_point" "', argument " "6"" of type '" "double""'"); + } + arg6 = (double)(val6); + { + shtns_error = 0; // clear exception + shtns_info_SHqst_to_point(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + if (SWIG_IsTmpObj(res7)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg7))); + } else { + int new_flags = SWIG_IsNewObj(res7) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg7), SWIGTYPE_p_double, new_flags)); + } + if (SWIG_IsTmpObj(res8)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg8))); + } else { + int new_flags = SWIG_IsNewObj(res8) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg8), SWIGTYPE_p_double, new_flags)); + } + if (SWIG_IsTmpObj(res9)) { + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_From_double((*arg9))); + } else { + int new_flags = SWIG_IsNewObj(res9) ? (SWIG_POINTER_OWN | 0 ) : 0 ; + resultobj = SWIG_Python_AppendOutput(resultobj, SWIG_NewPointerObj((void*)(arg9), SWIGTYPE_p_double, new_flags)); + } + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_to_lat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + double arg3 ; + PyObject *arg4 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:sht_SH_to_lat",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_to_lat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + ecode3 = SWIG_AsVal_double(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_SH_to_lat" "', argument " "3"" of type '" "double""'"); + } + arg3 = (double)(val3); + arg4 = obj3; + { + shtns_error = 0; // clear exception + shtns_info_SH_to_lat(arg1,arg2,arg3,arg4); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHqst_to_lat(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + double arg5 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + PyObject *arg8 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val5 ; + int ecode5 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:sht_SHqst_to_lat",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHqst_to_lat" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + ecode5 = SWIG_AsVal_double(obj4, &val5); + if (!SWIG_IsOK(ecode5)) { + SWIG_exception_fail(SWIG_ArgError(ecode5), "in method '" "sht_SHqst_to_lat" "', argument " "5"" of type '" "double""'"); + } + arg5 = (double)(val5); + arg6 = obj5; + arg7 = obj6; + arg8 = obj7; + { + shtns_error = 0; // clear exception + shtns_info_SHqst_to_lat(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_Zrotate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + double arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_Zrotate",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_Zrotate" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + ecode3 = SWIG_AsVal_double(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_Zrotate" "', argument " "3"" of type '" "double""'"); + } + arg3 = (double)(val3); + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_Zrotate(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_Yrotate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + double arg3 ; + void *argp1 = 0 ; + int res1 = 0 ; + double val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_Yrotate",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_Yrotate" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + ecode3 = SWIG_AsVal_double(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "sht_Yrotate" "', argument " "3"" of type '" "double""'"); + } + arg3 = (double)(val3); + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_Yrotate(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_Yrotate90(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:sht_Yrotate90",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_Yrotate90" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_Yrotate90(arg1,arg2); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_Xrotate90(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OO:sht_Xrotate90",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_Xrotate90" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_Xrotate90(arg1,arg2); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_mul_mx(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject *result = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:sht_SH_mul_mx",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_mul_mx" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + { + shtns_error = 0; // clear exception + result = (PyObject *)shtns_info_SH_mul_mx(arg1,arg2,arg3); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = result; + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_to_SH_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:sht_spat_to_SH_m",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_to_SH_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + { + shtns_error = 0; // clear exception + shtns_info_spat_to_SH_m(arg1,arg2,arg3,arg4); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SH_to_spat_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOO:sht_SH_to_spat_m",&obj0,&obj1,&obj2,&obj3)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SH_to_spat_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + { + shtns_error = 0; // clear exception + shtns_info_SH_to_spat_m(arg1,arg2,arg3,arg4); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_to_SHsphtor_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:sht_spat_to_SHsphtor_m",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_to_SHsphtor_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + { + shtns_error = 0; // clear exception + shtns_info_spat_to_SHsphtor_m(arg1,arg2,arg3,arg4,arg5,arg6); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHsphtor_to_spat_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOO:sht_SHsphtor_to_spat_m",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHsphtor_to_spat_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + { + shtns_error = 0; // clear exception + shtns_info_SHsphtor_to_spat_m(arg1,arg2,arg3,arg4,arg5,arg6); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHsph_to_spat_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_SHsph_to_spat_m",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHsph_to_spat_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + { + shtns_error = 0; // clear exception + shtns_info_SHsph_to_spat_m(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHtor_to_spat_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOO:sht_SHtor_to_spat_m",&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHtor_to_spat_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + { + shtns_error = 0; // clear exception + shtns_info_SHtor_to_spat_m(arg1,arg2,arg3,arg4,arg5); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_spat_to_SHqst_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + PyObject *arg8 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:sht_spat_to_SHqst_m",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_spat_to_SHqst_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + arg7 = obj6; + arg8 = obj7; + { + shtns_error = 0; // clear exception + shtns_info_spat_to_SHqst_m(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_sht_SHqst_to_spat_m(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + struct shtns_info *arg1 = (struct shtns_info *) 0 ; + PyObject *arg2 = (PyObject *) 0 ; + PyObject *arg3 = (PyObject *) 0 ; + PyObject *arg4 = (PyObject *) 0 ; + PyObject *arg5 = (PyObject *) 0 ; + PyObject *arg6 = (PyObject *) 0 ; + PyObject *arg7 = (PyObject *) 0 ; + PyObject *arg8 = (PyObject *) 0 ; + void *argp1 = 0 ; + int res1 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + PyObject * obj3 = 0 ; + PyObject * obj4 = 0 ; + PyObject * obj5 = 0 ; + PyObject * obj6 = 0 ; + PyObject * obj7 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOOOOOOO:sht_SHqst_to_spat_m",&obj0,&obj1,&obj2,&obj3,&obj4,&obj5,&obj6,&obj7)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_shtns_info, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "sht_SHqst_to_spat_m" "', argument " "1"" of type '" "struct shtns_info *""'"); + } + arg1 = (struct shtns_info *)(argp1); + arg2 = obj1; + arg3 = obj2; + arg4 = obj3; + arg5 = obj4; + arg6 = obj5; + arg7 = obj6; + arg8 = obj7; + { + shtns_error = 0; // clear exception + shtns_info_SHqst_to_spat_m(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); + if (shtns_error) { + // test for exception + SWIG_exception(shtns_error, shtns_err_msg); return NULL; + } + } + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *sht_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *obj; + if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL; + SWIG_TypeNewClientData(SWIGTYPE_p_shtns_info, SWIG_NewClientData(obj)); + return SWIG_Py_Void(); +} + +SWIGINTERN PyObject *_wrap_nlm_calc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + long arg1 ; + long arg2 ; + long arg3 ; + long val1 ; + int ecode1 = 0 ; + long val2 ; + int ecode2 = 0 ; + long val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + long result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:nlm_calc",&obj0,&obj1,&obj2)) SWIG_fail; + ecode1 = SWIG_AsVal_long(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "nlm_calc" "', argument " "1"" of type '" "long""'"); + } + arg1 = (long)(val1); + ecode2 = SWIG_AsVal_long(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "nlm_calc" "', argument " "2"" of type '" "long""'"); + } + arg2 = (long)(val2); + ecode3 = SWIG_AsVal_long(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "nlm_calc" "', argument " "3"" of type '" "long""'"); + } + arg3 = (long)(val3); + result = (long)nlm_calc(arg1,arg2,arg3); + resultobj = SWIG_From_long((long)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_nlm_cplx_calc(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + long arg1 ; + long arg2 ; + long arg3 ; + long val1 ; + int ecode1 = 0 ; + long val2 ; + int ecode2 = 0 ; + long val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + long result; + + if (!PyArg_ParseTuple(args,(char *)"OOO:nlm_cplx_calc",&obj0,&obj1,&obj2)) SWIG_fail; + ecode1 = SWIG_AsVal_long(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "nlm_cplx_calc" "', argument " "1"" of type '" "long""'"); + } + arg1 = (long)(val1); + ecode2 = SWIG_AsVal_long(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "nlm_cplx_calc" "', argument " "2"" of type '" "long""'"); + } + arg2 = (long)(val2); + ecode3 = SWIG_AsVal_long(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "nlm_cplx_calc" "', argument " "3"" of type '" "long""'"); + } + arg3 = (long)(val3); + result = (long)nlm_cplx_calc(arg1,arg2,arg3); + resultobj = SWIG_From_long((long)(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_set_verbosity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + int arg1 ; + int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:set_verbosity",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "set_verbosity" "', argument " "1"" of type '" "int""'"); + } + arg1 = (int)(val1); + shtns_verbose(arg1); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_print_version(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + + if (!PyArg_ParseTuple(args,(char *)":print_version")) SWIG_fail; + shtns_print_version(); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + +static PyMethodDef SwigMethods[] = { + { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL}, + { (char *)"sht_nlm_get", _wrap_sht_nlm_get, METH_VARARGS, (char *)"sht_nlm_get(sht self) -> unsigned int const"}, + { (char *)"sht_lmax_get", _wrap_sht_lmax_get, METH_VARARGS, (char *)"sht_lmax_get(sht self) -> unsigned short const"}, + { (char *)"sht_mmax_get", _wrap_sht_mmax_get, METH_VARARGS, (char *)"sht_mmax_get(sht self) -> unsigned short const"}, + { (char *)"sht_mres_get", _wrap_sht_mres_get, METH_VARARGS, (char *)"sht_mres_get(sht self) -> unsigned short const"}, + { (char *)"sht_nphi_get", _wrap_sht_nphi_get, METH_VARARGS, (char *)"sht_nphi_get(sht self) -> unsigned short const"}, + { (char *)"sht_nlat_get", _wrap_sht_nlat_get, METH_VARARGS, (char *)"sht_nlat_get(sht self) -> unsigned short const"}, + { (char *)"sht_nspat_get", _wrap_sht_nspat_get, METH_VARARGS, (char *)"sht_nspat_get(sht self) -> unsigned int const"}, + { (char *)"sht_nlm_cplx_get", _wrap_sht_nlm_cplx_get, METH_VARARGS, (char *)"sht_nlm_cplx_get(sht self) -> unsigned int const"}, + { (char *)"new_sht", (PyCFunction) _wrap_new_sht, METH_VARARGS | METH_KEYWORDS, (char *)"new_sht(int lmax, int mmax=-1, int mres=1, int norm=sht_orthonormal, int nthreads=0) -> sht"}, + { (char *)"delete_sht", _wrap_delete_sht, METH_VARARGS, (char *)"delete_sht(sht self)"}, + { (char *)"sht_set_grid", (PyCFunction) _wrap_sht_set_grid, METH_VARARGS | METH_KEYWORDS, (char *)"sht_set_grid(sht self, int nlat=0, int nphi=0, int flags=sht_quick_init, double polar_opt=1.0e-8, int nl_order=1)"}, + { (char *)"sht_print_info", _wrap_sht_print_info, METH_VARARGS, (char *)"sht_print_info(sht self)"}, + { (char *)"sht_sh00_1", _wrap_sht_sh00_1, METH_VARARGS, (char *)"sht_sh00_1(sht self) -> double"}, + { (char *)"sht_sh10_ct", _wrap_sht_sh10_ct, METH_VARARGS, (char *)"sht_sh10_ct(sht self) -> double"}, + { (char *)"sht_sh11_st", _wrap_sht_sh11_st, METH_VARARGS, (char *)"sht_sh11_st(sht self) -> double"}, + { (char *)"sht_shlm_e1", _wrap_sht_shlm_e1, METH_VARARGS, (char *)"sht_shlm_e1(sht self, unsigned int l, unsigned int m) -> double"}, + { (char *)"sht_robert_form", _wrap_sht_robert_form, METH_VARARGS, (char *)"for v>0, use Robert form, ie spatial VECTOR fields are multiplied by sin(colatitude). The scalar transforms are unaffected."}, + { (char *)"sht___ct", _wrap_sht___ct, METH_VARARGS, (char *)"sht___ct(sht self) -> PyObject *"}, + { (char *)"sht_gauss_wts", _wrap_sht_gauss_wts, METH_VARARGS, (char *)"sht_gauss_wts(sht self) -> PyObject *"}, + { (char *)"sht_mul_ct_matrix", _wrap_sht_mul_ct_matrix, METH_VARARGS, (char *)"sht_mul_ct_matrix(sht self) -> PyObject *"}, + { (char *)"sht_st_dt_matrix", _wrap_sht_st_dt_matrix, METH_VARARGS, (char *)"sht_st_dt_matrix(sht self) -> PyObject *"}, + { (char *)"sht___spat_shape", _wrap_sht___spat_shape, METH_VARARGS, (char *)"sht___spat_shape(sht self)"}, + { (char *)"sht_idx", _wrap_sht_idx, METH_VARARGS, (char *)"sht_idx(sht self, unsigned int l, unsigned int m) -> int"}, + { (char *)"sht_spat_to_SH", _wrap_sht_spat_to_SH, METH_VARARGS, (char *)"sht_spat_to_SH(sht self, PyObject * Vr, PyObject * Qlm)"}, + { (char *)"sht_SH_to_spat", _wrap_sht_SH_to_spat, METH_VARARGS, (char *)"sht_SH_to_spat(sht self, PyObject * Qlm, PyObject * Vr)"}, + { (char *)"sht_spat_cplx_to_SH", _wrap_sht_spat_cplx_to_SH, METH_VARARGS, (char *)"sht_spat_cplx_to_SH(sht self, PyObject * z, PyObject * alm)"}, + { (char *)"sht_SH_to_spat_cplx", _wrap_sht_SH_to_spat_cplx, METH_VARARGS, (char *)"sht_SH_to_spat_cplx(sht self, PyObject * alm, PyObject * z)"}, + { (char *)"sht_spat_to_SHsphtor", _wrap_sht_spat_to_SHsphtor, METH_VARARGS, (char *)"sht_spat_to_SHsphtor(sht self, PyObject * Vt, PyObject * Vp, PyObject * Slm, PyObject * Tlm)"}, + { (char *)"sht_SHsphtor_to_spat", _wrap_sht_SHsphtor_to_spat, METH_VARARGS, (char *)"sht_SHsphtor_to_spat(sht self, PyObject * Slm, PyObject * Tlm, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_SHsph_to_spat", _wrap_sht_SHsph_to_spat, METH_VARARGS, (char *)"sht_SHsph_to_spat(sht self, PyObject * Slm, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_SHtor_to_spat", _wrap_sht_SHtor_to_spat, METH_VARARGS, (char *)"sht_SHtor_to_spat(sht self, PyObject * Tlm, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_spat_cplx_to_SHsphtor", _wrap_sht_spat_cplx_to_SHsphtor, METH_VARARGS, (char *)"sht_spat_cplx_to_SHsphtor(sht self, PyObject * Vt, PyObject * Vp, PyObject * Slm, PyObject * Tlm)"}, + { (char *)"sht_SHsphtor_to_spat_cplx", _wrap_sht_SHsphtor_to_spat_cplx, METH_VARARGS, (char *)"sht_SHsphtor_to_spat_cplx(sht self, PyObject * Slm, PyObject * Tlm, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_spat_to_SHqst", _wrap_sht_spat_to_SHqst, METH_VARARGS, (char *)"sht_spat_to_SHqst(sht self, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * Qlm, PyObject * Slm, PyObject * Tlm)"}, + { (char *)"sht_SHqst_to_spat", _wrap_sht_SHqst_to_spat, METH_VARARGS, (char *)"sht_SHqst_to_spat(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * Vr, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_spat_cplx_to_SHqst", _wrap_sht_spat_cplx_to_SHqst, METH_VARARGS, (char *)"sht_spat_cplx_to_SHqst(sht self, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * Qlm, PyObject * Slm, PyObject * Tlm)"}, + { (char *)"sht_SHqst_to_spat_cplx", _wrap_sht_SHqst_to_spat_cplx, METH_VARARGS, (char *)"sht_SHqst_to_spat_cplx(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * Vr, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_SH_to_point", _wrap_sht_SH_to_point, METH_VARARGS, (char *)"sht_SH_to_point(sht self, PyObject * Qlm, double cost, double phi) -> double"}, + { (char *)"sht_SH_to_grad_point", _wrap_sht_SH_to_grad_point, METH_VARARGS, (char *)"sht_SH_to_grad_point(sht self, PyObject * DrSlm, PyObject * Slm, double cost, double phi)"}, + { (char *)"sht_SHqst_to_point", _wrap_sht_SHqst_to_point, METH_VARARGS, (char *)"sht_SHqst_to_point(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, double cost, double phi)"}, + { (char *)"sht_SH_to_lat", _wrap_sht_SH_to_lat, METH_VARARGS, (char *)"sht_SH_to_lat(sht self, PyObject * Qlm, double cost, PyObject * Vr)"}, + { (char *)"sht_SHqst_to_lat", _wrap_sht_SHqst_to_lat, METH_VARARGS, (char *)"sht_SHqst_to_lat(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, double cost, PyObject * Vr, PyObject * Vt, PyObject * Vp)"}, + { (char *)"sht_Zrotate", _wrap_sht_Zrotate, METH_VARARGS, (char *)"sht_Zrotate(sht self, PyObject * Qlm, double alpha) -> PyObject *"}, + { (char *)"sht_Yrotate", _wrap_sht_Yrotate, METH_VARARGS, (char *)"sht_Yrotate(sht self, PyObject * Qlm, double alpha) -> PyObject *"}, + { (char *)"sht_Yrotate90", _wrap_sht_Yrotate90, METH_VARARGS, (char *)"sht_Yrotate90(sht self, PyObject * Qlm) -> PyObject *"}, + { (char *)"sht_Xrotate90", _wrap_sht_Xrotate90, METH_VARARGS, (char *)"sht_Xrotate90(sht self, PyObject * Qlm) -> PyObject *"}, + { (char *)"sht_SH_mul_mx", _wrap_sht_SH_mul_mx, METH_VARARGS, (char *)"sht_SH_mul_mx(sht self, PyObject * mx, PyObject * Qlm) -> PyObject *"}, + { (char *)"sht_spat_to_SH_m", _wrap_sht_spat_to_SH_m, METH_VARARGS, (char *)"sht_spat_to_SH_m(sht self, PyObject * Vr, PyObject * Qlm, PyObject * im)"}, + { (char *)"sht_SH_to_spat_m", _wrap_sht_SH_to_spat_m, METH_VARARGS, (char *)"sht_SH_to_spat_m(sht self, PyObject * Qlm, PyObject * Vr, PyObject * im)"}, + { (char *)"sht_spat_to_SHsphtor_m", _wrap_sht_spat_to_SHsphtor_m, METH_VARARGS, (char *)"sht_spat_to_SHsphtor_m(sht self, PyObject * Vt, PyObject * Vp, PyObject * Slm, PyObject * Tlm, PyObject * im)"}, + { (char *)"sht_SHsphtor_to_spat_m", _wrap_sht_SHsphtor_to_spat_m, METH_VARARGS, (char *)"sht_SHsphtor_to_spat_m(sht self, PyObject * Slm, PyObject * Tlm, PyObject * Vt, PyObject * Vp, PyObject * im)"}, + { (char *)"sht_SHsph_to_spat_m", _wrap_sht_SHsph_to_spat_m, METH_VARARGS, (char *)"sht_SHsph_to_spat_m(sht self, PyObject * Slm, PyObject * Vt, PyObject * Vp, PyObject * im)"}, + { (char *)"sht_SHtor_to_spat_m", _wrap_sht_SHtor_to_spat_m, METH_VARARGS, (char *)"sht_SHtor_to_spat_m(sht self, PyObject * Tlm, PyObject * Vt, PyObject * Vp, PyObject * im)"}, + { (char *)"sht_spat_to_SHqst_m", _wrap_sht_spat_to_SHqst_m, METH_VARARGS, (char *)"sht_spat_to_SHqst_m(sht self, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * im)"}, + { (char *)"sht_SHqst_to_spat_m", _wrap_sht_SHqst_to_spat_m, METH_VARARGS, (char *)"sht_SHqst_to_spat_m(sht self, PyObject * Qlm, PyObject * Slm, PyObject * Tlm, PyObject * Vr, PyObject * Vt, PyObject * Vp, PyObject * im)"}, + { (char *)"sht_swigregister", sht_swigregister, METH_VARARGS, NULL}, + { (char *)"nlm_calc", _wrap_nlm_calc, METH_VARARGS, (char *)"nlm_calc(long lmax, long mmax, long mres) -> long"}, + { (char *)"nlm_cplx_calc", _wrap_nlm_cplx_calc, METH_VARARGS, (char *)"nlm_cplx_calc(long lmax, long mmax, long mres) -> long"}, + { (char *)"set_verbosity", _wrap_set_verbosity, METH_VARARGS, (char *)"set_verbosity(int arg1)"}, + { (char *)"print_version", _wrap_print_version, METH_VARARGS, (char *)"print_version()"}, + { NULL, NULL, 0, NULL } +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ + +static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_double_complex = {"_p_double_complex", "cplx *|double complex *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_int = {"_p_int", "int *", 0, 0, (void*)0, 0}; +static swig_type_info _swigt__p_shtns_info = {"_p_shtns_info", "struct shtns_info *|shtns_info *", 0, 0, (void*)0, 0}; + +static swig_type_info *swig_type_initial[] = { + &_swigt__p_char, + &_swigt__p_double, + &_swigt__p_double_complex, + &_swigt__p_int, + &_swigt__p_shtns_info, +}; + +static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_double[] = { {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_double_complex[] = { {&_swigt__p_double_complex, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_int[] = { {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}}; +static swig_cast_info _swigc__p_shtns_info[] = { {&_swigt__p_shtns_info, 0, 0, 0},{0, 0, 0, 0}}; + +static swig_cast_info *swig_cast_initial[] = { + _swigc__p_char, + _swigc__p_double, + _swigc__p_double_complex, + _swigc__p_int, + _swigc__p_shtns_info, +}; + + +/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ + +static swig_const_info swig_const_table[] = { +{0, 0, 0, 0.0, 0, 0}}; + +#ifdef __cplusplus +} +#endif +/* ----------------------------------------------------------------------------- + * Type initialization: + * This problem is tough by the requirement that no dynamic + * memory is used. Also, since swig_type_info structures store pointers to + * swig_cast_info structures and swig_cast_info structures store pointers back + * to swig_type_info structures, we need some lookup code at initialization. + * The idea is that swig generates all the structures that are needed. + * The runtime then collects these partially filled structures. + * The SWIG_InitializeModule function takes these initial arrays out of + * swig_module, and does all the lookup, filling in the swig_module.types + * array with the correct data and linking the correct swig_cast_info + * structures together. + * + * The generated swig_type_info structures are assigned statically to an initial + * array. We just loop through that array, and handle each type individually. + * First we lookup if this type has been already loaded, and if so, use the + * loaded structure instead of the generated one. Then we have to fill in the + * cast linked list. The cast data is initially stored in something like a + * two-dimensional array. Each row corresponds to a type (there are the same + * number of rows as there are in the swig_type_initial array). Each entry in + * a column is one of the swig_cast_info structures for that type. + * The cast_initial array is actually an array of arrays, because each row has + * a variable number of columns. So to actually build the cast linked list, + * we find the array of casts associated with the type, and loop through it + * adding the casts to the list. The one last trick we need to do is making + * sure the type pointer in the swig_cast_info struct is correct. + * + * First off, we lookup the cast->type name to see if it is already loaded. + * There are three cases to handle: + * 1) If the cast->type has already been loaded AND the type we are adding + * casting info to has not been loaded (it is in this module), THEN we + * replace the cast->type pointer with the type pointer that has already + * been loaded. + * 2) If BOTH types (the one we are adding casting info to, and the + * cast->type) are loaded, THEN the cast info has already been loaded by + * the previous module so we just ignore it. + * 3) Finally, if cast->type has not already been loaded, then we add that + * swig_cast_info to the linked list (because the cast->type) pointer will + * be correct. + * ----------------------------------------------------------------------------- */ + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* c-mode */ +#endif +#endif + +#if 0 +#define SWIGRUNTIME_DEBUG +#endif + + +SWIGRUNTIME void +SWIG_InitializeModule(void *clientdata) { + size_t i; + swig_module_info *module_head, *iter; + int init; + + /* check to see if the circular list has been setup, if not, set it up */ + if (swig_module.next==0) { + /* Initialize the swig_module */ + swig_module.type_initial = swig_type_initial; + swig_module.cast_initial = swig_cast_initial; + swig_module.next = &swig_module; + init = 1; + } else { + init = 0; + } + + /* Try and load any already created modules */ + module_head = SWIG_GetModule(clientdata); + if (!module_head) { + /* This is the first module loaded for this interpreter */ + /* so set the swig module into the interpreter */ + SWIG_SetModule(clientdata, &swig_module); + } else { + /* the interpreter has loaded a SWIG module, but has it loaded this one? */ + iter=module_head; + do { + if (iter==&swig_module) { + /* Our module is already in the list, so there's nothing more to do. */ + return; + } + iter=iter->next; + } while (iter!= module_head); + + /* otherwise we must add our module into the list */ + swig_module.next = module_head->next; + module_head->next = &swig_module; + } + + /* When multiple interpreters are used, a module could have already been initialized in + a different interpreter, but not yet have a pointer in this interpreter. + In this case, we do not want to continue adding types... everything should be + set up already */ + if (init == 0) return; + + /* Now work on filling in swig_module.types */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: size %d\n", swig_module.size); +#endif + for (i = 0; i < swig_module.size; ++i) { + swig_type_info *type = 0; + swig_type_info *ret; + swig_cast_info *cast; + +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); +#endif + + /* if there is another module already loaded */ + if (swig_module.next != &swig_module) { + type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); + } + if (type) { + /* Overwrite clientdata field */ +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found type %s\n", type->name); +#endif + if (swig_module.type_initial[i]->clientdata) { + type->clientdata = swig_module.type_initial[i]->clientdata; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); +#endif + } + } else { + type = swig_module.type_initial[i]; + } + + /* Insert casting types */ + cast = swig_module.cast_initial[i]; + while (cast->type) { + /* Don't need to add information already in the list */ + ret = 0; +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); +#endif + if (swig_module.next != &swig_module) { + ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); +#ifdef SWIGRUNTIME_DEBUG + if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); +#endif + } + if (ret) { + if (type == swig_module.type_initial[i]) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: skip old type %s\n", ret->name); +#endif + cast->type = ret; + ret = 0; + } else { + /* Check for casting already in the list */ + swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); +#ifdef SWIGRUNTIME_DEBUG + if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); +#endif + if (!ocast) ret = 0; + } + } + + if (!ret) { +#ifdef SWIGRUNTIME_DEBUG + printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); +#endif + if (type->cast) { + type->cast->prev = cast; + cast->next = type->cast; + } + type->cast = cast; + } + cast++; + } + /* Set entry in modules->types array equal to the type */ + swig_module.types[i] = type; + } + swig_module.types[i] = 0; + +#ifdef SWIGRUNTIME_DEBUG + printf("**** SWIG_InitializeModule: Cast List ******\n"); + for (i = 0; i < swig_module.size; ++i) { + int j = 0; + swig_cast_info *cast = swig_module.cast_initial[i]; + printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); + while (cast->type) { + printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); + cast++; + ++j; + } + printf("---- Total casts: %d\n",j); + } + printf("**** SWIG_InitializeModule: Cast List ******\n"); +#endif +} + +/* This function will propagate the clientdata field of type to +* any new swig_type_info structures that have been added into the list +* of equivalent types. It is like calling +* SWIG_TypeClientData(type, clientdata) a second time. +*/ +SWIGRUNTIME void +SWIG_PropagateClientData(void) { + size_t i; + swig_cast_info *equiv; + static int init_run = 0; + + if (init_run) return; + init_run = 1; + + for (i = 0; i < swig_module.size; i++) { + if (swig_module.types[i]->clientdata) { + equiv = swig_module.types[i]->cast; + while (equiv) { + if (!equiv->converter) { + if (equiv->type && !equiv->type->clientdata) + SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); + } + equiv = equiv->next; + } + } + } +} + +#ifdef __cplusplus +#if 0 +{ + /* c-mode */ +#endif +} +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + /* Python-specific SWIG API */ +#define SWIG_newvarlink() SWIG_Python_newvarlink() +#define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) +#define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) + + /* ----------------------------------------------------------------------------- + * global variable support code. + * ----------------------------------------------------------------------------- */ + + typedef struct swig_globalvar { + char *name; /* Name of global variable */ + PyObject *(*get_attr)(void); /* Return the current value */ + int (*set_attr)(PyObject *); /* Set the value */ + struct swig_globalvar *next; + } swig_globalvar; + + typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar *vars; + } swig_varlinkobject; + + SWIGINTERN PyObject * + swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { +#if PY_VERSION_HEX >= 0x03000000 + return PyUnicode_InternFromString(""); +#else + return PyString_FromString(""); +#endif + } + + SWIGINTERN PyObject * + swig_varlink_str(swig_varlinkobject *v) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *str = PyUnicode_InternFromString("("); + PyObject *tail; + PyObject *joined; + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + tail = PyUnicode_FromString(var->name); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + if (var->next) { + tail = PyUnicode_InternFromString(", "); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; + } + } + tail = PyUnicode_InternFromString(")"); + joined = PyUnicode_Concat(str, tail); + Py_DecRef(str); + Py_DecRef(tail); + str = joined; +#else + PyObject *str = PyString_FromString("("); + swig_globalvar *var; + for (var = v->vars; var; var=var->next) { + PyString_ConcatAndDel(&str,PyString_FromString(var->name)); + if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); + } + PyString_ConcatAndDel(&str,PyString_FromString(")")); +#endif + return str; + } + + SWIGINTERN int + swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { + char *tmp; + PyObject *str = swig_varlink_str(v); + fprintf(fp,"Swig global variables "); + fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); + SWIG_Python_str_DelForPy3(tmp); + Py_DECREF(str); + return 0; + } + + SWIGINTERN void + swig_varlink_dealloc(swig_varlinkobject *v) { + swig_globalvar *var = v->vars; + while (var) { + swig_globalvar *n = var->next; + free(var->name); + free(var); + var = n; + } + } + + SWIGINTERN PyObject * + swig_varlink_getattr(swig_varlinkobject *v, char *n) { + PyObject *res = NULL; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->get_attr)(); + break; + } + var = var->next; + } + if (res == NULL && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; + } + + SWIGINTERN int + swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { + int res = 1; + swig_globalvar *var = v->vars; + while (var) { + if (strcmp(var->name,n) == 0) { + res = (*var->set_attr)(p); + break; + } + var = var->next; + } + if (res == 1 && !PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); + } + return res; + } + + SWIGINTERN PyTypeObject* + swig_varlink_type(void) { + static char varlink__doc__[] = "Swig var link object"; + static PyTypeObject varlink_type; + static int type_init = 0; + if (!type_init) { + const PyTypeObject tmp = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ +#endif + (char *)"swigvarlink", /* tp_name */ + sizeof(swig_varlinkobject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor) swig_varlink_dealloc, /* tp_dealloc */ + (printfunc) swig_varlink_print, /* tp_print */ + (getattrfunc) swig_varlink_getattr, /* tp_getattr */ + (setattrfunc) swig_varlink_setattr, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + (reprfunc) swig_varlink_str, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + varlink__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ +#if PY_VERSION_HEX >= 0x02020000 + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ +#endif +#if PY_VERSION_HEX >= 0x02030000 + 0, /* tp_del */ +#endif +#if PY_VERSION_HEX >= 0x02060000 + 0, /* tp_version_tag */ +#endif +#if PY_VERSION_HEX >= 0x03040000 + 0, /* tp_finalize */ +#endif +#ifdef COUNT_ALLOCS + 0, /* tp_allocs */ + 0, /* tp_frees */ + 0, /* tp_maxalloc */ +#if PY_VERSION_HEX >= 0x02050000 + 0, /* tp_prev */ +#endif + 0 /* tp_next */ +#endif + }; + varlink_type = tmp; + type_init = 1; +#if PY_VERSION_HEX < 0x02020000 + varlink_type.ob_type = &PyType_Type; +#else + if (PyType_Ready(&varlink_type) < 0) + return NULL; +#endif + } + return &varlink_type; + } + + /* Create a variable linking object for use later */ + SWIGINTERN PyObject * + SWIG_Python_newvarlink(void) { + swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); + if (result) { + result->vars = 0; + } + return ((PyObject*) result); + } + + SWIGINTERN void + SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { + swig_varlinkobject *v = (swig_varlinkobject *) p; + swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + if (gv) { + size_t size = strlen(name)+1; + gv->name = (char *)malloc(size); + if (gv->name) { + strncpy(gv->name,name,size); + gv->get_attr = get_attr; + gv->set_attr = set_attr; + gv->next = v->vars; + } + } + v->vars = gv; + } + + SWIGINTERN PyObject * + SWIG_globals(void) { + static PyObject *_SWIG_globals = 0; + if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); + return _SWIG_globals; + } + + /* ----------------------------------------------------------------------------- + * constants/methods manipulation + * ----------------------------------------------------------------------------- */ + + /* Install Constants */ + SWIGINTERN void + SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { + PyObject *obj = 0; + size_t i; + for (i = 0; constants[i].type; ++i) { + switch(constants[i].type) { + case SWIG_PY_POINTER: + obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); + break; + case SWIG_PY_BINARY: + obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); + break; + default: + obj = 0; + break; + } + if (obj) { + PyDict_SetItemString(d, constants[i].name, obj); + Py_DECREF(obj); + } + } + } + + /* -----------------------------------------------------------------------------*/ + /* Fix SwigMethods to carry the callback ptrs when needed */ + /* -----------------------------------------------------------------------------*/ + + SWIGINTERN void + SWIG_Python_FixMethods(PyMethodDef *methods, + swig_const_info *const_table, + swig_type_info **types, + swig_type_info **types_initial) { + size_t i; + for (i = 0; methods[i].ml_name; ++i) { + const char *c = methods[i].ml_doc; + if (!c) continue; + c = strstr(c, "swig_ptr: "); + if (c) { + int j; + swig_const_info *ci = 0; + const char *name = c + 10; + for (j = 0; const_table[j].type; ++j) { + if (strncmp(const_table[j].name, name, + strlen(const_table[j].name)) == 0) { + ci = &(const_table[j]); + break; + } + } + if (ci) { + void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; + if (ptr) { + size_t shift = (ci->ptype) - types; + swig_type_info *ty = types_initial[shift]; + size_t ldoc = (c - methods[i].ml_doc); + size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; + char *ndoc = (char*)malloc(ldoc + lptr + 10); + if (ndoc) { + char *buff = ndoc; + strncpy(buff, methods[i].ml_doc, ldoc); + buff += ldoc; + strncpy(buff, "swig_ptr: ", 10); + buff += 10; + SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); + methods[i].ml_doc = ndoc; + } + } + } + } + } + } + +#ifdef __cplusplus +} +#endif + +/* -----------------------------------------------------------------------------* + * Partial Init method + * -----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" +#endif + +SWIGEXPORT +#if PY_VERSION_HEX >= 0x03000000 +PyObject* +#else +void +#endif +SWIG_init(void) { + PyObject *m, *d, *md; +#if PY_VERSION_HEX >= 0x03000000 + static struct PyModuleDef SWIG_module = { +# if PY_VERSION_HEX >= 0x03020000 + PyModuleDef_HEAD_INIT, +# else + { + PyObject_HEAD_INIT(NULL) + NULL, /* m_init */ + 0, /* m_index */ + NULL, /* m_copy */ + }, +# endif + (char *) SWIG_name, + NULL, + -1, + SwigMethods, + NULL, + NULL, + NULL, + NULL + }; +#endif + +#if defined(SWIGPYTHON_BUILTIN) + static SwigPyClientData SwigPyObject_clientdata = { + 0, 0, 0, 0, 0, 0, 0 + }; + static PyGetSetDef this_getset_def = { + (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL + }; + static SwigPyGetSet thisown_getset_closure = { + (PyCFunction) SwigPyObject_own, + (PyCFunction) SwigPyObject_own + }; + static PyGetSetDef thisown_getset_def = { + (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure + }; + PyTypeObject *builtin_pytype; + int builtin_base_count; + swig_type_info *builtin_basetype; + PyObject *tuple; + PyGetSetDescrObject *static_getset; + PyTypeObject *metatype; + PyTypeObject *swigpyobject; + SwigPyClientData *cd; + PyObject *public_interface, *public_symbol; + PyObject *this_descr; + PyObject *thisown_descr; + PyObject *self = 0; + int i; + + (void)builtin_pytype; + (void)builtin_base_count; + (void)builtin_basetype; + (void)tuple; + (void)static_getset; + (void)self; + + /* Metaclass is used to implement static member variables */ + metatype = SwigPyObjectType(); + assert(metatype); +#endif + + /* Fix SwigMethods to carry the callback ptrs when needed */ + SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); + +#if PY_VERSION_HEX >= 0x03000000 + m = PyModule_Create(&SWIG_module); +#else + m = Py_InitModule((char *) SWIG_name, SwigMethods); +#endif + + md = d = PyModule_GetDict(m); + (void)md; + + SWIG_InitializeModule(0); + +#ifdef SWIGPYTHON_BUILTIN + swigpyobject = SwigPyObject_TypeOnce(); + + SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); + assert(SwigPyObject_stype); + cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; + if (!cd) { + SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; + SwigPyObject_clientdata.pytype = swigpyobject; + } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { + PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); +# if PY_VERSION_HEX >= 0x03000000 + return NULL; +# else + return; +# endif + } + + /* All objects have a 'this' attribute */ + this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); + (void)this_descr; + + /* All objects have a 'thisown' attribute */ + thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); + (void)thisown_descr; + + public_interface = PyList_New(0); + public_symbol = 0; + (void)public_symbol; + + PyDict_SetItemString(md, "__all__", public_interface); + Py_DECREF(public_interface); + for (i = 0; SwigMethods[i].ml_name != NULL; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); + for (i = 0; swig_const_table[i].name != 0; ++i) + SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); +#endif + + SWIG_InstallConstants(d,swig_const_table); + + + import_array(); // required by NumPy + + SWIG_Python_SetConstant(d, "sht_orthonormal",SWIG_From_int((int)(sht_orthonormal))); + SWIG_Python_SetConstant(d, "sht_fourpi",SWIG_From_int((int)(sht_fourpi))); + SWIG_Python_SetConstant(d, "sht_schmidt",SWIG_From_int((int)(sht_schmidt))); + SWIG_Python_SetConstant(d, "SHT_NO_CS_PHASE",SWIG_From_int((int)((256*4)))); + SWIG_Python_SetConstant(d, "SHT_REAL_NORM",SWIG_From_int((int)((256*8)))); + SWIG_Python_SetConstant(d, "sht_gauss",SWIG_From_int((int)(sht_gauss))); + SWIG_Python_SetConstant(d, "sht_auto",SWIG_From_int((int)(sht_auto))); + SWIG_Python_SetConstant(d, "sht_reg_fast",SWIG_From_int((int)(sht_reg_fast))); + SWIG_Python_SetConstant(d, "sht_reg_dct",SWIG_From_int((int)(sht_reg_dct))); + SWIG_Python_SetConstant(d, "sht_quick_init",SWIG_From_int((int)(sht_quick_init))); + SWIG_Python_SetConstant(d, "sht_reg_poles",SWIG_From_int((int)(sht_reg_poles))); + SWIG_Python_SetConstant(d, "sht_gauss_fly",SWIG_From_int((int)(sht_gauss_fly))); + SWIG_Python_SetConstant(d, "SHT_THETA_CONTIGUOUS",SWIG_From_int((int)(256))); + SWIG_Python_SetConstant(d, "SHT_PHI_CONTIGUOUS",SWIG_From_int((int)((256*2)))); + SWIG_Python_SetConstant(d, "SHT_SOUTH_POLE_FIRST",SWIG_From_int((int)((256*32)))); + SWIG_Python_SetConstant(d, "SHT_SCALAR_ONLY",SWIG_From_int((int)((256*16)))); + SWIG_Python_SetConstant(d, "SHT_LOAD_SAVE_CFG",SWIG_From_int((int)((256*64)))); + SWIG_Python_SetConstant(d, "SHT_ALLOW_GPU",SWIG_From_int((int)((256*128)))); +#if PY_VERSION_HEX >= 0x03000000 + return m; +#else + return; +#endif +} + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/test_suite.sh b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/test_suite.sh new file mode 100755 index 000000000..1ff087eac --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/test_suite.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# script to test many sht cases + +id=`hg id` +log="test_suite.log" + +function test1 { + run="./time_SHT $1 -vector" + echo $run + echo "---" >> $log + echo "*** $run *** " >> $log + $run > tmp.out + cat tmp.out | grep ERROR + cat tmp.out | grep -i nan + cat tmp.out >> $log +} + +echo "beginning test suite for $id" > $log + +# first, do a huge transform : +test1 "2047 -mres=15 -quickinit -iter=1" + +# even bigger : +test1 "7975 -mres=145 -quickinit -iter=1" + +# without threads +test1 "2047 -mres=15 -quickinit -iter=1 -nth=1" + +for switch in "" "-oop" "-transpose" "-schmidt" "-4pi" +do + for mode in "-quickinit" "-gauss" "-reg" "-fly" "-gauss -nth=1" + do + for lmax in 1 2 3 4 11 12 13 14 31 32 33 34 121 122 123 124 + do + for mmax in 0 1 $lmax + do + test1 "$lmax -mmax=$mmax $mode $switch -iter=1" + done + done + for nlat in 32 34 36 38 40 42 44 46 + do + test1 "19 -mmax=10 -nlat=$nlat $mode $switch -iter=10" + done + done +done diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/time_SHT.c b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/time_SHT.c new file mode 100644 index 000000000..cbd1de6ec --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns/time_SHT.c @@ -0,0 +1,907 @@ +/* + * Copyright (c) 2010-2018 Centre National de la Recherche Scientifique. + * written by Nathanael Schaeffer (CNRS, ISTerre, Grenoble, France). + * + * nathanael.schaeffer@univ-grenoble-alpes.fr + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + */ + +/// \file time_SHT.c This program performs some spherical harmonic transforms, and displays timings and accuracy. +/// \c make \c time_SHT to compile, and then run. + +#include +#include +#include +#include +#include +#include "fftw3/fftw3.h" + +// cycle counter from FFTW +#include "fftw3/cycle.h" + +#include + +shtns_cfg shtns; + +complex double *Slm, *Slm0, *Tlm, *Tlm0, *Qlm; // spherical harmonics l,m space +complex double *ShF, *ThF, *NLF; // Fourier space : theta,m +double *Sh, *Th, *NL; // real space : theta,phi (alias of ShF) + +int LMAX,MMAX,MRES,NLM; +int NLAT = 0; +int NPHI = 0; + +// number of SH iterations +int SHT_ITER = 50; // do 50 iterations by default + + +#include + +void runerr(const char * error_text) +{ + printf("%s\n",error_text); + exit(1); +} + +void write_vect(char *fn, double *vec, int N) +{ + FILE *fp; + int i; + + fp = fopen(fn,"w"); + for (i=0;itv_sec - (long) start->tv_sec); + sec += 1.e-6*((long) end->tv_usec - (long) start->tv_usec); + return sec * (1.e3/SHT_ITER); // time in ms. +} + +/// check if an IEEE754 double precision number is finite (works also with -ffinite-math). +int isNotFinite(double x) { + union { + volatile double d; + volatile long i; + } mem; + + mem.d = x; + return (mem.i & 0x7FF0000000000000) == 0x7FF0000000000000; // nan or inf +} + +int allFinite(double* x, int n) { + for (int i=0; ili[i]); + if ((i <= LMAX)||(i >= nlm_cplx)) { // m=0, and 2*m=nphi is real + if (shtns->li[i] <= ltr) Slm[i] = creal(Slm[i]-Slm0[i]); + t = fabs(creal(Slm[i])); + } else { + if (shtns->li[i] <= ltr) Slm[i] -= Slm0[i]; + t = cabs(Slm[i]); + } + n2 += t*t; +// if (isNotFinite(t)) printf("NaN or Inf @ lm=%ld (l=%d) Slm=%g,%g Slm0=%g,%g\n",i,shtns->li[i], creal(Slm[i]), cimag(Slm[i]), creal(Slm0[i]), cimag(Slm0[i])); + if (t>tmax) { tmax = t; jj = i; } + } + if (isNotFinite(sqrt(n2/NLM))) printf("!!! ERROR: nan or inf !!!\n"); + printf(" => max error = %g (l=%d,lm=%ld) rms error = %g",tmax,shtns->li[jj],jj,sqrt(n2/NLM)); + if (tmax > 1e-3) { + if (NLM < 15) { + printf("\n orig:"); + for (i=0; i= nlm_cplx)) { // m=0, and 2*m=nphi is real + printf(" %g",creal(Slm0[i])); + } else { + printf(" %g,%g",creal(Slm0[i]),cimag(Slm0[i])); + } + printf("\n diff:"); + for (i=0; i= nlm_cplx)) { // m=0, and 2*m=nphi is real + printf(" %g",creal(Slm[i])); + } else { + printf(" %g,%g",creal(Slm[i]),cimag(Slm[i])); + } + } + printf(" **** ERROR ****\n"); + } + else printf("\n"); + return(tmax); +} + +double vect_error(complex double *Slm, complex double *Tlm, complex double *Slm0, complex double *Tlm0, int ltr) +{ + long int jj,i; + double tmax0, tmax,t,n2; + +// compute error : + tmax = 0; n2 = 0; jj=0; + for (i=0;i= LiM(shtns, MRES*(NPHI+1)/2,(NPHI+1)/2))) { + if (shtns->li[i] <= ltr) Slm[i] = creal(Slm[i]-Slm0[i]); + t = fabs(creal(Slm[i])); + } else { + if (shtns->li[i] <= ltr) Slm[i] -= Slm0[i]; + t = cabs(Slm[i]); + } + n2 += t*t; + if (t>tmax) { tmax = t; jj = i; } + } + printf(" Spheroidal => max error = %g (l=%d,lm=%ld) rms error = %g",tmax,shtns->li[jj],jj,sqrt(n2/NLM)); + if (tmax > 1e-3) { + if (NLM < 15) { + printf("\n orig:"); + for (i=0; i= NLM)) { // m=0, and 2*m=nphi is real + printf(" %g",creal(Slm0[i])); + } else { + printf(" %g,%g",creal(Slm0[i]),cimag(Slm0[i])); + } + printf("\n diff:"); + for (i=0; i= NLM)) { // m=0, and 2*m=nphi is real + printf(" %g",creal(Slm[i])); + } else { + printf(" %g,%g",creal(Slm[i]),cimag(Slm[i])); + } + } + printf(" **** ERROR ****\n"); + } + else printf("\n"); +// write_vect("Slm",Slm,NLM*2); + tmax0 = tmax; + +// compute error : + tmax = 0; n2 = 0; jj=0; + for (i=0;i= LiM(shtns, MRES*(NPHI+1)/2,(NPHI+1)/2))) { + if (shtns->li[i] <= ltr) Tlm[i] = creal(Tlm[i]- Tlm0[i]); + t = fabs(creal(Tlm[i])); + } else { + if (shtns->li[i] <= ltr) Tlm[i] -= Tlm0[i]; + t = cabs(Tlm[i]); + } + n2 += t*t; + if (t>tmax) { tmax = t; jj = i; } + } + printf(" Toroidal => max error = %g (l=%d,lm=%ld) rms error = %g",tmax,shtns->li[jj],jj,sqrt(n2/NLM)); + if (tmax > 1e-3) { + if (NLM < 15) { + printf("\n orig:"); + for (i=0; i= NLM)) { // m=0, and 2*m=nphi is real + printf(" %g",creal(Tlm0[i])); + } else { + printf(" %g,%g",creal(Tlm0[i]),cimag(Tlm0[i])); + } + printf("\n diff:"); + for (i=0; i= NLM)) { // m=0, and 2*m=nphi is real + printf(" %g",creal(Tlm[i])); + } else { + printf(" %g,%g",creal(Tlm[i]),cimag(Tlm[i])); + } + } + printf(" **** ERROR ****\n"); + } + else printf("\n"); +// write_vect("Tlm",Tlm,NLM*2); + return(tmax > tmax0 ? tmax : tmax0); +} + +void test_SH_point() +{ + long int jj,i; + double ts2, ta2; + struct timeval t1, t2; + + for (i=0;iltr + } + return; +} + +void test_SHT_vect_l(int ltr) +{ + int jj,i; + double ts, ta; + struct timeval t1, t2; + + complex double *S2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + complex double *T2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + + for (i=0;iltr + } + return; +} + +void test_SHT_vect() +{ + int jj,i; + double ts, ta; + struct timeval t1, t2; + + complex double *S2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + complex double *T2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + + for (i=0;iltr + scal_error(Qlm, Tlm0, ltr); // check if the synthesis did not lead to l>ltr + } + + return; +} + +void test_SHT_vect3d() +{ + int jj,i; + double ts, ta; + struct timeval t1, t2; + + complex double *Q2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + complex double *S2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + complex double *T2 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + + for (i=0;i : defines the maximum spherical harmonic order \n"); + printf(" -nphi= : defines the number of azimutal (longitude) point\n"); + printf(" -nlat= : defines the number of grid points in theta (latitude)\n"); + printf(" -mres= : the azimutal periodicity (1 for no symmetry; 2 for two-fold symmetry, ...)\n"); + printf(" -polaropt= : set the threshold for polar optimization. 0 for no polar optimization, 1.e-6 for agressive.\n"); + printf(" -iter= : set the number of back-and-forth transforms to compute timings and errors.\n"); + printf(" -gauss : force gauss grid\n"); + printf(" -fly : force gauss grid with on-the-fly computations only\n"); + printf(" -quickinit : force gauss grid and fast initialiation time (but suboptimal fourier transforms)\n"); + printf(" -vector : time and test also vector transforms (2D and 3D)\n"); + printf(" -reg : use regular grid\n"); + printf(" -regpoles : use regular grid including poles\n"); + printf(" -oop : force out-of-place transform\n"); + printf(" -transpose : force transpose data (ie phi varies fastest)\n"); + printf(" -nlorder : define non-linear order to be resolved.\n"); + printf(" -schmidt : use schmidt semi-normalization.\n"); + printf(" -4pi : use 4pi normalization.\n"); + printf(" -robert : use Robert form, ie spatial vector fields are multiplied by sin(colatitude).\n"); + #ifdef _OPENMP + printf(" -nth= : use n threads.\n"); + #endif +} + +int main(int argc, char *argv[]) +{ + complex double t1, t2; + double t,tmax,n2; + int nthreads = 0; + int i,im,m,l; + clock_t tcpu; + ticks tik0, tik1; + double e0,e1; + double polaropt = 1.e-8; // default for polar optimization. + enum shtns_type shtmode = sht_auto; // default to "auto" (fastest) mode. + enum shtns_norm shtnorm = sht_orthonormal; // default to "orthonormal" SH. + int layout = SHT_NATIVE_LAYOUT; + int nlorder = 0; + int point = 0; + int vector = 0; + int loadsave = 0; + int robert_form = -1; + char name[20]; + FILE* fw; + + srand( time(NULL) ); // initialise les nombres. + shtns_verbose(2); // output some diagnostics. + + printf("time_SHT performs some spherical harmonic transforms, and displays timings and accuracy.\n"); + if (argc < 2) { + usage(); exit(1); + } + +// first argument is lmax, and is mandatory. + sscanf(argv[1],"%lf",&t); LMAX=t; + MMAX=-1; MRES=1; + + for (i=2; i= 0) shtns_robert_form(shtns, robert_form); // keep the default robert_form, unless specified on command line (usefull when built4magic) + NLM = shtns->nlm; + shtns_set_grid_auto(shtns, shtmode | layout, polaropt, nlorder, &NLAT, &NPHI); + + shtns_print_cfg(shtns); + +/* + t1 = 1.0+2.0*I; + t2 = 1.0-I; + printf("test : %f, %f, %f, %f\n",creal(t1),cimag(t1), creal(t2),cimag(t2)); + + (double) t1 = 8.0 +I; + (double) t2 = 8.1; + printf("test : %f, %f, %f, %f\n",creal(t1),cimag(t1), creal(t2),cimag(t2)); +*/ +// write_vect("cost",ct,NLAT); +// write_vect("sint",st,NLAT); + + ShF = (complex double *) shtns_malloc( 2*(NPHI/2+1) * NLAT * sizeof(double)); + Sh = (double *) ShF; + if (ShF == NULL) runerr("memory allocation 1 failed"); + if (vector) { + ThF = (complex double *) shtns_malloc( 2*(NPHI/2+1) * NLAT * sizeof(double)); + Th = (double *) ThF; + NLF = (complex double *) shtns_malloc( 2*(NPHI/2+1) * NLAT * sizeof(double)); + NL = (double *) NLF; + if ((ThF == NULL)||(NLF == NULL)) runerr("memory allocation 2 failed"); + } + + Slm0 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + Slm = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + Tlm = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + if ((Slm0 == NULL)||(Slm == NULL)||(Tlm == NULL)) runerr("memory allocation 3 failed"); + if (vector) { + Tlm0 = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + Qlm = (complex double *) shtns_malloc(sizeof(complex double)* NLM); + if ((Tlm0 == NULL)||(Qlm == NULL)) runerr("memory allocation 4 failed"); + } + +// perform fft tests. +// init_fft_tests(); +// do_fft_tests(); +// exit(0); + + if (NLM < 10000) { +// SH_to_spat + for (i=0;i 0)&&(MRES==1)) + Slm[LiM(shtns, 1,1)] = sh11_st(shtns); +// write_vect("ylm0",Slm, NLM*2); +// SH_to_spat_ml(shtns, 0,Slm, Sh, LMAX); +// spat_to_SH_ml(shtns, 0,Sh, Slm, LMAX); + SH_to_spat(shtns, Slm,Sh); + write_mx("spat",Sh,NPHI,NLAT); + if (vector) { + SHtor_to_spat(shtns, Slm,Sh,Th); + write_mx("spatt",Sh,NPHI,NLAT); + write_mx("spatp",Th,NPHI,NLAT); + SHtor_to_spat_l(shtns, Slm,Sh,Th,LMAX/2); + write_mx("spatt_l",Sh,NPHI,NLAT); + write_mx("spatp_l",Th,NPHI,NLAT); + } + +// SHqst_to_lat(Slm,Slm,Tlm,ct[0],Sh,Th,Th,NPHI/2,LMAX,MMAX); +// write_vect("spat_lat", Sh, NPHI/2); + +/* for (i=0;i<(NLAT/2)*NPHI;i++) { + Sh[i] = 0.0; + } + SHeo_to_spat(Slm, Sh, 0); + write_mx("spate",Sh,NPHI,NLAT/2); + for (i=0;i<(NLAT/2)*NPHI;i++) { + Th[i] = 0.0; + } + SHeo_to_spat(Slm, Th, 1); + write_mx("spato",Th,NPHI,NLAT/2); + + for (i=0;ict[i]; + } + } + spat_to_SH(shtns, Sh,Slm); + write_vect("ylm",(double *)Slm,NLM*2); + } + +// test case... + printf("generating random test case...\n"); + t = 1.0 / (RAND_MAX/2); + for (i=0;i. + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = +F90SRC_FILES = shtns.F90 + +# Object files + +OBJ_FILES = ${FSRC_FILES:.f=.o} \ + $(F90SRC_FILES:.F90=.o) + +# Libraries + +LIB = libshtns_interface.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f .F90 .o +.f.o: + $(FC) $(FCFLAGS) -g -mcmodel=large -c $< +.F90.o: + $(FC) $(FCFLAGS) -g -mcmodel=large -c $< diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns_interface/clean.shtns b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns_interface/clean.shtns new file mode 100644 index 000000000..3a22c30c7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns_interface/clean.shtns @@ -0,0 +1,3 @@ +make[1]: Entering directory `/scratch1/NCEPDEV/hwrf/save/Biju.Thomas/hafs_cmake_hpc_stack/sorc/hafs_tools.fd/sorc/hafs_nwplibs/src/shtns' +rm -f *.mod *.o >& /dev/null +make[1]: Leaving directory `/scratch1/NCEPDEV/hwrf/save/Biju.Thomas/hafs_cmake_hpc_stack/sorc/hafs_tools.fd/sorc/hafs_nwplibs/src/shtns' diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns_interface/shtns.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns_interface/shtns.F90 new file mode 100644 index 000000000..c17fc595f --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/shtns_interface/shtns.F90 @@ -0,0 +1,360 @@ +module shtns + +! fortran95 interface to the SHTNS library +! (http://users.isterre.fr/nschaeff/SHTns/index.html). +! this version hardwired for gaussian grids. + +! The available routines are: + +! SUBROUTINE GRDTOSPEC(datagrid,dataspec): +! converts input gridded data array (datagrid) to complex spectral +! coefficients (dataspec). + +! SUBROUTINE SPECTOGRD(dataspec,datagrid): +! converts input spectral coefficient array (dataspec) to a grid (datagrid). + +! SUBROUTINE GETUV(vrtspec,divspec,ugrid,vgrid,rsphere): +! given input spectral coefficients of vorticity and divergence +! (vrtspec,divspec) calculates gridded winds (ugrid,vgrid). +! rsphere is the radius of the sphere. + +! SUBROUTINE GETVRTDIVSPEC(ugrid,vgrid,vrtspec,divspec,rsphere): +! given input gridded winds (ugrid,vgrid) calculates spectral coefficients +! of vorticity and divergence (vrtspec,divspec). rsphere is the radius of +! the sphere. + +! SUBROUTINE GETGRAD(dataspec,gradx,grady,rsphere): +! calculates gridded vector gradient (gradx,grady) given input +! spectral coefficients. rsphere is the radius of the sphere. + +! SUBROUTINE SHTNS_CLEANUP(): +! Garbage collection. Deallocates all memory. +! Call this when you are done with the module to free up memory. + +! SUBROUTINE SHTNS_INIT(NLONS,NLATS,NTRUNC): +! initialize transform machinery for a given grid and spectral +! truncation. Called automatically by other routines if +! grid (as described by input arrays) changes. + +! module data: +! lats,lons: 2-d arrays with lat/lon values (radians) of transform grid. +! nlm: number of complex spectral coeffs. +! current_nlon, current_nlat: current values of nlons,nlats +! gauwts: 1-d array (length current_nlat) of gaussian quadrature weights. +! current_ntrunc: current spectral truncation +! degree: array with degree (n) for each spectral coefficient. +! order: array with order (m) for each spectral coefficient. +! lap: lapacian operator (-n*(n+1)) +! invlap: inverse of laplacian operator. + +! All of these routines use triangular truncation. +! The spherical harmonic coefficients are normalized using an +! 'orthonormalized' norm +! (http://en.wikipedia.org/wiki/Spherical_harmonics#Conventions). + + implicit none + private + public :: shtns_init,grdtospec,spectogrd,getuv,getvrtdivspec,getgrad,shtns_destroy + public :: gauwts, lats, lons, nlm, degree, order, lap, invlap,& + current_nlon, current_nlat, current_ntrunc, areawts + + integer, parameter :: r_double = selected_real_kind(15) + integer, parameter :: r_kind = selected_real_kind(6) + integer, parameter :: default_real = 1 + + INTEGER, PARAMETER :: SHT_NATIVE_LAYOUT=0 + INTEGER, PARAMETER :: SHT_THETA_CONTIGUOUS=256 + INTEGER, PARAMETER :: SHT_PHI_CONTIGUOUS=512 + INTEGER, PARAMETER :: SHT_NO_CS_PHASE=1024 + INTEGER, PARAMETER :: SHT_REAL_NORM=2048 + INTEGER, PARAMETER :: SHT_ORTHONORMAL=0 + INTEGER, PARAMETER :: SHT_FOURPI=1 + INTEGER, PARAMETER :: SHT_SCHMIDT=2 + INTEGER, PARAMETER :: SHT_GAUSS=0 + INTEGER, PARAMETER :: SHT_AUTO=1 + INTEGER, PARAMETER :: SHT_REG_FAST=2 + INTEGER, PARAMETER :: SHT_REG_DCT=3 + INTEGER, PARAMETER :: SHT_QUICK_INIT=4 + INTEGER, PARAMETER :: SHT_REG_POLES=5 + INTEGER, PARAMETER :: SHT_GAUSS_FLY=6 + REAL(r_double), PARAMETER :: SHT_DEFAULT_POLAR_OPT=1.d-10 + INTEGER, SAVE :: current_nlon = -1 + INTEGER, SAVE :: current_nlat = -1 + INTEGER, SAVE :: current_ntrunc = -1 + INTEGER :: nlm + ! arrays allocated when nlon or nlat or ntrunc change. + REAL(r_kind), DIMENSION(:), ALLOCATABLE :: lap, invlap, gauwts + REAL(r_kind), DIMENSION(:,:), ALLOCATABLE :: lats, lons, areawts + INTEGER, DIMENSION(:), ALLOCATABLE :: degree, order + real(r_double) :: popt ! polar optimization thresh + integer :: nth ! number of threads to use + +contains + + subroutine shtns_init(nlon,nlat,ntrunc,nthreads,polar_opt) + ! initialize library, allocate arrays. + integer, intent(in) :: nlon,nlat,ntrunc + integer, intent(in), optional :: nthreads + real(r_double), intent(in), optional :: polar_opt + real(r_double), dimension(:), allocatable :: lats1,gauwts1 + real(r_double) pi + integer m,n,i,j + if (present(nthreads)) then + nth = nthreads + else + nth = 1 + endif + if (present(polar_opt)) then + popt = polar_opt + else + popt = SHT_DEFAULT_POLAR_OPT + endif + call shtns_destroy() + call shtns_use_threads(nth) ! number of openmp threads. + call shtns_set_size(ntrunc,ntrunc,1,SHT_ORTHONORMAL+SHT_NO_CS_PHASE) + call shtns_precompute(SHT_GAUSS_FLY,SHT_PHI_CONTIGUOUS,popt,nlat,nlon) + call shtns_calc_nlm(nlm,ntrunc,ntrunc,1) + current_nlat = nlat + current_nlon = nlon + current_ntrunc = ntrunc + if (nlm .ne. (ntrunc+1)*(ntrunc+2)/2) then + print *,'error: nlm not what expected',nlm,ntrunc + stop + endif + if (.not. allocated(lats)) allocate(lats(nlon,nlat)) + if (.not. allocated(gauwts)) allocate(gauwts(nlat)) + if (.not. allocated(lons)) allocate(lons(nlon,nlat)) + allocate(lats1(nlat)) + allocate(gauwts1(nlat/2)) + call shtns_cos_array(lats1) + call shtns_gauss_wts(gauwts1) + ! lats is 2d-array (lon,lat), lats1 is 1d + do i=1,nlon + lats(i,:) = asin(lats1) + enddo + do j=1,nlat/2 + gauwts(j) = gauwts1(j) + gauwts(nlat-j+1) = gauwts1(j) + enddo + allocate(areawts(nlon,nlat)) + do i=1,nlon + areawts(i,:) = gauwts(:) + enddo + areawts = areawts/sum(areawts) + pi = 4.*atan(1.0) + do j=1,nlat + do i=1,nlon + lons(i,j) = 2.*pi*real(i-1)/nlon + enddo + enddo + deallocate(lats1,gauwts1) + if (.not. allocated(degree)) allocate(degree(nlm)) + if (.not. allocated(order)) allocate(order(nlm)) + degree = (/((n,n=m,ntrunc),m=0,ntrunc)/) + order = (/((m,n=m,ntrunc),m=0,ntrunc)/) + if (.not. allocated(lap)) allocate(lap(nlm)) + if (.not. allocated(invlap)) allocate(invlap(nlm)) + lap = -degree*(degree+1.0) + invlap = 0 + invlap(2:) = 1./lap(2:) + end subroutine shtns_init + + subroutine shtns_destroy() + ! deallocate arrays. + call shtns_reset() + if (allocated(lats)) deallocate(lats) + if (allocated(gauwts)) deallocate(gauwts) + if (allocated(areawts)) deallocate(areawts) + if (allocated(lons)) deallocate(lons) + if (allocated(degree)) deallocate(degree) + if (allocated(order)) deallocate(order) + if (allocated(lap)) deallocate(lap) + if (allocated(invlap)) deallocate(invlap) + end subroutine shtns_destroy + + subroutine grdtospec(datagrid,dataspec) + ! converts gridded input array (datagrid) to complex spectral coefficients + ! (dataspec). + real(r_kind), dimension(:,:), intent(in) :: datagrid + complex(r_kind), dimension(:), intent(out) :: dataspec + real(r_double), dimension(:,:), allocatable :: datagrid_tmp + complex(r_double), dimension(:), allocatable :: dataspec_tmp + integer nlon,nlat,ntrunc + ! compute array dimensions and infer truncation limit + ! from size of input arrays + nlon = size(datagrid,1) + nlat = size(datagrid,2) + ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 + if (nlon .ne. current_nlon .or. & + nlat .ne. current_nlat .or. & + ntrunc .ne. current_ntrunc) then + call shtns_init(nlon,nlat,ntrunc,nth,popt) + end if + if (default_real .ne. 2) then + ! if inputs not double precision convert, + ! then convert back. + allocate(datagrid_tmp(nlon,nlat)) + allocate(dataspec_tmp(nlm)) + datagrid_tmp = datagrid + call shtns_spat_to_sh(datagrid_tmp, dataspec_tmp) + dataspec = dataspec_tmp + deallocate(datagrid_tmp,dataspec_tmp) + else + call shtns_spat_to_sh(datagrid, dataspec) + endif + end subroutine grdtospec + + subroutine spectogrd(dataspec,datagrid) + ! converts complex spectral coefficients (dataspec) to + ! gridded data array (datagrid). + real(r_kind), dimension(:,:), intent(out) :: datagrid + complex(r_kind), dimension(:), intent(in) :: dataspec + real(r_double), dimension(:,:), allocatable :: datagrid_tmp + complex(r_double), dimension(:), allocatable :: dataspec_tmp + integer nlon,nlat,ntrunc + ! compute array dimensions and infer truncation limit + ! from size of input arrays + nlon = size(datagrid,1) + nlat = size(datagrid,2) + ntrunc = nint((-1.+sqrt(1+8*float(size(dataspec))))/2.)-1 + if (nlon .ne. current_nlon .or. & + nlat .ne. current_nlat .or. & + ntrunc .ne. current_ntrunc) then + call shtns_init(nlon,nlat,ntrunc,nth,popt) + end if + if (default_real .ne. 2) then + allocate(datagrid_tmp(nlon,nlat)) + allocate(dataspec_tmp(nlm)) + dataspec_tmp = dataspec + call shtns_sh_to_spat(dataspec_tmp, datagrid_tmp) + datagrid = datagrid_tmp + deallocate(datagrid_tmp,dataspec_tmp) + else + call shtns_sh_to_spat(dataspec, datagrid) + endif + end subroutine spectogrd + + subroutine getuv(vrtspec,divspec,ugrid,vgrid,rsphere) + ! given spectral coefficients of vorticity and divergence + ! (vrtspec,divspec) compute gridded winds (ugrid,vgrid). + ! rsphere is the radius of the sphere in meters. + real(r_kind), intent(in) :: rsphere + real(r_kind), dimension(:,:), intent(out) :: ugrid,vgrid + complex(r_kind), dimension(:), intent(in) :: vrtspec,divspec + real(r_double), dimension(:,:), allocatable :: ugrid_tmp,vgrid_tmp + complex(r_double), dimension(:), allocatable :: & + vrtspec_tmp,divspec_tmp + integer nlon,nlat,ntrunc + ! compute array dimensions and infer truncation limit + ! from size of input arrays + nlon = size(ugrid,1) + nlat = size(ugrid,2) + ntrunc = nint((-1.+sqrt(1+8*float(size(vrtspec))))/2.)-1 + if (nlon .ne. current_nlon .or. & + nlat .ne. current_nlat .or. & + ntrunc .ne. current_ntrunc) then + call shtns_init(nlon,nlat,ntrunc,nth,popt) + end if + if (default_real .ne. 2) then + allocate(ugrid_tmp(nlon,nlat)) + allocate(vrtspec_tmp(nlm)) + allocate(vgrid_tmp(nlon,nlat)) + allocate(divspec_tmp(nlm)) + vrtspec_tmp = invlap*rsphere*vrtspec + divspec_tmp = invlap*rsphere*divspec + call shtns_sphtor_to_spat(vrtspec_tmp,divspec_tmp,ugrid_tmp,vgrid_tmp) + ugrid = ugrid_tmp + vgrid = vgrid_tmp + deallocate(ugrid_tmp,vgrid_tmp,vrtspec_tmp,divspec_tmp) + else + allocate(vrtspec_tmp(nlm)) + allocate(divspec_tmp(nlm)) + vrtspec_tmp = invlap*rsphere*vrtspec + divspec_tmp = invlap*rsphere*divspec + call shtns_sphtor_to_spat(vrtspec_tmp,divspec_tmp,ugrid,vgrid) + deallocate(vrtspec_tmp,divspec_tmp) + endif + end subroutine getuv + + subroutine getvrtdivspec(ugrid,vgrid,vrtspec,divspec,rsphere) + ! calculate spectral coefficients of vorticity and divergence + ! (vrtspec,divspec) given input gridded winds (ugrid,vgrid). + ! rsphere is the radius of the sphere in meters. + real(r_kind), intent(in) :: rsphere + real(r_kind), dimension(:,:), intent(in) :: ugrid,vgrid + complex(r_kind), dimension(:), intent(out) :: vrtspec,divspec + real(r_double), dimension(:,:), allocatable :: ugrid_tmp,vgrid_tmp + complex(r_double), dimension(:), allocatable :: & + vrtspec_tmp,divspec_tmp + integer nlon,nlat,ntrunc + ! compute array dimensions and infer truncation limit + ! from size of input arrays. + nlon = size(ugrid,1) + nlat = size(ugrid,2) + ntrunc = nint((-1.+sqrt(1+8*float(size(vrtspec))))/2.)-1 + if (nlon .ne. current_nlon .or. & + nlat .ne. current_nlat .or. & + ntrunc .ne. current_ntrunc) then + call shtns_init(nlon,nlat,ntrunc,nth,popt) + end if + if (default_real .ne. 2) then + allocate(ugrid_tmp(nlon,nlat)) + allocate(vrtspec_tmp(nlm)) + allocate(vgrid_tmp(nlon,nlat)) + allocate(divspec_tmp(nlm)) + ugrid_tmp = ugrid + vgrid_tmp = vgrid + call shtns_spat_to_sphtor(ugrid_tmp, vgrid_tmp, vrtspec_tmp, divspec_tmp) + vrtspec = vrtspec_tmp + divspec = divspec_tmp + deallocate(ugrid_tmp,vgrid_tmp,vrtspec_tmp,divspec_tmp) + else + call shtns_spat_to_sphtor(ugrid, vgrid, vrtspec, divspec) + endif + vrtspec = (lap/rsphere)*vrtspec; divspec = (lap/rsphere)*divspec + end subroutine getvrtdivspec + + subroutine getgrad(divspec,ugrid,vgrid,rsphere) + ! given spectral coefficients compute gridded vector gradient. + ! rsphere is the radius of the sphere in meters. + real(r_kind), intent(in) :: rsphere + real(r_kind), dimension(:,:), intent(out) :: ugrid,vgrid + complex(r_kind), dimension(:), intent(in) :: divspec + complex(r_kind), dimension(:), allocatable :: vrtspec + real(r_double), dimension(:,:), allocatable :: ugrid_tmp,vgrid_tmp + complex(r_double), dimension(:), allocatable :: & + vrtspec_tmp,divspec_tmp + integer nlon,nlat,ntrunc + ! compute array dimensions and infer truncation limit + ! from size of input arrays + nlon = size(ugrid,1) + nlat = size(ugrid,2) + ntrunc = nint((-1.+sqrt(1+8*float(size(divspec))))/2.)-1 + if (nlon .ne. current_nlon .or. & + nlat .ne. current_nlat .or. & + ntrunc .ne. current_ntrunc) then + call shtns_init(nlon,nlat,ntrunc,nth,popt) + end if + if (default_real .ne. 2) then + allocate(ugrid_tmp(nlon,nlat)) + allocate(vrtspec_tmp(nlm)) + allocate(vgrid_tmp(nlon,nlat)) + allocate(divspec_tmp(nlm)) + vrtspec_tmp = 0. + divspec_tmp = divspec + call shtns_sphtor_to_spat(vrtspec_tmp,divspec_tmp,ugrid_tmp,vgrid_tmp) + ugrid = ugrid_tmp + vgrid = vgrid_tmp + deallocate(ugrid_tmp,vgrid_tmp,vrtspec_tmp,divspec_tmp) + else + allocate(vrtspec(nlm)) + vrtspec = 0. + call shtns_sphtor_to_spat(vrtspec,divspec,ugrid,vgrid) + deallocate(vrtspec) + endif + ugrid = ugrid/rsphere; vgrid = vgrid/rsphere + end subroutine getgrad + + ! that's it! + +end module shtns diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/Makefile new file mode 100644 index 000000000..983fdb016 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/Makefile @@ -0,0 +1,60 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = fdump.f i1mach.f j4save.f ssort.f xercnt.f xerhlt.f \ + xermsg.f xerprn.f xersve.f xgetua.f +OBJ_FILES = $(FSRC_FILES:.f=.o) + +# Libraries + +LIB = libslatec.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f .o +.f.o: + $(FC) $(FCFLAGS) -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/fdump.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/fdump.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/fdump.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/fdump.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/i1mach.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/i1mach.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/i1mach.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/i1mach.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/j4save.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/j4save.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/j4save.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/j4save.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/ssort.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/ssort.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/ssort.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/ssort.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/xercnt.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xercnt.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/xercnt.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xercnt.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/xerhlt.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xerhlt.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/xerhlt.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xerhlt.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/xermsg.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xermsg.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/xermsg.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xermsg.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/xerprn.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xerprn.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/xerprn.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xerprn.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/xersve.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xersve.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/xersve.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xersve.f diff --git a/sorc/hafs_tools.fd/libsrc/src/slatec/xgetua.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xgetua.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slatec/xgetua.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slatec/xgetua.f diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/Makefile new file mode 100644 index 000000000..b8a559799 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/Makefile @@ -0,0 +1,63 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = kd.F90 uvxyz.F90 slint.F90 + +# Object files + +OBJ_FILES = ${FSRC_FILES:.F90=.o} + +# Libraries + +LIB = libslint.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .F90 .o +.F90.o: + $(FC) $(FCFLAGS) -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/slint/kd.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/kd.F90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slint/kd.F90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/kd.F90 diff --git a/sorc/hafs_tools.fd/libsrc/src/slint/slint.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/slint.F90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slint/slint.F90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/slint.F90 diff --git a/sorc/hafs_tools.fd/libsrc/src/slint/uvxyz.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/uvxyz.F90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/slint/uvxyz.F90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/slint/uvxyz.F90 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/Makefile new file mode 100644 index 000000000..785914add --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/Makefile @@ -0,0 +1,66 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = sondelib.f thermo_subs.f +F90SRC_FILES = aoml_routines.F90 + +# Object files + +OBJ_FILES = $(FSRC_FILES:.f=.o) \ + $(F90SRC_FILES:.F90=.o) + +# Libraries + +LIB = libsondelib.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f .F90 .o +.f.o: + $(FC) $(FCFLAGS) -c $< +.F90.o: + $(FC) $(FCFLAGS) -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/sondelib/aoml_routines.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/aoml_routines.F90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/sondelib/aoml_routines.F90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/aoml_routines.F90 diff --git a/sorc/hafs_tools.fd/libsrc/src/sondelib/sondelib.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/sondelib.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/sondelib/sondelib.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/sondelib.f diff --git a/sorc/hafs_tools.fd/libsrc/src/sondelib/thermo_subs.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/thermo_subs.f similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/sondelib/thermo_subs.f rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/sondelib/thermo_subs.f diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/spline/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/spline/Makefile new file mode 100644 index 000000000..5f104d183 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/spline/Makefile @@ -0,0 +1,62 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +F90SRC_FILES = spline.f90 + +# Object files + +OBJ_FILES = $(F90SRC_FILES:.f90=.o) + +# Libraries + +LIB = libspline.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f90 .o +.f90.o: + $(FC) $(FCFLAGS) -c $< diff --git a/sorc/hafs_tools.fd/libsrc/src/spline/spline.f90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/spline/spline.f90 similarity index 100% rename from sorc/hafs_tools.fd/libsrc/src/spline/spline.f90 rename to sorc/hafs_tools.fd/sorc/hafs_extlibs/spline/spline.f90 diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/Makefile b/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/Makefile new file mode 100644 index 000000000..81dbf33e7 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/Makefile @@ -0,0 +1,67 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# General rules + +include ./../configure.ext-libs + +# Source files + +FSRC_FILES = geomag.f +F90SRC_FILES = wmm_interface.F90 + +# Object files + +OBJ_FILES = $(FSRC_FILES:.f=.o) \ + $(F90SRC_FILES:.F90=.o) + +# Libraries + +LIB = libwmm.a + +# Make calls + +$(LIB): $(OBJ_FILES) + $(AR) $(ARFLAGS) $@ $(OBJ_FILES) + $(RANLIB) $@ + +install: + $(MV) *.mod ./../include + $(MV) $(LIB) ./../lib + +clean: + $(RM) *.mod *.o >& /dev/null + +# Compiling rules + +.SUFFIXES: +.SUFFIXES: .f .F90 .o +.f.o: + $(FC) $(FCFLAGS) -c $< +.F90.o: + $(FC) $(FCFLAGS) -c $< diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/geomag.f b/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/geomag.f new file mode 100644 index 000000000..921ca3582 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/geomag.f @@ -0,0 +1,589 @@ +C*********************************************************************** +C +C +C SUBROUTINE GEOMAG (GEOMAGNETIC FIELD COMPUTATION) +C +C +C*********************************************************************** +C +C GEOMAG IS A NATIONAL GEOSPATIAL INTELLIGENCE AGENCY (NGA) STANDARD +C PRODUCT. IT IS COVERED UNDER NGA MILITARY SPECIFICATION: +C MIL-W-89500 (1993). +C +C*********************************************************************** +C Contact Information +C +C Software and Model Support +C National Geophysical Data Center +C NOAA EGC/2 +C 325 Broadway +C Boulder, CO 80303 USA +C Attn: Susan McLean or Stefan Maus +C Phone: (303) 497-6478 or -6522 +C Email: Susan.McLean@noaa.gov or Stefan.Maus@noaa.gov +C Web: http://www.ngdc.noaa.gov/seg/WMM/ +C +C Sponsoring Government Agency +C National Geospatial-Intelligence Agency +C PRG / CSAT, M.S. L-41 +C 3838 Vogel Road +C Arnold, MO 63010 +C Attn: Craig Rollins +C Phone: (314) 263-4186 +C Email: Craig.M.Rollins@Nga.Mil +C +C Original Program By: +C Dr. John Quinn +C FLEET PRODUCTS DIVISION, CODE N342 +C NAVAL OCEANOGRAPHIC OFFICE (NAVOCEANO) +C STENNIS SPACE CENTER (SSC), MS 39522-5001 +C +C*********************************************************************** +C +C PURPOSE: THIS ROUTINE COMPUTES THE DECLINATION (DEC), +C INCLINATION (DIP), TOTAL INTENSITY (TI) AND +C GRID VARIATION (GV - POLAR REGIONS ONLY, REFERENCED +C TO GRID NORTH OF A STEREOGRAPHIC PROJECTION) OF THE +C EARTH'S MAGNETIC FIELD IN GEODETIC COORDINATES +C FROM THE COEFFICIENTS OF THE CURRENT OFFICIAL +C DEPARTMENT OF DEFENSE (DOD) SPHERICAL HARMONIC WORLD +C MAGNETIC MODEL (WMM.COF). THE WMM SERIES OF MODELS IS +C UPDATED EVERY 5 YEARS ON JANUARY 1ST OF THOSE YEARS +C WHICH ARE DIVISIBLE BY 5 (I.E. 2000, 2005, 2010 ETC.) +C BY NOAA'S NATIONAL GEOPHYSICAL DATA CENTER IN +C COOPERATION WITH THE BRITISH GEOLOGICAL SURVEY (BGS). +C THE MODEL IS BASED ON GEOMAGNETIC FIELD MEASUREMENTS +C FROM SATELLITE AND GROUND OBSERVATORIES. +C +C*********************************************************************** +C +C MODEL: THE WMM SERIES GEOMAGNETIC MODELS ARE COMPOSED +C OF TWO PARTS: THE MAIN FIELD MODEL, WHICH IS +C VALID AT THE BASE EPOCH OF THE CURRENT MODEL AND +C A SECULAR VARIATION MODEL, WHICH ACCOUNTS FOR SLOW +C TEMPORAL VARIATIONS IN THE MAIN GEOMAGNETIC FIELD +C FROM THE BASE EPOCH TO A MAXIMUM OF 5 YEARS BEYOND +C THE BASE EPOCH. FOR EXAMPLE, THE BASE EPOCH OF +C THE WMM-2005 MODEL IS 2005.0. THIS MODEL IS THEREFORE +C CONSIDERED VALID BETWEEN 2005.0 AND 2010.0. THE +C COMPUTED MAGNETIC PARAMETERS ARE REFERENCED TO THE +C WGS-84 ELLIPSOID. +C +C*********************************************************************** +C +C ACCURACY: IN OCEAN AREAS AT THE EARTH'S SURFACE OVER THE +C ENTIRE 5 YEAR LIFE OF THE DEGREE AND ORDER 12 +C SPHERICAL HARMONIC MODEL WMM-2005, THE ESTIMATED +C MAXIMUM RMS ERRORS FOR THE VARIOUS MAGNETIC COMPONENTS +C ARE: +C +C DEC - 0.5 Degrees +C DIP - 0.5 Degrees +C TI - 280.0 nanoTeslas (nT) +C GV - 0.5 Degrees +C +C OTHER MAGNETIC COMPONENTS THAT CAN BE DERIVED FROM +C THESE FOUR BY SIMPLE TRIGONOMETRIC RELATIONS WILL +C HAVE THE FOLLOWING APPROXIMATE ERRORS OVER OCEAN AREAS: +C +C X - 140 nT (North) +C Y - 140 nT (East) +C Z - 200 nT (Vertical) Positive is down +C H - 200 nT (Horizontal) +C +C OVER LAND THE MAXIMUM RMS ERRORS ARE EXPECTED TO BE +C HIGHER, ALTHOUGH THE RMS ERRORS FOR DEC, DIP, AND GV +C ARE STILL ESTIMATED TO BE LESS THAN 1.0 DEGREE, FOR +C THE ENTIRE 5-YEAR LIFE OF THE MODEL AT THE EARTH's +C SURFACE. THE OTHER COMPONENT ERRORS OVER LAND ARE +C MORE DIFFICULT TO ESTIMATE AND SO ARE NOT GIVEN. +C +C THE ACCURACY AT ANY GIVEN TIME FOR ALL OF THESE +C GEOMAGNETIC PARAMETERS DEPENDS ON THE GEOMAGNETIC +C LATITUDE. THE ERRORS ARE LEAST FROM THE EQUATOR TO +C MID-LATITUDES AND GREATEST NEAR THE MAGNETIC POLES. +C +C IT IS VERY IMPORTANT TO NOTE THAT A DEGREE AND +C ORDER 12 MODEL, SUCH AS WMM-2005, DESCRIBES ONLY +C THE LONG WAVELENGTH SPATIAL MAGNETIC FLUCTUATIONS +C DUE TO EARTH'S CORE. NOT INCLUDED IN THE WMM SERIES +C MODELS ARE INTERMEDIATE AND SHORT WAVELENGTH +C SPATIAL FLUCTUATIONS OF THE GEOMAGNETIC FIELD +C WHICH ORIGINATE IN THE EARTH'S MANTLE AND CRUST. +C CONSEQUENTLY, ISOLATED ANGULAR ERRORS AT VARIOUS +C POSITIONS ON THE SURFACE (PRIMARILY OVER LAND, IN +C CONTINENTAL MARGINS AND OVER OCEANIC SEAMOUNTS, +C RIDGES AND TRENCHES) OF SEVERAL DEGREES MAY BE +C EXPECTED. ALSO NOT INCLUDED IN THE MODEL ARE +C NONSECULAR TEMPORAL FLUCTUATIONS OF THE GEOMAGNETIC +C FIELD OF MAGNETOSPHERIC AND IONOSPHERIC ORIGIN. +C DURING MAGNETIC STORMS, TEMPORAL FLUCTUATIONS CAN +C CAUSE SUBSTANTIAL DEVIATIONS OF THE GEOMAGNETIC +C FIELD FROM MODEL VALUES. IN ARCTIC AND ANTARCTIC +C REGIONS, AS WELL AS IN EQUATORIAL REGIONS, DEVIATIONS +C FROM MODEL VALUES ARE BOTH FREQUENT AND PERSISTENT. +C +C IF THE REQUIRED DECLINATION ACCURACY IS MORE +C STRINGENT THAN THE WMM SERIES OF MODELS PROVIDE, THEN +C THE USER IS ADVISED TO REQUEST SPECIAL (REGIONAL OR +C LOCAL) SURVEYS BE PERFORMED AND MODELS PREPARED. +C REQUESTS OF THIS NATURE SHOULD BE MADE TO NIMA +C AT THE ADDRESS ABOVE. +C +C*********************************************************************** +C +C USAGE: THIS ROUTINE IS BROKEN UP INTO TWO PARTS: +C +C A) AN INITIALIZATION MODULE, WHICH IS CALLED ONLY +C ONCE AT THE BEGINNING OF THE MAIN (CALLING) +C PROGRAM +C B) A PROCESSING MODULE, WHICH COMPUTES THE MAGNETIC +C FIELD PARAMETERS FOR EACH SPECIFIED GEODETIC +C POSITION (ALTITUDE, LATITUDE, LONGITUDE) AND TIME +C +C INITIALIZATION IS MADE VIA A SINGLE CALL TO THE MAIN +C ENTRY POINT (GEOMAG), WHILE SUBSEQUENT PROCESSING +C CALLS ARE MADE THROUGH THE SECOND ENTRY POINT (GEOMG1). +C ONE CALL TO THE PROCESSING MODULE IS REQUIRED FOR EACH +C POSITION AND TIME. +C +C THE VARIABLE MAXDEG IN THE INITIALIZATION CALL IS THE +C MAXIMUM DEGREE TO WHICH THE SPHERICAL HARMONIC MODEL +C IS TO BE COMPUTED. IT MUST BE SPECIFIED BY THE USER +C IN THE CALLING ROUTINE. NORMALLY IT IS 12 BUT IT MAY +C BE SET LESS THAN 12 TO INCREASE COMPUTATIONAL SPEED AT +C THE EXPENSE OF REDUCED ACCURACY. +C +C THE PC VERSION OF THIS SUBROUTINE MUST BE COMPILED +C WITH A FORTRAN 77 COMPATIBLE COMPILER SUCH AS THE +C MICROSOFT OPTIMIZING FORTRAN COMPILER VERSION 4.1 +C OR LATER. +C +C********************************************************************** +C +C REFERENCES: +C +C JOHN M. QUINN, DAVID J. KERRIDGE AND DAVID R. BARRACLOUGH, +C WORLD MAGNETIC CHARTS FOR 1985 - SPHERICAL HARMONIC +C MODELS OF THE GEOMAGNETIC FIELD AND ITS SECULAR +C VARIATION, GEOPHYS. J. R. ASTR. SOC. (1986) 87, +C PP 1143-1157 +C +C DEFENSE MAPPING AGENCY TECHNICAL REPORT, TR 8350.2: +C DEPARTMENT OF DEFENSE WORLD GEODETIC SYSTEM 1984, +C SEPT. 30 (1987) +C +C JOHN M. QUINN, RACHEL J. COLEMAN, MICHAEL R. PECK, AND +C STEPHEN E. LAUBER; THE JOINT US/UK 1990 EPOCH +C WORLD MAGNETIC MODEL, TECHNICAL REPORT NO. 304, +C NAVAL OCEANOGRAPHIC OFFICE (1991) +C +C JOHN M. QUINN, RACHEL J. COLEMAN, DONALD L. SHIEL, AND +C JOHN M. NIGRO; THE JOINT US/UK 1995 EPOCH WORLD +C MAGNETIC MODEL, TECHNICAL REPORT NO. 314, NAVAL +C OCEANOGRAPHIC OFFICE (1995) +C +C SUSAN AMCMILLAN, DAVID R. BARRACLOUGH, JOHN M. QUINN, AND +C RACHEL J. COLEMAN; THE 1995 REVISION OF THE JOINT US/UK +C GEOMAGNETIC FIELD MODELS - I. SECULAR VARIATION, JOURNAL OF +C GEOMAGNETISM AND GEOELECTRICITY, VOL. 49, PP. 229-243 +C (1997) +C +C JOHN M. QUINN, RACHEL J. COELMAN, SUSAM MACMILLAN, AND +C DAVID R. BARRACLOUGH; THE 1995 REVISION OF THE JOINT +C US/UK GEOMAGNETIC FIELD MODELS: II. MAIN FIELD,JOURNAL OF +C GEOMAGNETISM AND GEOELECTRICITY, VOL. 49, PP. 245 - 261 +C (1997) +C +C*********************************************************************** +C +C PARAMETER DESCRIPTIONS: +C +C A - SEMIMAJOR AXIS OF WGS-84 ELLIPSOID (KM) +C B - SEMIMINOR AXIS OF WGS-84 ELLIPSOID (KM) +C RE - MEAN RADIUS OF IAU-66 ELLIPSOID (KM) +C SNORM - SCHMIDT NORMALIZATION FACTORS +C C - GAUSS COEFFICIENTS OF MAIN GEOMAGNETIC MODEL (NT) +C CD - GAUSS COEFFICIENTS OF SECULAR GEOMAGNETIC MODEL (NT/YR) +C TC - TIME ADJUSTED GEOMAGNETIC GAUSS COEFFICIENTS (NT) +C OTIME - TIME ON PREVIOUS CALL TO GEOMAG (YRS) +C OALT - GEODETIC ALTITUDE ON PREVIOUS CALL TO GEOMAG (YRS) +C OLAT - GEODETIC LATITUDE ON PREVIOUS CALL TO GEOMAG (DEG.) +C TIME - COMPUTATION TIME (YRS) (INPUT) +C (EG. 1 JULY 1995 = 1995.500) +C ALT - GEODETIC ALTITUDE (KM) (INPUT) +C GLAT - GEODETIC LATITUDE (DEG.) (INPUT) +C GLON - GEODETIC LONGITUDE (DEG.) (INPUT) +C EPOCH - BASE TIME OF GEOMAGNETIC MODEL (YRS) +C DTR - DEGREE TO RADIAN CONVERSION +C SP(M) - SINE OF (M*SPHERICAL COORD. LONGITUDE) +C CP(M) - COSINE OF (M*SPHERICAL COORD. LONGITUDE) +C ST - SINE OF (SPHERICAL COORD. LATITUDE) +C CT - COSINE OF (SPHERICAL COORD. LATITUDE) +C R - SPHERICAL COORDINATE RADIAL POSITION (KM) +C CA - COSINE OF SPHERICAL TO GEODETIC VECTOR ROTATION ANGLE +C SA - SINE OF SPHERICAL TO GEODETIC VECTOR ROTATION ANGLE +C BR - RADIAL COMPONENT OF GEOMAGNETIC FIELD (NT) +C BT - THETA COMPONENT OF GEOMAGNETIC FIELD (NT) +C BP - PHI COMPONENT OF GEOMAGNETIC FIELD (NT) +C P(N,M) - ASSOCIATED LEGENDRE POLYNOMIALS (UNNORMALIZED) +C PP(N) - ASSOCIATED LEGENDRE POLYNOMIALS FOR M=1 (UNNORMALIZED) +C DP(N,M)- THETA DERIVATIVE OF P(N,M) (UNNORMALIZED) +C BX - NORTH GEOMAGNETIC COMPONENT (NT) +C BY - EAST GEOMAGNETIC COMPONENT (NT) +C BZ - VERTICALLY DOWN GEOMAGNETIC COMPONENT (NT) +C BH - HORIZONTAL GEOMAGNETIC COMPONENT (NT) +C DEC - GEOMAGNETIC DECLINATION (DEG.) (OUTPUT) +C EAST=POSITIVE ANGLES +C WEST=NEGATIVE ANGLES +C DIP - GEOMAGNETIC INCLINATION (DEG.) (OUTPUT) +C DOWN=POSITIVE ANGLES +C UP=NEGATIVE ANGLES +C TI - GEOMAGNETIC TOTAL INTENSITY (NT) (OUTPUT) +C GV - GEOMAGNETIC GRID VARIATION (DEG.) (OUTPUT) +C REFERENCED TO GRID NORTH +C GRID NORTH REFERENCED TO 0 MERIDIAN +C OF A POLAR STEREOGRAPHIC PROJECTION +C (ARCTIC/ANTARCTIC ONLY) +C MAXDEG - MAXIMUM DEGREE OF SPHERICAL HARMONIC MODEL (INPUT) +C MOXORD - MAXIMUM ORDER OF SPHERICAL HARMONIC MODEL +C +C*********************************************************************** +C +C NOTE: THIS VERSION OF GEOMAG USES A WMM SERIES GEOMAGNETIC +C FIELS MODEL REFERENCED TO THE WGS-84 GRAVITY MODEL +C ELLIPSOID +C +C*********************************************************************** +C +C +C INITIALIZATION MODULE +C +C +C*********************************************************************** +C +C + SUBROUTINE GEOMAG(MAXDEG,EPOCH,COF_FILE) +C + IMPLICIT NONE +C + CHARACTER*500 COF_FILE + INTEGER MAXDEG + REAL EPOCH +C + INTEGER N, M, MAXORD, J + REAL PI, DTR, A, B, RE, A2, B2, C2, A4, B4, C4 + REAL GNM, HNM, DGNM, DHNM, FLNMJ + REAL OTIME, OALT, OLAT +C + REAL C(0:12,0:12), CD(0:12,0:12) + REAL P(0:12,0:12), DP(0:12,0:12), SNORM(0:12,0:12) + REAL SP(0:12), CP(0:12), FN(0:12), FM(0:12), PP(0:12) + REAL K(0:12,0:12) +C + COMMON /INIT/ MAXORD, PI, DTR, A, B, RE, A2, B2, C2, A4, + 1 B4, C4, OTIME, OALT, OLAT, + 2 C, CD, P, DP, SP, CP, FN, FM, PP, K +C + CHARACTER*20 MODEL +C EQUIVALENCE (SNORM,P) + + OPEN (UNIT=9,FILE=TRIM(ADJUSTL(COF_FILE))) +C +C +C +C +C +C +C INITIALIZE CONSTANTS +C +C +C + MAXDEG=12 + READ(9,1) EPOCH,MODEL + 1 FORMAT(4X,F6.1,5X,A) + IF (MAXDEG .GT. 12) MAXDEG=12 + MAXORD=MAXDEG + PI=3.14159265359 + DTR=PI/180.0 + SP(0)=0. + CP(0)=1. + P(0,0)=1. + PP(0)=1. + DP(0,0)=0. + A=6378.137 + B=6356.7523142 + RE=6371.2 + A2=A**2 + B2=B**2 + C2=A2-B2 + A4=A2**2 + B4=B2**2 + C4=A4-B4 +C +C READ WORLD MAGNETIC MODEL SPHERICAL HARMONIC COEFFICIENTS +C + C(0,0)=0.0 + CD(0,0)=0.0 + 3 CONTINUE + READ(9,4) N,M,GNM,HNM,DGNM,DHNM + 4 FORMAT(2(1X,I2),2(1X,F9.1),2(1X,F10.1)) + IF (N .EQ. 99) GO TO 5 + IF (M .LE. N) THEN + C(N,M)=GNM + CD(N,M)=DGNM + IF (M .NE. 0) THEN + C(M-1,N)=HNM + CD(M-1,N)=DHNM + ENDIF + ENDIF + GO TO 3 + 5 CONTINUE + CLOSE (UNIT=9) +C +C CONVERT SCHMIDT NORMALIZED GAUSS COEFFICIENTS TO UNNORMALIZED +C + SNORM(0,0)=1. + DO 20 N=1,MAXORD + SNORM(N,0)=SNORM(N-1,0)*FLOAT(2*N-1)/FLOAT(N) + J=2 + DO 10 M=0,N + K(N,M)=FLOAT((N-1)**2-M**2)/FLOAT((2*N-1)*(2*N-3)) + IF (M .GT. 0) THEN + FLNMJ=FLOAT((N-M+1)*J)/FLOAT(N+M) + SNORM(N,M)=SNORM(N,M-1)*SQRT(FLNMJ) + J=1 + C(M-1,N)=SNORM(N,M)*C(M-1,N) + CD(M-1,N)=SNORM(N,M)*CD(M-1,N) + ENDIF + C(N,M)=SNORM(N,M)*C(N,M) + CD(N,M)=SNORM(N,M)*CD(N,M) + 10 CONTINUE + FN(N)=FLOAT(N+1) + FM(N)=FLOAT(N) + 20 CONTINUE + K(1,1)=0. +C +C + OTIME=-1000. + OALT=-1000. + OLAT=-1000. +C +C + RETURN + END +C +C +C*********************************************************************** +C +C +C PROCESSING MODULE +C +C +C*********************************************************************** +C +C + SUBROUTINE GEOMG1(ALT,GLAT,GLON,TIME,DEC,DIP,TI,GV,EPOCH) +C + IMPLICIT NONE +C + INTEGER N, M, MAXORD + REAL ALT, GLAT, GLON, TIME, DEC, DIP, TI, GV, EPOCH + REAL DT, RLON, RLAT, SRLON, SRLAT, CRLON, CRLAT + REAL SRLON2, SRLAT2, CRLON2, CRLAT2 + REAL Q, Q1, Q2, CT, ST, R2, R, D, CA, SA, AOR, AR + REAL BR, BT, BP, BPP, PAR, TEMP1, TEMP2, PARP + REAL BX, BY, BZ, BH +C + REAL PI, DTR, A, B, RE, A2, B2, C2, A4, B4, C4 + REAL OTIME, OALT, OLAT +c + REAL C(0:12,0:12), CD(0:12,0:12), TC(0:12,0:12) + REAL P(0:12,0:12), DP(0:12,0:12), SNORM(0:12,0:12) + REAL SP(0:12), CP(0:12), FN(0:12), FM(0:12), PP(0:12) + REAL K(0:12,0:12) + + COMMON /INIT/ MAXORD, PI, DTR, A, B, RE, A2, B2, C2, A4, + 1 B4, C4, OTIME, OALT, OLAT, + 2 C, CD, P, DP, SP, CP, FN, FM, PP, K + +C + DT = TIME - EPOCH + RLON=GLON*DTR + RLAT=GLAT*DTR + SRLON=SIN(RLON) + SRLAT=SIN(RLAT) + CRLON=COS(RLON) + CRLAT=COS(RLAT) + SRLON2=SRLON**2 + SRLAT2=SRLAT**2 + CRLON2=CRLON**2 + CRLAT2=CRLAT**2 + SP(1)=SRLON + CP(1)=CRLON +C +C CONVERT FROM GEODETIC COORDS. TO SPHERICAL COORDS. +C + Q=SQRT(A2-C2*SRLAT2) + Q1=ALT*Q + Q2=((Q1+A2)/(Q1+B2))**2 + CT=SRLAT/SQRT(Q2*CRLAT2+SRLAT2) + ST=SQRT(1.0-CT**2) + R2=ALT**2+2.0*Q1+(A4-C4*SRLAT2)/Q**2 + R=SQRT(R2) + D=SQRT(A2*CRLAT2+B2*SRLAT2) + CA=(ALT+D)/R + SA=C2*CRLAT*SRLAT/(R*D) +C +C + DO 40 M=2,MAXORD + SP(M)=SP(1)*CP(M-1)+CP(1)*SP(M-1) + CP(M)=CP(1)*CP(M-1)-SP(1)*SP(M-1) + 40 CONTINUE +C +C + AOR=RE/R + AR=AOR**2 +C +C + BR=0. + BT=0. + BP=0. + BPP=0. +C +C + DO 70 N=1,MAXORD + AR=AR*AOR + DO 60 M=0,N +C +C COMPUTE UNNORMALIZED ASSOCIATED LEGENDRE POLYNOMIALS +C AND DERIVATIVES VIA RECURSION RELATIONS +C + IF (ALT .NE. OALT .OR. GLAT .NE. OLAT) THEN + IF (N .EQ. M) THEN + P(N,M)=ST*P(N-1,M-1) + DP(N,M)=ST*DP(N-1,M-1)+CT*P(N-1,M-1) + GO TO 50 + ENDIF + IF (N .EQ. 1 .AND. M .EQ. 0) THEN + P(N,M)=CT*P(N-1,M) + DP(N,M)=CT*DP(N-1,M)-ST*P(N-1,M) + GO TO 50 + ENDIF + IF (N .GT. 1 .AND. N .NE. M) THEN + IF (M .GT. N-2) P(N-2,M)=0.0 + IF (M .GT. N-2) DP(N-2,M)=0.0 + P(N,M)=CT*P(N-1,M)-K(N,M)*P(N-2,M) + DP(N,M)=CT*DP(N-1,M)-ST*P(N-1,M)-K(N,M)*DP(N-2,M) + ENDIF + ENDIF + 50 CONTINUE +C +C TIME ADJUST THE GAUSS COEFFICIENTS +C + IF (TIME .NE. OTIME) THEN + TC(N,M)=C(N,M)+DT*CD(N,M) + IF (M .NE. 0) THEN + TC(M-1,N)=C(M-1,N)+DT*CD(M-1,N) + ENDIF + ENDIF +C +C ACCUMULATE TERMS OF THE SPHERICAL HARMONIC EXPANSIONS +C + PAR=AR*P(N,M) + IF (M .EQ. 0) THEN + TEMP1=TC(N,M)*CP(M) + TEMP2=TC(N,M)*SP(M) + ELSE + TEMP1=TC(N,M)*CP(M)+TC(M-1,N)*SP(M) + TEMP2=TC(N,M)*SP(M)-TC(M-1,N)*CP(M) + ENDIF + BT=BT-AR*TEMP1*DP(N,M) + BP=BP+FM(M)*TEMP2*PAR + BR=BR+FN(N)*TEMP1*PAR +C +C SPECIAL CASE: NORTH/SOUTH GEOGRAPHIC POLES +C + IF (ST .EQ. 0.0 .AND. M .EQ. 1) THEN + IF (N .EQ. 1) THEN + PP(N)=PP(N-1) + ELSE + PP(N)=CT*PP(N-1)-K(N,M)*PP(N-2) + ENDIF + PARP=AR*PP(N) + BPP=BPP+FM(M)*TEMP2*PARP + ENDIF +C +C + 60 CONTINUE + 70 CONTINUE +C +C + IF (ST .EQ. 0.0) THEN + BP=BPP + ELSE + BP=BP/ST + ENDIF +C +C ROTATE MAGNETIC VECTOR COMPONENTS FROM SPHERICAL TO +C GEODETIC COORDINATES +C + BX=-BT*CA-BR*SA + BY=BP + BZ=BT*SA-BR*CA +C +C COMPUTE DECLINATION (DEC), INCLINATION (DIP) AND +C TOTAL INTENSITY (TI) +C + BH=SQRT(BX**2+BY**2) + TI=SQRT(BH**2+BZ**2) + DEC=ATAN2(BY,BX)/DTR + DIP=ATAN2(BZ,BH)/DTR +C +C COMPUTE MAGNETIC GRID VARIATION IF THE CURRENT +C GEODETIC POSITION IS IN THE ARCTIC OR ANTARCTIC +C (I.E. GLAT > +55 DEGREES OR GLAT < -55 DEGREES) +C +C OTHERWISE, SET MAGNETIC GRID VARIATION TO -999.0 +C + GV=-999.0 + IF (ABS(GLAT) .GE. 55.) THEN + IF (GLAT .GT. 0. .AND. GLON .GE. 0.) GV=DEC-GLON + IF (GLAT .GT. 0. .AND. GLON .LT. 0.) GV=DEC+ABS(GLON) + IF (GLAT .LT. 0. .AND. GLON .GE. 0.) GV=DEC+GLON + IF (GLAT .LT. 0. .AND. GLON .LT. 0.) GV=DEC-ABS(GLON) + IF (GV .GT. +180.) GV=GV-360. + IF (GV .LT. -180.) GV=GV+360. + ENDIF +C +C + OTIME=TIME + OALT=ALT + OLAT=GLAT +C +C + RETURN + END + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/wmm_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/wmm_interface.F90 new file mode 100644 index 000000000..9ce8d968b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_extlibs/wmm/wmm_interface.F90 @@ -0,0 +1,107 @@ +module wmm_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! wmm :: wmm_interface + ! Copyright (C) 2020 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: wmm_compute + public :: wmm_struct + + ! Define local variables + + integer, parameter :: wmm_intkind = 4 + integer, parameter :: wmm_realkind = 4 + type wmm_struct + character(len=500) :: coeff_filepath + real(wmm_realkind) :: alt + real(wmm_realkind) :: dec + real(wmm_realkind) :: dip + real(wmm_realkind) :: glat + real(wmm_realkind) :: glon + real(wmm_realkind) :: gv + real(wmm_realkind) :: ti + real(wmm_realkind) :: year + end type wmm_struct + integer(wmm_intkind) :: maxdeg = 12 + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! wmm_compute.f90 + + ! DESCRIPTION: + + ! This subroutine computes the attributes of the geomagnetic field + ! using the World Magnetic Model (WMM). + + ! INPUT VARIABLES: + + ! * wmm; a FORTRAN wmm_struct variable containing the year for which + ! to derive the geomagnetic field attributes (year), the filepath + ! for the WMM coefficients (coeff_filepath), the reference + ! geographical location (described by glat and glon) and altitude + ! relative to the Earth's surface (alt). + + ! OUTPUT VARIABLES: + + ! * wmm; a FORTRAN wmm_struct variable containing the geomagnetic + ! field attributes for declination (magnetic variation; dec), + ! inclination (dip), the total intensity (ti), and the grid + ! variation (gv). + + !----------------------------------------------------------------------- + + subroutine wmm_compute(wmm) + + ! Define variables passed to routine + + type(wmm_struct) :: wmm + + !===================================================================== + + ! Define local variables + + call geomag(maxdeg,wmm%year,wmm%coeff_filepath) + + ! Compute local variables + + call geomg1(wmm%alt,wmm%glat,wmm%glon,wmm%year,wmm%dec,wmm%dip, & + & wmm%ti,wmm%gv,wmm%year) + + !===================================================================== + + end subroutine wmm_compute + + !======================================================================= + +end module wmm_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/CMakeLists.txt b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/CMakeLists.txt new file mode 100644 index 000000000..1633e04de --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/CMakeLists.txt @@ -0,0 +1,79 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +cmake_minimum_required(VERSION 3.15) +project( + OBS_PREPROC + LANGUAGES C Fortran) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/Modules/") + +if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_Fortran_COMPILER_ID}") +endif() + +if(NOT CMAKE_C_COMPILER_ID MATCHES "^(Intel|GNU)$") + message(WARNING "Compiler not officially supported: ${CMAKE_C_COMPILER_ID}") +endif() + +find_package(NetCDF REQUIRED C Fortran) +find_package(bufr REQUIRED) +find_package(MPI REQUIRED) + +set(fortran_srcs + kinds_interface.F90 + constants_interface.F90 + variable_interface.F90 + namelist_interface.F90 + diagnostics_interface.F90 + math_methods_interface.F90 + grid_methods_interface.F90 + meteo_methods_interface.F90 + bufrio_interface.F90 + json_interface.F90 + netcdf_interface.F90 + fileio_interface.F90 + time_methods_interface.F90 + bufr_obs_interface.F90 + forecast_model_interface.F90 + recon_tdr_interface.F90 + recon_vdm_interface.F90 + sonde_tempdrop_interface.F90 + observations_interface.F90 + obs_preproc_interface.F90 + main.F90) + +set(exe_name hafs_obs_preproc.x) +message("TYPE CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}") +set(exec_dir ${CMAKE_SOURCE_DIR}/../../exec) +set(ext_dir ${CMAKE_SOURCE_DIR}/../hafs_extlibs/lib) +set(ext_inc_dir ${CMAKE_SOURCE_DIR}/../hafs_extlibs/include) + +set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -O3 -fp-model precise -assume byterecl -convert big_endian") + +add_executable(${exe_name} ${fortran_srcs}) + +target_include_directories( + ${exe_name} PUBLIC + ${ext_inc_dir}) + +target_link_libraries( + ${exe_name} + bufr::bufr_d + ${ext_dir}/libfson.a + ${ext_dir}/libgridprojs.a + ${ext_dir}/libgridtrans.a + ${ext_dir}/libkdtree.a + NetCDF::NetCDF_Fortran + NetCDF::NetCDF_C + MPI::MPI_Fortran + ${ext_dir}/libslatec.a + ${ext_dir}/libsondelib.a + ${ext_dir}/libspline.a + ${ext_dir}/libspline.a + ${ext_dir}/libwmm.a) + + install(TARGETS ${exe_name} DESTINATION ${exec_dir}) diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile new file mode 100644 index 000000000..0bf867a07 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile @@ -0,0 +1,71 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +SHELL=/bin/sh + +# Machine dependent compile options + +MAKE_CONF = Makefile.conf +MAKE_DEPEND = Makefile.dependency +include $(MAKE_CONF) +include $(MAKE_DEPEND) +include configure.obs-preproc + +# Make calls + +"" : + @$(MAKE) -f Makefile all + +clean: + - $(RM) $(EXEC) *.o *.mod + +# Source files + +SRCS = $(SRCSF77) $(SRCSF90) + +# Object files + +OBJS = $(SRCSF90:.F90=.o) $(SRCSF77:.f=.o) + +# Compiling rules + +.SUFFIXES : +.SUFFIXES : .F90 .f .c .o + +.F90.o : + $(FC) $(FCFFLAGS) $(LIBS) $(INCS) -c $< + +.f.o : + $(F77) $(FCFFLAGS) $(LIBS) $(INCS) -c $< + +# Compiler + +all: $(EXEC) + +$(EXEC): $(OBJS) + $(LD) $(LDFLAGS) $(OBJS) main.F90 $(LIBS) $(INCS) -lm -o ./$(EXEC) diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile.conf b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile.conf new file mode 100644 index 000000000..a7a907154 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile.conf @@ -0,0 +1,85 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# Fortran compiler and options + +LD = $(FC) +LDFLAGS = $(FCFFLAGS) + +# Library dependencies + +LIBbufr = -L$(BUFR)/lib -lbufr +LIBfson = -L$(FSON)/lib -lfson +LIBgridprojs = -L$(GRIDPROJS)/lib -lgridprojs +LIBgridtrans = -L$(GRIDTRANS)/lib -lgridtrans +LIBkdtree = -L$(KDTREE)/lib -lkdtree +LIBnetcdf = -L$(NETCDF)/lib -lnetcdff +LIBslatec = -L$(SLATEC)/lib -lslatec +LIBsondelib = -L$(SONDELIB)/lib -lsondelib +LIBspline = -L$(SPLINE)/lib -lspline +LIBwmm = -L$(WMM)/lib -lwmm +LIBS = $(LIBbufr) $(LIBfson) $(LIBgridprojs) $(LIBgridtrans) $(LIBkdtree) $(LIBnetcdf) $(LIBslatec) $(LIBsondelib) $(LIBspline) $(LIBwmm) + +# Module dependencies + +INCbufr = -I$(BUFR)/include +INCfson = -I$(FSON)/include +INCgridprojs = -I$(GRIDPROJS)/include +INCgridtrans = -I$(GRIDTRANS)/include +INCkdtree = -I$(KDTREE)/include +INCnetcdf = -I$(NETCDF)/include +INCS = $(INCfson) $(INCgridprojs) $(INCgridtrans) $(INCkdtree) $(INCnetcdf) $(INCbufr) + +# Executable + +EXEC = obs_preproc.x + +# Source files + +SRCSF90 = kinds_interface.F90 \ + constants_interface.F90 \ + variable_interface.F90 \ + namelist_interface.F90 \ + diagnostics_interface.F90 \ + math_methods_interface.F90 \ + grid_methods_interface.F90 \ + meteo_methods_interface.F90 \ + bufrio_interface.F90 \ + json_interface.F90 \ + netcdf_interface.F90 \ + fileio_interface.F90 \ + time_methods_interface.F90 \ + bufr_obs_interface.F90 \ + forecast_model_interface.F90 \ + recon_tdr_interface.F90 \ + recon_vdm_interface.F90 \ + sonde_tempdrop_interface.F90 \ + observations_interface.F90 \ + obs_preproc_interface.F90 + +SRCSF77 = diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile.dependency b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile.dependency new file mode 100644 index 000000000..7896b61d0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/Makefile.dependency @@ -0,0 +1,131 @@ +#======================================================================= + +#$$$ MAKEFILE DOCUMENTATION BLOCK + +# Copyright (C) 2018 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +bufr_obs_interface.o: bufr_obs_interface.F90 \ + namelist_interface.o \ + time_methods_interface.o \ + variable_interface.o + +bufrio_interface.o: bufrio_interface.F90 \ + kinds_interface.o \ + namelist_interface.o \ + variable_interface.o + +constants_interface.o: constants_interface.F90 \ + kinds_interface.o + +diagnostics_interface.o: diagnostics_interface.F90 \ + kinds_interface.o + +fileio_interface.o: fileio_interface.F90 \ + kinds_interface.o \ + namelist_interface.o \ + netcdf_interface.o \ + variable_interface.o + +forecast_model_interface.o: forecast_model_interface.F90 \ + bufrio_interface.o \ + constants_interface.o \ + fileio_interface.o \ + grid_methods_interface.o \ + kinds_interface.o \ + math_methods_interface.o \ + namelist_interface.o \ + time_methods_interface.o \ + variable_interface.o + +grid_methods_interface.o: grid_methods_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + variable_interface.o + +json_interface.o: json_interface.F90 \ + kinds_interface.o \ + variable_interface.o + +kinds_interface.o: kinds_interface.F90 + +math_methods_interface.o: math_methods_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + variable_interface.o + +meteo_methods_interface.o: meteo_methods_interface.F90 \ + constants_interface.o \ + kinds_interface.o \ + variable_interface.o + +namelist_interface.o: namelist_interface.F90 \ + kinds_interface.o \ + variable_interface.o + +netcdf_interface.o: netcdf_interface.F90 \ + kinds_interface.o \ + variable_interface.o + +observations_interface.o: observations_interface.F90 \ + forecast_model_interface.o \ + kinds_interface.o \ + bufr_obs_interface.o \ + recon_tdr_interface.o \ + recon_vdm_interface.o \ + sonde_tempdrop_interface.o + +recon_tdr_interface.o: recon_tdr_interface.F90 \ + bufrio_interface.o \ + namelist_interface.o \ + time_methods_interface.o \ + variable_interface.o + +recon_vdm_interface.o: recon_vdm_interface.F90 \ + bufrio_interface.o \ + fileio_interface.o \ + grid_methods_interface.o \ + math_methods_interface.o \ + meteo_methods_interface.o \ + namelist_interface.o \ + time_methods_interface.o \ + variable_interface.o + +sonde_tempdrop_interface.o: sonde_tempdrop_interface.F90 \ + bufrio_interface.o \ + constants_interface.o \ + fileio_interface.o \ + grid_methods_interface.o \ + kinds_interface.o \ + math_methods_interface.o \ + meteo_methods_interface.o \ + namelist_interface.o \ + time_methods_interface.o \ + variable_interface.o + +time_methods_interface.o: time_methods_interface.F90 \ + kinds_interface.o + +variable_interface.o: variable_interface.F90 \ + kinds_interface.o diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/bufr_obs_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/bufr_obs_interface.F90 new file mode 100644 index 000000000..f7b99a6fb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/bufr_obs_interface.F90 @@ -0,0 +1,437 @@ +module bufr_obs_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: bufr_obs_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use namelist_interface + use time_methods_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: bufr_obs_update + + ! Define local variables + + logical :: in_bufr_open = .false. + logical :: out_bufr_open = .false. + integer :: iret + integer, parameter :: unit_in = 10 + integer, parameter :: unit_out = 20 + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! bufr_obs_update.f90 + + ! DESCRIPTION: + + ! This is the driver-level subroutine to compute the temporal window + ! for which to parse observations and to subsequently write those + ! respective observations to an external BUFR-formatted file. + + !----------------------------------------------------------------------- + + subroutine bufr_obs_update() + + ! Define variables computed within routine + + type(timeinfo_struct) :: timeinfo + + !===================================================================== + + ! Define local variables + + call valid_times(timeinfo) + + ! Compute local variables + + call readwrite_bufrobs(bufr_obs_filename,timeinfo) + + !===================================================================== + + end subroutine bufr_obs_update + + !======================================================================= + + ! SUBROUTINE: + + ! close_bufr.f90 + + ! DESCRIPTION: + + ! This subroutine closes all open input and output files designated + ! by the unit_in and unit_out local variables, respectively. + + !----------------------------------------------------------------------- + + subroutine close_bufr() + + !===================================================================== + + ! Define local variables + + close(unit_in) + call closbf(unit_in) + close(unit_out) + call closbf(unit_out) + + !===================================================================== + + end subroutine close_bufr + + !======================================================================= + + ! SUBROUTINE: + + ! init_bufr.f90 + + ! DESCRIPTION: + + ! This subroutine initializes the BUFR file interfaces for the input + ! and output files. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the BUFR-formatted file to be parsed. + + !----------------------------------------------------------------------- + + subroutine init_bufr(filename) + + ! Define variables passed to routine + + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + call datelen(10) + if(in_bufr_open) call closbf(unit_in) + open(unit_in,file=trim(adjustl(filename)),form='unformatted', & + & status='old') + call openbf(unit_in,'IN',unit_in) + in_bufr_open = .true. + + ! Check local variable and proceed accordingly + + if(.not. out_bufr_open) then + + ! Define local variables + + open(unit_out,file=trim(adjustl(bufr_filepath)), & + & form='unformatted') + call openbf(unit_out,'OUT',unit_in) + out_bufr_open = .true. + + end if ! if(.not. out_bufr_open) + + !===================================================================== + + end subroutine init_bufr + + !======================================================================= + + ! SUBROUTINE: + + ! readwrite_bufrobs.f90 + + ! DESCRIPTION: + + ! This subroutine parses the BUFR records from a user specified file + ! and computes the time-stamp attributes; if the observation + ! time-stamp attributes occur between the user specified threshold + ! values (relative to the analysis time-stamp), the respective BUFR + ! record is written to the external file defined by the unit_out + ! local variable. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the BUFR-formatted file to be parsed. + + ! * timeinfo; a FORTRAN timeinfo_struct variable containing the + ! Julian day values corresponding to the observation wind + ! specified by the user. + + !----------------------------------------------------------------------- + + subroutine readwrite_bufrobs(filename,timeinfo) + + ! Define variables passed to routine + + type(timeinfo_struct) :: timeinfo + character(len=500) :: filename(:) + + ! Define variables computed within routine + + character(len=10) :: datestr + character(len=8) :: subset + real(r_double) :: bufrtype(6) + real(r_double) :: dhr + real(r_double) :: obs_jday + integer :: dd + integer :: hh + integer :: idate + integer :: ireadmg + integer :: ireadsb + integer :: mm + integer :: nn + integer :: nobs_copy + integer :: nobs_total + integer :: obs_idate + integer :: ss + integer :: yyyy + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + nobs_copy = 0 + nobs_total = 0 + + ! Loop through local variable + + do i = 1, nbufr_obs_files + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(filename(i))) + call init_bufr(filename(i)) + + ! Loop through local variable + + do while(ireadmg(unit_in,subset,idate) .eq. 0) + + ! Define local variables + + call openmb(unit_out,subset,timeinfo%idate) + if(is_gpsrobufr) call maxout(100000) + + ! Loop through local variable + + do while(ireadsb(unit_in) .eq. 0) + + ! Define local variables + + nobs_total = nobs_total + 1 + + ! Check local variable and proceed accordingly + + if(is_gpsrobufr) then + + ! Define local variables + + call ufbint(unit_in,bufrtype,size(bufrtype),1,iret, & + & 'YEAR MNTH DAYS HOUR MINU SECO') + yyyy = int(bufrtype(1)) + mm = int(bufrtype(2)) + dd = int(bufrtype(3)) + hh = int(bufrtype(4)) + nn = int(bufrtype(5)) + ss = int(bufrtype(6)) + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss, & + & obs_jday) + + end if ! if(is_gpsrobufr) + + ! Check local variable and proceed accordingly + + if(is_prepbufr) then + + ! Define local variables + + call ufbint(unit_in,bufrtype,2,1,iret,'DHR TYP') + write(datestr,'(i10)') idate + read(datestr,'(i4.4,3(i2.2))') yyyy, mm, dd, hh + nn = 0 + ss = 0 + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss, & + & obs_jday) + obs_jday = obs_jday + bufrtype(1)/24.0 + + end if ! if(is_prepbufr) + + ! Check local variable and proceed accordingly + + if(is_satbufr) then + + ! Define local variables + + call ufbint(unit_in,bufrtype,size(bufrtype),1,iret, & + & 'YEAR MNTH DAYS HOUR MINU SECO') + yyyy = int(bufrtype(1)) + mm = int(bufrtype(2)) + dd = int(bufrtype(3)) + hh = int(bufrtype(4)) + nn = int(bufrtype(5)) + ss = int(bufrtype(6)) + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss, & + & obs_jday) + + end if ! if(is_satbufr) + + ! Check local variable and proceed accordingly + + if((obs_jday .ge. timeinfo%minjday) .and. (obs_jday .le. & + & timeinfo%maxjday)) then + + ! Define local variables + + nobs_copy = nobs_copy + 1 + + ! Define local variables + + call ufbcpy(unit_in,unit_out) + + ! Check local variable and proceed accordingly + + if(is_prepbufr) then + + ! Compute local variables + + dhr = (timeinfo%jday - obs_jday)/24.0 + + ! Define local variables + + bufrtype(1) = dhr + call ufbint(unit_out,bufrtype(1),1,1,iret,'DHR') + + end if ! if(is_prepbufr) + + ! Define local variables + + call writsb(unit_out) + + end if ! if((obs_jday .ge. timeinfo%minjday) + ! .and. (obs_jday .le. timeinfo%maxjday)) + + end do ! do while(ireadsb(unit_in) .eq. 0) + + end do ! do while(ireadmg(unit_in,subset,idate) .eq. 0) + + end do ! do i = 1, nbufr_obs_files + + ! Define local variables + + call close_bufr() + if(debug) write(6,501) nobs_copy, nobs_total, bufr_obs_mindate, & + & bufr_obs_maxdate +500 format('READWRITE_BUFROBS: Reading BUFR file ',a,'.') +501 format('READWRITE_BUFROBS: ',i,1x,'observations of ',i,1x,' are ', & + & 'within the time-window ',a19,1x,'to ',a19,1x,'.') + + !===================================================================== + + end subroutine readwrite_bufrobs + + !======================================================================= + + ! SUBROUTINE: + + ! valid_times.f90 + + ! DESCRIPTION: + + ! This subroutine computes the Julian day values corresponding to + ! the observation window specified by the user. + + ! INPUT VARIABLES: + + ! * timeinfo; a FORTRAN timeinfo_struct variable. + + ! OUTPUT VARIABLES: + + ! * timeinfo; a FORTRAN timeinfo_struct variable containing the + ! Julian day values corresponding to the observation wind + ! specified by the user. + + !----------------------------------------------------------------------- + + subroutine valid_times(timeinfo) + + ! Define variables passed to routine + + type(timeinfo_struct) :: timeinfo + + ! Define variables computed within routine + + integer :: dd + integer :: hh + integer :: mm + integer :: nn + integer :: ss + integer :: yyyy + + !===================================================================== + + ! Define local variables + + call time_methods_date_attributes(analdate,yyyy,mm,dd,hh,nn,ss) + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,timeinfo%jday) + write(timeinfo%idatestr,'(i4.4,i2.2,i2.2,i2.2)') yyyy, mm, dd, hh + read(timeinfo%idatestr,'(i10)') timeinfo%idate + call time_methods_date_attributes(bufr_obs_mindate,yyyy,mm,dd,hh,nn, & + & ss) + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,timeinfo%minjday) + call time_methods_date_attributes(bufr_obs_maxdate,yyyy,mm,dd,hh,nn, & + & ss) + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,timeinfo%maxjday) + + !===================================================================== + + end subroutine valid_times + + !======================================================================= + +end module bufr_obs_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/bufrio_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/bufrio_interface.F90 new file mode 100644 index 000000000..23cdd6760 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/bufrio_interface.F90 @@ -0,0 +1,749 @@ +module bufrio_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: bufrio_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + use namelist_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: bufrio_interface_close + public :: bufrio_interface_idate + public :: bufrio_interface_nrecs + public :: bufrio_interface_open + public :: bufrio_interface_readhdrall + public :: bufrio_interface_readhdruniq + public :: bufrio_interface_write + public :: bufr_iret + + ! Define local variables + + logical :: bufr_exist = .false. + integer, parameter :: unit_in = 10 + integer, parameter :: unit_out = 20 + integer, parameter :: unit_tbl = 30 + integer :: bufr_iret + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! bufrio_interface_close.f90 + + ! DESCRIPTION: + + ! This subroutine closes the user specified BUFR file path assigned + ! to the local module variable unit_out. + + ! INPUT VARIABLES: + + ! * bufr_read; a FORTRAN logical variable indicating whether the + ! file to be closed has been opened for reading. + + ! * bufr_write; a FORTRAN logical variable indicating whether the + ! file to be closed has been opened for writing. + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_close(bufr_read,bufr_write) + + ! Define variables passed to routine + + logical :: bufr_read + logical :: bufr_write + + !===================================================================== + + ! Define local variables + + if(bufr_read) then + call closbf(unit_in) + end if ! if(bufr_read) + if(bufr_write) then + close(unit_tbl) + call closmg(unit_out) + call closbf(unit_out) + end if ! if(bufr_write) + + !===================================================================== + + end subroutine bufrio_interface_close + + !======================================================================= + + ! SUBROUTINE: + + ! bufio_interface_idate.f90 + + ! DESCRIPTION: + + ! This subroutine defines the integer date string for the BUFR file. + + ! INPUT VARIABLES: + + ! * datestr; a FORTRAN character string specifying the analysis + ! date, formatted as (assuming UNIX convention) + ! 'yyyy-mm-dd_HH:MM:SS'. + + ! * bufr; a FORTRAN bufr_struct variable. + + ! OUTPUT VARIABLES: + + ! * bufr; a FORTRAN bufr_struct variable containing the 'idate' + ! variable attribute value. + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_idate(datestr,bufr) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + character(len=19) :: datestr + + ! Define variables computed within routine + + character(len=10) :: strdate + integer :: dateint + integer :: strint + + !===================================================================== + + ! Define local variables + + write(strdate,'(a4,a2,a2,a2)') datestr(1:4), datestr(6:7), & + & datestr(9:10), datestr(12:13) + read(strdate,500) dateint + bufr%idate = dateint +500 format(i10) + + !===================================================================== + + end subroutine bufrio_interface_idate + + !======================================================================= + + ! SUBROUTINE: + + ! bufrio_interface_nrecs.f90 + + ! DESCRIPTION: + + ! This subroutine counts the number of BUFR messages within the user + ! specified BUFR formatted file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + ! * tablename; a FORTRAN character string specifying the full-path + ! to the file containing the BUFR table. + + ! * bufr; a FORTRAN bufr_struct variable, containing (at minimum) + ! the variable 'idate'. + + ! * nrecs; a FORTRAN integer variable to define the number of BUFR + ! messages. + + ! OUTPUT VARIABLES: + + ! * nrecs; a FORTRAN integer variable defining the number of BUFR + ! messages within the user specified BUFR file. + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_nrecs(filename,tablename,bufr) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + character(len=500) :: filename + character(len=500) :: tablename + + ! Define variables computed within routine + + character(len=8) :: msgtype + integer :: ireadmg + integer :: nrecs + + !===================================================================== + + ! Define local variables + + nrecs = 0 + call bufrio_interface_open(filename,tablename,bufr,.true.,.false., & + & .false.) + + ! Loop through local variable + + do while(ireadmg(unit_in,msgtype,bufr%idate) == 0) + + ! Define local variables + + nrecs = nrecs + 1 + + end do ! do while(ireadmg(unit_in,msgtype,bufr%idate) == 0) + + ! Define local variables + + bufr%nrecs = nrecs + call bufrio_interface_close(.true.,.false.) + + !===================================================================== + + end subroutine bufrio_interface_nrecs + + !======================================================================= + + ! SUBROUTINE: + + ! bufrio_interface_open.f90 + + ! DESCRIPTION: + + ! This subroutine checks for the existence of BUFR formatted file, + ! specified by the file path provided by the user; the BUFR table + ! provided by the user is written to the BUFR file and and the + ! respective file is prepared for the BUFR records to be written. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + ! * tablename; a FORTRAN character string specifying the full-path + ! to the file containing the BUFR table. + + ! * bufr; a FORTRAN bufr_struct variable, containing (at minimum) + ! the variable 'idate'. + + ! * bufr_read; a FORTRAN logical variable indicating whether the + ! file to be closed has been opened for reading. + + ! * bufr_write; a FORTRAN logical variable indicating whether the + ! file to be closed has been opened for writing. + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_open(filename,tablename,bufr,bufr_read, & + & bufr_read_write,bufr_write) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + character(len=500) :: filename + character(len=500) :: tablename + logical :: bufr_read + logical :: bufr_read_write + logical :: bufr_write + + !===================================================================== + + ! Define local variables + + inquire(file = trim(adjustl(filename)),exist = bufr_exist) + if(bufr_read) then + call read_bufr_open(filename) + call openbf(unit_in,'IN',unit_in) + end if ! if(bufr_read) + if(bufr_read_write) then + call read_write_bufr_open(filename) + call openbf(unit_in,'IN',unit_in) + call openbf(unit_out,'OUT',unit_in) + end if ! if(bufr_read_write) + if(bufr_write) then + call write_bufr_open(filename) + call write_bufr_table(tablename) + call openmb(unit_out,bufr%subset,bufr%idate) + end if ! if(bufr_write) + + !===================================================================== + + end subroutine bufrio_interface_open + + !======================================================================= + + ! SUBROUTINE: + + ! bufrio_interface_readhdrall.f90 + + ! DESCRIPTION: + + ! This subroutine reads the user specified BUFR header string(s) and + ! returns all values for the respective header string(s). + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + ! * bufr; a FORTRAN bufr_struct variable, containing (at minimum) + ! the header strings to seek (hdstr), the total number of + ! mnuemonics (mxmn), and the total number of levels (mxlv). + + ! * bufrhdr; a FORTRAN bufrhdr variable. + + ! OUTPUT VARIABLES: + + ! * bufrhdr; a FORTRAN bufrhdr variable containing the values for + ! the user specified header string(s). + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_readhdrall(filename,bufr,bufrhdr) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + type(bufrhdr_struct) :: bufrhdr + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=8) :: subset + real(r_double) :: bufrtype(bufr%mxmn) + integer :: idate + integer :: ireadmg + integer :: ireadsb + integer :: nlev + integer :: nrecs + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + open(unit_in,file=trim(adjustl(filename)),form='unformatted', & + & convert='big_endian') + call openbf(unit_in,'IN',unit_in) + call readmg(unit_in,subset,bufr%idate,bufr_iret) + bufr%nrecs = 0 + + ! Loop through local variable + + msg_report1: do while(ireadmg(unit_in,subset,idate) .eq. 0) + + ! Loop through local variable + + sb_report1: do while(ireadsb(unit_in) .eq. 0) + + ! Define local variables + + call ufbint(unit_in,bufrtype,bufr%mxmn,bufr%mxlv,nlev, & + & trim(adjustl(bufr%hdstr))) + bufr%nrecs = bufr%nrecs + 1 + + end do sb_report1 ! do while(ireadsb(unit_in) .eq. 0) + + end do msg_report1 ! do while(ireadmg(unit_in,subset,idate) + ! .eq. 0) + + ! Define local variables + + call closbf(unit_in) + bufrhdr%mxmn = bufr%mxmn + bufrhdr%nrecs = bufr%nrecs + call variable_interface_setup_struct(bufrhdr) + nrecs = 0 + open(unit_in,file=trim(adjustl(filename)),form='unformatted', & + & convert='big_endian') + call openbf(unit_in,'IN',unit_in) + + ! Loop through local variable + + msg_report2: do while(ireadmg(unit_in,subset,idate) .eq. 0) + + ! Loop through local variable + + sb_report2: do while(ireadsb(unit_in) .eq. 0) + + ! Define local variables + + call ufbint(unit_in,bufrtype,bufr%mxmn,bufr%mxlv,nlev, & + & trim(adjustl(bufr%hdstr))) + nrecs = nrecs + 1 + bufrhdr%hdr(1:bufrhdr%mxmn,nrecs) = bufrtype(1:bufr%mxmn) + + end do sb_report2 ! do while(ireadsb(unit_in) .eq. 0) + + end do msg_report2 ! do while(ireadmg(unit_in,subset,idate) + ! .eq. 0) + + ! Define local variables + + call closbf(unit_in) + + !===================================================================== + + end subroutine bufrio_interface_readhdrall + + !======================================================================= + + ! SUBROUTINE: + + ! bufrio_interface_readhdruniq.f90 + + ! DESCRIPTION: + + ! This subroutine reads the user specified BUFR header string(s) and + ! returns all unique values for the respective header string(s). + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + ! * bufr; a FORTRAN bufr_struct variable, containing (at minimum) + ! the header strings to seek (hdstr), the total number of + ! mnuemonics (mxmn), and the total number of levels (mxlv). + + ! * bufrhdr; a FORTRAN bufrhdr variable. + + ! OUTPUT VARIABLES: + + ! * bufrhdr; a FORTRAN bufrhdr variable containing the unique values + ! for the user specified header string(s). + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_readhdruniq(filename,bufr,bufrhdr) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + type(bufrhdr_struct) :: bufrhdr + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=8) :: subset + real(r_double), dimension(:), allocatable :: bufrhdrarr + real(r_double) :: bufrtype(bufr%mxmn) + integer :: ireadmg + integer :: ireadsb + integer :: nlev + integer :: nrecs + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + open(unit_in,file=trim(adjustl(filename)),form='unformatted', & + & convert='big_endian') + call openbf(unit_in,'IN',unit_in) + nrecs = 0 + + ! Loop through local variable + + msg_report1: do while(ireadmg(unit_in,subset,bufr%idate) .eq. 0) + + ! Loop through local variable + + sb_report1: do while(ireadsb(unit_in) .eq. 0) + + ! Define local variables + + call ufbint(unit_in,bufrtype,bufr%mxmn,bufr%mxlv,nlev, & + & trim(adjustl(bufr%hdstr))) + nrecs = nrecs + 1 + + end do sb_report1 ! do while(ireadsb(unit_in) .eq. 0) + + end do msg_report1 ! do while(ireadmg(unit_in,subset,bufr%idate) + ! .eq. 0) + + ! Define local variables + + call closbf(unit_in) + + ! Allocate memory for local variables + + if(.not. allocated(bufrhdrarr)) allocate(bufrhdrarr(nrecs)) + + ! Define local variables + + open(unit_in,file=trim(adjustl(filename)),form='unformatted', & + & convert='big_endian') + call openbf(unit_in,'IN',unit_in) + bufrhdrarr = dble(spval) + nrecs = 0 + + ! Loop through local variable + + msg_report2: do while(ireadmg(unit_in,subset,bufr%idate) .eq. 0) + + ! Loop through local variable + + sb_report2: do while(ireadsb(unit_in) .eq. 0) + + ! Define local variables + + call ufbint(unit_in,bufrtype,bufr%mxmn,bufr%mxlv,nlev, & + & trim(adjustl(bufr%hdstr))) + + ! Check local variable and proceed accordingly + + if(all(bufrhdrarr(1:nrecs) .ne. bufrtype(1))) then + + ! Define local variables + + nrecs = nrecs + 1 + bufrhdrarr(nrecs) = bufrtype(1) + + end if ! if(any(bufrhdrarr(1:nrecs) .ne. bufrtype(1))) + + end do sb_report2 ! do while(ireadsb(unit_in) .eq. 0) + + end do msg_report2 ! do while(ireadmg(unit_in,subset,bufr%idate) + ! .eq. 0) + + ! Define local variables + + call closbf(unit_in) + bufrhdr%mxmn = 1 + bufrhdr%nrecs = nrecs + call variable_interface_setup_struct(bufrhdr) + + ! Loop through local variable + + do i = 1, bufrhdr%nrecs + + ! Define local variables + + bufrhdr%hdr(1:bufrhdr%mxmn,i) = bufrhdrarr(i) + + end do ! do i = 1, bufrhdr%nrecs + + ! Deallocate memory for local variables + + if(allocated(bufrhdrarr)) deallocate(bufrhdrarr) + + !===================================================================== + + end subroutine bufrio_interface_readhdruniq + + !======================================================================= + + ! SUBROUTINE: + + ! bufrio_interface_write.f90 + + ! DESCRIPTION: + + ! This subroutine writes a BUFR formatted record to an external, + ! open BUFR file. + + ! INPUT VARIABLES: + + ! * bufr; a FORTRAN bufr_struct variable containing the BUFR + ! variables describing the respective BUFR record. + + !----------------------------------------------------------------------- + + subroutine bufrio_interface_write(bufr) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + + !===================================================================== + + ! Define local variables + + call ufbint(unit_out,bufr%hdr,bufr%mxmn,1,bufr_iret,bufr%hdstr) + call ufbint(unit_out,bufr%obs,bufr%mxmn,bufr%mxlv,bufr_iret, & + & bufr%obstr) + call ufbint(unit_out,bufr%oer,bufr%mxmn,bufr%mxlv,bufr_iret, & + & bufr%oestr) + call ufbint(unit_out,bufr%qcf,bufr%mxmn,bufr%mxlv,bufr_iret, & + & bufr%qcstr) + call writsb(unit_out) + + !===================================================================== + + end subroutine bufrio_interface_write + + !======================================================================= + + ! SUBROUTINE: + + ! read_bufr_open.f90 + + ! DESCRIPTION: + + ! This subroutine opens the user specified BUFR file path and + ! assigns the open file unit to the local module variable unit_out. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + !----------------------------------------------------------------------- + + subroutine read_bufr_open(filename) + + ! Define variables passed to routine + + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + open(unit_in,file=trim(adjustl(filename)),action='read',form= & + & 'unformatted',convert='big_endian') + + !===================================================================== + + end subroutine read_bufr_open + + !======================================================================= + + ! SUBROUTINE: + + ! read_write_bufr_open.f90 + + ! DESCRIPTION: + + ! This subroutine opens the user specified BUFR file path and + ! assigns the open file unit to the local module variable unit_out. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + !----------------------------------------------------------------------- + + subroutine read_write_bufr_open(filename) + + ! Define variables passed to routine + + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + open(unit_in,file=trim(adjustl(filename)),form='unformatted', & + & action='readwrite',convert='big_endian') + + !===================================================================== + + end subroutine read_write_bufr_open + + !======================================================================= + + ! SUBROUTINE: + + ! write_bufr_tbl.f90 + + ! DESCRIPTION: + + ! This subroutine opens the user specified BUFR table and write the + ! respective BUFR table to the user specified BUFR file path. + + ! INPUT VARIABLES: + + ! * tablename; a FORTRAN character string specifying the full-path + ! to the file containing the BUFR table. + + !----------------------------------------------------------------------- + + subroutine write_bufr_table(tablename) + + ! Define variables passed to routine + + character(len=500) :: tablename + + !===================================================================== + + ! Define local variables + + open(unit_tbl,file = trim(adjustl(tablename)),action='read') + if(bufr_exist) call openbf(unit_out,'APN',unit_tbl) + if(.not. bufr_exist) call openbf(unit_out,'OUT',unit_tbl) + + !===================================================================== + + end subroutine write_bufr_table + + !======================================================================= + + ! SUBROUTINE: + + ! write_bufr_open.f90 + + ! DESCRIPTION: + + ! This subroutine opens the user specified BUFR file path and + ! assigns the open file unit to the local module variable unit_out. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified BUFR file path. + + !----------------------------------------------------------------------- + + subroutine write_bufr_open(filename) + + ! Define variables passed to routine + + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + open(unit_out,file=trim(adjustl(filename)),action='write',form= & + & 'unformatted',convert='big_endian') + + !===================================================================== + + end subroutine write_bufr_open + + !======================================================================= + +end module bufrio_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/configure.obs-preproc b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/configure.obs-preproc new file mode 100644 index 000000000..35173fce8 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/configure.obs-preproc @@ -0,0 +1,43 @@ +#======================================================================= + +#$$$ CONFIGURE DOCUMENTATION BLOCK + +# Copyright (C) 2019 Henry R. Winterbottom + +# Email: henry.winterbottom@noaa.gov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +# Review the README, within the top-level directory, which provides +# relevant instructions and (any) references cited by algorithms +# within this software suite. + +#======================================================================= + +# Compiler options. + +DEBUG = ${OBS_PREPROC_DEBUG} +FCFFLAGS = ${OBS_PREPROC_FCFLAGS} $(DEBUG) + +# Compile time libraries. + +BUFR = ${NWP_LIBS} +FSON = ${NWP_LIBS} +GRIDPROJS = ${NWP_LIBS} +KDTREE = ${NWP_LIBS} +SLATEC = ${NWP_LIBS} +SONDELIB = ${NWP_LIBS} +SPLINE = ${NWP_LIBS} +WMM = ${NWP_LIBS} diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/constants_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/constants_interface.F90 new file mode 100644 index 000000000..044d672f0 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/constants_interface.F90 @@ -0,0 +1,116 @@ +module constants_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: constants_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: cp_mass + public :: deg2rad + public :: earth_omega + public :: grav + public :: grav_std + public :: pi + public :: rad2deg + public :: rd + public :: rd_over_cp_mass + public :: rearth_equator + public :: rv + + !----------------------------------------------------------------------- + + ! DESCRIPTION (alphabetized): + + ! * cp_mass; a FORTRAN 4-byte real value specifying the specific + ! heat capacity of water vapor at constant pressure; units are + ! Joules per kilogram per Kelvin. + + ! * deg2rad; a FORTRAN 4-byte real value specifying the mathematical + ! constant to convert from degrees to radians; unitless. + + ! * earth_omega; a FORTRAN 4-byte real value specifying the rotation + ! rate of the Earth; units are radians per second. + + ! * grav; a FORTRAN 4-byte real value containing the acceleration + ! due to gravity; units are meters per second per second. + + ! * grav_std; a FORTRAN 4-byte real value containing the standard + ! * gravity; units are meters per second per second. + + ! * pi; a FORTRAN 4-byte real value containing the (machine + ! precision truncated) mathematical constant for atan(-1.0); + ! unitless. + + ! * rad2deg; a FORTRAN 4-byte real value specifying the mathematical + ! constant to convert from radians to degrees; unitless. + + ! * rd; a FORTRAN 4-byte real value specifying the gas constant for + ! dry air; units are Joules per Kelvin per kilogram. + + ! * rd_over_cp_mass; a FORTRAN 4-byte real value designating the + ! ratio rd/cp_mass. + + ! * rearth_equator; a FORTRAN 4-byte real value specifying the Earth + ! equatorial radius; units are meters. + + ! * rv; a FORTRAN 4-byte real value specifying the gas constant for + ! water vapor; units are Joules per Kelvin per kilogram. + + !----------------------------------------------------------------------- + + ! Define local variables + + real(r_kind), parameter :: & + & cp_mass = 1004.67_r_kind + real(r_kind), parameter :: & + & earth_omega = 7.292115e-5_r_kind + real(r_kind), parameter :: & + & grav = 9.80665e0_r_kind + real(r_kind), parameter :: & + & grav_std = 9.80665e0_r_kind + real(r_kind), parameter :: & + & pi = acos(-1.0) + real(r_kind), parameter :: & + & deg2rad = pi/180.0_r_kind + real(r_kind), parameter :: & + & rad2deg = 1.0/deg2rad + real(r_kind), parameter :: & + & rd = 2.8705e2_r_kind + real(r_kind), parameter :: & + & rd_over_cp_mass = rd/cp_mass + real(r_kind), parameter :: & + & rearth_equator = 6.37813662e6_r_kind + real(r_kind), parameter :: & + & rv = 4.6150e2_r_kind + + !======================================================================= + +end module constants_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/diagnostics_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/diagnostics_interface.F90 new file mode 100644 index 000000000..ae3bf3898 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/diagnostics_interface.F90 @@ -0,0 +1,137 @@ +module diagnostics_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: diagnostics_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: diagnostics_time_start + public :: diagnostics_time_stop + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! diagnostics_time_start.f90 + + ! DESCRIPTION: + + ! This subroutine calls the intrinsic subroutine cpu_time and + ! defines the elapsed CPU time in seconds. + + ! INPUT VARIABLES: + + ! * time_start; a FORTRAN 4-byte real value. + + ! OUTPUT VARIABLES: + + ! * time_start; a FORTRAN 4-byte real value specifying the elapsed + ! CPU time; units are seconds. + + !----------------------------------------------------------------------- + + subroutine diagnostics_time_start(time_start) + + ! Define variables passed to routine + + real(r_kind) :: time_start + + ! Define variables computed within routine + + character(len=100) :: cmd + + !===================================================================== + + ! Define local variables + + call get_command_argument(0,cmd) + call cpu_time(time_start) + write(6,500) trim(adjustl(cmd)) + write(6,*) '' +500 format('BEGINNING EXECUTION OF PROGRAM ',a,'.') + + !===================================================================== + + end subroutine diagnostics_time_start + + !======================================================================= + + ! SUBROUTINE: + + ! diagnostics_time_stop.f90 + + ! DESCRIPTION: + + ! This subroutine computes the total time since the user specified + ! starting time and prints a message indicating the time in + ! accordance with the optional variables provided by the user. + + ! INPUT VARIABLES: + + ! * time_start; a FORTRAN 4-byte real specifying the value returned + ! by subroutine diagnostics_time_start.f90. + + !----------------------------------------------------------------------- + + subroutine diagnostics_time_stop(time_start) + + ! Define variables passed to routine + + real(r_kind) :: time_start + + ! Define variables computed within routine + + character(len=100) :: cmd + real(r_kind) :: time_stop + + !===================================================================== + + ! Define local variables + + call get_command_argument(0,cmd) + call cpu_time(time_stop) + write(6,500) (time_stop - time_start) + write(6,*) '' + write(6,501) trim(adjustl(cmd)) +500 format('Execution time: ', f13.5, ' seconds.') +501 format('COMPLETED EXECUTION OF PROGRAM ',a,'.') + + !===================================================================== + + end subroutine diagnostics_time_stop + + !======================================================================= + +end module diagnostics_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/fileio_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/fileio_interface.F90 new file mode 100644 index 000000000..a0a3706b6 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/fileio_interface.F90 @@ -0,0 +1,1938 @@ +module fileio_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: fileio_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use gridtrans_interface + use gridtrans_fv3_interface + use json_interface + use kinds_interface + use namelist_interface + use netcdf_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: fileio_interface_read + public :: fileio_interface_write + interface fileio_interface_read + module procedure read_bufr_info + module procedure read_fv3 + module procedure read_hsa + module procedure read_sonde_filenames + module procedure read_tcinfo + module procedure read_vdm + end interface fileio_interface_read + interface fileio_interface_varinfo + module procedure varinfo_sonde_meteo + end interface fileio_interface_varinfo + interface fileio_interface_write + module procedure write_hsa + module procedure write_sonde_drift_error + module procedure write_sonde_decode_table + module procedure write_sonde_meteo + end interface fileio_interface_write + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! read_bufr_info.f90 + + ! DESCRIPTION: + + ! This subroutine parses a JSON formatted file and defines the BUFR + ! record attributes as specified by the user. + + ! INPUT VARIABLES: + + ! * bufr_info; a FORTRAN bufr_info_struct variable containing the + ! BUFR information JSON file path. + + ! OUTPUT VARIABLES: + + ! * bufr_info; a FORTRAN bufr_info_struct variable containing the + ! BUFR record attributes specified by the user. + + !----------------------------------------------------------------------- + + subroutine read_bufr_info(bufr_info) + + ! Define variables passed to routine + + type(bufr_info_struct) :: bufr_info + + !===================================================================== + + ! Define local variables + + call json_interface_read(bufr_info) + + !===================================================================== + + end subroutine read_bufr_info + + !======================================================================= + + ! SUBROUTINE: + + ! read_fv3.f90 + + ! DESCRIPTION: + + ! This subroutine reads Network Common Data Format (netcdf) files + ! produced by the Finite Volume Cubed Sphere (FV3) model and defines + ! the variables within the FORTRAN fv3_struct variable. + + ! INPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable. + + ! * windrotate; a FORTRAN windrotate variable. + + ! OUTPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable containing both the contents + ! for the ingested FV3 netcdf files and the variables computed + ! from the respective ingested variables. + + ! * windrotate; a FORTRAN windrotate variable containing the + ! coordinate rotation values to translate the forecast model winds + ! from model space to a Earth-relative coordinate system. + + !----------------------------------------------------------------------- + + subroutine read_fv3(fv3,windrotate) + + ! Define variables passed to routine + + type(fv3_struct) :: fv3 + type(windrotate_struct) :: windrotate + + !===================================================================== + + ! Check local variable and proceed accordingly + +! if(is_global) call read_fv3_global(fv3) + if(is_regional) call read_fv3_regional(fv3,windrotate) + + !===================================================================== + + end subroutine read_fv3 + + !======================================================================= + + ! SUBROUTINE: + + ! read_fv3_global.f90 + + ! DESCRIPTION: + + ! This subroutine reads Network Common Data Format (netcdf) files + ! produced by the Finite Volume Cubed Sphere (FV3) global model grid + ! configuration and defines the variables within the FORTRAN + ! fv3_struct variable. + + ! NOTE: The FV3 3-dimensional variables are ordered from the bottom + ! to top (e.g., the top-most level within the array is the surface); + ! this subroutine reorders the 3-dimensional variables such that the + ! surface is the first level within the array. + + ! INPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable. + + ! OUTPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable containing both the contents + ! for the ingested FV3 netcdf files and the variables computed + ! from the respective ingested variables. + + !----------------------------------------------------------------------- + + subroutine read_fv3_global(fv3) + + ! Define variables passed to routine + + type(fv3_struct) :: fv3 + + ! Define variables computed within routine + + character(len=100) :: dimname + character(len=100) :: varname + real(r_kind), dimension(:,:,:), allocatable :: nc_real_3d + real(r_kind), dimension(:,:), allocatable :: nc_real_2d + real(r_kind), dimension(:), allocatable :: ak + real(r_kind), dimension(:), allocatable :: bk + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + integer :: stop_coord + integer :: strt_coord + integer :: nx + integer :: ny + integer :: nz + integer :: zcoord + + ! Define counting variables + + integer :: i, j, k, l + + !===================================================================== + + ! Define local variables + + dimname = 'lon' + call netcdf_interface_getdim(fv3_orog_filename(1),dimname,nx) + fv3%nx = nx + dimname = 'lat' + call netcdf_interface_getdim(fv3_orog_filename(1),dimname,ny) + fv3%ny = ny + dimname = 'phalf' + call netcdf_interface_getdim(fv3_static_filename,dimname,nz) + fv3%nz = (nz - 1) + fv3%ncoords = (size(fv3_orog_filename)*fv3%nx*fv3%ny) + call variable_interface_setup_struct(fv3) + + ! Allocate memory for local variables + + if(.not. allocated(nc_real_3d)) allocate(nc_real_3d(nx,ny,fv3%nz)) + if(.not. allocated(nc_real_2d)) allocate(nc_real_2d(nx,ny)) + if(.not. allocated(ak)) allocate(ak(fv3%nz)) + if(.not. allocated(bk)) allocate(bk(fv3%nz)) + if(.not. allocated(lat)) allocate(lat(fv3%ny)) + if(.not. allocated(lon)) allocate(lon(fv3%nx)) + + ! Loop through local variable + + do j = 1, size(fv3_tracer_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_tracer_filename(j))) + varname = 'sphum' + call netcdf_interface_getvar(fv3_tracer_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%q(strt_coord:stop_coord,zcoord) = & + & reshape(nc_real_3d(:,:,i), & + & shape(fv3%q(strt_coord:stop_coord,zcoord))) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_tracer_filename) + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%q(:,zcoord)), maxval(fv3%q(:,zcoord)) + + end do ! do i = 1, fv3%nz + + end if ! if(debug) + + ! Loop through local variable + + do j = 1, size(fv3_dyns_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(j))) + varname = 'T' + call netcdf_interface_getvar(fv3_dyns_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%t(strt_coord:stop_coord,zcoord) = & + & reshape(nc_real_3d(:,:,i), & + & shape(fv3%t(strt_coord:stop_coord,zcoord))) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_dyns_filename) + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%t(:,zcoord)), maxval(fv3%t(:,zcoord)) + + end do ! do i = 1, fv3%nz + + end if ! if(debug) + + ! Loop through local variable + + do j = 1, size(fv3_dyns_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(j))) + varname = 'ua' + call netcdf_interface_getvar(fv3_dyns_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%ua(strt_coord:stop_coord,zcoord) = & + & reshape(nc_real_3d(:,:,i), & + & shape(fv3%ua(strt_coord:stop_coord,zcoord))) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_dyns_filename) + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%ua(:,zcoord)), maxval(fv3%ua(:,zcoord)) + + end do ! do i = 1, fv3%nz + + end if ! if(debug) + + ! Loop through local variable + + do j = 1, size(fv3_dyns_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(j))) + varname = 'va' + call netcdf_interface_getvar(fv3_dyns_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%va(strt_coord:stop_coord,zcoord) = & + & reshape(nc_real_3d(:,:,i), & + & shape(fv3%va(strt_coord:stop_coord,zcoord))) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_dyns_filename) + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%va(:,zcoord)), maxval(fv3%va(:,zcoord)) + + end do ! do i = 1, fv3%nz + + end if ! if(debug) + + ! Define local variables + + fv3%psfc = 0.0 + + ! Loop through local variable + + do j = 1, size(fv3_dyns_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(j))) + varname = 'delp' + call netcdf_interface_getvar(fv3_dyns_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + fv3%psfc(strt_coord:stop_coord) = & + & fv3%psfc(strt_coord:stop_coord) + & + & reshape(nc_real_3d(:,:,i), & + & shape(fv3%psfc(strt_coord:stop_coord))) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_dyns_filename) + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + + ! Define local variables + + if(debug) write(6,502) 'psfc', minval(fv3%psfc), maxval(fv3%psfc) + if(debug) write(6,500) trim(adjustl(fv3_static_filename)) + varname = 'hyam' + call netcdf_interface_getvar(fv3_static_filename,varname,ak) + varname = 'hybm' + call netcdf_interface_getvar(fv3_static_filename,varname,bk) + + ! Allocate memory for local variables + + if(.not. allocated(nc_real_3d)) allocate(nc_real_3d(nx,(ny+1),fv3%nz)) + + ! Loop through local variable + + do j = 1, size(fv3_dyns_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(j))) + varname = 'u' + call netcdf_interface_getvar(fv3_dyns_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%u(:,:,zcoord) = nc_real_3d(:,:,i) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_dyns_filename) + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%u(:,:,zcoord)), maxval(fv3%u(:,:,zcoord)) + + end do ! do i = 1, fv3%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + + ! Allocate memory for local variables + + if(.not. allocated(nc_real_3d)) allocate(nc_real_3d((nx+1),ny,fv3%nz)) + + ! Loop through local variable + + do j = 1, size(fv3_dyns_filename) + + ! Define local variables + + strt_coord = (j - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = j*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(j))) + varname = 'v' + call netcdf_interface_getvar(fv3_dyns_filename(j),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%v(:,:,zcoord) = nc_real_3d(:,:,i) + + end do ! do i = 1, fv3%nz + + end do ! do j = 1, size(fv3_dyns_filename) + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%v(:,:,zcoord)), maxval(fv3%v(:,:,zcoord)) + + end do ! do i = 1, fv3%nz + + end if ! if(debug) + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + + ! Compute local variables + + fv3%p(:,zcoord) = ak(i)*1.0e5 + bk(i)*fv3%psfc(:) + if(debug) write(6,501), 'P', zcoord, minval(fv3%p(:,zcoord)), & + & maxval(fv3%p(:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Loop through local variable + + do i = 1, size(fv3_orog_filename) + + ! Define local variables + + strt_coord = (i - 1)*(fv3%nx*fv3%ny) + 1 + stop_coord = i*(fv3%nx*fv3%ny) + if(debug) write(6,500) trim(adjustl(fv3_orog_filename(i))) + varname = 'lat' + call netcdf_interface_getvar(fv3_orog_filename(i),varname,lat) + varname = 'lon' + call netcdf_interface_getvar(fv3_orog_filename(i),varname,lon) + l = strt_coord + + ! Loop through local variable + + do j = 1, fv3%ny + + ! Loop through local variable + + do k = 1, fv3%nx + + ! Define local variables + + fv3%lat(l) = lat(j) + fv3%lon(l) = lon(k) + l = l + 1 + + end do ! do k = 1, fv3%nx + + end do ! do j = 1, fv3%ny + + ! Define local variables + + varname = 'slmsk' + call netcdf_interface_getvar(fv3_orog_filename(i),varname, & + & nc_real_2d) + fv3%slmsk(strt_coord:stop_coord) = & + & reshape(nc_real_2d,shape(fv3%slmsk(strt_coord:stop_coord))) + + end do ! do i = 1, size(fv3_orog_filename) + + ! Define local variables + + if(debug) write(6,502) 'lat', minval(fv3%lat), maxval(fv3%lat) + if(debug) write(6,502) 'lon', minval(fv3%lon), maxval(fv3%lon) + if(debug) write(6,502) 'slmsk', minval(fv3%slmsk), maxval(fv3%slmsk) + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + if(allocated(nc_real_2d)) deallocate(nc_real_2d) + if(allocated(ak)) deallocate(ak) + if(allocated(bk)) deallocate(bk) + if(allocated(lat)) deallocate(lat) + if(allocated(lon)) deallocate(lon) + + ! Define local variables + +500 format(/,'READ_FV3_GLOBAL: Reading file ',a,'.',/) +501 format('READ_FV3_GLOBAL: Variable/Level/Min/Max: ',a,1x,i3.3, & + & 2(1x,f13.5)) +502 format('READ_FV3_GLOBAL: Variable/Min/Max: ',a,2(1x,f13.5)) + + !===================================================================== + + end subroutine read_fv3_global + + !======================================================================= + + ! SUBROUTINE: + + ! read_fv3_regional.f90 + + ! DESCRIPTION: + + ! This subroutine reads Network Common Data Format (netcdf) files + ! produced by the Finite Volume Cubed Sphere (FV3) regional model + ! grid configuration and defines the variables within the FORTRAN + ! fv3_struct variable. + + ! NOTE: The FV3 3-dimensional variables are ordered from the bottom + ! to top (e.g., the top-most level within the array is the surface); + ! this subroutine reorders the 3-dimensional variables such that the + ! surface is the first level within the array. + + ! INPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable. + + ! * windrotate; a FORTRAN windrotate variable. + + ! OUTPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable containing both the contents + ! for the ingested FV3 netcdf files and the variables computed + ! from the respective ingested variables. + + ! * windrotate; a FORTRAN windrotate variable containing the + ! coordinate rotation values to translate the forecast model winds + ! from model space to a Earth-relative coordinate system. + + !----------------------------------------------------------------------- + + subroutine read_fv3_regional(fv3,windrotate) + + ! Define variables passed to routine + + type(fv3_struct) :: fv3 + type(windrotate_struct) :: windrotate + + ! Define variables computed within routine + + type(fv3_gridtrans_struct) :: fv3_gridtrans + character(len=100) :: dimname + character(len=100) :: varname + real(r_kind), dimension(:,:,:), allocatable :: nc_real_3d + real(r_kind), dimension(:,:), allocatable :: nc_real_2d + real(r_kind), dimension(:), allocatable :: ak + real(r_kind), dimension(:), allocatable :: bk + integer :: nx + integer :: ny + integer :: nz + integer :: zcoord + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + dimname = 'lon' + call netcdf_interface_getdim(fv3_orog_filename(1),dimname,nx) + fv3%nx = nx + dimname = 'lat' + call netcdf_interface_getdim(fv3_orog_filename(1),dimname,ny) + fv3%ny = ny + dimname = 'phalf' + call netcdf_interface_getdim(fv3_static_filename,dimname,nz) + fv3%nz = (nz - 1) + call variable_interface_setup_struct(fv3) + + ! Allocate memory for local variables + + if(.not. allocated(nc_real_3d)) allocate(nc_real_3d(nx,ny,fv3%nz)) + if(.not. allocated(nc_real_2d)) allocate(nc_real_2d(nx,ny)) + if(.not. allocated(ak)) allocate(ak(fv3%nz)) + if(.not. allocated(bk)) allocate(bk(fv3%nz)) + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_tracer_filename(1))) + varname = 'sphum' + call netcdf_interface_getvar(fv3_tracer_filename(1),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%q(:,zcoord) = reshape(nc_real_3d(:,:,i), & + & shape(fv3%q(:,zcoord))) + if(debug) write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%q(:,zcoord)), maxval(fv3%q(:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(1))) + varname = 'T' + call netcdf_interface_getvar(fv3_dyns_filename(1),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%t(:,zcoord) = reshape(nc_real_3d(:,:,i), & + & shape(fv3%t(:,zcoord))) + if(debug) write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%t(:,zcoord)), maxval(fv3%t(:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(1))) + varname = 'ua' + call netcdf_interface_getvar(fv3_dyns_filename(1),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%ua(:,zcoord) = reshape(nc_real_3d(:,:,i), & + & shape(fv3%ua(:,zcoord))) + if(debug) write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%ua(:,zcoord)), maxval(fv3%ua(:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(1))) + varname = 'va' + call netcdf_interface_getvar(fv3_dyns_filename(1),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%va(:,zcoord) = reshape(nc_real_3d(:,:,i), & + & shape(fv3%va(:,zcoord))) + if(debug) write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%va(:,zcoord)), maxval(fv3%va(:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(1))) + varname = 'delp' + call netcdf_interface_getvar(fv3_dyns_filename(1),varname, & + & nc_real_3d) + fv3%psfc = 0.0 + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + fv3%psfc = fv3%psfc + reshape(nc_real_3d(:,:,i),shape(fv3%psfc)) + + end do ! do i = 1, fv3%nz + + ! Define local variables + + if(debug) write(6,502) 'psfc', minval(fv3%psfc), maxval(fv3%psfc) + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + + ! Allocate memory for local variables + + if(.not. allocated(nc_real_3d)) & + & allocate(nc_real_3d(fv3%nx,(fv3%ny + 1),fv3%nz)) + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(1))) + varname = 'u' + call netcdf_interface_getvar(fv3_dyns_filename(1),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%u(:,:,zcoord) = nc_real_3d(:,:,i) + if(debug) write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%u(:,:,zcoord)), maxval(fv3%u(:,:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + + ! Allocate memory for local variables + + if(.not. allocated(nc_real_3d)) & + & allocate(nc_real_3d((fv3%nx + 1),fv3%ny,fv3%nz)) + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_dyns_filename(1))) + varname = 'v' + call netcdf_interface_getvar(fv3_dyns_filename(1),varname, & + & nc_real_3d) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + fv3%v(:,:,zcoord) = nc_real_3d(:,:,i) + if(debug) write(6,501), trim(adjustl(varname)), zcoord, & + & minval(fv3%v(:,:,zcoord)), maxval(fv3%v(:,:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_static_filename)) + varname = 'hyam' + call netcdf_interface_getvar(fv3_static_filename,varname,ak) + varname = 'hybm' + call netcdf_interface_getvar(fv3_static_filename,varname,bk) + + ! Loop through local variable + + do i = 1, fv3%nz + + ! Define local variables + + zcoord = (fv3%nz - i) + 1 + + ! Compute local variables + + fv3%p(:,zcoord) = ak(i)*1.0e5 + bk(i)*fv3%psfc(:) + if(debug) write(6,501), 'P', zcoord, minval(fv3%p(:,zcoord)), & + & maxval(fv3%p(:,zcoord)) + + end do ! do i = 1, fv3%nz + + ! Define local variables + + fv3_gridtrans%nx = fv3%nx + fv3_gridtrans%ny = fv3%ny + call fv3_gridtrans_setup(fv3_gridtrans) + if(debug) write(6,500) trim(adjustl(fv3_gridspec_filename(1))) + varname = 'grid_lat' + call netcdf_interface_getvar(fv3_gridspec_filename(1),varname, & + & fv3_gridtrans%lat) + varname = 'grid_latt' + call netcdf_interface_getvar(fv3_gridspec_filename(1),varname, & + & fv3_gridtrans%latt) + varname = 'grid_lon' + call netcdf_interface_getvar(fv3_gridspec_filename(1),varname, & + & fv3_gridtrans%lon) + varname = 'grid_lont' + call netcdf_interface_getvar(fv3_gridspec_filename(1),varname, & + & fv3_gridtrans%lont) + fv3_gridtrans%grid_ratio = grid_ratio + + ! Compute local variables + + call fv3_gridtrans_anlgrid(fv3_gridtrans) + + ! Define local variables + + windrotate%nx = fv3_gridtrans%nx + windrotate%ny = fv3_gridtrans%ny + call windrotate_setup(windrotate) + + ! Compute local variables + + call fv3_windrotate_compute(fv3_gridtrans,windrotate) + + ! Define local variables + + fv3%lat = fv3_gridtrans%lat_in + if(debug) write(6,502) 'latitude', minval(fv3%lat), maxval(fv3%lat) + fv3%lon = fv3_gridtrans%lon_in + if(debug) write(6,502) 'longitude', minval(fv3%lon), maxval(fv3%lon) + + ! Deallocate memory for local variables + + call fv3_gridtrans_cleanup(fv3_gridtrans) + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(fv3_orog_filename(1))) + varname = 'slmsk' + call netcdf_interface_getvar(fv3_orog_filename(1),varname,nc_real_2d) + fv3%slmsk = reshape(nc_real_2d,shape(fv3%slmsk)) + if(debug) write(6,502) trim(adjustl(varname)), minval(fv3%slmsk), & + & maxval(fv3%slmsk) + + ! Deallocate memory for local variables + + if(allocated(nc_real_3d)) deallocate(nc_real_3d) + if(allocated(nc_real_2d)) deallocate(nc_real_2d) + if(allocated(ak)) deallocate(ak) + if(allocated(bk)) deallocate(bk) + + ! Define local variables + +500 format(/,'READ_FV3_REGIONAL: Reading file ',a,'.',/) +501 format('READ_FV3_REGIONAL: Variable/Level/Min/Max: ',a,1x,i3.3, & + & 2(1x,f13.5)) +502 format('READ_FV3_REGIONAL: Variable/Min/Max: ',a,2(1x,f13.5)) + + !===================================================================== + + end subroutine read_fv3_regional + + !======================================================================= + + ! SUBROUTINE: + + ! read_hsa.f90 + + ! DESCRIPTION: + + ! This subroutine reads a National Oceanic and Atmospheric + ! Administration (NOAA) Atlantic Oceanographic and Meteorological + ! Laboratory (AOML) Hurricane Research Division (HRD) HRD Spline + ! Analysis (HSA) formatted observation file. + + ! INPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable. + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing the HSA file + ! contents. + + !----------------------------------------------------------------------- + + subroutine read_hsa(hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + + ! Define variables computed within routine + + real(r_kind) :: dummy + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + hsa%nz = 0 + open(99,file=trim(adjustl(hsa%filename)),form='formatted') +1000 read(99,*,end=1001) dummy + hsa%nz = hsa%nz + 1 + goto 1000 +1001 continue + close(99) + call variable_interface_setup_struct(hsa) + open(99,file=trim(adjustl(hsa%filename)),form='formatted') + + ! Loop through local variable + + do i = 1, hsa%nz + + ! Define local variables + + read(99,500,err=1002) hsa%wx(i), hsa%yymmdd(i), hsa%gmt(i), & + & hsa%lat(i), hsa%lon(i), hsa%p(i), hsa%t(i), hsa%rh(i), & + & hsa%z(i), hsa%u(i), hsa%v(i), hsa%tail(i) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + close(99) + return +1002 continue +500 format(i2,1x,f7.0,1x,i4,1x,2(f7.3,1x),3(f6.1,1x),f7.1,2(f6.1,1x),a4) + + !===================================================================== + + end subroutine read_hsa + + !======================================================================= + + ! SUBROUTINE: + + ! read_sonde_filenames.f90 + + ! DESCRIPTION: + + ! This subroutine reads into an array sonde filename pathes. + + ! INPUT VARIABLES: + + ! * sonde; a FORTRAN sonde_struct variable. + + ! OUTPUT VARIABLES: + + ! * sonde; a FORTRAN sonde_struct variable containing an array of + ! sonde file pathes. + + !----------------------------------------------------------------------- + + subroutine read_sonde_filenames(sonde) + + ! Define variables passed to routine + + type(sonde_struct) :: sonde + + ! Define variables computed within routine + + character(len=500) :: dummy + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + sonde%nsondes = 0 + open(99,file=trim(adjustl(sonde_filelist)),form='formatted') +1000 read(99,*,end=1001) dummy + sonde%nsondes = sonde%nsondes + 1 + goto 1000 +1001 continue + close(99) + + ! Define local variables + + call variable_interface_setup_struct(sonde) + + ! Define local variables + + open(99,file=trim(adjustl(sonde_filelist)),form='formatted') + + ! Loop through local variable + + do i = 1, sonde%nsondes + + ! Define local variables + + read(99,*) sonde%filename(i) + if(debug) write(6,500) trim(adjustl(sonde%filename(i))) + + end do ! do i = 1, sonde%nsondes + + ! Define local variables + + close(99) +500 format('READ_SONDE_FILENAMES: Reading in file ',a,' to be processed.') + + !===================================================================== + + end subroutine read_sonde_filenames + + !======================================================================= + + ! SUBROUTINE: + + ! read_tcinfo.f90 + + ! DESCRIPTION: + + ! This subroutine ingests an external file containing tropical + ! cyclone information required to generate synthetic, relocated + ! observations. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! TC information file. + + ! * tcinfo; a FORTRAN tcinfo_struct variable. + + ! OUTPUT VARIABLES: + + ! * tcinfo; a FORTRAN tcinfo_struct variable now containing the + ! tropical cyclone attributes retrieved from the user specified + ! file. + + !----------------------------------------------------------------------- + + subroutine read_tcinfo(filename,tcinfo) + + ! Define variables passed to routine + + type(tcinfo_struct), dimension(:), allocatable :: tcinfo + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=1) :: dummy + integer :: ntcs + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + ntcs = 0 + open(99,file=trim(adjustl(filename)),form='formatted') +1000 read(99,*,end=1001) dummy + ntcs = ntcs + 1 + goto 1000 +1001 continue + close(99) + + ! Allocate memory for local variables + + if(.not. allocated(tcinfo)) allocate(tcinfo(ntcs)) + + ! Define local variables + + open(99,file=trim(adjustl(filename)),form='formatted') + + ! Loop through local variable + + do i = 1, ntcs + + ! Define local variables + + read(99,*) tcinfo(i)%id, tcinfo(i)%obs_clat, tcinfo(i)%mdl_clat, & + & tcinfo(i)%obs_clon, tcinfo(i)%mdl_clon, tcinfo(i)%obs_pcen, & + & tcinfo(i)%mdl_pcen, tcinfo(i)%obs_vmax, tcinfo(i)%mdl_vmax + + ! Check local variable and proceed accordingly + + if(debug) then + + ! Define local variables + + write(6,'(/)') + write(6,501) + write(6,500) tcinfo(i)%id, tcinfo(i)%obs_clat, & + & tcinfo(i)%mdl_clat, tcinfo(i)%obs_clon, & + & tcinfo(i)%mdl_clon, tcinfo(i)%obs_pcen, & + & tcinfo(i)%mdl_pcen, tcinfo(i)%obs_vmax, & + & tcinfo(i)%mdl_vmax + + end if ! if(debug) + + ! Check local variable and proceed accordingly + + if(is_fv3) then + + ! Define local variables + + tcinfo(i)%mdl_clon = tcinfo(i)%mdl_clon + 360.0 + tcinfo(i)%obs_clon = tcinfo(i)%obs_clon + 360.0 + + end if ! if(is_fv3) + + end do ! do i = 1, ntcs + + ! Define local variables + + close(99) +500 format(a3,8(1x,f13.5)) +501 format('READ_TCINFO: Read the following TC information record:') + + !===================================================================== + + end subroutine read_tcinfo + + !======================================================================= + + ! SUBROUTINE: + + ! read_vdm.f90 + + ! DESCRIPTION: + + ! This subroutine ingests formatted vortex data message (VDM) files + ! and populates the FORTRAN vdm_struct variable arrays. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the + + ! * vdm; a FORTRAN vdm_struct variable. + + ! OUTPUT VARIABLES: + + ! * vdm; a FORTRAN vdm_struct variable now containing the vortex + ! data message (VDM) attributes retrieved from the user specified + ! files. + + !----------------------------------------------------------------------- + + subroutine read_vdm(filename,vdm) + + ! Define variables passed to routine + + type(vdm_struct) :: vdm + character(len=500) :: filename + + ! Define variables computed within routine + + character(len=500) :: vdm_filename + character(len=1) :: dummy + integer :: nobs + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + vdm%nvdm = 0 + vdm%nobs = 0 + open(99,file=trim(adjustl(filename)),form='formatted') +1000 read(99,*,end=1003) vdm_filename + vdm%nvdm = vdm%nvdm + 1 + nobs = 0 + open(98,file=trim(adjustl(vdm_filename)),form='formatted') +1001 read(98,*,end=1002) dummy + nobs = nobs + 1 + goto 1001 +1002 continue + vdm%nobs = max(vdm%nobs,(nobs - 1)) + goto 1000 +1003 continue + close(99) + call variable_interface_setup_struct(vdm) + open(99,file=trim(adjustl(filename)),form='formatted') + + ! Check local variable and proceed accordingly + + if(debug) write(6,'(/)') + + ! Loop through local variable + + do i = 1, size(vdm%filename) + + ! Define local variables + + read(99,*) vdm%filename(i) + + ! Check local variable and proceed accordingly + + if(debug) write(6,500) trim(adjustl(vdm%filename(i))) + + end do ! do i = 1, size(vdm%filename) + + ! Check local variable and proceed accordingly + + if(debug) write(6,'(/)') + + ! Define local variables + + close(99) + + ! Loop through local variable + + do i = 1, size(vdm%filename) + + ! Define local variables + + open(99,file=trim(adjustl(vdm%filename(i))),form='formatted') + read(99,*) vdm%fix_time(i), vdm%fix_lat(i), vdm%fix_lon(i) + + ! Check local variable and proceed accordingly + + if(vdm%fix_lat(i) .eq. vdm_spval) vdm%fix_lat(i) = spval + if(vdm%fix_lon(i) .eq. vdm_spval) vdm%fix_lon(i) = spval + + ! Loop through local variable + + do j = 1, vdm%nobs + + ! Define local variables + + read(99,*,end=1004) vdm%obs_time(i,j), vdm%obs_plev(i,j), & + & vdm%obs_alt(i,j), vdm%obs_dist(i,j), vdm%obs_head(i,j), & + & vdm%obs_wdir(i,j), vdm%obs_wspd(i,j) + + ! Check local variable and proceed accordingly + + if(vdm%obs_plev(i,j) .eq. vdm_spval) vdm%obs_plev(i,j) = spval + if(vdm%obs_alt(i,j) .eq. vdm_spval) vdm%obs_alt(i,j) = spval + if(vdm%obs_dist(i,j) .eq. vdm_spval) vdm%obs_dist(i,j) = spval + if(vdm%obs_head(i,j) .eq. vdm_spval) vdm%obs_head(i,j) = spval + if(vdm%obs_wdir(i,j) .eq. vdm_spval) vdm%obs_wdir(i,j) = spval + if(vdm%obs_wspd(i,j) .eq. vdm_spval) vdm%obs_wspd(i,j) = spval + + end do ! do j = 1, vdm%nobs + + ! Define local variables + +1004 continue + close(99) + + end do ! do i = 1, size(vdm%filename) + +500 format('READ_VDM: Found vortex data message file ', a,'.') + + !===================================================================== + + end subroutine read_vdm + + !======================================================================= + + ! SUBROUTINE: + + ! varinfo_sonde_meteo.f90 + + ! DESCRIPTION: + + ! This subroutine defines the FORTRAN varinfo_struct variable used + ! to write the appropriate variables contained within the FORTRAN + ! meteo_struct variable to external file formats. + + ! INPUT VARIABLES: + + ! * meteo; a FORTRAN meteo_struct variable. + + ! * varinfo; a FORTRAN varinfo_struct variable specifying the + ! appropriate fields for external file formats. + + ! OUTPUT VARIABLES: + + ! * varinfo; a FORTRAN varinfo_struct variable specifying the + ! appropriate fields for external file formats. + + !----------------------------------------------------------------------- + + subroutine varinfo_sonde_meteo(meteo,varinfo) + + ! Define variables passed to routine + + type(meteo_struct) :: meteo + type(varinfo_struct) :: varinfo + + ! Define variables computed within routine + + character(len=10), dimension(:), allocatable :: dimname + integer, dimension(:), allocatable :: dimval + integer, dimension(:), allocatable :: dimid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + varinfo%ndims = 1 + varinfo%nvars = 14 + varinfo%nattrs = 2 + call variable_interface_setup_struct(varinfo) + + ! Allocate memory for local variables + + if(.not. allocated(dimname)) allocate(dimname(varinfo%ndims)) + if(.not. allocated(dimval)) allocate(dimval(varinfo%ndims)) + if(.not. allocated(dimid)) allocate(dimid(varinfo%ndims)) + + ! Define local variables + + dimname(1) = 'nz' + dimval(1) = meteo%nz + + ! Loop through local variable + + do i = 1, varinfo%ndims + + ! Define local variables + + varinfo%dimval(i) = dimval(i) + varinfo%dimname(i) = dimname(i) + dimid(i) = i + + end do ! do i = 1, varinfo%ndims + + ! Define local variables + + varinfo%varattrs(1,1,1) = 'title' + varinfo%varattrs(1,1,2) = 'Dewpoint Temperature' + varinfo%varattrs(1,2,1) = 'units' + varinfo%varattrs(1,2,2) = 'Kelvin' + varinfo%varname(1) = 'dwpt' + varinfo%varndims(1) = 1 + varinfo%varnattrs(1) = 2 + varinfo%vartype(1) = 'double' + varinfo%vardimid(1,1) = dimid(1) + varinfo%varattrs(2,1,1) = 'title' + varinfo%varattrs(2,1,2) = 'Latitude' + varinfo%varattrs(2,2,1) = 'units' + varinfo%varattrs(2,2,2) = 'degrees' + varinfo%varname(2) = 'lat' + varinfo%varndims(2) = 1 + varinfo%varnattrs(2) = 2 + varinfo%vartype(2) = 'double' + varinfo%vardimid(2,1) = dimid(1) + varinfo%varattrs(3,1,1) = 'title' + varinfo%varattrs(3,1,2) = 'Longitude' + varinfo%varattrs(3,2,1) = 'units' + varinfo%varattrs(3,2,2) = 'degrees' + varinfo%varname(3) = 'lon' + varinfo%varndims(3) = 1 + varinfo%varnattrs(3) = 2 + varinfo%vartype(3) = 'double' + varinfo%vardimid(3,1) = dimid(1) + varinfo%varattrs(4,1,1) = 'title' + varinfo%varattrs(4,1,2) = 'Pressure' + varinfo%varattrs(4,2,1) = 'units' + varinfo%varattrs(4,2,2) = 'Pascals' + varinfo%varname(4) = 'p' + varinfo%varndims(4) = 1 + varinfo%varnattrs(4) = 2 + varinfo%vartype(4) = 'double' + varinfo%vardimid(4,1) = dimid(1) + varinfo%varattrs(5,1,1) = 'title' + varinfo%varattrs(5,1,2) = 'Water Vapor Mixing Ratio' + varinfo%varattrs(5,2,1) = 'units' + varinfo%varattrs(5,2,2) = 'kilograms per kilogram' + varinfo%varname(5) = 'q' + varinfo%varndims(5) = 1 + varinfo%varnattrs(5) = 2 + varinfo%vartype(5) = 'double' + varinfo%vardimid(5,1) = dimid(1) + varinfo%varattrs(6,1,1) = 'title' + varinfo%varattrs(6,1,2) = 'Relative Humidity' + varinfo%varattrs(6,2,1) = 'units' + varinfo%varattrs(6,2,2) = '%' + varinfo%varname(6) = 'rh' + varinfo%varndims(6) = 1 + varinfo%varnattrs(6) = 2 + varinfo%vartype(6) = 'double' + varinfo%vardimid(6,1) = dimid(1) + varinfo%varattrs(7,1,1) = 'title' + varinfo%varattrs(7,1,2) = 'Temperature' + varinfo%varattrs(7,2,1) = 'units' + varinfo%varattrs(7,2,2) = 'Kelvin' + varinfo%varname(7) = 't' + varinfo%varndims(7) = 1 + varinfo%varnattrs(7) = 2 + varinfo%vartype(7) = 'double' + varinfo%vardimid(7,1) = dimid(1) + varinfo%varattrs(8,1,1) = 'title' + varinfo%varattrs(8,1,2) = 'Zonal Wind' + varinfo%varattrs(8,2,1) = 'units' + varinfo%varattrs(8,2,2) = 'meters per second' + varinfo%varname(8) = 'u' + varinfo%varndims(8) = 1 + varinfo%varnattrs(8) = 2 + varinfo%vartype(8) = 'double' + varinfo%vardimid(8,1) = dimid(1) + varinfo%varattrs(9,1,1) = 'title' + varinfo%varattrs(9,1,2) = 'Meridional Wind' + varinfo%varattrs(9,2,1) = 'units' + varinfo%varattrs(9,2,2) = 'meters per second' + varinfo%varname(9) = 'v' + varinfo%varndims(9) = 1 + varinfo%varnattrs(9) = 2 + varinfo%vartype(9) = 'double' + varinfo%vardimid(9,1) = dimid(1) + varinfo%varattrs(10,1,1) = 'title' + varinfo%varattrs(10,1,2) = 'Wind Direction' + varinfo%varattrs(10,2,1) = 'units' + varinfo%varattrs(10,2,2) = 'degrees from North' + varinfo%varname(10) = 'wdir' + varinfo%varndims(10) = 1 + varinfo%varnattrs(10) = 2 + varinfo%vartype(10) = 'double' + varinfo%vardimid(10,1) = dimid(1) + varinfo%varattrs(11,1,1) = 'title' + varinfo%varattrs(11,1,2) = 'Wind Speed Magnitude' + varinfo%varattrs(11,2,1) = 'units' + varinfo%varattrs(11,2,2) = 'meters per second' + varinfo%varname(11) = 'wspd' + varinfo%varndims(11) = 1 + varinfo%varnattrs(11) = 2 + varinfo%vartype(11) = 'double' + varinfo%vardimid(11,1) = dimid(1) + varinfo%varattrs(12,1,1) = 'title' + varinfo%varattrs(12,1,2) = 'Geometric Height' + varinfo%varattrs(12,2,1) = 'units' + varinfo%varattrs(12,2,2) = 'meters' + varinfo%varname(12) = 'z' + varinfo%varndims(12) = 1 + varinfo%varnattrs(12) = 2 + varinfo%vartype(12) = 'double' + varinfo%vardimid(12,1) = dimid(1) + varinfo%varattrs(13,1,1) = 'title' + varinfo%varattrs(13,1,2) = 'Julian Date' + varinfo%varattrs(13,2,1) = 'units' + varinfo%varattrs(13,2,2) = 'Number of days since commencement of Julian calendar' + varinfo%varname(13) = 'jdate' + varinfo%varndims(13) = 1 + varinfo%varnattrs(13) = 2 + varinfo%vartype(13) = 'double' + varinfo%vardimid(13,1) = dimid(1) + varinfo%varattrs(14,1,1) = 'title' + varinfo%varattrs(14,1,2) = 'Surface Pressure' + varinfo%varattrs(14,2,1) = 'units' + varinfo%varattrs(14,2,2) = 'Pascals' + varinfo%varname(14) = 'psfc' + varinfo%varndims(14) = 0 + varinfo%varnattrs(14) = 2 + varinfo%vartype(14) = 'double' + + ! Deallocate memory for local variables + + if(allocated(dimname)) deallocate(dimname) + if(allocated(dimval)) deallocate(dimval) + if(allocated(dimid)) deallocate(dimid) + + !===================================================================== + + end subroutine varinfo_sonde_meteo + + !======================================================================= + + ! SUBROUTINE: + + ! write_hsa.f90 + + ! DESCRIPTION: + + ! This subroutine writes a National Oceanic and Atmospheric + ! Administration (NOAA) Atlantic Oceanographic and Meteorological + ! Laboratory (AOML) Hurricane Research Division (HRD) HRD Spline + ! Analysis (HSA) formatted observation file. + + ! INPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable. + + !----------------------------------------------------------------------- + + subroutine write_hsa(hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + if(debug) write(6,500) trim(adjustl(hsa%filename)) + open(99,file=trim(adjustl(hsa%filename)),form='formatted') + + ! Loop through local variable + + do i = 1, hsa%nz + + ! Define local variables + + write(99,501) hsa%wx(i), hsa%yymmdd(i), hsa%gmt(i), hsa%lat(i), & + & hsa%lon(i), hsa%p(i), hsa%t(i), hsa%rh(i), hsa%z(i), & + & hsa%u(i), hsa%v(i), hsa%tail(i) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + close(99) +500 format('WRITE_HSA: Writing file ',a,'.') +501 format(i2,1x,f7.0,1x,i4,1x,2(f7.3,1x),3(f6.1,1x),f7.1,2(f6.1,1x),a4) + + !===================================================================== + + end subroutine write_hsa + + !======================================================================= + + ! SUBROUTINE: + + ! write_sonde_drift_error.f90 + + ! DESCRIPTION: + + ! This subroutine writes the values for the TEMP-DROP formatted + ! sonde message splash location (e.g., spg attributes) and the + ! computed/estimated splash locations from the drift-corrected sonde + ! trajectories; the format is as follows: + + ! + ! + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the filename + ! path to the output file. + + ! * hsa; a FORTRAN hsa_struct variable; this should contain the + ! contents of the decoded TEMP-DROP message without the + ! application of the drift-correction. + + ! * meteo; a FORTRAN meteo_struct variable. + + !----------------------------------------------------------------------- + + subroutine write_sonde_drift_error(filename,hsa,meteo) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + type(meteo_struct) :: meteo + character(len=500) :: filename + + !===================================================================== + + ! Define local variables + + open(99,file=trim(adjustl(filename)),form='formatted') + write(99,500) -1.0*hsa%spglon, hsa%spglat, (hsa%spg_julian - & + & hsa%rel_julian)*86400.0, meteo%lon(1), meteo%lat(1), & + & (meteo%jdate(1) - meteo%jdate(meteo%nz))*86400.0 + close(99) +500 format(6(f13.5,1x)) + + !===================================================================== + + end subroutine write_sonde_drift_error + + !======================================================================= + + ! SUBROUTINE: + + ! write_sonde_decode_table.f90 + + ! DESCRIPTION: + + ! This subroutine writes a column-delimted table containing the + ! TEMP-DROP encoded observation file and the corresponding decoded + ! HSA-formatted observation file. + + ! INPUT VARIABLES: + + ! * table_filename; a FORTRAN character string specifying the + ! filename path for the column-delimited table; if this file does + ! not exist upon call to this routine, it will be created; if the + ! file does exist upon call to this routine, it will be appended. + + ! * sonde_filename; a FORTRAN character string specifying the + ! filename path for the TEMP-DROP encoded observation file. + + ! * hsa; a FORTRAN hsa_struct variable containing (at minimum) the + ! filename path for the decoded HSA-formatted observation file + ! (within the attribute 'filename'). + + !----------------------------------------------------------------------- + + subroutine write_sonde_decode_table(table_filename,sonde_filename,hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + character(len=500) :: sonde_filename + character(len=500) :: table_filename + + ! Define variables computed within routine + + logical :: exist + + !===================================================================== + + ! Define local variables + + inquire(file = trim(adjustl(table_filename)),exist = exist) + + ! Check local variable and proceed accordingly + + if(exist) then + + ! Define local variables + + open(99,file=trim(adjustl(table_filename)),form='formatted', & + & status='old',position='append',action='write') + + else ! if(exist) + + ! Define local variables + + open(99,file=trim(adjustl(table_filename)),form='formatted', & + & status='new',action='write') + + end if ! if(exist) + + ! Define local variables + + write(99,500) trim(adjustl(sonde_filename)), & + & trim(adjustl(hsa%filename)) + if(debug) write(6,501) trim(adjustl(sonde_filename)), & + & trim(adjustl(hsa%filename)) + close(99) +500 format(a,1x,a) +501 format('WRITE_SONDE_DECODE_TABLE: Mapping observation file ',a,' to ' & + & 'decoded observation file ',a,'.') + + !===================================================================== + + end subroutine write_sonde_decode_table + + !======================================================================= + + ! SUBROUTINE: + + ! write_sonde_meteo.f90 + + ! DESCRIPTION: + + ! This subroutine writes the contents of the FORTRAN meteo_struct + ! variable to an external Network Common Data Format (netCDF) file. + + ! INPUT VARIABLES: + + ! * sonde; a FORTRAN sonde_struct variable. + + ! * meteo; a FORTRAN meteo_struct variable. + + ! * filename; a FORTRAN character string containing the full-path to + ! the netCDF file to be created. + + !----------------------------------------------------------------------- + + subroutine write_sonde_meteo(sonde,meteo,filename) + + ! Define variables passed to routine + + type(meteo_struct) :: meteo + type(sonde_struct) :: sonde + character(len=500) :: filename + + ! Define variables computed within routine + + type(varinfo_struct) :: varinfo + character(len=100) :: attrname + character(len=100) :: varname + real(r_double), dimension(:,:), allocatable :: work + integer :: n1dv + integer :: n0dv + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.false.,.true.) + call fileio_interface_varinfo(meteo,varinfo) + attrname = 'aircraft_id' + call netcdf_interface_putattr(attrname,meteo%acid) + attrname = 'obs_number' + call netcdf_interface_putattr(attrname,meteo%obnum) + attrname = 'tempdrop_file' + call netcdf_interface_putattr(attrname, & + & trim(adjustl(meteo%tempdrop_name))) + attrname = '_FillValue' + call netcdf_interface_putattr(attrname,dble(spval)) + call netcdf_interface_writedef(varinfo) + n1dv = 13 + n0dv = 1 + + ! Allocate memory for local variables + + if(.not. allocated(work)) allocate(work(n1dv,meteo%nz)) + + ! Define local variables + + work(1,:) = meteo%dwpt + work(2,:) = meteo%lat + work(3,:) = meteo%lon + work(4,:) = meteo%p + work(5,:) = meteo%q + work(6,:) = meteo%rh + work(7,:) = meteo%t + work(8,:) = meteo%u + work(9,:) = meteo%v + work(10,:) = meteo%wdir + work(11,:) = meteo%wspd + work(12,:) = meteo%z + work(13,:) = meteo%jdate + + ! Loop through local variable + + do i = 1, n1dv + + ! Define local variables + + varname = varinfo%varname(i) + call netcdf_interface_putvar(filename,varname,work(i,:)) + + end do ! do i = 1, n1dv + + ! Deallocate memory for local variables + + if(allocated(work)) deallocate(work) + + ! Allocate memory for local variables + + if(.not. allocated(work)) allocate(work(n0dv,1)) + + ! Define local variables + + work(1,1) = meteo%psfc + + ! Loop through local variable + + do i = 1, n0dv + + ! Define local variables + + varname = varinfo%varname(n1dv+i) + call netcdf_interface_putvar(filename,varname,work(i,1)) + + end do ! do i = 1, n0dv + + ! Deallocate memory for local variables + + if(allocated(work)) deallocate(work) + call variable_interface_cleanup_struct(varinfo) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine write_sonde_meteo + + !======================================================================= + +end module fileio_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/forecast_model_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/forecast_model_interface.F90 new file mode 100644 index 000000000..8460d3f4e --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/forecast_model_interface.F90 @@ -0,0 +1,841 @@ +module forecast_model_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: forecast_model_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use bufrio_interface + use constants_interface + use fileio_interface + use grid_methods_interface + use gridprojs_interface + use gridtrans_interface + use kinds_interface + use math_methods_interface + use namelist_interface + use time_methods_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: forecast_model_fv3 + interface observation_assignments + module procedure fv3_observations + end interface observation_assignments + interface rotate_winds + module procedure fv3_rotate_winds + end interface rotate_winds + interface write_fcstmdl_bufr + module procedure fv3_bufr + end interface write_fcstmdl_bufr + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! forecast_model_fv3.f90 + + ! DESCRIPTION: + + ! This subroutine is the driver-level subroutine to ingest the + ! necessary variable fields from the FV3 model forecast files and + ! project the observations into a reference frame relative to the + ! available geographical locations specified by the user; the BUFR + ! observations are derived and written to an external user specified + ! filepath. + + !----------------------------------------------------------------------- + + subroutine forecast_model_fv3() + + ! Define variables computed within routine + + type(fcstmdl_struct), dimension(:), allocatable :: fcstmdl + type(tcinfo_struct), dimension(:), allocatable :: tcinfo + type(fv3_struct) :: fv3 + type(grid_struct) :: grid + type(windrotate_struct) :: windrotate + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(tcinfo_filename,tcinfo) + call fileio_interface_read(fv3,windrotate) + + ! Check local variable and proceed accordingly + + if(is_global) grid%ncoords = (size(fv3_orog_filename)*fv3%nx*fv3%ny) + if(is_regional) grid%ncoords = (fv3%nx*fv3%ny) + + ! Define local variables + + call variable_interface_setup_struct(grid) + + ! Check local variable and proceed accordingly + + if(is_rotate_winds) call rotate_winds(fv3,windrotate) + + ! Deallocate memory for local variables + + call windrotate_cleanup(windrotate) + + ! Allocate memory for local variables + + if(.not. allocated(fcstmdl)) allocate(fcstmdl(size(tcinfo))) + + ! Define local variables + + fcstmdl(:)%nz = fv3%nz + grid%lat = fv3%lat + grid%lon = fv3%lon + + ! Loop through local variables + + do i = 1, size(tcinfo) + + ! Define local variables + + grid%gclat = tcinfo(i)%mdl_clat + grid%gclon = tcinfo(i)%mdl_clon + + ! Compute local variables + + call grid_methods_polarcoords(grid) + call observation_locations(grid,fcstmdl(i)) + call observation_assignments(fcstmdl(i),tcinfo(i),fv3) + + end do ! do i = 1, size(tcinfo) + + ! Deallocate memory for local variables + + if(allocated(tcinfo)) deallocate(tcinfo) + call variable_interface_cleanup_struct(grid) + + ! Define local variables + + call write_fcstmdl_bufr(fcstmdl,fv3) + + ! Deallocate memory for local variables + + if(allocated(fcstmdl)) deallocate(fcstmdl) + call variable_interface_cleanup_struct(fv3) + + !===================================================================== + + end subroutine forecast_model_fv3 + + !======================================================================= + + ! SUBROUTINE: + + ! bufr_record.f90 + + ! DESCRIPTION: + + ! This subroutine constructs a BUFR record and writes the respective + ! record to the external BUFR file. + + ! INPUT VARIABLES: + + ! * fcstmdl; a FORTRAN fcstmdl_struct variable containing the + ! observation values; it is assumed that the wind variables have + ! already been rotated from model space to observation space. + + ! * idx; a FORTRAN integer value specifying the horizontal + ! coordinate value within the respective FORTRAN fcstmdl_struct + ! variable arrays. + + ! * kdx; a FORTRAN integer value specifying the vertical coordinate + ! value within the respective FORTRAN fcstmdl_struct variable + ! arrays. + + ! * bufr_info; a FORTRAN bufr_info_struct variable containing the + ! BUFR variable attributes. + + ! * bufr; a FORTRAN bufr_struct variable containing the BUFR record + ! and filename attributes. + + ! * obid; a FORTRAN integer value used to create a unique variable + ! identifier for the respective BUFR record. + + !----------------------------------------------------------------------- + + subroutine bufr_record(fcstmdl,idx,kdx,bufr_info,bufr,obid) + + ! Define variables passed to routine + + type(bufr_struct) :: bufr + type(bufr_info_struct) :: bufr_info + type(fcstmdl_struct) :: fcstmdl + integer :: idx + integer :: kdx + integer :: obid + + ! Define variables computed within routine + + character(len=8) :: cacobid + real(r_double) :: racobid + + !===================================================================== + + ! Define local variables + + equivalence(racobid,cacobid) + write(cacobid,500) obid + call variable_interface_setup_struct(bufr) + bufr%hdr(1) = dble(racobid) + bufr%hdr(2) = dble(fcstmdl%lon(idx)) + bufr%hdr(3) = dble(fcstmdl%lat(idx)) + bufr%hdr(4) = 0.0 + bufr%hdr(5) = bufr_info%obs_type_mass + bufr%obs(1,1) = fcstmdl%p(idx,kdx)/100.0 + bufr%obs(2,1) = fcstmdl%q(idx,kdx)*1000.0*1000.0 + bufr%obs(3,1) = (fcstmdl%t(idx,kdx) - 273.15) + bufr%qcf(1,1) = 2.0 + bufr%qcf(2,1) = 2.0 + bufr%qcf(3,1) = 2.0 + call bufrio_interface_write(bufr) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufr) + + ! Define local variables + + call variable_interface_setup_struct(bufr) + bufr%hdr(1) = dble(racobid) + bufr%hdr(2) = dble(fcstmdl%lon(idx)) + bufr%hdr(3) = dble(fcstmdl%lat(idx)) + bufr%hdr(4) = 0.0 + bufr%hdr(5) = bufr_info%obs_type_wind + bufr%obs(1,1) = fcstmdl%p(idx,kdx)/100.0 + bufr%obs(4,1) = fcstmdl%u(idx,kdx) + bufr%obs(5,1) = fcstmdl%v(idx,kdx) + bufr%qcf(1,1) = 2.0 + bufr%qcf(4,1) = 2.0 + call bufrio_interface_write(bufr) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufr) + + ! Define local variables + +500 format(i8.8) + + !===================================================================== + + end subroutine bufr_record + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_bufr.f90 + + ! DESCRIPTION: + + ! This subroutine writes the FV3 forecast model derived observations + ! to an external user specified BUFR file. + + ! INPUT VARIABLES: + + ! * fcstmdl; an array of FORTRAN fcstmdl_struct variables which has + ! been populated with the contents from the FORTRAN fv3_struct + ! variable relative to the respective geographical locations. + + ! * fv3; a FORTRAN fv3_struct variable containing with variable + ! arrays which have been populated from the contents of the + ! external FV3 netcdf files. + + !----------------------------------------------------------------------- + + subroutine fv3_bufr(fcstmdl,fv3) + + ! Define variables passed to routine + + type(fcstmdl_struct) :: fcstmdl(:) + type(fv3_struct) :: fv3 + + ! Define variables computed within routine + + type(bufr_struct) :: bufr + type(bufr_info_struct) :: bufr_info + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(kdtree_struct) :: kdtree + character(len=500) :: lbufr_filepath + integer :: nobs + + ! Define counting variables + + integer :: i, j, k + + !===================================================================== + + ! Define local variables + + bufr_info%filename = bufr_info_filepath + call fileio_interface_read(bufr_info) + bufr%hdstr = 'SID XOB YOB DHR TYP' + bufr%obstr = 'POB QOB TOB UOB VOB' + bufr%qcstr = 'PQM QQM TQM WQM' + bufr%oestr = 'POE QOE TOE WOE' + bufr%subset = trim(adjustl(bufr_info%subset)) + bufr%mxmn = 5 + bufr%mxlv = 1 + lbufr_filepath = trim(adjustl(bufr_filepath)) + call bufrio_interface_idate(analdate,bufr) + call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & + & .false.,.true.) + nobs = 0 + + ! Check local variable and proceed accordingly + + if(mask_ocean .or. mask_land) then + + ! Define local variables + + dst_grid%ncoords = fv3%ncoords + call variable_interface_setup_struct(dst_grid) + dst_grid%lat = fv3%lat + dst_grid%lon = fv3%lon + + end if ! if(mask_ocean .or. mask_land) + + ! Loop through local variable + + do i = 1, size(fcstmdl) + + ! Check local variable and proceed accordingly + + if((.not. mask_ocean) .and. (.not. mask_land)) then + + ! Loop through local variable + + do j = 1, fcstmdl(i)%nobs + + ! Loop through local variable + + do k = 1, fcstmdl(i)%nz + + ! Define local variables + + nobs = nobs + 1 + call bufr_record(fcstmdl(i),j,k,bufr_info,bufr,nobs) + + end do ! do k = 1, fcstmdl(i)%nz + + end do ! do j = 1, fcstmdl(i)%nobs + + end if ! if((.not. mask_ocean) .and. (.not. mask_land)) + + ! Check local variable and proceed accordingly + + if(mask_ocean .or. mask_land) then + + ! Define local variables + + src_grid%ncoords = fcstmdl(i)%nobs + call variable_interface_setup_struct(src_grid) + src_grid%lat = fcstmdl(i)%lat + src_grid%lon = fcstmdl(i)%lon + kdtree%ncoords = dst_grid%ncoords + kdtree%nn = 1 + call variable_interface_setup_struct(kdtree) + + ! Compute local variables + + call math_methods_kdtree_nn(src_grid,dst_grid,kdtree) + + ! Loop through local variable + + do j = 1, fcstmdl(i)%nobs + + ! Loop through local variable + + do k = 1, fcstmdl(i)%nz + + ! Define local variables + + nobs = nobs + 1 + + ! Check local variable and proceed accordingly + + if(fcstmdl(i)%slmsk(j) .eq. fv3%slmsk(kdtree%idx(j,1))) & + & then + + ! Check local variable and proceed accordingly + + if(mask_ocean .and. (fv3%slmsk(kdtree%idx(j,1)) .ge. & + & 1.0) .and. (.not. mask_land)) then + + ! Define local variables + + call bufr_record(fcstmdl(i),j,k,bufr_info,bufr, & + & nobs) + + end if ! if(mask_ocean + ! .and. (fv3%slmsk(kdtree%idx(j,1)) + ! .ge. 1.0)) + + ! Check local variable and proceed accordingly + + if(mask_land .and. (fv3%slmsk(kdtree%idx(j,1)) .le. & + & 0.0) .and. (.not. mask_ocean)) then + + ! Define local variables + + call bufr_record(fcstmdl(i),j,k,bufr_info,bufr, & + & nobs) + + end if ! if(mask_land + ! .and. (fv3%slmsk(kdtree%idx(j,1)) + ! .le. 0.0)) + + end if ! if(fcstmdl(i)%slmsk(j) + ! .eq. fv3%slmsk(kdtree%idx(j,1))) + + end do ! do k = 1, fcstmdl(i)%nz + if (debug) write(6,601) 'i,j,Lev1:',i,j, & + fcstmdl(i)%lon(j),fcstmdl(i)%lat(j),fcstmdl(i)%p(j,1),fcstmdl(i)%t(j,1),fcstmdl(i)%q(j,1), & + fcstmdl(i)%u(j,1),fcstmdl(i)%v(j,1) + end do ! do j = 1, fcstmdl(i)%nobs + + end if ! if(mask_ocean .or. mask_land) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fcstmdl(i)) + call variable_interface_cleanup_struct(src_grid) + call variable_interface_cleanup_struct(kdtree) + + end do ! do i = 1, size(fcstmdl) + + ! Define local variables + + call bufrio_interface_close(.false.,.true.) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(dst_grid) +601 format(a10,i3,i12,7f15.6) + !===================================================================== + + end subroutine fv3_bufr + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_observations.f90 + + ! DESCRIPTION: + + ! This subroutine computes and populates the arrays within the + ! FORTRAN fcstmdl_struct variable with values from the FORTRAN + ! fv3_struct variable; the geographical coordinate values are + ! updated relative to the difference between the observed and the + ! forecast model geographical positions. + + ! INPUT VARIABLES: + + ! * fcstmdl; a FORTRAN fcstmdl_struct variable which has been + ! initialized and observation locations assigned. + + ! * tcinfo; a FORTRAN tcinfo_struct variable now containing the + ! tropical cyclone attributes retrieved from the user specified + ! file. + + ! * fv3; a FORTRAN fv3_struct variable containing with variable + ! arrays which have been populated from the contents of the + ! external FV3 netcdf files. + + ! OUTPUT VARIABLES: + + ! * fcstmdl; a FORTRAN fcstmdl_struct variable which has been + ! populated with the contents from the FORTRAN fv3_struct + ! variable. + + !----------------------------------------------------------------------- + + subroutine fv3_observations(fcstmdl,tcinfo,fv3) + + ! Define variables passed to routine + + type(fcstmdl_struct) :: fcstmdl + type(fv3_struct) :: fv3 + type(tcinfo_struct) :: tcinfo + + ! Define variables computed within routine + + type(fv3_struct) :: fv3_local + real(r_kind) :: dlat + real(r_kind) :: dlon + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_relocate) then + + ! Compute local variables + + dlat = tcinfo%obs_clat - tcinfo%mdl_clat + dlon = tcinfo%obs_clon - tcinfo%mdl_clon + + else ! if(is_relocate) + + ! Define local variables + + dlat = 0.0 + dlon = 0.0 + + end if ! if(is_relocate) + + ! Define local variables + + fv3_local = fv3 + + ! Loop through local variable + + do i = 1, fcstmdl%nobs + + ! Define local variables + + fcstmdl%p(i,:) = fv3_local%p(fcstmdl%idx(i),:) + fcstmdl%q(i,:) = fv3_local%q(fcstmdl%idx(i),:) + fcstmdl%t(i,:) = fv3_local%t(fcstmdl%idx(i),:) + fcstmdl%u(i,:) = fv3_local%ua(fcstmdl%idx(i),:) + fcstmdl%v(i,:) = fv3_local%va(fcstmdl%idx(i),:) + fcstmdl%lat(i) = fv3_local%lat(fcstmdl%idx(i)) + dlat + fcstmdl%lon(i) = fv3_local%lon(fcstmdl%idx(i)) + dlon + fcstmdl%slmsk(i) = fv3_local%slmsk(fcstmdl%idx(i)) + + end do ! do i = 1, fcstmdl%nobs + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(fv3_local) + + !===================================================================== + + end subroutine fv3_observations + + !======================================================================= + + ! SUBROUTINE: + + ! fv3_rotate_winds.f90 + + ! DESCRIPTION: + + ! This subroutine rotates the FV3 forecast model vector winds to an + ! Earth-relative rotation and interpolates the vector the FV3 grid + ! cell centers. + + ! INPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable containing (at minimum) the + ! model grid projection information. + + ! * windrotate; a FORTRAN windrotate_struct variable containing the + ! rotation coefficients for the grid projection. + + ! OUTPUT VARIABLES: + + ! * fv3; a FORTRAN fv3_struct variable containing the respective + ! forecast model winds rotated to an Earth-relative coordinate + ! system. + + !----------------------------------------------------------------------- + + subroutine fv3_rotate_winds(fv3,windrotate) + + ! Define variables passed to routine + + type(fv3_struct) :: fv3 + type(windrotate_struct) :: windrotate + + ! Define variables computed within routine + + real(r_kind), dimension(:,:), allocatable :: uwnd + real(r_kind), dimension(:,:), allocatable :: vwnd + + ! Define counting variables + + integer :: i, j, k + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(uwnd)) allocate(uwnd(fv3%nx,fv3%ny)) + if(.not. allocated(vwnd)) allocate(vwnd(fv3%nx,fv3%ny)) + + ! Loop through local variable + + do k = 1, fv3%nz + + ! Loop through local variable + + do j = 1, fv3%ny + + ! Loop through local variable + + do i = 1, fv3%nx + + ! Compute local variables + + uwnd(i,j) = 0.5*((fv3%u(i,j,k)*windrotate%sangv(i,j) - & + & fv3%v(i,j,k)*windrotate%sangu(i,j))/ & + & (windrotate%cangu(i,j)*windrotate%sangv(i,j) - & + & windrotate%sangu(i,j)*windrotate%cangv(i,j)) + & + & (fv3%u(i,j+1,k)*windrotate%sangv(i+1,j) - & + & fv3%v(i+1,j,k)*windrotate%sangu(i,j+1))/ & + & (windrotate%cangu(i,j+1)*windrotate%sangv(i+1,j) - & + & windrotate%sangu(i,j+1)*windrotate%cangv(i+1,j))) + vwnd(i,j) = 0.5*((fv3%u(i,j,k)*windrotate%cangv(i,j) - & + & fv3%v(i,j,k)*windrotate%cangu(i,j))/ & + & (windrotate%sangu(i,j)*windrotate%cangv(i,j) - & + & windrotate%cangu(i,j)*windrotate%sangv(i,j)) + & + & (fv3%u(i,j+1,k)*windrotate%cangv(i+1,j) - & + & fv3%v(i+1,j,k)*windrotate%cangu(i,j+1))/ & + & (windrotate%sangu(i,j+1)*windrotate%cangv(i+1,j) - & + & windrotate%cangu(i,j+1)*windrotate%sangv(i+1,j))) + + end do ! do i = 1, fv3%nx + + end do ! do j = 1, fv3%ny + + ! Define local variables + + fv3%ua(:,k) = reshape(uwnd,shape(fv3%ua(:,k))) + fv3%va(:,k) = reshape(vwnd,shape(fv3%va(:,k))) + + end do ! do k = 1, fv3%nz + + ! Deallocate memory for local variables + + if(allocated(uwnd)) deallocate(uwnd) + if(allocated(vwnd)) deallocate(vwnd) + + !===================================================================== + + end subroutine fv3_rotate_winds + + !======================================================================= + + ! SUBROUTINE: + + ! observation_locations.f90 + + ! DESCRIPTION: + + ! This subroutine determines all grid locations representing + ! observations to be processed; the algorithm below utilizes KD-tree + ! searching algorithm to identify forecast model grid cell locations + ! that fall within a user specified radius; further, thinning is + ! performed in accordance with the user specified namelist variable + ! 'sample_radius'. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing the geographical + ! locations of the forecast model grid as well as the reference + ! location about which to determine observation locations. + + ! * fcstmdl; a FORTRAN fcstmdl_struct variable. + + ! OUTPUT VARIABLES: + + ! * fcstmdl; a FORTRAN fcstmdl_struct variable which has been + ! initialized and contains the grid cell locations (idx) for + ! observations to be processed. + + !----------------------------------------------------------------------- + + subroutine observation_locations(grid,fcstmdl) + + ! Define variables passed to routine + + type(fcstmdl_struct) :: fcstmdl + type(grid_struct) :: grid + + ! Define variables computed within routine + + type(kdtree_struct) :: kdtree + real(r_kind) :: radius_max + real(r_kind) :: radius_min + real(r_kind) :: sample_radius_threshold + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + kdtree%ncoords = 1 + kdtree%nn = grid%ncoords + call variable_interface_setup_struct(kdtree) + kdtree%nalloc = grid%ncoords + kdtree%r2 = (tc_radius*tc_radius) + + ! Compute local variables + + call math_methods_kdtree_r2(grid,grid,kdtree) + + if(debug) write(6,*) 'kdtree%nfound=', kdtree%nfound + + ! Check local variable and proceed accordingly + + if(sample_radius .eq. spval) then + + ! Define local variables + + fcstmdl%nobs = kdtree%nfound / sample_nindex + call variable_interface_setup_struct(fcstmdl) + fcstmdl%idx = kdtree%idx(1,1:kdtree%nfound:sample_nindex) + + else ! if(sample_radius .eq. spval) + + sample_radius_threshold = sqrt(kdtree%r2dist(1,2)) + if(debug) write(6,*) 'sample_radius_threshold=', sample_radius_threshold + + ! Define local variables + + fcstmdl%nobs = 0 + radius_min = 0.0 + radius_max = radius_min + sample_radius + + ! Loop through local variable + + do while(radius_max .le. tc_radius) + + ! Loop through local variable + + do i = 1, kdtree%nfound + + ! Check local variable + + if((sqrt(kdtree%r2dist(1,i)) .ge. radius_min) .and. & + & (sqrt(kdtree%r2dist(1,i)) .lt. radius_max)) then + + ! Define local variables + + if(abs(sqrt(kdtree%r2dist(1,i)) - 0.5*(radius_min+radius_max)) .lt. sample_radius_threshold ) then + fcstmdl%nobs = fcstmdl%nobs + 1 + end if + + end if ! if((sqrt(kdtree%r2dist(1,i)) .ge. radius_min) + ! .and. (sqrt(kdtree%r2dist(1,i)) + ! .lt. radius_max)) + + end do ! do i = 1, kdtree%nfound + + ! Define local variables + + radius_min = radius_max + sample_radius + radius_max = radius_min + sample_radius + + end do ! do while(radius .le. tc_radius) + + ! Define local variables + + call variable_interface_setup_struct(fcstmdl) + fcstmdl%nobs = 0 + radius_min = 0.0 + radius_max = radius_min + sample_radius + + ! Loop through local variable + + do while(radius_max .le. tc_radius) + + ! Loop through local variable + + do i = 1, kdtree%nfound + + ! Check local variable + + if((sqrt(kdtree%r2dist(1,i)) .ge. radius_min) .and. & + & (sqrt(kdtree%r2dist(1,i)) .lt. radius_max)) then + + ! Define local variables + if(abs(sqrt(kdtree%r2dist(1,i)) - 0.5*(radius_min+radius_max)) .lt. sample_radius_threshold ) then + !if(debug) write(6,*) 'i,radius_min,radius_max,sqrt(kdtree%r2dist(1,i)=',i,radius_min,radius_max,sqrt(kdtree%r2dist(1,i)) + fcstmdl%nobs = fcstmdl%nobs + 1 + fcstmdl%idx(fcstmdl%nobs) = kdtree%idx(1,i) + end if + + end if ! if((sqrt(kdtree%r2dist(1,i)) .ge. radius_min) + ! .and. (sqrt(kdtree%r2dist(1,i)) + ! .lt. radius_max)) + + end do ! do i = 1, kdtree%nfound + + ! Define local variables + + radius_min = radius_max + sample_radius + radius_max = radius_min + sample_radius + + end do ! do while(radius .le. tc_radius) + + end if ! if(sample_radius .eq. spval) + + if(debug) write(6,*) 'fcstmdl%nobs=', fcstmdl%nobs + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(kdtree) + + !===================================================================== + + end subroutine observation_locations + + !======================================================================= + +end module forecast_model_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/grid_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/grid_methods_interface.F90 new file mode 100644 index 000000000..a73b42b21 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/grid_methods_interface.F90 @@ -0,0 +1,478 @@ +module grid_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: grid_methods_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: grid_methods_anglegrid + public :: grid_methods_gcgeo + public :: grid_methods_polarcoords + public :: grid_methods_radialgrid + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! grid_methods_anglegrid.f90 + + ! DESCRIPTION: + + ! This subroutine computes a grid of angle values relative to a + ! reference Earth-bound geographical location and a grid of + ! longitude and latitude values assuming the equitorial radius of + ! the Earth. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN tcgrid_struct variable containing grid longitude + ! and latitude values; units for longitude and latitude are + ! degrees. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN tcgrid_struct variable containing the computed + ! angle relative to a reference Earth-bound geographical location + ! assuming the equitorial radius of the Earth; units are degrees. + + !----------------------------------------------------------------------- + + subroutine grid_methods_anglegrid(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + ! Define variables computed within routine + + real(r_kind) :: ecircum + real(r_kind) :: dlon + real(r_kind) :: dlat + real(r_kind) :: hyp_dist + real(r_kind) :: opp_dist + real(r_kind) :: adj_dist + real(r_kind) :: sin_value + real(r_kind) :: cos_value + real(r_kind) :: sin_angle + real(r_kind) :: cos_angle + real(r_kind) :: tmp_angle + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Compute local variables + + ecircum = 2.0*pi*(rearth_equator/1000.0) + + ! Define local variables + + grid%angle = 0.0 + + ! Loop through local variable + + do i = 1, grid%ncoords + + ! Compute local variables + + dlon = abs(grid%gclon - grid%lon(i)) + dlat = abs(grid%gclat - grid%lat(i)) + call radialdist(grid%gclon,grid%gclat,grid%lon(i),grid%lat(i), & + & hyp_dist) + + ! Check local variable and proceed accordingly + + if(dlon .eq. 0.0 .and. dlat .gt. 0.0) then + + ! Define local variables + + if(grid%gclat .gt. grid%lat(i)) grid%angle(i) = 180.0 + if(grid%gclat .lt. grid%lat(i)) grid%angle(i) = 0.0 + + else if(dlon .gt. 0.0 .and. dlat .eq. 0.0) then + + ! Define local variables + + if(grid%gclon .gt. grid%lon(i)) grid%angle(i) = 270.0 + if(grid%gclon .lt. grid%lon(i)) grid%angle(i) = 90.0 + + else ! if(dlon .eq. 0.0 .and. dlat .gt. 0.0) + + ! Compute local variables + + opp_dist = dlat/360.0*ecircum + sin_value = opp_dist/(hyp_dist/1000.0) + call radialdist(grid%gclon,grid%gclat,grid%lon(i),grid%gclat, & + & adj_dist) + cos_value = (adj_dist/1000.0)/(hyp_dist/1000.0) + + ! Define local variables + + if(sin_value .gt. 1.0) sin_value = 0.99999 + if(cos_value .gt. 1.0) cos_value = 0.99999 + + ! Compute local variables + + sin_angle = asin(sin_value)/deg2rad + cos_angle = acos(cos_value)/deg2rad + tmp_angle = 0.5*(sin_angle + cos_angle) + + ! Check local variable and proceed accordingly + + if(grid%gclat .le. grid%lat(i) .and. grid%gclon .le. & + & grid%lon(i)) then + + ! Compute local variables + + grid%angle(i) = 90.0 - tmp_angle + + else if(grid%gclat .gt. grid%lat(i) .and. grid%gclon .le. & + & grid%lon(i)) then + + ! Compute local variables + + grid%angle(i) = 90.0 + tmp_angle + + else if(grid%gclat .ge. grid%lat(i) .and. grid%gclon .ge. & + & grid%lon(i)) then + + ! Compute local variables + + grid%angle(i) = 270.0 - tmp_angle + + else if(grid%gclat .lt. grid%lat(i) .and. grid%gclon .ge. & + & grid%lon(i)) then + + ! Compute local variables + + grid%angle(i) = 270.0 + tmp_angle + + end if ! if(grid%gclat .le. grid%lat(i) .and. grid%gclon + ! .le. grid%lon(i)) + + end if ! if(dlon .eq. 0.0 .and. dlat .gt. 0.0) + + end do ! do i = 1, grid%ncoords + + !===================================================================== + + end subroutine grid_methods_anglegrid + + !======================================================================= + + ! SUBROUTINE: + + ! grid_methods_gcgeo.f90 + + ! DESCRIPTION: + + ! This subroutine computes the longitude and latitude (e.g., + ! geographical) coordinates, assuming a great-circle distance, of an + ! advected position provided an initial geographical position + ! (defined by the longitude and latitude coordinates) and a distance + ! and heading. + + ! REFERENCES: + + ! http://www.edwilliams.org/avform.htm + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing the initial + ! geographical position (gclon and gclat) and the heading (gchead; + ! degrees) and distance (gcdist; meters); all geographical + ! position units are assumed to be degrees. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing the newly + ! computed geographical position (gclon and gclat). + + !----------------------------------------------------------------------- + + subroutine grid_methods_gcgeo(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + ! Define variables computed within routine + + real(r_kind) :: lon + real(r_kind) :: lat + real(r_kind) :: dlon + real(r_kind) :: head + real(r_kind) :: dist + + !===================================================================== + + ! Define local variables + + lat = grid%gclat*deg2rad + lon = grid%gclon*deg2rad + head = grid%gchead*deg2rad + dist = (grid%gcdist/rearth_equator) + + ! Compute local variables + + lat = asin(sin(lat)*cos(dist) + cos(lat)*sin(dist)*cos(head)) + dlon = atan2(sin(head)*sin(dist)*cos(lat),cos(dist) - sin(lat)* & + & sin(lat)) + lon = mod(lon - dlon + pi, 2.0*pi) - pi + + ! Define local variables + + grid%gclon = lon*rad2deg + grid%gclat = lat*rad2deg + + !===================================================================== + + end subroutine grid_methods_gcgeo + + !======================================================================= + + ! SUBROUTINE: + + ! grid_methods_polarcoords.f90 + + ! DESCRIPTION: + + ! This subroutine will compute the polar coordinate values of radial + ! distance and azimuthal angle relative to a reference geographical + ! location. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing grid longitude + ! and latitude values and the reference longitude and latitude + ! coordinates (gclon and gclat, respectively); units for longitude + ! and latitude are degrees. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing the computed + ! radial distance relative to a reference Earth-bound geographical + ! location assuming the equitorial radius of the Earth (units are + ! meters) and the angle relative to a reference Earth-bound + ! geographical location assuming the equitorial radius of the + ! Earth (units are degrees). + + !----------------------------------------------------------------------- + + subroutine grid_methods_polarcoords(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + !===================================================================== + + ! Compute local variables + + call grid_methods_radialgrid(grid) + call grid_methods_anglegrid(grid) + + !===================================================================== + + end subroutine grid_methods_polarcoords + + !======================================================================= + + ! SUBROUTINE: + + ! grid_methods_radialgrid.f90 + + ! DESCRIPTION: + + ! This subroutine computes a grid of radial distance values relative + ! to a reference Earth-bound geographical location and a grid of + ! longitude and latitude values assuming the equitorial radius of + ! the Earth. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing the grids of + ! longitude and latitude values, as well as the reference + ! geographical locations (gclon and gclat); units for all + ! longitude and latitude values are degrees. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable containing the computed + ! radial distance relative to a reference Earth-bound geographical + ! location assuming the equitorial radius of the Earth; units are + ! meters. + + !----------------------------------------------------------------------- + + subroutine grid_methods_radialgrid(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, grid%ncoords + + ! Compute local variables + + call radialdist(grid%gclon,grid%gclat,grid%lon(i),grid%lat(i), & + & grid%radius(i)) + + end do ! i = 1, grid%ncoords + + !===================================================================== + + end subroutine grid_methods_radialgrid + + !======================================================================= + + ! SUBROUTINE: + + ! radialdist.f90 + + ! DESCRIPTION: + + ! This subroutine computes the radial distance, using the + ! Earth-bound geographical coordinates, between two locations + ! assuming the equitorial radius of the Earth. + + ! INPUT VARIABLES: + + ! * lon1; a FORTRAN 4-byte real value specifying the geographical + ! longitude coordinate of location 1; units are degrees. + + ! * lat1; a FORTRAN 4-byte real value specifying the geographical + ! latitude coordinate of location 1; units are degrees. + + ! * lon2; a FORTRAN 4-byte real value specifying the geographical + ! longitude coordinate of location 2; units are degrees. + + ! * lat2; a FORTRAN 4-byte real value specifying the geographical + ! latitude coordinate of location 2; units are degrees. + + ! OUTPUT VARIABLES: + + ! * dist; a FORTRAN 4-byte real value specifying the radial distance + ! between two locations assuming the equitorial radius of the + ! Earth; units are meters. + + !----------------------------------------------------------------------- + + subroutine radialdist(lon1,lat1,lon2,lat2,dist) + + ! Define variables passed to routine + + real(r_kind) :: lon1 + real(r_kind) :: lat1 + real(r_kind) :: lon2 + real(r_kind) :: lat2 + real(r_kind) :: dist + + ! Define variables computed within routine + + real(r_double) :: lat1_deg + real(r_double) :: lat2_deg + real(r_double) :: lat1_rad + real(r_double) :: lat2_rad + real(r_double) :: lon1_deg + real(r_double) :: lon2_deg + real(r_double) :: lon1_rad + real(r_double) :: lon2_rad + real(r_double) :: x1 + real(r_double) :: y1 + real(r_double) :: z1 + real(r_double) :: x2 + real(r_double) :: y2 + real(r_double) :: z2 + real(r_kind) :: dr + + !===================================================================== + + ! Compute local variables + + lon1_deg = lon1 + lon1_deg = mod(lon1_deg,360.d0) + if(lon1_deg .lt. 0.d0) then + lon1_deg = lon1_deg + 360.d0 + end if ! if(lon1_deg .lt. 0.d0) + lon2_deg = lon2 + lon2_deg = mod(lon2_deg,360.d0) + if(lon2_deg .lt. 0.d0) then + lon2_deg = lon2_deg + 360.d0 + end if ! if(lon2_deg .lt. 0.d0) + if(lat1 .lt. lat2) then + lon1_rad = lon1_deg*deg2rad + lat1_rad = (90.d0 - lat1)*deg2rad + lon2_rad = lon2_deg*deg2rad + lat2_rad = (90.d0 - lat2)*deg2rad + else if(lat1 .eq. lat2 .and. lon1_deg .le. lon2_deg) then + lon1_rad = lon1_deg*deg2rad + lat1_rad = (90.d0 - lat1)*deg2rad + lon2_rad = lon2_deg*deg2rad + lat2_rad = (90.d0 - lat2)*deg2rad + else + lon1_rad = lon2_deg*deg2rad + lat1_rad = (90.d0 - lat2)*deg2rad + lon2_rad = lon1_deg*deg2rad + lat2_rad = (90.d0 - lat1)*deg2rad + end if ! if(lat1 .lt. lat2) + x1 = sin(lat1_rad)*cos(lon1_rad) + y1 = sin(lat1_rad)*sin(lon1_rad) + z1 = cos(lat1_rad) + x2 = sin(lat2_rad)*cos(lon2_rad) + y2 = sin(lat2_rad)*sin(lon2_rad) + z2 = cos(lat2_rad) + dr = acos(min(1.d0,x1*x2 + y1*y2 + z1*z2)) + dist = dr*rearth_equator + + !===================================================================== + + end subroutine radialdist + + !======================================================================= + +end module grid_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/json_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/json_interface.F90 new file mode 100644 index 000000000..bd0894b57 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/json_interface.F90 @@ -0,0 +1,146 @@ +module json_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: json_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use fson + use fson_value_m + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: json_interface_nrecs + public :: json_interface_read + interface json_interface_read + module procedure read_bufr_info + end interface json_interface_read + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! json_interface_nrecs.f90 + + ! DESCRIPTION: + + ! This subroutine defines the number of records within the external + ! JSON formatted file specified by the user using the FSON API + ! utilities. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! a JSON formatted file. + + !----------------------------------------------------------------------- + + subroutine json_interface_nrecs(filename,json_size) + + ! Define variables passed to routine + + character(len=500) :: filename + integer :: json_size + + ! Define variables computed within routine + + type(fson_value), pointer :: json_file + + !===================================================================== + + ! Define local variables + + json_file => fson_parse(trim(adjustl(filename))) + json_size = fson_value_count(json_file) + + !===================================================================== + + end subroutine json_interface_nrecs + + !======================================================================= + + ! SUBROUTINE: + + ! read_bufr_flag.f90 + + ! DESCRIPTION: + + ! This subroutine parses a JSON formatted file and defines the BUFR + ! record attributes as specified by the user. + + ! INPUT VARIABLES: + + ! * bufr_info; a FORTRAN bufr_info_struct variable. + + ! * filename; a FORTRAN character string specifying the full-path to + ! the user specified JSON formatted file containing the BUFR + ! record attributes. + + ! OUTPUT VARIABLES: + + ! * bufr_info; a FORTRAN bufr_info_struct variable containing the + ! BUFR record attributes specified by the user. + + !----------------------------------------------------------------------- + + subroutine read_bufr_info(bufr_info) + + ! Define variables passed to routine + + type(bufr_info_struct) :: bufr_info + character(len=500) :: filename + + ! Define variables computed within routine + + type(fson_value), pointer :: json_data + type(fson_value), pointer :: json_item + integer :: json_size + + !===================================================================== + + ! Define local variables + + json_data => fson_parse(bufr_info%filename) + json_item => fson_value_get(json_data,1) + call fson_get(json_item,'subset',bufr_info%subset) + call fson_get(json_item,'obs_type_mass',bufr_info%obs_type_mass) + call fson_get(json_item,'obs_type_wind',bufr_info%obs_type_wind) + call fson_destroy(json_data) + + !===================================================================== + + end subroutine read_bufr_info + + !======================================================================= + +end module json_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/kinds_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/kinds_interface.F90 new file mode 100644 index 000000000..d9448d59c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/kinds_interface.F90 @@ -0,0 +1,119 @@ +module kinds_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: kinds_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: default_integer + public :: default_real + public :: i_byte + public :: i_kind + public :: i_llong + public :: i_long + public :: i_short + public :: num_bytes_for_i_byte + public :: num_bytes_for_i_kind + public :: num_bytes_for_i_llong + public :: num_bytes_for_i_long + public :: num_bytes_for_i_short + public :: num_bytes_for_r_double + public :: num_bytes_for_r_quad + public :: num_bytes_for_r_kind + public :: num_bytes_for_r_single + public :: r_double + public :: r_kind + public :: r_quad + public :: r_single + + !----------------------------------------------------------------------- + + ! Define local variables + + integer, parameter :: & + & default_integer = 3 + integer, parameter :: & + & default_real = 1 + integer, parameter :: & + & llong_t = selected_int_kind(16) + integer, parameter :: & + & num_bytes_for_i_byte = 1 + integer, parameter :: & + & num_bytes_for_i_short = 2 + integer, parameter :: & + & num_bytes_for_i_long = 4 + integer, parameter :: & + & num_bytes_for_i_llong = 8 + integer, parameter :: & + & num_i_kinds = 4 + integer, dimension(num_i_kinds), parameter :: & + & integer_byte_sizes = & + & (/num_bytes_for_i_byte,num_bytes_for_i_short, & + & num_bytes_for_i_long,num_bytes_for_i_llong/) + integer, parameter :: & + & num_bytes_for_i_kind = integer_byte_sizes(default_integer) + integer, parameter :: & + & i_byte = selected_int_kind(1) + integer, parameter :: & + & i_short = selected_int_kind(4) + integer, parameter :: & + & i_long = selected_int_kind(8) + integer, parameter :: & + & i_llong = max(llong_t,i_long) + integer, dimension(num_i_kinds), parameter :: & + & integer_types = (/i_byte,i_short,i_long,i_llong/) + integer, parameter :: & + & i_kind = integer_byte_sizes(default_integer) + integer, parameter :: & + & num_r_kinds = 3 + integer, parameter :: & + & r_single = selected_real_kind(6) + integer, parameter :: & + & r_double = selected_real_kind(15) + integer, parameter :: & + & quad_t = selected_real_kind(20) + integer, parameter :: & + & r_quad = max(quad_t,r_double) + integer, parameter :: & + & num_bytes_for_r_single = 4 + integer, parameter :: & + & num_bytes_for_r_double = 8 + integer, parameter :: & + & num_bytes_for_r_quad = 16 + integer, dimension(num_r_kinds), parameter :: & + & real_kinds = (/r_single,r_double,r_quad/) + integer, dimension(num_r_kinds), parameter :: & + & real_byte_sizes = (/num_bytes_for_r_single, & + & num_bytes_for_r_double,num_bytes_for_r_quad/) + integer, parameter :: & + & r_kind = real_kinds(default_real) + integer, parameter :: & + & num_bytes_for_r_kind = real_byte_sizes(default_real) + + !======================================================================= + +end module kinds_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/main.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/main.F90 new file mode 100644 index 000000000..f21561631 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/main.F90 @@ -0,0 +1,48 @@ +program obs_preproc_main + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: obs_preproc_main + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use obs_preproc_interface + + ! Define interfaces and attributes for module routines + + implicit none + + !======================================================================= + + ! Compute local variables + + call obs_preproc() + + !======================================================================= + +end program obs_preproc_main diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/math_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/math_methods_interface.F90 new file mode 100644 index 000000000..9e68d056d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/math_methods_interface.F90 @@ -0,0 +1,913 @@ +module math_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: math_methods_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kdtree2_module + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: math_methods_kdtree_nn + public :: math_methods_kdtree_r2 + public :: math_methods_llp_interp + public :: math_methods_normalize_values + public :: math_methods_remove_duplicates + public :: math_methods_sort_array + public :: math_methods_spline_interp + public :: math_methods_stats + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! init_stats.f90 + + ! DESCRIPTION: + + ! This subroutine initializes a statgrid_struct variable. + + ! INPUT VARIABLES: + + ! * statgrid; an uninitialized FORTRAN statgrid_struct variable. + + ! OUTPUT VARIABLES: + + ! * statgrid; an initialized FORTRAN statgrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine init_stats(statgrid) + + ! Define variables passed to routine + + type(statgrid_struct) :: statgrid + + !===================================================================== + + ! Define local variables + + statgrid%varmin = spval + statgrid%varmax = spval + statgrid%mean = spval + statgrid%vari = spval + statgrid%nvals = 0 + + !===================================================================== + + end subroutine init_stats + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_kdtree_nn.f90 + + ! DESCRIPTION: + + ! This subroutine implements a KD-tree search algorithm to locate + ! the N-nearest neighbor locations for a user specified geographical + ! location. + + ! REFERENCES: + + ! Kennel, M. B., 2004: KDTREE2: Fortran 95 and C++ software to + ! efficiently search for near neighbors in a multi-dimensional + ! Euclidean space. + + ! http://arxiv.org/PScache/phvsics/pdf/0408/0408067.pdf. + + ! INPUT VARIABLES: + + ! * src_grid; a FORTRAN grid_struct variable containing the + ! Euclidean space geographical locations within which to find + ! nearest-neighbors; geographical locations (e.g., latitudes and + ! longitudes) are assumed to have units of degrees. + + ! * dst_grid; a FORTRAN grid_struct variable containing the + ! geographical locations for which to find the N-nearest neighbor + ! locations; geographical locations (e.g., latitudes and + ! longitudes) are assumed to have units of degrees. + + ! * kdtree; a FORTRAN kdtree_struct variable containing (at minimum) + ! the number of coordinate values (the ncoords attribute should be + ! equal to the dst_grid variable ncoords attribute) and the number + ! of nearest-neighbors to seek (the nn attribute should be less + ! than or equal to the src_grid variable ncoords attribute). + + ! OUTPUT VARIABLES: + + ! * kdtree; a FORTRAN kdtree_struct variable containing the + ! N-nearest neighbor R^2 distances and src_grid variable + ! coordinate values (r2dist and idx attributes, respectively); the + ! units for the r2dist attribute are meters squared. + + !----------------------------------------------------------------------- + + subroutine math_methods_kdtree_nn(src_grid,dst_grid,kdtree) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(kdtree_struct) :: kdtree + + ! Define variables computed within routine + + type(kdtree2), pointer :: kdtree2 + type(kdtree2_result) :: sresults(kdtree%nn) + real(r_kind), dimension(:,:), allocatable :: src_grdloc + real(r_kind) :: dst_grdloc(3) + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(src_grdloc)) & + & allocate(src_grdloc(3,src_grid%ncoords)) + + ! Loop through local variables + + do i = 1, src_grid%ncoords + + ! Compute local variables + + src_grdloc(1,i) = rearth_equator*cos(src_grid%lat(i)*deg2rad)* & + & cos(src_grid%lon(i)*deg2rad) + src_grdloc(2,i) = rearth_equator*cos(src_grid%lat(i)*deg2rad)* & + & sin(src_grid%lon(i)*deg2rad) + src_grdloc(3,i) = rearth_equator*sin(src_grid%lat(i)*deg2rad) + + end do ! do i = 1, src_grid%ncoords + + ! Compute local variables + + kdtree2 => kdtree2_create(src_grdloc,sort=.true.,rearrange=.true.) + + ! Loop through local variables + + do i = 1, dst_grid%ncoords + + ! Compute local variables + + dst_grdloc(1) = rearth_equator*cos(dst_grid%lat(i)*deg2rad)* & + & cos(dst_grid%lon(i)*deg2rad) + dst_grdloc(2) = rearth_equator*cos(dst_grid%lat(i)*deg2rad)* & + & sin(dst_grid%lon(i)*deg2rad) + dst_grdloc(3) = rearth_equator*sin(dst_grid%lat(i)*deg2rad) + + ! Define local variables + + call kdtree2_n_nearest(tp=kdtree2,qv=dst_grdloc,nn=kdtree%nn, & + & results=sresults) + kdtree%r2dist(i,1:kdtree%nn) = sresults(1:kdtree%nn)%dis + kdtree%idx(i,1:kdtree%nn) = sresults(1:kdtree%nn)%idx + + end do ! do i = 1, dst_grid%ncoords + + ! Deallocate memory for local variables + + call kdtree2_destroy(kdtree2) + if(allocated(src_grdloc)) deallocate(src_grdloc) + + !===================================================================== + + end subroutine math_methods_kdtree_nn + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_kdtree_r2.f90 + + ! DESCRIPTION: + + ! This subroutine finds the N nearest-neighbors within a user + ! specified radius of a given location. + + ! REFERENCES: + + ! Kennel, M. B., 2004: KDTREE2: Fortran 95 and C++ software to + ! efficiently search for near neighbors in a multi-dimensional + ! Euclidean space. + + ! http://arxiv.org/PScache/phvsics/pdf/0408/0408067.pdf. + + ! INPUT VARIABLES: + + ! * dst_grid; a FORTRAN grid_struct variable containing the + ! Euclidean space geographical locations within which to find + ! nearest-neighbors; geographical locations (e.g., latitudes and + ! longitudes) are assumed to have units of degrees. + + ! * src_grid; a FORTRAN grid_struct variable containing the + ! geographical locations for which to find the N-nearest neighbor + ! locations; geographical locations (e.g., latitudes and + ! longitudes) are assumed to have units of degrees. + + ! * kdtree; a FORTRAN kdtree_struct variable containing (at minimum) + ! the number of coordinate values (the ncoords attribute should be + ! equal to the dst_grid variable ncoords attribute) and the radial + ! distance within which to seek the nearest neighbors. + + ! OUTPUT VARIABLES: + + ! * kdtree; a FORTRAN kdtree_struct variable containing the + ! N-nearest neighbors within the R^2 distance specified by the + ! user. + + !----------------------------------------------------------------------- + + subroutine math_methods_kdtree_r2(src_grid,dst_grid,kdtree) + + ! Define variables passed to routine + + type(grid_struct) :: dst_grid + type(grid_struct) :: src_grid + type(kdtree_struct) :: kdtree + + ! Define variables computed within routine + + type(kdtree2), pointer :: kdtree2 + type(kdtree2_result) :: sresults(kdtree%nalloc) + real(r_kind), dimension(:,:), allocatable :: src_grdloc + real(r_kind) :: dst_grdloc(3) + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(src_grdloc)) & + & allocate(src_grdloc(3,dst_grid%ncoords)) + + ! Loop through local variables + + do i = 1, dst_grid%ncoords + + ! Compute local variables + + src_grdloc(1,i) = rearth_equator*cos(dst_grid%lat(i)*deg2rad)* & + & cos(dst_grid%lon(i)*deg2rad) + src_grdloc(2,i) = rearth_equator*cos(dst_grid%lat(i)*deg2rad)* & + & sin(dst_grid%lon(i)*deg2rad) + src_grdloc(3,i) = rearth_equator*sin(dst_grid%lat(i)*deg2rad) + + end do ! do i = 1, dst_grid%ncoords + + ! Compute local variables + + kdtree2 => kdtree2_create(src_grdloc,sort=.true.,rearrange=.true.) + dst_grdloc(1) = rearth_equator*cos(src_grid%gclat*deg2rad)* & + & cos(src_grid%gclon*deg2rad) + dst_grdloc(2) = rearth_equator*cos(src_grid%gclat*deg2rad)* & + & sin(src_grid%gclon*deg2rad) + dst_grdloc(3) = rearth_equator*sin(src_grid%gclat*deg2rad) + + ! Define local variables + + call kdtree2_r_nearest(tp=kdtree2,qv=dst_grdloc,r2=kdtree%r2,nfound= & + & kdtree%nfound,nalloc=kdtree%nalloc,results=sresults) + kdtree%r2dist(1,1:kdtree%nfound) = sresults(1:kdtree%nfound)%dis + kdtree%idx(1,1:kdtree%nfound) = sresults(1:kdtree%nfound)%idx + + ! Deallocate memory for local variables + + call kdtree2_destroy(kdtree2) + if(allocated(src_grdloc)) deallocate(src_grdloc) + + !===================================================================== + + end subroutine math_methods_kdtree_r2 + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_llp_interp.f90 + + ! DESCRIPTION: + + ! This subroutine interpolates a vertical profile from a source + ! profile to a destination profile using linear-log pressure + ! interpolation. + + ! INPUT VARIABLES: + + ! * interp_p; a FORTRAN interp_p_struct variable containing the + ! source pressure and variable profiles as well as the surface + ! pressure. + + ! * dstp; a FORTRAN 4-byte real value specifying the pressure level + ! for which to interpolate the respective source profile variable. + + ! OUTPUT VARIABLES: + + ! * dstvar; a FORTRAN 4-byte real value specifying the interpolated + ! profile variable value. + + !----------------------------------------------------------------------- + + subroutine math_methods_llp_interp(interp_p,dstp,dstvar) + + ! Define variables passed to routine + + type(interp_p_struct) :: interp_p + real(r_kind) :: dstp + real(r_kind) :: dstvar + + ! Define variables computed within routine + + integer :: idx_b + integer :: idx_t + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + dstvar = spval + idx_b = 0 + idx_t = 0 + + ! Loop through local variable + + do i = 2, interp_p%nz + + ! Check local variable and proceed accordingly + + if(dstp .le. interp_p%p(i-1) .and. dstp .gt. interp_p%p(i)) then + + ! Define local variables + + idx_b = i - 1 + idx_t = i + goto 1000 + + end if ! if(dstp .le. interp_p%p(i-1) .and. dstp + ! .gt. interp_p%p(i)) + + end do ! do i = 2, interp_p%nz + + ! Define local variables + +1000 continue + + ! Check local variable and proceed accordingly + + if(idx_b .eq. 0 .and. idx_t .eq. 0) then + + ! Define local variables + + idx_b = interp_p%nz + idx_t = 1 + + end if ! if(idx_b .eq. 0 .and. idx_t .eq. 0) + + ! Compute local variables + + dstvar = interp_p%var(idx_b) + (interp_p%var(idx_t) - & + & interp_p%var(idx_b))*((log(dstp) - log(interp_p%p(idx_b)))/ & + & (log(interp_p%p(idx_t)) - log(interp_p%p(idx_b)))) + + !===================================================================== + + end subroutine math_methods_llp_interp + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_normalize_values.f90 + + ! DESCRIPTION: + + ! This subroutine normalizes a variable array relative to the + ! respective variables attributes. + + ! REFERENCES: + + ! https://en.wikipedia.org/wiki/Feature_scaling + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN statgrid_struct variable containing the variable + ! array to be normalized. + + ! * norma; the minumum value about which to standardize the array. + + ! * normb; the maximum value about which to standardize the array. + + !----------------------------------------------------------------------- + + subroutine math_methods_normalize_values(grid,norma,normb) + + ! Define variables passed to routine + + type(statgrid_struct) :: grid + real(r_kind) :: norma + real(r_kind) :: normb + + ! Define variables computed within routine + + real(r_kind), dimension(:), allocatable :: var + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(var)) allocate(var(grid%n)) + + ! Compute local variables + + call math_methods_stats(grid) + + ! Loop through local variable + + do i = 1, grid%n + + ! Compute local variables + + var(i) = norma + (((grid%var(i) - grid%varmin)*(normb - norma))/ & + & (grid%varmax - grid%varmin)) + + end do ! do i = 1, grid%n + + ! Define local variables + + grid%var = var + + ! Deallocate memory for local variables + + if(allocated(var)) deallocate(var) + + !===================================================================== + + end subroutine math_methods_normalize_values + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_remove_duplicates.f90 + + ! DESCRIPTION: + + ! This subroutine ingests a FORTRAN interp_spline_struct variable + ! and removes duplicate values from the independent variable array. + + ! INPUT VARIABLES: + + ! * grid_in; a FORTRAN interp_spline_struct variable containing + ! possible duplicate values within the independent variable array, + ! xa. + + ! * grid_out; a FORTRAN interp_spline_struct variable to contain the + ! ingested interp_spline_struct variable grid_in, but devoid of + ! duplicate values. + + ! OUTPUT VARIABLES: + + ! * grid_out; a FORTRAN interp_spline_struct variable, initialized + ! as grid_in but no longer containing duplicate values within the + ! independent variable array, xa. + + !----------------------------------------------------------------------- + + subroutine math_methods_remove_duplicates(grid_in,grid_out) + + ! Define variables passed to routine + + type(interp_spline_struct) :: grid_in + type(interp_spline_struct) :: grid_out + + ! Define variables computed within routine + + logical, dimension(:), allocatable :: mask + integer :: num + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(mask)) allocate(mask(grid_in%n)) + + ! Define local variables + + mask = .false. + + ! Loop through local variable + + do i = 1, grid_in%n + + ! Define local variables + + num = count(grid_in%xa(i)==grid_in%xa) + + ! Check local variable and proceed accordingly + + if(num == 1) then + + ! Define local variables + + mask(i) = .true. + + else ! if(num == 1) + + ! Check local variable and proceed accordingly + + if(.not. any(grid_in%xa(i)==grid_in%xa .and. mask)) then + + ! Define local variables + + mask(i) = .true. + + end if ! if(.not. any(grid_in%xa(i)==grid_in%xa .and. mask)) + + end if ! if(num == 1) + + end do ! do i = 1, grid_in%n + + ! Define local variables + + grid_out%n = count(mask) + call variable_interface_setup_struct(grid_out) + grid_out%xa = pack(grid_in%xa,mask) + grid_out%ya = pack(grid_in%ya,mask) + + ! Deallocate memory for local variables + + if(allocated(mask)) deallocate(mask) + + !===================================================================== + + end subroutine math_methods_remove_duplicates + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_sort_array.f90 + + ! DESCRIPTION: + + ! This subroutine implements the SLATEC ssort routine to sort a + ! dependent array (ya) relative to a sorted independent array (xa); + ! the arrays may be sorted in either the ascending or descending + ! direction. + + ! REFERENCES: + + ! Singleton, R.C., 1969. Algorithm 347: an efficient algorithm for + ! sorting with minimal storage [M1]. Communications of the ACM, + ! 12(3), pp.185-186. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct containing the independent + ! (xa) and dependent (ya) variable arrays to be sorted. + + ! * ascend; a FORTRAN logical variable specifying whether the arrays + ! are to be sorted in the ascending direction. + + ! * descend; a FORTRAN logical variable specifying whether the + ! arrays are to be sorted in the descending direction. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct containing the sorted + ! independent (xa) and dependent (ya) variable arrays. + + !----------------------------------------------------------------------- + + subroutine math_methods_sort_array(grid,ascend,descend) + + ! Define variables passed to routine + + type(interp_spline_struct) :: grid + logical :: ascend + logical :: descend + + ! Define variables computed within routine + + real(r_kind), dimension(:), allocatable :: xa + real(r_kind), dimension(:), allocatable :: ya + integer :: kflag + integer :: n + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(ascend) kflag = 2 + if(descend) kflag = -2 + + ! Define local variables + + n = grid%n + + ! Check local variable and proceed accordingly + + if(n .ge. 2) then + + ! Allocate memory for local variables + + if(.not. allocated(xa)) allocate(xa(n)) + if(.not. allocated(ya)) allocate(ya(n)) + + ! Define local variables + + xa = grid%xa + ya = grid%ya + call ssort(xa,ya,n,kflag) + grid%xa = xa + grid%ya = ya + + ! Deallocate memory for local variables + + if(allocated(xa)) deallocate(xa) + if(allocated(ya)) deallocate(ya) + + end if ! if(n .ge. 2) + + !===================================================================== + + end subroutine math_methods_sort_array + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_spline_interp.f90 + + ! DESCRIPTION: + + ! This subroutine interpolates, using cubic splines, to find the + ! value of a variable at a location specified by the user; this + ! subroutine implements the sort2 subroutine of SLATEC and the + ! spline_cubic_set and spline_cubic_val subroutines of SPLINE. + + ! REFERENCES: + + ! de Boor, C., 1978: A practical guide to splines. Springer-Verlag, + ! 346pp. + + ! https://people.sc.fsu.edu/~jburkardt/f_src/spline/spline.html + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct containing the location + ! (xa) and variable (ya) arrays as well as the interpolation + ! location (x). + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct containing the interpolated + ! value (y). + + !----------------------------------------------------------------------- + + subroutine math_methods_spline_interp(grid) + + ! Define variables passed to routine + + type(interp_spline_struct) :: grid + + ! Define variables computed within routine + + type(interp_spline_struct) :: gridl + real(r_double), dimension(:), allocatable :: xa + real(r_double), dimension(:), allocatable :: ya + real(r_double), dimension(:), allocatable :: y2a + real(r_double) :: yp + real(r_double) :: ypp + real(r_double) :: yp1 + real(r_double) :: ypn + real(r_double) :: x + real(r_double) :: y + integer :: n + + !===================================================================== + + ! Define local variables + + call math_methods_remove_duplicates(grid,gridl) + x = dble(grid%x) + n = gridl%n + + ! Allocate memory for local variables + + if(.not. allocated(xa)) allocate(xa(n)) + if(.not. allocated(ya)) allocate(ya(n)) + if(.not. allocated(y2a)) allocate(y2a(n)) + + ! Check local variable and proceed accordingly + + if(gridl%n .ge. 2) then + + ! Define local variables + + call math_methods_sort_array(gridl,.true.,.false.) + yp1 = dble(0.0) + ypn = dble(0.0) + xa = dble(gridl%xa) + ya = dble(gridl%ya) + + ! Compute local variables + + call spline_cubic_set(n,xa(1:n),ya(1:n),3,yp1,3,ypn,y2a) + call spline_cubic_val(n,xa(1:n),ya(1:n),y2a(1:n),x,y,yp,ypp) + + end if ! if(gridl%n .ge. 2) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(gridl) + if(allocated(xa)) deallocate(xa) + if(allocated(ya)) deallocate(ya) + if(allocated(y2a)) deallocate(y2a) + + ! Define local variables + + grid%y = real(y) + + !===================================================================== + + end subroutine math_methods_spline_interp + + !======================================================================= + + ! SUBROUTINE: + + ! math_methods_stats.f90 + + ! DESCRIPTION: + + ! This subroutine defines/computes the attributes of a variable + ! array and returns the respective attibutes. + + ! INPUT VARIABLES: + + ! * statgrid; a FORTRAN statgrid_struct variable. + + ! OUTPUT VARIABLES: + + ! * statgrid; a FORTRAN statgrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine math_methods_stats(statgrid) + + ! Define variables passed to routine + + type(statgrid_struct) :: statgrid + + ! Define variables computed within routine + + real(r_kind) :: sum + real(r_kind) :: sumsq + real(r_kind) :: varmin + real(r_kind) :: varmax + integer :: count + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call init_stats(statgrid) + varmin = spval + varmax = -spval + sum = 0.0 + count = 0 + + ! Loop through local variable + + do i = 1, statgrid%n + + ! Check local variable and proceed accordingly + + if(statgrid%var(i) .ne. spval) then + + ! Define local variables + + varmin = min(varmin,statgrid%var(i)) + varmax = max(varmax,statgrid%var(i)) + + ! Compute local variables + + sum = sum + statgrid%var(i) + count = count + 1 + + end if ! if(vargrid%var(i) .ne. spval) + + end do ! do i = 1, statgrid%n + + ! Check local variable and proceed accordingly + + if(abs(varmax) .eq. spval) varmax = spval + if(varmin .ne. spval) statgrid%varmin = varmin + if(varmax .ne. spval) statgrid%varmax = varmax + if(count .gt. 0) statgrid%mean = sum/real(count) + if(statgrid%mean .ne. spval) then + + ! Define local variables + + sum = 0.0 + sumsq = 0.0 + + ! Loop through local variable + + do i = 1, statgrid%n + + ! Check local variable and proceed accordingly + + if(statgrid%var(i) .ne. spval) then + + ! Compute local variables + + sum = sum + (statgrid%var(i) - statgrid%mean) + sumsq = sumsq + ((statgrid%var(i) - statgrid%mean)* & + & (statgrid%var(i) - statgrid%mean)) + + end if ! if(statgrid%var(i) .ne. spval) + + end do ! do i = 1, statgrid%n + + ! Check local variable and proceed accordingly + + if(count .gt. 1) then + + ! Compute local variables + + statgrid%vari = (sumsq - (sum*sum)/count)/(count - 1) + statgrid%stdev = sqrt(statgrid%vari) + + end if ! if(count .gt. 1) + + end if ! if(statgrid%mean .ne. spval) + + ! Define local variables + + statgrid%nvals = count + + !===================================================================== + + end subroutine math_methods_stats + + !======================================================================= + +end module math_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/meteo_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/meteo_methods_interface.F90 new file mode 100644 index 000000000..6e412440c --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/meteo_methods_interface.F90 @@ -0,0 +1,504 @@ +module meteo_methods_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: meteo_methods_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use constants_interface + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: meteo_methods_dwpttemp + public :: meteo_methods_geolatdist + public :: meteo_methods_pottemp + public :: meteo_methods_spechumd + public :: meteo_methods_vpottemp + public :: meteo_methods_wspdwdir + public :: meteo_methods_wvmxrt + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_dwpttemp.f90 + + ! DESCRIPTION: + + ! This subroutine computes the dewpoint temperature (dwpt; Kelvin) + ! from the temperture (t; Kelvin) and relative humidity (rh; + ! percentage) profiles. + + ! REFERENCES: + + ! http://andrew.rsmas.miami.edu/bmcnoldy/humidity_conversions.pdf + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the temperature + ! (t; Kelvin) and relative humidity (rh; percentage) profiles. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the dewpoint + ! temperature (dwpt; Kelvin) profile. + + !----------------------------------------------------------------------- + + subroutine meteo_methods_dwpttemp(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + ! Define variables computed within routine + + real(r_double) :: a + real(r_double) :: b + real(r_double) :: abt + real(r_double) :: lrhp + real(r_double) :: svpt0 + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + a = dble(17.625) + b = dble(243.04) + svpt0 = dble(273.15) + grid%dwpt = spval + + ! Loop through local variable + + do i = 1, grid%nz + + ! Check local variable and proceed accordingly + + if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) then + + ! Compute local variables + + abt = (a*(grid%t(i) - svpt0))/(b + (grid%t(i) - svpt0)) + lrhp = log(grid%rh(i)/dble(100.0)) + grid%dwpt(i) = (b*(lrhp + abt))/(a - lrhp - abt) + svpt0 + + end if ! if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) + + end do ! do i = 1, grid%nz + + !===================================================================== + + end subroutine meteo_methods_dwpttemp + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_geolatdist.f90 + + ! DESCRIPTION: + + ! This subroutine computes the zonal- and meridional-displacement + ! (dx and dy, respectively) as a function of latitude. + + ! INPUT VARIABLES: + + ! * lat; a FORTRAN 4-byte real value specifying the latitude of + ! interest; units are degrees. + + ! * dx; a FORTRAN 4-byte real value to define the + ! zonal-displacement, dx. + + ! * dy; a FORTRAN 4-byte real value to define the + ! meridional-displacement, dy. + + ! OUTPUT VARIABLES: + + ! * dx; a FORTRAN 4-byte real value specifying the + ! zonal-displacement, dx; units are meters. + + ! * dy; a FORTRAN 4-byte real value specifying the + ! meridional-displacement, dy; units are meters. + + !----------------------------------------------------------------------- + + subroutine meteo_methods_geolatdist(lat,dx,dy) + + ! Define variables passed to routine + + real(r_kind) :: lat + real(r_kind) :: dx + real(r_kind) :: dy + + !===================================================================== + + ! Compute local variables + + dx = 111.32*cos(lat*deg2rad)*1000.0 + dy = 110.574*1000.0 + + !===================================================================== + + end subroutine meteo_methods_geolatdist + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_pottemp.f90 + + ! DESCRIPTION: + + ! This subroutine computes the potential temperature (thta; Kelvin) + ! profile from the temperature (t; Kelvin) and pressure (p; Pascals) + ! profiles. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the temperature + ! (t; Kelvin) and pressure (p; Pascals) profiles. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the computed + ! potential temperature (thta; Kelvin) profile. + + !----------------------------------------------------------------------- + + subroutine meteo_methods_pottemp(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + grid%thta = spval + + ! Loop through local variable + + do i = 1, grid%nz + + ! Check local variable and proceed accordingly + + if(grid%t(i) .ne. spval .and. grid%p(i) .ne. spval) then + + ! Compute local variables + + grid%thta(i) = grid%t(i)*(dble(100000.0)/grid%p(i))** & + & dble(rd_over_cp_mass) + + end if ! if(grid%t(i) .ne. spval .and. grid%p(i) .ne. spval) + + end do ! do i = 1, grid%nz + + !===================================================================== + + end subroutine meteo_methods_pottemp + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_spechumd.f90 + + ! DESCRIPTION: + + ! This subroutine computes the specific humidity value. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the pressure + ! (p; Pascals), the temperature (t; Kelvin) and relative humidity + ! (rh; percentage) values. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the computed + ! specific humidity value (q; kilograms per kilograms). + + !----------------------------------------------------------------------- + + subroutine meteo_methods_spechumd(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + !===================================================================== + + ! Compute local variables + + call meteo_methods_wvmxrt(grid) + grid%q = grid%wvmxrt/(dble(1.0) + grid%wvmxrt) + + !===================================================================== + + end subroutine meteo_methods_spechumd + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_vpottemp.f90 + + ! DESCRIPTION: + + ! This subroutine computes the virtual potential temperature (thtv; + ! Kelvin) profile from the temperature (t; Kelvin), water vapor + ! mixing ratio (q; kilograms per kilograms), and pressure (p; + ! Pascals) profiles. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the temperature + ! (t; Kelvin), water vapor mixing ratio (q; kilograms per + ! kilograms), and pressure (p; Pascals) profiles. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the computed + ! virtual potential temperature (thtv; Kelvin) profile. + + !----------------------------------------------------------------------- + + subroutine meteo_methods_vpottemp(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + grid%thtv = spval + + ! Loop through local variable + + do i = 1, grid%nz + + ! Check local variable and proceed accordingly + + if(grid%t(i) .ne. spval .and. grid%q(i) .ne. spval .and. grid%p(i) & + & .ne. spval) then + + ! Compute local variables + + grid%thtv(i) = (grid%q(i)*grid%t(i))*(dble(100000.0)/ & + & grid%p(i))**dble(rd_over_cp_mass) + + end if ! if(grid%t(i) .ne. spval .and. grid%q(i) .ne. spval + ! .and. grid%p(i) .ne. spval) + + end do ! do i = 1, grid%nz + + !===================================================================== + + end subroutine meteo_methods_vpottemp + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_wspdwdir.f90 + + ! DESCRIPTION: + + ! This subroutine computes the wind speed magnitude and + ! meteorological wind speed direction profiles from the zonal- and + ! meridional-wind speed component profiles. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the zonal- and + ! meridional-wind speed component profiles. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the computed + ! wind-speed magnitude (wspd; meters per second) and + ! wind-direction profiles (wdir; degrees). + + !----------------------------------------------------------------------- + + subroutine meteo_methods_wspdwdir(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + grid%wspd = spval + grid%wdir = spval + + ! Loop through local variable + + do i = 1, grid%nz + + ! Check local variable and proceed accordingly + + if(grid%u(i) .ne. spval .and. grid%v(i) .ne. spval) then + + ! Compute local variables + + grid%wspd(i) = dble(sqrt(grid%u(i)*grid%u(i) + & + & grid%v(i)*grid%v(i))) + grid%wdir(i) = dble(atan2(grid%u(i),grid%v(i)))*dble(rad2deg) + & + & dble(180.0) + + end if ! if(grid%u(i) .ne. spval .and. grid%v(i) .ne. spval) + + end do ! do i = 1, grid%nz + + !===================================================================== + + end subroutine meteo_methods_wspdwdir + + !======================================================================= + + ! SUBROUTINE: + + ! meteo_methods_wvmxrt.f90 + + ! DESCRIPTION: + + ! This subroutine computes the water vapor mixing ratio profile from + ! the temperature (t) and relative humidity (rh) profiles. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the temperature + ! (t; Kelvin) and relative humidity (rh; percentage) profiles. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing the computed + ! water vapor mixing ratio profile (q; kilograms per kilograms). + + !----------------------------------------------------------------------- + + subroutine meteo_methods_wvmxrt(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + ! Define variables computed within routine + + real(r_double) :: eps + real(r_double) :: es + real(r_double) :: es0 + real(r_double) :: svp1 + real(r_double) :: svp2 + real(r_double) :: svp3 + real(r_double) :: svpt0 + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + es0 = dble(6.1121) + eps = dble(0.622) + svp1 = dble(0.6112) + svp2 = dble(17.67) + svp3 = dble(29.62) + svpt0 = dble(273.15) + grid%q = spval + + ! Loop through local variable + + do i = 1, grid%nz + + ! Check local variable and proceed accordingly + + if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) then + + ! Compute local variables + + es = dble(0.01)*grid%rh(i)*svp1*dble(10.0)*exp(svp2*(grid%t(i) & + & - svpt0)/(grid%t(i) - svp3)) + + ! Check local variable and proceed accordingly + + if(es .ge. grid%p(i)/dble(100.0)) then + + ! Define local variables + + grid%wvmxrt(i) = dble(1.e-6) + + else ! if(es .ge. grid%p(i)/dble(100.0)) + + ! Define local variables + + grid%wvmxrt(i) = max(eps*es/(grid%p(i)/dble(100.0) - es), & + & dble(1.e-6)) + + end if ! if(es .ge. grid%p(i)/dble(100.0)) + + end if ! if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) + + end do ! do i = 1, grid%nz + + !===================================================================== + + end subroutine meteo_methods_wvmxrt + + !======================================================================= + +end module meteo_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/namelist_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/namelist_interface.F90 new file mode 100644 index 000000000..28a06c2bb --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/namelist_interface.F90 @@ -0,0 +1,658 @@ +module namelist_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: namelist_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + + !----------------------------------------------------------------------- + + ! DESCRIPTION (alphabetized): + + ! * analdate; a FORTRAN character string specifying the analysis + ! date about which to define the observation times; formatted as, + ! assuming UNIX convention, ccyy-mm-dd_HH:MM:SS. + + ! * bufr_filepath; a FORTRAN character string specifying the + ! full-path to the BUFR file to be written (or appended) to. + + ! * bufr_info_filepath; a FORTRAN character string specifying + ! the full-path to the external file containing the BUFR + ! information for the respective observation type. + + ! * bufr_obs_filename; an array of FORTRAN character strings + ! specifying the path to the BUFR-formatted files to be used to + ! create the time-centered observations BUFR-formatted file. + + ! * bufr_obs_maxdate; a FORTRAN character string specifying the + ! maximum observation time for all time-centered observation + ! collected from bufr_obs_filename (see above); formatted as, + ! assuming UNIX convention, ccyy-mm-dd_HH:MM:SS. + + ! * bufr_obs_mindate; a FORTRAN character string specifying the + ! minimum observation time for all time-centered observation + ! collected from bufr_obs_filename (see above); formatted as, + ! assuming UNIX convention, ccyy-mm-dd_HH:MM:SS. + + ! * bufr_tblpath; a FORTRAN character string specifying the + ! full-path to the external file containing the BUFR table to be + ! written (or appended) to the output BUFR file. + + ! * datapath; a FORTRAN character string specifying the full-path to + ! the directory to contain output files written by the respective + ! routines. + + ! * debug; a FORTRAN logical value specifying whether to include + ! debug information during execution. + + ! Both is_fcst_model and is_fv3 must both be .true. for these + ! files to be invoked. + + ! * fv3_dyns_filename; an array of FORTRAN character strings + ! specifying the path to the FV3 netcdf files containing the + ! dynamical core variables; namely, the following netcdf + ! variables: + + ! + T; temperature (K). + + ! + delp; pressure layer difference (Pa). + + ! + ua; zonal wind on at the center of the grid cell (meters per + ! second). + + ! + va; meridional wind on at the center of the grid cell (meters + ! per second). + + ! * fv3_gridspec_filename; an array of FORTRAN character strings + ! specifying th path to the FV3 netcdf files containing the grid + ! geographical coordinate values; namely the following netcdf + ! variables: + + ! + lat; the grid cell corner latitude values. + + ! + latt; the grid cell center latitude values. + + ! + lon; the grid cell corner longitude values. + + ! + lont; the grid cell center longitude values. + + ! * fv3_orog_filename; an array of FORTRAN character strings + ! specifying the path to the FV3 netcdf files containing the + ! orography; namely the following netcdf variables: + + ! + slmsk; the land/sea mask. + + ! Both is_fcst_model and is_fv3 must both be .true. for these + ! files to be invoked. + + ! * fv3_static_filename; a FORTRAN character string specifying the + ! path to the FV3 netcdf file containing the static variables; + ! namely the following netcdf variables: + + ! + hyam; the hybrid-pressure coordinate values for the model + ! layers. + + ! + hybm; the hybrid-pressure coordinate values for the model + ! layers. + + ! Both is_fcst_model and is_fv3 must both be .true. for this file + ! to be invoked. + + ! * fv3_tracer_filename; an array of FORTRAN character strings + ! specifying the path to the FV3 netcdf files containing the + ! tracer variables; namely the following netcdf variables: + + ! + sphum; specific humidity (kilograms per kilogram). + + ! Both is_fcst_model and is_fv3 must both be .true. for these + ! files to be invoked. + + ! * grid_ratio; a FORTRAN 4-byte float value specifying the + ! grid-refinement ratio; used only for nested grid tiles. + + ! * is_bufrobs; a FORTRAN logical value specifying whether to + ! created BUFR-formatted observation files using the + ! bufr_obs_filename (see above) values and the values for + ! bufr_obs_maxdate and bufr_obs_mindate (see above). + + ! * is_fcst_model; a FORTRAN logical value specifying whether the + ! observations to be formatted are computed from forecast model + ! fields. + + ! * is_fv3; a FORTRAN logical value specifying whether the forecast + ! model, for the creation of observations from forecast model + ! fields, is from the FV3; is_fcst_model must be .true. to invoke + ! this option. + + ! * is_global; a FORTRAN logical value specifying whether the + ! ingested fields are from a global forecast model; applies only + ! if is_fcst_model is .true.. + + ! * is_gpsrobufr; a FORTRAN logical value specifying that the + ! time-centered observations are for Global Position System (GPS) + ! Radio Occultation (RO) observations; see is_bufrobs (above) and + ! bufr_obs_filename (above). + + ! * is_prepbufr; a FORTRAN logical value specifying that the + ! time-centered observations are for a prepbufr-type observation + ! file; see is_bufrobs (above) and bufr_obs_filename (above). + + ! * is_recon; a FORTRAN logical variable specifying whether the + ! observations to be formatted are derived from reconnissance-type + ! missions. + + ! * is_recon_vdm; a FORTRAN logical value specifying whether the + ! reconnissance observations are derived from vortex data message + ! (VDM) files. + + ! * is_recon_tdr; a FORTRAN logical value specifying whether the + ! reconnissance observations are derived from Tail-Doppler Radar + ! (TDR) Binary Universal Formatted (BUFR) files. + + ! * is_regional; a FORTRAN logical value specifying whether the + ! ingested fields are from a regional forecast model; applies only + ! if is_fcst_model is .true.. + + ! * is_relocate; a FORTRAN logical value specifying whether to + ! relocate forecast model derived observations relative to + ! tropical cyclone (TC) observed geographical locations. + + ! * is_rotate_winds; a FORTRAN logical value specifying whether to + ! rotate forecast model vector winds to an Earth-relative rotation + ! relative to a user specified geographical location. + + ! * is_satbufr; a FORTRAN logical value specifying that the + ! time-centered observations are for a satellite observation + ! bufr-type files; see is_bufrobs (above) and bufr_obs_filename + ! (above). + + ! * is_sonde; a FORTRAN logical value specifying whether the + ! observations to be formatted are derived from sondes. + + ! * is_sonde_tempdrop; a FORTRAN logical value specifying whether + ! the sonde observations are derived from TEMP-DROP messages. + + ! * mask_land; a FORTRAN logical value specifying whether to apply a + ! land-mask for observation values (i.e., all observations + ! occuring over non-zero topography are masked out -- not written + ! as a BUFR record). + + ! * mask_ocean; a FORTRAN logical value specifying whether to apply + ! a ocean-mask for observation values (i.e., all observations + ! occuring over ocean are masked out -- not written as a BUFR + ! record). + + ! * recon_filelist; a FORTRAN character string specifying the + ! full-path to the external file containing a list of files + ! containing aircraft reconnissance derived observations to be + ! written into a BUFR record. + + ! * recon_tdr_filepath; a FORTRAN character string specifying the + ! full-path to the external file containing the TDR BUFR + ! observation records. + + ! * sample_radius; a FORTRAN 4-byte float value specifying the + ! thinning radius for forecast model derived observations; units + ! are meters. + + ! * sample_nindex; a FORTRAN integer value specifying the + ! thinning index for forecast model derived observations. + + ! * sonde_filelist; a FORTRAN character string specifying the + ! full-path to the external file containing a list of TEMPDROP + ! formatted sondes to be decoded. + + ! * tc_radius; a FORTRAN 4-byte float value specifying the maximum + ! sampling radius for forecast model derived observations relative + ! to tropical cyclone (TC) observed positions. + + ! * tcinfo_filename; a FORTRAN character string specifying the path + ! to the ASCII formatted file containing the observed and model + ! forecast attributes for the respective TC events; is_fcst_model + ! must be .true. for this file to be invoked. + + ! * tdr_min_offset_seconds; a FORTRAN 4-byte float value specifying + ! the minimum observation time offset (in seconds) relative to the + ! time on the TDR BUFR file (see recon_tdr_filepath). + + ! * tdr_max_offset_seconds; a FORTRAN 4-byte float value specifying + ! the maximum observation time offset (in seconds) relative to the + ! time on the TDR BUFR file (see recon_tdr_filepath). + + ! * tdr_offset_deconds; a FORTRAN 4-byte float value specifying the + ! minimum difference between the observation time offset values + ! (see tdr_min_offset_seconds and tdr_max_offset_seconds). + + ! * tempdrop_compute_drift; a FORTRAN logical value specifying + ! whether to estimate the sonde drift, and the respective + ! geographical locations, from the collected TEMP-DROP formatted + ! observations. + + ! * tempdrop_hsa_table_file; a FORTRAN character string specifying + ! the full-path to a column-delimited table; if this file does not + ! exist upon call to this routine, it will be created; if the file + ! does exist upon call to this routine, it will be appended. + + ! * tempdrop_normalize; a FORTRAN logical value specifying whether + ! to normalize the geographical coordinate values computed for the + ! advection trajectory of the TEMP-DROP formatted observations. + + ! * tempdrop_write_nc_skewt; a FORTRAN logical value specifying + ! whether to write a network common data format (netcdf) file + ! containing interpolated National Oceanic and Atmospheric + ! Administration (NOAA) Atlantic Oceanographic and Meteorological + ! Laboratory (AOML) Hurricane Research Division (HRD) spline + ! analysis (HSA) values; tempdrop_compute_drift must be true. + + ! * wmm_coeff_filepath; a FORTRAN character string containing the + ! World Magnetic Model (WMM) coefficients that are used to + ! estimate the variations of the magnetic North Pole relative to + ! the Meteorological (e.g., 'true') North Pole; these are used in + ! instances of reconnissance (e.g., aircraft) collected + ! observations. + + !----------------------------------------------------------------------- + + ! Define local variables + + character(len=500) :: & + & bufr_obs_filename(10) = 'NOT USED' + character(len=500) :: & + & fv3_dyns_filename(6) = 'NOT USED' + character(len=500) :: & + & fv3_gridspec_filename(6) = 'NOT USED' + character(len=500) :: & + & fv3_orog_filename(6) = 'NOT USED' + character(len=500) :: & + & fv3_tracer_filename(6) = 'NOT USED' + character(len=500) :: & + & bufr_filepath = 'NOT USED' + character(len=500) :: & + & bufr_info_filepath = 'NOT USED' + character(len=500) :: & + & bufr_tblpath = 'NOT USED' + character(len=500) :: & + & datapath = './' + character(len=500) :: & + & fv3_static_filename = 'NOT USED' + character(len=500) :: & + & recon_filelist = 'NOT USED' + character(len=500) :: & + & recon_tdr_filepath = 'NOT USED' + character(len=500) :: & + & sonde_filelist = 'NOT USED' + character(len=500) :: & + & tcinfo_filename = 'NOT USED' + character(len=500) :: & + & tempdrop_hsa_table_file = './tempdrop-hsa.table' + character(len=500) :: & + & wmm_coeff_filepath = 'NOT USED' + character(len=19) :: & + & analdate = '2000-01-01_00:00:00' + character(len=19) :: & + & bufr_obs_maxdate = '2000-01-01_00:00:00' + character(len=19) :: & + & bufr_obs_mindate = '2000-01-01_00:00:00' + logical :: & + & debug = .false. + logical :: & + & is_bufr_obs = .false. + logical :: & + & is_fcst_model = .false. + logical :: & + & is_fv3 = .false. + logical :: & + & is_global = .false. + logical :: & + & is_gpsrobufr = .false. + logical :: & + & is_prepbufr = .false. + logical :: & + & is_recon = .false. + logical :: & + & is_recon_tdr = .false. + logical :: & + & is_recon_vdm = .false. + logical :: & + & is_regional = .false. + logical :: & + & is_relocate = .false. + logical :: & + & is_rotate_winds = .false. + logical :: & + & is_satbufr = .false. + logical :: & + & is_sonde = .false. + logical :: & + & is_sonde_tempdrop = .false. + logical :: & + & mask_land = .false. + logical :: & + & mask_ocean = .false. + logical :: & + & tempdrop_compute_drift = .false. + logical :: & + & tempdrop_normalize = .false. + logical :: & + & tempdrop_write_nc_skewt = .false. + real(r_kind) :: & + & grid_ratio = 1.0 + real(r_kind) :: & + & sample_radius = spval + integer :: & + & sample_nindex = 1 + real(r_kind) :: & + & tc_radius = 600000.0 + real(r_kind) :: & + & tdr_min_offset_seconds = 7200.0 + real(r_kind) :: & + & tdr_max_offset_seconds = -7200.0 + real(r_kind) :: & + & tdr_offset_dseconds = 1800.0 + integer :: & + & nbufr_obs_files = 0 + namelist /share/ analdate, datapath, debug, is_bufr_obs, & + & is_fcst_model, is_recon, is_sonde + namelist /bufrio/ bufr_filepath, bufr_info_filepath, & + & bufr_obs_filename, bufr_obs_maxdate, bufr_obs_mindate, & + & bufr_tblpath, is_gpsrobufr, is_prepbufr, is_satbufr, mask_land, & + & mask_ocean + namelist /fcst_mdl/ fv3_dyns_filename, fv3_gridspec_filename, & + & fv3_orog_filename, fv3_static_filename, fv3_tracer_filename, & + & grid_ratio, is_fv3, is_global, is_regional, is_rotate_winds, & + & sample_radius, sample_nindex + namelist /recon/ is_recon_tdr, is_recon_vdm, recon_filelist, & + & recon_tdr_filepath, tdr_min_offset_seconds, & + & tdr_max_offset_seconds, tdr_offset_dseconds + namelist /sonde/ is_sonde_tempdrop, sonde_filelist, & + & tempdrop_compute_drift, tempdrop_hsa_table_file, & + & tempdrop_normalize, tempdrop_write_nc_skewt + namelist /tc/ is_relocate, tc_radius, tcinfo_filename + namelist /wmm/ wmm_coeff_filepath + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! namelist.f90 + + ! DESCRIPTION: + + ! This subroutine acts as the interface to the namelist file, + ! provided as 'obs-preproc.input' by the user. + + !----------------------------------------------------------------------- + + subroutine namelist() + + ! Define variables computed within routine + + character(len=500) :: nml_filename + logical :: is_it_there + integer :: unit_nml + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + nml_filename = './obs-preproc.input' + unit_nml = 9 + is_it_there = .false. + inquire(file = trim(adjustl(nml_filename)),exist = is_it_there) + + ! Check local variable and proceed accordingly + + if(is_it_there) then + + ! Define local variables + + open(file = trim(adjustl(nml_filename)), & + unit = unit_nml , & + status = 'old' , & + form = 'formatted' , & + action = 'read') + read(unit_nml,NML = share) + read(unit_nml,NML = bufrio) + read(unit_nml,NML = fcst_mdl) + read(unit_nml,NML = recon) + read(unit_nml,NML = sonde) + read(unit_nml,NML = tc) + read(unit_nml,NML = wmm) + close(unit_nml) + + ! Loop through local variable + + do i = 1, size(bufr_obs_filename) + + ! Check local variable and proceed accordingly + + if(trim(adjustl(bufr_obs_filename(i))) .ne. 'NOT USED') then + + ! Define local variables + + nbufr_obs_files = nbufr_obs_files + 1 + + end if ! if(trim(adjustl(bufr_obs_filename(i))) .ne. 'NOT + ! USED') + + end do ! do i = 1, size(bufr_obs_filename) + + else ! if(is_it_there) + + ! Define local variables + + write(6,500) trim(adjustl(nml_filename)) + stop(99) + + end if ! if(is_it_there) + + ! Define local variables + + write(6,*) '&SHARE' + write(6,*) 'ANALDATE = ', analdate + write(6,*) 'DATAPATH = ', & + & trim(adjustl(datapath)) + write(6,*) 'DEBUG = ', debug + write(6,*) 'IS_BUFR_OBS = ', is_bufr_obs + write(6,*) 'IS_FCST_MODEL = ', is_fcst_model + write(6,*) 'IS_RECON = ', is_recon + write(6,*) 'IS_SONDE = ', is_sonde + write(6,*) '/' + write(6,*) '&BUFRIO' + write(6,*) 'BUFR_FILEPATH = ', & + & trim(adjustl(bufr_filepath)) + write(6,*) 'BUFR_INFO_FILEPATH = ', & + & trim(adjustl(bufr_info_filepath)) + write(6,*) 'BUFR_OBS_FILENAME = ' + + ! Loop through local variable + + do i = 1, nbufr_obs_files + + ! Define local variables + + write(6,*) trim(adjustl(bufr_obs_filename(i))) + + end do ! do i = 1, nbufr_obs_files + + ! Define local variables + + write(6,*) 'BUFR_OBS_MAXDATE = ', bufr_obs_maxdate + write(6,*) 'BUFR_OBS_MINDATE = ', bufr_obs_mindate + write(6,*) 'BUFR_TBLPATH = ', & + & trim(adjustl(bufr_tblpath)) + write(6,*) 'IS_GPSROBUFR = ', is_gpsrobufr + write(6,*) 'IS_PREPBUFR = ', is_prepbufr + write(6,*) 'IS_SATBUFR = ', is_satbufr + write(6,*) 'MASK_LAND = ', mask_land + write(6,*) 'MASK_OCEAN = ', mask_ocean + write(6,*) '/' + write(6,*) '&FCST_MDL' + + ! Check local variable and proceed accordingly + + if(is_global) then + + ! Define local variables + + write(6,*) 'FV3_DYNS_FILENAME = ' + + ! Loop through local variable + + do i = 1, 6 + + ! Define local variables + + write(6,*) trim(adjustl(fv3_dyns_filename(i))) + + end do ! do i = 1, 6 + + ! Define local variables + + write(6,*) 'FV3_OROG_FILENAME = ' + + ! Loop through local variable + + do i = 1, 6 + + ! Define local variables + + write(6,*) trim(adjustl(fv3_orog_filename(i))) + + end do ! do i = 1, 6 + + ! Define local variables + + write(6,*) 'FV3_STATIC_FILENAME = ', & + & trim(adjustl(fv3_static_filename)) + + ! Define local variables + + write(6,*) 'FV3_TRACER_FILENAME = ' + + ! Loop through local variable + + do i = 1, 6 + + ! Define local variables + + write(6,*) trim(adjustl(fv3_tracer_filename(i))) + + end do ! do i = 1, 6 + + end if ! if(is_global) + + ! Check local variable and proceed accordingly + + if(is_regional) then + + ! Define local variables + + write(6,*) 'FV3_DYNS_FILENAME = ', & + & trim(adjustl(fv3_dyns_filename(1))) + write(6,*) 'FV3_GRIDSPEC_FILENAME = ', & + & trim(adjustl(fv3_gridspec_filename(1))) + write(6,*) 'FV3_OROG_FILENAME = ', & + & trim(adjustl(fv3_orog_filename(1))) + write(6,*) 'FV3_STATIC_FILENAME = ', & + & trim(adjustl(fv3_static_filename)) + write(6,*) 'FV3_TRACER_FILENAME = ', & + & trim(adjustl(fv3_tracer_filename(1))) + + end if ! if(is_regional) + + ! Define local variables + + write(6,*) 'GRID_RATIO = ', grid_ratio + write(6,*) 'IS_FV3 = ', is_fv3 + write(6,*) 'IS_GLOBAL = ', is_global + write(6,*) 'IS_REGIONAL = ', is_regional + write(6,*) 'IS_ROTATE_WINDS = ', is_rotate_winds + write(6,*) 'SAMPLE_RADIUS = ', sample_radius + write(6,*) 'SAMPLE_NINDEX = ', sample_nindex + write(6,*) '/' + write(6,*) '&RECON' + write(6,*) 'IS_RECON_TDR = ', is_recon_tdr + write(6,*) 'IS_RECON_VDM = ', is_recon_vdm + write(6,*) 'RECON_FILELIST = ', & + & trim(adjustl(recon_filelist)) + write(6,*) 'RECON_TDR_FILEPATH = ', & + & trim(adjustl(recon_tdr_filepath)) + write(6,*) 'TDR_MAX_OFFSET_SECONDS = ', tdr_max_offset_seconds + write(6,*) 'TDR_MIN_OFFSET_SECONDS = ', tdr_min_offset_seconds + write(6,*) 'TDR_OFFSET_DSECONDS = ', tdr_offset_dseconds + write(6,*) '/' + write(6,*) '&SONDE' + write(6,*) 'IS_SONDE_TEMPDROP = ', is_sonde_tempdrop + write(6,*) 'SONDE_FILELIST = ', & + & trim(adjustl(sonde_filelist)) + write(6,*) 'TEMPDROP_COMPUTE_DRIFT = ', & + & tempdrop_compute_drift + write(6,*) 'TEMPDROP_HSA_TABLE_FILE = ', & + & trim(adjustl(tempdrop_hsa_table_file)) + write(6,*) 'TEMPDROP_NORMALIZE = ', tempdrop_normalize + write(6,*) 'TEMPDROP_WRITE_NC_SKEWT = ', & + & tempdrop_write_nc_skewt + write(6,*) '/' + write(6,*) '&TC' + write(6,*) 'IS_RELOCATE = ', is_relocate + write(6,*) 'TC_RADIUS = ', tc_radius + write(6,*) 'TCINFO_FILENAME = ', & + & trim(adjustl(tcinfo_filename)) + write(6,*) '/' + write(6,*) '&WMM' + write(6,*) 'WMM_COEFF_FILEPATH = ', & + & trim(adjustl(wmm_coeff_filepath)) + write(6,*) '/' + write(6,*) '' +500 format('NAMELISTPARAMS: ', a, ' not found in the current working ', & + & 'directory. ABORTING!!!!') + + !===================================================================== + + end subroutine namelist + + !======================================================================= + +end module namelist_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/netcdf_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/netcdf_interface.F90 new file mode 100644 index 000000000..fe818f199 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/netcdf_interface.F90 @@ -0,0 +1,1772 @@ +module netcdf_interface + + !======================================================================= + + !$$$ MODULE DOCUMENTATION BLOCK + + ! obs-preproc :: netcdf_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + use netcdf + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: ncdimid + public :: ncfileid + public :: ncstatus + public :: ncvarid + public :: netcdf_interface_close + public :: netcdf_interface_getattr + public :: netcdf_interface_getdim + public :: netcdf_interface_getvar + public :: netcdf_interface_open + public :: netcdf_interface_putattr + public :: netcdf_interface_putvar + public :: netcdf_interface_writedef + interface netcdf_interface_getattr + module procedure getattr_char + module procedure getattr_real + end interface netcdf_interface_getattr + interface netcdf_interface_getvar + module procedure getvar_char_1d + module procedure getvar_double_2d + module procedure getvar_double_3d + module procedure getvar_double_4d + module procedure getvar_real_1d + module procedure getvar_real_2d + module procedure getvar_real_3d + module procedure getvar_real_4d + end interface netcdf_interface_getvar + interface netcdf_interface_putattr + module procedure putattr_char + module procedure putattr_double + module procedure putattr_int + module procedure putattr_real + end interface netcdf_interface_putattr + interface netcdf_interface_putvar + module procedure putvar_double + module procedure putvar_double_1d + module procedure putvar_double_2d + module procedure putvar_double_3d + module procedure putvar_double_4d + module procedure putvar_real_1d + module procedure putvar_real_2d + module procedure putvar_real_3d + module procedure putvar_real_4d + end interface netcdf_interface_putvar + + ! Define local variables + + integer :: ncdimid + integer :: ncfileid + integer :: ncstatus + integer :: ncvarid + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! getattr_char.f90 + + ! DESCRIPTION: + + ! This subroutine retrieves a character attribute from a netcdf + ! file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN character string to contain the netcdf attribute + ! value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN character string specifying the netcdf attribute + ! value. + + !----------------------------------------------------------------------- + + subroutine getattr_char(filename,attrname,var,varname) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: attrname + character(len=100), optional :: varname + character(len=*) :: var + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_get_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine getattr_char + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_char_1d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 1-dimensional character string variable + ! from a user specified netcdf file specified by the user supplied + ! netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * strlen; a FORTRAN integer specifying the length for each element + ! * of the character string variable. + + ! * var; a FORTRAN 1-dimensional character variable array to contain + ! the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 1-dimensional character variable array containing + ! the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_char_1d(filename,varname,strlen,var) + + ! Define variables passed to routine + + integer :: strlen + character(len=500) :: filename + character(len=100) :: varname + character(len=strlen) :: var(:) + + ! Define variables computed within routine + + character(len=strlen), dimension(:), allocatable :: workgrid + integer :: d1 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_char_1d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_double_2d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 2-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 2-dimensional 8-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 2-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_double_2d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:,:) + + ! Define variables computed within routine + + real(r_double), dimension(:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1)) + d2 = size(var(1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_double_2d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_double_3d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 3-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 3-dimensional 8-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 3-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_double_3d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:,:,:) + + ! Define variables computed within routine + + real(r_double), dimension(:,:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + integer :: d3 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1,1)) + d2 = size(var(1,:,1)) + d3 = size(var(1,1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_double_3d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_double_4d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 4-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-dimensional 8-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 4-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_double_4d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:,:,:,:) + + ! Define variables computed within routine + + real(r_double), dimension(:,:,:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + integer :: d3 + integer :: d4 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1,1,1)) + d2 = size(var(1,:,1,1)) + d3 = size(var(1,1,:,1)) + d4 = size(var(1,1,1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3,d4)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_double_4d + + !======================================================================= + + ! SUBROUTINE: + + ! getattr_real.f90 + + ! DESCRIPTION: + + ! This subroutine retrieves a 4-byte real-valued attribute from a + ! netcdf file. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN 4-byte real-valued variable to contain the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 4-byte real-valued variable specifying the netcdf + ! attribute value. + + !----------------------------------------------------------------------- + + subroutine getattr_real(filename,attrname,var,varname) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: attrname + character(len=100), optional :: varname + real(r_kind) :: var + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_get_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + ! Define local variables + + call netcdf_interface_close() + + !===================================================================== + + end subroutine getattr_real + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_1d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 1-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 1-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 1-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_1d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:) + + ! Define variables computed within routine + + real(r_kind), dimension(:), allocatable :: workgrid + integer :: d1 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_1d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_2d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 2-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 2-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 2-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_2d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:) + + ! Define variables computed within routine + + real(r_kind), dimension(:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1)) + d2 = size(var(1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_2d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_3d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 3-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 3-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 3-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_3d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:) + + ! Define variables computed within routine + + real(r_kind), dimension(:,:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + integer :: d3 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1,1)) + d2 = size(var(1,:,1)) + d3 = size(var(1,1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_3d + + !======================================================================= + + ! SUBROUTINE: + + ! getvar_real_4d.f90 + + ! DESCRIPTION: + + ! This subroutine reads a 4-dimensional variable from a user + ! specified netcdf file specified by the user supplied netcdf API + ! key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-dimensional 4-byte precision variable array to + ! contain the contents of the user specified netcdf variable. + + ! OUTPUT VARIABLES: + + ! * var; a FORTRAN 4-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine getvar_real_4d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:,:) + + ! Define variables computed within routine + + real(r_kind), dimension(:,:,:,:), allocatable :: workgrid + integer :: d1 + integer :: d2 + integer :: d3 + integer :: d4 + + !===================================================================== + + ! Define local variables + + d1 = size(var(:,1,1,1)) + d2 = size(var(1,:,1,1)) + d3 = size(var(1,1,:,1)) + d4 = size(var(1,1,1,:)) + + ! Allocate memory for local variables + + if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3,d4)) + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) + var = workgrid + call netcdf_interface_close() + + ! Deallocate memory for local variables + + if(allocated(workgrid)) deallocate(workgrid) + + !===================================================================== + + end subroutine getvar_real_4d + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_close.f90 + + ! DESCRIPTION: + + ! This subroutine closes a Network Common Data Format (netcdf) file + ! defined by the FORTRAN integer variable ncfileid. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_close() + + !===================================================================== + + ! Define local variables + + ncstatus = nf90_close(ncfileid) + + !===================================================================== + + end subroutine netcdf_interface_close + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_getdim.f90 + + ! DESCRIPTION: + + ! This subroutine assigns the dimension value associated with the + ! netcdf API key specified by the user. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * dimname; a FORTRAN character string specifying the netcdf API + ! key for the respective netcdf dimension variable. + + ! * dimval; a FORTRAN integer variable to contain the netcdf + ! dimension value. + + ! OUTPUT VARIABLES: + + ! * dimval; a FORTRAN integer value specifying the netcdf dimension + ! value. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_getdim(filename,dimname,dimval) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: dimname + integer :: dimval + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.true.,.false.,.false.) + ncstatus = nf90_inq_dimid(ncfileid,trim(adjustl(dimname)),ncdimid) + ncstatus = nf90_inquire_dimension(ncfileid,ncdimid,len=dimval) + call netcdf_interface_close() + + !===================================================================== + + end subroutine netcdf_interface_getdim + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_open.f90 + + ! DESCRIPTION: + + ! This subroutine opens a Network Common Data Format (netcdf) file + ! with permissions in accordance with the specifications of the + ! user; the global variable ncfileid is defined by this subroutine + ! until terminated by the subroutine netcdf_interface_close.f90. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * is_read; a FORTRAN logical variable specifying to open the + ! netcdf file with read-only permissions. + + ! * is_rdwr; a FORTRAN logical variable specifying to open the + ! netcdf file with read and write permissions. + + ! * is_write; a FORTRAN logical variable specifying to open a new + ! (and clobber any previous existence of a) the netcdf file with + ! write permissions. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_open(filename,is_read,is_rdwr,is_write) + + ! Define variables passed to routine + + character(len=500) :: filename + logical :: is_read + logical :: is_rdwr + logical :: is_write + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_read) then + + ! Define local variables + + ncstatus = nf90_open(trim(adjustl(filename)),nf90_nowrite, & + & ncfileid) + + end if ! if(is_read) + + ! Check local variable and proceed accordingly + + if(is_rdwr) then + + ! Define local variables + + ncstatus = nf90_open(trim(adjustl(filename)),nf90_write, & + & ncfileid) + + end if ! if(is_rdwr) + + ! Check local variable and proceed accordingly + + if(is_write) then + + ! Define local variables + + ncstatus = nf90_create(path=trim(adjustl(filename)), & + & cmode=or(nf90_clobber,nf90_64bit_offset),ncid=ncfileid) + + end if ! if(is_write) + + !===================================================================== + + end subroutine netcdf_interface_open + + !======================================================================= + + ! SUBROUTINE: + + ! netcdf_interface_writedef.f90 + + ! DESCRIPTION: + + ! This subroutine writes the Network Common Data Format (netcdf) + ! file dimension and variable definition section. + + ! INPUT VARIABLES: + + ! * varinfo; a FORTRAN varinfo_struct variable containing the + ! dimension and variable definitions for the netcdf file. + + !----------------------------------------------------------------------- + + subroutine netcdf_interface_writedef(varinfo) + + ! Define variables passed to routine + + type(varinfo_struct) :: varinfo + + ! Define variables computed within routine + + integer, dimension(:), allocatable :: dimid + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Loop through local variable + + do i = 1, varinfo%ndims + + ! Define local variables + + ncstatus = nf90_def_dim(ncfileid,trim(adjustl(varinfo%dimname(i))), & + & varinfo%dimval(i),varinfo%dimid(i)) + + end do ! do i = 1, varinfo%ndims + + ! Loop through local variable + + do i = 1, varinfo%nvars + + ! Allocate memory for local variables + + if(.not. allocated(dimid)) allocate(dimid(varinfo%varndims(i))) + + ! Loop through local variable + + do j = 1, varinfo%varndims(i) + + ! Define local variables + + dimid(j) = varinfo%vardimid(i,j) + + end do ! do j = 1, varinfo%varndims(i) + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'double') then + + ! Define local variables + + ncstatus = nf90_def_var(ncfileid, & + & trim(adjustl(varinfo%varname(i))),nf90_double, & + & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) + + end if ! if(varinfo%vartype(i) .eq. 'double') + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'float') then + + ! Define local variables + + ncstatus = nf90_def_var(ncfileid, & + & trim(adjustl(varinfo%varname(i))),nf90_float, & + & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) + + end if ! if(varinfo%vartype(i) .eq. 'float') + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'integer') then + + ! Define local variables + + ncstatus = nf90_def_var(ncfileid, & + & trim(adjustl(varinfo%varname(i))),nf90_int, & + & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) + + end if ! if(varinfo%vartype(i) .eq. 'integer') + + ! Loop through local variable + + do j = 1, varinfo%varnattrs(i) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & + & trim(adjustl(varinfo%varattrs(i,j,1))), & + & trim(adjustl(varinfo%varattrs(i,j,2)))) + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'float') then + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & + & '_FillValue',spval) + + end if ! if(varinfo%vartype(i) .eq. 'float') + + ! Check local variable and proceed accordingly + + if(varinfo%vartype(i) .eq. 'integer') then + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & + & '_FillValue',-99) + + end if ! if(varinfo%vartype(i) .eq. 'integer') + + end do ! do j = 1, varinfo%varnattrs(i) + + ! Deallocate memory for local variables + + if(allocated(dimid)) deallocate(dimid) + + end do ! do i = 1, varinfo%nvars + + ! Define local variables + + ncstatus = nf90_enddef(ncfileid) + + !===================================================================== + + end subroutine netcdf_interface_writedef + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_char.f90 + + ! DESCRIPTION: + + ! This subroutine writes a character attribute to a netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN character string to contain the netcdf attribute + ! value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_char(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + character(len=*) :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_char + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_int.f90 + + ! DESCRIPTION: + + ! This subroutine writes an integer-valued variable attribute to a + ! netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN integer-valued variable containing the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_int(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + integer :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_int + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_double.f90 + + ! DESCRIPTION: + + ! This subroutine writes a 8-byte real-valued variable attribute to + ! a netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN 8-byte real-valued variable containing the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_double(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + real(r_double) :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_double + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_double.f90 + + ! DESCRIPTION: + + ! This subroutine writes a variable value to a user specified netcdf + ! file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 8-byte precision value. + + !----------------------------------------------------------------------- + + subroutine putvar_double(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_double + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_double_1d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 1-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 1-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_double_1d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_double_1d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_double_2d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 2-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 2-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_double_2d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_double_2d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_double_3d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 3-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 3-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_double_3d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:,:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_double_3d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_double_4d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 4-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-dimensional 8-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_double_4d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_double) :: var(:,:,:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_double_4d + + !======================================================================= + + ! SUBROUTINE: + + ! putattr_real.f90 + + ! DESCRIPTION: + + ! This subroutine writes a 4-byte real-valued variable attribute to + ! a netcdf file. + + ! INPUT VARIABLES: + + ! * attrname; a FORTRAN character string specifying the netcdf + ! attribute. + + ! * var; a FORTRAN 4-byte real-valued variable containing the netcdf + ! attribute value. + + ! OPTIONAL INPUT VARIABLES: + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key; if not present, a global netcdf attribute is + ! assumed. + + !----------------------------------------------------------------------- + + subroutine putattr_real(attrname,var,varname) + + ! Define variables passed to routine + + character(len=100) :: attrname + character(len=100), optional :: varname + real(r_kind) :: var + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(present(varname)) then + + ! Define local variables + + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_att(ncfileid,ncvarid,trim(adjustl(attrname)), & + & var) + + else ! if(present(varname)) + + ! Define local variables + + ncstatus = nf90_put_att(ncfileid,nf90_global, & + & trim(adjustl(attrname)),var) + + end if ! if(present(varname)) + + !===================================================================== + + end subroutine putattr_real + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_1d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 1-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 1-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_1d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_1d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_2d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 2-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 2-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_2d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_2d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_3d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 3-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 3-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_3d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_3d + + !======================================================================= + + ! SUBROUTINE: + + ! putvar_real_4d.f90 + + ! DESCRIPTION: + + ! This subroutine write a 4-dimensional variable to a user specified + ! netcdf file in accordance with the user supplied netcdf API key. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the full-path to + ! the netcdf file. + + ! * varname; a FORTRAN character string specifying the netcdf + ! variable API key. + + ! * var; a FORTRAN 4-dimensional 4-byte precision variable array + ! containing the contents of the user specified netcdf variable. + + !----------------------------------------------------------------------- + + subroutine putvar_real_4d(filename,varname,var) + + ! Define variables passed to routine + + character(len=500) :: filename + character(len=100) :: varname + real(r_kind) :: var(:,:,:,:) + + !===================================================================== + + ! Define local variables + + call netcdf_interface_open(filename,.false.,.true.,.false.) + ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) + ncstatus = nf90_put_var(ncfileid,ncvarid,var) + call netcdf_interface_close() + + !===================================================================== + + end subroutine putvar_real_4d + + !======================================================================= + +end module netcdf_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/obs_preproc_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/obs_preproc_interface.F90 new file mode 100644 index 000000000..baadb7219 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/obs_preproc_interface.F90 @@ -0,0 +1,90 @@ +module obs_preproc_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: obs_preproc_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use diagnostics_interface + use kinds_interface + use namelist_interface + use observations_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: obs_preproc + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! obs_preproc.f90 + + ! DESCRIPTION: + + ! This subroutine is the driver routine to preprocess all + ! observation types in preparation for subsequent data assimilation + ! applications. + + !----------------------------------------------------------------------- + + subroutine obs_preproc() + + ! Define variables computed within routine + + real(r_kind) :: time_start + + !===================================================================== + + ! Define local variables + + call diagnostics_time_start(time_start) + call namelist() + + ! Compute local variables + + call observations() + + ! Define local variables + + call diagnostics_time_stop(time_start) + + !===================================================================== + + end subroutine obs_preproc + + !======================================================================= + +end module obs_preproc_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/observations_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/observations_interface.F90 new file mode 100644 index 000000000..c948f0a55 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/observations_interface.F90 @@ -0,0 +1,170 @@ +module observations_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: observations_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use bufr_obs_interface + use forecast_model_interface + use kinds_interface + use namelist_interface + use recon_tdr_interface + use recon_vdm_interface + use sonde_tempdrop_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: observations + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! observations.f90 + + ! DESCRIPTION: + + ! This is the driver routine for the preparation of all observation + ! types. + + !----------------------------------------------------------------------- + + subroutine observations() + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_bufr_obs) call bufr_obs_update() + if(is_fcst_model) call obs_fcst_model() + if(is_recon) call obs_recon() + if(is_sonde) call obs_sonde() + + !===================================================================== + + end subroutine observations + + !======================================================================= + + ! SUBROUTINE: + + ! obs_fcst_model.f90 + + ! DESCRIPTION: + + ! This is the driver routine for the preparation of all observations + ! collected from forecast model files; currently the following + ! forecast models are supported: + + ! + Finite Volume Cubed Sphere (FV3) + + !----------------------------------------------------------------------- + + subroutine obs_fcst_model() + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_fv3) call forecast_model_fv3() + + !===================================================================== + + end subroutine obs_fcst_model + + !======================================================================= + + ! SUBROUTINE: + + ! obs_recon.f90 + + ! DESCRIPTION: + + ! This is the driver routine for the preparation of all observations + ! collected from reconnissance messages; currently the following + ! platforms are supported: + + ! + Tail-Doppler radar (TDR) reconnissance observation information. + + ! + National Hurricane Center (NHC) Vortex Data Messages (VDM). + + !----------------------------------------------------------------------- + + subroutine obs_recon() + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_recon_tdr) call recon_tdr() + if(is_recon_vdm) call recon_vdm() + + !===================================================================== + + end subroutine obs_recon + + !======================================================================= + + ! SUBROUTINE: + + ! obs_sonde.f90 + + ! DESCRIPTION: + + ! This is the driver routine for the preparation of all observations + ! collected from sondes; currently the following platforms are + ! supported: + + ! + American Oceanographic and Meteorological Laboratory (AOML) + ! Hurricane Research Division (HRD) TEMP-DROP sondes. + + !----------------------------------------------------------------------- + + subroutine obs_sonde() + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(is_sonde_tempdrop) call sonde_tempdrop() + + !===================================================================== + + end subroutine obs_sonde + + !======================================================================= + +end module observations_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/recon_tdr_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/recon_tdr_interface.F90 new file mode 100644 index 000000000..d0ebe7f86 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/recon_tdr_interface.F90 @@ -0,0 +1,522 @@ +module recon_tdr_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: recon_tdr_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use bufrio_interface + use namelist_interface + use time_methods_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: recon_tdr + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! recon_tdr.f90 + + ! DESCRIPTION: + + ! This is the driver routine for determining the status and usage + ! capabilities for Tail-Doppler Radar (TDR) Binary Universal Format + ! (BUFR) file observations collected during tropical cyclone (TC) + ! events. + + !----------------------------------------------------------------------- + + subroutine recon_tdr() + + ! Define variables computed within routine + + type(tdr_struct) :: tdr + + !===================================================================== + + ! Define local variables + + call tdr_stmid(tdr) + call tdr_timeinfo(tdr) + call tdr_flag(tdr) + call write_tdr_status(tdr) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(tdr) + + !===================================================================== + + end subroutine recon_tdr + + !======================================================================= + + ! SUBROUTINE: + + ! tdr_flag.f90 + + ! DESCRIPTION: + + ! This subroutine determines + + ! INPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable containing (at minimum) + ! arrays for the event identifiers (stmid) and the observation + ! time offsets relative to the file timestamp (time_min and + ! time_max). + + ! OUTPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable containing the usage flag for + ! the TDR observation; 0 = use, 1 = no usage based on + ! user-specified (namelist-level) time check thresholds. + + !----------------------------------------------------------------------- + + subroutine tdr_flag(tdr) + + ! Define variables passed to routine + + type(tdr_struct) :: tdr + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, size(tdr%stmid) + + ! Check local variable and proceed accordingly + + if((tdr%time_min(i) .gt. tdr_min_offset_seconds) .or. & + & (tdr%time_max(i) .lt. tdr_max_offset_seconds) .or. & + & (abs(tdr%time_max(i) - tdr%time_min(i)) .lt. & + & tdr_offset_dseconds)) then + + ! Define local variables + + tdr%flag(i) = 1 + + else ! if((tdr%time_min(i) .gt. tdr_min_offset_seconds) + ! .or. (tdr%time_max(i) .lt. tdr_max_offset_seconds) + ! .or. (abs(tdr%time_max(i) - tdr%time_min(i)) + ! .lt. tdr_offset_dseconds)) + + ! Define local variables + + tdr%flag(i) = 0 + + end if ! if((tdr%time_min(i) .gt. tdr_min_offset_seconds) + ! .or. (tdr%time_max(i) .lt. tdr_max_offset_seconds) + ! .or. (abs(tdr%time_max(i) - tdr%time_min(i)) + ! .lt. tdr_offset_dseconds)) + + end do ! do i = 1, size(tdr%stmid) + + !===================================================================== + + end subroutine tdr_flag + + !======================================================================= + + ! SUBROUTINE: + + ! tdr_stmid.f90 + + ! DESCRIPTION: + + ! This subroutine determines the tropical cyclone (TC) identifier + ! for which the tail-Doppler radar (TDR) observations are collected. + + ! INPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable. + + ! OUTPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable containing the number of TC + ! event TDR observations within the BUFR-formatted file and the + ! corresponding TC identifiers. + + !----------------------------------------------------------------------- + + subroutine tdr_stmid(tdr) + + ! Define variables passed to routine + + type(tdr_struct) :: tdr + + ! Define variables computed within routine + + type(bufr_struct) :: bufr + type(bufrhdr_struct) :: bufrhdr + character(len=3) :: stmid + real(r_double) :: hdr + integer :: tcid + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + equivalence(hdr,stmid) + bufr%mxmn = 1 + bufr%mxlv = 1 + bufr%hdstr = 'STMID' + call bufrio_interface_readhdruniq(recon_tdr_filepath,bufr,bufrhdr) + tdr%nstmid = size(bufrhdr%hdr) + call variable_interface_setup_struct(tdr) + + ! Loop through local variable + + do i = 1, size(bufrhdr%hdr) + + ! Define local variables + + hdr = bufrhdr%hdr(1,i) + read(stmid,'(i)') tcid + call write_tdr_tcid(tcid,tdr%stmid(i)) + + end do ! do i = 1, size(bufrhdr%hdr) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufrhdr) + + ! Define local variables + +500 format(i2.2,'L') +501 format(i2.2,'E') +502 format(i2.2,'C') + + !===================================================================== + + end subroutine tdr_stmid + + !======================================================================= + + ! SUBROUTINE: + + ! tdr_timeinfo.f90 + + ! DESCRIPTION: + + ! This subroutine collects the file and observation time information + ! for each respective TDR event. + + ! INPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable containing (at minimum) the + ! number of TC event TDR observations within the BUFR-formatted + ! file and the corresponding TC identifiers. + + ! OUTPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable containing the observation + ! time offsets (time_min and time_max) relative to the file + ! timestamp (file_timestamp). + + !----------------------------------------------------------------------- + + subroutine tdr_timeinfo(tdr) + + ! Define variables passed to routine + + type(tdr_struct) :: tdr + + ! Define variables computed within routine + + type(bufr_struct) :: bufr + type(bufrhdr_struct) :: bufrhdr + character(len=10) :: datestr + character(len=3) :: ctcid + character(len=3) :: stmid + real(r_double) :: hdr(7) + real(r_double) :: jday_file + real(r_double) :: jday_obs + real(r_double) :: time_diff + integer :: dd + integer :: hh + integer :: mm + integer :: nn + integer :: ss + integer :: tcid + integer :: yyyy + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + equivalence(hdr(7),stmid) + bufr%mxmn = 7 + bufr%mxlv = 1 + bufr%hdstr = 'YEAR MNTH DAYS HOUR MINU SECO STMID' + call bufrio_interface_readhdrall(recon_tdr_filepath,bufr,bufrhdr) + write(datestr,'(i10)') bufr%idate + read(datestr,'(i4,3i2)') yyyy, mm, dd, hh + yyyy = 2000 + yyyy + nn = 0 + ss = 0 + write(tdr%file_timestamp,500) yyyy, mm, dd, hh, nn, ss + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,jday_file) + + ! Loop through local variable + + do i = 1, size(tdr%stmid) + + ! Define local variables + + tdr%time_max(i) = -1.0*spval + tdr%time_min(i) = spval + tdr%nrecs(i) = 0 + + ! Loop through local variable + + do j = 1, bufr%nrecs + + ! Define local variables + + hdr(7) = bufrhdr%hdr(7,j) + read(stmid,'(i)') tcid + call write_tdr_tcid(tcid,ctcid) + + ! Check local variable and proceed accordingly + + if(trim(adjustl(ctcid)) .eq. trim(adjustl(tdr%stmid(i)))) then + + ! Define local variables + + yyyy = int(bufrhdr%hdr(1,j)) + mm = int(bufrhdr%hdr(2,j)) + dd = int(bufrhdr%hdr(3,j)) + hh = int(bufrhdr%hdr(4,j)) + nn = int(bufrhdr%hdr(5,j)) + ss = int(bufrhdr%hdr(6,j)) + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,jday_obs) + time_diff = (jday_obs - jday_file)*86400 + + ! Define local variables + + tdr%time_min(i) = min(tdr%time_min(i),time_diff) + tdr%time_max(i) = max(tdr%time_max(i),time_diff) + tdr%nrecs(i) = tdr%nrecs(i) + 1 + + end if ! if(trim(adjustl(ctcid)) + ! .eq. trim(adjustl(tdr%stmid(i)))) + + end do ! do j = 1, bufr%nrecs + + end do ! do i = 1, size(tdr%stmid) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufrhdr) + + ! Define local variables + +500 format(i4.4,'-',i2.2,'-',i2.2,'_',i2.2,':',i2.2,':',i2.2) + + !===================================================================== + + end subroutine tdr_timeinfo + + !======================================================================= + + ! SUBROUTINE: + + ! write_tdr_status.f90 + + ! DESCRIPTION: + + ! This subroutine writes an external formatted file for each TDR + ! event which contains information pertaining to the collected TDR + ! observations; each file is written to the data path specified by + ! the user (datapath, namelist level) as 'recon_tdr_status.', + ! where is the TDR event identifier. + + ! INPUT VARIABLES: + + ! * tdr; a FORTRAN tdr_struct variable. + + !----------------------------------------------------------------------- + + subroutine write_tdr_status(tdr) + + ! Define variables passed to routine + + type(tdr_struct) :: tdr + + ! Define variables computed within routine + + character(len=500) :: filename + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, size(tdr%stmid) + + ! Define local variables + + write(filename,500) tdr%stmid(i) + filename = trim(adjustl(datapath))//filename + open(99,file=trim(adjustl(filename)),form='formatted') + write(99,501) tdr%stmid(i) + write(99,502) tdr%file_timestamp + write(99,503) tdr%time_min(i) + write(99,504) tdr%time_max(i) + write(99,505) tdr%nrecs(i) + write(99,506) tdr%flag(i) + write(99,507) trim(adjustl(recon_tdr_filepath)) + close(99) + + end do ! do i = 1, size(tdr%stmid) + + ! Define local variables + +500 format('recon_tdr_status.',a3) +501 format('EVENT: ',a3) +502 format('FILE_TIMESTAMP: ',a19) +503 format('MIN_SECONDS_OFFSET: ',f13.5) +504 format('MAX_SECONDS_OFFSET: ',f13.5) +505 format('NUMBER_OBSERVATIONS: ',i) +506 format('TDR_USAGE_FLAG: ',i1) +507 format('FILE_PATH: ',a) + + !===================================================================== + + end subroutine write_tdr_status + + !======================================================================= + + ! SUBROUTINE: + + ! write_tdr_tcid.f90 + + ! DESCRIPTION: + + ! This subroutine defines a logical character string corresponding + ! to the TDR event. + + ! INPUT VARIABLES: + + ! * itcid; a FORTRAN integer value containing the TDR event + ! identifier. + + ! * ctcid; a FORTRAN character string. + + ! OUTPUT VARIABLES: + + ! * ctcid; a FORTRAN character string defining the TC event + ! corresponding to the TDR event. + + ! NOTES: + + ! 100 <= itcid < 200; North Atlantic Ocean TDR event. + + ! 200 <= itcid < 300; Eastern Pacific Ocean TDR event. + + ! 300 <= itcid; Central Pacific Ocean TDR event. + + !----------------------------------------------------------------------- + + subroutine write_tdr_tcid(itcid,ctcid) + + ! Define variables passed to routine + + character(len=3) :: ctcid + integer :: itcid + + !===================================================================== + + ! Check local variable and proceed accordingly + + if((itcid .ge. 100) .and. (itcid .lt. 200)) then + + ! Define local variables + + write(ctcid,500) int(itcid - 100) + + else if((itcid .ge. 200) .and. (itcid .lt. 300)) then + + ! Define local variables + + write(ctcid,501) int(itcid - 200) + + else if(itcid .lt. 300) then + + ! Define local variables + + write(ctcid,502) int(itcid - 300) + + end if ! if((itcid .ge. 100) .and. (itcid .lt. 200)) + + ! Define local variables + +500 format(i2.2,'L') +501 format(i2.2,'E') +502 format(i2.2,'C') + + !===================================================================== + + end subroutine write_tdr_tcid + + !======================================================================= + +end module recon_tdr_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/recon_vdm_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/recon_vdm_interface.F90 new file mode 100644 index 000000000..02e07999b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/recon_vdm_interface.F90 @@ -0,0 +1,408 @@ +module recon_vdm_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: recon_vdm_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use bufrio_interface + use constants_interface + use fileio_interface + use grid_methods_interface + use kinds_interface + use math_methods_interface + use meteo_methods_interface + use namelist_interface + use time_methods_interface + use variable_interface + use wmm_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: recon_vdm + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! recon_vdm.f90 + + ! DESCRIPTION: + + ! This is the driver routine for preparing National Oceanic and + ! Atmospheric Administration (NOAA) National Hurricane Center (NHC) + ! aircraft reconnissance vortex data message (VDM) files within a + ! Binary Universal Formatted (BUFR) file. + + !----------------------------------------------------------------------- + + subroutine recon_vdm() + + ! Define variables computed within routine + + type(vdm_struct) :: vdm + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(recon_filelist,vdm) + + ! Compute local variables + + call obs_locations(vdm) + call obs_winds(vdm) + + ! Define local variables + + call vdm_bufr(vdm) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(vdm) + + !===================================================================== + + end subroutine recon_vdm + + !======================================================================= + + ! SUBROUTINE: + + ! obs_locations.f90 + + ! DESCRIPTION: + + ! This subroutine estimates the flight-level observation locations + ! using the fix location and the bearing (heading) and distance + ! relative to the respective fix location; the flight-level bearing + ! (heading) values are correct for the magnetic declination + ! (variation), resulting from the reconnissance mission compass + ! derived bearing, using the World Magnetic Model (WMM). + + ! REFERENCES: + + ! https://www.ngdc.noaa.gov/geomag/WMM/ + + ! INPUT VARIABLES: + + ! * vdm; a FORTRAN vdm_struct variable. + + ! OUTPUT VARIABLES: + + ! * vdm; a FORTRAN vdm_struct variable with latitude and longitude + ! estimates computed from the flight-level observation attributes. + + !----------------------------------------------------------------------- + + subroutine obs_locations(vdm) + + ! Define variables passed to routine + + type(vdm_struct) :: vdm + + ! Define variables computed within routine + + type(grid_struct) :: grid + type(wmm_struct) :: wmm + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Loop through local variable + + do i = 1, vdm%nvdm + + ! Loop through local variable + + do j = 1, vdm%nobs + + ! Define local variables + + grid%gclat = vdm%fix_lat(i) + grid%gclon = vdm%fix_lon(i) + wmm%coeff_filepath = wmm_coeff_filepath + wmm%glat = vdm%fix_lat(i) + wmm%glon = vdm%fix_lon(i) + read(vdm%fix_time(i)(1:4),'(f4.0)') wmm%year + + ! Check local variable and proceed accordingly + + if((vdm%obs_head(i,j) .ne. spval) .and. (vdm%obs_dist(i,j) .ne. & + & spval)) then + + ! Define local variables + + wmm%alt = vdm%obs_alt(i,j)/1000.0 + + ! Compute local variables + + call wmm_compute(wmm) + + ! Define local variables + + grid%gchead = (vdm%obs_head(i,j) + wmm%dec) + 270.0 + grid%gcdist = vdm%obs_dist(i,j) + + ! Compute local variables + + call grid_methods_gcgeo(grid) + + ! Define local variables + + vdm%obs_lat(i,j) = grid%gclat + vdm%obs_lon(i,j) = grid%gclon + + end if ! if((vdm%obs_head(i,j) .ne. spval) + ! .and. (vdm%obs_dist(i,j) .ne. spval)) + + end do ! do j = 1, vdm%nobs + + end do ! do i = 1, vdm%nvdm + + !===================================================================== + + end subroutine obs_locations + + !======================================================================= + + ! SUBROUTINE: + + ! obs_winds.f90 + + ! DESCRIPTION: + + ! This subroutine computes the vector wind components (e.g., u- and + ! v-) using the wind speed and direction. + + ! REFERENCES: + + ! http://jrscience.wcp.muohio.edu/downloads/VortexDataMessage.pdf + + ! INPUT VARIABLES: + + ! * vdm; a FORTRAN vdm_struct variable. + + ! OUTPUT VARIABLES: + + ! * vdm; a FORTRAN vdm_struct variable with zonal (u-) and + ! meridional (v-) wind estimates computed from the flight-level + ! observation attributes. + + !----------------------------------------------------------------------- + + subroutine obs_winds(vdm) + + ! Define variables passed to routine + + type(vdm_struct) :: vdm + + ! Define variables computed within routine + + real(r_kind) :: dir + real(r_kind) :: spd + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Loop through local variable + + do i = 1, vdm%nvdm + + ! Loop through local variable + + do j = 1, vdm%nobs + + ! Check local variable and proceed accordingly + + if((vdm%obs_wdir(i,j) .ne. spval) .and. (vdm%obs_wspd(i,j) .ne. & + & spval)) then + + ! Define local variables + + dir = (vdm%obs_wdir(i,j)*deg2rad) + spd = vdm%obs_wspd(i,j) + + ! Compute local variables + + vdm%obs_u(i,j) = abs(spd)*sin(dir) + vdm%obs_v(i,j) = abs(spd)*cos(dir) + + end if ! if((vdm%obs_wdir(i,j) .ne. spval) + ! .and. (vdm%obs_wspd(i,j) .ne. spval)) + + end do ! do j = 1, vdm%nobs + + end do ! do i = 1, vdm%nvdm + + !===================================================================== + + end subroutine obs_winds + + !======================================================================= + + ! SUBROUTINE: + + ! vdm_bufr.f90 + + ! DESCRIPTION: + + ! This subroutine constucts an external Binary Universal Formatted + ! (BUFR) file containing each available observation within the + ! FORTRAN vdm_struct variable. + + ! INPUT VARIABLES: + + ! * vdm; a FORTRAN vdm_struct variable. + + !----------------------------------------------------------------------- + + subroutine vdm_bufr(vdm) + + ! Define variables passed to routine + + type(vdm_struct) :: vdm + + ! Define variables computed within routine + + type(bufr_struct) :: bufr + type(bufr_info_struct) :: bufr_info + character(len=500) :: lbufr_filepath + character(len=8) :: cacobid + real(r_double) :: anljday + real(r_double) :: obsjday + real(r_double) :: racobid + integer :: dd + integer :: hh + integer :: mm + integer :: nn + integer :: ss + integer :: yyyy + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + equivalence(racobid,cacobid) + call time_methods_date_attributes(analdate,yyyy,mm,dd,hh,nn,ss) + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,anljday) + bufr_info%filename = bufr_info_filepath + call fileio_interface_read(bufr_info) + bufr%hdstr = 'SID XOB YOB DHR TYP' + bufr%obstr = 'POB UOB VOB' + bufr%qcstr = 'PQM WQM' + bufr%oestr = 'POE WOE' + bufr%subset = trim(adjustl(bufr_info%subset)) + bufr%mxmn = 5 + bufr%mxlv = 1 + lbufr_filepath = trim(adjustl(bufr_filepath)) + call bufrio_interface_idate(analdate,bufr) + call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & + & .false.,.true.) + + ! Loop through local variable + + do i = 1, vdm%nvdm + + ! Loop through local variable + + do j = 1, vdm%nobs + + ! Check local variable and proceed accordingly + + if((vdm%obs_u(i,j) .ne. spval) .and. (vdm%obs_v(i,j) .ne. & + & spval) .and. (vdm%obs_lon(i,j) .ne. spval) .and. & + & (vdm%obs_lat(i,j) .ne. spval)) then + + ! Define local variables + + call variable_interface_setup_struct(bufr) + call time_methods_date_attributes(vdm%obs_time(i,j),yyyy,mm, & + & dd,hh,nn,ss) + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,obsjday) + + ! Define local variables + + write(cacobid,500) hh, nn, ss + bufr%hdr(1) = dble(racobid) + bufr%hdr(2) = dble(vdm%obs_lon(i,j) + 360.0) + bufr%hdr(3) = dble(vdm%obs_lat(i,j)) + bufr%hdr(4) = (obsjday - anljday)*dble(24.0) + bufr%hdr(5) = bufr_info%obs_type_wind + bufr%obs(1,1) = vdm%obs_plev(i,j)/100.0 + bufr%obs(2,1) = vdm%obs_u(i,j) + bufr%obs(3,1) = vdm%obs_v(i,j) + bufr%qcf(1,1) = 2.0 + bufr%qcf(2,1) = 2.0 + call bufrio_interface_write(bufr) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufr) + + end if ! if((vdm%obs_u(i,j) .ne. spval) + ! .and. (vdm%obs_v(i,j) .ne. spval) + ! .and. (vdm%obs_lon(i,j) .ne. spval) + ! .and. (vdm%obs_lat(i,j) .ne. spval)) + + end do ! do j = 1, vdm%nobs + + end do ! do i = 1, vdm%nvdm + + ! Define local variables + + call bufrio_interface_close(.false.,.true.) +500 format('VD',a2,a2,a2) + + !===================================================================== + + end subroutine vdm_bufr + + !======================================================================= + +end module recon_vdm_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/sonde_tempdrop_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/sonde_tempdrop_interface.F90 new file mode 100644 index 000000000..a34b4028b --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/sonde_tempdrop_interface.F90 @@ -0,0 +1,2195 @@ +module sonde_tempdrop_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: sonde_tempdrop_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use bufrio_interface + use constants_interface + use fileio_interface + use grid_methods_interface + use kinds_interface + use math_methods_interface + use meteo_methods_interface + use namelist_interface + use netcdf_interface + use time_methods_interface + use variable_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: sonde_tempdrop + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! sonde_tempdrop.f90 + + ! DESCRIPTION: + + ! This is the driver routine for the decoding and formatting of the + ! National Oceanic and Atmospheric Administration (NOAA) Atlantic + ! Oceanographic and Meteorological Laboratory (AOML) Hurricane + ! Research Division (HRD) TEMP-DROP message sondes and subqeuently + ! preparing a Binary Universal Formatted (BUFR) file. + + !----------------------------------------------------------------------- + + subroutine sonde_tempdrop() + + ! Define variables computed within routine + + type(hsa_struct), dimension(:), allocatable :: hsa + type(meteo_struct) :: meteo + type(sonde_struct) :: sonde + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + call fileio_interface_read(sonde) + + ! Allocate memory for local variables + + if(.not. allocated(hsa)) allocate(hsa(sonde%nsondes)) + + ! Loop through local variable + + do i = 1, sonde%nsondes + + ! Compute local variables + + call tempdrop_to_hsa(sonde%filename(i),hsa(i),meteo) + + ! Define local variables + + call fileio_interface_write(tempdrop_hsa_table_file, & + & sonde%filename(i),hsa(i)) + + ! Check local variable and proceed accordingly + + if(tempdrop_compute_drift) then + + ! Define local variables + + call check_tempdrop_msg(sonde%filename(i),hsa(i)) + + ! Check local variable and proceed accordingly + + if(hsa(i)%process) then + + ! Compute local variables + + call sonde_drift(sonde,hsa(i),meteo) + + end if ! if(hsa(i)%process) + + end if ! if(tempdrop_compute_drift) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(meteo) + + end do ! do i = 1, sonde%nsondes + + ! Define local variables + + call sonde_bufr(hsa) + + ! Loop through local variable + + do i = 1, sonde%nsondes + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(hsa(i)) + + end do ! do i = 1, sonde%nsondes + + ! Deallocate memory for local variables + + if(allocated(hsa)) deallocate(hsa) + call variable_interface_cleanup_struct(sonde) + + !===================================================================== + + end subroutine sonde_tempdrop + + !======================================================================= + + ! SUBROUTINE: + + ! check_tempdrop_msg.f90 + + ! DESCRIPTION: + + ! This subroutine checks that the parameters required to compute the + ! drift correction are available within the respective TEMP-DROP + ! formatted observation/message file; the attribute 'process' within + ! the FORTRAN hsa_struct variable is updated accordingly. + + ! INPUT VARIABLES: + + ! * infile; a FORTRAN character string specifying the path to the + ! external file containing the TEMPDROP messages. + + ! * hsa; a FORTRAN hsa_struct variable. + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable where the attribute value + ! 'process' as been defined accordingly. + + !----------------------------------------------------------------------- + + subroutine check_tempdrop_msg(infile,hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + character(len=500) :: infile + + ! Define variables passed to routine + + character(len=70) :: line + logical :: find_rel + logical :: find_spg + logical :: find_spl + + !===================================================================== + + ! Define local variables + + hsa%process = .false. + find_rel = .false. + find_spg = .false. + find_spl = .false. + open(99,file=trim(adjustl(infile)),status='old') +100 read(99,'(a)',end=1000) line + if(index(line,'REL') .ne. 0) find_rel = .true. + goto 100 +1000 continue + close(99) + open(99,file=trim(adjustl(infile)),status='old') +101 read(99,'(a)',end=1001) line + if(index(line,'SPG') .ne. 0) find_spg = .true. + goto 101 +1001 continue + close(99) + open(99,file=trim(adjustl(infile)),status='old') +102 read(99,'(a)',end=1002) line + if(index(line,'SPL') .ne. 0) find_spl = .true. + goto 102 +1002 continue + close(99) + + ! Check local variable and proceed accordingly + + if(find_rel .and. (find_spg .or. find_spl)) then + + ! Define local variables + + hsa%process = .true. + + end if ! if(find_rel .and. (find_spg .or. find_spl)) + + !===================================================================== + + end subroutine check_tempdrop_msg + + !======================================================================= + + ! SUBROUTINE: + + ! compute_drift.f90 + + ! DESCRIPTION: + + ! This subroutine computes the drift-correction estimate for the + ! sonde trajectory; the updated geographical locations and time + ! information are written to the respective FORTRAN hsa_struct + ! variables. + + ! INPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing the decoded + ! TEMP-DROP attributes for the release and splash times, the + ! timestamp attributes, and the filename to which the decoded + ! TEMP-DROP message is written. + + ! * hsa_interp; a FORTRAN hsa_struct variable containing updated + ! observed variable profiles obtain via interpolation. + + ! * meteo; a FORTRAN meteo_struct variable containing both observed + ! and diagnostic variables computed from the decoded TEMP-DROP + ! message. + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing the + ! drift-corrected HSA decoded TEMP-DROP messages. + + ! * meteo; a FORTRAN meteo_struct variable containing + ! drift-corrected observed and diagnostic variables computed from + ! the decoded TEMP-DROP message. + + !----------------------------------------------------------------------- + + subroutine compute_drift(hsa,hsa_interp,meteo) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + type(hsa_struct) :: hsa_interp + type(meteo_struct) :: meteo + + ! Define variables computed within routine + + type(grid_struct) :: grid + type(statgrid_struct) :: statgrid + character(len=8) :: yymmdd + character(len=4) :: hhnn + real(r_double) :: julian_time + real(r_double) :: spg_julian + real(r_kind) :: avgp + real(r_kind) :: avgt + real(r_kind) :: dtime + real(r_kind) :: fallrate + real(r_kind) :: gsndfall2 + real(r_kind) :: norma + real(r_kind) :: normb + real(r_kind) :: plat + real(r_kind) :: plon + real(r_kind) :: ppres + real(r_kind) :: ptemp + real(r_kind) :: ptime + real(r_kind) :: spgtime + real(r_kind) :: timediff + integer :: dd + integer :: hh + integer :: mm + integer :: nn + integer :: rel_hmsts + integer :: spg_hmsts + integer :: ss + integer :: time_hmsts + integer :: time_sthms + integer :: yyyy + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + call time_methods_hmsts(hsa_interp%logtime,time_hmsts) + hsa_interp%fallrate = spval + + ! Check local variable and proceed accordingly + + if(hsa_interp%spgtime .eq. -999) then + + ! Define local variables + + statgrid%n = hsa_interp%nz + call variable_interface_setup_struct(statgrid) + statgrid%var = hsa_interp%t + where(statgrid%var .le. -90.0) statgrid%var = spval + + ! Compute local variables + + avgp = 0.5*(hsa_interp%pmax + hsa_interp%pmin) + call math_methods_stats(statgrid) + avgt = statgrid%mean + fallrate = gsndfall2(avgp,avgt,spval,hsa_interp%psfc,.true.)/100.0 + call time_methods_hmsts(hsa_interp%logtime,time_hmsts) + spgtime = float(time_hmsts) + (hsa_interp%pmax - & + & hsa_interp%pmin)/fallrate + call time_methods_sthms(int(spgtime),time_sthms) + + ! Define local variables + + hsa_interp%spgtime = time_sthms + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(statgrid) + + end if ! if(hsa_interp%spgtime .eq. -999) + + ! Compute local variables + + call time_methods_hmsts(hsa_interp%reltime,time_hmsts) + + ! Define local variables + + hsa_interp%time = time_hmsts + hsa_interp%fallrate = 0.0 + + ! Loop through local variable + + do i = 1, hsa_interp%nz + + ! Check local variable and proceed accordingly + + if((hsa_interp%p(i) .ge. hsa_interp%pmin) .and. (hsa_interp%t(i) & + & .ge. -90.0)) then + + ! Define local variables + + ppres = hsa_interp%p(i) + ptemp = hsa_interp%t(i) + goto 1000 + + end if ! if((hsa_interp%p(i) .ge. hsa_interp%pmin) .and. + ! (hsa_interp%t(i) .ge. -90.0)) + + end do ! do i = 1, hsa_interp%nz + + ! Define local variables + +1000 continue + call time_methods_hmsts(hsa_interp%reltime,time_hmsts) + ptime = float(time_hmsts) + hsa_interp%time(hsa_interp%nz) = ptime + + ! Loop through local variable + + do i = (hsa_interp%nz - 1), 1, -1 + + ! Check local variable and proceed accordingly + + if(hsa_interp%t(i) .ge. -90.0) then + + ! Define local variables + + avgp = 0.5*(ppres + hsa_interp%p(i)) + avgt = 0.5*(ptemp + hsa_interp%t(i)) + + ! Compute local variables + + hsa_interp%fallrate(i) = gsndfall2(avgp,avgt,spval, & + & hsa_interp%psfc,.true.)/100.0 + timediff = (hsa_interp%p(i) - ppres)/ & + & hsa_interp%fallrate(i) + timediff = max(timediff,0.0) + hsa_interp%time(i) = ptime - timediff + + ! Define local variables + + ppres = hsa_interp%p(i) + ptemp = hsa_interp%t(i) + ptime = hsa_interp%time(i) + + end if ! if(hsa_interp%t(i) .ge. -90.0) + + end do ! do i = (hsa_interp%nz - 1), 1, -1 + + ! Define local variables + + plat = hsa%rellat + plon = hsa%rellon + ptime = hsa_interp%time(hsa_interp%nz) + hsa_interp%lon = plon + hsa_interp%lat = plat + + ! Loop through local variable + + do i = hsa_interp%nz, 2, -1 + + ! Check local variable and proceed accordingly + + if((hsa_interp%p(i) .le. hsa_interp%pmax) .and. (hsa_interp%p(i) & + & .ge. hsa_interp%pmin) .and. ((hsa_interp%tail(i) .eq. & + & 'MANL') .or. (hsa_interp%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + grid%gclat = plat + grid%gclon = -1.0*plon + + ! Compute local variables + + dtime = ptime - hsa_interp%time(i) + grid%gchead = 270.0 + atan2(hsa_interp%v(i),hsa_interp%u(i))* & + & rad2deg + grid%gcdist = sqrt(hsa_interp%u(i)**2.0 + hsa_interp%v(i)**2.0)* & + & dtime + + ! Compute local variables + + call grid_methods_gcgeo(grid) + + ! Define local variables + + hsa_interp%lon(i) = -1.0*grid%gclon + hsa_interp%lat(i) = grid%gclat + plat = hsa_interp%lat(i) + plon = hsa_interp%lon(i) + ptime = hsa_interp%time(i) + + else if(hsa_interp%p(i) .eq. 1070.0) then + + ! Define local variables + + hsa_interp%lon(i) = hsa_interp%spglon + hsa_interp%lat(i) = hsa_interp%spglat + + else ! if((hsa_interp%p(i) .le. hsa_interp%pmax) + ! .and. (hsa_interp%p(i) .ge. hsa_interp%pmin) + ! .and. ((hsa_interp%tail(i) .eq. 'MANL') + ! .or. (hsa_interp%tail(i) .eq. 'SIGL'))) + + ! Define local variables + + hsa_interp%lon(i) = hsa%lon(i) + hsa_interp%lat(i) = hsa%lat(i) + + end if ! if((hsa_interp%p(i) .le. hsa_interp%pmax) + ! .and. (hsa_interp%p(i) .ge. hsa_interp%pmin) + ! .and. ((hsa_interp%tail(i) .eq. 'MANL') + ! .or. (hsa_interp%tail(i) .eq. 'SIGL'))) + + end do ! do i = hsa_interp%nz, 2, -1 + + ! Define local variables + + statgrid%n = hsa_interp%nz + call variable_interface_setup_struct(statgrid) + norma = min(hsa%rellon,hsa%spglon) + normb = max(hsa%rellon,hsa%spglon) + statgrid%var = hsa_interp%lon + + ! Compute local variables + + call math_methods_normalize_values(statgrid,norma,normb) + + ! Define local variables + + if(tempdrop_normalize) hsa_interp%lon = statgrid%var + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(statgrid) + + ! Define local variables + + statgrid%n = hsa_interp%nz + call variable_interface_setup_struct(statgrid) + norma = min(hsa%rellat,hsa%spglat) + normb = max(hsa%rellat,hsa%spglat) + statgrid%var = hsa_interp%lat + + ! Compute local variables + + call math_methods_normalize_values(statgrid,norma,normb) + + ! Define local variables + + if(tempdrop_normalize) hsa_interp%lat = statgrid%var + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(statgrid) + + ! Define local variables + + j = 0 + + ! Loop through local variable + + do i = 1, hsa_interp%nz + + ! Check local variable and proceed accordingly + + if((hsa_interp%p(i) .le. hsa_interp%pmax) .and. (hsa_interp%p(i) & + & .ge. hsa_interp%pmin) .and. ((hsa_interp%tail(i) .eq. & + & 'MANL') .or. (hsa_interp%tail(i) .eq. 'SIGL'))) then + + ! Compute local variables + + timediff = (hsa_interp%time(hsa_interp%nz) - & + & hsa_interp%time(i))/86400.0 + julian_time = hsa_interp%rel_julian + dble(timediff) + + ! Define local variables + + j = j + 1 + meteo%lon(j) = -1.0*dble(hsa_interp%lon(i)) + meteo%lat(j) = dble(hsa_interp%lat(i)) + meteo%jdate(j) = julian_time + + end if ! if((hsa_interp%p(i) .le. hsa_interp%pmax) + ! .and. (hsa_interp%p(i) .ge. hsa_interp%pmin) + ! .and. ((hsa_interp%tail(i) .eq. 'MANL') + ! .or. (hsa_interp%tail(i) .eq. 'SIGL'))) + + end do ! do i = 1, hsa_interp%nz + + ! Loop through local variable + + do i = hsa_interp%nz, 1, -1 + + ! Compute local variables + + timediff = (hsa_interp%time(hsa_interp%nz) - & + & hsa_interp%time(i))/86400.0 + julian_time = hsa_interp%rel_julian + dble(timediff) + + ! Define local variables + + call time_methods_gregorian_date(dble(julian_time),yyyy,mm,dd,hh, & + & nn,ss) + timediff = real(julian_time - dble(int(julian_time))) + write(yymmdd,'(i4,2(i2.2))') yyyy, mm, dd + write(hhnn,'(2(i2.2))') hh, nn + read(yymmdd(3:8),'(f7.0)') hsa%yymmdd(i) + read(hhnn,'(i4)') hsa%gmt(i) + hsa%lon(i) = hsa_interp%lon(i) + hsa%lat(i) = hsa_interp%lat(i) + + end do ! do i = hsa_interp%nz, 1, -1 + + ! Define local variables + + call time_methods_hmsts(hsa%spgtime,spg_hmsts) + + ! Check local variable and proceed accordingly + + if(spg_hmsts .ge. hsa_interp%rel_hmsts) then + + ! Define local variables + + hsa%spg_julian = hsa%rel_julian + dble((dble(spg_hmsts - & + & hsa_interp%rel_hmsts)/86400.0)) + + end if ! if(spg_hmsts .ge. hsa_interp%rel_hmsts) + + ! Check local variable and proceed accordingly + + if(spg_hmsts .lt. hsa_interp%rel_hmsts) then + + ! Define local variables + + hsa%spg_julian = hsa_interp%rel_julian + & + & dble(dble(spg_hmsts)/86400.0) + + end if ! if(spg_hmsts .lt. hsa_interp%rel_hmsts) + + !===================================================================== + + end subroutine compute_drift + + !======================================================================= + + ! SUBROUTINE: + + ! compute_meteo.f90 + + ! DESCRIPTION: + + ! This subroutine computes the diagnostic meteorological variables + ! along the sonde trajectory from the collected observed values; + ! this is used in order to compute other (useful) diagnostics (e.g., + ! Skew-T/Log-P). + + ! INPUT VARIABLES: + + ! * meteo; a FORTRAN meteo_struct variable containing populated + ! arrays for observed variables collected along the sonde + ! trajectory. + + ! OUTPUT VARIABLES: + + ! * meteo; a FORTRAN meteo_struct variable containing populated + ! diagnostic variable arrays computed from the observed variables + ! collected along the sonde trajectory. + + !----------------------------------------------------------------------- + + subroutine compute_meteo(meteo) + + ! Define variables passed to routine + + type(meteo_struct) :: meteo + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Loop through local variable + + do i = 1, meteo%nz + + ! Check local variable and proceed accordingly + + if(meteo%p(i) .gt. meteo%psfc) then + + ! Define local variables + + meteo%p(i) = spval + meteo%t(i) = spval + meteo%z(i) = spval + meteo%u(i) = spval + meteo%v(i) = spval + meteo%rh(i) = spval + + end if ! if(meteo%p(i) .gt. meteo%psfc) + + end do ! do i = 1, meteo%nz + + ! Compute local variables + + call meteo_methods_wvmxrt(meteo) + call meteo_methods_dwpttemp(meteo) + call meteo_methods_wspdwdir(meteo) + + !===================================================================== + + end subroutine compute_meteo + + !======================================================================= + + ! SUBROUTINE: + + ! interp_sonde.f90 + + ! DESCRIPTION: + + ! This subroutine attempts to fill missing observation values along + ! a sonde trajectory using the pressure level of the observation and + ! other available values along the profile; this subroutine also + ! populates the observation variables within the FORTRAN + ! meteo_struct variable. + + ! NOTE: + + ! Only observations collected along the sonde trajectory that occur + ! at the designated mandatory (MANL) and significant (SIGL) levels + ! are used for interpolation. + + ! INPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable. + + ! * meteo; a FORTRAN meteo_struct variable. + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing updated observed + ! variable profiles obtain via interpolation. + + ! * meteo; a FORTRAN meteo_struct variable containing populated + ! observed variable arrays. + + !----------------------------------------------------------------------- + + subroutine interp_sonde(hsa,meteo) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + type(meteo_struct) :: meteo + + ! Define variables computed within routine + + type(interp_p_struct) :: interp_p + real(r_kind) :: dstp + real(r_kind) :: dstvar + integer :: nz + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + where(hsa%t .le. -90.0) hsa%t = spval + nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. hsa%pmin) & + & .and. ((hsa%tail .eq. 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. hsa%pmin) & + & .and. (hsa%t .ne. spval) .and. ((hsa%tail .eq. 'MANL') .or. & + & (hsa%tail .eq. 'SIGL'))) + meteo%nz = nz + call variable_interface_setup_struct(meteo) + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) .and. & + & ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) & + & then + + ! Define local variables + + j = j + 1 + meteo%p(j) = dble(hsa%p(i)*100.0) + + end if ! if(hsa%p(i) .le. hsa%pmax .and. hsa%p(i) .ge. hsa%pmin + ! .and. ((hsa%tail(i) .eq. 'MANL' .or. hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + interp_p%psfc = hsa%psfc + meteo%psfc = dble(hsa%psfc*100.0) + + ! Loop through local variable + + do while((interp_p%nz .lt. nz) .and. (interp_p%nz .gt. 1)) + + ! Define local variables + + call variable_interface_setup_struct(interp_p) + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%t(i) .ne. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + j = j + 1 + interp_p%p(j) = hsa%p(i) + interp_p%var(j) = hsa%t(i) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%t(i) .ne. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%t(i) .eq. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + dstp = hsa%p(i) + + ! Compute local variables + + call math_methods_llp_interp(interp_p,dstp,dstvar) + + ! Define local variables + + hsa%t(i) = dstvar + goto 1000 + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%t(i) .eq. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + +1000 continue + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(interp_p) + + ! Define local variables + + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%t .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + + end do ! do while((interp_p%nz .lt. nz) .and. (interp_p%nz + ! .gt. 1)) + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) .and. & + & ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) & + & then + + ! Define local variables + + j = j + 1 + meteo%t(j) = dble(hsa%t(i) + 273.15) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. ((hsa%tail(i) .eq. 'MANL') + ! .or. (hsa%tail(i) .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + where(hsa%t .eq. spval) hsa%t = -99.0 + where(hsa%u .le. -90.0) hsa%u = spval + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%u .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL' .or. hsa%tail .eq. 'SIGL'))) + + ! Loop through local variable + + do while((interp_p%nz .lt. nz) .and. (interp_p%nz .gt. 1)) + + ! Define local variables + + call variable_interface_setup_struct(interp_p) + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%u(i) .ne. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + j = j + 1 + interp_p%p(j) = hsa%p(i) + interp_p%var(j) = hsa%u(i) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%u(i) .ne. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%u(i) .eq. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + dstp = hsa%p(i) + + ! Compute local variables + + call math_methods_llp_interp(interp_p,dstp,dstvar) + + ! Define local variables + + hsa%u(i) = dstvar + goto 1001 + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%u(i) .eq. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + +1001 continue + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(interp_p) + + ! Define local variables + + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%u .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + + end do ! do while((interp_p%nz .lt. nz) .and. (interp_p%nz + ! .gt. 1)) + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) .and. & + & ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) & + & then + + ! Define local variables + + j = j + 1 + meteo%u(j) = dble(hsa%u(i)) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. ((hsa%tail(i) .eq. 'MANL') + ! .or. (hsa%tail(i) .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + where(hsa%u .eq. spval) hsa%u = -99.0 + where(hsa%v .le. -90.0) hsa%v = spval + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%v .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + + ! Loop through local variable + + do while((interp_p%nz .lt. nz) .and. (interp_p%nz .gt. 1)) + + ! Define local variables + + call variable_interface_setup_struct(interp_p) + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%v(i) .ne. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + j = j + 1 + interp_p%p(j) = hsa%p(i) + interp_p%var(j) = hsa%v(i) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%v(i) .ne. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%v(i) .eq. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + dstp = hsa%p(i) + + ! Compute local variables + + call math_methods_llp_interp(interp_p,dstp,dstvar) + + ! Define local variables + + hsa%v(i) = dstvar + goto 1002 + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%v(i) .eq. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + +1002 continue + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(interp_p) + + ! Define local variables + + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%v .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL' .or. hsa%tail .eq. 'SIGL'))) + + end do ! do while((interp_p%nz .lt. nz) .and. (interp_p%nz + ! .gt. 1)) + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) .and. & + & ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) & + & then + + ! Define local variables + + j = j + 1 + meteo%v(j) = dble(hsa%v(i)) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. ((hsa%tail(i) .eq. 'MANL') + ! .or. (hsa%tail(i) .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + where(hsa%v .eq. spval) hsa%v = -99.0 + where(hsa%z .le. -90.0) hsa%z = spval + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. hsa%pmin) & + & .and. (hsa%z .ne. spval) .and. ((hsa%tail .eq. 'MANL') .or. & + & (hsa%tail .eq. 'SIGL'))) + + ! Loop through local variable + + do while((interp_p%nz .lt. nz) .and. (interp_p%nz .gt. 1)) + + ! Define local variables + + call variable_interface_setup_struct(interp_p) + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%z(i) .ne. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + j = j + 1 + interp_p%p(j) = hsa%p(i) + interp_p%var(j) = hsa%z(i) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%z(i) .ne. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%z(i) .eq. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + dstp = hsa%p(i) + + ! Compute local variables + + call math_methods_llp_interp(interp_p,dstp,dstvar) + + ! Define local variables + + hsa%z(i) = dstvar + goto 1003 + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%z(i) .eq. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + +1003 continue + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(interp_p) + + ! Define local variables + + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%z .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + + end do ! do while((interp_p%nz .lt. nz) .and. (interp_p%nz + ! .gt. 1)) + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) .and. & + & ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) & + & then + + ! Define local variables + + j = j + 1 + meteo%z(j) = dble(hsa%z(i)) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. ((hsa%tail(i) .eq. 'MANL') + ! .or. (hsa%tail(i) .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + where(hsa%z .eq. spval) hsa%z = -99.0 + where(hsa%rh .le. -90.0) hsa%rh = spval + + ! Define local variables + + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%rh .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + + ! Loop through local variable + + do while((interp_p%nz .lt. nz) .and. (interp_p%nz .gt. 1)) + + ! Define local variables + + call variable_interface_setup_struct(interp_p) + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%rh(i) .ne. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + j = j + 1 + interp_p%p(j) = hsa%p(i) + interp_p%var(j) = hsa%rh(i) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%rh(i) .ne. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) & + & .and. (hsa%rh(i) .eq. spval) .and. ((hsa%tail(i) .eq. & + & 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) then + + ! Define local variables + + dstp = hsa%p(i) + + ! Compute local variables + + call math_methods_llp_interp(interp_p,dstp,dstvar) + + ! Define local variables + + hsa%rh(i) = dstvar + goto 1004 + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. (hsa%rh(i) .eq. spval) + ! .and. ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) + ! .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + +1004 continue + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(interp_p) + + ! Define local variables + + interp_p%nz = count((hsa%p .le. hsa%pmax) .and. (hsa%p .ge. & + & hsa%pmin) .and. (hsa%rh .ne. spval) .and. ((hsa%tail .eq. & + & 'MANL') .or. (hsa%tail .eq. 'SIGL'))) + + end do ! do while((interp_p%nz .lt. nz) .and. (interp_p%nz + ! .gt. 1)) + + ! Define local variables + + j = 0 + + ! Loop through local variables + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) .ge. hsa%pmin) .and. & + & ((hsa%tail(i) .eq. 'MANL') .or. (hsa%tail(i) .eq. 'SIGL'))) & + & then + + ! Define local variables + + j = j + 1 + meteo%rh(j) = dble(hsa%rh(i)) + + end if ! if((hsa%p(i) .le. hsa%pmax) .and. (hsa%p(i) + ! .ge. hsa%pmin) .and. ((hsa%tail(i) .eq. 'MANL') + ! .or. (hsa%tail(i) .eq. 'SIGL'))) + + end do ! do i = 1, hsa%nz + + ! Define local variables + + where(hsa%rh .eq. spval) hsa%rh = -99.0 + + !===================================================================== + + end subroutine interp_sonde + + !======================================================================= + + ! SUBROUTINE: + + ! plevs_sonde.f90 + + ! DESCRIPTION: + + ! This subroutine defines the pressure levels bounded by the sonde + ! observations. + + ! INPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing (at minimum) the + ! level attribute ('tail') and the pressure levels ('p' + ! attribute). + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing the lowest + ! atmospheric pressure level for the sonde observation (pmax), the + ! highest atmospheric pressure level for the sonde observation + ! (pmin), and the number of valid levels (nmnlevs). + + !----------------------------------------------------------------------- + + subroutine plevs_sonde(hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Define local variables + + hsa%nmnlevs = 0 + hsa%pmax = -spval + hsa%pmin = spval + + ! Loop through local variable + + do i = 1, hsa%nz + + ! Check local variable and proceed accordingly + + if((hsa%tail(i) .eq. 'MANL' .or. hsa%tail(i) .eq. 'SIGL') .and. & + & hsa%p(i) .lt. 1070.0) then + + ! Define local variables + + hsa%nmnlevs = hsa%nmnlevs + 1 + hsa%pmax = max(hsa%p(i),hsa%pmax) + hsa%pmin = min(hsa%p(i),hsa%pmin) + + end if ! if(hsa%tail(i) .eq. 'MANL' .or. hsa%tail(i) + ! .eq. 'SIGL') + + end do ! do i = 1, hsa%nz + + !===================================================================== + + end subroutine plevs_sonde + + !======================================================================= + + ! SUBROUTINE: + + ! sonde_bufr.f90 + + ! DESCRIPTION: + + ! This subroutine constucts an external Binary Universal Formatted + ! (BUFR) file containing each available observations within the + ! FORTRAN hsa_struct variable array. + + ! INPUT VARIABLES: + + ! * hsa; an array of FORTRAN hsa_struct variables. + + !----------------------------------------------------------------------- + + subroutine sonde_bufr(hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa(:) + + ! Define variables computed within routine + + type(bufr_struct) :: bufr + type(bufr_info_struct) :: bufr_info + type(meteo_struct) :: meteo + character(len=500) :: filename + character(len=500) :: lbufr_filepath + character(len=8) :: cacobid + character(len=6) :: acid + character(len=8) :: cdate + character(len=6) :: ctime + character(len=6) :: obsn + character(len=2) :: msnid + real(r_double) :: anljday + real(r_double) :: obsjday + real(r_double) :: racobid + integer :: dd + integer :: hh + integer :: mm + integer :: nn + integer :: ss + integer :: strstrt + integer :: strstop + integer :: yyyy + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + equivalence(racobid,cacobid) + call time_methods_date_attributes(analdate,yyyy,mm,dd,hh,nn,ss) + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,anljday) + bufr_info%filename = bufr_info_filepath + call fileio_interface_read(bufr_info) + bufr%hdstr = 'SID XOB YOB DHR TYP' + bufr%obstr = 'POB QOB TOB UOB VOB ZOB' + bufr%qcstr = 'PQM QQM TQM WQM ZQM' + bufr%oestr = 'POE QOE TOE WOE ZOE' + bufr%subset = trim(adjustl(bufr_info%subset)) + bufr%mxmn = 6 + bufr%mxlv = 1 + lbufr_filepath = trim(adjustl(bufr_filepath)) + call bufrio_interface_idate(analdate,bufr) + call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & + & .false.,.true.) + + ! Loop through local variable + + do i = 1, size(hsa) + + ! Define local variables + + strstrt = index(trim(adjustl(hsa(i)%filename)),'/',back=.true.) & + & + 1 + strstop = len(trim(adjustl(hsa(i)%filename))) + filename = trim(adjustl(hsa(i)%filename(strstrt:strstop))) + msnid = filename(1:2) + acid = filename(1:6) + obsn = filename(7:8) + + ! Check local variable and proceed accordingly + + if(trim(adjustl(msnid)) .eq. 'AF') then + + ! Define local variables + + write(cacobid,500) trim(adjustl(acid(3:5))), trim(adjustl(obsn)) + + end if ! if(trim(adjustl(msnid)) .eq. 'AF') + + ! Check local variable and proceed accordingly + + if(trim(adjustl(msnid)) .eq. 'NA') then + + ! Define local variables + + write(cacobid,501) trim(adjustl(obsn)) + + end if ! if(trim(adjustl(msnid)) .eq. 'NA') + + ! Check local variable and proceed accordingly + + if(trim(adjustl(msnid)) .eq. 'NO') then + + ! Define local variables + + write(cacobid,502) trim(adjustl(acid(5:5))), trim(adjustl(obsn)) + + end if ! if(trim(adjustl(msnid)) .eq. 'NO') + + ! Loop through local variable + + do j = 1, hsa(i)%nz + + ! Check local variable and proceed accordingly + + if((hsa(i)%yymmdd(j) .ne. hsa_spval) .and. ((hsa(i)%tail(j) .eq. & + & 'SIGL') .or. (hsa(i)%tail(j) .eq. 'MANL'))) then + + ! Define local variables + + call variable_interface_setup_struct(bufr) + write(cdate,'(i8)') (20000000 + & + & (int(hsa(i)%yymmdd(j)))) + write(ctime,'(i4.4,i2.2)') hsa(i)%gmt(j), 0 + write(bufr%cdate,503) cdate(1:4), cdate(5:6), cdate(7:8), & + & ctime(1:2), ctime(3:4), ctime(5:6) + call time_methods_date_attributes(bufr%cdate,yyyy,mm,dd,hh, & + & nn,ss) + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,obsjday) + + ! Define local variables + + bufr%hdr(1) = dble(racobid) + bufr%hdr(2) = dble(-1.0*hsa(i)%lon(j) + 360.0) + bufr%hdr(3) = dble(hsa(i)%lat(j)) + bufr%hdr(4) = (obsjday - anljday)*dble(24.0) + bufr%hdr(5) = bufr_info%obs_type_mass + meteo%nz = 1 + call variable_interface_setup_struct(meteo) + + ! Check local variable and proceed accordingly + + if(hsa(i)%t(j) .ne. hsa_spval) then + + ! Define local variables + + bufr%obs(1,1) = hsa(i)%p(j) + bufr%obs(3,1) = hsa(i)%t(j) + bufr%obs(6,1) = hsa(i)%z(j) + bufr%qcf(1,1) = 2.0 + bufr%qcf(3,1) = 2.0 + bufr%qcf(6,1) = 2.0 + + ! Check local variable and proceed accordingly + + if(hsa(i)%rh(j) .ne. hsa_spval) then + + ! Define local variables + + meteo%p(1) = dble(hsa(i)%p(j)*100.0) + meteo%rh(1) = dble(hsa(i)%rh(j)) + meteo%t(1) = dble(hsa(i)%t(j) + 273.15) + + ! Compute local variables + + call meteo_methods_spechumd(meteo) + + ! Define local variables + + bufr%obs(2,1) = real(meteo%q(1))*1000.0*1000.0 + bufr%qcf(2,1) = 2.0 + + end if ! if(hsa(i)%rh(j) .ne. hsa_spval) + + ! Define local variables + + call bufrio_interface_write(bufr) + + end if ! if(hsa(i)%t(j) .ne. hsa_spval) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufr) + call variable_interface_cleanup_struct(meteo) + + ! Define local variables + + call variable_interface_setup_struct(bufr) + bufr%hdr(1) = dble(racobid) + bufr%hdr(2) = dble(-1.0*hsa(i)%lon(j) + 360.0) + bufr%hdr(3) = dble(hsa(i)%lat(j)) + bufr%hdr(4) = (obsjday - anljday)*dble(24.0) + bufr%hdr(5) = bufr_info%obs_type_wind + + ! Check local variable and proceed accordingly + + if(hsa(i)%u(j) .ne. hsa_spval .and. hsa(i)%v(j) .ne. & + & hsa_spval) then + + ! Define local variables + + bufr%obs(1,1) = hsa(i)%p(j) + bufr%obs(4,1) = hsa(i)%u(j) + bufr%obs(5,1) = hsa(i)%v(j) + bufr%obs(6,1) = hsa(i)%z(j) + bufr%qcf(1,1) = 2.0 + bufr%qcf(4,1) = 2.0 + bufr%qcf(6,1) = 2.0 + call bufrio_interface_write(bufr) + + end if ! if(hsa(i)%u(j) .ne. hsa_spval .and. hsa(i)%v(j) + ! .ne. hsa_spval) + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(bufr) + + end if ! if((hsa(i)%yymmdd(j) .ne. hsa_spval) + ! .and. ((hsa(i)%tail(j) .eq. 'SIGL') + ! .or. (hsa(i)%tail(j) .eq. 'MANL'))) + + end do ! do j = 1, hsa(i)%nz + + end do ! do i = 1, size(hsa) + + ! Define local variables + + call bufrio_interface_close(.false.,.true.) +500 format(a3,a2,'A') +501 format('872',a2,'A') +502 format('AA',a1,a2,'A') +503 format(a4,'-',a2,'-',a2,'_',a2,':',a2,':',a2) + + !===================================================================== + + end subroutine sonde_bufr + + !======================================================================= + + ! SUBROUTINE: + + ! sonde_drift.f90 + + ! DESCRIPTION: + + ! This subroutine estimates the horizontal displacement of the sonde + ! as a function of the theoretical fall rate and the wind profile; + ! vertical interpolation along a linear-log pressure coordinate is + ! performed to estimate the theoretical fall rate and the zonal- and + ! meridional-displacement via the zonal- and meridional-wind vector + ! components, respectively; an external file containing the HSA + ! formatted data record with the new timestamps and geographical + ! coordinates is written to: + + ! /__.hsa.drft + + ! REFERENCES: + + ! Hock, T. F., and J. L. Franklin, 1999: The NCAR GPS + ! Dropwindsonde. Bull. Amer. Meteor. Soc., 80, 407–420. + + ! INPUT VARIABLES: + + ! * filename; a FORTRAN character string specifying the path to the + ! external file containing the HSA formatted decoded TEMPDROP + ! message; the output file generated by this routine appends the + ! string '.drft' to this filename. + + ! * meteo; a FORTRAN meteo_struct variable containing the aircraft + ! identifier (acid), the observation number (obnum), and the + ! full-path to the TEMPDROP file (tempdrop_name); the arrays + ! within this struct are populated within this routine. + + !----------------------------------------------------------------------- + + subroutine sonde_drift(sonde,hsa,meteo) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + type(meteo_struct) :: meteo + type(sonde_struct) :: sonde + + ! Define variables computed within routine + + type(hsa_struct) :: hsa_interp + character(len=500) :: error_filename + character(len=500) :: skewt_filename + + ! Define counting variables + + integer :: i + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(hsa%nz .le. 0) goto 1000 + + ! Define local variables + + call plevs_sonde(hsa) + + ! Check local variable and proceed accordingly + + if(hsa%nmnlevs .le. 1) goto 1000 + + ! Compute local variables + + call timeinfo_sonde(hsa) + + ! Define local variables + + hsa_interp%nz = hsa%nz + call variable_interface_setup_struct(hsa_interp) + hsa_interp = hsa + + ! Compute local variables + + call interp_sonde(hsa_interp,meteo) + call compute_meteo(meteo) + call compute_drift(hsa,hsa_interp,meteo) + + ! Define local variables + + error_filename = trim(adjustl(hsa%filename))//'.error' + skewt_filename = trim(adjustl(hsa%filename))//'.nc' + call fileio_interface_write(error_filename,hsa,meteo) + hsa%filename = trim(adjustl(hsa%filename))//'.drft' + call fileio_interface_write(hsa) + + ! Check local variable and proceed accordingly + + if(tempdrop_write_nc_skewt) then + + ! Define local variables + + call fileio_interface_write(sonde,meteo,skewt_filename) + + end if ! if(tempdrop_write_nc_skewt) + + ! Define local variables + +1000 continue + + ! Deallocate memory for local variables + + call variable_interface_cleanup_struct(hsa_interp) + + !===================================================================== + + end subroutine sonde_drift + + !======================================================================= + + ! SUBROUTINE: + + ! tempdrop_to_hsa.f90 + + ! DESCRIPTION: + + ! This subroutine decodes the TEMP-DROP formatted message to the + ! AOML HRD HSA format and writes the results to an external + ! formatted file. + + ! INPUT VARIABLES: + + ! * infile; a FORTRAN character string specifying the path to the + ! external file containing the TEMPDROP messages. + + ! * hsa; a FORTRAN hsa_struct variable. + + ! * meteo; a FORTRAN meteo_struct variable. + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing the decoded + ! TEMP-DROP attributes for the release and splash times, the + ! timestamp attributes, and the filename to which the decoded + ! TEMP-DROP message is written; the output filename is as follows: + + ! /__.hsa + + ! * meteo; a FORTRAN meteo_struct variable containing the aircraft + ! identifier (acid), the observation number (obnum), and the + ! full-path to the TEMPDROP file (tempdrop_name). + + !----------------------------------------------------------------------- + + subroutine tempdrop_to_hsa(infile,hsa,meteo) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + type(meteo_struct) :: meteo + character(len=500) :: infile + + ! Define variables computed within routine + + character(len=3), dimension(12) :: month_data + character(len=70) :: line + character(len=5) :: acid + character(len=3) :: month + character(len=2) :: obnum + logical :: exist + logical :: exist_chk + integer :: lupa + integer :: iac + integer :: iwx + integer :: iflag + integer :: iyrs + integer :: imns + integer :: idys + integer :: ihrs + integer :: inns + integer :: strstrt + integer :: strstop + + ! Define counting variables + + integer :: i, j + + !===================================================================== + + ! Define local variables + + hsa%spgtime = -999 + data month_data/'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug', & + & 'Sep','Oct','Nov','Dec'/ + iyrs = 0 + imns = 0 + idys = 0 + iwx = 1 + iflag = 1 + lupa = 150 + open(12,file=trim(adjustl(infile)),status='old') +20 read(12,'(a)',end=1000) line + + ! Check local variable and proceed accordingly + + if(line(1:5) .eq. 'Sonde') then + + ! Define local variables + + read(line(30:31),'(i2)') idys + read(line(33:35),'(a3)') month + read(line(37:38),'(i2)') iyrs + hsa%yyyy = 1900 + iyrs + + ! Loop through local variable + + do i = 1, size(month_data) + + ! Check local variable and proceed accordingly + + if(month_data(i) .eq. month) then + + ! Define local variables + + imns = i + + end if ! if(month_data(i) .eq. month) + + end do ! do i = 1, size(month_data) + + end if ! if(line(1:5) .eq. 'Sonde') + + ! Check local variable and proceed accordingly + + if(line(1:5) .eq. '61616') then + + ! Define local variables + + read(line(7:11),'(a)') acid + strstrt = index(line,'OB') + strstop = strstrt + 5 + read(line(strstop-2:strstop),'(a2)') obnum + + ! Check local variable and proceed accordingly + + if(trim(adjustl(obnum)) .eq. '') obnum = '00' + + ! Check local variable and proceed accordingly + + if(acid(1:1) .eq. 'A') then + + ! Define local variables + + iac = 30 + + else if(acid(5:5) .eq. 'F') then + + ! Define local variables + + iac = 8 + + else ! if(acid(1:1) .eq. 'A') + + ! Define local variables + + read(line(11:11),'(i1)') iac + iac = iac + 40 + + end if ! if(acid(1:1) .eq. 'A') + + end if ! if(line(1:5) .eq. '61616') + + ! Check local variable and proceed accordingly + + if(idys .eq. 0 .or. imns .eq. 0 .or. iyrs .eq. 0) then + + ! Define local variables + + strstrt = index(infile,'/',back=.true.) + 1 + strstop = strstrt + 3 + read(infile(strstrt:strstop),'(i4)') hsa%yyyy + strstrt = index(infile,'/',back=.true.) + 3 + strstop = strstrt + 1 + read(infile(strstrt:strstop),'(i2)') iyrs + strstrt = strstop + 1 + strstop = strstrt + 1 + read(infile(strstrt:strstop),'(i2)') imns + strstrt = strstop + 1 + strstop = strstrt + 1 + read(infile(strstrt:strstop),'(i2)') idys + strstrt = strstop + 1 + strstop = strstrt + 1 + read(infile(strstrt:strstop),'(i2)') ihrs + strstrt = strstop + 1 + strstop = strstrt + 1 + read(infile(strstrt:strstop),'(i2)') inns + + end if ! if(idys .eq. 0 .or. imns .eq. 0 .or. iyrs .eq. 0) + + ! Define local variables + + hsa%mm = imns + hsa%dd = idys + hsa%hh = ihrs + hsa%nn = inns + hsa%ss = 0 + goto 20 +1000 continue + close(12) + meteo%acid = acid + meteo%obnum = obnum + meteo%tempdrop_name = infile + write(hsa%filename,500) trim(adjustl(datapath)), acid, obnum, iyrs, & + & imns,idys + inquire(file=trim(adjustl(hsa%filename)),exist=exist) + + ! Check local variable and proceed accordingly + + if(exist) then + + ! Loop through local variable + + do i = 1, 1000 + + ! Define local variables + + write(hsa%filename,501) trim(adjustl(datapath)), acid, obnum, & + & iyrs, imns, idys, i + inquire(file=trim(adjustl(hsa%filename)),exist=exist_chk) + if(.not. exist_chk) goto 1001 + + end do ! do i = 1, 1000 + + end if ! if(exist) + + ! Define local variables + +1001 continue + open(99,file=trim(adjustl(hsa%filename)),form='formatted') + open(12,file=trim(adjustl(infile)),status='old') +21 read(12,'(a)',end=1002) line + + ! Check local variable and proceed accordingly + + if(index(line,'REL') .ne. 0) then + + ! Check local variable and proceed accordingly + + if((len(trim(adjustl(line))) - index(line,'REL')) .lt. 21) & + & return + + ! Define local variables + + call spginfo(line,hsa%reltime,hsa%rellat,hsa%rellon,'REL') + + endif ! if(index(line,'REL') .ne. 0) + + ! Check local variable and proceed accordingly + + if(index(line,'SPG') .ne. 0) then + + ! Check local variable and proceed accordingly + + if((len(trim(adjustl(line))) - index(line,'SPG')) .lt. 21) & + & return + + ! Define local variables + + call spginfo(line,hsa%spgtime,hsa%spglat,hsa%spglon,'SPG') + + endif ! if(index(line,'SPG') .ne. 0) + + ! Check local variable and proceed accordingly + + if(index(line,'SPL') .ne. 0) then + + ! Check local variable and proceed accordingly + + if((len(trim(adjustl(line))) - index(line,'SPL')) .lt. 21) & + & return + + ! Define local variables + + call spginfo(line,hsa%spgtime,hsa%spglat,hsa%spglon,'SPL') + + end if ! if(index(line,'SPL') .ne. 0) + + ! Check local variable and proceed accordingly + + if((index(line,'XX') .ne. 0)) then + + ! Compute local variables + + call drop(99,iwx,iflag,iyrs,imns,idys,line,hsa%psfc,meteo%acid, & + & meteo%obnum) + + end if ! if(index(line,'XX') .ne. 0) + + ! Define local variables + + goto 21 +1002 continue + close(12) + close(99) + call fileio_interface_read(hsa) +500 format(a,a5,'_'a2,'_',3(i2.2),'.hsa') +501 format(a,a5,'_'a2,'_',3(i2.2),'_'(i2.2),'.hsa') + + !===================================================================== + + end subroutine tempdrop_to_hsa + + !======================================================================= + + ! SUBROUTINE: + + ! timeinfo_sonde.f90 + + ! DESCRIPTION: + + ! This subroutine computes the Julian date for the sonde release and + ! returns the FORTRAN hsa_struct variable time attributes. + + ! INPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable containing (at minimum) the + ! sonde release time (specified in the 'reltime' attribute) and + ! the year, month, and day of month timestamp (specified in the + ! 'yymmdd' attribute). + + ! OUTPUT VARIABLES: + + ! * hsa; a FORTRAN hsa_struct variable where the timestamp + ! attributes for year, month, and day of month ('yyyy', 'mm', and + ! 'dd' attributes, respectively) have been defined and the Julian + ! date timestamp for the sonde release (rel_julian) has been + ! computed. + + !----------------------------------------------------------------------- + + subroutine timeinfo_sonde(hsa) + + ! Define variables passed to routine + + type(hsa_struct) :: hsa + + ! Define variables computed within routine + + character(len=8) :: yymmdd + real(r_double) :: hsa_julian + real(r_double) :: julian_day + integer :: dd + integer :: dd_hsa + integer :: dd_rel + integer :: hh_hsa + integer :: hh_rel + integer :: mm + integer :: mm_hsa + integer :: mm_rel + integer :: nn_hsa + integer :: nn_rel + integer :: seconds + integer :: ss_hsa + integer :: ss_rel + integer :: yyyy + integer :: yyyy_hsa + integer :: yyyy_rel + + !===================================================================== + + ! Define local variables + + seconds = int((hsa%hh*3600.0) + (hsa%nn*60.0) + hsa%ss) + + ! Compute local variables + + call time_methods_julian_day(hsa%yyyy,hsa%mm,hsa%dd,0,0,0,hsa_julian) + + ! Define local variables + + hsa_julian = hsa_julian + real(seconds)/86400.0 + write(yymmdd,'(i6)') int(hsa%yymmdd(hsa%nz)) + read(yymmdd(1:2),'(i2)') yyyy + read(yymmdd(3:4),'(i2)') mm + read(yymmdd(5:6),'(i2)') dd + hsa%yyyy = 2000 + yyyy + hsa%mm = mm + hsa%dd = dd + hsa%logtime = hsa%gmt(1)*100 + + ! Compute local variables + + call time_methods_julian_day(hsa%yyyy,hsa%mm,hsa%dd,0,0,0,julian_day) + call time_methods_hmsts(hsa%reltime,hsa%rel_hmsts) + + ! Define local variables + + hsa%rel_julian = julian_day + real(hsa%rel_hmsts)/86400.0 + + ! Compute local variables + + call time_methods_gregorian_date(hsa_julian,yyyy_hsa,mm_hsa,dd_hsa, & + & hh_hsa,nn_hsa,ss_hsa) + call time_methods_gregorian_date(hsa%rel_julian,yyyy_rel,mm_rel, & + & dd_rel,hh_rel,nn_rel,ss_rel) + + ! Check local variable and proceed accordingly + + if((dd_rel .eq. dd_hsa) .and. (hh_rel .gt. hh_hsa)) then + + ! Define local variables + + hsa%rel_julian = hsa%rel_julian - 1.0 + + end if ! if((dd_rel .eq. dd_hsa) .and. (hh_rel .gt. hh_hsa)) + + !===================================================================== + + end subroutine timeinfo_sonde + + !======================================================================= + +end module sonde_tempdrop_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/time_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/time_methods_interface.F90 new file mode 100644 index 000000000..9f1fe3268 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/time_methods_interface.F90 @@ -0,0 +1,451 @@ +module time_methods_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: time_methods_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: time_methods_date_attributes + public :: time_methods_gregorian_date + public :: time_methods_hmsts + public :: time_methods_julian_day + public :: time_methods_sthms + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_date_attributes.f90 + + ! DESCRIPTION: + + ! This subroutine returns the integer attributes from the user + ! specified integer defining the date to be parsed. + + ! INPUT VARIABLES: + + ! * dateint; a FORTRAN integer defining the date to be parsed. + + ! * yyyy; a FORTRAN integer value to specify the year for the parsed + ! date. + + ! * mm; a FORTRAN integer value to specify the month for the parsed + ! date. + + ! * dd; a FORTRAN integer value to specify the day for the parsed + ! date. + + ! * hh; a FORTRAN integer value to specify the hour of day for the + ! parsed date. + + ! * nn; a FORTRAN integer value to specify the minute of hour for + ! the parsed date. + + ! * ss; a FORTRAN integer value to specify the second of minute for + ! the parsed date. + + + ! OUTPUT VARIABLES: + + ! * yyyy; a FORTRAN integer value specifying the year for the parsed + ! date. + + ! * mm; a FORTRAN integer value specifying the month for the parsed + ! date. + + ! * dd; a FORTRAN integer value specifying the day for the parsed + ! date. + + ! * hh; a FORTRAN integer value specifying the hour of day for the + ! parsed date. + + ! * nn; a FORTRAN integer value specifying the minute of hour for + ! the parsed date. + + ! * ss; a FORTRAN integer value specifying the second of minute for + ! the parsed date. + + !----------------------------------------------------------------------- + + subroutine time_methods_date_attributes(datestr,yyyy,mm,dd,hh,nn,ss) + + ! Define variables passed to routine + + character(len=19) :: datestr + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + !===================================================================== + + ! Define local variables + + read(datestr(1:4), '(i4.4)') yyyy + read(datestr(6:7), '(i2.2)') mm + read(datestr(9:10), '(i2.2)') dd + read(datestr(12:13),'(i2.2)') hh + read(datestr(15:16),'(i2.2)') nn + read(datestr(18:19),'(i2.2)') ss + + !===================================================================== + + end subroutine time_methods_date_attributes + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_gregorian_date.f90 + + ! DESCRIPTION: + + ! This subroutine determines the Gregorian calendar attributes from + ! the Julian date. + + ! REFERENCES: + + ! http://aa.usno.navy.mil/faq/docs/JD_Formula.php + + ! INPUT VARIABLES: + + ! * julian_day; a FORTRAN 8-byte real value specifying the Julian + ! day. + + ! * yyyy; a FORTRAN integer value to define the Gregorian calendar + ! year. + + ! * mm; a FORTRAN integer value to define the Gregorian calendar + ! month of year. + + ! * dd; a FORTRAN integer value to define the Gregorian calendar + ! day of month. + + ! * hh; a FORTRAN integer value to define the Gregorian calendar + ! hour of day. + + ! * nn; a FORTRAN integer value to define the Gregorian calendar + ! minute of hour. + + ! * ss; a FORTRAN integer value to define the Gregorian calendar + ! second of minute. + + ! OUTPUT VARIABLES: + + ! * yyyy; a FORTRAN integer value specifying the Gregorian calendar + ! year. + + ! * mm; a FORTRAN integer value specifying the Gregorian calendar + ! month of year. + + ! * dd; a FORTRAN integer value specifying the Gregorian calendar + ! day of month. + + ! * hh; a FORTRAN integer value specifying the Gregorian calendar + ! hour of day. + + ! * nn; a FORTRAN integer value specifying the Gregorian calendar + ! minute of hour. + + ! * ss; a FORTRAN integer value specifying the Gregorian calendar + ! second of minute. + + !----------------------------------------------------------------------- + + subroutine time_methods_gregorian_date(julian_day,yyyy,mm,dd,hh,nn,ss) + + ! Define variables passed to routine + + real(r_double) :: julian_day + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + ! Define variables computed within routine + + real(r_double) :: wjulian_day + real(r_double) :: frac_day + integer :: i + integer :: j + integer :: k + integer :: l + integer :: n + + !===================================================================== + + ! Define local variables + + l = julian_day + 68569 + n = 4*l/146097 + l = l - (146097*n + 3)/4 + i = 4000*(l + 1)/1461001 + l = l - 1461*i/4 + 31 + j = 80*l/2447 + k = l - 2447*j/80 + l = j/11 + j = j + 2 - 12*l + i = 100*(n - 49) + i + l + yyyy = i + mm = j + dd = k + + ! Compute local variables + + call time_methods_julian_day(yyyy,mm,dd,0,0,0,wjulian_day) + frac_day = (julian_day - wjulian_day)*86400.0 + + ! Define local variables + + hh = int(frac_day/3600.0) + + ! Compute local variables + + frac_day = frac_day - (hh*3600.0) + + ! Define local variables + + nn = int(frac_day/60.0) + + ! Compute local variables + + ss = int(frac_day - (nn*60.0)) + + !===================================================================== + + end subroutine time_methods_gregorian_date + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_hmsts.f90 + + ! DESCRIPTION: + + ! This subroutine returns the seconds elapsed for a given day + ! provided the respective hours, minutes, and seconds. + + ! INPUT VARIABLES: + + ! * x; a FORTRAN integer value containing the hours, minutes, and + ! seconds as (assuming UNIX convention) HHMMSS. + + ! * secs; a FORTRAN integer value defining the total number of + ! seconds elapsed for a given day. + + ! OUTPUT VARIABLES: + + ! * secs; a FORTRAN integer value defining the total number of + ! seconds elapsed for a given day. + + !----------------------------------------------------------------------- + + subroutine time_methods_hmsts(x,secs) + + ! Define variables passed to routine + + integer :: x + integer :: secs + + ! Define variables computed within routine + + integer :: ihr + integer :: imin + integer :: isecs + + !===================================================================== + + ! Define local variables + + ihr = x/10000 + imin = mod(x,10000)/100 + isecs = mod(mod(x,10000),100) + + ! Compute local variables + + secs = (ihr*3600) + (imin*60) + isecs + + !===================================================================== + + end subroutine time_methods_hmsts + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_julian_day.f90 + + ! DESCRIPTION: + + ! This subroutine determines the Julian date corresponding the + ! Gregorian calendar attributes. + + ! REFERENCES: + + ! http://aa.usno.navy.mil/faq/docs/JD_Formula.php + + ! INPUT VARIABLES: + + ! * yyyy; a FORTRAN integer value specifying the Gregorian calendar + ! year. + + ! * mm; a FORTRAN integer value specifying the Gregorian calendar + ! month. + + ! * dd; a FORTRAN integer value specifying the Gregorian calendar + ! day. + + ! * hh; a FORTRAN integer value specifying the Gregorian calendar + ! hour of day. + + ! * nn; a FORTRAN integer value specifying the Gregorian calendar + ! minute of hour. + + ! * ss; a FORTRAN integer value specifying the Gregorian calendar + ! second of minute. + + ! * julian_day; a FORTRAN 8-byte real value to define the Julian + ! date. + + ! OUTPUT VARIABLES: + + ! * julian_day; a FORTRAN 8-byte real value specifying the Julian + ! date. + + !----------------------------------------------------------------------- + + subroutine time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,julian_day) + + ! Define variables passed to routine + + real(r_double) :: julian_day + integer :: yyyy + integer :: mm + integer :: dd + integer :: hh + integer :: nn + integer :: ss + + ! Define variables computed within routine + + real(r_double) :: frac_day + + !===================================================================== + + ! Compute local variables + + julian_day = dble(dd - 32075 + 1461*(yyyy + 4800 + (mm - 14)/12)/4 + & + & 367*(mm - 2 - (mm - 14)/12*12)/12 - 3*((yyyy + 4900 + & + & (mm - 14)/12)/100)/4) + + ! Define local variables + + frac_day = julian_day*86400.0 + frac_day = frac_day + dble(hh*3600.0) + frac_day = frac_day + dble(nn*60.0) + frac_day = frac_day + dble(ss) + julian_day = frac_day/86400.0 + + !===================================================================== + + end subroutine time_methods_julian_day + + !======================================================================= + + ! SUBROUTINE: + + ! time_methods_sthms.f90 + + ! DESCRIPTION: + + ! This subroutine returns the hours, minutes, and seconds with + ! respect to the total seconds specified by the user. + + ! INPUT VARIABLES: + + ! * secs; a FORTRAN integer value defining the total number of + ! seconds elapsed for a given day. + + ! * x; a FORTRAN integer value containing the hours, minutes, and + ! seconds as (assuming UNIX convention) HHMMSS. + + ! OUTPUT VARIABLES: + + ! * x; a FORTRAN integer value containing the hours, minutes, and + ! seconds as (assuming UNIX convention) HHMMSS. + + !----------------------------------------------------------------------- + + subroutine time_methods_sthms(secs,x) + + ! Define variables passed to routine + + integer :: secs + integer :: x + + ! Define variables computed within routine + + integer :: ihr + integer :: imin + integer :: isecs + + !===================================================================== + + ! Define local variables + + ihr = secs/3600 + imin = mod(secs,3600)/60 + isecs = mod(mod(secs,3600),60) + + ! Compute local variables + + x = (ihr*10000) + (imin*100) + isecs + + !===================================================================== + + end subroutine time_methods_sthms + + !======================================================================= + +end module time_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/variable_interface.F90 b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/variable_interface.F90 new file mode 100644 index 000000000..98202712d --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/hafs_obs_preproc/variable_interface.F90 @@ -0,0 +1,1784 @@ +module variable_interface + + !======================================================================= + + !$$$ PROGRAM DOCUMENTATION BLOCK + + ! obs-preproc :: variable_interface + ! Copyright (C) 2019 Henry R. Winterbottom + + ! Email: henry.winterbottom@noaa.gov + + ! This program is free software: you can redistribute it and/or + ! modify it under the terms of the GNU General Public License as + ! published by the Free Software Foundation, either version 3 of the + ! License, or (at your option) any later version. + + ! This program is distributed in the hope that it will be useful, + ! but WITHOUT ANY WARRANTY; without even the implied warranty of + ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + ! General Public License for more details. + + ! You should have received a copy of the GNU General Public License + ! along with this program. If not, see + ! . + + ! Review the README, within the top-level directory, which provides + ! relevant instructions and (any) references cited by algorithms + ! within this software suite. + + !======================================================================= + + ! Define associated modules and subroutines + + use kinds_interface + + ! Define interfaces and attributes for module routines + + implicit none + private + public :: bufr_info_struct + public :: bufr_mxlv + public :: bufr_mxmn + public :: bufr_spval + public :: bufr_struct + public :: bufrhdr_struct + public :: fcstmdl_struct + public :: fv3_struct + public :: grid_struct + public :: hsa_spval + public :: hsa_struct + public :: interp_p_struct + public :: interp_spline_struct + public :: kdtree_struct + public :: meteo_struct + public :: sonde_struct + public :: spval + public :: statgrid_struct + public :: tcinfo_struct + public :: tdr_struct + public :: timeinfo_struct + public :: topogrid_struct + public :: variable_interface_cleanup_struct + public :: variable_interface_setup_struct + public :: varinfo_struct + public :: vdm_spval + public :: vdm_struct + interface variable_interface_cleanup_struct + module procedure finalize_bufr_struct + module procedure finalize_bufrhdr_struct + module procedure finalize_fcstmdl_struct + module procedure finalize_fv3_struct + module procedure finalize_grid_struct + module procedure finalize_hsa_struct + module procedure finalize_interp_p_struct + module procedure finalize_interp_spline_struct + module procedure finalize_kdtree_struct + module procedure finalize_meteo_struct + module procedure finalize_sonde_struct + module procedure finalize_statgrid_struct + module procedure finalize_tdr_struct + module procedure finalize_topogrid_struct + module procedure finalize_varinfo_struct + module procedure finalize_vdm_struct + end interface variable_interface_cleanup_struct + interface variable_interface_setup_struct + module procedure initialize_bufr_struct + module procedure initialize_bufrhdr_struct + module procedure initialize_fcstmdl_struct + module procedure initialize_fv3_struct + module procedure initialize_grid_struct + module procedure initialize_hsa_struct + module procedure initialize_interp_p_struct + module procedure initialize_interp_spline_struct + module procedure initialize_kdtree_struct + module procedure initialize_meteo_struct + module procedure initialize_sonde_struct + module procedure initialize_statgrid_struct + module procedure initialize_tdr_struct + module procedure initialize_topogrid_struct + module procedure initialize_varinfo_struct + module procedure initialize_vdm_struct + end interface variable_interface_setup_struct + + ! Define local variables + + real(r_double), parameter :: bufr_spval = 10.e10 + real(r_kind), parameter :: hsa_spval = -99.0 + real(r_kind), parameter :: spval = huge(0.0) + real(r_kind), parameter :: vdm_spval = -9.e30 + integer, parameter :: bufr_mxlv = 200 + integer, parameter :: bufr_mxmn = 35 + type bufr_struct + character(len=80) :: obstr + character(len=80) :: hdstr + character(len=80) :: qcstr + character(len=80) :: oestr + character(len=19) :: cdate + character(len=8) :: subset + real(r_double), dimension(:,:), allocatable :: obs + real(r_double), dimension(:,:), allocatable :: qcf + real(r_double), dimension(:,:), allocatable :: oer + real(r_double), dimension(:), allocatable :: hdr + integer :: idate + integer :: mxmn + integer :: mxlv + integer :: nrecs + end type bufr_struct ! type bufr_struct + type bufr_info_struct + character(len=500) :: filename + character(len=8) :: subset + integer :: obs_type_mass + integer :: obs_type_wind + end type bufr_info_struct ! type bufr_info_struct + type bufrhdr_struct + real(r_double), dimension(:,:), allocatable :: hdr + integer :: mxmn + integer :: nrecs + end type bufrhdr_struct ! type bufrhdr_struct + type fcstmdl_struct + real(r_kind), dimension(:,:), allocatable :: p + real(r_kind), dimension(:,:), allocatable :: q + real(r_kind), dimension(:,:), allocatable :: t + real(r_kind), dimension(:,:), allocatable :: u + real(r_kind), dimension(:,:), allocatable :: v + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind), dimension(:), allocatable :: slmsk + real(r_kind), dimension(:), allocatable :: idx + real(r_kind) :: clat + real(r_kind) :: clon + integer :: nobs + integer :: nz + end type fcstmdl_struct ! type fcstmdl_struct + type fv3_struct + real(r_kind), dimension(:,:,:), allocatable :: u + real(r_kind), dimension(:,:,:), allocatable :: v + real(r_kind), dimension(:,:), allocatable :: p + real(r_kind), dimension(:,:), allocatable :: q + real(r_kind), dimension(:,:), allocatable :: t + real(r_kind), dimension(:,:), allocatable :: ua + real(r_kind), dimension(:,:), allocatable :: va + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind), dimension(:), allocatable :: psfc + real(r_kind), dimension(:), allocatable :: slmsk + integer :: ncoords + integer :: nx + integer :: ny + integer :: nz + end type fv3_struct ! type fv3_struct + type grid_struct + real(r_kind), dimension(:), allocatable :: angle + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind), dimension(:), allocatable :: radius + real(r_kind) :: gcdist + real(r_kind) :: gchead + real(r_kind) :: gclat + real(r_kind) :: gclon + integer :: ncoords + integer :: nx + integer :: ny + end type grid_struct ! type grid_struct + type hsa_struct + character(len=4), dimension(:), allocatable :: tail + character(len=500) :: filename + logical :: process + real(r_double) :: rel_julian + real(r_double) :: spg_julian + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind), dimension(:), allocatable :: fallrate + real(r_kind), dimension(:), allocatable :: p + real(r_kind), dimension(:), allocatable :: rh + real(r_kind), dimension(:), allocatable :: t + real(r_kind), dimension(:), allocatable :: u + real(r_kind), dimension(:), allocatable :: v + real(r_kind), dimension(:), allocatable :: z + real(r_kind), dimension(:), allocatable :: time + real(r_kind), dimension(:), allocatable :: yymmdd + real(r_kind) :: pmax + real(r_kind) :: pmin + real(r_kind) :: psfc + real(r_kind) :: rellon + real(r_kind) :: rellat + real(r_kind) :: spglon + real(r_kind) :: spglat + integer, dimension(:), allocatable :: gmt + integer, dimension(:), allocatable :: wx + integer :: dd + integer :: hh + integer :: logtime + integer :: mm + integer :: nmnlevs + integer :: nn + integer :: nz + integer :: rel_hmsts + integer :: reltime + integer :: spgtime + integer :: ss + integer :: yyyy + end type hsa_struct ! type hsa_struct + type interp_p_struct + real(r_kind), dimension(:), allocatable :: var + real(r_kind), dimension(:), allocatable :: p + real(r_kind) :: psfc + integer :: nz + end type interp_p_struct ! type interp_p_struct + type interp_spline_struct + real(r_kind), dimension(:), allocatable :: xa + real(r_kind), dimension(:), allocatable :: ya + real(r_kind) :: x + real(r_kind) :: y + integer :: n + end type interp_spline_struct ! type interp_spline_struct + type kdtree_struct + real(r_kind), dimension(:,:), allocatable :: r2dist + real(r_kind) :: r2 + integer, dimension(:,:), allocatable :: idx + integer :: nalloc + integer :: ncoords + integer :: nfound + integer :: nn + end type kdtree_struct ! type kdtree_struct + type meteo_struct + character(len=500) :: tempdrop_name + character(len=5) :: acid + character(len=2) :: obnum + real(r_double), dimension(:), allocatable :: dwpt + real(r_double), dimension(:), allocatable :: jdate + real(r_double), dimension(:), allocatable :: lat + real(r_double), dimension(:), allocatable :: lon + real(r_double), dimension(:), allocatable :: p + real(r_double), dimension(:), allocatable :: q + real(r_double), dimension(:), allocatable :: rh + real(r_double), dimension(:), allocatable :: t + real(r_double), dimension(:), allocatable :: thta + real(r_double), dimension(:), allocatable :: thte + real(r_double), dimension(:), allocatable :: thtv + real(r_double), dimension(:), allocatable :: u + real(r_double), dimension(:), allocatable :: v + real(r_double), dimension(:), allocatable :: wdir + real(r_double), dimension(:), allocatable :: wspd + real(r_double), dimension(:), allocatable :: wvmxrt + real(r_double), dimension(:), allocatable :: z + real(r_kind), dimension(:), allocatable :: dist + real(r_kind), dimension(:), allocatable :: head + real(r_double) :: psfc + integer :: nz + end type meteo_struct ! type meteo_struct + type sonde_struct + character(len=500), dimension(:), allocatable :: filename + integer :: nsondes + end type sonde_struct ! type sonde_struct + type statgrid_struct + real(r_kind), dimension(:), allocatable :: var + real(r_kind) :: mean + real(r_kind) :: vari + real(r_kind) :: stdev + real(r_kind) :: varmin + real(r_kind) :: varmax + integer :: n + integer :: nvals + end type statgrid_struct ! type statgrid_struct + type tcinfo_struct + character(len=3) :: id + real(r_kind) :: mdl_clat + real(r_kind) :: mdl_clon + real(r_kind) :: mdl_pcen + real(r_kind) :: mdl_vmax + real(r_kind) :: obs_clat + real(r_kind) :: obs_clon + real(r_kind) :: obs_pcen + real(r_kind) :: obs_vmax + end type tcinfo_struct ! type tcinfo_struct + type tdr_struct + character(len=3), dimension(:), allocatable :: stmid + character(len=19) :: file_timestamp + real(r_kind), dimension(:), allocatable :: time_max + real(r_kind), dimension(:), allocatable :: time_min + integer, dimension(:), allocatable :: flag + integer, dimension(:), allocatable :: nrecs + integer :: nstmid + end type tdr_struct ! type tdr_struct + type timeinfo_struct + character(len=10) :: idatestr + real(r_double) :: jday + real(r_double) :: maxjday + real(r_double) :: minjday + integer :: idate + end type timeinfo_struct ! type timeinfo_struct + type topogrid_struct + real(r_kind), dimension(:), allocatable :: lat + real(r_kind), dimension(:), allocatable :: lon + real(r_kind), dimension(:), allocatable :: topo + integer :: ncoords + integer :: nx + integer :: ny + end type topogrid_struct ! type topogrid_struct + type varinfo_struct + character(len=500), dimension(:,:,:), allocatable :: varattrs + character(len=25), dimension(:), allocatable :: varname + character(len=10), dimension(:), allocatable :: dimname + character(len=10), dimension(:), allocatable :: vartype + integer, dimension(:,:), allocatable :: vardimid + integer, dimension(:), allocatable :: dimid + integer, dimension(:), allocatable :: dimval + integer, dimension(:), allocatable :: varid + integer, dimension(:), allocatable :: varndims + integer, dimension(:), allocatable :: varnattrs + integer :: nvars + integer :: ndims + integer :: nattrs + end type varinfo_struct ! type varinfo_struct + type vdm_struct + character(len=19), dimension(:,:), allocatable :: obs_time + character(len=500), dimension(:), allocatable :: filename + character(len=19), dimension(:), allocatable :: fix_time + real(r_kind), dimension(:,:), allocatable :: obs_alt + real(r_kind), dimension(:,:), allocatable :: obs_dist + real(r_kind), dimension(:,:), allocatable :: obs_head + real(r_kind), dimension(:,:), allocatable :: obs_lat + real(r_kind), dimension(:,:), allocatable :: obs_lon + real(r_kind), dimension(:,:), allocatable :: obs_plev + real(r_kind), dimension(:,:), allocatable :: obs_u + real(r_kind), dimension(:,:), allocatable :: obs_v + real(r_kind), dimension(:,:), allocatable :: obs_wdir + real(r_kind), dimension(:,:), allocatable :: obs_wspd + real(r_kind), dimension(:), allocatable :: fix_lat + real(r_kind), dimension(:), allocatable :: fix_lon + integer :: nobs + integer :: nvdm + end type vdm_struct ! type vdm_struct + + !----------------------------------------------------------------------- + +contains + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_bufr_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! bufr_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN bufr_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_bufr_struct(grid) + + ! Define variables passed routine + + type(bufr_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%obs)) deallocate(grid%obs) + if(allocated(grid%qcf)) deallocate(grid%qcf) + if(allocated(grid%oer)) deallocate(grid%oer) + if(allocated(grid%hdr)) deallocate(grid%hdr) + + !===================================================================== + + end subroutine finalize_bufr_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_bufrhdr_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! bufrhdr_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN bufrhdr_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_bufrhdr_struct(grid) + + ! Define variables passed routine + + type(bufrhdr_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%hdr)) deallocate(grid%hdr) + + !===================================================================== + + end subroutine finalize_bufrhdr_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_fcstmdl_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! fcstmdl_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fcstmdl_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_fcstmdl_struct(grid) + + ! Define variables passed to routine + + type(fcstmdl_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%p)) deallocate(grid%p) + if(allocated(grid%q)) deallocate(grid%q) + if(allocated(grid%t)) deallocate(grid%t) + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%slmsk)) deallocate(grid%slmsk) + if(allocated(grid%idx)) deallocate(grid%idx) + + !===================================================================== + + end subroutine finalize_fcstmdl_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_fv3_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! fv3_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_fv3_struct(grid) + + ! Define variables passed to routine + + type(fv3_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + if(allocated(grid%p)) deallocate(grid%p) + if(allocated(grid%q)) deallocate(grid%q) + if(allocated(grid%t)) deallocate(grid%t) + if(allocated(grid%ua)) deallocate(grid%ua) + if(allocated(grid%va)) deallocate(grid%va) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%psfc)) deallocate(grid%psfc) + if(allocated(grid%slmsk)) deallocate(grid%slmsk) + + !===================================================================== + + end subroutine finalize_fv3_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_grid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! grid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_grid_struct(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%angle)) deallocate(grid%angle) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%radius)) deallocate(grid%radius) + + !===================================================================== + + end subroutine finalize_grid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_hsa_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! hsa_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN hsa_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_hsa_struct(grid) + + ! Define variables passed to routine + + type(hsa_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%tail)) deallocate(grid%tail) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%fallrate)) deallocate(grid%fallrate) + if(allocated(grid%p)) deallocate(grid%p) + if(allocated(grid%rh)) deallocate(grid%rh) + if(allocated(grid%t)) deallocate(grid%t) + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + if(allocated(grid%yymmdd)) deallocate(grid%yymmdd) + if(allocated(grid%z)) deallocate(grid%z) + if(allocated(grid%gmt)) deallocate(grid%gmt) + if(allocated(grid%wx)) deallocate(grid%wx) + if(allocated(grid%time)) deallocate(grid%time) + + !===================================================================== + + end subroutine finalize_hsa_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_interp_p_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! interp_p_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_p_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_interp_p_struct(grid) + + ! Define variables passed to routine + + type(interp_p_struct) :: grid + logical :: debug + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%p)) deallocate(grid%p) + if(allocated(grid%var)) deallocate(grid%var) + + !===================================================================== + + end subroutine finalize_interp_p_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_interp_spline_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! interp_spline_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_interp_spline_struct(grid) + + ! Define variables passed to routine + + type(interp_spline_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%xa)) deallocate(grid%xa) + if(allocated(grid%ya)) deallocate(grid%ya) + + !===================================================================== + + end subroutine finalize_interp_spline_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_kdtree_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! kdtree_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN kdtree_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_kdtree_struct(grid) + + ! Define variables passed to routine + + type(kdtree_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%r2dist)) deallocate(grid%r2dist) + if(allocated(grid%idx)) deallocate(grid%idx) + + !===================================================================== + + end subroutine finalize_kdtree_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_meteo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! meteo_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_meteo_struct(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%dwpt)) deallocate(grid%dwpt) + if(allocated(grid%jdate)) deallocate(grid%jdate) + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%p)) deallocate(grid%p) + if(allocated(grid%q)) deallocate(grid%q) + if(allocated(grid%rh)) deallocate(grid%rh) + if(allocated(grid%t)) deallocate(grid%t) + if(allocated(grid%thta)) deallocate(grid%thta) + if(allocated(grid%thte)) deallocate(grid%thte) + if(allocated(grid%thtv)) deallocate(grid%thtv) + if(allocated(grid%u)) deallocate(grid%u) + if(allocated(grid%v)) deallocate(grid%v) + if(allocated(grid%wdir)) deallocate(grid%wdir) + if(allocated(grid%wspd)) deallocate(grid%wspd) + if(allocated(grid%wvmxrt)) deallocate(grid%wvmxrt) + if(allocated(grid%z)) deallocate(grid%z) + + !===================================================================== + + end subroutine finalize_meteo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_sonde_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! sonde_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN sonde_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_sonde_struct(grid) + + ! Define variables passed to routine + + type(sonde_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%filename)) deallocate(grid%filename) + + !===================================================================== + + end subroutine finalize_sonde_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_statgrid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! statgrid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN statgrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_statgrid_struct(grid) + + ! Define variables passed to routine + + type(statgrid_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%var)) deallocate(grid%var) + + !===================================================================== + + end subroutine finalize_statgrid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_tdr_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! tdr_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN tdr_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_tdr_struct(grid) + + ! Define variables passed to routine + + type(tdr_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%stmid)) deallocate(grid%stmid) + if(allocated(grid%time_max)) deallocate(grid%time_max) + if(allocated(grid%time_min)) deallocate(grid%time_min) + if(allocated(grid%flag)) deallocate(grid%flag) + if(allocated(grid%nrecs)) deallocate(grid%nrecs) + + !===================================================================== + + end subroutine finalize_tdr_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_topogrid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! topogrid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN topogrid_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_topogrid_struct(grid) + + ! Define variables passed routine + + type(topogrid_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%lat)) deallocate(grid%lat) + if(allocated(grid%lon)) deallocate(grid%lon) + if(allocated(grid%topo)) deallocate(grid%topo) + + !===================================================================== + + end subroutine finalize_topogrid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_varinfo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! varinfo_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN varinfo_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_varinfo_struct(grid) + + ! Define variables passed to routine + + type(varinfo_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%varattrs)) deallocate(grid%varattrs) + if(allocated(grid%varname)) deallocate(grid%varname) + if(allocated(grid%vartype)) deallocate(grid%vartype) + if(allocated(grid%dimname)) deallocate(grid%dimname) + if(allocated(grid%dimval)) deallocate(grid%dimval) + if(allocated(grid%dimid)) deallocate(grid%dimid) + if(allocated(grid%vardimid)) deallocate(grid%vardimid) + if(allocated(grid%varid)) deallocate(grid%varid) + if(allocated(grid%varndims)) deallocate(grid%varndims) + if(allocated(grid%varnattrs)) deallocate(grid%varnattrs) + + !===================================================================== + + end subroutine finalize_varinfo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! finalize_vdm_struct.f90 + + ! DESCRIPTION: + + ! This subroutine deallocates memory for all arrays within the + ! vdm_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN vdm_struct variable. + + !----------------------------------------------------------------------- + + subroutine finalize_vdm_struct(grid) + + ! Define variables passed to routine + + type(vdm_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(allocated(grid%filename)) deallocate(grid%filename) + if(allocated(grid%fix_lat)) deallocate(grid%fix_lat) + if(allocated(grid%fix_lon)) deallocate(grid%fix_lon) + if(allocated(grid%fix_time)) deallocate(grid%fix_time) + if(allocated(grid%obs_alt)) deallocate(grid%obs_alt) + if(allocated(grid%obs_dist)) deallocate(grid%obs_dist) + if(allocated(grid%obs_head)) deallocate(grid%obs_head) + if(allocated(grid%obs_lat)) deallocate(grid%obs_lat) + if(allocated(grid%obs_lon)) deallocate(grid%obs_lon) + if(allocated(grid%obs_plev)) deallocate(grid%obs_plev) + if(allocated(grid%obs_time)) deallocate(grid%obs_time) + if(allocated(grid%obs_u)) deallocate(grid%obs_u) + if(allocated(grid%obs_v)) deallocate(grid%obs_v) + if(allocated(grid%obs_wdir)) deallocate(grid%obs_wdir) + if(allocated(grid%obs_wspd)) deallocate(grid%obs_wspd) + + !===================================================================== + + end subroutine finalize_vdm_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_bufr_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! bufr_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN bufr_struct variable containing the variables + ! necessary to allocate and initialize the respective variable + ! arrays. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN bufr_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_bufr_struct(grid) + + ! Define variables passed routine + + type(bufr_struct) :: grid + + !===================================================================== + + ! Check local variable and proceed accordingly + + if(grid%mxmn .eq. 0) grid%mxmn = bufr_mxmn + if(grid%mxlv .eq. 0) grid%mxlv = bufr_mxlv + + ! Allocate memory for local variables + + if(.not. allocated(grid%obs)) allocate(grid%obs(grid%mxmn,grid%mxlv)) + if(.not. allocated(grid%qcf)) allocate(grid%qcf(grid%mxmn,grid%mxlv)) + if(.not. allocated(grid%oer)) allocate(grid%oer(grid%mxmn,grid%mxlv)) + if(.not. allocated(grid%hdr)) allocate(grid%hdr(grid%mxmn)) + + ! Define local variables + + grid%obs = bufr_spval + grid%qcf = bufr_spval + grid%oer = bufr_spval + grid%hdr = bufr_spval + + !===================================================================== + + end subroutine initialize_bufr_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_bufrhdr_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! bufrhdr_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN bufrhdr_struct variable containing the variables + ! necessary to allocate and initialize the respective variable + ! arrays. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN bufrhdr_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_bufrhdr_struct(grid) + + ! Define variables passed routine + + type(bufrhdr_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%hdr)) allocate(grid%hdr(grid%mxmn,grid%nrecs)) + + !===================================================================== + + end subroutine initialize_bufrhdr_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_fcstmdl_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! fcstmdl_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fcstmdl_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN fcstmdl_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_fcstmdl_struct(grid) + + ! Define variables passed to routine + + type(fcstmdl_struct) :: grid + + !===================================================================== + + ! Deallocate memory for local variables + + if(.not. allocated(grid%p)) allocate(grid%p(grid%nobs,grid%nz)) + if(.not. allocated(grid%q)) allocate(grid%q(grid%nobs,grid%nz)) + if(.not. allocated(grid%t)) allocate(grid%t(grid%nobs,grid%nz)) + if(.not. allocated(grid%u)) allocate(grid%u(grid%nobs,grid%nz)) + if(.not. allocated(grid%v)) allocate(grid%v(grid%nobs,grid%nz)) + if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nobs)) + if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nobs)) + if(.not. allocated(grid%slmsk)) allocate(grid%slmsk(grid%nobs)) + if(.not. allocated(grid%idx)) allocate(grid%idx(grid%nobs)) + + !===================================================================== + + end subroutine initialize_fcstmdl_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_fv3_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! fv3_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN fv3_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN fv3_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_fv3_struct(grid) + + ! Define variables passed to routine + + type(fv3_struct) :: grid + + !===================================================================== + + ! Define local variables + + if(grid%ncoords .le. 0) grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%u)) & + & allocate(grid%u(grid%nx,(grid%ny+1),grid%nz)) + if(.not. allocated(grid%v)) & + & allocate(grid%v((grid%nx+1),grid%ny,grid%nz)) + if(.not. allocated(grid%p)) & + & allocate(grid%p(grid%ncoords,grid%nz)) + if(.not. allocated(grid%q)) & + & allocate(grid%q(grid%ncoords,grid%nz)) + if(.not. allocated(grid%t)) & + & allocate(grid%t(grid%ncoords,grid%nz)) + if(.not. allocated(grid%ua)) & + & allocate(grid%ua(grid%ncoords,grid%nz)) + if(.not. allocated(grid%va)) & + & allocate(grid%va(grid%ncoords,grid%nz)) + if(.not. allocated(grid%lat)) & + & allocate(grid%lat(grid%ncoords)) + if(.not. allocated(grid%lon)) & + & allocate(grid%lon(grid%ncoords)) + if(.not. allocated(grid%psfc)) & + & allocate(grid%psfc(grid%ncoords)) + if(.not. allocated(grid%slmsk)) & + & allocate(grid%slmsk(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_fv3_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_grid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! grid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN grid_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_grid_struct(grid) + + ! Define variables passed to routine + + type(grid_struct) :: grid + + !===================================================================== + + ! Define local variables + + if(grid%ncoords .le. 0) grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%angle)) & + & allocate(grid%angle(grid%ncoords)) + if(.not. allocated(grid%lat)) & + & allocate(grid%lat(grid%ncoords)) + if(.not. allocated(grid%lon)) & + & allocate(grid%lon(grid%ncoords)) + if(.not. allocated(grid%radius)) & + & allocate(grid%radius(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_grid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_hsa_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! hsa_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN hsa_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN hsa_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_hsa_struct(grid) + + ! Define variables passed to routine + + type(hsa_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%tail)) allocate(grid%tail(grid%nz)) + if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nz)) + if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nz)) + if(.not. allocated(grid%fallrate)) allocate(grid%fallrate(grid%nz)) + if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) + if(.not. allocated(grid%rh)) allocate(grid%rh(grid%nz)) + if(.not. allocated(grid%t)) allocate(grid%t(grid%nz)) + if(.not. allocated(grid%u)) allocate(grid%u(grid%nz)) + if(.not. allocated(grid%v)) allocate(grid%v(grid%nz)) + if(.not. allocated(grid%yymmdd)) allocate(grid%yymmdd(grid%nz)) + if(.not. allocated(grid%z)) allocate(grid%z(grid%nz)) + if(.not. allocated(grid%gmt)) allocate(grid%gmt(grid%nz)) + if(.not. allocated(grid%wx)) allocate(grid%wx(grid%nz)) + if(.not. allocated(grid%time)) allocate(grid%time(grid%nz)) + + ! Define local variables + + grid%process = .true. + + !===================================================================== + + end subroutine initialize_hsa_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_interp_p_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! interp_p_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_p_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN interp_p_struct variable containing allocated + ! and initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_interp_p_struct(grid) + + ! Define variables passed to routine + + type(interp_p_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) + if(.not. allocated(grid%var)) allocate(grid%var(grid%nz)) + + !===================================================================== + + end subroutine initialize_interp_p_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_interp_spline_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! interp_spline_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN interp_spline_struct variable containing + ! allocated and initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_interp_spline_struct(grid) + + ! Define variables passed to routine + + type(interp_spline_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%xa)) allocate(grid%xa(grid%n)) + if(.not. allocated(grid%ya)) allocate(grid%ya(grid%n)) + + !===================================================================== + + end subroutine initialize_interp_spline_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_kdtree_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! kdtree_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN kdtree_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN kdtree_struct variable where all arrays are + ! allocated and initialized (when necessary). + + !----------------------------------------------------------------------- + + subroutine initialize_kdtree_struct(grid) + + ! Define variables passed to routine + + type(kdtree_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%r2dist)) & + & allocate(grid%r2dist(grid%ncoords,grid%nn)) + if(.not. allocated(grid%idx)) & + & allocate(grid%idx(grid%ncoords,grid%nn)) + + !===================================================================== + + end subroutine initialize_kdtree_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_meteo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! meteo_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN meteo_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_meteo_struct(grid) + + ! Define variables passed to routine + + type(meteo_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%dwpt)) allocate(grid%dwpt(grid%nz)) + if(.not. allocated(grid%jdate)) allocate(grid%jdate(grid%nz)) + if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nz)) + if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nz)) + if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) + if(.not. allocated(grid%q)) allocate(grid%q(grid%nz)) + if(.not. allocated(grid%rh)) allocate(grid%rh(grid%nz)) + if(.not. allocated(grid%t)) allocate(grid%t(grid%nz)) + if(.not. allocated(grid%thta)) allocate(grid%thta(grid%nz)) + if(.not. allocated(grid%thte)) allocate(grid%thte(grid%nz)) + if(.not. allocated(grid%thtv)) allocate(grid%thtv(grid%nz)) + if(.not. allocated(grid%u)) allocate(grid%u(grid%nz)) + if(.not. allocated(grid%v)) allocate(grid%v(grid%nz)) + if(.not. allocated(grid%wdir)) allocate(grid%wdir(grid%nz)) + if(.not. allocated(grid%wspd)) allocate(grid%wspd(grid%nz)) + if(.not. allocated(grid%wvmxrt)) allocate(grid%wvmxrt(grid%nz)) + if(.not. allocated(grid%z)) allocate(grid%z(grid%nz)) + + ! Define local variables + + grid%dwpt = spval + grid%jdate = spval + grid%lat = spval + grid%lon = spval + grid%p = spval + grid%q = spval + grid%rh = spval + grid%t = spval + grid%thta = spval + grid%thte = spval + grid%thtv = spval + grid%u = spval + grid%v = spval + grid%wdir = spval + grid%wspd = spval + grid%wvmxrt = spval + grid%z = spval + grid%psfc = spval + + !===================================================================== + + end subroutine initialize_meteo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_sonde_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! sonde_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN sonde_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN sonde_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_sonde_struct(grid) + + ! Define variables passed to routine + + type(sonde_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%filename)) & + & allocate(grid%filename(grid%nsondes)) + + !===================================================================== + + end subroutine initialize_sonde_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_statgrid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! statgrid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN statgrid_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN statgrid_struct variable containing allocated + ! and initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_statgrid_struct(grid) + + ! Define variables passed to routine + + type(statgrid_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%var)) allocate(grid%var(grid%n)) + + !===================================================================== + + end subroutine initialize_statgrid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_tdr_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! tdr_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN tdr_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN tdr_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_tdr_struct(grid) + + ! Define variables passed to routine + + type(tdr_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%stmid)) & + & allocate(grid%stmid(grid%nstmid)) + if(.not. allocated(grid%time_max)) & + & allocate(grid%time_max(grid%nstmid)) + if(.not. allocated(grid%time_min)) & + & allocate(grid%time_min(grid%nstmid)) + if(.not. allocated(grid%flag)) & + & allocate(grid%flag(grid%nstmid)) + if(.not. allocated(grid%nrecs)) & + & allocate(grid%nrecs(grid%nstmid)) + + !===================================================================== + + end subroutine initialize_tdr_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_topogrid_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! topogrid_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN topogrid_struct variable containing the + ! variables necessary to allocate and initialize the respective + ! variable arrays. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN topogrid_struct variable containing allocated + ! and initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_topogrid_struct(grid) + + ! Define variables passed routine + + type(topogrid_struct) :: grid + + !===================================================================== + + ! Define local variables + + grid%ncoords = (grid%nx*grid%ny) + + ! Allocate memory for local variables + + if(.not. allocated(grid%lat)) allocate(grid%lat(grid%ncoords)) + if(.not. allocated(grid%lon)) allocate(grid%lon(grid%ncoords)) + if(.not. allocated(grid%topo)) allocate(grid%topo(grid%ncoords)) + + !===================================================================== + + end subroutine initialize_topogrid_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_varinfo_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! varinfo_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN varinfo_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN varinfo_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_varinfo_struct(grid) + + ! Define variables passed to routine + + type(varinfo_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%varattrs)) & + & allocate(grid%varattrs(grid%nvars,grid%nattrs,2)) + if(.not. allocated(grid%vardimid)) & + & allocate(grid%vardimid(grid%nvars,grid%ndims)) + if(.not. allocated(grid%varname)) & + & allocate(grid%varname(grid%nvars)) + if(.not. allocated(grid%vartype)) & + & allocate(grid%vartype(grid%nvars)) + if(.not. allocated(grid%varndims)) & + & allocate(grid%varndims(grid%nvars)) + if(.not. allocated(grid%varnattrs)) & + & allocate(grid%varnattrs(grid%nvars)) + if(.not. allocated(grid%varid)) & + & allocate(grid%varid(grid%nvars)) + if(.not. allocated(grid%dimval)) & + & allocate(grid%dimval(grid%ndims)) + if(.not. allocated(grid%dimname)) & + & allocate(grid%dimname(grid%ndims)) + if(.not. allocated(grid%dimid)) & + & allocate(grid%dimid(grid%ndims)) + + !===================================================================== + + end subroutine initialize_varinfo_struct + + !======================================================================= + + ! SUBROUTINE: + + ! initialize_vdm_struct.f90 + + ! DESCRIPTION: + + ! This subroutine allocates memory for all arrays within the + ! vdm_struct FORTRAN structure. + + ! INPUT VARIABLES: + + ! * grid; a FORTRAN vdm_struct variable. + + ! OUTPUT VARIABLES: + + ! * grid; a FORTRAN vdm_struct variable containing allocated and + ! initialized variable arrays. + + !----------------------------------------------------------------------- + + subroutine initialize_vdm_struct(grid) + + ! Define variables passed to routine + + type(vdm_struct) :: grid + + !===================================================================== + + ! Allocate memory for local variables + + if(.not. allocated(grid%obs_alt)) & + & allocate(grid%obs_alt(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_dist)) & + & allocate(grid%obs_dist(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_head)) & + & allocate(grid%obs_head(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_lat)) & + & allocate(grid%obs_lat(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_lon)) & + & allocate(grid%obs_lon(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_plev)) & + & allocate(grid%obs_plev(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_time)) & + & allocate(grid%obs_time(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_u)) & + & allocate(grid%obs_u(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_v)) & + & allocate(grid%obs_v(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_wdir)) & + & allocate(grid%obs_wdir(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%obs_wspd)) & + & allocate(grid%obs_wspd(grid%nvdm,grid%nobs)) + if(.not. allocated(grid%filename)) & + & allocate(grid%filename(grid%nvdm)) + if(.not. allocated(grid%fix_lat)) & + & allocate(grid%fix_lat(grid%nvdm)) + if(.not. allocated(grid%fix_lon)) & + & allocate(grid%fix_lon(grid%nvdm)) + if(.not. allocated(grid%fix_time)) & + & allocate(grid%fix_time(grid%nvdm)) + + ! Define local variables + + grid%obs_dist = spval + grid%obs_head = spval + grid%obs_plev = spval + grid%obs_lat = spval + grid%obs_lon = spval + grid%obs_time = '0000-00-00_00:00:00' + grid%obs_u = spval + grid%obs_v = spval + grid%obs_wdir = spval + grid%obs_wspd = spval + + !===================================================================== + + end subroutine initialize_vdm_struct + + !======================================================================= + +end module variable_interface diff --git a/sorc/hafs_tools.fd/sorc/mpiserial/CMakeLists.txt b/sorc/hafs_tools.fd/sorc/mpiserial/CMakeLists.txt new file mode 100644 index 000000000..c81bf88c9 --- /dev/null +++ b/sorc/hafs_tools.fd/sorc/mpiserial/CMakeLists.txt @@ -0,0 +1,24 @@ +#======================================================================= +#$$$ CMAKEFILE DOCUMENTATION BLOCK +# Biju Thomas +# Email: biju.thomas@noaa.gov +#======================================================================= + +set(cc_srcs + mpiserial.c) + +set(exe_name mpiserial.x) +set(exec_dir ${CMAKE_SOURCE_DIR}/exec) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -DLINUX -DUNDERSCORE -Dfunder -DFortranByte=char -DFortranInt=int -DFortranLlong='long long'") +add_executable(${exe_name} ${cc_srcs}) + +#target_include_directories( +# ${exe_name} PUBLIC +# ${MPI_C_INCLUDE_PATH}) + +target_link_libraries( + ${exe_name} PUBLIC + MPI::MPI_C) + +install(TARGETS ${exe_name} DESTINATION ${exec_dir}) diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/Makefile b/sorc/hafs_tools.fd/sorc/obs_to_bufr/Makefile deleted file mode 100644 index 80a8ab022..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/Makefile +++ /dev/null @@ -1,39 +0,0 @@ -EXEC = ../../exec/obs_to_bufr.x - -MODS = kinds_interface.o \ - constants_interface.o \ - variable_interface.o \ - namelist_interface.o \ - diagnostics_interface.o \ - time_methods_interface.o \ - math_methods_interface.o \ - meteo_methods_interface.o \ - bufrio_interface.o \ - json_interface.o \ - netcdf_interface.o \ - fileio_interface.o \ - interpolation_interface.o \ - observation_interface.o \ - obs_to_bufr_interface.o - -SUBS = - -OBJS = $(MODS) $(SUBS) main.o - -INC = -I${TOOLS_INC} ${NETCDF_INCLUDE} ${HDF5_INCLUDE} -LIBS = -L${TOOLS_LIBDIR} -lfson -lslatec -lslint -lspline ${BUFR_LDFLAGS} \ - ${NETCDF_LDFLAGS} ${HDF5_LDFLAGS} ${Z_LIB} -FFLAGS += $(INC) - -$(EXEC): main.F90 $(MODS) $(SUBS) - ${FC} $(FFLAGS) main.F90 $(MODS) $(SUBS) -o $(@) $(LIBS) - -.PHONY: clean - -.SUFFIXES: .F90 .o - -clean: - rm *.o *.mod - -.F90.o: - ${FC} $(FFLAGS) -c $*.F90 diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/bufrio_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/bufrio_interface.F90 deleted file mode 100644 index d817c6bb2..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/bufrio_interface.F90 +++ /dev/null @@ -1,634 +0,0 @@ -module bufrio_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: bufrio_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use namelist_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: bufrio_interface_close - public :: bufrio_interface_flag - public :: bufrio_interface_idate - public :: bufrio_interface_nrecs - public :: bufrio_interface_open - public :: bufrio_interface_write - public :: bufr_iret - - ! Define local variables - - logical :: bufr_exist = .false. - integer :: unit_in = 10 - integer :: unit_out = 20 - integer :: unit_tbl = 30 - integer :: bufr_iret - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! bufrio_interface_close.f90 - - ! DESCRIPTION: - - ! This subroutine closes the user specified BUFR file path assigned - ! to the local module variable unit_out. - - ! INPUT VARIABLES: - - ! * bufr_read; a FORTRAN logical variable indicating whether the - ! file to be closed has been opened for reading. - - ! * bufr_write; a FORTRAN logical variable indicating whether the - ! file to be closed has been opened for writing. - - !----------------------------------------------------------------------- - - subroutine bufrio_interface_close(bufr_read,bufr_write) - - ! Define variables passed to routine - - logical :: bufr_read - logical :: bufr_write - - !===================================================================== - - ! Define local variables - - if(bufr_read) then - call closbf(unit_in) - end if ! if(bufr_read) - if(bufr_write) then - close(unit_tbl) - call closmg(unit_out) - call closbf(unit_out) - end if ! if(bufr_write) - - !===================================================================== - - end subroutine bufrio_interface_close - - !======================================================================= - - ! SUBROUTINE: - - ! bufrio_interface_flag.f90 - - ! DESCRIPTION: - - ! This subroutine modifies the BUFR messages in accordance with the - ! user specifications. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified BUFR file path. - - ! * obs_flag; a FORTRAN obs_flag_struct variable, containing the - ! observation flagging/update/change information. - - !----------------------------------------------------------------------- - - subroutine bufrio_interface_flag(filename,obs_flag) - - ! Define variables passed to routine - - type(obs_flag_struct) :: obs_flag - character(len=500) :: filename - - ! Define variables computed within routine - - type(bufr_struct) :: bufr - logical :: copy_bufrrec - character(len=10) :: mneumonic - character(len=8) :: subset - real(r_double) :: bufr_val(bufr_mxlv) - real(r_double) :: obs_val(bufr_mxlv) - real(r_double) :: obs_type(1) - integer :: ireadmg - integer :: ireadsb - integer :: nlev - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - call bufrio_interface_idate(analdate,bufr) - call datelen(10) - open(unit_in,file=trim(adjustl(filename)),form='unformatted', & - & convert='big_endian') - call openbf(unit_in,'IN',unit_in) - call openbf(unit_out,'OUT',unit_in) - - ! Loop through local variable - - msg_report: do while(ireadmg(unit_in,subset,bufr%idate) .eq. 0) - - ! Define local variables - - copy_bufrrec = .true. - - ! Loop through local variable - - obsflag: do i = 1, obs_flag%nflag - - ! Check local variable and proceed accordingly - - if(trim(adjustl(subset)) .eq. trim(adjustl(obs_flag%subset(i)))) & - & then - - ! Loop through local variable - - sb_report: do while(ireadsb(unit_in) .eq. 0) - - ! Define local variables - - call openmb(unit_out,subset,bufr%idate) - call ufbint(unit_in,obs_type,1,1,nlev,'TYP') - - ! Check local variable and proceed accordingly - - if(int(obs_type(1)) .eq. obs_flag%obs_type(i)) then - - ! Define local variables - - copy_bufrrec = .false. - mneumonic = obs_flag%mneumonic(i) - obs_val = dble(obs_flag%val(i)) - exit obsflag - - end if ! if(int(obs_type(1)) - ! .eq. obs_flag%obs_type(i)) - - end do sb_report ! do while(ireadsb(unit_in) .eq. 0) - - end if ! if(trim(adjustl(subset)) - ! .eq. trim(adjustl(obs_flag%subset(i)))) - - end do obsflag ! do i = 1, obs_flag%nflag - - ! Check local variable and proceed accordingly - - if(copy_bufrrec) then - - ! Define local variables - - call closmg(unit_out) - call copymg(unit_in,unit_out) - - end if ! if(copy_bufrrec) - - ! Check local variable and proceed accordingly - - if(.not. copy_bufrrec) then - - ! Define local variables - - call ufbcpy(unit_in,unit_out) - call ufbrep(unit_in,bufr_val,1,bufr_mxlv,nlev, & - & trim(adjustl(mneumonic))) - - ! Check local variable and proceed accordingly - - if(nlev .gt. 0) then - - ! Define local variables - - call ufbrep(unit_out,obs_val,1,nlev,bufr_iret, & - & trim(adjustl(mneumonic))) - - end if ! if(nlev .gt. 0) - - ! Define local variables - - call writsb(unit_out) - - end if ! if(.not. copy_bufrrec) - - end do msg_report ! do while(ireadmg(unit_in,subset,bufr%idate) - ! .eq. 0) - - ! Define local variables - - call closbf(unit_out) - call closbf(unit_in) - - !===================================================================== - - end subroutine bufrio_interface_flag - - !======================================================================= - - ! SUBROUTINE: - - ! bufio_interface_idate.f90 - - ! DESCRIPTION: - - ! This subroutine defines the integer date string for the BUFR file. - - ! INPUT VARIABLES: - - ! * datestr; a FORTRAN character string specifying the analysis - ! date, formatted as (assuming UNIX convention) - ! 'yyyy-mm-dd_HH:MM:SS'. - - ! * bufr; a FORTRAN bufr_struct variable. - - ! OUTPUT VARIABLES: - - ! * bufr; a FORTRAN bufr_struct variable containing the 'idate' - ! variable attribute value. - - !----------------------------------------------------------------------- - - subroutine bufrio_interface_idate(datestr,bufr) - - ! Define variables passed to routine - - type(bufr_struct) :: bufr - character(len=19) :: datestr - - ! Define variables computed within routine - - character(len=10) :: strdate - integer :: dateint - integer :: strint - - !===================================================================== - - ! Define local variables - - write(strdate,'(a4,a2,a2,a2)') datestr(1:4), datestr(6:7), & - & datestr(9:10), datestr(12:13) - read(strdate,500) dateint - bufr%idate = dateint -500 format(i10) - - !===================================================================== - - end subroutine bufrio_interface_idate - - !======================================================================= - - ! SUBROUTINE: - - ! bufrio_interface_nrecs.f90 - - ! DESCRIPTION: - - ! This subroutine counts the number of BUFR messages within the user - ! specified BUFR formatted file. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified BUFR file path. - - ! * tablename; a FORTRAN character string specifying the full-path - ! to the file containing the BUFR table. - - ! * bufr; a FORTRAN bufr_struct variable, containing (at minimum) - ! the variable 'idate'. - - ! * nrecs; a FORTRAN integer variable to define the number of BUFR - ! messages. - - ! OUTPUT VARIABLES: - - ! * nrecs; a FORTRAN integer variable defining the number of BUFR - ! messages within the user specified BUFR file. - - !----------------------------------------------------------------------- - - subroutine bufrio_interface_nrecs(filename,tablename,bufr) - - ! Define variables passed to routine - - type(bufr_struct) :: bufr - character(len=500) :: filename - character(len=500) :: tablename - - ! Define variables computed within routine - - character(len=8) :: msgtype - integer :: ireadmg - integer :: nrecs - - !===================================================================== - - ! Define local variables - - nrecs = 0 - call bufrio_interface_open(filename,tablename,bufr,.true.,.false., & - & .false.) - - ! Loop through local variable - - do while(ireadmg(unit_in,msgtype,bufr%idate) == 0) - - ! Define local variables - - nrecs = nrecs + 1 - - end do ! do while(ireadmg(unit_in,msgtype,bufr%idate) == 0) - - ! Define local variables - - bufr%nrecs = nrecs - call bufrio_interface_close(.true.,.false.) - - !===================================================================== - - end subroutine bufrio_interface_nrecs - - !======================================================================= - - ! SUBROUTINE: - - ! bufrio_interface_open.f90 - - ! DESCRIPTION: - - ! This subroutine checks for the existence of BUFR formatted file, - ! specified by the file path provided by the user; the BUFR table - ! provided by the user is written to the BUFR file and and the - ! respective file is prepared for the BUFR records to be written. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified BUFR file path. - - ! * tablename; a FORTRAN character string specifying the full-path - ! to the file containing the BUFR table. - - ! * bufr; a FORTRAN bufr_struct variable, containing (at minimum) - ! the variable 'idate'. - - ! * bufr_read; a FORTRAN logical variable indicating whether the - ! file to be closed has been opened for reading. - - ! * bufr_write; a FORTRAN logical variable indicating whether the - ! file to be closed has been opened for writing. - - !----------------------------------------------------------------------- - - subroutine bufrio_interface_open(filename,tablename,bufr,bufr_read, & - & bufr_read_write,bufr_write) - - ! Define variables passed to routine - - type(bufr_struct) :: bufr - character(len=500) :: filename - character(len=500) :: tablename - logical :: bufr_read - logical :: bufr_read_write - logical :: bufr_write - - !===================================================================== - - ! Define local variables - - inquire(file = trim(adjustl(filename)),exist = bufr_exist) - if(bufr_read) then - call read_bufr_open(filename) - call openbf(unit_in,'IN',unit_in) - end if ! if(bufr_read) - if(bufr_read_write) then - call read_write_bufr_open(filename) - call openbf(unit_in,'IN',unit_in) - call openbf(unit_out,'OUT',unit_in) - end if ! if(bufr_read_write) - if(bufr_write) then - call write_bufr_open(filename) - call write_bufr_table(tablename) - call openmb(unit_out,bufr%subset,bufr%idate) - end if ! if(bufr_write) - - !===================================================================== - - end subroutine bufrio_interface_open - - !======================================================================= - - ! SUBROUTINE: - - ! bufrio_interface_write.f90 - - ! DESCRIPTION: - - ! This subroutine writes a BUFR formatted record to an external, - ! open BUFR file. - - ! INPUT VARIABLES: - - ! * bufr; a FORTRAN bufr_struct variable containing the BUFR - ! variables describing the respective BUFR record. - - !----------------------------------------------------------------------- - - subroutine bufrio_interface_write(bufr) - - ! Define variables passed to routine - - type(bufr_struct) :: bufr - - !===================================================================== - - ! Define local variables - - call ufbint(unit_out,bufr%hdr,bufr%mxmn,bufr%mxlv,bufr_iret, & - & bufr%hdstr) - call ufbint(unit_out,bufr%obs,bufr%mxmn,bufr%mxlv,bufr_iret, & - & bufr%obstr) - call ufbint(unit_out,bufr%oer,bufr%mxmn,bufr%mxlv,bufr_iret, & - & bufr%oestr) - call ufbint(unit_out,bufr%qcf,bufr%mxmn,bufr%mxlv,bufr_iret, & - & bufr%qcstr) - call writsb(unit_out) - - !===================================================================== - - end subroutine bufrio_interface_write - - !======================================================================= - - ! SUBROUTINE: - - ! read_bufr_open.f90 - - ! DESCRIPTION: - - ! This subroutine opens the user specified BUFR file path and - ! assigns the open file unit to the local module variable unit_out. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified BUFR file path. - - !----------------------------------------------------------------------- - - subroutine read_bufr_open(filename) - - ! Define variables passed to routine - - character(len=500) :: filename - - !===================================================================== - - ! Define local variables - - open(unit_in,file=trim(adjustl(filename)),action='read',form= & - & 'unformatted',convert='big_endian') - - !===================================================================== - - end subroutine read_bufr_open - - !======================================================================= - - ! SUBROUTINE: - - ! read_write_bufr_open.f90 - - ! DESCRIPTION: - - ! This subroutine opens the user specified BUFR file path and - ! assigns the open file unit to the local module variable unit_out. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified BUFR file path. - - !----------------------------------------------------------------------- - - subroutine read_write_bufr_open(filename) - - ! Define variables passed to routine - - character(len=500) :: filename - - !===================================================================== - - ! Define local variables - - open(unit_in,file=trim(adjustl(filename)),form='unformatted', & - & action='readwrite',convert='big_endian') - - !===================================================================== - - end subroutine read_write_bufr_open - - !======================================================================= - - ! SUBROUTINE: - - ! write_bufr_tbl.f90 - - ! DESCRIPTION: - - ! This subroutine opens the user specified BUFR table and write the - ! respective BUFR table to the user specified BUFR file path. - - ! INPUT VARIABLES: - - ! * tablename; a FORTRAN character string specifying the full-path - ! to the file containing the BUFR table. - - !----------------------------------------------------------------------- - - subroutine write_bufr_table(tablename) - - ! Define variables passed to routine - - character(len=500) :: tablename - - !===================================================================== - - ! Define local variables - - open(unit_tbl,file = trim(adjustl(tablename)),action='read') - if(bufr_exist) call openbf(unit_out,'APN',unit_tbl) - if(.not. bufr_exist) call openbf(unit_out,'OUT',unit_tbl) - - !===================================================================== - - end subroutine write_bufr_table - - !======================================================================= - - ! SUBROUTINE: - - ! write_bufr_open.f90 - - ! DESCRIPTION: - - ! This subroutine opens the user specified BUFR file path and - ! assigns the open file unit to the local module variable unit_out. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified BUFR file path. - - !----------------------------------------------------------------------- - - subroutine write_bufr_open(filename) - - ! Define variables passed to routine - - character(len=500) :: filename - - !===================================================================== - - ! Define local variables - - open(unit_out,file=trim(adjustl(filename)),action='write',form= & - & 'unformatted',convert='big_endian') - - !===================================================================== - - end subroutine write_bufr_open - - !======================================================================= - -end module bufrio_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/constants_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/constants_interface.F90 deleted file mode 100644 index 8c1446225..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/constants_interface.F90 +++ /dev/null @@ -1,116 +0,0 @@ -module constants_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs_to_bufr :: constants_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: cp_mass - public :: deg2rad - public :: earth_omega - public :: grav - public :: grav_std - public :: pi - public :: rad2deg - public :: rd - public :: rd_over_cp_mass - public :: rearth_equator - public :: rv - - !----------------------------------------------------------------------- - - ! DESCRIPTION (alphabetized): - - ! * cp_mass; a FORTRAN 4-byte real value specifying the specific - ! heat capacity of water vapor at constant pressure; units are - ! Joules per kilogram per Kelvin. - - ! * deg2rad; a FORTRAN 4-byte real value specifying the mathematical - ! constant to convert from degrees to radians; unitless. - - ! * earth_omega; a FORTRAN 4-byte real value specifying the rotation - ! rate of the Earth; units are radians per second. - - ! * grav; a FORTRAN 4-byte real value containing the acceleration - ! due to gravity; units are meters per second per second. - - ! * grav_std; a FORTRAN 4-byte real value containing the standard - ! * gravity; units are meters per second per second. - - ! * pi; a FORTRAN 4-byte real value containing the (machine - ! precision truncated) mathematical constant for atan(-1.0); - ! unitless. - - ! * rad2deg; a FORTRAN 4-byte real value specifying the mathematical - ! constant to convert from radians to degrees; unitless. - - ! * rd; a FORTRAN 4-byte real value specifying the gas constant for - ! dry air; units are Joules per Kelvin per kilogram. - - ! * rd_over_cp_mass; a FORTRAN 4-byte real value designating the - ! ratio rd/cp_mass. - - ! * rearth_equator; a FORTRAN 4-byte real value specifying the Earth - ! equatorial radius; units are meters. - - ! * rv; a FORTRAN 4-byte real value specifying the gas constant for - ! water vapor; units are Joules per Kelvin per kilogram. - - !----------------------------------------------------------------------- - - ! Define local variables - - real(r_kind), parameter :: & - & cp_mass = 1004.67_r_kind - real(r_kind), parameter :: & - & earth_omega = 7.292115e-5_r_kind - real(r_kind), parameter :: & - & grav = 9.80665e0_r_kind - real(r_kind), parameter :: & - & grav_std = 9.80665e0_r_kind - real(r_kind), parameter :: & - & pi = acos(-1.0) - real(r_kind), parameter :: & - & deg2rad = pi/180.0_r_kind - real(r_kind), parameter :: & - & rad2deg = 1.0/deg2rad - real(r_kind), parameter :: & - & rd = 2.8705e2_r_kind - real(r_kind), parameter :: & - & rd_over_cp_mass = rd/cp_mass - real(r_kind), parameter :: & - & rearth_equator = 6.37813662e6_r_kind - real(r_kind), parameter :: & - & rv = 4.6150e2_r_kind - - !======================================================================= - -end module constants_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/diagnostics_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/diagnostics_interface.F90 deleted file mode 100644 index 7695ed300..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/diagnostics_interface.F90 +++ /dev/null @@ -1,153 +0,0 @@ -module diagnostics_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs_to_bufr :: diagnostics_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: diagnostics_time_start - public :: diagnostics_time_stop - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! diagnostics_time_start.f90 - - ! DESCRIPTION: - - ! This subroutine calls the intrinsic subroutine cpu_time and - ! defines the elapsed CPU time in seconds. - - ! INPUT VARIABLES: - - ! * time_start; a FORTRAN 4-byte real value. - - ! OUTPUT VARIABLES: - - ! * time_start; a FORTRAN 4-byte real value specifying the elapsed - ! CPU time; units are seconds. - - !----------------------------------------------------------------------- - - subroutine diagnostics_time_start(time_start) - - ! Define variables passed to routine - - real(r_kind) :: time_start - - !===================================================================== - - ! Define local variables - - call cpu_time(time_start) - - !===================================================================== - - end subroutine diagnostics_time_start - - !======================================================================= - - ! SUBROUTINE: - - ! diagnostics_time_stop.f90 - - ! DESCRIPTION: - - ! This subroutine computes the total time since the user specified - ! starting time and prints a message indicating the time in - ! accordance with the optional variables provided by the user. - - ! INPUT VARIABLES: - - ! * time_start; a FORTRAN 4-byte real specifying the value returned - ! by subroutine diagnostics_time_start.f90. - - ! OPTIONAL INPUT VARIABLES: - - ! * caller_name; a FORTRAN character string defining the calling - ! subroutine/function name/ - - !----------------------------------------------------------------------- - - subroutine diagnostics_time_stop(time_start,caller_name) - - ! Define variables passed to routine - - character(len=*), optional :: caller_name - real(r_kind) :: time_start - - ! Define variables computed within routine - - real(r_kind) :: time_stop - - !===================================================================== - - ! Define local variables - - call cpu_time(time_stop) - - ! Check local variable and proceed accordingly - - if(.not. present(caller_name)) then - - ! Define local variables - - write(6,500) (time_stop - time_start) - - end if ! if(.not. present(caller_name)) - - ! Check local variable and proceed accordingly - - if(present(caller_name)) then - - ! Define local variables - - write(6,501) trim(adjustl(caller_name)), (time_stop - time_start) - - end if ! if(present(caller_name) - - ! Define local variables - -500 format('Execution time: ', f13.5, ' seconds.') -501 format('Time spent in routine ', a, ': ', f13.5, ' seconds.') - - !===================================================================== - - end subroutine diagnostics_time_stop - - !======================================================================= - -end module diagnostics_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/fileio_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/fileio_interface.F90 deleted file mode 100644 index d0ca7a612..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/fileio_interface.F90 +++ /dev/null @@ -1,990 +0,0 @@ -module fileio_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: fileio_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use bufrio_interface - use json_interface - use kinds_interface - use namelist_interface - use netcdf - use netcdf_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: fileio_interface_read - public :: fileio_interface_write - public :: nfiles - public :: obs_filename - interface fileio_interface_read - module procedure read_bufr_info - module procedure read_convobserr - module procedure read_fcst_model - module procedure read_givtdruv - module procedure read_givtdruv_obs_filenames - module procedure read_hsa - module procedure read_nhcgtcm - module procedure read_obs_filenames - module procedure read_obs_flag_json - module procedure read_tcm - module procedure read_topogrid - end interface fileio_interface_read - interface fileio_interface_varinfo - end interface fileio_interface_varinfo - interface fileio_interface_write - end interface fileio_interface_write - - ! Define local variables - - character(len=500), dimension(:), allocatable :: obs_filename - integer :: nfiles - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! read_bufr_info.f90 - - ! DESCRIPTION: - - ! This subroutine parses a JSON formatted file and defines the BUFR - ! record attributes as specified by the user. - - ! INPUT VARIABLES: - - ! * bufr_info; a FORTRAN bufr_info_struct variable containing the - ! BUFR information JSON file path. - - ! OUTPUT VARIABLES: - - ! * bufr_info; a FORTRAN bufr_info_struct variable containing the - ! BUFR record attributes specified by the user. - - !----------------------------------------------------------------------- - - subroutine read_bufr_info(bufr_info) - - ! Define variables passed to routine - - type(bufr_info_struct) :: bufr_info - - !===================================================================== - - ! Define local variables - - call json_interface_read(bufr_info) - - !===================================================================== - - end subroutine read_bufr_info - - !======================================================================= - - ! SUBROUTINE: - - ! read_convobserr.f90 - - ! DESCRIPTION: - - ! This subroutine reads the user specified external file containing - ! the observation-type, to be written to the BUFR file, observation - ! error profiles (see the readme files accompanying this - ! repository). - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the external file containing the observation-type observation - ! error profiles. - - ! * grid; a FORTRAN error_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN error_struct variable containing the - ! observation-type observation error profiles. - - !----------------------------------------------------------------------- - - subroutine read_convobserr(filename,grid) - - ! Define variables passed to routine - - type(error_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=500) :: dummy - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - grid%nz = 0 - open(99,file=trim(adjustl(filename)),form='formatted') -1000 read(99,*,end=1001) dummy - grid%nz = grid%nz + 1 - goto 1000 -1001 continue - close(99) - call variable_interface_setup_struct(grid) - open(99,file=trim(adjustl(filename)),form='formatted') - - ! Loop through local variable - - do i = 1, grid%nz - - ! Define local variables - - read(99,*) grid%plev(i), grid%p(i), grid%t(i), grid%q(i), & - & grid%z(i), grid%uv(i) - - end do ! do i = 1, grid%nz - - ! Define local variables - - close(99) - - !===================================================================== - - end subroutine read_convobserr - - !======================================================================= - - ! SUBROUTINE: - - ! read_fcst_model.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a netcdf file containing forecast model - ! synthetic observations. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file containing the forecast model synthetic - ! observations. - - ! * grid; a FORTRAN fcst_model_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN fcst_model_struct variable containing the - ! forecast model file synthetic observation contents. - - !----------------------------------------------------------------------- - - subroutine read_fcst_model(filename,grid) - - ! Define variables passed to routine - - type(fcst_model_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=100) :: dimname - character(len=100) :: varname - - !===================================================================== - - ! Define local variables - - dimname = 'nobs' - call netcdf_interface_getdim(filename,dimname,grid%nobs) - dimname = 'nz' - call netcdf_interface_getdim(filename,dimname,grid%nz) - call variable_interface_setup_struct(grid) - varname = 'p' - call netcdf_interface_getvar(filename,varname,grid%p) - varname = 'q' - call netcdf_interface_getvar(filename,varname,grid%q) - varname = 't' - call netcdf_interface_getvar(filename,varname,grid%t) - varname = 'u' - call netcdf_interface_getvar(filename,varname,grid%u) - varname = 'v' - call netcdf_interface_getvar(filename,varname,grid%v) - varname = 'z' - call netcdf_interface_getvar(filename,varname,grid%z) - varname = 'lat' - call netcdf_interface_getvar(filename,varname,grid%lat) - varname = 'lon' - call netcdf_interface_getvar(filename,varname,grid%lon) - varname = 'lmsk' - call netcdf_interface_getvar(filename,varname,grid%lmsk) - varname = 'psfc' - call netcdf_interface_getvar(filename,varname,grid%psfc) - - !===================================================================== - - end subroutine read_fcst_model - - !======================================================================= - - ! SUBROUTINE: - - ! read_givtdruv.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a netcdf file containing National Oceanic - ! and Atmospheric Administration (NOAA) Atlantic Oceanographic and - ! Meteorological Laboratory (AOML) Hurricane Research Division (HRD) - ! GIV Tail-Doppler Radar (TDR) u- and v-wind observations. - - ! REFERENCE: - - ! ftp://ftp.aoml.noaa.gov/pub/hrd/gamache/realtime_netcdf/ - - ! NOTE: - - ! The files contained within the URL referenced above are appended - ! with the global attribute TIMESTAMP which denotes the time for - ! which the observations contained within the respective file are - ! valid; the addendum is performed via the HAFS workflow management - ! system scripts. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file containing the NOAA/AOML/HRD GIV-TDR u- and - ! v-wind observations. - - ! * grid; a FORTRAN givtdruv_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN givtdruv_struct variable containing the - ! NOAA/AOML/HRD GIV-TDR u- and v-wind observations. - - !----------------------------------------------------------------------- - - subroutine read_givtdruv(filename,grid) - - ! Define variables passed to routine - - type(givtdruv_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=100) :: attrname - character(len=100) :: dimname - character(len=100) :: varname - real(r_kind), dimension(:,:,:,:), allocatable :: u - real(r_kind), dimension(:,:,:,:), allocatable :: v - real(r_kind), dimension(:), allocatable :: lats - real(r_kind), dimension(:), allocatable :: level - real(r_kind), dimension(:), allocatable :: lons - integer :: ncoord - - ! Define counting variables - - integer :: i, j, k - - !===================================================================== - - ! Define local variables - - dimname = 'lons' - call netcdf_interface_getdim(filename,dimname,grid%nx) - dimname = 'lats' - call netcdf_interface_getdim(filename,dimname,grid%ny) - dimname = 'level' - call netcdf_interface_getdim(filename,dimname,grid%nz) - call variable_interface_setup_struct(grid) - - ! Allocate memory for local variables - - if(.not. allocated(u)) allocate(u(1,grid%nz,grid%ny,grid%nx)) - if(.not. allocated(v)) allocate(v(1,grid%nz,grid%ny,grid%nx)) - if(.not. allocated(lons)) allocate(lons(grid%nx)) - if(.not. allocated(lats)) allocate(lats(grid%ny)) - if(.not. allocated(level)) allocate(level(grid%nz)) - - ! Define local variables - - varname = 'U' - call netcdf_interface_getvar(filename,varname,u) - attrname = 'missing_value' - call netcdf_interface_getattr(filename,attrname,grid%msngvl,varname= & - & varname) - varname = 'V' - call netcdf_interface_getvar(filename,varname,v) - varname = 'lons' - call netcdf_interface_getvar(filename,varname,lons) - varname = 'lats' - call netcdf_interface_getvar(filename,varname,lats) - varname = 'level' - call netcdf_interface_getvar(filename,varname,level) - ncoord = 0 - - ! Loop through local variable - - do k = 1, grid%nz - - ! Loop through local variable - - do j = 1, grid%ny - - ! Loop through local variable - - do i = 1, grid%nx - - ! Define local variables - - ncoord = ncoord + 1 - grid%u(ncoord) = u(1,k,j,i) - grid%v(ncoord) = v(1,k,j,i) - grid%lon(ncoord) = lons(i) - grid%lat(ncoord) = lats(j) - grid%level(ncoord) = level(k) - - ! Check local variable and proceed accordingly - - if(level(k) .le. 0.0) then - - ! Define local variables - - grid%u(ncoord) = grid%msngvl - grid%v(ncoord) = grid%msngvl - - end if ! if(level(k) .le. 0.0) - - end do ! do i = 1, grid%nx - - end do ! do j = 1, grid%ny - - end do ! do k = 1, grid%nz - - ! Deallocate memory for local variables - - if(allocated(lons)) deallocate(lons) - if(allocated(lats)) deallocate(lats) - if(allocated(level)) deallocate(level) - - !===================================================================== - - end subroutine read_givtdruv - - !======================================================================= - - ! SUBROUTINE: - - ! read_givtdruv_obs_filenames.f90 - - ! DESCRIPTION: - - ! This subroutine reads an external file list containing G-IV - ! tail-Doppler radar (TDR) u- and v-wind observation files; the - ! respective file list also contains the timestamp string denoting - ! when the observations within the respective file are valid; the - ! format of the file is follows: - - ! - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string containing the list of - ! observation filename pathes. - - ! * grid; a FORTRAN array of FORTRAN givtdruv_struct variables. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN array of FORTRAN givtdruv_struct variables where - ! the timestamp attribute (timestamp) has been assigned in - ! accordance with the valid observation time specified within the - ! file. - - !----------------------------------------------------------------------- - - subroutine read_givtdruv_obs_filenames(filename,grid) - - ! Define variables passed to routine - - type(givtdruv_struct), dimension(:), allocatable :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=500) :: dummy - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - nfiles = 0 - open(99,file=trim(adjustl(filename)),form='formatted') -1000 read(99,*,end=1001) dummy - nfiles = nfiles + 1 - goto 1000 -1001 continue - close(99) - - ! Allocate memory for local variables - - if(.not. allocated(grid)) allocate(grid(nfiles)) - if(.not. allocated(obs_filename)) allocate(obs_filename(nfiles)) - - ! Define local variables - - open(99,file=trim(adjustl(filename)),form='formatted') - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - read(99,500) grid(i)%timestamp, obs_filename(i) - - end do ! do i = 1, nfiles - - ! Define local variables - - close(99) -500 format(a19,a500) - - !===================================================================== - - end subroutine read_givtdruv_obs_filenames - - !======================================================================= - - ! SUBROUTINE: - - ! read_hsa.f90 - - ! DESCRIPTION: - - ! This subroutine reads a National Oceanic and Atmospheric - ! Administration (NOAA) Atlantic Oceanographic and Meteorological - ! Laboratory (AOML) Hurricane Research Division (HRD) HRD Spline - ! Analysis (HSA) formatted observation files. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the HSA formatted file. - - ! * grid; a FORTRAN hsa_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN hsa_struct variable containing the HSA file - ! contents. - - !----------------------------------------------------------------------- - - subroutine read_hsa(filename,grid) - - ! Define variables passed to routine - - type(hsa_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - real(r_kind) :: dummy - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - grid%nz = 0 - open(99,file=trim(adjustl(filename)),form='formatted') -1000 read(99,*,end=1001) dummy - grid%nz = grid%nz + 1 - goto 1000 -1001 continue - close(99) - call variable_interface_setup_struct(grid) - open(99,file=trim(adjustl(filename)),form='formatted') - - ! Loop through local variable - - do i = 1, grid%nz - - ! Define local variables - - read(99,500,err=1002) grid%wx(i), grid%yymmdd(i), grid%gmt(i), & - & grid%lat(i), grid%lon(i), grid%p(i), grid%t(i), grid%rh(i), & - & grid%z(i), grid%u(i), grid%v(i), grid%tail(i) - - end do ! do i = 1, grid%nz - - ! Define local variables - - close(99) - return -1002 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(grid) - - ! Define local variables - - call variable_interface_setup_struct(grid) -500 format(i2,1x,f7.0,1x,i4,1x,2(f7.3,1x),3(f6.1,1x),f7.1,2(f6.1,1x),a4) - - !===================================================================== - - end subroutine read_hsa - - !======================================================================= - - ! SUBROUTINE: - - ! read_nhcgtcm.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a netcdf file, typically created by the - ! routine tc_synthetic_obs.exe, and defines the FORTRAN - ! nhcgtcm_struct variable attributes accordingly. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the NHC GTCM netcdf file. - - ! * grid; a FORTRAN nhcgtcm_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN nhcgtcm_struct variable containing the NHC GTCM - ! netcdf file contents. - - !----------------------------------------------------------------------- - - subroutine read_nhcgtcm(filename,grid) - - ! Define variables passed to routine - - type(nhcgtcm_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=100) :: dimname - character(len=100) :: varname - character(len=100) :: attrname - - !===================================================================== - - ! Define local variables - - dimname = 'nvals' - call netcdf_interface_getdim(filename,dimname,grid%nvals) - call variable_interface_setup_struct(grid) - varname = 'lon' - call netcdf_interface_getvar(filename,varname,grid%lon) - varname = 'lat' - call netcdf_interface_getvar(filename,varname,grid%lat) - varname = 'u10m' - call netcdf_interface_getvar(filename,varname,grid%u10m) - varname = 'v10m' - call netcdf_interface_getvar(filename,varname,grid%v10m) - attrname = 'analysis_date' - call netcdf_interface_getattr(filename,attrname,grid%analysis_date) - attrname = 'missing_data' - call netcdf_interface_getattr(filename,attrname,grid%spval) - - !===================================================================== - - end subroutine read_nhcgtcm - - !======================================================================= - - ! SUBROUTINE: - - ! read_obs_filenames.f90 - - ! DESCRIPTION: - - ! This subroutine defines the global variables 'nfiles' and - ! 'obs_filename' array. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string containing the list of - ! observation filename pathes. - - !----------------------------------------------------------------------- - - subroutine read_obs_filenames(filename) - - ! Define variables passed to routine - - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=500) :: dummy - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - nfiles = 0 - open(99,file=trim(adjustl(filename)),form='formatted') -1000 read(99,*,end=1001) dummy - nfiles = nfiles + 1 - goto 1000 -1001 continue - close(99) - - ! Allocate memory for local variables - - if(.not. allocated(obs_filename)) allocate(obs_filename(nfiles)) - - ! Define local variables - - open(99,file=trim(adjustl(filename)),form='formatted') - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - read(99,*) obs_filename(i) - - end do ! do i = 1, nfiles - - ! Define local variables - - close(99) - - !===================================================================== - - end subroutine read_obs_filenames - - !======================================================================= - - ! SUBROUTINE: - - ! read_obs_flag_json.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a JSON formatted file containing the user - ! specified observation flagging attributes and returns the - ! respective attributes within the FORTRAN obs_flag variable. - - ! INPUT VARIABLES: - - ! * obs_flag; a FORTRAN obs_flag_struct variable containing the - ! observation JSON vtable file path. - - ! OUTPUT VARIABLES: - - ! * obs_flag; a FORTRAN obs_flag_struct variable containing the - ! observation JSON vtable attributes. - - !----------------------------------------------------------------------- - - subroutine read_obs_flag_json(obs_flag) - - ! Define variables passed to routine - - type(obs_flag_struct) :: obs_flag - - !===================================================================== - - ! Define local variables - - call json_interface_read(obs_flag) - - !===================================================================== - - end subroutine read_obs_flag_json - - !======================================================================= - - ! SUBROUTINE: - - ! read_tcm.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a netcdf file, typically created by the - ! routine tc_synthetic_obs.exe, and defines the FORTRAN tcm_struct - ! variable attributes accordingly. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the TCM netcdf file. - - ! * grid; a FORTRAN tcm_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN tcm_struct variable containing the TCM netcdf - ! file contents. - - !----------------------------------------------------------------------- - - subroutine read_tcm(filename,grid) - - ! Define variables passed to routine - - type(tcm_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=100) :: dimname - character(len=100) :: varname - character(len=100) :: attrname - real(r_kind), dimension(:,:), allocatable :: var - - !===================================================================== - - ! Define local variables - - dimname = 'nx' - call netcdf_interface_getdim(filename,dimname,grid%nx) - dimname = 'ny' - call netcdf_interface_getdim(filename,dimname,grid%ny) - call variable_interface_setup_struct(grid) - - ! Allocate memory for local variables - - if(.not. allocated(var)) allocate(var(grid%nx,grid%ny)) - - ! Define local variables - - varname = 'longitude' - call netcdf_interface_getvar(filename,varname,var) - grid%lon = reshape(var,shape(grid%lon)) - varname = 'latitude' - call netcdf_interface_getvar(filename,varname,var) - grid%lat = reshape(var,shape(grid%lat)) - varname = 'sfcprs' - call netcdf_interface_getvar(filename,varname,var) - grid%psfc = reshape(var,shape(grid%psfc)) - varname = 'u' - call netcdf_interface_getvar(filename,varname,var) - grid%u = reshape(var,shape(grid%u)) - varname = 'v' - call netcdf_interface_getvar(filename,varname,var) - grid%v = reshape(var,shape(grid%v)) - - ! Deallocate memory for local variables - - if(allocated(var)) deallocate(var) - - ! Define local variables - - attrname = 'analysis_date' - call netcdf_interface_getattr(filename,attrname,grid%analysis_date) - attrname = 'missing_data' - call netcdf_interface_getattr(filename,attrname,grid%spval) - call netcdf_interface_close() - - !===================================================================== - - end subroutine read_tcm - - !======================================================================= - - ! SUBROUTINE: - - ! read_temis.f90 - - ! DESCRIPTION: - - ! This subroutine reads a netcdf file containing TEMIS topography - ! data within the user specified file. - - ! INPUT VARIABLES: - - ! * topogrid; a FORTRAN topogrid_struct variable. - - ! OUTPUT VARIABLES: - - ! * topogrid; a FORTRAN topogrid_struct variable containing the - ! TEMIS topography variable values from the user specified file.w - - !----------------------------------------------------------------------- - - subroutine read_temis(topogrid) - - ! Define variables passed to routine - - type(topogrid_struct) :: topogrid - - ! Define variables computed within routine - - character(len=500) :: filename - character(len=100) :: dimname - character(len=100) :: varname - real(r_kind), dimension(:,:), allocatable :: elevation - real(r_kind), dimension(:), allocatable :: latitude - real(r_kind), dimension(:), allocatable :: longitude - integer :: count - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - filename = topo_filepath - dimname = 'nlon' - call netcdf_interface_getdim(filename,dimname,topogrid%nx) - dimname = 'nlat' - call netcdf_interface_getdim(filename,dimname,topogrid%ny) - call variable_interface_setup_struct(topogrid) - - ! Allocate memory for local variables - - if(.not. allocated(elevation)) & - & allocate(elevation(topogrid%nx,topogrid%ny)) - if(.not. allocated(latitude)) & - & allocate(latitude(topogrid%ny)) - if(.not. allocated(longitude)) & - & allocate(longitude(topogrid%nx)) - - ! Define local variables - - varname = 'elevation' - call netcdf_interface_getvar(filename,varname,elevation) - varname = 'latitude' - call netcdf_interface_getvar(filename,varname,latitude) - varname = 'longitude' - call netcdf_interface_getvar(filename,varname,longitude) - count = 0 - - ! Loop through local variable - - do j = 1, topogrid%ny - - ! Loop through local variable - - do i = 1, topogrid%nx - - ! Define local variables - - count = count + 1 - topogrid%topo(count) = elevation(i,j) - topogrid%lat(count) = latitude(j) - topogrid%lon(count) = longitude(i) - - end do ! do i = 1, topogrid%nx - - end do ! do j = 1, topogrid%ny - - ! Deallocate memory for local variables - - if(allocated(elevation)) deallocate(elevation) - if(allocated(latitude)) deallocate(latitude) - if(allocated(longitude)) deallocate(longitude) - - ! Define local variables - - call netcdf_interface_close() - - !===================================================================== - - end subroutine read_temis - - !======================================================================= - - ! SUBROUTINE: - - ! read_topogrid.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a user specified file containing - ! topography information and defines and returns the FORTRAN - ! topogrid_struct variable. - - ! INPUT VARIABLES: - - ! * topogrid; a FORTRAN topogrid_struct variable. - - ! OUTPUT VARIABLES: - - ! * topogrid; a FORTRAN topogrid_struct variable containing the user - ! specified file topography information. - - !----------------------------------------------------------------------- - - subroutine read_topogrid(topogrid) - - ! Define variables passed to routine - - type(topogrid_struct) :: topogrid - - !===================================================================== - - ! Define local variables - - if(is_temis) call read_temis(topogrid) - - !===================================================================== - - end subroutine read_topogrid - - !======================================================================= - -end module fileio_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/interpolation_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/interpolation_interface.F90 deleted file mode 100644 index a8723eafa..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/interpolation_interface.F90 +++ /dev/null @@ -1,133 +0,0 @@ -module interpolation_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: interpolation_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use constants_interface - use kinds_interface - use namelist_interface - use slint - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: interpolation_interface_init - interface interpolation_interface_init - module procedure init_slint - end interface interpolation_interface_init - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! init_slint.f90 - - ! DESCRIPTION: - - ! This subroutine initializes and computes the remapping - ! coefficients and nearest neighbor locations using the geographical - ! locations passed using the source (src) and destination (dst) - ! grid_struct FORTRAN structures; all geographical locations are - ! assumed to be units of degrees. - - ! INPUT VARIABLES: - - ! * src_grid; a FORTRAN grid_struct variable containing the source - ! grid information; all geographical location units are degrees. - - ! * dst_grid; a FORTRAN grid_struct variable containing the - ! destination grid information; all geographical location units - ! are degrees. - - ! * remap_grid; a FORTRAN interp_xy_slint_struct variable. - - ! OUTPUT VARIABLES: - - ! * remap_grid; a FORTRAN interp_xy_slint_struct containing the - ! remapping coefficients and nearest neighbor indices determined - ! from the source and destination grid_struct FORTRAN structures. - - !----------------------------------------------------------------------- - - subroutine init_slint(src_grid,dst_grid,remap_grid) - - ! Define variables passed to routine - - type(grid_struct) :: src_grid - type(grid_struct) :: dst_grid - type(slint_struct) :: remap_grid - - ! Define variables computed within routine - - type(grid) :: slint_grid - real(r_kind), dimension(:,:), allocatable :: grid1 - real(r_kind), dimension(:,:), allocatable :: grid2 - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid1)) & - & allocate(grid1(src_grid%ncoords,2)) - if(.not. allocated(grid2)) & - & allocate(grid2(dst_grid%ncoords,2)) - - ! Define local variables - - grid1(:,1) = src_grid%lat*deg2rad - grid1(:,2) = src_grid%lon*deg2rad - grid2(:,1) = dst_grid%lat*deg2rad - grid2(:,2) = dst_grid%lon*deg2rad - - ! Compute local variables - - call slint_init_compute(grid1,src_grid%ncoords,grid2, & - & dst_grid%ncoords,slint_grid) - - ! Define local variables - - remap_grid%coeffs = slint_grid%coeffs - remap_grid%nn = slint_grid%nn - - ! Deallocate memory for local variables - - if(allocated(grid2)) deallocate(grid2) - if(allocated(grid1)) deallocate(grid1) - - !===================================================================== - - end subroutine init_slint - - !======================================================================= - -end module interpolation_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/json_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/json_interface.F90 deleted file mode 100644 index 57a850610..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/json_interface.F90 +++ /dev/null @@ -1,218 +0,0 @@ -module json_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: json_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use fson - use fson_value_m - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: json_interface_nrecs - public :: json_interface_read - interface json_interface_read - module procedure read_bufr_info - module procedure read_obs_flag - end interface json_interface_read - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! json_interface_nrecs.f90 - - ! DESCRIPTION: - - ! This subroutine defines the number of records within the external - ! JSON formatted file specified by the user using the FSON API - ! utilities. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! a JSON formatted file. - - !----------------------------------------------------------------------- - - subroutine json_interface_nrecs(filename,json_size) - - ! Define variables passed to routine - - character(len=500) :: filename - integer :: json_size - - ! Define variables computed within routine - - type(fson_value), pointer :: json_file - - !===================================================================== - - ! Define local variables - - json_file => fson_parse(trim(adjustl(filename))) - json_size = fson_value_count(json_file) - - !===================================================================== - - end subroutine json_interface_nrecs - - !======================================================================= - - ! SUBROUTINE: - - ! read_bufr_flag.f90 - - ! DESCRIPTION: - - ! This subroutine parses a JSON formatted file and defines the BUFR - ! record attributes as specified by the user. - - ! INPUT VARIABLES: - - ! * bufr_info; a FORTRAN bufr_info_struct variable. - - ! * filename; a FORTRAN character string specifying the full-path to - ! the user specified JSON formatted file containing the BUFR - ! record attributes. - - ! OUTPUT VARIABLES: - - ! * bufr_info; a FORTRAN bufr_info_struct variable containing the - ! BUFR record attributes specified by the user. - - !----------------------------------------------------------------------- - - subroutine read_bufr_info(bufr_info) - - ! Define variables passed to routine - - type(bufr_info_struct) :: bufr_info - character(len=500) :: filename - - ! Define variables computed within routine - - type(fson_value), pointer :: json_data - type(fson_value), pointer :: json_item - integer :: json_size - - !===================================================================== - - ! Define local variables - - json_data => fson_parse(bufr_info%filename) - json_item => fson_value_get(json_data,1) - call fson_get(json_item,'subset',bufr_info%subset) - call fson_get(json_item,'obs_type_mass',bufr_info%obs_type_mass) - call fson_get(json_item,'obs_type_wind',bufr_info%obs_type_wind) - call fson_destroy(json_data) - - !===================================================================== - - end subroutine read_bufr_info - - !======================================================================= - - ! SUBROUTINE: - - ! read_obs_flag.f90 - - ! DESCRIPTION: - - ! This subroutine parses a JSON formatted file and defines elements - ! of the obs_flag_struct variable necessary to parse the JSON - ! formatted variable table (vtable) specfied by the user. - - ! INPUT VARIABLES: - - ! * obs_flag; a FORTRAN obs_flag_struct variable containing the - ! observation JSON vtable file path. - - ! OUTPUT VARIABLES: - - ! * obs_flag; a FORTRAN obs_flag_struct variable containing the - ! observation JSON vtable attributes. - - !----------------------------------------------------------------------- - - subroutine read_obs_flag(obs_flag) - - ! Define variables passed to routine - - type(obs_flag_struct) :: obs_flag - - ! Define variables computed within routine - - type(fson_value), pointer :: json_data - type(fson_value), pointer :: json_item - integer :: json_size - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - call json_interface_nrecs(obs_flag%filename,json_size) - obs_flag%nflag = json_size - json_data => fson_parse(trim(adjustl(obs_flag%filename))) - call variable_interface_setup_struct(obs_flag) - - ! Loop through local variable - - do i = 1, json_size - - ! Define local variables - - json_item => fson_value_get(json_data,i) - call fson_get(json_item,'mneumonic',obs_flag%mneumonic(i)) - call fson_get(json_item,'subset',obs_flag%subset(i)) - call fson_get(json_item,'val',obs_flag%val(i)) - call fson_get(json_item,'obs_type',obs_flag%obs_type(i)) - - end do ! do i = 1, json_size - - ! Define local variables - - call fson_destroy(json_data) - - !===================================================================== - - end subroutine read_obs_flag - - !======================================================================= - -end module json_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/kinds_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/kinds_interface.F90 deleted file mode 100644 index 06f101748..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/kinds_interface.F90 +++ /dev/null @@ -1,119 +0,0 @@ -module kinds_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs_to_bufr :: kinds_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: default_integer - public :: default_real - public :: i_byte - public :: i_kind - public :: i_llong - public :: i_long - public :: i_short - public :: num_bytes_for_i_byte - public :: num_bytes_for_i_kind - public :: num_bytes_for_i_llong - public :: num_bytes_for_i_long - public :: num_bytes_for_i_short - public :: num_bytes_for_r_double - public :: num_bytes_for_r_quad - public :: num_bytes_for_r_kind - public :: num_bytes_for_r_single - public :: r_double - public :: r_kind - public :: r_quad - public :: r_single - - !----------------------------------------------------------------------- - - ! Define local variables - - integer, parameter :: & - & default_integer = 3 - integer, parameter :: & - & default_real = 1 - integer, parameter :: & - & llong_t = selected_int_kind(16) - integer, parameter :: & - & num_bytes_for_i_byte = 1 - integer, parameter :: & - & num_bytes_for_i_short = 2 - integer, parameter :: & - & num_bytes_for_i_long = 4 - integer, parameter :: & - & num_bytes_for_i_llong = 8 - integer, parameter :: & - & num_i_kinds = 4 - integer, dimension(num_i_kinds), parameter :: & - & integer_byte_sizes = & - & (/num_bytes_for_i_byte,num_bytes_for_i_short, & - & num_bytes_for_i_long,num_bytes_for_i_llong/) - integer, parameter :: & - & num_bytes_for_i_kind = integer_byte_sizes(default_integer) - integer, parameter :: & - & i_byte = selected_int_kind(1) - integer, parameter :: & - & i_short = selected_int_kind(4) - integer, parameter :: & - & i_long = selected_int_kind(8) - integer, parameter :: & - & i_llong = max(llong_t,i_long) - integer, dimension(num_i_kinds), parameter :: & - & integer_types = (/i_byte,i_short,i_long,i_llong/) - integer, parameter :: & - & i_kind = integer_byte_sizes(default_integer) - integer, parameter :: & - & num_r_kinds = 3 - integer, parameter :: & - & r_single = selected_real_kind(6) - integer, parameter :: & - & r_double = selected_real_kind(15) - integer, parameter :: & - & quad_t = selected_real_kind(20) - integer, parameter :: & - & r_quad = max(quad_t,r_double) - integer, parameter :: & - & num_bytes_for_r_single = 4 - integer, parameter :: & - & num_bytes_for_r_double = 8 - integer, parameter :: & - & num_bytes_for_r_quad = 16 - integer, dimension(num_r_kinds), parameter :: & - & real_kinds = (/r_single,r_double,r_quad/) - integer, dimension(num_r_kinds), parameter :: & - & real_byte_sizes = (/num_bytes_for_r_single, & - & num_bytes_for_r_double,num_bytes_for_r_quad/) - integer, parameter :: & - & r_kind = real_kinds(default_real) - integer, parameter :: & - & num_bytes_for_r_kind = real_byte_sizes(default_real) - - !======================================================================= - -end module kinds_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/main.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/main.F90 deleted file mode 100644 index bab234767..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/main.F90 +++ /dev/null @@ -1,48 +0,0 @@ -program obs_to_bufr_main - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! obs_to_bufr :: obs_to_bufr_main - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use obs_to_bufr_interface - - ! Define interfaces and attributes for module routines - - implicit none - - !======================================================================= - - ! Compute local variables - - call obs_to_bufr() - - !======================================================================= - -end program obs_to_bufr_main diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/math_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/math_methods_interface.F90 deleted file mode 100644 index 08dbaf682..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/math_methods_interface.F90 +++ /dev/null @@ -1,339 +0,0 @@ -module math_methods_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: math_methods_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use constants_interface - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: math_methods_sort_array - public :: math_methods_spline_interp - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_remove_duplicates.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a FORTRAN spline_struct variable and - ! removes duplicate values from the independent variable array. - - ! INPUT VARIABLES: - - ! * grid_in; a FORTRAN spline_struct variable containing possible - ! duplicate values within the independent variable array, xa. - - ! * grid_out; a FORTRAN spline_struct variable to contain the - ! ingested spline_struct variable grid_in, but devoid of duplicate - ! values. - - ! OUTPUT VARIABLES: - - ! * grid_out; a FORTRAN spline_struct variable, initialized as - ! grid_in but no longer containing duplicate values within the - ! independent variable array, xa. - - !----------------------------------------------------------------------- - - subroutine math_methods_remove_duplicates(grid_in,grid_out) - - ! Define variables passed to routine - - type(spline_struct) :: grid_in - type(spline_struct) :: grid_out - - ! Define variables computed within routine - - logical, dimension(:), allocatable :: mask - integer :: num - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(mask)) allocate(mask(grid_in%n)) - - ! Define local variables - - mask = .false. - - ! Loop through local variable - - do i = 1, grid_in%n - - ! Define local variables - - num = count(grid_in%xa(i)==grid_in%xa) - - ! Check local variable and proceed accordingly - - if(num == 1) then - - ! Define local variables - - mask(i) = .true. - - else ! if(num == 1) - - ! Check local variable and proceed accordingly - - if(.not. any(grid_in%xa(i)==grid_in%xa .and. mask)) then - - ! Define local variables - - mask(i) = .true. - - end if ! if(.not. any(grid_in%xa(i)==grid_in%xa .and. mask)) - - end if ! if(num == 1) - - end do ! do i = 1, grid_in%n - - ! Define local variables - - grid_out%n = count(mask) - call variable_interface_setup_struct(grid_out) - grid_out%xa = pack(grid_in%xa,mask) - grid_out%ya = pack(grid_in%ya,mask) - - ! Deallocate memory for local variables - - if(allocated(mask)) deallocate(mask) - - !===================================================================== - - end subroutine math_methods_remove_duplicates - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_sort_array.f90 - - ! DESCRIPTION: - - ! This subroutine implements the SLATEC ssort routine to sort a - ! dependent array (ya) relative to a sorted independent array (xa); - ! the arrays may be sorted in either the ascending or descending - ! direction. - - ! REFERENCES: - - ! Singleton, R.C., 1969. Algorithm 347: an efficient algorithm for - ! sorting with minimal storage [M1]. Communications of the ACM, - ! 12(3), pp.185-186. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct containing the independent (xa) - ! and dependent (ya) variable arrays to be sorted. - - ! * ascend; a FORTRAN logical variable specifying whether the arrays - ! are to be sorted in the ascending direction. - - ! * descend; a FORTRAN logical variable specifying whether the - ! arrays are to be sorted in the descending direction. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct containing the sorted independent - ! (xa) and dependent (ya) variable arrays. - - !----------------------------------------------------------------------- - - subroutine math_methods_sort_array(grid,ascend,descend) - - ! Define variables passed to routine - - type(spline_struct) :: grid - logical :: ascend - logical :: descend - - ! Define variables computed within routine - - real(r_kind), dimension(:), allocatable :: xa - real(r_kind), dimension(:), allocatable :: ya - integer :: kflag - integer :: n - - !===================================================================== - - ! Check local variable and proceed accordingly - - if(ascend) kflag = 2 - if(descend) kflag = -2 - - ! Define local variables - - n = grid%n - - ! Check local variable and proceed accordingly - - if(n .ge. 2) then - - ! Allocate memory for local variables - - if(.not. allocated(xa)) allocate(xa(n)) - if(.not. allocated(ya)) allocate(ya(n)) - - ! Define local variables - - xa = grid%xa - ya = grid%ya - call ssort(xa,ya,n,kflag) - grid%xa = xa - grid%ya = ya - - ! Deallocate memory for local variables - - if(allocated(xa)) deallocate(xa) - if(allocated(ya)) deallocate(ya) - - end if ! if(n .ge. 2) - - !===================================================================== - - end subroutine math_methods_sort_array - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_spline_interp.f90 - - ! DESCRIPTION: - - ! This subroutine interpolates, using cubic splines, to find the - ! value of a variable at a location specified by the user; this - ! subroutine implements the sort2 subroutine of SLATEC and the - ! spline_cubic_set and spline_cubic_val subroutines of SPLINE. - - ! REFERENCES: - - ! de Boor, C., 1978: A practical guide to splines. Springer-Verlag, - ! 346pp. - - ! https://people.sc.fsu.edu/~jburkardt/f_src/spline/spline.html - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct containing the location (xa) and - ! variable (ya) arrays as well as the interpolation location (x). - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct containing the interpolated value - ! (y). - - !----------------------------------------------------------------------- - - subroutine math_methods_spline_interp(grid) - - ! Define variables passed to routine - - type(spline_struct) :: grid - - ! Define variables computed within routine - - type(spline_struct) :: gridl - real(r_double), dimension(:), allocatable :: xa - real(r_double), dimension(:), allocatable :: ya - real(r_double), dimension(:), allocatable :: y2a - real(r_double) :: yp - real(r_double) :: ypp - real(r_double) :: yp1 - real(r_double) :: ypn - real(r_double) :: x - real(r_double) :: y - integer :: n - - !===================================================================== - - ! Define local variables - - call math_methods_remove_duplicates(grid,gridl) - x = dble(grid%x) - n = gridl%n - - ! Allocate memory for local variables - - if(.not. allocated(xa)) allocate(xa(n)) - if(.not. allocated(ya)) allocate(ya(n)) - if(.not. allocated(y2a)) allocate(y2a(n)) - - ! Check local variable and proceed accordingly - - if(gridl%n .ge. 2) then - - ! Define local variables - - call math_methods_sort_array(gridl,.true.,.false.) - yp1 = dble(0.0) - ypn = dble(0.0) - xa = dble(gridl%xa) - ya = dble(gridl%ya) - - ! Compute local variables - - call spline_cubic_set(n,xa(1:n),ya(1:n),3,yp1,3,ypn,y2a) - call spline_cubic_val(n,xa(1:n),ya(1:n),y2a(1:n),x,y,yp,ypp) - - end if ! if(gridl%n .ge. 2) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(gridl) - if(allocated(xa)) deallocate(xa) - if(allocated(ya)) deallocate(ya) - if(allocated(y2a)) deallocate(y2a) - - ! Define local variables - - grid%y = real(y) - - !===================================================================== - - end subroutine math_methods_spline_interp - - !======================================================================= - -end module math_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/meteo_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/meteo_methods_interface.F90 deleted file mode 100644 index 19a736d92..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/meteo_methods_interface.F90 +++ /dev/null @@ -1,164 +0,0 @@ -module meteo_methods_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs_to_bufr :: meteo_methods_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use constants_interface - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: meteo_methods_spechumd - public :: meteo_methods_wvmxrt - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_spechumd.f90 - - ! DESCRIPTION: - - ! This subroutine computes the specific humidity value. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the pressure - ! (p; Pascals), the temperature (t; Kelvin) and relative humidity - ! (rh; percentage) values. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the computed - ! specific humidity value (q; kilograms per kilograms). - - !----------------------------------------------------------------------- - - subroutine meteo_methods_spechumd(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - !===================================================================== - - ! Compute local variables - - call meteo_methods_wvmxrt(grid) - grid%q = grid%wvmxrt/(dble(1.0) + grid%wvmxrt) - - !===================================================================== - - end subroutine meteo_methods_spechumd - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_wvmxrt.f90 - - ! DESCRIPTION: - - ! This subroutine computes the water vapor mixing ratio value. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the pressure - ! (p; Pascals), the temperature (t; Kelvin) and relative humidity - ! (rh; percentage) values. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the computed - ! water vapor mixing ratio value (wvmxrt; kilograms per - ! kilograms). - - !----------------------------------------------------------------------- - - subroutine meteo_methods_wvmxrt(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - ! Define variables computed within routine - - real(r_double) :: eps - real(r_double) :: es - real(r_double) :: es0 - real(r_double) :: svp1 - real(r_double) :: svp2 - real(r_double) :: svp3 - real(r_double) :: svpt0 - - !===================================================================== - - ! Define local variables - - es0 = dble(6.1121) - eps = dble(0.622) - svp1 = dble(0.6112) - svp2 = dble(17.67) - svp3 = dble(29.62) - svpt0 = dble(273.15) - grid%wvmxrt = dble(spval) - - ! Compute local variables - - es = dble(0.01)*grid%rh*svp1*dble(10.0)*exp(svp2*(grid%t - svpt0)/ & - & (grid%t - svp3)) - - ! Check local variable and proceed accordingly - - if(es .ge. grid%p/dble(100.0)) then - - ! Define local variables - - grid%wvmxrt = dble(1.e-6) - - else ! if(es .ge. grid%p/dble(100.0)) - - ! Define local variables - - grid%wvmxrt = max((eps*es)/(grid%p/dble(100.0) - es),dble(1.e-6)) - - end if ! if(es .ge. grid%p(i)/dble(100.0)) - - !===================================================================== - - end subroutine meteo_methods_wvmxrt - - !======================================================================= - -end module meteo_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/namelist_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/namelist_interface.F90 deleted file mode 100644 index 0df2667ab..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/namelist_interface.F90 +++ /dev/null @@ -1,359 +0,0 @@ -module namelist_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: namelist_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - - !----------------------------------------------------------------------- - - ! DESCRIPTION (alphabetized): - - ! * analdate; a FORTRAN character string specifying the analysis - ! date about which to define the observation times; formatted as, - ! assuming UNIX convention, ccyy-mm-dd_HH:MM:SS. - - ! * bufr_filepath; a FORTRAN character string specifying the - ! full-path to the BUFR file to be written (or appended) to. - - ! * bufr_tblpath; a FORTRAN character string specifying the - ! full-path to the external file containing the BUFR table to be - ! written (or appended) to the output BUFR file. error(s) for the - ! respective observation type. - - ! * datapath; a FORTRAN character string specifying the full-path to - ! the directory to contain output files written by the respective - ! routines. - - ! * debug; a FORTRAN logical value specifying whether to include - ! debug information during execution. - - ! * givtdruv_bufr_info_filepath; a FORTRAN character string - ! specifying the full-path tot he external file containing the - ! BUFR information for the National Oceanic and Atmospheric - ! Administration (NOAA) Atlantic Oceanographic and Meteorological - ! Laboratory (AOML) Hurricane Research Division (HRD) GIV-TDR u- - ! and v-winds observation option. - - ! * givtdruv_obs_filepath; a FORTRAN character string specifying the - ! full-path to the external file containing a list of National - ! Oceanic and Atmospheric Administration (NOAA) Atlantic - ! Oceanographic and Meteorological Laboratory (AOML) Hurricane - ! Research Division (HRD) GIV-TDR u- and v-wind observation files - ! to process. - - ! * hsa_bufr_info_filepath; a FORTRAN character string specifying - ! the full-path tot he external file containing the BUFR - ! information for the HSA observation option. - - ! * hsa_obs_filepath; a FORTRAN character string specifying the - ! full-path to the external file containing a list of - ! HSA-formatted observation files to process. - - ! * is_givtdruv; a FORTRAN logical value specifying whether the - ! input data type is National Oceanic and Atmospheric - ! Administration (NOAA) Atlantic Oceanographic and Meteorological - ! Laboratory (AOML) Hurricane Research Division (HRD) GIV-TDR u- - ! and v-wind observations post-processed to netcdf files. - - ! * is_hsa; a FORTRAN logical value specifying whether the input - ! data type is National Oceanic and Atmospheric Administration - ! (NOAA) Atlantic Oceanographic and Meteorological Laboratory - ! (AOML) Hurricane Research Division (HRD) spline analysis (HSA) - ! format. - - ! * is_nhcgtcm; a FORTRAN logical value specifying whether the input - ! data type is National Hurricane Center (NHC) Gridded Tropical - ! Cyclone Model (GTCM) wind speed values. - - ! * is_tcm; a FORTRAN logical value specifying whether the input - ! data type is tropical cyclone (TC) model (TCM) (e.g., a - ! parameterized wind field model) output surface pressure and wind - ! values. - - ! * is_temis; a FORTRAN logical value specifying whether the - ! topography data is derived from Tropospheric Emission Monitoring - ! Internet Service (TEMIS) data. - - ! * intrp_obserr; a FORTRAN logical value specifying whether to - ! interpolate the user specified errors to the isobaric levels of - ! the respective observations. - - ! * mask_land; a FORTRAN logical value specifying whether to apply a - ! land-mask for observation values (i.e., all observations - ! occuring over non-zero topography are masked out -- not written - ! as a BUFR record). - - ! * mask_ocean; a FORTRAN logical value specifying whether to apply - ! a ocean-mask for observation values (i.e., all observations - ! occuring over ocean are masked out -- not written as a BUFR - ! record). - - ! * nhcgtcm_bufr_info_filepath; a FORTRAN character string - ! specifying the full-path tot he external file containing the - ! BUFR information for the NHC GTCM observation option. - - ! * nhcgtcm_obs_filepath; a FORTRAN character string specifying the - ! full-path to the external file containing a list of NHC GTCM - ! formatted observation files to process. - - ! * obserr_filepath; a FORTRAN character string specifying the - ! full-path to the external file containing the respective - ! observation-type errors; see the README files accompanying the - ! software package. - - ! * obs_flag; a FORTRAN logical value specifying whether to flag - ! specific observations (see obs_flag_json_vtable) within a user - ! specified BUFR file. - - ! * tcm_bufr_info_filepath; a FORTRAN character string specifying - ! the full-path tot he external file containing the BUFR - ! information for the TCM observation option. - - ! * tcm_obs_filepath; a FORTRAN character string specifying the - ! full-path to the external file containing a list of TCM - ! formatted observation files to process. - - ! * topo_filepath; a FORTRAN character string specifying the - ! full-path to the external file containing topography data (used - ! for the land- and ocean-mask options). - - !----------------------------------------------------------------------- - - ! Define local variables - - character(len=500) :: & - & bufr_filepath = 'NOT USED' - character(len=500) :: & - & bufr_tblpath = 'NOT USED' - character(len=500) :: & - & datapath = './' - character(len=500) :: & - & fcst_model_bufr_info_filepath = 'NOT USED' - character(len=500) :: & - & fcst_model_filepath = 'NOT USED' - character(len=500) :: & - & givtdruv_bufr_info_filepath = 'NOT USED' - character(len=500) :: & - & givtdruv_obs_filepath = 'NOT USED' - character(len=500) :: & - & hsa_bufr_info_filepath = 'NOT USED' - character(len=500) :: & - & hsa_obs_filepath = 'NOT USED' - character(len=500) :: & - & hsa_obserr_filepath = 'NOT USED' - character(len=500) :: & - & nhcgtcm_bufr_info_filepath = 'NOT USED' - character(len=500) :: & - & nhcgtcm_obs_filepath = 'NOT USED' - character(len=500) :: & - & obs_flag_json_vtable = 'NOT USED' - character(len=500) :: & - & tcm_bufr_info_filepath = 'NOT USED' - character(len=500) :: & - & tcm_obs_filepath = 'NOT USED' - character(len=500) :: & - & topo_filepath = 'NOT USED' - character(len=19) :: & - & analdate = '2000-01-01_00:00:00' - logical :: & - & debug = .false. - logical :: & - & hsa_intrp_obserr = .false. - logical :: & - & is_fcstmdl = .false. - logical :: & - & is_givtdruv = .false. - logical :: & - & is_hsa = .false. - logical :: & - & is_nhcgtcm = .false. - logical :: & - & is_tcm = .false. - logical :: & - & is_temis = .false. - logical :: & - & mask_land = .false. - logical :: & - & mask_ocean = .false. - logical :: & - & obs_flag = .false. - namelist /share/ analdate, datapath, debug, is_fcstmdl, & - & is_givtdruv, is_hsa, is_nhcgtcm, is_tcm, obs_flag - namelist /bufr/ bufr_filepath, bufr_tblpath - namelist /fcstmdl/ fcst_model_bufr_info_filepath, & - & fcst_model_filepath - namelist /flag/ obs_flag_json_vtable - namelist /givtdruv/ givtdruv_bufr_info_filepath, & - & givtdruv_obs_filepath - namelist /hsa/ hsa_bufr_info_filepath, hsa_intrp_obserr, & - & hsa_obs_filepath, hsa_obserr_filepath - namelist /nhcgtcm/ nhcgtcm_bufr_info_filepath, nhcgtcm_obs_filepath - namelist /tcm/ tcm_bufr_info_filepath, tcm_obs_filepath - namelist /topo/ is_temis, mask_land, mask_ocean, topo_filepath - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! namelist.f90 - - ! DESCRIPTION: - - ! This subroutine acts as the interface to the namelist file, - ! provided as 'obs-to-bufr.input' by the user. - - !----------------------------------------------------------------------- - - subroutine namelist() - - ! Define variables computed within routine - - character(len=500) :: nml_filename - logical :: is_it_there - integer :: unit_nml - - !===================================================================== - - ! Define local variables - - nml_filename = './obs-to-bufr.input' - unit_nml = 9 - is_it_there = .false. - inquire(file = trim(adjustl(nml_filename)),exist = is_it_there) - - ! Check local variable and proceed accordingly - - if(is_it_there) then - - ! Define local variables - - open(file = trim(adjustl(nml_filename)), & - unit = unit_nml , & - status = 'old' , & - form = 'formatted' , & - action = 'read') - read(unit_nml,NML = share) - read(unit_nml,NML = bufr) - read(unit_nml,NML = fcstmdl) - read(unit_nml,NML = flag) - read(unit_nml,NML = givtdruv) - read(unit_nml,NML = hsa) - read(unit_nml,NML = nhcgtcm) - read(unit_nml,NML = tcm) - read(unit_nml,NML = topo) - close(unit_nml) - - else ! if(is_it_there) - - ! Define local variables - - write(6,500) - stop - - end if ! if(is_it_there) - - ! Define local variables - - write(6,*) '&SHARE' - write(6,*) 'DATAPATH = ', & - & trim(adjustl(datapath)) - write(6,*) 'DEBUG = ', debug - write(6,*) 'ANALDATE = ', analdate - write(6,*) 'IS_GIVTDRUV = ', is_givtdruv - write(6,*) 'IS_HSA = ', is_hsa - write(6,*) 'IS_NHCGTCM = ', is_nhcgtcm - write(6,*) 'IS_TCM = ', is_tcm - write(6,*) '/' - write(6,*) '&BUFR' - write(6,*) 'BUFR_FILEPATH = ', & - & trim(adjustl(bufr_filepath)) - write(6,*) 'BUFR_TBLPATH = ', & - & trim(adjustl(bufr_tblpath)) - write(6,*) '/' - write(6,*) '&FCSTMDL' - write(6,*) 'FCST_MODEL_BUFR_INFO_FILEPATH = ', & - & trim(adjustl(fcst_model_bufr_info_filepath)) - write(6,*) 'FCST_MODEL_FILEPATH = ', & - & trim(adjustl(fcst_model_filepath)) - write(6,*) '/' - write(6,*) '&FLAG' - write(6,*) 'OBS_FLAG_JSON_VTABLE = ', & - & trim(adjustl(obs_flag_json_vtable)) - write(6,*) '/' - write(6,*) '&GIVTDRUV' - write(6,*) 'GIVTDRUV_BUFR_INFO_FILEPATH = ', & - & trim(adjustl(givtdruv_bufr_info_filepath)) - write(6,*) 'GIVTDRUV_OBS_FILEPATH = ', & - & trim(adjustl(givtdruv_obs_filepath)) - write(6,*) '&HSA' - write(6,*) 'HSA_BUFR_INFO_FILEPATH = ', & - & trim(adjustl(hsa_bufr_info_filepath)) - write(6,*) 'HSA_INTRP_OBSERR = ', hsa_intrp_obserr - write(6,*) 'HSA_OBS_FILEPATH = ', & - & trim(adjustl(hsa_obs_filepath)) - write(6,*) 'HSA_OBSERR_FILEPATH = ', & - & trim(adjustl(hsa_obserr_filepath)) - write(6,*) '/' - write(6,*) '&NHCGTCM' - write(6,*) 'NHCGTCM_BUFR_INFO_FILEPATH = ', & - & trim(adjustl(nhcgtcm_bufr_info_filepath)) - write(6,*) 'NHCGTCM_OBS_FILEPATH = ', & - & trim(adjustl(nhcgtcm_obs_filepath)) - write(6,*) '/' - write(6,*) '&TCM' - write(6,*) 'TCM_BUFR_INFO_FILEPATH = ', & - & trim(adjustl(tcm_bufr_info_filepath)) - write(6,*) 'TCM_OBS_FILEPATH = ', & - & trim(adjustl(tcm_obs_filepath)) - write(6,*) '/' - write(6,*) '&TOPO' - write(6,*) 'IS_TEMIS = ', is_temis - write(6,*) 'MASK_LAND = ', mask_land - write(6,*) 'MASK_OCEAN = ', mask_ocean - write(6,*) 'TOPO_FILEPATH = ', & - & trim(adjustl(topo_filepath)) - write(6,*) '/' -500 format('NAMELISTPARAMS: obs-to-bufr.input not found in the ', & - & 'current working directory. ABORTING!!!!') - - !===================================================================== - - end subroutine namelist - - !======================================================================= - -end module namelist_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/netcdf_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/netcdf_interface.F90 deleted file mode 100644 index f584517d6..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/netcdf_interface.F90 +++ /dev/null @@ -1,666 +0,0 @@ -module netcdf_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: netcdf_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use netcdf - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: ncdimid - public :: ncfileid - public :: ncstatus - public :: ncvarid - public :: netcdf_interface_close - public :: netcdf_interface_getattr - public :: netcdf_interface_getdim - public :: netcdf_interface_getvar - public :: netcdf_interface_open - interface netcdf_interface_getattr - module procedure getattr_char - module procedure getattr_real - end interface netcdf_interface_getattr - interface netcdf_interface_getvar - module procedure getvar_real_1d - module procedure getvar_real_2d - module procedure getvar_real_3d - module procedure getvar_real_4d - end interface netcdf_interface_getvar - - ! Define local variables - - integer :: ncdimid - integer :: ncfileid - integer :: ncstatus - integer :: ncvarid - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! getattr_char.f90 - - ! DESCRIPTION: - - ! This subroutine retrieves a character attribute from a netcdf - ! file. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * attrname; a FORTRAN character string specifying the netcdf - ! attribute. - - ! * var; a FORTRAN character string to contain the netcdf attribute - ! value. - - ! OPTIONAL INPUT VARIABLES: - - ! * varname; a FORTRAN character string specifying the netcdf - ! variable API key; if not present, a global netcdf attribute is - ! assumed. - - ! OUTPUT VARIABLES: - - ! * var; a FORTRAN character string specifying the netcdf attribute - ! value. - - !----------------------------------------------------------------------- - - subroutine getattr_char(filename,attrname,var,varname) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: attrname - character(len=100), optional :: varname - character(len=*) :: var - - !===================================================================== - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - - ! Check local variable and proceed accordingly - - if(present(varname)) then - - ! Define local variables - - ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) - ncstatus = nf90_get_att(ncfileid,ncvarid,trim(adjustl(attrname)), & - & var) - - else ! if(present(varname)) - - ! Define local variables - - ncstatus = nf90_get_att(ncfileid,nf90_global, & - & trim(adjustl(attrname)),var) - - end if ! if(present(varname)) - - ! Define local variables - - call netcdf_interface_close() - - !===================================================================== - - end subroutine getattr_char - - !======================================================================= - - ! SUBROUTINE: - - ! getattr_real.f90 - - ! DESCRIPTION: - - ! This subroutine retrieves a 4-byte real-valued attribute from a - ! netcdf file. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * attrname; a FORTRAN character string specifying the netcdf - ! attribute. - - ! * var; a FORTRAN 4-byte real-valued variable to contain the netcdf - ! attribute value. - - ! OPTIONAL INPUT VARIABLES: - - ! * varname; a FORTRAN character string specifying the netcdf - ! variable API key; if not present, a global netcdf attribute is - ! assumed. - - ! OUTPUT VARIABLES: - - ! * var; a FORTRAN 4-byte real-valued variable specifying the netcdf - ! attribute value. - - !----------------------------------------------------------------------- - - subroutine getattr_real(filename,attrname,var,varname) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: attrname - character(len=100), optional :: varname - real(r_kind) :: var - - !===================================================================== - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - - ! Check local variable and proceed accordingly - - if(present(varname)) then - - ! Define local variables - - ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) - ncstatus = nf90_get_att(ncfileid,ncvarid,trim(adjustl(attrname)), & - & var) - - else ! if(present(varname)) - - ! Define local variables - - ncstatus = nf90_get_att(ncfileid,nf90_global, & - & trim(adjustl(attrname)),var) - - end if ! if(present(varname)) - - ! Define local variables - - call netcdf_interface_close() - - !===================================================================== - - end subroutine getattr_real - - !======================================================================= - - ! SUBROUTINE: - - ! getvar_real_1d.f90 - - ! DESCRIPTION: - - ! This subroutine reads a 1-dimensional variable from a user - ! specified netcdf file specified by the user supplied netcdf API - ! key. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * varname; a FORTRAN character string specifying the netcdf - ! variable API key. - - ! * var; a FORTRAN 1-dimensional 4-byte precision variable array to - ! contain the contents of the user specified netcdf variable. - - ! OUTPUT VARIABLES: - - ! * var; a FORTRAN 1-dimensional 4-byte precision variable array - ! containing the contents of the user specified netcdf variable. - - !----------------------------------------------------------------------- - - subroutine getvar_real_1d(filename,varname,var) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: varname - real(r_kind) :: var(:) - - ! Define variables computed within routine - - real(r_kind), dimension(:), allocatable :: workgrid - integer :: d1 - - !===================================================================== - - ! Define local variables - - d1 = size(var(:)) - - ! Allocate memory for local variables - - if(.not. allocated(workgrid)) allocate(workgrid(d1)) - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) - ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) - var = workgrid - call netcdf_interface_close() - - ! Deallocate memory for local variables - - if(allocated(workgrid)) deallocate(workgrid) - - !===================================================================== - - end subroutine getvar_real_1d - - !======================================================================= - - ! SUBROUTINE: - - ! getvar_real_2d.f90 - - ! DESCRIPTION: - - ! This subroutine reads a 2-dimensional variable from a user - ! specified netcdf file specified by the user supplied netcdf API - ! key. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * varname; a FORTRAN character string specifying the netcdf - ! variable API key. - - ! * var; a FORTRAN 2-dimensional 4-byte precision variable array to - ! contain the contents of the user specified netcdf variable. - - ! OUTPUT VARIABLES: - - ! * var; a FORTRAN 2-dimensional 4-byte precision variable array - ! containing the contents of the user specified netcdf variable. - - !----------------------------------------------------------------------- - - subroutine getvar_real_2d(filename,varname,var) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: varname - real(r_kind) :: var(:,:) - - ! Define variables computed within routine - - real(r_kind), dimension(:,:), allocatable :: workgrid - integer :: d1 - integer :: d2 - - !===================================================================== - - ! Define local variables - - d1 = size(var(:,1)) - d2 = size(var(1,:)) - - ! Allocate memory for local variables - - if(.not. allocated(workgrid)) allocate(workgrid(d1,d2)) - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) - ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) - var = workgrid - call netcdf_interface_close() - - ! Deallocate memory for local variables - - if(allocated(workgrid)) deallocate(workgrid) - - !===================================================================== - - end subroutine getvar_real_2d - - !======================================================================= - - ! SUBROUTINE: - - ! getvar_real_3d.f90 - - ! DESCRIPTION: - - ! This subroutine reads a 3-dimensional variable from a user - ! specified netcdf file specified by the user supplied netcdf API - ! key. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * varname; a FORTRAN character string specifying the netcdf - ! variable API key. - - ! * var; a FORTRAN 3-dimensional 4-byte precision variable array to - ! contain the contents of the user specified netcdf variable. - - ! OUTPUT VARIABLES: - - ! * var; a FORTRAN 3-dimensional 4-byte precision variable array - ! containing the contents of the user specified netcdf variable. - - !----------------------------------------------------------------------- - - subroutine getvar_real_3d(filename,varname,var) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: varname - real(r_kind) :: var(:,:,:) - - ! Define variables computed within routine - - real(r_kind), dimension(:,:,:), allocatable :: workgrid - integer :: d1 - integer :: d2 - integer :: d3 - - !===================================================================== - - ! Define local variables - - d1 = size(var(:,1,1)) - d2 = size(var(1,:,1)) - d3 = size(var(1,1,:)) - - ! Allocate memory for local variables - - if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3)) - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) - ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) - var = workgrid - call netcdf_interface_close() - - ! Deallocate memory for local variables - - if(allocated(workgrid)) deallocate(workgrid) - - !===================================================================== - - end subroutine getvar_real_3d - - !======================================================================= - - ! SUBROUTINE: - - ! getvar_real_4d.f90 - - ! DESCRIPTION: - - ! This subroutine reads a 4-dimensional variable from a user - ! specified netcdf file specified by the user supplied netcdf API - ! key. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * varname; a FORTRAN character string specifying the netcdf - ! variable API key. - - ! * var; a FORTRAN 4-dimensional 4-byte precision variable array to - ! contain the contents of the user specified netcdf variable. - - ! OUTPUT VARIABLES: - - ! * var; a FORTRAN 4-dimensional 4-byte precision variable array - ! containing the contents of the user specified netcdf variable. - - !----------------------------------------------------------------------- - - subroutine getvar_real_4d(filename,varname,var) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: varname - real(r_kind) :: var(:,:,:,:) - - ! Define variables computed within routine - - real(r_kind), dimension(:,:,:,:), allocatable :: workgrid - integer :: d1 - integer :: d2 - integer :: d3 - integer :: d4 - - !===================================================================== - - ! Define local variables - - d1 = size(var(:,1,1,1)) - d2 = size(var(1,:,1,1)) - d3 = size(var(1,1,:,1)) - d4 = size(var(1,1,1,:)) - - ! Allocate memory for local variables - - if(.not. allocated(workgrid)) allocate(workgrid(d1,d2,d3,d4)) - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - ncstatus = nf90_inq_varid(ncfileid,trim(adjustl(varname)),ncvarid) - ncstatus = nf90_get_var(ncfileid,ncvarid,workgrid) - var = workgrid - call netcdf_interface_close() - - ! Deallocate memory for local variables - - if(allocated(workgrid)) deallocate(workgrid) - - !===================================================================== - - end subroutine getvar_real_4d - - !======================================================================= - - ! SUBROUTINE: - - ! netcdf_interface_close.f90 - - ! DESCRIPTION: - - ! This subroutine closes a Network Common Data Format (netcdf) file - ! defined by the FORTRAN integer variable ncfileid. - - !----------------------------------------------------------------------- - - subroutine netcdf_interface_close() - - !===================================================================== - - ! Define local variables - - ncstatus = nf90_close(ncfileid) - - !===================================================================== - - end subroutine netcdf_interface_close - - !======================================================================= - - ! SUBROUTINE: - - ! netcdf_interface_getdim.f90 - - ! DESCRIPTION: - - ! This subroutine assigns the dimension value associated with the - ! netcdf API key specified by the user. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * dimname; a FORTRAN character string specifying the netcdf API - ! key for the respective netcdf dimension variable. - - ! * dimval; a FORTRAN integer variable to contain the netcdf - ! dimension value. - - ! OUTPUT VARIABLES: - - ! * dimval; a FORTRAN integer value specifying the netcdf dimension - ! value. - - !----------------------------------------------------------------------- - - subroutine netcdf_interface_getdim(filename,dimname,dimval) - - ! Define variables passed to routine - - character(len=500) :: filename - character(len=100) :: dimname - integer :: dimval - - !===================================================================== - - ! Define local variables - - call netcdf_interface_open(filename,.true.,.false.,.false.) - ncstatus = nf90_inq_dimid(ncfileid,trim(adjustl(dimname)),ncdimid) - ncstatus = nf90_inquire_dimension(ncfileid,ncdimid,len=dimval) - call netcdf_interface_close() - - !===================================================================== - - end subroutine netcdf_interface_getdim - - !======================================================================= - - ! SUBROUTINE: - - ! netcdf_interface_open.f90 - - ! DESCRIPTION: - - ! This subroutine opens a Network Common Data Format (netcdf) file - ! with permissions in accordance with the specifications of the - ! user; the global variable ncfileid is defined by this subroutine - ! until terminated by the subroutine netcdf_interface_close.f90. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * is_read; a FORTRAN logical variable specifying to open the - ! netcdf file with read-only permissions. - - ! * is_rdwr; a FORTRAN logical variable specifying to open the - ! netcdf file with read and write permissions. - - ! * is_write; a FORTRAN logical variable specifying to open a new - ! (and clobber any previous existence of a) the netcdf file with - ! write permissions. - - !----------------------------------------------------------------------- - - subroutine netcdf_interface_open(filename,is_read,is_rdwr,is_write) - - ! Define variables passed to routine - - character(len=500) :: filename - logical :: is_read - logical :: is_rdwr - logical :: is_write - - !===================================================================== - - ! Check local variable and proceed accordingly - - if(is_read) then - - ! Define local variables - - ncstatus = nf90_open(trim(adjustl(filename)),nf90_nowrite, & - & ncfileid) - - end if ! if(is_read) - - ! Check local variable and proceed accordingly - - if(is_rdwr) then - - ! Define local variables - - ncstatus = nf90_open(trim(adjustl(filename)),nf90_write, & - & ncfileid) - - end if ! if(is_rdwr) - - ! Check local variable and proceed accordingly - - if(is_write) then - - ! Define local variables - - ncstatus = nf90_create(trim(adjustl(filename)),nf90_clobber, & - & ncfileid) - - end if ! if(is_write) - - !===================================================================== - - end subroutine netcdf_interface_open - - !======================================================================= - -end module netcdf_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/obs_to_bufr_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/obs_to_bufr_interface.F90 deleted file mode 100644 index 80d99c784..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/obs_to_bufr_interface.F90 +++ /dev/null @@ -1,89 +0,0 @@ -module obs_to_bufr_interface - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! obs-to-bufr :: obs_to_bufr_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use diagnostics_interface - use kinds_interface - use namelist_interface - use observation_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: obs_to_bufr - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! obs_to_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the driver routine to write observation-types - ! to the BUFR format. - - !----------------------------------------------------------------------- - - subroutine obs_to_bufr() - - ! Define variables computed within routine - - real(r_kind) :: time_start - - !===================================================================== - - ! Define local variables - - call diagnostics_time_start(time_start) - call namelist() - - ! Compute local variables - - call observations() - - ! Define local variables - - call diagnostics_time_stop(time_start) - - !===================================================================== - - end subroutine obs_to_bufr - - !======================================================================= - -end module obs_to_bufr_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/observation_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/observation_interface.F90 deleted file mode 100644 index 92ccac278..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/observation_interface.F90 +++ /dev/null @@ -1,1283 +0,0 @@ -module observation_interface - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! obs-to-bufr :: observation_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use bufrio_interface - use fileio_interface - use interpolation_interface - use kinds_interface - use math_methods_interface - use meteo_methods_interface - use namelist_interface - use time_methods_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: observations - - ! Define local variables - - type(topogrid_struct) :: topogrid - real(r_double) :: anljday - real(r_double) :: obsjday - integer :: yyyy - integer :: mm - integer :: dd - integer :: hh - integer :: nn - integer :: ss - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! observations.f90 - - ! DESCRIPTION: - - ! This subroutine is the driver level routine for all observation - ! types to be written to BUFR formatted files. - - !----------------------------------------------------------------------- - - subroutine observations() - - !===================================================================== - - ! Define local variables - - call time_methods_date_attributes(analdate,yyyy,mm,dd,hh,nn,ss) - if(obs_flag) call obs_flag_bufr() - if(mask_land) call fileio_interface_read(topogrid) - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,anljday) - call obs_profile() - call obs_surface() - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(topogrid) - - !===================================================================== - - end subroutine observations - - !======================================================================= - - ! SUBROUTINE: - - ! fcst_model_to_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the interface to observations generated using - ! forecast-model variables (see - ! the references for the source code routines necessary to generate - ! the appropriate netcdf files). - - ! REFERENCES: - - ! https://github.com/hrwinterbottom/tc-synthetic-obs - - !----------------------------------------------------------------------- - - subroutine fcst_model_to_bufr() - - ! Define variables computed within routine - - type(bufr_struct) :: bufr - type(bufr_info_struct) :: bufr_info - type(fcst_model_struct) :: fcst_model - type(remap_struct) :: remap - type(tcm_struct) :: grid - character(len=500) :: lbufr_filepath - character(len=8) :: cacobid - integer(i_long) :: racobid - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - equivalence(racobid,cacobid) - bufr_info%filename = fcst_model_bufr_info_filepath - call fileio_interface_read(bufr_info) - bufr%hdstr = 'SID XOB YOB DHR TYP' - bufr%obstr = 'POB ZOB QOB TOB UOB VOB' - bufr%qcstr = 'PQM ZQM QQM TQM WQM' - bufr%oestr = 'POE ZOE QOE TOE WOE' - bufr%subset = trim(adjustl(bufr_info%subset)) - bufr%mxmn = 6 - bufr%mxlv = 1 - lbufr_filepath = trim(adjustl(datapath))//'prepbufr.fcstmdl' - call bufrio_interface_idate(analdate,bufr) - call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & - & .false.,.true.) - call fileio_interface_read(fcst_model_filepath,fcst_model) - remap%ncoords = fcst_model%nobs - call variable_interface_setup_struct(remap) - - ! Check local variable and proceed accordingly - - if(mask_land) then - - ! Define local variables - - remap%lat = fcst_model%lat - remap%lon = fcst_model%lon - - ! Compute local variables - - call obs_land_mask(remap) - - end if ! if(mask_land) - - ! Loop through local variable - - do i = 1, fcst_model%nobs - - ! Check local variable and proceed accordingly - - if((remap%mask(i) .eq. spval) .and. (fcst_model%lmsk(i) .eq. 1.0)) & - then - - ! Define local variables - - remap%mask(i) = spval - - end if ! if((remap%mask(i) .eq. spval) - ! .and. (fcst_model%lmsk(i) .eq. 1.0)) - - ! Check local variable and proceed accordingly - - if((remap%mask(i) .eq. spval) .and. (fcst_model%lmsk(i) .eq. 0.0)) & - then - - ! Define local variables - - remap%mask(i) = spval - - end if ! if((remap%mask(i) .eq. spval) - ! .and. (fcst_model%lmsk(i) .eq. 0.0)) - - ! Check local variable and proceed accordingly - - if((remap%mask(i) .ne. spval) .and. (fcst_model%lmsk(i) .eq. 1.0)) & - then - - ! Define local variables - - remap%mask(i) = spval - - end if ! if((remap%mask(i) .ne. spval) - ! .and. (fcst_model%lmsk(i) .eq. 1.0)) - - end do ! do i = 1, fcst_model%nobs - - ! Loop through local variable - - do i = 1, fcst_model%nobs - - ! Define local variables - - write(cacobid,500) i - - ! Loop through local variable - - do j = 1, fcst_model%nz - - ! Define local variables - - call variable_interface_setup_struct(bufr) - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(fcst_model%lon(i)) - bufr%hdr(3) = dble(fcst_model%lat(i)) - bufr%hdr(4) = 0.0 - bufr%hdr(5) = bufr_info%obs_type_mass - bufr%obs(1,1) = fcst_model%p(i,j)/100.0 - bufr%obs(2,1) = fcst_model%z(i,j) - bufr%obs(3,1) = fcst_model%q(i,j)*1000.0*1000.0 - bufr%obs(4,1) = (fcst_model%t(i,j) - 273.15) - bufr%qcf(1,1) = 2.0 - bufr%qcf(2,1) = 2.0 - bufr%qcf(3,1) = 2.0 - bufr%qcf(4,1) = 2.0 - - ! Check local variable and proceed accordingly - - if(remap%mask(i) .ne. spval) then - - ! Define local variables - - call bufrio_interface_write(bufr) - - end if ! if(remap%mask(i) .ne. spval) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - ! Define local variables - - call variable_interface_setup_struct(bufr) - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(fcst_model%lon(i)) - bufr%hdr(3) = dble(fcst_model%lat(i)) - bufr%hdr(4) = 0.0 - bufr%hdr(5) = bufr_info%obs_type_wind - bufr%obs(1,1) = fcst_model%p(i,j)/100.0 - bufr%obs(5,1) = fcst_model%u(i,j) - bufr%obs(6,1) = fcst_model%v(i,j) - bufr%qcf(1,1) = 2.0 - bufr%qcf(5,1) = 2.0 - - ! Check local variable and proceed accordingly - - if(remap%mask(i) .ne. spval) then - - ! Define local variables - - call bufrio_interface_write(bufr) - - end if ! if(remap%mask(i) .ne. spval) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - end do ! do j = 1, fcst_model%nz - - end do ! do i = 1, fcst_model%nobs - - ! Define local variables - - call bufrio_interface_close(.false.,.true.) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(fcst_model) - call variable_interface_cleanup_struct(remap) - - ! Define local variables - -500 format(i5.5,'FSM') - - !===================================================================== - - end subroutine fcst_model_to_bufr - - !======================================================================= - - ! SUBROUTINE: - - ! givtdruv_to_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the interface to the National Oceanic and - ! Atmospheric Administration (NOAA) Atlantic Oceanographic and - ! Meteorological Laboratory (AOML) Hurricane Research Division (HRD) - ! G-IV Tail-Doppler Radar (TDR) u- and v-wind (netcdf) formatted - ! files. - - !----------------------------------------------------------------------- - - subroutine givtdruv_to_bufr() - - ! Define variables computed within routine - - type(givtdruv_struct), dimension(:), allocatable :: grid - type(bufr_struct) :: bufr - type(bufr_info_struct) :: bufr_info - character(len=500) :: lbufr_filepath - character(len=8) :: cacobid - integer(i_long) :: racobid - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - equivalence(racobid,cacobid) - bufr_info%filename = givtdruv_bufr_info_filepath - call fileio_interface_read(bufr_info) - bufr%hdstr = 'SID XOB YOB DHR ELV TYP' - bufr%obstr = 'POB ZOB UOB VOB' - bufr%qcstr = 'PQM ZQM WQM' - bufr%oestr = 'POE ZOE WOE' - bufr%subset = trim(adjustl(bufr_info%subset)) - bufr%mxmn = 6 - bufr%mxlv = 1 - lbufr_filepath = trim(adjustl(datapath))//'prepbufr.givtdruv' - call bufrio_interface_idate(analdate,bufr) - call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & - & .false.,.true.) - call fileio_interface_read(givtdruv_obs_filepath,grid) - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - call fileio_interface_read(obs_filename(i),grid(i)) - call time_methods_date_attributes(grid(i)%timestamp,yyyy,mm,dd,hh, & - & nn,ss) - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,obsjday) - - ! Loop through local variable - - do j = 1, grid(i)%ncoords - - ! Define local variables - - call variable_interface_setup_struct(bufr) - - ! Check local variable and proceed accordingly - - if((grid(i)%u(j) .ne. grid(i)%msngvl) .and. (grid(i)%v(j) .ne. & - & grid(i)%msngvl)) then - - ! Define local variables - - write(cacobid,500) j - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(grid(i)%lon(j) + 360.0) - bufr%hdr(3) = dble(grid(i)%lat(j)) - bufr%hdr(4) = (obsjday - anljday)*dble(24.0) - bufr%hdr(5) = dble(0.0) - bufr%hdr(6) = bufr_info%obs_type_wind - bufr%obs(2,1) = dble(grid(i)%level(j)*1000.0) - bufr%obs(3,1) = dble(grid(i)%u(j)) - bufr%obs(4,1) = dble(grid(i)%v(j)) - bufr%qcf(1,1) = 2.0 - bufr%qcf(2,1) = 2.0 - bufr%qcf(3,1) = 2.0 - call bufrio_interface_write(bufr) - - end if ! if((grid(i)%u(j) .ne. grid(i)%msngvl) - ! .and. (grid(i)%v(j) .ne. grid(i)%msngvl)) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - end do ! do j = 1, grid%ncoords - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(grid(i)) - - end do ! do i = 1, nfiles - - ! Define local variables - - call bufrio_interface_close(.false.,.true.) - - ! Deallocate memory for local variables - - if(allocated(grid)) deallocate(grid) - if(allocated(obs_filename)) deallocate(obs_filename) - - ! Define local variables - -500 format(i6.6,'UV') -501 format(a4,'-',a2,'-',a2,'_',a2,':',a2,':',a2) - - !===================================================================== - - end subroutine givtdruv_to_bufr - - !======================================================================= - - ! SUBROUTINE: - - ! hsa_to_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the interface to the National Oceanic and - ! Atmospheric Administration (NOAA) Atlantic Oceanographic and - ! Meteorological Laboratory (AOML) Hurricane Research Division (HRD) - ! HRD Spline Analysis (HSA) formatted files; the valid variable - ! values, for 'SIGL' and 'MANL' type levels are written as - ! individual records to the respective BUFR file such that the drift - ! of the sonde (if applicable) can be appropriately accounted for. - - !----------------------------------------------------------------------- - - subroutine hsa_to_bufr() - - ! Define variables computed within routine - - type(bufr_struct) :: bufr - type(bufr_info_struct) :: bufr_info - type(error_struct) :: error - type(hsa_struct) :: grid - type(meteo_struct) :: meteo - character(len=500) :: filename - character(len=500) :: lbufr_filepath - character(len=8) :: cacobid - character(len=8) :: cdate - character(len=6) :: ctime - character(len=6) :: acid - character(len=6) :: obsn - real(r_kind) :: obs_err - integer(i_long) :: racobid - integer :: strstrt - integer :: strstop - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - equivalence(racobid,cacobid) - bufr_info%filename = hsa_bufr_info_filepath - call fileio_interface_read(bufr_info) - bufr%hdstr = 'SID XOB YOB DHR TYP' - bufr%obstr = 'POB QOB TOB UOB VOB' - bufr%qcstr = 'PQM QQM TQM WQM' - bufr%oestr = 'POE QOE TOE WOE' - bufr%subset = trim(adjustl(bufr_info%subset)) - bufr%mxmn = 5 - bufr%mxlv = 1 - lbufr_filepath = trim(adjustl(datapath))//'prepbufr.hsa' - call bufrio_interface_idate(analdate,bufr) - call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & - & .false.,.true.) - call fileio_interface_read(hsa_obserr_filepath,error) - call fileio_interface_read(hsa_obs_filepath) - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - call fileio_interface_read(obs_filename(i),grid) - strstrt = index(trim(adjustl(obs_filename(i))),'/',back=.true.) & - & + 1 - strstop = len(trim(adjustl(obs_filename(i)))) - filename = trim(adjustl(obs_filename(i)(strstrt:strstop))) - acid = filename(1:4) - obsn = filename(7:8) - write(cacobid,500) trim(adjustl(acid)), trim(adjustl(obsn)) - - ! Loop through local variable - - do j = 1, grid%nz - - ! Check local variable and proceed accordingly - - if(grid%yymmdd(j) .ne. hsa_spval .and. (grid%tail(j) .eq. & - & 'SIGL' .or. grid%tail(j) .eq. 'MANL')) then - - ! Define local variables - - call variable_interface_setup_struct(bufr) - write(cdate,'(i8)') (20000000 + (int(grid%yymmdd(j)))) - write(ctime,'(i4.4,i2.2)') grid%gmt(j), 0 - write(bufr%cdate,501) cdate(1:4), cdate(5:6), cdate(7:8), & - & ctime(1:2), ctime(3:4), ctime(5:6) - call time_methods_date_attributes(bufr%cdate,yyyy,mm,dd,hh, & - & nn,ss) - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,obsjday) - - ! Define local variables - - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(-1.0*grid%lon(j) + 360.0) - bufr%hdr(3) = dble(grid%lat(j)) - bufr%hdr(4) = (obsjday - anljday)*dble(24.0) - bufr%hdr(5) = bufr_info%obs_type_mass - - ! Check local variable and proceed accordingly - - if(grid%t(j) .ne. hsa_spval) then - - ! Define local variables - - bufr%obs(1,1) = grid%p(j) - bufr%obs(3,1) = grid%t(j) - call obs_error(error%nz,error%plev,error%t,grid%p(j), & - & hsa_intrp_obserr,obs_err) - bufr%oer(3,1) = obs_err - bufr%qcf(1,1) = 2.0 - bufr%qcf(3,1) = 2.0 - - ! Check local variable and proceed accordingly - - if(grid%rh(j) .ne. hsa_spval) then - - ! Define local variables - - meteo%p = dble(grid%p(j)*100.0) - meteo%rh = dble(grid%rh(j)) - meteo%t = dble(grid%t(j) + 273.15) - - ! Compute local variables - - call meteo_methods_spechumd(meteo) - - ! Define local variables - - bufr%obs(2,1) = real(meteo%q)*1000.0*1000.0 - call obs_error(error%nz,error%plev,error%q,grid%p(j), & - & hsa_intrp_obserr,obs_err) - bufr%oer(2,1) = obs_err - bufr%qcf(2,1) = 2.0 - - end if ! if(grid%rh(j) .ne. hsa_spval) - - ! Define local variables - - call bufrio_interface_write(bufr) - - end if ! if(grid%t(j) .ne. hsa_spval) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - ! Define local variables - - call variable_interface_setup_struct(bufr) - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(-1.0*grid%lon(j) + 360.0) - bufr%hdr(3) = dble(grid%lat(j)) - bufr%hdr(4) = (obsjday - anljday)*dble(24.0) - bufr%hdr(5) = bufr_info%obs_type_wind - - ! Check local variable and proceed accordingly - - if(grid%u(j) .ne. hsa_spval .and. grid%v(j) .ne. hsa_spval) & - & then - - ! Define local variables - - bufr%obs(1,1) = grid%p(j) - bufr%obs(4,1) = grid%u(j) - bufr%obs(5,1) = grid%v(j) - call obs_error(error%nz,error%plev,error%uv,grid%p(j), & - & hsa_intrp_obserr,obs_err) - bufr%oer(4,1) = obs_err - bufr%qcf(1,1) = 2.0 - bufr%qcf(4,1) = 2.0 - call bufrio_interface_write(bufr) - - end if ! if(grid%u(j) .ne. hsa_spval .and. grid%v(j) .ne. - ! hsa_spval) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - end if ! if(grid%yymmdd(j) .ne. hsa_spval .and. (grid%tail(j) & - ! .eq. 'SIGL' .or. grid%tail(j) .eq. 'MANL')) - - end do ! do j = 1, grid%nz - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(grid) - - end do ! do i = 1, nfiles - - ! Define local variables - - call bufrio_interface_close(.false.,.true.) - - ! Deallocate memory for local variables - - if(allocated(obs_filename)) deallocate(obs_filename) - call variable_interface_cleanup_struct(error) - - ! Define local variables - -500 format(a4,a2,'AH') -501 format(a4,'-',a2,'-',a2,'_',a2,':',a2,':',a2) - - !===================================================================== - - end subroutine hsa_to_bufr - - !======================================================================= - - ! SUBROUTINE: - - ! nhcgtcm_to_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the interface to observations generated from - ! the National Hurricane Center (NHC) Gridded Tropical Cyclone Model - ! (GTCM); see the references section for the applicable routines - ! required to generate the interface files. - - ! REFERENCES: - - ! https://github.com/hrwinterbottom/tc-synthetic-obs - - !----------------------------------------------------------------------- - - subroutine nhcgtcm_to_bufr() - - ! Define variables computed within routine - - type(bufr_struct) :: bufr - type(bufr_info_struct) :: bufr_info - type(error_struct) :: error - type(remap_struct) :: remap - type(nhcgtcm_struct) :: grid - character(len=500) :: lbufr_filepath - character(len=8) :: cacobid - integer(i_long) :: racobid - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - equivalence(racobid,cacobid) - bufr_info%filename = nhcgtcm_bufr_info_filepath - call fileio_interface_read(bufr_info) - bufr%hdstr = 'SID XOB YOB DHR ELV TYP' - bufr%obstr = 'POB ZOB UOB VOB' - bufr%qcstr = 'PQM ZQM WQM' - bufr%oestr = 'POE ZOE WOE' - bufr%subset = trim(adjustl(bufr_info%subset)) - bufr%mxmn = 6 - bufr%mxlv = 1 - lbufr_filepath = trim(adjustl(datapath))//'prepbufr.nhcgtcm' - call bufrio_interface_idate(analdate,bufr) - call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & - & .false.,.true.) - call fileio_interface_read(nhcgtcm_obs_filepath) - call time_methods_date_attributes(analdate,yyyy,mm,dd,hh,nn,ss) - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,anljday) - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - call fileio_interface_read(obs_filename(i),grid) - remap%ncoords = grid%nvals - call variable_interface_setup_struct(remap) - - ! Check local variable and proceed accordingly - - if(mask_land) then - - ! Define local variables - - remap%lat = grid%lat - remap%lon = grid%lon - 360.0 - - ! Compute local variables - - call obs_land_mask(remap) - - end if ! if(mask_land) - - ! Loop through local variable - - do j = 1, grid%nvals - - ! Define local variables - - write(cacobid,500) j - call variable_interface_setup_struct(bufr) - - ! Define local variables - - call time_methods_date_attributes(grid%analysis_date,yyyy,mm, & - & dd,hh,nn,ss) - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,obsjday) - - ! Define local variables - - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(grid%lon(j)) - bufr%hdr(3) = dble(grid%lat(j)) - bufr%hdr(4) = (obsjday - anljday)*dble(24.0) - bufr%hdr(5) = remap%hgt(j) - bufr%hdr(6) = bufr_info%obs_type_wind - bufr%obs(2,1) = remap%hgt(j) + 10.0 - bufr%obs(3,1) = grid%u10m(j) - bufr%obs(4,1) = grid%v10m(j) - bufr%qcf(1,1) = 2.0 - bufr%qcf(2,1) = 2.0 - bufr%qcf(3,1) = 2.0 - bufr%oer(2,1) = 10.0 - bufr%oer(3,1) = 10.0 - call bufrio_interface_write(bufr) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - end do ! do j = 1, grid%nvals - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(grid) - - end do ! do i = 1, nfiles - - ! Define local variables - - call bufrio_interface_close(.false.,.true.) - - ! Deallocate memory for local variables - - if(allocated(obs_filename)) deallocate(obs_filename) - call variable_interface_cleanup_struct(error) - - ! Define local variables - -500 format(i6.6,'TC') -501 format(a4,'-',a2,'-',a2,'_',a2,':',a2,':',a2) - - !===================================================================== - - end subroutine nhcgtcm_to_bufr - - !======================================================================= - - ! SUBROUTINE: - - ! obs_error.f90 - - ! DESCRIPTION: - - ! This subroutine determines the observation error for a given - ! observation provided the observation isobaric level. - - ! INPUT VARIABLES: - - ! * nz; a FORTRAN integer specifying the total number of levels in - ! the observation error profile. - - ! * err_plev; a FORTRAN 4-byte real value array, of dimension nz, - ! containing the isobaric levels for the observation error - ! profile. - - ! * err_var; a FORTRAN 4-byte real value array, of dimension nz, - ! containing the respective observation-type variable observation - ! error profile. - - ! * obs_plev; a FORTRAN 4-byte real value specifying the observation - ! isobaric level. - - ! * interp; a FORTRAN boolean value specifying whether to use spline - ! interpolation or nearest-neighbor methods to define the - ! observation error. - - ! * obs_err; a FORTRAN 4-byte real value to contain the observation - ! error. - - ! OUTPUT VARIABLES: - - ! * obs_err; a FORTRAN 4-byte real value specifying the observation - ! variable in accordance with the user instructions (e.g., - ! interp). - - !----------------------------------------------------------------------- - - subroutine obs_error(nz,err_plev,err_var,obs_plev,interp,obs_err) - - ! Define variables passed to subroutine - - logical :: interp - integer :: nz - real(r_kind), dimension(nz) :: err_plev - real(r_kind), dimension(nz) :: err_var - real(r_kind) :: obs_plev - real(r_kind) :: obs_err - - ! Define variables computed within routine - - type(spline_struct) :: spline - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - spline%n = nz - call variable_interface_setup_struct(spline) - spline%xa = err_plev - spline%ya = err_var - - ! Check local variable and proceed accordingly - - if(interp) then - - ! Define local variables - - spline%x = obs_plev - - ! Compute local variables - - call math_methods_spline_interp(spline) - - ! Define local variables - - obs_err = spline%y - - end if ! if(interp) - - ! Check local variable and proceed accordingly - - if(.not. interp) then - - ! Define local variables - - call math_methods_sort_array(spline,.true.,.false.) - - ! Loop through local variable - - do i = 1, (spline%n - 1) - - ! Check local variable and proceed accordingly - - if(obs_plev .gt. spline%xa(i) .and. obs_plev .gt. obs_plev .le. & - & spline%xa(i+1)) then - - ! Define local variables - - obs_err = spline%ya(i+1) - - end if ! if(obs_plev .gt. spline%xa(i) .and. obs_plev - ! .gt. obs_plev .le. spline%xa(i+1) - - end do ! do i = 1, (spline%n - 1) - - end if ! if(.not. interp) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(spline) - - !===================================================================== - - end subroutine obs_error - - !======================================================================= - - ! SUBROUTINE: - - ! obs_flag_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the driver layer interface to - ! update/change/flag user specified BUFR messages. - - !----------------------------------------------------------------------- - - subroutine obs_flag_bufr() - - ! Define variables computed within routine - - type(obs_flag_struct) :: obs_flag - - !===================================================================== - - ! Define local variables - - obs_flag%filename = obs_flag_json_vtable - call fileio_interface_read(obs_flag) - call bufrio_interface_flag(bufr_filepath,obs_flag) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(obs_flag) - - !===================================================================== - - end subroutine obs_flag_bufr - - !======================================================================= - - ! SUBROUTINE: - - ! obs_land_mask.f90 - - ! DESCRIPTION: - - ! This subroutine defines a land-mask using nearest-neighbor - ! interpolation coefficients between the user specified topography - ! grid and the user specified observation grid; all ocean points - ! have a value of 1.0 while the land points are denoted by the - ! missing value (e.g., spval) attribute of this routine. - - ! INPUT VARIABLES: - - ! * remap; a FORTRAN remap_struct variable; it is assumed that all - ! arrays have been allocated and the geographical (e.g., latitude - ! and longitude) coordinates have been assigned from the - ! observation grid. - - ! OUTPUT VARIABLES: - - ! * remap; a FORTRAN remap_struct variable containing the masked - ! land (e.g., where topography values are non-zero) grid cells; - ! non-land points (i.e., ocean) are denoted by a value of 1.0; - ! land points are assigned the missing value (e.g., spval) - ! attribute of this routine. - - !----------------------------------------------------------------------- - - subroutine obs_land_mask(remap) - - ! Define variables passed to routine - - type(remap_struct) :: remap - - ! Define variables computed within routine - - type(grid_struct) :: dst_grid - type(grid_struct) :: src_grid - type(slint_struct) :: slint - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - dst_grid%ncoords = remap%ncoords - call variable_interface_setup_struct(dst_grid) - dst_grid%lat = remap%lat - dst_grid%lon = remap%lon - src_grid%ncoords = topogrid%ncoords - call variable_interface_setup_struct(src_grid) - src_grid%lat = topogrid%lat - src_grid%lon = topogrid%lon - slint%ncoords = dst_grid%ncoords - call variable_interface_setup_struct(slint) - - ! Compute local variables - - call interpolation_interface_init(src_grid,dst_grid,slint) - - ! Define local variables - - remap%mask = 1.0 - - ! Loop though local variable - - do i = 1, remap%ncoords - - ! Define local variables - - remap%hgt(i) = topogrid%topo(slint%nn(1,i)) - if(topogrid%topo(slint%nn(1,i)) .ne. 0.0) remap%mask(i) = spval - - end do ! do i = 1, remap%ncoords - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(dst_grid) - call variable_interface_cleanup_struct(src_grid) - call variable_interface_cleanup_struct(slint) - - !===================================================================== - - end subroutine obs_land_mask - - !======================================================================= - - ! SUBROUTINE: - - ! obs_profile.f90 - - ! DESCRIPTION: - - ! This subroutine is the driver level routine for the profile-type - ! observations. - - !----------------------------------------------------------------------- - - subroutine obs_profile() - - !===================================================================== - - ! Define local variables - - if(is_fcstmdl) call fcst_model_to_bufr() - if(is_givtdruv) call givtdruv_to_bufr() - if(is_hsa) call hsa_to_bufr() - - !===================================================================== - - end subroutine obs_profile - - !======================================================================= - - ! SUBROUTINE: - - ! obs_surface.f90 - - ! DESCRIPTION: - - ! This subroutine is the driver level routine for surface-type - ! observations. - - !----------------------------------------------------------------------- - - subroutine obs_surface() - - !===================================================================== - - ! Define local variables - - if(is_nhcgtcm) call nhcgtcm_to_bufr() - if(is_tcm) call tcm_to_bufr() - - !===================================================================== - - end subroutine obs_surface - - !======================================================================= - - ! SUBROUTINE: - - ! tcm_to_bufr.f90 - - ! DESCRIPTION: - - ! This subroutine is the interface to observations generated using - ! synthetic tropical cyclone (TC) wind-field parameterizations (see - ! the references for the source code routines necessary to generate - ! the appropriate netcdf files). - - ! REFERENCES: - - ! https://github.com/hrwinterbottom/tc-synthetic-obs - - !----------------------------------------------------------------------- - - subroutine tcm_to_bufr() - - ! Define variables computed within routine - - type(bufr_struct) :: bufr - type(bufr_info_struct) :: bufr_info - type(error_struct) :: error - type(remap_struct) :: remap - type(tcm_struct) :: grid - character(len=500) :: lbufr_filepath - character(len=8) :: cacobid - integer(i_long) :: racobid - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - equivalence(racobid,cacobid) - bufr_info%filename = tcm_bufr_info_filepath - call fileio_interface_read(bufr_info) - bufr%hdstr = 'SID XOB YOB DHR TYP ELV' - bufr%obstr = 'POB ZOB UOB VOB' - bufr%qcstr = 'PQM ZQM WQM' - bufr%oestr = 'POE NUL WOE' - bufr%subset = trim(adjustl(bufr_info%subset)) - bufr%mxmn = 6 - bufr%mxlv = 1 - lbufr_filepath = trim(adjustl(datapath))//'prepbufr.tcm' - call bufrio_interface_idate(analdate,bufr) - call bufrio_interface_open(lbufr_filepath,bufr_tblpath,bufr,.false., & - & .false.,.true.) - call fileio_interface_read(tcm_obs_filepath) - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - call fileio_interface_read(obs_filename(i),grid) - remap%ncoords = grid%nvals - call variable_interface_setup_struct(remap) - - ! Check local variable and proceed accordingly - - if(mask_land) then - - ! Define local variables - - remap%lat = grid%lat - remap%lon = grid%lon - - ! Compute local variables - - call obs_land_mask(remap) - - end if ! if(mask_land) - - ! Loop through local variable - - do j = 1, grid%nvals - - ! Define local variables - - write(cacobid,500) j - call variable_interface_setup_struct(bufr) - - ! Define local variables - - call time_methods_date_attributes(grid%analysis_date,yyyy,mm, & - & dd,hh,nn,ss) - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,obsjday) - - ! Define local variables - - bufr%hdr(1) = dble(racobid) - bufr%hdr(2) = dble(grid%lon(j)) - bufr%hdr(3) = dble(grid%lat(j)) - bufr%hdr(4) = (obsjday - anljday)*dble(24.0) - bufr%hdr(5) = bufr_info%obs_type_wind - bufr%hdr(6) = 10.0 - bufr%obs(1,1) = grid%psfc(j)/100.0 - bufr%obs(2,1) = 10.0 - bufr%obs(3,1) = grid%u(j) - bufr%obs(4,1) = grid%v(j) - bufr%qcf(1,1) = 2.0 - bufr%qcf(2,1) = 2.0 - bufr%qcf(3,1) = 2.0 - bufr%qcf(4,1) = 2.0 - - ! Check local variable and proceed accordingly - - if(remap%mask(j) .ne. spval) then - - ! Define local variables - - call bufrio_interface_write(bufr) - - end if ! if(remap%mask(j) .ne. spval) - - ! Check local variable and proceed accordingly - - if(remap%mask(j) .eq. spval) then - - ! Define local variables - - grid%psfc(j) = spval - grid%u(j) = spval - grid%v(j) = spval - - end if ! if(remap%mask(j) .eq. spval) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(bufr) - - end do ! do j = 1, grid%nvals - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(grid) - call variable_interface_cleanup_struct(remap) - - end do ! do i = 1, nfiles - - ! Define local variables - - call bufrio_interface_close(.false.,.true.) - - ! Deallocate memory for local variables - - if(allocated(obs_filename)) deallocate(obs_filename) - call variable_interface_cleanup_struct(error) - - ! Define local variables - -500 format(i5.5,'TCM') - - !===================================================================== - - end subroutine tcm_to_bufr - - !======================================================================= - -end module observation_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/time_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/time_methods_interface.F90 deleted file mode 100644 index 584c5bddd..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/time_methods_interface.F90 +++ /dev/null @@ -1,213 +0,0 @@ -module time_methods_interface - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! obs-to-bufr :: time_methods_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: time_methods_date_attributes - public :: time_methods_julian_day - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! time_methods_date_attributes.f90 - - ! DESCRIPTION: - - ! This subroutine returns the integer attributes from the user - ! specified integer defining the date to be parsed. - - ! INPUT VARIABLES: - - ! * dateint; a FORTRAN integer defining the date to be parsed. - - ! * yyyy; a FORTRAN integer value to specify the year for the parsed - ! date. - - ! * mm; a FORTRAN integer value to specify the month for the parsed - ! date. - - ! * dd; a FORTRAN integer value to specify the day for the parsed - ! date. - - ! * hh; a FORTRAN integer value to specify the hour of day for the - ! parsed date. - - ! * nn; a FORTRAN integer value to specify the minute of hour for - ! the parsed date. - - ! * ss; a FORTRAN integer value to specify the second of minute for - ! the parsed date. - - - ! OUTPUT VARIABLES: - - ! * yyyy; a FORTRAN integer value specifying the year for the parsed - ! date. - - ! * mm; a FORTRAN integer value specifying the month for the parsed - ! date. - - ! * dd; a FORTRAN integer value specifying the day for the parsed - ! date. - - ! * hh; a FORTRAN integer value specifying the hour of day for the - ! parsed date. - - ! * nn; a FORTRAN integer value specifying the minute of hour for - ! the parsed date. - - ! * ss; a FORTRAN integer value specifying the second of minute for - ! the parsed date. - - !----------------------------------------------------------------------- - - subroutine time_methods_date_attributes(datestr,yyyy,mm,dd,hh,nn,ss) - - ! Define variables passed to routine - - character(len=19) :: datestr - integer :: yyyy - integer :: mm - integer :: dd - integer :: hh - integer :: nn - integer :: ss - - !===================================================================== - - ! Define local variables - - read(datestr(1:4), '(i4.4)') yyyy - read(datestr(6:7), '(i2.2)') mm - read(datestr(9:10), '(i2.2)') dd - read(datestr(12:13),'(i2.2)') hh - read(datestr(15:16),'(i2.2)') nn - read(datestr(18:19),'(i2.2)') ss - - !===================================================================== - - end subroutine time_methods_date_attributes - - !======================================================================= - - ! SUBROUTINE: - - ! time_methods_julian_day.f90 - - ! DESCRIPTION: - - ! This subroutine determines the Julian date corresponding the - ! Gregorian calendar attributes. - - ! REFERENCES: - - ! http://aa.usno.navy.mil/faq/docs/JD_Formula.php - - ! INPUT VARIABLES: - - ! * yyyy; a FORTRAN integer value specifying the Gregorian calendar - ! year. - - ! * mm; a FORTRAN integer value specifying the Gregorian calendar - ! month. - - ! * dd; a FORTRAN integer value specifying the Gregorian calendar - ! day. - - ! * hh; a FORTRAN integer value specifying the Gregorian calendar - ! hour of day. - - ! * nn; a FORTRAN integer value specifying the Gregorian calendar - ! minute of hour. - - ! * ss; a FORTRAN integer value specifying the Gregorian calendar - ! second of minute. - - ! * julian_day; a FORTRAN 8-byte real value to define the Julian - ! date. - - ! OUTPUT VARIABLES: - - ! * julian_day; a FORTRAN 8-byte real value specifying the Julian - ! date. - - !----------------------------------------------------------------------- - - subroutine time_methods_julian_day(yyyy,mm,dd,hh,nn,ss,julian_day) - - ! Define variables passed to routine - - real(r_double) :: julian_day - integer :: yyyy - integer :: mm - integer :: dd - integer :: hh - integer :: nn - integer :: ss - - ! Define variables computed within routine - - real(r_double) :: frac_day - - !===================================================================== - - ! Compute local variables - - julian_day = dble(dd - 32075 + 1461*(yyyy + 4800 + (mm - 14)/12)/4 + & - & 367*(mm - 2 - (mm - 14)/12*12)/12 - 3*((yyyy + 4900 + & - & (mm - 14)/12)/100)/4) - - ! Define local variables - - frac_day = julian_day*86400.0 - frac_day = frac_day + dble(hh*3600.0) - frac_day = frac_day + dble(nn*60.0) - frac_day = frac_day + dble(ss) - julian_day = frac_day/86400.0 - - !===================================================================== - - end subroutine time_methods_julian_day - - !======================================================================= - -end module time_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/obs_to_bufr/variable_interface.F90 b/sorc/hafs_tools.fd/sorc/obs_to_bufr/variable_interface.F90 deleted file mode 100644 index 175b7cc02..000000000 --- a/sorc/hafs_tools.fd/sorc/obs_to_bufr/variable_interface.F90 +++ /dev/null @@ -1,1455 +0,0 @@ -module variable_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! obs-to-bufr :: variable_interface - ! Copyright (C) 2018 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: bufr_info_struct - public :: bufr_mxlv - public :: bufr_mxmn - public :: bufr_spval - public :: bufr_struct - public :: error_struct - public :: fcst_model_struct - public :: givtdruv_struct - public :: grid_struct - public :: hsa_spval - public :: hsa_struct - public :: meteo_struct - public :: nhcgtcm_struct - public :: obs_flag_struct - public :: remap_struct - public :: slint_struct - public :: spline_struct - public :: spval - public :: tcm_struct - public :: topogrid_struct - public :: variable_interface_cleanup_struct - public :: variable_interface_setup_struct - public :: varinfo_struct - interface variable_interface_cleanup_struct - module procedure finalize_bufr_struct - module procedure finalize_error_struct - module procedure finalize_fcst_model_struct - module procedure finalize_givtdruv_struct - module procedure finalize_grid_struct - module procedure finalize_hsa_struct - module procedure finalize_nhcgtcm_struct - module procedure finalize_obs_flag_struct - module procedure finalize_remap_struct - module procedure finalize_slint_struct - module procedure finalize_spline_struct - module procedure finalize_tcm_struct - module procedure finalize_topogrid_struct - module procedure finalize_varinfo_struct - end interface variable_interface_cleanup_struct - interface variable_interface_setup_struct - module procedure initialize_bufr_struct - module procedure initialize_error_struct - module procedure initialize_fcst_model_struct - module procedure initialize_givtdruv_struct - module procedure initialize_grid_struct - module procedure initialize_hsa_struct - module procedure initialize_nhcgtcm_struct - module procedure initialize_obs_flag_struct - module procedure initialize_remap_struct - module procedure initialize_slint_struct - module procedure initialize_spline_struct - module procedure initialize_tcm_struct - module procedure initialize_topogrid_struct - module procedure initialize_varinfo_struct - end interface variable_interface_setup_struct - - ! Define local variables - - type bufr_struct - character(len=80) :: obstr - character(len=80) :: hdstr - character(len=80) :: qcstr - character(len=80) :: oestr - character(len=19) :: cdate - character(len=8) :: subset - real(r_double), dimension(:,:), allocatable :: obs - real(r_double), dimension(:,:), allocatable :: qcf - real(r_double), dimension(:,:), allocatable :: oer - real(r_double), dimension(:), allocatable :: hdr - integer :: idate - integer :: mxmn - integer :: mxlv - integer :: nrecs - end type bufr_struct ! type bufr_struct - type bufr_info_struct - character(len=500) :: filename - character(len=8) :: subset - integer :: obs_type_mass - integer :: obs_type_wind - end type bufr_info_struct ! type bufr_info_struct - type error_struct - real(r_kind), dimension(:), allocatable :: plev - real(r_kind), dimension(:), allocatable :: p - real(r_kind), dimension(:), allocatable :: t - real(r_kind), dimension(:), allocatable :: q - real(r_kind), dimension(:), allocatable :: z - real(r_kind), dimension(:), allocatable :: uv - integer :: nz - end type error_struct ! type error_struct - type fcst_model_struct - real(r_kind), dimension(:,:), allocatable :: p - real(r_kind), dimension(:,:), allocatable :: q - real(r_kind), dimension(:,:), allocatable :: t - real(r_kind), dimension(:,:), allocatable :: u - real(r_kind), dimension(:,:), allocatable :: v - real(r_kind), dimension(:,:), allocatable :: z - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: lmsk - real(r_kind), dimension(:), allocatable :: psfc - integer :: nobs - integer :: nz - end type fcst_model_struct ! type fcst_model_struct - type givtdruv_struct - character(len=19) :: timestamp - real(r_kind), dimension(:), allocatable :: u - real(r_kind), dimension(:), allocatable :: v - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: level - real(r_kind) :: msngvl - integer :: ncoords - integer :: nx - integer :: ny - integer :: nz - end type givtdruv_struct ! type givtdruv_struct - type grid_struct - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - integer :: nx - integer :: ny - integer :: ncoords - end type grid_struct ! type grid_struct - type hsa_struct - character(len=4), dimension(:), allocatable :: tail - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: p - real(r_kind), dimension(:), allocatable :: rh - real(r_kind), dimension(:), allocatable :: t - real(r_kind), dimension(:), allocatable :: u - real(r_kind), dimension(:), allocatable :: v - real(r_kind), dimension(:), allocatable :: z - real(r_kind), dimension(:), allocatable :: yymmdd - integer, dimension(:), allocatable :: gmt - integer, dimension(:), allocatable :: wx - integer :: nz - end type hsa_struct ! type hsa_struct - type meteo_struct - real(r_double) :: p - real(r_double) :: q - real(r_double) :: rh - real(r_double) :: t - real(r_double) :: wvmxrt - end type meteo_struct ! type meteo_struct - type nhcgtcm_struct - character(len=19) :: analysis_date - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: u10m - real(r_kind), dimension(:), allocatable :: v10m - real(r_kind) :: spval - integer :: nvals - end type nhcgtcm_struct ! type nhcgtcm_struct - type obs_flag_struct - character(len=500) :: filename - character(len=10), dimension(:), allocatable :: mneumonic - character(len=8), dimension(:), allocatable :: subset - real(r_kind), dimension(:), allocatable :: val - integer, dimension(:), allocatable :: obs_type - integer :: nflag - end type obs_flag_struct ! type obs_flag_struct - type remap_struct - real(r_kind), dimension(:), allocatable :: hgt - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: mask - integer :: ncoords - end type remap_struct ! type remap_struct - type slint_struct - real(r_double), dimension(:,:), allocatable :: coeffs - integer, dimension(:,:), allocatable :: nn - integer :: ncoeffs - integer :: ncoords - end type slint_struct ! type slint_struct - type spline_struct - real(r_kind), dimension(:), allocatable :: xa - real(r_kind), dimension(:), allocatable :: ya - real(r_kind) :: x - real(r_kind) :: y - integer :: n - end type spline_struct ! type spline_struct - type tcm_struct - character(len=19) :: analysis_date - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: psfc - real(r_kind), dimension(:), allocatable :: u - real(r_kind), dimension(:), allocatable :: v - real(r_kind) :: spval - integer :: nvals - integer :: nx - integer :: ny - end type tcm_struct ! type tcm_struct - type topogrid_struct - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: topo - integer :: ncoords - integer :: nx - integer :: ny - end type topogrid_struct ! type topogrid_struct - type varinfo_struct - character(len=500), dimension(:,:,:), allocatable :: varattrs - character(len=25), dimension(:), allocatable :: varname - character(len=10), dimension(:), allocatable :: dimname - character(len=10), dimension(:), allocatable :: vartype - integer, dimension(:,:), allocatable :: vardimid - integer, dimension(:), allocatable :: dimid - integer, dimension(:), allocatable :: dimval - integer, dimension(:), allocatable :: varid - integer, dimension(:), allocatable :: varndims - integer, dimension(:), allocatable :: varnattrs - integer :: nvars - integer :: ndims - integer :: nattrs - end type varinfo_struct ! type varinfo_struct - real(r_double), parameter :: bufr_spval = 10.e10 - real(r_double), parameter :: spval = huge(1.0) - real(r_kind), parameter :: hsa_spval = -99.0 - integer, parameter :: bufr_mxlv = 200 - integer, parameter :: bufr_mxmn = 35 - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_bufr_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! bufr_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN bufr_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_bufr_struct(grid) - - ! Define variables passed routine - - type(bufr_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%obs)) deallocate(grid%obs) - if(allocated(grid%qcf)) deallocate(grid%qcf) - if(allocated(grid%oer)) deallocate(grid%oer) - if(allocated(grid%hdr)) deallocate(grid%hdr) - - !===================================================================== - - end subroutine finalize_bufr_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_error_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! error_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN error_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_error_struct(grid) - - ! Define variables passed routine - - type(error_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%plev)) deallocate(grid%plev) - if(allocated(grid%p)) deallocate(grid%p) - if(allocated(grid%t)) deallocate(grid%t) - if(allocated(grid%q)) deallocate(grid%q) - if(allocated(grid%z)) deallocate(grid%z) - if(allocated(grid%uv)) deallocate(grid%uv) - - !===================================================================== - - end subroutine finalize_error_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_fcst_model_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! fcst_model_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN fcst_model_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_fcst_model_struct(grid) - - ! Define variables passed routine - - type(fcst_model_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%p)) deallocate(grid%p) - if(allocated(grid%q)) deallocate(grid%q) - if(allocated(grid%t)) deallocate(grid%t) - if(allocated(grid%u)) deallocate(grid%u) - if(allocated(grid%v)) deallocate(grid%v) - if(allocated(grid%z)) deallocate(grid%z) - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%lmsk)) deallocate(grid%lmsk) - if(allocated(grid%psfc)) deallocate(grid%psfc) - - !===================================================================== - - end subroutine finalize_fcst_model_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_givtdruv_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! givtdruv_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN givtdruv_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_givtdruv_struct(grid) - - ! Define variables passed to routine - - type(givtdruv_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%u)) deallocate(grid%u) - if(allocated(grid%v)) deallocate(grid%v) - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%level)) deallocate(grid%level) - - !===================================================================== - - end subroutine finalize_givtdruv_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_grid_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! grid_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN grid_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_grid_struct(grid) - - ! Define variables passed to routine - - type(grid_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%lat)) deallocate(grid%lat) - - !===================================================================== - - end subroutine finalize_grid_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_hsa_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! hsa_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN hsa_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_hsa_struct(grid) - - ! Define variables passed routine - - type(hsa_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%tail)) deallocate(grid%tail) - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%p)) deallocate(grid%p) - if(allocated(grid%rh)) deallocate(grid%rh) - if(allocated(grid%t)) deallocate(grid%t) - if(allocated(grid%u)) deallocate(grid%u) - if(allocated(grid%v)) deallocate(grid%v) - if(allocated(grid%z)) deallocate(grid%z) - if(allocated(grid%yymmdd)) deallocate(grid%yymmdd) - if(allocated(grid%gmt)) deallocate(grid%gmt) - if(allocated(grid%wx)) deallocate(grid%wx) - - !===================================================================== - - end subroutine finalize_hsa_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_nhcgtcm_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! nhcgtcm_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN nhcgtcm_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_nhcgtcm_struct(grid) - - ! Define variables passed routine - - type(nhcgtcm_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%u10m)) deallocate(grid%u10m) - if(allocated(grid%v10m)) deallocate(grid%v10m) - - !===================================================================== - - end subroutine finalize_nhcgtcm_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_obs_flag_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! obs_flag_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN obs_flag_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_obs_flag_struct(grid) - - ! Define variables passed routine - - type(obs_flag_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%mneumonic)) deallocate(grid%mneumonic) - if(allocated(grid%subset)) deallocate(grid%subset) - if(allocated(grid%val)) deallocate(grid%val) - if(allocated(grid%obs_type)) deallocate(grid%obs_type) - - !===================================================================== - - end subroutine finalize_obs_flag_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_remap_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! remap_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN remap_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_remap_struct(grid) - - ! Define variables passed routine - - type(remap_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%hgt)) deallocate(grid%hgt) - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%mask)) deallocate(grid%mask) - - !===================================================================== - - end subroutine finalize_remap_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_slint_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! slint_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN slint_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_slint_struct(grid) - - ! Define variables passed to routine - - type(slint_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%coeffs)) deallocate(grid%coeffs) - if(allocated(grid%nn)) deallocate(grid%nn) - - !===================================================================== - - end subroutine finalize_slint_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_spline_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! spline_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_spline_struct(grid) - - ! Define variables passed to routine - - type(spline_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%xa)) deallocate(grid%xa) - if(allocated(grid%ya)) deallocate(grid%ya) - - !===================================================================== - - end subroutine finalize_spline_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_tcm_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! tcm_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN tcm_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_tcm_struct(grid) - - ! Define variables passed routine - - type(tcm_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%psfc)) deallocate(grid%psfc) - if(allocated(grid%u)) deallocate(grid%u) - if(allocated(grid%v)) deallocate(grid%v) - - !===================================================================== - - end subroutine finalize_tcm_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_topogrid_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! topogrid_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN topogrid_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_topogrid_struct(grid) - - ! Define variables passed routine - - type(topogrid_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%topo)) deallocate(grid%topo) - - !===================================================================== - - end subroutine finalize_topogrid_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_varinfo_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! varinfo_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN varinfo_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_varinfo_struct(grid) - - ! Define variables passed to routine - - type(varinfo_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%varattrs)) deallocate(grid%varattrs) - if(allocated(grid%varname)) deallocate(grid%varname) - if(allocated(grid%vartype)) deallocate(grid%vartype) - if(allocated(grid%dimname)) deallocate(grid%dimname) - if(allocated(grid%dimval)) deallocate(grid%dimval) - if(allocated(grid%dimid)) deallocate(grid%dimid) - if(allocated(grid%vardimid)) deallocate(grid%vardimid) - if(allocated(grid%varid)) deallocate(grid%varid) - if(allocated(grid%varndims)) deallocate(grid%varndims) - if(allocated(grid%varnattrs)) deallocate(grid%varnattrs) - - !===================================================================== - - end subroutine finalize_varinfo_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_bufr_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! bufr_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN bufr_struct variable containing the variables - ! necessary to allocate and initialize the respective variable - ! arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN bufr_struct variable containing allocated and - ! initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_bufr_struct(grid) - - ! Define variables passed routine - - type(bufr_struct) :: grid - - !===================================================================== - - ! Check local variable and proceed accordingly - - if(grid%mxmn .eq. 0) grid%mxmn = bufr_mxmn - if(grid%mxlv .eq. 0) grid%mxlv = bufr_mxlv - - ! Allocate memory for local variables - - if(.not. allocated(grid%obs)) allocate(grid%obs(grid%mxmn,grid%mxlv)) - if(.not. allocated(grid%qcf)) allocate(grid%qcf(grid%mxmn,grid%mxlv)) - if(.not. allocated(grid%oer)) allocate(grid%oer(grid%mxmn,grid%mxlv)) - if(.not. allocated(grid%hdr)) allocate(grid%hdr(grid%mxmn)) - - ! Define local variables - - grid%obs = bufr_spval - grid%qcf = bufr_spval - grid%oer = bufr_spval - grid%hdr = bufr_spval - - !===================================================================== - - end subroutine initialize_bufr_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_error_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! error_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN error_struct variable containing the variables - ! necessary to allocate and initialize the respective variable - ! arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN error_struct variable containing allocated and - ! initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_error_struct(grid) - - ! Define variables passed routine - - type(error_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%plev)) allocate(grid%plev(grid%nz)) - if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) - if(.not. allocated(grid%t)) allocate(grid%t(grid%nz)) - if(.not. allocated(grid%q)) allocate(grid%q(grid%nz)) - if(.not. allocated(grid%z)) allocate(grid%z(grid%nz)) - if(.not. allocated(grid%uv)) allocate(grid%uv(grid%nz)) - - !===================================================================== - - end subroutine initialize_error_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_fcst_model_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! fcst_model_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN fcst_model_struct variable containing the - ! variables necessary to allocate and initialize the respective - ! variable arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN fcst_model_struct variable containing allocated - ! and initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_fcst_model_struct(grid) - - ! Define variables passed routine - - type(fcst_model_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%p)) allocate(grid%p(grid%nobs,grid%nz)) - if(.not. allocated(grid%q)) allocate(grid%q(grid%nobs,grid%nz)) - if(.not. allocated(grid%t)) allocate(grid%t(grid%nobs,grid%nz)) - if(.not. allocated(grid%u)) allocate(grid%u(grid%nobs,grid%nz)) - if(.not. allocated(grid%v)) allocate(grid%v(grid%nobs,grid%nz)) - if(.not. allocated(grid%z)) allocate(grid%z(grid%nobs,grid%nz)) - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nobs)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nobs)) - if(.not. allocated(grid%lmsk)) allocate(grid%lmsk(grid%nobs)) - if(.not. allocated(grid%psfc)) allocate(grid%psfc(grid%nobs)) - - !===================================================================== - - end subroutine initialize_fcst_model_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_givtdruv_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! givtdruv_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN givtdruv_struct variable containing the - ! variables necessary to allocate and initialize the respective - ! variable arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN givtdruv_struct variable containing allocated - ! and initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_givtdruv_struct(grid) - - ! Define variables passed routine - - type(givtdruv_struct) :: grid - - !===================================================================== - - ! Define local variables - - grid%ncoords = (grid%nx*grid%ny*grid%nz) - - ! Allocate memory for local variables - - if(.not. allocated(grid%u)) allocate(grid%u(grid%ncoords)) - if(.not. allocated(grid%v)) allocate(grid%v(grid%ncoords)) - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%ncoords)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%ncoords)) - if(.not. allocated(grid%level)) allocate(grid%level(grid%ncoords)) - - !===================================================================== - - end subroutine initialize_givtdruv_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_grid_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! grid_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN grid_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN grid_struct variable where all arrays are - ! allocated and initialized (when necessary). - - !----------------------------------------------------------------------- - - subroutine initialize_grid_struct(grid) - - ! Define variables passed to routine - - type(grid_struct) :: grid - - !===================================================================== - - ! Define local variables - - if(grid%ncoords .le. 0) grid%ncoords = (grid%nx*grid%ny) - - ! Allocate memory for local variables - - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%ncoords)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%ncoords)) - - !===================================================================== - - end subroutine initialize_grid_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_hsa_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! hsa_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN hsa_struct variable containing the variables - ! necessary to allocate and initialize the respective variable - ! arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN hsa_struct variable containing allocated and - ! initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_hsa_struct(grid) - - ! Define variables passed routine - - type(hsa_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%tail)) allocate(grid%tail(grid%nz)) - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nz)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nz)) - if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) - if(.not. allocated(grid%rh)) allocate(grid%rh(grid%nz)) - if(.not. allocated(grid%t)) allocate(grid%t(grid%nz)) - if(.not. allocated(grid%u)) allocate(grid%u(grid%nz)) - if(.not. allocated(grid%v)) allocate(grid%v(grid%nz)) - if(.not. allocated(grid%z)) allocate(grid%z(grid%nz)) - if(.not. allocated(grid%yymmdd)) allocate(grid%yymmdd(grid%nz)) - if(.not. allocated(grid%gmt)) allocate(grid%gmt(grid%nz)) - if(.not. allocated(grid%wx)) allocate(grid%wx(grid%nz)) - - ! Define local variables - - grid%lat = hsa_spval - grid%lon = hsa_spval - grid%p = hsa_spval - grid%rh = hsa_spval - grid%t = hsa_spval - grid%u = hsa_spval - grid%v = hsa_spval - grid%z = hsa_spval - - !===================================================================== - - end subroutine initialize_hsa_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_nhcgtcm_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory (an initializes, when necessary) - ! for all arrays within the nhcgtcm_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN nhcgtcm_struct variable containing the variables - ! necessary to allocate and initialize the respective variable - ! arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN nhcgtcm_struct variable containing allocated and - ! initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_nhcgtcm_struct(grid) - - ! Define variables passed routine - - type(nhcgtcm_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nvals)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nvals)) - if(.not. allocated(grid%u10m)) allocate(grid%u10m(grid%nvals)) - if(.not. allocated(grid%v10m)) allocate(grid%v10m(grid%nvals)) - - !===================================================================== - - end subroutine initialize_nhcgtcm_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_obs_flag_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! obs_flag_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN obs_flag_struct variable containing the - ! variables necessary to allocate and initialize the respective - ! variable arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN obs_flag_struct variable containing allocated - ! and initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_obs_flag_struct(grid) - - ! Define variables passed routine - - type(obs_flag_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%mneumonic)) & - & allocate(grid%mneumonic(grid%nflag)) - if(.not. allocated(grid%subset)) & - & allocate(grid%subset(grid%nflag)) - if(.not. allocated(grid%val)) & - & allocate(grid%val(grid%nflag)) - if(.not. allocated(grid%obs_type)) & - & allocate(grid%obs_type(grid%nflag)) - - !===================================================================== - - end subroutine initialize_obs_flag_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_remap_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! remap_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN remap_struct variable containing the variables - ! necessary to allocate and initialize the respective variable - ! arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN remap_struct variable containing allocated and - ! initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_remap_struct(grid) - - ! Define variables passed routine - - type(remap_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%hgt)) allocate(grid%hgt(grid%ncoords)) - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%ncoords)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%ncoords)) - if(.not. allocated(grid%mask)) allocate(grid%mask(grid%ncoords)) - - ! Define local variables - - grid%mask = 1.0 - - !===================================================================== - - end subroutine initialize_remap_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_slint_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! slint_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN slint_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN slint_struct variable where all arrays are - ! allocated and initialized (when necessary). - - !----------------------------------------------------------------------- - - subroutine initialize_slint_struct(grid) - - ! Define variables passed to routine - - type(slint_struct) :: grid - - !===================================================================== - - ! Define local variables - - grid%ncoeffs = 3 - - ! Allocate memory for local variables - - if(.not. allocated(grid%coeffs)) & - & allocate(grid%coeffs(grid%ncoeffs,grid%ncoords)) - if(.not. allocated(grid%nn)) & - & allocate(grid%nn(grid%ncoeffs,grid%ncoords)) - - !===================================================================== - - end subroutine initialize_slint_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_spline_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! spline_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct variable. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN spline_struct variable containing allocated - ! variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_spline_struct(grid) - - ! Define variables passed to routine - - type(spline_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%xa)) allocate(grid%xa(grid%n)) - if(.not. allocated(grid%ya)) allocate(grid%ya(grid%n)) - - !===================================================================== - - end subroutine initialize_spline_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_tcm_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! tcm_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN tcm_struct variable containing the variables - ! necessary to allocate and initialize the respective variable - ! arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN tcm_struct variable containing allocated and - ! initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_tcm_struct(grid) - - ! Define variables passed routine - - type(tcm_struct) :: grid - - !===================================================================== - - ! Define local variables - - grid%nvals = (grid%nx*grid%ny) - - ! Allocate memory for local variables - - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nvals)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nvals)) - if(.not. allocated(grid%psfc)) allocate(grid%psfc(grid%nvals)) - if(.not. allocated(grid%u)) allocate(grid%u(grid%nvals)) - if(.not. allocated(grid%v)) allocate(grid%v(grid%nvals)) - - !===================================================================== - - end subroutine initialize_tcm_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_topogrid_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! topogrid_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN topogrid_struct variable containing the - ! variables necessary to allocate and initialize the respective - ! variable arrays. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN topogrid_struct variable containing allocated - ! and initialized variable arrays. - - !----------------------------------------------------------------------- - - subroutine initialize_topogrid_struct(grid) - - ! Define variables passed routine - - type(topogrid_struct) :: grid - - !===================================================================== - - ! Define local variables - - grid%ncoords = (grid%nx*grid%ny) - - ! Allocate memory for local variables - - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%ncoords)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%ncoords)) - if(.not. allocated(grid%topo)) allocate(grid%topo(grid%ncoords)) - - !===================================================================== - - end subroutine initialize_topogrid_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_varinfo_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! varinfo_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN varinfo_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_varinfo_struct(grid) - - ! Define variables passed to routine - - type(varinfo_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%varattrs)) & - & allocate(grid%varattrs(grid%nvars,grid%nattrs,2)) - if(.not. allocated(grid%vardimid)) & - & allocate(grid%vardimid(grid%nvars,grid%ndims)) - if(.not. allocated(grid%varname)) & - & allocate(grid%varname(grid%nvars)) - if(.not. allocated(grid%vartype)) & - & allocate(grid%vartype(grid%nvars)) - if(.not. allocated(grid%varndims)) & - & allocate(grid%varndims(grid%nvars)) - if(.not. allocated(grid%varnattrs)) & - & allocate(grid%varnattrs(grid%nvars)) - if(.not. allocated(grid%varid)) & - & allocate(grid%varid(grid%nvars)) - if(.not. allocated(grid%dimval)) & - & allocate(grid%dimval(grid%ndims)) - if(.not. allocated(grid%dimname)) & - & allocate(grid%dimname(grid%ndims)) - if(.not. allocated(grid%dimid)) & - & allocate(grid%dimid(grid%ndims)) - - !===================================================================== - - end subroutine initialize_varinfo_struct - - !======================================================================= - -end module variable_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/Makefile b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/Makefile deleted file mode 100644 index 4e2b37d35..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -EXEC = ../../exec/tempdrop_sonde.x - -MODS = kinds_interface.o \ - namelist_interface.o \ - constants_interface.o \ - diagnostics_interface.o \ - variable_interface.o \ - netcdf_interface.o \ - fileio_interface.o \ - time_methods_interface.o \ - grid_methods_interface.o \ - math_methods_interface.o \ - meteo_methods_interface.o \ - tempdrop_sonde_interface.o - -SUBS = - -OBJS = $(MODS) $(SUBS) main.o - -INC = -I${TOOLS_INC} ${NETCDF_INCLUDE} ${HDF5_INCLUDE} -LIBS = -L${TOOLS_LIBDIR} -lslatec -lsondelib -lspline ${BUFR_LDFLAGS} \ - ${NETCDF_LDFLAGS} ${HDF5_LDFLAGS} ${Z_LIB} -FFLAGS += $(INC) - -$(EXEC): main.F90 $(MODS) $(SUBS) - ${FC} $(FFLAGS) main.F90 $(MODS) $(SUBS) -o $(@) $(LIBS) - -.PHONY: clean - -.SUFFIXES: .F90 .o - -clean: - rm *.o *.mod - -.F90.o: - ${FC} $(FFLAGS) -c $*.F90 diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/constants_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/constants_interface.F90 deleted file mode 100644 index e8c862f1c..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/constants_interface.F90 +++ /dev/null @@ -1,116 +0,0 @@ -module constants_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: constants_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: cp_mass - public :: deg2rad - public :: earth_omega - public :: grav - public :: grav_std - public :: pi - public :: rad2deg - public :: rd - public :: rd_over_cp_mass - public :: rearth_equator - public :: rv - - !----------------------------------------------------------------------- - - ! DESCRIPTION (alphabetized): - - ! * cp_mass; a FORTRAN 4-byte real value specifying the specific - ! heat capacity of water vapor at constant pressure; units are - ! Joules per kilogram per Kelvin. - - ! * deg2rad; a FORTRAN 4-byte real value specifying the mathematical - ! constant to convert from degrees to radians; unitless. - - ! * earth_omega; a FORTRAN 4-byte real value specifying the rotation - ! rate of the Earth; units are radians per second. - - ! * grav; a FORTRAN 4-byte real value containing the acceleration - ! due to gravity; units are meters per second per second. - - ! * grav_std; a FORTRAN 4-byte real value containing the standard - ! * gravity; units are meters per second per second. - - ! * pi; a FORTRAN 4-byte real value containing the (machine - ! precision truncated) mathematical constant for atan(-1.0); - ! unitless. - - ! * rad2deg; a FORTRAN 4-byte real value specifying the mathematical - ! constant to convert from radians to degrees; unitless. - - ! * rd; a FORTRAN 4-byte real value specifying the gas constant for - ! dry air; units are Joules per Kelvin per kilogram. - - ! * rd_over_cp_mass; a FORTRAN 4-byte real value designating the - ! ratio rd/cp_mass. - - ! * rearth_equator; a FORTRAN 4-byte real value specifying the Earth - ! equatorial radius; units are meters. - - ! * rv; a FORTRAN 4-byte real value specifying the gas constant for - ! water vapor; units are Joules per Kelvin per kilogram. - - !----------------------------------------------------------------------- - - ! Define local variables - - real(r_kind), parameter :: & - & cp_mass = 1004.67_r_kind - real(r_kind), parameter :: & - & earth_omega = 7.292115e-5_r_kind - real(r_kind), parameter :: & - & grav = 9.80665e0_r_kind - real(r_kind), parameter :: & - & grav_std = 9.80665e0_r_kind - real(r_kind), parameter :: & - & pi = acos(-1.0) - real(r_kind), parameter :: & - & deg2rad = pi/180.0_r_kind - real(r_kind), parameter :: & - & rad2deg = 1.0/deg2rad - real(r_kind), parameter :: & - & rd = 2.8705e2_r_kind - real(r_kind), parameter :: & - & rd_over_cp_mass = rd/cp_mass - real(r_kind), parameter :: & - & rearth_equator = 6.37813662e6_r_kind - real(r_kind), parameter :: & - & rv = 4.6150e2_r_kind - - !======================================================================= - -end module constants_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/diagnostics_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/diagnostics_interface.F90 deleted file mode 100644 index c56c85a9a..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/diagnostics_interface.F90 +++ /dev/null @@ -1,153 +0,0 @@ -module diagnostics_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: diagnostics_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: diagnostics_time_start - public :: diagnostics_time_stop - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! diagnostics_time_start.f90 - - ! DESCRIPTION: - - ! This subroutine calls the intrinsic subroutine cpu_time and - ! defines the elapsed CPU time in seconds. - - ! INPUT VARIABLES: - - ! * time_start; a FORTRAN 4-byte real value. - - ! OUTPUT VARIABLES: - - ! * time_start; a FORTRAN 4-byte real value specifying the elapsed - ! CPU time; units are seconds. - - !----------------------------------------------------------------------- - - subroutine diagnostics_time_start(time_start) - - ! Define variables passed to routine - - real(r_kind) :: time_start - - !===================================================================== - - ! Define local variables - - call cpu_time(time_start) - - !===================================================================== - - end subroutine diagnostics_time_start - - !======================================================================= - - ! SUBROUTINE: - - ! diagnostics_time_stop.f90 - - ! DESCRIPTION: - - ! This subroutine computes the total time since the user specified - ! starting time and prints a message indicating the time in - ! accordance with the optional variables provided by the user. - - ! INPUT VARIABLES: - - ! * time_start; a FORTRAN 4-byte real specifying the value returned - ! by subroutine diagnostics_time_start.f90. - - ! OPTIONAL INPUT VARIABLES: - - ! * caller_name; a FORTRAN character string defining the calling - ! subroutine/function name/ - - !----------------------------------------------------------------------- - - subroutine diagnostics_time_stop(time_start,caller_name) - - ! Define variables passed to routine - - character(len=*), optional :: caller_name - real(r_kind) :: time_start - - ! Define variables computed within routine - - real(r_kind) :: time_stop - - !===================================================================== - - ! Define local variables - - call cpu_time(time_stop) - - ! Check local variable and proceed accordingly - - if(.not. present(caller_name)) then - - ! Define local variables - - write(6,500) (time_stop - time_start) - - end if ! if(.not. present(caller_name)) - - ! Check local variable and proceed accordingly - - if(present(caller_name)) then - - ! Define local variables - - write(6,501) trim(adjustl(caller_name)), (time_stop - time_start) - - end if ! if(present(caller_name) - - ! Define local variables - -500 format('Execution time: ', f13.5, ' seconds.') -501 format('Time spent in routine ', a, ': ', f13.5, ' seconds.') - - !===================================================================== - - end subroutine diagnostics_time_stop - - !======================================================================= - -end module diagnostics_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/fileio_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/fileio_interface.F90 deleted file mode 100644 index 7de46c23e..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/fileio_interface.F90 +++ /dev/null @@ -1,470 +0,0 @@ -module fileio_interface - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! tempdrop-sonde :: fileio_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use netcdf - use netcdf_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: fileio_interface_read - public :: fileio_interface_write - public :: nfiles - public :: sonde_filename - interface fileio_interface_read - module procedure read_sonde_filenames - end interface fileio_interface_read - interface fileio_interface_varinfo - module procedure varinfo_meteo - end interface fileio_interface_varinfo - interface fileio_interface_write - module procedure write_meteo_output - end interface fileio_interface_write - - ! Define local variables - - character(len=500), dimension(:), allocatable :: sonde_filename - integer :: nfiles - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! read_sonde_filenames.f90 - - ! DESCRIPTION: - - ! This subroutine defines the global variables 'nfiles' and - ! 'sonde_filename' array. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string containing the list of - ! TEMPDROP sonde filename pathes. - - !----------------------------------------------------------------------- - - subroutine read_sonde_filenames(filename) - - ! Define variables passed to routine - - character(len=500) :: filename - - ! Define variables computed within routine - - character(len=500) :: dummy - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - nfiles = 0 - open(99,file=trim(adjustl(filename)),form='formatted') -1000 read(99,*,end=1001) dummy - nfiles = nfiles + 1 - goto 1000 -1001 continue - close(99) - - ! Allocate memory for local variables - - if(.not. allocated(sonde_filename)) allocate(sonde_filename(nfiles)) - - ! Define local variables - - open(99,file=trim(adjustl(filename)),form='formatted') - - ! Loop through local variable - - do i = 1, nfiles - - ! Define local variables - - read(99,*) sonde_filename(i) - - end do ! do i = 1, nfiles - - ! Define local variables - - close(99) - - !===================================================================== - - end subroutine read_sonde_filenames - - !======================================================================= - - ! SUBROUTINE: - - ! varinfo_meteo.f90 - - ! DESCRIPTION: - - ! This subroutine defines the FORTRAN varinfo_struct variable used - ! to write the appropriate variables contained within the FORTRAN - ! meteo_struct variable to external file formats. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable. - - ! * varinfo; a FORTRAN varinfo_struct variable specifying the - ! appropriate fields for external file formats. - - ! OUTPUT VARIABLES: - - ! * varinfo; a FORTRAN varinfo_struct variable specifying the - ! appropriate fields for external file formats. - - !----------------------------------------------------------------------- - - subroutine varinfo_meteo(grid,varinfo) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - type(varinfo_struct) :: varinfo - - ! Define variables computed within routine - - character(len=10), dimension(:), allocatable :: dimname - integer, dimension(:), allocatable :: dimval - integer, dimension(:), allocatable :: dimid - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - varinfo%ndims = 1 - varinfo%nvars = 14 - varinfo%nattrs = 2 - call variable_interface_setup_struct(varinfo) - - ! Allocate memory for local variables - - if(.not. allocated(dimname)) allocate(dimname(varinfo%ndims)) - if(.not. allocated(dimval)) allocate(dimval(varinfo%ndims)) - if(.not. allocated(dimid)) allocate(dimid(varinfo%ndims)) - - ! Define local variables - - dimname(1) = 'nz' - dimval(1) = grid%nz - - ! Loop through local variable - - do i = 1, varinfo%ndims - - ! Define local variables - - varinfo%dimval(i) = dimval(i) - varinfo%dimname(i) = dimname(i) - dimid(i) = i - - end do ! do i = 1, varinfo%ndims - - ! Define local variables - - varinfo%varattrs(1,1,1) = 'title' - varinfo%varattrs(1,1,2) = 'Dewpoint Temperature' - varinfo%varattrs(1,2,1) = 'units' - varinfo%varattrs(1,2,2) = 'Kelvin' - varinfo%varname(1) = 'dwpt' - varinfo%varndims(1) = 1 - varinfo%varnattrs(1) = 2 - varinfo%vartype(1) = 'double' - varinfo%vardimid(1,1) = dimid(1) - varinfo%varattrs(2,1,1) = 'title' - varinfo%varattrs(2,1,2) = 'Latitude' - varinfo%varattrs(2,2,1) = 'units' - varinfo%varattrs(2,2,2) = 'degrees' - varinfo%varname(2) = 'lat' - varinfo%varndims(2) = 1 - varinfo%varnattrs(2) = 2 - varinfo%vartype(2) = 'double' - varinfo%vardimid(2,1) = dimid(1) - varinfo%varattrs(3,1,1) = 'title' - varinfo%varattrs(3,1,2) = 'Longitude' - varinfo%varattrs(3,2,1) = 'units' - varinfo%varattrs(3,2,2) = 'degrees' - varinfo%varname(3) = 'lon' - varinfo%varndims(3) = 1 - varinfo%varnattrs(3) = 2 - varinfo%vartype(3) = 'double' - varinfo%vardimid(3,1) = dimid(1) - varinfo%varattrs(4,1,1) = 'title' - varinfo%varattrs(4,1,2) = 'Pressure' - varinfo%varattrs(4,2,1) = 'units' - varinfo%varattrs(4,2,2) = 'Pascals' - varinfo%varname(4) = 'p' - varinfo%varndims(4) = 1 - varinfo%varnattrs(4) = 2 - varinfo%vartype(4) = 'double' - varinfo%vardimid(4,1) = dimid(1) - varinfo%varattrs(5,1,1) = 'title' - varinfo%varattrs(5,1,2) = 'Water Vapor Mixing Ratio' - varinfo%varattrs(5,2,1) = 'units' - varinfo%varattrs(5,2,2) = 'kilograms per kilogram' - varinfo%varname(5) = 'q' - varinfo%varndims(5) = 1 - varinfo%varnattrs(5) = 2 - varinfo%vartype(5) = 'double' - varinfo%vardimid(5,1) = dimid(1) - varinfo%varattrs(6,1,1) = 'title' - varinfo%varattrs(6,1,2) = 'Relative Humidity' - varinfo%varattrs(6,2,1) = 'units' - varinfo%varattrs(6,2,2) = '%' - varinfo%varname(6) = 'rh' - varinfo%varndims(6) = 1 - varinfo%varnattrs(6) = 2 - varinfo%vartype(6) = 'double' - varinfo%vardimid(6,1) = dimid(1) - varinfo%varattrs(7,1,1) = 'title' - varinfo%varattrs(7,1,2) = 'Temperature' - varinfo%varattrs(7,2,1) = 'units' - varinfo%varattrs(7,2,2) = 'Kelvin' - varinfo%varname(7) = 't' - varinfo%varndims(7) = 1 - varinfo%varnattrs(7) = 2 - varinfo%vartype(7) = 'double' - varinfo%vardimid(7,1) = dimid(1) - varinfo%varattrs(8,1,1) = 'title' - varinfo%varattrs(8,1,2) = 'Zonal Wind' - varinfo%varattrs(8,2,1) = 'units' - varinfo%varattrs(8,2,2) = 'meters per second' - varinfo%varname(8) = 'u' - varinfo%varndims(8) = 1 - varinfo%varnattrs(8) = 2 - varinfo%vartype(8) = 'double' - varinfo%vardimid(8,1) = dimid(1) - varinfo%varattrs(9,1,1) = 'title' - varinfo%varattrs(9,1,2) = 'Meridional Wind' - varinfo%varattrs(9,2,1) = 'units' - varinfo%varattrs(9,2,2) = 'meters per second' - varinfo%varname(9) = 'v' - varinfo%varndims(9) = 1 - varinfo%varnattrs(9) = 2 - varinfo%vartype(9) = 'double' - varinfo%vardimid(9,1) = dimid(1) - varinfo%varattrs(10,1,1) = 'title' - varinfo%varattrs(10,1,2) = 'Wind Direction' - varinfo%varattrs(10,2,1) = 'units' - varinfo%varattrs(10,2,2) = 'degrees from North' - varinfo%varname(10) = 'wdir' - varinfo%varndims(10) = 1 - varinfo%varnattrs(10) = 2 - varinfo%vartype(10) = 'double' - varinfo%vardimid(10,1) = dimid(1) - varinfo%varattrs(11,1,1) = 'title' - varinfo%varattrs(11,1,2) = 'Wind Speed Magnitude' - varinfo%varattrs(11,2,1) = 'units' - varinfo%varattrs(11,2,2) = 'meters per second' - varinfo%varname(11) = 'wspd' - varinfo%varndims(11) = 1 - varinfo%varnattrs(11) = 2 - varinfo%vartype(11) = 'double' - varinfo%vardimid(11,1) = dimid(1) - varinfo%varattrs(12,1,1) = 'title' - varinfo%varattrs(12,1,2) = 'Geometric Height' - varinfo%varattrs(12,2,1) = 'units' - varinfo%varattrs(12,2,2) = 'meters' - varinfo%varname(12) = 'z' - varinfo%varndims(12) = 1 - varinfo%varnattrs(12) = 2 - varinfo%vartype(12) = 'double' - varinfo%vardimid(12,1) = dimid(1) - varinfo%varattrs(13,1,1) = 'title' - varinfo%varattrs(13,1,2) = 'Julian Date' - varinfo%varattrs(13,2,1) = 'units' - varinfo%varattrs(13,2,2) = 'Number of days since commencement of Julian calendar' - varinfo%varname(13) = 'jdate' - varinfo%varndims(13) = 1 - varinfo%varnattrs(13) = 2 - varinfo%vartype(13) = 'double' - varinfo%vardimid(13,1) = dimid(1) - varinfo%varattrs(14,1,1) = 'title' - varinfo%varattrs(14,1,2) = 'Surface Pressure' - varinfo%varattrs(14,2,1) = 'units' - varinfo%varattrs(14,2,2) = 'Pascals' - varinfo%varname(14) = 'psfc' - varinfo%varndims(14) = 0 - varinfo%varnattrs(14) = 2 - varinfo%vartype(14) = 'double' - - ! Deallocate memory for local variables - - if(allocated(dimname)) deallocate(dimname) - if(allocated(dimval)) deallocate(dimval) - if(allocated(dimid)) deallocate(dimid) - - !===================================================================== - - end subroutine varinfo_meteo - - !======================================================================= - - ! SUBROUTINE: - - ! write_meteo_output.f90 - - ! DESCRIPTION: - - ! This subroutine writes the contents of the FORTRAN meteo_struct - ! variable to an external Network Common Data Format (netCDF) file. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable. - - ! * filename; a FORTRAN character string containing the full-path to - ! the netCDF file to be created. - - !----------------------------------------------------------------------- - - subroutine write_meteo_output(grid,filename) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - character(len=500) :: filename - - ! Define variables computed within routine - - type(varinfo_struct) :: varinfo - real(r_double), dimension(:,:), allocatable :: work - real(r_kind) :: time_start - integer :: n1dv - integer :: n0dv - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - call fileio_interface_varinfo(grid,varinfo) - call netcdf_interface_open(filename,.false.,.false.,.true.) - ncstatus = nf90_put_att(ncfileid,nf90_global,'aircraft_id',grid%acid) - ncstatus = nf90_put_att(ncfileid,nf90_global,'obs_number',grid%obnum) - ncstatus = nf90_put_att(ncfileid,nf90_global,'tempdrop_file', & - & trim(adjustl(grid%tempdrop_name))) - ncstatus = nf90_put_att(ncfileid,nf90_global,'_FillValue',spval) - call netcdf_interface_writedef(varinfo) - n1dv = 13 - n0dv = 1 - - ! Allocate memory for local variables - - if(.not. allocated(work)) allocate(work(n1dv,grid%nz)) - - ! Define local variables - - work(1,:) = grid%dwpt - work(2,:) = grid%lat - work(3,:) = grid%lon - work(4,:) = grid%p - work(5,:) = grid%q - work(6,:) = grid%rh - work(7,:) = grid%t - work(8,:) = grid%u - work(9,:) = grid%v - work(10,:) = grid%wdir - work(11,:) = grid%wspd - work(12,:) = grid%z - work(13,:) = grid%jdate - - ! Loop through local variable - - do i = 1, n1dv - - ! Define local variables - - ncstatus = nf90_put_var(ncfileid,varinfo%varid(i),work(i,:)) - - end do ! do i = 1, n1dv - - ! Deallocate memory for local variables - - if(allocated(work)) deallocate(work) - - ! Allocate memory for local variables - - if(.not. allocated(work)) allocate(work(n0dv,1)) - - ! Define local variables - - work(1,1) = grid%psfc - - ! Loop through local variable - - do i = 1, n0dv - - ! Define local variables - - ncstatus = nf90_put_var(ncfileid,varinfo%varid(n1dv+i),work(i,1)) - - end do ! do i = 1, n0dv - - ! Deallocate memory for local variables - - if(allocated(work)) deallocate(work) - call variable_interface_cleanup_struct(varinfo) - - ! Define local variables - - call netcdf_interface_close() - - !===================================================================== - - end subroutine write_meteo_output - - !======================================================================= - -end module fileio_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/grid_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/grid_methods_interface.F90 deleted file mode 100644 index ed3b9f844..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/grid_methods_interface.F90 +++ /dev/null @@ -1,117 +0,0 @@ -module grid_methods_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: grid_methods_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use constants_interface - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: grid_methods_gcgeo - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! grid_methods_gcgeo.f90 - - ! DESCRIPTION: - - ! This subroutine computes the longitude and latitude (e.g., - ! geographical) coordinates, assuming a great-circle distance, of an - ! advected position provided an initial geographical position - ! (defined by the longitude and latitude coordinates) and a distance - ! and heading. - - ! REFERENCES: - - ! http://www.edwilliams.org/avform.htm - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN grid_struct variable containing the initial - ! geographical position (lon and lat) and the heading (head; - ! degrees) and distance (dist; meters); all geographical position - ! units are assumed to be degrees. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN grid_struct variable containing the newly - ! computed geographical position (lon and lat). - - !----------------------------------------------------------------------- - - subroutine grid_methods_gcgeo(grid) - - ! Define variables passed to routine - - type(grid_struct) :: grid - - ! Define variables computed within routine - - real(r_kind) :: lon - real(r_kind) :: lat - real(r_kind) :: dlon - real(r_kind) :: head - real(r_kind) :: dist - - !===================================================================== - - ! Define local variables - - lat = grid%lat*deg2rad - lon = grid%lon*deg2rad - head = grid%head*deg2rad - dist = (grid%dist/rearth_equator) - - ! Compute local variables - - lat = asin(sin(lat)*cos(dist) + cos(lat)*sin(dist)*cos(head)) - dlon = atan2(sin(head)*sin(dist)*cos(lat),cos(dist) - sin(lat)* & - & sin(lat)) - lon = mod(lon - dlon + pi, 2.0*pi) - pi - - ! Define local variables - - grid%lon = lon*rad2deg - grid%lat = lat*rad2deg - - !===================================================================== - - end subroutine grid_methods_gcgeo - - !======================================================================= - -end module grid_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/kinds_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/kinds_interface.F90 deleted file mode 100644 index ee7bf1108..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/kinds_interface.F90 +++ /dev/null @@ -1,119 +0,0 @@ -module kinds_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: kinds_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: default_integer - public :: default_real - public :: i_byte - public :: i_kind - public :: i_llong - public :: i_long - public :: i_short - public :: num_bytes_for_i_byte - public :: num_bytes_for_i_kind - public :: num_bytes_for_i_llong - public :: num_bytes_for_i_long - public :: num_bytes_for_i_short - public :: num_bytes_for_r_double - public :: num_bytes_for_r_quad - public :: num_bytes_for_r_kind - public :: num_bytes_for_r_single - public :: r_double - public :: r_kind - public :: r_quad - public :: r_single - - !----------------------------------------------------------------------- - - ! Define local variables - - integer, parameter :: & - & default_integer = 3 - integer, parameter :: & - & default_real = 1 - integer, parameter :: & - & llong_t = selected_int_kind(16) - integer, parameter :: & - & num_bytes_for_i_byte = 1 - integer, parameter :: & - & num_bytes_for_i_short = 2 - integer, parameter :: & - & num_bytes_for_i_long = 4 - integer, parameter :: & - & num_bytes_for_i_llong = 8 - integer, parameter :: & - & num_i_kinds = 4 - integer, dimension(num_i_kinds), parameter :: & - & integer_byte_sizes = & - & (/num_bytes_for_i_byte,num_bytes_for_i_short, & - & num_bytes_for_i_long,num_bytes_for_i_llong/) - integer, parameter :: & - & num_bytes_for_i_kind = integer_byte_sizes(default_integer) - integer, parameter :: & - & i_byte = selected_int_kind(1) - integer, parameter :: & - & i_short = selected_int_kind(4) - integer, parameter :: & - & i_long = selected_int_kind(8) - integer, parameter :: & - & i_llong = max(llong_t,i_long) - integer, dimension(num_i_kinds), parameter :: & - & integer_types = (/i_byte,i_short,i_long,i_llong/) - integer, parameter :: & - & i_kind = integer_byte_sizes(default_integer) - integer, parameter :: & - & num_r_kinds = 3 - integer, parameter :: & - & r_single = selected_real_kind(6) - integer, parameter :: & - & r_double = selected_real_kind(15) - integer, parameter :: & - & quad_t = selected_real_kind(20) - integer, parameter :: & - & r_quad = max(quad_t,r_double) - integer, parameter :: & - & num_bytes_for_r_single = 4 - integer, parameter :: & - & num_bytes_for_r_double = 8 - integer, parameter :: & - & num_bytes_for_r_quad = 16 - integer, dimension(num_r_kinds), parameter :: & - & real_kinds = (/r_single,r_double,r_quad/) - integer, dimension(num_r_kinds), parameter :: & - & real_byte_sizes = (/num_bytes_for_r_single, & - & num_bytes_for_r_double,num_bytes_for_r_quad/) - integer, parameter :: & - & r_kind = real_kinds(default_real) - integer, parameter :: & - & num_bytes_for_r_kind = real_byte_sizes(default_real) - - !======================================================================= - -end module kinds_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/main.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/main.F90 deleted file mode 100644 index d13107d5b..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/main.F90 +++ /dev/null @@ -1,48 +0,0 @@ -program tempdrop_sonde_main - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! tempdrop-sonde :: tempdrop_sonde_main - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use tempdrop_sonde_interface - - ! Define interfaces and attributes for module routines - - implicit none - - !======================================================================= - - ! Compute local variables - - call tempdrop_sonde() - - !======================================================================= - -end program tempdrop_sonde_main diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/math_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/math_methods_interface.F90 deleted file mode 100644 index 0162be83f..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/math_methods_interface.F90 +++ /dev/null @@ -1,679 +0,0 @@ -module math_methods_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: math_methods_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: math_methods_llp_interp - public :: math_methods_normalize_values - public :: math_methods_remove_duplicates - public :: math_methods_sort_array - public :: math_methods_spline_interp - public :: math_methods_stats - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! init_stats.f90 - - ! DESCRIPTION: - - ! This subroutine initializes a statgrid_struct variable. - - ! INPUT VARIABLES: - - ! * statgrid; an uninitialized FORTRAN statgrid_struct variable. - - ! OUTPUT VARIABLES: - - ! * statgrid; an initialized FORTRAN statgrid_struct variable. - - !----------------------------------------------------------------------- - - subroutine init_stats(statgrid) - - ! Define variables passed to routine - - type(statgrid_struct) :: statgrid - - !===================================================================== - - ! Define local variables - - statgrid%varmin = spval - statgrid%varmax = spval - statgrid%mean = spval - statgrid%vari = spval - statgrid%nvals = 0 - - !===================================================================== - - end subroutine init_stats - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_llp_interp.f90 - - ! DESCRIPTION: - - ! This subroutine interpolates a vertical profile from a source - ! profile to a destination profile using linear-log pressure - ! interpolation. - - ! INPUT VARIABLES: - - ! * interp_p; a FORTRAN interp_p_struct variable containing the - ! source pressure and variable profiles as well as the surface - ! pressure. - - ! * dstp; a FORTRAN 4-byte real value specifying the pressure level - ! for which to interpolate the respective source profile variable. - - ! OUTPUT VARIABLES: - - ! * dstvar; a FORTRAN 4-byte real value specifying the interpolated - ! profile variable value. - - !----------------------------------------------------------------------- - - subroutine math_methods_llp_interp(interp_p,dstp,dstvar) - - ! Define variables passed to routine - - type(interp_p_struct) :: interp_p - real(r_kind) :: dstp - real(r_kind) :: dstvar - - ! Define variables computed within routine - - integer :: idx_b - integer :: idx_t - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - dstvar = spval - idx_b = 0 - idx_t = 0 - - ! Loop through local variable - - do i = 2, interp_p%nz - - ! Check local variable and proceed accordingly - - if(dstp .le. interp_p%p(i-1) .and. dstp .gt. interp_p%p(i)) then - - ! Define local variables - - idx_b = i - 1 - idx_t = i - goto 1000 - - end if ! if(dstp .le. interp_p%p(i-1) .and. dstp - ! .gt. interp_p%p(i)) - - end do ! do i = 2, interp_p%nz - - ! Define local variables - -1000 continue - - ! Check local variable and proceed accordingly - - if(idx_b .eq. 0 .and. idx_t .eq. 0) then - - ! Define local variables - - idx_b = interp_p%nz - idx_t = 1 - - end if ! if(idx_b .eq. 0 .and. idx_t .eq. 0) - - ! Compute local variables - - dstvar = interp_p%var(idx_b) + (interp_p%var(idx_t) - & - & interp_p%var(idx_b))*((log(dstp) - log(interp_p%p(idx_b)))/ & - & (log(interp_p%p(idx_t)) - log(interp_p%p(idx_b)))) - - !===================================================================== - - end subroutine math_methods_llp_interp - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_normalize_values.f90 - - ! DESCRIPTION: - - ! This subroutine normalizes a variable array relative to the - ! respective variables attributes. - - ! REFERENCES: - - ! https://en.wikipedia.org/wiki/Feature_scaling - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN statgrid_struct variable containing the variable - ! array to be normalized. - - ! * norma; the minumum value about which to standardize the array. - - ! * normb; the maximum value about which to standardize the array. - - !----------------------------------------------------------------------- - - subroutine math_methods_normalize_values(grid,norma,normb) - - ! Define variables passed to routine - - type(statgrid_struct) :: grid - real(r_kind) :: norma - real(r_kind) :: normb - - ! Define variables computed within routine - - real(r_kind), dimension(:), allocatable :: var - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(var)) allocate(var(grid%n)) - - ! Compute local variables - - call math_methods_stats(grid) - - ! Loop through local variable - - do i = 1, grid%n - - ! Compute local variables - - var(i) = norma + (((grid%var(i) - grid%varmin)*(normb - norma))/ & - & (grid%varmax - grid%varmin)) - - end do ! do i = 1, grid%n - - ! Define local variables - - grid%var = var - - ! Deallocate memory for local variables - - if(allocated(var)) deallocate(var) - - !===================================================================== - - end subroutine math_methods_normalize_values - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_remove_duplicates.f90 - - ! DESCRIPTION: - - ! This subroutine ingests a FORTRAN interp_spline_struct variable - ! and removes duplicate values from the independent variable array. - - ! INPUT VARIABLES: - - ! * grid_in; a FORTRAN interp_spline_struct variable containing - ! possible duplicate values within the independent variable array, - ! xa. - - ! * grid_out; a FORTRAN interp_spline_struct variable to contain the - ! ingested interp_spline_struct variable grid_in, but devoid of - ! duplicate values. - - ! OUTPUT VARIABLES: - - ! * grid_out; a FORTRAN interp_spline_struct variable, initialized - ! as grid_in but no longer containing duplicate values within the - ! independent variable array, xa. - - !----------------------------------------------------------------------- - - subroutine math_methods_remove_duplicates(grid_in,grid_out) - - ! Define variables passed to routine - - type(interp_spline_struct) :: grid_in - type(interp_spline_struct) :: grid_out - - ! Define variables computed within routine - - logical, dimension(:), allocatable :: mask - integer :: num - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(mask)) allocate(mask(grid_in%n)) - - ! Define local variables - - mask = .false. - - ! Loop through local variable - - do i = 1, grid_in%n - - ! Define local variables - - num = count(grid_in%xa(i)==grid_in%xa) - - ! Check local variable and proceed accordingly - - if(num == 1) then - - ! Define local variables - - mask(i) = .true. - - else ! if(num == 1) - - ! Check local variable and proceed accordingly - - if(.not. any(grid_in%xa(i)==grid_in%xa .and. mask)) then - - ! Define local variables - - mask(i) = .true. - - end if ! if(.not. any(grid_in%xa(i)==grid_in%xa .and. mask)) - - end if ! if(num == 1) - - end do ! do i = 1, grid_in%n - - ! Define local variables - - grid_out%n = count(mask) - call variable_interface_setup_struct(grid_out) - grid_out%xa = pack(grid_in%xa,mask) - grid_out%ya = pack(grid_in%ya,mask) - - ! Deallocate memory for local variables - - if(allocated(mask)) deallocate(mask) - - !===================================================================== - - end subroutine math_methods_remove_duplicates - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_sort_array.f90 - - ! DESCRIPTION: - - ! This subroutine implements the SLATEC ssort routine to sort a - ! dependent array (ya) relative to a sorted independent array (xa); - ! the arrays may be sorted in either the ascending or descending - ! direction. - - ! REFERENCES: - - ! Singleton, R.C., 1969. Algorithm 347: an efficient algorithm for - ! sorting with minimal storage [M1]. Communications of the ACM, - ! 12(3), pp.185-186. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN interp_spline_struct containing the independent - ! (xa) and dependent (ya) variable arrays to be sorted. - - ! * ascend; a FORTRAN logical variable specifying whether the arrays - ! are to be sorted in the ascending direction. - - ! * descend; a FORTRAN logical variable specifying whether the - ! arrays are to be sorted in the descending direction. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN interp_spline_struct containing the sorted - ! independent (xa) and dependent (ya) variable arrays. - - !----------------------------------------------------------------------- - - subroutine math_methods_sort_array(grid,ascend,descend) - - ! Define variables passed to routine - - type(interp_spline_struct) :: grid - logical :: ascend - logical :: descend - - ! Define variables computed within routine - - real(r_kind), dimension(:), allocatable :: xa - real(r_kind), dimension(:), allocatable :: ya - integer :: kflag - integer :: n - - !===================================================================== - - ! Check local variable and proceed accordingly - - if(ascend) kflag = 2 - if(descend) kflag = -2 - - ! Define local variables - - n = grid%n - - ! Check local variable and proceed accordingly - - if(n .ge. 2) then - - ! Allocate memory for local variables - - if(.not. allocated(xa)) allocate(xa(n)) - if(.not. allocated(ya)) allocate(ya(n)) - - ! Define local variables - - xa = grid%xa - ya = grid%ya - call ssort(xa,ya,n,kflag) - grid%xa = xa - grid%ya = ya - - ! Deallocate memory for local variables - - if(allocated(xa)) deallocate(xa) - if(allocated(ya)) deallocate(ya) - - end if ! if(n .ge. 2) - - !===================================================================== - - end subroutine math_methods_sort_array - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_spline_interp.f90 - - ! DESCRIPTION: - - ! This subroutine interpolates, using cubic splines, to find the - ! value of a variable at a location specified by the user; this - ! subroutine implements the sort2 subroutine of SLATEC and the - ! spline_cubic_set and spline_cubic_val subroutines of SPLINE. - - ! REFERENCES: - - ! de Boor, C., 1978: A practical guide to splines. Springer-Verlag, - ! 346pp. - - ! https://people.sc.fsu.edu/~jburkardt/f_src/spline/spline.html - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN interp_spline_struct containing the location - ! (xa) and variable (ya) arrays as well as the interpolation - ! location (x). - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN interp_spline_struct containing the interpolated - ! value (y). - - !----------------------------------------------------------------------- - - subroutine math_methods_spline_interp(grid) - - ! Define variables passed to routine - - type(interp_spline_struct) :: grid - - ! Define variables computed within routine - - type(interp_spline_struct) :: gridl - real(r_double), dimension(:), allocatable :: xa - real(r_double), dimension(:), allocatable :: ya - real(r_double), dimension(:), allocatable :: y2a - real(r_double) :: yp - real(r_double) :: ypp - real(r_double) :: yp1 - real(r_double) :: ypn - real(r_double) :: x - real(r_double) :: y - integer :: n - - !===================================================================== - - ! Define local variables - - call math_methods_remove_duplicates(grid,gridl) - x = dble(grid%x) - n = gridl%n - - ! Allocate memory for local variables - - if(.not. allocated(xa)) allocate(xa(n)) - if(.not. allocated(ya)) allocate(ya(n)) - if(.not. allocated(y2a)) allocate(y2a(n)) - - ! Check local variable and proceed accordingly - - if(gridl%n .ge. 2) then - - ! Define local variables - - call math_methods_sort_array(gridl,.true.,.false.) - yp1 = dble(0.0) - ypn = dble(0.0) - xa = dble(gridl%xa) - ya = dble(gridl%ya) - - ! Compute local variables - - call spline_cubic_set(n,xa(1:n),ya(1:n),3,yp1,3,ypn,y2a) - call spline_cubic_val(n,xa(1:n),ya(1:n),y2a(1:n),x,y,yp,ypp) - - end if ! if(gridl%n .ge. 2) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(gridl) - if(allocated(xa)) deallocate(xa) - if(allocated(ya)) deallocate(ya) - if(allocated(y2a)) deallocate(y2a) - - ! Define local variables - - grid%y = real(y) - - !===================================================================== - - end subroutine math_methods_spline_interp - - !======================================================================= - - ! SUBROUTINE: - - ! math_methods_stats.f90 - - ! DESCRIPTION: - - ! This subroutine defines/computes the attributes of a variable - ! array and returns the respective attibutes. - - ! INPUT VARIABLES: - - ! * statgrid; a FORTRAN statgrid_struct variable. - - ! OUTPUT VARIABLES: - - ! * statgrid; a FORTRAN statgrid_struct variable. - - !----------------------------------------------------------------------- - - subroutine math_methods_stats(statgrid) - - ! Define variables passed to routine - - type(statgrid_struct) :: statgrid - - ! Define variables computed within routine - - real(r_kind) :: sum - real(r_kind) :: sumsq - real(r_kind) :: varmin - real(r_kind) :: varmax - integer :: count - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - call init_stats(statgrid) - varmin = spval - varmax = -spval - sum = 0.0 - count = 0 - - ! Loop through local variable - - do i = 1, statgrid%n - - ! Check local variable and proceed accordingly - - if(statgrid%var(i) .ne. spval) then - - ! Define local variables - - varmin = min(varmin,statgrid%var(i)) - varmax = max(varmax,statgrid%var(i)) - - ! Compute local variables - - sum = sum + statgrid%var(i) - count = count + 1 - - end if ! if(vargrid%var(i) .ne. spval) - - end do ! do i = 1, statgrid%n - - ! Check local variable and proceed accordingly - - if(abs(varmax) .eq. spval) varmax = spval - if(varmin .ne. spval) statgrid%varmin = varmin - if(varmax .ne. spval) statgrid%varmax = varmax - if(count .gt. 0) statgrid%mean = sum/real(count) - if(statgrid%mean .ne. spval) then - - ! Define local variables - - sum = 0.0 - sumsq = 0.0 - - ! Loop through local variable - - do i = 1, statgrid%n - - ! Check local variable and proceed accordingly - - if(statgrid%var(i) .ne. spval) then - - ! Compute local variables - - sum = sum + (statgrid%var(i) - statgrid%mean) - sumsq = sumsq + ((statgrid%var(i) - statgrid%mean)* & - & (statgrid%var(i) - statgrid%mean)) - - end if ! if(statgrid%var(i) .ne. spval) - - end do ! do i = 1, statgrid%n - - ! Check local variable and proceed accordingly - - if(count .gt. 1) then - - ! Compute local variables - - statgrid%vari = (sumsq - (sum*sum)/count)/(count - 1) - statgrid%stdev = sqrt(statgrid%vari) - - end if ! if(count .gt. 1) - - end if ! if(statgrid%mean .ne. spval) - - ! Define local variables - - statgrid%nvals = count - - !===================================================================== - - end subroutine math_methods_stats - - !======================================================================= - -end module math_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/meteo_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/meteo_methods_interface.F90 deleted file mode 100644 index 3eb3e342f..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/meteo_methods_interface.F90 +++ /dev/null @@ -1,463 +0,0 @@ -module meteo_methods_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: meteo_methods_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use constants_interface - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: meteo_methods_dwpttemp - public :: meteo_methods_geolatdist - public :: meteo_methods_pottemp - public :: meteo_methods_vpottemp - public :: meteo_methods_wspdwdir - public :: meteo_methods_wvmxrt - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_dwpttemp.f90 - - ! DESCRIPTION: - - ! This subroutine computes the dewpoint temperature (dwpt; Kelvin) - ! from the temperture (t; Kelvin) and relative humidity (rh; - ! percentage) profiles. - - ! REFERENCES: - - ! http://andrew.rsmas.miami.edu/bmcnoldy/humidity_conversions.pdf - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the temperature - ! (t; Kelvin) and relative humidity (rh; percentage) profiles. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the dewpoint - ! temperature (dwpt; Kelvin) profile. - - !----------------------------------------------------------------------- - - subroutine meteo_methods_dwpttemp(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - ! Define variables computed within routine - - real(r_double) :: a - real(r_double) :: b - real(r_double) :: abt - real(r_double) :: lrhp - real(r_double) :: svpt0 - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - a = dble(17.625) - b = dble(243.04) - svpt0 = dble(273.15) - grid%dwpt = spval - - ! Loop through local variable - - do i = 1, grid%nz - - ! Check local variable and proceed accordingly - - if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) then - - ! Compute local variables - - abt = (a*(grid%t(i) - svpt0))/(b + (grid%t(i) - svpt0)) - lrhp = log(grid%rh(i)/dble(100.0)) - grid%dwpt(i) = (b*(lrhp + abt))/(a - lrhp - abt) + svpt0 - - end if ! if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) - - end do ! do i = 1, grid%nz - - !===================================================================== - - end subroutine meteo_methods_dwpttemp - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_geolatdist.f90 - - ! DESCRIPTION: - - ! This subroutine computes the zonal- and meridional-displacement - ! (dx and dy, respectively) as a function of latitude. - - ! INPUT VARIABLES: - - ! * lat; a FORTRAN 4-byte real value specifying the latitude of - ! interest; units are degrees. - - ! * dx; a FORTRAN 4-byte real value to define the - ! zonal-displacement, dx. - - ! * dy; a FORTRAN 4-byte real value to define the - ! meridional-displacement, dy. - - ! OUTPUT VARIABLES: - - ! * dx; a FORTRAN 4-byte real value specifying the - ! zonal-displacement, dx; units are meters. - - ! * dy; a FORTRAN 4-byte real value specifying the - ! meridional-displacement, dy; units are meters. - - !----------------------------------------------------------------------- - - subroutine meteo_methods_geolatdist(lat,dx,dy) - - ! Define variables passed to routine - - real(r_kind) :: lat - real(r_kind) :: dx - real(r_kind) :: dy - - !===================================================================== - - ! Compute local variables - - dx = 111.32*cos(lat*deg2rad)*1000.0 - dy = 110.574*1000.0 - - !===================================================================== - - end subroutine meteo_methods_geolatdist - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_pottemp.f90 - - ! DESCRIPTION: - - ! This subroutine computes the potential temperature (thta; Kelvin) - ! profile from the temperature (t; Kelvin) and pressure (p; Pascals) - ! profiles. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the temperature - ! (t; Kelvin) and pressure (p; Pascals) profiles. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the computed - ! potential temperature (thta; Kelvin) profile. - - !----------------------------------------------------------------------- - - subroutine meteo_methods_pottemp(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - grid%thta = spval - - ! Loop through local variable - - do i = 1, grid%nz - - ! Check local variable and proceed accordingly - - if(grid%t(i) .ne. spval .and. grid%p(i) .ne. spval) then - - ! Compute local variables - - grid%thta(i) = grid%t(i)*(dble(100000.0)/grid%p(i))** & - & dble(rd_over_cp_mass) - - end if ! if(grid%t(i) .ne. spval .and. grid%p(i) .ne. spval) - - end do ! do i = 1, grid%nz - - !===================================================================== - - end subroutine meteo_methods_pottemp - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_vpottemp.f90 - - ! DESCRIPTION: - - ! This subroutine computes the virtual potential temperature (thtv; - ! Kelvin) profile from the temperature (t; Kelvin), water vapor - ! mixing ratio (q; kilograms per kilograms), and pressure (p; - ! Pascals) profiles. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the temperature - ! (t; Kelvin), water vapor mixing ratio (q; kilograms per - ! kilograms), and pressure (p; Pascals) profiles. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the computed - ! virtual potential temperature (thtv; Kelvin) profile. - - !----------------------------------------------------------------------- - - subroutine meteo_methods_vpottemp(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - grid%thtv = spval - - ! Loop through local variable - - do i = 1, grid%nz - - ! Check local variable and proceed accordingly - - if(grid%t(i) .ne. spval .and. grid%q(i) .ne. spval .and. grid%p(i) & - & .ne. spval) then - - ! Compute local variables - - grid%thtv(i) = (grid%q(i)*grid%t(i))*(dble(100000.0)/ & - & grid%p(i))**dble(rd_over_cp_mass) - - end if ! if(grid%t(i) .ne. spval .and. grid%q(i) .ne. spval - ! .and. grid%p(i) .ne. spval) - - end do ! do i = 1, grid%nz - - !===================================================================== - - end subroutine meteo_methods_vpottemp - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_wspdwdir.f90 - - ! DESCRIPTION: - - ! This subroutine computes the wind speed magnitude and - ! meteorological wind speed direction profiles from the zonal- and - ! meridional-wind speed component profiles. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the zonal- and - ! meridional-wind speed component profiles. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the computed - ! wind-speed magnitude (wspd; meters per second) and - ! wind-direction profiles (wdir; degrees). - - !----------------------------------------------------------------------- - - subroutine meteo_methods_wspdwdir(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - grid%wspd = spval - grid%wdir = spval - - ! Loop through local variable - - do i = 1, grid%nz - - ! Check local variable and proceed accordingly - - if(grid%u(i) .ne. spval .and. grid%v(i) .ne. spval) then - - ! Compute local variables - - grid%wspd(i) = dble(sqrt(grid%u(i)*grid%u(i) + & - & grid%v(i)*grid%v(i))) - grid%wdir(i) = dble(atan2(grid%u(i),grid%v(i)))*dble(rad2deg) + & - & dble(180.0) - - end if ! if(grid%u(i) .ne. spval .and. grid%v(i) .ne. spval) - - end do ! do i = 1, grid%nz - - !===================================================================== - - end subroutine meteo_methods_wspdwdir - - !======================================================================= - - ! SUBROUTINE: - - ! meteo_methods_wvmxrt.f90 - - ! DESCRIPTION: - - ! This subroutine computes the water vapor mixing ratio profile from - ! the temperature (t) and relative humidity (rh) profiles. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the temperature - ! (t; Kelvin) and relative humidity (rh; percentage) profiles. - - ! OUTPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable containing the computed - ! water vapor mixing ratio profile (q; kilograms per kilograms). - - !----------------------------------------------------------------------- - - subroutine meteo_methods_wvmxrt(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - ! Define variables computed within routine - - real(r_double) :: eps - real(r_double) :: es - real(r_double) :: es0 - real(r_double) :: svp1 - real(r_double) :: svp2 - real(r_double) :: svp3 - real(r_double) :: svpt0 - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - es0 = dble(6.1121) - eps = dble(0.622) - svp1 = dble(0.6112) - svp2 = dble(17.67) - svp3 = dble(29.62) - svpt0 = dble(273.15) - grid%q = spval - - ! Loop through local variable - - do i = 1, grid%nz - - ! Check local variable and proceed accordingly - - if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) then - - ! Compute local variables - - es = dble(0.01)*grid%rh(i)*svp1*dble(10.0)*exp(svp2*(grid%t(i) & - & - svpt0)/(grid%t(i) - svp3)) - - ! Check local variable and proceed accordingly - - if(es .ge. grid%p(i)/dble(100.0)) then - - ! Define local variables - - grid%q(i) = dble(1.e-6) - - else ! if(es .ge. grid%p(i)/dble(100.0)) - - ! Define local variables - - grid%q(i) = max(eps*es/(grid%p(i)/dble(100.0) - es), & - & dble(1.e-6)) - - end if ! if(es .ge. grid%p(i)/dble(100.0)) - - end if ! if(grid%t(i) .ne. spval .and. grid%rh(i) .ne. spval) - - end do ! do i = 1, grid%nz - - !===================================================================== - - end subroutine meteo_methods_wvmxrt - - !======================================================================= - -end module meteo_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/namelist_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/namelist_interface.F90 deleted file mode 100644 index b37bfdfb0..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/namelist_interface.F90 +++ /dev/null @@ -1,172 +0,0 @@ -module namelist_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: namelist_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - - !----------------------------------------------------------------------- - - ! DESCRIPTION (alphabetized): - - ! * datapath; a FORTRAN character string specifying the full-path to - ! the directory to contain output files written by the respective - ! routines. - - ! * debug; a FORTRAN logical value specifying whether to include - ! debug information during execution. - - ! * if_normalize; a FORTRAN logical value specifying whether to - ! normalize the geographical coordinate values computed for the - ! advection trajectory of the sondes. - - ! * sonde_filelist; a FORTRAN character string specifying the - ! full-path to the external file containing a list of TEMPDROP - ! formatted sondes to be decoded. - - ! * write_hsa; a FORTRAN logical value specifying whether to write - ! National Oceanic and Atmospheric Administration (NOAA) Atlantic - ! Oceanographic and Meteorological Laboratory (AOML) Hurricane - ! Research Division (HRD) spline analysis (HSA) formatted files. - - ! * write_hsa_drift; a FORTRAN logical value specifying whether to - ! write National Oceanic and Atmospheric Administration (NOAA) - ! Atlantic Oceanographic and Meteorological Laboratory (AOML) - ! Hurricane Research Division (HRD) spline analysis (HSA) - ! formatted files which include the geographical positions - ! estimated as a function of sonde drift. - - ! * write_nc_skewt; a FORTRAN logical value specifying whether to - ! write a network common data format (netcdf) file containing - ! interpolated National Oceanic and Atmospheric Administration - ! (NOAA) Atlantic Oceanographic and Meteorological Laboratory - ! (AOML) Hurricane Research Division (HRD) spline analysis (HSA) - ! values; write_hsa_drift must be true. - - !----------------------------------------------------------------------- - - ! Define local variables - - character(len=500) :: & - & datapath = './' - character(len=500) :: & - & sonde_filelist = 'NOT USED' - logical :: & - & debug = .false. - logical :: & - & if_normalize = .false. - logical :: & - & write_hsa = .false. - logical :: & - & write_hsa_drift = .false. - logical :: & - & write_nc_skewt = .false. - namelist /share/ datapath, debug, if_normalize, sonde_filelist, & - & write_hsa, write_hsa_drift, write_nc_skewt - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! namelist.f90 - - ! DESCRIPTION: - - ! This subroutine acts as the interface to the namelist file, - ! provided as 'tempdrop-sonde.input' by the user. - - !----------------------------------------------------------------------- - - subroutine namelist() - - ! Define variables computed within routine - - logical :: is_it_there - integer :: unit_nml - - !===================================================================== - - ! Define local variables - - unit_nml = 9 - is_it_there = .false. - inquire(file = 'tempdrop-sonde.input',exist = is_it_there) - - ! Check local variable and proceed accordingly - - if(is_it_there) then - - ! Define local variables - - open(file = 'tempdrop-sonde.input', & - unit = unit_nml , & - status = 'old' , & - form = 'formatted' , & - action = 'read') - read(unit_nml,NML = share) - close(unit_nml) - - else ! if(is_it_there) - - ! Define local variables - - write(6,500) - stop - - end if ! if(is_it_there) - - ! Define local variables - - write(6,*) '&SHARE' - write(6,*) 'DATAPATH = ', & - & trim(adjustl(datapath)) - write(6,*) 'DEBUG = ', debug - write(6,*) 'IF_NORMALIZE = ', if_normalize - write(6,*) 'SONDE_FILELIST = ', & - & trim(adjustl(sonde_filelist)) - write(6,*) 'WRITE_HSA = ', write_hsa - write(6,*) 'WRITE_HSA_DRIFT = ', write_hsa_drift - write(6,*) 'WRITE_NC_SKEWT = ', write_nc_skewt - write(6,*) '/' -500 format('NAMELISTPARAMS: tempdrop-sonde.input not found in the ', & - & 'current working directory. ABORTING!!!!') - - !=================================================================== - - end subroutine namelist - - !======================================================================= - -end module namelist_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/netcdf_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/netcdf_interface.F90 deleted file mode 100644 index 24037b001..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/netcdf_interface.F90 +++ /dev/null @@ -1,275 +0,0 @@ -module netcdf_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: netcdf_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use netcdf - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: ncdimid - public :: ncfileid - public :: ncstatus - public :: ncvarid - public :: netcdf_interface_close - public :: netcdf_interface_open - public :: netcdf_interface_writedef - - ! Define local variables - - integer :: ncdimid - integer :: ncfileid - integer :: ncstatus - integer :: ncvarid - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! netcdf_interface_close.f90 - - ! DESCRIPTION: - - ! This subroutine closes a Network Common Data Format (netcdf) file - ! defined by the FORTRAN integer variable ncfileid. - - !----------------------------------------------------------------------- - - subroutine netcdf_interface_close() - - !===================================================================== - - ! Define local variables - - ncstatus = nf90_close(ncfileid) - - !===================================================================== - - end subroutine netcdf_interface_close - - !======================================================================= - - ! SUBROUTINE: - - ! netcdf_interface_write_def.f90 - - ! DESCRIPTION: - - ! This subroutine writes the Network Common Data Format (netcdf) - ! file dimension and variable definition section. - - ! INPUT VARIABLES: - - ! * varinfo; a FORTRAN varinfo_struct variable containing the - ! dimension and variable definitions for the netcdf file. - - !----------------------------------------------------------------------- - - subroutine netcdf_interface_writedef(varinfo) - - ! Define variables passed to routine - - type(varinfo_struct) :: varinfo - - ! Define variables computed within routine - - integer, dimension(:), allocatable :: dimid - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Loop through local variable - - do i = 1, varinfo%ndims - - ! Define local variables - - ncstatus = nf90_def_dim(ncfileid,trim(adjustl(varinfo%dimname(i))), & - & varinfo%dimval(i),varinfo%dimid(i)) - - end do ! do i = 1, varinfo - - ! Loop through local variable - - do i = 1, varinfo%nvars - - ! Allocate memory for local variables - - if(.not. allocated(dimid)) allocate(dimid(varinfo%varndims(i))) - - ! Loop through local variable - - do j = 1, varinfo%varndims(i) - - ! Define local variables - - dimid(j) = varinfo%vardimid(i,j) - - end do ! do j = 1, varinfo%varndims(i) - - ! Check local variable and proceed accordingly - - if(trim(adjustl(varinfo%vartype(i))) .eq. 'float') then - - ! Define local variables - - ncstatus = nf90_def_var(ncfileid, & - & trim(adjustl(varinfo%varname(i))),nf90_float, & - & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) - - end if ! if(trim(adjustl(varinfo%vartype(i))) .eq. 'float') - - ! Check local variable and proceed accordingly - - if(trim(adjustl(varinfo%vartype(i))) .eq. 'double') then - - ! Define local variables - - ncstatus = nf90_def_var(ncfileid, & - & trim(adjustl(varinfo%varname(i))),nf90_double, & - & dimid(1:varinfo%varndims(i)),varinfo%varid(i)) - - end if ! if(trim(adjustl(varinfo%vartype(i))) .eq. 'double') - - ! Loop through local variable - - do j = 1, varinfo%varnattrs(i) - - ! Define local variables - - ncstatus = nf90_put_att(ncfileid,varinfo%varid(i), & - & trim(adjustl(varinfo%varattrs(i,j,1))), & - & trim(adjustl(varinfo%varattrs(i,j,2)))) - - end do ! do j = 1, varinfo%varnattrs(i) - - ! Deallocate memory for local variables - - if(allocated(dimid)) deallocate(dimid) - - end do ! do i = 1, varinfo%nvars - - ! Define local variables - - ncstatus = nf90_enddef(ncfileid) - - !===================================================================== - - end subroutine netcdf_interface_writedef - - !======================================================================= - - ! SUBROUTINE: - - ! netcdf_interface_open.f90 - - ! DESCRIPTION: - - ! This subroutine opens a Network Common Data Format (netcdf) file - ! with permissions in accordance with the specifications of the - ! user; the global variable ncfileid is defined by this subroutine - ! until terminated by the subroutine netcdf_interface_close.f90. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the full-path to - ! the netcdf file. - - ! * is_read; a FORTRAN logical variable specifying to open the - ! netcdf file with read-only permissions. - - ! * is_rdwr; a FORTRAN logical variable specifying to open the - ! netcdf file with read and write permissions. - - ! * is_write; a FORTRAN logical variable specifying to open a new - ! (and clobber any previous existence of a) the netcdf file with - ! write permissions. - - !----------------------------------------------------------------------- - - subroutine netcdf_interface_open(filename,is_read,is_rdwr,is_write) - - ! Define variables passed to routine - - character(len=500) :: filename - logical :: is_read - logical :: is_rdwr - logical :: is_write - - !===================================================================== - - ! Check local variable and proceed accordingly - - if(is_read) then - - ! Define local variables - - ncstatus = nf90_open(trim(adjustl(filename)),nf90_nowrite, & - & ncfileid) - - end if ! if(is_read) - - ! Check local variable and proceed accordingly - - if(is_rdwr) then - - ! Define local variables - - ncstatus = nf90_open(trim(adjustl(filename)),nf90_write, & - & ncfileid) - - end if ! if(is_rdwr) - - ! Check local variable and proceed accordingly - - if(is_write) then - - ! Define local variables - - ncstatus = nf90_create(trim(adjustl(filename)),nf90_clobber, & - & ncfileid) - - end if ! if(is_write) - - !===================================================================== - - end subroutine netcdf_interface_open - - !======================================================================= - -end module netcdf_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/sonde_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/sonde_interface.F90 deleted file mode 100644 index ed1e2bdc9..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/sonde_interface.F90 +++ /dev/null @@ -1,65 +0,0 @@ -module sonde_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: sonde_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! read_geopotential.f90 - - ! INPUT VARIABLES: - - ! - - ! OUTPUT VARIABLES: - - ! - - !----------------------------------------------------------------------- - - subroutine read_geopotential() - - - endsubroutine read_geopotential - - !======================================================================= - -end module sonde_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/tempdrop_sonde_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/tempdrop_sonde_interface.F90 deleted file mode 100644 index 6dbd17f2e..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/tempdrop_sonde_interface.F90 +++ /dev/null @@ -1,1659 +0,0 @@ -module tempdrop_sonde_interface - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! tempdrop-sonde :: tempdrop_sonde_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use constants_interface - use diagnostics_interface - use fileio_interface - use grid_methods_interface - use kinds_interface - use math_methods_interface - use meteo_methods_interface - use namelist_interface - use time_methods_interface - use variable_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: tempdrop_sonde - - ! Define local variables - - type(hsa_struct) :: hsa_grid - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! tempdrop_sonde.f90 - - ! DESCRIPTION: - - ! This is the driver routine for the decoding and formatting of the - ! National Oceanic and Atmospheric Administration (NOAA) Atlantic - ! Oceanographic and Meteorological Laboratory (AOML) Hurricane - ! Research Division (HRD) TEMPDROP sondes. - - !----------------------------------------------------------------------- - - subroutine tempdrop_sonde() - - ! Define variables computed within routine - - type(meteo_struct) :: meteo_grid - character(len=500) :: out_file_hsa - real(r_kind) :: time_start - - ! Define counting variables - - integer :: i - - !===================================================================== - - ! Define local variables - - call diagnostics_time_start(time_start) - call namelist() - call fileio_interface_read(sonde_filelist) - open(999,file=trim(adjustl(datapath))//'hsa-map.table',form= & - & 'formatted') - - ! Loop through local variable - - do i = 1, nfiles - - ! Check local variable and proceed accordingly - - if(write_hsa) then - - ! Compute local variables - - call decode_tempdrop_hsa(sonde_filename(i),out_file_hsa, & - & meteo_grid) - - ! Define local variables - - write(999,500) trim(adjustl(sonde_filename(i))), & - & trim(adjustl(out_file_hsa)) - - ! Check local variable and proceed accordingly - - if(write_hsa_drift) then - - ! Compute local variables - - call tempdrop_drift_hsa(out_file_hsa,meteo_grid) - - end if ! if(write_hsa_drift) - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(hsa_grid) - - end if ! if(write_hsa) - - end do ! do i = 1, nfiles - - ! Define local variables - - close(999) - - ! Deallocate memory for local variables - - if(allocated(sonde_filename)) deallocate(sonde_filename) - - ! Define local variables - - call diagnostics_time_stop(time_start) -500 format(a,1x,a) - - !===================================================================== - - end subroutine tempdrop_sonde - - !======================================================================= - - ! SUBROUTINE: - - ! decode_tempdrop_hsa.f90 - - ! DESCRIPTION: - - ! This subroutine decodes the TEMPDROP message to the HRD HSA format - ! and writes the results to an external formatted file and returns - ! the filename; the output filename is as follows: - - ! />__.hsa - - ! INPUT VARIABLES: - - ! * infile; a FORTRAN character string specifying the path to the - ! external file containing the TEMPDROP messages. - - ! * outfile; a FORTRAN character string specifying the path to the - ! external file to contain the HSA formatted decoded TEMPDROP - ! message. - - ! * meteo_grid; a FORTRAN meteo_struct variable. - - ! OUTPUT VARIABLES: - - ! * outfile; a FORTRAN character string specifying the path to the - ! external file to contain the HSA formatted decoded TEMPDROP - ! message. - - ! * meteo_grid; a FORTRAN meteo_struct variable containing the - ! aircraft identifier (acid), the observation number (obnum), and - ! the full-path to the TEMPDROP file (tempdrop_name). - - !----------------------------------------------------------------------- - - subroutine decode_tempdrop_hsa(infile,outfile,meteo_grid) - - ! Define variables passed to routine - - type(meteo_struct) :: meteo_grid - character(len=500) :: infile - character(len=500) :: outfile - - ! Define variables computed within routine - - character(len=3), dimension(12) :: month_data - character(len=70) :: line - character(len=5) :: acid - character(len=3) :: month - character(len=2) :: obnum - logical :: exist - logical :: exist_chk - integer :: lupa - integer :: iac - integer :: iwx - integer :: iflag - integer :: iyrs - integer :: imns - integer :: idys - integer :: strstrt - integer :: strstop - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - hsa_grid%spgtime = -999 - data month_data/'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug', & - & 'Sep','Oct','Nov','Dec'/ - iyrs = 0 - imns = 0 - idys = 0 - iwx = 1 - iflag = 1 - lupa = 150 - open(12,file=trim(adjustl(infile)),status='old') -20 read(12,'(a)',end=1000) line - - ! Check local variable and proceed accordingly - - if(line(1:5) .eq. 'Sonde') then - - ! Define local variables - - read(line(30:31),'(i2)') idys - read(line(33:35),'(a3)') month - read(line(37:38),'(i2)') iyrs - hsa_grid%yyyy = 1900 + iyrs - - ! Loop through local variable - - do i = 1, size(month_data) - - ! Check local variable and proceed accordingly - - if(month_data(i) .eq. month) then - - ! Define local variables - - imns = i - - end if ! if(month_data(i) .eq. month) - - end do ! do i = 1, size(month_data) - - end if ! if(line(1:5) .eq. 'Sonde') - - ! Check local variable and proceed accordingly - - if(line(1:5) .eq. '61616') then - - ! Define local variables - - read(line(7:11),'(a)') acid - - ! Check local variable and proceed accordingly - - if(line(34:34) .eq. ' ') then - - ! Define local variables - - read(line(35:36),'(a)') obnum - - else ! if(line(34:34) .eq. ' ') - - ! Define local variables - - read(line(36:37),'(a)') obnum - - end if ! if(line(34:34) .eq. ' ') - - ! Check local variable and proceed accordingly - - if(obnum(1:1) .eq. ' ') then - - ! Define local variables - - obnum = '00' - - else if(obnum(1:2) .eq. ' ') then - - ! Define local variables - - obnum = '00' - - else if(obnum(2:2) .eq. ' ') then - - ! Define local variables - - obnum = '00' - - end if ! if(obnum(1:2) .eq. ' ') - - ! Check local variable and proceed accordingly - - if(acid(1:1) .eq. 'A') then - - ! Define local variables - - iac = 30 - - else if(acid(5:5) .eq. 'F') then - - ! Define local variables - - iac = 8 - - else ! if(acid(1:1) .eq. 'A') - - ! Define local variables - - read(line(11:11),'(i1)') iac - iac = iac + 40 - - end if ! if(acid(1:1) .eq. 'A') - - end if ! if(line(1:5) .eq. '61616') - - ! Check local variable and proceed accordingly - - if(idys .eq. 0 .or. imns .eq. 0 .or. iyrs .eq. 0) then - - ! Define local variables - - strstrt = index(infile,'/',back=.true.) + 1 - strstop = strstrt + 3 - read(infile(strstrt:strstop),'(i4)') hsa_grid%yyyy - strstrt = index(infile,'/',back=.true.) + 3 - strstop = strstrt + 1 - read(infile(strstrt:strstop),'(i2)') iyrs - strstrt = strstop + 1 - strstop = strstrt + 1 - read(infile(strstrt:strstop),'(i2)') imns - strstrt = strstop + 1 - strstop = strstrt + 1 - read(infile(strstrt:strstop),'(i2)') idys - - end if ! if(idys .eq. 0 .or. imns .eq. 0 .or. iyrs .eq. 0) - - ! Define local variables - - hsa_grid%mm = imns - hsa_grid%dd = idys - goto 20 -1000 continue - close(12) - meteo_grid%acid = acid - meteo_grid%obnum = obnum - meteo_grid%tempdrop_name = infile - write(outfile,500) trim(adjustl(datapath)), acid, obnum, iyrs, imns, & - & idys - inquire(file=trim(adjustl(outfile)),exist=exist) - - ! Check local variable and proceed accordingly - - if(exist) then - - ! Loop through local variable - - do i = 1, 1000 - - ! Define local variables - - write(outfile,501) trim(adjustl(datapath)), acid, obnum, iyrs, & - imns, idys, i - inquire(file=trim(adjustl(outfile)),exist=exist_chk) - if(.not. exist_chk) goto 1001 - - end do ! do i = 1, 1000 - - end if ! if(exist) - -1001 continue - open(99,file=trim(adjustl(outfile)),form='formatted') - open(12,file=trim(adjustl(infile)),status='old') -21 read(12,'(a)',end=1002) line - - ! Check local variable and proceed accordingly - - if(index(line,'REL') .ne. 0) then - - ! Check local variable and proceed accordingly - - if((len(trim(adjustl(line))) - index(line,'REL')) .lt. 21) & - & return - - ! Define local variables - - call spginfo(line,hsa_grid%reltime,hsa_grid%rellat, & - & hsa_grid%rellon,'REL') - - endif ! if(index(line,'REL') .ne. 0) - - ! Check local variable and proceed accordingly - - if(index(line,'SPG') .ne. 0) then - - ! Check local variable and proceed accordingly - - if((len(trim(adjustl(line))) - index(line,'SPG')) .lt. 21) & - & return - - ! Define local variables - - call spginfo(line,hsa_grid%spgtime,hsa_grid%spglat, & - & hsa_grid%spglon,'SPG') - - endif ! if(index(line,'SPG') .ne. 0) - - ! Check local variable and proceed accordingly - - if(index(line,'SPL') .ne. 0) then - - ! Check local variable and proceed accordingly - - if((len(trim(adjustl(line))) - index(line,'SPL')) .lt. 21) & - & return - - ! Define local variables - - call spginfo(line,hsa_grid%spgtime,hsa_grid%spglat, & - & hsa_grid%spglon,'SPL') - - end if ! if(index(line,'SPL') .ne. 0) - - ! Check local variable and proceed accordingly - - if((index(line,'XX') .ne. 0)) then - - ! Compute local variables - - call drop(99,iwx,iflag,iyrs,imns,idys,line,hsa_grid%psfc, & - & meteo_grid%acid,meteo_grid%obnum) - - end if ! if(index(line,'XX') .ne. 0) - - ! Define local variables - - goto 21 -1002 continue - close(12) - close(99) -500 format(a,a5,'_'a2,'_',3(i2.2),'.hsa') -501 format(a,a5,'_'a2,'_',3(i2.2),'_'(i2.2),'.hsa') - - !===================================================================== - - end subroutine decode_tempdrop_hsa - - !======================================================================= - - ! SUBROUTINE: - - ! tempdrop_drift_hsa.f90 - - ! DESCRIPTION: - - ! This subroutine estimates the horizontal displacement of the sonde - ! as a function of the theoretical fall rate and the wind profile; - ! vertical interpolation along a linear-log pressure coordinate is - ! performed to estimate the theoretical fall rate and the zonal- and - ! meridional-displacement via the zonal- and meridional-wind vector - ! components, respectively; an external file containing the HSA - ! formatted data record with the new timestamps and geographical - ! coordinates is written to: - - ! />__.hsa.drft - - ! REFERENCES: - - ! Hock, T. F., and J. L. Franklin, 1999: The NCAR GPS - ! Dropwindsonde. Bull. Amer. Meteor. Soc., 80, 407–420. - - ! INPUT VARIABLES: - - ! * filename; a FORTRAN character string specifying the path to the - ! external file containing the HSA formatted decoded TEMPDROP - ! message; the output file generated by this routine appends the - ! string '.drft' to this filename. - - ! * meteo_grid; a FORTRAN meteo_struct variable containing the - ! aircraft identifier (acid), the observation number (obnum), and - ! the full-path to the TEMPDROP file (tempdrop_name); the arrays - ! within this struct are populated within this routine. - - !----------------------------------------------------------------------- - - subroutine tempdrop_drift_hsa(filename,meteo_grid) - - ! Define variables passed to routine - - type(meteo_struct) :: meteo_grid - character(len=500) :: filename - - ! Define variables computed within routine - - type(grid_struct) :: grid - type(hsa_struct) :: hsa_interp_grid - type(interp_p_struct) :: interp_p - type(statgrid_struct) :: statgrid - character(len=8) :: yymmdd - character(len=4) :: hhnn - real(r_double) :: julian_time - real(r_double) :: julian_day - real(r_double) :: rel_julian - real(r_double) :: spg_julian - real(r_kind) :: dstp - real(r_kind) :: dstvar - real(r_kind) :: dummy - real(r_kind) :: fallrate - real(r_kind) :: gsndfall2 - real(r_kind) :: avgp - real(r_kind) :: avgt - real(r_kind) :: pmax - real(r_kind) :: pmin - real(r_kind) :: timediff - real(r_kind) :: spgtime - real(r_kind) :: dx - real(r_kind) :: dy - real(r_kind) :: dtime - real(r_kind) :: dlon - real(r_kind) :: dlat - real(r_kind) :: plon - real(r_kind) :: plat - real(r_kind) :: ptime - real(r_kind) :: ptemp - real(r_kind) :: ppres - real(r_kind) :: norma - real(r_kind) :: normb - integer :: nmnlevs - integer :: seconds - integer :: nz - integer :: time_hmsts - integer :: time_sthms - integer :: rel_hmsts - integer :: spg_hmsts - integer :: yyyy - integer :: mm - integer :: dd - integer :: hh - integer :: nn - integer :: ss - integer :: gmt - - ! Define counting variables - - integer :: i, j - - !===================================================================== - - ! Define local variables - - hsa_grid%nz = 0 - open(99,file=trim(adjustl(filename)),form='formatted') -1000 read(99,*,end=1001,err=1007) dummy - hsa_grid%nz = hsa_grid%nz + 1 - goto 1000 -1001 continue - close(99) - - ! Check local variable and proceed accordingly - - if(hsa_grid%nz .le. 0) goto 1007 - - ! Define local variables - - hsa_interp_grid%nz = hsa_grid%nz - call variable_interface_setup_struct(hsa_grid) - call variable_interface_setup_struct(hsa_interp_grid) - pmax = -spval - pmin = spval - open(99,file=trim(adjustl(filename)),form='formatted') - nmnlevs = 0 - - ! Loop through local variable - - do i = 1, hsa_grid%nz - - ! Define local variables - - read(99,501) hsa_grid%wx(i), hsa_grid%yymmdd(i), hsa_grid%gmt(i), & - & hsa_grid%lat(i), hsa_grid%lon(i), hsa_grid%p(i), & - & hsa_grid%t(i), hsa_grid%rh(i), hsa_grid%z(i), & - & hsa_grid%u(i), hsa_grid%v(i), hsa_grid%tail(i) - - ! Check local variable and proceed accordingly - - if((hsa_grid%tail(i) .eq. 'MANL' .or. hsa_grid%tail(i) .eq. & - & 'SIGL') .and. hsa_grid%p(i) .lt. 1070.0) then - - ! Define local variables - - nmnlevs = nmnlevs + 1 - pmax = max(hsa_grid%p(i),pmax) - pmin = min(hsa_grid%p(i),pmin) - - end if ! if(hsa_grid%tail(i) .eq. 'MANL' .or. hsa_grid%tail(i) - ! .eq. 'SIGL') - - end do ! do i = 1, hsa_grid%nz - - ! Define local variables - - close(99) - - ! Check local variable and proceed accordingly - - if(nmnlevs .le. 1) goto 1007 - - ! Define local variables - - hsa_grid%logtime = hsa_grid%gmt(1)*100 - call time_methods_julian_day(hsa_grid%yyyy,hsa_grid%mm,hsa_grid%dd, & - & julian_day) - call time_methods_hmsts(hsa_grid%reltime,time_hmsts) - rel_hmsts = time_hmsts - julian_day = julian_day + real(time_hmsts)/86400.0 - rel_julian = julian_day - hsa_interp_grid = hsa_grid - where(hsa_interp_grid%t .le. -90.0) hsa_interp_grid%t = spval - nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. (hsa_interp_grid%tail .eq. & - & 'MANL' .or. hsa_interp_grid%tail .eq. 'SIGL')) - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%t .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - meteo_grid%nz = nz - call variable_interface_setup_struct(meteo_grid) - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - meteo_grid%p(j) = dble(hsa_interp_grid%p(i)*100.0) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - - interp_p%psfc = hsa_grid%psfc - meteo_grid%psfc = dble(hsa_grid%psfc*100.0) - - ! Loop through local variable - - do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - call variable_interface_setup_struct(interp_p) - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%t(i) .ne. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - interp_p%p(j) = hsa_interp_grid%p(i) - interp_p%var(j) = hsa_interp_grid%t(i) - - end if ! if(hsa_interp_grid%p(i) .le. 1070.0 - ! .and. hsa_interp_grid%t(i) .gt. -90.0 - ! .and. (hsa_interp_grid%tail .eq. 'MANL' - ! .or. hsa_interp_grid%tail .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%t(i) .eq. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - dstp = hsa_interp_grid%p(i) - - ! Compute local variables - - call math_methods_llp_interp(interp_p,dstp,dstvar) - - ! Define local variables - - hsa_interp_grid%t(i) = dstvar - goto 1002 - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%t(i) .lt. -90.0 - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - -1002 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(interp_p) - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%t .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - end do ! do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - meteo_grid%t(j) = dble(hsa_interp_grid%t(i) + 273.15) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - where(hsa_interp_grid%t .eq. spval) hsa_interp_grid%t = -99.0 - - ! Define local variables - - where(hsa_interp_grid%u .le. -90.0) hsa_interp_grid%u = spval - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%u .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - ! Loop through local variable - - do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - call variable_interface_setup_struct(interp_p) - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%u(i) .ne. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - interp_p%p(j) = hsa_interp_grid%p(i) - interp_p%var(j) = hsa_interp_grid%u(i) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%u(i) .ne. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%u(i) .eq. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - dstp = hsa_interp_grid%p(i) - - ! Compute local variables - - call math_methods_llp_interp(interp_p,dstp,dstvar) - - ! Define local variables - - hsa_interp_grid%u(i) = dstvar - goto 1003 - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%u(i) .ne. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - -1003 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(interp_p) - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%u .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - end do ! do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - meteo_grid%u(j) = dble(hsa_interp_grid%u(i)) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - where(hsa_interp_grid%u .eq. spval) hsa_interp_grid%u = -99.0 - where(hsa_interp_grid%v .le. -90.0) hsa_interp_grid%v = spval - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%v .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - ! Loop through local variable - - do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - call variable_interface_setup_struct(interp_p) - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%v(i) .ne. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - interp_p%p(j) = hsa_interp_grid%p(i) - interp_p%var(j) = hsa_interp_grid%v(i) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%v(i) .ne. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%v(i) .eq. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - dstp = hsa_interp_grid%p(i) - - ! Compute local variables - - call math_methods_llp_interp(interp_p,dstp,dstvar) - - ! Define local variables - - hsa_interp_grid%v(i) = dstvar - goto 1004 - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%v(i) .eq. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - -1004 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(interp_p) - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%v .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - end do ! do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - meteo_grid%v(j) = dble(hsa_interp_grid%v(i)) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - where(hsa_interp_grid%v .eq. spval) hsa_interp_grid%v = -99.0 - where(hsa_interp_grid%z .le. -90.0) hsa_interp_grid%z = spval - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%z .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - ! Loop through local variable - - do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - call variable_interface_setup_struct(interp_p) - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%z(i) .ne. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - interp_p%p(j) = hsa_interp_grid%p(i) - interp_p%var(j) = hsa_interp_grid%z(i) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%z(i) .ne. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%z(i) .eq. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - dstp = hsa_interp_grid%p(i) - - ! Compute local variables - - call math_methods_llp_interp(interp_p,dstp,dstvar) - - ! Define local variables - - hsa_interp_grid%z(i) = dstvar - goto 1005 - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%z(i) .eq. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - -1005 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(interp_p) - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%z .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - end do ! do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - meteo_grid%z(j) = dble(hsa_interp_grid%z(i)) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - where(hsa_interp_grid%z .eq. spval) hsa_interp_grid%z = -99.0 - where(hsa_interp_grid%rh .le. -90.0) hsa_interp_grid%rh = spval - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%rh .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - ! Loop through local variable - - do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - call variable_interface_setup_struct(interp_p) - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%rh(i) .ne. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - interp_p%p(j) = hsa_interp_grid%p(i) - interp_p%var(j) = hsa_interp_grid%rh(i) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%rh(i) .ne. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) & - & .ge. pmin .and. hsa_interp_grid%rh(i) .eq. spval .and. & - & (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - dstp = hsa_interp_grid%p(i) - - ! Compute local variables - - call math_methods_llp_interp(interp_p,dstp,dstvar) - - ! Define local variables - - hsa_interp_grid%rh(i) = dstvar - goto 1006 - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. hsa_interp_grid%rh(i) .eq. spval - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - -1006 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(interp_p) - - ! Define local variables - - interp_p%nz = count(hsa_interp_grid%p .le. pmax .and. & - & hsa_interp_grid%p .ge. pmin .and. hsa_interp_grid%rh .ne. & - & spval .and. (hsa_interp_grid%tail .eq. 'MANL' .or. & - & hsa_interp_grid%tail .eq. 'SIGL')) - - end do ! do while(interp_p%nz .lt. nz .and. interp_p%nz .gt. 1) - - ! Define local variables - - j = 0 - - ! Loop through local variables - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - j = j + 1 - meteo_grid%rh(j) = dble(hsa_interp_grid%rh(i)) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - where(hsa_interp_grid%rh .eq. spval) hsa_interp_grid%rh = -99.0 - - ! Loop through local variable - - do i = 1, meteo_grid%nz - - ! Check local variable and proceed accordingly - - if(meteo_grid%p(i) .gt. meteo_grid%psfc) then - - ! Define local variables - - meteo_grid%p(i) = spval - meteo_grid%t(i) = spval - meteo_grid%z(i) = spval - meteo_grid%u(i) = spval - meteo_grid%v(i) = spval - meteo_grid%rh(i) = spval - - end if ! if(meteo_grid%p(i) .gt. meteo_grid%psfc) - - end do ! do i = 1, meteo_grid%nz - - ! Compute local variables - - call meteo_methods_wvmxrt(meteo_grid) - call meteo_methods_dwpttemp(meteo_grid) - call meteo_methods_wspdwdir(meteo_grid) - call time_methods_hmsts(hsa_interp_grid%logtime,time_hmsts) - - ! Define local variables - - hsa_interp_grid%fallrate = spval - - ! Check local variable and proceed accordingly - - if(hsa_grid%spgtime .eq. -999) then - - ! Define local variables - - statgrid%n = hsa_interp_grid%nz - call variable_interface_setup_struct(statgrid) - statgrid%var = hsa_interp_grid%t - where(statgrid%var .le. -90.0) statgrid%var = spval - - ! Compute local variables - - avgp = 0.5*(pmax + pmin) - call math_methods_stats(statgrid) - avgt = statgrid%mean - fallrate = gsndfall2(avgp,avgt,spval,hsa_interp_grid%psfc, & - & .true.)/100.0 - call time_methods_hmsts(hsa_interp_grid%logtime,time_hmsts) - spgtime = float(time_hmsts) + (pmax-pmin)/fallrate - call time_methods_sthms(int(spgtime),time_sthms) - - ! Define local variables - - hsa_interp_grid%spgtime = time_sthms - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(statgrid) - - end if ! if(hsa_interp_grid%spgtime .eq. -999) - - ! Compute local variables - - call time_methods_hmsts(hsa_interp_grid%reltime,time_hmsts) - - ! Define local variables - - hsa_interp_grid%time = time_hmsts - hsa_interp_grid%fallrate = 0.0 - - ! Loop through local variable - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .ge. pmin .and. hsa_interp_grid%t(i) & - & .ge. -90.0) then - - ! Define local variables - - ppres = hsa_interp_grid%p(i) - ptemp = hsa_interp_grid%t(i) - goto 600 - - end if ! if(hsa_interp_grid%p(i) .ge. pmin .and. - ! hsa_interp_grid%t(i) .ge. -90.0) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - -600 continue - call time_methods_hmsts(hsa_interp_grid%reltime,time_hmsts) - ptime = float(time_hmsts) - hsa_interp_grid%time(hsa_interp_grid%nz) = ptime - - ! Loop through local variable - - do i = (hsa_interp_grid%nz - 1), 1, -1 - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%t(i) .ge. -90.0) then - - ! Define local variables - - avgp = 0.5*(ppres + hsa_interp_grid%p(i)) - avgt = 0.5*(ptemp + hsa_interp_grid%t(i)) - - ! Compute local variables - - hsa_interp_grid%fallrate(i) = gsndfall2(avgp,avgt,spval, & - & hsa_interp_grid%psfc,.true.)/100.0 - timediff = (hsa_interp_grid%p(i) - ppres)/ & - & hsa_interp_grid%fallrate(i) - timediff = max(timediff,0.0) - hsa_interp_grid%time(i) = ptime - timediff - - ! Define local variables - - ppres = hsa_interp_grid%p(i) - ptemp = hsa_interp_grid%t(i) - ptime = hsa_interp_grid%time(i) - - end if ! if(hsa_interp_grid%t(i) .ge. -90.0) - - end do ! do i = (hsa_interp_grid%nz - 1), 1, -1 - - ! Define local variables - - plon = hsa_grid%rellon - plat = hsa_grid%rellat - ptime = hsa_interp_grid%time(hsa_interp_grid%nz) - hsa_interp_grid%lon = plon - hsa_interp_grid%lat = plat - - ! Loop through local variable - - do i = hsa_interp_grid%nz, 2, -1 - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Define local variables - - grid%lon = -1.0*plon - grid%lat = plat - - ! Compute local variables - - dtime = ptime - hsa_interp_grid%time(i) - grid%head = 270.0 + atan2(hsa_interp_grid%v(i), & - & hsa_interp_grid%u(i))*rad2deg - grid%dist = sqrt(hsa_interp_grid%u(i)**2.0 + & - & hsa_interp_grid%v(i)**2.0)*dtime - - ! Compute local variables - - call grid_methods_gcgeo(grid) - - ! Define local variables - - hsa_interp_grid%lon(i) = -1.0*grid%lon - hsa_interp_grid%lat(i) = grid%lat - ptime = hsa_interp_grid%time(i) - plon = hsa_interp_grid%lon(i) - plat = hsa_interp_grid%lat(i) - - else if(hsa_interp_grid%p(i) .eq. 1070.0) then - - ! Define local variables - - hsa_interp_grid%lon(i) = hsa_interp_grid%spglon - hsa_interp_grid%lat(i) = hsa_interp_grid%spglat - - else ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - ! Define local variables - - hsa_interp_grid%lon(i) = hsa_grid%lon(i) - hsa_interp_grid%lat(i) = hsa_grid%lat(i) - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = hsa_interp_grid%nz, 2, -1 - - ! Define local variables - - statgrid%n = hsa_interp_grid%nz - call variable_interface_setup_struct(statgrid) - norma = min(hsa_grid%rellon,hsa_grid%spglon) - normb = max(hsa_grid%rellon,hsa_grid%spglon) - statgrid%var = hsa_interp_grid%lon - - ! Compute local variables - - call math_methods_normalize_values(statgrid,norma,normb) - - ! Define local variables - - if(if_normalize) hsa_interp_grid%lon = statgrid%var - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(statgrid) - - ! Define local variables - - statgrid%n = hsa_interp_grid%nz - call variable_interface_setup_struct(statgrid) - norma = min(hsa_grid%rellat,hsa_grid%spglat) - normb = max(hsa_grid%rellat,hsa_grid%spglat) - statgrid%var = hsa_interp_grid%lat - - ! Compute local variables - - call math_methods_normalize_values(statgrid,norma,normb) - - ! Define local variables - - if(if_normalize) hsa_interp_grid%lat = statgrid%var - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(statgrid) - - ! Define local variables - - j = 0 - - ! Loop through local variable - - do i = 1, hsa_interp_grid%nz - - ! Check local variable and proceed accordingly - - if(hsa_interp_grid%p(i) .le. pmax .and. hsa_interp_grid%p(i) .ge. & - & pmin .and. (hsa_interp_grid%tail(i) .eq. 'MANL' .or. & - & hsa_interp_grid%tail(i) .eq. 'SIGL')) then - - ! Compute local variables - - timediff = (hsa_interp_grid%time(hsa_interp_grid%nz) - & - & hsa_interp_grid%time(i))/86400.0 - julian_time = julian_day + dble(timediff) - - ! Define local variables - - j = j + 1 - meteo_grid%lon(j) = -1.0*dble(hsa_interp_grid%lon(i)) - meteo_grid%lat(j) = dble(hsa_interp_grid%lat(i)) - meteo_grid%jdate(j) = julian_time - - end if ! if(hsa_interp_grid%p(i) .le. pmax - ! .and. hsa_interp_grid%p(i) .ge. pmin - ! .and. (hsa_interp_grid%tail(i) .eq. 'MANL' - ! .or. hsa_interp_grid%tail(i) .eq. 'SIGL')) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Loop through local variable - - do i = hsa_interp_grid%nz, 1, -1 - - ! Compute local variables - - timediff = (hsa_interp_grid%time(hsa_interp_grid%nz) - & - & hsa_interp_grid%time(i))/86400.0 - julian_time = julian_day + dble(timediff) - - ! Define local variables - - call time_methods_gregorian_date(dble(julian_time),yyyy,mm,dd,hh, & - & nn,ss) - timediff = real(julian_time - dble(int(julian_time))) - write(yymmdd,'(i4,2(i2.2))') yyyy, mm, dd - write(hhnn,'(2(i2.2))') hh, nn - read(yymmdd(3:8),'(f7.0)') hsa_grid%yymmdd(i) - read(hhnn,'(i4)') hsa_grid%gmt(i) - hsa_grid%lon(i) = hsa_interp_grid%lon(i) - hsa_grid%lat(i) = hsa_interp_grid%lat(i) - - end do ! do i = hsa_interp_grid%nz, 1, -1 - - ! Define local variables - - open(99,file=trim(adjustl(filename))//'.base',form='formatted') - call time_methods_hmsts(hsa_grid%spgtime,spg_hmsts) - - ! Check local variable and proceed accordingly - - if(spg_hmsts .ge. rel_hmsts) then - - ! Define local variables - - spg_julian = rel_julian + dble((dble(spg_hmsts - & - & rel_hmsts)/86400.0)) - - end if ! if(spg_hmsts .ge. rel_hmsts) - - ! Check local variable and proceed accordingly - - if(spg_hmsts .lt. rel_hmsts) then - - ! Define local variables - - spg_julian = rel_julian + dble(dble(spg_hmsts)/86400.0) - - end if ! if(spg_hmsts .lt. rel_hmsts) - - ! Define local variables - - write(99,500) -1.0*hsa_grid%spglon, hsa_grid%spglat, & - & (spg_julian - rel_julian)*86400.0, meteo_grid%lon(1), & - & meteo_grid%lat(1), (meteo_grid%jdate(1) - & - & meteo_grid%jdate(meteo_grid%nz))*86400.0 - close(99) - - ! Define local variables - - open(99,file=trim(adjustl(filename))//'.drft',form='formatted') - - ! Loop through local variable - - do i = 1, hsa_interp_grid%nz - - ! Define local variables - - write(99,501) hsa_grid%wx(i), hsa_grid%yymmdd(i), hsa_grid%gmt(i), & - & hsa_grid%lat(i), hsa_grid%lon(i), hsa_grid%p(i), & - & hsa_grid%t(i), hsa_grid%rh(i), hsa_grid%z(i), & - & hsa_grid%u(i), hsa_grid%v(i), hsa_grid%tail(i) - - end do ! do i = 1, hsa_interp_grid%nz - - ! Define local variables - - close(99) - - ! Check local variable and proceed accordingly - - if(write_nc_skewt) then - - ! Define local variables - - filename = trim(adjustl(filename))//'.nc' - call fileio_interface_write(meteo_grid,filename) - - end if !if(write_nc_skewt) - - ! Define local variables - -1007 continue - - ! Deallocate memory for local variables - - call variable_interface_cleanup_struct(meteo_grid) - call variable_interface_cleanup_struct(hsa_interp_grid) - - ! Define local variables -500 format(6(f13.5,1x)) -501 format(i2,1x,f7.0,1x,i4,1x,2(f7.3,1x),3(f6.1,1x),f7.1,2(f6.1,1x),a4) - - !===================================================================== - - end subroutine tempdrop_drift_hsa - - !======================================================================= - -end module tempdrop_sonde_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/time_methods_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/time_methods_interface.F90 deleted file mode 100644 index 680b56a81..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/time_methods_interface.F90 +++ /dev/null @@ -1,343 +0,0 @@ -module time_methods_interface - - !======================================================================= - - !$$$ PROGRAM DOCUMENTATION BLOCK - - ! tempdrop-sonde :: time_methods_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - ! Review the README, within the top-level directory, which provides - ! relevant instructions and (any) references cited by algorithms - ! within this software suite. - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: time_methods_gregorian_date - public :: time_methods_hmsts - public :: time_methods_julian_day - public :: time_methods_sthms - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! time_methods_gregorian_date.f90 - - ! DESCRIPTION: - - ! This subroutine determines the Gregorian calendar attributes from - ! the Julian date. - - ! REFERENCES: - - ! http://aa.usno.navy.mil/faq/docs/JD_Formula.php - - ! INPUT VARIABLES: - - ! * julian_day; a FORTRAN 8-byte real value specifying the Julian - ! day. - - ! * yyyy; a FORTRAN integer value to define the Gregorian calendar - ! year. - - ! * mm; a FORTRAN integer value to define the Gregorian calendar - ! month of year. - - ! * dd; a FORTRAN integer value to define the Gregorian calendar - ! day of month. - - ! * hh; a FORTRAN integer value to define the Gregorian calendar - ! hour of day. - - ! * nn; a FORTRAN integer value to define the Gregorian calendar - ! minute of hour. - - ! * ss; a FORTRAN integer value to define the Gregorian calendar - ! second of minute. - - ! OUTPUT VARIABLES: - - ! * yyyy; a FORTRAN integer value specifying the Gregorian calendar - ! year. - - ! * mm; a FORTRAN integer value specifying the Gregorian calendar - ! month of year. - - ! * dd; a FORTRAN integer value specifying the Gregorian calendar - ! day of month. - - ! * hh; a FORTRAN integer value specifying the Gregorian calendar - ! hour of day. - - ! * nn; a FORTRAN integer value specifying the Gregorian calendar - ! minute of hour. - - ! * ss; a FORTRAN integer value specifying the Gregorian calendar - ! second of minute. - - !----------------------------------------------------------------------- - - subroutine time_methods_gregorian_date(julian_day,yyyy,mm,dd,hh,nn,ss) - - ! Define variables passed to routine - - real(r_double) :: julian_day - integer :: yyyy - integer :: mm - integer :: dd - integer :: hh - integer :: nn - integer :: ss - - ! Define variables computed within routine - - real(r_double) :: wjulian_day - real(r_double) :: frac_day - integer :: i - integer :: j - integer :: k - integer :: l - integer :: n - - !===================================================================== - - ! Define local variables - - l = julian_day + 68569 - n = 4*l/146097 - l = l - (146097*n + 3)/4 - i = 4000*(l + 1)/1461001 - l = l - 1461*i/4 + 31 - j = 80*l/2447 - k = l - 2447*j/80 - l = j/11 - j = j + 2 - 12*l - i = 100*(n - 49) + i + l - yyyy = i - mm = j - dd = k - - ! Compute local variables - - call time_methods_julian_day(yyyy,mm,dd,wjulian_day) - frac_day = (julian_day - wjulian_day)*86400.0 - - ! Define local variables - - hh = int(frac_day/3600.0) - - ! Compute local variables - - frac_day = frac_day - (hh*3600.0) - - ! Define local variables - - nn = int(frac_day/60.0) - - ! Compute local variables - - ss = int(frac_day - (nn*60.0)) - - !===================================================================== - - end subroutine time_methods_gregorian_date - - !======================================================================= - - ! SUBROUTINE: - - ! time_methods_hmsts.f90 - - ! DESCRIPTION: - - ! This subroutine returns the seconds elapsed for a given day - ! provided the respective hours, minutes, and seconds. - - ! INPUT VARIABLES: - - ! * x; a FORTRAN integer value containing the hours, minutes, and - ! seconds as (assuming UNIX convention) HHMMSS. - - ! * secs; a FORTRAN integer value defining the total number of - ! seconds elapsed for a given day. - - ! OUTPUT VARIABLES: - - ! * secs; a FORTRAN integer value defining the total number of - ! seconds elapsed for a given day. - - !----------------------------------------------------------------------- - - subroutine time_methods_hmsts(x,secs) - - ! Define variables passed to routine - - integer :: x - integer :: secs - - ! Define variables computed within routine - - integer :: ihr - integer :: imin - integer :: isecs - - !===================================================================== - - ! Define local variables - - ihr = x/10000 - imin = mod(x,10000)/100 - isecs = mod(mod(x,10000),100) - - ! Compute local variables - - secs = (ihr*3600) + (imin*60) + isecs - - !===================================================================== - - end subroutine time_methods_hmsts - - !======================================================================= - - ! SUBROUTINE: - - ! time_methods_julian_day.f90 - - ! DESCRIPTION: - - ! This subroutine determines the Julian date corresponding the - ! Gregorian calendar attributes. - - ! REFERENCES: - - ! http://aa.usno.navy.mil/faq/docs/JD_Formula.php - - ! INPUT VARIABLES: - - ! * yyyy; a FORTRAN integer value specifying the Gregorian calendar - ! year. - - ! * mm; a FORTRAN integer value specifying the Gregorian calendar - ! month. - - ! * dd; a FORTRAN integer value specifying the Gregorian calendar - ! day. - - ! * julian_day; a FORTRAN 8-byte real value to define the Julian - ! date. - - ! OUTPUT VARIABLES: - - ! * julian_day; a FORTRAN 8-byte real value specifying the Julian - ! date. - - !----------------------------------------------------------------------- - - subroutine time_methods_julian_day(yyyy,mm,dd,julian_day) - - ! Define variables passed to routine - - real(r_double) :: julian_day - integer :: yyyy - integer :: mm - integer :: dd - - !===================================================================== - - ! Compute local variables - - julian_day = dble(dd - 32075 + 1461*(yyyy + 4800 + (mm - 14)/12)/4 + & - & 367*(mm - 2 - (mm - 14)/12*12)/12 - 3*((yyyy + 4900 + & - & (mm - 14)/12)/100)/4) - - !===================================================================== - - end subroutine time_methods_julian_day - - !======================================================================= - - ! SUBROUTINE: - - ! time_methods_sthms.f90 - - ! DESCRIPTION: - - ! This subroutine returns the hours, minutes, and seconds with - ! respect to the total seconds specified by the user. - - ! INPUT VARIABLES: - - ! * secs; a FORTRAN integer value defining the total number of - ! seconds elapsed for a given day. - - ! * x; a FORTRAN integer value containing the hours, minutes, and - ! seconds as (assuming UNIX convention) HHMMSS. - - ! OUTPUT VARIABLES: - - ! * x; a FORTRAN integer value containing the hours, minutes, and - ! seconds as (assuming UNIX convention) HHMMSS. - - !----------------------------------------------------------------------- - - subroutine time_methods_sthms(secs,x) - - ! Define variables passed to routine - - integer :: secs - integer :: x - - ! Define variables computed within routine - - integer :: ihr - integer :: imin - integer :: isecs - - !===================================================================== - - ! Define local variables - - ihr = secs/3600 - imin = mod(secs,3600)/60 - isecs = mod(mod(secs,3600),60) - - ! Compute local variables - - x = (ihr*10000) + (imin*100) + isecs - - !===================================================================== - - end subroutine time_methods_sthms - - !======================================================================= - -end module time_methods_interface diff --git a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/variable_interface.F90 b/sorc/hafs_tools.fd/sorc/tempdrop_sonde/variable_interface.F90 deleted file mode 100644 index 91e1a0f24..000000000 --- a/sorc/hafs_tools.fd/sorc/tempdrop_sonde/variable_interface.F90 +++ /dev/null @@ -1,675 +0,0 @@ -module variable_interface - - !======================================================================= - - !$$$ MODULE DOCUMENTATION BLOCK - - ! tempdrop-sonde :: variable_interface - ! Copyright (C) 2017 Henry R. Winterbottom - - ! Email: henry.winterbottom@noaa.gov - - ! This program is free software: you can redistribute it and/or - ! modify it under the terms of the GNU General Public License as - ! published by the Free Software Foundation, either version 3 of the - ! License, or (at your option) any later version. - - ! This program is distributed in the hope that it will be useful, - ! but WITHOUT ANY WARRANTY; without even the implied warranty of - ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - ! General Public License for more details. - - ! You should have received a copy of the GNU General Public License - ! along with this program. If not, see - ! . - - !======================================================================= - - ! Define associated modules and subroutines - - use kinds_interface - - ! Define interfaces and attributes for module routines - - implicit none - private - public :: grid_struct - public :: hsa_struct - public :: interp_p_struct - public :: interp_spline_struct - public :: meteo_struct - public :: spval - public :: statgrid_struct - public :: variable_interface_cleanup_struct - public :: variable_interface_setup_struct - public :: varinfo_struct - interface variable_interface_cleanup_struct - module procedure finalize_hsa_struct - module procedure finalize_interp_p_struct - module procedure finalize_interp_spline_struct - module procedure finalize_meteo_struct - module procedure finalize_statgrid_struct - module procedure finalize_varinfo_struct - end interface variable_interface_cleanup_struct - interface variable_interface_setup_struct - module procedure initialize_hsa_struct - module procedure initialize_interp_p_struct - module procedure initialize_interp_spline_struct - module procedure initialize_meteo_struct - module procedure initialize_statgrid_struct - module procedure initialize_varinfo_struct - end interface variable_interface_setup_struct - - ! Define local variables - - real(r_kind), parameter :: spval = huge(0.0) - type grid_struct - real(r_kind) :: lon - real(r_kind) :: lat - real(r_kind) :: dist - real(r_kind) :: head - end type grid_struct ! type grid_struct - type hsa_struct - character(len=4), dimension(:), allocatable :: tail - real(r_kind), dimension(:), allocatable :: lat - real(r_kind), dimension(:), allocatable :: lon - real(r_kind), dimension(:), allocatable :: fallrate - real(r_kind), dimension(:), allocatable :: p - real(r_kind), dimension(:), allocatable :: rh - real(r_kind), dimension(:), allocatable :: t - real(r_kind), dimension(:), allocatable :: u - real(r_kind), dimension(:), allocatable :: v - real(r_kind), dimension(:), allocatable :: z - real(r_kind), dimension(:), allocatable :: time - real(r_kind), dimension(:), allocatable :: yymmdd - real(r_kind) :: psfc - real(r_kind) :: rellon - real(r_kind) :: rellat - real(r_kind) :: spglon - real(r_kind) :: spglat - integer, dimension(:), allocatable :: gmt - integer, dimension(:), allocatable :: wx - integer :: yyyy - integer :: mm - integer :: dd - integer :: logtime - integer :: reltime - integer :: spgtime - integer :: nz - end type hsa_struct ! type hsa_struct - type interp_spline_struct - real(r_kind), dimension(:), allocatable :: xa - real(r_kind), dimension(:), allocatable :: ya - real(r_kind) :: x - real(r_kind) :: y - integer :: n - end type interp_spline_struct ! type interp_spline_struct - type interp_p_struct - real(r_kind), dimension(:), allocatable :: var - real(r_kind), dimension(:), allocatable :: p - real(r_kind) :: psfc - integer :: nz - end type interp_p_struct ! type interp_p_struct - type meteo_struct - character(len=500) :: tempdrop_name - character(len=5) :: acid - character(len=2) :: obnum - real(r_double), dimension(:), allocatable :: dwpt - real(r_double), dimension(:), allocatable :: lat - real(r_double), dimension(:), allocatable :: lon - real(r_double), dimension(:), allocatable :: p - real(r_double), dimension(:), allocatable :: q - real(r_double), dimension(:), allocatable :: rh - real(r_double), dimension(:), allocatable :: t - real(r_double), dimension(:), allocatable :: thta - real(r_double), dimension(:), allocatable :: thte - real(r_double), dimension(:), allocatable :: thtv - real(r_double), dimension(:), allocatable :: u - real(r_double), dimension(:), allocatable :: v - real(r_double), dimension(:), allocatable :: wdir - real(r_double), dimension(:), allocatable :: wspd - real(r_double), dimension(:), allocatable :: z - real(r_double), dimension(:), allocatable :: jdate - real(r_kind), dimension(:), allocatable :: dist - real(r_kind), dimension(:), allocatable :: head - real(r_double) :: psfc - integer :: nz - end type meteo_struct ! type meteo_struct - type statgrid_struct - real(r_kind), dimension(:), allocatable :: var - real(r_kind) :: mean - real(r_kind) :: vari - real(r_kind) :: stdev - real(r_kind) :: varmin - real(r_kind) :: varmax - integer :: n - integer :: nvals - end type statgrid_struct ! type statgrid_struct - type varinfo_struct - character(len=500), dimension(:,:,:), allocatable :: varattrs - character(len=25), dimension(:), allocatable :: varname - character(len=10), dimension(:), allocatable :: dimname - character(len=10), dimension(:), allocatable :: vartype - integer, dimension(:,:), allocatable :: vardimid - integer, dimension(:), allocatable :: dimid - integer, dimension(:), allocatable :: dimval - integer, dimension(:), allocatable :: varid - integer, dimension(:), allocatable :: varndims - integer, dimension(:), allocatable :: varnattrs - integer :: nvars - integer :: ndims - integer :: nattrs - end type varinfo_struct ! type varinfo_struct - - !----------------------------------------------------------------------- - -contains - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_hsa_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! hsa_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN hsa_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_hsa_struct(grid) - - ! Define variables passed to routine - - type(hsa_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%tail)) deallocate(grid%tail) - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%fallrate)) deallocate(grid%fallrate) - if(allocated(grid%p)) deallocate(grid%p) - if(allocated(grid%rh)) deallocate(grid%rh) - if(allocated(grid%t)) deallocate(grid%t) - if(allocated(grid%u)) deallocate(grid%u) - if(allocated(grid%v)) deallocate(grid%v) - if(allocated(grid%yymmdd)) deallocate(grid%yymmdd) - if(allocated(grid%z)) deallocate(grid%z) - if(allocated(grid%gmt)) deallocate(grid%gmt) - if(allocated(grid%wx)) deallocate(grid%wx) - if(allocated(grid%time)) deallocate(grid%time) - - !===================================================================== - - end subroutine finalize_hsa_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_interp_p_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! interp_p_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN interp_p_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_interp_p_struct(grid) - - ! Define variables passed to routine - - type(interp_p_struct) :: grid - logical :: debug - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%p)) deallocate(grid%p) - if(allocated(grid%var)) deallocate(grid%var) - - !===================================================================== - - end subroutine finalize_interp_p_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_interp_spline_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! interp_spline_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN interp_spline_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_interp_spline_struct(grid) - - ! Define variables passed to routine - - type(interp_spline_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%xa)) deallocate(grid%xa) - if(allocated(grid%ya)) deallocate(grid%ya) - - !===================================================================== - - end subroutine finalize_interp_spline_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_meteo_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! meteo_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_meteo_struct(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%dwpt)) deallocate(grid%dwpt) - if(allocated(grid%lat)) deallocate(grid%lat) - if(allocated(grid%lon)) deallocate(grid%lon) - if(allocated(grid%p)) deallocate(grid%p) - if(allocated(grid%q)) deallocate(grid%q) - if(allocated(grid%rh)) deallocate(grid%rh) - if(allocated(grid%t)) deallocate(grid%t) - if(allocated(grid%thta)) deallocate(grid%thta) - if(allocated(grid%thte)) deallocate(grid%thte) - if(allocated(grid%thtv)) deallocate(grid%thtv) - if(allocated(grid%u)) deallocate(grid%u) - if(allocated(grid%v)) deallocate(grid%v) - if(allocated(grid%wdir)) deallocate(grid%wdir) - if(allocated(grid%wspd)) deallocate(grid%wspd) - if(allocated(grid%z)) deallocate(grid%z) - if(allocated(grid%jdate)) deallocate(grid%jdate) - - !===================================================================== - - end subroutine finalize_meteo_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_statgrid_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! statgrid_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN statgrid_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_statgrid_struct(grid) - - ! Define variables passed to routine - - type(statgrid_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%var)) deallocate(grid%var) - - !===================================================================== - - end subroutine finalize_statgrid_struct - - !======================================================================= - - ! SUBROUTINE: - - ! finalize_varinfo_struct.f90 - - ! DESCRIPTION: - - ! This subroutine deallocates memory for all arrays within the - ! varinfo_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN varinfo_struct variable. - - !----------------------------------------------------------------------- - - subroutine finalize_varinfo_struct(grid) - - ! Define variables passed to routine - - type(varinfo_struct) :: grid - - !===================================================================== - - ! Deallocate memory for local variables - - if(allocated(grid%varattrs)) deallocate(grid%varattrs) - if(allocated(grid%varname)) deallocate(grid%varname) - if(allocated(grid%vartype)) deallocate(grid%vartype) - if(allocated(grid%dimname)) deallocate(grid%dimname) - if(allocated(grid%dimval)) deallocate(grid%dimval) - if(allocated(grid%dimid)) deallocate(grid%dimid) - if(allocated(grid%vardimid)) deallocate(grid%vardimid) - if(allocated(grid%varid)) deallocate(grid%varid) - if(allocated(grid%varndims)) deallocate(grid%varndims) - if(allocated(grid%varnattrs)) deallocate(grid%varnattrs) - - !===================================================================== - - end subroutine finalize_varinfo_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_hsa_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! hsa_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN hsa_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_hsa_struct(grid) - - ! Define variables passed to routine - - type(hsa_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%tail)) allocate(grid%tail(grid%nz)) - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nz)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nz)) - if(.not. allocated(grid%fallrate)) allocate(grid%fallrate(grid%nz)) - if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) - if(.not. allocated(grid%rh)) allocate(grid%rh(grid%nz)) - if(.not. allocated(grid%t)) allocate(grid%t(grid%nz)) - if(.not. allocated(grid%u)) allocate(grid%u(grid%nz)) - if(.not. allocated(grid%v)) allocate(grid%v(grid%nz)) - if(.not. allocated(grid%yymmdd)) allocate(grid%yymmdd(grid%nz)) - if(.not. allocated(grid%z)) allocate(grid%z(grid%nz)) - if(.not. allocated(grid%gmt)) allocate(grid%gmt(grid%nz)) - if(.not. allocated(grid%wx)) allocate(grid%wx(grid%nz)) - if(.not. allocated(grid%time)) allocate(grid%time(grid%nz)) - - !===================================================================== - - end subroutine initialize_hsa_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_interp_p_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! interp_p_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN interp_p_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_interp_p_struct(grid) - - ! Define variables passed to routine - - type(interp_p_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) - if(.not. allocated(grid%var)) allocate(grid%var(grid%nz)) - - !===================================================================== - - end subroutine initialize_interp_p_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_interp_spline_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! interp_spline_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN interp_spline_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_interp_spline_struct(grid) - - ! Define variables passed to routine - - type(interp_spline_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%xa)) allocate(grid%xa(grid%n)) - if(.not. allocated(grid%ya)) allocate(grid%ya(grid%n)) - - !===================================================================== - - end subroutine initialize_interp_spline_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_meteo_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! meteo_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN meteo_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_meteo_struct(grid) - - ! Define variables passed to routine - - type(meteo_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%dwpt)) allocate(grid%dwpt(grid%nz)) - if(.not. allocated(grid%lat)) allocate(grid%lat(grid%nz)) - if(.not. allocated(grid%lon)) allocate(grid%lon(grid%nz)) - if(.not. allocated(grid%p)) allocate(grid%p(grid%nz)) - if(.not. allocated(grid%q)) allocate(grid%q(grid%nz)) - if(.not. allocated(grid%rh)) allocate(grid%rh(grid%nz)) - if(.not. allocated(grid%t)) allocate(grid%t(grid%nz)) - if(.not. allocated(grid%thta)) allocate(grid%thta(grid%nz)) - if(.not. allocated(grid%thte)) allocate(grid%thte(grid%nz)) - if(.not. allocated(grid%thtv)) allocate(grid%thtv(grid%nz)) - if(.not. allocated(grid%u)) allocate(grid%u(grid%nz)) - if(.not. allocated(grid%v)) allocate(grid%v(grid%nz)) - if(.not. allocated(grid%wdir)) allocate(grid%wdir(grid%nz)) - if(.not. allocated(grid%wspd)) allocate(grid%wspd(grid%nz)) - if(.not. allocated(grid%z)) allocate(grid%z(grid%nz)) - if(.not. allocated(grid%jdate)) allocate(grid%jdate(grid%nz)) - - ! Define local variables - - grid%dwpt = spval - grid%lat = spval - grid%lon = spval - grid%p = spval - grid%q = spval - grid%rh = spval - grid%t = spval - grid%thta = spval - grid%thte = spval - grid%thtv = spval - grid%u = spval - grid%v = spval - grid%wdir = spval - grid%wspd = spval - grid%z = spval - grid%jdate = spval - grid%psfc = spval - - !===================================================================== - - end subroutine initialize_meteo_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_statgrid_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! statgrid_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN statgrid_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_statgrid_struct(grid) - - ! Define variables passed to routine - - type(statgrid_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%var)) allocate(grid%var(grid%n)) - - !===================================================================== - - end subroutine initialize_statgrid_struct - - !======================================================================= - - ! SUBROUTINE: - - ! initialize_varinfo_struct.f90 - - ! DESCRIPTION: - - ! This subroutine allocates memory for all arrays within the - ! varinfo_struct FORTRAN structure. - - ! INPUT VARIABLES: - - ! * grid; a FORTRAN varinfo_struct variable. - - !----------------------------------------------------------------------- - - subroutine initialize_varinfo_struct(grid) - - ! Define variables passed to routine - - type(varinfo_struct) :: grid - - !===================================================================== - - ! Allocate memory for local variables - - if(.not. allocated(grid%varattrs)) & - & allocate(grid%varattrs(grid%nvars,grid%nattrs,2)) - if(.not. allocated(grid%vardimid)) & - & allocate(grid%vardimid(grid%nvars,grid%ndims)) - if(.not. allocated(grid%varname)) & - & allocate(grid%varname(grid%nvars)) - if(.not. allocated(grid%vartype)) & - & allocate(grid%vartype(grid%nvars)) - if(.not. allocated(grid%varndims)) & - & allocate(grid%varndims(grid%nvars)) - if(.not. allocated(grid%varnattrs)) & - & allocate(grid%varnattrs(grid%nvars)) - if(.not. allocated(grid%varid)) & - & allocate(grid%varid(grid%nvars)) - if(.not. allocated(grid%dimval)) & - & allocate(grid%dimval(grid%ndims)) - if(.not. allocated(grid%dimname)) & - & allocate(grid%dimname(grid%ndims)) - if(.not. allocated(grid%dimid)) & - & allocate(grid%dimid(grid%ndims)) - - !===================================================================== - - end subroutine initialize_varinfo_struct - - !======================================================================= - -end module variable_interface diff --git a/sorc/hafs_utils.fd b/sorc/hafs_utils.fd index aa0e9221c..a428bc26b 160000 --- a/sorc/hafs_utils.fd +++ b/sorc/hafs_utils.fd @@ -1 +1 @@ -Subproject commit aa0e9221ce547b17d057fc13d756e7a9e78ba849 +Subproject commit a428bc26b4aba2213aa43220a000c5fcbe4bd688 diff --git a/sorc/hafs_vortextracker.fd b/sorc/hafs_vortextracker.fd index e920e454f..dba4c50c6 160000 --- a/sorc/hafs_vortextracker.fd +++ b/sorc/hafs_vortextracker.fd @@ -1 +1 @@ -Subproject commit e920e454fa0a8ee7a9f0ff08ea4a416173942e9b +Subproject commit dba4c50c6f5e200413bd95d9eb81440ce9d0eaed diff --git a/sorc/install_all.sh b/sorc/install_all.sh index bf3382bf4..7d13972e1 100755 --- a/sorc/install_all.sh +++ b/sorc/install_all.sh @@ -1,18 +1,11 @@ #!/bin/sh set -xeu - -build_dir=`pwd` +cwd=`pwd` CP='cp -rp' -# Check final exec folder exists -if [ ! -d "../exec" ]; then - echo "Creating ../exec folder" - mkdir ../exec -fi - #------------------------------------ -# INCLUDE PARTIAL BUILD +# INCLUDE PARTIAL BUILD #------------------------------------ . ./partial_build.sh @@ -61,8 +54,8 @@ $Build_vortextracker && { # install tools #------------------------------------ $Build_tools && { - ${CP} hafs_tools.fd/exec/tempdrop_sonde.x ../exec/hafs_tempdrop_sonde.x - ${CP} hafs_tools.fd/exec/obs_to_bufr.x ../exec/hafs_obs_to_bufr.x + ${CP} hafs_tools.fd/exec/hafs_analysis_update.x ../exec/hafs_analysis_update.x + ${CP} hafs_tools.fd/exec/hafs_obs_preproc.x ../exec/hafs_obs_preproc.x ${CP} hafs_tools.fd/exec/mpiserial.x ../exec/hafs_mpiserial.x } @@ -70,8 +63,10 @@ $Build_tools && { # install gsi #------------------------------------ $Build_gsi && { - ${CP} hafs_gsi.fd/exec/global_gsi.x ../exec/hafs_gsi.x - ${CP} hafs_gsi.fd/exec/global_enkf.x ../exec/hafs_enkf.x + #${CP} hafs_gsi.fd/exec/global_gsi.x ../exec/hafs_gsi.x + #${CP} hafs_gsi.fd/exec/global_enkf.x ../exec/hafs_enkf.x + ${CP} hafs_gsi.fd/exec/gsi.x ../exec/hafs_gsi.x + ${CP} hafs_gsi.fd/exec/enkf_fv3reg.x ../exec/hafs_enkf.x ${CP} hafs_gsi.fd/exec/adderrspec.x ../exec/hafs_adderrspec.x ${CP} hafs_gsi.fd/exec/adjustps.x ../exec/hafs_adjustps.x ${CP} hafs_gsi.fd/exec/calc_increment_ens_ncio.x ../exec/hafs_calc_increment_ens_ncio.x @@ -100,7 +95,7 @@ $Build_gsi && { } #------------------------------------ -# install hycom_utils +# install hycom_utils #------------------------------------ $Build_hycom_utils && { ${CP} hafs_hycom_utils.fd/exec/hafs_get_rtofs ../exec/hafs_get_rtofs.x @@ -114,7 +109,6 @@ $Build_hycom_utils && { ${CP} hafs_hycom_utils.fd/exec/hafs_timeinterp_forcing ../exec/hafs_timeinterp_forcing.x } - echo;echo " .... Install system finished .... " -exit 0 +exit diff --git a/sorc/install_hafs.sh b/sorc/install_hafs.sh index 9c35d833f..d56a4f94f 100755 --- a/sorc/install_hafs.sh +++ b/sorc/install_hafs.sh @@ -1,9 +1,7 @@ #!/bin/sh -set -x - +set -eux source ./machine-setup.sh > /dev/null 2>&1 - -cwd=$(pwd) +cwd=`pwd` cd ${cwd} diff --git a/sorc/link_fix.sh b/sorc/link_fix.sh index 67ba2bf38..913274944 100755 --- a/sorc/link_fix.sh +++ b/sorc/link_fix.sh @@ -1,6 +1,7 @@ #!/bin/sh -set -x +set -eux source ./machine-setup.sh > /dev/null 2>&1 +cwd=`pwd` HOMEhafs=$(pwd)/.. FIXhafs=${HOMEhafs}/fix @@ -8,29 +9,23 @@ mkdir -p ${FIXhafs} cd ${FIXhafs} mkdir -p fix_fv3 if [ ${target} == "wcoss_cray" ]; then - #FIXROOT=/gpfs/hps3/emc/global/noscrub/emc.glopara/git/fv3gfs/fix - FIXROOT=/gpfs/hps3/emc/hwrf/noscrub/emc.hurpara/hafs-fix-files/hafs-20200501-fix/fix -elif [[ ${target} == "wcoss_dell_p3" || ${target} == "wcoss" ]]; then - #FIXROOT=/gpfs/dell2/emc/modeling/noscrub/emc.glopara/git/fv3gfs/fix - FIXROOT=/gpfs/dell2/emc/modeling/noscrub/emc.hurpara/hafs-fix-files/hafs-20200501-fix/fix + FIXROOT=/gpfs/hps3/emc/hwrf/noscrub/emc.hurpara/hafs-fix-files/hafs-20200501-fix/fix +elif [ ${target} == "wcoss_dell_p3" ]; then + FIXROOT=/gpfs/dell2/emc/modeling/noscrub/emc.hurpara/hafs-fix-files/hafs-20200501-fix/fix elif [ ${target} == "hera" ]; then - #FIXROOT=/scratch1/NCEPDEV/global/glopara/fix - FIXROOT=/scratch1/NCEPDEV/hwrf/noscrub/hafs-fix-files/hafs-20200501-fix/fix + FIXROOT=/scratch1/NCEPDEV/hwrf/noscrub/hafs-fix-files/hafs-20200501-fix/fix elif [ ${target} == "orion" ]; then - #FIXROOT=/work/noaa/global/kfriedma/glopara/fix - #FIXROOT=/work/noaa/hwrf/noscrub/hafs-fix-files/glopara/fix - FIXROOT=/work/noaa/hwrf/noscrub/hafs-fix-files/hafs-20200501-fix/fix + FIXROOT=/work/noaa/hwrf/noscrub/hafs-fix-files/hafs-20200501-fix/fix elif [ ${target} == "jet" ]; then - #FIXROOT=/lfs4/HFIP/hwrf-data/hafs-fix-files/glopara/fix - FIXROOT=/lfs4/HFIP/hwrf-data/hafs-fix-files/hafs-20200501-fix/fix + FIXROOT=/lfs4/HFIP/hwrf-data/hafs-fix-files/hafs-20200501-fix/fix else - echo "Unknown site " ${target} - exit 1 + echo "Unknown site " ${target} + exit 1 fi -for subdir in fix_am fix_orog fix_fv3_gmted2010 fix_sfc_climo fix_hycom; +for subdir in fix_am fix_orog fix_fv3_gmted2010 fix_sfc_climo fix_hycom hwrf-crtm-2.2.6; do - ln -sf ${FIXROOT}/${subdir} ./ + ln -sf ${FIXROOT}/${subdir} ./ done echo 'done' diff --git a/sorc/hafs_tools.fd/include/.gitignore b/sorc/logs/.gitignore similarity index 100% rename from sorc/hafs_tools.fd/include/.gitignore rename to sorc/logs/.gitignore diff --git a/sorc/machine-setup.sh b/sorc/machine-setup.sh old mode 100644 new mode 100755 index d3e4f7f36..9fbb4ee73 --- a/sorc/machine-setup.sh +++ b/sorc/machine-setup.sh @@ -22,7 +22,7 @@ USERNAME=`echo $LOGNAME | awk '{ print tolower($0)'}` if [[ -d /lfs4 ]] ; then # We are on NOAA Jet if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 + echo load the module command 1>&2 source /apps/lmod/lmod/init/$__ms_shell fi target=jet @@ -30,7 +30,7 @@ if [[ -d /lfs4 ]] ; then elif [[ -d /scratch1/NCEPDEV ]] ; then # We are on NOAA Hera if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 + echo load the module command 1>&2 source /apps/lmod/lmod/init/$__ms_shell fi target=hera @@ -43,12 +43,15 @@ elif [[ -d /work/noaa ]] ; then fi target=orion module purge - module load contrib noaatools + module use /apps/modulefiles/core + module use /apps/contrib/modulefiles + module use /apps/contrib/NCEPLIBS/lib/modulefiles + module use /apps/contrib/NCEPLIBS/orion/modulefiles elif [[ -d /gpfs/hps && -e /etc/SuSE-release ]] ; then # We are on NOAA Luna or Surge if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 - source /opt/modules/default/init/$__ms_shell + echo load the module command 1>&2 + source /opt/modules/default/init/$__ms_shell fi target=wcoss_cray @@ -77,41 +80,32 @@ elif [[ -d /gpfs/hps && -e /etc/SuSE-release ]] ; then module use /opt/cray/ari/modulefiles module use /opt/modulefiles module load modules - elif [[ -L /usrx && "$( readlink /usrx 2> /dev/null )" =~ dell ]] ; then # We are on NOAA Venus or Mars if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 - source /usrx/local/prod/lmod/lmod/init/$__ms_shell + echo load the module command 1>&2 + source /usrx/local/prod/lmod/lmod/init/$__ms_shell fi target=wcoss_dell_p3 - module purge - -elif [[ -d /dcom && -d /hwrf ]] ; then - # We are on NOAA Tide or Gyre - if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 - source /usrx/local/Modules/default/init/$__ms_shell - fi - target=wcoss module purge + source /usrx/local/prod/lmod/lmod/init/$__ms_shell elif [[ -d /glade ]] ; then # We are on NCAR Yellowstone if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 + echo load the module command 1>&2 . /usr/share/Modules/init/$__ms_shell fi target=yellowstone module purge elif [[ -d /lustre && -d /ncrc ]] ; then - # We are on GAEA. + # We are on GAEA. if ( ! eval module help > /dev/null 2>&1 ) ; then # We cannot simply load the module command. The GAEA # /etc/profile modifies a number of module-related variables # before loading the module command. Without those variables, # the module command fails. Hence we actually have to source # /etc/profile here. - echo load the module command 1>&2 + echo load the module command 1>&2 source /etc/profile fi target=gaea diff --git a/sorc/partial_build.sh b/sorc/partial_build.sh index 7e0137ca9..40675a3bf 100755 --- a/sorc/partial_build.sh +++ b/sorc/partial_build.sh @@ -1,7 +1,7 @@ # # define the array of the name of build program # - declare -a Build_prg=("Build_libs" + declare -a Build_prg=("Build_libs" "Build_forecast" \ "Build_post" \ "Build_vortextracker" \ diff --git a/ush/hafs/hycom.py b/ush/hafs/hycom.py index acede0918..11c86fbc3 100644 --- a/ush/hafs/hycom.py +++ b/ush/hafs/hycom.py @@ -994,6 +994,8 @@ def ofs_seasforce4(self,date1,date2,mode,logger): grb2index=alias(exe(self.getexe('grb2index'))) wgrib2loc=self.getexe('wgrib2') grb2indexloc=self.getexe('grb2index') + if os.path.isdir(grb2indexloc): + grb2indexloc=grb2indexloc+"/grb2index" if mode=='anal': TYPEx='hour fcst' @@ -1416,7 +1418,7 @@ def run(self): timesslept=0 sleepmax=180 while timesslept + + --output_filename + + --tcv_filename + +HISTORY: + + 2019-11-27: Henry R. Winterbottom -- Initial implementation. + +""" + +# ---- + +import argparse +from math import sqrt + +# ---- + +__author__ = "Henry R. Winterbottom" +__copyright__ = "2019 Henry R. Winterbottom, NOAA/NCEP/EMC" +__version__ = "1.0.0" +__maintainer__ = "Henry R. Winterbottom" +__email__ = "henry.winterbottom@noaa.gov" +__status__ = "Development" + +# ---- + + +class ObsPreProcTCV(object): + """ + DESCRIPTION: + + This is the base-class object to collect geographical location and + intensity variable attributes for identical events within + TC-vitals and NCEP tracker formatted records. + + INPUT VARIABLES: + + * opts_obj; a Python object containing the user command line + options. + + """ + + def __init__(self, opts_obj): + """ + DESCRIPTION: + + Creates a new ObsPreProcTCV object. + + """ + self.opts_obj = opts_obj + opts_list = ['ncep_trkr_filename', 'output_filename', 'tcv_filename'] + for item in opts_list: + value = getattr(self.opts_obj, item) + setattr(self, item, value) + + def get_basinid(self, basin): + """ + DESCRIPTION: + + This method returns a string which identifies the basin for + the respective TC event; the returned string is compliant with + the basin identifications provided in the TC-vitals formatted + records; if one cannot be determined, NoneType is returned. + + INPUT VARIABLES: + + * basin; a Python string containing the basin identifier from + the NCEP tracker record. + + OUTPUT VARIABLES: + + * basinid; a Python string denoting the basin identifier that + is compliant with the basin identifications provided in the + TC-vitals formatted records. + + """ + basinid = None + if basin.upper() == 'AL': + basinid = 'L' + if basin.upper() == 'EP': + basinid = 'E' + if basin.upper() == 'CP': + basinid = 'C' + if basin.upper() == 'WP': + basinid = 'W' + if basin.upper() == 'SC': + basinid = 'O' + if basin.upper() == 'EC': + basinid = 'T' + if basin.upper() == 'AU': + basinid = 'U' + if basin.upper() == 'SP': + basinid = 'P' + if basin.upper() == 'SI': + basinid = 'S' + if basin.upper() == 'BB': + basinid = 'B' + if basin.upper() == 'NA': + basinid = 'A' + return basinid + + def get_tcvid(self, ncep_trkr_str): + """ + DESCRIPTION: + + This method constructs the TC event, basin, and identifier + strings that, using the a NCEP tracker record, that is + compliant with the TC-vitals formatted records; if one cannot + be determined, NoneType is returned. + + INPUT VARIABLES: + + * ncep_trkr_str; a Python string containing a NCEP tracker + record. + + OUTPUT VARIABLES: + + * event; a Python string denoting the TC event identifier that + is compliant with the TC-vitals formatted records. + + * basin; a Python string denoting the basin within which the + TC event is occuring which is compliant with the TC-vitals + formatted records. + + * tcid; a Python string denoting the TC event abbreviated + indentifier that is compliant with the TC-vitals formatted + records. + + """ + (event, basin, tcid) = (None, None, None) + try: + basin = ncep_trkr_str.split(',')[0].strip() + tcid = ncep_trkr_str.split(',')[1].strip() + kwargs = {'basin': basin} + basinid = self.get_basinid(**kwargs) + event = '%s%s' % (tcid, basinid) + except IndexError: + pass + return (event, basin, tcid) + + def read_ncep_trkr(self): + """ + DESCRIPTION: + + This method parses a NCEP tracker formatted file (fort.64) and + returns a Python dictionary containing the geographical + location and intensity (maximum wind speed intensity and + minimum central sea-level pressure) for each unique event + within the record. + + """ + ncep_trkr_vars_dict = {'clat': 6, 'clon': 7, 'vmax': 8, 'pcen': 9} + self.ncep_trkr_dict = dict() + with open(self.ncep_trkr_filename, 'r') as f: + data = f.read() + event_opts = ['basin', 'tcid'] + for item in data.split('\n'): + kwargs = {'ncep_trkr_str': item} + (event, basin, tcid) = self.get_tcvid(**kwargs) + if event is not None: + self.ncep_trkr_dict[event] = dict() + for opt in event_opts: + self.ncep_trkr_dict[event][opt] = eval(opt) + for key in self.ncep_trkr_dict.keys(): + for item in data.split('\n'): + basin = self.ncep_trkr_dict[key]['basin'] + tcid = self.ncep_trkr_dict[key]['tcid'] + ncep_trkr_str = '%s, %s,' % (basin, tcid) + if ncep_trkr_str in item: + for ncep_trkr_var in ncep_trkr_vars_dict.keys(): + if (ncep_trkr_var.lower() == 'clat') or \ + (ncep_trkr_var.lower() == 'clon'): + idx = ncep_trkr_vars_dict[ncep_trkr_var] + try: + var = item.split(',')[idx] + hemis = var[-1:] + if ncep_trkr_var.lower() == 'clon': + clon = float(var[:-1])/10.0 + if hemis == 'W': + lon_scale = -1.0 + else: + lon_scale = 1.0 + clon = clon*lon_scale + if ncep_trkr_var.lower() == 'clat': + clat = float(var[:-1])/10.0 + if hemis == 'S': + lat_scale = -1.0 + else: + lat_scale = 1.0 + clat = clat*lat_scale + except IndexError: + pass + if (ncep_trkr_var.lower() == 'vmax') or \ + (ncep_trkr_var.lower() == 'pcen'): + idx = ncep_trkr_vars_dict[ncep_trkr_var] + try: + var = item.split(',')[idx] + if ncep_trkr_var.lower() == 'vmax': + vmax = float(var)/1.94384 + if ncep_trkr_var.lower() == 'pcen': + pcen = float(var) + except IndexError: + pass + for ncep_trkr_var in ncep_trkr_vars_dict.keys(): + self.ncep_trkr_dict[key][ncep_trkr_var] = eval( + ncep_trkr_var) + break + + def read_tcv(self): + """ + DESCRIPTION: + + This method parses a TC-vitals formatted file and returns a + Python dictionary containing the geographical location and + intensity (maximum wind speed intensity and minimum central + sea-level pressure) for each event within the record. + + """ + tcv_vars_dict = {'event': 1, 'clat': 5, + 'clon': 6, 'pcen': 9, 'vmax': 12} + self.tcv_dict = dict() + with open(self.tcv_filename, 'r') as f: + data = f.read() + for item in data.split('\n'): + for tcv_var in tcv_vars_dict.keys(): + if tcv_var.lower() == 'event': + idx = tcv_vars_dict[tcv_var] + try: + tcid = item.split()[idx] + except IndexError: + pass + self.tcv_dict[tcid] = dict() + else: + pass + for tcid in self.tcv_dict.keys(): + for item in data.split('\n'): + try: + if tcid in item.split()[1]: + for tcv_var in tcv_vars_dict.keys(): + if tcv_var.lower() != 'event': + if (tcv_var.lower() == 'clat') or \ + (tcv_var.lower() == 'clon'): + idx = tcv_vars_dict[tcv_var] + try: + var = item.split()[idx] + hemis = var[-1:] + if tcv_var.lower() == 'clon': + clon = float(var[:-1])/10.0 + if hemis == 'W': + lon_scale = -1.0 + else: + lon_scale = 1.0 + clon = clon*lon_scale + if tcv_var.lower() == 'clat': + clat = float(var[:-1])/10.0 + if hemis == 'S': + lat_scale = -1.0 + else: + lat_scale = 1.0 + clat = clat*lat_scale + except IndexError: + pass + if (tcv_var.lower() == 'vmax') or \ + (tcv_var.lower() == 'pcen'): + idx = tcv_vars_dict[tcv_var] + try: + var = item.split()[idx] + if tcv_var.lower() == 'vmax': + vmax = float(var) + if tcv_var.lower() == 'pcen': + pcen = float(var) + except IndexError: + pass + self.tcv_dict[tcid]['clat'] = clat + self.tcv_dict[tcid]['clon'] = clon + self.tcv_dict[tcid]['pcen'] = pcen + self.tcv_dict[tcid]['vmax'] = vmax + except IndexError: + pass + + def record_write(self): + """ + DESCRIPTION: + + This method writes the geographical locations and intensity + attributes for each event within the NCEP tracker record(s) to + an external file; the respective NCEP tracker records are + accompanied by their TC-vitals record(s) counterparts; the + column-delimited output for the file is as follows: + + 1. + 2. + 3. + 4. + 5. + 6. + 7. + 8. + + Note: write out the records only if the forecasted and observed storm + centers are 0.2 degree away from each other. + + """ + records_list = ['clat', 'clon', 'pcen', 'vmax'] + with open(self.output_filename, 'wt') as f: + for event in self.ncep_trkr_dict.keys(): + # Only do relocation if the storm exists in both previous + # forecast guess and tcvitals and the observed vmax > 17. m/s + if event in self.tcv_dict.keys() and self.tcv_dict[event]['vmax'] > 17. : + info_str = str() + info_str = info_str+'%s' % event + for item in records_list: + info_str = info_str+' %s' % self.tcv_dict[event][item] + info_str = info_str + \ + ' %s' % self.ncep_trkr_dict[event][item] + # Change to only write out the records if the forecasted and + # observed storm centers are 0.2 degree away from each other. + if sqrt( (self.ncep_trkr_dict[event]['clon']-self.tcv_dict[event]['clon'])**2. + + (self.ncep_trkr_dict[event]['clat']-self.tcv_dict[event]['clat'])**2. ) > 0.2 : + f.write('%s\n' % info_str) + + def run(self): + """ + DESCRIPTION: + + This method performs the following tasks: + + (1) Parses the TC-vitals formatted record(s). + + (2) Parses the NCEP tracker formatted record(s). + + (3) Creates a formatted file containing the geographical + locations and intensity attributes for the corresponding + TC event record(s). + + """ + self.read_tcv() + self.read_ncep_trkr() + self.record_write() + +# ---- + + +class ObsPreProcTCVError(Exception): + """ + DESCRIPTION: + + This is the base-class for all module raised exceptions; it is a + sub-class of Exceptions. + + INPUT VARIABLES: + + * msg; a Python string to accompany the raised exception. + + """ + + def __init__(self, msg): + """ + DESCRIPTION: + + Creates a new ObsPreProcTCVError object. + + """ + super(ObsPreProcTCVError, self).__init__(msg) + +# ---- + + +class ObsPreProcTCVOptions(object): + """ + DESCRIPTION: + + This is the base-class object used to collect command line + arguments provided by the user. + + """ + + def __init__(self): + """ + DESCRIPTION: + + Creates a new ObsPreProcTCVOptions object. + + """ + self.parser = argparse.ArgumentParser() + self.parser.add_argument('-ncep', '--ncep_trkr_filename', help='The path to ' + 'the file containing the NCEP TC tracker output (fort.64).', default=None) + self.parser.add_argument('-tcv', '--tcv_filename', help='The path to the ' + 'file containing the TC-vitals.', default=None) + self.parser.add_argument('-out', '--output_filename', help='The path to the ' + 'file to contain the output record(s).', default='obs-preproc.tcv.output') + self.opts_obj = lambda: None + + def run(self): + """ + DESCRIPTION: + + This method collects the user-specified command-line + arguments; the available command line arguments are as + follows: + + -ncep; The path to the file containing the NCEP TC tracker + output (fort.64). + + -out; The path to the file to contain the output record(s). + + -tcv; The path to the file containing the TC-vitals. + + OUTPUT VARIABLES: + + * opts_obj; a Python object containing the user command line + options. + + """ + opts_obj = self.opts_obj + args_list = ['ncep_trkr_filename', 'tcv_filename'] + args = self.parser.parse_args() + for item in args_list: + value = getattr(args, item) + if value is None: + msg = ('The command-line argument %s cannot be NoneType. ' + 'Aborting!!!' % item) + raise ObsPreProcTCVError(msg=msg) + else: + setattr(opts_obj, item, value) + args_list = ['output_filename'] + for item in args_list: + value = getattr(args, item) + setattr(opts_obj, item, value) + return opts_obj + +# ---- + + +def main(): + """ + DESCRIPTION: + + This is the driver-level method to invoke the tasks within this + script. + + """ + options = ObsPreProcTCVOptions() + opts_obj = options.run() + formattcv = ObsPreProcTCV(opts_obj=opts_obj) + formattcv.run() + +# ---- + + +if __name__ == '__main__': + main() diff --git a/ush/hafs_pre_job.sh.inc b/ush/hafs_pre_job.sh.inc index b30fd7a71..8a16c8ed3 100644 --- a/ush/hafs_pre_job.sh.inc +++ b/ush/hafs_pre_job.sh.inc @@ -1,30 +1,3 @@ -# Workaround for misconfigured or problematic clusters. The TMPDIR -# variable sets the directory for temporary files. Sometimes this is -# set to a location that does not exist or is in memory. The $TMPDIR -# variable is not always passed through to batch jobs. This -# workaround sets it to some other specified location from the -# $HAFS_FORCE_ALT_TMPDIR or $HAFS_FORCE_TMPDIR variables. We use -# $HAFS_FORCE_TMPDIR as the default for all jobs, and allow per-job -# overrides via $HAFS_FORCE_ALT_TMPDIR. Such overrides are needed -# only for jobs that are scrubbing the parent of the regular tmpdir, -# or that run after that directory is removed. - -if [[ "Q${HAFS_FORCE_ALT_TMPDIR:-}" != "Q" ]] ; then - if [[ ! -d "$HAFS_FORCE_ALT_TMPDIR" ]] ; then - if ( mkdir -p "$HAFS_FORCE_ALT_TMPDIR" ) ; then - : # trick to avoid triggering a set -e during a race condition - fi - fi - export TMPDIR="$HAFS_FORCE_ALT_TMPDIR" -elif [[ "Q${HAFS_FORCE_TMPDIR:-}" != "Q" ]] ; then - if [[ ! -d "$HAFS_FORCE_TMPDIR" ]] ; then - if ( mkdir -p "$HAFS_FORCE_TMPDIR" ) ; then - : # trick to avoid triggering a set -e during a race condition - fi - fi - export TMPDIR="$HAFS_FORCE_TMPDIR" -fi - # Create a test function for sh vs. bash detection. The name is # randomly generated to reduce the chances of name collision. __ms_function_name="setup__test_function__$$" @@ -75,7 +48,6 @@ elif [[ -d /work/noaa ]] ; then module use /apps/contrib/NCEPLIBS/lib/modulefiles module use /apps/contrib/NCEPLIBS/orion/modulefiles ulimit -s unlimited - #ulimit -a elif [[ -d /gpfs/hps && -e /etc/SuSE-release ]] ; then # We are on NOAA Luna or Surge if ( ! eval module help > /dev/null 2>&1 ) ; then @@ -109,7 +81,6 @@ elif [[ -d /gpfs/hps && -e /etc/SuSE-release ]] ; then module use /opt/cray/ari/modulefiles module use /opt/modulefiles module load modules - elif [[ -L /usrx && "$( readlink /usrx 2> /dev/null )" =~ dell ]] ; then # We are on NOAA Venus or Mars if ( ! eval module help > /dev/null 2>&1 ) ; then @@ -117,18 +88,8 @@ elif [[ -L /usrx && "$( readlink /usrx 2> /dev/null )" =~ dell ]] ; then source /usrx/local/prod/lmod/lmod/init/$__ms_shell fi target=wcoss_dell_p3 - module purge - source /usrx/local/prod/lmod/lmod/init/$__ms_shell - module load EnvVars/1.0.2 - -elif [[ -d /dcom && -d /hwrf ]] ; then - # We are on NOAA Tide or Gyre - if ( ! eval module help > /dev/null 2>&1 ) ; then - echo load the module command 1>&2 - source /usrx/local/Modules/default/init/$__ms_shell - fi - target=wcoss module purge + source /usrx/local/prod/lmod/lmod/init/$__ms_shell elif [[ -d /glade ]] ; then # We are on NCAR Yellowstone if ( ! eval module help > /dev/null 2>&1 ) ; then @@ -138,7 +99,7 @@ elif [[ -d /glade ]] ; then target=yellowstone module purge elif [[ -d /lustre && -d /ncrc ]] ; then - # We are on GAEA. + # We are on GAEA. if ( ! eval module help > /dev/null 2>&1 ) ; then # We cannot simply load the module command. The GAEA # /etc/profile modifies a number of module-related variables @@ -164,21 +125,10 @@ unset __ms_function_name export WHERE_AM_I=${target} -moduleuse=$HOMEhafs/modulefiles -if [[ "$moduleuse" != no ]] ; then - module use $moduleuse - module load modulefile.hafs.run.$WHERE_AM_I +if [[ Q"${HOMEhafs:-}" != "Q" ]]; then + module use $HOMEhafs/modulefiles + module load modulefile.hafs.$WHERE_AM_I fi -set +u -if [[ "Q${utilexec:-}" != Q ]] ; then - export PATH=$utilexec:$PATH -fi -if [[ "Q${EXEChafs:-}" != Q ]] ; then - export PATH=$EXEChafs:$PATH -elif [[ "Q${HOMEhafs:-}" != Q ]] ; then - export PATH=$HOMEhafs/exec:$PATH -fi -if [[ "$target" == "wcoss_dell_p3" ]]; then - export PYTHONPATH=$PYTHONPATH:$HOMEhafs/ush -fi -set -u + +# Avoild "NetCDF: HDF error" +export HDF5_USE_FILE_LOCKING=FALSE diff --git a/ush/hafs_runcmd.sh.inc b/ush/hafs_runcmd.sh.inc index ce744acc6..dce1afa95 100644 --- a/ush/hafs_runcmd.sh.inc +++ b/ush/hafs_runcmd.sh.inc @@ -1,17 +1,18 @@ #============================================================================== -# This script sets up job node/core, mpi/omp envionment, and run commands. +# This script sets job node/core, mpi/omp envionment, and run commands. #============================================================================== -# Set up job node/core, mpi/omp environment +# Set job node/core, mpi/omp environment export TOTAL_TASKS=${TOTAL_TASKS:-1} export NCTSK=${NCTSK:-1} export OMP_NUM_THREADS=${OMP_THREADS:-${OMP_NUM_THREADS:-24}} export PURE_OMP_THREADS=${PURE_OMP_THREADS:-${OMP_NUM_THREADS:-24}} export NCNODE=${NCNODE:-$(($NCTSK * $OMP_NUM_THREADS))} -export KMP_STACKSIZE=1024m export KMP_AFFINITY=disabled +export KMP_STACKSIZE=${KMP_STACKSIZE:-1024m} +#export OMP_STACKSIZE=${OMP_STACKSIZE:-2048m} -# Set up job run commands +# Set job run commands # APRUNS: command to run serial jobs # APRUNO: command to run pure openmp jobs # APRUNC: command to run pure mpi or mpi+omp jobs diff --git a/ush/rsync-no-vanished.sh b/ush/rsync-no-vanished.sh index 02add91fd..b590d911b 100755 --- a/ush/rsync-no-vanished.sh +++ b/ush/rsync-no-vanished.sh @@ -1,3 +1,3 @@ -#!/bin/bash +#!/bin/sh (rsync "$@"; if [ $? == 24 ]; then exit 0; else exit $?; fi) 2>&1 \ | grep -v 'vanished' diff --git a/ush/tcutil_interpolate.py b/ush/tcutil_interpolate.py new file mode 100755 index 000000000..043aea2cc --- /dev/null +++ b/ush/tcutil_interpolate.py @@ -0,0 +1,83 @@ +#! /usr/bin/env python3 + +import logging, os, sys, re, functools +import produtil.setup +import tcutil.numerics, tcutil.revital + +def main(args): + """!Set up logging, reads vitals, outputs storm list.""" + + # Set up logging, disable dbn alerts: + produtil.setup.setup(send_dbn=False,ologlevel=99,jloglevel=99, + eloglevel=logging.INFO) + logger=logging.getLogger('tcutil_interpolate.py') + file_pre=args[1] + file_aft=args[2] + option=int(args[3]) # 0 for interpolate, 1 for extrapolate + + lines_pre=list() + caseid_pre=list() + lines_aft=list() + caseid_aft=list() + with open(file_pre,'rt') as f: + for line in f.readlines(): + temp = line.split() + lines_pre.append(temp) + with open(file_aft,'rt') as f: + for line in f.readlines(): + temp = line.split() + lines_aft.append(temp) + + for storms in lines_pre: + caseid_pre.append(storms[1]) + for storms in lines_aft: + caseid_aft.append(storms[1]) + count=0 + for sid_pre in caseid_pre: + for sid_aft in caseid_aft: + if sid_pre == sid_aft: + count=count+1 + if count < 1: + print("Error! No storm is not consistently existing with 6 hours") + exit + for sid_pre in range(len(caseid_pre)): + for sid_aft in range(len(caseid_aft)): + if caseid_pre[sid_pre] == caseid_aft[sid_aft]: + item_pre=lines_pre[sid_pre][:] + item_aft=lines_aft[sid_aft][:] + fout=list() + for sid in range(len(item_pre)): + if item_pre[sid] == item_aft[sid]: + fout.append(item_pre[sid]) + else: + if sid == 5 or sid == 6: + value_pre=item_pre[sid] + value_aft=item_aft[sid] + if sid == 5: + if option == 0: + value=(int(value_pre[:3])+int(value_aft[:3]))/2 + else: + value=(int(value_aft[:3])-int(value_pre[:3]))/2+int(value_aft[:3]) + fout.append(str('%3.3d'%int(value+0.5))+value_pre[3]) + else: + if option == 0: + value=(int(value_pre[:4])+int(value_aft[:4]))/2 + else: + value=(int(value_aft[:4])-int(value_pre[:4]))/2+int(value_aft[:4]) + fout.append(str('%4.4d'%int(value+0.5))+value_pre[4]) + else: + if sid == 18: + if option == 0: + fout.append(item_pre[sid]) + else: + fout.append(item_aft[sid]) + else: + if option == 0: + value=(int(item_pre[sid])+int(item_aft[sid]))/2 + else: + value=(int(item_aft[sid])-int(item_pre[sid]))/2+int(item_aft[sid]) + fout.append(str(int(value+0.5))) + print("%-4s %3s %-9s %8s %4s %4s %5s %3.3d %3.3d %4.4d %4.4d %4.4d %2.2d %3.3d %4d %4d %4d %4d %s"%(fout[0],fout[1],fout[2],fout[3],fout[4],fout[5],fout[6],int(fout[7]),int(fout[8]),int(fout[9]),int(fout[10]),int(fout[11]),int(fout[12]),int(fout[13]),int(fout[14]),int(fout[15]),int(fout[16]),int(fout[17]),fout[18])) + return fout + +if __name__=='__main__': main(sys.argv)